ZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYjA1M2UuLjAwMDAwMDAKLS0tIGEvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotIyBDTWFrZUxpc3RzLnR4dAotIwotIyBDb3B5cmlnaHQgMjAxMy0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgV3JpdHRlbiBvcmlnaW5hbGx5IGJ5IEpvaG4gQ2FyeSA8Y2FyeUB0eGNvcnAuY29tPgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotIwotIwotIyBBcyBhIHByZWxpbWluYXJ5LCBjcmVhdGUgYSBjb21waWxhdGlvbiBkaXJlY3RvcnkgYW5kIGNoYW5nZSBpbnRvIGl0LCBmb3IKLSMgZXhhbXBsZQotIwotIyAgIG1rZGlyIH4vZnJlZXR5cGUyLmNvbXBpbGVkCi0jICAgY2Qgfi9mcmVldHlwZTIuY29tcGlsZWQKLSMKLSMgTm93IHlvdSBjYW4gc2F5Ci0jCi0jICAgY21ha2UgPHBhdGgtdG8tZnJlZXR5cGUyLXNyYy1kaXI+Ci0jCi0jIHRvIGNyZWF0ZSBhIE1ha2VmaWxlIHRoYXQgYnVpbGRzIGEgc3RhdGljIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCi0jCi0jIEZvciBhIGR5bmFtaWMgbGlicmFyeSwgdXNlCi0jCi0jICAgY21ha2UgPHBhdGgtdG8tZnJlZXR5cGUyLXNyYy1kaXI+IC1EIEJVSUxEX1NIQVJFRF9MSUJTOkJPT0w9dHJ1ZQotIwotIyBGb3IgYSBmcmFtZXdvcmsgb24gT1MgWCwgdXNlCi0jCi0jICAgY21ha2UgPHBhdGgtdG8tZnJlZXR5cGUyLXNyYy1kaXI+IC1EIEJVSUxEX0ZSQU1FV09SSzpCT09MPXRydWUgLUcgWGNvZGUKLSMKLSMgaW5zdGVhZC4KLSMKLSMgRm9yIGFuIGlPUyBzdGF0aWMgbGlicmFyeSwgdXNlCi0jCi0jICAgY21ha2UgLUQgSU9TX1BMQVRGT1JNPU9TIC1HIFhjb2RlIDxwYXRoLXRvLWZyZWV0eXBlMi1zcmMtZGlyPgotIwotIyBvcgotIwotIyAgIGNtYWtlIC1EIElPU19QTEFURk9STT1TSU1VTEFUT1IgLUcgWGNvZGUgPHBhdGgtdG8tZnJlZXR5cGUyLXNyYy1kaXI+Ci0jCi0jIFBsZWFzZSByZWZlciB0byB0aGUgY21ha2UgbWFudWFsIGZvciBmdXJ0aGVyIG9wdGlvbnMsIGluIHBhcnRpY3VsYXIsIGhvdwotIyB0byBtb2RpZnkgY29tcGlsYXRpb24gYW5kIGxpbmtpbmcgcGFyYW1ldGVycy4KLSMKLSMgU29tZSBub3Rlcy4KLSMKLSMgLiBgY21ha2UnIGNyZWF0ZXMgY29uZmlndXJhdGlvbiBmaWxlcyBpbgotIwotIyAgICAgPGJ1aWxkLWRpcmVjdG9yeT4vaW5jbHVkZS9mcmVldHlwZS9jb25maWcKLSMKLSMgICB3aGljaCBzaG91bGQgYmUgZnVydGhlciBtb2RpZmllZCBpZiBuZWNlc3NhcnkuCi0jCi0jIC4gWW91IGNhbiB1c2UgYGNtYWtlJyBkaXJlY3RseSBvbiBhIGZyZXNobHkgY2xvbmVkIEZyZWVUeXBlIGdpdAotIyAgIHJlcG9zaXRvcnkuCi0jCi0jIC4gYENNYWtlTGlzdHMudHh0JyBpcyBwcm92aWRlZCBhcy1pcyBzaW5jZSBpdCBpcyBub3JtYWxseSBub3QgdXNlZCBieSB0aGUKLSMgICBkZXZlbG9wZXIgdGVhbS4KLSMKLSMgLiBJZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9uCi0jICAgdGFyZ2V0cywgYWRkIHRoZSBgLUQgRlJFRVRZUEVfTk9fRElTVD10cnVlJyBjb21tYW5kIGxpbmUgYXJndW1lbnQuCi0jCi0jIC4gU2V0IHRoZSBgV0lUSF9aTElCJywgYFdJVEhfQlppcDInLCBgV0lUSF9QTkcnLCBhbmQgYFdJVEhfSGFyZkJ1enonCi0jICAgQ01ha2UgdmFyaWFibGVzIHRvIGBPTicgb3IgYE9GRicgdG8gZm9yY2Ugb3Igc2tpcCB1c2luZyBhIGRlcGVuZGVuY3kuCi0jICAgTGVhdmUgYSB2YXJpYWJsZSB1bmRlZmluZWQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSB0byB1c2UgdGhlIGRlcGVuZGVuY3kKLSMgICBvbmx5IGlmIGl0IGlzIGF2YWlsYWJsZS4gIEV4YW1wbGU6Ci0jCi0jICAgICBjbWFrZSAuLi4gLURXSVRIX1pMSUI9T04gLURXSVRIX0hhcmZCdXp6PU9GRiAuLi4KLSMKLSMgLiBJbnN0YWxsYXRpb24gb2YgRnJlZVR5cGUgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgQ01ha2UgdmFyaWFibGVzCi0jICAgYFNLSVBfSU5TVEFMTF9IRUFERVJTJywgYFNLSVBfSU5TVEFMTF9MSUJSQVJJRVMnLCBhbmQgYFNLSVBfSU5TVEFMTF9BTEwnCi0jICAgKHRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzYW1lIENNYWtlIHZhcmlhYmxlcyBpbiB6bGliJ3MgQ01ha2UKLSMgICBzdXBwb3J0KS4KLQotCi1jbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42KQotCi0KLWluY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKLQotCi0jIENNQUtFX1RPT0xDSEFJTl9GSUxFIG11c3QgYmUgc2V0IGJlZm9yZSBgcHJvamVjdCcgaXMgY2FsbGVkLCB3aGljaAotIyBjb25maWd1cmVzIHRoZSBiYXNlIGJ1aWxkIGVudmlyb25tZW50IGFuZCByZWZlcmVuY2VzIHRoZSB0b29sY2hhaW4gZmlsZQotaWYgKEFQUExFKQotICBpZiAoREVGSU5FRCBJT1NfUExBVEZPUk0pCi0gICAgaWYgKE5PVCAiJHtJT1NfUExBVEZPUk19IiBTVFJFUVVBTCAiT1MiCi0gICAgICAgIEFORCBOT1QgIiR7SU9TX1BMQVRGT1JNfSIgU1RSRVFVQUwgIlNJTVVMQVRPUiIpCi0gICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCi0gICAgICAgICJJT1NfUExBVEZPUk0gbXVzdCBiZSBzZXQgdG8gZWl0aGVyIE9TIG9yIFNJTVVMQVRPUiIpCi0gICAgZW5kaWYgKCkKLSAgICBpZiAoTk9UICIke0NNQUtFX0dFTkVSQVRPUn0iIFNUUkVRVUFMICJYY29kZSIpCi0gICAgICBtZXNzYWdlKEFVVEhPUl9XQVJOSU5HCi0gICAgICAgICJZb3Ugc2hvdWxkIHVzZSBYY29kZSBnZW5lcmF0b3Igd2l0aCBJT1NfUExBVEZPUk0gZW5hYmxlZCB0byBnZXQgVW5pdmVyc2FsIGJ1aWxkcy4iKQotICAgIGVuZGlmICgpCi0gICAgaWYgKEJVSUxEX1NIQVJFRF9MSUJTKQotICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUgotICAgICAgICAiQlVJTERfU0hBUkVEX0xJQlMgY2FuIG5vdCBiZSBvbiB3aXRoIElPU19QTEFURk9STSBlbmFibGVkIikKLSAgICBlbmRpZiAoKQotICAgIGlmIChCVUlMRF9GUkFNRVdPUkspCi0gICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCi0gICAgICAgICJCVUlMRF9GUkFNRVdPUksgY2FuIG5vdCBiZSBvbiB3aXRoIElPU19QTEFURk9STSBlbmFibGVkIikKLSAgICBlbmRpZiAoKQotCi0gICAgIyBpT1Mgb25seSB1c2VzIHN0YXRpYyBsaWJyYXJpZXMKLSAgICBzZXQoQlVJTERfU0hBUkVEX0xJQlMgT0ZGKQotCi0gICAgc2V0KENNQUtFX1RPT0xDSEFJTl9GSUxFCi0gICAgICAke0NNQUtFX1NPVVJDRV9ESVJ9L2J1aWxkcy9jbWFrZS9pT1MuY21ha2UpCi0gIGVuZGlmICgpCi1lbHNlICgpCi0gIGlmIChERUZJTkVEIElPU19QTEFURk9STSkKLSAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJJT1NfUExBVEZPUk0gaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIikKLSAgZW5kaWYgKCkKLWVuZGlmICgpCi0KLQotcHJvamVjdChmcmVldHlwZSkKLQotCi1pZiAoV0lOMzIgQU5EIE5PVCBNSU5HVyBBTkQgQlVJTERfU0hBUkVEX0xJQlMpCi0gIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMgb24gV2luZG93cyBuZWVkcyBNaW5HVyIpCi1lbmRpZiAoKQotCi0jIERpc2FsbG93IGluLXNvdXJjZSBidWlsZHMKLWlmICgiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9IiBTVFJFUVVBTCAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9IikKLSAgbWVzc2FnZShGQVRBTF9FUlJPUgotICAgICIKLUluLXNvdXJjZSBidWlsZHMgYXJlIG5vdCBwZXJtaXR0ZWQhICBNYWtlIGEgc2VwYXJhdGUgZm9sZGVyIGZvciIKLSAgICAiIGJ1aWxkaW5nLCBlLmcuLCIKLSAgICAiCi0gIG1rZGlyIGJ1aWxkOyBjZCBidWlsZDsgY21ha2UgLi4iCi0gICAgIgotQmVmb3JlIHRoYXQsIHJlbW92ZSB0aGUgZmlsZXMgY3JlYXRlZCBieSB0aGlzIGZhaWxlZCBydW4gd2l0aCIKLSAgICAiCi0gIHJtIC1yZiBDTWFrZUNhY2hlLnR4dCBDTWFrZUZpbGVzIikKLWVuZGlmICgpCi0KLQotIyBBZGQgbG9jYWwgY21ha2UgbW9kdWxlcwotc2V0KENNQUtFX01PRFVMRV9QQVRIICR7Q01BS0VfTU9EVUxFX1BBVEh9ICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9idWlsZHMvY21ha2UpCi0KLQotaWYgKEJVSUxEX0ZSQU1FV09SSykKLSAgaWYgKE5PVCAiJHtDTUFLRV9HRU5FUkFUT1J9IiBTVFJFUVVBTCAiWGNvZGUiKQotICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKLSAgICAgICJZb3Ugc2hvdWxkIHVzZSBYY29kZSBnZW5lcmF0b3Igd2l0aCBCVUlMRF9GUkFNRVdPUksgZW5hYmxlZCIpCi0gIGVuZGlmICgpCi0gIHNldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAiJChBUkNIU19TVEFOREFSRF8zMl82NF9CSVQpIikKLSAgc2V0KEJVSUxEX1NIQVJFRF9MSUJTIE9OKQotZW5kaWYgKCkKLQotCi1zZXQoVkVSU0lPTl9NQUpPUiAiMiIpCi1zZXQoVkVSU0lPTl9NSU5PUiAiOCIpCi1zZXQoVkVSU0lPTl9QQVRDSCAiMCIpCi0KLXNldChQUk9KRUNUX1ZFUlNJT04gJHtWRVJTSU9OX01BSk9SfS4ke1ZFUlNJT05fTUlOT1J9LiR7VkVSU0lPTl9QQVRDSH0pCi1zZXQoU0hBUkVEX0xJQlJBUllfVkVSU0lPTiAke1ZFUlNJT05fTUFKT1J9LiR7VkVSU0lPTl9NSU5PUn0pCi0KLQotIyBDb21waWxlciBkZWZpbml0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIGxpYnJhcnkKLWFkZF9kZWZpbml0aW9ucygtREZUMl9CVUlMRF9MSUJSQVJZKQotCi0KLSMgRmluZCBkZXBlbmRlbmNpZXMKLWZvcmVhY2ggKGQgWkxJQiBCWmlwMiBQTkcgSGFyZkJ1enopCi0gIHN0cmluZyhUT1VQUEVSICIke2R9IiBEKQotCi0gIGlmIChERUZJTkVEIFdJVEhfJHtkfSBPUiBERUZJTkVEIFdJVEhfJHtEfSkKLSAgICBpZiAoV0lUSF8ke2R9IE9SIFdJVEhfJHtEfSkKLSAgICAgIGZpbmRfcGFja2FnZSgke2R9IFFVSUVUIFJFUVVJUkVEKQotICAgIGVuZGlmICgpCi0gIGVsc2UgKCkKLSAgICBmaW5kX3BhY2thZ2UoJHtkfSBRVUlFVCkKLSAgZW5kaWYgKCkKLQotICBpZiAoJHtkfV9GT1VORCBPUiAke0R9X0ZPVU5EKQotICAgIG1lc3NhZ2UoU1RBVFVTICJCdWlsZGluZyB3aXRoICR7ZH0iKQotICBlbmRpZiAoKQotZW5kZm9yZWFjaCAoKQotCi0KLW1lc3NhZ2UoU1RBVFVTCi0gICJDcmVhdGluZyBkaXJlY3RvcnkgJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnIikKLWZpbGUoTUFLRV9ESVJFQ1RPUlkgIiR7UFJPSkVDVF9CSU5BUllfRElSfS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZyIpCi0KLQotIyBDcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotbWVzc2FnZShTVEFUVVMKLSAgIkNyZWF0aW5nIGZpbGUgJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgiKQotCi1pZiAoVU5JWCkKLSAgY2hlY2tfaW5jbHVkZV9maWxlKCJ1bmlzdGQuaCIgSEFWRV9VTklTVERfSCkKLSAgY2hlY2tfaW5jbHVkZV9maWxlKCJmY250bC5oIiBIQVZFX0ZDTlRMX0gpCi0gIGNoZWNrX2luY2x1ZGVfZmlsZSgic3RkaW50LmgiIEhBVkVfU1RESU5UX0gpCi0KLSAgZmlsZShSRUFEICIke1BST0pFQ1RfU09VUkNFX0RJUn0vYnVpbGRzL3VuaXgvZnRjb25maWcuaW4iCi0gICAgRlRDT05GSUdfSCkKLSAgaWYgKEhBVkVfVU5JU1REX0gpCi0gICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UKLSAgICAgICIjdW5kZWYgKyhIQVZFX1VOSVNURF9IKSIgIiNkZWZpbmUgXFwxIgotICAgICAgRlRDT05GSUdfSCAiJHtGVENPTkZJR19IfSIpCi0gIGVuZGlmICgpCi0gIGlmIChIQVZFX0ZDTlRMX0gpCi0gICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UKLSAgICAgICIjdW5kZWYgKyhIQVZFX0ZDTlRMX0gpIiAiI2RlZmluZSBcXDEiCi0gICAgICBGVENPTkZJR19IICIke0ZUQ09ORklHX0h9IikKLSAgZW5kaWYgKCkKLSAgaWYgKEhBVkVfU1RESU5UX0gpCi0gICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UKLSAgICAgICIjdW5kZWYgKyhIQVZFX1NURElOVF9IKSIgIiNkZWZpbmUgXFwxIgotICAgICAgRlRDT05GSUdfSCAiJHtGVENPTkZJR19IfSIpCi0gIGVuZGlmICgpCi0gIHN0cmluZyhSRVBMQUNFICIvdW5kZWYgIiAiI3VuZGVmICIKLSAgICBGVENPTkZJR19IICIke0ZUQ09ORklHX0h9IikKLSAgZmlsZShXUklURSAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgtbmV3IgotICAgICIke0ZUQ09ORklHX0h9IikKLWVsc2UgKCkKLSAgZmlsZShSRUFEICIke1BST0pFQ1RfU09VUkNFX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCIKLSAgICBGVENPTkZJR19IKQotICBmaWxlKFdSSVRFICIke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaC1uZXciCi0gICAgIiR7RlRDT05GSUdfSH0iKQotZW5kaWYgKCkKLWV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQKLSAgIiR7UFJPSkVDVF9CSU5BUllfRElSfS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oLW5ldyIKLSAgIiR7UFJPSkVDVF9CSU5BUllfRElSfS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIikKLQotCi0jIENyZWF0ZSB0aGUgb3B0aW9ucyBmaWxlCi1tZXNzYWdlKFNUQVRVUwotICAiQ3JlYXRpbmcgZmlsZSAke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCIpCi0KLWZpbGUoUkVBRCAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgiCi0gIEZUT1BUSU9OX0gpCi1pZiAoWkxJQl9GT1VORCkKLSAgc3RyaW5nKFJFR0VYIFJFUExBQ0UKLSAgICAiL1xcKiArKCNkZWZpbmUgK0ZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIpICtcXCovIiAiXFwxIgotICAgIEZUT1BUSU9OX0ggIiR7RlRPUFRJT05fSH0iKQotZW5kaWYgKCkKLWlmIChCWklQMl9GT1VORCkKLSAgc3RyaW5nKFJFR0VYIFJFUExBQ0UKLSAgICAiL1xcKiArKCNkZWZpbmUgK0ZUX0NPTkZJR19PUFRJT05fVVNFX0JaSVAyKSArXFwqLyIgIlxcMSIKLSAgICBGVE9QVElPTl9IICIke0ZUT1BUSU9OX0h9IikKLWVuZGlmICgpCi1pZiAoUE5HX0ZPVU5EKQotICBzdHJpbmcoUkVHRVggUkVQTEFDRQotICAgICIvXFwqICsoI2RlZmluZSArRlRfQ09ORklHX09QVElPTl9VU0VfUE5HKSArXFwqLyIgIlxcMSIKLSAgICBGVE9QVElPTl9IICIke0ZUT1BUSU9OX0h9IikKLWVuZGlmICgpCi1pZiAoSEFSRkJVWlpfRk9VTkQpCi0gIHN0cmluZyhSRUdFWCBSRVBMQUNFCi0gICAgIi9cXCogKygjZGVmaW5lICtGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWikgK1xcKi8iICJcXDEiCi0gICAgRlRPUFRJT05fSCAiJHtGVE9QVElPTl9IfSIpCi1lbmRpZiAoKQotZmlsZShXUklURSAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgtbmV3IgotICAiJHtGVE9QVElPTl9IfSIpCi1leGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50Ci0gICIke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaC1uZXciCi0gICIke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCIpCi0KLQotIyBTcGVjaWZ5IGxpYnJhcnkgaW5jbHVkZSBkaXJlY3RvcmllcwotaW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2luY2x1ZGUiKQotaW5jbHVkZV9kaXJlY3RvcmllcyhCRUZPUkUgIiR7UFJPSkVDVF9CSU5BUllfRElSfS9pbmNsdWRlIikKLQotCi1maWxlKEdMT0IgUFVCTElDX0hFQURFUlMgImluY2x1ZGUvZnQyYnVpbGQuaCIgImluY2x1ZGUvZnJlZXR5cGUvKi5oIikKLWZpbGUoR0xPQiBQVUJMSUNfQ09ORklHX0hFQURFUlMgImluY2x1ZGUvZnJlZXR5cGUvY29uZmlnLyouaCIpCi1maWxlKEdMT0IgUFJJVkFURV9IRUFERVJTICJpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsLyouaCIpCi0KLQotc2V0KEJBU0VfU1JDUwotICBzcmMvYXV0b2ZpdC9hdXRvZml0LmMKLSAgc3JjL2Jhc2UvZnRiYXNlLmMKLSAgc3JjL2Jhc2UvZnRiYm94LmMKLSAgc3JjL2Jhc2UvZnRiZGYuYwotICBzcmMvYmFzZS9mdGJpdG1hcC5jCi0gIHNyYy9iYXNlL2Z0Y2lkLmMKLSAgc3JjL2Jhc2UvZnRmbnRmbXQuYwotICBzcmMvYmFzZS9mdGZzdHlwZS5jCi0gIHNyYy9iYXNlL2Z0Z2FzcC5jCi0gIHNyYy9iYXNlL2Z0Z2x5cGguYwotICBzcmMvYmFzZS9mdGd4dmFsLmMKLSAgc3JjL2Jhc2UvZnRpbml0LmMKLSAgc3JjL2Jhc2UvZnRsY2RmaWwuYwotICBzcmMvYmFzZS9mdG1tLmMKLSAgc3JjL2Jhc2UvZnRvdHZhbC5jCi0gIHNyYy9iYXNlL2Z0cGF0ZW50LmMKLSAgc3JjL2Jhc2UvZnRwZnIuYwotICBzcmMvYmFzZS9mdHN0cm9rZS5jCi0gIHNyYy9iYXNlL2Z0c3ludGguYwotICBzcmMvYmFzZS9mdHN5c3RlbS5jCi0gIHNyYy9iYXNlL2Z0dHlwZTEuYwotICBzcmMvYmFzZS9mdHdpbmZudC5jCi0gIHNyYy9iZGYvYmRmLmMKLSAgc3JjL2J6aXAyL2Z0YnppcDIuYwotICBzcmMvY2FjaGUvZnRjYWNoZS5jCi0gIHNyYy9jZmYvY2ZmLmMKLSAgc3JjL2NpZC90eXBlMWNpZC5jCi0gIHNyYy9nemlwL2Z0Z3ppcC5jCi0gIHNyYy9sencvZnRsencuYwotICBzcmMvcGNmL3BjZi5jCi0gIHNyYy9wZnIvcGZyLmMKLSAgc3JjL3BzYXV4L3BzYXV4LmMKLSAgc3JjL3BzaGludGVyL3BzaGludGVyLmMKLSAgc3JjL3BzbmFtZXMvcHNuYW1lcy5jCi0gIHNyYy9yYXN0ZXIvcmFzdGVyLmMKLSAgc3JjL3NmbnQvc2ZudC5jCi0gIHNyYy9zbW9vdGgvc21vb3RoLmMKLSAgc3JjL3RydWV0eXBlL3RydWV0eXBlLmMKLSAgc3JjL3R5cGUxL3R5cGUxLmMKLSAgc3JjL3R5cGU0Mi90eXBlNDIuYwotICBzcmMvd2luZm9udHMvd2luZm50LmMKLSkKLQotaWYgKFdJTjMyKQotICBzZXQoQkFTRV9TUkNTICR7QkFTRV9TUkNTfSBidWlsZHMvd2luZG93cy9mdGRlYnVnLmMpCi1lbHNlaWYgKFdJTkNFKQotICBzZXQoQkFTRV9TUkNTICR7QkFTRV9TUkNTfSBidWlsZHMvd2luY2UvZnRkZWJ1Zy5jKQotZWxzZSAoKQotICBzZXQoQkFTRV9TUkNTICR7QkFTRV9TUkNTfSBzcmMvYmFzZS9mdGRlYnVnLmMpCi1lbmRpZiAoKQotCi0KLWlmIChCVUlMRF9GUkFNRVdPUkspCi0gIHNldChCQVNFX1NSQ1MKLSAgICAke0JBU0VfU1JDU30KLSAgICBidWlsZHMvbWFjL2ZyZWV0eXBlLUluZm8ucGxpc3QKLSAgKQotZW5kaWYgKCkKLQotc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggZCkKLQotYWRkX2xpYnJhcnkoZnJlZXR5cGUKLSAgJHtQVUJMSUNfSEVBREVSU30KLSAgJHtQVUJMSUNfQ09ORklHX0hFQURFUlN9Ci0gICR7UFJJVkFURV9IRUFERVJTfQotICAke0JBU0VfU1JDU30KLSkKLQotCi1pZiAoQlVJTERfU0hBUkVEX0xJQlMpCi0gIHNldF90YXJnZXRfcHJvcGVydGllcyhmcmVldHlwZSBQUk9QRVJUSUVTCi0gICAgVkVSU0lPTiAke1BST0pFQ1RfVkVSU0lPTn0KLSAgICBTT1ZFUlNJT04gJHtTSEFSRURfTElCUkFSWV9WRVJTSU9OfQotICAgIENPTVBJTEVfREVGSU5JVElPTlMgZnJlZXR5cGVfRVhQT1JUUwotICApCi1lbmRpZiAoKQotCi0KLWlmIChCVUlMRF9GUkFNRVdPUkspCi0gIHNldF9wcm9wZXJ0eShTT1VSQ0UgJHtQVUJMSUNfQ09ORklHX0hFQURFUlN9Ci0gICAgUFJPUEVSVFkgTUFDT1NYX1BBQ0tBR0VfTE9DQVRJT04gSGVhZGVycy9jb25maWcKLSAgKQotICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZnJlZXR5cGUgUFJPUEVSVElFUwotICAgIEZSQU1FV09SSyBUUlVFCi0gICAgTUFDT1NYX0ZSQU1FV09SS19JTkZPX1BMSVNUIGJ1aWxkcy9tYWMvZnJlZXR5cGUtSW5mby5wbGlzdAotICAgIFBVQkxJQ19IRUFERVIgIiR7UFVCTElDX0hFQURFUlN9IgotICAgIFhDT0RFX0FUVFJJQlVURV9JTlNUQUxMX1BBVEggIkBycGF0aCIKLSAgKQotZW5kaWYgKCkKLQotaWYgKE5PVCBDTUFLRV9WRVJTSU9OIFZFUlNJT05fTEVTUyAyLjguMTIpCi0gIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKGZyZWV0eXBlCi0gICAgUFVCTElDICQ8SU5TVEFMTF9JTlRFUkZBQ0U6aW5jbHVkZS9mcmVldHlwZTI+KQotZW5kaWYgKCkKLQotaWYgKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDIuOC4xMikKLSAgc2V0KE1BWUJFX1BSSVZBVEUgIiIpCi1lbHNlICgpCi0gIHNldChNQVlCRV9QUklWQVRFICJQUklWQVRFIikKLWVuZGlmICgpCi0KLWlmIChaTElCX0ZPVU5EKQotICB0YXJnZXRfbGlua19saWJyYXJpZXMoZnJlZXR5cGUgJHtNQVlCRV9QUklWQVRFfSAke1pMSUJfTElCUkFSSUVTfSkKLSAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1pMSUJfSU5DTFVERV9ESVJTfSkKLWVuZGlmICgpCi1pZiAoQlpJUDJfRk9VTkQpCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhmcmVldHlwZSAke01BWUJFX1BSSVZBVEV9ICR7QlpJUDJfTElCUkFSSUVTfSkKLSAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0JaSVAyX0lOQ0xVREVfRElSfSkgIyBub3QgQlpJUDJfSU5DTFVERV9ESVJTCi1lbmRpZiAoKQotaWYgKFBOR19GT1VORCkKLSAgYWRkX2RlZmluaXRpb25zKCR7UE5HX0RFRklOSVRJT05TfSkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGZyZWV0eXBlICR7TUFZQkVfUFJJVkFURX0gJHtQTkdfTElCUkFSSUVTfSkKLSAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1BOR19JTkNMVURFX0RJUlN9KQotZW5kaWYgKCkKLWlmIChIQVJGQlVaWl9GT1VORCkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGZyZWV0eXBlICR7TUFZQkVfUFJJVkFURX0gJHtIQVJGQlVaWl9MSUJSQVJJRVN9KQotICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7SEFSRkJVWlpfSU5DTFVERV9ESVJTfSkKLWVuZGlmICgpCi0KLQotIyBJbnN0YWxsYXRpb25zCi0jIE5vdGUgdGhlIHRyYWlsaW5nIHNsYXNoIGluIHRoZSBhcmd1bWVudCB0byB0aGUgYERJUkVDVE9SWScgZGlyZWN0aXZlCi1pZiAoTk9UIFNLSVBfSU5TVEFMTF9IRUFERVJTIEFORCBOT1QgU0tJUF9JTlNUQUxMX0FMTCkKLSAgaW5zdGFsbChESVJFQ1RPUlkgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2luY2x1ZGUvCi0gICAgREVTVElOQVRJT04gaW5jbHVkZS9mcmVldHlwZTIKLSAgICBQQVRURVJOICJpbnRlcm5hbCIgRVhDTFVERQotICAgIFBBVFRFUk4gImZ0Y29uZmlnLmgiIEVYQ0xVREUKLSAgICBQQVRURVJOICJmdG9wdGlvbi5oIiBFWENMVURFCi0gICAgKQotICBpbnN0YWxsKEZJTEVTCi0gICAgJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgKLSAgICAke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAotICAgIERFU1RJTkFUSU9OIGluY2x1ZGUvZnJlZXR5cGUyL2ZyZWV0eXBlL2NvbmZpZwotICAgICkKLWVuZGlmICgpCi0KLWlmIChOT1QgU0tJUF9JTlNUQUxMX0xJQlJBUklFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwpCi0gIGluc3RhbGwoVEFSR0VUUyBmcmVldHlwZQotICAgIEVYUE9SVCBmcmVldHlwZS10YXJnZXRzCi0gICAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4KLSAgICBMSUJSQVJZIERFU1RJTkFUSU9OIGxpYgotICAgIEFSQ0hJVkUgREVTVElOQVRJT04gbGliCi0gICAgRlJBTUVXT1JLIERFU1RJTkFUSU9OIExpYnJhcnkvRnJhbWV3b3JrcwotICAgICkKLSAgaW5zdGFsbChFWFBPUlQgZnJlZXR5cGUtdGFyZ2V0cwotICAgIERFU1RJTkFUSU9OIGxpYi9jbWFrZS9mcmVldHlwZQotICAgIEZJTEUgZnJlZXR5cGUtY29uZmlnLmNtYWtlCi0gICAgKQotZW5kaWYgKCkKLQotCi0jIFBhY2thZ2luZwotIyBDUGFjayB2ZXJzaW9uIG51bWJlcnMgZm9yIHJlbGVhc2UgdGFyYmFsbCBuYW1lLgotc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NQUpPUiAke1ZFUlNJT05fTUFKT1J9KQotc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NSU5PUiAke1ZFUlNJT05fTUlOT1J9KQotc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9QQVRDSCAke1ZFUlNJT05fUEFUQ0h9fSkKLWlmIChOT1QgREVGSU5FRCBDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkpCi0gIHNldChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkgIiR7Q01BS0VfUFJPSkVDVF9OQU1FfSIpCi1lbmRpZiAoKQotaWYgKE5PVCBERUZJTkVEIENQQUNLX1NPVVJDRV9QQUNLQUdFX0ZJTEVfTkFNRSkKLSAgc2V0KENQQUNLX1NPVVJDRV9QQUNLQUdFX0ZJTEVfTkFNRQotICAgICIke0NNQUtFX1BST0pFQ1RfTkFNRX0tJHtQUk9KRUNUX1ZFUlNJT059LXIke1BST0pFQ1RfUkVWfSIKLSAgICBDQUNIRSBJTlRFUk5BTCAidGFyYmFsbCBiYXNlbmFtZSIKLSAgKQotZW5kaWYgKCkKLXNldChDUEFDS19TT1VSQ0VfR0VORVJBVE9SIFRHWikKLXNldChDUEFDS19TT1VSQ0VfSUdOT1JFX0ZJTEVTCi0gICIvQ1ZTLzsvLnN2bi87LnN3cCQ7LiM7LyM7L2J1aWxkLzsvc2VyaWFsLzsvc2VyLzsvcGFyYWxsZWwvOy9wYXIvO347L3ByZWNvbmZpZy5vdXQ7L2F1dG9tNHRlLmNhY2hlLzsvLmNvbmZpZyIpCi1zZXQoQ1BBQ0tfR0VORVJBVE9SIFRHWikKLWluY2x1ZGUoQ1BhY2spCi0KLQotIyBBZGQgYG1ha2UgZGlzdCcgdGFyZ2V0IGlmIEZSRUVUWVBFX0RJU1QgaXMgc2V0ICh3aGljaCBpcyB0aGUgZGVmYXVsdCkKLWlmIChOT1QgREVGSU5FRCBGUkVFVFlQRV9OT19ESVNUKQotICBhZGRfY3VzdG9tX3RhcmdldChkaXN0IENPTU1BTkQgJHtDTUFLRV9NQUtFX1BST0dSQU19IHBhY2thZ2Vfc291cmNlKQotZW5kaWYgKCkKLQotIyBlb2YKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NWNiYi4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw0Njg5ICswLDAgQEAKLTIwMTctMDYtMjAgIFRvbnkgVGhlb2RvcmUgIDx0b255dEBsb2d5c3QuY29tPgotCi0JRml4IHBrZy1jb25maWcgaW4gZnJlZXR5cGUtY29uZmlnIGZvciBjcm9zcy1jb21waWxpbmcgKCM1MTI3NCkuCi0KLQkqIGJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChQS0dfQ09ORklHKTogTmV3IHZhcmlhYmxlLgotCShmcmVldHlwZS1jb25maWcpOiBVc2UgaXQgaW4gc2VkIGV4cHJlc3Npb24uCi0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbjogcy9wa2ctY29uZmlnLyVQS0dfQ09ORklHJS8uCi0KLTIwMTctMDYtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmYsIHRydWV0eXBlXSBJbnRlZ2VyIG92ZXJmbG93cy4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIzMDAKLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIzMTMKLQotCSogc3JjL2NmZi9jZjJoaW50cy5jIChjZjJfaGludG1hcF9hZGp1c3RIaW50cyk6IFVzZSBBRERfSU5UMzIuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfQUJTKTogQXZvaWQgRlRfQUJTLgotCi0yMDE3LTA2LTE3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZSwgc21vb3RoXSBMQ0QgZmlsdGVyaW5nIGNsZWFudXBzLgotCi0JKiBzcmMvYmFzZS9mdGxjZGxpbC5jIChmdF9sY2RfZmlsdGVyX2ZpciwgX2Z0X2xjZF9maWx0ZXJfbGVnYWN5KToKLQlDbGVhbiB1cCwgc3RhcnQgZmlsdGVyaW5nIGZyb20gdGhlIGJvdHRvbS1sZWZ0IG9yaWdpbi4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBVcGRhdGVkLgotCi0yMDE3LTA2LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3dzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjI3MAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjI3OAotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX01EUlAsIF9pdXBfd29ya2VyX2ludGVycG9sYXRlKTogVXNlCi0JQUREX0xPTkcgYW5kIFNVQl9MT05HLgotCi0yMDE3LTA2LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmLCBjZmZdIEludGVnZXIgb3ZlcmZsb3dzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjI0NAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjI2MQotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9GYWNlX0luaXQpOiBSZXBsYWNlIGNhbGxzIHRvIEZUX0FCUyB3aXRoCi0JZGlyZWN0IGNvZGUgdG8gYXZvaWQgdmFsdWUgbmVnYXRpb24uCi0KLQkqIHNyYy9jZmYvY2YyYmx1ZXMuYyAoY2YyX2JsdWVzX2NhcHR1cmUpOiBVc2UgU1VCX0lOVDMyIGFuZAotCUFERF9JTlQzMi4KLQotMjAxNy0wNi0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9GYWNlX0luaXQpOiBEb24ndCBzZXQgYWN0aXZlIGVuY29kaW5nLgotCi0JRnJlZVR5cGUgb25seSBzZXRzIGEgZGVmYXVsdCBhY3RpdmUgZW5jb2RpbmcgZm9yIFVuaWNvZGUuCi0KLTIwMTctMDYtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmYsIHRydWV0eXBlXSBJbnRlZ2VyIG92ZXJmbG93cy4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIyMTYKLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIyMTgKLQotCSogc3JjL2NmZi9jZjJmaXhlZC5oIChjZjJfZml4ZWRBYnMpOiBVc2UgTkVHX0lOVDMyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX0lQKTogVXNlIFNVQl9MT05HLgotCi0yMDE3LTA2LTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBJbnRlZ2VyIG92ZXJmbG93cy4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIyMDAKLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIyMTAKLQotCSogc3JjL2NmZi9jZjJoaW50cy5jIChjZjJfaGludG1hcF9pbnNlcnRIaW50KTogVXNlIFNVQl9JTlQzMiBhbmQKLQlBRERfSU5UMzIuCi0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9jbWRWTU9WRVRPPjogVXNlCi0JQUREX0lOVDMyLgotCi0yMDE3LTA2LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBUVF9TZXRfVmFyX0Rlc2lnbi4KLQotCVJlcG9ydGVkIGJ5IE5pa29sYXVzIFdheHdlaWxlciA8bWFkaWdlbnNAZ21haWwuY29tPi4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfU2V0X1Zhcl9EZXNpZ24pOiBDb3JyZWN0bHkgaGFuZGxlIHRoZQotCWNhc2Ugd2hlcmUgd2UgaGF2ZSBsZXNzIGlucHV0IGNvb3JkaW5hdGVzIHRoYW4gYXhlcy4KLQotMjAxNy0wNi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfRGl2Rml4KTogRml4IGVtYmFycmFzc2luZyB0eXBvLgotCi0JQnVnIGludHJvZHVjZWQgMjAxNy0wNS0yOC4KLQotMjAxNy0wNi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZiwgdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3dzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjE0NAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjE1MQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjE1MwotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjE3MwotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjE4NgotCi0JKiBzcmMvY2ZmL2NmMmJsdWVzLmMgKGNmMl9ibHVlc19pbml0KTogVXNlIFNVQl9JTlQzMi4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFJvdW5kX05vbmUsIFJvdW5kX1RvX0dyaWQsCi0JUm91bmRfVG9fSGFsZl9HcmlkLCBSb3VuZF9Eb3duX1RvX0dyaWQsIFJvdW5kX1VwX1RvX0dyaWQsCi0JUm91bmRfVG9fRG91YmxlX0dyaWQsIFJvdW5kX1N1cGVyLCBSb3VuZF9TdXBlcl80NSk6IFVzZSBBRERfTE9ORywKLQlTVUJfTE9ORywgTkVHX0xPTkcsIEZUX1BJWF9ST1VORF9MT05HLCBGVF9QSVhfQ0VJTF9MT05HLAotCUZUX1BBRF9ST1VORF9MT05HCi0JKEluc19TeFZUTCwgSW5zX01JUlApOiBVc2UgU1VCX0xPTkcuCi0JKF9pdXBfd29ya2VyX3NoaWZ0KTogVXNlIFNVQl9MT05HIGFuZCBBRERfTE9ORy4KLQotMjAxNy0wNi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUHJvdmlkZSBtb3JlIG1hY3JvcyBmb3IgZmxvb3JpbmcsIGNlaWxpbmcsIGFuZCByb3VuZGluZy4KLQotCVRoZXNlIHZlcnNpb25zIGRvbid0IHByb2R1Y2UgcnVuLXRpbWUgZXJyb3JzIGR1ZSB0byBpbnRlZ2VyCi0Jb3ZlcmZsb3cuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg6IEluY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ILgotCShGVF9QQURfUk9VTkRfTE9ORywgRlRfUEFEX0NFSUxfTE9ORywgRlRfUElYX1JPVU5EX0xPTkcsCi0JRlRfUElYX0NFSUxfTE9ORyk6IE5ldyBtYWNyb3MuCi0JKEZUX1BBRF9ST1VORF9JTlQzMiwgRlRfUEFEX0NFSUxfSU5UMzIsIEZUX1BJWF9ST1VORF9JTlQzMiwKLQlGVF9QSVhfQ0VJTF9JTlQzMik6IE5ldyBtYWNyb3MuCi0KLTIwMTctMDYtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJlbW92ZSB1bnVzZWQgbWFjcm9zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIChBRERfSU5ULCBTVUJfSU5ULCBNVUxfSU5ULAotCU5FR19JTlQpOiBEZWxldGVkLgotCi0yMDE3LTA2LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqLyo6IFJlbW92ZSBgT1ZFUkZMT1dfJyBwcmVmaXguCi0KLQlUaGlzIGluY3JlYXNlcyByZWFkYWJpbGl0eS4KLQotMjAxNy0wNi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZiwgdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3dzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjEzMwotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjEzNwotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmMgKGNmMl9oaW50X2luaXQpOiBVc2UgT1ZFUkZMT1dfU1VCX0lOVDMyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoUFJPSkVDVCwgRFVBTFBST0opOiBVc2UKLQlPVkVSRkxPV19TVUJfTE9ORy4KLQotMjAxNy0wNi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gSW50ZWdlciBvdmVyZmxvd3MuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMTA5Ci0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMTEwCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMTIyCi0KLQkqIHNyYy9jZmYvY2YyYmx1ZXMuYyAoY2YyX2JsdWVzX2luaXQpOiBVc2UgT1ZFUkZMT1dfU1VCX0lOVDMyLgotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmMgKGNmMl9oaW50bWFwX21hcCk6IFN5bmNocm9uaXplIGlmLWVsc2UKLQlicmFuY2hlcy4KLQotMjAxNy0wNi0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gSW50ZWdlciBvdmVyZmxvdy4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIwODkKLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9ibGVuZF9kb0JsZW5kKTogVXNlciBPVkVSRkxPV19BRERfSU5UMzIuCi0KLTIwMTctMDYtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmYsIHRydWV0eXBlXSBJbnRlZ2VyIG92ZXJmbG93cy4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIwNzUKLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIwODgKLQotCSogc3JjL2NmZi9jZjJmb250LmMgKGNmMl9mb250X3NldHVwKTogVXNlIE9WRVJGTE9XX01VTF9JTlQzMi4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JU0VDVCk6IFVzZSBPVkVSRkxPV19NVUxfTE9ORywKLQlPVkVSRkxPV19BRERfTE9ORywgYW5kIE9WRVJGTE9XX1NVQl9MT05HLgotCi0yMDE3LTA2LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZSwgY2ZmLCB0cnVldHlwZV0gSW50ZWdlciBvdmVyZmxvd3MuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMDYwCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMDYyCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMDYzCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMDY4Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfZ3JpZF9maXRfbWV0cmljcyk6IFVzZQotCU9WRVJGTE9XX0FERF9MT05HIGFuZCBPVkVSRkxPV19TVUJfTE9ORy4KLQotCSogc3JjL2NmZi9jZjJibHVlcy5jIChjZjJfYmx1ZXNfY2FwdHVyZSksIHNyYy9jZmYvY2YyaGludHMuYwotCShjZjJfaGludG1hcF9hZGp1c3RIaW50cyk6IFVzZSBPVkVSRkxPV19TVUJfSU5UMzIuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGNvbXB1dGVfZ2x5cGhfbWV0cmljcyk6IFVzZXIKLQlPVkVSRkxPV19TVUJfTE9ORy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKERpcmVjdF9Nb3ZlLCBEaXJlY3RfTW92ZV9PcmlnLAotCURpcmVjdF9Nb3ZlX1gsIERpcmVjdF9Nb3ZlX1ksIERpcmVjdF9Nb3ZlX09yaWdfWCwKLQlEaXJlY3RfTW92ZV9PcmlnX1ksIE1vdmVfWnAyX1BvaW50LCBJbnNfTVNJUlApOiBVc2UKLQlPVkVSRkxPV19BRERfTE9ORyBhbmQgT1ZFUkZMT1dfU1VCX0xPTkcuCi0KLTIwMTctMDYtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluOiBGaXggcGtnLWNvbmZpZyB0ZXN0ICgjNTExNjIpLgotCi0JUGF0Y2ggZGlyZWN0bHkgdGFrZW4gZnJvbSBidWcgcmVwb3J0LgotCi0yMDE3LTA2LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBTeW5jaHJvbml6ZSBzYW5pdHkgY2hlY2tzIHdpdGggcGNmIGRyaXZlci4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIwNTQKLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTIwNTgKLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfRmFjZV9Jbml0KTogQ2hlY2sgZm9udCBhc2NlbnQgYW5kIGRlc2NlbnQuCi0JQ2hlY2sgQVZFUkFHRV9XSURUSCwgUE9JTlRfU0laRSwgUElYRUxfU0laRSwgUkVTT0xVVElPTl9YLCBhbmQKLQlSRVNPTFVUSU9OX1kgcHJvcGVydGllcy4KLQotMjAxNy0wNi0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZiwgdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3dzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjA0NwotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjA1NwotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmMgKGNmMl9oaW50bWFwX21hcCk6IFVzZSBPVkVSRkxPV19TVUJfSU5UMzIuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfQUREKTogVXNlIE9WRVJGTE9XX0FERF9MT05HLgotCShJbnNfU1VCKTogVXNlIE9WRVJGTE9XX1NVQl9MT05HLgotCShJbnNfTkVHKTogVXNlIE5FR19MT05HLgotCi0yMDE3LTA2LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlmdGNhbGMuaDogQXZvaWQgbGVmdC1zaGlmdCBvZiBuZWdhdGl2ZSBudW1iZXJzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjA1NQotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIChJTlRfVE9fRjI2RE9UNiwKLQlJTlRfVE9fRjJET1QxNCwgSU5UX1RPX0ZJWEVELCBGMkRPVDE0X1RPX0ZJWEVEKTogVXNlIG11bHRpcGxpY2F0aW9uLgotCi0yMDE3LTA2LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBFdmVuIG1vcmUgaW50ZWdlciBvdmVyZmxvd3MuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMDQ2Ci0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYyAoY2YyX2RvU3RlbXMsIGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpOiBVc2UKLQlPVkVSRkxPV19BRERfSU5UMzIuCi0KLTIwMTctMDYtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIE1vcmUgaW50ZWdlciBvdmVyZmxvd3MuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMDMyCi0KLQkqIHNyYy9jZmYvY2YyYmx1ZXMuYyAoY2YyX2JsdWVzX2luaXQpOiBVc2UgT1ZFUkZMT1dfU1VCX0lOVDMyLgotCi0yMDE3LTA2LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBEb24ndCBsZWZ0LXNoaWZ0IG5lZ2F0aXZlIG51bWJlcnMuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMDMxCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IFVzZSBtdWx0aXBsaWNhdGlvbi4KLQotMjAxNy0wNi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gRml4IGludGVnZXIgc2Nhbm5pbmcgcm91dGluZXMuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMDI5Ci0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfYXRvdWwsIF9iZGZfYXRvbCwgX2JkZl9hdG91cywgX2JkZl9hdG9zKToKLQlTdG9wIHNjYW5uaW5nIGlmIHJlc3VsdCB3b3VsZCBvdmVyZmxvdy4KLQotMjAxNy0wNi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gRml4IGludGVnZXIgb3ZlcmZsb3dzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjAyNwotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjAyOAotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmMgKGNmMl9oaW50bWFwX2luc2VydEhpbnQpLCBzcmMvY2ZmL2NmMmludHJwLmMKLQkoY2YyX2RvRmxleCk6IFVzZSBPVkVSRkxPV19BRERfSU5UMzIgYW5kIE9WRVJGTE9XX1NVQl9JTlQzMi4KLQotMjAxNy0wNi0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Ntb290aF0gU29tZSAzMmJpdCBpbnRlZ2VyIG92ZXJmbG93IHJ1bi10aW1lIGVycm9ycy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgW1NUQU5EQUxPTkVdIChPVkVSRkxPV19BRERfTE9ORywKLQlPVkVSRkxPV19TVUJfTE9ORywgT1ZFUkZMT1dfTVVMX0xPTkcsIE5FR19MT05HKTogTmV3IG1hY3Jvcy4KLQlbIVNUQU5EQUxPTkVdOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSC4KLQkoZ3JheV9yZW5kZXJfY3ViaWMpOiBVc2UgdGhvc2UgbWFjcm9zIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0yMDE3LTA2LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyAoRlRfR2V0X0dseXBoKTogQ2hlY2sgYHNsb3QtPmFkdmFuY2UnLgotCi0yMDE3LTA2LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNhdXhdIDMyYml0IGludGVnZXIgb3ZlcmZsb3cgdHVuLXRpbWUgZXJyb3JzICgjNDYxNDkpLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IFVzZQotCU9WRVJGTE9XX0FERF9MT05HIGFuZCBPVkVSRkxPV19TVUJfTE9ORyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotMjAxNy0wNi0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogQWRqdXN0IGxvb3AgY291bnRlciBhZ2Fpbi4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTWFyZWsgS2HFocOtayA8bWthc2lrQHJlZGhhdC5jb20+LgotCi0JVGhlIHByb2JsZW1hdGljIGZvbnQgdGhhdCBleGNlZWRzIHRoZSBvbGQgbGltaXQgaXMgUGFkYXVrLUJvbGQsCi0JdmVyc2lvbiAzLjAwMiwgY29udGFpbmluZyBieXRlY29kZSBnZW5lcmF0ZWQgYnkgYSBidWdneSB2ZXJzaW9uIG9mCi0JdHRmYXV0b2hpbnQuCi0KLTIwMTctMDUtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIDMyYml0IGludGVnZXIgb3ZlcmZsb3cgcnVuLXRpbWUgZXJyb3JzIDIvMiAoIzQ2MTQ5KS4KLQotCVRoaXMgY29tbWl0IGhhbmRsZXMgdGhlIG5ldyBlbmdpbmUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmggKE9WRVJGTE9XX0FERF9JTlQzMiwKLQlPVkVSRkxPV19TVUJfSU5UMzIsIE9WRVJGTE9XX01VTF9JTlQzMiwgTkVHX0lOVCwgTkVHX0xPTkcsCi0JTkVHX0lOVDMyKTogTmV3IG1hY3Jvcy4KLQotCSogc3JjL2NmZi9jZjJmdC5jIChjZjJfZ2V0U2NhbGVBbmRIaW50RmxhZyk6IFVzZSBPVkVSRkxPV19BRERfSU5UMzIuCi0KLQkqIHNyYy9jZmYvY2YyaGludHMuYyAoY2YyX2dldFdpbmRpbmdNb21lbnR1bSwgY2YyX2hpbnRfaW5pdCwKLQljZjJfaGludG1hcF9tYXAsIGNmMl9nbHlwaHBhdGhfaGludFBvaW50LAotCWNmMl9nbHlwaHBhdGhfY29tcHV0ZUludGVyc2VjdGlvbiwgY2YyX2dseXBocGF0aF9jb21wdXRlT2Zmc2V0LAotCWNmMl9nbHlwaHBhdGhfbGluZVRvLCBjZjJfZ2x5cGhwYXRoX2N1cnZlVG8pOiBVc2UKLQlPVkVSRkxPV19BRERfSU5UMzIsIE9WRVJGTE9XX1NVQl9JTlQzMiwgT1ZFUkZMT1dfTVVMX0lOVDMyLCBhbmQKLQlORUdfSU5UMzIgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYyAoY2YyX2RvRmxleCwgY2YyX2RvQmxlbmQsCi0JY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IERpdHRvLgotCUFsc28gYWRkIHNvbWUgb3RoZXIgY29kZSB3aGVyZSBuZWVkZWQgdG8gYXZvaWQgb3ZlcmZsb3cuCi0KLTIwMTctMDUtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIDMyYml0IGludGVnZXIgb3ZlcmZsb3cgcnVuLXRpbWUgZXJyb3JzIDEvMiAoIzQ2MTQ5KS4KLQotCVRoaXMgY29tbWl0IGhhbmRsZXMgdGhlIG9sZCBlbmdpbmUuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0guCi0JKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogVXNlIE9WRVJGTE9XX0FERF9MT05HIGFuZAotCU9WRVJGTE9XX1NVQl9MT05HIHdoZXJlIG5lZWRlZC4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSC4KLQkocG93ZXJfdGVuX2xpbWl0cyk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKGRvX2ZpeGVkKTogVXNlIGl0IHRvIHByZXZlbnQgbXVsdGlwbGljYXRpb24gb3ZlcmZsb3cuCi0JKGNmZl9wYXJzZXJfcnVuKTogVXNlIE9WRVJGTE9XX0FERF9MT05HLgotCi0yMDE3LTA1LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNhdXhdIENvcnJlY3RseSBoYW5kbGUgc2VxdWVuY2VzIG9mIG11bHRpcGxlIG51bWJlciBzaWducy4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jIChQU19Db252X1N0cnRvbCwgUFNfQ29udl9Ub0ZpeGVkKTogUmV0dXJuIHplcm8KLQlpZiB3ZSBlbmNvdW50ZXIgbW9yZSB0aGFuIGEgc2luZ2xlIHNpZ24uCi0KLTIwMTctMDUtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwY2ZdIDMyYml0IGludGVnZXIgb3ZlcmZsb3cgcnVuLXRpbWUgZXJyb3JzICgjNDYxNDkpLgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9hY2NlbCk6IEFkZCBzYW5pdHkgY2hlY2tzIGZvcgotCWBmb250QXNjZW50JyBhbmQgYGZvbnREZXNjZW50Jy4KLQkocGNmX2xvYWRfZm9udCk6IEFkZCBzYW5pdHkgY2hlY2tzIGZvciBnbG9iYWwgaGVpZ2h0LgotCUFkZCBzYW5pdHkgY2hlY2tzIGZvciBBVkVSQUdFX1dJRFRILCBQT0lOVF9TSVpFLCBQSVhFTF9TSVpFLAotCVJFU09MVVRJT05fWCwgYW5kIFJFU09MVVRJT05fWSBwcm9wZXJ0aWVzLgotCi0yMDE3LTA1LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlIYW5kbGUgc29tZSBpbnRlZ2VyIG92ZXJmbG93IHJ1bi10aW1lIGVycm9ycyAoIzQ2MTQ5LCAjNDg5NzkpLgotCi0JVGhpcyBjb21taXQgKG1haW5seSBmb3IgMzJiaXQgQ1BVcykgaXMgdGhlIGZpcnN0IG9mIGEgc2VyaWVzIG9mCi0Jc2ltaWxhciBjb21taXRzIHRvIGhhbmRsZSBrbm93biBpbnRlZ2VyIG92ZXJmbG93cy4gIEJhc2ljYWxseSwgYWxsCi0Jb2YgdGhlbSBhcmUgaGFybWxlc3MsIHNpbmNlIHRoZXkgYWZmZWN0IHJlbmRlcmluZyBvZiBnbHlwaHMgb25seSwKLQlub3QgcG9zaW5nIHNlY3VyaXR5IHRocmVhdHMuICBJdCBpcyBleHBlY3RlZCB0aGF0IGZ1enp5aW5nIHdpbGwgc2hvdwotCXVwIG1vcmUgb3ZlcmZsb3dzLCB0byBiZSBmaXhlZCBpbiBkdWUgY291cnNlLgotCi0JVGhlIGlkZWEgaXMgdG8gbWFyayBwbGFjZXMgd2hlcmUgb3ZlcmZsb3dzIGNhbiBvY2N1ciwgdXNpbmcgbWFjcm9zCi0JdGhhdCBzaW1wbHkgY2FzdCB0byB1bnNpZ25lZCBpbnRlZ2VycywgYmVjYXVzZSBvdmVyZmxvdyBhcml0aG1ldGljCi0JaXMgd2VsbCBkZWZpbmVkIGluIHRoaXMgY2FzZS4gIERvaW5nIHNvIHN1cHByZXNzZXMgcnVuLXRpbWUgZXJyb3JzCi0Jb2Ygc2FuaXRpemVycyB3aXRob3V0IGFkZGluZyBjb21wdXRhdGlvbmFsIG92ZXJoZWFkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIChPVkVSRkxPV19BRERfSU5ULAotCU9WRVJGTE9XX1NVQl9JTlQsIE9WRVJGTE9XX01VTF9JTlQsIE9WRVJGTE9XX0FERF9MT05HLAotCU9WRVJGTE9XX1NVQl9MT05HLCBPVkVSRkxPV19NVUxfTE9ORyk6IE5ldyBtYWNyb3MuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9Sb3VuZEZpeCwgRlRfQ2VpbEZpeCwgRlRfTWF0cml4X011bHRpcGx5LAotCUZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQsIEZUX1ZlY3Rvcl9UcmFuc2Zvcm1fU2NhbGVkLAotCWZ0X2Nvcm5lcl9vcmllbnRhdGlvbik6IFVzZSBuZXcgbWFjcm9zLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKTogVXNlIG5ldyBtYWNyb3MuCi0KLTIwMTctMDUtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCAoRkxPQVRfVE9fRklYRUQpOiBSZW1vdmUuCi0KLQlUaGlzIG1hY3JvIGlzIG5vdCB1c2VkLgotCi0yMDE3LTA1LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBzL2NmMl9mbG9hdFRvRml4ZWQvY2YyX2RvdWJsZVRvRml4ZWQvLgotCi0JVGhlIG5ldyBuYW1lIGJldHRlciBkZXNjcmliZXMgd2hhdCB0aGUgbWFjcm8gYWN0dWFsbHkgZG9lczsKLQlhZGRpdGlvbmFsbHksIHdlIGRvbid0IG5lZWQgYSB0cmFpbGluZyBgZicgZm9yIGxpdGVyYWxzICh0aGVyZSB3YXMKLQlvbmx5IGEgc2luZ2xlIHN1Y2ggaW5zdGFuY2UgaW4gdGhlIGNvZGUsIGJ1dCB0aGlzIGNhdXNlZCBhIGNsYW5nCi0Jd2FybmluZyBiZWNhdXNlIHRoZSBtYWNybyBpdHNlbGYgdXNlcyBgZG91YmxlJyBsaXRlcmFscykuCi0KLQkqIHNyYy9jZmYvY2YyYmx1ZXMuYywgc3JjL2NmZi9jZjJibHVlcy5oLCBzcmMvY2ZmL2NmMmZpeGVkLmgsCi0Jc3JjL2NmZi9jZjJmb250LmMsIHNyYy9jZmYvY2YyaGludHMuYzogVXBkYXRlZC4KLQotMjAxNy0wNS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IG5lZ2F0aW9uIG9mIElOVF9NSU4gYW5kIExPTkdfTUlOICgjNDYxNDkpLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTU9WRV9TSUdOKTogQWRkIGFyZ3VtZW50IHRvIHBhc3MgdW5zaWduZWQKLQl2YWx1ZSwgdG8gYmUgdXNlZCBhcyB0aGUgcmVzdWx0LgotCShGVF9NdWxEaXYsIEZUX011bERpdl9Ob19Sb3VuZCwgRlRfRGl2Rml4LCBGVF9NdWxGaXgsCi0JRlRfVmVjdG9yX05vcm1MZW4pOiBVcGRhdGVkLgotCi0yMDE3LTA1LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBoYW5kbGluZyBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgKCM1MTEyNykuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X3NldF9tbV9ibGVuZCk6IENvbXB1dGUgYWxsIGRlc2lnbgotCWNvb3JkaW5hdGVzIGlmIHdlIGhhdmUgdG8gY3JlYXRlIHRoZSBgYmxlbmRzLT5jb29yZCcgYXJyYXkuCi0JKFRUX0dldF9NTV9CbGVuZCwgVFRfR2V0X1Zhcl9EZXNpZ24pOiBTZWxlY3QgZGVmYXVsdCBpbnN0YW5jZQotCWNvb3JkaW5hdGVzIGlmIG5vIGluc3RhbmNlIGlzIHNlbGVjdGVkIHlldC4KLQotMjAxNy0wNS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZiwgcGNmXSBTdXBwb3J0IElTTzY0Ni4xOTkxLUlSViBjaGFyYWN0ZXIgZW5jb2RpbmcgKGFrYSBBU0NJSSkuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IE1hcmVrIEthxaHDrWsgPG1rYXNpa0ByZWRoYXQuY29tPiwgY2YuCi0KLQkgIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTQ1MTc5NQotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9GYWNlX0luaXQpLCBzcmMvcGNmL3BjZmRyaXZyLmMKLQkoUENGX0ZhY2VfSW5pdCk6IEltcGxlbWVudCBpdC4KLQotMjAxNy0wNS0yMCAgTmlrb2xhdXMgV2F4d2VpbGVyICA8bWFkaWdlbnNAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBBbHdheXMgdXNlIGludGVycHJldGVyIHYzNSBmb3IgQi9XIHJlbmRlcmluZyAoIzUxMDUxKS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfbG9hZGVyX2luaXQpCi0JW1RUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMXTogQWRqdXN0Ci0JYHN1YnBpeGVsX2hpbnRpbmdfbGVhbicsIGBncmF5c2NhbGVfY2xlYXJ0eXBlJywgYW5kCi0JYHZlcnRpY2FsX2xjZF9sZWFuJyBhY2NvcmRpbmdseS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19HRVRJTkZPKTogVXBkYXRlZC4KLQkoVFRfUnVuSW5zKTogVXBkYXRlIGBiYWNrd2FyZF9jb21wYXRpYmlsaXR5JyBmbGFnLgotCi0yMDE3LTA1LTIwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBJbXBsZW1lbnQgbWluaW1hbCBkeW5hbWljIHBhZGRpbmcgZm9yIExDRCBmaWx0ZXJpbmcuCi0KLQlFeHRyYSBiaXRtYXAgcGFkZGluZyBmb3IgTENEIGZpbHRlcmluZyBkZXBlbmRzIG9uIHRoZSBmaWx0ZXIuICBUaGUKLQlkZWZhdWx0IDUtdGFwIGZpbHRlciBuZWVkcyAyIGV4dHJhIHN1YnBpeGVscy4gIFRoZSBsaWdodCAzLXRhcCBmaWx0ZXIKLQluZWVkcyBvbmx5IDEgZXh0cmEgc3VicGl4ZWwuICBUaGlzIHNwYWNlIGNvdWxkIGJlIGFscmVhZHkgYXZhaWxhYmxlCi0JZHVlIHRvIHJvdW5kaW5nLiAgSW4gb3JkZXIgdG8gb3B0aW1pemUgdGhlIHBhZGRpbmcsIHdlIG5vdyBleHBhbmQKLQlDQm94IGZvciB0aGUgZ2l2ZW4gZmlsdGVyIHdlaWdodHMgYmVmb3JlIHJvdW5kaW5nLgotCi0JVGhpcyBjaGFuZ2UgYnJlYWtlcyBjdXJyZW50IFNraWEgKGFuZCBGaXJlZm94KS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfTGlicmFyeVJlYykKLQlbRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkddOiBSZW1vdmUgYGxjZF9leHRyYScgZmllbGQuCi0KLQkqIHNyYy9iYXNlL2Z0bGNkZmlsLmMgKEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cywKLQlGVF9MaWJyYXJ5X1NldExjZEZpbHRlcik6IFJlbW92ZSBgbGNkX2V4dHJhJyBpbml0aWFsaXphdGlvbnMuCi0KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogSW1wbGVtZW50IGR5bWFuaWMKLQlMQ0QgcGFkZGluZy4KLQotMjAxNy0wNS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFJldHVybiBwcm9wZXIgc2NhbGluZyB2YWx1ZXMgZm9yIFNCSVggYml0bWFwcy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgSGluLVRhayBMZXVuZyA8aHRsMTBAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcyk6IEltcGxlbWVudCBpdC4KLQotMjAxNy0wNS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggZXJyb3IgaGFuZGxpbmcgZm9yIGVtYmVkZGVkIGJpdG1hcHMuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEhpbi1UYWsgTGV1bmcgPGh0bDEwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfR2x5cGgpCi0JW1RUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQU106IEhhbmRsZSBlcnJvciBpZiBmb250IGlzIG5vdAotCXNjYWxhYmxlLgotCi0yMDE3LTA1LTE1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYXV0b2ZpdF0gTWFrZSBhdXRvaGludCB3YXJwaW5nIE5PUk1BTCBvcHRpb24uCi0KLQlUaGlzIG1vdmVzIHdhcnBpbmcgb3B0aW9uIGZyb20gTElHSFQgdG8gTk9STUFMIG1vZGUuICBUaGlzIG1ha2VzIExJR0hUCi0JdHJ1bHkgdm9pZCBvZiBoaW50aW5nIGluIHgtZGlyZWN0aW9uLCB3aXRoIGxlZnQgc2lkZSBiZWFyaW5nIG5ldmVyCi0JY2hhbmdlZCBhbmQgcmlnaHQgc2lkZSBiZWFyaW5nIG9ubHkgYWx0ZXJlZCBieSBhZHZhbmNlIHJvdW5kaW5nLgotCVRoZXJlZm9yZSwgTElHSFQgaXMgbm93IHJlYWR5IHRvIHJldHVybiBmcmFjdGlvbmFsIGFkdmFuY2UuICBBcyBhCi0JTk9STUFMIG9wdGlvbiwgd2FycGluZyBzdWJzdGl0dXRlcyBub3JtYWwgaGludGluZy4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX2hpbnRzX2FwcGx5KTogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfYXBwbHkpOiBVcGRhdGVkLgotCSogc3JjL2F1dG9maXQvYWZsYXRpbjIuYyAoYWZfbGF0aW4yX2hpbnRzX2FwcGx5KTogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZ2x5cGgpOiBIYW5kbGUgd2FycGluZwotCXBoYW50b20gcG9pbnRzIGFzIG5vcm1hbC4KLQotMjAxNy0wNS0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmVtb3ZlIHJlbW5hbnRzIG9mIHJhc3RlciBwb29sLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9MaWJyYXJ5UmVjKTogUmVtb3ZlCi0JYHJhc3Rlcl9wb29sJyBhbmQgYHJhc3Rlcl9wb29sX3NpemUnIGZpZWxkcy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX05ld19MaWJyYXJ5KSwgc3JjL3Jhc3Rlci9mdHJlbmQxLmMKLQkoZnRfcmFzdGVyMV9pbml0KSwgc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfaW5pdCk6IFVwZGF0ZWQuCi0KLTIwMTctMDUtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjggcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItOCcuCi0KLQkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjguCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLQkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwgYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDUvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92YzIwMDgvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbDogcy8yLjcuMS8yLjgvLCBzLzI3MS8yOC8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfTUlOT1IpOiBTZXQgdG8gOC4KLQkoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gMC4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDIwOjA6MTQuCi0JKiBDTWFrZUxpc3RzLnR4dCAoVkVSU0lPTl9NSU5PUik6IFNldCB0byA4LgotCShWRVJTSU9OX1BBVENIKTogU2V0IHRvIDAuCi0KLTIwMTctMDUtMTIgIEhpbi1UYWsgTGV1bmcgIDxodGwxMEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0KLQlGaXggYEZUX1VJTlRfVE9fUE9JTlRFUicgbWFjcm8gZm9yIFdpbmRvd3MuCi0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluLCBidWlsZHMvdm1zL2Z0Y29uZmlnLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCAoRlRfVUlOVF9UT19QT0lOVEVSKSBbX1dJTjY0XToKLQlGaXggZGVmaW5pdGlvbi4KLQotMjAxNy0wNS0xMSAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgQ2hha21hIHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBDaGFrbWEuCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgQ2hha21hIHN0YW5kYXJkIGNoYXJhY3Rlci4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIENoYWttYSBkYXRhLgotCi0yMDE3LTA1LTEwICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZwotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBLYXlhaCBMaSBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgS2F5YWggTGkuCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgS2F5YWggTGkgc3RhbmRhcmQgY2hhcmFjdGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgS2F5YWggTGkgZGF0YS4KLQotMjAxNy0wNS0xMCAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgQmFtdW0gc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIEJhbXVtLgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIEJhbXVtIHN0YW5kYXJkIGNoYXJhY3Rlci4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIEJhbXVtIGRhdGEuCi0KLTIwMTctMDUtMTAgIFNhc2NoYSBCcmF3ZXIgIDxzYXNjaGFAZ29vZ2xlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnCi0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIFNhdXJhc2h0cmEgc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIFNhdXJhc2h0cmEuCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgU2F1cmFzaHRyYSBzdGFuZGFyZCBjaGFyYWN0ZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMsIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IEFkZCBTYXVyYXNodHJhCi0JZGF0YS4KLQotMjAxNy0wNS0xMCAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgQnVoaWQgc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIEJ1aGlkLgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIEJ1aGlkIHN0YW5kYXJkIGNoYXJhY3Rlci4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIEJ1aGlkIGRhdGEuCi0KLTIwMTctMDUtMDggIFNhc2NoYSBCcmF3ZXIgIDxzYXNjaGFAZ29vZ2xlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnCi0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIFNoYXZpYW4gc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIFNoYXZpYW4uCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgU2hhdmlhbiBzdGFuZGFyZCBjaGFyYWN0ZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMsIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IEFkZCBTaGF2aWFuIGRhdGEuCi0KLTIwMTctMDUtMDggIFNhc2NoYSBCcmF3ZXIgIDxzYXNjaGFAZ29vZ2xlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnCi0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIFZhaSBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgVmFpLgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIFZhaSBzdGFuZGFyZCBjaGFyYWN0ZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMsIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IEFkZCBWYWkgZGF0YS4KLQotMjAxNy0wNS0wOCAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgT3NtYW55YSBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgT3NtYW55YS4KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBPc21hbnlhIHN0YW5kYXJkIGNoYXJhY3Rlci4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIE9zbWFueWEgZGF0YS4KLQotMjAxNy0wNS0wOCAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgQ29wdGljIHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBDb3B0aWMuCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgQ29wdGljIHN0YW5kYXJkIGNoYXJhY3Rlci4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIENvcHRpYyBkYXRhLgotCi0yMDE3LTA1LTA4ICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZwotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBDYXJpYW4gc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIENhcmlhbi4KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBDYXJpYW4gc3RhbmRhcmQgY2hhcmFjdGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgQ2FyaWFuIGRhdGEuCi0KLTIwMTctMDUtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQWRkIHRyaWNreSBmb250IGBERkdpcmwtVzYtV0lOLUJGJyAoZnJvbSBEeW5hbGFiKS4KLQotCVJlcG9ydGVkIGJ5IFJveSBUYW0gPHJveXRhbUBnbWFpbC5jb20+LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2NoZWNrX3RyaWNreW5lc3NfZmFtaWx5KTogSW1wbGVtZW50IGl0LgotCi0yMDE3LTA1LTA3ICBSb3kgVGFtICA8cm95dGFtQGdtYWlsLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBNb3JlIHRyaWNreSBmb250cyAobWFpbmx5IGZyb20gRHluYWxhYikuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfY2hlY2tfdHJpY2t5bmVzc19mYW1pbHksCi0JdHRfY2hlY2tfdHJpY2t5bmVzc19zZm50X2lkcyk6IEFkZCB0aGVtLgotCi0yMDE3LTA1LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCB0cmlja3kgZm9udCBgRExDSGF5TWVkaXVtJyAoZnJvbSBEeW5hbGFiKS4KLQotCVJlcG9ydGVkIGJ5IFJveSBUYW0gPHJveXRhbUBnbWFpbC5jb20+LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2NoZWNrX3RyaWNreW5lc3NfZmFtaWx5KTogSW1wbGVtZW50IGl0LgotCi0yMDE3LTA1LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqLyo6IHMvYmFja3dhcmRzIGNvbXBhdGliaWxpdHkvYmFja3dhcmQgY29tcGF0aWJpbGl0eS8uCi0KLTIwMTctMDUtMDMgIFNhc2NoYSBCcmF3ZXIgIDxzYXNjaGFAZ29vZ2xlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnCi0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIFVuaWZpZWQgQ2FuYWRpYW4gU3lsbGFiaWNzIHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBVbmlmaWVkIENhbmFkaWFuCi0JU3lsbGFiaWNzLgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIFVuaWZpZWQgQ2FuYWRpYW4gU3lsbGFiaWNzIHN0YW5kYXJkCi0JY2hhcmFjdGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgVW5pZmllZAotCUNhbmFkaWFuIFN5bGxhYmljcyBkYXRhLgotCi0yMDE3LTA1LTAzICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBZGQgYmx1ZS16b25lIHN1cHBvcnQgZm9yIFN1bmRhbmVzZSBzY3JpcHQuCi0KLQlUaGlzIGVzc2VudGlhbGx5IG1vdmVzIHRoZSBTdW5kYW5lc2Ugc2NyaXB0IGZyb20gdGhlIGBJbmRpYycgaGludGVyCi0JdG8gdGhlIGBMYXRpbicgaGludGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIFN1bmRhbmVzZS4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIFN1bmRhbmVzZSBzdGFuZGFyZCBjaGFyYWN0ZXIgYW5kIG1vdmUKLQlkYXRhIG91dCBvZiBBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBNb3ZlIFN1bmRhbmVzZSBkYXRhIG91dCBvZgotCUFGX0NPTkZJR19PUFRJT05fSU5ESUMgYmxvY2suCi0KLQkqIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IFVwZGF0ZSBTdW5kYW5lc2UgZGF0YTsgaW4gcGFydGljdWxhciwgdXNlCi0JQUZfV1JJVElOR19TWVNURU1fTEFUSU4uCi0KLTIwMTctMDUtMDMgIFNhc2NoYSBCcmF3ZXIgIDxzYXNjaGFAZ29vZ2xlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnCi0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIEF2ZXN0YW4gc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIEF2ZXN0YW4uCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgQXZlc3RhbiBzdGFuZGFyZCBjaGFyYWN0ZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMsIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IEFkZCBBdmVzdGFuIGRhdGEuCi0KLTIwMTctMDUtMDIgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW3RydWV0eXBlXSBNYWtlIGBJVVAnIGd2YXIgZGVsdGFzIGRvIHRoZSBzYW1lIGFzIEFwcGxlICgjNTA4MzIpLgotCi0JV2hlbiBwb2ludHMgYXJlIG5vdCB0b3VjaGVkIGJ5IGd2YXIgaW50ZXJwb2xhdGlvbiBkZWx0YXMsIEZyZWVUeXBlCi0JZ2F2ZSBhIHNsaWdodGx5IGRpZmZlcmVudCByZXN1bHQgdGhhbiBBcHBsZSdzIENvcmVUZXh0LgotCi0JVGhlIE9wZW5UeXBlIHdvcmtpbmcgZ3JvdXAgd2lsbCB1cGRhdGUgdGhlIHNwZWNpZmljYXRpb24gdG8gZG9jdW1lbnQKLQl0aGUgZm9sbG93aW5nIGJlaGF2aW91cjogSWYgdGhlIHR3byBwb2ludHMgd2l0aCBkZWx0YXMgdG8gdGhlIGBsZWZ0JwotCWFuZCBgcmlnaHQnIG9mIHRoZSB1bnRvdWNoZWQgcG9pbnQgaGF2ZSB0aGUgc2FtZSBjb29yZGluYXRlLCB0aGVuCi0JdGhlIGluZmVycmVkIGRlbHRhIGZvciB0aGUgdW50b3VjaGVkIHBvaW50IHNob3VsZCBiZSB6ZXJvLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9kZWx0YV9pbnRlcnBvbGF0ZSk6IEltcGxlbWVudCBuZXcKLQliZWhhdmlvdXIuCi0KLTIwMTctMDUtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBSZW1vdmUgYHNsaWdodCcgYXV0by1oaW50IG1vZGUgYWdhaW4uCi0KLQlBIHBvbGwgb24gZnJlZXR5cGUtZGV2ZWwgZmF2b3VyZWQgY2hhbmdlcyBkaXJlY3RseSBhcHBsaWVkIHRvCi0JYGxpZ2h0Jy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9MT0FEX1RBUkdFVF9TTElHSFQsCi0JRlRfUkVOREVSX01PREVfU0xJR0hUKTogUmVtb3ZlZC4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX2hpbnRzX2luaXQpLCBzcmMvYXV0b2ZpdC9hZmxhdGluLmMKLQkoYWZfbGF0aW5faGludHNfaW5pdCksIHNyYy9hdXRvZml0L2FmbGF0aW4yLmMKLQkoYWZfbGF0aW4yX2hpbnRzX2luaXQpOiBSZXZlcnQgY2hhbmdlIGZyb20gMjAxNy0wNC0yMi4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZ2x5cGgpIFJlbW92ZSByZWZlcmVuY2VzIHRvCi0JRlRfUkVOREVSX01PREVfU0xJR0hULgotCVtBRl9DT05GSUdfT1BUSU9OX1RUX1NJWkVfTUVUUklDU106IEVuYWJsZSBUcnVlVHlwZS1saWtlIG1ldHJpY3MKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLQkqIHNyYy9iYXNlL2Z0YWR2YW5jLmMgKExPQURfQURWQU5DRV9GQVNUX0NIRUNLKTogUmV2ZXJ0IGNoYW5nZSBmcm9tCi0JMjAxNy0wNC0yMi4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBSZXZlcnQgY2hhbmdlIGZyb20gMjAxNy0wNC0yMi4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uYyAocHNfaGludHNfYXBwbHkpOiBSZXZlcnQgY2hhbmdlIGZyb20KLQkyMDE3LTA0LTIyLgotCi0JKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXIpOiBSZXZlcnQgY2hhbmdlIGZyb20KLQkyMDE3LTA0LTIyLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTctMDQtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggbWV0cmljcyBjb21wdXRhdGlvbi4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTWFya3VzIFRyaXBwZWxzZG9yZiA8bWFya3VzQHRyaXBwZWxzZG9yZi5kZT4gYW5kCi0JTmlrb2xhdXMgV2F4d2VpbGVyIDxtYWRpZ2Vuc0BnbWFpbC5jb20+LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfUmVxdWVzdF9TaXplKTogVHJpZ2dlciByZWNvbXB1dGF0aW9uIG9mCi0JYXV0by1oaW50ZXIgbWV0cmljcy4gIFdpdGhvdXQgdGhpcyBjaGFuZ2UsIG11bHRpcGxlIHNpemUgY2hhbmdpbmcKLQljYWxscyBmb3IgYSBzaW5nbGUgZmFjZSBmYWlsLgotCi0yMDE3LTA0LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9zaXplX3JlcXVlc3QpOiBQcm9wZXJseSBjaGVjayBgZXJyb3InLgotCi0JUmVwb3J0ZWQgYnkgRWFybmVzdGx5IDx6aWJlb25AZ29vZ2xlbWFpbC5jb20+IGluCi0KLQkgIGh0dHA6Ly9saXN0cy5ub25nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS8yMDE3LTA0L21zZzAwMDMxLmh0bWwKLQotMjAxNy0wNC0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSW50cm9kdWNlIEFGX0NPTkZJR19PUFRJT05fVFRfU0laRV9NRVRSSUNTIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKEFGX0NPTkZJR19PUFRJT05fVFRfU0laRV9NRVRSSUNTKTogTmV3IG9wdGlvbiwgY29tbWVudGVkIG91dCBieQotCWRlZmF1bHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2dseXBoKTogVXNlCi0JQUZfQ09ORklHX09QVElPTl9UVF9TSVpFX01FVFJJQ1MgdG8gZ3VhcmQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZS4KLQotMjAxNy0wNC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX1JlbmRlcl9Nb2RlKTogRml4IG9yZGVyLgotCi0JVGhpcyByZXRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0KLQlOb3RlZCBieSBBbGV4ZWkuCi0KLTIwMTctMDQtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRG8gbGluZWFyIHNjYWxpbmcgZm9yIEZUX0xPQURfTk9fSElOVElORyAoIzUwNDcwKS4KLQotCSogc3JjL3RydWV0eXBlL3R0b2JzLmggKFRUX1NpemVSZWMpOiBBZGQgZmllbGQgYGhpbnRlZF9tZXRyaWNzJyB0bwotCWhvbGQgaGludGVkIG1ldHJpY3MuCi0JTWFrZSBgbWV0cmljcycgYSBwb2ludGVyIHNvIHRoYXQgYHR0X2dseXBoX2xvYWQnIGNhbiBlYXNpbHkgc3dpdGNoCi0JYmV0d2VlbiBtZXRyaWNzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfc2l6ZV9yZXF1ZXN0KTogVXBkYXRlZC4KLQkodHRfZ2x5cGhfbG9hZCk6IFVzZSB0b3AtbGV2ZWwgbWV0cmljcyBpZiBGVF9MT0FEX05PX0hJTlRJTkcgaXMKLQl1c2VkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9IaW50X0dseXBoLCBUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwKLQlUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQsIGxvYWRfdHJ1ZXR5cGVfZ2x5cGgsCi0JY29tcHV0ZV9nbHlwaF9tZXRyaWNzLCBUVF9Mb2FkX0dseXBoKTogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX0xvYWRfQ29udGV4dCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfc2l6ZV9yZXNldCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5jIChzcGhfc2V0X3R3ZWFrcyk6IFVwZGF0ZWQuCi0KLTIwMTctMDQtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBuZXcgYHNsaWdodCcgYXV0by1oaW50aW5nIG1vZGUuCi0KLQlUaGlzIG1vZGUgdXNlcyBmcmFjdGlvbmFsIGFkdmFuY2Ugd2lkdGhzIGFuZCBkb2Vzbid0IHNjYWxlIGdseXBocwotCWhvcml6b250YWxseSwgb25seSBhcHBseWluZyB2ZXJ0aWNhbCBzY2FsaW5nIGFuZCBoaW50aW5nLgotCi0JQXQgdGhlIHNhbWUgdGltZSwgdGhlIGJlaGF2aW91ciBvZiB0aGUgYGxpZ2h0JyBhdXRvLWhpbnRlciBnZXRzCi0JcmVzdG9yZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IEJvdGggdmVydGljYWwgYW5kIGhvcml6b250YWwKLQlzY2FsaW5nIGlzIGFnYWluIGJhc2VkIG9uIHJvdW5kZWQgbWV0cmljcyB2YWx1ZXMgKHRoaXMgd2FzIGNoYW5nZWQKLQlpbiBhIGNvbW1pdCBmcm9tIDIwMTctMDMtMzAgYXMgYSBzaWRlIGVmZmVjdCkuICBUbyBiZSBtb3JlIHByZWNpc2UsCi0JdGhlIGJlaGF2aW91ciBpcyByZXN0b3JlZCBmb3IgVHJ1ZVR5cGUgZm9udHMgb25seTsgZm9yIG90aGVyIGZvbnQKLQlmb3JtYXRzIGxpa2UgVHlwZSAxLCB0aGlzIGlzIGEgbmV3IGZlYXR1cmUgb2YgdGhlIGBsaWdodCcgaGludGluZwotCW1vZGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfTE9BRF9UQVJHRVRfU0xJR0hUKTogTmV3IG1hY3JvLgotCShGVF9SRU5ERVJfTU9ERV9TTElHSFQpOiBOZXcgcmVuZGVyIG1vZGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX1NpemVfSW50ZXJuYWxSZWMpOiBBZGQKLQlgYXV0b2hpbnRfbW9kZScgYW5kIGBhdXRvaGludF9tZXRyaWNzJyBmaWVsZHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19oaW50c19pbml0KSwgc3JjL2F1dG9maXQvYWZsYXRpbi5jCi0JKGFmX2xhdGluX2hpbnRzX2luaXQpLCBzcmMvYXV0b2ZpdC9hZmxhdGluMiAoYWZfbGF0aW4yX2hpbnRzX2luaXQpOgotCVVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9lbWJvbGRlbl9nbHlwaF9pbl9zbG90KTogVXNlCi0JYGF1dG9oaW50X21ldHJpY3MnLgotCShhZl9sb2FkZXJfbG9hZF9nbHlwaCk6IHMvaW50ZXJuYWwvc2xvdF9pbnRlcm5hbC8uCi0JSW5pdGlhbGl6ZSBgYXV0b2hpbnRfbWV0cmljcycgYW5kIGBhdXRvaGludF9tb2RlJyBkZXBlbmRpbmcgb24KLQljdXJyZW50IGF1dG8taGludCBtb2RlLgotCVVzZSBgYXV0b2hpbnRfbWV0cmljcycuCi0JVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRhZHZhbmMuYyAoTE9BRF9BRFZBTkNFX0ZBU1RfQ0hFQ0spOiBVcGRhdGVkLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IFVwZGF0ZWQuCi0JKEZUX05ld19TaXplKTogQWxsb2NhdGUgYGludGVybmFsJyBvYmplY3QuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmMgKHBzX2hpbnRzX2FwcGx5KTogVXBkYXRlZC4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyKTogVXBkYXRlZC4KLQotMjAxNy0wNC0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSW50cm9kdWNlIGBGVF9TaXplX0ludGVybmFsUmVjJyBzdHJ1Y3R1cmUuCi0KLQlXZSBhcmUgZ29pbmcgdG8gZXh0ZW5kIHRoaXMgbGF0ZXIgb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX1NpemVfSW50ZXJuYWxSZWMpOiBOZXcKLQlzdHJ1Y3R1cmUgd2l0aCBhIHNpbmdsZSBmaWVsZCBgbW9kdWxlX2RhdGEnLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTmV3X1NpemUpOiBBbGxvY2F0ZSBgaW50ZXJuYWwnIGZpZWxkIG9mCi0JYEZUX1NpemUnIHN0cnVjdHVyZS4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfYnVpbGRlcl9pbml0LCBjZmZfZGVjb2Rlcl9wcmVwYXJlKTogVXNlCi0JYHNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YScgaW5zdGVhZCBvZiBgc2l6ZS0+aW50ZXJuYWwnLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX3NpemVfZG9uZSk6IERlYWxsb2NhdGUgYG1vZHVsZV9kYXRhJy4KLQkoY2ZmX3NpemVfaW5pdCwgY2ZmX3NpemVfc2VsZWN0LCBjZmZfc2l6ZV9yZXF1ZXN0KTogVXNlCi0JYHNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YScgaW5zdGVhZCBvZiBgc2l6ZS0+aW50ZXJuYWwnLgotCi0JKiBzcmMvY2lmL2NpZG9ianMuYyAoY2lkX3NpemVfZG9uZSwgY2lkX3NpemVfaW5pdCwKLQljaWRfc2l6ZV9yZXF1ZXN0KTogVXNlIGBzaXplLT5pbnRlcm5hbC0+bW9kdWxlX2RhdGEnIGluc3RlYWQgb2YKLQlgc2l6ZS0+aW50ZXJuYWwnLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHQxX2J1aWxkZXJfaW5pKTogVXNlCi0JYHNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YScgaW5zdGVhZCBvZiBgc2l6ZS0+aW50ZXJuYWwnLgotCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX1NpemVfRG9uZSwgVDFfU2l6ZV9Jbml0LCBUMV9TaXplX1JlcXVlc3QpOgotCVVzZSBgc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhJyBpbnN0ZWFkIG9mIGBzaXplLT5pbnRlcm5hbCcuCi0KLTIwMTctMDQtMjEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5oOiBSZW1vdmUgdW51c2VkIGd1YXJkcyBhbmQgZGVjbGFyYXRpb24uCi0KLTIwMTctMDQtMTYgIEhpbi1UYWsgTGV1bmcgIDxodGwxMEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0KLQlGaXggdHJhY2luZyBtZXNzYWdlcy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJbmRleCwKLQlGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0LCBGVF9GYWNlX0dldFZhcmlhbnRzT2ZDaGFyKTogUHJpbnQKLQljb3JyZWN0IGZ1bmN0aW9uIG5hbWUuCi0KLTIwMTctMDQtMDggIFNhc2NoYSBCcmF3ZXIgIDxzYXNjaGFAZ29vZ2xlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnCi0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIE9sZCBUdXJraWMgc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIE9sZCBUdXJraWMuCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgT2xkIFR1cmtpYyBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgT2xkIFR1cmtpYyBkYXRhLgotCi0yMDE3LTA0LTA4ICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZwotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBHb3RoaWMgc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIEdvdGhpYy4KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBHb3RoaWMgc3RhbmRhcmQgY2hhcmFjdGVycy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIEdvdGhpYyBkYXRhLgotCi0yMDE3LTA0LTA4ICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZwotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBDeXByaW90IHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBDeXByaW90LgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIEN5cHJpb3Qgc3RhbmRhcmQgY2hhcmFjdGVycy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIEN5cHJpb3QgZGF0YS4KLQotMjAxNy0wNC0wOCAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgRGVzZXJldCBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgRGVzZXJldC4KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBEZXNlcmV0IHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMsIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IEFkZCBEZXNlcmV0IGRhdGEuCi0KLTIwMTctMDQtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggaW52YWxpZCBjaGFyYWN0ZXIgcmFuZ2UgZGVzY3JpcHRpb24gKCM1MDc0NSkuCi0KLQlBbHNvIHJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTEwMzQKLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYyAoYWZfZ2xhZ19ub25iYXNlX3VuaXJhbmdlcyk6IEZpeCB0eXBvIGluCi0JcmVjZW50IGNvbW1pdC4KLQotMjAxNy0wNC0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Z0ZnV6emVyXSBGaXggY2xhbmcgd2FybmluZ3MuCi0KLQkqIHNyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYyAoTExWTUZ1enplclRlc3RPbmVJbnB1dCk6IEFkZAotCWNhc3RzLgotCi0yMDE3LTA0LTA2ICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZwotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBMaXN1IHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBMaXN1LgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIExpc3Ugc3RhbmRhcmQgY2hhcmFjdGVycy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIExpc3UgZGF0YS4KLQotMjAxNy0wNC0wNiAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgT3NhZ2Ugc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIE9zYWdlLgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIE9zYWdlIHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMsIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IEFkZCBPc2FnZSBkYXRhLgotCi0yMDE3LTA0LTA2ICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZwotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBHbGFnb2xpdGljIHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBHbGFnb2xpdGljLgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIEdsYWdvbGl0aWMgc3RhbmRhcmQgY2hhcmFjdGVycy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIEdsYWdvbGl0aWMgZGF0YS4KLQotMjAxNy0wNC0wNiAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgVGFpIFZpZXQgc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIFRhaSBWaWV0LgotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIFRhaSBWaWV0IHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMsIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IEFkZCBUYWkgVmlldCBkYXRhLgotCi0yMDE3LTA0LTA2ICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZwotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBUaWZpbmFnaCBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgVGlmaW5hZ2guCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgVGlmaW5hZ2ggc3RhbmRhcmQgY2hhcmFjdGVycy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIFRpZmluYWdoIGRhdGEuCi0KLTIwMTctMDQtMDYgIFNhc2NoYSBCcmF3ZXIgIDxzYXNjaGFAZ29vZ2xlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnCi0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIE4nS28gc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIE4nS28uCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgTidLbyBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgTidLbyBkYXRhLgotCi0yMDE3LTA0LTA2ICBTYXNjaGEgQnJhd2VyICA8c2FzY2hhQGdvb2dsZS5jb20+Ci0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIEFkbGFtIHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBBZGxhbS4KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBBZGxhbSBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgQWRsYW0gZGF0YS4KLQotMjAxNy0wNC0wNiAgU2FzY2hhIEJyYXdlciAgPHNhc2NoYUBnb29nbGUuY29tPgotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBPbCBDaGlraSBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgT2wgQ2hpa2kuCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgT2wgQ2hpa2kgc3RhbmRhcmQgY2hhcmFjdGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgT2wgQ2hpa2kgZGF0YS4KLQotMjAxNy0wNC0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBBdm9pZCByZWV4ZWN1dGlvbiBvZiBgZnBnbScgYW5kIGBwcmVwJyBpbiBjYXNlIG9mIGVycm9yLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTgxCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaCAoRlRfRXJyX0RFRl9Jbl9HbHlmX0J5dGVjb2RlKTogTmV3Ci0JZXJyb3IgY29kZS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19GREVGLCBJbnNfSURFRik6IFByb2hpYml0IGV4ZWN1dGlvbgotCW9mIHRoZXNlIHR3byBvcGNvZGVzIGluIGBnbHlmJyBieXRlY29kZS4KLQkoVFRfUnVuSW5zKTogRG9uJ3QgZW5mb3JjZSByZWV4ZWN1dGlvbiBvZiBgZnBnbScgYW5kIGBwcmVwJyBieXRlY29kZQotCWluIGNhc2Ugb2YgZXJyb3Igc2luY2UgZnVuY3Rpb24gdGFibGVzIGNhbiBubyBsb25nZXIgYmUgbW9kaWZpZWQKLQkoZHVlIHRvIHRoZSBjaGFuZ2VzIGluIGBJbnNfRkRFRicgYW5kIGBJbnNfSURFRicpLiAgVGhpcyBjaGFuZ2UgY2FuCi0JZW5vcm1vdXNseSBzcGVlZCB1cCBoYW5kbGluZyBvZiBicm9rZW4gZm9udHMuCi0KLTIwMTctMDQtMDIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVthdXRvZml0XSBEaXNhYmxlIG1ldHJpY3MgYWRqdXN0bWVudCBmb3IgYEZUX0xPQURfVEFSR0VUX0xDRCcuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfaW5pdCk6IFVwZGF0ZWQuCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jIChhZl9sYXRpbjJfaGludHNfaW5pdCk6IERpdHRvLgotCi0yMDE3LTA0LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmM6IEluY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ILgotCi0JT3RoZXJ3aXNlIEZUX1VJTlRfVE9fUE9JTlRFUiBtaWdodCBub3QgYmUgZGVmaW5lZC4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgQWxleGVpLgotCi0yMDE3LTAzLTMxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYXV0b2ZpdF0gRGlzYWJsZSBzdGVtIGFkanVzdG1lbnQgZm9yIGBGVF9MT0FEX1RBUkdFVF9MQ0QnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0xPQURfVEFSR0VUX0xDRCk6IERvY3VtZW50IGl0LgotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX2hpbnRzX2luaXQpOiBVcGRhdGVkLgotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19pbml0KTogRGl0dG8uCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jIChhZl9sYXRpbjJfaGludHNfaW5pdCk6IERpdHRvLgotCi0yMDE3LTAzLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfZm9udF9sb2FkKTogSW1wcm92ZSBmaXggZnJvbSAyMDE3LTAxLTA0LgotCi0JQWxsb3cgQ0ZGcyBjb250YWluaW5nIGEgc2luZ2xlIGZvbnQgdG8gaGF2ZSBhbiBlbXB0eSBmb250IG5hbWUuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IOW8teS/iuiKnSA8NDE4MDkyNjI1QHFxLmNvbT4gaW4KLQotCSAgaHR0cDovL2xpc3RzLm5vbmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTctMDMvbXNnMDAwNzQuaHRtbAotCi0yMDE3LTAzLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuaCAoQ0ZGMl9ERUZBVUxUX1NUQUNLKTogU2V0IHRvIDUxMyBhbHNvLgotCi0JUmVxdWVzdGVkIGJ5IERhdmUgQXJub2xkLgotCi0yMDE3LTAzLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBIVkFSIGFuZCBWVkFSIGhhbmRsaW5nICgjNTA2NzgpLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9odmFkdmFuY2VfYWRqdXN0KTogSGFuZGxlCi0JZ2x5cGggaW5kaWNlcyBsYXJnZXIgdGhhbiBgbWFwQ291bnQnIGFzIGRlc2NyaWJlZCBpbiB0aGUKLQlzcGVjaWZpY2F0aW9uLgotCi0yMDE3LTAzLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFsbG93IGxpbmVhciBzY2FsaW5nIGZvciB1bmhpbnRlZCByZW5kZXJpbmcgKCM1MDQ3MCkuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9zaXplX3JlcXVlc3QpOiBSZXZlcnQgY2hhbmdlIGZyb20KLQkyMDExLTA3LTE2OyB0aGUgaW50ZW5kZWQgbWV0cmljcyBmaXggc2VlbXMgbm93IHRvIGJlIGltcGxlbWVudGVkIGluCi0JYSBkaWZmZXJlbnQgd2F5LCBtYWtpbmcgdGhlIHBhdGNoIHVubmVjZXNzYXJ5LiAgTm90ZSB0aGF0IHRoaXMKLQljaGFuZ2Ugd2FzIHVzdWFsbHkgcGF0Y2hlZCBvdXQgYnkgYWxsIG1ham9yIEdOVS9MaW51eCBkaXN0cmlidXRpb25zCi0JZHVlIHRvIGhlYXZ5IHNpZGUgZWZmZWN0cy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoY29tcHV0ZV9nbHlwaF9tZXRyaWNzLCBUVF9Mb2FkX0dseXBoKToKLQlSZWZlciB0byB0aGUgbWV0cmljcyBvZiB0aGUgYFRUX1NpemUnIG9iamVjdC4KLQotMjAxNy0wMy0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggdGhpbmtvIHJlbGF0ZWQgdG8gUFMgbmFtZSBvZiBkZWZhdWx0IG5hbWVkIGluc3RhbmNlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9HZXRfTU1fVmFyKTogYHN0cmlkJyBhbmQgYHBzaWQnIGFyZQotCW5hbWUgSUQgdmFsdWVzLCBub3QgaW5kaWNlcyBpbnRvIHRoZSBhcnJheSBvZiBuYW1lIGVudHJpZXMuCi0KLTIwMTctMDMtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjaWQsIHRydWV0eXBlXSBEb24ndCB1c2UgYGluZGV4JyBhcyBhIHZhcmlhYmxlIG5hbWUuCi0KLQlBdCBsZWFzdCBvbiBGcmVlQlNEIHRoZXJlIGlzIGEgZ2xvYmFsIGRlY2xhcmF0aW9uIG9mIGBpbmRleCcgaW4gZmlsZQotCWAvdXNyL2luY2x1ZGUvc3RyaW5ncy5oJy4KLQotCSogc3JjL2NmZi9jZjJpbnRycC5jLCBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jOiBzL2luZGV4L2lkeC8gd2hlcmUKLQlhcHByb3ByaWF0ZS4KLQotMjAxNy0wMy0yNyAgV29qY2llY2ggTWFtcmFrICA8d21hbXJha0BnbWFpbC5jb20+Ci0KLQlbc2ZudF0gTWlub3IgaW1wcm92ZW1lbnQgZm9yIGhhbmRsaW5nIGtlcm4gdGFibGVzLgotCi0JKiBzcmMvc2ZudC90dGtlcm4uYyAodHRfZmFjZV9sb2FkX2tlcm4pOiBEb24ndCBjaGVjayBmb3IKLQljcm9zcy1zdHJlYW0ga2VybmluZyB0YWJsZXMgc2luY2Ugd2UgcmVqZWN0IGZvcm1hdCAyIHRhYmxlcyBsYXRlcgotCW9uIGFueXdheXMuCi0JTW9kaWZ5IGNvZGUgZm9yIGxpbWl0IHRlc3QuLi4KLQkodHRfZmFjZV9nZXRfa2VybmluZyk6IC4uLiB0byBhdm9pZCBhIGxpbWl0IHRlc3QgaGVyZS4KLQotMjAxNy0wMy0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JUmVwb3J0ZWQgYnkgQWxleGFuZGVyIEhlZGdlcyA8YWhlZGdlc0BzdHVkZW50LmV0aHouY2g+LgotCi0JKiBzcmMvcGNmL3BjZmRyaXZyLmMgKHBjZl9wcm9wZXJ0eV9zZXQsIHBjZl9wcm9wZXJ0eV9nZXQpOiBUYWcKLQlgcHJvcGVydHlfbmFtZScgd2l0aCBgRlRfVU5VU0VEJyB3aGVyZSBuZWNlc3NhcnkuCi0KLTIwMTctMDMtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jICh0MV9idWlsZGVyX2Nsb3NlX2NvbnRvdXIpOiBBZGQgc2FmZXR5IGd1YXJkLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTQxCi0KLTIwMTctMDMtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eF0gQmV0dGVyIHByb3RlY3QgYGZsZXgnIGhhbmRsaW5nLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTM1Ci0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxjYWxsb3RoZXJzdWJyPjogU2luY2UgdGhlcmUgaXMgbm90IGEgc2luZ2xlIGZsZXggb3BlcmF0b3IgYnV0IGEKLQlzZXJpZXMgb2Ygc3Vicm91dGluZSBjYWxscywgbWFsZm9ybWVkIGZvbnRzIGNhbiBjYWxsIGFyYml0cmFyeSBvdGhlcgotCW9wZXJhdG9ycyBhZnRlciB0aGUgc3RhcnQgb2YgYSBmbGV4LCBwb3NzaWJseSBhZGRpbmcgcG9pbnRzLiAgRm9yCi0JdGhpcyByZWFzb24gd2UgaGF2ZSB0byBjaGVjayB0aGUgYXZhaWxhYmxlIG51bWJlciBvZiBwb2ludHMgYmVmb3JlCi0JaW5zZXJ0aW5nIGEgcG9pbnQuCi0KLTIwMTctMDMtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBGaXggY2hlY2sgZm9yIGRlZmF1bHQgbmFtZWQgaW5zdGFuY2UuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IEEgYGZpeGVkJyBudW1iZXIgbmVlZHMgZm91cgotCWJ5dGVzLCBub3QgdHdvLi4uCi0KLTIwMTctMDMtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgTU0gZm9udHMgd29yayAoYWdhaW4pLgotCi0JKiBzcmMvYmFzZS9mdG1tLmMgKEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzLAotCUZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcywgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyk6IElnbm9yZQotCXJldHVybiB2YWx1ZSBvZiBgZnRfZmFjZV9nZXRfbXZhcl9zZXJ2aWNlJzsgaW5zdGVhZCwgY2hlY2sgd2hldGhlciBhCi0Jc2VydmljZSBpcyBhY3R1YWxseSByZXR1cm5lZC4KLQotMjAxNy0wMy0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBTb21lIHZhcmlhYmxlIHJlbmFtaW5ncy4KLQotCVRvbyBtdWNoIGxvY2FsIHZhcmlhYmxlcyBob2xkaW5nIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIHdlcmUgY2FsbGVkCi0JYG1ldHJpY3MnLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfc2l6ZV9zZWxlY3QpOiBzL21ldHJpY3Mvc2l6ZV9tZXRyaWNzLy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfZ2V0X21ldHJpY3NfaW5jcl9vdmVycmlkZXMsCi0JY29tcHV0ZV9nbHlwaF9tZXRyaWNzKTogcy9tZXRyaWNzL2luY3JfbWV0cmljcy8uCi0JKGxvYWRfc2JpdF9pbWFnZSk6IHMvbWV0cmljcy9zYml0X21ldHJpY3MvLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcnVuX2ZwZ20pOiBzL21ldHJpY3Mvc2l6ZV9tZXRyaWNzLy4KLQkodHRfc2l6ZV9pbml0X2J5dGVjb2RlKTogcy9tZXRyaWNzL3R0X21ldHJpY3MvLgotCSh0dF9zaXplX3Jlc2V0KTogcy9tZXRyaWNzL3NpemVfbWV0cmljcy8uCi0KLTIwMTctMDMtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBEb24ndCBhZGQgaW5zdGFuY2VzIHRvIG5vbi12YXJpYXRpb24gZm9udHMuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IEZpeCBpdC4KLQotMjAxNy0wMy0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9idWlsZGVyX2luaXQpOiBBZGQgc2FmZXR5IGd1YXJkICgjNTA1NzgpLgotCi0yMDE3LTAzLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlJbnRyb2R1Y2UgRlRfVUlOVF9UT19QT0lOVEVSIG1hY3JvICgjNTA1NjApLgotCi0JV2UgaGF2ZSB0byBtYWtlIGEgc2VwYXJhdGUgY2FzZSBmb3IgV2luZG93cyA2NCdzIExMUDY0IGRhdGEgbW9kZWwuCi0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluLCBidWlsZHMvdm1zL2Z0Y29uZmlnLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCAoRlRfVUlOVF9UT19QT0lOVEVSKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogVXNlIGl0LgotCi0yMDE3LTAzLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9SdW5JbnMpOiBBZGp1c3QgbG9vcCBjb3VudGVyICgjNTA1NzMpLgotCi0JVGhlIHByb2JsZW1hdGljIGZvbnQgdGhhdCBleGNlZWRzIHRoZSBvbGQgbGltaXQgaXMgTGF0by1SZWd1bGFyLAotCXZlcnNpb24gMi4wMDcsIGNvbnRhaW5pbmcgYnl0ZWNvZGUgZ2VuZXJhdGVkIGJ5IGEgYnVnZ3kgdmVyc2lvbiBvZgotCXR0ZmF1dG9oaW50LgotCi0yMDE3LTAzLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFub3RoZXIgbGltaXRhdGlvbiBmb3IgYnl0ZWNvZGUgbG9vcCBjb3VudCBtYXhpbXVtLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTAwCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9SdW5JbnMpOiBMaW1pdCBgbG9vcGNhbGxfY291bnRlcl9tYXgnCi0JYnkgbnVtYmVyIG9mIGdseXBocyBhbHNvLgotCi0yMDE3LTAzLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZnRmdXp6ZXJdIE1pbm9yIGltcHJvdmVtZW50LgotCi0JKiBzcmMvdG9vbHMvZnRmdXp6ZXIvZnRmdXp6ZXIuY2M6IERvbid0IHNldCBpbnRlcm1lZGlhdGUgYXhpcyBpZgotCWJpdG1hcCBzdHJpa2VzIGFyZSBhY3RpdmUuCi0KLTIwMTctMDMtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUltcHJvdmUgYG1ha2UgbXVsdGknLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jOiBHdWFyZCBmaWxlIHdpdGggRlRfT1BUSU9OX0FVVE9GSVQyLgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBHdWFyZCBtb3JlIHBhcnRzIG9mIHRoZSBmaWxlIHdpdGggRlRfTUFDSU5UT1NILgotCi0JKiBzcmMvcHNhdXgvYWZtcGFyc2UuYzogR3VhcmQgZmlsZSB3aXRoIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNLgotCi0JKiBzcmMvc2ZudC9wbmdzaGltLmM6IEd1YXJkIGZpbGUgd2l0aAotCVRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyBhbHNvLgotCi0JKiBzcmMvc2ZudC90dGJkZi5jOiBBdm9pZCBlbXB0eSBzb3VyY2UgZmlsZS4KLQkqIHNyYy9zZm50L3R0cG9zdC5jOiBHdWFyZCBmaWxlIHdpdGgKLQlUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMuCi0JKiBzcmMvc2ZudC90dHNiaXQuYzogR3VhcmQgZmlsZSB3aXRoCi0JVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jLCBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYzogQXZvaWQgZW1wdHkKLQlzb3VyY2UgZmlsZS4KLQotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4LmM6IEd1YXJkIGZpbGUgd2l0aAotCVRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiBhbHNvLgotCi0JKiBzcmMvdHlwZTEvdDFhZm0uYzogR3VhcmQgZmlsZSB3aXRoIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNLgotCi0JKiBzcmMvYXV0b2ZpdC9hdXRvZml0LmMsIHNyYy9iYXNlL2Z0YmFzZS5jLCBzcmMvY2FjaGUvZnRjYWNoZS5jLAotCXNyYy9jZmYvY2ZmLmMsIHNyYy9jaWQvdHlwZTFjaWQuYywgc3JjL2d4dmFsaWQvZ3h2YWxpZC5jLAotCXNyYy9wY2YvcGNmLmMsIHNyYy9wZnIvcGZyLmMsIHNyYy9wc2F1eC9wc2F1eC5jLAotCXNyYy9wc2hpbnRlci9wc2hpbnRlci5jLCBzcmMvcHNuYW1lcy9wc25hbWVzLmMsIHNyYy9yYXN0ZXIvcmFzdGVyLmMsCi0Jc3JjL3NmbnQvc2ZudC5jLCBzcmMvc21vb3RoL3Ntb290aC5jLCBzcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYywKLQlzcmMvdHlwZTEvdHlwZTEuYywgc3JjL3R5cGU0Mi90eXBlNDIuYzogUmVtb3ZlIGNvbmRpdGlvbmFsczsgc29ydAotCWVudHJpZXMuCi0KLTIwMTctMDMtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeGVzIGZvciBjb25kaXRpb25hbCBjb21waWxhdGlvbi4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYywgc3JjL2F1dG9maXQvYWZpbmRpYy5jOiBJbmNsdWRlIGBhZmNqay5oJwotCWVhcmxpZXIuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IFB1dCBgbWVtb3J5JyB2YXJpYWJsZSBpbnRvCi0JVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCBibG9jay4KLQkoc2ZudF9kb25lX2ZhY2UpOiBQcm90ZWN0IHNvbWUgY29kZSB3aXRoCi0JVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVC4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zYml4X2ltYWdlKTogUmVtb3ZlIGNvbXBpbGVyCi0Jd2FybmluZy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBQdXQgYHRtcCcgdmFyaWFibGUKLQlpbnRvIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiBibG9jay4KLQotCSh0dF9sb2FkZXJfaW5pdCk6IFB1dCBgZXJyb3InIHZhcmlhYmxlIGludG8KLQlUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgYmxvY2suCi0KLTIwMTctMDMtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBwcmVwcm9jZXNzb3Igd2FybmluZy4KLQotCSogZGV2ZWwvZnRvcHRpb24uaCwgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaDogVGVzdCB3aGV0aGVyCi0JVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HIGlzIGRlZmluZWQgYmVmb3JlIGNoZWNraW5nIGl0cwotCXZhbHVlLgotCi0yMDE3LTAzLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlgbWFrZSBtdWx0aScgZml4ZXM7IGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvYmFzZS9mdHNuYW1lcy5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0guCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIFtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogSW5jbHVkZQotCUZUX01VTFRJUExFX01BU1RFUlNfSCBhbmQgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0guCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgW1RUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlRdOiBJbmNsdWRlCi0JRlRfTVVMVElQTEVfTUFTVEVSU19IIGFuZCBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSC4KLQkoZ2V0X3dpbl9zdHJpbmcsIGdldF9hcHBsZV9zdHJpbmcpOiBJbml0aWFsaXplIGByZXN1bHQnLgotCi0yMDE3LTAzLTE3ICBEYXZlIEFybm9sZCA8ZGFybm9sZEBhZG9iZS5jb20+Ci0KLQlbY2ZmXSBGaXggcG90ZW50aWFsIGJ1Z3MgaW4gZGVmYXVsdCBORFYgZm9yIENGRjIuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfYmxlbmRfYnVpbGRfdmVjdG9yKTogRXhwbGljaXRseSBidWlsZCBibGVuZAotCXZlY3RvciB3aGVuIGBsZW5ORFYnIGlzIHplcm87IGRvbid0IHJlbHkgb24gemVyby1pbml0LgotCVNhdmUgYGxlbk5EVicgYXMgcGFydCBvZiBjYWNoZSBrZXkgZXZlbiB3aGVuIGBsZW5ORFYnIGlzIHplcm8uCi0KLTIwMTctMDMtMTcgIERhdmUgQXJub2xkIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCVtjZmZdIEZpeCBDRkYyIHN0YWNrIGFsbG9jYXRpb24uCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlcl9pbml0KSBhZGQgMSBmb3Igb3BlcmF0b3IuCi0KLTIwMTctMDMtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfZG9uZV9ibGVuZCk6IEZyZWUgYHZ2YXJfdGFibGUnLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9ODgzCi0KLTIwMTctMDMtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJlbW92ZSBjbGFuZyBjb21waWxlciB3YXJuaW5ncyAoIzUwNTQ4KS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpOiBNYWtlCi0JYHZhcl9wb3N0c2NyaXB0X3ByZWZpeF9sZW4nIHVuc2lnbmVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZndhcnAuYyAoYWZfd2FycGVyX2NvbXB1dGVfbGluZV9iZXN0KTogUmVtb3ZlCi0JcmVkdW5kYW50IGFzc2lnbm1lbnQuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfc3ViZm9udF9sb2FkKTogQWRkIGNhc3RzLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9ibGVuZCk6IFJlbW92ZSByZWR1bmRhbnQgYXNzaWdubWVudC4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoZm1peDMyLCBtdXJtdXJfaGFzaF8zXzEyOCk6IEFkZCBgc3RhdGljJwotCWtleXdvcmQuCi0JQWRkIGNhc3RzLgotCShmaXhlZDJmbG9hdCk6IEFkZCBjYXN0LgotCShzZm50X2dldF92YXJfcHNfbmFtZSk6IE1ha2UgYHAnIGFsd2F5cyBpbml0aWFsaXplZC4KLQlBZGQgY2FzdHMuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBBZGQgY2FzdHMuCi0KLTIwMTctMDMtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtmdGZ1enplcl0gTGltaXQgbnVtYmVyIG9mIHRlc3RlZCBmYWNlcyBhbmQgaW5zdGFuY2VzLgotCi0JVGhpcyBpcyBpbnNwaXJlZCBieSB0aGUgZGlzY3Vzc2lvbiBpbiBhbmQgYW5hbHlzaXMgb2YKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9ODU5Ci0KLQkqIHNyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYyAoTExWTUZ1enplclRlc3RPbmVJbnB1dCk6IFVzZSBvbmx5Ci0JdXAgdG8gMjAgZmFjZSBpbmRpY2VzLgotCVVzZSBvbmx5IHVwIHRvIDIwIGluc3RhbmNlIGluZGljZXMuCi0KLTIwMTctMDMtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2Z0ZnV6emVyL2Z0ZnV6emVyLmNjOiBJbXByb3ZlIHJlYWRhYmlsaXR5OyBmb3JtYXR0aW5nLgotCi0yMDE3LTAzLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSW1wbGVtZW50IFBTIG5hbWVzIGZvciBmb250IGluc3RhbmNlcyBbMy8zXS4KLQotCUV2ZXJ5dGhpbmcgaXMgZ3VhcmRlZCB3aXRoIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GYWNlUmVjKTogTmV3IGZpZWxkcwotCWB2YXJfcG9zdHNjcmlwdF9wcmVmaXgnIGFuZCBgdmFyX3Bvc3RzY3JpcHRfcHJlZml4X2xlbicuCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmM6IEluY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0guCi0JKHNmbnRfaXNfYWxwaGFudW1lcmljKTogTmV3IHdyYXBwZXJmdW5jdGlvbiBmb3IgYGZ0X2lzYWxudW0nLgotCShnZXRfd2luX3N0cmluZywgZ2V0X2FwcGxlX3N0cmluZyk6IFJlbW92ZSBgY29uc3QnIGZyb20gcmV0dXJuCi0JdmFsdWUuCi0JKE1BWF9WQUxVRV9ERVNDUklQVE9SX0xFTiwgTUFYX1BTX05BTUVfTEVOKTogTmV3IG1hY3Jvcy4KLQkoaGV4ZGlnaXRzKTogTmV3IGFycmF5LgotCShzZm50X2dldF92YXJfcHNfbmFtZSk6IE5ldyBmdW5jdGlvbiwgaW1wbGVtZW50aW5nIEFkb2JlIFRlY2hOb3RlCi0JNTkwMiB0byBjb25zdHJ1Y3QgYSBQUyBuYW1lIGZvciBhIHZhcmlhdGlvbiBmb250IGluc3RhbmNlLgotCShzZm50X2dldF9wc19uYW1lKTogQ2FsbCBgc2ZudF9nZXRfdmFyX3BzX25hbWUnIGZvciBmb250IGluc3RhbmNlcy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfZG9uZV9mYWNlKTogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfc2V0X21tX2JsZW5kKTogUmVzZXQKLQlgZmFjZS0+cG9zdHNjcmlwdF9uYW1lJyB0byB0cmlnZ2VyIHJlY2FsY3VsYXRpb24gZm9yIG5ldyBpbnN0YW5jZQotCXBhcmFtZXRlcnMuCi0KLTIwMTctMDMtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBJbXBsZW1lbnQgUFMgbmFtZXMgZm9yIGZvbnQgaW5zdGFuY2VzIFsyLzNdLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChmaXgyZmxvYXQpIFtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXToKLQlOZXcgZnVuY3Rpb24gdG8gZmluZCB0aGUgc2hvcnRlc3QgcmVwcmVzZW50YXRpb24gb2YgYSAxNi4xNgotCWZyYWN0aW9uYWwgbnVtYmVyLgotCi0yMDE3LTAzLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSW1wbGVtZW50IFBTIG5hbWVzIGZvciBmb250IGluc3RhbmNlcyBbMS8zXS4KLQotCUFkZCAxMjhiaXQgTXVybXVySGFzaCAzIGZ1bmN0aW9uLgotCi0JRXZlcnl0aGluZyBpcyBndWFyZGVkIHdpdGggVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVC4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoUk9UTDMyKTogTmV3IG1hY3JvLgotCShmbWl4MzIsIG11cm11cl9oYXNoXzNfMTI4KTogTmV3IGZ1bmN0aW9ucy4KLQotMjAxNy0wMy0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJZ25vcmUgaW52YWxpZCBNVkFSIHRhZ3MuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD04MzgKLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX2xvYWRfbXZhcik6IElnbm9yZSB2YWx1ZSBhbmQgZW1pdAotCXdhcm5pbmcgZm9yIGludmFsaWQgdGFncy4KLQkodHRfYXBwbHlfbXZhcik6IElnbm9yZSBpbnZhbGlkIHRhZ3MuCi0KLTIwMTctMDMtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gU3RvcmUgYW5kIHVzZSBkZXNpZ24gY29vcmRpbmF0ZXMgYWxzby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmggKEZUX0dldF9WYXJfQmxlbmRfRnVuYyk6Ci0JQWRkIGBub3JtYWxpemVkY29vcmRzJyBhcmd1bWVudC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuaCAoR1hfQmxlbmRSZWMpOiBBZGQgYGNvb3JkcycgZmllbGQgdG8gc3RvcmUKLQl0aGUgZGVzaWduIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLgotCVVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1NldF9NTV9CbGVuZCk6IE1vdmUgZnVuY3Rpb25hbGl0eSB0by4uLgotCSh0dF9zZXRfbW1fYmxlbmQpOiAuLi4gTmV3IGZ1bmN0aW9uLgotCUNvbnZlcnQgZGF0YSBpbiBgbm9ybWFsaXplZGNvb3JkcycgYXJyYXkgdG8gYGNvb3JkcycgYXJyYXkgb24KLQlkZW1hbmQuCi0JKFRUX1NldF9WYXJfRGVzaWduKTogU3RvcmUgYXJndW1lbnQgZGF0YSBpbiBgY29vcmRzJyBhcnJheS4KLQkoVFRfR2V0X1Zhcl9EZXNpZ24pOiBHZXQgZGF0YSBmcm9tIGBjb29yZHMnIGFycmF5LgotCSh0dF9nZXRfdmFyX2JsZW5kKTogVXBkYXRlZC4KLQkodHRfZG9uZV9ibGVuZCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jLCBzcmMvY2ZmL2NmZmxvYWQuaCAoY2ZmX2dldF92YXJfYmxlbmQpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmMmZ0LmMgKGNmMl9nZXROb3JtYWxpemVkVmVjdG9yKTogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBVcGRhdGVkLgotCi0yMDE3LTAzLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlzcmMvdHJ1ZXR5cGUvdHRneHZhci5bY2hdOiBzL2F2YXJfY2hlY2tlZC9hdmFyX2xvYWRlZC8uCi0KLTIwMTctMDMtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBBbm90aGVyIGZpeCBmb3IgYnVnZ3kgdmFyaWF0aW9uIGZvbnRzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NzU5Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IFdoaWxlIHNldHRpbmcgbnVtYmVyIG9mCi0JaW5zdGFuY2VzIHRvIHplcm8gZm9yIGBDRkYnIGZvbnRzIHRhYmxlLCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubwotCWBDRkYyJyBwcmVzZW50IGFsc28gKHdoaWNoIGdldHMgcHJpb3JpdHkpLgotCi0yMDE3LTAzLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSW1wcm92ZSBoYW5kbGluZyBmb3IgYnVnZ3kgdmFyaWF0aW9uIGZvbnRzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NzM4Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IFdoaWxlIHNldHRpbmcgbnVtYmVyIG9mCi0JaW5zdGFuY2VzIHRvIHplcm8gZm9yIGBDRkYnIGZvbnRzIHRhYmxlLCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubwotCWBnbHlmJyB0YWJsZSBwcmVzZW50IGFsc28gKHdoaWNoIGdldHMgcHJpb3JpdHkpLgotCi0yMDE3LTAzLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudCwgdHJ1ZXR5cGVdIEFsd2F5cyBwcm92aWRlIGRlZmF1bHQgaW5zdGFuY2UuCi0KLQlBcyBkb2N1bWVudGVkIGluIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLCBhbiBlbnRyeSBmb3IgdGhlCi0JZGVmYXVsdCBpbnN0YW5jZSBtYXkgYmUgb21pdHRlZCBpbiB0aGUgbmFtZWQgaW5zdGFuY2UgdGFibGUuICBJbgotCXBhcnRpY3VsYXIgdGhpcyBtZWFucyB0aGF0IGV2ZW4gaWYgdGhlcmUgaXMgbm8gbmFtZWQgaW5zdGFuY2UgdGFibGUKLQlpbiB0aGUgZm9udCB3ZSBhY3R1YWxseSBkbyBoYXZlIGEgbmFtZWQgaW5zdGFuY2UsIG5hbWVseSB0aGUgZGVmYXVsdAotCWluc3RhbmNlLgotCi0JRm9yIGNvbnNpc3RlbmN5LCB3ZSBhbHdheXMgd2FudCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpbiBvdXIgbGlzdCBvZgotCW5hbWVkIGluc3RhbmNlcy4gIElmIGl0IGlzIG1pc3NpbmcsIHdlIHRyeSB0byBzeW50aGVzaXplIGl0LgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9pbml0X2ZhY2UpOiBDaGVjayB3aGV0aGVyIHRoZSBkZWZhdWx0Ci0JaW5zdGFuY2UgaXMgaW4gdGhlIHRhYmxlIG9mIG5hbWVkIGluc3RhbmNlcy4gIE90aGVyd2lzZSBhZGp1c3QKLQludW1iZXIgb2YgaW5zdGFuY2VzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jOiBJbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ILgotCShUVF9HZXRfTU1fVmFyKTogVXNlIGBmYWNlLT5yb290LnN0eWxlX2ZsYWdzJyBhcyB0aGUgbnVtYmVyIG9mIG5hbWVkCi0JaW5zdGFuY2VzLgotCVN5dGhlc2l6ZSBhIG5hbWVkIGluc3RhbmNlIGVudHJ5IGlmIG5lY2Vzc2FyeS4KLQkodHRfZG9uZV9ibGVuZCk6IEZyZWUgYG5vcm1hbGl6ZWRfc3R5bGVjb29yZHMnLgotCi0yMDE3LTAzLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gUmVtb3ZlIHJlZHVuZGFudCBjb2RlLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9pbml0X2ZhY2UpOiBSZW1vdmUgc2Vjb25kIHRlc3QgZm9yCi0JYG51bV9pbnN0YW5jZXMnLCB3aGljaCB3aWxsIGFsd2F5cyBzdWNjZWVkLgotCi0yMDE3LTAzLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gQWRkIGBnZXRfbmFtZV9pZCcgc2VydmljZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggKFRUX0dldF9OYW1lX0lEX0Z1bmMpOiBOZXcKLQl0eXBlZGVmLgotCShTRk5UX0ludGVyZmFjZSk6IEFkZCBgZ2V0X25hbWVfaWQnIGZpZWxkLgotCShGVF9ERUZJTkVfU0ZOVF9JTlRFUkZBQ0UpOiBVcGRhdGVkLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZWFyY2hfbmFtZV9pZCk6IFJlbmFtZSB0by4uLgotCShzZm50X2dldF9uYW1lX2lkKTogLi4uIHRoaXMuCi0JKHNmbnRfZ2V0X3BzX25hbWUsIHNmbnRfaW50ZXJmYWNlKTogVWRwYXRlZC4KLQotMjAxNy0wMy0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBNYWtlIGBUVF9TZXRfTU1fQmxlbmQnIHNldCBuYW1lZCBpbnN0YW5jZSBpbmRleC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuaCAoR1hfQmxlbmQpOiBOZXcgYXJyYXkKLQlgbm9ybWFsaXplZF9zdHlsZWNvb3JkcycuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBBbGxvY2F0ZSBhbmQgZmlsbAotCWBub3JtYWxpemVkX3N0eWxlY29vcmRzJy4KLQkoVFRfU2V0X01NX0JsZW5kKTogQ2hlY2sgaW5zdGFuY2UgdHVwbGUgYW5kIGFkanVzdCBgZmFjZV9pbmRleCcKLQlhY2NvcmRpbmdseS4KLQotMjAxNy0wMy0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBTcGxpdCBvZmYgZGVzaWduZXIvbm9ybWFsaXplZCBjb252ZXJzaW9uIHJvdXRpbmVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9TZXRfVmFyX0Rlc2lnbik6IFNwbGl0IG9mZiBjb252ZXJzaW9uCi0JY29kZSBkZXNpZ25lci0+bm9ybWFsaXplZCBjb29yZGluYXRlcyB0by4uLgotCShmdF92YXJfdG9fbm9ybWFsaXplZCk6IC4uLiBOZXcgZnVuY3Rpb24uCi0JKFRUX0dldF9WYXJfRGVzaWduKTogU3BsaXQgb2ZmIGNvbnZlcnNpb24gY29kZSBub3JtYWxpemVkLT5kZXNpZ25lcgotCWNvb3JkaW5hdGVzIHRvLi4uCi0JKGZ0X3Zhcl90b19kZXNpZ24pOiAuLi4gTmV3IGZ1bmN0aW9uLgotCi0yMDE3LTAyLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRnVydGhlciBnZW5lcmFsaXplIGBzZm50X2dldF9wc19uYW1lJzsgcmVwb3J0IGludmFsaWQgZGF0YS4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9wc19tYXApOiBOZXcgYXJyYXkuCi0JKHNmbnRfaXNfcG9zdHNjcmlwdCk6IE5ldyBmdW5jdGlvbi4KLQkoY2hhcl90eXBlX2Z1bmMpOiBOZXcgdHlwZWRlZi4KLQkoZ2V0X3dpbl9zdHJpbmcsIGdldF9hcHBsZV9zdHJpbmcpOiBBZGQgYXJndW1lbnQgdG8gc3BlY2lmeQotCWNoYXJhY3RlciBjaGVja2luZyBmdW5jdGlvbi4KLQlBZGQgYXJndW1lbnQgd2hldGhlciBhcmd1bWVudCBjaGVja2luZyBmYWlsdXJlcyBzaG91bGQgYmUgcmVwb3J0ZWQuCi0JVXBkYXRlIGNhbGxlcnMuCi0JKHNlYXJjaF9uYW1lX2lkKTogRml4IHJldHVybiB2YWx1ZS4KLQotMjAxNy0wMi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFNwbGl0IG9mZiBhbm90aGVyIGJpdCBvZiBgc2ZudF9nZXRfcHNfbmFtZScuCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X3BzX25hbWUpOiBTcGxpdCBvZmYgc29tZQotCWZ1bmN0aW9uYWxpdHkgaW50by4uLgotCShzZWFyY2hfbmFtZV9pZCk6IC4uLiBOZXcgZnVuY3Rpb24uCi0KLTIwMTctMDItMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBNb2R1bGFyaXplIGBzZm50X2dldF9wc19uYW1lJy4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9nZXRfcHNfbmFtZSk6IFNwbGl0IG9mZiBzb21lCi0JZnVuY3Rpb25hbGl0eSBpbnRvLi4uCi0JKElTX1dJTiwgSVNfQVBQTEUpOiAuLi4gTmV3IG1hY3Jvcy4KLQkoZ2V0X3dpbl9zdHJpbmcsIGdldF9hcHBsZV9zdHJpbmcpOiAuLi4gTmV3IGZ1bmN0aW9ucy4KLQotMjAxNy0wMi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBNaW5vciBpbXByb3ZlbWVudC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgsCi0JbG9hZF90cnVldHlwZV9nbHlwaCk6IFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZXN0cy4KLQotMjAxNy0wMi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZSk6IHMvaXNDRkYyL2lzX2NmZjIvLgotCi0JRm9yIG9ydGhvZ29uYWxpdHkgd2l0aCBvdGhlciBzdHJ1Y3R1cmUgZmllbGQgbmFtZXMuCi0KLQlVcGRhdGUgYWxsIHVzZXJzLgotCi0yMDE3LTAyLTIyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2hsaW5lKTogSW1wcm92ZSBjb2RlLgotCi0yMDE3LTAyLTIwICBEb21pbmlrIFLDtnR0c2NoZXMgIDxkcm90dEBnb29nbGUuY29tPgotCi0JRml4IHNvbWUgYHR0bmFtZWlkLmgnIGVudHJpZXMgKCM1MDMxMykuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaDoKLQlzL1RUX01TX0xBTkdJRF9TUEFOSVNIX0lOVEVSTkFUSU9OQUxfU09SVC9UVF9NU19MQU5HSURfU1BBTklTSF9TUEFJTl9JTlRFUk5BVElPTkFMX1NPUlQvLAotCXMvVFRfTVNfTEFOR0lEX01PTkdPTElBTl9NT05HT0xJQV9NT05HT0xJQS9UVF9NU19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBX01PTkdPTElBTi8uCi0KLTIwMTctMDItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpbmlzaCBzdXBwb3J0IGZvciBgcmFuZG9tJyBvcGVyYXRvci4KLQotCSogc3JjL2NmZi9jZmZ0eXBlcy5oIChDRkZfU3ViRm9udFJlYyk6IEFkZCBgcmFuZG9tJyBmaWVsZC4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmM6IFVwZGF0ZWQuCi0JKGNmZl9kcml2ZXJfaW5pdCk6IEluaXRpYWxpemUgcmFuZG9tIHNlZWQgdmFsdWUuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfcmFuZG9tKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfc3ViZm9udF9sb2FkKTogQWRkIGBmYWNlJyBhcmd1bWVudC4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JSW5pdGlhbGl6ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIGEgcHJvcGVyIHNlZWQgdmFsdWUuCi0JKGNmZl9mb250X2xvYWQpOiBBZGQgYGZhY2UnIGFyZ3VtZW50LgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYyAoQ0YyX0ZJWE1FKTogUmVtb3ZlZC4KLQkoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9lc2NSQU5ET00+OiBJbXBsZW1lbnQgb3Bjb2RlLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogRG9uJ3QKLQlpbml0aWFsaXplIHJhbmRvbSBzZWVkIHZhbHVlLgotCTxjZmZfb3BfcmFuZG9tPjogVXNlIG5ldyByYW5kb20gc2VlZCBmcmFtZXdvcmsuCi0KLTIwMTctMDItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFNhbml0aXplIGBpbml0aWFsUmFuZG9tU2VlZCcuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfbG9hZF9wcml2YXRlX2RpY3QpOiBNYWtlCi0JYGluaXRpYWxfcmFuZG9tX3NlZWQnIHZhbHVlIGFsd2F5cyBwb3NpdGl2ZS4KLQotMjAxNy0wMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gSW50cm9kdWNlIGByYW5kb20tc2VlZCcgcHJvcGVydHkgKDIvMikuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBJbmNsdWRlIGBGVF9DRkZfRFJJVkVSX0gnLgotCShvcGVuX2ZhY2UpOiBJbml0aWFsaXplIGBmYWNlLT5pbnRlcm5hbC0+cmFuZG9tX3NlZWQnLgotCShGVF9GYWNlX1Byb3BlcnRpZXMpOiBIYW5kbGUgYEZUX1BBUkFNX1RBR19SQU5ET01fU0VFRCcuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3Byb3BlcnR5X3NldCk6IEhhbmRsZSBgcmFuZG9tLXNlZWQnCi0JcHJvcGVydHkuCi0KLTIwMTctMDItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEludHJvZHVjZSBgcmFuZG9tLXNlZWQnIHByb3BlcnR5ICgxLzIpLgotCi0JV2UgbmVlZCB0aGlzIGZvciBzdXBwb3J0IG9mIHRoZSBgcmFuZG9tJyBvcGVyYXRvci4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNmZmRydi5oIChGVF9QQVJBTV9UQUdfUkFORE9NX1NFRUQpOiBOZXcgbWFjcm8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0ZhY2VfSW50ZXJuYWxSZWMpOiBOZXcKLQlmaWVsZCBgcmFuZG9tX3NlZWQnLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuaCAoQ0ZGX0RyaXZlclJlYyk6IE5ldyBmaWVsZCBgcmFuZG9tX3NlZWQnLgotCi0yMDE3LTAyLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZW1vdmUgY2xhbmcgd2FybmluZ3MuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fc29ydF9ibHVlKTogQWRkIG1pc3NpbmcgYHN0YXRpYycKLQlrZXl3b3JkLgotCi0JKiBzcmMvYmFzZS9mdG1tLmMgKEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzLAotCUZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcywgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyk6Ci0JSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcy4KLQotMjAxNy0wMi0xNiAgTmlrb2xhdXMgV2F4d2VpbGVyICA8bWFkaWdlbnNAZ21haWwuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgZmFjZSBwcm9wZXJ0eSBmb3Igc3RlbSBkYXJrZW5pbmcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRhdXRvaC5oIChGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkcpOiBOZXcKLQltYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfRmFjZV9JbnRlcm5hbFJlYyk6IEFkZAotCWBub19zdGVtX2RhcmtlbmluZycgZmllbGQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2dseXBoKSwKLQlzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIChhZl9wcm9wZXJ0eV9zZXQpOiBVcGRhdGVkLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYzogSW5jbHVkZSBGVF9BVVRPSElOVEVSX0guCi0JKGZ0X29wZW5fZmFjZV9pbnRlcm5hbCk6IFVwZGF0ZWQuCi0JKEZUX0ZhY2VfUHJvcGVydGllcyk6IEhhbmRsZSBGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkcuCi0KLQkqIHNyYy9jZmYvY2YyZnQuYyAoY2YyX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9wcm9wZXJ0eV9zZXQpOiBVcGRhdGVkLgotCi0yMDE3LTAyLTE2ICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBmYWNlIHByb3BlcnR5IGZvciBMQ0QgZmlsdGVyIHdlaWdodHMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCAoRlRfUEFSQU1fVEFHX0xDRF9GSUxURVJfV0VJR0hUUywKLQlGVF9MQ0RfRklMVEVSX0ZJVkVfVEFQUyk6IE5ldyBtYWNyb3MuCi0JKEZUX0xjZEZpdmVUYXBGaWx0ZXIpOiBOZXcgdHlwZWRlZi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG9ianMuaCAoRlRfRmFjZV9JbnRlcm5hbFJlYykKLQlbRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkddOiBBZGQgYGxjZF93ZWlnaHRzJyBmaWVsZC4KLQkoRlRfQml0bWFwX0xjZEZpbHRlckZ1bmMpOiBDaGFuZ2UgdGhpcmQgYXJndW1lbnQgdG8gd2VpZ2h0cyBhcnJheS4KLQkoZnRfbGNkX2ZpbHRlcl9maXIpOiBOZXcgcHJvdG90eXBlLgotCShGVF9MaWJyYXJ5UmVjKTogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRsY2RmaWwuYyAoX2Z0X2xjZF9maWx0ZXJfZmlyKTogUmVuYW1lZCB0by4uLgotCShmdF9sY2RfZmlsdGVyX2Zpcik6IC4uLiB0aGlzIGJhc2UgZnVuY3Rpb24uCi0JVXBkYXRlZC4KLQkoX2Z0X2xjZF9maWx0ZXJfbGVnYWN5KTogVXBkYXRlZC4KLQkoRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzLCBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcik6IFVwZGF0ZWQuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9vcGVuX2ZhY2VfaW50ZXJuYWwpOiBVcGRhdGVkLgotCShGVF9GYWNlX1Byb3BlcnRpZXMpOiBIYW5kbGUgRlRfUEFSQU1fVEFHX0xDRF9GSUxURVJfV0VJR0hUUy4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpCi0JW0ZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HXTogSGFuZGxlIExDRCB3ZWlnaHRzIGZyb20KLQlgRlRfRmFjZV9JbnRlcm5hbCcuCi0KLTIwMTctMDItMTQgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkIG5ldyBmdW5jdGlvbiBgRlRfRmFjZV9Qcm9wZXJ0aWVzJy4KLQotCVRoaXMgY29tbWl0IHByb3ZpZGVzIHRoZSBmcmFtZXdvcmssIHRvIGJlIGZpbGxlZCB3aXRoIHNvbWV0aGluZwotCXVzZWZ1bCBpbiB0aGUgbmV4dCBjb21taXRzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0ZhY2VfUHJvcGVydGllcyk6IERlY2xhcmUuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9GYWNlX1Byb3BlcnRpZXMpOiBOZXcgZnVuY3Rpb24uCi0KLTIwMTctMDItMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBQcmV2ZW50IG92ZXJsYXBwaW5nIGJsdWUgem9uZXMuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZm9udHMvaXNzdWVzLzYzMgotCi0JVGhlIGZvbnQgaW4gcXVlc3Rpb24gKE51bml0bykgaGFzIHZhbHVlcyA3MDUgYW5kIDcxMyBmb3IgdGhlCi0JcmVmZXJlbmNlIGFuZCBvdmVyc2hvb3QgdmFsdWVzLCByZXNwZWN0aXZlbHksIG9mIHRoZSBmaXJzdCBibHVlCi0Jem9uZS4gIEJsdWUgem9uZSAyLCBob3dldmVyLCBoYXMgdmFsdWUgNzEwIGZvciBib3RoIHRoZSByZWZlcmVuY2UKLQlhbmQgb3ZlcnNob290LiAgQXQgMTJwcGVtLCByZWZlcmVuY2UgYW5kIG92ZXJzaG9vdCBvZiBibHVlIHpvbmUgMAotCWJlY29tZXMgOHB4LCB3aGlsZSBibHVlIHpvbmUgMiBiZWNvbWVzIDlweC4KLQotCUEgcGVjdWxpYXJpdHkgb2YgdGhpcyBmb250IGlzIHRoYXQgdGhlIHRvcHMgb2YgaXNvbGF0ZWQgdmVydGljYWwKLQlzdGVtcyBsaWtlIGBOJyBoYXZlIGEgc2xpZ2h0IG92ZXJzaG9vdCBhbHNvLiAgVGhlIGF1dG8taGludGVyIHRyaWVzCi0JdG8gZmluZCB0aGUgbmVhcmVzdCBibHVlIHpvbmUgdXNpbmcgdGhlICpvcmlnaW5hbCogY29vcmRpbmF0ZXMuICBGb3IKLQl2ZXJ0aWNhbCBzdGVtcywgdGhpcyBpcyB2YWx1ZSA3MTMuICBGb3Igbm9ybWFsIGhvcml6b250YWwgdG9wcyBsaWtlCi0JaW4gY2hhcmFjdGVyIGBFJywgdGhpcyBpcyB2YWx1ZSA3MTAuICBTaW5jZSB2YWx1ZSA3MTMgaXMgbWFwcGVkIHRvCi0JOHB4IGJ1dCB2YWx1ZSA3MTAgdG8gOXB4LCBgTicgYW5kIHNpbWlsYXIgY2hhcmFjdGVycyBhcmUgb25lIHBpeGVsCi0JaGlnaGVyIHRoYW4gYEUnLCB3aGljaCBsb29rcyB2ZXJ5IGJhZC4KLQotCVRoaXMgY29tbWl0IHNhbml0aXplcyBibHVlIHpvbmVzIHRvIGF2b2lkIHN1Y2ggYSBiZWhhdmlvdXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fc29ydF9ibHVlKTogTmV3IGZ1bmN0aW9uLgotCShhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBTb3J0IGJsdWUgdmFsdWVzIGFuZCByZW1vdmUgb3ZlcmxhcHMuCi0KLTIwMTctMDItMTIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfc3dlZXApOiBJbXByb3ZlIGNvZGUuCi0KLTIwMTctMDItMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gSW1wbGVtZW50IGBWVkFSJyB0YWJsZSBzdXBwb3J0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oIChHWF9IVmFyVGFibGUpOiBSZW5hbWVkIHRvLi4uCi0JKEdYX0hWVmFyVGFibGUpOiAuLi5UaGlzLgotCShHWF9CbGVuZCk6IEFkZCBmaWVsZHMgZm9yIGBWVkFSJyB0YWJsZSBoYW5kbGluZy4KLQlPdGhlciBtaW5vciB1cGRhdGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9odmFyKTogUmVuYW1lZCB0by4uLgotCShmdF92YXJfbG9hZF9odnZhcik6IC4uLlRoaXMuCi0JSGFuZGxlIFZWQVIgbG9hZGluZyBhbHNvIChjb250cm9sbGVkIGJ5IGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyKS4KLQkodHRfaGFkdmFuY2VfYWRqdXN0KTogUmVuYW1lZCB0by4uLgotCSh0dF9odmFkdmFuY2VfYWRqdXN0KTogLi4uVGhpcy4KLQlIYW5kbGUgYXBwbGljYXRpb24gb2YgYWR2YW5jZSBoZWlnaHQgYWxzbyAoY29udHJvbGxlZCBieSBhbgotCWFkZGl0aW9uYWwgcGFyYW1ldGVyKS4KLQkodHRfaGFkdmFuY2VfYWRqdXN0LCB0dF92YWR2YW5jZV9hZGp1c3QpOiBXcmFwcGVycyBmb3IKLQlgdHRfaHZhZHZhbmNlX2FkanVzdCcuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9zZXJ2aWNlX21ldHJpY3NfdmFyaWF0aW9ucyk6IFVwZGF0ZWQuCi0KLTIwMTctMDItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBVc2UgYmV0dGVyIGJsdWUgem9uZSBjaGFyYWN0ZXJzIGZvciBsb3dlcmNhc2UgbGF0aW4uCi0KLQlUaGUgbnVtYmVyIG9mIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGZvciBjb21wdXRpbmcgdGhlIHRvcCBmbGF0IGJsdWUKLQl6b25lIHZhbHVlIHdhcyB0b28gc21hbGwgKGluIG1vc3QgY2FzZXMgb25seSBgeCcgYW5kIGB6JykuICBJZiBvbmUKLQlvZiB0aGUgdHdvIGNoYXJhY3RlcnMgaGFzIGEgbGFyZ2Ugc2VyaWYsIHNheSwgaXQgY2FuIGhhcHBlbiB0aGF0Ci0JRnJlZVR5cGUgbXVzdCBzZWxlY3QgYmV0d2VlbiB0d28gZGlmZmVyZW50IHZhbHVlcywgaGF2aW5nIGEgNTAlCi0JY2hhbmNlIHRvIHVzZSB0aGUgd3Jvbmcgb25lLiAgQXMgYSByZXN1bHQsIHJlbmRlcmluZyBhdCBsYXJnZXIgUFBFTQotCXZhbHVlcyBjb3VsZCB5aWVsZCB1bmV2ZW4gbG93ZXJjYXNlIGdseXBoIGhlaWdodHMuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IENocmlzdG9waCBLb2ViZXJsaW4gPGNocmlzdG9waEBrb2UuYmVybGluPi4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdCAoQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTEwpOiBSZXBsYWNlZAotCXdpdGguLi4KLQkoQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfVE9QLCBBRl9CTFVFX1NUUklOR19MQVRJTl9TTUFMTF9CT1RUT00pOgotCS4uLiBOZXcsIGV4dGVuZGVkIHNldHMuCi0JKEFGX0JMVUVfU1RSSU5HU0VUX0xBVE4pOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc2NyL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0yMDE3LTAyLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNYWtlIGBmcmVldHlwZS1jb25maWcnIGEgd3JhcHBlciBvZiBgcGtnLWNvbmZpZycgaWYgcG9zc2libGUuCi0KLQlCYXNlZCBvbiBpZGVhcyB0YWtlbiBmcm9tCi0KLQkgIGh0dHA6Ly9wa2dzLmZlZG9yYXByb2plY3Qub3JnL2NnaXQvcnBtcy9mcmVldHlwZS5naXQvdHJlZS9mcmVldHlwZS1tdWx0aWxpYi5wYXRjaAotCSAgaHR0cDovL3BrZ3MuZmVkb3JhcHJvamVjdC5vcmcvY2dpdC9ycG1zL2ZyZWV0eXBlLmdpdC90cmVlL2ZyZWV0eXBlLTIuNS4zLWZyZWV0eXBlLWNvbmZpZy1wcmVmaXgucGF0Y2gKLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluOiBSZXdyaXR0ZW4uICBVc2UgYHBrZy1jb25maWcnIHRvCi0Jc2V0IG91dHB1dCB2YXJpYWJsZXMgaWYgcHJvZ3JhbSBpcyBhdmFpbGFibGUuCi0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9mcmVldHlwZS1jb25maWcuMTogVXBkYXRlZC4KLQotMjAxNy0wMi0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbiAoZnJlZXR5cGUtY29uZmlnKTogRml4IHBlcm1pc3Npb25zLgotCi0yMDE3LTAyLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19mcmVlKTogRXJhc2UgdXNlbGVzcyBjb2RlLgotCi0yMDE3LTAyLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmggKEZUX0dBU1BfU1lNTUVUUklDX0dSSURGSVQpOiBGaXggdmFsdWUuCi0KLQlSZXBvcnRlZCBieSBCZWhkYWQuCi0KLTIwMTctMDItMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IE1WQVIgcG9zdC1hY3Rpb24gaGFuZGxpbmcuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD01MDkKLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX3Jlc2V0KTogRG8gbm90aGluZyBmb3IgQ0ZGMi4gIFRoaXMKLQlpcyBpbXBvcnRhbnQgdG8gbWFrZSBgdHRfc2l6ZV9yZXNldF9pdGVyYXRvcicgKGNhbGxlZCBpbgotCWB0dF9hcHBseV9tdmFyJykgYWx3YXlzIHdvcmsuCi0KLTIwMTctMDItMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgY29tcGlsYXRpb24gd2l0aCBGVF9DT05GSUdfT1BUSU9OX1BJQyB3b3JrIGFnYWluLgotCi0JQWxsIGNvZGUgY29tbWl0dGVkIGhlcmUgaXMgZ3VhcmRlZCB3aXRoIGBGVF9DT05GSUdfT1BUSU9OX1BJQycuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaAotCShGVF9ERUZJTkVfU0VSVklDRV9NRVRSSUNTVkFSSUFUSU9OU1JFQyk6IFJlbW92ZSB0cmFpbGluZyBzZW1pY29sb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfY29tcHV0ZV9lZGdlcywKLQlhZl9sYXRpbl9oaW50X2VkZ2VzKTogUHJvdmlkZSBgZ2xvYmFscycgdmFyaWFibGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2dseXBoKTogUmVtb3ZlIHNoYWRvd2luZwotCXZhcmlhYmxlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIChBRl9TQ1JJUFRfQ0xBU1NFU19HRVQsCi0JQUZfU1RZTEVfQ0xBU1NFU19HRVQpOiBSZWRlZmluZS4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9ERUZJTkVfV1JJVElOR19TWVNURU1fQ0xBU1MpOiBGaXggdHlwby4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChDRkZfRklFTERfQkxFTkQpOiBQcm92aWRlIGl0LgotCi0JKiBzcmMvY2ZmL2NmZnBpYy5oIChDZmZNb2R1bGVQSUMpOiBGaXggdHlwby4KLQotMjAxNy0wMS0zMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfc2NhbmxpbmUpOiBJbXByb3ZlIGNvZGUuCi0KLTIwMTctMDEtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFByb3ZpZGUgbWV0cmljcyB2YXJpYXRpb24gc2VydmljZSBpbnRlcmZhY2UgKCM1MDE5NikuCi0KLQlPbmx5IG5vdyBJJ3ZlIGdvdCBhbiBPVEYgd2l0aCBhbiBIVkFSIHRhYmxlIGZvciB0ZXN0aW5nLi4uCi0KLQlUaGUgY29kZSBpbiBgZnRtbS5jJyB1c2VzIGBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFJyB0byBnZXQgdGhlCi0JbWV0cmljcyB2YXJpYXRpb25zIGludGVyZmFjZS4gIEhvd2V2ZXIsIHRoaXMgZGlkbid0IHdvcmsgd2l0aAotCWBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UnIHVzZWQgaW4gYHNmbnRfaW5pdF9mYWNlJy4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0guCi0JKGNmZl9oYWR2YW5jZV9hZGp1c3QsIGNmZl9tZXRyaWNzX2FkanVzdCk6IFdyYXBwZXIgZnVuY3Rpb25zIGZvcgotCW1ldHJpYyBzZXJ2aWNlIGZ1bmN0aW9ucyBmcm9tIHRoZSBgdHJ1ZXR5cGUnIG1vZHVsZS4KLQkoY2ZmX3NlcnZpY2VfbWV0cmljc192YXJpYXRpb25zKTogTmV3IHNlcnZpY2UuCi0JKGNmZl9zZXJ2aWNlcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2ZmcGljLmggKENGRl9TRVJWSUNFX01FVFJJQ1NfVkFSX0dFVCk6IE5ldyBtYWNyby4KLQlbRlRfQ09ORklHX09QVElPTl9QSUNdOiBTeW5jaHJvbml6ZSBjb2RlLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9pbml0X2ZhY2UpOiBSZXBsYWNlIGNhbGwgdG8KLQlGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0Ugd2l0aCBgZnRfbW9kdWxlX2dldF9zZXJ2aWNlJyB0byBhbHdheXMKLQlsb2FkIHRoZSBzZXJ2aWNlIGZyb20gdGhlIGB0cnVldHlwZScgbW9kdWxlLgotCi0yMDE3LTAxLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgZnJhbWV3b3JrIHRvIHN1cHBvcnQgc2VydmljZXMgd2l0aCA5IGZ1bmN0aW9ucy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCAoRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDOSk6Ci0JTmV3IG1hY3JvLgotCi0yMDE3LTAxLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gRml4IGVycm9yIGhhbmRpbmcgaW4gTU0gZnVuY3Rpb25zLgotCi0JKiBzcmMvYmFzZS9mdG1tLmMgKEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzLAotCUZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcywgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyk6Ci0JSW1wbGVtZW50IGl0LgotCi0yMDE3LTAxLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBzYW5pdHkgY2hlY2sgZm9yIGBndmFyJyB0YWJsZSAoIzUwMTg0KS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX2xvYWRfZ3Zhcik6IFRoZXJlIG1pZ2h0IGJlIG1pc3NpbmcKLQl2YXJpYXRpb24gZGF0YSBmb3Igc29tZSBnbHlwaHMuCi0KLTIwMTctMDEtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBdm9pZCB1bmluaXRpYWxpemVkIGp1bXBzICgjNTAxOTEpLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfbWV0cmljc19jaGVja19kaWdpdHMpLAotCXNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19jaGVja19kaWdpdHMpOiBJbml0aWFsaXplCi0JYGFkdmFuY2UnLgotCi0yMDE3LTAxLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlzL0dCMjMxMi9QUkMvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0VOQ09ESU5HX1BSQyk6IE5ldyBlbnVtIHZhbHVlLgotCShGVF9FTkNPRElOR19HQjIzMTIpOiBEZXByZWNhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmggKFRUX01TX0lEX1BSQyk6IE5ldyBtYWNyby4KLQkoVFRfTVNfSURfR0IyMzEyKTogRGVwcmVjYXRlZC4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfZmluZF9lbmNvZGluZyk6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNy0wMS0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2VdIEFkZCBgRlRfR2V0X1NmbnRfTGFuZ1RhZycgZnVuY3Rpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRzbmFtZXMuaCAoRlRfU2ZudExhbmdUYWcpOiBOZXcgc3RydWN0dXJlLgotCShGVF9HZXRfU2ZudF9MYW5nVGFnKTogTmV3IGRlY2xhcmF0aW9uLgotCi0JKiBzcmMvYmFzZS9mdHNuYW1lcy5jIChGVF9HZXRfU2ZudF9MYW5nVGFnKTogTmV3IGZ1bnRpb24uCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNy0wMS0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFN1cHBvcnQgYG5hbWUnIHRhYmxlIGZvcm1hdCAxLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfTGFuZ1RhZ1JlYyk6IE5ldwotCXN0cnVjdHVyZS4KLQkoVFRfTmFtZVRhYmxlUmVjKTogQWRkIGZpZWxkcyBgbnVtTGFuZ1RhZ1JlY29yZHMnIGFuZCBgbGFuZ1RhZ3MnLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX25hbWUpOiBBZGQgc3VwcG9ydCBmb3IgbGFuZ3VhZ2UKLQl0YWdzLgotCVJlZHVjZSBhcnJheSBzaXplIG9mIG5hbWUgc3RyaW5ncyBpbiBjYXNlIG9mIGludmFsaWQgZW50cmllcy4KLQkodHRfZmFjZV9mcmVlX25hbWUpOiBVcGRhdGVkLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTctMDEtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBzL1RUX05hbWVFbnRyeS9UVF9OYW1lLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX05hbWVFbnRyeVJlYyk6IFJlbmFtZWQKLQl0by4uLgotCShUVF9OYW1lUmVjKTogVGhpcy4KLQkoVFRfTmFtZVRhYmxlUmVjKTogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRzbmFtZXMuYyAoRlRfR2V0X1NmbnRfTmFtZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X3BzX25hbWUpOiBVcGRhdGVkLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAodHRfbmFtZV9lbnRyeV9hc2NpaV9mcm9tX3V0ZjE2LAotCXR0X25hbWVfZW50cnlfYXNjaWlfZnJvbV9vdGhlcik6IFJlbmFtZWQgdG8uLi4KLQkodHRfbmFtZV9hc2NpaV9mcm9tX3V0ZjE2LCB0dF9uYW1lX2VudHJ5X2FzY2lpX2Zyb21fb3RoZXIpOiBUaGlzLAotCXJlc3BlY3RpdmVseS4KLQkoVFRfTmFtZUVudHJ5X0NvbnZlcnRGdW5jKTogUmVuYW1lZCB0by4uLgotCShUVF9OYW1lX0NvbnZlcnRGdW5jKTogVGhpcy4KLQkodHRfZmFjZV9nZXRfbmFtZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfbmFtZSwgdHRfZmFjZV9mcmVlX25hbWUpOgotCVVwZGF0ZWQuCi0KLTIwMTctMDEtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBGaXggUG9zdHNjcmlwdCBuYW1lIHNlcnZpY2UgZm9yIHN5bWJvbCBmb250cy4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9nZXRfcHNfbmFtZSk6IEFjY2VwdCBQSUQvRUlEPTMvMAotCWVudHJpZXMgYWxzby4KLQotMjAxNy0wMS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGb3IgT3BlblR5cGUgMS43OiBzL3ByZWZlcnJlZC90eXBvZ3JhcGhpYy8gKHN1YilmYW1pbHkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRzbmFtZXMuaAotCShGVF9QQVJBTV9UQUdfSUdOT1JFX1RZUE9HUkFQSElDX0ZBTUlMWSwKLQlGVF9QQVJBTV9UQUdfSUdOT1JFX1RZUE9HUkFQSElDX1NVQkZBTUlMWSk6IE5ldyBtYWNyb3MuCi0JKEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX0ZBTUlMWSwKLQlGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9TVUJGQU1JTFkpOiBEZXByZWNhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmggKFRUX05BTUVfSURfVFlQT0dSQVBISUNfRkFNSUxZLAotCVRUX05BTUVfSURfVFlQT0dSQVBISUNfU1VCRkFNSUxZKTogTmV3IG1hY3Jvcy4KLQkoVFRfTkFNRV9JRF9QUkVGRVJSRURfRkFNSUxZLCBUVF9OQU1FX0lEX1BSRUZFUlJFRF9TVUJGQU1JTFkpOgotCURlcHJlY2F0ZWQuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2xvYWRfZmFjZSk6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNy0wMS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2VdIEFkZCBgRlRfU2V0X0RlZmF1bHRfUHJvcGVydGllcycgKCM0OTE4NykuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtb2RhcGkuaDogQWRkIGRlY2xhcmF0aW9uLgotCi0JKiBzcmMvYmFzZS9mdGluaXQuYyAoZnRfc2V0X2RlZmF1bHRfcHJvcGVydGllcyk6IFJlbmFtZWQgdG8uLi4KLQkoRlRfU2V0X0RlZmF1bHRfUHJvcGVydGllcyk6IC4uLiB0aGlzLgotCShGVF9Jbml0X0ZyZWVUeXBlKTogVXBkYXRlZC4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDE3LTAxLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1pbm9yIHVwZGF0ZXMgZm9yIE9wZW5UeXBlIDEuOC4xLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oIChHWF9NVmFyVGFibGUpOiBgYXhpc0NvdW50JyBoYXMgYmVlbgotCXJlbW92ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbjsgaXQgaXMgbm93IHJlc2VydmVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9tdmFyKTogVXBkYXRlZC4KLQkoR1hfRlZhcl9IZWFkKTogUmVtb3ZlIGBjb3VudFNpemVQYWlycyc7IHRoZSBjb3JyZXNwb25kaW5nIGRhdGEKLQlmaWVsZCBpbiB0aGUgYE1WQVInIHRhYmxlIGlzIG5vdyByZXNlcnZlZC4KLQkoZnZhcl9maWVsZHMpOiBVcGRhdGVkLgotCi0yMDE3LTAxLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEF2b2lkIHNlZ2ZhdWx0IGZvciBpbnZhbGlkIHZhcmlhdGlvbiBkYXRhLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9pdGVtX3ZhcmlhdGlvbl9zdG9yZSk6IEFzc3VyZQotCWBpdGVtQ291bnQnIGlzIG5vdCB6ZXJvLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NDQxCi0KLTIwMTctMDEtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX1J1bklucyk6IEFkanVzdCBsb29wIGRldGVjdG9yIGxpbWl0cy4KLQotMjAxNy0wMS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmg6IFVwZGF0ZWQgdG8gT3BlblR5cGUgMS44LjEuCi0KLQkoVFRfQVBQTEVfSURfRlVMTF9VTklDT0RFKTogTmV3IG1hY3JvLgotCi0JKFRUX01TX0xBTkdJRF9CT1NOSUFOX0JPU05JQV9IRVJaX0NZUklMTElDLAotCVRUX01TX0xBTkdJRF9VUFBFUl9TT1JCSUFOX0dFUk1BTlksCi0JVFRfTVNfTEFOR0lEX0xPV0VSX1NPUkJJQU5fR0VSTUFOWSwgVFRfTVNfTEFOR0lEX0lSSVNIX0lSRUxBTkQsCi0JVFRfTVNfTEFOR0lEX0lOVUtUSVRVVF9DQU5BREFfTEFUSU4sIFRUX01TX0xBTkdJRF9CQVNIS0lSX1JVU1NJQSwKLQlUVF9NU19MQU5HSURfTFVYRU1CT1VSR0lTSF9MVVhFTUJPVVJHLAotCVRUX01TX0xBTkdJRF9HUkVFTkxBTkRJQ19HUkVFTkxBTkQsIFRUX01TX0xBTkdJRF9NQVBVRFVOR1VOX0NISUxFLAotCVRUX01TX0xBTkdJRF9NT0hBV0tfTU9IQVdLLCBUVF9NU19MQU5HSURfQlJFVE9OX0ZSQU5DRSwKLQlUVF9NU19MQU5HSURfT0NDSVRBTl9GUkFOQ0UsIFRUX01TX0xBTkdJRF9DT1JTSUNBTl9GUkFOQ0UsCi0JVFRfTVNfTEFOR0lEX0FMU0FUSUFOX0ZSQU5DRSwgVFRfTVNfTEFOR0lEX1lBS1VUX1JVU1NJQSwKLQlUVF9NU19MQU5HSURfS0lDSEVfR1VBVEVNQUxBLCBUVF9NU19MQU5HSURfS0lOWUFSV0FOREFfUldBTkRBLAotCVRUX01TX0xBTkdJRF9XT0xPRl9TRU5FR0FMLCBUVF9NU19MQU5HSURfREFSSV9BRkdIQU5JU1RBTik6IE5ldwotCW1hY3Jvcy4KLQotCShUVF9NU19MQU5HSURfU0VSQklBTl9CT1NOSUFfSEVSWl9DWVJJTExJQyk6IEZpeCB2YWx1ZS4KLQotCShUVF9NU19MQU5HSURfR0VSTUFOX0xJRUNIVEVOU1RFSU4sIFRUX01TX0xBTkdJRF9DQVRBTEFOX0NBVEFMQU4sCi0JVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQU8sIFRUX01TX0xBTkdJRF9TUEFOSVNIX1NQQUlOX01PREVSTl9TT1JULAotCVRUX01TX0xBTkdJRF9LT1JFQU5fS09SRUEsIFRUX01TX0xBTkdJRF9ST01BTlNIX1NXSVRaRVJMQU5ELAotCVRUX01TX0xBTkdJRF9TTE9WRU5JQU5fU0xPVkVOSUEsIFRUX01TX0xBTkdJRF9CQVNRVUVfQkFTUVVFLAotCVRUX01TX0xBTkdJRF9TRVRTV0FOQV9TT1VUSF9BRlJJQ0EsCi0JVFRfTVNfTEFOR0lEX0lTSVhIT1NBX1NPVVRIX0FGUklDQSwKLQlUVF9NU19MQU5HSURfSVNJWlVMVV9TT1VUSF9BRlJJQ0EsIFRUX01TX0xBTkdJRF9LQVpBS0hfS0FaQUtIU1RBTiwKLQlUVF9NU19MQU5HSURfS1lSR1laX0tZUkdZWlNUQU4sIFRUX01TX0xBTkdJRF9LSVNXQUhJTElfS0VOWUEsCi0JVFRfTVNfTEFOR0lEX1RBVEFSX1JVU1NJQSwgVFRfTVNfTEFOR0lEX09ESUFfSU5ESUEsCi0JVFRfTVNfTEFOR0lEX01PTkdPTElBTl9QUkMsIFRUX01TX0xBTkdJRF9USUJFVEFOX1BSQywKLQlUVF9NU19MQU5HSURfV0VMU0hfVU5JVEVEX0tJTkdET00sIFRUX01TX0xBTkdJRF9HQUxJQ0lBTl9HQUxJQ0lBTiwKLQlUVF9NU19MQU5HSURfU0lOSEFMQV9TUklfTEFOS0EsIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfQUxHRVJJQSwKLQlUVF9NU19MQU5HSURfU0VTT1RIT19TQV9MRUJPQV9TT1VUSF9BRlJJQ0EsIFRUX01TX0xBTkdJRF9ZSV9QUkMsCi0JVFRfTVNfTEFOR0lEX1VJR0hVUl9QUkMpOiBOZXcgYWxpYXNlcy4KLQotCVJlbW92ZSBjb21tZW50ZWQgb3V0IGNvZGUuCi0KLQkoVFRfTkFNRV9JRF9MSUdIVF9CQUNLR1JPVU5ELCBUVF9OQU1FX0lEX0RBUktfQkFDS0dST1VORCwKLQlUVF9OQU1FX0lEX1ZBUklBVElPTlNfUFJFRklYKTogTmV3IG1hY3Jvcy4KLQotCShIQVZFX0xJTUlUX09OX0lERU5UUyk6IFJlbW92ZSBtYWNybyAod2hpY2ggd2FzIHVzZWxlc3Mgc2luY2UgbWFueQotCXllYXJzKSwgdXNlIGd1YXJkZWQgbG9uZyBtYWNyb3MgYnkgZGVmYXVsdCBhbmQgZGVmaW5lIHNob3J0IHZlcnNpb25zCi0JYXMgYWxpYXNlcyBmb3IgdGhlIGxvbmcgb25lcy4KLQotMjAxNy0wMS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9hcHBseV92YXIpOiBIYW5kbGUgdW5kZXJsaW5lIHBhcmFtZXRlcnMKLQlhbHNvLgotCi0yMDE3LTAxLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9vcGVuX2ZhY2VfaW50ZXJuYWwpOiBJbXByb3ZlIHRyYWNpbmcuCi0KLTIwMTctMDEtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQWN0dWFsbHkgdXNlIG1ldHJpY3MgdmFyaWF0aW9uIHNlcnZpY2UuCi0KLQkqIHNyYy9iYXNlL2Z0bW0uYzogSW5jbHVkZSBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19ILgotCShmdF9mYWNlX2dldF9tdmFyX3NlcnZpY2UpOiBOZXcgYXV4aWxpYXJ5IGZ1bmN0aW9uIHRvIGxvb2sgdXAKLQltZXRyaWNzIHZhcmlhdGlvbiBzZXJ2aWNlLgotCShGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcywgRlRfU2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzLAotCUZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMpOiBDYWxsIG1ldHJpY3MgdmFyaWF0aW9uIHNlcnZpY2UuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZmFjZV9pbml0KTogVXNlIG1ldHJpY3MgdmFyaWF0aW9ucyBmb3IKLQluYW1lZCBpbnN0YW5jZXMuCi0KLTIwMTctMDEtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gUHJvdmlkZSBtZXRyaWNzIHZhcmlhdGlvbiBzZXJ2aWNlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bWV0cmljLmgKLQkoRlRfTWV0cmljc19BZGp1c3RfRnVuYyk6IFJlZHVjZSBudW1iZXIgb2YgbmVjZXNzYXJ5IHBhcmFtZXRlcnMuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmM6IEluY2x1ZGUgRlRfTElTVF9ILgotCSh0dF9zaXplX3Jlc2V0X2l0ZXJhdG9yKTogTmV3IGF1eGlsaWFyeSBmdW5jdGlvbiBmb3IuLi4KLQkodHRfYXBwbHlfdmFyKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfc2VydmljZV9tZXRyaWNzX3ZhcmlhdGlvbnMpOiBBZGQKLQlgdHRfYXBwbHlfbXZhcicuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX1NlcnZpY2VDYWNoZSk6IEFkZCBtZXRyaWNzCi0JdmFyaWF0aW9uIHNlcnZpY2UuCi0KLTIwMTctMDEtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gUGFyc2UgYE1WQVInIHRhYmxlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oIChNVkFSX1RBR19YWFgpOiBOZXcgbWFjcm9zIGZvciBNVkFSIHRhZ3MuCi0JKEdYX1ZhbHVlLCBHWF9NVmFyVGFibGUpOiBOZXcgc3RydWN0dXJlcy4KLQkoR1hfQmxlbmQpOiBBZGQgaXQuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKEdYX1ZBTFVFX1NJWkUsIEdYX1ZBTFVFX0NBU0UsCi0JR1hfR0FTUF9DQVNFKTogTmV3IG1hY3Jvcy4KLQkoZnRfdmFyX2dldF92YWx1ZV9wb2ludGVyKTogTmV3IGF1eGlsaWFyeSBmdW5jdGlvbiB0byBnZXQgYSBwb2ludGVyCi0JdG8gYSB2YWx1ZSBmcm9tIHZhcmlvdXMgU0ZOVCB0YWJsZXMgYWxyZWFkeSBzdG9yZWQgaW4gYFRUX0ZhY2UnLgotCShmdF92YXJfbG9hZF9tdmFyKTogTmV3IGZ1bmN0aW9uLgotCShUVF9HZXRfTU1fVmFyKTogQ2FsbCBpdC4KLQkodHRfZG9uZV9ibGVuZCk6IFVwZGF0ZWQuCi0KLTIwMTctMDEtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gTW9yZSBwcmVwYXJhdGlvbnMgZm9yIE1WQVIgc3VwcG9ydC4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX3Jlc2V0KTogQWRkIGFyZ3VtZW50IHRvIG1ha2UKLQlmdW5jdGlvbiBvbmx5IHJlY29tcHV0ZSBhc2NlbmRlciwgZGVzY2VuZGVyLCBhbmQgaGVpZ2h0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9zaXplX3NlbGVjdCwgdHRfc2l6ZV9yZXF1ZXN0KToKLQlVcGRhdGVkLgotCi0yMDE3LTAxLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcGNmXSBEaXNhYmxlIGxvbmcgZmFtaWx5IG5hbWVzIGJ5IGRlZmF1bHQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoUENGX0NPTkZJR19PUFRJT05fTE9OR19GQU1JTFlfTkFNRVMpOiBDb21tZW50IG91dC4KLQotMjAxNy0wMS0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gTWFrZSBsb25nIGZhbWlseSBuYW1lcyBjb25maWd1cmFibGUuCi0KLQlUaGUgY2hhbmdlIGZyb20gMjAxNi0wOS0yOSB3YXMgdG9vIHJhZGljYWwgKGV4Y2VwdCBmb3IgcGVvcGxlIHVzaW5nCi0JdGhlIG9wZW5TdVNFIEdOVS9MaW51eCBkaXN0cmlidXRpb24pLiAgVG8gYW1lbGlvcmF0ZSB0aGUgc2l0dWF0aW9uLAotCVBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTIGdldHMgaW50cm9kdWNlZCB3aGljaCBjb250cm9scwotCXRoZSBmZWF0dXJlOyBpZiBzZXQsIGEgbmV3IFBDRiBwcm9wZXJ0eSBvcHRpb24KLQlgbm8tbG9uZy1mYW1pbHktbmFtZXMnIGNhbiBiZSB1c2VkIHRvIHN3aXRjaCB0aGlzIGZlYXR1cmUgb2ZmLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oLCBkZXZlbC9mdG9wdGlvbi5oCi0JKFBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTKTogTmV3IG9wdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHBjZmRydi5oOiBOZXcgaGVhZGVyIGZpbGUgKG9ubHkgY29udGFpbmluZwotCWNvbW1lbnRzIGN1cnJlbnRseSwgdXNlZCBmb3IgYnVpbGRpbmcgdGhlIGRvY3VtZW50YXRpb24pLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9QQ0ZfRFJJVkVSX0gpOiBOZXcgbWFjcm8uCi0KLQkqIHNyYy9wY2YvcGNmLmggKFBDRl9Ecml2ZXIpOiBBZGQgYG5vX2xvbmdfZmFtaWx5X25hbWVzJyBmaWVsZC4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19IIGFuZAotCUZUX1BDRl9EUklWRVJfSC4KLQkocGNmX3Byb3BlcnR5X3NldCwgcGNmX3Byb3BlcnR5X2dldCk6IE5ldyBmdW5jdGlvbnMuCi0JKHBjZl9zZXJ2aWNlX3Byb3BlcnRpZXMpOiBOZXcgc2VydmljZS4KLQkocGNmX3NlcnZpY2VzKTogVXBkYXRlZC4KLQkocGNmX2RyaXZlcl9pbml0KSBbUENGX0NPTkZJR19PUFRJT05fTE9OR19GQU1JTFlfTkFNRVNdOiBIYW5kbGUKLQlgbm9fbG9uZ19mYW1pbHlfbmFtZXMnLgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2xvYWRfZm9udCk6IEhhbmRsZSBgbm9fbG9uZ19mYW1pbHlfbmFtZXMnCi0JYW5kIFBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTctMDEtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwY2ZdIEludHJvZHVjZSBhIGRyaXZlciBzdHJ1Y3R1cmUuCi0KLQlUbyBiZSBmaWxsZWQgbGF0ZXIgb24gd2l0aCBzb21ldGhpbmcgdXNlZnVsLgotCi0JKiBzcmMvcGNmL3BjZi5oIChQQ0ZfRHJpdmVyKTogTmV3IHN0cnVjdHVyZS4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChwY2ZfZHJpdmVyX2luaXQsIHBjZl9kcml2ZXJfZG9uZSk6IE5ldyBkdW1teQotCWZ1bmN0aW9ucy4KLQkocGNmX2RyaXZlcl9jbGFzcyk6IFVwZGF0ZWQuCi0KLTIwMTctMDEtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQWdhaW4gc29tZSBHWCBjb2RlIHNodWZmbGluZy4KLQotCVdlIG5lZWQgdGhpcyBsYXRlciBvbiBmb3IgTVZBUiBhbHNvLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9oYWR2YW5jZV9hZGp1c3QpOiBTcGxpdCBvZmYgY29tcHV0aW5nCi0JYW4gaXRlbSBzdG9yZSB2YXJpYXRpb24gZGVsdGEgaW50by4uLgotCShmdF92YXJfZ2V0X2l0ZW1fZGVsdGEpOiAuLi5uZXcgZnVuY3Rpb24uCi0KLTIwMTctMDEtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQWRqdXN0IGZvbnQgdmFyaWF0aW9uIGZsYWdzIGZvciBNVkFSLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRkFDRV9GTEFHX1ZBUl9YWFgpOgotCVJlbW92ZSBhbGwgZmxhZ3MgcmVsYXRlZCB0byBNVkFSOyByZXBsYWNlIGl0IHdpdGguLi4KLQkoVFRfRkFDRV9GTEFHX1ZBUl9NVkFSKTogLi4udGhpcyBuZXcgbWFjcm8uCi0JKFRUX0ZhY2UpOiBSZW1vdmUgYG12YXJfc3VwcG9ydCcgZmllbGQgKHdoaWNoIHdhcyBzdGlsbCB1bnVzZWQpLgotCi0yMDE3LTAxLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1vcmUgR1ggY29kZSBzaHVmZmxpbmcuCi0KLQlXZSBuZWVkIHRoaXMgbGF0ZXIgb24gZm9yIE1WQVIgYWxzby4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfZG9uZV9ibGVuZCk6IFNwbGl0IG9mZiBoYW5kbGluZyBvZiBpdGVtCi0JdmFyaWF0aW9uIHN0b3JlIGludG8uLi4KLQkoZnRfdmFyX2RvbmVfaXRlbV92YXJpYXRpb25fc3RvcmUpOiAuLi5uZXcgZnVuY3Rpb24uCi0KLTIwMTctMDEtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gTW9yZSBnZW5lcmFsaXphdGlvbiBvZiBHWCBzdHVmZi4KLQotCVdlIG5lZWQgdGhpcyBsYXRlciBvbiBmb3IgTVZBUiBhbHNvLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9kZWx0YV9zZXRfaW5kZXhfbWFwcGluZyk6IEFkZAotCXBhcmFtZXRlcnMgZm9yIGRlbHRhLXNldCBpbmRleCBtYXBwaW5nIGFuZCBpdGVtIHZhcmlhdGlvbiBzdG9yZS4KLQkoZnRfdmFyX2xvYWRfaXRlbV92YXJpYXRpb25fc3RvcmUpOiBBZGQgcGFyYW1ldGVyIGZvciBpdGVtIHZhcmlhdGlvbgotCXN0b3JlLgotCXMvaHZhckRhdGEvdmFyRGF0YS8uCi0JTW92ZSBhbGxvY2F0aW9uIG9mIGBodmFyX3RhYmxlJyB0by4uLgotCShmdF92YXJfbG9hZF9odmFyKTogLi4udGhpcyBmdW5jdGlvbi4KLQlVcGRhdGVkLgotCi0yMDE3LTAxLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFNvbWUgR1ggc3RydWN0dXJlIHJlbmFtZXMgZm9yIGdlbmVyYWxpemF0aW9uLgotCi0JV2UgbmVlZCB0aGlzIGxhdGVyIG9uIGZvciBNVkFSIGFsc28uCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmggKEdYX0hWYXJEYXRhKTogUmVuYW1lZCB0by4uLgotCShHWF9JdGVtVmFyRGF0YSk6IC4uLnRoaXMuCi0JKEdYX0hWYXJSZWdpb24pOiBSZW5hbWVkIHRvLi4uCi0JKEdYX1ZhclJlZ2lvbik6IC4uLnRoaXMuCi0JKEdYX0hWU3RvcmUpOiBSZW5hbWVkIHRvLi4uCi0JKEdYX0l0ZW1WYXJTdG9yZSk6IC4uLnRoaXMuCi0JKEdYX1dpZHRoTWFwKTogUmVuYW1lZCB0by4uLgotCShHWF9EZWx0YVNldElkeE1hcCk6IC4uLnRoaXMuCi0KLQkoR1hfSFZhclRhYmxlKTogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYzogVXBkYXRlZC4KLQotMjAxNy0wMS0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBDb2RlIHNodWZmbGluZy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX2xvYWRfaHZhcik6IFNwbGl0IG9mZiBsb2FkaW5nIG9mCi0JaXRlbSB2YXJpYXRpb24gc3RvcmUgYW5kIGRlbHRhIHNldCBpbmRleCBtYXBwaW5nIGludG8uLi4KLQkoZnRfdmFyX2xvYWRfaXRlbV92YXJpYXRpb25fc3RvcmUsCi0JZnRfdmFyX2xvYWRfZGVsdGFfc2V0X2luZGV4X21hcHBpbmcpOiAuLi5uZXcgZnVuY3Rpb25zLgotCi0yMDE3LTAxLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCBIVkFSIGFjY2VzcyB3aXRob3V0IGFkdmFuY2Ugd2lkdGggbWFwLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9odmFyKTogSGFuZGxlIGNhc2Ugd2hlcmUKLQlgb2Zmc2V0VG9BZHZhbmNlV2lkdGhNYXBwaW5nJyBpcyB6ZXJvLgotCSh0dF9oYWR2YW5jZV9hZGp1c3QpOiBJbXBsZW1lbnQgZGlyZWN0IGRlbHRhU2V0IGFjY2VzcyBieSBnbHlwaAotCWluZGV4LgotCi0yMDE3LTAxLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcGNmXSBSZXZpc2UgZHJpdmVyLgotCi0JVGhpcyBjb21taXQgaW1wcm92ZXMgdHJhY2luZyBhbmQgaGFuZGxpbmcgb2YgbWFsZm9ybWVkIGZvbnRzLiAgSW4KLQlwYXJ0aWN1bGFyLCB0aGUgY2hhbmdlcyB0byBgcGNmX2dldF9wcm9wZXJ0aWVzJyBmaXgKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9Mzc5Ci0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jICh0YWJsZU5hbWVzKTogVXNlIGxvbmcgbmFtZXMgZm9yIGJldHRlcgotCXJlYWRhYmlsaXR5LgotCShwY2ZfcmVhZF9UT0MpOiBBbGxvdyBhdCBtb3N0IDkgdGFibGVzLgotCShwY2ZfZ2V0X3Byb3BlcnRpZXMpOiBBbGxvdyBhdCBtb3N0IDI1NiBwcm9wZXJ0aWVzLgotCUxpbWl0IHN0cmluZ3MgYXJyYXkgbGVuZ3RoIHRvIDI1NiAqICg2NTUzNiArIDEpIGJ5dGVzLgotCUJldHRlciB0cmFjaW5nLgotCShwY2ZfZ2V0X21ldHJpYyk6IFRyYWNlIG1ldHJpYyBkYXRhLgotCShwY2ZfZ2V0X21ldHJpY3MpOiBBbGxvdyBhdCBtb3N0IDY1NTM2IG1ldHJpY3MuCi0JRml4IGNvbXBhcmlzb24gb2YgYG1ldHJpY3MtPmFzY2VudCcgYW5kIGBtZXRyaWNzLT5kZXNjZW50JyB0byBhdm9pZAotCXBvdGVudGlhbCBvdmVyZmxvdy4KLQlCZXR0ZXIgdHJhY2luZy4KLQkocGNmX2dldF9iaXRtYXBzKTogQWxsb3cgYXQgbW9zdCA2NTUzNiBiaXRtYXBzLgotCUJldHRlciB0cmFjaW5nLgotCShwY2ZfZ2V0X2VuY29kaW5ncywgcGNmX2dldF9hY2NlbCk6IEJldHRlciB0cmFjaW5nLgotCi0JKiBzcmMvcGNmL3BjZmRyaXZyLmMgKFBDRl9HbHlwaF9Mb2FkKTogRG9uJ3QgdHJhY2UgYGZvcm1hdCcgZGV0YWlscy4KLQlUaGVzZSBhcmUgbm93IHNob3duIGJ5IGBwY2ZfZ2V0X2JpdG1hcHMnLgotCi0yMDE3LTAxLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYyAoUENGX0ZhY2VfSW5pdCk6IFRyYWNlIGNvbXByZXNzaW9uIGZvcm1hdC4KLQotMjAxNy0wMS0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gTW9yZSBjb25zaXN0ZW5jeSBjaGVja3MgZm9yIHB1cmUgQ0ZGcy4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTM3OAotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2ZvbnRfbG9hZCk6IENoZWNrIGVsZW1lbnQgbnVtYmVyIGFuZCBzaXplCi0Jb2YgTmFtZSBhbmQgVG9wIERJQ1QgaW5kaWNlcy4KLQotMjAxNy0wMS0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZiwgdHJ1ZXR5cGVdIE1pbm9yIHRyYWNpbmcgaW1wcm92ZW1lbnQuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KSwgc3JjL3RydWV0eXBlL3R0b2Jqcy5jCi0JKHR0X2ZhY2VfaW5pdCk6IEluZGVudCBmaXJzdCB0cmFjaW5nIG1lc3NhZ2UgZnJvbSBTRk5UIGRyaXZlci4KLQotMjAxNy0wMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBWYXJpb3VzIG1pbm9yIGZpeGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX1NpbXBsZV9HbHlwaCk6IENoZWNrIGluc3RydWN0aW9uCi0Jc2l6ZSBvbmx5IGlmIHdlIGRvIG5hdGl2ZSBoaW50aW5nLgotCShUVF9Mb2FkX0dseXBoKTogVHJhY2UgcmV0dXJuZWQgZXJyb3IgY29kZS4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX3J1bl9mcGdtLCB0dF9zaXplX3J1bl9wcmVwKTogVHJhY2UKLQlyZXR1cm5lZCBlcnJvciBjb2RlLgotCSh0dF9zaXplX3JlYWR5X2J5dGVjb2RlKTogRG9uJ3QgcnVuIGBwcmVwJyB0YWJsZSBpZiBgZnBnbScgdGFibGUgaXMKLQlpbnZhbGlkLgotCi0yMDE3LTAxLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRG9uJ3QgZmFpbCBpZiBQQ0xULCBFQkxDIChhbmQgc2ltaWxhciB0YWJsZXMpIGFyZSBpbnZhbGlkLgotCi0JVGhlc2UgdGFibGVzIGFyZSBvcHRpb25hbC4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogSW1wbGVtZW50IGl0LgotCi0yMDE3LTAxLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX251bSk6IFNpbXBsaWZ5LgotCi0yMDE3LTAxLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlWYXJpb3VzIGZpeGVzIGZvciBjbGFuZydzIHVuZGVmaW5lZCBiZWhhdmlvdXIgc2FuaXRpemVyLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoRlRfZmRvdDE0VG9GaXhlZCk6IEZpeCBjYXN0aW5nLgotCShjZmZfYmxlbmRfZG9CbGVuZCk6IERvbid0IGxlZnQtc2hpZnQgbmVnYXRpdmUgbnVtYmVycy4KLQlIYW5kbGUgNS1ieXRlIG51bWJlcnMgYnl0ZSBieSBieXRlIHRvIGF2b2lkIGFsaWdubWVudCBpc3N1ZXMuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX251bSk6IEhhbmRsZSA1LWJ5dGUgbnVtYmVycyBieXRlIGJ5Ci0JYnl0ZSB0byBhdm9pZCBhbGlnbm1lbnQgaXNzdWVzLgotCi0JKiBzcmMvY2lkL2NpZGxvYWQgKGNpZF9yZWFkX3N1YnJzKTogRG8gbm90aGluZyBpZiB3ZSBkb24ndCBoYXZlIGFueQotCXN1YnJzLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2RlX3BhcnNlX2NoYXJzdHJpbmcpOiBGaXggdHJhY2luZy4KLQotCSogc3JjL3Rvb2xzL2dsbmFtZXMucHkgKG1haW4pOiBQdXQgYERFRklORV9QU1RBQkxFUycgZ3VhcmQgYXJvdW5kCi0JZGVmaW5pdGlvbiBvZiBgZnRfZ2V0X2Fkb2JlX2dseXBoX2luZGV4Jy4KLQotCSogc3JjL3BzbmFtZXMvcHN0YWJsZXMuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmM6IEluY2x1ZGUgYHBzdGFibGVzLmgnIHR3aWNlIHRvIGdldCBib3RoCi0JZGVjbGFyYXRpb24gYW5kIGRlZmluaXRpb24uCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKEZUX2Zkb3QxNFRvRml4ZWQsIEZUX2ludFRvRml4ZWQpOiBGaXgKLQljYXN0aW5nLgotCi0yMDE3LTAxLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBIYW5kbGUgbXVsdGlwbGUgYGJsZW5kJyBvcGVyYXRvcnMgaW4gYSByb3cgY29ycmVjdGx5LgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzY4Ci0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfYmxlbmRfZG9CbGVuZCk6IEFkanVzdCBgcGFyc2VyLT5zdGFjaycKLQlwb2ludGVycyBpbnRvIGBzdWJGb250LT5ibGVuZF9zdGFjaycgYWZ0ZXIgcmVhbGxvY2F0aW9uLgotCi0yMDE3LTAxLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gUmV0dXJuIGNvcnJlY3QgbnVtYmVyIG9mIG5hbWVkIGluc3RhbmNlcyBmb3IgVFRDcy4KLQotCVdpdGhvdXQgdGhpcyBwYXRjaCwgcmVxdWVzdGluZyBpbmZvcm1hdGlvbiBmb3IgZmFjZSBpbmRleCBOIHJldHVybmVkCi0JdGhlIGRhdGEgZm9yIGZhY2UgaW5kZXggTisxIChvciBpbmRleCAwKS4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfaW5pdF9mYWNlKTogQ29ycmVjdGx5IGFkanVzdCBgZmFjZV9pbmRleCcKLQlmb3IgbmVnYXRpdmUgYGZhY2VfaW5zdGFuY2VfaW5kZXgnIHZhbHVlcy4KLQotMjAxNi0xMi0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKi8qOiBVc2UgaGV4IG51bWJlcnMgZm9yIGVycm9ycyBpbiB0cmFjaW5nIG1lc3NhZ2VzLgotCi0yMDE2LTEyLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIENoZWNrIGF4aXMgY291bnQgaW4gSFZBUiB0YWJsZS4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTM2MgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9odmFyKTogQ2hlY2sgYXhpcyBjb3VudC4KLQkoZnRfdmFyX2xvYWRfYXZhcik6IEZpeCB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMTYtMTItMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjcuMSByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTctMScuCi0KLQkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjcuMS4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNy8yLjcuMS8sIHMvMjcvMjcxLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTk6MDoxMy4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDEuCi0KLTIwMTYtMTItMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtmdGZ1enplcl0gUmVwbGFjZSBgcmFuZCcgd2l0aCBhbiB4b3JzaGlmdCBhbGdvcml0aG0uCi0KLQkqIHNyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYzogRG9uJ3QgaW5jbHVkZSBgc3RkbGliLmgnLgotCShSYW5kb20pOiBJbXBsZW1lbnQgYW5kIHVzZSBhIDMyYml0IGB4b3JzaGlmdCcgYWxnb3JpdGhtLgotCi0yMDE2LTEyLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZnRmdXp6ZXJdIFJlc3RyaWN0IG51bWJlciBvZiB0ZXN0ZWQgYml0bWFwIHN0cmlrZXMuCi0KLQlNYWxmb3JtZWQgZm9udHMgb2Z0ZW4gaGF2ZSBsYXJnZSB2YWx1ZXMgZm9yIHRoZSBudW1iZXIgb2YgYml0bWFwCi0Jc3RyaWtlcywgYW5kIEZyZWVUeXBlIGRvZXNuJ3QgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFsbCBiaXRtYXAKLQlzdHJpa2VzIGluIGFkdmFuY2UuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0zNTMKLQotCSogc3JjL3Rvb2xzL2Z0ZnV6emVyL2Z0ZnV6emVyLmNjOiBJbmNsdWRlIGBzdGRsaWIuaCcgZm9yIGByYW5kJy4KLQkoUmFuZG9tKTogU21hbGwgY2xhc3MgdG8gcHJvdmlkZSBuIHJhbmRvbWx5IHNlbGVjdGVkIG51bWJlcnMKLQkod2l0aG91dCByZXBldGl0aW9uKSBvdXQgb2YgdGhlIHZhbHVlIHNldCBbMSxOXS4KLQkoTExWTUZ1enplclRlc3RPbmVJbnB1dCk6IFVzZSBpdCB0byB0ZXN0IG9ubHkgdXAgdG8gMTAgYml0bWFwCi0Jc3RyaWtlcy4KLQotMjAxNi0xMi0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBWYXJpYXRpb24gZm9udCBBUEkgc3RhYmlsaXR5IGlzc3Vlcy4KLQotCU1ha2Ugc29tZSBmdW5jdGlvbnMgd29yayBiZWZvcmUgYSBjYWxsIHRvIGBUVF9TZXRfTU1fQmxlbmQnLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9oYWR2YW5jZV9hZGp1c3QpOiBFeGl0IGltbWVkaWF0ZWx5IGlmCi0Jd2UgZG9uJ3QgYmxlbmQuCi0JKFRUX0dldF9NTV9CbGVuZCwgVFRfR2V0X1Zhcl9EZXNpZ24pOiBSZXR1cm4gZGVmYXVsdCB2YWx1ZXMgaWYgd2UKLQlkb24ndCBibGVuZC4KLQotMjAxNi0xMi0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9HZXRfTU1fVmFyKTogQ2hlY2sgYXhpcyBkYXRhLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzQ4Ci0KLTIwMTYtMTItMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gVHJhY2luZyBmaXhlcy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfaGFkdmFuY2VfYWRqdXN0KTogRW1pdCBjb3JyZWN0Ci0JaW5mb3JtYXRpb24uCi0JKFRUX1NldF9WYXJfRGVzaWduKTogRml4IHR5cG8uCi0JKFRUX0dldF9WYXJfRGVzaWduKTogRml4IHR5cG9zLgotCi0yMDE2LTEyLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqLyo6IFVzZSBgMC41ZicgZm9yIHRyYWNpbmcgMTYuMTYgbnVtYmVycy4KLQotMjAxNi0xMi0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gUHJvdGVjdCBhZ2FpbnN0IGd6aXAgYm9tYnMuCi0KLQlGaXggc3VnZ2VzdGVkIGJ5IEtvc3R5YTsgcmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzQ1Ci0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfcmVhZF9UT0MpOiBMaW1pdCBudW1iZXIgb2YgVE9DIGVudHJpZXMgdG8KLQkxMDI0LgotCi0yMDE2LTEyLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNuYW1lc10gT25seSBkZWNsYXJlLCBub3QgZGVmaW5lLCBkYXRhIGluIGBwc3RhYmxlcy5oJyAoIzQ5OTQ5KS4KLQotCVBkZml1bSBpbmNsdWRlcyBgcHN0YWJsZXMuaCcgYSBzZWNvbmQgdGltZTsgbW92aW5nIHRoZSBkZWZpbml0aW9uCi0JZnJvbSBgcHN0YWJsZXMuaCcgdG8gYHBzbW9kdWxlLmMnIHNhdmVzIG1vcmUgdGhhbiA2MGtCeXRlIGRhdGEKLQlzZWdtZW50IHNwYWNlIGZvciB0aGlzIGNhc2UuCi0KLQkqIHNyYy90b29scy9nbG5hbWVzLnB5IChTdHJpbmdUYWJsZTo6ZHVtcCwKLQlTdHJpbmdUYWJsZTo6ZHVtcF9zdWJsaXN0LCBkdW1wX2VuY29kaW5nLCBkdW1wX2FycmF5KTogRW1pdAotCWFkZGl0aW9uYWwgY29kZSB0byBvbmx5IGRlZmluZSB0YWJsZXMgaWYgYERFRklORV9QU19UQUJMRVMnIGlzIHNldC4KLQotCSogc3JjL3BzbmFtZXMvcHN0YWJsZXMuaDogUmVnZW5lcmF0ZWQuCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jIChERUZJTkVfUFNfVEFCTEVTKTogRGVmaW5lLgotCi0yMDE2LTEyLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBDYXRjaCBgYmxlbmQnIG9wIGluIG5vbi12YXJpYW50IGZvbnRzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzM0Ci0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9jbWRCTEVORD46IERvbid0Ci0JYWxsb3cgYGJsZW5kJyBvcCBmb3Igbm9uLXZhcmlhbnQgZm9udHMuCi0KLTIwMTYtMTItMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEJldHRlciBjaGVjayBvZiBudW1iZXIgb2YgYmxlbmRzLgotCi0JKiBzcmMvY2ZmL2NmMmludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfY21kQkxFTkQ+LAotCXNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX2JsZW5kKTogQ29tcGFyZSBudW1iZXIgb2YgYmxlbmRzIHdpdGgKLQlzdGFjayBzaXplLgotCi0yMDE2LTEyLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlEb2N1bWVudGF0aW9uIHVwZGF0ZXMuCi0KLQkqIGRvY3MvQ0hBTkdFUzogQWRkIG1pc3NpbmcgaW5mb3JtYXRpb24uCi0KLQkqIGRvY3MvZm9ybWF0cy50eHQ6IFJld3JpdHRlbiBhbmQgdXBkYXRlZC4KLQotMjAxNi0xMi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlLCB0eXBlMV0gSW1wbGVtZW50IGBGVF9HZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcycuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9WYXJfRGVzaWduKTogSW1wbGVtZW50LgotCShUVF9TZXRfVmFyX0Rlc2lnbik6IEZpeCB0cmFjaW5nLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKFQxX0dldF9WYXJfRGVzaWduKTogSW1wbGVtZW50LgotCi0yMDE2LTEyLTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfbG9hZF9oZG14KTogSWdub3JlIGB2ZXJzaW9uJy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkg5by15L+K6IqdIDw0MTgwOTI2MjVAcXEuY29tPi4KLQotMjAxNi0xMi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAodHRfZmFjZV9sb2FkX3NiaXQpOiBBbGxvdyBtb3JlIHZlcnNpb24gdmFsdWVzLgotCi0JU29tZSBmb250cyBzZWVtIHRvIGhhdmUgdGhlIGB2ZXJzaW9uJyBmaWVsZCBpbiB0aGUgd3JvbmcgYnl0ZSBvcmRlci4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkg5by15L+K6IqdIDw0MTgwOTI2MjVAcXEuY29tPi4KLQotMjAxNi0xMi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2xvYWRfbG9jYSk6IFNhbml0aXplIHRhYmxlIGxlbmd0aC4KLQotCVRoaXMgdHJpdmlhbCBmaXggYWxsb3dzIHVzIHRvIGFjY2VwdCBtb3JlIGZvbnRzLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSDlvLXkv4roip0gPDQxODA5MjYyNUBxcS5jb20+LgotCi0yMDE2LTEyLTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IEZpeCB0cmFjaW5nLgotCi0yMDE2LTEyLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIENNYWtlTGlzdHMudHh0OiBNYWtlIGl0IHdvcmsgd2l0aCBjbWFrZSAyLjguMTEuMiAoIzQ5OTA5KS4KLQotMjAxNi0xMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRW5zdXJlIHVzZWQgcHJlcHJvY2Vzc29yIHN5bWJvbHMgYXJlIGRlZmluZWQgKCM0OTc5MCkuCi0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluLCBidWlsZHMvdm1zL2Z0Y29uZmlnLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogQ2hlY2sgYF9fR05VQ19fJywgYF9fSUJNQ19fJywKLQlhbmQgYF9fU1VOUFJPX0MnIGNvcnJlY3RseS4KLQotMjAxNi0xMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzKTogQ2hlY2sgYGNvdW50Jy4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTMwOAotCi0yMDE2LTEyLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBgdnNpbmRleCcgYW5kIGBibGVuZCcgdmFsdWVzLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1Ci0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9jbWRWU0lOREVYLAotCWNmMl9jbWRCTEVORD46IEltcGxlbWVudCBpdC4KLQotMjAxNi0xMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Z0ZnV6emVyXSBBbHdheXMgdXNlIEFkb2JlIENGRiBlbmdpbmUuCi0KLQkqIHNyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYyAoRlRfR2xvYmFsOjpGVF9HbG9iYWwpOiBJbXBsZW1lbnQKLQlpdC4KLQotMjAxNi0xMi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IFRoaW5rby4KLQotCUkgc2hvdWxkIHJlYWxseSBzdG9wIGNvZGluZyBsYXRlIGluIHRoZSBldmVuaW5nLi4uCi0KLQlUaGFua3MgYWdhaW4gdG8gQmVuIGZvciBjaGVja2luZy4KLQotMjAxNi0xMi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFN1cHBvcnQgdmFyaWF0aW9uIGZvbnRzLgotCi0JKFRoaXMgQ2hhbmdlTG9nIGVudHJ5IHdhcyBhZGRlZCBsYXRlciBvbi4pCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19mcmVlKTogUmVtb3ZlIHVzZWxlc3MKLQljb2RlLgotCi0JKiBzcmMvYmFzZS9mdG1tLmMgKEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMsCi0JKiBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcywgRlRfU2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzLAotCUZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMpOiBGaW5hbGl6ZQotCWF1dG8taGludGVyIGRhdGEgdG8gZW5mb3JjZSByZWNvbXB1dGF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgaXMgYQotCWJydXRlLWZvcmNlIG1ldGhvZCB3aGljaCBzaG91bGQgYmUgaW1wcm92ZWQuCi0KLTIwMTYtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBUaGlua28uCi0KLQlEb24ndCBhcHBseSBkZWx0YXMgdHdpY2UgZm9yIG5vbi1waGFudG9tIHBvaW50cy4KLQotCVNwb3R0ZWQgYnkgQmVuIFdhZ25lci4KLQotMjAxNi0xMi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZiwgdHJ1ZXR5cGVdIEFub3RoZXIgdHJ5IGZvciAjNDk4MjkuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYzogRG9uJ3QgaW5jbHVkZQotCWBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19IJy4KLQkoY2ZmX2dldF9hZHZhbmNlcyk6IFVzZSBgdHRmYWNlLT52YXJpYXRpb25fc3VwcG9ydCcuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9nZXRfYWR2YW5jZXMpOiBVc2UKLQlgdHRmYWNlLT52YXJpYXRpb25fc3VwcG9ydCcuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoLAotCWxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBVc2UgYHR0ZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQnLgotCi0yMDE2LTEyLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGUsIHNmbnRdIEludHJvZHVjZSBmb250IHZhcmlhdGlvbiBmbGFncyB0byBgVFRfRmFjZScuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GQUNFX0ZMQUdfVkFSX1hYWCk6Ci0JTmV3IG1hY3JvcyBkZXNjcmliaW5nIGF2YWlsYWJsZSBmdW5jdGlvbmFsaXR5IG9mIHZhcmlvdXMgT3BlblR5cGUKLQl0YWJsZXMgcmVsYXRlZCB0byBmb250IHZhcmlhdGlvbi4KLQkoVFRfRmFjZSk6IE5ldyBmaWVsZHMgYHZhcmlhdGlvbl9zdXBwb3J0JyBhbmQgYG12YXJfc3VwcG9ydCcsCi0JcmVwbGFjaW5nIGFuZCBleHRlbmRpbmcgYHVzZV9mdmFyJy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfaW5pdF9mYWNlLCBzZm50X2xvYWRfZmFjZSk6IFVzZQotCWB2YXJpYXRpb25fc3VwcG9ydCcuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9sb2FkX2h2YXIpOiBTZXQgYHZhcmlhdGlvbl9zdXBwb3J0JwotCWZpZWxkLgotCShUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IFVwZGF0ZWQuCi0KLTIwMTYtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBJbXByb3ZlIHNhbml0eSBjaGVjayBmb3IgTWFjIHJlc291cmNlcyAoIzQ5ODg4KS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX3NmbnRfUmVzb3VyY2UpOiBBYm9ydCBpZiBgcmxlbicgaXMgbm90Ci0JcG9zaXRpdmUuCi0KLTIwMTYtMTItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBNb3JlIHNhbml0eSBjaGVja3MgZm9yIE1hYyByZXNvdXJjZXMuCi0KLQlXZSB1c2UKLQotCSAgaHR0cHM6Ly9naXRodWIuY29tL2tyZWF0aXZla29ycC9rc2ZsL3dpa2kvTWFjaW50b3NoLVJlc291cmNlLUZpbGUtRm9ybWF0Ci0KLQlhbmQKLQotCSAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xlZ2FjeS9saWJyYXJ5L2RvY3VtZW50YXRpb24vbWFjL3BkZi9Nb3JlTWFjaW50b3NoVG9vbGJveC5wZGYjcGFnZT0xNTEKLQotCWFzIHJlZmVyZW5jZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oIChGVF9SRm9ya19SZWYpOiBVc2UgRlRfU2hvcnQKLQlmb3IgYHJlc19pZCcuCi0KLQkqIHNyYy9iYXNlL2Z0cmZvcmsuYyAoRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyk6IEV4dHJhY3QgbWFwIGxlbmd0aAotCWFuZCB1c2UgaXQgdG8gaW1wcm92ZSBzYW5pdHkgY2hlY2tzLgotCUZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBtb3JlIGNsb3NlbHk7aW4gcGFydGljdWxhciwgYWxsIGRhdGEgdHlwZXMKLQlhcmUgc2lnbmVkLCBub3QgdW5zaWduZWQuCi0JKEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzKTogRm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIG1vcmUgY2xvc2VseTsKLQlpbiBwYXJ0aWN1bGFyLCBhbGwgZGF0YSB0eXBlcyBhcmUgc2lnbmVkLCBub3QgdW5zaWduZWQuCi0JQWRkIHNvbWUgc2FuaXR5IGNoZWNrcy4KLQotMjAxNi0xMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJbXByb3ZlIGxvZ2ljIGZvciBnZXR0aW5nIGZhc3QgYWR2YW5jZSB3aWR0aHMuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9hZHZhbmNlcyksIHNyYy90cnVldHlwZS90dGRyaXZlci5jCi0JKHR0X2dldF9hZHZhbmNlcyk6IFVzZSBgaXNfZGVmYXVsdF9pbnN0YW5jZScgZm9yIHRlc3Q7IHRoaXMgZ2V0cwotCXJlY29tcHV0ZWQgYWZ0ZXIgY2hhbmdpbmcgYmxlbmQgY29vcmRpbmF0ZXMuCi0KLTIwMTYtMTItMjAgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBsaW5lYXIgbWV0cmljcyBvZiBHWCB2YXJpYXRpb24gZm9udHMgKCM0OTgyOSkuCi0KLQlXaGVuIGFza2luZyBmb3IgYW4gdW5oaW50ZWQgbm9uLWRlZmF1bHQgdmFyaWF0aW9ucywKLQlgbGluZWFyVmVydEFkdmFuY2UnIGlzIGN1cnJlbnRseSB0aGUgdmFsdWUgZnJvbSB0aGUgYGhtdHgnIHRhYmxlCi0JaW5zdGVhZCBvZiB0aGUgYWN0dWFsIHZhbHVlIGFmdGVyIGFwcGx5aW5nIHRoZSB2YXJpYXRpb24uICBgSFZBUicKLQlzdXBwb3J0IGZpeGVzIHRoaXMsIGJ1dCBmb250cyB3aWxsIGV4aXN0IHdpdGhvdXQgdGhhdCB0YWJsZSBhbmQgd2lsbAotCW5lZWQgc2FuZSBmYWxsYmFjay4KLQotCVByb2JsZW0gYWxzbyByZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avc2tpYS9pc3N1ZXMvZGV0YWlsP2lkPTU5MTcKLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgsCi0JbG9hZF90cnVldHlwZV9nbHlwaCk6IEltcGxlbWVudCBsaW5lYXIgYWR2YW5jZSBhZGp1c3RtZW50cyBpZiBgSFZBUicKLQlvciBgVlZBUicgdGFibGVzIGFyZSBtaXNzaW5nLgotCi0yMDE2LTEyLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmLCB0cnVldHlwZV0gRmFzdCBhZHZhbmNlIHdpZHRoIHJldHJpZXZhbCBmb3IgZm9udHMgd2l0aCBIVkFSLgotCi0JRXZlcnl0aGluZyBpcyBndWFyZGVkIHdpdGggVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVC4KLQotCSogc3JjL2Jhc2UvZnRhZHZhbmMuYyAoTE9BRF9BRFZBTkNFX0ZBU1RfQ0hFQ0spOiBEb24ndCBoYW5kbGUgTU0uCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYzogSW5jbHVkZSBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19ILgotCShjZmZfZ2V0X2FkdmFuY2VzKTogVGVzdCBmb3IgSFZBUiBhbmQgVlZBUi4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X2dldF9hZHZhbmNlcyk6IFRlc3QgZm9yIEhWQVIgYW5kIFZWQVIuCi0KLTIwMTYtMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBGaXggaW52YWxpZCBtYWMgZm9udCByZWN1cnNpb24uCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0zMDQKLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX09wZW5fRmFjZSk6IENvZGUgbW92ZWQgdG8uLi4KLQkoZnRfb3Blbl9mYWNlX2ludGVybmFsKTogLi4uIHRoaXMgZnVuY3Rpb24uCi0JQWRkIGEgcGFyYW1ldGVyIHRvIGNvbnRyb2wgd2hldGhlciB3ZSB0cnkgc3BlY2lhbCBNYWMgZm9udCBoYW5kbGluZwotCWluIGNhc2Ugb2YgZmFpbHVyZS4KLQkoRlRfT3Blbl9GYWNlLCBGVF9OZXdfRmFjZSwgRlRfTmV3X01lbW9yeV9GYWNlLAotCW9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IFVzZSBgZnRfb3Blbl9mYWNlX2ludGVybmFsJy4KLQotMjAxNi0xMi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IE1ha2UgbmFtZWQgaW5zdGFuY2VzIHdvcmsuCi0KLTIwMTYtMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZSwgY2ZmXSBFeHRlbmQgYGdldF92YXJfYmxlbmQnIGZ1bmN0aW9uIG9mIE1NIHNlcnZpY2UuCi0KLQlJbiBwYXJ0aWN1bGFyLCB3ZSBuZWVkIGFjY2VzcyB0byBuYW1lZCBpbnN0YW5jZSBkYXRhLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaCAoRlRfR2V0X1Zhcl9CbGVuZF9GdW5jKToKLQlBZGQgYXJndW1lbnQgZm9yIGBGVF9NTV9WYXInLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2dldF92YXJfYmxlbmQpOiBVcGRhdGVkLgotCSogc3JjL2NmZi9jZmZsb2FkLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2YyZnQuYyAoY2YyX2dldE5vcm1hbGl6ZWRWZWN0b3IpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9nZXRfdmFyX2JsZW5kKTogVXBkYXRlZC4KLQlBY2NlcHQgdmFsdWUgYE5VTEwnIGZvciBhcmd1bWVudHMuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oOiBVcGRhdGVkLgotCi0yMDE2LTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSGFuZGxlIGBmdmFyJyB3aXRoIHplcm8gYXhlcyBhcyBhIG5vbi1NTSBmb250LgotCi0JVGhpcyBpcyBiZXR0ZXIgYmVoYXZpb3VyIHRoYW4gZXhpdGluZyB3aXRoIGFuIGVycm9yLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZSk6IEFkZCBgdXNlX2Z2YXInCi0JZmllbGQuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IENvbXB1dGUgYHVzZV9mdmFyJywgYWxzbwotCXVwZGF0aW5nIHRoZSB2YWxpZGF0aW9uIGNvZGUuCi0JVXNlIGB1c2VfZnZhcicgdG8gY29tcHV0ZSBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X01NX1Zhcik6IFJlbW92ZSBgZnZhcicgdmFsaWRhdGlvbgotCWNvZGUuCi0KLTIwMTYtMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1pbm9yIEdYIGNvZGUgc2h1ZmZsaW5nLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZSk6IE1vdmUKLQlgaXNfZGVmYXVsdF9pbnN0YW5jZScgaW50byBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0JYmxvY2suCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IFVwZGF0ZWQuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChJU19ERUZBVUxUX0lOU1RBTkNFKTogTmV3IG1hY3JvLgotCShUVF9Mb2FkX0dseXBoKTogVXNlIGl0LgotCi0yMDE2LTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBCZXR0ZXIgaGFuZGxpbmcgb2Ygbm9uLUNGRiBmb250IGZvcm1hdHMuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfZm9udF9sb2FkKTogUHVyZSBDRkZzIGRvbid0IGhhdmUgYQotCXNpZ25hdHVyZSwgc28gcmV0dXJuIGBGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdCcgbW9yZSBvZnRlbi4KLQotMjAxNi0xMi0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2J1aWxkX2JsZW5kX3ZlY3Rvcik6IFJlbW92ZSByZWR1bmRhbnQgY29kZS4KLQotMjAxNi0xMi0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2ZhY2VfaW5pdCk6IFNpbXBsaWZ5IGNvbmRpdGlvbmFsIGNvZGUuCi0KLTIwMTYtMTItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50LCB0cnVldHlwZV0gVmFyaW91cyBzYW5pdGl6aW5nIGZpeGVzLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9pbml0X2ZhY2UpOiBJZiB0aGUgYXhpcyBjb3VudCBpbiBgZnZhcicgaXMKLQl6ZXJvLCBzZXQgYG51bV9pbnN0YW5jZXMnIHRvIHplcm8uCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBIYW5kbGUgYGZ2YXInIHRhYmxlIHdpdGgKLQl6ZXJvIGF4ZXMgYXMgaW52YWxpZC4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpOiBJbXByb3ZlIGxvZ2ljIG9mIGxvYWRpbmcKLQlgbG9jYScsIGBjdnQnLCBgZnBnbScsIGFuZCBgcHJlcCcgdGFibGUuCi0KLTIwMTYtMTItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUltcHJvdmUgdHJhY2luZyBvZiBgRlRfT3Blbl9GYWNlJy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX09wZW5fRmFjZSk6IFJldHVybiBpbmZvIG9uIG51bWJlciBvZgotCWF2YWlsYWJsZSBmYWNlcyBhbmQgbnVtYmVyZWQgaW5zdGFuY2VzLCBvciB0aGUgaW5kaWNlcyBvZiB0aGUKLQlyZXF1ZXN0ZWQgZmFjZSBhbmQgbnVtYmVyZWQgaW5zdGFuY2UuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy4gKHNmbnRfb3Blbl9mb250KTogVHJhY2UgbnVtYmVyIG9mIHN1YmZvbnRzLgotCi0yMDE2LTEyLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfbG9hZF9wcml2YXRlX2RpY3QpOiBBbHdheXMgaW5pdCBgYmxlbmQnLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9Mjk1Ci0KLTIwMTYtMTItMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IGBjdmFyJyBzYW5pdHkgdGVzdC4KLQotCVJlcG9ydGVkIGJ5IERhdmUgQXJub2xkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9mYWNlX3ZhcnlfY3Z0KTogVXNlIHR1cGxlIGNvdW50IG1hc2suCi0KLTIwMTYtMTItMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmYsIHRydWV0eXBlXSBSZW1vdmUgY29tcGlsZXIgd2FybmluZ3M7IGZpeCBgbWFrZSBtdWx0aScuCi0KLQkqIHNyYy9jZmYvY2YyZm9udC5oOiBJbmNsdWRlIGBjZmZsb2FkLmgnLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYzogSW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0ggYW5kCi0JRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0guCi0JKGNmZl92c3RvcmVfbG9hZCk6IEVsaW1pbmF0ZSBgdnNTaXplJy4KLQkoY2ZmX2xvYWRfcHJpdmF0ZV9kaWN0KTogVGFnIGFzIGBGVF9MT0NBTF9ERUYnLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuaDogSW5jbHVkZSBgY2Zmb2Jqcy5oJy4KLQlQcm92aWRlIGRlY2xhcmF0aW9uIGZvciBgY2ZmX2xvYWRfcHJpdmF0ZV9kaWN0Jy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX2xvYWRfaHZhcik6IEVsaW1pbmF0ZQotCWBtaW5vclZlcnNpb24nIGFuZCBgbWFwX29mZnNldCcuCi0KLTIwMTYtMTItMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBoZWFwIGJ1ZmZlciBvdmVyZmxvdyAoIzQ5ODU4KS4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VyX3J1bik6IEFkZCBvbmUgbW9yZSBzdGFjayBzaXplCi0JY2hlY2suCi0KLTIwMTYtMTItMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjbGFuZyB3YXJuaW5ncy4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9ibGVuZF9kb0JsZW5kKTogQWRkIGNhc3QuCi0JKGNmZl9zdWJmb250X2xvYWQpOiBTZXQgYGVycm9yJyBjb3JyZWN0bHkuCi0KLQkqIHNyYy9zZm50L3R0bXR4LmMgKHR0X2ZhY2VfZ2V0X21ldHJpY3MpOiBUeXBvLgotCi0yMDE2LTEyLTE1ICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBJbXBsZW1lbnQgQ0ZGMiBzdXBwb3J0ICgyLzIpLgotCi0JVGhlIGZvbnQgdmFyaWF0aW9uIGNvZGUuICBBbGwgcGFydHMgZGVwZW5kZW50IG9uIHRoZSBHWCBjb2RlIGluIHRoZQotCWB0cnVldHlwZScgbW9kdWxlIGFyZSBndWFyZGVkIHdpdGggVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVC4KLQlJbiBvdGhlciB3b3JkcywgeW91IGNhbiBzdGlsbCBjb21waWxlIHRoZSBgY2ZmJyBtb2R1bGUgd2l0aG91dAotCWRlZmluaW5nIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKHdoaWNoIGJyaW5ncyB5b3UgQ0ZGMgotCXN1cHBvcnQgd2l0aG91dCBmb250IHZhcmlhdGlvbikuCi0KLQkqIHNyYy9jZmYvY2YyZm9udC5jIChjZjJfZm9udF9zZXR1cCk6IEFkZCBzdXBwb3J0IGZvciBmb250Ci0JdmFyaWF0aW9uLgotCSogc3JjL2NmZi9jZjJmb250LmggKENGMl9Gb250KTogQWRkIGZpZWxkcyBmb3IgdmFyaWF0aW9uIGRhdGEuCi0KLQkqIHNyYy9jZmYvY2YyZnQuYyAoY2YyX2ZyZWVfaW5zdGFuY2UpOiBGcmVlIGJsZW5kIGRhdGEuCi0JKGNmMl9nZXRWU3RvcmUsIGNmMl9nZXROb3JtYWxpemVkVmVjdG9yKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNyYy9jZmYvY2YyZnQuaDogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZjJpbnRycC5jOiBJbmNsdWRlIGBjZmZsb2FkLmgnLgotCShjZjJfY21kUkVTRVJWRURfMTUsIGNmMl9jbWRSRVNFUlZFRF8xNik6IFJlcGxhY2Ugd2l0aC4uLgotCShjZjJfY21kVlNJTkRFWCwgY2YyX2NtZEJMRU5EKTogLi4uIHRoaXMgbmV3IGVudW0gdmFsdWVzLgotCShjZjJfZG9CbGVuZCk6IE5ldyBmdW5jdGlvbi4KLQkoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IEhhbmRsZSBgdnNpbmRleCcgYW5kIGBibGVuZCcgb3Bjb2Rlcy4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKEZUX2Zkb3QxNFRvRml4ZWQpOiBOZXcgbWFjcm8uCi0JKGNmZl92c3RvcmVfZG9uZSwgY2ZmX3ZzdG9yZV9sb2FkKTogTmV3IGZ1bmN0aW9ucy4KLQkoY2ZmX2JsZW5kX2NsZWFyLCBjZmZfYmxlbmRfZG9CbGVuZCwgY2ZmX2JsZW5kX2J1aWxkX3ZlY3RvciwKLQljZmZfYmxlbmRfY2hlY2tfdmVjdG9yKTogTmV3IGZ1bmN0aW9ucy4KLQkoY2ZmX2xvYWRfcHJpdmF0ZV9kaWN0KTogQWRkIGFyZ3VtZW50cyBmb3IgYmxlbmQgdmVjdG9yLgotCUhhbmRsZSBibGVuZCBkYXRhLgotCShjZmZfc3ViZm9udF9sb2FkLCBjZmZfc3ViZm9udF9kb25lKTogVXBkYXRlZC4KLQkoY2ZmX2ZvbnRfbG9hZCk6IEhhbmRsZSBDRkYyIHZhcmlhdGlvbiBzdG9yZSBkYXRhLgotCShjZmZfZm9udF9kb25lKTogVXBkYXRlZC4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5oOiBJbmNsdWRlIGBjZmZwYXJzZS5oJy4KLQlVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfZG9uZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYzogSW5jbHVkZSBgY2ZmbG9hZC5oJy4KLQkoY2ZmX3BhcnNlX251bSk6IEhhbmRsZSBpbnRlcm5hbCB2YWx1ZSAyNTUuCi0JKGNmZl9wYXJzZV92c2luZGV4LCBjZmZfcGFyc2VfYmxlbmQpOiBOZXcgZnVuY3Rpb25zLgotCShDRkZfRklFTERfQkxFTkQpOiBOZXcgbWFjcm8uCi0JKGNmZl9wYXJzZXJfcnVuKTogVXBkYXRlZC4KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuaCAoY2ZmX2tpbmRfYmxlbmQpOiBOZXcgZW51bSB2YWx1ZS4KLQotCSogc3JjL2NmZi9jZmZ0b2tlbi5oOiBIYW5kbGUgYHZzdG9yZScsIGB2c2luZGV4JywgYW5kIGBibGVuZCcKLQlkaWN0aW9uYXJ5IHZhbHVlcy4KLQotCSogc3JjL2NmZi9jZmZ0eXBlcy5oIChDRkZfVmFyRGF0YSwgQ0ZGX0F4aXNDb29yZHMsIENGRl9WYXJSZWdpb24sCi0JQ0ZGX1ZTdG9yZSwgQ0ZGX0JsZW5kKTogTmV3IHN0cnVjdHVyZXMuCi0JKENGRl9Gb250UmVjRGljdCk6IEFkZCBgdnN0b3JlX29mZnNldCcgZmllbGQuCi0JKENGRl9Qcml2YXRlKTogQWRkIGB2c2luZGV4JyBmaWVsZC4KLQkoQ0ZGX1N1YkZvbnQpOiBBZGQgZmllbGRzIGZvciBibGVuZCBkYXRhLgotCShDRkZfRm9udCk6IEFkZCBgdnN0b3JlJyBmaWVsZC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X01NX1Zhcik6IGBDRkYyJyBpcyBlcXVhbCB0byBgZ3ZhcicsCi0Jc2luY2UgZ2x5cGggdmFyaWF0aW9uIGRhdGEgaXMgZGlyZWN0bHkgZW1iZWRkZWQuCi0JKFRUX1NldF9NTV9CbGVuZCk6IERvbid0IGxvYWQgYGd2YXInIHRhYmxlIGZvciBDRkYyIGZvbnRzLgotCi0yMDE2LTEyLTE1ICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBJbXBsZW1lbnQgQ0ZGMiBzdXBwb3J0ICgxLzIpLgotCi0JVGhpcyBjb21taXQgZG9lcyBub3QgY29udGFpbiB0aGUgYmxlbmQgY29kZSBmb3IgZm9udCB2YXJpYXRpb24KLQlzdXBwb3J0LCB3aGljaCBmb2xsb3dzIGluIGFub3RoZXIgY29tbWl0LgotCi0JWW91IHNob3VsZCBpZ25vcmUgd2hpdGVzcGFjZSB3aGlsZSBpbnNwZWN0aW5nIHRoaXMgY29tbWl0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZSk6IEFkZCBgaXNDRkYyJwotCW1lbWJlci4KLQotCSogc3JjL2NmZi9jZjJmb250LmggKENGMl9Gb250KTogQWRkIGBpc0NGRjInIG1lbWJlci4KLQotCSogc3JjL2NmZi9jZjJmdC5jIChjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IEhhbmRsZSBgaXNDRkYyJwotCWZsYWcuCi0JKGNmMl9nZXRNYXhzdGFjayk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy9jZmYvY2YyZnQuaDogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZjJpbnRycC5jIChjZjJfZXNjUkVTRVJWRURfMzgpOiBOZXcgZW51bS4KLQkoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IEhhbmRsZSBDRkYyIGRpZmZlcmVuY2VzLgotCUFkZCB0cmFjaW5nIG1lc3NhZ2UgZm9yIGVycm9ycy4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X2dseXBoX25hbWUsIGNmZl9nZXRfbmFtZV9pbmRleCk6Ci0JVXBkYXRlIGZvciBDRkYyLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoRlRfRklYRURfT05FKTogTmV3IG1hY3JvLgotCShjZmZfaW5kZXhfaW5pdCwgY2ZmX2luZGV4X2xvYWRfb2Zmc2V0cywgY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50LAotCWNmZl9pbmRleF9nZXRfbmFtZSwgY2ZmX2Z0X3NlbGVjdF9nZXQsIGNmZl9sb2FkX3ByaXZhdGVfZGljdCwKLQljZmZfc3ViZm9udF9sb2FkLCBjZmZfZm9udF9sb2FkKTogSGFuZGxlIENGRjIuCi0JKiBzcmMvY2ZmL2NmZmxvYWQuaDogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBIYW5kbGUgQ0ZGMi4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfbWF4c3RhY2spOiBOZXcgZnVuY3Rpb24uCi0JKENGRkNPREVfVE9QRElDVCwgQ0ZGQ09ERV9QUklWQVRFKTogUmVtb3ZlZAotCSogc3JjL2NmZi9jZmZwYXJzZS5oIChDRkYyX01BWF9TVEFDSywgQ0ZGMl9ERUZBVUxUX1NUQUNLKTogTmV3Ci0JbWFjcm9zLgotCShDRkYyX0NPREVfVE9QRElDVCwgQ0ZGMl9DT0RFX0ZPTlRESUNULCBDRkYyX0NPREVfUFJJVkFURSk6IE5ldwotCW1hY3Jvcy4KLQotCSogc3JjL2NmZi9jZmZ0b2tlbi5oOiBBZGQgZmllbGRzIGZvciBDRkYyIGRpY3Rpb25hcmllcyAoYnV0IG5vIGJsZW5kCi0Jc3R1ZmYpLgotCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9JbmRleCk6IEFkZCBgaGRyX3NpemUnIGZpZWxkLgotCShDRkZfRm9udFJlY0RpY3QpOiBBZGQgYG1heHN0YWNrJyBmaWVsZC4KLQkoQ0ZGX1ByaXZhdGUpOiBBZGQgYHN1YmZvbnQnIGZpZWxkLgotCShDRkZfRm9udCk6IEFkZCBgdG9wX2RpY3RfbGVuZ3RoJyBhbmQgYGNmZjInIGZpZWxkcy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogSGFuZGxlIGBDRkYyJyB0YWJsZS4KLQotMjAxNi0xMi0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCSAgICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCi0JW3RydWV0eXBlXSBQcm92aWRlIEhWQVIgYWR2YW5jZSB3aWR0aCB2YXJpYXRpb24gYXMgYSBzZXJ2aWNlLgotCi0JRXZlcnl0aGluZyBpcyBndWFyZGVkIHdpdGggVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVC4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X3NlcnZpY2VfbWV0cmljc192YXJpYXRpb25zKTogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBQcmV2ZW50Ci0JZG91YmxlIGFkanVzdG1lbnQgb2YgYWR2YW5jZSB3aWR0aC4KLQotCSogc3JjL3NmbnQvdHRtdHguYzogSW5jbHVkZSBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19ILgotCSh0dF9mYWNlX2dldF9tZXRyaWNzKTogQXBwbHkgbWV0cmljcyB2YXJpYXRpb25zLgotCi0yMDE2LTEyLTE1ICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFByb3ZpZGUgZnVuY3Rpb24gdG8gYXBwbHkgYEhWQVInIGFkdmFuY2Ugd2lkdGggdmFyaWF0aW9uLgotCi0JRXZlcnl0aGluZyBpcyBndWFyZGVkIHdpdGggVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfaGFkdmFuY2VfYWRqdXN0KTogTmV3IGZ1bmN0aW9uLgotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuaDogVXBkYXRlZC4KLQotMjAxNi0xMi0xNSAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBBZGQgYEhWQVInIHRhYmxlIHBhcnNpbmcuCi0KLQlOb3RlIHRoYXQgdGhpcyBpcyBub3QgY29tcGxldGUgeWV0OyBpdCBvbmx5IGhhbmRsZXMgYWR2YW5jZSB3aWR0aAotCXZhcmlhdGlvbi4KLQotCUFjdGl2YXRpb24gb2YgdGhlIGNvZGUgZm9sbG93cyBpbiBhbm90aGVyIGNvbW1pdC4KLQotCUV2ZXJ5dGhpbmcgaXMgZ3VhcmRlZCB3aXRoIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtbS5oIChGVF9WYXJfTmFtZWRfU3R5bGUpOiBBZGQgYHBzaWQnIG1lbWJlci4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuaCAoR1hfSFZhckRhdGEsIEdYX0F4aXNDb29yZHMsIEdYX0hWYXJSZWdpb24sCi0JR1hfSFZTdG9yZSwgR1hfV2lkdGhNYXApOiBOZXcgYXV4aWxpYXJ5IHN0cnVjdHVyZXMgZm9yLi4uCi0JKEdYX0hWYXJUYWJsZSk6IC4uLiBIVkFSIG1haW4gc3RydWN0dXJlLgotCShHWF9CbGVuZFJlYyk6IEFkZCBkYXRhIGZvciBIVkFSIGxvYWRpbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKEZUX0ZJWEVEX09ORSwgRlRfZmRvdDE0VG9GaXhlZCwKLQlGVF9pbnRUb0ZpeGVkLCBGVF9maXhlZFRvSW50KTogTmV3IG1hY3Jvcy4KLQkoZnRfdmFyX2xvYWRfaHZhcik6IE5ldyBmdW5jdGlvbi4KLQkoVFRfR2V0X01NX1Zhcik6IFVwZGF0ZWQuCi0JKHR0X2RvbmVfYmxlbmQpOiBEZWFsbG9jYXRlIEhWQVIgZGF0YS4KLQotMjAxNi0xMi0xNSAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCVtjZmZdIEV4dGVuZCBudW1iZXIgcGFyc2luZy4KLQotCVRoZSBmb3J0aGNvbWluZyBDRkYyIHN1cHBvcnQgbmVlZHMgYSBkeW5hbWljIHBhcnNpbmcgbGltaXQuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX251bSwgZG9fZml4ZWQsIGNmZl9wYXJzZV9maXhlZCwKLQljZmZfcGFyc2VfZml4ZWRfc2NhbGVkLCBjZmZfcGFyc2VfZml4ZWRfZHluYW1pYyk6IEFkZCBhcmd1bWVudCBmb3IKLQlwYXJzZXIuCi0JKGNmZl9wYXJzZV9mb250X21hdHJpeCwgY2ZmX3BhcnNlX2ZvbnRfYmJveCwgY2ZmX3BhcnNlX3ByaXZhdGVfZGljdCwKLQljZmZfcGFyc2VfbXVsdGlwbGVfbWFzdGVyLCBjZmZfcGFyc2VfY2lkX3JvcywgY2ZmX3BhcnNlcl9ydW4pOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmggKGNmZl9wYXJzZV9udW0pOiBFeHBvcnQgbG9jYWxseS4KLQotMjAxNi0xMi0xNSAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCVtjZmZdIEltcGxlbWVudCBkeW5hbWljIHN0YWNrIHNpemUgZm9yIEFkb2JlIGVuZ2luZS4KLQotCVRoaXMgYWxzbyBhZGRzIGBjZjJfc3RhY2tfc2V0UmVhbCcgYW5kIGBjZjJfc3RhY2tfcG9wJywgbmVlZGVkIGZvcgotCXRoZSBmb3J0aGNvbWluZyBDRkYyIHN1cHBvcnQuCi0KLQkqIHNyYy9jZmYvY2Yyc3RhY2suYyAoY2YyX3N0YWNrX2luaXQpOiBBZGQgYXJndW1lbnQgZm9yIHN0YWNrIHNpemUuCi0JKGNmMl9zdGFja19mcmVlKTogRGVhbGxvY2F0ZSBzdGFjay4KLQkoY2YyX3N0YWNrX2NvdW50LCBjZjJfc3RhY2tfcHVzaEludCwgY2YyX3N0YWNrX3B1c2hGaXhlZCwKLQljZjJfc3RhY2tfcG9wSW50LCBjZjJfc3RhY2tfcG9wRml4ZWQsIGNmMl9zdGFja19nZXRSZWFsLAotCWNmMl9zdGFja19jbGVhcik6IFVwZGF0ZWQuCi0JKGNmMl9zdGFja19zZXRSZWFsLCBjZjJfc3RhY2tfcG9wKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogc3JjL2NmZi9jZjJzdGFjay5oIChDRjJfU3RhY2spOiBBZGQgYHN0YWNrU2l6ZScgbWVtYmVyLgotCVVwZGF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlcl9pbml0KTogQWRkIHBhcmFtZXRlciBmb3Igc3RhY2sKLQlzaXplOyByZXR1cm4gZXJyb3IgY29kZS4KLQkoY2ZmX3BhcnNlcl9kb25lKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfcGFyc2VyX3J1bik6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuaCAoQ0ZGX1BhcnNlcik6IEFkZCBgc3RhY2tTaXplJyBtZW1iZXIgYW5kIG1ha2UKLQlgc3RhY2snIGEgcG9pbnRlci4KLQlVcGRhdGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2xvYWRfcHJpdmF0ZV9kaWN0LCBjZmZfc3ViZm9udF9sb2FkKToKLQlVcGRhdGVkLgotCi0yMDE2LTEyLTE1ICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBDb2RlIHNodWZmbGluZy4KLQotCSogc3JjL2NmZi9jZmZ0eXBlcy5oIChDRkZfRm9udCk6IEFkZCBgbGlicmFyeScgYW5kIGBiYXNlX29mZnNldCcKLQlmaWVsZHMuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfc3ViZm9udF9sb2FkKTogQ2hhbmdlIGxhc3QgYXJndW1lbnQgdG8KLQlgQ0ZGX0ZvbnQnCi0JU3BsaXQgb2ZmIHBhcnNpbmcgb2YgcHJpdmF0ZSBkaWN0aW9uYXJ5IGludG8uLi4KLQkoY2ZmX2xvYWRfcHJpdmF0ZV9kaWN0KTogLi4udGhpcyBuZXcgZnVuY3Rpb24uCi0JKGNmZl9mb250X2xvYWQpOiBVcGRhdGVkLgotCi0yMDE2LTEyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudCwgdHJ1ZXR5cGVdIEFkZCBmcmFtZXdvcmsgZm9yIE1ldHJpY3MgVmFyaWF0aW9ucyBzZXJ2aWNlLgotCi0JTm8gZWZmZWN0IHlldDsgc2VydmljZSBmdW5jdGlvbnMgd2lsbCBiZSBpbXBsZW1lbnRlZCBsYXRlciBvbi4KLQotCUV2ZXJ5dGhpbmcgaXMgZ3VhcmRlZCB3aXRoIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaDogTmV3IGZpbGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmgKLQkoRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSCk6IE5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2UpOiBOZXcgZmllbGQgYHZhcicuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0guCi0JKHNmbnRfaW5pdF9mYWNlKTogSW5pdGlhbGl6ZSBgZmFjZS0+dmFyJy4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSC4KLQkodHRfc2VydmljZV9tZXRyaWNzX3ZhcmlhdGlvbnMpOiBOZXcgc2VydmljZS4KLQkodHRfc2VydmljZXMpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwaWMuaDogVXBkYXRlZC4KLQotMjAxNi0xMi0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gQWRkIE11bHRpcGxlIE1hc3RlcnMgc2VydmljZS4KLQotCVRoZSBjb2RlIHNpbXBseSB1c2VzIHRoZSBNTSBmdW5jdGlvbnMgZnJvbSB0aGUgYHRydWV0eXBlJyBtb2R1bGUuCi0KLQlFdmVyeXRoaW5nIGlzIGd1YXJkZWQgd2l0aCBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JULgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZSk6IE5ldyBmaWVsZCBgbW0nLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0guCi0JKGNmZl9zZXRfbW1fYmxlbmQsIGNmZl9nZXRfbW1fYmxlbmQsIGNmZl9nZXRfbW1fdmFyLAotCWNmZl9zZXRfdmFyX2Rlc2lnbiwgY2ZmX2dldF92YXJfZGVzaWduKTogTmV3IGZ1bmN0aW9ucy4KLQkoY2ZmX3NlcnZpY2VfbXVsdGlfbWFzdGVycyk6IE5ldyBzZXJ2aWNlLgotCShjZmZfc2VydmljZXMpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2dldF92YXJfYmxlbmQsIGNmZl9kb25lX2JsZW5kKTogTmV3Ci0JZnVuY3Rpb25zLgotCSogc3JjL2NmZi9jZmZsb2FkLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2ZmcGljLmggKENGRl9TRVJWSUNFX01VTFRJX01BU1RFUlNfR0VUKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYzogSW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSC4KLQkoc2ZudF9pbml0X2ZhY2UpOiBJbml0aWFsaXplIGBmYWNlLT5tbScuCi0KLTIwMTYtMTItMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUV4dGVuZCBmdW5jdGlvbmFsaXR5IG9mIGBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UnLgotCi0JSXQgY2FuIG5vdyBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCBzZWFyY2hlcy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X21vZHVsZV9nZXRfc2VydmljZSk6IEFkZCBgZ2xvYmFsJyBhcmd1bWVudC4KLQkoRlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlKTogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X3BzX25hbWUsIGNmZl9nZXRfY21hcF9pbmZvKTogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaDogVXBkYXRlZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSk6Ci0JVXBkYXRlZC4KLQotMjAxNi0xMi0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9nZXRfdmFyX2JsZW5kKTogRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMTYtMTItMTQgIERhdmUgQXJub2xkICA8ZGFybm9sZEBhZG9iZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50LCBjZmZdIE1pbm9yIHByZXBhcmF0aW9ucy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaCAoVFRBR19DRkYyLCBUVEFHX0hWQVIsIFRUQUdfTVZBUiwKLQlUVEFHX1ZWQVIpOiBOZXcgU0ZOVCB0YWJsZSB0YWdzLgotCi0JKiBzcmMvY2ZmL2NmMmZpeGVkLmggKENGMl9GSVhFRF9PTkUsIENGMl9GSVhFRF9FUFNJTE9OKTogQWRkIGNhc3QuCi0KLTIwMTYtMTItMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZSwgdHlwZTFdIEFkZCBgZ2V0X3Zhcl9ibGVuZCcgdG8gTU0gc2VydmljZS4KLQotCUZvciBpbnRlcm5hbCB1c2U7IHdlIHdhbnQgdG8gc2hhcmUgY29kZSBiZXR3ZWVuIHRoZSBmb3J0aGNvbWluZyBDRkYyCi0Jc3VwcG9ydCBhbmQgVHJ1ZVR5cGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oIChGVF9HZXRfVmFyX0JsZW5kX0Z1bmMpOgotCU5ldyB0eXBlZGVmLgotCShNdWx0aU1hc3RlcnMpOiBBZGQgYGdldF92YXJfYmxlbmQnLgotCShGVF9TZXJ2aWNlX011bHRpTWFzdGVycyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X2dldF92YXJfYmxlbmQpOiBOZXcgZnVuY3Rpb24uCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfc2VydmljZV9neF9tdWx0aV9tYXN0ZXJzKTogVXBkYXRlZC4KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9zZXJ2aWNlX211bHRpX21hc3RlcnMpOiBVcGRhdGVkLgotCi0yMDE2LTEyLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGUsIHR5cGUxXSBBZGQgYGRvbmVfYmxlbmQnIHRvIE1NIHNlcnZpY2UuCi0KLQlGb3IgaW50ZXJuYWwgdXNlOyB3ZSB3YW50IHRvIHNoYXJlIGNvZGUgYmV0d2VlbiB0aGUgZm9ydGhjb21pbmcgQ0ZGMgotCXN1cHBvcnQgYW5kIFRydWVUeXBlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaCAoRlRfRG9uZV9CbGVuZF9GdW5jKToKLQlOZXcgdHlwZWRlZi4KLQkoTXVsdGlNYXN0ZXJzKTogQWRkIGBkb25lX2JsZW5kJy4KLQkoRlRfU2VydmljZV9NdWx0aU1hc3RlcnMpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9kb25lX2JsZW5kKTogVXNlIGBUVF9GYWNlJyBhcyBhcmd1bWVudC4KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAoVFRfRmFjZV9Eb25lKTogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycyk6IFVwZGF0ZWQuCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYyAodDFfc2VydmljZV9tdWx0aV9tYXN0ZXJzKTogVXBkYXRlZC4KLQotMjAxNi0xMi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFJldmVydCBjaGFuZ2UgZnJvbSAyMDE2LTEyLTA4LgotCi0JSSBtaXNzZWQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYGZ0X21vZHVsZV9nZXRfc2VydmljZScsIHdoaWNoIG1ha2VzCi0JdGhlIGNoYW5nZSB1bm5lY2Vzc2FyeS4KLQotMjAxNi0xMi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkIGZyYW1ld29yayB0byBzdXBwb3J0IHNlcnZpY2VzIHdpdGggOCBmdW5jdGlvbnMuCi0KLQlXZSB3aWxsIG5lZWQgdGhpcyBmb3IgQ0ZGIHZhcmlhdGlvbiBmb250IHN1cHBvcnQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzgpOgotCU5ldyBtYWNyby4KLQotMjAxNi0xMi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEFkZCBgZ2V0X2dseXBoX25hbWUnIGFuZCBgZ2V0X25hbWVfaW5kZXgnIHRvIFNGTlQgaW50ZXJmYWNlLgotCi0JQ0ZGMiBmb250cyB3aWxsIG5lZWQgYWNjZXNzIHRvIHRob3NlIHR3byBmdW5jdGlvbnMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oOiBJbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ILgotCShTRk5UX0ludGVyZmFjZSk6IEFkZCBgZ2V0X2dseXBoX25hbWUnIGFuZCBgZ2V0X25hbWVfaW5kZXgnIG1lbWJlcnMuCi0JKEZUX0RFRklORV9TRk5UX0lOVEVSRkFDRSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X2dseXBoX25hbWUsIHNmbnRfZ2V0X25hbWVfaW5kZXgpOgotCUZpeCBzaWduYXR1cmVzIHRvIGV4YWN0bHkgY29ycmVzcG9uZCB0byB0aGUgZ2x5cGggZGljdCBzZXJ2aWNlCi0JZnVuY3Rpb24gdHlwZWRlZnMuCi0JKHNmbnRfaW50ZXJmYWNlKTogVXBkYXRlZC4KLQotMjAxNi0xMi0wNiAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCUFkZCBgRlRfR2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMnIGZ1bmN0aW9uLgotCi0JTm90ZSB0aGF0IHRoZSBsb3ctbGV2ZWwgZnVuY3Rpb25zIGFyZW4ndCBpbXBsZW1lbnRlZCB5ZXQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtbS5oOiBEZWNsYXJlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaAotCShGVF9HZXRfVmFyX0Rlc2lnbl9GdW5jKTogTmV3IHR5cGVkZWYuCi0JKE11bHRpTWFzdGVycyk6IE5ldyBNTSBzZXJ2aWNlIGZ1bmN0aW9uIGBnZXRfdmFyX2Rlc2lnbicuCi0JKEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQyk6IFVwZGF0ZWQuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCi0JKiBzcmMvYmFzZS9mdG1tLmMgKEZUX0dldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzKTogSW1wbGVtZW50LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYzogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X1Zhcl9EZXNpZ24pOiBOZXcgZHVtbXkgZnVuY3Rpb24gdG8KLQloYW5kbGUgYGdldF92YXJfZGVzaWduJyBzZXJ2aWNlLgotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuaDogVXBkYXRlZC4KLQotCSogc3JjL3R5cGUxL3QxZHJpdmVyLmM6IFVwZGF0ZWQuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfR2V0X1Zhcl9EZXNpZ24pOiBOZXcgZHVtcCBmdW5jdGlvbiB0bwotCWhhbmRsZSBgZ2V0X3Zhcl9kZXNpZ24nIHNlcnZpY2UuCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmg6IFVwZGF0ZWQuCi0KLTIwMTYtMTItMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9zdWJycyk6IEZpeCBtZW1vcnkgbGVhay4KLQotCVRoZSBgc3VicnMnIGtleXdvcmQgbWlnaHQgZXJyb25lb3VzbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMuCi0KLQlSZXBvcnRlZCBhcwotCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yMzEKLQotMjAxNi0xMi0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2d6aXBdIEltcHJvdmUgYnVpbGRpbmcgd2l0aCBleHRlcm5hbCB6bGliICgjNDk2NzMpLgotCi0JQnVpbGRpbmcgRnJlZVR5cGUgd2l0aCBleHRlcm5hbCB6bGliIDEuMi44IG1ha2VzIG1zdmMgMTQgc3RvcCB3aXRoCi0JdGhlIGZvbGxvd2luZyBlcnJvci4KLQotCSAgZnRnemlwLmMKLQkgIHpsaWItMS4yLjhcemxpYi5oKDg2KTogZXJyb3IgQzIwNjE6Ci0JICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCBlcnJvcjogaWRlbnRpZmllciAnel9jb25zdCcKLQkgIHpsaWItMS4yLjhcemxpYi5oKDk0KTogZXJyb3IgQzIwNTQ6Ci0JICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICcoJyB0byBmb2xsb3cgJ3pfY29uc3QnCi0JICB6bGliLTEuMi44XHpsaWIuaCg5NCk6IGVycm9yIEMyMDg1OgotCSAgICAgICAgICAgICAgICAgICAgICAgICAnbXNnJzogbm90IGluIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdAotCSAgLi4uCi0JICB6bGliLTEuMi44XHpsaWIuaCg4NzcpOiBmYXRhbCBlcnJvciBDMTAwMzoKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIGNvdW50IGV4Y2VlZHMgMTAwOyBzdG9wcGluZyBjb21waWxhdGlvbgotCi0JVGhlIGVycm9yIGhhcHBlbnMgYmVjYXVzZSBGcmVlVHlwZSBrZWVwcyBhbiBvd24gY29weSBvZiB6bGliLTEuMS40Ci0JdW5kZXIgYHNyYy9nemlwJy4gIFdoZW4gYnVpbGRpbmcgYHNyYy9nemlwL2Z0Z3ppcC5jJyB3aXRoCi0JRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQiBkZWZpbmVkLCBpdCB1c2VzCi0KLQkgICNpbmNsdWRlIDx6bGliLmg+Ci0KLQl3aGljaCBjb3JyZWN0bHkgZmluZHMgYW4gZXh0ZXJuYWwgYHpsaWIuaCcsIGJ1dCBgemxpYi5oJyBpdHNlbGYgaGFzCi0JYSBsaW5lCi0KLQkgICNpbmNsdWRlICJ6Y29uZi5oIgotCi0Jd2hpY2ggbWFrZXMgVmlzdWFsIFN0dWRpbyAyMDE1IGZpbmQgYHNyYy9nemlwL3pjb25mLmgnIHdoaWxlCi0JY29tcGlsaW5nIHRoZSBmaWxlcyBpbiBgc3JjL2d6aXAnLgotCi0JKiBzcmMvZ3ppcC96Y29uZi5oOiBSZW5hbWUgdG8uLi4KLQkqIHNyYy9nemlwL2Z0emNvbmYuaDogLi4uIHRoaXMuCi0JKiBzcmMvZ3ppcC96bGliLmgsIHNyYy9nemlwL3J1bGVzLm1rIChHWklQX0RSVl9TUkNTKTogVXBkYXRlZC4KLQotMjAxNi0xMi0wMSAgT2xla3NhbmRyIENoZWtob3Zza3lpICA8b2xla3NhbmRyLmNoZWtob3Zza3lpQGdtYWlsLmNvbT4KLQotCVthdXRvZml0XSBGaXggRW1zY3JpcHRlbiBjcmFzaCAocGF0Y2ggIzkxODApLgotCi0JRnVuY3Rpb24gY2FsbHMgdGhyb3VnaCBwb2ludGVycyBtdXN0IHVzZSBhIG1hdGNoaW5nIHNpZ25hdHVyZSB0bwotCXdvcmsgb24gRW1zY3JpcHRlbiwgc2luY2Ugc3VjaCBjYWxscyBhcmUgZGlzcGF0Y2hlZCB0aHJvdWdoIGxvb2t1cAotCXRhYmxlcyBncm91cGVkIGJ5IHNpZ25hdHVyZS4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9Xcml0aW5nU3lzdGVtX0FwcGx5SGludHNGdW5jKTogRml4Ci0JdHlwZWRlZi4KLQotMjAxNi0xMS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Ntb290aF0gUmV2ZXJ0IHByZXZpb3VzIGNvbW1pdC4gIEFscmVhZHkgZml4ZWQgd2l0aCA2Y2E1NGM2NC4KLQotMjAxNi0xMS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Ntb290aF0gQXZvaWQgY29uZGl0aW9uYWwganVtcCBvbiB1bmluaXRpYWxpemVkIHZhbHVlICgjNDk3MTEpLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yYXN0ZXJfcmVuZGVyKTogSW5pdGlhbGl6ZSBgd29ya2VyJy4KLQotMjAxNi0xMS0yNyAgTmlrb2xhdXMgV2F4d2VpbGVyICA8bWFkaWdlbnNAZ21haWwuY29tPgotCi0JW2F1dG9maXRdIENvZGUgc2h1ZmZsaW5nLgotCi0JQWxzbyBpbXByb3ZlIHNvbWUgY29tbWVudHMgYW5kIHJlbW92ZSB1bnVzZWQgY29kZS4KLQotCU5vIGZ1bmN0aW9uYWwgY2hhbmdlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nKTogTWVyZ2VkIHdpdGguLi4KLQkoYWZfbG9hZGVyX2xvYWRfZ2x5cGgpOiAuLi50aGlzIGZ1bmN0aW9uLgotCVNwbGl0IG9mZiBlbWJvbGRlbmluZyBjb2RlIGludG8uLi4KLQkoYWZfbG9hZGVyX2VtYm9sZGVuX2dseXBoX2luX3Nsb3QpOiAuLi4gdGhpcyBmdW5jdGlvbi4KLQotMjAxNi0xMS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQmV0dGVyIHN1cHBvcnQgb2YgTExQNjQgc3lzdGVtcyB3aXRoIGdjYyAoYW5kIGNsYW5nKS4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQ2FsbCBgQUNfVFlQRV9MT05HX0xPTkdfSU5UJy4KLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW4gKEZUX0xPTkc2NCk6IEVuYWJsZSBmb3IgTExQNjQgc3lzdGVtcyAoYW5kCi0Jc3VwcHJlc3Mgd2FybmluZ3MpIGV2ZW4gd2l0aG91dCBgRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCcuCi0KLTIwMTYtMTEtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBgbGNkX3dlaWdodHMnIGFycmF5IHNpemUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0xpYnJhcnlSZWMpOiBEbyBpdC4KLQotCVJlcG9ydGVkIGJ5IE5pa29sYXVzLgotCi0yMDE2LTExLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwpOiBGaXggdHJhY2luZy4KLQotMjAxNi0xMS0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEltcHJvdmUgRlRfTE9BRF9CSVRNQVBfTUVUUklDU19PTkxZIGZvciBgc2JpeCcgZm9ybWF0LgotCi0JSXQncyB1bmF2b2lkYWJsZSB0byBjYWxsIHRoZSBQTkcgZW5naW5lLCBidXQgdG8gZ2V0IHRoZSBtZXRyaWNzIGl0Ci0JaXMgc3VmZmljaWVudCB0byByZWFkIHRoZSBQTkcgaW1hZ2UncyBoZWFkZXIgb25seS4KLQotCSogc3JjL3NmbnQvcG5nc2hpbS5jIChMb2FkX1NCaXRfUG5nKTogQWRkIGFyZ3VtZW50IHRvIGNvbnRyb2wgdGhlCi0JYWxsb2NhdGlvbiBvZiB0aGUgZ2x5cGggc2xvdC4KLQkqIHNyYy9zZm50L3BuZ3NoaW0uaDogVXBkYXRlZC4KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9wbmcsCi0JdHRfZmFjZV9sb2FkX3NiaXhfaW1hZ2UsIHR0X2ZhY2VfbG9hZF9zYml0X2ltYWdlKTogVXBkYXRlZC4KLQotMjAxNi0xMS0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFNwZWVkIHVwIGBzYml4JyBsb29rdXAuCi0KLQlUaGlzIGFsc28gZml4ZXMgYSBidWcgaW50cm9kdWNlZCBpbiAyMDE2LTEwLTAxIHdoaWNoIHByZXZlbnRzCi0JZGlzcGxheSBvZiBlbWJlZGRlZCBiaXRtYXAgZm9udHMgdGhhdCB1c2UgdGhlIGBzYml4JyBmb3JtYXQuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9mYWNlX2xvYWRfc2JpdCk6IFN0b3JlIGBzYml4JyBzaXplIGFuZAotCW9mZnNldCBhbHNvIGluIGBlYmR0X3NpemUnIGFuZCBgZWJkdF9zdGFydCcsIHJlc3BlY3RpdmVseS4gIFRoaXMKLQltYWtlcyB0aGUgdGVzdCBmb3IgYW4gZW1iZWRkZWQgYml0bWFwIGRhdGEgdGFibGUgc3VjY2VlZCBmb3IgdGhpcwotCWZvcm1hdC4KLQotCSh0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MpIDxUVF9TQklUX1RBQkxFX1RZUEVfU0JJWD46IFVzZQotCWBlYmR0X3NpemUnIGFuZCBgZWJkdF9zdGFydCcKLQkodHRfZmFjZV9sb2FkX3NiaXhfaW1hZ2UpOiBEaXR0by4KLQotMjAxNi0xMS0wNiAgU2VpZ28gTm9uYWthICA8bm9uYUBnb29nbGUuY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlJbnRyb2R1Y2UgYSB3YXkgb2YgcXVpY2tseSByZXRyaWV2aW5nIChlbWJlZGRlZCkgYml0bWFwIG1ldHJpY3MuCi0KLQlgRlRfTG9hZF9HbHlwaCcgZG9lc24ndCBnZW5lcmF0ZSBhIGJpdG1hcCBmb3IgYSBub24tYml0bWFwIGdseXBoCi0JdW50aWwgdGhlIHVzZXIgY2FsbHMgYEZUX1JlbmRlcl9HbHlwaCcuICBIb3dldmVyLCBpdCBhbHdheXMKLQlhbGxvY2F0ZXMgbWVtb3J5IGZvciBiaXRtYXBzIGFuZCBjb3BpZXMgb3IgZGVjb2RlcyB0aGUgY29udGVudHMgb2YgYQotCWJpdG1hcCBnbHlwaCwgd2hpY2ggY2FuIGJlIHF1aXRlIHNsb3cgZm9yIFBORyBkYXRhLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0xPQURfQklUTUFQX01FVFJJQ1NfT05MWSk6IE5ldwotCW1hY3JvLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IFVuc2V0IEZUX0xPQURfUkVOREVSIGlmCi0JRlRfTE9BRF9CSVRNQVBfTUVUUklDU19PTkxZIGlzIHVzZWQuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfYWxsb2NfYml0bWFwLAotCXR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdG1hcCk6IEFkZCBhcmd1bWVudCB0byBjb250cm9sIGFsbG9jYXRpb24gb2YKLQl0aGUgZ2x5cGggc2xvdC4KLQkodHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2UsIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2NvbXBvdW5kLAotCXR0X2ZhY2VfbG9hZF9zYml0X2ltYWdlKTogVXBkYXRlZC4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfR2x5cGhfTG9hZCk6IFF1aWNrbHkgZXhpdCBpZgotCWBGVF9MT0FEX0JJVE1BUF9NRVRSSUNTX09OTFknIGlzIHNldC4KLQotCSogc3JjL3Bmci9wZnJzYml0LmMsIHNyYy9wZnIvcGZyc2JpdC5oIChwZnJfc2xvdF9sb2FkX2JpdG1hcCk6IEFkZAotCWFyZ3VtZW50IHRvIGNvbnRyb2wgYWxsb2NhdGlvbiBvZiB0aGUgZ2x5cGggc2xvdC4KLQkqIHNyYy9wZnIvcGZyb2JqcyAocGZyX3Nsb3RfbG9hZCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoRk5UX0xvYWRfR2x5cGgpOiBEaXR0by4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDE2LTExLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlTeW5jaHJvbml6ZSB3aXRoIGdudWxpYiAoIzQ5NDQ4KS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCwgYnVpbGRzL3VuaXgvZnRjb25maWcuaW4sCi0JYnVpbGRzL3Ztcy9mdGNvbmZpZy5oIChGVF9UWVBFT0YpOiBVcGRhdGUgY29kZSB0byB1c2UgZGVmaW5pdGlvbiBpbgotCWN1cnJlbnQgdmVyc2lvbiBvZiBgaW50cHJvcHMuaCcuCi0JT3RoZXIgbWlub3Igc3luY2hyb25pemF0aW9uIHRvIHJlZHVjZSBjb2RlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlCi0JdGhyZWUgZmlsZXMuCi0KLTIwMTYtMTEtMDMgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW3RydWV0eXBlXSBDbGFtcCB2YXJpYXRpb24gcmVxdWVzdHMgdG8gdmFsaWQgcmFuZ2UuCi0KLQlUaGlzIGlzIHJlcXVpcmVkIGJ5IE9wZW5UeXBlIDEuODsgaXQgYWxzbyBhdm9pZHMgcm91bmRpbmcgc3VycHJpc2VzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9TZXRfVmFyX0Rlc2lnbik6IENsYW1wIGRlc2lnbiBjb29yZGluYXRlcwotCW91dHNpZGUgb2YgdGhlIGFsbG93ZWQgcmFuZ2UgdG8gYWx3YXlzIHN0YXkgd2l0aGluIHRoZSByYW5nZSBpbnN0ZWFkCi0Jb2YgcHJvZHVjaW5nIGFuIGVycm9yLgotCi0yMDE2LTEwLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFJlbW92ZSBjbGFuZyB3YXJuaW5ncy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmggKFRUX0V4ZWNDb250ZXh0UmVjKTogVXNpbmcgYEZUX1VMb25nJyBmb3IKLQlsb29wIGNvdW50ZXIgaGFuZGxpbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jOiBVcGRhdGVkLgotCShJbnNfU0NBTlRZUEUpOiBVc2Ugc2lnbmVkIGNvbnN0YW50LgotCShUVF9SdW5JbnMpOiBFbnN1cmUgYG51bV90d2lsaWdodF9wb2ludHMnIGlzIDE2Yml0LgotCi0yMDE2LTEwLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBjb21taXQgZnJvbSAyMDE0LTExLTI0LgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBIaW4tVGFrIExldW5nICA8aHRsMTBAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4KLQotCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYyAodHRfZmFjZV9sb2FkX2hkbXgpOiBGaXggZmlsZSBjaGVja2luZwotCWxvZ2ljLgotCi0yMDE2LTEwLTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgYEZUX0dldF97TU0sVmFyfV9CbGVuZF9Db29yZGluYXRlcycgZnVuY3Rpb25zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaDogRGVjbGFyZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmggKEZUX0dldF9NTV9CbGVuZF9GdW5jKToKLQlOZXcgdHlwZWRlZi4KLQkoTXVsdGlNYXN0ZXJzKTogTmV3IE1NIHNlcnZpY2UgZnVuY3Rpb24gYGdldF9tbV9ibGVuZCcuCi0JKEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQyk6IFVwZGF0ZWQuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCi0JKiBzcmMvYmFzZS9mdG1tLmMgKEZUX0dldF9NTV9CbGVuZF9Db29yZGluYXRlcywKLQlGVF9HZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzKTogSW1wbGVtZW50LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYzogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X01NX0JsZW5kKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZQotCWBnZXRfbW1fYmxlbmQnIHNlcnZpY2UuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oOiBVcGRhdGVkLgotCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYzogVXBkYXRlZC4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9HZXRfTU1fQmxlbmQpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlCi0JYGdldF9tbV9ibGVuZCcgc2VydmljZS4KLQkqIHNyYy90eXBlMS90MWxvYWQuaDogVXBkYXRlZC4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudC4KLQotMjAxNi0xMC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX3N1YnJzKTogRml4IGxpbWl0IGNoZWNrLgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9ODEKLQotMjAxNi0xMC0yNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2NmZl0gQ29ycmVjdCBjbWFwIGZvcm1hdCByZXBvcnRpbmcgKCMyNDgxOSkuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9jbWFwX2luZm8pOiBUaHJvdyBhbiBlcnJvciBvbiBzeW50aGV0aWMKLQljaGFybWFwIGluc3RlYWQgb2YgZ3Vlc3NpbmcgaXRzIGZvcm1hdCBhbmQgbGFuZ3VhZ2UuCi0KLTIwMTYtMTAtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IFNDQU5UWVBFIGluc3RydWN0aW9uICgjNDkzOTQpLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX1NDQU5UWVBFKTogT25seSB1c2UgbG93ZXIgMTZiaXRzLgotCi0yMDE2LTEwLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSW1wcm92ZSBoYW5kbGluZyBvZiBpbnZhbGlkIHBvc3QgMi41IHRhYmxlcyBbIzQ5MzkzXS4KLQotCSogc3JjL3NmbnQvdHRwb3N0LmMgKGxvYWRfZm9ybWF0XzI1KTogV2UgbmVlZCBhdCBsZWFzdCBhIHNpbmdsZQotCXRhYmxlIGVudHJ5LgotCi0yMDE2LTEwLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBoYW5kbGluZyBvZiBgY3ZhcicgdGFibGUgZGF0YS4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTUzCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X2ZhY2VfdmFyeV9jdnQpOiBJZ25vcmUgaW52YWxpZCBDVlQKLQlpbmRpY2VzLgotCi0yMDE2LTEwLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNhdXhdIEZpeCBoYW5kbGluZyBvZiBpbnZhbGlkIGZsZXggc3VicnMuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTUyCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxvcF9jYWxsb3RoZXJzdWJyPjogU2V0IGBmbGV4X3N0YXRlJyBhZnRlciBlcnJvciBjaGVja2luZy4KLQotMjAxNi0xMC0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9kb25lX2JsZW5kKTogRml4IGRlYWxsb2NhdGlvbi4KLQotMjAxNi0xMC0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAoY2lkX2ZhY2Vfb3Blbik6IFByb3Blcmx5IHByb3BhZ2F0ZSBgZXJyb3InLgotCi0yMDE2LTEwLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2lkXSBGaXggcGFyc2luZyBvZiBzdWJyIG9mZnNldHMuCi0KLQlCdWcgaW50cm9kdWNlZCAyMDE2LTA1LTE2LgotCi0JKiBzcmMvY2lkL2NpZHBhcnNlLmMgKGNpZF9wYXJzZXJfbmV3KTogRml4IG9mZi1ieS1vbmUgZXJyb3IuCi0KLTIwMTYtMTAtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBEaXNhYmxlIGJpdG1hcCBzdHJpa2VzIGlmIHdlIGRvbid0IGhhdmUgYSBiaXRtYXAgZGF0YSB0YWJsZS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zYml0KTogQ2hlY2sgd2hldGhlciB3ZSBoYXZlCi0JYSBiaXRtYXAgZGF0YSB0YWJsZS4KLQotMjAxNi0xMC0wMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gUmVtb3ZlIGltcG9zc2liaWxpdHkuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChUV29ya2VyKTogUmVhcnJhbmdlIGZpZWxkcy4KLQkoZ3JheV9jb252ZXJ0X2dseXBoKTogUmVtb3ZlIGltcG9zc2libGUgY29uZGl0aW9uIGFuZCBjbGVhbiB1cC4KLQotMjAxNi0wOS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gRW5yaWNoIGZhbWlseSBuYW1lIHdpdGggZm91bmRyeSBuYW1lIGFuZCBnbHlwaCB3aWR0aCBpbmZvLgotCi0JVGhpcyBpcyBhIHZlcnkgb2xkIHBhdGNoIGZyb20gb3BlblN1U0UgKGZyb20gMjAwNiwgc3VibWl0dGVkIHRvCi0JRnJlZVR5cGUgaW4gMjAxMSkgdGhhdCBJIGZvcmdvdCB0byBhcHBseS4KLQotCSAgaHR0cHM6Ly9idWlsZC5vcGVuc3VzZS5vcmcvcGFja2FnZS92aWV3X2ZpbGUvb3BlblNVU0U6RmFjdG9yeS9mcmVldHlwZTIvZnJlZXR5cGUyLWJpdG1hcC1mb3VuZHJ5LnBhdGNoCi0KLQlQcmVwZW5kIHRoZSBmb3VuZHJ5IG5hbWUgcGx1cyBhIHNwYWNlIHRvIHRoZSBmYW1pbHkgbmFtZS4gIFRoZXJlIGFyZQotCW1hbnkgZm9udHMganVzdCBjYWxsZWQgYEZpeGVkJyB3aGljaCBsb29rIGNvbXBsZXRlbHkgZGlmZmVyZW50LCBhbmQKLQl3aGljaCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBlYWNoIG90aGVyLiAgV2hlbiBzZWxlY3RpbmcgYEZpeGVkJyBpbgotCUtERSBvciBHbm9tZSBvbmUgZ2V0cyByZXN1bHRzIHRoYXQgYXBwZWFyIHJhdGhlciByYW5kb20sIHRoZSBzdHlsZQotCWNoYW5nZXMgb2Z0ZW4gaWYgb25lIGNoYW5nZXMgdGhlIHNpemUgYW5kIG9uZSBjYW5ub3Qgc2VsZWN0IHNvbWUKLQlmb250cyBhdCBhbGwuCi0KLQlXZSBhbHNvIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBgd2lkZScgY2hhcmFjdGVyczsgYWxsIHB1dCB0b2dldGhlciwKLQl3ZSBnZXQgZmFtaWx5IG5hbWVzIGxpa2UgYFNvbnkgRml4ZWQnIG9yIGBNaXNjIEZpeGVkIFdpZGUnLgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2xvYWRfZm9udCk6IEltcGxlbWVudCBpdC4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBpdC4KLQotMjAxNi0wOS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Z0ZnV6emVyXSBTcGVlZCB1cC4KLQotCSogc3JjL3Rvb2xzL2Z0ZnV6emVyL2Z0ZnV6emVyLmNjIChMTFZNRnV6emVyVGVzdE9uZUlucHV0KTogRG9uJ3QKLQljaGVjayBmb3IgZW1iZWRkZWQgYml0bWFwcyBpZiB3ZSBoYXZlIGEgbm9uLWRlZmF1bHQgaW5zdGFuY2UuCi0KLTIwMTYtMDktMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRGlzYWxsb3cgYml0bWFwIHN0cmlrZXMgZm9yIG5vbi1kZWZhdWx0IGluc3RhbmNlcy4KLQotCUFsc28gc3BlZWQgdXAgYWNjZXNzIG9mIGRlZmF1bHQgaW5zdGFuY2VzIGlmIEdYIHZhcmlhdGlvbnMgYXJlCi0JYWN0aXZlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZVJlYyk6IEFkZAotCWBpc19kZWZhdWx0X2luc3RhbmNlJyBtZW1iZXIuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IEluaXRpYWxpemUKLQlgaXNfZGVmYXVsdF9pbnN0YW5jZScuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoLAotCWxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBBZGQgdGVzdCBmb3IgZGVmYXVsdCBpbnN0YW5jZS4KLQkoVFRfTG9hZF9HbHlwaCk6IExvYWQgZW1iZWRkZWQgYml0bWFwcyBmb3IgZGVmYXVsdCBpbnN0YW5jZSBvbmx5LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9TZXRfTU1fQmxlbmQpOiBDb21wdXRlCi0JYGlzX2RlZmF1bHRfaW5zdGFuY2UnLgotCi0yMDE2LTA5LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIENsZWFuIHVwIGBUVF9GYWNlJyBzdHJ1Y3R1cmUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GYWNlUmVjKTogUmVtb3ZlIHVudXNlZAotCWZpZWxkcyBgaG9yel9tZXRyaWNzJyBhbmQgYHZlcnRfbWV0cmljcycuCi0JVXBkYXRlIGRvY3VtZW50YXRpb24uCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2RvbmVfZmFjZSk6IFVwZGF0ZWQuCi0KLTIwMTYtMDktMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1vcmUgRlRfWkVSTyB1c2FnZS4KLQotCSogc3JjL2d4dmFsaWQvZ3h2Y29tbW4uYyAoZ3h2X0NsYXNzVGFibGVfdmFsaWRhdGUpOgotCXMvZnRfbWVtc2V0L0ZUX01FTV9aRVJPLy4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOgotCXMvZnRfbWVtc2V0L0ZUX0FSUkFZX1pFUk8vLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKEZUX1pFUk8pOiBEZWZpbmUuCi0JKGZ0X2JsYWNrX25ldyk6IFVzZSBpdC4KLQkqIHNyYy9yYXN0ZXIvZnRyZW5kMS5jIChmdF9yYXN0ZXIxX2dldF9jYm94KToKLQlzL0ZUX01FTV9aRVJPL0ZUX1pFUk8vLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoRlRfWkVSTyk6IERlZmluZS4KLQkoZ3JheV9yYXN0ZXJfbmV3KTogVXNlIGl0LgotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfZ2V0X2Nib3gpOgotCXMvRlRfTUVNX1pFUk8vRlRfWkVSTy8uCi0KLTIwMTYtMDktMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSovKjogcy9GVF9NRU1fWkVSTy9GVF9aRVJPLyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotMjAxNi0wOS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBUcmFjZSBudW1iZXIgb2YgZXhlY3V0ZWQgb3Bjb2Rlcy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX1J1bklucyk6IEltcGxlbWVudCBpdC4KLQotMjAxNi0wOS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBTcGVlZCB1cCBgVFRfTG9hZF9HbHlwaCcuCi0KLQlUaGlzIGF2b2lkcyBhZGRpdGlvbmFsIGNhbGxzIHRvIGB0dF9mYWNlX2xvb2t1cF90YWJsZScgZm9yIHRoZQotCWBnbHlmJyB0YWJsZSwgd2hpY2ggY2FuIGJlIGV4cGVuc2l2ZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0xvYWRlclJlYyk6IE1vdmUKLQlgZ2x5Zl9vZmZzZXQnIGZpZWxkIHRvIC4uLgotCShUVF9GYWNlUmVjKTogLi4uIHRoaXMgc3RydWN0dXJlLgotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IFVwZGF0ZWQuCi0JKHR0X2xvYWRlcl9pbml0KTogTW92ZSBpbml0aWFsaXphdGlvbiBvZiBgZ2x5Zl9vZmZzZXQnIHRvIC4uLgotCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYyAodHRfZmFjZV9sb2FkX2xvY2EpOiAuLi4gdGhpcyBmdW5jdGlvbi4KLQotMjAxNi0wOS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJbnRyb2R1Y2UgZHluYW1pYyBsaW1pdHMgZm9yIHNvbWUgYnl0ZWNvZGUgb3Bjb2Rlcy4KLQotCVRoaXMgc3BlZWRzIHVwIEZyZWVUeXBlJ3MgaGFuZGxpbmcgb2YgbWFsZm9ybWVkIGZvbnRzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogU2V0IHVwIGxpbWl0cyBmb3IgdGhlIG51bWJlcgotCW9mIHR3aWxpZ2h0IHBvaW50cywgdGhlIHRvdGFsIG51bWJlciBvZiBuZWdhdGl2ZSBqdW1wcywgYW5kIHRoZQotCXRvdGFsIG51bWJlciBvZiBsb29wcyBpbiBMT09QQ0FMTCBvcGNvZGVzLiAgVGhlIHZhbHVlcyBhcmUgYmFzZWQgb24KLQl0aGUgbnVtYmVyIG9mIHBvaW50cyBhbmQgZW50cmllcyBpbiB0aGUgQ1ZUIHRhYmxlLgotCShJbnNfSk1QUik6IFRlc3QgbmVnYXRpdmUganVtcCBjb3VudGVyLgotCShJbnNfTE9PUENBTEwpOiBUZXN0IGxvb3BjYWxsIGNvdW50ZXIuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5oIChUVF9FeGVjQ29udGV4dCk6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNi0wOS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBTYW5pdGl6ZSBvbmx5IGxhc3QgZW50cnkgb2YgYGxvY2EnIHRhYmxlLgotCi0JV2l0aG91dCB0aGlzIHBhdGNoLCBhIGxvY2Egc2VxdWVuY2UgbGlrZSBgMCAxMDAwMDAgMCAxMDAwMDAgLi4uJywKLQl3aGVyZSB2YWx1ZSAxMDAwMDAgaXMgbGFyZ2VyIHRoYW4gdGhlIGBnbHlmJyB0YWJsZSBzaXplLCBtYWtlcwotCUZyZWVUeXBlIGhhbmRsZSB0aGUgd2hvbGUgYGdseWYnIHRhYmxlIGFzIGEgc2luZ2xlIGdseXBoIGFnYWluIGFuZAotCWFnYWluLCB3aGljaCBpcyBjZXJ0YWlubHkgaW52YWxpZCAoYW5kIGNhbiBiZSB2ZXJ5IHNsb3csIHRvbykuCi0KLQkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKTogSW1wbGVtZW50LgotCUltcHJvdmUgdHJhY2luZyBtZXNzYWdlcy4KLQotMjAxNi0wOS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdG9vbHMvZnRmdXp6ZXIvZnRmdXp6ZXIuY2MgKExMVk1GdXp6ZXJUZXN0T25lSW5wdXQpOiBGaXggdHlwby4KLQotMjAxNi0wOS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFRyYWNpbmcgZml4ZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKGFmX2F1dG9maXR0ZXJfbG9hZF9nbHlwaCk6IENhbGwgZHVtcGluZwotCWZ1bmN0aW9ucyBvbmx5IGlmIHdlIGFjdHVhbGx5IGRvIHRyYWNpbmcuCi0KLTIwMTYtMDktMjIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIFJlZHVjZSBkaXZpc2lvbnMgaW4gdGhlIGxpbmUgcmVuZGVyZXIuCi0KLQlXZSBkb24ndCBuZWVkIHNvbWUgZGl2aXNpb25zIGlmIGEgbGluZSBzZWdtZW50cyBzdGF5cyB3aXRoaW4gYSBzaW5nbGUKLQlyb3cgb3IgYSBzaW5nbGUgY29sdW1uIG9mIHBpeGVscy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmVuZGVyX2xpbmUpIFtGVF9MT05HNjRdOiBNYWtlIGRpdmlzaW9ucwotCWNvbmRpdGlvbmFsLgotCi0yMDE2LTA5LTE1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3N3ZWVwKTogUmVtb3ZlIGNoZWNrIGZvciBlbXB0eSB0YWJsZS4KLQotMjAxNi0wOS0xNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gQW5vdGhlciB0aW55IHNwZWVkLXVwLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9maW5kX2NlbGwpOiBNZXJnZSBpbnRvLi4uCi0JKGdyYXlfcmVjb3JkX2NlbGwpOiAuLi4gdGhpcyBmdW5jdGlvbi4KLQotMjAxNi0wOS0xMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV97ZmluZCxzZXR9X2NlbGwpOiBSZW1vdmUgZHViaW91cyBjb2RlLgotCi0yMDE2LTA5LTExICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBGaXggdmFsZ3JpbmQgd2FybmluZyBhbmQgcmVvcHRpbWl6ZS4KLQotCVRoZSBhbGdvcml0aG0gY2FsbHMgYGdyYXlfc2V0X2NlbGwnIGF0IHRoZSBzdGFydCBvZiBlYWNoIG5ldyBjb250b3VyCi0Jb3Igd2hlbiB0aGUgY29udG91cnMgY3Jvc3MgdGhlIGNlbGwgYm91bmRhcmllcy4gRG91YmxlLWNoZWNraW5nIGZvcgotCXRoYXQgaXMgd2FzdGVmdWwuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3NldF9jZWxsKTogUmVtb3ZlIGNoZWNrIGZvciBhIG5ldyBjZWxsLgotCShncmF5X2NvbnZlcnRfZ2x5cGgpOiBSZW1vdmUgaW5pdGlhbGl6YXRpb24gaW50cm9kdWNlZCBieSA0NGIxNzJlODguCi0KLTIwMTYtMDktMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBGaXggcHJldmlvdXMgY29tbWl0LgotCi0JUHJvYmxlbXMgcmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NDAKLQotCVdlIG5vdyBtYXAgdGhlIHN0cmlrZSBpbmRleCByaWdodCBiZWZvcmUgYWNjZXNzaW5nIHRoZSBwaHlzaWNhbAotCWRhdGEsIG5vdCBlYXJsaWVyLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBTZXQgYGZhY2UtPnNiaXRfc3RyaWtlX21hcCcKLQlhZnRlciBjcmVhdGluZyB0aGUgbWFwIHNvIHRoYXQuLi4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcyk6IC4uLiB0aGlzIGZ1bmN0aW9uCi0JY2FuIGJlIHVzZWQgYmVmb3JlIGFuZCBhZnRlciBzZXR0aW5nIHVwIGBzYml0X3N0cmlrZV9tYXAnLgotCSh0dF9mYWNlX3NldF9zYml0X3N0cmlrZSk6IFJldmVydCBjaGFuZ2UuCi0JKHR0X3NiaXRfZGVjb2Rlcl9pbml0LCB0dF9mYWNlX2xvYWRfc2JpeF9pbWFnZSk6IE1hcCBzdHJpa2UgaW5kZXguCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9zaXplX3NlbGVjdCk6IFJldmVydCBjaGFuZ2UuCi0KLTIwMTYtMDktMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtmdGZ1enplcl0gTWlub3IgaW1wcm92ZW1lbnRzLgotCi0JKiBzcmMvdG9vbHMvZnRmdXp6ZXIvZnRmdXp6ZXIuY2MgKExMVk1GdXp6ZXJUZXN0T25lSW5wdXQpOiBJZ25vcmUKLQlpbnZhbGlkIHN0cmlrZXMuCi0JVXNlIGJldHRlciB2YWx1ZXMgZm9yIGNhbGwgdG8gYEZUX1NldF9DaGFyX1NpemUnLgotCi0yMDE2LTA5LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRG9uJ3QgcHJvdmlkZSAoY29tcGxldGVseSkgYnJva2VuIHN0cmlrZSBkYXRhLgotCi0JRnJlZVR5cGUgdHJpZXMgdG8gc2FuaXRpemUgc3RyaWtlIGhlYWRlciBkYXRhOyB3ZSBub3cgcmVqZWN0Ci0JY29tcGxldGVseSBicm9rZW4gb25lcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpOiBOZXcKLQlgc2JpdF9zdHJpa2VfbWFwJyBhcnJheSBwb2ludGVyLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTWF0Y2hfU2l6ZSk6IFJlamVjdCBtYXRjaGVzIHdoZXJlIGVpdGhlcgotCXdpZHRoIG9yIGhlaWdodCB3b3VsZCBiZSB6ZXJvLgotCUFkZCB0cmFjaW5nIG1lc3NhZ2UgaW4gY2FzZSBvZiBlcnJvci4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogUG9wdWxhdGUgYHNiaXRfc3RyaWtlX21hcCcsCi0Jb25seSB1c2luZyAobW9yZSBvciBsZXNzKSB2YWxpZCBzdHJpa2UgaGVhZGVyIGRhdGEgZm9yCi0JRlRfRmFjZSdzIGBhdmFpbGFibGVfc2l6ZXMnIGFycmF5LgotCShzZm50X2RvbmVfZmFjZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9mYWNlX3NldF9zYml0X3N0cmlrZSk6IFVzZQotCWBzYml0X3N0cmlrZV9tYXAnLgotCSh0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MpOiBJbXByb3ZlIHRyYWNpbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9zaXplX3NlbGVjdCk6IFVzZSBgc2JpdF9zdHJpa2VfbWFwJy4KLQotMjAxNi0wOS0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNyByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi03Jy4KLQotCSogZG9jcy9WRVJTSU9OLlRYVDogQWRkIGVudHJ5IGZvciB2ZXJzaW9uIDIuNy4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNi41LzIuNy8sIHMvMjY1LzI3Ly4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9NSU5PUik6IFNldCB0byA3LgotCShGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAwLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTg6NjoxMi4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX01JTk9SKTogU2V0IHRvIDcuCi0JKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gMC4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDE2LTA5LTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jOiBJbmNsdWRlIGB0dGd4dmFyLmgnLgotCi0JVGhpcyBmaXhlcyB0aGUgYG11bHRpJyBidWlsZC4KLQotMjAxNi0wOS0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFub3RoZXIgaW1wcm92ZW1lbnQgdG8gQXJtZW5pYW4gc3VwcG9ydC4KLQotCVN1Z2dlc3RlZCBieSBIcmFudCBIIFBhcGF6aWFuIDxocGFwYXppYW5AZ21haWwuY29tPi4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogVXNlIGJldHRlciBzdWl0ZWQgY2hhcmFjdGVycyB0byBkZXJpdmUKLQlkZWZhdWx0IHN0ZW0gd2lkdGhzLgotCi0yMDE2LTA5LTA3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2hsaW5lKTogTWljcm8tb3B0aW1pemUuCi0KLTIwMTYtMDktMDYgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIE9wZXJhdGUgaW4gYWJzb2x1dGUgYml0bWFwIGNvb3JkaW5hdGVzLgotCi0JU2ltcGxlciBiaXRtYXAgYWRkcmVzc2luZyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBieSAxLjUlLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9UV29ya2VyKTogUmVtb3ZlIGNvdW50IGZpZWxkcy4KLQkoZ3JheV9kdW1wX2NlbGxzLCBncmF5X2ZpbmRfY2VsbCwgZ3JheV9zZXRfY2VsbCwgZ3JheV9obGluZSwKLQlncmF5X3N3ZWVwLCBncmF5X2NvbnZlcnRfZ2x5cGgsIGdyYXlfcmFzdGVyX3JlbmRlcik6IFVwZGF0ZWQuCi0KLTIwMTYtMDktMDYgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIEltcHJvdmUgY29udG91ciBzdGFydCAodGFrZSAyKS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfbW92ZV90byk6IENhbGwgYGdyYXlfc2V0X2NlbGwnIGRpcmVjdGx5Ci0JaW5zdGVhZCBvZi4uLgotCShncmF5X3N0YXJ0X2NlbGwpOiAuLi4gdGhpcyBmdW5jdGlvbiwgd2hpY2ggaXMgcmVtb3ZlZC4KLQkoZ3JheV9jb252ZXJ0X2dseXBoKTogTWFrZSBpbml0aWFsIHktY29vcmRpbmF0ZSBpbnZhbGlkLgotCi0yMDE2LTA5LTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTFdIE1NIGZvbnRzIHN1cHBvcnQgZXhhY3RseSB6ZXJvIG5hbWVkIGluc3RhbmNlcyAoIzQ4NzQ4KS4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9HZXRfTU1fVmFyKTogU2V0IGBudW1fbmFtZWRzdHlsZXMnIHRvIHplcm8uCi0KLTIwMTYtMDktMDYgIEpvbmF0aGFuIEtldyAgPGpma3RoYW1lQGdtYWlsLmNvbT4KLQotCVtjZmZdIEZpeCB1bmluaXRpYWxpemVkIG1lbW9yeS4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3MDI4OAotCi0JKiBzcmMvY2ZmL2NmMmludGVycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKTogSW5pdGlhbGl6ZSBgc3RvcmFnZScKLQlhcnJheSB0byBoYW5kbGUgYSBgZ2V0JyBvcGNvZGUgd2l0aG91dCBhIHByZXZpb3VzIGBwdXQnLgotCi0yMDE2LTA5LTA1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X21vdmVfdG8sIGdyYXlfc3RhcnRfY2VsbCk6IFJldmVydC4KLQotMjAxNi0wOS0wNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gSW1wcm92ZSBjb250b3VyIHN0YXJ0LgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9tb3ZlX3RvKTogQ2FsbCBgZ3JheV9zZXRfY2VsbCcgZGlyZWN0bHkKLQlpbnN0ZWFkIG9mLi4uCi0JKGdyYXlfc3RhcnRfY2VsbCk6IC4uLiB0aGlzIGZ1bmN0aW9uLCB3aGljaCBpcyByZW1vdmVkLgotCi0yMDE2LTA5LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBGaXggbWVtb3J5IGluaXRpYWxpemF0aW9uLgotCi0JKiBzcmMvY2ZmL2NmMnN0YWNrLmMgKGNmMl9zdGFja19pbml0KTogVXNlIGBGVF9ORVcnLiAgVGhlIGBRJwotCXZhcmlhbnRzIG9mIEZyZWVUeXBlJ3MgbWVtb3J5IGFsbG9jYXRpb24gbWFjcm9zIGRvbid0IGRvIHplcm9pbmcuCi0KLTIwMTYtMDktMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtmdHJhbmRvbV0gTWlub3IgaW1wcm92ZW1lbnRzLgotCi0JKiBzcmMvdG9vbHMvZnRyYW5kb20vZnRyYW5kb20uYyAoX1hPUEVOX1NPVVJDRSk6IE5ldyBtYWNybywgc2V0IHRvCi0JNTAwLgotCi0JKiBzcmMvdG9vbHMvZnRyYW5kb20vTWFrZWZpbGUgKENGTEFHUyk6IFNwbGl0IG9mZiBpbmNsdWRlCi0JZGlyZWN0b3JpZXMgdG8gLi4uCi0JKElOQ0xVREVTKTogLi4uIHRoaXMgbmV3IHZhcmlhYmxlLgotCShMREZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShmdHJhbmRvbS5vLCBmdHJhbmRvbSk6IFVwZGF0ZWQuCi0KLTIwMTYtMDktMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbXByb3ZlIEFybWVuaWFuIHN1cHBvcnQuCi0KLQlUaGFua3MgdG8gSHJhbnQgSCBQYXBhemlhbiA8aHBhcGF6aWFuQGdtYWlsLmNvbT4gZm9yIGhlbHAuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQgKEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOXyopOiBJbXByb3ZlCi0Jc2VsZWN0aW9uIG9mIGNoYXJhY3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLTIwMTYtMDktMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtmdHJhbmRvbV0gSW1wcm92ZSBNYWtlZmlsZS4KLQotCUl0IG5vdyBzdXBwb3J0cyBib3RoIGEgbm9ybWFsIGJ1aWxkIChgLi9jb25maWd1cmUgJiYgbWFrZScpIGFuZCBhCi0JZGV2ZWxvcG1lbnQgYnVpbGQgKGBtYWtlIGRldmVsJykuCi0KLQkqIHNyYy90b29scy9mdHJhbmRvbS9NYWtlZmlsZSAoVlBBVEgpOiBTZXQgaXQgc28gdGhhdAotCWBsaWJmcmVldHlwZS5hJyBnZXRzIHNlYXJjaGVkIGluIGJvdGggYG9ianMnIChmb3IgdGhlIGRldmVsb3BtZW50Ci0JYnVpbGQpIGFuZCBgb2Jqcy8ubGlicycgKGZvciBhIG5vcm1hbCBidWlsZCB3aGljaCB1c2VzIGxpYnRvb2wpLgotCShMSUJTKTogQWRkIG1pc3NpbmcgbGlicmFyaWVzLgotCShmdHJhbmRvbS5vKTogTmV3IHJ1bGUuCi0JKGZ0cmFuZG9tKTogVXNlIGF1dG9tYXRpYyB2YXJpYWJsZXMuCi0KLTIwMTYtMDktMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gTW9yZSBmaXhlcyBmb3IgaGFuZGxpbmcgb2YgR1ggZGVsdGFzLgotCi0JUHJvYmxlbXMgcmVwb3J0ZWQgYnkgQm9iIFRheWxvciA8Qm9iLlRheWxvckBtb25vdHlwZS5jb20+LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IEZpeCByb3VnaAotCXNhbml0eSB0ZXN0IGZvciBnbHlwaCB2YXJpYXRpb24gYXJyYXkgaGVhZGVyIHNpemUuCi0JQWx3YXlzIHNldCBzdHJlYW0gcG9zaXRpb24gYmVmb3JlIHJlYWRpbmcgcGFja2VkIHggYW5kIHkgZGVsdGFzLgotCUZpeCB0aGlua28gdy5yLnQuIGBsb2NhbHBvaW50cycgYXJyYXkuCi0KLTIwMTYtMDktMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtmdHJhbmRvbV0gVmFyaW91cyBmaXhlcy4KLQotCSogc3JjL3Rvb2xzL2Z0cmFuZG9tL2Z0cmFuZG9tLmMgKEdPT0RfRk9OVFNfRElSKTogUHJvdmlkZSBiZXR0ZXIKLQlkZWZhdWx0LgotCShlcnJvcl9mcmFjdGlvbik6IE1ha2UgaXQgb2YgdHlwZSBgZG91YmxlJyB0byB3b3JrIGFzIGFkdmVydGl6ZWQg4oCTCi0JdGhpcyB3YXMgY29tcGxldGVseSBicm9rZW4uCi0JVXBkYXRlIGFsbCByZWxhdGVkIGNvZGUuCi0JKGVycm9yX2NvdW50LCBmY250KTogTWFrZSBpdCB1bnNpZ25lZCB0byBmaXggY29tcGlsZXIgd2FybmluZ3MuCi0JVXBkYXRlIGFsbCByZWxhdGVkIGNvZGUuCi0JKGZvbnRsaXN0KTogQ2hhbmdlIGBsZW4nIG1lbWJlciB0byBgbG9uZycgdG8gZml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCShGVF9Nb3ZlVG8sIEZUX0xpbmVUbywgRlRfQ29uaWNUbywgRlRfQ3ViaWNUbywgYWJvcnRfdGVzdCk6IFRhZwotCXVudXNlZCB2YXJpYWJsZXMuCi0JKFRlc3RGYWNlLCBGaW5kRm9udHMsIGNvcHlmb250LCBkb190ZXN0KTogRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCShFeGVjdXRlVGVzdCk6IERpdHRvLgotCUNhbGwgYEZUX0RvbmVfRnJlZVR5cGUnLgotCShnZXRFcnJvckNudCk6IFJlcGxhY2UgYGNlaWwnIHdpdGggYW4gb3JkaW5hcnkgY2FzdCB0byBgdW5zaWduZWQKLQlpbnQnLgotCSh1c2FnZSk6IEltcHJvdmUgb3V0cHV0LgotCShtYWluKTogRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvdG9vbHMvZnRyYW5kb20vUkVBRE1FOiBVcGRhdGVkLgotCi0yMDE2LTA5LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gQXZvaWQgbmVnYXRpdmUgYml0bWFwIHN0cmlrZSBkaW1lbnNpb25zICgjNDg5ODUpLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfT3Blbl9GYWNlKTogQ2hlY2sgd2hldGhlciBuZWdhdGlvbiB3YXMKLQlhY3R1YWxseSBzdWNjZXNzZnVsLiAgRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGZhaWwgZm9yIHZhbHVlCi0JLTMyNzY4IGlmIHRoZSB0eXBlIGlzIGBzaWduZWQgc2hvcnQnLiAgSWYgdGhlcmUgYXJlIHByb2JsZW1zLAotCWRpc2FibGUgdGhlIHN0cmlrZS4KLQotMjAxNi0wOS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gQXZvaWQgbnVsbCBwb2ludGVyIHBhc3NlZCB0byBGVF9NRU1fQ09QWSAoIzQ4OTg0KS4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9pbmRleF9nZXRfbmFtZSk6IENoZWNrIGBieXRlX2xlbicuCi0KLTIwMTYtMDktMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt1bml4XSBFbmFibGUgNjRiaXQgc3VwcG9ydCBpbiBmaWxlIHN5c3RlbSBhY2Nlc3MgKCM0ODk2MikuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IENhbGwgYEFDX1NZU19MQVJHRUZJTEUnLgotCi0yMDE2LTA5LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gQXZvaWQgbGVmdCBzaGlmdCBvZiBuZWdhdGl2ZSB2YWx1ZSAoIzQ4OTgwKS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdF9hbGlnbmVkKTogVXNlIHVuc2lnbmVkCi0JY29uc3RhbnQuCi0KLTIwMTYtMDktMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfaGxpbmUpOiBGaXggY2xhbmcgY29tcGlsZXIgd2FybmluZ3MuCi0KLTIwMTYtMDktMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVNvbWUgcHJlcGFyYXRpb25zIGZvciB0aGUgbmV4dCByZWxlYXNlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyk6IEVuYWJsZS4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDE2LTA5LTAxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBTaW1wbGlmeSBzcGFuIHJlbmRlcmluZyBtb3JlLgotCi0JSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMgc2lnbmlmaWNhbnQgY29zdCBhc3NvY2lhdGVkIHdpdGggYEZUX1NwYW4nCi0JY3JlYXRpb24gYW5kIGNhbGxzIHRvIGBncmF5X3JlbmRlcl9zcGFuJyBiZWNhdXNlIGl0IGhhcHBlbnMgc28KLQlmcmVxdWVudGx5LiBUaGlzIHJlbW92ZXMgdGhlc2Ugc3RlcHMgZnJvbSBvdXIgaW50ZXJuYWwgdXNlIGJ1dCBsZWF2ZXMKLQlpdCBhbG9uZSBmb3IgYEZUX1JBU1RFUl9GTEFHX0RJUkVDVCIgdG8gcHJlc2VydmUgQVBJLiBUaGUgc3BlZWQgZ2FpbgotCWlzIGFib3V0IDUlLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfc3Bhbik6IFJlbW92ZWQuIFRoZSBjb2RlIGlzCi0JbWlncmF0ZWQgdG8uLi4KLQkoZ3JheV9obGluZSk6IC4uLiBoZXJlLgotCi0yMDE2LTA4LTMwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBTdHJlYW1saW5lIHBpeG1hcCBkcmF3aW5nIGEgYml0IG1vcmUuCi0KLQlaZXJvIGNvdmVyYWdlIGlzIHVubGlrZWx5ICgxIG91dCBvZiAyNTYpIHRvIHdhcnJhbnQgY2hlY2tpbmcuIFRoaXMKLQlnaXZlcyAwLjUlIHNwZWVkIGltcHJvdmVtZW50IGluIHJlbmRlcmluZyBzaW1wbGUgZ2x5cGhzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9obGluZSwgZ3JheV9yZW5kZXJfc3Bhbik6IFJlbW92ZSBjaGVja3MuCi0KLTIwMTYtMDgtMjkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIFN0cmVhbWxpbmUgcGl4bWFwIGRyYXdpbmcuCi0KLQlUaGlzIGdpdmVzIDIlIHNwZWVkIGltcHJvdmVtZW50IGluIHJlbmRlcmluZyBzaW1wbGUgZ2x5cGhzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoVFBpeG1hcCk6IFJlZHVjZWQgcGl4bWFwIGRlc2NyaXB0b3Igd2l0aCBhCi0JcG9pbnRlciB0byBpdHMgYm90dG9tLWxlZnQgYW5kIHBpdGNoIHRvIGJlIHVzZWQgaW4uLi4KLQkoZ3JheV9UV29ya2VyKTogLi4uIGhlcmUuCi0JKGdyYXlfcmVuZGVyX3NwYW4pOiBNb3ZlIHBpeG1hcCBmbG93IGNoZWNrIGZyb20gaGVyZS4uLgotCShncmF5X3Jhc3Rlcl9yZW5kZXIpOiAuLiB0byBoZXJlLgotCi0yMDE2LTA4LTI3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBSZWR1Y2Ugc3RhY2sgb2YgYmFuZCBib3VuZGFyaWVzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9UQmFuZCk6IFJlbW92ZWQuCi0JKGdyYXlfY29udmVydF9nbHlwaCk6IFVwZGF0ZWQgdG8gc3RhY2sgYmFuZCBib3VuZGFyaWVzIGNvbmNpc2VseS4KLQotMjAxNi0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAoY2lkX2ZhY2Vfb3Blbik6IEltcHJvdmUgaGFuZGxpbmcgb2YgYFNEQnl0ZXMnLgotCi0yMDE2LTA4LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2lkXSBGaXggY29tbWl0IGZyb20gMjAxNi0wNS0xNi4KLQotCSogc3JjL2NpZC9jaWRwYXJzZS5jIChjaWRfcGFyc2VyX25ldyk6IEZpeCBvZmYtYnktb25lIGVycm9ycy4KLQotMjAxNi0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIENhY2hlIG9mZnNldCBhbmQgc2l6ZSB0byBiaXRtYXAgZGF0YSB0YWJsZS4KLQotCVRoaXMgY29tbWl0IGF2b2lkcyBgRUJEVCcgYW5kIGZyaWVuZHMgYmVpbmcgbG9va2VkIHVwIGFnYWluIGFuZAotCWFnYWluIHdoaWxlIGxvYWRpbmcgYSBzaW5nbGUgZW1iZWRkZWQgYml0bWFwLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZVJlYykKLQlbVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTXTogTmV3IGZpZWxkcyBgZWJkdF9zdGFydCcgYW5kCi0JYGViZHRfc2l6ZScuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfaW5pdCk6IE1vdmUgdGFibGUgbG9va3VwIHRvIC4uLgotCSh0dF9mYWNlX2xvYWRfc2JpdCk6IC4uLiB0aGlzIGZ1bmN0aW9uOyBhbHNvIHN0b3JlIHRoZSB0YWJsZSBzaXplCi0JYW5kIG9mZnNldC4KLQotMjAxNi0wOC0yNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yYXN0ZXJfcmVuZGVyKTogTWlub3IgdHdlYWtzLgotCi0yMDE2LTA4LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTFdIEZpeCBoZWFwIGJ1ZmZlciBvdmVyZmxvdy4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTM2Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfY2hhcnN0cmluZ3MpOiBSZWplY3QgZm9udHMgdGhhdCBkb24ndAotCWNvbnRhaW4gZ2x5cGggbmFtZXMuCi0KLTIwMTYtMDgtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBGaXggcHJldmlvdXMgY29tbWl0ICgjNDg5MDEpLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDRfY2hhcl9tYXBfYmluYXJ5KTogVGhpbmtvcy4KLQotMjAxNi0wOC0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFNwZWVkIHVwIGhhbmRsaW5nIG9mIGludmFsaWQgZm9ybWF0IDQgY21hcHMuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9jbWFwNF9uZXh0LCB0dF9jbWFwNF9jaGFyX21hcF9iaW5hcnkpOiBBZGQKLQl0ZXN0cyBmb3IgYG51bV9nbHlwaCcgZnJvbSBgdHRfY21hcDRfY2hhcl9tYXBfbGluZWFyJy4KLQotMjAxNi0wOC0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJpdmVyLmg6IFJlbW92ZSB1bnVzZWQgdHlwZWRlZnMuCi0KLTIwMTYtMDgtMjIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIFNpbXBsaWZ5IHNwYW4gcmVuZGVyaW5nLgotCi0JVGhpcyByZW1vdmVzIHVubmVjZXNzYXJ5IGNvbXBsZXhpdHkgb2Ygc3BhbiBtZXJnaW5nIGFuZCBidWZmZXJpbmcuCi0JSW5zdGVhZCwgdGhlIHNwYW5zIGFyZSByZW5kZXJlZCBhcyB0aGV5IGNvbWUsIHNwZWVkaW5nIHVwIHRoZQotCXJlbmRlcmluZyBieSBhYm91dCA1JSBhcyBhIHJlc3VsdC4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgW0ZUX01BWF9HUkFZX1NQQU5TXTogTWFjcm8gcmVtb3ZlZC4KLQkoZ3JheV9UV29ya2VyKTogUmVtb3ZlIHNwYW4gYnVmZmVyIGFuZCByZWxhdGVkIGZpZWxkcy4KLQkoZ3JheV9zd2VlcCwgZ3JheV9obGluZSk6IFVwZGF0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oOiBSZW1vdmUgZG9jdW1lbnRhdGlvbiBub3RlIGFib3V0Ci0JYEZUX01BWF9HUkFZX1NQQU5TJywgd2hpY2ggd2FzIG5ldmVyIGluIGBmdG9wdGlvbi5oJyBhbmQgaXMgbm93IGdvbmUuCi0KLTIwMTYtMDgtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IGBNUFMnIGluc3RydWN0aW9uLgotCi0JQWNjb3JkaW5nIHRvIEdyZWcgSGl0Y2hjb2NrLCBNUFMgaW4gRFdyaXRlIHJlYWxseSByZXR1cm5zIHRoZSBwb2ludAotCXNpemUuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuaCAoVFRfU2l6ZVJlYyk6IEFkZCBgcG9pbnRfc2l6ZScgbWVtYmVyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfc2l6ZV9yZXF1ZXN0KTogU2V0IGBwb2ludF9zaXplJy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmggKFRUX0V4ZWNDb250ZXh0UmVjKTogQWRkIGBwb2ludFNpemUnCi0JbWVtYmVyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfTG9hZF9Db250ZXh0KTogVXBkYXRlZC4KLQkoSW5zX01QUyk6IEZpeCBpbnN0cnVjdGlvbi4KLQotMjAxNi0wOC0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2x6d10gT3B0aW1pemUgbGFzdCBjb21taXQuCi0KLQkqIHNyYy9sencvZnR6b3Blbi5jIChmdF9sendzdGF0ZV9nZXRfY29kZSk6IE1vdmUgY2hlY2sgaW50bwotCWNvbmRpdGlvbmFsIGNsYXVzZS4KLQotMjAxNi0wOC0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2x6d10gQXZvaWQgaW52YWxpZCBsZWZ0IHNoaWZ0LgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI5NTM2NgotCi0JKiBzcmMvbHp3L2Z0em9wZW4uYyAoZnRfbHp3c3RhdGVfZ2V0X2NvZGUpOiBMaW1pdCBgbnVtX2JpdHMnLgotCi0yMDE2LTA4LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbbHp3XSBBdm9pZCBidWZmZXIgb3ZlcnJ1bi4KLQotCVJlcG9ydGVkIGFzCi0KLQkgIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzMyODMKLQotCSogc3JjL2x6dy9mdHpvcGVuLmMgKGZ0X2x6d3N0YXRlX3JlZmlsbCk6IEVuc3VyZSBgYnVmX3NpemUnIGRvZXNuJ3QKLQl1bmRlcmZsb3cuCi0KLTIwMTYtMDgtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBBZGQgY2FzdC4KLQotMjAxNi0wOC0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3dpbmZvbnRzXSBBdm9pZCB6ZXJvIGJpdG1hcCB3aWR0aCBhbmQgaGVpZ2h0LgotCi0JUmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3MjE3MwotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9GYWNlX0luaXQpOiBDaGVjayB6ZXJvIHBpeGVsIGhlaWdodC4KLQkoRk5UX0xvYWRfR2x5cGgpOiBDaGVjayBmb3IgemVybyBwaXRjaC4KLQotMjAxNi0wOC0xMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoUG9wX1B1c2hfQ291bnQpOiBSZXZlcnQgY2hhbmdlcy4KLQotMjAxNi0wOC0xMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogTWlub3IgYW5kIGZvcm1hdHRpbmcuCi0KLTIwMTYtMDgtMTEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFBvcF9QdXNoX0NvdW50KTogRml4IHNvbWUgZW50cmllcy4KLQotMjAxNi0wOC0xMCAgUGV0ZXIgS2xvdHogIDxQZXRlci5LbG90ekBpdGgtaWNvc2VydmUuY29tPgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9obGluZSk6IEZpeCB1bmluaXRpYWxpemVkIGFjY2Vzcy4KLQotMjAxNi0wOC0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFVzZSBjb3JyZWN0IHR5cGUgZm9yIGBpdGFsaWNBbmdsZScgZmllbGQgKCM0ODczMikuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfcG9zdCk6IEZpeCB0eXBlcy4KLQotMjAxNi0wOC0wNiAgSm9uIFNwZW5jZXIgIDxqb25Aam9uc3BlbmNlci5jYT4KLQotCVtzZm50XSBGaXggYEZUX0dldF9BZHZhbmNlJyBmb3IgYml0bWFwIHN0cmlrZXMuCi0KLQlgRlRfR2V0X0FkdmFuY2UnIHJldHVybnMgMCBmb3IgYml0bWFwIGZvbnRzLiAgSXQgZmlyc3QgZ2V0cyB0aGUKLQlhZHZhbmNlIHZhbHVlIGZyb20gdGhlIGZvbnQgdGFibGUgYW5kIHRoZW4gc2NhbGVzIGl0IGJ5IHRoZQotCWBmb250LT5zaXplLT5tZXRyaWNzLT54X3NjYWxlJyBmaWVsZC4gIEJ1dCBgRlRfU2VsZWN0X1NpemUnIGRvZXNuJ3QKLQlzZXQgdGhhdCB2YWx1ZSBmb3IgYml0bWFwIGZvbnRzIGFuZCB0aGUgYWR2YW5jZSBnZXRzIHNjYWxlZCB0byB6ZXJvLgotCi0JVGFrZW4gZnJvbQotCi0JICBodHRwczovL2dpdGh1Yi5jb20vYmVoZGFkL2hhcmZidXp6L2lzc3Vlcy8yNTIKLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcykKLQk8VFRfU0JJVF9UQUJMRV9UWVBFX0VCTEM+OiBTZXQgc2NhbGUgdmFsdWVzLgotCi0yMDE2LTA4LTA2ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVt0cnVldHlwZV0gRml4IEdYIHZhcmlhdGlvbiBoYW5kbGluZyBvZiBjb21wb3NpdGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKQotCVtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogQ2hlY2sgYEFSR1NfQVJFX1hZX1ZBTFVFUycgZmxhZy4KLQotMjAxNi0wOC0wNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gTWlub3IgcmVmYWN0b3JpbmcuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9zY2FubGluZSwgZ3JheV9yZW5kZXJfbGluZSk6Ci0JVXBkYXRlZC4KLQotMjAxNi0wNy0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnQsIHRydWV0eXBlXSBEb24ndCBhYm9ydCBvbiBpbnZhbGlkIGBtYXhDb21wb25lbnREZXB0aCcuCi0KLQlTaW5jZSAyMDE2LTA1LTE2IHdlIGRldGVjdCBpbmZpbml0ZSByZWN1cnNpb24gZGlyZWN0bHkuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfbWF4cCk6IERvbid0IGFkanVzdAotCWBtYXhDb21wb25lbnREZXB0aCcuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogRG9uJ3QgYWJvcnQgaWYKLQlgbWF4Q29tcG9uZW50RGVwdGgnIGlzIG5vdCB2YWxpZC4gIEluc3RlYWQsIHNpbXBseSBhZGp1c3QgaXRzIHZhbHVlCi0JYW5kIGVtaXQgYSB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMTYtMDctMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSk6IE1pbm9yLgotCi0JTm8gZnVuY3Rpb25hbCBjaGFuZ2UuCi0KLTIwMTYtMDctMjIgIEhpbi1UYWsgTGV1bmcgIDxodGwxMEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0KLQlbdHJ1ZXR5cGVdIFJlY29yZCB0aGUgZW5kIG9mIElERUZzLgotCi0JVG8gbWF0Y2ggdGhlIGxvZ2ljIGluIEZERUYuICBUaGUgdmFsdWUgb2YgdGhlIGVuZCBpcyBvbmx5IHVzZWQgZm9yCi0JYm91bmQtY2hlY2tpbmcgaW4gYEluc19KTVBSJywgc28gaXQgbWF5IG5vdCBoYXZlIGJlZW4gb2J2aW91cyB0aGF0Ci0JaXQgd2FzIG5vdCByZWNvcmRlZC4gIFRlc3RlZCAoYXMgcGFydCBvZiBGb250IFZhbGlkYXRvciAyLjApIGFsbCB0aGUKLQlmb250cyBvbiBGZWRvcmEgYW5kIGRpZCBub3Qgc2VlIGFueSBjaGFuZ2UuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfSURFRik6IFVwZGF0ZWQuCi0KLTIwMTYtMDctMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gU2FuaXRpemVyIGZpeCwgc2Vjb25kIHRyeS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMpOiBGaXggYm91bmRhcnkKLQl0ZXN0cyBhbmQgdXNlIG9ubHkgb25lIHNsb3QgbW9yZS4KLQotMjAxNi0wNy0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBTYW5pdGl6ZXIgZml4LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfcmVhZHBhY2tlZHBvaW50cyk6IEluY3JlYXNlIGFycmF5Ci0JdG8gZml4IG5lc3RlZCBsb29wcy4KLQotMjAxNi0wNy0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBNYWtlIEdFVERBVEEgd29yayBvbmx5IGZvciBHWCBmb250cy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKG9wY29kZV9uYW1lKTogVXBkYXRlZC4KLQkoSW5zX0dFVERBVEEpOiBPbmx5IGRlZmluZSBmb3IgYFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQnLgotCShUVF9SdW5JbnMpOiBVcGRhdGVkLgotCi0yMDE2LTA3LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCBzdXBwb3J0IGZvciBBcHBsZSdzCi0KLQkgIEdFVERBVEFbXSwgb3Bjb2RlIDB4OTIKLQotCWJ5dGVjb2RlIGluc3RydWN0aW9uLiAgSXQgYWx3YXlzIHJldHVybnMgMTcsIGFuZCB3ZSBoYXZlIGFic29sdXRlbHkKLQlubyBpZGVhIHdoYXQgaXQgaXMgZ29vZCBmb3IuLi4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFBvcF9QdXNoX0NvdW50LCBvcGNvZGVfbmFtZSk6IFVwZGF0ZWQuCi0JKEluc19HRVREQVRBKTogTmV3IGZ1bmN0aW9uLgotCShUVF9SdW5JbnMpOiBBZGQgaXQuCi0KLTIwMTYtMDctMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQWRkIGJ5dGVjb2RlIHN1cHBvcnQgZm9yIEdYIHZhcmlhdGlvbiBmb250cy4KLQotCVRoaXMgY29tbWl0IGltcGxlbWVudHMgdW5kb2N1bWVudGVkIChidXQgY29uZmlybWVkKSBzdHVmZiBmcm9tCi0JQXBwbGUncyBvbGQgYnl0ZWNvZGUgZW5naW5lLgotCi0JICBHRVRWQVJJQVRJT05bXSwgb3Bjb2RlIDB4OTEKLQkgICAgVGhpcyBvcGNvZGUgcHVzaGVzIG5vcm1hbGl6ZWQgdmFyaWF0aW9uIGNvb3JkaW5hdGVzIGZvciBhbGwgYXhlcwotCSAgICBvbnRvIHRoZSBzdGFjayAoaW4gMi4xNCBmb3JtYXQpLiAgQ29vcmRpbmF0ZSBvZiBmaXJzdCBheGlzIGdldHMKLQkgICAgcHVzaGVkIGZpcnN0LgotCi0JICBHRVRJTkZPW10sIHNlbGVjdG9yIGJpdCAzCi0JICAgIElmIEdYIHZhcmlhdGlvbiBzdXBwb3J0IGlzIGVuYWJsZWQsIGJpdCAxMCBvZiB0aGUgcmVzdWx0IGlzIHNldAotCSAgICB0byAxLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYzogSW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0guCi0JKG9wY29kZV9uYW1lKSBbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IFVwZGF0ZWQuCi0JKEluc19HRVRJTkZPKSBbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IEhhbmRsZSBzZWxlY3RvcgotCWJpdCAzLCBjaGVja2luZyBzdXBwb3J0IGZvciB2YXJpYXRpb24gZ2x5cGggaGludGluZy4KLQkoSW5zX0dFVFZBUklBVElPTikgW1RUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlRdOiBOZXcgZnVuY3Rpb24KLQl0byBpbXBsZW1lbnQgb3Bjb2RlIDB4OTEuCi0JKFRUX1J1bklucykgW1RUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlRdOiBIYW5kbGUgb3Bjb2RlIDB4OTEuCi0KLTIwMTYtMDctMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IEdFVElORk8gYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfR0VUSU5GTyk6IEZpeCByZXR1cm4gdmFsdWUgZm9yCi0Jc3RyZXRjaGluZyBpbmZvcm1hdGlvbi4KLQotMjAxNi0wNy0xNiAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1ha2UgYWxsIGdseXBocyBpbiBgWnljb24nIEdYIGZvbnQgd29yay4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMpOiBGaXggYm91bmRhcnkKLQl0ZXN0cy4KLQotMjAxNi0wNy0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggR1ggZGVsdGEgdHJhY2luZy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBUcmFjZQotCXJlbGF0aXZlIHBvaW50IG1vdmVtZW50cy4KLQotMjAxNi0wNy0xNiAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1vcmUgZml4ZXMgZm9yIEdYLgotCi0JVGhpcyBmaW5hbGx5IGZpeGVzIHRoZSByZW5kZXJpbmcgb2YgdGhlIGN5Y2xpc3QgYW5kIHRoZSBsaXphcmQgaW4KLQl0aGUgYFp5Y29uJyBmb250LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfcmVhZHBhY2tlZHBvaW50cyk6IGBmaXJzdCcgcG9pbnQKLQlpbmRleCBpcyBhbHdheXMgY3VtdWxhdGl2ZS4KLQotCSh0dF9oYW5kbGVfZGVsdGFzKTogUmVuYW1lIHRvLi4uCi0JKHR0X2ludGVycG9sYXRlX2RlbHRhcyk6IC4uLiBUaGlzLgotCUFkZCBuZXcgcGFyYW1ldGVyIGZvciBvdXRwdXQgcG9pbnQgYXJyYXkuCi0JVXBkYXRlIGNhbGxlci4KLQotCShUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IEFkZCBgcG9pbnRzX291dCcgYXJyYXk7IGl0IG5vdyBob2xkcwotCXRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvZiBgdHRfaW50ZXJwb2xhdGVfZGVsdGFzJyB0aGF0IGFyZSB0byBiZQotCWFkZGVkIHRvIGBvdXRsaW5lLT5wb2ludHMnLgotCi0yMDE2LTA3LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyk6IFRoaW5rby4KLQotCWBtYXhfcG9zJyBpcyBhbHdheXMgbGFyZ2VyIHRoYW4gYG1pbl9wb3MnIHNvIGBGVF9BQlMnIGlzIG5vdCBuZWVkZWQuCi0KLQlSZXBvcnRlZCBieSBBbGV4ZWkuCi0KLTIwMTYtMDctMTYgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NSVJQKTogRml4IGNvcHktYW5kLXBhc3RlIGVycm9yLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBIaW4tVGFrIExldW5nLgotCi0yMDE2LTA3LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gVXBkYXRlIGFuZCBpbXByb3ZlIHNlZ21lbnQgYW5kIGVkZ2UgdHJhY2luZy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzKTogVHJhY2UKLQlgZGVsdGEnIGFsc28uCi0JRG9uJ3Qgc2hvdyBmaXJzdCBwb2ludCBvZiBzZWdtZW50IGFzIGEgcmVwbGFjZW1lbnQgZm9yIGBwb3MnOyB0aGlzCi0JaXMgKGEpIG1pc2xlYWRpbmcsIHNpbmNlIHRoZSBkaWZmZXJlbmNlIHRvIGBwb3MnIGNhbiBiZSBhbG1vc3QKLQlhcmJpdHJhcmlseSBsYXJnZSBpbiBjb3JuZXIgY2FzZXMsIGFuZCAoYikgaXQgaXMgYmV0dGVyIHRvIGhhdmUgYWxsCi0Jc2VnbWVudCBkYXRhIGluIGZvbnQgdW5pdHMgaW5zdGVhZCBvZiBhIHNpbmdsZSB2YWx1ZSBnaXZlbiBpbiBvdXRwdXQKLQlzcGFjZSBjb29yZGluYXRlcy4KLQlJbXByb3ZlIGxheW91dC4KLQkoYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyk6IFNob3cgcHgtPnVuaXRzIGFuZCB1bml0cy0+cHggY29udmVyc2lvbgotCXZhbHVlcyBmb3IgY29udmVuaWVuY2UuCi0JSW1wcm92ZSBsYXlvdXQuCi0KLTIwMTYtMDctMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGb3IgZWRnZXMsIHJlamVjdCBzZWdtZW50cyB3aWRlciB0aGFuIDFweCAoIzQxMzM0KS4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9TZWdtZW50UmVjKTogTmV3IG1lbWJlciBgZGVsdGEnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMpOiBDb21wdXRlCi0JYGRlbHRhJy4KLQkoYWZfbGF0aW5faGludHNfY29tcHV0ZV9lZGdlcyk6IFJlamVjdCBzZWdtZW50cyB3aXRoIGEgZGVsdGEgbGFyZ2VyCi0JdGhhbiAwLjVweC4KLQotMjAxNi0wNy0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0lTX05BTUVEX0lOU1RBTkNFKTogTmV3IG1hY3JvLgotCi0yMDE2LTA3LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IGBmYWNlX2luZGV4JyB2YWx1ZSBpbiBgRlRfRmFjZScgZm9yIG5hbWVkIGluc3RhbmNlcy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfaW5pdF9mYWNlKTogRG9uJ3Qgc3RyaXAgb2ZmIGhpZ2hlciAxNmJpdHMuCi0KLTIwMTYtMDctMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBGaXggdHJhY2luZy4KLQotMjAxNi0wNy0xNCAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBneHZhciBkZWx0YSBpbnRlcnBvbGF0aW9uLgotCi0JVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBiYXNlIGZvbnQgc2hvdWxkIGJlIHVzZWQgZm9yIGludGVycG9sYXRpb24KLQlwdXJwb3NlcywgTk9UIHRoZSBjdXJyZW50IHBvaW50cyAoaS5lLiwgdGhlIHJlc3VsdCBvZiBhY2N1bXVsYXRpb24KLQlvZiBwcmV2aW91cyBkZWx0YXMpLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IEluaXRpYWxpemUKLQlgcG9pbnRzX29yZycgYmVmb3JlIGxvb3Bpbmcgb3ZlciBhbGwgdHVwbGVzLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMTYtMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLWluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci1mdWxseS4KLQotCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1jb2Rpbmc6IHV0Zi04Ci1FbmQ6CmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cuMjAgYi9DaGFuZ2VMb2cuMjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzc2ZTguLjAwMDAwMDAKLS0tIGEvQ2hhbmdlTG9nLjIwCisrKyAvZGV2L251bGwKQEAgLTEsMjYxMyArMCwwIEBACi0yMDAyLTAyLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFJFQURNRTogRml4IHR5cG8uCi0JKiBkb2NzL0NIQU5HRVM6IE1pbm9yIGZpeGVzLgotCi0KLQkqIFZlcnNpb24gMi4wLjggcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLTIwMDItMDItMDggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGluZyBmb3IgMi4wLjguCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogU2V0dGluZyBgUEFUQ0hfTEVWRUwnIHRvIDggYW5kCi0JcmVtb3ZpbmcgYEZUX0dldF9OZXh0X0NoYXInIGZyb20gdGhlIEFQSSAodGVtcG9yYXJpbHkpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IEFkZGluZyBjb21tZW50cyB0byBGVF9HZXRfTmV4dF9DaGFyOwotCW5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG1pZ2h0IHRlbXBvcmFyaWx5IGJlIHJlbW92ZWQgZm9yIHRoZSAyLjAuOAotCXJlbGVhc2UuCi0KLTIwMDItMDItMDcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9sb2FkX2ZvbnQpOiBSZW1vdmVkIGltbWF0dXJlIHN1cHBvcnQgb2YKLQl0aGUgQVZFUkFHRV9XSURUSCBwcm9wZXJ0eS4KLQotMjAwMi0wMi0wNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoU0ZOVF9Mb2FkX0ZhY2UpOiBTaW5jZSBtYW55IGZvbnRzIGVtYmVkZGVkIGluCi0JUERGIGRvY3VtZW50cyBkbyBub3QgaW5jbHVkZSAnY21hcCcsICdwb3N0JyBhbmQgJ25hbWUnIHRhYmxlcywgdGhlCi0JU0ZOVCBmYWNlIGxvYWRlciBoYXMgYmVlbiBjaGFuZ2VkIHRvIG5vdCBpbW1lZGlhdGVseSByZXBvcnQgYW4KLQllcnJvciBpZiB0aGVzZSBhcmUgbm90IHByZXNlbnQuCi0KLQlOb3RlIHRoYXQgdGhlIHNwZWNpZmljYXRpb24gX3JlcXVpcmVzXyB0aGVzZSB0YWJsZXMsIGJ1dCBBZG9iZQotCXNlZW1zIHRvIGlnbm9yZSBpdCBjb21wbGV0ZWx5LgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYzogUmVtb3ZpbmcgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfcmVhZF9UT0MpOiBVc2UgRlRfVUludC4KLQkocGNmX3BhcnNlX21ldHJpYywgcGNmX3BhcnNlX2NvbXByZXNzZWRfbWV0cmljKTogUmVtb3ZlZC4gIENvZGUKLQlpcyBub3cgaW4gLi4uCi0JKHBjZl9nZXRfbWV0cmljKTogSGVyZS4KLQkocGNmU2Vla1RvVHlwZSk6IFJlbmFtZWQgdG8gLi4uCi0JKHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUpOiBUaGlzLgotCVVzZSBGVF9JbnQuCi0JKHBjZkhhc1R5cGUpOiBSZW5hbWVkIHRvIC4uLgotCShwY2ZfaGFzX3RhYmxlX3R5cGUpOiBUaGlzLgotCVVzZSBGVF9JbnQuCi0JKGZpbmRfcHJvcGVydHkpOiBSZW5hbWVkIHRvIC4uLgotCShwY2ZfZmluZF9wcm9wZXJ0eSk6IFRoaXMuCi0JVXNlIEZUX0ludC4KLQkocGNmX2dldF9iaXRtYXBzLCBwY2ZfZ2V0X2VuY29kaW5ncyk6IEhhbmRsZSBpbnZhbGlkIFBDRiBmb250cwotCWJldHRlciAoZGVsYXlpbmcgZm9ybWF0IGNoZWNrcyBvdXQgb2YgRlRfQWNjZXNzX0ZyYW1lIC4uCi0JRlRfRm9yZ2V0X0ZyYW1lIGJsb2NrcyB0byBhdm9pZCBsZWF2aW5nIHRoZSBzdHJlYW0gaW4gYW4gaW5jb3JyZWN0Ci0Jc3RhdGUgd2hlbiBlbmNvdW50ZXJpbmcgYW4gaW52YWxpZCBQQ0YgZm9udCkuCi0KLQkqIHNyYy9wY2YvcGNmZHJpdmVyLmMgKFBDRl9Eb25lX0ZhY2UpOiBSZW5hbWVkIHRvIC4uLgotCShQQ0ZfRmFjZV9Eb25lKTogVGhpcy4KLQkoUENGX0luaXRfRmFjZSk6IFJlbmFtZWQgdG8gLi4uCi0JKFBDRl9GYWNlX0luaXQpOiBUaGlzLgotCShQQ0ZfR2V0X0NoYXJfSW5kZXgpOiBSZW5hbWVkIHRvIC4uLgotCShQQ0ZfQ2hhcl9HZXRfSW5kZXgpOiBUaGlzLgotCShQQ0ZfR2V0X05leHRfQ2hhcik6IFJlbmFtZWQgdG8gLi4uCi0JKFBDRl9DaGFyX0dldF9OZXh0KTogVGhpcy4KLQkocGNmX2RyaXZlcl9jbGFzcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9wY2YvcGNmLmggKFBDRl9Eb25lX0ZhY2UpOiBSZW1vdmVkLgotCi0yMDAyLTAyLTA2ICBEZXRsZWYgV8O8cmtuZXIgIDxUZXRpU29mdEBhcGcubGFobi5kZT4KLQotCSogc3JjL3BjZi9wY2Zkcml2ZXIuYyAoRlRfRG9uZV9GYWNlKTogRml4ZWQgc21hbGwgbWVtb3J5IGxlYWsuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfbG9hZF9mb250KTogTm93IGhhbmRsZXMgdGhlIGBBVkVSQUdFX1dJRFRIJwotCXByb3BlcnR5IHRvIHJldHVybiBjb3JyZWN0IGNoYXJhY3RlciBwaXhlbCAod2lkdGgvaGVpZ2h0KSBwYWlycyBmb3IKLQllbWJlZGRlZCBiaXRtYXBzLgotCi0yMDAyLTAyLTA0ICBLZWl0aCBQYWNrYXJkICA8a2VpdGhwQGtlaXRocC5jb20+Ci0KLQlBZGRpbmcgdGhlIGZ1bmN0aW9uIGBGVF9HZXRfTmV4dF9DaGFyJywgZG9pbmcgdGhlIG9idmlvdXMgdGhpbmcKLQl3LnIudC4gdGhlIHNlbGVjdGVkIGNoYXJtYXAuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogQWRkIHByb3RvdHlwZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaDogQWRkIGBGVERyaXZlcl9nZXROZXh0Q2hhcicKLQl0eXBlZGVmLgotCShGVF9Ecml2ZXJfQ2xhc3MpOiBVc2UgaXQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzbmFtZXMuaDogQWRkIGBQU19OZXh0X1VuaWNvZGVfRnVuYycKLQl0eXBlZGVmLgotCShQU05hbWVzX0ludGVyZmFjZSk6IFVzZSBpdC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oOiBBZGQgYFRUX0NoYXJOZXh0X0Z1bmMnCi0JdHlwZWRlZi4KLQkoVFRfQ01hcFRhYmxlKTogVXNlIGl0LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X05leHRfQ2hhcik6IE5ldyBmdW5jdGlvbiwgaW1wbGVtZW50aW5nCi0JaGlnaC1sZXZlbCBBUEkuCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfbmV4dF9jaGFyKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfZHJpdmVyX2NsYXNzKTogQWRkIGl0LgotCSogc3JjL2NpZC9jaWRyaXZlci5jIChDaWRfR2V0X05leHRfQ2hhcik6IE5ldyBmdW5jdGlvbi4KLQkodDFjaWRfZHJpdmVyX2NsYXNzKTogQWRkIGl0LgotCSogc3JjL3BjZi9wY2Zkcml2ZXIuYyAoUENGX0dldF9OZXh0X0NoYXIpOiBOZXcgZnVuY3Rpb24uCi0JKHBjZl9kcml2ZXJfY2xhc3MpOiBBZGQgaXQuCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jIChQU19OZXh0X1VuaWNvZGUpOiBOZXcgZnVuY3Rpb24uCi0JKHBzbmFtZXNfaW50ZXJmYWNlKTogQWRkIGl0LgotCSogc3JjL3NmbnQvdHRjbWFwLmMgKGNvZGVfdG9fbmV4dDAsIGNvZGVfdG9fbmV4dDIsIGNvZGVfdG9fbmV4dDQsCi0JY29kZV90b19uZXh0NiwgY29kZV90b19uZXh0XzhfMTIsIGNvZGVfdG9fbmV4dF8xMCk6IE5ldyBhdXhpbGlhcnkKLQlmdW5jdGlvbnMuCi0JKFRUX0NoYXJNYXBfTG9hZCk6IFVzZSB0aGVtLgotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKEdldF9OZXh0X0NoYXIpOiBOZXcgZnVuY3Rpb24uCi0JKHR0X2RyaXZlcl9jbGFzcyk6IEFkZCBpdC4KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jIChHZXRfTmV4dF9DaGFyKTogTmV3IGZ1bmN0aW9uLgotCSh0MV9kcml2ZXJfY2xhc3MpOiBBZGQgaXQuCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9HZXRfTmV4dF9DaGFyKTogTmV3IGZ1bmN0aW9uLgotCSh3aW5mbnRfZHJpdmVyX2NsYXNzKTogQWRkIGl0LgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2xvYWRfZm9udCk6IEZvciBub3csIHJlcG9ydCBVbmljb2RlIGZvcgotCVVuaWNvZGUgYW5kIExhdGluIDEgZW5jb2RpbmdzLgotCi0yMDAyLTAyLTAyICBLZWl0aCBQYWNrYXJkICA8a2VpdGhwQGtlaXRocC5jb20+Ci0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbjogQWRkIG1pc3NpbmcgYGZpJy4KLQotCi0JKiBWZXJzaW9uIDIuMC43IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0yMDAyLTAyLTAxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogSW5jcmVhc2luZyBGUkVFVFlQRV9QQVRDSCB0byA3Ci0JZm9yIHRoZSBuZXcgcmVsZWFzZS4KLQotMjAwMi0wMS0zMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBSRUFETUUsIFJFQURNRS5VTlgsIGRvY3MvQ0hBTkdFUzogVXBkYXRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCi0JMi4wLjcgcmVsZWFzZS4KLQotMjAwMi0wMS0zMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBJTlNUQUxMOiBNb3ZlZCB0byAuLi4KLQkqIGRvY3MvSU5TVEFMTDogSGVyZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgYGluc3RhbGwnIHNjcmlwdCBvbgotCVdpbmRvd3MsIHdoZXJlIHRoZSBmaWxlc3lzdGVtIGRvZXNuJ3QgcHJlc2VydmUgY2FzZS4KLQotMjAwMi0wMS0yOSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBjb25maWd1cmU6IEZpeGVkIHRoZSBzY3JpcHQuICBJdCBwcmV2aW91c2x5IGRpZG4ndCBhY2NlcHQgbW9yZQotCXRoYW4gb25lIGFyZ3VtZW50IGNvcnJlY3RseS4gIEZvciBleGFtcGxlLCB3aGVuIHR5cGluZzoKLQotCSAgLi9jb25maWd1cmUgLS1kaXNhYmxlLXNoYXJlZCAtLWRpc2FibGUtbmxzCi0KLQl0aGUgYC0tZGlzYWJsZS1ubHMnIHdhcyBpbmNvcnJlY3RseSBzZW50IHRvIHRoZSBgbWFrZScgcHJvZ3JhbS4KLQotMjAwMi0wMS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBSRUFETUUuVU5YOiBGaXggdHlwby4KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKHVuaW5zdGFsbCk6IEZpeCBsaWJyYXJ5IG5hbWUgZm9yIGxpYnRvb2wuCi0KLTIwMDItMDEtMjggIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaSAgPEZyYW5jZXNjby5aYXBwYS5OYXJkZWxsaUBlbnMuZnI+Ci0KLQkqIHNyYy9wY2YvcGNmZHJpdmVyLmMgKFBDRl9Eb25lX0ZhY2UpOiBGaXggaW5jb3JyZWN0IGRlc3RydWN0aW9uIG9mCi0JdGhlIGZhY2Ugb2JqZWN0IChmYWNlLT50b2MudGFibGVzLCBmYWNlLT5yb290LmZhbWlseV9uYW1lLAotCWZhY2UtPnJvb3QuYXZhaWxhYmxlX3NpemUsIGZhY2UtPmNoYXJzZXRfZW5jb2RpbmcsCi0JZmFjZS0+Y2hhcnNldF9yZWdpc3RyeSBhcmUgbm93IGZyZWVkKS4gIFRoYW5rcyB0byBOaWVscyBNb3NlbGV5LgotCi0yMDAyLTAxLTI4ICBSb2JlcnRvIEFsYW1lZGEgIDxvamFuY2Fub0BnZWVrbWFpbC5kZT4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9lbmNvZGluZyk6IFNldCBgbG9hZGVyLT5udW1fY2hhcnMnLgotCi0yMDAyLTAxLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2Vfc3VicnMsIHBhcnNlX2NoYXJzdHJpbmdzKTogVXNlIGNvcHkKLQlvZiBgYmFzZScgc3RyaW5nIGZvciBkZWNyeXB0aW5nIHRvIG5vdCBtb2RpZnkgdGhlIG9yaWdpbmFsIGRhdGEuCi0JQmFzZWQgb24gYSBwYXRjaCBieSBKYWt1YiBCb2d1c3ogPHFib29zaEBwbGQub3JnLnBsPi4KLQotMjAwMi0wMS0yNyAgR2l1bGlhbm8gUG9jaGluaSAgPHBvY2hpbmlAc2hpbnkuaXQ+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9zY2FubGluZSk6IEZpeCBidWcgd2hpY2ggY2F1c2VkCi0JYmFkIHJlbmRlcmluZyBvZiB0aGluIGxpbmVzIChsZXNzIHRoYW4gb25lIHBpeGVsIHRoaWNrKS4KLQotMjAwMi0wMS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfbmFtZV9pbmRleCk6IE1ha2UgbGFzdCBwYXRjaCB3b3JrCi0JYWN0dWFsbHkuCi0KLTIwMDItMDEtMjUgIE1hcnRpbiBaaW5zZXIgIDx6aW5zZXJAZGVjdXMuZGU+Ci0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChmdGNfbm9kZV9kb25lLCBmdGNfbm9kZV9kZXN0cm95KTogRml4Ci0JY29tcGlsYXRpb24gd2FybmluZ3MuCi0JKiBzcmMvYmFzZS9kZXNjcmlwLm1tcyAoT0JKUyk6IEFkZCBgZnRtbS5vYmonLgotCSogc3JjL2NhY2hlL2Rlc2NyaXAubW1zIChmdGNhY2hlLm9iaik6IERlcGVuZGVuY2llcyBhZGRlZC4KLQotMjAwMi0wMS0yNSAgV0FORyBZaSAgPHdhbmd5aUBmb3VuZGVyLmNvbS5jbj4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X25hbWVfaW5kZXgpOiBGaXggZGVhbGxvY2F0aW9uIGJ1Zy4KLQotMjAwMi0wMS0yMSAgQW50b2luZSBMZWNhICA8QW50b2luZS1GcmVldHlwZUBMZWNhLU1hcnRpLm9yZz4KLQotCSogZG9jcy9QQVRFTlRTOiBUeXBvIGZpeGVkICh0aGFua3MgdG8gRGV0bGVmIGBIYXdrZXllJyBXw7xya25lcikgaW4KLQl0aGUgVVJMIGZvciB0aGUgb25saW5lIHJlc291cmNlLgotCi0yMDAyLTAxLTE4ICBJYW4gQnJvd24gIDxpYW4uYnJvd25AcHJpbnRzb2Z0LmRlPgotCi0JKiBidWlsZHMvd2luMzIvZnRkZWJ1Zy5jOiBOZXcgZmlsZS4KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcDogVXBkYXRlZC4KLQotMjAwMi0wMS0xOCAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS9zcmMvYmFzZS9mdHN5c3RlbS5jOiBVcGRhdGVkIGZvciBBbWlnYU9TIDMuOS4KLQkqIGJ1aWxkcy9hbWlnYS9SRUFETUU6IFVwZGF0ZWQuCi0KLTIwMDItMDEtMTggIElhbiBCcm93biAgPGlhbi5icm93bkBwcmludHNvZnQuZGU+Ci0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcDogVXBkYXRlZC4KLQotMjAwMi0wMS0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZTIuYTQ6IFRoZSBzY3JpcHQgd2FzIHN0aWxsIGJ1Z2d5LgotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluOiBNYWtlIGl0IHJlYWxseSB3b3JrIGZvciBhbnkgaW5zdGFsbAotCXByZWZpeC4KLQotMjAwMi0wMS0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZTIuYTQ6IEZpeCBzb21lIHNlcmlvdXMgYnVncy4KLQotMjAwMi0wMS0wOSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IEJ1aWxkIHRvcC1sZXZlbCBKYW1maWxlLgotCi0yMDAyLTAxLTA5ICBNYXhpbSBTaGVtYW5hcmV2ICA8bWNzZWVtYWdnQHlhaG9vLmNvbT4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmVuZGVyX2xpbmUpOiBTbWFsbCBvcHRpbWl6YXRpb24gdG8KLQl0aGUgc21vb3RoIGFudGktYWxpYXNlZCByZW5kZXJlciB0aGF0IGRlYWxzIHdpdGggdmVydGljYWwgc2VnbWVudHMuCi0JVGhpcyByZXN1bHRzIGluIGEgNS03JSBzcGVlZHVwIGluIHJlbmRlcmluZyBzcGVlZC4KLQotMjAwMi0wMS0wOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JQWRkZWQgc29tZSB3cmFwcGVyIHNjcmlwdHMgdG8gbWFrZSB0aGUgaW5zdGFsbGF0aW9uIG1vcmUKLQlVbml4LWZyaWVuZGx5LgotCi0JKiBjb25maWd1cmUsIGluc3RhbGw6IE5ldyBmaWxlcy4KLQotCSogSU5TVEFMTCwgUkVBRE1FLlVOWDogVXBkYXRlZCBpbnN0YWxsYXRpb24gZG9jdW1lbnRhdGlvbiB0byB1c2UgdGhlCi0JbmV3ICdjb25maWd1cmUnIGFuZCAnaW5zdGFsbCcgc2NyaXB0cy4KLQotMjAwMi0wMS0wNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4wLjYgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQkqIGRvY3MvQlVHUywgZG9jcy9DSEFOR0VTOiBVcGRhdGluZyBkb2N1bWVudGF0aW9uIGZvciAyLjAuNiByZWxlYXNlLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIucHk6IEZpeGVkIEhUTUwgcXVvdGluZyBpbiBzb3VyY2VzLgotCShodG1sX2Zvcm1hdCk6IFJlcGxhY2VkIHdpdGggLi4uCi0JKGh0bWxfcXVvdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGh0bWxfcXVvdGUwKTogTmV3IGZ1bmN0aW9uLgotCShEb2NDb2RlOjpkdW1wX2h0bWwpOiBTbWFsbCBpbXByb3ZlbWVudC4KLQkoRG9jUGFyYWdyYXBoOjpkdW1wLCBEb2NCbG9jazo6aHRtbCk6IFVzZSBodG1sX3F1b3RlMCBhbmQgaHRtbF9xdW90ZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaDogU2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgZm9yCi0JYSByZWxlYXNlIGJ1aWxkIChkZWJ1Z2dpbmcgb2ZmLCBieXRlY29kZSBpbnRlcnByZXRlciBvZmYpLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYywgc3JjL2Jhc2UvZnRvdXRsbi5jLCBzcmMvY2FjaGUvZnRjY21hcC5jLAotCXNyYy9jZmYvY2ZmbG9hZC5jLCBzcmMvY2ZmL2NmZm9ianMuYywgc3JjL3BzaGludGVyL3BzaGFsZ28yLmMsCi0Jc3JjL3NmbnQvdHRsb2FkLmMsIHNyYy9zZm50L3R0c2JpdC5jOiBSZW1vdmluZyBzbWFsbCBjb21waWxlcgotCXdhcm5pbmdzIChpbiBwZWRhbnRpYyBjb21waWxhdGlvbiBtb2RlcykuCi0KLTIwMDItMDEtMDUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9hbGlnbl9saW5rZWRfZWRnZSk6IE1vZGlmaWVkIGNvbXB1dGF0aW9uCi0Jb2YgYXV0by1oaW50ZWQgc3RlbSB3aWR0aHM7IHRoaXMgYXZvaWRzIGNvbG9yIGZyaW5nZXMgaW4KLQlgQ2xlYXJUeXBlLWxpa2UnIHJlbmRlcmluZy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9HbHlwaF9IZWFkZXIsCi0JVFRfTG9hZF9TaW1wbGVfR2x5cGgsIFRUX0xvYWRfQ29tcG9zaXRlX0dseXBoLCBsb2FkX3RydWV0eXBlX2dseXBoKToKLQlNb2RpZmllZCB0aGUgVHJ1ZVR5cGUgbG9hZGVyIHRvIG1ha2UgaXQgbW9yZSBwYXJhbm9pZDsgdGhpcyBhdm9pZHMKLQluYXN0eSBidWZmZXIgb3ZlcmZsb3dzIGluIHRoZSBjYXNlIG9mIGludmFsaWQgZ2x5cGggZGF0YSAoYXMKLQllbmNvdW50ZXJlZCBpbiB0aGUgb3V0cHV0IG9mIHNvbWUgYnVnZ3kgZm9udCBjb252ZXJ0ZXJzKS4KLQotMjAwMi0wMS0wNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBSRUFETUUuVU5YOiBBZGRlZCBzcGVjaWFsIFJFQURNRSBmaWxlIGZvciBVbml4IHVzZXJzLgotCi0JKiBidWlsZHMvdW5peC9mdHN5c3RlbS5jIChGVF9OZXdfU3RyZWFtKTogRml4ZWQgdHlwby4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEFkZGVkICNpbmNsdWRlIEZUX09VVExJTkVfSCB0byBnZXQgcmlkCi0Jb2YgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9DaGVjayk6IFJlbW92ZSBjb21waWxlciB3YXJuaW5nLgotCi0yMDAyLTAxLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KTogQWRkIGNhc3QgdG8gYXZvaWQgY29tcGlsZXIKLQl3YXJuaW5nLgotCi0yMDAyLTAxLTAzICBLZWl0aCBQYWNrYXJkICA8a2VpdGhwQGtlaXRocC5jb20+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0c3lzdGVtLmMgKEZUX05ld19TdHJlYW0pOiBBZGRlZCBhIGZpeCB0byBlbnN1cmUgdGhhdAotCWFsbCBGcmVlVHlwZSBpbnB1dCBzdHJlYW1zIGFyZSBjbG9zZWQgaW4gY2hpbGQgcHJvY2Vzc2VzIG9mIGEgYGZvcmsnCi0Jb24gVW5peCBzeXN0ZW1zLiAgVGhpcyBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgKHBvdGVudGlhbCkgYWNjZXNzCi0JY29udHJvbCBpc3N1ZXMuCi0KLTIwMDItMDEtMDMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0luaXQpOiBGaXhlZCBhIGJ1ZyB0aGF0IGNyYXNoZWQgdGhlCi0JbGlicmFyeSB3aGVuIGRlYWxpbmcgd2l0aCBjZXJ0YWluIHdlaXJkIGZvbnRzIGxpa2UgYFN0YWxpbmdyYWQnLCBpbgotCWBzYWRuLnBmYicgKHRoaXMgZm9udCBoYXMgbm8gZnVsbCBmb250IG5hbWUgZW50cnkpLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMsIGluY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oIChGVF9PdXRsaW5lX0NoZWNrKToKLQlOZXcgZnVuY3Rpb24gdG8gY2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIG91dGxpbmUgZGF0YS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBVc2UgYEZUX091dGxpbmVfQ2hlY2snIHRvCi0JZW5zdXJlIHRoYXQgbG9hZGVkIGdseXBocyBhcmUgdmFsaWQuICBUaGlzIGFsbG93cyBjZXJ0YWluIGZvbnRzIGxpa2UKLQlgdHQxMDk1bV8udHRmJyB0byBiZSBsb2FkZWQgZXZlbiB0aG91Z2ggaXQgYXBwZWFycyB0aGV5IGNvbnRhaW4KLQlyZWFsbHkgZnVua3kgZ2x5cGhzLgotCi0JVGhlcmUgc3RpbGwgaXMgYSBidWcgdGhlcmUsIHRob3VnaC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IEZpeCBlcnJvciBjb25kaXRpb24uCi0KLTIwMDEtMTItMzAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfbG9hZCk6IEZpeCBhZHZhbmNlIHdpZHRoCi0JY29tcHV0YXRpb24gb2YgYXV0by1oaW50ZWQgZ2x5cGhzLiAgVGhpcyBub3RpY2VhYmx5IGltcHJvdmVzIHRoZQotCXNwYWNpbmcgb2YgbGV0dGVycyBpbiBLREUgYW5kIEdub21lLgotCi0yMDAxLTEyLTI1ICBBbnRvaW5lIExlY2EgIDxBbnRvaW5lLUZyZWV0eXBlQExlY2EtTWFydGkub3JnPgotCi0JKiBidWlsZHMvZG9zL2RldGVjdC5tazogQ29ycmVjdGluZyB0aGUgb3JkZXIgZm9yIEJvcmxhbmQgY29tcGlsZXJzOgotCTE2LWJpdCBiY2Mgd2FzIG5ldmVyIHNlbGVjdGVkLCBhbHdheXMgb3ZlcnJpZGRlbiBieSAzMi1iaXQgYmNjMzIuCi0KLTIwMDEtMTItMjIgIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaSAgPEZyYW5jZXNjby5aYXBwYS5OYXJkZWxsaUBlbnMuZnI+Ci0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfbG9hZF9mb250KTogSGFuZGxlIHByb3BlcnR5IGBQT0lOVF9TSVpFJwotCWFuZCBmaXggaW5jb3JyZWN0IGNvbXB1dGF0aW9uIG9mIGBhdmFpbGFibGVfc2l6ZXMnLgotCi0yMDAxLTEyLTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfaGludGVyX2xvYWQpOiBBdXRvLWhpbnRlZCBnbHlwaHMgaGFkIGFuCi0JaW5jb3JyZWN0IGdseXBoIGFkdmFuY2UgaW4gdGhlIGNhc2Ugb2YgbW9uby13aWR0aCBmb250cyAobGlrZQotCUNvdXJpZXIsIEFuZGFsZSBNb25vLCBhbmQgb3RoZXJzKS4KLQotMjAwMS0xMi0yMiAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS8qOiBBZGFwdGF0aW9ucyB0byBsYXRlc3QgY2hhbmdlcy4KLQlTdXBwb3J0IGFkZGVkIGZvciBNb3JwaE9TLgotCi0yMDAxLTEyLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2hpbnRlci9wc2hyZWMuYyAoRlRfQ09NUE9ORU5UKTogUmVkZWZpbmUgdG8gYHRyYWNlX3BzaHJlYycuCi0JKHBzX21hc2tfdGFibGVfbWVyZ2UsIHBzX2hpbnRzX29wZW4sIHBzX2hpbnRzX3N0ZW0sCi0JcHNfaGludHNfdDFzdGVtMywgcHNfaGludHNfdDJtYXNrLCBwc19oaW50c190MmNvdW50ZXIpOiBGaXgKLQlGVF9FUlJPUiBtZXNzYWdlcy4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMS5jIChGVF9DT01QT05FTlQpOiBEZWZpbmUgYXMKLQlgdHJhY2VfcHNoYWxnbzEnLgotCSogc3JjL3BzaGludGVyL3BzaGFsZ28yLmMgKEZUX0NPTVBPTkVOVCk6IERlZmluZSBhcwotCWB0cmFjZV9wc2hhbGdvMicuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaCAoRlRfVHJhY2UpOiBVcGRhdGVkLgotCi0JKiBkb2NzL21vZHVsZXMudHh0OiBOZXcgZmlsZS4KLQotMjAwMS0xMi0yMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMgKHBzX2hpbnRzX3QybWFzaywgcHNfaGludHNfdDJjb3VudGVyKToKLQlJZ25vcmUgaW52YWxpZCBgaGludG1hc2snIGFuZCBgY250cm1hc2snIG9wZXJhdG9ycyAoaW5zdGVhZCBvZgotCXJldHVybmluZyBhbiBlcnJvcikuICBHbHlwaCAyMDI4IG9mIHRoZSBDRkYgZm9udCBgTVN1bmctTGlnaHQtQWNybycKLQljb3VsZG4ndCBiZSByZW5kZXJlZCBvdGhlcndpc2UgKGl0IHNlZW1zIGl0cyBjaGFyc3RyaW5nIGlzIGJ1Z2d5LAotCXRob3VnaCB0aGlzIHJlcXVpcmVzIG1vcmUgYW5hbHlzaXMpLgotCShGVF9DT01QT05FTlQpOiBEZWZpbmUuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoQ0ZGX1BhcnNlX0NoYXJTdHJpbmdzKSwgc3JjL3BzYXV4L3QxZGVjb2RlLmMKLQkoVDFfRGVjb2Rlcl9QYXJzZV9DaGFyc3RyaW5ncyksIHNyYy9wc2hpbnRlci9wc2hhbGdvMi5jICgqKSwgRml4ZWQgYQotCWJ1ZyB3aGVyZSB0aGUgWCBhbmQgWSBheGlzIHdoZXJlIGludmVydGVkIGluIHRoZSBwb3N0c2NyaXB0IGhpbnRlci4KLQlUaGlzIGNhdXNlZCBwcm9ibGVtIHdoZW4gZGlzcGxheWluZyBvbiBub24tc3F1YXJlIHN1cmZhY2VzLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzIuYzogcy92ZXJ0aWNhbC9kaW1lbnNpb24vLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoZ2xvYi5jIChwc2hfZ2xvYmFsc19uZXcpOiBSZXBsYWNlZCBhIGZsb2F0aW5nCi0JcG9pbnQgY29uc3RhbnQgd2l0aCBhIGZpeGVkLWZsb2F0IGVxdWl2YWxlbnQuICBGb3Igc29tZSByZWFzb25zIG5vdAotCWFsbCBjb21waWxlcnMgYXJlIGNhcGFibGUgb2YgZGlyZWN0bHkgY29tcHV0aW5nIGEgZmxvYXRpbmcgcG9pbnRlcgotCWNvbnN0YW50IGNhc3RlZCB0byBGVF9GaXhlZCwgYW5kIHdpbGwgbGluayBhIG1hdGggbGlicmFyeSBpbnN0ZWFkLgotCi0yMDAxLTEyLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChmdGNfbm9kZV9kZXN0cm95LCBmdGNfY2FjaGVfbG9va3VwKTogRml4Ci0JdHJhY2luZyBzdHJpbmdzLgotCSogc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoZnRjX2NtYXBfZmFtaWx5X2luaXQpOiBEaXR0by4KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChmdGNfZmFtaWx5X3RhYmxlX2FsbG9jLAotCWZ0Y19mYW1pbHlfdGFibGVfZnJlZSwgRlRDX01hbmFnZXJfQ2hlY2spOiBEaXR0by4KLQkqIHNyYy9jYWNoZS9mdGNzYml0cy5jIChmdGNfc2JpdF9ub2RlX2xvYWQpOiBEaXR0by4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0RvbmVfTGlicmFyeSk6IFJlbW92ZSBjb21waWxlciB3YXJuaW5nLgotCi0yMDAxLTEyLTIwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlBZGRlZCBQb3N0U2NyaXB0IGhpbnRlciBzdXBwb3J0IHRvIHRoZSBDRkYgYW5kIENJRCBkcml2ZXJzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmggKENGRl9Gb250KTogTmV3IG1lbWJlcgotCWBwc2hpbnRlcicuCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoQ0ZGX0dldF9TdGFuZGFyZF9FbmNvZGluZyk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5oOiBVcGRhdGVkLgotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChDRkZfSW5pdF9CdWlsZGVyKTogUmVuYW1lZCB0byAuLi4KLQkoQ0ZGX0J1aWxkZXJfSW5pdCk6IFRoaXMuCi0JQWRkZWQgbmV3IGFyZ3VtZW50IGBoaW50aW5nJy4KLQkoQ0ZGX0RvbmVfQnVpbGRlcik6IFJlbmFtZWQgdG8gLi4uCi0JKENGRl9CdWlsZGVyX0RvbmUpOiBUaGlzLgotCShDRkZfSW5pdF9EZWNvZGVyKTogQWRkZWQgbmV3IGFyZ3VtZW50IGBoaW50aW5nJy4KLQkoQ0ZGX1BhcnNlX0NoYXJTdHJpbmdzKTogSW1wbGVtZW50IHZzdGVtIHN1cHBvcnQuCi0JKENGRl9Mb2FkX0dseXBoKTogVXBkYXRlZC4KLQlBZGQgaGludGluZyBzdXBwb3J0LgotCShjZmZfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlKTogVXNlIENGRl9HZXRfU3RhbmRhcmRfRW5jb2RpbmcoKS4KLQkoY2ZmX2FyZ3VtZW50X2NvdW50cyk6IFVwZGF0ZWQuCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmg6IFVwZGF0ZWQuCi0JKiBzcmMvY2ZmL2NmZm9ianMuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0guCi0JKENGRl9TaXplX0dldF9HbG9iYWxzX0Z1bmNzLCBDRkZfU2l6ZV9Eb25lLCBDRkZfU2l6ZV9Jbml0LAotCUNGRl9TaXplX1Jlc2V0LCBDRkZfR2x5cGhTbG90X0RvbmUsIENGRl9HbHlwaFNsb3RfSW5pdCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoQ0ZGX0luaXRfRmFjZSk6IFJlbmFtZWQgdG8gLi4uCi0JKENGRl9GYWNlX0luaXQpOiBUaGlzLgotCUFkZCBoaW50ZXIgc3VwcG9ydC4KLQkoQ0ZGX0RvbmVfRmFjZSk6IFJlbmFtZWQgdG8gLi4uCi0JKENGRl9GYWNlX0RvbmUpOiBUaGlzLgotCShDRkZfSW5pdF9Ecml2ZXIpOiBSZW5hbWVkIHRvIC4uLgotCShDRkZfRHJpdmVyX0luaXQpOiBUaGlzLgotCShDRkZfRG9uZV9Ecml2ZXIpOiBSZW5hbWVkIHRvIC4uLgotCShDRkZfRHJpdmVyX0RvbmUpOiBUaGlzLgotCSogc3JjL2NmZi9jZmZvYmpzLmg6IFVwZGF0ZWQuCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9kcml2ZXJfY2xhc3MpOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCAoQ0lEX0ZhY2VSZWMpOiBOZXcgbWVtYmVyCi0JYHBzaGludGVyJy4KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoQ0lEX0xvYWRfR2x5cGgpOiBBZGQgaGludGVyIHN1cHBvcnQuCi0JKiBzcmMvY2lkL2NpZG9ianMuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0guCi0JKENJRF9HbHlwaFNsb3RfRG9uZSwgQ0lEX0dseXBoU2xvdF9Jbml0LCBDSURfU2l6ZV9HZXRfR2xvYmFsc19GdW5jcywKLQlDSURfU2l6ZV9Eb25lLCBDSURfU2l6ZV9Jbml0LCBDSURfU2l6ZV9SZXNldCk6IE5ldyBmdW5jdGlvbnMuCi0JKENJRF9Eb25lX0ZhY2UpOiBSZW5hbWVkIHRvIC4uLgotCShDSURfRmFjZV9Eb25lKTogVGhpcy4KLQkoQ0lEX0luaXRfRmFjZSk6IFJlbmFtZWQgdG8gLi4uCi0JKENJRF9GYWNlX0luaXQpOiBUaGlzLgotCUFkZCBoaW50aW5nIHN1cHBvcnQuCi0JKENJRF9Jbml0X0RyaXZlcik6IFJlbmFtZWQgdG8gLi4uCi0JKENJRF9Ecml2ZXJfSW5pdCk6IFRoaXMuCi0JKENJRF9Eb25lX0RyaXZlcik6IFJlbmFtZWQgdG8gLi4uCi0JKENJRF9Ecml2ZXJfRG9uZSk6IFRoaXMuCi0JKiBzcmMvY2lkL2NpZG9ianMuaDogVXBkYXRlZC4KLQkqIHNyYy9jaWRyaXZlci5jOiBVcGRhdGVkLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMgKHQyX2hpbnRfc3RlbXMpOiBGaXhlZC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0RvbmVfTGlicmFyeSk6IEZpeGVkIGEgc3R1cGlkIGJ1ZyB0aGF0Ci0JY3Jhc2hlZCB0aGUgbGlicmFyeSBvbiBleGl0LgotCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9Mb2FkX0dseXBoKTogRW5hYmxlIGZvbnQgbWF0cml4Ci0JdHJhbnNmb3JtYXRpb24gb2YgaGludGVkIGdseXBocy4KLQotCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9yZWFkX3N1YnJzKTogRml4IGVycm9yIGNvbmRpdGlvbi4KLQotCSogc3JjL2NpZC9jaWRvYmpzLmMgKENJRF9GYWNlX0RvbmUpOiBGaXhlZCBhIG1lbW9yeSBsZWFrOyB0aGUgc3VicnMKLQlyb3V0aW5lcyB3ZXJlIG5ldmVyIHJlbGVhc2VkIHdoZW4gQ0lEIGZhY2VzIHdlcmUgZGVzdHJveWVkLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuaCwgc3JjL2NmZi9jZmZsb2FkLmMsIHNyYy9jZmYvY2ZmZ2xvYWQuYzogVXBkYXRlZAotCXRvIG1vdmUgdGhlIGRlZmluaXRpb24gb2YgZW5jb2RpbmcgdGFibGVzIGJhY2sgd2l0aGluIGBjZmZsb2FkLmMnCi0JaW5zdGVhZCBvZiBtYWtpbmcgdGhlbSBwYXJ0IG9mIGEgc2hhcmVkIGhlYWRlciAoY2F1c2luZyBwcm9ibGVtcyBpbgotCWBtdWx0aScgYnVpbGRzKS4gIFRoaXMgcmV2ZXJ0cyBjaGFuZ2UgMjAwMS0wOC0wOC4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkIGZvciAyLjAuNiByZWxlYXNlLgotCSogZG9jcy9UT0RPOiBBZGRlZCBgc3RlbTMgYW5kIGNvdW50ZXIgaGludHMgc3VwcG9ydCcgdG8gdGhlIFRPRE8KLQlsaXN0IGZvciB0aGUgUG9zdHNjcmlwdCBoaW50ZXIuCi0JKiBkb2NzL0JVR1M6IENsb3NlZCB0aGUgQVVUT0hJTlQtTk8tU0JJVFMgYnVnLgotCi0yMDAxLTEyLTE5ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjYWNoZS5oOiBBZGRlZCBjb21tZW50cyB0byBpbmRpY2F0ZSB0aGF0Ci0Jc29tZSBvZiB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgYXBwbGljYXRpb25zCi0JdGhhdCBuZWVkIHRvIGltcGxlbWVudCBjdXN0b20gY2FjaGUgdHlwZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGN1cl90b19vcmcsIG9yZ190b19jdXIpOiBGaXhlZCBhIG5hc3R5IGJ1ZwotCXRoYXQgcHJldmVudGVkIGNvbXBvc2l0ZXMgZnJvbSBsb2FkaW5nIGNvcnJlY3RseSwgZHVlIHRvIG1pc3NpbmcKLQlwYXJlbnRoZXNlcyBhcm91bmQgbWFjcm8gcGFyYW1ldGVycy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKFNGTlRfTG9hZF9GYWNlKTogTWFrZSB0aGUgYHBvc3QnIGFuZCBgbmFtZScKLQl0YWJsZXMgb3B0aW9uYWwgdG8gbG9hZCBQQ0wgZm9udHMgcHJvcGVybHkuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfR2x5cGgpLCBzcmMvYmFzZS9mdG9ianMuYwotCShGVF9Mb2FkX0dseXBoKSwgaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9MT0FEX1NCSVRTX09OTFkpOgotCWBGaXhlZCcgdGhlIGJ1ZyB0aGF0IHByZXZlbnRlZCBlbWJlZGRlZCBiaXRtYXBzIHRvIGJlIGxvYWRlZCB3aGVuCi0JdGhlIGF1dG8taGludGVyIGlzIHVzZWQuICBUaGlzIGFjdHVhbGx5IGlzIGEgaGFjayBidXQgd2lsbCBiZSBlbm91Z2gKLQl1bnRpbCB0aGUgaW50ZXJuYWwgcmUtZGVzaWduIHNjaGVkdWxlZCBmb3IgRnJlZVR5cGUgMi4xLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBGaXhlZCBhIG5hc3R5IG91dGxpbmUKLQlzaGlmdGluZyBidWcgaW4gdGhlIG1vbm9jaHJvbWUgcmVuZGVyZXIuCi0KLQkqIFJFQURNRTogVXBkYXRlZCB2ZXJzaW9uIG51bWJlcnMgdG8gMi4wLjYuCi0KLTIwMDEtMTItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IEZpeCB0ZXN0IGZvciBpbnZhbGlkCi0JZ2x5cGggaGVhZGVyLgotCi0yMDAxLTEyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyAoRlRfR2x5cGhfVG9fQml0bWFwKTogUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmcuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaCAoRlRDX05vZGVfVW5yZWYpOiBSZW1vdmVkLiAgSXQgaXMKLQlhbHJlYWR5IGluIGZ0Y21hbmFnLmguCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3NiaXRfbm9kZV9sb2FkKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQotCWBnZmFtJy4KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChmdGNfZmFtaWx5X3RhYmxlX2FsbG9jLAotCSogZnRjX2ZhbWlseV90YWJsZV9mcmVlKTogVXNlIEZUX0VYUE9SVF9ERUYuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y21hbmFnLmg6IFVwZGF0ZWQuCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYyAoZnRjX25vZGVfZGVzdHJveSk6IFVzZSBGVF9FWFBPUlRfREVGLgotCSogc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoZnRjX2NtYXBfbm9kZV9pbml0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQotCWBjZmFtJy4KLQlSZW1vdmUgY29tcGlsZXIgd2FybmluZy4KLQkoRlRDX0NNYXBDYWNoZV9Mb29rdXApOiBSZW1vdmUgY29tcGlsZXIgd2FybmluZ3MuCi0JKGZ0Y19jbWFwX2ZhbWlseV9pbml0KTogRGl0dG8uCi0JKEZUQ19DTWFwQ2FjaGVfTG9va3VwKTogRGl0dG8uCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5hYzogSW5jcmVhc2UgYHZlcnNpb25faW5mbycgdG8gODowOjIuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0yMDAxLTEyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9tYWMvUkVBRE1FOiBVcGRhdGVkLgotCi0yMDAxLTEyLTE0ICBTY290dCBMb25nICA8c2NvdHRAc3dpZnR2aWV3LmNvbT4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IEZpeGluZyBjcmFzaCB3aGVuCi0JZGVhbGluZyB3aXRoIGludmFsaWQgZm9udHMgKGkuZS4gZ2x5cGggc2l6ZSA8IDEwIGJ5dGVzKS4KLQotMjAwMS0xMi0xNCAgU2FtIExhdGluZ2EgIDxzbG91a2VuQGRldm9sdXRpb24uY29tPgotCi0JKiBidWlsZHMvbWFjL2ZyZWV0eXBlLm1ha2U6IEEgbmV3IE1ha2VmaWxlIHRvIGJ1aWxkIHdpdGggTVBXIG9uCi0JTWFjT1MgY2xhc3NpYy4KLQotMjAwMS0xMi0xNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0dseXBoKSwgc3JjL3R5cGUxL3QxZ2xvYWQuYwotCShUMV9Mb2FkX0dseXBoKSwgc3JjL2NpZC9jaWRnbG9hZC5jIChDSURfTG9hZF9HbHlwaCksCi0Jc3JjL2NmZi9jZmZnbG9hZC5jIChDRkZfTG9hZF9HbHlwaCk6IEZpeGVkIGEgc2VyaW91cyBidWcgY29tbW9uIHRvCi0JYWxsIGZvbnQgZHJpdmVycyAodGhlIGFkdmFuY2Ugd2lkdGggd2FzIG5ldmVyIGhpbnRlZCB3aGVuIGl0Ci0Jc2hvdWxkKS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IE5ldyBtYWNyby4KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKGRlYnVnX21lbV9kdW1teSkgWyFGVF9ERUJVR19NRU1PUlldOiBEb24ndAotCXVzZSBgZXh0ZXJuJyBrZXl3b3JkLgotCi0yMDAxLTEyLTEyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9wc2hpbnRlci9wc2hnbG9iLmMgKHBzaF9ibHVlc19zY2FsZV96b25lcywgcHNoX2JsdWVzX3NuYXBfc3RlbQotCXBzaF9nbG9iYWxzX25ldyk6IEFkZGluZyBjb3JyZWN0IEJsdWVTY2FsZS9CbHVlU2hpZnQgc3VwcG9ydCwgcGx1cwotCWZhbWlseSBibHVlcyBwcm9jZXNzaW5nLgotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuaCAoUFNIX0JsdWVzUmVjKTogVXBkYXRlZC4KLQotCVN0YXJ0ZWQgYWRkaW5nIHN1cHBvcnQgZm9yIHRoZSBQb3N0c2NyaXB0IGhpbnRlciBpbiB0aGUgQ0ZGIG1vZHVsZS4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSC4KLQkoQ0ZGX1BhcnNlX0NoYXJTdHJpbmdzKTogSW1wbGVtZW50IGl0LgotCSogc3JjL2NmZi9jZmZnbG9hZC5oOiBVcGRhdGVkLgotCi0yMDAxLTEyLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlMi5tNDogU29tZSBwb3J0YWJpbGl0eSBmaXhlcy4KLQotMjAwMS0xMi0xMSAgSm91ayBKYW5zZW4gIDxqb3VrakBocmVtLnN0bS50dWRlbGZ0Lm5sPgotCi0JKiBzcmMvYmFzZS9kZXNjcmlwLm1tcyAoT0JKUyk6IEFkZCBmdGRlYnVnLm9iai4KLQotMjAwMS0xMi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoVFRfTG9hZF9HZW5lcmljX0hlYWRlcik6IFR5cG9zLgotCi0yMDAxLTEyLTExICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbjogTW9kaWZpZWQgdGhlIHNjcmlwdCB0byBwcmV2ZW50Ci0JcGFzc2luZyBgLUwvdXNyL2xpYicgdG8gZ2NjLgotCi0JKiBkb2NzL0ZUTC5UWFQ6IFNpbXBsZSBmaXggKGNoYW5nZSBgTElDRU5TRS5UWFQnIHRvIGBGVEwuVFhUJykuCi0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlMi5tNDogTmV3IGZpbGUgZm9yIGNoZWNraW5nIGNvbmZpZ3VyZSBwYXRocy4KLQlXZSBuZWVkIHRvIGluc3RhbGwgaXQgaW4gJChwcmVmaXgpL3NoYXJlL2FjbG9jYWwvZnJlZXR5cGUyLm00IGJ1dCBJCi0JZGlkbid0IG1vZGlmeSBidWlsZHMvdW5peC9pbnN0YWxsLm1rIHlldC4KLQotCSogSU5TVEFMTDogVXBkYXRlZCB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aAotCUphbS4gIFRoZXkgd2VyZSBzaW1wbHkgd3JvbmcuCi0KLQkqIHNyYy9iYXNlL2Z0dHJpZ29uLmMgKEZUX0Nvcyk6IEZpeGVkIGEgc21hbGwgYnVnIHRoYXQgY2F1c2VkCi0Jc2xpZ2h0bHkgaW1wcm9wZXIgcmVzdWx0cyBmb3IgYEZUX0NvcycgYW5kIGBGVF9TaW4nIChleGFtcGxlOgotCUZUX1NpbigwKSA9PSAtMSEpLgotCi0yMDAxLTEyLTExICBEZXRsZWYgV8O8cmtuZXIgIDxUZXRpU29mdEBhcGcubGFobi5kZT4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oIChHRVRfTG9uZ0xFLCBHRVRfVUxvbmdMRSk6Ci0JRml4ZWQgaW5jb3JyZWN0IGFyZ3VtZW50IHR5cGVzLgotCi0yMDAxLTEyLTEwICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkgIDxGcmFuY2VzY28uWmFwcGEuTmFyZGVsbGlAZW5zLmZyPgotCi0JKiBzcmMvcGNmL3BjZmRyaXZlci5jIChQQ0ZfSW5pdF9GYWNlKTogQWxsb3cgWGZ0IHRvIHVzZSBQQ0YgZm9udHMKLQlieSBzZXR0aW5nIHRoZSBgZmFjZS0+bWV0cmljcy5tYXhfYWR2YW5jZScgY29ycmVjdGx5LgotCi0yMDAxLTEyLTA3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjY21hcC5oLCBzcmMvY2FjaGUvZnRjY21hcC5jOiBBZGRlZCBuZXcKLQljaGFybWFwIGNhY2hlLgotCSogc3JjL2NhY2hlL2Z0Y2FjaGUuYzogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfaGludF9lZGdlcyk6IHMvVU5VU0VEL0ZUX1VOVVNFRC8uCi0KLTIwMDEtMTItMDYgIExlb25hcmQgUm9zZW50aG9sICA8bGVvbmFyZHJAbGF6ZXJ3YXJlLmNvbT4KLQotCUFkZGVkIHN1cHBvcnQgZm9yIHJlYWRpbmcgLmRmb250IGZpbGVzIG9uIE1hYyBPUyBYLiAgQWxzbyBhZGRlZCBhCi0JbmV3IHJvdXRpbmUgd2hpY2ggbG9va3MgdXAgYSBnaXZlbiBmb250IGJ5IG5hbWUgaW4gdGhlIE1hYyBPUyBhbmQKLQlyZXR1cm5zIHRoZSBkaXNrIGZpbGUgd2hlcmUgaXQgcmVzaWRlcy4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYzogSW5jbHVkZSA8RmlsZXMuaD4gYW5kIDxUZXh0VXRpbHMuaD4uCi0JKGlzX2Rmb250KTogTmV3IGF1eGlsaWFyeSBmdW5jdGlvbi4KLQkoRlRfTmV3X0ZhY2VfRnJvbV9kZm9udCk6IE5ldyBmdW5jdGlvbi4KLQkoRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lKTogTmV3IGV4cG9ydGVkIGZ1bmN0aW9uLgotCShGVF9OZXdfRmFjZSk6IFVwZGF0ZWQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bWFjLmg6IFVwZGF0ZWQuCi0KLTIwMDEtMTItMDYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2NhY2hlL0phbWZpbGUsIHNyYy9jYWNoZS9ydWxlcy5tazogVXBkYXRlZC4KLQotMjAwMS0xMi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBJTlNUQUxMOiBTbWFsbCB1cGRhdGUuCi0KLTIwMDEtMTItMDUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRnbHlwaC5jIChGVF9HbHlwaF9Ub19CaXRtYXApOiBSZS1vcmRlcmVkIGNvZGUgZm9yCi0JZGVidWdnaW5nIHB1cnBvc2VzLgotCUNvbW1lbnQgb3V0IHVzZSBvZiBgb3JpZ2luJy4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyKTogRml4ZWQgYSBuYXN0eSBoaWRkZW4gYnVnCi0Jd2hlcmUgb3V0bGluZSBzaGlmdGluZyB3YXNuJ3QgY29ycmVjdGx5IHVuZG9uZSBhZnRlciBiaXRtYXAKLQlyYXN0ZXJpemF0aW9uLiAgVGhpcyBjcmVhdGVkIHByb2JsZW1zIHdpdGggY2VydGFpbiBnbHlwaHMgKGxpa2UgJyInCi0Jb2YgY2VydGFpbiBmb250cykgYW5kIHRoZSBjYWNoZSBzeXN0ZW0uCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMS5jIChwc2gxX2hpbnRfdGFibGVfaW5pdCk6IEZpeCB0eXBvLgotCSogc3JjL3BzaGludGVyL3BzaGFsZ28yLmMgKHBzaDJfaGludF90YWJsZV9pbml0KTogRml4IHR5cG8uCi0JKHBzMl9oaW50c19hcHBseSk6IFNtYWxsIGZpeC4KLQotMjAwMS0xMi0wNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzIuYyAocHNoMl9oaW50X3RhYmxlX2luaXQpLAotCXNyYy9wc2hpbnRlci9wc2hhbGdvMS5jIChwc2gxX2hpbnRfdGFibGVfaW5pdCk6IFJlbW92ZWQgY29tcGlsZXIKLQl3YXJuaW5ncy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmgsIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvKiwgc3JjL2NhY2hlLyo6Ci0JWWV0IGFub3RoZXIgbWFzc2l2ZSByZXdyaXRlIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gaW4gb3JkZXIgdG8KLQlib3RoIGluY3JlYXNlIHBlcmZvcm1hbmNlIGFuZCBhbGxvdyBzaW1wbGVyIGNhY2hlIHN1Yi1jbGFzc2luZy4gIEFzCi0JYW4gZXhhbXBsZSwgdGhlIGNvZGUgZm9yIHRoZSBpbWFnZSBhbmQgc2JpdCBjYWNoZXMgaXMgbm93IG11Y2gKLQlzaW1wbGVyLgotCi0JSSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBpbgotCXd3dy9mcmVldHlwZTIvZG9jcy9jYWNoZS5odG1sIHRvIHJlZmxlY3QgdGhlIG5ldyBkZXNpZ24gdGhvdWdoLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9DQUNIRV9DSEFSTUFQX0gpOiBOZXcKLQltYWNyby4KLQkoRlRfQ0FDSEVfSU5URVJOQUxfQ0FDSEVfSCk6IFVwZGF0ZWQuCi0KLTIwMDEtMTItMDUgIERhdmlkIEtyYXVzZSAgPGZyZWV0eXBlQGRhdmlka3JhdXNlLmNvbT4KLQotCSogZG9jcy9saWNlbnNlLnR4dDogcy9YIFdpbmRvd3MvWCBXaW5kb3cgU3lzdGVtLy4KLQotMjAwMS0xMi0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmM6IEZpeCBkZWZpbml0aW9uIGNvbmRpdGlvbiBvZiBNRU1fU2V0KCkuCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoTV9ZKTogQ2hhbmdlIHZhbHVlIHRvIDE5Mi4KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKGZ0X21lbV90YWJsZV9kZXN0cm95KTogRml4IHByaW50ZigpIHBhcmFtZXRlci4KLQlSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCSogc3JjL2NhY2hlL2Z0Y2ltYWdlLmMgKGZ0Y19pbWFnZV9ub2RlX2luaXQsCi0JZnRjX2ltYWdlX25vZGVfY29tcGFyZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgKGZ0Y19zYml0X25vZGVfd2VpZ2h0KTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlLgotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChNRU1fU2V0KTogTW92ZSBkZWZpbml0aW9uIGRvd24gdG8gYXZvaWQKLQljb21waWxlciB3YXJuaW5nLgotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfaGludF9lZGdlcyk6IFVzZSBVTlVTRUQoKSB0bwotCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHRhYmxlTmFtZXMpOiBVc2UgYGNvbnN0Jy4KLQkocGNmX3JlYWRfVE9DKTogQ2hhbmdlIGNvdW50ZXIgbmFtZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgotCVVzZSBgY29uc3QnLgotCSogc3JjL3BzaGludGVyL3BzaHJlYy5jIChwc19oaW50c19jbG9zZSk6IFJlbW92ZSByZWR1bmRhbnQKLQlkZWNsYXJhdGlvbi4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMS5jIChwc2gxX2hpbnRfdGFibGVfaW5pdCk6IFJlbmFtZSB2YXJpYWJsZXMKLQl0byBhdm9pZCBzaGFkb3dpbmcuCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzIuYyAocHNoMl9oaW50X3RhYmxlX2FjdGl2YXRlX21hc2spOiBEaXR0by4KLQkqIHNyYy90eXBlMS90MW9ianMuaDogUmVtb3ZlIGRvdWJsZSBkZWNsYXJhdGlvbnMgb2YgYFQxX1NpemVfSW5pdCgpJwotCWFuZCBgVDFfU2l6ZV9Eb25lKCknLgotCi0yMDAxLTExLTIwICBBbnRvaW5lIExlY2EgIDxhbnRvaW5lbGVjYUBtdWx0aW1hbmlhLmNvbT4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oOiBBZGRlZCBzb21lIG5ldyBNaWNyb3NvZnQgbGFuZ3VhZ2UKLQljb2RlcyBhbmQgTENJRHMgYXMgZm91bmQgaW4gTVNETiAoUGFzc3BvcnQgU0RLKS4gIEFsc28gYWRkZWQKLQljb21tZW50cyBhYm91dCB0aGUgbWVhbmluZyBvZiBiaXQgNTcgb2YgdGhlIGBPUy8yJyB0YWJsZQotCShUVF9VQ1JfU1VSUk9HQVRFUykgd2hpY2ggKHdpdGggT3BlblR5cGUgdi4xLjMpIG5vdyBtZWFucyBgdGhlcmUgaXMKLQlhIGNoYXJhY3RlciBiZXlvbmQgMHhGRkZGIGluIHRoaXMgZm9udCcuICBUaGFua3MgdG8gRGV0bGVmIFfDvHJrbmVyCi0JPFRldGlTb2Z0QGFwZy5sYWhuLmRlPiBmb3Igbm90aWNpbmcgdGhpcy4KLQotMjAwMS0xMS0yMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIve3BzaGFsZ28yLmMsIHBzaGFsZ28xLmN9OiBGaXhlZCBzdHVwaWQgYnVnIGluIHNvcnRpbmcKLQlyb3V0aW5lIHRoYXQgY3JlYXRlZCBuYXN0eSBhbGlnbm1lbnQgYXJ0ZWZhY3RzLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMsIHRlc3RzL2d2aWV3LmM6IERlYnVnZ2luZyB1cGRhdGVzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYzogRGUtYWN0aXZhdGVkIGV4cGVyaW1lbnRhbCBnYW1tYSBzdXBwb3J0LgotCUFwcGFyZW50bHksIGBvcHRpbWFsJyBnYW1tYSB0YWJsZXMgZGVwZW5kIG9uIHRoZSBtb25pdG9yIHR5cGUsCi0JcmVzb2x1dGlvbiBhbmQgZ2VuZXJhbCBrYXJtYSwgc28gaXQncyBiZXR0ZXIgdG8gY29tcHV0ZSB0aGVtIG91dHNpZGUKLQlvZiB0aGUgcmFzdGVyaXplciBpdHNlbGYuCi0JKGdyYXlfY29udmVydF9nbHlwaCk6IFVzZSBgdm9sYXRpbGUnIGtleXdvcmQuCi0KLTIwMDEtMTAtMjkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUFkZGluZyBleHBlcmltZW50YWwgYGdhbW1hJyBzdXBwb3J0LiAgVGhpcyBwcm9kdWNlcyBzbW9vdGhlciBnbHlwaHMKLQlhdCBzbWFsbCBzaXplcyBmb3IgdmVyeSBsaXR0bGUgY29zdC4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlzX2luaXRfZ2FtbWEpOiBOZXcgZnVuY3Rpb24uCi0JKGdyYXlfcmFzdGVyX25ldyk6IFVzZSBpdC4KLQotCVZhcmlvdXMgZml4ZXMgdG8gdGhlIGF1dG8taGludGVyLiAgVGhleSBtZXJlbHkgaW1wcm92ZSB0aGUgb3V0cHV0IG9mCi0Jc2Fucy1zZXJpZiBmb250cy4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcHJvYmxlbXMgd2l0aCBzZXJpZmVkCi0JZm9udHMgYW5kIGNvbXBvc2l0ZXMgKGFjY2VudGVkIGNoYXJhY3RlcnMpLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhnbHlwaC5jIChhaF9vdXRsaW5lX2xvYWQsCi0JYWhfb3V0bGluZV9saW5rX3NlZ21lbnRzKTogSW1wbGVtZW50IGl0LgotCUZpeCB0eXBvcy4KLQkoYWhfb3V0bGluZV9zYXZlLCBhaF9vdXRsaW5lX2NvbXB1dGVfc2VnbWVudHMpOiBGaXggdHlwb3MuCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2FsaWduX3NlcmlmX2VkZ2UpOiBOZXcgYXJndW1lbnQKLQlgdmVydGljYWwnLiAgSW1wbGVtZW50IGltcHJvdmVtZW50LgotCShhaF9oaW50X2VkZ2VzXzMsIGFoX2hpbnRlcl9oaW50X2VkZ2VzKTogSW1wbGVtZW50IGl0LgotCUZpeCB0eXBvcy4KLQkoYWhfaGludGVyX2FsaWduX3N0cm9uZ19wb2ludHMsIGFoX2hpbnRlcl9hbGlnbl93ZWFrX3BvaW50cyk6IEZpeAotCXR5cG9zLgotCShhaF9oaW50ZXJfbG9hZCk6IFNldCBgYWhfZGVidWdfaGludGVyJyBpZiBERUJVR19ISU5URVIgaXMgZGVmaW5lZC4KLQkqIHNyYy9hdXRvaGludC9haG1vZHVsZS5jOiBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgREVCVUdfSElOVEVSIG1hY3JvLgotCSogc3JjL2F1dG9oaW50L2FodHlwZXMuaDogRGl0dG8uCi0JKEFIX0hpbnRlcik6IFJlbW92ZSBgZGlzYWJsZV9ob3J6X2VkZ2VzJyBhbmQgYGRpc2FibGVfdmVydF9lZGdlcycKLQkobWFraW5nIHRoZW0gZ2xvYmFsIGFzIGBhaF9kZWJ1Z19kaXNhYmxlX2hvcnonIGFuZAotCWBhaF9kZWJ1Z19kaXNhYmxlX3ZlcnQnKS4KLQlGaXggdHlwb3MuCi0KLQkqIHRlc3RzL2d2aWV3LmM6IFVwZGF0ZWQgdGhlIGRlYnVnZ2luZyBnbHlwaCB2aWV3ZXIgdG8gc2hvdyB0aGUKLQloaW50cyBnZW5lcmF0ZWQgYnkgdGhlIGBhdXRvaGludCcgbW9kdWxlLgotCi0yMDAxLTEwLTI3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jYWNoZS9mdGNjaHVuay5jIChmdGNfY2h1bmtfY2FjaGVfbG9va3VwKTogRml4ZWQgYSBidWcgdGhhdAotCWNvbnNpZGVyYWJseSBsb3dlcmVkIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgYWJzdHJhY3QgY2h1bmsgY2FjaGUuCi0KLTIwMDEtMTAtMjYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmgsIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvKi5oLAotCXNyYy9jYWNoZS8qLmM6IE1ham9yIHJlLWRlc2lnbiBvZiB0aGUgY2FjaGUgc3ViLXN5c3RlbSB0byBwcm92aWRlCi0JYmV0dGVyIHBlcmZvcm1hbmNlIGFzIHdlbGwgYXMgYW4gYEFjcXVpcmUnL2BSZWxlYXNlJyBBUEkuICBTZWVtcyB0bwotCXdvcmsgd2VsbCBoZXJlLCBidXQgcHJvYmFibHkgbmVlZHMgYSBiaXQgbW9yZSB0ZXN0aW5nLgotCi0yMDAxLTEwLTI2ICBMZW9uYXJkIFJvc2VudGhvbCAgPGxlb25hcmRyQGxhemVyd2FyZS5jb20+Ci0KLQkqIGJ1aWxkcy9tYWMvUkVBRE1FOiBVcGRhdGVkIHRvIHJlZmxlY3QgbXkgdGFraW5nIG92ZXIgdGhlIHByb2plY3QKLQlhbmQgdGhhdCBpcyBub3cgYmVpbmcgYWN0aXZlbHkgbWFpbnRhaW5lZC4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYyAocGFyc2VfZm9uZCk6IEFwcGxpZWQgcGF0Y2hlcyBmcm9tIFBhdWwgTWlsbGVyCi0JPHBhdWxtQHByb2ZvdW5kZWZmZWN0cy5jb20+IHRvIHN1cHBvcnQgbG9hZGluZyBhIGZhY2Ugb3RoZXIgdGhhbiB0aGUKLQlmaXJzdCBmcm9tIGEgRk9ORCByZXNvdXJjZS4KLQkoRlRfTmV3X0ZhY2VfRnJvbV9GT05EKTogVXBkYXRlZC4KLQotMjAwMS0xMC0yNSAgTGVvbmFyZCBSb3NlbnRob2wgIDxsZW9uYXJkckBsYXplcndhcmUuY29tPgotCi0JKiBidWlsZHMvbWFjL2Z0bGliLnByajogVXBkYXRlIG9mIENvZGVXYXJyaW9yIHByb2plY3QgZmlsZSBmb3IgTWFjCi0JT1MgZm9yIGxhdGVzdCB2ZXJzaW9uICg3KSBvZiBDV1BybyBhbmQgZm9yIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBGVAotCXNvdXJjZSB0cmVlLgotCi0yMDAxLTEwLTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg6IFVwZGF0ZWQgY29tbWVudHMgdG8gZXhwbGFpbgotCXByZWNpc2VseSBob3cgdG8gdXNlIHByb2plY3Qtc3BlY2lmaWMgbWFjcm8gZGVmaW5pdGlvbnMgd2l0aG91dAotCW1vZGlmeWluZyB0aGlzIGZpbGUgbWFudWFsbHkuCi0KLQkoRlRfQ09ORklHX0ZPUkNFX0lOVDY0KTogRGVmaW5lLgotCi0JKEZUX0RFQlVHX01FTU9SWSk6IE5ldyBtYWNyby4KLQotMjAwMS0xMC0yNCAgVG9tIEthY3ZpbnNreSAgPHRrYWN2aW5zQGZyZWV0eXBlLm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYyAoRlRfTmV3X01lbW9yeSk6IEFkZGVkIGEgbWlzc2luZyBgeycuCi0KLTIwMDEtMTAtMjMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oLCBzcmMvYmFzZS9mdGRiZ21lbS5jOgotCUltcHJvdmVtZW50cyB0byB0aGUgbWVtb3J5IGRlYnVnZ2VyIHRvIHJlcG9ydCBtb3JlIGluZm9ybWF0aW9uIGluCi0JY2FzZSBvZiBlcnJvcnMuICBBbHNvLCBzb21lIGFsbG9jYXRpb25zIHRoYXQgb2NjdXJyZWQgdGhyb3VnaCBSRUFMTE9DCi0JY291bGRuJ3QgYmUgcHJldmlvdXNseSBjYXVnaHQgY29ycmVjdGx5LgotCi0JKiBzcmMvYXV0b2hpbnQvYWhnbHlwaC5jIChhaF9vdXRsaW5lX2NvbXB1dGVfc2VnbWVudHMsCi0JYWhfb3V0bGluZV9jb21wdXRlX2VkZ2VzKSwgc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChmdF9ibGFja19uZXcpLAotCXNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9zcGFuLCBncmF5X3Jhc3Rlcl9uZXcpOiBSZXBsYWNlZAotCWxpYmVyYWwgdXNlcyBvZiBtZW1zZXQoKSBieSB0aGUgTUVNX1NldCgpIG1hY3JvLgotCi0yMDAxLTEwLTIzICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoVXBkYXRlKTogUmVtb3ZlZCB0byBiZSBpbmxpbmVkIGluIC4uLgotCShTb3J0KTogVXBkYXRlZC4KLQotMjAwMS0xMC0yMiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBidWlsZHMvdW5peC9mdHN5c3RlbS5jIChGVF9OZXdfTWVtb3J5LCBGVF9Eb25lX01lbW9yeSksCi0JYnVpbGRzL3Ztcy9mdHN5c3RlbS5jIChGVF9OZXdfTWVtb3J5LCBGVF9Eb25lX01lbW9yeSksCi0JYnVpbGRzL2FtaWdhL2Z0c3lzdGVtLmMgKEZUX05ld19NZW1vcnksIEZUX0RvbmVfTWVtb3J5KSwKLQlzcmMvYmFzZS9mdGRiZ21lbS5jOiBVcGRhdGVkIHRoZSBtZW1vcnkgZGVidWdnZXIgYW5kCi0JcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mIGBmdHN5c3RlbScgaW4gb3JkZXIgdG8gYmUgYWJsZQotCXRvIGRlYnVnIG1lbW9yeSBhbGxvY2F0aW9ucyBvbiBVbml4LCBWTVMgYW5kIEFtaWdhIHRvbyEKLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28yLmMgKHBzaDJfaGludF90YWJsZV9yZWNvcmRfbWFzayk6IFJlbW92ZWQKLQlzb21lIGJvZ3VzIHdhcm5pbmdzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmgsIHNyYy9iYXNlL2Z0ZGJnbWVtLmM6Ci0JTW9kaWZpZWQgdGhlIGRlYnVnZ2luZyBtZW1vcnkgbWFuYWdlciB0byByZXBvcnQgdGhlIGxvY2F0aW9uIChzb3VyY2UKLQlmaWxlIG5hbWUgKyBsaW5lIG51bWJlcikgd2hlcmUgbGVha2VkIG1lbW9yeSBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbgotCXRoZSBzb3VyY2UgZmlsZS4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYzogTmV3IGRlYnVnZ2luZyBtZW1vcnkgbWFuYWdlci4gIFlvdSBtdXN0Ci0JZGVmaW5lIHRoZSBGVF9ERUJVR19NRU1PUlkgbWFjcm8gaW4gYGZ0b3B0aW9uLmgnIHRvIGVuYWJsZSBpdC4gIEl0Ci0Jd2lsbCByZWNvcmQgZXZlcnkgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBhbmQgcmVwb3J0IHNpbXBsZSBlcnJvcnMKLQlsaWtlIG1lbW9yeSBsZWFrcyBhbmQgZG91YmxlIGRlbGV0ZXMuCi0KLQkqIHNyYy9iYXNlL0phbWZpbGU6IEluY2x1ZGUgZnRkYmdtZW0uCi0JKiBzcmMvYmFzZS9ydWxlcy5tazogRGl0dG8uCi0JKiBzcmMvYmFzZS9mdGJhc2UuYzogSW5jbHVkZSBmdGRiZ21lbS5jLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oOiBBZGRlZCB0aGUgRlRfREVCVUdfTUVNT1JZCi0JbWFjcm8gZGVmaW5pdGlvbi4KLQotCSogc3JjL2Jhc2UvZnRzeXN0ZW0uYyAoRlRfTmV3X01lbW9yeSwgRlRfRG9uZV9NZW1vcnkpOiBNb2RpZmllZCB0aGUKLQliYXNlIGNvbXBvbmVudCB0byB1c2UgdGhlIGRlYnVnZ2luZyBtZW1vcnkgbWFuYWdlciB3aGVuIHRoZSBtYWNybwotCUZUX0RFQlVHX01FTU9SWSBpcyBkZWZpbmVkLgotCi0yMDAxLTEwLTIxICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoQ0ZGX0RvbmVfRm9udCk6IEZyZWUgc3ViZm9udHMgYXJyYXkgb25seSBpZgotCXdlIGFyZSB3b3JraW5nIHdpdGggYSBDSUQga2V5ZWQgQ0ZGIGZvbnQuICBPdGhlcndpc2UsIGEgdmFyaWFibGUKLQl0aGF0IHdhcyBuZXZlciBhbGxvY2F0ZWQgbWVtb3J5IG1pZ2h0IGZyZWVkLiAgVGhpcyBpcyBhIGNvcnJlY3Rpb24KLQl0byB0aGUgcHJldmlvdXMgcGF0Y2ggZm9yIGZyZWVpbmcgc3ViZm9udHMuCi0KLTIwMDEtMTAtMjEgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChDRkZfRG9uZV9Gb250KTogRnJlZSB0aGUgc3ViZm9udHMgYXJyYXkgdG8KLQlhdm9pZCBhIG1lbW9yeSBsZWFrLgotCi0yMDAxLTEwLTIxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMi5jLCBzcmMvcHNoaW50ZXIvcHNoYWxnbzEuYywKLQlzcmMvcHNoaW50ZXIvcHNoZ2xvYi5jOiBSZW1vdmluZyBjb21waWxlciB3YXJuaW5ncyBpbiBwZWRhbnRpYyBtb2RlcwotCShpbiBtdWx0aS1vYmplY3QgY29tcGlsYXRpb24gbW9kZSwgbWFpbmx5KS4KLQotMjAwMS0xMC0yMCAgVG9tIEthY3ZpbnNreSAgPHRrYWN2aW5zQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9lbmNvZGluZyk6IEFkZCBhIHRlc3QgdG8gbWFrZSBzdXJlCi0JdGhhdCBjdXN0b20gZW5jb2RpbmdzIChpLmUuLCBuZWl0aGVyIFN0YW5kYXJkRW5jb2Rpbmcgbm9yCi0JRXhwZXJ0RW5jb2RpbmcpIGFyZSBub3QgbG9hZGVkIHR3aWNlIHdoZW4gdGhlIFR5cGUgMSBmb250IGlzCi0Jc3ludGhldGljLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2ZvbnRfbmFtZSwgcGFyc2Vfc3VicnMpOiBBZGRlZCBhIHRlc3QKLQlmb3Igd2hlbiBsb2FkaW5nIHN5bnRoZXRpYyBmb250cyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZm9udCBuYW1lCi0JYW5kIHN1YnJvdXRpbmVzIGFyZSBub3QgbG9hZGVkIHR3aWNlLiAgVGhpcyBpcyB0byByZW1vdmUgYSBtZW1vcnkKLQlsZWFrIHRoYXQgb2NjdXJyZWQgYmVjYXVzZSB0aGUgb3JpZ2luYWwgbWVtb3J5IGJsb2NrcyBmb3IgdGhlc2UKLQlvYmplY3RzIHdlcmUgbm90IGRlYWxsb2NhdGVkIHdoZW4gdGhlIG9iamVjdHMgd2VyZSBwYXJzZWQgdGhlCi0Jc2Vjb25kIHRpbWUuCi0KLTIwMDEtMTAtMTkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMsIHNyYy9wc2hpbnRlci9wc2hnbG9iLmgsCi0Jc3JjL3BzaGludGVyL3BzaHJlYy5jLCBzcmMvcHNoaW50ZXIvcHNoYWxnbzIuYzogR2V0dGluZyByaWQgb2YKLQljb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL3BzaGludGVyL21vZHVsZS5taywgc3JjL3BzaGludGVyL3J1bGVzLm1rOiBBZGRpbmcgY29udHJvbAotCWZpbGVzIHRvIGJ1aWxkIHRoZSBQb3N0U2NyaXB0IGhpbnRlciB3aXRoIHRoZSBgb2xkJyBidWlsZCBzeXN0ZW0uCi0KLTIwMDEtMTAtMTkgIEphY29iIEphbnNlbiAgPGpvdWtqQGhyZW0uc3RtLnR1ZGVsZnQubmw+Ci0KLQkqIGRlc2NyaXAubW1zLCBzcmMvcHNoaW50ZXIvZGVzY3JpcC5tbXM6IFVwZGF0ZXMgdG8gdGhlIFZNUyBidWlsZAotCWZpbGVzLgotCi0yMDAxLTEwLTE4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9wc25hbWVzL3BzdGFibGVzLmgsIHNyYy90b29scy9nbG5hbWVzLnB5OiBSZXdyb3RlIHRoZQotCWBnbG5hbWVzLnB5JyBzY3JpcHQgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYHBzdGFibGVzLmgnIGhlYWRlciBmaWxlLgotCVRoZSBvbGQgb25lIGNvbnRhaW5lZCBhIHNlcmlvdXMgYnVnIHRoYXQgbWFkZSBGcmVlVHlwZSByZXR1cm4KLQlpbmNvcnJlY3QgZ2x5cGggbmFtZXMgZm9yIGNlcnRhaW4gZ2x5cGhzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoU2V0X0NoYXJfU2l6ZXMpOiBDaGFuZ2luZyBjb21wdXRhdGlvbiBvZgotCXBpeGVsIHNpemUgZnJvbSBjaGFyYWN0ZXIgc2l6ZSB0byB1c2Ugcm91bmRpbmcuICBUaGlzIGlzIGFuCi0JZXhwZXJpbWVudCB0byBzZWUgd2hldGhlciB0aGlzIGdpdmVzIHZhbHVlcyBzaW1pbGFyIHRvIFdpbmRvd3MgZm9yCi0Jc2NhbGVkIGFzY2VudC9kZXNjZW50L2V0Yy4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX0RpdjY0YnkzMik6IENoYW5nZWQgdGhlIGltcGxlbWVudGF0aW9uCi0Jc2xpZ2h0bHkgc2luY2UgdGhlIG9yaWdpbmFsIGNvZGUgd2FzIG1pcy1jb21waWxlZCBvbiBNYWMgbWFjaGluZXMKLQl1c2luZyB0aGUgTVBXIEMgY29tcGlsZXIuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9SZWFsbG9jKTogV2hlbiBhIG1lbW9yeSBibG9jayB3YXMgZ3Jvd24KLQl0aHJvdWdoIEZUX1JlYWxsb2MoKSwgdGhlIG5ldyBieXRlcyB3ZXJlIG5vdCBzZXQgdG8gMCwgd2hpY2ggY3JlYXRlZAotCXNvbWUgc3RyYW5nZSBidWdzIGluIHRoZSBQb3N0U2NyaXB0IGhpbnRlci4KLQkoZGVzdHJveV9mYWNlKTogRG9uJ3QgZGVhbGxvY2F0ZSB1bmNvbmRpdGlvbmFsbHkuCi0KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoQ0lEX0NvbXB1dGVfTWF4X0FkdmFuY2UsIENJRF9Mb2FkX0dseXBoKToKLQlBZGRpbmcgc3VwcG9ydCB0byBuZXcgUG9zdFNjcmlwdCBoaW50ZXIuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNnbG9iYWwuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzaGludHMuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oLCBzcmMvcHNoaW50ZXIvSmFtZmlsZSwKLQlzcmMvcHNoaW50ZXIvcHNoYWxnby5oLCBzcmMvcHNoaW50ZXIvcHNoYWxnbzEuaCwKLQlzcmMvcHNoaW50ZXIvcHNoYWxnbzEuYywgc3JjL3BzaGludGVyL3BzaGFsZ28yLmgsCi0Jc3JjL3BzaGludGVyL3BzaGFsZ28yLmMsIHNyYy9wc2hpbnRlci9wc2hnbG9iLmgsCi0Jc3JjL3BzaGludGVyL3BzaGdsb2IuYywgc3JjL3BzaGludGVyL3BzaGludGVyLmMsCi0Jc3JjL3BzaGludGVyL3BzaG1vZC5jLCBzcmMvcHNoaW50ZXIvcHNobW9kLmgsIHNyYy9wc2hpbnRlci9wc2hyZWMuYywKLQlzcmMvcHNoaW50ZXIvcHNocmVjLmg6IEFkZGluZyBuZXcgUG9zdFNjcmlwdCBoaW50ZXIgbW9kdWxlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmgsIHNyYy9wc2F1eC9wc29ianMuYywKLQlzcmMvcHNhdXgvcHNvYmpzLmgsIHNyYy9wc2F1eC90MWRlY29kZS5oLCBzcmMvcHNhdXgvdDFkZWNvZGUuYywKLQlzcmMvdHlwZTEvdDFkcml2ZXIuYywgc3JjL3R5cGUxL3QxZ2xvYWQuYywgc3JjL3R5cGUxL3Qxb2Jqcy5jLAotCXNyYy90eXBlMS90MW9ianMuaDogVXBkYXRlcyB0byB1c2UgdGhlIG5ldyBQb3N0U2NyaXB0IGhpbnRlci4KLQotCSogdGVzdHMvSmFtZmlsZSwgdGVzdHMvZ3ZpZXcuYzogQWRkaW5nIGEgbmV3IGdseXBoIGhpbnRpbmcKLQl2aWV3ZXIvZGVidWdnZXIgdG8gdGhlIHNvdXJjZSB0cmVlLiAgTm90ZSB0aGF0IHlvdSB3aWxsIF9ub3RfIGJlCi0JYWJsZSB0byBjb21waWxlIGl0IHNpbmNlIGl0IGRlcGVuZHMgb24gYW4gdW5hdmFpbGFibGUgZ3JhcGhpY3MKLQlsaWJyYXJ5IG5hbWVkIGBOaXJ2YW5hJyB0byByZW5kZXIgdmVjdG9yIGltYWdlcy4KLQotMjAwMS0xMC0xNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4wLjUgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCwgaW5jbHVkZS9pbnRlcm5hbC9mdG9ianMuaCwKLQlzcmMvYmFzZS9mdG9ianMuYywgc3JjL3R5cGUxL3QxZHJpdmVyLmM6IEFkZGluZyBhIG5ldyBmdW5jdGlvbiBuYW1lZAotCSdGVF9HZXRfUG9zdHNjcmlwdF9OYW1lJyB0byByZXRyaWV2ZSB0aGUgUG9zdFNjcmlwdCBuYW1lIG9mIGEgZ2l2ZW4KLQlmb250LiAgU2hvdWxkIHdvcmsgd2l0aCBhbGwgZm9ybWF0cyBleGNlcHQgcHVyZSBDRkYvQ0VGIGZvbnRzICh0aGlzCi0Jd2lsbCBiZSBhZGRlZCBzb29uKS4KLQotCSogc3JjL2NpZC9jaWRyaXZlciAoY2lkX2dldF9wb3N0c2NyaXB0X25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKENJRF9HZXRfSW50ZXJmYWNlKTogSGFuZGxlIGBwb3N0c2NyaXB0X25hbWUnIGludGVyZmFjZS4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoZ2V0X3NmbnRfcG9zdHNjcmlwdF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShTRk5UX0dldF9JbnRlcmZhY2UpOiBIYW5kbGUgYHBvc3RzY3JpcHRfbmFtZScgaW50ZXJmYWNlLgotCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYyAodDFfZ2V0X3BzX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKEdldF9JbnRlcmZhY2UpOiBIYW5kbGUgYHBvc3RzY3JpcHRfbmFtZScgaW50ZXJmYWNlLgotCi0JKiBSRUFETUUsIGRvY3MvQ0hBTkdFUzogVXBkYXRlZCBmb3IgMi4wLjUgcmVsZWFzZS4KLQotMjAwMS0xMC0wOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JRml4ZWQgYSBidWcgaW4gYGdsbmFtZXMucHknIHRoYXQgcHJldmVudGVkIGl0IGZyb20gZ2VuZXJhdGluZwotCWNvcnJlY3QgZ2x5cGggbmFtZXMgdGFibGVzLiAgVGhpcyByZXN1bHRlZCBpbiB0aGUgdW5hdmFpbGFiaWxpdHkgb2YKLQljZXJ0YWluIGdseXBocyBsaWtlIGBDYWN1dGUnLCBgY2FjdXRlJyBhbmQgYGxzbGFzaCcgaW4gVW5pY29kZQotCWNoYXJtYXBzLCBldmVuIGlmIHRoZXNlIHdlcmUgcHJlc2VudCBpbiB0aGUgZm9udCAoY2F1c2luZyBwcm9ibGVtcwotCWZvciBQb2xpc2ggdXNlcnMpLgotCi0JKiBzcmMvdG9vbHMvZ2xuYW1lcy5weSAobWFjX3N0YW5kYXJkX25hbWVzKTogRml4ZWQuCi0JKHQxX3N0YW5kYXJkX3N0cmluZ3MpOiBTb21lIGZpeGVzIGFuZCByZW5hbWVkIHRvIC4uLgotCShzaWRfc3RhbmRhcmRfbmFtZXMpOiBUaGlzLgotCSh0MV9leHBlcnRfZW5jb2RpbmcpOiBGaXhlZC4KLQkodGhlX2Fkb2JlX2dseXBoX2xpc3QpOiBSZW5hbWVkIHRvIC4uLgotCShhZG9iZV9nbHlwaF9uYW1lcyk6IFRoaXMuCi0JKHRoZV9hZG9iZV9nbHlwaHMpOiBSZW5hbWVkIHRvIC4uLgotCShhZG9iZV9nbHlwaF92YWx1ZXMpOiBUaGlzLgotCShkdW1wX21hY19pbmRpY2VzLCBkdW1wX2dseXBoX2xpc3QsIGR1bXBfdW5pY29kZV92YWx1ZXMsIG1haW4pOgotCVVwZGF0ZWQuCi0JKiBzcmMvcHNuYW1lcy9wc3RhYmxlcy5oOiBSZWdlbmVyYXRlZC4KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKFBTX1VuaWNvZGVfVmFsdWUpOiBGaXggb2Zmc2V0LgotCUZpeCByZXR1cm4gdmFsdWUuCi0JVXNlIGBzaWRfc3RhbmRhcmRfdGFibGUnIGFuZCBgcHNfbmFtZXNfdG9fdW5pY29kZScgaW5zdGVhZCBvZgotCWB0MV9zdGFuZGFyZF9nbHlwaHMnIGFuZCBgbmFtZXNfdG9fdW5pY29kZScuCi0JKFBTX01hY2ludG9zaF9OYW1lKTogVXNlIGBwc19nbHlwaF9uYW1lcycgaW5zdGVhZCBvZgotCWBzdGFuZGFyZF9nbHlwaF9uYW1lcycuCi0JKFBTX1N0YW5kYXJkX1N0cmluZ3MpOiBVc2UgYHNpZF9zdGFuZGFyZF9uYW1lcycgaW5zdGVhZCBvZgotCWB0MV9zdGFuZGFyZF9nbHlwaHMnLgotCi0JKiBkb2MvQlVHUywgZG9jL1RPRE86IE5ldyBkb2N1bWVudHMuCi0KLTIwMDEtMTAtMDcgIFJpY2hhcmQgQmFyYmVyICA8cmljaEBzb2x1dGlvbnVrLmNvbT4KLQotCSogc3JjL2NhY2hlL2Z0bHJ1LmMgKEZUX0xydV9Mb29rdXBfTm9kZSk6IEZpeGVkIGEgYnVnIHRoYXQgcHJldmVudGVkCi0JY29ycmVjdCBMUlUgYmVoYXZpb3VyLgotCi0yMDAxLTEwLTA3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGFyZSBub3cgdXNlZCBmb3Igcm9sbGJhY2sgKGkuZS4gd2hlbiBtZW1vcnkKLQlwb29sIG92ZXJmbG93IG9jY3VycykuCi0KLQlGdW5jdGlvbiBuYW1lcyBhcmUgbm93IGFsbCB1bmlmb3JtbHkgcHJlZml4ZWQgd2l0aCBgZ3JheV8nLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYzogSW5jbHVkZSA8c2V0am1wLmg+LgotCShFcnJSYXN0ZXJfTWVtb3J5T3ZlcmZsb3cpOiBOZXcgbWFjcm8uCi0JKFRBcmVhKTogTmV3IHR5cGUgdG8gc3RvcmUgYXJlYSB2YWx1ZXMgaW4gZWFjaCBjZWxsICh1c2luZyBgaW50JyB3YXMKLQl0b28gc21hbGwgb24gMTYtYml0IHN5c3RlbXMpLiAgPGxpbWl0cy5oPiBpcyBpbmNsdWRlZCB0byBwcm9wZXJseQotCWdldCB0aGUgbmVlZGVkIGRhdGEgdHlwZS4KLQkoVENlbGwsIFRSYXN0ZXIpOiBVc2UgaXQuCi0JKFRSYXN0ZXIpOiBOZXcgZWxlbWVudCBganVtcF9idWZmZXInLgotCShncmF5X2NvbXB1dGVfY2JveCk6IFVzZSBgUkFTX0FSRycgYXMgdGhlIG9ubHkgcGFyYW1ldGVyIGFuZCBnZXQKLQlgb3V0bGluZScgZnJvbSBpdC4KLQkoZ3JheV9yZWNvcmRfY2VsbCk6IFVzZSBsb25nam1wKCkuCi0JKGdyYXlfc2V0X2NlbGwpOiBVc2UgZ3JheV9yZWNvcmRfY2VsbCgpIGZvciBlcnJvciBoYW5kbGluZy4KLQkoZ3JheV9yZW5kZXJfbGluZSwgZ3JheV9yZW5kZXJfY29uaWMsIGdyYXlfcmVuZGVyX2N1YmljKTogU2ltcGxpZnkuCi0JKGdyYXlfY29udmVydF9nbHlwaF9pbm5lcik6IE5ldyBmdW5jdGlvbiwgdXNpbmcgc2V0am1wKCkuCi0JKGdyYXlfY29udmVydF9nbHlwaCk6IFVzZSBpdC4KLQotMjAwMS0xMC0wNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JUHJvdmlkZSBhIHB1YmxpYyBBUEkgdG8gbWFuYWdlIG11bHRpcGxlIHNpemUgb2JqZWN0cyBmb3IgYSBnaXZlbgotCUZUX0ZhY2UgaW4gdGhlIG5ldyBoZWFkZXIgZmlsZSBgZnRzaXplcy5oJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHNpemVzLmg6IE5ldyBoZWFkZXIgZmlsZSwKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg6IFVzZSBpdC4KLQlSZW1vdmUgZGVjbGFyYXRpb25zIG9mIEZUX05ld19TaXplIGFuZCBGVF9Eb25lX1NpemUgKG1vdmVkIHRvCi0JZnRzaXplcy5oKS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX1NJWkVTX0gpOiBOZXcgbWFjcm8uCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfQWN0aXZhdGVfU2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jOiBJbmNsdWRlIGZ0c2l6ZXMuaC4KLQkoZnRjX21hbmFnZXJfaW5pdF9zaXplLCBmdGNfbWFuYWdlcl9mbHVzaF9zaXplKTogVXNlCi0JRlRfQWN0aXZhdGVfU2l6ZS4KLQotMjAwMS0wOS0yMCAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS8qOiBBZGRlZCBwb3J0IHRvIEFtaWdhIHdpdGggdGhlIFNBUy9DIGNvbXBpbGVyLgotCi0yMDAxLTA5LTE1ICBEZXRsZWYgV8O8cmtuZXIgIDxUZXRpU29mdEBhcGcubGFobi5kZT4KLQotCSogc3JjL3R5cGUxL3QxYWZtLmMgKFQxX0RvbmVfQUZNKTogRnJlZSBgYWZtJy4KLQotMjAwMS0wOS0xMCAgWWFvIFpoYW5nICA8eXpoYW5nQHNoYXJlbWVkaWEuY29tPgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAoY29kZV90b19pbmRleDIpOiBIYW5kbGUgY29kZSB2YWx1ZXMgd2l0aAotCWhpLWJ5dGUgPT0gMCBjb3JyZWN0bHkuCi0KLTIwMDEtMDktMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL2xpbmstc3RkLm1rICgkKFBST0pFQ1RfTElCUkFSWSkpOiBGaXggdHlwby4KLQotMjAwMS0wOC0zMCAgTWFydGluIE11c2tlbnMgIDxtbXVza2Vuc0BhdXJlbG9uLmNvbT4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9mb250X21hdHJpeCk6IEEgbmV3IHdheSB0byBjb21wdXRlIHRoZQotCXVuaXRzIHBlciBFTSB3aXRoIGdyZWF0ZXIgYWNjdXJhY3kgKGltcG9ydGFudCBmb3IgZW1iZWRkZWQgVDEgZm9udHMKLQlpbiBQREYgZG9jdW1lbnRzIHRoYXQgd2VyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIFRydWVUeXBlCi0Jb25lcykuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoaXNfYWxwaGEpOiBOb3cgc3VwcG9ydHMgYCsnIGluIGZvbnQgbmFtZXM7Ci0JdGhpcyBpcyB1c2VkIGluIGVtYmVkZGVkIGZvbnRzLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKFBTX1RhYmxlX0FkZCk6IEZpeGVkIGEgcmVhbGxvY2F0aW9uIGJ1ZyB0aGF0Ci0JZ2VuZXJhdGVkIGEgZGFuZ2xpbmcgcG9pbnRlciByZWZlcmVuY2UuCi0KLTIwMDEtMDgtMzAgIEFudGhvbnkgRmVpayAgPGFmZWlja0Bob3RtYWlsLmNvbT4KLQotCSogc3JjL3R5cGUxL3QxYWZtLmMgKFQxX1JlYWRfQUZNKTogTm93IGNvcnJlY3RseSBzZXRzIHRoZSBmbGFnCi0JRlRfRkFDRV9GTEFHX0tFUk5JTkcgd2hlbiBhcHByb3ByaWF0ZSBmb3IgVHlwZTEgKyBBRk0gZmlsZXMuCi0KLTIwMDEtMDgtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKFRUX0xvYWRfQ01hcCk6IEZpeCBmcmFtZSBsZW5ndGggb2YKLQlgY21hcF9yZWNfZmllbGRzJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oIFshRlRfQ09ORklHX09QVElPTl9VU0VfTU9EVUxFX0VSUk9SU106Ci0JVW5kZWZpbmUgRlRfRVJSX0JBU0UgYmVmb3JlIGRlZmluaW5nIGFnYWluLgotCi0yMDAxLTA4LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5oOiBGaXggcHJvdG90eXBlIG9mIFRUX01vdmVfRnVuYy4KLQotMjAwMS0wOC0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvZG9zL2Rvcy1kZWYubWsgKE5PX09VVFBVVCk6IERvbid0IHVzZSBgJj4nIGJ1dCBgPicuCi0KLTIwMDEtMDgtMjEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaDogQ2hhbmdlZCB0aGUgZGVmYXVsdCBzZXR0aW5nCi0JZm9yIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMgdG8gdW5kZWZpbmVkLCBzaW5jZSBpdCBicmVha3MKLQlzb3VyY2UgY29tcGF0aWJpbGl0eSBpbiBhIGZldyBjYXNlcy4gIFVwZGF0ZWQgdGhlIGNvbW1lbnQgdG8gZXhwbGFpbgotCXRoYXQgdG9vLgotCi0yMDAxLTA4LTE3ICBNYXJ0aW4gTXVza2VucyAgPG1tdXNrZW5zQGF1cmVsb24uY29tPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRGl2KTogRml4ZWQgc2VyaW91cyB0eXBvLgotCi0yMDAxLTA4LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlVcGRhdGluZyB0byBPcGVuVHlwZSAxLjMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9DTWFwMCwgVFRfQ01hcDIsIFRUX0NNYXA0LAotCVRUX0NNYXA2KTogQWRkaW5nIGZpZWxkIGBsYW5ndWFnZScuCi0JKFRUX0NNYXBUYWJsZSk6IFJlbW92aW5nIGZpZWxkIGBsYW5ndWFnZScuCi0JVHlwZSBvZiBgbGVuZ3RoJyBmaWVsZCBjaGFuZ2VkIHRvIEZUX1VMb25nLgotCUFkZGluZyBmaWVsZHMgZm9yIGNtYXBzIGZvcm1hdCA4LCAxMCwgYW5kIDEyLgotCShUVF9DTWFwR3JvdXApOiBOZXcgYXV4aWxpYXJ5IHN0cnVjdHVyZS4KLQkoVFRfQ01hcDhfMTIsIFRUX0NNYXAxMCk6IE5ldyBzdHJ1Y3R1cmVzLgotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oIChUVF9Ib3JpSGVhZGVyLCBUVF9WZXJ0SGVhZGVyKToKLQlSZW1vdmVkIGxhc3QgZWxlbWVudCBvZiBgUmVzZXJ2ZWQnIGFycmF5LgotCSogaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oIChUVF9QTEFURk9STV9DVVNUT00sIFRUX01TX0lEX1VDU180LAotCVRUX05BTUVfSURfQ0lEX0ZJTkRGT05UX05BTUUpOiBOZXcgbWFjcm9zLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAoVFRfQ2hhck1hcF9Mb2FkKTogVXBkYXRlZCBsb2FkaW5nIG9mIGBsYW5ndWFnZScKLQlmaWVsZCB0byB0aGUgbmV3IHN0cnVjdHVyZXMuCi0JRml4ZWQgZnJlZWluZyBvZiBhcnJheXMgaW4gY2FzZSBvZiB1bnN1Y2Nlc3NmdWwgbG9hZHMuCi0JQWRkZWQgc3VwcG9ydCBmb3IgbG9hZGluZyBmb3JtYXQgOCwgMTAsIGFuZCAxMiBjbWFwcy4KLQkoVFRfQ2hhck1hcF9GcmVlKTogQWRkZWQgc3VwcG9ydCBmb3IgZnJlZWluZyBmb3JtYXQgOCwgMTAsIGFuZCAxMgotCWNtYXBzLgotCShjb2RlX3RvX2luZGV4NCk6IFNtYWxsIGltcHJvdmVtZW50LgotCShjb2RlX3RvX2luZGV4Nik6IERpdHRvLgotCShjb2RlX3RvX2luZGV4OF8xMiwgY29kZV90b19pbmRleDEwKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChUVF9Mb2FkX01ldHJpY3NfSGVhZGVyKTogVXBkYXRlZCB0byBuZXcKLQlzdHJ1Y3R1cmUuCi0JKFRUX0xvYWRfQ01hcCk6IERpdHRvLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAodHRfZW5jb2RpbmdzKTogQWRkIE1TIFVDUzQgdGFibGUgKGJlZm9yZSBNUwotCVVuaWNvZGUpLgotCi0yMDAxLTA4LTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9nZXRfbmFtZV9pbmRleCk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCi0yMDAxLTA4LTA5ICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGdldF9jZmZfZ2x5cGhfbmFtZSk6IFJlbmFtZWQgdG8KLQljZmZfZ2V0X2dseXBoX25hbWUgZm9yIGNvbnNpc3RlbmN5LgotCi0JKGNmZl9nZXRfZ2x5cGhfaW5kZXgpOiBNaW5vciBkb2N1bWVudGF0aW9uIGNoYW5nZS4KLQotCSogc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX2dldF9uYW1lX2luZGV4KTogTmV3IGZ1bmN0aW9uIHVzZWQgaW4KLQlHZXRfSW50ZXJmYWNlIGFzIHRoZSBmdW5jdGlvbiByZXR1cm5lZCB3aGVuIHRoZSBgbmFtZV9pbmRleCcKLQlmdW5jdGlvbiBpcyByZXF1ZXN0ZWQuCi0KLQkoZ2V0X3QxX2dseXBoX25hbWUpOiBSZW5hbWVkIHRvIHQxX2dldF9nbHlwaF9uYW1lIGZvciBjb25zaXN0ZW5jeS4KLQotMjAwMS0wOC0wOCAgVG9tIEthY3ZpbnNreSAgPHRrYWN2aW5zQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmM6IFJlbW92ZWQgZGVmaW5pdGlvbnMgb2YgY2ZmX2lzb2Fkb2JlX2NoYXJzZXQsCi0JY2ZmX2V4cGVydF9jaGFyc2V0LCBjZmZfZXhwZXJ0c3Vic2V0X2NoYXJzZXQsIGNmZl9zdGFuZGFyZF9lbmNvZGluZywKLQlhbmQgY2ZmX2V4cGVydF9lbmNvZGluZyBhcnJheXMgdG8gY2ZmbG9hZC5oLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuaDogQWRkZWQgZGVmaW5pdGlvbnMgb2YgY2ZmX2lzb2Fkb2JlX2NoYXJzZXQsCi0JY2ZmX2V4cGVydF9jaGFyc2V0LCBjZmZfZXhwZXJ0c3Vic2V0X2NoYXJzZXQsIGNmZl9zdGFuZGFyZF9lbmNvZGluZywKLQlhbmQgY2ZmX2V4cGVydF9lbmNvZGluZyBhcnJheXMuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9uYW1lX2luZGV4KTogTmV3IGZ1bmN0aW9uLCByZXR1cm5lZAotCXdoZW4gYGNmZl9nZXRfaW50ZXJmYWNlJyBpcyBjYWxsZWQgd2l0aCBhIHJlcXVlc3QgZm9yIHRoZQotCWBuYW1lX2luZGV4JyBmdW5jdGlvbi4KLQotCShjZmZfZ2V0X2ludGVyZmFjZSk6IE1vZGlmaWVkIHNvIHRoYXQgaXQgcmV0dXJucyB0aGUgZnVuY3Rpb24KLQlgY2ZmX2dldF9uYW1lX2luZGV4JyB3aGVuIHRoZSBgbmFtZV9pbmRleCcgZnVuY3Rpb24gaXMgcmVxdWVzdGVkLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X05hbWVfSW5kZXgpOiBOZXcgZnVuY3Rpb24sIHVzZWQgdG8KLQlyZXR1cm4gYSBnbHlwaCBpbmRleCBmb3IgYSBnaXZlbiBnbHlwaCBuYW1lIG9ubHkgaWYgdGhlIGRyaXZlcgotCXN1cHBvcnRzIGdseXBoIG5hbWVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9OYW1lX0luZGV4X1JlcXVlc3Rlcik6Ci0JTmV3IGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSBkZWZpbml0aW9uIHVzZWQgaW4gdGhlIGZ1bmN0aW9uCi0JRlRfR2V0X05hbWVfSW5kZXguCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfR2V0X05hbWVfSW5kZXgpOiBBZGRlZAotCWRvY3VtZW50YXRpb24gYW5kIHByb3RvdHlwZS4KLQotMjAwMS0wNy0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvY3lnd2luLyo6IFJlbW92ZWQuICBVc2UgdGhlIHVuaXggc3R1ZmYgaW5zdGVhZC4KLQotMjAwMS0wNy0yNiAgSm91ayBKYW5zZW4gIDxqb3VrakBocmVtLnN0bS50dWRlbGZ0Lm5sPgotCi0JKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmggKEZUX0NBTExCQUNLX0RFRik6IFVwZGF0ZWQgdG8gY2hhbmdlIGRhdGVkCi0JMjAwMS0wNi0yNy4KLQotMjAwMS0wNy0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFBTX1RhYmxlKTogVXNlIEZUX09mZnNldCBmb3IKLQlgY3Vyc29yJyBhbmQgYGNhcGFjaXR5Jy4KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocmVhbGxvY2F0ZV90MV90YWJsZSk6IFVzZSBGVF9Mb25nIGZvciBzZWNvbmQKLQlwYXJhbWV0ZXIuCi0JKFBTX1RhYmxlX0FkZCk6IFVzZSBGVF9PZmZzZXQgZm9yIGBuZXdfc2l6ZScuCi0KLQlBZGQgc3VwcG9ydCBmb3IgdmVyc2lvbiAwLjUgbWF4cCB0YWJsZXMuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChUVF9Mb2FkX01heFByb2ZpbGUpOiBJbXBsZW1lbnQgaXQuCi0JKFRUX0xvYWRfT1MyKTogSW5pdGlhbGl6ZSBzb21lIHZhbHVlcy4KLQotMjAwMS0wNy0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHN5bnRoLmM6IEluY2x1ZGUgZnRjYWxjLmggdW5jb25kaXRpb25hbGx5LgotCi0yMDAxLTA3LTA3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMsIHNyYy90cnVldHlwZS90dGludGVycC5jLCBzcmMvcGNmL3BjZnJlYWQ6Ci0JUmVtb3ZlZCBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncyB3aGVuIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciBpcwotCWNvbXBpbGVkIGluLgotCi0yMDAxLTA3LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfaGludGVyX2FsaWduX3dlYWtfcG9pbnRzKTogUmVtb3ZlCi0JdW51c2VkIHZhcmlhYmxlIGBlZGdlcycuCi0JKGFoX2hpbnRlcl9sb2FkKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgYG9sZF93aWR0aCcgYW5kCi0JYG5ld193aWR0aCcuCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAoY2lkX2RlY3J5cHQpOiBVc2UgYFUnIGZvciBjb25zdGFudCAoYWdhaW4pLgotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChUMV9EZWNyeXB0KTogRGl0dG8uCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChUMV9HZXRfUHJpdmF0ZV9EaWN0KTogRGl0dG8uCi0KLTIwMDEtMDYtMjggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9mdHN0cmVhbS5oOiBNb2RpZmllZCB0aGUgZGVmaW5pdGlvbnMKLQlvZiB0aGUgRlRfR0VUX1hYWFggYW5kIE5FWFRfWFhYWCBtYWNyb3MgZm9yIDE2LWJpdCBjb3JyZWN0bmVzcy4KLQotMjAwMS0wNi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYywgc3JjL2NpZC9jaWRsb2FkLmggKGNpZF9kZWNyeXB0KTogVXNlIEZUX09mZnNldAotCWluc3RlYWQgb2YgRlRfSW50IGFzIHR5cGUgZm9yIGBsZW5ndGgnIHBhcmFtZXRlci4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNBdXhfSW50ZXJmYWNlKTogVXBkYXRlZC4KLQotMjAwMS0wNi0yNyAgV29sZmdhbmcgRG9tcsO2c2UgIDxwb3J0aG9zLmRvbXJvZXNlQGhhcnouZGU+Ci0KLQkqIHNyYy9wc2F1eC9wc29ianMuYywgc3JjL3BzYXV4L3Bzb2Jqcy5oIChUMV9EZWNyeXB0KTogVXNlIEZUX09mZnNldAotCWluc3RlYWQgb2YgRlRfSW50IGFzIHR5cGUgZm9yIGBsZW5ndGgnIHBhcmFtZXRlci4KLQotCi0JKiBWZXJzaW9uIDIuMC40IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0yMDAxLTA2LTI3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBDaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotCUZUX0NBTExCQUNLX0RFRiBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNvbmZpZy5oLCBzcmMvKi8qLmM6IENoYW5nZWQgdGhlIGRlZmluaXRpb24gYW5kCi0JdXNlIG9mIHRoZSBGVF9DQUxMQkFDS19ERUYgbWFjcm8gaW4gb3JkZXIgdG8gc3VwcG9ydCAxNi1iaXQKLQljb21waWxlcnMuCi0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBDaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotCUZUX0NBTExCQUNLX0RFRiBtYWNyby4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKFRUX0xvYWRfS2Vybik6IFRoZSBrZXJuIHRhYmxlIGxvYWRlciBub3cgZW5zdXJlcwotCXRoYXQgdGhlIGtlcm5pbmcgdGFibGUgaXMgY29ycmVjdGx5IHNvcnRlZCAoc29tZSBwcm9ibGVtIGZvbnRzIGRvbid0Ci0JaGF2ZSBhIGNvcnJlY3Qga2VybiB0YWJsZSkuCi0KLTIwMDEtMDYtMjYgIFdvbGZnYW5nIERvbXLDtnNlICA8cG9ydGhvcy5kb21yb2VzZUBoYXJ6LmRlPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmggKEZUX0dFVF9PRkYzX0xFKTogRml4IHR5cG8uCi0KLTIwMDEtMDYtMjQgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKGZ0X2RpdjY0YnkzMik6IEZpeGVkIHRoZSBzb3VyY2UgdG8gd29yawotCWNvcnJlY3RseSBvbiAxNi1iaXQgc3lzdGVtcy4KLQotMjAwMS0wNi0yMyAgQW50aG9ueSBGb2sgIDxmb2tAZGViaWFuLm9yZz4KLQotCSogZGViaWFuLyo6IEFkZGVkIERlYmlhbiBwYWNrYWdlIGJ1aWxkIGRpcmVjdG9yeSBmb3IgMi4wLjQuCi0KLTIwMDEtMDYtMjIgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogZG9jcy9QQVRFTlRTOiBBZGRlZCBwYXRlbnRzIGRpc2NsYWltZXIuICBUaGlzIG9uZSB3YXMgbWlzc2luZyEKLQotCSogZG9jcy9DSEFOR0VTLCBkb2NzL3RvZG86IFVwZGF0ZWQgZm9yIHRoZSB1cGNvbWluZyAyLjAuNCByZWxlYXNlLgotCi0yMDAxLTA2LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IEFkZCB0d28gbW9yZSBgTCdzIHRvCi0JY29uc3RhbnRzLgotCUFkZCBtaXNzaW5nIHNlbWljb2xvbnMuCi0KLQkqIGJ1aWxkcy90b3BsZXZlbC5tazogRG8gc2ltaWxhciBjaGFuZ2UgYXMgZm9yCi0JYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0VOQ19UQUcpOiBOZXcgdmVyc2lvbiB0byBtYWtlIGl0Ci0JZWFzaWVyIHRvIHJlZGVmaW5lLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmggKEZUX0lNQUdFX1RBRyk6IERpdHRvLgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9lbmNvZGluZ3MpOiBBZGQgY2FzdC4KLQotMjAwMS0wNi0xOSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsIGJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWw6Ci0JVXBkYXRlZCB0aGUgVmlzdWFsIEMrKyBwcm9qZWN0IChmb3IgdGhlIDIuMC40IHJlbGVhc2UpLgotCi0JKiBidWlsZHMvdW5peC9kZXRlY3QubWs6IEFkZGVkIHJ1bGUgZm9yIEFJWCBkZXRlY3Rpb24gKHdoaWNoIHVzZXMKLQkvdXNyL3NiaW4vaW5pdCBpbnN0ZWFkIG9mIC9zYmluL2luaXQpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmgsIHNyYy8qLyplcnIqLmg6IFVwZGF0ZWQgc29tZSBvZiB0aGUKLQllcnJvciBtYWNyb3MgdG8gc2ltcGxpZnkgaGFuZGxpbmcgb2YgbmV3IGVycm9yIHNjaGVtZS4KLQotMjAwMS0wNi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCAoRlRfRVJST1JfTU9EVUxFKTogTmV3IG1hY3JvLgotCi0yMDAxLTA2LTE5ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlSZW1vdmluZyBfbG90c18gb2YgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiB0aGUgbW9zdCBwZWRhbnRpYyB3YXJuaW5nCi0JbGV2ZWxzIG9mIFZpc3VhbCBDKysgYW5kIEJvcmxhbmQgQysrIGFyZSB1c2VkLiAgVG9vIG1hbnkgZmlsZXMgdG8gYmUKLQlsaXN0ZWQgaGVyZSwgYnV0IEZUMiBub3cgY29tcGlsZXMgd2l0aG91dCB3YXJuaW5ncyB3aXRoIFZDKysgYW5kIHRoZQotCWAvVzQnIHdhcm5pbmcgbGV2ZWwgKGxpbnQtc3R5bGUpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX05ld19NZW1vcnlfRmFjZSk6IFVwZGF0ZWQKLQlkb2N1bWVudGF0aW9uLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmggKEZUX0JPT0wpOiBOZXcgbWFjcm8uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaDogQWRkICNwcmFnbWEgZm9yIFZpc3VhbCBDKysKLQl0byBzdXBwcmVzcyB3YXJuaW5nLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oIChGVF9HRVRfU0hPUlRfe0JFLExFfSwKLQlGVF9HRVRfT0ZGM197QkUsTEV9LCBGVF9HRVRfTE9OR197QkUsTEV9KTogTmV3IG1hY3Jvcy4KLQkoTkVYVF8qKTogVXNlIHRoZW0uCi0JKiBzcmMvYXV0b2hpbnQvYWhnbG9iYWwuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ILgotCShGVF9OZXdfTWVtb3J5X0ZhY2UpOiBBZGQgYGNvbnN0JyB0byBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQotMjAwMS0wNi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWlub3IgY2xlYW51cHMgdG8gcmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y21hbmFnLmggKEZUQ19NQVhfQllURVNfREVGQVVMVCk6IFVzZQotCWBMJyBmb3IgY29uc3RhbnQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIChGVF9SRU5ERVJfUE9PTF9TSVpFKTogRGl0dG8uCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRGl2KTogVXNlIGBMJyBmb3IgY29uc3RhbnQuCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX0dldF9DQm94KTogUmVtb3ZlIGBlcnJvcicgdmFyaWFibGUuCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChmdF90cmlnX2FyY3Rhbl90YWJsZSk6IFVzZSBgTCcgZm9yIGNvbnN0YW50cy4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Eb25lX1NpemUpOiBGaXggcmV0dXJuIHZhbHVlLgotCShGVF9TZXRfQ2hhcl9TaXplLCBGVF9TZXRfUGl4ZWxfU2l6ZXMsIEZUX0dldF9LZXJuaW5nKTogUmVtb3ZlCi0JdW51c2VkIGBtZW1vcnknIHZhcmlhYmxlLgotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYyAoYWhfZ2V0X29yaWVudGF0aW9uKTogVXNlIGBMJyBmb3IgY29uc3RhbnQuCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRfZWRnZXNfMywKLQlhaF9oaW50ZXJfYWxpZ25fZWRnZV9wb2ludHMpOiBSZW1vdmUgdW51c2VkIGBiZWZvcmUnIGFuZCBgYWZ0ZXInCi0JdmFyaWFibGVzLgotCShhaF9oaW50ZXJfYWxpZ25fd2Vha19wb2ludHMpOiBSZW1vdmUgdW51c2VkIGBlZGdlX2xpbWl0JyB2YXJpYWJsZS4KLQkoYWhfaGludGVyX2xvYWQpOiBSZW1vdmUgdW51c2VkIGBuZXdfYWR2YW5jZScsIGBzdGFydF9jb250b3VyJywKLQlhbmQgYG1ldHJpY3MnIHZhcmlhYmxlcy4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChDRkZfTG9hZF9FbmNvZGluZyk6IFJlbW92ZSBkZWFkIGNvZGUgdG8gYXZvaWQKLQljb21waWxlciB3YXJuaW5nLgotCSogc3JjL2NmZi9jZmZvYmpzLmMgKENGRl9Jbml0X0ZhY2UpOiBSZW1vdmUgdW51c2VkIGBiYXNlX29mZnNldCcKLQl2YXJpYWJsZS4KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoQ0ZGX1BhcnNlX0NoYXJTdHJpbmdzKTogUmVtb3ZlIHVudXNlZAotCWBvdXRsaW5lJyB2YXJpYWJsZS4KLQkoY2ZmX2NvbXB1dGVfYmlhcyk6IFVzZSBgVScgZm9yIGNvbnN0YW50LgotCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9kZWNyeXB0KTogRGl0dG8uCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKFQxX0RlY3J5cHQpOiBEaXR0by4KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jIChUMV9EZWNvZGVyX1BhcnNlX0NoYXJzdHJpbmdzKTogRGl0dG8uCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoVFRfTG9hZF9LZXJuKTogUmVtb3ZlIHVudXNlZCBgdmVyc2lvbicKLQl2YXJpYWJsZS4KLQkqIHNyYy9zZm50L3R0c2JpdC5jIChUVF9Mb2FkX1NCaXRfSW1hZ2UpOiBSZW1vdmUgdW51c2VkIGB0b3AnCi0JdmFyaWFibGUuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogUmVtb3ZlIHVudXNlZAotCWBudW1fY29udG91cnMnIGFuZCBgaW5zX29mZnNldCcgdmFyaWFibGVzLgotCShjb21wdXRlX2dseXBoX21ldHJpY3MpOiBSZW1vdmUgdW51c2VkIGBUb3AnIGFuZCBgeF9zY2FsZScKLQl2YXJpYWJsZXMuCi0JKFRUX0xvYWRfR2x5cGgpOiBSZW1vdmUgdW51c2VkIGBtZW1vcnknIHZhcmlhYmxlLgotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlzX3Jhc3Rlcl9yZW5kZXIpOiBVc2UgYEwnIGZvciBjb25zdGFudHMuCi0KLTIwMDEtMDYtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgdGhlIG5ldyBlcnJvciBzY2hlbWUgc291cmNlIGNvbXBhdGlibGUgd2l0aCBvbGRlciBGVCB2ZXJzaW9ucwotCWJ5IGludHJvZHVjaW5nIGFub3RoZXIgbGF5ZXIuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaCAoRlRfRVJST1JERUZfLCBGVF9OT0VSUk9SREVGXyk6IE5ldwotCW1hY3Jvcy4KLQkoRlRfTk9FUlJPUkRFRik6IFJlbW92ZWQuCi0JKiBpbmNsdWRlLyovKmVyciouaDogVXNlIEZUX0VSUk9SREVGXyBhbmQgRlRfTk9FUlJPUkRFRl8uCi0KLTIwMDEtMDYtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9FTkNfVEFHKTogTmV3IG1hY3JvLgotCShGVF9FbmNvZGluZ18pOiBVc2UgaXQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCAoRlRfSU1BR0VfVEFHKTogRGVmaW5lIGl0Ci0JY29uZGl0aW9uYWxseS4KLQotMjAwMS0wNi0xNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JTW9kaWZpZWQgdGhlIFRydWVUeXBlIGludGVycHJldGVyIHRvIGxldCBpdCB1c2UgdGhlIG5ldwotCXRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIHByb3ZpZGVkIGluIGBmdHRyaWdvbi5oJy4gIFRoaXMgZ2V0cyByaWQgb2YKLQlzb21lIG9sZCA2NC1iaXQgY29tcHV0YXRpb24gcm91dGluZXMsIGFzIHdlbGwgYXMgbWFueSB3YXJuaW5ncyB3aGVuCi0JY29tcGlsaW5nIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGBsb25nIGxvbmcnIDY0LWJpdCBpbnRlZ2VyIHR5cGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg6IFVuZGVmaW5lCi0JRlRfQ09ORklHX09QVElPTl9PTERfQ0FMQ1MuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oOiBSZWFycmFuZ2UgdXNlIG9mCi0JRlRfQ09ORklHX09QVElPTl9PTERfQ0FMQ1MuCi0JKiBzcmMvYmFzZS9mdGNhbGMuYzogQWRkIGRlY2xhcmF0aW9uIG9mIEZUX0ludDY0IGlmCi0JRlRfQ09ORklHX09QVElPTl9PTERfQ0FMQ1MgaXNuJ3QgZGVmaW5lZC4KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jOiBVc2UgRlRfVFJJR09OT01FVFJZX0guCi0JKE5vcm0pOiBBZGQgYSBzcGVjaWFsIHZlcnNpb24gaWYgRlRfQ09ORklHX09QVElPTl9PTERfQ0FMQ1MgaXNuJ3QKLQlkZWZpbmVkLgotCShDdXJyZW50X1JhdGlvLCBOb3JtYWxpemUpOiBTaW1wbGlmeSBjb2RlLgotCi0yMDAxLTA2LTExICBNaWtlIE93ZW5zICA8TU93ZW5zQGFtdGRhdGFzb3V0aC5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NdWxEaXYsIEZUX0RpdkZpeCwgRlRfU3FydDY0KTogUmVtb3ZlCi0JY29tcGlsZXIgd2FybmluZ3MuCi0KLTIwMDEtMDYtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmluOiBSZW5hbWVkIHRvIC4uLgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjOiBUaGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGF1dG9jb25mIDIuNTAgaXMKLQluZWVkZWQuCi0JUnVuIGBhdXRvdXBkYXRlJyBvbiBpdC4KLQlJbmNyZWFzZSBgdmVyc2lvbl9pbmZvJyB0byA3OjA6MS4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLTIwMDEtMDYtMDggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfbG9hZF9nbHlwaCk6IEZpeGVkIGEgYnVnIHRoYXQKLQljb3JydXB0ZWQgdHJhbnNmb3JtZWQgZ2x5cGhzIHRoYXQgd2VyZSBhdXRvLWhpbnRlZCAodGhlIHRyYW5zZm9ybQotCXdhcyBhcHBsaWVkIHR3aWNlKS4KLQotCUZpeGVkIGEgYnVnIHRoYXQgcmV0dXJuZWQgYW4gaW52YWxpZCBsaW5lYXIgd2lkdGggZm9yIGNvbXBvc2l0ZQotCVRydWVUeXBlIGdseXBocy4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0xvYWRlcl8pOiBUd28gbmV3IGVsZW1lbnRzIGBsaW5lYXInCi0JYW5kIGBsaW5lYXJfZGVmJy4KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgsCi0JY29tcHV0ZV9nbHlwaF9tZXRyaWNzKTogVXNlIGl0LgotCi0JKiBpbmNsdWRlL2Z0dHlwZXMuaCAoRlRfRVJST1JfQkFTRSk6IE5ldyBtYWNyby4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9PcGVuX0ZhY2UsIEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCk6IFVzZSBpdAotCXRvIG1ha2Ugc291cmNlIGNvZGUgd29yayB3aXRoIHRoZSBuZXcgZXJyb3Igc2NoZW1lIGltcGxlbWVudGVkIGJ5Ci0JV2VybmVyLgotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX1JlbmRlcik6IERpdHRvLgotCi0yMDAxLTA2LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlVcGRhdGluZyB0byBsaWJ0b29sIDEuNC4wIGFuZCBhdXRvY29uZiAyLjUwLgotCi0JKiBidWlsZHMvdW5peC9sdGNvbmZpZzogUmVtb3ZlZC4KLQkqIGJ1aWxkcy91bml4L2x0bWFpbi5zaCwgYnVpbGRzL3VuaXgvY29uZmlndXJlLmluLAotCWJ1aWxkcy91bml4L2FjbG9jYWwubTQ6IFVwZGF0ZWQuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0yMDAxLTA2LTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlDb21wbGV0ZSByZWRlc2lnbiBvZiBlcnJvciBjb2Rlcy4gIFBsZWFzZSBjaGVjayBmdG1vZGVyci5oIGZvciBtb3JlCi0JZGV0YWlscy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZlcnJzLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dGVycm9ycy5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDFlcnJvcnMuaDogUmVtb3ZlZC4gIFJlcGxhY2VkIHdpdGggZmlsZXMKLQlsb2NhbCB0byB0aGUgbW9kdWxlLiAgQWxsIGV4dHJhIGVycm9yIGNvZGVzIGhhdmUgYmVlbiBtb3ZlZCB0bwotCWBmdGVycm9ycy5oJy4KLQotCSogc3JjL3NmbnQvdHRwb3N0Lmg6IE1vdmUgZXJyb3IgY29kZXMgdG8gYGZ0ZXJyb3JzLmgnLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhlcnJvcnMuaCwgc3JjL2NhY2hlL2Z0Y2Vycm9yLmgsIHNyYy9jZmYvY2ZmZXJycy5oLAotCXNyYy9jaWQvY2lkZXJycy5oLCBzcmMvcGNmL3BjZmVycm9yLmgsIHNyYy9wc2F1eC9wc2F1eGVyci5oLAotCXNyYy9wc25hbWVzL3BzbmFtZXJyLmgsIHNyYy9yYXN0ZXIvcmFzdGVycnMuaCwgc3JjL3NmbnQvc2ZlcnJvcnMuaCwKLQlzcmMvc21vb3RoL2Z0c21lcnJzLmgsIHNyYy90cnVldHlwZS90dGVycm9ycy5oLAotCXNyYy90eXBlMS90MWVycm9ycy5oLCBzcmMvd2luZm9udHMvZm50ZXJycy5oOiBOZXcgZmlsZXMgZGVmaW5pbmcgdGhlCi0JZXJyb3IgbmFtZXMgZm9yIHRoZSBtb2R1bGUgaXQgYmVsb25ncyB0by4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oOiBOZXcgZmlsZSwgZGVmaW5pbmcgdGhlIG1vZHVsZSBlcnJvcgotCW9mZnNldHMuICBJdHMgc3RydWN0dXJlIGlzIHNpbWlsYXIgdG8gYGZ0ZXJyb3JzLmgnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmggKEZUX05PRVJST1JERUYpOiBOZXcgbWFjcm8uCi0JKEZUX0VSUk9SREVGKTogUmVkZWZpbmVkIHRvIHVzZSBtb2R1bGUgZXJyb3Igb2Zmc2V0cy4KLQlBbGwgaW50ZXJuYWwgZXJyb3IgY29kZXMgYXJlIG5vdyBwdWJsaWM7IHVudXNlZCBlcnJvciBjb2RlcyBoYXZlCi0JYmVlbiByZW1vdmVkLCBzb21lIGFyZSBuZXcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX01PRFVMRV9FUlJPUlNfSCk6IE5ldwotCW1hY3JvLgotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAotCShGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTKTogTmV3IG1hY3JvLgotCi0JQWxsIG90aGVyIHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIG5ldyBlcnJvciBjb2RlczsKLQlzb21lIGFscmVhZHkgZXhpc3RpbmcgKGludGVybmFsKSBlcnJvciBjb2RlcyBsb2NhbCB0byBhIG1vZHVsZSBoYXZlCi0JYmVlbiByZW5hbWVkIHRvIGdpdmUgdGhlbSB0aGUgc2FtZSBuYW1lIGFzIGluIHRoZSBiYXNlIG1vZHVsZS4KLQotCUFsbCBtYWtlIGZpbGVzIGhhdmUgYmVlbiB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIGxvY2FsIGVycm9yIGZpbGVzLgotCi0yMDAxLTA2LTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkdG9rZW5zLmg6IFJlcGxhY2VkIHdpdGguLi4KLQkqIHNyYy9jaWQvY2lkdG9rZW4uaDogVGhpcyBmaWxlIGZvciA4KzMgY29uc2lzdGVuY3kuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYzogVXNlIG1hY3JvcyBmb3IgaGVhZGVyIGZpbGUgbmFtZXMuCi0KLQkqIHNyYy9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFibGVzLmggKFRUX0hvcmlIZWFkZXJfLCBUVF9WZXJ0SGVhZGVyXyk6Ci0JRml4IGxlbmd0aCBvZiBgUmVzZXJ2ZWQnIGFycmF5LiAgTm90ZSB0aGF0IHRoaXMgaXNuJ3QgdGhlIHJlYWwgZml4Ci0Jc2luY2UgcmVjZW50IE9wZW5UeXBlIHNwZWNzIGhhdmUgaW50cm9kdWNlZCBhIGBDYXJldE9mZnNldCcgZmllbGQKLQlpbnN0ZWFkIG9mIHRoZSBmaXJzdCByZXNlcnZlZCBieXRlLgotCi0yMDAxLTA1LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIElOU1RBTEw6IE1pbm9yIGZpeGVzLgotCi0KLQkqIFZlcnNpb24gMi4wLjMgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLTIwMDEtMDUtMjkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogSU5TVEFMTCwgZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDAxLTA1LTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlNb3ZlZCBzZXZlcmFsIGRvY3VtZW50cyBmcm9tIHRoZSB0b3AtbGV2ZWwgdG8gdGhlIGBkb2NzJyBkaXJlY3RvcnkuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9EaXZGaXgpOiBTbWFsbCBmaXggdG8gcmV0dXJuIHZhbHVlLgotCi0yMDAxLTA1LTE2ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBGaXhlZCBhIGJ1ZyBpbiB0aGUKLQljb21wb3NpdGUgbG9hZGVyLiAgU3BvdHRlZCBieSBLZWl0aCBQYWNrYXJkLgotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0dseXBoTG9hZGVyX0NoZWNrX1BvaW50cywKLQlGVF9HbHlwaExvYWRlcl9DaGVja19TdWJnbHlwaHMpOiBEaXR0by4KLQotMjAwMS0wNS0xNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JRml4ZWQgdGhlIGluY29ycmVjdCBibHVlIHpvbmUgY29tcHV0YXRpb25zLCBhbmQgaW1wcm92ZWQgdGhlCi0JY29tcG9zaXRlIHN1cHBvcnQuICBOb3RlIHRoYXQgdGhlc2UgY2hhbmdlcyByZXN1bHQgaW4gaW1wcm92ZWQKLQlyZW5kZXJpbmcsIHdoaWxlIHNvbWV0aW1lcyBpbnRyb2R1Y2luZyB0aGVpciBvd24gYXJ0ZWZhY3RzLiAgVGhpcyBpcwotCXByb2JhYmx5IHRoZSBsYXN0IGJpZyBjaGFuZ2UgdG8gdGhlIGF1dG9oaW50ZXIgYmVmb3JlIHRoZQotCWludHJvZHVjdGlvbiBvZiBhIGNvbXBsZXRlIHJlcGxhY2VtZW50LgotCi0JKiBzcmMvYXV0b2hpbnQvYWhnbG9iYWwuYyAoc29ydF92YWx1ZXMpOiBGaXggbG9vcC4KLQkqIHNyYy9hdXRvaGludC9haGdseXBoLmM6IFJlbW92ZWQgc29tZSBvYnNvbGV0ZSBjb2RlLgotCShhaF9vdXRsaW5lX2NvbXB1dGVfZWRnZXMpOiBNb2RpZnkgY29kZSB0byBzZXQgdGhlIGFoX2VkZ2Vfcm91bmQKLQlmbGFnLgotCShhaF9vdXRsaW5lX2NvbXB1dGVfYmx1ZV9lZGdlcyk6IEFkZCBjb2RlIHRvIGNvbXB1dGUgYWN0aXZlIGJsdWUKLQl6b25lcy4KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfaGludGVyX2dseXBoX2xvYWQpOiBDaGFuZ2UgbG9hZF9mbGFncwotCXZhbHVlLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfRGl2Rml4KTogRml4ZWQgYSBidWcgaW4gdGhlIDY0LWJpdCBjb2RlIHRoYXQKLQljcmVhdGVkIGluY29ycmVjdCBzY2FsZSBmYWN0b3JzIQotCShGVF9Sb3VuZEZpeCwgRlRfQ2VpbEZpeCwgRlRfRmxvb3JGaXgpOiBNaW5vciBpbXByb3ZlbWVudHMuCi0KLTIwMDEtMDUtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGJib3guaDogRlRCQk9YX0ggLT4gX19GVEJCT1hfSF9fLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdHRyaWdvbi5oOiBfX0ZUX1RSSUdPTk9NRVRSWV9IX18gLT4KLQlfX0ZUVFJJR09OX0hfXy4KLQlJbmNsdWRlIEZUX0ZSRUVUWVBFX0guCi0JQmVhdXRpZmllZDsgYWRkZWQgY29weXJpZ2h0LgotCSogc3JjL2Jhc2UvZnR0cmlnb24uYzogQmVhdXRpZmllZDsgYWRkZWQgY29weXJpZ2h0LgotCi0yMDAxLTA1LTExICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX2ZvbnRfbWF0cml4KSwgc3JjL2NpZC9jaWRsb2FkLmMKLQkocGFyc2VfZm9udF9tYXRyaXgpLCBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2ZvbnRfbWF0cml4KTogRml4ZWQKLQl0aGUgaW5jb3JyZWN0IEVNIHNpemUgY29tcHV0YXRpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaCwgc3JjL2Jhc2UvZnR0cmlnb24uYzogTmV3IGZpbGVzLAotCWFkZGluZyB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyB0byB0aGUgY29yZSBBUEkgKHVzaW5nIENvcmRpYwotCWFsZ29yaXRobXMpLgotCSogc3JjL2Jhc2UvZnRiYXNlLmMsIHNyYy9iYXNlL0phbWZpbGUsIHNyYy9iYXNlL3J1bGVzLm1rOiBVc2UgdGhlbS4KLQotCSogYnVpbGRzL25ld2xpbmU6IE5ldyBmaWxlLgotCSogYnVpbGRzL3RvcF9sZXZlbC5taywgYnVpbGRzL2RldGVjdC5tazogVXNlIGl0LiAgVGhpcyBmaXhlcwotCXByb2JsZW1zIHdpdGggTWFrZSBvbiBXaW5kb3dzIDIwMDAsIGFzIHdlbGwgYXMgcHJvYmxlbXMgd2hlbiBgbWFrZQotCWRpc3RjbGVhbicgaXMgaW52b2tlZCBvbiBhIG5vbi1Vbml4IHBsYXRmb3JtIHdoZW4gdGhlcmUgaXMgbm8KLQlgY29uZmlnLm1rJyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0KLQkqIGJ1aWxkcy9mcmVldHlwZS5tazogRml4ZWQgYSBwcm9ibGVtIHdpdGggb2JqZWN0IGRlbGV0aW9ucyB1bmRlcgotCURvcy9XaW5kb3dzL09TLzIgc3lzdGVtcy4KLQotCUFkZGVkIG5ldyBkaXJlY3RvcnkgdG8gaG9sZCB0b29scyBhbmQgdGVzdCBwcm9ncmFtcy4KLQotCSogZG9jcy9kb2NtYWtlci5weSwgZG9jcy9nbG5hbWVzLnB5OiBNb3ZlZCB0by4uLgotCSogc3JjL3Rvb2xzL2RvY21ha2VyLnB5LCBzcmMvdG9vbHMvZ2xuYW1lcy5weTogVGhpcyBwbGFjZS4KLQkqIHNyYy90b29scy9jb3JkaWMucHk6IE5ldyBmaWxlIHVzZWQgdG8gY29tcHV0ZSBhcmN0YW5nZW50IHRhYmxlCi0JbmVlZGVkIGJ5IGZ0dHJpZ29uLmMuCi0JKiBzcmMvdG9vbHMvdGVzdF9iYm94LmMsIHNyYy90b29scy90ZXN0X3RyaWcuYzogTmV3IHRlc3QgZmlsZXMuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci5weTogSW1wcm92ZWQgdGhlIHNjcmlwdCB0byBhZGQgdGhlIGN1cnJlbnQgZGF0ZQotCWF0IHRoZSBmb290ZXIgb2YgZWFjaCB3ZWIgcGFnZSAodXNlZnVsIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLQl2ZXJzaW9ucykuCi0KLQkqIEphbWZpbGU6IEZpeGVkIGluY29ycmVjdCBIRFJNQUNSTyBhcmd1bWVudC4KLQotCSogVE9ETzogUmVtb3ZlZCB0aGUgY3ViaWMgYXJjIGJib3ggY29tcHV0YXRpb24gbm90ZSwgc2luY2UgaXQgaGFzIGJlZW4KLQlmaXhlZCByZWNlbnRseS4KLQkqIHNyYy9iYXNlL2Z0YmJveC5jICh0ZXN0X2N1YmljX3plcm8pOiBSZW5hbWVkIHRvLi4uCi0JKHRlc3RfY3ViaWNfZXh0cmVtYSk6IFRoaXMgZnVuY3Rpb24uICBVc2UgYFVMJyBmb3IgdW5zaWduZWQgbG9uZwotCWNvbnN0YW50cy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oOgotCUZvcm1hdHRpbmcuCi0KLTIwMDEtMDUtMTAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX09wZW5fRmFjZSk6IEZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsKLQl3aGljaCBoYXBwZW5lZCB3aGVuIHRyeWluZyB0byBvcGVuIDAtc2l6ZSBmb250IGZpbGVzIQotCi0yMDAxLTA1LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg6IE1vdmUgZGVjbGFyYXRpb24gb2YKLQlGVF9TcXJ0Rml4ZWQoKSBvdXQgb2YgYCNpZmRlZiBGVF9MT05HNjQnLgotCi0yMDAxLTA1LTA4ICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkgIDxGcmFuY2VzY28uWmFwcGEuTmFyZGVsbGlAZW5zLmZyPgotCi0JKiBzcmMvcGNmZHJpdmVyLmMgKFBDRl9Mb2FkX0dseXBoKTogRml4ZWQgaW5jb3JyZWN0IGJpdG1hcCB3aWR0aAotCWNvbXB1dGF0aW9uLgotCi0yMDAxLTA1LTA4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvZG9jbWFrZXIucHk6IFVwZGF0ZWQgdGhlIERvY01ha2VyIHNjcmlwdCBpbiBvcmRlciB0byBhZGQKLQljb21tYW5kIGxpbmUgb3B0aW9ucyAoLS1vdXRwdXQsLS1wcmVmaXgsLS10aXRsZSksIGZpeCB0aGUgZXJyb25lb3VzCi0JbGluZSBudW1iZXJzIHJlcG9ydGVkIGR1cmluZyBlcnJvcnMgYW5kIHdhcm5pbmdzLCBhbmQgb3RoZXIKLQlmb3JtYXR0aW5nIGlzc3Vlcy4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX011bERpdiwgRlRfTXVsRml4LCBGVF9EaXZGaXgpOiBWYXJpb3VzIHRpbnkKLQlmaXhlcyByZWxhdGVkIHRvIHJvdW5kaW5nIGluIDY0LWJpdHMgcm91dGluZXMgYW5kCi0JcHNldWRvLWBvcHRpbWl6YXRpb25zJy4KLQotMjAwMS0wNC0yNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGJib3guYyAoQkJveF9DdWJpY19DaGVjayk6IEZpeGVkIHRoZSBjb2VmZmljaWVudAotCW5vcm1hbGl6YXRpb24gYWxnb3JpdGhtIChpbnZhbGlkIGZpbmFsIGJpdCBwb3NpdGlvbiwgYW5kIGludmFsaWQKLQlzaGlmdCBjb21wdXRhdGlvbikuCi0KLTIwMDEtMDQtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlnLmd1ZXNzLCBidWlsZHMvdW5peC9jb25maWcuc3ViOiBVcGRhdGVkIHRvCi0JbGF0ZXN0IHZlcnNpb25zIGZyb20gZ251Lm9yZy4KLQotCSogYnVpbGRzL2NvbXBpbGVyL2djYy1kZXYubWs6IEFkZCBgLVduby1sb25nLWxvbmcnIGZsYWcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg6IERlZmluZSBGVF9TcXJ0Rml4ZWQoKQotCXVuY29uZGl0aW9uYWxseS4KLQkqIHNyYy9iYXNlL2Z0YmJveC5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSC4KLQlGaXggY29tcGlsZXIgd2FybmluZ3MuCi0JKiBzcmMvYmFzZS9mdGNhbGMuYzogRml4IChwb3RlbnRpYWwpIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0yMDAxLTA0LTI2ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9TcXJ0Rml4ZWQpOiBDb3JyZWN0ZWQvb3B0aW1pemVkIHRoZSAzMi1iaXQKLQlmaXhlZC1wb2ludCBzcXVhcmUgcm9vdCBjb21wdXRhdGlvbi4gIEl0IGlzIG5vdyB1c2VkIGV2ZW4gd2l0aAotCTY0LWJpdHMgaW50ZWdlcnMsIGFzIGl0IGlzIF9tdWNoXyBmYXN0ZXIgdGhhbiBjYWxsaW5nIEZUX1NxcnQ2NCA6LSkKLQotCSogc3JjL2Jhc2UvZnRiYm94LmM6IFJlbW92ZWQgaW52YWxpZCBgI2luY2x1ZGUgRlRfQkVaSUVSX0gnIGxpbmUuCi0KLTIwMDEtMDQtMjUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRiYm94LmMgKEJCb3hfQ3ViaWNfQ2hlY2spOiBSZXdyb3RlIGZ1bmN0aW9uIHRvIHVzZQotCWRpcmVjdCBjb21wdXRhdGlvbnMgd2l0aCAxNi4xNiB2YWx1ZXMgaW5zdGVhZCBvZiBzdWItZGl2aXNpb25zLiAgSXQKLQlpcyBub3cgc2xvd2VyLCBidXQgcHJvdmVzIGEgcG9pbnQgOi0pCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYywgc3JjL3Ntb290aC9mdGdyYXlzLmMsIHNyYy9iYXNlL2Z0YmJveC5jOgotCUZpeGVkIHRoZSBCw6l6aWVyIHN0YWNrIGRlcHRocy4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX011bEZpeCk6IE1pbm9yIHJvdW5kaW5nIGZpeC4KLQotCSogYnVpbGRzL2Jlb3M6IEFkZGVkIEJlT1Mtc3BlY2lmaWMgZmlsZXMgdG8gdGhlIG9sZCBidWlsZCBzeXN0ZW0KLQkobm8gY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeSB0byBzdXBwb3J0IEJlT1MgaW4gdGhlIEphbWZpbGUgdGhvdWdoKS4KLQotMjAwMS0wNC0yMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBmdGNvbmZpZy5oLCBmdG9wdGlvbi5oOiBVcGRhdGVkIGBmdGNvbmZpZy5oJyB0byBkZXRlY3QgNjQtYml0IGludAotCXR5cGVzIG9uIHBsYXRmb3JtcyB3aGVyZSBBdXRvY29uZiBpcyBub3QgYXZhaWxhYmxlKS4gIEFsc28gcmVtb3ZlZAotCUZUQ0FMQ19VU0VfTE9OR19MT05HIGFuZCByZXBsYWNlZCBpdCB3aXRoCi0JRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NC4KLQotCSogYnVpbGRzL3dpbjMyL2ZyZWV0eXBlLmRzcDogVXBkYXRlZCB0aGUgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGUuCi0JRG9lc24ndCBjcmVhdGUgYSBETEwgeWV0LgotCi0JKiBjZmZnbG9hZC5jOiBSZW1vdmVkIGEgY29tcGlsYXRpb24gd2FybmluZy4KLQotMjAwMS0wNC0xMCAgVG9tIEthY3ZpbnNreSAgPHRrYWN2aW5zQGZyZWV0eXBlLm9yZz4KLQotCSogdDFsb2FkLmMgKHBhcnNlX2NoYXJzdHJpbmdzKTogQ2hhbmdlZCBjb2RlIGZvciBwbGFjaW5nIC5ub3RkZWYKLQlnbHlwaCBpbnRvIHNsb3QgMCBzbyB0aGF0IHdlIG5vIGxvbmdlciBoYXZlIGEgbWVtb3J5IGFjY2VzcwotCXZpb2xhdGlvbi4KLQotCSogdDFsb2FkLmg6IEluIHN0cnVjdHVyZSBUMV9Mb2FkZXIsIGFkZGVkIHN3YXBfdGFibGUgKG9mIHR5cGUKLQlQU19UYWJsZSkgdG8gZmFjaWxpdGF0ZSBwbGFjaW5nIHRoZSAubm90ZGVmIGdseXBoIGludG8gc2xvdCAwLgotCi0yMDAxLTA0LTEwICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkgIDxmcmFuY2VzY28uemFwcGEubmFyZGVsbGlAZW5zLmZyPgotCi0JKiBzcmMvcGNmL3BjZmRyaXZlci5jIChQQ0ZfR2V0X0NoYXJfSW5kZXgpOiBGaXggcmV0dXJuIHZhbHVlLgotCi0yMDAxLTA0LTA5ICBMYXVyZW5jZSBXaXRoZXJzICA8bHdpdGhlcnNAbHdpdGhlcnMuZGVtb24uY28udWs+Ci0KLQkqIGJ1aWxkcy9kb3MvZGV0ZWN0Lm1rOiBBZGQgc3VwcG9ydCBmb3IgYmFzaC4KLQotMjAwMS0wNC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvb3MyLyoubWs6IFRoZXNlIGZpbGVzIGhhdmUgYmVlbiBmb3Jnb3R0ZW4gdG8gdXBkYXRlIHRvCi0JdGhlIHN0cnVjdHVyZSBvZiBzaW1pbGFyIG1ha2VmaWxlcy4KLQkqIGJ1aWxkcy9kb3MvKi5tazogRGl0dG8uCi0JKiBidWlsZHMvYW5zaS8qLm1rOiBEaXR0by4KLQotCSogYnVpbGRzL3dpbjMyL3dpbjMyLWRlZi5tayAoQlVJTEQpOiBGaXggdHlwby4KLQotCSogYnVpbGRzL2NvbXBpbGVyLyoubWsgKENMRUFOX0xJQlJBUlkpOiBEb24ndCB1c2UgTk9fT1VUUFVULgotCVRoaXMgaXMgYWxyZWFkeSB1c2VkIGluIHRoZSBsaW5rXyoubWsgZmlsZXMuCi0KLTIwMDEtMDQtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjLyovSmFtZmlsZTogU2xpZ2h0IGNoYW5nZXMJdG8gbWFrZSBmaWxlcyBtb3JlIGNyeXB0aWMuCi0KLTIwMDEtMDQtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogSmFtZmlsZSwgc3JjL0phbWZpbGUsIHNyYy8qL0phbWZpbGU6IEZvcm1hdHRlZC4gIFNsaWdodCBjaGFuZ2VzCi0JdG8gZ2l2ZSBmaWxlcyBpZGVudGljYWwgc3RydWN0dXJlLgotCi0yMDAxLTA0LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIENIQU5HRVM6IFJlZm9ybWF0dGVkLCBtaW5vciBmaXhlcy4KLQkqIFRPRE86IFVwZGF0ZWQuCi0JKiBSRUFETUU6IEZvcm1hdHRpbmcuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IEZvcm1hdHRpbmcuCi0KLQkqIEphbWZpbGU6IEZpeCB0eXBvLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmM6IE1vdmUgZXJyb3IgY29kZSAjZGVmaW5lcyB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZlcnJzLmg6IFRoaXMgZmlsZS4KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL2NmZi9jZmZvYmpzLmMsIHNyYy9jZmYvY2ZmbG9hZC5jOiBSZXBsYWNlZAotCWBGVF9FcnJfKicgd2l0aCBgQ0ZGX0Vycl8qJy4KLQkqIHNyYy9jaWQvY2lkcGFyc2UuYzogUmVwbGFjZWQgYEZUX0Vycl8qJyB3aXRoIGBUMV9FcnJfKicuCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMsIHNyYy9wc2F1eC90MWRlY29kZS5jOiBEaXR0by4KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jLCBzcmMvc2ZudC90dGxvYWQuYzogUmVwbGFjZWQgYEZUX0Vycl8qJyB3aXRoCi0JYFRUX0Vycl8qJy4KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMsIHNyYy90cnVldHlwZS90dG9ianMuYzogRGl0dG8uCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jLCBzcmMvdHlwZTEvdDFsb2FkLmMsIHNyYy90eXBlMS90MW9ianMuYywKLQlzcmMvdHlwZTEvdDFwYXJzZS5jOiBSZXBsYWNlZCBgRlRfRXJyXyonIHdpdGggYFQxX0Vycl8qJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZlcnJzLmg6IEFkZAotCWBDRkZfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQnLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MWVycm9ycy5oOiBBZGQKLQlgVDFfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQnLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dGVycm9ycy5oOiBBZGQKLQlgVFRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQnLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuaDogQWRkIGBjZmZfKl9lbmNvZGluZycgYW5kIGBjZmZfKl9jaGFyc2V0JwotCXJlZmVyZW5jZXMuCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmM6IEluY2x1ZGUgYEZUX0lOVEVSTkFMX1RZUEUxX0VSUk9SU19IJy4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKENGRl9Jbml0X0ZhY2UsIENGRl9Eb25lX0ZhY2UpOiBVc2UKLQlGVF9MT0NBTF9ERUYuCi0JKiBzcmMvY2lkL2NpZG9ianMuYyAoQ0lEX0RvbmVfRHJpdmVyKTogRGl0dG8uCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKFRUX0luaXRfRmFjZSwgVFRfRG9uZV9GYWNlLCBUVF9Jbml0X1NpemUpOgotCURpdHRvLgotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9Eb25lX0RyaXZlcik6IERpdHRvLgotCSogc3JjL3BjZi9wY2Zkcml2ZXIuYyAoUENGX0RvbmVfRmFjZSk6IERpdHRvLgotCSogc3JjL3BjZi9wY2YuaDogVXNlIEZUX0xPQ0FMIGZvciBgUENGX0RvbmVfRmFjZScuCi0KLTIwMDEtMDQtMDIgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChUVF9Mb2FkX01ldHJpY3MpOiBGaXggYW4gaW1wcm9wZXIgcG9pbnRlcgotCWRlcmVmZXJlbmNlLiAgU3VibWl0dGVkIGJ5IEhlcmJlcnQgRHVlcnIgPGR1ZXJyQHN1bi5jb20+LgotCi0yMDAxLTAzLTI2ICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oOiBDaGFuZ2VkIGhleGFkZWNpbWFsCi0JY29uc3RhbnRzIHRvIHVzZSBzdWZmaXggVSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIEhQLVVYJ3MgYzg5Ci0JY29tcGlsZXIuICBTdWJtaXR0ZWQgYnkgRy5XLiBMdWNhcyA8Z2x1Y2FzQHNvbmFseXN0cy5jb20+LgotCi0yMDAxLTAzLTI0ICBEYXZpZCBUdXJuZXIgIDxkYXZpZC50dXJuZXJAZnJlZXR5cGUub3JnPgotCi0JKiBKYW1ydWxlcywgSmFtZmlsZSwgc3JjL0phbWZpbGUsIHNyYy8qL0phbWZpbGU6IEFkZGluZyBqYW1maWxlcyB0bwotCXRoZSBzb3VyY2UgdHJlZS4gIFNlZSB3d3cuZnJlZXR5cGUub3JnL2phbS9pbmRleC5odG1sIGZvciBkZXRhaWxzLgotCi0KLQkqIFZlcnNpb24gMi4wLjIgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLTIwMDEtMDMtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3dpbjMyL2RldGVjdC5tazogRml4IC5QSE9OWSB0YXJnZXQgZm9yIEludGVsIGNvbXBpbGVyLgotCi0yMDAxLTAzLTIwICBEYXZpZCBUdXJuZXIgIDxkYXZpZC50dXJuZXJAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmg6Ci0JUmVuYW1lZCBgZnRuYW1lcy5oJyB0byBgZnRzbmFtZXMuaCcsIGFuZCBGVF9OQU1FU19IIHRvCi0JRlRfU0ZOVF9OQU1FU19ILgotCi0JKiBkb2NzL2RvY21ha2VyLnB5OiBBZGRlZCBnZW5lcmF0aW9uIG9mIElOREVYIGxpbmsgaW4gdGFibGUgb2YKLQljb250ZW50cy4KLQotCSogSU5TVEFMTCwgZG9jcy9CVUlMRDogVXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhlCi0JY29tcGlsYXRpb24gcHJvY2VzcyBoYXMgY2hhbmdlZCBzbGlnaHRseSAobm8gbW9yZSBgc3JjJyByZXF1aXJlZCBpbgotCXRoZSBpbmNsdWRlIHBhdGgpLgotCi0JKiBidWlsZHMvKi8qLWRlZi5tazogQ2hhbmdlZCB0aGUgb2JqZWN0cyBkaXJlY3RvcnkgZnJvbSBgb2JqJyB0bwotCWBvYmpzJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaDogUmVtb3ZlZCBvYnNvbGV0ZSBtYWNyb3MgbGlrZQotCUZUX1NPVVJDRV9GSUxFLCBldGMuIGFuZCBhZGRlZCBjYWNoZS1zcGVjaWZpYyBtYWNybyBkZWZpbml0aW9ucyB0aGF0Ci0Jd2VyZSBwcmV2aW91c2x5IGRlZmluZWQgaW4gPGZyZWV0eXBlL2Z0Y2FjaGUuaD4uICBBZGRlZCBjb21tZW50cyB0bwotCWJlIGluY2x1ZGVkIGluIGEgbmV3IEFQSSBSZWZlcmVuY2Ugc2VjdGlvbi4KLQotCSogc3JjLyovKjogUmVtb3ZlZCB0aGUgdXNlIG9mIEZUX1NPVVJDRV9GSUxFLCBldGMuICBOb3csIGVhY2gKLQljb21wb25lbnQgbmVlZHMgdG8gYWRkIGl0cyBvd24gZGlyZWN0b3J5IHRvIHRoZSBpbmNsdWRlIHBhdGggYXQKLQljb21waWxlIHRpbWUuICBNb2RpZmllZCBhbGwgYHJ1bGVzLm1rJyBhbmQgYGRlc2NyaXAubW1zJwotCWFjY29yZGluZ2x5LgotCi0yMDAxLTAzLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5pbjogQWRkICRmdF92ZXJzaW9uLgotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluOiBVc2UgaXQuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFVwZGF0ZWQuCi0KLTIwMDEtMDMtMTkgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZm9udF9tYXRyaXgpOiBBc3NpZ24gdGhlIHVuaXRzIHBlciBlbQotCXZhbHVlIGFuIHVuc2lnbmVkIHNob3J0IHZhbHVlLCBmaXJzdCBieSBzaGlmdGluZyByaWdodCAxNiBiaXRzLAotCXRoZW4gYnkgY2FzdGluZyB0aGUgcmVzdWx0cyB0byBGVF9VU2hvcnQuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX2ZvbnRfYmJveCk6IEFzc2lnbiB0aGUgdW5pdHMgcGVyIGVtCi0JdmFsdWUgYW4gdW5zaWduZWQgc2hvcnQgdmFsdWUsIGZpcnN0IGJ5IHNoaWZ0aW5nIHJpZ2h0IDE2IGJpdHMsCi0JdGhlbiBieSBjYXN0aW5nIHRoZSByZXN1bHRzIHRvIEZUX1VTaG9ydC4KLQotMjAwMS0wMy0xNyAgRGF2aWQgVHVybmVyICA8ZGF2aWQudHVybmVyQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2NpZC9jaWRvYmpzLmMsIHNyYy9jaWQvY2lkbG9hZC5jLCBzcmMvcGNmL3BjZnJlYWQuYywKLQlzcmMvdHlwZTEvdDFsb2FkLmMsIHNyYy90eXBlMS90MW9ianMuYzogQWRkZWQgYSBmZXcgY2FzdHMgdG8gcmVtb3ZlCi0JY29tcGlsZXIgd2FybmluZ3MgaW4gcGVkYW50aWMgbW9kZXMuCi0KLQkqIGluY2x1ZGUvY29uZmlnL2Z0MmJ1aWxkLmgsIGluY2x1ZGUvY29uZmlnL2Z0aGVhZGVyLmg6IFRoZSBmaWxlCi0JYGZ0MmJ1aWxkLmgnIHdhcyByZW5hbWVkIHRvIGBmdGhlYWRlci5oJyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUKLQl0b3AtbGV2ZWwgPGZ0MmJ1aWxkLmg+LgotCi0JKiBpbmNsdWRlL2NvbmZpZy9mdGhlYWRlci5oOiBBZGRlZCBuZXcgc2VjdGlvbiBkZXNjcmliaW5nIHRoZSAjaW5jbHVkZQotCW1hY3Jvcy4KLQotMjAwMS0wMy0xNyAgVG9tIEthY3ZpbnNreSAgPHRrYWN2aW5zQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfZm9udF9iYm94KTogT2J0YWluIHJvdW5kZWQgRlRfRml4ZWQKLQl2YWx1ZXMgZm9yIHRoZSBib3VuZGluZyBib3ggbnVtYmVycy4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKENGRl9Jbml0X0ZhY2UpOiBXaGVuIHByb2Nlc3NpbmcgYSBDRkYvQ0VGIGZvbnQsCi0Jc2V0IGByb290LT5hc2NlbmRlcicgKGByb290LT5kZXNjZW5kZXInKSB0byB0aGUgaW50ZWdlciBwYXJ0IG9mCi0JYHJvb3QtPmJib3gueU1heCcgKGByb290LT5iYm94LnlNaW4nLCByZXNwZWN0aXZlbHkpLgotCi0yMDAxLTAzLTE2ICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGdldF9jZmZfZ2x5cGhfbmFtZSk6ICBOZXcgZnVuY3Rpb24uICBVc2VkIGluCi0JY2ZmX2dldF9pbnRlcmZhY2UgdG8gZmFjaWxpdGF0ZSBnZXR0aW5nIGEgZ2x5cGggbmFtZSBmb3IgZ2x5cGggaW5kZXgKLQl2aWEgRlRfR2V0X0dseXBoX05hbWUoKS4KLQotCShjZmZfZ2V0X2ludGVyZmFjZSk6IEFkZGVkIHN1cHBvcnQgZm9yIGdldHRpbmcgYSBnbHlwaCBuYW1lIHZpYSB0aGUKLQlgZ2x5cGhfbmFtZScgbW9kdWxlIGludGVyZmFjZS4gIFVzZXMgdGhlIG5ldyBmdW5jdGlvbgotCWdldF9jZmZfZ2x5cGhfbmFtZSgpLgotCVN1Ym1pdHRlZCBieSBTYW5kZXIgdmFuIGRlciBXYWwgPHN2ZHdhbEB4czRhbGwubmw+LgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoQ0ZGX0luaXRfRmFjZSk6IExvZ2ljYWwgb3IgdGhlIGZhY2UgZmxhZ3Mgd2l0aAotCUZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyBvbmx5IGlmIEZUX0NPTkZJR19PUFRJT05fTk9fR0xZUEhfTkFNRVMgaXMKLQlub3QgZGVmaW5lZC4gIFRoaXMgaXMgdG8gYWRkIHN1cHBvcnQgZm9yIGdldHRpbmcgYSBnbHlwaCBuYW1lIGZyb20gYQotCWdseXBoIGluZGV4IHZpYSBGVF9HZXRfR2x5cGhfTmFtZSgpLgotCVN1Ym1pdHRlZCBieSBTYW5kZXIgdmFuIGRlciBXYWwgPHN2ZHdhbEB4czRhbGwubmw+LgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKENGRl9QYXJzZV9DaGFyU3RyaW5ncyk6IEFkZGVkIHN1cHBvcnQgZm9yCi0JZGVwcmVjYXRlZCBvcGVyYXRvciBgZG90c2VjdGlvbicuCi0JU3VibWl0dGVkIGJ5IFNhbmRlciB2YW4gZGVyIFdhbCA8c3Zkd2FsQHhzNGFsbC5ubD4uCi0KLTIwMDEtMDMtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKFQxX0RlY29kZXJfUGFyc2VfQ2hhcnN0cmluZ3MpOiBGaXggZXJyb3IKLQltZXNzYWdlcy4KLQotCSogSU5TVEFMTCwgZG9jcy9CVUlMRDogV2UgbmVlZCBHTlUgbWFrZSAzLjc4LjEgb3IgbmV3ZXIuCi0KLTIwMDEtMDMtMTIgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaDogIENoYW5nZWQgdGhlIGxlbklWIG1lbWJlciBvZgotCXRoZSBUMV9EZWNvZGVyXyBzdHJ1Y3QgdG8gYmUgYW4gRlRfSW50IGluc3RlYWQgb2YgYW4gRlRfVUludC4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKFQxX0RlY29kZXJfUGFyc2VfQ2hhcnN0cmluZ3MpOiAgQWRqdXN0Ci0JZm9yIGxlbklWIHNlZWQgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIGEgZGVjcnlwdGVkIHN1YnJvdXRpbmUuCi0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfcmVhZF9zdWJycyk6IERlY3J5cHQgc3Vicm91dGluZXMgb25seQotCWlmIGxlbklWID49IDAuCi0KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX2xvYWRfZ2x5cGgpOiBEZWNyeXB0IGNoYXJzdHJpbmdzIG9ubHkKLQlpZiBsZW5JViA+PSAwLgotCi0yMDAxLTAzLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFRPRE86IFVwZGF0ZWQuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jOiBQdXQgUkVBRF9GaWVsZHMoKSBhbHdheXMgaW4gYSBjb25kaXRpb25hbCB0bwotCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0yMDAxLTAzLTEwICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBUT0RPOiBOZXcgZmlsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiBBZGRlZCBwcm90b3R5cGVzIGFuZCBub3RlcyBmb3IKLQl0aHJlZSBuZXcgZnVuY3Rpb25zOiBGVF9Sb3VuZEZpeCwgRlRfQ2VpbEZpeCwgYW5kIEZUX0Zsb29yRml4LgotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX1JvdW5kRml4LCBGVF9DZWlsRml4LCBGVF9GbG9vckZpeCk6IEFkZGVkCi0JaW1wbGVtZW50YXRpb24gY29kZS4KLQotCSogc3JjL2NpZC9jaWRvYmpzLmMgKENJRF9Jbml0X0ZhY2UpOiBVc2UgY2FsY3VsYXRlZCB1bml0c19wZXJfRU0sCi0JYW5kIGlmIHRoYXQgaXMgbm90IGF2YWlsYWJsZSwgZGVmYXVsdCB0byAxMDAwIHVuaXRzIHBlciBFTS4gIENoYW5nZWQKLQlhc3NpZ25tZW50IGNvZGUgZm9yIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgdmFsdWVzLgotCSogc3JjL2NpZC9jaWRsb2FkLmMgKHBhcnNlX2ZvbnRfbWF0cml4KTogQWRkZWQgdW5pdHNfcGVyX0VNCi0JcHJvY2Vzc2luZy4KLQkocGFyc2VfZm9udF9iYm94KTogQ2hhbmdlZCB0byB1c2UgRlRfRml4ZWQgbnVtYmVyIGhhbmRsaW5nLgotCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX0luaXRfRmFjZSk6IENoYW5nZWQgdGhlIGFzc2lnbm1lbnQgY29kZQotCWZvciBhc2NlbmRlciwgZGVzY2VuZGVyLCBhbmQgbWF4X2FkdmFuY2Vfd2lkdGguCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2ZvbnRfYmJveCk6IENoYW5nZWQgdG8gdXNlIEZUX0ZpeGVkCi0JbnVtYmVyIGhhbmRsaW5nLgotCi0yMDAxLTAzLTEwICBIZW5yaWsgR3J1YmJzdHLDtm0gIDxncnViYmFAcm94ZW4uY29tPgotCi0JKiBzcmMvKi8qLmM6IEFkZGVkIG1hbnkgY2FzdHMgdG8gbWFrZSBjb2RlIG1vcmUgNjRiaXQtc2FmZS4KLQotMjAwMS0wMy0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBJTlNUQUxMLCBkb2NzL0JVSUxEOiBXZSBuZWVkIEdOVSBtYWtlIDMuNzggb3IgbmV3ZXIuCi0KLTIwMDEtMDMtMDcgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfSW5pdF9GYWNlKTogTWlub3IgY29ycmVjdGlvbjogV2UgbXVzdCB3YWl0Ci0JdW50aWwgcGFyc2VfZm9udF9iYm94IGlzIGNoYW5nZWQgYmVmb3JlIHdlIHVzZSBsb2dpY2FsIHNoaWZ0IHJpZ2h0cwotCWluIHRoZSBhc3NpZ25tZW50cyBvZiBgcm9vdC0+YXNjZW5kZXInLCBgcm9vdC0+ZGVzY2VuZGVyJywgYW5kCi0JYHJvb3QtPm1heF9hZHZhbmNlX3dpZHRoJy4KLQotCShUMV9Eb25lX0ZhY2UpOiBGcmVlIGBjaGFyX25hbWUnIHRhYmxlIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsuCi0JU3VibWl0dGVkIGJ5IFNhbmRlciB2YW4gZGVyIFdhbCA8c3Zkd2FsQHhzNGFsbC5ubD4uCi0KLTIwMDEtMDMtMDUgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoQ0ZGX0xvYWRfR2x5cGgpOiBTZXQgZ2x5cGggY29udHJvbCBkYXRhIHRvIHRoZQotCXRoZSBUeXBlIDIgZ2x5cGggY2hhcnN0cmluZyAodXNlZCBieSBjb252ZXJzaW9uIHByb2dyYW1zKS4KLQlTdWJtaXR0ZWQgYnkgSGEgU2hhbyA8aGFzaGFvQGNoaW5lc2UuY29tPi4KLQotMjAwMS0wMy0wNCAgQW50b2luZSBMZWNhICA8QW50b2luZS5MZWNhQHJlbmF1bHQuZnI+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaDogQ29ycmVjdCBhIHN0dXBpZCB0eXBvIHdoaWNoIHByZXZlbnRlZAotCWNvcnJlY3QgY29tcGlsYXRpb24gKFRUX01TX0xBTkdJRF9USUdSSUdOQV9FVEhJT1BJQSBhcHBlYXJlZCB0d2ljZSkuCi0KLTIwMDEtMDMtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FodHlwZXMuaCAoQUhfSGludGVyKTogQWRkIGVsZW1lbnRzCi0JYGRpc2FibGVfaG9yel9lZGdlcycsIGBkaXNhYmxlX3ZlcnRfZWRnZXMnLgotCSogc3JjL2F1dG9oaW50L2FoaGludC5jCShhaF9oaW50X2VkZ2VzXzMsIGFoX2hpbnRlcl9oaW50X2VkZ2VzKTogVXNlCi0JdGhlbSAoYW5kIHJlbW92ZSBzdGF0aWMgdmFyaWFibGVzIHdpdGggdGhlIHNhbWUgbmFtZXMpLgotCSogc3JjL3BjZi9wY2Z1dGlsLmMgKEJpdE9yZGVySW52ZXJ0KTogQWRkIGBjb25zdCcuCi0JKiBkb2NzL2dsbmFtZXMucHk6IFVwZGF0ZWQgdG8gbGF0ZXN0IHBzdGFibGVzLmggY2hhbmdlcy4KLQotCSogYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rOiBBZGQgdGVzdCBmb3IgSHVyZC4KLQkqIGJ1aWxkcy9odXJkL2RldGVjdC5tazogUmVtb3ZlZC4KLQotMjAwMS0wMy0wNCAgU2FuZGVyIHZhbiBkZXIgV2FsICA8c3Zkd2FsQHhzNGFsbC5ubD4KLQotCSogc3JjL3BzbmFtZXMvcHN0YWJsZXMuaDogQWRkIG1vcmUgYGNvbnN0Jy4KLQkqIHNyYy9wY2YvcGNmdXRpbC5jOiBEaXR0by4KLQotMjAwMS0wMy0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX1RvX0JpdG1hcCk6IEZpeGluZyB0eXBvCi0JKEZUX0dseXBoX0RvbmUgLT4gRlRfRG9uZV9HbHlwaCkuCi0KLTIwMDEtMDMtMDEgIEFudG9pbmUgTGVjYSAgPEFudG9pbmUuTGVjYUByZW5hdWx0LmZyPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmg6IEFkZGVkIHNvbWUgbmV3IE1pY3Jvc29mdCBsYW5ndWFnZQotCWNvZGVzIGFuZCBMQ0lEcyBhcyBmb3VuZCBpbiBPZmZpY2UgWHAuCi0KLTIwMDEtMDItMjggIERhdmlkIFR1cm5lciAgPGRhdmlkLnR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQkqIGJ1aWxkcy9odXJkL2RldGVjdC5tazogTmV3IGZpbGUuICBBZGRlZCBzdXBwb3J0IHRvIGRldGVjdCB0aGUgR05VCi0JSHVyZCBvcGVyYXRpbmcgc3lzdGVtIGFzIFVuaXgtbGlrZS4gIEZpeCBzdWJtaXR0ZWQgYnkgQW50aG9ueSBGb2sKLQk8Zm9rYUBkZWJpYW4ub3JnPi4KLQotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfTG9hZF9HbHlwaCk6IFNldCBnbHlwaCBjb250cm9sIGRhdGEgdG8gdGhlCi0JdGhlIFR5cGUgMSBnbHlwaCBjaGFyc3RyaW5nICh1c2VkIGJ5IGNvbnZlcnNpb24gcHJvZ3JhbXMpLgotCVN1Ym1pdHRlZCBieSBIYSBTaGFvIDxoYXNoYW9AY2hpbmVzZS5jb20+LgotCi0yMDAxLTAyLTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZC50dXJuZXJAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGdyYXlzLmMgKGdyYXlzX3N3ZWVwKTogVGhlIGZ1bmN0aW9uIGRpZG4ndCBleGl0Ci0JaW1tZWRpYXRlbHkgaWYgYG51bV9jZWxscycgd2FzIDAgYXMgaXQgc2hvdWxkLiAgVGhhbmtzIHRvIEJvcmlzIGZvcgotCWZpbmRpbmcgdGhpcyBvdXQuCi0KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyAoRlRfR2x5cGhfVG9fQml0bWFwKTogRml4ZWQgbWVtb3J5IGxlYWsgd2hlbgotCWJpdG1hcCByZW5kZXJpbmcgZmFpbHMgKHRoYW5rcyB0byBHcmFoYW0gQXNoZXIpLgotCi0yMDAxLTAyLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvZG9jbWFrZXIucHkgKERvY1NlY3Rpb246OmFkZF9lbGVtZW50KTogVXNlCi0JYHNlbGYucHJpbnRfZXJyb3IoKScuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZy57Z3Vlc3Msc3VifTogVXBkYXRlZCAoZnJvbSBmdHAuZ251Lm9yZykuCi0KLTIwMDEtMDItMTMgIERhdmlkIFR1cm5lciAgPGRhdmlkLnR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvZG9jbWFrZXIucHksIGluY2x1ZGUvZnJlZXR5cGUvKi5oOiBVcGRhdGVkIHRoZSBEb2NNYWtlcgotCXNjcmlwdCB0byBzdXBwb3J0IGNoYXB0ZXJzIGFuZCBzZWN0aW9uIGJsb2NrIG9yZGVyaW5nLiAgVXBkYXRlZCB0aGUKLQlwdWJsaWMgaGVhZGVyIGZpbGVzIGFjY29yZGluZ2x5LgotCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX0NvcHkpOiBBZHZhbmNlIHdpZHRoIGFuZCBnbHlwaCBmb3JtYXQKLQl3ZXJlIG5vdCBjb3JyZWN0bHkgY29waWVkLgotCi0yMDAxLTAyLTA4ICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9mb250X21hdHJpeCk6IFJlbW92ZWQgYW4KLQl1bm5lY2Vzc2FyeSBmcHJpbnRmKCBzdGRlcnIsIC4uLiApLgotCi0yMDAxLTAyLTA3ICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX0luaXRfRmFjZSk6IEFkZGVkIGNvZGUgdG8gZ2V0IHRoZQotCXVuaXRzX3Blcl9FTSBmcm9tIHRoZSB2YWx1ZSBhc3NpZ25lZCBpbiBwYXJzZV9mb250X21hdHJpeCwgaWYKLQlhdmFpbGFibGUuICBEZWZhdWx0IHRvIDEwMDAgaWYgbm90IGF2YWlsYWJsZS4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfZm9udF9tYXRyaXgpOiBBZGRlZCBsb2dpYyB0byBnZXQKLQl0aGUgdW5pdHNfcGVyX0VNIGZyb20gdGhlIEZvbnRNYXRyaXguCi0KLQkoY2ZmX3BhcnNlX2ZpeGVkX3Rob3VzYW5kKTogTmV3IGZ1bmN0aW9uLiAgR2V0cyBhIHJlYWwgbnVtYmVyIGZyb20KLQl0aGUgQ0ZGIGZvbnQsIGJ1dCBtdWx0aXBsaWVzIGJ5IDEwMDAgKHRoaXMgaXMgdG8gYXZvaWQgcm91bmRpbmcKLQllcnJvcnMgd2hlbiBwbGFjaW5nIHRoaXMgcmVhbCBudW1iZXIgaW50byBhIDE2LjE2IGZpeGVkIG51bWJlcikuCi0KLQkoY2ZmX3BhcnNlX3JlYWwpOiBBZGRlZCBjb2RlIHNvIHRoYXQgdGhlIGludGVnZXIgcGFydCBpcyBtb3ZlZAotCWludG8gdGhlIGhpZ2ggc2l4dGVlbiBiaXRzIG9mIHRoZSAxNi4xNiBmaXhlZCBudW1iZXIuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChDRkZfSW5pdF9GYWNlKTogQWRkZWQgbG9naWMgdG8gZ2V0IHRoZSB1bml0cwotCXBlciBFTSBmcm9tIHRoZSBDRkYgZGljdGlvbmFyeSwgaWYgYXZhaWxhYmxlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmg6IEluIHN0cnVjdCBDRkZfRm9udF9EaWN0XywKLQlhZGRlZCBhIHVuaXRzX3Blcl9lbSBtZW1iZXIgdG8gZmFjaWxpdGF0ZSBwYXNzaW5nIG9mIHVuaXRzX3Blcl9lbQotCWZyb20gZnVuY3Rpb24gY2ZmX3BhcnNlX2ZvbnRfbWF0cml4LgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKGlzX2FscGhhKTogTWFrZSBgLScgYSBsZWdhbCBhbHBoYW51bWVyaWMKLQljaGFyYWN0ZXIuICBUaGlzIGlzIHNvIHRoYXQgZm9udCBuYW1lcyB3aXRoIGAtJyBhcmUgZnVsbHkgcGFyc2VkLAotCWV0Yy4uLgotCi0yMDAxLTAyLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAoc2hpZnRfZWxlbWVudHMpOiBSZW1vdmUgaWYgY2xhdXNlICh3aGljaCBpcwotCW9ic29sZXRlIG5vdykuCi0KLQkocmVhbGxvY2F0ZV90MV90YWJsZSwgUFNfVGFibGVfRG9uZSk6IFJlcGxhY2UgUkVBTExPQygpIHdpdGggQUxMT0MoKQotCSsgTUVNX0NvcHkoKSB0byBhdm9pZCBhIG1lbW9yeSBidWcuCi0KLTIwMDEtMDItMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkLnR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvZG9jbWFrZXIucHk6IEltcHJvdmVkIHRoZSBpbmRleCBzb3J0aW5nIHJvdXRpbmUgdG8gcGxhY2UKLQljYXBpdGFsIGxldHRlcnMgYmVmb3JlIHNtYWxsIG9uZXMuICBBZGRlZCB0aGUgYDxvcmRlcj4nIG1hcmtlciB0bwotCXNlY3Rpb24gYmxvY2tzIGluIG9yZGVyIHRvIGdpdmUgdGhlIG9yZGVyIG9mIGJsb2Nrcy4KLQotMjAwMS0wMS0zMCAgQW50b2luZSBMZWNhICA8QW50b2luZS5MZWNhQHJlbmF1bHQuZnI+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaDogTGF0ZXN0IHVwZGF0ZXMgdG8gTWljcm9zb2Z0IGxhbmd1YWdlCi0JSUQgY29kZXMuCi0KLTIwMDEtMDEtMjQgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jZmYvdDFsb2FkLmMgKHBhcnNlX2ZvbnRfbWF0cml4KTogQWRkZWQgaGV1cmlzdGljIHRvIGdldAotCXVuaXRzX3Blcl9FTSBmcm9tIHRoZSBmb250IG1hdHJpeC4KLQotCShwYXJzZV9kaWN0KTogRGVsZXRlZCB0ZXN0IHRvIHNlZSB3aGV0aGVyIHRoZSBGb250SW5mbyBrZXl3b3JkIGhhcwotCWJlZW4gc2Vlbi4gIERlbGV0aW9uIG9mIHRoaXMgdGVzdCBhbGxvd3MgZm9udHMgd2l0aG91dCBGb250SW5mbwotCWRpY3Rpb25hcmllcyB0byBiZSBwYXJzZWQgYnkgdGhlIFR5cGUgMSBkcml2ZXIuCi0KLQkoVDFfT3Blbl9GYWNlKTogRGVsZXRlZCBlbXB0eSBzdWJyb3V0aW5lcyBhcnJheSB0ZXN0IHRvIG1ha2Ugc3VyZQotCWZvbnRzIHdpdGggbm8gc3Vicm91dGluZXMgc3RpbGwgYXJlIHBhcnNlZC4KLQotMjAwMS0wMS0xNyAgRnJhbmNlc2NvIFphcHBhIE5hcmRlbGxpICA8ZnJhbmNlc2NvLnphcHBhLm5hcmRlbGxpQGVucy5mcj4KLQotCSogc3JjL3BjZnJlYWQuYyAocGNmX2dldF9wcm9wZXJ0aWVzLCBwY2ZfZ2V0X21ldHJpY3MsCi0JcGNmX2dldF9iaXRtYXBzKTogRml4IGNvbXBpbGVyIGVycm9ycy4KLQotMjAwMS0wMS0xMSAgRGF2aWQgVHVybmVyICA8ZGF2aWQudHVybmVyQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmM6IFJlbW92ZWQgc29tZSBjb21waWxhdGlvbiB3YXJuaW5ncyByZWxhdGVkCi0JdG8gY29tcGFyaXNvbiBvZiBzaWduZWQgdnMuIHVuc2lnbmVkIGludGVnZXJzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaDogQ2hhbmdlZCB0aGUgZGVidWcgdHJhY2UKLQljb25zdGFudHMgZnJvbSB0cmFjZV90Mnh4eHggdG8gdHJhY2VfY2ZmeHh4eCB0byBiZSBhYmxlIHRvIGNvbXBpbGUKLQl0aGUgQ0ZGIGRyaXZlciBpbiBkZWJ1ZyBtb2RlLgotCi0yMDAxLTAxLTExICBNYXR0aGV3IENyb3NieSAgPG1jcm9zYnlAbWFydGhvbi5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbjogRml4IHByb2JsZW1zIHdpdGggc2VwYXJhdGUKLQktLXByZWZpeCBhbmQgLS1leGVjLXByZWZpeC4KLQotMjAwMS0wMS0xMSAgRGF2aWQgVHVybmVyICA8ZGF2aWQudHVybmVyQGZyZWV0eXBlLm9yZz4KLQotCSogZG9jcy9kb2NtYWtlci5weTogQWRkZWQgY3Jvc3MtcmVmZXJlbmNlcyBnZW5lcmF0aW9uIGFzIHdlbGwgYXMKLQltb3JlIHJvYnVzdCBoYW5kbGluZyBvZiBwYXRobmFtZSB3aWxkY2FyZCBtYXRjaGluZy4KLQotMjAwMS0wMS0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL2RvY21ha2VyLnB5OiBNaW5vciBpbXByb3ZlbWVudHMgdG8gcmVkdWNlIHVud2FudGVkIHNwYWNlcwotCWFuZCBlbXB0eSBsaW5lcyBpbiBvdXRwdXQuCi0KLTIwMDEtMDEtMDkgIERhdmlkIFR1cm5lciAgPGRhdmlkLnR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvZG9jbWFrZXIucHk6IEltcHJvdmVkIHNjcmlwdCB0byBnZW5lcmF0ZSB0YWJsZSBvZiBjb250ZW50cwotCWFuZCBpbmRleCBwYWdlcy4gIEl0IGFsc28gc3VwcG9ydHMgd2lsZGNhcmRzIG9uIG5vbiBVbml4IHN5c3RlbXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvKi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlLyouaDogVXBkYXRlZCBjb21tZW50cwotCXRvIGluY2x1ZGUgc2VjdGlvbiBkZWZpbml0aW9ucy9kZWxpbWl0YXRpb25zIGZvciB0aGUgQVBJIFJlZmVyZW5jZQotCWdlbmVyYXRvci4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiBNb3ZlZCBkZWNsYXJhdGlvbiBvZgotCWBGVF9HZW5lcmljX0ZpbmFsaXplcicgYW5kIHRoZSBgRlRfR2VuZXJpYycgc3RydWN0dXJlIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaDogaGVyZS4KLQotMjAwMS0wMS0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmg6IFVwZGF0ZWQgVW5pY29kZSBjb2RlIHJhbmdlIGNvbW1lbnRzLgotCi0yMDAxLTAxLTAzICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2ZmL3J1bGVzLm1rOiBVc2UgY2ZmZ2xvYWQue2MsaH0gaW5zdGVhZCBvZiB0Mmdsb2FkLntjLGh9LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmg6IENoYW5nZWQgdG8gdXNlIGNmZnR5cGVzLmgKLQkoY2ZmZXJycy5oKSBpbnN0ZWFkIG9mIHQydHlwZXMuaCAodDJlcnJvcnMuaCwgcmVzcGVjdGl2ZWx5KS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oOiBNZXJnZWQgaW4gY2hhbmdlcyBmcm9tCi0JdDJ0eXBlcy5oIGFuZCBtYWRlIHRoaXMgdGhlIGNhbm9uaWNhbCBgdHlwZXMnIGhlYWRlciBmb3IgdGhlIENGRgotCWRyaXZlci4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MnR5cGVzLmg6IFRoaXMgZmlsZSB3YXMgbWVyZ2VkIHdpdGgKLQljZmZ0eXBlcy5oIGFuZCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QyZXJyb3JzLmg6CVJlbmFtZWQgdG8gY2ZmZXJycy5oLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYywgc3JjL2NmZi9jZmZvYmpzLmgsIHNyYy9jZmYvY2ZmcGFyc2UuYywKLQlzcmMvY2ZmL2NmZmRyaXZyLmMsIHNyYy9jZmYvY2ZmLmMsIHNyYy9jZmYvY2ZmbG9hZC5jLAotCXNyYy9jZmYvY2ZmZ2xvYWQuYywgc3JjL2NmZi9jZmZnbG9hZC5oOiBDaGFuZ2VkIHRvIHVzZQotCWNmZmdsb2FkLntjLGh9IGluc3RlYWQgb2YgdDJnbG9hZC57YyxofS4gIEFsbCBvY2N1cnJlbmNlcyBvZiB0Ml8KLQkoVDJfKSB3ZXJlIHJlcGxhY2VkIHdpdGggY2ZmXyAoQ0ZGXywgcmVzcGVjdGl2ZWx5KS4KLQotCSogc3JjL2NmZi90Mmdsb2FkLmg6IFJlbmFtZWQgY2ZmZ2xvYWQuaC4KLQotCSogc3JjL2NmZi90Mmdsb2FkLmM6IFJlbmFtZWQgY2ZmZ2xvYWQuYwotCi0yMDAwLTAxLTAyICBKb3VrIEphbnNlbiAgPGpvdWtqQGhyZW0uc3RtLnR1ZGVsZnQubmw+Ci0KLQkqIGJ1aWxkcy92bXM6IFN1cHBvcnQgZmlsZXMgZm9yIFZNUyBhcmNoaXRlY3R1cmUgYWRkZWQuCi0JKiBkZXNjcmlwLm1tcywgc3JjLyovZGVzY3JpcC5tbXM6IFZNUyBtYWtlZmlsZXMgYWRkZWQuCi0JKiBSRUFETUUuVk1TOiBOZXcgZmlsZS4KLQotMjAwMC0wMS0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBMSUNFTlNFLlRYVDogQWRkZWQgaW5mbyBhYm91dCBQQ0YgZHJpdmVyIGxpY2Vuc2UuCi0KLTIwMDEtMDEtMDEgIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaSAgPGZyYW5jZXNjby56YXBwYS5uYXJkZWxsaUBlbnMuZnI+Ci0KLQkqIHNyYy9wY2YvKjogTmV3IGRyaXZlciBtb2R1bGUgZm9yIFBDRiBmb250IGZvcm1hdCAodXNlZCBpbgotCVggV2luZG93IFN5c3RlbSkuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaCAoRlRfVHJhY2UpOiBBZGRlZCB2YWx1ZXMgZm9yCi0JUENGIGRyaXZlci4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcGNmdHlwZXMuaDogTmV3IGZpbGUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBBZGRlZCBQQ0YgZHJpdmVyIG1vZHVsZS4KLQotMjAwMS0wMS0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9HZXRfQ2hhcl9JbmRleCk6IEZpeCBwYXJhbWV0ZXIgdHlwZS4KLQotMjAwMC0xMi0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvbW9kdWxlcy5tayAoY2xlYW5fbW9kdWxlX2xpc3QpOiBGaXhlZCBkZWxldGlvbiBvZiBtb2R1bGUKLQlmaWxlIGluIGNhc2UgYG1ha2UgbWFrZV9tb2R1bGVfbGlzdCcgaXMgY2FsbGVkIGJlZm9yZSBgbWFrZSBzZXR1cCcuCi0KLTIwMDAtMTItMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKENGRl9Mb2FkX0NoYXJzZXQpOiBJbXByb3ZlZCBlcnJvciBtZXNzYWdlcy4KLQkoQ0ZGX0xvYWRfQ2hhcnNldCwgQ0ZGX0xvYWRfRW5jb2RpbmcpOiBSZW1vdmUgdW5uZWNlc3NhcnkgdmFyaWFibGUKLQlkZWZpbml0aW9uLgotCi0yMDAwLTEyLTMwICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QydHlwZXMuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmg6IENoYW5nZWQgdGhlIHN0cnVjdHVyZXMgZm9yCi0JQ0ZGX0NoYXJzZXQgYW5kIENGRl9FbmNvZGluZyBmb3IgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi0JY2hhcnNldCBhbmQgZW5jb2RpbmcgcGFyc2VycyBpbiB0aGUgQ0ZGIGRyaXZlci4KLQotCSogc3JjL2NmZi90Mmdsb2FkLmMgKHQyX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSwKLQl0Ml9vcGVyYXRvcl9zZWFjKTogQWRkZWQgdGhlc2UgZnVuY3Rpb25zIGZvciB1c2UgaW4gaW1wbGVtZW50aW5nIHRoZQotCXNlYWMgZW11bGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBUeXBlIDIgZW5kY2hhciBvcGVyYXRvci4KLQkoVDJfUGFyc2VfQ2hhclN0cmluZ3MpOiBBZGRlZCBzZWFjIGVtdWxhdGlvbiBmb3IgdGhlIGVuZGNoYXIKLQlvcGVyYXRvci4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKENGRl9Mb2FkX0VuY29kaW5nLCBDRkZfTG9hZF9DaGFyc2V0LAotCUNGRl9Eb25lX0VuY29kaW5nLCBDRkZfRG9uZV9DaGFyc2V0KTogRXh0ZW5kZWQgdG8gbG9hZCBhbmQgcGFyc2UgdGhlCi0JY2hhcnNldC9lbmNvZGluZyB0YWJsZXMsIGFuZCBmcmVlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGVtIHdoZW4gdGhlCi0JQ0ZGIGRyaXZlciBpcyBmaW5pc2hlZCB3aXRoIHRoZW0uICBBZGRlZCB0YWJsZXMKLQotCSAgICBjZmZfaXNvYWRvYmVfY2hhcnNldAotCSAgICBjZmZfZXhwZXJ0X2NoYXJzZXQKLQkgICAgY2ZmX2V4cGVydHN1YnNldF9jaGFyc2V0Ci0JICAgIGNmZl9zdGFuZGFyZF9lbmNvZGluZwotCSAgICBjZmZfZXhwZXJ0X2VuY29kaW5nCi0KLQlzbyB0aGF0IHRoZSBlbmNvZGluZy9jaGFyc2V0IHBhcnNlciBjYW4gaGFuZGxlIHByZWRlZmluZWQgZW5jb2RpbmdzIGFuZAotCWNoYXJzZXRzLgotCi0yMDAwLTEyLTI0ICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2ZmL3QyZ2xvYWQuYyAoVDJfTG9hZF9HbHlwaCk6IEFkZGVkIGNvZGUJc28gdGhhdCB0aGUgZm9udAotCXRyYW5zZm9ybSBpcyBhcHBsaWVkLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9mb250X21hdHJpeCk6IEFkZGVkIGNvZGUgc28gdGhhdAotCXRoZSBmb250IG1hdHJpeCBudW1iZXJzCWFyZSBzY2FsZWQgYnkgMS8obWF0cml4LT55eSkuICBBbHNvLCB0aGUKLQlvZmZzZXQgdmVjdG9yIG5vdyBjb250YWlucyBpbnRlZ2VyIHZhbHVlcyBpbnN0ZWFkIG9mIDE2LjE2IGZpeGVkCi0JbnVtYmVycy4KLQotMjAwMC0xMi0yMiAgVG9tIEthY3ZpbnNreSAgPHRrYWN2aW5zQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfbG9hZF9nbHlwaCk6Ci0JUmVtb3ZlZCB1bm5lY2Vzc2FyeSBjb21tZW50cyBhbmQgY29tbWVudGVkLW91dCBjb2RlLgotCi0yMDAwLTEyLTIxICBEYXZpZCBUdXJuZXIgIDxkYXZpZC50dXJuZXJAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2lkL2NpZGFmbS5jLCBzcmMvY2lkL2NpZGFmbS5oOiByZW1vdmVkIHVuLW5lZWRlZCBmaWxlcywKLQl3ZSdsbCB3b3JrIG9uIHN1cHBvcnRpbmcgQ0lEIEFGTSBmaWxlcyBsYXRlciBJIGd1ZXNzIDotKQotCi0yMDAwLTEyLTIxICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRlcl9sb2FkLCBhaF9oaW50ZXJfbG9hZF9nbHlwaCk6Ci0JQ2hhbmdlZCBzbyB0aGF0IGZvbnRzIHdpdGggYSBub24tc3RhbmRhcmQgRm9udE1hdHJpeCByZW5kZXIKLQljb3JyZWN0bHkuICBQcmV2aW91c2x5LCB0aGUgZmlyc3QgZ2x5cGggcmVuZGVyZWQgZnJvbSBzdWNoIGEKLQlmb250IGRpZCBub3QgaGF2ZSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGFwcGxpZWQuCi0KLTIwMDAtMTItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogKi5tazogQWRkZWQgbG90cyBvZiBgLlBIT05ZJyB0YXJnZXRzLgotCi0yMDAwLTEyLTE3ICBLYXJzdGVuIEZsZWlzY2hlciAgPGtmbGVpc2MxQGZvcmQuY29tPgotCi0JKiAqLm1rOiBJbXBsZW1lbnRlZCBgcGxhdGZvcm0nIHRhcmdldCB0byBkaXNhYmxlIGF1dG8tZGV0ZWN0aW9uLgotCi0yMDAwLTEyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvZGVzaWduL21vZHVsZXMuaHRtbDogUmVtb3ZlZC4gIENvdmVyZWQgYnkgZGVzaWduLSouaHRtbC4KLQotCSogSU5TVEFMTDogQWRkZWQgaW5mbyBhYm91dCBtYWtlcHAuCi0KLTIwMDAtMTItMTQgIERhdmlkIFR1cm5lciAgPGRhdmlkLnR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQlBZGRlZCBzdXBwb3J0IGZvciBjbGlwcGVkIGRpcmVjdCByZW5kZXJpbmcgaW4gdGhlIHNtb290aCByZW5kZXJlci4KLQlUaGlzIHNob3VsZCBub3QgYnJlYWsgYmluYXJ5IGNvbXBhdGliaWxpdHkgb2YgZXhpc3RpbmcgYXBwbGljYXRpb25zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCwgaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmg6IE1vdmUKLQlkZWZpbml0aW9uIG9mIHRoZSBGVF9CQm94IHN0cnVjdHVyZSBmcm9tIHRoZSBmb3JtZXIgdG8gdGhlIGxhdHRlci4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oOiBBZGQgYGZ0X3Jhc3Rlcl9mbGFnX2NsaXAnIHZhbHVlIHRvCi0JRlRfUmFzdGVyX0ZsYWcgZW51bWVyYXRpb24uCi0JQWRkIGBjbGlwX2JveCcgZWxlbWVudCB0byBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZS4KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5c19jb252ZXJ0X2dseXBoKTogSW1wbGVtZW50IGl0LgotCi0JKiBJTlNUQUxMOiBVcGRhdGVkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgb24gV2luMzIsIGxpc3RpbmcgdGhlCi0JbmV3IGBtYWtlIHNldHVwIGxpc3QnIHRhcmdldCB1c2VkIHRvIGxpc3Qgc3VwcG9ydGVkCi0JY29tcGlsZXJzL3RhcmdldHMuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoZnRfYmxhY2tfcmVuZGVyKTogVGVzdCBmb3IgdW5zdXBwb3J0ZWQKLQlkaXJlY3QgcmVuZGVyaW5nIGJlZm9yZSB0ZXN0aW5nIGFyZ3VtZW50cy4KLQotMjAwMC0xMi0xMyAgRGF2aWQgVHVybmVyICA8ZGF2aWQudHVybmVyQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnQyYnVpbGQuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmg6IEZpeGVkIGhlYWRlciBpbmNsdXNpb24gbWFjcm9zCi0JdG8gdXNlIGRpcmVjdCBkZWZpbml0aW9ucy4gIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGRvIHRoZXNlIHRoaW5ncwotCWluIGEgcG9ydGFibGUgd2F5IDotKCAgVGhlIHJlc3Qgb2YgdGhlIGNvZGUgc2hvdWxkIGZvbGxvdyBzaG9ydGx5Ci0JdGhvdWdoIGV2ZXJ5dGhpbmcgY29tcGlsZXMgbm93LgotCi0JKiBidWlsZHMvY29tcGlsZXIvaW50ZWxjLm1rLCBidWlsZHMvY29tcGlsZXIvd2F0Y29tLm1rOiBOZXcgZmlsZXMuCi0KLQkqIGJ1aWxkcy93aW4zMi9kZXRlY3QubWs6IEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCBDL0MrKwotCWNvbXBpbGVyLCBhcyB3ZWxsIGFzIF9wcmVsaW1pbmFyeV8gKHJlYWQ6IGRvZXNuJ3Qgd29yayEpIHN1cHBvcnQgZm9yCi0JV2F0Y29tLiAgQWxzbyBhZGRlZCBhIG5ldyBzZXR1cCB0YXJnZXQuICBUeXBlIGBtYWtlIHNldHVwIGxpc3QnIGZvcgotCWEgbGlzdCBvZiBzdXBwb3J0ZWQgY29tbWFuZC1saW5lIGNvbXBpbGVycyBvbiBXaW4zMi4KLQotCSogc3JjL2Jhc2UvZnRkZWJ1Zy5jOiBBZGRlZCBkdW1teSBzeW1ib2wgdG8gYXZvaWQgZW1wdHkgZmlsZSBpZgotCWNvbmRpdGlvbmFscyBhcmUgb2ZmLgotCi0yMDAwLTEyLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0c3lzdGVtLmM6IEZpeGVkIHR5cG9zLiAgRml4ZWQgaW5jbHVzaW9uIG9mIHdyb25nCi0JZnRjb25maWcuaCBmaWxlLgotCi0yMDAwLTEyLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0MmJ1aWxkLmggKEZUMl9ST09ULCBGVDJfQ09ORklHX1JPT1QpOgotCVJlbW92ZWQuICBBTlNJIEMgZG9lc24ndCAoZXhwbGljaXRseSkgYWxsb3cgbWFjcm8gZXhwYW5zaW9uIGluCi0JYXJndW1lbnRzIHVzaW5nIGAjIycuCi0JKEZUMl9QVUJMSUNfRklMRSwgRlQyX0NPTkZJR19GSUxFLCBGVDJfSU5URVJOQUxfRklMRSk6IFVzZSBkaXJlY3RvcnkKLQluYW1lcyBkaXJlY3RseS4gIE1ha2UgdGhlbSBjb25maWd1cmFibGUuICBVc2UgYCMjJyB0byBzdHJpcCBsZWFkaW5nCi0JYW5kIHRyYWlsaW5nIHNwYWNlcyBmcm9tIGFyZ3VtZW50cy4KLQotCSogYnVpbGRzL3VuaXgvZnQydW5peC5oOiBBZGFwdGVkLgotCi0JKiBzcmMvYmFzZS9mdHN5c3RlbS5jIChmdF9hbGxvYywgZnRfcmVhbGxvYywgZnRfZnJlZSwgZnRfaW9fc3RyZWFtLAotCWZ0X2Nsb3NlX3N0cmVhbSk6IFVzZSBGVF9DQUxMQkFDS19ERUYuCi0KLQkqIGJ1aWxkcy91bml4L2Z0c3lzdGVtLmM6IFVzZSBuZXcgaGVhZGVyIHNjaGVtZS4KLQkoRlRfRG9uZV9NZW1vcnkpOiBVc2UgZnJlZSgpIGZyb20gRlRfTWVtb3J5IHN0cnVjdHVyZS4KLQotCSogc3JjL2Jhc2UvZnRpbml0LmMsIHNyYy9iYXNlL2Z0bWFjLmM6IEhlYWRlciBzY2hlbWUgZml4ZXMuCi0KLTIwMDAtMTItMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnQyYnVpbGQuaCAoRlQyX0NPTkZJR19ST09ULAotCUZUMl9QVUJMSUNfRklMRSwgRlQyX0NPTkZJR19GSUxFLCBGVDJfSU5URVJOQUxfRklMRSwKLQlGVF9TT1VSQ0VfRklMRSk6IFVzZSBgIyMnIG9wZXJhdG9yIHRvIGJlIHJlYWxseSBBTlNJIEMgY29tcGxpYW50LgotCi0yMDAwLTEyLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2RldGVjdC5tazogUmVtb3ZlIHVudXNlZCBVU0VfQ0ZMQUdTIHZhcmlhYmxlLgotCi0yMDAwLTEyLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqICovKi5oOiBDaGFuZ2VkIGJvZHkgaW5jbHVzaW9uIG1hY3JvIG5hbWVzIHRvIHN0YXJ0IGFuZCBlbmQgd2l0aAotCWBfXycgKHRob3NlIHdoaWNoIGhhdmVuJ3QgY29udmVydGVkIHlldCkuICBGaXhlZCBtaW5vciBjb252ZXJzaW9uCi0JaXNzdWVzLgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmM6IFVwZGF0ZWQgdG8gbmV3IGhlYWRlciBpbmNsdXNpb24gc2NoZW1lLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYzogUmVtb3ZlIHVudXNlZCBDQUxDX0xlbmd0aCgpIG1hY3JvLgotCi0yMDAwLTEyLTA3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZC50dXJuZXJAZnJlZXR5cGUub3JnPgotCi0JKiAqLyouW2NoXTogQ2hhbmdlZCBzb3VyY2UgZmlsZXMgdG8gYWRoZXJlIHRvIHRoZSBuZXcKLQloZWFkZXIgaW5jbHVzaW9uIHNjaGVtZS4gIE5vdCBjb21wbGV0ZWx5IHRlc3RlZCBidXQgd29ya3MgZm9yIG5vdwotCWhlcmUuCi0KLQkqIHNyYy9jZmYvdDJkcml2ZXIuYzogUmVuYW1lZCBhbmQgdXBkYXRlZCB0by4uLgotCSogc3JjL2NmZi9jZmZkcml2ci5jOiBOZXcgZmlsZS4KLQkqIHNyYy9jZmYvdDJkcml2ZXIuaDogUmVuYW1lZCBhbmQgdXBkYXRlZCB0by4uLgotCSogc3JjL2NmZi9jZmZkcml2ci5oOiBOZXcgZmlsZS4KLQkqIHNyYy9jZmYvdDJsb2FkLmM6IFJlbmFtZWQgYW5kIHVwZGF0ZWQgdG8uLi4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jOiBOZXcgZmlsZS4KLQkqIHNyYy9jZmYvdDJsb2FkLmg6IFJlbmFtZWQgYW5kIHVwZGF0ZWQgdG8uLi4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5oOiBOZXcgZmlsZS4KLQkqIHNyYy9jZmYvdDJvYmpzLmM6IFJlbmFtZWQgYW5kIHVwZGF0ZWQgdG8uLi4KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jOiBOZXcgZmlsZS4KLQkqIHNyYy9jZmYvdDJvYmpzLmg6IFJlbmFtZWQgYW5kIHVwZGF0ZWQgdG8uLi4KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5oOiBOZXcgZmlsZS4KLQkqIHNyYy9jZmYvdDJwYXJzZS5jOiBSZW5hbWVkIGFuZCB1cGRhdGVkIHRvLi4uCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmM6IE5ldyBmaWxlLgotCSogc3JjL2NmZi90MnBhcnNlLmg6IFJlbmFtZWQgYW5kIHVwZGF0ZWQgdG8uLi4KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuaDogTmV3IGZpbGUuCi0JKiBzcmMvY2ZmL3QydG9rZW5zLmg6IFJlbmFtZWQgYW5kIHVwZGF0ZWQgdG8uLi4KLQkqIHNyYy9jZmYvY2ZmdG9rZW4uaDogTmV3IGZpbGUuCi0KLQkqIHNyYy9jZmYvY2ZmLmMsIHNyYy9jZmYvcnVsZXMubWs6IFVwZGF0ZWQuCi0KLTIwMDAtMTItMDYgIERhdmlkIFR1cm5lciAgPGRhdmlkLnR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jYWNoZS9mdGxydS5jIChGVF9McnVfRG9uZSk6IEZpeGVkIG1lbW9yeSBsZWFrLgotCi0yMDAwLTEyLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9tb2R1bGUubWs6IFJlcGxhY2VkIGB4eHggIycgd2l0aCBgeHh4JChzcGFjZSkuCi0JKiBidWlsZHMvb3MyL2RldGVjdC5taywgYnVpbGRzL3dpbjMyL2RldGVjdC5tazogTW92ZWQgY29tbWVudCB0bwotCWF2b2lkIHRyYWlsaW5nIHNwYWNlcyBpbiB2YXJpYWJsZS4KLQkqIGJ1aWxkcy9mcmVldHlwZS5tazogVXNlICQoRCkgaW5zdGVhZCBvZiAkRCB0byBtYWtlIHN0YXRlbWVudCBtb3JlCi0JcmVhZGFibGUuCi0KLQkqIGRvY3MvZG9jbWFrZXIucHk6IEZvcm1hdHRpbmcuCi0KLTIwMDAtMTItMDUgIERhdmlkIFR1cm5lciAgPGRhdmlkLnR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9wc2F1eC9wc2F1eG1vZC5jOiBGaXhlZCBhIGJyb2tlbiBpbmNsdXNpb24gb2YgY29tcG9uZW50Ci0JaGVhZGVyIGZpbGVzIChhbiBGVF9GTEFUX0NPTVBJTEUgdGVzdCB3YXMgbWlzc2luZykuCi0KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChGVENfTWFuYWdlcl9Eb25lKTogRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQKLQlhbiBvY2Nhc2lvbmFsIGNyYXNoIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQgKGR1ZSB0byBhIGRhbmdsaW5nCi0JcG9pbnRlcikuCi0KLQkqIHNyYy9iYXNlL2Z0c3lzdGVtLmMgKEZUX0RvbmVfTWVtb3J5KTogRml4ZWQgYW4gb2J2aW91cyBidWc6Ci0JVGhlIEFOU0kgYGZyZWUoKScgZnVuY3Rpb24gd2FzIGNhbGxlZCBpbnN0ZWFkIG9mIGBtZW1vcnktPmZyZWUoKScuCi0KLQkqIGRvY3MvZG9jbWFrZXIucHk6IEFkZGVkIHNlY3Rpb24gZmlsdGVyaW5nLCBtdWx0aS1wYWdlIGdlbmVyYXRpb24KLQkoaW5kZXggcGFnZSBnZW5lcmF0aW9uIGlzIHN0aWxsIG1pc3NpbmcgdGhvdWdoKS4KLQotMjAwMC0xMi0wNCAgRGF2aWQgVHVybmVyICA8ZGF2aWQudHVybmVyQGZyZWV0eXBlLm9yZz4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5taywgYnVpbGRzL3VuaXgvZnQydW5peC5oOiBUaGUgZmlsZSBgZnQydW5peC5oJwotCWlzIG5vdyBpbnN0YWxsZWQgYXMgPGZ0MmJ1aWxkLmg+IGZvciBVbml4IHN5c3RlbXMuICBOb3RlIHRoYXQgd2UKLQlzdGlsbCB1c2UgdGhlIGBmcmVldHlwZTIvZnJlZXR5cGUnIGluc3RhbGxhdGlvbiBwYXRoIGZvciBub3cuCi0KLQkqICovKi5bY2hdOiBOb3cgdXNpbmcgPGZ0MmJ1aWxkLmg+IGFzIHRoZSBkZWZhdWx0IGJ1aWxkIGFuZCBzZXR1cAotCWNvbmZpZ3VyYXRpb24gZmlsZSBpbiBhbGwgcHVibGljIGhlYWRlcnMuICBJbnRlcm5hbCBzb3VyY2UgZmlsZXMKLQlzdGlsbCBuZWVkIHNvbWUgY2hhbmdlcyB0aG91Z2guCi0KLQkqIGJ1aWxkcy9kZXZlbC9mdDJidWlsZC5oLCBidWlsZHMvZGV2ZWwvZnRvcHRpb24uaDogQ3JlYXRlZCBhIG5ldwotCWRpcmVjdG9yeSB0byBob2xkIGFsbCBkZXZlbG9wbWVudCBvcHRpb25zIGZvciBib3RoIHRoZSBVbml4IGFuZAotCVdpbjMyIGRldmVsb3BlciBidWlsZHMuCi0KLQkqIGJ1aWxkcy93aW4zMi9kZXRlY3QubWssIGJ1aWxkcy93aW4zMi93MzItYmNjZC5taywKLQlidWlsZHMvd2luMzIvdzMyLWRldi5tazogQ2hhbmdlZCB0aGUgZGV2ZWxvcGVyIGJ1aWxkIHRhcmdldHMgdG8KLQlgZGV2ZWwtZ2NjJyBhbmQgYGRldmVsLWJjYycgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBkZXZlbG9wIHdpdGggdGhlCi0JQm9ybGFuZCBDKysgY29tcGlsZXIuCi0KLTIwMDAtMTItMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkLnR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQotCSogVmVyc2lvbiAyLjAuMSByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmluLCBidWlsZHMvdW5peC9jb25maWd1cmUsCi0JYnVpbGRzL2N5Z3dpbi9jb25maWd1cmUuaW4sIGJ1aWxkcy9jeWd3aW4vY29uZmlndXJlOiBTZXR0aW5nCi0JYHZlcnNpb25faW5mbycgdG8gNjoxOjAgZm9yIHRoZSAyLjAuMSByZWxlYXNlLgotCi0JKiBDSEFOR0VTOiBBZGRlZCBhIHN1bW1hcnkgb2YgY2hhbmdlcyBiZXR3ZWVuIDIuMC4xIGFuZCAyLjAuCi0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluLCBidWlsZHMvY3lnd2luL2Z0Y29uZmlnLmluOiBDaGFuZ2VzCi0JdG8gYWxsb3cgY29tcGlsYXRpb24gdW5kZXIgVW5peCB3aXRoIHRoZSBVbml4LXNwZWNpZmljIGNvbmZpZwotCWZpbGVzLgotCi0yMDAwLTEyLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIElOU1RBTEw6IFJldmlzZWQuCi0JKiBidWlsZHMvY29tcGlsZXIvYmNjLWRldi5taywgYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGFnZS5taywKLQlidWlsZHMvY29tcGlsZXIvYmNjLm1rLCBidWlsZHMvd2luMzIvdzMyLWJjYy5taywKLQlidWlsZHMvd2luMzIvdzMyLWJjY2QubWs6IFJldmlzZWQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGJ1aWxkLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oOiBSZXZpc2VkLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmg6IFVwZGF0ZWQgdG8gbmV3IGhlYWRlciBpbmNsdXNpb24gc2NoZW1lLgotCi0yMDAwLTExLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy90b3BsZXZlbC5tayAoLlBIT05ZKTogQWRkaW5nIGBkaXN0Y2xlYW4nLgotCSogYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rICguUEhPTlkpOiBBZGRpbmcgYGRldmVsJywgYHVuaXgnLCBgbGNjJywKLQlgc2V0dXAnLgotCi0yMDAwLTExLTMwICBEYXZpZCBUdXJuZXIgIDxkYXZpZC50dXJuZXJAZnJlZXR5cGUub3JnPgotCi0JKiBJTlNUQUxMOiBTbGlnaHRseSB1cGRhdGVkIHRoZSBxdWljayBzdGFydGVyIGRvY3VtZW50YXRpb24gdG8KLQlpbmNsdWRlIElERSBjb21waWxhdGlvbiwgcHJldmVudCBhZ2FpbnN0IEJTRCBNYWtlLCBhbmQgc3BlY2lmeSBgbWFrZQotCXNldHVwJyBpbnN0ZWFkIG9mIGEgc2luZ2xlIGBtYWtlJyBmb3IgYnVpbGQgY29uZmlndXJhdGlvbi4KLQotCSogaW5jbHVkZS9jb25maWcvZnRidWlsZC5oLCBpbmNsdWRlL2ludGVybmFsL2ludGVybmFsLmg6IEFkZGVkIG5ldwotCWNvbmZpZ3VyYXRpb24gZmlsZXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIGFsbCBwdWJsaWMsCi0JY29uZmlndXJhdGlvbiwgYW5kIGludGVybmFsIGhlYWRlciBmaWxlcyBmb3IgRnJlZVR5cGUgMi4gIE1vZGlmaWVkCi0JYWxsIGhlYWRlcnMgdW5kZXIgYGluY2x1ZGUvZnJlZXR5cGUnIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UuICBOb3RlCi0JdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGNoYW5nZSB0aGUgbGlicmFyeSBzb3VyY2UgZmlsZXMgdGhlbXNlbHZlcwotCXRob3VnaC4KLQotCSogYnVpbGRzL2NvbXBpbGVyL2JjYy5taywgYnVpbGRzL2NvbXBpbGVyL2JjYy1kZXYubWssCi0JYnVpbGRzL3dpbjMyL3czMi1iY2MubWssIGJ1aWxkcy93aW4zMi93MzItYmNjZC5taywKLQlidWlsZHMvd2luMzIvZGV0ZWN0Lm1rOiBBZGRlZCBuZXcgZmlsZXMgdG8gc3VwcG9ydCBjb21waWxhdGlvbiB3aXRoCi0JdGhlIGZyZWUgQm9ybGFuZCBDKysgY29tbWFuZC1saW5lIGNvbXBpbGVyLiAgTW9kaWZpZWQgdGhlIGRldGVjdGlvbgotCXJ1bGVzIHRvIHJlY29nbml6ZSB0aGUgbmV3IGBiY2MzMicgdGFyZ2V0IGluIGBtYWtlIHNldHVwIGJjYzMyJy4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMsIHNyYy9zZm50L3R0cG9zdC5jLCBzcmMvc2ZudC90dHNiaXQuYywKLQlzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMsIHNyYy90cnVldHlwZS90dGdsb2FkLmMsCi0Jc3JjL3RydWV0eXBlL3R0aW50ZXJwLmM6IEZpeGVkIGEgZmV3IGNvbXBhcmlzb25zIHRoYXQgQm9ybGFuZCBDKysKLQlkaWRuJ3QgcmVhbGx5IGxpa2UuICBCYXNpY2FsbHksIHRoaXMgY29tcGlsZXIgY29tcGxhaW5zIHdoZW4gRlRfVUludAotCWlzIGNvbXBhcmVkIHRvIEZUX1VTaG9ydCAoYXBwYXJlbnRseSwgaXQgcHJvbW90ZXMgYFVTaG9ydCcgdG8gYEludCcKLQlpbiB0aGVzZSBjYXNlcykuCi0KLTIwMDAtMTEtMzAgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHQyb2Jqcy5jIChUMl9Jbml0X0ZhY2UpOiBBZGRlZCBjYWxjdWxhdGlvbiBvZiBgZmFjZS0+aGVpZ2h0JyBmb3IKLQlwdXJlIENGRiBmb250cy4KLQotCSogdDFvYmpzLmMgKFQxX0luaXRfRmFjZSk6IEZpeGVkIGNvbXB1dGF0aW9uIG9mIGBmYWNlLT5oZWlnaHQnLgotCi0yMDAwLTExLTI5ICBEYXZpZCBUdXJuZXIgIDxkYXZpZC50dXJuZXJAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGJib3guYyAoQkJveF9Db25pY19DaGVjayk6IEZpeGVkIGEgcmVhbGx5IHN0dXBpZAotCWJ1ZyBpbiB0aGUgZm9ybXVsYSB1c2VkIHRvIGNvbXB1dGUgdGhlIGNvbmljIELDqXppZXIgZXh0cmVtYQotCW9mIG5vbi1tb25vdG9ub3VzIGFyY3MuCi0KLTIwMDAtMTEtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX1NxcnRGaXhlZCksIHNyYy9iYXNlL2Z0b2Jqcy5jCi0JKEZUX1NldF9SZW5kZXJlcik6IFVzZSBGVF9FWFBPUlRfREVGLgotCSogc3JjL2NhY2hlL2Z0Y2ltYWdlLmMgKEZUQ19JbWFnZV9DYWNoZV9Mb29rdXApLAotCXNyYy9jYWNoZS9mdGNtYW5hZy5jIChGVENfTWFuYWdlcl9Eb25lLCBGVENfTWFuYWdlcl9SZXNldCwKLQlGVENfTWFuYWdlcl9Mb29rdXBfRmFjZSwgRlRDX01hbmFnZXJfTG9va3VwX1NpemUsCi0JRlRDX01hbmFnZXJfUmVnaXN0ZXJfQ2FjaGUpLCBzcmMvY2FjaGUvZnRjc2JpdHMuYwotCShGVENfU0JpdF9DYWNoZV9Mb29rdXApOiBEaXR0by4KLQotCSogc3JjL2luY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjZ2x5cGguaCAoRlRDX0dseXBoTm9kZV9Jbml0KSwKLQlzcmMvaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oIChGVF9OZXdfRmFjZV9Gcm9tX0ZPTkQpOiBVc2UgRlRfRVhQT1JULgotCi0yMDAwLTExLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmM6IEluY2x1ZGUgdHRzYml0LmggYW5kIHR0cG9zdC5oIG9ubHkKLQljb25kaXRpb25hbGx5LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoU2V0X0NoYXJfU2l6ZXMsIFNldF9QaXhlbF9TaXplcyk6IFNldAotCWBzaXplLT5zdHJpa2VfaW5kZXgnIG9ubHkgY29uZGl0aW9uYWxseS4KLQotCSogc3JjL3R5cGUxL3QxZHJpdmVyLmMsIHNyYy90eXBlMS90MW9ianMuYzogSW5jbHVkZSB0MWFmbS5oIG9ubHkKLQljb25kaXRpb25hbGx5LgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50Lmg6IE1vdmUgYWxsIHR5cGUgZGVmaW5pdGlvbnMgdG8uLi4KLQkqIHNyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ZudHR5cGVzLmg6IE5ldyBmaWxlLgotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jOiBVc2UgaXQuCi0KLTIwMDAtMTEtMjkgID8/PyA/Pz8gIDxkYXJpbkBlYXplbC5jb20+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oOiBSZXBsYWNlZCBGVF9DQVQgYW5kIEZUX1hDQVQKLQl3aXRoIGEgZGlyZWN0IHNvbHV0aW9uICh3aGljaCBhbHNvIHNhdGlzZmllcyBwaWNreSBjb21waWxlcnMpLgotCi0yMDAwLTExLTI4ICBZQU1BTk8tVUNISSBIaWRldG9zaGkgIDxtZXJAZGluLm9yLmpwPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKFRUX0luaXRfU2l6ZSk6IEZpeCAjaWZkZWYncyB0byB3b3JrIHdpdGgKLQlkaXNhYmxlZCBpbnRlcnByZXRlciBhbHNvLgotCi0JKiBzcmMvYmFzZS9mdG5hbWVzLmMgKEZUX0dldF9TZm50X05hbWVfQ291bnQpOiBGaXggaW5jb3JyZWN0Ci0JcGFyZW50aGVzZXMuCi0KLTIwMDAtMTEtMjYgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jZmYvdDJnbG9hZC5jIChUMl9QYXJzZV9DaGFyU3RyaW5ncyk6IEFkZGVkIGxvZ2ljIHRvIGdseXBoCi0Jd2lkdGggc2V0dGluZyBjb2RlIHRvIHRha2UgaW50byBhY2NvdW50IGV2ZW4vb2RkIGFyZ3VtZW50IGNvdW50cwotCWFuZCBnbHlwaCB3aWR0aCBvcGVyYW5kIGJlZm9yZSBlbmRjaGFyL2htb3ZldG8vdm1vdmV0by4KLQotMjAwMC0xMS0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvYW5zaS9hbnNpLm1rOiBGaXggaW5jbHVzaW9uIG9yZGVyIG9mIGZpbGVzLgotCi0yMDAwLTExLTI2ICBLZWl0aCBQYWNrYXJkICA8a2VpdGhwQGtlaXRocC5jb20+Ci0KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfSW5pdF9GYWNlKTogQ29tcHV0ZSBzdHlsZSBmbGFncy4KLQotMjAwMC0xMS0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvY29tcGlsZXIvYW5zaS1jYy5tayAoQ0xFQU5fTElCUkFSWSk6IEZpeCBydWxlIGFuZAotCWNvbmRpdGlvbmFsLgotCi0yMDAwLTExLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2Vfc3VicnMsIHBhcnNlX2NoYXJzdHJpbmdzKTogVXNlIGRlY3J5cHQKLQlmdW5jdGlvbiBmcm9tIFBTQXV4IG1vZHVsZS4KLQotCSogc3JjL3R5cGUxL3QxcGFyc2UuYyAoVDFfRG9uZV9QYXJzZSk6IFJlbmFtZWQgdG8uLi4KLQkoVDFfRmluYWxpemVfUGFyc2VyKTogTmV3IGZ1bmN0aW9uICh0byBhdm9pZCBuYW1lIGNsYXNoIHdpdGggYQotCWZ1bmN0aW9uIGluIHRoZSBQU0F1eCBtb2R1bGUpLgotCShUMV9EZWNyeXB0KTogUmVtb3ZlZCBzaW5jZSBpdCBpcyBkdXBsaWNhdGVkIGluIHRoZSBQU0F1eCBtb2R1bGUuCi0JKFQxX0dldF9Qcml2YXRlX0RpY3QpOiBBZGRlZCBgcHNhdXgnIGFzIG5ldyBwYXJhbWV0ZXI7IHVzZSBkZWNyeXB0Ci0JZnVuY3Rpb24gZnJvbSBQU0F1eCBtb2R1bGUuCi0KLQkqIHNyYy90eXBlMS90MXBhcnNlLmg6IEFkYXB0ZWQuCi0KLTIwMDAtMTEtMjIgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jZmYvdDJvYmpzLmMgKFQyX0luaXRfRmFjZSk6IEZvciBwdXJlIENGRiBmb250cywgc2V0Ci0JYHJvb3QtPm51bV9mYWNlcycgdG8gYGNmZi0+bnVtX2ZhY2VzJyBhbmQgc2V0IGB1bml0c19wZXJfRU0nCi0JdG8gMTAwMC4KLQotCSogc3JjL2NmZi90MnBhcnNlLmMgKHBhcnNlX3QyX3JlYWwpOiBGaXhlZCByZWFsIG51bWJlciBwYXJzaW5nCi0JbG9vcC4KLQotCSogc3JjL2NmZi90MmxvYWQuYyAoVDJfR2V0X1N0cmluZyk6IENhbGxlZCBUMl9HZXRfTmFtZSB3aXRoIGEKLQlzaWQgdGhhdCB3YXMgb2ZmIGJ5IG9uZS4KLQotMjAwMC0xMS0xNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYXV0b2hpbnQvYWh0eXBlcy5oIChBSF9IaW50ZXIpOiBBZGRlZCBuZXcgZmllbGRzIHRvIGNvbnRyb2wKLQlhdXRvLWhpbnRpbmcgb2Ygc3ludGhldGljIFR5cGUgMSBmb250cy4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfbG9hZCwgYWhfaGludGVyX2xvYWRfZ2x5cGgpOgotCUFkZGVkIGF1dG8taGludGluZyBzdXBwb3J0IG9mIHN5bnRoZXRpYyBUeXBlIDEgZm9udHMuCi0KLTIwMDAtMTEtMTIgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChUVF9Mb29rVXBfVGFibGUsIFRUX0xvYWRfR2VuZXJpY19UYWJsZSk6IENoYW5nZQotCXRyYWNpbmcgb3V0cHV0LgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoU0ZOVF9Mb2FkX0ZhY2UpOiBTZXQgYm9vbGVhbiB2YXJpYWJsZQotCWBoYXMtb3V0bGluZScgdG8gdHJ1ZSBvbmx5IGlmIHRoZSBmb250IGhhcyBhIGBnbHlmJyBvciBgQ0ZGICcgdGFibGUuCi0KLTIwMDAtMTEtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwOiBGaXggcmFzdGVyMS0+cmFzdGVyIGFuZAotCXR5cGUxei0+dHlwZTEuCi0KLTIwMDAtMTEtMTEgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbiwgYnVpbGRzL2N5Z3dpbi9mcmVldHlwZS1jb25maWcuaW46Ci0JQWRkZWQgYSAtLWxpYnRvb2wgb3B0aW9uLiAgV2hlbiBmcmVldHlwZS1jb25maWcgLS1saWJ0b29sIGlzCi0JaW52b2tlZCwgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeQotCWlzIHJldHVybmVkLgotCi0yMDAwLTExLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9jeWd3aW4vY3lnd2luLWRlZi5pbjogU2FtZSBmaXggYXMgcHJldmlvdXMuCi0KLTIwMDAtMTEtMTAgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L3VuaXgtZGVmLmluOiBBZGQKLQotCSAgICBJTlNUQUxMX1BST0dSQU0gOj0gQElOU1RBTExfUFJPR1JBTUAKLQkgICAgSU5TVEFMTF9TQ1JJUFQgIDo9IEBJTlNUQUxMX1NDUklQVEAKLQotCXNvIHRoYXQgaW5zdGFsbGF0aW9uIG9mIGZyZWV0eXBlLWNvbmZpZyBkb2VzIG5vdCBmYWlsLgotCi0yMDAwLTExLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9jeWd3aW4vZnJlZXR5cGUtY29uZmlnLmluLCBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW46Ci0JTW92ZSB0ZXN0IGRvd24gZm9yIGVtcHR5IC0tZXhlYy1wcmVmaXguCi0JRml4IC0tdmVyc2lvbi4KLQotCSogYnVpbGRzL2N5Z3dpbi9pbnN0YWxsLm1rLCBidWlsZHMvdW5peC9pbnN0YWxsLm1rOiBVc2UKLQkkKElOU1RBTExfU0NSSVBUKSBmb3IgaW5zdGFsbGF0aW9uIG9mIGZyZWV0eXBlLWNvbmZpZy4KLQotCSogYnVpbGRzL2N5Z3dpbi9pbnN0YWxsLm1rOiBGaXggY2xlYW4gdGFyZ2V0IG5hbWVzLgotCi0yMDAwLTExLTA5ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQotCSogVmVyc2lvbiAyLjAgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAwMC0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi1hbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi1MSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLWZ1bGx5LgotCi0KLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLWNvZGluZzogdXRmLTgKLUVuZDoKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yMSBiL0NoYW5nZUxvZy4yMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmOWY3OS4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cuMjEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDM4ICswLDAgQEAKLTIwMDUtMDYtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCi0JKiBWZXJzaW9uIDIuMS4xMCByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQkqIHNyYy9wY2YvcmVhZG1lOiBSZW5hbWVkIHRvLi4uCi0JKiBzcmMvcGNmL1JFQURNRTogVGhpcy4KLQotMjAwNS0wNi0wNyAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS8qOiBBZGRlZCBjb3B5cmlnaHQgbm90ZXMsIHJld29ya2VkIHNvbWUgY29tbWVudHMuCi0KLTIwMDUtMDYtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogQWRkIGNvcHlyaWdodCBub3RpY2VzIHRvIGFsbCBmaWxlcyB3aGljaCBkb24ndCBoYXZlIG9uZS4KLQotCSogZG9jcy9saWNlbnNlLnR4dDogUmVuYW1lZCB0by4uLgotCSogZG9jcy9MSUNFTlNFLlRYVDogVGhpcy4KLQkqIGRvY3MvRlRMLnR4dDogUmVuYW1lZCB0by4uLgotCSogZG9jcy9GVEwuVFhUOiBUaGlzLgotCSogZG9jcy9HUEwudHh0OiBSZW5hbWVkIHRvLi4uCi0JKiBkb2NzL0dQTC5UWFQ6IFRoaXMuCi0KLQkqIGRvY3MvUEFURU5UUzogU2xpZ2h0bHkgcmV3b3JkZWQuICBTdWdnZXN0ZWQgYnkgU3lsdmFpbiBCZXVjbGVyCi0JPGJldWNAZ251Lm9yZz4uCi0KLTIwMDUtMDYtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmggKEZUX091dGxpbmVfTW92ZVRvRnVuYywKLQlGVF9PdXRsaW5lX0xpbmVUb0Z1bmMsIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMsCi0JRlRfT3V0bGluZV9DdWJpY1RvRnVuYywgRlRfUmFzdGVyX1JlbmRlckZ1bmMpLAotCWluY2x1ZGUvZnJlZXR5cGUvZnRyZW5kZXIuaCAoRlRfR2x5cGhfVHJhbnNmb3JtRnVuYywKLQlGVF9SZW5kZXJlcl9SZW5kZXJGdW5jLCBGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jKTogRG9uJ3QgdXNlCi0JYGNvbnN0JyB0byBzdGF5IGNvbXBhdGlibGUgd2l0aCBGcmVlVHlwZSAyLjEuOS4KLQotMjAwNS0wNi0wMSAgQWRhbSBELiBNb3NzICA8YWRhbUBnaW1wLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoZnRfc3Ryb2tlcl9pbnNpZGUpOiBSZXZlcnQgYHNpZ21hJyBwYXRjaCBmcm9tCi0JMjAwNC0wNy0xMTsgdGhpcyBnaXZlcyBtdWNoIGJldHRlciByZXN1bHRzIHVuZGVyIG5vcm1hbAotCWNpcmN1bXN0YW5jZXMuCi0KLTIwMDUtMDUtMzAgIENoaWEgSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Yml0bWFwLmggKEZUX0JpdG1hcF9FbWJvbGRlbik6IE1pbm9yCi0JZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oIChGVF9PdXRsaW5lX0VtYm9sZGVuKTogRml4IHR5cG9zLgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfRW1ib2xkZW4pOiBBZGQgc3VwcG9ydCBmb3IgYml0bWFwCi0Jb2YgcGl4ZWxfbW9kZSBGVF9QSVhFTF9NT0RFX0dSQVkyIG9yIEZUX1BJWEVMX01PREVfR1JBWTQuCi0JSWYgeHN0ciBpcyBsYXJnZXIgdGhhbiA4IGFuZCBiaXRtYXAgaXMgb2YgcGl4ZWxfbW9kZQotCUZUX1BJWEVMX01PREVfTU9OTywgc2V0IHhzdHIgdG8gOCBpbnN0ZWFkIG9mIHJldHVybmluZyBlcnJvci4KLQotMjAwNS0wNS0yOSAgQ2hpYSBJIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKEZUX0JpdG1hcF9FbWJvbGRlbik6IEZpeCBlbWJvbGRlbmluZyBiaXRtYXAKLQlvZiBtb2RlIEZUX1BJWEVMX01PREVfR1JBWS4gIEFsc28gYWRkIHN1cHBvcnQgZm9yIG1vZGUKLQlGVF9QSVhFTF9NT0RFX0xDRCBhbmQgRlRfUElYRUxfTU9ERV9MQ0RfVi4KLQkoZnRfYml0bWFwX2Fzc3VyZV9idWZmZXIpOiBGVF9QSVhFTF9NT0RFX0xDRCBhbmQgRlRfUElYRUxfTU9ERV9MQ0RfVgotCXNob3VsZCBoYXZlIHBwYiAocGl4ZWwgcGVyIGJ5dGUpIDEuCi0JWmVybyB0aGUgcGFkZGluZyB3aGVuIHRoZXJlJ3Mgbm8gbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkuCi0KLQkqIHNyYy9iYXNlL2Z0c3ludGguYyAoRlRfR2x5cGhTbG90X0VtYm9sZGVuKTogSGFuZGxlIHNsb3QtPmFkdmFuY2UKLQl0b28uCi0JTW9yZSBzdWl0ZWQgZW1ib2xkZW5pbmcgc3RyZW5ndGguCi0KLTIwMDUtMDUtMjggIENoaWEgSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfRW1ib2xkZW4pOiBIYW5kbGUgbmVnYXRpdmUgcGl0Y2guCi0JSGFuZGxlIEZUX1BJWEVMX01PREVfR1JBWSB3aXRoIG51bV9ncmF5ICE9IDI1Ni4KLQlJbXByb3ZlIHNwZWVkIGZvciBGVF9QSVhFTF9NT0RFX0dSQVkuCi0JKGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKTogQWNjZXB0IEZUX1BJWEVMX01PREVfTENEIGFuZAotCUZUX1BJWEVMX01PREVfTENEX1YuCi0KLTIwMDUtMDUtMjcgIENoaWEgSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvYmFzZS9mdHN5bnRoLmMgKEZUX0dseXBoU2xvdF9FbWJvbGRlbik6IEluaXRpYWxpemUgYGVycm9yJy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2NtYXBfZG9uZV9pbnRlcm5hbCk6IE5ldyBmdW5jdGlvbi4KLQkoRlRfQ01hcF9Eb25lKTogUmVtb3ZlIGNtYXAgZnJvbSBjbWFwIGxpc3QuCi0JKGRlc3Ryb3lfY2hhcm1hcHMsIEZUX0NNYXBfTmV3KTogRG9uJ3QgY2FsbCBGVF9DTWFwX0RvbmUgYnV0Ci0JZnRfY21hcF9kb25lX2ludGVybmFsLgotCi0yMDA1LTA1LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvR1BMLnR4dDogVXBkYXRlIHBvc3RhbCBhZGRyZXNzIG9mIEZTRi4KLQotMjAwNS0wNS0yNiAgQ2hpYSBJIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaCAoRlRfQml0bWFwX0VtYm9sZGVuKTogSW1wcm92ZQotCWRvY3VtZW50YXRpb24uCi0KLQkqIHNyYy9iYXNlL2Z0c3ludGguYyAoRlRfQk9MRF9USFJFU0hPTEQpOiBSZW1vdmVkLgotCShGVF9HbHlwaFNsb3RfRW1ib2xkZW4pOiBDaGVjayB3aGV0aGVyIHNsb3QgaXMgYml0bWFwIG93bmVyLgotCUFsd2F5cyBtb2RpZnkgdGhlIG1ldHJpY3MuCi0KLTIwMDUtMDUtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA1LTA1LTI0ICBDaGlhIEkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oIChGVF9CaXRtYXBfRW1ib2xkZW4pOiBOZXcgZGVjbGFyYXRpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oIChGVF9PdXRsaW5lX0VtYm9sZGVuKTogTmV3IGRlY2xhcmF0aW9uLgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChmdF9iaXRtYXBfYXNzdXJlX2J1ZmZlcik6IE5ldyBhdXhpbGlhcnkKLQlmdW5jdGlvbi4KLQkoRlRfQml0bWFwX0VtYm9sZGVuKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfRW1ib2xkZW4pOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNyYy9iYXNlL2Z0c3ludGguYzogRG9uJ3QgaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0ggYW5kCi0JRlRfVFJJR09OT01FVFJZX0ggYnV0IEZUX0JJVE1BUF9ILgotCShGVF9HbHlwaFNsb3RfRW1ib2xkZW4pOiBVc2UgRlRfT3V0bGluZV9FbWJvbGRlbiBvcgotCUZUX0JpdG1hcF9FbWJvbGRlbi4KLQotMjAwNS0wNS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBjb25maWd1cmU6IEFsd2F5cyByZW1vdmUgY29uZmlnLm1rLCBidWlsZHMvdW5peC91bml4LWRlZi5taywgYW5kCi0JYnVpbGRzL3VuaXgvdW5peC1jYy5tay4gIFRoaXMgZml4ZXMgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIHNjcmlwdC4KLQlSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUgYW5kIEJlaGRhZCBFc2ZhaGJvZC4KLQotCSogUkVBRE1FLkNWUzogTWVudGlvbiBmaWxlIHBlcm1pc3Npb25zLgotCi0yMDA1LTA1LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQgKFdBUk5JTkdTKSwgYnVpbGRzL2NvbXBpbGVyL2djYy1kZXYubWsKLQkoQ0ZMQUdTKSwgYnVpbGRzL2NvbXBpbGVyL2djYy5tayAoQ0ZMQUdTKTogUmVtb3ZlCi0JLWZuby1zdHJpY3QtYWxpYXNpbmcuCi0KLQkqIHNyYy9zZm50L3J1bGVzLm1rIChTRk5UX0RSVl9TUkMpOiBEb24ndCBpbmNsdWRlIHR0c2JpdDAuYyAtLQotCWl0IGlzIGN1cnJlbnRseSBsb2FkZWQgZnJvbSB0dHNiaXQuYy4KLQotMjAwNS0wNS0yMyAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGNzLnRvcm9udG8uZWR1PgotCi0JU2F5IHlvdSBoYXZlIGAoRm9vKil4JyBhbmQgd2FudCB0byBhc3NpZ24sIHBhc3MsIG9yIHJldHVybiBpdCBhcwotCWAoQmFyKiknLiAgSWYgeW91IHNpbXBseSBzYXkgYHgnIG9yIGAoQmFyKil4JywgdGhlbiB0aGUgQyBjb21waWxlcgotCXdvdWxkIHdhcm4geW91IHRoYXQgdHlwZSBjYXN0aW5nIGluY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIGJyZWFrcwotCXN0cmljdC1hbGlhc2luZy4gIFRoZSBzb2x1dGlvbiBpcyB0byBjYXN0IHRvIGAodm9pZCopJyBpbnN0ZWFkIHdoaWNoCi0JaXMgdGhlIGdlbmVyaWMgcG9pbnRlciB0eXBlLCBzbyB0aGUgY29tcGlsZXIga25vd3MgdGhhdCBpdCBzaG91bGQKLQltYWtlIG5vIHN0cmljdC1hbGlhc2luZyBhc3N1bXB0aW9uIG9uIGB4Jy4gIEJ1dCB0aGUgcHJvYmxlbSB3aXRoCi0JYCh2b2lkKil4JyBpcyB0aGF0IHNlZW1zIGxpa2UgaW4gQysrLCB1bmxpa2UgQywgYHZvaWQqJyBpcyBub3QgYQotCWdlbmVyaWMgcG9pbnRlciB0eXBlIGFuZCBhc3NpZ25pbmcgYHZvaWQqJyB0byBgQmFyKicgd2l0aG91dCBhIGNhc3QKLQljYXVzZXMgYW4gZXJyb3IuICBUaGUgc29sdXRpb24gaXMgdG8gY2FzdCB0byBgQmFyKicgdG9vLCB3aXRoCi0JYChCYXIqKSh2b2lkKil4JyBhcyB0aGUgcmVzdWx0IC0tIHRoaXMgaXMgd2hhdCB0aGUgcGF0Y2ggZG9lcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNjYWNoZS5oIChGVENfQ0FDSEVfTE9PS1VQX0NNUCksCi0JaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNtcnUuaCAoRlRDX01SVUxJU1RfTE9PS1VQX0NNUCk6IFJlbW92ZQotCWNhc3Qgb24gbHZhbHVlLCB1c2UgYSB0ZW1wb3JhcnkgcG9pbnRlciBpbnN0ZWFkLgotCUNhc3QgdGVtcG9yYXJpbHkgdG8gKHZvaWQqKSB0byBub3QgYnJlYWsgc3RyaWN0IGFsaWFzaW5nLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmggKEZUX01FTV9BTExPQywKLQlGVF9NRU1fUkVBTExPQywgRlRfTUVNX1FBTExPQywgRlRfTUVNX1FSRUFMTE9DLCBGVF9NRU1fRlJFRSksCi0Jc3JjL2Jhc2UvZnRnbHlwaC5jIChGVF9HbHlwaF9Ub19CaXRtYXApOiBDYXN0IHRlbXBvcmFyaWx5IHRvICh2b2lkKikKLQl0byBub3QgYnJlYWsgc3RyaWN0IGFsaWFzaW5nLgotCi0JKiBzcmMvYmFzZS9mdGluaXQuYyAoRlRfVVNFX01PRFVMRSk6IEZpeCB3cm9uZyB0eXBlIGluZm9ybWF0aW9uLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWMgKFhYX0NGTEFHUyk6IFJlbW92ZSAtZm5vLXN0cmljdC1hbGlhc2luZy4KLQotMjAwNS0wNS0yMyAgRGF2aWQgVHVybmVyICA8ZHR1cm5lckBmcmVldHlwZS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMxMjIxMyAoaW5jb3JyZWN0IGJlaGF2aW91ciBvZiB0aGUgY2FjaGUgc3ViLXN5c3RlbQotCWluIGxvdy1tZW1vcnkgY29uZGl0aW9ucykuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjY2FjaGUuaCAoRlRDX0NBQ0hFX1RSWUxPT1AsCi0JRlRDX0NBQ0hFX1RSWUxPT1BfRU5EKTogTmV3IG1hY3Jvcy4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKEZUQ19DYWNoZV9OZXdOb2RlKSwgc3JjL2NhY2hlL2Z0Y3NiaXRzLmMKLQkoZnRjX3Nub2RlX2NvbXBhcmUpOiBVc2UgRlRfQ0FDSEVfVFJZTE9PUCBhbmQgRlRDX0NBQ0hFX1RSWUxPT1BfRU5ELgotCi0yMDA1LTA1LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyk6IERvbid0IGFkZCBmdHN5bnRoLmMgaGVyZSBidXQuLi4KLQkoQkFTRV9FWFRfU1JDKTogSGVyZS4KLQotMjAwNS0wNS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZ2VuZXJpYyk6IE1hcmsKLQlgdmVyc2lvbl9udW1iZXInIGFuZCBgZW50cnlfbGVuZ3RoJyBhcyB1bnVzZWQuCi0JKHJhY2Nlc3NfZ3Vlc3NfbGludXhfZG91YmxlX2Zyb21fZmlsZV9uYW1lKTogUmVtb3ZlIGBtZW1vcnknLgotCShyYWNjZXNzX21ha2VfZmlsZV9uYW1lKTogTWFyayBgZXJyb3InIGFzIHVudXNlZC4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9wcm9wZXJ0aWVzKTogUmVtb3ZlIGBtZW1vcnknLgotCi0JKiBzcmMvY2lkL2NpZG9ianMuYyAoY2lkX2ZhY2VfaW5pdCk6IFJlbW92ZSBgcHNuYW1lcycuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2xvYWRfZmFjZSk6IFJlbW92ZSBgbWVtb3J5Jy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMsCi0JZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXMsIGZ0X3Zhcl9sb2FkX2F2YXIpOiBNYXJrIGBlcnJvcicgYXMgdW51c2VkLgotCi0JKiBzcmMvYmFzZS9ydWxlcy5tayAoQkFTRV9TUkMpOiBBZGQgZnRzeW50aC5jLgotCi0yMDA1LTA1LTIxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0c3ludGguYyAoRlRfR2x5cGhTbG90X0VtYm9sZGVuKTogRml4IGEgYnVnIHRoYXQKLQlwcm9kdWNlZCB1bnBsZWFzYW50IGFydGVmYWN0cyB3aGVuIHRyeWluZyB0byBlbWJvbGRlbiB2ZXJ5IHNoYXJwCi0JY29ybmVycy4KLQotMjAwNS0wNS0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDUtMDUtMjAgIENoaWEgSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jOiBEb24ndCBpbmNsdWRlIEZUX0ZSRUVUWVBFX0ggYW5kIEZUX0lNQUdFX0gKLQlidXQgRlRfQklUTUFQX0guCi0JKEZUX0JpdG1hcF9Db3B5KTogTmV3IGZ1bmN0aW9uIChmcm9tIGZ0Z2x5cGguYykuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaCAoRlRfQml0bWFwX0NvcHkpOiBOZXcgcHVibGljCi0JZGVmaW5pdGlvbi4KLQotCSogc3JjL2Jhc2UvZnRnbHlwaC5jOiBJbmNsdWRlIEZUX0JJVE1BUF9ILgotCShmdF9iaXRtYXBfY29weSk6IE1vdmUgdG8gZnRiaXRtYXAuYy4KLQkoZnRfYml0bWFwX2dseXBoX2luaXQpOiBSZW1vdmUgYG1lbW9yeScgdmFyaWFibGUuCi0JQ3JlYXRlIG5ldyBiaXRtYXAgb2JqZWN0IGlmIEZUX0dMWVBIX09XTl9CSVRNQVAgaXNuJ3Qgc2V0LgotCShmdF9iaXRtYXBfZ2x5cGhfY29weSk6IFVzZSBGVF9CaXRtYXBfQ29weS4KLQkoZnRfYml0bWFwX2dseXBoX2RvbmUpOiBVc2UgRlRfQml0bWFwX0RvbmUuCi0JKGZ0X291dGxpbmVfZ2x5cGhfaW5pdCk6IFVzZSBGVF9PdXRsaW5lX0NvcHkuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9Db3B5KTogSGFuZGxlIHNvdXJjZSA9PSB0YXJnZXQuCi0JKEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCk6IENoZWNrIGZvciB2YWxpZCBgbWVtb3J5JyBwb2ludGVyLgotCShGVF9PdXRsaW5lX1RyYW5zbGF0ZSwgRlRfT3V0bGluZV9SZXZlcnNlLCBGVF9PdXRsaW5lX1JlbmRlciwKLQlGVF9PdXRsaW5lX1RyYW5zZm9ybSk6IENoZWNrIGZvciB2YWxpZCBgb3V0bGluZScgcG9pbnRlci4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX05ld19HbHlwaFNsb3QpOiBQcmVwZW5kIGdseXBoIHNsb3QgdG8KLQlmYWNlLT5nbHlwaCwgb3RoZXJ3aXNlIGEgbmV3IHNlY29uZCBnbHlwaCBzbG90IGNhbm5vdCBiZSBjcmVhdGVkLgotCShGVF9Eb25lX0dseXBoU2xvdCk6IEZpeCBtZW1vcnkgbGVhay4KLQkoRlRfT3Blbl9GYWNlKTogVXBkYXRlZCAtLSBmYWNlLT5nbHlwaCBpcyBhbHJlYWR5IG1hbmFnZWQgYnkKLQlGVF9OZXdfR2x5cGhTbG90LgotCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0dseXBoU2xvdF9Eb25lKTogVXBkYXRlZC4KLQotMjAwNS0wNS0yMCAgS2lyaWxsIFNtZWxrb3YgIDxraXJyQG1ucy5zcGIucnU+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oIChGVF9SYXN0ZXJfUGFyYW1zKSwKLQlpbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaCAoRlRfT3V0bGluZV9UcmFuc2xhdGUsCi0JRlRfT3V0bGluZV9UcmFuc2Zvcm0pLCBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfVHJhbnNsYXRlLAotCUZUX091dGxpbmVfVHJhbnNmb3JtKTogRGVjb3JhdGUgcGFyYW1ldGVycyB3aXRoIGBjb25zdCcgd2hlcmUKLQlhcHByb3ByaWF0ZS4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoZnRfYmxhY2tfcmVzZXQpLCBzcmMvc21vb3RoL2Z0Z3JheXMuYwotCShncmF5X3Jhc3Rlcl9yZXNldCk6IFJlbW92ZSBgY29uc3QnIGZyb20gYHBvb2xfYmFzZScgYXJndW1lbnQuCi0KLTIwMDUtMDUtMTggIEtpcmlsbCBTbWVsa292ICA8a2lyckBtbnMuc3BiLnJ1PgotCi0JKiBzcmMvcmFzdGVyL2Z0bWlzYy5oOiBOZXcgZmlsZS4gIE9ubHkgbmVlZGVkIGlmIGZ0cmFzdGVyLmMgaXMKLQljb21waWxlZCBhcyBzdGFuZC1hbG9uZS4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jOiBBZGQgY29tbWVudCBob3cgdG8gY29tcGlsZSBhcyBzdGFuZC1hbG9uZS4KLQlzL0ZUX0NPTkZJR19PUFRJT05fU1RBVElDX1JBU1RFUi9GVF9TVEFUSUNfUkFTVEVSLy4KLQlzL1RUX1NUQVRJQ19SQVNURVIvRlRfU1RBVElDX1JBU1RFUi8uCi0JW19TVEFOREFMT05FX106IEluY2x1ZGUgZnRpbWFnZS5oIGFuZCBmdG1pc2MuaC4KLQkoRlRfVFJBQ0UxLCBGVF9UUkFDRTYsIGZ0X21lbXNldCwgRlRfTUVNX1pFUk8pOiBEZWZpbmUKLQljb25kaXRpb25hbGx5LgotCShSZW5kZXJfR2x5cGgsIFJlbmRlcl9HcmF5X0dseXBoKTogUmV0dXJuIFJhc3Rlcl9FcnJfTm9uZSAob3IKLQlSYXN0ZXJfRXJyX1Vuc3VwcG9ydGVkKS4KLQkoZnRfYmxhY2tfbmV3KSBbX1NUQU5EQUxPTkVfXTogRml4IHR5cGUgb2YgYHRoZV9yYXN0ZXInLgotCShmdF9ibGFja19pbml0LCBmdF9ibGFja19yZXNldCwgZnRfYmxhY2tfc2V0X21vZGUsIGZ0X2JsYWNrX3JlbmRlcik6Ci0JVXNlIGByYXMnLCBub3QgYHJhc3RlcicuCi0JKGZ0X2JsYWNrX2RvbmUpOiBVc2UgRlRfVU5VU0VEX1JBU1RFUi4KLQkoSG9yaXpvbnRhbF9Td2VlcF9Jbml0LCBIb3Jpem9udGFsX1N3ZWVwX1N0ZXAsCi0JSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX1NwYW4pOiBVc2UgRlRfVU5VU0VEX1JBU1RFUi4KLQotMjAwNS0wNS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL2Fubm91bmNlOiBTdGFydCB1cGRhdGluZy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA1LTA1LTE2ICBWaXRhbGl5IFBhc3Rlcm5hayAgPHZfYV9wYXN0ZXJuYWtAbWFpbC5ydT4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qOiBVcGRhdGVkLgotCUV4Y2x1ZGUgZGVidWcgaW5mbyBmb3IgYFJlbGVhc2UnIHZlcnNpb25zIHRvIHJlZHVjZSBsaWJyYXJ5IHNpemUuCi0KLTIwMDUtMDUtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX09wZW5fRmFjZSk6IE1ha2UgaXQgd29yayBhcyBkb2N1bWVudGVkLCB0aGlzCi0JaXMsIGlnbm9yZSBgYWZhY2UnIGNvbXBsZXRlbHkgaWYgZmFjZV9pbmRleCA8IDAuICBSZXBvcnRlZCBieSBEYXZpZAotCU9zYm9ybiA8c3BhbUBoYWJpdHVhbGhpYXR1cy5jb20+LgotCi0yMDA1LTA1LTE2ICBLaXJpbGwgU21lbGtvdiAgPGtpcnJAbW5zLnNwYi5ydT4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmggKEZUX091dGxpbmVfTW92ZVRvRnVuYywKLQlGVF9PdXRsaW5lX0xpbmVUb19GdW5jLCBGVF9PdXRsaW5lX0NvbmljVG9GdW5jLAotCUZUX091dGxpbmVfQ3ViaWNUb0Z1bmMpLCBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfY29uaWMsCi0JZ3JheV9yZW5kZXJfY3ViaWMsIGdyYXlfbW92ZV90bywgZ3JheV9saW5lX3RvLCBncmF5X2NvbmljX3RvLAotCWdyYXlfY3ViaWNfdG8sIGdyYXlfcmVuZGVyX3NwYW4sIGdyYXlfc3dlZXApOiBEZWNvcmF0ZSBwYXJhbWV0ZXJzCi0Jd2l0aCBgY29uc3QnIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0yMDA1LTA1LTExICBLaXJpbGwgU21lbGtvdiAgPGtpcnJAbW5zLnNwYi5ydT4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmggKEZUX1Jhc3Rlcl9SZW5kZXJGdW5jKSwKLQlpbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmggKEZUX0dseXBoX1RyYW5zZm9ybUZ1bmMsCi0JRlRfUmVuZGVyZXJfUmVuZGVyX0Z1bmMsIEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMpLAotCXNyYy9iYXNlL2Z0Z2x5cGguYyAoZnRfb3V0bGluZV9nbHlwaF90cmFuc2Zvcm0pLAotCXNyYy9yYXN0ZXIvZnRyZW5kMS5jIChmdF9yYXN0ZXIxX3RyYW5zZm9ybSwgZnRfcmFzdGVyMV9yZW5kZXIpLAotCXNyYy9zbW9vdGgvZnRncmF5cy5jIChGVF9PdXRsaW5lX0RlY29tcG9zZSwgZ3JheV9yYXN0ZXJfcmVuZGVyKSwKLQlzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF90cmFuc2Zvcm0sCi0JZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljLCBmdF9zbW9vdGhfcmVuZGVyLCBmdF9zbW9vdGhfcmVuZGVyX2xjZCwKLQlmdF9zbW9vdGhfcmVuZGVyX2xjZF92KTogRGVjb3JhdGUgcGFyYW1ldGVycyB3aXRoIGBjb25zdCcgd2hlcmUKLQlhcHByb3ByaWF0ZS4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChSQVNURVJfUkVOREVSX1BPT0wpOiBSZW1vdmVkLiAgT2Jzb2xldGUuCi0JKGZ0X2JsYWNrX3JlbmRlcik6IERlY29yYXRlIHBhcmFtZXRlcnMgd2l0aCBgY29uc3QnIHdoZXJlCi0JYXBwcm9wcmlhdGUuCi0KLTIwMDUtMDUtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X3NldF9yYW5nZSk6IEZpeCB0eXBvIChGVF9QRUVLX1NIT1JUIC0+Ci0JRlRfUEVFS19VU0hPUlQpIHdoaWNoIGNhdXNlZCBjcmFzaGVzLiAgUmVwb3J0ZWQgYnkgSXNtYWlsIERvbm1legotCTxpc21haWxAa2RlLm9yZy50cj4uCi0KLTIwMDUtMDUtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCAoRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKQotCVtfX2NwbHVzcGx1c106IEZpeCB0eXBvLgotCi0yMDA1LTA1LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlIYW5kbGUgdW5zb3J0ZWQgU0ZOVCB0eXBlIDQgY21hcHMgY29ycmVjdGx5IChyZXBvcnRlZCBieSBEaXJjawotCUJsYXNrZXkgPGxpc3R0YXJnZXRAZGFuYmFsYS5jb20+KS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmggKFRUX0NNYXApOiBBZGQgbWVtYmVyIGB1bnNvcnRlZCcuCi0JKiBzcmMvc2ZudC90dGNtYXAuYzogVXNlIFNGTlRfRXJyX09rIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JKHR0X2NtYXAwX3ZhbGlkYXRlLCB0dF9jbWFwMl92YWxpZGF0ZSwgdHRfY21hcDZfdmFsaWRhdGUsCi0JdHRfY21hcDhfdmFsaWRhdGUsIHR0X2NtYXAxMF92YWxpZGF0ZSwgdHRfY21hcDEyX3ZhbGlkYXRlKTogVXNlCi0JYEZUX0Vycm9yJyBhcyByZXR1cm4gdHlwZS4KLQkodHRfY21hcDRfdmFsaWRhdGUpOiBVc2UgYEZUX0Vycm9yJyBhcyByZXR1cm4gdHlwZS4KLQlSZXR1cm4gZXJyb3IgY29kZSBmb3IgdW5zb3J0ZWQgY21hcC4KLQkodHRfY21hcDRfY2hhcl9pbmRleCwgdHRfY21hcDRfY2hhcl9uZXh0KTogVXNlIG9sZCBjb2RlIGZvciB1bnNvcnRlZAotCWNtYXBzLgotCSh0dF9mYWNlX2J1aWxkX2NtYXBzKTogU2V0IGB1bnNvcnRlZCcgdmFyaWFibGUgaW4gY21hcC4KLQotMjAwNS0wNS0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2dldF9sb2NhdGlvbik6IEZpeCB0eXBvLgotCi0yMDA1LTA1LTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogU2V0IHBwZW0gdmFsdWUgaW4gdG9wCi0JZGljdGlvbmFyeSBmb3IgU0ZOVC1iYXNlZCBDRkYuCi0KLTIwMDUtMDUtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUhhbmRsZSBtYWxmb3JtZWQgYGxvY2EnIHRhYmxlIGVudHJpZXMuCi0KLQkqIGRvY3MvVE9ETzogQWRkIHNvbWUgYnVncyB3aGljaCBzaG91bGQgYmUgZml4ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GYWNlUmVjKTogQWRkIGBnbHlmX2xlbicKLQllbGVtZW50LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2xvYWRfbG9jYSk6IEdldCBsZW5ndGggb2YgYGdseWYnCi0JdGFibGUuCi0JKHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKTogRml4IGNvbXB1dGF0aW9uIG9mIGBhc2l6ZScgZm9yIG1hbGZvcm1lZAotCWBsb2NhJyBlbnRyaWVzLgotCi0yMDA1LTA1LTAxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIEphbWZpbGU6IFJlbW92ZSBgb3R2YWxpZCcgZnJvbSB0aGUgbGlzdCBvZiBjb21waWxlZCBtb2R1bGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oOiBBZGQgY29tcGlsZXIgcHJhZ21hcyB0byBnZXQKLQlyaWQgb2YgYW5ub3lpbmcgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrIGNvbXBpbGVyIGluIG1heGltdW0gd2FybmluZwotCW1vZGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYywgc3JjL2F1dG9maXQvYWZsYXRpbi5jLCBzcmMvYmFzZS9mdHN0cm9rZS5jLAotCXNyYy9iZGYvYmRmZHJpdnIuYywgc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMsIHNyYy9jYWNoZS9mdGNjbWFwLmMsCi0Jc3JjL2NhY2hlL2Z0Y21hbmFnLmMsIHNyYy9jZmYvY2ZmbG9hZC5jLCBzcmMvY2lkL2NpZGxvYWQuYywKLQlzcmMvbHp3L3pvcGVuLmMsIHNyYy9vdHZhbGlkL290dmdkZWYuYywgc3JjL3BjZi9wY2ZyZWFkLmMsCi0Jc3JjL3NmbnQvc2ZvYmpzLmMsIHNyYy90cnVldHlwZS90dGd4dmFyLmM6IFJlbW92ZSBjb21waWxlciB3YXJuaW5ncy4KLQotMjAwNS0wNC0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL1RPRE86IFVwZGF0ZWQuCi0KLTIwMDUtMDQtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL290dmFsaWQvb3R2Y29tbW4uYwotCShvdHZfR1NVQkdQT1NfaGF2ZV9NYXJrQXR0YWNobWVudFR5cGVfZmxhZyk6IEhhbmRsZSB0YWJsZSA9PSAwLgotCi0yMDA1LTA0LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogU2V0IGRlZmF1bHQgdXBlbSB2YWx1ZSBpbiB0b3AKLQlmb250IGRpY3QgYWxzby4KLQlIYW5kbGUgZm9udCBtYXRyaXggc2V0dGluZ3MgaW4gc3ViZm9udHMuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCk6IFVzZSB0aGUgY29ycmVjdCBmb250IG1hdHJpeAotCWZvciBDSUQta2V5ZWQgZm9udHMgd2l0aCBzdWJmb250cy4KLQotCSogZG9jcy9mb3JtYXRzLnR4dDogVXBkYXRlZC4KLQotMjAwNS0wNC0xNCAgS2lyaWxsIFNtZWxrb3YgIDxraXJyQG1ucy5zcGIucnU+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfVmVjdG9yX1RyYW5zZm9ybSksCi0JaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmggKEZUX1Jhc3Rlcl9QYXJhbXMpLAotCWluY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oLCBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfR2V0X0NCb3gsCi0JRlRfT3V0bGluZV9Db3B5LCBGVF9PdXRsaW5lX1RyYW5zZm9ybSwgRlRfVmVjdG9yX1RyYW5zZm9ybSwKLQlGVF9PdXRsaW5lX0dldF9CaXRtYXApLCBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKGZ0X2JsYWNrX3JlbmRlciksCi0Jc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmFzdGVyX3JlbmRlcik6IERlY29yYXRlIHBhcmFtZXRlcnMgd2l0aAotCWBjb25zdCcgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLTIwMDUtMDQtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9jaGFyc3RyaW5ncyk6IENhdGNoIHRoaXMgbm9uLXN0YW5kYXJkCi0JYmVnaW5uaW5nIG9mIHRoZSAvQ2hhclN0cmluZ3MgZGljdGlvbmFyeToKLQotCSAgL0NoYXJTdHJpbmdzIDExOCBkaWN0IGRlZgotCSAgUHJpdmF0ZSBiZWdpbgotCSAgQ2hhclN0cmluZ3MgYmVnaW4KLQotCSogc3JjL3NmbnQvdHRzYml0MC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSk6IEZpeCBhcmd1bWVudHMKLQl0byBjYWxsIG9mIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdG1hcC4KLQotMjAwNS0wNC0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL1RPRE86IFVwZGF0ZWQuCi0KLQkqIGF1dG9nZW4uc2g6IFVzZSBgLS1mb3JjZScgZm9yIGFsbCBjb21tYW5kcy4KLQotMjAwNS0wNC0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jIChwc19oaW50c19hcHBseSk6IENoYW5nZSBzY2FsaW5nIHZhbHVlcwotCW9ubHkgaWYgYGZpdHRlZCcgaXMgbm90IHplcm8uCi0KLTIwMDUtMDQtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfZmFjZV9nZXRfbWV0cmljcykgW0ZUX09QVElNSVpFX01FTU9SWV06Ci0JRml4IHR5cG8gd2hpY2ggc29tZXRpbWVzIGNhdXNlcyB3cm9uZyBtZXRyaWNzIGZvciB0aGUgbGFzdCBnbHlwaC4KLQotMjAwNS0wNC0wNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKEZUX09QVElNSVpFX01FTU9SWSk6IENvbW1lbnQgb3V0IHRoaXMgbWFjcm8gZm9yIHRoZSB1cGNvbWluZyAyLjEuMTAKLQlyZWxlYXNlLgotCSgqX0NIRVNURVJfKik6IFJlbW92ZWQuICBObyBsb25nZXIgdXNlZC4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9heGlzX2hpbnRzX25ld19zZWdtZW50LAotCWFmX2F4aXNfaGludHNfbmV3X2VkZ2UpOiBTbWFsbCB0d2VhayB0byB1c2UgbGVzcyBoZWFwIG1lbW9yeS4KLQotMjAwNS0wNC0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChUMV9OZXdfUGFyc2VyKTogUmVsYXggdGhlIGNoZWNrIGZvciBhIHZhbGlkCi0JZmlyc3QgbGluZSBpbiB0aGUgZm9udC4KLQotMjAwNS0wNC0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVMsIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogSW1wcm92ZSBkb2N1bWVudGF0aW9uCi0Jb2YgRlRfU2V0X1BpeGVsX1NpemVzIGFuZCBGVF9TZXRfQ2hhcl9TaXplLgotCi0yMDA1LTAzLTI2ICBEZXRsZWYgV8O8cmtuZXIgIDxUZXRpU29mdEBhcGcubGFobi5kZT4KLQotCSogYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0c3lzdGVtLmMgKGZ0X2FtaWdhX3N0cmVhbV9pbyk6IEZpeCBidWZmZXIKLQlvZmZzZXRzIGFmdGVyIGEgbGFyZ2UgcmVhZC4KLQotMjAwNS0wMy0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfZ2V0X21ldHJpY3MpOgotCXMvaW5kZXgvZ2lkeC8uCi0KLQkqIHNyYy9zZm50L3R0c2JpdDAuYyAodHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2UpOiBGaXggY29tcGlsZXIKLQl3YXJuaW5ncy4KLQotCSogc3JjL3NmbnQvcnVsZXMubWsgKFNGTlRfRFJWX1NSQyk6IEFkZCB0dHNiaXQwLmMuCi0KLQkqIHNyYy9zZm50L3R0c2JpdDAuaDogRHVtbXkgZmlsZSBmb3IgYnVpbGQgd2l0aCBgbWFrZScuCi0KLTIwMDUtMDMtMjYgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JVXBkYXRlIG9mIHRoZSBBbWlnYSBwb3J0LgotCi0JKiBidWlsZHMvYW1pZ2EvbWFrZWZpbGUsIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQsCi0JYnVpbGRzL2FtaWdhL3NtYWtlZmlsZTogSW5jbHVkZWQgdGhlIGJhc2UgZXh0ZW5zaW9uIGZpbGVzCi0JKGZ0Yml0bWFwLmMsIGZ0b3R2YWwuYywgZnRwZnIuYywgZnRzdHJva2UuYywgZnR4Zjg2LmMpLgotCi0yMDA1LTAzLTI1ICBEZXRsZWYgV8O8cmtuZXIgIDxUZXRpU29mdEBhcGcubGFobi5kZT4KLQotCVVwZGF0ZSBvZiB0aGUgQW1pZ2EgcG9ydC4KLQotCSogYnVpbGRzL2FtaWdhL21ha2VmaWxlLCBidWlsZHMvYW1pZ2Evc21ha2VmaWxlOiBIYW5kbGUgbmV3IG1vZHVsZXMuCi0KLQkqIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQ6IE1ha2VmaWxlIGZvciBBbWlnYU9TNCBTREsuCi0KLQkqIGJ1aWxkcy9hbWlnYS9SRUFETUU6IFVwZGF0ZWQuCi0KLQkqIGJ1aWxkcy9hbWlnYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oOiBIYW5kbGUgZ2NjIGZvcgotCUFtaWdhT1M0LgotCi0JKiBidWlsZHMvYW1pZ2EvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaDogSGFuZGxlIG5ldwotCW1vZHVsZXMuCi0KLQkqIGJ1aWxkcy9hbWlnYS9zcmMvYmFzZS9mdGRlYnVnLmM6IFVwZGF0ZWQgdG8gY3VycmVudCB2ZXJzaW9uIG9mCi0JZGVmYXVsdCBmdGRlYnVnLmMuCi0JQWRkIHZhcmlvdXMgaW5jbHVkZSBmaWxlcyBhbmQgbWFjcm9zIHRvIGhhdmUgcHJvcGVyIHN1cHBvcnQgZm9yCi0JYm90aCBBbWlnYU9TNCBhbmQgb2xkZXIgQW1pZ2FPUyB2ZXJzaW9ucy4KLQlEb24ndCBkZWNsYXJlIEtWUHJpbnRGIGV4cGxpY2l0bHkuCi0JUmVwbGFjZSBnZXRlbnYgd2l0aCBHZXRWYXIuCi0JQWN0dWFsbHkgZW5hYmxlIGRlYnVnZ2luZyBjb2RlLgotCi0JKiBidWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRzeXN0ZW0uYzogTWFqb3IgcmV3cml0ZS4KLQotMjAwNS0wMy0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiB0ZXN0cy8qOiBSZW1vdmVkLgotCi0yMDA1LTAzLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9JTlNUQUxMLkFOWTogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oOiBSZXBsYWNlIGBBdXRvaGludCcgd2l0aCBgQXV0b2ZpdCcuCi0JQWRkIGBPVHZhbGlkJy4KLQotCSogc3JjL2F1dG9maXQvYWZlcnJvcnMuaDogTmV3IGZpbGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMsIHNyYy9hdXRvZml0L2FmaGludHMuYywKLQlzcmMvYXV0b2ZpdC9hZmxhdGluLmMsIHNyYy9hdXRvZml0L2FmbG9hZGVyLmM6IHMvRlRfRXJyXy9BRl9FcnJfLy4KLQlJbmNsdWRlIGFmZXJyb3JzLmguCi0KLQkqIHNyYy9hdXRvZml0L3J1bGVzLm1rIChBVVRPRl9EUlZfSCk6IEluY2x1ZGUgYWZlcnJvcnMuaC4KLQotCSogc3JjL290dmFsaWQvb3R2ZXJyb3IuaDogcy9GVF9Nb2RfRXJyX09UVi9GVF9Nb2RfRXJyX09UdmFsaWQvLgotCi0yMDA1LTAzLTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9hdXRvaGludC8qOiBSZW1vdmVkLgotCSogSmFtZmlsZTogVXBkYXRlZC4KLQotMjAwNS0wMy0xNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jOiBSZW1vdmUgY29tcGlsZXIgd2FybmluZ3MuCi0JKGhhc2hfcmVoYXNoLCBoYXNoX2luaXQpOiBEb24ndCBjYWxsIEZUX01FTV9aRVJPLgotCShfYmRmX2xpc3RfdCk6IEFkZCBgbWVtb3J5JyBmaWVsZC4KLQkoX2JkZl9saXN0X2luaXQsIF9iZGZfbGlzdF9kb25lLCBfYmRmX2xpc3RfZW5zdXJlKTogTmV3IGZ1bmN0aW9ucy4KLQkoX2JkZl9zaGlmdCwgX2JkZl9qb2luKTogUmVuYW1lIHRvLi4uCi0JKF9iZGZfbGlzdF9zaGlmdCwgX2JkZl9saXN0X2pvaW4pOiBUaGlzLgotCShfYmRmX3NwbGl0KTogUmVuYW1lZCB0by4uLgotCShfYmRmX2xpc3Rfc3BsaXQpOiBUaGlzLiAgVXNlIG5ldyBmdW5jdGlvbnMuCi0JKGJkZl9pbnRlcm5hbF9yZWFkc3RyZWFtKTogUmVtb3ZlZC4KLQkoTk9fU0tJUCk6IE5ldyBtYWNyby4KLQkoX2JkZl9yZWFkc3RyZWFtKTogUmV3cml0dGVuLgotCShiZGZfY3JlYXRlX3Byb3BlcnR5LCBfYmRmX2FkZF9jb21tZW50KTogSW1wcm92ZSBhbGxvY2F0aW9uLgotCShfYmRmX3NldF9kZWZhdWx0X3NwYWNpbmcsIF9iZGZfcGFyc2VfZ2x5cGhzKTogVXBkYXRlZC4gIEltcHJvdmUKLQlhbGxvY2F0aW9uLgotCShfYmRmX3BhcnNlX3Byb3BlcnRpZXMsIF9iZGZfcGFyc2Vfc3RhcnQpOiBVcGRhdGVkLgotCShiZGZfbG9hZF9mb250KTogVXBkYXRlZCB0byB1c2UgbmV3IGZ1bmN0aW9ucy4KLQotCSogc3JjL3R5cGUxL3QxcGFyc2UuYyAoY2hlY2tfdHlwZTFfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLgotCShUMV9OZXdfUGFyc2VyKTogVXNlIGl0IHRvIGNoZWNrIGZvbnQgaGVhZGVyIGJlZm9yZSBhbGxvY2F0aW5nCi0JYW55dGhpbmcgb24gdGhlIGhlYXAuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYwkodDQyX3BhcnNlcl9pbml0KTogTW9kaWZ5IGZ1bmN0aW9ucyB0byBjaGVjawotCXRoZSBmb250IGhlYWRlciBiZWZvcmUgYWxsb2NhdGluZyBhbnl0aGluZyBvbiB0aGUgaGVhcC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oIChGVF9BUlJBWV9NQVgsCi0JRlRfQVJSQVlfQ0hFQ0spOiBOZXcgbWFjcm9zLgotCi0JKiBzcmMvYmFzZS9mdHN0cmVhbS5jIChGVF9TdHJlYW1fVHJ5UmVhZCk6IE5ldyBmdW5jdGlvbi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaDogVXBkYXRlZC4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9yZWFkX1RPQyksIHNyYy9wY2YvcGNmdXRpbC5jCi0JKEJpdE9yZGVySW52ZXJ0LCBUd29CeXRlU3dhcCwgRm91ckJ5dGVTd2FwKTogTWlub3IgZml4ZXMgYW5kCi0Jc2ltcGxpZmljYXRpb25zLiAgVHJ5IHRvIHByb3RlY3QgdGhlIFBDRiBkcml2ZXIgZnJvbSBkb2luZyBzdHVwaWQKLQl0aGluZ3Mgd2l0aCBicm9rZW4gZm9udHMuCi0KLQkqIHNyYy9sencvZnRsencuYyAoRlRfU3RyZWFtX09wZW5MWlcpOiBDaGVjayB0aGUgTFpXIGhlYWRlciBiZWZvcmUKLQlkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBhdm9pZHMgdW5uZWNlc3NhcnkgaGVhcCBhbGxvY2F0aW9ucwotCSg0MDBLQnl0ZSBvZiBoZWFwIG1lbW9yeSBmb3IgdGhlIExaVyBkZWNvZGVyKS4KLQotCSogc3JjL2d6aXAvZnRnemlwLmMgKEZUX1N0cmVhbV9PcGVuR3ppcCk6IERpdHRvIGZvciB0aGUgZ3ppcAotCWRlY29kZXIsIGFsdGhvdWdoIHRoZSBjb2RlIHNhdmluZ3MgYXJlIHNtYWxsZXIuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNS0wMy0xMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdG9vbHMvZ2xuYW1lcy5weTogQWRkIGNvbW1lbnQgdG8gZXhwbGFpbiB0aGUgY29tcHJlc3Npb24KLQliZWluZyB1c2VkIGZvciB0aGUgQWRvYmUgR2x5cGggTGlzdC4KLQotMjAwNS0wMy0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2xvYWRfY3Z0LCB0dF9mYWNlX2xvYWRfZnBnbSk6Ci0JRml4IHNlcmlvdXMgdHlwbyB3aGljaCBwcmV2ZW50ZWQgY29ycmVjdCBUVCByZW5kZXJpbmcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaDogVW5kbyBjaGFuZ2UgZnJvbSAyMDA1LTAzLTAzLgotCVRvIHN1cHByZXNzIHdhcm5pbmdzIGl0IGlzIHN1ZmZpY2llbnQgdG8gdXNlIGAtZm5vLXN0cmljdC1hbGlhc2luZycuCi0KLTIwMDUtMDMtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2dsbmFtZXMucHk6IEZvcm1hdHRlZC4KLQlGb3JtYXQgb3V0cHV0IHRvIGJlIGluIHN5bmMgd2l0aCBvdGhlciBGcmVlVHlwZSBjb2RlLgotCUltcG9ydCBgcmUnIGFuZCBgb3MucGF0aCcuCi0JKFN0cmluZ1RhYmxlKSA8X19pbml0X18+OiBBZGQgcGFyYW1ldGVyIHRvIGluaXRpYWxpemUgbWFzdGVyIHRhYmxlCi0JbmFtZS4KLQkoU3RyaW5nVGFibGUpIDxkdW1wPjogRG9uJ3QgcGFzcyBtYXN0ZXIgdGFibGUgbmFtZS4KLQkoU3RyaW5nVGFibGUpIDxkdW1wX3N1Ymxpc3Q+OiBFbWl0IGV4cGxhbmF0b3J5IGNvbW1lbnQuCi0JU2ltcGxpZnkgYW5kIG1ha2Ugb3V0cHV0IG1vcmUgaHVtYW4gcmVhZGFibGUuCi0JKHQxX2JpYXMsIGdseXBoX2xpc3QsIGFkb2JlX2dseXBoX25hbWVzKTogUmVtb3ZlZC4gIFVudXNlZC4KLQkobWFpbik6IFVzZSBgYmFzZW5hbWUnIGZvciBmaWxlIG5hbWUgaW4gaGVhZGVyLgotCi0JKiBzcmMvcHNuYW1lcy9wc3RhYmxlcy5oOiBSZWdlbmVyYXRlZC4KLQotMjAwNS0wMy0wOSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdG9vbHMvZ2xuYW1lcy5weTogUmV3cml0ZSB0aGUgZ2VuZXJhdG9yIGZvciB0aGUgYHBzdGFibGVzLmgnCi0JaGVhZGVyIGZpbGUgd2hpY2ggY29udGFpbnMgdmFyaW91cyBjb25zdGFudCB0YWJsZXMgcmVsYXRlZCB0byBnbHlwaAotCW5hbWVzLiAgSXQgbm93IHVzZXMgYSBkaWZmZXJlbnQsIG1vcmUgY29tcGFjdCBzdG9yYWdlIHNjaGVtZSB0aGF0Ci0Jc2F2ZXMgYWJvdXQgMjBLQi4gIFRoaXMgYWxzbyBjbG9zZXMgU2F2YW5uYWggYnVnICMxMjI2Mi4KLQotCSogc3JjL3BzbmFtZXMvcHN0YWJsZXMuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKHBzX3VuaWNvZGVfdmFsdWUpOiBVc2UKLQlgZnRfZ2V0X2Fkb2JlX2dseXBoX2luZGV4JywgYSBuZXcgZnVuY3Rpb24gZGVmaW5lZCBpbiBgcHN0YWJsZXMuaCcuCi0JKHBzX2dldF9tYWNpbnRvc2hfbmFtZSwgcHNfZ2V0X3N0YW5kYXJkX3N0cmluZ3MpOiBVcGRhdGVkLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfU2V0X0NoYXJfU2l6ZSk6IEhhbmRsZSBmcmFjdGlvbmFsIHNpemVzCi0JbW9yZSBjYXJlZnVsbHkuICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMTIyNjMuCi0KLTIwMDUtMDMtMDYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL290dmFsaWQvb3R2Z3N1Yi5jLCBzcmMvb3R2YWxpZC9vdHZncG9zLmM6IE1ha2Ugc3RhdGljIHRhYmxlcwotCWNvbnN0YW50LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdCk6IEZpeCBTYXZhbm5haCBidWcKLQkjMTIyMTIgKGF1dG8taGludGVyIHJlZnVzZXMgdG8gd29yayBpZiBubyBVbmljb2RlIGNoYXJtYXAgaW4gZm9udCkuCi0KLTIwMDUtMDMtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYXV0b2dlbi5zaDogTmV3IHNjcmlwdCBmb3IgYm9vdHN0cmFwcGluZy4KLQotCSogUkVBRE1FLkNWUzogTmV3IGZpbGUgd2hpY2ggZG9jdW1lbnRzIGJvb3RzdHJhcHBpbmcuCi0KLQkqIGJ1aWxkcy91bml4L2FjbG9jYWwubTQsIGJ1aWxkcy91bml4L2NvbmZpZy5ndWVzcywKLQlidWlsZHMvdW5peC9jb25maWcuc3ViLCBidWlsZHMvdW5peC9jb25maWd1cmUsCi0JYnVpbGRzL3VuaXgvbHRtYWluLnNoOiBSZW1vdmVkLgotCi0yMDA1LTAzLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0dXRpbC5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSC4KLQotMjAwNS0wMy0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JVmFyaW91cyBmaXhlcyBmb3IgQyBhbmQgQysrIGNvbXBpbGluZy4KLQotCSogc3JjL2F1dG9maXQvKjogQWRkIGNvcHlyaWdodCBtZXNzYWdlcy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19kb25lKTogRG9uJ3QgdXNlCi0JYEFGX0RpbWVuc2lvbicgYnV0IGBpbnQnIGZvciBsb29wIGNvdW50ZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyk6IERvbid0IHVzZQotCWBBRl9EaW1lbnNpb24nIGJ1dCBgaW50JyBmb3IgbG9vcCBjb3VudGVyLgotCVVzZSBwcm9wZXIgZW51bWVyYXRpb24gdmFsdWUgZm9yIGByZW5kZXJfbW9kZScuCi0JKGFmX2xhdGluX21ldHJpY3Nfc2NhbGVfZGltKTogRG9uJ3Qgc2hhZG93IHZhcmlhYmxlcy4KLQkoYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyk6IFVzZSBwcm9wZXIgY2FzdCBmb3IgYG1ham9yX2RpcicKLQlhbmQgYHNlZ21lbnRfZGlyJy4KLQkoYWZfbGF0aW5fYWxpZ25fbGlua2VkX2VkZ2UsIGFmX2xhdGluX2hpbnRfZWRnZXMpOiBGaXggYXJndW1lbnRzIG9mIGNhbGwgdG8KLQlgYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoJy4KLQkoYWZfbGF0aW5faGludHNfYXBwbHkpOiBEb24ndCB1c2UgYEFGX0RpbWVuc2lvbicgYnV0IGBpbnQnIGZvciBsb29wCi0JY291bnRlci4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYyAoZnRfbWVtX3RhYmxlX2dldF9zb3VyY2UsIEZUX0R1bXBNZW1vcnkpOiBVc2UKLQlwcm9wZXIgY2FzdCBmb3IgbWVtb3J5IGFsbG9jYXRpb24uCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9rZXJuaW5nKTogVXNlIHByb3BlciBjYXN0IGZvcgotCWluaXRpYWxpemF0aW9uIG9mIGBzZm50Jy4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYzogSW5jbHVkZSBgdHRrZXJuLmgnLgotCi0JKiBzcmMvc2ZudC90dGtlcm4uYyAodHRfZmFjZV9nZXRfa2VybmluZyk6IERvbid0IHNoYWRvdyB2YXJpYWJsZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmM6IEluY2x1ZGUgYHR0cGxvYWQuaCcuCi0KLTIwMDUtMDMtMDMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oIChGVF9BTExPQywgRlRfUkVBTExPQywKLQlGVF9RQUxMT0MsIEZUX1FSRUFMTE9DKSBbZ2NjID49IDMuM106IFByb3ZpZGUgbWFjcm8gdmVyc2lvbnMgd2hpY2gKLQlhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQkoRlRfTkVXLCBGVF9ORVdfQVJSQVksIEZUX1JFTkVXX0FSUkFZLCBGVF9RTkVXLCBGVF9RTkVXX0FSUkFZLAotCUZUX1FSRU5FV19BUlJBWSwgRlRfQUxMT0NfQVJSQVksIEZUX1JFQUxMT0NfQVJSQVkpOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIChGVF9GQUNFX0ZJTkRfU0VSVklDRSwKLQlGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UsIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UpIFtfX2NwbHVzcGx1c106Ci0JUHJvdmlkZSBtYWNybyB2ZXJzaW9ucyB3aGljaCBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL2Jhc2UvZnR1dGlsLmMgKGZ0X2hpZ2hwb3cyKTogTmV3IHV0aWxpdHkgZnVuY3Rpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9wZnIvcGZybG9hZC5jIChwZnJfZ2V0X2dpbmRleCwgcGZyX2NvbXBhcmVfa2Vybl9wYWlycywKLQlwZnJfc29ydF9rZXJuaW5nX3BhaXJzKTogRG9uJ3QgZGVmaW5lIGlmIEZUX09QVElNSVpFX01FTU9SWSBpcyBzZXQuCi0JKHBmcl9waHlfZm9udF9kb25lKTogRG9uJ3QgaGFuZGxlIGBrZXJuX3BhaXJzJyBpZiBGVF9PUFRJTUlaRV9NRU1PUlkKLQlpcyBzZXQuCi0JKHBmcl9waHlfZm9udF9sb2FkKTogRG9uJ3QgY2FsbCBgcGZyX3NvcnRfa2VybmluZ19wYWlycycgaWYKLQlGVF9PUFRJTUlaRV9NRU1PUlkgaXMgc2V0LgotCi0JKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX3Nsb3RfbG9hZCk6IENvbW1lbnQgb3V0IHNvbWUgY29kZSB3aGljaAotCWRvZXNuJ3Qgd29yayB3aXRoIGJyb2tlbiBmb250cy4KLQkocGZyX2ZhY2VfZ2V0X2tlcm5pbmcpIFtGVF9PUFRJTUlaRV9NRU1PUlldOiBJbXBsZW1lbnQuCi0KLQkqIHNyYy9wZnIvcGZydHlwZXMuaCAoUEZSX0tlcm5JdGVtUmVjKTogT3B0aW1pemUgbWVtYmVyIHR5cGVzLgotCShQRlJfTkVYVF9LUEFJUik6IE5ldyBtYWNyby4KLQkoUEZSX1BoeUZvbnRSZWMpOiBEb24ndCBkZWZpbmUgYGtlcm5fcGFpcnMnIGlmIEZUX09QVElNSVpFX01FTU9SWSBpcwotCXNldC4KLQotCSogc3JjL3NmbnQvdHRzYml0MC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSk6IEludHJvZHVjZQotCXRlbXBvcmFyeSB2YXJpYWJsZSB0byBhdm9pZCBnY2Mgd2FybmluZy4KLQkodHRfZmFjZV9sb2FkX3NiaXRfaW1hZ2UpOiBNYXJrIHVudXNlZCB2YXJpYWJsZXMgd2l0aCBGVF9VTlVTRUQuCi0KLQkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfbG9hZF9sb2NhKSBbRlRfT1BUSU1JWkVfTUVNT1JZXToKLQlSZW1vdmUgcmVkdW5kYW50IHZhcmlhYmxlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBNb3ZpbmcgdGhlIG9yZGVyIG9mIGRyaXZlcnMgdG8KLQlzcGVlZCB1cCBmb250IGxvYWRpbmcuICBUaGUgUENGIGFuZCBCREYgbG9hZGVycyBhcmUgc3RpbGwgc2xvdyBhbmQKLQljb25zdW1lIGZhciB0b28gbXVjaCBtZW1vcnkuCi0KLTIwMDUtMDMtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZGV2ZWwvZnRvcHRpb24uaDogVXBkYXRlZCB0byByZWNlbnQgY2hhbmdlcy4KLQotMjAwNS0wMy0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmR1bW15LmMsIHNyYy9hdXRvZml0L2FmZHVtbXkuaAotCShhZl9kdW1teV9zY3JpcHRfY2xhc3MpOiBGaXggdHlwZS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jLCBzcmMvYXV0b2ZpdC9hZmxhdGluLmgKLQkoYWZfbGF0aW5fc2NyaXB0X2NsYXNzKTogRml4IHR5cGUuCi0KLQkqIHNyYy9hdXRvZml0L3J1bGVzLm1rIChBVVRPRl9EUlZfU1JDKTogRml4IHR5cG8uCi0KLTIwMDUtMDMtMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3NmbnQvdHRrZXJuLmMgKHR0X2ZhY2VfbG9hZF9rZXJuLCB0dF9mYWNlX2dldF9rZXJuaW5nKSwKLQlzcmMvc2ZudC90dHNiaXQwLmMgKHR0X2ZhY2VfbG9hZF9zYml0X3N0cmlrZXMsCi0JdHRfc2JpdF9kZWNvZGVyX2xvYWRfYnl0ZV9hbGlnbmVkLCB0dF9zYml0X2RlY29kZXJfbG9hZF9jb21wb3VuZCwKLQl0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSksIHNyYy9zZm50L3R0bG9hZC5jCi0JKHR0X2ZhY2VfbG9hZF9tZXRyaWNzKTogUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmdzCi0JLS0gcmVkdW5kYW50IHZhcmlhYmxlcywgbWlzc2luZyBpbml0aWFsaXphdGlvbnMsIGV0Yy4KLQotCSogc3JjL3NmbnQvdHRzYml0Lmg6IEhhbmRsZSBGVF9PUFRJTUlaRV9NRU1PUlkuCi0KLQkqIHNyYy9hdXRvZml0L3J1bGVzLm1rLCBzcmMvYXV0b2ZpdC9tb2R1bGUubWssCi0Jc3JjL2F1dG9maXQvYWZhbmdsZXMuaDogTmV3IGZpbGVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2F4aXNfaGludHNfbmV3X3NlZ21lbnQsCi0JYWZfYXhpc19oaW50c19uZXdfZWRnZSk6IE5ldyBmdW5jdGlvbnMuCi0JKGFmX2dseXBoX2hpbnRzX2RvbmUpOiBEbyBwcm9wZXIgZGVhbGxvY2F0aW9uLgotCShhZl9nbHlwaF9oaW50c19yZWxvYWQpOiBPbmx5IHJlYWxsb2NhdGUgcG9pbnRzIGFycmF5LiAgVGhpcwotCWRyYXN0aWNhbGx5IHJlZHVjZXMgaGVhcCB1c2FnZS4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9Qb2ludFJlYywgQUZfU2VnbWVudFJlYyk6IE9wdGltaXplCi0JbWVtYmVyIHR5cGVzIGFuZCBwb3NpdGlvbnMuCi0JKEFGX0F4aXNIaW50c1JlYyk6IEFkZCBgbWF4X3NlZ21lbnRzJyBhbmQgYG1heF9lZGdlcycuCi0JKGFmX2F4aXNfaGludHNfbmV3X3NlZ21lbnQsIGFmX2F4aXNfaGludHNfbmV3X2VkZ2UpOiBOZXcgcHJvdG90eXBlcy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX3NjYWxlKTogRG9uJ3QgY2FsbAotCUFGX1NDQUxFUl9FUVVBTF9TQ0FMRVMuCi0JKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gRlRfRXJyb3IuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCUltcHJvdmUgc2VnbWVudCBhbGxvY2F0aW9uLgotCShhZl9sYXRpbl9oaW50c19jb21wdXRlX2VkZ2VzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIEZUX0Vycm9yLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQlJbXByb3ZlIGVkZ2UgYWxsb2NhdGlvbiBhbmQgbGluayBoYW5kbGluZy4KLQkoYWZfbGF0aW5faGludHNfZGV0ZWN0X2ZlYXR1cmVzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIEZUX0Vycm9yLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5oOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nKQotCTxGVF9HTFlQSF9GT1JNQVRfT1VUTElORT46IEFzc3VyZSBheGlzLT5udW1fZWRnZXMgPiAxLiAgVGhpcyBmaXhlcwotCWEgYnVnIHdpdGggY2VydGFpbiBmb250cy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaDogVGhlIGF1dG8tZml0dGVyIGlzIG5vdyB0aGUKLQlvbmx5IHN1cHBvcnRlZCBhdXRvLWhpbnRpbmcgbW9kdWxlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oIChGVF9JTlRfTUFYKTogTmV3IG1hY3JvLgotCi0yMDA1LTAyLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfbG9hZF9sb2NhKTogRml4IHR5cG8uCi0KLQkqIHNyYy9zZm50L3R0a2Vybi5jOiBJbmNsdWRlIGB0dGtlcm4uaCcuCi0JKEZUX0NPTVBPTkVOVCk6IFVwZGF0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGQgZW50cnkgZm9yIGB0dGtlcm4nLgotCi0JKiBzcmMvc2ZudC90dHNiaXQwLmM6IHMvRlRfRXJyXy9TRk5UX0Vycl8vLgotCURlY29yYXRlIGNvbnN0YW50cyB3aXRoIGBVJyBhbmQgYEwnIHdoZXJlIG5lY2Vzc2FyeS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X25leHQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCi0yMDA1LTAyLTI4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKEZUX0R1bXBNZW1vcnkpOiBBZGRlZCBzb3J0aW5nIG9mIG1lbW9yeQotCXNvdXJjZXMgYWNjb3JkaW5nIHRvIGRlY3JlYXNpbmcgbWF4aW11bSBjdW11bGF0aXZlIGFsbG9jYXRpb25zLgotCShmdF9tZW1fc291cmNlX2NvbXBhcmUpOiBOZXcgYXV4aWxpYXJ5IGZ1bmN0aW9uLgotCi0JKiBzcmMvc2ZudC90dHNiaXQwLmM6IE5ldyBmaWxlLCBpbXBsZW1lbnRpbmcgYSBoZWFwLW9wdGltaXplZAotCWVtYmVkZGVkIGJpdG1hcCBsb2FkZXIuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jOiBJbmNsdWRlIGBmdDJidWlsZC5oJywgRlRfSU5URVJOQUxfREVCVUdfSCwKLQlGVF9JTlRFUk5BTF9TVFJFQU1fSCwgRlRfVFJVRVRZUEVfVEFHU19ILgotCUxvYWQgYHR0c2JpdDAuYycgaWYgRlRfT1BUSU1JWkVfTUVNT1JZIGlzIHNldCwgb3RoZXJ3aXNlIHVzZQotCWZpbGUgY29udGVudHMuCi0JKHR0X2ZhY2VfbG9hZF9zYml0X3N0cmlrZXMpOiBTZXQgdXAgcm9vdCBmaWVsZHMgdG8gaW5kaWNhdGUgdGhlCi0Jc3RyaWtlcy4gIFRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMxMjEwNy4KLQlVc2UgYHN0YXRpYycga2V5d29yZCBmb3IgYHNiaXRfbGluZV9tZXRyaWNzX2ZpZWxkJywKLQlgc3RyaWtlX3N0YXJ0X2ZpZWxkcycsIGBzdHJpa2VfZW5kX2ZpZWxkcycuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GYWNlUmVjKTogRGVmaW5lCi0JYHNiaXRfdGFibGUnLCBgc2JpdF90YWJsZV9zaXplJywgYHNiaXRfbnVtX3N0cmlrZXMnIGlmCi0JRlRfT1BUSU1JWkVfTUVNT1JZIGlzIHNldC4KLQlEb24ndCBkZWZpbmUgYG51bV9zYml0X3N0cmlrZXMnIGFuZCBgc2JpdF9zdHJpa2VzJyBpZgotCUZUX09QVElNSVpFX01FTU9SWSBpcyBzZXQuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChzYml0X3NpemVfcmVzZXQpOiBIYW5kbGUgRlRfT1BUSU1JWkVfTUVNT1JZLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBGaXhlZCBidWcgdGhhdCBwcmV2ZW50ZWQKLQlsb2FkaW5nIFNGTlQgZm9udHMgd2l0aG91dCBhIGBrZXJuJyB0YWJsZS4KLQlQcm9wZXJseSBwYXNzIHJvb3QtPmZhY2VfZmxhZ3MuCi0JUmVtb3ZlIGNvZGUgZm9yIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUy4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9pbnRlcmZhY2UpCi0JW1RUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQU106IERvbid0IHVzZSBgdHRfZmluZF9zYml0X2ltYWdlJwotCWFuZCBgdHRfbG9hZF9zYml0X21ldHJpY3MnLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYzogT3B0aW1pemUgbGluZWFyIGNoYXJtYXAgc2Nhbm5pbmcgZm9yIEZvcm1hdCA0LgotCShPUFRfQ01BUDQpOiBOZXcgbWFjcm8uCi0JKFRUX0NNYXA0UmVjKSBbT1BUX0NNQVA0XTogTmV3IHN0cnVjdHVyZS4KLQkodHRfY21hcDRfaW5pdCwgdHRfY21hcDRfc2V0X3JhbmdlLCB0dF9jbWFwNF9uZXh0LCB0dF9jbWFwNF9yZXNldCkKLQlbT1BUX0NNQVA0XTogTmV3IGZ1bmN0aW9ucy4KLQkodHRfY21hcDRfY2hhcl9uZXh0KSBbT1BUX0NNQVA0XTogVXNlIGB0dF9jbWFwNF9uZXh0JyBhbmQKLQlgdHRfY21hcDRfcmVzZXQnLgotCSh0dF9jbWFwNF9jbGFzc19yZWMpIFtPUFRfQ01BUDRdOiBVc2UgYFRUX0NNYXA0UmVjJyBhbmQKLQlgdHRfY21hcDRfaW5pdCcuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAoUmVzZXRfU0JpdF9TaXplKTogSGFuZGxlCi0JRlRfT1BUSU1JWkVfTUVNT1JZLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmggKEFGX1BvaW50UmVjLCBBRl9TZWdtZW50UmVjLCBBRl9FZGdlUmVjKToKLQlPcHRpbWl6ZSBtZW1iZXIgdHlwZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9kb25lKTogQ2FsbAotCWBhZl9nbHlwaF9oaW50c19kb25lJy4KLQotMjAwNS0wMi0yNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvc2ZudC90dGtlcm4uYyAodHRfZmFjZV9sb2FkX2tlcm4pOiBGaXggYSBzbWFsbCBidWcgd2hpY2gKLQljYXVzZWQgaW52YWxpZCAocmFuZG9tKSByZXR1cm4gdmFsdWVzIGZvciB0aGUgaG9yaXpvbnRhbCBrZXJuaW5nLgotCi0yMDA1LTAyLTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlJbXBsZW1lbnQgc2V2ZXJhbCBtZW1vcnkgb3B0aW1pemF0aW9ucyB0byBkcmFzdGljYWxseSByZWR1Y2UgdGhlCi0JaGVhcCB1c2FnZSBvZiBGcmVlVHlwZSwgZXNwZWNpYWxseSBpbiB0aGUgY2FzZSBvZiBtZW1vcnktbWFwcGVkCi0JZmlsZXMuICBUaGUgaWRlYSBpcyB0byBhdm9pZCBsb2FkaW5nIGFuZCBkZWNvZGluZyB0YWJsZXMgaW4gdGhlCi0JaGVhcCwgYW5kIGluc3RlYWQgYWNjZXNzIHRoZSByYXcgZGF0YSB3aGVuZXZlciBwb3NzaWJsZSAoaS5lLiwgd2hlbgotCWl0IGRvZXNuJ3QgY29tcHJvbWlzZSBwZXJmb3JtYW5jZSkuCi0KLQlUaGlzIGhhcyBzZXZlcmFsIGJlbmVmaXRzOiBGb3IgZXhhbXBsZSwgb3BlbmluZyB2ZXJhLnR0ZiBub3cgdXNlcwotCWp1c3QgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IChldmVuIHdoZW4gdGhlIEZUX0xpYnJhcnkgZm9vdHByaW50IGlzCi0JYWNjb3VudGVkIGZvciksIHVudGlsIHlvdSBzdGFydCBsb2FkaW5nIGdseXBocy4gIEV2ZW4gdGhlbiwgeW91IHNhdmUKLQlhdCBsZWFzdCAyMEtCIGNvbXBhcmVkIHRvIHRoZSBub24tb3B0aW1pemVkIGNhc2UuICBQZXJmb3JtYW5jZSBvZgotCXZhcmlvdXMgb3BlcmF0aW9ucywgaW5jbHVkaW5nIG9wZW4gYW5kIGNsb3NlLCBoYXMgYWxzbyBiZWVuCi0JZHJhbWF0aWNhbGx5IGltcHJvdmVkLgotCi0JTW9yZSBvcHRpbWl6YXRpb25zIHRvIGNvbWUsIGVzcGVjaWFsbHkgZm9yIHRoZSBhdXRvLWhpbnRlci4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggKFRUX0ZhY2VfR2V0S2VybmluZ0Z1bmMpOiBOZXcKLQlmdW5jdGlvbiB0eXBlLgotCShTRk5UX0ludGVyZmFjZSk6IEFkZCBpdC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0hkbXhFbnRyeVJlYywgVFRfSGRteFJlYywKLQlUVF9LZXJuMF9QYWlyUmVjKTogRG9uJ3QgZGVmaW5lIGlmIEZUX09QVElNSVpFX01FTU9SWSBpcyBzZXQuCi0JKFRUX0ZhY2VSZWMpOiBEZWZpbmUgYGhvcnpfbWV0cmljcycsIGBob3J6X21ldHJpY3Nfc2l6ZScsCi0JYHZlcnRfbWV0cmljcycsIGB2ZXJ0X21ldHJpY3Nfc2l6ZScsIGBoZG14X3RhYmxlJywKLQlgaGRteF90YWJsZV9zaXplJywgYGhkbXhfcmVjb3JkX2NvdW50JywgYGhkbXhfcmVjb3JkX3NpemUnLAotCWBoZG14X3JlY29yZF9zaXplcycsIGBrZXJuX3RhYmxlJywgYGtlcm5fdGFibGVfc2l6ZSwKLQlgbnVtX2tlcm5fdGFibGVzJywgYGtlcm5fYXZhaWxfYml0cycsIGBrZXJuX29yZGVyX2JpdHMnIGlmCi0JRlRfT1BUSU1JWkVfTUVNT1JZIGlzIHNldC4KLQlEb24ndCBkZWZpbmUgYGhkbXgnLCBgbnVtX2tlcm5fcGFpcnMnLCBga2Vybl90YWJsZV9pbmRleCcsCi0JYGtlcm5fcGFpcnMnIGlmIEZUX09QVElNSVpFX01FTU9SWSBpcyBzZXQuCi0KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKGZ0X21lbV90YWJsZV9zZXQpOiBEb24ndCBzaGFkb3cgdmFyaWFibGUuCi0JRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoR2V0X0tlcm5pbmcpOiBSZW5hbWVkIHRvLi4uCi0JKGNmZl9nZXRfa2VybmluZyk6IFRoaXMuICBTaW1wbGlmeS4KLQkoY2ZmX2RyaXZlcl9jbGFzcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L0phbWZpbGUgKF9zb3VyY2VzKTogQWRkIGB0dGtlcm4nLgotCSogc3JjL3NmbnQvcnVsZXMubWsgKFNGTlRfRFJWX1NSQyk6IEFkZCBgdHRrZXJuLmMnLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2ludGVyZmFjZSk6IEFkZCBgdHRfZmFjZV9nZXRfa2VybmluZycuCi0KLQkqIHNyYy9zZm50L3NmbnQuYzogSW5jbHVkZSBgdHRrZXJuLmMnLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYzogSW5jbHVkZSBgdHRrZXJuLmgnLgotCShzZm50X2xvYWRfZmFjZSk6IENvbnNpZGVyIHRoZSBga2VybicgYW5kIGBnYXNwJyB0YWJsZSBhcyBvcHRpb25hbC4KLQkoc2ZudF9kb25lX2ZhY2UpOiBDYWxsIGB0dF9mYWNlX2RvbmVfa2VybicuCi0JSGFuZGxlIGhvcml6b250YWwgbWV0cmljcyBmb3IgRlRfT1BUSU1JWkVfTUVNT1JZLgotCi0JKiBzcmMvc2ZudC90dGtlcm4uYywgc3JjL3NmbnQvdHRrZXJuLmg6IE5ldyBmaWxlcy4gIENvZGUgaGFzIGJlZW4KLQl0YWtlbiBmcm9tIGB0dGxvYWQuYycgYW5kIGB0dGxvYWQuaCcuCi0JUHJvdmlkZSBzcGVjaWFsIHZlcnNpb25zIG9mIGB0dF9mYWNlX2xvYWRfa2VybicsCi0JYHR0X2ZhY2VfZ2V0X2tlcm5pbmcnLCBhbmQgYHR0X2ZhY2VfZG9uZV9rZXJuJyBmb3IKLQlGVF9PUFRJTUlaRV9NRU1PUlkuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfbWV0cmljcywgdHRfZmFjZV9sb2FkX2hkbXgsCi0JdHRfZmFjZV9mcmVlX2hkbXgpOiBQcm92aWRlIHZlcnNpb24gZm9yIEZUX09QVElNSVpFX01FTU9SWS4KLQkodHRfZmFjZV9sb2FkX2tlcm4sIHR0X2tlcm5fcGFpcl9jb21wYXJlLCBUVF9LRVJOX0lOREVYKTogTW92ZWQgdG8KLQlgdHRrZXJuLmMnLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuaDogVXBkYXRlZC4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHNiaXRfbWV0cmljc19maWVsZCk6IEFkZCBgc3RhdGljJyBrZXl3b3JkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoR2V0X0tlcm5pbmcpOiBSZW5hbWVkIHRvLi4uCi0JKHR0X2dldF9rZXJuaW5nKTogVGhpcy4gIFNpbXBsaWZ5LgotCSh0dF9kcml2ZXJfY2xhc3MpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9HZXRfTWV0cmljcyk6IFJlbmFtZWQgdG8uLi4KLQkodHRfZmFjZV9nZXRfbWV0cmljcyk6IFRoaXMuICBQcm92aWRlIHZlcnNpb24gZm9yIEZUX09QVElNSVpFX01FTU9SWS4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKEdldF9BZHZhbmNlX1dpZHRocyk6IFJlcGxhY2VkIHdpdGguLi4KLQkoR2V0X0FkdmFuY2VfV2lkdGhQdHIpOiBUaGlzLiAgUHJvdmlkZSB2ZXJzaW9uIGZvcgotCUZUX09QVElNSVpFX01FTU9SWS4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmg6IFVwZGF0ZWQuCi0KLTIwMDUtMDItMjIgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYzogUGFydGx5IHJld3JpdHRlbi4gIEFkZGVkIHRoZSBhYmlsaXR5IHRvIGxpc3QKLQlhbGwgYWxsb2NhdGlvbiBzaXRlcyBpbiB0aGUgbWVtb3J5IGRlYnVnZ2VyLiAgQWxzbyBhIG5ldyBmdW5jdGlvbgotCUZUX0R1bXBNZW1vcnkoKSB3YXMgYWRkZWQuICBJdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBidWlsZHMgd2l0aAotCUZUX0RFQlVHX01FTU9SWSBkZWZpbmVkLCBhbmQgeW91IG11c3QgZGVjbGFyZSBpdCBpbiB5b3VyIG93biBjb2RlIHRvCi0JdXNlIGl0LCBpLmUuLCB3aXRoIHNvbWV0aGluZyBsaWtlOgotCi0JICBleHRlcm4gdm9pZCBGVF9EdW1wTWVtb3J5KCBGVF9NZW1vcnkgKTsKLQotCSAgLi4uCi0KLQkgIEZUX0R1bXBNZW1vcnkoIG1lbW9yeSApOwotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIpOiBDb21tZW50IG91dCBkZWZpbml0aW9uIC0tCi0JYWdhaW4uCi0JKEZUX09QVElNSVpFX01FTU9SWSk6IE5ldyBjb25maWd1cmF0aW9uIG1hY3JvIHRvIGNvbnRyb2wgdmFyaW91cwotCW9wdGltaXphdGlvbnMgZm9yIHJlZHVjaW5nIHRoZSBoZWFwIGZvb3RwcmludCBvZiBtZW1vcnktbWFwcGVkCi0JVHJ1ZVR5cGUgZmlsZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCAoRlRfQVJSQVlfWkVSTyk6IE5ldwotCWNvbnZlbmllbmNlIG1hY3JvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZVJlYykKLQlbRlRfT1BUSU1JWkVfTUVNT1JZXTogVXNlIG9wdGltaXplZCB0eXBlcyBmb3IgYG51bV9sb2NhdGlvbnMnIGFuZAotCWBnbHlwaF9sb2NhdGlvbnMnLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogQ2FsbAotCWB0dF9mYWNlX2dldF9sb2NhdGlvbicuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZmFjZV9pbml0KQotCVtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogSW1wcm92ZSBlcnJvciBoYW5kbGluZy4KLQkodHRfZmFjZV9kb25lKTogQ2FsbCBgdHRfZmFjZV9kb25lX2xvY2EnLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2dldF9sb2NhdGlvbiwgdHRfZmFjZV9kb25lX2xvY2EpOgotCU5ldyBmdW5jdGlvbnMuICBJZiBGVF9PUFRJTUlaRV9NRU1PUlkgaXMgc2V0LCB0aGUgbG9jYXRpb25zIHRhYmxlIGlzCi0JcmVhZCBkaXJlY3RseSBmcm9tIG1lbW9yeS1tYXBwZWQgc3RyZWFtcywgaW5zdGVhZCBvZiBiZWluZyBkZWNvZGVkCi0JaW50byB0aGUgaGVhcC4KLQkodHRfZmFjZV9sb2FkX2xvY2EpIFtGVF9PUFRJTUlaRV9NRU1PUlldOiBOZXcgaW1wbGVtZW50YXRpb24uCi0JKHR0X2ZhY2VfbG9hZF9jdnQsIHR0X2ZhY2VfbG9hZF9mcGdtKTogT25seSBsb2FkIHRhYmxlIGlmIHRoZQotCWJ5dGVjb2RlIGludGVycHJldGVyIGlzIGNvbXBpbGVkIGluLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhnbHlwaC5jIChhaF9vdXRsaW5lX2xvYWQpOiBJbXByb3ZlIGFsbG9jYXRpb24KLQlsb2dpYy4KLQotMjAwNS0wMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9sdG1haW4uc2g6IFJlZ2VuZXJhdGVkIHdpdGggYGxpYnRvb2xpemUgLS1mb3JjZQotCS0tY29weScgZnJvbSBsaWJ0b29sIDEuNS4xNC4KLQkqIGJ1aWxkcy91bml4L2FjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkIHdpdGggYGFjbG9jYWwgLUkgLicgZnJvbQotCWF1dG9tYWtlIDEuOS40LgotCi0JKiBidWlsZHMvdW5peC9jb25maWcuZ3Vlc3MsIGJ1aWxkcy91bml4L2NvbmZpZy5zdWI6IFVwZGF0ZWQgZnJvbQotCWBjb25maWcnIENWUyBtb2R1bGUgYXQgc3VidmVyc2lvbnMuZ251Lm9yZy4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC1zaCwgYnVpbGRzL3VuaXgvbWtpbnN0YWxsZGlyczogVXBkYXRlZCBmcm9tCi0JYHRleGluZm8nIENWUyBtb2R1bGUgYXQgc3VidmVyc2lvbnMuZ251Lm9yZy4KLQotMjAwNS0wMi0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmNtYXAuYyAoY2ZmX2NtYXBfdW5pY29kZV9pbml0KTogRG9uJ3QgdHJ5IHRvIGJ1aWxkCi0JYSBjbWFwIGZvciBhIENJRC1rZXllZCBmb250IHdoaWNoIGRvZXNuJ3QgaGF2ZSBTSURzLgotCi0yMDA1LTAyLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocmVhZF9iaW5hcnlfZGF0YSk6IFJldHVybiBtb3JlIG1lYW5pbmdmdWwKLQl2YWx1ZS4KLQkocGFyc2VfZW5jb2RpbmcsIHBhcnNlX3N1YnJzLCBwYXJzZV9jaGFyc3RyaW5ncywgcGFyc2VfZGljdCk6IENoZWNrCi0JcGFyc2VyIGVycm9yIHZhbHVlIGFmdGVyIGNhbGwgdG8gVDFfU2tpcF9QU19Ub2tlbiAod2hlcmUgbmVjZXNzYXJ5KS4KLQotCSogc3JjL3R5cGUxL3QxcGFyc2UuYyAoVDFfR2V0X1ByaXZhdGVfRGljdCk6IENoZWNrIHBhcnNlciBlcnJvcgotCXZhbHVlIGFmdGVyIGNhbGwgdG8gVDFfU2tpcF9QU19Ub2tlbi4KLQotCSogc3JjL2NpZC9jaWRwYXJzZS5jIChjaWRfcGFyc2VyX25ldyk6IENoZWNrIHBhcnNlciBlcnJvciB2YWx1ZQotCWFmdGVyIGNhbGwgdG8gY2lkX3BhcnNlcl9za2lwX1BTX3Rva2VuLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9lbmNvZGluZywgdDQyX3BhcnNlX3NmbnRzLAotCXQ0Ml9wYXJzZV9jaGFyc3RyaW5ncywgdDQyX3BhcnNlX2RpY3QpOiBDaGVjayBwYXJzZXIgZXJyb3IgdmFsdWUKLQlhZnRlciBjYWxsIHRvIFQxX1NraXBfUFNfVG9rZW4gKHdoZXJlIG5lY2Vzc2FyeSkuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAoc2tpcF9zdHJpbmcsIHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuLAotCXBzX3RvYnl0ZXMpOiBBZGQgZXJyb3IgbWVzc2FnZXMuCi0KLTIwMDUtMDItMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogY29uZmlndXJlOiBPdXRwdXQgbW9yZSB2YXJpYWJsZXMgdG8gdGhlIGNyZWF0ZWQgTWFrZWZpbGUgc28gdGhhdAotCWl0IGNhbiBiZSB1c2VkIGZvciBmdDJkZW1vcyBhbHNvIChpZiB0aGUgRlQyREVNT1MgdmFyaWFibGUgaXMKLQlkZWZpbmVkKS4KLQotMjAwNS0wMi0xMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcGZyL3Bmcmdsb2FkLmMgKHBmcl9nbHlwaF9sb2FkKTogRml4IGFuIHVuYm91bmRlZCBncm93aW5nCi0JZHluYW1pYyBhcnJheSB3aGVuIGxvYWRpbmcgYSBnbHlwaCBmcm9tIGEgUEZSIGZvbnQgKFNhdmFubmFoIGJ1ZwotCSMxMTkyMSkuCi0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKEZUX0JpdG1hcF9Db252ZXJ0KTogU21hbGwgaW1wcm92ZW1lbnRzIHRvIHRoZQotCWNvbnZlcnNpb24gZnVuY3Rpb24gKG1haW5seSBzdHVwaWQgb3B0aW1pemF0aW9uKS4KLQotCSogc3JjL2Jhc2UvSmFtZmlsZTogQWRkaW5nIGZ0Yml0bWFwLmMgdG8gdGhlIGxpc3Qgb2YgY29tcGlsZWQgZmlsZXMuCi0KLTIwMDUtMDItMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluOiBBZGQgbmV3IGZsYWcgYC0tZnR2ZXJzaW9uJyB0bwotCXJldHVybiB0aGUgRnJlZVR5cGUgdmVyc2lvbi4gIFN1Z2dlc3RlZCBieSBHZW9yZ2UgV2lsbGlhbXMKLQk8Z3d3QHNpbGNvbS5jb20+LgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDUtMDItMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL290dmFsaWQvb3R2bW9kLmMgKG90dl92YWxpZGF0ZSk6IERlYWxsb2NhdGUgYXJyYXlzIGluIGNhc2UKLQlvZiBlcnJvci4gIFJlcG9ydGVkIGJ5IFlBTUFOTy1VQ0hJIEhpZGV0b3NoaSA8bWVyQGRpbi5vci5qcD4uCi0KLTIwMDUtMDItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpCi0JPG9wX2Nsb3NlcGF0aD46IEFjY2VwdCBgVDFfUGFyc2VfSGF2ZV9Nb3ZldG8nIHN0YXRlIGFsc28gd2hpY2ggY2FuCi0JaGFwcGVuIGluIGVtcHR5IGdseXBocy4gIFJlcG9ydGVkIGJ5IElhbiBCcm93bgotCTxpYW4uYnJvd25AcHJpbnRzb2Z0LmRlPiAoU2F2YW5uYWggYnVnICMxMTg1NikuCi0KLTIwMDUtMDItMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL290bGF5b3V0Lyo6IFJlbW92ZWQuICBPYnNvbGV0ZS4KLQotMjAwNC0xMi0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9sdG1haW4uc2g6IFJlZ2VuZXJhdGVkIHdpdGggYGxpYnRvb2xpemUgLS1mb3JjZQotCS0tY29weScgZnJvbSBsaWJ0b29sIDEuNS4xMC4KLQkqIGJ1aWxkcy91bml4L2FjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkIHdpdGggYGFjbG9jYWwgLUkgLicgZnJvbQotCWF1dG9tYWtlIDEuOS40LgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuNTliLgotCi0JKiBidWlsZHMvdW5peC9jb25maWcuZ3Vlc3MsIGJ1aWxkcy91bml4L2NvbmZpZy5zdWI6IFVwZGF0ZWQgZnJvbQotCWBjb25maWcnIENWUyBtb2R1bGUgYXQgc3VidmVyc2lvbnMuZ251Lm9yZy4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC1zaDogVXBkYXRlZCBmcm9tCi0JYHRleGluZm8nIENWUyBtb2R1bGUgYXQgc3VidmVyc2lvbnMuZ251Lm9yZy4KLQotCSogYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYyAoRlRfU3RyZWFtX09wZW4pOiBBZGQgcHJvcGVyIGNhc3QgZm9yCi0JZnRfYWxsb2MuCi0JRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMDQtMTItMjcgIERpcmNrIEJsYXNrZXkgIDxsaXN0dGFyZ2V0QGRhbmJhbGEuY29tPgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IEltcHJvdmUgY29tcHV0YXRpb24gb2YKLQlGVF9TVFlMRV9CT0xEX0ZMQUcuCi0KLTIwMDQtMTItMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBBIENGRiB3aXRoaW4gYW4gU0ZOVCBjYW4gaGF2ZQotCW9ubHkgYSBzaW5nbGUgZm9udC4gIFRoaXMgaXMgdW5kb2N1bWVudGVkIGJ1dCBoYXMgYmVlbiB2ZXJpZmllZCBvbgotCXRoZSBvcGVudHlwZSBsaXN0LgotCi0yMDA0LTEyLTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIEphbWZpbGUgKEZUMl9DT01QT05FTlRTKTogQWRkIGBvdHZhbGlkJy4KLQotMjAwNC0xMi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfQ29udmVydCk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCi0yMDA0LTEyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHZtc19tYWtlLmNvbTogQWRkIGZ0Yml0bWFwLm9iai4KLQotMjAwNC0xMi0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0Yml0bWFwLmg6IE5ldyBmaWxlcyBmb3IKLQloYW5kbGluZyB2YXJpb3VzIGJpdG1hcCBmb3JtYXRzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9CSVRNQVBfSCk6IE5ldyBtYWNyby4KLQotCSogc3JjL2Jhc2UvcnVsZXMubWsgKEJBU0VfRVhUX1NSQyk6IEFkZCBmdGJpdG1hcC5jLgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9HbHlwaF9Mb2FkKTogRG9uJ3QgY29udmVydCBiaXRtYXBzIHRvIDhicHAKLQlidXQgcmV0dXJuIHRoZW0gYXMtaXMuCi0KLQkqIGRvY3MvQ0hBTkdFUzogTWVudGlvbiBuZXcgYml0bWFwIEFQSS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjaGFwdGVycy5oOiBVcGRhdGVkLgotCi0yMDA0LTEyLTExICBSb2JlcnQgQ2xhcmsgIDxmcmVldHlwZUByYXR0eS5vcmcudWs+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfS2VybmluZyk6IE1ha2Uga2VybmluZyBhbW91bnQKLQlkZXBlbmRlbnQgb24gcHBlbSBieSBzY2FsaW5nIGRvd24gZm9yIHBwZW0gPCAyNSwgdGhlbiBkbyBub3JtYWwKLQlyb3VuZGluZy4gIFRoaXMgZ2l2ZXMgc2xpZ2h0bHkgYmV0dGVyIHJlc3VsdHMgdGhhbiByb3VuZGluZyB0b3dhcmRzCi0JemVyby4KLQotMjAwNC0xMi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X0tlcm5pbmcpOiBBbHdheXMgcm91bmQgdG93YXJkcyB6ZXJvCi0JZm9yIEZUX0tFUk5JTkdfREVGQVVMVC4gIFRoaXMgZ3JlYXRseSBlbmhhbmNlcyB0aGUga2VybmluZyBmb3IKLQlzbWFsbCBwcGVtIHZhbHVlcy4KLQotMjAwNC0xMi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfZ2x5cGhzbG90X2NsZWFyKTogUmVzZXQgYGxzYl9kZWx0YScgYW5kCi0JYHJzYl9kZWx0YScuCi0KLTIwMDQtMTItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5tayAoaW5zdGFsbCk6IFVzZSAkKE9CSl9CVUlMRCkgZm9yIGZ0Y29uZmlnLmguCi0KLTIwMDQtMTItMDMgIEFudG9pbmUgTGVjYSAgPEFudG9pbmUtRnJlZXR5cGVATGVjYS1NYXJ0aS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaDogVXBkYXRlZCB0byBsYXRlc3QKLQlzcGVjaWZpY2F0aW9ucyBmcm9tIE1pY3Jvc29mdC4KLQotMjAwNC0xMS0yNiAgSm91ayBKYW5zZW4gIDxqb3VrakBocmVtLnN0bS50dWRlbGZ0Lm5sPgotCi0JKiB2bXNfbWFrZS5jb206IEluY2x1ZGUgZnRiYm94LmMuCi0JRml4IGBjY29wdCcuCi0JSGFuZGxlIGBvdHZhbGlkJyBtb2R1bGUuCi0JVXBkYXRlIGB2bXNsaWIuZGF0JyBkZWZhdWx0IHZhbHVlcy4KLQlGaXhlcyB0byBgbGlicy5vcHQnLgotCi0yMDA0LTExLTIzICBBbmRlcnMgS2FzZW9yZyAgPGFuZGVyc0BrYXNlb3JnLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PcmllbnRhdGlvbkV4dHJlbXVtUmVjLAotCWZ0X29yaWVudGF0aW9uX2V4dHJlbXVtX2NvbXB1dGUpOiBSZW1vdmVkLgotCShGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbik6IFJld3JpdHRlbiwgc2ltcGxpZmllZC4KLQotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYzogSW5jbHVkZSBGVF9PVVRMSU5FX0guCi0JKGFoX3Rlc3RfZXh0cmVtdW0sIGFoX2dldF9vcmllbnRhdGlvbik6IFJlbW92ZWQuCi0JKGFoX291dGxpbmVfbG9hZCk6IFVzZSBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbi4KLQotCSogc3JjL2Jhc2UvZnRzeW50aC5jIChmdF90ZXN0X2V4dHJlbWEsIGZ0X2dldF9vcmllbnRhdGlvbik6IFJlbW92ZWQuCi0JKEZUX0dseXBoU2xvdF9FbWJvbGRlbik6IFVzZSBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbi4KLQotMjAwNC0xMS0yMyAgRmVybmFuZG8gUGFwYSAgPGZwYXBhQG5ldGdhdGUuY29tLnV5PgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaDogRml4IHR5cG8uCi0KLTIwMDQtMTEtMjIgIEFudG9pbmUgTGVjYSAgPEFudG9pbmUtRnJlZXR5cGVATGVjYS1NYXJ0aS5vcmc+Ci0KLQkqIGJ1aWxkcy93aW4zMi9kZXRlY3QubWs6IENvcnJlY3RlZCBsb2dpYyB0aGF0IGRldGVjdHMgV2luZG93cyBOVCB0bwotCXVzZSB0aGUgcHJldmlvdXMgY2hhbmdlIGV2ZW4gaWYgd2luMzIgaXMgZm9yY2VkLiAgQ29ycmVjdGVkCi0JZGV0ZWN0aW9uIG9mIHdpbjMyIG9uIFdpbjlYLgotCi0JKiBidWlsZHMvZG9zL2RldGVjdC5tazogQWRkZWQgc2FtZSBjb3JyZWN0aW9uIGFzIGZvciB3aW4zMiBhYm91dAotCUNPUFkgb24gV2luZG93cyBOVC4gIERldGVjdGlvbiBvZiBwbGFpbiBET1MgNy54LgotCi0yMDA0LTExLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9kZXRlY3QubWs6IFVuZG8gY2hhbmdlIGZyb20gMjAwNC0xMS0yMC4KLQkqIGJ1aWxkcy93aW4zMi9kZXRlY3QubWs6IElmIHRoZSBgT1MnIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5zCi0JYFdpbmRvd3NfTlQnLCB1c2UgYGNtZC5leGUgL2MgY29weScgZm9yIGNvcHlpbmcgZmlsZXMuCi0KLTIwMDQtMTEtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL2RldGVjdC5tayAoZG9zX3NldHVwKTogVXNlIGBjbWQuZXhlJyBmb3IgY29weWluZwotCSQoQ09ORklHX01LKSB0byBmb3JjZSBsb3dlcmNhc2UgZmlsZSBuYW1lIHVuZGVyIFdpbmRvd3MuCi0KLTIwMDQtMTEtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBhIHNlcmlvdXMgYnVnIGluIHRoZSBUVCBoaW50ZXIuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKTogRG9uJ3Qgc2hpZnQKLQlwb2ludHMgdmVydGljYWxseSBiZWZvcmUgaGludGluZy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0JKiBzcmMvY2FjaGUvZnRjZ2x5cGguYyAoRlRDX0dOb2RlX1Vuc2VsZWN0RmFtaWx5LAotCUZUQ19HQ2FjaGVfTG9va3VwKTogQSBuZXcgdHJ5IHRvIGZpeCBjb21wYXJpc29uIHdpdGggemVyby4KLQotMjAwNC0xMS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IEFkZCBgLWZuby1zdHJpY3QtYWxpYXNpbmcnIGlmIGdjYyBpcwotCXVzZWQuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogYnVpbGRzL3VuaXgvY29uZmlnLmd1ZXNzLCBidWlsZHMvdW5peC9jb25maWcuc3ViOiBVcGRhdGVkIGZyb20KLQlgY29uZmlnJyBDVlMgbW9kdWxlIGF0IHN1YnZlcnNpb25zLmdudS5vcmcuCi0KLTIwMDQtMTEtMTYgIERyLiBNYXJ0aW4gUC5KLiBaaW5zZXIgIDx6aW5zZXJAZGVjdXMuZGU+Ci0KLQkqIHNyYy9jYWNoZS9mdGNnbHlwaC5jIChGVENfR05vZGVfVW5zZWxlY3RGYW1pbHksCi0JRlRDX0dDYWNoZV9Mb29rdXApOiBGaXggY29tcGFyaXNvbiB3aXRoIHplcm8uCi0KLQkqIGRvY3MvSU5TVEFMTC5WTVM6IFVwZGF0ZWQuCi0KLQkqIHZtc19tYWtlLmNvbTogVXBkYXRlZC4gIEFsbCBgZGVzY3JpcC5tbXMnIGZpbGVzIGFyZSBub3cgY3JlYXRlZAotCWF1dG9tYXRpY2FsbHkuCi0KLQkqIHNyYy8qL2Rlc2NyaXAubW1zOiBSZW1vdmVkLgotCi0yMDA0LTExLTE2ICBPd2VuIFRheWxvciAgPG90YXlsb3JAcmVkaGF0LmNvbT4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluOiBTdXBwcmVzcyAtTCRsaWJkaXIgZm9yCi0JL3Vzci9saWI2NCBhcyB3ZWxsIGFzIC91c3IvbGliLiAgKFJlcG9ydGVkIGJ5IERhbiBXaW5zaGlwIC0KLQlodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEzOTE5OSkKLQotMjAwNC0xMS0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9zZXJ2aWNlX3BzX2luZm8pOiBVcGRhdGVkLgotCSogc3JjL2NpZC9jaWRyaXZlci5jIChjaWRfc2VydmljZV9wc19pbmZvKTogVXBkYXRlZC4KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYyAodDQyX3BzX2dldF9mb250X3ByaXZhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHQ0Ml9zZXJ2aWNlX3BzX2luZm8pOiBVcGRhdGVkLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9kaWN0KTogUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMDQtMTEtMTEgIERhdmlkIEJldmFuICA8ZGJldmFuQGVtdGV4LmNvbT4KLQotCUFkZCBuZXcgZnVuY3Rpb24gRlRfR2V0X1BTX0ZvbnRfUHJpdmF0ZSgpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmgKLQkoUFNfR2V0Rm9udFByaXZhdGVGdW5jKTogTmV3IHNlcnZpY2UgZnVuY3Rpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCwgc3JjL2Jhc2UvZnR0eXBlMS5jCi0JKEZUX0dldF9QU19Gb250X1ByaXZhdGUpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9wc19nZXRfZm9udF9wcml2YXRlKTogTmV3IGZ1bmN0aW9uLgotCSh0MV9zZXJ2aWNlX3BzX2luZm8pOiBVcGRhdGVkLgotCi0yMDA0LTEwLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmg6IEluY2x1ZGUgYHN0ZGRlZi5oJy4KLQkoZnRfcHRyZGlmZl90KTogRGVmaW5lLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCAoRlRfUHRyRGlzdCk6IFVzZSBgZnRfcHRyZGlmZl90Jy4KLQotCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9wYXJzZV9kaWN0KSwgc3JjL3R5cGUxL3QxbG9hZC5jCi0JKHBhcnNlX2RpY3QpOiBGaXggY29tcGlsZXIgd2FybmluZy4KLQotMjAwNC0xMC0xMSAgSm9zaHVhIE5lYWwgIDxqbmVhbEBjc2RhaWx5LmNvbT4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2ZhY2VfYnVpbGRfY21hcHMpOiBDaGVjayBmb3IgcG9pbnRlcgotCW92ZXJmbG93LgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX2hkbXgpOiBQcm90ZWN0IGFnYWluc3QgYmFkIGlucHV0LgotCURvbid0IHVzZSBGVF9RTkVXX0FSUkFZIGJ1dCBGVF9ORVdfQVJSQVkgdG8gbWFrZSBkZWFsbG9jYXRpb24gd29yawotCWluIGNhc2Ugb2YgZmFpbHVyZS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKExvYWRfU0JpdF9SYW5nZSk6IENoZWNrIHJhbmdlIGludGVydmFscy4KLQkodHRfZmFjZV9sb2FkX3NiaXRfc3RyaWtlcyk6IEFsbG9jYXRlIGBzdHJpa2Vfc2JpdF9yYW5nZXMnIGFmdGVyCi0JZnJhbWUgdGVzdC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRMb2FkX1NpbXBsZV9HbHlwaCk6IEFkZCBhc3NlcnRpb24gZm9yCi0JYGZsYWcnLgotCi0yMDA0LTEwLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0xMC0wOSAgQm9yaXMgTGV0b2NoYSAgPGIubGV0b2NoYUBjei5nbWMubmV0PgotCi0JRml4IGhhbmRsaW5nIG9mIE5QVVNIVyBpZiBza2lwcGVkIGluIGRhdGEgc3RyZWFtLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAob3Bjb2RlX2xlbmd0aCk6IFNldCB2YWx1ZSBmb3IgTlBVU0hXCi0JdG8gLTIuCi0JKFNraXBDb2RlLCBUVF9SdW5JbnMpOiBVc2Ugb3Bjb2RlX2xlbmd0aCB2YWx1ZSBmb3IgY29tcHV0YXRpb24gb2YKLQlieXRlcyB0byBiZSBza2lwcGVkLgotCi0yMDA0LTA5LTEwICBKb3VrIEphbnNlbiAgPGpvdWtqQGhyZW0uc3RtLnR1ZGVsZnQubmw+Ci0KLQkqIHZtc19tYWtlLmNvbTogVXBkYXRlZC4KLQotMjAwNC0wOS0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkaW5nIE9wZW5UeXBlIHZhbGlkYXRpb24gbW9kdWxlLiAgVGhlIGNvZGUgaXMgYmFzZWQgb24gdGhlCi0JKHVuZmluaXNoZWQpIGBvdGxheW91dCcgbW9kdWxlIGJ1dCBoYXMgYmVlbiBoZWF2aWx5IG1vZGlmaWVkIHRvIG1ha2UKLQlpdCBtdWNoIG1vcmUgY29tcGFjdC4KLQotCSogc3JjL290dmFsaWQvKjogTmV3IG1vZHVsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgsIHNyYy9iYXNlL2Z0b3R2YWwuYywKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2b3R2YWwuaDogTmV3IGZpbGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBBZGQgb3R2X21vZHVsZV9jbGFzcy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX09QRU5UWVBFX1ZBTElEQVRFX0gpOiBOZXcKLQltYWNyby4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmgKLQkoRlRfU0VSVklDRV9PUEVOVFlQRV9WQUxJREFURV9IKTogTmV3IG1hY3JvLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmggKG90dm1vZHVsZSwgb3R2Y29tbW9uLAotCW90dmJhc2UsIG90dmdkZWYsIG90dmdwb3MsIG90dmdzdWIsIG90dmpzdGYpOiBOZXcgdHJhY2UgY29tcG9uZW50cy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNoYXB0ZXJzLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9iYXNlL0phbWZpbGUgKExpYnJhcnkpLCBzcmMvYmFzZS9kZXNjcmlwLm1tcyAoT0JKUyksCi0Jc3JjL2Jhc2UvcnVsZXMubWsgKEJBU0VfRVhUX1NSQyk6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wOS0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvc291cmNlcy5weSAocmVfc291cmNlX2Jsb2NrX2Zvcm1hdDIpIDxjb2x1bW4+OgotCVVzZSBsb29rYWhlYWQgYXNzZXJ0aW9uIHRvIG5vdCBtYXRjaCBgKi8nLiAgVGhpcyByZW1vdmVzIHNwdXJpb3VzCi0JaW5zZXJ0aW9ucyBvZiBgLycgaW4gdGhlIEhUTUwgb3V0cHV0LgotCi0yMDA0LTA5LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1ZhcnlfR2V0X0dseXBoX0RlbHRhcyk6IEZpeCBjYWxsIHRvCi0JRlRfTkVXX0FSUkFZLgotCi0yMDA0LTA5LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg6IERvbid0IGluY2x1ZGUKLQlGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ILgotCShGVF9WYWxpZGF0b3IsIEZUX1ZhbGlkYXRpb25MZXZlbCwgRlRfVmFsaWRhdG9yUmVjLCBGVF9WQUxJREFUT1IsCi0JZnRfdmFsaWRhdG9yX2luaXQsIGZ0X3ZhbGlkYXRvcl9ydW4sIGZ0X3ZhbGlkYXRvcl9lcnJvciwgRlRfSU5WQUxJRCwKLQlGVF9JTlZBTElEX1RPT19TSE9SVCwgRlRfSU5WQUxJRF9PRkZTRVQsIEZUX0lOVkFMSURfRk9STUFULAotCUZUX0lOVkFMSURfR0xZUEhfSUQsIEZUX0lOVkFMSURfREFUQSk6IE1vdmUgdG8uLi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmg6IE5ldyBmaWxlLgotCU1ha2UgRlRfSU5WQUxJRCByZXR1cm4gbW9kdWxlLXNwZWNpZmljIGVycm9yIGNvZGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmggKEZUX0lOVEVSTkFMX1ZBTElEQVRFX0gpOiBOZXcKLQltYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oOiBVbmRlZmluZSBGVF9FUlJfUFJFRklYIG9ubHkgaWYKLQlGVF9LRUVQX0VSUl9QUkVGSVggaXNuJ3QgZGVmaW5lZC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfVkFMSURBVEVfSC4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmg6IERvbid0IGluY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19IIGJ1dAotCUZUX0lOVEVSTkFMX1ZBTElEQVRFX0guCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jOiBEb24ndCBpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSCBidXQKLQlGVF9JTlRFUk5BTF9WQUxJREFURV9ILgotCUluY2x1ZGUgc2ZlcnJvcnMuaCBiZWZvcmUgRlRfSU5URVJOQUxfVkFMSURBVEVfSC4KLQlzL0ZUX0Vycl9Pay9TRk5UX0Vycl9Pay8uCi0KLQkqIHNyYy9zZm50L3NmZXJyb3JzLmg6IERlZmluZSBGVF9LRUVQX0VSUl9QUkVGSVguCi0KLQkqIHNyYy90eXBlMS90MWFmbS5jOiBJbmNsdWRlIHQxZXJyb3JzLmguCi0KLTIwMDQtMDktMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRkZWJ1Zy5jIChmdF9kZWJ1Z19pbml0KTogSGlnaGVzdCBkZWJ1ZyBsZXZlbCBpcyA3LAotCW5vdCA2LgotCSogZG9jcy9ERUJVRzogVXBkYXRlZC4KLQotMjAwNC0wOC0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oIChUVEFHX0JBU0UsIFRUQUdfR0RFRiwgVFRBR19HUE9TLAotCVRUQUdfSlNURik6IE5ldyB0YWdzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCAoRlRfQnl0ZXMsIEZUX1RhZyk6IE5ldyB0eXBlZGVmcy4KLQkoRlRfSW50KTogQWRkIGBzaWduZWQnLgotCi0yMDA0LTA4LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9vdGxheW91dC9vdGxncG9zLmMgKG90bF9ncG9zX3N1YnRhYmxlX3ZhbGlkYXRlKTogQWRkIGFyZ3VtZW50Ci0JdG8gcGFzcyBudW1iZXIgb2YgbG9va3Vwcy4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JRG9uJ3QgY2FsbCBvdGxfbG9va3VwX2xpc3RfdmFsaWRhdGUgYnV0IG90bF9sb29rdXBfdmFsaWRhdGUuCi0JKG90bF9ncG9zX3ZhbGlkYXRlKTogQ2FsbCBvdGxfbG9va3VwX2xpc3RfdmFsaWRhdGUgaW5zdGVhZCBvZgotCW90bF9ncG9zX3N1YnRhYmxlX3ZhbGlkYXRlLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsZ3Bvcy5oOiBVcGRhdGVkLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsanN0Zi5jIChvdGxfanN0Zl9tYXhfdmFsaWRhdGUpOiBBZGQgYXJndW1lbnQgdG8KLQlwYXNzIG51bWJlciBvZiBsb29rdXBzLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9yZWFsKTogcy9leHAvZXhwb25lbnQvIHRvIGF2b2lkCi0JY29tcGlsZXIgd2FybmluZy4KLQotCi0JKiBzcmMvc2ZudC90dGNtYXAwLmMsIHNyYy9zZm50L3R0Y21hcDAuaDogUmVuYW1lZCB0by4uLgotCSogc3JjL3NmbnQvdHRjbWFwLmMsIHNyYy9zZm50L3R0Y21hcC5oOiBUaGlzLgotCSogc3JjL3NmbnQvSmFtZmlsZSwgc3JjL3NmbnQvcnVsZXMubWssIHNyYy9zZm50L3NmZHJpdmVyLmMsCi0Jc3JjL3NmbnQvc2ZudC5jLCBzcmMvc2ZudC9zZm9ianMuYzogVXBkYXRlZC4KLQotCi0JKiBidWlsZHMvY29tcGlsZXIvZ2NjLWRldi5tayAoQ0ZMQUdTKTogRG9uJ3QgYWRkIGAtV25lc3RlZC1leHRlcm5zJwotCWlmIGNvbXBpbGVyIGlzIGcrKyAodjMuMy4zIGVtaXRzIGEgd2FybmluZyBvdGhlcndpc2UpLgotCi0yMDA0LTA4LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9vdGxheW91dC9vdGxncG9zLmMgKG90bF92YWx1ZV9sZW5ndGgpOiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzLAotCW5vdCBudW1iZXIgb2YgMTZiaXQgZW50aXRpZXMuCi0JKG90bF9ncG9zX2xvb2t1cDJfdmFsaWRhdGUpOiBDaGVjayBjbGFzcyBkZWZpbml0aW9uIHRhYmxlcyBmb3IKLQlmb3JtYXQgMi4KLQlGaXggbG9vcCBmb3IgZm9ybWF0IDIuCi0JKG90bF9saWdhX21hcmsyX3ZhbGlkYXRlKTogRml4IG9mZnNldCBmb3Igb3RsX2FuY2hvcl92YWxpZGF0ZS4KLQotMjAwNC0wOC0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBEb24ndCBpbmNsdWRlIHRydWV0eXBlL3R0b2Jqcy5oLgotCURvbid0IGluY2x1ZGUgdHlwZTEvdDFvYmpzLmguCi0JKEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKSBbIV9fTVdFUktTX19dOiBSZW1vdmUgY29tcGlsZXIgd2FybmluZ3MuCi0KLTIwMDQtMDgtMjcgIE1hdGhpZXUgTWFsYXRlcnJlICA8bWF0aGlldUBtYWxhdGVycmUuY29tPgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBIYW5kbGUgT1NfSU5MSU5FIGZvciB4bGMgY29tcGlsZXIgYWxzby4KLQotMjAwNC0wOC0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsYXlvdXQuaDogQWRkIGNvcHlyaWdodC4KLQkoT1RMX0lOVkFMSURfT0ZGU0VUKTogUmVtb3ZlZC4KLQotCSogc3JjL290bGF5b3V0L290bGdkZWYuaDogSW5jbHVkZSBvdGxheW91dC5oLgotCUNvbW1lbnQgb3V0IGluY2x1c2lvbiBvZiBvdGx0YWJsZS5oLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsZ3Bvcy5jIChvdGxfZ3Bvc19sb29rdXA0X3ZhbGlkYXRlKTogRml4IGNhbGwKLQl0byBvdGxfYmFzZV9hcnJheV92YWxpZGF0ZS4KLQkob3RsX2xpZ2FfbWFyazJfdmFsaWRhdGUpOiBGaXggYGZvcicgbG9vcC4KLQotCSogc3JjL290bGF5b3V0L290bGdzdWIuYyAob3RsX2xpZ2F0dXJlX3ZhbGlkYXRlKTogQ2hlY2sgYGdseXBoX2lkJywKLQlub3QgY29tcG9uZW50cyBhcnJheS4KLQotCSogc3JjL290bGNvbW1uLmMgKG90bF9sb29rdXBfZ2V0X2NvdW50LCBvdGxfZmVhdHVyZV9nZXRfY291bnQpOgotCUNvbW1lbnQgb3V0LgotCShvdGxfbG9va3VwX2xpc3RfZ2V0X2NvdW50LCBvdGxfZmVhdHVyZV9saXN0X2dldF9jb3VudCk6IEFjdGl2YXRlLgotCShvdGxfZmVhdHVyZV9saXN0X3ZhbGlkYXRlLCBvdGxfZ3N1Ymdwb3NfZ2V0X2xvb2t1cF9jb3VudCk6Ci0Jcy9vdGxfbG9va3VwX2dldF9jb3VudC9vdGxfbG9va3VwX2xpc3RfZ2V0X2NvdW50Ly4KLQkob3RsX3NjcmlwdF9saXN0X3ZhbGlkYXRlKToKLQlzL290bF9mZWF0dXJlX2dldF9jb3VudC9vdGxfZmVhdHVyZV9saXN0X2dldF9jb3VudC8uCi0JKG90bF9zY3JpcHRfdmFsaWRhdGUpOiBDYWxsIG90bF9sYW5nX3ZhbGlkYXRlIGZvciBkZWZhdWx0IGxhbmd1YWdlLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsY29tbW4uaDogVXBkYXRlZC4KLQotMjAwNC0wOC0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsZ3Bvcy5jIChvdGxfZ3Bvc19sb29rdXAxX3ZhbGlkYXRlLAotCW90bF9ncG9zX2xvb2t1cDJfdmFsaWRhdGUsIG90bF9ncG9zX2xvb2t1cDNfdmFsaWRhdGUsCi0Jb3RsX2dwb3NfbG9va3VwNF92YWxpZGF0ZSwgb3RsX2dwb3NfbG9va3VwNV92YWxpZGF0ZSwKLQlvdGxfZ3Bvc19sb29rdXA2X3ZhbGlkYXRlLCBvdGxfZ3Bvc19sb29rdXA5X3ZhbGlkYXRlLAotCW90bF9ncG9zX3ZhbGlkYXRlKTogVXBkYXRlCi0JZnVuY3Rpb24gYXJndW1lbnRzLgotCShvdGxfZ3Bvc19sb29rdXA3X3ZhbGlkYXRlLCBvdGxfZ3Bvc19sb29rdXA4X3ZhbGlkYXRlKTogVXBkYXRlCi0JZnVuY3Rpb24gYXJndW1lbnRzLgotCUhhbmRsZSBOVUxMIG9mZnNldHMgY29ycmVjdGx5LgotCUNoZWNrIHNlcXVlbmNlIGFuZCBsb29rdXAgaW5kaWNlcyBmb3IgZm9ybWF0IDMuCi0JKG90bF9wb3NfcnVsZV92YWxpZGF0ZSwgb3RsX2NoYWluX3Bvc19ydWxlX3ZhbGlkYXRlKTogQWRkIGFyZ3VtZW50Ci0JdG8gcGFzcyBsb29rdXAgY291bnQuCi0JQ2hlY2sgc2VxdWVuY2UgYW5kIGdseXBoIGluZGljZXMuCi0JKG90bF9ncG9zX3N1YnRhYmxlX3ZhbGlkYXRlKTogVXBkYXRlIGZ1bmN0aW9uIGFyZ3VtZW50cy4KLQlVcGRhdGUgY2FsbGVycy4KLQotCSogc3JjL290bGF5b3V0L290bGdwb3MuaDogVXBkYXRlZC4KLQotCSogc3JjL290bGF5b3V0L290bGdzdWIuYyAob3RsX2dzdWJfbG9va3VwMV92YWxpZGF0ZSwKLQlvdGxfZ3N1Yl9sb29rdXAzX3ZhbGlkYXRlLCBvdGxfZ3N1Yl9sb29rdXA4X3ZhbGlkYXRlKTogVXBkYXRlCi0JZnVuY3Rpb24gYXJndW1lbnRzLgotCUFkZCBnbHlwaCBpbmRleCBjaGVja3MuCi0JKG90bF9zZXF1ZW5jZV92YWxpZGF0ZSwgb3RsX2FsdGVybmF0ZV9zZXRfdmFsaWRhdGUsCi0Jb3RsX2xpZ2F0dXJlX3ZhbGlkYXRlKTogQWRkIGFyZ3VtZW50IHRvIHBhc3MgZ2x5cGggY291bnQuCi0JVXBkYXRlIGNhbGxlcnMuCi0JQWRkIGdseXBoIGluZGV4IGNoZWNrLgotCShvdGxfZ3N1Yl9sb29rdXAyX3ZhbGlkYXRlLCBvdGxfZ3N1Yl9sb29rdXA0X3ZhbGlkYXRlKTogVXBkYXRlCi0JZnVuY3Rpb24gYXJndW1lbnRzLgotCShvdGxfbGlnYXR1cmVfc2V0X3ZhbGlkYXRlKTogQWRkIGFyZ3VtZW50IHRvIHBhc3MgZ2x5cGggY291bnQuCi0JVXBkYXRlIGNhbGxlci4KLQkob3RsX3N1Yl9jbGFzc19ydWxlX3ZhbGlkYXRlLAotCW90bF9zdWJfY2xhc3NfcnVsZV9zZXRfdmFsaWRhdGUpOiBSZW1vdmVkLgotCShvdGxfc3ViX3J1bGVfdmFsaWRhdGUsIG90bF9jaGFpbl9zdWJfcnVsZV92YWxpZGF0ZSk6IEFkZCBhcmd1bWVudAotCXRvIHBhc3MgbG9va3VwIGNvdW50LgotCVVwZGF0ZSBjYWxsZXJzLgotCUFkZCBsb29rdXAgaW5kZXggY2hlY2suCi0JKG90bF9zdWJfcnVsZV9zZXRfdmFsaWRhdGUsIG90bF9jaGFpbl9zdWJfcnVsZV9zZXRfdmFsaWRhdGUpOiBBZGQKLQlhcmd1bWVudCB0byBwYXNzIGxvb2t1cCBjb3VudC4KLQlVcGRhdGUgY2FsbGVycy4KLQkob3RsX2dzdWJfbG9va3VwNV92YWxpZGF0ZSk6IFVwZGF0ZSBmdW5jdGlvbiBhcmd1bWVudHMuCi0JSGFuZGxlIE5VTEwgb2Zmc2V0cyBjb3JyZWN0bHkuCi0JRG9uJ3QgY2FsbCBvdGxfc3ViX2NsYXNzX3J1bGVfc2V0X3ZhbGlkYXRlIGJ1dAotCW90bF9zdWJfcnVsZV9zZXRfdmFsaWRhdGUuCi0JQ2hlY2sgc2VxdWVuY2UgYW5kIGxvb2t1cCBpbmRpY2VzIGZvciBmb3JtYXQgMy4KLQkob3RsX2dzdWJfbG9va3VwNl92YWxpZGF0ZSk6IFVwZGF0ZSBmdW5jdGlvbiBhcmd1bWVudHMuCi0JSGFuZGxlIE5VTEwgb2Zmc2V0cyBjb3JyZWN0bHkuCi0JQ2hlY2sgc2VxdWVuY2UgYW5kIGxvb2t1cCBpbmRpY2VzIGZvciBmb3JtYXQgMy4KLQkob3RsX2dzdWJfbG9va3VwN192YWxpZGF0ZSwgb3RsX2dzdWJfdmFsaWRhdGUpOiBVcGRhdGUgZnVuY3Rpb24KLQlhcmd1bWVudHMuCi0KLQkqIHNyYy9vdGxheW91dC9vdGxnc3ViLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9vdGxheW91dC9vdGxiYXNlLmMgKG90bF9iYXNlX3ZhbGlkYXRlKTogSGFuZGxlIE5VTEwgb2Zmc2V0cwotCWNvcnJlY3RseS4KLQotCSogc3JjL290bGF5b3V0L290bGNvbW1uLmMgKG90bF9jbGFzc19kZWZpbml0aW9uX3ZhbGlkYXRlKTogRml4Ci0JY29tcGlsZXIgd2FybmluZy4KLQkob3RsX2NvdmVyYWdlX2dldF9maXJzdCwgb3RsX2NvdmVyYWdlX2dldF9sYXN0KTogTmV3IGZ1bmN0aW9ucy4KLQkob3RsX2xvb2t1cF92YWxpZGF0ZSk6IEFkZCBhcmd1bWVudHMgdG8gcGFzcyBsb29rdXAgYW5kIGdseXBoCi0JY291bnRzLgotCVVwZGF0ZSBjYWxsZXJzLgotCShvdGxfbG9va3VwX2xpc3RfdmFsaWRhdGUpOiBBZGQgYXJndW1lbnQgdG8gcGFzcyBnbHlwaCBjb3VudC4KLQlVcGRhdGUgY2FsbGVycy4KLQotCSogc3JjL290bGF5b3V0L290bGNvbW1uLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9vdGxheW91dC9vdGxqc3RmLmMgKG90bF9qc3RmX2V4dGVuZGVyX3ZhbGlkYXRlLAotCW90bF9qc3RmX21heF92YWxpZGF0ZSwgb3RsX2pzdGZfc2NyaXB0X3ZhbGlkYXRlLAotCW90bF9qc3RmX3ByaW9yaXR5X3ZhbGlkYXRlLCBvdGxfanN0Zl9sYW5nX3ZhbGlkYXRlKTogQWRkIHBhcmFtZXRlcgotCXRvIHZhbGlkYXRlIGdseXBoIGluZGljZXMuCi0JVXBkYXRlIGNhbGxlcnMuCi0JKG90bF9qc3RmX3ZhbGlkYXRlKTogQWRkIHBhcmFtZXRlciB3aGljaCBzcGVjaWZpZXMgbnVtYmVyIG9mIGdseXBocwotCWluIGZvbnQuCi0KLQkqIHNyYy9vdGxheW91dC9vdGxqc3RmLmg6IFVwZGF0ZWQuCi0KLTIwMDQtMDgtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL290bGF5b3V0L290bGdwb3MuYyAob3RsX2xpZ2FfbWFyazJfdmFsaWRhdGUpOiBBZGQgcGFyYW1ldGVyCi0JdG8gaGFuZGxlIHBvc3NpYmxlIE5VTEwgdmFsdWVzIHByb3Blcmx5LgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQotMjAwNC0wOC0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvb3RsYXlvdXQvZ3Bvcy5jOiBSZW5hbWUgY291bnRpbmcgdmFyaWFibGVzIHRvIGJlIG1vcmUKLQltZWFuaW5nZnVsLgotCUFkZCBjb3B5cmlnaHQuCi0JKG90bF9saWdhX2F0dGFjaF92YWxpZGF0ZSk6IFJlbmFtZWQgdG8uLi4KLQkob3RsX2xpZ2FfbWFyazJfdmFsaWRhdGUpOiBUaGlzLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkob3RsX21hcmsyX2FycmF5X3ZhbGlkYXRlKTogUmVtb3ZlZC4KLQkob3RsX2dwb3NfbG9va3VwNl92YWxpZGF0ZSk6IENhbGwgb3RsX2xpZ2FfbWFyazJfdmFsaWRhdGUsIG5vdAotCW90bF9tYXJrMl9hcnJheV92YWxpZGF0ZS4KLQkob3RsX3Bvc19jbGFzc19zZXRfdmFsaWRhdGUsIG90bF9wb3NfY2xhc3NfcnVsZV92YWxpZGF0ZSk6IFJlbW92ZWQuCi0JKG90bF9ncG9zX2xvb2t1cDdfdmFsaWRhdGUpOiBDb21wbGV0ZSBjb2RlIGZvciBmb3JtYXQgMi4KLQkob3RsX2NoYWluX3Bvc19jbGFzc19ydWxlX3ZhbGlkYXRlLAotCW90bF9jaGFpbl9wb3NfY2xhc3Nfc2V0X3ZhbGlkYXRlKTogUmVtb3ZlZC4KLQkob3RsX2dwb3NfbG9va3VwOF92YWxpZGF0ZSk6IERvbid0IGNhbGwKLQlvdGxfY2hhaW5fcG9zX2NsYXNzX3NldF92YWxpZGF0ZSBidXQKLQlvdGxfY2hhaW5fcG9zX3J1bGVfc2V0X3ZhbGlkYXRlLgotCVNpbXBsaWZ5IHNvbWUgY29kZS4KLQotCSogc3JjL290bGF5b3V0L290bGdwb3MuaDogQWRkIGNvcHlyaWdodC4KLQotMjAwNC0wOC0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsanN0Zi5jIChvdGxfanN0Zl9nc3ViX21vZHNfdmFsaWRhdGUpOiBSZW1vdmVkLgotCShvdGxfanN0Zl9ncG9zX21vZHNfdmFsaWRhdGUpOiBSZW5hbWVkIHRvLi4uCi0JKG90bF9qc3RmX2dzdWJncG9zX21vZHNfdmFsaWRhdGUpOiBUaGlzLgotCVRlc3Qgd2hldGhlciBsb29rdXBfY291bnQgaXMgemVyby4KLQkob3RsX2pzdGZfcHJpb3JpdHlfdmFsaWRhdGUpOiBVc2Ugb3RsX2pzdGZfZ3N1Ymdwb3NfbW9kc192YWxpZGF0ZS4KLQkob3RsX2pzdGZfdmFsaWRhdGUpOiBJbml0aWFsaXplIGdzdWJfbG9va3VwX2NvdW50IGFuZAotCWdwb3NfbG9va3VwX2NvdW50IGlmIGdzdWIgb3IgZ3BvcyBpcyB6ZXJvLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsZ3N1Yi5jOiBSZW5hbWUgY291bnRpbmcgdmFyaWFibGVzIHRvIGJlIG1vcmUKLQltZWFuaW5nZnVsLgotCUFkZCBjb3B5cmlnaHQuCi0JKG90bF9nc3ViX2xvb2t1cDFfdmFsaWRhdGUpOiBTaW1wbGlmeSBjb2RlLgotCShvdGxfZ3N1Yl9sb29rdXAyX3ZhbGlkYXRlLCBvdGxfZ3N1Yl9sb29rdXAzX3ZhbGlkYXRlLAotCW90bF9nc3ViX2xvb2t1cDRfdmFsaWRhdGUsIG90bF9nc3ViX2xvb2t1cDdfdmFsaWRhdGUpOiBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGVzLgotCShvdGxfZ3N1Yl9sb29rdXA1X3ZhbGlkYXRlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQlGaXggY2FsbCB0byBvdGxfc3ViX3J1bGVfc2V0X3ZhbGlkYXRlIGFuZAotCW90bF9zdWJfY2xhc3NfcnVsZV9zZXRfdmFsaWRhdGUuCi0JKG90bF9jaGFpbl9zdWJfY2xhc3NfcnVsZV92YWxpZGF0ZSwKLQlvdGxfY2hhaW5fc3ViX2NsYXNzX3NldF92YWxpZGF0ZSk6IFJlbW92ZWQuCi0JKG90bF9nc3ViX2xvb2t1cDZfdmFsaWRhdGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCUZpeCBjYWxsIHRvIG90bF9jaGFpbl9zdWJfcnVsZV9zZXRfdmFsaWRhdGUuCi0JKG90bF9nc3ViX2xvb2t1cDdfdmFsaWRhdGUpOiBIYW5kbGUgbG9va3VwIHR5cGUgOCBhbHNvLgotCShvdGxfZ3N1Yl9sb29rdXA4X3ZhbGlkYXRlOiBOZXcgZnVuY3Rpb24uCi0JKG90bF9nc3ViX2xvb2t1cDFfYXBwbHksIG90bF9nc3ViX2xvb2t1cDJfYXBwbHksCi0Jb3RsX2dzdWJfbG9va3VwM19hcHBseSk6IENvbW1lbnRlZCBvdXQuCi0JKG90bF9nc3ViX3ZhbGlkYXRlX2Z1bmNzKTogQWRkIG90bF9nc3ViX2xvb2t1cDdfdmFsaWRhdGUgYW5kCi0Jb3RsX2dzdWJfbG9va3VwOF92YWxpZGF0ZS4KLQkob3RsX2dzdWJfdmFsaWRhdGUpOiBVcGRhdGVkLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsZ3N1Yi5oOiBBZGQgY29weXJpZ2h0LgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsY29tbW4uYywgc3JjL290bGF5b3V0L290bGNvbW1uLmgKLQkob3RsX2NvdmVyYWdlX2dldF9pbmRleCk6IENvbW1lbnQgb3V0LgotCi0yMDA0LTA4LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9vdGxheW91dC9vdGxjb21tbi5jIChvdGxfZ3N1Ymdwb3NfZ2V0X2xvb2t1cF9jb3VudCk6IE5ldwotCWZ1bmN0aW9uLgotCSogc3JjL290bGF5b3V0L290bGNvbW1uLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9vdGxheW91dC9vdGxiYXNlLmM6IFJlbmFtZSBjb3VudGluZyB2YXJpYWJsZXMgdG8gYmUgbW9yZQotCW1lYW5pbmdmdWwuCi0JQWRkIGNvcHlyaWdodCBtZXNzYWdlLgotCSogc3JjL290bGF5b3V0L290bGJhc2UuaDogQWRkIGNvcHlyaWdodCBtZXNzYWdlLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsZ2RlZi5jOiBSZW5hbWUgY291bnRpbmcgdmFyaWFibGVzIHRvIGJlIG1vcmUKLQltZWFuaW5nZnVsLgotCUFkZCBjb3B5cmlnaHQgbWVzc2FnZS4KLQlVc2UgT1RMX0NIRUNLIGV2ZXJ5d2hlcmUuCi0JKG90bF9jYXJldF92YWx1ZV92YWxpZGF0ZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0JKG90bF9nZGVmX3ZhbGlkYXRlKTogQWxsIHRhYmxlcyBhcmUgb3B0aW9uYWwuCi0JKiBzcmMvb3RsYXlvdXQvb3RsZ2RlZi5oOiBBZGQgY29weXJpZ2h0IG1lc3NhZ2UuCi0KLQkqIHNyYy9vdGxheW91dC9vdGxqc3RmLmM6IFJlbmFtZSBjb3VudGluZyB2YXJpYWJsZXMgdG8gYmUgbW9yZQotCW1lYW5pbmdmdWwuCi0JQWRkIGNvcHlyaWdodCBtZXNzYWdlLgotCShvdGxfanN0Zl9nc3ViX21vZHNfdmFsaWRhdGUsIG90bF9qc3RmX2dwb3NfbW9kc192YWxpZGF0ZSk6IEFkZAotCXBhcmFtZXRlciB0byBwYXNzIGxvb2t1cCBjb3VudC4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JQ2hlY2sgbG9va3VwIGFycmF5LgotCShvdGxfanN0Zl9tYXhfdmFsaWRhdGUpOgotCXMvb3RsX2dwb3Nfc3VidGFibGVfY2hlY2svb3RsX2dwb3Nfc3VidGFibGVfdmFsaWRhdGUvLgotCShvdGxfanN0Zl9wcmlvcml0eV92YWxpZGF0ZSwgb3RsX2pzdGZfbGFuZ192YWxpZGF0ZSwKLQlvdGxfanN0Zl9zY3JpcHRfdmFsaWRhdGUpOiBBZGQgdHdvIHBhcmFtZXRlcnMgdG8gcGFzcyBsb29rdXAgY291bnRzLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkob3RsX2pzdGZfdmFsaWRhdGUpOiBBZGQgdHdvIHBhcmFtZXRlcnMgdG8gcGFzcyBHUE9TIGFuZCBHU1VCCi0JdGFibGUgb2Zmc2V0czsgdXNlIG90bF9nc3ViZ3Bvc19nZXRfbG9va3VwX2NvdW50IHRvIGNvbnZlcnQgZXh0cmFjdAotCWxvb2t1cCBjb3VudHMuCi0JRml4IHR5cG8uCi0JKiBzcmMvb3RsYXlvdXQvb3RsanN0Zi5oOiBVcGRhdGVkLgotCUFkZCBjb3B5cmlnaHQgbWVzc2FnZS4KLQotCSogc3JjL290bGF5b3V0L290bGdwb3MuYyAob3RsX2dwb3Nfc3VidGFibGVfdmFsaWRhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKG90bF9ncG9zX3ZhbGlkYXRlKTogVXNlIGl0LgotCSogc3JjL290bGF5b3V0L290bGdwb3MuaDogVXBkYXRlZC4KLQotMjAwNC0wOC0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvb3RsYXlvdXQvb3Rjb21tbi5jOiBVc2UgT1RMX0NIRUNLIGV2ZXJ5d2hlcmUuCi0JKG90bF9jb3ZlcmFnZV92YWxpZGF0ZSk6IEluaXRpYWxpemUgYHAnLAotCXMvY291bnQvbnVtX2dseXBocy8uCi0Jcy9zdGFydF9jb3Zlci9zdGFydF9jb3ZlcmFnZS8uCi0JKG90bF9jb3ZlcmFnZV9nZXRfaW5kZXgpOiBSZXR1cm4gT1RMX0xvbmcsIG5vdCBPVExfSW50LgotCVJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCShvdGxfY2xhc3NfZGVmaW5pdGlvbl92YWxpZGF0ZSk6IHMvY291bnQvbnVtX2dseXBocy8uCi0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKG90bF9jbGFzc19kZWZpbml0aW9uX2dldF92YWx1ZSwgb3RsX2RldmljZV90YWJsZV9nZXRfc3RhcnQsCi0Jb3RsX2RldmljZV90YWJsZV9nZXRfZW5kLCBvdGxfZGV2aWNlX3RhYmxlX2dldF9kZWx0YSwKLQlvdGxfbG9va3VwX2dldF90YWJsZSwgb3RsX2xvb2t1cF9saXN0X2dldF9jb3VudCwKLQlvdGxfbG9va3VwX2xpc3RfZ2V0X2xvb2t1cCwgb3RsX2xvb2t1cF9saXN0X2dldF90YWJsZSwKLQlvdGxfZmVhdHVyZV9nZXRfbG9va3Vwcywgb3RsX2ZlYXR1cmVfbGlzdF9nZXRfY291bnQsCi0Jb3RsX2ZlYXR1cmVfbGlzdF9nZXRfZmVhdHVyZSwgb3RsX2xhbmdfZ2V0X2NvdW50LAotCW90bF9sYW5nX2dldF9yZXFfZmVhdHVyZSwgb3RsX2xhbmdfZ2V0X2ZlYXR1cmVzKTogQ29tbWVudGVkIG91dAotCXRlbXBvcmFyaWx5IHVudGlsIHdlIHJlYWxseSBuZWVkIGl0LgotCShvdGxfbG9va3VwX3ZhbGlkYXRlKTogUmVtb3ZlZC4KLQkob3RsX2xvb2t1cF90YWJsZV92YWxpZGF0ZSk6IFJlbmFtZWQgdG8gLi4uCi0JKG90bF9sb29rdXBfdmFsaWRhdGUpOiBUaGlzLiAgVXBkYXRlIGNhbGxlcnMuCi0JKG90bF9sb29rdXBfbGlzdF92YWxpZGF0ZSk6IFJlbW92ZSBhbHJlYWR5IGNvbW1lbnRlZCBvdXQgZGVmaW5pdGlvbgotCWFuZCBtb3ZlIHRoZSBvdGhlciBkZWZpbml0aW9uIHVwLgotCShvdGxfZmVhdHVyZV92YWxpZGF0ZSk6IEFkZCBwYXJhbWV0ZXIgdG8gcGFzcyBudW1iZXIgb2YgbG9va3Vwcy4KLQlVcGRhdGUgY2FsbGVycy4KLQlDaGVjayBsb29rdXAgaW5kaWNlcy4KLQkob3RsX2ZlYXR1cmVfbGlzdF92YWxpZGF0ZSk6IEFkZCBwYXJhbWV0ZXIgdG8gcGFzcyBsb29rdXAgdGFibGUuCi0JVXBkYXRlIGNhbGxlcnMuCi0JKG90bF9sYW5nX3ZhbGlkYXRlKTogQWRkIHBhcmFtZXRlciB0byBwYXNzIG51bWJlciBvZiBmZWF0dXJlcy4KLQlVcGRhdGUgY2FsbGVycy4KLQlIYW5kbGUgcmVxX2ZlYXR1cmUgYW5kIGNoZWNrIGZlYXR1cmUgaW5kaWNlcy4KLQkob3RsX3NjcmlwdF92YWxpZGF0ZSk6IEFkZCBwYXJhbWV0ZXIgdG8gcGFzcyBudW1iZXIgb2YgZmVhdHVyZXMuCi0JVXBkYXRlIGNhbGxlcnMuCi0JKG90bF9zY3JpcHRfbGlzdF92YWxpZGF0ZSk6IEFkZCBwYXJhbWV0ZXIgdG8gcGFzcyBmZWF0dXJlIHRhYmxlLgotCVVwZGF0ZSBjYWxsZXJzLgotCi0JKiBzcmMvb3RsYXlvdXQvb3Rjb21tbi5oOiBzL0xPQ0FMREVGL0xPQ0FMLy4KLQlDb21tZW50IG91dCB0aGUgc2FtZSBmdW5jdGlvbnMgYXMgaW4gb3Rjb21tbi5jLgotCShvdGxfc2NyaXB0X2xpc3RfZ2V0X3NjcmlwdCk6IFJlbW92ZWQuCi0KLQkqIHNyYy9vdGxheW91dC9vdGxnc3ViLmMgKG90bF9nc3ViX2xvb2t1cDFfYXBwbHkpOiBDaGFuZ2UgYGluZGV4JyB0bwotCXR5cGUgT1RMX0xvbmcuCi0JKG90bF9nc3ViX2xvb2t1cDJfYXBwbHksIG90bF9nc3ViX2xvb2t1cDNfYXBwbHkpOiBDaGFuZ2UgYGluZGV4JyB0bwotCXR5cGUgT1RMX0xvbmcuCi0JRml4IHRlc3QuCi0JKG90bF9nc3ViX3ZhbGlkYXRlKTogRml4IG9yZGVyIG9mIHZhbGlkYXRpb24uCi0KLQkqIHNyYy9vdGxheW91dC9vdGxncG9zLmMgKG90bF9ncG9zX3ZhbGlkYXRlKTogRml4IG9yZGVyIG9mCi0JdmFsaWRhdGlvbi4KLQotMjAwNC0wOC0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWFrZSBvdGxheW91dCBtb2R1bGUgY29tcGlsZSAod2l0aG91dCBhY3R1YWxseSB3b3JraW5nKS4KLQotCSogc3JjL290bGF5b3V0Lyo6IHMvT1RMX1ZhbGlkL09UTF9WYWxpZGF0b3IvLgotCXMvTlVMTC8wLy4KLQotCSogc3JjL290bGF5b3V0L290bGF5b3V0Lmg6IEZpeCB2YXJpb3VzIHR5cG9zLgotCShPVExfQm9vbCk6IE5ldyB0eXBlZGVmLgotCShPVExfSW50LCBPVExfTG9uZywgT1RMX0ludDE2LCBPVExfSW50MzIpOiBVc2UgYHNpZ25lZCcga2V5d29yZC4KLQkoT1RMX0Vycl9JbnZhbGlkQXJndW1lbnQpOiBSZW1vdmVkLgotCShPVExfRXJyX0ludmFsaWREYXRhLCBPVExfRXJyX0ludmFsaWRTaXplKTogTmV3IGVudW0gdmFsdWVzLgotCShPVExfTUFLRV9UQUcpOiBBZGQgbWlzc2luZyBwYXJlbnRoZXNpcy4KLQkoT1RMX0lOVkFMSURfREFUQSk6IFVzZSBPVExfRXJyX0ludmFsaWREYXRhLgotCShPVExfSU5WQUxJRF9UT09fU0hPUlQpOiBVc2UgT1RMX0Vycl9JbnZhbGlkU2l6ZS4KLQkoT1RMX0lOVkFMSURfRk9STUFULCBPVExfSU5WQUxJRF9PRkZTRVQpOiBOZXcgbWFjcm9zLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsZ3Bvcy5jOiBzL0ZUXy9PVExfLy4KLQlzL09UTF9TaG9ydC9PVExfSW50MTYvLgotCShvdGxfZ3Bvc19wYWlyc2V0X3ZhbGlkYXRlKTogQWRkIHJldHVybiB0eXBlLgotCShvdGxfYmFzZV9hcnJheV92YWxpZGF0ZSk6IEZpeCBjYWxsIHRvIG90bF9hbmNob3JfdmFsaWRhdGUuCi0JKG90bF9saWdhX2FycmF5X3ZhbGlkYXRlKTogRml4IGNhbGwgdG8gb3RsX2xpZ2FfYXR0YWNoX3ZhbGlkYXRlLgotCShvdGxfZ3Bvc19sb29rdXA1X3ZhbGlkYXRlKTogRml4IHR5cG9zLgotCShvdGxfZ3Bvc19sb29rdXA2X3ZhbGlkYXRlKTogRml4IGNhbGwgdG8gb3RsX21hcmsyX2FycmF5X3ZhbGlkYXRlLgotCShvdGxfZ3Bvc19sb29rdXA3X3ZhbGlkYXRlKTogQ29tbWVudCBvdXQgdW5maW5pc2hlZCBjb2RlLgotCUZpeCB0eXBvcy4KLQotCSogc3JjL290bGF5b3V0L290bGdzdWIuYzogQWRkIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yCi0Jb3RsX2dzdWJfdmFsaWRhdGVfZnVuY3MuCi0JKG90bF9nc3ViX2xvb2t1cDFfYXBwbHksIG90bF9nc3ViX2xvb2t1cDJfYXBwbHksCi0Jb3RsX2dzdWJfbG9va3VwM19hcHBseSk6IEZpeCBjYWxsIHRvIG90bF9wYXJzZXJfY2hlY2tfcHJvcGVydHkuCi0Jcy9vdGxfY292ZXJhZ2VfbG9va3VwL290bF9jb3ZlcmFnZV9nZXRfaW5kZXgvLgotCShvdGxfbGlnYXR1cmVfdmFsaWRhdGUpOiBBZGQgbWlzc2luZyB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KLQkob3RsX3N1Yl9ydWxlX3ZhbGlkYXRlKTogRml4IHR5cG8uCi0JKG90bF9zdWJfY2xhc3NfcnVsZV92YWxpZGF0ZSk6IEFkZCBtaXNzaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgotCUZpeCB0eXBvLgotCShvdGxfZ3N1Yl9sb29rdXA1X3ZhbGlkYXRlKTogRml4IHR5cG8uCi0JKG90bF9nc3ViX2xvb2t1cDZfdmFsaWRhdGUpOiBGaXggY2FsbCB0bwotCW90bF9jaGFpbl9zdWJfY2xhc3Nfc2V0X3ZhbGlkYXRlLgotCShvdGxfZ3N1Yl92YWxpZGF0ZV9mdW5jcyk6IERvbid0IHVzZSBgY29uc3QnLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsY29tbW4uYyAob3RsX2NsYXNzX2RlZmluaXRpb25fZ2V0X3ZhbHVlLAotCW90bF9kZXZpY2VfdGFibGVfdmFsaWRhdGUsIG90bF9kZXZpY2VfdGFibGVfZ2V0X2RlbHRhLAotCW90bF9sb29rdXBfdmFsaWRhdGUsIG90bF9zY3JpcHRfdmFsaWRhdGUpOiBBZGQgbWlzc2luZwotCXZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KLQkob3RsX2xvb2t1cF9saXN0X3ZhbGlkYXRlKTogQ29tbWVudCBvdXQgZmlyc3QgZGVmaW5pdGlvbi4KLQkob3RsX2xvb2t1cF9saXN0X2ZvcmVhY2gsIG90bF9mZWF0dXJlX2xpc3RfZm9yZWFjaCk6IENvbW1lbnQgb3V0LgotCShvdGxfZmVhdHVyZV9saXN0X3ZhbGlkYXRlKToKLQlzL290bF9mZWF0dXJlX3RhYmxlX3ZhbGlkYXRlL290bF9mZWF0dXJlX3ZhbGlkYXRlLy4KLQkob3RsX3NjcmlwdF9saXN0X3ZhbGlkYXRlKToKLQlzL290bF9zY3JpcHRfdGFibGVfdmFsaWRhdGUvb3RsX3NjcmlwdF92YWxpZGF0ZS8uCi0KLQkqIHNyYy9vdGxheW91dC9vdGxjb21tbi5oOiBDb21tZW50IG91dCBmaXJzdCBkZWNsYXJhdGlvbi4KLQkob3RsX2xvb2t1cF9saXN0X2ZvcmVhY2gsIG90bF9mZWF0dXJlX2xpc3RfZm9yZWFjaCk6IENvbW1lbnQgb3V0LgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsYmFzZS5jIChvdGxfYmFzZV9jb29yZF92YWxpZGF0ZSk6IEZpeCBjYWxsIHRvCi0Jb3RsX2RldmljZV90YWJsZV92YWxpZGF0ZS4KLQkob3RsX2Jhc2Vfc2NyaXB0X3ZhbGlkYXRlKTogQWRkIG1pc3NpbmcgdmFyaWFibGUgZGVjbGFyYXRpb25zLgotCShvdGxfYmFzZV9zY3JpcHRfbGlzdF92YWxpZGF0ZSk6IEZpeCBjYWxsIHRvCi0Jb3RsX2Jhc2Vfc2NyaXB0X3ZhbGlkYXRlLgotCShvdGxfYXhpc190YWJsZV92YWxpZGF0ZSk6IEZpeCBjYWxscyB0byBvdGxfYmFzZV90YWdfbGlzdF92YWxpZGF0ZQotCWFuZCBvdGxfYmFzZV9zY3JpcHRfbGlzdF92YWxpZGF0ZS4KLQkob3RsX2Jhc2VfdmFsaWRhdGUpOiBGaXggY2FsbHMgdG8gb3RsX2F4aXNfdGFibGVfdmFsaWRhdGUuCi0KLQkqIHNyYy9vdGxheW91dC9vdGxnZGVmLmMgKG90bF9hdHRhY2hfbGlzdF92YWxpZGF0ZSk6IEZpeCBjYWxsIHRvCi0Jb3RsX2F0dGFjaF9wb2ludF92YWxpZGF0ZS4KLQkob3RsX2NhcmV0X3ZhbHVlX3ZhbGlkYXRlKTogQWRkIG1pc3NpbmcgdmFyaWFibGUgZGVjbGFyYXRpb24uCi0JRml4IGNhbGwgdG8gb3RsX2RldmljZV90YWJsZV92YWxpZGF0ZS4KLQkob3RsX2xpZ2F0dXJlX2dseXBoX3ZhbGlkYXRlKTogRml4IGNhbGwgdG8gb3RsX2NhcmV0X3ZhbHVlX3ZhbGlkYXRlLgotCShvdGxfbGlnYXR1cmVfY2FyZXRfbGlzdF92YWxpZGF0ZSk6IEZpeCBjYWxsIHRvCi0Jb3RsX2xpZ2F0dXJlX2dseXBoX3ZhbGlkYXRlLgotCShvdGxfZ2RlZl92YWxpZGF0ZSk6IEZpeCBjYWxscyB0byBvdGxfY2xhc3NfZGVmaW5pdGlvbl92YWxpZGF0ZSwKLQlvdGxfYXR0YWNoX2xpc3RfdmFsaWRhdGUsIG90bF9saWdhdHVyZV9jYXJldF9saXN0X3ZhbGlkYXRlLCBhbmQKLQlvdGxfY2xhc3NfZGVmaW5pdGlvbl92YWxpZGF0ZS4KLQotCSogc3JjL290bGF5b3V0L290bHRhYmxlLmggKG90bF90YWJsZV92YWxpZGF0ZSwgb3RsX3RhYmxlX2luaXQsCi0Jb3RsX3RhYmxlX3NldF9zY3JpcHQpOiBDb21tZW50IG91dC4KLQotCSogc3JjL290bGF5b3V0L290bHBhcnNlLmggKE9UTF9QYXJzZXJSZWMpOgotCXMvT1RMX0FsdGVybmF0ZS9PVExfR1NVQl9BbHRlcm5hdGUvLgotCShPVExfUGFyc2VFcnJvcik6IEFkZCBPVExfRXJyX1BhcnNlcl9NZW1vcnkgYW5kCi0JT1RMX0Vycl9QYXJzZXJfSW50ZXJuYWwuCi0JKG90bF9wYXJzZXJfZXJyb3IpOiBGaXggdHlwby4KLQkob3RsX3BhcnNlcl9jaGVja19wcm9wZXJ0eSk6IFJlbW92ZSB0aGlyZCBhcmd1bWVudC4KLQotCSogc3JjL290bGF5b3V0L290bHBhcnNlLmMgKG90bF9zdHJpbmdfZW5zdXJlKToKLQlzL09UTF9QYXJzZV9FcnJfTWVtb3J5L09UTF9FcnJfUGFyc2VyX01lbW9yeS8uCi0JKE9UTF9TVFJJTkdfRU5TVVJFLCBvdGxfcGFyc2VyX2Vycm9yLCBvdGxfcGFyc2VyX2dldF9pbmRleCwKLQlvdGxfcGFyc2VyX3JlcGxhY2VfMSwgb3RsX3BhcnNlcl9yZXBsYWNlX24pOiBGaXggdHlwb3MuCi0JKE9UTF9QQVJTRVJfVU5DT1ZFUkVEKTogUmVtb3ZlZC4KLQkob3RsX3BhcnNlcl9jaGVja19wcm9wZXJ0eSk6IFJlbW92ZSB0aGlyZCBhcmd1bWVudC4KLQotCSogc3JjL290bGF5b3V0L290bGpzdGYuYyAob3RsX2pzdGZfcHJpb3JpdHlfdmFsaWRhdGUpOiBBZGQgbWlzc2luZwotCXZhcmlhYmxlIGRlY2xhcmF0aW9uLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsdXRpbHMuaCAoT1RMX01FTV9SRUFMTE9DKTogRml4IHR5cG8uCi0KLTIwMDQtMDgtMTEgIERhbm55ICA8ZGFubnlib3lub3dAeWFob28uY29tPgotCi0JKiBzcmMvYmFzZS9mdHN0cmVhbS5jIChGVF9TdHJlYW1fQ2xvc2UpOiBEb24ndCByZXNldCBzdHJlYW0tPmNsb3NlCi0JdG8gTlVMTC4gIFRoaXMgYWxsb3dzIGN1c3RvbSBjbG9zZSBmdW5jdGlvbnMgdG8gZGVsZXRlIHRoZSBGVF9TVFJFQU0KLQlvYmplY3QuCi0KLTIwMDQtMDgtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBBUEkgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IFNGTlQgdGFibGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oCi0JKEZUX1NGTlRfVGFibGVfSW5mb19GdW5jKTogTmV3IHR5cGVkZWYuCi0JKFNGTlRfVGFibGUpOiBBZGQgaXQuCi0KLQkqIHNyYy9iYXNlL2Z0b2JqcyAoRlRfU2ZudF9UYWJsZV9JbmZvKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0dGFibGVzLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfdGFibGVfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUpOiBBZGQgaXQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDEwLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWMgKHZlcnNpb25faW5mbyk6IFNldCB0byA5Ojg6My4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogVXBkYXRlZC4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qOiBzLzIxOS8yMTEwLywgcy8yLjEuOS8yLjEuMTAvLgotCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKHJlZmRvYyksIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKToKLQlzLzIuMS45LzIuMS4xMC8uCi0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlZC4KLQotMjAwNC0wOC0xMSAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIHNyYy9iYXNlL2Z0cmZvcmsuYyAoRlRfUmFjY2Vzc19HdWVzcykKLQlbIUZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUktdOiBSZW1vdmUgY29tcGlsZXIKLQl3YXJuaW5ncy4KLQotMjAwNC0wOC0wNiAgQWRhbSBQaW90cm93c2tpICA8c3RfaW50ZWxAcG9jenRhLm9uZXQucGw+Ci0KLQkqIHNyYy9wZnIvcGZybG9hZC5jIChwZnJfc29ydF9rZXJuaW5nX3BhaXJzKTogU2luZ2xlLWJ5dGUKLQlhZGp1c3RtZW50cyBhcmUgdW5zaWduZWQsIG5vdCBzaWduZWQuCi0KLTIwMDQtMDgtMDUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCWBBY3RpdmF0ZScgZ3JheS1zY2FsZSBzcGVjaWZ5aW5nIGhpbnRpbmcgd2l0aGluIHRoZSBUcnVlVHlwZQotCWJ5dGVjb2RlIGludGVycHJldGVyLiAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSB3aGljaAotCXNob3VsZCBwcm9iYWJseSBiZSBtYWRlIG9wdGlvbmFsLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwKLQlsb2FkX3RydWV0eXBlX2dseXBoKTogTW92ZSB0aGUgY29kZSB0byBzZXQgdGhlIHBlZGFudGljX2hpbnRpbmcgZmxhZwotCXRvLi4uCi0JKFRUX0xvYWRfR2x5cGgpOiBIZXJlLgotCVNldCBgZ3JheXNjYWxlJyBmbGFnIGV4Y2VwdCBmb3IgYEZUX0xPQURfVEFSR0VUX01PTk8nLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX0dFVElORk8pOiBSZXR1cm4gTVMgcmFzdGVyaXplcgotCXZlcnNpb24gMS43LgotCVJldHVybiByb3RhdGlvbiBhbmQgc3RyZXRjaGluZyBpbmZvIG9ubHkgaWYgZ2x5cGggaXMgcm90YXRlZCBvcgotCXN0cmV0Y2hlZCwgcmVzcGVjdGl2ZWx5LgotCUhhbmRsZSBncmF5c2NhbGUgaW5mby4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmggKFRUX0V4ZWNDb250ZXh0UmVjKTogQWRkIGBncmF5c2NhbGUnCi0JbWVtYmVyLgotCi0yMDA0LTA4LTAyICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0F0dGFjaF9GaWxlKTogSW5pdGlhbGl6ZSBgb3Blbi5zdHJlYW0nLgotCi0yMDA0LTA4LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wOC0wMSAgR2VvcmdlIFdpbGxpYW1zICA8Z3d3QHNpbGNvbS5jb20+Ci0KLQlGcmVlVHlwZSBub3cgY2FuIHJlYWQga2VybmluZyB2YWx1ZXMgZnJvbSBQRk0gZmlsZXMuCi0KLQkqIHNyYy90eXBlMS90MWFmbS5jIChUMV9Eb25lX0FGTSk6IFJlbmFtZWQgdG8uLi4KLQkoVDFfRG9uZV9NZXRyaWNzKTogVGhpcy4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKFQxX1JlYWRfQUZNKTogTWFrZSBpdCBzdGF0aWMuCi0JRG9uJ3QgZW50ZXIgYW5kIGxlYXZlIGEgZnJhbWUuCi0JKExJVFRMRV9FTkRJQU5fVVNIT1JULCBMSVRUTEVfRU5ESUFOX1VJTlQpOiBOZXcgbWFjcm9zLgotCShUMV9SZWFkX1BGTSk6IE5ldyBmdW5jdGlvbi4KLQkoVDFfUmVhZF9NZXRyaWNzKTogTmV3IGhpZ2hlci1sZXZlbCBmdW5jdGlvbiB0byBiZSB1c2VkIGluc3RlYWQgb2YKLQlUMV9SZWFkX0FGTS4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLTIwMDQtMDctMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BjZi9wY2ZyZWFkIChwY2ZfbG9hZF9mb250KSwgc3JjL2JkZi9iZGZkcml2ci5jCi0JKEJERl9GYWNlX0luaXQpLCBzcmMvdHJ1ZXR5cGUvdHRneHZhciAoVFRfR2V0X01NX1ZhciwKLQl0dF9mYWNlX3ZhcnlfY3Z0KTogRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCi0yMDA0LTA3LTI2ICBTw7hyZW4gU2FuZG1hbm4gIDxzYW5kbWFubkBkYWltaS5hdS5kaz4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9pbnRlcnByZXRfc3R5bGUpOiBBbHdheXMgYWxsb2NhdGUgbWVtb3J5IGZvcgotCWZhY2UtPnN0eWxlX25hbWUuCi0JKiBzcmMvcGNmL3BjZmRyaXZyLmMgKFBDRl9GYWNlX0RvbmUpOiBGcmVlIGBzdHlsZV9uYW1lJy4KLQotMjAwNC0wNy0yNiAgRGFycmVuIEogTG9uZ2hvcm4gIDxkYXJyZW4ubG9uZ2hvcm5AcmVkY29tLmNvLnVrPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIChGVF9TSVpFT0ZfTE9ORyk6IFJlY29nbml6ZQotCWZpdmUtYnl0ZSBgbG9uZycgKHdoaWNoIGlzIGF2b2lkZWQgdGhlbikuCi0KLTIwMDQtMDctMjUgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBzcmMvcGNmL3BjZmRyaXZyLmMgKFBDRl9TZXRfUGl4ZWxfU2l6ZSk6IENvbXBhcmUgaGVpZ2h0cywgbm90Ci0JcHBlbSB2YWx1ZXMuCi0JKFBDRl9TZXRfUG9pbnRfU2l6ZSk6IERvbid0IGNhbGwgUENGX1NldF9QaXhlbF9TaXplIGJ1dCBwcm92aWRlIG93bgotCWNvZGUgdG8gY29tcGFyZSBwcGVtIHZhbHVlcy4KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX1NldF9QaXhlbF9TaXplKTogQ29tcGFyZSBoZWlnaHRzLCBub3QKLQlwcGVtIHZhbHVlcy4KLQkoQkRGX1NldF9Qb2ludF9TaXplKTogRG9uJ3QgY2FsbCBCREZfU2V0X1BpeGVsX1NpemUgYnV0IHByb3ZpZGUgb3duCi0JY29kZSB0byBjb21wYXJlIHBwZW0gdmFsdWVzLgotCi0yMDA0LTA3LTI1ICBLb3JuZmVsZCBFbGl5YWh1IFBldGVyICA8cGV0ZXJAZS1rYWRtb24ubmV0PgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBIYW5kbGUKLQlUVF9OQU1FX0lEX1BSRUZFUlJFRF9GQU1JTFkgYW5kIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWS4KLQotMjAwNC0wNy0yNCAgRGVyZWsgQi4gTm9vbmJ1cmcgIDxkZXJla25AZm9vbGFicy5jb20+Ci0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfZm9udF9sb2FkKTogQWx3YXlzIGNyZWF0ZSBpbnZlcnNlIG1hcHBpbmcuCi0JRXZlbiBpZiB0aGUgY2hhcnN0cmluZyBjb3VudCBpcyB0aGUgc2FtZSBhcyB0aGUgQ0lEIGNvdW50LCBpdCBpcwotCXN0aWxsIHBvc3NpYmxlIHRoYXQgdGhlIGZvbnQgdXNlcyBhIGRpZmZlcmVudCBDSUQgLT4gR0lEIG1hcHBpbmcuCi0KLTIwMDQtMDctMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpOiBBY2NlcHQgMHgwMDAyMDAwMCBmb3JtYXQgdGFnCi0JZm91bmQgaW4gc29tZSBBcnBoaWMgZm9udHMgbWFkZSBmb3IgQ2hpbmVzZSB2ZXJzaW9uIG9mIFdpbmRvd3MgMy4xLgotCi0yMDA0LTA3LTE3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlGaXhlZCBhIGRhbmdsaW5nIHBvaW50ZXIgYnVnIGluIHRoZSBjYWNoZSBjb2RlIHRoYXQgaGFwcGVuZWQgaW4gdmVyeQotCXJhcmUgY2FzZXMsIGkuZS4sIHdoZW4gYSBuZXcgZmFtaWx5IG9iamVjdCB3YXMgZGVzdHJveWVkIGJ5IGFuCi0Jb3V0LW9mLW1lbW9yeSBjb25kaXRpb24gZHVyaW5nIGEgZ2x5cGggbm9kZSBpbml0aWFsaXphdGlvbi4gIFRoZQotCWZ1bmN0aW9uIEZUQ19DYWNoZV9Mb29rdXAgd291bGQgZmx1c2ggdGhlIGNhY2hlIGFuZCByZXN0YXJ0IHRoZQotCWxvb2t1cCB3aXRoIGEgYmFkIHBvaW50ZXIuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjZ2x5cGguaCAoRlRDX0ZBTUlMWV9UUkVFKTogTmV3IG1hY3JvLgotCShGVENfR0NBQ0hFX0xPT0tVUF9DTVApOiBVc2UgaXQuCi0JSGFuZGxlIHJlZmVyZW5jZSBjb3VudCBpbiBgbnVtX25vZGVzJyBjb3JyZWN0bHkuCi0KLQkqIHNyYy9jYWNoZS9mdGNnbHlwaC5jIChGVENfR05vZGVfVW5zZWxlY3RGYW1pbHkpOiBVc2UKLQlGVENfRkFNSUxZX0ZSRUUuCi0JKEZUQ19HQ2FjaGVfTG9va3VwKTogSGFuZGxlIHJlZmVyZW5jZSBjb3VudCBpbiBgbnVtX25vZGVzJyBjb3JyZWN0bHkuCi0KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChGVENfTWFuYWdlcl9GbHVzaE4pOiBGaXhlZCBhIGNhY2hlIGZsdXNoaW5nCi0JYnVnLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoTm9ybWFsaXplKTogRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQKLQlsb25nIGFuZCB1bm5lY2Vzc2FyeSBkZWxheXMgd2hpbGUgbm9ybWFsaXppbmcgaHVnZSB2ZWN0b3JzLgotCi0yMDA0LTA3LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUpOiBGaXggY29tcGlsZXIKLQl3YXJuaW5nLgotCi0yMDA0LTA3LTE1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lKTogU2luZ2xlIHBvaW50cwotCWFyZSBub3Qgc3Ryb2tlZCwgcHJldmVudGluZyBhIGJ1ZyB3aXRoIHBhbGEudHRmIGFuZCBvdGhlcgotCWZvbnRzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlLmg6IFVwZGF0aW5nIGRvY3VtZW50YXRpb24gY29tbWVudHMuCi0KLTIwMDQtMDctMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoZnRfc3Ryb2tlX2JvcmRlcl9yZXZlcnNlKTogUmVtb3ZlZC4gIFVudXNlZC4KLQotMjAwNC0wNy0xMiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHN0cm9rZS5jIChmdF9zdHJva2VfYm9yZGVyX2Nsb3NlKTogQWRkIHNlY29uZCBwYXJhbWV0ZXIKLQl0byBpbmRpY2F0ZSByZXZlcnNpb24gb2YgcG9pbnRzLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoZnRfc3Ryb2tlX2JvcmRlcl9yZXZlcnNlKTogRml4IGluaXRpYWxpemF0aW9uIG9mIGBwb2ludDEnIGFuZAotCWB0YWcxJy4KLQotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgKGZ0Y19zbm9kZV9sb2FkKTogRml4aW5nIGFkdmFuY2UgY29tcHV0YXRpb24KLQlmb3IgdHJhbnNmb3JtZWQgZ2x5cGhzLgotCi0yMDA0LTA3LTExICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlGaXggYnVncyB0aGF0IHByZXZlbnRlZCB0aGUgc3Ryb2tlciB0byBjb3JyZWN0bHkgZ2VuZXJhdGUgc3Ryb2tlZAotCXBhdGhzIGZyb20gY2xvc2VkIHBhdGhzLCBpLmUuLCBuZWFybHkgYWxsIGdseXBocyBpbiB2ZWN0b3JpYWwgZm9udHMuCi0KLQlUaGUgY29kZSBpcyBzdGlsbCBfdmVyeV8gYnVnZ3kgdGhvdWdoOyB0cmVhdCB3aXRoIHNwZWNpYWwgY2FyZS4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoRlRfU1RST0tFX1RBR19CRUdJTl9FTkQpOiBOZXcgbWFjcm8uCi0JKGZ0X3N0cm9rZV9ib3JkZXJfcmV2ZXJzZSk6IE5ldyBmdW5jdGlvbi4KLQkoZnRfc3Ryb2tlcl9pbnNpZGUpOiBSZW1vdmUgbG9jYWwgdmFyaWFibGUgYHNpZ21hJzsgdXNlIGRpZmZlcmVudAotCXRocmVzaG9sZC4KLQkoZnRfc3Ryb2tlcl9hZGRfcmV2ZXJzZV9sZWZ0KTogU3dpdGNoIGJlZ2luL2VuZCB0YWdzIGlmIG5lY2Vzc2FyeS4KLQkoRlRfU3Ryb2tlcl9FbmRTdWJQYXRoKTogQ2FsbCBmdF9zdHJva2VyX2luc2lkZSBhbmQKLQlmdF9zdHJva2VfYm9yZGVyX3JldmVyc2UuCi0KLTIwMDQtMDYtMjYgIFBldGVyIEtvdmFyICA8cGV0ZXIua292YXJAcjMucm9idXJuZXQuc2s+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBGaXggdHlwby4KLQotMjAwNC0wNi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFhZm0uYyAoYWZtX2F0b2luZGV4KTogRml4IGJvdW5kYXJ5IHRlc3QuICBSZXBvcnRlZAotCWJ5IERpcmNrIEJsYXNrZXkuCi0KLTIwMDQtMDYtMjQgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCi0JKiBWZXJzaW9uIDIuMS45IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jLCBzcmMvdHJ1ZXR5cGUvdHR4Z3Zhci5jOiBSZW1vdmluZwotCWNvbXBpbGVyIHdhcm5pbmdzLgotCi0yMDA0LTA2LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCBbRlRfREVCVUdfTUVNT1JZXTogRGVjbGFyZQotCUZUX1FBbGxvY19EZWJ1ZyBhbmQgRlRfUVJlYWxsb2NfRGVidWcuCi0KLQkqIHNyYy9iYXNlL2Z0dXRpbC5jIChGVF9RQWxsb2MpOiBGaXggZXJyb3IgYW5kIGRlYnVnIG1lc3NhZ2VzLgotCShGVF9RUmVhbGxvYyk6IENhbGwgRlRfUUFsbG9jIGlmIG9yaWdpbmFsIHBvaW50ZXIgaXMgTlVMTC4KLQlGaXggZXJyb3IgbWVzc2FnZS4KLQotMjAwNC0wNi0yMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmgsIHNyYy9iYXNlL2Z0dXRpbC5jCi0JKEZUX1FBbGxvYywgRlRfUVJlYWxsb2MpLCBzcmMvYmFzZS9mdGRiZ21lbS5jIChGVF9RQWxsb2NfRGVidWcsCi0JRlRfUVJlYWxsb2NfRGVidWcpOiBOZXcgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBhbGxvY2F0aW9uIHdpdGhvdXQKLQl6ZXJvLWluZyBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2tzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmggKEZUX01FTV9RQUxMT0MsCi0JRlRfTUVNX1FSRUFMTE9DLCBGVF9NRU1fUU5FVywgRlRfTUVNX1FORVdfQVJSQVksCi0JRlRfTUVNX1FSRU5FV19BUlJBWSwgRlRfUUFMTE9DLCBGVF9RUkVBTExPQywgRlRfUU5FVywgRlRfUU5FV19BUlJBWSwKLQlGVF9RUkVORVdfQVJSQVkpOiBOZXcgbWFjcm9zLgotCi0JKiBzcmMvYmFzZS9mdHN0cmVhbS5jIChGVF9TdHJlYW1fRW50ZXJGcmFtZSk6IFVzZSBGVF9RQUxMT0MuCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYyAoRlRfU3RyZWFtX09wZW5HemlwKTogIFVzZSBGVF9RTkVXX0FSUkFZLgotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHR0X2ZhY2VfZ2V0X25hbWUpOiBVc2UgRlRfUU5FV19BUlJBWS4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9kaXJlY3RvcnksIHR0X2ZhY2VfbG9hZF9tZXRyaWNzLAotCXR0X2ZhY2VfbG9hZF9nYXNwKTogVXNlIEZUX1FORVdfQVJSQVkuCi0JKHR0X2ZhY2VfbG9hZF9rZXJuKTogVXNlIEZUX1FORVdfQVJSQVkuCi0JU21hbGwgb3B0aW1pemF0aW9uIGluIHRoZSBrZXJuaW5nIHRhYmxlIHZlcmlmaWVyOyB0aGlzIHNwZWVkcyB1cAotCVRydWVUeXBlIGZhY2Ugb3BlbmluZyBieSBhYm91dCA3JS4KLQkodHRfZmFjZV9sb2FkX2hkbXgpOiBVc2UgRlRfUU5FV19BUlJBWSBhbmQgRlRfUUFMTE9DLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBDaGFuZ2VkIHRoZSBvcmRlciBvZiBtb2R1bGVzLAotCXB1dHRpbmcgVHJ1ZVR5cGUgYW5kIFR5cGUgMSBmaXJzdC4gIFRoaXMgZHJhbWF0aWNhbGx5IGltcHJvdmVzIHRoZQotCXBlcmZvcm1hbmNlIG9mIGZhY2Ugb3Blbi9jbG9zZSBvcGVyYXRpb25zLiAgRm9yIGV4YW1wbGUsIHB1dHRpbmcgdGhlCi0JVHJ1ZVR5cGUgZHJpdmVyIGZpcnN0IGluIHRoZSBsaXN0IHJlc3VsdHMgaW4gYSA1eCBzcGVlZHVwIHdoZW4KLQlvcGVuaW5nIGBWZXJhLnR0ZicuCi0KLQlUaGUgdmVyeSBwcm9ibGVtIGlzIHRoYXQgYm90aCB0aGUgUENGIGFuZCBCREYgZHJpdmVycyBkbyBhIGxvdCBtb3JlCi0JdGhhbiBuZWNlc3NhcnkgdG8gZGV0ZWN0IHRoYXQgdGhleSBjYW5ub3QgaGFuZGxlIGEgZm9udCBmaWxlLgotCi0yMDA0LTA2LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfcmVhZF9UT0MsIHBjZl9nZXRfcHJvcGVydGllcywKLQlwY2ZfZ2V0X21ldHJpY3MsIHBjZl9nZXRfYml0bWFwcywgcGNmX2dldF9lbmNvZGluZ3MpOiBJbXByb3ZlCi0JZGVidWdnaW5nIG1lc3NhZ2VzLgotCi0JKiBzcmMvcGNmL3BjZmRyaXZyLmMgKEZUX0NPTVBPTkVOVCk6IE1vdmUgdXAuCi0JKFBDRl9GYWNlX0luaXQpOiBTaW1wbGlmeSBjb2RlLgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmggKEJERl9GYWNlUmVjKTogTmV3IGVsZW1lbnQgYGRlZmF1bHRfZ2x5cGgnLgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX2FkZF9wcm9wZXJ0eSwgX2JkZl9wYXJzZV9zdGFydCksCi0Jc3JjL2JkZi9iZGYuaCAoYmRmX2ZvbnRfdCk6IHMvZGVmYXVsdF9nbHlwaC9kZWZhdWx0X2NoYXIvLgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9GYWNlX0luaXQpOiBGaXggbnVtYmVyIG9mIGdseXBocy4KLQlTZXQgYGRlZmF1bHRfZ2x5cGgnLgotCShCREZfR2x5cGhfTG9hZCk6IFVzZSBgZGVmYXVsdF9nbHlwaCcgZm9yIHVuZGVmaW5lZCBnbHlwaC4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA0LTA2LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wNi0yMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwKLQlsb2FkX3RydWV0eXBlX2dseXBoKTogRG9uJ3QgYWNjZXNzICh1bnJvdW5kZWQpCi0JYFRUX1NpemUucm9vdC5tZXRyaWNzJyBidXQgKHJvdW5kZWQpIGBUVF9TaXplLm1ldHJpY3MnLiAgVGhpcyBmaXhlcwotCWEgc2NhbGluZyBidWcgdGhhdCBjYXVzZWQgaW5jb3JyZWN0IHJlbmRlcmluZyB3aGVuIHRoZSBieXRlY29kZQotCWludGVycHJldGVyIHdhcyBlbmFibGVkLgotCi0yMDA0LTA2LTE0ICBIdXcgRCBNIERhdmllcyAgPGguZGF2aWVzMUBwaHlzaWNzLm94LmFjLnVrPgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9GYWNlX0luaXQpOiBTZXQgeF9wcGVtIGFuZCB5X3BwZW0KLQliYXNlZCBvbiBwaXhlbF93aWR0aCBhbmQgcGl4ZWxfaGVpZ2h0LgotCShGTlRfU2l6ZV9TZXRfUGl4ZWxzKTogVXBkYXRlZC4KLQotMjAwNC0wNi0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvbHp3L3pvcGVuLmM6IENvbW1lbnQgb3V0IGluY2x1c2lvbiBvZiBzaWduYWwuaCBhbmQgdW5pc3RkLmguCi0JUmVwb3J0ZWQgYnkgSHl2w6RyaW5lbiBKeXJraSBKdWhhbmkuCi0KLTIwMDQtMDYtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA0LTA2LTEwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2JqZWN0LmMsIHNyYy9iYXNlL2Z0aGFzaC5jLCBzcmMvYmFzZS9mdGV4Y2VwdC5jLAotCXNyYy9iYXNlL2Z0c3lzaW8uYywgc3JjL2Jhc2UvZnRzeXNtZW0uYywgc3JjL2Jhc2UvZnRsaXN0LmM6IFJlbW92ZWQuCi0JT2Jzb2xldGUuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoQWxpZ25tZW50LCBQQWxpZ25tZW50KTogTmV3IHVuaW9uIHRvIGZpeAotCXByb2JsZW1zIHdpdGggNjRiaXQgc3lzdGVtcy4KLQkoQWxpZ25Qcm9maWxlU2l6ZSk6IFVzZSBpdC4KLQotMjAwNC0wNi0wOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0dseXBoX01ldHJpY3MpOiBNb3ZlIGBsc2JfZGVsdGEnCi0JYW5kIGByc2JfZGVsdGEnIGVsZW1lbnRzIHRvLi4uCi0JKEZUX0dseXBoU2xvdFJlYyk6IEhlcmUgdG8gcmV0YWluIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKLQlGcmVlVHlwZSB2ZXJzaW9ucy4KLQlVcGRhdGUgYWxsIHVzZXJzLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAodHRfZmFjZV9nZXRfbmFtZSk6IFJlbW92ZSBjb21waWxlciB3YXJuaW5nLgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9Mb2FkX0dseXBoKTogQWRkIG1pc3NpbmcgaW5pdGlhbGl6YXRpb24KLQlvZiBzbG90LT5tZXRyaWNzLndpZHRoIGFuZCBzbG90LT5tZXRyaWNzLmhlaWdodCB3aGVuIGxvYWRpbmcgYQotCVdpbmRvd3MgRk5UIGdseXBoLiAgVGhhbmtzIHRvIEh1dyBEYXZpZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjbXJ1LmggKEZUQ19NcnVOb2RlX0NvbXBhcmVGdW5jKTogQ2hhbmdlCi0JcmV0dXJuIHR5cGUgdG8gRlRfQm9vbC4KLQotCSogc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMgKGZ0Y19iYXNpY19mYW1pbHlfY29tcGFyZSk6IENoYW5nZSByZXR1cm4KLQl0eXBlIHRvIEZUX0Jvb2wuCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChGVENfQ2FjaGVfSW5pdCwgZnRjX2NhY2hlX2luaXQpOiBNYWtlCi0JdGhlIGZvcm1lciBjYWxsIHRoZSBsYXR0ZXIsIG5vdCB2aWNlIHZlcnNhLgotCShGVENfQ2FjaGVfRG9uZSwgZnRjX2NhY2hlX2RvbmUpOiBEaXR0by4KLQotCSogc3JjL2NhY2hlL2Z0Y2dseXBoLmMgKEZUQ19HTm9kZV9Db21wYXJlLCBmdGNfZ25vZGVfY29tcGFyZSk6IE1ha2UKLQl0aGUgZm9ybWVyIGNhbGwgdGhlIGxhdHRlciwgbm90IHZpY2UgdmVyc2EuCi0JKEZUQ19HQ2FjaGVfSW5pdCwgZnRjX2djYWNoZV9pbml0KTogRGl0dG8uCi0JKEZUQ19HQ2FjaGVfRG9uZSwgZnRjX2djYWNoZV9kb25lKTogRGl0dG8uCi0KLQkqIHNyYy9jYWNoZS9mdGNpbWFnZS5jIChGVENfSU5vZGVfRnJlZSwgZnRjX2lub2RlX2ZyZWUpOiBNYWtlIHRoZQotCWZvcm1lciBjYWxsIHRoZSBsYXR0ZXIsIG5vdCB2aWNlIHZlcnNhLgotCShGVENfSU5vZGVfV2VpZ2h0LCBmdGNfaW5vZGVfd2VpZ2h0KTogRGl0dG8uCi0KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChmdGNfc2l6ZV9ub2RlX2NvbXBhcmUsCi0JZnRjX3NpemVfbm9kZV9jb21wYXJlX2ZhY2VpZCwgZnRjX2ZhY2Vfbm9kZV9jb21wYXJlKTogQ2hhbmdlIHJldHVybgotCXR5cGUgdG8gRlRfQm9vbC4KLQotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgKEZUQ19TTm9kZV9GcmVlLCBmdGNfc25vZGVfZnJlZSk6IE1ha2UgdGhlCi0JZm9ybWVyIGNhbGwgdGhlIGxhdHRlciwgbm90IHZpY2UgdmVyc2EuCi0JKEZUQ19TTm9kZV9XZWlnaHQsIGZ0Y19zbm9kZV93ZWlnaHQpOiBEaXR0by4KLQkoRlRDX1NOb2RlX0NvbXBhcmUsIGZ0Y19zbm9kZV9jb21wYXJlKTogRGl0dG8uCi0KLQkqIHNyYy9jYWNoZS9mdGNzYml0cy5jOiBGaXggc29tZSBidWdzIGFuZCBpbmVmZmljaWVuY2llcyBpbiB0aGUgY2FjaGUKLQlzdWItc3lzdGVtLgotCi0yMDA0LTA2LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2cpOiBTZXQgYGxzYl9kZWx0YScgYW5kCi0JYHJzYl9kZWx0YScgaW4gc2xvdC0+bWV0cmljcyBhbmQgdHVuZSBzaWRlIGJlYXJpbmdzIHNsaWdodGx5LgotCi0yMDA0LTA2LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wNi0wNCAgRGF2aWQgQ2hlc3RlciAgPGRhdmlkY2hlc3RlckBxbXgubmV0PgotCi0JSW1wcm92ZSBpbnRlci1sZXR0ZXIgc3BhY2luZyBmb3IgYXV0b2hpbnRlZCBnbHlwaHMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfR2x5cGhfTWV0cmljcyk6IEFkZCBlbGVtZW50cwotCWBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJy4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfbG9hZCk6IFNldCBgbHNiX2RlbHRhJyBhbmQKLQlgcnNiX2RlbHRhJyBpbiBzbG90LT5tZXRyaWNzIGFuZCB0dW5lIHNpZGUgYmVhcmluZ3Mgc2xpZ2h0bHkuCi0KLTIwMDQtMDYtMDQgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvKjogSW1wb3J0YW50IGZpeGVzIHRvIHRoZSBhdXRvLWZpdHRlci4gIFRoZSBvdXRwdXQKLQlub3cgc2VlbXMgdG8gYmUgMTAwJSBlcXVpdmFsZW50IHRvIHRoZSBhdXRvLWhpbnRlciwgd2hpbGUgYmVpbmcKLQlhYm91dCAyJSBmYXN0ZXIgKHdoaWNoIHByb3ZlcyB0aGF0IHNjcmlwdC1zcGVjaWZpYyBhbGdvcml0aG0KLQlzZWxlY3Rpb24gaXNuJ3QgYSBwZXJmb3JtYW5jZSBwcm9ibGVtKS4KLQotCVRvIHRlc3QgaXQsIGNoYW5nZSBgYXV0b2hpbnQnIHRvIGBhdXRvZml0JyBpbgotCTxmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaD4gYW5kIHJlY29tcGlsZS4KLQotCUEgZmV3IG1vcmUgdGVzdGluZyBpcyBuZWVkZWQgYmVmb3JlIG1ha2luZyB0aGlzIHRoZSBvZmZpY2lhbAotCWF1dG8taGludGluZyBtb2R1bGUuCi0KLTIwMDQtMDYtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoY29tcHV0ZV9nbHlwaF9tZXRyaWNzKTogRml4IGNvbXBpbGVyCi0Jd2FybmluZ3MuCi0KLTIwMDQtMDYtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHR0X2ZhY2VfZ2V0X25hbWUpOiBNYWtlIHN1cmUgdGhhdCBhbiBFbmdsaXNoCi0JbmFtZSByZWNvcmQgZm9yIHRoZSBBcHBsZSBwbGF0Zm9ybSBpcyBwcmVmZXJyZWQgdG8gYSBub24tRW5nbGlzaAotCWVudHJ5IGZvciB0aGUgTWljcm9zb2Z0IHBsYXRmb3JtLiAgUHJvYmxlbSByZXBvcnRlZCBieSBIQU5EQQotCUtlbidpY2hpLgotCi0yMDA0LTA1LTE5ICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChtbV9heGlzX3VubWFwLCBtbV93ZWlnaHRzX3VubWFwKTogTmV3Ci0JYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KLQkoVDFfR2V0X01NX1Zhcik6IFByb3ZpZGUgYXhpcyB0YWdzLgotCVVzZSBtbV9heGlzX3VubWFwIGFuZCBtbV93ZWlnaHRzX3VubWFwIHRvIHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMKLQlmb3IgZGVzaWduIGFuZCBub3JtYWxpemVkIGF4aXMgY29vcmRpbmF0ZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCAoUFNfRGVzaWduTWFwUmVjKTogQ2hhbmdlIHR5cGUgb2YKLQlgZGVzaWduX3BvaW50cycgdG8gRlRfTG9uZy4KLQlVcGRhdGUgYWxsIHVzZXJzLgotCi0yMDA0LTA1LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0YmJveC5jIChCQm94X0NvbmljX0NoZWNrKTogRml4IGJvdW5kYXJ5IGNhc2VzLgotCVJlcG9ydGVkIGJ5IE1pa2V5IEFuYmFyeSA8bWFuYmFyeUB2aXpydC5jb20+LgotCi0yMDA0LTA1LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2RvbmVfZmFjZSk6IEZyZWUgZmFjZS0+cG9zdHNjcmlwdF9uYW1lLgotCi0yMDA0LTA1LTE1ICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9tYXhfcHJvZmlsZSk6IEFsd2F5cyBzZXQKLQlmYWNlLT5yb290Lm51bV9nbHlwaHMuCi0KLTIwMDQtMDUtMTQgIE1hc2F0YWtlIFlBTUFUTyAgPGpldEBneXZlLm9yZz4KLQkgICAgR2VvcmdlIFdpbGxpYW1zICA8Z3d3QHNpbGNvbS5jb20+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChzZm50X2Rpcl9jaGVjayk6IEhhbmRsZSBgYmhlZCcgcHJvcGVybHkuCi0KLTIwMDQtMDUtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMgKGZ0Y19iYXNpY19mYW1pbHlfY29tcGFyZSwKLQlmdGNfYmFzaWNfZmFtaWx5X2luaXQsIGZ0Y19iYXNpY19mYW1pbHlfZ2V0X2NvdW50LAotCWZ0Y19iYXNpY19mYW1pbHlfbG9hZF9iaXRtYXAsIGZ0Y19iYXNpY19mYW1pbHlfbG9hZF9nbHlwaCwKLQlmdGNfYmFzaWNfZ25vZGVfY29tcGFyZV9mYWNlaWQpOiBBZGp1c3QgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzCi0JdG8gcHJvdG90eXBlcyBnaXZlbiBpbiBoZWFkZXIgZmlsZXMgZnJvbSBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlLgotCVVzZSBjYXN0cyB0byBwcm9wZXIgdHlwZXMgbG9jYWxseS4KLQkoZnRjX2Jhc2ljX2ltYWdlX2ZhbWlseV9jbGFzcywgZnRjX2Jhc2ljX2ltYWdlX2NhY2hlX2NsYXNzLAotCWZ0Y19iYXNpY19zYml0X2ZhbWlseV9jbGFzcywgZnRjX2Jhc2ljX3NiaXRfY2FjaGVfY2xhc3MpOiBSZW1vdmUKLQljYXN0cy4KLQotCSogc3JjL2NhY2hlL2Z0Y2NiYWNrLmg6IEFkanVzdCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZXMgdG8KLQlwcm90b3R5cGVzIGdpdmVuIGluIGhlYWRlciBmaWxlcyBmcm9tIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUuCi0KLQkqIHNyYy9jYWNoZS9mdGNpbWFnZS5jIChmdGNfaW5vZGVfZnJlZSwgZnRjX2lub2RlX25ldywKLQlmdGNfaW5vZGVfd2VpZ2h0KTogQWRqdXN0IHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcyB0byBwcm90b3R5cGVzCi0JZ2l2ZW4gaW4gaGVhZGVyIGZpbGVzIGZyb20gaW5jbHVkZS9mcmVldHlwZS9jYWNoZS4gIFVzZSBjYXN0cyB0bwotCXByb3BlciB0eXBlcyBsb2NhbGx5LgotCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3Nub2RlX2ZyZWUsIGZ0Y19zbm9kZV9uZXcsCi0JZnRjX3Nub2RlX3dlaWdodCwgZnRjX3Nub2RlX2NvbXBhcmUpOiBBZGp1c3QgcGFyYW1ldGVycyBhbmQgcmV0dXJuCi0JdHlwZXMgdG8gcHJvdG90eXBlcyBnaXZlbiBpbiBoZWFkZXIgZmlsZXMgZnJvbQotCWluY2x1ZGUvZnJlZXR5cGUvY2FjaGUuICBVc2UgY2FzdHMgdG8gcHJvcGVyIHR5cGVzIGxvY2FsbHkuCi0KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmMgKGZ0Y19jbWFwX25vZGVfZnJlZSwgZnRjX2NtYXBfbm9kZV9uZXcsCi0JZnRjX2NtYXBfbm9kZV93ZWlnaHQsIGZ0Y19jbWFwX25vZGVfY29tcGFyZSwKLQlmdGNfY21hcF9ub2RlX3JlbW92ZV9mYWNlaWQpOiBBZGp1c3QgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIHRvCi0JcHJvdG90eXBlcyBnaXZlbiBpbiBoZWFkZXIgZmlsZXMgZnJvbSBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlLiAgVXNlCi0JY2FzdHMgdG8gcHJvcGVyIHR5cGVzIGxvY2FsbHkuCi0JKGZ0Y19jbWFwX2NhY2hlX2NsYXNzKTogUmVtb3ZlIGNhc3RzLgotCi0JKiBzcmMvY2FjaGUvZnRjZ2x5cGguYyAoZnRjX2dub2RlX2NvbXBhcmUsIGZ0Y19nY2FjaGVfaW5pdCwKLQlmdGNfZ2NhY2hlX2RvbmUpOiBBZGp1c3QgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIHRvIHByb3RvdHlwZXMKLQlnaXZlbiBpbiBoZWFkZXIgZmlsZXMgZnJvbSBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlLiAgVXNlIGNhc3RzIHRvCi0JcHJvcGVyIHR5cGVzIGxvY2FsbHkuCi0KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChmdGNfc2l6ZV9ub2RlX2RvbmUsIGZ0Y19zaXplX25vZGVfY29tcGFyZSwKLQlmdGNfc2l6ZV9ub2RlX2luaXQsIGZ0Y19zaXplX25vZGVfcmVzZXQsCi0JZnRjX3NpemVfbm9kZV9jb21wYXJlX2ZhY2VpZCwgZnRjX2ZhY2Vfbm9kZV9pbml0LAotCWZ0Y19mYWNlX25vZGVfZG9uZSwgZnRjX2ZhY2Vfbm9kZV9jb21wYXJlOiBBZGp1c3QgcGFyYW1ldGVycyBhbmQKLQlyZXR1cm4gdHlwZXMgdG8gcHJvdG90eXBlcyBnaXZlbiBpbiBoZWFkZXIgZmlsZXMgZnJvbQotCWluY2x1ZGUvZnJlZXR5cGUvY2FjaGUuICBVc2UgY2FzdHMgdG8gcHJvcGVyIHR5cGVzIGxvY2FsbHkuCi0KLQkoZnRjX3NpemVfbGlzdF9jbGFzcywgZnRjX2ZhY2VfbGlzdF9jbGFzcyk6IFJlbW92ZSBjYXN0cy4KLQotMjAwNC0wNS0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2hpbnQvYWhtb2R1bGUuYyAoZnRfYXV0b2hpbnRlcl9pbml0LCBmdF9hdXRvaGludGVyX2RvbmUpOgotCVVzZSBGVF9Nb2R1bGUgYXMgcGFyYW1ldGVyIGFuZCBkbyBhIGNhc3QgdG8gRlRfQXV0b0hpbnRlciBsb2NhbGx5LgotCShhdXRvaGludF9tb2R1bGVfY2xhc3MpOiBSZW1vdmUgY2FzdHMuCi0KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyAoZnRfYml0bWFwX2dseXBoX2luaXQsIGZ0X2JpdG1hcF9nbHlwaF9jb3B5LAotCWZ0X2JpdG1hcF9nbHlwaF9kb25lLCBmdF9iaXRtYXBfZ2x5cGhfYmJveCwgZnRfb3V0bGluZV9nbHlwaF9pbml0LAotCWZ0X291dGxpbmVfZ2x5cGhfZG9uZSwgZnRfb3V0bGluZV9nbHlwaF9jb3B5LAotCWZ0X291dGxpbmVfZ2x5cGhfdHJhbnNmb3JtLCBmdF9vdXRsaW5lX2dseXBoX2Jib3gsCi0JZnRfb3V0bGluZV9nbHlwaF9wcmVwYXJlKTogVXNlIEZUX0dseXBoIGFzIHBhcmFtZXRlciBhbmQgZG8gYSBjYXN0Ci0JdG8gRlRfWFhYR2x5cGggbG9jYWxseS4KLQlVc2UgRlRfQ0FMTEJBQ0tfREVGIHRocm91Z2hvdXQuCi0JKGZ0X2JpdG1hcF9nbHlwaF9jbGFzcywgZnRfb3V0bGluZV9nbHlwaF9jbGFzcyk6IFJlbW92ZSBjYXN0cy4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChiZGZfY21hcF9pbml0LCBiZGZfY21hcF9kb25lLAotCWJkZl9jbWFwX2NoYXJfaW5kZXgsIGJkZl9jbWFwX2NoYXJfbmV4dCk6IFVzZSBGVF9DTWFwIGFzIHBhcmFtZXRlcgotCWFuZCBkbyBhIGNhc3QgdG8gQkRGX0NNYXAgbG9jYWxseS4KLQkoYmRmX2NtYXBfY2xhc3MpOiBSZW1vdmUgY2FzdHMuCi0KLTIwMDQtMDUtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5oIChDRkZfQnVpbGRlcik6IFJlbW92ZSBgZXJyb3InLgotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IFJlcGxhY2UKLQlgTWVtb3J5X0Vycm9yJyB3aXRoIGBGYWlsJyBhbmQgdXBkYXRlIGFsbCB1c2Vycy4KLQotMjAwNC0wNS0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX1BhcnNlU3RhdGUpOiBOZXcKLQllbnVtZXJhdGlvbi4KLQkoVDFfQnVpbGRlclJlYyk6IFJlcGxhY2UgYHBhdGhfYmVndW4nIHdpdGggYHBhcnNlX3N0YXRlJy4KLQlSZW1vdmUgYGVycm9yJy4KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogUmVwbGFjZQotCWBNZW1vcnlfRXJyb3InIHdpdGggYEZhaWwnIGFuZCB1cGRhdGUgYWxsIHVzZXJzLgotCURvbid0IHVzZSBgYnVpbGRlci0+ZXJyb3InLgotCVJlcGxhY2UgYHBhdGhfYmVndW4nIHdpdGggYHBhcnNlX3N0YXRlJyBhbmQgY2hlY2sgcGFyc2luZyBzdGF0ZXMuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAodDFfYnVpbGRlcl9pbml0LCB0MV9idWlsZGVyX3N0YXJ0X3BvaW50KToKLQlSZXBsYWNlIGBwYXRoX2JlZ3VuJyB3aXRoIGBwYXJzZV9zdGF0ZScgYW5kIGNoZWNrIHBhcnNpbmcgc3RhdGVzLgotCi0yMDA0LTA1LTEwICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCSogc3JjL3RydWV0eXBlL3R0eGd2YXIuYyAoZnRfdmFyX2xvYWRfYXZhcik6IERvIGZyZWUgYXJyYXlzIGluIGNhc2UKLQlvZiBlcnJvciAtLSBgYXZhcicgaXMgb3B0aW9uYWwgc28gd2UgY2FuJ3QgcmVseSBvbiB0dF9kb25lX2JsZW5kCi0JYmVpbmcgY2FsbGVkIGF1dG9tYXRpY2FsbHkuCi0KLTIwMDQtMDUtMDkgIEdlb3JnZSBXaWxsaWFtcyAgPGd3d0BzaWxjb20uY29tPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHR4Z3Zhci5jIChmdF92YXJfbG9hZF9hdmFyLCBmdF92YXJfbG9hZF9ndmFyKTogRml4Ci0JZXJyb3IgaGFuZGxpbmcuCi0KLTIwMDQtMDUtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Bmci9wZnJvYmpzLmMsIHNyYy9wZnIvcGZyb2Jqcy5oIChwZnJfZmFjZV9pbml0LAotCXBmcl9mYWNlX2RvbmUsIHBmcl9mYWNlX2dldF9rZXJuaW5nLCBwZnJfc2xvdF9pbml0LCBwZnJfc2xvdF9kb25lLAotCXBmcl9zbG90X2xvYWQpOiBEb24ndCB1c2UgUEZSX1hYWCBidXQgRlRfWFhYIGFyZ3VtZW50cyB3aGljaCBhcmUKLQl0eXBlY2FzdCB0byB0aGUgcHJvcGVyIFBGUl9YWFggdHlwZXMgd2l0aGluIHRoZSBmdW5jdGlvbi4KLQlVcGRhdGUgY29kZSBhY2NvcmRpbmdseS4KLQotCSogc3JjL3Bmci9wZnJkcml2ci5jIChwZnJfZ2V0X2tlcm5pbmcsIHBmcl9nZXRfYWR2YW5jZSwKLQlwZnJfZ2V0X21ldHJpY3MsIHBmcl9nZXRfc2VydmljZSk6IERvbid0IHVzZSBQRlJfWFhYIGJ1dCBGVF9YWFgKLQlhcmd1bWVudHMgd2hpY2ggYXJlIHR5cGVjYXN0IHRvIHRoZSBwcm9wZXIgUEZSX1hYWCB0eXBlcyB3aXRoaW4gdGhlCi0JZnVuY3Rpb24uCi0JVXBkYXRlIGNvZGUgYWNjb3JkaW5nbHkuCi0JVXNlIEZUX0NBTExCQUNLX0RFRiB0aHJvdWdob3V0LgotCShwZnJfbWV0cmljc19zZXJ2aWNlX3JlYywgcGZyX2RyaXZlcl9jbGFzcyk6IFJlbW92ZSBjYXN0cy4KLQotMjAwNC0wNS0wNiAgTWFzYXRha2UgWUFNQVRPICA8amV0QGd5dmUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9ndmFyKTogVXNlIEZUX0ZBQ0VfU1RSRUFNLgotCSgqKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlIE9mZnNldFRvRGF0YSB0byBvZmZzZXRUb0RhdGEuCi0KLTIwMDQtMDUtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9zaXplX2RvbmUsIGNmZl9zaXplX2luaXQsIGNmZl9zaXplX3Jlc2V0LAotCWNmZl9zbG90X2RvbmUsIGNmZl9zbG90X2luaXQsIGNmZl9mYWNlX2luaXQsIGNmZl9mYWNlX2RvbmUpOiBBY2Nlc3MKLQlyb290IGZpZWxkcyBkaXJlY3RseS4KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoTG9hZF9HbHlwaCk6IEFjY2VzcyByb290IGZpZWxkcyBkaXJlY3RseS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgpOiBTYXZlIGN1cnJlbnQKLQlmcmFtZSBiZWZvcmUgY2FsbGluZyBUVF9WYXJ5X0dldF9HbHlwaF9EZWx0YXMuCi0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYyAoUENGX0NNYXBSZWMpOiBSZW5hbWUgYGNtYXAnIHRvIGByb290JyBmb3IKLQljb25zaXN0ZW5jeS4KLQkocGNmX2NtYXBfaW5pdCwgcGNmX2NtYXBfZG9uZSwgcGNmX2NtYXBfY2hhcl9pbmRleCwKLQlwY2ZfY21hcF9jaGFyX25leHQpOiBEb24ndCB1c2UgUENGX1hYWCBidXQgRlRfWFhYIGFyZ3VtZW50cyB3aGljaAotCWFyZSB0eXBlY2FzdCB0byB0aGUgcHJvcGVyIFBDRl9YWFggdHlwZXMgd2l0aGluIHRoZSBmdW5jdGlvbi4KLQlVcGRhdGUgY29kZSBhY2NvcmRpbmdseS4KLQkocGNmX2NtYXBfY2xhc3MpOiBSZW1vdmUgY2FzdHMuCi0JKFBDRl9GYWNlX0RvbmUsIFBDRl9GYWNlX0luaXQsIFBDRl9TZXRfUGl4ZWxfU2l6ZSk6IERvbid0IHVzZQotCVBDRl9YWFggYnV0IEZUX1hYWCBhcmd1bWVudHMgd2hpY2ggYXJlIHR5cGVjYXN0IHRvIHRoZSBwcm9wZXIKLQlQQ0ZfWFhYIHR5cGVzIHdpdGhpbiB0aGUgZnVuY3Rpb24uCi0JVXBkYXRlIGNvZGUgYWNjb3JkaW5nbHkuCi0JVXNlIEZUX0NBTExCQUNLX0RFRiB0aHJvdWdob3V0LgotCShQQ0ZfU2V0X1BvaW50X1NpemUpOiBOZXcgd3JhcHBlciBmdW5jdGlvbi4KLQkoUENGX0dseXBoX0xvYWQsIHBjZl9kcml2ZXJfcmVxdWVzdGVyKTogVXNlIEZUX0NBTExCQUNLX0RFRi4KLQkocGNmX2RyaXZlcl9jbGFzcyk6IFJlbW92ZSBjYXN0cy4KLQotMjAwNC0wNS0wNCAgU3RldmUgSGFydHdlbGwgIDxzaHNwYW1zaW5rQGNvbWNhc3QubmV0PgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2RyaXZlcl9kb25lKTogRml4IHR5cG8uCi0KLTIwMDQtMDUtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfRmFjZV9Eb25lLCBCREZfRmFjZV9Jbml0LAotCUJERl9TZXRfUGl4ZWxfU2l6ZSk6IERvbid0IHVzZSBCREZfWFhYIGJ1dCBGVF9YWFggYXJndW1lbnRzIHdoaWNoCi0JYXJlIHR5cGVjYXN0IHRvIHRoZSBwcm9wZXIgQkRGX1hYWCB0eXBlcyB3aXRoaW4gdGhlIGZ1bmN0aW9uLgotCVVwZGF0ZSBjb2RlIGFjY29yZGluZ2x5LgotCVVzZSBGVF9DQUxMQkFDS19ERUYgdGhyb3VnaG91dC4KLQkoQkRGX1NldF9Qb2ludF9TaXplKTogTmV3IHdyYXBwZXIgZnVuY3Rpb24uCi0JKGJkZl9kcml2ZXJfY2xhc3MpOiBSZW1vdmUgY2FzdHMuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoR2V0X0tlcm5pbmcsIExvYWRfR2x5cGgsIGNmZl9nZXRfaW50ZXJmYWNlKToKLQlEb24ndCB1c2UgQ0ZGX1hYWCBidXQgRlRfWFhYIGFyZ3VtZW50cyB3aGljaCBhcmUgdHlwZWNhc3QgdG8gdGhlCi0JcHJvcGVyIENGRl9YWFggdHlwZXMgd2l0aGluIHRoZSBmdW5jdGlvbi4KLQlVcGRhdGUgY29kZSBhY2NvcmRpbmdseS4KLQlVc2UgRlRfQ0FMTEJBQ0tfREVGIHRocm91Z2hvdXQuCi0JKGNmZl9kcml2ZXJfY2xhc3MpOiBSZW1vdmUgY2FzdHMuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5oLCBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX3NpemVfZG9uZSwKLQljZmZfc2l6ZV9pbml0LCBjZmZfc2l6ZV9yZXNldCwgY2ZmX3Nsb3RfZG9uZSwgY2ZmX3Nsb3RfaW5pdCwKLQljZmZfZmFjZV9pbml0LCBjZmZfZmFjZV9kb25lLCBjZmZfZHJpdmVyX2luaXQsIGNmZl9kcml2ZXJfZG9uZSk6Ci0JRG9uJ3QgdXNlIENGRl9YWFggYnV0IEZUX1hYWCBhcmd1bWVudHMgd2hpY2ggYXJlIHR5cGVjYXN0IHRvIHRoZQotCXByb3BlciBDRkZfWFhYIHR5cGVzIHdpdGhpbiB0aGUgZnVuY3Rpb24uCi0JVXBkYXRlIGNvZGUgYWNjb3JkaW5nbHkuCi0JKGNmZl9wb2ludF9zaXplX3Jlc2V0KTogTmV3IHdyYXBwZXIgZnVuY3Rpb24uCi0KLQkqIHNyYy9jaWQvY2lkb2Jqcy5oLCBzcmMvY2lkL2NpZG9ianMuYyAoY2lkX3Nsb3RfZG9uZSwKLQljaWRfc2xvdF9pbml0LCBjaWRfc2l6ZV9kb25lLCBjaWRfc2l6ZV9pbml0LCBjaWRfc2l6ZV9yZXNldCwKLQljaWRfZmFjZV9kb25lLCBjaWRfZmFjZV9pbml0LCBjaWRfZHJpdmVyX2luaXQsIGNpZF9kcml2ZXJfZG9uZSk6Ci0JRG9uJ3QgdXNlIENJRF9YWFggYnV0IEZUX1hYWCBhcmd1bWVudHMgd2hpY2ggYXJlIHR5cGVjYXN0IHRvIHRoZQotCXByb3BlciBDSURfWFhYIHR5cGVzIHdpdGhpbiB0aGUgZnVuY3Rpb24uCi0JVXBkYXRlIGNvZGUgYWNjb3JkaW5nbHkuCi0JKGNpZF9wb2ludF9zaXplX3Jlc2V0KTogTmV3IHdyYXBwZXIgZnVuY3Rpb24uCi0KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYywgc3JjL2NpZC9jaWRnbG9hZC5oIChjaWRfc2xvdF9sb2FkX2dseXBoKToKLQlEb24ndCB1c2UgQ0lEX1hYWCBidXQgRlRfWFhYIGFyZ3VtZW50cyB3aGljaCBhcmUgdHlwZWNhc3QgdG8gdGhlCi0JcHJvcGVyIENJRF9YWFggdHlwZXMgd2l0aGluIHRoZSBmdW5jdGlvbi4KLQlVcGRhdGUgY29kZSBhY2NvcmRpbmdseS4KLQotCSogc3JjL2NpZC9jaWRyaXZlci5jIChjaWRfZ2V0X2ludGVyZmFjZSk6Ci0JRG9uJ3QgdXNlIENJRF9YWFggYnV0IEZUX1hYWCBhcmd1bWVudHMgd2hpY2ggYXJlIHR5cGVjYXN0IHRvIHRoZQotCXByb3BlciBDSURfWFhYIHR5cGVzIHdpdGhpbiB0aGUgZnVuY3Rpb24uCi0JVXBkYXRlIGNvZGUgYWNjb3JkaW5nbHkuCi0JVXNlIEZUX0NBTExCQUNLX0RFRi4KLQkodDFjaWRfZHJpdmVyX2NsYXNzKTogUmVtb3ZlIGNhc3RzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfZ2V0X2ludGVyZmFjZSk6IFVzZSBGVF9DQUxMQkFDS19ERUYuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9hdmFyKTogRG9uJ3QgZnJlZSBub24tbG9jYWwKLQl2YXJpYWJsZXMgKHRoaXMgaXMgZG9uZSBsYXRlcikuCi0JKGZ0X3Zhcl9sb2FkX2F2YXIpOiBGaXggY2FsbCB0byBGVF9GUkFNRV9FTlRFUi4KLQkoVFRfR2V0X01NX1Zhcik6IEZpeCBzaXplIGZvciBgZnZhcl9maWVsZHMnLgotCShUVF9WYXJ5X0dldF9HbHlwaF9EZWx0YXMpOiBIYW5kbGUgZGVhbGxvY2F0aW9uIG9mIGxvY2FsIHZhcmlhYmxlcwotCWNvcnJlY3RseS4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYyAoZnRfbWVtX2RlYnVnX3JlYWxsb2MpOiBEb24ndCBhYm9ydCBpZgotCWN1cnJlbnQgc2l6ZSBpcyB6ZXJvLgotCi0yMDA0LTA1LTAzICBTdGV2ZSBIYXJ0d2VsbCAgPHNoc3BhbXNpbmtAY29tY2FzdC5uZXQ+Ci0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuaCwgc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQsCi0JdHRfZmFjZV9kb25lLCB0dF9zaXplX2luaXQsIHR0X3NpemVfZG9uZSwgdHRfZHJpdmVyX2luaXQsCi0JdHRfZHJpdmVyX2RvbmUpOiBEb24ndCB1c2UgVFRfWFhYIGJ1dCBGVF9YWFggYXJndW1lbnRzIHdoaWNoIGFyZQotCXR5cGVjYXN0IHRvIHRoZSBwcm9wZXIgVFRfWFhYIHR5cGVzIHdpdGhpbiB0aGUgZnVuY3Rpb24uCi0JVXBkYXRlIGNvZGUgYWNjb3JkaW5nbHkuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jIChHZXRfS2VybmluZywgU2V0X0NoYXJfU2l6ZXMsCi0JU2V0X1BpeGVsX1NpemVzLCBMb2FkX0dseXBoLCB0dF9nZXRfaW50ZXJmYWNlKTogRG9uJ3QgdXNlIFRUX1hYWCBidXQKLQlGVF9YWFggYXJndW1lbnRzIHdoaWNoIGFyZSB0eXBlY2FzdCB0byB0aGUgcHJvcGVyIFRUX1hYWCB0eXBlcwotCXdpdGhpbiB0aGUgZnVuY3Rpb24uCi0JVXBkYXRlIGNvZGUgYWNjb3JkaW5nbHkuCi0JKHR0X2RyaXZlcl9jbGFzcyk6IFJlbW92ZSBjYXN0cy4KLQotMjAwNC0wNS0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9mcmVlX25hbWVzKTogQ2hlY2sgdGhhdCBgdGFibGUtPm5hbWVzJwotCWlzIG5vdCBOVUxMLiAgUmVwb3J0ZWQgYnkgR29yZG9uIENoaWxkcyA8Z2NoaWxkc0BxdWlja2N1dC5jb20uYXU+LgotCi0yMDA0LTA0LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvZm9ybWF0cy50eHQ6IEFkZCBtb3JlIGluZm9ybWF0aW9uIG9uIFBGUiBmb3JtYXQuCi0KLTIwMDQtMDQtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9mb3JtYXRzLnR4dDogTmV3IGZpbGUuCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDQtMDQtMjggIE1hc2F0YWtlIFlBTUFUTyAgPGpldEBneXZlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKEdYX0JsZW5kUmVjXykKLQlbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IEZpeCBhIHR5cG8uCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmggKEdYX0JsZW5kUmVjXyk6IEZpeCBhIHR5cG8uCi0KLTIwMDQtMDQtMjcgIE1hc2F0YWtlIFlBTUFUTyAgPGpldEBneXZlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuaDogVXNlIEZUX0xPQ0FMIGluc3RlYWQgb2YgRlRfTE9DQUxfREVGCi0JZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQotMjAwNC0wNC0yNSAgR2VvcmdlIFdpbGxpYW1zICA8Z3d3QHNpbGNvbS5jb20+Ci0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9hcHBseV90dXBsZSk6IEZpeCB0eXBvLgotCi0yMDA0LTA0LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS9KYW1maWxlLCBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDQtMDQtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jOiBSZXZlcnQgY2hhbmdlIGZyb20gMjAwNC0wNC0xNy4KLQkqIHNyYy9wY2YvcGNmdXRpbC5jOiBVc2UgRlRfTE9DQUxfREVGLgotCSogc3JjL3BjZi9wY2Z1dGlsLmg6IEluY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ILgotCVVzZSBGVF9CRUdJTl9IRUFERVIgYW5kIEZUX0VORF9IRUFERVIuCi0JVXNlIEZUX0xPQ0FMLgotCi0yMDA0LTA0LTI0ICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBBcHBsZSdzIGRpc3RvcnRhYmxlIGZvbnQgdGVjaG5vbG9neSAoaW4gR1ggZm9udHMpLgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQpOiBOZXcgbWFjcm8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtbS5oIChGVF9WYXJfQXhpcywgRlRfVmFyX05hbWVkX1N0eWxlLAotCUZUX01NX1Zhcik6IE5ldyBzdHJ1Y3R1cmVzLgotCShGVF9HZXRfTU1fVmFyLCBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcywKLQlGVF9TZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzKTogTmV3IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmggKEZUX0dldF9NTV9WYXJfRnVuYywKLQlGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jKTogTmV3IHR5cGVkZWZzLgotCVVwZGF0ZSBNdWx0aU1hc3RlcnMgc2VydmljZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmgKLQlbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IEluY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ILgotCShHWF9CbGVuZCkgW1RUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlRdOiBOZXcgdHlwZWRlZi4KLQkoVFRfRmFjZSkgW1RUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlRdOiBOZXcgbWVtYmVycyBgZG9ibGVuZCcKLQlhbmQgYGJsZW5kJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaCAoVFRBR19hdmFyLCBUVEFHX2N2YXIsIFRUQUdfZ3Zhcik6IE5ldwotCW1hY3Jvcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IEFkZCBgdHRneHZhcicuCi0KLQkqIHNyYy9iYXNlL2Z0bW0uYyAoRlRfR2V0X01NX1ZhciwgRlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMsCi0JRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyk6IE5ldyBmdW5jdGlvbnMuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2xvYWRfZmFjZSkKLQlbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IFNldCBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUwotCWZsYWcgZm9yIEdYIHZhciBmb250cy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYywgc3JjL3RydWV0eXBlL3R0Z3h2YXIuaDogTmV3IGZpbGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYyBbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IEluY2x1ZGUKLQl0dGd4dmFyLmMuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jIFtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogSW5jbHVkZQotCUZUX01VTFRJUExFX01BU1RFUlNfSCwgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gsIGFuZCB0dGd4dmFyLmguCi0JKHR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycykgW1RUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlRdOgotCU5ldyBzZXJ2aWNlLgotCSh0dF9zZXJ2aWNlcykgW1RUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlRdOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIFtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogSW5jbHVkZQotCXR0Z3h2YXIuaC4KLQkoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgsIGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpCi0JW1RUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlRdOiBTdXBwb3J0IEdYIHZhciBmb250cy4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jIFtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogSW5jbHVkZQotCXR0Z3h2YXIuaC4KLQkodHRfZG9uZV9mYWNlKSBbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IENhbGwKLQl0dF9kb25lX2JsZW5kLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jIFtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogSW5jbHVkZQotCXR0Z3h2YXIuaC4KLQkodHRfZmFjZV9sb2FkX2N2dCkgIFtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogQ2FsbAotCXR0X2ZhY2VfdmFyeV9jdnQuCi0KLQkqIHNyYy90cnVldHlwZS9ydWxlcy5tayAoVFRfRFJWX1NSQyk6IEFkZCB0dGd4dmFyLmMuCi0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9zZXJ2aWNlX211bHRpX21hc3RlcnMpOiBBZGQgVDFfR2V0X01NX1ZhcgotCWFuZCBUMV9TZXRfVmFyX0Rlc2lnbi4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChGVF9JTlRfVE9fRklYRUQsIEZUX0ZJWEVEX1RPX0lOVCk6IE5ldyBtYWNyb3MuCi0JKFQxX0dldF9NTV9WYXIsIFQxX1NldF9WYXJfRGVzaWduKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5oIChUMV9HZXRfTU1fVmFyLCBUMV9TZXRfVmFyX0Rlc2lnbik6IE5ldwotCWZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQotMjAwNC0wNC0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaCAoRlRfR2V0X0NoYXJNYXBfSW5kZXgpOiBSZW5hbWUKLQlkZWNsYXJhdGlvbiBhbmQgbW92ZSB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9HZXRfQ2hhcm1hcF9JbmRleCk6IEhlcmUuCi0JKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDkuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfQ2hhcm1hcF9JbmRleCk6IE5ldyBmdW5jdGlvbi4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gOTo3OjMuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFVwZGF0ZWQuCi0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvajogcy8yMTgvMjE5Ly4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChyZWZkb2MpLCBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyk6Ci0Jcy8yLjEuOC8yLjEuOS8uCi0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlZC4KLQotMjAwNC0wNC0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZXJfcnVuKSwgc3JjL3BzYXV4L3Bzb2Jqcy5jCi0JKHBzX3BhcnNlcl9sb2FkX2ZpZWxkKTogVXNlIEZUX0NIQVJfQklULgotCi0yMDA0LTA0LTIxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQotCSogVmVyc2lvbiAyLjEuOCByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBGaXggYSBzbWFsbCBtZW1vcnkgbGVhay4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyksIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMKLQkoYWZfYXV0b2ZpdHRlcl9sb2FkX2dseXBoKSwgc3JjL2Jhc2UvZnRkZWJ1Zy5jIChGVF9UcmFjZV9HZXRfTmFtZSk6Ci0JUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmg6IFVuZGVmaW5lIEFGX0RFQlVHLgotCi0JKiBzcmMvbHp3L3pvcGVuLmMgKHJtYXNrKSwgc3JjL3BjZi9wY2Zkcml2ci5jIChwY2Zfc2VydmljZV9iZGYsCi0JcGNmX3NlcnZpY2VzKSwgc3JjL3BjZi9wY2ZyZWFkLmMgKHRhYmxlTmFtZXMpLCBzcmMvcHNhdXgvcHNvYmpzLmMKLQkoZnRfY2hhcl90YWJsZSksIHNyYy90eXBlNDIvdDQyZHJpdnIuYyAodDQyX3NlcnZpY2VfZ2x5cGhfZGljdCwKLQl0NDJfc2VydmljZV9wc19mb250X25hbWUpOiBEZWNvcmF0ZSBkYXRhIGFycmF5cyB3aXRoIGBjb25zdCcgdG8KLQlhdm9pZCBwb3B1bGF0aW5nIHRoZSBgLmRhdGEnIHNlZ21lbnQuCi0KLQkqIHNyYy9sencvSmFtZmlsZTogTmV3IGZpbGUuCi0KLTIwMDQtMDQtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChUMVJhZGl4KTogUmVuYW1lZCB0by4uLgotCShwc19yYWRpeCk6IFRoaXMuCi0JVXBkYXRlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDQtMDQtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYywgc3JjL3RydWV0eXBlL3R0Z2xvYWQuaCAoVFRfTG9hZF9HbHlwaCksCi0Jc3JjL3R0ZHJpdmVyLmMgKExvYWRfR2x5cGgpOiBDaGFuZ2UgdHlwZSBvZiBgZ2x5cGhfaW5kZXgnIHRvCi0JRlRfVUludC4gIEZyb20gTGV4IFdhcm5lcnMuCi0KLTIwMDQtMDQtMTcgIENoaXNhdG8gWWFtYXVjaGkgIDxjeWFtYXVjaEBhLnBoeXMubmFnb3lhLXUuYWMuanA+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfc2ZudF9oZWFkZXIpOiBSZWFsbHkgZml4IGNoYW5nZQotCWZyb20gMjAwNC0wMy0xOS4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfRmFjZV9Jbml0KTogVXNlIGBmdF9zdHJsZW4nLgotCi0JKiBzcmMvcGNmL3BjZnV0aWwuYywgc3JjL3BjZi9wY2Z1dGlsLmg6IERlY29yYXRlIGZ1bmN0aW9ucyB3aXRoCi0JYHN0YXRpYycuCi0JUmVtb3ZlIHVudXNlZCBmdW5jdGlvbiBgUmVwYWRCaXRtYXAnLgotCSogc3JjL3BjZi9wY2Zkcml2ci5jOiBEb24ndCBpbmNsdWRlIHBjZnV0aWwuaC4KLQotMjAwNC0wNC0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW4gKHVzYWdlKTogRml4IGFuZCBpbXByb3ZlIHVzYWdlCi0JaW5mb3JtYXRpb24uCi0KLTIwMDQtMDQtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW4sIGJ1aWxkcy92bXMvZnRjb25maWcuaDogRGVmaW5lCi0JRlRfQ0hBUl9CSVQuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogRG9uJ3QgYXBwbHkgYXV0b2hpbnRpbmcgaWYKLQlnbHlwaCBpcyB2ZXJ0aWNhbGx5IGRpc3RvcnRlZCBvciBtaXJyb3JlZC4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfc2xvdF9sb2FkKTogSGFuZGxlIHplcm8gYHNpemUnIHByb3Blcmx5Ci0JZm9yIGVtYmVkZGVkIGJpdG1hcHMuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wNC0xNSAgYnl0ZXNvZnR3YXJlICA8Ynl0ZXNvZnR3YXJlQGJ0aW50ZXJuZXQuY29tPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oLCBzcmMvYmFzZS9mdHN0cmVhbS5jCi0JKEZUX1N0cmVhbV9SZWFkRmllbGRzKTogTW9yZSBmaXhlcyB1c2luZyBGVF9DSEFSX0JJVC4KLQotMjAwNC0wNC0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIChGVF9DSEFSX0JJVCk6IE5ldyBtYWNyby4KLQotMjAwNC0wNC0xNCAgQWxleCBTdHJlbG5pa292ICA8cHRrdHlyZkBtYWlsLnJ1PgotCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3Nub2RlX2xvYWQpOiBJbml0aWFsaXplIGAqYXNpemUnIGluIGNhc2UKLQlvZiBlcnJvci4KLQotMjAwNC0wNC0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jIFtfX0dOVUNfX106IERlZmluZSBPU19JTkxJTkUuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IERvbid0IHRyeSB0byByZW1vdmUgYC1hbnNpJyBjb21waWxhdGlvbgotCXN3aXRjaCBvbiB0aGUgTWFjLgotCi0JKiBidWlsZHMvdW5peC9sdG1haW4uc2g6IFJlZ2VuZXJhdGVkIHdpdGggYGxpYnRvb2xpemUgLS1mb3JjZQotCS0tY29weScgZnJvbSBsaWJ0b29sIDEuNS42LgotCSogYnVpbGRzL3VuaXgvYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQgd2l0aCBgYWNsb2NhbCAtSSAuJyBmcm9tCi0JYXV0b21ha2UgMS44YS4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjU5YS4KLQotMjAwNC0wNC0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oOiBVc2UgQ0hBUl9CSVQgdG8gZGVmaW5lCi0Jc2l6ZSBvZiBGVF9TSVpFT0ZfeHh4LgotCi0yMDA0LTA0LTEyICBDaGlzYXRvIFlhbWF1Y2hpICA8Y3lhbWF1Y2hAYS5waHlzLm5hZ295YS11LmFjLmpwPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaCAoVFRfRmluZF9TQml0X0ltYWdlX0Z1bmMsCi0JVFRfTG9hZF9TQml0X01ldHJpY3NfRnVuYyk6IE5ldyB0eXBlZGVmcy4KLQkoU0ZOVF9JbnRlcmZhY2UpOiBBZGQgZmluZF9zYml0X2ltYWdlIGFuZCBsb2FkX3NiaXRfbWV0cmljcy4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9pbnRlcmZhY2UpOiBVcGRhdGVkLgotCSogc3JjL3NmbnQvdHRzYml0LmggKHR0X2ZpbmRfc2JpdF9pbWFnZSwgdHRfbG9hZF9zYml0X21ldHJpY3MpOiBOZXcKLQlkZWNsYXJhdGlvbnMuCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAoZmluZF9zYml0X2ltYWdlKTogUmVuYW1lZCB0by4uLgotCSh0dF9maW5kX3NiaXRfaW1hZ2UpOiBUaGlzLgotCVVwZGF0ZWQgYWxsIGNhbGxlcnMuCi0JKGxvYWRfc2JpdF9tZXRyaWNzKTogUmVuYW1lZCB0by4uLgotCSh0dF9sb2FkX3NiaXRfbWV0cmljcyk6IFRoaXMuCi0JVXBkYXRlZCBhbGwgY2FsbGVycy4KLQotMjAwNC0wNC0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBjb25maWd1cmU6IEFjY2VwdCBtYWtlcHAgYWxzby4KLQotCSogYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rOiBVc2UgcHJvcGVyIHBhdGggdG8gdW5peC1kZWYubWsuCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbiAoQlVJTERfRElSLCBQTEFURk9STSk6IFJlbW92ZS4KLQkqIGJ1aWxkcy91bml4L3VuaXgubWsgKEJVSUxEX0RJUiwgUExBVEZPUk0pOiBEZWZpbmUuCi0JVXNlIEJVSUxEX0RJUi4KLQotCSogZG9jcy9JTlNUQUxMLCBkb2NzL0lOU1RBTEwuR05VLCBkb2NzL0lOU1RBTEwuVU5YOiBVcGRhdGUKLQlkb2N1bWVudGF0aW9uIG9uIG1ha2VwcC4KLQotMjAwNC0wNC0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvbHp3L3pvcGVuLmM6IERvbid0IGluY2x1ZGUgc3lzL3BhcmFtLmggYW5kIHN5cy9zdGF0LmguCi0KLTIwMDQtMDQtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2x6dy9mdGx6dy5jOiBJbmNsdWRlIHpvcGVuLmggZGVwZW5kZW50IG9uCi0JRlRfQ09ORklHX09QVElPTl9VU0VfTFpXLgotCi0JKiBzcmMvYmFzZS9mdGRlYnVnLmM6IHMvaW5kZXgvaWR4LyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQotMjAwNC0wNC0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9sdG1haW4uc2g6IFJlZ2VuZXJhdGVkIHdpdGggYGxpYnRvb2xpemUgLS1mb3JjZQotCS0tY29weScgZnJvbSBsaWJ0b29sIDEuNS4yLgotCSogYnVpbGRzL3VuaXgvYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQgd2l0aCBgYWNsb2NhbCAtSSAuJyBmcm9tCi0JYXV0b21ha2UgMS44YS4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjU5YS4KLQotMjAwNC0wNC0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9mdC1tdW5tYXAubTQgKEZUX01VTk1BUF9QQVJBTSk6IEZpeCBhcmd1bWVudHMgb2YKLQlBQ19DT01QSUxFX0lGRUxTRS4KLQkqIGJ1aWxkcy91bml4L2FjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkIHdpdGggYGFjbG9jYWwgLUkgLicgZnJvbQotCWF1dG9tYWtlIDEuOGEuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi41OWEuCi0JKiBidWlsZHMvdW5peC9jb25maWcuZ3Vlc3MsIGJ1aWxkcy91bml4L2NvbmZpZy5zdWI6IFVwZGF0ZWQgZnJvbQotCWBjb25maWcnIENWUyBtb2R1bGUgYXQgc3VidmVyc2lvbnMuZ251Lm9yZy4KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwtc2gsIGJ1aWxkcy91bml4L21raW5zdGFsbGRpcnM6IFVwZGF0ZWQgZnJvbQotCWB0ZXhpbmZvJyBDVlMgbW9kdWxlIGF0IHN1YnZlcnNpb25zLmdudS5vcmcuCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKHJlZmRvYyk6IFVwZGF0ZWQuCi0KLTIwMDQtMDMtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUhhbmRsZSBicm9rZW4gRk5UIGZpbGVzIHdoaWNoIGRvbid0IGhhdmUgYSB0cmFpbGluZyBOVUxMIGJ5dGUKLQlpbiB0aGUgZmFjZSBuYW1lIHN0cmluZy4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5oIChGTlRfRm9udFJlYyk6IE5ldyBtZW1iZXIgYGZhbWlseV9uYW1lJy4KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2ZvbnRfZG9uZSk6IEZyZWUgZm9udC0+ZmFtaWx5X25hbWUuCi0JKEZOVF9GYWNlX0luaXQpOiBBcHBlbmQgYSBmaW5hbCB6ZXJvIGJ5dGUgdG8gdGhlIGZvbnQgZmFjZSBuYW1lLgotCi0yMDA0LTAzLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfc2ZudF9oZWFkZXIpOiBGaXggY2hhbmdlIGZyb20KLQkyMDA0LTAzLTE5LgotCi0yMDA0LTAzLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Rlc2NyaXAubW1zIChPQkpTKTogQWRkIGZ0YmJveC5vYmouCi0KLTIwMDQtMDMtMjYgIEdlb3JnZSBXaWxsaWFtcyAgPGd3d0BzaWxjb20uY29tPgotCi0JQWRkIHZlcnRpY2FsIHBoYW50b20gcG9pbnRzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfTG9hZGVyUmVjKTogQWRkCi0JYHRvcF9iZWFyaW5nJywgYHZhZHZhbmNlJywgYHBwMycsIGFuZCBgcHA0Jy4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyk6IEhhbmRsZSB0d28gbW9yZSBwb2ludHMuCi0KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfaGludGVyX2xvYWQpOiBIYW5kbGUgdHdvIG1vcmUgcG9pbnRzLgotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoR2V0X1ZNZXRyaWNzKTogTmV3IGZ1bmN0aW9uLgotCShUVF9Mb2FkX1NpbXBsZV9HbHlwaCwgVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgpOiBIYW5kbGUgdHdvIG1vcmUKLQlwb2ludHMuCi0JKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBVc2UgR2V0X1ZNZXRyaWNzLgotCUhhbmRsZSB0d28gbW9yZSBwb2ludHMuCi0JKGNvbXB1dGVfZ2x5cGhfbWV0cmljcyk6IFRoYW5rcyB0byB2ZXJ0aWNhbCBwaGFudG9tIHBvaW50cyB3ZSBub3cKLQljYW4gYWx3YXlzIGNvbXB1dGUgYGFkdmFuY2VfaGVpZ2h0JyBhbmQgYHRvcF9iZWFyaW5nJy4KLQkqIHNyYy90cnVldHlwZS90dG9ianMuaCAoVFRfU3ViZ2x5cGhSZWMpOiBBZGQgdmVydGljYWwgcGhhbnRvbQotCXBvaW50cy4KLQotCi0JKiBzcmMvYXV0b2hpbnQvYWhnbHlwaC5jIChhaF9vdXRsaW5lX2xvYWQpOiBGaXggYWxsb2NhdGlvbiBvZgotCWBuZXdzJy4KLQotMjAwNC0wMy0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9HbHlwaF9Mb2FkKTogRml4IGxlZnQgc2lkZSBiZWFyaW5nLgotCi0yMDA0LTAzLTIwICBTdGV2ZSBIYXJ0d2VsbCAgPHNoc3BhbXNpbmtAY29tY2FzdC5uZXQ+Ci0KLQkqIHNyYy9jYWNoZS9mdGNtcnUuYyAoRlRDX01ydUxpc3RfUmVtb3ZlU2VsZWN0aW9uKTogSGFuZGxlIGEgTlVMTAotCXZhbHVlIGZvciBgc2VsZWN0aW9uJyBhcyBgc2VsZWN0IGFsbCcuCi0KLTIwMDQtMDMtMTkgIFN0ZXZlIEhhcnR3ZWxsICA8c2hzcGFtc2lua0Bjb21jYXN0Lm5ldD4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9zZm50X2hlYWRlcik6IFJlamVjdCBmYWNlX2luZGV4Ci0JdmFsdWVzID4gMCBpZiBsb2FkaW5nIG5vbi1UVEMgZm9udHMuCi0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKG9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IFNldCBwb3NpdGl2ZSBmYWNlX2luZGV4Ci0JdG8gemVybyBiZWZvcmUgY2FsbGluZyBGVF9PcGVuX0ZhY2UuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wMy0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBKYW1maWxlLCB2bXNfbWFrZS5jb20sIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS92Y3Byb2osIGluY2x1ZGUvZnJlZXR5cGUvZnRtb2RlcnIuaDoKLQlBZGQgTFpXIG1vZHVsZS4KLQotCSogSmFtZmlsZS5pbjogUmVtb3ZlZC4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oOiBzL01JTi9GVF9NSU4vLCBzL01BWC9GVF9NQVgvLAotCXMvQUJTL0ZUX0FCUy8uICBVcGRhdGVkIGFsbCBjYWxsZXJzLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2RpY3QpLCBzcmMvcGNmL3BjZmRyaXZyLmMKLQkoUENGX0ZhY2VfSW5pdCk6IFVzZSBGVF9FUlJPUl9CQVNFLgotCi0yMDA0LTAzLTA0ICBBbGJlcnQgQ2hpbiAgPGNoaW5hQHRoZXdyaXR0ZW53b3JkLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBQQ0YgZm9udHMgY29tcHJlc3NlZCB3aXRoIExaVyAoZXh0ZW5zaW9uIC5wY2YuWiwKLQljcmVhdGVkIHdpdGggYGNvbXByZXNzJykuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgsIGRldmVsL2Z0b3B0aW9uLmgKLQkoRlRfQ09ORklHX09QVElPTl9VU0VfTFpXKTogTmV3IG1hY3JvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bHp3Lmg6IE5ldyBmaWxlLgotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfTFpXX0gpOiBOZXcgbWFjcm8gZm9yCi0JZnRsencuaC4KLQotCSogc3JjL2x6dy8qOiBOZXcgZmlsZXMuCi0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYzogSW5jbHVkZSBGVF9MWldfSC4KLQkoUENGX0ZhY2VfSW5pdCk6IFRyeSBMWlcgYWxzby4KLQotCSogc3JjL2d6aXAvZnRnemlwLmM6IHMvMC9HemlwX0Vycl9Pay8gd2hlcmUgYXBwcm9wcmlhdGUuCi0JQmVhdXRpZnkuCi0KLTIwMDQtMDMtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uYyAocHNoX2hpbnRfdGFibGVfaW5pdCk6IFNpbXBsaWZ5IGNvZGUuCi0KLTIwMDQtMDMtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBlbWJlZGRlZCBiaXRtYXAgc3VwcG9ydCB0byBDRkYgZHJpdmVyLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuaCAoQ0ZGX1NpemVSZWMpOiBOZXcgc3RydWN0dXJlLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9idWlsZGVyX2luaXQpOiBVcGRhdGVkLgotCShjZmZfc2xvdF9sb2FkKTogVXBkYXRlZC4KLQlbVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTXTogTG9hZCBzYml0LgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoc2JpdF9zaXplX3Jlc2V0KQotCVtUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFNdOiBOZXcgZnVuY3Rpb24uCi0JKGNmZl9zaXplX2dldF9nbG9iYWxzX2Z1bmNzLCBjZmZfc2l6ZV9kb25lLCBjZmZfc2l6ZV9pbml0KTogVXBkYXRlZC4KLQkoY2ZmX3NpemVfcmVzZXQpOiBVcGRhdGVkLgotCVtUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFNdOiBDYWxsIHNiaXRfc2l6ZV9yZXNldC4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChMb2FkX0dseXBoKTogVXBkYXRlZC4KLQkoY2ZmX2RyaXZlcl9jbGFzcyk6IFVzZSBDRkZfU2l6ZVJlYy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA0LTAzLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2hpbnRlci9wc2hnbG9iLmMgKHBzaF9nbG9iYWxzX3NjYWxlX3dpZHRocyk6IERvbid0IHVzZQotCUZUX1JvdW5kRml4IGJ1dCBGVF9QSVhfUk9VTkQuCi0JKHBzaF9ibHVlc19zbmFwX3N0ZW0pOiBEb24ndCB1c2UgYmx1ZV9zaGlmdCBidXQgYmx1ZV90aHJlc2hvbGQuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmMgKFBTSF9TVFJPTkdfVEhSRVNIT0xEX01BWElNVU0pOiBOZXcgbWFjcm8uCi0JKHBzaF9nbHlwaF9maW5kX3N0cm9uZ19wb2ludHMpOiBVc2UgUFNIX1NUUk9OR19USFJFU0hPTERfTUFYSU1VTS4KLQkocHNoX2dseXBoX2ZpbmRfYmx1ZV9wb2ludHMpOiBOZXcgZnVuY3Rpb24uICBOZWVkZWQgZm9yIGZvbnRzIGxpa2UKLQlwMDUyMDAzbC5wZmIgKFVSVyBQYWxsYWRpbyBMIFJvbWFuKSB3aGljaCBoYXZlIGZsZXggY3VydmVzIGF0IHRoZQotCWJhc2UgbGluZSB3aXRoaW4gYmx1ZSB6b25lcywgYnV0IHRoZSBmbGV4IGN1cnZlcyBhcmVuJ3QgY292ZXJlZCBieQotCWhpbnRzLgotCShwc19oaW50c19hcHBseSk6IFVzZSBwc2hfZ2x5cGhfZmluZF9ibHVlX3BvaW50cy4KLQotMjAwNC0wMi0yNyAgR2FycmljayBNZWVrZXIgIDxnYXJyaWNrQGRpZ2l0YWxhbmFyY2h5LmNvbT4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjOiBGaXggY29tcGlsZXIgZmxhZ3MgZm9yCi0JYC0td2l0aC1vbGQtbWFjLWZvbnRzJy4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9iYXNlL2Z0bWFjLmM6IHMvVEFSR0VUX0FQSV9NQUNfQ0FSQk9OLyFUQVJHRVRfQVBJX01BQ19PUzgvLgotCShGVF9OZXdfRmFjZV9Gcm9tX1Jlc291cmNlKTogTmV3IGZ1bmN0aW9uLgotCShGVF9OZXdfRmFjZSk6IFVzZSBGVF9OZXdfRmFjZV9Gcm9tX1Jlc291cmNlLgotCShGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyk6IFVzZSBGVF9OZXdfRmFjZV9Gcm9tX1Jlc291cmNlLgotCVtfX01XRVJLU19fXTogRG9uJ3QgaW5jbHVkZSBGU3BfZm9wZW4uaC4KLQotMjAwNC0wMi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoZ2xvYi5jIChwc2hfZ2xvYmFsc19uZXcpOiBGaXggdmFsdWUgb2YKLQlgZGltLT5zdGR3LmNvdW50Jy4KLQlEb24ndCBhc3NpZ24gZGVmYXVsdCB2YWx1ZXMgdG8gYmx1ZSBzY2FsZSBhbmQgYmx1ZSBzaGlmdC4KLQotMjAwNC0wMi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDQtMDItMjUgIEdhcnJpY2sgTWVla2VyICA8Z2Fycmlja0BkaWdpdGFsYW5hcmNoeS5jb20+Ci0JICAgIFN0ZXZlIEhhcnR3ZWxsICA8c2hzcGFtc2lua0Bjb21jYXN0Lm5ldD4KLQotCUltcHJvdmUgTWFjT1MgZm9uZCBzdXBwb3J0LiAgUHJvdmlkZSBhIG5ldyBBUEkKLQlgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMnIHNpbWlsYXIgdG8gYEZUX05ld19GYWNlJy4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYyBbX19NV0VSS1NfX106IEluY2x1ZGUgRlNwX2ZvcGVuLmguCi0JU1RSRUFNX0ZJTEUgW19fTVdFUktTX19dOiBOZXcgbWFjcm8uCi0JKGZ0X0ZTcF9zdHJlYW1fY2xvc2UsIGZ0X0ZTcF9zdHJlYW1faW8pIFtfX01XRVJLU19fXTogTmV3IGZ1bmN0aW9ucy4KLQkoZmlsZV9zcGVjX2Zyb21fcGF0aCkgW19fTVdFUktTX19dOiBVcGRhdGVkICNpZiBzdGF0ZW1lbnQuCi0JKGdldF9maWxlX3R5cGUsIG1ha2VfbHdmbl9zcGVjKTogVXNlIGBjb25zdCcgZm9yIGFyZ3VtZW50LgotCShpc19kZm9udCkgW1RBUkdFVF9BUElfTUFDX0NBUkJPTl06IFJlbW92ZWQuCi0JKGNvdW50X2ZhY2Vfc2ZudCwgY291bnRfZmFjZXMpOiBOZXcgZnVuY3Rpb25zLgotCShwYXJzZV9mb25kKTogRG8gc29tZSByYW5nZSBjaGVja2luZy4KLQkocmVhZF9sd2ZuKTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIGFyZ3VtZW50LgotCU5vIGxvbmdlciBjYWxsIEZTcE9wZW5SZXNGaWxlLgotCShPcGVuRmlsZUFzUmVzb3VyY2UpOiBOZXcgZnVuY3Rpb24uCi0JKEZUX05ld19GYWNlX0Zyb21fTFdGTik6IFVzZSBgY29uc3QnIGZvciBzZWNvbmQgYXJndW1lbnQuCi0JVXNlIE9wZW5GaWxlQXNSZXNvdXJjZS4KLQkoRlRfTmV3X0ZhY2VfRnJvbV9TdWl0Y2FzZSk6IENoYW5nZSB0eXBlIG9mIHNlY29uZCBhcmd1bWVudC4KLQlObyBsb25nZXIgY2FsbCBGU3BPcGVuUmVzRmlsZS4KLQlMb29wIG92ZXIgYWxsIHJlc291cmNlIGluZGljZXMuCi0JKEZUX05ld19GYWNlX0Zyb21fZGZvbnQpIFtUQVJHRVRfQVBJX01BQ19DQVJCT05dOiBSZW1vdmVkLgotCShGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUpOiBVc2UgYGNvbnN0JyBmb3IgZmlyc3QgYXJndW1lbnQuCi0JKFJlc291cmNlRm9ya1NpemUpOiBSZW1vdmVkLgotCShGVF9OZXdfRmFjZSk6IFVwZGF0ZWQgdG8gdXNlIG5ldyBmdW5jdGlvbnMuCi0JKEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bWFjLmg6IFVwZGF0ZWQuCi0KLTIwMDQtMDItMjQgIE1hbGNvbG0gVGF5bG9yICA8bXRheWxvckBjbGVhci5uZXQubno+Ci0KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfaGludGVyX2xvYWQpIDxGVF9HTFlQSF9GT1JNQVRfT1VUTElORT46Ci0JSGFuZGxlIGNhc2Ugd2hlcmUgb3V0bGluZS0+bnVtX3ZlZGdlcyBpcyB6ZXJvIHdoaWxlIGNvbXB1dGluZyBoaW50ZWQKLQltZXRyaWNzLgotCi0yMDA0LTAyLTI0ICBHb3Jkb24gQ2hpbGRzICA8Z2NoaWxkc0BxdWlja2N1dC5jb20uYXU+Ci0KLQkqIHNyYy9jZmYvY2ZmY21hcC5jIChjZmZfY21hcF91bmljb2RlX2luaXQpOiBQcm92aWRlIGNvcnJlY3QgdmFsdWUKLQlmb3IgYGNvdW50Jy4KLQotMjAwNC0wMi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmggKFBTX1ByaXZhdGVSZWMpOiBBZGQKLQlgZXhwYW5zaW9uX2ZhY3RvcicuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hnbG9iIChwc2hfYmx1ZXNfc2NhbGVfem9uZXMpOiBGaXggY29tcHV0YXRpb24KLQlvZiBibHVlcy0+bm9fb3ZlcnNob290cyAtLSBgYmx1ZXNfc2NhbGUnIGlzIHN0b3JlZCB3aXRoIGEKLQltYWduaWZpY2F0aW9uIG9mIDEwMDAsIGFuZCBgc2NhbGUnIHJldHVybnMgZnJhY3Rpb25hbCBwaXhlbHMuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfT3Blbl9GYWNlKTogSW5pdGlhbGl6ZSBgYmx1ZV9zaGlmdCcsCi0JYGJsdWVfZnV6eicsIGBleHBhbnNpb25fZmFjdG9yJywgYW5kIGBibHVlX3NjYWxlJyBhY2NvcmRpbmcgdG8gdGhlCi0JVHlwZSAxIHNwZWNpZmljYXRpb24uCi0KLQkqIHNyYy90eXBlMS90MXRva2Vucy5oOiBIYW5kbGUgYEV4cGFuc2lvbkZhY3RvcicuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wMi0yNCAgTWFzYXRha2UgWUFNQVRPICA8amV0QGd5dmUub3JnPgotCi0JUHJvdmlkZSBnZW5lcmljIGFjY2VzcyB0byBNYWNPUyByZXNvdXJjZSBmb3Jrcy4KLQotCSogc3JjL2Jhc2UvZnRyZm9yay5jLCBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaDogTmV3Ci0JZmlsZXMuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1JGT1JLX0guCi0JKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UsIE1hY19SZWFkX3NmbnRfUmVzb3VyY2UpOiBSZW1vdmUgYXJndW1lbnRzCi0JYHJlc291cmNlX2xpc3RvZmZzZXQnIGFuZCBgcmVzb3VyY2VfZGF0YScgYW5kIGFkYXB0IGNvZGUKLQlhY2NvcmRpbmdseS4gIFRoZXNlIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBvdXRzaWRlIG9mIHRoZSBmdW5jdGlvbgotCW5vdy4KLQlBZGQgbmV3IGFyZ3VtZW50IGBvZmZzZXRzJy4KLQkoSXNNYWNSZXNvdXJjZSk6IFVzZSBgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbycgYW5kCi0JYEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzJy4KLQkobG9hZF9mYWNlX2luX2VtYmVkZGVkX3Jmb3JrKTogTmV3IGZ1bmN0aW9uLgotCShsb2FkX21hY19mYWNlKTogVXNlIGxvYWRfZmFjZV9pbl9lbWJlZGRlZF9yZm9yay4KLQkoZnRfaW5wdXRfc3RyZWFtX25ldyk6IFJlbmFtZWQgdG8uLi4KLQkoRlRfU3RyZWFtX05ldyk6IFRoaXMuICBVc2UgRlRfQkFTRV9ERUYuICBVcGRhdGVkIGFsbCBjYWxsZXJzLgotCShmdF9pbnB1dF9zdHJlYW1fZnJlZSk6IFJlbmFtZWQgdG8uLi4KLQkoRlRfU3RyZWFtX0ZyZWUpOiBUaGlzLiAgVXNlIEZUX0JBU0VfREVGLiAgVXBkYXRlZCBhbGwgY2FsbGVycy4KLQotCSogc3JjL2Jhc2UvZnRiYXNlLmM6IEluY2x1ZGUgZnRyZm9yay5jLgotCi0JKiBzcmMvYmFzZS9ydWxlcy5tayAoQkFTRV9TUkMpLCBzcmMvYmFzZS9KYW1maWxlOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmggKEZUX0lOVEVSTkFMX1JGT1JLX0gpOgotCU5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IEFkZGVkIGByZm9yaycgYXMgYSBuZXcKLQl0cmFjZSBkZWZpbml0aW9uLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg6IERlY2xhcmUgRlRfU3RyZWFtX05ldyBhbmQKLQlGVF9TdHJlYW1fRnJlZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCwgZGV2ZWwvZnRvcHRpb24uaAotCShGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLKTogTmV3IG9wdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCAoZnRfc3RycmNocik6IE5ldyBtYWNyby4KLQotMjAwNC0wMi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oOiBJbmNsdWRlIEZUX0ZSRUVUWVBFX0guCi0KLTIwMDQtMDItMjMgIE1hc2F0YWtlIFlBTUFUTyAgPGpldEBneXZlLm9yZz4KLQotCVByb3ZpZGUgYSBzaW1wbGUgQVBJIHRvIGNvbnRyb2wgRnJlZVR5cGUncyB0cmFjaW5nIGxldmVscy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmggKEZUX1RyYWNlX0dldF9Db3VudCwKLQlGVF9UcmFjZV9HZXRfTmFtZSk6IE5ldyBkZWNsYXJhdGlvbnMuCi0KLQkqIHNyYy9iYXNlL2Z0ZGVidWcuYyAoRlRfVHJhY2VfR2V0X0NvdW50LCBGVF9UcmFjZV9HZXRfTmFtZSk6IE5ldwotCWZ1bmN0aW9ucy4KLQotMjAwNC0wMi0yMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMsIHNyYy9hdXRvZml0L2FmaGludHMuaCwKLQlzcmMvYXV0b2ZpdC9hZmxhdGluLmMsIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMsIHNyYy90eXBlcy5oOiBHcmF2ZQotCWJ1Z3MgaGF2ZSBiZWVuIGZpeGVkLiAgVGhlIGF1dG8tZml0dGVyIHdvcmtzLCBkb2Vzbid0IGNyYXNoLCBidXQKLQlzdGlsbCBwcm9kdWNlcyB1bmV4cGVjdGVkIHJlc3VsdHMuLi4KLQotMjAwNC0wMi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jIChQU0hfU1RST05HX1RIUkVTSE9MRCk6IENoYW5nZWQgdG8gaG9sZAotCXRoZSBhY2NlcHRlZCBzaGlmdCBmb3Igc3Ryb25nIHBvaW50cyBpbiBmcmFjdGlvbmFsIHBpeGVscyAod2hpY2gKLQlpcyBhIGhldXJpc3RpYyB2YWx1ZSkuCi0JKHBzaF9nbHlwaF9maW5kX3N0cm9uZ19wb2ludHMpOiBDb21wdXRlIHRocmVzaG9sZCBmb3IKLQlwc2hfaGludF90YWJsZV9maW5kX3N0cm9uZ19wb2ludHMuCi0JKHBzaF9oaW50X3RhYmxlX2ZpbmRfc3Ryb25nX3BvaW50KTogQWRkIHBhcmFtZXRlciB0byBwYXNzIHRocmVzaG9sZC4KLQotMjAwNC0wMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMgKHBzX21hc2tfdGFibGVfc2V0X2JpdHMpOiBEb24ndCBjYWxsCi0JcHNfbWFza190YWJsZV9hbGxvYyBidXQgcHNfbWFza190YWJsZV9sYXN0LgotCShwc19oaW50c190Mm1hc2spOiBVc2UgY29ycmVjdCBwb3NpdGlvbiBhbmQgbnVtYmVyIGZvciB2ZXJ0aWNhbAotCWFuZCBob3Jpem9udGFsIGhpbnRlciBtYXNrIGJpdHMuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wMi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHN0cm9rZS5jIChGVF9HbHlwaF9TdHJva2VCb3JkZXIpOiBGaXggZW51bSBoYW5kbGluZy4KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9jbWFwX2luZm8pOiBSZW1vdmUgY29tcGlsZXIgd2FybmluZy4KLQotMjAwNC0wMi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IERvY3VtZW50IEZUX0xPQURfVEFSR0VUX1hYWCBwcm9wZXJseS4KLQotCSogc3JjL2Jhc2UvZnRnbHlwaC5jIChmdF9iaXRtYXBfZ2x5cGhfY2xhc3MsCi0JZnRfb3V0bGluZV9nbHlwaF9jbGFzcyk6IFRhZyB3aXRoIEZUX0NBTExCQUNLX1RBQkxFX0RFRi4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyKTogSGFuZGxlCi0JRlRfUkVOREVSX01PREVfTElHSFQuCi0KLTIwMDQtMDItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjYWxsYmFjayBmdW5jdGlvbnMgaW4gY2FjaGUgbW9kdWxlLgotCi0JKiBzcmMvY2FjaGUvZnRjY2JhY2suaDogTmV3IGZpbGUgZm9yIGNhbGxiYWNrIGRlY2xhcmF0aW9ucy4KLQotCSogc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMgKGZ0Y19iYXNpY19mYW1pbHlfY29tcGFyZSwKLQlmdGNfYmFzaWNfZmFtaWx5X2luaXQsIGZ0Y19iYXNpY19mYW1pbHlfZ2V0X2NvdW50LAotCWZ0Y19iYXNpY19mYW1pbHlfbG9hZF9iaXRtYXAsIGZ0Y19iYXNpY19mYW1pbHlfbG9hZF9nbHlwaCwKLQlmdGNfYmFzaWNfZ25vZGVfY29tcGFyZV9mYWNlaWQpOiBVc2UgRlRfQ0FMTEJBQ0tfREVGLgotCShmdGNfYmFzaWNfaW1hZ2VfZmFtaWx5X2NsYXNzLCBmdGNfYmFzaWNfaW1hZ2VfY2FjaGVfY2xhc3MsCi0JZnRjX2Jhc2ljX3NiaXRfZmFtaWx5X2NsYXNzLCBmdGNfYmFzaWNfc2JpdF9jYWNoZV9jbGFzcyk6Ci0JVXNlIEZUX0NBTExCQUNLX1RBQkxFX0RFRiBhbmQgbG9jYWwgd3JhcHBlciBmdW5jdGlvbnMuCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jOiBJbmNsdWRlIGZ0Y2NiYWNrLmguCi0JKGZ0Y19jYWNoZV9pbml0LCBmdGNfY2FjaGVfZG9uZSk6IE5ldyB3cmFwcGVyIGZ1bmN0aW9ucyB3aGljaCB1c2UKLQlGVF9MT0NBTF9ERUYuCi0KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmM6IEluY2x1ZGUgZnRjY2JhY2suaC4KLQkoZnRjX2NtYXBfY2FjaGVfY2xhc3MpOiBVc2UgbG9jYWwgd3JhcHBlciBmdW5jdGlvbnMuCi0KLQkqIHNyYy9jYWNoZS9mdGNnbHlwaC5jOiBJbmNsdWRlIGZ0Y2NiYWNrLmguCi0JKGZ0Y19nbm9kZV9jb21wYXJlLCBmdGNfZ2NhY2hlX2luaXQsIGZ0Y19nY2FjaGVfZG9uZSk6IE5ldyB3cmFwcGVyCi0JZnVuY3Rpb25zIHdoaWNoIHVzZSBGVF9MT0NBTF9ERUYuCi0KLQkqIHNyYy9jYWNoZS9mdGNpbWFnZS5jOiBJbmNsdWRlIGZ0Y2NiYWNrLmguCi0JKGZ0Y19pbm9kZV9mcmVlLCBmdGNfaW5vZGVfbmV3LCBmdGNfaW5vZGVfd2VpZ2h0KTogTmV3IHdyYXBwZXIKLQlmdW5jdGlvbnMgd2hpY2ggdXNlIEZUX0xPQ0FMX0RFRi4KLQotCSogc3JjL2NhY2hlL2Z0Y21hbmFnLmMgKGZ0Y19zaXplX2xpc3RfY2xhc3MsIGZ0Y19mYWNlX2xpc3RfY2xhc3MpOgotCVVzZSBGVF9DQUxMQkFDS19UQUJMRV9ERUYuCi0KLQkqIHNyYy9jYWNoZTsvZnRjc2JpdHMuYzogSW5jbHVkZSBmdGNjYmFjay5oLgotCShmdGNfc25vZGVfZnJlZSwgZnRjX3Nub2RlX25ldywgZnRjX3Nub2RlX3dlaWdodCwKLQlmdGNfc25vZGVfY29tcGFyZSk6IE5ldyB3cmFwcGVyIGZ1bmN0aW9ucyB3aGljaCB1c2UgRlRfTE9DQUxfREVGLgotCi0JKiBzcmMvY2FjaGUvcnVsZXMubWsgKENBQ0hFX0RSVl9IKTogQWRkIGZ0Y2NiYWNrLmguCi0KLTIwMDQtMDItMTcgIE1hc2F0YWtlIFlBTUFUTyAgPGpldEBneXZlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oIChGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUpOiBGaXggYSB0eXBvCi0JKEZUX0VYUE9SVF9ERUYgLT4gRlRfRVhQT1JUKS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHhmODYuaCAoRlRfR2V0X1gxMV9Gb250X0Zvcm1hdCk6IERpdHRvLgotCi0yMDA0LTAyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfQ2hhcl9TaXplKTogRml4IHR5cG8uCi0KLTIwMDQtMDItMTQgIE1hc2F0YWtlIFlBTUFUTyAgPGpldEBneXZlLm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYzogSW5jbHVkZSBlcnJuby5oLgotCShmdF9jbG9zZV9zdHJlYW0pOiBSZW5hbWVkIHRvLi4uCi0JKGZ0X2Nsb3NlX3N0cmVhbV9ieV9tdW5tYXApOiBUaGlzLgotCShmdF9jbG9zZV9zdHJlYW1fYnlfZnJlZSk6IE5ldyBmdW5jdGlvbi4KLQkoRlRfU3RyZWFtX09wZW4pOiBVc2UgZmFsbGJhY2sgbWV0aG9kIGlmIG1tYXAgZmFpbHMuCi0JVXNlIHByb3BlciBmdW5jdGlvbiBmb3IgY2xvc2luZyB0aGUgc3RyZWFtLgotCi0yMDA0LTAyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZGljdCk6IEluaXRpYWxpemUgYHN0YXJ0X2JpbmFyeScuCi0KLTIwMDQtMDItMTMgIFJvYmVydCBFdGhlcmlkZ2UgIDxyb2JlcnRlQHN0Y2MuY2MudHgudXM+Ci0KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KSwgc3JjL3R5cGUxL3Qxb2Jqcy5jCi0JKFQxX0ZhY2VfSW5pdCksIHNyYy9jaWQvY2lkb2Jqcy5jIChjaWRfZmFjZV9pbml0KTogRml4IGNvbXB1dGF0aW9uCi0Jb2YgdW5kZXJsaW5lX3Bvc2l0aW9uIGFuZCB1bmRlcmxpbmVfdGhpY2tuZXNzLgotCi0yMDA0LTAyLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfQ2hhcl9TaXplKTogUmV0dXJuIGltbWVkaWF0ZWx5IGlmCi0JcHBlbSB2YWx1ZXMgZG9uJ3QgY2hhbmdlLiAgU3VnZ2VzdGVkIGJ5IEdyYWhhbSBBc2hlci4KLQotMjAwNC0wMi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAoY2lkX2ZhY2Vfb3Blbik6IEFsd2F5cyBhbGxvY2F0ZQotCWZhY2UtPmNpZF9zdHJlYW0gc28gdGhhdCB3ZSBjYW4gZGVhbGxvY2F0ZSBpdCBzYWZlbHkuCi0KLTIwMDQtMDItMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgdGhlIFBTIHBhcnNlciBtb3JlIHRvbGVyYW50IHcuci50LiBub24tc3RhbmRhcmQgZm9udCBkYXRhLiAgSW4KLQlnZW5lcmFsLCBhbiBlcnJvciBpcyBvbmx5IHJlcG9ydGVkIGluIGNhc2Ugb2YgYSBzeW50YXggZXJyb3I7IGEKLQl3cm9uZyB0eXBlIGlzIG5vdyBzaW1wbHkgaWdub3JlZCAoaWYgcG9zc2libGUpLiAgVG8gYmUgaW5kZXBlbmRlbnQKLQlvZiB0aGUgb3JkZXIgb2YgdmFyaW91cyBNTS1zcGVjaWZpYyBrZXl3b3JkcywgdGhlIHBhcnNlX3NoYXJlZF9kaWN0Ci0Jcm91dGluZSBoYXMgYmVlbiByZW1vdmVkIC0tIHRoZSBQUyBwYXJzZXIgaXMgbm93IGNhcGFibGUgdG8gc2tpcAotCXRoaXMgZGF0YS4gIEl0IG5vIGxvbmdlciBmYWlscyBvbiBwYXJzaW5nIGUuZy4KLQotCSAgZHVwIC9XZWlnaHRWZWN0b3IgZXhjaCBkZWYKLQotCVNpbmNlIHRoZSB0b2tlbiBmb2xsb3dpbmcgL1dlaWdodFZlY3RvciBpc24ndCBgWycgKHN0YXJ0aW5nIGFuCi0JYXJyYXkpIGl0IGlzIHNpbXBseSBpZ25vcmVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyZGVmLmg6IERlZmluZSBgRlRfRXJyX0lnbm9yZScgKDB4QTIpIGFzIGEKLQluZXcgaW50ZXJuYWwgZXJyb3IgdmFsdWUuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfYmxlbmRfYXhpc190eXBlcywKLQlwYXJzZV9ibGVuZF9kZXNpZ25fcG9zaXRpb25zLCBwYXJzZV9ibGVuZF9kZXNpZ25fbWFwKTogUmV0dXJuCi0JVDFfRXJyX0lnbm9yZSBpZiBubyBwcm9wZXIgYXJyYXkgaXMgZm9sbG93aW5nIHRoZSBrZXl3b3JkLgotCShwYXJzZV93ZWlnaHRfdmVjdG9yKTogVXNlIFQxX1RvVG9rZW5BcnJheSwgaW5pdGlhbGl6aW5nIGBibGVuZCcKLQlzdHJ1Y3R1cmUsIGlmIG5lY2Vzc2FyeS4KLQlSZXR1cm4gVDFfRXJyX0lnbm9yZSBpZiBubyBwcm9wZXIgYXJyYXkgaXMgZm9sbG93aW5nIHRoZSBrZXl3b3JkLgotCShwYXJzZV9zaGFyZWRfZGljdCk6IFJlbW92ZWQuCi0JKHBhcnNlX2VuY29kaW5nKTogU2V0IHBhcnNlci0+cm9vdC5lcnJvciB0byByZXR1cm4gVDFfRXJyX0lnbm9yZQotCWlmIG5vIHJlc3VsdCBjYW4gYmUgb2J0YWluZWQuCi0JQ2hlY2sgZm9yIGVycm9ycyBiZWZvcmUgYWNjZXNzaW5nIGBlbGVtZW50cycgYXJyYXkuCi0JKHQxX2tleXdvcmRzKTogUmVtb3ZlIC9zaGFyZWRkaWN0LgotCShwYXJzZV9kaWN0KTogUmVzZXQgZXJyb3IgaWYgdDFfbG9hZF9rZXl3b3JkIHJldHVybnMgVDFfRXJyX0lnbm9yZS4KLQlTZXQga2V5d29yZF9mbGFnIG9ubHkgaW4gY2FzZSBvZiBzdWNjZXNzLgotCUNoZWNrIGVycm9yIGNvZGUgaWYgc2tpcHBpbmcgYW4gdW5yZWNvZ25pemVkIHRva2VuLgotCShUMV9PcGVuX0ZhY2UpIFshVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUXTogQ2FsbCBUMV9Eb25lX0JsZW5kCi0JaWYgYmxlbmQgY29tbWFuZHMgaGF2ZW4ndCBzZXQgdXAgYSBwcm9wZXIgTU0gZm9udC4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19wYXJzZXJfbG9hZF9maWVsZF90YWJsZSk6IFJlbW92ZSBzcGVjaWFsCi0JY29kZSBmb3Igc3ludGhldGljIGZvbnRzLgotCVJldHVybiBQU2F1eF9FcnJfSWdub3JlIGlmIG5vIHByb3BlciB2YWx1ZSBoYXMgYmVlbiBmb3VuZC4KLQotMjAwNC0wMi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxjZmZfb3BfZW5kY2hhcj46IFByZXNlcnZlIGdseXBoIHdpZHRoIGJlZm9yZSBjYWxsaW5nCi0JY2ZmX29wZXJhdG9yX3NlYWMuCi0KLTIwMDQtMDItMDkgIE1hcnRpbiBNdXNrZW5zICA8bW11c2tlbnNAYXVyZWxvbi5jb20+Ci0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBIYW5kbGUgc3BlY2lhbAotCWZpcnN0IGFyZ3VtZW50IGZvciBgaGludG1hc2snIGFuZCBgY250cm1hc2snIG9wZXJhdG9ycyBhbHNvLgotCi0yMDA0LTAyLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5pbjogQ2FsbCBBQ19TVUJTVCBmb3IgYGVuYWJsZV9zaGFyZWQnLAotCWBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjJywgYW5kIGB3bCcuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW46IE1ha2UgLS1wcmVmaXggYW5kIC0tZXhlYy1wcmVmaXgKLQlhY3R1YWxseSB3b3JrLgotCVJlcG9ydCBhIHByb3BlciAtLXJwYXRoIChvciAtUikgdmFsdWUgZm9yIC0tbGlicyBhcmd1bWVudCBpZiBhCi0Jc2hhcmVkIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wMi0wNyAgS2VpdGggUGFja2FyZCAgPGtlaXRocEBrZWl0aHAuY29tPgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9GYWNlX0luaXQsIEJERl9TZXRfUGl4ZWxfU2l6ZSk6IEZpeAotCWNvbXB1dGF0aW9uIG9mIHZhcmlvdXMgdmVydGljYWwgYW5kIGhvcml6b250YWwgbWV0cmljIHZhbHVlcy4KLQotCSogc3JjL3BjZmRyaXZyLmMgKFBDRl9TZXRfUGl4ZWxfU2l6ZSksIHNyYy9wY2ZyZWFkIChwY2ZfbG9hZF9mb250KToKLQlEaXR0by4KLQotMjAwNC0wMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3csIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wMi0wNyAgVml0YWxpeSBQYXN0ZXJuYWsgIDx2X2FfcGFzdGVybmFrQG1haWwucnU+Ci0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnNsbiwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2o6IE5ldyBmaWxlcyBmb3IgVlMuTkVUIDIwMDMuCi0KLTIwMDQtMDItMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNjYWNoZS5oIChGVENfQ0FDSEVfTE9PS1VQX0NNUCk6Ci0JSW5pdGlhbGl6ZSBgbm9kZScuCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2RpY3QpOiBJbml0aWFsaXplIGBoYXZlX2ludGVnZXInLgotCi0yMDA0LTAyLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZGljdCk6IEhhbmRsZSBgUkQnIGFuZCBgLXwnIGNvbW1hbmRzCi0Jb3V0c2lkZSBvZiAvU3VicnMgb3IgL0NoYXJTdHJpbmdzLiAgVGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIGlzCi0JYWRkaXRpb25hbCBjb2RlIG1hbmlwdWxhdGluZyB0aG9zZSB0d28gYXJyYXlzIHNvIHRoYXQgRnJlZVR5cGUKLQlkb2Vzbid0IHJlY29nbml6ZSB0aGVtIHByb3Blcmx5LgotCShUMV9PcGVuX0ZhY2UpOiBJbXByb3ZlIGFuIGVycm9yIG1lc3NhZ2UuCi0KLTIwMDQtMDItMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9jaGFyc3RyaW5ncyk6IEV4aXQgaW1tZWRpYXRlbHkgaWYKLQl0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gL0NoYXJTdHJpbmdzLiAgVGhpcyBpcyBuZWVkZWQgZm9yIGZvbnRzCi0JbGlrZSBPcHRpbWEtT2JsaXF1ZSB3aGljaCBub3Qgb25seSBkZWZpbmUgL0NoYXJTdHJpbmdzIGJ1dCBhY2Nlc3MgaXQKLQlhbHNvLgotCi0yMDA0LTAyLTAxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9zZm50L0phbWZpbGU6IFJlbW92aW5nIGB0dGNtYXAnIGZyb20gdGhlIGxpc3Qgb2Ygc291cmNlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNjYWNoZS5oIChGVENfQ0FDSEVfTE9PS1VQX0NNUCkKLQk8RlRDX0lOTElORT46IFByb3ZpZGUgbWFjcm8gdmVyc2lvbiB3aGljaCBkb2Vzbid0IHVzZSBpbmxpbmUgY29kZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjZ2x5cGguaCAoRlRDX0dDQUNIRV9MT09LVVBfQ01QKQotCTxGVENfSU5MSU5FPjogRGl0dG8uCi0JVXNlIEZUQ19NUlVMSVNUX0xPT0tVUF9DTVAuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y21ydS5oIChGVENfTVJVTElTVF9MT09LVVBfQ01QKTogTmV3Ci0JbWFjcm8uCi0JKEZUQ19NUlVMSVNUX0xPT0tVUCk6IFVzZSBpdC4KLQotCSogc3JjL2NhY2hlL0phbWZpbGUgKF9zb3VyY2VzKSwgc3JjL2NhY2hlL2Rlc2NyaXAubW1zOiBVcGRhdGVkLgotCSogc3JjL2NhY2hlL2Z0Y2Jhc2ljLmM6IEZpeCBjb21waWxlciB3YXJuaW5ncy4KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChGVENfTWFuYWdlcl9Mb29rdXBTaXplLAotCUZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UpIDxGVENfSU5MSU5FPjogVXNlIEZUQ19NUlVMSVNUX0xPT0tVUF9DTVAuCi0JKiBzcmMvY2FjaGUvZnRjbXJ1LmMgKEZUQ19NcnVMaXN0X0ZpbmQpOiBGaXggYSBidWcgKGZvdW5kIGFmdGVyCi0JaGVhdnkgdGVzdGluZykuCi0KLQkqIEphbWZpbGU6IFVwZGF0aW5nIGByZWZkb2MnIHRhcmdldCwgYW5kIGFkZGluZyBgYXV0b2hpbnQnIHRvIHRoZQotCWxpc3Qgb2YgbW9kdWxlcyB0byBidWlsZC4gIEJvdGggdGhlIGF1dG9oaW50ZXIgYW5kIGF1dG9maXR0ZXIgd2lsbAotCWJlIGJ1aWx0IGJ5IGRlZmF1bHQuICBCdXQgd2hpY2ggb25lIHdpbGwgYmUgdXNlZCBpcyBkZXRlcm1pbmVkIGJ5Ci0JdGhlIGNvbnRlbnQgb2YgYGZ0bW9kdWxlLmgnLgotCi0JKiBzcmMvYXV0b2ZpdC8qOiBNYW55IHVwZGF0ZXMsIGJ1dCB0aGUgY29kZSBpcyBzdGlsbCBidWdneS4uLgotCi0yMDA0LTAxLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX29wZXJhdG9yX3NlYWMpOiBGaXggbWFnbml0dWRlIG9mCi0JYWNjZW50IG9mZnNldC4KLQlVcGRhdGUgY29kZSBzaW1pbGFybHkgdG8gdGhlIHNlYWMgc3VwcG9ydCBmb3IgVHlwZSAxIGZvbnRzLgotCShjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykgPGNmZl9vcF9lbmRjaGFyPjogRml4IG1hZ25pdHVkZQotCW9mIGFjY2VudCBvZmZzZXQuCi0JRG9uJ3QgaGludCBnbHlwaHMgdHdpY2UgaWYgc2VhYyBpcyBlbXVsYXRlZC4KLQk8Y2ZmX29wX2ZsZXg+OiBBc3NpZ24gY29ycmVjdCBwb2ludCB0YWdzLgotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA0LTAxLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MXBhcnNlLmMgKFQxX0dldF9Qcml2YXRlX0RpY3QpOiBVc2UgRlRfTUVNX01PVkUsIG5vdAotCUZUX01FTV9DT1BZLCBmb3IgY29weWluZyB0aGUgcHJpdmF0ZSBkaWN0LgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX3N1YnJzKTogQXNzaWduIG51bWJlciBvZiBzdWJycyBvbmx5Ci0JaW4gZmlyc3QgcnVuLgotCShwYXJzZV9jaGFyc3RyaW5ncyk6IFBhcnNlIC9DaGFyU3RyaW5ncyBpbiBzZWNvbmQgcnVuIHdpdGhvdXQKLQlhc3NpZ25pbmcgdmFsdWVzLgotCShwYXJzZV9kaWN0KTogU2tpcCBhbGwgL0NoYXJTdHJpbmdzIGFycmF5cyBidXQgdGhlIGZpcnN0LiAgV2UgbmVlZAotCXRoaXMgZm9yIG5vbi1zdGFuZGFyZCBmb250cyBsaWtlIGBPcHRpbWEnIHdoaWNoIGhhdmUgZGlmZmVyZW50Ci0Jb3V0bGluZXMgZGVwZW5kaW5nIG9uIHRoZSByZXNvbHV0aW9uLiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vCi0JZ3VhcmFudGVlIHRoYXQgd2UgZ2V0IGZpdHRpbmcgL1N1YnJzIGFuZCAvQ2hhclN0cmluZ3MgYXJyYXlzOyB0aGlzCi0JY2FuIG9ubHkgYmUgZG9uZSBieSBhIHJlYWwgUFMgaW50ZXJwcmV0ZXIuCi0KLTIwMDQtMDEtMjkgIEFudG9pbmUgTGVjYSAgPEFudG9pbmUtRnJlZXR5cGVATGVjYS1NYXJ0aS5vcmc+Ci0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWw6IE5ldyBmaWxlLCBnaXZpbmcgZGV0YWlsZWQKLQlleHBsYW5hdGlvbnMgYWJvdXQgZm9yY2luZyBDUitMRiBsaW5lIGVuZGluZ3MgZm9yIHRoZSBWQysrIHByb2plY3QKLQlmaWxlcy4KLQotMjAwNC0wMS0yMiAgR2FycmljayBNZWVrZXIgIDxnYXJyaWNrQGRpZ2l0YWxhbmFyY2h5LmNvbT4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9zdWJmb250X2xvYWQpOiBJbml0aWFsaXplIGBkaWN0Jy4KLQotMjAwNC0wMS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkIHN1cHBvcnQgZm9yIHRoZSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBiaW5hcnkgZGF0YQotCXN0YXJ0ZWQgd2l0aCBgU3RhcnREYXRhJyBpbiBDSUQta2V5ZWQgVHlwZSAxIGZvbnRzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCAoQ0lEX0ZhY2VSZWMpOiBBZGQgbmV3Ci0JbWVtYmVycyBgYmluYXJ5X2RhdGEnIGFuZCBgY2lkX3N0cmVhbScuCi0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfcmVhZF9zdWJycyk6IFVzZSBgZmFjZS0+Y2lkX3N0cmVhbScuCi0JKGNpZF9oZXhfdG9fYmluYXJ5KTogTmV3IGF1eGlsaWFyeSBmdW5jdGlvbi4KLQkoY2lkX2ZhY2Vfb3Blbik6IEFkZCBuZXcgYXJndW1lbnQgYGZhY2VfaW5kZXgnIHRvIHJldHVybiBxdWlja2x5Ci0JaWYgbGVzcyB0aGFuIHplcm8uICBVcGRhdGVkIGFsbCBjYWxsZXJzLgotCUNhbGwgYGNpZF9oZXhfdG9fYmluYXJ5JywgdGhlbiBvcGVuIGFuZCBhc3NpZ24gbWVtb3J5IHN0cmVhbSB0bwotCWBmYWNlLT5jaWRfc3RyZWFtJyBpZiBgcGFyc2VyLT5iaW5hcnlfbGVuZ3RoJyBpcyBub24temVyby4KLQkqIHNyYy9jaWQvY2lkbG9hZC5oOiBVcGRhdGVkLgotCi0JKiBzcmMvY2lkL2NpZG9ianMuYyAoY2lkX2ZhY2VfZG9uZSk6IEZyZWUgYGJpbmFyeV9kYXRhJyBhbmQKLQlgY2lkX3N0cmVhbScuCi0KLQkqIHNyYy9jaWQvY2lkcGFyc2UuYyAoY2lkX3BhcnNlcl9uZXcpOiBDaGVjayBhcmd1bWVudHMgdG8KLQlgU3RhcnREYXRhJyBhbmQgc2V0IHBhcnNlci0+YmluYXJ5X2xlbmd0aCBhY2NvcmRpbmdseS4KLQkqIHNyYy9jaWQvY2lkcGFyc2UuaCAoQ0lEX1BhcnNlcik6IE5ldyBtZW1iZXIgYGJpbmFyeV9sZW5ndGgnLgotCi0JKiBzcmMvY2lkL2NpZGdsb2FkLmMgKGNpZF9sb2FkX2dseXBoKTogVXNlIGBmYWNlLT5jaWRfc3RyZWFtJy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA0LTAxLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oIChmdF9hdG9pKTogUmVwbGFjZWQgd2l0aC4uLgotCShmdF9hdG9sKTogVGhpcy4KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmM6IHMvYXRvbC9mdF9hdG9sLy4KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYzogcy9mdF9hdG9pL2Z0X2F0b2wvLgotCi0yMDA0LTAxLTIwICBNYXNhdGFrZSBZQU1BVE8gIDxqZXRAZ3l2ZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oOiBEZWxldGUgZHVwbGljYXRlZCBkZWZpbml0aW9uIG9mCi0JRlRDX0ZhY2VJRC4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X2NtYXBfaW5mbyk6IENhbGwgc2ZudCBtb2R1bGUncyBUVCBDTWFwCi0JSW5mbyBzZXJ2aWNlIGZ1bmN0aW9uIGlmIHRoZSBjbWFwIGNvbWVzIGZyb20gc2ZudC4gIFJldHVybiAwIGlmIHRoZQotCWNtYXAgaXMgc3ludGhlc2l6ZWQgaW4gY2ZmIG1vZHVsZS4KLQotMjAwNC0wMS0yMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2FjaGUvZnRjbWFuYWcuYyAoZnRjX3NpemVfbm9kZV9jb21wYXJlKTogQ2FsbAotCUZUX0FjdGl2YXRlX1NpemUuCi0KLTIwMDQtMDEtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxcGFyc2UuYyAoVDFfR2V0X1ByaXZhdGVfRGljdCk6IFNraXAgZXhhY3RseSBvbmUKLQlDUiwgTEYsIG9yIENSL0xGIGFmdGVyIGBlZXhlYycuCi0KLTIwMDQtMDEtMTggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2Vfc2V0X3NiaXRfc3RyaWtlKTogUmVtb3ZlIGNvbXBpbGVyCi0Jd2FybmluZy4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyLyo6IFVwZGF0aW5nIGJlYXV0aWZpZXIgdG9vbC4KLQotMjAwNC0wMS0xNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKGZ0X29yaWVudGF0aW9uX2V4dHJlbXVtX2NvbXB1dGUpOiBGaXgKLQlpbmZpbml0ZSBsb29wIGJ1Zy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oOiBJbmNsdWRlIEZUX0dMWVBIX0guCi0JKEZUX1N0cm9rZXJfUmV3aW5kLCBGVF9HbHlwaF9TdHJva2UsIEZUX0dseXBoX1N0cm9rZUJvcmRlcik6IE5ldwotCWRlY2xhcmF0aW9ucy4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0guCi0JKEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlcik6IEludmVyc2UgcmVzdWx0LgotCShGVF9TdHJva2VyX1Jld2luZCwgRlRfR2x5cGhfU3Ryb2tlLCBGVF9HbHlwaF9TdHJva2VCb3JkZXIpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKEZUX1N0cm9rZXJfRW5kU3ViUGF0aCk6IENsb3NlIHBhdGggaWYgbmVlZGVkLgotCShGVF9TdHJva2VyX1NldCwgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUpOiBVc2UgRlRfU3Ryb2tlcl9SZXdpbmQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjbWFuYWcuaCAoRlRDX1NjYWxlclJlYywKLQlGVENfTWFuYWdlcl9Mb29rdXBTaXplKTogTW92ZWQgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oIChGVENfU2NhbGVyUmVjLAotCUZUQ19NYW5hZ2VyX0xvb2t1cFNpemUpOiBIZXJlLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvZG9jYmVhdXR5LnB5OiBOZXcgZmlsZSB0byBiZWF1dGlmeSB0aGUKLQlkb2N1bWVudGF0aW9uIGNvbW1lbnRzIChlLmcuLCB0byBjb252ZXJ0IHRoZW0gdG8gc2luZ2xlIGJsb2NrIGJvcmRlcgotCW1vZGUpLgotCSogc3JjL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5IChmaWxlX2V4aXN0cywgbWFrZV9maWxlX2xpc3QpOgotCU1vdmVkIHRvLi4uCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdXRpbHMucHkgKGZpbGVfZXhpc3RzLCBtYWtlX2ZpbGVfbGlzdCk6IEhlcmUuCi0KLTIwMDQtMDEtMTQgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oIChGVF9BUlJBWV9DT1BZLAotCUZUX0FSUkFZX01PVkUpOiBOZXcgbWFjcm9zIHRvIG1ha2UgY29weWluZyBhcnJheXMgZWFzaWVyLgotCVVwZGF0ZWQgYWxsIHJlbGV2YW50IGNvZGUgdG8gdXNlIHRoZW0uCi0KLTIwMDQtMDEtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2xvYWQpOiBMb2FkIGNoYXJzdHJpbmdzX2luZGV4IGVhcmxpZXIuCi0JVXNlIG51bWJlciBvZiBjaGFyc3RyaW5ncyBhcyBhcmd1bWVudCB0byBDRkZfTG9hZF9GRF9TZWxlY3QgKGFzCi0JZG9jdW1lbnRlZCBpbiB0aGUgQ0ZGIHNwZWNzKS4KLQotMjAwNC0wMS0xMyAgR3JhaGFtIEFzaGVyICA8Z3JhaGFtLmFzaGVyQGJ0aW50ZXJuZXQuY29tPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jIChwc2hfZ2x5cGhfaW5pdCk6IE1vdmUgYXNzaWdubWVudCBvZgotCWBnbHlwaC0+bWVtb3J5JyB1cCB0byBmcmVlIGFycmF5cyBwcm9wZXJseSBpbiBjYXNlIG9mIGZhaWx1cmUuCi0KLTIwMDQtMDEtMTAgIE1hc2F0YWtlIFlBTUFUTyAgPGpldEBneXZlLm9yZz4KLQotCU1ha2UgYEZUX0dldF9DTWFwX0xhbmd1YWdlX0lEJyB3b3JrIHdpdGggQ0ZGLiAgQnVnIHJlcG9ydGVkIGJ5Ci0JU3RldmUgSGFydHdlbGwgPHNoc3BhbXNpbmtAY29tY2FzdC5uZXQ+LgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9UVF9DTUFQX0guCi0JKGNmZl9zZXJ2aWNlcyk6IEFkZGVkIGFuIGVudHJ5IGZvciBGVF9TRVJWSUNFX0lEX1RUX0NNQVAuCi0JKGNmZl9nZXRfY21hcF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfc2VydmljZV9nZXRfY21hcF9pbmZvKSBOZXcgZW50cnkgZm9yIGNmZl9zZXJ2aWNlcy4KLQotCSogc3JjL3NmbnQvdHRjbWFwMC5jOiBFeGl0IGxvb3AgYWZ0ZXIgYSBmb3JtYXQgbWF0Y2ggaGFzIGJlZW4gZm91bmQuCi0JU3VnZ2VzdGVkIGJ5IFN0ZXZlIEhhcnR3ZWxsIDxzaHNwYW1zaW5rQGNvbWNhc3QubmV0Pi4KLQotMjAwNC0wMS0wMyAgTWFzYXRha2UgWUFNQVRPICA8amV0QGd5dmUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZGVzdHJveV9jaGFybWFwcyk6IE5ldyBmdW5jdGlvbi4KLQkoZGVzdHJveV9mYWNlLCBvcGVuX2ZhY2UpOiBVc2UgYGRlc3Ryb3lfY2hhcm1hcHMnLgotCi0yMDA0LTAxLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNC0wMS0wMSAgTWljaGFlbCBKYW5zc29uICA8bWphbkBlbTItc29sdXRpb25zLmNvbT4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfU2l6ZV9TZXRfUGl4ZWxzKTogRml4IHNpZ24gb2YKLQlzaXplLT5tZXRyaWNzLmRlc2NlbmRlci4KLQotMjAwMy0xMi0zMSAgV29sZmdhbmcgRG9tcsO2c2UgIDxwb3J0aG9zLmRvbXJvZXNlQGhhcnouZGU+Ci0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpCi0JW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXTogVXNlIGAlbGQnIGluIEZUX1RSQUNFNC4KLQk8Y2ZmX29wX2ZsZXgxPjogQ2hhbmdlIHR5cGUgb2YgZHggYW5kIGR5IHRvIEZUX1BvcyBhbmQgcmVtb3ZlCi0JY2FzdCBmb3IgYWNjZXNzaW5nIGFyZ3VtZW50cy4KLQotMjAwMy0xMi0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX1NpbXBsZV9HbHlwaCk6IFJldmVydCBwcmV2aW91cwotCWNoYW5nZS4gIEl0J3Mgbm90IG5lY2Vzc2FyeS4KLQotMjAwMy0xMi0yOSAgU21pdGggQ2hhcmxlcyAgPHNtaXRoLmNoYXJsZXNAZnJlZS5mcj4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBIYW5kbGUgYHJlcGVhdGVkCi0JZmxhZ3Mgc2V0JyBjb3JyZWN0bHkuCi0KLTIwMDMtMTItMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBGaXggbWVtb3J5IGxlYWsgYnkgZGVhbGxvY2F0aW5nCi0JYGZ1bGwnIGFuZCBgd2VpZ2h0JyBwcm9wZXJseS4KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpCi0JPGNmZl9vcF9oaW50bWFzaz4gW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXTogVXNlIGAweCcgYXMgcHJlZml4IGZvcgotCXRyYWNpbmcgb3V0cHV0LgotCi0yMDAzLTEyLTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIChUVF9TZXRfU0JpdF9TdHJpa2VfRnVuYyk6Ci0JVXNlIEZUX1VJbnQgZm9yIHBwZW0gdmFsdWVzLgotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2Vfc2V0X3NiaXRfc3RyaWtlKTogVXNlIEZUX1VJbnQgZm9yCi0JcHBlbSB2YWx1ZXMuCi0JKiBzcmMvc2ZudC90dHNiaXQuaDogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1NldF9QaXhlbF9TaXplcyk6IERvbid0IGFsbG93IHBwZW0gdmFsdWVzCi0JbGFyZ2VyIHRoYW4gLTBGRkZGLgotCi0yMDAzLTEyLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0dHJpZ29uLmMsIHNyYy9iYXNlL2Z0Z2xvYWRyLmM6IEluY2x1ZGUKLQlGVF9JTlRFUk5BTF9PQkpFQ1RTX0guCi0KLQkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyLAotCUZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlcik6IHMvb3Ivby8gdG8gbWFrZSBpdCBjb21waWxlIHdpdGgKLQlDKysgY29tcGlsZXJzLgotCi0JKiBzcmMvY2FjaGUvZnRjbXJ1LmMsIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjbXJ1Lmg6Ci0Jcy9zZWxlY3Qvc2VsZWN0aW9uLyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgotCSogc3JjL2NmZi9jZmZsb2FkLmg6IHMvc2VsZWN0L2Z0c2VsZWN0LyB0byBhdm9pZCBwb3RlbnRpYWwKLQljb21waWxlciB3YXJuaW5nLgotCi0yMDAzLTEyLTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jYWNoZS9mdGNzYml0cy5jIChGVENfU05vZGVfV2VpZ2h0KToKLQlzL0ZUQ19TQklUX0lURU1fUEVSX05PREUvRlRDX1NCSVRfSVRFTVNfUEVSX05PREUvLgotCi0yMDAzLTEyLTI0ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIEZpeGVkIGNvbXBpbGF0aW9uIHByb2JsZW1zIGluIHRoZSBjYWNoZSBzdWItc3lzdGVtLgotCi0JKiBQYXJ0aWFsIHVwZGF0ZXMgdG8gc3JjL2F1dG9maXQuCi0KLQkqIEphbWZpbGUgKEZUMl9DT01QT05FTlRTKTogQWRkIGF1dG9maXQgbW9kdWxlLgotCi0yMDAzLTEyLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSk6IEhhbmRsZQotCUNJRC1rZXllZCBmb250cy4KLQotMjAwMy0xMi0yMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9QQURfRkxPT1IsIEZUX1BBRF9ST1VORCwKLQlGVF9QQURfQ0VJTCwgRlRfUElYX0ZMT09SLCBGVF9QSVhfUk9VTkQsIEZUX1BJWF9DRUlMKTogTmV3IG1hY3Jvcy4KLQlUaGV5IGFyZSB1c2VkIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggdmVyeSBwZWRhbnRpYyBjb21waWxlcnMuCi0JTm90ZSB0aGF0IGAoeCkgJiAtNjQnIGNhdXNlcyBhIHdhcm5pbmcgaWYgKHgpIGlzIG5vdCBzaWduZWQuICBVc2UKLQlgKHgpICYgfjYzJyBpbnN0ZWFkIQotCVVwZGF0ZWQgYWxsIHJlbGF0ZWQgY29kZS4KLQotCUFkZCBzdXBwb3J0IGZvciBleHRyYWN0aW9uIG9mIGBpbnNpZGUnIGFuZCBgb3V0c2lkZScgYm9yZGVycy4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoRlRfU3Ryb2tlckJvcmRlcik6IE5ldyBlbnVtZXJhdGlvbi4KLQkoRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIsIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlciwKLQlGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cywgRlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIpOiBOZXcgZnVuY3Rpb25zLgotCShGVF9TdHJva2VCb3JkZXJSZWMpOiBOZXcgYm9vbGVhbiBtZW1iZXIgYHZhbGlkJy4KLQkoZnRfc3Ryb2tlX2JvcmRlcl9nZXRfY291bnRzKTogVXBkYXRlZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaDogVXBkYXRlZC4KLQotMjAwMy0xMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0d2luZm50LmggKEZUX1dpbkZOVF9JRF8qKTogTmV3IGRlZmluaXRpb25zCi0JdG8gZGVzY3JpYmUgdGhlIGBjaGFyc2V0JyBmaWVsZCBpbiBGVF9XaW5GTlRfSGVhZGVyUmVjLgotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfRmFjZV9Jbml0KTogU2V0IGVuY29kaW5nIHRvCi0JRlRfRU5DT0RJTkdfTk9ORSBleGNlcHQgZm9yIEZUX1dpbkZOVF9JRF9NQUMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfRW5jb2RpbmcpOiBJbXByb3ZlIGNvbW1lbnQsCi0JYmFzZWQgb24gd29yayBieSBEZXRsZWYgV8O8cmtuZXIgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPi4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDAzLTEyLTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oLAotCWluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjbWFuYWcuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y2NhY2hlLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNtYW5hZy5oLAotCWluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjbXJ1LmggKGFkZGVkKSwKLQlpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0bHJ1LmggKHJlbW92ZWQpLAotCWluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjc2JpdHMuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y2ltYWdlLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNnbHlwaC5oLAotCXNyYy9jYWNoZS9mdGNtcnUuYywKLQlzcmMvY2FjaGUvZnRjbWFuYWcuYywKLQlzcmMvY2FjaGUvZnRjY2FjaGUuYywKLQlzcmMvY2FjaGUvZnRjZ2x5cGguYywKLQlzcmMvY2FjaGUvZnRjaW1hZ2UuYywKLQlzcmMvY2FjaGUvZnRjc2JpdHMuYywKLQlzcmMvY2FjaGUvZnRjY21hcC5jLAotCXNyYy9jYWNoZS9mdGNiYXNpYy5jIChhZGRlZCksCi0Jc3JjL2NhY2hlL2Z0bHJ1LmMgKHJlbW92ZWQpOgotCi0JICAqQ29tcGxldGUqIHJld3JpdGUgb2YgdGhlIGNhY2hlIHN1Yi1zeXN0ZW0gdG8gYHNvbHZlJyB0aGUKLQkgIGZvbGxvd2luZyBwb2ludHM6Ci0KLQkgICAgLSBhbGwgcHVibGljIEFQSXMgaGF2ZSBiZWVuIG1vdmVkIHRvIEZUX0NBQ0hFX0gsIGV2ZXJ5dGhpbmcKLQkgICAgICB1bmRlciBgaW5jbHVkZS9mcmVldHlwZS9jYWNoZScgaXMgb25seSBuZWVkZWQgYnkgY2xpZW50Ci0JICAgICAgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBpbXBsZW1lbnQgdGhlaXIgb3duIGNhY2hlcwotCi0JICAgIC0gYSBuZXcgZnVuY3Rpb24gbmFtZWQgRlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlEIHRvIGRlYWwKLQkgICAgICB3aXRoIHRoZSB1bmluc3RhbGxhdGlvbiBvZiBGYWNlSURzCi0KLQkgICAgLSB0aGUgaW1hZ2UgYW5kIHNiaXQgY2FjaGUgYXJlIG5vdyBhYnN0cmFjdCBjbGFzc2VzLCB0aGF0Ci0JICAgICAgY2FuIGJlIGV4dGVuZGVkIG11Y2ggbW9yZSBlYXNpbHkgYnkgY2xpZW50IGFwcGxpY2F0aW9ucwotCi0JICAgIC0gYmV0dGVyIHBlcmZvcm1hbmNlIGluIGNlcnRhaW4gYXJlYXMuICBGdXJ0aGVyIG9wdGltaXphdGlvbnMKLQkgICAgICB0byBjb21lIHNob3J0bHkgYW55d2F5Li4uCi0KLQkgICAgLSB0aGUgRlRDX0NNYXBDYWNoZV9Mb29rdXAgZnVuY3Rpb24gaGFzIGNoYW5nZWQgaXRzIHNpZ25hdHVyZSwKLQkgICAgICBjaGFybWFwcyBjYW4gbm93IG9ubHkgYmUgcmV0cmlldmVkIGJ5IGluZGV4Ci0KLQkgICAgLSBGVENfTWFuYWdlcl9Mb29rdXBfRmFjZSA9PiBGVENfTWFuYWdlcl9Mb29rdXBGYWNlCi0JICAgICAgRlRDX01hbmFnZXJfTG9va3VwX1NpemUgPT4gRlRDX01hbmFnZXJfTG9va3VwU2l6ZSAoc3RpbGwgaW4KLQkgICAgICBwcml2YXRlIGhlYWRlciBmb3IgdGhlIG1vbWVudCkKLQotMjAwMy0xMi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2RpY3QpOiBTdG9wIHBhcnNpbmcgaWYgYGVleGVjJyBrZXl3b3JkCi0JaXMgZW5jb3VudGVyZWQuCi0KLTIwMDMtMTItMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZ0eXBlcy5oIChDRkZfTUFYX0NJRF9GT05UUyk6IEluY3JlYXNlIHRvIDMyLiAgRm9yCi0JZXhhbXBsZSwgdGhlIEphcGFuZXNlIEhpcmFnaW5vIGZvbnQgYWxyZWFkeSBjb250YWlucyAxNSBzdWJmb250cy4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2xvYWQpOiBEZWFsbG9jYXRlIGBzaWRzJyBhcnJheSBmb3IKLQlDSUQta2V5ZWQgZm9udHMuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmg6IERlZmluZSBGVF9ERUJVR19NRU1PUlkuCi0KLTIwMDMtMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oIChUVF9BRE9CRV9JRF9MQVRJTl8xKTogTmV3IG1hY3JvLgotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0luaXQpOiBVc2UgVFRfQURPQkVfSUQqIHZhbHVlcy4KLQotMjAwMy0xMi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9Gb250UmVjRGljdFJlYyk6IENoYW5nZSB0eXBlIG9mCi0JYGNpZF9jb3VudCcgdG8gYEZUX1VMb25nJy4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfc2xvdF9sb2FkKTogVGFrZSBjYXJlIG9mIGVtcHR5IGBjaWRzJwotCWFycmF5LgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2NoYXJzZXRfZG9uZSk6IEZyZWUgYGNpZHMnIGFycmF5LgotCShjZmZfZm9udF9sb2FkKTogQ3JlYXRlIGNpZHMgYXJyYXkgb25seSBmb3IgQ0lELWtleWVkIGZvbnRzIHdoaWNoCi0JYXJlIHN1YnNldHRlZC4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBDaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mCi0JdGhlIFBTTmFtZXMgbW9kdWxlcyBmb3Igbm9uLXB1cmUgQ0ZGcyBhbHNvLgotCVNldCBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgZm9yIGEgbm9uLXB1cmUgQ0ZGIGFsc28gaWYgaXQgaXNuJ3QKLQlDSUQta2V5ZWQuCi0KLQkqIHNyYy9jZmYvcnVsZXMubWsgKENGRl9EUlZfSCk6IEFkZCBjZmZ0eXBlcy5oLgotCi0yMDAzLTEyLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IERvbid0IHNldAotCUZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyBpZiB0aGUgZm9udCBjb250YWlucyBhIHZlcnNpb24gMy4wIGBwb3N0JwotCXRhYmxlLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDMtMTItMTcgIE1hc2F0YWtlIFlBTUFUTyAgPGpldEBneXZlLm9yZz4KLQotCUFkZCBuZXcgZnVuY3Rpb24gRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgdG8gZXh0cmFjdCB0aGUgbGFuZ3VhZ2UgSUQKLQlmb3IgVHJ1ZVR5cGUvc2ZudCBmb250cy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oOiBOZXcgZmlsZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX1NFUlZJQ0VfVFRfQ01BUF9IKTogQWRkCi0Jc3Z0dGNtYXAuaC4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYzogSW5jbHVkZSB0dGNtYXAwLmguCi0JKHR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyk6IE5ldyBzZXJ2aWNlLgotCShzZm50X3NlcnZpY2VzKTogVXBkYXRlZC4KLQotCSogc3JjL3NmbnQvdHRjbWFwMC5jICh0dF9jbWFwKl9nZXRfaW5mbyk6IE5ldyBmdW5jdGlvbnMuCi0JKHR0X2NtYXAqX2NsYXNzX3JlYyk6IEFkZCB0dF9jbWFwKl9nZXRfaW5mbyBtZW1iZXJzLgotCSh0dF9nZXRfY21hcF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCSogc3JjL3NmbnQvdHRjbWFwMC5oOiBJbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ILgotCShUVF9DTWFwX0NsYXNzUmVjKTogTmV3IGZpZWxkIGBnZXRfY21hcF9pbmZvJy4KLQkodHRfZ2V0X2NtYXBfaW5mbyk6IE5ldyBkZWNsYXJhdGlvbi4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9UVF9DTUFQX0guCi0JKEZUX0dldF9DTWFwX0xhbmd1YWdlX0lEKTogTmV3IGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLgotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oIChGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCk6IE5ldwotCWZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCi0yMDAzLTEyLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0Y21hcC5jLCBzcmMvc2ZudC90dGNtYXAuaDogUmVtb3ZlZC4gIE9ic29sZXRlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaCAoU0ZOVF9JbnRlcmZhY2UpOiBSZW1vdmUKLQlvYnNvbGV0ZSBmaWVsZHMgYGxvYWRfY2hhcm1hcCcgYW5kIGBmcmVlX2NoYXJtYXAnLgotCShUVF9DaGFyTWFwX0xvYWRfRnVuYywgVFRfQ2hhck1hcF9GcmVlX0Z1bmMpOiBSZW1vdmVkLgotCSogc3JjL3NmbnQvc2ZudC5jOiBEb24ndCBpbmNsdWRlIHR0Y21hcC5jLgotCSogc3JjL3NmbnQvcnVsZXMubWsgKFNGTlRfRFJWX1NSQyk6IERvbid0IGluY2x1ZGUgdHRjbWFwLmMuCi0JKiBzcmMvc2ZudC90dGxvYWQuYzogRG9uJ3QgaW5jbHVkZSB0dGNtYXAuaC4KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmM6IERvbid0IGluY2x1ZGUgdHRjbWFwLmguCi0JKHNmbnRfaW50ZXJmYWNlKTogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX1RhYmxlRGlyUmVjLAotCVRUX0NNYXBEaXJSZWMsIFRUX0NNYXBEaXJFbnRyeVJlYywgVFRfQ01hcDAsIFRUX0NNYXAyU3ViSGVhZGVyUmVjLAotCVRUX0NNYXAyUmVjLCBUVF9DTWFwNFNlZ21lbnQsIFRUX0NNYXA0UmVjLCBUVF9DTWFwNiwKLQlUVF9DTWFwR3JvdXBSZWMsIFRUX0NNYXA4XzEyUmVjLCBUVF9DTWFwMTBSZWMsIFRUX0NoYXJNYXBfRnVuYywKLQlUVF9DaGFyTmV4dF9GdW5jLCBUVF9DTWFwVGFibGVSZWMsIFRUX0NoYXJNYXBSZWMpOiBSZW1vdmVkLgotCU9ic29sZXRlLgotCSogc3JjL2NmZi9jZmZvYmpzLmggKENGRl9DaGFyTWFwUmVjKTogUmVtb3ZlZC4gIE9ic29sZXRlLgotCi0yMDAzLTEyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwMy0xMi0xNSAgV29sZmdhbmcgRG9tcsO2c2UgIDxwb3J0aG9zLmRvbXJvZXNlQGhhcnouZGU+Ci0KLQkqIGJ1aWxkcy9hdGFyaS8qOiBOZXcgZGlyZWN0b3J5IGZvciBidWlsZGluZyBGcmVlVHlwZSAyIG9uIEF0YXJpCi0Jd2l0aCB0aGUgUHVyZUMgY29tcGlsZXIuCi0KLTIwMDMtMTItMTIgIFdvbGZnYW5nIERvbXLDtnNlICA8cG9ydGhvcy5kb21yb2VzZUBoYXJ6LmRlPgotCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKTogQWRkCi0JY2FzdC4KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3BzX2hhc19nbHlwaF9uYW1lcyk6IEFzc3VyZSB0aGF0IHJldHVybgotCXZhbHVlIGlzIGVpdGhlciAwIG9yIDEuCi0KLTIwMDMtMTItMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X2dseXBoX25hbWUpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0JKGNmZl9nZXRfbmFtZV9pbmRleCk6IFJldHVybiBpZiBubyBQU05hbWVzIHNlcnZpY2UgaXMgYXZhaWxhYmxlLgotCShjZmZfcHNfaGFzX2dseXBoX25hbWVzKTogSGFuZGxlIENJRC1rZXllZCBmb250cyBjb3JyZWN0bHkuCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9DaGFyc2V0UmVjKTogTmV3IGZpZWxkIGBjaWRzJywgdXNlZCBmb3IKLQlDSUQta2V5ZWQgZm9udHMuICBUaGlzIGlzIHRoZSBpbnZlcnNlIG1hcHBpbmcgb2YgYHNpZHMnLgotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9jaGFyc2V0X2xvYWQpOiBOZXcgYXJndW1lbnQgYGludmVydCcuCi0JSW5pdGlhbGl6ZSBjaGFyc2V0LT5jaWRzIGlmIGBpbnZlcnQnIGlzIHNldC4KLQkoY2ZmX2ZvbnRfbG9hZCk6IEluIGNhbGwgdG8gY2ZmX2NoYXJzZXRfbG9hZCwgc2V0IGBpbnZlcnQnIHRvIHRydWUKLQlmb3IgQ0lELWtleWVkIGZvbnRzLgotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfc2xvdF9sb2FkKTogSGFuZGxlIGdseXBoIGluZGV4IGFzIENJRAotCWFuZCBtYXAgaXQgdG8gdGhlIHJlYWwgZ2x5cGggaW5kZXguCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwMy0xMi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IERvbid0IHNldAotCUZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyBmb3IgQ0lELWtleWVkIGZvbnRzLgotCURvbid0IGNvbnN0cnVjdCBhIGNtYXAgZm9yIENJRC1rZXllZCBmb250cy4KLQotMjAwMy0xMi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JVXNlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIFNJRCB2YWx1ZSAweEZGRkYgdG8gaW5kaWNhdGUgdGhhdAotCWEgZGljdGlvbmFyeSBlbGVtZW50IGlzIG1pc3NpbmcuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfc3ViZm9udF9sb2FkKTogSW5pdGlhbGl6ZSBhbGwgZmllbGRzCi0Jd2hpY2ggaG9sZCBTSURzIHRvIDB4RkZGRi4KLQkoY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKTogSGFuZGxlIFNJRCB2YWx1ZSAweEZGRkYuCi0JSGFuZGxlIGNhc2Ugd2hlcmUgYHBzbmFtZXMnIGlzIHplcm8uCi0JKGNmZl9mb250X2xvYWQpOiBVcGRhdGVkLgotCURvbid0IGxvYWQgZW5jb2RpbmcgZm9yIENJRC1rZXllZCBDRkZzLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IFVwZGF0ZWQuCi0JRG9uJ3QgY2hlY2sgZm9yIFBTTmFtZXMgbW9kdWxlIGlmIGZvbnQgaXMgQ0lELWtleWVkLgotCUNvbXB1dGUgc3R5bGUgbmFtZSBwcm9wZXJseSAodXNpbmcgdGhlIHNhbWUgYWxnb3JpdGhtIGFzIGluIHRoZQotCUNJRCBkcml2ZXIpLgotCUZpeCBjb21wdXRhdGlvbiBvZiBzdHlsZSBmbGFncy4KLQotCSogc3JjL2NmZi9jZmZ0b2tlbi5oOiBDb21tZW50IG91dCBoYW5kbGluZyBvZiBiYXNlX2ZvbnRfbmFtZS4KLQlSZW5hbWUgYHBvc3RzY3JpcHQnIGZpZWxkIHRvIGBlbWJlZGRlZF9wb3N0c2NyaXB0JwotCSogc3JjL2NmZi9jZmZ0eXBlcy5oIChDRkZfRm9udFJlY0RpY3RSZWMpOiBSZW1vdmUgYGJhc2VfZm9udF9uYW1lJwotCWFuZCBgcG9zdHNjcmlwdCcuCi0KLTIwMDMtMTItMTAgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBzcmMvcGNmL3BjZmRyaXZyLmMgKHBjZl9nZXRfY2hhcnNldF9pZCk6IE5ldyBmdW5jdGlvbiAoYSBjbG9uZQotCW9mIHRoZSBzaW1pbGFyIEJERiBmdW5jdGlvbikuCi0JKHBjZl9zZXJ2aWNlX2JkZik6IFVzZSBpdC4KLQotMjAwMy0xMi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBTZXQgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTCi0Jb25seSBpZiBhIGBwb3N0JyB0YWJsZSBpcyBwcmVzZW50LgotCi0yMDAzLTEyLTA5ICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGxvYWRfbWFjX2ZhY2UpOiBSZWNlbnQgdmVyc2lvbnMgb2YgTGludXgKLQlzdXBwb3J0IE1hYydzIEhGUysgZmlsZSBzeXN0ZW0sIHRodXMgZW5hYmxlIGNvZGUgdG8gcmVhZCAvcnNyYyBvbgotCW5vbi1NYWNpbnRvc2ggcGxhdGZvcm1zIGFsc28uCi0KLTIwMDMtMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChQU19UYWJsZVJlYyk6IENoYW5nZSB0eXBlCi0Jb2YgYGxlbmd0aHMnIHRvIEZUX1B0ckRpc3QuCi0JKFQxX0RlY29kZXJSZWMpOiBDaGFuZ2UgdHlwZSBvZiBgc3VicnNfbGVuJyB0byBGVF9QdHJEaXN0LgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggKFQxX0ZvbnRSZWMpOiBDaGFuZ2UgdHlwZQotCW9mIGBzdWJyc19sZW4nIGFuZCBgY2hhcnN0cmluZ3NfbGVuJyB0byBGVF9QdHJEaXN0LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoTWFjX1JlYWRfUE9TVF9SZXNvdXJjZSk6IFJlcGxhY2UgYGp1bmsnCi0JdmFyaWFibGUgd2l0aCBiZXR0ZXIgc29sdXRpb24uCi0JKElzTWFjUmVzb3VyY2UpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBtYXBfbGVuJy4KLQlSZXBsYWNlIGBqdW5rJyB2YXJpYWJsZSB3aXRoIGJldHRlciBzb2x1dGlvbi4KLQkoRlRfT3Blbl9GYWNlKSBbIUZUX01BQ0lOVE9TSF06IEFkZCBjb25kaXRpb25hbAotCUZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTLgotCi0yMDAzLTEyLTA4ICBXb2xmZ2FuZyBEb21yw7ZzZSAgPHBvcnRob3MuZG9tcm9lc2VAaGFyei5kZT4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfaGludF9lZGdlcywKLQlhaF9oaW50ZXJfYWxpZ25fc3Ryb25nX3BvaW50cyk6IEFkZCBzb21lIGNhc3RzLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX09yaWVudGF0aW9uRXh0cmVtdW1SZWMpOiBDaGFuZ2UgdHlwZQotCW9mIGBwb3MnIHRvIEZUX0xvbmcuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChNYWNfUmVhZF9QT1NUX1Jlc291cmNlLAotCU1hY19SZWFkX3NmbnRfUmVzb3VyY2UpOiBDaGFuZ2UgdHlwZSBvZiBgbGVuJyB0byBGVF9Mb25nLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9kaWN0KTogQWRkIGNhc3QgZm9yIGBuX2tleXdvcmRzJy4KLQotMjAwMy0xMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL3Jhc3Rlci50eHQ6IE5ldyBmaWxlLCB0YWtlbiBmcm9tIEZyZWVUeXBlIDEgYW5kIGNvbXBsZXRlbHkKLQlyZXZpc2VkLgotCi0yMDAzLTEyLTA0ICBNYXNhdGFrZSBZQU1BVE8gIDxqZXRAZ3l2ZS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jIChHZXRfSW50ZXJmYWNlKTogUmVtb3ZlIEZUX1VOVVNFRCBmb3IKLQl0MV9pbnRlcmZhY2UuICB0MV9pbnRlcmZhY2UgaXMgdXNlZC4KLQotMjAwMy0xMS0yNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcGZyL3BmcmRyaXZyLmMgKHBmcl9nZXRfbWV0cmljcyk6IFJldmVydCBpbmNvcnJlY3QgY2hhbmdlIG9mCi0JMjAwMy0xMS0yMzogRm9yIFBGUiBmb250cywgbWV0cmljcy0+eF9zY2FsZSBhbmQgbWV0cmljcy0+eV9zY2FsZSBhcmUKLQl0aGUgc2NhbGluZyB2YWx1ZXMgZm9yIG91dGxpbmUgdW5pdHMsIG5vdCBmb3IgbWV0cmljIHVuaXRzLgotCi0yMDAzLTExLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jLCBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oCi0JKEZUX011bERpdl9Ob19Sb3VuZCk6IFN1cnJvdW5kIGNvZGUgd2l0aCBgI2lmZGVmCi0JVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiAuLi4gI2VuZGlmJy4KLQotMjAwMy0xMS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRGl2X05vX1JvdW5kKTogTmV3IGZ1bmN0aW9uICgzMiBhbmQKLQk2NCBiaXQgdmVyc2lvbikuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfTVVMRElWX05PX1JPVU5EKTogTmV3IG1hY3JvLgotCShUVF9JTlQ2NCk6IFJlbW92ZWQuCi0JKERPX0RJVik6IFVzZSBUVF9NVUxESVZfTk9fUk9VTkQuCi0KLQkqIHNyYy9wZnIvcGZyZHJpdnIuYyAocGZyX2dldF9tZXRyaWNzKTogRGlyZWN0bHkgdXNlCi0JbWV0cmljcy0+eF9zY2FsZSBhbmQgbWV0cmljcy0+eV9zY2FsZS4KLQotMjAwMy0xMS0yMiAgUm9naWVyIHZhbiBEYWxlbiAgPFIuQy52YW4uRGFsZW5AdW1haWwubGVpZGVudW5pdi5ubD4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKENVUl9GdW5jX21vdmVfb3JpZyk6IE5ldyBtYWNyby4KLQkoRGlyZWN0X01vdmVfT3JpZywgRGlyZWN0X01vdmVfT3JpZ19YLCBEaXJlY3RfTW92ZV9PcmlnX1kpOiBOZXcKLQlmdW5jdGlvbnMuICBTaW1pbGFyIHRvIERpcmVjdF9Nb3ZlLCBEaXJlY3RfTW92ZV9YLCBhbmQKLQlEaXJlY3RfTW92ZV9ZIGJ1dCB3aXRob3V0IHRvdWNoaW5nLgotCShDb21wdXRlX0Z1bmNzKTogVXNlIG5ldyBmdW5jdGlvbnMuCi0KLQkoUm91bmRfTm9uZSwgUm91bmRfVG9fR3JpZCwgUm91bmRfVG9fSGFsZl9HcmlkLCBSb3VuZF9Eb3duX1RvX0dyaWQsCi0JUm91bmRfVXBfVG9fR3JpZCwgUm91bmRfVG9fRG91YmxlX0dyaWQsIFJvdW5kX1N1cGVyLAotCVJvdW5kX1N1cGVyXzQ1KTogRml4IHJvdW5kaW5nIG9mIHZhbHVlIHplcm8uCi0KLQkoRE9fRElWKTogRG9uJ3QgdXNlIFRUX01VTERJVi4KLQotCShJbnNfU0hDKTogVGhpcyBpbnN0cnVjdGlvbiBhY3R1YWxseSB0b3VjaGVzIHRoZSBwb2ludHMuCi0JKEluc19NU0lSUCk6IEZpeCB1bmRvY3VtZW50ZWQgYmVoYXZpb3VyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCAoVFRfRXhlY0NvbnRleHRSZWMpOiBVcGRhdGVkLgotCi0yMDAzLTExLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvVkVSU0lPTi5ETEwsIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1NldF9DaGFyX1NpemUpOiBNYWtlIG1ldHJpY3MtPnhfc2NhbGUgYW5kCi0JbWV0cmljcy0+eV9zY2FsZSByZWFsbHkgcHJlY2lzZS4KLQotCShGVF9Mb2FkX0dseXBoKTogVXBkYXRlIGNvbXB1dGF0aW9uIG9mIGxpbmVhckhvcmlBZHZhbmNlIGFuZAotCWxpbmVhclZlcnRBZHZhbmNlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVXBkYXRlX01heCk6IFVzZSBGVF9SRUFMTE9DLgotCi0yMDAzLTExLTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0Lyo6IE1vcmUgdXBkYXRlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byA4LgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gOTo2OjMuCi0JKiBSRUFETUU6IFVwZGF0ZWQuCi0KLTIwMDMtMTEtMTMgIEpvaG4gQS4gQm95ZCBKci4gIDxqYWJveWRqckBuZXR3YWxrLmNvbT4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChiZGZfaW50ZXJwcmV0X3N0eWxlKSwgc3JjL3BjZi9wY2ZyZWFkLmMKLQkocGNmX2ludGVycHJldF9zdHlsZSk6IFJlcGxhY2Ugc3BhY2VzIHdpdGggZGFzaGVzIGluIHByb3BlcnRpZXMKLQlTRVRXSURUSF9OQU1FIGFuZCBBRERfU1RZTEVfTkFNRSB0byBzaW1wbGlmeSBwYXJzaW5nLgotCi0yMDAzLTExLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwMy0xMS0xMSAgSm9obiBBLiBCb3lkIEpyLiAgPGphYm95ZGpyQG5ldHdhbGsuY29tPgotCi0JSGFuZGxlIFNFVFdJRFRIX05BTUUgYW5kIEFERF9TVFlMRV9OQU1FIHByb3BlcnRpZXMgZm9yIEJERiBhbmQgUENGCi0JZm9udHMuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoYmRmX2ludGVycHJldF9zdHlsZSk6IE5ldyBhdXhpbGlhcnkgZnVuY3Rpb24uCi0JKEJERl9GYWNlX0luaXQpOiBEb24ndCBoYW5kbGUgc3R5bGUgcHJvcGVydGllcyBidXQgY2FsbAotCWJkZl9pbnRlcnByZXRfc3R5bGUuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfaW50ZXJwcmV0X3N0eWxlKTogTmV3IGF1eGlsaWFyeSBmdW5jdGlvbi4KLQkocGNmX2xvYWRfZm9udCk6IERvbid0IGhhbmRsZSBzdHlsZSBwcm9wZXJ0aWVzIGJ1dCBjYWxsCi0JcGNmX2ludGVycHJldF9zdHlsZS4KLQotMjAwMy0xMS0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4xLjcgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gNy4KLQotCSogYnVpbGRzL3VuaXgvZnQydW5peC5oOiBGaXggY29tbWVudHMuCi0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBTeW5jaHJvbml6ZWQgd2l0aCBBTlNJIHZlcnNpb24uCi0JVXNlIGAjdW5kZWYnIGluIHRlbXBsYXRlcyBhcyByZWNvbW1lbmRlZCBpbiB0aGUgYXV0b2NvbmYKLQlkb2N1bWVudGF0aW9uLgotCVNpbmNlIHJlYWwgYCN1bmRlZicgbGluZXMgZG9uJ3Qgc3Vydml2ZSBkdXJpbmcgY29uZmlndXJhdGlvbiwgdXNlCi0JYC91bmRlZicgaW5zdGVhZDsgdGhlIHBvc3Rwcm9jZXNzaW5nIGZhY2lsaXR5IG9mIHRoZQotCUFDX0NPTkZJR19IRUFERVJTIGF1dG9jb25mIG1hY3JvIGNvbnZlcnRzIHRoZW0gdG8gYCN1bmRlZicuCi0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBJbnN0YWxsIFVuaXggdmVyc2lvbiBvZgotCWBmdGNvbmZpZy5oJy4KLQotCSogYnVpbGRzL3VuaXgvdW5peC1jYy5pbiAoQ0ZMQUdTKTogU2V0IEZUX0NPTkZJR19DT05GSUdfSCBtYWNybwotCXRvIGluY2x1ZGUgdGhlIGNvcnJlY3QgYGZ0Y29uZmlnLmgnIGZpbGUuCi0KLQkqIGJ1aWxkcy91bml4L2Z0LW11bm1hcC5tNCAoRlRfTVVOTUFQX0RFQ0wpOiBSZW1vdmVkLgotCShGVF9NVU5NQVBfUEFSQU0pOiBVcGRhdGVkIHN5bnRheCB0byBhdXRvY29uZiAyLjU5LgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZTIubTQ6IFVwZGF0ZWQgc3ludGF4IHRvIGF1dG9jb25mIDIuNTkuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5hYzogVXNlIEFDX0NPTkZJR19IRUFERVJTIGluc3RlYWQgb2YKLQlBQ19DT05GSUdfSEVBREVSIHRvIGNyZWF0ZSBmdGNvbmZpZy5oLCBhbmQgdXNlIHNlY29uZCBhcmd1bWVudAotCXRvIHJlcGxhY2UgYC91bmRlZicgd2l0aCBgI3VuZGVmJy4KLQlEb24ndCB1c2UgRlRfTVVOTUFQX0RFQ0wgYnV0IEFDX0NIRUNLX0RFQ0xTIHRvIGNoZWNrIGZvciBtdW5tYXAuCi0JVXNlIEFTX0hFTFBfU1RSSU5HIGluIEFDX0FSR19XSVRILgotCVVwZGF0ZSBzeW50YXggdG8gYXV0b2NvbmYgMi41OS4KLQotCSogYnVpbGRzL3VuaXgvbHRtYWluLnNoOiBSZWdlbmVyYXRlZCB3aXRoIGBsaWJ0b29saXplIC0tZm9yY2UKLQktLWNvcHknIGZyb20gbGlidG9vbCAxLjUuCi0JKiBidWlsZHMvdW5peC9hY2xvY2FsLm00OiBSZWdlbmVyYXRlZCB3aXRoIGBhY2xvY2FsIC1JIC4nIGZyb20KLQlhdXRvbWFrZSAxLjcuOC4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjU5LgotCSogYnVpbGRzL3VuaXgvY29uZmlnLmd1ZXNzLCBidWlsZHMvdW5peC9jb25maWcuc3ViOiBVcGRhdGVkIGZyb20KLQlgY29uZmlnJyBDVlMgbW9kdWxlIGF0IHN1YnZlcnNpb25zLmdudS5vcmcKLQkqIGJ1aWxkcy91bml4L2luc3RhbGwtc2gsIGJ1aWxkcy91bml4L21raW5zdGFsbGRpcnM6IFVwZGF0ZWQgZnJvbQotCWB0ZXhpbmZvJyBDVlMgbW9kdWxlIGF0IHN1YnZlcnNpb25zLmdudS5vcmcuCi0KLQkqIGJ1aWxkcy92bXMvZnRjb25maWcuaDogU3luY2hyb25pemVkIHdpdGggQU5TSSB2ZXJzaW9uLgotCi0JKiBkb2NzL0NVU1RPTUlaRTogRml4IGRvY3VtZW50YXRpb24gZXJyb3IuCi0JKiBkb2NzL0NIQU5HRVMsIGRvY3MvVkVSU0lPTi5ETEwsIGRvY3MvcmVsZWFzZTogVXBkYXRlZC4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChyZWZkb2MpOiBVcGRhdGVkIC0tdGl0bGUuCi0KLTIwMDMtMTEtMDcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCi0JKiBWZXJzaW9uIDIuMS42IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JKiBpbnN0YWxsOiBSZW1vdmVkLiAgT2Jzb2xldGUuCi0KLTIwMDMtMTEtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYzogSW5jbHVkZSBGVF9TRVJWSUNFX1NGTlRfSC4KLQkoc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUpOiBOZXcgc2VydmljZS4KLQkoc2ZudF9zZXJ2aWNlcyk6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvbGljZW5zZS50eHQ6IFJld29yZGVkLgotCi0yMDAzLTExLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvKjogQWRkIGEgZ3VhcmQgdG8gYWxsIHB1YmxpYyBoZWFkZXIgZmlsZXMgd2hpY2gKLQlsb2FkIEZUX0ZSRUVUWVBFX0ggdG8gcmVqZWN0IGZyZWV0eXBlLmggZnJvbSBGcmVlVHlwZSAxLgotCi0yMDAzLTExLTAyICBQYXRyaWNrIFdlbGNoZSAgPHBybHcxQG5ld24uY2FtLmFjLnVrPgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZTIubTQsIGJ1aWxkcy91bml4L2Z0LW11bm1hcC5tNDogUHJvdGVjdAotCWZpcnN0IGFyZ3VtZW50IG9mIEFDX0RFRlVOIHdpdGggYnJhY2tldHMgdG8gYXZvaWQgcG9zc2libGUKLQlleHBhbnNpb24uCi0KLTIwMDMtMTEtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNnbHlwaC5oOiBEb24ndCBpbmNsdWRlIHN0ZGRlZi5oLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IEZpeCBjaGVjayBmb3IgZnQyYnVpbGQuaC4KLQotMjAwMy0xMS0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IENoZWNrIHRoYXQgZnQyYnVpbGQuaCBoYXMgYmVlbgotCWxvYWRlZCBmaXJzdC4KLQotCSogc3JjL2Jhc2UvZnR0eXBlMS5jIChGVF9HZXRfUFNfRm9udF9JbmZvKTogRml4IGluY29ycmVjdGx5IGFwcGxpZWQKLQlwYXRjaC4KLQotMjAwMy0xMC0zMSAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIHNyYy9iYXNlL2Z0dHlwZTEuYyAoRlRfR2V0X1BTX0ZvbnRfSW5mbywgRlRfSGFzX1BTX0dseXBoX05hbWVzKToKLQlGaXggcGFyYW1ldGVyIG9yZGVyIGluIGNhbGxzIHRvIEZUX0ZBQ0VfRklORF9TRVJWSUNFLgotCi0yMDAzLTEwLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmgKLQkoRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVTX0gpOiBSZW1vdmVkLiAgVW51c2VkLgotCi0JKiBzcmMvdHlwZTQyL3Q0MmRyaXZyLmMgKHQ0Ml9zZXJ2aWNlcyk6IFVwZGF0ZWQuCi0KLTIwMDMtMTAtMjkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9iZGZ0eXBlcy5oOiBSZW1vdmVkLiAgT2Jzb2xldGUuCi0JKiBzcmMvYmFzZS9mdGJkZi5jOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmg6IE1vdmVkIHRvLi4uCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmg6IFRoaXMgcGxhY2Ugc2luY2Ugbm8gb3RoZXIgbW9kdWxlIG5lZWRzIHRvCi0Ja25vdyBhYm91dCB0aG9zZSB0eXBlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90NDJ0eXBlcy5oOiBNb3ZlZCB0by4uLgotCSogc3JjL3R5cGU0Mi90NDJ0eXBlcy5oOiBUaGlzIHBsYWNlIHNpbmNlIG5vIG90aGVyIG1vZHVsZSBuZWVkcyB0bwotCWtub3cgYWJvdXQgdGhvc2UgdHlwZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaDogSW5jbHVkZSBGVF9CREZfSC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzbmFtZS5oOiBSZW5hbWVkIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg6IFRoaXMuCi0JVXBkYXRlZCBgRlRfU2VydmljZV9Qc05hbWVzJyAtPiBgRlRfU2VydmljZV9Qc0NNYXBzJyBhbmQKLQlgUE9TVFNDUklQVF9OQU1FUycgLT4gYFBPU1RTQ1JJUFRfQ01BUFMnIGV2ZXJ5d2hlcmUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaDogTmV3IGZpbGUsIHByb3ZpZGluZwotCVBvc3RTY3JpcHQgaW5mbyBzZXJ2aWNlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIChGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSCwKLQlGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19IKTogTmV3IG1hY3JvcyBmb3Igc3Zwc2NtYXAuaCBhbmQKLQlzdnBzaW5mby5oLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oIChGVF9JTlRFUk5BTF9UWVBFNDJfVFlQRVNfSCwKLQlGVF9JTlRFUk5BTF9DRkZfVFlQRVNfSCwgRlRfSU5URVJOQUxfQkRGX1RZUEVTX0gpOiBSZW1vdmVkLgotCi0JKiBzcmMvYmFzZS9mdHR5cGUxLmM6IERvbid0IGluY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSCBhbmQKLQlGVF9JTlRFUk5BTF9UWVBFNDJfVFlQRVNfSCBidXQgRlRfSU5URVJOQUxfU0VSVklDRV9IIGFuZAotCUZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0guCi0JKEZUX0dldF9QU19Gb250X0luZm8sIEZUX0hhc19QU19HbHlwaF9OYW1lcyk6IFVzZSBuZXcKLQlQT1NUU0NSSVBUX0lORk8gc2VydmljZS4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0guCi0JKGNmZl9wc19oYXNfZ2x5cGhfbmFtZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNmZl9zZXJ2aWNlX3BzX2luZm8pOiBOZXcgc2VydmljZS4KLQkoY2ZmX3NlcnZpY2VzKTogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmgsIHNyYy9jZmYvY2Zmb2Jqcy5oLCBzcmMvY2ZmL2NmZnBhcnNlLmg6IERvbid0Ci0JaW5jbHVkZSBGVF9JTlRFUk5BTF9DRkZfVFlQRVNfSCBidXQgY2ZmdHlwZXMuaCBkaXJlY3RseS4KLQotCSogc3JjL2NpZC9jaWRyaXZlci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0guCi0JKGNpZF9wc19nZXRfZm9udF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShjaWRfc2VydmljZV9wc19pbmZvKTogTmV3IHNlcnZpY2UuCi0JKGNpZF9zZXJ2aWNlcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0guCi0JKHQxX3BzX2dldF9mb250X2luZm8sIHQxX3BzX2hhc19nbHlwaF9uYW1lcyk6IE5ldyBmdW5jdGlvbnMuCi0JKHQxX3NlcnZpY2VfcHNfaW5mbyk6IE5ldyBzZXJ2aWNlLgotCSh0MV9zZXJ2aWNlcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYzogSW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ILgotCSh0NDJfcHNfZ2V0X2ZvbnRfaW5mbywgdDQyX3BzX2hhc19nbHlwaF9uYW1lcyk6IE5ldyBmdW5jdGlvbnMuCi0JKHQ0Ml9zZXJ2aWNlX3BzX2luZm8pOiBOZXcgc2VydmljZS4KLQotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmg6IERvbid0IGluY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTQyX1RZUEVTX0gKLQlidXQgdDQydHlwZXMuaCBkaXJlY3RseS4KLQotCSogc3JjL3BzbmFtZXMvcHNtb2R1bGUuYyAocHNuYW1lc19pbnRlcmZhY2UsIHBzbmFtZXNfc2VydmljZXMpOgotCVJlbmFtZWQgdG8uLi4KLQkocHNjbWFwc19pbnRlcmZhY2UsIHBzY21hcHNfc2VydmljZXMpOiBUaGlzLgotCVVwZGF0ZWQgYWxsIHVzZXJzLgotCi0KLQkqIHNyYy9nemlwL2luZmJsb2NrLmMgKGluZmxhdGVfYmxvY2tzKTogUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMDMtMTAtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9lbmNvZGluZyk6IEhhbmRsZSBgL0VuY29kaW5nIFsgLi4uIF0nLgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChUMV9HZXRfUHJpdmF0ZV9EaWN0KTogVGVzdCB3aGV0aGVyIGBlZXhlYycKLQlpcyByZWFsLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9lbmNvZGluZyk6IEltcHJvdmUgYm91bmRhcnkKLQljaGVja2luZyB3aGlsZSBwYXJzaW5nLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDMtMTAtMjEgIEpvc3NlbGluIE1vdWV0dGUgIDxqb3NzQGRlYmlhbi5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oIChUMV9Gb250UmVjKTogYHBhaW50X3R5cGUnCi0JYW5kIGBzdHJva2Vfd2lkdGgnIGFyZW4ndCBwb2ludGVycy4KLQotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmMgKFQ0Ml9GYWNlX0RvbmUpLCBzcmMvdHlwZTEvdDFvYmpzLmMKLQkoVDFfRmFjZV9Eb25lKTogRG9uJ3QgZnJlZSBgcGFpbnRfdHlwZScgYW5kIGBzdHJva2Vfd2lkdGgnLgotCi0yMDAzLTEwLTIwICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2NtYXBfY2xhc3MpOiBGaXggcG9zaXRpb24gb2YgYGNvbnN0Jy4KLQotMjAwMy0xMC0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRlcl9sb2FkX2dseXBoKTogUGF0Y2ggZnJvbQotCTIwMDMtMDgtMTggaW50cm9kdWNlZCBhIHNldmVyZSBidWcgKEZUX1JlbmRlcl9HbHlwaCB3YXMgY2FsbGVkCi0JdHdpY2UgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLCBjYXVzaW5nIHN0cmFuZ2UgcmVzdWx0cykuICBUaGlzCi0JaXMgZml4ZWQgbm93IGJ5IGNsZWFyaW5nIHRoZSBGVF9MT0FEX1JFTkRFUiBiaXQgb2YgYGxvYWRfZmxhZ3MnLgotCi0JKiBzcmMvYmFzZS9mdHBmci5jIChGVF9HZXRfUEZSX01ldHJpY3MpOiBJbml0aWFsaXplIGBlcnJvcicuCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX3RvYnl0ZXMpOiBJbml0aWFsaXplIGBuJy4KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX3NmbnRzKTogSW5pdGlhbGl6ZSBgc3RyaW5nX3NpemUnLgotCi0yMDAzLTEwLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlDb21wbGV0ZWx5IHJldmlzZWQgVHlwZSA0MiBwYXJzZXIuICBJdCBub3cgaGFuZGxlcyBib3RoIGZvbnRzCi0JcHJvZHVjZWQgd2l0aCB0dGZ0b3Q0MiAodGVzdGVkIHZlcnNpb24gMC4zLjEpIGFuZAotCVRydWVUeXBlVG9UeXBlNDIucHMgKHRlc3RlZCB2ZXJzaW9uIE1heSAyMDAxOyBpdCBpcyBuZWNlc3NhcnkgdG8KLQlmaXggdGhlIGJyb2tlbiBoZWFkZXIgY29tbWVudCB0byBiZSBgJSFQUy1UcnVlVHlwZUZvbnQuLi4nKS4KLQotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmMgKFQ0Ml9HbHlwaFNsb3RfTG9hZCk6IENoYW5nZSBmb3VydGgKLQlwYXJhbWV0ZXIgdG8gYEZUX1VJbnQnLgotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuaCAoVDQyX1BhcnNlclJlYyk6IENoYW5nZSB0eXBlIG9mIGBpbl9tZW1vcnknCi0JdG8gRlRfQm9vbC4KLQkoVDQyX0xvYWRlcik6IENoYW5nZSB0eXBlIG9mIGBudW1fY2hhcnMnIGFuZCBgbnVtX2dseXBocycgdG8KLQlGVF9VSW50LgotCUFkZCBgc3dhcF90YWJsZScgZWxlbWVudC4KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAoVDQyX0tFWVdPUkRfQ09VTlQsIFQxX1RvRml4ZWQsCi0JVDFfVG9Db29yZEFycmF5LCBUMV9Ub1Rva2VuQXJyYXkpOiBSZW1vdmVkLgotCShUMV9Ub0J5dGVzKTogTmV3IG1hY3JvLgotCSh0NDJfaXNfYWxwaGEsIHQ0Ml9oZXh2YWwpOiBSZW1vdmVkLgotCSh0NDJfaXNfc3BhY2UpOiBIYW5kbGUgYFwwJy4KLQkodDQyX3BhcnNlX2VuY29kaW5nKTogVXBkYXRlZCB0byB1c2UgbmV3IFBvc3RTY3JpcHQgcGFyc2VyIHJvdXRpbmVzCi0JZnJvbSBwc2F1eC4KLQlIYW5kbGUgYC9FbmNvZGluZyBbIC4uLiBdJyBhbHNvLgotCShUNDJfTG9hZF9TdGF0dXMpOiBOZXcgZW51bWVyYXRpb24uCi0JKHQ0Ml9wYXJzZV9zZm50cyk6IFVwZGF0ZWQgdG8gdXNlIG5ldyBQb3N0U2NyaXB0IHBhcnNlciByb3V0aW5lcwotCWZyb20gcHNhdXguCi0JKHQ0Ml9wYXJzZV9jaGFyc3RyaW5ncyk6IFVwZGF0ZWQgdG8gdXNlIG5ldyBQb3N0U2NyaXB0IHBhcnNlcgotCXJvdXRpbmVzIGZyb20gcHNhdXguCi0JSGFuZGxlIGAvQ2hhclN0cmluZ3MgPDwgLi4uID4+JyBhbHNvLgotCURvbid0IGV4cGVjdCB0aGF0IC8ubm90ZGVmIGlzIHRoZSBmaXJzdCBlbGVtZW50IGluIGRpY3Rpb25hcnkuICBDb3B5Ci0JY29kZSBmcm9tIHR5cGUxIG1vZHVsZSB0byBoYW5kbGUgdGhpcy4KLQkodDQyX3BhcnNlX2RpY3QpOiBVcGRhdGVkIHRvIHVzZSBuZXcgUG9zdFNjcmlwdCBwYXJzZXIgcm91dGluZXMKLQlmcm9tIHBzYXV4LgotCVJlbW92ZSBjb2RlIGZvciBzeW50aGV0aWMgZm9udHMgKHdoaWNoIGNhbid0IG9jY3VyIGluIFR5cGUgNDIKLQlmb250cykuCi0JKHQ0Ml9sb2FkZXJfZG9uZSk6IFJlbGVhc2UgYHN3YXBfdGFibGUnLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHNraXBfc3RyaW5nKTogSW5jcmVhc2UgYGN1cicgcHJvcGVybHkuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfY2hhcnN0cmluZ3MpOiBNYWtlIHRlc3QgZm9yIGAubm90ZGVmJwotCWZhc3Rlci4KLQotMjAwMy0xMC0xNSAgR3JhaGFtIEFzaGVyICA8Z3JhaGFtLmFzaGVyQGJ0aW50ZXJuZXQuY29tPgotCi0JKiBzcmMvYXV0b2hpbnQvYWhnbG9iYWwuYyAoYmx1ZV9jaGFycyksIHNyYy93aW5mb250cy93aW5mbnQuYwotCShmbnRfY21hcF9jbGFzc19yZWMsIGZudF9jbWFwX2NsYXNzKSwgc3JjL2JkZi9iZGZsaWIuYyAoZW1wdHksCi0JX251bV9iZGZfcHJvcGVydGllcyksIHNyYy9nemlwL2luZnV0aWwuYyAoaW5mbGF0ZV9tYXNrKSwKLQlzcmMvZ3ppcC9pbmZmaXhlZC5oIChmaXhlZF9ibCwgZml4ZWRfYmQsIGZpeGVkX3RsLCBmaXhlZF90ZCksCi0Jc3JjL2d6aXAvaW5mdHJlZXMuaCAoaW5mbGF0ZV90cmVlc19maXhlZCksIHNyYy9nemlwL2luZnRyZWVzLmMKLQkoaW5mbGF0ZV90cmVlc19maXhlZCk6IERlY29yYXRlIHdpdGggbW9yZSBgY29uc3QnIHRvIGF2b2lkCi0Jd3JpdGFibGUgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBhcmUgZGlzYWxsb3dlZCBvbiBBUk0uCi0KLTIwMDMtMTAtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9mb250X21hdHJpeCwgcGFyc2VfY2hhcnN0cmluZ3MpOiBSZW1vdmUKLQljb2RlIHNwZWNpYWxseSBmb3Igc3ludGhldGljIGZvbnRzOyB0aGlzIGlzIGhhbmRsZWQgZWxzZXdoZXJlLgotCShwYXJzZV9lbmNvZGluZyk6IFJlbW92ZSBjb2RlIHNwZWNpYWxseSBmb3Igc3ludGhldGljIGZvbnRzOyB0aGlzIGlzCi0JaGFuZGxlZCBlbHNld2hlcmUuCi0JSW1wcm92ZSBib3VuZGFyeSBjaGVja2luZyB3aGlsZSBwYXJzaW5nLgotCShwYXJzZV9kaWN0KTogSW1wcm92ZSBib3VuZGFyeSBjaGVja2luZyB3aGlsZSBwYXJzaW5nLgotCVVzZSBmdF9tZW1jbXAgdG8gc2ltcGxpZnkgY29kZS4KLQotMjAwMy0xMC0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX3N1YnJzLCBwYXJzZV9kaWN0KTogSGFuZGxlIHN5bnRoZXRpYwotCWZvbnRzIHByb3Blcmx5LgotCShwYXJzZV9jaGFyc3RyaW5ncyk6IENvcHkgY29ycmVjdCBudW1iZXIgb2YgY2hhcmFjdGVycyBpbnRvCi0JYG5hbWVfdGFibGUnLgotCi0yMDAzLTEwLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlIZWF2eSBtb2RpZmljYXRpb24gb2YgdGhlIFBTIHBhcnNlciB0byBoYW5kbGUgY29tbWVudHMgYW5kIHN0cmluZ3MKLQljb3JyZWN0bHkuICBUaGlzIGRvZXNuJ3Qgc2xvdyBkb3duIHRoZSBsb2FkaW5nIG9mIFBTIGZvbnRzCi0Jc2lnbmlmaWNhbnRseSBzaW5jZSBjaGFyc3RyaW5ncyBhcmVuJ3QgYWZmZWN0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmggKGZ0X3hkaWdpdCk6IFJlbmFtZWQgdG8uLi4KLQkoZnRfaXN4ZGlnaXQpOiBUaGlzLiAgVXBkYXRlZCBhbGwgY2FsbGVycy4KLQkoZnRfaXNkaWdpdCk6IE5ldyBhbGlhcyB0byBgaXNkaWdpdCcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNfUGFyc2VyX0Z1bmNzUmVjKTogUmVuYW1lZAotCWBza2lwX2FscGhhJyB0byBgc2tpcF9QU190b2tlbicuCi0JQWRkIHBhcmFtZXRlciB0byBgdG9fYnl0ZXMnIGFuZCBjaGFuZ2Ugc29tZSBhcmd1bWVudCB0eXBlcy4KLQotCSogc3JjL3BzYXV4L3BzYXV4bW9kLmMgKHBzX3BhcnNlcl9mdW5jcyk6IFVwZGF0ZWQuCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKGZ0X2NoYXJfdGFibGUpOiBOZXcgYXJyYXkgdG8gbWFwIGNoYXJhY3RlcgotCWNvZGVzIChBU0NJSSBhbmQgRUJDRElDKSBvZiBkaWdpdHMgdG8gbnVtYmVycy4KLQkoT1ApOiBOZXcgYXV4aWxpYXJ5IG1hY3JvIGhvbGRpbmcgZWl0aGVyIGA+PScgb3IgYDwnIGRlcGVuZGluZyBvbgotCXRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0JKHNraXBfY29tbWVudCk6IE5ldyBmdW5jdGlvbi4KLQkoc2tpcF9zcGFjZXMpOiBVc2UgaXQuCi0JKHNraXBfYWxwaGEpOiBSZW1vdmVkLgotCShza2lwX2xpdGVyYWxfc3RyaW5nLCBza2lwX3N0cmluZyk6IE5ldyBmdW5jdGlvbnMuCi0JKHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuKTogTmV3IGZ1bmN0aW9uLiAgVGhpcyBpcyBhIGJldHRlcgotCXJlcGxhY2VtZW50IG9mLi4uCi0JKHBzX3BhcnNlcl9za2lwX2FscGhhKTogUmVtb3ZlZC4KLQkocHNfcGFyc2VyX3RvX3Rva2VuLCBwc19wYXJzZXJfdG9fdG9rZW5fYXJyYXkpOiBVcGRhdGVkLgotCShUMVJhZGl4KTogUmV3cml0dGVuLCB1c2luZyBgZnRfY2hhcl90YWJsZScuCi0JKHQxX3RvaW50KTogUmVuYW1lZCB0by4uLgotCShwc190b2ludCk6IFRoaXMuICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0JVXNlIGBmdF9jaGFyX3RhYmxlJy4KLQkocHNfdG9ieXRlcyk6IEFkZCBwYXJhbWV0ZXIgdG8gaGFuZGxlIGRlbGltaXRlcnMgYW5kIGNoYW5nZSBzb21lCi0JYXJndW1lbnQgdHlwZXMuCi0JVXNlIGBmdF9jaGFyX3RhYmxlJy4KLQkodDFfdG9maXhlZCk6IFJlbmFtZWQgdG8uLi4KLQkocHNfdG9maXhlZCk6IFRoaXMuICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0JVXNlIGBmdF9jaGFyX3RhYmxlJy4KLQkodDFfdG9jb29yZGFycmF5KTogUmVuYW1lZCBhbmQgdXBkYXRlZCB0by4uLgotCShwc190b2Nvb3JkYXJyYXkpOiBUaGlzLiAgVXBkYXRlIGFsbCBjYWxsZXJzLgotCSh0MV90b2ZpeGVkYXJyYXkpOiBSZW5hbWVkIGFuZCB1cGRhdGVkIHRvLi4uCi0JKHBzX3RvZml4ZWRhcnJheSk6IFRoaXMuICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKHQxX3RvYm9vbCk6IFJlbmFtZWQgdG8uLi4KLQkocHNfdG9ib29sKTogVGhpcy4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KLQkocHNfcGFyc2VyX2xvYWRfZmllbGQpOiBVcGRhdGVkLgotCShwc19wYXJzZXJfbG9hZF9maWVsZF90YWJsZSk6IFVzZSBgVDFfTUFYX1RBQkxFX0VMRU1FTlRTJwotCWV2ZXJ5d2hlcmUuCi0JKHBzX3BhcnNlcl90b19pbnQsIHBzX3BhcnNlcl90b19maXhlZCwgcHNfcGFyc2VyX3RvX2Nvb3JkX2FycmF5LAotCXBzX3BhcnNlcl90b19maXhlZF9hcnJheSk6IFNraXAgc3BhY2VzLiAgVXBkYXRlZC4KLQkocHNfcGFyc2VyX3RvX2J5dGVzKTogQWRkIHBhcmFtZXRlciB0byBoYW5kbGUgZGVsaW1pdGVycyBhbmQgY2hhbmdlCi0Jc29tZSBhcmd1bWVudCB0eXBlcy4gIFVwZGF0ZWQuCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfcGFyc2VfZGljdCk6IFVwZGF0ZWQuCi0JKiBzcmMvY2lkL2NpZHBhcnNlLmMgKGNpZF9wYXJzZXJfbmV3KTogQ2hlY2sgd2hldGhlciB0aGUgYFN0YXJ0RGF0YScKLQl0b2tlbiB3YXMgcmVhbGx5IGZvdW5kLgotCSogc3JjL2NpZC9jaWRwYXJzZS5oIChjaWRfcGFyc2VyX3NraXBfYWxwaGEpOiBVcGRhdGVkIGFuZCByZW5hbWVkCi0JdG8uLi4KLQkoY2lkX3BhcnNlcl9za2lwX1BTX3Rva2VuKTogVGhpcy4KLQotCSogc3JjL3R5cGUxL3QxcGFyc2UuaCAoVDFfUGFyc2VyUmVjKTogVXNlIGBGVF9Cb29sJyBmb3IgYm9vbGVhbgotCWZpZWxkcy4KLQkoVDFfU2tpcF9BbHBoYSk6IFJlcGxhY2VkIHdpdGguLi4KLQkoVDFfU2tpcF9QU19Ub2tlbik6IFRoaXMgbmV3IG1hY3JvLgotCSogc3JjL3R5cGUxL3QxcGFyc2UuYyAoaGV4YV92YWx1ZSk6IFJlbW92ZWQuCi0JKFQxX0dldF9Qcml2YXRlX0RpY3QpOiBVc2UgYGZ0X2lzeGRpZ2l0JyBhbmQKLQlgcHNhdXgtPnBzX3BhcnNlcl9mdW5jc190b19ieXRlcycgZm9yIGhhbmRsaW5nIEFTQ0lJIGhleGFkZWNpbWFsCi0JZW5jb2RpbmcuCi0JQWZ0ZXIgZGVjcnlwdGluZywgcmVwbGFjZSB0aGUgZm91ciByYW5kb20gYnl0ZXMgYXQgdGhlIGJlZ2lubmluZwotCXdpdGggd2hpdGVzcGFjZS4KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAodDFfYWxsb2NhdGVfYmxlbmQpOiBVc2UgcHJvcGVyIGVycm9yIHZhbHVlcy4KLQkocGFyc2VyX2JsZW5kX2Rlc2lnbl9wb3NpdGlvbnMsIHBhcnNlX2JsZW5kX2Rlc2lnbl9tYXAsCi0JcGFyc2Vfd2VpZ2h0X3ZlY3Rvcik6IFVwZGF0ZWQuCi0JKGlzX3NwYWNlKTogSGFuZGxlIGBcZicgYWxzby4KLQkoaXNfbmFtZV9jaGFyKTogUmVtb3ZlZC4KLQkocmVhZF9iaW5hcnlfZGF0YSk6IFVwZGF0ZWQuCi0JKHBhcnNlX2VuY29kaW5nKTogVXNlIGBmdF9pc2RpZ2l0Jy4KLQlVcGRhdGVkLgotCShwYXJzZV9zdWJycyk6IFVwZGF0ZWQuCi0JKFRBQkxFX0VYVEVORCk6IE5ldyBtYWNyby4KLQkocGFyc2VfY2hhcnN0cmluZ3MpOiBVcGRhdGVkLgotCVByb3ZpZGUgYSB3b3JrYXJvdW5kIGZvciBidWdneSBmb250cyB3aGljaCBoYXZlIG1vcmUgZW50cmllcyBpbiB0aGUKLQkvQ2hhclN0cmluZ3MgZGljdGlvbmFyeSB0aGVuIGV4cGVjdGVkOyB0aGUgZnVuY3Rpb24gbm93IGFkZHMgc29tZQotCXNsb3RzIGFuZCBza2lwcyBlbnRyaWVzIHdoaWNoIHN0aWxsIGV4Y2VlZCB0aGUgbmV3IGxpbWl0LgotCShwYXJzZV9kaWN0KTogVXBkYXRlZC4KLQlUZXJtaW5hdGUgb24gdGhlIHRva2VuIGBjbG9zZWZpbGUnLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKFQxX1NraXBfQWxwaGEpOiBSZXBsYWNlZCB3aXRoLi4uCi0JKFQxX1NraXBfUFNfVG9rZW4pOiBUaGlzIG5ldyBtYWNyby4gIFVwZGF0ZWQgYWxsIGNhbGxlcnMuCi0JKHQ0Ml9wYXJzZV9lbmNvZGluZyk6IFVzZSBgZnRfaXNkaWdpdCcuCi0KLQotCSogc3JjL2Jhc2UvZnRtbS5jIChmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKTogUmV0dXJuIEZUX0Vycl9PayBpZgotCXN1Y2Nlc3MuCi0KLTIwMDMtMTAtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZHVsZS5oOiBSZW5hbWVkIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmg6IFRoaXMgdG8gYXZvaWQgZHVwbGljYXRlIGZpbGUgbmFtZXMuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9NT0RVTEVfSCk6IFVwZGF0ZWQuCi0KLTIwMDMtMTAtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PcmllbnRhdGlvbkV4dHJlbXVtUmVjLAotCUZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKTogVHJpdmlhbCB0eXBvIGZpeGVzIHRvIG1ha2UgaXQgY29tcGlsZS4KLQotMjAwMy0xMC0wMiAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGVF9XaW5GTlRfSGVhZGVyUmVjKTogYGNvbG9yX3RhYmxlX29mZnNldCcKLQloYXMgZm91ciBieXRlcywgbm90IHR3by4KLQlGaXggYWxsIHVzZXJzLgotCShmbnRfZm9udF9sb2FkLCBGTlRfTG9hZF9HbHlwaCk6IEFkZCBtb3JlIGZvbnQgdmFsaWRpdHkgdGVzdHMuCi0KLTIwMDMtMTAtMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvKjogQWRkaW5nIGZpcnN0IHNvdXJjZSBmaWxlcyBvZiB0aGUgbmV3IG11bHRpLXNjcmlwdAotCWBhdXRvLWZpdHRlcicuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oIChGVF9PcmllbnRhdGlvbik6IE5ldyBlbnVtZXJhdGlvbi4KLQkoRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24pOiBOZXcgZGVjbGFyYXRpb24uCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3JpZW50YXRpb25FeHRyZW11bVJlYyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGZ0X29yaWVudGF0aW9uX2V4dHJlbXVtX2NvbXB1dGUpOiBOZXcgYXV4aWxpYXJ5IGZ1bmN0aW9uLgotCShGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbik6IE5ldyBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBmaWxsCi0Jb3JpZW50YXRpb24gb2YgYSBnaXZlbiBnbHlwaCBvdXRsaW5lLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIChGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKTogRml4ZWQKLQl0cml2aWFsIGJ1ZyB3aGljaCBjb3VsZCBjcmFzaCB0aGUgZm9udCBlbmdpbmUgd2hlbiBhIGNhY2hlZCBzZXJ2aWNlCi0JcG9pbnRlciB3YXMgcmV0cmlldmVkLgotCi0yMDAzLTA5LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfcGFyc2VfZGljdCk6IFNraXAgdG9rZW4gaWYgbm8ga2V5d29yZCBpcwotCWZvdW5kLgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChJU19UMV9XSElURVNQQUNFLCBJU19UMV9MSU5FU1BBQ0UsCi0JSVNfVDFfU1BBQ0UpOiBSZW1vdmVkLgotCShQRkJfVGFnKTogUmVtb3ZlZC4KLQkocmVhZF9wZmJfdGFnKTogRG9uJ3QgdXNlIFBGQl9UYWcuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX2lzX3NwYWNlKTogSGFuZGxlIGBcZicgYWxzby4KLQkodDQyX3BhcnNlX2VuY29kaW5nKTogSGFuZGxlIHN5bnRoZXRpYyBmb250cy4KLQotMjAwMy0wOS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaDogRG9uJ3QgaW5jbHVkZQotCUZUX0lOVEVSTkFMX09CSkVDVFNfSCBidXQgRlRfSU5URVJOQUxfU0VSVklDRV9ILgotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jOiBEb24ndCBpbmNsdWRlCi0JRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVTX0guCi0KLTIwMDMtMDktMjkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUFkZGVkIG5ldyBzZXJ2aWNlIHRvIGhhbmRsZSBnbHlwaCBuYW1lIGRpY3Rpb25hcmllcywgcmVwbGFjaW5nIHRoZQotCW9sZCBpbnRlcm5hbCBoZWFkZXIgbmFtZWQgYHBzbmFtZXMuaCcgYnkgYHNlcnZpY2VzL3N2cHNuYW1lLmgnLgotCU5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGBzZXJ2aWNlcy9zdnBvc3RubS5oJyB3aGljaCBvbmx5Ci0JaGFuZGxlcyB0aGUgcmV0cmlldmFsIG9mIFBvc3RTY3JpcHQgZm9udCBuYW1lcyBmb3IgYSBnaXZlbiBmYWNlLgotCShTaG91bGQgd2UgbWVyZ2UgdGhlc2UgdHdvIHNlcnZpY2VzIGludG8gYSBzaW5nbGUgaGVhZGVyPykKLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc25hbWVzLmg6IFJlbW92ZWQuICBNb3N0IG9mIGl0cwotCWNvbnRlbnRzIGlzIG1vdmVkIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNuYW1lLmg6IE5ldyBmaWxlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmgKLQkoRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX05BTUUpOiBSZXBsYWNlZCB3aXRoLi4uCi0JKEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUpOiBOZXcgbWFjcm8uCi0JKFBzTmFtZSk6IFNlcnZpY2UgbmFtZWQgY2hhbmdlZCB0by4uLgotCShQc0ZvbnROYW1lKTogVGhpcy4KLQlVcGRhdGVkIGBGVF9TZXJ2aWNlX1BzTmFtZScgLT4gYEZUX1NlcnZpY2VfUHNGb250TmFtZScgYW5kCi0JYFBPU1RTQ1JJUFRfTkFNRScgLT4gYFBPU1RTQ1JJUFRfRk9OVF9OQU1FJyBldmVyeXdoZXJlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmgKLQkoRlRfSU5URVJOQUxfUE9TVFNDUklQVF9OQU1FU19IKTogUmVtb3ZlZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaDogSW5jbHVkZQotCUZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FU19ILgotCShUMV9EZWNvZGVyUmVjKTogVXBkYXRlZCB0eXBlIG9mIGBwc25hbWVzJy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oOiBEb24ndCBpbmNsdWRlCi0JRlRfSU5URVJOQUxfUE9TVFNDUklQVF9OQU1FU19IIGJ1dCBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRVNfSC4KLQlJbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDQydHlwZXMuaDogRG9uJ3QgaW5jbHVkZQotCUZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfTkFNRVNfSC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GYWNlUmVjKTogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCAoRlRfRkFDRV9GSU5EX1NFUlZJQ0UpOiBDaGFuZ2VkCi0Jb3JkZXIgb2YgcGFyYW1ldGVycy4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSk6IE5ldyBtYWNybyB0byBsb29rIHVwIGEgc2VydmljZQotCWdsb2JhbGx5LCBjaGVja2luZyBhbGwgbW9kdWxlcy4KLQkoRlRfU2VydmljZUNhY2hlUmVjKTogVXBkYXRlZC4KLQkoRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVTX0gpOiBOZXcgbWFjcm8gZm9yIGFjY2Vzc2luZwotCWBzdnBzbmFtZS5oJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCwgc3JjL2Jhc2UvZnRvYmpzLmMKLQkoZnRfbW9kdWxlX2dldF9zZXJ2aWNlKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmM6IERvbid0IGluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9OQU1FU19ICi0JYnV0IEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FU19ILgotCShjZmZfZ2V0X2dseXBoX25hbWUsIGNmZl9nZXRfbmFtZV9pbmRleCk6IFVzZSBuZXcgUE9TVFNDUklQVF9OQU1FUwotCXNlcnZpY2UuCi0JKiBzcmMvY2ZmL2NmZmNtYXAuYyAoY2ZmX2NtYXBfdW5pY29kZV9pbml0KTogVXBkYXRlZC4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jLCBzcmMvY2ZmL2NmZmxvYWQuaDogIERvbid0IGluY2x1ZGUKLQlGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX05BTUVTX0ggYnV0IEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FU19ILgotCShjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcpOiBVcGRhdGVkLgotCSogc3JjL2NmZi9jZmZvYmpzLmM6ICBEb24ndCBpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfTkFNRVNfSAotCWJ1dCBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRVNfSC4KLQkoY2ZmX2ZhY2VfaW5pdCk6IFVzZSBuZXcgUE9TVFNDUklQVF9OQU1FUyBzZXJ2aWNlLgotCSogc3JjL2NmZi9jZmZvYmpzLmg6ICBEb24ndCBpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfTkFNRVNfSAotCWJ1dCBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRVNfSC4KLQotCSogc3JjL2NpZC9jaWRvYmpzLmM6ICBEb24ndCBpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfTkFNRVNfSAotCWJ1dCBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRVNfSC4KLQkoY2lkX2ZhY2VfaW5pdCk6IFVzZSBuZXcgUE9TVFNDUklQVF9OQU1FUyBzZXJ2aWNlLgotCSogc3JjL2NpZC9jaWRyaXZlci5jOiBEb24ndCBpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfTkFNRVNfSC4KLQotCSogc3JjL3BzYXV4L3QxY21hcC5jICh0MV9jbWFwX3N0ZF9pbml0LCB0MV9jbWFwX3VuaWNvZGVfaW5pdCk6IFVzZQotCW5ldyBQT1NUU0NSSVBUX05BTUVTIHNlcnZpY2UuCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuaCAodDFfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlLAotCXQxX2RlY29kZV9pbml0KTogVXNlIG5ldyBQT1NUU0NSSVBUX05BTUVTIHNlcnZpY2UuCi0JKiBzcmMvcHNhdXgvdDFjbWFwLmgsIHNyYy9wc2F1eC90MWRlY29kZS5oOiBEb24ndCBpbmNsdWRlCi0JRlRfSU5URVJOQUxfUE9TVFNDUklQVF9OQU1FU19ILgotCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jOiAgRG9uJ3QgaW5jbHVkZQotCUZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfTkFNRVNfSCBidXQgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVTX0guCi0JKHBzX2J1aWxkX3VuaWNvZGVfdGFibGUpOiBSZW5hbWVkIHRvLi4uCi0JKHBzX3VuaWNvZGVzX2luaXQpOiBUaGlzLgotCShwc19sb29rdXBfdW5pY29kZSk6IFJlbmFtZWQgdG8uLi4KLQkocHNfdW5pY29kZXNfY2hhcl9pbmRleCk6IFRoaXMuCi0JKHBzX25leHRfdW5pY29kZSk6IFJlbmFtZWQgdG8uLi4KLQkocHNfdW5pY29kZXNfY2hhcl9uZXh0KTogVGhpcy4KLQkocHNuYW1lc19pbnRlcmZhY2UpOiBVcGRhdGVkLgotCShwc25hbWVzX3NlcnZpY2VzKTogTmV3IHNlcnZpY2VzIGxpc3QuCi0JKHBzbmFtZXNfZ2V0X3NlcnZpY2UpOiBOZXcgZnVuY3Rpb24uCi0JKHBzbmFtZXNfbW9kdWxlX2NsYXNzKTogVXBkYXRlZC4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmM6IERvbid0IGluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9OQU1FU19ICi0JYnV0IEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FU19ILgotCShzZm50X2luaXRfZmFjZSk6IFVzZSBuZXcgUE9TVFNDUklQVF9OQU1FUyBzZXJ2aWNlLgotCSogc3JjL3NmbnQvdHRwb3N0LmM6IERvbid0IGluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9OQU1FU19ICi0JYnV0IEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FU19ILgotCSh0dF9mYWNlX2dldF9wc19uYW1lKTogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jOiAgRG9uJ3QgaW5jbHVkZQotCUZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfTkFNRVNfSCBidXQgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVTX0guCi0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jOiAgRG9uJ3QgaW5jbHVkZQotCUZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfTkFNRVNfSCBidXQgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVTX0guCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmM6ICBEb24ndCBpbmNsdWRlCi0JRlRfSU5URVJOQUxfUE9TVFNDUklQVF9OQU1FU19IIGJ1dCBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRVNfSC4KLQkoVDFfRmFjZV9Jbml0KTogVXNlIG5ldyBQT1NUU0NSSVBUX05BTUVTIHNlcnZpY2UuCi0KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYyAodDQyX2dldF9wc19uYW1lKTogUmVuYW1lZCB0by4uLgotCSh0NDJfZ2V0X3BzX2ZvbnRfbmFtZSk6IFRoaXMuCi0JKHQ0Ml9zZXJ2aWNlX3BzX25hbWUpOiBSZW5hbWVkIHRvLi4uCi0JKHQ0Ml9zZXJ2aWNlX3BzX2ZvbnRfbmFtZSk6IFRoaXMuCi0JKHQ0Ml9zZXJ2aWNlcyk6IFVwZGF0ZWQuCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCk6IFVzZSBuZXcgUE9TVFNDUklQVF9OQU1FUwotCXNlcnZpY2UuCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuaDogIERvbid0IGluY2x1ZGUKLQlGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX05BTUVTX0ggYnV0IEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FU19ILgotCi0KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyAoRlRfR2V0X0dseXBoKTogRG9uJ3QgYWNjZXNzIGBzbG90JyBiZWZvcmUKLQl0ZXN0aW5nIGl0cyB2YWxpZGl0eS4gIFJlcG9ydGVkIGJ5IEhlbnJ5IE1hZGRvY2tzCi0JPG1hZGRvY2tzQG1ldHNlcnZpY2UuY29tPi4KLQotMjAwMy0wOS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIChGVF9GQUNFX0ZJTkRfU0VSVklDRSk6Ci0JRml4IGNvbXBpbGF0aW9uIHdhcm5pbmcgKHMvcHB0ci9QcHRyLykuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCAoRlRfSU5URVJOQUxfUEZSX0gsCi0JRlRfSU5URVJOQUxfRk5UX1RZUEVTX0gpOiBSZW1vdmVkLgotCi0yMDAzLTA5LTIxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlNaWdyYXRpbmcgdGhlIFBGUiBhbmQgV0lORk5UIGRyaXZlcnMgdG8gdGhlIG5ldyBzZXJ2aWNlLWJhc2VkCi0JaW50ZXJuYWwgQVBJLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ZudHR5cGVzLmg6IFJlbW92ZWQuICBNb3N0IG9mIGl0cyBkYXRhCi0JYXJlIG1vdmVkIHRvIHdpbmZudC5oIGFuZC4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oOiBOZXcgZmlsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wZnIuaDogUmVtb3ZlZC4gIE1vc3Qgb2YgaXRzIGRhdGEgYXJlCi0JbW92ZWQgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaDogTmV3IGZpbGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX0ZBQ0VfRklORF9TRVJWSUNFLAotCUZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UpOiBTaW1wbGlmeSBmaXggb2YgMjAwMy0wOS0xNiBieSByZW1vdmluZwotCXBvaW50ZXIgdHlwZSBhcmd1bWVudC4KLQlVcGRhdGVkIGFsbCBjYWxsZXJzLgotCVVwZGF0ZSBtYWNybyBuYW1lcyBvZiBzZXJ2aWNlcyBoZWFkZXIgZmlsZXMuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfTmFtZV9JbmRleCk6IFNpbXBsaWZpZWQgY29kZS4KLQotCSogc3JjL2Jhc2UvZnRwZnIuYzogSW5jbHVkZSBGVF9TRVJWSUNFX1BGUl9IIGluc3RlYWQgb2YKLQlGVF9JTlRFUk5BTF9QRlJfSC4KLQkoZnRfcGZyX2NoZWNrLCBGVF9HZXRfUEZSX01ldHJpY3MsIEZUX0dldF9QRlJfS2VybmluZywKLQlGVF9HZXRfUEZSX0FkdmFuY2UpOiBVc2Ugc2VydmljZXMgcHJvdmlkZWQgaW4gYFBGUl9NRVRSSUNTJy4KLQotCSogc3JjL2Jhc2UvZnR3aW5mbnQuYzogSW5jbHVkZSBGVF9TRVJWSUNFX1dJTkZOVF9IIGluc3RlYWQgb2YKLQlGVF9JTlRFUk5BTF9GTlRfVFlQRVNfSC4KLQkoRlRfR2V0X1dpbkZOVF9IZWFkZXIpOiBVc2Ugc2VydmljZSBwcm92aWRlZCBpbiBgV0lORk5UJy4KLQotCSogc3JjL3Bmci9wZnJkcml2ci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUEZSX0ggYW5kCi0JRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSCBpbnN0ZWFkIG9mIEZUX0lOVEVSTkFMX1BGUl9ILgotCShwZnJfc2VydmljZV9iZGYpOiBVcGRhdGVkLgotCShwZnJfc2VydmljZXMpOiBOZXcgc2VydmljZXMgbGlzdC4KLQkocGZyX2dldF9zZXJ2aWNlKTogTmV3IGZ1bmN0aW9uLgotCShwZnJfZHJpdmVyX2NsYXNzKTogVXBkYXRlZC4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfV0lORk5UX0ggYW5kCi0JRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSCBpbnN0ZWFkIG9mIEZUX0lOVEVSTkFMX0ZOVF9UWVBFU19ILgotCSh3aW5mbnRfZ2V0X2hlYWRlciwgd2luZm50X2dldF9zZXJ2aWNlKTogTmV3IGZ1bmN0aW9ucy4KLQkod2luZm50X3NlcnZpY2VfcmVjKTogTmV3IHN0cnVjdHVyZSBwcm92aWRpbmcgV0lORk5UIHNlcnZpY2VzLgotCSh3aW5mbnRfc2VydmljZXMpOiBOZXcgc2VydmljZXMgbGlzdC4KLQkod2luZm50X2RyaXZlcl9jbGFzcyk6IFVwZGF0ZWQuCi0JKiBzcmMvd2luZm9udHMvd2luZm50Lmg6IEFkZCBtb3N0IG9mIHRoZSByZW1vdmVkIGZudHR5cGVzLmggZGF0YS4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9zZXJ2aWNlX3BzX25hbWUpOiBGaXggdHlwby4KLQotCSogc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX3NlcnZpY2VfcHNfbmFtZSk6IEZpeCB0eXBvLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYywgc3JjL2NpZC9jaWRvYmpzLmMsIHNyYy9wZnIvcGZyc2JpdC5jLAotCXNyYy9wc2F1eC9wc29ianMuYywgc3JjL3NmbnQvc2ZvYmpzLmMsIHNyYy90cnVldHlwZS90dG9ianMuYywKLQlzcmMvdHlwZTEvdDFvYmpzLmMsIHNyYy90eXBlNDIvdDQyb2Jqcy5jOiBSZW1vdmluZyB2YXJpb3VzIGNvbXBpbGVyCi0Jd2FybmluZ3MuCi0KLTIwMDMtMDktMTkgIERhdmlkIEJldmFuICA8ZGJldmFuQGVtdGV4LmNvbT4KLQotCSogc3JjL3R5cGUxL3QxcGFyc2UuYyAocGZiX3RhZ19maWVsZHMpOiBSZW1vdmVkLgotCShyZWFkX3BmYl90YWcpOiBGaXggY29kZSBzbyB0aGF0IGl0IGRvZXNuJ3QgZmFpbCBvbiBlbmQtb2YtZmlsZQotCWluZGljYXRvciAoMHg4MDAzKS4KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwMy0wOS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIChGVF9GQUNFX0ZJTkRfU0VSVklDRSwKLQlGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKTogQWRkIHBhcmFtZXRlciB0byBwYXNzIHBvaW50ZXIgdHlwZS4KLQlVZ2x5LCBJIGtub3csIGJ1dCB0aGlzIGlzIG5lZWRlZCBmb3IgY29tcGlsYXRpb24gd2l0aCBDKysgLS0KLQltYXliZSBzb21lb25lIGtub3dzIGEgYmV0dGVyIHNvbHV0aW9uPwotCVVwZGF0ZWQgYWxsIGNhbGxlcnMuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfTmFtZV9JbmRleCwgRlRfR2V0X0dseXBoX05hbWUpOiBSZW1vdmUKLQlDKysgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIHNyYy9iYXNlL2Z0YmRmLmMgKEZUX0dldF9CREZfQ2hhcnNldF9JRCwgRlRfR2V0X0JERl9Qcm9wZXJ0eSk6Ci0JRml4IG9yZGVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gRlRfRkFDRV9GSU5EX1NFUlZJQ0UuCi0KLTIwMDMtMDktMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUF2b2lkIGhlYWRlciBmaWxlcyB3aXRoIGlkZW50aWNhbCBuYW1lcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9iZGYuaDogUmVuYW1lZCB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmJkZi5oOiBUaGlzLgotCUFkZCBjb3B5cmlnaHQgbm90aWNlLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9nbHlmZGljdC5oOiBSZW5hbWVkIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0Lmg6IFRoaXMuCi0JQWRkIGNvcHlyaWdodCBub3RpY2UuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL211bHRtYXN0Lmg6IFJlbmFtZWQgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oOiBUaGlzLgotCUFkZCBjb3B5cmlnaHQgbm90aWNlLgotCUFkZCBGVF9CRUdJTl9IRUFERVIgYW5kIEZUX0VORF9IRUFERVIuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3NmbnQuaDogUmVuYW1lZCB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaDogVGhpcy4KLQlBZGQgY29weXJpZ2h0IG5vdGljZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvcG9zdG5hbWUuaDogUmVuYW1lZCB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oOiBUaGlzLgotCUFkZCBjb3B5cmlnaHQgbm90aWNlLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy94Zjg2bmFtZS5oOiBSZW5hbWVkIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2eGY4Nm5tLmg6IFRoaXMuCi0JQWRkIGNvcHlyaWdodCBub3RpY2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg6IEFkZCBGVF9CRUdJTl9IRUFERVIgYW5kCi0JRlRfRU5EX0hFQURFUi4KLQlBZGQgY29weXJpZ2h0IG5vdGljZS4KLQlVcGRhdGUgbWFjcm8gbmFtZXMgb2Ygc2VydmljZXMgaGVhZGVyIGZpbGVzLgotCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKFNFUlZJQ0VTX0RJUik6IE5ldyB2YXJpYWJsZS4KLQkoQkFTRV9IKTogQWRkIHNlcnZpY2VzIGhlYWRlciBmaWxlcy4KLQotMjAwMy0wOS0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdG9wbGV2ZWwubWsgKGRpc3RjbGVhbik6IFJlbW92ZSBgYnVpbGRzL3VuaXgvZnJlZXR5cGUyLnBjJy4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jOiBEb24ndCBsb2FkIGhlYWRlcnMgdHdpY2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX1NFUlZJQ0VfU0ZOVF9IKTogTmV3IG1hY3JvLgotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9TRk5UX0guCi0KLQkqIHNyYy9jZmYvY2ZmY21hcC5jOiBJbmNsdWRlIGBjZmZlcnJzLmgnLgotCSogc3JjL3Bmci9wZnJkcml2ci5jOiBJbmNsdWRlIGBwZnJlcnJvci5oJy4KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmM6IEluY2x1ZGUgYHNmZXJyb3JzLmgnLgotCSogc3JjL3BzYXV4L3Bzb2Jqcy5oOiBBZGQgZGVjbGFyYXRpb24gZm9yIGBwc19wYXJzZXJfdG9fYnl0ZXMnLgotCi0yMDAzLTA5LTExICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlJbnRyb2R1Y2luZyB0aGUgY29uY2VwdCBvZiBgbW9kdWxlIHNlcnZpY2VzJy4gIFRoaXMgaXMgdGhlIGZpcnN0Ci0Jc3RlcCB0b3dhcmRzIGEgbWFzc2l2ZSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgZW5naW5lJ3MgaW50ZXJuYWxzLCBpbgotCW9yZGVyIHRvIGdldCByaWQgb2YgdmFyaW91cyBudW1iZXJzIG9mIGhhY2tzLgotCi0JTm90ZSB0aGF0IHRoZXNlIGNoYW5nZXMgd2lsbCBicmVhayBzb3VyY2UgJiBiaW5hcnkgY29tcGF0aWJpbGl0eSBmb3IKLQlhdXRob3JzIG9mIGV4dGVybmFsIGZvbnQgZHJpdmVycy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCAoRlRfQkVHSU5fU1RNTlQsIEZUX0VORF9TVE1OVCwKLQlGVF9EVU1NWV9TVE1OVCk6IE5ldyBtYWNyb3MuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg6IE5ldyBmaWxlLCBjb250YWluaW5nIHRoZSBuZXcKLQlzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgdG8gcHJvdmlkZSBgc2VydmljZXMnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmggKEZUX0lOVEVSTkFMX0VYVEVOU0lPTl9ILAotCUZUX0lOVEVSTkFMX0VYVEVORF9ILCBGVF9JTlRFUk5BTF9IQVNIX0gsIEZUX0lOVEVSTkFMX09CSkVDVF9IKToKLQlSZW1vdmVkLCBvYnNvbGV0ZS4KLQkoRlRfSU5URVJOQUxfU0VSVklDRV9IKTogTmV3IG1hY3JvIGZvciBgZnRzZXJ2LmgnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL2JkZi5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvZ2x5ZmRpY3QuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3Bvc3RuYW1lLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy94Zjg2bmFtZS5oOiBOZXcgZmlsZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtbS5oIChGVF9HZXRfTU1fRnVuYywgRlRfU2V0X01NX0Rlc2lnbl9GdW5jLAotCUZUX1NldF9NTV9CbGVuZF9GdW5jKTogRnVuY3Rpb24gcG9pbnRlcnMgbW92ZWQgKGluIG1vZGlmaWVkIGZvcm0pCi0JdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvbXVsdG1hc3QuaDogTmV3IGZpbGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIChTRk5UX0ludGVyZmFjZSk6IGBnZXRfaW50ZXJmYWNlJwotCWlzIG5vdyBvZiB0eXBlIGBGVF9Nb2R1bGVfUmVxdWVzdGVyJy4KLQkoU0ZOVF9HZXRfSW50ZXJmYWNlX0Z1bmMsIFNGTlRfTG9hZF9UYWJsZV9GdW5jKTogRnVuY3Rpb24gcG9pbnRlcnMKLQltb3ZlZCAoaW4gbW9kaWZpZWQgZm9ybSkgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc2ZudC5oOiBOZXcgZmlsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oIChGVF9HZXRfU2ZudF9UYWJsZV9GdW5jKTogRnVuY3Rpb24KLQlwb2ludGVyIG1vdmVkIChpbiBtb2RpZmllZCBmb3JtKSB0byBgc2VydmljZXMvc2ZudC5oJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZHVsZS5oIChGVF9Nb2R1bGVfSW50ZXJmYWNlKTogTWFrZSBpdCBhCi0JYSB0eXBlZGVmIHRvIGBGVF9Qb2ludGVyJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpOiBBZGQKLQlgcG9zdHNjcmlwdF9uYW1lJy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0ZhY2VfSW50ZXJuYWxSZWMpOiBSZW1vdmUKLQlgcG9zdHNjcmlwdF9uYW1lJy4KLQlBZGQgYHNlcnZpY2VzJyBlbGVtZW50LgotCShGVF9MaWJyYXJ5UmVjKTogUmVtb3ZlIGBtZXRhX2NsYXNzJy4KLQotCSogc3JjL2Jhc2UvZnRiZGYuYzogSW5jbHVkZSBGVF9TRVJWSUNFX0JERl9ILgotCSh0ZXN0X2ZvbnRfdHlwZSk6IFJlbW92ZWQuCi0JKEZUX0dldF9CREZfQ2hhcnNldF9JRCwgRlRfR2V0X0JERl9Qcm9wZXJ0eSk6IFVzZSBzZXJ2aWNlcwotCXByb3ZpZGVkIGluIGBGVF9TRVJWSUNFX0lEX0JERicuCi0KLQkqIHNyYy9iYXNlL2Z0bW0uYzogSW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSC4KLQkoZnRfZmFjZV9nZXRfbW1fc2VydmljZSk6IE5ldyBhdXhpbGlhcnkgZnVuY3Rpb24gdG8gZ2V0IHNlcnZpY2VzCi0JZnJvbSBgRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTJy4KLQkoRlRfR2V0X011bHRpX01hc3RlciwgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcywKLQlGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMpOiBVc2UgYGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UnLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYzogSW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9IIGFuZAotCUZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ILgotCShmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKTogTmV3IGZ1bmN0aW9uIHRvIGdldCBhIHNwZWNpZmljIHNlcnZpY2UuCi0JKGRlc3Ryb3lfZmFjZSk6IFVwZGF0ZWQuCi0JKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBTaW1wbGlmeSBzb21lIGNvZGUuCi0JKElzTWFjUmVzb3VyY2UpOiBGaXggd2FybmluZ3MuCi0JKEZUX0dldF9OYW1lX0luZGV4LCBGVF9HZXRfR2x5cGhfTmFtZSk6IFVzZSBzZXJ2aWNlcyBwcm92aWRlZCBpbgotCWBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QnLgotCShGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKTogVXNlIHNlcnZpY2UgcHJvdmlkZWQgaW4KLQlgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX05BTUUnLgotCShGVF9HZXRfU2ZudF9UYWJsZSwgRlRfTG9hZF9TZm50X1RhYmxlKTogVXNlIHNlcnZpY2VzIHByb3ZpZGVkIGluCi0JYEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRScuCi0KLQkqIHNyYy9iYXNlL2Z0eGY4Ni5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfWEZSRUU4Nl9OQU1FX0guCi0JKEZUX0dldF9YMTFfRm9udF9Gb3JtYXQpOiBVc2Ugc2VydmljZSBwcm92aWRlZCBpbgotCWBGVF9TRVJWSUNFX0lEX1hGODZfTkFNRScuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYzogSW5jbHVkZSBGVF9TRVJWSUNFX0JERl9IIGFuZAotCUZUX1NFUlZJQ0VfWEZSRUU4Nl9OQU1FX0guCi0JKGJkZl9nZXRfY2hhcnNldF9pZCk6IE5ldyBmdW5jdGlvbi4KLQkoYmRmX3NlcnZpY2VfYmRmKTogTmV3IHN0cnVjdHVyZSBwcm92aWRpbmcgQkRGIHNlcnZpY2VzLgotCShiZGZfc2VydmljZXMpOiBOZXcgc2VydmljZXMgbGlzdC4KLQkoYmRmX2RyaXZlcl9yZXF1ZXN0ZXIpOiBVc2UgYGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAnLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSCBhbmQKLQlGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSC4KLQkoY2ZmX3NlcnZpY2VfZ2x5cGhfZGljdCk6IE5ldyBzdHJ1Y3R1cmUgcHJvdmlkaW5nIENGRiBzZXJ2aWNlcy4KLQkoY2ZmX3NlcnZpY2VzKTogTmV3IHNlcnZpY2VzIGxpc3QuCi0JKGNmZl9nZXRfaW50ZXJmYWNlKTogVXNlIGBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwJy4KLQotCSogc3JjL2NpZC9jaWRyaXZlci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0ggYW5kCi0JRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSC4KLQkoY2lkX3NlcnZpY2VfcHNfbmFtZSk6IE5ldyBzdHJ1Y3R1cmUgcHJvdmlkaW5nIENJRCBzZXJ2aWNlcy4KLQkoY2lkX3NlcnZpY2VzKTogTmV3IHNlcnZpY2VzIGxpc3QuCi0JKGNpZF9nZXRfaW50ZXJmYWNlKTogVXNlIGBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwJy4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfQkRGX0ggYW5kCi0JRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSC4KLQkocGNmX3NlcnZpY2VfYmRmKTogTmV3IHN0cnVjdHVyZSBwcm92aWRpbmcgUENGIHNlcnZpY2VzLgotCShwY2Zfc2VydmljZXMpOiBOZXcgc2VydmljZXMgbGlzdC4KLQkocGNmX2RyaXZlcl9yZXF1ZXN0ZXIpOiBVc2UgYGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAnLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9IIGFuZAotCUZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0guCi0JKGdldF9zZm50X2dseXBoX25hbWUpOiBSZW5hbWVkIHRvLi4uCi0JKHNmbnRfZ2V0X2dseXBoX25hbWUpOiBUaGlzLgotCShnZXRfc2ZudF9wb3N0c2NyaXB0X25hbWUpOiBSZW5hbWVkIHRvLi4uCi0JKHNmbnRfZ2V0X3BzX25hbWUpOiBUaGlzLgotCVVwZGF0ZWQuCi0JKHNmbnRfc2VydmljZV9nbHlwaF9kaWN0LCBzZm50X3NlcnZpY2VfcHNfbmFtZSk6IE5ldyBzdHJ1Y3R1cmVzCi0JcHJvdmlkaW5nIHNlcnZpY2VzLgotCShzZm50X3NlcnZpY2VzKTogTmV3IHNlcnZpY2VzIGxpc3QuCi0JKHNmbnRfZ2V0X2ludGVyZmFjZSk6IFVzZSBgZnRfc2VydmljZV9saXN0X2xvb2t1cCcuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfWEZSRUU4Nl9OQU1FX0guCi0JKHR0X3NlcnZpY2VzKTogTmV3IHNlcnZpY2VzIGxpc3QuCi0JKHR0X2dldF9pbnRlcmZhY2UpOiBVc2UgYGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAnLgotCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYzogSW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSCwKLQlGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSCwgRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSCwgYW5kCi0JRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSC4KLQkodDFfc2VydmljZV9nbHlwaF9kaWN0LCB0MV9zZXJ2aWNlX3BzX25hbWUsCi0JdDFfc2VydmljZV9tdWx0aV9tYXN0ZXJzKTogTmV3IHN0cnVjdHVyZXMgcHJvdmlkaW5nIFR5cGUgMSBzZXJ2aWNlcy4KLQkodDFfc2VydmljZXMpOiBOZXcgc2VydmljZXMgbGlzdC4KLQkoR2V0X0ludGVyZmFjZSk6IFVzZSBgZnRfc2VydmljZV9saXN0X2xvb2t1cCcuCi0KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYzogSW5jbHVkZSBGVF9TRVJWSUNFX1hGUkVFODZfTkFNRV9ILAotCUZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ILCBhbmQgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSC4KLQkodDQyX3NlcnZpY2VfZ2x5cGhfZGljdCwgdDQyX3NlcnZpY2VfcHNfbmFtZSk6IE5ldyBzdHJ1Y3R1cmVzCi0JcHJvdmlkaW5nIFR5cGUgNDIgc2VydmljZXMuCi0JKHQ0Ml9zZXJ2aWNlcyk6IE5ldyBzZXJ2aWNlcyBsaXN0LgotCShUNDJfR2V0X0ludGVyZmFjZSk6IFVzZSBgZnRfc2VydmljZV9saXN0X2xvb2t1cCcuCi0KLQotCSogUkVBRE1FLCBkb2NzL0NIQU5HRVM6IFVwZGF0aW5nIHZlcnNpb24gbnVtYmVycyBmb3IgMi4xLjYsIGFuZAotCXJlbW92aW5nIG9ic29sZXRlIHdhcm5pbmdzIGluIHRoZSBkb2N1bWVudGF0aW9uLgotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byA2LgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gOTo1OjMuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y29yZS5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRleGNlcHQuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0aGFzaC5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmplY3QuaDogUmVtb3ZlZC4gIE9ic29sZXRlLgotCi0yMDAzLTA5LTA5ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlGaXhpbmcgUEZSIGtlcm5pbmcgc3VwcG9ydC4gIFRoZSB0YWJsZXMgd2l0aGluIHRoZSBmb250IGZpbGUgY29udGFpbgotCShjaGFyY29kZSxjaGFyY29kZSkga2VybmluZyBwYWlycywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZW0gdG8KLQkoZ2luZGV4LGdpbmRleCkuCi0KLQkqIHNyYy9iYXNlL2Z0cGZyLmMgKGZ0X3Bmcl9jaGVjayk6IEZpeCBzZXJpb3VzIHR5cG8uCi0JKiBzcmMvcGZyL3BmcmxvYWQuYzogUmVtb3ZlIGRlYWQgY29kZS4KLQkocGZyX2dldF9naW5kZXgsIHBmcl9jb21wYXJlX2tlcm5fcGFpcnMsIHBmcl9zb3J0X2tlcm5pbmdfcGFpcnMpOgotCU5ldyBmdW5jdGlvbnMuCi0JKHBmcl9waHlfZm9udF9kb25lKTogRnJlZSBga2Vybl9wYWlycycuCi0JKHBmcl9waHlfZm9udF9sb2FkKTogQ2FsbCBgcGZyX3NvcnRfa2VybmluZ19wYWlycycuCi0JKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfZ2V0X2tlcm5pbmcpOiBGaXgga2VybmluZyBleHRyYWN0aW9uLgotCSogc3JjL3Bmci9wZnJ0eXBlcy5oIChQRlJfS0VSTl9QQUlSX0lOREVYKTogTmV3IG1hY3JvLgotCShQRlJfS2VyblBhaXJSZWMpOiBNYWtlIGBrZXJuaW5nJyBhbiBGVF9JbnQuCi0JKFBGUl9QaHlGb250UmVjKTogTmV3IGVsZW1lbnQgYGtlcm5fcGFpcnMnLgotCShQRlJfS2VybkZsYWdzKTogVmFsdWVzIG9mIFBGUl9LRVJOXzJCWVRFX0NIQVIgYW5kCi0JUEZSX0tFUk5fMkJZVEVfQURKIHdlcmUgZXJyb25lb3VzbHkgcmV2ZXJzZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRvcHRpb24uaDogQ29tbWVudGluZyBvdXQgdGhlIG1hY3JvCi0JVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUi4KLQotMjAwMy0wOS0wMiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4xLjUgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLTIwMDMtMDgtMzEgIE1hbmlzaCBTaW5naCAgPHlvc2hAZ2ltcC5vcmc+Ci0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcmVhZHN0cmVhbSk6IERvbid0IHVzZSBGVF9NRU1fQ09QWSBidXQKLQlGVF9NRU1fTU9WRS4KLQotMjAwMy0wOC0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0VOQ09ESU5HX1NKSVMsIEZUX0VOQ09ESU5HX0dCMjMxMiwKLQlGVF9FTkNPRElOR19CSUc1LCBGVF9FTkNPRElOR19XQU5TVU5HLCBGVF9FTkNPRElOR19KT0hBQik6IE5ldwotCWVudW1lcmF0aW9ucyBvZiBGVF9FbmNvZGluZy4gIFRoZSBGVF9FTkNPRElOR19NU18qIHZhcmlhbnRzIGV4Y2VwdAotCUZUX0VOQ09ESU5HX01TX1NZTUJPTCBhcmUgbm93IGRlcHJlY2F0ZWQuCi0JVXBkYXRlZCBhbGwgdXNlcnMuCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IGl0LgotCi0yMDAzLTA4LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IEFjY2VwdCBsb3dlcmNhc2UgY2hhcmFjdGVycwotCWZvciBzcGFjaW5nLgotCi0yMDAzLTA4LTI3ICBNaWtlIEZBQklBTiAgPG1mYWJpYW5Ac3VzZS5kZT4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9sb2FkX2ZvbnQpLCBzcmMvYmRmL2JkZmRyaXZyLmMKLQkoQkRGX0ZhY2VfSW5pdCk6IEFjY2VwdCBsb3dlcmNhc2UgY2hhcmFjdGVycyBmb3Igc2xhbnQgYW5kIHdlaWdodC4KLQotMjAwMy0wOC0xOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oOiBEaXNhYmxpbmcgVHJ1ZVR5cGUgYnl0ZWNvZGUKLQlpbnRlcnByZXRlciB1bnRpbCB0aGUgVU5QQVRFTlRFRF9ISU5USU5HIHdvcmtzIGFzIGFkdmVydGlzZWQuCi0KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfaGludGVyX2xvYWRfZ2x5cGgpOiBVc2UgYHwnIGZvcgotCXNldHRpbmcgYGxvYWRfZmxhZ3MnLgotCi0JKiBKYW1maWxlOiBBZGRpbmcgdGhlIGByZWZkb2MnIHRhcmdldCB0byB0aGUgSmFtZmlsZSBpbiBvcmRlciB0bwotCWJ1aWxkIHRoZSBBUEkgUmVmZXJlbmNlIGluIGBkb2NzL3JlZmVyZW5jZScgYXV0b21hdGljYWxseS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oIChQU19Gb250SW5mb1JlYyksIHNyYy9jaWQvY2lkdG9rZW4uaCwKLQlzcmMvdHlwZTEvdDF0b2tlbnMuaCwgc3JjL3R5cGU0Mi90NDJwYXJzZS5jOiBSZXNldHRpbmcgdGhlIHR5cGVzIG9mCi0JYGl0YWxpY19hbmdsZScsIGB1bmRlcmxpbmVfcG9zaXRpb24nLCBhbmQgYHVuZGVybGluZV90aGlja25lc3MnIHRvCi0JdGhlaXIgcHJldmlvdXMgdmFsdWVzIChpLmUuLCBsb25nLCBzaG9ydCwgYW5kIHVzaG9ydCkgaW4gb3JkZXIgdG8KLQlhdm9pZCBicmVha2luZyBiaW5hcnkgY29tcGF0aWJpbGl0eS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHVucGF0Lmg6IEZpeGluZyBkb2N1bWVudGF0aW9uIGNvbW1lbnQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgsIGRldmVsL2Z0b3B0aW9uLmgKLQkoVFRfQ09ORklHX09QVElPTl9DT01QSUxFX1VOUEFURU5URURfSElOVElORyk6IFJlcGxhY2VkIHdpdGguLi4KLQkoVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcpOiBUaGlzLiAgVXBkYXRlZCBhbGwgdXNlcnMuCi0JKFRUX0NPTkZJR19PUFRJT05fRk9SQ0VfVU5QQVRFTlRFRF9ISU5USU5HKTogUmVtb3ZlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfREVCVUdfSE9PS19UWVBFMSk6IFJlbW92ZWQuCi0JKEZUX0RFQlVHX0hPT0tfVU5QQVRFTlRFRF9ISU5USU5HKTogTmV3IG1hY3JvLiAgVXNlIHRoaXMgd2l0aAotCWBGVF9TZXRfRGVidWdfSG9vaycgdG8gZ2V0IHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgcmVtb3ZlZAotCVRUX0NPTkZJR19PUFRJT05fRk9SQ0VfVU5QQVRFTlRFRF9ISU5USU5HLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2ZhY2VfaW5pdCk6IFVzZQotCWBGVF9ERUJVR19IT09LX1VOUEFURU5URURfSElOVElORycuCi0KLTIwMDMtMDgtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfTG9hZF9HbHlwaCksIHNyYy9jZmYvY2ZmZ2xvYWQuYwotCShjZmZfc2xvdF9sb2FkKSwgc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfc2xvdF9sb2FkX2dseXBoKTogRml4Ci0JcHJldmlvdXMgY2hhbmdlLgotCi0yMDAzLTA4LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX0xvYWRfR2x5cGgpLCBzcmMvY2ZmL2NmZmdsb2FkLmMKLQkoY2ZmX3Nsb3RfbG9hZCksIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX3Nsb3RfbG9hZF9nbHlwaCk6IEFwcGx5Ci0JZm9udCBtYXRyaXggdG8gYWR2YW5jZSB3aWR0aCBhbHNvLgotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDAzLTA3LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5hYyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDk6NDozLgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlOiBVcGRhdGVkLgotCSogZG9jcy9DSEFOR0VTLCBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0dseXBoU2xvdCk6IENoYW5nZSAyMDAzLTA2LTE2Ci0JYWxzbyBicmVha3MgYmluYXJ5IGNvbXBhdGliaWxpdHkuICBSZWludHJvZHVjZSBhbiB1bnNpZ25lZCBpbnRlZ2VyCi0JYXQgdGhlIG9sZCBwb3NpdGlvbiBvZiBgZmxhZ3MnIGNhbGxlZCBgcmVzZXJ2ZWQnLgotCi0yMDAzLTA3LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNYWtlIEFQSSByZWZlcmVuY2UgdmFsaWQgSFRNTCA0LjAxIHRyYW5zaXRpb25hbC4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAoaHRtbF9oZWFkZXJfMSk6IEFkZCBkb2N0eXBlCi0JYW5kIGNoYXJzZXQuCi0JKGh0bWxfaGVhZGVyXzIpOiBGaXggc3R5bGUgZWxlbWVudHMgYW5kIGFkZCBzb21lIG1vcmUuCi0JRml4IHN5bnRheC4KLQkoYmxvY2tfaGVhZGVyLCBibG9ja19mb290ZXIsIGRlc2NyaXB0aW9uX2hlYWRlciwgZGVzY3JpcHRpb25fZm9vdGVyLAotCW1hcmtlcl9oZWFkZXIsIG1hcmtlcl9mb290ZXIsIHNvdXJjZV9oZWFkZXIsIHNvdXJjZV9mb290ZXIsCi0JY2hhcHRlcl9oZWFkZXIpOiBEb24ndCB1c2UgPGNlbnRlcj4uLi48L2NlbnRlcj4gYnV0IGBhbGlnbj1jZW50ZXInCi0JdGFibGUgYXR0cmlidXRlLgotCShjaGFwdGVyX2ludGVyLCBjaGFwdGVyX2Zvb3Rlcik6IEFkZCA8bGk+IGFuZCB1c2Ugc3BlY2lhbCA8dWw+Ci0JY2xhc3MuCi0JVXNlIGRvdWJsZSBxdW90ZXMgYXJvdW5kIHRhYmxlIHdpZHRocyBnaXZlbiBpbiBwZXJjZW50LgotCShrZXl3b3JkX3ByZWZpeCwga2V5d29yZF9zdWZmaXgpOiBEb24ndCBjaGFuZ2UgZm9udCBjb2xvdXIgZGlyZWN0bHkKLQlidXQgdXNlIGEgbmV3IDxzcGFuPiBjbGFzcy4KLQkoc2VjdGlvbl9zeW5vcHNpc19oZWFkZXIsIHNlY3Rpb25fc3lub3BzaXNfZm9vdGVyKTogRG9uJ3QgY2hhbmdlCi0JY29sb3VyLgotCShjb2RlX2hlYWRlciwgY29kZV9mb290ZXIpOiBEb24ndCBjaGFuZ2UgZm9udCBjb2xvdXIgZGlyZWN0bHkgYnV0Ci0JdXNlIGEgc3BlY2lhbCA8cHJlPiBjbGFzcy4KLQkocHJpbnRfaHRtbF9maWVsZCk6IDx0cj4gZ2V0cyB0aGUgYHZhbGlnbicgYXR0cmlidXRlLCBub3QgPHRhYmxlPi4KLQkocHJpbnRfaHRtbF9maWVsZF9saXN0KTogRGl0dG8uCi0JKGluZGV4X2V4aXQpOiBEb24ndCB1c2UgPGNlbnRlcj4uLi48L2NlbnRlcj4gYnV0IGBhbGlnbj1jZW50ZXInCi0JdGFibGUgYXR0cmlidXRlLgotCShzZWN0aW9uX2VudGVyKTogRGl0dG8uCi0JKHRvY19leGl0KTogRG9uJ3QgZW1pdCA8L3RhYmxlPi4KLQkoYmxvY2tfZW50ZXIpOiBVc2UgPGg0PjxhPiwgbm90IDxhPjxoND4uCi0JKF9faW5pdF9fKTogRml4IHRhZyBvcmRlciBpbiBzZWxmLmh0bWxfZm9vdGVyLgotCi0yMDAzLTA3LTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlUaGlzIGNoYW5nZSByZWltcGxlbWVudHMgZml4IGZyb20gMjAwMy0wNS0zMCB3aXRob3V0IGJyZWFraW5nCi0JYmluYXJ5IGNvbXBhdGliaWxpdHkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCAoUFNfRm9udEluZm9SZWMpOiBgaXRhbGljX2FuZ2xlJywKLQlgaXNfZml4ZWRfcGl0Y2gnLCBgdW5kZXJsaW5lX3Bvc2l0aW9uJywgYHVuZGVybGluZV90aGlja25lc3MnIGFyZQotCXJldmVydGVkIHRvIGJlIG5vcm1hbCB2YWx1ZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoVDFfRmllbGRUeXBlKTogUmVtb3ZlCi0JYFQxX0ZJRUxEX1RZUEVfQk9PTF9QJywgYFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9QJywKLQlgVDFfRklFTERfVFlQRV9GSVhFRF9QJywgYFQxX0ZJRUxEX1RZUEVfRklYRURfMTAwMF9QJy4KLQkoVDFfRklFTERfVFlQRV9CT09MX1AsIFQxX0ZJRUxEX05VTV9QLCBUMV9GSUVMRF9GSVhFRF9QLAotCVQxX0ZJRUxEX0ZJWEVEXzEwMDBfUCk6IFJlbW92ZWQuCi0JKFQxX0ZJRUxEX1RZUEVfQk9PTCk6IFJlbmFtZWQgdG8uLi4KLQkoVDFfRklFTERfQk9PTCk6IE5ldyBtYWNyby4gIFVwZGF0ZWQgYWxsIGNhbGxlcnMuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYzogYGl0YWxpY19hbmdsZScsIGBpc19maXhlZF9waXRjaCcsCi0JYHVuZGVybGluZV9wb3NpdGlvbicsIGB1bmRlcmxpbmVfdGhpY2tuZXNzJywgYHBhaW50X3R5cGUnLAotCWBzdHJva2Vfd2lkdGgnIGFyZSByZXZlcnRlZCB0byBiZSBub3JtYWwgdmFsdWVzLgotCShUNDJfS0VZV09SRF9DT1VOVCk6IE5ldyBtYWNyby4KLQkodDQyX3BhcnNlX2RpY3QpOiBOZXcgYXJyYXkgYGtleXdvcmRfZmxhZ3MnIHRvIG1hcmsgdGhhdCBhIHZhbHVlIGhhcwotCWFscmVhZHkgYmVlbiBhc3NpZ25lZCB0byBhIGRpY3Rpb25hcnkgZW50cnkuCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCwgVDQyX0ZhY2VfRG9uZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jaWQvY2lkdG9rZW4uaDogYGl0YWxpY19hbmdsZScsIGBpc19maXhlZF9waXRjaCcsCi0JYHVuZGVybGluZV9wb3NpdGlvbicsIGB1bmRlcmxpbmVfdGhpY2tuZXNzJyBhcmUgcmV2ZXJ0ZWQgdG8gYmUKLQlub3JtYWwgdmFsdWVzLgotCSogc3JjL2NpZC9jaWRvYmpzLmMgKGNpZF9mYWNlX2RvbmUsIGNpZF9mYWNlX2luaXQpOiBVcGRhdGVkLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX3BhcnNlcl9sb2FkX2ZpZWxkKTogVXBkYXRlZC4KLQotCSogc3JjL3R5cGUxL3QxdG9rZW5zLmg6IGBpdGFsaWNfYW5nbGUnLCBgaXNfZml4ZWRfcGl0Y2gnLAotCWB1bmRlcmxpbmVfcG9zaXRpb24nLCBgdW5kZXJsaW5lX3RoaWNrbmVzcycsIGBwYWludF90eXBlJywKLQlgc3Ryb2tlX3dpZHRoJyBhcmUgcmV2ZXJ0ZWQgdG8gYmUgbm9ybWFsIHZhbHVlcy4KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Eb25lLCBUMV9GYWNlX0luaXQpOiBVcGRhdGVkLgotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9GSUVMRF9DT1VOVCk6IE5ldyBtYWNyby4KLQkocGFyc2VfZGljdCk6IEFkZCBwYXJhbWV0ZXIgZm9yIGtleXdvcmQgZmxhZ3MuCi0JUmVjb3JkIG9ubHkgZmlyc3QgaW5zdGFuY2Ugb2YgYSBmaWVsZC4KLQkoVDFfT3Blbl9GYWNlKTogTmV3IGFycmF5IGBrZXl3b3JkX2ZsYWdzJy4KLQotMjAwMy0wNy0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDUuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWMgKHZlcnNpb25faW5mbyk6IFNldCB0byAxMDowOjMuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFVwZGF0ZWQuCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKHJlZmRvYyk6IEZpeCAtLXRpdGxlLgotCi0JKiBkb2NzL0NIQU5HRVMsIGRvY3MvVkVSU0lPTi5ETEwsIFJFQURNRTogVXBkYXRlZC4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3NvdXJjZXMucHkgKHJlX2Nyb3NzcmVmKTogRml4IHJlZ3VsYXIKLQlleHByZXNzaW9uIHRvIGhhbmRsZSB0cmFpbGluZyBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLgotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAobWFrZV9odG1sX3dvcmQpOiBVcGRhdGVkLgotCi0JKiBkb2NzL3JlbGVhc2U6IE5ldyBmaWxlLgotCi0yMDAzLTA3LTIzICBZQU1BTk8tVUNISSBIaWRldG9zaGkgIDxtZXJAZGluLm9yLmpwPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFBTX1BhcnNlcl9GdW5jc1JlYyk6IE5ldwotCW1lbWJlciBmdW5jdGlvbiBgdG9fYnl0ZXMnLgotCi0JKiBzcmMvcHNhdXgvcHNhdXhtb2QuYyAocHNfcGFyc2VyX2Z1bmNzKTogTmV3IG1lbWJlcgotCWBwc19wYXJzZXJfdG9fYnl0ZXMnLgotCShwc2F1eF9tb2R1bGVfY2xhc3MpOiBJbmNyZWFzZSB2ZXJzaW9uIHRvIDB4MjAwMDBMLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKElTX1QxX0xJTkVTUEFDRSk6IEFkZCBcZi4KLQkoSVNfVDFfTlVMTFNQQUNFKTogTmV3IG1hY3JvLgotCShJU19UMV9TUEFDRSk6IEFkZCBpdC4KLQkoc2tpcF9zcGFjZXMsIHNraXBfYWxwaGEpOiBOZXcgZnVuY3Rpb25zLgotCShwc19wYXJzZXJfc2tpcF9zcGFjZXMsIHBzX3BhcnNlcl9za2lwX2FscGhhKTogVXNlIHRoZW0uCi0JKHBzX3RvYnl0ZXMsIHBzX3BhcnNlcl90b19ieXRlcyk6IE5ldyBmdW5jdGlvbnMuCi0KLTIwMDMtMDctMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChET0NfRElSKTogTmV3IHZhcmlhYmxlLgotCShyZWZkb2MpOiBVc2UgKl9ESVIgdmFyaWFibGVzLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgZG9jdW1lbnRhdGlvbiBmaWxlcy4KLQotCSogYnVpbGRzL2RldGVjdC5tayAoc3RkX3NldHVwLCBkb3Nfc2V0dXApOiBNZW50aW9uIGBtYWtlIHJlZmRvYycuCi0KLQkqIGNvbmZpZ3VyZTogU2V0IERPQ19ESVIgdmFyaWFibGUuCi0KLTIwMDMtMDctMDcgIFBhdHJpayBIw6RnZ2x1bmQgIDxwYXRyaWsuaGFnZ2x1bmRAYnJlZGJhbmQubmV0PgotCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKHJlZmRvYyk6IE5ldyB0YXJnZXQgdG8gYnVpbGQgdGhlCi0JZG9jdW1lbnRhdGlvbi4KLQkoLlBIT05ZKTogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb2YgRlRfQ2hhck1hcC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZSxoOiBGaXggZG9jdW1lbnRhdGlvbiBvZiBGVF9PVVRMSU5FX0ZMQUdTLgotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oOiBEb2N1bWVudCBGVF9TZm50X1RhZy4KLQotMjAwMy0wNy0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9GYWNlX0luaXQpLCBzcmMvcGNmL3BjZnJlYWQuYwotCShwY2ZfbG9hZF9mb250KTogRml4IGNvbXB1dGF0aW9uIG9mIGhlaWdodCBpZiBQSVhFTF9TSVpFIHByb3BlcnR5IGlzCi0JbWlzc2luZy4KLQotMjAwMy0wNy0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3NiaXRfbm9kZV9jb21wYXJlKTogT25seSBhZGQgYHNpemUnIGlmCi0JdGhlcmUgaXMgbm8gZXJyb3IuICBSZXBvcnRlZCBieSBLbnV0IFN0LiBPc211bmRzZW4KLQk8YmlyZC1mcmVldHlwZUBhbmR1aW4ubmV0Pi4KLQotMjAwMy0wNi0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQSBuZXcgdHJ5IHRvIHN5bmNocm9uaXplIGJpdG1hcCBmb250IGFjY2Vzcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9CaXRtYXBfU2l6ZSk6IGBoZWlnaHQnIGlzIG5vdwotCWRlZmluZWQgdG8gcmV0dXJuIHRoZSBiYXNlbGluZS10by1iYXNlbGluZSBkaXN0YW5jZS4gIFRoaXMgd2FzCi0JYWxyZWFkeSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIEJERiBhbmQgUENGIGRyaXZlcnMuCi0KLQlUaGUgYHdpZHRoJyBmaWVsZCBub3cgZ2l2ZXMgdGhlIGF2ZXJhZ2Ugd2lkdGguICBJIHdhc24ndCBhYmxlIHRvCi0JZmluZCBzb21ldGhpbmcgYmV0dGVyLiAgSXQgc2hvdWxkIGJlIHRha2VuIGFzIGluZm9ybWF0aXZlIG9ubHkuCi0KLQlOZXcgZmllbGRzIGBzaXplJywgYHhfcHBlbScsIGFuZCBgeV9wcGVtJy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9sb2FkX2ZvbnQpOiBVcGRhdGVkIHRvIHByb3Blcmx5IGZpbGwKLQlGVF9CaXRtYXBfU2l6ZS4KLQlEbyBwcm9wZXIgcm91bmRpbmcgYW5kIGNvbnZlcnNpb24gZnJvbSA3Mi4yNyB0byA3MiBwb2ludHMuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IFVwZGF0ZWQgdG8gcHJvcGVybHkgZmlsbAotCUZUX0JpdG1hcF9TaXplLgotCURvIHByb3BlciByb3VuZGluZyBhbmQgY29udmVyc2lvbiBmcm9tIDcyLjI3IHRvIDcyIHBvaW50cy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogVXBkYXRlZCB0byBwcm9wZXJseSBmaWxsCi0JRlRfQml0bWFwX1NpemUuCi0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoRk5UX0ZhY2VfSW5pdCk6IFVwZGF0ZWQgdG8gcHJvcGVybHkgZmlsbAotCUZUX0JpdG1hcF9TaXplLgotCi0yMDAzLTA2LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZWRlc2lnbmluZyB0aGUgRk5UIGRyaXZlciB0byByZXR1cm4gbXVsdGlwbGUgZmFjZXMsIG5vdCBtdWx0aXBsZQotCXN0cmlrZXMuICBBdCBsZWFzdCBvbmUgZm9udCAoYXBwODUwLmZvbiBmcm9tIFdpbk1FKSBjb250YWlucwotCWRpZmZlcmVudCBGTlQgY2hhcm1hcHMgZm9yIGl0cyBzdWJmb250cy4gIENvbnNlcXVlbnRseSwgdGhlIHByZXZpb3VzCi0JZGVzaWduIG9mIGhhdmluZyBtdWx0aXBsZSBiaXRtYXAgc3RyaWtlcyBpbiBhIHNpbmdsZSBmb250IGZhY2UgZmFpbHMKLQlzaW5jZSB3ZSBoYXZlIG9ubHkgb25lIGNoYXJtYXAgcGVyIGZhY2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZm50dHlwZXMuaCAoRk5UX1NpemVfUmVjKTogUmVtb3ZlZC4KLQkoRk5UX0ZhY2VSZWMpOiBSZW1vdmUgYG51bV9mb250cycgZmllbGQgYW5kIHJlcGxhY2UgYGZvbnRzJyB3aXRoCi0JYGZvbnQnLgotCi0JKiBzcmMvYmFzZS9mdHdpbmZudC5jIChGVF9HZXRfV2luRk5UX0hlYWRlcik6IFVwZGF0ZWQuCi0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2ZvbnRfbG9hZCk6IERvbid0IHNldCBwaXhlbF93aWR0aCBlcXVhbAotCXRvIHBpeGVsX2hlaWdodC4KLQkoZm50X2ZhY2VfZG9uZV9mb250cyk6IFJlbW92ZWQuCi0JKGZudF9mYWNlX2dldF9kbGxfZm9udHMpOiBSZW5hbWVkIHRvLi4uCi0JKGZudF9mYWNlX2dldF9kbGxfZm9udCk6IFRoaXMuICBBZGQgc2Vjb25kIGZ1bmN0aW9uIGFyZ3VtZW50IHRvCi0Jc2VsZWN0IGZhY2UgaW5kZXguCi0JVXBkYXRlZCB0byBsb2FkIGp1c3Qgb25lIHN1YmZvbnQuCi0JKGZudF9mb250X2RvbmUsIEZOVF9GYWNlX0RvbmUpOiBVcGRhdGVkLgotCShGTlRfRmFjZV9Jbml0KTogSGFuZGxlIGBmYWNlX2luZGV4Jy4KLQlVcGRhdGVkLgotCShGTlRfU2l6ZV9TZXRfUGl4ZWxzKTogU2ltcGxpZmllZDsgc2ltaWxhciB0byBCREYgYW5kIFBDRiwgdGhlCi0JYml0bWFwIHdpZHRoIGlzIG5vdyBpZ25vcmVkLgotCShGTlRfTG9hZF9HbHlwaCk6IFVwZGF0ZWQuCi0JRml4IGdseXBoIGluZGV4IGNvbXB1dGF0aW9uLgotCSh3aW5mbnRfZHJpdmVyX2NsYXNzKTogVXBkYXRlZC4KLQotMjAwMy0wNi0yNSAgT3dlbiBUYXlsb3IgIDxvdGF5bG9yQHJlZGhhdC5jb20+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfaGRteCk6IERvbid0IGFzc2lnbgotCW51bV9yZWNvcmRzIHVudGlsIHdlIGFjdHVhbGx5IGRlY2lkZSB0byBsb2FkIHRoZSB0YWJsZSwKLQlvdGhlcndpc2UsIHdlJ2xsIHNlZ2ZhdWx0IGluIHR0X2ZhY2VfZnJlZV9oZG14LgotCi0yMDAzLTA2LTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9nbHlwaF9uYW1lKTogUHJvdGVjdCBhZ2FpbnN0IHplcm8KLQlnbHlwaCBuYW1lIHBvaW50ZXIuICBSZXBvcnRlZCBieSBNaWtleSBBbmJhcnkgPG1hbmJhcnlAdml6cnQuY29tPi4KLQotMjAwMy0wNi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdG9vbHMvZ2xuYW1lcy5weTogVXBkYXRlZCB0byBBR0wgMi4wLgotCSogc3JjL3BzbmFtZXMvcHN0YWJsZXMuaDogUmVnZW5lcmF0ZWQuCi0KLTIwMDMtMDYtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNnbHlwaC5oLCBpbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmgsCi0Jc3JjL2Jhc2UvZnRjYWxjLmMsIHNyYy9iYXNlL2Z0dHJpZ29uLmMsIHNyYy9jZmYvY2ZmZ2xvYWQuYywKLQlzcmMvb3RsYXlvdXQvb3RsZ3N1Yi5jLCBzcmMvcHNoaW50ZXIvcHNocmVjLmMsCi0Jc3JjL3BzbmFtZXMvcHNtb2R1bGUuYywgc3JjL3NmbnQvc2ZvYmpzLmMsIHNyYy90cnVldHlwZS90dGRyaXZlci5jOgotCURlY29yYXRlIGNvbnN0YW50cyB3aXRoIGBVJyBhbmQgYEwnIGlmIGFwcHJvcHJpYXRlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyLmg6IFVwZGF0ZWQgdG8gaW5jbHVkZSByZWNlbnQgbW9kdWxlCi0JYWRkaXRpb25zLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNobnRlcnIuaCAoRlRfRVJSX0JBU0UpOiBEZWZpbmUgYXMKLQlgRlRfTW9kX0Vycl9QU2hpbnRlcicuCi0JKiBzcmMvdHlwZTQyL3Q0MmVycm9yLmggKEZUX0VSUl9CQVNFKTogRGVmaW5lIGFzCi0JYEZUX01vZF9FcnJfVHlwZTQyJy4KLQotCSogc3JjL3BzaGludGVyL3BzaHJlYy5oIChQU19ISU5UU19NQUdJQyk6IFJlbW92ZWQuICBOb3QgdXNlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCBbX19NV0VSS1NfX106IERlZmluZSBGVF9MT05HNjQKLQlhbmQgRlRfSU5UNjQuCi0KLTIwMDMtMDYtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfTG9hZF9HbHlwaCk6IFVzZSBmaXJzdF9jaGFyIGluCi0JY29tcHV0YXRpb24gb2YgZ2x5cGhfaW5kZXguCi0JKEZOVF9TaXplX1NldF9QaXhlbHMpOiBUbyBmaW5kIGEgc3RyaWtlLCBmaXJzdCBjaGVjayBwaXhlbF9oZWlnaHQKLQlvbmx5LCB0aGVuIHRyeSB0byBmaW5kIGEgYmV0dGVyIGhpdCBieSBjb21wYXJpbmcgcGl4ZWxfd2lkdGggYWxzby4KLQlXaXRob3V0IHRoaXMgZml4IGl0IGlzbid0IHBvc3NpYmxlIHRvIGFjY2VzcyBhbGwgc3RyaWtlcy4KLQlBbHNvIGNvbXB1dGUgbWV0cmljcy5tYXhfYWR2YW5jZSB0byBiZSBpbiBzeW5jIHdpdGggb3RoZXIgYml0bWFwCi0JZHJpdmVycy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1NldF9DaGFyX1NpemUpOiBSZW1vdmUgcmVkdW5kYW50IGNvZGUuCi0JKEZUX1NldF9QaXhlbF9TaXplcyk6IEFzc2lnbiB2YWx1ZSB0byBgbWV0cmljcycgYWZ0ZXIgdmFsaWRhdGlvbiBvZgotCWFyZ3VtZW50cy4KLQotMjAwMy0wNi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JU3luY2hyb25pemUgY29tcHV0YXRpb24gb2YgaGVpZ2h0IGFuZCB3aWR0aCBmb3IgYml0bWFwIHN0cmlrZXMuICBUaGUKLQlgd2lkdGgnIGZpZWxkIGluIHRoZSBGVF9CaXRtYXBfU2l6ZSBzdHJ1Y3R1cmUgaXMgbm93IG9ubHkgdXNlZnVsIHRvCi0JZW51bWVyYXRlIGRpZmZlcmVudCBzdHJpa2VzLiAgVGhlIGBtYXhfYWR2YW5jZScgZmllbGQgb2YgdGhlCi0JRlRfU2l6ZV9NZXRyaWNzIHN0cnVjdHVyZSBzaG91bGQgYmUgdXNlZCB0byBnZXQgdGhlIChtYXhpbXVtKSB3aWR0aAotCW9mIGEgc3RyaWtlLgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9GYWNlX0luaXQpOiBEb24ndCB1c2UgQVZFUkFHRV9XSURUSCBmb3IKLQljb21wdXRpbmcgYGF2YWlsYWJsZV9zaXplcy0+d2lkdGgnIGJ1dCBtYWtlIGl0IGFsd2F5cyBlcXVhbCB0bwotCWBhdmFpbGFibGVfc2l6ZXMtPmhlaWdodCcuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfbG9hZF9mb250KTogRG9uJ3QgdXNlIFJFU09MVVRJT05fWCBmb3IKLQljb21wdXRpbmcgYGF2YWlsYWJsZV9zaXplcy0+d2lkdGgnIGJ1dCBtYWtlIGl0IGFsd2F5cyBlcXVhbCB0bwotCWBhdmFpbGFibGVfc2l6ZXMtPmhlaWdodCcuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jIChTZXRfUGl4ZWxfU2l6ZXMpOiBQYXNzIG9ubHkgc2luZ2xlCi0JYXJndW1lbnQgdG8gZnVuY3Rpb24uCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKHBzX3VuaWNvZGVfdmFsdWUpOiBIYW5kbGUgYC4nIGFmdGVyCi0JYHVuaVhYWFgnIGFuZCBgdVhYWFhbWFtYXV0nLgotCi0yMDAzLTA2LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYzogcy9GVF9FcnJfL0JERl9FcnIvLgotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMsIHNyYy9jYWNoZS9mdGNzYml0cy5jLCBzcmMvY2FjaGUvZnRscnUuYzoKLQlzL0ZUX0Vycl8vRlRDX0Vycl8vLgotCSogc3JjL2NmZi9jZmZjbWFwLmM6IHMvRlRfRXJyXy9DRkZfRXJyXy8uCi0JKiBzcmMvcGNmL3BjZmRyaXZyLmM6IHMvRlRfRXJyXy9QQ0ZfRXJyXy8uCi0JKiBzcmMvcHNhdXgvdDFjbWFwLmM6IEluY2x1ZGUgcHNhdXhlcnIuaC4KLQlzL0ZUX0Vycl8vUFNhdXhfRXJyXy8uCi0JKiBzcmMvcHNoaW50ZXIvcHNobnRlcnIuaDogTmV3IGZpbGUuCi0JKiBzcmMvcHNoaW50ZXIvcnVsZXMubWs6IFVwZGF0ZWQuCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jLCBzcmMvcHNoaW50ZXIvcHNocmVjLmM6IEluY2x1ZGUgcHNobnRlcnIuaC4KLQlzL0ZUX0Vycl8vUFNIX0Vycl8vLgotCSogc3JjL3Bmci9wZnJkcml2ci5jLCBzcmMvcGZyL3Bmcm9ianMuYywgc3JjL3Bmci9wZnJzYml0LmM6Ci0Jcy9GVF9FcnJfL1BGUl9FcnJfLy4KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMsIHNyYy9zZm50L3Nmb2Jqcy5jLCBzcmMvc2ZudC90dGNtYXAwLmMsCi0Jc3JjL3NmbnQvdHRsb2FkLmM6IHMvRlRfRXJyXy9TRk5UX0Vycl8vLgotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYzogcy9GVF9FcnJfL1RUX0Vycl8vLgotCSogc3JjL2d6aXAvZnRnemlwLmM6IExvYWQgRlRfTU9EVUxFX0VSUk9SU19IIGFuZCBkZWZpbmUKLQlGVF9FUlJfUFJFRklYIGFuZCBGVF9FUlJfQkFTRS4KLQlzL0ZUX0Vycl8vR3ppcF9FcnJfLy4KLQotMjAwMy0wNi0xOSAgRGlyY2sgQmxhc2tleSAgPGxpc3R0YXJnZXRAZGFuYmFsYS5jb20+Ci0KLQkqIHNyYy9jZmYvY2ZmbG9hZCAoY2ZmX2VuY29kaW5nX2xvYWQpOiBgbmxlZnQnIG11c3QgYmUgRlRfVUludCwKLQlvdGhlcndpc2UgYWRkaW5nIDEgbWlnaHQgd3JhcCB0aGUgcmVzdWx0LgotCi0yMDAzLTA2LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKHBzX3VuaWNvZGVfdmFsdWUpOiBBZGQgc3VwcG9ydCB0bwotCXJlY29nbml6ZSBgdVhYWFhbWFtYXV0nIGdseXBoIG5hbWVzLgotCURvbid0IGhhbmRsZSBnbHlwaCBuYW1lcyBzdGFydGluZyB3aXRoIGB1bmknIHdoaWNoIGhhdmUgbW9yZSB0aGFuCi0JZm91ciBkaWdpdHMuCi0KLTIwMDMtMDYtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9PcGVuX0ZsYWdzKTogUmVwbGFjZWQgd2l0aAotCSNkZWZpbmVzIGZvciB0aGUgY29uc3RhbnRzLgotCShGVF9PcGVuX0FyZ3MpOiBDaGFuZ2UgdHlwZSBvZiBgZmxhZ3MnIHRvIEZUX1VJbnQuCi0JKEZUX0dseXBoU2xvdCk6IE1vdmUgYGZsYWdzJyB0byBGVF9TbG90X0ludGVybmFsLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCAoRlRfT3V0bGluZV9GbGFncywgRlRfUmFzdGVyX0ZsYWcpOgotCVJlcGxhY2VkIHdpdGggI2RlZmluZXMgZm9yIHRoZSBjb25zdGFudHMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX1Nsb3RfSW50ZXJuYWwpOiBOZXcKLQlmaWVsZCBgZmxhZ3MnIChmcm9tIEZUX0dseXBoU2xvdCkuCi0JVXBkYXRlZCBhbGwgYWZmZWN0ZWQgc291cmNlIGZpbGVzLgotCShGVF9HTFlQSF9PV05fQklUTUFQKTogTmV3IG1hY3JvIChmcm9tIGZ0Z2xvYWRyLmgpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmggKEZUX0dMWVBIX09XTl9CSVRNQVApOiBNb3ZlZAotCXRvIGZ0b2Jqcy5oLgotCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX1RvX0JpdG1hcCk6IFVzZSBkdW1teQotCUZUX0dseXBoU2xvdF9JbnRlcm5hbCBvYmplY3QuCi0KLTIwMDMtMDYtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL2NvbXBpbGVyL2djYy5taywgYnVpbGRzL2NvbXBpbGVyL2djYy1kZXYubWsgKENGTEFHUyk6Ci0JQWRkIC1mbm8tc3RyaWN0LWFsaWFzaW5nIHRvIGdldCByaWQgb2YgemlsbGlvbiB3YXJuaW5ncyBmcm9tIGdjYwotCXZlcnNpb24gMy4zLgotCi0yMDAzLTA2LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRnbHlwaC5oIChmdF9nbHlwaF9iYm94X3Vuc2NhbGVkLAotCWZ0X2dseXBoX2Jib3hfc3VicGl4ZWxzLCBmdF9nbHlwaF9iYm94X2dyaWRmaXQsCi0JZnRfZ2x5cGhfYmJveF90cnVuY2F0ZSwgZnRfZ2x5cGhfYmJveF9waXhlbHMpOiBSZXBsYWNlZCB3aXRoCi0JRlRfR0xZUEhfQkJPWF9VTlNDQUxFRCwgRlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMsCi0JRlRfR0xZUEhfQkJPWF9HUklERklULCBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFLCBGVF9HTFlQSF9CQk9YX1BJWEVMUy4KLQlUaGUgbG93ZXJjYXNlIHZhcmlhbnRzIGFyZSBub3cgKGRlcHJlY2F0ZWQgYWxpYXNlcykgdG8gdGhlIHVwcGVyY2FzZQotCXZlcnNpb25zLgotCVVwZGF0ZWQgYWxsIG90aGVyIGZpbGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kdWxlLmggKGZ0X21vZHVsZV9mb250X2RyaXZlciwKLQlmdF9tb2R1bGVfcmVuZGVyZXIsIGZ0X21vZHVsZV9oaW50ZXIsIGZ0X21vZHVsZV9zdHlsZXIsCi0JZnRfbW9kdWxlX2RyaXZlcl9zY2FsYWJsZSwgZnRfbW9kdWxlX2RyaXZlcl9ub19vdXRsaW5lcywKLQlmdF9tb2R1bGVfZHJpdmVyX2hhc19oaW50ZXIpOiBSZXBsYWNlZCB3aXRoIEZUX01PRFVMRV9GT05UX0RSSVZFUiwKLQlGVF9NT0RVTEVfUkVOREVSRVIsIEZUX01PRFVMRV9ISU5URVIsIEZUX01PRFVMRV9TVFlMRVIsCi0JRlRfTU9EVUxFX0RSSVZFUl9TQ0FMQUJMRSwgRlRfTU9EVUxFX0RSSVZFUl9OT19PVVRMSU5FUywKLQlGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIuCi0JVGhlIGxvd2VyY2FzZSB2YXJpYW50cyBhcmUgbm93IChkZXByZWNhdGVkIGFsaWFzZXMpIHRvIHRoZSB1cHBlcmNhc2UKLQl2ZXJzaW9ucy4KLQlVcGRhdGVkIGFsbCBvdGhlciBmaWxlcy4KLQotCSogc3JjL2Jhc2UvZnRnbHlwaC5jIChGVF9HbHlwaF9HZXRfQ0JveCk6IEhhbmRsZSBiYm94X21vZGUgYmV0dGVyCi0JYXMgZW51bWVyYXRpb24uCi0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYyAocGNmX2RyaXZlcl9jbGFzcyksIHNyYy93aW5mb250cy93aW5mbnQuYwotCSh3aW5mbnRfZHJpdmVyX2NsYXNzKSwgc3JjL2JkZi9iZGZkcml2ci5jIChiZGZfZHJpdmVyX2NsYXNzKTogQWRkCi0JdGhlIEZUX01PRFVMRV9EUklWRVJfTk9fT1VUTElORVMgZmxhZy4KLQotMjAwMy0wNi0xMyAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfc2xvdF9sb2FkKTogQXBwbHkgZm9udCBtYXRyaXguCi0KLTIwMDMtMDYtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL2Rvcy9kZXRlY3QubWs6IFRlc3Qgbm90IG9ubHkgZm9yIGBEb3MnIGJ1dCBmb3IgYERPUycgYWxzby4KLQotCSogYnVpbGRzL2Rvcy9kb3MtZW14Lm1rLCBidWlsZHMvY29tcGlsZXIvZW14Lm1rOiBOZXcgZmlsZXMgZm9yCi0JRU1YIGdjYyBjb21waWxlci4KLQkqIGJ1aWxkcy9kb3MvZGV0ZWN0Lm1rOiBBZGQgdGFyZ2V0IGBlbXgnLgotCi0JKiBidWlsZHMvY29tcGlsZXIvd2F0Y29tLm1rIChMSU5LX0xJQlJBUlkpOiBHTlUgTWFrZSBmb3IgRE9TIGRvZXNuJ3QKLQlsaWtlIGEgdHJhaWxpbmcgc2VtaWNvbG9uOyBhZGQgYSBkdW1teSBjb21tYW5kLgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYzogUmVtb3ZlIHBhcnNlX2ZvbnRfYmJveCBjb2RlIChhbHJlYWR5IGVuY2xvc2VkCi0Jd2l0aCAjaWYgMCAuLi4gI2VuZGlmKS4KLQotCSogc3JjL3R5cGUxL3QxdG9rZW5zLmg6IEhhbmRsZSAvRm9udE5hbWUuCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2ZvbnRfbmFtZSk6IFJlbW92ZWQuCi0JUmVtb3ZlIHBhcnNlX2ZvbnRfYmJveCBjb2RlIChhbHJlYWR5IGVuY2xvc2VkIHdpdGggI2lmIDAgLi4uCi0JI2VuZGlmKS4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VfZm9udF9uYW1lKTogUmVtb3ZlZC4KLQlSZW1vdmUgdDQyX3BhcnNlX2ZvbnRfYmJveCBjb2RlIChhbHJlYWR5IGVuY2xvc2VkIHdpdGggI2lmIDAgLi4uCi0JI2VuZGlmKS4KLQkodDQyX2tleXdvcmRzKTogSGFuZGxlIC9Gb250TmFtZSB3aXRoIFQxX0ZJRUxEX0tFWS4KLQotMjAwMy0wNi0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX0ZpZWxkVHlwZSk6IEFkZAotCVQxX0ZJRUxEX1RZUEVfS0VZLgotCShUMV9GSUVMRF9LRVkpOiBOZXcgbWFjcm8uCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX3BhcnNlcl9sb2FkX2ZpZWxkKTogSGFuZGxlCi0JVDFfRklFTERfVFlQRV9LRVkuCi0KLQkqIHNyYy9jaWQvY2lkdG9rZW4uaDogVXNlIFQxX0ZJRUxEX0tFWSBmb3IgL0NJREZvbnROYW1lLgotCi0yMDAzLTA2LTExICBBbGV4YW5kZXIgTWFsbWJlcmcgIDxhbGV4YW5kZXJAbWFsbWJlcmcub3JnPgotCi0JKiBzcmMvY2FjaGUvZnRscnUuYyAoRlRfTHJ1TGlzdF9SZW1vdmVfU2VsZWN0aW9uKTogRGVjcmVhc2UKLQludW1iZXIgb2Ygbm9kZXMuCi0JKEZUX0xydUxpc3RfTG9va3VwKTogRml4IGFzc2VydGlvbiBmb3Igb3V0LW9mLW1lbW9yeSBjYXNlLgotCi0yMDAzLTA2LTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfZGVjcnlwdCk6IFJlbW92ZWQuCi0JKGNpZF9yZWFkX3N1YnJzKTogVXNlIHQxX2RlY3J5cHQgZnJvbSBwc2F1eCBtb2R1bGUuCi0JKiBzcmMvY2lkL2NpZGxvYWQuaDogVXBkYXRlZC4KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX2xvYWRfZ2x5cGgpOiBVc2UgdDFfZGVjcnlwdCBmcm9tIHBzYXV4Ci0JbW9kdWxlLgotCi0yMDAzLTA2LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkb2Jqcy5jOiBBcHBseSBjaGFuZ2UgMjAwMy0wNS0zMSBmcm9tIDxSb24uRGV2QGdteC5kZT4uCi0JQ29tcHV0ZSBzdHlsZSBmbGFncy4KLQlGaXggY29tcHV0YXRpb24gb2Ygcm9vdC0+aGVpZ2h0LgotCSogc3JjL2NpZC9jaWR0b2tlbi5oOiBIYW5kbGUgRm9udEJCb3guCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAoY2lkX2xvYWRfa2V5d29yZCk6IEhhbmRsZQotCVQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1guCi0JKHBhcnNlX2ZvbnRfYmJveCk6IENvbW1lbnRlZCBvdXQuCi0JKGNpZF9maWVsZF9yZWNvcmRzKTogQ29tbWVudCBvdXQgZWxlbWVudCBmb3IgcGFyc2luZyBGb250QkJveC4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VfZm9udF9iYm94KTogQ29tbWVudGVkIG91dC4KLQkodDQyX2tleXdvcmRzKTogSGFuZGxlIEZvbnRCQm94IHdpdGggVDFfRklFTERfQkJPWCwgbm90IHdpdGgKLQlUMV9GSUVMRF9DQUxMQkFDSy4KLQkodDQyX3BhcnNlX2ZvbnRfYmJveCk6IENvbW1lbnRlZCBvdXQuCi0JKHQ0Ml9sb2FkX2tleXdvcmQpOiBIYW5kbGUgVDFfRklFTERfTE9DQVRJT05fQkJPWC4KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KTogQXBwbHkgY2hhbmdlIDIwMDMtMDUtMzEKLQlmcm9tIDxSb24uRGV2QGdteC5kZT4uCi0KLTIwMDMtMDYtMDkgIEdlb3JnZSBXaWxsaWFtcyAgPGd3d0BzaWxjb20uY29tPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoU2V0U3VwZXJSb3VuZCkgPDB4MzA+OiBGb2xsb3cgQXBwbGUncwotCVRydWVUeXBlIHNwZWNpZmljYXRpb24uCi0JKEluc19NRFJQLCBJbnNfTUlSUCk6IEZpeCBzaW5nbGUgd2lkdGggY3V0LWluIHRlc3QuCi0KLTIwMDMtMDYtMDkgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYzogKGluZmxhdGVfbWFzayk6IFJlcGxhY2VkIHdpdGguLi4KLQkoTk9fSU5GTEFURV9NQVNLKTogVGhpcy4KLQkqIHNyYy9nemlwL2luZnV0aWwuaDogRGVjbGFyZSBgaW5mbGF0ZV9tYXNrJyBjb25kaXRpb25hbGx5IGJ5Ci0JTk9fSU5GTEFURV9NQVNLLgotCi0yMDAzLTA2LTA5ICBBbGV4aXMgUy4gTC4gQ2FydmFsaG8gIDxhbGV4aXNAY2VjbS51c3AuYnI+Ci0KLQkqIHNyYy9nemlwL2Z0Z3ppcC5jIChmdF9nemlwX2ZpbGVfZmlsbF9vdXRwdXQpOiBIYW5kbGUgWl9TVFJFQU1fRU5ECi0JY29ycmVjdGx5LgotCi0yMDAzLTA2LTA5ICBXb2xmZ2FuZyBEb21yw7ZzZSAgPHBvcnRob3MuZG9tcm9lc2VAaGFyei5kZT4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2dsb2JhbHNfbmV3KTogQ2hhbmdlIGNhbGN1bGF0aW9uIG9mCi0JZGltLT5zdGR3LmNvdW50IHRvIGF2b2lkIGNvbXBpbGVyIHByb2JsZW0uCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfU2ltcGxlX0dseXBoKTogTW92ZSB0aGUgYmxvY2sKLQl2YXJpYWJsZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24gdG8gYXZvaWQgY29tcGlsZXIKLQlwcm9ibGVtcy4KLQlBZGQgY2FzdHMgbmVjZXNzYXJ5IGZvciAxNmJpdCBjb21waWxlcnMuCi0KLTIwMDMtMDYtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Bmci9ydWxlcy5tayAoUEZSX0RSVl9TUkMpOiBBZGQgcGZyc2JpdC5jLgotCShQRlJfRFJWX0gpOiBBZGQgcGZydHlwZXMuaC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogcy9fX01XS1NfXy9fX01XRVJLU19fLy4KLQotMjAwMy0wNi0wOCAgS2FybCBTY2h1bHR6ICA8a3NjaHVsdHpAcnNpbmMuY29tPgotCi0JKiBzcmMvcGZyL3BmcnNiaXQuYyAocGZyX2JpdHdyaXRlcl9pbml0KTogQ2hhbmdlIHR5cGUgb2YgdGhpcmQKLQlhcmd1bWVudCB0byBGVF9Cb29sLgotCShwZnJfbG9va3VwX2JpdG1hcF9kYXRhKTogQ2hhbmdlIHR5cGUgb2YgdGhpcmQgYW5kIGZvdXJ0aCBhcmd1bWVudAotCXRvIEZUX1VJbnQuICBVcGRhdGVkIGNhbGxlci4KLQkocGZyX2xvYWRfYml0bWFwX2JpdHMpOiBDaGFuZ2UgdHlwZSBvZiBmb3VydGggYXJndW1lbnQgdG8gRlRfQm9vbC4KLQotMjAwMy0wNi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQ29tcGxldGVseSByZXZpc2VkIEZyZWVUeXBlJ3MgbWFrZSBtYW5hZ2VtZW50LgotCi0JLiBJbiBhbGwgbWFrZWZpbGVzIGAvJyBpcyB1c2VkIGFzIHRoZSBwYXRoIHNlcGFyYXRvci4gIFRoZQotCSAgY29udmVyc2lvbiB0byB0aGUgcmVhbCBwYXRoIHNlcGFyYXRvcnMgaXMgZG9uZSBhcyBsYXRlIGFzCi0JICBwb3NzaWJsZSB1c2luZyAkKHN1YnN0IC4uLikuCi0KLQkuICQoSE9TVFNFUCkgbm8gbG9uZ2VyIGV4aXN0cy4gIE5vdywgJChTRVApIGdpdmVzIHRoZSBwYXRoIHNlcGFyYXRvcgotCSAgZm9yIHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgdGhlIG5ldyAkKENPTVBJTEVSX1NFUCkgdGhlIHBhdGgKLQkgIHNlcGFyYXRvciBmb3IgdGhlIGNvbXBpbGVyIHRvb2xzLgotCi0JLiAkKEJVSUxEKSBoYXMgYmVlbiByZW5hbWVkIHRvICQoQlVJTERfRElSKS4gIEluIGdlbmVyYWwsIGFsbAotCSAgZGlyZWN0b3J5IHZhcmlhYmxlcyBlbmQgd2l0aCBgX0RJUicuICBUaGUgdmFyaWFudHMgZW5kaW5nIGluIGBfJwotCSAgKGxpa2UgYEJBU0VfJyBoYXZlIGJlZW4gcmVtb3ZlZCkuCi0KLQlUaGUgZm9sbG93aW5nIENoYW5nZUxvZyBlbnRyaWVzIG9ubHkgZGVzY3JpYmUgY2hhbmdlcyB3aGljaCBhcmUKLQlub3QgcmVsYXRlZCB0byB0aGUgcmVkZXNpZ24uCi0KLQkqIGJ1aWxkcy9iZW9zL2Jlb3MtZGVmLm1rIChCVUlMRF9ESVIpOiBGaXggdHlwby4KLQkqIGJ1aWxkcy9jb21waWxlci93YXRjb20ubWsgKExJTktfTElCUkFSWSk6IEZpeCBsaW5rZXIgY2FsbCB0byBhdm9pZAotCW92ZXJsb25nIGFyZ3VtZW50cyBhcyBzdWdnZXN0ZWQgYnkgSi4gQWxpIEhhcmxvdwotCTxhbGlAYXZyYy5jaXR5LmFjLnVrPi4KLQkqIGJ1aWxkcy9kb3MvZG9zLXdhdC5tazogTmV3IGZpbGUuCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKEZSRUVUWVBFX0gpOiBJbmNsdWRlIGhlYWRlciBmaWxlcyBmcm9tIHRoZQotCWBkZXZlbCcgc3ViZGlyZWN0b3J5LgotCi0JKiBidWlsZHMvb3MyL29zMi1kZXYubWssIGJ1aWxkcy91bml4L3VuaXhkZGVmLm1rLAotCWJ1aWxkcy91bml4L3VuaXhkZGVmLm1rLCBidWlsZHMvd2luMzIvdzMyLWJjY2QubWssCi0JYnVpbGRzL3dpbjMyL3czMi1kZXYubWsgKEJVSUxEX0RJUik6IEZpeCBwYXRoLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWMsIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogVXBkYXRlZC4KLQkqIGJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChESVNUQ0xFQU4pOiBBZGQgYGZyZWV0eXBlMi5wYycuCi0KLTIwMDMtMDYtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYyAoRlRfTmV3X0ZhY2VfRnJvbV9TRk5UKTogcy9ybGVuL3NmbnRfc2l6ZS8gdG8KLQltYWtlIGl0IGNvbXBpbGUuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmg6IFVwZGF0ZWQuCi0KLTIwMDMtMDYtMDcgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgsIHNyYy90cnVldHlwZS90dGdsb2FkLmg6Ci0Jcy9pbmRleC9pZHgvIHRvIGZpeCBjb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL3NmbnQvdHRjbWFwMC5jICh0dF9mYWNlX2J1aWxkX2NtYXBzKTogVXNlIG1vcmUgYHZvbGF0aWxlJyB0bwotCWZpeCBjb21waWxlciB3YXJuaW5nLgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYyAoQlVJTERGSVhFRCk6IFJlbW92ZWQuCi0JKiBzcmMvZ3ppcC9pbmZ0cmVlcy5jIChpbmZsYXRlX3RyZWVzX2ZpeGVkKSBbIUJVSUxERklYRURdOiBVc2UKLQlGVF9VTlVTRUQgdG8gcmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMDMtMDYtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZXIuaDogUmVuYW1lZCB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oOiBUaGlzLgotCi0JKiBzcmMvYmFzZS9mdHN0cm9rZXIuYzogUmVuYW1lZCB0by4uLgotCSogc3JjL2Jhc2UvZnRzdHJva2UuYzogVGhpcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfU1RST0tFUl9IKTogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZGVzY3JpcC5tbXMsIHNyYy9iYXNlL0phbWZpbGUsIHNyYy9iYXNlL3J1bGVzLm1rOgotCVVwZGF0ZWQuCi0KLQkqIHNyYy9wY2YvcGNmZHJpdmVyLmM6IFJlbmFtZWQgdG8uLi4KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYzogVGhpcy4KLQkqIHNyYy9wY2YvcGNmZHJpdmVyLmg6IFJlbmFtZWQgdG8uLi4KLQkqIHNyYy9wY2YvcGNmZHJpdnIuaDogVGhpcy4KLQotCSogc3JjL3BjZi9KYW1maWxlLCBzcmMvcGNmL3J1bGVzLm1rOiBVcGRhdGVkLgotCi0yMDAzLTA2LTA1ICBXZW5saW4gSW5zdGl0dXRlIChUb20gQmlzaG9wKSAgPHdlbmxpbkB3ZW5saW4uY29tPgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jIChmaWxlX3NwZWNfZnJvbV9wYXRoKSBbVEFSR0VUX0FQSV9NQUNfQ0FSQk9OXToKLQlBZGQgYCNpZiAhZGVmaW5lZChfX01XRVJLU19fKScuCi0KLTIwMDMtMDYtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9GaWVsZFR5cGUpOiBBZGQKLQlUMV9GSUVMRF9UWVBFX0ZJWEVEXzEwMDAgYW5kIFQxX0ZJRUxEX1RZUEVfRklYRURfMTAwMF9QLgotCShUMV9GSUVMRF9GSVhFRF8xMDAwLCBUMV9GSUVMRF9GSVhFRF8xMDAwX1ApOiBOZXcgbWFjcm9zLgotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19wYXJzZXJfbG9hZF9maWVsZCk6IEhhbmRsZQotCVQxX0ZJRUxEX1RZUEVfRklYRURfMTAwMCBhbmQgVDFfRklFTERfVFlQRV9GSVhFRF8xMDAwX1AuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX2tpbmRfZml4ZWRfdGhvdXNhbmQpOiBOZXcgZW51bWVyYXRpb24uCi0JKENGRl9GSUVMRF9GSVhFRF8xMDAwKTogTmV3IG1hY3JvLgotCShjZmZfcGFyc2VyX3J1bik6IEhhbmRsZSBjZmZfa2luZF9maXhlZF90aG91c2FuZC4KLQkqIHNyYy9jZmYvY2ZmdG9rZW4uaDogVXNlIENGRl9GSUVMRF9GSVhFRF8xMDAwIGZvciBibHVlX3NjYWxlLgotCSogc3JjL2NmZi9jZmZsb2FkIChjZmZfc3ViZm9udF9sb2FkKTogRml4IGRlZmF1bHQgdmFsdWVzIG9mCi0JZXhwYW5zaW9uX2ZhY3RvciBhbmQgYmx1ZV9zY2FsZS4KLQotCSogc3JjL2NpZC9jaWR0b2tlbi5oLCBzcmMvdHlwZTEvdDF0b2tlbnMuaDogVXNlIFQxX0ZJRUxEX0ZJWEVEXzEwMDAKLQlmb3IgYmx1ZV9zY2FsZS4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2dsb2JhbHNfbmV3KTogRml4IGRlZmF1bHQgdmFsdWUgb2YKLQlibHVlX3NjYWxlLgotCi0yMDAzLTA2LTA0ICBXb2xmZ2FuZyBEb21yw7ZzZSAgPHBvcnRob3MuZG9tcm9lc2VAaGFyei5kZT4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oLCBzcmMvY2lkL2NpZGdsb2FkLmMsCi0Jc3JjL3BzYXV4L3Bzb2Jqcy5jLCBzcmMvcHNhdXgvdDFkZWNvZGUuYywgc3JjL3BzYXV4L3Bzb2Jqcy5oLAotCXNyYy9wc2hpbnRlci9wc2hyZWMuYywgc3JjL3BzaGludGVyL3BzaGFsZ28uYywKLQlzcmMvcHNuYW1lcy9wc21vZHVsZS5jLCBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMsIHNyYy9zZm50L3Nmb2Jqcy5jLAotCXNyYy9zbW9vdGgvZnRncmF5cy5jLCBzcmMvc21vb3RoL2Z0c21vb3RoLmMsIHNyYy90cnVldHlwZS90dG9ianMuYywKLQlzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYywgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYywgc3JjL3R5cGUxL3QxYWZtLmMsCi0Jc3JjL3R5cGUxL3QxZ2xvYWQuYywgc3JjL3R5cGUxL3QxZ2xvYWQuaCwgc3JjL3R5cGUxL3QxbG9hZC5jLAotCXNyYy90eXBlMS90MW9ianMuYywgc3JjL3R5cGU0Mi90NDJwYXJzZS5jLCBzcmMvdHlwZTQyL3Q0MnBhcnNlLmg6Ci0JTWFueSBjYXN0cyBhbmQgc2xpZ2h0IGFyZ3VtZW50IHR5cGUgY2hhbmdlcyB0byBtYWtlIGl0IHdvcmsgd2l0aAotCWEgMTZiaXQgY29tcGlsZXIuCi0KLTIwMDMtMDYtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaDogRGVmaW5pbmcKLQlUVF9DT05GSUdfT1BUSU9OX0ZPUkNFX1VOUEFURU5URURfSElOVElORyBieSBkZWZhdWx0IGlzIGEgYmFkIGlkZWEKLQlzaW5jZSBzb21lIGZvbnRzIChlLmcuIEFyaWFsKSBwcm9kdWNlIHdvcnNlIHJlc3VsdHMgdGhhbiB3aXRob3V0Ci0JaGludGluZy4gIFJldmVydGVkLgotCi0yMDAzLTA2LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpCi0JW1RUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVJdOiBDYWxsCi0JRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMgYmVmb3JlIGFkZGluZyBwaGFudG9tIHBvaW50cy4gIFRoaXMgZml4ZXMKLQlhIHNlZ2ZhdWx0IGJ1ZyB3aXRoIGZvbnRzIChlLmcuIGh0c3QzLnR0Zikgd2hpY2ggaGF2ZSBuZXN0ZWQKLQlzdWJnbHlwaHMgbW9yZSB0aGFuIG9uZSBsZXZlbCBkZWVwLiAgUmVwb3J0ZWQgYnkgQW50aG9ueSBGb2suCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg6IERlZmluZQotCVRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIsCi0JVFRfQ09ORklHX09QVElPTl9DT01QSUxFX1VOUEFURU5URURfSElOVElORywgYW5kCi0JVFRfQ09ORklHX09QVElPTl9GT1JDRV9VTlBBVEVOVEVEX0hJTlRJTkcgdG8gbWFrZSBpdCB0aGUgbmV3Ci0JZGVmYXVsdC4KLQotMjAwMy0wNi0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRlcl9oaW50X2VkZ2VzKTogUmVtb3ZlZC4gIEp1c3QgYQotCXdyYXBwZXIgZm9yIGFoX2hpbnRfZWRnZXMuCi0JKGFoX2hpbnRfZWRnZXMpOiBSZW5hbWVkIHRvLi4uCi0JKGFoX2hpbnRlcl9oaW50X2VkZ2VzKTogVGhpcy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1NldF9IaW50X0ZsYWdzKTogUmVtb3ZlZC4gIFVudXNlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfRmFjZV9JbnRlcm5hbFJlYyksCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9EZWNvZGVyUmVjKSwKLQlzcmMvY2ZmL2NmZmdsb2FkLmggKENGRl9CdWlsZGVyKTogUmVtb3ZlIGBoaW50X2ZsYWdzJyBmaWVsZC4KLQlVbnVzZWQuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2J1aWxkZXJfaW5pdCk6IFVwZGF0ZWQuCi0JKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKSA8Y2ZmX29wX2VuZGNoYXI+OiBDYWxsIGhpbnRlci0+YXBwbHkKLQl3aXRoIGRlY29kZXItPmhpbnRfbW9kZSBpbnN0ZWFkIG9mIGJ1aWxkZXItPmhpbnRfZmxhZ3MuCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9pbml0KTogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2VyLmMgKGZ0X3N0cm9rZV9ib3JkZXJfZXhwb3J0KTogcy9pbmRleC9pZHgvLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBDb21tZW50ZWQgb3V0IGNvZGUgd2hpY2gKLQlpbmNyZWFzZWQgcm9vdC0+aGVpZ2h0IGJ5IDE1JSBpZiB0aGUgbGluZSBnYXAgd2FzIHplcm8uICBUaGVyZSBleGlzdAotCWZvbnRzIChjb250YWluaW5nIGUuZy4gZm9ybSBkcmF3aW5nIGNoYXJhY3RlcnMpIHdoaWNoIGludGVudGlvbmFsbHkKLQloYXZlIGEgemVybyBsaW5lIGdhcCB2YWx1ZS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEZyZWVfUHJvamVjdCwgQ1VSX0Z1bmNfZnJlZVByb2opOgotCVJlbW92ZWQuICBVbnVzZWQuCi0JVXBkYXRlZCBhbGwgY2FsbGVycy4KLQotMjAwMy0wNi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IFVzZSBzeW1ib2xpYyBuYW1lcyBmb3IKLQlBZG9iZSBzcGVjaWZpYyBlbmNvZGluZyBJRHMgKHRoZXJlIHdhcyBhIHdyb25nIEVJRCB2YWx1ZSBmb3IgY3VzdG9tCi0JZW5jb2RpbmcpLgotCi0JKiBzcmMvY2ZmL2NmZmNtYXAuaCAoQ0ZGX0NNYXBTdGRSZWMpOiBSZW1vdmUgYGNvdW50Jy4KLQkqIHNyYy9jZmYvY2ZmY21hcC5jIChjZmZfY21hcF9lbmNvZGluZ19pbml0LAotCWNmZl9jbWFwX2VuY29kaW5nX2RvbmUpOiBVcGRhdGVkLgotCShjZmZfY21hcF9lbmNvZGluZ19jaGFyX2luZGV4LCBjZmZfY21hcF9lbmNvZGluZ19jaGFyX25leHQpOiBVc2UKLQkyNTYgYXMgbGltaXQgZm9yIGNoYXJhY3RlciBjb2RlLgotCi0yMDAzLTA2LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoRk5UX0xvYWRfR2x5cGgpOiBSZXZlcnQgY2hhbmdlIGZyb20KLQkyMDAzLTAzLTIwLgotCi0yMDAzLTA1LTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaCAoRlRfVmVjdG9yX05vcm1hbGl6ZSk6IFJlbW92ZWQuCi0KLTIwMDMtMDUtMzEgICAgPFJvbi5EZXZAZ214LmRlPgotCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX0ZhY2VfSW5pdCk6IEltcHJvdmUgYWxnb3JpdGhtIGZvciBndWVzc2luZwotCXRoZSBmb250IHN0eWxlIGJ5IGlnbm9yaW5nIHNwYWNlcyBhbmQgaHlwaGVucy4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluOiBGaXggYFZlcnNpb24nIGZpZWxkLgotCi0yMDAzLTA1LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBdm9pZCBvdmVyd3JpdGluZyBvZiBudW1lcmljIGZvbnQgZGljdGlvbmFyeSBlbnRyaWVzIGZvciBzeW50aGV0aWMKLQlmb250cy4gIEFkZGl0aW9uYWxseSwgc29tZSBlbnRyaWVzIHdlcmUgaGFuZGxlZCBhcyBgaW50ZWdlcicgaW5zdGVhZAotCW9mIGBudW1iZXInLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX0ZpZWxkVHlwZSk6IEFkZAotCVQxX0ZJRUxEX1RZUEVfQk9PTF9QLCBUMV9GSUVMRF9UWVBFX0lOVEVHRVJfUCwgYW5kCi0JVDFfRklFTERfVFlQRV9GSVhFRF9QLgotCShUMV9GSUVMRF9CT09MX1AsIFQxX0ZJRUxEX05VTV9QLCBUMV9GSUVMRF9GSVhFRF9QKTogTmV3IG1hY3Jvcy4KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfcGFyc2VyX2xvYWRfZmllbGQpOiBIYW5kbGUgbmV3IGZpZWxkIHR5cGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmggKENGRl9Gb250UmVjRGljdCksCi0Jc3JjL2NmZi9jZmZ0b2tlbi5oOiBDaGFuZ2UgdHlwZSBvZiB1bmRlcmxpbmVfcG9zaXRpb24gYW5kCi0JdW5kZXJsaW5lX3RoaWNrbmVzcyB0byBGVF9GaXhlZC4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfc3ViZm9udF9sb2FkKTogRml4IGRlZmF1bHQgdmFsdWVzIG9mCi0JdW5kZXJsaW5lX3Bvc2l0aW9uIGFuZCB1bmRlcmxpbmVfdGhpY2tuZXNzLgotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBTZXQgdW5kZXJsaW5lX3Bvc2l0aW9uCi0JYW5kIHVuZGVybGluZV90aGlja25lc3MgaW4gYHJvb3QnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCAoVDFfRm9udCk6IENoYW5nZSBwb2ludF90eXBlCi0JYW5kIHN0cm9rZV93aWR0aCB0byBwb2ludGVycy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCAoUFNfRm9udEluZm8pOiBDaGFuZ2UgaXRhbGljX2FuZ2xlLAotCWlzX2ZpeGVkX3BpdGNoLCB1bmRlcmxpbmVfcG9zaXRpb24sIGFuZCB1bmRlcmxpbmVfdGhpY2tuZXNzIHRvCi0JcG9pbnRlcnMuCi0JKiBzcmMvdHlwZTEvdDF0b2tlbnMuaDogQ2hhbmdlIGl0YWxpY19hbmdsZSwgaXNfZml4ZWRfcGl0Y2gsCi0JdW5kZXJsaW5lX3Bvc2l0aW9uLCBhbmQgdW5kZXJsaW5lX3RoaWNrbmVzcyB0byBwb2ludGVycy4gIENoYW5nZQotCXRoZSB0eXBlIG9mIHRoZSBsYXR0ZXIgdHdvIHRvIGBmaXhlZCcuCi0JQ2hhbmdlIHR5cGUgb2Ygc3Ryb2tlX3dpZHRoIHRvIGBmaXhlZCcgYW5kIG1ha2UgaXQgYSBwb2ludGVyLgotCUNoYW5nZSBwYWludF90eXBlIHRvIHBvaW50ZXIuCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX0ZhY2VfRG9uZSk6IFVwZGF0ZWQuCi0JKFQxX0ZhY2VfSW5pdCk6IFVwZGF0ZWQuCi0JRml4IGFzc2lnbm1lbnQgb2YgdW5kZXJsaW5lX3Bvc2l0aW9uIGFuZCB1bmRlcmxpbmVfdGhpY2tuZXNzLgotCi0JKiBzcmMvY2lkL2NpZHRva2VuLmg6IENoYW5nZSBpdGFsaWNfYW5nbGUsIGlzX2ZpeGVkX3BpdGNoLAotCXVuZGVybGluZV9wb3NpdGlvbiwgYW5kIHVuZGVybGluZV90aGlja25lc3MgdG8gcG9pbnRlcnMuICBDaGFuZ2UKLQl0aGUgdHlwZSBvZiB0aGUgbGF0dGVyIHR3byB0byBgZml4ZWQnLgotCUNoYW5nZSB0eXBlIG9mIHN0cm9rZV93aWR0aCB0byBgZml4ZWQnLgotCSogc3JjL2NpZC9jaWRvYmpzLmMgKGNpZF9mYWNlX2RvbmUpOiBVcGRhdGVkLgotCShjaWRfZmFjZV9pbml0KTogVXBkYXRlZC4KLQlGaXggYXNzaWdubWVudCBvZiB1bmRlcmxpbmVfcG9zaXRpb24gYW5kIHVuZGVybGluZV90aGlja25lc3MuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYzogQ2hhbmdlIGl0YWxpY19hbmdsZSwgaXNfZml4ZWRfcGl0Y2gsCi0JdW5kZXJsaW5lX3Bvc2l0aW9uLCBhbmQgdW5kZXJsaW5lX3RoaWNrbmVzcyB0byBwb2ludGVycy4gIENoYW5nZSB0aGUKLQl0eXBlIG9mIHRoZSBsYXR0ZXIgdHdvIHRvIGBmaXhlZCcuCi0JQ2hhbmdlIHR5cGUgb2Ygc3Ryb2tlX3dpZHRoIHRvIGBmaXhlZCcgYW5kIG1ha2UgaXQgYSBwb2ludGVyLgotCUNoYW5nZSBwYWludF90eXBlIHRvIHBvaW50ZXIuCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCk6IFVwZGF0ZWQuCi0JRml4IGFzc2lnbm1lbnQgb2YgdW5kZXJsaW5lX3Bvc2l0aW9uIGFuZCB1bmRlcmxpbmVfdGhpY2tuZXNzLgotCShUNDJfRmFjZV9Eb25lKTogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKG9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYywgc3JjL3BzaGludGVyL3BzaGdsb2IuaAotCShwc2hfZ2xvYmFsc19zZXRfc2NhbGUpOiBNYWtlIGl0IGEgbG9jYWwgZnVuY3Rpb24uCi0KLQkqIHRlc3QvZ3ZpZXcuYzogRml4IHJlbmFtaW5nIHBzMy0+cHMgdHlwby4KLQlGb3JtYXR0aW5nLgotCi0yMDAzLTA1LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMS5bY2hdLCBzcmMvcHNoaW50ZXIvcHNoYWxnbzIuW2NoXTogUmVtb3ZlZC4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmg6IFJlbW92ZWQuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5bY2hdOiBSZW5hbWVkIHRvLi4uCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5bY2hdOiBOZXcgZmlsZXMuCi0Jcy9QU0gzL1BTSC8uCi0Jcy9wc2gzL3BzaC8uCi0Jcy9wczMvcHMvLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMsIHNyYy9wc2hpbnRlci9wc2hpbnRlci5jOiBVcGRhdGVkLgotCSogc3JjL3BzaGludGVyL3J1bGVzLm1rLCBzcmMvcHNoaW50ZXIvSmFtZmlsZTogVXBkYXRlZC4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuW2NoXSAocHNoX2RpbWVuc2lvbl9zbmFwX3dpZHRoKTogQ29tbWVudGVkCi0Jb3V0LgotCi0JKiB0ZXN0cy9ndmlldy5jOiBSZW1vdmUgY29kZSBmb3IgcHNoYWxnbzEgYW5kIHBzaGFsZ28yLgotCVVwZGF0ZWQuCi0KLTIwMDMtMDUtMjggIE1hcnRpbiBaaW5zZXIgIDx6aW5zZXJAZGVjdXMuZGU+Ci0KLQkqIHZtc19tYWtlLmNvbTogUmV3b3JrZWQgc3VwcG9ydCBmb3Igc2hhcmVhYmxlIGltYWdlcyBvbiBWTVMuICBUaGUKLQlmaXJzdCB2ZXJzaW9uIHdhcyBraW5kIG9mIGEgaGFjazsgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JcHJvY2VkdXJlIHRvIGV4dHJhY3QgdGhlIHJlcXVpcmVkIHN5bWJvbHMgaXMgbXVjaCBjbGVhbmVyLgotCi0JUmV3b3JrZWQgY3JlYXRpb24gb2YgTU1TIGZpbGVzLCBhdm9pZGluZyBhIG51bWJlciBvZiB0ZW1wb3JhcnkgZmlsZXMKLQl3aGljaCB3ZXJlIGNyZWF0ZWQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24uCi0KLQlGdXJ0aGVyIHdvcmsgb24gY3JlYXRpbmcgZGVzY3JpcC5tbXMgZmlsZXMgb24gdGhlIGZseS4KLQotCSogYnVpbGRzL3Ztcy9kZXNjcmlwLm1tcywgc3JjL2F1dG9oaW50L2Rlc2NyaXAubW1zLAotCXNyYy90eXBlMS9kZXNjcmlwLm1tczogUmVtb3ZlZC4KLQotMjAwMy0wNS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzMuYyAocHNoM19nbHlwaF9jb21wdXRlX2V4dHJlbWEpOiBTa2lwCi0JY29udG91cnMgd2l0aCBvbmx5IGEgc2luZ2xlIHBvaW50IHRvIGF2b2lkIHNlZ2ZhdWx0LgotCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX1RvX0JpdG1hcCk6IEFjdGl2YXRlIGNvZGUgZm9yCi0JaGFuZGxpbmcgYG9yaWdpbicuCi0KLTIwMDMtMDUtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FodHlwZXMuaCAoQUhfT1BUSU9OX05PX1NUUk9OR19JTlRFUlBPTEFUSU9OKToKLQlSZW1vdmVkIHNpbmNlIHVudXNlZC4KLQotMjAwMy0wNS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oIChmdF9zdHJjYXQpOiBOZXcgd3JhcHBlciBtYWNybwotCWZvciBzdHJjYXQuCi0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKGNyZWF0ZV9sd2ZuX25hbWUpOiBzL2lzdXBwZXIvZnRfaXN1cHBlci8uCi0JKHBhcnNlX2ZvbnQpOiBzL21lbWNweS9mdF9tZW1jcHkvLgotCShpc19kZm9udCkgW1RBUkdFVF9BUElfTUFDX0NBUkJPTl06IHMvbWVtY21wL2Z0X21lbWNtcC8uCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAobG9hZF9tYWNfZmFjZSkgW0ZUX01BQ0lOVE9TSF06Ci0Jcy9zdHJsZW4vZnRfc3RybGVuLy4KLQlzL3N0cmNhdC9mdF9zdHJjYXQvLgotCXMvc3RyY3B5L2Z0X3N0cmNweS8uCi0JKiBzcmMvZ3ppcC96dXRpbC5oOiBzL21lbXNldC9mdF9tZW1zZXQvLgotCXMvbWVtY21wL2Z0X21lbWNtcC8uCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCksIHNyYy9wY2YvcGNmZHJpdmVyLmMKLQkoUENGX0ZhY2VfSW5pdCk6IFRlc3QgZm9yIGNoYXJzZXQgcmVnaXN0cnkgY2FzZS1pbnNlbnNpdGl2ZWx5LgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYyAoZnRfZ3ppcF9maWxlX2lvKTogUmV2ZXJ0IGNoYW5nZSBmcm9tIHllc3RlcmRheTsKLQlpdCBoYXMgYWxyZWFkeSBiZWVuIGZpeGVkIGRpZmZlcmVudGx5LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoRE9fU0ZWVEwpOiBBZGQgbWlzc2luZyBicmFjZXMgYXJvdW5kCi0JaWYtY2xhdXNlLgotCi0yMDAzLTA1LTIxICBNYXJ0aW4gWmluc2VyICA8emluc2VyQGRlY3VzLmRlPgotCi0JKiB0MWxvYWQuYyAocGFyc2VfYmxlbmRfYXhpc190eXBlcyk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCi0JKiBkZXNjcmlwLm1tczogUmVtb3ZlZC4gIE5vdyBjcmVhdGVkIGJ5Li4uCi0KLQkqIHZtc19tYWtlLmNvbTogTmV3IGZpbGUuCi0KLTIwMDMtMDUtMjEgIFdlaXFpIEdhbyAgPHdlaXFpZ2FvQG5ldHdvcmt1c2EubmV0PgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYyAoZnRfZ3ppcF9maWxlX2lvKTogQXZvaWQgemVybyB2YWx1ZSBvZiBgZGVsdGEnCi0JdG8gcHJldmVudCBpbmZpbml0ZSBsb29wLgotCi0yMDAzLTA1LTIxICBMYXJzIENsYXVzZW4gIDxscmNsYXVzZUBjcy51aXVjLmVkdT4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogUHJvdmlkZSBiZXR0ZXIgYXV0b2NvbmYgc25pcHBldCB0byBjaGVjawotCUZyZWVUeXBlIHZlcnNpb24uCi0KLTIwMDMtMDUtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKG9wZW5fZmFjZSk6IEZyZWUgYGludGVybmFsJyBub3QKLQlgZmFjZS0+aW50ZXJuYWwnIGluIGNhc2Ugb2YgZXJyb3IgdG8gYXZvaWQgcG9zc2libGUgc2VnZmF1bHQuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5jIChwczNfaGludHNfYXBwbHkpOiBDaGVjayB3aGV0aGVyIHdlCi0JYWN0dWFsbHkgaGF2ZSBhbiBvdXRsaW5lLgotCi0yMDAzLTA1LTIwICBEYXZpZCBDaGVzdGVyICA8ZGF2aWRjaGVzdGVyQHFteC5uZXQ+Ci0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5jIChwczNfaGludHNfYXBwbHkpOiBUcnkgdG8gb3B0aW1pemUKLQl5X3NjYWxlIHNvIHRoYXQgdGhlIHRvcCBvZiBub24tY2FwaXRhbCBsZXR0ZXJzIGlzIGFsaWduZWQgb24gYSBwaXhlbAotCWJvdW5kYXJ5IHdoZW5ldmVyIHBvc3NpYmxlLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRfZWRnZXMpOiBNYWtlIHN1cmUgdGhhdCBsb3dlcmNhc2UKLQltJ3MgbWFpbnRhaW4gdGhlaXIgc3ltbWV0cnkuCi0KLTIwMDMtMDUtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfbG9hZF9nbHlwaCk6IE9vcHMhICBEYXZpZCdzCi0JcGF0Y2ggZnJvbSB5ZXN0ZXJkYXkgaGFzIGJlZW4gcmVzb2x2ZWQgYWxyZWFkeSBpbiBhIGRpZmZlcmVudAotCXdheS4gIFJldmVydGVkLgotCi0yMDAzLTA1LTE5ICBEYXZpZCBDaGVzdGVyICA8ZGF2aWRjaGVzdGVyQHFteC5uZXQ+Ci0KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfaGludGVyX2xvYWRfZ2x5cGgpOiBEb24ndCBzY2FsZQotCXlfc2NhbGUgbG9jYWxseSBidXQgZmFjZS0+c2l6ZS0+bWV0cmljcy55X3NjYWxlLgotCi0yMDAzLTA1LTE5ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0Y21hcDAuYyAodHRfY21hcDRfY2hhcl9uZXh0KTogU2VsZWN0IHByb3BlciBzdGFydAotCXZhbHVlIGZvciBgaGknIHRvIGF2b2lkIGluZmluaXRlIGxvb3AuCi0KLTIwMDMtMDUtMTggIFlvbmcgU3VuICA8c3VueW9uZ0BuanN0YXIuY29tPgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKEluc2VydF9ZX1R1cm4pOiBGaXggb3ZlcmZsb3cgdGVzdC4KLQotMjAwMy0wNS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIFtGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UU106Ci0JTmV3IG1hY3JvLgotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IFVzZSBpdCB0byBjb250cm9sIG1hYyBmb250IHN1cHBvcnQgb24gbm9uLW1hYwotCXBsYXRmb3Jtcy4KLQotMjAwMy0wNS0xNyAgR2VvcmdlIFdpbGxpYW1zICA8Z3d3QHNpbGNvbS5jb20+Ci0KLQlJbXBsZW1lbnQgcGFydGlhbCBzdXBwb3J0IG9mIE1hYyBmb250cyBvbiBub24tTWFjIHBsYXRmb3Jtcy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKG1lbW9yeV9zdHJlYW1fY2xvc2UsIG5ld19tZW1vcnlfc3RyZWFtLAotCW9wZW5fZmFjZV9mcm9tX2J1ZmZlciwgTWFjX1JlYWRfUE9TVF9SZXNvdXJjZSwKLQlNYWNfUmVhZF9zZm50X1Jlc291cmNlLCBJc01hY1Jlc291cmNlLCBJc01hY0JpbmFyeSwgbG9hZF9tYWNfZmFjZSkKLQlbIUZUX01BQ0lOVE9TSF06IE5ldyBmdW5jdGlvbnMuCi0JKEZUX09wZW5fRmFjZSkgWyFGVF9NQUNJTlRPU0hdOiBVc2UgbG9hZF9tYWNfZmFjZS4KLQotMjAwMy0wNS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IFNjYWxlIGxpbmVhciBhZHZhbmNlIHdpZHRoIG9ubHkKLQlpZiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgaXMgc2V0IChvdGhlcndpc2Ugd2UgaGF2ZSBhIGRpdmlzaW9uIGJ5Ci0JemVybyBzaW5jZSBGTlQgYW5kIGZyaWVuZHMgZG9uJ3QgZGVmaW5lIGBmYWNlLT51bml0c19wZXJfRU0nKS4KLQotMjAwMy0wNS0xNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChGVF9WZWN0b3JfUm90YXRlKTogQXZvaWQgcm91bmRpbmcgZXJyb3JzCi0JZm9yIHNtYWxsIHZhbHVlcy4KLQotMjAwMy0wNS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2hpbnQvYWh0eXBlcy5oIChBSF9Qb2ludFJlYyk6IFJlbW92ZSB1bnVzZWQgYGluX2FuZ2xlJwotCWFuZCBgb3V0X2FuZ2xlJyBmaWVsZHMuCi0KLTIwMDMtMDUtMTQgIEdlb3JnZSBXaWxsaWFtcyAgPGd3d0BzaWxjb20uY29tPgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jIChGVF9OZXdfRmFjZV9Gcm9tX1NGTlQpOiBIYW5kbGUgQ0ZGIGZpbGVzIGFsc28uCi0KLTIwMDMtMDUtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiBGaXggdHlwbyBpbiBjb21tZW50Ci0JKEZUX0hBU19GSVhFRF9TSVpFUykuCi0KLTIwMDMtMDUtMTAgIERhbiBXaWxsaWFtcyAgPGRhbkBiaWd3Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvYWNsb2NhbC5tNDogQ29tbWVudCBvdXQgZGVmaW5pdGlvbiBvZgotCWBhbGxvd191bmRlZmluZWRfZmxhZycgZm9yIERhcndpbiAxLjMuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IEFkZCBvcHRpb24gLS13aXRoLW9sZC1tYWMtZm9udHMuCi0JKiBidWlsZHMvdW5peC9sdG1haW4uc2g6IEZpeCB2ZXJzaW9uIG51bWJlcmluZyBmb3IgRGFyd2luIDEuMy4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IEZpeCBjb25kaXRpb25zIGZvciBkZWZpbmluZwotCWBGVF9NQUNJTlRPU0gnLgotCSogc3JjL2Jhc2UvZnRiYXNlLmM6IEluY2x1ZGUgYGZ0bWFjLmMnIGNvbmRpdGlvbmFsbHkuCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBIYW5kbGUgX19HTlVDX18uCi0KLTIwMDMtMDUtMDcgIFlBTUFOTy1VQ0hJIEhpZGV0b3NoaSAgPG1lckBkaW4ub3IuanA+Ci0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChpc19hbHBoYSk6IFJlbW92ZWQuCi0JKGNpZF9wYXJzZV9kaWN0KTogVXNlIGBjaWRfcGFyc2VyX3NraXBfYWxwaGEnIGluc3RlYWQgb2YgYGlzX2FscGhhJy4KLQotMjAwMy0wNS0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2hpbnQvYWhvcHRpbS5jLCBzcmMvYXV0b2hpbnQvYWhvcHRpbS5oOiBPYnNvbGV0ZSwgcmVtb3ZlZC4KLQotMjAwMy0wNS0wNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYXV0b2hpbnQvYWhnbHlwaC5jIChhaF9zZXR1cF91dik6IEV4Y2hhbmdlIGBmb3InIGxvb3AgYW5kCi0JYHN3aXRjaCcgc3RhdGVtZW50IHRvIG1ha2UgaXQgcnVuIGZhc3Rlci4KLQkoYWhfb3V0bGluZV9jb21wdXRlX3NlZ21lbnRzKTogUmVzZXQgYHNlZ21lbnQtPnNjb3JlJyBhbmQKLQlgc2VnbWVudC0+bGluaycuCi0JKGFoX291dGxpbmVfbGlua19zZWdtZW50cyk6IFByb3ZpZGUgYWx0ZXJuYXRpdmUgY29kZSB3aGljaCBkb2VzCi0JdGhlIHNhbWUgYnV0IHJ1bnMgbXVjaCBmYXN0ZXIuCi0JSGFuZGxlIG1ham9yIGRpcmVjdGlvbiBhbHNvLgotCShhaF9vdXRsaW5lX2NvbXB1dGVfZWRnZXMpOiBTY2FsZSBgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQnIGRvd24KLQlhZnRlciByb3VuZGluZyBpbnN0ZWFkIG9mIHNjYWxpbmcgY29tcGFyaXNvbiB2YWx1ZSBpbiBsb29wLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRlcl9hbGlnbl9zdHJvbmdfcG9pbnRzKTogUHJvdmlkZQotCWFsdGVybmF0aXZlIGNvZGUgd2hpY2ggcnVucyBmYXN0ZXIuCi0JSGFuZGxlIGBiZWZvcmUtPnNjYWxlID09IDAnLgotCi0JKiBzcmMvYXV0b2hpbnQvYWh0eXBlcy5oIChBSF9TZWdtZW50UmVjKTogTW92ZSBzb21lIGZpZWxkcyBkb3duLgotCShBSF9FZGdlUmVjKTogTW92ZSBzb21lIGZpZWxkcyBpbiBzdHJ1Y3R1cmUuCi0JTmV3IGZpZWxkIGBzY2FsZScuCi0KLQkqIHNyYy9zZm50L3R0Y21hcDAuYyAodHRfY21hcDRfY2hhcl9uZXh0KTogVXNlIGJpbmFyeSBzZWFyY2guCi0KLTIwMDMtMDUtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2Fob3B0aW0uYyAoTE9HKTogUmVuYW1lZCB0by4uLgotCShBSF9PUFRJTV9MT0cpOiBUaGlzLgotCShBSF9EdW1wX1NwcmluZ3MpOiBGaXggbG9nIG1lc3NhZ2UgZm9ybWF0LgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRfZWRnZXNfMyk6IFJlbmFtZWQgdG8uLi4KLQkoYWhfaGludF9lZGdlcyk6IFRoaXMuCi0KLTIwMDItMDUtMDIgIEtlaXRoIFBhY2thcmQgIDxrZWl0aHBAa2VpdGhwLmNvbT4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfU2V0X1BpeGVsX1NpemUpOiBJbml0aWFsaXplIGBtYXhfYWR2YW5jZScuCi0KLTIwMDMtMDUtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYyAoYWhfdGVzdF9leHRyZW1hKTogUmVuYW1lZCB0by4uLgotCShhaF90ZXN0X2V4dHJlbXVtKTogVGhpcy4KLQotMjAwMy0wNC0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IEdlbmVyYXRlIGBmcmVldHlwZS5wYycgZnJvbQotCWBmcmVldHlwZS5pbicuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5tayAoaW5zdGFsbCwgdW5pbnN0YWxsKTogSGFuZGxlIGBmcmVldHlwZS5wYycuCi0KLTIwMDMtMDQtMjggIEd1c3Rhdm8gSi4gQS4gTS4gQ2FybmVpcm8gIDxnamNAaW5lc2Nwb3J0by5wdD4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluOiBOZXcgZmlsZS4gIENvbnRhaW5zIGJ1aWxkaW5nIGluZm9ybWF0aW9uCi0JZm9yIHRoZSBgcGtnLWNvbmZpZycgcGFja2FnZS4KLQotMjAwMy0wNC0yOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IEZpeCBib3VuZGFyeSBjaGVjayBmb3IKLQlgZ2x5cGhfaW5kZXgnLgotCi0yMDAzLTA0LTI1OiAgR3JhaGFtIEFzaGVyICA8Z3JhaGFtLmFzaGVyQGJ0aW50ZXJuZXQuY29tPgotCi0JQWRkZWQgdGhlIG9wdGlvbmFsIHVucGF0ZW50ZWQgaGludGluZyBzeXN0ZW0gZm9yIFRydWVUeXBlLiAgSXQKLQlhbGxvd3MgdHlwZWZhY2VzIHdoaWNoIG5lZWQgaGludGluZyB0byBwcm9kdWNlIGNvcnJlY3QgZ2x5cGggZm9ybXMKLQkoZS5nLiwgQ2hpbmVzZSB0eXBlZmFjZXMgZnJvbSBEeW5hbGFiKSB0byB3b3JrIGFjY2VwdGFibHkgd2l0aG91dAotCWluZnJpbmdpbmcgQXBwbGUgcGF0ZW50cy4gIFRoaXMgc3lzdGVtIGlzIGNvbXBpbGVkIG9ubHkgaWYKLQlUVF9DT05GSUdfT1BUSU9OX0NPTVBJTEVfVU5QQVRFTlRFRF9ISU5USU5HIGlzIGRlZmluZWQgaW4KLQlmdG9wdGlvbi5oLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0dW5wYXQuaDogTmV3IGZpbGUuICBEZWZpbmVzCi0JRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfVFJVRVRZUEVfVU5QQVRFTlRFRF9IKTogTmV3Ci0JbWFjcm8gdG8gdXNlIHdoZW4gaW5jbHVkaW5nIHR0dW5wYXQuaC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAotCShUVF9DT05GSUdfT1BUSU9OX0NPTVBJTEVfVU5QQVRFTlRFRF9ISU5USU5HLAotCVRUX0NPTkZJR19PUFRJT05fRk9SQ0VfVU5QQVRFTlRFRF9ISU5USU5HKTogTmV3IGNvbmZpZ3VyYXRpb24gbWFjcm9zCi0JKG5vdCBkZWZpbmVkLCBidXQgaW4gY29tbWVudHMpIGZvciB0aGUgdW5wYXRlbnRlZCBoaW50aW5nIHN5c3RlbS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpCi0JW1RUX0NPTkZJR19PUFRJT05fQ09NUElMRV9VTlBBVEVOVEVEX0hJTlRJTkddOiBOZXcgZWxlbWVudCBgRlRfQm9vbAotCXVucGF0ZW50ZWRfaGludGluZycuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChOT19BUFBMRV9QQVRFTlQsIEFQUExFX1RIUkVTSE9MRCk6Ci0JUmVtb3ZlZC4KLQkoR1VFU1NfVkVDVE9SKTogTmV3IG1hY3JvLgotCShUVF9SdW5fQ29udGV4dCkgW1RUX0NPTkZJR19PUFRJT05fQ09NUElMRV9VTlBBVEVOVEVEX0hJTlRJTkddOgotCVNldCBgYm90aF94X2F4aXMnLgotCSh0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlKQotCVtUVF9DT05GSUdfT1BUSU9OX0NPTVBJTEVfVU5QQVRFTlRFRF9ISU5USU5HXTogVXBkYXRlZC4KLQkoQ3VycmVudF9SYXRpbykgW1RUX0NPTkZJR19PUFRJT05fQ09NUElMRV9VTlBBVEVOVEVEX0hJTlRJTkddOgotCUhhbmRsZSBgdW5wYXRlbnRlZF9oaW50aW5nJy4KLQkoRGlyZWN0X01vdmUpIFtOT19BUFBMRV9QQVRFTlRdOiBSZW1vdmVkLgotCVtUVF9DT05GSUdfT1BUSU9OX0NPTVBJTEVfVU5QQVRFTlRFRF9ISU5USU5HXTogSW5zZXJ0IGFzc2VydGlvbi4KLQkoUHJvamVjdCwgRnJlZVByb2plY3QpCi0JW1RUX0NPTkZJR19PUFRJT05fQ09NUElMRV9VTlBBVEVOVEVEX0hJTlRJTkddOiBJbnNlcnQgYXNzZXJ0aW9uLgotCShDb21wdXRlX0Z1bmNzKSBbVFRfQ09ORklHX09QVElPTl9DT01QSUxFX1VOUEFURU5URURfSElOVElOR106Ci0JSW1wbGVtZW50IHVucGF0ZW50ZWQgaGludGluZy4KLQkoRE9fU1BWVENBLCBET19TRlZUQ0EsIERPX1NQVlRMLCBET19TRlZUTCwgRE9fU1BWRlMsIERPX1NGVkZTLAotCUluc19TRFBWVEwpOiBDYWxsIGBHVUVTU19WRUNUT1InLgotCShET19HUFYsIERPX0dGVikgW1RUX0NPTkZJR19PUFRJT05fQ09NUElMRV9VTlBBVEVOVEVEX0hJTlRJTkddOgotCUhhbmRsZSBgdW5wYXRlbnRlZF9oaW50aW5nJy4KLQkoQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQpIFtOT19BUFBMRV9QQVRFTlRdOiBSZW1vdmVkLgotCVtUVF9DT05GSUdfT1BUSU9OX0NPTVBJTEVfVU5QQVRFTlRFRF9ISU5USU5HXTogSW1wbGVtZW50IHVucGF0ZW50ZWQKLQloaW50aW5nLgotCShNb3ZlX1pwMl9Qb2ludCwgSW5zX1NIUElYLCBJbnNfREVMVEFQLCBJbnNfREVMVEFDKQotCVtUVF9DT05GSUdfT1BUSU9OX0NPTVBJTEVfVU5QQVRFTlRFRF9ISU5USU5HXTogSW1wbGVtZW50IHVucGF0ZW50ZWQKLQloaW50aW5nLgotCShUVF9SdW5JbnMpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMKLQlbVFRfQ09ORklHX09QVElPTl9DT01QSUxFX1VOUEFURU5URURfSElOVElOR106IEluY2x1ZGUKLQlGVF9UUlVFVFlQRV9VTlBBVEVOVEVEX0guCi0JKHR0X2ZhY2VfaW5pdCkgW1RUX0NPTkZJR19PUFRJT05fQ09NUElMRV9VTlBBVEVOVEVEX0hJTlRJTkcsCi0JVFRfQ09ORklHX09QVElPTl9GT1JDRV9VTlBBVEVOVEVEX0hJTlRJTkddOiBDaGVjawotCUZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuaCAoVFRfR3JhcGhpY3NTdGF0ZSkKLQlbVFRfQ09ORklHX09QVElPTl9DT01QSUxFX1VOUEFURU5URURfSElOVElOR106IEFkZCBgYm90aF94X2F4aXMnLgotCi0yMDAzLTA0LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKGhhc2hfYnVja2V0LCBoYXNoX2xvb2t1cCk6IFVzZSBgY29uc3QnIGZvciBmaXJzdAotCWFyZ3VtZW50LgotCShiZGZfZ2V0X2ZvbnRfcHJvcGVydHkpOiBVc2UgYGNvbnN0JyBmb3IgdGhpcmQgYXJndW1lbnQuCi0JVXBkYXRlZCBhbGwgY2FsbGVycy4KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IFNldCBwaXhlbCB3aWR0aCBhbmQgaGVpZ2h0Ci0Jc2ltaWxhciB0byB0aGUgUENGIGRyaXZlci4KLQkqIHNyYy9iZGYvYmRmLmggKF9oYXNobm9kZSk6IFVzZSBgY29uc3QnIGZvciBga2V5Jy4KLQlVcGRhdGVkLgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYzogQysrIGRvZXNuJ3QgbGlrZSB0aGF0IHRoZSBhcnJheSBgaW5mbGF0ZV9tYXNrJwotCWlzIGRlY2xhcmVkIHR3aWNlLiAgSXQgaXMgcGVyaGFwcyBiZXR0ZXIgdG8gbW9kaWZ5IHRoZSB6bGliIHNvdXJjZQotCWZpbGVzIGRpcmVjdGx5IGluc3RlYWQgb2YgdGhpcyBoYWNrLgotCSh6Y2FsbG9jLCB6ZnJlZSwgZnRfZ3ppcF9zdHJlYW1fY2xvc2UsIGZ0X2d6aXBfc3RyZWFtX2lvKTogQWRkIGNhc3RzCi0JdG8gbWFrZSBidWlsZCB3aXRoIGcrKyBzdWNjZXNzZnVsLgotCi0yMDAzLTA0LTI0ICBNYW5pc2ggU2luZ2ggIDx5b3NoQGdpbXAub3JnPgotCi0JKiBzcmMvY2lkL2NpZG9ianMuYyAoY2lkX2ZhY2VfaW5pdCksIHNyYy90eXBlMS90MW9ianMuYwotCShUMV9GYWNlX0luaXQpLCBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCk6IFNwbGl0IG9uIGAtJwotCWFsc28gZm9yIHNlYXJjaGluZyB0aGUgc3R5bGUgbmFtZS4KLQotMjAwMy0wNC0yNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2xvYWRfZm9udCk6IEZpeGVkIHRoZSBjb21wdXRhdGlvbiBvZgotCWZhY2UtPm51bV9nbHlwaHMuICBXZSBtdXN0IGluY3JlYXNlIHRoZSB2YWx1ZSBieSAxIHRvIHJlc3BlY3QgdGhlCi0JY29udmVudGlvbiB0aGF0IGdseXBoIGluZGV4IDAgYWx3YXlzIGNvcnJlc3BvbmRzIHRvIHRoZSBgbWlzc2luZwotCWdseXBoJy4KLQotMjAwMy0wNC0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC91bml4LWNjLmluIChDRkxBR1MpOiBBZGQgQENQUEZMQUdTQC4KLQotMjAwMy0wNC0yNCAgRGlldGVyIEJhcm9uICA8ZGlsbG9AbmV0YnNkLm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluIChjZmxhZ3MpOiBFbWl0IEZyZWVUeXBlIDIncyBpbmNsdWRlCi0JZmlsZXMgZmlyc3QuICBPdGhlcndpc2UgdGhlcmUgYXJlIGNvbmZsaWN0cyB3aXRoIEZyZWVUeXBlIDEKLQlpbnN0YWxsZWQgc2ltdWx0YW5lb3VzbHkuCi0KLTIwMDMtMDQtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeGluZyBidWdzIHJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2VyLmMgKEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlIGBpbl9wYXRoJy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzIChmdF9nbHlwaHNsb3Rfc2V0X2JpdG1hcCk6IENoYW5nZSB0eXBlIG9mCi0Jc2Vjb25kIGFyZ3VtZW50IHRvIGBGVF9CeXRlKicuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oOiBVcGRhdGVkLgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3JlYWRzdHJlYW0pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGByZXMnLgotCShfYmRmX3BhcnNlX2dseXBocyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYG5leHQnLgotCU1hcmsgYGNhbGxfZGF0YScgYXMgdW51c2VkLgotCi0JKiBzcmMvY2FjaGUvZnRscnUuYyAoRlRfTHJ1TGlzdF9Mb29rdXApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCi0JYHBsYXN0Jy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUpOiBTbGlnaHQgcmVjb2RpbmcgdG8KLQlhY3R1YWxseSB1c2UgYGVycm9yJy4KLQkocGNmX2xvYWRfZm9udCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGF2Z3cnLgotCi0JKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfZ2V0X2tlcm5pbmcpOiBDaGFuZ2UgcmV0dXJuIHR5cGUKLQl0byBgdm9pZCcuCi0JTWFyayBgZXJyb3InIGFzIHVudXNlZC4KLQkqIHNyYy9wZnIvcGZyb2Jqcy5oOiBVcGRhdGVkLgotCSogc3JjL3Bmci9wZnJkcml2ci5jIChwZnJfZ2V0X2tlcm5pbmcpOiBVcGRhdGVkLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoc2ZudF9kaXJfY2hlY2spOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCi0JYGZvcm1hdF90YWcnLgotCi0JKiBzcmMvc2ZudC90dGNtYXAwLmMgKHR0X2NtYXA2X3ZhbGlkYXRlLCB0dF9jbWFwMTBfdmFsaWRhdGUpOiBSZW1vdmUKLQl1bnVzZWQgdmFyaWFibGUgYHN0YXJ0Jy4KLQkodHRfY21hcDEwX2NoYXJfbmV4dCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYHJlc3VsdCcKLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHR0X2ZhY2VfZ2V0X25hbWUpOiBNYXJrIGBlcnJvcicgYXMgdW51c2VkLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChnZXRfc2ZudF9wb3N0c2NyaXB0X25hbWUpOiBNYXJrIGBlcnJvcicgYXMKLQl1bnVzZWQuCi0KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQotCWBwc2hpbnRlcicuCi0KLQkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX0xvYWRfR2x5cGgpOiBVc2UgYGdseXBoX2RhdGFfbG9hZGVkJwotCW9ubHkgZm9yIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwuCi0KLTIwMDMtMDQtMjMgIEFraXRvIEhpcmFpICA8YWtpdG9Aa2RlLmdyLmpwPgotCi0JKiBzcmMvc2ZudC90dGNtYXAwLmMgKHR0X2NtYXA0X3ZhbGlkYXRlKTogUHJvdmlkZSBhIHdlYWsgdmFyaWFudAotCW9mIHRoZSBnbHlwaCBJRCBib3VuZGluZyBjaGVjayBpZiBGVF9WQUxJREFURV9USUdIVCBpcyBub3QgYWN0aXZlLgotCVdpdGhvdXQgdGhpcyBjaGFuZ2UsIG1hbnkgQ0pLIGZvbnRzIGZyb20gRHluYWxhYiBhcmUgcmVqZWN0ZWQuCi0KLTIwMDMtMDQtMjMgIEpvZSBNYXJjdXMgQ2xhcmtlICA8bWFyY3VzQEZyZWVCU0Qub3JnPgotCi0JKiBzcmMvYmFzZS9mdGJkZi5jIChGVF9HZXRfQkRGX1Byb3BlcnR5KTogQ2hlY2sgZm9yIHZhbGlkCi0JYGdldF9pbnRlcmZhY2UnLgotCi0yMDAzLTA0LTIzICBQYXVsIE1pbGxlciAgPHBhdWxtQHByb2ZvdW5kZWZmZWN0cy5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKHBhcnNlX2ZvbmQpOiBGaXggaGFuZGxpbmcgb2Ygc3R5bGUgbmFtZXMuCi0KLTIwMDMtMDQtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Bmci9wZnJsb2FkLmMgKHBmcl9leHRyYV9pdGVtX2xvYWRfZm9udF9pZCk6IFVzZSBGVF9QdHJEaXN0Ci0JaW5zdGVhZCBvZiBGVF9VSW50IGZvciBgbGVuJy4KLQotMjAwMy0wNC0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYyAoemNhbGxvYykgWyFGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCXToKLQlDb252ZXJ0IEsmUiBmb3JtYXQgdG8gbW9kZXJuIEMgdXNhZ2UuCi0JKEZUX1N0cmVhbV9PcGVuR3ppcCk6IFVzZSBsb25nIGNvbnN0YW50LgotCi0yMDAzLTA0LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChmdGNfY2FjaGVfbG9va3VwKTogUmVtb3ZlIHNoYWRvdyBkZWNsYXJhdGlvbgotCW9mIGBtYW5hZ2VyJy4KLQotMjAwMy0wNC0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2MvSU5TVEFMTC5VTlg6IENsZWFuZWQgdXAuCi0KLTIwMDMtMDQtMDkgIFRvcnJleSBMeW9ucyAgPHRvcnJleUBtcmNsYS5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKG9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IFJlbW92ZWQgYSBkb3VibGUtZnJlZQotCWJ1ZyB0aGF0IGhhZCBuYXN0eSBjb25zZXF1ZW5jZXMgd2hlbiB0cnlpbmcgdG8gb3BlbiBhbiBgaW52YWxpZCcKLQlmb250IG9uIGEgTWFjLgotCi0yMDAzLTA0LTA5ICBNaWtlIEZhYmlhbiAgPG1mYWJpYW5Ac3VzZS5kZT4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5oIChCREZfZW5jb2RpbmdfZWwpLCBzcmMvcGNmL3BjZi5oCi0JKFBDRl9FbmNvZGluZ1JlYyk6IENoYW5nZWQgRlRfU2hvcnQgdG8gRlRfVVNob3J0IGluIG9yZGVyIHRvIGJlIGFibGUKLQl0byBhY2Nlc3MgbW9yZSB0aGFuIDMyNzY4IGdseXBocyBpbiBmb250cy4KLQotMjAwMy0wNC0wOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4xLjQgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLTIwMDMtMDQtMDMgIE1hcnRpbiBNdXNrZW5zICA8bW11c2tlbnNAYXVyZWxvbi5jb20+Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfT3Blbl9GYWNlKTogRml4ZWQgdGhlIGNvZGUgdG8gbWFrZSBpdAotCWhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGEgZm9udCBvbmx5IGNvbnRhaW5zIGEgYC5ub3RkZWYnIGdseXBoCi0JKGhhcHBlbnMgaW4gUERGLWVtYmVkZGVkIGZvbnRzKS4gIE90aGVyd2lzZSwgRlRfUGFuaWMgd2FzIGNhbGxlZC4KLQotMjAwMy0wMy0yNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBSRUFETUU6IFVwZGF0ZWQuCi0KLQkqIFJFQURNRS5VTlg6IFJlbW92ZWQgKG5vdyByZXBsYWNlZCBieSBkb2NzL0lOU1RBTEwuVU5YKS4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28zLmM6IFRoZSBoaW50ZXIgbm93IHBlcmZvcm1zIGFzIGluIDIuMS4zIGFuZAotCXdpbGwgaWdub3JlIHN0ZW0gcXVhbnRpemF0aW9uIG9ubHkgd2hlbiBGVF9MT0FEX1RBUkdFVF9TTU9PVEggaXMKLQl1c2VkLgotCShwc2gzX2RpbWVuc2lvbl9xdWFudGl6ZV9sZW4pOiBFbmFibGVkLgotCShwc2gzX2hpbnRfYWxpZ24pOiBFbmFibGUgY29tbWVudGVkIGNvZGUuCi0JKHBzaDNfaGludF9hbGlnbl9saWdodCk6IENvbW1lbnRlZCBvdXQuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfQ2hhcl9TaXplKTogQ2hhbmdlZCB0aGUgZGVmYXVsdAotCWNvbXB1dGF0aW9ucyB0byBpbmNsdWRlIHJvdW5kaW5nIGluIGFsbCBjYXNlczsgdGhpcyBpcyByZXF1aXJlZCB0bwotCXByb3ZpZGUgYWNjdXJhdGUga2VybmluZyBkYXRhIHdoZW4gbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgaXMKLQllbmFibGVkLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKGlzX25hbWVfY2hhcik6IFRoZSBUeXBlIDEgbG9hZGVyIG5vdyBhY2NlcHRzCi0JbW9yZSBnZW5lcmFsIG5hbWVzIGFjY29yZGluZyB0byB0aGUgUG9zdFNjcmlwdCBzcGVjaWZpY2F0aW9uICh0aGUKLQlwcmV2aW91cyBvbmUgd2FzIHRvbyByZXN0cmljdGl2ZSkuCi0JKHBhcnNlX2ZvbnRfbmFtZSwgcGFyc2VfZW5jb2RpbmcsIHBhcnNlX2NoYXJzdHJpbmdzLCBwYXJzZV9kaWN0KToKLQlVc2UgYGlzX25hbWVfY2hhcicuCi0JKHBhcnNlX3N1YnJzKTogSGFuZGxlIGVtcHR5IGFycmF5cy4KLQotMjAwMy0wMy0yMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JU2VyaW91cyByZXdyaXRpbmcgb2YgdGhlIGRvY3VtZW50YXRpb24uCi0KLQkqIGRvY3MvQlVHUywgZG9jcy9CVUlMRDogUmVtb3ZlZC4KLQkqIGRvY3MvREVCVUcuVFhUOiBSZW5hbWVkIHRvLi4uCi0JKiBkb2NzL0RFQlVHOiBUaGlzLgotCSogZG9jcy9DVVNUT01JWkUsIGRvY3MvVFJVRVRZUEUsIGRvY3MvVVBHUkFERS5VTlg6IE5ldyBmaWxlcy4KLQkqIGRvY3MvSU5TVEFMTC5BTlksIGRvY3MvSU5TVEFMTC5VTlgsIGRvY3MvSU5TVEFMTC5HTlUgTmV3IGZpbGVzLAotCWNvbnRhaW5pbmcgcGxhdGZvcm0gc3BlY2lmaWMgaW5mb3JtYXRpb24gcHJldmlvdXNseSBpbiBJTlNUQUxMLgotCSogZG9jcy9yZWFkbWUudm1zOiBSZW5hbWVkIHRvLi4uCi0JKiBkb2NzL0lOU1RBTEwuVk1TOiBUaGlzLgotCi0JKiBkb2NzLyo6IFVwZGF0ZWQuCi0KLQlJbnRyb2R1Y2VkIHRocmVlIG5ldyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGdseXBoIGJpdG1hcHMgd2l0aGluCi0JRlRfR2x5cGhTbG90IG9iamVjdHM6Ci0KLQkgIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcAotCSAgZnRfZ2x5cGhzbG90X2FsbG9jX2JpdG1hcAotCSAgZnRfZ2x5cGhzbG90X3NldF9iaXRtYXAKLQotCVRoZXNlIGZ1bmN0aW9ucyBhcmUgbXVjaCBtb3JlIGNvbnZlbmllbnQgdG8gdXNlIHRoYW4gbWFuYWdpbmcgdGhlCi0JRlRfR0xZUEhfT1dOX0JJVE1BUCBmbGFnIG1hbnVhbGx5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAsCi0JZnRfZ2x5cGhzbG90X2FsbG9jX2JpdG1hcCwgZnRfZ2x5cGhzbG90X3NldF9iaXRtYXApOiBOZXcgZnVuY3Rpb25zLgotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEltcGxlbWVudCB0aGVtLgotCShmdF9nbHlwaHNsb3RfZG9uZSk6IFVzZSBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0dseXBoX0xvYWQpLCBzcmMvcGNmL3BjZmRyaXZlci5jCi0JKFBDRl9HbHlwaF9Mb2FkKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgbWVtb3J5Jy4KLQlVc2UgYGZ0X2dseXBoc2xvdF8qJyBmdW5jdGlvbnMuCi0JRG9uJ3Qgc2V0IGBGVF9HTFlQSF9PV05fQklUTUFQJy4KLQotCSogc3JjL3Bmci9wZnJzYml0LmMgKHBmcl9zbG90X2xvYWRfYml0bWFwKTogVXNlCi0JYGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXAnLgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAoTG9hZF9TQml0X0ltYWdlKTogQ2hhbmdlIDV0aCBhcmd1bWVudCB0byB0eXBlCi0JYEZUX0dseXBoU2xvdCcuCi0JQWRkaW5nIGFyZ3VtZW50IGBkZXB0aCcgdG8gaGFuZGxlIHJlY3Vyc2l2ZSBjYWxscy4KLQlVc2UgYGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXAnLgotCSh0dF9mYWNlX2xvYWRfc2JpdF9pbWFnZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYG1lbW9yeScuCi0JRG9uJ3QgaGFuZGxlIGBGVF9HTFlQSF9PV05fQklUTUFQJy4KLQlVcGRhdGUgY2FsbCB0byBMb2FkX1NCaXRfSW1hZ2UuCi0KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChmdF9nbHlwaHNsb3RfY2xlYXIpOiBSZW5hbWVkIHRvLi4uCi0JKHQ0Ml9nbHlwaHNsb3RfY2xlYXIpOiBUaGlzLiAgVXBkYXRlZCBjYWxsZXIuCi0JQ2FsbCBgZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwJy4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfTG9hZF9HbHlwaCk6IFVzZQotCWBmdF9nbHlwaHNsb3Rfc2V0X2JpdG1hcCcuCi0JRG9uJ3QgaGFuZGxlIGBGVF9HTFlQSF9PV05fQklUTUFQJy4KLQotCSogc3JjL2NhY2hlL2Z0bHJ1LmMgKEZUX0xydUxpc3RfTG9va3VwKTogRml4ZWQgYW4gaW52YWxpZCBhc3NlcnRpb24KLQljaGVjay4KLQotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYyAoYWhfb3V0bGluZV9sb2FkKTogQWRkIHR3byBzY2FsaW5nCi0JYXJndW1lbnRzLgotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguaDogVXBkYXRlZC4KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfaGludGVyX2xvYWQpOiBVcGRhdGVkLgotCSogc3JjL2F1dG9oaW50L2FoZ2xvYmFsLmMgKGFoX2hpbnRlcl9jb21wdXRlX3dpZHRocyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChmdGNfZmFtaWx5X2RvbmUpOiBGaXhlZCBzbWFsbCBidWcgdGhhdCBjb3VsZAotCWNyYXNoIHRoZSBjYWNoZSBpbiByYXJlIGNpcmN1bXN0YW5jZXMgKG1vc3RseSB3aXRoIGJyb2tlbiBmb250cykuCi0KLTIwMDMtMDMtMTUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKFNldF9DaGFyX1NpemVzKTogRml4ZWQgYSBzbWFsbCByb3VuZGluZwotCWJ1Zy4gIEFjdHVhbGx5LCBpdCBzZWVtcyB0aGF0IHByZXZpb3VzIHZlcnNpb25zIG9mIEZyZWVUeXBlIGRpZG4ndAotCXBlcmZvcm0gVHJ1ZVR5cGUgcm91bmRpbmcgZXhhY3RseSBhcyBhcHByb3ByaWF0ZS4KLQotMjAwMy0wMy0xNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoU2V0X0NoYXJfU2l6ZXMpOiBGaXhpbmcgdGhlIHNtYWxsCi0JVHJ1ZVR5cGUgbmF0aXZlIHJlbmRlcmluZyBnbGl0Y2hlczsgdGhleSBjYW1lIGZyb20gYSBzbWFsbCByb3VuZGluZwotCWVycm9yLgotCi0yMDAzLTAzLTEzICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlBZGRlZCBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGNvbnRyb2wgbWVtb3J5IGRlYnVnZ2luZyB3aXRoCi0JRnJlZVR5cGUuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGBGVDJfREVCVUdfTUVNT1JZJywKLQlgRlQyX0FMTE9DX1RPVEFMX01BWCcgYW5kIGBGVDJfQUxMT0NfQ09VTlRfTUFYJyBpbiBERUJVRy5UWFQuCi0KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKEZUX01lbVRhYmxlUmVjKTogQWRkIGBhbGxvY19jb3VudCcsCi0JYGJvdW5kX3RvdGFsJywgYGFsbG9jX3RvdGFsX21heCcsIGBib3VuZF9jb3VudCcsIGBhbGxvY19jb3VudF9tYXgnLgotCShmdF9tZW1fZGVidWdfYWxsb2MpOiBIYW5kbGUgbmV3IHZhcmlhYmxlcy4KLQkoZnRfbWVtX2RlYnVnX2luaXQpOiBzL0ZUX0RFQlVHX01FTU9SWS9GVDJfREVCVUdfTUVNT1JZLy4KLQlIYW5kbGUgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQkqIGRvY3MvREVCVUcuVFhUOiBVcGRhdGVkLgotCi0JRml4ZWQgdGhlIGNhY2hlIHN1Yi1zeXN0ZW0gdG8gY29ycmVjdGx5IGRlYWwgd2l0aCBvdXQtb2YtbWVtb3J5Ci0JY29uZGl0aW9ucy4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKGZ0Y19ub2RlX2Rlc3Ryb3kpOiBDb21tZW50IG91dCBnZW5lcmljCi0JY2hlY2suCi0JKGZ0Y19jYWNoZV9sb29rdXApOiBJbXBsZW1lbnQgbG9vcC4KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmM6IERlZmluZSBGVF9DT01QT05FTlQuCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3NiaXRfbm9kZV9sb2FkKTogSGFuZGxlCi0JRlRfRXJyX091dF9PZl9NZW1vcnkuCi0JKiBzcmMvY2FjaGUvZnRscnUuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ILgotCShGVF9McnVMaXN0X0xvb2t1cCk6IEltcGxlbWVudCBsb29wLgotCi0JKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfZG9uZSk6IEZpeCBtZW1vcnkgbGVhay4KLQkocGZyX2ZhY2VfaW5pdCk6IEZpeGluZyBjb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChyZWFsbG9jYXRlX3QxX3RhYmxlKTogRml4ZWQgYSBidWcgKG1lbW9yeQotCWxlYWspIHRoYXQgb25seSBoYXBwZW5lZCB3aGVuIGEgdHJ5IHRvIHJlc2l6ZSBhbiBhcnJheSB3b3VsZCBlbmQgaW4KLQlhbiBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbi4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfY29udmVydF9nbHlwaCk6IFJlbW92ZWQgY29tcGlsZXIKLQl3YXJuaW5ncyAvIHZvbGF0aWxlIGJ1Zy4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9nbHlwaHpvbmVfZG9uZSk6IFJlbW92ZWQgc2VnbWVudGF0aW9uCi0JZmF1bHQgdGhhdCBoYXBwZW5lZCBpbiB0aWdodCBtZW1vcnkgZW52aXJvbm1lbnRzLgotCi0yMDAzLTAyLTI4ICBQaXhlbCAgPHBpeGVsQG1hbmRyYWtlc29mdC5jb20+Ci0KLQkqIHNyYy9nemlwL2Z0Z3ppcC5jIChmdF9nemlwX2ZpbGVfZG9uZSk6IEZpeGVkIG1lbW9yeSBsZWFrOiBUaGUgWkxpYgotCXN0cmVhbSB3YXMgbm90IHByb3Blcmx5IGZpbmFsaXplZC4KLQotMjAwMy0wMi0yNSAgQW50aG9ueSBGb2sgIDxhbnRob255QHRoaXpsaW51eC5jb20+Ci0KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmM6IEluY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0guCi0JKGZ0Y19jbWFwX2ZhbWlseV9pbml0KTogVGhlIGNtYXAgY2FjaGUgbm93Ci0Jc3VwcG9ydHMgVUNTLTQgY2hhcm1hcHMgd2hlbiBhdmFpbGFibGUgaW4gQXNpYW4gZm9udHMuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jLCBzcmMvYmFzZS9mdG9ianMuYzogQ2hhbmdlZCBgYXNpYW4nIHRvIGBBc2lhbicKLQlpbiBjb21tZW50cy4KLQotMjAwMy0wMi0yNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYyAoZnRfZ3ppcF9maWxlX2ZpbGxfb3V0cHV0KTogRml4ZWQgYSBidWcgdGhhdAotCWNhdXNlZCBGcmVlVHlwZSB0byBsb29wIGVuZGxlc3NseSB3aGVuIHRyeWluZyB0byByZWFkIGNlcnRhaW4KLQljb21wcmVzc2VkIGd6aXAgZmlsZXMuICBUaGUgZm9sbG93aW5nIHRlc3QgcmV2ZWFscyB0aGUgYnVnOgotCi0JICB0b3VjaCAwMTIzNDU2Nzg5IDsgZ3ppcCAwMTIzNDU2Nzg5IDsgZnRkdW1wIDAxMjM0NTY3ODkuZ3oKLQotCVNldmVyYWwgZml4ZXMgdG8gdGhlIFBGUiBmb250IGRyaXZlcjoKLQotCS0gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGVtYmVkZGVkIGJpdG1hcHMgd2FzIG5vdCBjb3JyZWN0bHkgc2V0IGluCi0JICB0aGUgcm9vdCBGVF9GYWNlUmVjIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBmYWNlLgotCi0JLSBUaGUgZ2x5cGggbG9hZGVyIGFsd2F5cyB0cmllZCB0byBsb2FkIHRoZSBvdXRsaW5lcyB3aGVuCi0JICBGVF9MT0FEX1NCSVRTX09OTFkgd2FzIHNwZWNpZmllZC4KLQotCS0gVGhlIHRhYmxlIGxvYWRlZCBub3cgc2NhbnMgZm9yICp1bmRvY3VtZW50ZWQqIGVsZW1lbnRzIG9mIGEKLQkgIHBoeXNpY2FsIGZvbnQncyBhdXhpbGlhcnkgZGF0YSByZWNvcmQuICBUaGlzIGlzIG5lY2Vzc2FyeSB0bwotCSAgcmV0cmlldmUgdGhlIGByZWFsJyBmYW1pbHkgYW5kIHN0eWxlIG5hbWVzLgotCi0JTk9URSBUSEFUIFRIRVNFIENIQU5HRVMgVEhFIEZBTUlMWSBOQU1FIE9GIE1BTlkgUEZSIEZPTlRTIQotCi0JKiBzcmMvcGZyL3BmcmxvYWQuYyAocGZyX2F1eF9uYW1lX2xvYWQpOiBOZXcgZnVuY3Rpb24uCi0JKHBmcl9waHlfZm9udF9kb25lKTogRnJlZSBgZmFtaWx5X25hbWUnIGFuZCBgc3R5bGVfbmFtZScgYWxzby4KLQlSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkocGZyX3BoeV9mb250X2xvYWQpOiBFeHRyYWN0IHVzZWZ1bCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhdXhpbGlhcnkKLQlieXRlcy4KLQotCSogc3JjL3Bmci9wZnJvYmpzLmMgKHBmcl9mYWNlX2RvbmUpOiBTZXQgcG9pbnRlcnMgdG8gTlVMTC4KLQkocGZyX2ZhY2VfaW5pdCk6IFByb3ZpZGUgZmFsbGJhY2sgdmFsdWVzIGZvciBgZmFtaWx5X25hbWUnIGFuZAotCWBzdHlsZV9uYW1lJy4KLQlIYW5kbGUgc3RyaWtlcy4KLQkocGZyX3Nsb3RfbG9hZCk6IEhhbmRsZSBGVF9MT0FEX1NCSVRTX09OTFkuCi0JKiBzcmMvcGZyL3BmcnR5cGVzLmggKFBGUl9QaHlGb250UmVjKTogQWRkIGZpZWxkcyBgYXNjZW50JywKLQlgZGVzY2VudCcsIGBsZWFkaW5nJywgYGZhbWlseV9uYW1lJywgYW5kIGBzdHlsZV9uYW1lJy4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKFNldF9DaGFyX1NpemVzKTogRml4ZWQgYSByb3VuZGluZyBidWcKLQl3aGVuIGNvbXB1dGluZyB0aGUgc2NhbGUgZmFjdG9ycyBmb3IgYSBnaXZlbiBjaGFyYWN0ZXIgc2l6ZSBpbgotCXBvaW50cyB3aXRoIHJlc29sdXRpb24uCi0KLQkqIGRldmVsL2Z0MmJ1aWxkLmgsIGRldmVsL2Z0b3B0aW9uLmg6IE5ldyBmaWxlcyAoaW4gYSBuZXcgZGlyZWN0b3J5KQotCXdoaWNoIGFyZSBzcGVjaWFsIGRldmVsb3BtZW50IHZlcnNpb25zIG9mIGluY2x1ZGUvZnQyYnVpbGQuaCBhbmQKLQlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oLCByZXNwZWN0aXZlbHkuCi0KLTIwMDMtMDItMTggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUZpeGluZyB0aGUgc2xpZ2h0IGRpc3RvcnRpb24gcHJvYmxlbSB0aGF0IG9jY3VycmVkIGR1ZSB0byB0aGUgbGF0ZXN0Ci0JYXV0by1oaW50ZXIgY2hhbmdlcy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X3JlY29tcHV0ZV9zY2FsZWRfbWV0cmljcyk6IEZpeCByb3VuZGluZy4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKFNldF9DaGFyX1NpemVzKTogTmV3IHZhcmlhYmxlIGBtZXRyaWNzMicuCi0JWyFUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSXTogUmVtb3ZlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5oIChUVF9TaXplUmVjKTogTmV3IGZpZWxkIGBtZXRyaWNzJy4KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAoUmVzZXRfT3V0bGluZV9TaXplKTogRml4IGluaXRpYWxpemF0aW9uIG9mCi0JYG1ldHJpY3MnLgotCVtGVF9DT05GSUdfQ0hFU1RFUl9BU0NFTkRFUl06IENvZGUgcmVtb3ZlZC4KLQkoUmVzZXRfU0JpdF9TaXplKTogRml4IGluaXRpYWxpemF0aW9uIG9mIGBtZXRyaWNzJy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX0xvYWRfQ29udGV4dCk6IEZpeCBpbml0aWFsaXphdGlvbiBvZgotCWBleGVjLT5tZXRyaWNzJy4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfbG9hZCk6IERpc2FibGVkIHRoZSBhZHZhbmNlIHdpZHRoCi0JYGNvcnJlY3Rpb24nIHdoaWNoIHNlZW1lZCB0byBwcm92aWRlIG1vcmUgdHJvdWJsZSB0aGFuIGJlbmVmaXRzLgotCi0yMDAzLTAyLTEzICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQlDaGFuZ2VkIHRoZSBpbmNyZW1lbnRhbCBsb2FkaW5nIGludGVyZmFjZSBpbiBhIHdheSB0aGF0IG1ha2VzIGl0Ci0Jc2ltcGxlciBhbmQgYWxsb3dzIGdseXBoIG1ldHJpY3MgdG8gYmUgY2hhbmdlZCAoZS5nLiwgYnkgYWRkaW5nIGEKLQljb25zdGFudCwgYXMgcmVxdWlyZWQgYnkgQ0ZGIGZvbnRzKSByYXRoZXIgdGhhbiBqdXN0IG92ZXJyaWRkZW4uCi0JVGhpcyB3YXMgcmVxdWlyZWQgdG8gbWFrZSB0aGUgR2hvc3RTY3JpcHQtdG8tRnJlZVR5cGUgYnJpZGdlIHdvcmsuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCkgW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOgotCUFsbG93IG1ldHJpY3MgdG8gYmUgb3ZlcnJpZGRlbi4KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX2xvYWRfZ2x5cGgpIFtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXToKLQlEaXR0by4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCkKLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IFNpbXBsaWZ5LgotCShjb21wdXRlX2dseXBoX21ldHJpY3MpIFtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogQ29kZSBibG9jawotCW1vdmVkIGRvd24uCi0KLQkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX1BhcnNlX0dseXBoX0FuZF9HZXRfQ2hhcl9TdHJpbmcpCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmg6IFVwZGF0ZWQuCi0KLTIwMDMtMDEtMzEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogZG9jcy9DSEFOR0VTLCBkb2NzL1ZFUlNJT04uRExMLCBkb2NzL1RPRE86IFVwZGF0aW5nIGRvY3VtZW50YXRpb24KLQlmb3IgdGhlIDIuMS40IHJlbGVhc2UuCi0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sOiBVcGRhdGluZyB0aGUgcHJvamVjdCBmaWxlIGZvcgotCTIuMS40LgotCi0JKiBzcmMvZ3ppcC9hZGxlcjMyLmMsIHNyYy9nemlwL2Z0Z3ppcC5jLCBzcmMvZ3ppcC9pbmZibG9jay5jLAotCXNyYy9nemlwL2luZmNvZGVzLmMsIHNyYy9nemlwL2luZmxhdGUuYywgc3JjL2d6aXAvaW5mdHJlZXMuYywKLQlzcmMvZ3ppcC9pbmZ1dGlsLmM6IFJlbW92ZWQgb2xkLXN0eWxlIChLJlIpZnVuY3Rpb24gZGVmaW5pdGlvbnMuCi0JVGhpcyBhdm9pZHMgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrIGF0IGl0cyBtb3N0IHBlZGFudGljIG1vZGUuCi0KLQkqIHNyYy9wZnIvcGZyc2JpdC5jOiBSZW1vdmVkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvY2FjaGUvZnRjY21hcC5jIChmdGNfY21hcF9mYW1pbHlfaW5pdCk6IENoYW5nZWQgYW4gRlRfRVJST1IKLQlpbnRvIGFuIEZUX1RSQUNFMSBzaW5jZSBpdCBjYXVzZWQgYGZ0dmlldycgYW5kIG90aGVycyB0byBkdW1wIHRvbwotCW11Y2gganVuayB3aGVuIHRyeWluZyB0byBkaXNwbGF5IGEgd2F0ZXJmYWxsIHdpdGggYSBmb250IHdpdGhvdXQgYQotCVVuaWNvZGUgY2hhcm1hcCAoZS5nLiAgU1lNQk9MLlRURikuCi0KLQlJbXBsZW1lbnRlZCBGVF9DT05GSUdfQ0hFU1RFUl9CTFVFX1NDQUxFLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0Ci0JcGF0Y2ggZnJvbSBEYXZpZCBDaGVzdGVyLCBidXQgd2l0aCBhIG11Y2ggc2ltcGxlciAoYW5kIHNhbmVyKQotCWltcGxlbWVudGF0aW9uLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRlcl9sb2FkX2dseXBoKQotCVtGVF9DT05GSUdfQ0hFU1RFUl9CTFVFX1NDQUxFXTogVHJ5IHRvIG9wdGltaXplIHRoZSB5X3NjYWxlIHNvIHRoYXQKLQl0aGUgdG9wIG9mIG5vbi1jYXBpdGFsIGxldHRlcnMgaXMgYWxpZ25lZCBvbiBhIHBpeGVsIGJvdW5kYXJ5Ci0Jd2hlbmV2ZXIgcG9zc2libGUuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfQ2hhcl9TaXplKQotCVtGVF9DT05GSUdfQ0hFU1RFUl9CTFVFX1NDQUxFXTogUm91bmQgZGlmZmVyZW50bHkuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoU2V0X0NoYXJfU2l6ZXMpCi0JW1RUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVJdOiBEbyBzb21lIHJvdW5kaW5nIG9ubHkKLQlpZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAoUmVzZXRfT3V0bGluZV9TaXplKQotCVtGVF9DT05GSUdfQ0hFU1RFUl9BU0NFTkRFUl06IFJvdW5kIGRpZmZlcmVudGx5LgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzMuYzogSW1wcm92ZWQgdGhlIFBvc3RzY3JpcHQgaGludGVyLiAgR2V0dGluZwotCXJpZCBvZiBzdGVtIHNuYXBwaW5nIHNlZW1zIHRvIHdvcmsgd2VsbCBoZXJlICh0aG91Z2ggdGhlIHN0ZW1zIGFyZQotCXN0aWxsIHNsaWdodGx5IG1vdmVkIHRvIGluY3JlYXNlIGNvbnRyYXN0KS4KLQkocHNoM19kaW1lbnNpb25fcXVhbnRpemVfbGVuKTogQ29tbWVudGVkIG91dC4KLQkocHNoM19oaW50X2FsaWduX2xpZ2h0KTogTmV3IGZ1bmN0aW9uLgotCShwc2gzX2hpbnRfYWxpZ24pOiBDb21tZW50IG91dCBzb21lIGNvZGUuCi0KLQlUSElTIElNUFJPVkVTIEFOVEktQUxJQVNFRCBSRU5ERVJJTkcsIEJVVCBNT05PQ0hST01FIEFORCBMQ0QgTU9ERVMKLQlTVElMTCBTVUNLLgotCi0yMDAzLTAxLTIyICBEYXZpZCBDaGVzdGVyICA8ZGF2aWRjaGVzdGVyQHFteC5uZXQ+Ci0KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfY29tcHV0ZV9zdGVtX3dpZHRoKTogU21hbGwgZml4IHRvIHRoZQotCXN0ZW0gd2lkdGggb3B0aW1pemF0aW9uLgotCi0yMDAzLTAxLTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlBZGRpbmcgYSBuZXcgQVBJIGBGVF9HZXRfQkRGX1Byb3BlcnR5JyB0byByZXRyaWV2ZSB0aGUgQkRGCi0JcHJvcGVydGllcyBvZiBhIGdpdmVuIFBDRiBvciBCREYgZm9udC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oIChCREZfUHJvcGVydHlUeXBlKTogTmV3IGVudW1lcmF0aW9uLgotCShCREZfUHJvcGVydHksIEJERl9Qcm9wZXJ0eVJlYyk6IE5ldyBzdHJ1Y3R1cmUuCi0JRlRfR2V0X0JERl9Qcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvYmRmdHlwZXMuaDogSW5jbHVkZSBGVF9CREZfSC4KLQkoQkRGX0dldFByb3BlcnR5RnVuYyk6IE5ldyBmdW5jdGlvbiBwb2ludGVyLgotCi0JKiBzcmMvYmFzZS9mdGJkZi5jICh0ZXN0X2ZvbnRfdHlwZSk6IE5ldyBoZWxwZXIgZnVuY3Rpb24uCi0JKEZUX0dldF9CREZfQ2hhcnNldF9JRCk6IFVzZSBgdGVzdF9mb250X3R5cGUnLgotCShGVF9HZXRfQkRGX1Byb3BlcnR5KTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmM6IEluY2x1ZGUgRlRfQkRGX0guCi0JKGJkZl9nZXRfYmRmX3Byb3BlcnR5LCBiZGZfZHJpdmVyX3JlcXVlc3Rlcik6IE5ldyBmdW5jdGlvbnMuCi0JKGJkZl9kcml2ZXJfY2xhc3MpOiBVc2UgYGJkZl9kcml2ZXJfcmVxdWVzdGVyJy4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jOiBJbmNsdWRlIEZUX0JERl9ILgotCShwY2ZfZ2V0X2JkZl9wcm9wZXJ0eSwgcGNmX2RyaXZlcl9yZXF1ZXN0ZXIpOiBOZXcgZnVuY3Rpb25zCi0JKHBjZl9kcml2ZXJfY2xhc3MpOiBVc2UgYHBjZl9kcml2ZXJfcmVxdWVzdGVyJy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmM6IEluY2x1ZGUgYHBjZnJlYWQuaCcuCi0JKHBjZl9maW5kX3Byb3BlcnR5KTogRGVjb3JhdGUgaXQgd2l0aCBGVF9MT0NBTF9ERUYuCi0JKiBzcmMvcGNmL3BjZnJlYWQuaDogTmV3IGZpbGUsIHByb3ZpZGluZyBgcGNmX2ZpbmRfcHJvcGVydHknLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoc2ZudF9kaXJfY2hlY2spOiBSZWxheGVkIHRoZSBgaGVhZCcgdGFibGUgc2l6ZQotCXZlcmlmaWNhdGlvbiB0byBhY2NlcHQgYSBmZXcgYnJva2VuIGZvbnRzIHdobyBwYWQgdGhlIHNpemUKLQlpbmNvcnJlY3RseSAodGhlIHRhYmxlIHNob3VsZCBiZSBwYWRkZWQsIGJ1dCBpdHMgYHNpemUnIGZpZWxkCi0Jc2hvdWxkbid0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbikuCi0KLTIwMDMtMDEtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvbHRtYWluLnNoOiBSZWdlbmVyYXRlZCB3aXRoIGBsaWJ0b29saXplIC0tZm9yY2UKLQktLWNvcHknIGZyb20gbGlidG9vbCAxLjQuMy4KLQkqIGJ1aWxkcy91bml4L2FjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkIHdpdGggYGFjbG9jYWwgLUkgLicgZnJvbQotCWF1dG9tYWtlIDEuNy4xLgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuNTQuCi0JKiBidWlsZHMvdW5peC9jb25maWcuZ3Vlc3MsIGJ1aWxkcy91bml4L2NvbmZpZy5zdWI6IFVwZGF0ZWQgZnJvbQotCWBjb25maWcnIENWUyBtb2R1bGUgYXQgc3VidmVyc2lvbnMuZ251Lm9yZy4KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwtc2gsIGJ1aWxkcy91bml4L21raW5zdGFsbGRpcnM6IFVwZGF0ZWQgZnJvbQotCWBhdXRvbWFrZScgQ1ZTIG1vZHVsZSBhdCBzdWJ2ZXJzaW9ucy5nbnUub3JnLgotCi0yMDAzLTAxLTE1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogRml4ZWQgZG9jdW1lbnRhdGlvbiBmb3IKLQlGVF9TaXplX01ldHJpY3MuCi0KLTIwMDMtMDEtMTUgIEphbWVzIFN1ICA8c3V6aGVAdHVyYm9saW51eC5jb20uY24+Ci0KLQkqIHNyYy9nemlwL2Z0Z3ppcC5jIChmdF9nemlwX2NoZWNrX2hlYWRlcik6IEJ1Z2ZpeDogY291bGRuJ3QgcmVhZAotCWNlcnRhaW4gZ3ppcC1lZCBmb250IGZpbGVzICh0eXBvOiBgJiYnIC0+IGAmJykuCi0KLTIwMDMtMDEtMTUgIEh1dyBEIE0gRGF2aWVzICA8aC5kYXZpZXMxQHBoeXNpY3Mub3guYWMudWs+Ci0KLQlBZGRlZCBhIFdpbmRvd3MgLkZOVCBzcGVjaWZpYyBBUEkgKG1vc3RseSBmb3IgV2luZSkuICBBbHNvIGZpeGVkIGEKLQluYXN0eSBidWcgaW4gdGhlIGhlYWRlciBsb2FkZXIgd2hpY2ggd291bGQgY2F1c2UgaW52YWxpZCBtZW1vcnkKLQlvdmVyd3JpdGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9XSU5GT05UU19IKTogTmV3IG1hY3JvCi0JZm9yIGZ0d2luZm50LmguCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ZudHR5cGVzLmg6IEluY2x1ZGUgRlRfV0lORk9OVFNfSC4KLQkoRk5UX0ZvbnRSZWMpOiBVcGRhdGVkLgotCU1vdmUgV2luZG93cyBGTlQgZGVmaW5pdGlvbiB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oOiBUaGlzIG5ldyBmaWxlLgotCShGVF9XaW5GTlRfSGVhZGVyUmVjKTogUmVuYW1lIGByZXNlcnZlZDInIHRvIGByZXNlcnZlZDEnLgotCSogc3JjL2Jhc2UvZnR3aW5mbnQuYzogTmV3IGZpbGUsIHByb3ZpZGluZyBgRlRfR2V0X1dpbkZOVF9IZWFkZXInLgotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jICh3aW5mbnRfaGVhZGVyX2ZpZWxkcyk6IFVwZGF0ZWQuCi0JUmVuYW1lIGByZXNlcnZlZDInIHRvIGByZXNlcnZlZDEnLgotCShmbnRfZm9udF9sb2FkKTogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvSmFtZmlsZSwgc3JjL2Jhc2UvZGVzY3JpcC5tbXMsIHNyYy9iYXNlL3J1bGVzLm1rOgotCVVwZGF0ZWQuCi0KLTIwMDMtMDEtMTQgIEdyYWhhbSBBc2hlciAgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGdseXBoLmgsIHNyYy9iYXNlL2Z0Z2x5cGguYzogQWRkZWQgYGNvbnN0JyB0bwotCXRoZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudCB0byBGVF9NYXRyaXhfTXVsdGlwbHksIHdoaWNoIGlzbid0Ci0JY2hhbmdlZCAtLSB0aGlzIGFkZHMgZG9jdW1lbnRhdGlvbiBhbmQgY29udmVuaWVuY2UuCi0KLTIwMDMtMDEtMTMgIEdyYWhhbSBBc2hlciAgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9tZXRyaWNzKQotCVtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogVHJ1ZVR5cGUgdHlwZWZhY2VzIHdpdGhvdXQKLQlob3Jpem9udGFsIG1ldHJpY3MgKHdpdGhvdXQgdGhlIGBobXR4JyB0YWJsZSkgYXJlIG5vdyB0b2xlcmF0ZWQgaWYKLQlhbiBpbmNyZW1lbnRhbCBpbnRlcmZhY2UgaGFzIGJlZW4gc3BlY2lmaWVkIHRoYXQgaGFzIGEKLQlnZXRfZ2x5cGhfbWV0cmljcyBmdW5jdGlvbiwgaW1wbHlpbmcgdGhhdCBtZXRyaWNzIHdpbGwgYmUgc3VwcGxpZWQKLQlmcm9tIG91dHNpZGUuICBUaGlzIGhhcHBlbnMgZm9yIGNlcnRhaW4gVHlwZSA0MiBmb250cyBwYXNzZWQgZnJvbQotCUdob3N0U2NyaXB0LgotCi0yMDAzLTAxLTExICBEYXZpZCBDaGVzdGVyICA8ZGF2aWRjaGVzdGVyQHFteC5uZXQ+Ci0KLQlQYXRjaGVzIHRvIHRoZSBhdXRvLWhpbnRlciBpbiBvcmRlciB0byBzbGlnaHRseSBpbXByb3ZlIHRoZSBvdXRwdXQuCi0JTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBuZXcKLQlGVF9DT05GSUdfT1BUSU9OX0NIRVNURVJfSElOVFMgZGVmaW5lZCBpbiBgZnRvcHRpb24uaCcuICBUaGVyZSBhcmUKLQlhbHNvIGluZGl2aWR1YWwgRlRfQ09ORklHX0NIRVNURVJfWFhYIG1hY3JvcyB0byBjb250cm9sIGluZGl2aWR1YWwKLQlgZmVhdHVyZXMnLgotCi0JTm90ZSB0aGF0IGFsbCBpbXByb3ZlbWVudHMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgYnV0IGNhbiBiZQotCXR3ZWFrZWQgZm9yIG9wdGltaXphdGlvbiBhbmQgdGVzdGluZyBwdXJwb3Nlcy4gIFRoZSBjb25maWd1cmF0aW9uCi0JbWFjcm9zIHdpbGwgbW9zdCBsaWtlbHkgZGlzYXBwZWFyIGluIHRoZSBzaG9ydCBmdXR1cmUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoRlRfQ09ORklHX09QVElPTl9DSEVTVEVSX0hJTlRTKTogTmV3IG1hY3JvLgotCShGVF9DT05GSUdfQ0hFU1RFUl97U01BTExfRixBU0NFTkRFUixTRVJJRixTVEVNLEJMVUVfU0NBTEV9KQotCVtGVF9DT05GSUdfT1BUSU9OX0NIRVNURVJfSElOVFNdOiBOZXcgbWFjcm9zIHRvIGNvbnRyb2wgaW5kaXZpZHVhbAotCWZlYXR1cmVzLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhnbG9iYWwuYyAoYmx1ZV9jaGFycykgW0ZUX0NPTkZJR19DSEVTVEVSX1NNQUxMX0ZdOgotCUFkZCBibHVlIHpvbmUgZm9yIGBmaWprZGJoJy4KLQkqIHNyYy9hdXRvaGludC9haGdsb2JhbC5oIChBSF9JU19UT1BfQkxVRSkKLQlbRlRfQ09ORklHX0NIRVNURVJfU01BTExfRl06IFVzZSBgQUhfQkxVRV9TTUFMTF9GX1RPUCcuCi0JKiBzcmMvYXV0b2hpbnQvYWhnbHlwaC5jIChhaF9vdXRsaW5lX2NvbXB1dGVfZWRnZXMpCi0JW0ZUX0NPTkZJR19DSEVTVEVSX1NFUklGXTogVXNlIGBBSF9FREdFX1NFUklGJy4KLQkoYWhfb3V0bGluZV9jb21wdXRlX2JsdWVfZWRnZXMpIFtGVF9DT05GSUdfQ0hFU1RFUl9TTUFMTF9GXToKLQlJbmNyZWFzZSB0aHJlc2hvbGQgZm9yIGBiZXN0X2Rpc3QnLgotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9jb21wdXRlX3N0ZW1fd2lkdGgpCi0JW0ZUX0NPTkZJR19DSEVTVEVSX1NFUklGXTogUHJvdmlkZSBuZXcgdmVyc2lvbiBmb3IgaW1wcm92ZWQgc2VyaWYKLQloYW5kbGluZy4KLQkoYWhfYWxpZ25fbGlua2VkX2VkZ2UpIFtGVF9DT05GSUdfQ0hFU1RFUl9TRVJJRl06IFVzZSBzcGVjaWFsCi0JdmVyc2lvbiBvZiBgYWhfY29tcHV0ZV9zdGVtX3dpZHRoJy4KLQkoYWhfaGludF9lZGdlc18zKSBbRlRfQ09ORklHX0NIRVNURVJfU1RFTV06IEEgbmV3IGFsZ29yaXRobSBmb3Igc3RlbQotCWFsaWdubWVudCB3aGVuIHN0ZW0gd2lkdGhzIGFyZSBsZXNzIHRoYW4gMS41IHBpeGVscyB3aWRlIGNlbnRlcnMgdGhlCi0Jc3RlbSBzbGlnaHRseSBvZmYtY2VudGVyIG9mIHRoZSBjZW50ZXIgb2YgYSBwaXhlbCAodGhpcyBpbmNyZWFzZXMKLQlzaGFycG5lc3MgYW5kIGNvbnNpc3RlbmN5KS4KLQlbRlRfQ09ORklHX0NIRVNURVJfU0VSSUZdOiBVc2Ugc3BlY2lhbCB2ZXJzaW9uIG9mCi0JYGFoX2NvbXB1dGVfc3RlbV93aWR0aCcuCi0JKiBzcmMvYXV0b2hpbnQvYWh0eXBlcy5oIFtGVF9DT05GSUdfQ0hFU1RFUl9TTUFMTF9GXTogQWRkCi0JYEFIX0JMVUVfU01BTExfRl9UT1AnLgotCi0yMDAzLTAxLTExICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZm50dHlwZXMuaCAoV2luRk5UX0hlYWRlclJlYyk6IEluY3JlYXNlCi0Jc2l6ZSBvZiBgcmVzZXJ2ZWQyJyB0byBhdm9pZCBtZW1vcnkgb3ZlcndyaXRlcy4KLQotMjAwMy0wMS0wOCAgSHV3IERhdmllcyAgPGh1d0Bjb2Rld2VhdmVycy5jb20+Ci0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAod2luZm50X2hlYWRlcl9maWVsZHMpOiBSZWFkIDE2IGJ5dGVzIGludG8KLQlgcmVzZXJ2ZWQyJywgbm90IGByZXNlcnZlZCcuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmaW5kX3VuaWNvZGVfY2hhcm1hcCk6IEZpeGVkIHRoZSBlcnJvciBjb2RlCi0JcmV0dXJuZWQgd2hlbiB0aGUgZm9udCBkb2Vzbid0IGNvbnRhaW4gYSBVbmljb2RlIGNoYXJtYXAuICBUaGlzCi0JYWxsb3dzIEZUMiB0byBsb2FkIGBzeW1ib2wudHRmJyBhbmQgYSBmZXcgb3RoZXJzIGNvcnJlY3RseSBzaW5jZSB0aGUKLQlsYXN0IHJlbGVhc2UuCi0JKG9wZW5fZmFjZSk6IEZpeCByZXR1cm4gdmFsdWUuCi0KLTIwMDMtMDEtMDggIE93ZW4gVGF5bG9yICA8b3dlbkByZWRoYXQuY29tPgotCi0JSW1wbGVtZW50ZWQgdGhlIEZUX1JFTkRFUl9NT0RFX0xJR0hUIGhpbnRpbmcgbW9kZSBpbiB0aGUgYXV0byBhbmQKLQlwb3N0c2NyaXB0IGhpbnRlcnMuCi0KLQkqIHNyYy9hdXRvaGludC9haHR5cGVzLmggKEFIX0hpbnRlclJlYyk6IEFkZCBgZG9fc3RlbV9hZGp1c3QnLgotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9jb21wdXRlX3N0ZW1fd2lkdGgpOiBIYW5kbGUKLQloaW50ZXItPmRvX3N0ZW1fYWRqdXN0LgotCShhaF9oaW50ZXJfbG9hZF9nbHlwaCk6IFNldCBoaW50ZXItPmRvX3N0ZW1fYWRqdXN0LgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzMuaCAoUFNIM19HbHlwaFJlYyk6IEFkZCBgZG9fc3RlbV9hZGp1c3QnLgotCSogc3JjL3BzaGludGVyL3BzaGFsZ28zLmMgKHBzaDNfaGludF9hbGlnbik6IFVzZSBgZG9fc3RlbV9hZGp1c3QnLgotCShwczNfaGludHNfYXBwbHkpOiBIYW5kbGUgRlRfUkVOREVSX01PREVfTElHSFQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfUmVuZGVyX01vZGUpOiBBZGQKLQlGVF9SRU5ERVJfTU9ERV9MSUdIVC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYzogRml4aW5nIHRoZSBUcnVlVHlwZSBsb2FkZXIgdG8gaGFuZGxlCi0JaW52YWxpZCBjb21wb3NpdGVzIGNvcnJlY3RseSBieSBsaW1pdGluZyB0aGUgcmVjdXJzaW9uIGRlcHRoLgotCShUVF9NQVhfQ09NUE9TSVRFX1JFQ1VSU0UpOiBOZXcgbWFjcm8uCi0JKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBBZGQgYXJndW1lbnQgYHJlY3Vyc2VfY291bnQnLgotCUxvYWQgYSBjb21wb3NpdGUgb25seSBpZiB0aGUgbnVtYmVycyBvZiBjb250b3VycyBpcyAtMSwgZW1pdCBlcnJvcgotCW90aGVyd2lzZS4KLQkoVFRfTG9hZF9HbHlwaCk6IFVwZGF0ZWQuCi0KLTIwMDMtMDEtMDggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogSmFtcnVsZXMsIEphbWZpbGUsIEphbWZpbGUuaW4sIHNyYy8qL0phbWZpbGU6IFNtYWxsIGNoYW5nZXMgdG8KLQlzdXBwb3J0IHRoZSBjb21waWxhdGlvbiBvZiBGcmVlVHlwZSAyIGFzIHBhcnQgb2YgbGFyZ2VyIHByb2plY3RzCi0Jd2l0aCB0aGVpciBvd24gY29uZmlndXJhdGlvbiBvcHRpb25zIChvbmx5IHdpdGggSmFtKS4KLQotMjAwMy0wMS0wNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHN0cm9rZXIuYzogUHJvYmFibHkgdGhlIGxhc3QgYnVnLWZpeGVzIHRvIHRoZSBzdHJva2VyOwotCXRoZSBBUEkgaXMgbGlrZWx5IHRvIGNoYW5nZSwgaG93ZXZlci4KLQkoZnRfc3Ryb2tlX2JvcmRlcl9jbG9zZSk6IERvbid0IHJlY29yZCBlbXB0eSBwYXRocy4KLQkoZnRfc3Ryb2tlX2JvcmRlcl9nZXRfY291bnRzKTogSW5jcmVhc2UgYG51bV9wb2ludHMnIGFsc28gaW4gZm9yIGxvb3AuCi0JKGZ0X3N0cm9rZV9ib3JkZXJfZXhwb3J0KTogRG9uJ3QgaW5jcmVhc2UgYHdyaXRlJyB0d2ljZSBpbiBmb3IgbG9vcHMuCi0JKGZ0X3N0cm9rZXJfb3V0c2lkZSk6IEhhbmRsZSBgcGhpJyB0b2dldGhlciB3aXRoIGB0aGV0YScuCi0JKEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChGVF9BbmdsZV9EaWZmKTogRml4aW5nIGZ1bmN0aW9uOiBJdCByZXR1cm5lZAotCWludmFsaWQgdmFsdWVzIGZvciBsYXJnZSBuZWdhdGl2ZSBhbmdsZSBkaWZmZXJlbmNlcyAocmVzdWx0aW5nIGluCi0JaW5jb3JyZWN0IHN0cm9rZXIgY29tcHV0YXRpb25zLCBhbW9uZyBvdGhlciB0aGluZ3MpLgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYyAoZnRjX25vZGVfaGFzaF91bmxpbmspOiBSZW1vdmluZyBpbmNvcnJlY3QKLQlhc3NlcnRpb24sIGFuZCBjaGFuZ2luZyBjb2RlIHRvIGF2b2lkIGhhc2ggdGFibGUgc2l6ZSBjb250cmFjdGlvbi4KLQotCSogc3JjL2Jhc2UvSmFtZmlsZSwgc3JjL2Jhc2UvcnVsZXMubWssIHNyYy9iYXNlL2Rlc2NyaXAubW1zOiBBZGRpbmcKLQlgZnRzdHJva2VyJyB0byBkZWZhdWx0IGJ1aWxkLCBhcyBvcHRpb25hbCBjb21wb25lbnQuCi0KLTIwMDItMTItMjYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2d6aXAvYWRsZXIzMi5jLCBzcmMvZ3ppcC9pbmZibG9jay5jLCBzcmMvZ3ppcC9pbmZsYXRlLmMsCi0Jc3JjL2d6aXAvaW5mdHJlZXMuYywgc3JjL2d6aXAvemNvbmYuaCwgc3JjL2d6aXAvemxpYi5oLAotCXNyYy9nemlwL3p1dGlsLmg6IFVwZGF0ZXMgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aG91dCBjb21waWxlcgotCXdhcm5pbmdzIHdpdGggTENDLVdpbjMyLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDQuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWMgKHZlcnNpb25faW5mbyk6IEluY3JlYXNlZCB0byA5OjM6My4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGVkLgotCi0yMDAyLTEyLTIzICBBbnRob255IEZvayAgPGFudGhvbnlAdGhpemxpbnV4LmNvbT4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjLCBidWlsZHMvdW5peC91bml4LWNjLmluIChMSU5LX0xJQlJBUlkpLAotCWJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChTWVNURU1fWkxJQik6IFNtYWxsIGZpeCB0byBjb25maWd1cmUKLQlzdWItc3lzdGVtIG9uIFVuaXggdG8gYWxsb3cgb3RoZXIgcHJvZ3JhbXMgdG8gY29ycmVjdGx5IGxpbmsgd2l0aAotCXpsaWIgd2hlbiBuZWVkZWQuCi0KLTIwMDItMTItMTkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggKFNGTlRfTG9hZF9UYWJsZV9GdW5jKTogTmV3Ci0JZnVuY3Rpb24gcG9pbnRlci4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oIChGVF9Mb2FkX1NmbnRfVGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBzcmMvYmFzZS9mdG9ianMuYzogSW1wbGVtZW50IGl0LgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2dldF9pbnRlcmZhY2UpOiBIYW5kbGUgYGxvYWRfc2ZudCcKLQltb2R1bGUgcmVxdWVzdC4KLQotMjAwMi0xMi0xNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZmluZF91bmljb2RlX2NoYXJtYXApOiBBZGRlZCBzb21lIGNvbW1lbnRzIHRvCi0JYmV0dGVyIGV4cGxhaW4gd2hhdCdzIGhhcHBlbmluZyB0aGVyZS4KLQkob3Blbl9mYWNlKTogSW5jbHVkZWQgR3JhaGFtIEFzaGVyJ3MgZml4IHRvIHByZXZlbnQgZmFjZXMgd2l0aG91dAotCVVuaWNvZGUgY2hhcm1hcHMgZnJvbSBsb2FkaW5nLgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmM6IEluY2x1ZGVkIEdlb3JnZSBXaWxsaWFtcydzIGZpeCB0byBzdXBwb3J0Ci0JdmVyc2lvbiAyIGZvbnRzIGNvcnJlY3RseS4KLQkod2luZm50X2hlYWRlcl9maWVsZHMpOiBVcGRhdGVkLgotCShmbnRfZm9udF9sb2FkKTogSGFuZGxlIHZlcnNpb24gMiBmb250cy4KLQkoRk5UX0xvYWRfR2x5cGgpOiBVcGRhdGVkLgotCi0yMDAyLTEyLTE2ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0aW5nIGRvY3VtZW50IHRvIGJldHRlciBleHBsYWluIHRoZQotCWRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHRocmVlIHZlcnNpb24gbnVtYmVycyBiZWluZyB1c2VkIG9uIFVuaXgsIGFzCi0Jd2VsbCBhcyBwcm92aWRpbmcgYW4gYXV0b2NvbmYgZnJhZ21lbnQgcHJvdmlkZWQgYnkgTGFycyBDbGF1c2VuLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfY29uaWMpOiBGaXhlZCBzbWFsbCBidWcgdGhhdAotCXByZXZlbnRlZCBCw6l6aWVyIGFyY3Mgd2l0aCBuZWdhdGl2ZSB2ZXJ0aWNhbCBjb29yZGluYXRlcyB0byBiZQotCXJlbmRlcmVkIGFwcHJvcHJpYXRlbHkuCi0KLTIwMDItMTItMDIgIEFudG9pbmUgTGVjYSAgPEFudG9pbmUtRnJlZXR5cGVATGVjYS1NYXJ0aS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBNb2RpZmllZCB0aGUgbG9naWMgdG8gZ2V0IFVuaWNvZGUgY2hhcm1hcHMuCi0JTm93IGl0IGxvYWRzIFVDUy00IGNoYXJtYXBzIHdoZW4gdGhlcmUgaXMgb25lLgotCShmaW5kX3VuaWNvZGVfY2hhcm1hcCk6IE5ldyBmdW5jdGlvbi4KLQkob3Blbl9mYWNlKTogUmVmZXIgdG8gdGhlIGFib3ZlIG9uZS4KLQkoRlRfU2VsZWN0X0NoYXJtYXApOiBJZGVtLgotCi0yMDAyLTExLTI5ICBBbnRvaW5lIExlY2EgIDxBbnRvaW5lLUZyZWV0eXBlQExlY2EtTWFydGkub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oOiBDb3JyZWN0IHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGluZwotCW1hY3JvICh3YXMgX19GVFhGODZfSF9fIC4uLikuCi0KLTIwMDItMTEtMjcgIFZpbmNlbnQgQ2Fyb24gIDx2LmNhcm9uQHplcm9kZXV4Lm5ldD4KLQotCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4sIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbiwKLQlidWlsZHMvdW5peC9jb25maWd1cmUuYWMsIHNyYy9nemlwL3J1bGVzLm1rLCBzcmMvZ3ppcC9mdGd6aXAuYwotCVtGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCXTogQWRkaW5nIHN1cHBvcnQgZm9yIHN5c3RlbSB6bGliCi0JaW5zdGFsbGF0aW9ucyBpZiBhdmFpbGFibGUgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSAoVW5peCBvbmx5KS4KLQotMjAwMi0xMS0yMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2NoYXJzZXRfbG9hZCwgY2ZmX2VuY29kaW5nX2xvYWQpOiBNb2RpZmllZAotCWNoYXJzZXQgbG9hZGVyIHRvIGFjY2VwdCBwcmUtZGVmaW5lZCBjaGFyc2V0cywgZXZlbiB3aGVuIHRoZSBmb250Ci0JY29udGFpbnMgZmV3ZXIgZ2x5cGhzLiAgQWxzbyBlbmZvcmNlZCBtb3JlIGNoZWNrcyB0byBlbnN1cmUgdGhhdCB3ZQotCW5ldmVyIG92ZXJmbG93IHRoZSBjaGFyYWN0ZXIgY29kZXMgYXJyYXkgaW4gdGhlIGVuY29kaW5nLgotCi0yMDAyLTExLTIyICBBbnRvaW5lIExlY2EgIDxBbnRvaW5lLUZyZWV0eXBlQExlY2EtTWFydGkub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmg6IFVwZGF0ZWQgdG8gbGF0ZXN0IE9wZW5UeXBlCi0Jc3BlY2lmaWNhdGlvbi4KLQotMjAwMi0xMS0xOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4xLjMgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLTIwMDItMTEtMDcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgKGZ0Y19zYml0X25vZGVfbG9hZCk6IEZpeGVkIGEgc21hbGwgYnVnIHRoYXQKLQljYXVzZWQgcHJvYmxlbXMgd2l0aCBlbWJlZGRlZCBiaXRtYXBzLgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsYXlvdXQuaCwgc3JjL290bGF5b3V0L290bGNvbmYuaCwKLQlzcmMvb3RsYXlvdXQvb3RsZ3N1Yi5jLCBzcmMvb3RsYXlvdXQvb3RsZ3N1Yi5oLAotCXNyYy9vdGxheW91dC9vdGxwYXJzZS5jLCBzcmMvb3RsYXlvdXQvb3RscGFyc2UuaCwKLQlzcmMvb3RsYXlvdXQvb3RsdXRpbHMuaDogVXBkYXRpbmcgdGhlIE9wZW5UeXBlIExheW91dCBjb2RlLCBhZGRpbmcKLQlzdXBwb3J0IGZvciB0aGUgZmlyc3QgR1NVQiBsb29rdXBzLiAgTm90aGluZyB0aGF0IHJlYWxseSBjb21waWxlcwotCWZvciBub3cgdGhvdWdoLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2FsaWduX3NlcmlmX2VkZ2UpOiBEaXNhYmxlZCBzZXJpZiBzdGVtCi0Jd2lkdGggcXVhbnRpemF0aW9uLiAgSXQgcHJvZHVjZXMgc2xpZ2h0bHkgYmV0dGVyIHNoYXBlcyB0aG91Z2ggdGhpcwotCWlzIG5vdCBkaXN0aW5ndWlzaGFibGUgd2l0aCBtYW55IGZvbnRzLgotCVJlbW92ZSBvdGhlciBkZWFkIGNvZGUuCi0KLQkqIHNyYy9KYW1maWxlLCBzcmMvKi9KYW1maWxlOiBTaW1wbGlmaWVkLgotCVVzZSAkKEZUMl9TUkNfRElSKS4KLQotMjAwMi0xMS0wNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0xPQURfVEFSR0VUX0xJR0hUKTogTmV3IG1hY3JvLgotCShGVF9MT0FEX1RBUkdFVCwgRlRfTE9BRF9UQVJHRVRfTU9ERSk6IFVzZSBgJiAxNScgaW5zdGVhZCBvZiBgJiA3Jy4KLQotMjAwMi0xMS0wNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oLCBzcmMvZ3ppcC9mdGd6aXAuYzogQWRkZWQKLQlzdXBwb3J0IGZvciB0aGUgRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQiBvcHRpb24sIHVzZWQgdG8gc3BlY2lmeQotCXRoZSB1c2Ugb2Ygc3lzdGVtLXdpZGUgemxpYi4KLQotCU5vdGUgdGhhdCB0aGlzIG1hY3JvLCBhcyB3ZWxsIGFzCi0JVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiwgaXMgbm90ICN1bmRlZi1lZCBhbnltb3JlLgotCVRoaXMgYWxsb3dzIHRoZSBidWlsZCBzeXN0ZW0gdG8gZGVmaW5lIHRoZW0gZGVwZW5kaW5nIG9uIHRoZQotCWNvbmZpZ3VyYXRpb24gKHR5cGljYWxseSBieSBhZGRpbmcgLUQgZmxhZ3MgYXQgY29tcGlsZSB0aW1lKS4KLQotCSogc3JjL3NmbnQvdHRjbWFwMC5jICh0dF9mYWNlX2J1aWxkX2NtYXBzKTogUmVtb3ZlZCBjb21waWxlcgotCXdhcm5pbmdzIGluIG9wdGltaXplZCBtb2RlIHJlbGF0aXZlIHRvIHRoZSBgdm9sYXRpbGUnIGxvY2FsCi0JdmFyaWFibGVzLiAgVGhpcyB3YXMgbm90IGEgY29tcGlsZXIgYnVnIGFmdGVyIGFsbCwgYnV0IHRoZSBmYWN0IHRoYXQKLQlhIHBvaW50ZXIgdG8gYSB2b2xhdGlsZSB2YXJpYWJsZSBpcyBub3QgdGhlIHNhbWUgYXMgYSB2b2xhdGlsZQotCXBvaW50ZXIgdG8gYSB2YXJpYWJsZSA6LSkKLQotCVRoZSBmaXggd2FzIHRvIGNoYW5nZQotCSAgYHZvbGF0aWxlIEZUX0J5dGUqIHAnCi0JaW50bwotCSAgYEZUX0J5dGUqIHZvbGF0aWxlIHAnLgotCi0JKiBzcmMvcGZyL3BmcmxvYWQuYyAocGZyX3BoeV9mb250X2xvYWQpLCBzcmMvcGZyL3BmcmRyaXZyLmMKLQkocGZyX2dldF9tZXRyaWNzKSwgc3JjL2d6aXAvaW5mdHJlZXMuYzogUmVtb3ZlZCBjb21waWxlciB3YXJuaW5ncyBpbgotCW9wdGltaXplZCBtb2Rlcy4KLQotCSogc3JjL2d6aXAvKi5baGNdOiBNb2RpZmllZCBvdXIgemxpYiBjb3B5IGluIG9yZGVyIHRvIHByZXZlbnQKLQlleHBvcnRpbmcgYW55IHpsaWIgZnVuY3Rpb24gbmFtZXMgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50LiAgVGhpcwotCXByZXZlbnRzIGxpbmtpbmcgcHJvYmxlbXMgb24gc29tZSBwbGF0Zm9ybXMsIHdoZW4gYXBwbGljYXRpb25zIHdhbnQKLQl0byBsaW5rIEZyZWVUeXBlIF9hbmRfIHpsaWIgdG9nZXRoZXIuCi0KLTIwMDItMTEtMDUgIEp1bGl1c3ogIDxqY2hAcHBzLmp1c3NpZXUuZnI+Ci0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfdGFibGVfYWRkKTogTW9kaWZpZWQgaW5jcmVtZW50IGxvb3AgaW4KLQlvcmRlciB0byBpbXBsZW1lbnQgZXhwb25lbnRpYWwgYmVoYXZpb3VyLgotCi0yMDAyLTExLTAxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlBZGRlZCBQRlItc3BlY2lmaWMgcHVibGljIEFQSS4gIEZpeGVkIHRoZSBrZXJuaW5nIHJldHJpZXZhbCByb3V0aW5lCi0JKGl0IHJldHVybmVkIGludmFsaWQgdmFsdWVzIHdoZW4gdGhlIG91dGxpbmUgYW5kIG1ldHJpY3MgcmVzb2x1dGlvbgotCWRpZmZlcikuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRwZnIuaCwgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wZnIuaDogTmV3Ci0JZmlsZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCAoRlRfSU5URVJOQUxfUEZSX0gpOiBOZXcKLQltYWNybyBmb3IgcGZyLmguCi0KLQkqIHNyYy9iYXNlL2Z0cGZyLmM6IE5ldyBmaWxlLgotCSogc3JjL2Jhc2UvSmFtZmlsZSwgc3JjL2Jhc2UvZGVzY3JpcC5tbXM6IFVwZGF0ZWQuCi0KLQkqIHNyYy9wZnIvcGZyZHJpdnIuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9QRlJfSC4KLQkocGZyX2dldF9rZXJuaW5nLCBwZnJfZ2V0X2FkdmFuY2UsIHBmcl9nZXRfbWV0cmljcyk6IE5ldyBmdW5jdGlvbnMuCi0JKHBmcl9zZXJ2aWNlX3JlYyk6IE5ldyBmb3JtYXQgaW50ZXJmYWNlLgotCShwZnJfZHJpdmVyX2NsYXNzKTogVXNlIGBwZnJfc2VydmljZV9yZWMnLgotCVJlcGxhY2UgYHBmcl9mYWNlX2dldF9rZXJuaW5nJyB3aXRoIGBwZnJfZ2V0X2tlcm5pbmcnLgotCSogc3JjL3Bmci9wZnJvYmpzLmM6IFJlbW92ZSBkZWFkIGNvZGUuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfY2xlYXIpOiBTbWFsbCBpbnRlcm5hbCBmaXggdG8KLQliZXR0ZXIgc3VwcG9ydCBiaXRtYXAtYmFzZWQgZm9udCBmb3JtYXRzLgotCi0JKiBzcmMvYmFzZS9mdHN5bnRoLmMgKEZUX0dseXBoU2xvdF9FbWJvbGRlbik6IEZpeCBoYW5kbGluZyBvZgotCWBzY2FsZScuCi0JRml4IGFyZ3VtZW50cyB0byBgRlRfVmVjdG9yX0Zyb21fUG9sYXInLgotCi0yMDAyLTEwLTMxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgYXV0b21hdGljIGhhbmRsaW5nIG9mIGd6aXAtY29tcHJlc3NlZCBQQ0YgZmlsZXMuCi0KLQkqIHNyYy9nemlwLyo6IE5ldyBmaWxlcywgdGFrZW4gZnJvbSB0aGUgemxpYiBwYWNrYWdlIChleGNlcHQKLQlmdGd6aXAuYykuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRnemlwLmgsIHNyYy9nemlwL2Z0Z3ppcC5jOiBOZXcgZmlsZXMuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9HWklQX0gpOiBOZXcgbWFjcm8gZm9yCi0JYGZ0Z3ppcC5oJy4KLQotCSogc3JjL3BjZi9wY2Zkcml2ZXIuYzogSW5jbHVkZSBGVF9HWklQX0ggYW5kIEZUX0VSUk9SU19ILgotCShQQ0ZfRmFjZV9Jbml0KTogSWYgbm9ybWFsIG9wZW4gZmFpbHMsIHRyeSB0byBvcGVuIGd6aXAgc3RyZWFtLgotCShQQ0ZfRmFjZV9Eb25lKTogQ2xvc2UgZ3ppcCBzdHJlYW0uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcGNmdHlwZXMuaCAoUENGX1B1YmxpY19GYWNlUmVjKSwKLQlzcmMvcGNmL3BjZi5oIChQQ0ZfRmFjZVJlYyk6IEFkZCBgZ3ppcF9zdHJlYW0nIGFuZCBgZ3ppcF9zb3VyY2UnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIChGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCKToKLQlOZXcgbWFjcm8uCi0JKFQxX0NPTkZJR19PUFRJT05fRElTQUJMRV9ISU5URVIsIEZUX0NPTkZJR19PUFRJT05fVVNFX0NNQVBTCi0JRlRfQ09ORklHX09QVElPTl9OT19DT05WRU5JRU5DRV9GVU5DUywKLQlGVF9DT05GSUdfT1BUSU9OX0FMVEVSTkFURV9HTFlQSF9GT1JNQVRTKTogUmVtb3ZlZC4KLQotCShGVF9FWFBPUlQsIEZUX0VYUE9SVF9ERUYsIEZUX0RFQlVHX0xFVkVMX0VSUk9SLAotCUZUX0RFQlVHX0xFVkVMX1RSQUNFLCBGVF9ERUJVR19NRU1PUlkpOiBDb21tZW50IG91dCBkZWZpbml0aW9ucyBzbwotCXRoYXQgcGxhdGZvcm0gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIGNhbiBvdmVycmlkZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oOiBJbmNsdWRlIEZUX1NZU1RFTV9ILgotCi0yMDAyLTEwLTMwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIEZyZWVUeXBlIDIuMS4zcmMzIHJlbGVhc2VkLgotCi0yMDAyLTEwLTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oIChGVF9QT0lOVEVSX1RPX1VMT05HKTogTmV3IG1hY3JvLgotCShGVENfRkFDRV9JRF9IQVNIKTogUmV3cml0dGVuLCB1c2luZyBGVF9QT0lOVEVSX1RPX1VMT05HLgotCi0yMDAyLTEwLTIyICBHaXVzZXBwZSBHaGliw7IgIDxnaGlib0BtYW5kcmFrZXNvZnQuY29tPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0VuY29kaW5nKTogRml4IGVudHJ5IGZvciBsYXRpbi0yLgotCi0yMDAyLTEwLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfT3Blbl9GYWNlKTogVXNlIGBjb25zdCcgZm9yIGBhcmdzJwotCShzdWdnZXN0ZWQgYnkgR3JhaGFtKS4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9PcGVuX0ZhY2UpOiBVcGRhdGVkLgotCShmdF9pbnB1dF9zdHJlYW1fbmV3KTogRGl0dG8uCi0KLTIwMDItMTAtMDUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUFkZGluZyBzdXBwb3J0IGZvciBlbWJlZGRlZCBiaXRtYXBzIHRvIHRoZSBQRlIgZHJpdmVyLCBhbmQgcmV3cml0aW5nCi0JaXRzIGtlcm5pbmcgbG9hZGVyL2hhbmRsZXIgdG8gdXNlIGFsbCBrZXJuaW5nIHBhaXJzIGluIGEgcGh5c2ljYWwKLQlmb250IChhbmQgbm90IGp1c3QgdGhlIGZpcnN0IGl0ZW0pLgotCi0JKiBzcmMvcGZyL3Bmci5jOiBJbmNsdWRlIGBwZnJzYml0LmMnLgotCSogc3JjL3Bmci9wZnJnbG9hZC5jOiBJbmNsdWRlIGBwZnJzYml0LmgnLgotCSogc3JjL3Bmci9wZnJsb2FkLmMgKHBmcl9leHRyYV9pdGVtX2xvYWRfa2VybmluZ19wYWlycyk6IFJld3JpdHRlbi4KLQkocGZyX3BoeV9mb250X2RvbmUsIHBmcl9waHlfZm9udF9sb2FkKTogVXBkYXRlZC4KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jOiBJbmNsdWRlIGBwZnJzYml0LmgnLgotCShwZnJfZmFjZV9pbml0KTogSGFuZGxlIGtlcm5pbmcgYW5kIGVtYmVkZGVkIGJpdG1hcHMuCi0JKHBmcl9zbG90X2xvYWQpOiBMb2FkIGVtYmVkZGVkIGJpdG1hcHMuCi0JKFBGUl9LRVJOX0lOREVYKTogUmVtb3ZlZC4KLQkocGZyX2ZhY2VfZ2V0X2tlcm5pbmcpOiBSZXdyaXR0ZW4uCi0JKiBzcmMvcGZyL3BmcnNiaXQuYywgc3JjL3Bmci9wZnJzYml0Lmg6IE5ldyBmaWxlcy4KLQkqIHNyYy9wZnIvcGZydHlwZXMuaCAoUEZSX0tlcm5JdGVtUmVjKTogTmV3IHN0cnVjdHVyZS4KLQkoUEZSX0tFUk5fSU5ERVgpOiBOZXcgbWFjcm8uCi0JKFBGUl9QaHlGb250UmVjKTogQWRkIGl0ZW1zIGZvciBrZXJuaW5nIGFuZCBlbWJlZGRlZCBiaXRtYXBzLgotCSogc3JjL3Bmci9KYW1maWxlIChfc291cmNlcykgW0ZUMl9NVUxUSV06IEFkZCBgcGZyc2JpdCcuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogRG9uJ3QgbG9hZCBiaXRtYXAgZm9udHMgaWYKLQlGVF9MT0FEX05PX1JFQ1VSU0UgaXMgc2V0LgotCUxvYWQgZW1iZWRkZWQgYml0bWFwcyBvbmx5IGlmIEZUX0xPQURfTk9fQklUTUFQIGlzbid0IHNldC4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL2NvbnRlbnQucHksIHNyYy90b29scy9kb2NtYWtlci9zb3VyY2VzLnB5LAotCXNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IEZpeGluZyBhIGZldyBuYXN0eSBidWdzLgotCi0JKiBzcmMvc2ZudC90dGNtYXAwLmMgKHR0X2NtYXA0X3ZhbGlkYXRlKTogVGhlIHZhbGlkYXRvciBmb3IgZm9ybWF0IDQKLQlzdWItdGFibGVzIGlzIG5vdyBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCBpbnZhbGlkIGBsZW5ndGgnIGZpZWxkcyBhdAotCXRoZSBzdGFydCBvZiB0aGUgc3ViLXRhYmxlLiAgVGhpcyBhbGxvd3MgZm9udHMgbGlrZSBgbWdfX19fX18udHRmJwotCShpLmUuICBNYXJyaWFnZSkgdG8gcmV0dXJuIGFjY3VyYXRlIGNoYXJtYXBzLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDItMTAtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKFNVQlBJWEVMUyk6IEFkZCBjYXN0IHRvIGBUUG9zJy4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKFRSVU5DKTogQWRkIGNhc3QgdG8gYFRDb29yZCcuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCShUUmFzdGVyKTogVXNlIGBUUG9zJyBmb3IgbWluX2V4LCBtYXhfZXgsIG1pbl9leSwgbWF4X2V5LCBhbmQKLQlsYXN0X2V5LgotCVVwZGF0ZSBhbGwgY2FzdHMuCi0JKGdyYXlfcmVuZGVyX2xpbmUpOiBGaXggY2FzdHMgZm9yIGBwJyBhbmQgYGZpcnN0Jy4KLQotMjAwMi0xMC0wMiAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKGJkZl9sb2FkX2ZvbnQpOiBBbGxvY2F0ZSB0aGUgX2JkZl9wYXJzZV90Ci0Jc3RydWN0dXJlIHdpdGggRlRfQUxMT0MgaW5zdGVhZCBvZiB1c2luZyB0aGUgc3RhY2suCi0KLTIwMDItMDktMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChudW1fc2JpdF9zdHJpa2VzLAotCW51bV9zYml0X3NjYWxlcyk6IFVzZSBgRlRfVUxvbmcnLgotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogVXBkYXRlZCBhY2NvcmRpbmdseS4KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9mYWNlX3NldF9zYml0X3N0cmlrZSk6IERpdHRvLgotCShmaW5kX3NiaXRfaW1hZ2UpOiBSZW1vdmUgY2FzdC4KLQkqIHNyYy9yYXN0ZXIvZnRyZW5kMS5jIChmdF9yYXN0ZXIxX3JlbmRlcik6IEZpeCBjYXN0LgotCi0yMDAyLTA5LTI3ICBXb2xmZ2FuZyBEb21yw7ZzZSAgPHBvcnRob3MuZG9tcm9lc2VAaGFyei5kZT4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9uYW1lcyk6IFVzZSBjYXN0LgotCSogc3JjL3NmbnQvdHRjbWFwLmMgKGNvZGVfdG9fbmV4dDIpOiBVc2UgbG9uZyBjb25zdGFudC4KLQkoY29kZV90b19pbmRleDQpOiBVc2UgY2FzdC4KLQkoY29kZV90b19pbmRleDhfMTIpOiBGaXggY2FzdC4KLQkqIHNyYy9zZm50L3R0Y21hcDAuYyAodHRfY21hcDRfY2hhcl9uZXh0LCB0dF9jbWFwOF9jaGFyX2luZGV4LAotCXR0X2NtYXAxMl9jaGFyX2luZGV4KTogVXNlIGNhc3QgZm9yIGByZXN1bHQnLgotCSh0dF9mYWNlX2J1aWxkX2NtYXBzKTogVXNlIGNhc3QuCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAodHRfbmFtZV9lbnRyeV9hc2NpaV9mcm9tX3VjczQpOiBVc2UgY2FzdCBmb3IKLQlgY29kZScuCi0JKHNmbnRfbG9hZF9mYWNlKTogVXNlIEZUX0ludDMyIGZvciBgZmxhZ3MnLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfc2NhbmxpbmUsIGdyYXlfcmVuZGVyX2xpbmUsCi0JZ3JheV9jb21wdXRlX2Nib3gsIGdyYXlfY29udmVydF9nbHlwaCwgZ3JheV9yYXN0ZXJfcmVzZXQpOiBBZGQgY2FzdHMKLQl0byBgVENvb3JkJyBhbmQgYGludCcuCi0JTW9yZSAxNmJpdCBmaXhlcy4KLQlzL0ZUX1Bvcy9UUG9zLy4KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogQWRkIGNhc3RzLgotCi0yMDAyLTA5LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0cG9zdC5jIChsb2FkX3Bvc3RfbmFtZXMsIHR0X2ZhY2VfZnJlZV9wc19uYW1lcywKLQl0dF9mYWNlX2dldF9wc19uYW1lKTogUmVwbGFjZSBzd2l0Y2ggc3RhdGVtZW50IHdpdGggaWYgY2xhdXNlcyB0bwotCW1ha2UgaXQgbW9yZSBwb3J0YWJsZS4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBEaXR0by4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZHVsZS5oIChGVF9Nb2R1bGVfQ2xhc3MpOiBVc2UgYEZUX0xvbmcnIGZvcgotCWBtb2R1bGVfc2l6ZScuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmggKEZUX0dseXBoX0NsYXNzXyk6IFVzZSBgRlRfTG9uZycgZm9yCi0JYGdseXBoX3NpemUnLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfUmVuZGVyX0dseXBoKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgdG8KLQlgRlRfUmVuZGVyX01vZGUnLgotCShGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwpOiBDaGFuZ2UgdGhpcmQgcGFyYW1ldGVyIHRvCi0JYEZUX1JlbmRlcl9Nb2RlJy4KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyAoRlRfR2x5cGhfVG9fQml0bWFwKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIKLQl0byBgRlRfUmVuZGVyX01vZGUnLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBDaGFuZ2UgdGhpcmQgcGFyYW1ldGVyCi0JdG8gYEZUX1JlbmRlcl9Nb2RlJy4KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlciwgZnRfc21vb3RoX3JlbmRlcl9sY2QsCi0JZnRfc21vb3RoX3JlbmRlcl9sY2Rfdik6IERpdHRvLgotCShmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBDaGFuZ2UgdGhpcmQgYW5kIGZpZnRoIHBhcmFtZXRlciB0bwotCWBGVF9SZW5kZXJfTW9kZScuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCwgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaDogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChMb2FkX0dseXBoKSwgc3JjL3BjZi9wY2Zkcml2ZXIuYwotCShQQ0ZfR2x5cGhfTG9hZCksIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfc2xvdF9sb2FkKSwKLQlzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9Mb2FkX0dseXBoKSwgc3JjL3Q0Mi90NDJvYmpzLmMKLQkoVDQyX0dseXBoU2xvdF9Mb2FkKSwgc3JjL2JkZi9iZGZkcml2ci5jIChCREZfR2x5cGhfTG9hZCk6IENoYW5nZQotCWZvdXJ0aCBwYXJhbWV0ZXIgdG8gYEZUX0ludDMyJy4KLQotCSogc3JjL3Bmci9wZnJvYmpzLmMgKHBmcl9mYWNlX2luaXQpOiBBZGQgdHdvIG1pc3NpbmcgcGFyYW1ldGVycwotCWFuZCBkZWNsYXJlIHRoZW0gYXMgdW51c2VkLgotCi0JKiBzcmMvY2lkL2NpZHBhcnNlLmggKENJRF9QYXJzZXIpOiBVc2UgRlRfTG9uZyBmb3IgYHBvc3RzY3JpcHRfbGVuJy4KLQotCSogc3JjL3BzbmFtZXMvcHNuYW1lcy5oIChQU19Vbmljb2RlX1ZhbHVlX0Z1bmMpOiBDaGFuZ2UgcmV0dXJuCi0JdmFsdWUgdG8gRlRfVUludDMyLgotCSogc3JjL3BzbmFtZXMvcHNtb2R1bGUuYyAocHNfdW5pY29kZV92YWx1ZSwgcHNfYnVpbGRfdW5pY29kZV90YWJsZSk6Ci0JVXBkYXRlZCBhY2NvcmRpbmdseS4KLQotMjAwMi0wOS0yNiAgV29sZmdhbmcgRG9tcsO2c2UgIDxwb3J0aG9zLmRvbXJvZXNlQGhhcnouZGU+Ci0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoR2V0X0tlcm5pbmcpOiBVc2UgRlRfTG9uZyBmb3IgYG1pZGRsZScuCi0JKGNmZl9nZXRfZ2x5cGhfbmFtZSk6IFVzZSBjYXN0IGZvciByZXN1bHQgb2YgZnRfc3RybGVuLgotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfcmVhbCk6IFVzZXIgY2FzdCBmb3IgYXNzaWduaW5nCi0JYGV4cCcuCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2luZGV4X2dldF9wb2ludGVycyk6IFVzZSBGVF9VTG9uZyBmb3IKLQlzb21lIGxvY2FsIHZhcmlhYmxlcy4KLQkoY2ZmX2NoYXJzZXRfbG9hZCwgY2ZmX2VuY29kaW5nX2xvYWQpOiBVc2UgY2FzdHMgdG8gRlRfVUludCBmb3Igc29tZQotCXN3aXRjaCBzdGF0ZW1lbnRzLgotCShjZmZfZm9udF9sb2FkKTogVXNlIGNhc3QgaW4gY2FsbCB0byBDRkZfTG9hZF9GRF9TZWxlY3QuCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX3NpemVfaW5pdCk6IFVzZSBtb3JlIGNhc3RzLgotCShjZmZfZmFjZV9pbml0KTogVXNlIEZUX0ludDMyIGZvciBgZmxhZ3MnLgotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfb3BlcmF0b3Jfc2VhYyk6IFVzZSBjYXN0IGZvciBhc3NpZ25pbmcKLQlgYWR4JyBhbmQgYGFkeScuCi0JKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogVXNlIEZUX1VMb25nIGZvciB0aGlyZCBwYXJhbWV0ZXIuCi0JVXNlIG1vcmUgY2FzdHMuCi0JKiBzcmMvY2ZmL2NmZmNtYXAuYyAoY2ZmX2NtYXBfdW5pY29kZV9pbml0KTogVXNlIGNhc3QgZm9yIGBjb3VudCcuCi0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfcmVhZF9zdWJycyk6IFVzZSBGVF9VTG9uZyBmb3IgYGxlbicuCi0JKiBzcmMvY2lkL2NpZGdsb2FkLmMgKGNpZF9sb2FkX2dseXBoKTogQWRkIG1pc3NpbmcgY2FzdCBmb3IKLQlgY2lkX2dldF9vZmZzZXQnLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykgPDE4PjogVXNlCi0JY2FzdCBmb3IgYG51bV9wb2ludHMnLgotCSh0MV9kZWNvZGVyX2luaXQpOiBVc2UgY2FzdCBmb3IgYXNzaWduaW5nIGBkZWNvZGVyLT5udW1fZ2x5cGhzJy4KLQotCSogc3JjL2Jhc2UvZnRkZWJ1Zy5jIChmdF9kZWJ1Z19pbml0KTogVXNlIEZUX0ludC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaCAoRlRfU2xvdF9Mb2FkRnVuYyk6IFVzZQotCWBGVF9JbnQzMicgZm9yIGZvdXJ0aCBwYXJhbWV0ZXIuCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAob3Blbl9mYWNlKTogVXNlIGNhc3QgZm9yIGNhbGxpbmcKLQljbGF6ei0+aW5pdF9mYWNlLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKFNldF9IaWdoX1ByZWNpc2lvbik6IFVzZSBgMScgaW5zdGVhZCBvZgotCWAxTCcuCi0JKEZpbmFsaXplX1Byb2ZpbGVfVGFibGUsIExpbmVfVXAsIGZ0X2JsYWNrX2luaXQpOiBVc2UgY2FzdHMuCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBEaXR0by4KLQotCSogc3JjL3NmbnQvc2ZudF9kaXJfY2hlY2s6IENvbXBhcmUgYG1hZ2ljJyB3aXRoIHVuc2lnbmVkIGxvbmcKLQljb25zdGFudC4KLQotMjAwMi0wOS0yNiAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBVcGRhdGVkLgotCi0yMDAyLTA5LTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9hdXRvaGludC9haHR5cGVzLmggKEFIX0hJTlRfTUVUUklDUyk6IERpc2FibGluZyBtZXRyaWNzCi0JaGludGluZyBpbiB0aGUgYXV0by1oaW50ZXIuICBUaGlzIHByb2R1Y2VzIG11Y2ggYmV0dGVyIGFudGktYWxpYXNlZAotCXRleHQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRpbmcgdGhlIGNoYW5nZXMgZG9jdW1lbnRhdGlvbi4KLQotMjAwMi0wOS0yNSAgQW50aG9ueSBGb2sgIDxhbnRob255QHRoaXpsaW51eC5jb20+Ci0KLQkqIHNyYy9zZm50L3R0Y21hcDAuYyAodHRfY21hcDRfdmFsaWRhdGUsIHR0X2NtYXA0X2NoYXJfaW5kZXgsCi0JdHRfY21hcDRfY2hhcl9uZXh0KTogQWRkZWQgc3VwcG9ydCBmb3Igb3BlbnNfX18udHRmIChpdCBjb250YWlucyBhCi0JY2hhcm1hcCB0aGF0IHVzZXMgb2Zmc2V0PTB4RkZGRlUgaW5zdGVhZCBvZiAweDAwMDAgdG8gaW5kaWNhdGUgYQotCW1pc3NpbmcgZ2x5cGgpLgotCi0yMDAyLTA5LTIxICBXb2xmZ2FuZyBEb21yw7ZzZSAgPHBvcnRob3MuZG9tcm9lc2VAaGFyei5kZT4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKExvYWRfR2x5cGgpOiBGb3VydGggcGFyYW1ldGVyIG11c3QgYmUKLQlGVF9JbnQzMi4KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMsIHNyYy90cnVldHlwZS90dGdsb2FkLmggKFRUX0xvYWRfR2x5cGgpOgotCURpdHRvLgotCi0yMDAyLTA5LTE5ICBXb2xmZ2FuZyBEb21yw7ZzZSAgPHBvcnRob3MuZG9tcm9lc2VAaGFyei5kZT4KLQotCU1vcmUgMTZiaXQgZml4ZXMuCi0KLQkqIHNyYy9hdXRvaGludC9haGdsb2JhbC5jIChzb3J0X3ZhbHVlcyk6IFVzZSBGVF9Qb3MgZm9yIGBzd2FwJy4KLQkoYWhfaGludGVyX2NvbXB1dGVfd2lkdGhzKTogVXNlIEZUX1BvcyBmb3IgYGRpc3QnLgotCVVzZSBBSF9NQVhfV0lEVEhTLgotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYyAoYWhfb3V0bGluZV9zY2FsZV9ibHVlX2VkZ2VzKTogVXNlIEZUX1BvcwotCWZvciBgZGVsdGEnLgotCShhaF9vdXRsaW5lX2NvbXB1dGVfZWRnZXMpOiBSZXBsYWNlIHNvbWUgaW50cyB3aXRoIEZUX0ludCBhbmQKLQlGVF9Qb3MuCi0JKGFoX3Rlc3RfZXh0cmVtYSk6IENsZWFuIHVwIGNvZGUuCi0JKGFoX2dldF9vcmllbnRhdGlvbik6IFVzZSA0IEZUX0ludCB2YXJpYWJsZXMgaW5zdGVhZCBvZiBGVF9CQm94IHRvCi0JaG9sZCBpbmRpY2VzLgotCSogc3JjL2F1dG9oaW50L2FodHlwZXMuaCAoQUhfU2VnbWVudFJlYyk6IENoYW5nZSB0eXBlIG9mIGBzY29yZScKLQl0byBGVF9Qb3MuCi0KLTIwMDItMDktMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlnLmd1ZXNzLCBidWlsZHMvdW5peC9jb25maWcuc3ViOiBVcGRhdGVkIHRvCi0JcmVjZW50IHZlcnNpb25zLgotCi0yMDAyLTA5LTE4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9MaWJyYXJ5X1ZlcnNpb24pOiBCdWdmaXguCi0KLQkqIEZyZWVUeXBlIDIuMS4zcmMyIChyZWxlYXNlIGNhbmRpZGF0ZSAyKSBpcyByZWxlYXNlZCEKLQotMjAwMi0wOS0xNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmgsIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oLAotCWluY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2VyLmgsIGluY2x1ZGUvZnJlZXR5cGUvZnRzeXNpby5oLAotCWluY2x1ZGUvZnJlZXR5cGUvZnRzeXNtZW0uaCwgaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oOiBVcGRhdGluZwotCXRoZSBpbi1zb3VyY2UgZG9jdW1lbnRhdGlvbi4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weTogVXBkYXRpbmcgdGhlIEhUTUwgZm9ybWF0dGVyIGluIHRoZQotCURvY01ha2VyIHRvb2wuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci5weTogUmVtb3ZlZC4KLQotMjAwMi0wOS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTW9yZSAxNmJpdCBmaXhlcy4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChyZWFsbG9jYXRlX3QxX3RhYmxlKTogVXNlIEZUX0xvbmcgZm9yCi0Jc2Vjb25kIHBhcmFtZXRlci4KLQotMjAwMi0wOS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JMTZiaXQgZml4ZXMgZnJvbSBXb2xmZ2FuZyBEb21yw7ZzZS4KLQotCSogc3JjL3R5cGUxL3QxcGFyc2UuaCAoVDFfUGFyc2VyUmVjKTogQ2hhbmdlIHR5cGUgb2YgYGJhc2VfbGVuJwotCWFuZCBgcHJpdmF0ZV9sZW4nIHRvIEZUX0xvbmcuCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChUMV9HZXRfUHJpdmF0ZV9EaWN0KTogUmVtb3ZlIGNhc3QgZm9yCi0JYHByaXZhdGVfbGVuJy4KLQkqIHNyYy90eXBlMS90MWxvYWQuYzogVXNlIEZUX0ludCBjYXN0IGZvciBtb3N0IGNhbGxzIG9mIFQxX1RvSW50LgotCVVzZSBGVF9QdHJEaXN0IHdoZXJlIGFwcHJvcHJpYXRlLgotCShwYXJzZV9lbmNvZGluZyk6IFVzZSBGVF9Mb25nIGZvciBgY291bnQnIGFuZCBgbicuCi0JKHJlYWRfYmluYXJ5X2RhdGEpOiBVc2UgRlRfTG9uZyogZm9yIHNlY29uZCBwYXJhbWV0ZXIuCi0JKiBzcmMvdHlwZTEvdDFhZm0uYyAoYWZtX2F0b2luZGV4KTogVXNlIEZUX1B0ckRpc3QuCi0KLQkqIHNyYy9jYWNoZS9mdGNzYml0cy5jIChmdGNfc2JpdF9ub2RlX2xvYWQpOiBSZW1vdmUgdW51c2VkIGxhYmVsLgotCSogc3JjL3BzaGludGVyL3BzaGFsZ28zLmMgKHBzaDNfaGludF9hbGlnbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0KLTIwMDItMDktMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2luZyBmdGdyYXlzLmMgY29tcGlsZSBzdGFuZC1hbG9uZSBhZ2Fpbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmg6IEluY2x1ZGUgZnQyYnVpbGQuaCBvbmx5IGlmIF9TVEFOREFMT05FXwotCWlzbid0IGRlZmluZWQuCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyBbX1NUQU5EQUxPTkVfXTogRGVmaW5lIGZ0X21lbXNldCwKLQlGVF9CRUdJTl9IRUFERVIsIEZUX0VORF9IRUFERVIuCi0JKEZUX01FTV9aRVJPKTogRGVmaW5lLgotCShUUmFzdGVyKSBbR1JBWVNfVVNFX0dBTU1BXTogVXNlIGB1bnNpZ25lZCBjaGFyJyBpbnN0ZWFkIG9mIEZUX0J5dGUuCi0JKGdyYXlfcmVuZGVyX3NwYW4sIGdyYXlfaW5pdF9nYW1tYSk6IERvbid0IHVzZSBgRlRfVUludCcuCi0JRG9uJ3QgY2FzdCB3aXRoIGBGVF9CeXRlJy4KLQkoZ3JheXNfaW5pdF9nYW1tYSk6IERvbid0IHVzZSBgRlRfVUludCcuCi0KLTIwMDItMDktMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRpbml0LmMgKEZUX0FkZF9EZWZhdWx0X01vZHVsZXMpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0JKiBzcmMvcGNmL3BjZmRyaXZlci5jIChQQ0ZfRmFjZV9Eb25lKTogSW1wcm92ZSB0cmFjaW5nIG1lc3NhZ2UuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIChGVF9NQVhfTU9EVUxFUyk6IEluY3JlYXNlZAotCXRvIDMyLgotCi0yMDAyLTA5LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5hYyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDk6MjozLgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZWQuCi0KLTIwMDItMDktMDkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28yLmMgKHBzaDJfZ2x5cGhfZmluZF9zdHJvbmdfcG9pbnRzKSwKLQlzcmMvcHNoaW50ZXIvcHNoYWxnbzMuYyAocHNoM19nbHlwaF9maW5kX3N0cm9uZ19wb2ludHMpOiBBZGRpbmcgZml4Ci0JdG8gcHJldmVudCBzZWdmYXVsdCB3aGVuIGhpbnRzIGFyZSBwcm92aWRlZCBpbiBhbiBlbXB0eSBnbHlwaC4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmkgKEdFTl9DQUNIRV9MT09LVVApIFtGVF9ERUJVR19MRVZFTF9FUlJPUl06Ci0JUmVtb3ZlZCBjb25kaXRpb25hbCBjb2RlLiAgVGhpcyBmaXhlcyBhIGJ1ZyB0aGF0IHByZXZlbnRlZAotCWNvbXBpbGF0aW9uIGluIGRlYnVnIG1vZGUgb2YgdGVtcGxhdGUgaW5zdGFudGlhdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmg6IFJlbW92ZWQgaW5jb3JyZWN0IGB6ZnRfJyBkZWZpbml0aW9ucwotCWFuZCB1cGRhdGVkIGNvbnN0YW50cyBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZXJfcnVuKTogRml4ZWQgdGhlIENGRiB0YWJsZSBsb2FkZXIuCi0JSXQgZGlkbid0IGFjY2VwdCBlbXB0eSBhcnJheXMsIGFuZCB0aGlzIHByZXZlbnRlZCB0aGUgbG9hZGluZyBvZgotCWNlcnRhaW4gZm9udHMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfRmFjZVJlYyk6IFVwZGF0aW5nIGRvY3VtZW50YXRpb24KLQljb21tZW50LiAgVGhlIGBkZXNjZW5kZXInIHZhbHVlIGlzIGFsd2F5cyAqbmVnYXRpdmUqLCBub3QgcG9zaXRpdmUuCi0KLTIwMDItMDktMDkgIE93ZW4gVGF5bG9yICA8b3dlbkByZWRoYXQuY29tPgotCi0JKiBzcmMvcGNmL3BjZmRyaXZlci5jIChQQ0ZfR2x5cGhfTG9hZCk6IEZpeGluZyBpbmNvcnJlY3QgY29tcHV0YXRpb24KLQlvZiBiaXRtYXAgbWV0cmljcy4KLQotMjAwMi0wOS0wOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JVmFyaW91cyB1cGRhdGVzIHRvIGNvcnJlY3RseSBzdXBwb3J0IHN1Yi1waXhlbCByZW5kZXJpbmcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmg6IEFkZCB0d28gcmVuZGVyZXJzIGZvciBMQ0QuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogVXBkYXRlZC4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2xjZCwKLQlmdF9zbW9vdGhfcmVuZGVyX2xjZF92KTogU2V0IEZUX1BJWEVMX01PREVfTENEIGFuZAotCUZUX1BJWEVMX01PREVfTENEX1YsIHJlc3BlY3RpdmVseS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNpbWFnZS5oIChGVENfSW1hZ2VUeXBlUmVjKTogTmV3Ci0Jc3RydWN0dXJlLgotCVVwZGF0ZWQgYWxsIHVzZXJzLgotCShGVENfSW1hZ2VEZXNjKTogUmVtb3ZlZC4KLQkoRlRDX0ltYWdlQ2FjaGVfTG9va3VwKTogU2Vjb25kIHBhcmFtZXRlciBpcyBub3cgb2YgdHlwZQotCWBGVENfSW1hZ2VUeXBlJy4KLQlVcGRhdGVkIGFsbCB1c2Vycy4KLQkoRlRDX0lNQUdFX0RFU0NfQ09NUEFSRSk6IFVwZGF0ZWQgYW5kIHJlbmFtZWQgdG8uLi4KLQkoRlRDX0lNQUdFX1RZUEVfQ09NUEFSRSk6IFRoaXMuCi0JKEZUQ19JTUFHRV9ERVNDX0hBU0gpOiBVcGRhdGVkIGFuZCByZW5hbWVkIHRvLi4uCi0JKEZUQ19JTUFHRV9UWVBFX0hBU0gpOiBUaGlzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y3NiaXRzLmggKEZUQ19TQml0UmVjKTogRmllbGQgYG51bV9ncmF5cycKLQlyZXBsYWNlZCB3aXRoIGBtYXhfZ3JheXMnLgotCWBwaXRjaCcgaXMgbm93IEZUX1Nob3J0LgotCShGVENfU0JpdENhY2hlX0xvb2t1cCk6IFNlY29uZCBwYXJhbWV0ZXIgaXMgbm93IG9mIHR5cGUKLQlgRlRDX0ltYWdlVHlwZScuCi0JVXBkYXRlZCBhbGwgdXNlcnMuCi0KLQkqIHNyYy9jYWNoZS9mdGNpbWFnZS5jIChGVENfSW1hZ2VRdWVyeVJlYywgRlRDX0ltYWdlRmFtaWx5UmVjKToKLQlVcGRhdGVkLgotCShmdGNfaW1hZ2Vfbm9kZV9pbml0KTogVXBkYXRlZC4KLQlNb3ZlZCBjb2RlIHRvIGNvbnZlcnQgdHlwZSBmbGFncyB0byBsb2FkIGZsYWdzIHRvLi4uCi0JKEZUQ19JbWFnZV9DYWNoZV9Mb29rdXApOiBUaGlzIGZ1bmN0aW9uLgotCShmdGNfaW1hZ2VfZmFtaWx5X2luaXQpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoRlRDX1NCaXRRdWVyeVJlYywgRlRDX1NCaXRGYW1pbHlSZWMpOgotCVVwZGF0ZWQuCi0JKGZ0Y19zYml0X25vZGVfbG9hZCk6IFVwZGF0ZWQuCi0JTW92ZWQgY29kZSB0byBjb252ZXJ0IHR5cGUgZmxhZ3MgdG8gbG9hZCBmbGFncyB0by4uLgotCShGVENfU0JpdENhY2hlX0xvb2t1cCk6IFRoaXMgZnVuY3Rpb24uCi0KLQkqIHNyYy9hdXRvaGludC9haHR5cGVzLmggKEFIX0hpbnRlclJlYyk6IFJlcGxhY2UgYG5vXypfaGludHMnIHdpdGgKLQlgZG9fKl9zbmFwcGluZycuCi0JVXBkYXRlIGFsbCB1c2VycyAod2l0aCBuZWdhdGlvbikuCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2NvbXB1dGVfc3RlbV93aWR0aCk6IEZpeCB0aHJlc2hvbGQgZm9yCi0JYGRpc3QnIGZvciBgZGVsdGEnIDwgNDAuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5oIChQU0gzX0dseXBoUmVjKTogUmVwbGFjZSBgbm9fKl9oaW50cycgd2l0aAotCWBkb18qX3NuYXBwaW5nJy4KLQlVcGRhdGUgYWxsIHVzZXJzICh3aXRoIG5lZ2F0aW9uKS4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5jIChwc2gzX2RpbWVuc2lvbl9xdWFudGl6ZV9sZW4pOiBOZXcKLQlmdW5jdGlvbi4KLQkocHNoM19oaW50X2FsaWduKTogVXNlIGl0LgotCUltcHJvdmUgaGludGluZyBjb2RlLgotCVtTVFJPTkdFUl06IFJlbW92ZWQuCi0JKFNUUk9OR0VSKTogUmVtb3ZlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9TZXRfSGludF9GbGFncywgRlRfSElOVF8qKToKLQlSZW1vdmVkLgotCi0yMDAyLTA5LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkb2Jqcy5jIChDSURfU2l6ZV9Jbml0KTogUmVuYW1lZCB0by4uLgotCShjaWRfc2l6ZV9pbml0KTogVGhpcy4KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAoVDFfQnVpbGRlcl9BZGRfUG9pbnQxKTogUmVuYW1lZCB0by4uLgotCSh0MV9idWlsZGVyX2FkZF9wb2ludDEpOiBUaGlzLgotCi0JVXBkYXRlZCBhbGwgYWZmZWN0ZWQgY29kZS4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28zLmMgKHBzaDNfaGludF9hbGlnbik6IEZpeCBjb21waWxlciB3YXJuaW5ncy4KLQkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX0NvbXB1dGVfTWF4X0FkdmFuY2UpOiBEaXR0by4KLQotMjAwMi0wOS0wNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IENvcnJlY3RlZCB0aGUgZGVmaW5pdGlvbiBvZgotCWZ0X2VuY29kaW5nX3N5bWJvbCB0byBiZSBGVF9FTkNPRElOR19NU19TWU1CT0wgKGluc3RlYWQgb2YKLQl0aGUgZXJyb25lb3VzIEZUX0VOQ09ESU5HX1NZTUJPTCkuCi0KLQkqIGJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChkYXRhZGlyKTogSW5pdGlhbGl6ZSBpdCAodGhhbmtzIHRvCi0JQW50aG9ueSBGb2spLgotCi0yMDAyLTA4LTI5ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlTbGlnaHQgbW9kaWZpY2F0aW9uIHRvIHRoZSBQb3N0c2NyaXB0IGhpbnRlciB0byBzbGlnaHRseSBpbmNyZWFzZQotCXRoZSBjb250cmFzdCBvZiBzbW9vdGggaGludGluZy4gIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHdoYXQgdGhlCi0JYXV0by1oaW50ZXIgZG9lcyB3aGVuIGl0IGNvbWVzIHRvIHN0ZW0gd2lkdGggY29tcHV0YXRpb25zLiAgSG93ZXZlciwKLQlpdCBwcm9kdWNlcyBiZXR0ZXIgcmVzdWx0cyB3aXRoIHdlbGwtaGludGVkIGZvbnRzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX0RlY29kZXJfRnVuY3NSZWMpOiBBZGQgaGludAotCW1vZGUgdG8gYGluaXQnIG1lbWJlciBmdW5jdGlvbi4KLQkoVDFfRGVjb2RlclJlYyk6IEFkZCBoaW50IG1vZGUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzaGludHMgKFQxX0hpbnRzX0FwcGx5RnVuYywKLQlUMl9IaW50c19BcHBseUZ1bmMpOiBQYXNzIGBoaW50X21vZGUnLCBub3QgYGhpbnRfZmxhZ3MnLgotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfaW5pdCk6IEFkZCBoaW50IG1vZGUgYXJndW1lbnQuCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzEuYyAocHMxX2hpbnRzX2FwcGx5KTogUGFzcyBoaW50IG1vZGUsIG5vdAotCWhpbnQgZmxhZ3MuCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzIuYyAocHMyX2hpbnRzX2FwcGx5KTogRGl0dG8uCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzMuYyAocHMzX2hpbnRzX2FwcGx5KTogRGl0dG8uCi0JKFNUUk9OR0VSKTogTmV3IG1hY3JvLgotCShwc2gzX2hpbnRfYWxpZ24sIHBzaDNfaGludF90YWJsZV9hbGlnbl9oaW50cyk6IFBhc3MgYGdseXBoJyBpbnN0ZWFkCi0Jb2YgYGhpbnRfZmxhZ3MnLgotCUltcGxlbWVudCBhbm5vdW5jZWQgY2hhbmdlcy4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5oIChQU0gzX0dseXBoUmVjKTogQWRkIGZsYWdzIHRvIGNvbnRyb2wKLQl2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBoaW50cyBhbmQgc25hcHBpbmcuCi0KLQkqIFJFQURNRSwgZG9jcy9DSEFOR0VTOiBVcGRhdGluZyBmb3IgdGhlIDIuMS4zIHJlbGVhc2UuCi0KLTIwMDItMDgtMjcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogTWFzc2l2ZSByZS1mb3JtYXR0aW5nIGNoYW5nZXMgdG8gbWFueSwgbWFueSBzb3VyY2UgZmlsZXMuICBJIGRvbid0Ci0Jd2FudCB0byBsaXN0IHRoZW0gYWxsIGhlcmUuICBUaGUgb3BlcmF0aW9ucyBwZXJmb3JtZWQgd2VyZSBhbGwKLQlsb2dpY2FsIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgc291cmNlczoKLQotCS0gdHJ5aW5nIHRvIGNvbnZlcnQgYWxsIGVudW1zIGFuZCBjb25zdGFudHMgdG8gQ0FQSVRBTElaRURfU1RZTEUsCi0JICAjd2l0aCBkZWZpbmUgZGVmaW5pdGlvbnMgbGlrZQotCi0JICAgICNkZWZpbmUgbXlfb2xkX2NvbnN0YW50cyAgIE1ZX05FV19DT05TVEFOVAotCi0JLSBiaWcsIGJpZyB1cGRhdGUgb2YgdGhlIGRvY3VtZW50YXRpb24gY29tbWVudHMKLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oLCBzcmMvYmFzZS9mdG9ianMuYywKLQlzcmMvc21vb3RoL2Z0c21vb3RoLmMsIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oOiBBZGRpbmcgc3VwcG9ydAotCWZvciBMQ0Qtb3B0aW1pemVkIHJlbmRlcmluZyB0aG91Z2ggdGhlIG5ldyBjb25zdGFudHMvZW51bXM6Ci0KLQkgIEZUX1JFTkRFUl9NT0RFX0xDRCwgRlRfUkVOREVSX01PREVfTENEX1YKLQkgIEZUX1BJWEVMX01PREVfTENELCAgRlRfUElYRUxfTU9ERV9MQ0RfVgotCi0JVGhpcyBpcyBzdGlsbCB3b3JrIGluIHByb2dyZXNzLCBkb24ndCBleHBlY3QgZXZlcnl0aGluZyB0byB3b3JrCi0JY29ycmVjdGx5IHRob3VnaCBtb3N0IG9mIHRoZSBmZWF0dXJlcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0KLQkqIEFkZGluZyBuZXcgRlRfTE9BRF9YWFggZmxhZ3MsIHVzZWQgdG8gc3BlY2lmeSBib3RoIGhpbnRpbmcgYW5kCi0JcmVuZGVyaW5nIHRhcmdldHM6Ci0KLQkgIEZUX0xPQURfVEFSR0VUX05PUk1BTCA6OiBhbnRpLWFsaWFzZWQgaGludGluZyAmIHJlbmRlcmluZwotCSAgRlRfTE9BRF9UQVJHRVRfTU9OTyAgIDo6IG1vbm9jaHJvbWUgYml0bWFwcwotCSAgRlRfTE9BRF9UQVJHRVRfTENEICAgIDo6IGhvcml6b250YWwgUkdCL0JHUiBkZWNpbWF0ZWQKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50aW5nICYgcmVuZGVyaW5nCi0JICBGVF9MT0FEX1RBUkdFVF9MQ0RfViAgOjogdmVydGljYWwgUkdCL0JHUiBkZWNpbWF0ZWQKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50aW5nICYgcmVuZGVyaW5nCi0KLQlOb3RlIHRoYXQgRlRfTE9BRF9UQVJHRVRfTk9STUFMIGlzIDAsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGRlZmF1bHQKLQliZWhhdmlvdXIgb2YgdGhlIGZvbnQgZW5naW5lIGlzIF91bmNoYW5nZWRfLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaAotCShGVF9PdXRsaW5lX3tNb3ZlLExpbmUsQ29uaWMsQ3ViaWN9VG9fRnVuYyk6IFJlbmFtZWQgdG8uLi4KLQkoRlRfT3V0bGluZV97TW92ZSxMaW5lLENvbmljLEN1YmljfVRvRnVuYyk6IFRoaXMuCi0JKEZUX1Jhc3Rlcl9TcGFuX0Z1bmMpOiBSZW5hbWVkIHRvIC4uLgotCShGVF9TcGFuRnVuYyk6IFRoaXMuCi0JKEZUX1Jhc3Rlcl97TmV3LERvbmUsUmVzZXQsU2V0X01vZGUsUmVuZGVyfV9GdW5jKTogUmVuYW1lZCB0byAuLi4KLQkoRlRfUmFzdGVyX3tOZXcsRG9uZSxSZXNldCxTZXRNb2RlLFJlbmRlcn1GdW5jfTogVGhpcy4KLQotCVVwZGF0ZWQgYWxsIGFmZmVjdGVkIGNvZGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRyZW5kZXIuaAotCShGVF9HbHlwaF97SW5pdCxEb25lLFRyYW5zZm9ybSxCQm94LENvcHksUHJlcGFyZX1fRnVuYyk6IFJlbmFtZWQKLQl0byAuLi4KLQkoRlRfR2x5cGhfe0luaXQsRG9uZSxUcmFuc2Zvcm0sR2V0QkJveCxDb3B5LFByZXBhcmV9RnVuYyk6IFRoaXMuCi0JKEZUUmVuZGVyZXJfe3JlbmRlcix0cmFuc2Zvcm0sZ2V0Q0JveCxzZXRNb2RlfSk6IFJlbmFtZWQgdG8gLi4uCi0JKEZUX1JlbmRlcmVyX3tSZW5kZXJGdW5jLFRyYW5zZm9ybUZ1bmMsR2V0Q0JveEZ1bmMsU2V0TW9kZUZ1bmN9KToKLQlUaGlzLgotCi0JVXBkYXRlZCBhbGwgYWZmZWN0ZWQgY29kZS4KLQotCSogc3JjL2F1dG9oaW50L2FodHlwZXMuaCAoQUhfUG9pbnQsIEFIX1NlZ21lbnQsIEFIX0VkZ2UsIEFIX0dsb2JhbHMsCi0JQUhfRmFjZV9HbG9iYWxzLCBBSF9PdXRsaW5lLCBBSF9IaW50ZXIpOiBUaGVzZSB0eXBlZGVmcyBhcmUgbm93Ci0JcG9pbnRlcnMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYCpSZWMnIHN0cnVjdHVyZXMuICBBbGwgc291cmNlIGZpbGVzCi0JaGF2ZSBiZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfaW5pdCk6IEFkZCBoaW50IG1vZGUgYXMgcGFyYW1ldGVyLgotCSogc3JjL2NmZi9jZmZnbG9hZC5oIChDRkZfRGVjb2Rlcik6IEFkZCBgaGludF9tb2RlJyBlbGVtZW50LgotCi0JKiBzcmMvY2lkL2NpZGdsb2FkLmMgKENJRF9Db21wdXRlX01heF9BZHZhbmNlKTogUmVuYW1lZCB0by4uLgotCShjaWRfZmFjZV9jb21wdXRlX21heF9hZHZhbmNlKTogVGhpcy4KLQkoQ0lEX0xvYWRfR2x5cGgpOiBSZW5hbWVkIHRvLi4uCi0JKGNpZF9zbG90X2xvYWRfZ2x5cGgpOiBUaGlzLgotCSogc3JjL2NpZC9jaWRsb2FkLmMgKENJRF9PcGVuX0ZhY2UpOiBSZW5hbWVkIHRvLi4uCi0JKGNpZF9mYWNlX29wZW4pOiBUaGlzLgotCSogc3JjL2NpZC9jaWRvYmpzLmMgKENJRF9HbHlwaFNsb3Rfe0RvbmUsSW5pdH0pOiBSZW5hbWVkIHRvLi4uCi0JKGNpZF9zbG90X3tkb25lLGluaXR9KTogVGhpcy4KLQkoQ0lEX1NpemVfe0dldF9HbG9iYWxzX0Z1bmNzLERvbmUsUmVzZXQpOiBSZW5hbWVkIHRvLi4uCi0JKGNpZF9zaXplX3tnZXRfZ2xvYmFsc19mdW5jcyxkb25lLHJlc2V0KTogVGhpcy4KLQkoQ0lEX0ZhY2Vfe0RvbmUsSW5pdH0pOiBSZW5hbWVkIHRvLi4uCi0JKGNpZF9mYWNlX3tkb25lLGluaXR9KTogVGhpcy4KLQkoQ0lEX0RyaXZlcl97RG9uZSxJbml0fTogUmVuYW1lZCB0by4uLgotCShjaWRfZHJpdmVyX3tkb25lLGluaXR9OiBUaGlzLgotCSogc3JjL2NpZC9jaWRwYXJzZS5jIChDSURfe05ldyxEb25lfV9QYXJzZXIpOiBSZW5hbWVkIHRvLi4uCi0JKGNpZF9wYXJzZXJfe25ldyxkb25lfSk6IFRoaXMuCi0JKiBzcmMvY2lkL2NpZHBhcnNlLmggKENJRF9Ta2lwX3tTcGFjZXMsQWxwaGF9KTogUmVuYW1lZCB0by4uLgotCShjaWRfcGFyc2VyX3NraXBfe3NwYWNlcyxhbHBoYX0pOiBUaGlzLgotCShDSURfVG97SW50LEZpeGVkLENvb3JkQXJyYXksRml4ZWRBcnJheSxUb2tlbixUb2tlbkFycmF5fSk6IFJlbmFtZWQKLQl0by4uLgotCShjaWRfcGFyc2VyX3RvX3tpbnQsZml4ZWQsY29vcmRfYXJyYXksZml4ZWRfYXJyYXksdG9rZW4sdG9rZW5fYXJyYXl9KToKLQlUaGlzLgotCShDSURfTG9hZF97RmllbGQsRmllbGRfVGFibGUpOiBSZW5hbWVkIHRvLi4uCi0JKGNpZF9wYXJzZXJfbG9hZF97ZmllbGQsZmllbGRfdGFibGV9KTogVGhpcy4KLQkqIHNyYy9jaWQvY2lkcml2ZXIuYyAoQ0lEX0dldF9JbnRlcmZhY2UpOiBSZW5hbWVkIHRvLi4uCi0JKGNpZF9nZXRfaW50ZXJmYWNlKTogVGhpcy4KLQotCVVwZGF0ZWQgYWxsIGFmZmVjdGVkIGNvZGUuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAoUFNfVGFibGVfKik6IFJlbmFtZWQgdG8uLi4KLQkocHNfdGFibGVfKik6IFRoaXMuCi0JKFQxX0J1aWxkZXJfKik6IFJlbmFtZWQgdG8uLi4KLQkodDFfYnVpbGRlcl8qKTogVGhpcy4KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jIChUMV9EZWNvZGVyXyopOiBSZW5hbWVkIHRvLi4uCi0JKHQxX2RlY29kZXJfKik6IFRoaXMuCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKFBTXyopOiBSZW5hbWVkIHRvLi4uCi0JKHBzXyopOiBUaGlzLgotCi0JVXBkYXRlZCBhbGwgYWZmZWN0ZWQgY29kZS4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIgKFNGTlRfR2V0X0ludGVyZmFjZSk6IFJlbmFtZWQgdG8uLi4KLQkoc2ZudF9nZXRfaW50ZXJmYWNlKTogVGhpcy4KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChTRk5UXyopOiBSZW5hbWVkIHRvLi4uCi0JKHNmbnRfKik6IFRoaXMuCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAoVFRfQ2hhck1hcF97TG9hZCxGcmVlfSk6IFJlbmFtZWQgdG8uLi4KLQkodHRfZmFjZV97bG9hZCxmcmVlfV9jaGFybWFwKTogVGhpcy4KLQkqIHNyYy9zZm50L3R0Y21hcDAuYyAoVFRfQnVpbGRfQ01hcHMpOiBSZW5hbWVkIHRvLi4uCi0JKHR0X2ZhY2VfYnVpbGRfY21hcHMpOiBUaGlzLgotCSogc3JjL3NmbnQvdHRsb2FkLmMgKFRUXyopOiBSZW5hbWVkIHRvLi4uCi0JKHR0X2ZhY2VfKik6IFRoaXMuCi0JKiBzcmMvc2ZudC90dHBvc3QuYyAoVFRfUG9zdF9EZWZhdWx0X05hbWVzKTogUmVuYW1lZCB0by4uLgotCSh0dF9wb3N0X2RlZmF1bHRfbmFtZXMpOiBUaGlzLgotCShMb2FkXyopOiBSZW5hbWVkIHRvLi4uCi0JKGxvYWRfKik6IFRoaXMuCi0JKFRUXyopOiBSZW5hbWVkIHRvLi4uCi0JKHR0X2ZhY2VfKik6IFRoaXMuCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAoVFRfKik6IFJlbmFtZWQgdG8uLi4KLQkodHRfZmFjZV8qKTogVGhpcy4KLQkoe0ZpbmQsTG9hZCxDcm9wfV8qKTogUmVuYW1lZCB0by4uLgotCSh7ZmluZCxsb2FkLGNyb3B9XyopOiBUaGlzLgotCi0JVXBkYXRlZCBhbGwgYWZmZWN0ZWQgY29kZS4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyKTogUmVuYW1lZCB0by4uLgotCShmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBUaGlzLgotCU1ha2UgZnVuY3Rpb24gbW9yZSBnZW5lcmljIGJ5IGFkZGluZyB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBzY2FsaW5nCi0JZmFjdG9ycy4KLQkoZnRfc21vb3RoX3JlbmRlciwgZnRfc21vb3RoX3JlbmRlcl9sY2QsIGZ0X3Ntb290aF9yZW5kZXJfbGNkX3YpOgotCU5ldyBmdW5jdGlvbnMuCi0KLQkoZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcywgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3MpOiBOZXcKLQljbGFzc2VzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKFRUX3tEb25lLE5ld31fR2x5cGhab25lKTogUmVuYW1lZCB0by4uLgotCSh0dF9nbHlwaHpvbmVfe2RvbmUsbmV3fSk6IFRoaXMuCi0JKFRUX3tGYWNlLFNpemUsRHJpdmVyfV8qKTogUmVuYW1lZCB0by4uLgotCSh0dF97ZmFjZSxzaXplLGRyaXZlcn1fKik6IFRoaXMuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jIChUVF9Mb2FkX0xvY2F0aW9ucyk6IFJlbmFtZWQgdG8uLi4KLQkodHRfZmFjZV9sb2FkX2xvY2EpOiBUaGlzLgotCShUVF9Mb2FkX1Byb2dyYW1zKTogUmVuYW1lZCB0by4uLgotCSh0dF9mYWNlX2xvYWRfZnBnbSk6IFRoaXMuCi0JKFRUXyopOiBSZW5hbWVkIHRvLi4uCi0JKHR0X2ZhY2VfKik6IFRoaXMuCi0KLTIwMDItMDgtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogTmV3IGZpbGUuCi0KLTIwMDItMDgtMjMgIEdyYWhhbSBBc2hlciAgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfb3BlcmF0b3Jfc2VhYykKLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IEluY3JlbWVudGFsIGZvbnRzIChhY3R1YWxseSBub3QKLQlpbmNyZW1lbnRhbCBpbiB0aGUgY2FzZSBvZiBDRkYgYnV0IGp1c3QgdXNpbmcgY2FsbGJhY2tzIHRvIGdldCBnbHlwaAotCXJlY2lwZXMpIHBhc3MgdGhlIGNoYXJhY3RlciBjb2RlLCBub3QgdGhlIGdseXBoIGluZGV4LCB0byB0aGUKLQlnZXRfZ2x5cGhfZGF0YSBmdW5jdGlvbjsgdGhleSBoYXZlIG5vIHZhbGlkIGNoYXJzZXQgdGFibGUuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfZm9udF9sb2FkKTogUmVtb3ZlZCBzcGVjaWFsIGNhc2VzIGZvcgotCUZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwsIHdoaWNoIGFyZSBubyBsb25nZXIgbmVjZXNzYXJ5OyBDRkYKLQlmb250cyBwcm92aWRlZCB2aWEgdGhlIGluY3JlbWVudGFsIGludGVyZmFjZSBub3cgaGF2ZSB0byBjb25mb3JtCi0JbW9yZSBjbG9zZWx5IHRvIHRoZSBDRkYgZm9udCBmb3JtYXQuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5oIChjZmZfZm9udF9sb2FkKTogUmVtb3ZlZCBhcmd1bWVudCBub3cgdW5uZWVkZWQuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogQ2hhbmdlZCBjYWxsIHRvIGNmZl9mb250X2xvYWQKLQl0byBjb25mb3JtIHdpdGggbmV3IHNpZ25hdHVyZS4KLQotMjAwMi0wOC0yMiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9iamVjdC5jLCBzcmMvYmFzZS9mdHN5bnRoLmMsIHNyYy9iYXNlL2Z0c3Ryb2tlci5jLAotCXNyYy9iZGYvYmRmZHJpdnIuYzogUmVtb3ZlZCBjb21waWxlciB3YXJuaW5ncy4KLQotMjAwMi0wOC0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzMuYyAocHNoM19nbHlwaF9jb21wdXRlX2luZmxlY3Rpb25zLAotCXBzaDNfZ2x5cGhfY29tcHV0ZV9leHRyZW1hLCBwc2gzX2hpbnRfdGFibGVfZmluZF9zdHJvbmdfcG9pbnQpOiBGaXgKLQljb21waWxlciB3YXJuaW5ncyBhbmQgcmVzb2x2ZSBzaGFkb3dpbmcgb2YgbG9jYWwgdmFyaWFibGVzLgotCi0yMDAyLTA4LTIxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlUaGUgYXV0b21hdGljIGFuZCBQb3N0c2NyaXB0IGhpbnRlciBub3cgYXV0b21hdGljYWxseSBkZXRlY3QKLQlpbmZsZWN0aW9uIHBvaW50cyBpbiBnbHlwaCBvdXRsaW5lcyBhbmQgdHJlYXRzIHRoZW0gc3BlY2lhbGx5LiAgVGhpcwotCWlzIHZlcnkgdXNlZnVsIHRvIHByZXZlbnQgbmFzdHkgZWZmZWN0IGxpa2UgdGhlIGRpc2FwcGVhcmluZwotCWRpYWdvbmFscyBvZiBgUycgYW5kIGBzJyBpbiBtYW55LCBtYW55IGZvbnRzLgotCi0JKiBzcmMvYXV0b2hpbnQvYWh0eXBlcy5oIChhaF9mbGFnX2luZmxlY3Rpb24pOiBOZXcgbWFjcm8uCi0JKiBzcmMvYXV0b2hpbnQvYWhhbmdsZXMuYyAoYWhfYW5nbGVfZGlmZik6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy9hdXRvaGludC9haGFuZ2xlcy5oOiBVcGRhdGVkLgotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYyAoYWhfb3V0bGluZV9jb21wdXRlX2luZmxlY3Rpb25zKTogTmV3Ci0JZnVuY3Rpb24uCi0JKGFoX291dGxpbmVfZGV0ZWN0X2ZlYXR1cmVzKTogVXNlIGl0LgotCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50ZXJfYWxpZ25fc3Ryb25nX3BvaW50cykKLQlbIUFIX09QVElPTl9OT19XRUFLX0lOVEVSUE9MQVRJT05dOiBIYW5kbGUgaW5mbGVjdGlvbi4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5LCBzcmMvdG9vbHMvZG9jbWFrZXIvdXRpbHMucHksCi0Jc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weTogVXBkYXRpbmcgdGhlIERvY01ha2VyIHRvb2wuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogQ2hhbmdpbmcgdGhlIHR5cGUgb2YgdGhlIGBsb2FkX2ZsYWdzJwotCXBhcmFtZXRlciBmcm9tIGBGVF9JbnQnIHRvIGBGVF9JbnQzMicsIHRoaXMgaW4gb3JkZXIgdG8gc3VwcG9ydCBtb3JlCi0Jb3B0aW9ucy4gIFRoaXMgc2hvdWxkIG9ubHkgYnJlYWsgYmluYXJ5IGFuZC9vciBzb3VyY2UgY29tcGF0aWJpbGl0eQotCW9uIDE2LWJpdCBwbGF0Zm9ybXMgKEF0YXJpPykuCi0JKEZUX0xPQURfTk9fQVVUT0hJTlQpOiBOZXcgbWFjcm8uCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogVXBkYXRlZC4KLQlIYW5kbGUgRlRfTE9BRF9OT19BVVRPSElOVC4KLQkoRlRfTG9hZF9DaGFyKTogVXBkYXRlZC4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28zLmMsIHNyYy9iYXNlL2Z0b2Jqcy5jLCBzcmMvYmFzZS9mdG9iamVjdC5jLAotCXNyYy9hdXRvaGludC9haGdseXBoLmMsIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogRml4aW5nIHR5cG9zCi0JYW5kIHJlbW92aW5nIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0yMDAyLTA4LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0dldF9NZXRyaWNzKTogQWRkIGd1YXJkIGZvciBrID0gMC4KLQotMjAwMi0wOC0yMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzEuYywgc3JjL3BzaGludGVyL3BzaGFsZ28yLmMsCi0Jc3JjL3BzaGludGVyL3BzaGdsb2IuYywgc3JjL3BzaGludGVyL3BzaHJlYy5jLAotCXNyYy9hdXRvaGludC9haG1vZHVsZS5jIFtERUJVR19ISU5URVJdOiBSZW1vdmluZyBjb21waWxlciB3YXJuaW5ncwotCShvbmx5IHVzZWQgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzIGFueXdheSkuCi0KLQlJbXByb3ZlIHN1cHBvcnQgb2YgbG9jYWwgZXh0cmVtYSBhbmQgc3RlbSBlZGdlIHBvaW50cy4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28zLmggKFBTSDNfSGludF9UYWJsZVJlYyk6IFVzZSBQU0gzX1pvbmVSZWMKLQlmb3IgYHpvbmVzJy4KLQkoUFNIM19ESVJfVVAsIFBTSDNfRElSX0RPV04pOiBFeGNoYW5nZSB2YWx1ZXMuCi0JKFBTSDNfRElSX0hPUklaT05UQUwsIFBTSDNfRElSX1ZFUlRJQ0FMKTogTmV3IG1hY3Jvcy4KLQkoUFNIM19ESVJfQ09NUEFSRSwgUFNIM19ESVJfSVNfSE9SSVpPTlRBTCwgUFNIM19JU19WRVJUSUNBTCk6IE5ldwotCW1hY3Jvcy4KLQkoUFNIM19QT0lOVF9JTkZMRVgpOiBOZXcgZW51bS4KLQkocHNoM19wb2ludF97aXMsc2V0fV97b2ZmLGluZmxleH0pOiBOZXcgbWFjcm9zLgotCShQU0gzX1BPSU5UX3tFWFRSRU1VTSxQT1NJVElWRSxORUdBVElWRSxFREdFX01JTixFREdFX01BWCk6IE5ldwotCWVudW0gdmFsdWVzLgotCShwc2gzX3BvaW50X3tpcyxzZXR9X3tleHRyZW11bSxwb3NpdGl2ZSxuZWdhdGl2ZSxlZGdlX21pbixlZGdlX21heH0pOgotCU5ldyBtYWNyb3MuCi0JKFBTSDNfUG9pbnRSZWMpOiBOZXcgbWVtYmVycyBgZmxhZ3MyJyBhbmQgYG9yZ192Jy4KLQkoUFNIM19QT0lOVF9FUVVBTF9BUkcsIFBTSDNfUE9JTlRfQU5HTEUpOiBOZXcgbWFjcm9zLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzMuYyBbREVCVUdfSElOVEVSXTogUmVtb3ZpbmcgY29tcGlsZXIKLQl3YXJuaW5ncy4KLQkoQ09NUFVURV9JTkZMRVhTKTogTmV3IG1hY3JvLgotCShwc2gzX2hpbnRfYWxpZ24pOiBTaW1wbGlmeSBzb21lIGJhc2ljIGFyaXRobWV0aWMgY29tcHV0YXRpb25zLgotCShwc2gzX3BvaW50X2lzX2V4dHJlbXVtKTogUmVtb3ZlZC4KLQkocHNoM19nbHlwaF9jb21wdXRlX2luZmxlY3Rpb25zKSBbQ09NUFVURV9JTkZMRVhTXTogTmV3IGZ1bmN0aW9uLgotCShwc2gzX2dseXBoX2luaXQpIFtDT01QVVRFX0lORkxFWFNdOiBVc2UgaXQuCi0JKHBzaDNfZ2x5cGhfY29tcHV0ZV9leHRyZW1hKTogTmV3IGZ1bmN0aW9uLgotCShQU0gzX1NUUk9OR19USFJFU0hPTEQpOiBJbmNyZWFzZWQgdG8gMzAuCi0JKHBzaDNfaGludF90YWJsZV9maW5kX3N0cm9uZ19wb2ludCk6IEltcHJvdmVkLgotCShwc2gzX2dseXBoX2ZpbmRfc3Ryb25nX3BvaW50cywKLQlwc2gzX2dseXBoX2ludGVycG9sYXRlX3N0cm9uZ19wb2ludHMpOiBVcGRhdGVkLgotCShwc2gzX2hpbnRzX2FwcGx5KTogVXNlIHBzaDNfZ2x5cGhfY29tcHV0ZV9leHRyZW1hLgotCi0JKiB0ZXN0L2d2aWV3LmMgKGRyYXdfcHMzX2hpbnQsIHBzM19kcmF3X2NvbnRyb2xfcG9pbnRzKTogTmV3Ci0JZnVuY3Rpb25zLgotCU90aGVyIHNtYWxsIHVwZGF0ZXMuCi0KLQkqIEphbWZpbGU6IFNtYWxsIHVwZGF0ZXMuCi0KLTIwMDItMDgtMTggIEFya2FkaXVzeiBNaXNraWV3aWN6ICA8bWlzaWVrQHBsZC5PUkcuUEw+Ci0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwsIHVuaW5zdGFsbCk6IEFkZCAkKERFU1RESVIpIHRvCi0JbWFrZSBsaWZlIGVhc2llciBmb3IgcGFja2FnZSBtYWludGFpbmVycy4KLQotMjAwMi0wOC0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcGNmL3BjZmRyaXZlci5jIChQQ0ZfR2x5cGhfTG9hZCk6IEZpeCBjb21wdXRhdGlvbiBvZgotCWhvcmlCZWFyaW5nWC4KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0dseXBoX0xvYWQpOiBGaXggY29tcHV0YXRpb24gb2YKLQlob3JpQmVhcmluZ1kuCi0KLTIwMDItMDgtMTYgIEdlb3JnZSBXaWxsaWFtcyAgPGd3d0BzaWxjb20uY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIEFwcGxlIGNvbXBvc2l0ZSBnbHlwaHMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRCk6IE5ldyBtYWNyby4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoT1ZFUkxBUF9DT01QT1VORCwgU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQsCi0JVU5TQ0FMRURfQ09NUE9ORU5UX09GRlNFVCk6IE5ldyBtYWNyb3MgZm9yIGFkZGl0aW9uYWwgT3BlblR5cGUKLQlnbHlwaCBsb2FkaW5nIGZsYWdzLgotCShsb2FkX3RydWV0eXBlX2dseXBoKTogSW1wbGVtZW50IGl0LgotCi0yMDAyLTA4LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2ZyZWVfZ2x5cGhfZGF0YSksCi0Jc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2xvYWQpOiBVc2UgRlRfVU5VU0VELgotCi0yMDAyLTA4LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyAoRlRfR2x5cGhfVG9fQml0bWFwKTogSW5pdGlhbGl6ZSBgZXJyb3InLgotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKFNGTlRfTG9hZF9GYWNlKTogRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMDItMDgtMTUgIEdyYWhhbSBBc2hlciAgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4KLQotCUltcGxlbWVudGVkIHRoZSBpbmNyZW1lbnRhbCBmb250IGxvYWRpbmcgc3lzdGVtIGZvciB0aGUgQ0ZGIGRyaXZlci4KLQlUZXN0ZWQgdXNpbmcgdGhlIEdob3N0U2NyaXB0LXRvLUZyZWVUeXBlIGJyaWRnZSAodW5kZXIgZGV2ZWxvcG1lbnQpLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9nZXRfZ2x5cGhfZGF0YSwgY2ZmX2ZyZWVfZ2x5cGhfZGF0YSk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoY2ZmX29wZXJhdG9yX3NlYWMsIGNmZl9jb21wdXRlX21heF9hZHZhbmNlLCBjZmZfc2xvdF9sb2FkKTogVXNlCi0JdGhlbS4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfZm9udF9sb2FkKTogQWRkIGBmYWNlJyBwYXJhbWV0ZXIuCi0JTG9hZCBjaGFyc2V0IGFuZCBlbmNvZGluZyBvbmx5IGlmIHRoZXJlIGFyZSBnbHlwaHMuCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBJbmNyZW1lbnRhbCBmb250cyBkb24ndCBuZWVkCi0JY2hhcmFjdGVyIHJlY2lwZXMuCi0JKiBzcmMvY2ZmL2NmZmxvYWQuaCwgc3JjL2NmZi9jZmZvYmpzLmM6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX2xvYWRfZ2x5cGgpCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBDb3JyZWN0ZWQgdGhlIGluY3JlbWVudGFsIGZvbnQKLQlsb2FkaW5nIGltcGxlbWVudGF0aW9uIHRvIHVzZSB0aGUgbmV3IHN5c3RlbSBpbnRyb2R1Y2VkIG9uCi0JMjAwMi0wOC0wMS4KLQotMjAwMi0wOC0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmNtYXAuYzogUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMsIHNyYy9jYWNoZS9mdGNjYWNoZS5pLAotCXNyYy9wZnIvcGZybG9hZC5jLCBzcmMvcGZyL3Bmcmdsb2FkLmM6IHMvaW5kZXgvaWR4Ly4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jOiBzL3NlbGVjdC9mZHNlbGVjdC8uCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmM6IHMvd2FpdC93YWl0aW5nLy4KLQotMjAwMi0wOC0wMSAgR3JhaGFtIEFzaGVyICA8Z3JhaGFtLmFzaGVyQGJ0aW50ZXJuZXQuY29tPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKFQxX09wZW5fRmFjZSk6IFRvbGVyYXRlIGEgZmFjZSB3aXRoIG5vCi0JY2hhcnN0cmluZ3MgaWYgdGhlcmUgaXMgYW4gaW5jcmVtZW50YWwgbG9hZGluZyBpbnRlcmZhY2UuICBUeXBlIDEKLQlmYWNlcyBzdXBwbGllZCBieSBQb3N0U2NyaXB0IGludGVycHJldGVycyBsaWtlIEdob3N0U2NyaXB0IHdpbGwKLQl0eXBpY2FsbHkgbm90IHByb3ZpZGUgYW55IGNoYXJzdHJpbmdzIGF0IGxvYWQgdGltZSwgc28gdGhpcyBpcwotCWVzc2VudGlhbCBpZiB0aGV5IGFyZSB0byB3b3JrLgotCi0yMDAyLTA4LTAxICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQlNb2RpZmllZCBpbmNyZW1lbnRhbCBsb2FkaW5nIGludGVyZmFjZSB0byBiZSBjbG9zZXIgdG8gRGF2aWQncwotCXByZWZlcmVuY2VzLiAgVGhlIGhlYWRlciBmcmVldHlwZS5oIGlzIG5vdCBub3cgYWZmZWN0ZWQsIHRoZQotCWludGVyZmFjZSBpcyBzcGVjaWZpZWQgdmlhIGFuIEZUX1BhcmFtZXRlciwgdGhlIHBvaW50ZXIgdG8gdGhlCi0JaW50ZXJmYWNlIGlzIGhpZGRlbiBpbiBhbiBpbnRlcm5hbCBwYXJ0IG9mIHRoZSBmYWNlIHJlY29yZCwgYW5kIGFsbAotCXRoZSBkZWZpbml0aW9ucyBhcmUgaW4gZnRpbmNyZW0uaC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIFtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXToKLQlSZW1vdmVkLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCBbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06Ci0JSW5jbHVkZSBGVF9JTkNSRU1FTlRBTF9ILgotCShGVF9GYWNlX0ludGVybmFsUmVjKSBbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IEFkZAotCWBpbmNyZW1lbnRhbF9pbnRlcmZhY2UnLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAob3Blbl9mYWNlLCBGVF9PcGVuX0ZhY2UpCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBVcGRhdGVkLgotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKFNGTlRfTG9hZF9GYWNlKSBbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06Ci0JVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCkKLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IFVwZGF0ZWQuCi0JRnJlZSBsb2FkZWQgZ2x5cGggZGF0YSBwcm9wZXJseS4KLQkoY29tcHV0ZV9nbHlwaF9tZXRyaWNzLCBUVF9Mb2FkX0dseXBoKQotCVtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogVXBkYXRlZC4KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAoVFRfRmFjZV9Jbml0KQotCVtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogVXBkYXRlZC4KLQotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZykKLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IFVwZGF0ZWQuCi0JKFQxX1BhcnNlX0dseXBoKSBbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IFVwZGF0ZWQuCi0JRnJlZSBsb2FkZWQgZ2x5cGggZGF0YSBwcm9wZXJseS4KLQkoVDFfTG9hZF9HbHlwaCk6IFVwZGF0ZWQuCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBGcmVlIGxvYWRlZCBnbHlwaCBkYXRhIHByb3Blcmx5LgotCi0yMDAyLTA3LTMwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaDogQWRkaW5nIG5ldyBleHBlcmltZW50YWwgaGVhZGVyIGZpbGUKLQl0byBkZW1vbnN0cmF0ZSBhIGBjbGVhbmVyJyBBUEkgdG8gc3VwcG9ydCBpbmNyZW1lbnRhbCBmb250IGxvYWRpbmcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX0lOQ1JFTUVOVEFMX0gpOiBOZXcgbWFjcm8uCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci8qOiBBZGRpbmcgbmV3IChtb3JlIGFkdmFuY2VkKSB2ZXJzaW9uIG9mCi0JdGhlIERvY01ha2VyIHRvb2wsIHVzaW5nIFB5dGhvbidzIHNvcGhpc3RpY2F0ZWQgcmVnZXhwcy4KLQotMjAwMi0wNy0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0Jcy9mdF9tZW1zZXQvRlRfTUVNX1NFVC8uCi0Jcy9GVF9NRU1fU0VUL0ZUX01FTV9aRVJPLyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotMjAwMi0wNy0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoc2ZudF9kaXJfY2hlY2spOiBNYWtlIGl0IHdvcmsgd2l0aCBUVENzLgotCi0yMDAyLTA3LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBzL21lbXNldC9mdF9tZW1zZXQvLgotCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKGFoX2hpbnRfZWRnZXNfMyk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9lbmNvZGluZ19sb2FkKTogUmVtb3ZlIGBtZW1vcnknIHZhcmlhYmxlLgotCSogc3JjL2NmZi9jZmZjbWFwLmMgKGNmZl9jbWFwX2VuY29kaW5nX2luaXQpOiBSZW1vdmUgYHBzbmFtZXMnCi0JdmFyaWFibGUuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogUmVtb3ZlIHN0YXRlbWVudAotCXdpdGhvdXQgZWZmZWN0LgotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyIChHZXRfQ2hhcl9JbmRleCwgR2V0X05leHRfQ2hhcik6IFJlbW92ZWQuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5jIChwc2gzX2hpbnRfdGFibGVfcmVjb3JkLAotCXBzaDNfaGludF90YWJsZV9pbml0LCBwc2gzX2hpbnRfdGFibGVfYWN0aXZhdGVfbWFzayk6IEZpeCBlcnJvcgotCW1lc3NhZ2UuCi0KLTIwMDItMDctMjQgIEdyYWhhbSBBc2hlciAgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jOiBGaXggZm9yIGJ1ZyByZXBvcnRlZCBieSBTdmVuIE5ldW1hbm4KLQlbc3ZlbkBnaW1wLm9yZ10gb24gdGhlIEZyZWVUeXBlIGRldmVsb3BtZW50IGZvcnVtOiBgSWYKLQlGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMIGlzIHVuZGVmaW5lZCAodGhpcyBpcyB0aGUgZGVmYXVsdCksIHRoZQotCVRydWVUeXBlIGxvYWRlciBjcmFzaGVzIGluIGxpbmUgODUyIG9mIHNyYy90cnVldHlwZS90dGdsb2FkLmMgd2hlbgotCWl0IHRyaWVzIHRvIGFjY2VzcyBmYWNlLT5nbHlwaF9sb2NhdGlvbnMuJwotCi0yMDAyLTA3LTE4ICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQlBZGRlZCB0eXBlcyBhbmQgc3RydWN0dXJlcyB0byBzdXBwb3J0IGluY3JlbWVudGFsIHR5cGVmYWNlIGxvYWRpbmcuCi0JVGhlIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZSBzdHJ1Y3R1cmUsIGRlZmluZWQgaW4gZnJlZXR5cGUuaCwgaXMKLQlkZXNpZ25lZCB0byBiZSBwYXNzZWQgdG8gRlRfT3Blbl9GYWNlIHRvIHByb3ZpZGUgY2FsbGJhY2sgZnVuY3Rpb25zCi0JdG8gb2J0YWluIGdseXBoIHJlY2lwZXMgYW5kIG1ldHJpY3MsIGZvciBmb250cyBsaWtlIHRob3NlIHBhc3NlZAotCWZyb20gUG9zdFNjcmlwdCB0aGF0IGRvIG5vdCBuZWNlc3NhcmlseSBwcm92aWRlIGFsbCwgb3IgYW55LCBnbHlwaAotCWluZm9ybWF0aW9uLCB3aGVuIGZpcnN0IG9wZW5lZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCAoRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCk6Ci0JTmV3IGNvbmZpZ3VyYXRpb24gbWFjcm8gdG8gZW5hYmxlIGluY3JlbWVudGFsIGZhY2UgbG9hZGluZy4gIEJ5Ci0JZGVmYXVsdCBpdCBpcyBub3QgZGVmaW5lZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9CYXNpY19HbHlwaF9NZXRyaWNzLAotCUZUX0dldF9HbHlwaF9EYXRhX0Z1bmMsIEZUX0dldF9HbHlwaF9NZXRyaWNzX0Z1bmMsCi0JRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlX0Z1bmNzLCBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2UpCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBOZXcuCi0JKEZUX09wZW5fQXJncywgRlRfRmFjZVJlYykgW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBOZXcgZmllbGQKLQlgaW5jcmVtZW50YWxfaW50ZXJmYWNlJy4KLQkoRlRfT3Blbl9GbGFncykgW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBOZXcgZW51bQotCWBmdF9vcGVuX2luY3JlbWVudGFsJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmg6IEluY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ILgotCShGVF9EYXRhKTogTmV3IHN0cnVjdHVyZSB0byByZXByZXNlbnQgYmluYXJ5IGRhdGEuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChvcGVuX2ZhY2UpIFtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXToKLQlBZGQgcGFyYW1ldGVyIGZvciBpbmNyZW1lbnRhbCBsb2FkaW5nLgotCShGVF9PcGVuX0ZhY2UpIFtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogVXNlIGluY3JlbWVudGFsCi0JaW50ZXJmYWNlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKQotCVtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogQWRkZWQgdGhlIGluY3JlbWVudGFsIGxvYWRpbmcgc3lzdGVtCi0JZm9yIHRoZSBUcnVlVHlwZSBkcml2ZXIuCi0JKGNvbXB1dGVfZ2x5cGhfbWV0cmljcyk6IFJldHVybiBGVF9FcnJvci4KLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IENoZWNrIGZvciBvdmVycmlkaW5nIG1ldHJpY3MuCi0JKFRUX0xvYWRfR2x5cGgpIFtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogRG9uJ3QgbG9vayBmb3IKLQl0aGUgZ2x5cGggdGFibGUgd2hpbGUgaGFuZGxpbmcgYW4gaW5jcmVtZW50YWwgZm9udC4KLQlHZXQgZ2x5cGggb2Zmc2V0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKFRUX0ZhY2VfSW5pdCkKLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IEFkZGVkIHRoZSBpbmNyZW1lbnRhbCBsb2FkaW5nCi0Jc3lzdGVtIGZvciB0aGUgVHJ1ZVR5cGUgZHJpdmVyLgotCi0JKiBzcmMvY2lkL2NpZGdsb2FkLmMgKGNpZF9sb2FkX2dseXBoKQotCVtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXTogQWRkZWQgdGhlIGluY3JlbWVudGFsIGxvYWRpbmcgc3lzdGVtCi0JZm9yIHRoZSBDSUQgZHJpdmVyLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoU0ZOVF9Mb2FkX0ZhY2UpIFtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXToKLQlDaGFuZ2VzIHRvIHN1cHBvcnQgaW5jcmVtZW50YWwgVHlwZSA0MiBmb250czogQXNzdW1lIGEgZm9udCBoYXMKLQlnbHlwaHMgaWYgaXQgaGFzIGFuIGluY3JlbWVudGFsIGludGVyZmFjZSBvYmplY3QuCi0KLQkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX1BhcnNlX0dseXBoKTogUmVuYW1lZCB0by4uLgotCShUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKTogVGhpcy4KLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IEFkZGVkIHN1cHBvcnQgZm9yIGluY3JlbWVudGFsbHkKLQlsb2FkZWQgVHlwZSAxIGZhY2VzLgotCShUMV9QYXJzZV9HbHlwaCk6IE5ldyBmdW5jdGlvbi4KLQkoVDFfTG9hZF9HbHlwaCk6IFVwZGF0ZWQuCi0KLTIwMDItMDctMTcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUNsZWFuaW5nIHVwIHRoZSBjYWNoZSBzdWItc3lzdGVtIGNvZGU7IGxpbmVhciBoYXNoaW5nIGlzIG5vdyB0aGUKLQlkZWZhdWx0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y2NhY2hlLmgsIHNyYy9jYWNoZS9mdGNjYWNoZS5pLAotCXNyYy9jYWNoZS9mdGNjYWNoZS5jIFshRlRDX0NBQ0hFX1VTRV9MSU5FQVJfSEFTSElOR106IFJlbW92ZWQuCi0JKEZUQ19DQUNIRV9VU0VfTElORUFSX0hBU0hJTkcpOiBSZW1vdmVkIGFsc28uCi0KLQlGVF9DT05GSUdfT1BUSU9OX1VTRV9DTUFQUyBpcyBub3cgdGhlIGRlZmF1bHQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaCAoRlRfRHJpdmVyX0NsYXNzUmVjKTogUmVtb3ZlCi0JYGdldF9jaGFyX2luZGV4JyBhbmQgYGdldF9uZXh0X2NoYXInLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oLCBzcmMvYmFzZS9mdG9ianMuYywKLQlzcmMvYmRmL2JkZmRyaXZyLmMsIHNyYy9jZmYvY2Zmb2Jqcy5jLCBzcmMvcGNmL3BjZmRyaXZyLmMsCi0Jc3JjL3Bmci9wZnJkcml2ci5jLCBzcmMvc2ZudC9zZm9ianMuYywgc3JjL3NmbnQvdHRjbWFwMC5jLAotCXNyYy9zZm50L3R0Y21hcDAuaCwgc3JjL3NmbnQvdHRsb2FkLmMsIHNyYy90eXBlMS90MW9ianMuYywKLQlzcmMvdHlwZTQyL3Q0Mm9ianMuYywgc3JjL3dpbmZvbnRzL3dpbmZudC5jCi0JWyFGVF9DT05GSUdfT1BUSU9OX1VTRV9DTUFQU106IFJlbW92ZWQuICBUaGUgbmV3IGNtYXAgY29kZSBpcyBub3cKLQl0aGUgZGVmYXVsdC4KLQotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmMgKFQ0Ml9DTWFwX0NoYXJJbmRleCwgVDQyX0NNYXBfQ2hhck5leHQpOgotCVJlbW92ZWQuCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuaDogVXBkYXRlZC4KLQotCSogc3JjL2NpZC9jaWRyaXZlci5jIChDaWRfR2V0X0NoYXJfSW5kZXgsIENpZF9HZXRfTmV4dF9DaGFyKToKLQlSZW1vdmVkLgotCSh0MWNpZF9kcml2ZXJfY2xhc3MpOiBVcGRhdGVkLgotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X2RyaXZlcl9jbGFzcyk6IFVwZGF0ZWQuCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYyAoR2V0X0NoYXJfSW5kZXgsIEdldF9OZXh0X0NoYXIpOiBSZW1vdmVkCi0JKHQxX2RyaXZlcl9jbGFzcyk6IFVwZGF0ZWQuCi0JKiBzcmMvdHlwZTQyL3Q0MmRyaXZyLmMgKHQ0Ml9kcml2ZXJfY2xhc3MpOiBVcGRhdGVkLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAob3Blbl9mYWNlKTogU2VsZWN0IFVuaWNvZGUgY21hcCBieSBkZWZhdWx0LgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoVFRfTG9hZF9TRk5UX0hlYWRlcik6IEZpeGVkIGEgcmVjZW50IGJ1ZyB0aGF0Ci0JcHJldmVudGVkIE9wZW5UeXBlIGZvbnRzIHRvIGJlIHJlY29nbml6ZWQgYnkgRnJlZVR5cGUuCi0KLTIwMDItMDctMTEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUNoYW5naW5nIHRoZSBTRk5UIGxvYWRlciB0byBjaGVjayBmb3IgU0ZOVC1iYXNlZCBmb250IGZpbGVzCi0JZGlmZmVyZW50bHkuICBXZSBub3cgaWdub3JlIHRoZSByYW5nZSBgaGVscGVyJyBmaWVsZHMgYW5kIGNoZWNrIHRoZQotCWBoZWFkJyB0YWJsZSdzIG1hZ2ljIG51bWJlciBpbnN0ZWFkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoU0ZOVF9IZWFkZXJSZWMpOiBBZGQgYG9mZnNldCcKLQlmaWVsZC4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHNmbnRfZGlyX2NoZWNrKTogTmV3IGZ1bmN0aW9uLgotCShUVF9Mb2FkX1NGTlRfSGVhZGVyUmVjKTogUmVuYW1lZCB0by4uLgotCShUVF9Mb2FkX1NGTlRfSGVhZGVyKTogVGhpcy4KLQlJbXBsZW1lbnQgbmV3IGZ1bmN0aW9uYWxpdHkuCi0JKiBzcmMvc2ZudC90dGxvYWQuaDogVXBkYXRlZC4KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfaW50ZXJmYWNlKTogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRvYmplY3QuYywgc3JjL2Jhc2UvZnRoYXNoLmM6IFVwZGF0ZWQgb2JqZWN0IHN1Yi1zeXN0ZW0KLQlhbmQgZHluYW1pYyBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIChzdGlsbCBleHBlcmltZW50YWwsIGRvbid0Ci0JdXNlKS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmg6IFVwZGF0ZWQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9MaWJyYXJ5UmVjKTogTmV3IG1lbWJlcgotCWBtZXRhX2NsYXNzJy4KLQotCUZpeGluZyBhIGJ1ZyBpbiB0aGUgVHlwZSAxIGxvYWRlciB0aGF0IHByZXZlbnRlZCB2YWxpZCBmb250IGJvdW5kaW5nCi0JYm94ZXMgdG8gYmUgbG9hZGVkIGZyb20gbXVsdGlwbGUgbWFzdGVyIGZvbnRzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmggKFBTX0JsZW5kUmVjKTogQWRkIGBiYm94ZXMnIGZpZWxkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX0ZpZWxkVHlwZSk6IEFkZAotCWBUMV9GSUVMRF9UWVBFX0JCT1gnLgotCShUMV9GaWVsZExvY2F0aW9uKTogQWRkIGBUMV9GSUVMRF9MT0NBVElPTl9CQk9YJy4KLQkoVDFfRklFTERfQkJPWCk6IE5ldyBtYWNyby4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChQU19QYXJzZXJfTG9hZEZpZWxkKTogSGFuZGxlIFQxX0ZJRUxEX1RZUEVfQkJPWC4KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAodDFfYWxsb2NhdGVfYmxlbmQpOiBDcmVhdGUgYmxlbmQtPmJib3hlcy4KLQkoVDFfRG9uZV9CbGVuZCk6IEZyZWUgYmxlbmQtPmJib3hlcy4KLQkodDFfbG9hZF9rZXl3b3JkKTogSGFuZGxlIFQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1guCi0JKHBhcnNlX2ZvbnRfYmJveCk6IENvbW1lbnRlZCBvdXQuCi0JKHQxX2tleXdvcmRzKTogQ29tbWVudCBvdXQgYHBhcnNlX2ZvbnRfYmJveCcuCi0JKiBzcmMvdHlwZTEvdDF0b2tlbnMuaDogRGVmaW5lIGBGb250QkJveCcgZmllbGQuCi0KLTIwMDItMDctMTAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmM6IFNtYWxsIGZpeCB0byBzZWxlY3QgdGhlIFVuaWNvZGUgY2hhcm1hcCBieQotCWRlZmF1bHQgd2hlbiBuZWVkZWQuCi0JU21hbGwgZml4IHRvIGFsbG93IE9wZW5UeXBlIGZvbnRzIHRvIHN1cHBvcnQgQWRvYmUgY2hhcm1hcHMgd2hlbgotCW5lZWRlZC4KLQotCSogc3JjL2NmZi9jZmZjbWFwLmMsIHNyYy9jZmYvY2ZmY21hcC5oOiBOZXcgZmlsZXMgdG8gc3VwcG9ydAotCWNoYXJtYXBzIGZvciBDRkYgZm9udHMuCi0KLQkqIHNyYy9jZmYvY2ZmLmMsIHNyYy9jZmYvSmFtZmlsZSwgc3JjL2NmZi9ydWxlcy5tazogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oIChDRkZfRW5jb2RpbmdSZWMpOiBVc2UKLQlmaXhlZC1sZW5ndGggYXJyYXlzIGZvciBgc2lkcycgYW5kIGBjb2RlcycuICBBZGQgYGNvdW50JyBtZW1iZXIuCi0JKENGRl9Gb250UmVjKTogQWRkIGBwc25hbWVzJyBtZW1iZXIuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL2NmZi9jZmZsb2FkLmMsIHNyYy9jZmYvY2ZmbG9hZC5oLAotCXNyYy9jZmYvY2Zmb2Jqcy5jLCBzcmMvY2ZmL2NmZm9ianMuaCwgc3JjL2NmZi9jZmZwYXJzZS5jLAotCXNyYy9jZmZwYXJzZS5oLCBzcmMvY2ZmL2NmZmdsb2FkLmMsIHNyYy9jZmYvY2ZmZ2xvYWQuaDogQWRkaW5nCi0Jc3VwcG9ydCBmb3IgQ0ZGIGNoYXJtYXBzLCByZWZvcm1hdHRpbmcgdGhlIHNvdXJjZXMsIGFuZCByZW1vdmluZwotCXNvbWUgYnVncyBpbiB0aGUgRW5jb2RpbmcgYW5kIENoYXJzZXQgbG9hZGVycy4KLQlNYW55IGZvbnRzIHJlbmFtZWQgdG8gdXNlIGxvd2VyY2FzZSBvbmx5OgotCi0JICBDRkZfQnVpbGRlcl9Jbml0IC0+IGNmZl9idWlsZGVyX2luaXQKLQkgIENGRl9CdWlsZGVyX0RvbmUgLT4gY2ZmX2J1aWxkZXJfZG9uZQotCSAgQ0ZGX0luaXRfRGVjb2RlciAtPiBjZmZfZGVjb2Rlcl9pbml0Ci0JICBDRkZfUGFyc2VfQ2hhclN0cmluZ3MgLT4gY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MKLQkgIENGRl9Mb2FkX0dseXBoIC0+IGNmZl9zbG90X2xvYWQKLQkgIENGRl9Jbml0X0RlY29kZXIgLT4gY2ZmX2RlY29kZXJfaW5pdAotCSAgQ0ZGX1ByZXBhcmVfRGVjb2RlciAtPiBjZmZfZGVjb2Rlcl9wcmVwYXJlCi0JICBDRkZfR2V0X1N0YW5kYXJkX0VuY29kaW5nIC0+IGNmZl9nZXRfc3RhbmRhcmRfZW5jb2RpbmcKLQkgIENGRl9BY2Nlc3NfRWxlbWVudCAtPiBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQKLQkgIENGRl9Gb3JnZXRfRWxlbWVudCAtPiBjZmZfaW5kZXhfZm9yZ2V0X2VsZW1lbnQKLQkgIENGRl9HZXRfTmFtZSAtPiBjZmZfaW5kZXhfZ2V0X25hbWUKLQkgIENGRl9HZXRfU3RyaW5nIC0+IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZwotCSAgQ0ZGX0dldF9GRCAtPiBjZmZfZmRfc2VsZWN0X2dldAotCSAgQ0ZGX0RvbmVfQ2hhcnNldCAtPiBjZmZfY2hhcnNldF9kb25lCi0JICBDRkZfTG9hZF9DaGFyc2V0IC0+IGNmZl9jaGFyc2V0X2xvYWQKLQkgIENGRl9Eb25lX0VuY29kaW5nIC0+IGNmZl9lbmNvZGluZ19kb25lCi0JICBDRkZfTG9hZF9FbmNvZGluZyAtPiBjZmZfZW5jb2RpbmdfbG9hZAotCSAgQ0ZGX0RvbmVfU3ViRm9udCAtPiBjZmZfc3ViZm9udF9kb25lCi0JICBDRkZfTG9hZF9Gb250IC0+IGNmZl9mb250X2xvYWQKLQkgIENGRl9Eb25lX0ZvbnQgLT4gY2ZmX2ZvbnRfZG9uZQotCSAgQ0ZGX1NpemVfR2V0X0dsb2JhbHNfRnVuY3MgLT4gY2ZmX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MKLQkgIENGRl9TaXplX0RvbmUgLT4gY2ZmX3NpemVfZG9uZQotCSAgQ0ZGX1NpemVfSW5pdCAtPiBjZmZfc2l6ZV9pbml0Ci0JICBDRkZfU2l6ZV9SZXNldCAtPiBjZmZfc2l6ZV9yZXNldAotCSAgQ0ZGX0dseXBoU2xvdF9Eb25lIC0+IGNmZl9zbG90X2RvbmUKLQkgIENGRl9HbHlwaFNsb3RfSW5pdCAtPiBjZmZfc2xvdF9pbml0Ci0JICBDRkZfU3RyQ29weSAtPiBjZmZfc3RyY3B5Ci0JICBDRkZfRmFjZV9Jbml0IC0+IGNmZl9mYWNlX2luaXQKLQkgIENGRl9GYWNlX0RvbmUgLT4gY2ZmX2ZhY2VfZG9uZQotCSAgQ0ZGX0RyaXZlcl9Jbml0IC0+IGNmZl9kcml2ZXJfaW5pdAotCSAgQ0ZGX0RyaXZlcl9Eb25lIC0+IGNmZl9kcml2ZXJfZG9uZQotCSAgQ0ZGX1BhcnNlcl9Jbml0IC0+IGNmZl9wYXJzZXJfaW5pdAotCSAgQ0ZGX1BhcnNlcl9SdW4gLT4gY2ZmX3BhcnNlcl9ydW4KLQotCSAgYWRkX3BvaW50IC0+IGNmZl9idWlsZGVyX2FkZF9wb2ludAotCSAgYWRkX3BvaW50MSAtPiBjZmZfYnVpbGRlcl9hZGRfcG9pbnQxCi0JICBhZGRfY29udG91ciAtPiBjZmZfYnVpbGRlcl9hZGRfY29udG91cgotCSAgY2xvc2VfY29udG91ciAtPiBjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyCi0JICBjZmZfZXhwbGljaXRfaW5kZXggLT4gY2ZmX2luZGV4X2dldF9wb2ludGVycwotCi0yMDAyLTA3LTA5ICBPd2VuIFRheWxvciAgPG93ZW5AcmVkaGF0LmNvbT4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2dsb2JhbHNfbmV3KTogRml4ZWQgYSBidWcgdGhhdAotCXByZXZlbnRlZCB0aGUgaGludGVyIGZyb20gdXNpbmcgY29ycmVjdCBzdGFuZGFyZCB3aWR0aCBhbmQgaGVpZ2h0Ci0JdmFsdWVzLCByZXN1bHRpbmcgaW4gaGludGluZyBidWdzIHdpdGggY2VydGFpbiBmb250cyAoZS5nLiBVdG9waWEpLgotCi0yMDAyLTA3LTA3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyAoRlRfR2x5cGhfVG9fQml0bWFwKTogQWRkZWQgY29kZSB0byByZXR1cm4KLQlzdWNjZXNzZnVsbHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSBiaXRtYXAgZ2x5cGggKHRoZQotCXByZXZpb3VzIGNvZGUgc2ltcGx5IHJldHVybmVkIHdpdGggYW4gZXJyb3IpLgotCi0JKiBkb2NzL0RFQlVHLlRYVDogQWRkaW5nIGRlYnVnZ2luZyBzdXBwb3J0IGRvY3VtZW50YXRpb24uCi0KLQkqIHNyYy9iYXNlL2Z0ZGVidWcuYyAoZnRfZGVidWdfaW5pdCksIGJ1aWxkcy93aW4zMi9mdGRlYnVnLmMKLQkoZnRfZGVidWdfaW5pdCksIGJ1aWxkcy9hbWlnYS9zcmMvZnRkZWJ1Zy5jIChmdF9kZWJ1Z19pbml0KTogQ2hhbmdlZAotCXRoZSBzeW50YXggb2YgdGhlIEZUMl9ERUJVRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2VkIHRvIGNvbnRyb2wKLQlkZWJ1Z2dpbmcgb3V0cHV0IChpLmUuIGxvZ2dpbmcgYW5kIGVycm9yIG1lc3NhZ2VzKS4gIEl0IG11c3Qgbm93Ci0JbG9vayBsaWtlOgotCi0JICBhbnk6NiBtZW1vcnk6NCBpbzozICAgb3IKLQkgIGFueTo2LG1lbW9yeTo0LGlvOjMgICBvcgotCSAgYW55OjY7bWVtb3J5OjQ7aW86MwotCi0yMDAyLTA3LTA3ICBPd2VuIFRheWxvciAgPG93ZW5AcmVkaGF0LmNvbT4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2JsdWVzX3NuYXBfc3RlbSk6IEFkZGluZyBzdXBwb3J0IGZvcgotCWJsdWUgZnV6ei4KLQkqIHNyYy9wc2hpbnRlci9wc2hnbG9iLmggKFBTSF9CbHVlc1JlYyk6IEFkZCBgYmx1ZV9mdXp6JyBmaWVsZC4KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfT3Blbl9GYWNlKTogSW5pdGlhbGl6ZSBgYmx1ZV9mdXp6Jy4KLQotCUFkZGluZyBzdXBwb3J0IGZvciBoaW50ZXItc3BlY2lmaWMgYml0IGZsYWdzLCBhbmQgdGhlIG5ldwotCUZUX1NldF9IaW50X0ZsYWdzIGhpZ2gtbGV2ZWwgQVBJLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX1NldF9IaW50X0ZsYWdzKTogTmV3IGZ1bmN0aW9uLgotCShGVF9ISU5UX05PX0lOVEVHRVJfU1RFTSwgRlRfSElOVF9OT19IU1RFTV9BTElHTiwKLQlGVF9ISU5UX05PX1ZTVEVNX0FMSUdOKTogTmV3IG1hY3Jvcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfRmFjZV9JbnRlcm5hbFJlYyk6IEFkZAotCWBoaW50X2ZsYWdzJyBtZW1iZXIuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfSGludF9GbGFncyk6IE5ldyBmdW5jdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9EZWNvZGVyUmVjKTogQWRkIGBoaW50X2ZsYWdzJwotCW1lbWJlci4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmggKFQxX0hpbnRzX0FwcGx5RnVuYywKLQlUMl9IaW50c19BcHBseUZ1bmMpOiBBZGQgcGFyYW1ldGVyIHRvIHBhc3MgaGludCBmbGFncy4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKFQxX0RlY29kZXJfUGFyc2VfQ2hhcnN0cmluZ3MsCi0JVDFfRGVjb2Rlcl9Jbml0KTogVXNlIGRlY29kZXItPmhpbnRfZmxhZ3MuCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmggKENGRl9CdWlsZGVyKTogQWRkIGBoaW50X2ZsYWdzJyBmaWVsZC4KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoQ0ZGX0J1aWxkZXJfSW5pdCk6IFNldCBidWlsZGVyLT5oaW50X2ZsYWdzLgotCShDRkZfUGFyc2VfQ2hhclN0cmluZ3MpOiBVcGRhdGVkLgotCSogc3JjL3BzaGludGVyL3BzaGFsZ28xLmMgKHBzMV9oaW50c19hcHBseSk6IEFkZCBwYXJhbWV0ZXIgdG8gaGFuZGxlCi0JaGludCBmbGFncyAodW51c2VkKS4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMS5oOiBVcGRhdGVkLgotCSogc3JjL3BzaGludGVyL3BzaGFsZ28yLmMgKHBzMl9oaW50c19hcHBseSk6IEFkZCBwYXJhbWV0ZXIgdG8gaGFuZGxlCi0JaGludCBmbGFncyAodW51c2VkKS4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMi5oOiBVcGRhdGVkLgotCSogc3JjL3BzaGludGVyL3BzaGFsZ28zLmMgKHBzM19oaW50c19hcHBseSk6IEFkZCBwYXJhbWV0ZXIgdG8gaGFuZGxlCi0JaGludCBmbGFncy4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5oOiBVcGRhdGVkLgotCi0yMDAyLTA3LTA0ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfc2xvdF9sb2FkKTogRml4ZWQgYSBzbWFsbCBidWcgdGhhdCByZXR1cm5lZAotCWluY29ycmVjdCBhZHZhbmNlcyB3aGVuIHRoZSBvdXRsaW5lIHJlc29sdXRpb24gd2FzIGRpZmZlcmVudCBmcm9tCi0JdGhlIG1ldHJpY3MgcmVzb2x1dGlvbi4KLQotCSogc3JjL2F1dG9oaW50L2FoaGludC5jOiBSZW1vdmluZyBjb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYzogcy9GVF9NRU1fU0VUL0ZUX1pFUk8vIHdoZXJlIGFwcHJvcHJpYXRlLgotCShhaF9vdXRsaW5lX2xpbmtfc2VnbWVudHMpOiBTbGlnaHQgaW1wcm92ZW1lbnRzIHRvIHRoZSBzZXJpZgotCWRldGVjdGlvbiBjb2RlLiAgTW9yZSB3b3JrIGlzIG5lZWRlZCB0aG91Z2guCi0KLTIwMDItMDctMDMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCVNtYWxsIGltcHJvdmVtZW50cyB0byB0aGUgYXV0b21hdGljIGhpbnRlci4gIFVuZXZlbiBzdGVtLXdpZHRocyBoYXZlCi0Jbm93IGRpc2FwcGVhcmVkIGFuZCBldmVyeXRoaW5nIGxvb2tzIG11Y2ggYmV0dGVyLCBldmVuIGlmIHRoZXJlIGFyZQotCXN0aWxsIGlzc3VlcyB3aXRoIHNlcmlmZWQgZm9udHMuCi0KLQkqIHNyYy9hdXRvaGludC9haHR5cGVzLmggKEFIX0dsb2JhbHMpOiBBZGRlZCBgc3RkcycgYXJyYXkuCi0JKiBzcmMvYXV0b2hpbnQvYWhoaW50LmMgKE9QVElNX1NURU1fU05BUCk6IE5ldyAjZGVmaW5lLgotCShhaF9zbmFwX3dpZHRoKTogQ29tbWVudGVkIG91dC4KLQkoYWhfYWxpZ25fbGlua2VkX2VkZ2UpOiBSZW5hbWVkIHRvLi4uCi0JKGFoX2NvbXB1dGVfc3RlbV93aWR0aCk6IFRoaXMuCi0JRG9uJ3QgYWxsb3cgdW5ldmVuIHN0ZW0td2lkdGhzLgotCShhaF9hbGlnbl9saW5rZWRfZWRnZSk6IE5ldyBmdW5jdGlvbi4KLQkoYWhfYWxpZ25fc2VyaWZlZF9lZGdlKTogRG9uJ3Qgc3RyZW5ndGhlbiBzZXJpZnMuCi0JKGFoX2hpbnRfZWRnZXNfMywgYWhfaGludGVyX3NjYWxlX2dsb2JhbHMpOiBVcGRhdGVkLgotCi0yMDAyLTA3LTAzICBPd2VuIFRheWxvciAgPG93ZW5AcmVkaGF0LmNvbT4KLQotCUFkZGluZyBuZXcgYWxnb3JpdGhtIGJhc2VkIG9uIE93ZW4gVGF5bG9yJ3MgcmVjZW50IHdvcmsuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMy5jLCBzcmMvcHNoaW50ZXIvcHNoYWxnbzMuaDogTmV3IGZpbGVzLgotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uaDogVXBkYXRlZC4KLQlVc2UgcHNoYWxnbzMgYnkgZGVmYXVsdC4KLQkqIHNyYy9wc2hpbnRlci9wc2hpbnRlci5jOiBJbmNsdWRlIHBzaGFsZ28zLmMuCi0KLQkqIHNyYy9wc2hpbnRlci9KYW1maWxlLCBzcmMvcHNoaW50ZXIvcnVsZXMubWs6IFVwZGF0ZWQuCi0KLTIwMDItMDctMDEgIE93ZW4gVGF5bG9yICA8b3dlbkByZWRoYXQuY29tPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzIuYyAocHNoMl9nbHlwaF9maW5kX3N0cm9uZ19wb2ludHMpOiBGaXggYSBidWcKLQl3aGVyZSwgaWYgYSBnbHlwaCBoYXMgbW9yZSB0aGFuIGhpbnQgbWFzaywgdGhlIHNlY29uZCBtYXNrIGdldHMKLQlhcHBsaWVkIHRvIHBvaW50cyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gY292ZXJlZCBieSB0aGUgZmlyc3QgbWFzay4KLQotMjAwMi0wNy0wMSAgS2VpdGggUGFja2FyZCAgPGtlaXRocEBrZWl0aHAuY29tPgotCi0JKiBzcmMvc2ZudC90dGNtYXAwLmMgKHR0X2NtYXA4X2NoYXJfbmV4dCwgdHRfY21hcDEyX2NoYXJfbmV4dCk6Ci0JRml4aW5nIHRoZSBjbWFwIDggYW5kIDEyIHBhcnNpbmcgcm91dGluZXMuCi0KLTIwMDItMDctMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRzeW50aC5jOiBJbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ILgotCShGVF9PdXRsaW5lX0VtYm9sZGVuKTogUmVuYW1lZCB0by4uLgotCShGVF9HbHlwaFNsb3RfRW1ib2xkZW4pOiBUaGlzLgotCVVwZGF0ZWQgdG8gbmV3IHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zLgotCShGVF9PdXRsaW5lX09ibGlxdWUpOiBSZW5hbWVkIHRvLi4uCi0JKEZUX0dseXBoU2xvdF9PYmxpcXVlKTogVGhpcy4KLQkoZnRfbm9ybSk6IFJlbW92ZWQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaDogVXBkYXRlZC4KLQotMjAwMi0wNi0yNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2JqZWN0Lmg6IFVwZGF0aW5nIHRoZSBvYmplY3QKLQlzdWItc3lzdGVtIGRlZmluaXRpb25zIChzdGlsbCBleHBlcmltZW50YWwpLgotCi0JKiBzcmMvYmFzZS9mdGhhc2guYyAoZnRfaGFzaF9yZW1vdmUpOiBGaXhpbmcgYSBzbWFsbCByZWFsbG9jYXRpb24KLQlidWcuCi0KLQkqIHNyYy9iYXNlL2Z0dHJpZ29uLmMgKEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyLCBGVF9BbmdsZV9EaWZmKTogTmV3Ci0JZnVuY3Rpb25zLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdHRyaWdvbi5oOiBVcGRhdGVkLgotCi0KLQlBZGRpbmcgcGF0aCBzdHJva2VyIGNvbXBvbmVudCAod29yayBpbiBwcm9ncmVzcykuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2VyLmgsIHNyYy9iYXNlL2Z0c3Ryb2tlci5jOiBOZXcgZmlsZXMuCi0JKiBzcmMvYmFzZS9KYW1maWxlOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9TVFJPS0VSX0gpOiBOZXcgbWFjcm8uCi0KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9Db21wb3NpdGVfR2x5cGgpLAotCXNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfVmVjdG9yX1RyYW5zZm9ybSk6IEZpeGVkIFdlcm5lcidzIGxhdGVzdCBmaXguCi0JRlRfVmVjdG9yX1RyYW5zZm9ybSB3YXNuJ3QgYnVnZ3ksIHRoZSBUcnVlVHlwZSBjb21wb3NpdGUgbG9hZGVyIHdhcy4KLQotMjAwMi0wNi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDMuCi0KLTIwMDItMDYtMjEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCi0JKiBWZXJzaW9uIDIuMS4yIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0yMDAyLTA2LTIxICBSb2JlcnRvIEFsYW1lZGEgIDxvamFuY2Fub0BnZWVrbWFpbC5kZT4uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDQydHlwZXMuaCAoVDQyX0ZvbnQpOiBSZW1vdmVkIHNpbmNlCi0JaXQgaXMgYWxyZWFkeSBpbiB0NDJvYmpzLmguCi0JKFQ0Ml9GYWNlKTogVXNlIFQxX0ZvbnRSZWMuCi0KLQkqIHNyYy9iYXNlL2Z0dHlwZTEuYyAoRlRfR2V0X1BTX0ZvbnRfSW5mbyk6IFVwZGF0ZWQuCi0JKEZUX0hhc19QU19HbHlwaF9OYW1lcyk6IENoZWNrIGZvciB0eXBlNDIgZHJpdmVyIG5hbWUgYWxzby4KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5oOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEU0Ml9UWVBFU19ILgotCShUNDJfRmFjZSk6IFJlbW92ZWQgc2luY2UgaXQgaXMgYWxyZWFkeSBpbiB0NDJ0eXBlcy5oLgotCi0yMDAyLTA2LTIxICBEZXRsZWYgV8O8cmtuZXIgIDxUZXRpU29mdEBhcGcubGFobi5kZT4KLQotCSogc3JjL3Bmcmdsb2FkLmMgKHBmcl9nbHlwaF9sb2FkX2NvbXBvdW5kKTogRml4IGxvYWRpbmcgb2YgY29tcG9zaXRlCi0JZ2x5cGhzLgotCi0yMDAyLTA2LTIxICBTdmVuIE5ldW1hbm4gIDxzdmVuQGNvbnZlcmdlbmNlLmRlPgotCi0JKiBzcmMvcGZyL3BmcnR5cGVzLmggKFBGUl9LZXJuUGFpcik6IE5ldyBzdHJ1Y3R1cmUuCi0JKFBGUl9QaHlGb250KTogVXNlIGl0LgotCShQRlJfS2VybkZsYWdzKTogTmV3IGVudW1lcmF0aW9uLgotCSogc3JjL3Bmci9wZnJsb2FkLmMgKHBmcl9leHRyYV9pdGVtX2xvYWRfa2VybmluZ19wYWlycyk6IE5ldwotCWZ1bmN0aW9uLgotCShwZnJfcGh5X2ZvbnRfZXh0cmFfaXRlbXMpOiBVc2UgaXQuCi0JKHBmcl9waHlfZm9udF9kb25lKTogVXBkYXRlZC4KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfZmFjZV9pbml0KTogU2V0IGtlcm5pbmcgZmxhZyBjb25kaXRpb25hbGx5LgotCShwZnJfZmFjZV9nZXRfa2VybmluZyk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy9wZnIvcGZyb2Jqcy5oOiBVcGRhdGVkLgotCSogc3JjL3Bmci9wZnJkcml2ci5jIChwZnJfZHJpdmVyX2NsYXNzKTogVXBkYXRlZC4KLQotMjAwMi0wNi0yMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBSRUFETUUsIGRvY3MvQ0hBTkdFUzogUHJlcGFyaW5nIHRoZSAyLjEuMiByZWxlYXNlLgotCi0yMDAyLTA2LTE5ICBEZXRsZWYgV8O8cmtuZXIgIDxUZXRpU29mdEBhcGcubGFobi5kZT4KLQotCSogc3JjL2Jhc2UvZnR0eXBlMS5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEU0Ml9UWVBFU19ILgotCSh0MV9mYWNlX2NoZWNrX2Nhc3QpOiBSZW1vdmVkLgotCShGVF9HZXRfUFNfRm9udF9JbmZvKTogTWFrZSBpdCB3b3JrIHdpdGggQ0lEIGFuZCBUeXBlIDQyIGRyaXZlcnMKLQlhbHNvLgotCi0yMDAyLTA2LTE5ICBTZWJhc3RpZW4gQkFSUkUgIDxodHRwOi8vYmFycmUubm9tLmZyL2NvbnRhY3QuaHRtbCNlbWFpbD4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2Vfc2ZudHMpOiBGaXggY29tcGlsZXIgd2FybmluZy4KLQotMjAwMi0wNi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX1ZlY3Rvcl9UcmFuc2Zvcm0pOiBGaXggc2VyaW91cyB0eXBvCi0JKHh5IDwtPiB5eCkuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogUmVwbGFjZSBgfCcgd2l0aAotCWB8fCcgdG8gbWFrZSBjb2RlIGVhc2llciB0byByZWFkLgotCi0yMDAyLTA2LTE4ICBSb2JlcnRvIEFsYW1lZGEgIDxvamFuY2Fub0BnZWVrbWFpbC5kZT4uCi0KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jICh0NDJfY2hlY2tfc2l6ZV9jaGFuZ2UpOiBSZW1vdmVkLgotCShUNDJfU2l6ZV9TZXRDaGFycywgVDQyX1NpemVfU2V0UGl4ZWxzKTogVXNlIEZUX0FjdGl2YXRlX1NpemUKLQlpbnN0ZWFkLgotCShUNDJfR2x5cGhTbG90X0xvYWQpOiBSZW1vdmUgY2FsbCB0byB0NDJfY2hlY2tfc2l6ZV9jaGFuZ2UuCi0KLTIwMDItMDYtMTggIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBzcmMvcHNhdXgvdDFjbWFwLmMgKHQxX2NtYXBfY3VzdG9tX2NoYXJfaW5kZXgsCi0JdDFfY21hcF9jdXN0b21fY2hhcl9uZXh0KTogRml4IGluZGV4IGNvbXB1dGF0aW9uIC0tIGluZGljZXMgc3RhcnQKLQl3aXRoIDAgYW5kIG5vdCB3aXRoIGNtYXAtPmZpcnN0LgotCi0JUHJvdmlkZSBkZWZhdWx0IGNoYXJtYXBzLgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9GYWNlX0luaXQpLCBzcmMvcGNmL3BjZmRyaXZlci5jCi0JKFBDRl9GYWNlX0luaXQpLCBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfaW5pdCksCi0Jc3JjL3R5cGUxL3Qxb2JqcyAoVDFfRmFjZV9Jbml0KSwgc3JjL3dpbmZvbnRzL3dpbmZudC5jCi0JKEZOVF9GYWNlX0luaXQpOiBJbXBsZW1lbnQgaXQuCi0KLTIwMDItMDYtMTcgIFN2ZW4gTmV1bWFubiAgPHN2ZW5AZ2ltcC5vcmc+Ci0KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfZmFjZV9pbml0KTogRml4IHR5cG8uCi0KLTIwMDItMDYtMTYgIExlb25hcmQgUm9zZW50aG9sICA8bGVvbmFyZHJAbGF6ZXJ3YXJlLmNvbT4KLQotCVVwZGF0ZWQgV2luMzIvVkMrKyBwcm9qZWN0cyB0byBpbmNsdWRlIHRoZSBuZXcgUEZSIGRyaXZlci4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwOiBVcGRhdGVkLgotCi0yMDAyLTA2LTE2ICBBbnRob255IEZvayAgPGZva0BkZWJpYW4ub3JnPgotCi0JSW5zdGFsbCBmcmVldHlwZTIubTQuCi0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwsIHVuaW5zdGFsbCk6IEhhbmRsZSBpdC4KLQotMjAwMi0wNi0xNiAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQlTYW1lIGZpeCBmb3IgUEZSIGRyaXZlci4KLQotCSogc3JjL3Bmci9wZnJjbWFwLmMgKHBmcl9jbWFwX2NoYXJfaW5kZXgsIHBmcl9jbWFwX2NoYXJfbmV4dCk6Ci0JSW5jcmVhc2UgcmV0dXJuIHZhbHVlIGJ5IDEuCi0JKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX3Nsb3RfbG9hZCk6IERlY3JlYXNlIGluZGV4IGJ5IDEuCi0KLTIwMDItMDYtMTUgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JRml4IGdseXBoIGluZGljZXMgdG8gbWFrZSBpbmRleCB6ZXJvIGFsd2F5cyB0aGUgdW5kZWZpbmVkIGdseXBoLgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKGJkZl9jbWFwX2luaXQpOiBEb24ndCBkZWNyZWFzZQotCWNtYXAtPm51bV9lbmNvZGluZ3MuCi0JKGJkZl9jbWFwX2NoYXJfaW5kZXgsIGJkZl9jbWFwX2NoYXJfbmV4dCwgQkRGX0dldF9DaGFyX0luZGV4KToKLQlJbmNyZWFzZSByZXN1bHQgYnkgMSBmb3Igbm9ybWFsIGNhc2VzLgotCShCREZfR2x5cGhfTG9hZCk6IERlY3JlYXNlIGluZGV4IGJ5IDEuCi0KLQkqIHNyYy9wY2YvcGNmZHJpdmVyLmMgKHBjZl9jbWFwX2NoYXJfaW5kZXgsIHBjZl9jbWFwX2NoYXJfbmV4dCwKLQlQQ0ZfQ2hhcl9HZXRfSW5kZXgpOiBJbmNyZWFzZSByZXN1bHQgYnkgMSBmb3Igbm9ybWFsIGNhc2VzLgotCShQQ0ZfR2x5cGhfTG9hZCk6IERlY3JlYXNlIGluZGV4IGJ5IDEuCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9lbmNvZGluZ3MpOiBEb24ndCBkZWNyZWFzZSBqIGZvcgotCWFsbG9jYXRpbmcgYGVuY29kaW5nJy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgsIEZUX0dldF9HbHlwaF9OYW1lKTogRml4Ci0JYm91bmRpbmcgdGVzdHMuCi0KLTIwMDItMDYtMTQgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JQWRkIG5ldyBjbWFwIHN1cHBvcnQgdG8gQkRGIGRyaXZlci4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfQ01hcFJlYykgW0ZUX0NPTkZJR19PUFRJT05fVVNFX0NNQVBTXToKLQlOZXcgc3RydWN0dXJlLgotCShiZGZfY21hcF9pbml0LCBiZGZfY21hcF9kb25lLCBiZGZfY21hcF9jaGFyX2luZGV4LAotCWJkZl9jbWFwX2NoYXJfbmV4dCkgW0ZUX0NPTkZJR19PUFRJT05fVVNFX0NNQVBTXTogTmV3IGZ1bmN0aW9ucy4KLQkoQkRGX0dldF9DaGFyX0luZGV4KSBbIUZUX0NPTkZJR19PUFRJT05fVVNFX0NNQVBTXTogVXNlIG9ubHkKLQljb25kaXRpb25hbGx5LgotCShCREZfRmFjZV9Jbml0KTogSGFuZGxlIGBBVkVSQUdFX1dJRFRIJyBhbmQgYFBPSU5UX1NJWkUnIGtleXdvcmRzLgotCUltcGxlbWVudCBuZXcgY21hcCBoYW5kbGluZy4KLQkoYmRmX2RyaXZlcl9jbGFzcyk6IFVwZGF0ZWQuCi0KLTIwMDItMDYtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogTWFrZWZpbGUsIGNvbmZpZ3VyZSwgKi8qLm1rLCBidWlsZHMvdW5peC91bml4LWRlZi5pbiwKLQlkb2NzL0NIQU5HRVMsIGRvY3MvSU5TVEFMTDogcy9UT1AvVE9QX0RJUi8uCi0KLTIwMDItMDYtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2JkZi9iZGZsaWIuYzogcy9GVF9TaG9ydC9zaG9ydC8gZm9yIGNvbnNpc3RlbmN5LgotCi0yMDAyLTA2LTExICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGJ1aWxkcy93aW4zMi9mdGRlYnVnLmM6IEFkZGVkIGEgbWlzc2luZyAjZW5kaWYuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jLCBzcmMvYmRmL2JkZmxpYi5jOiBSZW1vdmluZyBjb21waWxlciB3YXJuaW5ncy4KLQotCVJlbW92ZWQgdGhlIGJ1ZyBpbiBUeXBlIDQyIGRyaXZlciB0aGF0IHByZXZlbnRlZCB1bi1oaW50ZWQgb3V0bGluZXMKLQl0byBiZSBsb2FkZWQuCi0KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KTogQ2FsbCBGVF9Eb25lX1NpemUuCi0JKFQ0Ml9TaXplX0luaXQpOiBDYWxsIEZUX0FjdGl2YXRlX1NpemUuCi0JKHQ0Ml9jaGVja19zaXplX2NoYW5nZSk6IE5ldyBmdW5jdGlvbi4KLQkoVDQyX1NpemVfU2V0Q2hhcnMsIFQ0Ml9TaXplX1NldFBpeGVscyk6IFVzZSBpdC4KLQkoZnRfZ2x5cGhzbG90X2NsZWFyKTogUmVwbGFjZSBGVF9NRU1fU0VUIHdpdGggRlRfWkVSTy4KLQkoVDQyX0dseXBoU2xvdF9Mb2FkKTogVXNlIHQ0Ml9jaGVja19zaXplX2NoYW5nZS4KLQlJbml0aWFsaXplIG1vcmUgZmllbGRzIG9mIGBnbHlwaCcuCi0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcDogVXBkYXRlZC4KLQotMjAwMi0wNi0wOSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4xLjEgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLTIwMDItMDYtMDggIEp1bGl1c3ogQ2hyb2JvY3playAgPGpjaEBwcHMuanVzc2lldS5mcj4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCwgc3JjL2F1dG9oaW50L2FoZ2x5cGguYywKLQlzcmMvYmFzZS9mdG9ianMuYywgc3JjL3NmbnQvdHRjbWFwMC5jLCBzcmMvc21vb3RoL2Z0Z3JheXMuYzogRG9uJ3QKLQl1c2UgYHNldGptcCcsIGBsb25nam1wJywgYW5kIGBqbXBfYnVmJyBidXQgYGZ0X3NldGptcCcsIGBmdF9sb25nam1wJywKLQlhbmQgYGZ0X2ptcF9idWYnLgotCVJlbW92ZWQgZGlyZWN0IHJlZmVyZW5jZXMgdG8gPHN0ZGlvLmg+IGFuZCA8c2V0am1wLmg+IHdoZW4KLQlhcHByb3ByaWF0ZSwgdG8gZXZlbnR1YWxseSByZXBsYWNlIHRoZW0gd2l0aCBhCi0JRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSC4gIFVzZWZ1bCBmb3IgdGhlIFhGcmVlODYgRm9udCBTZXJ2ZXIKLQliYWNrZW5kIGJhc2VkIG9uIEZUMi4KLQotCSogc3JjL2Jhc2UvZnR0eXBlMS5jIChGVF9IYXNfUFNfR2x5cGhfTmFtZXMpOiBGaXggcmV0dXJuIHZhbHVlLgotCi0yMDAyLTA2LTA4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9wY2YvcGNmZHJpdmVyLmMgKHBjZl9jbWFwX2NoYXJfbmV4dCk6IEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkCi0JdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBpbnZhbGlkIHZhbHVlcy4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmk6IFJlbW92aW5nIGEgdHlwbyB0aGF0IHByZXZlbnRlZAotCXRoZSBzb3VyY2UncyBjb21waWxhdGlvbi4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKGZ0Y19ub2RlX2hhc2hfdW5saW5rKTogRml4ZWQgYQotCWJ1ZyB0aGF0IGNhdXNlZCBuYXN0eSBtZW1vcnkgb3ZlcndyaXRlcy4gIFRoZSBoYXNoIHRhYmxlJ3MKLQlidWNrZXRzIGFycmF5IHdhc24ndCBjb3JyZWN0bHkgcmVzaXplZCB3aGVuIHNocnVuay4KLQotMjAwMi0wNi0wOCAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS9zbWFrZWZpbGUsIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZTogVXBkYXRlZC4KLQotMjAwMi0wNi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYyAoZnRjX25vZGVfaGFzaF91bmxpbmssIGZ0Y19ub2RlX2hhc2hfbGluaykKLQlbRlRDX0NBQ0hFX1VTRV9MSU5FQVJfSEFTSElOR106IEZpeCByZXR1cm5lZCBlcnJvciBjb2RlLgotCUZpeCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuaSAoR0VOX0NBQ0hFX0xPT0tVUCk6IE1vdmUgZGVjbGFyYXRpb24gb2YKLQlgZmFtaWx5JyBhbmQgYGhhc2gnIHVwIHRvIG1ha2UgaXQgY29tcGlsYWJsZSB3aXRoIGcrKy4KLQotCSogc3JjL3R5cGU0Mi90NDJlcnJvci5oOiBOZXcgZmlsZS4KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYywgc3JjL3R5cGU0Mi90NDJvYmpzLmMsCi0Jc3JjL3R5cGU0Mi90NDJwYXJzZS5jOiBVc2UgdDQyIGVycm9yIGNvZGVzLgotCSogc3JjL3R5cGU0Mi9ydWxlcy5tazogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvZnRuYW1lcy5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ILgotCi0yMDAyLTA2LTA4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmM6IEdFTl9DQUNIRV9GQU1JTFlfQ09NUEFSRSwKLQlHRU5fQ0FDSEVfTk9ERV9DT01QQVJFLCBHRU5fQ0FDSEVfTE9PS1VQKSBbRlRDX0NBQ0hFX1VTRV9JTkxJTkVdOgotCU5ldyBtYWNyb3MuCi0JKGZ0Y19jbWFwX2NhY2hlX2xvb2t1cCkgWyFGVENfQ0FDSEVfVVNFX0lOTElORV06IFR5cGVkZWYgdG8KLQlmdGNfY2FjaGVfbG9va3VwLgotCShGVENfQ01hcENhY2hlX0xvb2t1cCk6IFVwZGF0ZWQuCi0KLQlBZGRpbmcgdmFyaW91cyBleHBlcmltZW50YWwgb3B0aW1pemF0aW9ucyB0byB0aGUgY2FjaGUgbWFuYWdlci4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNjYWNoZS5oIChGVENfQ0FDSEVfVVNFX0lOTElORSwKLQlGVENfQ0FDSEVfVVNFX0xJTkVBUl9IQVNISU5HKTogTmV3IG9wdGlvbnMuCi0JKEZUQ19DYWNoZVJlYykgW0ZUQ19DQUNIRV9VU0VfTElORUFSX0hBU0hJTkddOiBOZXcgZWxlbWVudHMgYHAnLAotCWBtYXNrJywgYW5kIGBzbGFjaycuCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChGVENfSEFTSF9NQVhfTE9BRCwgRlRDX0hBU0hfTUlOX0xPQUQsCi0JRlRDX0hBU0hfU1VCX0xPQUQpIFtGVENfQ0FDSEVfVVNFX0xJTkVBUl9IQVNISU5HLAotCUZUQ19IQVNIX0lOSVRJQUxfU0laRV06IE5ldyBtYWNyb3MuCi0JKGZ0Y19ub2RlX21ydV9saW5rLCBmdGNfbm9kZV9tcnVfdXApOiBPcHRpbWl6ZWQuCi0JKGZ0Y19ub2RlX2hhc2hfdW5saW5rLCBmdGNfbm9kZV9oYXNoX2xpbmspCi0JW0ZUQ19DQUNIRV9VU0VfTElORUFSX0hBU0hJTkddOiBOZXcgdmFyaWFudHMuCi0JKEZUQ19QUklNRVNfTUlOLCBGVENfUFJJTUVTX01BWCwgZnRjX3ByaW1lcywgZnRjX3ByaW1lX2Nsb3Nlc3QsCi0JRlRDX0NBQ0hFX1JFU0laRV9URVNULCBmdGNfY2FjaGVfcmVzaXplKQotCVshRlRDX0NBQ0hFX1VTRV9MSU5FQVJfSEFTSElOR106IERlZmluZSBpdCBjb25kaXRpb25hbGx5LgotCShmdGNfY2FjaGVfaW5pdCwgZnRjX2NhY2hlX2NsZWFyKSBbRlRDX0NBQ0hFX1VTRV9MSU5FQVJfSEFTSElOR106Ci0JVXBkYXRlZC4KLQkoZnRjX2NhY2hlX2xvb2t1cCkgW0ZUQ19DQUNIRV9VU0VfTElORUFSX0hBU0hJTkddOiBJbXBsZW1lbnQgaXQuCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5pOiBOZXcgZmlsZS4KLQotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgKEdFTl9DQUNIRV9GQU1JTFlfQ09NUEFSRSwKLQlHRU5fQ0FDSEVfTk9ERV9DT01QQVJFLCBHRU5fQ0FDSEVfTE9PS1VQKSBbRlRDX0NBQ0hFX1VTRV9JTkxJTkVdOgotCU5ldyBtYWNyb3MuCi0JKGZ0Y19zYml0X2NhY2hlX2xvb2t1cCkgWyFGVENfQ0FDSEVfVVNFX0lOTElORV06IFR5cGVkZWYgdG8KLQlmdGNfY2FjaGVfbG9va3VwLgotCShGVENfU0JpdENhY2hlX0xvb2t1cCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYzogUmVtb3ZpbmcgZHVwbGljYXRlIGZ1bmN0aW9uLgotCi0yMDAyLTA2LTA3ICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwpOiBDaGFuZ2VkIGRlZmluaXRpb24KLQlmcm9tIEZUX0VYUE9SVF9ERUYgdG8gRlRfQkFTRV9ERUYuCi0KLTIwMDItMDYtMDcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUZpeGVkIHRoZSBidWcgdGhhdCBwcmV2ZW50ZWQgdGhlIGNvcnJlY3QgZGlzcGxheSBvZiBmb250cyB3aXRoCi0JYGZ0dmlldycuCi0KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYzogU3BsaXQgaW50by4uLgotCSogc3JjL3R5cGU0Mi90NDJkcml2ci5oLCBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMsCi0Jc3JjL3R5cGU0Mi90NDJwYXJzZS5oLCBzcmMvdHlwZTQyL3Q0Mm9ianMuaCwgc3JjL3R5cGU0Mi90NDJvYmpzLmMsCi0Jc3JjL3R5cGU0Mi90eXBlNDIuYzogTmV3IGZpbGVzLgotCi0JKHQ0Ml9nZXRfZ2x5cGhfbmFtZSwgdDQyX2dldF9wc19uYW1lLCB0NDJfZ2V0X25hbWVfaW5kZXgpOiBVc2UKLQlgZmFjZS0+dHlwZTEnLgotCi0JKEdldF9JbnRlcmZhY2UpOiBSZW5hbWVkIHRvLi4uCi0JKFQ0Ml9HZXRfSW50ZXJmYWNlKTogVGhpcy4KLQlVcGRhdGVkLgotCShUNDJfT3Blbl9GYWNlLCBUNDJfRmFjZV9Eb25lKTogVXBkYXRlZC4KLQkoVDQyX0ZhY2VfSW5pdCk6IEFkZCBuZXcgY21hcCBzdXBwb3J0LgotCVVwZGF0ZWQuCi0JKFQ0Ml9Ecml2ZXJfSW5pdCwgVDQyX0RyaXZlcl9Eb25lLCBUNDJfU2l6ZV9Jbml0LCBUNDJfU2l6ZV9Eb25lLAotCVQ0Ml9HbHlwaFNsb3RfSW5pdCwgVDQyX0dseXBoU2xvdF9Eb25lKTogVXBkYXRlZC4KLQkoR2V0X0NoYXJfSW5kZXgsIEdldF9OZXh0X0NoYXIpOiBSZW5hbWVkIHRvLi4uCi0JKFQ0Ml9DTWFwX0NoYXJJbmRleCwgVDQyX0NNYXBfQ2hhck5leHQpOiBUaGlzLgotCVVwZGF0ZWQuCi0JKFQ0Ml9DaGFyX1NpemUsIFQ0Ml9QaXhlbF9TaXplKTogUmVuYW1lZCB0by4uLgotCShUNDJfU2l6ZV9TZXRDaGFycywgVDQyX1NpemVfU2V0UGl4ZWxzKTogVGhpcy4KLQkoVDQyX0xvYWRfR2x5cGgpOiBSZW5hbWVkIHRvLi4uCi0JKFQ0Ml9HbHlwaFNsb3RfTG9hZCk6IFRoaXMuCi0KLQkodDQyX2luaXRfbG9hZGVyLCB0NDJfZG9uZV9sb2FkZXIpOiBSZW5hbWVkIHRvLi4uCi0JKHQ0Ml9sb2FkZXJfaW5pdCwgdDQyX2xvYWRlcl9kb25lKTogVGhpcy4KLQkoVDQyX05ld19QYXJzZXIsIFQ0Ml9GaW5hbGl6ZV9QYXJzZXIpOiBSZW5hbWVkIHRvLi4uCi0JKHQ0Ml9wYXJzZXJfaW5pdCwgdDQyX3BhcnNlcl9kb25lKTogVGhpcy4KLQkocGFyc2VfZGljdCk6IFJlbmFtZWQgdG8uLi4KLQkodDQyX3BhcnNlX2RpY3QpOiBUaGlzLgotCShpc19hbHBoYSwgaXNfc3BhY2UsIGhleHZhbCk6IFJlbmFtZWQgdG8uLi4KLQkodDQyX2lzX2FscGhhLCB0NDJfaXNfc3BhY2UsIHQ0Ml9oZXh2YWwpOiBUaGlzLgotCShwYXJzZV9mb250X25hbWUsIHBhcnNlX2ZvbnRfYmJveCwgcGFyc2VfZm9udF9tYXRyaXgsCi0JcGFyc2VfZW5jb2RpbmcsIHBhcnNlX3NmbnRzLCBwYXJzZV9jaGFyc3RyaW5ncywgcGFyc2VfZGljdCk6Ci0JUmVuYW1lZCB0by4uLgotCSh0NDJfcGFyc2VfZm9udF9uYW1lLCB0NDJfcGFyc2VfZm9udF9iYm94LCB0NDJfcGFyc2VfZm9udF9tYXRyaXgsCi0JdDQyX3BhcnNlX2VuY29kaW5nLCB0NDJfcGFyc2Vfc2ZudHMsIHQ0Ml9wYXJzZV9jaGFyc3RyaW5ncywKLQl0NDJfcGFyc2VfZGljdCk6IFRoaXMuCi0JVXBkYXRlZC4KLQotCSh0NDJfa2V5d29yZHMpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHlwZTQyL0phbWZpbGUsIHNyYy90eXBlNDIvZGVzY3JpcC5tbXM6IFVwZGF0ZWQuCi0KLTIwMDItMDYtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCA4YnBwIHN1cHBvcnQgdG8gQkRGIGRyaXZlci4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9zdGFydCk6IEhhbmRsZSA4YnBwLgotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfR2x5cGhfTG9hZCk6IERpdHRvLgotCSogc3JjL2JkZi9SRUFETUU6IFVwZGF0ZWQuCi0KLTIwMDItMDYtMDIgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBzcmMvcGZyL3BmcmxvYWQuYyAocGZyX3BoeV9mb250X2RvbmUpOiBGcmVlIGBibHVlX3ZhbHVlcycgYXJyYXkuCi0KLTIwMDItMDUtMjkgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3JlYWRzdHJlYW0pOiBBbGxvY2F0ZSBgYnVmJyBkeW5hbWljYWxseS4KLQkoX2JkZl9wYXJzZV9nbHlwaHMpOiBVc2UgY29ycmVjdCBzaXplIGZvciBhbGxvY2F0aW5nCi0JYGZvbnQtPnVuZW5jb2RlZCcuCi0JKGJkZl9sb2FkX2ZvbnQpOiBGcmVlIGFycmF5IGNvbmRpdGlvbmFsbHkuCi0JUmV0dXJuIHByb3BlciBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IE1ha2UgaXQgbW9yZSByb2J1c3QgYWdhaW5zdAotCXVudXN1YWwgZm9udHMuCi0KLTIwMDItMDUtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2JkZi9kZXNjcmlwLm1tcywgc3JjL3R5cGU0Mi9kZXNjcmlwLm1tczogTmV3IGZpbGVzLgotCSogZGVzY3JpcC5tbXMgKGFsbCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcGFyc2VfZ2x5cGhzKTogRml4IHR5cG8gd2hpY2ggcHJldmVudGVkCi0JY29tcGlsYXRpb24uCi0JKiBzcmMvcHNoZ2xvYi5jIChwc2hfYmx1ZXNfc2NhbGVfem9uZXMpOiBGaXggY29tcGlsZXIgd2FybmluZy4KLQotMjAwMi0wNS0yOCAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZSwgYnVpbGRzL2FtaWdhL3NtYWtlZmlsZSwKLQlhbWlnYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBVcGRhdGVkIHRvIGluY2x1ZGUKLQlzdXBwb3J0IGZvciBCREYgYW5kIFR5cGU0MiBkcml2ZXJzLgotCi0JKiBkb2NzL21vZHVsZXMudHh0OiBVcGRhdGVkLgotCi0yMDA1LTA1LTI4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRpbmcgZmlsZSBmb3IgbmV4dCByZWxlYXNlICgyLjEuMSkuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmM6IFJlbW92aW5nIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0eGY4Ni5oLCBzcmMvYmFzZS9mdHhmODYuYzogTmV3IGZpbGVzLgotCVRoZXkgcHJvdmlkZSBhIG5ldyBBUEkgKEZUX0dldF9YMTFfRm9udF9Gb3JtYXQpIHRvIHJldHJpZXZlIGFuCi0JWDExLWNvbXBhdGlibGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGZvbnQgZm9ybWF0IG9mIGEgZ2l2ZW4gZmFjZS4KLQlUaGlzIHdhcyBwdXQgaW4gYSBuZXcgb3B0aW9uYWwgYmFzZSBzb3VyY2UgZmlsZSwgY29ycmVzcG9uZGluZyB0byBhCi0JbmV3IHB1YmxpYyBoZWFkZXIgKG5hbWVkIEZUX1hGUkVFODZfSCBzaW5jZSB0aGlzIGZ1bmN0aW9uIHNob3VsZAotCW9ubHkgYmUgdXNlZCB3aXRoaW4gdGhlIFhGcmVlODYgZm9udCBzZXJ2ZXIgSU1PKS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfWEZSRUU4Nl9IKTogTmV3IG1hY3JvIChub3QKLQlkb2N1bWVudGVkIHlldCkuCi0KLQkqIHNyYy9iYXNlL2Z0dHlwZTEuYzogTmV3IGZpbGUsIHByb3ZpZGluZyB0d28gbmV3IEFQSSBmdW5jdGlvbnMKLQkoRlRfR2V0X1BTX0ZvbnRfSW5mbyBhbmQgRlRfSGFzX1BTX0dseXBoX05hbWVzKS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaDogVXBkYXRlZC4KLQotCSogc3JjL2Jhc2UvSmFtZmlsZSwgc3JjL2Jhc2UvcnVsZXMubWssIHNyYy9iYXNlL2Rlc2NyaXAubW1zOgotCVVwZGF0aW5nIGJ1aWxkIGNvbnRyb2wgZmlsZXMgZm9yIHRoZSBuZXcgZmlsZXMgYGZ0eGY4Ni5jJyBhbmQKLQlgZnR0eXBlMS5jJyBpbiBzcmMvYmFzZS4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2JsdWVzX3NjYWxlX3pvbmVzKTogRml4ZWQgYSBidWcgdGhhdAotCXByZXZlbnRlZCBmYW1pbHkgYmx1ZSB6b25lcyBzdWJzdGl0dXRpb24gZnJvbSBoYXBwZW5pbmcgY29ycmVjdGx5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0YmRmLmggRlRfR2V0X0JERl9DaGFyc2V0X0lEKTogQWRkaW5nCi0JZG9jdW1lbnRhdGlvbiBjb21tZW50LgotCi0yMDAyLTA1LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0bmFtZXMuYyAoRlRfR2V0X1NmbnRfTmFtZSk6IERvbid0IHVzZSBGVF9TVFJFQU1fUkVBRF9BVAotCWJ1dCBGVF9TVFJFQU1fUkVBRC4KLQlEZWNsYXJlIGBzdHJlYW0nIHZhcmlhYmxlLgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3BhcnNlX2dseXBocyk6IFJlcGxhY2UgZmxvYXRpbmcgcG9pbnQgbWF0aAotCXdpdGggY2FsbHMgdG8gYEZUX011bERpdicuCi0KLTIwMDItMDUtMjggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUZpeGluZyB0aGUgU0ZOVCBuYW1lIHRhYmxlIGxvYWRlciB0byBzdXBwb3J0IHZhcmlvdXMgYnVnZ3kgZm9udHMuCi0JSXQgbm93IGlnbm9yZXMgZW1wdHkgbmFtZSBlbnRyaWVzLCBlbnRyaWVzIHdpdGggaW52YWxpZCBwb2ludGVyCi0JT2Zmc2V0cyBhbmQgY2VydGFpbiBmb250cyBjb250YWluaW5nIHRhYmxlcyB3aXRoIGJyb2tlbgotCWBzdG9yYWdlT2Zmc2V0JyBmaWVsZHMuCi0KLQlOYW1lIHN0cmluZ3MgYXJlIG5vdyBsb2FkZWQgb24gZGVtYW5kLCB3aGljaCByZWR1Y2VzIHRoZSBtZW1vcnkKLQlyZXF1aXJlbWVudHMgZm9yIGEgZ2l2ZW4gRlRfRmFjZSB0cmVtZW5kb3VzbHkgKGZvciBleGFtcGxlLCB0aGUgbmFtZQotCXRhYmxlIG9mIEFyaWFsLnR0ZiBpcyBhYm91dCAxMEtiIGFuZCBjb250YWlucyA3MCBuYW1lcykuCi0KLQlUaGlzIGlzIGEgdGVtcG9yYXJ5IGZpeC4gIFRoZSB3aG9sZSBuYW1lIHRhYmxlIGxvYWRlciBhbmQgaW50ZXJmYWNlCi0Jd2lsbCBiZSByZXdyaXR0ZW4gaW4gYSBtdWNoIG1vcmUgY2xlYW5seSB3YXkgc2hvcnRseSwgb25jZSBDU0VIIGhhdmUKLQliZWVuIGludHJvZHVjZWQgaW4gdGhlIHNvdXJjZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9OYW1lRW50cnlSZWMpOiBDaGFuZ2UKLQl0eXBlIG9mIGBzdHJpbmdPZmZzZXQnIHRvIEZUX1VMb25nLgotCShUVF9OYW1lVGFibGVSZWMpOiBDaGFuZ2UgdHlwZSBvZiBgbnVtTmFtZVJlY29yZHMnIGFuZAotCWBzdG9yYWdlT2Zmc2V0JyB0byBGVF9VSW50LgotCVJlcGxhY2UgYHN0b3JhZ2UnIHdpdGggYHN0cmVhbScuCi0JKiBzcmMvYmFzZS9mdG5hbWVzLmMgKEZUX0dldF9TZm50X05hbWUpOiBMb2FkIG5hbWUgb24gZGVtYW5kLgotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoZ2V0X3NmbnRfcG9zdHNjcmlwdF9uYW1lKTogRGl0dG8uCi0JTWFrZSBjb2RlIG1vcmUgcm9idXN0LgotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKFRUX05hbWVFbnRyeV9Db252ZXJ0RnVuYyk6IE5ldyB0eXBlZGVmLgotCSh0dF9mYWNlX2dldF9uYW1lKTogVXNlIGl0LgotCU1ha2UgY29kZSBtb3JlIHJvYnVzdC4KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChUVF9Mb2FkX05hbWVzKTogVXNlIGBzdGF0aWMnIGZvciBhcnJheXMuCi0JSGFuZGxlIGludmFsaWQgYHN0b3JhZ2VPZmZzZXQnIGRhdGEgYmV0dGVyLgotCVNldCBsZW5ndGggZmllbGRzIHRvIHplcm8gZm9yIGludmFsaWQgb3IgaWdub3JlZCBkYXRhLgotCVJlbW92ZSBjb2RlIHdpdGhpbiBGVF9ERUJVR19MRVZFTF9UUkFDRS4KLQkoVFRfRnJlZV9OYW1lcyk6IFVwZGF0ZWQuCi0KLTIwMDItMDUtMjQgIFRpbSBNb29uZXkgIDxlbmNoYW50ZXJAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotCi0JKiBidWlsZHMvdW5peC9mdC1tdW5tYXAubTQ6IE5ldyBmaWxlLCBleHRyYWN0ZWQgRlRfTVVOTUFQX0RFQ0wgYW5kCi0JRlRfTVVOTUFQX1BBUkFNIGZyb20gYWNsb2NhbC5tNCBpbnRvIGhlcmUsIHNvIGFjbG9jYWwubTQgY2FuIGJlCi0JcmVidWlsdCBmcm9tIHNvdXJjZXMuICBTZXQgbWFjcm8gc2VyaWFsIHRvIDEsIGFuZCB1c2UgdGhpcmQgYXJndW1lbnQKLQl0byBBQ19ERUZJTkUgZm9yIG91ciB0d28gY3VzdG9tIHN5bWJvbHMsIHNvIGZ0Y29uZmlnLmluIGNvdWxkIG9uZSBkYXkKLQliZSByZWJ1aWx0IHdpdGggYXV0b2hlYWRlciAobm90IHJlY29tbWVuZGVkIG5vdywgZnRjb25maWcuaW4gaXMgYQotCWN1c3RvbSBzb3VyY2UgZmlsZSkKLQotMjAwMi0wNS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9CRVpJRVJfSCk6IFJlbW92ZWQuCi0JKEZUX0JERl9IKTogTmV3IG1hY3JvIGZvciBhY2Nlc3NpbmcgYGZ0YmRmLmgnLgotCi0JKiBzcmMvdHlwZTQyL3Q0MmRyaXZyLmMgKGhleHZhbCk6IEZpeCB0eXBvLgotCi0yMDAyLTA1LTIxICBNYXJ0aW4gTXVza2VucyAgPG1tdXNrZW5zQGF1cmVsb24uY29tPgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKFQxUmFkaXgpOiBOZXcgZnVuY3Rpb24uCi0JKHQxX3RvaW50KTogVXNlIGl0IHRvIGhhbmRsZSBudW1iZXJzIGluIHJhZGl4IGZvcm1hdC4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKFQxX0RlY29kZXJfUGFyc2VfQ2hhcnN0cmluZ3MpOiBBZGQgZHVtbXkKLQlmb3IgdW5kb2N1bWVudGVkLCBvYnNvbGV0ZSBvcGNvZGUgMTUuCi0KLTIwMDItMDUtMjEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2JkZi9iZGZsaWIuYzogUmVtb3ZlZCBjb21waWxlciB3YXJuaW5nLCBhbmQgY2hhbmdlZCBhbGwgdGFibGVzCi0JdG8gdGhlIGBzdGF0aWMgY29uc3QnIHN0b3JhZ2Ugc3BlY2lmaWVyIChpbnN0ZWFkIG9mIHNpbXBseQotCWBzdGF0aWMnKS4KLQotCSogc3JjL3R5cGU0Mi90NDJkcml2ci5jIChoZXh2YWwpOiBVc2UgbW9yZSBlZmZpY2llbnQgY29kZS4KLQlSZW1vdmluZyBjb21waWxlciB3YXJuaW5ncy4KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYzogUmVtb3ZpbmcgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRiZGYuaCwgc3JjL2Jhc2UvZnRiZGYuYywKLQlzcmMvYmFzZS9kZXNjcmlwLm1tcywgc3JjL2Jhc2UvSmFtZmlsZSwgc3JjL2Jhc2UvcnVsZXMubWsKLQkoRlRfR2V0X0JERl9DaGFyc2V0X0lEKTogTmV3IEFQSSB0byByZXRyaWV2ZSBCREYtc3BlY2lmaWMgc3RyaW5ncwotCWZyb20gYSBmYWNlLiAgVGhpcyBpcyBtdWNoIGNsZWFuZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIGludGVybmFsIHR5cGVzCi0JYEJERl9QdWJsaWNfRmFjZScgZGVmaW5lZCBpbiBGVF9JTlRFUk5BTF9CREZfVFlQRVNfSC4KLQotMjAwMi0wNS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmRmL1JFQURNRTogTWVudGlvbiBNaWNyb3NvZnQncyBTQklUIHRvb2wuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL2NpZC9jaWRyaXZlci5jLCBzcmMvcGNmL3BjZmRyaXZlci5jLAotCXNyYy90cnVldHlwZS90dGRyaXZlci5jLCBzcmMvdHlwZTEvdDFkcml2ZXIuYywKLQlzcmMvd2luZm9udHMvd2luZm50LmMsIHNyYy90eXBlNDIvdDQyZHJpdnIuYywgc3JjL2JkZi9iZGZkcml2ci5jCi0JW0ZUX0NPTkZJR19PUFRJT05fRFlOQU1JQ19EUklWRVJTXTogQ29tcGxldGVseSByZW1vdmVkLiAgSXQgaGFzCi0JYmVlbiBuZXZlciB1c2VkLgotCi0yMDAyLTA1LTIxICBSb2JlcnRvIEFsYW1lZGEgIDxvamFuY2Fub0BnZWVrbWFpbC5kZT4uCi0KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYzogcy9UNDJfRU5DT0RJTkdfVFlQRV8vVDFfRU5DT0RJTkdfVFlQRV8vLgotCShwYXJzZV9mb250X21hdHJpeCk6IFJlbW92ZSB1bm5lY2Vzc2FyeSBjb2RlLgotCShwYXJzZV9zZm50cyk6IEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMuCi0JKHQ0Ml9kcml2ZXJfY2xhc3MpIFtUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSXTogVXNlCi0JZnRfbW9kdWxlX2RyaXZlcl9oYXNfaGludGVyIGNvbmRpdGlvbmFsbHkuCi0JTW92ZWQgc29tZSB0eXBlIDQyIHNwZWNpZmljIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90NDJ0eXBlcy5oOiBOZXcgZmlsZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCAoRlRfSU5URVJOQUxfVDQyX1RZUEVTX0gpOgotCU5ldyBtYWNyby4KLQotMjAwMi0wNS0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y3NiaXRzLmggKEZUQ19TQml0KTogQWRkZWQgYSBuZXcgZmllbGQKLQlgbnVtX2dyYXlzJyBmb3Igc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIHVzZWQgZ3JheSBsZXZlbHMuCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3NiaXRfbm9kZV9sb2FkKTogSW5pdGlhbGl6ZSBpdC4KLQotMjAwMi0wNS0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkaW5nIGEgZHJpdmVyIGZvciBCREYgZm9udHMgd3JpdHRlbiBieSBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLQk8RnJhbmNlc2NvLlphcHBhLk5hcmRlbGxpQGVucy5mcj4uICBIZWF2aWx5IG1vZGlmaWVkIGJ5IG1lIHRvCi0JYmV0dGVyIGFkYXB0IGl0IHRvIEZyZWVUeXBlLCByZW1vdmluZyB1bm5lZWRlZCBzdHVmZi4gIEFkZGl0aW9uYWxseSwKLQlpdCBub3cgc3VwcG9ydHMgTWFyayBMZWlzaGVyJ3MgQkRGIGV4dGVuc2lvbiBmb3IgYW50aS1hbGlhc2VkCi0JYml0bWFwIGdseXBocyB3aXRoIDIgYW5kIDQgYnBwLgotCi0JKiBzcmMvYmRmLyo6IE5ldyBkcml2ZXIuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2JkZnR5cGVzLmg6IE5ldyBmaWxlLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IEFkZGVkIEJERiBkcml2ZXIgY29tcG9uZW50cy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaDogQWRkZWQgZXJyb3IgY29kZXMgZm9yIEJERiBkcml2ZXIuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oLCBzcmMvSmFtZmlsZTogVXBkYXRlZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCAoRlRfSU5URVJOQUxfQkRGX1RZUEVTX0gpOgotCU5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCAoZnRfc3ByaW50Zik6IE5ldyBhbGlhcyBmb3IKLQlzcHJpbnRmLgotCi0yMDAyLTA1LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGRlZCBUeXBlIDQyIGRyaXZlcgotCWNvbXBvbmVudC4KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYzogVXNlIGl0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmggKEZUX0lOVEVSTkFMX1BDRl9UWVBFU19IKToKLQlOZXcgbWFjcm8uCi0KLTIwMDItMDUtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGU0Mi9KYW1maWxlOiBOZXcgZmlsZS4KLQotMjAwMi0wNS0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkaW5nIGEgZHJpdmVyIGZvciBUeXBlNDIgZm9udHMgd3JpdHRlbiBieSBSb2JlcnRvIEFsYW1lZGEKLQk8b2phbmNhbm9AZ2Vla21haWwuZGU+LgotCi0JKiBzcmMvdHlwZTQyLyo6IE5ldyBkcml2ZXIuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oLCBzcmMvSmFtZmlsZTogVXBkYXRlZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmggKGZ0X3hkaWdpdCwgZnRfbWVtY21wLAotCWZ0X2F0b2kpOiBOZXcgYWxpYXNlcyBmb3IgeGRpZ2l0LCBtZW1jbXAsIGFuZCBhdG9pLCByZXNwZWN0aXZlbHkuCi0KLTIwMDItMDUtMTIgIE93ZW4gVGF5bG9yICA8b3RheWxvckByZWRoYXQuY29tPgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoVFRfTG9va1VwX1RhYmxlKTogUHJvdGVjdCBhZ2FpbnN0IHRhYmxlcwotCXdpdGggYSB6ZXJvIGxlbmd0aCB2YWx1ZS4KLQotMjAwMi0wNS0xMiAgTWljaGFlbCBQZmVpZmZlciAgPG1pY2hhZWwucGZlaWZmZXJAdXRhbmV0LmF0PgotCi0JKiBidWlsZHMvYmVvcy9iZW9zLm1rOiBJbmNsdWRlIGBsaW5rLXN0ZC5taycuCi0KLTIwMDItMDUtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5oIChUMV9Mb2FkZXIpOiBSZW5hbWVkIHRvLi4uCi0JKFQxX0xvYWRlclJlYyk6IFRoaXMuCi0JKFQxX0xvYWRlcik6IE5vdyBwb2ludGVyIHRvIFQxX0xvYWRlclJlYy4KLQkqIHNyYy90eXBlMS90MWxvYWQuYzogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmgsIHNyYy90eXBlMS90MWxvYWQuYywKLQlzcmMvdHlwZTEvdDFvYmpzLmM6Ci0Jcy9UMV9FTkNPRElOR19UWVBFX0VYUE9SVC9UMV9FTkNPRElOR19UWVBFX0VYUEVSVC8uCi0KLTIwMDItMDUtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogUkVBRE1FOiBBZGQgYSBub3RlIHJlZ2FyZGluZyBsaWJ0dGYgdnMuIGxpYmZyZWV0eXBlLgotCi0yMDAyLTA1LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGcmVlVHlwZSAyIGNhbiBub3cgYmUgYnVpbHQgaW4gYW4gZXh0ZXJuYWwgZGlyZWN0b3J5IHdpdGggdGhlCi0JY29uZmlndXJlIHNjcmlwdCBhbHNvLgotCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKElOQ0xVREVTKTogQWRkIGBPQkpfRElSJy4KLQotCSogYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rIChoYXZlX21rKTogTmV3IHZhcmlhYmxlIHRvIHRlc3QgZm9yCi0JZXh0ZXJuYWwgYnVpbGQuCi0JKHVuaXgtZGVmLm1rKTogRGVmaW5lZCBhY2NvcmRpbmcgdG8gdmFsdWUgb2YgYGhhdmVfbWsnLgotCSogYnVpbGRzL3VuaXgvdW5peC5tayAoaGF2ZV9tayk6IE5ldyB2YXJpYWJsZSB0byB0ZXN0IGZvcgotCWV4dGVybmFsIGJ1aWxkLgotCVNlbGVjdCBpbmNsdWRlIHBhdGhzIGZvciB1bml4LWRlZi5tayBhbmQgdW5peC1jYy5tayBhY2NvcmRpbmcKLQl0byB2YWx1ZSBvZiBgaGF2ZV9taycuCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbiAoT0JKX0JVSUxEKTogTmV3IHZhcmlhYmxlLgotCShESVNUQ0xFQU4pOiBVc2UgaXQuCi0JKiBidWlsZHMvdW5peC91bml4LWNjLmluIChMSUJUT09MKTogRGVmaW5lIGRlZmF1bHQgdmFsdWUgb25seQotCWlmIG5vdCB5ZXQgZGVmaW5lZC4KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBVc2UgYE9CSl9CVUlMRCcgZm9yIGluc3RhbGxpbmcKLQlmcmVldHlwZS1jb25maWcuCi0KLQkqIGNvbmZpZ3VyZTogRG9uJ3QgZGVwZW5kIG9uIGJhc2ggZmVhdHVyZXMuCi0JKGZ0Ml9kaXIsIGFic19jdXJyX2RpciwgYWJzX2Z0Ml9kaXIpOiBOZXcgdmFyaWFibGVzIChjb2RlCi0JcGFydGlhbGx5IHRha2VuIGZyb20gQXV0b2NvbmYpLgotCUJ1aWxkIGEgZHVtbXkgTWFrZWZpbGUgaWYgbm90IGJ1aWxkaW5nIGluIHNvdXJjZSB0cmVlLgotCi0JKiBkb2NzL0lOU1RBTEw6IERvY3VtZW50IGl0LgotCi0yMDAyLTA1LTA0ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfR2x5cGgpOiBGaW5hbGx5IGZpeGluZyB0aGUgbGFzdAotCWJ1ZyB0aGF0IHByZXZlbnRlZCBGcmVlVHlwZSAyLnggYW5kIEZyZWVUeXBlIDEueCB0byBwcm9kdWNlCi0JYml0LWJ5LWJpdCBpZGVudGljYWwgbW9ub2Nocm9tZSBnbHlwaCBiaXRtYXBzIHdpdGggbmF0aXZlIFRydWVUeXBlCi0JaGludGluZy4gIFRoZSBjdWxwcml0IHdhcyBhIHNpbmdsZS1iaXQgZmxhZyB0aGF0IHdhc24ndCBzZXQKLQljb3JyZWN0bHkgYnkgdGhlIFRydWVUeXBlIGdseXBoIGxvYWRlci4KLQotCSogc3JjL290bGF5b3V0L290bGF5b3V0LmgsIHNyYy9vdGxheW91dC9vdGxiYXNlLmMsCi0Jc3JjL290bGF5b3V0L290bGJhc2UuaCwgc3JjL290bGF5b3V0L290bGNvbmYuaCwKLQlzcmMvb3RsYXlvdXQvb3RsZ2RlZi5jLCBzcmMvb3RsYXlvdXQvb3RsZ2RlZi5oLAotCXNyYy9vdGxheW91dC9vdGxncG9zLmMsIHNyYy9vdGxheW91dC9vdGxncG9zLmgsCi0Jc3JjL290bGF5b3V0L290bGdzdWIuYywgc3JjL290bGF5b3V0L290bGdzdWIuaCwKLQlzcmMvb3RsYXlvdXQvb3RsanN0Zi5jLCBzcmMvb3RsYXlvdXQvb3RsanN0Zi5oLAotCXNyYy9vdGxheW91dC9vdGx0YWJsZS5jLCBzcmMvb3RsYXlvdXQvb3RsdGFibGUuaCwKLQlzcmMvb3RsYXlvdXQvb3RsdGFncy5oOiBOZXcgT3BlblR5cGUgTGF5b3V0IHNvdXJjZSBmaWxlcy4gIFRoZQotCW1vZHVsZSBpcyBzdGlsbCBpbmNvbXBsZXRlLgotCi0yMDAyLTA1LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0Y21hcDAuYyAodHRfY21hcDRfY2hhcl9pbmRleCk6IEZpeCBzZXJpb3VzIHR5cG8KLQkoMHhGRkZVIC0+IDB4RkZGRlUpLgotCi0yMDAyLTA1LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvSU5TVEFMTDogRml4IFVSTCBvZiBtYWtlcHAuCi0KLTIwMDItMDUtMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHR0X2ZhY2VfZ2V0X25hbWUpOiBGaXhpbmcgYSBidWcgdGhhdCBjYXVzZWQKLQlGcmVlVHlwZSB0byBjcmFzaCB3aGVuIGNlcnRhaW4gYnJva2VuIGZvbnRzIChlLmcuIGBoeWE2Z2IudHRmJykKLQl3ZXJlIG9wZW5lZC4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKFRUX0xvYWRfTmFtZXMpOiBBcHBsaWVkIGEgc21hbGwgd29yay1hcm91bmQgdG8KLQltYW5hZ2UgZm9udHMgY29udGFpbmluZyBhIGJyb2tlbiBuYW1lIHRhYmxlIChlLmcuIGBoeWE2Z2IudHRmJykuCi0KLQkqIHNyYy9zZm50L3R0Y21hcDAuYyAodHRfY21hcDRfdmFsaWRhdGUpOiBGaXhlZCBvdmVyLXJlc3RyaWN0aXZlCi0JdmFsaWRhdGlvbiB0ZXN0LiAgVGhlIGNoYXJtYXAgdmFsaWRhdG9yIG5vdyBhY2NlcHRzIG92ZXJsYXBwaW5nCi0JcmFuZ2VzIGluIGZvcm1hdCA0IGNoYXJtYXBzLgotCi0JKiBzcmMvc2ZudC90dGNtYXAwLmMgKHR0X2NtYXA0X2NoYXJfaW5kZXgpOiBTd2l0Y2hlZCB0byBhIGJpbmFyeQotCXNlYXJjaCBhbGdvcml0aG0uICBDZXJ0YWluIGZvbnRzIGNvbnRhaW4gbW9yZSB0aGFuIDE3MCBkaXN0aW5jdAotCXNlZ21lbnRzIQotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oOiBBZGRpbmcgYW4gYWxpYXMgZm9yIHRoZSBgZXhpdCcKLQlmdW5jdGlvbi4gIFRoaXMgd2lsbCBiZSB1c2VkIGluIHRoZSBuZWFyIGZ1dHVyZSB0byBwYW5pYyBpbiBjYXNlIG9mCi0JdW5leHBlY3RlZCBleGNlcHRpb24gKHdoaWNoIHNob3VsZG4ndCBoYXBwZW4gaW4gdGhlb3J5KS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaCwgc3JjL2Jhc2UvZnRoYXNoLmM6IE5ldyBmaWxlcy4KLQlUaGlzIGlzIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgZHluYW1pYyBoYXNoIHRhYmxlcyB1c2luZyBhIGxpbmVhcgotCWFsZ29yaXRobSAodG8gZ2V0IHJpZCBvZiBgc3RhbGxzJyBkdXJpbmcgcmVzaXplcykuICBJbiB0aGUgZnV0dXJlCi0JdGhpcyB3aWxsIGJlIHVzZWQgaW4gYXQgbGVhc3QgdGhyZWUgcGFydHMgb2YgdGhlIGxpYnJhcnk6IHRoZSBjYWNoZQotCXN1Yi1zeXN0ZW0sIHRoZSBvYmplY3Qgc3ViLXN5c3RlbSwgYW5kIHRoZSBtZW1vcnkgZGVidWdnZXIuCi0KLQkqIHNyYy9iYXNlL0phbWZpbGU6IFVwZGF0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCAoRlRfSU5URVJOQUxfSEFTSF9ILAotCUZUX0lOVEVSTkFMX09CSkVDVF9IKTogTmV3IG1hY3Jvcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNvcmUuaDogTmV3IGZpbGUgdG8gZ3JvdXAgYWxsIG5ldwotCWRlZmluaXRpb25zIHJlbGF0ZWQgdG8gZXhjZXB0aW9uIGhhbmRsaW5nIGFuZCBtZW1vcnkgbWFuYWdlbWVudC4gIEl0Ci0JaXMgdmVyeSBsaWtlbHkgdGhhdCB0aGlzIGZpbGUgd2lsbCBkaXNhcHBlYXIgb3IgYmUgcmVuYW1lZCBpbiB0aGUKLQlmdXR1cmUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmplY3QuaCwgaW5jbHVkZS9mcmVldHlwZS9mdHN5c21lbS5oOgotCUFkZGluZyBjb21tZW50cyB0byBiZXR0ZXIgZXhwbGFpbiB0aGUgb2JqZWN0IHN1Yi1zeXN0ZW0gYXMgd2VsbCBhcwotCXRoZSBuZXcgbWVtb3J5IG1hbmFnZXIgaW50ZXJmYWNlLgotCi0yMDAyLTA0LTMwICBXZW5saW4gSW5zdGl0dXRlIChUb20gQmlzaG9wKSAgPHdlbmxpbkB3ZW5saW4uY29tPgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jIChwMmNfc3RyKTogUmVtb3ZlZC4KLQkoZmlsZV9zcGVjX2Zyb21fcGF0aCkgW1RBUkdFVF9BUElfTUFDX0NBUkJPTl06IEFkZGVkIHN1cHBvcnQgZm9yCi0JT1MgWC4KLQkoaXNfZGZvbnQpIFtUQVJHRVRfQVBJX01BQ19DQVJCT05dOiBEZWZpbmUgb25seSBmb3IgT1MgWC4KLQlIYW5kbGUgYG5hbWVMZW4nIDw9IDYgYWxzby4KLQkocGFyc2VfZm9uZCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYG5hbWVfdGFibGUnLgotCVVzZSBmdW5jdGlvbmFsaXR5IG9mIG9sZCBwMmNfc3RyIGRpcmVjdGx5LgotCUFkZCBzYWZldHkgY2hlY2tzLgotCShyZWFkX2x3Zm4pOiBJbml0aWFsaXplIGBzaXplX3AnLgotCUNoZWNrIGZvciBzaXplX3AgPT0gTlVMTC4KLQkobmV3X21lbW9yeV9zdHJlYW0sIG9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IFVwZGF0ZWQgdG8gRnJlZVR5cGUgMi4xLgotCShGVF9OZXdfRmFjZV9Gcm9tX0xXRk4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBtZW1vcnknLgotCVJlbW92ZSBzb21lIGRlYWQgY29kZS4KLQkoRlRfTmV3X0ZhY2VfRnJvbV9TRk5UKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgc3RyZWFtJy4KLQkoRlRfTmV3X0ZhY2VfRnJvbV9kZm9udCkgW1RBUkdFVF9BUElfTUFDX0NBUkJPTl06IERlZmluZSBvbmx5IGZvcgotCU9TIFguCi0JKEZUX05ld19GYWNlX0Zyb21fRk9ORCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGVycm9yJy4KLQkoUmVzb3VyY2VGb3JrU2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoRlRfTmV3X0ZhY2UpOiBVc2UgaXQuCi0JSGFuZGxlIGVtcHR5IHJlc291cmNlIGZvcmtzLgotCUNvbmRpdGlvbmFsaXplIHNvbWUgY29kZSBmb3IgT1MgWC4KLQlBZGQgY29kZSB0byBjYWxsIG5vcm1hbCBsb2FkZXIgYXMgYSBmYWxsYmFjay4KLQotMjAwMi0wNC0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JYGludGVyZmFjZScgaXMgcmVzZXJ2ZWQgb24gdGhlIE1hYy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmgsIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oLAotCXNyYy9iYXNlL2Z0b3V0bG4uYzogcy9pbnRlcmZhY2UvZnVuY19pbnRlcmZhY2UvLgotCSogc3JjL2Jhc2UvZnRiYm94LmMgKEZUX091dGxpbmVfR2V0X0JCb3gpOgotCXMvaW50ZXJmYWNlL2Jib3hfaW50ZXJmYWNlLy4KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYzogcy9pbnRlcmZhY2UvbW9kdWxlX2ludGVyZmFjZS8uCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYywgc3JjL2NmZi9jZmZsb2FkLmg6Ci0Jcy9pbnRlcmZhY2UvcHNuYW1lc19pbnRlcmZhY2UvLgotCSogc3JjL2NpZC9jaWRyaXZlci5jOiBzL2ludGVyZmFjZS9jaWRfaW50ZXJmYWNlLy4KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmM6IHMvaW50ZXJmYWNlL21vZHVsZV9pbnRlcmZhY2UvLgotCSogc3JjL3Ntb290aC9mdGdyYXlzLmM6IHMvaW50ZXJmYWNlL2Z1bmNfaW50ZXJmYWNlLy4KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jOiBzL2ludGVyZmFjZS90dF9pbnRlcmZhY2UvLgotCSogc3JjL3R5cGUxL3QxZHJpdmVyLmM6IHMvaW50ZXJmYWNlL3QxX2ludGVyZmFjZS8uCi0KLQlTb21lIG1vcmUgdmFyaWFibGUgcmVuYW1lcyB0byBhdm9pZCB0cm91YmxlcyBvbiB0aGUgTWFjLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmM6Ci0Jcy9Vbmtub3dufEFzY2VuZGluZ3xEZXNjZW5kaW5nfEZsYXQvXDFfU3RhdGUvLgotCSogc3JjL3Ntb290aC9mdGdyYXlzLmM6IHMvVFNjYW4vVENvb3JkLy4KLQotCU90aGVyIGNoYW5nZXMgZm9yIHRoZSBNYWMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IERlZmluZSBGVF9NQUNJTlRPU0ggZm9yCi0JTWFjIHBsYXRmb3Jtcy4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBzL21hY2ludG9zaC9GVF9NQUNJTlRPU0gvLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBNYWtlIGBwaXRjaCcgYWx3YXlzCi0JYW4gZXZlbiBudW1iZXIuCi0KLTIwMDItMDQtMjkgIEpvdWsgSmFuc2VuICA8am91a2pAaHJlbS5zdG0udHVkZWxmdC5ubD4KLQotCSogZGVzY3JpcC5tbXMgKGFsbCk6IEFkZCBwZnIgZHJpdmVyLgotCi0yMDAyLTA0LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wZnIvcGZyZXJyb3IuaDogTmV3IGZpbGUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyLmg6IEFkZCBQRlIgZXJyb3IgY29kZXMuCi0JKiBzcmMvcGZyL3Bmcmdsb2FkLmM6IEluY2x1ZGUgcGZyZXJyb3IuaC4KLQlVc2UgUENGIGVycm9yIGNvZGVzLgotCShwZnJfZXh0cmFfaXRlbV9sb2FkX3N0ZW1fc25hcHMpOiBGaXggZGVidWcgbWVzc2FnZS4KLQkqIHNyYy9wZnIvcGZyZ2xvYWQuYzogSW5jbHVkZSBwZnJlcnJvci5oLgotCVVzZSBQQ0YgZXJyb3IgY29kZXMuCi0JKHBmcl9leHRyYV9pdGVtX2xvYWRfYml0bWFwX2luZm8sIHBmcl9nbHlwaF9sb2FkX3NpbXBsZSwKLQlwZnJfZ2x5cGhfbG9hZF9jb21wb3VuZCk6IEZpeCBkZWJ1ZyBtZXNzYWdlLgotCSogc3JjL3Bmci9wZnJvYmpzLmM6IEluY2x1ZGUgcGZyZXJyb3IuaC4KLQlVc2UgUENGIGVycm9yIGNvZGVzLgotCShwZnJfZmFjZV9pbml0KTogUmV0dXJuIFBGUl9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdC4KLQkqIHNyYy9wZnIvcnVsZXMubWsgKFBGUl9EUlZfSCk6IEluY2x1ZGUgcGZyZXJyb3IuaC4KLQotCSogc3JjL3BjZi9wY2Zkcml2ZXIuYyAoUENGX0ZhY2VfSW5pdCkgWyFGVF9DT05GSUdfT1BUSU9OX1VTRV9DTUFQU106Ci0JYHJvb3QnIC0+IGBmYWNlLT5yb290Jy4KLQkqIHNyYy9zZm50L3R0Y21hcDAuYyAoVFRfQnVpbGRfQ01hcHMpIFshRlRfQ09ORklHX09QVElPTl9VU0VfQ01BUFNdOgotCVJlbW92ZWQuCi0JKiBzcmMvc2ZudC90dGNtYXAwLmM6IERlY2xhcmUgVFRfQnVpbGRfQ01hcHMgb25seSBmb3IKLQlGVF9DT05GSUdfT1BUSU9OX1VTRV9DTUFQUy4KLQotMjAwMi0wNC0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYyAoZnRjX2NhY2hlX2xvb2t1cCksCi0Jc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoZnRjX2NtYXBfZmFtaWx5X2luaXQpLAotCXNyYy9jYWNoZS9mdGNtYW5hZy5jIChmdGNfZmFtaWx5X3RhYmxlX2FsbG9jKSwKLQlzcmMvY2FjaGUvZnRjc2JpdHMuYyAoRlRDX1NCaXRfQ2FjaGVfTG9va3VwKTogVXNlIEZUQ19FcnJfKi4KLQlzcmMvY2FjaGUvZnRjaW1hZ2UuYyAoRlRDX0ltYWdlX0NhY2hlX0xvb2t1cCk6IFVzZSBGVENfRXJyXyouCi0JKEZUQ19JbWFnZUNhY2hlX0xvb2t1cCk6IEZpeCBoYW5kbGluZyBvZiBpbnZhbGlkIGFyZ3VtZW50cy4KLQotMjAwMi0wNC0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IFNldCBgdmVyc2lvbl9pbmZvJyB0byA5OjE6MyAoRlQyCi0JdmVyc2lvbiAyLjAuOSBoYXMgOTowOjMpLgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlOiBSZWdlbmVyYXRlZCAodXNpbmcgYXV0b2NvbmYgMi41MykuCi0KLTIwMDItMDQtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Bmci9wZnJsb2FkLmMgKHBmcl9leHRyYV9pdGVtc19wYXJzZSk6IEZpeCBkZWJ1ZyBtZXNzYWdlLgotCShwZnJfcGh5X2ZvbnRfbG9hZCk6IHMvc2l6ZS9TaXplLyBmb3IgbG9jYWwgdmFyaWFibGUgdG8gYXZvaWQKLQljb21waWxlciB3YXJuaW5nLgotCSogc3JjL3Bmci9wZnJvYmpzLmMgKHBmcl9mYWNlX2luaXQpOiBGaXggZGVidWcgbWVzc2FnZS4KLQkocGZyX3Nsb3RfbG9hZCk6IFJlbW92ZSByZWR1bmRhbnQgbG9jYWwgdmFyaWFibGUuCi0KLTIwMDItMDQtMTkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUFkZGluZyBhIFBGUiBmb250IGRyaXZlciB0byB0aGUgRnJlZVR5cGUgc291cmNlcy4gIE5vdGUgdGhhdCBpdAotCWRvZXNuJ3Qgc3VwcG9ydCBlbWJlZGRlZCBiaXRtYXBzIG9yIGtlcm5pbmcgdGFibGVzIHlldC4KLQotCXNyYy9wZnIvKjogTmV3IGZpbGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oLCBzcmMvSmFtZmlsZTogVXBkYXRlZC4KLQotCSogc3JjL3R5cGUxL3QxZ2xvYWQuaCAoVDFfTG9hZF9HbHlwaCksIHNyYy90eXBlMS90MWdsb2FkLmMKLQkoVDFfTG9hZF9HbHlwaCk6IEZpeGVkIGluY29ycmVjdCBwYXJhbWV0ZXIgc2lnbi1uZXNzIGluIGNhbGxiYWNrCi0JZnVuY3Rpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCAoRlRfTUVNX1pFUk8sIEZUX1pFUk8pOiBOZXcKLQltYWNyb3MuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaCAoRlRfTkVYVF9PRkYzLCBGVF9ORVhUX1VPRkYzLAotCUZUX05FWFRfT0ZGM19MRSwgRlRfTkVYVF9VT0ZGM19MRSk6IE5ldyBtYWNyb3MgdG8gcGFyc2UgaW4tbWVtb3J5Ci0JMjQtYml0IGludGVnZXJzLgotCi0yMDAyLTA0LTE4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jLCBidWlsZHMvd2luMzIvZnRkZWJ1Zy5jLAotCWJ1aWxkcy9hbWlnYS9zcmMvYmFzZS9mdGRlYnVnLmM6IFZlcnNpb24gMi4xLjAgY291bGRuJ3QgYmUgbGlua2VkCi0JYWdhaW5zdCBhcHBsaWNhdGlvbnMgaW4gV2luMzIgYW5kIEFtaWdhIGJ1aWxkcyBkdWUgdG8gY2hhbmdlcyB0bwotCWBzcmMvYmFzZS9mdGRlYnVnLmMnIHRoYXQgd2VyZSBub3QgcHJvcGVybHkgcHJvcGFnYXRlZCB0bwotCWBidWlsZHMvd2luMzInIGFuZCBgYnVpbGRzL2FtaWdhJy4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmplY3QuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZXhjZXB0LmgsIGluY2x1ZGUvZnJlZXR5cGUvZnRzeXNtZW0uaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzaW8uaCwgc3JjL2Jhc2UvZnRzeXNtZW0uYywgc3JjL2Jhc2UvZnRzeXNpby5jOgotCU5ldyBleHBlcmltZW50YWwgZmlsZXMuCi0KLTIwMDItMDQtMTcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCi0JKiBWZXJzaW9uIDIuMS4wIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0yMDAyLTA0LTE3ICBNaWNoYWVsIEphbnNzb24gIDxtamFuQGVtMi1zb2x1dGlvbnMuY29tPgotCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9Db21wdXRlX01heF9BZHZhbmNlKTogRml4ZWQgYSBzbWFsbCBidWcKLQl0aGF0IHByZXZlbnRlZCB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlLgotCi0yMDAyLTA0LTE2ICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkgIDxGcmFuY2VzY28uWmFwcGEuTmFyZGVsbGlAZW5zLmZyPgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9hY2NlbCk6IEZpeCBwYXJzaW5nIG9mIGFjY2VsZXJhdG9yCi0JdGFibGVzLgotCi0yMDAyLTA0LTE1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvRlRMLnR4dDogRm9ybWF0dGluZy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaDogUmVkdWNlIHRoZSBzaXplIG9mIHRoZQotCXJlbmRlciBwb29sIGZyb20gMzJrQnl0ZSB0byAxNmtCeXRlLgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX3NlZWtfdG9fdGFibGVfdHlwZSk6IFJlbW92ZSBjb21waWxlcgotCXdhcm5pbmcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmggKEZUX01BWF9FWFRFTlNJT05TKTogUmVtb3ZlZC4KLQotCSogZG9jcy9DSEFOR0VTOiBQcmVwYXJpbmcgMi4xLjAgcmVsZWFzZS4KLQotMjAwMi0wNC0xMyAgV2VybmVyIExFTUJFUkcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKENGRl9QYXJzZV9DaGFyU3RyaW5ncyk6IHMvcmFuZC9SYW5kLyB0byBhdm9pZAotCWNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMDItMDQtMTIgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogUkVBRE1FLlVOWDogVXBkYXRlZCB0aGUgVW5peC1zcGVjaWZpYyBxdWljay1jb21waWxhdGlvbiBndWlkZSB0bwotCXdhcm4gYWJvdXQgdGhlIEdOVSBNYWtlIHJlcXVpcmVtZW50IGF0IGNvbXBpbGUgdGltZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oLAotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgsCi0KLQlzcmMvYXV0b2hpbnQvYWhvcHRpbS5jLAotCi0Jc3JjL2Jhc2UvZnRkYmdtZW0uYywgc3JjL2Jhc2UvZnRkZWJ1Zy5jLCBzcmMvYmFzZS9mdG1hYy5jLAotCXNyYy9iYXNlL2Z0b2Jqcy5jLCBzcmMvYmFzZS9mdHN5c3RlbS5jLAotCi0Jc3JjL2NhY2hlL2Z0Y2ltYWdlLmMsIHNyYy9jYWNoZS9mdGNzYml0cy5jLAotCi0Jc3JjL2NmZi9jZmZkcml2ci5jLCBzcmMvY2ZmL2NmZmxvYWQuYywgc3JjL2NmZi9jZmZvYmpzLmMsCi0KLQlzcmMvY2lkL2NpZGxvYWQuYywgc3JjL2NpZC9jaWRwYXJzZS5jLCBzcmMvY2lkL2NpZHJpdmVyLmMsCi0KLQlzcmMvcGNmL3BjZmRyaXZlci5jLCBzcmMvcGNmL3BjZnJlYWQuYywKLQotCXNyYy9wc2F1eC90MWNtYXAuYywgc3JjL3BzYXV4L3QxZGVjb2RlLmMsCi0KLQlzcmMvcHNoaW50ZXIvcHNoYWxnbzEuYywgc3JjL3BzaGludGVyL3BzaGFsZ28yLmMsCi0Jc3JjL3BzaGludGVyL3BzaHJlYy5jLAotCi0Jc3JjL3BzbmFtZXMvcHNtb2R1bGUuYywKLQotCXNyYy9yYXN0ZXIvZnRyYXN0ZXIuYywKLQotCXNyYy9zZm50L3NmZHJpdmVyLmMsIHNyYy9zZm50L3R0bG9hZC5jLAotCi0Jc3JjL3Ntb290aC9mdGdyYXlzLmMsCi0KLQlzcmMvdHlwZTEvdDFhZm0uYywgc3JjL3R5cGUxL3QxZHJpdmVyLmMsIHNyYy90eXBlMS90MWdsb2FkLmMsCi0Jc3JjL3R5cGUxL3QxbG9hZC5jLCBzcmMvdHlwZTEvdDFvYmpzLmMsIHNyYy90eXBlMS90MXBhcnNlLmMsCi0KLQlidWlsZHMvdW5peC9mdGNvbmZpZy5pbiwgYnVpbGRzL3Ztcy9mdGNvbmZpZy5oLAotCi0JYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0ZGVidWcuYzoKLQotCUFkZGVkIHRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlIGBmdHN0ZGxpYi5oJyB1c2VkIHRvIGRlZmluZQotCWFsaWFzZXMgZm9yIGFsbCBJU08gQyBsaWJyYXJ5IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBlbmdpbmUKLQkoZS5nLiBzdHJsZW4sIHFzb3J0LCBzZXRqbXAsIGV0Yy4pLgotCi0JVGhpcyBlYXNlcyB0aGUgcG9ydGluZyBvZiBGcmVlVHlwZSAyIHRvIGVudmlyb25tZW50cyBsaWtlCi0JWEZyZWU4NiBtb2R1bGVzL2V4dGVuc2lvbnMuCi0KLQlBbHNvIHJlbW92ZWQgbWFueSAjaW5jbHVkZSA8c3RyaW5nLmg+LCAjaW5jbHVkZSA8c3RkbGliLmg+LCBldGMuCi0JZnJvbSB0aGUgZW5naW5lJ3Mgc291cmNlcyB3aGVyZSB0aGV5IGFyZSBub3QgbmVlZGVkLgotCi0JKiBzcmMvc2ZudC90dHBvc3QuYzogVXNlIG1hY3JvIG5hbWUgZm9yIHBzbmFtZXMuaC4KLQotMjAwMi0wNC0xMiAgVmluY2VudCBDYXJvbiAgPHYuY2Fyb25AemVyb2RldXgubmV0PgotCi0JKiBjb25maWd1cmUsIGJ1aWxkcy9kZXRlY3QubWs6IFVwZGF0ZWQgdGhlIGJ1aWxkIHN5c3RlbSB0byBwcmludAotCWEgd2FybmluZyBtZXNzYWdlIGluIGNhc2UgR05VIE1ha2UgaXNuJ3QgdXNlZCB0byBidWlsZCB0aGUgbGlicmFyeS4KLQotMjAwMi0wNC0xMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBSRUFETUUsIGRvY3MvQ0hBTkdFUywgSmFtZmlsZS5pbjogVXBkYXRlcyBmb3IgdGhlIDIuMS4wIHJlbGVhc2UuCi0KLQkqIGRvY3MvRlRMLnR4dDogVXBkYXRlZCBsaWNlbnNlIHRleHQgdG8gcHJvdmlkZSBhIHByZWZlcnJlZAotCWRpc2NsYWltZXIgYW5kIGFkanVzdCBjb3B5cmlnaHQgZGF0ZXMvZXh0ZW50cy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNnbHlwaC5oOiBSZW1vdmluZyBvYnNvbGV0ZSAoYW5kCi0JY29uZnVzaW5nKSBjb21tZW50LgotCi0JKiBKYW1maWxlLmluOiBOZXcgZmlsZS4KLQotMjAwMi0wNC0xMSAgTWF4aW0gU2hlbWFuYXJldiAgPG1jc2VlbWFnZ0B5YWhvby5jb20+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2hsaW5lKTogTWlub3Igb3B0aW1pemF0aW9uLgotCi0yMDAyLTA0LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXhlcyBmcm9tIHRoZSBzdGFibGUgYnJhbmNoOgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIChGVF9DT05GSUdfT1BUSU9OX09MRF9DQUxDUyk6Ci0JUmVtb3ZlZC4KLQlbRlRfQ09ORklHX09QVElPTl9PTERfQ0FMQ1NdOiBSZW1vdmVkLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCwgc3JjL2Jhc2UvZnRjYWxjLmMKLQlbRlRfQ09ORklHX09QVElPTl9PTERfQ0FMQ1NdOiBSZW1vdmVkLgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChGVF9WZWN0b3JfTGVuZ3RoKTogQ2hhbmdlIGFsZ29yaXRobSB0byBtYXRjaAotCW91dHB1dCBvZiBGcmVlVHlwZSAxLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoZ2xvYi5jIChwc2hfZ2xvYmFsc19zY2FsZV93aWR0aHMpOiBGaXhlZCBhIHNtYWxsCi0JYnVnIHRoYXQgY3JlYXRlZCB1bi1ldmVuIHN0ZW0gd2lkdGhzIHdoZW4gaGludGluZyBQb3N0c2NyaXB0IGZvbnRzLgotCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYywgc3JjL3R5cGUxL3QxcGFyc2UuYzogMTZiaXQgZml4ZXMuCi0KLTIwMDItMDQtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYzogMTZiaXQgZml4ZXMuCi0JKFRUX0xvYWRfU2ltcGxlX0dseXBoKTogSW1wcm92ZSBkZWJ1ZyBtZXNzYWdlcy4KLQkobG9hZF90cnVldHlwZV9nbHlwaCk6IFJlbW92ZSBkZWFkIGNvZGUuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYzogMTZiaXQgZml4ZXMuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmM6IERpdHRvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmgsIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oLAotCXNyYy9jZmYvY2ZmbG9hZC5oLCBzcmMvcHNhdXgvcHNvYmpzLmgsIHNyYy90cnVldHlwZS90dGludGVycC5bY2hdLAotCXNyYy9zZm50L3R0cG9zdC5oOiBzL2luZGV4L2lkeC8uCi0KLTIwMDItMDMtMzEgIFlhbyBaaGFuZyAgPHlhb3pAdmlkYXIubmlhYWEubmloLmdvdj4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jIChUVF9TaXplX0luaXQpOiBGaXggdHlwby4KLQotMjAwMi0wMy0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvb3RsYXlvdXQvb3RsY29tbW4uYywgc3JjL290bGF5b3V0L290bGNvbW1uLmg6IHMvaW5kZXgvaWR4Ly4KLQkqIHNyYy9wc2F1eC90MWNtYXAuYzogRGl0dG8uCi0JKiBzcmMvc2ZudC90dGNtYXAwLmM6IERpdHRvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaCAoVFRfR290b19UYWJsZV9GdW5jKTogUmVuYW1lZCB0byAuLi4KLQkoVFRfTG9hZGVyX0dvdG9UYWJsZUZ1bmMpOiBUaGlzLgotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKFQxX0RlY29kZXJfUGFyc2VfQ2hhcnN0cmluZ3MpOiBGaXggZGVidWcKLQltZXNzYWdlcy4KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKHBzbmFtZXNfaW50ZXJmYWNlKQotCVshRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUXTogRml4IHR5cG8uCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChnZXRfc2ZudF90YWJsZSk6IDE2Yml0IGZpeC4KLQkqIHNyYy9zZm50L3R0Y21hcC5jOiAxNmJpdCBmaXhlcyAoMHhGRkZGIC0+IDB4RkZGRlUpLgotCSogc3JjL3NmbnQvdHRjbWFwMC5jOiAxNmJpdCBmaXhlcy4KLQkoVFRfQnVpbGRfQ01hcHMpOiBTaW1wbGlmeSBkZWJ1ZyBtZXNzYWdlcy4KLQkodHRfY21hcDEyX2NoYXJfbmV4dCk6IEZpeCBvZmZzZXQuCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoVFRfTG9hZF9OYW1lcywgVFRfTG9hZF9DTWFwKTogRml4IGRlYnVnCi0JbWVzc2FnZXMuCi0JKFRUX0xvYWRfT1MyKTogMTZiaXQgZml4LgotCi0yMDAyLTAzLTMwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oOiBBZGRpbmcgY29tbWVudHMgdG8gc29tZSBvZgotCXRoZSBUVF9GYWNlUmVjIGZpZWxkcy4KLQotCSogc3JjL3NmbnQvdHRjbWFwMC5jIChUVF9CdWlsZF9DTWFwcyk6IFJlbW92ZWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jICh0dF9uYW1lX2VudHJ5X2FzY2lpX2Zyb21fe3V0ZjE2LHVjczQsb3RoZXJ9OgotCU5ldyBmdW5jdGlvbnMuCi0JKHR0X2ZhY2VfZ2V0X25hbWUpOiBVc2UgdGhlbSB0byBwcm9wZXJseSBleHRyYWN0IGFuIGFzY2lpIGZvbnQgbmFtZS4KLQotMjAwMi0wMy0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmggKHQxX2JsZW5kX21heCk6IEZpeCB0eXBvLgotCSogc3JjL2Jhc2UvZnRzdHJlYW0uYzogU2ltcGxpZnkgRlRfRVJST1IgY2FsbHMuCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfZ2x5cGhfbmFtZSk6IEZpeCBkZWJ1ZyBtZXNzYWdlLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoQ0ZGX0RyaXZlcl9Jbml0LCBDRkZfRHJpdmVyX0RvbmUpCi0JW1RUX0NPTkZJR19PUFRJT05fRVhURU5EX0VOR0lORV06IFJlbW92ZWQuCi0JKiBzcmMvY2ZmL3Nmb2Jqcy5jIChTRk5UX0xvYWRfRmFjZSkKLQlbVFRfQ09ORklHX09QVElPTl9FWFRFTkRfRU5HSU5FXTogRGl0dG8uCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKFRUX0luaXRfRHJpdmVyLCBUVF9Eb25lX0RyaXZlcikKLQlbVFRfQ09ORklHX09QVElPTl9FWFRFTkRfRU5HSU5FXTogRGl0dG8uCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jLCBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMsCi0Jc3JjL3RydWV0eXBlL3R0b2Jqcy5oOiBSZW5hbWluZyBkcml2ZXIgZnVuY3Rpb25zIHRvIHRoZQotCUZUXzxTdWJqZWN0Pl88QWN0aW9uPiBzY2hlbWU6Ci0KLQkgIFRUX0luaXRfRHJpdmVyID0+IFRUX0RyaXZlcl9Jbml0Ci0JICBUVF9Eb25lX0RyaXZlciA9PiBUVF9Ecml2ZXJfRG9uZQotCSAgVFRfSW5pdF9GYWNlICAgPT4gVFRfRmFjZV9Jbml0Ci0JICBUVF9Eb25lX0ZhY2UgICA9PiBUVF9GYWNlX0RvbmUKLQkgIFRUX0luaXRfU2l6ZSAgID0+IFRUX1NpemVfSW5pdAotCSAgVFRfRG9uZV9TaXplICAgPT4gVFRfU2l6ZV9Eb25lCi0JICBUVF9SZXNldF9TaXplICA9PiBUVF9TaXplX1Jlc2V0Ci0KLTIwMDItMDMtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3Ztcy9mdGNvbmZpZy5oOiBSZW5hbWUgTE9DQUxfREVGIGFuZCBMT0NBTF9GVU5DIHRvCi0JRlRfTE9DQUwgYW5kIEZUX0xPQ0FMX0RFRiwgcmVzcGVjdGl2ZWx5LCBhcyB3aXRoIG90aGVyIGZ0Y29uZmlnLmgKLQlmaWxlcy4KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBBZGQgYXJndW1lbnQgdG8gRlRfTE9DQUwgYW5kCi0JRlRfTE9DQUxfREVGLgotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmM6IHMvRlRfQXNzZXJ0L0ZUX0FTU0VSVC8uCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IFRlbXBvcmFyaWx5IGRlYWN0aXZhdGUgY3JlYXRpb24gb2YKLQkuLi8uLi9KYW1maWxlLgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlOiBVcGRhdGVkLgotCi0yMDAyLTAzLTI4ICBLVVNBTk8gVGFrYXl1a2kgIDxBRTVULUtTTkBhc2FoaS1uZXQub3IuanA+Ci0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKGdldF9zZm50X3Bvc3RzY3JpcHRfbmFtZSk6IEZpeCBzZXJpb3VzIHR5cG9zLgotCi0yMDAyLTAzLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNBdXhfU2VydmljZVJlYyk6IEZpeAotCWNvbXBpbGVyIHdhcm5pbmdzLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggKFQxX0ZhY2VSZWMpOiBVc2UgYGNvbnN0JyBmb3IKLQlzb21lIG1lbWJlcnMuCi0JKiBzcmMvYmFzZS9mdGFwaS5jIChGVF9OZXdfTWVtb3J5X1N0cmVhbSk6IEZpeCB0eXBvcy4KLQkqIHNyYy9wc2F1eC90MWNtYXAuYyAodDFfY21hcF9zdGRfaW5pdCwgdDFfY21hcF91bmljb2RlX2luaXQpOiBBZGQKLQljYXN0LgotCSh0MV9jbWFwX3tzdGFuZGFyZCxleHBlcnQsY3VzdG9tLHVuaWNvZGV9X2NsYXNzX3JlYyk6IFVzZQotCWBGVF9DQUxMQkFDS19UQUJMRV9ERUYnLgotCSogc3JjL3BzYXV4L3QxY21hcC5oOiBVcGRhdGVkLgotCSogc3JjL3NmbnQvdHRjbWFwMC5jIChUVF9CdWlsZF9DTWFwcyk6IFVzZSBgZnRfZW5jb2Rpbmdfbm9uZScKLQlpbnN0ZWFkIG9mIHplcm8uCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX0ZhY2VfSW5pdCk6IFVzZSBjYXN0cy4KLQotMjAwMi0wMy0yNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jLCBzcmMvc2ZudC9zZm9ianMuYywgc3JjL3NmbnQvdHRjbWFwMC5jOgotCUZpeGVkIGEgc21hbGwgYnVnIGluIHRoZSBGVF9DTWFwcyBzdXBwb3J0IGNvZGUuCi0KLTIwMDItMDMtMjUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKE5vcm0pOiBSZXBsYWNlZCB3aXRoLi4uCi0JKFRUX1ZlY0xlbik6IFRoaXMuCi0JKFRUX011bEZpeDE0LCBUVF9Eb3RGaXgxNCk6IE5ldyBmdW5jdGlvbnMuCi0JKFByb2plY3QsIER1YWxfUHJvamVjdCwgRnJlZV9Qcm9qZWN0LCBDb21wdXRlX1BvaW50X0Rpc3BsYWNlbWVudCwKLQlJbnNfU0hQSVgsIEluc19NSUFQLCBJbnNfTUlSUCk6IFVzZSB0aGVtLgotCVtGVF9DT05GSUdfT1BUSU9OX09MRF9DQUxDU106IFJlbW92ZWQgYWxsIGNvZGUuCi0KLTIwMDItMDMtMjIgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMsIHNyYy9zZm50L3R0Y21hcDAuYywgc3JjL3R5cGUxL3Qxb2Jqcy5jOgotCVZhcmlvdXMgZml4ZXMgdG8gbWFrZSB0aGUgRlRfQ01hcHMgc3VwcG9ydCB3b3JrIGNvcnJlY3RseSAobW9yZQotCXRlc3RzIGFyZSBzdGlsbCBuZWVkZWQpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oLCBzcmMvc2ZudC9KYW1maWxlLAotCXNyYy9zZm50L3J1bGVzLm1rLCBzcmMvc2ZudC9zZm50LmMsIHNyYy9zZm50L3Nmb2Jqcy5jLAotCXNyYy9zZm50L3R0bG9hZC5jLCBzcmMvc2ZudC90dGNtYXAwLmMsIHNyYy9zZm50L3R0Y21hcDAuaDogVXBkYXRlZAotCXRoZSBTRk5UIGNoYXJtYXAgc3VwcG9ydCB0byB1c2UgRlRfQ01hcHMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaDogTmV3IGZpbGUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmg6IEluY2x1ZGUgaXQuICBJdCBjb250YWlucyBhbGwgZXJyb3IKLQljb2Rlcy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX0VSUk9SX0RFRklOSVRJT05TX0gpOiBOZXcKLQltYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oLCBhbmQgYSBsb3Qgb2Ygb3RoZXIgZmlsZXM6Ci0JQ2hhbmdlZCB0aGUgbmFtZXMgb2YgbWVtb3J5IG1hY3Jvcy4gIEV4YW1wbGVzOgotCi0JICBNRU1fU2V0ICAgPT4gRlRfTUVNX1NFVAotCSAgTUVNX0NvcHkgID0+IEZUX01FTV9DT1BZCi0JICBNRU1fTW92ZSAgPT4gRlRfTUVNX01PVkUKLQotCSAgQUxMT0MgICAgID0+IEZUX0FMTE9DCi0JICBGUkVFICAgICAgPT4gRlRfRlJFRQotCSAgUkVBTExPQyAgID0gPkZUX1JFQUxMT0MKLQotCUZUX05FVyB3YXMgaW50cm9kdWNlZCB0byBhbGxvY2F0ZSBhIG5ldyBvYmplY3QgZnJvbSBhIF90eXBlZF8KLQlwb2ludGVyLgotCi0JTm90ZSB0aGF0IEFMTE9DX0FSUkFZIGFuZCBSRUFMTE9DX0FSUkFZIGhhdmUgYmVlbiByZXBsYWNlZCBieQotCUZUX05FV19BUlJBWSBhbmQgRlRfUkVORVdfQVJSQVkgd2hpY2ggdGFrZSBfdHlwZWRfIHBvaW50ZXIKLQlhcmd1bWVudHMuCi0KLQlUaGlzIHJlc3VsdHMgaW4gX2xvdHNfIG9mIHNvdXJjZXMgYmVpbmcgY2hhbmdlZCwgYnV0IG1ha2VzIHRoZSBjb2RlCi0JbW9yZSBnZW5lcmljIGFuZCBsZXNzIGVycm9yLXByb25lLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmgsIHNyYy9iYXNlL2Z0c3RyZWFtLmMsCi0Jc3JjL2NmZi9jZmZsb2FkLmMsIHNyYy9wY2YvcGNmcmVhZC5jLCBzcmMvc2ZudC90dGNtYXAuYywKLQlzcmMvc2ZudC90dGNtYXAwLmMsIHNyYy9zZm50L3R0bG9hZC5jLCBzcmMvc2ZudC90dHBvc3QuYywKLQlzcmMvc2ZudC90dHNiaXQuYywgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYywgc3JjL3RydWV0eXBlL3R0cGxvYWQuYywKLQlzcmMvd2luZm9udHMvd2luZm50LmM6IENoYW5nZWQgdGhlIGRlZmluaXRpb25zIG9mIHN0cmVhbSBtYWNyb3MuCi0JRXhhbXBsZXM6Ci0KLQkgIE5FWFRfQnl0ZSAgICAgPT4gRlRfTkVYVF9CWVRFCi0JICBORVhUX1Nob3J0ICAgID0+IEZUX05FWFRfU0hPUlQKLQkgIE5FWFRfVVNob3J0TEUgPT4gRlRfTkVYVF9VU0hPUlRfTEUKLQkgIFJFQURfU2hvcnQgICAgPT4gRlRfUkVBRF9TSE9SVAotCSAgR0VUX0xvbmcgICAgICA9PiBGVF9HRVRfTE9ORwotCSAgZXRjLgotCi0JQWxzbyBpbnRyb2R1Y2VkIHRoZSBGVF9QRUVLX1hYWFggZnVuY3Rpb25zLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoQ0ZGX0J1aWxkX1VuaWNvZGVfQ2hhcm1hcCk6IFJlbW92ZWQgY29tbWVudGVkCi0Jb3V0IGZ1bmN0aW9uLgotCShmaW5kX2VuY29kaW5nKTogUmVtb3ZlZC4KLQkoQ0ZGX0ZhY2VfSW5pdCk6IFJlbW92ZSBjaGFybWFwIHN1cHBvcnQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmggKEZUX0NPTkZJR19PUFRJT05fVVNFX0NNQVBTLAotCVRUX0NPTkZJR19DTUFQX0ZPUk1BVHswLDIsNCw2LDgsMTAsMTJ9KTogTmV3IG1hY3JvcyB0byBmaW5lLXR1bmUKLQlzdXBwb3J0IG9mIGNtYXBzLgotCi0yMDAyLTAzLTIxICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jLCBzcmMvcGNmL3BjZmRyaXZlci5jLCBzcmMvcGNmL3BjZnJlYWQuYzogVXBkYXRlZAotCXRvIG5ldyBGVF9DTWFwIGRlZmluaXRpb25zLgotCi0JKiBzcmMvcHNhdXgvdDFjbWFwLmgsIHNyYy9wc2F1eC90MWNtYXAuYywgc3JjL3R5cGUxL3QxY21hcC5oLAotCXNyYy90eXBlMS90MWNtYXAuYzogVXBkYXRpbmcgYW5kIG1vdmluZyB0aGUgVHlwZSAxIEZUX0NNYXAgc3VwcG9ydAotCWZyb20gYHNyYy90eXBlMScgdG8gYHNyYy9wc2F1eCcgc2luY2UgaXQgaXMgZ29pbmcgdG8gYmUgc2hhcmVkIGJ5Ci0JdGhlIFR5cGUgMSBhbmQgQ0lEIGZvbnQgZHJpdmVycy4KLQotCSogc3JjL3BzYXV4L0phbWZpbGUsIHNyYy9wc2F1eC9wc2F1eC5jLCBzcmMvcHNhdXgvcHNhdXhtb2QuYywKLQlzcmMvcHNhdXgvcnVsZXMubWssIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaDogQWRkZWQgc3VwcG9ydAotCWZvciBUeXBlIDEgRlRfQ01hcHMuCi0KLTIwMDItMDMtMjAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRnbG9hZHIuYyAoRlRfR2x5cGhMb2FkZXJfQ2hlY2tTdWJHbHlwaHMpOiBGaXhlZCBhCi0JbWVtb3J5IGFsbG9jYXRpb24gYnVnIHRoYXQgd2FzIGR1ZSB0byB1bi1jYXJlZnVsIHJlbmFtaW5nIG9mIHRoZQotCUZUX1N1YkdseXBoIHR5cGUuCi0KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKGZ0X21lbV90YWJsZV9kZXN0cm95KTogRml4ZWQgYSBzbWFsbCBidWcgdGhhdAotCWNhdXNlZCB0aGUgbGlicmFyeSB0byBjcmFzaCB3aXRoIEVsZWN0cmljIEZlbmNlIHdoZW4gbWVtb3J5Ci0JZGVidWdnaW5nIGlzIHVzZWQuCi0KLQkqIFJlbmFtaW5nIHN0cmVhbSBtYWNyb3MuICBFeGFtcGxlczoKLQotCSAgRklMRV9Ta2lwICAgID0+IEZUX1NUUkVBTV9TS0lQCi0JICBGSUxFX1JlYWQgICAgPT4gRlRfU1RSRUFNX1JFQUQKLQkgIEFDQ0VTU19GcmFtZSA9PiBGVF9GUkFNRV9FTlRFUgotCSAgRk9SR0VUX0ZyYW1lID0+IEZUX0ZSQU1FX0VYSVQKLQkgIGV0Yy4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoZ2V0X3NmbnRfcG9zdHNjcmlwdF9uYW1lKTogRml4ZWQgbWVtb3J5IGxlYWsuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg6IENoYW5naW5nIHRoZSBkZWZpbml0aW9uIG9mCi0JRlRfQ01hcF9DaGFyTmV4dEZ1bmMgc2xpZ2h0bHkuCi0KLQkqIHNyYy9jZmYvKi5jOiBVcGRhdGluZyBDRkYgdHlwZSBkZWZpbml0aW9ucy4KLQotMjAwMi0wMy0xNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmgsIHNyYy9hdXRvaGludC9haG1vZHVsZS5jLAotCXNyYy9iYXNlL2Z0YXBpLmMsIHNyYy9iYXNlL2Z0b2Jqcy5jOiBVcGRhdGluZyB0aGUgdHlwZSBkZWZpbml0aW9ucwotCWZvciB0aGUgYXV0by1oaW50ZXIgbW9kdWxlLgotCi0JICBGVF9BdXRvSGludGVyX0ludGVyZmFjZSAgPT4gRlRfQXV0b0hpbnRlcl9TZXJ2aWNlUmVjCi0JICBGVF9BdXRvSGludGVyX0ludGVyZmFjZSogPT4gRlRfQXV0b0hpbnRlcl9TZXJ2aWNlCi0JICBldGMuCi0KLQkgIEZUX0F1dG9IaW50ZXJfR2V0X0dsb2JhbF9GdW5jICA9PiBGVF9BdXRvSGludGVyX0dsb2JhbEdldEZ1bmMKLQkgIEZUX0F1dG9IaW50ZXJfRG9uZV9HbG9iYWxfRnVuYyA9PiBGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jCi0JICBldGMuCi0KLQkqIGFobG9hZGVyLmggW19TVEFOREFMT05FX106IFJlbW92ZWQgYWxsIGNvbmRpdGlvbmFsIGNvZGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvY2ZmdHlwZXMuaCwgc3JjL2NmZi8qLmM6IFVwZGF0aW5nIHRoZQotCXR5cGUgZGVmaW5pdGlvbnMgb2YgdGhlIENGRiBmb250IGRyaXZlci4KLQotCSAgQ0ZGX0ZvbnQgID0+IENGRl9Gb250UmVjCi0JICBDRkZfRm9udCogPT4gQ0ZGX0ZvbnQKLQkgIGV0Yy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mbnR0eXBlcy5oLCBzcmMvd2luZm9udHMvKi5jOiBVcGRhdGluZwotCXR5cGUgZGVmaW5pdGlvbnMgb2YgdGhlIFdpbmRvd3MgRk5UIGZvbnQgZHJpdmVyLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJpdmVyLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCwgc3JjL2Jhc2UvZnRhcGkuYywKLQlzcmMvYmFzZS9mdG9ianMuYywgc3JjL2NmZi9jZmZkcml2ci5jLCBzcmMvY2ZmL2NmZmRyaXZyLmgsCi0Jc3JjL2NpZC9jaWRyaXZlci5jLCBzcmMvY2lkL2NpZHJpdmVyLmgsIHNyYy9wY2YvcGNmZHJpdmVyLmMsCi0Jc3JjL3BjZi9wY2Zkcml2ZXIuaCwgc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMsCi0Jc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmgsIHNyYy90eXBlMS90MWRyaXZlci5jLCBzcmMvdHlwZTEvdDFkcml2ZXIuaCwKLQlzcmMvd2luZm9udHMvd2luZm50LmMsIHNyYy93aW5mb250cy93aW5mbnQuaDogVXBkYXRpbmcgdHlwZQotCWRlZmluaXRpb25zIGZvciBmb250IGRyaXZlcnMuCi0KLQkgIEZURHJpdmVyX2luaXRGYWNlICAgICAgPT4gRlRfRmFjZV9Jbml0RnVuYwotCSAgRlREcml2ZXJfaW5pdEdseXBoU2xvdCA9PiBGVF9TbG90X0luaXRGdW5jCi0JICBldGMuCi0KLQkqIHNyYy9jaWQvY2lkb2Jqcy5jIChDSURfRmFjZV9Jbml0KTogUmVtb3ZlIGRlYWQgY29kZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCwgc3JjL2Jhc2UvZnRvYmpzLmM6IFVwZGF0ZWQgYQotCWZldyBmYWNlIG1ldGhvZCBkZWZpbml0aW9uczoKLQotCSAgRlRfUFNOYW1lX1JlcXVlc3RlciAgICAgPT4gRlRfRmFjZV9HZXRQb3N0c2NyaXB0TmFtZUZ1bmMKLQkgIEZUX0dseXBoX05hbWVfUmVxdWVzdGVyID0+IEZUX0ZhY2VfR2V0R2x5cGhOYW1lRnVuYwotCSAgRlRfTmFtZV9JbmRleF9SZXF1ZXN0ZXIgPT4gRlRfRmFjZV9HZXRHbHlwaE5hbWVJbmRleEZ1bmMKLQotCSogc3JjL2Jhc2UvZnRhcGkuYzogTmV3IGZpbGUuICBJdCBjb250YWlucyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JZnVuY3Rpb25zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgsIHNyYy9jaWQvY2lkbG9hZC5jLAotCXNyYy9jaWR0b2tlbi5oLCBzcmMvcHNhdXgvcHNvYmpzLmMsIHNyYy9wc2F1eC9wc29ianMuaCwKLQlzcmMvcHNhdXgvdDFkZWNvZGUuYywgc3JjL3R5cGUxL3QxbG9hZC5jLCBzcmMvdHlwZTEvdDF0b2tlbnMuaDoKLQlVcGRhdGVkIGNvbW1vbiBQb3N0U2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMuCi0JUmVuYW1lZCBhbGwgZW51bWVyYXRpb24gdmFsdWVzIGxpa2UgdG8gdXBwZXJjYXNlIHZhcmlhbnRzOgotCi0JICB0MV90b2tlbl9hbnkgICAgICA9PiBUMV9UT0tFTl9UWVBFX0FOWQotCSAgdDFfZmllbGRfY2lkX2luZm8gPT4gVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk8KLQkgIGV0Yy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2dsb2JhbC5oOiBSZW1vdmVkLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgsIHNyYy9wc2hpbnRlci9wc2hnbG9iLmg6Ci0JVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmgsIHNyYy9iYXNlL2Z0bmFtZXMuYywKLQlzcmMvY2ZmL2NmZmRyaXZyLmMsIHNyYy9zZm50LyouYywgc3JjL3RydWV0eXBlLyouYzogVXBkYXRlZAotCVNGTlQvVHJ1ZVR5cGUgdHlwZSBkZWZpbml0aW9ucy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oLCBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmg6Ci0JVXBkYXRpbmcgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIGdseXBoIGxvYWRlci4KLQotMjAwMi0wMy0xMyAgQW50b2luZSBMZWNhICA8YW50b2luZUBvcmlvbG5ldC5jb20+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg6IENoYW5nZWQgdGhlIGF1dG9tYXRpYwotCWRldGVjdGlvbiBvZiBNaWNyb3NvZnQgQyBjb21waWxlcnMgdG8gYXV0b21hdGljYWxseSBzdXBwb3J0IDY0LWJpdAotCWludGVnZXJzIG9ubHkgc2luY2UgcmV2aXNpb24gOS4wMCAoaS5lLiA+PSBWaXN1YWwgQysrIDIuMCkuCi0KLTIwMDItMDMtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnR1dGlsLmMgKEZUX1JlYWxsb2MpOiBVc2UgTUVNX1NldCBpbnN0ZWFkIG9mIG1lbXNldC4KLQotMjAwMi0wMy0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGRiZ21lbS5jIChmdF9tZW1fdGFibGVfcmVzaXplLCBmdF9tZW1fdGFibGVfbmV3LAotCWZ0X21lbV90YWJsZV9zZXQsIGZ0X21lbV9kZWJ1Z19hbGxvYywgZnRfbWVtX2RlYnVnX2ZyZWUsCi0JZnRfbWVtX2RlYnVnX3JlYWxsb2MsIGZ0X21lbV9kZWJ1Z19kb25lLCBGVF9BbGxvY19EZWJ1ZywKLQlGVF9SZWFsbG9jX0RlYnVnLCBGVF9GcmVlX0RlYnVnKTogRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX011bEZpeCk6IERpdHRvLgotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X25hbWVfaW5kZXgpOiBEaXR0by4KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChDRkZfU2l6ZV9HZXRfR2xvYmFsc19GdW5jcywgQ0ZGX1NpemVfSW5pdCwKLQlDRkZfR2x5cGhTbG90X0luaXQpOiBEaXR0by4KLQkqIHNyYy9jaWQvY2lkb2Jqcy5jIChDSURfR2x5cGhTbG90X0luaXQsCi0JQ0lEX1NpemVfR2V0X0dsb2JhbHNfRnVuY3MpOiBEaXR0by4KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfU2l6ZV9HZXRfR2xvYmFsc19GdW5jcywgVDFfR2x5cGhTbG90X0luaXQpOgotCURpdHRvLgotCSogc3JjL3BzaGludGVyL3BzaG1vZC5jIChwc2hpbnRlcl9pbnRlcmZhY2UpOiBVc2UgYHN0YXRpYyBjb25zdCcuCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9HZXRfTmV4dF9DaGFyKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9CdWlsZGVyX0Z1bmNzKTogUmVuYW1lZAotCXRvLi4uCi0JKFQxX0J1aWxkZXJfRnVuY3NSZWMpOiBUaGlzLgotCShUMV9CdWlsZGVyX0Z1bmNzKTogTmV3IHR5cGVkZWYuCi0JKFBTQXV4X0ludGVyZmFjZSk6IFJlbW92ZSBjb21waWxlciB3YXJuaW5ncy4KLQkqIHNyYy9wc2F1eC9wc2F1eG1vZC5jICh0MV9idWlsZGVyX2Z1bmNzKSwgc3JjL3BzYXV4L3Bzb2Jqcy5oCi0JKHQxX2J1aWxkZXJfZnVuY3MpOiBVcGRhdGVkLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoZ2xvYi5oIChQU0hfQmx1ZV9BbGlnbik6IFJlcGxhY2VkIHdpdGggLi4uCi0JKFBTSF9CTFVFX0FMSUdOX3tOT05FLFRPUCxCT1R9KTogTmV3IGRlZmluZXMuCi0JKFBTSF9BbGlnbm1lbnRSZWMpOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmggKEdFVF9DaGFyLCBHRVRfQnl0ZSk6IEZpeAotCXR5cG8uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmggKEZUX1N1YkdseXBoKTogRGl0dG8uCi0JKiBzcmMvYmFzZS9mdHN0cmVhbSAoRlRfR2V0X0NoYXIpOiBSZW5hbWUgdG8uLi4KLQkoRlRfU3RyZWFtX0dldF9DaGFyKTogVGhpcy4KLQotCSogc3JjL2Jhc2UvZnRuYW1lcy5jIChGVF9HZXRfU2ZudF9OYW1lKTogcy9pbmRleC9pZHgvIC0tIGBpbmRleCcgaXMKLQlhIGJ1aWx0LWluIGZ1bmN0aW9uIGluIGdjYywgY2F1c2luZyB3YXJuaW5nIG1lc3NhZ2VzIHdpdGggZ2NjIDMuMC4KLQkqIHNyYy9hdXRvaGludC9haGdseXBoLmMgKGFoX291dGxpbmVfbG9hZCk6IERpdHRvLgotCSogc3JjL2F1dG9oaW50L2FoZ2xvYmFsLmMgKGFoX2hpbnRlcl9jb21wdXRlX2JsdWVzKTogRGl0dG8uCi0JKiBzcmMvY2FjaGUvZnRjbWFuYWcuYyAoZnRjX2ZhbWlseV90YWJsZV9hbGxvYywKLQlmdGNfZmFtaWx5X3RhYmxlX2ZyZWUsIEZUQ19NYW5hZ2VyX0RvbmUsIEZUQ19NYW5hZ2VyX1JlZ2lzdGVyX0NhY2hlKToKLQlEaXR0by4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfbmV3X2luZGV4LCBjZmZfZG9uZV9pbmRleCwKLQljZmZfZXhwbGljaXRfaW5kZXgsIENGRl9BY2Nlc3NfRWxlbWVudCwgQ0ZGX0ZvcmdldF9FbGVtZW50LAotCUNGRl9HZXRfTmFtZSwgQ0ZGX0dldF9TdHJpbmcsIENGRl9Mb2FkX1N1YkZvbnQsIENGRl9Mb2FkX0ZvbnQsCi0JQ0ZGX0RvbmVfRm9udCk6IERpdHRvLgotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChQU19UYWJsZV9BZGQsIFBTX1BhcnNlcl9Mb2FkRmllbGQpOiBEaXR0by4KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jIChUMV9EZWNvZGVyX1BhcnNlX0NoYXJzdHJpbmdzKTogRGl0dG8uCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMgKHBzX21hc2tfdGVzdF9iaXQsIHBzX21hc2tfY2xlYXJfYml0LAotCXBzX21hc2tfc2V0X2JpdCwgcHNfZGltZW5zaW9uX2FkZF90MXN0ZW0sIHBzX2hpbnRzX3Qxc3RlbTMsCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzEuYyAocHNoMV9oaW50X3RhYmxlX3JlY29yZCwKLQlwc2gxX2hpbnRfdGFibGVfcmVjb3JkX21hc2ssIHBzaDFfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrKTogRGl0dG8uCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnbzIuYyAocHNoMl9oaW50X3RhYmxlX3JlY29yZCwKLQlwc2gyX2hpbnRfdGFibGVfcmVjb3JkX21hc2ssIHBzaDJfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrKTogRGl0dG8uCi0JKiBzcmMvc2ZudC90dHBvc3QuYyAoTG9hZF9Gb3JtYXRfMjAsIExvYWRfRm9ybWF0XzI1LAotCVRUX0dldF9QU19OYW1lKTogRGl0dG8uCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9HZXRfTWV0cmljcywgR2V0X0hNZXRyaWNzLAotCWxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBEaXR0by4KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2Vfc3VicnMsIFQxX09wZW5fRmFjZSk6IERpdHRvLgotCSogc3JjL3R5cGUxL3QxYWZtLmMgKFQxX0dldF9LZXJuaW5nKTogRGl0dG8uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y21hbmFnLmggKGZ0Y19mYW1pbHlfdGFibGVfZnJlZSk6IERpdHRvLgotCi0yMDAyLTAzLTA2ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KSwgc3JjL2NpZC9jaWRvYmpzLmMKLQkoQ0lEX0ZhY2VfSW5pdCk6IEZpeGVkIGFub3RoZXIgYnVnIHJlbGF0ZWQgdG8gdGhlCi0JYXNjZW5kZXIvZGVzY2VuZGVyL3RleHQgaGVpZ2h0IG9mIFBvc3RzY3JpcHQgZm9udHMuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMi5jIChwcmludF96b25lKTogUmVuYW1lZCB0byAuLi4KLQkocHNoMl9wcmludF96b25lKTogVGhpcy4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMS5jIChwcmludF96b25lKTogUmVuYW1lZCB0byAuLi4KLQkocHNoMV9wcmludF96b25lKTogVGhpcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oLCBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oLAotCXNyYy9iYXNlL2Z0b2Jqcy5jOiBBZGRpbmcgdGhlIG5ldyBGVF9MaWJyYXJ5X1ZlcnNpb24gQVBJIHRvIHJldHVybgotCXRoZSBsaWJyYXJ5J3MgY3VycmVudCB2ZXJzaW9uIGluIGR5bmFtaWMgbGlua3MuCi0JKiBzcmMvYmFzZS9mdGluaXQuYyAoRlRfSW5pdF9GcmVlVHlwZSk6IFVwZGF0ZWQuCi0KLTIwMDItMDMtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuaCAoUFNIX0RpbWVuc2lvblJlYyk6IHMvc3RkL3N0ZHcvLgotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2dsb2JhbF9zY2FsZV93aWR0aHMsCi0JcHNoX2RpbWVuc2lvbl9zbmFwX3dpZHRoLCBwc2hfZ2xvYmFsc19kZXN0cm95LCBwc2hfZ2xvYmFsc19uZXcpOgotCURpdHRvLgotCi0yMDAyLTAzLTA1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KSwgc3JjL2NmZi9jZmZvYmpzLmMKLQkoQ0ZGX0ZhY2VfSW5pdCksIHNyYy9jaWQvY2lkb2Jqcy5jIChDSURfRmFjZV9Jbml0KTogUmVtb3ZpbmcgdGhlIGJ1ZwotCXRoYXQgcmV0dXJuZWQgZ2xvYmFsIEJCb3ggdmFsdWVzIGluIDE2LjE2IGZpeGVkIGZvcm1hdCAoaW5zdGVhZCBvZgotCWludGVnZXIgZm9udCB1bml0cykuCi0KLQkqIHNyYy9jaWQvY2lkcml2ZXIuYyAoY2lkX2dldF9wb3N0c2NyaXB0X25hbWUpOiBGaXhlZCBhIGJ1ZyB0aGF0Ci0JY2F1c2VkIHRoZSBDSUQgZHJpdmVyIHRvIHJldHVybiBQb3N0c2NyaXB0IGZvbnQgbmFtZXMgd2l0aCBhIGxlYWRpbmcKLQlzbGFzaCAoYC8nKSBhcyBpbiBgL01PRUthaS1SZWd1bGFyJy4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKFRUX0xvYWRfTmFtZXMpLCBzcmMvc2ZudC9zZm9ianMuYyAoR2V0X05hbWUpLAotCXNyYy9zZm50L3NmZHJpdmVyLmMgKGdldF9zZm50X3Bvc3RzY3JpcHRfbmFtZSk6IEZpeGVkIHRoZSBsb2FkZXIgc28KLQl0aGF0IGl0IGFjY2VwdHMgYnJva2VuIGZvbnRzIGxpa2UgYGZveGp1bXAudHRmJywgd2hpY2ggbWFkZSBGcmVlVHlwZQotCWNyYXNoIHdoZW4gdHJ5aW5nIHRvIGxvYWQgdGhlbS4KLQotCUFsc28gaW1wcm92ZWQgdGhlIG5hbWUgdGFibGUgcGFyc2VyIHRvIGJlIGFibGUgdG8gbG9hZAotCVdpbmRvd3MtZW5jb2RlZCBlbnRyaWVzIGJlZm9yZSBNYWNpbnRvc2ggb3IgVW5pY29kZSBvbmVzLCBzaW5jZSBpdAotCXNlZW1zIHNvbWUgZm9udHMgZG9uJ3QgaGF2ZSByZWxpYWJsZSB2YWx1ZXMgaGVyZSBhbnl3YXkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNuYW1lcy5oOiBBZGQgdHlwZWRlZiBmb3IKLQlgUFNOYW1lc19TZXJ2aWNlJy4KLQotMjAwMi0wMy0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9hY2xvY2FsLm00LCBidWlsZHMvdW5peC9sdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sCi0JMS40LjIuCi0JQXBwbHkgYSBzbWFsbCBwYXRjaCBmb3IgQUlYIHRvIG1ha2Ugc2hhcmVkIGxpYnJhcmllcyB3b3JrICh0aGlzCi0JcGF0Y2ggaXMgYWxyZWFkeSBpbiB0aGUgQ1ZTIHZlcnNpb24gb2YgbGlidG9vbCkuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZy5zdWIsIGJ1aWxkcy91bml4L2NvbmZpZy5ndWVzczogVXBkYXRlZCB0bwotCXJlY2VudCB2ZXJzaW9ucy4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjOiBGaXggdHlwbwotCShBQ19DT05GSUdfRklMRS0+QUNfQ09ORklHX0ZJTEVTKS4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotMjAwMi0wMi0yOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y29uZmlnLmg6IENoYW5nZWQgYEZUX0xPQ0FMIHh4eHgnIHRvCi0JYEZUX0xPQ0FMKCB4eHh4ICknIGV2ZXJ5d2hlcmUgaW4gdGhlIHNvdXJjZS4gIFRoZSBzYW1lIGdvZXMgZm9yCi0JYEZUX0xPQ0FMX0RFRiB4eHh4JyB3aGljaCBpcyB0cmFuc2xhdGVkIHRvIGBGVF9MT0NBTF9ERUYoIHh4eHh4ICknLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX01JTk9SLCBGUkVFVFlQRV9QQVRDSCk6Ci0JQ2hhbmdpbmcgdmVyc2lvbiB0byAyLjEuMCB0byBpbmRpY2F0ZSBhbiB1bnN0YWJsZSBicmFuY2guCi0JQWRkZWQgdGhlIGRlY2xhcmF0aW9ucyBvZiBGVF9HZXRfRmlyc3RfQ2hhciBhbmQgRlRfR2V0X05leHRfQ2hhci4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEltcGxlbWVudCBGVF9HZXRfRmlyc3RfQ2hhciBhbmQKLQlGVF9HZXRfTmV4dF9DaGFyLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmg6IFJlbmFtaW5nIHN0cnVjdHVyZSB0eXBlcy4gIFRoaXMKLQotCSAgdHlwZWRlZiAgVDFfU3RydWN0XwotCSAgewotCSAgfSBUMV9TdHJ1Y3Q7Ci0KLQliZWNvbWVzCi0KLQkgIHR5cGVkZWYgIFBTX1N0cnVjdFJlY18KLQkgIHsKLQkgIH0gUFNfU3RydWN0UmVjLCAqUFNfU3RydWN0OwotCi0JICB0eXBlZGVmIFBTX1N0cnVjdFJlYyAgVDFfU3RydWN0OyAgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCi0JSGVuY2UsIHdlIGluY3JlYXNlIHRoZSBjb2hlcmVuY3kgb2YgdGhlIHNvdXJjZSBjb2RlIGJ5IGVmZmVjdGl2ZWx5Ci0JdXNpbmcgdGhlIGBSZWMnIHByZWZpeCBmb3Igc3RydWN0dXJlIHR5cGVzLgotCi0yMDAyLTAyLTI3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChUVF9Mb2FkX05hbWVzKTogU2ltcGxpZnlpbmcgYW5kIHNlY3VyaW5nIHRoZQotCW5hbWVzIHRhYmxlIGxvYWRlci4gIEludmFsaWQgaW5kaXZpZHVhbCBuYW1lIGVudHJpZXMgYXJlIG5vdyBoYW5kbGVkCi0JY29ycmVjdGx5LiAgVGhpcyBhbGxvd3MgdGhlIGxvYWRpbmcgb2YgdmVyeSBidWdneSBmb250cyBsaWtlCi0JYGZveGp1bXAudHRmJyB3aXRob3V0IGFsbG9jYXRpbmcgdG9ucyBvZiBtZW1vcnkgYW5kIGNhdXNpbmcgY3Jhc2hlcy4KLQotCSogc3JjL290bGF5b3V0L290bGNvbW1vbi5oLCBzcmMvb3RsYXlvdXQvb3RsY29tbW9uLmM6IEFkZGluZyAoc3RpbGwKLQlleHBlcmltZW50YWwpIGNvZGUgZm9yIE9wZW5UeXBlIExheW91dCB0YWJsZXMgdmFsaWRhdGlvbiBhbmQKLQlwYXJzaW5nLgotCi0JKiBzcmMvdHlwZTEvdDFjbWFwLmgsIHNyYy90eXBlMS90MWNtYXAuYzogQWRkaW5nIChzdGlsbAotCWV4cGVyaW1lbnRhbCkgY29kZSBmb3IgVHlwZSAxIGNoYXJtYXAgcHJvY2Vzc2luZy4KLQotCSogc3JjL3NmbnQvdHRjbWFwMC5jOiBOZXcgZmlsZS4gIEl0IGNvbnRhaW5zIGEgbmV3LCBzdGlsbAotCWV4cGVyaW1lbnRhbCBTRk5UIGNoYXJtYXAgcHJvY2Vzc2luZyBzdXBwb3J0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oOiBBZGRpbmcgdmFsaWRhdGlvbiBzdXBwb3J0IGFzCi0Jd2VsbCBhcyBpbnRlcm5hbCBjaGFybWFwIG9iamVjdCBkZWZpbml0aW9ucyAoRlRfQ01hcCAhPSBGVF9DaGFyTWFwKS4KLQotMjAwMi0wMi0yNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBSZW5hbWluZyBzdHJlYW0gZnVuY3Rpb25zIHRvIHRoZSBGVF88U3ViamVjdD5fPEFjdGlvbj4gc2NoZW1lOgotCi0JICBGVF9TZWVrX1N0cmVhbSAgICA9PiBGVF9TdHJlYW1fU2VlawotCSAgRlRfU2tpcF9TdHJlYW0gICAgPT4gRlRfU3RyZWFtX1NraXAKLQkgIEZUX1JlYWRfU3RyZWFtICAgID0+IEZUX1N0cmVhbV9SZWFkCi0JICBGVF9SZWFkX1N0cmVhbV9BdCA9PiBGVF9TdHJlYW1fUmVhZF9BdAotCSAgRlRfQWNjZXNzX0ZyYW1lICAgPT4gRlRfU3RyZWFtX0VudGVyX0ZyYW1lCi0JICBGVF9Gb3JnZXRfRnJhbWUgICA9PiBGVF9TdHJlYW1fRXhpdF9GcmFtZQotCSAgRlRfRXh0cmFjdF9GcmFtZSAgPT4gRlRfU3RyZWFtX0V4dHJhY3RfRnJhbWUKLQkgIEZUX1JlbGVhc2VfRnJhbWUgID0+IEZUX1N0cmVhbV9SZWxlYXNlX0ZyYW1lCi0JICBGVF9HZXRfWFhYWCAgICAgICA9PiBGVF9TdHJlYW1fR2V0X1hYWFgKLQkgIEZUX1JlYWRfWFhYWCAgICAgID0+IEZUX1N0cmVhbV9SZWFkX1hYWFgKLQotCSAgRlRfTmV3X1N0cmVhbSggZmlsZW5hbWUsIHN0cmVhbSApID0+Ci0JICAgIEZUX1N0cmVhbV9PcGVuKCBzdHJlYW0sIGZpbGVuYW1lICkKLQotCSAgICAoVGhlIGZ1bmN0aW9uIGRvZXNuJ3QgY3JlYXRlIHRoZSBGVF9TdHJlYW0gc3RydWN0dXJlLCBpdCBzaW1wbHkKLQkgICAgaW5pdGlhbGl6ZXMgaXQgZm9yIHJlYWRpbmcuKQotCi0JICBGVF9OZXdfTWVtb3J5X1N0cmVhbSggbGlicmFyeSwgRlRfQnl0ZSogIGJhc2UsIHNpemUsIHN0cmVhbSApID0+Ci0JICAgIEZUX1N0cmVhbV9PcGVuX01lbW9yeSggc3RyZWFtLCBjb25zdCBGVF9CeXRlKiBiYXNlLCBzaXplICkKLQotCSAgRlRfRG9uZV9TdHJlYW0gID0+IEZUX1N0cmVhbV9DbG9zZQotCSAgRlRfU3RyZWFtX0lPICAgID0+IEZUX1N0cmVhbV9JT0Z1bmMKLQkgIEZUX1N0cmVhbV9DbG9zZSA9PiBGVF9TdHJlYW1fQ2xvc2VGdW5jCi0KLQkgIGZ0X2Nsb3NlX3N0cmVhbSA9PiBmdF9hbnNpX3N0cmVhbV9jbG9zZSAoaW4gYmFzZS9mdHN5c3RlbS5jIG9ubHkpCi0JICBmdF9pb19zdHJlYW0gICAgPT4gZnRfYW5zaV9zdHJlYW1faW8gICAgKGluIGJhc2UvZnRzeXN0ZW0uYyBvbmx5KQotCi0JKiBzcmMvYmFzZS9mdHV0aWwuYzogTmV3IGZpbGUuICBDb250YWlucyBhbGwgbWVtb3J5IGFuZCBsaXN0Ci0JbWFuYWdlbWVudCBjb2RlIChwcmV2aW91c2x5IGluIGBmdG9ianMuYycgYW5kIGBmdGxpc3QuYycsCi0JcmVzcGVjdGl2ZWx5KS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaDogTW92aW5nIGFsbCBjb2RlIHJlbGF0ZWQgdG8KLQlnbHlwaCBsb2FkZXJzIHRvIC4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oOiBUaGlzIG5ldyBmaWxlLgotCWBGVF9HbHlwaExvYWRlcicgaXMgbm93IGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlCi0JYEZUX0dseXBoTG9hZGVyUmVjJy4KLQkoZnRfZ2x5cGhfb3duX2JpdG1hcCk6IFJlbmFtZWQgdG8gLi4uCi0JKEZUX0dMWVBIX09XTl9CSVRNQVApOiBUaGlzLgotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IE1vdmluZyBhbGwgY29kZSByZWxhdGVkIHRvIGdseXBoIGxvYWRlcnMKLQl0byAuLi4KLQkqIHNyYy9iYXNlL2Z0Z2xvYWRyLmM6IFRoaXMgbmV3IGZpbGUuCi0KLTIwMDItMDItMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmggKEZUX1RyYWNlKTogUmVtb3ZlIGNvbW1hIGluCi0JZW51bSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQotMjAwMi0wMi0yMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JTW9kaWZpZWQgdGhlIGRlYnVnIHN1Yi1zeXN0ZW0gaW5pdGlhbGl6YXRpb24uICBUcmFjZSBsZXZlbHMgY2FuIG5vdwotCWJlIHNwZWNpZmllZCB3aXRoaW4gdGhlIGBGVDJfREVCVUcnIGVudmlyb25tZW50IHZhcmlhYmxlLiAgU2VlIHRoZQotCWNvbW1lbnRzIHdpdGhpbiBgZnRkZWJ1Zy5jJyBmb3IgbW9yZSBkZXRhaWxzLgotCi0JKiBzcmMvYmFzZS9mdGRlYnVnLmM6IChGVF9TZXRUcmFjZUxldmVsKTogUmVtb3ZlZC4KLQkoZnRfZGVidWdfaW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoZnRfZGVidWdfZHVtbXkpOiBSZW1vdmVkLgotCVVwZGF0ZWQgdG8gY2hhbmdlcyBpbiBmdGRlYnVnLmgKLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg6IEFsd2F5cyBkZWZpbmUKLQlGVF9ERUJVR19MRVZFTF9FUlJPUiBpZiBGVF9ERUJVR19MRVZFTF9UUkFDRSBpcyBkZWZpbmVkLgotCShGVF9Bc3NlcnQpOiBSZW5hbWVkIHRvIC4uLgotCShGVF9BU1NFUlQpOiBUaGlzLgotCVNvbWUgc3R1ZmYgZnJvbSBmdGRlYnVnLmggaGFzIGJlZW4gbW92ZWQgdG8gLi4uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBOZXcgZmlsZSwgdG8gZGVmaW5lIHRoZSB0cmFjZQotCWxldmVscyB1c2VkIGZvciBkZWJ1Z2dpbmcuICBJdCBpcyB1c2VkIGJvdGggdG8gZGVmaW5lIGVudW1zIGFuZAotCXRvZ2dsZSBuYW1lcyBmb3IgRlQyX0RFQlVHLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jLCBzcmMvYmFzZS9mdHN0cmVhbS5jOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZXh0ZW5kLmgsIHNyYy9iYXNlL2Z0ZXh0ZW5kLmM6Ci0JUmVtb3ZlZC4gIEJvdGggZmlsZXMgYXJlIG5vdyBjb21wbGV0ZWx5IG9ic29sZXRlLgotCSogc3JjL2Jhc2UvSmFtZmlsZSwgc3JjL2Jhc2UvcnVsZXMubWs6IFVwZGF0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaDogQWRkaW5nIGAjdW5kZWYgRlRfRVJSX0NBVCcgYW5kCi0JYCN1bmRlZiBGVF9FUlJfWENBVCcgdG8gYXZvaWQgd2FybmluZ3Mgd2l0aCBjZXJ0YWluIGNvbXBpbGVycyAobGlrZQotCUxDQykuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMi5jIChwcmludF96b25lKTogUmVuYW1lZCB0byAuLi4KLQkocHNoMl9wcmludF96b25lKTogVGhpcyB0byBhdm9pZCBlcnJvcnMgZHVyaW5nIGNvbXBpbGF0aW9uIG9mIGRlYnVnCi0JbGlicmFyeS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKEZUX0NPTVBPTkVOVCk6IENoYW5nZSBkZWZpbml0aW9uIHRvIGFzCi0JYHRyYWNlX3Ntb290aCcuCi0KLTIwMDItMDItMjAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogUkVBRE1FOiBBZGRpbmcgYGRldmVsQGZyZWV0eXBlLm9yZycgYWRkcmVzcyBmb3IgYnVnIHJlcG9ydHMuCi0KLTIwMDItMDItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5tayAoY2hlY2spOiBOZXcgZHVtbXkgdGFyZ2V0LgotCSguUEhPTlkpOiBBZGQgaXQuCi0KLTIwMDItMDItMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChGVF9DRkxBR1MpOiBVc2UgJChJTkNMVURFX0ZMQUdTKSBmaXJzdC4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKGZ0Y19jYWNoZV9yZXNpemUpOiBNYXJrIGBlcnJvcicgYXMgdW51c2VkCi0JdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChDRkZfR2V0X1N0cmluZyk6IERpdHRvLgotCSogc3JjL2NmZi9jZmZvYmpzLmMgKENGRl9TdHJDb3B5KTogRGl0dG8uCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKFBTX1RhYmxlX0RvbmUpOiBEaXR0by4KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2Zfc2Vla190b190YWJsZV90eXBlKTogRGl0dG8uCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChnZXRfc2ZudF9wb3N0c2NyaXB0X25hbWUpOiBEaXR0by4KLQkocGNmX2dldF9iaXRtYXBzKTogVGhlIHNhbWUgZm9yIGBzaXplYml0bWFwcycuCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAoVDFfRGVjb2Rlcl9QYXJzZV9DaGFyc3RyaW5ncyk6IFRoZSBzYW1lIGZvcgotCWBvcmlnX3knLgotCSh0MW9wZXJhdG9yX3NlYWMpOiBDb21tZW50IG91dCBtb3JlIGRlYWQgY29kZS4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMi5jIChwczJfaGludHNfYXBwbHkpOiBBZGQgYERFQlVHX0hJTlRFUicKLQljb25kaXRpb25hbC4KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoLAotCWxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBBZGQgYFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVInCi0JY29uZGl0aW9uYWwuCi0KLTIwMDItMDItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYyAoYWhfb3V0bGluZV9saW5rX3NlZ21lbnRzKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlcy4KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYyAoYWhfYWxpZ25fc2VyaWZfZWRnZSk6IFVzZSBGVF9VTlVTRUQgaW5zdGVhZAotCW9mIFVOVVNFRC4KLQkqIHNyYy9hdXRvaGludC9haG1vZHVsZS5jIChmdF9hdXRvaGludGVyX3Jlc2V0KTogRGl0dG8uCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMgKHBzX21hc2tfdGFibGVfbWVyZ2UpOiBGaXggdHlwbyBpbiB2YXJpYWJsZQotCXN3YXBwaW5nIGNvZGUuCi0JKiBzcmMvcHNoaW50ZXIvcHNoZ2xvYi5oIChQU0hfQmx1ZV9BbGlnbik6IEFkZCBQU0hfQkxVRV9BTElHTl9OT05FLgotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2JsdWVzX3NuYXBfc3RlbSk6IFVzZSBpdC4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMS5jIChwc2gxX2hpbnRfdGFibGVfb3B0aW1pemUpOiBEaXR0by4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvMi5jIChwc2gyX2hpbnRfYWxpZ24pOiBEaXR0by4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKFVOVVNFRCk6IFJlbW92ZWQuCi0KLTIwMDItMDItMTAgIFJvYmVydG8gQWxhbWVkYSAgPG9qYW5jYW5vQGdlZWttYWlsLmRlPgotCi0JQWRkIHN1cHBvcnQgZm9yIElTT0xhdGluMSBQUyBlbmNvZGluZy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChmdF9lbmNvZGluZ19sYXRpbl8xKTogTmV3IHRhZwotCShgbGF0MScpLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggKFQxX0VuY29kaW5nX1R5cGUpOiBBZGQKLQlgdDFfZW5jb2RpbmdfaXNvbGF0aW4xJy4KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jIChHZXRfQ2hhcl9JbmRleCwgR2V0X05leHRfQ2hhcik6IEhhbmRsZQotCWZ0X2VuY29kaW5nX2xhdGluXzEuCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2VuY29kaW5nKTogSGFuZGxlIGBJU09MYXRpbjFFbmNvZGluZycuCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX0ZhY2VfSW5pdCk6IEhhbmRsZSBgdDFfZW5jb2RpbmdfaXNvbGF0aW4xJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAwMi0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi1hbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi1MSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLWZ1bGx5LgotCi0KLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLWNvZGluZzogdXRmLTgKLUVuZDoKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yMiBiL0NoYW5nZUxvZy4yMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhZWM3NC4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cuMjIKKysrIC9kZXYvbnVsbApAQCAtMSwyODM3ICswLDAgQEAKLTIwMDYtMDUtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCi0JKiBWZXJzaW9uIDIuMi4xIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMi0xJy4KLQotMjAwNi0wNS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvc291cmNlcy5weSAocmVfc291cmNlX2tleXdvcmRzKTogQWRkIHdvcmQKLQlib3VuZGFyeSBtYXJrZXJzLgotCSogc3JjL3Rvb2xzL2RvY21ha2VyL2NvbnRlbnQucHkgKHJlX2ZpZWxkKTogQWxsb3cgYC4nIGluIGZpZWxkIG5hbWVzCi0JKGJ1dCBub3QgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQpLgotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAoaHRtbF9oZWFkZXJfMSk6IFVzZSBgdXRmLTgnIGNoYXJzZXQuCi0JKGJsb2NrX2Zvb3Rlcik6IFNwbGl0IGludG8uLi4KLQkoYmxvY2tfZm9vdGVyX3N0YXJ0LCBibG9ja19mb290ZXJfbWlkZGxlLCBibG9ja19mb290ZXJfZW5kKTogVGhpcyB0bwotCWFkZCBuYXZpZ2F0aW9uIGJ1dHRvbnMuCi0JKEh0bWxGb3JtYXR0ZXI6OmJsb2NrX2V4aXQpOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlLyo6IE1hbnkgbWlub3IgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgKGFkZGluZwotCWxpbmtzLCBzcGVsbGluZyBlcnJvcnMsIGV0Yy4pLgotCi0yMDA2LTA1LTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFJFQURNRTogTWlub3IgdXBkYXRlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS8qOiBzL3NjYWxlL3NjYWxpbmcgdmFsdWUvIHdoZXJlIGFwcHJvcHJpYXRlLgotCU1hbnkgb3RoZXIgbWlub3IgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci9zb3VyY2VzLnB5IChyZV9pdGFsaWMsIHJlX2JvbGQpOiBIYW5kbGUKLQl0cmFpbGluZyBwdW5jdHVhdGlvbi4KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkgKEh0bWxGb3JtYXR0ZXI6Om1ha2VfaHRtbF93b3JkKTogQWRkCi0Jd2FybmluZyBtZXNzYWdlIGZvciB1bmRlZmluZWQgY3Jvc3MgcmVmZXJlbmNlcy4KLQlVcGRhdGUgaGFuZGxpbmcgb2YgcmVfaXRhbGljIGFuZCByZV9ib2xkLgotCi0yMDA2LTA1LTExICBNYXNhdGFrZSBZQU1BVE8gIDxqZXRAZ3l2ZS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0c3lzdGVtLmMgKEZUX1N0cmVhbV9PcGVuKTogQ2hlY2sgZXJybm8gb25seSBpZgotCXJlYWQgc3lzdGVtIGNhbGwgcmV0dXJucyAtMS4KLQlSZW1vdmUgYSByZWR1bmRhbnQgcGFyZW50aGVzaXMuCi0KLTIwMDYtMDUtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYyAoRlRfU3RyZWFtX09wZW4pOiBBdm9pZCBpbmZpbml0ZSBsb29wIGlmCi0JZ2l2ZW4gYW4gZW1wdHksIHVuLW1tYXAoKWFibGUgZmlsZS4gIFJlcG9ydGVkIGFuZCBzdWdnZXN0ZWQgZml4IGluCi0JU2F2YW5uYWggYnVnICMxNjU1NS4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChyZWZkb2MpOiBXcml0ZS1wcm90ZWN0IHRoZSBgZG9jbWFrZXInCi0JZGlyZWN0b3J5IHRvIHN1cHByZXNzIGdlbmVyYXRpb24gb2YgLnB5YyBmaWxlcy4gIEFjY29yZGluZyB0byB0aGUKLQlQeXRob24gZG9jcyB0aGVyZSBpc24ndCBhIG1vcmUgZWxlZ2FudCBzb2x1dGlvbiAoY3VycmVudGx5KS4KLQotCSogYnVpbGRzL3RvcGxldmVsLm1rIChkaXN0KTogTmV3IHRhcmdldCB3aGljaCBidWlsZHMgLnRhci5neiwKLQkudGFyLmJ6MiwgYW5kIC56aXAgZmlsZXMuICBOb3RlIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGlzIHN0aWxsCi0JaGFyZC1jb2RlZC4KLQkoZG8tZGlzdCk6IFN1Yi10YXJnZXQgb2YgYGRpc3QnLgotCShDT05GSUdfR1VFU1MsIENPTkZJR19TVUIpOiBOZXcgdmFyaWFibGVzLgotCSguUEhPTlkpOiBVcGRhdGVkLgotCi0yMDA2LTA1LTA5ICBSYWplZXYgUGFodWphICA8cnBhaHVqYUBlc3JpLmNvbT4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuc2xuLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvajogVXBncmFkZWQgdG8gVlMuTkVUIDIwMDUgZnJvbQotCVZTLk5FVCAyMDAzCi0JQWRkZWQgZmlsZXMgZnRiYm94LmMsIGZ0dHlwZTEuYywgZnR3aW5mbnQuYywgZnRzeW50aC5jLgotCi0JKiBidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sOiBVcGRhdGVkLgotCi0yMDA2LTA1LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlQdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbnRvIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgUmVwb3J0ZWQgYnkgUGF1bAotCVdhdHNvbiA8cHdhdHNvbkByZWRsaW5lcHkuY29tPi4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjOiBSZW5hbWVkIHRvLi4uCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBUaGlzIHdoaWNoIG5vdyBzZXJ2ZXMgKHdpdGggYXBwcm9wcmlhdGUKLQltb2RpZmljYXRpb25zKSBhcyBhIHRlbXBsYXRlIGZvciBjb25maWd1cmUuYWMuCi0KLQkqIHZlcnNpb24uc2VkOiBOZXcgc2NyaXB0LgotCi0JKiBhdXRvZ2VuLnNoOiBHZW5lcmF0ZSBjb25maWd1cmUuYWMgZnJvbSBjb25maWd1cmUucmF3LCB1c2luZwotCUZSRUVUWVBFX01BSk9SLCBGUkVFVFlQRV9NSU5PUiwgYW5kIEZSRUVUWVBFX1BBVENIIGZyb20gZnJlZXR5cGUuaC4KLQotMjAwNi0wNS0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDEuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5hYyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDk6MTA6My4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvZnJlZXR5cGUubWsgKHJlZmRvYyksCi0JSmFtZmlsZSAoUmVmRG9jKSwgUkVBRE1FOiBzLzIyMC8yMjEvLCBzLzIuMi4wLzIuMi4xLy4KLQlNaW5vciB1cGRhdGVzLgotCi0JKiBkb2NzL0NIQU5HRVMsIGRvY3MvVkVSU0lPTi5ETEwsIGRvY3MvUFJPQkxFTVMsIFJFQURNRS5DVlM6Ci0JVXBkYXRlZC4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC1zaDogVXBkYXRlZCBmcm9tIGB0ZXhpbmZvJyBDVlMgbW9kdWxlIGF0Ci0Jc2F2YW5uYWguZ251Lm9yZy4KLQotCSogZGV2ZWwvZnRvcHRpb24uaDogU3luY2hyb25pemUgd2l0aAotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmguCi0KLTIwMDYtMDUtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2x6dy9mdGx6dzIuYzogUmVuYW1lZCB0by4uLgotCSogc3JjL2x6dy9mdGx6dy5jOiBUaGlzLgotCi0JKiBzcmMvbHp3L0phbWZpbGUsIHNyYy9sencvcnVsZXMubWs6IFVwZGF0ZWQuCi0KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19jZm0ubWFrZS50eHQsCi0JYnVpbGRzL21hYy9GcmVlVHlwZS5tNjhrX2Zhci5tYWtlLnR4dCwKLQlidWlsZHMvbWFjL0ZyZWVUeXBlLnBwY19jYXJib24ubWFrZS50eHQsCi0JYnVpbGRzL21hYy9GcmVlVHlwZS5wcGNfY2xhc3NpYy5tYWtlLnR4dDogVXBkYXRlZC4KLQotMjAwNi0wNS0wMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JQWxsb3cgY29tcGlsYXRpb24gYWdhaW4gd2l0aCBDKysgY29tcGlsZXJzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmggKEZUX0FTU0lHTlAsCi0JRlRfQVNTSUdOUF9JTk5FUik6IE5ldyBtYWNyb3Mgd2hpY2ggZG8gdGhlIGFjdHVhbCBhc3NpZ25tZW50LCBhbmQKLQl3aGljaCBleGlzdCBpbiB0d28gdmFyaWFudHMgKGZvciBDIGFuZCBDKyspLgotCVVwZGF0ZSBjYWxsZXJzIGFjY29yZGluZ2x5LgotCi0yMDA2LTA1LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmggKEZUX1NUUklDVF9BTElBU0lORyk6IFJlbW92ZWQuCi0KLTIwMDYtMDUtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oOiBzL25ldy9uZXdzei8gKGZvciBDKyspLgotCShGVF9BTExPQyk6IFJlbW92ZSByZWR1bmRhbnQgcmVkZWZpbml0aW9uLgotCi0JKiBidWlsZHMvY29tcGlsZXIvZ2NjLWRldi5tayAoQ0ZMQUdTKSBbZysrXTogRG9uJ3QgdXNlCi0JYC1Xc3RyaWN0LXByb3RvdHlwZXMnLgotCi0JKiBzcmMvYmFzZS9mdHN0cmVhbS5jIChGVF9TdHJlYW1fRW50ZXJGcmFtZSk6IEFkZCBjYXN0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIChGVF9CQVNFX0RFRikgW19fY3BsdXNwbHVzXToKLQlSZW1vdmUgYGV4dGVybicuCi0KLTIwMDYtMDUtMDIgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCVVwZGF0ZSB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdG8gc2FmZWx5IGRlYWwKLQl3aXRoIGFycmF5IHNpemUgYnVmZmVyIG92ZXJmbG93cy4gIFRoaXMgY29ycmVzcG9uZHMgdG8gYXR0ZW1wdHMgdG8KLQlhbGxvY2F0ZSBhcnJheXMgdGhhdCBhcmUgdG9vIGxhcmdlLiAgRm9yIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZQotCWZvbGxvd2luZyBjb2RlOgotCi0JICBjb3VudCA9IHJlYWRfdWludDMyX2Zyb21fZmlsZSgpOyBhcnJheSA9IG1hbGxvYyggc2l6ZW9mICggSXRlbSApICoKLQkgIGNvdW50ICk7IGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCi0JICAgIGFycmF5W25uXSA9IHJlYWRfaXRlbV9mcm9tX2ZpbGUoKTsKLQotCUlmIGBjb3VudCcgaXMgbGFyZ2VyIHRoYW4gYEZUX1VJTlRfTUFYL3NpemVvZihJdGVtKScsIHRoZQotCW11bHRpcGxpY2F0aW9uIG92ZXJmbG93cywgYW5kIHRoZSBhcnJheSBhbGxvY2F0ZWQgb3Mgc21hbGxlciB0aGFuCi0JdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBmaWxlLiAgSW4gdGhpcyBjYXNlLCB0aGUgaGVhcCB3aWxsIGJlCi0JdHJhc2hlZCwgYW5kIHRoaXMgY2FuIGJlIHVzZWQgYXMgYSBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2ssIG9yIG1ha2UKLQl0aGUgZW5naW5lIGNyYXNoIGxhdGVyLgotCi0JVGhlIEZUX0FSUkFZX05FVyBhbmQgRlRfQVJSQVlfUkVORVcgbWFjcm9zIG5vdyBlbnN1cmUgdGhhdCB0aGUgbmV3Ci0JY291bnQgaXMgbm8gbGFyZ2VyIHRoYW4gYEZUX0lOVF9NQVgvaXRlbV9zaXplJywgb3RoZXJ3aXNlIGEgbmV3Ci0JZXJyb3IgY29kZSBgRlRfRXJyX0FycmF5X1Rvb19MYXJnZScgd2lsbCBiZSByZXR1cm5lZC4KLQotCU5vdGUgdGhhdCB0aGUgbWVtb3J5IGRlYnVnZ2VyIG5vdyB3b3JrcyBhZ2FpbiB3aGVuIEZUX0RFQlVHX01FTU9SWQotCWlzIGRlZmluZWQuICBGVF9TVFJJQ1RfQUxJQVNJTkcgaGFzIGRpc2FwcGVhcmVkOyB0aGUgY29ycmVzcG9uZGluZwotCWNvZGUgaXMgbm93IHRoZSBkZWZhdWx0LgotCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmggKEZUX0JBU0VfREVGKSBbIV9fY3BsdXNwbHVzXToKLQlEb24ndCB1c2UgYGV4dGVybicuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaCAoRlRfRXJyX0FycmF5X1Rvb19MYXJnZSk6IE5ldyBlcnJvcgotCWNvZGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCAoRlRfREVCVUdfSU5ORVIpCi0JW0ZUX0RFQlVHX01FTU9SWV06IE5ldyBtYWNyby4KLQkoZnRfbWVtX3JlYWxsb2MsIGZ0X21lbV9xcmVhbGxvYyk6IFBhc3MgbmV3IG9iamVjdCBzaXplIGNvdW50IGFsc28uCi0JKGZ0X21lbV9hbGxvY19kZWJ1ZywgZnRfbWVtX3FhbGxvY19kZWJ1ZywgZnRfbWVtX3JlYWxsb2NfZGVidWcsCi0JZnRfbWVtX3FyZWFsbG9jX2RlYnVnLCBmdF9tZW1fZnJlZV9kZWJ1Zyk6IFJlbW92ZWQuCi0JKEZUX01FTV9BTExPQywgRlRfTUVNX1JFQUxMT0MsIEZUX01FTV9RQUxMT0MsIEZUX01FTV9RUkVBTExPQywKLQlGVF9NRU1fRlJFRSk6IFJlZGVmaW5lLgotCShGVF9NRU1fTkVXX0FSUkFZLCBGVF9NRU1fUkVORVdfQVJSQVksIEZUX01FTV9RTkVXX0FSUkFZLAotCUZUX01FTV9RUkVORVdfQVJSQVkpOiBSZWRlZmluZS4KLQkoRlRfQUxMT0NfTVVMVCwgRlRfUkVBTExPQ19NVUxULCBGVF9NRU1fUUFMTE9DX01VTFQsCi0JRlRfTUVNX1FSRUFMTE9DX01VTFQpOiBOZXcgbWFjcm9zLiAgVXBkYXRlIGNhbGxlcnMgd2hlcmUKLQlhcHByb3ByaWF0ZS4KLQkoRlRfTUVNX1NFVF9FUlJPUik6IFNsaWdodGx5IHJlZGVmaW5lLgotCi0KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKF9mdF9kZWJ1Z19maWxlLCBfZnRfZGVidWdfbGluZW5vKQotCVtGVF9ERUJVR19NRU1PUlldOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcywgcmVwbGFjaW5nLi4uCi0JKEZUX01lbVRhYmxlUmVjKSBbRlRfREVCVUdfTUVNT1JZXTogUmVtb3ZlIGBmaWxlbmFtZScgYW5kCi0JYGxpbmVfbm8nLiAgVXBkYXRlIGFsbCBjYWxsZXJzLgotCShmdF9tZW1fZGVidWdfYWxsb2MpIFtGVF9ERUJVR19NRU1PUlldOiBBdm9pZCBwb3NzaWJsZSBpbnRlZ2VyCi0Jb3ZlcmZsb3cuCi0JKGZ0X21lbV9hbGxvY19kZWJ1ZywgZnRfbWVtX3JlYWxsb2NfZGVidWcsIGZ0X21lbV9xYWxsb2NfZGVidWcsCi0JZnRfbWVtX3FyZWFsbG9jX2RlYnVnLCBmdF9tZW1fZnJlZV9kZWJ1Zyk6IFJlbW92ZWQuCi0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKHJlYWRfbHdmbik6IENhdGNoIGludGVnZXIgb3ZlcmZsb3cuCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX2hmc3BsdXMpOiBEaXR0by4KLQkqIHNyYy9iYXNlL2Z0dXRpbC5jOiBSZW1vdmUgc3BlY2lhbCBjb2RlIGZvciBGVF9TVFJJQ1RfQUxJQVNJTkcuCi0JKGZ0X21lbV9hbGxvYywgZnRfbWVtX3JlYWxsb2MsIGZ0X21lbV9xcmVhbGxvYyk6IFJld3JpdGUuCi0KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHN0cmVhbS5oIChGVF9GUkFNRV9FTlRFUiwgRlRfRlJBTUVfRVhJVCwKLQlGVF9GUkFNRV9FWFRSQUNULCBGVF9GUkFNRV9SRUxFQVNFKTogVXNlIEZUX0RFQlVHX0lOTkVSIHRvIHJlcG9ydCB0aGUKLQlwbGFjZSB3aGVyZSB0aGUgZnJhbWVzIHdlcmUgZW50ZXJlZCwgZXh0cmFjdGVkLCBleGl0ZWQgb3IgcmVsZWFzZWQKLQlpbiB0aGUgbWVtb3J5IGRlYnVnZ2VyLgotCi0JKiBzcmMvYmFzZS9mdHN0cmVhbS5jIChGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKSBbRlRfREVCVUdfTUVNT1JZXToKLQlDYWxsIGZ0X21lbV9mcmVlLgotCShGVF9TdHJlYW1fRW50ZXJGcmFtZSkgW0ZUX0RFQlVHX01FTU9SWV06IFVzZSBmdF9tZW1fcWFsbG9jLgotCShGVF9TdHJlYW1fRXhpdEZyYW1lKSBbRlRfREVCVUdfTUVNT1JZXTogVXNlIGZ0X21lbV9mcmVlLgotCi0yMDA2LTA0LTMwICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoTWFjX1JlYWRfUE9TVF9SZXNvdXJjZSk6IENvcnJlY3QgcGZiX3BvcwotCWluaXRpYWxpemF0aW9uLCByZW1vdmUgZXh0cmEgY2FzdCB0byBjb3B5IHRvIHBmYl9sZW5wb3MuICBUaGlzIGZpeGVzCi0JcGFyc2luZyBvZiBQRkIgZm9udHMgd2l0aCBNYWNPUyByZXNvdXJjZSBmb3JrIChidWcgaW50cm9kdWNlZAotCTIwMDMtMDktMTEpLiAgUGF0Y2ggcHJvdmlkZWQgYnkgSHVpYi1KYW4gSW1iZW5zIDxmdEBpbWJlbnMubmw+LgotCi0yMDA2LTA0LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGdXJ0aGVyIEMgbGlicmFyeSBhYnN0cmFjdGlvbi4gIEJhc2VkIG9uIGEgcGF0Y2ggZnJvbQotCW1zbjJAYmlkeXV0LmNvbS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCAoRlRfQ0hBUl9CSVQsIEZUX0ZJTEUsCi0JZnRfZm9wZW4sIGZ0X2ZjbG9zZSwgZnRfZnNlZWssIGZ0X2Z0ZWxsLCBmdF9mcmVhZCwgZnRfc21hbGxvYywKLQlmdF9zY2FsbG9jLCBmdF9zcmVhbGxvYywgZnRfc2ZyZWUsIGZ0X2xhYnMpOiBOZXcgd3JhcHBlciBtYWNyb3MgZm9yCi0JQyBsaWJyYXJ5IGZ1bmN0aW9ucy4gIFVwZGF0ZSBhbGwgdXNlcnMgYWNjb3JkaW5nbHkgKGFuZCBjYXRjaCBzb21lCi0Jb3RoZXIgcGxhY2VzIHdoZXJlIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb24gd2FzIHVzZWQgaW5zdGVhZCBvZiB0aGUKLQl3cmFwcGVyIGZ1bmN0aW9ucykuCi0KLQkqIHNyYy9iYXNlL2Z0c3lzdGVtLmM6IERvbid0IGluY2x1ZGUgc3RkaW8uaCBhbmQgc3RkbGliLmguCi0JKiBzcmMvZ3ppcC96dXRpbC5oIFtNU0RPUyAmJiAhKF9fVFVSQk9DX18gfHwgX19CT1JMQU5EQ19fKV06IERvbid0Ci0JaW5jbHVkZSBtYWxsb2MuaC4KLQotCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbiAoZGF0YXJvb3RkaXIpOiBEZWZpbmUsIGZvciBhdXRvY29uZiAyLjU5YwotCWFuZCBmb3J0aGNvbWluZyB2ZXJzaW9ucy4KLQotMjAwNi0wNC0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvbHp3L2Z0bHp3LmMsIHNyYy9sencvem9wZW4uYywgc3JjL2x6dy96b3Blbi5oOiBSZW1vdmVkLAotCW9ic29sZXRlLgotCi0yMDA2LTA0LTI3ICB5aSBsdW8gIDxsdW95aS5seUBnbWFpbC5jb20+Ci0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvajogVXBkYXRlZC4KLQotMjAwNi0wNC0yNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4yIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTItMCcuCi0KLTIwMDYtMDQtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChzaGlmdF9lbGVtZW50cyk6IERvbid0IHVzZSBGVF9Mb25nIGJ1dAotCUZUX1B0ckRpc3QgZm9yIGBkZWx0YScuICBSZXBvcnRlZCBieSBDw6lsaW5lIFBJTExFVAotCTxDZWxpbmUuUGlsbGV0QFRhZ2dpbmZvLmNvbT4uCi0KLTIwMDYtMDQtMjEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGluY3JlbS5oOiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMuCi0JKEZUX0luY3JlbWVudGFsX0ludGVyZmFjZSk6IE5ldyB0eXBlZGVmLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmgsIGluY2x1ZGUvZnJlZXR5cGUvZnRnbHlwaC5oOgotCURvY3VtZW50YXRpb24gdXBkYXRlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiBEb2N1bWVudGF0aW9uIHVwZGF0ZS4KLQkoRlRfSEFTX0ZBU1RfR0xZUEhTKTogQWx3YXlzIHNldCB0byAwLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlLmgsIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKEZUX1N0cm9rZXJfTmV3KToKLQlUYWtlIGFuIEZUX0xpYnJhcnkgYXJndW1lbnQgaW5zdGVhZCBvZiBGVF9NZW1vcnkuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jOiBSZW1vdmUgY29tcGlsZXIgd2FybmluZ3MgKGdjYy00LjAuMikuCi0KLTIwMDYtMDQtMTMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2luaXQsIGFmX2xvYWRlcl9sb2FkX2cpOiBSZW1vdmUKLQlzdXBlcmZsdW91cyBjb2RlIGluIHRoZSBhdXRvLWZpdHRlcidzIGxvYWRlci4KLQotMjAwNi0wNC0wNSAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZSwgYnVpbGRzL2FtaWdhL21ha2VmaWxlLm9zNCwKLQlidWlsZHMvYW1pZ2Evc21ha2VmaWxlOiBBZGRlZCBGVDJfQlVJTERfTElCUkFSWSBkZWZpbmUuCi0KLTIwMDYtMDQtMDMgIGx1b3lpICA8bHVveWkubHlAZ21haWwuY29tPgotCi0JKiBidWlsZHMvY29tcGlsZXIvaW50ZWxjLm1rIChURSk6IE5ldyB2YXJpYWJsZS4KLQkoQU5TSUZMQUdTKTogVXBkYXRlZC4KLQotMjAwNi0wNC0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvZXhwb3J0cy5tayAoY2xlYW5fc3ltYm9sc19saXN0LCBjbGVhbl9hcGluYW1lcyk6IFJlbW92ZWQuCi0JKENMRUFOKTogQWRkICQoRVhQT1JUU19MSVNUKSBhbmQgJChBUElOQU1FU19FWEUpLgotCSguUEhPTlkpOiBVcGRhdGVkLgotCi0JKiBjb25maWd1cmUuYWM6IE1pbm9yIGZpeGVzIHRvIGltcHJvdmUgLS1oZWxwIG91dHB1dC4KLQotCi0JKiBkb2NzL1BST0JMRU1TOiBOZXcgZmlsZS4KLQotMjAwNi0wNC0wMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oOgotCVVwZGF0ZSBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLgotCi0yMDA2LTA0LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKHVuaW5zdGFsbCk6IERvbid0IGhhbmRsZSBgY2FjaGUnCi0JZGlyZWN0b3J5IHdoaWNoIG5vIGxvbmdlciBleGlzdHMuCi0KLTIwMDYtMDMtMjkgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBzcmMvcHNhdXgvcHNjb252LmM6IENoYW5nZWQgc29tZSB2YXJpYWJsZXMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvCi0JaG9sZCBuZWdhdGl2ZSB2YWx1ZXMgZnJvbSBgY2hhcicgdG8gYEZUX0NoYXInIHRvIGFsbG93IGJ1aWxkaW5nIHdpdGgKLQlhIGNvbXBpbGVyIHdoZXJlIGBjaGFyJyBpcyB1bnNpZ25lZCBieSBkZWZhdWx0LgotCi0yMDA2LTAzLTI3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0a2Vybi5jICh0dF9mYWNlX2dldF9rZXJuaW5nKTogRml4IGEgc2VyaW91cyBidWcgdGhhdAotCWNhdXNlcyBzb21lIHByb2dyYW1zIHRvIGdvIGludG8gYW4gaW5maW5pdGUgbG9vcCB3aGVuIGRlYWxpbmcgd2l0aAotCWZvbnRzIHRoYXQgZG9uJ3QgaGF2ZSBhIHByb3Blcmx5IHNvcnRlZCBrZXJuaW5nIHN1Yi10YWJsZS4KLQotMjAwNi0wMy0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChFUlJNU0c0KTogTmV3IG1hY3JvLgotCShfYmRmX3BhcnNlX2dseXBocyk6IEhhbmRsZSBpbnZhbGlkIEJCWCB2YWx1ZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaCAoRlRfRXJyX0JieF9Ub29fQmlnKTogTmV3IGVycm9yCi0JbWFjcm8uCi0KLTIwMDYtMDMtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkgKGh0bWxfaGVhZGVyXzIpOiBBZGQgaG9yaXpvbnRhbAotCXBhZGRpbmcgYmV0d2VlbiB0YWJsZSBlbGVtZW50cy4KLQkoaHRtbF9oZWFkZXJfMSk6IFRoZSBgRE9DVFlQRScgY29tbWVudCBtdXN0IGJlIGluIHVwcGVyY2FzZS4KLQkobWFrZV9odG1sX3BhcmEpOiBDb252ZXJ0IGAuLi4nIHF1b3RhdGlvbnMgaW50byByZWFsIGxlZnQgYW5kCi0JcmlnaHQgc2luZ2xlIHF1b3Rlcy4KLQlVc2UgYHBhcmFfaGVhZGVyJyBhbmQgYHBhcmFfZm9vdGVyJy4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3NvdXJjZXMucHkgKHJlX2JvbGQsIHJlX2l0YWxpYyk6IEFjY2VwdCAiJyIKLQlhbHNvLgotCi0yMDA2LTAzLTIzICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlBZGQgRlRfR2V0X1N1YkdseXBoX0luZm8gQVBJIHRvIHJldHJpZXZlIHN1YmdseXBoIGRhdGEuICBOb3RlIHRoYXQKLQl3ZSBkbyBub3QgZXhwb3NlIHRoZSBGVF9TdWJHbHlwaFJlYyBzdHJ1Y3R1cmUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaCAoRlRfU1VCR0xZUEhfRkxBR1NfKik6IE1vdmVkCi0JdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfU1VCR0xZUEhfRkxBR1NfKik6IEhlcmUuCi0JKEZUX0dldF9TdWJHbHlwaF9JbmZvKTogTmV3IGRlY2xhcmF0aW9uLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X1N1YkdseXBoX0luZm8pOiBOZXcgZnVuY3Rpb24uCi0KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyk6IENvbXB1dGUgbHNiX2RlbHRhIGFuZAotCXJzYl9kZWx0YSBjb3JyZWN0bHkgaW4gZWRnZSBjYXNlcy4KLQotMjAwNi0wMy0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYywgKGZ0Y19ub2RlX21ydV91cCwgRlRDX0NhY2hlX0xvb2t1cCkKLQlbIUZUQ19JTkxJTkVdOiBDb21waWxlIGNvbmRpdGlvbmFsbHkuCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuaDogVXBkYXRlZC4KLQotCSogc3JjL2NhY2hlL2Z0Y2dseXBoLmMgKEZUQ19HTm9kZV9Jbml0LCBGVENfR05vZGVfVW5zZWxlY3RGYW1pbHksCi0JRlRDX0dOb2RlX0RvbmUsIEZUQ19HTm9kZV9Db21wYXJlLCBGVENfRmFtaWx5X0luaXQsIEZUQ19HQ2FjaGVfTmV3KToKLQlzL0ZUX0VYUE9SVC9GVF9MT0NBTC8uCi0JKEZUQ19HQ2FjaGVfSW5pdCwgRlRDX0dDYWNoZV9Eb25lKTogQ29tbWVudGVkIG91dC4KLQkoRlRDX0dDYWNoZV9Mb29rdXApIFshRlRDX0lOTElORV06IENvbXBpbGUgY29uZGl0aW9uYWxseS4KLQlzL0ZUX0VYUE9SVC9GVF9MT0NBTC8uCi0JKiBzcmMvY2FjaGUvZnRjZ2x5cGguaDogVXBkYXRlZC4KLQotCSogc3JjL2NhY2hlL2Z0Y2ltYWdlLmMgKEZUQ19JTm9kZV9GcmVlLCBGVENfSU5vZGVfTmV3KToKLQlzL0ZUX0VYUE9SVC9GVF9MT0NBTC8uCi0JKEZUQ19JTm9kZV9XZWlnaHQpOiBDb21tZW50ZWQgb3V0LgotCSogc3JjL2NhY2hlL2Z0Y2ltYWdlLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChGVENfTWFuYWdlcl9Db21wcmVzcywKLQlGVENfTWFuYWdlcl9SZWdpc3RlckNhY2hlLCBGVENfTWFuYWdlcl9GbHVzaE4pOgotCXMvRlRfRVhQT1JUL0ZUX0xPQ0FMLy4KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5oOiBVcGRhdGVkLgotCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoRlRDX1NOb2RlX0ZyZWUsIEZUQ19TTm9kZV9OZXcsCi0JRlRDX1NOb2RlX0NvbXBhcmUpOiBzL0ZUX0VYUE9SVC9GVF9MT0NBTC8uCi0JKEZUQ19TTm9kZV9XZWlnaHQpOiBDb21tZW50ZWQgb3V0LgotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmg6IFVwZGF0ZWQuCi0KLTIwMDYtMDMtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMsIHNyYy9jYWNoZS9mdGNjYWNoZS5oIChGVENfTm9kZV9EZXN0cm95KToKLQlSZW1vdmUsIHVudXNlZC4KLQotCSogc3JjL2NhY2hlL2Z0Y2NtYXAuaDogUmVtb3ZlLCB1bnVzZWQuCi0KLQkqIHNyYy9jYWNoZS9ydWxlcy5tayAoQ0FDSEVfRFJWX0gpOiBSZW1vdmUgZnRjY21hcC5oLgotCi0yMDA2LTAzLTIxICBaaGUgU3UgIDxqYW1lcy5zdUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24pOiBJbXByb3ZlCi0JYWxnb3JpdGhtLgotCi0yMDA2LTAzLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmdHlwZXMuaCAoQ0ZGX0NoYXJzZXRSZWMpOiBBZGQgYG1heF9jaWQnIG1lbWJlci4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9jaGFyc2V0X2xvYWQpOiBTZXQgYGNoYXJzZXQtPm1heF9jaWQnLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBDaGFuZ2UgdHlwZSBvZiB0aGlyZCBwYXJhbWV0ZXIKLQl0byBgRlRfVUludCcuCi0JQ2hlY2sgcmFuZ2Ugb2YgYGdseXBoX2luZGV4Jy4KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuaDogVXBkYXRlZC4KLQotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfZmFjZV9idWlsZF9jbWFwcyk6IEhhbmRsZSBpbnZhbGlkIG9mZnNldAotCWNvcnJlY3RseS4KLQotCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKHJlZmRvYyksIGRvY3MvQ0hBTkdFUywgSmFtZmlsZSAoUmVmRG9jKSwKLQlSRUFETUU6IHMvMi4xLjEwLzIuMi8uCi0KLTIwMDYtMDMtMjEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX3NjYWxlKTogRml4IHNtYWxsIGJ1ZwotCXRoYXQgY3Jhc2hlcyB0aGUgYXV0by1oaW50ZXIgKGludHJvZHVjZWQgYnkgcHJldmlvdXMgcGF0Y2gpLgotCi0yMDA2LTAzLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9mcmVldHlwZS5tayAoQ0FDSEVfRElSLCBDQUNIRV9IKTogUmVtb3ZlLgotCShGUkVFVFlQRV9IKTogVXBkYXRlZC4KLQotCSogc3JjL2NhY2hlL3J1bGVzLm1rIChDQUNIRV9IX0RJUik6IFJlbW92ZS4KLQkoQ0FDSEVfRFJWX0gpOiBVcGRhdGVkLgotCi0yMDA2LTAzLTIwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjY2FjaGUuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y2NtYXAuaCwgaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNnbHlwaC5oCi0JaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNpbWFnZS5oIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjbWFuYWcuaAotCWluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjbXJ1LmggaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNzYml0cy5oOgotCU1vdmUgdG8uLi4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmgsIHNyYy9jYWNoZS9mdGNnbHlwaC5oLCBzcmMvY2FjaGUvZnRjaW1hZ2UuaCwKLQlzcmMvY2FjaGUvZnRjc2JpdHMuaCwgc3JjL2NhY2hlL2Z0Y21hbmFnLmgsIHNyYy9jYWNoZS9mdGNjbWFwLmgsCi0Jc3JjL2NhY2hlL2Z0Y21ydS5oOiBUaGlzIG5ldyBsb2NhdGlvbi4KLQlVcGRhdGUgZGVjbGFyYXRpb25zIGFjY29yZGluZyB0byB0aGUgY2hhbmdlcyBpbiB0aGUgY29ycmVzcG9uZGluZwotCXNvdXJjZSBmaWxlcy4KLQotCU5vdGUgdGhhdCB0aGVzZSBmaWxlcyBhcmUgbm90IHVzZWQgYnkgRnJlZVR5cGUgY2xpZW50czsgYWxsIHB1YmxpYwotCUFQSXMgb2YgdGhlIGNhY2hlIG1vZHVsZSBoYXZlIGJlZW4gYWxyZWFkeSBtb3ZlZCB0bwotCWBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaCcsIGFuZCBhbGwgRlRfQ0FDSEVfSU5URVJOQUxfWFhYWF9ICi0JbWFjcm9zIHJlc29sdmUgdG8gaXQuCi0KLQlSZWFzb24gZm9yIHRoZSBtb3ZlIGlzIHRvIGFsbG93IG1vZGlmaWNhdGlvbnMgb2YgdGhlIGludGVybmFscwotCXdpdGhvdXQgaW50ZXJmZXJlbmNlcyB3aXRoIHJvZ3VlIGNsaWVudHMuICBOb3RlIHRoYXQgdGhlcmUgYXJlIG5vCi0Ja25vd24gY2xpZW50cyB0aGF0IGFjY2VzcyB0aGUgY2FjaGUgaW50ZXJuYWxzIGF0IHRoZSBtb21lbnQuCi0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIGhlYWRlcnMgZnJvbQotCSQoQ0FDSEVfSCkuCi0JUmVtb3ZlIGBmcmVldHlwZS9jYWNoZScgZnJvbSB0aGUgdGFyZ2V0IGRpcmVjdG9yeS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfQ0FDSEVfTUFOQUdFUl9ILAotCUZUX0NBQ0hFX0lOVEVSTkFMX01SVV9ILCBGVF9DQUNIRV9JTlRFUk5BTF9NQU5BR0VSX0gsCi0JRlRfQ0FDSEVfSU5URVJOQUxfQ0FDSEVfSCwgRlRfQ0FDSEVfSU5URVJOQUxfR0xZUEhfSCwKLQlGVF9DQUNIRV9JTlRFUk5BTF9JTUFHRV9ILCBGVF9DQUNIRV9JTlRFUk5BTF9TQklUU19IKTogUG9pbnQgdG8KLQlGVF9DQUNIRV9ILgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYywgc3JjL2NhY2hlL2Z0Y2NhY2hlLmgsIHNyYy9jYWNoZS9mdGNjYmFjay5oLAotCXNyYy9jYWNoZS9mdGNjbWFwLmMsIHNyYy9jYWNoZS9mdGNnbHlwaC5jLCBzcmMvY2FjaGUvZnRjZ2x5cGguaCwKLQlzcmMvY2FjaGUvZnRjaW1hZ2UuYywgc3JjL2NhY2hlL2Z0Y2ltYWdlLmgsIHNyYy9jYWNoZS9mdGNtYW5hZy5jLAotCXNyYy9jYWNoZS9mdGNtYW5hZy5oLCBzcmMvY2FjaGUvZnRjbXJ1LmgsIHNyYy9jYWNoZS9mdGNzYml0cy5jLAotCXNyYy9jYWNoZS9mdGNzYml0cy5oOiBEb24ndCB1c2UgdGhlIEZUX0NBQ0hFX0lOVEVSTkFMX1hYWF9IIG1hY3JvcwotCWJ1dCBpbmNsdWRlIHRoZSBoZWFkZXJzIGRpcmVjdGx5ICh3aGljaCBhcmUgbm93IGluIGBzcmMvY2FjaGUnKS4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmM6ICBEb24ndCB1c2UgdGhlIEZUX0NBQ0hFX0lOVEVSTkFMX1hYWF9ICi0JbWFjcm9zIGJ1dCBpbmNsdWRlIHRoZSBoZWFkZXJzIGRpcmVjdGx5LgotCShGVENfQ2FjaGVfSW5pdCwgRlRDX0NhY2hlX0RvbmUsIEZUQ19DYWNoZV9OZXdOb2RlLAotCUZUQ19DYWNoZV9Mb29rdXAsIEZUQ19DYWNoZV9SZW1vdmVGYWNlSUQpOiBEZWNsYXJlIGFzIEZUX0xPQ0FMX0RFRi4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmM6ICBEb24ndCB1c2UgdGhlIEZUX0NBQ0hFX0lOVEVSTkFMX1hYWF9ICi0JbWFjcm9zIGJ1dCBpbmNsdWRlIHRoZSBoZWFkZXJzIGRpcmVjdGx5LgotCShGVENfTXJ1Tm9kZV9QcmVwZW5kLCBGVENfTXJ1Tm9kZV9VcCwgRlRDX01ydU5vZGVfUmVtb3ZlLAotCUZUQ19NcnVMaXN0X0luaXQsIEZUQ19NcnVMaXN0X1Jlc2V0LCBGVENfTXJ1TGlzdF9Eb25lLAotCUZUQ19NcnVMaXN0X05ldywgRlRDX01ydUxpc3RfUmVtb3ZlLCBGVENfTXJ1TGlzdF9SZW1vdmVTZWxlY3Rpb24pOgotCURlY2xhcmUgYXMgRlRfTE9DQUxfREVGLgotCShGVENfTXJ1TGlzdF9GaW5kLCBGVENfTXJ1TGlzdF9Mb29rdXApIFshRlRDX0lOTElORV06IENvbXBpbGUKLQljb25kaXRpb25hbGx5LgotCURlY2xhcmUgYXMgRlRfTE9DQUxfREVGLgotCi0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcDogVXBkYXRlIHByb2plY3QgZmlsZSwgYWRkCi0JbWlzc2luZyBiYXNlIHNvdXJjZSBmaWxlcyAoZnRzdHJva2UuYywgZnR4Zjg2LmMsIGV0Yy4pLgotCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMsIHNyYy9hdXRvZml0L2FmbGF0aW4uYywgc3JjL2Jhc2UvZnRvYmpzLmMsCi0Jc3JjL2NmZi9jZmZvYmpzLmMsIHNyYy9jaWQvY2lkb2Jqcy5jLCBzcmMvcGZyL3Bmcm9ianMuYywKLQlzcmMvc2ZudC9zZm9ianMuYywgc3JjL3NmbnQvdHRtdHguYywgc3JjL3R5cGUxL3QxYWZtLmMsCi0Jc3JjL3R5cGUxL3Qxb2Jqcy5jOiBSZW1vdmUgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBidWlsZGluZyB3aXRoCi0JVmlzdWFsIEMrKyA2IGFuZCAvVzQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfaW5pdCk6IERpc2FibGUgaG9yaXpvbnRhbAotCWhpbnRpbmcgZm9yIGl0YWxpYy9vYmxpcXVlIGZvbnRzLgotCi0KLQotCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYywgc3JjL3RydWV0eXBlL3R0cGxvYWQuaAotCSh0dF9mYWNlX2dldF9kZXZpY2VfbWV0cmljcyk6IENoYW5nZSBzZWNvbmQgYXJndW1lbnQgdG8gYEZUX1VJbnQnLgotCi0yMDA2LTAzLTA2ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChGVENfTWFuYWdlcl9Mb29rdXBfU2l6ZSk6IFByZXZlbnQgY3Jhc2hlcyBpbgotCU1vemlsbGEvRmlyZUZveCBwcmludCBwcmV2aWV3IGluIFVidW50dSBIb2FyeS4KLQotMjAwNi0wMi0yOCAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy9iYXNlL2Z0dXRpbC5jIChmdF9tZW1fcWFsbG9jKSBbRlRfU1RSSUNUX0FMSUFTSU5HXTogRG8gbm90Ci0JcmV0dXJuIGVycm9yIHdoZW4gc2l6ZSA9PSAwLgotCi0yMDA2LTAyLTI4ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0RvbmVfTGlicmFyeSk6IFJlbW92ZSBtb2R1bGVzIGluIHJldmVyc2UKLQlvcmRlciBzbyB0aGF0IHR5cGU0MiBtb2R1bGUgaXMgcmVtb3ZlZCBiZWZvcmUgdHJ1ZXR5cGUgbW9kdWxlLiAgVGhpcwotCWF2b2lkcyBkb3VibGUgZnJlZSBpbiBzb21lIG9jY2FzaW9ucy4KLQotMjAwNi0wMi0yOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBSZWxlYXNlIGNhbmRpZGF0ZSBWRVItMi0yLTAtUkM0LgotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMuCi0KLTIwMDYtMDItMjggIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIG1vZHVsZXMuY2ZnIChCQVNFX0VYVEVOU0lPTlMpOiBDb21waWxlIGluIGZ0Z3h2YWwuYyBieSBkZWZhdWx0IHRvCi0JYnVpbGQgZnR2YWxpZCBpbiBmdDJkZW1vcy4gIEl0IHdvcmtzIGFzIGR1bW15IEFCSSBpZiBneHZhbGlkIGlzIG5vdAotCWJ1aWx0LgotCi0yMDA2LTAyLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjY2FjaGUuaAotCVtGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFNdOiBSZW1vdmUgZGVjbGFyYXRpb24gb2YKLQlmdGNfbm9kZV9kb25lLgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYyAoZnRjX25vZGVfZGVzdHJveSkKLQlbIUZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMU106IE1hcmsgYXMgRlRfTE9DQUxfREVGLiAgVGhpcwotCXNob3VsZCBub3cgZml4IGFsbCBwb3NzaWJsZSBjb21waWxhdGlvbiBvcHRpb25zLgotCi0yMDA2LTAyLTI3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0dXRpbC5jIChmdF9tZW1fYWxsb2MsIGZ0X21lbV9xYWxsb2MsIGZ0X21lbV9yZWFsbG9jLAotCWZ0X21lbV9xcmVhbGxvYyk6IFJldHVybiBhbiBlcnJvciBpZiBhIG5lZ2F0aXZlIHNpemUgaXMgcGFzc2VkIGluCi0JcGFyYW1ldGVycy4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKGZ0Y19ub2RlX2Rlc3Ryb3kpOiBNYXJrIGFzIEZUX0JBU0VfREVGIHNpbmNlCi0JaXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQgZm9yIHJvZ3VlIGNsaWVudHMuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hnbG9iLmMgKHBzaF9ibHVlc19zZXRfem9uZXNfMCk6IFByZXZlbnQgcHJvYmxlbXMKLQl3aXRoIG1hbGZvcm1lZCBmb250cyB3aGljaCBoYXZlIGFuIG9kZCBudW1iZXIgb2YgYmx1ZSB2YWx1ZXMgKHRoZXNlCi0JYXJlIGJyb2tlbiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNzKS4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9zdWJmb250X2xvYWQpLCBzcmMvdHlwZTEvdDFsb2FkLmMKLQkoVDFfT3Blbl9GYWNlKTogTW9kaWZ5IHRoZSBsb2FkZXJzIHRvIGZvcmNlIGV2ZW4tbmVzcyBvZgotCWBudW1fYmx1ZV92YWx1ZXMnLgotCi0JKGNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudCk6IElnbm9yZSBpbnZhbGlkIGVudHJpZXMgaW4gaW5kZXggZmlsZXMuCi0KLTIwMDYtMDItMjcgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfU2V0X0NoYXJfU2l6ZSk6IENoZWNrIHRoZSBjYXNlIHdoZXJlIHdpZHRoCi0Jb3IgaGVpZ2h0IGlzIDAuCi0KLTIwMDYtMDItMjcgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19jZm0ubWFrZS50eHQsCi0JYnVpbGRzL21hYy9GcmVlVHlwZS5tNjhrX2Zhci5tYWtlLnR4dCwKLQlidWlsZHMvbWFjL0ZyZWVUeXBlLnBwY19jYXJib24ubWFrZS50eHQsCi0JYnVpbGRzL21hYy9GcmVlVHlwZS5wcGNfY2xhc3NpYy5tYWtlLnR4dDogVXBkYXRlIHRvIG5ldyBoZWFkZXIKLQlpbmNsdXNpb24gaW50cm9kdWNlZCBvbiAyMDA2LTAyLTE2LgotCi0yMDA2LTAyLTI3ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEdSSURfRklUX01FVFJJQ1MpOiBOZXcgbWFjcm8uCi0JKGZ0X2dseXBoc2xvdF9ncmlkX2ZpdF9tZXRyaWNzLCBGVF9Mb2FkX0dseXBoKSBbR1JJRF9GSVRfTUVUUklDU106Ci0JUmUtZW5hYmxlIGdseXBoIG1ldHJpY3MgZ3JpZC1maXR0aW5nLiAgSXQgaXMgbm93IGRvbmUgaW4gdGhlIGJhc2UKLQlsYXllci4KLQkoRlRfU2V0X0NoYXJfU2l6ZSwgRlRfU2V0X1BpeGVsX1NpemVzKTogTWFrZSBzdXJlIHRoZSB3aWR0aCBhbmQKLQloZWlnaHQgYXJlIG5vdCB0b28gc21hbGwgb3IgdG9vIGxhcmdlLCBqdXN0IGxpa2Ugd2Ugd2VyZSBkb2luZyBpbgotCTIuMS4xMC4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyk6IFRoZSB2ZXJ0aWNhbCBtZXRyaWNzCi0JYXJlIG5vdCBzY2FsZWQuCi0KLTIwMDYtMDItMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9yZWxlYXNlOiBNaW5vciBhZGRpdGlvbnMgYW5kIGNsYXJpZmljYXRpb25zLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQgdG8gcmVmbGVjdCBtYW55IGZpeGVzIGZvciBiYWNrd2FyZAotCWNvbXBhdGliaWxpdHkuICBTdGlsbCBpbmNvbXBsZXRlLgotCi0yMDA2LTAyLTI2ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9yZWNvbXB1dGVfc2NhbGVkX21ldHJpY3MpOiBSZS1lbmFibGUKLQljb25zZXJ2YXRpdmUgcm91bmRpbmcgb2YgbWV0cmljcyB0byBhdm9pZCBicmVha2luZyBjbGllbnRzIGxpa2UKLQlQYW5nbyAoc2VlIGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTMyNzg1MikuCi0KLTIwMDYtMDItMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZGV2ZWwvZnRvcHRpb24uaDogU3luY2hyb25pemUgd2l0aAotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmguCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChmdGNfbm9kZV9kZXN0cm95KTogVXNlIEZUX0xPQ0FMX0RFRiAoYWdhaW4pLgotCi0yMDA2LTAyLTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlGaXggY29tcGlsZXIgd2FybmluZ3MgYXMgd2VsbCBhcyBDKysgY29tcGlsYXRpb24gcHJvYmxlbXMuCi0JQWRkIG1pc3NpbmcgcHJvdG90eXBlcy4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYywgc3JjL2Jhc2UvZnRvYmpzLmMsIHNyYy9iYXNlL2Z0dXRpbC5jLAotCXNyYy9iZGYvYmRmZHJpdnIuYywgc3JjL2NmZi9jZmZjbWFwLmMsIHNyYy9jZmYvY2Zmb2Jqcy5jLAotCXNyYy9wc2F1eC9hZm1wYXJzZS5jLCwgc3JjL3BzYXV4L3QxY21hcC5jLCBzcmMvc21vb3RoL2Z0Z3JheXMuYwotCXNyYy90b29scy9hcGluYW1lcy5jLCBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYzogQWRkIHZhcmlvdXMgY2FzdHMsCi0JaW5pdGlhbGl6ZSB2YXJpYWJsZXMsIGFuZCBkZWNvcmF0ZSBmdW5jdGlvbnMgd2l0aCBGVF9DQUxMQkFDS19ERUYsCi0JZXRjLiwgdG8gZml4IGNvbXBpbGVyIHdhcm5pbmdzIChhbmQgQysrIGNvbXBpbGluZyBlcnJvcnMpLgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYzogRml4IGAtV21pc3NpbmctcHJvdG90eXBlcycgd2FybmluZ3Mgd2l0aAotCWdjYy4KLQotCSogYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYzogRG9uJ3QgaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0ggYnV0Ci0JRlRfSU5URVJOQUxfU1RSRUFNX0guCi0KLQkqIHNyYy9iYXNlL2Z0c3lzdGVtLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0guCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX1BGUl9IKTogTmV3IG1hY3JvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIChGVF9TVFJJQ1RfQUxJQVNJTkcpOiBEb24ndAotCWRlZmluZSBmb3IgQysrLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2b3R2YWwuaDogRG9uJ3QgaW5jbHVkZQotCUZUX09QRU5UWVBFX1ZBTElEQVRFX0ggYnV0IEZUX0lOVEVSTkFMX1ZBTElEQVRFX0guCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaDogSW5jbHVkZSBGVF9QRlJfSC4KLQotCSogc3JjL2d6aXAvZnRnemlwLmM6IEluY2x1ZGUgRlRfR1pJUF9ILgotCi0JKiBzcmMvbHp3L2Z0bHp3LmMsIHNyYy9sencvZnRsencyLmM6IEluY2x1ZGUgRlRfTFpXX0guCi0KLQkqIHNyYy9zZm50L3R0YmRmLmMgKHR0X2ZhY2VfbG9hZF9iZGZfcHJvcHMpOiBSZWFycmFuZ2UgY29kZS4KLQotMjAwNi0wMi0yNCAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT1VUTElORV9HRVRfQ09OVE9VUiwgZnRfY29udG91cl9oYXMsCi0JZnRfY29udG91cl9lbmNsb3NlZCwgZnRfb3V0bGluZV9nZXRfb3JpZW50YXRpb24pOiBDb21tZW50ZWQgb3V0LiAgV2UKLQloYXZlIHRvIHdhaXQgdW50aWwgYEZUX0dseXBoU2xvdF9Pd25fQml0bWFwJyBpcyBzdGFiaWxpemVkLgotCShGVF9PdXRsaW5lX0VtYm9sZGVuKTogVXNlIGBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbicuCi0KLTIwMDYtMDItMjQgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Yml0bWFwLmggKEZUX0JpdG1hcF9FbWJvbGRlbik6IFVwZGF0ZQotCWRvY3VtZW50YXRpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oIChGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCksCi0Jc3JjL2Jhc2UvZnRzeW50aC5jIChGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCk6IE5ldyBmdW5jdGlvbiB0byBtYWtlCi0Jc3VyZSBhIGdseXBoIHNsb3Qgb3ducyBpdHMgYml0bWFwLiAgSXQgaXMgYWxzbyBtYXJrZWQgZXhwZXJpbWVudGFsCi0JYW5kIGR1ZSB0byBjaGFuZ2UuCi0JKEZUX0dseXBoU2xvdF9FbWJvbGRlbik6IFVuZG8gdGhlIGxhc3QgY2hhbmdlLiAgSXQgdHVybnMgb3V0IHRoYXQKLQlyZW5kZXJpbmcgdGhlIG91dGxpbmUgY29uZnVzZXMgc29tZSBhcHBsaWNhdGlvbnMuCi0KLTIwMDYtMDItMjQgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogUmVsZWFzZSBjYW5kaWRhdGUgVkVSLTItMi0wLVJDMy4KLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkqIHNyYy9jYWNoZS9mdGNiYXNpYy5jOiBDb3JyZWN0IGNvbXBhdGliaWxpdHkgaGFjayBidWcuCi0KLTIwMDYtMDItMjQgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX1NpemVfUmVxdWVzdFJlYyk6IENoYW5nZSB0aGUgdHlwZQotCW9mIGB3aWR0aCcgYW5kIGBoZWlnaHQnIHRvIGBGVF9Mb25nJy4KLQkoZW51bSBGVF9TaXplX1JlcXVlc3RfVHlwZSksIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9SZXF1ZXN0X01ldHJpY3MpOgotCU5ldyByZXF1ZXN0IHR5cGUgYEZUX1NJWkVfUkVRVUVTVF9UWVBFX1NDQUxFUycgdG8gc3BlY2lmeSB0aGUgc2NhbGVzCi0JZGlyZWN0bHkuCi0KLTIwMDYtMDItMjMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCVR3byBCREYgcGF0Y2hlcyBmcm9tIERlYmlhbiBsaWJmcmVldHlwZTYgZm9yIDIuMS4xMC4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9nbHlwaHMpOiBGaXggYSBidWcgd2l0aCB6ZXJvLXdpZHRoCi0JZ2x5cGhzLgotCUZpeCBhIHByb2JsZW0gd2l0aCBsYXJnZSBlbmNvZGluZ3MuCi0KLQotCUZpeCBiaW5hcnkgY29tcGF0aWJpbGl0eSBpc3N1ZXMgZm9yIGdudXN0ZXAtYmFjayAoR05Vc3RlcCBiYWNrZW5kCi0JbW9kdWxlKSB3aGljaCBzdGlsbCBjcmFzaGVzIHVuZGVyIFNhcmdlLgotCi0JKiBzcmMvY2FjaGUvZnRjY21hcC5jIChGVENfT2xkQ01hcFR5cGUsIEZUQ19PbGRDTWFwSWRSZWMsCi0JRlRDX09sZENNYXBEZXNjKSBbRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTXTogTmV3IGRhdGEKLQlzdHJ1Y3R1cmVzIGFuZCBlbnVtZXJhdGlvbnMuCi0JKEZUQ19DTWFwQ2FjaGVfTG9va3VwKSBbRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTXTogTmV3Ci0JY29tcGF0aWJpbGl0eSBjb2RlLgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYzogRml4IGEgc2lsbHkgYnVnIHRoYXQgcHJldmVudGVkIG91ciBgaGFjaycgdG8KLQlzdXBwb3J0IHJvZ3VlIGNsaWVudHMgY29tcGlsZWQgYWdhaW5zdCAyLjEuNyB0byB3b3JrIGNvcnJlY3RseS4KLQlUaGlzIHByb2JhYmx5IGV4cGxhaW5zIHRoZSBHTlVzdGVwIGNyYXNoZXMgd2l0aCB0aGUgc2Vjb25kIHJlbGVhc2UKLQljYW5kaWRhdGUuCi0KLTIwMDYtMDItMjMgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaCAoZW51bSBGVF9PcmllbnRhdGlvbik6IE5ldyB2YWx1ZQotCWBGVF9PUklFTlRBVElPTl9OT05FJy4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PVVRMSU5FX0dFVF9DT05UT1VSLCBmdF9jb250b3VyX2hhcywKLQlmdF9jb250b3VyX2VuY2xvc2VkLCBmdF9vdXRsaW5lX2dldF9vcmllbnRhdGlvbik6IEFub3RoZXIgdmVyc2lvbiBvZgotCWBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbicuICBUaGlzIHZlcnNpb24gZGlmZmVycyBmcm9tIHRoZSBwdWJsaWMKLQlvbmUgaW4gdGhhdCBlYWNoIHBhcnQgKGNvbnRvdXIgbm90IGVuY2xvc2VkIGluIGFub3RoZXIgY29udG91cikgb2YgdGhlCi0Jb3V0bGluZSBpcyBjaGVja2VkIGZvciBvcmllbnRhdGlvbi4KLQkoRlRfT3V0bGluZV9FbWJvbGRlbik6IFVzZSBgZnRfb3V0bGluZV9nZXRfb3JpZW50YXRpb24nLgotCi0JKiBzcmMvYmFzZS9mdHN5bnRoLmMgKEZUX0dseXBoU2xvdF9FbWJvbGRlbik6IFJlbmRlciB0aGUgb3V0bGluZSBhbmQKLQl1c2UgYml0bWFwJ3MgZW1ib2xkZW4gcm91dGluZSB3aGVuIHRoZSBvdXRsaW5lIG9uZSBmYWlsZWQuCi0KLTIwMDYtMDItMjIgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBtb2R1bGVzLmNmZzogQ29tcGlsZSBpbiBmdG90dmFsLmMgYW5kIGZ0eGY4Ni5jIGJ5IGRlZmF1bHQgZm9yIEFCSQotCWNvbXBhdGliaWxpdHkuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2RvbmVfZmFjZSk6IEZpeCBhIG1lbW9yeSBsZWFrLgotCi0JKiBzcmMvc2ZudC90dHNiaXQwLmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdF9hbGlnbmVkLAotCXR0X3NiaXRfZGVjb2Rlcl9sb2FkX2J5dGVfYWxpZ25lZCkgW0ZUX09QVElNSVpFX01FTU9SWV06IEZpeCBzYml0Ci0JbG9hZGluZy4gIChPbmx5IHRlc3RlZCB3aXRoIGJpdCBhbGlnbmVkIHNiaXQgd2l0aCB4X3BvcyA9PSAwLikKLQotCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYyAodHRfZmFjZV9sb2FkX2hkbXgsCi0JdHRfZmFjZV9nZXRfZGV2aWNlX21ldHJpY3MpIFtGVF9PUFRJTUlaRV9NRU1PUlldOiBgaGRteCcgaXMgbm90Ci0JYWN0dWFsbHkgdXNlZC4KLQotMjAwNi0wMi0yMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JQWRkIGEgbmV3IEFQSSBuYW1lZCBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQl3ZSBoYXZlIGEgcGF0ZW50ZWQsIHVucGF0ZW50ZWQsIG9yIHVuaW1wbGVtZW50ZWQgVHJ1ZVR5cGUgYnl0ZWNvZGUKLQlpbnRlcnByZXRlci4KLQotCVRoZSBGVF9HZXRfTW9kdWxlX0ZsYWdzIEFQSSB3YXMgcmVtb3ZlZCBjb25zZXF1ZW50bHkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtb2RhcGkuaCAoRlRfTW9kdWxlX0dldF9GbGFncyk6IFJlbW92ZWQuCi0JUmVwbGFjZWQgd2l0aC4uLgotCShGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUpOiBUaGlzLgotCShGVF9UcnVlVHlwZUVuZ2luZVR5cGUpOiBOZXcgZW51bWVyYXRpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX1NFUlZJQ0VfVFJVRVRZUEVfRU5HSU5FX0gpOgotCU5ldyBtYWNyby4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9FTkdJTkVfSC4KLQkoRlRfTW9kdWxlX0dldF9GbGFncyk6IFJlbW92ZWQuICBSZXBsYWNlZCB3aXRoLi4uCi0JKEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSk6IFRoaXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfVFJVRVRZUEVfRU5HSU5FX0guCi0JKHR0X3NlcnZpY2VfdHJ1ZXR5cGVfZW5naW5lKTogTmV3IHNlcnZpY2Ugc3RydWN0dXJlLgotCSh0dF9zZXJ2aWNlcyk6IFJlZ2lzdGVyIGl0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaDogTmV3IGZpbGUuCi0KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogRml4IHNpbGx5IGJ1ZyB0aGF0IHByZXZlbnRlZAotCWVtYmVkZGVkIGJpdG1hcHMgZnJvbSBiZWluZyBjb3JyZWN0bHkgbGlzdGVkIGFuZCB1c2VkLgotCi0KLQkqIHNyYy9zZm50L3R0bXR4LmMgKHR0X2ZhY2VfbG9hZF9obXR4KTogRGlzYWJsZSBtZW1vcnkgb3B0aW1pemF0aW9uCi0JaWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTIGlzIHVzZWQuICBUaGUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKLQlsaWJYZm9udCBpcyBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlIEhNVFggZGF0YSwgdW5mb3J0dW5hdGVseS4KLQlGaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KLQkodHRfZmFjZV9nZXRfbWV0cmljcyk6IERpdHRvLgotCi0KLQkqIHNyYy9wZnIvcGZyc2JpdC5jIChwZnJfc2xvdF9sb2FkX2JpdG1hcCk6IEZpeCBoYW5kbGluZyBvZgotCWNoYXJhY3RlciBhZHZhbmNlcy4KLQotMjAwNi0wMi0yMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JU3VwcG9ydCBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBYLk9yZyBzZXJ2ZXIncyBYZm9udCBsaWJyYXJ5LgotCU5vdGUgdGhhdCB0aGlzIGNoYW5nZSB1bmZvcnR1bmF0ZWx5IHByZXZlbnRzIG1lbW9yeSBvcHRpbWl6YXRpb25zCi0JZm9yIHRoZSBlbWJlZGRlZCBiaXRtYXAgbG9hZGVyLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaCAoU0ZOVF9JbnRlcmZhY2UpOiBNb3ZlCi0JYHNldF9zYml0X3N0cmlrZScgYW5kIGBsb2FkX3NiaXRfbWV0cmljcycgZmllbGRzIHRvIHRoZSBsb2NhdGlvbiBvZgotCXZlcnNpb24gMi4xLjguCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHR0X2ZhY2Vfc2V0X3NiaXRfc3RyaWtlX3N0dWIpOiBDYWxsCi0JRlRfU2l6ZV9SZXF1ZXN0LgotCShzZm50X2ludGVyZmFjZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jIFtGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFNdOiBEb24ndCBsb2FkCi0JdHRzYml0MC5jLgotCSh0dF9sb2FkX3NiaXRfbWV0cmljcyk6IE1ha2UgYHNiaXRfc21hbGxfbWV0cmljc19maWVsZHMnIHN0YXRpYy4KLQotCSogc3JjL3NmbnQvdHRzYml0Lmg6IFVwZGF0ZWQuCi0KLTIwMDYtMDItMTcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogYnVpbGRzL3VuaXgvdW5peC1jYy5pbiAoTElOS19MSUJSQVJZKTogRG9uJ3QgZmlsdGVyIG91dCBleHBvcnRlZAotCWZ1bmN0aW9ucyBhbnltb3JlLiAgVGhpcyBlbnN1cmVzIHRoYXQgYWxsIEZUX0JBU0UgaW50ZXJuYWwgZnVuY3Rpb25zCi0JYXJlIGF2YWlsYWJsZSBmb3IgZHluYW1pYyBsaW5raW5nLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaCAoRlRDX0lNQUdFX1RZUEVfQ09NUEFSRSwKLQlGVENfSU1BR0VfVFlQRV9IQVNIKSwgc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMgKEZUQ19PbGRGb250UmVjLAotCUZUQ19PbGRJbWFnZURlc2NSZWMsIEZUQ19JbWFnZUNhY2hlX0xvb2t1cCwgRlRDX0ltYWdlX0NhY2hlX05ldywKLQlGVENfT2xkSW1hZ2VEZXNjLCBGVENfT0xEX0lNQUdFX0ZPUk1BVCwgZnRjX29sZF9pbWFnZV94eHgsCi0JZnRjX2ltYWdlX3R5cGVfZnJvbV9vbGRfZGVzYywgRlRDX0ltYWdlX0NhY2hlX0xvb2t1cCwKLQlGVENfU0JpdENhY2hlX0xvb2t1cCwgRlRDX1NCaXRfQ2FjaGVfTmV3LCBGVENfU0JpdF9DYWNoZV9Mb29rdXApCi0JW0ZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMU106IFRyeSB0byByZXZpdmUgb2xkIGZ1bmN0aW9ucyBvZiB0aGUKLQljYWNoZSBzdWItc3lzdGVtLiAgV2UgdHJ5IHRvIHJlY29nbml6ZSBvbGQgbGVnYWN5IHNpZ25hdHVyZXMgd2l0aCBhCi0JZ3Jvc3MgaGFjayAoaG9wZSBpdCB3b3JrcykuCi0KLTIwMDYtMDItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZGV2ZWwvZnRvcHRpb24uaDogU3luY2hyb25pemUgd2l0aAotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmguCi0KLTIwMDYtMDItMTYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCU1hc3NpdmUgY2hhbmdlcyB0byB0aGUgaW50ZXJuYWxzIHRvIHJlc3BlY3QgdGhlIGludGVybmFsIG9iamVjdAotCWxheW91dHMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucyBvZiBGcmVlVHlwZSAyLjEuNy4gIE5vdGUgdGhhdCB0aGUKLQljYWNoZSBzdWItc3lzdGVtIGNhbm5vdCBiZSBmdWxseSByZXRyb2ZpdHRlZCwgdW5mb3J0dW5hdGVseS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAotCShGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMpOiBOZXcgbWFjcm8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlL2Z0Y2NhY2hlLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9jYWNoZS9mdGNjbWFwLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJpdmVyLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oLCBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCwgc3JjL2Jhc2UvZnRjYWxjLmMsCi0Jc3JjL2Jhc2UvZnRkYmdtZW0uYywgc3JjL2Jhc2UvZnRvYmpzLmMsIHNyYy9iYXNlL2Z0dXRpbC5jLAotCXNyYy9iZGYvYmRmZHJpdnIuYywgc3JjL2NhY2hlL2Z0Y2NhY2hlLmMsIHNyYy9jYWNoZS9mdGNjYmFjay5oLAotCXNyYy9jYWNoZS9mdGNtYW5hZy5jLCBzcmMvY2ZmL2NmZmRyaXZyLmMsIHNyYy9jaWQvY2lkcml2ZXIuYywKLQlzcmMvcGNmL3BjZmRyaXZyLmMsIHNyYy9wZnIvcGZyZHJpdnIuYywgc3JjL3BzYXV4L3BzYXV4bW9kLmMsCi0Jc3JjL3NmbnQvc2Zkcml2ZXIuYywgc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMsIHNyYy90eXBlMS90MWRyaXZlci5jLAotCXNyYy90eXBlMS90MW9ianMuYywgc3JjL3R5cGU0Mi90NDJkcml2ci5jLCBzcmMvd2luZm9udHMvd2luZm50LmM6Ci0JVXNlIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyB0byByZXZpdmUgb2xkIGZ1bmN0aW9ucyBhbmQgZGF0YQotCXN0cnVjdHVyZXMuCi0KLQlNb3ZlIG5ld2x5IGFkZGVkIHN0cnVjdHVyZSBlbGVtZW50cyB0byB0aGUgZW5kIG9mIHRoZSBhZmZlY3RlZAotCXN0cnVjdHVyZSBhbmQgYWRkIHN0dWIgZmllbGRzIChpZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgaXMKLQlkZWZpbmVkKSB0byBhc3N1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBGcmVlVHlwZQotCXZlcnNpb25zLgotCVVzZSBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgdG8gYWRkIGZ1bmN0aW9uIHN0dWJzIGZvciBvbGQKLQlmdW5jdGlvbnM6Ci0KLQkgIGZ0X3N0dWJfc2V0X2NoYXJfc2l6ZXMKLQkgIGZ0X3N0dWJfc2V0X3BpeGVsX3NpemVzCi0KLQlSZW5hbWUgdGhlIGZvbGxvd2luZyBpbnRlcm5hbCBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUgb2xkIGZ1bmN0aW9uCi0JbmFtZXMgYXMgc3R1YnM6Ci0KLQkgIEZUX0FsbG9jICAgICAgICAgIC0+IGZ0X21lbV9hbGxvYwotCSAgRlRfUUFsbG9jICAgICAgICAgLT4gZnRfbWVtX3FhbGxvYwotCSAgRlRfUmVhbGxvYyAgICAgICAgLT4gZnRfbWVtX3JlYWxsb2MKLQkgIEZUX1FSZWFsbG9jICAgICAgIC0+IGZ0X21lbV9xcmVhbGxvYwotCSAgRlRfRnJlZSAgICAgICAgICAgLT4gZnRfbWVtX2ZyZWUKLQkgIEZUX0FsbG9jX0RlYnVnICAgIC0+IGZ0X21lbV9hbGxvY19kZWJ1ZwotCSAgRlRfUUFsbG9jX0RlYnVnICAgLT4gZnRfbWVtX3FhbGxvY19kZWJ1ZwotCSAgRlRfUmVhbGxvY19EZWJ1ZyAgLT4gZnRfbWVtX3JlYWxsb2NfZGVidWcKLQkgIEZUX1FSZWFsbG9jX0RlYnVnIC0+IGZ0X21lbV9xcmVhbGxvY19kZWJ1ZwotCSAgRlRfRnJlZV9EZWJ1ZyAgICAgLT4gZnRfbWVtX2ZyZWVfZGVidWcKLQotMjAwNi0wMi0xNSAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0ZhY2VfSW50ZXJuYWxSZWMpOiBSZW1vdmUKLQl1bnVzZWQgYG1heF9wb2ludHMnIGFuZCBgbWF4X2NvbnRvdXJzJy4KLQotCSogc3JjL2NpZC9jaWRvYmpzLmMgKGNpZF9mYWNlX2luaXQpLCBzcmMvdHlwZTEvdDFvYmpzLmMKLQkoVDFfRmFjZV9Jbml0KSwgc3JjL3R5cGU0Mi90NDJvYmpzLmMgKFQ0Ml9GYWNlX0luaXQpOiBVcGRhdGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GYWNlUmVjKTogUmVtb3ZlIHVudXNlZAotCWBtYXhfY29tcG9uZW50cycuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5oIChUVF9FeGVjQ29udGV4dFJlYyk6IFJlbW92ZSB1bnVzZWQKLQlgbG9hZFNpemUnIGFuZCBgbG9hZFN0YWNrJy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX0RvbmVfQ29udGV4dCwgVFRfTG9hZF9Db250ZXh0KSwKLQlzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX21heHApOiBVcGRhdGUuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5oIChjZmZfc2l6ZV9zZWxlY3QpLCBzcmMvc2ZudC9zZmRyaXZlci5jCi0JKHNmbnRfaW50ZXJmYWNlKSwgc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X3NpemVfcmVxdWVzdCk6IEZpeAotCWNvbXBpbGVyIGVycm9ycy93YXJuaW5ncyB3aGVuIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyBpcyBub3QKLQlkZWZpbmVkLgotCi0JKiBzcmMvc2ZudC90dG10eC5jICh0dF9mYWNlX2xvYWRfaG10eCwgdHRfZmFjZV9nZXRfbWV0cmljcyk6IEZpeAotCXBvc3NpYmxlIHNlZ21lbnQgZmF1bHRzIGZvciB0aGUgbm9uLUZUX09QVElNSVpFX01FTU9SWSdlZCB2ZXJzaW9ucy4KLQkoZmluYWxseSEpCi0KLQotCUZvciBtb3N0IE9wZW5UeXBlIHRhYmxlcywgYHR0X2ZhY2VfbG9hZF94eHh4JyBzaW1wbHkgbG9hZHMgdGhlIHRhYmxlCi0JYW5kIGBmYWNlLT5yb290JyBpcyBzZXQgbGF0ZXIgaW4gYHNmbnRfbG9hZF9mYWNlJy4gIEhlcmUsIHdlIHRyeSB0bwotCW1ha2UgdGhpcyB3b3JrIGZvciBfYWxsXyB0YWJsZXMuICBBbHNvIGltcHJvdmUgdHJhY2luZyBtZXNzYWdlcy4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMsIHNyYy9zZm50L3R0c2JpdDAuYywgc3JjL3NmbnQvdHRsb2FkLmMsCi0Jc3JjL3NmbnQvdHRtdHguYzogYWxsIGB0dF9mYWNlX2xvYWRfeHh4eCcgc2hvdWxkIGxvYWQgdGhlIHRhYmxlIGFuZAotCXRoZW4gZXhpdC4gIEVycm9yIGhhbmRsaW5nIG9yIHNldHRpbmcgZmFjZS0+cm9vdCBpcyBkb25lIGxhdGVyIGluCi0JYHNmbnRfbG9hZF9mYWNlJy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogV29yayBoYXJkZXIuCi0JTWFjIGJpdG1hcC1vbmx5IGZvbnRzIGFyZSBub3Qgc2NhbGFibGUuCi0JQ2hlY2sgdGhhdCBgZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTScgaXMgbm90IHplcm8uCi0JKExPQURfLCBMT0FETV8pOiBFbWl0IHByZXR0eSB0cmFjZSBtZXNzYWdlcy4KLQotCSogc3JjL3NmbnQvdHRzYml0MC5jICh0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MpOiBSZWFkIG1ldHJpY3MKLQlmcm9tIGBlYmxjJy4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2ZhY2VfYnVpbGRfY21hcHMpLCBzcmMvc2ZudC90dHBvc3QuYwotCShsb2FkX2Zvcm1hdF8yMCwgbG9hZF9mb3JtYXRfMjUsIHR0X2ZhY2VfZ2V0X3BzX25hbWUpOiBVc2UKLQlmYWNlLT5tYXhfcHJvZmlsZS5udW1HbHlwaHMsIGluc3RlYWQgb2YgZmFjZS0+cm9vdC5udW1fZ2x5cGhzLgotCi0yMDA2LTAyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oIChGVF9PdXRsaW5lX0VtYm9sZGVuKTogTWVudGlvbiBpbgotCWRvY3VtZW50YXRpb24gdGhhdCBuZWdhdGl2ZSBzdHJlbmd0aCB2YWx1ZXMgYXJlIHBvc3NpYmxlLgotCUdpdmUgYW4gZXhhbXBsZSBjYWxsLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0dseXBoU2xvdFJlYyk6IEltcHJvdmUKLQlkb2N1bWVudGF0aW9uIG9mIGBvdXRsaW5lJyBmaWVsZC4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSC4KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmM6IEluY2x1ZGUgdHRtdHguaC4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYzogSW5jbHVkZSBhZnR5cGVzLmggYW5kIGFmbGF0aW4uaC4KLQotMjAwNi0wMi0xNCAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy9zZm50L3R0bXR4LmMgKHR0X2ZhY2VfZ2V0X21ldHJpY3MpOiBUeXBvLgotCi0yMDA2LTAyLTE0ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL3NmbnQvdHRtdHguYyAodHRfZmFjZV9sb2FkX2hoZWEsIHR0X2ZhY2VfbG9hZF9obXR4KTogU2ltcGx5Ci0JcmV0dXJuIGVycm9yIGlmIHRhYmxlIGlzIG1pc3NpbmcuCi0JQ2hlY2sgdGFibGUgbGVuZ3RoIGluIG5vbi1GVF9PUFRJTUlaRV9NRU1PUlknZWQgYHR0X2ZhY2VfbG9hZF9obXR4Jy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogVGFrZSBjYXJlIG9mIG1pc3NpbmcgbWV0cmljcwotCXRhYmxlcy4gIFRoZSBsYXN0IGNoYW5nZSBtYWtlcyBNYWMgYml0bWFwLW9ubHkgZm9udCBub3QgbG9hZCBhbmQKLQl0aGlzIGZpeGVzIGl0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogRml4IGNvbXBpbGF0aW9uCi0JZXJyb3Igd2hlbiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMIGlzIGRlZmluZWQuCi0KLTIwMDYtMDItMTMgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JQ2xlYW4gdXAgdGhlIFNGTlRfSW50ZXJmYWNlLiAgSW4gdGhpcyBmaW5hbCBwYXNzLCBgbG9hZF9obXR4JyBpcwotCXNwbGl0IGZyb20gYGxvYWRfaGhlYScuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oLCBzcmMvc2ZudC9zZmRyaXZlci5jLAotCXNyYy9zZm50L3R0bXR4LmMsIHNyYy9zZm50L3R0bXR4Lmg6IFNwbGl0IGBobXR4JyBmcm9tIGBoaGVhJy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogVXBkYXRlLgotCi0yMDA2LTAyLTEzICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL3NmbnQvdHRtdHguaCwgc3JjL3NmbnQvdHRtdHguYzogV2h5IGFyZSB0aGVyZSB0d28gY29waWVzIG9mCi0JY29kZS4uLgotCi0yMDA2LTAyLTEzICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCUNsZWFuIHVwIHRoZSBTRk5UX0ludGVyZmFjZS4gIEluIHRoaXMgcGFzcywgd2Ugd2FudCB0byB0cmVhdCB0aGUKLQlmb250IGRpcmVjdG9yeSAob2Zmc2V0IHRhYmxlIGFuZCB0YWJsZSBkaXJlY3RvcnkpIGFzIGEgbm9ybWFsIHRhYmxlCi0JbGlrZSB0aGUgb3RoZXJzLiAgVGhpcyBhbHNvIG1lYW5zIHRoYXQgVFRDcyBhcmUgbm8gbG9uZ2VyIHJlY29nbml6ZWQKLQl0aGVyZSBidXQgaW4gYGluaXRfZmFjZScuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIChTRk5UX0ludGVyZmFjZSksCi0Jc3JjL3NmbnQvc2Zkcml2ZXIuYzogYGxvYWRfc2ZudF9oZWFkZXInIGFuZCBgbG9hZF9kaXJlY3RvcnknIGFyZQotCWNvbWJpbmVkIGFuZCByZW5hbWVkIHRvIGBsb2FkX2ZvbnRfZGlyJy4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmgsIHNyYy9zZm50L3R0bG9hZC5jOgotCXMvc2ZudF9kaXJfY2hlY2svY2hlY2tfdGFibGVfZGlyLy4KLQlgc2ZudF9pbml0JyBpcyBtb3ZlZCB0byBzZm9ianMuYyBhbmQgcmVuYW1lZCB0byBgc2ZudF9vcGVuX2ZvbnQnLgotCWB0dF9mYWNlX2xvYWRfc2ZudF9oZWFkZXInIGFuZCBgdHRfZmFjZV9sb2FkX2RpcmVjdG9yeScgYXJlIGNvbWJpbmVkCi0JYW5kIHJlbmFtZWQgdG8gYHR0X2ZhY2VfbG9hZF9mb250X2RpcicuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSk6IFJlY29nbml6ZSBUVEMgaGVyZS4KLQotMjAwNi0wMi0xMyAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQlDbGVhbiB1cCB0aGUgU0ZOVF9JbnRlcmZhY2UuICBUYWJsZSBsb2FkaW5nIGZ1bmN0aW9ucyBhcmUgbm93IG5hbWVkCi0JYWZ0ZXIgdGhlIHRhYmxlcycgdGFnczsgYGhkbXgnIGlzIFRydWVUeXBlLXNwZWNpZmljIGFuZCB0aHVzIHRoZQotCWNvZGUgaXMgbW92ZWQgdG8gdGhlIHRydWV0eXBlIG1vZHVsZTsgYGdldF9tZXRyaWNzJyBpcyBtb3ZlZCBoZXJlCi0JZnJvbSB0aGUgdHJ1ZXR5cGUgbW9kdWxlIHNvIHRoYXQgdGhlIGNvZGUgY2FuIGJlIHNoYXJlZCB3aXRoIHRoZSBjZmYKLQltb2R1bGUuCi0KLQlUaGlzIHBhc3MgaW52b2x2ZXMgbm8gcmVhbCBjaGFuZ2VzLiAgVGhhdCBpcywgdGhlIGNvZGUgaXMgbW92ZWQKLQl2ZXJiYXRpbSBtb3N0bHkuICBUaGUgb25seSBleGNlcHRpb24gaXMgdGhlIHJldHVybiB2YWx1ZSBvZgotCWB0dF9mYWNlX2dldF9tZXRyaWNzJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmgsIHNyYy9zZm50L3J1bGVzLm1rLAotCXNyYy9zZm50L3NmZHJpdmVyLmMsIHNyYy9zZm50L3NmbnQuYywgc3JjL3NmbnQvc2ZvYmpzLmMsCi0Jc3JjL3NmbnQvdHRsb2FkLmMsIHNyYy9zZm50L3R0bG9hZC5oLCBzcmMvc2ZudC90dHNiaXQuYywKLQlzcmMvc2ZudC90dHNiaXQuaCwgc3JjL3NmbnQvdHRzYml0MC5jOiBDbGVhbiB1cCB0aGUgU0ZOVF9JbnRlcmZhY2UuCi0KLQkqIHNyYy9zZm50L3R0bXR4LmMsIHNyYy9zZm50L3R0bXR4Lmg6IE5ldyBmaWxlcy4gIE1ldHJpY3MtcmVsYXRlZAotCXRhYmxlcycgbG9hZGluZyBhbmQgcGFyc2luZyBjb2RlIGlzIG1vdmVkIHRvIGhlcmUuCi0JTW92ZSBgdHRfZmFjZV9nZXRfbWV0cmljcycgaGVyZSBmcm9tIHRoZSB0cnVldHlwZSBtb2R1bGUuICBUaGUKLQlyZXR1cm4gdmFsdWUgaXMgY2hhbmdlZCBmcm9tIGB2b2lkJyB0byBgRlRfRXJyb3InLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogTmV3IHRyYWNlOiB0dG10eC4KLQotCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYywgc3JjL3RydWV0eXBlL3R0cGxvYWQuaDogYGhkbXgnIGxvYWRpbmcgYW5kCi0JcGFyc2luZyBjb2RlIGlzIG1vdmVkIGhlcmUuCi0JTmV3IGZ1bmN0aW9uIGB0dF9mYWNlX2xvYWRfcHJlcCcgc3BsaXQgZnJvbSBgdHRfZmFjZV9sb2FkX2ZwZ20nLgotCWB0dF9mYWNlX2xvYWRfZnBnbScgcmV0dXJucyBgRlRfRXJyX09rJyBpZiBgZnBnbScgZG9lc24ndCBleGlzdC4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jLCBzcmMvY2ZmL2NmZm9ianMuYzogVXBkYXRlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jLCBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmM6IFVwZGF0ZS4KLQotMjAwNi0wMi0xMSAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19tZXRyaWNzX2luaXQpOiBGaXggYSBzdHVwaWQgYnVnLi4uCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyk6IFVzZQotCUFGX0xhdGluTWV0cmljc1JlYyBhcyB0aGUgZHVtbXkgbWV0cmljcyBiZWNhdXNlIHdlIGNhc3QgdGhlIG1ldHJpY3MKLQl0byBpdCBsYXRlciBpbiBgYWZfbGF0aW5faGludHNfbGlua19zZWdtZW50cycuCi0KLTIwMDYtMDItMTEgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIChBRl9DT05GSUdfT1BUSU9OX0NKSyk6ICNkZWZpbmUKLQl0byBlbmFibGUgYXV0b2ZpdCBDSksgc2NyaXB0IHN1cHBvcnQuICAoI2RlZmluZSdkIGJ5IGRlZmF1bHQuKQotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmggKEFGX0xBVElOX0NPTlNUQU5UKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMpOiBNYWtlIHN1cmUKLQl0aGF0IGBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCcgaXMgYWx3YXlzIHNldC4KLQkoYWZfbGF0aW5faGludHNfbGlua19zZWdtZW50cyk6IFBvdGVudGlhbCBkaXZpZGUtYnktemVybyBidWcuCi0JVXNlIGxhdGluIGNvbnN0YW50IGluIHRoZSBzY29yaW5nIGZvcm11bGEuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmM6IE1pbm9yIHVwZGF0ZXMgZHVlIHRvIHRoZSBhYm92ZSB0aHJlZSBjaGFuZ2VzLgotCi0JKiBkb2NzL1RPRE8sIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNi0wMi0wOSAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQlJbnRyb2R1Y2UgZXhwZXJpbWVudGFsIGF1dG9maXQgQ0pLIG1vZHVsZSBiYXNlZCBvbiBha2l0bydzIGF1dG9oaW50Ci0JcGF0Y2guICBZb3UgbmVlZCB0byAjZGVmaW5lIEFGX01PRF9DSksgaW4gYWZjamsuYyB0byBlbmFibGUgaXQuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMsIHNyYy9hdXRvZml0L2FmY2prLmgsIHNyYy9hdXRvZml0L2FmY2prLmMsCi0Jc3JjL2F1dG9maXQvcnVsZXMubWssIHNyYy9hdXRvZml0L2F1dG9maXQuYywgc3JjL2F1dG9maXQvYWZ0eXBlcy5oOgotCUFkZCBDSksgbW9kdWxlIGJhc2VkIG9uIGFraXRvJ3MgYXV0b2hpbnQgcGF0Y2guCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuaCAoQUZfU2VnbWVudFJlYyk6IE5ldyBmaWVsZCBgbGVuJyBmb3IgdGhlCi0Jb3ZlcmxhcCBsZW5ndGggb2YgdGhlIHNlZ21lbnRzLgotCShBRl9TRUdNRU5UX0xFTiwgQUZfU0VHTUVOVF9ESVNUKTogTmV3IG1hY3Jvcy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5oIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzKSwKLQlzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMpOiBNYWRlCi0JYEZUX0xPQ0FMJy4KLQlVc2UgdGhlIGNoYXJhY3RlciBnaXZlbiBieSB0aGUgY2FsbGVyLgotCShhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzLCBhZl9sYXRpbl9oaW50c19saW5rX3NlZ21lbnRzKTogU2NhbGUKLQl0aGUgdGhyZXNob2xkcy4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyk6IFJlc3BlY3QKLQlBRl9TQ0FMRVJfRkxBR19OT19BRFZBTkNFLgotCi0yMDA2LTAyLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkcGFyc2UuYyAoY2lkX3BhcnNlX25ldyk6IFJlbW92ZSBzaGFkb3dpbmcgdmFyaWFibGUuCi0KLTIwMDYtMDItMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9jaWQvY2lkcGFyc2UuYyAoY2lkX3BhcnNlX25ldyk6IEZpeCBmb3IgYWJub3JtYWxseSBzaG9ydCBvcgotCWJyb2tlbiBDSURGb250LiAgUmVwb3J0ZWQgYnkgVGFlayBLd2FuKFRLKSBMZWUgKHNlZSBmdC1kZXZlbAotCTIwMDUtMTEtMDIpLgotCi0yMDA2LTAyLTA4ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IEZpeCBidWcgZm9yIGAtLXdpdGgtb2xkLW1hYy1mb250cycKLQlvcHRpb24gb24gVU5JWCBwbGF0Zm9ybS4gIEl0IGhhcyBiZWVuIGJyb2tlbiBzaW5jZSAyMDA2LTAxLTExLgotCi0yMDA2LTAyLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9vdHZhbGlkL21vZHVsZS5tazogcy9vdHZhbGlkX21vZHVsZV9jbGFzcy9vdHZfbW9kdWxlX2NsYXNzLy4KLQkqIHNyYy9neHZhbGlkL21vZHVsZS5tazogcy9neHZhbGlkX21vZHVsZV9jbGFzcy9neHZfbW9kdWxlX2NsYXNzLy4KLQotCSogYnVpbGRzL3VuaXgvdW5peGRkZWYubWs6IEFjdHVhbGx5IGRvIGRlZmluZSBQTEFURk9STSAoZml4aW5nCi0JY2hhbmdlIGZyb20gMjAwNi0wMS0zMSkuCi0JKFRPUF9ESVIsIE9CSl9ESVIpOiBVcGRhdGUuCi0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBGaXggcGF0aCBmb3IgZnRtb2R1bGUuaC4KLQotCSogTWFrZWZpbGUsICoubWssIGJ1aWxkcy91bml4L3VuaXgtY2MuaW4sIGJ1aWxkcy91bml4LWRlZi5pbjogVXNlCi0JYD89JyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCSogYnVpbGRzL2RldGVjdC5tayAoVE9QX0RJUiksIGJ1aWxkcy9vczIvb3MyLWRldi5tayAoVE9QX0RJUiksCi0JYnVpbGRzL3dpbjMyL3czMi1kZXYubWsgKFRPUF9ESVIpOiBSZW1vdmVkLiAgRGVmaW5lZCBlbHNld2hlcmUuCi0KLTIwMDYtMDEtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUltcGxlbWVudCBuZXcsIHNpbXBsaWZpZWQgbW9kdWxlIHNlbGVjdGlvbi4gIFdpdGggR05VIG1ha2UgaXQgaXMgbm93Ci0Jc3VmZmljaWVudCB0byBtb2RpZnkgYSBzaW5nbGUgZmlsZSwgYG1vZHVsZXMuY2ZnJywgdG8gY29udHJvbCB0aGUKLQlpbmNsdXNpb24gb2YgbW9kdWxlcyBhbmQgYmFzZSBleHRlbnNpb24gZmlsZXMuCi0KLQlUaGlzIGNoYW5nZSBhbHNvIGZpeGVzIHRoZSBjcmVhdGlvbiBvZiBmdG1vZHVsZS5oOyBpdCBub3cgZGVwZW5kcyBvbgotCWBtb2R1bGVzLmNmZycgYW5kIHRodXMgaXMgcmVidWlsdCBvbmx5IGlmIG5lY2Vzc2FyeS4KLQotCUZpbmFsbHksIGEgdmVyc2lvbiBvZiBgZnRvcHRpb24uaCcgaW4gT0JKX0RJUiBpcyBwcmVmZXJyZWQgb3ZlciB0aGUKLQlkZWZhdWx0IGxvY2F0aW9uLgotCi0JKiBtb2R1bGVzLmNmZzogTmV3IGZpbGUuCi0KLQkqIGJ1aWxkcy9mcmVldHlwZS5tazogRG9uJ3QgaW5jbHVkZSBgbW9kdWxlcy5taycuCi0JSW5jbHVkZSBhbGwgYHJ1bGVzLm1rJyBmaWxlcyBhcyBzcGVjaWZpZWQgaW4gYG1vZHVsZXMuY2ZnJy4KLQkoRlRPUFRJT05fRkxBRywgRlRPUFRJT05fSCk6IE5ldyB2YXJpYWJsZXMuCi0JKEZUX0NGTEFHUyk6IEFkZCBtYWNybyBkZWZpbml0aW9uIGZvciBGVF9DT05GSUdfTU9EVUxFU19ILgotCUFkZCBGVE9QVElPTl9GTEFHLgotCSgkKEZUX0lOSVRfT0JKKSk6IERvbid0IHVzZSBGVF9NT0RVTEVfTElTVC4KLQkoQ09ORklHX0gpOiBBZGQgRlRNT0RVTEVfSCBhbmQgRlRPUFRJT05fSC4KLQkoSU5DTFVERVMpOiBBZGQgREVWRUxfRElSLgotCShJTkNMVURFX0ZMQUdTLCBGVFNZU19TUkMsIEZUU1lTX09CSiwgRlRERUJVR19TUkMsIEZUREVCVUdfT0JKLAotCU9CSl9NLCBPQkpfUyk6IFVzZSBgOj0nLCBub3QgYD0nLgotCShyZW1vdmVfZnRtb2R1bGVfaCk6IE5ldyBwaG9ueSB0YXJnZXQgdG8gZGVsZXRlIGBmdG1vZHVsZS5oJy4KLQkoZGlzdGNsZWFuKTogQWRkIHJlbW92ZV9mdG1vZHVsZV9oLgotCi0JKiBidWlsZHMvbW9kdWxlcy5tazogKE1PRFVMRV9MSVNUKTogUmVtb3ZlZC4KLQkobWFrZV9tb2R1bGVfbGlzdCwgY2xlYW5fbW9kdWxlX2xpc3QpOiBSZXBsYWNlIHRhcmdldHMKLQl3aXRoLi4uCi0JKEZUTU9EVUxFX0hfSU5JVCwgRlRNT0RVTEVfSF9DUkVBVEUsIEZUTU9EVUxFX0hfRE9ORSk6IE5ldwotCXZhcmlhYmxlcy4gIFJlYXNvbiBmb3IgdGhlIGNoYW5nZSBpcyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlCi0JYSBwaG9ueSBwcmVyZXF1aXNpdGUgd2hpY2ggaXMgcnVuIG9ubHkgaWYgdGhlIHRhcmdldCBmaWxlIG11c3QgYmUKLQlyZWJ1aWx0IChwaG9ueSBwcmVyZXF1aXNpdGVzIGFjdCBsaWtlIHN1YnJvdXRpbmVzIGFuZCBhcmUgKmFsd2F5cyoKLQlleGVjdXRlZCkuICBXZSBvbmx5IHdhbnQgdG8gcmVidWlsZCBgZnRtb2R1bGUuaCcgaWYgYG1vZHVsZS5jZmcnIGlzCi0JY2hhbmdlZC4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKCRGVE1PRFVMRV9IKSk6IFJ1bGUgdG8gY3JlYXRlIGBmdG1vZHVsZS5oJywgZGVwZW5kaW5nIG9uCi0JYG1vZHVsZXMuY2ZnJy4KLQotCSogYnVpbGRzL3RvcGxldmVsLm1rOiBSZXdyaXRlIGFuZCBzaW1wbGlmeSBtb2R1bGUgaGFuZGxpbmcuCi0JKE1PRFVMRVNfQ0ZHLCBGVE1PRFVMRV9IKTogTmV3IHZhcmlhYmxlcy4KLQlJbmNsdWRlIE1PRFVMRVNfQ0ZHLgotCShNT0RVTEVTKTogTmV3IHZhcmlhYmxlIHRvIGluY2x1ZGUgYWxsIGBtb2R1bGUubWsnIGFuZCBgcnVsZXMubWsnCi0JZmlsZXMuICBXZSBubyBsb25nZXIgdXNlIG1ha2UncyBgd2lsZGNhcmQnIGZ1bmN0aW9uIGZvciB0aGlzLgotCi0JKiBNYWtlZmlsZSAoVVNFX01PRFVMRVMpOiBSZW1vdmUuICBVcGRhdGUgYWxsIHVzZXJzLgotCShPQkpfRElSKTogRGVmaW5lIGl0IGhlcmUuCi0KLQkqIHNyYy8qL21vZHVsZS5tazogQ2hhbmdlCi0KLQkgICAgbWFrZV9tb2R1bGVfbGlzdDogZm9vCi0JICAgIGZvbzogLi4uCi0KLQl0bwotCi0JICAgIEZUTU9EVUxFX0hfQ09NTUFORFMgKz0gRk9PCi0JICAgIGRlZmluZSBGT08KLQkgICAgLi4uCi0JICAgIGVuZGVmCi0KLQlpbiBhbGwgZmlsZXMuICBgRlRNT0RVTEVfSF9DT01NQU5EUycgaXMgdXNlZCBpbiBgRlRNT0RVTEVfSF9DUkVBVEUnLgotCi0JKiBzcmMvYmFzZS9ydWxlcy5tayAoQkFTRV9FWFRfU1JDKTogVXNlIEJBU0VfRVhURU5TSU9OUy4KLQotCSogYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rIChzZXR1cCk6IEFsd2F5cyBleGVjdXRlIGBjb25maWd1cmUnIHNjcmlwdC4KLQkoaGF2ZV9tayk6IFJlbmFtZSB0by4uLgotCShoYXZlX01ha2VmaWxlKTogVGhpcy4KLQlEb24ndCB1c2UgYHN0cmlwJyBmdW5jdGlvbi4KLQotCSogYnVpbGRzL3VuaXgvdW5peC5tazogSW5jbHVkZSBgaW5zdGFsbC5taycgb25seSBpZiBCVUlMRF9QUk9KRUNUIGlzCi0JZGVmaW5lZC4KLQkoaGF2ZV9tayk6IERvbid0IHVzZSBgc3RyaXAnIGZ1bmN0aW9uLgotCVRlc3QgZm9yIHVuaXgtZGVmLm1rIGluIE9CSl9ESVIsIG5vdCBCVUlMRF9ESVIgKGFuZCBpbnZlcnQgdGhlIHRlc3QKLQlhY2NvcmRpbmdseSkuCi0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwsIHVuaW5zdGFsbCk6IEhhbmRsZSBgZnRtb2R1bGUuaCcuCi0KLQkqIGJ1aWxkcy9vczIvb3MyLWRldi5taywgYnVpbGRzL3VuaXgvdW5peC1kZXYubWssCi0JYnVpbGRzL3dpbjMyL3czMi1iY2NkLm1rLCBidWlsZHMvd2luMzIvdzMyLWRldi5tazogRG9uJ3QgZGVmaW5lCi0JQlVJTERfRElSIGJ1dCBERVZFTF9ESVIgZm9yIGRldmVsb3BtZW50IGhlYWRlciBmaWxlcy4KLQotCSogYnVpbGRzL2Fuc2kvYW5zaS1kZWYubWsgKFRPUF9ESVIsIE9CSl9ESVIpLAotCWJ1aWxkcy9iZW9zL2Jlb3MtZGVmLm1rIChUT1BfRElSLCBPQkpfRElSKSwgYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4KLQkoVE9QX0RJUiwgT0JKX0RJUik6IFJlbW92ZWQuICBEZWZpbmVkIGVsc2V3aGVyZS4KLQotCSogYnVpbGRzL2Rvcy9kb3MtZGVmLm1rIChPQkpfRElSKSwgYnVpbGRzL29zMi9vczItZGVmLm1rIChPQkpfRElSKSwKLQlidWlsZHMvd2luMzIvd2luMzItZGVmLm1rIChPQkpfRElSKTogUmVtb3ZlZC4gIERlZmluZWQgZWxzZXdoZXJlLgotCi0JKiBidWlsZHMvdW5peC91bml4ZGRlZi5tazogRG9uJ3QgZGVmaW5lIEJVSUxEX0RJUiBidXQgREVWRUxfRElSIGZvcgotCWRldmVsb3BtZW50IGhlYWRlciBmaWxlcy4KLQlEb24ndCBkZWZpbmUgUExBVEZPUk0uCi0KLQkqIGNvbmZpZ3VyZTogQ29weSBgbW9kdWxlcy5jZmcnIHRvIGJ1aWxkZGlyIGlmIGJ1aWxkZGlyICE9IHNyY2Rpci4KLQlVcGRhdGUgc25pcHBldCB0YWtlbiBmcm9tIGF1dG9jb25mJ3MgbTRzaC5tNCB0byBjdXJyZW50IENWUyB2ZXJzaW9uLgotCUJlIG1vcmUgdmVyYm9zZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaDogQWRkIGNvbW1lbnRzIC0tIHRoaXMgZmlsZSBpcwotCW5vIGxvbmdlciB1c2VkIGlmIEZyZWVUeXBlIGlzIGJ1aWx0IHdpdGggR05VIG1ha2UuCi0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9DVVNUT01JWkUsIGRvY3MvSU5TVEFMTCwgZG9jcy9JTlNUQUxMLkFOWSwKLQlkb2NzL0lOU1RBTEwuR05VLCBkb2NzL0lOU1RBTEwuVU5YOiBEb2N1bWVudCBuZXcgYnVpbGQgbWVjaGFuaXNtLgotCU90aGVyIG1pbm9yIHVwZGF0ZXMuCi0KLQkqIG1vZHVsZXMudHh0OiBSZW1vdmVkLiAgQ29udGVudHMgaW5jbHVkZWQgaW4gYG1vZHVsZXMuY2ZnJy4KLQotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmggKEZUX1FBbGxvY19EZWJ1ZywKLQlGVF9GcmVlX0RlYnVnKSBbRlRfU1RSSUNUX0FMSUFTSU5HXTogRml4IHR5cG9zLgotCi0JKiBzcmMvYmFzZS9mdGRiZ21lbS5jIChGVF9BbGxvY19EZWJ1ZywgRlRfUmVhbGxvY19EZWJ1ZywKLQlGVF9RQWxsb2NfRGVidWcsIEZUX1FSZWFsbG9jX0RlYnVnLCBGVF9GcmVlX0RlYnVnKQotCVtGVF9TVFJJQ1RfQUxJQVNJTkddOiBJbXBsZW1lbnQuCi0KLTIwMDYtMDEtMzEgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCksIHNyYy9jaWQvY2lkb2Jqcy5jCi0JKGNpZF9mYWNlX2luaXQpLCBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfaW5pdCksCi0Jc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0luaXQpOiBTZXQgZmFjZS0+aGVpZ2h0IHRvIE1BWCgxLjIgKgotCXVuaXRzX3Blcl9FTSwgYXNjZW5kZXIgLSBkZXNjZW5kZXIpLgotCi0yMDA2LTAxLTMxICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggKEFGTV9Gb250SW5mbyksCi0Jc3JjL3BzYXV4L2FmbXBhcnNlLmMsIHNyYy90b29scy90ZXN0X2FmbS5jOiBSZWFkIGBGb250QkJveCcsCi0JYEFzY2VuZGVyJywgYW5kIGBEZXNjZW5kZXInIGZyb20gYW4gQUZNLgotCi0JKiBzcmMvdHlwZTEvdDFhZm0uYyAoVDFfUmVhZF9NZXRyaWNzKTogVXNlIHRoZSBtZXRyaWNzIGZyb20gdGhlIEFGTS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9GYWNlUmVjKTogTWVudGlvbiB0aGF0IGZpZWxkcyBtYXkKLQliZSBjaGFuZ2VkIGFmdGVyIGZpbGUgYXR0YWNobWVudC4KLQotMjAwNi0wMS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvKi9tb2R1bGUubWsgKC5QSE9OWSk6IEFkZC4KLQotMjAwNi0wMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBSRUFETUUsIGRvY3MvRlRMLlRYVDogRml4IGVtYWlsIGFkZHJlc3MgZm9yIGJ1ZyByZXBvcnRzLgotCU90aGVyIG1pbm9yIGZvcm1hdHRpbmcuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmg6IFN5bmNocm9uaXplIHdpdGgKLQlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oLgotCi0JKiBzcmMvYXV0b2ZpdC9tb2R1bGUubWsgKGFkZF9hdXRvZml0X21vZHVsZSksIHNyYy9iZGYvbW9kdWxlLm1rCi0JKGFkZF9iZGZfbW9kdWxlKSwgc3JjL3R5cGU0Mi9tb2R1bGUubWsgKGFkZF90eXBlNDJfZHJpdmVyKTogRml4Ci0Jd2hpdGVzcGFjZS4KLQotCSogc3JjL3Ntb290aC9tb2R1bGUubWsgKGFkZF9zbW9vdGhfcmVuZGVyZXIpOiBBZGQgbGNkIGFuZCBsY2R2Ci0JcmVuZGVyZXIgY2xhc3Nlcy4KLQotMjAwNi0wMS0yNyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IEZpeCBidWlsZCBwcm9ibGVtIG9uIEN5Z3dpbi4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5tayAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgdGhlIGludGVybmFsCi0JaGVhZGVycywgYW5kIHJlbW92ZSBleGlzdGluZyBvbmVzIGlmIGZvdW5kIGluIHRoZSB0YXJnZXQgaW5zdGFsbAotCWRpcmVjdG9yeS4KLQotCSogc3JjL2F1dG9maXQvYWZ3YXJwLmM6IEFkZCBzaW1wbGUgI2lmZGVmIHRvIHByZXZlbnQgY29tcGlsYXRpb24KLQlpZiB0aGUgd2FycCBoaW50ZXIgaXNuJ3QgYWN0aXZlIChpdCBzaG91bGRuJ3QsIHN0aWxsIGV4cGVyaW1lbnRhbCkuCi0KLQkqIEphbWZpbGUsIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmg6IFJlbW92ZSBgZ3h2YWxpZCcKLQlhbmQgYG90dmFsaWQnIGZyb20gdGhlIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGFyZSBsaW5rZWQgc3RhdGljYWxseQotCXRvIGEgZ2l2ZW4gRnJlZVR5cGUgbGlicmFyeS4gIEZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gbW92ZWQgdG8gdGhlCi0JYGZ0dmFsaWQnIENWUyBtb2R1bGUuCi0KLQlOb3RlIGFsc28gdGhhdCBjdXJyZW50IE1ha2UtYmFzZWQgYnVpbGQgc3lzdGVtIHN0aWxsIGNvbXBpbGVzIHRoZQotCW1vZHVsZXMgdGhvdWdoLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIChGVF9TVFJJQ1RfQUxJQVNJTkcpOiBOZXcgbWFjcm8KLQl3aGljaCBjb250cm9scyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyB0bwotCWF2b2lkIHdhcm5pbmdzIHdpdGggcmVjZW50IHZlcnNpb25zIG9mIEdDQy4gIFRoaXMgbWFjcm8gaXMgb25seSBoZXJlCi0JdG8gYmUgZGlzYWJsZWQsIGluIGNhc2Ugd2UgZGV0ZWN0IHByb2JsZW1zIHdpdGggdGhlIG5ldyBzY2hlbWUuCi0KLQlOT1RFOiBEaXNhYmxlIG1hY3JvIHRvIHVzZSB0aGUgbWVtb3J5IGRlYnVnZ2VyIC0tIHRoaXMgd2lsbCBiZSBmaXhlZAotCSAgICAgIGxhdGVyIQotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmgsIHNyYy9iYXNlL2Z0dXRpbC5jIChGVF9BbGxvYywKLQlGVF9RQWxsb2MsIEZUX1JlYWxsb2MsIEZUX1FSZWFsbG9jLCBGVF9GcmVlKSBbRlRfU1RSSUNUX0FMSUFTSU5HXToKLQlOZXcgdmVyc2lvbnMuCi0KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwOiBVcGRhdGluZyBwcm9qZWN0IGZpbGUgdG8KLQlkZWZpbmUgRlQyX0JVSUxEX0xJQlJBUlksIGFuZCByZW1vdmUgZ3h2YWxpZCArIG90dmFsaWQgbW9kdWxlcyBmcm9tCi0JY29tcGlsYXRpb24uCi0KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChGVF9DRkxBR1MpLCBKYW1maWxlIChERUZJTkVTKTogRGVmaW5lIHRoZQotCW1hY3JvIEZUMl9CVUlMRF9MSUJSQVJZIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oOiBSZW1vdmUgaW5jbHVzaW9ucyBvZiBpbnRlcm5hbAotCWhlYWRlcnMgZXhjZXB0IGlmIHRoZSBtYWNybyBGVDJfQlVJTERfTElCUkFSWSBpcyBkZWZpbmVkLgotCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoQUZNX0tlcm5QYWlyLCBBRk1fVHJhY2tLZXJuLAotCUFGTV9Gb250SW5mbyk6IE1vdmUgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmg6IFRoaXMgZmlsZS4KLQotCi0JKiAobWFueSBmaWxlcyk6IEZpeCBjb21waWxlciB3YXJuaW5ncy4KLQlWYXJpb3VzIG1pbm9yIHJlb3JnYW5pemF0aW9ucy4KLQotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2ZvbnRfZG9uZSk6IERvbid0IGZyZWUgc3RhdGljIGFycmF5Ci0JYHN1YmZvbnRzJy4KLQotCSogc3JjL290dmFsaWQvb3R2Y29tbW4uYyAob3R2X0NsYXNzRGVmX3ZhbGlkYXRlKSwKLQlzcmMvb3R2YWxpZC9vdHZncG9zLmMgKG90dl94X3N4eSk6IEZpeCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLQotCUdldCByaWQgb2Ygd3JpdGFibGUgc3RhdGljIHZhcmlhYmxlcyAoaS5lLiwgdGhlIHN0cmluZyB0YWJsZSkgaW4KLQlhZm1wYXJzZSwgYW5kIGZpeCBjb21waWxhdGlvbiBpbiBGVDJfTVVMVEkgbW9kZS4KLQotCSogc3JjL3BzYXV4L2FmbXBhcnNlLmM6IEluY2x1ZGUgZnQyYnVpbGQuaCBhbmQgRlRfRlJFRVRZUEVfSC4KLQkoQUZNX01BWF9BUkdVTUVOVFMpOiBEZWZpbmUuLi4KLQkqIHNyYy9wc2F1eC9hZm1wYXJzZS5oOiBIZXJlLgotCSogc3JjL3BzYXV4L0phbWZpbGUgKF9zb3VyY2VzKTogQWRkIGFmbXBhcnNlLgotCi0JKiBzcmMvcHNhdXgvcHNjb252LmM6IEluY2x1ZGUgcHNjb252LmguCi0KLQkqIHNyYy90eXBlMS90MWFmbS5jOiBEb24ndCBpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0ggYnV0Ci0JRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSC4KLQkqIHNyYy90eXBlMS90MWFmbS5oOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0guCi0KLTIwMDYtMDEtMjMgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX1NlbGVjdF9TaXplKTogUmVuYW1lIHRoZSBzZWNvbmQKLQlhcmd1bWVudCBmcm9tIGBpZHgnIHRvIGBzdHJpa2VfaW5kZXgnLgotCShGVF9TaXplX1JlcXVlc3RfVHlwZSk6IEFkZCBGVF9TSVpFX1JFUVVFU1RfVFlQRV9NQVggdG8gdGhlIGVuZCBvZgotCXRoaXMgZW51bS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfUkVRVUVTVF9XSURUSCwKLQlGVF9SRVFVRVNUX0hFSUdIVCk6IE5ldyBtYWNyb3MgdG8gZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGEKLQlyZXF1ZXN0LCBpbiBmcmFjdGlvbmFsIHBpeGVscy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfU2VsZWN0X01ldHJpY3MsCi0JRlRfUmVxdWVzdF9NZXRyaWNzKSwgc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1NlbGVjdF9NZXRyaWNzLAotCUZUX1JlcXVlc3RfTWV0cmljcyk6IE5ldyBiYXNlIGZ1bmN0aW9ucyB0byBzZXQgdGhlIGZvbnQgbWV0cmljcy4gIFRoZXkKLQl3ZXJlIHBhcnQgb2YgRlRfU2VsZWN0X1NpemUvRlRfUmVxdWVzdF9TaXplIGFuZCBhcmUgbWFkZSBpbmRlcGVuZGVudAotCWZ1bmN0aW9ucyBzbyB0aGF0IG1ldHJpY3MgYXJlIG5vdCBzZXQgYWdhaW4gYW5kIGFnYWluLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfU2VsZWN0X1NpemUsIEZUX1JlcXVlc3RfU2l6ZSk6IE1ldHJpY3MgYXJlIHNldAotCW9ubHkgd2hlbiBkcml2ZXIncyBzaXplX3NlbGVjdC9zaXplX3JlcXVlc3QgaXMgTlVMTC4gIFRoYXQgaXMsIGRyaXZlcnMKLQlzaG91bGQgc2V0IHRoZSBtZXRyaWNzIHRoZW1zZWx2ZXMuCi0JKEZUX01hdGNoX1NpemUpOiBSb3VuZCBiZWZvcmUgbWF0Y2hpbmcuICBUaGlzIHdhcyB3aGF0IHdlIGRpZCBhbmQgaXQKLQlkb2VzIGNhdXNlIHNvbWUgcHJvYmxlbXMgd2l0aG91dCByb3VuZGluZy4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9zaXplX3NlbGVjdCksIHNyYy90cnVldHlwZS90dGRyaXZlci5jCi0JKHR0X3NpemVfc2VsZWN0KTogU2V0IHRoZSBmb250IG1ldHJpY3MuCi0Jcy9pbmRleC9zdHJpa2VfaW5kZXgvLgotCVRoZSBzY2FsZWQgbWV0cmljcyBhcmUgYWx3YXlzIHByZWZlcnJlZCBvdmVyIHN0cmlrZXMnIG1ldHJpY3MsIGV2ZW4KLQl3aGVuIHNvbWUgc3RyaWtlIGlzIHNlbGVjdGVkLiAgVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIHN0cmlrZXMnCi0JbWV0cmljcyBhcmUgbm90IHJlbGlhYmxlLCBlLmcuLCB0aGUgc2lnbiBvZiB0aGUgZGVzY2VuZGVyIGlzIHdyb25nIGZvcgotCXNvbWUgZm9udHMuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfc2l6ZV9yZXF1ZXN0KSwgc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMKLQkodHRfc2l6ZV9yZXF1ZXN0KTogU2V0IHRoZSBmb250IG1ldHJpY3MuCi0JQ2FsbCBjZmZfc2l6ZV9zZWxlY3QvdHRfc2l6ZV9zZWxlY3Qgd2hlbiBzb21lIHN0cmlrZSBpcyBtYXRjaGVkLgotCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMsIHNyYy9jZmYvY2Zmb2Jqcy5jLCBzcmMvY2lkL2NpZG9ianMuYywKLQlzcmMvcGNmL3BjZmRyaXZyLmMsIHNyYy90cnVldHlwZS90dGRyaXZlci5jLCBzcmMvdHlwZTEvdDFvYmpzLmMsCi0Jc3JjL3R5cGUxL3Qxb2Jqcy5oLCBzcmMvdHlwZTQyL3Q0Mm9ianMuYywgc3JjL3dpbmZvbnRzL3dpbmZudC5jOgotCVNldCB0aGUgZm9udCBtZXRyaWNzLgotCXMvaW5kZXgvc3RyaWtlX2luZGV4Ly4KLQotCSogc3JjL3Rvb2xzL3Rlc3RfYWZtLmMsIHNyYy9wc2F1eC9wc2NvbnYuYzogT2xkZXIgdmVyc2lvbnMgb2YgdGhlc2UKLQlmaWxlcyB3ZXJlIGNvbW1pdHRlZC4gIEp1c3QgYSBjYXRjaC11cC4KLQkoUFNfQ29udl9Ub0ZpeGVkKTogUmVtb3ZlIHRoZSBgZ290bycuCi0JKFBTX0NvbnZfQVNDSUlIZXhEZWNvZGUsIFBTX0NvbnZfRWV4ZWNEZWNvZGUpOiBTcGVlZCB1cCBhIGxpdHRsZS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zYml0X3N0cmlrZXMsCi0JdHRfZmFjZV9sb2FkX3N0cmlrZV9tZXRyaWNzKSwgc3JjL3NmbnQvdHRzYml0MC5jCi0JKHR0X2ZhY2VfbG9hZF9zYml0X3N0cmlrZXMsIHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcyk6IFRoZQotCWFkdmVydGlzZWQgbWV0cmljcyBpbiBgYXZhaWxhYmxlX3NpemVzJyBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UKLQlhY3R1YWxseSB1c2VkLgotCi0yMDA2LTAxLTIzICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL3BzYXV4L3BzYXV4LmMgc3JjL3BzYXV4L3BzYXV4bW9kLmMgc3JjL3R5cGUxL3QxZHJpdmVyLmM6IE1ha2UKLQlBRk0gcGFyc2VyIG9wdGlvbmFsLCBjb250cm9sbGVkIGJ5IGBUMV9DT05GSUdfT1BUSU9OX05PX0FGTScuCi0KLTIwMDYtMDEtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC1zaCwgYnVpbGRzL3VuaXgvbWtpbnN0YWxsZGlyczogVXBkYXRlZCBmcm9tCi0JYHRleGluZm8nIENWUyBtb2R1bGUgYXQgc2F2YW5uYWguZ251Lm9yZy4KLQotMjAwNi0wMS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9ydWxlcy5tayAoQVVUT0ZfRFJWX1NSQyk6IEFkZCBhZndhcnAuYy4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyk6IE1vdmUgQUZfVVNFX1dBUlBFUiB1cAotCXRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZndhcnAuYyAoYWZfd2FycGVyX2NvbXB1dGVfbGluZV9iZXN0KTogUmVtb3ZlCi0Jc2hhZG93aW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KLQlGaXggd2FybmluZyBwYXJhbWV0ZXJzIGFuZCByZXBsYWNlIHByaW50ZiB3aXRoIEFGX0xPRy4KLQkoYWZfd2FycGVyX2NvbXB1dGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCi0yMDA2LTAxLTIwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlBZGRpbmcgZXhwZXJpbWVudGFsIGltcGxlbWVudGF0aW9uIG9mIGB3YXJwIGhpbnRpbmcnIChuZXcgaGludGluZwotCWFsZ29yaXRobSBmb3IgZ3JheS1sZXZlbCBhbmQgTENEIHJlbmRlcmluZykuICBJdCBpcyBkaXNhYmxlZCBieQotCWRlZmF1bHQsIHlvdSBuZWVkIHRvICNkZWZpbmUgQUZfVVNFX1dBUlBFUiBpbiBhZnR5cGVzLmguCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfc2NhbGVfZGltKSBbQUZfVVNFX1dBUlBFUl06Ci0JTmV3IGZ1bmN0aW9uLgotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgW0FGX1VTRV9XQVJQRVJdOiBJbmNsdWRlIGFmd2FycC5oLgotCShhZl9sYXRpbl9oaW50c19pbml0KSBbQUZfVVNFX1dBUlBFUl06IFJlc2V0IG1vZGUgdG8KLQlGVF9SRU5ERVJfTU9ERV9OT1JNQUwgaWYgYW4gTENEIG1vZGUgaXMgc2VsZWN0ZWQuCi0JKGFmX2xhdGluX2hpbnRzX2FwcGx5KSBbQUZfVVNFX1dBUlBFUl06IENhbGwgYWZfd2FycGVyX2NvbXB1dGUKLQlhcHByb3ByaWF0ZWx5LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nKSBbIUFGX1VTRVJfV0FSUEVSXToKLQlJc29sYXRlIGNvZGUgZm9yIGFkanVzdGluZyBtZXRyaWNzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggKEFGX1VTRV9XQVJQRVIpOiBOZXcgbWFjcm8gKGNvbW1lbnRlZCBvdXQgYnkKLQlkZWZhdWx0KS4KLQotCSogc3JjL2F1dG9maXQvYWZ3YXJwLmMsIHNyYy9hdXRvZml0L2Fmd2FycC5oOiBOZXcgZmlsZXMuCi0KLQkqIHNyYy9hdXRvZml0L2F1dG9maXQuYyBbQUZfVVNFX1dBUlBFUl06IEluY2x1ZGUgYWZ3YXJwLmMuCi0KLQkqIHNyYy9hdXRvZml0L0phbWZpbGUgKF9zb3VyY2VzKTogQWRkIGFmd2FycC4KLQotMjAwNi0wMS0xOSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvc2ZudC90dHNiaXQwLmMgKHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcyk6IEZpeCBzbWFsbCBidWcKLQl0aGF0IHByZXZlbnRlZCBjb21waWxhdGlvbiB3aGVuIEZUX09QVElNSVpFX01FTU9SWSBpcyBkZWZpbmVkLgotCi0yMDA2LTAxLTE5ICBCcmlhbiBXZWVkICA8YndAaW1hZ2luZW5naW5lLmNvbT4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwOiBVcGRhdGVkLgotCi0yMDA2LTAxLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlVc2UgcHNjbWFwIHNlcnZpY2UgaW4gQ0ZGIG1vZHVsZS4KLQotCSogc3JjL2NmZi9jZmZjbWFwLmMgKGNmZl9jbWFwX3VuaV9wYWlyX2NvbXBhcmUpOiBSZW1vdmVkLgotCShjZmZfc2lkX3RvX2dseXBoX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNmZl9jbWFwX3VuaWNvZGVfaW5pdCwgY2ZmX2NtYXBfdW5pY29kZV9kb25lLAotCWNmZl9jbWFwX3VuaWNvZGVfY2hhcl9pbmRleCwgY2ZmX2NtYXBfdW5pY29kZV9jaGFyIG5leHQpOiBVc2UgcHNjbWFwCi0Jc2VydmljZS4KLQkoY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMpOiBVcGRhdGVkLgotCSogc3JjL2NmZi9jZmZjbWFwLmggKENGRl9DTWFwVW5pY29kZSwgQ0ZGX0NNYXBfVW5pUGFpcik6IFJlbW92ZWQuCi0KLQotCSogc3JjL3BzbmFtZXMvcHNtb2R1bGUuYyAocHNfdW5pY29kZXNfY2hhcl9uZXh0KTogRml4IGB1bmljb2RlJwotCXJldHVybiB2YWx1ZS4KLQotCi0JKiBzcmMvcHNhdXgvYWZtcGFyc2UuYyAoYWZtX3BhcnNlcl9yZWFkX3ZhbHMpOiBVc2UgZG91YmxlIGNhc3RpbmcKLQl0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyByZWdhcmRpbmcgdHlwZS1wdW5uaW5nLgotCi0yMDA2LTAxLTE2ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL3BzYXV4L2FmbXBhcnNlLmMsIHNyYy9wc2F1eC9hZm1wYXJzZS5oOiBOZXcgZmlsZXMgd2hpY2gKLQlpbXBsZW1lbnQgYW4gQUZNIHBhcnNlci4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jLCBzcmMvcHNhdXgvcHNjb252Lmg6IE5ldyBmaWxlcyB0byBwcm92aWRlCi0JY29udmVyc2lvbiBmdW5jdGlvbnMgKGUuZy4sIFBTIHJlYWwgbnVtYmVyID0+IEZUX0ZpeGVkKSBmb3IgdGhlCi0JUFNfUGFyc2VyIGFuZCBBRk1fUGFyc2VyLiAgU29tZSBvZiB0aGUgZnVuY3Rpb25zIGFyZSB0YWtlbiwgd2l0aAotCXNvbWUgbW9kaWZpY2F0aW9ucywgZnJvbSB0aGUgZmlsZSBwc29ianMuYy4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jOiBVc2UgZnVuY3Rpb25zIGZyb20gcHNjb252LmMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCwgc3JjL3BzYXV4L3BzYXV4bW9kLmM6IEFkZAotCWBBRk1fUGFyc2VyJyB0byB0aGUgYHBzYXV4JyBzZXJ2aWNlLgotCi0JKiBzcmMvcHNhdXgvcHNhdXguYywgc3JjL3BzYXV4L3J1bGVzLm1rIChQU0FVWF9EUlZfU1JDKTogSW5jbHVkZQotCXRob3NlIG5ldyBmaWxlcy4KLQotCSogc3JjL3Rvb2xzL3Rlc3RfYWZtLmM6IEEgdGVzdCBwcm9ncmFtIGZvciBBRk0gcGFyc2VyLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oOiBOZXcgZmlsZSBwcm92aWRpbmcgYQotCWBLZXJuaW5nJyBzZXJ2aWNlLiAgSXQgaXMgY3VycmVudGx5IG9ubHkgdXNlZCB0byBnZXQgdGhlIHRyYWNrCi0Ja2VybmluZyBpbmZvcm1hdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCAoRlRfU0VSVklDRV9LRVJOSU5HX0gpOiBOZXcKLQltYWNyby4KLQotCSogc3JjL3R5cGUxL3QxZHJpdmVyLmMsIHNyYy90eXBlMS90MW9ianMuYywgc3JjL3R5cGUxL3QxYWZtLmMsCi0Jc3JjL3R5cGUxL3QxYWZtLmg6IFVwZGF0ZSB0byB1c2UgdGhlIEFGTSBwYXJzZXIuCi0JUHJvdmlkZSB0aGUgYEtlcm5pbmcnIHNlcnZpY2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCwgc3JjL2Jhc2UvZnRvYmpzLmM6IE5ldyBBUEkKLQlgRlRfR2V0X1RyYWNrX0tlcm5pbmcnLgotCi0yMDA2LTAxLTE1ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCwgc3JjL2Jhc2UvZnRvYmpzLmMsCi0Jc3JjL2JkZi9iZGZkcml2ci5jLCBzcmMvY2ZmL2NmZmdsb2FkLmMsIHNyYy9jaWQvY2lkZ2xvYWQuYywKLQlzcmMvcGNmL3BjZmRyaXZyLmMsIHNyYy90eXBlMS90MWdsb2FkLmMsIHNyYy93aW5mb250cy93aW5mbnQuYzoKLQlzL2Z0X2Zha2VfdmVydGljYWxfbWV0cmljcy9mdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MvLgotCi0JKiBkb2NzL0NIQU5HRVM6IE1lbnRpb24gdGhhdCB2ZXJ0aWNhbCBtZXRyaWNzIGFyZSBzeW50aGVzaXplZCBmb3IKLQlmb250cyBub3QgaGF2aW5nIHRoaXMgaW5mby4KLQotMjAwNi0wMS0xNSAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKGZ0X2Zha2VfdmVydGljYWxfbWV0cmljcyksCi0Jc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2Zha2VfdmVydGljYWxfbWV0cmljcyk6IE5ldyBmdW5jdGlvbiB0byBmYWtlCi0JdmVydGljYWwgbWV0cmljcy4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jLCBzcmMvY2lkL2NpZGdsb2FkLmMsIHNyYy9wY2YvcGNmZHJpdnIuYywKLQlzcmMvdHlwZTEvdDFnbG9hZC5jLCBzcmMvd2luZm9udHMvd2luZm50LmM6IEZha2UgdmVydGljYWwgbWV0cmljcywKLQl3aGljaCBhcmUgbW9ub3RvbmUuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGNvbXB1dGVfZ2x5cGhfbWV0cmljcyk6IFNvbWUgZml4ZXMgYW5kCi0JZm9ybWF0dGluZ3MgaW4gdmVydGljYWwgbWV0cmljcyBmYWtpbmcuICBUaGVyZSBpcyBzdGlsbCByb29tIGZvcgotCWltcHJvdmVtZW50cyAoYW5kIHNvIGRvZXMgdGhlIENGRiBtb2R1bGUpLgotCi0yMDA2LTAxLTE1ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfR2x5cGhfTG9hZCksIHNyYy9wY2YvcGNmZHJpdnIuYwotCShQQ0ZfR2x5cGhfTG9hZCksIHNyYy93aW5mb250cy93aW5mbnQuYyAoRk5UX0xvYWRfR2x5cGgpOiBEb24ndCBzZXQKLQl0aGUgbGluZWFyIGFkdmFuY2UgZmllbGRzIGFzIHRoZXkgYXJlIG9ubHkgdXNlZCBieSB0aGUgb3V0bGluZQotCWdseXBocy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMgYW5kCi0JY2xhcmlmaWNhdGlvbnMuCi0JVGhlIG1lYW5pbmcgb2YgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCBpcyBjaGFuZ2VkIHNvIHRoYXQgbm8gcmVhbAotCWNoYW5nZSBuZWVkIGJlIG1hZGUgdG8gdGhlIGNvZGUuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogUmVzb2x2ZSBmbGFnIGRlcGVuZGVuY2llcyBhbmQKLQlkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIGF1dG8taGludGVyIGFjY29yZGluZyB0byBkb2N1bWVudGF0aW9uLgotCVRoZXJlIHNob3VsZCB0byBiZSBubyByZWFsIGRpZmZlcmVuY2UuCi0JU29tZSBjaGVja3MgKGUuZy4sIGlzIHRleHQgaGVpZ2h0IHBvc2l0aXZlPykgYWZ0ZXIgdGhlIGdseXBoIGlzCi0JbG9hZGVkLgotCShGVF9TZWxlY3RfU2l6ZSwgRlRfUmVxdWVzdF9TaXplKTogU2NhbGVzIGFyZSBzZXQgdG8gd3JvbmcgdmFsdWVzLgotCUJlIGNhcmVmdWwgdGhhdCBzY2FsZXMgd29uJ3QgYmUgbmVnYXRpdmUuCi0KLTIwMDYtMDEtMTQgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBkb2NzL0NIQU5HRVM6IE1lbnRpb24gdGhlIHNpemUgc2VsZWN0aW9uIGNoYW5nZS4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfU2l6ZV9SZXF1ZXN0LCBCREZfU2l6ZV9TZWxlY3QpLAotCXNyYy9wY2YvcGNmZHJpdnIuYyAoUENGX1NpemVfUmVxdWVzdCwgUENGX1NpemVfU2VsZWN0KSwKLQlzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9TaXplX1JlcXVlc3QsIEZOVF9TaXplX1NlbGVjdCk6IERvIHNpemUKLQltYXRjaGluZyBmb3IgcmVxdWVzdHMgb2YgdHlwZSBOT01JTkFMIGFuZCBSRUFMX0RJTS4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfRmFjZV9Jbml0KTogUHJpbnQgdHJhY2UgbWVzc2FnZSB3aGVuCi0JYHBpeGVsX2hlaWdodCcgaXMgdXNlZCBmb3Igbm9taW5hbCBoZWlnaHQuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9SZXF1ZXN0X1NpemUpOiBDYWxsIGBGVF9NYXRjaF9TaXplJyBpZiB0aGUKLQlmYWNlIGlzIGJpdG1hcCBvbmx5IGFuZCBkcml2ZXIgZG9lc24ndCBwcm92aWRlIGByZXF1ZXN0X3NpemUnLiAgVGhpcwotCWlzIGFkZGVkIG1lcmVseSBmb3IgY29tcGxldGlvbiBhcyBubyBkcml2ZXIgc2F0aXNmaWVzIHRoZSBjb25kaXRpb25zLgotCi0yMDA2LTAxLTEzICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCUludHJvZHVjZSBuZXcgc2l6ZSBzZWxlY3Rpb24gaW50ZXJmYWNlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJpdmVyLmggKHN0cnVjdCBGVF9Ecml2ZXJfQ2xhc3NSZWMpOgotCVJlcGxhY2UgYHNldF9jaGFyX3NpemVzJyBhbmQgYHNldF9waXhlbF9zaXplcycgYnkgYHJlcXVlc3Rfc2l6ZScgYW5kCi0JYHNlbGVjdF9zaXplJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9TZWxlY3RfU2l6ZSwgRlRfU2l6ZV9SZXF1ZXN0X1R5cGUsCi0JRlRfU2l6ZV9SZXF1ZXN0LCBGVF9SZXF1ZXN0X1NpemUsIEZUX1NlbGVjdF9TaXplKSwgc3JjL2Jhc2UvZnRvYmpzLmMKLQkoRlRfU2VsZWN0X1NpemUsIEZUX1JlcXVlc3RfU2l6ZSk6IEFQSSBhZGRpdGlvbnMgdG8gZXhwb3J0IHRoZSBuZXcKLQlzaXplIHNlbGVjdGlvbiBpbnRlcmZhY2UuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfQ2hhcl9TaXplLCBGVF9TZXRfUGl4ZWxfU2l6ZXMpOiBVc2UKLQlgRlRfUmVxdWVzdF9TaXplJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfTWF0Y2hfU2l6ZSksCi0Jc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX01hdGNoX1NpemUpOiBOZXcgZnVuY3Rpb24gdG8gbWF0Y2ggYSBzaXplCi0JcmVxdWVzdCBhZ2FpbnN0IGBhdmFpbGFibGVfc2l6ZXMnLiAgRHJpdmVycyBzdXBwb3J0aW5nIGJpdG1hcCBzdHJpa2VzCi0JY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBgcmVxdWVzdF9zaXplJy4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jLCBzcmMvY2lkL2NpZG9ianMuYywgc3JjL2NpZC9jaWRvYmpzLmgsCi0Jc3JjL2NpZC9jaWRyaXZlci5jLCBzcmMvcGNmL3BjZmRyaXZyLmMsIHNyYy90eXBlMS90MWRyaXZlci5jLAotCXNyYy90eXBlMS90MW9ianMuYywgc3JjL3R5cGUxL3Qxb2Jqcy5oLCBzcmMvdHlwZTQyL3Q0MmRyaXZyLmMsCi0Jc3JjL3R5cGU0Mi90NDJvYmpzLmMsIHNyYy90eXBlNDIvdDQyb2Jqcy5oLCBzcmMvd2luZm9udHMvd2luZm50LmM6Ci0JVXBkYXRlIHRvIG5ldyBzaXplIHNlbGVjdGlvbiBpbnRlcmZhY2UuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL2NmZi9jZmZnbG9hZC5jLCBzcmMvY2ZmL2NmZm9ianMuYywKLQlzcmMvY2ZmL2NmZm9ianMuaCwgc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMsIHNyYy90cnVldHlwZS90dGdsb2FkLmMsCi0Jc3JjL3RydWV0eXBlL3R0b2Jqcy5jLCBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmg6IFVwZGF0ZSB0byBuZXcgc2l6ZQotCXNlbGVjdGlvbiBpbnRlcmZhY2UuCi0JTWFrZSBgc3RyaWtlX2luZGV4JyBGVF9VTG9uZyBhbmQgYWx3YXlzIGRlZmluZWQuCi0JVXNlIGBsb2FkX3N0cmlrZV9tZXRyaWNzJyBwcm92aWRlZCBieSBTRk5UIGludGVyZmFjZS4KLQotMjAwNi0wMS0xMyAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIChTRk5UX0ludGVyZmFjZSk6IE5ldyBtZXRob2QKLQlgbG9hZF9zdHJpa2VfbWV0cmljcycgdXNlZCB0byBsb2FkIHRoZSBzdHJpa2UncyBtZXRyaWNzLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jLCBzcmMvc2ZudC90dHNiaXQuYywgc3JjL3NmbnQvdHRzYml0LmgsCi0Jc3JjL3NmbnQvdHRzYml0MC5jOiBOZXcgZnVuY3Rpb24gYHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcycuCi0KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfZmFjZV9pbml0KTogU2V0IEZUX0JpdG1hcF9TaXplIGNvcnJlY3RseS4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfRmFjZV9Jbml0KTogVXNlIGBub21pbmFsX3BvaW50X3NpemUnIGZvcgotCW5vbWluYWwgc2l6ZSB1bmxlc3MgaXQgaXMgb2J2aW91c2x5IGluY29ycmVjdC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9CaXRtYXBfU2l6ZSk6IFVwZGF0ZSB0aGUgY29tbWVudHMgb24KLQlGTlQgZHJpdmVyLgotCi0yMDA2LTAxLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlQcmVwYXJlIHVzZSBvZiBwc2NtYXAgc2VydmljZSB3aXRoaW4gQ0ZGIG1vZHVsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oOiBJbmNsdWRlCi0JRlRfSU5URVJOQUxfT0JKRUNUU19ILgotCShQU19Vbmljb2RlX0luZGV4X0Z1bmMpOiBSZW1vdmVkLiAgVW51c2VkLgotCShQU19NYWNpbnRvc2hfTmFtZV9GdW5jKTogUmVuYW1lZCB0by4uLgotCShQU19NYWNpbnRvc2hfTmFtZUZ1bmMpOiBUaGlzLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoUFNfQWRvYmVfU3RkX1N0cmluZ3NfRnVuYyk6IFJlbmFtZWQgdG8uLi4KLQkoUFNfQWRvYmVfU3RkX1N0cmluZ3NGdW5jKTogVGhpcy4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKFBTX1VuaWNvZGVzUmVjKTogVGhpcyBpcyB0aGUgZm9ybWVyIGBQU19Vbmljb2Rlcycgc3RydWN0dXJlLgotCUFkZCBgY21hcCcgbWVtYmVyLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoUFNfVW5pY29kZXMpOiBUaGlzIGlzIG5vdyBhIHR5cGVkZWYnZCBwb2ludGVyIHRvIFBTX1VuaWNvZGVzUmVjLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoUFNfR2x5cGhfTmFtZUZ1bmMpOiBOZXcgdHlwZWRlZi4KLQkoUFNfVW5pY29kZXNfSW5pdEZ1bmMpOiBDaGFuZ2UgYXJndW1lbnRzIHRvIGV4cGVjdCBhIGZ1bmN0aW9uCi0JYW5kIGdlbmVyaWMgZGF0YSBwb2ludGVyIHdoaWNoIHJldHVybnMgYSBnbHlwaCBuYW1lIGZyb20gYSBnaXZlbgotCWluZGV4LgotCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jIChwc191bmljb2Rlc19pbml0LCBwc191bmljb2Rlc19jaGFyX2luZGV4LAotCXBzX3VuaWNvZGVzX2NoYXJfbmV4dCwgcHNjbWFwc19pbnRlcmZhY2UpOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCAoVDFfRmFjZVJlYyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9wc2F1eC90MWNtYXAuaCAoVDFfQ01hcFN0ZFJlYyk6IFVwZGF0ZWQuCi0JKFQxX0NNYXBVbmljb2RlLCBUMV9DTWFwVW5pY29kZVJlYyk6IFJlbW92ZWQuCi0KLQkqIHNyYy9wc2F1eC90MWNtYXAuYyAodDFfZ2V0X2dseXBoX25hbWUpOiBOZXcgY2FsbGJhY2sgZnVuY3Rpb24uCi0JKHQxX2NtYXBfdW5pY29kZV9pbml0LCB0MV9jbWFwX3VuaWNvZGVfZG9uZSwKLQl0MV9jbWFwX3VuaWNvZGVfY2hhcl9pbmRleCwgdDFfY21hcF91bmljb2RlX2NoYXJfbmV4dCwKLQl0MV9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjKTogVXBkYXRlZC4KLQotCSogc3JjL3R5cGU0Mi90NDJ0eXBlcy5oIChUNDJfRmFjZVJlYyk6IFVwZGF0ZWQuCi0KLTIwMDYtMDEtMTEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaDogQWRkIGRlY2xhcmF0aW9uIG9mIG5ldyBmdW5jdGlvbnMKLQlGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmIGFuZCBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lIHRoYXQKLQl3ZXJlIGludHJvZHVjZWQgYnkgdGhlIGp1bWJvIHBhdGNoIG9uICAyMDA2LTAxLTExLgotCi0yMDA2LTAxLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMxNTA1NiBhbmQgdXNlIHBzY21hcCBzZXJ2aWNlIGluIHBzYXV4IG1vZHVsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oIChQU19VbmlNYXApOiBVc2UKLQlGVF9VSW50MzIgZm9yIGBnbHlwaF9pbmRleCcuCi0JKFBTX1VuaWNvZGVzX0luaXRGdW5jKTogVXNlIEZUX1N0cmluZyBmb3IgYGdseXBoX25hbWVzJy4KLQkoUFNfVW5pY29kZXNfQ2hhckluZGV4RnVuYyk6IFVzZSBGVF9VSW50MzIgZm9yIGB1bmljb2RlJy4KLQkoUFNfVW5pY29kZXNfQ2hhck5leHRGdW5jKTogTWFrZSBzZWNvbmQgYXJndW1lbnQgYSBwb2ludGVyIHRvCi0JRlRfVUludDMyLgotCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jIChWQVJJQU5UX0JJVCwgQkFTRV9HTFlQSCk6IE5ldyBtYWNyb3MuCi0JKHBzX3VuaWNvZGVfdmFsdWUpOiBTZXQgVkFSSUFOVF9CSVQgaW4gcmV0dXJuIHZhbHVlIGlmIGdseXBoIGlzIGEKLQl2YXJpYW50IGdseXBoICh0aGlzIGlzLCBpdCBoYXMgbm9uLWxlYWRpbmcgYC4nIGluIGl0cyBuYW1lKS4KLQkoY29tcGFyZV91bmlfbWFwcyk6IFNvcnQgYmFzZSBnbHlwaHMgYmVmb3JlIHZhcmlhbnQgZ2x5cGhzLgotCShwc191bmljb2Rlc19pbml0KTogVXNlIEZUX1N0cmluZyBmb3IgYGdseXBoX25hbWVzJyBhcmd1bWVudC4KLQlSZWFsbG9jYXRlIG9ubHkgaWYgbnVtYmVyIG9mIHVzZWQgZW50cmllcyBpcyBtdWNoIHNtYWxsZXIuCi0JVXBkYXRlZCB0byBoYW5kbGUgdmFyaWFudCBnbHlwaHMuCi0JKHBzX3VuaWNvZGVzX2NoYXJfaW5kZXgsIHBzX3VuaWNvZGVzX2NoYXJfbmV4dCk6IFByZWZlciBiYXNlIGdseXBocwotCW92ZXIgdmFyaWFudCBnbHlwaHMuCi0JU2ltcGxpZnkgY29kZS4KLQotCSogc3JjL3BzYXV4L3QxY21hcC5jICh0MV9jbWFwX3VuaV9wYWlyX2NvbXBhcmUpOiBSZW1vdmVkLgotCSh0MV9jbWFwX3VuaWNvZGVfaW5pdCwgdDFfY21hcF91bmljb2RlX2NoYXJfaW5kZXgsCi0JdDFfY21hcF91bmljb2RlX2NoYXJfbmV4dCk6IFVzZSBwc2NtYXAgc2VydmljZS4KLQkodDFfY21hcF91bmljb2RlX2RvbmUpOiBVcGRhdGVkLgotCi0JKiBzcmMvcHNhdXgvdDFjbWFwLmggKFQxX0NNYXBVbmlQYWlyKTogUmVtb3ZlZC4KLQkoVDFfQ01hcFVuaWNvZGUpOiBVc2UgUFNfVW5pY29kZXMgc3RydWN0dXJlLgotCi0yMDA2LTAxLTExICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JSnVtYm8gcGF0Y2ggdG8gZml4IGBkZXByZWNhdGVkJyB3YXJuaW5nIG9mIGNyb3NzLWJ1aWxkIGZvciBUaWdlciBvbgotCUludGVsLCBhcyByZXBvcnRlZCBieSBTZWFuIE1jQnJpZGUgPHNlYW5Acm9ndWUtcmVzZWFyY2guY29tPiBvbgotCTIwMDUtMDgtMjQuCi0KLQkqIHNyYy9iYXNlL2Z0bWFjLmM6IEhlYXZ5IGNoYW5nZSB0byBidWlsZCB3aXRob3V0IGRlcHJlY2F0ZWQgQ2FyYm9uCi0JZnVuY3Rpb25zIG9uIFRpZ2VyLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWM6IEFkZCBvcHRpb25zIGFuZCBhdXRvY2hlY2tzIGZvciBDYXJib24KLQlmdW5jdGlvbnMgYXZhaWxhYmlsaXRpZXMsIGZvciBNYWNPUyBYLgotCi0JKiBidWlsZHMvbWFjL2FzY2lpMm1wdy5weTogQWRkIGNvbnZlcnRlciBmb3IgY2hhcmFjdGVyIGBcMzA1Jy4KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUubTY4a197ZmFyfGNmbX0ubWFrZS50eHQ6IEFkZCBjb25kaXRpb25hbAotCW1hY3JvcyB0byBhdm9pZCB1bmF2YWlsYWJsZSBmdW5jdGlvbnMuCi0JZnRtYWMuYyBtdXN0IGJlIGNvbXBpbGVkIHdpdGhvdXQgYC1zdHJpY3QgYW5zaScsIGJlY2F1c2UgaXQgZGlzYWJsZXMKLQljcHAgbWFjcm8gdG8gdXNlIFRvb2xCb3ggc3lzdGVtIGNhbGwuCi0KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX3tjbGFzc2ljfGNhcmJvbn0ubWFrZS50eHQ6IEFkZCBjb25kaXRpb25hbAotCW1hY3JvcyB0byBhdm9pZCB1bmF2YWlsYWJsZSBmdW5jdGlvbnMuCi0KLQkqIGJ1aWxkcy9tYWMvUkVBRE1FOiBEZXRhaWxlZCBub3RlcyBvbiBmdW5jdGlvbiBhdmFpbGFiaWxpdGllcy4KLQotCSogZG9jcy9DSEFOR0VTOiBOb3RlcyBhYm91dCAocG9zc2libGUpIGluY29tcGF0aWJpbGl0aWVzLgotCi0yMDA2LTAxLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNi0wMS0wOCAgSHV3IEQgTSBEYXZpZXMgIDxoLmRhdmllczFAcGh5c2ljcy5veC5hYy51az4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oIChGVF9Nb2R1bGVfR2V0X0ZsYWdzKTogTmV3Ci0JZGVjbGFyYXRpb24uCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Nb2R1bGVfR2V0X0ZsYWdzKTogTmV3IGZ1bmN0aW9uLgotCi0yMDA2LTAxLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X2JpdG1hcHMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCi0JYGJpdG1hcHMnLiAgUmVwb3J0ZWQgYnkgWXUgTGVpIDx5dWxlaTBAZ21haWwuY29tPi4KLQotCSogc3JjL2Jhc2UvZnR1dGlsLmMgKGZ0X2hpZ2hwb3cyKTogcy9GVF9CQVNFL0ZUX0JBU0VfREVGLy4KLQlSZXBvcnRlZCBieSBOaWVscyBCb2xkdCA8bmllbHNib2xkdEBnbWFpbC5jb20+LgotCi0yMDA1LTEyLTI4ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvc2ZudC9zZm50L3R0YmRmLmM6IEFkZCBuZXdsaW5lICdcbicgdG8gdGhlIGVuZCBvZiBmaWxlLCBmb3IKLQlNUFcgY29tcGlsZXIuCi0KLTIwMDUtMTItMjMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogSmFtZmlsZSAoUmVmRG9jKSwgZG9jcy9yZWZlcmVuY2UvUkVBRE1FOiBGaXggaXQgc28gdGhhdCBgamFtCi0JcmVmZG9jJyB3b3JrcyBjb3JyZWN0bHkgdG8gZ2VuZXJhdGUgdGhlIEFQSSByZWZlcmVuY2UgaW4KLQlgZG9jcy9yZWZlcmVuY2UnLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChwcmludF9odG1sX2ZpZWxkLAotCXByaW50X2h0bWxfZmllbGRfbGlzdCk6IFVwZGF0ZSB0byBvdXRwdXQgbmljZXIgZmllbGRzIGxpc3RzIGluIHRoZQotCUFQSSByZWZlcmVuY2UuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogRlRfTE9BRF9UQVJHRVRfTElHSFQgbm93Ci0JZm9yY2VzIGF1dG8taGludGluZy4KLQotCSogZnJlZXR5cGUvZnJlZXR5cGUuaDogVXBkYXRpbmcgdGhlIGRvY3VtZW50YXRpb24gZm9yCi0JRlRfTE9BRF9UQVJHRVRfWFhYIGFuZCBGVF9SZW5kZXJfTW9kZSB2YWx1ZXMuCi0KLTIwMDUtMTItMjMgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKEZUX05ld19GYWNlX0Zyb21fU3VpdGNhc2UpOiBDb3VudCBzY2FsYWJsZSBmYWNlcwotCWluIHN1cHBvcnRlZCBmb3JtYXRzIChzZm50LCBMV0ZOKSBvbmx5LCBhbmQgaWdub3JlIGJpdG1hcCBmYWNlcyBpbgotCXVuc3VwcG9ydGVkIGZvcm1hdHMgKGZiaXQsIE5GTlQpLiAgVGhlIG51bWJlciBvZiBhdmFpbGFibGUgZmFjZXMgYXJlCi0JcGFzc2VkIHZpYSBmYWNlLT5udW1fZmFjZXMuICBJZiBiaXRtYXAgZmFjZXMgYXJlIGVtYmVkZGVkIGluIHNmbnQKLQlyZXNvdXJjZSwgZmFjZS0+bnVtX2ZpeGVkX3NpemUgaXMgY29ycmVjdGx5IHNldC4gIEluIHB1YmxpYyBBUEksCi0JRlRfTmV3X0ZhY2UoKSBhbmQgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMoKSBjb3VudCB0aGUgZmFjZXMgYXMKLQlGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUoKSwgd2hpY2ggaWdub3JlcyBORk5UIHJlc291cmNlcy4KLQotCSogZG9jL0NIQU5HRVM6IE1lbnRpb24gdGhlIGNoYW5nZXMuCi0KLTIwMDUtMTItMTcgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVXBkYXRlX01heCk6IFNldCBjdXJyZW50IHNpemUgb2YgYnVmZmVyCi0JY29ycmVjdGx5IChzbyB0aGF0IG1lbW9yeSBkZWJ1ZyBzeXN0ZW0gd29uJ3QgcGFuaWMpLgotCi0yMDA1LTEyLTE2ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoZnRfZ2x5cGhzbG90X2dyaWRfZml0X21ldHJpY3MpLAotCXNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfZ3JpZF9maXRfbWV0cmljcyk6IFJlbW92ZWQuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9yZWNvbXB1dGVfc2NhbGVkX21ldHJpY3MpOiBEbyBub3Qgcm91bmQuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCksIHNyYy9jaWQvY2lkZ2xvYWQuYwotCShjaWRfc2xvdF9sb2FkX2dseXBoKSwgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoY29tcHV0ZV9nbHlwaF9tZXRyaWNzKSwKLQlzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9Mb2FkX0dseXBoKTogRG8gbm90IHJvdW5kIGdseXBoIG1ldHJpY3MuCi0KLQkqIGRvYy9DSEFOR0VTOiBNZW50aW9uIHRoZSBjaGFuZ2VzLgotCi0yMDA1LTEyLTEzICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlDaGFuZ2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMSUdIVCBoaW50aW5nIG1vZGUgdG8gY29tcGxldGVseQotCWRpc2FibGUgaG9yaXpvbnRhbCBoaW50aW5nLiAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZWZmb3J0IHRvCi0JaW50ZWdyYXRlIERhdmlkIENoZXN0ZXIncyBsYXRlc3QgcGF0Y2ggd2l0aG91dCBhZmZlY3RpbmcgdGhlIG90aGVyCi0JaGludGluZyBtb2RlcyBhcyB3ZWxsLgotCi0JTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBmb3JjZSBhdXRvLWhpbnRpbmcgZm9yIGFsbCBmb250cywgaG93ZXZlci4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19yZWxvYWQpOiBEb24ndCBzZXQKLQlzY2FsZXJfZmxhZ3MgaGVyZSBidXQuLi4KLQkoYWZfZ2x5cGhfaGludHNfcmVzY2FsZSk6IEhlcmUuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfaW5pdCk6IERpc2FibGUgaG9yaXpvbnRhbAotCWhpbnRpbmcgZm9yIGBsaWdodCcgaGludGluZyBtb2RlLgotCi0KLQkqIEphbWZpbGU6IFNtYWxsIGZpeCB0byBlbnN1cmUgdGhhdCBmdGV4cG9ydC5zeW0gaXMgcGxhY2VkIGludG8gdGhlCi0Jc2FtZSBsb2NhdGlvbiBhcyBvdGhlciBnZW5lcmF0ZWQgb2JqZWN0cyAoaS5lLiwgd2l0aGluIHRoZSBgb2JqcycKLQlkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4KLQotCi0JQWRkIHN1cHBvcnQgZm9yIGFuIGVtYmVkZGVkIGBCREYgJyB0YWJsZSB3aXRoaW4gU0ZOVC1iYXNlZCBiaXRtYXAKLQlmb250IGZpbGVzLiAgVGhpcyBpcyB1c2VkIHRvIHN0b3JlIGF0b21zICYgcHJvcGVydGllcyBmcm9tIHRoZQotCW9yaWdpbmFsIEJERiBmb250cyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZm9udCBmaWxlLgotCi0JVGhlIGZlYXR1cmUgaXMgY29udHJvbGxlZCBieSBUVF9DT05GSUdfT1BUSU9OX0JERiB3aXRoaW4KLQlgZnRvcHRpb24uaCcgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IEZUX0dldF9CREZfUHJvcGVydHkgZm9yIHRoZXNlCi0JZm9udCBmaWxlcy4KLQotCUF0IHRoZSBtb21lbnQsIHRoaXMgaXMgc3RpbGwgZXhwZXJpbWVudGFsLCB0aGUgQkRGIHRhYmxlIGZvcm1hdAotCWlzbid0IGNhc3QgaW50byBzdG9uZSB5ZXQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmggKFRUX0NPTkZJR19PUFRJT05fQkRGKTogTmV3Ci0JbWFjcm8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmggKGZ0X21lbWNocik6IE5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0JERlJlYywgVFRfQkRGKQotCVtUVF9DT05GSUdfT1BUSU9OX0JERl06IE5ldyBzdHJ1Y3R1cmUuCi0JKFRUX0ZhY2VSZWMpIFtUVF9DT05GSUdfT1BUSU9OX0JERl06IE5ldyBtZW1iZXIgYGJkZicuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdHR0YWdzLmggKFRUQUdfQkRGKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvc2ZudC9KYW1maWxlIChfc291cmNlcyk6IEFkZCB0dGJkZi4KLQotCSogc3JjL3NmbnQvcnVsZXMubWsgKFNGTlRfRFJWX1NSQyk6IEFkZCB0dGJkZi5jLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIFtUVF9DT05GSUdfT1BUSU9OX0JERl06IEluY2x1ZGUgdHRiZGYuaCBhbmQKLQlGVF9TRVJWSUNFX0JERl9ILgotCShzZm50X2dldF9jaGFyc2V0X2l0KSBbVFRfQ09ORklHX09QVElPTl9CREZdOiBOZXcgZnVuY3Rpb24uCi0JKHNmbnRfc2VydmljZV9iZGYpIFtUVF9DT05GSUdfT1BUSU9OX0JERl06IE5ldyBzZXJ2aWNlLgotCShzZm50X3NlcnZpY2VzKSBbVFRfQ09ORklHX09QVElPTl9CREZdOiBBZGQgc2ZudF9zZXJ2aWNlX2JkZi4KLQotCSogc3JjL3NmbnQvc2ZudC5jIFtUVF9DT05GSUdfT1BUSU9OX0JERl06IEluY2x1ZGUgdHRiZGYuYy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgW1RUX0NPTkZJR19PUFRJT05fQkRGXTogSW5jbHVkZSB0dGJkZi5oLgotCShzZm50X2RvbmVfZmFjZSkgW1RUX0NPTkZJR19PUFRJT05fQkRGXTogQ2FsbAotCXR0X2ZhY2VfZnJlZV9iZGZfcHJvcHMuCi0KLQkqIHNyYy9zZm50L3R0YmRmLmgsIHNyYy9zZm50L3R0YmRmLmM6IE5ldyBmaWxlcy4KLQotMjAwNS0xMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9pbml0X2ZhY2UpOiBNb3ZlIHRhZyBjaGVjayB0by4uLgotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHNmbnRfaW5pdCk6IEhlcmUsIGJlZm9yZSBoYW5kbGluZyBUVENzLgotCi0yMDA1LTEyLTA2ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX2luaXQpOiBzaXplLT50dG1ldHJpY3MudmFsaWQgaXMKLQlpbml0aWFsaXplZCB0d2ljZS4KLQlzaXplLT5zdHJpa2VfaW5kZXggaXMgbm90IGluaXRpYWxpemVkLgotCi0yMDA1LTEyLTAyICBUYWVrIEt3YW4oVEspIExlZSAgPHRhZWtsZWVAZ21haWwuY29tPgotCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCk6IFJlcGxhY2UgY2FsbCB0bwotCUZUX05ld19NZW1vcnlfRmFjZSB3aXRoIGNhbGwgdG8gRlRfT3Blbl9GYWNlIHRvIHBhc3MgYHBhcmFtcycuCi0KLTIwMDUtMTEtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBmdGR1bXAncyBgLXYnIG9wdGlvbi4KLQlEb2N1bWVudCBsYXRlc3QgY2hhcm1hcCBjb2RlIGNoYW5nZXMuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jLCBzcmMvc2ZudC90dGNtYXAuaDoKLQlzL1RUX0NNQVBfRkxBR19PVkVSTEFQUEVEL1RUX0NNQVBfRkxBR19PVkVSTEFQUElORy8uCi0KLTIwMDUtMTEtMzAgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDRfY2hhcl9tYXBfYmluYXJ5LAotCXR0X2NtYXAxMl9jaGFyX21hcF9iaW5hcnkpOiBGaXggY29tcGlsZXIgd2FybmluZ3MuCi0KLTIwMDUtMTEtMjkgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JTWFqb3IgdXBkYXRlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdW5zb3J0ZWQgYW5kIG92ZXJsYXBwaW5nCi0Jc2VnbWVudHMgZm9yIGNtYXAgZm9ybWF0IDQuICBGb3Igb3ZlcmxhcHBpbmcgYnV0IHNvcnRlZCBzZWdtZW50cywKLQl3aGljaCBpcyBwcmV2aW91c2x5IGNvbnNpZGVyZWQgdW5zb3J0ZWQsIHdlIHN0aWxsIHVzZSBiaW5hcnkgc2VhcmNoLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuaCAoVFRfQ01hcFJlY18pOiBSZXBsYWNlIGB1bnNvcnRlZCcgYnkgYGZsYWdzJy4KLQkoVFRfQ01BUF9GTEFHX1VOU09SVEVELCBUVF9DTUFQX0ZMQUdfT1ZFUkxBUFBFRCk6IE5ldyBtYWNyb3MuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jIChPUFRfQ01BUDQpOiBSZW1vdmVkIGFzIGl0IGlzIGFsd2F5cyBkZWZpbmVkLgotCShUVF9DTWFwNFJlY18pOiBSZW1vdmUgYG9sZF9jaGFyY29kZScgYW5kIGB0YWJsZV9sZW5ndGgnLgotCSh0dF9jbWFwNF9yZXNldCk6IFJlbW92ZWQuCi0JKHR0X2NtYXA0X2luaXQpOiBVcGRhdGVkIGFjY29yZGluZ2x5LgotCSh0dF9jbWFwNF9uZXh0KTogVXBkYXRlZCBhY2NvcmRpbmdseS4KLQlUYWtlIGNhcmUgb2Ygb3ZlcmxhcHBpbmcgc2VnbWVudHMuCi0JKHR0X2NtYXA0X3ZhbGlkYXRlKTogTWFrZSBzdXJlIHRoZSBzdWJ0YWJsZSBpcyBsYXJnZSBlbm91Z2guCi0JRG8gbm90IGNoZWNrIGdseXBoX2lkcyBiZWNhdXNlIHNvbWUgZm9udHMgc2V0IHRoZSBsZW5ndGggd3JvbmdseS4KLQlBbHNvLCBpZiBhbGwgc2VnbWVudHMgaGF2ZSBvZmZzZXQgMCwgZ2x5cGhfaWRzIGlzIGFsd2F5cyBpbnZhbGlkLgotCUl0IGRvZXMgbm90IGNhdXNlIGFueSBwcm9ibGVtIHNvIGZhciBvbmx5IGJlY2F1c2UgdGhlIGNoZWNrIG1pc3NlcwotCWVxdWFsaXR5LgotCURpc3Rpbmd1aXNoIGJldHdlZW4gdW5zb3J0ZWQgYW5kIG92ZXJsYXBwaW5nIHNlZ21lbnRzLgotCSh0dF9jbWFwNF9jaGFyX21hcF9saW5lYXIsIHR0X2NtYXA0X2NoYXJfbWFwX2JpbmFyeSk6IE5ldyBmdW5jdGlvbnMKLQl0byBkbyBgY2hhcmNvZGUgPT4gZ2x5cGggaW5kZXgnIGJ5IGxpbmVhci9iaW5hcnkgc2VhcmNoLgotCSh0dF9jbWFwNF9jaGFyX2luZGV4LCB0dF9jbWFwNF9jaGFyX25leHQpOiBVc2UKLQl0dF9jbWFwNF9jaGFyX21hcF9saW5lYXIgYW5kIHR0X2NtYXA0X2NoYXJfbWFwX2JpbmFyeS4KLQkodHRfZmFjZV9idWlsZF9jbWFwcyk6IFRyZWF0IHRoZSByZXR1cm4gdmFsdWUgb2YgdmFsaWRhdG9yIGFzIGZsYWdzCi0JZm9yIGNtYXAuCi0KLTIwMDUtMTEtMjkgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAoVFRfQ01hcDEyUmVjXywgdHRfY21hcDEyX2luaXQsIHR0X2NtYXAxMl9uZXh0KToKLQlOZXcgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBmYXN0IGBuZXh0IGNoYXInLgotCSh0dF9jbWFwMTJfY2hhcl9tYXBfYmluYXJ5KTogTmV3IGZ1bmN0aW9uIHRvIGRvIGBjaGFyY29kZSA9PiBnbHlwaAotCWluZGV4JyBieSBiaW5hcnkgc2VhcmNoLgotCSh0dF9jbWFwMTJfY2hhcl9pbmRleCwgdHRfY21hcDEyX2NoYXJfbmV4dCk6IFVzZQotCXR0X2NtYXAxMl9jaGFyX21hcF9iaW5hcnkuCi0JKHR0X2ZhY2VfYnVpbGRfY21hcHMpOiBDaGVjayB0YWJsZSBhbmQgb2Zmc2V0IGNvcnJlY3RseSAoZXF1YWxpdHkgaXMKLQltaXNzaW5nKS4KLQotMjAwNS0xMS0xNSAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS9zbWFrZWZpbGU6IEFkanVzdGVkIHRoZSBjb21waWxlciBvcHRpb25zCi0JdG8gdGhlIGN1cnJlbnQgc291cmNlcywgbm93IHJlYWxseSBidWlsZHMgdGhlIGd4dmFsaWQsIGd6aXAKLQlhbmQgcHNuYW1lcyBtb2R1bGVzLgotCi0JKiBidWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRzeXN0ZW0uYzogVGhlIGFzc3VtZWQgU2VlaygpIHBvc2l0aW9uCi0JaW4gdGhlIGZpbGUgY2FjaGUgd2FzIG9mZiBieSBvbmUgYnl0ZSB3aGljaCBjb3VsZCBjYXVzZSBmYWxzZQotCWVycm9ycyBpbiBmb250IGZpbGVzLgotCi0yMDA1LTExLTI0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfZmFyLm1ha2UudHh0LAotCWJ1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19jZm0ubWFrZS50eHQsCi0JYnVpbGRzL21hYy9GcmVlVHlwZS5wcGNfY2xhc3NpYy5tYWtlLnR4dCwKLQlidWlsZHMvbWFjL0ZyZWVUeXBlLnBwY19jYXJib24ubWFrZS50eHQ6Ci0JVXBkYXRlZCBmb3IgTVBXIHRvIGJ1aWxkIGFsbCBhdmFpbGFibGUgbW9kdWxlcy4KLQotMjAwNS0xMS0yMSAgSMOldmFyZCBXYWxsICA8aGFhdmFyZHdAaWZpLnVpby5ubz4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChiZGZfaW50ZXJwcmV0X3N0eWxlLCBCREZfRmFjZV9Eb25lKTogRml4IHNtYWxsCi0JbWVtb3J5IGxlYWsuCi0KLTIwMDUtMTEtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHNmbnRfaW5pdCk6IEFkZCB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMDUtMTEtMjEgIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvc2ZudC90dHNiaXQwLmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlKTogSW1hZ2Vfb2Zmc2V0IHdhcwotCWFkZGVkIHR3aWNlIHRvIGltYWdlX3N0YXJ0IGlmIGltYWdlX2Zvcm1hdCB3YXMgMiBvciA1LgotCi0yMDA1LTExLTIxICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfaW5pdF9mYWNlKTogQ2hlY2sgdGhhdCBmb3JtYXRfdGFnIGlzIGtub3duCi0JYmVmb3JlIGxvYWRpbmcgdGhlIHRhYmxlIGRpcmVjdG9yeS4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9zZm50X2hlYWRlciwKLQl0dF9mYWNlX2xvYWRfZGlyZWN0b3J5KTogRGVsYXkgc2ZudF9kaXJfY2hlY2sgZnJvbQotCXR0X2ZhY2VfbG9hZF9zZm50X2hlYWRlciB0byB0dF9mYWNlX2xvYWRfZGlyZWN0b3J5LgotCi0yMDA1LTExLTIwICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHNmbnRfZGlyX2NoZWNrKTogQ2xlYW4gdXAgYW5kIHJldHVybiBjb3JyZWN0Ci0JZXJyb3IgY29kZS4KLQkoc2ZudF9pbml0KTogTmV3IGZ1bmN0aW9uIHRvIGZpbGwgaW4gZmFjZS0+dHRjX2hlYWRlci4gIEEgbm9uLVRUQyBmb250Ci0JaXMgc3ludGhlc2l6ZWQgaW50byBhIFRUQyBmb250IHdpdGggb25lIG9mZnNldCB0YWJsZS4KLQkodHRfZmFjZV9sb2FkX3NmbnRfaGVhZGVyKTogVXNlIHNmbnRfaW5pdC4KLQlGaXggYW4gaW52YWxpZCBhY2Nlc3MgaWYgdGhlIGZvbnQgaXMgVFRDIGFuZCBmYWNlX2luZGV4IGlzIC0xLgotCi0yMDA1LTExLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfbWV0cmljcyk6IElnbm9yZSBleGNlc3MgbnVtYmVyCi0Jb2YgbWV0cmljcyBpbnN0ZWFkIG9mIGFib3J0aW5nLiAgUGF0Y2ggc3VnZ2VzdGVkIGJ5IERlcmVrIE5vb25idXJnLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpLCBzcmMvY2lkL2NpZGdsb2FkLmMKLQkoY2lkX3Nsb3RfbG9hZF9nbHlwaCksIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX0xvYWRfR2x5cGgpOiBTY2FsZQotCXRoZSBnbHlwaCBwcm9wZXJseSBpZiBubyBoaW50ZXIgaXMgYXZhaWxhYmxlLgotCi0JKiBkb2NzL0NIQU5HRVM6IE1lbnRpb24gc2NhbGluZyBidWcuCi0KLTIwMDUtMTEtMTggIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRneHZhbC5oLCBzcmMvYmFzZS9mdGd4dmFsLmMKLQkoRlRfVHJ1ZVR5cGVHWF9GcmVlLCBGVF9DbGFzc2ljS2Vybl9GcmVlKTogTmV3IGZ1bmN0aW9ucyB0byBmcmVlCi0JYnVmZmVycyBhbGxvY2F0ZWQgYnkgZ3h2YWxpZCBtb2R1bGUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0b3R2YWwuaCwgc3JjL2Jhc2UvZnRvdHZhbC5jCi0JKEZUX09wZW5UeXBlX0ZyZWUpOiBOZXcgZnVuY3Rpb24gdG8gZnJlZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0Jb3R2YWxpZCBtb2R1bGUuCi0KLTIwMDUtMTEtMTggIENoaWEtSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBidWlsZHMvdW5peC9mdHN5c3RlbS5jIChGVF9TdHJlYW1fT3BlbiwgRlRfTmV3X01lbW9yeSwKLQlGVF9Eb25lX01lbW9yeSksIGJ1aWxkcy92bXMvZnRzeXN0ZW0uYyAoRlRfU3RyZWFtX09wZW4sIEZUX05ld19NZW1vcnksCi0JRlRfRG9uZV9NZW1vcnkpLCBidWlsZHMvd2luMzIvZnRkZWJ1Zy5jIChGVF9NZXNzYWdlLCBGVF9QYW5pYyk6Ci0Jcy9GVF9FWFBPUlQvRlRfQkFTRS8uCi0KLTIwMDUtMTEtMTcgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBidWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRkZWJ1Zy5jIChGVF9UcmFjZV9HZXRfQ291bnQsCi0JRlRfVHJhY2VfR2V0X05hbWUsIEZUX01lc3NhZ2UsIEZUX1BhbmljKSwKLQlidWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRzeXN0ZW0uYyAoRlRfTmV3X01lbW9yeSwgRlRfRG9uZV9NZW1vcnksCi0JRlRfU3RyZWFtX09wZW4pOiBzL0ZUX0VYUE9SVC9GVF9CQVNFLy4KLQotMjAwNS0xMS0xNyAgRGV0bGVmIFfDvHJrbmVyICA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+Ci0KLQkqIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZSwgYnVpbGRzL2FtaWdhL21ha2VmaWxlLm9zNCwKLQlidWlsZHMvYW1pZ2Evc21ha2VmaWxlLAotCWJ1aWxkcy9hbWlnYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBVcGRhdGVkIHRoZSBBbWlnYQotCWJ1aWxkIGZpbGVzIChhZGRlZCBzdXBwb3J0IGZvciB0aGUgZ3h2YWxpZCBtb2R1bGUpLgotCi0yMDA1LTExLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgdmVydGljYWwgbWV0cmljcyBzdXBwb3J0IHRvIE9wZW5UeXBlIENGRiBvdXRsaW5lcy4gIEJhc2VkIG9uIGEKLQlwYXRjaCBmcm9tIE1pa2UgTW9lbmluZyA8TWlrZU1AUmV0ZWtTb2x1dGlvbnMuY29tPi4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZmFjZV9nZXRfdmVydGljYWxfbWV0cmljcyk6IE5ldyBmdW5jdGlvbi4KLQkoY2ZmX3Nsb3RfbG9hZCk6IFVzZSBjZmZfZmFjZV9nZXRfdmVydGljYWxfbWV0cmljcy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA1LTExLTE3ICBDaGlhLUkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX011bFRvNjQpOiBDb21tZW50ZWQgb3V0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIChGVF9TcXJ0Rml4ZWQpLAotCXNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9TcXJ0Rml4ZWQpLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oIChGVF9UcmFjZV9HZXRfQ291bnQsCi0JRlRfVHJhY2VfR2V0X05hbWUsIEZUX01lc3NhZ2UsIEZUX1BhbmljKSwgc3JjL2Jhc2UvZnRkZWJ1Zy5jCi0JKEZUX1RyYWNlX0dldF9Db3VudCwgRlRfVHJhY2VfR2V0X05hbWUsIEZUX01lc3NhZ2UsIEZUX1BhbmljKSwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9OZXdfTWVtb3J5LCBGVF9Eb25lX01lbW9yeSksCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oIChGVF9TdHJlYW1fT3BlbiksCi0Jc3JjL2Jhc2UvZnRzeXN0ZW0uYyAoRlRfTmV3X01lbW9yeSwgRlRfRG9uZV9NZW1vcnksIEZUX1N0cmVhbV9PcGVuKToKLQlzL0ZUX0VYUE9SVC9GVF9CQVNFLy4KLQotCSogYnVpbGRzL2V4cG9ydHMubWs6IE1hbnVhbGx5IGFkZCBUVF9OZXdfQ29udGV4dCB0byBFWFBPUlRTX0xJU1QKLQl0b28uCi0KLTIwMDUtMTEtMTUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoZnRfdHJpZ19wcmVub3JtKTogRml4IGEgYnVnIHRoYXQgY3JlYXRlZAotCWludmFsaWQgY29tcHV0YXRpb25zLCByZXN1bHRpbmcgaW4gdmVyeSB3ZWlyZCBidWdzIGluIFRydWVUeXBlCi0JYnl0ZWNvZGUgaGludGVkIGZvbnRzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoRlRfVU5VU0VEX0VYRUMpOiBEb24ndCBwZXJmb3JtIGEKLQlzdHJ1Y3R1cmUgY29weSBlYWNoIHRpbWUuCi0KLTIwMDUtMTEtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKEZUQ19DYWNoZV9DbGVhciksIHNyYy9jYWNoZS9mdGNtYW5hZy5jCi0JKEZUQ19NYW5hZ2VyX0NoZWNrKTogUmVtb3ZlIEZUX0VYUE9SVF9ERUYgdGFnLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfQWRkNjQpOiBSZW1vdmUgRlRfRVhQT1JUX0RFRiB0YWcuCi0JKEZUX0RpdjY0YnkzMiwgRlRfU3FydDMyKTogQ29tbWVudGVkIG91dC4gIFVudXNlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCAoU1FSVF8zMik6IFJlbW92ZWQuICBVbnVzZWQuCi0JKEZUX1NxcnQzMik6IENvbW1lbnRlZCBvdXQuICBVbnVzZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvZnRjY2FjaGUuaDoKLQlzL2Z0Y19ub2RlX2Rlc3Ryb3kvRlRDX05vZGVfRGVzdHJveS8uCi0KLQkqIHNyYy9jYWNoZS9mdGNjYmFjay5oIChmdGNfbm9kZV9kZXN0cm95KTogTmV3IGRlY2xhcmF0aW9uLgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYyAoZnRjX25vZGVfZGVzdHJveSk6IFVzZSBGVF9MT0NBTF9ERUYgdGFnLgotCShGVENfTm9kZV9EZXN0cm95KTogTmV3IGV4cG9ydGVkIHdyYXBwZXIgZnVuY3Rpb24gZm9yCi0JZnRjX25vZGVfZGVzdHJveS4KLQotCSogc3JjL2NhY2hlL2Z0Y21hbmFnLmM6IEluY2x1ZGUgZnRjY2JhY2suYy4KLQotMjAwNS0xMS0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmFuZ2xlcy5jLCBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggKGFmX2FuZ2xlX2RpZmYpOgotCUNvbW1lbnQgb3V0LiAgVW51c2VkLgotCi0JKiBidWlsZHMvZXhwb3J0cy5tayAoJChFWFBPUlRTX0xJU1QpKTogQWRkIFRUX1J1bklucy4KLQotMjAwNS0xMS0xMCAgQ2hyaXN0aWFuIEJpZXNpbmdlciAgPGNiaWVzaW5nZXJAd2ViLmRlPgotCi0JKiBidWlsZHMvYmVvcy9iZW9zLm1rOiBDYWxsIGJlb3MtZGVmLm1rIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvCi0JZGVmaW5lIHRoZSBzZXBhcmF0b3IuCi0KLQkqIGJ1aWxkcy91bml4L3VuaXgtY2MuaW4gKExJTktfTElCUkFSWSk6IEFkZCBgLW5vLXVuZGVmaW5lZCcgZmxhZy4KLQotMjAwNS0xMS0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFhZm0uYyAoVDFfUmVhZF9QRk0pOiBaZXJvIG9mZnNldCBtZWFucyBgbm8ga2VybmluZwotCXRhYmxlIGF2YWlsYWJsZScuICBGcm9tIFNlcmdleSBUb2xzdG92IDxzdG9sc3RvdkBlc3JpLmNvbT4uCi0KLTIwMDUtMTEtMDMgIFZpbGxlIFN5cmrDpGzDpCAgPHN5cmphbGFAc2NpLmZpPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfT3Blbl9GYWNlKTogQXZvaWQgcG9zc2libGUgbWVtb3J5IGxlYWsuCi0KLTIwMDUtMTEtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgY29tcGlsaW5nIGluc3RydWN0aW9ucyBpbiBkb2NzL0NVU1RPTUlaRSB3b3JrIGFnYWluLgotCi0JKiBidWlsZHMvdW5peC91bml4LWNjLmluIChDUFBGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZMQUdTKTogRG9uJ3QgaW5jbHVkZSBAQ1BQRkxBR1NALgotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChGVF9DRkxBR1MpOiBBZGQgQ1BQRkxBR1MuCi0KLTIwMDUtMTAtMjggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCVVwZGF0ZSBidWlsZCBzeXN0ZW0gdG8gc3VwcG9ydCB0aGUgZ2VuZXJhdGlvbiBvZiBhIGxpc3Qgb2YgZXhwb3J0ZWQKLQlzeW1ib2xzIG9yIFdpbmRvd3MgLkRFRiBmaWxlcyBieSBwYXJzaW5nIHRoZSBwdWJsaWMgaGVhZGVycyB3aXRoIHRoZQotCWBhcGluYW1lcycgdG9vbCBsb2NhdGVkIGluIHNyYy90b29scy9hcGluYW1lcy5jLgotCi0JT25seSB0ZXN0ZWQgb24gVW5peCBhdCB0aGUgbW9tZW50LiAgT24gV2luZG93cywgdGhlIC5ERUYgZmlsZSBpcwotCWdlbmVyYXRlZCBidXQgaXNuJ3QgdXNlZCB5ZXQgdG8gZ2VuZXJhdGUgYSBETEwuCi0KLQkqIGJ1aWxkcy9leHBvcnRzLm1rOiBOZXcgZmlsZS4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rOiBJbmNsdWRlIGV4cG9ydHMubWsuCi0JKGRsbCk6IE5ldyB0YXJnZXQuCi0JKGNsZWFuX3Byb2plY3RfZG9zKTogRml4IHJ1bGUuCi0KLQkqIGJ1aWxkcy9jb21waWxlci92aXN1YWxjLm1rIChURSksIGJ1aWxkcy9kb3MvZG9zLWRlZi5tayAoRSksCi0JYnVpbGRzL29zMi9vczItZGVmLm1rIChFKSwgYnVpbGRzL3dpbjMyL3dpbjMyLWRlZi5tayAoRSk6IE5ldwotCXZhcmlhYmxlcyBmb3IgY29udHJvbGxpbmcgZXhlY3V0YWJsZSBleHRlbnNpb25zLgotCi0JKiBidWlsZHMvdW5peC91bml4LWNjLmluIChFWFBPUlRTX0xJU1QsIENDZXhlKSwKLQlidWlsZHMvd2luMzIvdzMyLWJjYy5taywgYnVpbGRzL3dpbjMyL3czMi1nY2MubWssCi0JYnVpbGRzL3dpbjMyL3czMi1pY2MubWssIGJ1aWxkcy93aW4zMi93MzItaWNjLm1rLAotCWJ1aWxkcy93aW4zMi93MzItbWluZ3czMi5taywgYnVpbGRzL3dpbjMyL3czMi12Y2MsCi0JYnVpbGRzL3dpbjMyL3czMi13YXQubWsgKEVYUE9SVFNfTElTVCwgRVhQT1JUX09QVElPTlMsCi0JQVBJTkFNRVNfT1BUSU9OUyk6IE5ldyB0YXJnZXRzIGZvciBjb250cm9sbGluZyB0aGUgYGFwaW5hbWVzJyB0b29sLgotCi0JKiBKYW1maWxlIChHZW5FeHBvcnRTeW1ib2xzKTogVXBkYXRlZC4KLQotCi0JKiBzcmMvcGZyL3BmcnR5cGVzLmgsIHNyYy9wZnIvcGZybG9hZC5jLCBzcmMvcGZyL3Bmcm9ianMuYwotCVshRlRfT1BUSU1JWkVfTUVNT1JZXTogRm9sZCBtZW1vcnkgb3B0aW1pemF0aW9uIGNvZGUgaW50bwotCUZUX09QVElNSVpFX01FTU9SWSBjaHVua3MgZm9yIGJldHRlciBtYWludGFpbmFiaWxpdHkgYW5kIHNpbXBsaWNpdHkuCi0KLQotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoZnRfdHJpZ19wcmVub3JtKSwgc3JjL2Jhc2UvZnRjYWxjLmMKLQkoRlRfTXVsRml4KTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucy4KLQotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmggKEZUX0dMWVBITE9BREVSX0NIRUNLX1AsCi0JRlRfR0xZUEhMT0FERVJfQ0hFQ0tfQywgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKTogTmV3IG1hY3JvcyBmb3IKLQljaGVja2luZyBwb2ludHMgYW5kIGNvbnRvdXJzLiAgVXBkYXRlIGNhbGxlcnMgdG8gdXNlCi0JRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTIGluc3RlYWQgb2YgRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMKLQlhdCBwcm9maWxlLWRldGVjdGVkIGhvdC1zcG90cy4KLQotCSogc3JjL2Jhc2UvZnRnbG9hZHIuYyAoRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMpOiBTZXQgYGFkanVzdCcKLQl0byAwIHRvIG5vdCBjYWxsIGBBZGp1c3RQb2ludHMnIGV2ZXJ5IHRpbWUuCi0KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9BTkdMRV9ESUZGKTogTmV3IG1hY3JvIHRvIGlubGluZQotCUZUX0FuZ2xlX0RpZmYuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZGlyZWN0aW9uX2NvbXB1dGUpOiBSZS1pbXBsZW1lbnQuCi0JKGFmX2dseXBoX2hpbnRzX2NvbXB1dGVfaW5mbGVjdGlvbnMsIGFmX2dseXBoX2hpbnRzX3JlbG9hZCk6IFVzZQotCUFGX0FOR0xFX0RJRkYgdG8gc3BlZWQgdXAgdGhlIGRldGVjdGlvbiBvZiBpbmZsZXhpb25zLgotCi0KLQkqIHNyYy90b29scy9hcGluYW1lcy5jOiBJbmNsdWRlIDxzdHJpbmcuaD4uCi0JKE91dHB1dEZvcm1hdCk6IE5ldyBlbnVtZXJhdGlvbi4KLQkobmFtZXNfZHVtcCk6IEFkZCB0d28gcGFyYW1ldGVycyB0byBjb250cm9sIG91dHB1dCBmb3JtYXQgYW5kIERMTAotCW5hbWUuCi0JKG5hbWVzX2R1bXBfd2luZGVmKTogUmVtb3ZlZC4gIENvZGUgZm9sZGVkIGludG8gYG5hbWVzX2R1bXAnLgotCShyZWFkX2hlYWRlcl9maWxlKTogVXNlIGlzYWxudW0sIG5vdCBpc2FscGhhLiAgT3RoZXJ3aXNlIGZ1bmN0aW9uCi0JbmFtZXMgd2l0aCBkaWdpdHMgYXJlbid0IHJlYWQgY29ycmVjdGx5LgotCSh1c2FnZSk6IFVwZGF0ZWQuCi0JKG1haW4pOiBOZXcgb3B0aW9uIGAtbycgdG8gY29udHJvbCBvdXRwdXQgZmlsZSBuYW1lLgotCU5ldyBvcHRpb24gYC1kJyB0byBpbmRpY2F0ZSBETEwgZmlsZSBuYW1lLgotCUV4dGVuZCBgLXcnIGZsYWcgdG8gaGFuZGxlIEJvcmxhbmQgYW5kIFdhdGNvbSBjb21waWxlcnMgYW5kIGxpbmtlcnMuCi0KLTIwMDUtMTAtMjggIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy9tYWMvZnRsaWIucHJqLCBidWlsZHMvbWFjL2ZyZWV0eXBlLm1hazogUmVtb3ZlZC4KLQlmdGxpYi5wcmogaXMgdW5tYWludGFpbmVkIGFuZCBpbmNvbXBhdGlibGUgd2l0aCBjdXJyZW50IHRyZWUuCi0JZnJlZXR5cGUubWFrIGlzIHVucmVjb3ZlcmFibHkgYnJva2VuLgotCi0JKiBidWlsZHMvbWFjL2Z0bGliLnByai54bWw6IEFkZGVkLgotCUdlbmVyYXRlZCBieSBNZXRyb3dlcmtzIENvZGVXYXJyaW9yIDkuMC4KLQotCSogYnVpbGRzL21hYy9GcmVlVHlwZS5tNjhrX2Zhci5tYWtlLnR4dCwKLQlidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfY2ZtLm1ha2UudHh0LAotCWJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NsYXNzaWMubWFrZS50eHQsCi0JYnVpbGRzL21hYy9GcmVlVHlwZS5wcGNfY2FyYm9uLm1ha2UudHh0OiBBZGRlZC4KLQlTa2VsZXRvbiBmaWxlcyBvZiBNUFcgbWFrZWZpbGVzLgotCi0JKiBidWlsZHMvbWFjL2FzY2lpMm1wdy5weTogQWRkZWQuCi0JUHl0aG9uIHNjcmlwdCB0byBtYWtlIE1QVyBtYWtlZmlsZSBmcm9tIHNrZWxldG9uLgotCi0JKiBidWlsZHMvbWFjL1JFQURNRTogVXBkYXRlZC4KLQlBbG1vc3QgcmV3cml0dGVuIHRvIHVzZSBuZXcgZmlsZXMuCi0KLTIwMDUtMTAtMjggIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmM6IEZpeCBpbnZhbGlkIGNhc3RzIGZyb20gTlVMTCB0byBpbnRlZ2VyIHR5cGVkCi0JdmFyaWFibGVzLiAgQWR2aXNlZCBieSBEYXZpZCBUdXJuZXIsIE1hc2F0YWtlIFlBTUFUTywgU2VhbiBNY0JyaWRlLAotCWFuZCBHZW9yZ2UgV2lsbGlhbXMuCi0KLTIwMDUtMTAtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHN5c21lbS5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzaW8uaDogUmVtb3ZlZC4KLQlPYnNvbGV0ZS4KLQotMjAwNS0xMC0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2ludGVyZmFjZSk6IE1vdmUgb3V0Ci0JYHR0X2ZhY2VfZ2V0X2tlcm5pbmcnIGZyb20gYSAjaWZkZWYgY2xhdXNlLiAgUmVwb3J0ZWQgYnkgVG9ueSBKLgotCUliYnMgPHRpYnNAc2ouY28udWs+LgotCi0yMDA1LTEwLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKGZ0X21lbV9kZWJ1Z19yZWFsbG9jKTogTWFrZSBpdCBjb21waWxlIHdpdGgKLQlDKysuCi0KLTIwMDUtMTAtMjEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYyAoZnRfbWVtX3RhYmxlX3NldCwgZnRfbWVtX2RlYnVnX3JlYWxsb2MpOgotCUFub3RoZXIgcmVhbGxvYyBtZW1vcnkgY291bnRpbmcgYnVnIGZpeC4KLQotCSogc3JjL3Rvb2xzL0phbWZpbGU6IEFkZCBtaXNzaW5nIGZpbGUuCi0KLQkqIHNyYy9sencvSmFtZmlsZTogRml4IGluY29ycmVjdCBzb3VyY2UgZmlsZSByZWZlcmVuY2UuCi0KLTIwMDUtMTAtMjAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYyAoZnRfbWVtX3RhYmxlX3NldCwgZnRfbWVtX3RhYmxlX3JlbW92ZSwKLQlmdF9tZW1fZGVidWdfYWxsb2MsIGZ0X21lbV9kZWJ1Z19mcmVlLCBmdF9tZW1fZGVidWdfcmVhbGxvYyk6IEZpeGVzCi0JdG8gYmV0dGVyIGFjY291bnQgZm9yIG1lbW9yeSByZWFsbG9jYXRpb25zLgotCi0JKiBzcmMvbHp3L2Z0bHp3Mi5jLCBzcmMvbHp3L2Z0em9wZW4uaCwgc3JjL2x6dy9mdHpvcGVuLmMsCi0Jc3JjL2x6dy9ydWxlcy5tazogRmlyc3QgdmVyc2lvbiBvZiBMWlcgbG9hZGVyIHJlLWltcGxlbWVudGF0aW9uLgotCUFwcGFyZW50bHksIHRoaXMgc2F2ZXMgYWJvdXQgMzMwIEtCIG9mIGhlYXAgbWVtb3J5IHdoZW4gbG9hZGluZwotCXRpbVIyNC5wY2YuWi4KLQotMjAwNS0xMC0yMCAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaCAoRlRfQml0bWFwX0NvcHksIEZUX0JpdG1hcF9FbWJvbGRlbiksCi0Jc3JjL2Jhc2UvZnRiZGYuYyAoRlRfR2V0X0JERl9Qcm9wZXJ0eSksIHNyYy9jYWNoZS9mdGNtcnUuYwotCShGVENfTXJ1TGlzdF9SZXNldCwgRlRDX01ydUxpc3RfRG9uZSwgRlRDX01ydUxpc3RfTG9va3VwKTogRml4Ci0JRlRfRVhQT1JUL0ZUX0VYUE9SVF9ERUYgdGFnZ2luZy4KLQotMjAwNS0xMC0xOSAgQ2hpYS1JIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfR2x5cGgpOiBBbGxvdyBzaXplLT50dG1ldHJpY3MgdG8KLQliZSBpbnZhbGlkIHdoZW4gRlRfTE9BRF9OT19TQ0FMRSBpcyBzZXQuCi0KLTIwMDUtMTAtMTcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX09wZW5fRmFjZSk6IERvbid0IGNhbGwgRlRfTmV3X0dseXBoU2xvdCBhbmQKLQlGVF9OZXdfU2l6ZSBpZiB3ZSBhcmUgb3BlbmluZyBhIGZhY2Ugd2l0aCBmYWNlX2luZGV4IDwgMCAod2hpY2ggaXMKLQlvbmx5IHVzZWQgZm9yIHRlc3RpbmcgdGhlIGZvcm1hdCkuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQwLmMgKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlKToKLQlSZW1vdmUgY29tcGlsZXIgd2FybmluZy4KLQotMjAwNS0xMC0xNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdG9vbHMvYXBpbmFtZXMuYzogQWRkIG5ldyB0b29sIHRvIGV4dHJhY3QgcHVibGljIEFQSSBmdW5jdGlvbgotCW5hbWVzIGZyb20gaGVhZGVyIGZpbGVzLgotCi0yMDA1LTEwLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgRlRfRkFDRV9GTEFHX0hJTlRFUiB0byBpbmRpY2F0ZSB0aGF0IGEgc3BlY2lmaWMgZm9udCBkcml2ZXIgaGFzCi0JYSBoaW50aW5nIGVuZ2luZSBvZiBpdHMgb3duLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0ZBQ0VfRkxBR19ISU5URVIpOiBOZXcgbWFjcm8uCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KSwgc3JjL2NpZC9jaWRvYmpzLmMKLQkoY2lkX2ZhY2VfaW5pdCksIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZmFjZV9pbml0KQotCVtUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSXSwgc3JjL3R5cGUxL3Qxb2Jqcy5jCi0JKFQxX0ZhY2VfSW5pdCksIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KQotCVtUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSXTogVXBkYXRlIGZhY2UgZmxhZ3MuCi0KLQkqIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgaXQuCi0KLTIwMDUtMDktMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUyLm00OiBBZGQgbGljZW5zZSBleGNlcHRpb24gc28gdGhhdCB0aGUgZmlsZQotCWNhbiBiZSB1c2VkIGluIGFueSBvdGhlciBhdXRvY29uZiBzY3JpcHQuCi0KLTIwMDUtMDktMjYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9jb21wdXRlX3N0ZW1fd2lkdGgpOiBGaXggYmFkCi0JY29tcHV0YXRpb24gb2YgdGhlIGB2ZXJ0aWNhbCcgZmxhZywgY2F1c2luZyB1Z2x5IHRoaW5ncyBpbiBMQ0QgbW9kZQotCWFuZCBvdGhlcnMuCi0KLTIwMDUtMDktMjMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19pbml0KTogRml4IGEgYnVnIHRoYXQKLQlwcmV2ZW50ZWQgaW50ZXJuYWwgaGludCBtb2RlIGJpdGZsYWdzIGZyb20gYmVpbmcgY29tcHV0ZWQgY29ycmVjdGx5LgotCi0JKiBzcmMvYmFzZS9KYW1maWxlOiBBZGRpbmcgc3JjL2Jhc2UvZnRneHZhbC5jLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZic2xuLmMsIHNyYy9neHZhbGlkL2d4dmNvbW1uLmMsCi0Jc3JjL2d4dmFsaWQvZ3h2ZmVhdC5jLCBzcmMvZ3h2YWxpZC9neHZqdXN0LmMsIHNyYy9neHZhbGlkL2d4dmtlcm4uYywKLQlzcmMvZ3h2YWxpZC9neHZsY2FyLmMsIHNyYy9neHZhbGlkL2d4dm1vcnQuYywKLQlzcmMvZ3h2YWxpZC9neHZtb3J0MC5jLCBzcmMvZ3h2YWxpZC9neHZtb3J0MS5jLAotCXNyYy9neHZhbGlkL2d4dm1vcnQyLmMsIHNyYy9neHZhbGlkL2d4dm1vcnQ0LmMsCi0Jc3JjL2d4dmFsaWQvZ3h2bW9ydDUuYywgc3JjL2d4dmFsaWQvZ3h2bW9yeC5jLAotCXNyYy9neHZhbGlkL2d4dm1vcngwLmMsIHNyYy9neHZhbGlkL2d4dm1vcngxLmMsCi0Jc3JjL2d4dmFsaWQvZ3h2bW9yeDIuYywgc3JjL2d4dmFsaWQvZ3h2bW9yeDUuYywKLQlzcmMvZ3h2YWxpZC9neHZvcGJkLmMsIHNyYy9neHZhbGlkL2d4dnByb3AuYywKLQlzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jOiBSZW1vdmUgX21hbnlfIGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4KLQljb21waWxpbmcgd2l0aCBWaXN1YWwgQysrIGF0IG1heGltdW0gbGV2ZWwgKC9XNCkuCi0KLQkqIHNyYy9hdXRvZml0L2FmYW5nbGVzLmMgKGFmX2FuZ2xlX2F0YW4pOiBSZXBsYWNlZCBDT1JESUMtYmFzZWQKLQlpbXBsZW1lbnRhdGlvbiB3aXRoIG9uZSB1c2luZyBsb29rdXAgdGFibGVzLiAgVGhpcyBzaW1wbGUgdGhpbmcKLQlzcGVlZHMgdXAgZ2x5cGggbG9hZGluZyBieSAxOCUsIGFjY29yZGluZyB0byBmdGJlbmNoIQotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2dldF9pbnRlcmZhY2UpOiBEb24ndCBjaGVjayBmb3IKLQlgZ2V0X3NmbnQnIGFuZCBgbG9hZF9zZm50JyBtb2R1bGUgaW50ZXJmYWNlcy4KLQotMjAwNS0wOS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IE1lbnRpb24gU0lORyBHbHlwaGxldCBzdXBwb3J0LgotCi0yMDA1LTA5LTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL0phbWZpbGU6IERpc2FibGUgY29tcGlsYXRpb24gb2YgZnRneHZhbCBtb2R1bGUKLQl0ZW1wb3JhcmlseS4KLQotMjAwNS0wOS0xOSAgRGF2aWQgU29tZXJzICA8ZHNvbWVyc0BvbXoxMy5jb20+Ci0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChzZm50X2Rpcl9jaGVjayk6IE1vZGlmaWVkIHRvIGFsbG93IGEKLQlmb250IHRvIGhhdmUgbm8gYGhlYWQnIHRhYmxlIGlmIHRhYmxlcyBgU0lORycgYW5kIGBNRVRBJyBhcmUKLQlwcmVzZW50OyB0aGlzIGlzIHRvIHN1cHBvcnQgYFNJTkcgR2x5cGhsZXQnLgotCi0JYFNJTkcgR2x5cGhsZXQnIGlzIGFuIGV4dGVuc2lvbiB0byBPcGVuVHlwZSBkZXZlbG9wZWQgYnkgQWRvYmUKLQlwcmltYXJpbHkgdG8gZmFjaWxpdGF0ZSBhZGRpbmcgc3VwcGxlbWVudGFsIGdseXBocyB0byBhbiBPcGVuVHlwZQotCWZvbnQgKHdpdGggZW1waGFzaXMgb24sIGJ1dCBub3QgbmVjZXNzYXJpbHkgbGltaXRlZCB0bywgZ2FpamkgdG8gYQotCUNKSyBmb250KS4gIEEgU0lORyBHbHlwaGxldCBGb250IGlzIGFuIE9wZW5UeXBlIGZvbnQgdGhhdCBjb250YWlucwotCXRoZSBvdXRsaW5lKHMpLCBlaXRoZXIgaW4gYSBgZ2x5Zicgb3IgYENGRicgdGFibGUsIGZvciBhIGdseXBoOwotCWBjbWFwJywgYEJBU0UnLCBhbmQgYEdTVUInIHRhYmxlcyBhcmUgcHJlc2VudCB3aXRoIHRoZSBzYW1lIGZvcm1hdAotCWFuZCBmdW5jdGlvbmFsaXR5IGFzIGEgcmVndWxhciBPcGVuVHlwZSBmb250OyB0aGVyZSBhcmUgbm8gYG5hbWUnLAotCWBoZWFkJywgYE9TLzInLCBhbmQgYHBvc3QnIHRhYmxlczsgdGhlcmUgYXJlIHR3byBuZXcgdGFibGVzLCBgU0lORycKLQl3aGljaCBjb250YWlucyBkZXRhaWxzIGFib3V0IHRoZSBnbHlwaGxldCwgYW5kIGBNRVRBJyB3aGljaCBjb250YWlucwotCW1ldGFkYXRhLgotCi0JRnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgU0lORyBHbHlwaGxldCBmb3JtYXQgY2FuIGJlIGZvdW5kIGF0OgotCi0JICBodHRwOi8vd3d3LmFkb2JlLmNvbS9wcm9kdWN0cy9pbmRlc2lnbi9zaW5nX2dhaWppLmh0bWwKLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaCAoVFRBR19TSU5HLCBUVEFHX01FVEEpOiBOZXcgbWFjcm9zIGZvcgotCXRoZSBPcGVuVHlwZSB0YWJsZXMgYFNJTkcnIGFuZCBgTUVUQScuICBUaGVzZSB0d28gdGFibGVzIGFyZSB1c2VkIGluCi0JU0lORyBHbHlwaGxldCBGb3JtYXQgZm9udHMuCi0KLTIwMDUtMDktMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogUmVhY3RpdmF0ZSBjb2RlIHRvIHNldAotCUZUX0ZBQ0VfRkxBR19LRVJOSU5HIHdoaWNoIGhhcyBiZWVuIGNvbW1lbnRlZCBvdXQgZXJyb25lb3VzbHkuCi0KLQkqIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgaXQuCi0KLTIwMDUtMDktMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeGVzIGZvciBgbWFrZSBtdWx0aScgYW5kIHVzaW5nIEMrKyBjb21waWxlci4KLQotCSogc3JjL2d4dmFsaWQvZ3h2Y29tbW4uYyAoZ3h2X3NldF9sZW5ndGhfYnlfdXNob3J0X29mZnNldCwKLQlneHZfc2V0X2xlbmd0aF9ieV91bG9uZ19vZmZzZXQsIGd4dl9hcnJheV9nZXRsaW1pdHNfYnl0ZSwKLQlneHZfYXJyYXlfZ2V0bGltaXRzX3VzaG9ydCk6IERlY2xhcmUgd2l0aCBGVF9MT0NBTF9ERUYuCi0JKGd4dl9jb21wYXJlX3Jhbmdlcyk6IE1ha2UgaXQgc3RhdGljLgotCShneHZfTG9va3VwVGFibGVfZm10MF92YWxpZGF0ZSwgZ3h2X0xvb2t1cFRhYmxlX2ZtdDJfdmFsaWRhdGUsCi0JZ3h2X0xvb2t1cFRhYmxlX2ZtdDRfdmFsaWRhdGUsIGd4dl9Mb29rdXBUYWJsZV9mbXQ2X3ZhbGlkYXRlLAotCWd4dl9Mb29rdXBUYWJsZV9mbXQ4X3ZhbGlkYXRlLCBneHZfTG9va3VwVGFibGVfdmFsaWRhdGUpOiBJbXByb3ZlCi0JdHJhY2UgbWVzc2FnZXMuCi0JKGd4dl9TdGF0ZUFycmF5X3ZhbGlkYXRlLCBneHZfWFN0YXRlQXJyYXlfdmFsaWRhdGUpOiBzL2NsYXNzL2NsYXp6Ly4KLQkoR1hWX1NUQVRFVEFCTEVfSEVBREVSX1NJWkUsIEdYVl9TVEFURUhFQURFUl9TSVpFLAotCUdYVl9YU1RBVEVUQUJMRV9IRUFERVJfU0laRSwgR1hWX1hTVEFURUhFQURFUl9TSVpFKTogTW92ZSB0bwotCWd4dmNvbW1uLmguCi0KLQkqIHNyYy9neHZhbGlkL2d4dmNvbW1uLmg6IEFkZCBwcm90b3R5cGVzIGZvcgotCWd4dl9TdGF0ZVRhYmxlX3N1YnRhYmxlX3NldHVwLCBneHZfWFN0YXRlVGFibGVfc3VidGFibGVfc2V0dXAsCi0JZ3h2X1hTdGF0ZVRhYmxlX3ZhbGlkYXRlLCBneHZfYXJyYXlfZ2V0bGltaXRzX2J5dGUsCi0JZ3h2X2FycmF5X2dldGxpbWl0c191c2hvcnQsIGd4dl9zZXRfbGVuZ3RoX2J5X3VzaG9ydF9vZmZzZXQsCi0JZ3h2X3NldF9sZW5ndGhfYnlfdWxvbmdfb2Zmc2V0LCBneHZfb2R0ZWN0X2FkZF9yYW5nZSwKLQlneHZfb2R0ZWN0X3ZhbGlkYXRlLgotCShHWFZfU1RBVEVUQUJMRV9IRUFERVJfU0laRSwgR1hWX1NUQVRFSEVBREVSX1NJWkUsCi0JR1hWX1hTVEFURVRBQkxFX0hFQURFUl9TSVpFLCBHWFZfWFNUQVRFSEVBREVSX1NJWkUpOiBNb3ZlZCBmcm9tCi0JZ3h2Y29tbW4uYy4KLQotCSogc3JjL2d4dmFsaWQvZ3h2YnNsbi5jIChneHZfYnNsbl9Mb29rdXBWYWx1ZV92YWxpZGF0ZSwKLQlneHZfYnNsbl9wYXJ0c19mbXQxX3ZhbGlkYXRlKTogSW1wcm92ZSB0cmFjZSBtZXNzYWdlcy4KLQotCSogc3JjL2d4dmFsaWQvZ3h2ZmVhdC5jOiBTcGxpdCBvZmYgcHJlZGVmaW5lZCByZWdpc3RyeSBzdHVmZiB0by4uLgotCSogc3JjL2d4dmFsaWQvZ3h2ZmVhdC5oOiBOZXcgZmlsZS4KLQotCSogc3JjL2d4dmFsaWQvZ3h2anVzdC5jIChneHZfanVzdF93ZGNfZW50cnlfdmFsaWRhdGUpOiBJbXByb3ZlIHRyYWNlCi0JbWVzc2FnZS4KLQotCSogc3JjL2d4dmFsaWQvZ3h2a2Vybi5jIChHWFZfa2Vybl9EaWFsZWN0KTogQWRkIEtFUk5fRElBTEVDVF9VTktOT1dOLgotCShneHZfa2Vybl9zdWJ0YWJsZV9mbXQxX3ZhbHVlVGFibGVfbG9hZCwKLQlneHZfa2Vybl9zdWJ0YWJsZV9mbXQxX3N1YnRhYmxlX3NldHVwLAotCWd4dl9rZXJuX3N1YnRhYmxlX2ZtdDFfZW50cnlfdmFsaWRhdGUpOiBGaXggQysrIGNvbXBpbGVyIGVycm9ycy4KLQkoZ3h2X2tlcm5fY292ZXJhZ2VfdmFsaWRhdGUpOiBVc2UgS0VSTl9ESUFMRUNUX1VOS05PV04uCi0JSW1wcm92ZSB0cmFjZSBtZXNzYWdlLgotCShneHZfa2Vybl92YWxpZGF0ZV9nZW5lcmljKTogRml4IEMrKyBjb21waWxlciBlcnJvci4KLQlJbXByb3ZlIHRyYWNlIG1lc3NhZ2UuCi0JKGd4dl9rZXJuX3ZhbGlkYXRlX2NsYXNzaWMpOiBGaXggQysrIGNvbXBpbGVyIGVycm9yLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0MC5jIChneHZfbW9ydF9zdWJ0YWJsZV90eXBlMF92YWxpZGF0ZSk6IERlY2xhcmUKLQl3aXRoIEZUX0xPQ0FMX0RFRi4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9ydDEuYwotCShneHZfbW9ydF9zdWJ0YWJsZV90eXBlMV9zdWJzdGl0dXRpb25UYWJsZV9sb2FkLAotCWd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX3N1YnRhYmxlX3NldHVwKTogRml4IEMrKyBjb21waWxlciBlcnJvcnMuCi0JKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX3N1YnN0VGFibGVfdmFsaWRhdGUpOiBJbXByb3ZlIHRyYWNlCi0JbWVzc2FnZS4KLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfdmFsaWRhdGUpOiBEZWNsYXJlIHdpdGggRlRfTE9DQUxfREVGLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0Mi5jIChneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl9vcHR0YWJsZV9sb2FkLAotCWd4dl9tb3J0X3N1YnRhYmxlX3R5cGUyX3N1YnRhYmxlX3NldHVwLAotCWd4dl9tb3J0X3N1YnRhYmxlX3R5cGUyX2xpZ0FjdGlvbk9mZnNldF92YWxpZGF0ZSwKLQlneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl9saWdhdHVyZVRhYmxlX3ZhbGlkYXRlKTogRml4IEMrKyBjb21waWxlcgotCWVycm9ycy4KLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTJfdmFsaWRhdGUpOiBEZWNsYXJlIHdpdGggRlRfTE9DQUxfREVGLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0NC5jIChneHZfbW9ydF9zdWJ0YWJsZV90eXBlNF92YWxpZGF0ZSk6IERlY2xhcmUKLQl3aXRoIEZUX0xPQ0FMX0RFRi4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9ydDUuYyAoZ3h2X21vcnRfc3VidGFibGVfdHlwZTVfc3VidGFibGVfc2V0dXAsCi0JZ3h2X21vcnRfc3VidGFibGVfdHlwZTVfSW5zZXJ0TGlzdF92YWxpZGF0ZSk6IEZpeCBDKysgY29tcGlsZXIKLQllcnJvcnMuCi0JKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU1X3ZhbGlkYXRlKTogRGVjbGFyZSB3aXRoIEZUX0xPQ0FMX0RFRi4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9ydC5jOiBJbmNsdWRlIGd4dmZlYXQuaC4KLQkoZ3h2X21vcnRfZmVhdHVyZWFycmF5X3ZhbGlkYXRlLCBneHZfbW9ydF9jb3ZlcmFnZV92YWxpZGF0ZSk6Ci0JRGVjbGFyZSB3aXRoIEZUX0xPQ0FMX0RFRi4KLQkoZ3h2X21vcnRfc3VidGFibGVzX3ZhbGlkYXRlLCBneHZfbW9ydF92YWxpZGF0ZSk6IEltcHJvdmUgdHJhY2UKLQltZXNzYWdlcy4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9ydC5oIChneHZfbW9ydF9mZWF0dXJlX3ZhbGlkYXRlKTogUmVtb3ZlLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J4MC5jIChneHZfbW9yeF9zdWJ0YWJsZV90eXBlMF92YWxpZGF0ZSk6IERlY2xhcmUKLQl3aXRoIEZUX0xPQ0FMX0RFRi4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9yeDEuYwotCShneHZfbW9yeF9zdWJ0YWJsZV90eXBlMV9zdWJzdGl0dXRpb25UYWJsZV9sb2FkLAotCWd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX3N1YnRhYmxlX3NldHVwLAotCWd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX2VudHJ5X3ZhbGlkYXRlLAotCWd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX3N1YnN0aXR1dGlvblRhYmxlX3ZhbGlkYXRlKTogRml4IEMrKwotCWNvbXBpbGVyIGVycm9ycy4KLQkoZ3h2X21vcnhfc3VidGFibGVfdHlwZTFfdmFsaWRhdGUpOiBEZWNsYXJlIHdpdGggRlRfTE9DQUxfREVGLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J4Mi5jIChneHZfbW9yeF9zdWJ0YWJsZV90eXBlMl9vcHR0YWJsZV9sb2FkLAotCWd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX3N1YnRhYmxlX3NldHVwLAotCWd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX2xpZ0FjdGlvbkluZGV4X3ZhbGlkYXRlLAotCWd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX2xpZ2F0dXJlVGFibGVfdmFsaWRhdGUpOiBGaXggQysrIGNvbXBpbGVyCi0JZXJyb3JzLgotCShneHZfbW9yeF9zdWJ0YWJsZV90eXBlMl92YWxpZGF0ZSk6IERlY2xhcmUgd2l0aCBGVF9MT0NBTF9ERUYuCi0JRml4IHR5cG8uCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcng0LmMgKGd4dl9tb3J4X3N1YnRhYmxlX3R5cGU0X3ZhbGlkYXRlKTogRGVjbGFyZQotCXdpdGggRlRfTE9DQUxfREVGLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J4NS5jIChneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV9pbnNlcnRpb25HbHlwaF9sb2FkLAotCWd4dl9tb3J4X3N1YnRhYmxlX3R5cGU1X3N1YnRhYmxlX3NldHVwKTogRml4IEMrKyBjb21waWxlciBlcnJvci4KLQkoZ3h2X21vcnhfc3VidGFibGVfdHlwZTVfdmFsaWRhdGUpOiBEZWNsYXJlIHdpdGggRlRfTE9DQUxfREVGLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J4LmMgKGd4dl9tb3J4X3N1YnRhYmxlc192YWxpZGF0ZSwKLQlneHZfbW9yeF92YWxpZGF0ZSk6IEltcHJvdmUgdHJhY2UgbWVzc2FnZS4KLQotCSogc3JjL2d4dmFsaWQvZ3h2b3BiZC5jIChneHZfb3BiZF9Mb29rdXBGbXQ0X3RyYW5zaXQpOiBGaXggY29tcGlsZXIKLQl3YXJuaW5ncy4KLQkoZ3h2X29wYmRfdmFsaWRhdGUpOiBJbXByb3ZlIHRyYWNlIG1lc3NhZ2UuCi0KLQkqIHNyYy9neHZhbGlkL2d4dnByb3AuYzogRGVjb3JhdGUgY29uc3RhbnRzIHdpdGggYFUnIGFuZCBgTCcgd2hlcmUKLQlhcHByb3ByaWF0ZS4KLQkoZ3h2X3Byb3BfemVyb19hZHZhbmNlX3ZhbGlkYXRlLCBneHZfcHJvcF92YWxpZGF0ZSk6IEltcHJvdmUgdHJhY2UKLQltZXNzYWdlLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZ0cmFrLmMgKGd4dl90cmFrX3RyYWNrVGFibGVfdmFsaWRhdGUpOiBSZW1vdmUgdW51c2VkCi0JcGFyYW1ldGVyLiAgVXBkYXRlIGFsbCBjYWxsZXJzLgotCShneHZfdHJha192YWxpZGF0ZSk6IEltcHJvdmUgdHJhY2UgbWVzc2FnZS4KLQotCSogcnVsZXMubWsgKEdYVl9EUlZfSCk6IEFkZCBneHZmZWF0LmguCi0KLTIwMDUtMDktMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2d4dmFsaWQvZ3h2YnNsbi5jIChHWFZfQlNMTl9WQUxVRV9FTVBUWSk6IEFkZCBgVScuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQxLmMgKEdYVl9NT1JUX1NVQlRBQkxFX1RZUEUxX0hFQURFUl9TSVpFKSwKLQlzcmMvZ3h2YWxpZC9neHZtb3J0Mi5jIChHWFZfTU9SVF9TVUJUQUJMRV9UWVBFMl9IRUFERVJfU0laRSk6IEZpeAotCXR5cG8uCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcngwLmMsIHNyYy9neHZhbGlkL2d4dm1vcngxLmMsCi0Jc3JjL2d4dmFsaWQvZ3h2bW9yeDIuYywgc3JjL2d4dmFsaWQvZ3h2bW9yeDQuYywKLQlzcmMvZ3h2YWxpZC9neHZtb3J4NS5jLCBzcmMvZ3h2YWxpZC9neHZtb3J0LmM6IEltcHJvdmUgdHJhY2UKLQltZXNzYWdlcy4KLQlEZWNvcmF0ZSBjb25zdGFudHMgd2l0aCBgVScgYW5kIGBMJyB3aGVyZSBhcHByb3ByaWF0ZS4KLQlGaXggY29tcGlsZXIgd2FybmluZ3MuCi0KLTIwMDUtMDgtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IEZpeCB0eXBvLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZic2xuLmMgKGd4dl9ic2xuX3ZhbGlkYXRlKTogRml4IHRyYWNlIG1lc3NhZ2UuCi0KLQkqIHNyYy9neHZhbGlkL2d4dmNvbW1uLmMgKGd4dl9vZHRlY3RfYWRkX3JhbmdlKTogVXNlIGBjb25zdCcuCi0KLQkqIHNyYy9neHZhbGlkL2d4dmZlYXQuYywgc3JjL2d4dmFsaWQvZ3h2anVzdC5jLAotCXNyYy9neHZhbGlkL2d4dmtlcm4uYywgc3JjL2d4dmFsaWQvZ3h2bGNhci5jLCBzcmMvZ3h2YWxpZC9neHZtb2QuYywKLQlzcmMvZ3h2YWxpZC9neHZtb3J0MC5jLCBzcmMvZ3h2YWxpZC9neHZtb3J0MS5jLAotCXNyYy9neHZhbGlkL2d4dm1vcnQyLmMsIHNyYy9neHZhbGlkL2d4dm1vcnQ0LmMsCi0Jc3JjL2d4dmFsaWQvZ3h2bW9ydDUuYywgc3JjL2d4dmFsaWQvZ3h2bW9ydC5jOiBJbXByb3ZlIHRyYWNlCi0JbWVzc2FnZXMuCi0JRGVjb3JhdGUgY29uc3RhbnRzIHdpdGggYFUnIGFuZCBgTCcgd2hlcmUgYXBwcm9wcmlhdGUuCi0JRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCi0yMDA1LTA4LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9neHZhbGlkL1JFQURNRTogUmV2aXNlZC4KLQkqIHNyYy9neHZhbGlkL2d4dmJzbG4uYzogRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3JjL2d4dmFsaWQvZ3h2Y29tbW4uYzogRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCShneHZfWEVudHJ5VGFibGVfdmFsaWRhdGUsIGd4dl9jb21wYXJlX3Jhbmdlcyk6IFJlbW92ZSB1bnVzZWQKLQlwYXJhbWV0ZXIuICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0JSW1wcm92ZSB0cmFjZSBtZXNzYWdlcy4KLQlTb21lIGZvcm1hdHRpbmcuCi0KLTIwMDUtMDgtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaDogQWRkCi0JYSBwcmVsaW1pbmFyeSBzZWN0aW9uIHdpdGggc29tZSBleHBsYW5hdGlvbnMgYWJvdXQgdXNlciBhbGxvY2F0aW9uLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChIdG1sRm9ybWF0dGVyLnNlY3Rpb25fZW50ZXIpOgotCURvbid0IGFib3J0IGlmIHRoZXJlIGFyZSBubyBkYXRhIHR5cGVzLCBmdW5jdGlvbnMsIGV0Yy4sIGluIGEKLQlzZWN0aW9uLgotCVByaW50IHN5bm9wc2lzIG9ubHkgaWYgd2UgaGF2ZSBhIGRhdGEgdHlwZSwgZnVuY3Rpb24sIGV0Yy4KLQotCSogZG9jcy9JTlNUQUxMLkFOWSwgZG9jcy9JTlNUQUxMLCBkb2NzL0lOU1RBTEwuVU5YLCBkb2NzL0NVU1RPTUlaRSwKLQlkb2NzL0lOU1RBTEwuR05VLCBkb2NzL1RSVUVUWVBFLCBkb2NzL0RFQlVHLCBkb2NzL1VQR1JBREUuVU5YLAotCWRvY3MvVkVSU0lPTi5ETEwsIGRvY3MvZm9ybWF0cy50eHQ6IFJldmlzZWQsIGZvcm1hdHRlZC4KLQotMjAwNS0wOC0yOCAgR2VvcmdlIFdpbGxpYW1zICA8Z3d3QHNpbGNvbS5jb20+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgW1RUX01BWF9DT01QT1NJVEVfUkVDVVJTRV06IFJlbW92ZWQuCi0JKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBMaW1pdCByZWN1cnNpb24gZGVwdGggYnkgYG1heENvbXBvbmVudERlcHRoJy4KLQotMjAwNS0wOC0yNSAgSi4gQWxpIEhhcmxvdyAgPGFsaUBhdnJjLmNpdHkuYWMudWs+Ci0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlMi5pbiAoQ0ZsYWdzKTogQWRkIG1pc3NpbmcgZGlyZWN0b3J5LgotCi0yMDA1LTA4LTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogTWVudGlvbiBneHZhbGlkIG1vZHVsZS4KLQotMjAwNS0wOC0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3Nfc2NhbGUpOiBJbml0aWFsaXplCi0JcmVuZGVyIG1vZGUgcHJvcGVybHkuICBSZXBvcnRlZCBieSBjaHJpc0Bkb2tlaW4uY28udWsuCi0KLTIwMDUtMDgtMjMgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlBZGQgZ3h2YWxpZCBtb2R1bGUgdG8gdmFsaWRhdGUgVHJ1ZVR5cGUgR1gvQUFUIHRhYmxlcy4KLQotCU1vZGlmaWNhdGlvbnMgb24gZXhpc3RpbmcgZmlsZXM6Ci0KLQkqIEphbWZpbGU6IFJlZ2lzdGVyIGd4dmFsaWQgbW9kdWxlLgotCSogc3JjL2Jhc2UvSmFtZmlsZTogUmVnaXN0ZXIgZnRneHZhbC5jLgotCSogc3JjL2Jhc2UvcnVsZS5tazogUmVnaXN0ZXIgZnRneHZhbC5jLgotCSogZG9jcy9JTlNUQUxMLkFOWTogUmVnaXN0ZXIgZ3h2YWxpZC9neHZhbGlkLmMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX0dYX1ZBTElEQVRFX0gpOiBOZXcgbWFjcm8KLQl0byBpbmNsdWRlIGd4dmFsaWQgaGVhZGVyIGZpbGUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBSZWdpc3RlciBneHZfbW9kdWxlX2NsYXNzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaDogQWRkIGNvbW1lbnQgYWJvdXQgZ3hfdmFsaWRhdGlvbi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRvdHZhbC5oOiBDaGFuZ2Uga2V5d29yZCBGVF9WQUxJREFURV9YWFgKLQl0byBGVF9WQUxJREFURV9PVFhYWCB0byBjby1leGlzdCB3aXRoIGd4dmFsaWQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oOiBBZGQgdGFncyBmb3IgVHJ1ZVR5cGUgR1gvQUFUIHRhYmxlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCAoRlRfU0VSVklDRV9HWF9WQUxJREFURV9IKTogTmV3Ci0JbWFjcm8gZm9yIGd4dmFsaWQgc2VydmljZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGQgdHJhY2UgZmFjaWxpdGllcyBmb3IKLQlneHZhbGlkLgotCi0JTmV3IGZpbGVzIG9uIGV4aXN0aW5nIGRpcmVjdG9yaWVzOgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z3h2YWwuaDogUmVnaXN0cmF0aW9uIG9mCi0JdmFsaWRhdGlvbiBzZXJ2aWNlIGZvciBUcnVlVHlwZSBHWC9BQVQgYW5kIGNsYXNzaWMga2VybiB0YWJsZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRneHZhbC5oOiBQdWJsaWMgQVBJIGRlZmluaXRpb24gdG8gdXNlIGd4dmFsaWQuCi0JKiBzcmMvYmFzZS9mdGd4dmFsLmM6IFB1YmxpYyBBUEkgb2YgZ3h2YWxpZC4KLQotCU5ldyBmaWxlcyB1bmRlciBzcmMvZ3h2YWxpZC86Ci0KLQkqIHNyYy9neHZhbGlkL0phbWZpbGUgc3JjL2d4dmFsaWQvUkVBRE1FIHNyYy9neHZhbGlkL21vZHVsZS5tawotCXNyYy9neHZhbGlkL3J1bGVzLm1rIHNyYy9neHZhbGlkL2d4dmFsaWQuYyBzcmMvZ3h2YWxpZC9neHZhbGlkLmgKLQlzcmMvZ3h2YWxpZC9neHZic2xuLmMgc3JjL2d4dmFsaWQvZ3h2Y29tbW4uYyBzcmMvZ3h2YWxpZC9neHZjb21tbi5oCi0Jc3JjL2d4dmFsaWQvZ3h2ZXJyb3IuaCBzcmMvZ3h2YWxpZC9neHZmZWF0LmMgc3JjL2d4dmFsaWQvZ3h2Zmdlbi5jCi0Jc3JjL2d4dmFsaWQvZ3h2anVzdC5jIHNyYy9neHZhbGlkL2d4dmtlcm4uYyBzcmMvZ3h2YWxpZC9neHZsY2FyLmMKLQlzcmMvZ3h2YWxpZC9neHZtb2QuYyBzcmMvZ3h2YWxpZC9neHZtb2QuaCBzcmMvZ3h2YWxpZC9neHZtb3J0LmMKLQlzcmMvZ3h2YWxpZC9neHZtb3J0Lmggc3JjL2d4dmFsaWQvZ3h2bW9ydDAuYyBzcmMvZ3h2YWxpZC9neHZtb3J0MS5jCi0Jc3JjL2d4dmFsaWQvZ3h2bW9ydDIuYyBzcmMvZ3h2YWxpZC9neHZtb3J0NC5jIHNyYy9neHZhbGlkL2d4dm1vcnQ1LmMKLQlzcmMvZ3h2YWxpZC9neHZtb3J4LmMgc3JjL2d4dmFsaWQvZ3h2bW9yeC5oIHNyYy9neHZhbGlkL2d4dm1vcngwLmMKLQlzcmMvZ3h2YWxpZC9neHZtb3J4MS5jIHNyYy9neHZhbGlkL2d4dm1vcngyLmMgc3JjL2d4dmFsaWQvZ3h2bW9yeDQuYwotCXNyYy9neHZhbGlkL2d4dm1vcng1LmMgc3JjL2d4dmFsaWQvZ3h2b3BiZC5jIHNyYy9neHZhbGlkL2d4dnByb3AuYwotCXNyYy9neHZhbGlkL2d4dnRyYWsuYzogTmV3IGZpbGVzLCBneHZhbGlkIGJvZHkuCi0KLTIwMDUtMDgtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9HbHlwaCk6IE9ubHkgdHJhbnNsYXRlIG91dGxpbmUKLQl0byAoMCwwKSBpZiBiaXQgMSBvZiB0aGUgYGhlYWQnIHRhYmxlIGlzbid0IHNldC4gIFRoaXMgaW1wcm92ZXMKLQlyZW5kZXJpbmcgb2YgYnVnZ3kgZm9udHMuCi0KLTIwMDUtMDgtMjAgIENoaWEgSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoTG9hZF9HbHlwaCk6IERvbid0IGNoZWNrIHRoZSB2YWxpZGl0eSBvZgotCXR0bWV0cmljcyBoZXJlLiAgVHJ1ZVR5cGUgZm9udHMgd2l0aCBvbmx5IHNiaXRzIGFsd2F5cyBoYXZlCi0JdHRtZXRyaWNzLnZhbGlkIHNldCB0byBmYWxzZS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9HbHlwaCk6IENoZWNrIHRoYXQgdHRtZXRyaWNzIGlzCi0JdmFsaWQgYmVmb3JlIGxvYWRpbmcgb3V0bGluZSBnbHlwaC4KLQotCSogc3JjL2NhY2hlL2Z0Y2ltYWdlLmMgKEZUQ19JTm9kZV9OZXcpOiBGaXggYSBtZW1vcnkgbGVhay4KLQotMjAwNS0wOC0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX21ldHJpY3NfaGVhZGVyKTogSWdub3JlIG1pc3NpbmcKLQlgaGhlYScgdGFibGUgZm9yIFNGTlQgTWFjIGZvbnRzLiAgQ2hhbmdlIGJhc2VkIG9uIGEgcGF0Y2ggYnkKLQltcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcC4KLQotMjAwNS0wOC0yMCAgTWFzYXRha2UgWUFNQVRPICA8amV0QGd5dmUub3JnPgotCi0JKiBzcmMvb3R2YWxpZC9vdHZtb2QuYyAob3R2X3ZhbGlkYXRlKTogVXNlIGZ0X3ZhbGlkYXRvcl9ydW4gaW5zdGVhZAotCW9mIGZ0X3NldGptcC4KLQotMjAwNS0wOC0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogRml4IGNvbXBpbGVyCi0Jd2FybmluZ3MuCi0KLTIwMDUtMDgtMTYgIENoaWEgSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYywgc3JjL3RydWV0eXBlL3R0aW50ZXJwLmg6IFVwZGF0ZSBjb3B5cmlnaHQKLQltZXNzYWdlcy4KLQotMjAwNS0wOC0xNiAgQ2hpYSBJIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jLCBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaDogUmVtb3ZlIG9yaWdpbmFsCi0JVFRfRG9uZV9Db250ZXh0IGFuZCByZW5hbWUgVFRfRGVzdHJveV9Db250ZXh0IHRvIFRUX0RvbmVfQ29udGV4dAotCXdpdGggc2xpZ2h0IGNoYW5nZXMuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCShUVF9OZXdfQ29udGV4dCk6IE5vdyB0YWtlcyBUVF9Ecml2ZXIgYXJndW1lbnQgZGlyZWN0bHkuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmggKHR0X3Nsb3RfaW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZHJpdmVyX2luaXQpOiBJbml0aWFsaXplIGV4ZWN1dGlvbgotCWNvbnRleHQgaGVyZS4KLQkodHRfc2xvdF9pbml0KTogTmV3IGZ1bmN0aW9uIHRvIGNyZWF0ZSBleHRyYSBwb2ludHMgZm9yIHRoZSBpbnRlcm5hbAotCWdseXBoIGxvYWRlci4gIFdlIHRoZW4gdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIG9mIGZhY2UncyBnbHlwaAotCWxvYWRlciwgd2hlbiBsb2FkaW5nIGdseXBoLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfZHJpdmVyX2NsYXNzKTogVXNlIHR0X3Nsb3RfaW5pdCBmb3IKLQlnbHlwaCBzbG90IGluaXRpYWxpemF0aW9uLgotCShMb2FkX0dseXBoKTogTG9hZCBmbGFnIGRlcGVuZGVuY2llcyBhcmUgaGFuZGxlZCBoZXJlLiAgUmV0dXJuIGVycm9yCi0JaWYgc2l6ZSBpcyBOVUxMLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jOiBIZWF2eSBjbGVhbnVwIGFuZCByZWZhY3RvcmluZy4KLQkob3JnX3RvX2N1cik6IFJlbW92ZWQuCi0JKFRUX0xvYWRfU2ltcGxlX0dseXBoKTogQ2FsbCBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cy4KLQkoVFRfSGludF9HbHlwaCk6IE5ldyBmdW5jdGlvbiB0byBoaW50IGEgem9uZSwgcHJlcGFyZWQgYnkgY2FsbGVyLgotCShUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCk6IHMvbG9hZC9sb2FkZXIvLgotCVVzZSBsb2FkZXItPnBwIHZhbHVlcyBpbnN0ZWFkIG9mIHJlY2FsY3VsYXRpb24uCi0JVXNlIFRUX0hpbnRfR2x5cGguCi0JTm8gbmVlZCB0byBzYXZlL3Jlc3RvcmUgbG9hZGVyLT5zdHJlYW0gYmVmb3JlIGFuZCBhZnRlcgotCVRUX1ZhcnlfR2V0X0dseXBoX0RlbHRhcyBub3cuCi0JKFRUX0xPQURFUl9TRVRfUFApOiBOZXcgbWFjcm8gdG8gY2FsY3VsYXRlIGFuZCBzZXQgdGhlIGZvdXIgcGhhbnRvbQotCXBvaW50cy4KLQkobG9hZF90cnVldHlwZV9nbHlwaCk6IE5ldmVyIHNldCBleGVjLT5nbHlwaFNpemUgdG8gMC4gIFRoaXMgY2xvc2VzCi0JU2F2YW5uYWggYnVnICMxMzEwNy4KLQlGb3JnZXQgZ2x5cGggZnJhbWUgYmVmb3JlIGNhbGxpbmcgVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGguCi0JVXNlIFRUX0xPQURFUl9TRVRfUFAuCi0JU2NhbGUgYWxsIGZvdXIgcGhhbnRvbSBwb2ludHMuCi0JU3BsaXQgb2ZmIHNvbWUgZnVuY3Rpb25hbGl0eSB0byAuLi4KLQkoVFRfUHJvY2Vzc19Db21wb3NpdGVfQ29tcG9uZW50LCBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9HbHlwaCk6IFRoZXNlCi0JbmV3IGZ1bmN0aW9ucy4KLQkoVFRfTG9hZF9HbHlwaCk6IFNldCB2YXJpb3VzIGZpZWxkcyBvZiBgZ2x5cGgnIGhlcmUsIG5vdCBpbgotCWxvYWRfdHJ1ZXR5cGVfZ2x5cGggYW5kIGNvbXB1dGVfZ2x5cGhfbWV0cmljcy4KLQlTcGxpdCBvZmYgc29tZSBmdW5jdGlvbmFsaXR5IHRvIC4uLgotCShsb2FkX3NiaXRfaW1hZ2UsIHR0X2xvYWRlcl9pbml0KTogVGhlc2UgbmV3IGZ1bmN0aW9ucy4KLQkoY29tcHV0ZV9nbHlwaF9tZXRyaWNzKTogQ2FsbCBGVF9PdXRsaW5lX0dldF9DQm94LgotCi0yMDA1LTA4LTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvSU5TVEFMTC5BTlk6IFVwZGF0ZWQuCi0KLTIwMDUtMDgtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKSwKLQlzcmMvcHNhdXgvcHNvYmpzLmMgKHQxX2J1aWxkZXJfY2xvc2VfY29udG91cik6IFByb3RlY3QgYWdhaW5zdAotCXplcm8gYG91dGxpbmUnIHBvaW50ZXIuCi0KLQkqIHNyYy9iYXNlL2Z0Z2xvYWRyLmMgKEZUX0dseXBoTG9hZGVyX0FkZCk6IFByb3RlY3QgYWdhaW5zdCB6ZXJvCi0JYGxvYWRlcicgYWRkcmVzcy4KLQotMjAwNS0wOC0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2ludGVyZmFjZSkgW0ZUX09QVElNSVpFX01FTU9SWV06Ci0JUmVhY3RpdmF0ZSBwb2ludGVycyB0byB0dF9maW5kX3NiaXRfaW1hZ2UgYW5kIHR0X2xvYWRfc2JpdF9tZXRyaWNzCi0JdG8gbWFrZSBYIHdvcmsgYWdhaW4uCi0KLTIwMDUtMDgtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL290dmFsaWQvb3R2Y29tbW4uaDogUmVtb3ZlIGRlYWQgY29kZS4KLQotMjAwNS0wNy0zMSAgQ2hpYSBJIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuaCAodHRfc2l6ZV9ydW5fZnBnbSwgdHRfc2l6ZV9ydW5fcHJlcCk6IE5ldwotCWZ1bmN0aW9ucy4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX3J1bl9mcGdtLCB0dF9zaXplX3J1bl9wcmVwKTogTmV3Ci0JZnVuY3Rpb25zLgotCSh0dF9zaXplX2luaXQpOiBBZGQgNCwgaW5zdGVhZCBvZiAyLCAocGhhbnRvbSkgcG9pbnRzIHRvIHR3aWxpZ2h0Ci0Jem9uZS4KLQlNb3ZlIGNvZGUgdGhhdCBydW5zIGZwZ20gdG8gdHRfc2l6ZV9ydW5fZnBnbS4KLQkoUmVzZXRfT3V0bGluZV9TaXplKTogTW92ZSBjb2RlIHRoYXQgcnVucyBwcmVwIHRvIHR0X3NpemVfcnVuX3ByZXAuCi0JKHR0X2dseXBoem9uZV9uZXcpOiBBbGxvY2F0ZSByaWdodCBzaXplIG9mIGFycmF5cy4KLQlTZXQgbWF4X3BvaW50cyBhbmQgbWF4X2NvbnRvdXJzIHByb3Blcmx5LgotCi0yMDA1LTA3LTI2ICBDaGlhIEkgV3UgIDxiOTAyMDEwNDdAbnR1LmVkdS50dz4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKFNldF9DaGFyX1NpemVzKTogQXZvaWQgdW5uZWNlc3NhcnkKLQljb21wdXRhdGlvbnMgYW5kIGNsZWFuIHVwLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmggKHN0cnVjdCBUVF9TaXplUmVjXyk6IENvbW1lbnQgb24gdGhlCi0JaW50ZXJuYWwgY29weSBvZiBtZXRyaWNzLgotCi0yMDA1LTA3LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oIChGVF9PdXRsaW5lX0VtYm9sZGVuKTogRml4IHByb3RvdHlwZS4KLQlSZXBvcnRlZCBieSBYZXJ4ZXMuCi0KLTIwMDUtMDctMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oIChGVF9SRUFMTE9DX0FSUkFZKTogRml4IHR5cG8uCi0JUmVwb3J0ZWQgYnkgQnJldHQgSHV0bGV5LgotCi0yMDA1LTA2LTMwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9zZm50L2Z0Yml0bWFwLmMsIHNyYy90cnVldHlwZS90dGdsb2FkLmMsIHNyYy9zZm50L3R0Y21hcC5jOgotCVJlbW92aW5nIGNvbXBpbGVyIHdhcm5pbmdzIChWaXN1YWwgQysrIC9XNCkuCi0KLQotCUltcGxlbWVudCBhIHdvcmstYXJvdW5kIGZvciBicm9rZW4gQyBwcmVwcm9jZXNzb3IgaW4gVmlzdWFsIEMrKyAoaXQKLQloYXMgYmVlbiBjb25maXJtZWQgYnkgdGhlIE1TIGRldmVsb3BlcnMgdGhhdCBpdCBpcyBpbmRlZWQgYSBidWcKLQl3aGljaCB3b24ndCBiZSBmaXhlZCBpbiB0aGUgdmVyeSBuZWFyIGZ1dHVyZSkuCi0KLQkqIEphbWZpbGUgKEZUMl9DT01QT05FTlRTKTogSW5jbHVkZSBvdHZhbGlkIChhZ2FpbikuCi0KLQkqIHNyYy9vdHZhbGlkL290dmNvbW1uLmggKE9UVl9OQU1FLCBPVFZfRlVOQyk6IE5ldyBtYWNyb3MuCi0JKE9UVl9ORVNUMSwgT1RWX05FU1QyLCBPVFZfTkVTVDMpOiBVc2UgT1RWX05BTUUgYW5kIE9UVl9GVU5DIHRvCi0JYXZvaWQgYXJndW1lbnQgZXhwYW5zaW9uIGJ5IGFyZ3VtZW50IHByZXNjYW4uCi0JQXBwZW5kIGBGdW5jJyB0byBhbGwgYWZmZWN0ZWQgbWFjcm9zIGFuZCBjaGFuZ2UgdGhlbSB0byB0YWtlIGp1c3QgYQotCXNpbmdsZSBhcmd1bWVudC4gIEV4YW1wbGU6IGBBdHRhY2hMaXN0JyBpcyByZW5hbWVkIHRvCi0JYEF0dGFjaExpc3RGdW5jJy4KLQotCSogc3JjL290dmFsaWQvb3R2Z2RlZi5jLCBzcmMvb3R2YWxpZC9vdHZncG9zLmMsCi0Jc3JjL290dmFsaWQvb3R2Z3N1Yi5jLCBzcmMvb3R2anN0Zi5jOiBBcHBlbmQgYEZ1bmMnIHRvIG1hY3JvcwotCWFmZmVjdGVkIGJ5IHRoZSBjaGFuZ2VzIHRvIE9UVl9ORVNUeCBhbmQgbW9kaWZ5IHRoZW0gdG8gdGFrZSBqdXN0IGEKLQlzaW5nbGUgYXJndW1lbnQuCi0KLTIwMDUtMDYtMjAgIENoaWEgSSBXdSAgPGI5MDIwMTA0N0BudHUuZWR1LnR3PgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oLCBzcmMvYmFzZS9mdG9ianMuYzogTmV3IGZ1bmN0aW9uCi0JZnRfZ2x5cGhzbG90X2dyaWRfZml0X21ldHJpY3MuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGNvbXB1dGVfZ2x5cGhfbWV0cmljcyk6IFVzZQotCWZ0X2dseXBoc2xvdF9ncmlkX2ZpdF9tZXRyaWNzLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpLCBzcmMvY2lkL2NpZGdsb2FkLmMKLQkoY2lkX3Nsb3RfbG9hZF9nbHlwaCksIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX0xvYWRfR2x5cGgpOiBVc2UKLQlmdF9nbHlwaHNsb3RfZ3JpZF9maXRfbWV0cmljcy4KLQlGVF9PdXRsaW5lX0dldF9DQm94IGlzIGNhbGxlZCB0d2ljZS4KLQotCSogc3JjL2Jhc2UvZnRzeW50aC5jIChGVF9HbHlwaFNsb3RfRW1ib2xkZW4pOiBNb2RpZnkgbWV0cmljcyB0byBtb3JlCi0JcmVhc29uYWJsZSB2YWx1ZXMgd2hlbiBlbWJvbGRlbmluZyBvdXRsaW5lIGdseXBocy4gIFRoZSB0aGVvcmV0aWMKLQlvbmVzIGFyZSB1bnJlYWxpc3RpYy4KLQotMjAwNS0wNi0xNiAgQ2hpYSBJIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9FbWJvbGRlbik6IFN0cmVuZ3RoIHNob3VsZCBiZQotCWhhbHZlZC4KLQotCSogc3JjL2Jhc2UvZnRzeW50aC5jIChGVF9HbHlwaFNsb3RfRW1ib2xkZW4pOiBDaGFuZ2UgdGhlIGRlZmF1bHQKLQlzdHJlbmd0aC4KLQlEb24ndCBpbmNyZWFzZSBzbG90LT5hZHZhbmNlLnkuCi0KLTIwMDUtMDYtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9NSU5PUik6IFNldCB0byAyLgotCShGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAwLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUuYWMgKHZlcnNpb25faW5mbyk6IFNldCB0byA5Ojk6My4KLQlDdXJyZW50bHksIHdlIGFyZSBzdGlsbCBiaW5hcnkgY29tcGF0aWJsZS4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qOiBzLzIxOS8yMTEwLywgcy8yLjEuOS8yLjEuMTAvLgotCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKHJlZmRvYyksIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKToKLQlzLzIuMS45LzIuMS4xMC8uCi0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlZC4KLQotCSogQ2hhbmdlTG9nOiBTcGxpdCBvZmYgb2xkZXIgZW50cmllcyBpbnRvLi4uCi0JKiBDaGFuZ2VMb2cuMjAsIENoYW5nZUxvZy4yMTogVGhlc2UgbmV3IGZpbGVzLgotCi0yMDA1LTA2LTE1ICBLaXJpbGwgU21lbGtvdiAgPGtpcnJAbW5zLnNwYi5ydT4KLQotCVRoZSBuZXh0IHJlbGVhc2Ugd2lsbCBiZSAyLjIuMCwgc28gZG9uJ3Qgd29ycnkgYWJvdXQgc291cmNlIGNvZGUKLQliYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCAoRlRfT3V0bGluZV9Nb3ZlVG9GdW5jLAotCUZUX091dGxpbmVfTGluZVRvRnVuYywgRlRfT3V0bGluZV9Db25pY1RvRnVuYywKLQlGVF9PdXRsaW5lX0N1YmljVG9GdW5jLCBGVF9TcGFuRnVuYywgRlRfUmFzdGVyX1JlbmRlckZ1bmMpLAotCWluY2x1ZGUvZnJlZXR5cGUvZnRyZW5kZXIuaCAoRlRfR2x5cGhfVHJhbnNmb3JtRnVuYywKLQlGVF9SZW5kZXJlcl9SZW5kZXJGdW5jLCBGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jKTogRGVjb3JhdGUKLQlwYXJhbWV0ZXJzIHdpdGggYGNvbnN0JyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotMjAwNS0wNi0xNSAgQ2hpYSBJIFd1ICA8YjkwMjAxMDQ3QG50dS5lZHUudHc+Ci0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9mYWNlX2xvYWRfc2JpdF9pbWFnZSk6IENvbXB1dGUgdmVydEJlYXJpbmdZCi0JdG8gbWFrZSBnbHlwaHMgY2VudGVyZWQgdmVydGljYWxseS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoY29tcHV0ZV9nbHlwaF9tZXRyaWNzKTogQ29tcHV0ZQotCXZlcnRCZWFyaW5nWSB0byBtYWtlIGdseXBocyBjZW50ZXJlZCB2ZXJ0aWNhbGx5LgotCUZpeCBzb21lIGJ1Z3MgaW4gdmVydGljYWwgbWV0cmljczoKLQotCSAgLiBsb2FkZXItPnBwMy55IGFuZCBsb2FkZXItPnBwNC55IGFyZSBpbiAyNi42IGZvcm1hdCwgbm90IGluIGZvbnQKLQkgICAgdW5pdHMuCi0JICAuIEFzIHdlIHVzZSB0aGUgZ2x5cGgncyBjYm94IHRvIGNhbGN1bGF0ZSB0aGUgdG9wIGJlYXJpbmcgbm93Ci0JICAgIHRoZXJlIGlzIG5vIG5lZWQgdG8gYWRqdXN0IGB0b3AnLgotCi0yMDA1LTA2LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9vdHZhbGlkL290dmNvbW1uLmggKE9UVl9PUFRJT05BTF9UQUJMRSk6IFVzZSBGVF9VU2hvcnQgdG8gYmUKLQlpbiBzeW5jIHdpdGggT1RWX09QVElPTkFMX09GRlNFVC4gIFJlcG9ydGVkIGJ5IFlBTUFUTyBNYXNhdGFrZS4KLQotMjAwNS0wNi0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL3JlbGVhc2U6IFVwZGF0ZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAwNS0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi1hbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi1MSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLWZ1bGx5LgotCi0KLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLWNvZGluZzogdXRmLTgKLUVuZDoKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yMyBiL0NoYW5nZUxvZy4yMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0ZjM0ZC4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cuMjMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTQ4ICswLDAgQEAKLTIwMTAtMDItMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjMuMTIgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMy0xMicuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjMuMTIuCi0KLQkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwKLQlidWlsZHMvd2luMzIvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMDgvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sLCBidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbDogcy8yLjMuMTEvMi4zLjEyLywgcy8yMzExLzIzMTIvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDEyLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTA6MDo0LgotCi0yMDEwLTAyLTEyICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JSW1wcm92ZSBhdXRvdG9vbCB2ZXJzaW9uIGNoZWNraW5nIHRvIHdvcmsgd2l0aCBiZXRhIHJlbGVhc2VzLgotCi0JKiBhdXRvZ2VuLnNoIChjaGVja190b29sX3ZlcnNpb24pOiBJbXByb3ZlIHRoZSBleHRyYWN0aW9uIG9mIHZlcnNpb24KLQludW1iZXIgZnJvbSAidG9vbCAtLXZlcnNpb24iIG91dHB1dC4gIFNvbWUgYmV0YSByZWxlYXNlcyBvZgotCWF1dG90b29scyBoYXZlIGV4dHJhIHN0cmluZ3MgYmVmb3JlIHZlcnNpb24gbnVtYmVyLgotCi0yMDEwLTAyLTEyICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JRml4IG92ZXJhbGxvY2F0aW5nIGJ1ZyBpbiBGVF9PdXRsaW5lX05ld19JbnRlcm5hbCgpLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfTmV3X0ludGVybmFsKTogVGhlIGxlbmd0aCBvZgotCUZUX091dGxpbmUtPnBvaW50c1tdIHNob3VsZCBiZSBudW1Qb2ludHMsIG5vdCAyICogbnVtUG9pbnRzLgotCUZvdW5kIGJ5IFBhdWwgTWVzc21lciwgc2VlCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTAtMDIvbXNnMDAwMDMuaHRtbAotCi0yMDEwLTAyLTEwICBLZW4gU2hhcnAgIDxrZW4uc2hhcnBAYXJ0aWZleC5jb20+Ci0KLQlSZWFsbHkgZml4IFNhdmFubmFoIGJ1ZyAjMjg2NzggKHBhcnQgMikuCi0KLQlTaW5jZSB3ZSBjb25zaWRlciBgc2J3JyBmb3IgdGhlIGhvcml6b250YWwgZGlyZWN0aW9uIG9ubHksIHdlIHN0aWxsIGhhdmUKLQl0byBzeW50aGVzaXplIHZlcnRpY2FsIG1ldHJpY3MgaWYgdGhlIHVzZXIgd2FudHMgdG8gdXNlIHRoZSB2ZXJ0aWNhbAotCXdyaXRpbmcgZGlyZWN0aW9uLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpLCBzcmMvY2lkL2NpZGdsb2FkLmMKLQkoY2lkX3Nsb3RfbG9hZF9nbHlwaCksIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX0xvYWRfR2x5cGgpOgotCVN5bnRoZXNpemUgdmVydGljYWwgbWV0cmljcyAob25seSkgaWYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgaXMKLQlzZXQuCi0KLTIwMTAtMDItMTAgIEtlbiBTaGFycCAgPGtlbi5zaGFycEBhcnRpZmV4LmNvbT4KLQotCVJlYWxseSBmaXggU2F2YW5uYWggYnVnICMyODY3OCAocGFydCAxKS4KLQotCUFmdGVyIGxvbmcgZGlzY3Vzc2lvbiwgd2Ugbm93IGNvbnNpZGVyIHRoZSBjaGFyYWN0ZXIgd2lkdGggdmVjdG9yCi0JKHd4LHd5KSByZXR1cm5lZCBieSB0aGUgYHNidycgVHlwZSAxIG9wZXJhdG9yIGFzIGJlaW5nIHBhcnQgb2YgKm9uZSoKLQlkaXJlY3Rpb24gb25seS4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBob3Jpem9udGFsCi0Jd3JpdGluZyBkaXJlY3Rpb24sIHlvdSBnZXQgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvbXBvbmVudHMgb2YKLQl0aGUgYWR2YW5jZSB3aWR0aCBmb3IgdGhpcyBkaXJlY3Rpb24uICBOb3RlIHRoYXQgT3BlblR5cGUgYW5kIENGRiBmb250cwotCWRvbid0IGhhdmUgc3VjaCBhIHZlcnRpY2FsIGNvbXBvbmVudDsgaW5zdGVhZCwgdGhlIEdQT1MgdGFibGUgY2FuIGJlCi0JdXNlZCB0byBnZW5lcmF0ZSB0d28tZGltZW5zaW9uYWwgYWR2YW5jZSB3aWR0aHMgKGJ1dCB0aGlzIGlzbid0Ci0JaGFuZGxlZCBieSBGcmVlVHlwZSkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaCAoRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYyk6IEFkZAotCWBhZHZhbmNlX3YnIGZpZWxkIHRvIGhvbGQgdGhlIHZlcnRpY2FsIGNvbXBvbmVudCBvZiB0aGUgYWR2YW5jZQotCXZhbHVlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jICh0dF9nZXRfbWV0cmljcyksIHNyYy9jZmYvY2ZmZ2xvYWQuYwotCShjZmZfc2xvdF9sb2FkKSwgc3JjL3R5cGUxL3QxZ2xvYWQuYwotCShUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKSwgc3JjL2NpZC9jaWRnbG9hZC5jCi0JKGNpZF9sb2FkX2dseXBoKTogVXNlIGl0LgotCi0yMDEwLTAyLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRldmVsL2Z0b3B0aW9uLmggW0ZUX0NPTkZJR19PUFRJT05fUElDXTogRGVmaW5lLgotCi0yMDEwLTAyLTA0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JUHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UgcGFzc2VkIHRvIEZUX01vZHVsZV9SZXF1ZXN0ZXIuCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X2ludGVyZmFjZSk6IERvbid0IHVzZSBgbW9kdWxlJy4KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKHBzbmFtZXNfZ2V0X2ludGVyZmFjZSk6IERpdHRvLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfaW50ZXJmYWNlKTogQ2hlY2sgTlVMTCBgZHJpdmVyJy4KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9nZXRfaW50ZXJmYWNlKTogRGl0dG8uCi0KLTIwMTAtMDEtMjkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGaXggbWVtb3J5IGxlYWtzIGluIHByZXZpb3VzIHBhdGNoLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBEb24ndCBvdmVyd3JpdGUgdGhlIHN0cmluZ3MKLQlhbGxvY2F0ZWQgZm9yIGZhY2UtPnJvb3QuZmFtaWx5X25hbWUgYW5kIHN0eWxlX25hbWUuCi0KLTIwMTAtMDEtMjkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlOZXcgcGFyYW1ldGVycyBmb3IgRlRfT3Blbl9GYWNlKCkgdG8gaWdub3JlIHByZWZlcnJlZCBmYW1pbHkgbmFtZXMuCi0KLQlQcmVmZXJyZWQgZmFtaWx5IG5hbWVzIHNob3VsZCBiZSB1c2VkIGZvciBsZWdhY3kgc3lzdGVtcyB0aGF0Ci0JY2FuIGhvbGQgb25seSBhIGZldyBmYWNlcyAoPD0gNCkgZm9yIGEgZmFtaWx5IG5hbWUuIFN1Z2dlc3RlZCBieQotCUFuZHJlYXMgSGVpbnJpY2guCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLzIwMTAtMDEvbXNnMDAwMDEuaHRtbAotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmggKEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX0ZBTUlMWSwKLQlGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9TVUJGQU1JTFkpOiBEZWZpbmUuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2xvYWRfZmFjZSk6IENoZWNrIHRoZSBhcmd1bWVudHMgYW5kCi0JaWdub3JlIHByZWZlcnJlZCBmYW1pbHkgYW5kIHN1YmZhbWlseSBuYW1lcyBpZiByZXF1ZXN0ZWQuCi0KLTIwMTAtMDEtMjcgIEtlbiBTaGFycCAgPGtlbi5zaGFycEBhcnRpZmV4LmNvbT4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI4Njc4LgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpLCBzcmMvY2lkL2NpZGdsb2FkLmMKLQkoY2lkX2xvYWRfZ2x5cGgpOiBIYW5kbGUgdmVydGljYWwgbWV0cmljcyBjb3JyZWN0bHkuCi0KLQkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX1BhcnNlX0dseXBoX0FuZF9HZXRfQ2hhcl9TdHJpbmcpOiBIYW5kbGUKLQl2ZXJ0aWNhbCBtZXRyaWNzIGNvcnJlY3RseS4KLQkoVDFfTG9hZF9HbHlwaCk6IERvbid0IHN5bnRoZXNpemUgdmVydGljYWwgbWV0cmljcy4KLQotMjAxMC0wMS0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWFrZSBGVF9TZXRfVHJhbnNmb3JtIHdvcmsgaWYgbm8gcmVuZGVyZXIgaXMgYXZhaWxhYmxlLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IEFwcGx5IGBzdGFuZGFyZCcgdHJhbnNmb3JtYXRpb24KLQlpZiBubyByZW5kZXJlciBpcyBjb21waWxlZCBpbnRvIHRoZSBsaWJyYXJ5LgotCi0yMDEwLTAxLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsYXRpb24gd2FybmluZy4KLQotCSogc3JjL2Jhc2UvZnRiYXNlLmg6IHMvTE9DQUxfREVGL0xPQ0FMLy4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBJbmNsdWRlIGZ0YmFzZS5oIGNvbmRpdGlvbmFsbHkuCi0KLTIwMTAtMDEtMTEgIEt3YW5nIFl1bCBTZW8gIDxza3l1bEBjb21wYW55MTAwLm5ldD4KLQotCVByb3ZpZGUgaW5saW5lIGFzc2VtYmx5IGNvZGUgZm9yIFJWQ1QgY29tcGlsZXIuCi0JVGhpcyBpcyBTYXZhbm5haCBwYXRjaCAjNzA1OS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCAoRlRfTVVMRklYX0FTU0VNQkxFUiwKLQlGVF9NdWxGaXhfYXJtKSBbX19DQ19BUk0gfHwgX19BUk1fQ0NdOiBEZWZpbmUuCi0KLTIwMTAtMDEtMDggIEtlbiBTaGFycCAgPGtlbi5zaGFycEBhcnRpZmV4LmNvbT4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI4NTIxLgotCi0JSXNzdWUgIzI4MjI2IGludm9sdmVkIGEgd29yay1hcm91bmQgZm9yIGEgZm9udCB3aGljaCB1c2VkIHRoZQotCWBzZXRjdXJyZW50cG9pbnQnIG9wZXJhdG9yIGluIGFuIGludmFsaWQgd2F5OyB0aGlzIG9wZXJhdG9yIGlzIG9ubHkKLQlzdXBwb3NlZCB0byBiZSB1c2VkIHdpdGggdGhlIHJlc3VsdCBvZiBPdGhlclN1YnJzLCBhbmQgdGhlIGZvbnQgdXNlZAotCWl0IGRpcmVjdGx5LiAgVGhlIHN1cHBsaWVkIHBhdGNoIHJlbW92ZWQgdGhlIGJsb2NrIG9mIGNvZGUgd2hpY2gKLQljaGVja2VkIHRoaXMgdXNhZ2UgZW50aXJlbHkuCi0KLQlUaGlzIHR1cm5zIG91dCB0byBiZSBhIEJhZCBUaGluZy4gIElmIGBzZXRjdXJyZW50cG9pbnQnIGlzIGJlaW5nCi0JdXNlZCBjb3JyZWN0bHkgaXQgc2hvdWxkIHJlc2V0IHRoZSBmbGV4IGZsYWcgaW4gdGhlIGRlY29kZXIuICBJZiB3ZQotCWRvbid0IGRvIHRoaXMgdGhlbiB0aGUgZmxhZyBuZXZlciBnZXRzIHJlc2V0IGFuZCB3ZSBvbWl0IGFueSBmdXJ0aGVyCi0JY29udG91cnMgZnJvbSB0aGUgZ2x5cGggKGF0IGxlYXN0IHVudGlsIHdlIGNsb3NlIHRoZSBwYXRoIG9yCi0Jc2ltaWxhcikuCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxvcF9zZXRjdXJyZW50cG9pbnQ+OiBIYW5kbGUgYGZsZXhfc3RhdGUnIGNvcnJlY3RseS4KLQotMjAxMC0wMS0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQXBwbHkgcmVwb3J0cyBmcm9tIGNsYW5nIHN0YXRpYyBhbmFseXplci4KLQotCSogc3JjL2x6dy9mdGx6dy5jIChmdF9sendfZmlsZV9pbml0KSwgc3JjL2Jhc2UvZnRzdHJva2UuYwotCShGVF9TdHJva2VyX1BhcnNlT3V0bGluZSksIHNyYy9iYXNlL2Z0c3ludGguYwotCShGVF9HbHlwaFNsb3RfRW1ib2xkZW4pOiBSZW1vdmUgZGVhZCBjb2RlLgotCi0JKiBzcmMvYmFzZS9mdHBhdGVudC5jIChfdHRfY2hlY2tfcGF0ZW50c19pbl90YWJsZSk6IEluaXRpYWxpemUKLQlgb2Zmc2V0X2knIGFuZCBgbGVuZ3RoX2knLgotCi0yMDEwLTAxLTA1ICBSYWxwaCBHaWxlcyAgPGdpbGVzQGdob3N0c2NyaXB0LmNvbT4KLQotCUVuYWJsZSB0aGUgaW5jcmVtZW50YWwgZm9udCBpbnRlcmZhY2UgYnkgZGVmYXVsdC4KLQotCUdob3N0c2NyaXB0IHJlcXVpcmVzIHRoZSBpbmNyZW1lbnRhbCBmb250IGludGVyZmFjZSBmb3IgaGFuZGxpbmcKLQlzb21lIFBvc3RzY3JpcHQgZG9jdW1lbnRzLiAgSXQgaXMgbW92aW5nIHRvIHVzaW5nIEZyZWVUeXBlIGFzIGl0cwotCXByaW1hcnkgcmVuZGVyZXI7IHN1cHBvcnRpbmcgdGhpcyBpbiB0aGUgZGVmYXVsdCBidWlsZCBtYWtlcyBpdAotCUdob3N0c2NyaXB0IHRvIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBzeXN0ZW0gRnJlZVR5cGUgd2hlbiBvbmUgaXMKLQlhdmFpbGFibGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmggKEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwpOgotCVVuY29tbWVudC4KLQotMjAxMC0wMS0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMjgzOTUuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jIChMb2FkX0dseXBoKSwgc3JjL3R5cGUxL3QxZ2xvYWQuYwotCShUMV9Mb2FkX0dseXBoKTogRG9uJ3QgY2hlY2sgYG51bV9nbHlwaHMnIGlmIGluY3JlbWVudGFsIGludGVyZmFjZQotCWlzIHVzZWQuCi0KLTIwMTAtMDEtMDUgIEtlbiBTaGFycCAgPGtlbi5zaGFycEBhcnRpZmV4LmNvbT4KLQotCU1ha2UgVHlwZSAxIGBzZWFjJyBvcGVyYXRvciB3b3JrIHdpdGggaW5jcmVtZW50YWwgaW50ZXJmYWNlLgotCVRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMyODQ4MC4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxb3BlcmF0b3Jfc2VhYyk6IERvbid0IGNoZWNrIGBnbHlwaF9uYW1lcycKLQlpZiBpbmNyZW1lbnRhbCBpbnRlcmZhY2UgaXMgdXNlZC4KLQotMjAxMC0wMS0wNCAgS2VuIFNoYXJwICA8a2VuLnNoYXJwQGFydGlmZXguY29tPgotCi0JTWFrZSBpbmNyZW1lbnRhbCBpbnRlcmZhY2Ugd29yayB3aXRoIFRydWVUeXBlIGZvbnRzLgotCVRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMyODQ3OC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IERvbid0IGNoZWNrCi0JYGdseWZfb2Zmc2V0JyBpZiBpbmNyZW1lbnRhbCBpbnRlcmZhY2UgaXMgdXNlZC4KLQotMjAwOS0xMi0zMSAgTGFycyBBYnJhaGFtc3NvbiAgPHdvbmtvQG9wZXJhLmNvbT4KLQotCU1ha2UgY29tcGlsYXRpb24gd2l0aCBGVF9DT05GSUdfT1BUSU9OX1BJQyB3b3JrIGFnYWluLgotCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX1RvX0JpdG1hcCkgW0ZUX0NPTkZJR19PUFRJT05fUElDXToKLQlEZWNsYXJlIGBsaWJyYXJ5JyBmb3IgRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVC4KLQotCSogc3JjL2Jhc2UvZnRpbml0LmMgKGZ0X2Rlc3Ryb3lfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcywKLQlmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3Nlcyk6IFVzZSBwcm9wZXIgY2FzdHMgKG5lZWRlZCBmb3IgQysrCi0JY29tcGlsYXRpb24pLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDEzX2NsYXNzX3JlYyk6IFVzZSBGVF9ERUZJTkVfVFRfQ01BUC4KLQotMjAwOS0xMi0yMiAgTWFyYyBLbGVpbmUtQnVkZGUgIDxta2xAcGVuZ3V0cm9uaXguZGU+Ci0KLQlNYWtlIGZyZWV0eXBlLWNvbmZpZyBhd2FyZSBvZiAkU1lTUk9PVC4KLQlUaGlzIGlzIFNhdmFubmFoIHBhdGNoICM3MDQwLgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW46IERlY29yYXRlIHdpdGggJHtTWVNST09UfSB3aGVyZQotCWFwcHJvcHJpYXRlLgotCi0yMDA5LTEyLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsZXIgd2FybmluZy4KLQlSZXBvcnRlZCBieSBTZWFuLgotCi0JKiBzcmMvYmFzZS9mdGRiZ21lbS5jIFshRlRfREVCVUdfTUVNT1JZXTogQU5TSSBDIGRvZXNuJ3QgbGlrZSBlbXB0eQotCXNvdXJjZSBmaWxlczsgaG93ZXZlciwgc29tZSBjb21waWxlcnMgd2FybiBhYm91dCBhbiB1bnVzZWQgdmFyaWFibGUKLQlkZWNsYXJhdGlvbi4gIFRoaXMgaXMgbm93IHJlcGxhY2VkIHdpdGggYSB0eXBlZGVmLgotCi0yMDA5LTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyODMyMC4KLQotCVRoZXJlIGV4aXN0IGNvcnJ1cHQsIHN1YnNldHRlZCBmb250cyAoZW1iZWRkZWQgaW4gUERGIGZpbGVzKSB3aGljaAotCWNvbnRhaW4gYSBwcml2YXRlIGRpY3QgdGhhdCBlbmRzIHdpdGggYW4gdW50ZXJtaW5hdGVkIGZsb2F0aW5nIHBvaW50Ci0JbnVtYmVyIChubyBvcGVyYXRvciBmb2xsb3dpbmcpLiAgV2Ugbm93IGlnbm9yZSB0aGlzIGVycm9yIChhcwotCWFjcm9iYXQgZG9lcykuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlcl9ydW4pOiBEb24ndCBlbWl0IGEgc3ludGF4IGVycm9yIGZvcgotCXVudGVybWluYXRlZCBmbG9hdGluZyBwb2ludCBudW1iZXJzLgotCi0yMDA5LTEyLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZWFsbHkgZml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCVJlcG9ydGVkIGJ5IFNlYW4uCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKEdYX1BUX1BPSU5UU19BUkVfV09SRFMsCi0JR1hfUFRfUE9JTlRfUlVOX0NPVU5UX01BU0spOiBDb252ZXJ0IGVudW0gdmFsdWVzIHRvIG1hY3Jvcy4KLQotMjAwOS0xMi0xNiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUltcHJvdmUgY29uZmlndXJlLnJhdyB0byBjb3B5IHNvbWUgb3B0aW9ucyBmcm9tIENGTEFHUyB0byBMREZMQUdTLgotCVRoZSBsaW5rZXIgb2YgTWFjIE9TIFggMTAuNiBpcyBzZW5zaXRpdmUgdG8gdGhlIGFyY2hpdGVjdHVyZS4gIElmCi0JdGhlIGFyY2hpdGVjdHVyZXMgYXJlIHNwZWNpZmllZCBleHBsaWNpdGx5IGZvciB0aGUgQyBjb21waWxlciwgdGhlCi0JbGlua2VyIHJlcXVpcmVzIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbnMgdG9vLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBSZXBsYWNlIGAtaXN5c3Jvb3QnIG9wdGlvbiBwYXJzZXIgYnkKLQltb3JlIGdlbmVyaWMgYXJndW1lbnQgcGFyc2VyLgotCi0yMDA5LTEyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsZXIgd2FybmluZ3MuCi0JUmVwb3J0ZWQgYnkgU2Vhbi4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXMpOiBGaXggY291bnRlciBkYXRhCi0JdHlwZS4KLQotMjAwOS0xMi0xNCAgS2VuIFNoYXJwICA8a2VuLnNoYXJwQGFydGlmZXguY29tPgotCi0JSWdub3JlIGludmFsaWQgYHNldGN1cnJlbnRwb2ludCcgb3BlcmF0aW9ucyBpbiBUeXBlIDEgZm9udHMuCi0JVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzI4MjI2LgotCi0JQXQgbGVhc3QgdHdvIHdpbGQgUG9zdFNjcmlwdCBmaWxlcyBvZiB1bmtub3duIHByb3ZlbmFuY2UgY29udGFpbgotCVR5cGUgMSBmb250cywgYXBwYXJlbnRseSBjb252ZXJ0ZWQgZnJvbSBUcnVlVHlwZSBmb250cyBpbiBlYXJsaWVyCi0JUERGIHZlcnNpb25zIG9mIHRoZSBmaWxlcywgd2hpY2ggdXNlIHRoZSBgc2V0Y3VycmVudHBvaW50JyBvcGVyYXRvcgotCWluYXBwcm9wcmlhdGVseS4KLQotCUZyZWVUeXBlIGN1cnJlbnRseSB0aHJvd3MgYW4gZXJyb3IgaW4gdGhpcyBjYXNlLCBidXQgR2hvc3RzY3JpcHQgYW5kCi0JQWRvYmUgRGlzdGlsbGVyIGJvdGggYWNjZXB0IHRoZSBmb250cyBhbmQgaWdub3JlIHRoZSBwcm9ibGVtLiAgVGhpcwotCWNvbW1pdCAjaWZkZWZzIG91dCB0aGUgY2hlY2sgc28gUG9zdFNjcmlwdCBpbnRlcnByZXRlcnMgdXNpbmcKLQlGcmVlVHlwZSBjYW4gcmVuZGVyIHRoZXNlIGZpbGVzLgotCi0JVGhlIHNwZWNpZmljYXRpb24gc2F5cyBgc2V0Y3VycmVudHBvaW50JyBzaG91bGQgb25seSBiZSB1c2VkIHRvIHNldAotCXRoZSBwb2ludCBhZnRlciBhIGBTdWJyJyBjYWxsLCBidXQgdGhlc2UgZm9udHMgdXNlIGl0IHRvIHNldCB0aGUKLQlpbml0aWFsIHBvaW50IHRvICgwLDApLiAgVW5uZWNlc3NhcmlseSBzbywgYXMgdGhleSBjb3JyZWN0bHkgdXNlIGFuCi0JYGhzYncnIG9wZXJhdGlvbiB3aGljaCBpbXBsaWNpdGx5IHNldHMgdGhlIGluaXRpYWwgcG9pbnQuCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxvcF9zZXRjdXJyZW50cG9pbnQ+OiBDb21tZW50IG91dCBjb2RlLgotCi0yMDA5LTEyLTE0ICBCcmFtIFRhc3N5bnMgIDxicmFtdEBlbmZvY3VzLmJlPgotCi0JRml4IHBhcnNpbmcgb2YgL0NJREZvbnRWZXJzaW9uLgotCVRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMyODI4Ny4KLQotCSogc3JjL2NpZC9jaWR0b2tlbi5oOiBgY2lkX3ZlcnNpb24nIGluIENJRF9GYWNlSW5mb1JlYyAoaW4KLQl0MXRhYmxlcy5oKSBpcyBvZiB0eXBlIEZUX0ZpeGVkLgotCi0yMDA5LTEyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlUcmFjZSBnbHlwaCBpbmRleCBpbiBDSUQgbW9kdWxlLgotCVN1Z2dlc3RlZCBpbiBTYXZhbm5haCBwYXRjaCAjNzAyMy4KLQotCSogc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfbG9hZF9nbHlwaCk6IEFkZCB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMDktMTItMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfZ2V0X21ldHJpY3MpOiBQdXQgYEV4aXQnIGxhYmVsIGludG8gdGhlCi0JcHJvcGVyIHByZXByb2Nlc3NvciBjb25kaXRpb25hbC4KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfc2xvdF9sb2FkKTogUGFjaWZ5IGdjYy4KLQotMjAwOS0xMS0yNSAgSm9obiBUeXRnYXQgIDxKb2huLlR5dGdhdEBlc2tvLmNvbT4KLQotCUJldHRlciBoYW5kbGluZyBvZiBzdGFydCBvZiBgZWV4ZWMnIHNlY3Rpb24uCi0JVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzI4MDkwLgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChUMV9HZXRfUHJpdmF0ZV9EaWN0KTogU2tpcCBhbGwgd2hpdGVzcGFjZQotCWNoYXJhY3RlcnMgYmVmb3JlIHN0YXJ0IG9mIGBlZXhlYycgc2VjdGlvbi4KLQotMjAwOS0xMS0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMjc3NDIuCi0KLQkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKGZ0X3N0cm9rZXJfb3V0c2lkZSk6IEF2b2lkIHNpbGVudCBkaXZpc2lvbiBieQotCXplcm8sIHVzaW5nIGEgdGhyZXNob2xkIGZvciBgdGhldGEnLgotCi0yMDA5LTExLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyODAzNi4KLQotCSogc3JjL3R5cGUxL3QxYWZtLmMgKHQxX2dldF9pbmRleCk6IEZpeCBjb21wYXJpc29uLgotCi0yMDA5LTExLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsZXIgd2FybmluZ3MuCi0JUmVwb3J0ZWQgYnkgS2V2aW4gQmxlbmtpbnNvcHAgPGFycW9uQHByb21vZGUub3JnPi4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKGNoZWNrX3RhYmxlX2Rpcik6IFVzZSBwcm9wZXIgZGF0YSB0eXBlLgotCi0yMDA5LTExLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZWFsbHkgZml4IEZyZWVEZXNrdG9wIGJ1ZyAjMjExOTcuCi0JVGhpcyBhbHNvIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMjgwMjEuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19jaGVja19kaWdpdHMpLAotCXNyYy9hdXRvZml0L2FmbGF0aW4yLmMgKGFmX2xhdGluMl9tZXRyaWNzX2NoZWNrX2RpZ2l0cyk6IEZpeCBsb29wLgotCi0yMDA5LTExLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgdHJhY2luZyBtZXNzYWdlcyBmb3IgYWR2YW5jZSB2YWx1ZXMuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKSwgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYwotCShUVF9HZXRfSE1ldHJpY3MsIFRUX0dldF9WTWV0cmljcyk6IERvIGl0LgotCi0yMDA5LTExLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsZXIgd2FybmluZy4KLQlSZXBvcnRlZCBieSBKZXJlbXkgTWFuc29uIDxqZXJlbXkubWFuc29uQGdtYWlsLmNvbT4uCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBJbml0aWFsaXplIGBlcnJvcicuCi0KLTIwMDktMTEtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJlbW92ZSBjb21waWxlciB3YXJuaW5nLgotCVJlcG9ydGVkIGJ5IFNlYW4gTWNCcmlkZSA8c2VhbkByb2d1ZS1yZXNlYXJjaC5jb20+LgotCi0JKiBzcmMvdG9vbHMvYXBpbmFtZXMuYyAocmVhZF9oZWFkZXJfZmlsZSk8U1RBVEVfVFlQRT46IFVzZSBhIGNhc3QgdG8KLQlgaW50JywgYXMgc3BlY2lmaWVkIGluIHRoZSBwcmludGYoMykgbWFuIHBhZ2UuCi0KLTIwMDktMTEtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI3OTIxLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCksIHNyYy9jaWQvY2lkb2Jqcy5jCi0JKGNpZF9mYWNlX2luaXQpLCBzcmMvdHlwZTEvdDFhZm0uYyAoVDFfUmVhZF9NZXRyaWNzKSwKLQlzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX0ZhY2VfSW5pdCk6IERvbid0IHVzZSB1bnNpZ25lZCBjb25zdGFudAotCXZhbHVlcyBmb3Igcm91bmRpbmcgaWYgdGhlIGFyZ3VtZW50IGNhbiBiZSBuZWdhdGl2ZS4KLQotMjAwOS0xMS0wMyAgQnJhbSBUYXNzeW5zICA8YnJhbXRAZW5mb2N1cy5iZT4KLQotCUFkZCBiYXNpYyBzdXBwb3J0IGZvciBUeXBlMSBjaGFyc3RyaW5ncyBpbiBDRkYuCi0JVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzI3OTIyLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKENGRl9PcGVyYXRvciwgY2ZmX2FyZ3VtZW50X2NvdW50cyk6IEhhbmRsZQotCWBzZWFjJywgYHNidycsIGFuZCBgc2V0Y3VycmVudHBvaW50JyBvcGNvZGVzLgotCShjZmZfY29tcHV0ZV9iaWFzKTogQWRkIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB0aGUgY2hhcnN0cmluZyB0eXBlLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoY2ZmX29wZXJhdG9yX3NlYWMpOiBBZGQgcGFyYW1ldGVyIGZvciBzaWRlIGJlYXJpbmcuCi0JKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogVXBkYXRlZCBmb3IgbW9yZSBUeXBlMSBzdXBwb3J0LgotCi0yMDA5LTExLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZXR1cm4gY29ycmVjdCBgbGluZWFySG9yaUFkdmFuY2UnIHZhbHVlIGZvciBlbWJlZGRlZCBUVCBiaXRtYXBzIHRvby4KLQlSZXBvcnRlZCBieSBKZXJlbXkgTWFuc29uIDxqZXJlbXkubWFuc29uQGdtYWlsLmNvbT4uCi0KLQlzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogQWRkIHBhcmFtZXRlciB0bwotCXF1aWNrbHkgbG9hZCB0aGUgZ2x5cGggaGVhZGVyIG9ubHkuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCSh0dF9sb2FkZXJfaW5pdCk6IEFkZCBwYXJhbWV0ZXIgdG8gcXVpY2tseSBsb2FkIHRoZSBgZ2x5ZicgdGFibGUKLQlvbmx5LgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoVFRfTG9hZF9HbHlwaCk6IENvbXB1dGUgbGluZWFyIGFkdmFuY2UgdmFsdWVzIGZvciBlbWJlZGRlZCBiaXRtYXAKLQlnbHlwaHMgdG9vLgotCi0yMDA5LTExLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlJbXByb3ZlIGNvZGUgcmVhZGFiaWxpdHkuCi0KLQkqIHNyYy90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBNb3ZlIG1ldHJpY3MgY2FsY3VsYXRpb24KLQl0by4uLgotCSh0dF9nZXRfbWV0cmljcyk6IFRoaXMgbmV3IGZ1bmN0aW9uLgotCi0yMDA5LTEwLTI2ICBCcmFtIFRhc3N5bnMgIDxicmFtdEBlbmZvY3VzLmJlPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMjc4MTEuCi0KLQkqIHNyYy90cnVldHlwZS90dHhndmFyLmMgKGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzKTogRml4Ci0Jc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoLgotCi0yMDA5LTEwLTE5ICBOaW5nIERvbmcgIDxmbGludG5pbmdAMTYzLmNvbT4KLQotCUZpeCBoYW5kbGluZyBvZiBgZ2V0JyBhbmQgYHB1dCcgQ0ZGIGluc3RydWN0aW9ucy4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykgPGNmZl9vcF9nZXQsCi0JY2ZmX29wX3B1dD46IEFwcGVuZGl4IEIgb2YgQWRvYmUgVGVjaG5vdGUgIzUxNzcgbGltaXRzIHRoZSBudW1iZXIgb2YKLQllbGVtZW50cyBmb3IgdGhlIGBnZXQnIGFuZCBgcHV0JyBvcGVyYXRvcnMgdG8gMzIuCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmggKENGRl9NQVhfVFJBTlNfRUxFTUVOVFMpOiBEZWZpbmUuCi0JKENGRl9EZWNvZGVyKTogVXNlIGl0IGZvciBgYnVpbGRjaGFyJyBhbmQgcmVtb3ZlIGBsZW5fYnVpbGRjaGFyJy4KLQotMjAwOS0xMC0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGhhbmRsaW5nIG9mIGBkdXAnIENGRiBpbnN0cnVjdGlvbi4KLQlQcm9ibGVtIGFuZCBzb2x1dGlvbiByZXBvcnRlZCBieSBOaW5nIERvbmcgPGZsaW50bmluZ0AxNjMuY29tPi4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykgPGNmZl9vcF9kdXA+OgotCUluY3JlYXNlIGBhcmdzJyBieSAyLCBub3QgMS4KLQotMjAwOS0xMC0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuMy4xMSByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi0zLTExJy4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjMuMTEuCi0KLQkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwgYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvajogcy8yLjMuMTAvMi4zLjExLywgcy8yMzEwLzIzMTEvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDExLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gOToyMjozLgotCi0yMDA5LTEwLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9yZWxlYXNlOiBVcGRhdGVkLgotCi0yMDA5LTEwLTEwICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9wcm9wZXJ0aWVzKTogRml4IGEgYnVnIGluIHRoZSBucHJvcHMKLQl0cnVuY2F0aW9uLiAgUmVwb3J0ZWQgYnkgTWFydGluIHZvbiBHYWdlcm4gYW5kIFBldGVyIFZvbGtvdi4KLQlodHRwczovL2J1Z3MuZ2VudG9vLm9yZy8yODgzNTcgYW5kIGh0dHBzOi8vYnVncy5nZW50b28ub3JnLzI4ODI1NgotCi0yMDA5LTEwLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi4zLjEwIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTMtMTAnLgotCi0JKiBidWlsZHMvdG9wbGV2ZWwubWsgKG1ham9yLCBtaW5vciwgcGF0Y2gpOiBGaXggcmVnZXhwIHRvIGFsbG93IG1vcmUKLQl0aGFuIGEgc2luZ2xlIGRpZ2l0LgotCShkaXN0KTogV2Ugbm93IHVzZSBnaXQuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi4zLjEwLgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIGJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2o6IHMvMi4zLjkvMi4zLjEwLywgcy8yMzkvMjMxMC8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gMTAuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byA5OjIxOjMuCi0KLTIwMDktMTAtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBgbWFrZSBtdWx0aScuCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jLCBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoRlRfQ09NUE9ORU5UKTogRGVmaW5lLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0guCi0KLTIwMDktMDktMjcgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbY2FjaGVdIEZpeCBTYXZhbm5haCBidWcgIzI3NDQxLCBjbGVhbiB1cCBSZWRoYXQgYnVnemlsbGEgIzUxMzU4Mi4KLQlUcmlja3kgY2FzdHMgaW4gRlRDX3tDQUNIRSxHQ0FDSEUsTVJVTElTVH1fTE9PS1VQX0NNUCgpIGFyZSByZW1vdmVkLgotCU5vdyB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIEZUQ19Ob2RlIG9yIEZUQ19NcnVOb2RlCi0JdmFyaWFibGUsIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBjYXN0IHRoZW0gdG8gYXBwcm9wcmlhdGUgcG9pbnRlcnMgdG8KLQljb25jcmV0ZSBkYXRhLiAgVGhlc2UgdHJpY2t5IGNhc3RzIGNhbiBHQ0MtNC40IG9wdGltaXplciAoLU8yKQotCWNvbmZ1c2VkIGFuZCB0aGUgY3Jhc2hpbmcgYmluYXJpZXMgYXJlIGdlbmVyYXRlZC4KLQotCSogc3JjL2NhY2hlL2Z0Y21ydS5oIChGVENfTVJVTElTVF9MT09LVVBfQ01QKTogRHJvcCB0cmlja3kgY2FzdC4KLQlOb3cgdGhlIDR0aCBhcmd1bWVudCBgbm9kZScgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdHlwZWQgYXMKLQlGVENfTXJ1Tm9kZS4KLQotCSogc3JjL2NhY2hlL2Z0Y2dseXBoLmggKEZUQ19HQ0FDSEVfTE9PS1VQX0NNUCk6IEZvciBpbmxpbmUKLQlpbXBsZW1lbnRhdGlvbiwgbmV3IHRlbXBvcmFsIHZhcmlhYmxlIEZUQ19NcnVOb2RlIGBfbXJ1bm9kZScgdG8gdGFrZQotCXRoZSBwb2ludGVyIGZyb20gRlRDX01SVUxJU1RfTE9PS1VQX0NNUCgpLiAgRm9yIG5vbi1pbmxpbmUKLQlpbXBsZW1lbnRhdGlvbiwgdHJpY2t5IGNhc3QgaXMgZHJvcHBlZC4KLQotCSogc3JjL2NhY2hlL2Z0Y21hbmFnLmMgKEZUQ19TSVpFX05PREUpOiBOZXcgbWFjcm8gY2FzdGluZwotCXRvIEZUQ19TaXplTm9kZS4KLQkoRlRDX01hbmFnZXJfTG9va3VwU2l6ZSk6IFJlcGxhY2UgRlRDX1NpemVOb2RlIGBub2RlJyBieSBGVENfTXJ1Tm9kZQotCWBtcnVub2RlJywgYW5kIEZUQ19TSVpFX05PREUoKSBpcyBpbnNlcnRlZC4KLQkoRlRDX0ZBQ0VfTk9ERSk6IE5ldyBtYWNybyBjYXN0aW5nIHRvIEZUQ19GYWNlTm9kZS4KLQkoRlRDX01hbmFnZXJfTG9va3VwRmFjZSkgUmVwbGFjZSBGVENfRmFjZU5vZGUgYG5vZGUnIGJ5IEZUQ19NcnVOb2RlCi0JYG1ydW5vZGUnLCBhbmQgRlRDX0ZBQ0VfTk9ERSgpIGlzIGluc2VydGVkLgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYyAoRlRDX0ltYWdlQ2FjaGVfTG9va3VwKTogQ2hhbmdlIHRoZSB0eXBlIG9mCi0JYG5vZGUnIGZyb20gRlRDX0lOb2RlIHRvIEZUQ19Ob2RlLiAgRXh0cmEgY2FzdGluZyBtYWNybyBGVENfTk9ERSgpCi0JaXMgZHJvcHBlZC4KLQkoRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyKTogRGl0dG8uCi0JKEZUQ19TQml0Q2FjaGVfTG9va3VwKTogQ2hhbmdlIHRoZSB0eXBlIG9mIGBub2RlJyBmcm9tIEZUQ19TTm9kZSB0bwotCUZUQ19Ob2RlLiAgRXh0cmEgY2FzdGluZyBtYWNybyBGVENfTk9ERSgpIGlzIGRyb3BwZWQuICBGVENfU05PREUoKQotCWlzIGluc2VydGVkLgotCShGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlcik6IERpdHRvLgotCi0JKiBzcmMvY2FjaGUvZnRjY21hcC5jIChGVENfQ01hcENhY2hlX0xvb2t1cCk6IENoYW5nZSB0aGUgdHlwZSBvZgotCWBub2RlJyBmcm9tIEZUQ19DTWFwTm9kZSB0byBGVENfTm9kZS4gIEV4dHJhIGNhc3RpbmcgbWFjcm8KLQlGVENfTk9ERSgpIGlzIGRyb3BwZWQsIEZUQ19DTUFQX05PREUoKSBpcyBpbnNlcnRlZC4KLQotMjAwOS0wOS0yNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtjYWNoZSwgcHNhdXgsIHR5cGUxXSBGaXggZm9yIG11bHRpIGJ1aWxkLgotCUluIG11bHRpIGJ1aWxkLCBzb21lIGNwcCBmdW5jdGlvbnMgYXJlIGxlZnQgYXMgdW5yZXNvbHZlZCBzeW1ib2xzLgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19IIGZvciBGVF9UUkFDRTEoKS4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19IIGZvcgotCUZJWEVEX1RPX0lOVCgpLgotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYzogRGl0dG8uCi0JKiBzcmMvdHlwZTEvdDFvYmpzLmM6IERpdHRvLgotCi0yMDA5LTA5LTI1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2F1dG9maXRdIEZpeCBmb3IgbXVsdGkgYnVpbGQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmg6IEluY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19IIHRvIHVzZQotCUZUX0RFQ0xBUkVfTU9EVUxFKCkgbWFjcm8gaW4gbXVsdGkgYnVpbGQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYzogSW5jbHVkZSA8ZnQyYnVpbGQuaD4gdG8gaGFuZGxlCi0JRlRfQURWQU5DRVNfSCBjb3JyZWN0bHkgaW4gbXVsdGkgYnVpbGQuCi0KLTIwMDktMDktMjQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbY2FjaGVdIENoZWNrIHRoZSBmYWNlIGZpbGxlZCBieSBGVENfTWFuYWdlcl9Mb29rdXBGYWNlKCkuCi0KLQkqIHNyYy9jYWNoZS9mdGNiYXNpYy5jIChmdGNfYmFzaWNfZmFtaWx5X2dldF9jb3VudCk6IFJldHVybgotCWltbWVkaWF0ZWx5IGlmIEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UoKSBmaWxscyBmYWNlIGJ5IE5VTEwuICBTdWNoCi0JY2FzZSBjYW4gb2NjdXIgd2hlbiB0aGUgY29kZSBpcyBvcHRpbWl6ZWQgYnkgR0NDLTQuMi54LgotCi0yMDA5LTA5LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwOS0wOS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Jhc3Rlcl0gRml4IDUtbGV2ZWxzIGdyYXlzY2FsZSBvdXRwdXQuCi0JVGhpcyB3YXMgYnJva2VuIHNpbmNlIHZlcnNpb24gMi4zLjAuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoY291bnRfdGFibGUpOiBVc2UgcHJlLTIuMy4wIHZhbHVlcyAod2hpY2gKLQl3ZXJlIHRoZW4gY29tcHV0ZWQgZHluYW1pY2FsbHkpLgotCShWZXJ0aWNhbF9HcmF5X1N3ZWVwX1N0ZXApOiBVcGRhdGVkLgotCi0JKGZ0X2JsYWNrX3JlbmRlcik6IEluaXRpYWxpemUgYHdvcmtlci0+Z3JheV9saW5lcycgKHByb2JsZW0gZm91bmQgYnkKLQl2YWxncmluZCkuCi0KLQkoRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HLCBERUJVR19SQVNURVIpOiBEb24ndCAjdW5kZWYsIGp1c3QKLQljb21tZW50IG91dC4KLQotMjAwOS0wOS0xMiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUltcHJvdmUgY29uZmlndXJlLnJhdyBmb3IgY3Jvc3MgYnVpbGQuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IFJlbW92ZSB0ZW1wb3JhbCBmaWxlcyBjcmVhdGVkIGJ5IHRoZQotCXN1ZmZpeCBjaGVja2luZyBmb3IgQ0NfQlVJTEQuICBTZXQgWFhfQU5TSUZMQUdTIGFuZCBYWF9DRkxBR1Mgd2hlbgotCWNyb3NzIGNvbXBpbGVyIGlzIEdDQy4gIEFDX1BST0dfQ0MgY2hlY2tzIHdoZXRoZXIgdGhlIGNyb3NzIGNvbXBpbGVyCi0JaXMgR0NDLCBpdHMgcmVzdWx0IGlzIHN0b3JlZCBpbiBHQ0MuCi0KLTIwMDktMDktMTIgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbQkRGXSBNb2RpZnkgaGFzaCBBUEkgdG8gdGFrZSBzaXplX3QgdmFsdWUgaW5zdGVhZCBvZiB2b2lkICouCi0KLQlUaGUgaGFzaCBBUEkgaW4gQkRGIGRyaXZlciBpcyBkZXNpZ25lZCB0byBiZSBnZW5lcmljLCBpdCB0YWtlcwotCXZvaWQgKiB0eXBlZCBkYXRhLiAgQnV0IEJERiBkcml2ZXIgYWx3YXlzIGdpdmVzIGFuIHVuc2lnbmVkIGxvbmcKLQlpbnRlZ2VyICh0aGUgaW5kZXggdG8gYSBwcm9wZXJ0eSkuICBUbyByZWR1Y2Ugbm9uLWVzc2VudGlhbAotCWNhc3RzIGZyb20gdW5zaWduZWQgbG9uZyB0byB2b2lkKiBhbmQgZnJvbSB2b2lkKiB0byB1bnNpZ25lZAotCWxvbmcsIHRoZSBoYXNoIEFQSSBpcyBjaGFuZ2VkIHRvIHRha2Ugc2l6ZV90IGludGVnZXIuCi0JVGhlIGlzc3VlIG9mIGluY29tcGF0aWJsZSBjYXN0IGJldHdlZW4gdW5zaWduZWQgbG9uZyBhbmQgdm9pZCoKLQlvbiBMTFA2NCBwbGF0Zm9ybSBpcyByZXBvcnRlZCBieSBOaWdodFN0cmlrZSBmcm9tIE1pbkdXLVdpbjY0Ci0JcHJvamVjdC4gIFNlZQotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS8yMDA5LTA5L21zZzAwMDAwLmh0bWwKLQotCSogc3JjL2JkZi9iZGYuaDogVGhlIHR5cGUgb2YgaGFzaG5vZGUtPmRhdGEgaXMgY2hhbmdlZCBmcm9tCi0Jdm9pZCogdG8gc2l6ZV90LgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChoYXNoX2luc2VydCk6IEdldCBzaXplX3QgZGF0YSwgaW5zdGVhZCBvZgotCXZvaWQqIGRhdGEuCi0JKGJkZl9jcmVhdGVfcHJvcGVydHkpOiBHZXQgdGhlIG5hbWUgbGVuZ3RoIG9mIG5ldyBwcm9wZXJ0eSBieQotCXNpemVfdCB2YXJpYWJsZSwgd2l0aCBhIGN1dC1vZmYgYXQgRlRfVUxPTkdfTUFYLgotCShfYmRmX3NldF9kZWZhdWx0X3NwYWNpbmcpOiBHZXQgdGhlIG5hbWUgbGVuZ3RoIG9mIHRoZSBmYWNlIGJ5Ci0Jc2l6ZV90IHZhcmlhYmxlLCB3aXRoIGEgY3V0LW9mZiBhdCAyNTYuCi0JKGJkZl9nZXRfcHJvcGVydHkpOiBHZXQgdGhlIHByb3BlcnR5IGlkIGJ5IHNpemVfdCB2YXJpYWJsZSB0bwotCXJlZHVjZSB0aGUgY2FzdHMgYmV0d2VlbiAzMi1iaXQgcHJvcCBJRCAmIGhhc2hub2RlLT5kYXRhIGR1cmluZwotCXNpbXBsZSBjb3B5aW5nLgotCShfYmRmX2FkZF9wcm9wZXJ0eSk6IERpdHRvLgotCShfYmRmX3BhcnNlX3N0YXJ0KTogQ2FsY3VsYXRlIHRoZSBpbmRleCB0byB0aGUgcHJvcGVydHkgYXJyYXkKLQlieSBzaXplX3QgdmFyaWFibGUuCi0JKGJkZl9nZXRfZm9udF9wcm9wZXJ0eSk6IERyb3AgYSBjYXN0IHRvIHVuc2lnbmVkIGxvbmcuCi0KLTIwMDktMDktMTAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbV2luNjRdIEltcHJvdmUgdGhlIGNvbXB1dGF0aW9uIG9mIHJhbmRvbSBzZWVkIGZyb20gc3RhY2sgYWRkcmVzcy4KLQotCU9uIExMUDY0IHBsYXRmb3JtLCB0aGUgY29udmVyc2lvbiBmcm9tIHBvaW50ZXIgdG8gRlRfRml4ZWQgbmVlZAotCXRvIGRyb3AgaGlnaGVyIDMyLWJpdC4gIEV4cGxpY2l0IGNhc3RzIGFyZSByZXF1aXJlZC4gUmVwb3J0ZWQgYnkKLQlOaWdodFN0cmlrZSBmcm9tIE1pbkdXLXc2NCBwcm9qZWN0LiAgU2VlCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLzIwMDktMDkvbXNnMDAwMDAuaHRtbAotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmM6IENvbnZlcnQgdGhlIHBvaW50ZXJzIHRvIEZUX0ZpeGVkIGV4cGxpY2l0bHkuCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jOiBEaXR0by4KLQotCi0yMDA5LTA5LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcmFzdGVyXSBJbXByb3ZlbWVudHMgZm9yIHN0YW5kLWFsb25lIG1vZGUuCi0KLQkqIHNyYy9yYXN0ZXIvcnVsZXMubWs6IERvbid0IGhhbmRsZSBmdG1pc2MuaC4gIEl0IGlzIG5lZWRlZCBmb3IKLQlzdGFuZC1hbG9uZSBtb2RlIG9ubHkuCi0KLQkqIHNyYy9yYXN0ZXIvZnRtaXNjLmggKEZUX01lbW9yeVJlYywgRlRfQWxsb2NfRnVuYywgRlRfRnJlZV9GdW5jLAotCUZUX1JlYWxsb2NfRnVuYyk6IENvcHkgZGVjbGFyYXRpb25zIGZyb20gZnRzeXN0ZW0uaC4KLQotMjAwOS0wOS0wMiAgQnJhbSBUYXNzeW5zICA8YnJhbXRAZW5mb2N1cy5iZT4KLQotCUltcHJvdmUgdmVydGljYWwgbWV0cmljcyBjYWxjdWxhdGlvbiAoU2F2YW5uYWggYnVnICMyNzM2NCkuCi0KLQlUaGUgY2FsY3VsYXRpb24gb2YgYHZlcnRCZWFyaW5nWCcgaXMgbm90IGRlZmluZWQgaW4gdGhlIE9URiBmb250Ci0Jc3BlYyBzbyBGcmVlVHlwZSBkb2VzIGEgYGJlc3QgZWZmb3J0JyBhdHRlbXB0LiAgSG93ZXZlciwgdGhpcyB2YWx1ZQotCWlzIGRlZmluZWQgaW4gdGhlIFBERiBhbmQgUG9zdFNjcmlwdCBzcGVjcywgYW5kIHRoYXQgYWxnb3JpdGhtIGlzCi0JYmV0dGVyIHRoYW4gdGhlIG9uZSBGcmVlVHlwZSBjdXJyZW50bHkgdXNlczoKLQotCSAgRnJlZVR5cGU6IFVzZSB0aGUgbWlkZGxlIG9mIHRoZSBib3VuZGluZyBib3ggYXMgdGhlIFggY29vcmRpbmF0ZQotCSAgICAgICAgICAgIG9mIHRoZSB2ZXJ0aWNhbCBvcmlnaW4uCi0KLQkgIEFkb2JlIFBERiBzcGVjOiBVc2UgdGhlIG1pZGRsZSBvZiB0aGUgaG9yaXpvbnRhbCBhZHZhbmNlIHZlY3RvciBhcwotCSAgICAgICAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHZlcnRpY2FsIG9yaWdpbi4KLQotCUZyZWVUeXBlJ3MgYWxnb3JpdGhtIGdvZXMgd3JvbmcgaWYgeW91IGhhdmUgYSByZWFsbHkgc21hbGwgZ2x5cGgKLQkobGlrZSB0aGUgZnVsbC13aWR0aCwgY2lyY2xlLWxpa2UgZG90IGF0IHRoZSBlbmQgb2YgdGhlIHNlbnRlbmNlLCBhcwotCXVzZWQgaW4gQ0pLIHNjcmlwdHMpIHdpdGggbGFyZ2UgYmVhcmluZ3MuICBXaXRoIHRoZSBGcmVlVHlwZQotCWFsZ29yaXRobSB0aGlzIGRvdCBnZXRzIGNlbnRlcmVkIG9uIHRoZSBiYXNlbGluZTsgd2l0aCB0aGUgUERGCi0JYWxnb3JpdGhtIGl0IGdldHMgdGhlIGNvcnJlY3QgbG9jYXRpb24gKGluIHRoZSB0b3AgcmlnaHQpLiAgTm90ZQotCXRoYXQgdGhpcyBpcyBhIHNlcmlvdXMgaXNzdWUsIGl0J3MgbGlrZSBwcmludGluZyB0aGUgZG90IGF0IHRoZSBlbmQKLQlvZiBhIFJvbWFuIHNlbnRlbmNlIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHRleHRsaW5lIGluc3RlYWQgb2Ygb24gdGhlCi0JYmFzZWxpbmUgbGlrZSBpdCBzaG91bGQuIFNvIGkgYmVsaWV2ZSB0aGUgUERGIHNwZWMncyBhbGdvcml0aG0KLQlzaG91bGQgYmUgdXNlZCBpbiBGcmVlVHlwZSBhcyB3ZWxsLgotCi0JVGhlIGB2ZXJ0QmVhcmluZ1knIHZhbHVlIGZvciBzdWNoIHNtYWxsIGdseXBocyBpcyBhbHNvIHZlcnkgc3RyYW5nZQotCWlmIG5vIGB2bXR4JyBpbmZvcm1hdGlvbiBpcyBwcmVzZW50LCBzaW5jZSB0aGUgaGVpZ2h0IG9mIHRoZSBiYm94IGlzCi0Jbm90IHJlcHJlc2VudGFibGUgZm9yIHRoZSBoZWlnaHQgb2YgdGhlIGdseXBoIHZpc3VhbGx5ICh0aGUKLQl3aGl0ZXNwYWNlIHVwIHRvIHRoZSBiYXNlbGluZSBpcyBwYXJ0IG9mIHRoZSBnbHlwaCkuICBUaGUgZml4IGFsc28KLQlpbmNsdWRlcyBzb21lIGNvZGUgZm9yIGEgYmV0dGVyIGVzdGltYXRlIG9mIGB2ZXJ0QmVhcmluZ1knLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfc3ludGhlc2l6ZV92ZXJ0aWNhbF9tZXRyaWNzKTogYHZlcnRCZWFyaW5nWCcKLQlpcyBub3cgY2FsY3VsYXRlZCBhcyBkZXNjcmliZWQgYnkgdGhlIEFkb2JlIFBERiBTcGVjLiAgRXN0aW1hdGUgZm9yCi0JYHZlcnRCZWFyaW5nWScgbm93IHdvcmtzIGJldHRlciBmb3Igc21hbGwgZ2x5cGhzIGNvbXBsZXRlbHkgYWJvdmUgb3IKLQliZWxvdyB0aGUgYmFzZWxpbmUgaW50byBhY2NvdW50LgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBgdmVydEJlYXJpbmdYJyBpcyBub3cKLQljYWxjdWxhdGVkIGFzIGRlc2NyaWJlZCBieSB0aGUgQWRvYmUgUERGIFNwZWMuICBWZXJ0aWNhbCBtZXRyaWNzCi0JaW5mb3JtYXRpb24gd2FzIGFsd2F5cyBpZ25vcmVkIHdoZW4gRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0Jd2FzIG5vdCBkZWZpbmVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChjb21wdXRlX2dseXBoX21ldHJpY3MpOiBgdmVydEJlYXJpbmdYJyBpcwotCW5vdyBjYWxjdWxhdGVkIGFzIGRlc2NyaWJlZCBieSB0aGUgQWRvYmUgUERGIFNwZWMuCi0KLTIwMDktMDktMDEgIEpvaG4gVHl0Z2F0ICA8Sm9obi5UeXRnYXRAZXNrby5jb20+Ci0KLQlGaXggY3VzdG9tIGNtYXAgZm9yIGVtcHR5IFR5cGUgMSBmb250IChTYXZhbm5haCBidWcgIzI3Mjk0KS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggKFQxX0VuY29kaW5nUmVjUmVjXyk6IFVwZGF0ZQotCWNvbW1lbnQgdG8gcmVmbGVjdCByZXZpc2VkIGNvZGVfbGFzdCBtZWFuaW5nLgotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9PcGVuX0ZhY2UpLCBzcmMvdHlwZTQyL3Q0Mm9ianMuYwotCShUNDJfT3Blbl9GYWNlKTogQXNzaWduIG1heF9jaGFyIGFzIGhpZ2hlc3QgY2hhcmFjdGVyIGNvZGUgKyAxIGFuZAotCXVzZSB0aGlzIGZvciBUMV9FbmNvZGluZ1JlY1JlY186OmNvZGVfbGFzdC4KLQkqIHNyYy9wc2F1eC90MWNtYXAuYyAodDFfY21hcF9jdXN0b21faW5pdCk6IEZvbGxvdyByZXZpc2VkCi0JVDFfRW5jb2RpbmdSZWNSZWNfOjpjb2RlX2xhc3QgbWVhbmluZy4KLQotMjAwOS0wOC0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IHJlbmRlcmluZyBvZiBob3Jpem9udGFsbHkgY29tcHJlc3NlZCBDRkZzLgotCUJ1ZyByZXBvcnRlZCBieSBJdmFuIE5pbmNpYyA8aW5pbmNpY0BwZGZ0cm9uLmNvbT4uCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCk6IFRoaW5rbzogQ2hlY2sgYHh4JyBlbGVtZW50IG9mCi0JYGZvbnRfbWF0cml4JyBhbHNvLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDktMDgtMDMgIHN1eXUwOTI1QGdtYWlsLmNvbQotCi0JRG9uJ3QgY2FsbCBgZnRfZnNlZWsnIGV2ZXJ5IHRpbWUgd2hlbiBleGVjdXRpbmcgYGZ0X2ZyZWFkJy4KLQotCSogc3JjL2Jhc2UvZnRzdHJlYW0uYyAoRlRfU3RyZWFtX1NlZWspLCBzcmMvYmFzZS9mdHN5c3RlbS5jCi0JKGZ0X2Fuc2lfc3RyZWFtX2lvKTogSW1wbGVtZW50IGl0LgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jc2ZudDogQ2FzdCBhIGNoYXJjb2RlIHRvIDMyLWJpdCBpbiBjbWFwIGZvcm1hdCAxNCBwYXJzZXIuCi0JCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDE0X2NoYXJfdmFyX2luZGV4LAotCXR0X2NtYXAxNF9jaGFyX3Zhcl9pc2RlZmF1bHQsIHR0X2NtYXAxNF9jaGFyX3ZhcmlhbnRzLAotCXR0X2NtYXAxNF92YXJpYW50X2NoYXJzKTogQ29ycmVjdCBtaXNtYXRjaGVzIGZyb20KLQlGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMgcHJvdG90eXBlLCBGVF9VTG9uZyBhcmd1bWVudHMKLQlhcmUgcmVwbGFjZWQgYnkgRlRfVUludDMyIGFyZ3VtZW50cy4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXNmbnQ6IENhc3QgYSBjaGFyY29kZSB0byAzMi1iaXQgaW4gY21hcCBmb3JtYXQgMTIgcGFyc2VyLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDEyX2NoYXJfbmV4dCk6Ci0JSW5zZXJ0IGV4cGxpY2l0IGNhc3QgZnJvbSBGVF9VRmFzdCB0byBGVF9VSW50MzIKLQlmb3IgcmV0dXJuIHZhbHVlLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JcHNhdXg6IEZpeCBhIGZldyBjYXN0cyB0byBGVF9JbnQzMiB2YWx1ZS4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOgotCUZpeCBhIGZldyBjYXN0cyBzZXR0aW5nIGB2YWx1ZScgZnJvbSBGVF9Mb25nIHRvIEZUX0ludDMyLAotCWJlY2F1c2UgYHZhbHVlJyBpcyB0eXBlZCBhcyBGVF9JbnQzMiBzaW5jZSAyMDA5LTA2LTIyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jc2ZudDogRml4IGEgZGF0YSB0eXBlIG1pc21hdGNoaW5nIHdpdGggaXRzIHNvdXJjZS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAxM19jaGFyX25leHQpOiBGaXggdGhlCi0JdHlwZSBvZiBgZ2luZGV4JyBmcm9tIEZUX1VMb25nIHRvIEZUX1VJbnQgYmVjYXVzZQotCWl0IGlzIHNldCBieSBGVF9VSW50IHR0X2NtYXAxM19jaGFyX21hcF9iaW5hcnkoKSBvcgotCVRUX0NNYXAxMy0+Y3VyX2dpbmRleC4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXNmbnQ6IEV4dGVuZCBhIGZldyBsb2NhbCB2YXJpYWJsZXMgdG8gbG9hZCAzMi1iaXQgdmFsdWVzLgotCi0JKiBzcmMvc2ZudC90dGtlcm4uYyAodHRfZmFjZV9sb2FkX2tlcm4pOiBFeHRlbmQgYGNvdW50JwotCWFuZCBga2VybicgdG8gbG9hZCAzMi1iaXQgdmFsdWVzLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JcGZyOiBFeHRlbmQgYG51bV9hdXgnIHRvIHRha2UgMzItYml0IHZhbHVlLgotCi0JKiBzcmMvcGZyL3BmcmxvYWQuYyAocGZyX3BoeV9mb250X2xvYWQpOiBFeHRlbmQKLQlgbnVtX2F1eCcgdG8gbG9hZCAzMi1iaXQgdmFsdWUuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlwY2Y6IFRydW5jYXRlIEZUX1VMb25nIGBucHJvcHMnIHRvIGZpdCB0byBpbnQgUENGX0ZhY2UtPm5wcm9wcy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfcHJvcGVydGllcyk6IExvYWQgYG5wcm9wcycKLQlhcyBGVF9VTG9uZyB2YWx1ZSBmcm9tIFBDRiBmaWxlLCBidXQgdHJ1bmNhdGUgaXQgYXMKLQlpbnQgdG8gZml0IFBDRl9GYWNlLT5ucHJvcHMuICBUaGUgbnVtYmVyIG9mIHRydW5jYXRlZAotCXByb3BlcnRpZXMgaXMgc2hvd24gaW4gdGhlIHRyYWNlIG1lc3NhZ2UuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlneHZhbGlkOiBFeHRlbmQgYSBmZXcgbG9jYWwgdmFyaWFibGVzIHRvIHJlZHVjZSB0aGUgY2FzdHMuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnguYyAoZ3h2X21vcnhfc3VidGFibGVzX3ZhbGlkYXRlKToKLQlFeHRlbmQgYHR5cGUnIGFuZCBgcmVzdCcgdG8gdGFrZSBGVF9VTG9uZyB2YWx1ZXMuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlneHZhbGlkOiBFeHRlbmQgYHNldHRpbmdUYWJsZScgdG8gdGFrZSAzMi1iaXQgb2Zmc2V0LgotCi0JKiBzcmMvZ3h2YWxpZC9neHZmZWF0LmMgKGd4dl9mZWF0X25hbWVfdmFsaWRhdGUpOgotCUV4dGVuZCBgc2V0dGluZ1RhYmxlJyB0byB0YWtlIDMyLWJpdCBvZmZzZXQuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlhdXRvZml0OiBDYXN0IEZUX0xvbmcgZ2x5cGhfY291bnQgdG8gY29tcGFyZSB3aXRoIEZUX1VJbnQgR0lELgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfaXNfZGlnaXQsCi0JYWZfZmFjZV9nbG9iYWxzX2NvbXB1dGVfc2NyaXB0X2NvdmVyYWdlKTogQ2FzdCBGVF9Mb25nCi0JZ2xvYmFscy0+Z2x5cGhfY291bnQgdG8gRlRfVUxvbmcsIHRvIGNvbXBhcmUgd2l0aCBGVF9VSW50Ci0JZ2luZGV4LgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jc21vb3RoOiBFeGNsdWRlIDE2LWJpdCBzeXN0ZW0gaW4gaW52YWxpZCBwaXRjaC9oZWlnaHQgY2hlY2suCi0KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKToKLQlwaXRjaCBhbmQgaGVpZ2h0IGFyZSB0eXBlZCBhcyBGVF9VSW50IGJ1dCBjaGVja2VkIHRvIGZpdAotCTE2LWJpdCByYW5nZSwgdG8gYXZvaWQgdGhlIG92ZXJmbG93cy4gIE9uIDE2LWJpdCBzeXN0ZW0sCi0JdGhpcyBjaGVja2luZyBpbnNlcnRzIGEgY29uZGl0aW9uYWwgdGhhdCBuZXZlciBvY2N1cnMuCi0KLTIwMDktMDctMDMgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQljZmY6IFR5cGUgbGFyZ2UgY29uc3RhbnRzID4gMHg3RkZGIGFzIGxvbmcgZm9yIDE2LWJpdCBzeXN0ZW1zLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2NoYXJzZXRfbG9hZCk6IFR5cGUgbGFyZ2UKLQljb25zdGFudHMgPiAweDdGRkYgYXMgbG9uZywgYmVjYXVzZSBub3JtYWwgY29uc3RhbnRzCi0JYXJlIHR5cGVkIHNpZ25lZCBpbnRlZ2VyIHRoYXQgaXMgbGVzcyB0aGFuIDB4ODAwMCBvbgotCTE2LWJpdCBzeXN0ZW1zLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JYmFzZTogUmVtb3ZlIGFuIHVudXNlZCB2YXJpYWJsZS4KLQotCSogc3JjL2Jhc2UvZnRnbHlwaC5jIChGVF9HbHlwaF9Ub19CaXRtYXApOiBSZW1vdmUgYW4KLQl1bnVzZWQgdmFyaWFibGUgYGxpYnJhcnknLiAgZ2x5cGgtPmxpYnJhcnkgaXMgdXNlZC4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWNhY2hlOiBDaGVjayBoaWdoZXIgYml0cyBpbiBmbGFncyBmb3Igbm9uIElMUDMyIHN5c3RlbXMuCi0KLQk0IHB1YmxpYyBmdW5jdGlvbnMgb3VnaHQgdG8gdGFrZSBGVF9VTG9uZyBmbGFncywgYnV0IHRha2UKLQlGVF9VSW50IGZsYWdzLiBUbyBrZWVwIGJpbmFyeSBjb21wYXRpYmlsaXR5LCB3ZSBkcm9wIGhpZ2hlcgotCWJpdHMgb24gbm9uIElMUDMyIHBsYXRmb3JtcywKLQkJSUxQNjQgc3lzdGVtczogTm8gZHJvcCBvY2N1cnMuCi0JCUxQNjQgc3lzdGVtczogSGlnaGVyIGJpdHMgYXJlIG5vdCB1c2VkLgotCQkxNi1iaXQgc3lzdGVtczogRHJvcCBjYW4gb2NjdXIuCi0JU2VlCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMDgtMTIvbXNnMDAwNjUuaHRtbAotCVRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIHJlZmluZWQgdG8gdGFrZSBGVF9VTG9uZyBmbGFncyBpbgotCW5leHQgYnVtcCB3aXRoIGluY29tcGF0aWJsZSBBUEkgY2hhbmdlLgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYyAoRlRDX0ltYWdlQ2FjaGVfTG9va3VwKToKLQlDaGVjayBgZmxhZ3MnIGluIGB0eXBlJywgdGhlIDJuZCBhcmd1bWVudC4KLQkoRlRDX1NCaXRDYWNoZV9Mb29rdXApOiBEaXR0by4KLQkoRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyKTogQ2hlY2sgYGxvYWRfZmxhZ3MnLAotCXRoZSAzcmQgYXJndW1lbnQuCi0JKEZUQ19TQml0Q2FjaGVfTG9va3VwU2NhbGVyKTogRGl0dG8uCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlzZm50OiBJZ25vcmUgaW52YWxpZCBHSURzIGluIGdseXBoIG5hbWUgbG9va3VwLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDoKLQlOZXcgdHJhY2UgbW9kdWxlIGZvciBzZmRyaXZlci5jIGlzIGFkZGVkLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2dldF9uYW1lX2luZGV4KToKLQlSZXN0cmljdCBnbHlwaCBuYW1lIGxvb2t1cCB0byBGVF9VSW50IEdJRC4KLQlHZW51aW5lIFRydWVUeXBlIGNhbiBob2xkIDE2LWJpdCBnbHlwaHMuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlwY2Y6IEZpeCBhIGNvbXBhcmlzb24gYmV0d2VlbiBGVF9Mb25nIGFuZCBGVF9VTG9uZy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfYml0bWFwcyk6IFJldHVybiBhbiBlcnJvcgotCWlmIFBDRl9GYWNlLT5ubWV0cmljcyBpcyBuZWdhdGl2ZS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWd4dmFsaWQ6IEd1YXJhbnRlZSBgbkZlYXR1cmVGbGFncycgc2l6ZSB1cCB0byAzMi1iaXQuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQuYyAoZ3h2X21vcnRfZmVhdHVyZWFycmF5X3ZhbGlkYXRlKToKLQlFeHRlbmQgdGhlIDNyZCBhcmd1bWVudCBgbkZlYXR1cmVGbGFncycgdG8gRlRfVUxvbmcuCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0Lmg6IERpdHRvLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jc2ZudDogSW5zZXJ0IGV4cGxpY2l0IGNhc3QgZm9yIExQNjQgc3lzdGVtLgotCi0JKiBzcmMvc2ZudC90dGtlcm4uYyAodHRfZmFjZV9sb2FkX2tlcm4pOiBJbnNlcnQKLQljYXN0IGZyb20gdW5zaWduZWQgbG9uZyB0byBGVF9VSW50MzIuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlneHZhbGlkOiBHdWFyYW50ZWUgYGp1c3QnIHRhYmxlIHNpemUgdXB0byAzMi1iaXQuCi0KLQkqIHNyYy9neHZhbGlkL2d4dmp1c3QuYyAoZ3h2X2p1c3RfdmFsaWRhdGUpOgotCVRoZSB0eXBlIG9mIGBvZmZzZXQnIGlzIGNoYW5nZWQgZnJvbSBGVF9VSW50IHRvCi0JRlRfT2Zmc2V0LCBmb3IgMTYtYml0IHBsYXRmb3Jtcy4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWd4dmFsaWQ6IEd1YXJhbnRlZSBgdHJhaycgdGFibGUgc2l6ZSB1cHRvIDMyLWJpdC4KLQotCSogc3JjL2d4dmFsaWQvZ3h2dHJhay5jIChneHZfdHJha192YWxpZGF0ZSk6Ci0JVGhlIHR5cGUgb2YgYG9mZnNldCcgaXMgY2hhbmdlZCBmcm9tIEZUX1VJbnQgdG8KLQlGVF9PZmZzZXQsIGZvciAxNi1iaXQgcGxhdGZvcm1zLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JdHlwZTE6IEZpeCBhIGRhdGEgdHlwZSBtaXNtYXRjaGluZyB3aXRoIGl0cyBzb3VyY2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oOiBUaGUgdHlwZSBvZgotCVQxX0ZhY2UtPmJ1aWxkY2hhciBpcyBtYXRjaGVkIHdpdGggVDFfRGVjb2Rlci0+dG9wLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JcGZyOiBGaXggYSBkYXRhIHR5cGUgbWlzbWF0Y2hpbmcgd2l0aCBpdHMgc291cmNlLgotCi0JKiBzcmMvcGZyL3BmcnR5cGVzLmg6IFRoZSB0eXBlIG9mIFBGUl9LZXJuSXRlbS0+b2Zmc2V0Ci0JaXMgZXh0ZW5kZWQgZnJvbSBGVF9VSW50MzIgdG8gRlRfT2Zmc2V0LCBiZWNhdXNlIGl0IGlzCi0JY2FsY3VsYXRlZCB3aXRoIHRoZSBwb2ludGVyIGRpZmZlcmVuY2UsIGluCi0JcGZyX2V4dHJhX2l0ZW1fbG9hZF9rZXJuaW5nX3BhaXJzKCkuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlwZnI6IEZpeCBhIGRhdGEgdHlwZSBtaXNtYXRjaGluZyB3aXRoIGl0cyBzb3VyY2UuCi0KLQkqIHNyYy9wZnIvcGZydHlwZXMuaDogVGhlIHR5cGUgb2YgUEZSX1BoeUZvbnQtPmNoYXJzX29mZnNldAotCWlzIGV4dGVuZGVkIGZyb20gRlRfVUludDMyIHRvIEZUX09mZnNldCwgYmVjYXVzZSBpdCBpcwotCWNhbGN1bGF0ZWQgd2l0aCB0aGUgcG9pbnRlciBkaWZmZXJlbmNlIGluIHBmcl9waHlfZm9udF9sb2FkKCkuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlwZnI6IEZpeCBhIGRhdGEgdHlwZSBtaXNtYXRjaGluZyB3aXRoIGl0cyBzb3VyY2UuCi0KLQkqIHNyYy9wZnIvcGZydHlwZXMuaDogVGhlIHR5cGUgb2YgUEZSX1BoeUZvbnQtPmJjdF9vZmZzZXQKLQlpcyBleHRlbmRlZCBmcm9tIEZUX1VJbnQzMiB0byBGVF9Mb25nLCBiZWNhdXNlIGl0IGlzCi0JbG9hZGVkIGJ5IEZUX1NUUkVBTV9QT1MoKSBpbiBwZnJfcGh5X2ZvbnRfbG9hZCgpLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jc21vb3RoOiBJbXByb3ZlIHRoZSBmb3JtYXQgaW4gZGVidWcgbWVzc2FnZS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfZHVtcF9jZWxscyk6IEltcHJvdmUgdGhlCi0JZm9ybWF0IHNwZWNpZmljYXRpb25zIHRvIGR1bXAgdmFyaWFibGVzLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jc2ZudDogRml4IGEgZGF0YSB0eXBlIG1pc21hdGNoaW5nIHdpdGggaXRzIHNvdXJjZS4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogVGhlIHR5cGUgb2YKLQlsb2NhbCBgZmxhZ3MnIGlzIG1hdGNoZWQgd2l0aCBGVF9GYWNlLT5mYWNlX2ZsYWdzLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JcHNhdXg6IEZpeCBhIGRhdGEgdHlwZSBtaXNtYXRjaGluZyB3aXRoIGl0cyBzb3VyY2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaDogVGhlIHR5cGUgb2YKLQlUMV9EZWNvZGVyUmVjLmJ1aWxkY2hhciBpcyBtYXRjaGVkIHdpdGgKLQlUMV9EZWNvZGVyUmVjLnRvcC4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXRydWV0eXBlOiBFeHRlbmQgVHJ1ZVR5cGUgR1ggcGFja2VkIGRlbHRhcyB0byBGVF9PZmZzZXQuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzKToKLQlUaGUgdHlwZSBvZiAybmQgYXJndW1lbnQgYGRlbHRhX2NudCcgaXMgY2hhbmdlZCBmcm9tCi0JRlRfSW50IHRvIEZUX09mZnNldCwgYmVjYXVzZSBpdHMgc291cmNlIGNhbiBiZSBjdnQKLQl0YWJsZSBzaXplIGNhbGN1bGF0ZWQgZnJvbSBzdHJlYW0gcG9zaXRpb24uCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQl0cnVldHlwZTogRXh0ZW5kIG1tdmFyX2xlbiB0byBob2xkIHNpemVfdCB2YWx1ZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmg6IFRoZSB0eXBlIG9mCi0JR1hfQmxlbmRSZWMubW12YXJfbGVuIGlzIGNoYW5nZWQgZnJvbSBGVF9JbnQgdG8KLQlGVF9PZmZzZXQsIGJlY2F1c2UgVFRfR2V0X01NX1ZhcigpIGNhbGN1bGF0ZXMgaXQKLQlieSBzaXplb2YoKSByZXN1bHRzLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JdHJ1ZXR5cGU6IENoZWNrIGludmFsaWQgZnVuY3Rpb24gbnVtYmVyIGluIElERUYgaW5zdHJ1Y3Rpb24uCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfSURFRik6IENoZWNrCi0JaWYgdGhlIG9wZXJhbmQgZml0cyB0byA4LWJpdCBvcGNvZGUgbGltaXRhdGlvbi4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXRydWV0eXBlOiBDaGVjayBpbnZhbGlkIGZ1bmN0aW9uIG51bWJlciBpbiBGREVGIGluc3RydWN0aW9uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX0ZERUYpOiBDaGVjawotCWlmIHRoZSBvcGVyYW5kIGZpdHMgMTYtYml0IGZ1bmN0aW9uIG51bWJlci4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXRydWV0eXBlOiBUcnVuY2F0ZSB0aGUgZGVsdGFzIG9mIGNvbXBvc2l0ZSBnbHlwaCBhdCAxNi1iaXQgdmFsdWVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKToKLQlJbnNlcnQgY2FzdCBmcm9tIEZUX0xvbmcgKGRlbHRhc1tpXS57eCx5fSkgdG8KLQlGVF9JbnQxNiBpbiB0aGUgc3VtbWF0aW9uIG9mIGRlbHRhc1tdIGZvciBjb21wb3NpdGUKLQlnbHlwaHMuICBCZWNhdXNlIGRlbHRhc1tpXSBpcyB0eXBlZCBhcyBGVF9Qb3MsCi0JaXRzIGNvbXBvbmVudCB4LCB5IGFyZSB0eXBlZCBhcyBGVF9Mb25nLCBidXQKLQl0aGVpciBzb3VyY2VzIGFyZSBhbHdheXMgRlRfSW50MTYgd2hlbiB0aGV5IGFyZQotCWxvYWRlZCBieSBmdF92YXJfcmVhZHBhY2tlZGRlbHRhcygpLiAgSG93ZXZlciwKLQl0aGUgbGltaXRhdGlvbiBhYm91dCB0aGUgc3VtbWVkIGRlbHRhcyBpcyB1bmNsZWFyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JdHJ1ZXR5cGU6IFRydW5jYXRlIHRoZSBpbnN0cnVjdGlvbnMgdXB0byAxNi1iaXQgcGVyIGEgZ2x5cGguCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0hpbnRfR2x5cGgpOiBUcnVuY2F0ZQotCXRoZSBpbnN0cnVjdGlvbnMgdXB0byAxNi1iaXQgbGVuZ3RoIHBlciBhIGdseXBoLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JdHJ1ZXR5cGU6IENhc3QgdGhlIG51bWVyaWNhbCBvcGVyYW5kcyB0byAzMi1iaXQgZm9yIExQNjQgc3lzdGVtcy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TUEhJWCwgSU5TX01JQVAsCi0JSW5zX01JUlApOiBJbnNlcnQgY2FzdCBmcm9tIGxvbmcgKGFyZ3NbXSwgdGhlCi0Jb3BlcmFuZHMgcGFzc2VkIHRvIFRydWVUeXBlIG9wZXJhdG9yKSB0byBGVF9JbnQzMgotCSh0aGUgYXJndW1lbnQgb2YgVFRfTXVsRml4MTQoKSkuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQl0cnVldHlwZTogQ2FzdCB0aGUgcHJvamVjdCB2ZWN0b3IgdG8gMzItYml0IGZvciBMUDY0IHN5c3RlbS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFByb2plY3QsIER1YWxQcm9qZWN0KToKLQlJbnNlcnQgY2FzdHMgZnJvbSBGVF9Qb3MgKHRoZSBhcmd1bWVudHMgYGR4JywgYGR5JykKLQl0byBGVF9VSW50MzIgKHRoZSBhcmd1bWVudCB0byBUVF9Eb3RGaXgxNCgpKS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXRydWV0eXBlOiBDYXN0IHRoZSBzY2FsaW5nIHBhcmFtcyB0byAzMi1iaXQgZm9yIExQNjQgc3lzdGVtLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQpOgotCUluc2VydCBjYXN0cyBmcm9tIGxvbmcgKHJldHVybiB2YWx1ZSBvZiBGVF9NdWxGaXgoKSkgdG8KLQlGVF9JbnQzMiAodGhlIGFyZ3VtZW50IHRvIEZUX1NxcnRGaXhlZCgpKS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXNmbnQ6IENhc3QgYSBjaGFyYWN0ZXIgY29kZSB0byBGVF9VSW50MzIgZm9yIExQNjQgc3lzdGVtLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnksCi0JdHRfY21hcDE0X3ZhcmlhbnRzLCB0dF9jbWFwMTRfY2hhcl92YXJpYW50cywKLQl0dF9jbWFwMTRfZGVmX2NoYXJfY291bnQsIHR0X2NtYXAxNF9nZXRfZGVmX2NoYXJzLAotCXR0X2NtYXAxNF9nZXRfbm9uZGVmX2NoYXJzLCB0dF9jbWFwMTRfdmFyaWFudF9jaGFycykKLQlJbnNlcnQgY2FzdHMgd2hlbiBGVF9VSW50MzIgdmFyaWFibGUgaXMgbG9hZGVkIGJ5Ci0JVFRfTkVYVF97VUlOVDI0fFVMT05HfS4gIEJlY2F1c2UgbW9zdCBvZiB0aGVtIGFyZQotCWNvbXBhcmVkIHdpdGggRlRfVUludDMyIHZhbHVlcyBpbiBwdWJsaWMgQVBJLCByZXBsYWNpbmcKLQlGVF9VRmFzdCBpcyBub3QgcmVjb21tZW5kZWQuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlzZm50OiBDYXN0IGEgY2hhcmFjdGVyIGNvZGUgdG8gRlRfVUludDMyIGZvciBMUDY0IHN5c3RlbS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X2luaXQsIHR0X2NtYXA0X25leHQpOgotCUluc2VydCB0aGUgY2FzdHMgZnJvbSB1bnNpZ25lZCBsb25nIGNvbnN0YW50IHRvCi0JRlRfVUludDMyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jc2ZudDogRXh0ZW5kIFRUX0JERi0+c3RyaW5nc19zaXplIHRvIEZUX1VMb25nIGZvciBodWdlIEJERi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmg6IFRoZSB0eXBlCi0Jb2YgVFRfQkRGLT5zdHJpbmdfc2l6ZSBpcyBleHRlbmRlZCBmcm9tIEZUX1VJbnQzMgotCXRvIEZUX1VMb25nLCBiZWNhdXNlIEJERiBzcGVjaWZpY2F0aW9uIGRvZXMgbm90Ci0JcmVzdHJpY3QgdGhlIGxlbmd0aCBvZiBzdHJpbmcuCi0JKiBzcmMvc2ZudC90dGJkZi5jOiBUaGUgc2NyYXRjaCB2YXJpYWJsZSBgc3RyaW5ncycKLQl0byBsb2FkIFRUX0JERi0+c3RyaW5nX3NpemUgaXMgbWF0Y2hlZCB3aXRoCi0JVFRfQkRGLT5zdHJpbmdfc2l6ZS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXBzYXV4OiBIYW5kbGUgdGhlIHN0cmluZyBsZW5ndGggYnkgRlRfT2Zmc2V0IHZhcmlhYmxlcy4KLQotCSogc3JjL3BzYXV4L2FmbXBhcnNlLmMgKGFmbV9wYXJzZXJfbmV4dF9rZXksCi0JYWZtX3Rva2VuaXplLCBhZm1fcGFyc2VfdHJhY2tfa2VybiwKLQlhZm1fcGFyc2Vfa2Vybl9wYWlycywgYWZtX3BhcnNlX2tlcm5fZGF0YSwKLQlhZm1fcGFyc2VyX3NraXBfc2VjdGlvbiwgYWZtX3BhcnNlcl9wYXJzZSk6Ci0JVGhlIGxlbmd0aCBvZiBrZXkgaXMgaGFuZGxlZCBieSBGVF9PZmZzZXQsCi0JaW5zdGVhZCBvZiBGVF9VSW50LiAgQWx0aG91Z2ggdGhlIGxlbmd0aCBvZgotCVBvc3RTY3JpcHQgc3RyaW5ncyBvciBuYW1lIG9iamVjdCBpcyAxNi1iaXQsCi0JQUZNX1NUUkVBTV9LRVlfTEVOKCkgY2FsY3VsYXRlcyB0aGUgbGVuZ3RoCi0JZnJvbSB0aGUgcG9pbnRlciBkaWZmZXJlbmNlLgotCi0JKiBzcmMvcHNhdXgvYWZtcGFyc2UuaCAoYWZtX3BhcnNlcl9uZXh0X2tleSk6Ci0JRGl0dG8uCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlwY2Y6IEZpeCBzb21lIGRhdGEgdHlwZXMgbWlzbWF0Y2hpbmcgd2l0aCB0aGVpciBzb3VyY2VzLgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9iaXRtYXBzKTogVGhlIHR5cGVzCi0Jb2YgYG5iaXRtYXBzJywgYGknLCBgc2l6ZWJpdG1hcHMnIGFyZSBtYXRjaGVkIHdpdGgKLQl0aGUgdHlwZSBvZiBhcmVhIEZUX0JpdG1hcC5waXRjaCAqIEZUX0JpdG1hcC5yb3dzLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JcGNmOiBIYW5kbGUgdGhlIHN0cmluZyBsZW5ndGggYnkgc2l6ZV90IHZhcmlhYmxlcy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9pbnRlcnByZXRfc3R5bGUpOiBUaGUgdHlwZXMKLQlvZiBubiwgbGVuLCBsZW5ndGhzWzRdIGFyZSBjaGFuZ2VkIHRvIHNpemVfdCwgYmVjYXVzZQotCXRoZXkgYXJlIGxvYWRlZCBieSAob3IgY29tcGFyZWQgd2l0aCkgZnRfc3RybGVuKCkuCi0KLQkqIHNyYy9wY2YvcGNmdXRpbC5jIChCaXRPcmRlckludmVydCwgVHdvQnl0ZVN3YXAsCi0JRm91ckJ5dGVTd2FwKTogVGhlIHR5cGUgb2YgdGhlIDJuZCBhcmd1bWVudCBgbmJ5dGVzJwotCWlzIGNoYW5nZWQgdG8gc2l6ZV90LCBmb3Igc2ltaWxhcml0eSB3aXRoIEFOU0kgQwotCXN0cmluZyBmdW5jdGlvbnMuCi0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYyAoUENGX0dseXBoX0xvYWQpOiBUaGUgdHlwZSBvZgotCWBieXRlcycgaXMgY2hhbmdlZCB0byBGVF9PZmZzZXQsIGJlY2F1c2UgaXQgaXMgcGFzc2VkCi0JdG8gRlRfQUxMT0MoKSwgdmlhIGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXAoKS4gIEF0Ci0JbGVhc3QsIHVzaW5nIHVuc2lnbmVkIHR5cGUgaXMgYmV0dGVyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JcGNmOiBGaXggc29tZSBkYXRhIHR5cGVzIG1pc21hdGNoaW5nIHdpdGggdGhlaXIgc291cmNlcy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUsCi0JcGNmX2hhc190YWJsZV90eXBlKTogVGhlIHR5cGUgb2YgM3JkIGFyZ3VtZW50Ci0JYG50YWJsZXMnIGlzIG1hdGNoZWQgd2l0aCBQQ0ZfVG9jLT5jb3VudC4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCW90dmFsaWQ6IFRydW5jYXRlIHRoZSBnbHlwaCBpbmRleCB0byAxNi1iaXQuCi0KLQkqIHNyYy9vdHZhbGlkL290dmFsaWQuYyAob3R2X3ZhbGlkYXRlKTogQ2hlY2tzCi0JZmFjZS0+bnVtX2dseXBocyBkb2VzIG5vdCBleGNlZWQgMTYtYml0IGxpbWl0LAotCXBhc3MgRlRfVUludCBudW1fZ2x5cGhzIHRvIGJhY2tlbmQgZnVuY3Rpb25zCi0Jb3R2X3tHUE9TfEdTVUJ8R0RFRnxKU1RGfE1BVEh9X3ZhbGlkYXRlKCkuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQljYWNoZTogSW5zZXJ0IGV4cGxpY2l0IGNhc3RzIGZvciBMUDY0IHN5c3RlbXMuCi0KLQkqIHNyYy9jYWNoZS9mdGNiYXNpYy5jIChGVENfSW1hZ2VDYWNoZV9Mb29rdXAsCi0JRlRDX1NCaXRDYWNoZV9Mb29rdXApOiBUaGUgdHlwZSBvZiBGVENfSW1hZ2VUeXBlLT53aWR0aAotCWlzIEZUX0ludCwgc28gdGhlIGNhc3QgdG8gdW5zaWduZWQgbGFyZ2VyIHR5cGUgRlRfVUxvbmcKLQlpcyBpbnRyb2R1Y2VkIGZvciB0aGUgY29tcGFyaXNvbnMgd2l0aCAweDEwMDAwTCBmb3IKLQlMUDY0IHBsYXRmb3JtLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JY2FjaGU6IEZpeCBzb21lIGRhdGEgdHlwZXMgbWlzbWF0Y2hpbmcgd2l0aCB0aGVpciBzb3VyY2VzLgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuaDogVGhlIHR5cGUgb2YgcmV0dXJuIHZhbHVlCi0JYnkgRlRDX05vZGVfV2VpZ2h0RnVuYyBmdW5jdGlvbiBpcyBjaGFuZ2VkIHRvCi0JRlRfT2Zmc2V0LiAgVGhlIHR5cGUgb2YgRlRDX0NhY2hlQ2xhc3MtPmNhY2hlX3NpemUKLQlpcyBjaGFuZ2VkIHRvIEZUX09mZnNldCwgdG9vLgotCi0JKiBzcmMvY2FjaGUvZnRjY2JhY2suaCAoZnRfaW5vZGVfd2VpZ2h0LAotCWZ0Y19zbm9kZV93ZWlnaHQpOiBEaXR0by4KLQotCSogc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoZnRjX2NtYXBfbm9kZV93ZWlnaHQpOiBEaXR0by4KLQotCSogc3JjL2NhY2hlL2Z0Y2ltYWdlLmMgKGZ0Y19pbm9kZV93ZWlnaHQsCi0JRlRDX0lOb2RlX1dlaWdodCk6IERpdHRvLgotCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3Nub2RlX3dlaWdodCwKLQlGVENfU05vZGVfV2VpZ2h0KTogRGl0dG8uCi0KLQkqIHNyYy9jYWNoZS9mdGNtcnUuaDogVGhlIHR5cGUgb2YKLQlGVENfTXJ1TGlzdENsYXNzLT5ub2RlX3NpemUgaXMgY2hhbmdlZCB0byBGVF9PZmZzZXQsCi0JYmVjYXVzZSBpdCBpcyBwYXNzZWQgdG8gRlRfQUxMT0MoKSB0byBzcGVjaWZ5IHRoZQotCXNpemUgb2YgYnVmZmVyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JWFhYX2NtYXBfZW5jb2RpbmdfY2hhcl9uZXh0KCkgcmV0dXJuIEZUX1VJbnQzMiB2YWx1ZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaDoKLQlUaGUgc2l6ZSBvZiB0aGUgY2hhcmNvZGUgdmFsdWUgcmV0dXJuZWQgYnkKLQl0aGUgZnVuY3Rpb24gdHlwZWQgUFNfVW5pY29kZXNfQ2hhck5leHRGdW5jIGlzCi0JbWF0Y2hlZCB3aXRoIGl0cyBpbnB1dCBjaGFyY29kZSB2YWx1ZS4KLQotCSogc3JjL2NmZi9jZmZtYXAuYyAoY2ZmX2NtYXBfZW5jb2RpbmdfY2hhcl9uZXh0LAotCWNmZl9jbWFwX3VuaWNvZGVfY2hhcl9uZXh0KTogRGl0dG8uCi0KLQkqIHNyYy9wZnIvcGZybWFwLmMgKHBmcl9jbWFwX2VuY29kaW5nX2NoYXJfbmV4dCk6Ci0JRGl0dG8uCi0KLQkqIHNyYy9wc2F1eC90MWNtYXAuYyAodDFfY21hcF9zdGRfY2hhcl9uZXh0LAotCXQxX2NtYXBfY3VzdG9tX2NoYXJfbmV4dCwgdDFfY21hcF91bmljb2RlX2NoYXJfbmV4dCk6Ci0JRGl0dG8uCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKHBzX3VuaWNvZGVzX2NoYXJfbmV4dCk6Ci0JRGl0dG8uCi0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2NtYXBfY2hhcl9uZXh0KToKLQlEaXR0by4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAwX2NoYXJfbmV4dCwKLQl0dF9jbWFwMl9jaGFyX25leHQsIHR0X2NtYXA0X2NoYXJfbmV4dCwKLQl0dF9jbWFwNl9jaGFyX25leHQsIHR0X2NtYXAxMF9jaGFyX25leHQsCi0JdHRfY21hcDEyX2NoYXJfbmV4dCwgdHRfY21hcDEzX2NoYXJfbmV4dCk6IERpdHRvLgotCSh0dF9jbWFwMTRfY2hhcl92YXJpYW50cyk6IEhhbmRsZSBiYXNlIHVuaWNvZGUKLQljb2RlcG9pbnQgYnkgRlRfVUludDMyIHZhcmlhYmxlIHRvIGF2b2lkIG92ZXJmbG93Ci0Jb24gMTYtYml0IHBsYXRmb3Jtcy4KLQkodHRfY21hcDE0X2Vuc3VyZSk6IFRoZSB0eXBlIG9mIGBudW1fcmVzdWx0cycgaXMKLQlleHRlbmQgdG8gRlRfVUludDMyLCB0byBjb3ZlciB1bnNpZ25lZCAzMi1iaXQKLQlgbnVtVmFyU2VsZWN0b3JSZWNvcmRzJyBpbiBjbWFwMTQgdGFibGUgaGVhZGVyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JdHJ1ZXR5cGU6IEV4dGVuZCBUVF9GYWNlLT5udW1fbG9jYXRpb25zIGZvciBicm9rZW4gVFRGcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmg6Ci0JVFRfRmFjZS0+bnVtX2xvY2F0aW9ucyBhcmUgZXh0ZW5kZWQgZnJvbSBGVF9VSW50Ci0JdG8gRlRfVUxvbmcsIHRvIHN0YW5kIHdpdGggYnJva2VuIGh1Z2UgbG9jYSB0YWJsZS4KLQlTb21lIHBlb3BsZSBpbnNpc3RzIHRoZXJlIGFyZSBicm9rZW4gVFRGIGluY2x1ZGluZwotCXRoZSBnbHlwaHMgb3ZlciAxNi1iaXQgbGltaXRhdGlvbiwgaW4gUFJDIG1hcmtldC4KLQkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfbG9hZF9sb2NhKToKLQlSZW1vdmUgdW5yZXF1aXJlZCAxNi1iaXQgdHJ1bmNhdGlvbiBmb3IgRlRfVUludAotCVRUX0ZhY2UtPm51bV9sb2NhdGlvbnMuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlzbW9vdGg6IEZpeCBzb21lIGRhdGEgdHlwZXMgbWlzbWF0Y2hpbmcgd2l0aCB0aGVpciBzb3VyY2VzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYzogVGhlIHR5cGUgb2YgYFRDb29yZCcgaXMKLQltYXRjaGVkIHRvIGBUUG9zJywgYmVjYXVzZSB0aGV5IGFyZSBtaXhlZCBpbgotCWdyYXlfc2V0X2NlbGwoKS4gIFRoZSB0eXBlIG9mIFRDZWxsLT54IGlzIGV4dGVuZGVkCi0JdG8gYFRQb3MnLCBiZWNhdXNlIGdyYXlfZmluZF9jZWxsKCkgc2V0cyBpdCBieQotCVRXb3JrZXIuZXguICBUaGUgdHlwZSBvZiBUQ2VsbC0+Y292ZXIgaXMgZXh0ZW5kZWQKLQl0byBgVENvb3JkJywgYmVjYXVzZSBncmF5X3JlbmRlcl9zY2FubGluZSgpIGFkZHMKLQlUQ29vcmQgdmFsdWUgdG8gaXQuICBUaGUgdHlwZSBvZiBUV29yay5jb3ZlciBpcyBtYXRjaGVkCi0Jd2l0aCBUQ2VsbC0+Y292ZXIuICBUaGUgdHlwZXMgb2YKLQlUV29yay57bWF4X2NlbGxzLG51bV9jZWxsc30gYXJlIGNoYW5nZWQgdG8gRlRfUHRyRGlzdCwKLQliZWNhdXNlIHRoZXkgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgbWVtb3J5IGFkZHJlc3Nlcy4KLQlUaGUgdHlwZSBvZiBUV29yay55Y291bnQgaXMgY2hhbmdlZCB0byBUUG9zLCBiZWNhdXNlCi0JaXQgaXMgY2FsY3VsYXRlZCBmcm9tIFRQb3MgdmFyaWFibGVzLgotCShncmF5X2ZpbmRfY2VsbCk6IFRoZSB0eXBlIG9mIGB4JyBpcyBtYXRjaGVkIHdpdGgKLQlpdHMgaW5pdGlhbCB2YWx1ZSByYXMuZXguCi0JKGdyYXlfcmVuZGVyX3NjYW5saW5lKTogVGhlIHR5cGVzIG9mIGBtb2QnLCBgbGlmdCcKLQlhbmQgYHJlbScgYXJlIGNoYW5nZWQgdG8gVENvb3JkLCBiZWNhdXNlIHRoZWlyIHZhbHVlcwotCWFyZSBzZXQgd2l0aCBleHBsaWNpdCBjYXN0cyB0byBUQ29vcmQuICBXaGVuIHJhcy5hcmVhCi0JaXMgdXBkYXRlZCBieSB0aGUgZGlmZmVyZW50aWFsIHZhbHVlcyBpbmNsdWRpbmcKLQlgZGVsdGEnLCB0aGV5IGFyZSBleHBsaWNpdGx5IGNhc3QgdG8gVEFyZWEsIGJlY2F1c2UKLQl0aGUgdHlwZSBvZiBgZGVsdGEnIGlzIG5vdCBUQXJlYSBidXQgVENvb3JkLgotCShncmF5X3JlbmRlcl9saW5lKTogVGhlIHR5cGUgb2YgYG1vZCcgaXMgZXh0ZW5kZWQKLQlmcm9tIGludCB0byBUQ29vcmQsIGJlY2F1c2UgKFRDb29yZClkeSBpcyBhZGRlZCB0byBtb2QuCi0JKGdyYXlfaGxpbmUpOiBUaGUgYXJndW1lbnQgYGFjb3VudCcgaXMgZXh0ZW5kZWQgdG8KLQlUQ29vcmQsIHRvIG1hdGNoIHdpdGggdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGNhbGxlcnMuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQljZmY6IEZpeCBzb21lIGRhdGEgdHlwZXMgbWlzbWF0Y2hpbmcgd2l0aCB0aGVpciBzb3VyY2VzLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IFRoZSB0eXBlIG9mCi0JYHNjYWxpbmcnIGlzIG1hdGNoZWQgd2l0aCB0aGUgc2NhbGluZyBwYXJhbWV0ZXIKLQlpbiBGVF9NYXRyaXhfTXVsdGlwbHlfU2NhbGVkKCkgYW5kCi0JRlRfVmVjdG9yX1RyYW5zZm9ybV9TY2FsZWQoKS4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfcmVhbCk6IFRoZSB0eXBlIG9mCi0JYHBvd2VyX3RlbicsIGBzY2FsaW5nJywgYGV4cG9uZW50X2FkZCcsCi0JYGludGVnZXJfbGVuZ3RoJywgYGZyYWN0aW9uX2xlbmd0aCcsCi0JYG5ld19mcmFjdGlvbl9sZW5ndGgnIGFuZCBgc2hpZnQnIGFyZSBtYXRjaGVkIHdpdGgKLQl0aGUgdHlwZSBvZiBgZXhwb25lbnQnIHRvIGF2b2lkIHVuZXhwZWN0ZWQgdHJ1bmNhdGlvbi4KLQkoY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCk6IFRoZSB0eXBlIG9mIGBzY2FsaW5nJyBpcwotCW1hdGNoZWQgd2l0aCB0aGUgYHNjYWxpbmcnIGFyZ3VtZW50IHRvCi0JY2ZmX3BhcnNlX3JlYWwoKS4KLQkoY2ZmX3BhcnNlX2ZpeGVkX2R5bmFtaWMpOiBEaXR0by4KLQkoY2ZmX3BhcnNlX2ZvbnRfbWF0cml4KTogVGhlIHR5cGUgb2YgYHNjYWxpbmcnIGlzCi0JbWF0Y2hlZCB3aXRoIHRoZSBgc2NhbGluZycgYXJndW1lbnQgdG8KLQljZmZfcGFyc2VfZHluYW1pYygpLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JYXV0b2ZpdDogRml4IHNvbWUgZGF0YSB0eXBlcyBtaXNtYXRjaGluZyB3aXRoIHRoZWlyIHNvdXJjZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmM6IENvcnJlY3QgdGhlIHR5cGUgb2YKLQlBRl9GYWNlR2xvYmFsc1JlYy5nbHlwaF9jb3VudCB0byBtYXRjaCB3aXRoCi0JRlRfRmFjZS0+bnVtX2dseXBocy4KLQkoYWZfZmFjZV9nbG9iYWxzX2NvbXB1dGVfc2NyaXB0X2NvdmVyYWdlKToKLQlJbnNlcnQgZXhwbGljaXQgY2FzdCB0byBjb21wYXJlCi0JRlRfTG9uZyBBRl9GYWNlR2xvYmFsc1JlYy5nbHlwaF9jb3VudCB2ZXJzdXMKLQlGVF9VSW50IGdpbmRleC4gIFRoZSB0eXBlIG9mIGBubicgaXMgY2hhbmdlZAotCXRvIHNjYW4gZ2x5cGggaW5kZXggdXB0byBBRl9GYWNlR2xvYmFsc1JlYy5nbHlwaF9jb3VudC4KLQkoYWZfZmFjZV9nbG9iYWxzX2dldF9tZXRyaWNzKTogVGhlIHR5cGUgb2YgYHNjcmlwdF9tYXgnCi0JaXMgY2hhbmdlZCB0byBjb3ZlciBzaXplX3QgdmFsdWUuICBJbnNlcnQgZXhwbGljaXQgY2FzdAotCXRvIGNvbXBhcmUgRlRfTG9uZyBBRl9GYWNlR2xvYmFsc1JlYy5nbHlwaF9jb3VudCB2ZXJzdXMKLQlGVF9VSW50IGdpbmRleC4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9heGlzX2hpbnRzX25ld19zZWdtZW50KToKLQlJbnNlcnQgZXhwbGljaXQgY2FzdCB0byBjYWxjdWxhdGUgYGJpZ19tYXgnIGZyb20KLQlpbnRlZ2VyIGFuZCBzaXplX3QgdmFsdWVzLgotCShhZl9heGlzX2hpbnRzX25ld19lZGdlKTogRGl0dG8uCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKToKLQlUaGUgdHlwZSBvZiBgYmVzdF95JyBpcyBtYXRjaGVkIHRvIEZUX1ZlY3Rvci55LgotCShhZl9sYXRpbl9jb21wdXRlX3N0ZW1fd2lkdGgpOiBUaGUgdHlwZSBvZiBgZGVsdGEnIGlzCi0JbWF0Y2hlZCB0byBgZGlzdCcgYW5kIGBvcmdfZGlzdCcuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlhdXRvZml0OiBDb3VudCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IG9iamVjdCBieSBwdHJkaWZmX3QuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19oaW50X2VkZ2VzKTogVGhlCi0JbnVtYmVyIG9mIGVkZ2VzIGBuX2VkZ2VzJyBzaG91bGQgYmUgY291bnRlZCBieQotCUZUX1B0ckRpc3QgdmFyaWFibGUgaW5zdGVhZCBvZiBGVF9JbnQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludF9lZGdlcyk6Ci0JRGl0dG8uCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaDogSW4gQUZfU2NyaXB0Q2xhc3NSZWMsCi0JdGhlIHNpemUgb2YgbWV0cmljIGBzY3JpcHRfbWV0cmljc19zaXplJyBzaG91bGQKLQliZSBjb3VudGVkIGJ5IEZUX09mZnNldCB2YXJpYWJsZSBpbnN0ZWFkIG9mIEZUX1VJbnQuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYwotCShhZl9nbHlwaF9oaW50c19hbGlnbl9zdHJvbmdfcG9pbnRzKTogVGhlIGN1cnNvcnMKLQlmb3IgdGhlIGVkZ2VzIGBtaW4nLCBgbWF4JywgYG1pZCcgaW4gdGhlIG1lbW9yeQotCWJ1ZmZlciBzaG91bGQgYmUgdHlwZWQgRlRfUHRyRGlzdC4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWF1dG9maXQ6IEZpeCBmb3IgdW51c2VkIHZhcmlhYmxlIGBmaXJzdCcuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogSW5zZXJ0Ci0JRlRfVU5VU0VEKCkgdG8gaGlkZSB0aGUgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlJbXByb3ZlIGJpdG1hcCBzaXplIG9yIHBpeGVsIHZhcmlhYmxlcyBmb3IgMTYtYml0IHN5c3RlbXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmg6IEludHJvZHVjZQotCUZUX0lOVF9NSU4sIHRvIHVzZSBpbiBzaWduZWQgaW50ZWdlciBvdmVyZmxvdyBpbgotCTE2LWJpdCBhbmQgNjQtYml0IHBsYXRmb3Jtcy4KLQkKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGQgYSB0cmFjZXIKLQl0byBmdHN5bnRoLmMuCi0JCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfRW1ib2xkZW4pOiBDaGVjawotCWludmFsaWQgc3RyZW5ndGggY2F1c2luZyBpbnRlZ2VyIG92ZXJmbG93IG9uIDE2LWJpdAotCXBsYXRmb3JtLgotCQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKGZ0X2Nvcm5lcl9vcmllbnRhdGlvbik6IENoYW5nZQotCXRoZSBpbnRlcm5hbCBjYWxjdWxhdGlvbiBmcm9tIEZUX0ludCB0byBGVF9Mb25nLCB0bwotCWF2b2lkIGFuIG92ZXJmbG93IG9uIDE2LWJpdCBwbGF0Zm9ybXMuICBUaGUgY2FsbGVyIG9mCi0JdGhpcyBmdW5jdGlvbiBzaG91bGQgdXNlIG9ubHkgdGhlIHNpZ24gb2YgcmVzdWx0LAotCXNvIHRoZSBjYXN0IHRvIEZUX0ludCBpcyBhY2NlcHRhYmxlLgotCQotCSogc3JjL2Jhc2UvZnRzeW50aC5jOiBJbnRyb2R1Y2UgYSB0cmFjZXIgZm9yIHN5bnRoIG1vZHVsZS4KLQkoRlRfR2x5cGhTbG90X0VtYm9sZGVuKTogQ2hlY2sgaW52YWxpZCBzdHJlbmd0aCBjYXVzaW5nCi0JaW50ZWdlciBvdmVyZmxvdyBvbiAxNi1iaXQgcGxhdGZvcm0uCi0JCi0JKiBzcmMvYmRmL2JkZmRyaXZyLmMgKEJERl9GYWNlX0luaXQpOiBUaGUgZ2x5cGggaW5kZXgKLQlpbiBGVDIgQVBJIGlzIHR5cGVkIGFzIEZUX1VJbnQsIGFsdGhvdWdoIEJERiBkcml2ZXIKLQljYW4gaGFuZGxlIHVuc2lnbmVkIGxvbmcgZ2x5cGggaW5kZXggaW50ZXJuYWxseS4gIFRvCi0JYXZvaWQgaW50ZWdlciBvdmVyZmxvdyBvbiAxNi1iaXQgcGxhdGZvcm0sIHRvbyBsYXJnZQotCWdseXBoIGluZGV4IHNob3VsZCBiZSBleGNsdWRlZC4KLQkoQkRGX0dseXBoX0xvYWQpOiBUaGUgZ2x5cGggcGl0Y2ggaW4gRlQyIGlzIHR5cGVkIGFzCi0JRlRfVUludCwgYWx0aG91Z2ggQkRGIGRyaXZlciBjYW4gaGFuZGxlIHVuc2lnbmVkIGxvbmcKLQlnbHlwaCBwaXRjaCBpbnRlcm5hbGx5LiAgVG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvdyBvbgotCTE2LWJpdCBwbGF0Zm9ybSwgdG9vIGxhcmdlIGdseXBoIHBpdGNoIHNob3VsZCBub3QgYmUKLQlyZXR1cm5lZC4KLQkKLQkqIHNyYy9wZnIvcGZyc2JpdC5jIChwZnJfc2xvdF9sb2FkX2JpdG1hcCk6IFRoZSBnbHlwaAotCXBpdGNoIGluIEZUMiBpcyB0eXBlZCBhcyBGVF9VSW50LCBhbHRob3VnaCBQRlIgZm9udAotCWZvcm1hdCBjYW4gaW5jbHVkZSBodWdlIGJpdG1hcCBnbHlwaCB3aXRoIDI0LWJpdCBwaXRjaAotCShob3dldmVyLCBhIGdseXBoIHNwZW5kcyAxNi43IHBpeGVsLCBpdCdzIG5vdCByZWFsaXN0aWMpLgotCVRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgb24gMTYtYml0IHBsYXRmb3JtLCBodWdlCi0JYml0bWFwIGdseXBoIHNob3VsZCBiZSBleGNsdWRlZC4KLQkKLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2hsaW5lKTogQXMgRlRfU3Bhbi54IGlzCi0JdHJ1bmNhdGVkIHRvIGZpdCBpdHMgdHlwZSAoMTYtYml0IHNob3J0KSwgRlRfU3Bhbi55Ci0Jc2hvdWxkIGJlIHRydW5jYXRlZCB0byBmaXQgaXRzIHR5cGUgKEZUX0ludCkuCi0JCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfcm9zKTogQ0ZGIHNwZWNpZmljYXRpb24KLQlkZWZpbmVzIHRoZSBzdXBwbGVtZW50IGluIFJPUyBhcyBhIHJlYWwgbnVtYmVyLgotCVRydW5jYXRlIGl0IHRvIGZpdCBwdWJsaWMgRlQyIEFQSS4KLQkKLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX2NpZF9yb3MpOiBXYXJuIHRoZQotCXN1cHBsZW1lbnQgaWYgaXQgaXMgdHJ1bmNhdGVkIG9yIHJvdW5kZWQgaW4gY2ZmX2dldF9yb3MoKS4KLQkKLQkqIHNyYy9jZmYvY2ZmdHlwZXMuaDogQ2hhbmdlIHRoZSB0eXBlIG9mIGludGVybmFsIHZhcmlhYmxlCi0JYHN1cHBsZW1lbnQnIGZyb20gRlRfTG9uZyB0byBGVF9VTG9uZyB0byBmaXQgdGhlIHNpZ25lZG5lc3MKLQl0byB0aGUgdHlwZSBpbiBwdWJsaWMgQVBJLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JcHNhdXg6IFByZXZlbnQgaW52YWxpZCBhcmd1bWVudHMgdG8gYWZtX3BhcnNlcl9yZWFkX3ZhbHMoKS4KLQotCSogc3JjL3BzYXV4L2FmbXBhcnNlLmMgKGFmbV9wYXJzZXJfcmVhZF92YWxzKTogQ2hhbmdlCi0JdGhlIHR5cGUgb2YgYG4nIHRvIHByZXZlbnQgbmVnYXRpdmUgbnVtYmVyIGhvdyBtYW55Ci0JYXJndW1lbnRzIHNob3VsZCBiZSBwYXJzZWQuCi0KLQkqIHNyYy9wc2F1eC9hZm1wYXJzZS5oIChhZm1fcGFyc2VyX3JlYWRfdmFscyk6IERpdHRvLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JYmFzZTogUHJldmVudCBzb21lIG92ZXJmbG93cyBvbiBMUDY0IHN5c3RlbXMuCi0KLQkqIHNyYy9iYXNlL2Z0YWR2YW5jLmMgKEZUX0dldF9BZHZhbmNlcyk6IENhc3QgdGhlCi0JdW5zaWduZWQgbG9uZyBjb25zdGFudCBGVF9MT0FEX0FEVkFOQ0VfT05MWSB0byBGVF9VSW50MzIKLQlmb3IgTFA2NCBwbGF0Zm9ybXMuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9TcXJ0MzIpOiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzCi0JYXJlIGNoYW5nZWQgdG8gRlRfVUludDMyIGZyb20gRlRfVUxvbmcuCi0JKEZUX011bERpdik6IEluc2VydCBjYXN0cyB0byBGVF9JbnQzMiBmb3IgTFA2NCBwbGF0Zm9ybXMuCi0JVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCBmb3IgMzItYml0IGludGVnZXIsIGFsdGhvdWdoCi0JdGhlaXIgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUgYXJlIEZUX0xvbmcuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfQ2hhcl9JbmRleCk6IENoZWNrIGBjaGFyY29kZScKLQlpcyB3aXRoaW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgZm9yIExQNjQgcGxhdGZvcm1zLgotCShGVF9GYWNlX0dldENoYXJWYXJpYW50SW5kZXgpOiBDaGVjayBgY2hhcmNvZGUnIGFuZAotCWB2YXJpYW50U2VsZWN0b3InIGFyZSB3aXRoaW4gMzItYml0IGludGVnZXIgZm9yIExQNjQKLQlwbGF0Zm9ybXMuCi0JKEZUX0ZhY2VfR2V0Q2hhcnNPZlZhcmlhbnQpOiBDaGVjayBgdmFyaWFudFNlbGVjdG9yJyBpcwotCXdpdGhpbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBmb3IgTFA2NCBwbGF0Zm9ybXMuCi0KLQkqIHNyYy9iYXNlL2Z0dHJpZ29uLmMgKGZ0X3RyaWdfZG93bnNjYWxlKTogVGhlIEZUX0ZpeGVkCi0JdmFyaWFibGUgYHZhbCcgYW5kIHVuc2lnbmVkIGxvbmcgY29uc3RhbnQgRlRfVFJJR19TQ0FMRQotCWFyZSBjYXN0IHRvIEZUX1VJbnQzMiwgd2hlbiBjYWxjdWxhdGVzIEZUX1VJbnQzMi4KLQkoRlRfVmVjdG9yX1JvdGF0ZSk6IFRoZSBsb25nIGNvbnN0YW50IDFMIGlzIGNhc3QgdG8KLQlGVF9JbnQzMiB0byBjYWxjdWxhdGUgRlRfSW50MzIgYGhhbGYnLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JY2ZmOiBDYXN0IHRoZSBsb25nIHZhcmlhYmxlcyB0byAzMi1iaXQgZm9yIExQNjQgc3lzdGVtcy4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X2FkdmFuY2VzKTogSW5zZXJ0Ci0JZXhwbGljaXQgY2FzdCB0byBtb2RpZnkgYSAzMi1iaXQgZmxhZyBieSB1bnNpZ25lZAotCWxvbmcgY29uc3RhbnQuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogRGl0dG8uCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOgotCVJlcGxhY2UgdGhlIGNhc3RzIHRvIEZUX0xvbmcgYnkgdGhlIGNhc3RzIHRvIEZUX0ludDMyCi0JZm9yIExQNjQgcGxhdGZvcm1zLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JcGNmOiBJbXByb3ZlIFBDRl9Qcm9wZXJ0eVJlYy52YWx1ZSBuYW1lcyBvbiBMUDY0IHBsYXRmb3Jtcy4KLQotCSogc3JjL3BjZi9wY2YuaDogSW4gUENGX1Byb3BlcnR5UmVjLnZhbHVlLCB0aGUgbWVtYmVyCi0JYGludGVnZXInIGlzIHJlcGxhY2VkIGJ5IGBsJywgYGNhcmRpbmFsJyBpcyByZXBsYWNlZAotCWJ5IGB1bCcsIHRvIGZpeCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuYW1lIGFuZAotCXRoZSB0eXBlcyBvbiBMUDY0IHBsYXRmb3Jtcy4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChwY2ZfZ2V0X2JkZl9wcm9wZXJ0eSk6IFJlZmxlY3QKLQlQQ0ZfUHJvcGVydHlSZWMudmFsdWUgY2hhbmdlLCB3aXRoIGFwcHJvcHJpYXRlIGNhc3RzCi0JdG8gRlRfSW50MzIvRlRfVUludDMyLiAgVGhlaXIgZGVzdGluYXRpb25zCi0JQkRGX1Byb3BlcnR5UmVjLntpbnRlZ2VyfGNhcmRpbmFsfSBhcmUgcHVibGljIGFuZAotCWV4cGxpY2l0bHkgZGVmaW5lZCBhcyBGVF9JbnQzMi9GVF9VSW50MzIuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X3Byb3BlcnRpZXMsIHBjZl9sb2FkX2ZvbnQpOgotCVJlZmxlY3QgUENGX1Byb3BlcnR5UmVjLnZhbHVlIGNoYW5nZS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXBjZjogRml4IHNvbWUgZGF0YSB0eXBlcyBtaXNtYXRjaGluZyB3aXRoIHRoZWlyIHNvdXJjZXMuCi0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYyAocGNmX2NtYXBfY2hhcl9pbmRleCk6IFRoZSB0eXBlIG9mCi0JYGNvZGUnIGlzIG1hdGNoZWQgdG8gUENGX0VuY29kaW5nLT5lbmMuCi0JKHBjZl9jbWFwX2NoYXJfbmV4dCk6IFRoZSB0eXBlIG9mIGBjaGFyY29kZScgaXMgbWF0Y2hlZAotCXRvIFBDRl9FbmNvZGluZy0+ZW5jLiAgV2hlbiAqYWNoYXJjb2RlIGlzIHNldCBieSBjaGFyY29kZSwKLQlhbiBvdmVyZmxvdyBpcyBjaGVja2VkIGFuZCBjYXN0IHRvIHVuc2lnbmVkIDMyLWJpdAotCWludGVnZXIuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQliZGY6IEltcHJvdmUgYmRmX3Byb3BlcnR5X3QudmFsdWUgbmFtZXMgZm9yIExQNjQgcGxhdGZvcm1zLgotCi0JKiBzcmMvYmRmL2JkZi5oOiBJbiBiZGZfcHJvcGVydHlfdC52YWx1ZSwgdGhlIG1lbWJlcgotCWBpbnQzMicgaXMgcmVwbGFjZWQgYnkgYGwnLCBgY2FyZDMyJyBpcyByZXBsYWNlZCBieQotCWB1bCcsIHRvIGZpeCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUKLQl0eXBlcyBvbiBMUDY0IHBsYXRmb3Jtcy4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfRmFjZV9Jbml0KTogUmVmbGVjdAotCWJkZl9wcm9wZXJ0eV90LnZhbHVlIGNoYW5nZS4KLQkoYmRmX2dldF9iZGZfcHJvcGVydHkpOiBSZWZsZWN0IGJkZl9wcm9wZXJ0eV90LnZhbHVlCi0JY2hhbmdlLCB3aXRoIGFwcHJvcHJpYXRlIGNhc3RzIHRvIEZUX0ludDMyL0ZUX1VJbnQzMi4KLQlUaGVpciBkZXN0aW5hdGlvbnMgQkRGX1Byb3BlcnR5UmVjLntpbnRlZ2VyfGNhcmRpbmFsfQotCWFyZSBwdWJsaWMgYW5kIGV4cGxpY2l0bHkgZGVmaW5lZCBhcyBGVF9JbnQzMi9GVF9VSW50MzIuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfYWRkX3Byb3BlcnR5KTogUmVmbGVjdAotCWJkZl9wcm9wZXJ0eV90LnZhbHVlIGNoYW5nZS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWJkZjogRml4IHNvbWUgZGF0YSB0eXBlcyBtaXNtYXRjaGluZyB3aXRoIHRoZWlyIHNvdXJjZXMuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoYmRmX2NtYXBfY2hhcl9pbmRleCk6IFRoZSB0eXBlCi0Jb2YgYGNvZGUnIGlzIG1hdGNoZWQgd2l0aCBCREZfZW5jb2RpbmdfZWwtPmVuYy4KLQkoYmRmX2NtYXBfY2hhcl9uZXh0KTogVGhlIHR5cGUgb2YgYGNoYXJjb2RlJyBpcwotCW1hdGNoZWQgd2l0aCBCREZfZW5jb2RpbmdfZWwtPmVuYy4gIFdoZW4gKmFjaGFyY29kZQotCWlzIHNldCBieSBjaGFyY29kZSwgYW4gb3ZlcmZsb3cgaXMgY2hlY2tlZCBhbmQKLQljYXN0IHRvIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JYXV0b2ZpdDogSW1wcm92ZSBVbmljb2RlIHJhbmdlIGRlZmluaXRpb25zLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggKEFGX1VOSVJBTkdFX1JFQyk6IE5ldyBtYWNybwotCXRvIGRlY2xhcmUgYSByYW5nZSBieSB0d28gdW5zaWduZWQgMzItYml0IGludGVnZXIsCi0JdG8gYXZvaWQgNjQtYml0IHJhbmdlIGRlZmluaXRpb24gb24gTFA2NCBwbGF0Zm9ybXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fdW5pcmFuZ2VzKTogRGl0dG8uCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4yLmMgKGFmX2xhdGluMl91bmlyYW5nZXMpOiBEaXR0by4KLQotCSogc3JjL2F1dG9maXQvYWZpbmRpYy5jIChhZl9pbmRpY191bmlyYW5nZXMpOiBEaXR0by4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX3VuaXJhbmdlcyk6IERlY2xhcmUKLQl0aGUgcmFuZ2VzIGJ5IEFGX1VOSVJBTkdFX1JFQy4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXNtb290aDogRml4IGEgZGF0YSB0eXBlIG1pc21hdGNoaW5nIHdpdGggaXRzIHNvdXJjZS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfc3dlZXApOiBUaGUgdHlwZSBvZgotCWBhcmVhJyBpcyBtYXRjaGVkIHdpdGggdGhlIDNyZCBhcmd1bWVudCBgYXJlYScKLQlvZiBncmF5X2hsaW5lKCkuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlzbW9vdGg6IEZpeCBhIGRhdGEgdHlwZSBtaXNtYXRjaGluZyB3aXRoIGl0cyBzb3VyY2UuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9saW5lKTogVGhlIHR5cGUKLQlvZiBgYXJlYScgaXMgbWF0Y2hlZCB3aXRoIFRXb3JrZXIuYXJlYS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWNhY2hlOiBEaXNhYmxlIHRoZSBsZWdhY3kgY29tcGF0aWJpbGl0eSBpZiAxNi1iaXQgc3lzdGVtLgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYyAoRlRDX0ltYWdlQ2FjaGVfTG9va3VwKTogRXhjbHVkZQotCXRoZSBsZWdhY3kgYmVoYXZpb3VyIGZyb20gMTYtYml0IHBsYXRmb3JtLCBiZWNhdXNlIHRoZQotCWN1cnJlbnQgaGFjayBjYW5ub3QgZGV0ZWN0IHRoZSBjYWxsZXIgdXNlcyB0aGlzIGZ1bmN0aW9uCi0JdmlhIGxlZ2FjeSBjb252ZW50aW9uLgotCShGVENfU0JpdENhY2hlX0xvb2t1cCk6IERpdHRvLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JY2FjaGU6IENoZWNrIDMyLWJpdCBnbHlwaCBpbmRleCBvbiAxNi1iaXQgc3lzdGVtcy4KLQotCSogc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMgKGZ0Y19iYXNpY19mYW1pbHlfZ2V0X2NvdW50KToKLQlDaGVjayBvdmVyZmxvdyBjYXVzZWQgYnkgdGhlIGZhY2UgaW5jbHVkaW5nIGxhcmdlCi0JbnVtYmVyIG9mIGdseXBocyA+IDY0ay4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWNhY2hlOiBGaXggc29tZSBkYXRhIHR5cGVzIG1pc21hdGNoaW5nIHdpdGggdGhlaXIgc291cmNlcy4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKGZ0Y19jYWNoZV9yZXNpemUpOiBUaGUgdHlwZXMgb2YKLQlgcCcsIGBtYXNrJywgYGNvdW50JyBhcmUgbWF0Y2hlZCB3aXRoIEZUQ19DYWNoZS0+e3AsbWFza30uCi0JKEZUQ19DYWNoZV9DbGVhcik6IFRoZSB0eXBlIG9mIGBvbGRfaW5kZXgnIGlzIG1hdGNoZWQgdG8KLQlGVENfQ2FjaGUtPntwLG1hc2t9LgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuaCAoRlRDX0NBQ0hFX0xPT0tVUF9DTVApOiBUaGUgdHlwZQotCW9mIGBfaWR4JyBpcyBtYXRjaGVkIHdpdGggRlRDX0NhY2hlLT57cCxtYXNrfS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWNhY2hlOiBGaXggc29tZSBkYXRhIHR5cGVzIG1pc21hdGNoaW5nIHdpdGggdGhlaXIgc291cmNlcy4KLQotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgKGZ0Y19zbm9kZV9sb2FkKTogVGhlIHR5cGVzCi0Jb2YgYHhhZHZhbmNlJyBhbmQgYHlhZHZhbmNlJyBhcmUgbWF0Y2hlZCB3aXRoCi0JRlRfR2x5cGhTbG90LT5hZHZhbmNlLnt4fHl9LgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JY2FjaGU6IENhc3QgTlVMTCB0byBhIHJlcXVpcmVkIGZ1bmN0aW9uIHR5cGUgZXhwbGljaXRseS4KLQotCSogc3JjL2NhY2hlL2Z0Y21hbmFnLmMgKEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCk6Ci0JSW5zZXJ0IGV4cGxpY2l0IGNhc3QgZnJvbSBOVUxMIHRvIGZ1bmN0aW9uIHR5cGUuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlmdHR5cGVzLmg6IENhc3QgRlRfTUFLRV9UQUcgb3V0cHV0IHRvIEZUX1RhZyBleHBsaWNpdGx5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCAoRlRfTUFLRV9UQUcpOgotCUNhc3QgdGhlIHJlc3VsdCB0byBGVF9UYWcuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlwc25hbWVzOiBIYW5kbGUgVW5pY29kZSBjb2RlcG9pbnRzIGJ5IEZUX1VJbnQzMiB2YXJpYWJsZXMuCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKEJBU0VfR0xZUEgpOiBDYXN0IHRoZSByZXN1bHQKLQl0byB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBmb3IgTFA2NCBwbGF0Zm9ybS4KLQkocHNfdW5pY29kZV92YWx1ZSk6IFJldHVybiB0aGUgdmFsdWUgYnkgdW5zaWduZWQgMzItYml0Ci0JaW50ZWdlciBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlwc2F1eDogVXNlIHNpemVfdCB2YXJpYWJsZSB0byBwYXNzIHRoZSBidWZmZXIgc2l6ZS4KLQotCSogc3JjL3BzYXV4L3BzYXV4LmggKHRvX2J5dGVzKTogVGhlIHR5cGUgb2YgYG1heF9ieXRlcycKLQkodGhlIGFyZ3VtZW50IHRvIHBhc3MgdGhlIGJ1ZmZlciBzaXplKSBpcyBjaGFuZ2VkIHRvCi0Jc2l6ZV90LCB0byBtYXRjaCB3aXRoIEFOU0kgQyBzdHJpbmcgZnVuY3Rpb25zLgotCi0JKiBzcmMvcHNhdXgvcHNjb252LmggKFBTX0NvbnZfU3RyaW5nRGVjb2RlLAotCVBTX0NvbnZfQVNDSUlIZXhEZWNvZGUsIFBTX0NvbnZfRWV4ZWNEZWNvZGUpOiBEaXR0by4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jIChQU19Db252X1N0cmluZ0RlY29kZSwKLQlQU19Db252X0FTQ0lJSGV4RGVjb2RlLCBQU19Db252X0VleGVjRGVjb2RlKTogRGl0dG8uCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuaCAocHNfcGFyc2VyX3RvX2J5dGVzKTogRGl0dG8uCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfcGFyc2VyX3RvX2J5dGVzKTogRGl0dG8uCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQl0eXBlMTogVXNlIHNpemVfdCB2YXJpYWJsZSB0byBwYXNzIHRoZSBzdHJpbmcgbGVuZ3RoLgotCi0JKiBwc2F1eC5oOiBUaGUgdHlwZSBvZiBgbGVuJyAodGhlIGFyZ3VtZW50IHRvIHBhc3MKLQl0aGUgYnVmZmVyIHNpemUgdG8gdGhlIGZ1bmN0aW9uIGluIEFGTV9QYXJzZXJSZWMpCi0JaXMgY2hhbmdlZCB0byBzaXplX3QsIHRvIG1hdGNoIHdpdGggQU5TSSBDIHN0cmluZwotCWZ1bmN0aW9ucy4KLQotCSogdDFhZm0uYyAodDFfZ2V0X2luZGV4KTogRGl0dG8uCi0KLQkqIHRlc3RfYWZtLmMgKGR1bW15X2dldF9pbmRleCk6IERpdHRvLgotCi0JKiBhZm1wYXJzZS5jIChhZm1fcGFyc2VyX3JlYWRfdmFscyk6IFRvIGNhbGwKLQlBRk1fUGFyc2VyUmVjLmdldF9pbmRleCwgdGhlIGxlbmd0aCBvZiB0b2tlbgotCWBsZW4nIGlzIGNhc3QgdG8gc2l6ZV90LgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JY2lkOiBGaXggc29tZSBkYXRhIHR5cGVzIG1pc21hdGNoaW5nIHdpdGggdGhlaXIgc291cmNlcy4KLQotCSogc3JjL2NpZC9jaWRwYXJzZS5jIChjaWRfcGFyc2VyX25ldyk6IFRoZSB0eXBlcyBvZgotCWByZWFkX2xlbicgYW5kIGBzdHJlYW1fbGVuJyBhcmUgbWF0Y2hlZCB0bwotCUZUX1N0cmVhbS0+c2l6ZS4gIFVucmVxdWlyZWQgY2FzdCBpcyByZW1vdmVkLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JY2ZmOiBGaXggZm9yIHVudXNlZCB2YXJpYWJsZSBgcmVzdCcuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX3JlYWwpOiBJbnNlcnQKLQlGVF9VTlVTRUQoKSB0byBoaWRlIHRoZSB1bnVzZWQgdmFyaWFibGUgd2FybmluZy4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWNmZjogRml4IHNvbWUgZGF0YSB0eXBlcyBtaXNtYXRjaGluZyB3aXRoIHRoZWlyIHNvdXJjZXMuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCk6IFRoZSB0eXBlcyBvZgkKLQlgdG9wX3VwbScgYW5kIGBzdWJfdXBtJyBhcmUgbWF0Y2hlZCB3aXRoCi0JQ0ZGX0ZvbnRSZWNEaWN0LT51bml0c19wZXJfZW0uCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfc2l6ZV9zZWxlY3QpOiBEaXR0by4KLQkoY2ZmX3NpemVfcmVxdWVzdCk6IERpdHRvLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JYmRmOiBGaXggc29tZSBkYXRhIHR5cGVzIG1pc21hdGNoaW5nIHdpdGggdGhlaXIgc291cmNlcy4KLQotCSogYmRmbGliLmMgKF9iZGZfbGlzdF9lbnN1cmUpOiBUaGUgdHlwZSBvZiBgbnVtX2l0ZW1zJwotCWlzIG1hdGNoZWQgd2l0aCBfYmRmX2xpc3RfdC51c2VkLiAgQWxzbyB0aGUgdHlwZXMgb2YKLQlgb2xkc2l6ZScsIGBuZXdzaXplJywgYGJpZ3NpemUnIGFyZSBtYXRjaGVkIHRvby4KLQkoX2JkZl9yZWFkc3RyZWFtKTogYGN1cnNvcicgaXMgdXNlZCBhcyBhbiBvZmZzZXQgdG8KLQl0aGUgcG9pbnRlciwgaXQgc2hvdWxkIGJlIHR5cGVkIGFzIEZUX09mZnNldC4gIEFsc28KLQl0aGUgdHlwZXMgb2YgYGJ5dGVzJywgYHN0YXJ0JywgYGVuZCcsIGBhdmFpbCcgYXJlIG1hdGNoZWQuCi0KLQkqIGJkZmRyaXZyLmM6IFRoZSB0eXBlIG9mIEJERl9DTWFwLT5udW1fZW5jb2RpbmdzIGlzCi0JbWF0Y2hlZCB3aXRoIEZUX0NNYXAtPmNsYXp6LT5zaXplLgotCShiZGZfY21hcF9jaGFyX2luZGV4KTogVGhlIHR5cGVzIG9mIGBtaW4nLCBgbWF4JywgYG1pZCcKLQlhcmUgbWF0Y2hlZCB3aXRoIEJERl9DTWFwLT5udW1fZW5jb2RpbmdzLiAgVGhlIHR5cGUgb2YKLQlgcmVzdWx0JyBpcyBtYXRjaGVkIHdpdGggZW5jb2RpbmctPmdseXBoLgotCShiZGZfY21hcF9jaGFyX25leHQpOiBEaXR0bywgdGhlIHR5cGUgb2YgYGNvZGUnIGlzCi0JbWF0Y2hlZCB3aXRoIEJERl9lbmNvZGluZ19lbC5lbmMuCi0JKGJkZl9pbnRlcnByZXRfc3R5bGUpOiBUaGUgdHlwZSBvZiBgbGVuZ3RocycgaXMgY2hhbmdlZAotCXRvIHNpemVfdCwgdG8gdGFrZSB0aGUgdmFsdWUgYnkgZnRfc3RybGVuKCkuICBBbHNvIHRoZQotCXR5cGVzIG9mIGBsZW4nLCBgbm4nLCBgbW0nIGFyZSBtYXRjaGVkLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jc2ZudDogQ291bnQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBvYmplY3QgYnkgcHRyZGlmZl90LgotCi0JKiBzcmMvc2ZudC90dGJkZi5jICh0dF9mYWNlX2ZpbmRfYmRmX3Byb3ApOiBUaGUgdHlwZSBvZgotCWBwcm9wZXJ0eV9sZW4nIGlzIGNoYW5nZWQgZnJvbSBGVF9VSW50IHRvIEZUX09mZnNldCwKLQl0byBtYXRjaCB3aXRoIHNpemVfdCwgd2hpY2ggaXMgYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlCi0Jb2JqZWN0IGluIHRoZSBtZW1vcnkgYnVmZmVyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JbHp3OiBDb3VudCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IG9iamVjdCBieSBwdHJkaWZmX3QuCi0KLQkqIHNyYy9sencvZnR6b3Blbi5oOiBUaGUgdHlwZXMgb2YgRlRfTHp3U3RhdGUtPntidWZfdG90YWwsCi0Jc3RhY2tfc2l6ZX0gYXJlIGNoYW5nZWQgZnJvbSBGVF9VSW50IHRvIEZUX09mZnNldCwgdG8gbWF0Y2gKLQl3aXRoIHNpemVfdCwgd2hpY2ggaXMgYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIG9iamVjdCBpbgotCXRoZSBtZW1vcnkgYnVmZmVyLgotCi0JKiBzcmMvbHp3L2Z0em9wZW4uYyAoZnRfbHp3c3RhdGVfc3RhY2tfZ3Jvdyk6IFRoZSB0eXBlcyBvZgotCWBvbGRfc2l6ZScgYW5kIGBuZXdfc2l6ZScgYXJlIGNoYW5nZWQgZnJvbSBGVF9VSW50IHRvCi0JRlRfT2Zmc2V0LCB0byBtYXRjaCB3aXRoIHNpemVfdCwgd2hpY2ggaXMgYXBwcm9wcmlhdGUgdHlwZQotCWZvciB0aGUgb2JqZWN0IGluIHRoZSBtZW1vcnkgYnVmZmVyLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0Jb3R2YWxpZDogQ291bnQgdGhlIHRhYmxlIHNpemUgb24gbWVtb3J5IGJ5IHB0cmRpZmZfdC4KLQotCSogc3JjL290dmFsaWQvb3R2Z3Bvcy5jIChvdHZfVmFsdWVSZWNvcmRfdmFsaWRhdGUpOgotCUNoYW5nZSB0aGUgdHlwZSBvZiB0YWJsZSBzaXplIGZyb20gRlRfVUludCB0bwotCUZUX1B0ckRpc3QgYmVjYXVzZSBpdCBpcyBjYWxjdWxhdGVkIGJ5IHRoZSBtZW1vcnkKLQlhZGRyZXNzZXMuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlvdHZhbGlkOiBQcmV2ZW50IGFuIG92ZXJmbG93IGJ5IEdQT1MvR1NVQiAzMmItYml0IG9mZnNldC4KLQotCSogc3JjL290dmFsaWQvb3R2Z3Bvcy5jIChvdHZfRXh0ZW5zaW9uUG9zX3ZhbGlkYXRlKToKLQlFeHRlbmQgRXh0ZW5zaW9uT2Zmc2V0IGZyb20gRlRfVUludCB0byBGVF9VTG9uZywgdG8KLQljb3ZlciAzMi1iaXQgb2Zmc2V0IG9uIDE2LWJpdCBwbGF0Zm9ybS4KLQotCSogc3JjL290dmFsaWQvb3R2Z3N1Yi5jIChvdHZfRXh0ZW5zaW9uU3Vic3RfdmFsaWRhdGUpOgotCURpdHRvLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JZnRvYmpzLmM6IFByZXZlbnQgYW4gb3ZlcmZsb3cgaW4gZ2x5cGggaW5kZXggaGFuZGxpbmcuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9GYWNlX0dldENoYXJzT2ZWYXJpYW50KToKLQlJbXByb3ZlIHRoZSBjYXN0IGluIGNvbXBhcmlzb24gdG8gYXZvaWQgdGhlIHRydW5jYXRpb24uCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlJbXByb3ZlIHRoZSB2YXJpYWJsZSB0eXBlcyBpbiByYWNjZXNzX21ha2VfZmlsZV9uYW1lKCkuCi0KLQkqIHNyYy9iYXNlL2Z0cmZvcmsuYyAocmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSk6Ci0JQ2hhbmdlIHRoZSB0eXBlIG9mIGN1cnNvciB2YXJpYWJsZSBgdG1wJyB0byBjb25zdCBjaGFyKiwKLQl0byBwcmV2ZW50IHRoZSB1bmV4cGVjdGVkIG1vZGlmaWNhdGlvbiBvZiBvcmlnaW5hbCBwYXRobmFtZS4KLQkocmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSk6IENoYW5nZSB0aGUgdHlwZSBvZiBuZXdfbGVuZ3RoCi0JdG8gc2l6ZV90LgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JZnRwYXRlbnQuYzogRml4IGZvciB1bnVzZWQgdmFyaWFibGUgYGVycm9yJy4KLQotCSogc3JjL2Jhc2UvZnRwYXRlbnQuYyAoX3R0X2NoZWNrX3BhdGVudHNfaW5fcmFuZ2UpOgotCUZpeCB3YXJuaW5nIGZvciB1bnVzZWQgdmFyaWFibGUgYGVycm9yJy4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCXR5cGUxOiBDaGVjayBpbnZhbGlkIHN0cmluZyBsb25nZXIgdGhhbiBQb3N0U2NyaXB0IGxpbWl0LgotCi0JKiBzcmMvdHlwZTEvdDFhZm0uYyAodDFfZ2V0X2luZGV4KTogQ2hlY2sgaW52YWxpZCBzdHJpbmcKLQl3aGljaCBleGNlZWRzIHRoZSBsaW1pdCBvZiBQb3N0U2NyaXB0IHN0cmluZy9uYW1lIG9iamVjdHMuCi0KLTIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlnemlwOiBVc2UgRlQyIHpjYWxsb2MoKSAmIHpmcmVlKCkgaW4gZnRnemlwLmMgYnkgZGVmYXVsdC4KLQotCSogc3JjL2d6aXAvZnRnemlwLmMgKHpjYWxsb2MsIHpjZnJlZSk6IERpc2FibGUgYWxsCi0JemNhbGxvYygpICYgemZyZWUoKSBieSB6bGliIGluIHp1dGlsLmMsIHRob3NlIGluCi0JZnRnemlwLmMgYnkgRlQyIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBUbyB1c2UKLQl6bGliIHpjYWxsb2MoKSAmIHpmcmVlKCksIGRlZmluZSBVU0VfWkxJQl9aQ0FMTE9DLgotCVNlZSBkaXNjdXNzaW9uOgotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA5LTAyL21zZzAwMDAwLmh0bWwKLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWd6aXA6IERpc3Rpbmd1aXNoIFB1cmVDIGZyb20gVHVyYm9DIG9uIE1TRE9TLgotCi0JKiBzcmMvZ3ppcC96dXRpbC5jICh6Y2FsbG9jLCB6Y2ZyZWUpOiBFbmFibGUgb25seSBmb3IKLQlNU0RPUyBwbGF0Zm9ybS4KLQotMjAwOS0wNy0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWd4dmFsaWQ6IEluc2VydCBQdXJlQyBwcmFnbWEgdG8gYWxsb3cgdW5ldmFsdWF0ZWQgdmFyaWFibGVzLgotCi0JKiBidWlsZHMvYXRhcmkvQVRBUkkuSDogSW5zZXJ0IFB1cmVDIHByYWdtYSBub3QgdG8KLQl3YXJuIGFnYWluc3Qgc2V0LWJ1dC11bmV2YWx1YXRlZCB2YXJpYWJsZSBpbiBneHZhbGlkCi0JbW9kdWxlLgotCi0yMDA5LTA3LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JZ3h2YWxpZDogUGFzcyB0aGUgdW5pb24gYnkgdGhlIHBvaW50ZXIgaW5zdGVhZCBvZiB0aGUgdmFsdWUuCi0KLQkqIHNyYy9neHZhbGlkL2d4dmNvbW1uLmg6Ci0JICAtIERlY2xhcmUgbmV3IHR5cGUgYEdYVl9Mb29rdXBWYWx1ZUNQdHInLgotCSAgLSBVcGRhdGUgdGhlIHR5cGUgb2YgdGhlIDJuZCBhcmd1bWVudCB0byBwYXNzIEdYVl9Mb29rdXBWYWx1ZURlc2MKLQkgICAgZGF0YSB0byB0aGUgZnVuY3Rpb24gcHJvdG90eXBlZCBhcyBHWFZfTG9va3VwX1ZhbHVlX1ZhbGlkYXRlX0Z1bmMsCi0JICAgIGZyb20gR1hWX0xvb2t1cFZhbHVlRGVzYyB0byBHWFZfTG9va3VwVmFsdWVDUHRyLgotCSAgLSBMaWtld2lzZSBmb3IgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZWQgYXMKLQkgICAgR1hWX0xvb2t1cF9GbXQ0X1RyYW5zaXRfRnVuYy4KLQotCSAgLSBEZWNsYXJlIG5ldyB0eXBlIGBHWFZfU3RhdGVUYWJsZV9HbHlwaE9mZnNldENQdHInLgotCSAgLSBVcGRhdGUgdGhlIHR5cGUgb2YgdGhlIDNyZCBhcmd1bWVudCB0byBwYXNzCi0JICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0RGVzYyBkYXRhIHRvIHRoZSBmdW5jdGlvbiBwcm90b3R5cGVkCi0JICAgIGFzIEdYVl9TdGF0ZVRhYmxlX0VudHJ5X1ZhbGlkYXRlX0Z1bmMsIGZyb20KLQkgICAgR1hWX1N0YXRlVGFibGVfR2x5cGhPZmZzZXREZXNjIHRvIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ci4KLQotCSAgLSBEZWNsYXJlIG5ldyB0eXBlIGBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXRDUHRyJy4KLQkgIC0gVXBkYXRlIHRoZSB0eXBlIG9mIHRoZSAzcmQgYXJndW1lbnQgdG8gcGFzcwotCSAgICBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXREZXNjIGRhdGEgdG8gdGhlIGZ1bmN0aW9uIHByb3RvdHlwZWQKLQkgICAgYXMgR1hWX1hTdGF0ZVRhYmxlX0VudHJ5X1ZhbGlkYXRlX0Z1bmMsCi0JICAgIGZyb20gR1hWX1hTdGF0ZVRhYmxlX0dseXBoT2Zmc2V0RGVzYwotCSAgICB0byBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXRDUHRyLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZjb21tbi5jIChneHZfTG9va3VwVGFibGVfZm10MF92YWxpZGF0ZSwKLQlneHZfWENsYXNzVGFibGVfbG9va3VwdmFsX3ZhbGlkYXRlLAotCWd4dl9YQ2xhc3NUYWJsZV9sb29rdXBmbXQ0X3RyYW5zaXQpOgotCVVwZGF0ZSBmcm9tIEdYVl9Mb29rdXBWYWx1ZURlc2MgdG8gR1hWX0xvb2t1cFZhbHVlQ1B0ci4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dmJzbG4uYyAoZ3h2X2JzbG5fTG9va3VwVmFsdWVfdmFsaWRhdGUsCi0JZ3h2X2JzbG5fTG9va3VwRm10NF90cmFuc2l0KTogRGl0dG8uCi0JCi0JKiBzcmMvZ3h2YWxpZC9neHZqdXN0LmMKLQkoZ3h2X2p1c3RfcGNUYWJsZV9Mb29rdXBWYWx1ZV9lbnRyeV92YWxpZGF0ZSwKLQlneHZfanVzdF9jbGFzc1RhYmxlX2VudHJ5X3ZhbGlkYXRlLAotCWd4dl9qdXN0X3dkY1RhYmxlX0xvb2t1cFZhbHVlX3ZhbGlkYXRlKTogRGl0dG8uCi0JCi0JKiBzcmMvZ3h2YWxpZC9neHZrZXJuLmMKLQkoZ3h2X2tlcm5fc3VidGFibGVfZm10MV9lbnRyeV92YWxpZGF0ZSk6IERpdHRvLgotCQotCSogc3JjL2d4dmFsaWQvZ3h2bGNhci5jIChneHZfbGNhcl9Mb29rdXBWYWx1ZV92YWxpZGF0ZSwKLQlneHZfbGNhcl9Mb29rdXBGbXQ0X3RyYW5zaXQpOiBEaXR0by4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dm9wYmQuYyAoZ3h2X29wYmRfTG9va3VwVmFsdWVfdmFsaWRhdGUsCi0JZ3h2X29wYmRfTG9va3VwRm10NF90cmFuc2l0KTogRGl0dG8uCi0JCi0JKiBzcmMvZ3h2YWxpZC9neHZwcm9wLmMgKGd4dl9wcm9wX0xvb2t1cFZhbHVlX3ZhbGlkYXRlLAotCWd4dl9wcm9wX0xvb2t1cEZtdDRfdHJhbnNpdCk6IERpdHRvLgotCQotCSogc3JjL2d4dmFsaWQvZ3h2bW9ydDQuYwotCShneHZfbW9ydF9zdWJ0YWJsZV90eXBlNF9sb29rdXB2YWxfdmFsaWRhdGUpOiBEaXR0by4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQwLmMKLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTBfZW50cnlfdmFsaWRhdGUpOiBVcGRhdGUKLQlmcm9tIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0RGVzYwotCXRvIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ci4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQxLmMKLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfZW50cnlfdmFsaWRhdGUpOiBEaXR0by4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQyLmMKLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTJfZW50cnlfdmFsaWRhdGUpOiBEaXR0by4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQ1LmMKLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTVfZW50cnlfdmFsaWRhdGUpOiBEaXR0by4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dm1vcngyLmMKLQkoZ3h2X21vcnhfc3VidGFibGVfdHlwZTJfZW50cnlfdmFsaWRhdGUpOiBEaXR0by4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dm1vcng1LmMKLQkoZ3h2X21vcnhfc3VidGFibGVfdHlwZTVfZW50cnlfdmFsaWRhdGUpOiBEaXR0by4KLQkKLQkqIHNyYy9neHZhbGlkL2d4dm1vcngxLmMKLQkoZ3h2X21vcnhfc3VidGFibGVfdHlwZTFfZW50cnlfdmFsaWRhdGUpOiBEaXR0by4KLQkoZ3h2X21vcnhfc3VidGFibGVfdHlwZTFfTG9va3VwVmFsdWVfdmFsaWRhdGUsCi0JZ3h2X21vcnhfc3VidGFibGVfdHlwZTFfTG9va3VwRm10NF90cmFuc2l0KToKLQlVcGRhdGUgZnJvbSBHWFZfTG9va3VwVmFsdWVEZXNjIHRvIEdYVl9Mb29rdXBWYWx1ZUNQdHIuCi0JCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J4MC5jCi0JKGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlKTogVXBkYXRlCi0JZnJvbSBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXREZXNjCi0JdG8gR1hWX1hTdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ci4KLQotMjAwOS0wNy0yOSAgRmFicmljZSBCZWxsZXQgIDxmYWJyaWNlQGJlbGxldC5pbmZvPgotCi0JRml4IFJlZGhhdCBidWd6aWxsYSAjNTEzNTgyIGFuZCBTYXZhbm5haCBidWcgIzI2ODQ5LgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuaCAoRlRDX0NBQ0hFX0xPT0tVUF9DTVApIDxGVENfSU5MSU5FPjogRml4Ci0JYWxpYXNpbmcgYnVnLgotCi0yMDA5LTA3LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlEb2N1bWVudCByZWNlbnQgbGlicmFyeSBjaGFuZ2VzLgotCi0JKiBkb2NzL0NIQU5HRVM6IERvIGl0LgotCi0yMDA5LTA3LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyMzc4Ni4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX2luaXRfYnl0ZWNvZGUpOiBEb24ndCByZXNldCB4X3BwZW0KLQlhbmQgeV9wcGVtLiAgT3RoZXJ3aXNlIHRoZSBgKl9DVlRfU3RyZXRjaGVkJyBmdW5jdGlvbnMgaW4gdHRpbnRlcnAuYwotCWdldCBuZXZlciBjYWxsZWQuCi0JQW4gYW5vbnltb3VzIGd1eSBzdWdnZXN0ZWQgdGhpcyBjaGFuZ2Ugb24gU2F2YW5uYWgsIGFuZCBpdCBzZWVtcyB0bwotCWJlIHRoZSByaWdodCBzb2x1dGlvbi4KLQotMjAwOS0wNy0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL3JlbGVhc2U6IFVwZGF0ZWQuCi0KLTIwMDktMDctMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJFQURNRS5DVlMgLT4gUkVBRE1FLmdpdAotCi0JKiBSRUFETUUuQ1ZTOiBSZW5hbWVkIHRvLi4uCi0JKiBSRUFETUUuZ2l0OiBUaGlzLgotCVVwZGF0ZWQuCi0KLTIwMDktMDctMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlCb3JsYW5kIEMrKyBjb21waWxlciBwYXRjaCBwcm9wb3NlZCBieSBNaXJjbyBCYWJpbi4KLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUvMjAwOS0wNy9tc2cwMDAxNi5odG1sLgotCi0JKiBidWlsZHMvZXhwb3J0cy5tazogRGVsZXRlIHVudXNlZCBmbGFncywgQ0NleGVfe0NGTEFHUyxMREZMQUdTfS4KLQlGaXggQVBJTkFNRVNfQyBhbmQgQVBJTkFNRVNfRVhFIHBhdGhuYW1lcyB0byByZWZsZWN0IHRoZSBwbGF0Zm9ybQotCXNwZWNpZmljIHBhdGhuYW1lIHN5bnRheC4KLQkqIGJ1aWxkcy9jb21waWxlci9iY2MubWs6IFJlbW92ZSB1bnVzZWQgZmxhZywgQ0NleGVfTERGTEFHUy4KLQlEZWZpbmUgVEUgPSBgLWUnIHNlcGFyYXRlbHkgKGJjYzMyIGNhbm5vdCBzcGVjaWZ5IHRoZSBwYXRobmFtZSBvZgotCWJpbmFyeSBleGVjdXRhYmxlIGJ5IFQgPSBgLW8nKS4KLQlFeHRlbmQgdGhlIGxhcmdlIHBhZ2Ugc2l6ZSBpbiBsaW5raW5nIGZyZWV0eXBlLmxpYi4KLQlBZGQgZXh0cmEgQ0xFQU4gdGFyZ2V0IHRvIGRlbGV0ZSBiY2Mgc3BlY2lmaWMgdGVtcG9yYXJ5IGZpbGVzLgotCSogYnVpbGRzL2NvbXBpbGVyL2JjYy1kZXYubWs6IERpdHRvLgotCi0yMDA5LTA3LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyNzAyNi4KLQotCSogYnVpbGRzL3dpbjMyL3ZjMjAwNS9mcmVldHlwZS5zbG46IFVzZSBjb3JyZWN0IHZlcnNpb24gbnVtYmVyLgotCi0yMDA5LTA3LTEyICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JQWRkIGEgc2NyaXB0IHRvIGNoZWNrIHRoZSB1bmRlZmluZWQgYW5kIHVudXNlZCB0cmFjZSBtYWNyb3MuCi0KLQkqIHNyYy90b29scy9jaGt0cmNtcC5weTogQSBzY3JpcHQgdG8gY2hlY2sgdHJhY2VfWFhYWCBtYWNyb3MKLQl0aGF0IGFyZSB1c2VkIGluIEMgc291cmNlIGJ1dCB1bmRlZmluZWQgaW4gZnR0cmFjZS5oLCBvcgotCWRlZmluZWQgaW4gZnR0cmFjZS5oIGJ1dCB1bnVzZWQgaW4gQyBzb3VyY2VzLiAgU2VlCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMDktMDcvbXNnMDAwMTMuaHRtbC4KLQkqIGRvY3MvREVCVUc6IE1lbnRpb24gb24gY2hrdHJjbXAucHkuCi0JKiBkb2NzL3JlbGVhc2U6IERpdHRvLgotCi0yMDA5LTA3LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZnRyYXN0ZXJdIE1ha2UgaXQgY29tcGlsZSBhZ2FpbiB3aXRoIC1EX1NUQU5EQUxPTkVfLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgW19TVEFOREFMT05FX106IERlZmluZQotCUZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0guCi0JSW5jbHVkZSBgc3RyaW5nLmgnLgotCURvbid0IGluY2x1ZGUgYHJhc3RwaWMuaCcuCi0JRGVmaW5lIEZUX0RFRklORV9SQVNURVJfRlVOQ1MuCi0KLTIwMDktMDctMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlzbW9vdGg6IENoZWNrIGdseXBoIHNpemUgYnkgd2lkdGgvaGVpZ2h0LCBpbnN0ZWFkIG9mIHBpdGNoL2hlaWdodC4KLQlTdWdnZXN0ZWQgYnkgZGVyIE1vdXNlIDxtb3VzZUBSb2RlbnRzLU1vbnRyZWFsLk9SRz4uCi0KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogSW1wcm92ZQotCXRoZSBjaGVjayBmb3IgdG9vIGxhcmdlIGdseXBoLiAgUmVwbGFjZSB0aGUgcGFpciBvZiBgcGl0Y2gnIGFuZAotCWBoZWlnaHQnIGJ5IHRoZSBwYWlyIG9mIGB3aWR0aCcgYW5kIGBoZWlnaHQnLiAgYHBpdGNoJyBjYW5ub3QKLQliZSBncmVhdGVyIHRoYW4gYGhlaWdodCcuICBUaGUgcmVxdWlyZWQgaXMgY2hlY2tpbmcgdGhlIHByb2R1Y3QKLQlgcGl0Y2gnICogYGhlaWdodCcgPD0gRlRfVUxPTkdfTUFYLCBidXQgd2UgdXNlIGNoZWFwIGNoZWNrcyBmb3IKLQl0aGUgcmVhbGlzdGljIGNhc2Ugb25seS4KLQotMjAwOS0wNy0wOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVJlZ2lzdGVyIDIgbWlzc2luZyB0cmFjZSBjb21wb25lbnRzLCB0MWFmbSBhbmQgdHRiZGYuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGQgRlRfVFJBQ0VfREVGKCB0MWFmbSApCi0JYW5kIEZUX1RSQUNFX0RFRiggdHRiZGYgKS4gIFNlZQotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA5LTA3L21zZzAwMDEzLmh0bWwKLQotMjAwOS0wNy0wOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVJlZ2lzdGVyIGEgdHJhY2UgY29tcG9uZW50IGZvciBmdGdsb2Fkci5jLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogQWRkIEZUX1RSQUNFX0RFRiggZ2xvYWRlciApLgotCVRoZSBtYWNybyBgdHJhY2VfZ2xvYWRlcicgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGUgaW5pdGlhbCB2ZXJzaW9uCi0Jb24gMjAwMi0wMi0yNC4KLQotMjAwOS0wNy0wOCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVByZXZlbnQgdGhlIG92ZXJmbG93cyBieSBhIGdseXBoIHdpdGggdG9vIG1hbnkgcG9pbnRzIG9yIGNvbnRvdXJzLgotCVRoZSBidWcgaXMgcmVwb3J0ZWQgYnkgQm9yaXMgTGV0b2NoYSA8Yi5sZXRvY2hhQGdtYy5uZXQ+LiAgU2VlCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMDktMDYvbXNnMDAwMzEuaHRtbAotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA5LTA3L21zZzAwMDAyLmh0bWwJCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oIChGVF9PVVRMSU5FX0NPTlRPVVJTX01BWCwKLQlGVF9PVVRMSU5FX1BPSU5UU19NQVgpOiBOZXcgbWFjcm9zIHRvIGRlY2xhcmUgdGhlIG1heGltdW0KLQl2YWx1ZXMgb2YgRlRfT3V0bGluZS57bl9jb250b3VycyxuX3BvaW50c30uCi0JKiBzcmMvYmFzZS9mdGdsb2Fkci5jIChGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyk6IENoZWNrIHRoZQotCXRvdGFsIG51bWJlcnMgb2YgcG9pbnRzIGFuZCBjb250b3VycyBjYXVzZSBubyBvdmVyZmxvd3MgaW4KLQlGVF9PdXRsaW5lLntuX2NvbnRvdXJzLG5fcG9pbnRzfS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oIChGVF9HTFlQSExPQURFUl9DSEVDS19QLAotCUZUX0dMWVBITE9BREVSX0NIRUNLX0MpOiBDb21wYXJlIHRoZSBudW1iZXJzIG9mIHBvaW50cyBhbmQKLQljb250b3VycyBhcyB1bnNpZ25lZCBsb25nIG51bWJlciwgaW5zdGVhZCBvZiBzaWduZWQgaW50LCB0bwotCXByZXZlbnQgdGhlIG92ZXJmbG93cyBvbiAxNi1iaXQgc3lzdGVtcy4KLQotMjAwOS0wNy0wNSAgQnJhbSBUYXNzeW5zICA8YnJhbXRAZW5mb2N1cy5iZT4KLQotCUltcHJvdmUgY29tcGF0aWJpbGl0eSB0byBBY3JvcmVhZC4KLQlUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMjY5NDQuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfY2hhcnNldF9jb21wdXRlX2NpZHMpOiBGb3IgbXVsdGlwbGUgR0lEIHRvCi0Jc2luZ2xlIENJRCBtYXBwaW5ncywgbWFrZSB0aGUgbG93ZXN0IHZhbHVlIHdpbi4KLQotMjAwOS0wNi0yOCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWZ0cGF0ZW50OiBGaXggYSBidWcgYnkgd3JvbmcgdXNhZ2Ugb2Ygc2VydmljZS0+dGFibGVfaW5mbygpLgotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA4LTEyL21zZzAwMDM5Lmh0bWwKLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaDogRXh0ZW5kCi0JRlRfU0ZOVF9UYWJsZUluZm9GdW5jKCkgdG8gdGFrZSBuZXcgYXJndW1lbnQgdG8gb2J0YWluIHRoZSBvZmZzZXQKLQl0byB0aGUgc3BlY2lmaWVkIHRhYmxlLgotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF90YWJsZV9pbmZvKTogRXh0ZW5kIHRvIHJldHVybiB0aGUKLQl0YWJsZS1vZmZzZXQgdG8gdGhlIGNhbGxlciBmdW5jdGlvbi4KLQkqIHNyYy9iYXNlL2Z0cGF0ZW50LmMgKF90dF9jaGVja19wYXRlbnRzX2luX3RhYmxlKTogVXNlIG5ldwotCXNlcnZpY2UtPnRhYmxlX2luZm8oKS4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZm50X1RhYmxlX0luZm8pOiBTeW5jaHJvbml6ZSB0byBuZXcKLQlzZXJ2aWNlLT50YWJsZV9pbmZvKCkuCi0KLTIwMDktMDYtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eCwgY2ZmXSBQcm90ZWN0IGFnYWluc3QgbmVzdGVkIGBzZWFjJyBjYWxscy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9EZWNvZGVyKSwgc3JjL2NmZi9jZmZnbG9hZC5oCi0JKENGRl9EZWNvZGVyKTogQWRkIGBzZWFjJyBib29sZWFuIHZhcmlhYmxlLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9vcGVyYXRvcl9zZWFjKSwgc3JjL3BzYXV4L3QxZGVjb2RlLmMKLQkodDFvcGVyYXRvcl9zZWFjKTogVXNlIGl0LgotCi0yMDA5LTA2LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlUaGlua28uCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MW9wZXJhdG9yX3NlYWMpCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdOiBUZXN0IGZvciBleGlzdGVuY2Ugb2YgaW5jcmVtZW50YWwKLQlpbnRlcmZhY2UuCi0KLTIwMDktMDYtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZGV2ZWwvZnRvcHRpb24uaCBbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IERlZmluZS4KLQotMjAwOS0wNi0yNyAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUFkZCB0b29scyB0byBwcmVwcm9jZXNzIHRoZSBzb3VyY2UgZmlsZXMgZm9yIEF0YXJpU1QgUHVyZUMuCi0KLQkqIGJ1aWxkcy9hdGFyaS9kZWZsaW5lam9pbmVyLmF3azogTmV3IGZpbGUgdG8gZmlsdGVyIEMgc291cmNlIGZpbGVzCi0JZm9yIGJyb2tlbiBDIHByZXByb2Nlc3NvciBvZiBQdXJlQyBjb21waWxlci4KLQotCSogYnVpbGRzL2F0YXJpL2dlbi1wdXJlYy1wYXRjaC5zaDogTmV3IGZpbGUgdG8gZ2VuZXJhdGUgYSBwYXRjaCBzZXQKLQlmb3IgUHVyZUMsIGJ5IHVzaW5nIGRlZmxpbmVqb2luZXIuYXdrLgotCi0yMDA5LTA2LTI3ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JS2VlcCBleGlzdGluZyBtb2R1bGVzLmNmZyBpbiB0aGUgYnVpbGRpbmcgdHJlZS4KLQotCSogY29uZmlndXJlOiBJZiBgY29uZmlndXJlJyBpcyBleGVjdXRlZCBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgdHJlZSwKLQlhbiBleGlzdGluZyBgbW9kdWxlcy5jZmcnIGZpbGUgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBzaG91bGQgYmUKLQlrZXB0LCBub3Qgb3ZlcndyaXR0ZW4gYnkgdGhlIHZlcnNpb24gaW4gdGhlIHNvdXJjZSB0cmVlLgotCi0yMDA5LTA2LTI3ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JRmlsdGVyIC0tc3JjZGlyPSBvcHRpb24gYmVmb3JlIGludm9raW5nIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS4KLQotCSogY29uZmlndXJlOiBJZiBidWlsZHMvdW5peC9jb25maWd1cmUgaXMgaW52b2tlZCB3aXRoIC0tc3JjZGlyCi0Jb3B0aW9uLCB0aGUgb3B0aW9uIHNob3VsZCB0YWtlIGBidWlsZHMvdW5peCcgZGlyZWN0b3J5IGluc3RlYWQgb2YKLQl0aGUgdG9wIHNvdXJjZSBkaXJlY3RvcnkuICBUaHVzIHRoZSBjb25maWd1cmUgc2NyaXB0IGluIHRoZSB0b3AKLQlkaXJlY3Rvcnkgc2hvdWxkIG1vZGlmeSB0aGUgLS1zcmNkaXI9IG9wdGlvbiBpZgotCWBidWlsZHMvdW5peC9jb25maWd1cmUnIGlzIGludm9rZWQuCi0KLTIwMDktMDYtMjcgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlJbXByb3ZlIGNvbmZpZ3VyZS5yYXcgZm9yIGNyb3NzLWJ1aWxkaW5nIG9uIGV4ZS1zdWZmaXhlZCBzeXN0ZW1zLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBGaXggYSBidWcgaW4gc2VkIHNjcmlwdCB0byBleHRyYWN0Ci0JbmF0aXZlIHN1ZmZpeCBmb3IgYmluYXJ5IGV4ZWN1dGFibGVzLCBwYXRjaCBieSBQZXRlciBCcmVpdGVubG9obmVyLgotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA5LTA0L21zZzAwMDM2Lmh0bWwKLQotMjAwOS0wNi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBSZW1vdmUgVFRfU3ViR2x5cGhSZWMuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuaCAoVFRfU3ViR2x5cGhSZWMpOiBSZW1vdmVkLCB1bnVzZWQuCi0KLTIwMDktMDYtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogKi8qOiBGb3Igd2FybmluZyBtZXNzYWdlcywgcmVwbGFjZSBGVF9FUlJPUiB3aXRoIEZUX1RSQUNFMC4KLQotCUZUX0VSUk9SIGlzIG5vdyB1c2VkIG9ubHkgaWYgYSBmdW5jdGlvbiBwcm9kdWNlcyBhIG5vbi16ZXJvIGBlcnJvcicKLQl2YWx1ZS4KLQotCUZvcm1hdHRpbmcsIGltcHJvdmluZyBhbmQgaGFybW9uaXppbmcgZGVidWcgc3RyaW5ncy4KLQotMjAwOS0wNi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGJldHRlci4KLQotCSogc3JjL2Jhc2UvZnRpbml0LmMgKEZUX0luaXRfRnJlZVR5cGUpOiBEb24ndCBzZXQgdmVyc2lvbiBoZXJlCi0JYnV0Li4uCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTmV3X0xpYnJhcnkpOiBIZXJlLgotCi0yMDA5LTA2LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlVc2UgMTYuMTYgZm9ybWF0IHdoaWxlIHBhcnNpbmcgVHlwZSAxIGNoYXJzdHJpbmdzLgotCVRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMyNjg2Ny4KLQotCVByZXZpb3VzbHksIG9ubHkgaW50ZWdlcnMgaGF2ZSBiZWVuIHVzZWQgd2hpY2ggY2FuIGxlYWQgdG8gc2VyaW91cwotCXJvdW5kaW5nIGVycm9ycy4KLQotCUhvd2V2ZXIsIGZyYWN0aW9uYWwgdmFsdWVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseTsgYWZ0ZXIgdGhlCi0JY2hhcnN0cmluZ3MgKG9mIGVpdGhlciBUeXBlIDEgb3IgMikgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgdGhlCi0JcmVzdWx0aW5nIGNvb3JkaW5hdGVzIGdldCByb3VuZGVkIHRvIGludGVnZXJzIGN1cnJlbnRseSAtLSBiZWZvcmUKLQlhcHBseWluZyBzY2FsaW5nLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQ7IGF0IHRoZSBzYW1lIHRpbWUgYSBuZXcgbG9hZAotCWZsYWcgc2hvdWxkIGJlIGludHJvZHVjZWQsIHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAotCUZUX0xPQURfTk9fU0NBTEUsIHdoaWNoIGluZGljYXRlcyB0aGF0IGZvbnQgdW5pdHMgYXJlIHJldHVybmVkIGluCi0JMTYuMTYgZm9ybWF0LiAgU2ltaWxhcmx5LCB0aGUgaW5jcmVtZW50YWwgaW50ZXJmYWNlIHNob3VsZCBiZQotCWV4dGVuZGVkIHRvIGFsbG93IGZyYWN0aW9uYWwgdmFsdWVzIGZvciBtZXRyaWNzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX0J1aWxkZXJSZWMpOiBSZW1vdmUgYHNoaWZ0JwotCWZpZWxkLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmggKFQxX0hpbnRzX1NldFN0ZW1GdW5jLAotCVQxX0hpbnRzX1NldFN0ZW0zRnVuYyk6IFVzZSBGVF9GaXhlZCBmb3IgY29vcmRpbmF0ZXMuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0guCi0JKHQxX2J1aWxkX2FkZF9wb2ludCk6IEFsd2F5cyBjb252ZXJ0IGZpeGVkIHRvIGludGVnZXIuCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6Ci0JVXNlIDE2LjE2IGZvcm1hdCBldmVyeXdoZXJlIChleGNlcHQgZm9yIGxhcmdlIGludGVnZXJzIGZvbGxvd2VkIGJ5IGEKLQlgZGl2JykuCi0JW0NBTl9IQU5ETEVfTk9OX0lOVEVHUkFMX1QxX09QRVJBTkRTXTogUmVtb3ZlICNpZmRlZiBhbmQgYWN0aXZhdGUKLQljb2RlIHVuY29uZGl0aW9uYWxseS4KLQlBZGQgc3VwcG9ydCBmb3IgcmFuZG9tIG51bWJlcnMgYW5kIHVwZGF0ZSByZW1haW5pbmcgY29kZQotCWFjY29yZGluZ2x5OyB0aGlzIHNob3VsZCB3b3JrIG5vdy4KLQkodDFvcGVyYXRvcl9zZWFjKTogVXBkYXRlZC4KLQkqIHNyYy9wc2F1eC9wc2hyZWMuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0guCi0JKHBzX2hpbnRzX3Qxc3RlbTMsIHQxX2hpbnRzX3N0ZW0pOiBVcGRhdGVkLgotCi0JKiBzcmMvY2lkL2NpZGdsb2FkLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ILgotCShjaWRfbG9hZF9nbHlwaCkgW0ZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUxdLAotCShjaWRfZmFjZV9jb21wdXRlX21heF9hZHZhbmNlLCBjaWRfc2xvdF9sb2FkX2dseXBoKTogVXBkYXRlZC4KLQotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZykKLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF0sIChUMV9HZXRfQWR2YW5jZXMsIFQxX0xvYWRfR2x5cGgpOgotCVVwZGF0ZWQuCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ILgotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0luaXQpOiBVcGRhdGVkLgotCi0yMDA5LTA2LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2hpbnRlci9wc2hyZWMuYzogVXNlIFBTSF9FcnJfT2suCi0KLTIwMDktMDYtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUNvZGUgYmVhdXRpZmljYXRpb24uCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoRlRfSU5UX1RPX0ZJWEVEKTogUmVtb3ZlZC4KLQlSZXBsYWNlIGV2ZXJ5d2hlcmUgd2l0aCBJTlRfVE9fRklYRUQuCi0JKEZUX0ZJWEVEX1RPX0lOVCk6IE1vdmUgdG8gLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIChGSVhFRF9UT19JTlQpOiBIZXJlLgotCVVwZGF0ZSBhbGwgdXNlcnMuCi0KLTIwMDktMDYtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX0J1aWxkZXJSZWMpLAotCXNyYy9jZmYvY2ZmZ2xvYWQuaCAoQ0ZGX0J1aWxkZXIpOiBSZW1vdmUgYGxhc3QnLgotCVVwZGF0ZSBhbGwgdXNlcnMuCi0KLTIwMDktMDYtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eF0gQ2hlY2sgbGFyZ2UgaW50ZWdlcnMgd2hpbGUgcGFyc2luZyBjaGFyc3RyaW5ncy4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBMYXJnZQotCWludGVnZXJzIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBgZGl2JyBvcGVyYXRvci4KLQotMjAwOS0wNi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gUmV2ZXJ0IGxhc3QgY2hhbmdlLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogRG8gaXQuCi0JTmV4dCB0aW1lLCBkb24ndCBjb25mdXNlIFR5cGUgMiBjaGFyc3RyaW5nIG9wY29kZXMgd2l0aCBUT1AgRElDVAotCXZhbHVlcy4uLgotCi0yMDA5LTA2LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19jaGVja19kaWdpdHMpOiBGaXgKLQljb21waWxlciB3YXJuaW5nLgotCi0yMDA5LTA2LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9jb21waWxlci9nY2MubWsgKENGTEFHUyk6IFVzZSAtTzMsIG5vdCAtTzYuCi0KLTIwMDktMDYtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBoYW5kbGluZyBvZiByZXNlcnZlZCBieXRlIDB4RkYuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBBYm9ydCBpZiBieXRlCi0JMHhGRiBpcyBlbmNvdW50ZXJlZC4KLQotMjAwOS0wNi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSW1wcm92ZSBkZWJ1ZyBtZXNzYWdlcyBmb3IgVHlwZTEgY2hhcnN0cmluZ3MuCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogRW1pdCBuZXdsaW5lcwotCWFmdGVyIGluc3RydWN0aW9ucy4KLQlQcmV0dGlmeSBvdXRwdXQuCi0KLTIwMDktMDYtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1vcmUgZnRncmF5IGZpeGVzIGZvciBGVF9TVEFUSUNfUkFTVEVSLgotCVByb2JsZW1zIHJlcG9ydGVkIGJ5IHN1eXVAY29vZWUuY24uCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X21vdmVfdG8sIGdyYXlfcmFzdGVyX3JlbmRlcik6IFVzZQotCVJBU19WQVIuCi0KLTIwMDktMDYtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA5LTA2LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggQi9XIHJhc3Rlcml6YXRpb24gb2Ygc3ViZ2x5cGhzIHdpdGggZGlmZmVyZW50IGRyb3Atb3V0IG1vZGVzLgotCi0JTm9ybWFsbHksIHRoZSBTQ0FOTU9ERSBpbnN0cnVjdGlvbiAoaWYgcHJlc2VudCkgdG8gc2V0IHRoZSBkcm9wLW91dAotCW1vZGUgaW4gYSBUcnVlVHlwZSBmb250IGlzIGxvY2F0ZWQgaW4gdGhlIGBwcmVwJyB0YWJsZSBvbmx5IGFuZCB0aHVzCi0JdmFsaWQgZm9yIGFsbCBnbHlwaHMuICBIb3dldmVyLCB0aGVyZSBhcmUgZm9udHMgbGlrZSBgcGFsYS50dGYnCi0Jd2hpY2ggYWRkaXRpb25hbGx5IGNvbnRhaW4gdGhpcyBpbnN0cnVjdGlvbiBpbiB0aGUgaGludGluZyBjb2RlIG9mCi0Jc29tZSBnbHlwaHMgKGJ1dCBub3QgYWxsKS4gIEFzIGEgcmVzdWx0IGl0IGNhbiBoYXBwZW4gdGhhdCBhCi0JY29tcG9zaXRlIGdseXBoIG5lZWRzIG11bHRpcGxlIGRyb3Atb3V0IG1vZGVzIGZvciBpdHMgc3ViZ2x5cGhzCi0Jc2luY2UgdGhlIHJlbmRlcmluZyBzdGF0ZSBnZXRzIHJlc2V0IGZvciBlYWNoIHN1YmdseXBoLgotCi0JRnJlZVR5cGUgY29sbGVjdHMgdGhlIGhpbnRlZCBvdXRsaW5lcyBmcm9tIGFsbCBzdWJnbHlwaHMsIHRoZW4gaXQKLQlzZW5kcyB0aGUgZGF0YSB0byB0aGUgcmFzdGVyaXplci4gIEl0IGFsc28gc2VuZHMgdGhlIGRyb3Atb3V0IG1vZGUKLQktLSBhZnRlciBoaW50aW5nIGhhcyBiZWVuIGFwcGxpZWQgLS0gYW5kIGhlcmUgaXMgdGhlIGVycm9yOiBJdCBzZW5kcwotCXRoZSBkcm9wLW91dCBtb2RlIG9mIHRoZSBsYXN0IHN1YmdseXBoIG9ubHk7IGRyb3Atb3V0IG1vZGVzIG9mIGFsbAotCW90aGVyIHN1YmdseXBocyBhcmUgbG9zdC4KLQotCVRoaXMgcGF0Y2ggZml4ZXMgdGhlIHByb2JsZW07IGl0IGFkZHMgYSBzZWNvbmQsIGFsdGVybmF0aXZlCi0JbWVjaGFuaXNtIHRvIHBhc3MgdGhlIGRyb3Atb3V0IG1vZGU6IEZvciBlYWNoIGNvbnRvdXIsIHRoZQotCXJhc3Rlcml6ZXIgbm93IGNoZWNrcyB0aGUgZmlyc3QgYHRhZ3MnIGFycmF5IGVsZW1lbnQuICBJZiBiaXQgMiBpcwotCXNldCwgYml0cyA1LTcgY29udGFpbiB0aGUgY29udG91cidzIGRyb3Atb3V0IG1vZGUsIG92ZXJyaWRpbmcgdGhlCi0JZ2xvYmFsIGRyb3Atb3V0IG1vZGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oIChGVF9DVVJWRV9UQUdfSEFTX1NDQU5NT0RFKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9IaW50X0dseXBoKTogU3RvcmUgZHJvcC1vdXQgbW9kZSBpbgotCWB0YWdzWzBdJy4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChGbG93X1VwLCBPdmVyc2hvb3RfVG9wLCBPdmVyc2hvb3RfQm90dG9tKToKLQlVc2UgYml0cyAzLTUgaW5zdGVhZCBvZiAwLTIuCi0JKE5ld19Qcm9maWxlKTogU2V0IHRoZSBkcm9wLW91dCBtb2RlIGluIHRoZSBwcm9maWxlJ3MgYGZsYWdzJyBmaWVsZC4KLQkoRGVjb21wb3NlX0N1cnZlKTogQ2hlY2sgYHRhZ3NbMF0nIGFuZCBzZXQgYGRyb3BPdXRDb250cm9sJyBpZgotCW5lY2Vzc2FyeS4KLQkoVmVydGljYWxfU3dlZXBfRHJvcCwgSG9yaXpvbnRhbF9Td2VlcF9Ecm9wLAotCUhvcml6b250YWxfR3JheV9Td2VlcF9Ecm9wLCBEcmF3X1N3ZWVwKTogVXNlIHRoZSBwcm9maWxlJ3MgZHJvcC1vdXQKLQltb2RlLgotCi0yMDA5LTA2LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlJbXByb3ZlIHNjYW4gY29udmVyc2lvbiBydWxlcyA0IGFuZCA2LgotCi0JVHdvIG5ldyBjb25zdHJhaW50cyBhcmUgaW50cm9kdWNlZCB0byBiZXR0ZXIgaWRlbnRpZnkgYSBgc3R1YicgLS0gYQotCWNvbmNlcHQgd2hpY2ggaXMgb25seSB2YWd1ZWx5IGRlc2NyaWJlZCBpbiB0aGUgT3BlblR5cGUKLQlzcGVjaWZpY2F0aW9uLiAgVGhlIG9sZCBjb2RlIHdhcyB0b28gcmlnb3JvdXMgYW5kIHN1cHByZXNzZWQgbW9yZQotCXBpeGVsIHRoYW4gaXQgc2hvdWxkLgotCi0JICAuIFRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBwcm9maWxlcyB3aXRoIHRoZSBzY2FubGluZSBpcyBsZXNzCi0JICAgIHRoYW4gYSBoYWxmIHBpeGVsLiAgQ29kZSByZWxhdGVkIHRvIHRoaXMgd2FzIGFscmVhZHkgcHJlc2VudCBpbgotCSAgICB0aGUgc291cmNlcyBidXQgaGFzIGJlZW4gY29tbWVudGVkIG91dC4KLQotCSAgLiBUaGUgZW5kcG9pbnQgb2YgdGhlIG9yaWdpbmFsIGNvbnRvdXIgZm9ybWluZyBhIHByb2ZpbGUgaGFzIGEKLQkgICAgZGlzdGFuY2UgKGBvdmVyc2hvb3QnKSBsZXNzIHRoYW4gaGFsZiBhIHBpeGVsIHRvIHRoZSBzY2FubGluZS4KLQotCU5vdGUgdGhhdCB0aGUgdHdvIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBmaXggYWxtb3N0IGFsbCBkaWZmZXJlbmNlcwotCXRvIHRoZSBXaW5kb3dzIHJhc3Rlcml6ZXIsIGJ1dCBzb21lIHByb2JsZW1hdGljIGNhc2VzIHJlbWFpbi4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChPdmVyc2hvb3RfVG9wLCBPdmVyc2hvb3RfQm90dG9tKTogTmV3Ci0JbWFjcm9zIGZvciB0aGUgYGZsYWdzJyBmaWVsZCBpbiB0aGUgYFRQcm9maWxlJyBzdHJ1Y3R1cmUuCi0JKElTX0JPVFRPTV9PVkVSU0hPT1QsIElTX1RPUF9PVkVSU0hPT1QpOiBOZXcgbWFjcm9zLgotCShOZXdfUHJvZmlsZSwgRW5kX1Byb2ZpbGUpOiBQYXNzIG92ZXJzaG9vdCBmbGFnIGFzIGFuIGFyZ3VtZW50IGFuZAotCXNldCBpdCBhY2NvcmRpbmdseS4KLQlVcGRhdGUgY2FsbGVycy4KLQkoVmVydGljYWxfU3dlZXBfRHJvcCwgSG9yaXpvbnRhbF9Td2VlcF9Ecm9wKTogSW1wbGVtZW50IHRoZSB0d28gbmV3Ci0JY29uc3RyYWludHMuCi0KLTIwMDktMDYtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUluY3JlYXNlIHByZWNpc2lvbiBmb3IgQi9XIHJhc3Rlcml6ZXIuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoU2V0X0hpZ2hfUHJlY2lzaW9uKTogQWRkIHR3byBtb3JlIGJpdHMgdG8KLQl0aGUgcHJlY2lzaW9uLiAgVGhpcyBjb3JyZWN0cyByZW5kZXJpbmcgb2Ygc29tZSBzbWFsbCBnbHlwaHMsIGZvcgotCWV4YW1wbGUsIGdseXBoIGB4aScgaW4gdmVyZGFuYS50dGYgYXQgMTMgcHBlbS4gIFRlc3Rpbmcgd2l0aCBmdGJlbmNoCi0Jb24gbXkgR05VL0xpbnV4IGJveCBJIGRvbid0IHNlZSBhIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLgotCi0yMDA5LTA2LTA4ICBNaWNoYWVsIFp1Y2NoaSAgPG5vdHplZEBnbWFpbC5jb20+Ci0KLQlIYW5kbGUgRlRfU1RST0tFUl9MSU5FQ0FQX0JVVFQuCi0JVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzI2NzU3LgotCi0JKiBzcmMvYmFzZS9mdHN0cm9rZS5jIChmdF9zdHJva2VyX2NhcCk6IEltcGxlbWVudCBpdC4KLQotMjAwOS0wNi0wNyAgSGFyYWxkIEZlcm5lbmdlbCAgPGhhcnJ5QGtkZXZlbG9wLm9yZz4KLQotCUZpeCBzb21lIHBvdGVudGlhbCBvdXQtb2YtbWVtb3J5IGNyYXNoZXMuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfZG9uZSk6IENoZWNrIGBzbG90LT5pbnRlcm5hbCcuCi0JKiBzcmMvYmFzZS9mdHN0cmVhbS5jIChGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKTogQ2hlY2sgYHN0cmVhbScuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfTmV3X0NvbnRleHQpOiBBdm9pZCBkb3VibGUtZnJlZSBvZgotCWBleGVjJyBpbiBjYXNlIG9mIGZhaWx1cmUuCi0KLTIwMDktMDYtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVNpbXBsaWZ5IG1hdGguCi0JU3VnZ2VzdGVkIGJ5IEFsZXhlaSBQb2R0ZWxlemhuaWtvdiA8YXBvZHRlbGVAZ21haWwuY29tPi4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChWZXJ0aWNhbF9Td2VlcF9Ecm9wLCBIb3Jpem9udGFsX1N3ZWVwX0Ryb3AsCi0JSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX0Ryb3ApOiBEbyBpdC4KLQotMjAwOS0wNi0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUHJlcGFyYXRpb24gZm9yIGZpeGluZyBzY2FuIGNvbnZlcnNpb24gcnVsZXMgNCBhbmQgNi4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChURmxvdyk6IFJlcGxhY2UgZW51bWVyYXRpb24gd2l0aC4uLgotCShGbG93X1VwKTogVGhpcyBtYWNyby4KLQkoVFByb2ZpbGUpOiBSZXBsYWNlIGBmbG93JyBtZW1iZXIgd2l0aCBgZmxhZ3MnIGJpdCBmaWVsZC4KLQlVcGRhdGUgYWxsIGFmZmVjdGVkIGNvZGUuCi0KLTIwMDktMDUtMjkgIEphbWVzIENsb29zICA8Y2xvb3NAamhjbG9vcy5jb20+Ci0KLQlFbmFibGUgYXV0b2hpbnRpbmcgZm9yIGdseXBocyByb3RhdGVkIGJ5IG11bHRpcGxlcyBvZiA5MMKwLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IEFsdGVyIGNoZWNrIGZvciBwZXJtaXR0ZWQKLQltYXRyaWNlcyB0byBhbGxvdyByb3RhdGlvbnMgYnkgbXVsdGlwbGVzIG9mIDkwwrAsIG5vdCBvbmx5IHVucm90YXRlZCwKLQlwb3NzaWJseSBzbGFudGVkIG1hdHJpY2VzLgotCi0yMDA5LTA1LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZW1vdmUgY29tcGlsZXIgd2FybmluZy4KLQlSZXBvcnRlZCBieSBLcnp5c3p0b2YgS293YWxjenlrIDxra293YWxjenlrQGdtYWlsLmNvbT4uCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4yLmMgKGFmX2xhdGluMl9oaW50X2VkZ2VzKTogTW92ZSBkZWNsYXJhdGlvbiBvZgotCWBuX2VkZ2VzJyBpbnRvIGAjaWYnIGJsb2NrLgotCi0yMDA5LTA1LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNYWtlIGNvbXBpbGF0aW9uIHdvcmsgd2l0aCBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCIG5vdCBkZWZpbmVkLgotCVJlcG9ydGVkIGJ5IEtyenlzenRvZiBLb3dhbGN6eWsgPGtrb3dhbGN6eWtAZ21haWwuY29tPi4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfRmFjZV9Jbml0KSBbIUZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUJdOgotCU1ha2UgaXQgd29yay4KLQlTaW1wbGlmeSAjaWZkZWYgbG9naWMuCi0KLTIwMDktMDUtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUltcHJvdmUgYi93IHJhc3Rlcml6ZXIuCi0JUHJvYmxlbSByZXBvcnRlZCBieSBLcnp5c3p0b2YgS290bGVuZ2EgPHBvY2VrQHVzZXJzLnNmLm5ldD4uCi0KLQkqIHNyYy9yYXN0ZXIvcmFzdGVyLmMgKFZlcnRpY2FsX1N3ZWVwX0Ryb3AsIEhvcml6b250YWxfU3dlZXBfRHJvcCwKLQlIb3Jpem9udGFsX0dyYXlfU3dlZXBfRHJvcCk6IEZvciBzbWFydCBkcm9wLW91dCBtb2RlLCBpZgotCWludGVyc2VjdGlvbnMgYXJlIGVxdWFsbHkgZGlzdGFudCByZWxhdGl2ZSB0byBuZXh0IHBpeGVsIGNlbnRlciwKLQlzZWxlY3QgdGhlIGxlZnQgcGl4ZWwsIG5vdCB0aGUgcmlnaHQgb25lLgotCi0yMDA5LTA1LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyNjYwMC4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfbG9hZF9rZXl3b3JkKTogSGFuZGxlCi0JVDFfRklFTERfTE9DQVRJT05fRk9OVF9FWFRSQS4KLQotMjAwOS0wNC0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRG9jdW1lbnQgcmVjZW50IGNoYW5nZXMgdG8gZnR2aWV3LgotCi0JKiBkb2NzL0NIQU5HRVM6IERvIGl0LgotCi0yMDA5LTA0LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlhdXRvaGludGVyOiBEb24ndCBjaGFuZ2UgZGlnaXQgd2lkdGhzIGlmIGFsbCB3aWR0aHMgYXJlIHRoZSBzYW1lLgotCVRoaXMgZml4ZXMgRnJlZURlc2t0b3AgYnVnICMyMTE5Ny4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYyAoQUZfRElHSVQpOiBOZXcgbWFjcm8uCi0JKGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3NjcmlwdF9jb3ZlcmFnZSk6IE1hcmsgQVNDSUkgZGlnaXRzIGluCi0JYGdseXBoX3NjcmlwdHMnIGFycmF5LgotCShhZl9mYWNlX2dsb2JhbHNfZ2V0X21ldHJpY3MpOiBVcGRhdGVkLgotCShhZl9mYWNlX2dsb2JhbHNfaXNfZGlnaXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oOiBVcGRhdGVkLgotCShBRl9TY3JpcHRNZXRyaWNzUmVjKTogQWRkIGBkaWdpdHNfaGF2ZV9zYW1lX3dpZHRoJyBmbGFnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmM6IEluY2x1ZGUgRlRfQURWQU5DRVNfSC4KLQkoYWZfbGF0aW5fbWV0cmljc19jaGVja19kaWdpdHMpOiBOZXcgZnVuY3Rpb24uCi0JKGFmX2xhdGluX21ldHJpY3NfaW5pdCk6IFVzZSBpdC4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaDogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19tZXRyaWNzX2luaXQpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jOiBTaW1pbGFyIGNoYW5nZXMgYXMgd2l0aCBhZmxhdGluLmMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2cpOiBUZXN0IGRpZ2l0IHdpZHRoLgotCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IGl0LgotCi0yMDA5LTA0LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNYWtlIGZ0Z3JheXMgY29tcGlsZSB3aXRoIF9TVEFOREFMT05FXyBhbmQgRlRfU1RBVElDX1JBU1RFUiBhZ2Fpbi4KLQlQcm9ibGVtcyByZXBvcnRlZCBieSBzdXl1QGNvb2VlLmNuLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoRlRfREVGSU5FX09VVExJTkVfRlVOQ1MsCi0JRlRfREVGSU5FX1JBU1RFUl9GVU5DUykgW19TVEFOREFMT05FX106IERlZmluZS4KLQlbIV9TVEFOREFMT05FX106IEluY2x1ZGUgZnRzcGljLmggb25seSBoZXJlLgotCShyYXMpOiBEZWZpbmUvZGVjbGFyZSBhZnRlciBkZWZpbml0aW9uIG9mIGBUV29ya2VyJy4KLQlVc2UgYFJBU19WQVJfJyB3aGVyZSBuZWNlc3NhcnkuCi0KLTIwMDktMDQtMjEgIEthcmwgQmVycnkgIDxrYXJsQGdudS5vcmc+Ci0KLQlGaXggQUNfQ0hFQ0tfRlQyLgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZTIubTQ6IE9ubHkgY2hlY2sgUEFUSCBmb3IgZnJlZXR5cGUtY29uZmlnIGlmCi0Jd2UgZGlkIG5vdCBhbHJlYWR5IGZpbmQgaXQgZnJvbSBhIHByZWZpeCBvcHRpb24uCi0KLTIwMDktMDQtMDUgIE9yYW4gQWdyYSAgPG9yYW5AbW9uZm9ydC5jby5pbD4KLQotCUFkZCAjZXJyb3IgdG8gbW9kdWxlcyBhbmQgZmlsZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBQSUMgeWV0LgotCi0JV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIHRoZSBmb2xsb3dpbmcgZmlsZXMgd2lsbAotCWNyZWF0ZSAjZXJyb3I6Ci0JKiBzcmMvYmRmL2JkZmRyaXZyLmgKLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jCi0JKiBzcmMvY2lkL2NpZHJpdmVyLmgKLQkqIHNyYy9neHZhbGlkL2d4dm1vZC5oCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYwotCSogc3JjL2x6dy9mdGx6dy5jCi0JKiBzcmMvb3R2YWxpZC9vdHZtb2QuaAotCSogc3JjL3BjZi9wY2Zkcml2ci5oCi0JKiBzcmMvcGZyL3BmcmRyaXZyLmgKLQkqIHNyYy9wc2F1eC9wc2F1eG1vZC5oCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuaAotCSogc3JjL3R5cGU0Mi90NDJkcml2ci5oCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmgKLQotMjAwOS0wNC0wNSAgT3JhbiBBZ3JhICA8b3JhbkBtb25mb3J0LmNvLmlsPgotCi0JUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAoUElDKSBzdXBwb3J0IGluIGF1dG9maXQgbW9kdWxlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmggYWRkIG1hY3JvcyB0byBpbml0Ci0JaW5zdGFuY2VzIG9mIEZUX0F1dG9IaW50ZXJfU2VydmljZVJlYy4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuaCBkZWNsYXJlIGF1dG9maXRfbW9kdWxlX2NsYXNzCi0JdXNpbmcgbWFjcm9zIGZyb20gZnRtb2RhcGkuaCwKLQl3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgY3JlYXRlIGFuZCBkZXN0cm95Ci0JZnVuY3Rpb25zIHdpbGwgYmUgZGVjbGFyZWQuCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIHdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZAotCWFmX2F1dG9maXR0ZXJfc2VydmljZSBhbmQgYXV0b2ZpdF9tb2R1bGVfY2xhc3Mgc3RydWN0cwotCXdpbGwgaGF2ZSBmdW5jdGlvbnMgdG8gaW5pdCBvciBjcmVhdGUgYW5kIGRlc3Ryb3kgdGhlbQotCWluc3RlYWQgb2YgYmVpbmcgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0JQW5kIG1hY3JvcyB3aWxsIGJlIHVzZWQgZnJvbSBhZnBpYy5oIGluIG9yZGVyIHRvIGFjY2VzcyB0aGVtLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggYWRkIG1hY3JvcyB0byBpbml0IGFuZCBkZWNsYXJlCi0JaW5zdGFuY2VzIG9mIEFGX1NjcmlwdENsYXNzUmVjLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5oIGRlY2xhcmUgYWZfY2prX3NjcmlwdF9jbGFzcwotCXVzaW5nIG1hY3JvcyBmcm9tIGFmdHlwZXMuaCwKLQl3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgaW5pdCBmdW5jdGlvbiB3aWxsIGJlIGRlY2xhcmVkLgotCSogc3JjL2F1dG9maXQvYWZjamsuYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQKLQlhZl9jamtfc2NyaXB0X2NsYXNzIHN0cnVjdCB3aWxsIGhhdmUgZnVuY3Rpb24gdG8gaW5pdCBpdCBpbnN0ZWFkIG9mCi0JYmVpbmcgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmZHVtbXkuaCBkZWNsYXJlIGFmX2R1bW15X3NjcmlwdF9jbGFzcwotCXVzaW5nIG1hY3JvcyBmcm9tIGFmdHlwZXMuaCwKLQl3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgaW5pdCBmdW5jdGlvbiB3aWxsIGJlIGRlY2xhcmVkLgotCSogc3JjL2F1dG9maXQvYWZkdW1teS5jIHdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZAotCWFmX2R1bW15X3NjcmlwdF9jbGFzcyBzdHJ1Y3Qgd2lsbCBoYXZlIGZ1bmN0aW9uIHRvIGluaXQgaXQgaW5zdGVhZCBvZgotCWJlaW5nIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmluZGljLmggZGVjbGFyZSBhZl9pbmRpY19zY3JpcHRfY2xhc3MKLQl1c2luZyBtYWNyb3MgZnJvbSBhZnR5cGVzLmgsCi0Jd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGluaXQgZnVuY3Rpb24gd2lsbCBiZSBkZWNsYXJlZC4KLQkqIHNyYy9hdXRvZml0L2FmaW5kaWMuYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQKLQlhZl9pbmRpY19zY3JpcHRfY2xhc3Mgc3RydWN0IHdpbGwgaGF2ZSBmdW5jdGlvbiB0byBpbml0IGl0IGluc3RlYWQgb2YKLQliZWluZyBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5oIGRlY2xhcmUgYWZfbGF0aW5fc2NyaXB0X2NsYXNzCi0JdXNpbmcgbWFjcm9zIGZyb20gYWZ0eXBlcy5oLAotCXdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBpbml0IGZ1bmN0aW9uIHdpbGwgYmUgZGVjbGFyZWQuCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkCi0JYWZfbGF0aW5fc2NyaXB0X2NsYXNzIHN0cnVjdCB3aWxsIGhhdmUgZnVuY3Rpb24gdG8gaW5pdCBpdCBpbnN0ZWFkIG9mCi0JYmVpbmcgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0JQ2hhbmdlIGFmX2xhdGluX2JsdWVfY2hhcnMgdG8gYmUgUElDLWNvbXBhdGlibGUgYnkgYmVpbmcgYSB0d28KLQlkaW1lbnNpb25hbCBhcnJheSByYXRoZXIgdGhhbiBhcnJheSBvZiBwb2ludGVycy4KLQotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluMi5oIGRlY2xhcmUgYWZfbGF0aW4yX3NjcmlwdF9jbGFzcwotCXVzaW5nIG1hY3JvcyBmcm9tIGFmdHlwZXMuaCwKLQl3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgaW5pdCBmdW5jdGlvbiB3aWxsIGJlIGRlY2xhcmVkLgotCSogc3JjL2F1dG9maXQvYWZsYXRpbjIuYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQKLQlhZl9sYXRpbjJfc2NyaXB0X2NsYXNzIHN0cnVjdCB3aWxsIGhhdmUgZnVuY3Rpb24gdG8gaW5pdCBpdCBpbnN0ZWFkIG9mCi0JYmVpbmcgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0JQ2hhbmdlIGFmX2xhdGluMl9ibHVlX2NoYXJzIHRvIGJlIFBJQy1jb21wYXRpYmxlIGJ5IGJlaW5nIGEgdHdvCi0JZGltZW5zaW9uYWwgYXJyYXkgcmF0aGVyIHRoYW4gYXJyYXkgb2YgcG9pbnRlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkCi0JYWZfc2NyaXB0X2NsYXNzZXMgYXJyYXkgaW5pdGlhbGl6YXRpb24gd2FzIG1vdmVkIHRvIGFmcGljLmMgYW5kCi0JaXMgbGF0ZXIgcmVmZXJyZWQgdXNpbmcgbWFjcm9zIGRlZmluZWQgaW4gYWZwaWMuaC4KLQotCU5ldyBGaWxlczoKLQkqIHNyYy9hdXRvZml0L2FmcGljLmggZGVjbGFyZSBzdHJ1Y3QgdG8gaG9sZCBQSUMgZ2xvYmFscyBmb3IgYXV0b2ZpdAotCW1vZHVsZSBhbmQgbWFjcm9zIHRvIGFjY2VzcyB0aGVtLgotCSogc3JjL2F1dG9maXQvYWZwaWMuYyBpbXBsZW1lbnQgZnVuY3Rpb25zIHRvIGFsbG9jYXRlLCBkZXN0cm95IGFuZAotCWluaXRpYWxpemUgUElDIGdsb2JhbHMgZm9yIGF1dG9maXQgbW9kdWxlLgotCi0JKiBzcmMvYXV0b2ZpdC9hdXRvZml0LmMgYWRkIG5ldyBmaWxlIHRvIGJ1aWxkOiBhZnBpYy5jLgotCSogc3JjL2F1dG9maXQvamFtZmlsZSBhZGQgbmV3IGZpbGVzIHRvIEZUMl9NVUxUSSBidWlsZDogYWZwaWMuYy4KLQotMjAwOS0wNC0wNSAgT3JhbiBBZ3JhICA8b3JhbkBtb25mb3J0LmNvLmlsPgotCi0JUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAoUElDKSBzdXBwb3J0IGluIHBzaGludGVyIG1vZHVsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmggYWRkIG1hY3JvcyB0byBpbml0Ci0JaW5zdGFuY2VzIG9mIFBTSGludGVyX0ludGVyZmFjZS4KLQotCSogc3JjL3BzaGludGVyL3BzaG1vZC5oIGRlY2xhcmUgcHNoaW50ZXJfbW9kdWxlX2NsYXNzCi0JdXNpbmcgbWFjcm9zIGZyb20gZnRtb2RhcGkuaCwKLQl3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgY3JlYXRlIGFuZCBkZXN0cm95Ci0JZnVuY3Rpb25zIHdpbGwgYmUgZGVjbGFyZWQuCi0JKiBzcmMvcHNoaW50ZXIvcHNobW9kLmMgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkCi0JcHNoaW50ZXJfaW50ZXJmYWNlIGFuZCBwc2hpbnRlcl9tb2R1bGVfY2xhc3Mgc3RydWN0cwotCXdpbGwgaGF2ZSBmdW5jdGlvbnMgdG8gaW5pdCBvciBjcmVhdGUgYW5kIGRlc3Ryb3kgdGhlbQotCWluc3RlYWQgb2YgYmVpbmcgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0JQW5kIG1hY3JvcyB3aWxsIGJlIHVzZWQgZnJvbSBwc2hwaWMuaCBpbiBvcmRlciB0byBhY2Nlc3MgdGhlbS4KLQotCU5ldyBGaWxlczoKLQkqIHNyYy9wc2hpbnRlci9wc2hwaWMuaCBkZWNsYXJlIHN0cnVjdCB0byBob2xkIFBJQyBnbG9iYWxzIGZvciBwc2hpbnRlcgotCW1vZHVsZSBhbmQgbWFjcm9zIHRvIGFjY2VzcyB0aGVtLgotCSogc3JjL3BzaGludGVyL3BzaHBpYy5jIGltcGxlbWVudCBmdW5jdGlvbnMgdG8gYWxsb2NhdGUsIGRlc3Ryb3kgYW5kCi0JaW5pdGlhbGl6ZSBQSUMgZ2xvYmFscyBmb3IgcHNoaW50ZXIgbW9kdWxlLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoaW50ZXIuYyBhZGQgbmV3IGZpbGUgdG8gYnVpbGQ6IHBzaHBpYy5jLgotCSogc3JjL3BzaGludGVyL2phbWZpbGUgYWRkIG5ldyBmaWxlcyB0byBGVDJfTVVMVEkgYnVpbGQ6IHBzaHBpYy5jLgotCi0yMDA5LTA0LTA1ICBPcmFuIEFncmEgIDxvcmFuQG1vbmZvcnQuY28uaWw+Ci0KLQlQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHN1cHBvcnQgaW4gcHNuYW1lcyBtb2R1bGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaCBhZGQgbWFjcm9zIHRvIGluaXQKLQlpbnN0YW5jZXMgb2YgRlRfU2VydmljZV9Qc0NNYXBzUmVjLgotCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5oIGRlY2xhcmUgcHNuYW1lc19tb2R1bGVfY2xhc3MKLQl1c2luZyBtYWNyb3MgZnJvbSBmdG1vZGFwaS5oLAotCXdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBjcmVhdGUgYW5kIGRlc3Ryb3kKLQlmdW5jdGlvbnMgd2lsbCBiZSBkZWNsYXJlZC4KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkCi0JcHNjbWFwc19pbnRlcmZhY2UgYW5kIHBzY21hcHNfc2VydmljZXMgc3RydWN0cwotCWFuZCBwc25hbWVzX21vZHVsZV9jbGFzcyBhcnJheQotCXdpbGwgaGF2ZSBmdW5jdGlvbnMgdG8gaW5pdCBvciBjcmVhdGUgYW5kIGRlc3Ryb3kgdGhlbQotCWluc3RlYWQgb2YgYmVpbmcgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0JQW5kIG1hY3JvcyB3aWxsIGJlIHVzZWQgZnJvbSBwc3BpYy5oIGluIG9yZGVyIHRvIGFjY2VzcyB0aGVtLgotCi0JTmV3IEZpbGVzOgotCSogc3JjL3BzbmFtZXMvcHNwaWMuaCBkZWNsYXJlIHN0cnVjdCB0byBob2xkIFBJQyBnbG9iYWxzIGZvciBwc25hbWVzCi0JbW9kdWxlIGFuZCBtYWNyb3MgdG8gYWNjZXNzIHRoZW0uCi0JKiBzcmMvcHNuYW1lcy9wc3BpYy5jIGltcGxlbWVudCBmdW5jdGlvbnMgdG8gYWxsb2NhdGUsIGRlc3Ryb3kgYW5kCi0JaW5pdGlhbGl6ZSBQSUMgZ2xvYmFscyBmb3IgcHNuYW1lcyBtb2R1bGUuCi0KLQkqIHNyYy9wc25hbWVzL3BzbmFtZXMuYyBhZGQgbmV3IGZpbGUgdG8gYnVpbGQ6IHBzcGljLmMuCi0JKiBzcmMvcHNuYW1lcy9qYW1maWxlIGFkZCBuZXcgZmlsZXMgdG8gRlQyX01VTFRJIGJ1aWxkOiBwc3BpYy5jLgotCi0yMDA5LTA0LTA1ICBPcmFuIEFncmEgIDxvcmFuQG1vbmZvcnQuY28uaWw+Ci0KLQlQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHN1cHBvcnQgaW4gcmFzdGVyIHJlbmRlcmVyLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuaCBkZWNsYXJlIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3MKLQlhbmQgZnRfcmFzdGVyNV9yZW5kZXJlcl9jbGFzcwotCXVzaW5nIG1hY3JvcyBmcm9tIGZ0cmVuZGVyLmgsCi0Jd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGNyZWF0ZSBhbmQgZGVzdHJveQotCWZ1bmN0aW9ucyB3aWxsIGJlIGRlY2xhcmVkLgotCSogc3JjL3Ntb290aC9mdHJlbmQxLmMgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkCi0JZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzcyBhbmQgZnRfcmFzdGVyNV9yZW5kZXJlcl9jbGFzcyBzdHJ1Y3RzCi0Jd2lsbCBoYXZlIGZ1bmN0aW9ucyB0byBpbml0IG9yIGNyZWF0ZSBhbmQgZGVzdHJveSB0aGVtCi0JaW5zdGVhZCBvZiBiZWluZyBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KLQlNYWNyb3Mgd2lsbCBiZSB1c2VkIGZyb20gcmFzdHBpYy5oIGluIG9yZGVyIHRvIGFjY2VzcwotCWZ0X3N0YW5kYXJkX3Jhc3RlciBmcm9tIHRoZSBwaWNfY29udGFpbmVyIChhbGxvY2F0ZWQgaW4gZnRyYXN0ZXIuYykuCi0JSW4gZnRfcmFzdGVyMV9yZW5kZXIgd2hlbiBQSUMgaXMgZW5hYmxlZCwgdGhlIGxhc3QgbGV0dGVyIG9mCi0JbW9kdWxlX25hbWUgaXMgdXNlZCB0byB2ZXJpZnkgdGhlIHJlbmRlcmVyIGNsYXNzIHJhdGhlciB0aGFuIHRoZQotCWNsYXNzIHBvaW50ZXIuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQKLQlmdF9zdGFuZGFyZF9yYXN0ZXIgc3RydWN0IHdpbGwgaGF2ZSBmdW5jdGlvbiB0byBpbml0IGl0Ci0JaW5zdGVhZCBvZiBiZWluZyBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KLQotCU5ldyBGaWxlczoKLQkqIHNyYy9yYXN0ZXIvcmFzdHBpYy5oIGRlY2xhcmUgc3RydWN0IHRvIGhvbGQgUElDIGdsb2JhbHMgZm9yIHJhc3RlcgotCXJlbmRlcmVyIGFuZCBtYWNyb3MgdG8gYWNjZXNzIHRoZW0uCi0JKiBzcmMvcmFzdGVyL3Jhc3RwaWMuYyBpbXBsZW1lbnQgZnVuY3Rpb25zIHRvIGFsbG9jYXRlLCBkZXN0cm95IGFuZAotCWluaXRpYWxpemUgUElDIGdsb2JhbHMgZm9yIHJhc3RlciByZW5kZXJlci4KLQotCSogc3JjL3Jhc3Rlci9yYXN0ZXIuYyBhZGQgbmV3IGZpbGUgdG8gYnVpbGQ6IHJhc3RwaWMuYy4KLQkqIHNyYy9yYXN0ZXIvamFtZmlsZSBhZGQgbmV3IGZpbGVzIHRvIEZUMl9NVUxUSSBidWlsZDogcmFzdHBpYy5jLgotCi0yMDA5LTA0LTA1ICBPcmFuIEFncmEgIDxvcmFuQG1vbmZvcnQuY28uaWw+Ci0KLQlQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHN1cHBvcnQgaW4gc21vb3RoIHJlbmRlcmVyLgotCi0JKiBzcmMvc21vb3RoL2Z0c21vb3RoLmggZGVjbGFyZSBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3MsCi0JZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcyBhbmQgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3MKLQl1c2luZyBtYWNyb3MgZnJvbSBmdHJlbmRlci5oLAotCXdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBjcmVhdGUgYW5kIGRlc3Ryb3kKLQlmdW5jdGlvbnMgd2lsbCBiZSBkZWNsYXJlZC4KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQKLQl0aGUgZm9sbG93aW5nIHN0cnVjdHM6Ci0JZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzLCBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzCi0JYW5kIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzCi0Jd2lsbCBoYXZlIGZ1bmN0aW9ucyB0byBpbml0IG9yIGNyZWF0ZSBhbmQgZGVzdHJveSB0aGVtCi0JaW5zdGVhZCBvZiBiZWluZyBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KLQlBbmQgbWFjcm9zIHdpbGwgYmUgdXNlZCBmcm9tIGZ0c3BpYy5oIGluIG9yZGVyIHRvIGFjY2VzcwotCWZ0X2dyYXlzX3Jhc3RlciBmcm9tIHRoZSBwaWNfY29udGFpbmVyIChhbGxvY2F0ZWQgaW4gZnRncmF5cy5jKS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmggaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIHdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgTk9UIGRlZmluZWQKLQlmdW5jX2ludGVyZmFjZSB3YXMgbW92ZWQgZnJvbSBncmF5X2NvbnZlcnRfZ2x5cGhfaW5uZXIgZnVuY3Rpb24KLQl0byB0aGUgZ2xvYmFsIHNjb3BlLgotCVdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZAotCWZ1bmNfaW50ZXJmYWNlIGFuZCBmdF9ncmF5c19yYXN0ZXIgc3RydWN0cwotCXdpbGwgaGF2ZSBmdW5jdGlvbnMgdG8gaW5pdCB0aGVtCi0JaW5zdGVhZCBvZiBiZWluZyBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KLQlBbmQgZnVuY19pbnRlcmZhY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIG9mCi0JZ3JheV9jb252ZXJ0X2dseXBoX2lubmVyLgotCi0JTmV3IEZpbGVzOgotCSogc3JjL3Ntb290aC9mdHNwaWMuaCBkZWNsYXJlIHN0cnVjdCB0byBob2xkIFBJQyBnbG9iYWxzIGZvciBzbW9vdGgKLQlyZW5kZXJlciBhbmQgbWFjcm9zIHRvIGFjY2VzcyB0aGVtLgotCSogc3JjL3Ntb290aC9mdHNwaWMuYyBpbXBsZW1lbnQgZnVuY3Rpb25zIHRvIGFsbG9jYXRlLCBkZXN0cm95IGFuZAotCWluaXRpYWxpemUgUElDIGdsb2JhbHMgZm9yIHNtb290aCByZW5kZXJlci4KLQotCSogc3JjL3Ntb290aC9zbW9vdGguYyBhZGQgbmV3IGZpbGUgdG8gYnVpbGQ6IGZ0c3BpYy5jLgotCSogc3JjL3Ntb290aC9qYW1maWxlIGFkZCBuZXcgZmlsZXMgdG8gRlQyX01VTFRJIGJ1aWxkOiBmdHNwaWMuYy4KLQotMjAwOS0wNC0wNSAgT3JhbiBBZ3JhICA8b3JhbkBtb25mb3J0LmNvLmlsPgotCi0JUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAoUElDKSBzdXBwb3J0IGluIGNmZiBkcml2ZXIuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaCBhZGQgbWFjcm9zIHRvIGluaXQKLQlpbnN0YW5jZXMgb2YgRlRfU2VydmljZV9DSURSZWMuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmggYWRkIG1hY3JvcyB0byBpbml0Ci0JaW5zdGFuY2VzIG9mIEZUX1NlcnZpY2VfUHNJbmZvUmVjLgotCi0JKiBzcmMvY2ZmL2NmZmNtYXAuaCBkZWNsYXJlIGNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYwotCWFuZCBjZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYyB1c2luZyBtYWNyb3MgZnJvbQotCWZ0b2Jqcy5oLCB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgY3JlYXRlIGFuZCBkZXN0cm95Ci0JZnVuY3Rpb25zIHdpbGwgYmUgZGVjbGFyZWQuCi0JKiBzcmMvY2ZmL2NmZmNtYXAuYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQKLQl0aGUgZm9sbG93aW5nIHN0cnVjdHM6Ci0JY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjIGFuZCBjZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYwotCXdpbGwgaGF2ZSBmdW5jdGlvbnMgdG8gaW5pdCBvciBjcmVhdGUgYW5kIGRlc3Ryb3kgdGhlbQotCWluc3RlYWQgb2YgYmVpbmcgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuaCBkZWNsYXJlIGNmZl9kcml2ZXJfY2xhc3MgdXNpbmcgbWFjcm9zIGZyb20KLQlmdGRyaXZlci5oLCB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgY3JlYXRlIGFuZCBkZXN0cm95Ci0JZnVuY3Rpb25zIHdpbGwgYmUgZGVjbGFyZWQuCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkCi0JdGhlIGZvbGxvd2luZyBzdHJ1Y3RzOgotCWNmZl9zZXJ2aWNlX2dseXBoX2RpY3QsIGNmZl9zZXJ2aWNlX3BzX2luZm8sIGNmZl9zZXJ2aWNlX3BzX25hbWUKLQljZmZfc2VydmljZV9nZXRfY21hcF9pbmZvLCBjZmZfc2VydmljZV9jaWRfaW5mbywgY2ZmX2RyaXZlcl9jbGFzcywKLQlhbmQgY2ZmX3NlcnZpY2VzIGFycmF5Ci0Jd2lsbCBoYXZlIGZ1bmN0aW9ucyB0byBpbml0IG9yIGNyZWF0ZSBhbmQgZGVzdHJveSB0aGVtCi0JaW5zdGVhZCBvZiBiZWluZyBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KLQlBbmQgbWFjcm9zIHdpbGwgYmUgdXNlZCBmcm9tIGNmZnBpYy5oIGluIG9yZGVyIHRvIGFjY2VzcyB0aGVtCi0JZnJvbSB0aGUgcGljX2NvbnRhaW5lci4KLQlVc2UgbWFjcm9zIGZyb20gY2ZmcGljLmggaW4gb3JkZXIgdG8gYWNjZXNzIHRoZQotCXN0cnVjdHMgYWxsb2NhdGVkIGluIGNmZmNtYXAuYwotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyBVc2UgbWFjcm9zIGZyb20gY2ZmcGljLmggaW4gb3JkZXIgdG8gYWNjZXNzIHRoZQotCXN0cnVjdHMgYWxsb2NhdGVkIGluIGNmZmNtYXAuYwotCi0JKiBzcmMvY2ZmL3BhcnNlci5jIHdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZAotCWltcGxlbWVudCBmdW5jdGlvbnMgdG8gY3JlYXRlIGFuZCBkZXN0cm95IGNmZl9maWVsZF9oYW5kbGVycyBhcnJheQotCWluc3RlYWQgb2YgYmVpbmcgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0JQW5kIG1hY3JvcyB3aWxsIGJlIHVzZWQgZnJvbSBjZmZwaWMuaCBpbiBvcmRlciB0byBhY2Nlc3MgaXQKLQlmcm9tIHRoZSBwaWNfY29udGFpbmVyLgotCi0JTmV3IEZpbGVzOgotCSogc3JjL2NmZi9jZmZwaWMuaCBkZWNsYXJlIHN0cnVjdCB0byBob2xkIFBJQyBnbG9iYWxzIGZvciBjZmYKLQlkcml2ZXIgYW5kIG1hY3JvcyB0byBhY2Nlc3MgdGhlbS4KLQkqIHNyYy9jZmYvY2ZmcGljLmMgaW1wbGVtZW50IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSwgZGVzdHJveSBhbmQKLQlpbml0aWFsaXplIFBJQyBnbG9iYWxzIGZvciBjZmYgZHJpdmVyLgotCi0JKiBzcmMvY2ZmL2NmZi5jIGFkZCBuZXcgZmlsZSB0byBidWlsZDogY2ZmcGljLmMuCi0JKiBzcmMvY2ZmL2phbWZpbGUgYWRkIG5ldyBmaWxlcyB0byBGVDJfTVVMVEkgYnVpbGQ6IGNmZnBpYy5jLgotCi0yMDA5LTA0LTA1ICBPcmFuIEFncmEgIDxvcmFuQG1vbmZvcnQuY28uaWw+Ci0KLQlQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHN1cHBvcnQgaW4gc2ZudCBkcml2ZXIuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaCBhZGQgbWFjcm9zIHRvIGluaXQKLQlpbnN0YW5jZXMgb2YgRlRfU2VydmljZV9CREZSZWMuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmggYWRkIG1hY3JvcyB0byBpbml0Ci0JaW5zdGFuY2VzIG9mIEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oIGFkZCBtYWNyb3MgdG8gaW5pdAotCWluc3RhbmNlcyBvZiBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oIGFkZCBtYWNyb3MgdG8gaW5pdAotCWluc3RhbmNlcyBvZiBGVF9TZXJ2aWNlX1NGTlRfVGFibGVSZWMuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmggYWRkIG1hY3JvcyB0byBpbml0Ci0JaW5zdGFuY2VzIG9mIEZUX1NlcnZpY2VfVFRDTWFwc1JlYy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIGFkZCBtYWNyb3MgdG8gaW5pdAotCWluc3RhbmNlcyBvZiBTRk5UX0ludGVyZmFjZS4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuaCBkZWNsYXJlIHNmbnRfbW9kdWxlX2NsYXNzIHVzaW5nIG1hY3JvcyBmcm9tCi0JZnRtb2RhcGkuaCwgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGNyZWF0ZSBhbmQgZGVzdHJveQotCWZ1bmN0aW9ucyB3aWxsIGJlIGRlY2xhcmVkLgotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQKLQl0aGUgZm9sbG93aW5nIHN0cnVjdHM6Ci0Jc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUsIHNmbnRfc2VydmljZV9nbHlwaF9kaWN0LCBzZm50X3NlcnZpY2VfcHNfbmFtZQotCXR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbywgc2ZudF9zZXJ2aWNlX2JkZiwgc2ZudF9pbnRlcmZhY2UsCi0Jc2ZudF9tb2R1bGVfY2xhc3MsIGFuZCBzZm50X3NlcnZpY2VzIGFycmF5Ci0Jd2lsbCBoYXZlIGZ1bmN0aW9ucyB0byBpbml0IG9yIGNyZWF0ZSBhbmQgZGVzdHJveSB0aGVtCi0JaW5zdGVhZCBvZiBiZWluZyBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KLQlBbmQgbWFjcm9zIHdpbGwgYmUgdXNlZCBmcm9tIHNmbnRwaWMuaCBpbiBvcmRlciB0byBhY2Nlc3MgdGhlbQotCWZyb20gdGhlIHBpY19jb250YWluZXIuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5oIGFkZCBtYWNyb3MgdG8gaW5pdAotCWluc3RhbmNlcyBvZiBUVF9DTWFwX0NsYXNzUmVjLgotCSogc3JjL3NmbnQvdHRjbWFwLmMgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkCi0JdGhlIGZvbGxvd2luZyBzdHJ1Y3RzOgotCXR0X2NtYXAwX2NsYXNzX3JlYywgdHRfY21hcDJfY2xhc3NfcmVjLCB0dF9jbWFwNF9jbGFzc19yZWMKLQl0dF9jbWFwNl9jbGFzc19yZWMsIHR0X2NtYXA4X2NsYXNzX3JlYywgdHRfY21hcDEwX2NsYXNzX3JlYywKLQl0dF9jbWFwMTJfY2xhc3NfcmVjLCB0dF9jbWFwMTRfY2xhc3NfcmVjIGFuZCB0dF9jbWFwX2NsYXNzZXMgYXJyYXkKLQl3aWxsIGhhdmUgZnVuY3Rpb25zIHRvIGluaXQgb3IgY3JlYXRlIGFuZCBkZXN0cm95IHRoZW0KLQlpbnN0ZWFkIG9mIGJlaW5nIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgotCUFuZCBtYWNyb3Mgd2lsbCBiZSB1c2VkIGZyb20gc2ZudHBpYy5oIGluIG9yZGVyIHRvIGFjY2VzcyB0aGVtCi0JZnJvbSB0aGUgcGljX2NvbnRhaW5lci4KLQlUaGUgY29udGVudCBvZiB0dF9jbWFwX2NsYXNzZXMgaXMgbm93IGRlc2NyaWJlZCBpbiB0aGUKLQluZXcgZmlsZSAndHRjbWFwYy5oJy4KLQotCU5ldyBGaWxlczoKLQkqIHNyYy9zZm50L3NmbnRwaWMuaCBkZWNsYXJlIHN0cnVjdCB0byBob2xkIFBJQyBnbG9iYWxzIGZvciBzZm50Ci0JZHJpdmVyIGFuZCBtYWNyb3MgdG8gYWNjZXNzIHRoZW0uCi0JKiBzcmMvc2ZudC9zZm50cGljLmMgaW1wbGVtZW50IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSwgZGVzdHJveSBhbmQKLQlpbml0aWFsaXplIFBJQyBnbG9iYWxzIGZvciBzZm50IGRyaXZlci4KLQkqIHNyYy9zZm50L3R0Y21hcGMuaCBkZXNjcmliaW5nIHRoZSBjb250ZW50IG9mCi0JdHRfY21hcF9jbGFzc2VzIGFsbG9jYXRlZCBpbiB0dGNtYXAuYwotCi0JKiBzcmMvc2ZudC9zZm50LmMgYWRkIG5ldyBmaWxlIHRvIGJ1aWxkOiBzZm50cGljLmMuCi0JKiBzcmMvc2ZudC9qYW1maWxlIGFkZCBuZXcgZmlsZXMgdG8gRlQyX01VTFRJIGJ1aWxkOiBzZm50cGljLmMuCi0KLTIwMDktMDQtMDUgIE9yYW4gQWdyYSAgPG9yYW5AbW9uZm9ydC5jby5pbD4KLQotCVBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKFBJQykgc3VwcG9ydCBpbiB0cnVldHlwZSBkcml2ZXIuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oIGFkZCBtYWNyb3MgdG8gaW5pdAotCWluc3RhbmNlcyBvZiBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaCBhZGQgbWFjcm9zIHRvIGluaXQKLQlpbnN0YW5jZXMgb2YgRlRfU2VydmljZV9UVEdseWZSZWMuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5oIGRlY2xhcmUgdHRfZHJpdmVyX2NsYXNzIHVzaW5nIG1hY3JvcyBmcm9tCi0JZnRkcml2ZXIuaCwgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGNyZWF0ZSBhbmQgZGVzdHJveQotCWZ1bmN0aW9ucyB3aWxsIGJlIGRlY2xhcmVkLgotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkCi0JdGhlIGZvbGxvd2luZyBzdHJ1Y3RzOgotCXR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycywgdHRfc2VydmljZV90cnVldHlwZV9nbHlmLCB0dF9kcml2ZXJfY2xhc3MKLQlhbmQgdHRfc2VydmljZXMgYXJyYXksCi0Jd2lsbCBoYXZlIGZ1bmN0aW9ucyB0byBpbml0IG9yIGNyZWF0ZSBhbmQgZGVzdHJveSB0aGVtCi0JaW5zdGVhZCBvZiBiZWluZyBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KLQlBbmQgbWFjcm9zIHdpbGwgYmUgdXNlZCBmcm9tIHR0cGljLmggaW4gb3JkZXIgdG8gYWNjZXNzIHRoZW0KLQlmcm9tIHRoZSBwaWNfY29udGFpbmVyLgotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jIGNoYW5nZSB0cmlja19uYW1lcyBhcnJheSB0byBiZQotCVBJQy1jb21wYXRpYmxlIGJ5IGJlaW5nIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5IHJhdGhlciB0aGFuIGFycmF5Ci0Jb2YgcG9pbnRlcnMuCi0KLQlOZXcgRmlsZXM6Ci0JKiBzcmMvdHJ1ZXR5cGUvdHRwaWMuaCBkZWNsYXJlIHN0cnVjdCB0byBob2xkIFBJQyBnbG9iYWxzIGZvciB0cnVldHlwZQotCWRyaXZlciBhbmQgbWFjcm9zIHRvIGFjY2VzcyB0aGVtLgotCSogc3JjL3RydWV0eXBlL3R0cGljLmMgaW1wbGVtZW50IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSwgZGVzdHJveSBhbmQKLQlpbml0aWFsaXplIFBJQyBnbG9iYWxzIGZvciB0cnVldHlwZSBkcml2ZXIuCi0KLQkqIHNyYy90cnVldHlwZS90cnVldHlwZS5jIGFkZCBuZXcgZmlsZSB0byBidWlsZDogdHRwaWMuYy4KLQkqIHNyYy90cnVldHlwZS9qYW1maWxlIGFkZCBuZXcgZmlsZXMgdG8gRlQyX01VTFRJIGJ1aWxkOiB0dHBpYy5jLgotCi0yMDA5LTA0LTA1ICBPcmFuIEFncmEgIDxvcmFuQG1vbmZvcnQuY28uaWw+Ci0KLQlQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHN1cHBvcnQgYW5kIGluZnJhc3RydWN0dXJlIGluIGJhc2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmggYWRkIEZUX0NPTkZJR19PUFRJT05fUElDCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIEFkZCBwaWNfY29udGFpbmVyIG1lbWJlciB0bwotCUZUX0xpYnJhcnlSZWMuCi0JQWRkIG1hY3JvcyB0byBkZWNsYXJlIGFuZCBpbml0IGluc3RhbmNlcyBvZiBGVF9DTWFwX0NsYXNzUmVjLgotCUFkZCBtYWNyb3MgdG8gaW5pdCBpbnN0YW5jZXMgb2YgRlRfT3V0bGluZV9GdW5jcyBhbmQgRlRfUmFzdGVyX0Z1bmNzLgotCUFkZCBtYWNyb3MgdG8gZGVjbGFyZSwgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbW9kdWxlcwotCShGVF9Nb2R1bGVfQ2xhc3MpLgotCUFkZCBtYWNyb3MgdG8gZGVjbGFyZSwgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcmVuZGVyZXJzCi0JKEZUX1JlbmRlcmVyX0NsYXNzKS4KLQlBZGQgbWFjcm8gdG8gaW5pdCBpbnN0YW5jZXMgb2YgRlRfR2x5cGhfQ2xhc3MuCi0JQWRkIG1hY3JvcyB0byBkZWNsYXJlLCBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkcml2ZXJzCi0JKEZUX0RyaXZlcl9DbGFzc1JlYykuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cGljLmggbmV3IGZpbGUgdG8gZGVjbGFyZSB0aGUKLQlGVF9QSUNfQ29udGFpbmVyIHN0cnVjdCBhbmQgdGhlIGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSBhbmQgZGVzdHJveSBpdC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggYWRkIG1hY3JvcyB0byBhbGxvY2F0ZSBhbmQKLQlkZXN0cm95IGFycmF5cyBvZiBGVF9TZXJ2aWNlRGVzY1JlYy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCBkZWZpbmUgbWFjcm8gdG8gaW5jbHVkZQotCWZ0cGljLmguCi0KLQlOZXcgRmlsZXM6Ci0JKiBzcmMvYmFzZS9mdHBpYy5jIGltcGxlbWVudCBmdW5jdGlvbnMgdG8gYWxsb2NhdGUgYW5kIGRlc3Ryb3kgdGhlCi0JZ2xvYmFsIHBpY19jb250YWluZXIuCi0JKiBzcmMvYmFzZS9iYXNlcGljLmggZGVjbGFyZSBzdHJ1Y3QgdG8gaG9sZCBQSUMgZ2xvYmFscyBmb3IgYmFzZSBhbmQKLQltYWNyb3MgdG8gYWNjZXNzIHRoZW0uCi0JKiBzcmMvYmFzZS9iYXNlcGljLmMgaW1wbGVtZW50IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSwgZGVzdHJveSBhbmQKLQlpbml0aWFsaXplIFBJQyBnbG9iYWxzIGZvciBiYXNlLgotCi0JKiBzcmMvYmFzZS9mdGluaXQuYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgaW1wbGVtZW50Ci0JZnVuY3Rpb25zIHRoYXQgYWxsb2NhdGUgYW5kIGRlc3Ryb3kgZnRfZGVmYXVsdF9tb2R1bGVzIGFjY29yZGluZyB0bwotCUZUX0NPTkZJR19NT0RVTEVTX0ggaW4gdGhlIHBpY19jb250YWluZXIgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIHNjb3BlCi0JYW5kIHVzZSBtYWNybyBmcm9tIGJhc2VwaWMuaCB0byBhY2Nlc3MgaXQuCi0JKiBzcmMvYmFzZS9mdG9ianMuYyBhZGQgY2FsbHMgdG8gdGhlIGZ1bmN0aW9ucyB0aGF0IGFsbG9jYXRlIGFuZAotCWRlc3Ryb3kgdGhlIGdsb2JhbCBwaWNfY29udGFpbmVyIHdoZW4gdGhlIGxpYnJhcnkgaXMgY3JlYXRlZCBhbmQKLQlkZXN0cm95ZWQuCi0KLQkqIHNyYy9iYXNlL2phbWZpbGUgYWRkIG5ldyBmaWxlcyB0byBGVDJfTVVMVEkgYnVpbGQ6Ci0JZnRwaWMuYyBhbmQgYmFzZXBpYy5jLgotCSogc3JjL2Jhc2UvZnRiYXNlLmMgYWRkIG5ldyBmaWxlcyB0byBidWlsZDoKLQlmdHBpYy5jIGFuZCBiYXNlcGljLmMuCi0KLQkqIHNyYy9iYXNlL2Z0Z2x5cGguYyB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQKLQlmdF9iaXRtYXBfZ2x5cGhfY2xhc3MgYW5kIGZ0X291dGxpbmVfZ2x5cGhfY2xhc3Mgd2lsbCBiZSBhbGxvY2F0ZWQKLQlpbiB0aGUgcGljX2NvbnRhaW5lciBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgc2NvcGUgYW5kIHVzZSBtYWNyb3MgZnJvbQotCWJhc2VwaWMuaCB0byBhY2Nlc3MgdGhlbS4KLQkqIHNyYy9iYXNlL2Z0YmJveC5jIGFsbG9jYXRlIGJib3hfaW50ZXJmYWNlIHN0cnVjdCBvbiB0aGUgc3RhY2sKLQlpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgc2NvcGUgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkLgotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyBhY2Nlc3MgZnRfb3V0bGluZV9nbHlwaF9jbGFzcyBhbGxvY2F0ZWQgaW4KLQlmdGdseXBoLmMgdmlhIG1hY3JvcyBmcm9tIGJhc2VwaWMuaAotCi0yMDA5LTA0LTA1ICBPcmFuIEFncmEgIDxvcmFuQG1vbmZvcnQuY28uaWw+Ci0KLQlQcmVwYXJpbmcgY2hhbmdlcyBpbiBjZmYgcGFyc2VyIGxhdGVyIG5lZWRlZCBmb3IgUElDIHZlcnNpb24uCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jLCBzcmMvY2ZmL2NmZmxvYWQuaCwgc3JjL2NmZi9jZmZvYmpzLmMsCi0Jc3JjL2NmZi9jZmZwYXJzZS5jLCBzcmMvY2ZmL2NmZnBhcnNlLmg6IEFkZCBsaWJyYXJ5IHBvaW50ZXIgdG8KLQknQ0ZGX1BhcnNlclJlYycgc2V0IGJ5IGBjZmZfcGFyc2VyX2luaXQnLgotCVJvdXRlIGxpYnJhcnkgcG9pbnRlciBmcm9tICdjZmZfZmFjZV9pbml0JyB0byAnY2ZmX3N1YmZvbnRfbG9hZCcKLQlmb3IgYGNmZl9wYXJzZXJfaW5pdCcuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoQ0ZGX0ZpZWxkX0hhbmRsZXIpOiBNb3ZlIGl0IHRvLi4uCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmg6IFRoaXMgZmlsZSwgdG8gYmUgdXNlZCBieSBvdGhlciBDIGZpbGVzLgotCi0yMDA5LTA0LTA1ICBPcmFuIEFncmEgIDxvcmFuQG1vbmZvcnQuY28uaWw+Ci0KLQlNaW5vciBjaGFuZ2UgaW4gZnRzdHJva2UuYy4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoRlRfU3Ryb2tlclJlYyk6IFJlcGxhY2UgYG1lbW9yeScgbWVtYmVyIHdpdGgKLQlgbGlicmFyeScgbmVlZGVkIGZvciBQSUMgdmVyc2lvbi4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLTIwMDktMDQtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCWZ0bmFtZXMuYyAtPiBmdHNuYW1lcy5jCi0KLQkqIHNyYy9iYXNlL2Z0bmFtZXMuYzogUmVuYW1lIHRvLi4uCi0JKiBzcmMvYmFzZS9mdHNuYW1lcy5jOiBUaGlzLgotCSogc3JjL2Jhc2UvSmFtZmlsZSwgc3JjL2Jhc2UvcnVsZXMubWssIHNyYy9iYXNlL2Z0YmFzZS5jOiBVcGRhdGVkLgotCi0yMDA5LTA0LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgY21hcCB0eXBlIDEzLgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMyk6IE5ldyBtYWNyby4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKFRUX0NNYXAxM1JlYywgdHRfY21hcDEzX2luaXQsCi0JdHRfY21hcDEzX3ZhbGlkYXRlLCB0dF9jbWFwMTNfY2hhcl9pbmRleCwgdHRfY21hcDEzX2NoYXJfbmV4dCwKLQl0dF9jbWFwMTNfZ2V0X2luZm8sIHR0X2NtYXAxM19jaGFyX21hcF9kZWZfYmluYXJ5LAotCXR0X2NtYXAxNF9jbGFzc19yZWMpOiBOZXcgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzIGZvciBjbWFwIDEzCi0Jc3VwcG9ydC4KLQkodHRfY21hcF9jbGFzc2VzKTogUmVnaXN0ZXIgdHRfY21hcDEzX2NsYXNzX3JlYy4KLQotCSogZG9jcy9DSEFOR0VTOiBNZW50aW9uIGNtYXAgMTMgc3VwcG9ydC4KLQotMjAwOS0wNC0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSWdub3JlIGVtcHR5IGNvbnRvdXJzIGluIENGRiBnbHlwaHMuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEFsYmVydCBBc3RhbHMgQ2lkIDxhYWNpZEBrZGUub3JnPi4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKTogU3luY2hyb25pemUgd2l0aAotCXQxX2J1aWxkZXJfY2xvc2VfY29udG91ci4KLQotMjAwOS0wMy0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQW5vdGhlciByZWR1bmRhbnQgaGVhZGVyIGluY2x1c2lvbi4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYzogRml4IEdob3N0c2NyaXB0IENvdmVyaXR5IGlzc3VlICM0MDQxLgotCi0yMDA5LTAzLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZW1vdmUgcmVkdW5kYW50IGhlYWRlciBpbmNsdXNpb25zLgotCi0JVGhpcyBjb3ZlcnMgbWFueSBHaG9zdHNjcmlwdCBDb3Zlcml0eSBpc3N1ZXMuCi0KLQkqIHNyYy8qOiBEbyBpdC4KLQotMjAwOS0wMy0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IEdob3N0c2NyaXB0IENvdmVyaXR5IGlzc3VlICMzOTA0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfcmVhZHBhY2tlZHBvaW50cyk6IFByb3RlY3QgYWdhaW5zdAotCWludmFsaWQgdmFsdWVzIG9mIGBydW5jbnQnLgotCi0yMDA5LTAzLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggYG1ha2UgbXVsdGknIHJ1bi4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5oOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0guCi0KLTIwMDktMDMtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI1OTIzLgotCi0JKiBzcmMvY2FjaGUvZnRjY21hcC5jIChGVENfQ01BUF9IQVNIKTogRml4IHR5cG8uCi0KLTIwMDktMDMtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVByb3RlY3QgYWdhaW5zdCB0b28gbGFyZ2UgZ2x5cGhzLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBUYXZpcyBPcm1hbmR5IDx0YXZpc29AZ29vZ2xlLmNvbT4uCi0KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogRG9uJ3QgYWxsb3cKLQlgcGl0Y2gnIG9yIGBoZWlnaHQnIHRvIGJlIGxhcmdlciB0aGFuIDB4RkZGRi4KLQotMjAwOS0wMy0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCSAgICBUYXZpcyBPcm1hbmR5ICA8dGF2aXNvQGdvb2dsZS5jb20+Ci0KLQlGaXggdmFsaWRhdGlvbiBmb3IgdmFyaW91cyBjbWFwIHRhYmxlIGZvcm1hdHMuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9jbWFwOF92YWxpZGF0ZSwgdHRfY21hcDEwX3ZhbGlkYXRlLAotCXR0X2NtYXAxMl92YWxpZGF0ZSk6IENoZWNrIGBsZW5ndGgnIGNvcnJlY3RseS4KLQkodHRfY21hcF8xNF92YWxpZGF0ZSk6IENoZWNrIGBsZW5ndGgnIGFuZCBgbnVtTWFwcGluZ3MnIGNvcnJlY3RseS4KLQotMjAwOS0wMy0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUHJvdGVjdCBhZ2FpbnN0IG1hbGZvcm1lZCBjb21wcmVzc2VkIGRhdGEuCi0KLQkqIHNyYy9sencvZnR6b3Blbi5jIChmdF9sendzdGF0ZV9pbyk6IFRlc3Qgd2hldGhlciBgc3RhdGUtPnByZWZpeCcgaXMKLQl6ZXJvLgotCi0yMDA5LTAzLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBTSUQgdmFsdWVzIGluIENGRnMuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IFRhdmlzIE9ybWFuZHkgPHRhdmlzb0Bnb29nbGUuY29tPi4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9jaGFyc2V0X2xvYWQpOiBSZWplY3QgU0lEIHZhbHVlcyBsYXJnZXIKLQl0aGFuIDY0OTk5LgotCi0yMDA5LTAzLTE5ICBWaW5jZW50IFJpY2hvbW1lICA8cmljaG9tLnZAZnJlZS5mcj4KLQotCVVwZGF0ZSBXaW5DRSBWaXN1YWwgQyBwcm9qZWN0IGZpbGVzLgotCi0JKiBidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvajogQWRkIG1pc3NpbmcgYmFzZSBleHRlbnNpb24KLQlmaWxlcy4KLQotMjAwOS0wMy0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmVtb3ZlIHVudXNlZCBXaW4zMiBjb2RlLgotCi0JKiBidWlsZHMvd2luY2UvZnRkZWJ1Zy5jOiBSZW1vdmUgY29kZSBndWFyZGVkIHdpdGggYCFfV0lOMzJfV0NFJy4KLQlTaW5jZSBXaW4zMiBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkLgotCi0yMDA5LTAzLTE5ICBWaW5jZW50IFJpY2hvbW1lICA8cmljaG9tLnZAZnJlZS5mcj4KLQotCU1ha2UgYGd6aXAnIG1vZHVsZSBjb21waWxlIG9uIFdpbkNFLgotCi0JKiBzcmMvZ3ppcC96Y29uZi5oIFtfV0lOMzJfV0NFXTogRGVmaW5lIE5PX0VSUk5PX0guCi0KLTIwMDktMDMtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJlbW92ZSB1bnVzZWQgV2luQ0UgY29kZS4KLQotCSogYnVpbGRzL3dpbjMyL2Z0ZGVidWcuYzogUmVtb3ZlIGNvZGUgZ3VhcmRlZCB3aXRoIGBfV0lOMzJfV0NFJy4KLQlTaW5jZSBXaW5DRSBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkLgotCi0yMDA5LTAzLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlkb2NtYWtlcjogRG9uJ3QgaWdub3JlIHNpbmdsZS1saW5lIGNvZGUgYmxvY2tzLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvY29udGVudC5weSAoRG9jQmxvY2s6Ol9pbml0X18pOiBGaXggY2hhbmdlIGZyb20KLQkyMDA5LTAxLTMxLgotCi0yMDA5LTAzLTE1ICBTdGV2ZSBMYW5nYXNlayAgPHN0ZXZlLmxhbmdhc2VrQGNhbm9uaWNhbC5jb20+Ci0KLQlVc2UgX19hc21fXyBmb3IgZGVjbGFyaW5nIGFzc2VtYmx5IGluc3RlYWQgb2YgYXNtLgotCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiAoRlRfTXVsRml4X2FybSk6IFVzZSBfX2FzbV9fIGluc3RlYWQgb2YKLQlhc20gb24gYXJtLCBmaXhpbmcgYSBidWlsZCBmYWlsdXJlIG9uIGFybWVsIHdpdGggLXBlZGFudGljLgotCi0yMDA5LTAzLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggdmFsZ3JpbmQgd2FybmluZy4KLQotCSogc3JjL3NmbnQvdHRzYml0MC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRfYWxpZ25lZCk6IERvbid0IHJlYWQKLQlwYXN0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLgotCi0yMDA5LTAzLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi4zLjkgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi0zLTknLgotCi0yMDA5LTAzLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlMi5pbjogTW92ZSBARlQyX0VYVFJBX0xJQlNAIHRvIGBMaWJzLnByaXZhdGUnLgotCi0yMDA5LTAzLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggc29tZSBGcmVlVHlwZSBDb3Zlcml0eSBpc3N1ZXMgYXMgcmVwb3J0ZWQgZm9yIEdob3N0c2NyaXB0LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTmV3X0ZhY2UsIEZUX05ld19NZW1vcnlfRmFjZSk6IEluaXRpYWxpemUKLQlgYXJncy5zdHJlYW0nICgjMzg3NCwgIzM4NzUpLgotCShvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbSk6IEltcHJvdmUgZXJyb3IgbWFuYWdlbWVudCAoIzM3ODYpLgotCSogc3JjL2Jhc2UvZnRtbS5jIChmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKTogRml4IGNoZWNrIG9mIGBhc2VydmljZScKLQkoIzM4NzApLgotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoZnRfc3Ryb2tlX2JvcmRlcl9nZXRfY291bnRzKTogUmVtb3ZlIGRlYWQKLQljb2RlICgjMzc5MCkuCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZ2VuZXJpYyk6IENoZWNrIGVycm9yCi0JdmFsdWUgb2YgYEZUX1N0cmVhbV9Ta2lwJyAoIzM3ODQpLgotCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9Mb2FkX0dseXBoKTogQ2hlY2sgYHNpemUnIGJlZm9yZSBhY2Nlc3NpbmcKLQlpdCAoIzM4NzIpCi0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYyAoUENGX0dseXBoX0xvYWQpOiBDaGVjayBgZmFjZScgYmVmb3JlIGFjY2Vzc2luZwotCWl0ICgjMzg3MSkuCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9tZXRyaWNzKTogSGFuZGxlIHJldHVybiB2YWx1ZSBvZgotCWBwY2ZfZ2V0X21ldHJpYycgKCMzNzg5LCAjMzc4MikuCi0JKHBjZl9nZXRfcHJvcGVydGllcyk6IFVzZSBGVF9TVFJFQU1fU0tJUCAoIzM3ODMpLgotCi0JKiBzcmMvY2FjaGUvZnRjbWFuYWcuYyAoRlRDX01hbmFnZXJfUmVnaXN0ZXJDYWNoZSk6IEZpeCBjaGVjayBvZgotCWBhY2FjaGUnICgjMzc5NykKLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfcHNfZ2V0X2ZvbnRfaW5mbyk6IEZpeCBjaGVjayBvZiBgY2ZmJwotCSgjMzc5NikuCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3ByZXBhcmUpOiBDaGVjayBgc2l6ZScgKCMzNzk1KS4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKTogQWRkIGNvbW1lbnQgKCMzNzk0KS4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9hZGRfcHJvcGVydHkpOiBDaGVjayBgZnAtPnZhbHVlLmF0b20nCi0JKCMzNzkzKS4KLQkoX2JkZl9wYXJzZV9zdGFydCk6IEFkZCBjb21tZW50ICgjMzc5MikuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoRmluYWxpemVfUHJvZmlsZV9UYWJsZSk6IENoZWNrCi0JYHJhcy5mUHJvZmlsZScgKCMzNzkxKS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKExvYWRfU0JpdF9JbWFnZSk6IFVzZSBGVF9TVFJFQU1fU0tJUCAoIzM3ODUpLgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYyAoZnRfZ3ppcF9nZXRfdW5jb21wcmVzc2VkX3NpemUpOiBQcm9wZXJseSBpZ25vcmUKLQlzZWVrIGVycm9yICgjMzc4MSkuCi0KLTIwMDktMDMtMTEgIE1pY2hhZWwgVG9mdGRhbCAgPHRvZnRkYWxAZ21haWwuY29tPgotCi0JRXh0ZW5kIENJRCBzZXJ2aWNlIGZ1bmN0aW9ucyB0byBoYW5kbGUgQ0lELWtleWVkIENGRnMgYXMgQ0lEIGZvbnRzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2lkLmggKEZUX0dldF9DSURfSXNfSW50ZXJuYWxseV9DSURfa2V5ZWQsCi0JRlRfR2V0X0NJRF9Gcm9tX0dseXBoX0luZGV4KTogTmV3IGZ1bmN0aW9ucy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oCi0JKEZUX0NJRF9HZXRJc0ludGVybmFsbHlDSURLZXllZEZ1bmMsCi0JRlRfQ0lEX0dldENJREZyb21HbHlwaEluZGV4RnVuYyk6IE5ldyBmdW5jdGlvbiB0eXBlZGVmcy4KLQkoQ0lEIFNlcnZpY2UpOiBVc2UgdGhlbS4KLQotCSogc3JjL2Jhc2UvZnRjaWQuYzogSW5jbHVkZSBGVF9DSURfSC4KLQkoRlRfR2V0X0NJRF9Jc19JbnRlcm5hbGx5X0NJRF9rZXllZCwgRlRfR2V0X0NJRF9Gcm9tX0dseXBoX0luZGV4KToKLQlOZXcgZnVuY3Rpb25zLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfaXNfY2lkLCBjZmZfZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4KToKLQlOZXcgZnVuY3Rpb25zLgotCShjZmZfc2VydmljZV9jaWRfaW5mbyk6IEFkZCB0aGVtLgotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2xvYWQpOiBEb24ndCBmcmVlIGBmb250LT5jaGFyc2V0LnNpZHMnCi0JLS0gaXQgaXMgbmVlZGVkIGZvciBhY2Nlc3MgYXMgYSBDSUQta2V5ZWQgZm9udC4gIEl0IGdldHMgZGVsZXRlZAotCWxhdGVyIG9uLgotCi0JKiBzcmMvY2lkL2NpZHJpdmVyLmMgKGNpZF9nZXRfaXNfY2lkLCBjaWRfZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4KToKLQlOZXcgZnVuY3Rpb25zLgotCShjaWRfc2VydmljZV9jaWRfaW5mbyk6IEFkZCB0aGVtLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDktMDMtMTEgIEJyYW0gVGFzc3lucyAgPGJyYW10QGVuZm9jdXMuYmU+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyNTU5Ny4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfcmVhbCk6IERvbid0IGFsbG93IGZyYWN0aW9uX2xlbmd0aAotCXRvIGJlY29tZSBsYXJnZXIgdGhhbiA5LgotCi0yMDA5LTAzLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyNTgxNC4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluOiBBcyBzdWdnZXN0ZWQgaW4gdGhlIGJ1ZyByZXBvcnQsIG1vdmUKLQlATElCWkAgdG8gYExpYnMucHJpdmF0ZScuCi0KLTIwMDktMDMtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI1NzgxLgotCVdlIG5vdyBzaW1wbHkgY2hlY2sgZm9yIGEgdmFsaWQgYG9mZnNldCcsIG5vIGxvbmdlciBoYW5kbGluZyBgZGVsdGEKLQk9IDEnIHNwZWNpYWxseS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X3ZhbGlkYXRlKTogRG9uJ3QgY2hlY2sgYGRlbHRhJyBmb3IKLQlsYXN0IHNlZ21lbnQuCi0JKHR0X2NtYXA0X3NldF9yYW5nZSwgdHRfY21hcDRfY2hhcl9tYXBfbGluZWFyLAotCXR0X2NtYXA0X2NoYXJfbWFwX2JpbmFyeSk6IENoZWNrIG9mZnNldC4KLQotMjAwOS0wMy0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9KYW1maWxlOiBGaXggaGFuZGxpbmcgb2YgZnRhZHZhbmMuYy4KLQlSZXBvcnRlZCBieSBPcmFuIEFncmEgPG9yYW5AbW9uZm9ydC5jby5pbD4uCi0KLTIwMDktMDMtMTAgIFZpbmNlbnQgUmljaG9tbWUgIDxyaWNob20udkBmcmVlLmZyPgotCi0JUmVzdHJ1Y3R1cmUgV2luMzIgYW5kIFdpbmNlIGNvbXBpbGVyIHN1cHBvcnQuCi0KLQkqIHNyYy9idWlsZHMvd2luMzI6IFJlbW92ZSBmaWxlcyBmb3IgV2luQ0UuCi0JTW92ZSBWQyAyMDA1IHN1cHBvcnQgdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkuCi0JQWRkIGRpcmVjdG9yeSBmb3IgVkMgMjAwOCBzdXBwb3J0LgotCi0JKiBzcmMvYnVpbGRzL3dpbmNlOiBOZXcgZGlyZWN0b3J5IGhpZXJhcmNoeSBmb3IgV2luQ0UgY29tcGlsZXJzCi0JKFZDIDIwMDUgYW5kIFZDIDIwMDgpLgotCi0yMDA5LTAzLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNb3JlIHByZXBhcmF0aW9ucyBmb3IgMi4zLjkgcmVsZWFzZS4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0JKiBKYW1maWxlLCBSRUFETUU6IHMvMi4zLjgvMi4zLjkvLCBzLzIzOC8yMzkvLgotCi0yMDA5LTAzLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3J1bGVzLm1rIChTRk5UX0RSVl9IKTogQWRkIHR0c2JpdDAuYy4KLQotMjAwOS0wMy0wOSAgQWxleGV5IEtyeXVrb3YgIDxhbmFnbm9zdEB5YW5kZXgucnU+Ci0KLQlGaXggaGFuZGxpbmcgb2YgRUJEVCBmb3JtYXRzIDggYW5kIDkgKHBhcnQgMikuCi0KLQlUaGlzIHBhdGNoIGZpeGVzIHRoZSBmb2xsb3dpbmcgcHJvYmxlbXMgaW4gdHRzYml0MC5jOgotCi0JLiBCaXRtYXBzIGZvciBjb21wb3VuZCBnbHlwaHMgd2VyZSBuZXZlciBhbGxvY2F0ZWQuCi0KLQkuIGBTQml0RGVjb2RlcicgcmVmdXNlZCB0byBsb2FkIG1ldHJpY3MgaWYgc29tZSBvdGhlciBtZXRyaWNzIGhhdmUKLQkgIGFscmVhZHkgYmVlbiBsb2FkZWQuICBUaGlzIGNvbmRpdGlvbiBjZXJ0YWlubHkgbWFrZXMgbm8gc2Vuc2UgZm9yCi0JICByZWN1cnNpdmUgY2FsbHMsIHNvIEkndmUganVzdCBkaXNhYmxlZCBpdC4gIEFub3RoZXIgcG9zc2liaWxpdHkKLQkgIHdvdWxkIGJlIHJlc2V0dGluZyBgZGVjb2Rlci0+bWV0cmljc19sb2FkZWQnIHRvIGZhbHNlIGJlZm9yZQotCSAgbG9hZGluZyBlYWNoIGNvbXBvc2l0ZSBjb21wb25lbnQuICBIb3dldmVyLCB3ZSBtdXN0IHJlc3RvcmUgdGhlCi0JICBvcmlnaW5hbCBtZXRyaWNzIGFmdGVyIGZpbmlzaGluZyB0aGUgcmVjdXJzaW9uOyBvdGhlcndpc2Ugd2UgY2FuCi0JICBnZXQgYSBtaXNhbGlnbmVkIGdseXBoLgotCi0JLiBgdHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQnIGluY29ycmVjdGx5IGhhbmRsZWQgYHhfcG9zJywKLQkgIGNhdXNpbmcgc29tZSBnbHlwaCBjb21wb25lbnRzIHRvIGJlIHNoaWZ0ZWQgdG9vIGZhciB0byB0aGUgcmlnaHQKLQkgIChlc3BlY2lhbGx5IG5vdGljZWFibGUgZm9yIHNtYWxsIHNpemVzKS4KLQotCU5vdGUgdGhhdCBzdXBwb3J0IGZvciBncmF5c2NhbGUgYml0bWFwcyAobm90IG5lY2Vzc2FyaWx5IGNvbXBvdW5kKSBpcwotCWNvbXBsZXRlbHkgYnJva2VuIGluIHR0c2JpdDAuYy4KLQotCSogc3JjL3NmbnQvdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljczogQWx3YXlzIGxvYWQgbWV0cmljcy4KLQkodHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQpOiBIYW5kbGUgYHhfcG9zJyBjb3JyZWN0bHkgaW4gY2FzZQotCW9mIGBoID09IGhlaWdodCcuCi0JKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2NvbXBvdW5kKTogUmVzZXQgbWV0cmljcyBhZnRlciBsb2FkaW5nCi0JY29tcG9uZW50cy4KLQlBbGxvY2F0ZSBiaXRtYXAuCi0KLTIwMDktMDMtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDk6MjA6My4KLQotMjAwOS0wMy0wMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JUHJvdGVjdCBTRk5UIGtlcm5pbmcgdGFibGUgcGFyc2VyIGFnYWluc3QgbWFsZm9ybWVkIHRhYmxlcy4KLQotCVRoaXMgY2xvc2VzIFNhdmFubmFoIEJVRyAjMjU3NTAuCi0KLQkqIHNyYy9zZm50L3R0a2Vybi5jICh0dF9mYWNlX2xvYWRfa2VybiwgdHRfZmFjZV9nZXRfa2VybmluZyk6IEZpeCBhCi0JYnVnIHdoZXJlIGEgbWFsZm9ybWVkIHRhYmxlIHdvdWxkIGJlIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYnV0IGxhdGVyCi0JY3Jhc2ggdGhlIGVuZ2luZSBkdXJpbmcgcGFyc2luZy4KLQotMjAwOS0wMy0wMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi4zLjkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogQnVtcCBwYXRjaCB2ZXJzaW9uIHRvIDkuCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IHRoZSBBQkkgYnJlYWsgaW4gMi4zLjguCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgdmVyc2lvbiBudW1iZXJzIHRhYmxlIGZvciAyLjMuOS4KLQotMjAwOS0wMy0wMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JUmVtb3ZlIEFCSS1icmVha2luZyBmaWVsZCBpbiBwdWJsaWMgUFNfSW5mb0ZvbnRSZWMgZGVmaW5pdGlvbi4KLQotCUluc3RlYWQsIHdlIGRlZmluZSBhIG5ldyBpbnRlcm5hbCBQU19Gb250RXh0cmFSZWMgc3RydWN0dXJlIHRvCi0JaG9sZCB0aGUgYWRkaXRpb25hbCBmaWVsZCwgdGhlbiBwbGFjZSBpdCBpbiB2YXJpb3VzIGludGVybmFsCi0JcG9zaXRpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nIEZUX0ZhY2UgZGVyaXZlZCBvYmplY3RzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmggKFBTX0ZvbnRJbmZvUmVjKTogUmVtb3ZlIHRoZQotCWBmc190eXBlJyBmaWVsZCBmcm9tIHRoZSBwdWJsaWMgc3RydWN0dXJlLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9GaWVsZExvY2F0aW9uKTogTmV3Ci0JZW51bWVyYXRpb24gYFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRVhUUkEnLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggKFBTX0ZvbnRFeHRyYVJlYyk6IE5ldwotCXN0cnVjdHVyZS4KLQkoVDFfRm9udFJlYywgQ0lEX0ZhY2VSZWMpOiBBZGQgaXQuCi0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfbG9hZF9rZXl3b3JkKTogSGFuZGxlCi0JVDFfRklFTERfTE9DQVRJT05fRk9OVF9FWFRSQS4KLQkqIHNyYy9jaWQvY2lkdG9rZW4uaCwgc3JjL3R5cGUxL3QxdG9rZW5zLmgsIHNyYy90eXBlNDIvdDQycGFyc2UuYzoKLQlBZGp1c3QgRlRfU1RSVUNUVVJFIGFuZCBUMUNPREUgcHJvcGVybHkgdG8gaGFuZGxlIGBGU1R5cGUnLgotCSogc3JjL3R5cGUxL3QxbG9hZC5jICh0MV9sb2FkX2tleXdvcmQpOiBIYW5kbGUKLQlUMV9GSUVMRF9MT0NBVElPTl9GT05UX0VYVFJBLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmggKFBzSW5mbyBzZXJ2aWNlKToKLQlBZGQgYFBTX0dldEZvbnRFeHRyYUZ1bmMnIGZ1bmN0aW9uIHR5cGVkZWYuCi0KLQkqIHNyYy9iYXNlL2Z0ZnN0eXBlLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9IIGFuZAotCUZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0guCi0JKEZUX0dldF9GU1R5cGVfRmxhZ3MpOiBVc2UgUE9TVFNDUklQVF9JTkZPIHNlcnZpY2UuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3NlcnZpY2VfcHNfaW5mbyk6IFVwZGF0ZWQuCi0JKiBzcmMvY2lkL2NpZHJpdmVyLmMgKGNpZF9wc19nZXRfZm9udF9leHRyYSk6IE5ldyBmdW5jdGlvbi4KLQkoY2lkX3NlcnZpY2VfcHNfaW5mbyk6IFVwZGF0ZWQuCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYyAodDFfcHNfZ2V0X2ZvbnRfZXh0cmEpOiBOZXcgZnVuY3Rpb24uCi0JKHQxX3NlcnZpY2VfcHNfaW5mbyk6IFVwZGF0ZWQuCi0JKiBzcmMvdHlwZTQyL3Q0MmRyaXZyLmMgKHQ0Ml9wc19nZXRfZm9udF9leHRyYSk6IE5ldyBmdW5jdGlvbi4KLQkodDQyX3NlcnZpY2VfcHNfaW5mbyk6IFVwZGF0ZWQuCi0KLTIwMDktMDMtMDIgIEFsZXhleSBLcnl1a292ICA8YW5hZ25vc3RAeWFuZGV4LnJ1PgotCi0JRml4IGhhbmRsaW5nIG9mIEVCRFQgZm9ybWF0cyA4IGFuZCA5LgotCi0JVGhlIG1haW4gY3ljbGUgaW4gYGJsaXRfc2JpdCcgbWFrZXMgdG9vIG1hbnkgaXRlcmF0aW9uczogaXQgYWN0dWFsbHkKLQluZWVkcyB0aGUgY291bnQgb2YgbGluZXMgaW4gdGhlIHNvdXJjZSBiaXRtYXAgcmF0aGVyIHRoYW4gaW4gdGhlCi0JdGFyZ2V0IGltYWdlLgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAoYmxpdF9zYml0KSBbRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTXToKLQlBZGQgcGFyYW1ldGVyIGBzb3VyY2VfaGVpZ2h0JyBhbmQgdXNlIGl0IGZvciBtYWluIGxvb3AuCi0JKExvYWRfU0JpdF9TaW5nbGUpIFtGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFNdOiBVcGRhdGVkLgotCi0yMDA5LTAyLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyNTY2OS4KLQotCSogc3JjL2Jhc2UvZnRhZHZhbmMuaCAoRlRfR2V0X0FkdmFuY2VzKTogRml4IHNlcmlvdXMgdHlwby4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1NlbGVjdF9NZXRyaWNzLCBGVF9SZXF1ZXN0X01ldHJpY3MpOiBGaXgKLQlzY2FsaW5nIGZhY3RvciBmb3Igbm9uLXNjYWxhYmxlIGZvbnRzLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfYWR2YW5jZXMpOiBVc2UgY29ycmVjdCBhZHZhbmNlIHdpZHRoCi0JdmFsdWUgdG8gcHJldmVudCBpbmNvcnJlY3Qgc2NhbGluZy4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBpdC4KLQotMjAwOS0wMi0xNSAgTWF0dCBHb2Rib2x0ICA8bWF0dEBnb2Rib2x0Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI1NTg4LgotCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiAoRlRfTXVsRml4X2FybSk6IFVzZSBjb3JyZWN0IHN5bnRheCBmb3IKLQlgb3JyJyBpbnN0cnVjdGlvbi4KLQotMjAwOS0wMi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2NoZWNrX3RyaWNreW5lc3MpOiBBZGQgYERGS2FpU2h1Jy4KLQlSZXBvcnRlZCBieSBEYXZpZCBCZXZhbiA8ZGJldmFuQGVtdGV4LmNvbT4uCi0KLTIwMDktMDItMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI1NDk1LgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBUZXN0IGZvciBiaXRtYXAgc3RyaWtlcyBiZWZvcmUKLQlzZXR0aW5nIG1ldHJpY3MgYW5kIGJib3ggdmFsdWVzLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGNoZWNrIGZvciBhCi0JZm9udCB3aXRoIG5laXRoZXIgYSBgZ2x5ZicgdGFibGUgbm9yIGJpdG1hcCBzdHJpa2VzIGNhbiBiZSBwZXJmb3JtZWQKLQllYXJseSBlbm91Z2ggdG8gc2V0IG1ldHJpY3MgYW5kIGJib3ggdmFsdWVzIHRvby4KLQotMjAwOS0wMi0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMjU0ODAuCi0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbjogRm9yIC0tZnR2ZXJzaW9uLCBkb24ndCB1c2UgJHByZWZpeAotCWJ1dCAkaW5jbHVkZWRpci4KLQotMjAwOS0wMS0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWlub3IgZG9jbWFrZXIgaW1wcm92ZW1lbnRzLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvY29udGVudC5weSAoRG9jQmxvY2s6Ol9faW5pdF9fKTogSWdub3JlIGVtcHR5Ci0JY29kZSBibG9ja3MuCi0KLTIwMDktMDEtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTQ0FOQ1RSTCBoYW5kbGluZyBpbiBUVEZzLgotCVByb2JsZW0gcmVwb3J0ZWQgYnkgQWxleGV5IEtyeXVrb3YgPGFuYWdub3N0QHlhbmRleC5ydT4uCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfU0NBTkNUUkwpOiBGaXggdGhyZXNob2xkIGhhbmRsaW5nLgotCi0yMDA5LTAxLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNb3ZlIEZUX0dldF9GU1R5cGVfRmxhZ3MgdG8gYSBzZXBhcmF0ZSBmaWxlLgotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTWlja2V5IEdhYmVsIDxtaWNrZXlAbW9uZm9ydC5jby5pbD4uCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfRlNUeXBlX0ZsYWdzKTogTW92ZSB0by4uLgotCSogc3JjL2Jhc2UvZnRmc3R5cGUuYzogVGhpcyBuZXcgZmlsZS4KLQotCSogbW9kdWxlcy5jZmcgKEJBU0VfRVhURU5TSU9OKTogQWRkIGZ0ZnN0eXBlLmMuCi0KLQkqIGRvY3MvSU5TVEFMTC5BTlk6IFVwZGF0ZWQuCi0KLQkqIGJ1aWxkcy9tYWMvKi50eHQsIGJ1aWxkcy9hbWlnYS8qbWFrZWZpbGUqLAotCWJ1aWxkcy93aW4zMi97dmlzdWFsYyx2aXN1YWxjZX0vZnJlZXR5cGUuKiwgYnVpbGRzL3N5bWJpYW4vKjoKLQlVcGRhdGVkLgotCi0yMDA5LTAxLTIyICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZHMvdW5peC9mdHN5c3RlbS5jIChGVF9TdHJlYW1fT3Blbik6IEZpeCAyIGVycm9yCi0JbWVzc2FnZXMgZW5kaW5nIHdpdGhvdXQgIlxuIi4KLQotMjAwOS0wMS0yMiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI1MzQ3LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAob3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW0pOiBSZXdpbmQKLQl0aGUgc3RyZWFtIHRvIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiwKLQl3aGVuIGZ0X2xvb2t1cF9QU19pbl9zZm50X3N0cmVhbSgpIGZhaWxlZC4KLQkoTWFjX1JlYWRfc2ZudF9SZXNvdXJjZSk6IFJld2luZCB0aGUgc3RyZWFtIHRvIHRoZSBoZWFkIG9mCi0Jc2ZudCByZXNvdXJjZSBib2R5LCB3aGVuIG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCkKLQlmYWlsZWQuCi0KLTIwMDktMDEtMTkgIE1pY2hhZWwgTG90eiAgPG1tbHJAbWxvdHouY2g+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMyNTM1NS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCAoRlRfTXVsRml4X2kzODYpOiBNYWtlCi0JYXNzZW1ibGVyIGNvZGUgd29yayB3aXRoIGdjYyAyLjk1LjMgKGFzIHVzZWQgYnkgdGhlIEhhaWt1IHByb2plY3QpLgotCUFkZCBgY2MnIHJlZ2lzdGVyIHRvIHRoZSBjbG9iYmVyIGxpc3QuCi0KLTIwMDktMDEtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVByb3RlY3QgRlRfR2V0X05leHRfQ2hhci4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X3NldF9yYW5nZSk6IEFwcGx5IGZpeCBzaW1pbGFyIHRvCi0JY2hhbmdlIGZyb20gMjAwOC0wNy0yMi4KLQotCVBhdGNoIGZyb20gUm9uZW4gR2hvc2hhbCA8cmdob3NoYWxAZW10ZXguY29tPi4KLQotMjAwOS0wMS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSW1wbGVtZW50IEZUX0dldF9OYW1lX0luZGV4IGZvciBTRk5UIGRyaXZlci4KLQotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9nZXRfbmFtZV9pbmRleCk6IE5ldyBmdW5jdGlvbi4KLQkoc2ZudF9zZXJ2aWNlX2dseXBoX2RpY3QpOiBVc2UgaXQuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IFRydWMgVHJ1b25nIDx0cnVjdHZAbmVjc3YuY29tPi4KLQotMjAwOS0wMS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlLmggKEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyKTogRml4Ci0JZG9jdW1lbnRhdGlvbi4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgVHJ1YyBUcnVvbmcgPHRydWN0dkBuZWNzdi5jb20+LgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDktMDEtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjMuOCByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTMtOCcuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi4zLjguCi0KLQkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwgYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvajogcy8yLjMuNy8yLjMuOC8sIHMvMjM3LzIzOC8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gOC4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDk6MTk6My4KLQotCSogZG9jcy9yZWxlYXNlOiBVcGRhdGVkLgotCi0yMDA5LTAxLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy90b3BsZXZlbC5tayAoZGlzdCk6IENvbXByZXNzIGJldHRlci4KLQotMjAwOS0wMS0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X0ZTVHlwZV9GbGFncyk6IENhc3QgZm9yIGNvbXBpbGF0aW9uCi0Jd2l0aCBDKysuCi0KLTIwMDktMDEtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCURvbid0IHVzZSBzdGRsaWIuaCBhbmQgZnJpZW5kcyBkaXJlY3RseS4KLQlSZXBvcnRlZCBieSBNaWNrZXkgR2FiZWwgPG1pY2tleUBtb25mb3J0LmNvLmlsPi4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYzogcy88c3RkbGliLmg+L0ZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gvLgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYywgc3JjL2x6dy9mdGx6dy5jLCBzcmMvcmFzdGVyL2Z0bWlzYy5oOgotCXMvPHN0cmluZy5oPi9GVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ILy4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oLCBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMsCi0Jc3JjL3BzaGludGVyL3BzaGFsZ28uYzogcy88c3RkaW8uaD4vRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSC8KLQotCSogc3JjL2x6dy9mdGx6dy5jLCBzcmMvYmFzZS9mdGRiZ21lbS5jOiBEb24ndCBpbmNsdWRlIHN0ZGlvLmguCi0KLTIwMDktMDEtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiAqLyo6IHMvZG8gOyB3aGlsZSAoIDAgKS9kbyB7IH0gd2hpbGUgKCAwICkvLgotCVJlcG9ydGVkIGJ5IFNlYW4gTWNCcmlkZSA8c2VhbkByb2d1ZS1yZXNlYXJjaC5jb20+LgotCi0yMDA5LTAxLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggc3RkbGliIGRlcGVuZGVuY2llcy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTWlja2V5IEdhYmVsIDxtaWNrZXlAbW9uZm9ydC5jby5pbD4uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmggKGZ0X2V4aXQpOiBSZW1vdmVkLiAgVW51c2VkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMsIHNyYy9iYXNlL2Z0bGNkZmlsLmMsIHNyYy9zbW9vdGgvZnRzbW9vdGguYzoKLQlzL21lbWNweS9mdF9tZW1jcHkvLgotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmM6IHMvbWVtc2V0L2Z0X21lbXNldC8sIHMvbWVtY3B5L2Z0X21lbWNweS8uCi0KLTIwMDktMDEtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9mb3JtYXRzLnR4dDogQWRkIGxpbmsgdG8gUENGIHNwZWNpZmljYXRpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRiZGYuaCAoRlRfR2V0X0JERl9Qcm9wZXJ0eSk6IEltcHJvdmUKLQlkb2N1bWVudGF0aW9uLgotCi0yMDA5LTAxLTA5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdGFkdmFuYy5jIChfZnRfZmFjZV9zY2FsZV9hZHZhbmNlcywgRlRfR2V0X0FkdmFuY2UsCi0JRlRfR2V0X0FkdmFuY2VzKTogQ2hhbmdlIHRoZSB0eXBlIG9mIGxvYWRfZmxhZ3MgZnJvbSBGVF9VSW50MzIgdG8KLQlGVF9JbnQzMiwgdG8gbWF0Y2ggd2l0aCB0aGUgZmxhZ3MgZm9yIEZUX0xvYWRfR2x5cGgoKS4KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9hZHZhbmNlcyk6IERpdHRvLgotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X2dldF9hZHZhbmNlcyk6IERpdHRvLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oIChGVF9HZXRfQWR2YW5jZSwgRlRfR2V0X0FkdmFuY2VzKToKLQlEaXR0by4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaCAoRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMpOgotCURpdHRvLgotCi0yMDA5LTAxLTA5ICBEYW5pZWwgWmltbWVybWFubiAgPG5ldHppbW1lQGFvbC5jb20+Ci0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQuYyAoZ3h2X21vcnRfZmVhdHVyZV92YWxpZGF0ZSk6IEZpeCB3cm9uZwotCWxlbmd0aCBjaGVjay4gIEZyb20gU2F2YW5uYWggcGF0Y2ggIzY2ODIuCi0KLTIwMDktMDEtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBwcm9ibGVtIHdpdGggVDFfRklFTERfe05VTSxGSVhFRH1fVEFCTEUyLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX3BhcnNlcl9sb2FkX2ZpZWxkX3RhYmxlKTogRG9uJ3QgaGFuZGxlCi0JYGNvdW50X29mZnNldCcgaWYgaXQgaXMgemVybyAoaS5lLiwgdW51c2VkKS4gIE90aGVyd2lzZSwgdGhlIGZpcnN0Ci0JZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlIHdoaWNoIGhvbGRzIHRoZSBkYXRhIGlzIGVycm9uZW91c2x5Ci0JbW9kaWZpZWQuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IENoaSBOZ3V5ZW4gPGNoaW50QG5lY3N2LmNvbT4uCi0KLTIwMDktMDEtMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0YWR2YW5jLmMgKF9mdF9mYWNlX3NjYWxlX2FkdmFuY2VzLCBGVF9HZXRfQWR2YW5jZSwKLQlGVF9HZXRfQWR2YW5jZXMpOiBFeHRlbmQgdGhlIHR5cGUgb2YgbG9hZF9mbGFncyBmcm9tIEZUX1VJbnQgdG8KLQlGVF9VSW50MzIsIHRvIHBhc3MgMzItYml0IGZsYWdzIG9uIDE2Yml0IHBsYXRmb3Jtcy4KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9hZHZhbmNlcyk6IERpdHRvLgotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X2dldF9hZHZhbmNlcyk6IERpdHRvLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oIChGVF9HZXRfQWR2YW5jZSwgRlRfR2V0X0FkdmFuY2VzKToKLQlEaXR0by4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaCAoRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMpOgotCURpdHRvLgotCi0yMDA5LTAxLTA5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfRG9uZV9MaWJyYXJ5KTogSXNzdWUgYW4gZXJyb3IgbWVzc2FnZSB3aGVuCi0JRlRfRG9uZV9GYWNlKCkgY2Fubm90IGZyZWUgYWxsIGZhY2VzLiBJZiB0aGUgbGlzdCBvZiB0aGUgb3BlbmVkCi0JZmFjZXMgaW5jbHVkZXMgYnJva2VuIGZhY2Ugd2hpY2ggRlRfRG9uZV9GYWNlKCkgY2Fubm90IGZyZWUsCi0JRlRfRG9uZV9MaWJyYXJ5KCkgcmV0cmllcyBGVF9Eb25lX0ZhY2UoKSBhbmQgaXQgY2FuIGZhbGwgaW50bwotCWFuIGVuZGxlc3MgbG9vcC4gU2VlIHRoZSBkaXNjdXNzaW9uOgotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA4LTA5L21zZzAwMDQ3Lmh0bWwKLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAwOC0xMC9tc2cwMDAwMC5odG1sCi0KLTIwMDktMDEtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBuZXcga2V5IGBhJyBpbiBmdGRpZmYuCi0KLTIwMDktMDEtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYXV0b2dlbi5zaDogRG9uJ3QgdXNlIEdOVWlzbXMgd2hpbGUgY2FsbGluZyBzZWQuICBQcm9ibGVtIHJlcG9ydGVkCi0JYnkgU2VhbiBNY0JyaWRlLgotCi0yMDA5LTAxLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKEZUX0JpdG1hcF9Db252ZXJ0KTogSGFuZGxlIEZUX1BJWEVMX01PREVfTENECi0JYW5kIEZUX1BJWEVMX01PREVfTENEX1YuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IENoaSBOZ3V5ZW4KLQk8Y2hpbnRAbmVjc3YuY29tPi4KLQotMjAwOS0wMS0wNiAgRGllZ28gUGV0dGVuw7IgIDxmbGFtZWV5ZXNAZ21haWwuY29tPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBEb24ndCBjYWxsIEFDX0NBTk9OSUNBTF9CVUlMRCBhbmQKLQlBQ19DQU5PTklDQUxfVEFSR0VUIGFuZCB1c2UgJGhvc3Rfb3Mgb25seS4gIEEgbmljZSBleHBsYW5hdGlvbiBmb3IKLQl0aGlzIGNoYW5nZSBjYW4gYmUgZm91bmQgYXQKLQlodHRwOi8vYmxvZy5mbGFtZWV5ZXMuZXUvcy9jYW5vbmljYWwtdGFyZ2V0LgotCi0JRnJvbSBTYXZhbm5haCBwYXRjaCAjNjcxMi4KLQotMjAwOS0wMS0wNiAgU2VhbiBNY0JyaWRlICA8c2VhbkByb2d1ZS1yZXNlYXJjaC5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKF9kZWJ1Z19tZW1fZHVtbXkpOiBNYWtlIGl0IHN0YXRpYy4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYzogUmVtb3ZlIHNvbWUgI3VuZGVmcy4KLQotMjAwOC0xMi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JU2V0IGBmYWNlX2luZGV4JyBmaWVsZCBpbiBGVF9GYWNlIGZvciBhbGwgZm9udCBmb3JtYXRzLgotCi0JKiBjZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KSwgd2luZm9udHMvd2luZm50LmMgKEZOVF9GYWNlX0luaXQpLAotCXNmbnQvc2ZvYmpzLmMgKHNmbnRfaW5pdF9mYWNlKTogRG8gaXQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgaXQuCi0KLTIwMDgtMTItMjIgIFN0ZXZlIEdydWJiCi0KLQkqIGJ1aWxkcy91bml4L2Z0c3lzdGVtLmMgKEZUX1N0cmVhbV9PcGVuKTogUmVqZWN0IHplcm8tbGVuZ3RoIGZpbGVzLgotCVBhdGNoIGZyb20gU2F2YW5uYWggYnVnICMyNTE1MS4KLQotMjAwOC0xMi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcGZyL3BmcmRyaXZyLmMsIHNyYy93aW5mb250cy93aW5mbnQuYywgc3JjL2NhY2hlL2Z0Y21hbmFnLmMsCi0Jc3JjL3Ntb290aC9mdGdyYXlzLmMsIHNyYy9iYXNlL2Z0b2Jqcy5jLCBzcmMvc2ZvYmpzLmM6Ci0Jcy9fRXJyX0JhZF9Bcmd1bWVudC9fRXJyX0ludmFsaWRfQXJndW1lbnQvLiAgVGhlIGZvcm1lciBpcyBmb3IKLQllcnJvcnMgaW4gdGhlIGJ5dGVjb2RlIGludGVycHJldGVyIG9ubHkuCi0KLTIwMDgtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRwZnIuYyAoRlRfR2V0X1BGUl9NZXRyaWNzKTogUHJvdGVjdCBhZ2FpbnN0IE5VTEwKLQlhcmd1bWVudHMuCi0JRml4IHJldHVybiB2YWx1ZSBmb3Igbm9uLVBGUiBmb250cy4gIEJvdGggcHJvYmxlbXMgcmVwb3J0ZWQgYnkgQ2hpCi0JTmd1eWVuIDxjaGludEBuZWNzdi5jb20+LgotCi0yMDA4LTEyLTIxICBhbm9ueW1vdXMKLQotCUZUX1VTRV9NT0RVTEUgZGVjbGFyZXMgdGhpbmdzIGFzOgotCi0JICBleHRlcm4gY29uc3QgRlRfTW9kdWxlX0NsYXNzCi0KLQkob3Igc2ltaWxhciBmb3IgQysrKS4gIEhvd2V2ZXIsIHRoZSBhY3R1YWwgdHlwZXMgb2YgdGhlIHZhcmlhYmxlcwotCWJlaW5nIGRlY2xhcmVkIGFyZSBvZnRlbiBkaWZmZXJlbnQsIGUuZy4sIEZUX0RyaXZlcl9DbGFzc1JlYyBvcgotCUZUX1JlbmRlcmVyX0NsYXNzLiAgKFNvbWUgYXJlLCBpbmRlZWQsIEZUX01vZHVsZV9DbGFzcy4pCi0KLQlUaGlzIHdvcmtzIHdpdGggbW9zdCBDIGNvbXBpbGVycyAoc2luY2UgdGhvc2Ugc3RydWN0cyBiZWdpbiB3aXRoIGFuCi0JRlRfTW9kdWxlX0NsYXNzIHN0cnVjdCksIGJ1dCB0ZWNobmljYWxseSBpdCdzIHVuZGVmaW5lZCBiZWhhdmlvci4KLQotCVRvIHF1b3RlIHRoZSBJU08vSUVDIDk4OTk6VEMyIGZpbmFsIGNvbW1pdHRlZSBkcmFmdCwgc2VjdGlvbiA2LjIuNwotCXBhcmFncmFwaCAyOgotCi0JICBBbGwgZGVjbGFyYXRpb25zIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IG9yIGZ1bmN0aW9uIHNoYWxsCi0JICBoYXZlIGNvbXBhdGlibGUgdHlwZTsgb3RoZXJ3aXNlLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgotCi0JKEFuZCB0aGV5IGFyZSBub3QgY29tcGF0aWJsZSB0eXBlcy4pCi0KLQlNb3N0IEMgY29tcGlsZXJzIGRvbid0IHJlamVjdCAob3IgZXZlbiBkZXRlY3QhKSBjb2RlIHdoaWNoIGhhcyB0aGlzCi0JaXNzdWUsIGJ1dCB0aGUgR0NDIExUTyBkZXZlbG9wbWVudCBicmFuY2ggY29tcGlsZXIgZG9lcy4gIChJdAotCW91dHB1dHMgdGhlIHR5cGVzIG9mIHRoZSBvYmplY3RzIHdoaWxlIGdlbmVyYXRpbmcgLm8gZmlsZXMsIGFsb25nCi0Jd2l0aCBhIGJ1bmNoIG9mIG90aGVyIGluZm9ybWF0aW9uLCB0aGVuIGNvbXBhcmVzIHRoZW0gd2hlbiBkb2luZyB0aGUKLQlmaW5hbCBsaW5rLXRpbWUgY29kZSBnZW5lcmF0aW9uIHBhc3MuKQotCi0JUGF0Y2ggZnJvbSBTYXZhbm5haCBidWcgIzI1MTMzLgotCi0JKiBzcmMvYmFzZS9mdGluaXQuYyAoRlRfVVNFX01PRFVMRSk6IEluY2x1ZGUgdmFyaWFibGUgdHlwZS4KLQotCSogYnVpbGRzL2FtaWdhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCwgKi9tb2R1bGUubWs6IFVwZGF0ZWQgdG8gZGVjbGFyZQotCXBhc3MgY29ycmVjdCB0eXBlcyB0byBGVF9VU0VfTU9EVUxFLgotCi0yMDA4LTEyLTIxICBIb25nYm8gTmkgIDxob25nYm9AbmpzdGFyLmNvbT4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50X2VkZ2VzKSwKLQlzcmMvYXV0b2ZpdC9hZmxhdGluMi5jIChhZl9sYXRpbjJfaGludF9lZGdlcyksIHNyYy9hdXRvZml0L2FmY2prLmMKLQkoYWZfY2prX2hpbnRfZWRnZXMpOiBQcm90ZWN0IGFnYWluc3QgZGl2aXNpb24gYnkgemVyby4gIFRoaXMgZml4ZXMKLQlTYXZhbm5haCBidWcgIzI1MTI0LgotCi0yMDA4LTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwOC0xMi0xOCAgRGF2aWQgQmV2YW4gIDxkYmV2YW5AZW10ZXguY29tPgotCi0JUHJvdmlkZSBBUEkgZm9yIGFjY2Vzc2luZyBlbWJlZGRpbmcgYW5kIHN1YnNldHRpbmcgcmVzdHJpY3Rpb24KLQlpbmZvcm1hdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS5oIChGVF9GU1RZUEVfSU5TVEFMTEFCTEVfRU1CRURESU5HLAotCUZUX0ZTVFlQRV9SRVNUUklDVEVEX0xJQ0VOU0VfRU1CRURESU5HLAotCUZUX0ZTVFlQRV9QUkVWSUVXX0FORF9QUklOVF9FTUJFRERJTkcsIEZUX0ZTVFlQRV9FRElUQUJMRV9FTUJFRERJTkcsCi0JRlRfRlNUWVBFX05PX1NVQlNFVFRJTkcsIEZUX0ZTVFlQRV9CSVRNQVBfRU1CRURESU5HX09OTFkpOiBOZXcKLQltYWNyb3MuCi0JKEZUX0dldF9GU1R5cGVfRmxhZ3MpOiBOZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24uCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfRlNUeXBlX0ZsYWdzKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzcmMvY2lkL2NpZHRva2VuLmgsIHNyYy90eXBlMS90MXRva2Vucy5oLCBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMKLQkodDQyX2tleXdvcmRzKTogSGFuZGxlIGBGU1R5cGUnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmggKFBTX0ZvbnRJbmZvUmVjKTogQWRkIGBmc190eXBlJyBmaWVsZC4KLQotMjAwOC0xMi0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHN5bnRoLmMgKEZUX0dseXBoU2xvdF9FbWJvbGRlbik6IERvbid0IHVzZSBpbnRlcm5hbAotCW1hY3JvcyBzbyB0aGF0IGNvcHlpbmcgdGhlIHNvdXJjZSBjb2RlIGludG8gYW4gYXBwbGljYXRpb24gd29ya3MKLQlvdXQgb2YgdGhlIGJveC4KLQotMjAwOC0xMi0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaCwgc3JjL2Jhc2UvZnRzeW50aC5jOiBNb3ZlCi0JRlRfR2x5cGhTbG90X093bl9CaXRtYXAgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaCwgc3JjL2Jhc2UvZnRiaXRtYXAuYzogVGhlc2UgZmlsZXMuCi0KLQkqIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgaXQuCi0KLTIwMDgtMTItMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUdlbmVyYWxpemUgdGhlIGNvbmNlcHQgb2YgYHRyaWNreScgZm9udHMgYnkgaW50cm9kdWNpbmcKLQlGVF9GQUNFX0ZMQUdfVFJJQ0tZIHRvIGluZGljYXRlIHRoYXQgdGhlIGZvbnQgZm9ybWF0J3MgaGludGluZwotCWVuZ2luZSBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3QgcmVuZGVyaW5nLgotCi0JQXQgdGhlIHNhbWUgdGltZSwgc2xpZ2h0bHkgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdHJpY2t5IGZvbnRzOgotCUZUX0xPQURfTk9fSElOVElORyBpcyBub3cgaWdub3JlZC4gIFRvIHJlYWxseSBmb3JjZSByYXcgbG9hZGluZwotCW9mIHRyaWNreSBmb250cyAod2l0aG91dCBoaW50aW5nKSwgYm90aCBGVF9MT0FEX05PX0hJTlRJTkcgYW5kCi0JRlRfTE9BRF9OT19BVVRPSElOVCBtdXN0IGJlIHVzZWQuCi0KLQlGaW5hbGx5LCB0cmlja3kgVHJ1ZVR5cGUgZm9udHMgYWx3YXlzIHVzZSB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIKLQlldmVuIGlmIHRoZSBwYXRlbnRlZCBjb2RlIGlzIHVzZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfRkFDRV9GTEFHX1RSSUNLWSwgRlRfSVNfVFJJQ0tZKToKLQlOZXcgbWFjcm9zLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoTG9hZF9HbHlwaCk6IEhhbmRsZSBuZXcgbG9hZCBmbGFncwotCXNlbWFudGljcyBhcyBkZXNjcmliZWQgYWJvdmUuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfY2hlY2tfdHJpY2t5bmVzcyk6IE5ldyBmdW5jdGlvbiwgdXNpbmcKLQljb2RlIG9mIC4uLgotCSh0dF9mYWNlX2luaXQpOiBUaGlzIGZ1bmN0aW9uLCBub3cgc2ltcGxpZmllZCBhbmQgdXBkYXRlZCB0byBuZXcKLQlzZW1hbnRpY3MuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogRG9uJ3QgdXNlIGF1dG9oaW50ZXIgZm9yIHRyaWNreQotCWZvbnRzLgotCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IGl0LgotCi0yMDA4LTEyLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZWFsbHkgZml4IFNhdmFubmFoIGJ1ZyAjMjUwMTA6IEFuIFNGTlQgZm9udCB3aXRoIG5laXRoZXIgb3V0bGluZXMKLQlub3IgYml0bWFwcyBjYW4gYmUgY29uc2lkZXJlZCBhcyBjb250YWluaW5nIHNwYWNlIGBnbHlwaHMnIG9ubHkuCi0KLQkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfbG9hZF9sb2NhKTogSGFuZGxlIHRoZSBjYXNlIHdoZXJlCi0JYSBgZ2x5ZicgdGFibGUgaXMgbWlzc2luZy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IEFib3J0IGlmIHdlIGhhdmUgbm8KLQlgZ2x5ZicgdGFibGUgYnV0IGEgbm9uLXplcm8gYGxvY2EnIGVudHJ5LgotCSh0dF9sb2FkZXJfaW5pdCk6IEhhbmRsZSBtaXNzaW5nIGBnbHlmJyB0YWJsZS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBVbmRvIGNoYW5nZSAyMDA4LTEyLTA1LgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBBIGZvbnQgd2l0aCBuZWl0aGVyIG91dGxpbmVzCi0Jbm9yIGJpdG1hcHMgaXMgc2NhbGFibGUuCi0KLTIwMDgtMTItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl91bmlyYW5nZXMpOiBBZGQgbW9yZSByYW5nZXMuICBUaGlzCi0JZml4ZXMgU2F2YW5uYWggYnVnICMyMTE5MCB3aGljaCBhbHNvIHByb3ZpZGVzIGEgYmFzaWMgcGF0Y2guCi0KLTIwMDgtMTItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9MT0FEX0FEVkFOQ0VfT05MWSk6IFVzZSB2YWx1ZQotCTB4MTAwIGluc3RlYWQgb2YgMHgxMDAwMDsgdGhlIGxhdHRlciB2YWx1ZSBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5Ci0JRlRfTE9BRF9UQVJHRVRfTElHSFQuICBCdWcgcmVwb3J0ZWQgYnkgSmFtZXMgQ2xvb3MuCi0KLQotCUhhbmRsZSBTRk5UIHdpdGggbmVpdGhlciBvdXRsaW5lcyBub3IgYml0bWFwcy4gIFRoaXMgZml4ZXMgU2F2YW5uYWgKLQlidWcgIzI1MDEwLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IFJlamVjdCBmb250cyB3aXRoIG5laXRoZXIKLQlvdXRsaW5lcyBub3IgYml0bWFwcy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIGlmIHRoZXJlCi0JaXMgbm8gdGFibGUgd2l0aCBnbHlwaHMuCi0KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9va3VwX3RhYmxlKTogSW1wcm92ZSBkZWJ1Z2dpbmcKLQltZXNzYWdlLgotCi0yMDA4LTEyLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlHREVGIHRhYmxlcyBuZWVkIGBnbHlwaF9jb3VudCcgdG9vIGZvciB2YWxpZGF0aW9uLiAgUHJvYmxlbSByZXBvcnRlZAotCWJ5IENoaSBOZ3V5ZW4gPGNoaW50QG5lY3N2LmNvbT4uCi0KLQkqIHNyYy9vdHZhbGlkL290dmdkZWYuYyAob3R2X0dERUZfdmFsaWRhdGUpLCBzcmMvb3R2YWxpZC9vdHZhbGlkLmgKLQkob3R2X0dERUZfdmFsaWRhdGUpLCBzcmMvb3R2YWxpZC9vdHZtb2QuYyAob3R2X3ZhbGlkYXRlKTogUGFzcwotCWBnbHlwaF9jb3VudCcuCi0KLTIwMDgtMTEtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYywgc3JjL2Jhc2UvZnRvdXRsbi5jLCBzcmMvYmFzZS9mdHJmb3JrLmMsCi0Jc3JjL2JkZi9iZGZkcml2ci5jLCBzcmMvZ3h2YWxpZC9neHZtb3J4LmMsIHNyYy9vdHZhbGlkL290dm1hdGguYywKLQlzcmMvcGNmL3BjZmRyaXZyLmMsIHNyYy9wc25hbWVzL3BzdGFibGVzLmgsIHNyYy9zbW9vdGgvZnRncmF5cy5jLAotCXNyYy90b29scy9nbG5hbWVzLnB5LCBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYywgc3JjL3R5cGUxL3QxbG9hZC5jLAotCXNyYy90eXBlNDIvdDQyb2Jqcy5jLCBzcmMvd2luZm9udHMvd2luZm50LmM6IEZpeCBjb21waWxlciB3YXJuaW5ncwotCShBdGFyaSBQdXJlQykuCi0KLTIwMDgtMTEtMjkgIEphbWVzIENsb29zICA8Y2xvb3NAamhjbG9vcy5jb20+Ci0KLQkqIHNyYy90eXBlL3QxbG9hZC5jIChtbV9heGlzX3VubWFwKTogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoIGFuZCBmaXgKLQlpdCBjb3JyZWN0bHkgYnkgdXNpbmcgRlRfSU5UX1RPX0ZJWEVEIChGcmVlVHlwZSBleHBlY3RzIDE2LjE2IHZhbHVlcwotCWluIHRoZSAvQmxlbmREZXNpZ25NYXAgc3BhY2UpLgotCi0yMDA4LTExLTI5ICBKYW1lcyBDbG9vcyAgPGNsb29zQGpoY2xvb3MuY29tPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKG1tX2F4aXNfdW5tYXApOiBgYmxlbmRfcG9pbnRzJyBpcyBGVF9GaXhlZCosCi0Jd2hlcmVhcyBgZGVzaWduX3BvaW50cycgaXMgRlRfTG9uZyouICBUaGVyZWZvcmUsIHJldHVybiBibGVuZCByYXRoZXIKLQl0aGFuIGRlc2lnbiBwb2ludHMuCi0KLTIwMDgtMTEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfcmVhbCk6IEhhbmRsZSBtb3JlIHRoYW4gbmluZQotCXNpZ25pZmljYW50IGRpZ2l0cyBjb3JyZWN0bHkuICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMjQ5NTMuCi0KLTIwMDgtMTEtMjUgIERhbmllbCBaaW1tZXJtYW5uICA8bmV0emltbWVAYW9sLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRzdHJlYW0uYyAoRlRfU3RyZWFtX1JlYWRGaWVsZHMpOiBEb24ndCBhY2Nlc3Mgc3RyZWFtCi0JYmVmb3JlIHRoZSBOVUxMIGNoZWNrLiAgRnJvbSBTYXZhbm5haCBwYXRjaCAjNjY4MS4KLQotMjAwOC0xMS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4ZXMgZnJvbSB0aGUgZ251d2luMzIgcG9ydC4KLQotCSogc3JjL2Jhc2UvZnRsY2RmaWwuYzogcy9FWFBPUlQvRVhQT1JUX0RFRi8uCi0KLQkqIHNyYy9iYXNlL2Z0b3R2YWwuYzogSW5jbHVkZSBGVF9PUEVOVFlQRV9WQUxJREFURV9ILgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX3RhYmxlX2FkZCk6IENoZWNrIGBsZW5ndGgnLgotCi0yMDA4LTExLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jICh0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlKTogVGhlIGRlZmF1bHQKLQl2YWx1ZSBmb3IgYHNjYW5fdHlwZScgaXMgemVybywgYXMgY29uZmlybWVkIGJ5IEdyZWcgSGl0Y2hjb2NrIGZyb20KLQlNaWNyb3NvZnQuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IE1pY2hhbCBOb3dha293c2tpCi0JPG1pc3prYUBsaW1lcy5jb20ucGw+LgotCi0yMDA4LTExLTEyICBUb3IgQW5kZXJzc29uICA8dG9yLmFuZGVyc3NvbkBnbWFpbC5jb20+Ci0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9jbWFwX2luZm8pOiBJbml0aWFsaXplIGBmb3JtYXQnIGZpZWxkLgotCVRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMyNDgxOS4KLQotMjAwOC0xMS0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBSZW1vdmUgI2lmIDAvI2VuZGlmIGd1YXJkcwotCXNpbmNlIE9wZW5UeXBlIHZlcnNpb24gMS41IGhhcyBiZWVuIHJlbGVhc2VkLgotCi0JKiBpbmNsdWRlL3R0bmFtZWlkLmggKFRUX05BTUVfSURfV1dTX0ZBTUlMWSwKLQlUVF9OQU1FX0lEX1dXU19TVUJGQU1JTFkpOiBOZXcgbWFjcm9zIGZvciBPcGVuVHlwZSAxLjUuCi0JKFRUX1VSQ19DT1BUSUMsIFRUX1VSQ19WQUksIFRUX1VSQ19OS08sIFRUX1VSQ19CQUxJTkVTRSwKLQlUVF9VUkNfUEhBR1NQQSwgVFRfVVJDX05PTl9QTEFORV8wLCBUVF9VUkNfUEhPRU5JQ0lBTiwKLQlUVF9VUkNfVEFJX0xFLCBUVF9VUkNfTkVXX1RBSV9MVUUsIFRUX1VSQ19CVUdJTkVTRSwKLQlUVF9VUkNfR0xBR09MSVRJQywgVFRfVVJDX1lJSklORywgVFRfVVJDX1NZTE9USV9OQUdSSSwKLQlUVF9VUkNfTElORUFSX0IsIFRUX1VSQ19BTkNJRU5UX0dSRUVLX05VTUJFUlMsIFRUX1VSQ19VR0FSSVRJQywKLQlUVF9VUkNfT0xEX1BFUlNJQU4sIFRUX1VSQ19TSEFWSUFOLCBUVF9VUkNfT1NNQU5ZQSwKLQlUVF9VUkNfQ1lQUklPVF9TWUxMQUJBUlksIFRUX1VSQ19LSEFST1NIVEhJLCBUVF9VUkNfVEFJX1hVQU5fSklORywKLQlUVF9VUkNfQ1VORUlGT1JNLCBUVF9VUkNfQ09VTlRJTkdfUk9EX05VTUVSQUxTLCBUVF9VUkNfU1VOREFORVNFLAotCVRUX1VSQ19MRVBDSEEsIFRUX1VSQ19PTF9DSElLSSwgVFRfVVJDX1NBVVJBU0hUUkEsIFRUX1VSQ19LQVlBSF9MSSwKLQlUVF9VUkNfUkVKQU5HLCBUVF9VUkNfQ0hBTSwgVFRfVVJDX0FOQ0lFTlRfU1lNQk9MUywKLQlUVF9VUkNfUEhBSVNUT1NfRElTQywgVFRfVVJDX09MRF9BTkFUT0xJQU4sIFRUX1VSQ19HQU1FX1RJTEVTKTogTmV3Ci0JbWFjcm9zIGZvciBPcGVuVHlwZSAxLjUuCi0KLTIwMDgtMTEtMDggIFdlbmxpbiBJbnN0aXR1dGUgIDx3ZW5saW5Ad2VubGluLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCk6IFByb3RlY3QgYWdhaW5zdAotCXNsb3QtPmludGVybmFsID09IE5VTEwuICBSZXBvcnRlZCBieSBHcmFoYW0gQXNoZXIuCi0KLTIwMDgtMTEtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHR0X2ZhY2VfZ2V0X25hbWUpOiBNb2RpZmllZCB0byByZXR1cm4gYW4gZXJyb3IKLQljb2RlIHNvIHRoYXQgbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbXMgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbQotCW1pc3NpbmcgdGFibGUgZW50cmllcy4gIFJlcG9ydGVkIGJ5IEdyYWhhbSBBc2hlci4KLQkoR0VUX05BTUUpOiBOZXcgbWFjcm8uCi0JKHNmbnRfbG9hZF9mYWNlKTogVXNlIGl0LgotCi0yMDA4LTExLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRldmVsL2Z0b3B0aW9uLmgsIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQlbVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUl06IFVuZGVmaW5lCi0JVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcuICBUaGlzIGZpeGVzIHRoZSByZXR1cm4gdmFsdWUgb2YKLQlgRlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlJyAoYW5kIG1ha2VzIGl0IHdvcmsgYXMgZG9jdW1lbnRlZCkuCi0JUmVwb3J0ZWQgaW4gYnVnICM0NDE2Mzggb2YgYnVnemlsbGEubm92ZWxsLmNvbS4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBpdC4KLQotMjAwOC0xMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX3N1YnJzKTogVXNlIGFuIGVuZGxlc3MgbG9vcC4gIFRoZXJlIGFyZQotCWZvbnRzIChsaWtlIEhFTFZJLlBGQiB2ZXJzaW9uIDAwMy4wMDEsIHVzZWQgb24gT1MvMikgd2hpY2ggZGVmaW5lCi0Jc29tZSBgc3VicnMnIGVsZW1lbnRzIG1vcmUgdGhhbiBvbmNlLiAgUHJvYmxlbSByZXBvcnRlZCBieSBQZXRlcgotCVdlaWxiYWNoZXIgPG1vemlsbGFAd2VpbGJhY2hlci5vcmc+LgotCi0yMDA4LTEwLTE1ICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQkqIHNyYy9zZm50L3R0cG9zdC5jICh0dF9wb3N0X2RlZmF1bHRfbmFtZXMpOiBBZGQgYGNvbnN0Jy4KLQotMjAwOC0xMC0xNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9TZXRfTU1fQmxlbmQpOiBEaXNhbWJpZ3VhdGUgZm9yCi0JbWVkZGxlc29tZSBjb21waWxlcnMnIHdhcm5pbmcgYWdhaW5zdCBgZm9yICggLi4uOyAuLi47IC4uLikgOycuCi0KLTIwMDgtMTAtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBSZW1vdmUgY29tcGlsZXIgd2FybmluZy4KLQlTdWdnZXN0ZWQgYnkgQnJhbSBUYXNzeW5zIGluIFNhdmFubmFoIHBhdGNoICM2NjUxLgotCi0yMDA4LTEwLTEyICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2xvYWRfZmFjZSk6IEZpeCBjb21wdXRhdGlvbiBvZgotCWB1bmRlcmxpbmVfcG9zaXRpb24nLgotCi0yMDA4LTEwLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwOC0xMC0wOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI0NDY4LgotCi0JQWNjb3JkaW5nIHRvIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgsIHRoZSBhcHByb3ByaWF0ZQotCXR5cGUgdG8gaW50ZXJjaGFuZ2Ugc2luZ2xlIGNoYXJhY3RlciBjb2RlcG9pbnQgaXMgRlRfVUludDMyLiBJdAotCXNob3VsZCBiZSBkaXN0aW5ndWlzaGVkIGZyb20gRlRfVUludCB3aGljaCBjYW4gYmUgMTZiaXQgaW50ZWdlci4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X2NoYXJfbWFwX2xpbmVhcik6IENoYW5nZSB0aGUgdHlwZQotCW9mIHRoZSBzZWNvbmQgYXJndW1lbnQgYHBjaGFyY29kZScgZnJvbSBGVF9VSW50KiB0byBGVF9VSW50MzIqLgotCSh0dF9jbWFwNF9jaGFyX21hcF9iaW5hcnkpOiBEaXR0by4KLQkodHRfY21hcDE0X2dldF9ub25kZWZfY2hhcnMpOiBDaGFuZ2UgdGhlIHR5cGUgb2YgcmV0dXJuIHZhbHVlCi0JZnJvbSBGVF9VSW50KiB0byBGVF9VSW50MzIqLgotCi0yMDA4LTEwLTA4ICBKb2huIFR5dGdhdCAgPEpvaG4uVHl0Z2F0QGVza28uY29tPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMjQ0ODUuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfY2hhcnN0cmluZ3MpOiBBc3N1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZQotCWEgLm5vdGRlZiBnbHlwaC4KLQotMjAwOC0xMC0wNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYzogSW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0ggZm9yIG11bHRpIGJ1aWxkLgotCSogYnVpbGRzL21hYy9mdG1hYy5jOiBEaXR0by4KLQotMjAwOC0xMC0wNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaCAoVFRBR19UWVAxLCBUVEFHX3R5cDEpOiBGaXggZGVmaW5pdGlvbnMuCi0JKiBzcmMvYmFzZS9mdG9ianMuYzogSW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0guCi0KLTIwMDgtMTAtMDUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X29wZW5fZm9udCk6IEFsbG93IGB0eXAxJyB2ZXJzaW9uIHRhZyBpbgotCXRoZSBiZWdpbm5pbmcgb2Ygc2ZudCBjb250YWluZXIuCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoY2hlY2tfdGFibGVfZGlyKTogUmV0dXJuCi0JYFNGTlRfRXJyX1RhYmxlX01pc3NpbmcnIHdoZW4gc2ZudCB0YWJsZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzCi0JY29ycmVjdCBidXQgZXNzZW50aWFsIHRhYmxlcyBmb3IgVHJ1ZVR5cGUgZm9udHMgKGBoZWFkJywgYGJoZWQnIG9yCi0JYFNJTkcnKSBhcmUgbWlzc2luZy4gIE90aGVyIGVycm9ycyBhcmUgcmV0dXJuZWQgYnkKLQlTRk5UX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfT3Blbl9GYWNlKTogV2hlbiBUcnVlVHlwZSBkcml2ZXIgcmV0dXJucwotCWBGVF9FcnJfVGFibGVfTWlzc2luZycsIHRyeSBgb3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW0nLiAgSXQgaXMKLQllbmFibGVkIG9ubHkgd2hlbiBvbGQgbWFjIGZvbnQgc3VwcG9ydCBpcyBjb25maWd1cmVkLgotCi0yMDA4LTEwLTA0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oIChUVEFHX0NJRCwgVFRBR19GT05ELCBUVEFHX0xXRk4sCi0JVFRBR19QT1NULCBUVEFHX3NmbnQsIFRUQUdfVFlQMSwgVFRBR190eXAxKTogTmV3IHRhZ3MgdG8gc2ltcGxpZnkKLQl0aGUgcmVwZWF0ZWQgY2FsY3VsYXRpb25zIG9mIHRoZXNlIHZhbHVlcyBpbiBmdG9ianMuYyBhbmQgZnRtYWMuYy4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBSZXBsYWNlIGFsbCBGVF9NQUtFX1RBRyBieSBuZXcgdGFncy4KLQkqIHNyYy9iYXNlL2Z0bWFjLmM6IERpdHRvLgotCSogYnVpbGRzL21hYy9mdG1hYy5jOiBEaXR0by4KLQotMjAwOC0xMC0wNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2xvb2t1cF9QU19pbl9zZm50X3N0cmVhbSk6IFJlbW92ZSB3cm9uZwotCWluaXRpYWxpemF0aW9uIG9mICppc19zZm50X2NpZC4KLQotMjAwOC0xMC0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAob3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW0pOiBSZW1vdmUgY29tcGlsZXIKLQl3YXJuaW5ncy4KLQotMjAwOC0xMC0wNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2xvb2t1cF9QU19pbl9zZm50KTogUmVwbGFjZWQgYnkuLi4KLQkoZnRfbG9va3VwX1BTX2luX3NmbnRfc3RyZWFtKTogVGhpcy4KLQkob3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW0pOiBOZXcgZnVuY3Rpb24uICBJdCBjaGVja3Mgd2hldGhlcgotCXRoZSBzdHJlYW0gaXMgc2ZudC13cmFwcGVkIFR5cGUxIFBTIGZvbnQgb3Igc2ZudC13cmFwcGVkIENJRC1rZXllZAotCWZvbnQsIHRoZW4gdHJ5IHRvIG9wZW4gYSBmYWNlIGZvciBnaXZlbiBmYWNlX2luZGV4LgotCShNYWNfUmVhZF9zZm50X1Jlc291cmNlKTogUmVwbGFjZSB0aGUgY29tYmluYXRpb24gb2YKLQlgZnRfbG9va3VwX1BTX2luX3NmbnQnIGFuZCBgb3Blbl9mYWNlX2Zyb21fYnVmZmVyJyBieQotCWBvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbScuCi0JKiBzcmMvYmFzZS9mdG1hYy5jIChGVF9OZXdfRmFjZV9Gcm9tX1NGTlQpOiBEaXR0by4KLQkqIGJ1aWxkcy9tYWMvZnRtYWMuYyAoRlRfTmV3X0ZhY2VfRnJvbV9TRk5UKTogRGl0dG8uCi0JKiBzcmMvYmFzZS9mdGJhc2UuaDogUmVtb3ZlIGBmdF9sb29rdXBfUFNfaW5fc2ZudCcgYW5kIGFkZAotCWBvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbScuCi0KLTIwMDgtMTAtMDMgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9sb29rdXBfUFNfaW5fc2ZudCk6IFNldCAqaXNfc2ZudF9jaWQgdG8KLQlGQUxTRSBpZiBuZWl0aGVyIGBDSUQgJyBub3IgYFRZUDEnIGlzIGZvdW5kIGluIHRoZSBzZm50IGNvbnRhaW5lci4KLQotMjAwOC0xMC0wMyAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogRGVmaW5lIEZUX01BQ0lOVE9TSCB3aGVuIFNDIG9yCi0JTXJDIGNvbXBpbGVyIG9mIE1QVyBpcyB1c2VkLiAgVGhlc2UgY29tcGlsZXJzIGRvIG5vdCBkZWZpbmUgdGhlCi0JbWFjcm8gX19BUFBMRV9fIGJ5IHRoZW1zZWx2ZXMuCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbjogRGl0dG8uCi0JKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmg6IERpdHRvLgotCSogc3JjL2Jhc2UvZnRiYXNlLmM6IFVzZSBGVF9NQUNJTlRPU0ggaW5zdGVhZCBvZiBfX0FQUExFX18sIHRvCi0JaW5jbHVkZSBmdG1hYy5jIGlmIEZyZWVUeXBlIDIgaXMgYnVpbHQgYnkgTVBXLgotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IFVzZSBGVF9NQUNJTlRPU0ggaW5zdGVhZCBvZiBfX0FQUExFX18sIHRvCi0JZW5hYmxlIHNoYXJlZCBmdW5jdGlvbnMgZm9yIGZ0bWFjLmMgaWYgRnJlZVR5cGUgMiBpcyBidWlsdCBieSBNUFcuCi0KLQkqIGJ1aWxkcy9tYWMvZnRtYWMuYzogSW5jbHVkZSBmdGJhc2UuaC4KLQkobWVtb3J5X3N0cmVhbV9jbG9zZSk6IFJlbW92ZWQuCi0JKG5ld19tZW1vcnlfc3RyZWFtKTogRGl0dG8uCi0JKG9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IFJlbW92ZWQuICBVc2UgdGhlIGltcGxlbWVudGF0aW9uIGluCi0JZnRvYmpzLmMuCi0JKGZ0X2xvb2t1cF9QU19pbl9zZm50KTogRGl0dG8uCi0KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19mYXIubWFrZS50eHQ6IEJ1aWxkIGZ0bWFjLmMgYXMgYW4KLQlpbmNsdWRlZCBwYXJ0IG9mIGZ0YmFzZS5jLCB0byBzaGFyZSB0aGUgZnVuY3Rpb25zIGluIGZ0b2Jqcy5jLiAgVGhlCi0JcnVsZSBjb21waWxpbmcgZnRtYWMuYyBzZXBhcmF0ZWx5IGlzIHJlbW92ZWQgYW5kIHRoZSBydWxlIGNvcHlpbmcKLQlmdGJhc2UuYyBmcm9tIHNyYy9iYXNlL2Z0YmFzZS5jIHRvIGJ1aWxkcy9tYWMvZnRiYXNlLmMgaXMgYWRkZWQuCi0JKiBidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfY2ZtLm1ha2UudHh0OiBEaXR0by4KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NsYXNzaWMubWFrZS50eHQ6IERpdHRvLgotCSogYnVpbGRzL21hYy9GcmVlVHlwZS5wcGNfY2FyYm9uLm1ha2UudHh0OiBEaXR0by4KLQotMjAwOC0xMC0wMiAgQnJhbSBUYXNzeW5zICA8YnJhbXRAZW5mb2N1cy5iZT4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfc2xvdF9sb2FkKTogTWFwIENJRCAwIHRvIEdJRCAwLiAgVGhpcwotCWZpeGVzIFNhdmFubmFoIGJ1ZyAjMjQ0MzAuCi0KLTIwMDgtMTAtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChCQVNFX0gpOiBSZW5hbWUgdG8uLi4KLQkoSU5URVJOQUxfSCk6IFRoaXMuCi0JKEZSRUVUWVBFX0gpOiBVcGRhdGVkLgotCSogc3JjL2Jhc2UvcnVsZXMubWs6IChCQVNFX09CSl9TLCBPQkpfRElSLyUuJE8pOiBBZGQgQkFTRV9ILgotCSogc3JjL2JkZi9ydWxlcy5tayAoQkRGX0RSVl9IKTogQWRkIGJkZmVycm9yLmguCi0JKiBzcmMvY2FjaGUvcnVsZXMubWsgKENBQ0hFX0RSVl9IKTogQWRkIGZ0Y2NhY2hlLmggYW5kIGZ0Y3NiaXRzLmguCi0JKiBzcmMvcGNmL3J1bGVzLm1rIChQQ0ZfRFJWX0gpOiBBZGQgcGNmcmVhZC5oLgotCSogc3JjL3Jhc3Rlci9ydWxlcy5tayAoUkFTVEVSX0RSVl9IKTogQWRkIGZ0bWlzYy5oLgotCSogc3JjL3R5cGU0Mi9ydWxlcy5tayAoVDQyX0RSVl9IKTogQWRkIHQ0MnR5cGVzLmguCi0KLTIwMDgtMTAtMDIgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0YmFzZS5oOiBOZXcgZmlsZSB0byBkZWNsYXJlIHRoZSBwcml2YXRlIHV0aWxpdHkKLQlmdW5jdGlvbnMgc2hhcmVkIGJ5IHRoZSBzb3VyY2VzIG9mIGJhc2UgbW9kdWxlcy4gIEN1cnJlbnRseSwKLQlgZnRfbG9va3VwX1BTX2luX3NmbnQnIGFuZCBgb3Blbl9mYWNlX2Zyb21fYnVmZmVyJyBhcmUgZGVjbGFyZWQgdG8KLQlzaGFyZSBiZXR3ZWVuIGZ0b2Jqcy5jIGFuZCBmdG1hYy5jLgotCi0JKiBzcmMvYmFzZS9ydWxlLm1rOiBBZGQgZnRiYXNlLmguCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBJbmNsdWRlIGZ0YmFzZS5oLgotCShtZW1vcnlfc3RyZWFtX2Nsb3NlKTogQnVpbGQgb24gYW55IHBsYXRmb3JtIHdoZW4gb2xkIE1hY09TIGZvbnQKLQlzdXBwb3J0IGlzIGVuYWJsZWQuCi0JKG5ld19tZW1vcnlfc3RyZWFtKTogRGl0dG8uCi0JKG9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IEJ1aWxkIG9uIGFueSBwbGF0Zm9ybSB3aGVuIG9sZCBNYWNPUyBmb250Ci0Jc3VwcG9ydCBpcyBlbmFibGVkLiAgVGhlIGNvdW50aW5nIG9mIHRoZSBmYWNlIGluIGEgZm9udCBmaWxlIGlzCi0Jc2xpZ2h0bHkgZGlmZmVyZW50IGJldHdlZW4gQ2FyYm9uLWRlcGVuZGVudCBwYXJzZXIgYW5kIENhcmJvbi1mcmVlCi0JcGFyc2VyLiAgVGhleSBhcmUgbWVyZ2VkIHdpdGggdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbmRpdGlvbmFsLgotCShmdF9sb29rdXBfUFNfaW5fc2ZudCk6IERpdHRvLgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBJbmNsdWRlIGZ0YmFzZS5oLgotCShtZW1vcnlfc3RyZWFtX2Nsb3NlKTogUmVtb3ZlZC4KLQkobmV3X21lbW9yeV9zdHJlYW0pOiBEaXR0by4KLQkob3Blbl9mYWNlX2Zyb21fYnVmZmVyKTogUmVtb3ZlZC4gIFVzZSB0aGUgaW1wbGVtZW50YXRpb24gaW4KLQlmdG9ianMuYy4KLQkoZnRfbG9va3VwX1BTX2luX3NmbnQpOiBEaXR0by4KLQotMjAwOC0xMC0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBgcHNuYW1lc19lcnJvcicgaXMgb25seSBuZWVkZWQKLQlpZiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgaXMgZGVmaW5lZC4KLQotMjAwOC0xMC0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2ZhY2VfZG9uZSksIHNyYy9jZmYvY2Zmb2Jqcy5jCi0JKGNmZl9mYWNlX2RvbmUpLCBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfZG9uZSksCi0Jc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfRmFjZV9Eb25lKSwgc3JjL2NpZC9jaWRvYmpzLmMKLQkoY2lkX2ZhY2VfZG9uZSksIHNyYy9iZGYvYmRmZHJpdnIuIChCREZfRmFjZV9Eb25lKSwKLQlzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9mYWNlX2RvbmUpOiBQcm90ZWN0IGFnYWluc3QgZmFjZSA9PSAwLgotCVJlcG9ydGVkIGJ5IEdyYWhhbSBBc2hlci4KLQotMjAwOC0wOS0zMCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2Jhc2UvcnVsZXMubWs6IEFkZCBjb25kaXRpb25hbCBzb3VyY2UgdG8gQkFTRV9TUkMsIGZvciBgbWFrZQotCW11bHRpJyBvbiBNYWMgT1MgWC4gIElmIHRoZSBtYWNybyAkKGZ0bWFjX2MpIGlzIGRlZmluZWQsCi0JJChCQVNFX0RJUikvJChmdG1hY19jKSBpcyBhZGRlZCB0byBCQVNFX1NSQy4gIEluIGEgbm9ybWFsIGJ1aWxkLCB0aGUKLQlsYWNrIG9mIGZ0bWFjLmMgaW4gQkFTRV9TUkMgaXMgbm90IHNlcmlvdXMgYmVjYXVzZSBmdGJhc2UuYyBpbmNsdWRlcwotCWZ0bWFjLmMuCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbjogQWRkIGEgbWFjcm8gZGVmaW5pdGlvbiBvZiAkKGZ0bWFjX2MpLgotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQWRkIHByb2NlZHVyZSB0byBzZXQgdXAgYXBwcm9wcmlhdGUKLQl2YWx1ZSBvZiAkKGZ0bWFjX2MpIHdpdGggdGhlIGNvbnNpZGVyYXRpb24gb2YgdGhlIGF2YWlsYWJpbGl0eSBvZgotCUNhcmJvbiBmcmFtZXdvcmsuCi0KLTIwMDgtMDktMzAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL0phbWZpbGU6IEFkZCB0YXJnZXQgZm9yIG11bHRpIGJ1aWxkIGJ5IGphbSBvbiBNYWMgT1MgWC4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9OZXdfRmFjZSk6IEZpeCB0aGUgY29uZGl0aW9uIHRvIGluY2x1ZGUgdGhpcwotCWZ1bmN0aW9uIGZvciBNUFcgYnVpbGRpbmcuICBJdCBpcyBzeW5jaHJvbml6ZWQgdGhlIGNvbmRpdGlvbiB0bwotCWluY2x1ZGUgZnRtYWMuYyBzb3VyY2UgaW50byBmdGJhc2UuYy4KLQotMjAwOC0wOS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKENGRl9PcGVyYXRvciwgY2ZmX2FyZ3VtZW50X2NvdW50cywKLQljZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IEhhbmRsZSAoaW52YWxpZCkKLQlgY2FsbG90aGVyc3VicicgYW5kIGBwb3AnIGluc3RydWN0aW9ucy4KLQotMjAwOC0wOS0yMiAgSm9obiBUeXRnYXQgIDxKb2huLlR5dGdhdEBlc2tvLmNvbT4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI0MzA3LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCAoQ0lEX0ZhY2VSZWMpLAotCXNyYy90eXBlNDIvdDQydHlwZXMuaCAoVDQyX0ZhY2VSZWMpOiBDb21tZW50IG91dCBgYWZtX2RhdGEnLgotCi0yMDA4LTA5LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3Jhc3Rlcl9yZW5kZXIpOiBEb24ndCBkZXJlZmVyZW5jZQotCWB0YXJnZXRfbWFwJyBpZiBGVF9SQVNURVJfRkxBR19ESVJFQ1QgaXMgc2V0LiAgUHJvYmxlbSByZXBvcnRlZCBieQotCVN0ZXBoYW4gVC4gTGF2YXZlaiA8c3RsQG51d2VuLm5ldD4uCi0KLTIwMDgtMDktMjEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9vdHZhbGlkL0phbWZpbGU6IEFkZCBtaXNzaW5nIHRhcmdldCBgb3R2bWF0aCcgZm9yIG11bHRpIGJ1aWxkCi0JYnkgamFtLgotCSogc3JjL3NmbnQvSmFtZmlsZTogQWRkIG1pc3NpbmcgdGFyZ2V0IGB0dG10eCcgZm9yIG11bHRpIGJ1aWxkIGJ5Ci0JamFtLgotCi0yMDA4LTA5LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2ZpbmRfY2VsbCk6IEZpeCB0aHJlc2hvbGQuICBUaGUgdmFsdWVzCi0JcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gYXJlIGFscmVhZHkgYG5vcm1hbGl6ZWQnLiAgUHJvYmxlbSByZXBvcnRlZAotCWJ5IFN0ZXBoYW4gVC4gTGF2YXZlaiA8c3RsQG51d2VuLm5ldD4uCi0KLQkqIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgaXQuCi0KLTIwMDgtMDktMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0guCi0JKEZUX091dGxpbmVfRGVjb21wb3NlKTogRGVjb3JhdGUgd2l0aCB0cmFjaW5nIG1lc3NhZ2VzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyBbREVCVUdfR1JBWVNdOiBSZXBsYWNlIHdpdGgKLQlGVF9ERUJVR19MRVZFTF9UUkFDRS4KLQlbX1NUQU5EQUxPTkVfICYmIEZUX0RFQlVHX0xFVkVMX1RSQUNFXTogSW5jbHVkZSBzdGRpby5oIGFuZAotCXN0ZGFyZy5oLgotCi0JKEZUX1RSQUNFKSBbX1NUQU5EQUxPTkVfXTogUmVtb3ZlLgotCShGVF9NZXNzYWdlKSBbX1NUQU5EQUxPTkVfICYmIEZUX0RFQlVHX0xFVkVMX1RSQUNFXTogTmV3IGZ1bmN0aW9uLgotCShGVF9UUkFDRTUsIEZUX1RSQUNFNykgW19TVEFOREFMT05FX106IE5ldyBtYWNyb3MuCi0JKEZUX0VSUk9SKSBbX1NUQU5EQUxPTkVfXTogVXBkYXRlZC4KLQotCShncmF5X2hsaW5lKSBbRlRfREVCVUdfTEVWRUxfVFJBQ0VdOiBGaXggY29uZGl0aW9uLgotCVVzZSBGVF9UUkFDRTcuCi0JKGdyYXlfZHVtcF9jZWxscyk6IE1ha2UgaXQgYHN0YXRpYyB2b2lkJy4KLQkoZ3JheV9jb252ZXJ0X2dseXBoKTogVXNlIEZUX1RSQUNFNy4KLQotCShGVF9PdXRsaW5lX0RlY29tcG9zZSkgW19TVEFOREFMT05FX106IFN5bmNocm9uaXplIHdpdGggdmVyc2lvbiBpbgotCWZ0b3V0bG4uYy4KLQotCSogc3JjL2Jhc2UvZnRhZHZhbmMuYyAoRlRfR2V0X0FkdmFuY2UsIEZUX0dldF9BZHZhbmNlcyk6IFVzZQotCUZUX0VSUk9SX0JBU0UuCi0KLQkqIGRvY3MvZm9ybWF0cy50eHQ6IFVwZGF0ZWQuCi0KLTIwMDgtMDktMTkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmM6IEltcG9ydCBzZm50LXdyYXBwZWQgVHlwZTEgYW5kIHNmbnQtd3JhcHBlZAotCUNJRC1rZXllZCBmb250IHN1cHBvcnQuCi0JKiBidWlsZHMvbWFjL2Z0bWFjLmM6IERpdHRvLgotCi0yMDA4LTA5LTE5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoTWFjX1JlYWRfc2ZudF9SZXNvdXJjZSk6IEZpeCBkb3VibGUgZnJlZSBidWcgaW4KLQlzZm50LXdyYXBwZWQgVHlwZTEgYW5kIHNmbnQtd3JhcHBlZCBDSUQta2V5ZWQgZm9udCBzdXBwb3J0IGNvZGUuCi0JYG9wZW5fZmFjZV9mcm9tX2J1ZmZlcicgZnJlZXMgdGhlIHBhc3NlZCBidWZmZXIgaWYgaXQgY2Fubm90IG9wZW4gYQotCWZhY2UgZnJvbSB0aGUgYnVmZmVyLCBzbyB0aGUgY2FsbGVyIG11c3Qgbm90IGZyZWUgaXQuCi0KLTIwMDgtMDktMTkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChNYWNfUmVhZF9zZm50X1Jlc291cmNlKTogQWRkIGluaXRpYWwgc3VwcG9ydAotCWZvciBzZm50LXdyYXBwZWQgVHlwZTEgYW5kIHNmbnQtd3JhcHBlZCBDSUQta2V5ZWQgZm9udC4KLQkoZnRfbG9va3VwX1BTX2luX3NmbnQpOiBOZXcgZnVuY3Rpb24gdG8gbG9vayB1cCBgVFlQMScgb3IgYENJRCAnCi0JdGFibGUgaW4gc2ZudCB0YWJsZSBkaXJlY3RvcnkuICBJdCBpcyB1c2VkIGJlZm9yZSBsb2FkaW5nIFRydWVUeXBlCi0JZm9udCBkcml2ZXIuCi0KLQkqIGRvY3MvQ0hBTkdFUzogQWRkIG5vdGUgYWJvdXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHNmbnQtd3JhcHBlZAotCVR5cGUxIGFuZCBzZm50LXdyYXBwZWQgQ0lELWtleWVkIGZvbnQgc3VwcG9ydC4KLQotMjAwOC0wOS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHN5c3RlbS5jIChGVF9Eb25lX01lbW9yeSk6IFVzZSBmdF9zZnJlZSBkaXJlY3RseSBmb3IKLQlvcnRob2dvbmFsaXR5IChmdF9mcmVlIGFuZCBmdF9zZnJlZSBjb3VsZCBiZWxvbmcgdG8gZGlmZmVyZW50IG1lbW9yeQotCXBvb2xzKS4gIFRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMyNDI5Ny4KLQotMjAwOC0wOS0xOCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBVc2UgVFRBR19PVFRPIGRlZmluZWQKLQlpbiB0dHRhZ3MuaCBpbnN0ZWFkIG9mIG51bWVyaWNhbCB2YWx1ZSAweDRGNTQ1NDRGTC4KLQotMjAwOC0wOS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmgsIHNyYy9jZmYvY2ZmZ2xvYWQuYwotCShjZmZfZGVjb2Rlcl9zZXRfd2lkdGhfb25seSk6IEVsaW1pbmF0ZSBmdW5jdGlvbiBjYWxsLgotCi0yMDA4LTA5LTE1ICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI0MTc5LCByZXBvcnRlZCBieSBCcmFtIFRhc3N5bnMuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAobW1fYXhpc191bm1hcCwgVDFfR2V0X01NX1Zhcik6IEZpeCBjb21wdXRhdGlvbgotCW9mIGRlZmF1bHQgdmFsdWVzLgotCi0yMDA4LTA5LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9nbG5hbWVzLnB5IChtYWluKTogU3Vycm91bmQgYGZ0X2dldF9hZG9iZV9nbHlwaF9pbmRleCcKLQlhbmQgYGZ0X2Fkb2JlX2dseXBoX2xpc3QnIHdpdGggRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUIHRvCi0JcHJldmVudCB1bmNvbmRpdGlvbmFsIGRlZmluaXRpb24uICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMjQyNDEuCi0KLQkqIHNyYy9wc25hbWVzL3BzdGFibGVzLmg6IFJlZ2VuZXJhdGVkLgotCi0yMDA4LTA5LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGF1dG9nZW4uc2gsIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcsCi0JaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCwgYnVpbGRzL3VuaXgvZnRjb25maWcuaW46IE1pbm9yCi0JYmVhdXRpZnlpbmcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRhZHZhbmMuaCwgaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmg6IFByb3RlY3QgYWdhaW5zdCBGcmVlVHlwZSAxLgotCVNvbWUgb3RoZXIgbWlub3IgZml4ZXMuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmg6IFN5bmNocm9uaXplIHdpdGgKLQlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oLgotCi0yMDA4LTA5LTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0YmFzZS5jOiBJbmNsdWRlIGZ0YWR2YW5jLmMuCi0KLTIwMDgtMDktMTEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBEdXBsaWNhdGUgdGhlIGNwcCBjb21wdXRhdGlvbiBvZgotCUZUX1NJWkVPRl97SU5UfExPTkd9IGZyb20gaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaC4KLQkoRlRfVVNFX0FVVE9DT05GX1NJWkVPRl9UWVBFUyk6IE5ldyBtYWNyby4gIElmIGRlZmluZWQsIHRoZSBjcHAKLQljb21wdXRhdGlvbiBpcyBkaXNhYmxlZCBhbmQgdGhlIHN0YXRpY2FsbHkgY29uZmlndXJlZCBzaXplcyBhcmUKLQl1c2VkLiAgVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzIxMjUwLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBBZGQgdGhlIGNoZWNrcyB0byBjb21wYXJlIHRoZSBjcHAKLQljb21wdXRhdGlvbiByZXN1bHRzIG9mIHRoZSBiaXQgbGVuZ3RoIG9mIGludCBhbmQgbG9uZyB2ZXJzdXMgdGhlCi0Jc2l6ZXMgZGV0ZWN0ZWQgYnkgcnVubmluZyBgY29uZmlndXJlJy4gIElmIHRoZSByZXN1bHRzIGFyZQotCWRpZmZlcmVudCwgRlRfVVNFX0FVVE9DT05GX1NJWkVPRl9UWVBFUyBpcyBkZWZpbmVkIHRvIHByaW9yaXRpemUgdGhlCi0JcmVzdWx0cy4KLQlOZXcgb3B0aW9uIC0te2VuYWJsZXxkaXNhYmxlfS1iaWFyY2gtY29uZmlnIGlzIGFkZGVkIHRvIGRlZmluZSBvcgotCXVuZGVmaW5lIEZUX1VTRV9BVVRPQ09ORl9TSVpFT0ZfVFlQRVMgbWFudWFsbHkuCi0KLTIwMDgtMDktMDUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IENsZWFyIEZUMl9FWFRSQV9MSUJTIHdoZW4gQ2FyYm9uIG9yCi0JQXBwbGljYXRpb25TZXJ2aWNlcyBmcmFtZXdvcmsgaXMgbWlzc2luZy4gIEFsdGhvdWdoIHRoaXMgdmFsdWUgaXMgbm90Ci0JdXNlZCBpbiBidWlsZGluZyBvZiBGcmVlVHlwZTIsIGl0IGlzIHdyaXR0ZW4gaW4gYGZyZWV0eXBlMi5wYycgYW5kCi0JYGZyZWV0eXBlLWNvbmZpZycuCi0KLTIwMDgtMDktMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoRlRDX0NNYXBDYWNoZV9Mb29rdXApOiBBY2NlcHQgYSBuZWdhdGl2ZSBjbWFwCi0JaW5kZXggdG8gbWVhbiBgdXNlIGRlZmF1bHQgY2FjaGVkIEZUX0ZhY2UncyBjaGFybWFwJy4gIFRoaXMgZml4ZXMKLQlTYXZhbm5haCBidWcgIzIyNjI1LgotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmg6IERvY3VtZW50IGl0LgotCi0KLQlNYWtlIEZUX011bEZpeCBhbiBpbmxpbmVkIGZ1bmN0aW9uLiAgVGhpcyBpcyBkb25lIHRvIHNwZWVkIHVwCi0JRnJlZVR5cGUgYSBsaXR0bGUgKG9uIHg4NiAzJSB3aGVuIGxvYWRpbmcraGludGluZywgMTAlIHdoZW4KLQlyZW5kZXJpbmcsIEFSTSBzYXZpbmdzIGFyZSBtb3JlIGltcG9ydGFudCB0aG91Z2gpLiAgRGlzYWJsZSB0aGlzIGJ5Ci0JdW5kZWZpbmluZyBGVF9DT05GSUdfT1BUSU9OX0lOTElORV9NVUxGSVguCi0KLQlVc2Ugb2YgYXNzZW1ibGVyIGNvZGUgY2FuIG5vdyBiZSBjb250cm9sbGVkIHdpdGgKLQlGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCwgYnVpbGRzL3VuaXgvZnRjb25maWcuaW4KLQlbIUZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSXSAoRlRfTXVsRml4X2FybSk6IE5ldyBhc3NlbWJsZXIKLQlpbXBsZW1lbnRhdGlvbi4KLQlbIUZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSXSAoRlRfTXVsRml4X2kzODYpOiBBc3NlbWJsZXIKLQlpbXBsZW1lbnRhdGlvbiB0YWtlbiBmcm9tIGBmdGNhbGMuYycuCi0JWyFGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUl0gKEZUX01VTEZJWF9BU1NFTUJMRVIpOiBOZXcgbWFjcm8KLQl3aGljaCBpcyBkZWZpbmVkIHRvIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24KLQlvZiBGVF9NdWxGaXguCi0JW0ZUX0NPTkZJR19PUFRJT05fSU5MSU5FX01VTEZJWCAmJiBGVF9NVUxGSVhfQVNTRU1CTEVSXQotCShGVF9NVUxGSVhfSU5MSU5FRCk6IE5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCAoRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIsCi0JRlRfQ09ORklHX09QVElPTl9JTkxJTkVfTVVMRklYKTogTmV3IG1hY3Jvcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiBVcGRhdGVkIHRvIGhhbmRsZSBGVF9NVUxGSVhfSU5MSU5FRC4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmM6IFVwZGF0ZWQgdG8gdXNlIEZUX01VTEZJWF9BU1NFTUJMRVIgYW5kCi0JRlRfTVVMRklYX0lOTElORUQuCi0KLQotCUFkZCBhIG5ldyBoZWFkZXIgbmFtZWQgRlRfQURWQU5DRVNfSCBkZWNsYXJpbmcgc29tZSBuZXcgQVBJcyB0bwotCWV4dHJhY3QgdGhlIGFkdmFuY2VzIG9mIG9uZSBvciBtb3JlIGdseXBocyB3aXRob3V0IG5lY2Vzc2FyaWx5Ci0JbG9hZGluZyB0aGVpciBvdXRsaW5lcy4gIEFsc28gcHJvdmlkZSBgZmFzdCBsb2FkZXJzJyBmb3IgdGhlCi0JVHJ1ZVR5cGUsIFR5cGUxLCBhbmQgQ0ZGIGZvbnQgZHJpdmVycyAobW9yZSB0byBjb21lIGxhdGVyKS4KLQotCSogc3JjL2Jhc2UvZnRhZHZhbmMuYywgaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oOiBOZXcgZmlsZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX0FEVkFOQ0VTX0gpOiBOZXcgbWFjcm8uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0xPQURfQURWQU5DRV9PTkxZKTogTmV3IG1hY3JvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJpdmVyLmggKEZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jKToKLQlgZmxhZ3MnIGFuZCBgYWR2YW5jZXMnIGFyZSBub3cgb2YgdHlwZSBgRlRfVUludCcgYW5kIGBGVF9GaXhlZCcsCi0JcmVzcGVjdGl2ZWx5LgotCi0JKiBzcmMvYmFzZS9KYW1maWxlIChfc291cmNlcyksIHNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyk6IEFkZAotCWZ0YWR2YW5jLmMuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9hZHZhbmNlcyk6IE5ldyBmdW5jdGlvbi4KLQkoY2ZmX2RyaXZlcl9jbGFzcyk6IFJlZ2lzdGVyIGl0LgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3NldF93aWR0aF9vbmx5KTogTmV3IGZ1bmN0aW9uLgotCShjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IEhhbmRsZSBgd2lkdGhfb25seScuCi0JKGNmZl9zbG90X2xvYWQpOiBIYW5kbGUgRlRfTE9BRF9BRFZBTkNFX09OTFkuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuaCAoY2ZmX2RlY29kZXIpOiBOZXcgZWxlbWVudCBgd2lkdGhfb25seScuCi0JKGNmZl9kZWNvZGVyX3NldF93aWR0aF9vbmx5KTogTmV3IGRlY2xhcmF0aW9uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfZ2V0X2FkdmFuY2VzKTogTmV3IGZ1bmN0aW9uLgotCSh0dF9kcml2ZXJfY2xhc3MpOiBSZWdpc3RlciBpdC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoR2V0X0hNZXRyaWNzLCBHZXRfVk1ldHJpY3MpOiBSZW5hbWVkIHRvLi4uCi0JKFRUX0dldF9ITWV0cmljcywgVFRfR2V0X1ZNZXRyaWNzKTogVGhpcy4KLQlVcGRhdGUgY2FsbGVycy4KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmg6IERlY2xhcmUgdGhlbS4KLQotCSogc3JjL3R5cGUxL3QxZ2xvYWQuaCwgc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfR2V0X0FkdmFuY2VzKTogTmV3Ci0JZnVuY3Rpb24uCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYyAodDFfZHJpdmVyX2NsYXNzKTogUmVnaXN0ZXIgVDFfR2V0X0FkdmFuY2VzLgotCi0KLQlBZGQgY2hlY2tzIGZvciBtaW5pbXVtIHZlcnNpb24gb2YgdGhlIGBhdXRvdG9vbHMnIHN0dWZmLgotCi0JKiBhdXRvZ2VuLnNoOiBJbXBsZW1lbnQgaXQuCi0JKGdldF9tYWpvcl92ZXJzaW9uLCBnZXRfbWlub3JfdmVyc2lvbiwgZ2V0X3BhdGNoX3ZlcnNpb24sCi0JY29tcGFyZV90b19taW5pbXVtX3ZlcnNpb24sIGNoZWNrX3Rvb2xfdmVyc2lvbik6IE5ldyBhdXhpbGlhcnkKLQlmdW5jdGlvbnMuCi0KLQkqIFJFQURNRS5DVlM6IERvY3VtZW50IGl0LgotCi0yMDA4LTA4LTI5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9vcGVuX2ZvbnQpOiBVc2UgVFRBR19PVFRPIGRlZmluZWQgaW4KLQl0dHRhZ3MuaCBpbnN0ZWFkIG9mIEZUX01BS0VfVEFHKCAnTycsICdUJywgJ1QnLCAnTycgKS4KLQotMjAwOC0wOC0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2VuY29kaW5nKTogUHJvdGVjdCBhZ2FpbnN0IGluZmluaXRlCi0JbG9vcC4gIFRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMyNDE1MCAod2hlcmUgYSBwYXRjaCBoYXMgYmVlbiBwb3N0ZWQKLQl0b28pLgotCi0yMDA4LTA4LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlL3QxYWZtLmMgKGNvbXBhcmVfa2Vybl9wYWlycyksIHNyYy9wc2F1eC9hZm1wYXJzZS5jCi0JKGFmbV9jb21wYXJlX2tlcm5fcGFpcnMpOiBGaXggY29tcGFyaXNvbi4gIFRoaXMgZml4ZXMgU2F2YW5uYWggYnVnCi0JIzI0MTE5LgotCi0yMDA4LTA4LTE5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfU3RyZWFtX05ldyk6IEluaXRpYWxpemUgKmFzdHJlYW0gYWx3YXlzLAotCWV2ZW4gaWYgcGFzc2VkIGxpYnJhcnkgb3IgYXJndW1lbnRzIGFyZSBpbnZhbGlkLiAgVGhpcyBmaXhlcyBhIGJ1ZwotCXRoYXQgYW4gdW5pbml0aWFsaXplZCBzdHJlYW0gaXMgZnJlZWQgd2hlbiBhbiBpbnZhbGlkIGxpYnJhcnkgaGFuZGxlCi0JaXMgcGFzc2VkLiAgT3JpZ2luYWxseSBwcm9wb3NlZCBieSBNaWtlIEZhYmlhbiwgMjAwOC8wOC8xOCBvbgotCWZyZWV0eXBlLWRldmVsLgotCShGVF9PcGVuX0ZhY2UpOiBEaXR0byAoc3RyZWFtKS4KLQkobG9hZF9mYWNlX2luX2VtYmVkZGVkX3Jmb3JrKTogRGl0dG8gKHN0cmVhbTIpLgotCi0yMDA4LTA4LTE4ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBBZGQgYSBmYWxsYmFjayB0byBndWVzcyB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZQotCWBSZXNvdXJjZUluZGV4JyB0eXBlLiAgSXQgaXMgdXNlZCB3aGVuIGJ1aWx0IHdpdGhvdXQgY29uZmlndXJlCi0JKGUuZy4sIGEgYnVpbGQgd2l0aCBKYW0pLgotCSogYnVpbGRzL21hYy9mdG1hYy5jOiBEaXR0by4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IFNldCBIQVZFX1RZUEVfUkVTT1VSQ0VfSU5ERVggdG8gMSBvciAwCi0JZXhwbGljaXRseSwgZXZlbiBpZiBgUmVzb3VyY2VJbmRleCcgaXMgdW5hdmFpbGFibGUuCi0KLTIwMDgtMDgtMTggIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IEluIGNoZWNraW5nIG9mIE1hYyBPUyBYIGZlYXR1cmVzLAotCWFsbC1pbi1vbmUgaGVhZGVyIGZpbGUgYENhcmJvbi5oJyBpcyByZXBsYWNlZCBieSB0aGUgbWluaW11bQotCWhlYWRlciBmaWxlIGBDb3JlU2VydmljZXMuaCcsIHNpbWlsYXIgdG8gY3VycmVudCBzcmMvYmFzZS9mdG1hYy5jLgotCi0yMDA4LTA4LTE4ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDJfdmFsaWRhdGUpOiBTa2lwIHRoZSB2YWxpZGF0aW9uIG9mCi0Jc3ViLWhlYWRlciB3aGVuIGl0cyBjb2RlX2NvdW50IGlzIDAuICBNYW55IEphcGFuZXNlIER5bmFsYWIgZm9udHMKLQlpbmNsdWRlIHN1Y2ggYW4gZW1wdHkgc3ViLWhlYWRlciAoY29kZV9jb3VudCA9PSAwLCBmaXJzdF9jb2RlID09IDAKLQlkZWx0YSA9PSAwLCBidXQgb2Zmc2V0ICE9IDApIGFzIHRoZSBzZWNvbmQgc3ViLWhlYWRlciBpbiBTSklTIGNtYXAuCi0KLTIwMDgtMDgtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxdG9rZW5zLmg6IEhhbmRsZSBgRm9yY2VCb2xkJyBrZXl3b3JkLiAgVGhpcyBmaXhlcwotCVNhdmFubmFoIGJ1ZyAjMjM5OTUuCi0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChwYXJzZV9leHBhbnNpb25fZmFjdG9yKTogTmV3IGNhbGxiYWNrIGZ1bmN0aW9uLgotCShjaWRfZmllbGRfcmVjb3Jkcyk6IFVzZSBpdCBmb3IgYEV4cGFuc2lvbkZhY3RvcicuCi0JKiBzcmMvY29kL2NpZHRva2VuLmg6IEhhbmRsZSBgRm9yY2VCb2xkJyBrZXl3b3JkLgotCURvbid0IGhhbmRsZSBgRXhwYW5zaW9uRmFjdG9yJy4KLQotMjAwOC0wOC0wNCAgQnJhbSBUYXNzeW5zICA8YnJhbXRAZW5mb2N1cy5iZT4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKTogRml4IHRoaW5rbyB3aGljaAotCXJlc3VsdGVkIGluIGluY29ycmVjdCBzY2FsaW5nLiAgVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzIzOTczLgotCi0yMDA4LTA4LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlCZSBtb3JlIHRvbGVyYW50IHcuci50LiBpbnZhbGlkIGVudHJpZXMgaW4gU0ZOVCB0YWJsZSBkaXJlY3RvcnkuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChjaGVja190YWJsZV9kaXIpOiBJZ25vcmUgaW52YWxpZCBlbnRyaWVzIGFuZAotCWFkanVzdCB0YWJsZSBjb3VudC4KLQlBZGQgbW9yZSB0cmFjZSBtZXNzYWdlcy4KLQkodHRfZmFjZV9sb2FkX2ZvbnRfZGlyKTogVXBkYXRlZC4KLQotMjAwOC0wNy0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogTm8gbG9uZ2VyCi0JYXNzdW1lIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IG9uIHRoZSBzdGFjayBpcyB0aGUgYm90dG9tLW1vc3QKLQllbGVtZW50LiAgVHdvIHJlYXNvbnM6Ci0KLQkgIG8gQWNjb3JkaW5nIHRvIHBlb3BsZSBmcm9tIEFkb2JlIGl0IGlzIG1pc3NpbmcgaW4gdGhlIFR5cGUgMgotCSAgICBzcGVjaWZpY2F0aW9uIHRoYXQgcHVzaGluZyBvZiBhZGRpdGlvbmFsLCBzdXBlcmZsdW91cyBhcmd1bWVudHMKLQkgICAgb24gdGhlIHN0YWNrIGlzIHByb2hpYml0ZWQuCi0KLQkgIG8gQWNyb3JlYWQgaW4gZ2VuZXJhbCBoYW5kbGVzIGZvbnRzIGRpZmZlcmVudGx5LCBuYW1lbHkgYnkgcG9wcGluZwotCSAgICB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBuZWVkZWQgZm9yIGEgcGFydGljdWxhciBvcGVyYW5kIChhcyBhIFBTCi0JICAgIGludGVycHJldGVyIHdvdWxkIGRvKS4gIEluIGNhc2Ugb2YgYnVnZ3kgZm9udHMgdGhpcyBjYXVzZXMgYQotCSAgICBkaWZmZXJlbnQgaW50ZXJwcmV0YXRpb24gd2hpY2ggb2YgdGhlIGVsZW1lbnRzIG9uIHRoZSBzdGFjayBhcmUKLQkgICAgc3VwZXJmbHVvdXMgYW5kIHdoaWNoIG5vdC4KLQotCVNpbmNlIHRoZXJlIGFyZSBDRkYgc3ViZm9udHMgKGVtYmVkZGVkIGluIFBERnMpIHdoaWNoIHJlbHkgb24KLQlBY3JvcmVhZCdzIGJlaGF2aW91ciwgRnJlZVR5cGUgbm93IGRvZXMgdGhlIHNhbWUuCi0KLTIwMDgtMDctMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBleHRyYSBtYXBwaW5ncyBmb3IgYFRjb21tYWFjY2VudCcgYW5kIGB0Y29tbWFhY2NlbnQnLiAgVGhpcwotCWZpeGVzIFNhdmFubmFoIGJ1ZyAjMjM5NDAuCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKFdHTF9FWFRSQV9MSVNUX1NJWkUpOiBSZW5hbWUgdG8uLi4KLQkoRVhUUkFfR0xZUEhfTElTVF9TSVpFKTogVGhpcy4KLQlJbmNyZWFzZSBieSAyLgotCShmdF93Z2xfZXh0cmFfdW5pY29kZXMpOiBSZW5hbWUgdG8uLi4KLQkoZnRfZXh0cmFfZ2x5cGhfdW5pY29kZXMpOiBUaGlzLgotCUFkZCB0d28gY29kZSB2YWx1ZXMuCi0JKGZ0X3dnbF9leHRyYV9nbHlwaF9uYW1lcyk6IFJlbmFtZSB0by4uLgotCShmdF9leHRyYV9nbHlwaF9uYW1lcyk6IFRoaXMuCi0JQWRkIHR3byBnbHlwaHMuCi0JKGZ0X3dnbF9leHRyYV9nbHlwaF9uYW1lX29mZnNldHMpOiBSZW5hbWUgdG8uLi4KLQkoZnRfZXh0cmFfZ2x5cGhfbmFtZV9vZmZzZXRzKTogVGhpcy4KLQlBZGQgdHdvIG9mZnNldHMuCi0KLQkocHNfY2hlY2tfd2dsX25hbWUsIHBzX2NoZWNrX3dnbF91bmljb2RlKTogUmVuYW1lIHRvLi4uCi0JKHBzX2NoZWNrX2V4dHJhX2dseXBoX25hbWUsIHBzX2NoZWNrX2V4dHJhX2dseXBoX3VuaWNvZGUpOiBUaGlzLgotCVVwZGF0ZWQuCi0JKHBzX3VuaWNvZGVzX2luaXQpOiBVcGRhdGVkLgotCi0yMDA4LTA3LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcHJlcGFyZSwKLQljZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IEltcHJvdmUgZGVidWcgb3V0cHV0LgotCi0yMDA4LTA3LTIyICBNYXJ0aW4gTWNCcmlkZSAgPG1tY2JyaWRlQGVtdGV4LmNvbT4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X3ZhbGlkYXRlLCB0dF9jbWFwNF9jaGFyX21hcF9saW5lYXIsCi0JdHRfY21hcDRfY2hhcl9tYXBfYmluYXJ5KTogSGFuZGxlIGZvbnRzIHdoaWNoIHRyZWF0IHRoZSBsYXN0IHNlZ21lbnQKLQlzcGVjaWFsbHkuICBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24sIHN1Y2ggZm9udHMgd291bGQgYmUKLQlpbnZhbGlkIGJ1dCBhY3JvcmVhZCBhY2NlcHRzIHRoZW0uCi0KLTIwMDgtMDctMTYgIEpvbiBGb3N0ZXIgIDxKb24uRm9zdGVyQGNhYm90LmNvLnVrPgotCi0JKiBzcmMvcGZyL3BmcmRyaXZyLmMgKHBmcl9nZXRfYWR2YW5jZSk6IEZpeCBvZmYtYnktb25lIGVycm9yLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRml4KTogRml4IHBvcnRhYmlsaXR5IGlzc3VlLgotCi0JKiBzcmMvc2ZudC90dHBvc3QuYyAoTUFDX05BTUUpIFshRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTXToKLQlGaXggY29tcGlsZXIgd2FybmluZy4KLQotMjAwOC0wNy0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSGFuZGxlIENJRC1rZXllZCBmb250cyB3cmFwcGVkIGluIGFuIFNGTlQgKHdpdGggY21hcHMpIGNvcnJlY3RseS4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2xvYWQpOiBQYXNzIGBwdXJlX2NmZicuCi0JSW52ZXJ0IHNpZHMgdGFibGUgb25seSBpZiBgcHVyZV9jZmYnIGlzIHNldC4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5oOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IFVwZGF0ZWQuCi0JU2V0IEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgb25seSBpZiBwdXJlX2NmZiBpcyBzZXQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwOC0wNy0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2xvYWRfbG9jYSk6IEhhbmRsZSBidWdneSBmb250cwotCXdoZXJlIG51bV9sb2NhdGlvbnMgPCBudW1fZ2x5cGhzLiAgUHJvYmxlbSByZXBvcnRlZCBieSBEaW5nIExpLgotCi0yMDA4LTA3LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlTaW5jZSBGcmVlVHlwZSB1c2VzIGAkKHZhbHVlIC4uLiknLCB3ZSBub3cgbmVlZCBHTlUgbWFrZSAzLjgwIG9yCi0JbmV3ZXIuICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMjM2NDguCi0KLQkqIGNvbmZpZ3VyZTogenNoIGRvZXNuJ3QgbGlrZSAkezErIiRAIn0uCi0JVXBkYXRlIG5lZWRlZCBHTlUgbWFrZSB2ZXJzaW9uLgotCSogYnVpbGRzL3RvcGxldmVsLm1rOiBDaGVjayBmb3IgYCQoZXZhbCAuLi4pJy4KLQkqIGRvY3MvSU5TVEFMTC5HTlUsIGRvY3MvSU5TVEFMTC5DUk9TUywgZG9jcy9JTlNUQUxMLlVOSVg6IERvY3VtZW50Ci0JaXQuCi0KLTIwMDgtMDctMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChEcmF3X1N3ZWVwKTogSWYgc3BhbiBpcyBzbWFsbGVyIHRoYW4gb25lCi0JcGl4ZWwsIG9ubHkgY2hlY2sgZm9yIGRyb3BvdXRzIGlmIG5laXRoZXIgc3RhcnQgbm9yIGVuZCBwb2ludCBsaWVzCi0Jb24gYSBwaXhlbCBjZW50ZXIuICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMjM3NjIuCi0KLTIwMDgtMDYtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjMuNyByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTMtNycuCi0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAKLQl2ZXJzaW9uIG51bWJlciB0byAyLjMuNy4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qOiBzLzIuMy42LzIuMy43Lywgcy8yMzYvMjM3Ly4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byA3LgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gOToxODozLgotCi0JKiBkb2NzL3JlbGVhc2U6IFVwZGF0ZWQuCi0KLTIwMDgtMDYtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Z0Z2x5cGguYyAoRlRfTWF0cml4X011bHRpcGx5LCBGVF9NYXRyaXhfSW52ZXJ0KTogTW92ZSB0by4uLgotCSogc3JjL2Z0Y2FsYy5jOiBIZXJlLiAgVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzIzNzI5LgotCi0yMDA4LTA2LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoVmVydGljYWxfU3dlZXBfRHJvcCwgSG9yaXpvbnRhbF9Td2VlcF9Ecm9wLAotCUhvcml6b250YWxfR3JheV9Td2VlcF9Ecm9wKTogVGVzdCBmb3IgaW50ZXJzZWN0aW9ucyB3aGljaAotCWRlZ2VuZXJhdGUgdG8gYSBzaW5nbGUgcG9pbnQgY2FuIGJlIGlnbm9yZWQ7IHRoaXMgaGFzIGJlZW4gY29uZmlybWVkCi0JYnkgR3JlZyBIaXRjaGNvY2sgZnJvbSBNaWNyb3NvZnQuICAoVGhpcyB3YXMgY29tbWVudGVkIG91dCBjb2RlLikKLQotMjAwOC0wNi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSW1wcm92ZSBuYXZpZ2F0aW9uIGluIEFQSSByZWZlcmVuY2UuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkgKGh0bWxfaGVhZGVyXzMpOiBSZW5hbWVkIHRvLi4uCi0JKGh0bWxfaGVhZGVyXzYpOiBUaGlzLgotCShodG1sX2hlYWRlcl8zLCBodG1sX2hlYWRlcl8zaSwgaHRtbF9oZWFkZXJfNCwgaHRtbF9oZWFkZXJfNSwKLQlodG1sX2hlYWRlcl81dCk6IE5ldyBzdHJpbmdzLgotCSh0b2NfZm9vdGVyX3N0YXJ0LCB0b2NfZm9vdGVyX2VuZCk6IE5ldyBzdHJpbmdzLgotCShIdG1sRm9ybWF0dGVyOjpodG1sX2hlYWRlcik6IFVwZGF0ZWQuCi0JKEh0bWxGb3JtYXR0ZXI6Omh0bWxfaW5kZXhfaGVhZGVyLCBIdG1sRm9ybWF0dGVyOjpodG1sX3RvY19oZWFkZXIpOgotCU5ldyBzdHJpbmdzLgotCShIdG1sRm9ybWF0dGVyOjppbmRleF9lbnRlcik6IFVzZSBgaHRtbF9pbmRleF9oZWFkZXInLgotCShIdG1sRm9ybWF0dGVyOjppbmRleF9leGl0KTogUHJpbnQgYGh0bWxfZm9vdGVyJy4KLQkoSHRtbEZvcm1hdHRlcjo6dG9jX2VudGVyKTogVXNlIGBodG1sX3RvY19oZWFkZXInLgotCShIdG1sRm9ybWF0dGVyOjp0b2NfZXhpdCk6IFByaW50IHByb3BlciBmb290ZXIuCi0KLQlDb252ZXJ0IH4gdG8gbm9uLWJyZWFrYWJsZSBzcGFjZS4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAobWFrZV9odG1sX3BhcmEpOiBJbXBsZW1lbnQgaXQuCi0JVXBkYXRlIGhlYWRlciBmaWxlcyBhY2NvcmRpbmdseS4KLQotMjAwOC0wNi0yNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQ2hlY2sgdHlwZSBgUmVzb3VyY2VJbmRleCcgZXhwbGljaXRseQotCWFuZCBkZWZpbmUgSEFWRV9UWVBFX1JFU09VUkNFX0lOREVYIGlmIGl0IGlzIGRlZmluZWQuICBNYWMgT1MgWCAxMC41Ci0JYnVuZGxlcyAxMC40dSBTREsgd2l0aCBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgbWFjcm8gYnV0IHdpdGhvdXQKLQlSZXNvdXJjZUluZGV4IHR5cGUgZGVmaW5pdGlvbi4gIFRoZSBtYWNybyBkb2VzIG5vdCBpbmZvcm0gdGhlIHR5cGUKLQlhdmFpbGFiaWxpdHkuCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBNb3JlIHBhcmVudGhlc2VzIGFyZSBpbnNlcnRlZCB0byBjbGFyaWZ5IHRoZQotCWNvbmRpdGlvbmFscyB0byBkaXNhYmxlIGxlZ2FjeSBBUElzIGluIGAxMC41IGFuZCBsYXRlcicgY2FzZXMuICBJZgotCUhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCBpcyBub3QgZGVmaW5lZCwgUmVzb3VyY2VJbmRleCBpcyBkZWZpbmVkLgotCi0yMDA4LTA2LTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfU0NBTlRZUEUpOiBEb24ndCBjaGVjayByZW5kZXJpbmcKLQltb2RlLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKFJlbmRlcl9HbHlwaCwgUmVuZGVyX0dyYXlfR2x5cGgsCi0JRHJhd19Td2VlcCk6IE5vLWRyb3BvdXQgbW9kZSBpcyB2YWx1ZSAyLCBub3QgdmFsdWUgMC4KLQkoRHJhd19Td2VlcCk6IFJlYWxseSBza2lwIGRyb3BvdXQgaGFuZGxpbmcgZm9yIG5vLWRyb3BvdXQgbW9kZS4KLQotMjAwOC0wNi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHQxX2J1aWxkZXJfY2xvc2VfY29udG91cik6IERvbid0IGFkZCBjb250b3VyCi0JaWYgaXQgY29uc2lzdHMgb2Ygb25lIHBvaW50IG9ubHkuICBCYXNlZCBvbiBhIHBhdGNoIGZyb20gU2F2YW5uYWgKLQlidWcgIzIzNjgzIChmcm9tIEpvaG4gVHl0Z2F0KS4KLQotMjAwOC0wNi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0dseXBoKTogUHJvdGVjdCBieXRlY29kZSBzdHVmZgotCXdpdGggSVNfSElOVEVELgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDgtMDYtMjIgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IElmIENGTEFHUyBoYXMgYC1pc3lzcm9vdCBYWFgnIG9wdGlvbgotCWJ1dCBMREZMQUdTIGRvZXMgbm90LCBpbXBvcnQgaXQgdG8gTERGTEFHUy4gIFRoZSBvcHRpb24gaXMgdXNlZCB0bwotCXNwZWNpZnkgbm9uLWRlZmF1bHQgU0RLIG9uIE1hYyBPUyBYIChlLmcuLCB1bml2ZXJzYWwgYmluYXJ5IFNESyBmb3IKLQlNYWMgT1MgWCAxMC40IG9uIFBvd2VyUEMgcGxhdGZvcm0pLiAgQWx0aG91Z2ggQXBwbGUgVGVjaE5vdGUgMjEzNwotCXJlY29tbWVuZHMgdG8gYWRkIHRoZSBvcHRpb24gb25seSB0byBDRkxBR1MsIExERkxBR1Mgc2hvdWxkIGluY2x1ZGUKLQlpdCBiZWNhdXNlIGxpYmZyZWV0eXBlLmxhIGlzIGJ1aWx0IHdpdGggLW5vLXVuZGVmaW5lZC4gIFRoaXMgZml4ZXMgYQotCWJ1ZyByZXBvcnRlZCBieSBSeWFuIFNjaG1pZHQgaW4gTWFjUG9ydHMsCi0JaHR0cDovL3RyYWMubWFjcG9ydHMub3JnL3RpY2tldC8xNTMzMS4KLQotMjAwOC0wNi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRW5hYmxlIGFjY2VzcyB0byB0aGUgdmFyaW91cyBkcm9wb3V0IHJ1bGVzIG9mIHRoZSBCJlcgcmFzdGVyaXplci4KLQlQYXNzIGRyb3BvdXQgcnVsZXMgZnJvbSB0aGUgVFQgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gdGhlCi0JcmFzdGVyaXplci4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmggKEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFMsCi0JRlRfT1VUTElORV9FWENMVURFX1NUVUJTKTogTmV3IGZsYWdzIGZvciBGVF9PdXRsaW5lLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKFZlcnRpY2FsX1N3ZWVwX0Ryb3AsIEhvcml6b250YWxfU3dlZXBfRHJvcCwKLQlIb3Jpem9udGFsX0dyYXlfU3dlZXBfRHJvcCk6IFVzZSBzYW1lIG1vZGUgbnVtYmVycyBhcyBnaXZlbiBpbiB0aGUKLQlPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLgotCUZpeCBtb2RlIDQgY29tcHV0YXRpb24uCi0JKFJlbmRlcl9HbHlwaCwgUmVuZGVyX0dyYXlfR2x5cGgpOiBIYW5kbGUgbmV3IG91dGxpbmUgZmxhZ3MuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfR2x5cGgpIENvbnZlcnQgc2NhbiBjb252ZXJzaW9uCi0JbW9kZSB0byBGVF9PVVRMSU5FX1hYWCBmbGFncy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TQ0FOQ1RSTCk6IEVuYWJsZSBwcGVtIGNoZWNrLgotCi0yMDA4LTA2LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogQ29tcHV0ZSBmaW5hbAotCWBkaWN0LT51bml0c19wZXJfZW0nIHZhbHVlIGJlZm9yZSBhc3NpZ25pbmcgaXQgdG8KLQlgY2ZmZmFjZS0+dW5pdHNfcGVyX0VNJy4gIE90aGVyd2lzZSwgQ0ZGcyB3aXRob3V0IHN1YmZvbnRzIGFyZQotCXNjYWxlZCBpbmNvcnJlY3RseSBpZiB0aGUgZm9udCBtYXRyaXggaXMgbm9uLXN0YW5kYXJkLiAgVGhpcyBmaXhlcwotCVNhdmFubmFoIGJ1ZyAjMjM2MzAuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwOC0wNi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KTogU2xpZ2h0bHkgaW1wcm92ZSBhbGdvcml0aG0gZml4Ci0JZnJvbSAyMDA4LTA2LTE5LgotCi0yMDA4LTA2LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlL3Qxb2Jqcy5jIChUMV9GYWNlX0luaXQpOiBGaXggY2hhbmdlIGZyb20gMjAwOC0wMy0yMS4KLQlSZXBvcnRlZCBieSBQZXRlciBXZWlsYmFjaGVyIDxtb3ppbGxhQHdlaWxiYWNoZXIub3JnPi4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA4LTA2LTE1ICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCSogc3JjL290dmFsaWQvb3R2Z3Bvcy5jIChvdHZfTWFya0Jhc2VQb3NfdmFsaWRhdGUpOiBTZXQKLQlgdmFsaWQtPmV4dHJhMicgdG8gMS4gIFRoaXMgaXMgdW5kb2N1bWVudGVkIGluIHRoZSBPcGVuVHlwZSAxLjUKLQlzcGVjaWZpY2F0aW9uLgotCi0yMDA4LTA2LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NdWxGaXgpIDxhc20+OiBQcm90ZWN0IHJlZ2lzdGVycyBjb3JyZWN0bHkKLQlmcm9tIGNsb2JiZXJpbmcuICBQYXRjaCBmcm9tIFNhdmFubmFoIGJ1ZyByZXBvcnQgIzIzNTU2LgotCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IGl0LgotCi0yMDA4LTA2LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGF1dG9nZW4uc2g6IEFkZCBvcHRpb24gYC0taW5zdGFsbCcgdG8gbGlidG9vbGl6ZS4KLQotMjAwOC0wNi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuMy42IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMy02Jy4KLQotCSogZG9jcy9DSEFOR0VTLCBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcAotCXZlcnNpb24gbnVtYmVyIHRvIDIuMy42LgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIGJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2o6IHMvMi4zLjUvMi4zLjYvLCBzLzIzNS8yMzYvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDYuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byA5OjE3OjMuCi0KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9CdWlsZGVyUmVjKTogUmVtb3ZlIGBzY2FsZV94JwotCWFuZCBgc2NhbGVfeScuCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmggKENGRl9CdWlsZGVyKTogUmVtb3ZlIGBzY2FsZV94JyBhbmQgYHNjYWxlX3knLgotCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ILgotCSogc3JjL2NmZi9jZmZvYmpzLmg6IEluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ILgotCi0yMDA4LTA2LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChvcGVuX2ZhY2UpOiBDaGVjayBgY2xhenotPmluaXRfZmFjZScgYW5kCi0JYGNsYXp6LT5kb25lX2ZhY2UnLgotCi0yMDA4LTA2LTA5ICBWYURpTSAgPHNfc2xpdmFAcmFtYmxlci5ydT4KLQotCVN1cHBvcnQgZGVidWdnaW5nIG9uIFdpbkNFLiAgRnJvbSBTYXZhbm5haCBwYXRjaCAjNjUzNjsgdGhpcyBmaXhlcwotCWJ1ZyAjMjM0OTcuCi0KLQkqIGJ1aWxkcy93aW4zMi9mdGRlYnVnLmMgKE91dHB1dERlYnVnU3RyaW5nRXgpOiBOZXcgZnVuY3Rpb24vbWFjcm8KLQlhcyBhIHJlcGxhY2VtZW50IGZvciBPdXRwdXREZWJ1Z1N0cmluZ0EgKHdoaWNoIFdpbkNFIGRvZXNuJ3QgaGF2ZSkuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCShmdF9kZWJ1Z19pbml0KSBbX1dJTjMyX0NFXTogV2luQ0UgYXBwYXJlbnRseSBkb2Vzbid0IGhhdmUKLQllbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0KLTIwMDgtMDYtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogUkVBRE1FLkNWUzogVXBkYXRlZC4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdywgYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluOiBVcGRhdGVkCi0JZm9yIG5ld2VyIHZlcnNpb25zIG9mIGF1dG9jb25mIGFuZCBmcmllbmRzLgotCi0yMDA4LTA2LTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MXBhcnNlLmggKFQxX1BhcnNlclJlYyk6IE1ha2UgYGJhc2VfbGVuJyBhbmQKLQlgcHJpdmF0ZV9sZW4nIHVuc2lnbmVkLgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChyZWFkX3BmYl90YWcpOiBNYWtlIGBhc2l6ZScgdW5zaWduZWQgYW5kIHJlYWQKLQlpdCBhcyBzdWNoLgotCShUMV9OZXdfUGFyc2VyLCBUMV9HZXRfUHJpdmF0ZV9EaWN0KTogTWFrZSBgc2l6ZScgdW5zaWduZWQuCi0KLQotCSogc3JjL2Jhc2UvZnRzdHJlYW0uYyAoRlRfU3RyZWFtX1NraXApOiBSZWplY3QgbmVnYXRpdmUgdmFsdWVzLgotCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfYmxlbmRfZGVzaWduX3Bvc2l0aW9ucyk6IENoZWNrIGBuX2F4aXMnCi0JZm9yIHNhbmUgdmFsdWUuCi0JRml4IHR5cG8uCi0KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc190YWJsZV9hZGQpOiBDaGVjayBgaWR4JyBjb3JyZWN0bHkuCi0KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwIChJbnNfU0hDKTogVXNlIEJPVU5EUygpIHRvIGNoZWNrCi0JYGxhc3RfcG9pbnQnLgotCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfbWF4X3Byb2ZpbGUpOiBMaW1pdAotCWBtYXhUd2lsaWdodFBvaW50cycuCi0KLTIwMDgtMDYtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JUCk6IEhhbmRsZSBjYXNlIGBvcmdfZGlzdCA9PSAwJwotCWNvcnJlY3RseS4gIFRoaXMgZml4ZXMgZ2x5cGhzIGB0JyBhbmQgYGgnIG9mIEFyaWFsIE5hcnJvdyBhdCAxMnBwZW0uCi0KLTIwMDgtMDYtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmggKEZUQ19GYWNlSUQpOiBDaGFuZ2UgdHlwZSBiYWNrIHRvCi0JRlRfUG9pbnRlci4gIFJlcG9ydGVkIGJ5IElhbiBCcml0dGVuIDxicml0dGVuQGNhcmlzLmNvbT4uCi0KLTIwMDgtMDYtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUVtaXQgaGVhZGVyIGluZm8gZm9yIGRlZmluZWQgRnJlZVR5cGUgb2JqZWN0cyBpbiByZWZlcmVuY2UuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci9jb250ZW50LnB5IChyZV9oZWFkZXJfbWFjcm8pOiBOZXcgcmVnZXhwLgotCShDb250ZW50UHJvY2Vzc29yOjpfX2luaXRfXyk6IEluaXRpYWxpemUgbmV3IGRpY3Rpb25hcnkgYGhlYWRlcnMnLgotCShEb2NCbG9jazo6X19pbml0X18pOiBDb2xsZWN0IG1hY3JvIGhlYWRlciBkZWZpbml0aW9ucy4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAoaGVhZGVyX2xvY2F0aW9uX2hlYWRlciwKLQloZWFkZXJfbG9jYXRpb25fZm9vdGVyKTogTmV3IHN0cmluZ3MuCi0JKEh0bWxGb3JtYXR0ZXI6Ol9faW5pdF9fKTogUGFzcyBgaGVhZGVycycgZGljdGlvbmFyeS4KLQkoSHRtbEZvcm1hdHRlcjo6cHJpbnRfaHRtbF9maWVsZCk6IERvbid0IGVtaXQgcGFyYWdyYXBoIHRhZ3MuCi0JKEh0bWxGb3JtYXR0ZXI6OnByaW50X2h0bWxfZmllbGRfbGlzdCk6IEVtaXQgZW1wdHkgcGFyYWdyYXBoLgotCShIdG1sRm9ybWF0dGVyOjpibG9ja19lbnRlcik6IEVtaXQgaGVhZGVyIGluZm8uCi0KLTIwMDgtMDYtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfVU5QQVRFTlRFRF9ISU5USU5HX0gsCi0JRlRfSU5DUkVNRU5UQUxfSCk6IEFkZGVkLgotCi0yMDA4LTA1LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9kb2NtYWtlci9zb3VyY2VzLnB5IChTb3VyY2VCbG9jazo6X19pbml0X18pOiBXaGlsZQotCWxvb2tpbmcgZm9yIG1hcmt1cCB0YWdzLCByZXR1cm4gaW1tZWRpYXRlbHkgYXMgc29vbiBhIHNpbmdsZSBvbmUgaXMKLQlmb3VuZC4KLQotMjAwOC0wNS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX01EKTogVGhlIE1EIGluc3RydWN0aW9uIGFsc28gdXNlcwotCW9yaWdpbmFsLCB1bnNjYWxlZCBpbnB1dCB2YWx1ZXMuICBDb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2sgZnJvbQotCU1pY3Jvc29mdC4KLQotMjAwOC0wNS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChibG9ja19mb290ZXJfc3RhcnQsCi0JYmxvY2tfZm9vdGVyX21pZGRsZSk6IEJlYXV0aWZ5IG91dHB1dC4KLQotMjAwOC0wNS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKGZjX2JsYWNrX3JlbmRlcik6IFJldHVybiAwIHdoZW4gd2UgYXJlCi0JdHJ5aW5nIHRvIHJlbmRlciBpbnRvIGEgemVyby13aWR0aC9oZWlnaHQgYml0bWFwLCBub3QgYW4gZXJyb3IgY29kZS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IE1vdmUgaW5pdGlhbGl6YXRpb24KLQlvZiB0aGUgZ3JhcGhpY3Mgc3RhdGUgZm9yIHN1YmdseXBocyB0by4uLgotCShUVF9IaW50X0dseXBoKTogVGhpcyBmdW5jdGlvbi4KLQlIaW50aW5nIGluc3RydWN0aW9ucyBmb3IgYSBjb21wb3NpdGUgZ2x5cGggYXBwYXJlbnRseSByZWZlciB0byB0aGUKLQlqdXN0IGhpbnRlZCBzdWJnbHlwaHMsIG5vdCB0aGUgdW5oaW50ZWQsIHVuc2NhbGVkIG91dGxpbmUuICBUaGlzCi0Jc2VlbXMgdG8gZml4IFNhdmFubmFoIGJ1Z3MgIzIwOTczIGFuZCAoYXQgbGVhc3QgcGFydGlhbGx5KSAjMjMzMTAuCi0KLTIwMDgtMDUtMjAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKEZUX05ld19GYWNlX0Zyb21fU3VpdGNhc2UpOiBDaGVjayBpZiB2YWxpZAotCWBhZmFjZScgaXMgcmV0dXJuZWQgYnkgRlRfTmV3X0ZhY2VfRnJvbV9GT05EKCkuICBUaGUgcGF0Y2ggd2FzCi0JcHJvcG9zZWQgYnkgYW4gYW5vbnltb3VzIHJlcG9ydGVyIG9mIFNhdmFubmFoIGJ1ZyAjMjMyMDQuCi0KLTIwMDgtMDUtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uYyAocHNfaGludHNfYXBwbHkpOiBSZXNldCBzY2FsZSB2YWx1ZXMgYWZ0ZXIKLQljb3JyZWN0aW9uIGZvciBwaXhlbCBib3VuZGFyeS4gIFdpdGhvdXQgdGhpcyBwYXRjaCwgdGhlIGVmZmVjdCBjYW4KLQliZSBjdW11bGF0aXZlIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgbWFraW5nIGdseXBocyB0YWxsZXIgYW5kCi0JdGFsbGVyIGFmdGVyIGVhY2ggY2FsbC4gIFRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMxOTk3Ni4KLQotMjAwOC0wNS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGRlYnVnLmMgKEZUX01lc3NhZ2UsIEZUX1BhbmljKTogU2VuZCBvdXRwdXQgdG8gc3RkZXJyLgotCVRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMyMzI4MC4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA4LTA1LTE4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKGZ0X3dnbF9leHRyYV91bmljb2RlcywKLQlmdF93Z2xfZXh0cmFfZ2x5cGhfbmFtZXMsIGZ0X3dnbF9leHRyYV9nbHlwaF9uYW1lX29mZnNldHMsCi0JcHNfY2hlY2tfd2dsX25hbWUsIHBzX2NoZWNrX3dnbF91bmljb2RlKTogVXNlIGBzdGF0aWMnIHRvIG1ha2UKLQlkZWNsYXJhdGlvbnMgbm9uLWdsb2JhbC4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jOiBBZGQgbWlzc2luZyBjb21tZW50LgotCi0yMDA4LTA1LTE3ICBTYW0gSG9jZXZhciAgPHNhbWg+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfU2ltcGxlX0dseXBoKTogSGFuZGxlIHplcm8tY29udG91cgotCWdseXBocyBjb3JyZWN0bHkuICBQYXRjaCBmcm9tIFNhdmFubmFoIGJ1ZyAjMjMyNzcuCi0KLTIwMDgtMDUtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA4LTA1LTE2ICBTZXJnZXkgVG9sc3RvdiAgPHN0b2xzdG92QGVzcmkuY29tPgotCi0JSW1wcm92ZSBzdXBwb3J0IGZvciBXR0w0IGVuY29kZWQgZm9udHMuCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKFdHTF9FWFRSQV9MSVNUX1NJWkUpOiBOZXcgbWFjcm8uCi0JKGZ0X3dnbF9leHRyYV91bmljb2RlcywgZnRfd2dsX2V4dHJhX2dseXBoX25hbWVzLAotCWZ0X3dnbF9leHRyYV9nbHlwaF9uYW1lX29mZnNldHMpOiBOZXcgYXJyYXlzLgotCShwc19jaGVja193Z2xfbmFtZSwgcHNfY2hlY2tfd2dsX3VuaWNvZGUpOiBOZXcgZnVuY3Rpb25zLgotCShwc191bmljb2Rlc19pbml0KTogVXNlIHRoZW0gdG8gYWRkIGFkZGl0aW9uYWwgVW5pY29kZSBtYXBwaW5ncy4KLQotMjAwOC0wNS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykKLQk8b3BfY2xvc2VwYXRoPjogYGNsb3NlcGF0aCcgd2l0aG91dCBhIHBhdGggaXMgYSBuby1vcCwgbm90IGFuIGVycm9yCi0JKGNmLiB0aGUgUFMgcmVmZXJlbmNlIG1hbnVhbCkuCi0KLQlSZXBvcnRlZCBieSBNYXJ0aW4gTWNCcmlkZS4KLQotMjAwOC0wNS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdG9wbGV2ZWwubWsgKENPTkZJR19HVUVTUywgQ09ORklHX1NVQik6IFVwZGF0ZWQuCi0KLTIwMDgtMDUtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9zdWJycyk6IEFjY2VwdCBmb250cyB3aXRoIGEgc3VicnMgYXJyYXkKLQl3aGljaCBjb250YWlucyBhIHNpbmdsZSBidXQgZW1wdHkgZW50cnkuICBUaGlzIGlzIHRlY2huaWNhbGx5Ci0JaW52YWxpZCAoc2luY2UgaXQgbXVzdCBlbmQgd2l0aCBgcmV0dXJuJyksIGJ1dC4uLgotCi0JUmVwb3J0ZWQgYnkgTWFydGluIE1jQnJpZGUuCi0KLTIwMDgtMDUtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpbmlzaCBmaXggb2Ygc2NhbGluZyBidWcgb2YgQ0lELWtleWVkIENGRiBzdWJmb250cy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCwgc3JjL2Jhc2UvZnRjYWxjLmMKLQkoRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZCwgRlRfVmVjdG9yX1RyYW5zZm9ybV9TY2FsZWQpOiBOZXcKLQlmdW5jdGlvbnMuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5oIChDRkZfSW50ZXJuYWwpOiBOZXcgc3RydWN0LiAgSXQgaXMgdXNlZCB0bwotCXByb3ZpZGUgZ2xvYmFsIGhpbnRpbmcgZGF0YSBmb3IgYm90aCB0aGUgdG9wLWZvbnQgYW5kIGFsbCBzdWJmb250cwotCSh3aXRoIHByb3BlciBzY2FsaW5nKS4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9tYWtlX3ByaXZhdGVfZGljdCk6IE5ldyBmdW5jdGlvbiwgdXNpbmcKLQljb2RlIGZyb20gYGNmZl9zaXplX2luaXQnLgotCShjZmZfc2l6ZV9pbml0LCBjZmZfc2l6ZV9kb25lLCBjZmZfc2l6ZV9zZWxlY3QsIGNmZl9zaXplX3JlcXVlc3QpOgotCVVzZSBDRkZfSW50ZXJuYWwgYW5kIGhhbmRsZSBzdWJmb250cy4KLQkoY2ZmX2ZhY2VfaW5pdCk6IEhhbmRsZSB0b3AtZGljdCBhbmQgc3ViZm9udCBtYXRyaWNlcyBjb3JyZWN0bHk7Ci0JYXBwbHkgc29tZSBoZXVyaXN0aWMgaW4gY2FzZSBvZiB1bmxpa2VseSBtYXRyaXggY29uY2F0ZW5hdGlvbgotCXJlc3VsdHMuICBUaGlzIGhhcyBiZWVuIGRpc2N1c3NlZCB3aXRoIHBlb3BsZSBmcm9tIEFkb2JlICh0aGFua3MKLQlnb2VzIG1haW5seSB0byBEYXZpZCBMZW1vbikgd2hvIGNvbmZpcm0gdGhhdCB0aGUgQ0ZGIHNwZWNzIGFyZSBmdXp6eQotCWFuZCBub3QgY29ycmVjdC4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5oIChjZmZfZGVjb2Rlcl9wcmVwYXJlKTogQWRkIGBzaXplJyBhcmd1bWVudC4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfYnVpbGRlcl9pbml0KTogVXBkYXRlZC4KLQkoY2ZmX2RlY29kZXJfcHJlcGFyZSk6IEhhbmRsZSBoaW50cyBnbG9iYWxzIGZvciBzdWJmb250cy4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKGNmZl9zbG90X2xvYWQpOiBIYW5kbGluZyBzY2FsaW5nIG9mIHN1YmZvbnRzIHByb3Blcmx5LgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9maXhlZF9keW5hbWljKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfcGFyc2VfZm9udF9tYXRyaXgpOiBVc2UgaXQuCi0KLQkqIHNyYy9jZmYvY2ZmdHlwZXMuaCAoQ0ZGX0ZvbnREaWN0UmVjKTogTWFrZSBgdW5pdHNfcGVyX2VtJwotCUZUX1VMb25nLgotCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IGl0LgotCi0yMDA4LTA1LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2ZhY2VfZ2V0X2RsbF9mb250LCBGTlRfRmFjZV9Jbml0KToKLQlIYW5kbGUgY2FzZSBgZmFjZV9pbmRleCA8IDAnLgotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBpdC4KLQotMjAwOC0wNS0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRmlyc3Qgc3RlcHMgdG8gZml4IHRoZSBzY2FsaW5nIGJ1ZyBvZiBDSUQta2V5ZWQgQ0ZGIHN1YmZvbnRzLAotCXJlcG9ydGVkIGJ5IERpbmcgTGkgb24gMjAwOC8wMy8yOCBvbiBmcmVldHlwZS1kZXZlbC4KLQotCSogc3JjL2Jhc2UvY2ZmL2NmZnBhcnNlLmMgKHBvd2VyX3RlbnMpOiBOZXcgYXJyYXkuCi0JKGNmZl9wYXJzZV9yZWFsKTogUmV3cml0dGVuIHRvIGludHJvZHVjZSBhIGZvdXJ0aCBwYXJhbWV0ZXIgd2hpY2gKLQlyZXR1cm5zIHRoZSBgc2NhbGluZycgb2YgdGhlIHJlYWwgbnVtYmVyIHNvIHRoYXQgd2UgaGF2ZSBubwotCXByZWNpc2lvbiBsb3NzLiAgVGhpcyBpcyBub3QgdXNlZCB5ZXQuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCShjZmZfcGFyc2VfZml4ZWRfdGhvdXNhbmQpOiBSZXBsYWNlIHdpdGguLi4KLQkoY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCk6IFRoaXMgZnVuY3Rpb24uICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLTIwMDgtMDUtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBDYWxsIHRoZSBhdXRvLWhpbnRlciB3aXRob3V0Ci0JdHJhbnNmb3JtYXRpb24gc2luY2UgaXQgcmVjdXJzaXZlbHkgY2FsbHMgRlRfTG9hZF9HbHlwaC4gIFRoaXMgZml4ZXMKLQlTYXZhbm5haCBidWcgIzIzMTQzLgotCi0yMDA4LTA0LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoVDFfQnVpbGRlclJlYyk6IE1hcmsgYHNjYWxlX3gnCi0JYW5kIGBzY2FsZV95JyBhcyBvYnNvbGV0ZSBzaW5jZSB0aGV5IGFyZW4ndCB1c2VkLgotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jICh0MV9idWlsZGVyX2luaXQpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmggKENGRl9CdWlsZGVyKTogTWFyayBgc2NhbGVfeCcgYW5kIGBzY2FsZV95JyBhcwotCW9ic29sZXRlIHNpbmNlIHRoZXkgYXJlbid0IHVzZWQuCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9idWlsZGVyX2luaXQpOiBVcGRhdGVkLgotCi0yMDA4LTA0LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYyAoUENGX0ZhY2VfSW5pdCk6IFByb3RlY3QgY2FsbCB0bwotCWBGVF9TdHJlYW1fT3BlbkxaVycgd2l0aCBgRlRfQ09ORklHX09QVElPTl9VU0VfTFpXJy4gIEZyb20gU2F2YW5uYWgKLQlidWcgIzIyOTA5LgotCi0yMDA4LTA0LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2F1eC9wc2NvbnYuYyAoUFNfQ29udl9Ub0ZpeGVkKTogSW5jcmVhc2UgcHJlY2lzaW9uIGlmCi0JaW50ZWdlciBwYXJ0IGlzIHplcm8uCi0KLTIwMDgtMDQtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjb21waWxhdGlvbiB3aXRoIGcrKyA0LjEgKHdpdGggYm90aCBgc2luZ2xlJyBhbmQgYG11bHRpJwotCXRhcmdldHMpLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfT3Blbl9GYWNlKTogRG9uJ3QgZGVmaW5lIGEgdmFyaWFibGUgaW4gYmxvY2sKLQl3aGljaCBpcyBjcm9zc2VkIGJ5IGEgYGdvdG8nLgotCi0JKiBzcmMvb3R2YWxpZC9vdHZhbGlkLmggKG90dl9NQVRIX3ZhbGlkYXRlKTogQWRkIHByb3RvdHlwZS4KLQotMjAwOC0wMy0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IHN1cHBvcnQgZm9yIHN1YnNldHRlZCBDSUQta2V5ZWQgQ0ZGcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVELAotCUZUX0lTX0NJRF9LRVlFRCk6IE5ldyBtYWNyb3MuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogU2V0IG51bWJlciBvZiBnbHlwaHMgdG8gdGhlCi0JbWF4aW11bSBDSUQgdmFsdWUgaW4gQ0lELWtleWVkIENGRnMuCi0JSGFuZGxlIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgZmxhZy4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBpdC4KLQotCi0JRml4IENGRiBmb250IG1hdHJpeCBjYWxjdWxhdGlvbiBhbmQgaW1wcm92ZSBwcmVjaXNpb24uCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX3JlYWwpOiBJbmNyZWFzZSBwcmVjaXNpb24gaWYgaW50ZWdlcgotCXBhcnQgaXMgemVyby4KLQkoY2ZmX3BhcnNlX2ZvbnRfbWF0cml4KTogU2ltcGxpZnkgY29tcHV0YXRpb24gb2YgYHVuaXRzX3Blcl9lbSc7Ci0JdGhpcyBwcmV2ZW50cyBvdmVyZmxvdyBhbHNvLgotCi0KLQlTdXBwb3J0IEZUX0dldF9DSURfUmVnaXN0cnlfT3JkZXJpbmdfU3VwcGxlbWVudCBmb3IgUFMgQ0lEIGZvbnRzLgotCi0JKiBzcmMvY2lkL2NpZHJpdmVyLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9DSURfSC4KLQkoY2lkX2dldF9yb3MpOiBOZXcgZnVuY3Rpb24uCi0JKGNpZF9zZXJ2aWNlX2NpZF9pbmZvKTogTmV3IHNlcnZpY2Ugc3RydWN0dXJlLgotCShjaWRfc2VydmljZXMpOiBSZWdpc3RlciBpdC4KLQotMjAwOC0wMy0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRqdXN0bWVudHMgZm9yIFZpc3VhbCBDKysgOC4wLCBhcyByZXBvcnRlZCBieSBSYWluZXIgRGV5a2UuCi0KLQkqIGJ1aWxkcy9jb21waWxlci92aXN1YWxjLm1rIChDRkxBR1MpOiBSZW1vdmUgL1c1LgotCShBTlNJRkxBR1MpOiBBZGQgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFLgotCi0yMDA4LTAzLTIxICBMYXVyZW5jZSBEYXJieSAgPGxkYXJieT4KLQotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0luaXQpOiBVc2UgYC9XZWlnaHQnLiAgUGF0Y2ggZnJvbQotCVNhdmFubmFoIGJ1ZyAjMjI2NzUuCi0KLTIwMDgtMDMtMTMgIERlcmVrIENsZWdnICA8ZGNsZWdnQGFwcGxlLmNvbT4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X01NX1Zhcik6IEZpeCBuYW1lZCBzdHlsZSBsb29wLgotCVBhdGNoIGZyb20gU2F2YW5uYWggYnVnICMyMjU0MS4KLQotMjAwOC0wMy0wMyAgTWFzYXRvc2hpIEtpbXVyYSAgPFZZVjAzMzU0QG5pZnR5Lm5lLmpwPgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnksCi0JdHRfY21hcDE0X2ZpbmRfdmFyaWFudCk6IFJldHVybiBjb3JyZWN0IHZhbHVlLgotCSh0dF9jbWFwMTRfdmFyaWFudF9jaGFycyk6IEZpeCBjaGVjayBmb3IgYGRpJy4KLQotMjAwOC0wMi0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDgtMDItMjkgIFdvbGYKLQotCUFkZCBidWlsZCBzdXBwb3J0IGZvciBzeW1iaWFuIHBsYXRmb3JtLiAgRnJvbSBTYXZhbm5haCBidWcgIzIyNDQwLgotCi0JKiBidWlsZHMvc3ltYmlhbi8qOiBOZXcgZmlsZXMuCi0KLTIwMDgtMDItMjEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKHBhcnNlX2ZvbmQpOiBGaXggYSBidWcgb2YgUG9zdFNjcmlwdCBmb250IG5hbWUKLQlzeW50aGVzaXMuICBGb3IgYW55IGZhY2Ugb2YgYSBzcGVjaWZpZWQgRk9ORCwgYWx3YXlzIHRoZSBuYW1lIGZvcgotCXRoZSBmaXJzdCBmYWNlIHdhcyB1c2VkLiAgRXhjZXB0IG9mIGEgRk9ORCB0aGF0IHJlZmVycyBtdWx0aXBsZQotCVR5cGUxIGZvbnQgZmlsZXMsIHdyb25nIHN5bnRoZXNpemVkIGZvbnQgbmFtZXMgYXJlIG5vdCB1c2VkIGF0IGFsbCwKLQlzbyB0aGlzIGlzIGFuIGludmlzaWJsZSBidWcuICBBIGZldyBsaW1pdCBjaGVja3MgYXJlIGFkZGVkIHRvby4KLQotCSogYnVpbGRzL21hYy9mdG1hYy5jOiBEaXR0by4KLQotMjAwOC0wMi0yMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogU3BsaXQgY29tcGlsZXIgb3B0aW9uIHRvIGxpbmsgQ2FyYm9uCi0JZnJhbWV3b3JrcyB0byBvbmUgb3B0aW9uIGZvciBDb3JlU2VydmljZXMgZnJhbWV3b3JrIGFuZCBhbm90aGVyCi0Jb3B0aW9uIGZvciBBcHBsaWNhdGlvblNlcnZpY2VzIGZyYW1ld29yay4gIFRoZSBzcGxpdCBvcHRpb25zIGNhbiBiZQotCW1hbmFnZWQgYnkgR05VIGxpYnRvb2wgdG8gYXZvaWQgdW5yZXF1aXJlZCBkdXBsaWNhdGlvbiB3aGVuIEZyZWVUeXBlCi0JaXMgbGlua2VkIHdpdGggb3RoZXIgYXBwbGljYXRpb25zLiAgU3VnZ2VzdGVkIGJ5IERhbmllbCBNYWNrcywKLQlTYXZhbm5haCBidWcgIzIyMzY2LgotCi0yMDA4LTAyLTE4ICBWaWN0b3IgU3Rpbm5lciAgPHZpY3Rvci5zdGlubmVyQGhheXBvY2FsYy5jb20+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfSVVQKTogQ2hlY2sgbnVtYmVyIG9mIHBvaW50cy4gIEZpeAotCWZyb20gU2F2YW5uYWggYnVnICMyMjM1Ni4KLQotMjAwOC0wMi0xNyAgSm9uYXRoYW4gQmxvdyAgPGpvbkBudW1iZXItbm9uZS5jb20+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2csIGFmX2xvYWRlcl9sb2FkX2dseXBoKToKLQlDaGVjayBmb3IgdmFsaWQgY2FsbGJhY2sgcG9pbnRlcnMuCi0KLTIwMDgtMDItMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKEZUX05ld19GYWNlX0Zyb21fU0ZOVCk6IENoZWNrIHRoZSBzZm50IHJlc291cmNlCi0JaGFuZGxlIGJ5IGl0cyB2YWx1ZSBpbnN0ZWFkIG9mIFJlc0Vycm9yKCksIGZpeCBwcm92aWRlZCBieSBEZXJvbgotCUthem1haWVyLiAgQWNjb3JkaW5nIHRvIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIFJlZmVyZW5jZSwKLQlHZXRSZXNvdXJjZSgpLCBHZXQxUmVzb3VyY2UoKSwgR2V0TmFtZWRSZXNvdXJjZSgpLAotCUdldDFOYW1lZFJlc291cmNlKCkgYW5kIFJHZXRSZXNvdXJjZSgpIHNldCBub0VyciBidXQgcmV0dXJuIE5VTEwKLQloYW5kbGUgd2hlbiB0aGV5IGNhbiBub3QgZmluZCB0aGUgcmVxdWVzdGVkIHJlc291cmNlLiAgVGhlc2UKLQlmdW5jdGlvbnMgbmV2ZXIgcmV0dXJuIHVuZGVmaW5lZCB2YWx1ZXMsIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8KLQljaGVjayBpZiB0aGUgaGFuZGxlIGlzIG5vdCBOVUxMLgotCi0JKiBidWlsZHMvbWFjL2Z0bWFjLmMgKEZUX05ld19GYWNlX0Zyb21fU0ZOVCk6IERpdHRvLgotCi0yMDA4LTAyLTE0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdGJhc2UuYzogPGZ0bWFjLmM+IGlzIHJlcGxhY2VkIGJ5ICJmdG1hYy5jIiBhcyBvdGhlcgotCWluY2x1c2lvbiBzdHlsZXMuICBOb3cgaXQgYWx3YXlzIGluY2x1ZGVzIHNyYy9iYXNlL2Z0bWFjLmM7Ci0JYnVpbGRzL21hYy9mdG1hYy5jIGlzIG5ldmVyIGluY2x1ZGVkIGluIGFueSBjb25maWd1cmF0aW9uLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBQcmludCB3YXJuaW5nIGlmIGNvbmZpZ3VyZSBpcyBleGVjdXRlZAotCXdpdGggb3B0aW9ucyB0byBzcGVjaWZ5IENhcmJvbiBmdW5jdGlvbmFsaXRpZXMgZXhwbGljaXRseS4KLQotCSogZG9jcy9JTlNUQUxMLk1BQzogTm90ZSB0aGF0IGxlZ2FjeSBidWlsZHMvbWFjL2Z0bWFjLmMgaXMgbm90Ci0JaW5jbHVkZWQgYXV0b21hdGljYWxseSBhbmQgbWFudWFsIHJlcGxhY2VtZW50IGlzIHJlcXVpcmVkLgotCi0yMDA4LTAyLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy9tb2R1bGVzLm1rIChDTE9TRV9NT0RVTEUsIFJFTU9WRV9NT0RVTEUpLCBidWlsZHMvZGV0ZWN0Lm1rCi0JKGRvc19zZXR1cCksIGJ1aWxkcy9mcmVldHlwZS5tayAoY2xlYW5fcHJvamVjdF9kb3MsCi0JZGlzdGNsZWFuX3Byb2plY3RfZG9zKTogRG9uJ3QgdXNlIFwgYnV0ICQoU0VQKS4gIFJlcG9ydGVkIGJ5IER1bmNhbgotCU11cmRvY2guCi0KLTIwMDgtMDEtMTggIFN5bHZhaW4gUGFzY2hlICA8c3lsdmFpbi5wYXNjaGVAZ21haWwuY29tPgotCi0JKiBzcmMvYmFzZS9mdGxjZGZpbC5jIChfZnRfbGNkX2ZpbHRlcl9sZWdhY3kpOiBVcGRhdGVkIGNvbW1lbnQgdG8KLQltZW50aW9uIGludHJhLXBpeGVsIGFsZ29yaXRobS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9SZW5kZXJfTW9kZSk6IE1lbnRpb24gdGhhdAotCUZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyIGNhbiBiZSB1c2VkIHRvIHJlZHVjZSBmcmluZ2VzLgotCi0yMDA4LTAxLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoZnRfYmxhY2tfcmVuZGVyKTogQ2hlY2sgYG91dGxpbmUnIGJlZm9yZQotCXVzaW5nIGl0LiAgUmVwb3J0ZWQgYnkgQWxsYW4gWWFuZy4KLQotMjAwOC0wMS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKEZUX0NPTkZJR19PUFRJT05fNV9HUkFZX0xFVkVMUyk6IFJlbW92ZS4KLQotMjAwOC0wMS0xMiAgQWxsYW4gWWFuZywgSmlhbiBIdWEgLSBTSCAgPEFsbGFuLllhbmdAZm1jLmZ1aml0c3UuY29tPgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKGZ0X2JsYWNrX2luaXQpCi0JW0ZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lOR106IEZpeCBjb21waWxhdGlvbi4KLQotMjAwOC0wMS0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogSGFuZGxlIHRoZSBjYXNlCi0Jd2hlcmUgdGhlIG51bWJlciBvZiBjb250b3VycyBpbiBhIHNpbXBsZSBnbHlwaCBpcyB6ZXJvIChhbmQgd2hpY2gKLQlkb2VzIGNvbnRhaW4gYW4gZW50cnkgaW4gdGhlIGBnbHlmJyB0YWJsZSkuICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZwotCSMyMTk5MC4KLQotMjAwOC0wMS0wNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZvcm1hdHRpbmcgc3VnZ2VzdGVkIGJ5IFNlYW4gTWNCcmlkZS4KLQotCSogYnVpbGRzL21hYy9mdG1hYy5jOiBGb3JtYXR0aW5nICh0YWIgZXhwYW5kZWQpLgotCSogc3JjL2F1dG9maXQvYWZpbmRpYy5jOiBEaXR0by4KLQkqIHNyYy9iYXNlL2Z0Y2lkLmM6IERpdHRvLgotCSogc3JjL2Jhc2UvZnRtYWMuYzogRGl0dG8uCi0KLTIwMDctMTItMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmFzdGVyX3JlbmRlcik6IENoZWNrIGBvdXRsaW5lJwotCWNvcnJlY3RseS4KLQotMjAwNy0xMi0yMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUltcHJvdmVtZW50IG9mIFBPU0lYIHJlc291cmNlLWZvcmsgYWNjZXNzb3IgdG8gbG9hZCB1bnNvcnRlZAotCXJlZmVyZW5jZXMgaW4gYSByZXNvdXJjZS4gIEluIEhlbHZlTFRNTSAocmVzb3VyY2UtZm9yayBQb3N0U2NyaXB0Ci0JVHlwZTEgZm9udCBidW5kbGVkIHdpdGggTWFjIE9TIFggc2luY2UgMTAuMy54KSwgdGhlIGFwcGVhcmFuY2Ugb3JkZXIKLQlvZiBQRkIgY2h1bmtzIGlzIG5vdCBzb3J0ZWQ7IHNvcnRpbmcgdGhlIGNodW5rcyBieSByZWZlcmVuY2UgSURzIGlzCi0JcmVxdWlyZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oIChGVF9SRm9ya19SZWYpOiBOZXcgc3RydWN0dXJlCi0JdHlwZSB0byBzdG9yZSBhIHBhaXIgb2YgcmVmZXJlbmNlIElEIGFuZCBvZmZzZXQgdG8gdGhlIGNodW5rLgotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKGZ0X3JhY2Nlc3Nfc29ydF9yZWZfYnlfaWQpOiBOZXcgZnVuY3Rpb24gdG8KLQlzb3J0IEZUX1JGb3JrX1JlZiBieSB0aGVpciByZWZlcmVuY2UgSURzLgotCi0JKEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzKTogUmV0dXJucyBhbiBhcnJheSBvZiBvZmZzZXRzIHRoYXQgaXMKLQlzb3J0ZWQgYnkgcmVmZXJlbmNlIElELgotCi0yMDA3LTEyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX3JlYWwpOiBEb24ndCBhcHBseSBgcG93ZXJfdGVuJwotCWRpdmlzaW9uIHRvbyBlYXJseTsgb3RoZXJ3aXNlIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0KHMpIG9mIHRoZQotCWZpbmFsIHJlc3VsdCBhcmUgbG9zdCBhcyB0aGUgdmFsdWUgaXMgdHJ1bmNhdGVkIHRvIGFuIGludGVnZXIuICBUaGlzCi0JZml4ZXMgU2F2YW5uYWggYnVnICMyMTc5NCAod2hlcmUgdGhlIHBhdGNoIGhhcyBiZWVuIHBvc3RlZCB0b28pLgotCi0yMDA3LTEyLTA2ICBGaXggIDw0ZDg3NmI4MkBnbWFpbC5jb20+Ci0KLQlQYXNzIG9wdGlvbnMgZnJvbSBvbmUgY29uZmlndXJlIHNjcmlwdCB0byBhbm90aGVyIGFzLWlzIChub3QKLQlleHBhbmRlZCkuICBUaGlzIGlzIG5lZWRlZCBmb3Igb3B0aW9ucyBsaWtlCi0JLS1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScuCi0KLQkqIGJ1aWxkcy91bml4L2RldGVjdC5taywgY29uZmlndXJlOiBQcmV2ZW50IGFyZ3VtZW50IGV4cGFuc2lvbiBpbgotCWNhbGwgdG8gdGhlIChyZWFsKSBgY29uZmlndXJlJyBzY3JpcHQuCi0KLTIwMDctMTItMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IEZpeCBjb21waWxhdGlvbiBpZgotCVRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiBpc24ndCBkZWZpbmVkLgotCi0yMDA3LTEyLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlUaGVyZSBleGlzdCBDRkZzIHdoaWNoIGNvbnRhaW4gb3Bjb2RlcyBmb3IgdGhlIFR5cGUgMSBvcGVyYXRvcnMKLQlgaHNidycgYW5kIGBjbG9zZXBhdGgnIHdoaWNoIGFyZSBib3RoIGludmFsaWQgaW4gVHlwZSAyIGNoYXJzdHJpbmdzLgotCUhvd2V2ZXIsIGl0IGRvZXNuJ3QgaGFybSB0byBzdXBwb3J0IHRoZW0uCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoQ0ZGX09wZXJhdG9yKTogQWRkIGBjZmZfb3BfaHNidycgYW5kCi0JYGNmZl9vcF9jbG9zZXBhdGguJwotCShjZmZfYXJndW1lbnRfY291bnRzKTogRGl0dG8uCi0KLQkoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBIYW5kbGUgVHlwZSAxIG9wY29kZXMgOSAoY2xvc2VwYXRoKQotCWFuZCAxMyAoaHNidykgd2hpY2ggYXJlIGludmFsaWQgaW4gVHlwZSAyIGNoYXJzdHJpbmdzLgotCi0yMDA3LTEyLTA2ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX25ld3Zmcyk6IE5ldyBmdW5jdGlvbiB0bwotCXN1cHBvcnQgbmV3IHBhdGhuYW1lIHN5bnRheCBgLi5uYW1lZGZvcmsvcnNyYycgdG8gYWNjZXNzIGEgcmVzb3VyY2UKLQlmb3JrIG9uIE1hYyBPUyBYLiAgVGhlIGxlZ2FjeSBzeW50YXggYC9yc3JjJyBkb2VzIG5vdCB3b3JrIG9uCi0JY2FzZS1zZW5zaXRpdmUgSEZTKy4KLQkocmFjY2Vzc19ndWVzc19kYXJ3aW5faGZzcGx1cyk6IEZpeCBhIGJ1ZyBpbiB0aGUgY2FsY3VsYXRpb24gb2YKLQlidWZmZXIgc2l6ZSB0byBzdG9yZSBhIHBhdGhuYW1lLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmg6IEluY3JlbWVudCB0aGUgbnVtYmVyIG9mCi0JcmVzb3VyY2UgZm9yayBndWVzc2luZyBydWxlLgotCi0yMDA3LTEyLTA2ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBJbXByb3ZlIHRoZSBjb21waWxlIHRlc3RzIHRvIHNlYXJjaAotCUNhcmJvbiBmdW5jdGlvbnMuCi0JKiBidWlsZHMvbWFjL2Z0bWFjLmM6IEltcG9ydCBmaXhlcyBmb3IgQ2FyYm9uIGluY29tcGF0aWJpbGl0aWVzCi0JcHJvcG9zZWQgYnkgU2VhbiBNY0JyaWRlIGZyb20gc3JjL2Jhc2UvZnRtYWMuYyAoc2VlIDIwMDctMTEtMTYpLgotCi0yMDA3LTEyLTA2ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JVGhlIGRvY3VtZW50cyBhbmQgY29tbWVudHMgZm9yIE1hYyBPUyBYIGFyZSBpbXByb3ZlZCBieSBTZWFuCi0JTWNCcmlkZS4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYzogRml4IGEgY29tbWVudC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaDogRGl0dG8uCi0JKiBkb2NzL0lOU1RBTEwuTUFDOiBJbXByb3ZlIEVuZ2xpc2ggYW5kIGFkZCBjb21tZW50IG9uIGxvd2VzdAotCXN5c3RlbSB2ZXJzaW9uIHNwZWNpZmllZCBieSBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQuCi0KLTIwMDctMTItMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9zdWJmb250X2xvYWQpOiBEb24ndCB1c2UgbG9naWNhbCBPUiB0bwotCWNvbmNhdGVuYXRlIGVycm9yIGNvZGVzLgotCSogc3JjL3NmbnQvdHRzYml0LmMgKExvYWRfU0JpdF9SYW5nZSk6IERpdHRvLgotCi0yMDA3LTEyLTA0ICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZmFjZV9pbml0KTogRG9uJ3QgdXNlIGxvZ2ljYWwgT1IgdG8KLQljb25jYXRlbmF0ZSBlcnJvciBjb2Rlcy4KLQotMjAwNy0xMi0wNCAgU2VhbiBNY0JyaWRlICA8c2VhbkByb2d1ZS1yZXNlYXJjaC5jb20+Ci0KLQkqIHNyYy9wZnIvcGZyZ2xvYWQuYyAocGZyX2dseXBoX2xvYWRfY29tcG91bmQpOiBSZW1vdmUgY29tcGlsZXIKLQl3YXJuaW5nLgotCi0yMDA3LTExLTIwICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JRml4IE1hY09TIGxlZ2FjeSBmb250IHN1cHBvcnQgYnkgTWFzYXRha2UgWWFtYXRvIG9uIE1hYyBPUyBYLiAgSXQgaXMKLQlub3Qgd29ya2luZyBzaW5jZSAyLjMuNS4gIEluIEZUX09wZW5fTmV3KCksIGlmIEZUX05ld19TdHJlYW0oKQotCWNhbm5vdCBtbWFwKCkgdGhlIHNwZWNpZmllZCBmaWxlIGFuZCBjYW5ub3Qgc2VlayB0byBoZWFkIG9mIHRoZQotCXNwZWNpZmllZCBmaWxlLCBpdCByZXR1cm5zIE5VTEwgc3RyZWFtIGFuZCBGVF9PcGVuX05ldygpIHJldHVybnMgdGhlCi0JZXJyb3IgaW1tZWRpYXRlbHkuICBPbiBNYWNPUywgbW9zdCBsZWdhY3kgTWFjT1MgZm9udHMgZmFsbCBpbnRvIHN1Y2gKLQlhIHNjZW5hcmlvIGJlY2F1c2UgdGhlaXIgZGF0YSBmb3JrcyBhcmUgemVyby1zaXplZCBhbmQgY2Fubm90IGJlCi0Jc291Z2h0LiAgVG8gcHJvY2VlZCB0byBndWVzc2luZyBvZiByZXNvdXJjZSBmb3JrIGZvbnRzLCB0aGUKLQlmdW5jdGlvbnMgZm9yIGxlZ2FjeSBNYWNPUyBmb250IG11c3QgcHJvcGVybHkgaGFuZGxlIHRoZSBOVUxMIHN0cmVhbQotCXJldHVybmVkIGJ5IEZUX05ld19TdHJlYW0oKS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKElzTWFjQmluYXJ5KTogUmV0dXJuIGVycm9yCi0JRlRfRXJyX0ludmFsaWRfU3RyZWFtX09wZXJhdGlvbiBpbW1lZGlhdGVseSB3aGVuIE5VTEwgc3RyZWFtIGlzCi0JcGFzc2VkLgotCShGVF9PcGVuX0ZhY2UpOiBFdmVuIHdoZW4gRlRfTmV3X1N0cmVhbSgpIHJldHVybnMgYW4gZXJyb3IsIHByb2NlZWQKLQl0byBmYWxsYmFjay4gIE9yaWdpbmFsbHksIGxlZ2FjeSBNYWNPUyBmb250IGlzIHRlc3RlZCBpbiB0aGUgY2FzZXMKLQlvZiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uIChvY2N1cnMgd2hlbiBkYXRhIGZvcmsgaXMgZW1wdHkpCi0Jb3IgRlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQgKG9jY3VycyB3aGVuIEFwcGxlU2luZ2xlIGhlYWRlciBvcgotCS5kZm9udCBoZWFkZXIgaXMgY29tYmluZWQpLiAgTm93IHRoZSBjYXNlIG9mCi0JRlRfRXJyX0Nhbm5vdF9PcGVuX1N0cmVhbSBpcyBpbmNsdWRlZC4KLQotCSogc3JjL2Jhc2UvZnRyZm9yay5jIChGVF9SYWNjZXNzX0d1ZXNzKTogV2hlbiBwYXNzZWQgc3RyZWFtIGlzIE5VTEwsCi0Jc2tpcCBGVF9TdHJlYW1fU2VlaygpLCB3aGljaCBzZWVrcyB0byB0aGUgaGVhZCBvZiBzdHJlYW0sIGFuZAotCXByb2NlZWQgdG8gdW5pdCB0ZXN0aW5nIG9mIHJhY2Nlc3NfZ3Vlc3NfWFhYKCkuICBGVF9TdHJlYW1fU2VlaygpCi0JZm9yIGEgTlVMTCBzdHJlYW0gY2F1c2VzIGEgQnVzIGVycm9yIG9uIE1hYyBPUyBYLgotCShyYWNjZXNzX2d1ZXNzX2FwcGxlX2RvdWJsZSk6IFJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fU3RyZWFtCi0JaW1tZWRpYXRlbHkgaWYgcGFzc2VkIHN0cmVhbSBpcyBOVUxMLgotCShyYWNjZXNzX2d1ZXNzX2FwcGxlX3NpbmdsZSk6IERpdHRvLgotCi0yMDA3LTExLTE2ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JRml4IGZvciBDYXJib24gaW5jb21wYXRpYmlsaXRpZXMgc2luY2UgTWFjIE9TIFggMTAuNSwKLQlwcm9wb3NlZCBieSBTZWFuIE1jQnJpZGUuCi0KLQkqIGRvYy9JTlNUQUxMLk1BQzogQ29tbWVudCBvbiBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaDogRGVwcmVjYXRlIEZUX05ld19GYWNlX0Zyb21fRk9ORCBhbmQKLQlGVF9HZXRGaWxlUGF0aF9Gcm9tX01hY19BVFNfTmFtZS4gIFNpbmNlIE1hYyBPUyBYIDEwLjUsIGNhbGxpbmcKLQlDYXJib24gZnVuY3Rpb25zIGZyb20gYSBmb3JrZWQgcHJvY2VzcyBpcyBjbGFzc2lmaWVkIGFzIHVuc2FmZQotCWJ5IEFwcGxlLiAgQWxsIENhcmJvbi1kZXBlbmRlbnQgZnVuY3Rpb25zIHNob3VsZCBiZSBkZXByZWNhdGVkLgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBVc2UgZXNzZW50aWFsIGhlYWRlciBmaWxlcwotCTxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+IGFuZAotCTxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4gaW5zdGVhZCBvZgotCWFsbC1pbi1vbmUgaGVhZGVyIGZpbGUgPENhcmJvbi9DYXJib24uaD4uCi0KLQlJbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+IGFuZCByZXBsYWNlIEhGU19NQVhQQVRITEVOIGJ5IEFwcGxlCi0JZ2VudWluZSBtYWNybyBQQVRIX01BWC4KLQotCUFkZCBmYWxsYmFjayBtYWNybyBmb3Iga0FUU09wdGlvbkZsYWdzVW5SZXN0cmljdGVkU2NvcGUgd2hpY2gKLQlpcyBub3QgZm91bmQgaW4gTWFjIE9TIFggMTAuMC4KLQotCU11bHRpLWNoYXJhY3RlciBjb25zdGFudHMgKCdQT1NUJywgJ3NmbnQnIGV0YykgYXJlIHJlcGxhY2VkIGJ5Ci0JNjRiaXQgY29uc3RhbnRzIGNhbGN1bGF0ZWQgYnkgRlRfTUFLRV9UQUcoKSBtYWNyby4KLQotCUZvciB0aGUgaW5kZXggaW4gdGhlIHNlZ21lbnQgb2YgcmVzb3VyY2UgZm9yaywgbmV3IHBvcnRhYmxlCi0JdHlwZSBSZXNvdXJjZUluZGV4IGlzIGludHJvZHVjZWQgZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LgotCVRoaXMgdHlwZSBpcyBzaW5jZSBNYWMgT1MgWCAxMC41LCBzbyBpdCBpcyBkZWZpbmVkIGFzIHNob3J0Ci0Jd2hlbiBidWlsdCBvbiBvbGRlciBwbGF0Zm9ybXMuCi0KLQkoRlRfQVRTRm9udEdldEZpbGVSZWZlcmVuY2UpOiBJZiBidWlsZCB0YXJnZXQgaXMgb25seSB0aGUgc3lzdGVtcwotCTEwLjUgYW5kIG5ld2VyLCBpdCBjYWxscyBBcHBsZSBnZW51aW5lIEFUU0ZvbnRHZXRGaWxlUmVmZXJlbmNlKCkuCi0KLQkoRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZSk6IFJldHVybiBhbiBlcnJvciBpZiBzeXN0ZW0gaXMgMTAuNQotCWFuZCBuZXdlciBvciA2NGJpdCBwbGF0Zm9ybSwgYmVjYXVzZSBsZWdhY3kgdHlwZSBGU1NwZWMgdHlwZSBpcwotCXJlbW92ZWQgY29tcGxldGVseS4KLQotCShGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyk6IERpdHRvLgotCi0yMDA3LTExLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2RvbmVfZmFjZSk6IENoZWNrIGBzZm50JyBldmVyeXdoZXJlLiAgVGhpcwotCWZpeGVzIFNhdmFubmFoIGJ1ZyAjMjE0ODUuCi0KLTIwMDctMTAtMjkgIERhbmllbCBTdm9ib2RhICA8ZGFzdm9AcGxhbmV0YUBjej4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfRmFjZV9Jbml0KTogQ2hlY2sgZmlyc3QgdGhhdCB0aGUgZHJpdmVyCi0JY2FuIGhhbmRsZSB0aGUgZm9udCBhdCBhbGwsIHRoZW4gY2hlY2sgYGZhY2VfaW5kZXgnLiAgT3RoZXJ3aXNlLCB0aGUKLQlkcml2ZXIgbWlnaHQgcmV0dXJuIHRoZSB3cm9uZyBlcnJvciBjb2RlLiAgVGhpcyBmaXhlcyBTYXZhbm5haCBidWcKLQkjMjE0NjguCi0KLTIwMDctMTAtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogU3VwcG9ydCBiaXQgOSBhbmQgcHJlcGFyZQotCXN1cHBvcnQgZm9yIGJpdCA4IG9mIHRoZSBgZnNTZWxlY3Rpb24nIGZpZWxkIGluIHRoZSBgT1MvMicgdGFibGUuCi0JTVMgaXMgYWxyZWFkeSB1c2luZyB0aGlzOyBob3BlZnVsbHksIHRoaXMgYmVjb21lcyBwYXJ0IG9mIE9wZW5UeXBlCi0JMS41LgotCVByZXBhcmUgYWxzbyBzdXBwb3J0IGZvciBgbmFtZScgSURzIDIxIChXV1NfRkFNSUxZKSBhbmQgMjIKLQkoV1dTX1NVQkZBTUlMWSkuCi0KLTIwMDctMTAtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAoaHRtbF9oZWFkZXJfMik6IEZpeCB0eXBvLgotCUFkZCBgdGQubGVmdCcgZWxlbWVudCB0byBDU1MuCi0JKHRvY19zZWN0aW9uX2VudGVyKTogVXNlIGl0LgotCi0yMDA3LTEwLTE4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCwgc3JjL2Jhc2UvZnRvYmpzLmM6IFJlbmFtZSBBUEkKLQlmdW5jdGlvbnMgcmVsYXRlZCB0byBjbWFwIHR5cGUgMTQgc3VwcG9ydCB0byB0aGUKLQlgRlRfT2JqZWN0X0FjdGlvbk5hbWUnIHNjaGVtZToKLQotCSAgRlRfR2V0X0NoYXJfVmFyaWFudF9JbmRleCAgICAgLT4gRlRfRmFjZV9HZXRDaGFyVmFyaWFudEluZGV4Ci0JICBGVF9HZXRfQ2hhcl9WYXJpYW50X0lzRGVmYXVsdCAtPiBGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0Ci0JICBGVF9HZXRfVmFyaWFudF9TZWxlY3RvcnMgICAgICAtPiBGVF9GYWNlX0dldFZhcmlhbnRTZWxlY3RvcnMKLQkgIEZUX0dldF9WYXJpYW50c19PZl9DaGFyICAgICAgIC0+IEZUX0ZhY2VfR2V0VmFyaWFudHNPZkNoYXIKLQkgIEZUX0dldF9DaGFyc19PZl9WYXJpYW50ICAgICAgIC0+IEZUX0ZhY2VfR2V0Q2hhcnNPZlZhcmlhbnQKLQotCVVwZGF0ZSBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYzogU3Ryb25nZXIgY21hcCAxNCB2YWxpZGF0aW9uLgotCU1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSBjb25zaXN0ZW50IHdpdGggRnJlZVR5cGUgY29kaW5nCi0JY29udmVudGlvbnMgYW5kIG1vZGlmeSB0aGUgY21hcDE0IGZ1bmN0aW9ucyB0aGF0IHJldHVybmVkIGEgbmV3bHkKLQlhbGxvY2F0ZWQgYXJyYXkgdG8gdXNlIGEgcGVyc2lzdGVudCB2ZWN0b3IgZnJvbSB0aGUgVFRfQ01hcDE0IG9iamVjdAotCWluc3RlYWQuCi0KLQkoVFRfQ01hcDE0UmVjKTogUHJvdmlkZSBhcnJheSBhbmQgYXV4aWxpYXJ5IGRhdGEgZm9yIHJlc3VsdC4KLQkodHRfY21hcDE0X2RvbmUsIHR0X2NtYXAxNF9lbnN1cmUpOiBOZXcgZnVuY3Rpb25zLgotCi0JKHR0X2NtYXAxNF9pbml0LCB0dF9jbWFwMTRfdmFsaWRhdGUsIHR0X2NtYXAxNF9jaGFyX21hcF9kZWZfYmluYXJ5LAotCXR0X2NtYXAxNF9jaGFyX21hcF9ub25kZWZfYmluYXJ5LCB0dF9jbWFwMTRfZmluZF92YXJpYW50LAotCXR0X2NtYXAxNF9jaGFyX3Zhcl9pbmRleCwgdHRfY21hcDE0X3ZhcmlhbnRzLAotCXR0X2NtYXAxNF9jaGFyX3ZhcmlhbnRzLCB0dF9jbWFwMTRfZGVmX2NoYXJfY291bnQsCi0JdHRfY21hcDE0X2dldF9kZWZfY2hhcnMsIHR0X2NtYXAxNF9nZXRfbm9uZGVmX2NoYXJzLAotCXR0X2NtYXAxNF92YXJpYW50X2NoYXJzLCB0dF9jbWFwMTRfY2xhc3NfcmVjKTogVXBkYXRlZCBhbmQgaW1wcm92ZWQuCi0KLTIwMDctMTAtMTUgIEdlb3JnZSBXaWxsaWFtcyAgPGd3d0BzaWxjb20uY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIGNtYXAgdHlwZSAxNC4KLQotCSogZGV2ZWwvZnRvcHRpb24uaCwgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAotCShUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTQpOiBOZXcgbWFjcm8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0NNYXBfQ2hhclZhckluZGV4RnVuYywKLQlGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jLCBGVF9DTWFwX1ZhcmlhbnRMaXN0RnVuYywKLQlGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMsIEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYyk6IE5ldwotCXN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkoRlRfQ01hcF9DbGFzc1JlYyk6IEFkZCB0aGVtLgotCVVwZGF0ZSBhbGwgdXNlcnMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaCAoVFRfQVBQTEVfSURfVkFSSUFOVF9TRUxFQ1RPUik6IE5ldwotCW1hY3JvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0dldF9DaGFyX1ZhcmlhbnRfSW5kZXgsCi0JRlRfR2V0X0NoYXJfVmFyaWFudF9Jc0RlZmF1bHQsIEZUX0dldF9WYXJpYW50X1NlbGVjdG9ycywKLQlGVF9HZXRfVmFyaWFudHNfT2ZfQ2hhciwgRlRfR2V0X0NoYXJzX09mX1ZhcmlhbnQpOiBOZXcgQVBJCi0JZnVuY3Rpb25zLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXApOiBOZXcgYXV4aWxpYXJ5Ci0JZnVuY3Rpb24uCi0JKEZUX1NldF9DaGFybWFwKTogRGlzYWxsb3cgY21hcHMgb2YgdHlwZSAxNC4KLQkoRlRfR2V0X0NoYXJfVmFyaWFudF9JbmRleCwgRlRfR2V0X0NoYXJfVmFyaWFudF9Jc0RlZmF1bHQsCi0JRlRfR2V0X1ZhcmlhbnRfU2VsZWN0b3JzLCBGVF9HZXRfVmFyaWFudHNfT2ZfQ2hhciwKLQlGVF9HZXRfQ2hhcnNfT2ZfVmFyaWFudCk6IE5ldyBBUEkgZnVuY3Rpb25zLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAoVFRfUEVFS19VSU5UMjQsIFRUX05FWFRfVUlOVDI0KTogTmV3IG1hY3Jvcy4KLQotCShUVF9DTWFwMTRSZWMsIHR0X2NtYXAxNF9pbml0LCB0dF9jbWFwMTRfdmFsaWRhdGUsCi0JdHRfY21hcDE0X2NoYXJfaW5kZXgsIHR0X2NtYXAxNF9jaGFyX25leHQsIHR0X2NtYXAxNF9nZXRfaW5mbywKLQl0dF9jbWFwMTRfY2hhcl9tYXBfZGVmX2JpbmFyeSwgdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnksCi0JdHRfY21hcDE0X2ZpbmRfdmFyaWFudCwgdHRfY21hcDE0X2NoYXJfdmFyX2luZGV4LAotCXR0X2NtYXAxNF9jaGFyX3Zhcl9pc2RlZmF1bHQsIHR0X2NtYXAxNF92YXJpYW50cywKLQl0dF9jbWFwMTRfY2hhcl92YXJpYW50cywgdHRfY21hcDE0X2RlZl9jaGFyX2NvdW50LAotCXR0X2NtYXAxNF9nZXRfZGVmX2NoYXJzLCB0dF9jbWFwMTRfZ2V0X25vbmRlZl9jaGFycywKLQl0dF9jbWFwMTRfdmFyaWFudF9jaGFycywgdHRfY21hcDE0X2NsYXNzX3JlYyk6IE5ldyBmdW5jdGlvbnMgYW5kCi0Jc3RydWN0dXJlcyBmb3IgY21hcCAxNCBzdXBwb3J0LgotCSh0dF9jbWFwX2NsYXNzZXMpOiBSZWdpc3RlciB0dF9jbWFwMTRfY2xhc3NfcmVjLgotCSh0dF9mYWNlX2J1aWxkX2NtYXBzKTogT25lIG1vcmUgZXJyb3IgbWVzc2FnZS4KLQotCSogZG9jcy9DSEFOR0VTOiBNZW50aW9uIGNtYXAgMTQgc3VwcG9ydC4KLQotMjAwNy0xMC0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZmluZF91bmljb2RlX2NoYXJtYXApOiBJZiBzZWFyY2ggZm9yIGEgVUNTLTQKLQljaGFybWFwIGZhaWxzLCBkbyB0aGUgbG9vcCBhZ2FpbiB3aGlsZSBzZWFyY2hpbmcgYSBVQ1MtMiBjaGFybWFwLgotCVRoaXMgZmF2b3VycyBNUyBjaGFybWFwcyBvdmVyIEFwcGxlIG9uZXMuCi0KLTIwMDctMDgtMjkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmM6IEludHJvZHVjdGlvbiBvZiBhYnN0cmFjdCBgc2hvcnQnIGRhdGEgdHlwZXMsCi0JUmVzRmlsZVJlZk51bSBhbmQgUmVzSUQuICBUaGVzZSB0eXBlcyB3ZXJlIGludHJvZHVjZWQgZm9yIENvcGxhbmQsCi0JdGhlbiBiYWNrcG9ydGVkIHRvIE1QVy4gIFRoZSB2YXJpYWJsZXMgZXhjaGFuZ2VkIHdpdGggRmlsZU1hbmFnZXIKLQlRdWlja0RyYXcgZnJhbWV3b3JrcyBhcmUgcmVkZWZpbmVkIGJ5IHRoZXNlIGRhdGEgdHlwZXMuICBQYXRjaCB3YXMKLQlwcm9wb3NlZCBieSBTZWFuIE1jQnJpZGUuCi0JKiBidWlsZHMvbWFjL2Z0bWFjLmM6IERpdHRvLgotCi0yMDA3LTA4LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9vdHZhbGlkL290dmNvbW1uLmMgKG90dl94X3lfdXhfc3kpOiBTa2lwIGNvbnRleHQgZ2x5cGhzLiAgRm91bmQKLQlieSBJbXJhbiBZb3VzYWYuICBGaXhlcyBTYXZhbm5haCBidWcgIzIwNzczLgotCi0JKG90dl9Mb29rdXBfdmFsaWRhdGUpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIExvb2t1cFR5cGUuICBGb3VuZCBieQotCUltcmFuIFlvdXNhZi4gIEZpeGVzIFNhdmFubmFoIGJ1ZyAjMjA3ODIuCi0KLTIwMDctMDgtMTcgIEdlb3JnZSBXaWxsaWFtcyAgPGd3d0BzaWxjb20uY29tPgotCi0JKiBzcmMvb3R2YWxpZC9vdHZnc3ViLmMgKG90dl9TaW5nbGVTdWJzdF92YWxpZGF0ZSk6IEZpeCBoYW5kbGluZyBvZgotCVNpbmdsZVN1YnN0Rm9ybWF0MS4KLQotMjAwNy0wOC0xMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogRml4IGEgYnVnIHdoaWNoIHNldHMgQ0NfQlVJTEQgYnkKLQkke2J1aWxkLWdjY30gKHVuY2hlY2tlZCkgaW5zdGVhZCBvZiBieSAke2J1aWxkfS1nY2MgKGNoZWNrZWQpLgotCUZvdW5kIGJ5IFJ5YW4gSGlsbC4KLQotMjAwNy0wOC0xMSAgR2VvcmdlIFdpbGxpYW1zICA8Z3d3QHNpbGNvbS5jb20+Ci0KLQkqIHNyYy9vdHZhbGlkL290dmNvbW1uLmMsIHNyYy9vdHZhbGlkL290dmNvbW1uLmgKLQkob3R2X0NvdmVyYWdlX3ZhbGlkYXRlKTogQWRkIGZvdXJ0aCBhcmd1bWVudCB0byBwYXNzIGFuIGV4cGVjdGVkCi0JY291bnQgdmFsdWUuICBVcGRhdGUgYWxsIHVzZXJzLgotCUNoZWNrIGdseXBoIElEcy4KLQkob3R2X0NsYXNzRGVmX3ZhbGlkYXRlKTogQ2hlY2sgYFN0YXJ0R2x5cGgnLgotCi0JKiBzcmMvb3R2YWxpZC9vdHZnc3ViLmMgKG90dl9TaW5nbGVTdWJzdF92YWxpZGF0ZSk6IE1vcmUgZ2x5cGggSUQKLQljaGVja3MuCi0KLQkqIHNyYy9vdHZhbGlkL290dm1hdGguYyAob3R2X01hdGhDb25zdGFudHNfdmFsaWRhdGUpOiBUaGVyZSBhcmUgb25seQotCTU2IGNvbnN0YW50cy4KLQkob3R2X0dseXBoQXNzZW1ibHlfdmFsaWRhdGUsIG90dl9NYXRoR2x5cGhDb25zdHJ1Y3Rpb25fdmFsaWRhdGUpOgotCUNoZWNrIGdseXBoIElEcy4KLQotMjAwNy0wOC0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvb3R2YWxpZC9vdHZiYXNlLmMsIHNyYy9vdHZhbGlkL290dmNvbW1uLmMsCi0Jc3JjL290dmFsaWQvb3R2Z2RlZi5jLCBzcmMvb3R2YWxpZC9vdHZncG9zLmMsIHNyYy9vdHZhbGlkL290dmdzdWIuYywKLQlzcmMvb3R2YWxpZC9vdHZqc3RmLmM6IHMvRlRfSU5WQUxJRF9EQVRBL0ZUX0lOVkFMSURfRk9STUFULyB3aGVyZQotCWFwcHJvcHJpYXRlLiAgUmVwb3J0ZWQgYnkgR2VvcmdlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogRGVmaW5lIGB0cmFjZV9vdHZtYXRoJy4KLQotCSogc3JjL290dmFsaWQvcnVsZXMubWsgKE9UVl9EUlZfU1JDKTogQWRkIG90dm1hdGguYy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA3LTA4LTA4ICBHZW9yZ2UgV2lsbGlhbXMgIDxnd3dAc2lsY29tLmNvbT4KLQotCUFkZCBgTUFUSCcgdmFsaWRhdGluZyBzdXBwb3J0IHRvIG90dmFsaWQgbW9kdWxlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oIChUVEFHX01BVEgpOiBOZXcgbWFjcm8uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0b3R2YWwuaCAoRlRfVkFMSURBVEVfTUFUSCk6IE5ldyBtYWNyby4KLQkoRlRfVkFMSURBVEVfT1QpOiBVcGRhdGVkLgotCi0JKiBzcmMvb3R2YWxpZC9vdHZtYXRoLmM6IE5ldyBmaWxlLgotCi0JKiBzcmMvb3R2YWxpZC9vdHZhbGlkLmM6IEluY2x1ZGUgb3R2bWF0aC5jLgotCSogc3JjL290dmFsaWQvb3R2bW9kLmMgKG90dl92YWxpZGF0ZSk6IEhhbmRsZSBgTUFUSCcgdGFibGUuCi0KLTIwMDctMDgtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQWRkIGNhbGwgdG8gQUNfTElCVE9PTF9XSU4zMl9ETEwuCi0JRml4ZXMgU2F2YW5uYWggYnVnICMyMDY4Ni4KLQotMjAwNy0wOC0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jOiBGaXggdXNhZ2Ugb2YKLQlGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgbWFjcm8uICBSZXBvcnRlZCBieSBHcmFoYW0gQXNoZXIuCi0KLTIwMDctMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKG9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IFRoZSBhcmd1bWVudAotCWBkcml2ZXJfbmFtZScgaXMgdHlwZWQgYXMgYGNvbnN0IGNoYXIqJyB0byBtYXRjaCB3aXRoIHRoZQotCWNhbGxlcnMgaW4gRlRfTmV3X0ZhY2VfRnJvbV9MV0ZOIGFuZCBGVF9OZXdfRmFjZV9Gcm9tX1NGTlQuCi0JVGhpcyBpcyBzYW1lIHdpdGggb3Blbl9mYWNlX2Zyb21fYnVmZmVyIGluIHNyYy9iYXNlL2Z0b2Jqcy5jLgotCUZvdW5kIGFuZCBmaXhlZCBieSBTZWFuIE1jQnJpZGUuCi0KLTIwMDctMDctMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChjb3VudF90YWJsZSk6IE1ha2UgaXQgY29uZGl0aW9uYWwuCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTmV3X0xpYnJhcnkpOiBDaGVjayBGVF9SRU5ERVJfUE9PTF9TSVpFIHdpdGgKLQlhIHByZXByb2Nlc3NvciBzdGF0ZW1lbnQuCi0KLTIwMDctMDctMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX1RyYW5zbGF0ZSk6IENoZWNrIGBvdXRsaW5lJyBiZWZvcmUKLQlmaXJzdCB1c2FnZS4gIEZyb20gU2F2YW5uYWggcGF0Y2ggIzYxMTUuCi0KLTIwMDctMDctMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDA3LTA3LTE2ICBEZXJlayBDbGVnZyAgPGRjbGVnZ0BhcHBsZS5jb20+Ci0KLQlBZGQgbmV3IHNlcnZpY2UgZm9yIGdldHRpbmcgdGhlIFJPUyBmcm9tIGEgQ0lEIGZvbnQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX0NJRF9IKTogTmV3IG1hY3JvLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNpZC5oOiBOZXcgZmlsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCAoRlRfU0VSVklDRV9DSURfSCk6IE5ldyBtYWNyby4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaDogTmV3IGZpbGUuCi0KLQkqIHNyYy9iYXNlL2Z0Y2lkLmM6IE5ldyBmaWxlLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9DSURfSC4KLQkoY2ZmX2dldF9yb3MpOiBOZXcgZnVuY3Rpb24uCi0JKGNmZl9zZXJ2aWNlX2NpZF9pbmZvKTogTmV3IHNlcnZpY2Ugc3RydWN0dXJlLgotCShjZmZfc2VydmljZXMpOiBSZWdpc3RlciBpdC4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2RvbmUpOiBGcmVlIHJlZ2lzdHJ5IGFuZCBvcmRlcmluZy4KLQotCSogc3JjL2NmZi9jZmZ0eXBlcy5oIChDRkZfRm9udFJlYyk6IEFkZCBgcmVnaXN0cnknIGFuZCBgb3JkZXJpbmcnLgotCi0JKiBtb2R1bGVzLmNmZyAoQkFTRV9FWFRFTlNJT05TKTogQWRkIGZ0Y2lkLmMuCi0KLTIwMDctMDctMTEgIERlcmVrIENsZWdnICA8ZGNsZWdnQGFwcGxlLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBwb3N0c2NyaXB0IG5hbWUgc2VydmljZSB0byBDRkYgZHJpdmVyLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSC4KLQkoY2ZmX2dldF9wc19uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfc2VydmljZV9wc19uYW1lKTogTmV3IHNlcnZpY2Ugc3RydWN0dXJlLgotCShjZmZfc2VydmljZXMpOiBSZWdpc3RlciBpdC4KLQotMjAwNy0wNy0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX0NvcHkpOiBGaXggaW5pdGlhbGl6YXRpb24gb2YKLQlgdGFyZ2V0Jy4gIFJlcG9ydGVkIGJ5IFNlYW4gTWNCcmlkZS4KLQotMjAwNy0wNy0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcGZyL3BmcmNtYXAuYzogSW5jbHVkZSBwZnJlcnJvci5oLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmluZGljLmM6IEFkZCBzb21lIGV4dGVybmFsIGRlY2xhcmF0aW9ucyB0byBwYWNpZnkKLQlgbWFrZSBtdWx0aScgY29tcGlsYXRpb24uCi0KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX2xvYWRfZ2x5cGgpOiBQYWNpZnkgY29tcGlsZXIuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3BzX2dldF9mb250X2luZm8pLCBzcmMvY2ZmL2NmZm9ianMuYwotCShjZmZfc3RyY3B5KSwgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oIChGVF9NRU1fU1RSRFVQKSwKLQlzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfZWRnZXMpLAotCXNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19oaW50c19jb21wdXRlX2VkZ2VzKSwgc3JjL3NmbnQvdHRtdHguYwotCSh0dF9mYWNlX2dldF9tZXRyaWNzKSwgc3JjL2Jhc2UvZnRvYmpzLmMgKG9wZW5fZmFjZSkKLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IEZpeCBjb21waWxhdGlvbiB3aXRoIEMrKyBjb21waWxlci4KLQotCSogZG9jcy9yZWxlYXNlOiBNZW50aW9uIHRlc3QgY29tcGlsYXRpb24gdGFyZ2V0cy4KLQotMjAwNy0wNy0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL1BST0JMRU1TOiBNZW50aW9uIHRoYXQgc29tZSBQUyBiYXNlZCBmb250cyBjYW4ndCBiZQotCWhhbmRsZWQgY29ycmVjdGx5IGJ5IEZyZWVUeXBlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogQWx3YXlzIGFsbG93IGEKLQlyZWN1cnNpb24gZGVwdGggb2YgMS4gIFRoaXMgd2FzIHRoZSBtYXhpbXVtIHZhbHVlIGluIFRydWVUeXBlIDEuMCwKLQlhbmQgc29tZSBvbGRlciBmb250cyBkb24ndCBzZXQgdGhpcyBmaWVsZCBjb3JyZWN0bHkuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQxLmMKLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfc3Vic3RUYWJsZV92YWxpZGF0ZSk6IEZpeCB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMDctMDctMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBJbml0aWFsaXplCi0JYHJvdW5kJyB0byBwYWNpZnkgY29tcGlsZXIuCi0KLTIwMDctMDctMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCi0JKiBWZXJzaW9uIDIuMy41IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMy01Jy4KLQotCSogZG9jcy9DSEFOR0VTLCBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcAotCXZlcnNpb24gbnVtYmVyIHRvIDIuMy41LgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIGJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2o6IHMvMi4zLjQvMi4zLjUvLCBzLzIzNC8yMzUvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDUuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byA5OjE2OjMuCi0KLTIwMDctMDctMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oLCBzcmMvYmFzZS9mdHBhdGVudC5jCi0JKEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcpOiBOZXcgZnVuY3Rpb24gdG8gZHluYW1pY2FsbHkgY2hhbmdlCi0JdGhlIHNldHRpbmcgYWZ0ZXIgYSBmYWNlIGlzIGNyZWF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfU2ltcGxlX0dseXBoKTogRml4IGEgc21hbGwgYnVnCi0JdGhhdCBjcmVhdGVkIGRpc3RvcnRpb25zIGluIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciByZXN1bHRzLgotCi0yMDA3LTA2LTMwICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfSVVQKTogQWRkIG1pc3NpbmcgdmFyaWFibGUKLQlpbml0aWFsaXphdGlvbi4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBHZXQgcmlkIG9mIGFuCi0JaW5maW5pdGUgbG9vcCBpbiB0aGUgY2FzZSBvZiBkZWdlbmVyYXRlIGZvbnRzLgotCi0yMDA3LTA2LTI2ICBSYWh1bCBCaGFsZXJhbyAgPGIucmFodWwucG1AZ21haWwuY29tPgotCi0JQWRkIGF1dG9maXQgbW9kdWxlIGZvciBJbmRpYyBzY3JpcHRzLiAgVGhpcyBjdXJyZW50bHkganVzdCByZXVzZXMKLQl0aGUgQ0pLLXNwZWNpZmljIGZ1bmN0aW9ucy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCAoQUZfQ09ORklHX09QVElPTl9JTkRJQyk6IE5ldwotCW1hY3JvLgotCSogZGV2ZWwvZnRvcHRpb24uaDogU3luY2hyb25pemUgd2l0aAotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmguCi0KLQkqIHNyYy9hdXRvZml0L2FmaW5kaWMuYywgc3JjL2F1dG9maXQvYWZpbmRpYy5oOiBOZXcgZmlsZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMsIHNyYy9hdXRvZml0L2FmdHlwZXMuaCwKLQlzcmMvYXV0b2ZpdC9hdXRvZml0LmM6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L0phbWZpbGUgKF9zb3VyY2VzKSwgKiBzcmMvYXV0b2ZpdC9ydWxlcy5tawotCShBVVRPRl9EUlZfU1JDKTogVXBkYXRlZC4KLQotMjAwNy0wNi0yMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX1NpbXBsZSk6IEZpeCBjaGFuZ2UgZnJvbQotCTIwMDctMDYtMTYgdGhhdCBwcmV2ZW50ZWQgdGhlIFRydWVUeXBlIG1vZHVsZSBmcm9tIGxvYWRpbmcgbW9zdAotCWdseXBocy4KLQotMjAwNy0wNi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBGaXggbG9naWMgb2YgMjAwNy0wNS0yOAotCWNoYW5nZS4KLQotMjAwNy0wNi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2VuY29kaW5nKTogSGFuZGxlIG9uZSBtb3JlIGVycm9yLgotCi0yMDA3LTA2LTE5ICBEbWl0cnkgVGltb3Noa292ICA8ZG1pdHJ5QGNvZGV3ZWF2ZXJzLmNvbT4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChmbnRfZmFjZV9nZXRfZGxsX2ZvbnQpOiBSZXR1cm4gZXJyb3IKLQlGTlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQgaWYgZmlsZSBmb3JtYXQgd2FzIHJlY29nbml6ZWQgYnV0Ci0JdGhlIGZpbGUgZG9lc24ndCBjb250YWluIGFueSBGTlQoTkUpIG9yIFJUX0ZPTlQoUEUpIHJlc291cmNlcy4KLQlBZGQgdmVyYm9zZSBkZWJ1ZyBsb2dzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRlYnVnIGZhaWxpbmcgbG9hZAotCWF0dGVtcHRzLgotCShGTlRfRmFjZV9Jbml0KTogQSBzaW5nbGUgRk5UIGZvbnQgY2FuJ3QgY29udGFpbiBtb3JlIHRoYW4gMSBmYWNlLAotCXNvIHJldHVybiBhbiBlcnJvciBpZiByZXF1ZXN0ZWQgZmFjZSBpbmRleCBpcyA+IDAuCi0JRG8gbm90IGRvIGZ1cnRoZXIgYXR0ZW1wdCB0byBsb2FkIGZvbnRzIGlmIGEgcHJldmlvdXMgYXR0ZW1wdCBoYXMKLQlmYWlsZWQgYnV0IHJldHVybmVkIGVycm9yIEZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdCwgaS5lLiwgdGhlCi0JZmlsZSBmb3JtYXQgaGFzIGJlZW4gcmVjb2duaXplZCBidXQgbm8gZm9udHMgZm91bmQgaW4gdGhlIGZpbGUuCi0KLTIwMDctMDctMTkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmM6IEFwcGx5IHBhdGNoZXMgcHJvcG9zZWQgYnkgU2VhbiBNY0JyaWRlLgotCShGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUpOiBJbnNlcnQgRlRfVU5VU0VEIG1hY3JvcyB0byBmaXgKLQl0aGUgY29tcGlsZXIgd2FybmluZ3MgYWdhaW5zdCB1bnVzZWQgYXJndW1lbnRzLgotCShGVF9BVFNGb250R2V0RmlsZVJlZmVyZW5jZSk6IERpdHRvLgotCShGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lKTogRGl0dG8uCi0JKEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKTogRGl0dG8uCi0JKGxvb2t1cF9sd2ZuX2J5X2ZvbmQpOiBGaXggd3JvbmcgY29tbWVudC4KLQlSZXBsYWNlIGBjb25zdCBTdHJpbmdQdHInIGJ5IG1vcmUgYXBwcm9wcmlhdGUgdHlwZQotCWBDb25zdFN0cjI1NVBhcmFtJy4KLQlGU1JlZk1ha2VQYXRoUGF0aCBhbHdheXMgcmV0dXJucyBVVEY4IFBPU0lYIHBhdGhuYW1lIGluCi0JTWFjaC1PLCB0aHVzIEhGUyBwYXRobmFtZSBzdXBwb3J0IGlzIGRyb3BwZWQuCi0JKGNvdW50X2ZhY2VzKTogUmVtb3ZlIEhMb2NrIGFuZCBIVW5sb2NrIHdoaWNoIGlzIG5vdAotCXJlcXVpcmVkIG9uIE1hYyBPUyBYIGFueW1vcmUuCi0JKEZUX05ld19GYWNlX0Zyb21fU0ZOVCk6IERpdHRvLgotCShGVF9OZXdfRmFjZV9Gcm9tX0ZPTkQpOiBEaXR0by4KLQkqIGJ1aWxkcy9tYWMvZnRtYWMuYzogU3luY2hyb25pemUgdG8gc3JjL2Jhc2UvZnRtYWMuYywKLQlleGNlcHQgb2YgSEZTIHBhdGhuYW1lIHN1cHBvcnQgYW5kIEhMb2NrL0hVbmxvY2suCi0JVGhleSBhcmUgcmVxdWlyZWQgb24gY2xhc3NpYyBDRk0gZW52aXJvbm1lbnQuCi0KLTIwMDctMDYtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19wYXJzZXJfc2tpcF9QU190b2tlbik6IFJlbW92ZSBpbmNvcnJlY3QKLQlhc3NlcnRpb24uCi0JKHBzX3BhcnNlcl90b19ieXRlcyk6IEZpeCBlcnJvciBtZXNzYWdlLgotCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX09wZW5fRmFjZSk6IEhhbmRsZSBvbmUgbW9yZSBlcnJvci4KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX3NmbnRzKTogcy9hbGxvYy9hbGxvY2F0ZWQvLgotCURvbid0IGFsbG93IG1peGVkIGJpbmFyeSBhbmQgaGV4IHN0cmluZ3MuCi0JSGFuZGxlIHN0cmluZ19zaXplID09IDAgYW5kIHN0cmluZ19idWYgPT0gMC4KLQkodDQyX3BhcnNlX2VuY29kaW5nKTogSGFuZGxlIG9uZSBtb3JlIGVycm9yLgotCi0yMDA3LTA2LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfdG9maXhlZGFycmF5LCBwc190b2Nvb3JkYXJyYXkpOiBGaXggZXhpdAotCWxvZ2ljLgotCShwc19wYXJzZXJfbG9hZF9maWVsZCkgPFQxX0ZJRUxEX1RZUEVfQkJPWD46IFNraXAgZGVsaW1pdGVycwotCWNvcnJlY3RseS4KLQkocHNfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUpOiBVc2UgYGZpZWxkcy0+YXJyYXlfbWF4JyBpbnN0ZWFkIG9mCi0JVDFfTUFYX1RBQkxFX0VMRU1FTlRTIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3ByZXBhcmUpOiBGaXggY2hhbmdlIGZyb20KLQkyMDA3LTA2LTA2LgotCi0yMDA3LTA2LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9mdHJhbmRvbS5jIChmb250X3NpemUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShUZXN0RmFjZSk6IFVzZSBpdC4KLQkobWFpbik6IEhhbmRsZSBuZXcgb3B0aW9uIGAtLXNpemUnIHRvIHNldCBgZm9udF9zaXplJy4KLQkoVXNhZ2UpOiBVcGRhdGVkLgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKGZudF9mYWNlX2dldF9kbGxfZm9udCk6IEV4aXQgaW4gY2FzZSBvZgotCWludmFsaWQgZm9udC4KLQkoRk5UX0xvYWRfR2x5cGgpOiBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBiaXRtYXAgd2lkdGguCi0KLTIwMDctMDYtMTYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfZmluZF9jZWxsLCBncmF5X3NldF9jZWxsLCBncmF5X2hsaW5lKToKLQlQcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIHdoZW4gcmVuZGVyaW5nIHZlcnkgbGFyZ2Ugb3V0bGluZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfU2ltcGxlX0dseXBoKTogQ2hlY2sgdGhlCi0Jd2VsbC1mb3JtZWRuZXNzIG9mIHRoZSBjb250b3VycyBhcnJheSB3aGVuIGxvYWRpbmcgYSBnbHlwaC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX0xvYWRfQ29udGV4dCk6IEluaXRpYWxpemUgYHpwMCcsIGB6cDEnLAotCWFuZCBgenAyJy4KLQkoSW5zX0lQKTogQ2hlY2sgYXJndW1lbnQgcmFuZ2VzIHRvIHJlamVjdCBib2d1cyBvcGVyYXRpb25zIHByb3Blcmx5LgotCShJVVBfV29ya2VyUmVjKTogQWRkIGBtYXhfcG9pbnRzJyBtZW1iZXIuCi0JKF9pdXBfd29ya2VyX2ludGVycG9sYXRlKTogQ2hlY2sgYXJndW1lbnQgcmFuZ2VzLgotCShJbnNfSVVQKTogSWdub3JlIGVtcHR5IG91dGxpbmVzLgotCi0yMDA3LTA2LTE2ICBEbWl0cnkgVGltb3Noa292ICA8ZG1pdHJ5QGNvZGV3ZWF2ZXJzLmNvbT4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5oOiBBZGQgbmVjZXNzYXJ5IHN0cnVjdHVyZXMgZm9yIFBFIHJlc291cmNlCi0JcGFyc2luZy4KLQkoV2luUEUzMl9IZWFkZXJSZWMpOiBOZXcgc3RydWN0dXJlLgotCShXaW5QRTMyX1NlY3Rpb25SZWMpOiBOZXcgc3RydWN0dXJlLgotCShXaW5QRV9Sc3JjRGlyUmVjKTogTmV3IHN0cnVjdHVyZS4KLQkoV2luUEVfUnNyY0RpckVudHJ5UmVjKTogTmV3IHN0cnVjdHVyZS4KLQkoV2luUEVfUnNyY0RhdGFFbnRyeVJlYyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKEZOVF9Gb250UmVjKTogUmVtb3ZlIHVudXNlZCBgc2l6ZV9zaGlmdCcgZmllbGQuCi0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2ZhY2VfZ2V0X2RsbF9mb250KTogQWRkIHN1cHBvcnQgZm9yCi0JbG9hZGluZyBiaXRtYXAgLmZvbiBmaWxlcyBpbiBQRSBmb3JtYXQuCi0KLTIwMDctMDYtMTUgIERtaXRyeSBUaW1vc2hrb3YgIDxkbWl0cnlAY29kZXdlYXZlcnMuY29tPgotCi0JKiBidWlsZHMvd2luMzIvZnRkZWJ1Zy5jOiBVbmlmeSBkZWJ1ZyBsZXZlbCBoYW5kbGluZyB3aXRoIG90aGVyCi0JcGxhdGZvcm1zLgotCi0yMDA3LTA2LTE0ICBEbWl0cnkgVGltb3Noa292ICA8ZG1pdHJ5QGNvZGV3ZWF2ZXJzLmNvbT4KLQotCSogYnVpbGRzL3dpbjMyL2Z0ZGVidWcuYyAoRlRfTWVzc2FnZSk6IFNlbmQgZGVidWcgb3V0cHV0IHRvIHRoZQotCWNvbnNvbGUgYXMgd2VsbCBhcyB0byB0aGUgZGVidWdnZXIuCi0KLTIwMDctMDYtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl91bmlyYW5nZXMpOiBFeHBhbmQgc3RydWN0dXJlIHRvCi0JY292ZXIgYWxsIHJhbmdlcyB3aGljaCBjb3VsZCBwb3NzaWJseSBiZSBoYW5kbGVkIGJ5IHRoZSBhZmxhdGluCi0JbW9kdWxlIChzaW5jZSB0aGUgZGVmYXVsdCBmYWxsYmFjayBmb3IgdW5rbm93biByYW5nZXMgaXMgbm93IHRoZQotCWFmY2prIG1vZHVsZSkuICBJdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gZmluZS10dW5lIHRoaXMgZnVydGhlciBieQotCXNwbGl0dGluZyBvZmYgbW9kdWxlcyBmb3IgR3JlZWssIEN5cmlsbGljLCBvciBvdGhlciBibG9ja3MuCi0KLTIwMDctMDYtMTEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19saW5rX3NlZ21lbnRzKTogRml4Ci0JaW5jb3JyZWN0IHNlZ21lbnQgbGlua2luZyBjb21wdXRhdGlvbi4gIFRoaXMgd2FzIHRoZSByb290IGNhdXNlIG9mCi0JU2F2YW5uYWggYnVnICMxOTU2NS4KLQotCi0JKiBzcmMvYXV0b2ZpdC8qIFtGVF9PUFRJT05fQVVUT0ZJVDJdOiBTb21lIHZlcnkgZXhwZXJpbWVudGFsIGNoYW5nZXMKLQl0byBpbXByb3ZlIHRoZSBMYXRpbiBhdXRvLWhpbnRlci4gIE5vdGUgdGhhdCB0aGUgbmV3IGNvZGUgaXMKLQlkaXNhYmxlZCBieSBkZWZhdWx0IHNpbmNlIGl0IGlzIG5vdCBzdGFiaWxpemVkIHlldC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbjIuYywgc3JjL2F1dG9maXQvYWZsYXRpbjIuaDogTmV3IGZpbGVzCi0JKGRpc2FibGVkIGN1cnJlbnRseSkuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYzogUmVtb3ZlIGRlYWQgY29kZS4KLQkoYWZfYXhpc19oaW50c19uZXdfZWRnZSk6IEFkZCBhcmd1bWVudCB0byBoYW5kbGUgc2VnbWVudCBkaXJlY3Rpb25zLgotCShhZl9lZGdlX2ZsYWdzX3RvX3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KLQkoYWZfZ2x5cGhfaGludHNfZHVtcF9zZWdtZW50cywgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyk6IEhhbmRsZQotCW9wdGlvbiBmbGFncy4KLQkoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogQWRkIGFyZ3VtZW50IHRvIGhhbmRsZSBpbmZsZWN0aW9ucy4KLQlTaW1wbGlmeS4KLQkoYWZfZGlyZWN0aW9uX2NvbXB1dGUpOiBGaW5lIHR1bmluZy4KLQkoYWZfZ2x5cGhfaGludHNfYWxpZ25fZWRnZV9wb2ludHMpOiBGaXggbG9naWMuCi0JKGFmX2dseXBoX2hpbnRzX2FsaWduX3N0cm9uZ19wb2ludHMpOiBEbyBsaW5lYXIgc2VhcmNoIGZvciBzbWFsbAotCWVkZ2UgY291bnRzLgotCShhZl9nbHlwaF9oaW50c19hbGlnbl93ZWFrX3BvaW50cyk6IFNraXAgYW55IHRvdWNoZWQgbmVpZ2hib3JzLgotCShhZl9pdXBfc2hpZnQpOiBIYW5kbGUgemVybyBgZGVsdGEnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmg6IFVwZGF0ZWQuCi0JKEFGX1NPUlRfU0VHTUVOVFMpOiBOZXcgbWFjcm8gKGRpc2FibGVkKS4KLQkoQUZfQXhpc0hpbnRzUmVjKSBbQUZfU09SVF9TRUdNRU5UU106IE5ldyBtZW1iZXIgYG1pZF9zZWdtZW50cycuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19nZXRfbWV0cmljcyk6IEFkZAotCWFyZ3VtZW50IHRvIHBhc3Mgb3B0aW9uIGZsYWdzIGZvciBoYW5kbGluZyBzY3JpcHRzLgotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuaDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYzogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYzogVXBkYXRlZC4KLQkoYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0pOiBEb24ndCByZWR1Y2Ugc2NhbGUgYnkgMiUuCi0KLQkoYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cykgW0FGX0hJTlRfTUVUUklDU106IFJlbW92ZSBkZWFkIGNvZGUuCi0JKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfZWRnZXMpIFtBRl9ISU5UX01FVFJJQ1NdOiBSZW1vdmUgZGVhZCBjb2RlLgotCURvbid0IHNldCBgZWRnZS0+ZGlyJwotCShhZl9sYXRpbl9oaW50X2VkZ2VzKTogQWRkIG1vcmUgbG9nZ2luZy4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYzogVXBkYXRlZC4KLQotMjAwNy0wNi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMuCi0KLTIwMDctMDYtMTAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBTbGlnaHQgc3BlZWQtdXAgdG8KLQl0aGUgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oOiBDbGFyaWZ5IGRvY3VtZW50YXRpb24KLQlyZWdhcmRpbmcgdW5wYXRlbnRlZCBoaW50aW5nLgotCi0KLQlBZGQgbmV3IGBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzJyBBUEkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyk6IE5ldwotCWRlY2xhcmF0aW9uLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmgsCi0Jc3JjL2Jhc2UvZnRwYXRlbnQuYzogTmV3IGZpbGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIChGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSCk6Ci0JTmV3IG1hY3JvLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYzogSW5jbHVkZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSCBhbmQKLQlgdHRwbG9hZC5oJy4KLQkodHRfc2VydmljZV90cnVldHlwZV9nbHlmKTogTmV3IHNlcnZpY2Ugc3RydWN0dXJlLgotCSh0dF9zZXJ2aWNlcyk6IFJlZ2lzdGVyIGl0LgotCi0JKiBtb2R1bGVzLmNmZyAoQkFTRV9FWFRFTlNJT05TKSwgc3JjL2Jhc2UvSmFtZmlsZSAoX3NvdXJjZXMpOiBBZGQKLQlgZnRwYXRlbnQuYycuCi0KLTIwMDctMDYtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogVW5kbyBjaGFuZ2UgZnJvbSAyMDA3LTA0LTI4LgotCUZvbnRzIHdpdGhvdXQgYSBjbWFwIG11c3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgRnJlZVR5cGUgKGFueXRoaW5nCi0JZWxzZSB3b3VsZCBiZSBhIGJ1ZykuCi0KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpCi0JW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXTogSW1wcm92ZSB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMDctMDYtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvdHRzYml0MC5jICh0dF9zYml0X2RlY29kZXJfaW5pdCwKLQl0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSk6IFByb3RlY3QgYWdhaW5zdCBpbnRlZ2VyIG92ZXJmbG93cy4KLQotCi0JKiBzcmMvcGZyL3Bmcmdsb2FkLmMgKHBmcl9nbHlwaF9sb2FkX3NpbXBsZSk6IE1vcmUgYm91bmRpbmcgY2hlY2tzCi0JZm9yIGB4X2NvbnRyb2wnIGFuZCBgeV9jb250cm9sJy4KLQotMjAwNy0wNi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfRGVjb21wb3NlKTogQ2hlY2sgYGxhc3QnLgotCi0KLQkqIHNyYy9wZnIvcGZyY21hcC5jIChwZnJfY21hcF9pbml0KTogQ29udmVydCBhc3NlcnRpb24gaW50byBub3JtYWwKLQlGcmVlVHlwZSBlcnJvci4KLQotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKGZudF9mYWNlX2dldF9kbGxfZm9udCk6IERvIGEgcm91Z2ggY2hlY2sgb2YKLQlgZm9udF9jb3VudCcuCi0KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9mb250X21hdHJpeCk6IENoZWNrIGB0ZW1wX3NjYWxlJy4KLQotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3ByZXBhcmUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlgRlRfRXJyb3InLgotCUNoZWNrIGBmZF9pbmRleCcuCi0JKGNmZl9zbG90X2xvYWQpOiBVcGRhdGVkLgotCSogc3JjL2NmZi9jZmZnbG9hZC5oOiBVcGRhdGVkLgotCi0yMDA3LTA2LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wZnIvcGZyZ2xvYWQuYyAocGZyX2dseXBoX2RvbmUpOiBDb21tZW50IG91dCB1bnVzZWQgY29kZS4KLQkocGZyX2dseXBoX2xvYWRfc2ltcGxlKTogQ29udmVydCBhc3NlcnRpb24gaW50byBub3JtYWwgRnJlZVR5cGUKLQllcnJvci4KLQlDaGVjayBgaWR4Jy4KLQkocGZyX2dseXBoX2xvYWRfY29tcG91bmQsIHBmcl9nbHlwaF9jdXJ2ZV90bywgcGZyX2dseXBoX2xpbmVfdG8pOgotCUNvbnZlcnQgYXNzZXJ0aW9uIGludG8gbm9ybWFsIEZyZWVUeXBlIGVycm9yLgotCi0JKiBzcmMvcGZyL3BmcnR5cGVzLmggKFBGUl9HbHlwaFJlYyk6IENvbW1lbnQgb3V0IHVudXNlZCBjb2RlLgotCi0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoRk5UX0ZhY2VfSW5pdCk6IENoZWNrIGBmYW1pbHlfc2l6ZScuCi0KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc190b2Nvb3JkYXJyYXksIHBzX3RvZml4ZWRhcnJheSk6IFJldHVybiAtMQotCWluIGNhc2Ugb2YgcGFyc2luZyBlcnJvci4KLQkocHNfcGFyc2VyX2xvYWRfZmllbGQpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2ZvbnRfbWF0cml4KTogVXBkYXRlZC4KLQotMjAwNy0wNi0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2lkL2NpZGdsb2FkLmMgKGNpZF9sb2FkX2dseXBoKTogQ2hlY2sgYGZkX3NlbGVjdCcuCi0KLQkqIHNyYy90b29scy9mdHJhbmRvbS9NYWtlZmlsZTogRGVwZW5kIG9uIGBsaWJmcmVldHlwZS5hJy4KLQotMjAwNy0wNi0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdG9vbHMvZnRyYW5kb20vKjogQWRkIHRoZSBgZnRyYW5kb20nIHRlc3QgcHJvZ3JhbSB3cml0dGVuIGJ5Ci0JR2VvcmdlIFdpbGxpYW1zICh3aXRoIHNvbWUgbW9kaWZpY2F0aW9ucykuCi0KLTIwMDctMDYtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGRlc3Ryb3lfY2hhcm1hcHMpLCBzcmMvdHlwZTEvdDFvYmpzLmMKLQkoVDFfRmFjZV9Eb25lKSwgc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfRmFjZV9Eb25lKTogQ2hlY2sgZm9yCi0JZmFjZSA9PSBOVUxMLiAgU3VnZ2VzdGVkIGJ5IEdyYWhhbSBBc2hlci4KLQotMjAwNy0wNi0wMyAgSXNtYWlsIETDtm5tZXogIDxpc21haWxAcGFyZHVzLm9yZy50cj4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1JlcXVlc3RfTWV0cmljcyk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCi0yMDA3LTA2LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaCAoRlRfRXJyX0NvcnJ1cHRlZF9Gb250X0hlYWRlciwKLQlGVF9FcnJfQ29ycnVwdGVkX0ZvbnRfR2x5cGhzKTogTmV3IGVycm9yIGNvZGVzIGZvciBCREYgZmlsZXMuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKGJkZl9sb2FkX2ZvbnQpOiBVc2UgdGhlbS4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9zdGFydCk6IENoZWNrIGBGT05UJyBiZXR0ZXIuCi0KLTIwMDctMDYtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1JlcXVlc3RfTWV0cmljcyksIHNyYy9jYWNoZS9mdGNjbWFwLmMKLQkoRlRDX0NNYXBDYWNoZV9Mb29rdXApOiBSZW1vdmUgdW51c2VkIGNvZGUuCi0KLTIwMDctMDYtMDEgIFNlYW4gTWNCcmlkZSAgPHNlYW5Acm9ndWUtcmVzZWFyY2guY29tPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoTnVsbF9WZWN0b3IsIE5VTExfVmVjdG9yKTogUmVtb3ZlZCwKLQl1bnVzZWQuCi0KLTIwMDctMDYtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NpZC9jaWRwYXJzZS5jIChjaWRfcGFyc2VyX25ldyk6IERvbid0IGNvbnRpbnVlIHNlY29uZCBzZWFyY2gKLQlwYXNzIGZvciBgU3RhcnREYXRhJyBpZiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuCi0JRXhpdCBwcm9wZXJseSBpZiBubyBgU3RhcnREYXRhJyBoYXMgYmVlbiBzZWVuIGF0IGFsbC4KLQotCSogYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYyAoRlRfU3RyZWFtX09wZW4pOiBEb24ndCB1c2UgVUxPTkdfTUFYIGJ1dAotCUxPTkdfTUFYIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuICBTdWdnZXN0ZWQgYnkgU2VhbiBNY0JyaWRlLgotCi0yMDA3LTA1LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2Vfc3VicnMsIHBhcnNlX2NoYXJzdHJpbmdzKTogUHJvdGVjdAotCWFnYWluc3QgdG9vIHNtYWxsIGJpbmFyeSBkYXRhIHN0cmluZ3MuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcGFyc2VfZ2x5cGhzKTogQ2hlY2sgYFNUQVJUQ0hBUicgYmV0dGVyLgotCi0yMDA3LTA1LTI4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCk6IERvIG5vdCBhcHBseSB0aGUgaWRlbnRpdHkKLQl0cmFuc2Zvcm1hdGlvbi4gIFRoaXMgc2lnbmlmaWNhbnRseSByZWR1Y2VzIHRoZSBsb2FkaW5nIHRpbWUgb2YgQ0ZGCi0JZ2x5cGhzLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKEFGX1NDUklQVF9MSVNUX0RFRkFVTFQpOiBDaGFuZ2UgZGVmYXVsdAotCWhpbnRpbmcgc2NyaXB0IHRvIENKSywgc2luY2UgaXQgd29ya3Mgd2VsbCB3aXRoIG1vcmUgc2NyaXB0cyB0aGFuCi0JbGF0aW4uICBUaGFua3MgdG8gUmFodWwgQmhhbGVyYW8gPGIucmFodWwucG1AZ21haWwuY29tPiBmb3IgcG9pbnRpbmcKLQl0aGlzIG91dCEKLQotMjAwNy0wNS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMDctMDUtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5oICh0dF9zaXplX3JlYWR5X2J5dGVjb2RlKTogTW92ZSBkZWNsYXJhdGlvbgotCWludG8gVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSIHByZXByb2Nlc3NvciBibG9jay4KLQotMjAwNy0wNS0yNCAgR3JhaGFtIEFzaGVyICA8Z3JhaGFtLmFzaGVyQGJ0aW50ZXJuZXQuY29tPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUpCi0JWyFUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVJdOiBSZW1vdmVkLiAgVW51c2VkLgotCi0yMDA3LTA1LTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBGaXggbGFzdCBjaGFuZ2UgdG8KLQlhdm9pZCBjcmFzaGVzIGluIGNhc2UgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyIGlzIG5vdCB1c2VkLgotCi0KLQlBdm9pZCBoZWFwIGJsb3d1cCB3aXRoIHZlcnkgbGFyZ2UgLlogZm9udCBmaWxlcy4gIFRoaXMgZml4ZXMKLQlTYXZhbm5haCBidWcgIzE5OTEwLgotCi0JKiBzcmMvbHp3L2Z0em9wZW4uaCAoRlRfTHp3U3RhdGVSZWMpOiBSZW1vdmUgYGluX2N1cnNvcicsCi0JYGluX2xpbWl0JywgYHBhZCcsIGBwYWRfYml0cycsIGFuZCBgaW5fYnVmZicgbWVtYmVycy4KLQlBZGQgYGJ1Zl90YWInLCBgYnVmX29mZnNldCcsIGBidWZfc2l6ZScsIGBidWZfY2xlYXInLCBhbmQKLQlgYnVmX3RvdGFsJyBtZW1iZXJzLgotCi0JKiBzcmMvbHp3L2Z0em9wZW4uYyAoZnRfbHp3c3RhdGVfZ2V0X2NvZGUpOiBSZXdyaXR0ZW4uICBJdCBub3cgdGFrZXMKLQlvbmx5IG9uZSBhcmd1bWVudC4KLQkoZnRfbHp3c3RhdGVfcmVmaWxsLCBmdF9sendzdGF0ZV9yZXNldCwgZnRfbHp3c3RhdGVfaW8pOiBVcGRhdGVkLgotCi0yMDA3LTA1LTIwICBJc21haWwgRMO2bm1leiAgPGlzbWFpbEBwYXJkdXMub3JnLnRyPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMgKHBzX21hc2tfdGFibGVfc2V0X2JpdHMpOiBBZGQgYGNvbnN0Jy4KLQkocHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdHMpOiBSZW1vdmUgYGNvbnN0Jy4KLQotMjAwNy0wNS0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dG10eC5jICh0dF9mYWNlX2dldF9tZXRyaWNzKQotCVshRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTXTogQW5vdGhlciB0eXBlLXB1bm5pbmcgZml4LgotCi0yMDA3LTA1LTE5ICBEZXJlayBDbGVnZyAgPGRjbGVnZ0BhcHBsZS5jb20+Ci0KLQlTYXZhbm5haCBwYXRjaCAjNTkyOS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oLCBzcmMvYmFzZS9mdG9ianMuYwotCShGVF9HZXRfQ01hcF9Gb3JtYXQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuYyAoVFRfQ01hcEluZm8pOiBBZGQKLQlgZm9ybWF0JyBtZW1iZXIuCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcHswLDIsNCw2LDgsMTAsMTJ9X2dldF9pbmZvKTogU2V0Ci0JY21hcF9pbmZvLT5mb3JtYXQuCi0KLTIwMDctMDUtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IFNhdmUgZ3JhcGhpY3Mgc3RhdGUKLQliZWZvcmUgaGFuZGxpbmcgc3ViZ2x5cGhzIHNvIHRoYXQgaXQgY2FuIGJlIHJlaW5pdGlhbGl6ZWQgZWFjaCB0aW1lLgotCVRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMxOTg1OS4KLQotMjAwNy0wNS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYyAoZnRjX25vZGVfbXJ1X2xpbmssIGZ0Y19ub2RlX21ydV91bmxpbmspLAotCXNyYy9jYWNoZS9mdGNjYWNoZS5oIChGVENfQ0FDSEVfTE9PS1VQX0NNUCksIHNyYy9jYWNoZS9mdGNnbHlwaC5oCi0JKEZUQ19HQ0FDSEVfTE9PS1VQX0NNUCksIHNyYy9wc2hpbnRlci9wc2htb2QuYyAocHNfaGludGVyX2luaXQpLAotCXNyYy9zZm50L3R0bXR4LmMgKHR0X2ZhY2VfbG9hZF9obXR4LCB0dF9mYWNlX2xvYWRfaGhlYSwKLQl0dF9mYWNlX2dldF9tZXRyaWNzKTogRml4IHR5cGUtcHVubmluZyBpc3N1ZXMuCi0KLTIwMDctMDUtMTUgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oOiBBcyBzdWdnZXN0ZWQgYnkgR3JhaGFtIEFzaGVyLAotCWVuc3VyZSB0aGF0IGZ0X2lzYWxudW0sIGZ0X2lzZGlnaXQsIGV0Yy4sIHVzZSBoYXJkLWNvZGVkIHZhbHVlcwotCWluc3RlYWQgb2YgcmVseWluZyBvbiB0aGUgbG9jYWxlLWRlcGVuZGVudCBmdW5jdGlvbnMgcHJvdmlkZWQgYnkKLQk8Y3R5cGVzLmg+LgotCi0yMDA3LTA1LTE1ICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19oaW50c19jb21wdXRlX2VkZ2VzKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlLgotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyk6IERpdHRvLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfdmFsaWRhdG9yX2Vycm9yKTogVXNlIGBmdF9qbXBfYnVmJy4KLQkob3Blbl9mYWNlX2Zyb21fYnVmZmVyKTogSW5pdGlhbGl6ZSBgc3RyZWFtJy4KLQkoRlRfUmVxdWVzdF9NZXRyaWNzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQlSZW1vdmUgcmVkdW5kYW50IGBicmVhaycgc3RhdGVtZW50cy4KLQkoRlRfR2V0X1RyYWNrX0tlcm5pbmcpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCi0JKiBzcmMvcHNhdXgvYWZtcGFyc2UuYyAoYWZtX3BhcnNlX3RyYWNrX2tlcm4sIGFmbV9wYXJzZV9rZXJuX3BhaXJzLAotCWFmbV9wYXJzZV9rZXJuX2RhdGEpOiBSZW1vdmUgcmVkdW5kYW50Ci0JYGJyZWFrJyBzdGF0ZW1lbnRzLgotCShhZm1fcGFyc2VyX3BhcnNlKTogRGl0dG8uCi0JRG9uJ3QgdXNlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgotCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jIChWQVJJQU5UX0JJVCk6IERlZmluZSBhcyB1bnNpZ25lZCBsb25nLgotCVVzZSBgfCcgb3BlcmF0b3IgaW5zdGVhZCBvZiBgXicgdG8gc2V0IGl0LgotCVVwZGF0ZSBhbGwgdXNlcnMuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9mYWNlX2J1aWxkX2NtYXBzKTogVXNlIGBmdF9qbXBfYnVmJy4KLQkqIHNyYy9zZm50L3R0a2Vybi5jICh0dF9mYWNlX2xvYWRfa2Vybik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfU2ltcGxlX0dseXBoKTogUmVtb3ZlIHJlZHVuZGFudAotCWNvbXBhcmlzb24uCi0JKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKTogVXNlIEZUX1VJbnQgZm9yIGBuX3BvaW50cycgYW5kIGBpJy4KLQkoVFRfTG9hZF9HbHlwaCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0KLTIwMDctMDUtMTMgIERlcmVrIENsZWdnICA8ZGNsZWdnQGFwcGxlLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX05ld19MaWJyYXJ5KTogT25seSBhbGxvY2F0ZSByZW5kZXJpbmcgcG9vbAotCWlmIEZUX1JFTkRFUl9QT09MX1NJWkUgaXMgPiAwLiAgRnJvbSBTYXZhbm5haCBwYXRjaCAjNTkyOC4KLQotMjAwNy0wNS0xMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYywgaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmgKLQkoRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyLCBGVENfU0JpdF9DYWNoZV9Mb29rdXBTY2FsZXIpOiBUd28gbmV3Ci0JZnVuY3Rpb25zIHRoYXQgYWxsb3cgdXMgdG8gbG9vayB1cCBnbHlwaHMgdXNpbmcgYW4gRlRDX1NjYWxlciBvYmplY3QKLQl0byBzcGVjaWZ5IHRoZSBzaXplLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gdXNlIGZyYWN0aW9uYWwgcGl4ZWwKLQlzaXplcy4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX3JlYWR5X2J5dGVjb2RlKTogU2V0Ci0JYHNpemUtPmN2dF9yZWFkeScuICBSZXBvcnRlZCBieSBCb3JpcyBMZXRvY2hhLgotCi0yMDA3LTA1LTA5ICBHcmFoYW0gQXNoZXIgIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfSVApLCBzcmMvYXV0b2ZpdC9hZmxhdGluLmMKLQkoYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0pOiBGaXggY29tcGlsZXIgd2FybmluZ3MuCi0KLTIwMDctMDUtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnNsbjogUmVtb3ZlZCwgYXMgcmVxdWVzdGVkIGJ5Ci0JVmluY2VudC4KLQotMjAwNy0wNS0wNCAgVmluY2VudCBSSUNIT01NRSAgPHJpY2hvbS52QGZyZWUuZnI+Ci0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjZS8qOiBBZGQgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGVzIGZvciBQb2NrZXQKLQlQQyB0YXJnZXRzLgotCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IHRoZW0uCi0KLTIwMDctMDUtMDQgIDxoYXJyeUBrZGV2ZWxvcC5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0c3lzdGVtLmMgKEZUX1N0cmVhbV9PcGVuKTogSGFuZGxlIHJldHVybiB2YWx1ZSAwIG9mCi0JbW1hcCAod2hpY2ggbWlnaHQgaGFwcGVuIG9uIHNvbWUgUlRPUykuICBGcm9tIFNhdmFubmFoIHBhdGNoICM1OTA5LgotCi0yMDA3LTA1LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfQ2hhcl9TaXplKTogU2ltcGxpZnkgY29kZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfU2V0X0NoYXJfU2l6ZSk6IFVwZGF0ZQotCWRvY3VtZW50YXRpb24uCi0KLTIwMDctMDQtMjggIFZpY3RvciBTdGlubmVyICA8dmljdG9yLnN0aW5uZXJAaW5sLmZyPgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBDaGVjayBlcnJvciBjb2RlIGFmdGVyIGxvYWRpbmcKLQlgY21hcCcuCi0KLTIwMDctMDQtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBDaGVjayBmb3IgbmVnYXRpdmUKLQludW1iZXIgb2YgcG9pbnRzIGluIGNvbnRvdXJzLiAgUHJvYmxlbSByZXBvcnRlZCBieSBWaWN0b3IgU3Rpbm5lcgotCTx2aWN0b3Iuc3Rpbm5lckBoYXlwb2NhbGMuY29tPi4KLQkoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgpOiBTeW5jaHJvbml6ZSB2YXJpYWJsZSB0eXBlcy4KLQotMjAwNy0wNC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX0NvcHkpOiBBbHdheXMgc2V0IHNlY29uZCBhcmd1bWVudCB0bwotCXplcm8gaW4gY2FzZSBvZiBlcnJvci4gIFRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMxOTY4OS4KLQotMjAwNy0wNC0yNSAgQm9yaXMgTGV0b2NoYSAgPGIubGV0b2NoYUBjei5nbWMubmV0PgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmM6IEZpeCBhIHR5cG8gdGhhdCBjcmVhdGVkIGEgc3BlZWQgcmVncmVzc2lvbgotCWluIHRoZSBUcnVlVHlwZSBieXRlY29kZSBsb2FkZXIuCi0KLTIwMDctMDQtMTAgIE1hcnRpbiBIb3JhayAgPGhvcmFrbUBjZW50cnVtLmN6PgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpIFtGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMXToKLQlJZ25vcmUgYGhoZWEnIHRhYmxlLiAgVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzE5MjYxLgotCi0yMDA3LTA0LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQotCSogVmVyc2lvbiAyLjMuNCByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTMtNCcuCi0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAKLQl2ZXJzaW9uIG51bWJlciB0byAyLjMuNC4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2o6IHMvMi4zLjMvMi4zLjQvLCBzLzIzMy8yMzQvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDQuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byA5OjE1OjMuCi0KLTIwMDctMDQtMDkgIE1hcnRpbiBIb3JhayAgPGhvcmFrbUBjZW50cnVtLmN6PgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogU2F2ZSBhbmQgcmVzdG9yZQotCW1lbW9yeSBzdHJlYW0gdG8gYXZvaWQgYSBjcmFzaCB3aXRoIHRoZSBpbmNyZW1lbnRhbCBtZW1vcnkKLQlpbnRlcmZhY2UgKFNhdmFubmFoIGJ1ZyAjMTkyNjApLgotCi0yMDA3LTA0LTA2ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKTogRml4IGJ1ZmZlci1vdmVyd3JpdGUKLQlidWcgKFNhdmFubmFoIGJ1ZyAjMTk1MzYpLgotCi0yMDA3LTA0LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQotCSogVmVyc2lvbiAyLjMuMyByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTMtMycuCi0KLQkqIGRvY3MvQ0hBTkdFUzogTWVudGlvbiBDVkUtMjAwNy0xMzUxLgotCi0yMDA3LTA0LTAzICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfQ2hhcl9TaXplKTogQXMgc3VnZ2VzdGVkIGJ5IEphbWVzIENsb29zLAotCWlmIG9uZSBvZiB0aGUgcmVzb2x1dGlvbiB2YWx1ZXMgaXMgMCwgdHJlYXQgaXQgYXMgaWYgaXQgd2VyZSB0aGUKLQlzYW1lIGFzIHRoZSBvdGhlciB2YWx1ZS4KLQotMjAwNy0wNC0wMiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JQWRkIHNwZWNpYWwgY29kZSB0byBkZXRlY3QgYGV4dHJhLWxpZ2h0JyBmb250cyBhbmQgZG8gbm90IHNuYXAgdGhlaXIKLQlzdGVtIHdpZHRocyB0b28gbXVjaCB0byBhdm9pZCBiaXphcnJlIGhpbnRpbmcgZWZmZWN0cy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5oIChBRl9MYXRpbkF4aXNSZWMpOiBBZGQgYHN0YW5kYXJkX3dpZHRoJyBhbmQKLQlgZXh0cmFfbGlnaHQnIG1lbWJlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyk6IEluaXRpYWxpemUKLQl0aGVtLgotCShhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSk6IFNldCBgZXh0cmFfbGlnaHQnLgotCShhZl9sYXRpbl9jb21wdXRlX3N0ZW1fd2lkdGgpOiBVc2UgYGV4dHJhX2xpZ2h0Jy4KLQotMjAwNy0wMy0yOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChmdF9iaXRtYXBfYXNzdXJlX2J1ZmZlcik6IEZpeCB6ZXJvLWluZyBvZiB0aGUKLQlwYWRkaW5nLgotCi0yMDA3LTAzLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKHNldHNiaXQsIHNiaXRzZXQpOiBIYW5kbGUgdmFsdWVzID49IDEyOAotCWdyYWNlZnVsbHkuCi0JKF9iZGZfc2V0X2RlZmF1bHRfc3BhY2luZyk6IEluY3JlYXNlIGBuYW1lJyBidWZmZXIgc2l6ZSB0byAyNTYgYW5kCi0JaXNzdWUgYW4gZXJyb3IgZm9yIGxvbmdlciBuYW1lcy4gIFRoaXMgZml4ZXMgQ1ZFLTIwMDctMTM1MS4KLQkoX2JkZl9wYXJzZV9nbHlwaHMpOiBMaW1pdCBhbGxvd2VkIG51bWJlciBvZiBnbHlwaHMgaW4gZm9udCB0byB0aGUKLQludW1iZXIgb2YgY29kZSBwb2ludHMgaW4gVW5pY29kZS4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLCBSRUFETUU6IHMvMi4zLjIvMi4zLjMvLAotCXMvMjMyLzIzMy8uCi0KLQkqIGRvY3MvQ0hBTkdFUzogTWVudGlvbiBmdGRpZmYuCi0KLTIwMDctMDMtMjYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgW0ZJWF9CWVRFQ09ERV06IFJlbW92ZSBpdCBhbmQKLQljb3JyZXNwb25kaW5nIGNvZGUuCi0JKEluc19NRCk6IExhc3QgcmVncmVzc2lvbiBmaXguCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogRml4IGJsdWVzCi0JY29tcHV0YXRpb25zIGluIG9yZGVyIHRvIGlnbm9yZSBzaW5nbGUtcG9pbnQgY29udG91cnMuICBUaGVzZSBhcmUKLQluZXZlciByYXN0ZXJpemVkIGFuZCBjb3JyZXNwb25kIGluIGNlcnRhaW4gZm9udHMgdG8gbWFyay1hdHRhY2gKLQlwb2ludHMgdGhhdCBhcmUgdmVyeSBmYXIgZnJvbSB0aGUgZ2x5cGgncyByZWFsIG91dGxpbmUsIHJ1aW5pbmcgdGhlCi0JY29tcHV0YXRpb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2cpOiBJbiB0aGUgY2FzZSBvZgotCW1vbm9zcGFjZWQgZm9udHMsIGFsd2F5cyBzZXQgYHJzYl9kZWx0YScgYW5kIGBsc2JfZGVsdGEnIHRvIDAuCi0JT3RoZXJ3aXNlIGNvZGUgdGhhdCB1c2VzIHRoZW0gd2lsbCBtb3N0IGNlcnRhaW5seSBydWluIHRoZSBmaXhlZAotCWFkdmFuY2UgcHJvcGVydHkuCi0KLQkqIGRvY3MvQ0hBTkdFUywgZG9jcy9WRVJTSU9OLkRMTCwgUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpOiBVcGRhdGUKLQlkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuMy4zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDMuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byA5OjE0OjMuCi0KLTIwMDctMDMtMjYgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBEaXNhYmxlIENhcmJvbiBmcmFtZXdvcmsgZGVwZW5kZW5jeSBvbgotCTY0Yml0IEFCSSBvbiBNYWMgT1MgWCAxMC40LnggKHBwYyAmIGkzODYpLiAgRm91bmQgYnkgU2VhbiBNY0JyaWRlLgotCSogYnVpbGRzL3Ztcy9mdGNvbmZpZy5oOiBEaXR0by4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IERpdHRvLgotCi0yMDA3LTAzLTIyICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZHMvdW5peC9mdHN5c3RlbS5jIChGVF9TdHJlYW1fT3Blbik6IFRlbXBvcmFyeSBmaXggdG8gcHJldmVudAotCTMyYml0IHVuc2lnbmVkIGxvbmcgb3ZlcmZsb3cgYnkgNjRiaXQgZmlsZXNpemUgb24gTFA2NCBwbGF0Zm9ybSwgYXMKLQlwcm9wb3NlZCBieSBTZWFuIE1jQnJpZGU6Ci0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMDctMDMvbXNnMDAwMzIuaHRtbAotCi0yMDA3LTAzLTIyICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbjogU3VwcHJlc3MgU0dJIGNvbXBpbGVyJ3Mgd2FybmluZyBhZ2FpbnN0Ci0Jc2V0am1wLCBwcm9wb3NlZCBieSBTZWFuIE1jQnJpZGU6Ci0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMDctMDMvbXNnMDAwMzIuaHRtbAotCi0yMDA3LTAzLTE5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBEZXF1b3RlIGBPU19JTkxJTkUnIGluIGNvbW1lbnQgb2YKLQljb25mdGVzdC5jLCB0byBhdm9pZCB1bmV4cGVjdGVkIHNoZWxsIGV2YWx1YXRpb24uICBQb3NzaWJseSBpdCBpcyBhCi0JYnVnIG9yIHVuZG9jdW1lbnRlZCBiZWhhdmlvdXIgb2YgYXV0b2NvbmYuCi0KLTIwMDctMDMtMTggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NRFJQKTogQW5vdGhlciBieXRlY29kZSByZWdyZXNzaW9uCi0JZml4OyB0ZXN0aW5nIHN0aWxsIG5lZWRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NRCk6IEFub3RoZXIgYnl0ZWNvZGUgcmVncmVzc2lvbiBmaXguCi0KLTIwMDctMDMtMTcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JUCk6IEZpeCB3cm9uZyBoYW5kbGluZyBvZiB0aGUKLQkodW5kb2N1bWVudGVkKSB0d2lsaWdodCB6b25lIHNwZWNpYWwgY2FzZS4KLQotMjAwNy0wMy0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4zLjIgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi0zLTInLgotCi0JKiBidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osIFJFQURNRTogcy8yLjMuMS8yLjMuMi8sCi0Jcy8yMzEvMjMyLy4KLQotMjAwNy0wMy0wOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVMsIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZWQgZm9yIHVwY29taW5nIHJlbGVhc2UuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byA5OjEzOjMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gMi4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpOiBzLzIuMy4xLzIuMy4yLy4KLQotCSogc3JjL2Jhc2UvZnR1dGlsLmMgKGZ0X21lbV9zdHJjcHluKTogRml4IGEgYnVnIHRoYXQgcHJldmVudGVkIHRoZQotCWZ1bmN0aW9uIHRvIHdvcmsgcHJvcGVybHksIG92ZXItd3JpdGluZyB1c2VyLXByb3ZpZGVkIGJ1ZmZlcnMgaW4KLQlzb21lIGNhc2VzLiAgUmVwb3J0ZWQgYnkgSmFtZXMgQ2xvb3MgPGNsb29zQGpoY2xvb3MuY29tPi4KLQotCi0yMDA3LTAzLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmggKGZ0X3N0cnN0cik6IE5ldyB3cmFwcGVyCi0JbWFjcm8gZm9yIGBzdHJzdHInLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2ZhY2VfaW5pdCk6IFVzZSBmdF9zdHJzdHIgZm9yIHNjYW5uaW5nCi0JYHRyaWNrX25hbWVzJywgYXMgc3VnZ2VzdGVkIGJ5IEl2YW4gTmluY2ljLgotCi0yMDA3LTAzLTA1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0aW5pdC5jIChGVF9Jbml0X0ZyZWVUeXBlKTogRml4IGEgc21hbGwgbWVtb3J5IGxlYWsgaW4KLQljYXNlIEZUX0luaXRfRnJlZVR5cGUgZmFpbHMgZm9yIHNvbWUgcmVhc29uLiAgUHJvYmxlbSByZXBvcnRlZCBieQotCU1heGltaWxpYW4gU2Nod2VyaW4gPG1heGltaWxpYW4uc2Nod2VyaW5AYnVlbG93c3NpZWdlLmRlPi4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX2luaXRfYnl0ZWNvZGUpOiBDbGVhciB0aGUgYHhfcHBlbScKLQlhbmQgYHlfcHBlbScgZmllbGRzIG9mIHRoZSBgVFRfU2l6ZS5tZXRyaWNzJyBzdHJ1Y3R1cmUsIG5vdCB0aG9zZSBvZgotCWBUVF9TaXplLnJvb3QubWV0cmljcycuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IERhbmllbCBHbMO2Y2tuZXIKLQk8ZGFuaWVsLWdsQGdteC5uZXQ+LgotCi0JKiBzcmMvdHlwZTEvdDFhZm0uYyAoVDFfUmVhZF9QRk0pOiBSZWFkIGtlcm5pbmcgdmFsdWVzIGFzIDE2LWJpdAotCXNpZ25lZCB2YWx1ZXMsIG5vdCB1bnNpZ25lZCBvbmVzLiAgUHJvYmxlbSByZXBvcnRlZCBieSBKb2hhbm5lcwotCVdhbHRoZXIgPGpvaF93YWx0QHlhaG9vLmRlPi4KLQotMjAwNy0wMi0yMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jIChwc2hfaGludF9hbGlnbik6IEZpeCBhIGJ1ZyBpbiB0aGUgaGludGluZwotCW9mIHNtYWxsIGFuZCBnaG9zdCBzdGVtcyBpbiB0aGUgUG9zdHNjcmlwdCBpbnRlcnByZXRlci4KLQotMjAwNy0wMi0yMCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYyAoRlRfR2V0RmlsZVJlZl9Gcm9tX01hY19BVFNfTmFtZSk6IEZpeCBtZW1vcnkKLQlsZWFrLCBwYXRjaCBieSAiSmpnb2QgSmlhbmciIDxnempqZ29kQGdtYWlsLmNvbT4uCi0JKiBidWlsZHMvbWFjL2Z0bWFjLmMgKEZUX0dldEZpbGVSZWZfRnJvbV9NYWNfQVRTX05hbWUpOiBEaXR0by4KLQotMjAwNy0wMi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX01EKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfbGlua19zZWdtZW50cyk6IERpdHRvLgotCi0yMDA3LTAyLTE0ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlJdCBzZWVtcyB0aGF0IHRoZSBmb2xsb3dpbmcgY2hhbmdlcyBmaXggbW9zdCBvZiB0aGUga25vd24KLQlpbnRlcnByZXRlciBwcm9ibGVtcyB3aXRoIG15IGZvbnRzLCBidXQgbW9yZSB0ZXN0aW5nIGlzIG5lZWRlZCwKLQl0aG91Z2guCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChGSVhfQllURUNPREUpOiBBY3RpdmF0ZS4KLQkoVFRfTXVsRml4MTQpOiBSZXdyaXRlLgotCShJbnNfTUQsIEluc19NRFJQLCBJbnNfSVApIFtGSVhfQllURUNPREVdOiBJbXByb3ZlZCBhbmQgdXBkYXRlZC4KLQkoSW5zX01JUlApOiBEaXR0by4KLQotMjAwNy0wMi0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoUHJvamVjdF94LCBQcm9qZWN0X3kpOiBSZW1vdmUgY29tcGlsZXIKLQl3YXJuaW5ncy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9pbnRlcnByZXRfc3R5bGUpLCBzcmMvYmRmL2JkZmRyaXZyLmMKLQkoYmRmX2ludGVycHJldF9zdHlsZSk6IERpdHRvLgotCi0yMDA3LTAyLTEyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlTaW1wbGlmeSBwcm9qZWN0aW9uIGFuZCBkdWFsLXByb2plY3Rpb24gY29kZSBpbnRlcmZhY2UuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5oIChUVF9Qcm9qZWN0X0Z1bmMpOiBVc2UgYEZUX1BvcycsIG5vdAotCUZUX1ZlY3RvcicgYXMgYXJndW1lbnQgdHlwZS4KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChDVVJfRnVuY19wcm9qZWN0LCBDVVJfRnVuY19kdWFscHJvaik6Ci0JVXBkYXRlZC4KLQkoQ1VSX2Zhc3RfcHJvamVjdCwgQ1VSX2Zhc3RfZHVhbHByb2opOiBOZXcgbWFjcm9zLgotCShQcm9qZWN0LCBEdWFsX1Byb2plY3QsIFByb2plY3RfeCwgUHJvamVjdF95KTogVXBkYXRlZC4KLQkoSW5zX0dDLCBJbnNfU0NGUywgSW5zX01EQVAsIEluc19NSUFQLCBJbnNfSVApOiBVc2UgbmV3IGBmYXN0JwotCW1hY3Jvcy4KLQotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nKTogSW1wcm92ZSBzcGFjaW5nCi0JYWRqdXN0bWVudHMgZm9yIHRoZSBub24tbGlnaHQgYXV0by1oaW50ZWQgbW9kZXMuICBHZXRzIHJpZCBvZgotCWBpbnRlci1sZXR0ZXIgc3BhY2luZyBpcyB0b28gd2lkZScgcHJvYmxlbXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfbGlua19zZWdtZW50cywKLQlhZl9sYXRpbl9oaW50c19jb21wdXRlX2VkZ2VzKTogU2xpZ2h0IG9wdGltaXphdGlvbiBvZiB0aGUgc2VnbWVudAotCWxpbmtlciBhbmQgYmV0dGVyIGhhbmRsaW5nIG9mIHNlcmlmIHNlZ21lbnRzIHRvIGdldCByaWQgb2YgYnJva2VuCi0JYDknIGluIEFyaWFsIGF0IDlwdCAoOTZkcGkpLgotCi0KLQlJbnRyb2R1Y2UgbmV3IHN0cmluZyBmdW5jdGlvbnMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1hY3JvcyB0byBnZXQKLQlyaWQgb2YgdmFyaW91cyB1c2VzIG9mIHN0cmNweSBhbmQgb3RoZXIgYGV2aWwnIGZ1bmN0aW9ucywgYXMgd2VsbCBhcwotCXRvIHNpbXBsaWZ5IGEgZmV3IHRoaW5ncy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oIChmdF9tZW1fc3RyZHVwLCBmdF9tZW1fZHVwLAotCWZ0X21lbV9zdHJjcHluKTogTmV3IGRlY2xhcmF0aW9ucy4KLQkoRlRfTUVNX1NUUkRVUCwgRlRfU1RSRFVQLCBGVF9NRU1fRFVQLCBGVF9EVVAsIEZUX1NUUkNQWU4pOiBOZXcKLQltYWNyb3MuCi0JKiBzcmMvYmFzZS9mdHV0aWwuYyAoZnRfbWVtX2R1cCwgZnRfbWVtX3N0cmR1cCwgZnRfbWVtX3N0cmNweW4pOiBOZXcKLQlmdW5jdGlvbnMuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoYmRmX2ludGVycHJldF9zdHlsZSwgQkRGX0ZhY2VfSW5pdCksCi0Jc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9hZGRfcHJvcGVydHkpLCBzcmMvcGNmL3BjZnJlYWQuYwotCShwY2ZfZ2V0X3Byb3BlcnRpZXMsIHBjZl9pbnRlcnByZXRfc3R5bGUsIHBjZl9sb2FkX2ZvbnQpLAotCXNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9nbHlwaF9uYW1lKSwgc3JjL2NmZi9jZmZsb2FkLmMKLQkoY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKSwgc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9zdHJjcHkpLAotCXNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X2dseXBoX25hbWUpLCBzcmMvdHlwZTEvdDFkcml2ZXIuYwotCSh0MV9nZXRfZ2x5cGhfbmFtZSksIHNyYy90eXBlNDIvdDQyZHJpdnIuYyAodDQyX2dldF9nbHlwaF9uYW1lLAotCXQ0Ml9nZXRfbmFtZV9pbmRleCk6IFVzZSBuZXcgZnVuY3Rpb25zIGFuZCBzaW1wbGlmeSBjb2RlLgotCi0JKiBidWlsZHMvbWFjL2Z0bWFjLmMgKEZUX0ZTUGF0aE1ha2VTcGVjKTogRG9uJ3QgdXNlIEZUX01JTi4KLQotMjAwNy0wMi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nKTogRG9uJ3QgY2hhbmdlIHdpZHRoIGZvcgotCW5vbi1zcGFjaW5nIGdseXBocy4KLQotMjAwNy0wMi0wNyAgVG9tIFBhcmtlciAgPHBhbGZyZXlAdGV2cC5uZXQ+Ci0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9uYW1lX2luZGV4KTogUHJvdGVjdCBhZ2FpbnN0IE5VTEwKLQlwb2ludGVyLgotCi0yMDA3LTAyLTA1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bWFjLmggKEZUX0RFUFJFQ0FURURfQVRUUklCVVRFKToKLQlJbnRyb2R1Y2UgX19hdHRyaWJ1dGUoKGRlcHJlY2F0ZWQpKV9fIHRvIHdhcm4gZnVuY3Rpb25zCi0Jd2hpY2ggdXNlIG5vbi1BTlNJIGRhdGEgdHlwZXMgaW4gaXRzIGludGVyZmFjZXMuCi0JKEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZSk6IERlcHJlY2F0ZWQsIHVzaW5nIEZTU3BlYy4KLQkoRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZSk6IERlcHJlY2F0ZWQsIHVzaW5nIEZTU3BlYy4KLQkoRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMpOiBEZXByZWNhdGVkLCB1c2luZyBGU1NwZWMuCi0JKEZUX05ld19GYWNlX0Zyb21fRlNSZWYpOiBEZXByZWNhdGVkLCB1c2luZyBGU1JlZi4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYzogUHJlZGVmaW5lIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFIGFzIHZvaWQKLQl0byBhdm9pZCB3YXJuaW5nIGluIGJ1aWxkaW5nIEZyZWVUeXBlLgotCSogYnVpbGRzL21hYy9mdG1hYy5jOiBEaXR0by4KLQotMjAwNy0wMi0wNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2Jhc2UvZnRiYXNlLmM6IEZpeCB0byB1c2UgYnVpbGRzL21hYy9mdG1hYy5jLCBpZiBjb25maWd1cmVkCi0JYC0td2l0aC1mc3NwZWMnIGV0Yy4gIFJlcGxhY2UgI2luY2x1ZGUgImZ0bWFjLmMiIHdpdGgKLQkjaW5jbHVkZSA8ZnRtYWMuYz4uCi0KLTIwMDctMDItMDUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaCAoRlRfR2V0RmlsZVBhdGhfRnJvbV9NYWNfQVRTX05hbWUpOgotCUludHJvZHVjZWQgYXMgcmVwbGFjZW1lbnQgb2YgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZS4KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKEZUX0dldEZpbGVQYXRoX0Zyb21fTWFjX0FUU19OYW1lKTogRGl0dG8uCi0JKEZUX0dldEZpbGVfRnJvbV9NYWNfQVRTX05hbWUpOiBSZXdyaXR0ZW4gYXMgd3JhcHBlciBvZgotCUZUX0dldEZpbGVQYXRoX0Zyb21fTWFjX0FUU19OYW1lLgotCSogYnVpbGRzL21hYy9mdG1hYy5jOiBEaXR0by4KLQotMjAwNy0wMi0wNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oOiBGaXhlZCB3cm9uZyBjb21tZW50OiBGU1NwZWMgb2YKLQlGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUsIEZUX0dldEZpbGVfRnJvbV9NYWNfQVRTX05hbWUgYXJlCi0JZm9yIHBhc3NpbmcgdG8gRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuCi0KLTIwMDctMDItMDUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IENoZWNrIHdoZXRoZXIgTWFjIE9TIFggc3lzdGVtIGhlYWRlcnMKLQljYW4gYmUgYnVpbHQgdW5kZXIgQU5TSSBDIG1vZGUuCi0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKE9TX0lOTElORSk6IFJlZGVmaW5lIE9TX0lOTElORSBieSBhIHZlcnNpb24KLQljb21wYXRpYmxlIHRvIEFOU0kgQyBpbiBjYXNlIHN5c3RlbSBoZWFkZXJzIGFyZSBBTlNJIEMgaW5jb21wYXRpYmxlLgotCSogYnVpbGRzL21hYy9mdG1hYy5jIChPU19JTkxJTkUpOiBEaXR0by4KLQotMjAwNy0wMi0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmggKFRUX01TX0xBTkdJRF9EWk9OR0hLQV9CSFVUQU4pOgotCUV4cGxhaW4gd2h5IGFwcGxpY2F0aW9ucyBzaG91bGRuJ3QgdXNlIGl0LiAgRm91bmQgYnkgQWxleGVpLgotCi0yMDA3LTAyLTAxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlMi5tNCAoQUNfQ0hFQ0tfRlQyKTogRml4IHNwZWxsaW5nIG9mIHdhcm5pbmcKLQltZXNzYWdlLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0MS5jCi0JKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX3N1YnN0VGFibGVfdmFsaWRhdGUpOiBGaXggZGVidWdnaW5nCi0JbWVzc2FnZS4KLQotMjAwNy0wMS0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0KLQkqIFZlcnNpb24gMi4zLjEgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi0zLTEtRklOQUwnLgotCi0JKiBidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qOiBzLzIzMC8yMzEvLgotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbDogcy8yMjEvMjMxLy4KLQotCSogdm1zX21ha2UuY29tOiBBZGQgYGZ0Z2FzcCcuCi0KLTIwMDctMDEtMzAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCVRhZyBzb3VyY2VzIHdpdGggVkVSLTItMy0xIHRvIHByZXBhcmUgcmVsZWFzZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMLCBkb2NzL3JlbGVhc2UsIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKToKLQlzLzIuMy4wLzIuMy4xLy4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDk6MTI6My4KLQotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggKEFGX1VTRV9XQVJQRVIpLCBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jCi0JKGFmX2xvYWRlcl9sb2FkX2cpOiBEaXNhYmxlIHRoZSB3YXJwZXIgKGkuZS4sIHRoZSBsaWdodCBoaW50aW5nCi0JaW1wcm92ZW1lbnRzKSB0byBtYWtlIGEgMi4zLjEgYnVnZml4IHJlbGVhc2UgYmVmb3JlIGludHJvZHVjaW5nIGEKLQluZXcgZmVhdHVyZS4gIFRoaXMgc2hvdWxkIGdpdmUgdXMgbW9yZSB0aW1lIHRvIHR1bmUgYW5kIGltcHJvdmUgdGhlCi0Jd2FycGVyIGZvciB0aGUgbmV4dCByZWxlYXNlLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotMjAwNy0wMS0yNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JRm9yIGxpZ2h0IGF1dG8taGludGluZywgaW1wcm92ZSBnbHlwaCBhZHZhbmNlIHdpZHRocyBhbmQgcmVzdXJyZWN0Ci0Jbm9ybWFsL2Z1bGwgaGludGluZyB0byBpdHMgbm9ybWFsIHF1YWxpdHkuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuaCAoQUZfR2x5cGhIaW50c1JlYyk6IE5ldyBtZW1iZXJzIGB4bWluX2RlbHRhJwotCWFuZCBgeG1heF9kZWx0YScuCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX3JlbG9hZCk6IFJlc2V0IGB4bWluX2RlbHRhJwotCWFuZCBgeG1heF9kZWx0YScuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2cpIDxBRl9VU0VfV0FSUEVSPjogUmVwbGFjZQotCXByZXByb2Nlc3NvciBjb25kaXRpb25hbCB3aXRoIGlmLWNsYXVzZSwgaGFuZGxpbmcgYm90aCBsaWdodCBhbmQKLQlub3JtYWwgbW9kZS4KLQotCSogc3JjL2F1dG9maXQvYWZ3YXJwLmMgKEFGX1dhcnBTY29yZSk6IEZpbmUtdHVuZSBhZ2Fpbi4KLQkoYWZfd2FycGVyX2NvbXB1dGUpOiBIYW5kbGUgYHhtaW5fZGVsdGEnIGFuZCBgeG1heF9kZWx0YScuCi0KLTIwMDctMDEtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9yZWxlYXNlOiBVcGRhdGVkIC0tIFNhdmFubmFoIHVzZXMgYSBuZXcgdXBsb2FkaW5nIHNjaGVtZS4KLQotMjAwNy0wMS0yNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2luZGV4X2dldF9wb2ludGVycyk6IEltcHJvdmUgcHJldmlvdXMgZml4LgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxjZmZfb3BfY2FsbHN1YnIsIGNmZl9vcF9jYWxsZ3N1YnI+OiBGaXggc2FuaXR5IGNoZWNrIGZvciBlbXB0eQotCWZ1bmN0aW9ucy4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBsaWdodCBhdXRvLWhpbnRpbmcgaW1wcm92ZW1lbnQuCi0KLTIwMDctMDEtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9pbmRleF9nZXRfcG9pbnRlcnMpOiBIYW5kbGUgbGFzdCBlbnRyeQotCWNvcnJlY3RseSBpbiBhIHNhbml0eSBjaGVjay4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvCi0JbG9hZCBsb2NhbCBhbmQgZ2xvYmFsIGZ1bmN0aW9ucywgYW55IGNoYXJzdHJpbmcgdGhhdCBjYWxsZWQgdGhlIGxhc3QKLQlsb2NhbC9nbG9iYWwgZnVuY3Rpb24gd291bGQgZmFpbCBvdGhlcndpc2UuICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZwotCSMxODg2Ny4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBpdC4KLQotMjAwNy0wMS0yMyAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUpOiBGaXggdHlwbyB0aGF0Ci0JcHJldmVudGVkIGNvbXBpbGF0aW9uIHdoZW4gZGlzYWJsaW5nIGJvdGggdGhlIHVucGF0ZW50ZWQgYW5kIHRoZQotCWJ5dGVjb2RlIGludGVycHJldGVyIGluIHRoZSBUcnVlVHlwZSBmb250IGRyaXZlci4KLQotCi0JRml4IGFuZCBlbmFibGUgdGhlIHdhcnBlciB0byBpbXByb3ZlIGBsaWdodCcgaGludGluZyBtb2RlLiAgVGhpcyBpcwotCW5vdCBuZWNlc3NhcmlseSBhIGZpbmFsIHZlcnNpb24sIGJ1dCBpdCBzZWVtcyB0byB3b3JrIHdlbGwuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfaW5pdCkgW0FGX1VTRV9XQVJQRVJdOgotCURpc2FibGUgY29kZS4KLQkoYWZfbGF0aW5faGludHNfYXBwbHkpIFtBRl9VU0VfV0FSUEVSXTogSGFuZGxlIEZUX1JFTkRFUl9NT0RFX0xJR0hULgotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oOiBBY3RpdmF0ZSBBRl9VU0VfV0FSUEVSLgotCi0JKiBzcmMvYXV0b2ZpdC9hZndhcnAuYyAoQUZfV2FycFNjb3JlKTogVHVuZSB0YWJsZS4KLQkoYWZfd2FycGVyX2NvbXB1dGVfbGluZV9iZXN0KTogRml4IGFycmF5IHNpemUgb2YgYHNjb3JlcycuCi0JKGFmX3dhcnBlcl9jb21wdXRlKTogQmV0dGVyIGhhbmRsaW5nIG9mIGJvcmRlciBjYXNlcy4KLQkqIHNyYy9hdXRvZml0L2Fmd2FycC5oIChBRl9XYXJwZXJSZWMpOiBSZW1vdmUgdW51c2VkIG1lbWJlcnMgYFgxJwotCWFuZCBgWDInLgotCi0yMDA3LTAxLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIENoYW5nZUxvZzogU3BsaXQgb2ZmIG9sZGVyIGVudHJpZXMgaW50by4uLgotCSogQ2hhbmdlTG9nLjIyOiBUaGlzIG5ldyBmaWxlLgotCi0yMDA3LTAxLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgU0haIGZpeC4KLQotMjAwNy0wMS0yMSAgR2VvcmdlIFdpbGxpYW1zICA8Z3d3QHNpbGNvbS5jb20+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfU0haKTogU0haIGRvZXNuJ3QgbW92ZSBwaGFudG9tCi0JcG9pbnRzLgotCi0yMDA3LTAxLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0bXR4LmMgKHR0X2ZhY2VfZ2V0X21ldHJpY3MpCi0JWyFGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFNdOiBGaXggbGltaXQgY2hlY2suCi0KLTIwMDctMDEtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCi0JKiBWZXJzaW9uIDIuMy4wIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMy0wLUZJTkFMJy4KLQotMjAwNy0wMS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL3JlbGVhc2U6IFVwZGF0ZWQuCi0KLTIwMDctMDEtMTYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzKSwKLQlzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9wc19nZXRfZm9udF9pbmZvKSwgc3JjL3RydWV0eXBlL3R0b2Jqcy5jCi0JKHR0X2ZhY2VfaW5pdCksIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfU0hDKTogRml4IGNvbXBpbGVyCi0Jd2FybmluZ3MuCi0KLTIwMDctMDEtMTUgIERldGxlZiBXw7xya25lciAgPFRldGlTb2Z0QGFwZy5sYWhuLmRlPgotCi0JKiBidWlsZHMvYW1pZ2EvbWFrZWZpbGUsIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQsCi0JYnVpbGRzL2FtaWdhL3NtYWtlZmlsZTogQWRkIGBmdGdhc3AuYycgYW5kIGBmdGxjZGZpbC5jJy4KLQotCSogYnVpbGRzL2FtaWdhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IFN5bmNocm9uaXplLgotCi0yMDA3LTAxLTE0ICBEZXRsZWYgV8O8cmtuZXIgIDxUZXRpU29mdEBhcGcubGFobi5kZT4KLQotCUZpeCB2YXJpb3VzIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfc2l6ZV9zZWxlY3QpLCBzcmMvY2ZmL2NmZm9ianMuaCwKLQlzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX3NpemVfcmVxdWVzdCksIHNyYy90eXBlNDIvdDQyb2Jqcy5oOgotCXMvaW5kZXgvc3RyaWtlX2luZGV4Ly4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9NYXRjaF9TaXplKTogcy9pbmRleC9zaXplX2luZGV4Ly4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9yeDUuYwotCShneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV9JbnNlcnRMaXN0X3ZhbGlkYXRlKTogcy9pbmRleC90YWJsZV9pbmRleC8uCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChDb21wdXRlX1BvaW50X0Rpc3BsYWNlbWVudCksCi0Jc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUpOiBBdm9pZCBwb3NzaWJseQotCXVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgotCi0yMDA3LTAxLTEzICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBkb2NzL0NIQU5HRVMsIGRvY3MvSU5TVEFMTC5NQUM6IEltcHJvdmVtZW50cy4KLQotMjAwNy0wMS0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFhZm0uYyAoVDFfUmVhZF9NZXRyaWNzKTogTVMgV2luZG93cyBhbGxvd3MgUEZNCi0JdmVyc2lvbnMgdXAgdG8gMHgzRkYgd2l0aG91dCBjb21wbGFpbmluZy4KLQotMjAwNy0wMS0xMyAgRGVyZWsgQ2xlZ2cgIDxkY2xlZ2dAYXBwbGUuY29tPgotCi0JQWRkIEZUX0dldF9QU19Gb250X0luZm8gaW50ZXJmYWNlIHRvIENGRiBkcml2ZXIuCi0KLQkqIHNyYy9jZmYvY2ZmdHlwZXMuaDogSW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSC4KLQkoQ0ZGX0ZvbnRSZWMpOiBBZGQgYGZvbnRfaW5mbycgZmllbGQuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jOiBJbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ILgotCShjZmZfZm9udF9kb25lKTogRnJlZSBmb250LT5mb250X2luZm8gaWYgbmVjZXNzYXJ5LgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9wc19nZXRfZm9udF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfc2VydmljZV9wc19pbmZvKTogUmVnaXN0ZXIgY2ZmX3BzX2dldF9mb250X2luZm8uCi0KLTIwMDctMDEtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbik6IEZpeCBjb21waWxhdGlvbgotCXdpdGggQysrIGNvbXBpbGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX2R1bXBfc2VnbWVudHMsCi0JYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyk6IERpdHRvLgotCi0JKiBzcmMvYmFzZS9ydWxlcy5tayAoQkFTRV9TUkMpOiBSZW1vdmUgZnRnYXNwLmMgKGl0J3MgYWxyZWFkeSBpbgotCWBtb2R1bGVzLmNmZycpLgotCi0JKiBzcmMvc2ZudC90dHNiaXQwLmg6IFJlbW92ZS4KLQotCSogc3JjL3NmbnQvcnVsZXMubWsgKFNGTlRfRFJWX1NSQyk6IERvbid0IGluY2x1ZGUgdHRzYml0MC5jLgotCi0yMDA3LTAxLTEyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKTogRml4IG1lbW9yeSBzdG9tcGluZwotCWJ1ZyBpbiB0aGUgYml0bWFwIGVtYm9sZGVuZXIgaWYgdGhlIHBpdGNoIG9mIHRoZSBzb3VyY2UgYml0bWFwIGlzCi0JbXVjaCBsYXJnZXIgdGhhbiBpdHMgd2lkdGguCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChVcGRhdGVfTWF4KTogRml4IGFsaWFzaW5nLXJlbGF0ZWQKLQljb21waWxhdGlvbiB3YXJuaW5nLgotCi0yMDA3LTAxLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwtc2gsIGJ1aWxkcy91bml4L21raW5zdGFsbGRpcnM6IFVwZGF0ZWQgZnJvbQotCWBhdXRvbWFrZScgQ1ZTIG1vZHVsZSBmcm9tIHNvdXJjZXMucmVkaGF0LmNvbS4KLQotMjAwNy0wMS0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKGlzX3NwYWNlKTogUmVtb3ZlZC4KLQkocGFyc2VfZW5jb2RpbmcsIHBhcnNlX2NoYXJzdHJpbmdzKTogVXNlIElTX1BTX0RFTElNLgotCShwYXJzZV9jaGFyc3RyaW5ncyk6IFVzZSBJU19QU19UT0tFTi4KLQotCi0JKiBhdXRvZ2VuLnNoOiBBdm9pZCBiYXNoIHNwZWNpZmljIHN5bnRheC4KLQotMjAwNy0wMS0xMSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFNtYWxsIHVwZGF0ZS4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDk6MTE6My4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKElzTWFjUmVzb3VyY2UpOiBGaXggYSBzbWFsbCBidWcgdGhhdCBjYXVzZWQgYQotCWNyYXNoIHdpdGggc29tZSBNYWMgT1MgWCAuZGZvbnQgZmlsZXMuICBTdWJtaXR0ZWQgYnkgTWFzYXRha2UKLQlZYW1hdG8uCi0KLQkqIGF1dG9nZW4uc2g6IFNtYWxsIGZpeCB0byBnZXQgaXQgd29ya2luZyBvbiBNYWMgT1MgWCBwcm9wZXJseToKLQlUaGUgaXNzdWUgaXMgdGhhdCBHTlUgbGlidG9vbCBpcyBjYWxsZWQgYGdsaWJ0b29sJyBvbiB0aGlzIHBsYXRmb3JtLAotCWFuZCB3ZSBtdXN0IGNhbGwgYGdsaWJ0b29saXplJywgc2luY2UgYGxpYnRvb2xpemUnIGRvZXNuJ3QgZXhpc3QuCi0KLTIwMDctMDEtMTAgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogYWxsLXNvdXJjZXM6IFRhZyBhbGwgc291cmNlcyB3aXRoIFZFUi0yLTMtMC1SQzEgYW5kCi0JVkVSLTItMy0wLgotCi0JKiBKYW1maWxlIChSZWZEb2MpLCBSRUFETUUsIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZQotCXZlcnNpb24gbnVtYmVyIHRvIDIuMy4wLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX01JTk9SKTogU2V0IHRvIDMuCi0JKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDAuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjaGFwdGVycy5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0Z2FzcC5oLAotCWluY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaDogVXBkYXRlIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uIHdpdGgKLQlHQVNQIHN1cHBvcnQgYW5kIExDRCBmaWx0ZXJpbmcgc2VjdGlvbnMuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmMgKHBzaF9nbHlwaF9jb21wdXRlX2luZmxlY3Rpb25zKTogRml4IGEgdHlwbwotCXdoaWNoIGNyZWF0ZWQgYW4gZW5kbGVzcyBsb29wIHdpdGggc29tZSBtYWxmb3JtZWQgZm9udCBmaWxlcy4KLQotMjAwNy0wMS0xMCAgRGVyZWsgQ2xlZ2cgIDxkY2xlZ2dAYXBwbGUuY29tPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKFQxX0dldF9NTV9WYXIpOiBBbHdheXMgcmV0dXJuIGZpeGVkLXBvaW50Ci0JdmFsdWVzLgotCi0yMDA3LTAxLTA4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaCwgc3JjL2Jhc2UvZnRnYXNwLmM6IE5ldyBmaWxlcyB3aGljaCBhZGQKLQlhIG5ldyBBUEkgYEZUX0dldF9HYXNwJyB0byByZXR1cm4gZW50cmllcyBvZiB0aGUgYGdhc3AnIHRhYmxlCi0JY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGNoYXJhY3RlciBwaXhlbCBzaXplLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX2dhc3ApOiBBZGQgdmVyc2lvbiBjaGVjayBmb3IgdGhlCi0JYGdhc3AnIHRhYmxlLCBpbiBvcmRlciB0byBhdm9pZCBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBsYXRlcgotCXZlcnNpb25zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9HQVNQX0gpOiBOZXcgbWFjcm8gZm9yCi0JPGZyZWV0eXBlL2Z0Z2FzcC5oPi4KLQotCSogc3JjL2Jhc2UvcnVsZXMubWsgKEJBU0VfU1JDKSwgc3JjL2Jhc2UvSmFtZmlsZSAoX3NvdXJjZXMpLAotCW1vZHVsZXMuY2ZnIChCQVNFX0VYVEVOU0lPTlMpLCBidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qOiBBZGQgc3JjL2Jhc2UvZnRnYXNwLmMgdG8gdGhlCi0JZGVmYXVsdCBidWlsZC4KLQotMjAwNy0wMS0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2lkL2NpZHBhcnNlLmMgKGNpZF9wYXJzZXJfbmV3KTogSW1wcm92ZSBlcnJvciBtZXNzYWdlIGZvcgotCVR5cGUgMTEgZm9udHMuCi0JU2NhbiBmb3IgYC9zZm50cycgdG9rZW4uCi0KLTIwMDctMDEtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NpZC9jaWRwYXJzZS5jIChjaWRfcGFyc2VyX25ldyk6IFJlamVjdCBUeXBlIDExIGZvbnRzLgotCi0yMDA3LTAxLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfaW5kZXhfaW5pdCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0JKGNmZl9pbmRleF9yZWFkX29mZnNldCk6IHMvcGVycm9yL2Vycm9ycC8gdG8gYXZvaWQgZ2xvYmFsIHNoYWRvd2luZy4KLQotMjAwNy0wMS0wNCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfaW5pdCk6IERldGVjdCBub24tc2NhbGFibGUgZm9udHMKLQljb3JyZWN0bHkuICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMTc4NzYuCi0KLQotCURvIG5vdCBhbGxvY2F0ZSBpbnRlcnByZXRlci1zcGVjaWZpYyB0YWJsZXMgaW4gbWVtb3J5IGlmIHdlIGFyZSBub3QKLQlnb2luZyB0byBsb2FkIGdseXBocyB3aXRoIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciBhbnl3YXkuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKHR0X2xvYWRlcl9pbml0KTogTG9hZCBleGVjdXRpb24gY29udGV4dAotCW9ubHkgaWYgZ2x5cGggaXMgaGludGVkLgotCVVwZGF0ZWQuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmggKFRUX1NpemVSZWMpOiBBZGQgbWVtYmVycyBgYnl0ZWNvZGVfcmVhZHknCi0JYW5kIGBjdnNfcmVhZHknLgotCUFkZCBgdHRfc2l6ZV9yZWFkeV9ieXRlY29kZScgZGVjbGFyYXRpb24uCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfZG9uZV9ieXRlY29kZSwKLQl0dF9zaXplX2luaXRfYnl0ZWNvZGUsIHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUpOiBOZXcgZnVuY3Rpb25zLgotCSh0dF9zaXplX2luaXQpOiBNb3ZlIG1vc3QgY29kZSBpbnRvIGB0dF9zaXplX2luaXRfYnl0ZWNvZGUnLgotCSh0dF9zaXplX2RvbmUpOiBNb3ZlIG1vc3QgY29kZSBpbnRvIGB0dF9zaXplX2RvbmVfYnl0ZWNvZGUnLgotCSh0dF9zaXplX3Jlc2V0KTogTW92ZSBzb21lIGNvZGUgdG8gYHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUnLgotCi0KLQlEb24ndCBleHRyYWN0IHRoZSBtZXRyaWNzIHRhYmxlIGZyb20gdGhlIFNGTlQgZm9udCBmaWxlLiAgSW5zdGVhZCwKLQlyZXBhcnNlIGl0IG9uIGVhY2ggZ2x5cGggbG9hZC4gIFRoZSBydW50aW1lIGRpZmZlcmVuY2UgaXMgbm90Ci0Jbm90aWNlYWJsZSwgYW5kIGl0IGNhbiBzYXZlIGEgbG90IG9mIGhlYXAgbWVtb3J5IHdoZW4gbWVtb3J5LW1hcHBlZAotCWZpbGVzIGFyZSBub3QgdXNlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpOiBBZGQgbWVtYmVycwotCWBob3J6X21ldHJpY3Nfb2Zmc2V0JyBhbmQgYHZlcnRfbWV0cmljc19vZmZzZXQnLgotCSogc3JjL3NmbnQvdHRtdHguYyAodHRfZmFjZV9sb2FkX2htdHgsIHR0X2ZhY2VfZ2V0X21ldHJpY3MpOgotCVVwZGF0ZWQuCi0KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X3ZhbGlkYXRlKTogU2xpZ2h0IG9wdGltaXphdGlvbi4KLQotCi0JRG8gbm90IGxvYWQgdGhlIENGRiBpbmRleCBvZmZzZXRzIGludG8gbWVtb3J5LCBzaW5jZSB0aGlzIHdhc3RlcyBhCi0JKmxvdCogb2YgaGVhcCBtZW1vcnkgd2l0aCBsYXJnZSBBc2lhbiBDRkYgZm9udHMuICBUaGVyZSBpcyBubwotCXNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGxvc3MuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5oOiBBZGQgYGNmZl9jaGFyc2V0X2NpZF90b19naW5kZXgnIGRlY2xhcmF0aW9uLgotCSogc3JjL2NmZi9jZmZ0eXBlcy5oIChDRkZfSW5kZXhSZWMpOiBBZGQgZmllbGRzIGBzdGFydCcgYW5kCi0JYGRhdGFfc2l6ZScuCi0JKENGRl9DaGFyc2V0UmVjKTogQWRkIGZpZWxkIGBudW1fZ2x5cGhzJy4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9pbmRleF9yZWFkX29mZnNldCwgY2ZmX2luZGV4X2xvYWRfb2Zmc2V0cywKLQljZmZfY2hhcnNldF9jaWRfdG9fZ2luZGV4KTogTmV3IGZ1bmN0aW9ucy4KLQkoY2ZmX25ld19pbmRleCk6IFJlbmFtZWQgdG8uLi4KLQkoY2ZmX2luZGV4X2luaXQpOiBUaGlzLiAgVXBkYXRlIGFsbCBjYWxsZXJzLgotCVVwZGF0ZWQgLS0gc29tZSBjb2RlIGhhcyBiZWVuIG1vdmVkIHRvIGBjZmZfaW5kZXhfbG9hZF9vZmZzZXRzJy4KLQkoY2ZmX2RvbmVfaW5kZXgpOiBSZW5hbWVkIHRvLi4uCi0JKGNmZl9pbmRleF9kb25lKTogVGhpcy4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoY2ZmX2luZGV4X2dldF9wb2ludGVycywgY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50KTogVXBkYXRlZCB0byB1c2UKLQlzdHJlYW0gb2Zmc2V0cy4KLQkoY2ZmX2NoYXJzZXRfY29tcHV0ZV9jaWRzKTogU2V0IGBudW1fZ2x5cGhzJyBmaWVsZC4KLQkoY2ZmX2VuY29kaW5nX2xvYWQpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBVcGRhdGVkLgotCi0yMDA3LTAxLTA0ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGRvY3MvSU5TVEFMTC5VTklYOiBTaW1wbGlmeSBzb21lIHBhcnRzLCBhZGQgcmVmZXJlbmNlIHRvCi0JYXV0b2dlbi5zaCBhbmQgcG9pbnRlciB0byBSRUFETUUuQ1ZTLgotCi0JKiBSRUFETUUuQ1ZTOiBBZGQgY29tbW9uIHByb2JsZW0gZGVzY3JpcHRpb24gYW5kIHNvbHV0aW9uCi0Jd2hlbiBydW5uaW5nIGF1dG9nZW4uc2guCi0KLQkqIGRvY3MvSU5TVEFMTDogQWRkIHJlZmVyZW5jZSB0byBNYWNPUyBYLgotCi0JKiBkb2NzL01BS0VQUCwgZG9jcy9JTlNUQUxMLk1BQzogTmV3IGRvY3VtZW50YXRpb24gZmlsZXMuCi0KLQkqIGRvY3MvVE9ETzogUmVtb3ZlIG9ic29sZXRlIGl0ZW1zLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmM6IChUUmFzdGVyX0luc3RhbmNlKTogUmVwbGFjZSBpdCB3aXRoLi4uCi0JKFRXb3JrZXIpOiBUaGlzLgotCVJlbW92ZSBgY291bnRfdGFibGUnIGFuZCBgbWVtb3J5Jy4KLQlNYWtlIGBncmF5cycgYSBwb2ludGVyLgotCShUUmFzdGVyKTogTmV3IHN0cnVjdHVyZS4KLQkoY291bnRfdGFibGUpOiBOZXcgc3RhdGljIGFycmF5LgotCShSQVNfQVJHUywgUkFTX0FSRywgUkFTX1ZBUlMsIFJBU19WQVIsIEZUX1VOVVNFRF9SQVNURVIsIGN1cl9yYXMsCi0JVmVydGljYWxfR3JheV9Td2VlcF9TdGVwLCBmdF9ibGFja19uZXcsIGZ0X2JsYWNrX2RvbmUsCi0JZnRfYmxhY2tfc2V0X21vZGUsIGZ0X2JsYWNrX3JlbmRlcik6IFVwZGF0ZWQuCi0JKGZ0X2JsYWNrX2luaXQpOiBEb24ndCBpbml0aWFsaXplIGBjb3VudF90YWJsZScuCi0JKGZ0X2JsYWNrX3Jlc2V0KTogVXNlIHRoZSByZW5kZXIgcG9vbC4gIFRoaXMgc2F2ZXMgYWJvdXQgNktCIG9mCi0JaGVhcCBzcGFjZSBmb3IgZWFjaCBGVF9MaWJyYXJ5IGluc3RhbmNlLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoVFJhc3Rlcik6IFJlcGxhY2VkIHdpdGguLi4KLQkoVFdvcmtlcik6IFRoaXMuCi0JUmVtb3ZlIGBtZW1vcnknLgotCShUUmFzdGVyKTogTmV3IHN0cnVjdHVyZS4KLQotCShSQVNfQVJHXywgUkFTX0FSRywgUkFTX1ZBUl8sIFJBU19WQVIsIHJhcywgZ3JheV9yZW5kZXJfbGluZSwKLQlncmF5X21vdmVfdG8sIGdyYXlfbGluZV90bywgZ3JheV9jb25pY190bywgZ3JheV9jdWJpY190bywKLQlncmF5X3JlbmRlcl9zcGFuLCBncmF5X3Jhc3Rlcl9yZW5kZXIpOiBVcGRhdGVkLgotCShncmF5X3Jhc3Rlcl9yZXNldCk6IFVzZSB0aGUgcmVuZGVyIHBvb2wuICBUaGlzIHNhdmVzIGFib3V0IDZLQiBvZgotCWhlYXAgc3BhY2UgZm9yIGVhY2ggRlRfTGlicmFyeSBpbnN0YW5jZS4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMsIHNyYy9zZm50L3R0a2Vybi5jLCBzcmMvc2ZudC90dGtlcm4uaCwKLQlzcmMvc2ZudC90dG10eC5jLCBzcmMvc2ZudC90dHNiaXQuYywgc3JjL3NmbnQvdHRzYml0LmgsCi0Jc3JjL3RydWV0eXBlL3R0cGxvYWQuYywgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaDogUmVtb3ZlCi0JRlRfT1BUSU1JWkVfTUVNT1JZIG1hY3JvIChhbmQgY29kZSBmb3IgIUZUX09QVElNSVpFX01FTU9SWSkgc2luY2UKLQl0aGUgb3B0aW1pemF0aW9uIGlzIG5vIGxvbmdlciBleHBlcmltZW50YWwuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmMgKHBzaF9nbHlwaF9pbnRlcnBvbGF0ZV9ub3JtYWxfcG9pbnRzKToKLQlSZW1vdmUgYSB0eXBvIHRoYXQgcmVzdWx0cyBpbiBubyBoaW50aW5nIGFuZCBhIG1lbW9yeSBsZWFrIHdpdGggc29tZQotCWxhcmdlIEFzaWFuIENGRiBmb250cy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0RvbmVfTGlicmFyeSk6IFJlbW92ZSBhIHN1YnRsZSBtZW1vcnkgbGVhawotCXdoaWNoIGhhcHBlbnMgd2hlbiBGVF9Eb25lX0xpYnJhcnkgaXMgY2FsbGVkIHdpdGggc3RpbGwgb3BlbmVkCi0JQ0ZGX0ZhY2VzIGluIGl0LiAgV2UgbmVlZCB0byBjbG9zZSBhbGwgZmFjZXMgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlCi0JbW9kdWxlcywgb3IgZWxzZSBzb21lIGJhZCB0aGluZ3MgKG1lbW9yeSBsZWFrcykgbWF5IGhhcHBlbi4KLQotMjAwNy0wMS0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvZ3h2YWxpZC9neHZrZXJuLmMgKGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDBfcGFpcnNfdmFsaWRhdGUpOgotCVJlbW92ZSBjb21waWxlciB3YXJuaW5nLgotCi0yMDA3LTAxLTAyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jOiBBZGQgZG9jdW1lbnRhdGlvbiBjb21tZW50LgotCi0yMDA2LTEyLTMxICBNYXNhdGFrZSBZQU1BVE8gIDxqZXRAZ3l2ZS5vcmc+Ci0KLQkqIHNyYy9neHZhbGlkL2d4dmtlcm4uYyAoZ3h2X2tlcm5fc3VidGFibGVfZm10MF9wYWlyc192YWxpZGF0ZSk6IE5ldwotCWZ1bmN0aW9uLgotCUNoZWNrIHVuaXF1ZW5lc3Mgb2YgdGhlIGdpZCBwYWlycy4KLQkoZ3h2X2tlcm5fc3VidGFibGVfZm10MF92YWxpZGF0ZSk6IE1vdmUgc29tZSBjb2RlIHRvCi0JYGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDBfcGFpcnNfdmFsaWRhdGUnLgotCi0yMDA2LTEyLTIyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYywgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYzogUmVtb3ZlIGNvbXBpbGVyCi0Jd2FybmluZ3MuCi0KLQkqIGJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvajogQWRkIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQotCXRvIGF2b2lkIGRlcHJlY2F0aW9uIHdhcm5pbmdzIHdpdGggVmlzdWFsIEMrKyA4LgotCi0yMDA2LTEyLTE2ICBBbmRlcnMgS2FzZW9yZyAgPGFuZGVyc0BrYXNlb3JnLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRsY2RmaWwuYyAoRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIpCi0JW0ZUX0ZPUkNFX0xJR0hUX0xDRF9GSUxURVJdOiBGaXggdHlwby4KLQotMjAwNi0xMi0xNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmg6IEFkZCBgdm9sYXRpbGUnIHRvCi0Jc3luYyB3aXRoIHRoZSBtb2RpZmljYXRpb24gYnkgSmVucyBDbGF1ZGl1cyBvbiAyMDA2LTA4LTIyOyBjZi4KLQkgIGh0dHA6Ly9jdnMuc2F2YW5uYWguZ251Lm9yZy92aWV3Y3ZzL2ZyZWV0eXBlL2ZyZWV0eXBlMi9zcmMvb3R2YWxpZC9vdHZtb2QuYz9yMT0xLjQmcjI9MS41Ci0KLTIwMDYtMTItMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmM6IFNwZWNpYWxpemVkIGZvciBNYWMgT1MgWCBvbmx5LgotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW46IEZpeGVkIGZvciBwcGM2NCBtaXNzaW5nIENhcmJvbiBmcmFtZXdvcmsuCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBEaXR0by4gIFdoZW4gZXhwbGljaXQgc3dpdGNoZXMgZm9yCi0JRlNTcGVjL0ZTUmVmL1F1aWNrRHJhdy9BVFMgYXZhaWxhYmlsaXR5IGFyZSBnaXZlbiB0byBjb25maWd1cmUsCi0JYnVpbGRzL21hYy9mdG1hYy5jIGlzIHVzZWQgaW5zdGVhZCBvZiBkZWZhdWx0IHNyYy9iYXNlL2Z0bWFjLmMuCi0KLTIwMDYtMTItMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy9tYWMvZnRtYWMuYzogQ29waWVkIHNyYy9iYXNlL2Z0bWFjLmMgZm9yIGxlZ2FjeSBzeXN0ZW0uCi0JKiBidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfY2ZtLm1ha2UudHh0OiBGaXggdG8gdXNlIGJ1aWxkcy9tYWMvZnRtYWMuYwotCWluc3RlYWQgb2Ygc3JjL2Jhc2UvZnRtYWMuYwotCSogYnVpbGRzL21hYy9GcmVlVHlwZS5wcGNfY2FyYm9uLm1ha2UudHh0OiBEaXR0by4KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NsYXNzaWMubWFrZS50eHQ6IERpdHRvLgotCSogYnVpbGRzL21hYy9GcmVlVHlwZS5tNjhrX2Zhci5tYWtlLnR4dDogRGl0dG8sIGFuZCBleGNsdWRlIGd4dmFsaWQuYwotCXRoYXQgY2Fubm90IGJlIGJ1aWx0IGF0IHByZXNlbnQuCi0KLTIwMDYtMTItMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBJbXByb3ZlbWVudCBvZiByZXNvdXJjZSBmb3JrIGhhbmRsZXIgZm9yCi0JUE9TSVgsIGNmLgotCSAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMDYtMTAvbXNnMDAwMjUuaHRtbAotCShNYWNfUmVhZF9zZm50X1Jlc291cmNlKTogQ291bnQgb25seSBgc2ZudCcgcmVzb3VyY2Ugb2Ygc3VpdGNhc2UgZm9udAotCWZvcm1hdCBvciAuZGZvbnQsIHRvIHNpbXVsYXRlIHRoZSBmYWNlIGluZGV4IG51bWJlciBjb3VudGVkIGJ5IGZ0bWFjLmMuCi0JKElzTWFjUmVzb3VyY2UpOiBSZXR1cm4gdGhlIG51bWJlciBvZiBzY2FsYWJsZSBmYWNlcyBjb3JyZWN0bHkuCi0KLTIwMDYtMTItMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3RvcGxldmVsLm1rICh2ZXJzaW9uKTogUHJvdGVjdCBhZ2FpbnN0IGBkaXN0Y2xlYW4nIHRhcmdldC4KLQotMjAwNi0xMi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvKi8qZGVmLm1rLCBidWlsZHMvKi9kZXRlY3QubWsgKENBVCk6IERlZmluZSB0byBlaXRoZXIgYGNhdCcKLQlvciBgdHlwZScuCi0KLQkqIGJ1aWxkcy9mcmVldHlwZS5tayAodmVyc2lvbik6IEV4dHJhY3RlZCBmcm9tIGZyZWV0eXBlLmgsIHVzaW5nCi0JR05VIG1ha2UncyBidWlsdC1pbiBzdHJpbmcgZnVuY3Rpb25zLgotCShyZWZkb2MpOiBVc2UgJCh2ZXJzaW9uKSBpbnN0ZWFkIG9mIHN0YXRpYyB2ZXJzaW9uIG51bWJlci4KLQotMjAwNi0xMi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdG9wbGV2ZWwubWsgKGRpc3QpOiBFeHRyYWN0IHZlcnNpb24gbnVtYmVyIGZyb20gZnJlZXR5cGUuaC4KLQotMjAwNi0xMi0wOCAgVmxhZGltaXIgVm9sb3ZpY2ggIDx2dnZAdnN1LnJ1PgotCi0JKiBzcmMvdG9vbHMvYXBpbmFtZXMuYyAoU3RhdGUpOiBSZW1vdmUgZmluYWwgY29tbWEgaW4gc3RydWN0dXJlIC0tCi0JeGxjIHY1IHVuZGVyIEFJWCA0LjMgZG9lc24ndCBsaWtlIHRoaXMuCi0KLTIwMDYtMTItMDcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyk6IFNtYWxsIGFkanVzdG1lbnQKLQl0byB0aGUgc3BhY2luZyBvZiBhdXRvLWZpdHRlZCBnbHlwaHMuICBUaGlzIG9ubHkgaW1wYWN0cyByYXJlCi0JY2FzZXMgKGUuZy4sIEFyaWFsIEJvbGQgYXQgcmF0aGVyIHNtYWxsIGNoYXJhY3RlciBzaXplcykuCi0KLTIwMDYtMTItMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvcnVsZXMubWsgKFNGTlRfRFJWX1NSQyk6IEFkZCB0dHNiaXQwLmMuCi0KLTIwMDYtMTItMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHR0X2ZhY2VfZ2V0X25hbWUpOiBBbGwgVW5pY29kZSBzdHJpbmdzIGFyZQotCWVuY29kZWQgaW4gVVRGLTE2QkUuICBQYXRjaCBmcm9tIFJhamVldiBQYWh1amEgPHJwYWh1amFAZXNyaS5jb20+LgotCSh0dF9uYW1lX2VudHJ5X2FzY2lpX2Zyb21fdWNzNCk6IFJlbW92ZWQuCi0KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdHhmODYuaDogRml4IGFuZCBleHRlbmQgY29tbWVudCBzbyB0aGF0IGl0Ci0JYXBwZWFycyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNoYXB0ZXJzLmg6IEFkZCBgZm9udF9mb3JtYXQnIHNlY3Rpb24uCi0KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAoSHRtbEZvcm1hdHRlcjo6aW5kZXhfZXhpdCk6IEFkZCBsaW5rCi0JdG8gVE9DIGluIGluZGV4IHBhZ2UuCi0KLTIwMDYtMTEtMjggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmFzdGVyX3JlbmRlcik6IFJldHVybiAwIHdoZW4gd2UgYXJlCi0JdHJ5aW5nIHRvIHJlbmRlciBpbnRvIGEgemVyby13aWR0aC9oZWlnaHQgYml0bWFwLCBub3QgYW4gZXJyb3IgY29kZS4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpOiBGaXggdHlwbyBpbiBwcmV2aW91cyBwYXRjaC4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmM6IFJlbW92ZSBoYXJkLWNvZGVkIGVycm9yIHZhbHVlczsgdXNlIEZyZWVUeXBlCi0Jb25lcyBpbnN0ZWFkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX2R1bXBfc2VnbWVudHMpOiBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUuCi0KLTIwMDYtMTEtMjYgIFBpZXJyZSBIYW5zZXIgIDxoYW5zZXJAY2x1Yi1pbnRlcm5ldC5mcj4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpOiBQcm90ZWN0IGFnYWluc3QgTlVMTCBwb2ludGVyLgotCi0yMDA2LTExLTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYwkoYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMsCi0JYWZfZ2x5cGhfaGludHNfZHVtcF9zZWdtZW50cywgYWZfZ2x5cGhfaGludHNfZHVtcGVkZ2VzKSBbIUFGX0RFQlVHXToKLQlBZGQgc3R1YnMgdG8gbGluayB0aGUgYGZ0Z3JpZCcgdGVzdCBwcm9ncmFtIHdoZW4gZGVidWdnaW5nIGlzCi0JZGlzYWJsZWQgaW4gdGhlIGF1dG8taGludGVyLgotCi0yMDA2LTExLTIzICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYywgc3JjL2F1dG9maXQvYWZoaW50cy5oLCBzcmMvYXV0b2ZpdC9hZmxhdGluLmMsCi0Jc3JjL2F1dG9maXQvYWZ0eXBlcy5oOiBNaXNjZWxsYW5lb3VzIGF1dG8taGludGVyIGltcHJvdmVtZW50cy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzKSBbQUZfREVCVUddOgotCUVtaXQgbW9yZSBzZW5zaWJsZSBpbmZvcm1hdGlvbi4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9TZWdtZW50UmVjKTogQWRkIGBoZWlnaHQnIG1lbWJlci4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSk6IEltcHJvdmUKLQlyb3VuZGluZyBvZiBibHVlIHZhbHVlcy4KLQkoYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyk6IEhpbnQgc2VnbWVudCBoZWlnaHRzLgotCShhZl9sYXRpbl9oaW50c19saW5rX3NlZ21lbnRzKTogUmVkdWNlIGBsZW5fc2NvcmUnIHZhbHVlLgotCShhZl9sYXRpbl9oaW50c19jb21wdXRlX2VkZ2VzKTogSW5jcmVhc2UgYHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZCcKLQl2YWx1ZSBhbmQgdXNlIGBoZWlnaHQnIG1lbWJlciBmb3IgY29tcGFyaXNvbnMuCi0JKGFmX2xhdGluX2hpbnRfZWRnZXMpOiBFeHRlbmQgbG9nZ2luZyBtZXNzYWdlLgotCUltcHJvdmUgaGFuZGxpbmcgb2YgcmVtYWluaW5nIGVkZ2VzLgotCi0yMDA2LTExLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMxNTU1My4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfbG9hZGVyX2luaXQpOiBSZS1leGVjdXRlIHRoZSBDVlQKLQlwcm9ncmFtIGFmdGVyIGEgY2hhbmdlIGZyb20gbW9ubyB0byBncmF5c2NhbGluZyAoYW5kIHZpY2UgdmVyc2EpLgotCVVzZSBjb3JyZWN0IGNvbnN0YW50IGZvciBjb21wYXJpc29uIHRvIGdldCBgZXhlYy0+Z3JheXNjYWxlJy4KLQotMjAwNi0xMS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQmVjYXVzZSBGVF9Mb2FkX0dseXBoIGV4cGVjdHMgQ0lEIHZhbHVlcyBmb3IgQ0lELWtleWVkIGZvbnRzLCB0aGUKLQl0ZXN0IGZvciBhIHZhbGlkIGdseXBoIGluZGV4IG11c3QgYmUgZGVmZXJyZWQgdG8gdGhlIGZvbnQgZHJpdmVycy4KLQlUaGlzIHBhdGNoIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMTgzMDEuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogRG9uJ3QgY2hlY2sgYGdseXBoX2luZGV4Jy4KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0dseXBoX0xvYWQpLCBzcmMvY2ZmL2NmZmdsb2FkLmMKLQkoY2ZmX3Nsb3RfbG9hZCksIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX3Nsb3RfbG9hZF9nbHlwaCksCi0Jc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfR2x5cGhfTG9hZCksIHNyYy9wZnIvcGZyb2Jqcy5jCi0JKHBmcl9zbG90X2xvYWQpLCBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoTG9hZF9HbHlwaCksCi0Jc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfTG9hZF9HbHlwaCksIHNyYy93aW5mb250cy93aW5mbnQuYwotCShGTlRfTG9hZF9HbHlwaCk6IENoZWNrIHZhbGlkaXR5IG9mIGBnbHlwaF9pbmRleCcuCi0KLTIwMDYtMTEtMTMgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEZJWF9CWVRFQ09ERSk6IFVuZGVmaW5lLiAgVGhlIGludGVycHJldGVyCi0JYGVuaGFuY2VtZW50cycgYXJlIHN0aWxsIHRvbyBidWdneSBmb3IgZ2VuZXJhbCB1c2UuCi0KLQkqIHNyYy9iYXNlL2Z0bGNkZmlsLmM6IEFkZCBzdXBwb3J0IGZvciBGVF9GT1JDRV9MSUdIVF9MQ0RfRklMVEVSIGFuZAotCUZUX0ZPUkNFX0xFR0FDWV9MQ0RfRklMVEVSIGF0IGNvbXBpbGUgdGltZS4gIERlZmluZSB0aGVzZSBtYWNyb3MKLQl3aGVuIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBMQ0QgZmlsdGVyIHRvIGJlCi0JdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGV4cGVyaW1lbnRhdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oOiBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KLQotMjAwNi0xMS0xMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvc21vb3RoL2Z0c21vb3RoLmM6IEFQSSBjaGFuZ2UgZm9yIHRoZSBMQ0QKLQlmaWx0ZXIuICBUaGUgRlRfTGNkRmlsdGVyIHZhbHVlIGlzIGFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgd2hpY2gKLQlmaWx0ZXIgdG8gYXBwbHksIHdpdGggbmV3IHZhbHVlcyBGVF9MQ0RfRklMVEVSX0xJR0hUIGFuZAotCUZUX0xDRF9GSUxURVJfTEVHQUNZICh0aGUgbGF0dGVyIGltcGxlbWVudHMgdGhlIExpYlhmdCBvcmlnaW5hbAotCWFsZ29yaXRobSB3aGljaCBwcm9kdWNlcyBzdHJvbmcgY29sb3IgZnJpbmdlcyBmb3IgZXZlcnl0aGluZwotCWV4Y2VwdCB2ZXJ5LXdlbGwgaGludGVkIHRleHQpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmggKEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKTogQ2hhbmdlCi0Jc2Vjb25kIHBhcmFtZXRlciB0byBhbiBlbnVtIHR5cGUuCi0KLQkqIHNyYy9iYXNlL2Z0bGNkZmlsLmMgKFVTRV9MRUdBQ1kpOiBEZWZpbmUuCi0JKF9mdF9sY2RfZmlsdGVyKTogUmVuYW1lIHRvLi4uCi0JKF9mdF9sY2RfZmlsdGVyX2Zpcik6IFRoaXMuCi0JVXBkYXRlIHBhcmFtZXRlcnMuCi0JKF9mdF9sY2RfZmlsdGVyX2xlZ2FjeSkgW1VTRV9MRUdBQ1ldOiBOZXcgZmlsdGVyIGZ1bmN0aW9uLgotCShGVF9MaWJyYXJ5X1NldExjZEZpbHRlcik6IFVwZGF0ZSBwYXJhbWV0ZXJzLgotCUhhbmRsZSBuZXcgZmlsdGVyIG1vZGVzLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL2Z0b2Jqcy5oOiBJbmNsdWRlIEZUX0xDRF9GSUxURVJfSC4KLQkoRlRfQml0bWFwX0xjZEZpbHRlckZ1bmMpOiBDaGFuZ2UgdGhpcmQgYXJndW1lbnQgdG8gYEZUX0xpYnJhcnknLgotCShGVF9MaWJyYXJ5UmVjKSBbRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkddOiBBZGQgZmlsdGVyaW5nCi0JY2FsbGJhY2sgYW5kIHVwZGF0ZSBvdGhlciBmaWVsZHMuCi0KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKQotCVtGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklOR106IFVwZGF0ZS4KLQlPdGhlciBtaW5vciBpbXByb3ZlbWVudHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYzogVmFyaW91cyB0aW55IGltcHJvdmVtZW50cyB0aGF0IGRyYXN0aWNhbGx5Ci0JaW1wcm92ZSB0aGUgaGFuZGxpbmcgb2Ygc2VyaWYgZm9udHMgYW5kIG9mIExDRC9MQ0RfViBoaW50aW5nIG1vZGVzLgotCShhZl9sYXRpbl9oaW50c19jb21wdXRlX2VkZ2VzKTogRml4IHR5cG8uCi0JKGFmX2xhdGluX2NvbXB1dGVfc3RlbV93aWR0aCk6IFRha2UgYmV0dGVyIGNhcmUgb2YgZGlhZ29uYWwgc3RlbXMuCi0KLTIwMDYtMTEtMDkgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uYyAocHNoX2dseXBoX2NvbXB1dGVfaW5mbGVjdGlvbnMpOiBGaXgKLQl0eXBvIHdoaWNoIGNyZWF0ZWQgYSB2YXJpYWJsZS11c2VkLWJlZm9yZS1pbml0aWFsaXplZCBidWcuCi0KLTIwMDYtMTEtMDcgIFpoZSBTdSAgPGphbWVzLnN1QGdtYWlsLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRzeW50aC5jIChGVF9HbHlwaFNsb3RfRW1ib2xkZW4pOiBIYW5kbGUgdmVydGljYWwgbGF5b3V0Ci0JYWxzby4KLQotMjAwNi0xMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYzogRG9uJ3QgdXNlIGBsb25nIGxvbmcnIGJ1dCBgRlRfSW50NjQnLgotCi0yMDA2LTExLTAyICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlBZGQgYSBmZXcgdHdlYWtzIHRvIGJldHRlciBoYW5kbGUgc2VyaWYgZm9udHMuCi0JQWRkIG1vcmUgZGVidWdnaW5nIG1lc3NhZ2VzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfZWRnZXMpOiBJZ25vcmUKLQlzZWdtZW50cyB0aGF0IGFyZSBsZXNzIHRoYW4gMS41IHBpeGVscyBoaWdoLiAgVGhpcyBnZXRzIHJpZCBvZgotCSptYW55KiBjb3JuZXIgY2FzZXMgd2l0aCBzZXJpZnMuCi0JKGFmX2xhdGluX2FsaWduX2xpbmtlZF9lZGdlKTogQWRkIGxvZ2dpbmcgbWVzc2FnZS4KLQkoYWZfbGF0aW5faGludF9lZGdlcyk6IFVzZSBBRl9ISU5UU19ET19CTFVFUy4KLQlBZGQgbG9nZ2luZyBtZXNzYWdlcy4KLQlIYW5kbGUgQUZfRURHRV9GTEFHIGZsYWcgc3BlY2lhbGx5LgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIFtBRl9ERUJVR106IEFkZCBfYWZfZGVidWcsCi0JX2FmX2RlYnVnX2Rpc2FibGVfYmx1ZV9oaW50cywgYW5kIF9hZl9kZWJ1Z19oaW50cyB2YXJpYWJsZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCAoQUZfTE9HKSBbQUZfREVCVUddOiBVc2UgX2FmX2RlYnVnLgotCVVwZGF0ZSBleHRlcm5hbCBkZWNsYXJhdGlvbnMuCi0JKGFmX2Nvcm5lcl9vcmllbnRhdGlvbiwgYWZfY29ybmVyX2lzX2ZsYXQpOiBSZXBsYWNlZCBieS4uLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIChmdF9jb3JuZXJfb3JpZW50YXRpb24sCi0JZnRfY29ybmVyX2lzX2ZsYXQpOiBUaGVzZSBkZWNsYXJhdGlvbnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmYW5nbGVzLmMgKGFmX2Nvcm5lcl9vcmllbnRhdGlvbiwgYWZfY29ybmVyX2lzX2ZsYXQpOgotCUNvbW1lbnQgb3V0LiAgUmVwbGFjZWQgYnkuLi4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmggKGZ0X2Nvcm5lcl9vcmllbnRhdGlvbiwgZnRfY29ybmVyX2lzX2ZsYXQpOgotCVRoZXNlIGZ1bmN0aW9ucy4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoRlRfQWRkNjQpIFshRlRfTE9ORzY0XTogU2ltcGxpZnkuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0guCi0JKGFmX2RpcmVjdGlvbl9jb21wdXRlKTogQWRkIGEgbWlzc2luZyBGVF9BQlMgY2FsbC4gIFRoaXMgYnVnIGNhdXNlZAotCXByb2R1Y3Rpb24gb2YgZ2FyYmFnZSBieSBtaXNzaW5nIGxvdHMgb2Ygc2VnbWVudHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuaCAoQUZfSElOVFNfRE9fQkxVRVMpOiBOZXcgbWFjcm8uCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9pbml0LCBhZl9sb2FkZXJfZG9uZSkKLQlbQUZfREVCVUddOiBTZXQgX2FmX2RlYnVnX2hpbnRzLgotCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ILgotCShwc2hfY29ybmVyX2lzX2ZsYXQsIHBzaF9jb3JuZXJfb3JpZW50YXRpb24pOiBVc2UgZnRfY29ybmVyX2lzX2ZsYXQKLQlhbmQgZnRfY29ybmVyX29yaWVudGF0aW9uLgotCi0KLQkqIHNyYy9nemlwL2luZnRyZWVzLmMgKGh1ZnRfYnVpbGQpOiBSZW1vdmUgY29tcGlsZXIgd2FybmluZy4KLQotMjAwNi0xMC0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2VuY29kaW5nX2xvYWQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfU2VsZWN0X0NoYXJtYXApOiBEaXNhbGxvdyBGVF9FTkNPRElOR19OT05FCi0JYXMgYXJndW1lbnQuCi0KLTIwMDYtMTAtMjMgIFpoZSBTdSAgPHpzdUBub3ZlbGwuY29tPgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKTogUmUtaW1wbGVtZW50IHRvCi0JYmV0dGVyIGRlYWwgd2l0aCBicm9rZW4gQXNpYW4gZm9udHMgd2l0aCBzdHJhbmdlIGdseXBocywgaGF2aW5nCi0Jc2VsZi1pbnRlcnNlY3Rpb25zIGFuZCBvdGhlciBwZWN1bGlhcml0aWVzLiAgVGhlIHVzZWQgYWxnb3JpdGhtIGlzCi0JYmFzZWQgb24gdGhlIG5vbnplcm8gd2luZGluZyBydWxlLgotCi0yMDA2LTEwLTIzICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlTcGVlZCB1cCB0aGUgQ0ZGIGZvbnQgbG9hZGVyLiAgV2l0aCBzb21lIGxhcmdlIENGRiBmb250cywKLQlGVF9PcGVuX0ZhY2UgaXMgbm93IG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBmYXN0ZXIuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfZ2V0X29mZnNldCk6IFJlbW92ZWQuCi0JKGNmZl9uZXdfaW5kZXgpOiBJbmxpbmUgZnVuY3Rpb25hbGl0eSBvZiBgY2ZmX2dldF9vZmZzZXQnLgotCShjZmZfY2hhcnNldF9jb21wdXRlX2NpZHMsIGNmZl9jaGFyc2V0X2ZyZWVfY2lkcyk6IE5ldyBmdW5jdGlvbnMuCi0JKGNmZl9jaGFyc2V0X2RvbmUpOiBDYWxsIGBjZmZfY2hhcnNldF9mcmVlX2NpZHMnLgotCShjZmZfY2hhcnNldF9sb2FkKTogQ2FsbCBgY2ZmX2NoYXJzZXRfY29tcHV0ZV9jaWRzJy4KLQkoY2ZmX2VuY29kaW5nX2xvYWQpIDxQb3B1bGF0ZT46IERpdHRvLCB0byByZXBsYWNlIGluZWZmaWNpZW50IGxvb3AuCi0KLQkqIHNyYy9zZm50L3R0bXR4LmMgKHR0X2ZhY2VfbG9hZF9obXR4KTogUmVwbGFjZSBjYWxscyB0byBGVF9HRVRfWFhYCi0Jd2l0aCBGVF9ORVhUX1hYWC4KLQotCi0JU3BlZWQgdXAgdGhlIFBvc3RzY3JpcHQgaGludGVyLCB3aXRoIG1vcmUgdGhhbiAxMDAlIHNwZWVkIGluY3JlYXNlCi0Jb24gbXkgbWFjaGluZS4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uYyAocHNoX2Nvcm5lcl9pc19mbGF0LAotCXBzaF9jb3JuZXJfb3JpZW50YXRpb24pOiBOZXcgZnVuY3Rpb25zLgotCShwc2hfZ2x5cGhfY29tcHV0ZV9pbmZsZWN0aW9ucyk6IE1lcmdlIGxvb3BzIGZvciBlZmZpY2llbmN5LgotCVVzZSBgcHNoX2Nvcm5lcl9vcmllbnRhdGlvbicuCi0JKHBzaF9nbHlwaF9pbml0KTogVXNlIGBwc2hfY29ybmVyX2lzX2ZsYXQnLgotCShwc2hfaGludF90YWJsZV9maW5kX3N0cm9uZ19wb2ludCk6IFJlbmFtZWQgdG8uLi4KLQkocHNoX2hpbnRfdGFibGVfZmluZF9zdHJvbmdfcG9pbnRzKTogVGhpcy4KLQlSZXdyaXRlLCBhZGRpbmcgYXJndW1lbnQgdG8gaGFuZGxlIGFsbCBwb2ludHMgYXQgb25jZS4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKFBTSF9NQVhfU1RST05HX0lOVEVSTkFMKTogTmV3IG1hY3JvLgotCShwc2hfZ2x5cGhfaW50ZXJwb2xhdGVfbm9ybWFsX3BvaW50cyk6IFJld3JpdGUgZm9yIGVmZmljaWVuY3kuCi0KLTIwMDYtMTAtMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKEZUX05ld19GYWNlX0Zyb21fRk9ORCk6IEluaXRpYWxpemUgdmFyaWFibGUKLQlgZXJyb3InIHdpdGggRlRfRXJyX09rLgotCi0yMDA2LTEwLTE0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBkb2NzL0lOU1RBTEwuQ1JPU1M6IE5ldyBkb2N1bWVudCBmaWxlIGZvciBjcm9zcy1idWlsZGluZy4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogUHJlbGltaW5hcnkgY3Jvc3MtYnVpbGRpbmcgc3VwcG9ydC4KLQlGaW5kIG5hdGl2ZSBDIGNvbXBpbGVyIGFuZCBwYXNzIGl0IGJ5IENDX0JVSUxELCBhbmQKLQlmaW5kIHN1ZmZpeCBmb3IgbmF0aXZlIGV4ZWN1dGFibGUgYW5kIHBhc3MgaXQgYnkgRVhFRVhUX0JVSUxELgotCUFsc28gc3VmZml4IGZvciB0YXJnZXQgZXhlY3V0YWJsZSBpcyBwYXNzZWQgYnkgRVhFRVhULgotCi0JKiBidWlsZHMvdW5peC91bml4LWNjLmluIChDQ3Jhd19idWlsZCwgRV9CVUlMRCk6IE5ldyB2YXJpYWJsZXMgdG8KLQlidWlsZCBgYXBpbmFtZXMnIHdoaWNoIHJ1bnMgb24gYnVpbGRpbmcgc3lzdGVtLiAgVGhleSBhcmUgc2V0IGJ5Ci0JQ0NfQlVJTEQgYW5kIEVYRUVYVF9CVUlMRC4KLQotCSogYnVpbGRzL2V4cG9ydHMubWsgKEFQSU5BTUVTX0VYRSk6IENoYW5nZSB0aGUgZXh0ZW5zaW9uIGZvcgotCWFwaW5hbWVzIGZyb20gdGhlIHN1ZmZpeCBmb3IgdGFyZ2V0IChFKSB0byB0aGF0IGZvciBidWlsZGluZyBob3N0Ci0JKEVfQlVJTEQpLgotCi0yMDA2LTEwLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvSU5TVEFMTC5VTlgsIGRvY3MvVVBHUkFERS5VTlg6IFJlbmFtZWQgdG8uLi4KLQkqIGRvY3MvSU5TVEFMTC5VTklYLCBkb2NzL1VQR1JBREUuVU5JWDogVGhpcy4gIFVwZGF0ZSBhbGwgZG9jdW1lbnRzCi0Jd2hpY2ggcmVmZXJlbmNlIHRob3NlIGZpbGVzLgotCi0yMDA2LTEwLTEyICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3IChGVDJfRVhUUkFfTElCUyk6IE5ldyB2YXJpYWJsZS4gIEl0IGlzCi0JZW1iZWRkZWQgaW4gZnJlZXR5cGUyLnBjIGFuZCBmcmVldHlwZS1jb25maWcuICBVc2UgaXQgdG8gcmVjb3JkCi0JQ2FyYm9uIGRlcGVuZGVuY3kgb2YgTWFjT1NYLgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZTIuaW46IEVtYmVkIEZUMl9FWFRSQV9MSUJTLgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW46IERpdHRvLgotCi0yMDA2LTEwLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRldmVsL2Z0b3B0aW9uLmggKEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HKTogRGVmaW5lIGZvcgotCWRldmVsb3BtZW50LgotCi0yMDA2LTEwLTAzICBKZW5zIENsYXVkaXVzICA8amVucy5jbGF1ZGl1c0B5YWhvby5jb20+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmg6IENhc3QgYXdheSB2b2xhdGlsZW5lc3MgZnJvbQotCWFyZ3VtZW50IHRvIGZ0X3NldGptcC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmg6IEFkZCBjb21tZW50IHRoYXQKLQlmdF92YWxpZGF0b3JfcnVuIG11c3Qgbm90IGJlIHVzZWQuCi0KLTIwMDYtMTAtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRiYXNlLmM6IFVuZG8gY2hhbmdlIGZyb20gMjAwNi0wOS0zMC4KLQotCSogc3JjL2Jhc2UvcnVsZXMubWsgKEJBU0VfU1JDKTogUmVtb3ZlIGBmdGxjZGZpbC5jJy4KLQotMjAwNi0wOS0zMCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9GYWNlX0ludGVybmFsUmVjKToKLQlzL3VucGF0ZW50ZWRfaGludGluZy9pZ25vcmVfdW5wYXRlbnRlZF9oaW50ZXIvLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBSZWZpbmUgdGhlIGFsZ29yaXRobSB3aGV0aGVyCi0JYXV0by1oaW50aW5nIHNoYWxsIGJlIHVzZWQgb3Igbm90LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2ZhY2VfaW5pdCk6IERpdHRvLgotCi0yMDA2LTA5LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyk6IFJlbW92ZSBgZnRhcGkuYycgKHdoaWNoIGlzIG5vIGxvbmdlcgotCWluIHVzZSkuCi0KLQkqIHNyYy9iYXNlL2Z0YmFzZS5jOiBJbmNsdWRlIGBmdGxjZGZpbC5jJy4KLQotMjAwNi0wOS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDRfY2hhcl9tYXBfYmluYXJ5KTogRml4IGFsZ29yaXRobSBmb3IKLQlvdmVybGFwcGluZyBzZWdtZW50cy4gIEJ1ZyByZXBvcnRlZCBieSBTdGVmYW4gS29jaC4KLQotMjAwNi0wOS0yOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JRml4IGEgYnVnIGluIHRoZSBhdXRvbWF0aWMgdW5wYXRlbnRlZCBoaW50aW5nIHN1cHBvcnQgd2hpY2ggcHJldmVudHMKLQlub3JtYWwgYnl0ZWNvZGUgaGludGluZyB0byB3b3JrIHByb3Blcmx5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9GYWNlX0ludGVybmFsUmVjKToKLQlzL2ZvcmNlX2F1dG9oaW50L3VucGF0ZW50ZWRfaGludGluZy8uICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogVXBkYXRlZCBjb2RlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggKEFGX0RFQlVHKTogVW5kZWZpbmUgdG8gZ2V0IHJpZCBvZiB0cmFjZXMuCi0KLTIwMDYtMDktMjcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9GUkVFVFlQRV9QQVRDSCk6IFNldCB0byAyLgotCi0KLQlBZGQgYSBuZXcgQVBJIHRvIHN1cHBvcnQgY29sb3IgZmlsdGVyaW5nIG9mIHN1YnBpeGVsIGdseXBoIGJpdG1hcHMuCi0JSW4gYSBkZWZhdWx0IGJ1aWxkLCB0aGUgZnVuY3Rpb24gYEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyJyByZXR1cm5zCi0JYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnOyB5b3UgbmVlZCB0byAjZGVmaW5lCi0JRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgaW4gZnRvcHRpb24uaCB0byBjb21waWxlIHRoZQotCXJlYWwgaW1wbGVtZW50YXRpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCwgc3JjL2Jhc2UvZnRsY2RmaWwuYzogTmV3IGZpbGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYyk6IE5ldwotCXR5cGVkZWYuCi0JKEZUX0xpYnJhcnlSZWMpIFtGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklOR106IE5ldyBtZW1iZXJzCi0JYGxjZF9maWx0ZXJfd2VpZ2h0cycgYW5kIGBsY2RfZmlsdGVyJy4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBSZW1vdmUgYXJndW1lbnRzCi0JYGhtdWwnIGFuZCBgdm11bCcuCi0KLQlIYW5kbGUgc3VicGl4ZWwgcmVuZGVyaW5nLgotCVNpbXBsaWZ5IGZ1bmN0aW9uLgotCShmdF9zbW9vdGhfcmVuZGVyX2xjZCk6IFVzZSBgRlRfUkVOREVSX01PREVfTENEJy4KLQkoZnRfc21vb3RoX3JlbmRlcl9sY2Rfdik6IFVzZSBgRlRfUkVOREVSX01PREVfTENEX1YnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9MQ0RfRklMVEVSX0gpOiBOZXcgbWFjcm8sCi0JcG9pbnRpbmcgdG8gPGZyZWV0eXBlL2Z0bGNkZmlsLmg+LgotCi0JKiBzcmMvYmFzZS9KYW1maWxlIChfc291cmNlcyksIHNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyksCi0Jdm1zX21ha2UuY29tOiBBZGQgYGZ0bGNkZmlsLmMnIHRvIHRoZSBsaXN0IG9mIGNvbXBpbGVkIHNvdXJjZSBmaWxlcy4KLQotCSogbW9kdWxlcy5jZmcgKEJBU0VfRVhURU5TSU9OUyk6IEFkZCBmdGxjZGZpbC5jLgotCi0yMDA2LTA5LTI2ICBEYXZpZCBCdXN0aW4KLQotCSogc3JjL3Bmci9wZnJvYmpzLmMgKHBmcl9mYWNlX2dldF9rZXJuaW5nKTogU2tpcCBhZGp1c3RtZW50IGJ5dGVzCi0JY29ycmVjdGx5LiAgUmVwb3J0ZWQgYXMgU2F2YW5uYWggYnVnICMxNzg0My4KLQotMjAwNi0wOS0yNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmggKEFGX0hJTlRTX0RPX0hPUklaT05UQUwsCi0JQUZfSElOVFNfRE9fVkVSVElDQUwsIEFGX0hJTlRTX0RPX0FEVkFOQ0UpOiBOZXcgbWFjcm9zIHRvIGRpc2FibGUKLQlob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBoaW50aW5nIGZvciB0aGUgcHVycG9zZSBvZiBkZWJ1Z2dpbmcgdGhlCi0JYXV0by1maXR0ZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKF9hZl9kZWJ1Z19kaXNhYmxlX2hvcnpfaGludHMsCi0JX2FmX2RlYnVnX2Rpc2FibGVfdmVydF9oaW50cykgW0FGX0RFQlVHXTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCBbQUZfREVCVUddOiBEZWNsYXJlIGFib3ZlIHZhcmlhYmxlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCwgZGV2ZWwvZnRvcHRpb24uaAotCShGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyk6IE5ldyBtYWNybyB0byBjb250cm9sIHdoZXRoZXIKLQl3ZSB3YW50IHRvIGNvbXBpbGUgTENELW9wdGltaXplZCByZW5kZXJpbmcgY29kZSAow6AgbGEgQ2xlYXJUeXBlKSBvcgotCW5vdC4gIFRoZSBtYWNybyAqbXVzdCogYmUgZGlzYWJsZWQgaW4gZGVmYXVsdCBidWlsZHMgb2YgdGhlIGxpYnJhcnkKLQlmb3IgcGF0ZW50IHJlYXNvbnMuCi0KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogRGlzYWJsZQotCUxDRC1zcGVjaWZpYyByZW5kZXJpbmcgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwotCWlzbid0IGRlZmluZWQgYXQgY29tcGlsZSB0aW1lLiAgVGhpcyBvbmx5IGNoYW5nZXMgdGhlIGNvbnRlbnQgb2YgdGhlCi0JcmVuZGVyZWQgZ2x5cGggdG8gbWF0Y2ggdGhlIG9uZSBvZiBub3JtYWwgZ3JheS1sZXZlbCByZW5kZXJpbmcsCi0JaGVuY2UgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gYmUgbW9kaWZpZWQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAwNi0wOS0xOCAgR2FycmljayBNZWVrZXIgIDxnYXJyaWNrQGRpZ2l0YWxhbmFyY2h5LmNvbT4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYyAoRlRfTmV3X0ZhY2VfRnJvbV9GT05EKTogRmFsbCBiYWNrIHRvIFNGTlQgaWYKLQlMV0ZOIGZhaWxzIGFuZCBib3RoIGFyZSBhdmFpbGFibGUuCi0KLTIwMDYtMDktMTEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHR0X2ZhY2VfZ2V0X25hbWUpOiBTdXBwb3J0IHNvbWUgZm9udHMgd2hpY2gKLQlyZXBvcnQgdGhlaXIgRW5nbGlzaCBuYW1lcyB0aHJvdWdoIGFuIEFwcGxlIFJvbWFuCi0JKHBsYXRmb3JtLGVuY29kaW5nKSBwYWlyLCB3aXRoIGxhbmd1YWdlX2lkICE9IEVuZ2xpc2guCi0KLQlJZiB0aGUgZm9udCB1c2VzIGFub3RoZXIgbmFtZSBlbnRyeSB3aXRoIGxhbmd1YWdlX2lkID09IEVuZ2xpc2gsIGl0Ci0Jd2lsbCBiZSBzZWxlY3RlZCBjb3JyZWN0bHksIHRob3VnaC4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpOiBBZGQgdW5wYXRlbnRlZCBoaW50aW5nCi0Jc2VsZWN0aW9uIGZvciBgbWluZ2xpLnR0ZicuCi0KLTIwMDYtMDktMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYyAodHRfZmFjZV9sb2FkX2hkbXgpOiBIYW5kbGUgYHJlY29yZF9zaXplJwotCXZhbHVlcyB3aGljaCBoYXZlIHRoZSB1cHBlciB0d28gYnl0ZXMgc2V0IHRvIDB4RkYgaW5zdGVhZCBvZiAweDAwCi0JKGFzIGl0IGhhcHBlbnMgaW4gYXQgbGVhc3QgdHdvIENKS1YgZm9udHMsIGBIQU4gTk9NIEEudHRmJyBhbmQKLQlgSEFOIE5PTSBCLnR0ZicpLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyBbR1JBWVNfVVNFX0dBTU1BXTogUmVhbGx5IHJlbW92ZSBhbGwgY29kZS4KLQotMjAwNi0wOS0wNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgotCi0JTWlub3Igc291cmNlIGNsZWFudXBzIGFuZCBvcHRpbWl6YXRpb25zLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoR1JBWVNfQ09NUEFDVCk6IFJlbW92ZWQuCi0JKFRSYXN0ZXIpOiBSZW1vdmUgYGNvdW50X2V4JyBhbmQgYGNvdW50X2V5Jy4KLQkoZ3JheV9maW5kX2NlbGwpOiBSZW1vdmUgMm5kIGFuZCAzcmQgYXJndW1lbnQuCi0JKGdyYXlfYWxsb2NfY2VsbCk6IE1lcmdlZCB3aXRoIGBncmF5X2ZpbmRfY2VsbCcuCi0JKGdyYXlfcmVjb3JkX2NlbGwpOiBTaW1wbGlmeS4KLQkoZ3JheV9zZXRfY2VsbCk6IFJld3JpdGUuCi0JKGdyYXlfc3RhcnRfY2VsbCk6IEFwcGx5IG9mZnNldHMgdG8gYHJhcy5leCcgYW5kIGByYXMuZXknLgotCShncmF5X3JlbmRlcl9zcGFuKTogRG9uJ3QgdXNlIEZUX01FTV9TRVQgZm9yIHNtYWxsIHZhbHVlcy4KLQkoZ3JheV9kdW1wX2NlbGxzKSBbREVCVUdfR1JBWVNdOiBOZXcgZnVuY3Rpb24uCi0JKGdyYXlfc3dlZXApOiBBdm9pZCBidWZmZXIgb3ZlcndyaXRlcyB3aGVuIHRvIGRyYXdpbmcgdGhlIGVuZCBvZiBhCi0JYml0bWFwIHNjYW5saW5lLgotCShncmF5X2NvbnZlcnRfZ2x5cGgpOiBGaXggc3BlZWQtdXAuCi0KLTIwMDYtMDktMDQgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfY29udmVydF9nbHlwaHMpOiBNYWtlIGl0IHdvcmsgd2l0aAotCTY0Yml0IHByb2Nlc3NvcnMuCi0KLTIwMDYtMDktMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZGV2ZWwvZnRvcHRpb24uaDogU3luY2hyb25pemUgd2l0aAotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmguCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlY29yZF9jZWxsKTogUmVtb3ZlIHNoYWRvd2luZwotCXZhcmlhYmxlIGRlY2xhcmF0aW9uLgotCShncmF5X2NvbnZlcnRfZ2x5cGgpOiBGaXggY29tcGlsZXIgd2FybmluZ3MuCi0KLTIwMDYtMDktMDEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpOiBVcGRhdGUgdGhlIFRydWVUeXBlIGxvYWRlcgotCXRvIHJlY29nbml6ZSBhIGZldyBmb250cyB0aGF0IHJlcXVpcmUgdGhlIGF1dG9tYXRpYyB1bnBhdGVudGVkCi0JbG9hZGVyLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYzogT3B0aW1pemUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBhbnRpLWFsaWFzZWQKLQlyYXN0ZXJpemVyLiAgVGhlIHNwZWVkIGltcHJvdmVtZW50IGlzIGJldHdlZW4gMTUlIGFuZCAyNSUsIGRlcGVuZGluZwotCW9uIHRoZSBmb250IGRhdGEuCi0KLQkoR1JBWVNfVVNFX0dBTU1BLCBHUkFZU19DT01QQUNUKTogUmVtb3ZlZCwgYW5kIGFsbCBhc3NvY2lhdGVkIGNvZGUuCi0JKFRDZWxsKTogUmVkZWZpbmUuCi0JKFRSYXN0ZXIpOiBOZXcgbWVtYmVycyBgYnVmZmVyJywgYGJ1ZmZlcl9zaXplJywgYHljZWxscycsIGB5Y291bnQnLgotCShncmF5X2luaXRfY2VsbHMpOiBVcGRhdGVkLgotCShncmF5X2ZpbmRfY2VsbCwgZ3JheV9hbGxvY19jZWxsKTogTmV3IGZ1bmN0aW9ucy4KLQkoZ3JheV9yZWNvcmRfY2VsbCk6IFJld3JpdHRlbiB0byB1c2UgYGdyYXlfZmluZF9jZWxsJyBhbmQKLQlgZ3JheV9hbGxvY19jZWxsJy4KLQkoUEFDSywgTEVTU19USEFOLCBTV0FQX0NFTExTLCBERUJVR19TT1JULCBRVUlDS19TT1JULCBTSEVMTF9TT1JULAotCVFTT1JUX1RIUkVTSE9MRCk6Ci0JUmVtb3ZlZC4KLQkoZ3JheV9zaGVsbF9zb3J0LCBncmF5X3F1aWNrX3NvcnQsIGdyYXlfY2hlY2tfc29ydCwKLQlncmF5X2R1bXBfY2VsbHMpOiBSZW1vdmVkLgotCShncmF5X3N3ZWVwKTogUmV3cml0dGVuLgotCShncmF5X2NvbnZlcnRfZ2x5cGgpOiBSZXdyaXRlIGNvZGUgd2hpY2ggdXNlZCBvbmUgb2YgdGhlIHNvcnRpbmcKLQlmdW5jdGlvbnMuCi0JKGdyYXlfcmFzdGVyX3JlbmRlcik6IFVwZGF0ZWQuCi0KLTIwMDYtMDgtMjkgIERyLiBXZXJuZXIgRmluayAgPHdlcm5lckBzdXNlLmRlPgotCi0JKiBjb25maWd1cmU6IE1ha2UgaXQgcG9zc2libGUgdG8gaGFuZGxlIGNvbmZpZ3VyZSBvcHRpb25zIHdoaWNoCi0JaGF2ZSBzdHJpbmdzIGNvbnRhaW5pbmcgc3BhY2VzLgotCi0yMDA2LTA4LTI3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmggKFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUik6Ci0JTmV3IG1hY3JvLCBkZWZpbmVkIGlmIGVpdGhlciBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0Jb3IgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcgaXMgZGVmaW5lZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCwgc3JjL2Jhc2UvZnRjYWxjLmMsCi0Jc3JjL3RydWV0eXBlL3RydWV0eXBlLmMsIHNyYy90cnVldHlwZS90dGRyaXZlci5jLAotCXNyYy90cnVldHlwZS90dGdsb2FkLmMsIHNyYy90cnVldHlwZS90dGdsb2FkLmgsCi0Jc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMsIHNyYy90cnVldHlwZS90dG9ianMuYywKLQlzcmMvdHJ1ZXR5cGUvdHRvYmpzLmgsIHNyYy90cnVldHlwZS90dHBsb2FkLmMsIHNyYy90eXBlNDIvdDQyZHJpdnIuYzoKLQlzL1RUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIvVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfRmFjZV9JbnRlcm5hbFJlYyk6IE5ldwotCW1lbWJlciBgZm9yY2VfYXV0b2hpbnQnLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IFVzZSBgZm9yY2VfYXV0b2hpbnQnLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2ZhY2VfaW5pdCk6IFByZXBhcmUgY29kZSBmb3IgdGVzdGluZwotCWFnYWluc3QgYSBsaXN0IG9mIGZvbnQgbmFtZXMgd2hpY2ggbmVlZCB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuCi0KLTIwMDYtMDgtMjcgIEplbnMgQ2xhdWRpdXMgIDxqZW5zLmNsYXVkaXVzQHlhaG9vLmNvbT4KLQotCUZpeCBtaXNjZWxsYW5lb3VzIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oOiBDbG9zZSBjb21tZW50IHdpdGggYCovJyB0bwotCWF2b2lkIGAvKiBpbiBjb21tZW50JyBjb21waWxlciB3YXJuaW5nLgotCi0JKiBzcmMvYmFzZS9mdGRiZ21lbS5jIChmdF9tZW1fdGFibGVfZ2V0X3NvdXJjZSk6IFR1cm4gY2FzdAotCWAoRlRfVUludDMyKSh2b2lkKiknIGludG8gYChGVF9VSW50MzIpKEZUX1B0ckRpc3QpKHZvaWQqKScgc2luY2Ugb24KLQk2NC1iaXQgcGxhdGZvcm1zIHZvaWQqIGlzIGxhcmdlciB0aGFuIEZUX1VJbnQzMi4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKHRfdmFsaWRhdG9yX2Vycm9yKTogQ2FzdCBhd2F5Ci0Jdm9sYXRpbGVuZXNzIG9mIGFyZ3VtZW50IHRvIGZ0X2xvbmdqbXAuICBTcG90dGVkIGJ5IFdlcm5lcgotCWBQdXR6ZnJhdScgTGVtYmVyZy4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoYmRmX2xvYWRfZm9udCk6IEluaXRpYWxpemUgbG9jYWwKLQl2YXJpYWJsZSBgbGluZW5vJy4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9kLmMgKGNsYXNzaWNfa2Vybl92YWxpZGF0ZSk6IE1hcmsgbG9jYWwgdmFyaWFibGUKLQlgZXJyb3InIGFzIHZvbGF0aWxlLgotCi0yMDA2LTA4LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBTeW5jaHJvbml6ZSB3aXRoIG1haW4gZnRjb25maWcuaC4KLQlSZXBvcnRlZCBieSBKZW5zLgotCi0yMDA2LTA4LTIyICBKZW5zIENsYXVkaXVzICA8amVucy5jbGF1ZGl1c0B5YWhvby5jb20+Ci0KLQlGaXggZm9yIHByZXZpb3VzIGNvbW1pdCwgd2hpY2ggY2F1c2VkIG1hbnkgY29tcGlsZXIgd2FybmluZ3MvZXJyb3JzCi0JYWJvdXQgYWRkcmVzc2VzIG9mIHZvbGF0aWxlIG9iamVjdHMgcGFzc2VkIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcwotCW5vbi12b2xhdGlsZSBwb2ludGVycy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmg6IE1ha2UgRlRfVmFsaWRhdG9yIHR5cGVkZWYgYQotCXBvaW50ZXIgdG8gYSB2b2xhdGlsZSBvYmplY3QuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vZC5jIChneHZfbG9hZF90YWJsZSk6IE1ha2UgZnVuY3Rpb24gYXJndW1lbnQKLQlgdGFibGUnIGEgcG9pbnRlciB0byBhIHZvbGF0aWxlIG9iamVjdC4KLQotCSogc3JjL290dmFsaWQvb3R2bW9kLmMgKG90dl9sb2FkX3RhYmxlKTogTWFrZSBmdW5jdGlvbiBhcmd1bWVudAotCWB0YWJsZScgYSBwb2ludGVyIHRvIGEgdm9sYXRpbGUgb2JqZWN0LgotCi0yMDA2LTA4LTE4ICBKZW5zIENsYXVkaXVzICA8amVucy5jbGF1ZGl1c0B5YWhvby5jb20+Ci0KLQkqIHNyYy9neHZhbGlkL2d4dm1vZC5jIChHWFZfVEFCTEVfREVDTCk6IE1hcmsgbG9jYWwgdmFyaWFibGUgYF9zZm50JwotCWFzIHZvbGF0aWxlIHNpbmNlIGl0IG11c3Qga2VlcCBpdHMgdmFsdWUgYWNyb3NzIGEgY2FsbCB0byBmdF9zZXRqbXAuCi0JKGd4dl92YWxpZGF0ZSk6IFNhbWUgZm9yIGxvY2FsIHZhcmlhYmxlcyBgbWVtb3J5JyBhbmQgYHZhbGlkJy4KLQkoY2xhc3NpY19rZXJuX3ZhbGlkYXRlKTogU2FtZSBmb3IgbG9jYWwgdmFyaWFibGVzIGBtZW1vcnknLAotCWBja2VybicsIGFuZCBgdmFsaWQnLgotCi0JKiBzcmMvb3R2YWxpZC9vdHZtb2QuYyAob3R2X3ZhbGlkYXRlKTogU2FtZSBmb3IgZnVuY3Rpb24gcGFyYW1ldGVyCi0JYGZhY2UnIGFuZCBsb2NhbCB2YXJpYWJsZXMgYGJhc2UnLCBgZ2RlZicsIGBncG9zJywgYGdzdWInLCBganN0ZicsCi0JYW5kICd2YWxpZCcuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9mYWNlX2J1aWxkX2NtYXBzKTogU2FtZSBmb3IgbG9jYWwgdmFyaWFibGUKLQlgY21hcCcuCi0KLTIwMDYtMDgtMTYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfc2xvdF9sb2FkX2dseXBoKTogUmVtb3ZlIGNvbXBpbGVyCi0Jd2FybmluZ3MuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF92YWxpZGF0b3JfcnVuKTogRGlzYWJsZSBmdW5jdGlvbjsgaXQgaXMKLQlidWdneSBieSBkZXNpZ24uICBBbHdheXMgcmV0dXJuIC0xLgotCi0KLQlJbXByb3ZlbWVudHMgdG8gbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcuICBUaGlzIGlzIGEgZmlyc3QgdHJ5LAotCWNvbnRyb2xsZWQgYnkgdGhlIEZJWF9CWVRFQ09ERSBtYWNybyBpbiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oIChGVF9HbHlwaExvYWRSZWMpOiBBZGQgbWVtYmVyCi0JYGV4dHJhX3BvaW50czInLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfR2x5cGhab25lUmVjKTogQWRkIG1lbWJlcgotCWBvcnVzJy4KLQotCSogc3JjL2Jhc2UvZnRnbG9hZHIuYyAoRlRfR2x5cGhMb2FkZXJfUmVzZXQsCi0JRlRfR2x5cGhMb2FkZXJfQWRqdXN0X1BvaW50cywgRlRfR2x5cGhMb2FkZXJfQ3JlYXRlRXh0cmEsCi0JRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMsIEZUX0dseXBoTG9hZGVyX0NvcHlQb2ludHMpOiBVcGRhdGVkIHRvCi0JaGFuZGxlIGBleHRyYV9wb2ludHMyJy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfcHJlcGFyZV96b25lKTogSGFuZGxlIGBvcnVzJy4KLQlSZW1vdmUgY29tcGlsZXIgd2FybmluZy4KLQkoY3VyX3RvX2FyZyk6IFJlbW92ZSBtYWNyby4KLQkoVFRfSGludF9HbHlwaCk6IFVwZGF0ZWQuCi0JKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKTogSGFuZGxlIGBvcnVzJy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEZJWF9CWVRFQ09ERSk6IE5ldyBtYWNyby4KLQkoSW5zX01ELCBJbnNfTURSUCwgSW5zX0lQKSBbRklYX0JZVEVDT0RFXTogSGFuZGxlIGBvcnVzJy4KLQkoTE9DX0luc19JVVApOiBSZW5hbWVkIHRvLi4uCi0JKElVUF9Xb3JrZXJSZWMpOiBUaGlzLgotCUFkZCBgb3J1cycgbWVtYmVyLgotCShTaGlmdCk6IFJlbmFtZWQgdG8uLi4KLQkoX2l1cF93b3JrZXJfc2hpZnQpOiBUaGlzLgotCVVwZGF0ZWQuCi0JKEludGVycCk6IFJlbmFtZWQgdG8uLi4KLQkoX2l1cF93b3JrZXJfaW50ZXJwb2xhdGUpOiBUaGlzLgotCVVwZGF0ZWQgdG8gaGFuZGxlIGBvcnVzJy4KLQkoSW5zX0lVUCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZ2x5cGh6b25lX2RvbmUsIHR0X2dseXBoem9uZV9uZXcpOgotCUhhbmRsZSBgb3J1cycuCi0KLTIwMDYtMDgtMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIG1vZHVsZXMuY2ZnIChCQVNFX0VYVEVOU0lPTlMpOiBDb21waWxlIGluIGZ0Z3h2YWwuYyBieSBkZWZhdWx0IHRvCi0JYnVpbGQgZnR2YWxpZCBpbiBmdDJkZW1vcy4gIFRoaXMgaGFzIGJlZW4gaW5hZHZlcnRlbnRseSBjaGFuZ2VkCi0JMjAwNi0wOC0xMy4KLQotMjAwNi0wOC0xNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCWBmdF92YWxpZGF0b3JfcnVuJyB3cmFwcGluZyBgc2V0am1wJyBjYW4gY2F1c2UgYSBjcmFzaCwgYXMgZm91bmQgYnkKLQlKZW5zOgotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA2LTA4L21zZzAwMDA0Lmh0bS4KLQotCSogc3JjL290dmFsaWQvb3R2bW9kLmM6IFJlcGxhY2UgYGZ0X3ZhbGlkYXRvcl9ydW4nIGJ5IGBmdF9zZXRqbXAnLgotCUl0IHJldmVydHMgdGhlIGNoYW5nZSBpbnRyb2R1Y2VkIG9uIDIwMDUtMDgtMjAuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vZC5jOiBEaXR0by4KLQotMjAwNi0wOC0xMyAgSmVucyBDbGF1ZGl1cyAgPGplbnMuY2xhdWRpdXNAeWFob28uY29tPgotCi0JKiBmaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oOiAoVDFfVG9rZW5UeXBlKTogQWRkCi0JVDFfVE9LRU5fVFlQRV9LRVkuCi0JKFQxX0ZpZWxkUmVjKTogQWRkIGBkaWN0Jy4KLQkoVDFfRklFTERfRElDVF9GT05URElDVCwgVDFfRklFTERfRElDVF9QUklWQVRFKTogTmV3IG1hY3Jvcy4KLQkoVDFfTkVXX1hYWCwgVDFfRklFTERfWFhYKTogVXBkYXRlIHRvIHRha2UgdGhlIGRpY3Rpb25hcnkgd2hlcmUgYSBQUwotCWtleXdvcmQgaXMgZXhwZWN0ZWQgYXMgYW4gYWRkaXRpb25hbCBhcmd1bWVudC4KLQotCSogc3JjL2NpZC9jaWRsb2FkLmM6IChjaWRfZmllbGRfcmVjb3Jkcyk6IEFkanVzdCBpbnZvY2F0aW9ucyBvZgotCVQxX0ZJRUxEX1hYWC4KLQotCSogc3JjL2NpZC9jaWR0b2tlbi5oOiBBZGp1c3QgaW52b2NhdGlvbnMgb2YgVDFfRklFTERfWFhYLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmM6IEFkZCBtYWNybyBGVF9DT01QT05FTlQgZm9yIHRyYWNpbmcuCi0JKHBzX3BhcnNlcl90b190b2tlbik6IFJlcG9ydCBhIFBvc3RTY3JpcHQga2V5IGFzIFQxX1RPS0VOX1RZUEVfS0VZLAotCW5vdCBUMV9UT0tFTl9UWVBFX0FOWS4KLQkocHNfcGFyc2VyX2xvYWRfZmllbGQpOiBNYWtlIHN1cmUgYSB0b2tlbiB0aGF0IHNob3VsZCBiZSBhIHN0cmluZyBvcgotCW5hbWUgaXMgcmVhbGx5IGEgc3RyaW5nIG9yIG5hbWUuCi0JQXZvaWQgbWVtb3J5IGxlYWsgaWYgYSBrZXl3b3JkIGhhcyBiZWVuIGFscmVhZHkgZW5jb3VudGVyZWQgYW5kIGl0cwotCXZhbHVlIGlzIG92ZXJ3cml0dGVuLgotCSogc3JjL3R5cGUxL3QxbG9hZC5jOiAodDFfa2V5d29yZHMpOiBBZGp1c3QgaW52b2NhdGlvbnMgb2YKLQlUMV9GSUVMRF9YWFguCi0JKHBhcnNlX2RpY3QpOiBJZ25vcmUga2V5d29yZHMgdGhhdCBvY2N1ciBpbiB0aGUgd3JvbmcgZGljdGlvbmFyeQotCShlLmcuLCBpbiBgUHJpdmF0ZScgaW5zdGVhZCBvZiBgRm9udERpY3QnKS4KLQotCSogc3JjL3R5cGUxL3QxdG9rZW5zLmg6IEFkanVzdCBpbnZvY2F0aW9ucyBvZiBUMV9GSUVMRF9YWFguCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYzogKHQ0Ml9rZXl3b3Jkcyk6IEFkanVzdCBpbnZvY2F0aW9ucyBvZgotCVQxX0ZJRUxEX1hYWC4KLQotMjAwNi0wNy0xOCAgSmVucyBDbGF1ZGl1cyAgPGplbnMuY2xhdWRpdXNAeWFob28uY29tPgotCi0JTW92ZSBjcmVhdGlvbiBvZiBmaWVsZCBgYnVpbGRjaGFyJyBvZiBUMV9EZWNvZGVyUmVjIG91dCBvZgotCWB0MV9kZWNvZGVyX2luaXQnIGFuZCBsZXQgdGhlIGNhbGxlciBvZiBgdDFfZGVjb2Rlcl9pbml0JyB0YWtlIGNhcmUKLQlvZiBpdC4KLQotCUNhbGwgdGhlIGZpbmlzaGVyIGZvciBUMV9EZWNvZGVyIGluIGBjaWRfZmFjZV9jb21wdXRlX21heF9hZHZhbmNlJwotCWFuZCBgVDFfQ29tcHV0ZV9NYXhfQWR2YW5jZScuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoVDFfRGVjb2RlclJlYyk6IFJlbW92ZSBmaWVsZAotCWBmYWNlJywgYWRkIGBsZW5fYnVpbGRjaGFyJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggKFQxX0ZhY2VSZWMpOiBBZGQgZmllbGQKLQlgYnVpbGRjaGFyJy4KLQotCSogc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfZmFjZV9jb21wdXRlX21heF9hZHZhbmNlKTogQ2FsbCBmaW5pc2hlcgotCWZvciBUMV9EZWNvZGVyLgotCShjaWRfc2xvdF9sb2FkX2dseXBoKTogRG8gbm90IGlnbm9yZSBmYWlsdXJlIHdoZW4gaW5pdGlhbGl6aW5nIHRoZQotCVQxX0RlY29kZXIuCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogVXBkYXRlZC4KLQkodDFfZGVjb2Rlcl9pbml0KTogUmVtb3ZlIGluaXRpYWxpemF0aW9uIG9mIGZpZWxkcyBgYnVpbGRjaGFyJyBhbmQKLQlgbGVuX2J1aWxkY2hhcicuCi0JKHQxX2RlY29kZXJfZG9uZSk6IFJlbW92ZSBkZWFsbG9jYXRpb24gb2YgZmllbGQgYGJ1aWxkY2hhcicuCi0KLQkqIGZyZWV0eXBlL3NyYy90eXBlMS90MWdsb2FkLmMgKFQxX0NvbXB1dGVfTWF4X0FkdmFuY2UpOiBJbml0aWFsaXplCi0JVDFfRGVjb2RlcidzIGBidWlsZGNoYXInIGFuZCBgbGVuX2J1aWxkY2hhcic7IGNhbGwgZmluaXNoZXIgZm9yCi0JVDFfRGVjb2Rlci4KLQkoVDFfTG9hZF9HbHlwaCk6IEluaXRpYWxpemUgVDFfRGVjb2RlcidzIGBidWlsZGNoYXInIGFuZAotCWBsZW5fYnVpbGRjaGFyJzsgbWFrZSBzdXJlIHRvIGNhbGwgZmluaXNoZXIgZm9yIFQxX0RlY29kZXIgZXZlbiBpbgotCWNhc2Ugb2YgZXJyb3IuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfT3Blbl9GYWNlKTogQWxsb2NhdGUgbmV3IGZpZWxkIGBidWlsZGNoYXInCi0Jb2YgVDFfRmFjZVJlYy4KLQotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0RvbmUpOiBGcmVlIG5ldyBmaWVsZCBgYnVpbGRjaGFyJyBvZgotCVQxX0ZhY2VSZWMuCi0KLTIwMDYtMDctMTQgIEplbnMgQ2xhdWRpdXMgIDxqZW5zLmNsYXVkaXVzQHlhaG9vLmNvbT4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oOiBOZXcgbWFjcm9zIElTX1BTX05FV0xJTkUsCi0JSVNfUFNfU1BBQ0UsIElTX1BTX1NQRUNJQUwsIElTX1BTX0RFTElNLCBJU19QU19ESUdJVCwgSVNfUFNfWERJR0lULAotCWFuZCBJU19QU19CQVNFODUgKGZyb20gc3JjL3BzYXV4L3BzY29udi5oKS4KLQkoVDFfRmllbGRMb2NhdGlvbik6IEFkZCBUMV9GSUVMRF9MT0NBVElPTl9MT0FERVIsCi0JVDFfRklFTERfTE9DQVRJT05fRkFDRSwgYW5kIFQxX0ZJRUxEX0xPQ0FUSU9OX0JMRU5ELgotCShUMV9EZWNvZGVyUmVjKTogTmV3IGZpZWxkcyBgYnVpbGRjaGFyJyBhbmQgYGZhY2UnLgotCShJU19QU19UT0tFTik6IE5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggKFQxX0ZhY2VSZWMpOiBOZXcgZmllbGRzCi0JYG5kdl9pZHgnLCBgY2R2X2lkeCcsIGFuZCBgbGVuX2J1aWxkY2hhcicuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCAoUFNfQmxlbmRSZWMpOiBOZXcgZmllbGRzCi0JYGRlZmF1bHRfZGVzaWduX3ZlY3RvcicgYW5kIGBudW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yJy4KLQotCSogc3JjL3BzYXV4L3BzY29udi5oOiBNb3ZlIG1hY3JvcyBJU19QU19ORVdMSU5FLCBJU19QU19TUEFDRSwKLQlJU19QU19TUEVDSUFMLCBJU19QU19ERUxJTSwgSVNfUFNfRElHSVQsIElTX1BTX1hESUdJVCwgYW5kCi0JSVNfUFNfQkFTRTg1IHRvIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaC4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19wYXJzZXJfdG9fdG9rZW5fYXJyYXkpOiBBbGxvdyBgdG9rZW4nCi0JYXJndW1lbnQgdG8gYmUgTlVMTCBpZiB3ZSB3YW50IG9ubHkgdG8gY291bnQgdGhlIG51bWJlciBvZiB0b2tlbnMuCi0JKHBzX3RvY29vcmRhcnJheSk6IEFsbG93IGBjb29yZHMnIGFyZ3VtZW50IHRvIGJlIE5VTEwgaWYgd2UganVzdAotCXdhbnQgdG8gc2tpcCB0aGUgYXJyYXkuCi0JKHBzX3RvZml4ZWRhcnJheSk6IEFsbG93IGB2YWx1ZXMnIGFyZ3VtZW50IHRvIGJlIE5VTEwgaWYgd2UganVzdAotCXdhbnQgdG8gc2tpcCB0aGUgYXJyYXkuCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogQWRkIHN1cHBvcnQKLQlmb3IgKHBhcnRpYWxseSBjb21tZW50ZWQgb3V0KSBvdGhlcnN1YnJzIDE5LTI1LCAyNywgYW5kIDI4LgotCSh0MV9kZWNvZGVyX2luaXQpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMgYGZhY2UnIGFuZCBgYnVpbGRjaGFyJy4KLQkodDFfZGVjb2Rlcl9kb25lKTogUmVsZWFzZSBuZXcgZmllbGQgYGJ1aWxkY2hhcicuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfYnVpbGRjaGFyLCBwYXJzZV9wcml2YXRlKTogTmV3Ci0JZnVuY3Rpb25zLgotCSh0MV9rZXl3b3Jkcyk6IFJlZ2lzdGVyIHRoZW0uCi0JKHQxX2FsbG9jYXRlX2JsZW5kKTogVXBkYXRlZC4KLQkodDFfbG9hZF9rZXl3b3JkKTogSGFuZGxlIGZpZWxkIHR5cGVzIFQxX0ZJRUxEX0xPQ0FUSU9OX0xPQURFUiwKLQlUMV9GSUVMRF9MT0NBVElPTl9GQUNFIGFuZCBUMV9GSUVMRF9MT0NBVElPTl9CTEVORC4KLQkocGFyc2VfZGljdCk6IFJlbW92ZSBga2V5d29yZF9mbGFncycgYXJndW1lbnQuCi0JVXNlIG5ldyBtYWNybyBJU19QU19UT0tFTi4KLQlDaGFuZ2VkIGZ1bmN0aW9uIHNvIHRoYXQgbGF0ZXIgUG9zdFNjcmlwdCBkZWZpbml0aW9ucyBvdmVycmlkZQotCWVhcmxpZXIgb25lcy4KLQkodDFfaW5pdF9sb2FkZXIpOiBJbml0aWFsaXplIG5ldyBmaWVsZCBga2V5d29yZHNfZW5jb3VudGVyZWQnLgotCShUMV9PcGVuX0ZhY2UpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMgYG5kdl9pZHgnLCBgY2R2X2lkeCcsIGFuZAotCWBsZW5fYnVpbGRjaGFyJy4KLQlSZW1vdmUgYGtleXdvcmRzX2ZsYWdzJy4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5oIChUMV9Mb2FkZXJSZWMpOiBOZXcgZmllbGQKLQlga2V5d29yZHNfZW5jb3VudGVyZWQnLgotCShUMV9QUklWQVRFLCBUMV9GT05URElSX0FGVEVSX1BSSVZBVEUpOiBOZXcgbWFjcm9zLgotCi0JKiBzcmMvdHlwZTEvdDF0b2tlbnMuaCBbIVQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVF06IE5ldwotCWVudHJpZXMgZm9yIHBhcnNpbmcgL05EViwgL0NEViwgYW5kIC9EZXNpZ25WZWN0b3IuCi0KLTIwMDYtMDctMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBtYW55IGNoZWNrcyB0byBwcm90ZWN0IGFnYWluc3QgbWFsZm9ybWVkIFBDRiBmaWxlcy4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfRmFjZV9Eb25lKTogUHJvdGVjdCBhZ2FpbnN0IE5VTEwgcG9pbnRlcnMuCi0JKFBDRl9GYWNlX0luaXQpOiBBZGQgY2FsbHMgdG8gUENGX0ZhY2VfRG9uZSBpbiBjYXNlIG9mIGVycm9ycy4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9yZWFkX1RPQyk6IFByb3RlY3QgYWdhaW5zdCBtYWxmb3JtZWQgdGFibGUKLQlkYXRhIGFuZCBjaGVjayB0aGF0IHRhYmxlcyBkb24ndCBvdmVybGFwICh1c2luZyBhIHNpbXBsZQotCWJ1YmJsZXNvcnQpLgotCShQQ0ZfTUVUUklDX1NJWkUsIFBDRl9DT01QUkVTU0VEX01FVFJJQ19TSVpFLCBQQ0ZfUFJPUEVSVFlfU0laRSk6Ci0JTmV3IG1hY3JvcyB3aGljaCBnaXZlIHRoZSBzaXplIG9mIGRhdGEgc3RydWN0dXJlcyBpbiB0aGUgZGF0YQotCXN0cmVhbS4KLQkocGNmX2dldF9wcm9wZXJ0aWVzKTogVXNlIHJvdWdoIGVzdGltYXRlcyB0byBnZXQgYXJyYXkgc2l6ZSBsaW1pdHMuCi0JQXNzaWduIGBmYWNlLT5ucHJvcHMnIGFuZCBgZmFjZS0+cHJvcGVydGllcycgZWFybGllciBzbyB0aGF0IGEgY2FsbAotCXRvIFBDRl9GYWNlX0RvbmUgY2FuIGRvIHRoZSBjbGVhbi11cCBpbiBjYXNlIG9mIGVycm9yLgotCVByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIHN0cmluZyBvZmZzZXRzLgotCShwY2ZfZ2V0X21ldHJpY3MpOiBDbGVhbiB1cCBjb2RlLgotCUFkanVzdCB0cmFjaW5nIG1lc3NhZ2UgbGV2ZWxzLgotCVVzZSByb3VnaCBlc3RpbWF0ZSB0byBnZXQgYXJyYXkgc2l6ZSBsaW1pdC4KLQkocGNmX2dldF9iaXRtYXBzKTogQ2xlYW4gdXAgY29kZS4KLQlBZGp1c3QgdHJhY2luZyBtZXNzYWdlIGxldmVscy4KLQlVc2Ugcm91Z2ggZXN0aW1hdGVzIHRvIGdldCBvZmZzZXQgbGltaXRzLgotCShwY2ZfZ2V0X2VuY29kaW5ncyk6IEFkanVzdCB0cmFjaW5nIG1lc3NhZ2UgbGV2ZWwuCi0JKHBjZl9nZXRfYWNjZWwpOiBDbGVhbiB1cCBjb2RlLgotCi0yMDA2LTA2LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IEhhbmRsZSBmb250cyBjb3JyZWN0bHkgd2hpY2gKLQlkb24ndCBoYXZlIGEgUE9JTlRfU0laRSBwcm9wZXJ0eS4gIFRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMxNjkxNC4KLQotMjAwNi0wNi0yNiAgSmVucyBDbGF1ZGl1cyAgPGplbnMuY2xhdWRpdXNAeWFob28uY29tPgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAoVDFfT3BlcmF0b3IsIHQxX2FyZ3NfY291bnQpOiBBZGQgb3Bjb2RlIDE1LgotCSh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogT3BlcmF0b3Igd2l0aAotCW9wY29kZSAxNSBwb3BzIGl0cyB0d28gYXJndW1lbnRzLgotCUhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgcG9wcyBvZiBhbiBvdGhlcnN1YnIgbWF5IGJlIHBhcnQgb2YgYQotCXN1YnJvdXRpbmUuCi0JSGFuZGxlIHVua25vd24gb3RoZXJzdWJycyBncmFjZWZ1bGx5OiBjb3VudCB0aGVpciBvcGVyYW5kcyBhbmQgbGV0Ci0JdGhlIGZvbGxvd2luZyBwb3Agb3BlcmF0b3JzIHB1c2ggdGhlIG9wZXJhbmRzIGFzIHRoZSByZXN1bHRzIG9udG8KLQl0aGUgVHlwZTEgc3RhY2suCi0JSW1wcm92ZSBoYW5kbGluZyBvZiBzZXRjdXJyZW50cG9pbnQgb3Bjb2RlLgotCi0yMDA2LTA2LTI1ICBKZW5zIENsYXVkaXVzICA8amVucy5jbGF1ZGl1c0B5YWhvby5jb20+Ci0KLQlUaGUgVHlwZSAxIHBhcnNlciBub3cgc2tpcHMgb3ZlciB0b3AtbGV2ZWwgcHJvY2VkdXJlcyBhcyByZXF1aXJlZAotCWZvciBhIGBTaW1wbGlmaWVkIFBhcnNlcicuICBUaGlzIG1ha2VzIHRoZSBwYXJzZXIgbW9yZSByb2J1c3QgYXMgaXQKLQlkb2Vzbid0IHBva2UgYXJvdW5kIGluIFBvc3RTY3JpcHQgY29kZS4gIEFkZGl0aW9uYWxseSwgaXQgbWFrZXMgdGhlCi0JRm9udERpcmVjdG9yeSBoYWNrZXJ5IGluIHNyYy90eXBlMS90MWxvYWQuYyB1bm5lY2Vzc2FyeS4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChJU19PQ1RBTF9ESUdJVCk6IE5ldyBtYWNyby4KLQkoc2tpcF9saXRlcmFsX3N0cmluZyk6IEFkZCBGVF9FcnJvciBhcyByZXR1cm4gdmFsdWUuCi0JSGFuZGxlIGVzY2FwZXMgYmV0dGVyLgotCShza2lwX3N0cmluZyk6IEFkZCBGVF9FcnJvciBhcyByZXR1cm4gdmFsdWUuCi0JRG9uJ3Qgc2V0IGBwYXJzZXItPmVycm9yJyBidXQgcmV0dXJuIGVycm9yIGNvZGUgZGlyZWN0bHkuCi0JKHNraXBfcHJvY2VkdXJlKTogTmV3IGZ1bmN0aW9uLgotCShwc19wYXJzZXJfc2tpcF9QU190b2tlbik6IEhhbmRsZSBwcm9jZWR1cmVzLgotCVVwZGF0ZSBjb2RlLgotCShwc19wYXJzZXJfdG9fdG9rZW4pOiBVcGRhdGUgY29kZS4KLQkocHNfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUpOiBIYW5kbGUgYmJveCBlbnRyaWVzIGFsc28uCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZGljdCk6IFJlbW92ZSBGb250RGlyZWN0b3J5IGhhY2tlcnkuCi0JQWRkIGNvbW1lbnRlZC1vdXQgY29kZSBmb3Igc3ludGhldGljIGZvbnRzLgotCi0yMDA2LTA2LTI0ICBFdWdlbml5IE1lc2hjaGVyeWFrb3YgIDxldWdlbkB1bml2LmtpZXYudWE+Ci0KLQlGaXggdHdvIGhpbnRpbmcgYnVncyBhcyByZXBvcnRlZCBpbgotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA2LTA2L21zZzAwMDU3Lmh0bWwuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9HbHlwaFpvbmVSZWMpOiBBZGQKLQlgZmlyc3RfcG9pbnQnIG1lbWJlci4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfcHJlcGFyZV96b25lKTogSW5pdGlhbGl6ZQotCWBmaXJzdF9wb2ludCcuCi0JKFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0dseXBoKTogQWx3YXlzIHVudG91Y2ggcG9pbnRzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX1NIQyk6IEZpeCBjb21wdXRhdGlvbiBvZgotCWBmaXJzdF9wb2ludCcgYW5kIGBsYXN0X3BvaW50JyBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBnbHlwaHMuCi0JKEluc19JVVApOiBGaXggY29tcHV0YXRpb24gb2YgYGVuZF9wb2ludCcuCi0KLTIwMDYtMDYtMjIgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlJbnNlcnQgRW5kaWFuUzE2X0J0b04gYW5kIEVuZGlhblMzMl9CdG9OIGFzIHdvcmthcm91bmQgZm9yIEludGVsCi0JTWFjLiAgVGhlIG9yaWdpbmFsIHBhdGNoIHdhcyB3cml0dGVuIGJ5IERhdmlkIFNhY2hpdGFubyBhbmQgTGF3cmVuY2UKLQlDb29wZXQsIGFuZCBtb2RpZmllZCBieSBTZWFuIE1jQnJpZGUgZm9yIE1QVyBjb21wYXRpYmlsaXR5LiAgT25seQotCXJlcXVpcmVkIGRhdGEgYXJlIGNvbnZlcnRlZDsgdW51c2VkIGRhdGEgYXJlIGxlZnQgaW4gYmlnIGVuZGlhbi4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYzogSW5jbHVkZSA8RW5kaWFuLmg+IGZvciBieXRlb3JkZXIgbWFjcm9zIGZvciBub24KLQlNYWMgT1MgWCBwbGF0Zm9ybXMuCi0JKE9TX0lOTElORSk6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbml0aW9uLgotCShjb3VudF9mYWNlc19zZm50KTogSW5zZXJ0IEVuZGlhblMxNl9CdG9OIHRvIHBhcnNlIHRoZSBoZWFkZXIgb2YKLQlGb250QXNzb2NpYXRpb24gdGFibGUgaW4gRk9ORCByZXNvdXJjZS4KLQkoY291bnRfZmFjZXNfc2NhbGFibGUpOiBJbnNlcnQgRW5kaWFuUzE2X0J0b04gdG8gcGFyc2UgdGhlIGhlYWRlcgotCWFuZCBmb250U2l6ZSBhdCBlYWNoIGVudHJ5IG9mIEZvbnRBc3NvY2lhdGlvbiB0YWJsZSBpbiBGT05ECi0JcmVzb3VyY2UuCi0JKHBhcnNlX2ZvbmQpOiBJbnNlcnQgRW5kaWFuUzE2X0J0b04gYW5kIEVuZGlhblMzMl9CdG9OIHRvIHBhcnNlCi0JZmZTdHlsT2ZmIG9mIEZhbWlseVJlY29yZCBoZWFkZXIgb2YgRk9ORCByZXNvdXJjZSwgdGhlIGhlYWRlciwKLQlmb250U2l6ZSwgZm9udElEIGF0IGVhY2ggZW50cnkgb2YgRm9udEFzc29jaWF0aW9uIHRhYmxlLCBhbmQKLQlTdHlsZU1hcHBpbmcgdGFibGUuCi0JKGNvdW50X2ZhY2VzKTogQ2FsbCBgSFVubG9jaycgYWZ0ZXIgYWxsIEZPTkQgdXRpbGl6YXRpb24uCi0KLTIwMDYtMDYtMDggIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlQdWJsaWMgQVBJIG9mIFRydWVUeXBlR1gsIE9wZW5UeXBlLCBhbmQgY2xhc3NpYyBrZXJuIHRhYmxlIHZhbGlkYXRvcgotCXNob3VsZCByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHZhbGlkYXRpb24gc2VydmljZQotCWlzIHVuYXZhaWxhYmxlIChkaXNhYmxlZCBpbiBgbW9kdWxlcy5jZmcnKS4gIEl0IGlzIG9yaWdpbmFsbHkKLQlzdWdnZXN0ZWQgYnkgRGF2aWQgVHVybmVyLCBjZi4KLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAwNS0xMS9tc2cwMDA3OC5odG1sCi0KLQkqIHNyYy9iYXNlL2Z0Z3h2YWwuYyAoRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSk6IFJldHVybgotCUZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUgaWYgVHJ1ZVR5cGVHWCB2YWxpZGF0aW9uIHNlcnZpY2UgaXMKLQl1bmF2YWlsYWJsZS4KLQkoRlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUpOiBSZXR1cm4gRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZSBpZgotCWNsYXNzaWMga2VybiB0YWJsZSB2YWxpZGF0aW9uIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUuCi0KLQkqIHNyYy9iYXNlL2Z0b3R2YWwuYyAoRlRfT3BlblR5cGVfVmFsaWRhdGUpOiBSZXR1cm4KLQlGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlIGlmIE9wZW5UeXBlIHZhbGlkYXRpb24gc2VydmljZSBpcwotCXVuYXZhaWxhYmxlLgotCi0yMDA2LTA2LTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKGJkZl9sb2FkX2ZvbnQpOiBGaXggbWVtb3J5IGxlYWtzIGluIGNhc2Ugb2YKLQllcnJvcnMuCi0KLTIwMDYtMDYtMDcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL3R5cGUxL3QxYWZtLmMgKEtFUk5fSU5ERVgpOiBNYWtlIGl0IG1vcmUgcm9idXN0LgotCShUMV9SZWFkX01ldHJpY3MpOiBGaXggbWVtb3J5IGxlYWsgd2hpY2ggaGFwcGVuZWQgd2hlbiB0aGUgbWV0cmljcwotCWZpbGUgZG9lc24ndCBoYXZlIGtlcm5pbmcgcGFpcnMuICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMTY3NjguCi0KLTIwMDYtMDYtMDYgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCUZpeCBtZW1vcnkgbGVhayBkZXNjcmliZWQgaW4gU2F2YW5uYWggYnVnICMxNjc1OS4KLQotCVdlIGNoYW5nZSBgcHNfdW5pY29kZXNfaW5pdCcgc28gdGhhdCBpdCBhbHNvIHRha2VzIGEKLQlgZnJlZV9nbHlwaF9uYW1lJyBjYWxsYmFjayB0byByZWxlYXNlIHRoZSBnbHlwaCBuYW1lcyByZXR1cm5lZCBieQotCWBnZXRfZ2x5cGhfbmFtZScKLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oIChQU19HbHlwaF9OYW1lRnVuYyk6Ci0JUmVuYW1lZCB0byAuLi4KLQkoUFNfR2V0R2x5cGhOYW1lRnVuYyk6IFRoaXMuCi0JKFBTX0ZyZWVHbHlwaE5hbWVGdW5jKTogTmV3IHR5cGVkZWYuCi0JKFBTX1VuaWNvZGVzX0luaXRGdW5jKTogQWRkIHZhcmlhYmxlIGZvciBQU19GcmVlR2x5cGhOYW1lRnVuYy4KLQotCSogc3JjL2NmZi9jZmZjbWFwLmMgKGNmZl9zaWRfdG9fZ2x5cGhfbmFtZSk6IFVzZSBgVFRfRmFjZScgZm9yIGZpcnN0Ci0JYXJndW1lbnQuCi0JKGNmZl9zaWRfZnJlZV9nbHlwaF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfY21hcF91bmljb2RlX2luaXQpOiBVcGRhdGVkLgotCi0JKiBzcmMvcHNhdXgvdDFjbWFwLmMgKHQxX2NtYXBfdW5pY29kZV9pbml0KTogVXBkYXRlZC4KLQotCSogc3JjL3BzbmFtZXMvcHNtb2R1bGUuYyAocHNfdW5pY29kZXNfaW5pdCk6IEFkZCB2YXJpYWJsZSBmb3IKLQlQU19GcmVlR2x5cGhOYW1lRnVuYyBhbmQgdXNlIGl0LgotCi0KLTIwMDYtMDYtMDQgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLQotCSogc3JjL2Jhc2UvZnR1dGlsLmMgKGZ0X21lbV9xcmVhbGxvYyk6IEZpeCB0aGUgZnVuY3Rpb24gdG8gYWNjZXB0Ci0JYGl0ZW1fc2l6ZSA9PSAwJyBhcyB3ZWxsIC0tIHRob3VnaCB0aGlzIHNvdW5kcyB3ZWlyZCwgaXQgY2FuCi0JdGhlb3JldGljYWxseSBoYXBwZW4uICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMTY2NjkuCi0KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfZmFjZV9pbml0KTogRml4IHRoZSBjb21wdXRhdGlvbgotCW9mIGBmYWNlLT5udW1fZ2x5cGhzJyB3aGljaCBtaXNzZWQgdGhlIGxhc3QgZ2x5cGgsIGR1ZSB0bwotCXRoZSBvZmZzZXQtYnktMSBjb21wdXRhdGlvbiwgc2luY2UgdGhlIFBGUiBmb3JtYXQgZG9lc24ndAotCWd1YXJhbnRlZSB0aGF0IGdseXBoIGluZGV4IDAgY29ycmVzcG9uZHMgdG8gdGhlIGBtaXNzaW5nCi0JZ2x5cGguICBUaGlzIGZpeGVzIFNhdmFubmFoIGJ1ZyAjMTY2NjguCi0KLTIwMDYtMDUtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvdW5peC1jYy5pbiAoTElOS19MSUJSQVJZKTogRG9uJ3QgY29tbWVudCBvdXQKLQlgLW5vLXVuZGVmaW5lZCcuICBSZXBvcnRlZCBieSBDaHJpc3RpYW4gQmllc2luZ2VyLgotCi0yMDA2LTA1LTE5ICBCcmlhbiBXZWVkICA8YndAaW1hZ2luZW5naW5lLmNvbT4KLQotCSogYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwOiBSZWxlYXNlIGxpYnJhcmllcyBubyBsb25nZXIKLQloYXZlIGRlYnVnIGluZm9ybWF0aW9uLCBhbmQgZGVidWcgbGlicmFyaWVzIHVzZSBgQzcgY29tcGF0aWJsZScKLQlkZWJ1ZyBpbmZvLgotCi0yMDA2LTA1LTE5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JQXBwbHkgcGF0Y2ggYnkgRGVyZWsgQ2xlZ2cgdG8gZml4IHR3byBtZW1vcnkgbGVha3MgaW4gdGhlIE1hY09TCi0JcmVzb3VyY2UgZm9yayBoYW5kbGVyLiAgVGhpcyBmaXhlcyBTYXZhbm5haCBidWcgIzE2NjMxLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAobG9hZF9mYWNlX2luX2VtYmVkZGVkX3Jmb3JrKTogUmVwbGFjZQotCWBGVF9TdHJlYW1fQ2xvc2UnIGJ5IGBGVF9TdHJlYW1fRnJlZScgdG8gZml4IG1lbW9yeSBsZWFrLgotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKHJhY2Nlc3NfZ3Vlc3NfbGludXhfZG91YmxlX2Zyb21fZmlsZV9uYW1lKToKLQlSZXBsYWNlIGBGVF9TdHJlYW1fQ2xvc2UnIGJ5IGBGVF9TdHJlYW1fRnJlZScgdG8gZml4IG1lbW9yeSBsZWFrLgotCi0yMDA2LTA1LTE5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBidWlsZC91bml4L2NvbmZpZ3VyZS5yYXc6IEFkZCBhIGZhbGxiYWNrIHRvIGRpc2FibGUgQ2FyYm9uCi0JZGVwZW5kZW5jeSwgaWYgY29uZmlndXJlZCB3aXRoIG5vIG9wdGlvbnMgb24gTWFjIE9TIFguCi0KLTIwMDYtMDUtMTkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0bWFjLmMgKG9wZW5fZmFjZV9mcm9tX2J1ZmZlcik6IERlYWxsb2NhdGUgc3RyZWFtIHdoZW4KLQlpdHMgY29udGVudCBjYW5ub3QgYmUgcGFyc2VkIGFzIHN1cHBvcnRlZCBmb250LiAgVGhpcyBmaXhlcwotCXRoZSBzZWNvbmQgcGFydCBvZiBTYXZhbm5haCBidWcgIzE2NTkwLgotCi0yMDA2LTA1LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfQ29tcG9zaXRlX0dseXBoKQotCVtUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSXTogTWFrZSBpdCBjb21waWxhYmxlIGFnYWluLgotCi0yMDA2LTA1LTE3ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0KLQlUaGlzIGlzIGEgbWFqb3IgcGF0Y2ggdXNlZCB0byBkcmFzdGljYWxseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZgotCWxvYWRpbmcgZ2x5cGhzLiAgVGhpcyBib3RoIHNwZWVkcyB1cCBsb2FkaW5nIHRoZSBnbHlwaCB2ZWN0b3JzCi0JdGhlbXNlbHZlcyBhbmQgdGhlIGF1dG8tZml0dGVyIG1vZHVsZS4KLQotCVdlIG5vdyB1c2UgaW5saW5lIGFzc2VtYmxlciBjb2RlIHdpdGggR0NDIHRvIGltcGxlbWVudCBgRlRfTXVsRml4JywKLQl3aGljaCBpcyBwcm9iYWJseSB0aGUgbW9zdCBpbXBvcnRhbnQgZnVuY3Rpb24gcmVsYXRlZCB0byB0aGUKLQllbmdpbmUncyBwZXJmb3JtYW5jZS4KLQotCVRoZSByZXN1bHRpbmcgc3BlZWQtdXAgaXMgYWJvdXQgMjUlLgotCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9Mb2FkZXJSZWMpOiBBZGQgZmllbGRzCi0JYGN1cnNvcicgYW5kIGBsaW1pdCcuCi0KLQkqIHNyYy9hdXRvZml0L2FmYW5nbGVzLmMgKGFmX2Nvcm5lcl9pc19mbGF0LCBhZl9jb3JuZXJfb3JpZW50YXRpb24pOgotCU5ldyBmdW5jdGlvbnMuCi0JKEFGX0FUQU5fQklUUywgYWZfYXJjdGFuLCBhZl9hbmdsZV9hdGFuKTogQ29tbWVudCBvdXQuCi0JW1RFU1RdOiBSZW1vdmUuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKEFGX1NjcmlwdF9VbmlSYW5nZVJlYyk6IENvbW1lbnQgb3V0IHRlc3QKLQljb2RlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2F4aXNfaGludHNfbmV3X3NlZ21lbnQpOiBEb24ndCBjYWxsCi0JYEZUX1pFUk8nCi0JKGFmX2RpcmVjdGlvbl9jb21wdXRlLCBhZl9nbHlwaF9oaW50c19jb21wdXRlX2luZmxlY3Rpb25zKTogUmV3cml0dGVuLgotCShhZl9nbHlwaF9oaW50c19yZWxvYWQ6IFJld3JpdGUgcmVjb2duaXRpb24gb2Ygd2VhayBwb2ludHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyk6IE1vdmUKLQljb25zdGFudCB2YWx1ZXMgb3V0IG9mIHRoZSBsb29wcy4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oOiBVcGRhdGVkLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRml4KTogVXNlIGlubGluZSBhc3NlbWJsZXIgY29kZS4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbik6IFVzZSB2ZWN0b3IKLQlwcm9kdWN0IHRvIGdldCBvcmllbnRhdGlvbi4KLQotCSogc3JjL2d6aXAvZnRnemlwLmMgKGZ0X2dldF91bmNvbXByZXNzZWRfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoRlRfU3RyZWFtX09wZW5HemlwKTogVXNlIGl0IHRvIGhhbmRsZSBzbWFsbCBmaWxlcyBkaXJlY3RseSBpbgotCW1lbW9yeS4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jIChQU19Db252X0FTQ0lJSGV4RGVjb2RlLCBQU19Db252X0VleGVjRGVjb2RlKToKLQlJbXByb3ZlIHBlcmZvcm1hbmNlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9BY2Nlc3NfR2x5cGhfRnJhbWUpOiBTZXQgYGN1cnNvcicgYW5kCi0JYGxpbWl0Jy4KLQotCShUVF9Mb2FkX0dseXBoX0hlYWRlciwgVFRfTG9hZF9TaW1wbGVfR2x5cGgsCi0JVFRfTG9hZF9Db21wb3NpdGVfR2x5cGgpOiBVcGRhdGVkLiAgQWRkIHRocmVzaG9sZCB0byBwcm90ZWN0IGFnYWluc3QKLQlleGNlZWRpbmdseSBsYXJnZSB2YWx1ZXMgb2YgbnVtYmVyIG9mIGNvbnRvdXJzLiAgU3BlZWQgdXAgYnkKLQlyZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGxvb3BzLgotCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9Mb2FkX0dseXBoKTogRG9uJ3QgYXBwbHkgdW5pdCBtYXRyaXguCi0KLQotCSogc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoRlRDX0NNYXBDYWNoZV9Mb29rdXApOiBDaGFuZ2UgdGhlIHRocmVzaG9sZAotCXVzZWQgdG8gZGV0ZWN0IHJvZ3VlIGNsaWVudHMgZnJvbSA0IHRvIDE2LiAgVGhpcyBpcyB0byBwcmV2ZW50IHNvbWUKLQlzZWdtZW50YXRpb24gZmF1bHRzIHdpdGggZm9udHMgbGlrZSBgS296TWluUHJvVkktUmVndWxhci5vdGYnIHdoaWNoCi0JY29tZXMgZnJvbSB0aGUgSmFwYW5lc2UgQWRvYmUgUmVhZGVyIEFzaWFuIEZvbnQgcGFjay4KLQotMjAwNy0wNS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2ZvbnRfZG9uZSk6IERlYWxsb2NhdGUgc3ViZm9udCBhcnJheS4gIFRoaXMKLQlmaXhlcyB0aGUgZmlyc3QgcGFydCBvZiBTYXZhbm5haCBidWcgIzE2NTkwLgotCi0yMDA2LTA1LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvUFJPQkxFTVM6IFVwZGF0ZWQgaWNsIGlzc3Vlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAwNi0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi1hbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi1MSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLWZ1bGx5LgotCi0KLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLWNvZGluZzogdXRmLTgKLUVuZDoKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yNCBiL0NoYW5nZUxvZy4yNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2NzYzYy4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cuMjQKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYwICswLDAgQEAKLTIwMTMtMDUtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjQuMTIgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNC0xMicuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi40LjEyLgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksCi0JYnVpbGRzL3dpbjMyL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDUvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwOC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAxMC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwgYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi40LjExLzIuNC4xMi8sIHMvMjQxMS8yNDEyLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxMi4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDE2OjE6MTAuCi0KLTIwMTMtMDUtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDEzLTA1LTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0pOiBUeXBvLgotCi0yMDEzLTA1LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlTeW5jaHJvbml6ZSBgZnRjb25maWcuaCcuCi0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBVcGRhdGVkLgotCi0yMDEzLTA1LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsYXRpb24gd2l0aCBDKysuCi0KLQkqIHNyYy9iYXNlL21kNS5jIChib2R5KTogVXNlIHByb3BlciBjYXN0LgotCi0yMDEzLTA1LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggNjRiaXQgY29tcGlsYXRpb24gaXNzdWVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIFtGVF9MT05HNjRdOiBUeXBlZGVmCi0JYEZUX0ludDY0JyBoZXJlLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYzogUmVtb3ZlIHR5cGVkZWYgb2YgYEZUX0ludDY0Jy4KLQkoRlRfRGl2Rml4KTogRml4IGNhc3QuCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jOiBSZW1vdmUgdHlwZWRlZiBvZiBgRlRfSW50NjQnLgotCi0yMDEzLTA1LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcmFzdGVyXSBGaXggY2xhbmcgaXNzdWVzLgotCi0JRml4IHN1Z2dlc3RlZCBieSA8b2N0b3Bsb2lkQHlhbmRleC5jb20+LgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKFVMb25nKTogTmV3IHR5cGVkZWYuCi0JKFNDQUxFRCk6IEFkZCBwcm9wZXIgY2FzdC4KLQotMjAxMy0wNS0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGNsYW5nIGZpeGVzLgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChmdF90cmlnX3ByZW5vcm0sIEZUX1ZlY3Rvcl9Sb3RhdGUpOiBVc2UKLQljb3JyZWN0IHR5cGVzLgotCi0JKiBzcmMvY2ZmL2NmMmludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxkZWZhdWx0PjogRm9yY2UKLQl1bnNpZ25lZCBmb3IgY29tcHV0YXRpb25zLgotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IERpdHRvLgotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfaW50ZWdlcik6IERpdHRvLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IERpdHRvLgotCi0yMDEzLTA1LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBNYWtlIEFkb2JlIENGRiBlbmdpbmUgd29yayBjb3JyZWN0bHkgb24gNjRiaXQgaG9zdHMuCi0KLQlSZXBvcnRlZCBieSBudW1lcm91cyBwZW9wbGUgb24gdGhlIGBmcmVldHlwZS1kZXZlbCcgbGlzdC4gIFdpdGhvdXQKLQl0aGlzIGZpeCwgZ2x5cGhzIGFyZW4ndCBwcm9wZXJseSBhbGlnbmVkIG9uIGEgY29tbW9uIGJhc2VsaW5lLgotCi0JT24gNjRiaXQgc3lzdGVtcywgYEZUX1BvcycgZXhwYW5kcyB0byBgbG9uZyBpbnQnLCBoYXZpbmcgYSB3aWR0aCBvZgotCTY0Yml0LiAgYENGMl9GaXhlZCcgZXhwYW5kcyB0byBgaW50JyB3aGljaCBpcyBub3JtYWxseSAzMmJpdCB3aWRlIG9uCi0JNjRiaXQgaG9zdHMgYWxzby4gIFdyb25nIGNhc3RzIGZpbGxlZCB1cCB0aGUgYmx1ZXMgYXJyYXlzIHdpdGgKLQlpbmNvcnJlY3QgdmFsdWVzLiAgTm90ZSB0aGF0IGFsbCBibHVlcyB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHdpdGggdGhlCi0JYGNmMl9ibHVlVG9GaXhlZCcgbWFjcm8gd2hpY2ggaGFuZGxlcyB0aGUgNjRiaXQgdG8gMzJiaXQgY29udmVyc2lvbi4KLQotCSogc3JjL2NmZi9jZjJmdC5oIChjZjJfZ2V0Qmx1ZVZhbHVlcywgY2YyX2dldE90aGVyQmx1ZXMsCi0JY2YyX2dldEZhbWlseUJsdWVzLCBjZjJfZ2V0RmFtaWx5T3RoZXJCbHVlcyk6IFVzZSBgRlRfUG9zJyBmb3IKLQlgZGF0YScsIG5vdCBgQ0YyX0ZpeGVkJy4KLQkqIHNyYy9jZmYvY2YyZnQuYyAoY2YyX2dldEJsdWVWYWx1ZXMsIGNmMl9nZXRPdGhlckJsdWVzLAotCWNmMl9nZXRGYW1pbHlCbHVlcywgY2YyX2dldEZhbWlseU90aGVyQmx1ZXMpOiBVcGRhdGVkLgotCSogc3JjL2NmZi9jZjJibHVlcy5jIChjZjJfYmx1ZXNfaW5pdCk6IFVwZGF0ZWQuCi0KLTIwMTMtMDUtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1vcmUgZml4ZXMgZm9yIGNsYW5nJ3MgYHNhbml0aXplJyBmZWF0dXJlLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfRGl2Rml4KTogVXNlIHVuc2lnbmVkIHZhbHVlcyBmb3IKLQljb21wdXRhdGlvbnMgd2hpY2ggdXNlIHRoZSBsZWZ0IHNoaWZ0IG9wZXJhdG9yIGFuZCBjb252ZXJ0IHRvIHNpZ25lZAotCWFzIHRoZSBsYXN0IHN0ZXAuCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChmdF90cmlnX3ByZW5vcm0sIEZUX1ZlY3Rvcl9Sb3RhdGUsCi0JRlRfVmVjdG9yX0xlbmd0aCwgRlRfVmVjdG9yX1BvbGFyaXplKTogRGl0dG8uCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBTaW1wbGlmeS4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfc3ViZm9udF9sb2FkKTogRml4IGNvbnN0YW50LgotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfaW50ZWdlciwgY2ZmX3BhcnNlX3JlYWwsIGRvX2ZpeGVkLAotCWNmZl9wYXJzZV9maXhlZF9keW5hbWljKTogVXNlIHVuc2lnbmVkIHZhbHVlcyBmb3IgY29tcHV0YXRpb25zIHdoaWNoCi0JdXNlIHRoZSBsZWZ0IHNoaWZ0IG9wZXJhdG9yIGFuZCBjb252ZXJ0IHRvIHNpZ25lZCBhcyB0aGUgbGFzdCBzdGVwLgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAoY2lkX2dldF9vZmZzZXQpOiBEaXR0by4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jIChQU19Db252X1RvRml4ZWQpOiBEaXR0by4KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogRGl0dG8uCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9NdWxGaXgxNCwgVFRfRG90Rml4MTQpOiBEaXR0by4KLQotMjAxMy0wNS0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGVycm9ycyByZXBvcnRlZCBieSBjbGFuZydzIGBzYW5pdGl6ZScgZmVhdHVyZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oOiBTaW1wbGlmeSBhbmQgZml4IGludGVnZXIKLQlleHRyYWN0aW9uIG1hY3Jvcy4KLQkoRlRfSU5UOF8sIEZUX0JZVEVfSTE2LCBGVF9CWVRFX0kzMiwgRlRfSU5UOF9JMTYsIEZUX0lOVDhfSTMyLAotCUZUX0lOVDhfSTMyLCBGVF9JTlQ4X1UzMik6IFJlbW92ZWQuCi0JKEZUX1BFRUtfU0hPUlQsIEZUX1BFRUtfTE9ORywgRlRfUEVFS19PRkYzLCBGVF9QRUVLX1NIT1JUX0xFLAotCUZUX1BFRUtfTE9OR19MRSwgRlRfUEVFS19PRkYzX0xFKTogVXNlIHVuc2lnbmVkIHZhbHVlcyBmb3IKLQljb21wdXRhdGlvbnMgYW5kIGNvbnZlcnQgdG8gc2lnbmVkIGFzIHRoZSBsYXN0IHN0ZXAuCi0KLQkqIHNyYy9jZmYvY2YyZml4ZWQuaCAoY2YyX2ludFRvRml4ZWQsIGNmMl9maXhlZFRvSW50LAotCWNmMl9mcmFjVG9GaXhlZCk6IEF2b2lkIHNoaWZ0cyBvZiBuZWdhdGl2ZSB2YWx1ZXMuCi0JKGNmMl9pbnRUb0ZyYWMsIGNmMl9maXhlZFRvRnJhYywgY2YyX2ZpeGVkVG8yNkRvdDYpOiBSZW1vdmVkLAotCXVudXNlZC4KLQotCSogc3JjL2NmZi9jZjJpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8Y2YyX2NtZEVYVEVOREVETk1CUiwKLQlkZWZhdWx0PjogVXNlIHVuc2lnbmVkIHZhbHVlcyBmb3IgY29tcHV0YXRpb25zIGFuZCBjb252ZXJ0IHRvIHNpZ25lZAotCWFzIHRoZSBsYXN0IHN0ZXAuCi0JVXNlIHByb3BlciB0eXBlcyBpbiB0cmFjaW5nIG1lc3NhZ2VzLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogVXNlIHVuc2lnbmVkCi0JdmFsdWVzIGZvciBjb21wdXRhdGlvbiBvZiBvcGVyYW5kcyBhbmQgY29udmVydCB0byBzaWduZWQgYXMgdGhlIGxhc3QKLQlzdGVwLgotCVVzZSBwcm9wZXIgdHlwZSBpbiB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMTMtMDUtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZjJibHVlcy5jOiBSZW1vdmUgZGVhZCBjb2RlLgotCi0yMDEzLTA1LTAyICBDaHJpcyBMaWRkZWxsICA8Y2hyaXMubGlkZGVsbEBhcnRpZmV4LmNvbT4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jOiBJbmNsdWRlIEZUX0NGRl9EUklWRVJfSC4KLQotMjAxMy0wNC0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0JKiBSRUFETUU6IEltcHJvdmVkLgotCi0yMDEzLTA0LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBBZGQgYSBuZXcgVHlwZSAyIGludGVycHJldGVyIGFuZCBoaW50ZXIuCi0KLQlUaGlzIHdvcmssIHdyaXR0ZW4gYnkgRGF2ZSBBcm5vbGQgPGRhcm5vbGRAYWRvYmUuY29tPiBhbmQgZnVsbHkKLQlpbnRlZ3JhdGVkIGludG8gRnJlZVR5cGUgYnkgbWUsIGlzIGEgZG9uYXRpb24gYnkgQWRvYmUgaW4KLQljb2xsYWJvcmF0aW9uIHdpdGggR29vZ2xlLiAgSXQgaXMgdmFzdGx5IHN1cGVyaW9yIHRvIHRoZSBvbGQgQ0ZGCi0JZW5naW5lLCBhbmQgaXQgd2lsbCByZXBsYWNlIGl0IHNvb24uICBSaWdodCBub3csIGl0IGlzIHN0aWxsIG9mZiBieQotCWRlZmF1bHQsIGFuZCB5b3UgaGF2ZSB0byBleHBsaWNpdGx5IHNlbGVjdCBpdCB1c2luZyB0aGUgbmV3Ci0JYGhpbnRpbmctZW5naW5lJyBwcm9wZXJ0eSBvZiB0aGUgY2ZmIGRyaXZlci4KLQotCUZvciBjb252ZW5pZW5jZSwgKG1vc3Qgb2YpIHRoZSBuZXcgZmlsZXMgYXJlIGNvbW1pdHRlZCBzZXBhcmF0ZWx5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9DRkZfRFJJVkVSX0gpOiBOZXcgbWFjcm8uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2ZmZHJ2Lmg6IE5ldyBmaWxlIHRvIGFjY2VzcyBDRkYgZHJpdmVyCi0JcHJvcGVydGllcy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaCAoRlRfRXJyX0dseXBoX1Rvb19CaWcpOiBOZXcgZXJyb3IKLQljb2RlLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IEFkZCBgY2YyYmx1ZXMnLCBgY2YyaGludHMnLAotCWFuZCBgY2YyaW50ZXJwJy4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5oIChDRkZfU3ViRm9udCk6IE5ldyBtZW1iZXIgYGN1cnJlbnRfc3ViZm9udCcuCi0JKiBzcmMvY2ZmL2NmZm9ianMuaCAoQ0ZGX0RyaXZlclJlYyk6IE5ldyBtZW1iZXJzIGBoaW50aW5nX2VuZ2luZScKLQlhbmQgYG5vX3N0ZW1fZGFya2VuaW5nJy4KLQkqIHNyYy9jZmYvY2ZmdHlwZXMuaCAoQ0ZGX0ZvbnRSZWMpOiBOZXcgbWVtYmVyIGBjZjJfaW5zdGFuY2UnLgotCi0JKiBzcmMvY2ZmL2NmZi5jOiBJbmNsdWRlIG5ldyBmaWxlcy4KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3Byb3BlcnR5X3NldCwgY2ZmX3Byb3BlcnR5X2dldCk6IEhhbmRsZQotCWBoaW50aW5nLWVuZ2luZScgYW5kIGBuby1zdGVtLWRhcmtlbmluZycgcHJvcGVydGllcyAob25seSB0aGUgQWRvYmUKLQllbmdpbmUgbGlzdGVucyB0byB0aGVtKS4KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYzogSW5jbHVkZSBgY2YyZnQuaCcuCi0JKGNmZl9kZWNvZGVyX3ByZXBhcmUpOiBJbml0aWFsaXplIGBjdXJyZW50X3N1YmZvbnQnLgotCShjZmZfYnVpbGRfYWRkX3BvaW50KTogSGFuZGxlIEFkb2JlIGVuZ2luZSB3aGljaCB1c2VzIDE2LjE2Ci0JY29vcmRpbmF0ZXMuCi0JKGNmZl9zbG90X2xvYWQpOiBIYW5kbGUgRlRfTE9BRF9OT19TQ0FMRSBhbmQgRlRfTE9BRF9OT19ISU5USU5HCi0Jc2VwYXJhdGVseS4KLQlDaG9vc2UgcmVuZGVyaW5nIGVuZ2luZSBiYXNlZCBvbiBgaGludGluZ19lbmdpbmUnIHByb3BlcnR5LgotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2RvbmUpOiBDYWxsIGZpbmFsaXplciBvZiB0aGUgQWRvYmUKLQllbmdpbmUuCi0JKiBzcmMvY2ZmL2NmZm9ianMuYzogSW5jbHVkZSBGVF9DRkZfRFJJVkVSX0guCi0JKGNmZl9kcml2ZXJfaW5pdCk6IFNldCBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcy4KLQotCSogc3JjL2NmZi9ydWxlcy5tayAoQ0ZGX0RSVl9TUkMsIENGRl9EUlZfSCk6IEFkZCBuZXcgZmlsZXMuCi0KLQkqIHNyYy9jZmYvY2YyKi4qOiBOZXcgZmlsZXMsIGNvbnRhaW5pbmcgdGhlIEFkb2JlIGVuZ2luZS4KLQotMjAxMy0wNC0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gTWlub3IgY29kZSBhZG1pbmlzdHJhdGlvbiBpc3N1ZXMuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2hlY2tfcG9pbnRzKTogUmVuYW1lIHRvLi4uCi0JKGNmZl9jaGVja19wb2ludHMpOiAuLi50aGlzIGFuZCBtYWtlIGl0IEZUX0xPQ0FMLgotCShjZmZfYnVpbGRlcl9hZGRfcG9pbnQsIGNmZl9idWlsZGVyX2FkZF9wb2ludDEsCi0JY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQsIGNmZl9idWlsZGVyX2Nsb3NlX2NvbnRvdXIsCi0JY2ZmX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSwgY2ZmX2dldF9nbHlwaF9kYXRhLAotCWNmZl9mcmVlX2dseXBoX2RhdGEpOiBNYWtlIHRoZW0gRlRfTE9DQUwuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuaDogVXBkYXRlZC4KLQotMjAxMy0wNC0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkIG91dHB1dCBiaXRtYXAgY2hlY2tzdW1zLgotCi0JVXNlIGBGVDJfREVCVUc9Yml0bWFwOjMnIGZvciB0cmFjaW5nLgotCi0JKiBzcmMvYmFzZS9tZDUuYywgc3JjL2Jhc2UvbWQ1Lmg6IE5ldyBmaWxlcywgdGFrZW4gZnJvbQotCi0JICBodHRwOi8vb3BlbndhbGwuaW5mby93aWtpL3Blb3BsZS9zb2xhci9zb2Z0d2FyZS9wdWJsaWMtZG9tYWluLXNvdXJjZS1jb2RlL21kNQotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogQWRkIGBiaXRtYXAnLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyBbRlRfREVCVUdfTEVWRUxfVFJBQ0VdOiBJbmNsdWRlIGBtZDUuYycKLQotCShGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwpIFtGVF9ERUJVR19MRVZFTF9UUkFDRV06IEZvciB0cmFjaW5nLAotCWNvbnZlcnQgcmVzdWx0aW5nIGJpdG1hcCB0byBhIHVuaWZvcm0gZm9ybWF0IGFuZCBjb21wdXRlIGEgY2hlY2tzdW0uCi0JVXNlIGBiaXRtYXAnIGNhdGVnb3J5IGZvciB0aGUgdHJhY2luZyBtZXNzYWdlLgotCi0JKiBzcmMvYmFzZS9ydWxlcy5tayAoQkFTRV9IKTogVXBkYXRlZC4KLQotCSogZG9jcy9MSUNFTlNFLlRYVDogVXBkYXRlZC4KLQotMjAxMy0wNC0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gQWRkIGZyYW1ld29yayBmb3IgQ0ZGIHByb3BlcnRpZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzcpOgotCU5ldyBtYWNyby4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ILgotCShjZmZfcHJvcGVydHlfc2V0LCBjZmZfcHJvcGVydHlfZ2V0KTogTmV3IGZ1bmN0aW9ucywgc3RpbGwgZW1wdHkuCi0JRGVmaW5lIGBjZmZfc2VydmljZV9wcm9wZXJ0aWVzJyBzZXJ2aWNlLgotCVVwZGF0ZSBgY2ZmX3NlcnZpY2VzJy4KLQotCSogc3JjL2NmZi9jZmZwaWMuaDogSW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSC4KLQkoQ0ZGX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQpOiBOZXcgbWFjcm8uCi0JKENmZk1vZHVsZVBJQyk6IEFkZCBgY2ZmX3NlcnZpY2VfcHJvcGVydGllcycuCi0KLTIwMTMtMDQtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGZdIEZpeCBTYXZhbm5haCBidWcgIzM4NTg5LgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3JlYWRzdHJlYW0pOiBUaGlua28uCi0KLTIwMTMtMDMtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogY29uZmlndXJlOiBVc2UgZWdyZXAsIG5vdCBncmVwLgotCi0JUHJvYmxlbSByZXBvcnRlZCBNb2pjYSBNaWtsYXZlYyA8bW9qY2EubWlrbGF2ZWMubGlzdHNAZ21haWwuY29tPi4KLQotMjAxMy0wMy0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmg6IEFkZCBkZXNjcmlwdGlvbiBvZiBjb2xvciBmaWx0ZXJpbmcuCi0KLQlCYXNlZCBvbiBhIGNvbnRyaWJ1dGlvbiBmcm9tIEFudHRpIFMuIExhbmtpbGEgPGFsYW5raWxhQGJlbC5maT4KLQkoU2F2YW5uYWggYnVnICMzODYwNykuCi0KLTIwMTMtMDMtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNaW5vci4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYyAoYWZfcHJvcGVydHlfc2V0KTogVHlwby4KLQkoYWZfYXV0b2ZpdHRlcl9pbml0LCBhZl9hdXRvZml0dGVyX2RvbmUpOiBVc2UgY2FzdC4KLQotMjAxMy0wMy0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBjb25maWd1cmU6IEF1dG9tYXRpY2FsbHkgdGVzdCBmb3IgYGdtYWtlJyBhbHNvLgotCi0JU3VnZ2VzdGVkIGJ5IE1vamNhIE1pa2xhdmVjIDxtb2pjYS5taWtsYXZlYy5saXN0c0BnbWFpbC5jb20+LgotCi0yMDEzLTAzLTIxICBQZXRlciBCcmVpdGVubG9obmVyICA8cGViQG1wcG11Lm1wZy5kZT4KLQotCVJlc3BlY3QgQ09ORklHX1NIRUxMIGZyb20gdGhlIGVudmlyb25tZW50LgotCi0JU29tZSBsYXJnZSBwYWNrYWdlcyB1c2luZyBGcmVlVHlwZSBoYXZlIHRvIHVzZSBhIGJyb2tlbiAoZGVmaWNpZW50KQotCS9iaW4vc2guICBUaGUgY29uZmlndXJlIHNjcmlwdHMgKGFzIGdlbmVyYXRlZCBieSBBdXRvY29uZikgYXJlCi0JY2xldmVyIGVub3VnaCB0byBmaW5kIGEgYmV0dGVyIHNoZWxsIGFuZCBwdXQgdGhhdCBvbmUgaW50byB0aGUKLQllbnZpcm9ubWVudCB2YXJpYWJsZSBDT05GSUdfU0hFTEwuICBJZiB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlIGlzCi0JYWxyZWFkeSBzZXQgdGhlIHNjcmlwdCBza2lwcyB0aGUgdGVzdCBhbmQgYXNzdW1lcyB0byBiZSBhbHJlYWR5Ci0JcnVubmluZyB1bmRlciBhIGdvb2Qgc2hlbGwuCi0KLQkqIGJ1aWxkcy91bml4L2RldGVjdC5tazogSG9ub3VyIENPTkZJR19TSEVMTC4KLQkqIGJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChTSEVMTCk6IERlZmluZS4KLQotMjAxMy0wMy0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIHBhdGNoICM3OTcxLgotCi0JKiBjb25maWd1cmU6IEhhbmRsZSBNQUtFIGVudmlyb25tZW50IHZhcmlhYmxlIGFsc28uCi0KLTIwMTMtMDMtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzM4NTM4LgotCi0JKiBidWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRkZWJ1Zy5jLCBidWlsZHMvd2luMzIvZnRkZWJ1Zy5jLAotCWJ1aWxkcy93aW5jZS9mdGRlYnVnLmMgKEZUX1Rocm93KTogQWRkIGZ1bmN0aW9uLgotCi0yMDEzLTAzLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcmFzdGVyXSBSZW1vdmUgZGVhZCBjb2RlLgotCi0JKiBzcmMvcmFzdGVyL3Jhc3RwaWMuYyAoZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCkKLQlzcmMvc21vb3RoL2Z0c3BpYy5jIChmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQpOiBEbyBpdC4KLQotMjAxMy0wMy0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcHNoaW50ZXIvcHNocGljLmggKEdFVF9QSUMpOiBVc2UgY29ycmVjdCBjb250YWluZXIuCi0KLTIwMTMtMDMtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oOiBGaXggY29tbWl0IGZyb20gMjAxMy0wMy0xMS4KLQotCVRoZSBwcmV2aW91cyB2ZXJzaW9uIHdhcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZS4gIFJlcG9ydGVkIGJ5Ci0JQmVoZGFkLgotCi0yMDEzLTAzLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqLyo6IFVzZSBGVF9FUlJfRVEsIEZUX0VSUl9ORVEsIGFuZCBGVF9FUlIgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQlGVF9FcnJfWFhYIGFuZCBmcmllbmRzIGFyZSBubyBsb25nZXIgZGlyZWN0bHkgdXNlZCBpbiB0aGUgc291cmNlCi0JY29kZS4KLQotMjAxMy0wMy0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTmV3IGVycm9yIG1hbmFnZW1lbnQgbWFjcm9zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmggKEZUX0VSUl9YQ0FULCBGVF9FUlJfQ0FUKTogTW92ZSB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmg6IC4uLiB0aGlzIGZpbGUuCi0JKEZUX0VSUiwgRlRfRVJSX0VRLCBGVF9FUlJfTkVRLCBGVF9NT0RFUlJfRVEsIEZUX01PREVSUl9ORVEpOiBOZXcKLQltYWNyb3MuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogVXBkYXRlZC4KLQotMjAxMy0wMy0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKi8qOiBVc2UgRlRfRXJyX09rIG9ubHkuCi0KLQlUaGlzIGlzIGEgcHVyZWx5IG1lY2hhbmljYWwgY29udmVyc2lvbi4KLQotMjAxMy0wMy0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKi8qOiBVc2UgYEZUX1RIUk9XJy4KLQotCVRoaXMgaXMgZXNzZW50aWFsbHkgYSBtZWNoYW5pY2FsIGNvbnZlcnNpb24sIGFkZGluZyBpbmNsdXNpb24gb2YKLQlgRlRfSU5URVJOQUxfREVCVUdfSCcgd2hlcmUgbmVjZXNzYXJ5LCBhbmQgcHJvdmlkaW5nIHRoZSBtYWNyb3MgZm9yCi0Jc3RhbmQtYWxvbmUgY29tcGlsaW5nIG1vZGVzIG9mIHRoZSByYXN0ZXJpemVyIG1vZHVsZXMuCi0KLQlUbyBjb252ZXJ0IHRoZSByZW1haW5pbmcgb2NjdXJyZW5jZXMgb2YgRlRfRXJyX1hYWCBhbmQgZnJpZW5kcyBpdCBpcwotCW5lY2Vzc2FyeSB0byByZXdyaXRlIHRoZSBjb2RlLiAgTm90ZSwgaG93ZXZlciwgdGhhdCBpdCBkb2Vzbid0IGhhcm0KLQlpZiBzb21lIGNhc2VzIGFyZSBub3QgaGFuZGxlZCBzaW5jZSBGVF9USFJPVyBpcyBhIG5vLW9wLgotCi0yMDEzLTAzLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlJbnRyb2R1Y2UgYEZUX1RIUk9XJyBtYWNyby4KLQotCVRoZSBpZGVhIGlzIHRvIHJlcGxhY2UgY29kZSBsaWtlCi0KLQkgIHJldHVybiBGVF9FcnJfRm9vX0JhcjsKLQotCW9yCi0KLQkgIHJldHVybiBDRkZfRXJyX0Zvb19CYXI7Ci0KLQl3aXRoCi0KLQkgIHJldHVybiBGVF9USFJPVyggRm9vX0JhciApOwotCi0JVGhlIEZUX1RIUk9XIG1hY3JvIGhhcyB0d28gZnVuY3Rpb25zOgotCi0JICAuIEl0IGhpZGVzIHRoZSBtb2R1bGUgc3BlY2lmaWMgcHJlZml4LgotCi0JICAuIEluIGRlYnVnIG1vZGUsIGl0IGNhbGxzIHRoZSBlbXB0eSBmdW5jdGlvbiBgRlRfVGhyb3cnIHdoaWNoIGNhbgotCSAgICBiZSB0aHVzIHVzZWQgdG8gc2V0IGEgYnJlYWtwb2ludC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmggKEZUX1RIUk9XKTogTmV3IG1hY3JvLgotCShGVF9UaHJvdyk6IE5ldyBwcm90b3R5cGUuCi0JKiBzcmMvYmFzZS9mdGRlYnVnLmMgKEZUX1Rocm93KTogTmV3IGZ1bmN0aW9uLgotCi0yMDEzLTAzLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZW1vdmUgYEZUX0tFRVBfRVJSX1BSRUZJWCcuCi0KLQlUaGUgaWRlYSBpcyB0byBhbHdheXMgaGF2ZSBGVF9FUlJfUFJFRklYIGF2YWlsYWJsZSBpbnRlcm5hbGx5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmg6IFVzZSBGVDJfQlVJTERfTElCUkFSWSB0byBndWFyZAotCXVuZGVmaW5pdGlvbiBvZiBGVF9FUlJfUFJFRklYCi0KLQkqIHNyYy9neHZhbGlkL2d4dmVycm9yLmgsIHNyYy9vdHZhbGlkL290dmVycm9yLmgsCi0Jc3JjL3NmbnQvc2ZlcnJvcnMuaDogVXBkYXRlZC4KLQotMjAxMy0wMy0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2d4dmFsaWRdIEZpeCBtb2R1bGUgZXJyb3IuCi0KLQkqIHNyYy9neHZhbGlkL2d4dmVycm9yLmggKEZUX0VSUl9CQVNFKTogRGVmaW5lIGFzCi0JRlRfTW9kX0Vycl9HWHZhbGlkLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oOiBBZGQgbW9kdWxlIGVycm9yIGZvciBgR1h2YWxpZCcuCi0KLTIwMTMtMDMtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFsd2F5cyB1c2UgbW9kdWxlIHJlbGF0ZWQgZXJyb3IgY29kZXMuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KSwgc3JjL3R5cGUxL3Qxb2Jqcy5jCi0JKFQxX0ZhY2VfSW5pdCksIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KTogVXNlCi0JYEZUX0VSUk9SX0JBU0UnLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2VuY29kaW5nKTogVXNlCi0JVDFfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQuCi0KLTIwMTMtMDMtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFNldCBgbGluZWFye0hvcmksVmVydH1BZHZhbmNlJyBmb3IgZW1iZWRkZWQgYml0bWFwcyBhbHNvLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBLaGFsZWQgSG9zbnkgPGtoYWxlZGhvc255QGVnbHVnLm9yZz4uCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCk6IEltcGxlbWVudCBpdC4KLQotMjAxMy0wMi0yMyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEZpeCBjb21taXQgYWIwMmQ5ZTguCi0KLQkqIHNyYy9iYXNlL2Z0YmJveC5jIChCQm94X0N1YmljX0NoZWNrKTogQ2hhbmdlIHNjYWxpbmcgdG8gbXNiIG9mIDIyLgotCi0yMDEzLTAyLTE5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gTmV3IGJpc2VjdGluZyBCQm94X0N1YmljX0NoZWNrIChkaXNhYmxlZCkuCi0KLQkqIHNyYy9iYXNlL2Z0YmJveC5jIChCQm94X0N1YmljX0NoZWNrKTogTmV3IGJpc2VjdGluZyBhbGdvcml0aG0KLQlmb3IgZXh0cmVtdW0gc2VhcmNoIGJ1aWx0IGFyb3VuZCBzaW1wbGUgY29uZGl0aW9uIHRoYXQgZGVmaW5lcwotCXdoaWNoIGhhbGYgY29udGFpbnMgdGhlIGV4dHJlbXVtLgotCi0yMDEzLTAyLTE4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbdG9vbHNdIFVwZGF0ZSBCQm94IHRlc3RpbmcgdG9vbC4KLQotCSogc3JjL3Rvb2xzL3Rlc3RfYmJveC5jOiBBZGQgYW5vdGhlciBjdWJpYyBvdXRsaW5lIHdpdGggZXhhY3QgQkJveC4KLQkoUkVQRUFUKTogSW5jcmVhc2UgdGhlIG51bWJlciBvZiBiZW5jaG1hcmtpbmcgY3ljbGVzLgotCShwcm9maWxlX291dGxpbmUpOiBUd2VhayBvdXRwdXQgZm9ybWF0dGluZy4KLQotMjAxMy0wMi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzgyMzUuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IERvbid0IGdlbmVyYXRlIGBmcmVldHlwZS1jb25maWcnIGFuZAotCWBmcmVldHlwZS5wYycuCi0KLQkqIGJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChGVDJfRVhUUkFfTElCUywgTElCQloyLCBMSUJaLAotCWJ1aWxkX2xpYnRvb2xfbGlicywgZnRfdmVyc2lvbik6IE5ldyB2YXJpYWJsZXMgdG8gYmUgc3Vic3RpdHV0ZWQuCi0JKGZyZWV0eXBlLWNvbmZpZywgZnJlZXR5cGUucGMpOiBOZXcgcnVsZXMgdG8gZ2VuZXJhdGUgdGhvc2UgZmlsZXMuCi0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbjogUmVtb3ZlIGNvZGUgZm9yIGhhbmRsaW5nIGBycGF0aCcuCi0JVGhlIHVzZSBvZiAkcnBhdGggaGFzIGJlZW4gYWNjaWRlbnRhbGx5IHJlbW92ZWQgaW4gYSBwYXRjaCBmcm9tCi0JMjAwOS0xMi0yMiwgYW5kIGFwcGFyZW50bHkgbm9vbmUgaGFzIG1pc3NlZCBpdCBzaW5jZS4KLQlVc2UgYCUnIGluc3RlYWQgb2YgYEAnIGFzIGEgdmFyaWFibGUgc3Vic3RpdHV0aW9uIG1hcmtlci4KLQlVc2UgcXVvdGVzLgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS5pbjogVXNlIGAlJyBpbnN0ZWFkIG9mIGBAJyBhcyBhIHZhcmlhYmxlCi0Jc3Vic3RpdHV0aW9uIG1hcmtlci4KLQlVc2UgcXVvdGVzLgotCi0yMDEzLTAyLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfc2l6ZV9ydW5fcHJlcCk6IFJlc2V0IG1vcmUgR1MgdmFyaWFibGVzLgotCi0JQlRXLCBHcmVnIGFncmVlcyB0aGF0IHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uIGlzIG1pc3NpbmcgdGhlIGxpc3QKLQlvZiBHUyB2YXJpYWJsZXMgd2hpY2ggd2lsbCBhbHdheXMgYmUgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVzCi0JYWZ0ZXIgdGhlIGBwcmVwJyB0YWJsZSBoYXMgYmVlbiBleGVjdXRlZC4KLQotMjAxMy0wMi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcnVuX3ByZXApOiBSZXNldCByZWZlcmVuY2UgcG9pbnRzLgotCi0JVXAgdG8gbm93LCB3ZSBzaW1wbHkgdG9vayBhIHNuYXBzaG90IG9mIHRoZSBHcmFwaGljcyBTdGF0ZSBhZnRlciB0aGUKLQlgcHJlcCcgdGFibGUgaGFzIGJlZW4gZXhlY3V0ZWQsIGFuZCByaWdodCBiZWZvcmUgYSBnbHlwaCdzIGJ5dGVjb2RlCi0Jd2FzIHJ1biBpdCBnb3QgcmVsb2FkZWQuICBIb3dldmVyLCBhcyBHcmVnIEhpdGNoY29jayBoYXMgdG9sZCB1cyBpbgotCXByaXZhdGUgY29tbXVuaWNhdGlvbiwgcmVmZXJlbmNlIHBvaW50cyBnZXQgcmVzZXQgdG8gemVybyBpbiB0aGUgTVMKLQlyYXN0ZXJpemVyIGFuZCB3ZSBmb2xsb3cgaW4gZHVlIGNvdXJzZS4gIFdoaWxlIHJlYXNvbmFibGUsIHRoaXMgaXMKLQl1bmRvY3VtZW50ZWQgYmVoYXZpb3VyLgotCi0JTW9zdCBub3RhYmx5LCB0aGlzIGZpeGVzIHRoZSByZW5kZXJpbmcgb2YgQXJpYWwncyBgeCcgZ2x5cGggaW4KLQlzdWJwaXhlbCBoaW50aW5nIG1vZGUuCi0KLTIwMTMtMDItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQSBiZXR0ZXIgZml4IGZvciBTYXZhbm5haCBidWcgIzM4MjExLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX0lQKTogSW1wbGVtZW50IGlkZW50aWNhbCBiZWhhdmlvdXIgdG8KLQlNUyByYXN0ZXJpemVyIGlmIHJwMSA9PSBycDIgKGNvbmZpcm1lZCBieSBHcmVnIEhpdGNoY29jaykuCi0KLTIwMTMtMDItMDEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtwY2ZdIFN0cmVhbWxpbmUgcGFyc2luZyBvZiBQQ0YgZW5jb2RpbmcgdGFibGUuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X2VuY29kaW5ncyk6IFVzZSBzaW1wbGVyIGRvdWJsZSBmb3ItbG9vcC4KLQlSZWFsbG9jYXRlIGFycmF5IGluc3RlYWQgb2YgdXNpbmcgdGVtcG9yYXJ5IHN0b3JhZ2UuCi0KLTIwMTMtMDItMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzM4MjI3LgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW46IFNldCBMQ19BTEwuCi0KLTIwMTMtMDItMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzM4MjIxLgotCi0JVGhpcyBjb21wbGVtZW50cyBjb21taXQgODNjMGViYWIuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NdWxEaXZfTm9fUm91bmQpOiBEb24ndCBlbmNsb3NlIHdpdGgKLQlgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSJy4KLQotMjAxMy0wMi0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggU2F2YW5uYWggYnVnICMzODIxMS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JUCk6IE1ha2UgRnJlZVR5cGUgYmVoYXZlIGlkZW50aWNhbAotCXRvIG90aGVyIGludGVycHJldGVycyBpZiBycDEgPT0gcnAyICh3aGljaCBpcyBpbnZhbGlkKS4KLQotMjAxMy0wMS0yOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIFNtYWxsIG9wdGltaXphdGlvbiBvZiBCQm94IGNhbGN1bGF0aW9uLgotCi0JKiBzcmMvYmFzZS9mdGJib3guYyAoQkJveF9DdWJpY19DaGVjayk6IFVzZSBGVF9NU0IgZnVuY3Rpb24gaW4KLQlzY2FsaW5nIGFsZ29yaXRobS4KLQotMjAxMy0wMS0yNiAgSW5maW5hbGl0eSAgPGluZmluYWxpdHlAaW5maW5hbGl0eS5uZXQ+Ci0KLQlbdHJ1ZXR5cGVdIE1pbm9yIGZvcm1hdHRpbmcgZml4LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYzogVXBkYXRlZC4KLQkoRE9fUlMpOiBGaXggaW5kZW50YXRpb24uCi0KLTIwMTMtMDEtMjYgIEluZmluYWxpdHkgIDxpbmZpbmFsaXR5QGluZmluYWxpdHkubmV0PgotCi0JW3RydWV0eXBlXSBGaXggcmFzdGVyaXplcl92ZXJzaW9uIGxvZ2ljIGluIHNwaC4KLQotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4LmM6IFVwZGF0ZWQuCi0JKEFMV0FZU19TS0lQX0RFTFRBUF9SdWxlcyk6IFJlbW92ZSBydWxlIGZvciBUcmVidWNoZXQgTVMuCi0JKHNwaF9zZXRfdHdlYWtzKTogRml4IGByYXN0ZXJpemVyX3ZlcnNpb24nIGxvZ2ljLgotCi0yMDEzLTAxLTI2ICBJbmZpbmFsaXR5ICA8aW5maW5hbGl0eUBpbmZpbmFsaXR5Lm5ldD4KLQotCVt0cnVldHlwZV0gQWxpZ24gbW9yZSB0byBDbGVhclR5cGUgd2hpdGVwYXBlciBmb3Igc3BoLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZVJlYyk6IEFkZCBmbGFncwotCWZvciBkZXRlY3RlZCBvcGNvZGUgcGF0dGVybnMgYW5kIGNvbXBhdGliaWxpdHkgbW9kZS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfbG9hZGVyX2luaXQpOiBDb21wbGV0ZSBjb25kaXRpb25hbC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmM6IFVwZGF0ZWQuCi0JUmVtb3ZlIFNQSF9ERUJVRyBhbmQgcmVwbGFjZSB3aXRoIEZUX1RSQUNFNy4KLQkoRE9fUlMpOiBNb3JlIGNvbmRpdGlvbnMuCi0JKEluc19GREVGKTogQWRkIG1vcmUgb3Bjb2RlIGRldGVjdGlvbiBwYXR0ZXJucy4KLQlNb3JlIHNwZWNpZmljIGNvbmRpdGlvbnMgd2hlbiBmbGFnZ2luZyBhbiBmZGVmLgotCU1ha2UgY29tcGF0aWJpbGl0eSBtb2RlIG9ubHkgdHVybiBvbiB3aGVuIGRlbHRhIGZkZWZzIGFyZSBmb3VuZC4KLQkoSW5zX0NBTEwsIEluc19MT09QQ0FMTCk6IFNldCBmbGFncyBmb3IgY3VycmVudGx5IGV4ZWN1dGVkIGZkZWYuCi0JKEluc19TSFBJWCk6IFJlbW92ZSBsb2dpYyB0byBoYW5kbGUgdHRmYXV0b2hpbnRlZCBmb250cy4KLQlTaW1wbGlmeSBjb25kaXRpb25hbHMgd2hlcmUgcG9zc2libGUuCi0JVXNlIGAmJyBpbnN0ZWFkIG9mIGAlJyBvcGVyYXRvciBmb3IgZHVtYiBjb21waWxlcnMuCi0JKEluc19NSUFQKTogQWRqdXN0IHR3aWxpZ2h0IHpvbmUgY29uZGl0aW9uYWwuCi0JRW5zdXJlIGBpZ25vcmVfeF9tb2RlJyBpcyBvbiB3aGVuIHRlc3Rpbmcgc3BoIGNvbmRpdGlvbmFscy4KLQkoSW5zX01JUlApOiBFbnN1cmUgYGlnbm9yZV94X21vZGUnIGlzIG9uIHdoZW4gdGVzdGluZyBzcGgKLQljb25kaXRpb25hbHMuCi0JRG8gY3Z0IGN1dGluIGFsd2F5cyB3aGVuIGBpZ25vcmVfeF9tb2RlJyBpcyBhY3RpdmUuCi0JUmVtb3ZlIHRlc3QgZm9yIHR0ZmF1dG9oaW50ZWQgZm9udHMuCi0JKEluc19ERUxUQVApOiBFbnN1cmUgYGlnbm9yZV94X21vZGUnIGlzIG9uIHdoZW4gdGVzdGluZyBzcGgKLQljb25kaXRpb25hbHMuCi0JRG8gY3Z0IGN1dGluIGFsd2F5cyB3aGVuIGBpZ25vcmVfeF9tb2RlJyBpcyBhY3RpdmUuCi0JUmVtb3ZlIHRlc3QgZm9yIHR0ZmF1dG9oaW50ZWQgZm9udHMuCi0JVXNlIGAmJyBpbnN0ZWFkIG9mIGAlJyBvcGVyYXRvciBmb3IgZHVtYiBjb21waWxlcnMuCi0JKEluc19HRVRJTkZPKTogUmVtb3ZlIFNQSF9ERUJVRyBhbmQgcmVwbGFjZSB3aXRoIEZUX1RSQUNFNy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmg6IFVwZGF0ZWQuCi0JKFRUX0V4ZWNDb250ZXh0UmVjKTogUmVtb3ZlIGNvbXBhdGliaWxpdHlfbW9kZSB2YXJpYWJsZS4KLQlBZGQgdmFyaWFibGUgdG8gaW5kaWNhdGUgd2hlbiBleGVjdXRpbmcgaW4gc3BlY2lhbCBmZGVmcyBmb3Igc3BoLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmg6IFVwZGF0ZWQuCi0JKFRUX0RlZlJlY29yZCk6IEFkZCBmbGFncyB0byBpZGVudGlmeSBzcGVjaWFsIGZkZWZzIGZvciBzcGguCi0JKFRUX1NpemVSZWMpOiBSZW1vdmUgdW5uZWNlc3NhcnkgdHRmYXV0b2hpbnRlZCB2YXJpYWJsZS4KLQotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4LmM6IFVwZGF0ZWQuCi0JKENPTVBBVElCSUxJVFlfTU9ERV9SdWxlcyk6IFJlbW92ZSBhbGwuICBBdXRvLWRldGVjdGVkIG5vdy4KLQkoUElYRUxfSElOVElOR19SdWxlcyk6IFJlbW92ZSBhbGwuICBVbm5lY2Vzc2FyeSBhZnRlciBmaXhlcy4KLQkoU0tJUF9OT05QSVhFTF9ZX01PVkVTX1J1bGVzKTogUmVtb3ZlIFVidW50dS4KLQkoU0tJUF9OT05QSVhFTF9ZX01PVkVTX1J1bGVzX0V4Y2VwdGlvbnMpOiBBZGQgQXJpYWwgQm9sZCBgTicuCi0JKFNLSVBfT0ZGUElYRUxfWV9NT1ZFU19SdWxlcyk6IFJlbW92ZSBhbGwuICBIYXBwZW5zIGF1dG9tYXRpY2FsbHkKLQlub3cuCi0JKFJPVU5EX05PTlBJWEVMX1lfTU9WRVNfUnVsZXMpOiBSZW1vdmUgVWJ1bnR1LgotCShST1VORF9OT05QSVhFTF9ZX01PVkVTX1J1bGVzX0V4Y2VwdGlvbnMpOiBSZW1vdmUgYWxsLgotCShOT1JNQUxfUk9VTkRfUnVsZXMpOiBSZW1vdmUgVmVyZGFuYS4KLQkoTk9fREVMVEFQX0FGVEVSX0lVUF9SdWxlcyk6IFJlbW92ZSBhbGwuCi0JKHNwaF9zZXRfdHdlYWtzKTogUGVyZm9ybWFuY2UgZml4LiAgRG9uJ3QgcnVuIHByZXAgYWx3YXlzLgotCUFkanVzdCBjb25kaXRpb25hbCBmb3Igc3BoX2NvbXBhdGliaWxpdHlfbW9kZS4KLQotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4Lmg6IEFkZCBuZXcgZmRlZiBmbGFncyBmb3Igc3BoLgotCi0yMDEzLTAxLTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gRml4IGJyb2tlbiBlbWJvbGRlbmluZyBhdCBzbWFsbCBzaXplcy4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0VtYm9sZGVuWFkpOiBEbyBub3QgYXR0ZW1wdCB0bwotCW5vcm1hbGl6ZSB6ZXJvLWxlbmd0aCB2ZWN0b3JzLgotCi0yMDEzLTAxLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzODE2Ny4KLQotCVRoaXMgZml4ZXMgY29tbWl0IDgzYzBlYmFiIGZyb20gMjAxMi0wNi0yNy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmg6Ci0Jcy9UVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSL1RUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUi8uCi0KLTIwMTMtMDEtMjUgIFhpIFdhbmcgIDx4aS53YW5nQGdtYWlsLmNvbT4KLQotCVtzZm50XSBGaXggYnJva2VuIHBvaW50ZXIgb3ZlcmZsb3cgY2hlY2tzLgotCi0JTWFueSBjb21waWxlcnMgc3VjaCBhcyBnY2MgYW5kIGNsYW5nIG9wdGltaXplIGF3YXkgcG9pbnRlciBvdmVyZmxvdwotCWNoZWNrcyBgcCArIG4gPCBwJywgYmVjYXVzZSBwb2ludGVyIG92ZXJmbG93IGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KLQlVc2UgYSBzYWZlIGZvcm0gYG4gPiBwX2xpbWl0IC0gcCcgaW5zdGVhZC4KLQotCUFsc28gYXZvaWQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpc3N1ZXMsIGZvciBleGFtcGxlLCB1c2luZwotCWBudW1fZ2x5cGhzID4gKCBwX2xpbWl0IC0gcCApIC8gMicgcmF0aGVyIHRoYW4gYG51bV9nbHlwaHMgKiAyJwotCWdpdmVuIGEgbGFyZ2UgYG51bV9nbHlwaHMnLgotCi0JKiBzcmMvc2ZudC90dHNiaXQwLmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlKTogSW1wbGVtZW50IGl0LgotCi0yMDEzLTAxLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gRml4IGBtYWtlIG11bHRpJy4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jLCBzcmMvYmFzZS9mdHRyaWdvbi5jOiBJbmNsdWRlCi0JRlRfSU5URVJOQUxfQ0FMQ19ILgotCi0yMDEzLTAxLTI1ICBEYXZpZCAnRGlnaXQnIFR1cm5lciAgPGRpZ2l0QGdvb2dsZS5jb20+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBDKysgY29tcGlsYXRpb24uCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5oOiBVcGRhdGVkLgotCShTUEhfWF9TQ0FMSU5HX1JVTEVTX1NJWkUpOiBNb3ZlZCBhbmQgcmVuYW1lZCB0by4uLgotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4LmMgKFhfU0NBTElOR19SVUxFU19TSVpFKTogVGhpcy4KLQkoc3BoX1hfU0NBTElOR19SdWxlcyk6IFJlbW92ZWQuCi0JKHNjYWxlX3Rlc3RfdHdlYWspOiBNYWtlIGZ1bmN0aW9uIHN0YXRpYy4KLQkoc3BoX3Rlc3RfdHdlYWtfeF9zY2FsaW5nKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCk6IFVwZGF0ZWQuCi0KLTIwMTMtMDEtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBNYWtlIGBGVF9IeXBvdCcgcmVhbGx5IGludGVybmFsLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmggKEZUX0h5cG90KTogTW92ZSB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaDogVGhpcyBmaWxlLgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChGVF9IeXBvdCk6IE1vdmUgdG8uLi4KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jOiBUaGlzIGZpbGUuCi0JSW5jbHVkZSBGVF9UUklHT05PTUVUUllfSC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYzogRG9uJ3QgaW5jbHVkZSBGVF9UUklHT05PTUVUUllfSC4KLQotMjAxMy0wMS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBSZXZlcnQgY2hhbmdlIGZyb20gMjAxMy0wMS0yMi4KLQotCUZyZWVUeXBlJ3MgYGhlaWdodCcgdmFsdWUgaXMgdGhlIGJhc2VsaW5lLXRvLWJhc2VsaW5lIGRpc3RhbmNlLi4uCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfc2l6ZV9yZXNldCk6IFVuZG8uCi0KLTIwMTMtMDEtMjMgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlLCB0cnVldHlwZV0gTmV3IGludGVybmFsIGBGVF9IeXBvdCcgZnVuY3Rpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaCAoRlRfSHlwb3QpOiBEZWNsYXJlIGl0LgotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoRlRfSHlwb3QpOiBEZWZpbmUgaXQuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQpOiBVc2UgaXQKLQlpbnN0ZWFkIG9mIGV4cGxpY2l0IGV4cHJlc3Npb25zLgotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEN1cnJlbnRfUmF0aW8sIE5vcm1hbGl6ZSk6IFVzZSBpdCBpbnN0ZWFkCi0Jb2YgVFRfVmVjTGVuLgotCShUVF9WZWNMZW4pOiBSZW1vdmVkLgotCi0yMDEzLTAxLTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gRml4IGludGVnZXIgb3ZlcmZsb3cuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9FbWJvbGRlblhZKTogTm9ybWFsaXplIGluY29taW5nIGFuZAotCW91dGdvaW5nIHZlY3RvcnMgYW5kIHVzZSBmaXhlZCBwb2ludCBhcml0aG1ldGljLgotCi0yMDEzLTAxLTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gRml4IGludGVnZXIgb3ZlcmZsb3cuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24pOiBTY2FsZSB0aGUKLQljb29yZGluYXRlcyBkb3duIHRvIGF2b2lkIG92ZXJmbG93LgotCi0yMDEzLTAxLTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gU3BsaXQgb3V0IE1TQiBmdW5jdGlvbi4KLQotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoZnRfdHJpZ19wcmVub3JtKTogQm9ycm93IGZyb20gaGVyZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmggKEZUX01TQik6IERlY2xhcmUgaGVyZS4KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NU0IpOiBEZWZpbmUgaGVyZS4KLQotMjAxMy0wMS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggZm9udCBoZWlnaHQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfc2l6ZV9yZXNldCk6IFRoZSBXaW5kb3dzIHJlbmRlcmluZwotCWVuZ2luZSB1c2VzIHJvdW5kZWQgdmFsdWVzIG9mIHRoZSBhc2NlbmRlciBhbmQgZGVzY2VuZGVyIHRvIGNvbXB1dGUKLQl0aGUgVHJ1ZVR5cGUgZm9udCBoZWlnaHQuCi0KLTIwMTMtMDEtMTYgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW3NmbnRdIEZpeCBvcHRpbWl6ZWQgc2JpdCBsb2FkZXIuCi0KLQlJdCB3YXMgbm90IHRha2luZyBiaXRfZGVwdGggaW50byBjb25zaWRlcmF0aW9uIHdoZW4gYmxpdHRpbmchCi0KLQkqIHNyYy9zZm50L3R0c2JpdDAuYyAodHRfc2JpdF9kZWNvZGVyX2xvYWRfYnl0ZV9hbGlnbmVkLAotCSogdHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQpOiBIYW5kbGUgYml0Ci0JZGVwdGguCi0KLTIwMTMtMDEtMTYgIERhdmlkICdEaWdpdCcgVHVybmVyICA8ZGlnaXRAZ29vZ2xlLmNvbT4KLQotCVt0cnVldHlwZV0gSW1wcm92ZSBzdWItcGl4ZWwgY29kZS4KLQotCVRoaXMgcGF0Y2hlcyBmaXhlcyBtYW55IGlzc3VlcyB3aXRoIHRoZSB0dHN1YnBpeCBpbXBsZW1lbnRhdGlvbi4KLQotCTEuIERhdGEgdGFibGVzIGFyZSBkZWZpbmVkLCBpbnN0ZWFkIG9mIGRlY2xhcmVkLCBpbiB0aGUgaGVhZGVyLCBhbmQKLQkgICB0aHVzIGNvcGllZCBpbnRvIGVhY2ggc291cmNlIGZpbGUgdGhhdCBpbmNsdWRlcyBpdC4KLQotCTIuIFRoZXNlIHRhYmxlcyB3ZXJlIGRlZmluZWQgYXMgZ2xvYmFsLCBtdXRhYmxlLCB2aXNpYmxlIHZhcmlhYmxlcywKLQkgICBhbmQgdGh1cyBjb3N0aW5nIHByaXZhdGUgUkFNIHRvIGV2ZXJ5IHByb2Nlc3MgdGhhdCBsb2FkcyB0aGUKLQkgICBsaWJyYXJ5ICg+IDUwIEtCIC8gcHJvY2VzcywgdGhpcyBpcyBodWdlISkuCi0KLQkgICBBZGRpdGlvbmFsbHksIHRoaXMgYWxzbyBtYWRlIHRoZSBsaWJyYXJ5IGV4cG9ydCB0aGUgc3ltYm9scwotCSAgIGNvbXBsZXRlbHkgbmVlZGxlc3NseS4KLQotCTMuIE1pc3NpbmcgYHNwaF8nIGFuZCBgU1BIXycgcHJlZml4ZXMgdG8gc29tZSBvZiB0aGUgZGVmaW5pdGlvbnMuCi0KLQlOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHRyeSB0byBmaXggdGhlIGluY3JlZGlibHkgaW5lZmZpY2llbnQgc3RvcmFnZQotCWZvcm1hdCBmb3IgdGhlIGRhdGEgdGFibGVzIHVzZWQgYnkgdGhlIGNvZGUuICBUaGlzIG9uZSB3aWxsIHJlcXVpcmUKLQlhbm90aGVyIHBhc3MgaW4gdGhlIGZ1dHVyZS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmggKE1BWF9OQU1FX1NJWkUsIE1BWF9DTEFTU19NRU1CRVJTKToKLQlSZW5hbWVkIHRvLi4uCi0JKFNQSF9NQVhfTkFNRV9TSVpFLCBTUEhfTUFYX0NMQVNTX01FTUJFUlMpOiBUaGlzLgotCVVwZGF0ZSBhbGwgdXNlcnMuCi0KLQkoU1BIX1R3ZWFrUnVsZSwgU1BIX1NjYWxlUnVsZSk6IERlY29yYXRlIHdpdGggYGNvbnN0JyB3aGVyZQotCWFwcHJvcHJpYXRlLgotCi0JKEZvbnRfQ2xhc3MpOiBSZW5hbWUgdG8uLi4KLQkoU1BIX0ZvbnRfQ2xhc3MpOiBUaGlzLiAgRGVjb3JhdGUgd2l0aCBgY29uc3QnIHdoZXJlIGFwcHJvcHJpYXRlLgotCQotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4LmggKHNjYWxlX3Rlc3RfdHdlYWssIHNwaF90ZXN0X3R3ZWFrKToKLQlEZWNvcmF0ZSBhcmd1bWVudHMgd2l0aCBgY29uc3QnIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JTW92ZSBmb250IHR3ZWFraW5nIHRhYmxlcyB0by4uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYzogVGhpcyBmaWxlIGFuZCBkZWNvcmF0ZSB0aGVtIHdpdGggYHN0YXRpYycKLQlhbmQgYGNvbnN0JyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCShYX1NDQUxJTkdfUnVsZXMsIFhfU0NBTElOR19SVUxFU19TSVpFKTogUmVuYW1lZCB0by4uLgotCShzcGhfWF9TQ0FMSU5HX1J1bGVzLCBTUEhfWF9TQ0FMSU5HX1JVTEVTX1NJWkUpOiBUaGlzLgotCVVwZGF0ZSBhbGwgdXNlcnMuCi0KLTIwMTMtMDEtMTIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVt0cnVldHlwZV0gSW1wcm92ZSBhY2N1cmFjeSBvZiBub3JtYWxpemF0aW9uIG9mIHNob3J0IHZlY3RvcnMuCi0KLQlVbml0IHZlY3RvciBjb21wb25lbnRzIGFyZSBzdG9yZWQgYXMgMi4xNCBmaXhlZC1wb2ludCBudW1iZXJzLiBJbgotCW9yZGVyIHRvIGNhbGN1bGF0ZSBhbGwgMTQgYml0cyBhY2N1cmF0ZWx5LCBhIHNob3J0IHZlY3RvciB0byBiZQotCW5vcm1hbGl6ZWQgaGFzIHRvIGJlIHVwc2NhbGVkIHRvIGF0IGxlYXN0IDE0IGJpdHMgYmVmb3JlIGl0cyBsZW5ndGgKLQlpcyBjYWxjdWxhdGVkLiBUaGlzIGhhcyBiZWVuIHNhZmUgc2luY2UgYWNjdXJhdGUgQ09SRElDIGFsZ29yaXRobXMKLQl3ZXJlIGFkb3B0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChOb3JtYWxpemUpOiBTY2FsZSBzaG9ydCB2ZWN0b3JzIGJ5IDB4NDAwMC4KLQotMjAxMy0wMS0xMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBLaWxsIHZlcnkgb2xkIHZlY3RvciBub3JtYWxpemF0aW9uIGhhY2tzLgotCi0JQmFjayBpbiB0aGUgZGF5cywgdmVjdG9yIGxlbmd0aCBjYWxjdWxhdGlvbnMgd2VyZSBub3QgdmVyeSBhY2N1cmF0ZQotCWFuZCB0aGUgdmVjdG9yIG5vcm1hbGl6YXRpb24gZnVuY3Rpb24sIE5vcm1hbGl6ZSwgaGFkIHRvIG1ldGljdWxvdXNseQotCWNvcnJlY3QgdGhlIGVycm9ycyBmb3IgbG9uZyB2ZWN0b3JzIFtjb21taXQgYjdlZjJiMDk2ODY3XS4gSXQgd2FzIG5vCi0JbG9uZ2VyIG5lY2Vzc2FyeSBhZnRlciBhY2N1cmF0ZSBDT1JESUMgYWxnb3JpdGhtcyB3ZXJlIGFkb3B0ZWQsIGJ1dAotCXRoZSBjb2RlIHJlbWFpbmVkLiBJdCBpcyB0aW1lIHRvIGtpbGwgaXQuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChOb3JtYWxpemUpOiBSZW1vdmUgZXJyb3IgY29tcGVuc2F0aW9uLgotCShUVF9WZWNMZW4pOiBSZW1vdmUgYW55IG1lbnRpb24gb2Ygb2xkIGxlc3MgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24uCi0KLTIwMTMtMDEtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCURpc2FibGUgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTLgotCi0JQWZ0ZXIgdGhlIG5leHQgcmVsZWFzZSB3ZSBhcmUgZ29pbmcgdG8gcmVtb3ZlIHRoZSBjb2RlIGNvbXBsZXRlbHkuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmgsIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTKTogQ29tbWVudCBvdXQuCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IGl0LgotCi0yMDEzLTAxLTEwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gVXBkYXRlIHRoZSBvdmVyZmxvdyBwcm90ZWN0aW9uIGJpdC4KLQotCVRoZSByZWNlbnQgb3B0aW1pemF0aW9ucyBvZiBDT1JESUMgaXRlcmF0aW9ucyBkcmFzdGljYWxseSByZWR1Y2UgdGhlCi0JZXhwYW5zaW9uIGZhY3Rvci4gIFZlY3RvciBjb21wb25lbnRzIHdpdGggTVNCIG9mIDI5IGFyZSBub3cgc2FmZQotCWZyb20gb3ZlcmZsb3cuCi0KLQkqIHNyYy9iYXNlL2Z0dHJpZ29uLmMgKEZUX1RSSUdfU0FGRV9NU0IpOiBOZXcgbWFjcm8uCi0JKGZ0X3RyaWdfcHJlbm9ybSk6IFVzZSBpdCBhbmQgcmVtb3ZlIGRlYWQgY29kZS4KLQotMjAxMy0wMS0wOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2UsIHBzaGludGVyXSBVc2UgRlRfQUJTLCBGVF9NSU4sIGFuZCBGVF9NQVggZm9yIHJlYWRhYmlsaXR5LgotCi0JKiBzcmMvYmFzZS9mdGJib3guYzogVXBkYXRlZC4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBVcGRhdGVkLgotCSogc3JjL2Jhc2UvZnR0cmlnb24uYzogVXBkYXRlZC4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmM6IFVwZGF0ZWQuCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmM6IFVwZGF0ZWQuCi0KLTIwMTMtMDEtMDggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBDbGVhbiB1cCB0cmlnb25vbWV0cmljIGNvcmUuCi0KLQkqIHNyYy9iYXNlL2Z0dHJpZ29uLmM6IERvY3VtZW50IHRoZSBhbGdvcml0aG0gaW4gYSBsYXJnZSBjb21tZW50LgotCShGVF9UUklHX0NPU0NBTEUpOiBSZW1vdmUgbWFjcm8uCi0JKEZUX1RhbjogVXNlIGBGVF9UUklHX1NDQUxFJyBpbnN0ZWFkLgotCShGVF9Db3MsIEZUX1ZlY3Rvcl9Vbml0KTogRGl0dG8gYW5kIHJvdW5kIHRoZSByZXR1cm4gdmFsdWVzLgotCi0yMDEzLTAxLTAyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gVXNlIHJvdW5kaW5nIGluIENPUkRJQyBpdGVyYXRpb25zLgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChmdF90cmlnX3BzZXVkb19yb3RhdGUsCi0JZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUpOiBJbXByb3ZlIGFjY3VyYWN5IGJ5IHJvdW5kaW5nLgotCi0yMDEzLTAxLTAyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gUmVkdWNlIHRyaWdvbm9tZXRyaWMgYWxnb3JpdGhtcy4KLQotCUFmdGVyIHdlIGdldCB3aXRoaW4gNDUgZGVncmVlcyBieSBtZWFucyBvZiB0cnVlIDkwLWRlZ3JlZSByb3RhdGlvbnMsCi0Jd2UgY2FuIHJlbW92ZSBpbml0aWFsIDQ1LWRlZ3JlZSBDT1JESUMgaXRlcmF0aW9uIGFuZCBzdGFydCBmcm9tCi0JYXRhbigxLzIpIHBzZXVkb3JvdGF0aW9uLCByZWR1Y2luZyBleHBhbnNpb24gZmFjdG9yIHRoZXJlYnkuCi0KLQkqIHNyYy9iYXNlL2Z0dHJpZ29uLmMgKEZUX1RSSUdfU0NBTEUsIEZUX1RSSUdfQ09TQ0FMRSk6IFVwZGF0ZSBtYWNyb3MuCi0JKGZ0X3RyaWdfcHNldWRvX3JvdGF0ZSwgZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUpOiBVcGRhdGUuCi0KLQkqIHNyYy90b29scy9jb3JkaWMucHk6IEJyaW5nIHVwIHRvIGRhdGUgd2l0aCB0cmlnb25vbWV0cmljIGNvcmUuCi0KLQkqIGRvY3MvQ0hBTkdFUzogT2xkIHR5cG8uCi0KLTIwMTMtMDEtMDIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uaDogUmVtb3ZlIHVudXNlZCBjb2RlLgotCi0yMDEyLTEyLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKHR0X2xvYWRlcl9pbml0KTogQWRkIG1vcmUgdHJhY2luZy4KLQotMjAxMi0xMi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGUxXSBGaXggaGFuZGxpbmcgb2YgL0ZvbnRCQm94IGluIE1NIGZvbnRzLgotCVByb2JsZW0gcmVwb3J0ZWQgYnkgRGVsIE1lcnJpdHQgPGRlbEBhbHVtLm1pdC5lZHU+Ci0KLQlJZiB3ZSBoYXZlCi0KLQkgIC9Gb250QkJveCB7IHsgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggfQotCSAgICAgICAgICAgICAgeyAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCB9Ci0JICAgICAgICAgICAgICB7IDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IH0KLQkgICAgICAgICAgICAgIHsgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggfSB9Ci0KLQlpbiB0aGUgL0JsZW5kIGRpY3Rpb25hcnksICB0aGVuIHRoZSBmaXJzdCBCQm94IGlzIHsgMTEgMjEgMzEgNDEgfSwKLQl0aGUgc2Vjb25kIHsgMTIgMjIgMzIgNDIgfSwgZXRjLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX0ZpZWxkVHlwZSk6IEFkZAotCWBUMV9GSUVMRF9UWVBFX01NX0JCT1gnIChmb3IgdGVtcG9yYXJ5IHVzZSkuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfcGFyc2VyX2xvYWRfZmllbGQpIDxUMV9GSUVMRF9UWVBFX01NX0JCT1g+OgotCUltcGxlbWVudCBpdC4KLQotMjAxMi0xMi0yMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvdG9vbHMvY29yZGljLnB5OiBCcmluZyB1cCB0byBkYXRlIHdpdGggdHJpZ29ub21ldHJpYyBjb3JlLgotCi0yMDEyLTEyLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlDaGVjayBwYXJhbWV0ZXJzIG9mIGBGVF9PdXRsaW5lX05ldycuCi0JUHJvYmxlbSByZXBvcnRlZCBieSBSb2JpbiBXYXR0cyA8cm9iaW4ud2F0dHNAYXJ0aWZleC5jb20+LgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfTmV3X0ludGVybmFsKTogRW5zdXJlIHRoYXQKLQlgbnVtQ29udG91cnMnIGFuZCBgbnVtUG9pbnRzJyBmaXQgaW50byBGVF9PdXRsaW5lJ3MgYG5fcG9pbnRzJyBhbmQKLQlgbl9jb250b3VycycsIHJlc3BlY3RpdmVseS4KLQotMjAxMi0xMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNC4xMSByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi00LTExJy4KLQotCSogZG9jcy9DSEFOR0VTLCBkb2NzL3JlbGVhc2U6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi40LjExLgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksCi0JYnVpbGRzL3dpbjMyL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDUvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwOC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAxMC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwgYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi40LjEwLzIuNC4xMS8sIHMvMjQxMC8yNDExLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxMS4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDE2OjA6MTAuCi0KLQkqIGJ1aWxkcy90b3BsZXZlbC5tayAoZGlzdCk6IERvbid0IGluY2x1ZGUgYC5tYWlsbWFwJy4KLQotMjAxMi0xMi0yMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEltcHJvdmUgdHJpZ29ub21ldHJpYyBjb3JlLgotCi0JRnJlZVR5cGUgdXNlZCB0byByZWx5IG9uIGEgMjQtc3RlcCBpdGVyYXRpb24gQ09SRElDIGFsZ29yaXRobSB0bwotCWNhbGN1bGF0ZSB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyBhbmQgcm90YXRlIHZlY3RvcnMuIEl0IHR1cm5zIG91dAotCXRoYXQgb25jZSB0aGUgdmVjdG9yIGlzIGluIHRoZSByaWdodCBoYWxmLXBsYW5lLCB0aGUgaW5pdGlhbCByb3RhdGlvbgotCWJ5IDYzIGRlZ3JlZXMgaXMgbm90IG5lY2Vzc2FyeS4gVGhlIGFsZ29yaXRobSBpcyBwZXJmZWN0bHkgY2FwYWJsZQotCXRvIGNvbnZlcmdlIHRvIGFueSBhbmdsZSBzdGFydGluZyBmcm9tIHRoZSBzZWNvbmQgNDUgZGVncmVlIHJvdGF0aW9uLgotCVRoaXMgcGF0Y2ggcmVtb3ZlcyB0aGUgZmlyc3Qgcm90YXRpb24gYW5kIG1ha2VzIGl0IGEgMjMtc3RlcCBDT1JESUMKLQlhbGdvcml0aG0uCi0KLQkqIHNyYy9iYXNlL2Z0dHJpZ29uLmMgKEZUX1RSSUdfU0NBTEUsIEZUX1RSSUdfQ09TQ0FMRSk6IFVwZGF0ZSBtYWNybwotCXZhbHVlcy4KLQkoZnRfdHJpZ19wc2V1ZG9fcm90YXRlLCBmdF90cmlnX3BzZXVkb19wb2xhcml6ZSk6IFJlbW92ZSBpbml0aWFsCi0Jcm90YXRpb24uCi0KLTIwMTItMTItMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X3Byb3BlcnR5X2RvKTogRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMTItMTItMTkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRyZm9yay5jIChGVF9SYWNjZXNzX0d1ZXNzKTogU3dpdGNoIHRvIEZUX0ludCBjb3VudGVycy4KLQotMjAxMi0xMi0xOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIENsZWFuIHVwIHRyaWdvbm9tZXRyaWMgY29yZS4KLQotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUpOiBBbGlnbiBhbGdvcml0aG0KLQl3aXRoIGBmdF90cmlnX3BzZXVkb19yb3RhdGUnLgotCi0yMDEyLTEyLTE4ICBJbmZpbmFsaXR5ICA8aW5maW5hbGl0eUBpbmZpbmFsaXR5Lm5ldD4KLQotCVt0cnVldHlwZV0gTWlub3IgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmM6IChUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCk6IFVzZSBGVF9NdWxGaXgKLQlpbnN0ZWFkIG9mIEZUX011bERpdi4KLQotMjAxMi0xMi0xNyAgSW5maW5hbGl0eSAgPGluZmluYWxpdHlAaW5maW5hbGl0eS5uZXQ+Ci0KLQlbdHJ1ZXR5cGVdIFJlbW92ZSB1bnVzZWQgY29kZSBhbmQgdmFyaWFibGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYzogVXBkYXRlZC4KLQkoSW5zX0ZERUYpOiBSZW1vdmUgb3Bjb2RlIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBiZWluZyB1c2VkLgotCi0yMDEyLTEyLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlWYXJpb3VzIGNvbXBpbGVyIHdhcm5pbmcgZml4ZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX1NFUlZJQ0VfVU5BVkFJTEFCTEUpOiBVc2UKLQlgbG9naWNhbCBub3QnIG9wZXJhdG9yIGluc3RlYWQgb2YgbmVnYXRpb24uICBUaGUgaWRlYSBpcyB0aGF0IGB+JwotCXJldHVybnMgZXhhY3RseSB0aGUgZGF0YSB0eXBlIGVuZm9yY2VkIGJ5IHRoZSBjYXN0IHRvIGEgcG9pbnRlciAoYmUKLQlpdCAzMmJpdCBvciA2NGJpdCBvciB3aGF0ZXZlciksIHdoaWxlIGEgbmVnYXRpdmUgaW50ZWdlciBoYXMgbm90Ci0JdGhpcyBmbGV4aWJpbGl0eS4KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmMgKEZUQ19DTUFQX1VOS05PV04pOiBEaXR0by4KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKEFMTF9QT0lOVFMsIFRUX0dldF9NTV9WYXIpOiBEaXR0by4KLQkqIHNyYy90eXBlL3QxbG9hZC5jIChUMV9HZXRfTU1fVmFyKTogRGl0dG8uCi0JKHBhcnNlX2JsZW5kX2F4aXNfdHlwZXMpOiBVc2UgY2FzdC4KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcmVhZHN0cmVhbSk6IFVzZSBjYXN0LgotCi0yMDEyLTEyLTE2ICBJbmZpbmFsaXR5ICA8aW5maW5hbGl0eUBpbmZpbmFsaXR5Lm5ldD4KLQotCVt0cnVldHlwZV0gUmVtb3ZlIHVudXNlZCBjb2RlIGFuZCB2YXJpYWJsZXMuICBBZGQgbWlub3IgZml4ZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5oOiBVcGRhdGVkLgotCShTS0lQX05PTlBJWEVMX1lfTU9WRVNfUnVsZXNfRXhjZXB0aW9ucyk6IEFkZCBUcmVidWNoZXQgTVMuCi0JKEFMTE9XX1hfRE1PVkVYX1J1bGVzKTogUmVtb3ZlIEFyaWFsIGNoYXJhY3RlcnMuCi0JKEFMTE9XX1hfRE1PVkVfUnVsZXMpOiBSZW1vdmUgQXJpYWwgY2hhcmFjdGVycy4KLQkoUkFTVEVSSVpFUl8zNV9SdWxlcyk6IFZlcmRhbmEgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGhlcmUuCi0JKFNLSVBfSVVQX1J1bGVzKTogRm9ybWF0dGluZyBmaXguCi0JKERFTFRBUF9TS0lQX0VYQUdHRVJBVEVEX1ZBTFVFU19SdWxlcyk6IFJlbW92ZSBTZWdvZSBVSS4KLQkoQ09NUEFUSUJMRV9XSURUSFNfUnVsZXMpOiBBZGQgTW9uYWNvIGFuZCBUcmVidWNoZXQgTVMuCi0JKFhfU0NBTElOR19SdWxlcyk6IEFkZCBtaXNjLiBjb3JyZWN0aXZlIGZpeGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jOiAoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgpOiBBZGp1c3QgY29ycmVjdGlvbgotCWZhY3RvciBmb3IgZW1ib2xkZW5pbmcgZHVyaW5nIHNjYWxpbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5oOiBVcGRhdGVkLgotCShUVF9FeGVjQ29udGV4dFJlYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmg6IFVwZGF0ZWQuCi0JKFRUX1NpemVSZWMpOiBBZGQgdHRmYXV0b2hpbnRlZCB2YXJpYWJsZS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmM6IFVwZGF0ZWQuCi0JKEluc19GREVGKTogUmV3b3JrIGNvZGUgdG8gZml4IGJ1Z3MgYW5kIGFkZCBtb3JlIGRldGVjdGlvbi4KLQkoSW5zX0NBTEwpOiBSZW1vdmUgdW51c2VkIGNvZGUuCi0JKEluc19MT09QQ0FMTCk6IFJlbW92ZSB1bnVzZWQgY29kZS4KLQkoVFRfUnVuSW5zKTogUmVtb3ZlIHVudXNlZCBjb2RlLgotCShJbnNfU0hQSVgpOiBBZGQgbG9naWMgdG8gaGFuZGxlIHR0ZmF1dG9oaW50ZWQgZm9udHMuCi0JKEluc19NSVJQKTogRG9uJ3Qgcm91bmQgeCBpbiBjdXQtaW4gY2FsY3VsYXRpb24uICBBZGQgbG9naWMgdG8gaGFuZGxlCi0JdHRmYXV0b2hpbnRlZCBmb250cy4KLQotMjAxMi0xMi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBTYXZhbm5haCBidWcgIzM3OTM2LgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX2dhc3ApOiBBdm9pZCBtZW1vcnkgbGVhay4KLQotMjAxMi0xMi0xNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEZpeCAxMS15ZWFyIG9sZCBidWcuCi0KLQlTaW5jZSB0aGUgaW5pdGlhbCBjb21taXQgKGViZTg1ZjU5KSB0aGUgdmFsdWUgb2YgRlRfVFJJR19TQ0FMRSBoYXMKLQlhbHdheXMgYmVlbiBzbGlnaHRseSBsZXNzIHRoYW4gdGhlIGNvcnJlY3QgdmFsdWUsIHdoaWNoIGhhcyBiZWVuCi0JZ2l2ZW4gaW4gdGhlIGNvbW1lbnQgYXMgYSBoZXhhZGVjaW1hbC4gQXMgYSByZXN1bHQsIHZlY3RvciBsZW5ndGhzCi0Jd2VyZSB1bmRlcmVzdGltYXRlZCBhbmQgcm90YXRlZCB2ZWN0b3JzIHdlcmUgc2hvcnRlbmVkLgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChGVF9UUklHX1NDQUxFKTogRml4IG1hY3JvIHZhbHVlLgotCi0yMDEyLTEyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBGaXggU2F2YW5uYWggYnVnICMzNzkwNy4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9nbHlwaHMpIDxFTkNPRElORz46IE5vcm1hbGl6ZQotCW5lZ2F0aXZlIHNlY29uZCBwYXJhbWV0ZXIgb2YgYEVOQ09ESU5HJyBmaWVsZCBhbHNvLgotCi0yMDEyLTEyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBGaXggU2F2YW5uYWggYnVnICMzNzkwNi4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9nbHlwaHMpIDxFTkNPRElORz46IFVzZSBjb3JyZWN0IGFycmF5Ci0Jc2l6ZSBmb3IgY2hlY2tpbmcgYGdseXBoX2VuYycuCi0KLTIwMTItMTItMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGZdIEZpeCBTYXZhbm5haCBidWcgIzM3OTA1LgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3BhcnNlX3N0YXJ0KSA8U1RBUlRQUk9QRVJUSUVTPjogUmVzZXQKLQlgcHJvcHNfc2l6ZScgdG8gemVybyBpbiBjYXNlIG9mIGFsbG9jYXRpb24gZXJyb3I7IHRoaXMgdmFsdWUgZ2V0cwotCXVzZWQgaW4gYSBsb29wIGluIGBiZGZfZnJlZV9mb250Jy4KLQotMjAxMi0xMi0xMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBTY2FsZSBGX2RvdF9QIGRvd24uCi0KLQlUaGUgZG90IHByb2R1Y3QgYmV0d2VlbiBmcmVlVmVjdG9yIGFuZCBwcm9qVmVjdG9yIG9yIGNvc2luZSBvZgotCXRoZSBhbmdsZSBiZXR3ZWVuIHRoZXNlIEZUX0YyRG90MTQgdW5pdCB2ZWN0b3JzIHVzZWQgdG8gYmUgc2NhbGVkIHVwCi0JYnkgNCBhbmQgcm91dGluZWx5IG9jY3VwaWVkIDMyIGJpdHMgaW4gYW4gRlRfTG9uZyBmaWVsZCBGX2RvdF9QLgotCVRoaXMgcGF0Y2ggc2NhbGVzIHRoZSB2YWx1ZSBkb3duIGJ5IDJeMTQgaW5zdGVhZCwgd2hpY2ggc2ltcGxpZmllcwotCWl0cyB1c2UgdGhyb3VnaG91dCB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuCi0KLQlUaGlzIGRvZXMgbm90IGxlYWQgdG8gdGhlIGxvc3Mgb2YgcHJlY2lzaW9uIGJlY2F1c2UgdGhlIGxvd2VyIGJpdHMKLQlhcmUgdW5yZWxpYWJsZSBhbnl3YXkuIENvbnNpZGVyIHR3byB1bml0IHZlY3RvcnMgKDEsMCkgYW5kICguNiwuOCkKLQlmb3Igd2hpY2ggdGhlIHRydWUgdmFsdWUgb2YgRl9kb3RfUCBpcyAuNiAqIDB4NDAwMDAwMDAgPSAweDI2NjY2NjY2LgotCVRoZXNlIHZlY3RvcnMgYXJlIHN0b3JlZCBhcyAoMHg0MDAwLDApIGFuZCAoMHgyNjY2LDB4MzMzMykgYWZ0ZXIKLQlyb3VuZGluZyBhbmQgRl9kb3RfUCBpcyBhc3NpZ25lZCAweDI2NjYwMDAwLiBUaGUgbG93ZXIgYml0cyB3ZXJlCi0JYWxyZWFkeSBsb3N0IHdoaWxlIHJvdW5kaW5nIHRoZSB1bml0IHZlY3RvciBjb21wb25lbnRzLgotCi0JQmVzaWRlcyBjb2RlIHNpbXBsaWZpY2F0aW9uLCB0aGlzIGNoYW5nZSBjYW4gbGVhZCB0byBiZXR0ZXIKLQlwZXJmb3JtYW5jZSB3aGVuIEZUX011bERpdiB3aXRoIHRoZSBzY2FsZWQtZG93biBGX2RvdF9QIGlzIGxlc3MKLQlsaWtlbHkgdG8gdXNlIHRoZSBjb3N0bHkgNjQtYml0IHBhdGguIFdlIGFyZSBub3QgY2hhbmdpbmcgdGhlIHR5cGUKLQlvZiBGX2RvdF9QIHRvIEZUX0YyRG90MTQgYXQgdGhpcyBwb2ludC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKENvbXB1dGVfRnVuY3MpOiBTY2FsZSBGX2RvdF9QIGRvd24gYnkgMTQKLQliaXRzIGFuZCBtb2RpZnkgaXRzIHVzZSBhY2NvcmRpbmdseS4KLQkoRGlyZWN0X01vdmUsIERpcmVjdF9Nb3ZlX09yaWcsIENvbXB1dGVfUG9pbnRfRGlzcGxhY2VtZW50KTogTW9kaWZ5Ci0JdGhlIHVzZSBvZiBGX2RvdF9QIGZpZWxkLgotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX3J1bl9mcGdtKTogQ2hhbmdlIGFyYml0cmFyeQotCWFzc2lnbm1lbnQgb2YgRl9kb3RfUCB0byBpdHMgdGhlb3JldGljYWwgbWF4aW11bSBpbiBjYXNlIHdlIGRlY2lkZQotCXRvIHNjYWxlIGJhY2sgaXRzIHR5cGUgbGF0ZXIuCi0KLTIwMTItMTItMDkgIEpvaG5zb24gWS4gWWFuICA8eWluc2VuX3lhbkBmb3hpdHNvZnR3YXJlLmNvbT4KLQotCVt0eXBlMV0gQW5vdGhlciBmaXggZm9yIDIwMTItMDktMTcgY29tbWl0LgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChUMV9HZXRfUHJpdmF0ZV9EaWN0KSA8Zm91bmQ+OiBDb3JyZWN0bHkgc2V0Ci0JYGxpbWl0JyB2YWx1ZS4KLQotMjAxMi0xMi0wNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBUd2VhayB0aGUgcHJldmlvdXMgY29tbWl0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoQ3VycmVudF9SYXRpbyk6IFB1dCB1bml0IHZlY3RvcgotCWNvbXBvbmVudHMgYXMgdGhlIHNlY29uZCBUVF9NdWxGaXgxNCBhcmd1bWVudHMuIFRoaXMgaXMgcmVxdWlyZWQKLQlvbiAxNi1iaXQgc3lzdGVtcy4KLQotMjAxMi0xMi0wNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBNaWNyb29wdGltaXphdGlvbnMgaW4gYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9EaXZGaXgxNCk6IE5ldyBtYWNyby4KLQkoTm9ybWFsaXplKTogVXNlIGl0IGhlcmUuCi0JKEN1cnJlbnRfUmF0aW8pOiBVc2UgVFRfTXVsRml4MTQgaW5zdGVhZCBvZiBGVF9NdWxEaXYuCi0JKEluc19TSFBJWCk6IENhbmNlbCBvdXQgdHdvIFRUX011bEZpeDE0IGNhbGxzLgotCi0yMDEyLTEyLTA1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbdHJ1ZXR5cGVdIENvc21ldGljIGltcHJvdmVtZW50IGluIGJ5dGVjb2RlIGludGVycHJldGVyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYzogVXNlIGV4cGxpY2l0IGNhbGxzIHRvIEZUX011bERpdiwKLQlGVF9NdWxGaXgsIGFuZCBGVF9EaXZGaXggaW5zdGVhZCBvZiBtYWNyb3MuCi0KLTIwMTItMTItMDMgIEpvaG4gVHl0Z2F0ICA8Sm9obi5UeXRnYXRAZXNrby5jb20+Ci0KLQlbcHNoaW50ZXJdIENsYW1wIEJsdWVTY2FsZSB2YWx1ZS4KLQotCVRoaXMgaXMgU2F2YW5uYWggYnVnICMzNzg1Ni4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2NhbGNfbWF4X2hlaWdodCk6IE5ldyBmdW5jdGlvbi4KLQkocHNoX2dsb2JhbHNfbmV3KTogVXNlIGl0IHRvIGxpbWl0IEJsdWVTY2FsZSB2YWx1ZSB0bwotCWAxIC8gbWF4X29mX2JsdWVfem9uZV9oZWlnaHRzJy4KLQotMjAxMi0xMi0wMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlLCB0eXBlMV0gUmV2aXNlIHRoZSB1c2Ugb2YgRlRfTXVsRGl2LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jOiBVcGRhdGVkLgotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jOiBVcGRhdGVkLgotCSogc3JjL3R5cGUxL3QxbG9hZC5jOiBVcGRhdGVkLgotCi0yMDEyLTExLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY29uZmlndXJlXSBQcmVzZXJ2ZSBjdXN0b21pemVkIGBmdG9wdGlvbi5oJy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgRGVsIE1lcnJpdHQgPGRlbEBhbHVtLm1pdC5lZHU+LgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3IDxjcHAgY29tcHV0YXRpb24gb2YgYml0IGxlbmd0aD46IERvbid0Ci0JcmVtb3ZlIGV4aXN0aW5nIEZyZWVUeXBlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLTIwMTItMTEtMjkgIEpvaG4gVHl0Z2F0ICA8Sm9obi5UeXRnYXRAZXNrby5jb20+Ci0KLQlbdHlwZTFdIEZpeCBTYXZhbm5haCBidWcgIzM3ODMxLgotCi0JVGhlIGJ1ZyByZXBvcnQgYWxzbyBjb250YWlucyBhIHBhdGNoLgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChUMV9HZXRfUHJpdmF0ZV9EaWN0KSA8Zm91bmQ+OiBSZWFsbHkgZml4Ci0JY2hhbmdlIGZyb20gMjAxMi0wOS0xNy4KLQotMjAxMi0xMS0yOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBGaXggZm9ybWF0dGluZyBhbmQgdHlwby4KLQotMjAxMi0xMS0yNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2NpZCwgdHlwZTEsIHR5cGU0Ml0gQ2xlYW4gdXAgdW5pdHNfcGVyX0VNIGNhbGN1bGF0aW9ucy4KLQotCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9wYXJzZV9mb250X21hdHJpeCk6IFVwZGF0ZWQuCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHQxX3BhcnNlX2ZvbnRfbWF0cml4KTogVXBkYXRlZC4KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX2ZvbnRfbWF0cml4KTogVXBkYXRlZC4KLQotMjAxMi0xMS0yNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Z0c3Ryb2tlXSBNaW5vciBpbXByb3ZlbWVudC4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYzogUmVwbGFjZSBuZXN0ZWQgRlRfRGl2Rml4IGFuZCBGVF9NdWxGaXggd2l0aAotCUZUX011bERpdi4KLQotMjAxMi0xMS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChmdF90cmlnX2Rvd25zY2FsZSk6IE1ha2UgNjRiaXQgdmVyc2lvbiB3b3JrLgotCi0yMDEyLTExLTE1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gRml4IGludGVnZXIgb3ZlcmZsb3dzIGluIGRkNTcxOGM3ZDY3YS4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0VtYm9sZGVuWFkpOiBVc2UgRlRfTXVsRGl2LgotCi0yMDEyLTExLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gVHJhY2Ugc3RlbSB3aWR0aHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyk6IEFkZCBzb21lCi0JRlRfVFJBQ0UgY2FsbHMuCi0KLTIwMTItMTEtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEFkZCBzdXBwb3J0IGZvciBPcGVuVHlwZSBDb2xsZWN0aW9ucyAoT1RDKS4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2xvYWQpOiBTZXBhcmF0ZSBzdWJmb250IGFuZCBmYWNlCi0JaW5kZXggaGFuZGxpbmcgdG8gbG9hZCBib3RoIHB1cmUgQ0ZGcyB3aXRoIG11bHRpcGxlIHN1YmZvbnRzIGFuZAotCU9UQ3MgKHdpdGggbXVsdGlwbGUgZmFjZXMgd2hlcmUgZWFjaCBmYWNlIGhvbGRzIGV4YWN0bHkgb25lCi0Jc3ViZm9udCkuCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IFVwZGF0ZWQuCi0KLTIwMTItMTEtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNaW5vciBpbXByb3ZlbWVudC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19jb21wdXRlX2JsdWVfZWRnZXMpOiBGaXgKLQlsb29wLgotCi0yMDEyLTExLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSB0cmFjaW5nLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRfZWRnZXMpCi0JW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXTogQ291bnQgbnVtYmVyIG9mIGFjdGlvbnMgYW5kIGVtaXQgc29tZXRoaW5nCi0JaWYgdGhlcmUgd2VyZW4ndCBhbnkuCi0KLTIwMTItMTEtMDQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBGb3J0aWZ5IGVtYm9sZGVuaW5nIGNvZGUgYWdhaW5zdCBlZ3JlZ2lvdXMgZGlzdG9ydGlvbnMuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9FbWJvbGRlblhZKTogVGhyZXNob2xkIGVtYm9sZGVuaW5nCi0Jc3RyZW5ndGggd2hlbiBpdCBsZWFkcyB0byBzZWdtZW50IGNvbGxhcHNlLgotCi0yMDEyLTExLTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gQ2xlYW4gdXAgZW1ib2xkZW5pbmcgY29kZSBhbmQgaW1wcm92ZSBjb21tZW50cyB0aGVyZS4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0VtYm9sZGVuWFkpOiBSZXBsYWNlIHNlcXVlbnRpYWwKLQljYWxscyB0byBGVF9NdWxGaXggYW5kIEZUX0RpdkZpeCB3aXRoIEZUX011bERpdi4KLQlNZW50aW9uIHRoYXQgYmlzZWN0b3JzIGFyZSB1c2VkIHRvIGZpZ3VyZSBvdXQgdGhlIHNoaWZ0IGRpcmVjdGlvbi4KLQotMjAxMi0xMC0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkZCBzdGFuZGFyZCBjaGFyYWN0ZXIgdG8gYEFGX1NjcmlwdENsYXNzUmVjJyBzdHJ1Y3R1cmUuCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCAoQUZfU2NyaXB0Q2xhc3NSZWMpOiBBZGQgYHN0YW5kYXJkX2NoYXInCi0JbWVtYmVyLgotCShBRl9ERUZJTkVfU0NSSVBUX0NMQVNTKTogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzKTogVXNlIGl0LgotCShhZl9sYXRpbl9tZXRyaWNzX2luaXQsIGFmX2xhdGluX3NjcmlwdF9jbGFzcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW4yX21ldHJpY3NfaW5pdF93aWR0aHMpOiBVc2UgaXQuCi0JKGFmX2xhdGluMl9tZXRyaWNzX2luaXQsIGFmX2xhdGluMl9zY3JpcHRfY2xhc3MpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfbWV0cmljc19pbml0X3dpZHRocyk6IFVzZSBpdC4KLQkoYWZfY2prX21ldHJpY3NfaW5pdCwgYWZfY2prX3NjcmlwdF9jbGFzcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmaW5kaWMuYwkoYWZfaW5kaWNfbWV0cmljc19pbml0LAotCWFmX2luZGljX3NjcmlwdF9jbGFzcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmgsIHNyYy9hdXRvZml0L2FmbGF0aW4uaDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZkdW1teS5jOiBVcGRhdGVkLgotCi0yMDEyLTEwLTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gT25seSB1c2UgVW5pY29kZSBDTWFwLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdCk6IEltcGxlbWVudCBpdCwgdG8gYmUKLQlpbiBzeW5jIHdpdGggYGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3NjcmlwdF9jb3ZlcmFnZScuCi0KLTIwMTItMTAtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eF0gSW1wcm92ZSBwYXJzaW5nIG9mIGludmFsaWQgbnVtYmVycy4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jIChQU19Db252X1N0cnRvbCk6IEFsd2F5cyBwYXJzZSBjb21wbGV0ZSBudW1iZXIsCi0JZXZlbiBpbiBjYXNlIG9mIG92ZXJmbG93LgotCShQU19Db252X1RvSW50KTogT25seSBpbmNyZWFzZSBjdXJzb3IgaWYgcGFyc2luZyB3YXMgc3VjY2Vzc2Z1bC4KLQkoUFNfQ29udl9Ub0ZpeGVkKTogRGl0dG8uCi0JVHJhY2UgdW5kZXJmbG93IGFuZCBkYXRhIGVycm9yLgotCi0yMDEyLTEwLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc21vb3RoXSBJbXByb3ZlIHRyYWNpbmcuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3N3ZWVwKTogVHJhY2UgbGFzdCBzd2VlcCBsaW5lIG9mCi0JY3VycmVudCBiYW5kIGFsc28uCi0KLTIwMTItMTAtMjAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVt0cnVldHlwZV0gQ2hlYXBlciB3YXkgdG8gdGhyZXNob2xkIGFuZ2xlcyBiZXR3ZWVuIHZlY3RvcnMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfSVNFQ1QpOiBUaHJlc2hvbGRpbmcgdGFuZ2VudCBpcyBhIGxvdAotCWNoZWFwZXIgdGhhbiB0aHJlc2hvbGRpbmcgc2luZS4KLQotMjAxMi0xMC0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gSW1wcm92ZSBwYXJzaW5nIG9mIGludmFsaWQgcmVhbCBudW1iZXJzLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9yZWFsKTogQWx3YXlzIHBhcnNlIGNvbXBsZXRlIG51bWJlciwKLQlldmVuIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgb3IgdW5kZXJmbG93LgotCUFsc28gdHJhY2Ugb25lIG1vcmUgdW5kZXJmbG93LgotCi0yMDEyLTEwLTIwICBBbmRyZWFzIFBlaG5hY2sgIDxhbmRyZWFzLnBlaG5hY2tAbWUuY29tPgotCi0JW3NmbnRdIExvYWQgcHVyZSBDRkYgZm9udHMgd3JhcHBlZCBpbiBTRk5UIGNvbnRhaW5lci4KLQotCVN1Y2ggZm9udHMgb25seSBoYXZlIGEgYGNtYXAnIGFuZCBhIGBDRkYnIHRhYmxlLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX2ZvbnRfZGlyKTogRG9uJ3QgY2FsbAotCWBjaGVja190YWJsZV9kaXInIGlmIGZvbnQgc2lnbmF0dXJlIGlzIGBPVFRPJy4KLQotMjAxMi0xMC0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BzYXV4XSBGaXggc29tZSB2YWx1ZSBvdmVyZmxvd3MgYW5kIGltcHJvdmUgdHJhY2luZy4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0guCi0JKEZUX0NPTVBPTkVOVCk6IERlZmluZS4KLQkoUFNfQ29udl9TdHJ0b2wpOiBSZXR1cm4gRlRfTG9uZy4KLQlIYW5kbGUgYmFkIGRhdGEgYW5kIG92ZXJmbG93LgotCUVtaXQgc29tZSB0cmFjaW5nIG1lc3NhZ2VzIGluIGNhc2Ugb2YgZXJyb3IuCi0JKFBTX0NvbnZfVG9JbnQpOiBSZXR1cm4gRlRfTG9uZy4KLQkoUFNfQ29udl9Ub0ZpeGVkKTogVXBkYXRlZC4KLQkqIHNyYy9wc2F1eC9wc2NvbnYuaDogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IEFkZCBgcHNjb252Jy4KLQotMjAxMi0xMC0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCBgbWFrZSBtdWx0aSBDQz1jKysnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMsIHNyYy9hdXRvZml0L2FmbGF0aW4yLmM6IEluY2x1ZGUKLQlgYWZnbG9iYWwuaCcuCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jOiBGaXggb3JkZXIgb2YgaGVhZGVyIGZpbGVzLgotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYzogSW5jbHVkZSBgYWZnbG9iYWwuaCcgYW5kIGBhZmVycm9ycy5oJy4KLQotMjAxMi0xMC0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gRml4IG1vcmUgdmFsdWUgZXJyb3JzIGFuZCBpbXByb3ZlIHRyYWNpbmcuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX2ludGVnZXIpOiBFbWl0IHRyYWNpbmcgbWVzc2FnZSBpbgotCWNhc2Ugb2YgZXJyb3IuCi0JKGNmZl9wYXJzZV9yZWFsKTogSGFuZGxlIGFuZCB0cmFjZSBvdmVyZmxvdywgdW5kZXJmbG93LCBhbmQgYmFkIGRhdGEKLQljb25zaXN0ZW50bHkuCi0JKGRvX2ZpeGVkKTogTmV3IGhlbHBlciBmdW5jdGlvbiwgaGFuZGxpbmcgYW5kIHRyYWNpbmcgb3ZlcmZsb3cuCi0JKGNmZl9wYXJzZV9maXhlZCwgY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCk6IFVzZSBgZG9fZml4ZWQnLgotCi0yMDEyLTEwLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNhdXhdIEZpeCBzb21lIHZhbHVlIG92ZXJmbG93cy4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jIChQU19Db252X1RvRml4ZWQpOiBJbXBsZW1lbnQgaXQuCi0KLTIwMTItMTAtMTcgIEJyYW0gVGFzc3lucyAgPEJyYW1UQGVuZm9jdXMuY29tPgotCi0JW2NmZl0gRml4IHZhbHVlIG92ZXJmbG93LgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9maXhlZF9zY2FsZWQpOiBJbXBsZW1lbnQgaXQuCi0KLTIwMTItMTAtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IFNhdmFubmFoIGJ1ZyAjMzc1NzIuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfSVNFQ1QpOiBVc2UgYW5nbGUgYmV0d2VlbiB2ZWN0b3JzIHRvCi0JYXZvaWQgZ3JhemluZyBpbnRlcnNlY3Rpb25zLiAgVGhlIHByZXZpb3VzIHRocmVzaG9sZCB3YXMgdG9vIGNvYXJzZSwKLQlpbmNvcnJlY3RseSByZWplY3Rpbmcgc2hvcnQgYnV0IHZhbGlkIHZlY3RvcnMuCi0KLTIwMTItMDktMzAgIEdpbGxlcyBFc3BpbmFzc2UgIDxnLmVzcEBmcmVlLmZyPgotCi0JUmVtb3ZlIHVzZWxlc3MgYHJtJyBkZXRlY3Rpb24uCi0KLQlgcm0gLWYnIGlzIGRpcmVjdGx5IHVzZWQgaW4gdGhlIGBjb25maWd1cmUnIHNjcmlwdCBjcmVhdGVkIGJ5Ci0JYXV0b2NvbmYsIHRodXMgbm8gYXZhaWxhYmlsaXR5IHRlc3QgaXMgbmVjZXNzYXJ5LgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3IChSTUYpOiBSZW1vdmUgdGVzdC4KLQkqIGJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChERUxFVEUpOiBVcGRhdGVkLgotCi0yMDEyLTA5LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWlub3Igb3B0aW1pemF0aW9uLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zY3JpcHRfY292ZXJhZ2UpOgotCUFkZCBsb29wIGNvbmRpdGlvbi4KLQotMjAxMi0wOS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCB0aGlua28uCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCAoQUZfU0NSSVBUKToKLQlzL0FGX1NDUklQVF9OT05FL0FGX1NDUklQVF9EVU1NWS8uICBXZSBhbHJlYWR5IHVzZSBgQUZfU0NSSVBUX05PTkUnCi0JYXMgYSBiaXQgbWFzay4KLQotCSogc3JjL2F1dG9maXQvYWZkdW1teS5jOiBVcGRhdGVkLgotCi0yMDEyLTA5LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wbGVtZW50IGBpbmNyZWFzZS14LWhlaWdodCcgcHJvcGVydHkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRhdXRvaC5oIChGVF9Qcm9wX0luY3JlYXNlWEhlaWdodCk6IE5ldwotCXN0cnVjdHVyZS4KLQotCSogaW5jbHVkZS9hdXRvZml0L2FmbW9kdWxlLmMgKGFmX3Byb3BlcnR5X2dldF9mYWNlX2dsb2JhbHMpOiBOZXcKLQlmdW5jdGlvbiwgcmUtdXNpbmcgY29kZSBmcm9tIGBhZl9wcm9wZXJ0eV9nZXQnLgotCShhZl9wcm9wZXJ0eV9zZXQsIGFmX3Byb3BlcnR5X2dldCk6IEhhbmRsZSBgaW5jcmVhc2UteC1oZWlnaHQnLgotCVVwZGF0ZWQuCi0KLTIwMTItMDktMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbXBsZW1lbnQgSW5maW5hbGl0eSdzIGBpbmNyZWFzZSBnbHlwaCBoZWlnaHRzJy4KLQotCVRoaXMgaXMgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiBhIHNpbWlsYXIgZml4IGNvbnRhaW5lZCBpbiB0aGUKLQlzby1jYWxsZWQgYEluZmluYWxpdHkgcGF0Y2gnLCB0YWtlbiBmcm9tCi0KLQkgIGh0dHA6Ly93d3cuaW5maW5hbGl0eS5uZXQvZmVkb3JhL2xpbnV4L3ppcHMvZnJlZXR5cGUtaW5maW5hbGl0eS0yLjQuMTAtMjAxMjA2MTZfMDEteDg2XzY0LnRhci5iejIKLQotCXdoaWNoIGFkZHJlc3NlcyB2YXJpb3VzIGVuaGFuY2VtZW50cyBvZiB0aGUgYXV0by1oaW50ZXIuICBXaXRob3V0Ci0JcHJvcGVydGllcyB0byBjb250cm9sIGEgbW9kdWxlJ3MgbWV0YWRhdGEgaXQgd2Fzbid0IHBvc3NpYmxlIHRvCi0JYWRhcHQgdGhlIHBhdGNoZXMgYmVjYXVzZSBldmVyeXRoaW5nIHdhcyBvcmlnaW5hbGx5IGNvbnRyb2xsZWQgYnkKLQllbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggSSBjb25zaWRlciBub3Qgc3VpdGFibGUgaW4gZ2VuZXJhbC4KLQotCUEgcGF0Y2ggdG8gY29udHJvbCBgaW5jcmVhc2VfeF9oZWlnaHQnIGZvbGxvd3MuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmggKEFGX1BST1BfSU5DUkVBU0VfWF9IRUlHSFRfTUlOLAotCUFGX1BST1BfSU5DUkVBU0VfWF9IRUlHSFRfTUFYKTogTmV3IG1hY3Jvcy4KLQkoQUZfRmFjZUdsb2JhbHNSZWMpOiBBZGQgYGluY3JlYXNlX3hfaGVpZ2h0JyBtZW1iZXIuCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfbmV3KTogSW5pdGlhbGl6ZSBpdC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSksCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jIChhZl9sYXRpbjJfbWV0cmljc19zY2FsZV9kaW0pOiBJbXBsZW1lbnQKLQloYW5kbGluZyBvZiBgaW5jcmVhc2VfeF9oZWlnaHQnLgotCi0yMDEyLTA5LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIGhpZXJhcmNoaWNhbCBwcm9wZXJ0eSBhY2Nlc3MgdG8gc29tZSBzdHJ1Y3R1cmVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oOiBJbmNsdWRlIGBhZm1vZHVsZS5oJy4KLQkoQUZfRmFjZUdsb2JhbHNSZWMpOiBBZGQgYG1vZHVsZScgbWVtYmVyLgotCShBRl9GYWNlR2xvYmFscyk6IFR5cGVkZWYgbW92ZWQgdG8uLi4KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaDogSGVyZS4KLQkoQUZfU2NyaXB0TWV0cmljc1JlYyk6IEFkZCBgZ2xvYmFscycgbWVtYmVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfbmV3LAotCWFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3NjcmlwdF9jb3ZlcmFnZSwKLQlhZl9mYWNlX2dsb2JhbHNfZ2V0X21ldHJpY3MpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfcmVzZXQpLCBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jCi0JKGFmX3Byb3BlcnR5X2dldCk6IFVwZGF0ZWQuCi0KLTIwMTItMDktMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gRml4IFNhdmFubmFoIGJ1ZyAjMzczNTAuCi0KLQkqIHNyYy90eXBlMS90MXBhcnNlLmMgKFQxX0dldF9Qcml2YXRlX0RpY3QpIDxmb3VuZD46IENoZWNrIGZvciBBU0NJSQotCXN0b3JhZ2Ugb25seSBpZiB3ZSBhY3R1YWxseSBoYXZlIGF0IGxlYXN0IGZvdXIgYnl0ZXMuCi0KLTIwMTItMDktMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbXBsZW1lbnQgYGZhbGxiYWNrLXNjcmlwdCcgcHJvcGVydHkuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmM6IHMvZGVmYXVsdF9zY3JpcHQvZmFsbGJhY2tfc2NyaXB0Ly4KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmg6IHMvQUZfU0NSSVBUX0RFRkFVTFQvQUZfU0NSSVBUX0ZBTExCQUNLLy4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYzogcy9kZWZhdWx0X3NjcmlwdC9mYWxsYmFja19zY3JpcHQvLgotCShhZl9wcm9wZXJ0eV9zZXQsIGFmX3Byb3BlcnR5X2dldCk6IEltcGxlbWVudCBgZmFsbGJhY2stc2NyaXB0Jy4KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmg6IHMvZGVmYXVsdF9zY3JpcHQvZmFsbGJhY2tfc2NyaXB0Ly4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGF1dG9oLmg6IERvY3VtZW50IGl0LgotCi0yMDEyLTA5LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQ29ycmVjdCBwcmV2aW91cyBVbmljb2RlIDYuMS4wIGNoYW5nZS4KLQotCVRoZSBhdXRvLWhpbnRlcidzIGxhdGluIG1vZHVsZSBvbmx5IGhhbmRsZXMgbGF0aW4gbGlnYXR1cmVzIGluIHRoZQotCWBBbHBoYWJldGljYWwgUHJlc2VudGF0aW9uIEZvcm1zJyBibG9jay4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl91bmlyYW5nZXMpOiBGaXggaXQuCi0KLTIwMTItMDktMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYzogcy9GVF9FcnJfL0FGX0Vycl8vLgotCi0yMDEyLTA5LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWFrZSBkZWZhdWx0IHNjcmlwdCBhIGdsb2JhbCBwcm9wZXJ0eS4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuaCAoQUZfTW9kdWxlUmVjKTogQWRkIGBkZWZhdWx0X3NjcmlwdCcgZmllbGQuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3NjcmlwdF9jb3ZlcmFnZSwKLQlhZl9mYWNlX2dsb2JhbHNfbmV3KSwgc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX3Jlc2V0KSwKLQlzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIChhZl9wcm9wZXJ0eV9nZXQpIDxnbHlwaC10by1zY3JpcHQtbWFwPiwKLQlhZl9hdXRvZml0dGVyX2luaXQ6Ci0JSGFuZGxlIGRlZmF1bHQgc2NyaXB0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oOiBVcGRhdGVkLgotCi0yMDEyLTA5LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlVc2UgYEZUX01vZHVsZScgaW5zdGVhZCBvZiBgRlRfTGlicmFyeScgYXJndW1lbnQgaW4gcHJvcGVydHkgZnVuY3MuCi0KLQlUaGlzIGludGVybmFsIGNoYW5nZSBzaW1wbGlmaWVzIGFjY2VzcyB0byBnbG9iYWwgbW9kdWxlIGRhdGEuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmgKLQkoRlRfUHJvcGVydGllc19TZXRGdW5jLCBGVF9Qcm9wZXJ0aWVzX0dldEZ1bmMpOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9wcm9wZXJ0eV9kbyksIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMKLQkoYWZfcHJvcGVydHlfc2V0LCBhZl9wcm9wZXJ0eV9nZXQpOiBVcGRhdGVkLgotCi0yMDEyLTA5LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gVXBkYXRlIHRvIFVuaWNvZGUgNi4xLjAuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa191bmlyYW5nZXMpLCBzcmMvYXV0b2ZpdC9hZmxhdGluLmMKLQkoYWZfbGF0aW5fdW5pcmFuZ2VzKTogQWRkIGFuZCBmaXggcmFuZ2VzLgotCi0yMDEyLTA5LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gUGFzcyBgQUZfTW9kdWxlJyBpbnN0ZWFkIG9mIGBBRl9Mb2FkZXInLgotCi0JV2Ugd2FudCB0byBhY2Nlc3MgdGhlIChub3QgeWV0IGV4aXN0aW5nKSBtb2R1bGUncyBnbG9iYWwgZGF0YSBsYXRlcgotCW9uLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jOiBJbmNsdWRlIGBhZm1vZHVsZS5oJy4KLQkoYWZfbG9hZGVyX2luaXQsIGFmX2xvYWRlcl9yZXNldCwgYWZfbG9hZGVyX2RvbmUsCi0JYWZfbG9hZGVyX2xvYWRfZ2x5cGgpOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIChBRl9Nb2R1bGVSZWMpOiBNb3ZlIHRvIGBhZm1vZHVsZS5oJy4KLQlVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5oOiBJbmNsdWRlIGBhZmxvYWRlci5oJy4KLQkoQUZfTW9kdWxlUmVjKTogRGVmaW5lIGhlcmUuCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5oIChBRl9Nb2R1bGUpOiBEZWZpbmUgaGVyZS4KLQlVcGRhdGVkLgotCi0yMDEyLTA5LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gRml4IGBtYWtlIG11bHRpJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IEFkZCBgYWZtb2R1bGUnLgotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ILgotCShGVF9DT01QT05FTlQpOiBEZWZpbmUuCi0KLTIwMTItMDktMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYzogcy9GVF9BdXRvZml0dGVyL0FGX01vZHVsZS8uCi0KLTIwMTItMDktMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNaW5vciByZW9yZ2FuaXphdGlvbi4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYyAoQUZfU0NSSVBUX0xJU1RfREVGQVVMVCwKLQlBRl9TQ1JJUFRfTElTVF9OT05FLCBBRl9ESUdJVCk6IE1vdmUgdG8uLi4KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmggKEFGX1NDUklQVF9ERUZBVUxULCBBRl9TQ1JJUFRfTElTVF9OT05FLAotCUFGX0RJR0lUKTogVGhpcyBhbmQgdXBkYXRlIGNvZGUuCi0KLTIwMTItMDktMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbXBsZW1lbnQgYGdseXBoLXRvLXNjcmlwdC1tYXAnIHByb3BlcnR5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0YXV0b2guaDogTmV3IHB1YmxpYyBoZWFkZXIgZmlsZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX0FVVE9ISU5URVJfSCk6IE5ldyBtYWNyby4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYyAoQUZfRmFjZUdsb2JhbHNSZWMpOiBNb3ZlIHN0cnVjdHVyZSB0by4uLgotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuaDogVGhpcyBoZWFkZXIgZmlsZS4KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmM6IEluY2x1ZGUgRlRfQVVUT0hJTlRFUl9ILgotCShhZl9wcm9wZXJ0eV9nZXQpOiBIYW5kbGUgYGdseXBoLXRvLXNjcmlwdC1tYXAnLgotCi0yMDEyLTA4LTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wbGVtZW50IHByb3BlcnRpZXMgc2VydmljZSBmcmFtZXdvcmsuCi0KLQlObyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB5ZXQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0guCi0JKGFmX3Byb3BlcnR5X3NldCwgYWZfcHJvcGVydHlfZ2V0KTogTmV3IGR1bW15IGZ1bmN0aW9ucy4KLQkoYWZfc2VydmljZV9wcm9wZXJ0aWVzLCBhZl9zZXJ2aWNlcywgYWZfZ2V0X2ludGVyZmFjZSk6IFByb3ZpZGUKLQlzZXJ2aWNlIHNldHVwLgotCShhdXRvZml0X21vZHVsZWNsYXNzKTogQWRkIHNlcnZpY2UgaW50ZXJmYWNlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnBpYy5jOiBBZGQgbmVjZXNzYXJ5IGZvcndhcmQgZGVjbGFyYXRpb25zLgotCShhdXRvZml0X21vZHVsZV9jbGFzc19waWNfaW5pdCk6IEFkZCBjb2RlIGZvciBzZXJ2aWNlIGFkZGl0aW9uLgotCShhdXRvZml0X21vZHVsZV9waWNfZnJlZSk6IEFkZCBjb2RlIGZvciBzZXJ2aWNlIHJlbW92YWwuCi0JKiBzcmMvYXV0b2ZpdC9hZnBpYy5oIChBRl9TRVJWSUNFU19HRVQsIEFGX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQpOgotCU5ldyBtYWNyb3Mgd2hpY2ggcHJvdmlkZSBuZWNlc3Nhcnkgc3ludGFjdGljYWwgc3VnYXIgZm9yIFBJQwotCXN1cHBvcnQuCi0KLTIwMTItMDgtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUltcGxlbWVudCBwcm9wZXJ0aWVzIHRvIGNvbnRyb2wgRnJlZVR5cGUgbW9kdWxlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oIChGVF9FcnJfTWlzc2luZ19Qcm9wZXJ0eSk6IE5ldyBlcnJvcgotCWNvZGUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmggKEZUX1Byb3BlcnR5X1NldCwgRlRfUHJvcGVydHlfR2V0KToKLQlOZXcgQVBJLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHJvcC5oOiBOZXcgZmlsZS4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggKEZUX1NFUlZJQ0VfUFJPUEVSVElFU19IKTogTmV3Ci0JbWFjcm8uCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ILgotCShmdF9wcm9wZXJ0eV9kbywgRlRfUHJvcGVydHlfU2V0LCBGVF9Qcm9wZXJ0eV9HZXQpOiBOZXcgZnVuY3Rpb25zLgotCi0yMDEyLTA4LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZG9jbWFrZXJdIEFsbG93IGAtJyBpbiB0YWdzIGFuZCBpZGVudGlmaWVycy4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL2NvbnRlbnQucHkgKHJlX2lkZW50aWZpZXIpLAotCXNyYy90b29scy9kb2NtYWtlci9zb3VyY2VzLnB5IChyZV9tYXJrdXBfdGFnMSwgcmVfbWFya3VwX3RhZzIsCi0JcmVfY3Jvc3NyZWYpOiBBZGQgYC0nIGluIHBhdHRlcm5zLgotCi0yMDEyLTA4LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbRlRfQ09ORklHX09QVElPTl9QSUNdIEZpeCBnKysgNC42LjIgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaCAoRlRfREVGSU5FX0RSSVZFUiksCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfREVGSU5FX1JFTkRFUkVSLAotCUZUX0RFRklORV9NT0RVTEUpLCBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oCi0JKEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEsIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzIsCi0JRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMywgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNCwKLQlGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1LCBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM2KSwKLQlzcmMvYXV0b2ZpdC9hZnBpYy5jIChhdXRvZml0X21vZHVsZV9jbGFzc19waWNfaW5pdCksCi0Jc3JjL2Jhc2UvYmFzZXBpYy5jIChmdF9iYXNlX3BpY19pbml0KSwgc3JjL2Jhc2UvZnRpbml0LmMKLQkoZnRfY3JlYXRlX2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMpLCBzcmMvY2ZmL2NmZnBhcnNlLmMKLQkoRlRfQ3JlYXRlX0NsYXNzX2NmZl9maWVsZF9oYW5kbGVycyksIHNyYy9jZmYvY2ZmcGljLmMKLQkoY2ZmX2RyaXZlcl9jbGFzc19waWNfaW5pdCksIHNyYy9wc2hpbnRlci9wc2hwaWMuYwotCShwc2hpbnRlcl9tb2R1bGVfY2xhc3NfcGljX2luaXQpLCBzcmMvcHNuYW1lcy9wc3BpYy5jCi0JKHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19pbml0KSwgc3JjL3Jhc3Rlci9yYXN0cGljLmMKLQkoZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCksIHNyYy9zZm50L3NmbnRwaWMuYwotCShzZm50X21vZHVsZV9jbGFzc19waWNfaW5pdCksIHNyYy9zZm50L3R0Y21hcC5jCi0JKEZUX0NyZWF0ZV9DbGFzc190dF9jbWFwX2NsYXNzZXMpLCBzcmMvc21vb3RoL2Z0c3BpYy5jCi0JKGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCksIHNyYy90cnVldHlwZS90dHBpYy5jCi0JKHR0X2RyaXZlcl9jbGFzc19waWNfaW5pdCk6IEluaXRpYWxpemUgYWxsb2NhdGlvbiB2YXJpYWJsZS4KLQotMjAxMi0wOC0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggY29tcGlsYXRpb24gd2FybmluZy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoSVNfSElOVEVEKTogTW92ZSBtYWNybyB0by4uLgotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5oOiBUaGlzIGhlYWRlciBmaWxlLgotCi0yMDEyLTA4LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdCwgY2ZmLCBwc2hpbnRlciwgcHNuYW1lc10gTW9yZSByZW5hbWluZ3MgZm9yIG9ydGhvZ29uYWxpdHkuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMsIHNyYy9hdXRvZml0L2FmcGljLmg6Ci0Jcy9BRl9BVVRPRklUVEVSXy9BRl8vLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMsIHNyYy9jZmYvY2Zmb2Jqcy5jLCBzcmMvY2ZmL2NmZnBhcnNlLmMsCi0Jc3JjL2NmZi9jZmZwaWMuaDogcy9GVF9DRkZfL0NGRl8vLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNobW9kLmMsIHNyYy9wc2hpbnRlci9wc2hwaWMuaDoKLQlzL0ZUX1BTSElOVEVSXy9QU0hJTlRFUl8vLgotCi0JKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jLCBzcmMvcHNuYW1lcy9wc3BpYy5oOgotCXMvRlRfUFNDTUFQUy9QU0NNQVBTXy8uCi0KLTIwMTItMDgtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50LCB0cnVldHlwZV0gTW9yZSByZW5hbWluZ3MgZm9yIG9ydGhvZ29uYWxpdHkuCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMsIHNyYy9zZm50L3NmbnRwaWMuaCwgc3JjL3NmbnQvdHRjbWFwLmMsCi0Jc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMsIHNyYy90cnVldHlwZS90dHBpYy5oOiBzL0ZUX1NGTlRfL1NGTlRfLywKLQlzL0ZUX1RUXy9UVF8vLCBzL0dFVF9DTUFQX0lORk9fR0VUL0NNQVBfSU5GT19HRVQvLgotCi0yMDEyLTA4LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gU29tZSBtYWNybyBhbmQgdmFyaWFibGUgcmVuYW1pbmdzIGZvciBvcnRob2dvbmFsaXR5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmgsIHNyYy9iYXNlL2Z0b2Jqcy5jLAotCXNyYy9hdXRvZml0L2FmbW9kdWxlLmMsIHNyYy9hdXRvZml0L2FmcGljLmMsIHNyYy9hdXRvZml0L2FmcGljLmg6Ci0Jcy9TRVJWSUNFL0lOVEVSRkFDRS8sIHMvc2VydmljZS9pbnRlcmZhY2UvLCBzL1NlcnZpY2UvSW50ZXJmYWNlLy4KLQotMjAxMi0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzcxNzguCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9PcGVuX0ZhY2UpOiBJbml0aWFsaXplIGBlcnJvcicgd2l0aAotCWBGVF9FcnJfTWlzc2luZ19Nb2R1bGUnIGJlZm9yZSBsb29wIHRvIGluZGljYXRlIGBubyB2YWxpZCBkcml2ZXJzJy4KLQotMjAxMi0wOC0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHN5bnRoLmMgKEZUX0dseXBoU2xvdF9PYmxpcXVlKTogRml4IHNoZWFyIGFuZ2xlLgotCi0JVGhlIG9sZCB2YWx1ZSB3YXMgZmFyIHRvbyBsYXJnZSAobW9yZSB0aGFuIDIwwrApLiAgVGhlIG5ldyBvbmUKLQljb3JyZXNwb25kcyB0byAxMsKwLCBxdWl0ZSBjb21tb24gaW4gdHlwb2dyYXBoeS4KLQotMjAxMi0wOC0xMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gRml4IFNhdmFubmFoIGJ1ZyAjMzcwMTcuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9jdWJpYyk6IFVzZSBhIGRpZmZlcmVudCBzZXQgb2YKLQljaGVja3Mgd2hlbiBkZXRlY3Rpbmcgc3VwZXIgY3Vydnkgc3BsaW5lcyB0byBiZSBzcGxpdC4KLQotMjAxMi0wOC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEltcHJvdmUgcmVjb2duaXRpb24gb2YgZmxhdCBzZWdtZW50cy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgQnJhZCBEdW56ZXIgPEJEdW56ZXJAZXh0ZW5zaXMuY29tPi4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBXZSBoYXZlCi0JYSBmbGF0IHNlZ21lbnQgaWYgdGhlIGhvcml6b250YWwgZGlzdGFuY2Ugb2YgYmVzdCBvbi1wb2ludHMgaXMKLQlsYXJnZXIgdGhhbiBhIGdpdmVuIHRocmVzaG9sZC4KLQotMjAxMi0wOC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFZhcmlhYmxlIHJlbmFtaW5ncy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBSZXBsYWNlCi0JYGdseXBoJyB3aXRoIGBvdXRsaW5lJy4KLQlzL2Jlc3RfZmlyc3QvYmVzdF9jb250b3VyX2ZpcnN0Ly4KLQlzL2Jlc3RfbGFzdC9iZXN0X2NvbnRvdXJfbGFzdC8uCi0KLTIwMTItMDctMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gRml4IFNhdmFubmFoIGJ1ZyAjMzcwMDAuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZW5jb2RpbmcpOiBGaXggb3JkZXIgb2YgY2hlY2tzLgotCi0yMDEyLTA3LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNhdXhdIEZpeCBTYXZhbm5haCBidWcgIzM2ODMzLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFvcGVyYXRvcl9zZWFjKTogYHNlYWMnIGlzIG5vdCBhIHZhbGlkCi0Jb3BlcmF0b3IgaWYgd2Ugd2FudCBtZXRyaWNzIG9ubHkuCi0KLTIwMTItMDctMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gRml4IFNhdmFubmFoIGJ1ZyAjMzY4MzIuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfY2hhcnN0cmluZ3MpOiBSZWplY3QgbmVnYXRpdmUgbnVtYmVyIG9mCi0JZ2x5cGhzLgotCi0yMDEyLTA3LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTFdIEZpeCBTYXZhbm5haCBidWcgIzM2ODI5LgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2VuY29kaW5nKTogQ2hlY2sgY3Vyc29yIHBvc2l0aW9uIGFmdGVyCi0JY2FsbCB0byBUMV9Ta2lwX1BTX1Rva2VuLgotCi0yMDEyLTA3LTEyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlSZXZlcnQgdGhlIGxhc3QgY29tbWl0IDQ1MzM3YjA3LgotCi0JKiBzcmMvYmFzZS9mdHN0cm9rZS5jIChGVF9TdHJva2VyX05ldyk6IFJldmVydCB0aGUgcHJldmlvdXMgY2hhbmdlLgotCi0yMDEyLTA3LTExICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbZnRzdHJva2VdIEZpeCB1bmluaXRpYWxpemVkIHJldHVybiB2YWx1ZS4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoRlRfU3Ryb2tlcl9OZXcpOiBSZXR1cm4gRlRfRXJyX09rIGluc3RlYWQuCi0KLTIwMTItMDctMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzbW9vdGhdIEF2b2lkIG1lbW9yeSBsZWFrIGluIGNhc2Ugb2YgZmFpbHVyZS4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBVc2UgZmxhZ3MgdG8KLQlpbmRpY2F0ZSB3aGF0IHRvIGNsZWFuIHVwIGFmdGVyIGZpbmlzaGluZyB0aGUgZnVuY3Rpb24sIHdpdGggYW5kCi0Jd2l0aG91dCBlcnJvcnMuCi0KLTIwMTItMDctMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjb21waWxhdGlvbiB3aXRoIE1TVkMgNS4wLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBQZXRlciBCcmVpdGVubG9obmVyIGFuZCBBa2lyYSBLYWt1dG8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmggKGZ0X3NldGptcCk6IFVwZGF0ZWQuCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfZmFjZV9idWlsZF9jbWFwcyk6IFJlbW92ZSBjYXN0LgotCi0yMDEyLTA3LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSBkZWJ1Z2dpbmcgbWVzc2FnZXM7IGRvIHNvbWUgY29kZSBjbGVhbnVwLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2FsaWduX2xpbmtlZF9lZGdlLAotCWFmX2xhdGluX2hpbnRfZWRnZXMpOiBTeW5jaHJvbml6ZSB3aXRoIGZvcm1hdHRpbmcgdXNlZCBpbiB0aGUKLQl0dGZhdXRvaGludCBwcm9qZWN0LgotCi0yMDEyLTA3LTA3ICBHaWxsZXMgRXNwaW5hc3NlICA8Zy5lc3BAZnJlZS5mcj4KLQotCUZpeCBzdHJpY3QtYWxpYXNpbmcgd2FybmluZy4KLQotCSogc3JjL2Jhc2UvZnRnbHlwaC5jIChGVF9HbHlwaF9Ub19CaXRtYXApOiBBdm9pZCBkb3VibGUgY2FzdC4KLQotMjAxMi0wNy0wNyAgRGF2ZSBUaG9tYXMgIDxkYXZlLnRob21hc0BtZXRhZm9yaWMuY29tPgotCi0JW0FSTV0gRml4IEZUX011bEZpeF9hcm0uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmggKEZUX011bEZpeF9hcm0pIFtfX2FybV9fXToKLQlBdm9pZCBBRERTIGluc3RydWN0aW9uIHRvIGNsb2JiZXIgY29uZGl0aW9uIGNvZGVzLgotCi0yMDEyLTA3LTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gRG8gc29tZSBjb2RlIGNsZWFudXAuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19uZXcpOiBTaW1wbGlmeS4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jOiBVc2UgYEZUX1RSQUNFNycgaW5zdGVhZCBvZiBgcHJpbnRmJwotCWV2ZXJ5d2hlcmUuCi0JKEZUX0NPTVBPTkVOVCk6IE5ldyBtYWNyby4KLQkoYWZfZ2x5cGhfaGludHNfZG9uZSk6IFNpbXBsaWZ5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogVXBkYXRlZC4KLQotMjAxMi0wNy0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEltcHJvdmUgb3V0cHV0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzKTogUHJpbnQgbW9yZQotCWRhdGE7IHJlcG9ydCBubyBkYXRhLgotCShhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzKTogUmVwb3J0IG5vIGRhdGEuCi0KLTIwMTItMDctMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggU2F2YW5uYWggYnVnICMzNjA5MS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpLAotCXNyYy9hdXRvZml0L2FmbGF0aW4yLmMgKGFmX2xhdGluMl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBDaGFuZ2UgdGhlCi0JY29uc3RyYWludCBmb3IgdGVzdGluZyByb3VuZCB2cy4gZmxhdCBzZWdtZW50OiBBY2NlcHQgZWl0aGVyIGEKLQlzbWFsbCBkaXN0YW5jZSBvciBhIHNtYWxsIGFuZ2xlLgotCi0yMDEyLTA3LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQmVhdXRpZnkgYmx1ZSB6b25lIHRyYWNpbmcuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKSwKLQlzcmMvYXV0b2ZpdC9hZmxhdGluMi5jIChhZl9sYXRpbjJfbWV0cmljc19pbml0X2JsdWVzKTogSW1wbGVtZW50IGl0LgotCi0yMDEyLTA3LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gUXVhbnRpemUgc3RlbSB3aWR0aHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmYW5nbGVzLmMgKGFmX3NvcnRfd2lkdGhzKTogUmVuYW1lIHRvLi4uCi0JKGFmX3NvcnRfYW5kX3F1YW50aXplX3dpZHRocyk6IFRoaXMuCi0JQWRkIGNvZGUgdG8gYXZvaWQgc3RlbSB3aWR0aHMgd2hpY2ggYXJlIGFsbW9zdCBpZGVudGljYWwuCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmgsIHNyYy9hdXRvZml0L2FmbGF0aW4uYywgc3JjL2F1dG9maXQvYWZjamsuYzoKLQlVcGRhdGVkLgotCi0yMDEyLTA3LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWlub3Igc3BlZWQtdXAuCi0KLQkqIHNyYy9hdXRvZml0L2FmYW5nbGVzIChhZl9zb3J0X3BvcywgYWZfc29ydF93aWR0aHMpOiBEb24ndCBzd2FwCi0JZWxlbWVudHMgaWYgdGhleSBhcmUgZXF1YWwuCi0KLTIwMTItMDYtMzAgIEdpbGxlcyBFc3BpbmFzc2UgIDxnLmVzcEBmcmVlLmZyPgotCi0JRml4IGBjaGVja2luZyBpZiBnY2Mgc3RhdGljIGZsYWcgLXN0YXRpYyB3b3JrcycgdGVzdC4KLQotCU9uIG15IGxpbnV4IGJ1aWxkIHRyZWUsIEkgcmVjZWl2ZSB5ZXMgYW5zd2VyIGluIGV2ZXJ5IHBhY2thZ2UgSQotCWJ1aWxkIGV4Y2VwdCBmcmVldHlwZSBmb3IgdGhpcyB0ZXN0IGNoZWNraW5nIGlmIGdjYyBzdGF0aWMgZmxhZwotCWAtc3RhdGljJyB3b3JrcwotCi0JT24gZnJlZXR5cGUsIG5vIGlzIHJlY2VpdmVkLCB1bmxlc3MgYnppcDIgYW5kIHpsaWIgYXJlIGRpc2FibGVkIHVzaW5nCi0KLQkgIC4vY29uZmlndXJlIC0td2l0aG91dC1iemlwMiAtLXdpdGhvdXQtemxpYgotCi0JVGhlIHJlYXNvbiBpcyB0aGF0IGJ6aXAyIGFuZCB6bGliIHRlc3RzIGFkZCBgLWx6JyBhbmQgYC1sYnoyJyB0bwotCUxERkxBR1MgYW5kIHRoaXMgYnJva2Ugc3RhdGljIGZsYWcgdGVzdC4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogVXBkYXRlIENGTEFHUyBhbmQgTERGTEFHUyBvbmx5IGFmdGVyCi0JTFRfSU5JVCBoYXMgcnVuLgotCi0yMDEyLTA2LTI4ICBJbmZpbmFsaXR5ICA8aW5maW5hbGl0eUBpbmZpbmFsaXR5Lm5ldD4KLQotCVt0cnVldHlwZV0gRml4IHZhcmlvdXMgYXJ0aWZhY3RzLgotCi0JVmVyZGFuYSB3YXMgYnJva2VuIGluIHRoZSBvcmlnaW5hbCBJbmZpbmFsaXR5IGNvbW1pdC4gIEFsc28KLQlpbmNsdWRlcyBvdGhlciBtaW5vciBmaXhlcy4KLQotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4Lmg6IFVwZGF0ZWQuICBSZW1vdmVkIHVudXNlZCBtYWNyb3MuCi0JKFJBU1RFUklaRVJfMzVfUnVsZXMpOiBBZGQgVmVyZGFuYS4KLQkoU0tJUF9OT05QSVhFTF9ZX01PVkVTX1J1bGVzKTogQWRkIFRhaG9tYSBgcycuCi0JKE1JUlBfQ1ZUX1pFUk9fUnVsZXMpOiBSZW1vdmUgVmVyZGFuYS4KLQkoQUxXQVlTX1NLSVBfREVMVEFQX1J1bGVzKTogQWRkIFJ1c3NpYW4gY2hhciAweDQzOC4KLQkoQ09NUEFUSUJMRV9XSURUSFNfUnVsZXMpOiBSZWFycmFuZ2Ugc29tZSBydWxlcy4KLQkoWF9TQ0FMSU5HX1J1bGVzKTogQWRqdXN0IFZlcmRhbmEgYGEnIGF0IDEyIGFuZCAxMyBwcGVtLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYzogVXBkYXRlZC4KLQkoc3BoX3NldF90d2Vha3MpOiBSZS1leGVjdXRlIGZwZ20gYWx3YXlzLgotCi0yMDEyLTA2LTI4ICBHaWxsZXMgRXNwaW5hc3NlICA8Zy5lc3BAZnJlZS5mcj4KLQotCUZpeCBDRkxBR1MgYW5kIExERkxBR1Mgc2hhcmUgY29uZmlndXJlIHRlc3QuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IEZpeCB0eXBvLgotCi0yMDEyLTA2LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFNldCB0aGUgYHN1YnBpeGVsX3Bvc2l0aW9uZWQnIGZsYWcgdW5jb25kaXRpb25hbGx5LgotCi0JVGhpcyBpcyBob3cgdGhlIGNvZGUgY3VycmVudGx5IGJlaGF2ZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKHR0X2xvYWRlcl9pbml0KTogRG8gaXQuCi0KLTIwMTItMDYtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjb25kaXRpb25hbCBjb21waWxhdGlvbi4KLQotCSogc3JjL2Jhc2UvYmFzZXBpYy5jOiBVc2UgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMuCi0KLTIwMTItMDYtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjb25kaXRpb25hbCBjb21waWxhdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCAoRlRfTXVsRGl2X05vX1JvdW5kKTogRG9uJ3QKLQllbmNsb3NlIHdpdGggYFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUic7IHdlIG5vdyBuZWVkIHRoZSBmdW5jdGlvbgotCWVsc2V3aGVyZSBhbHNvLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5oOiBVc2UgQUZfQ09ORklHX09QVElPTl9DSksuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKHR0X2xvYWRlcl9pbml0KTogRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTVNJUlApOiBGaXggY29tcGlsZXIgd2FybmluZy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmg6IFVzZQotCVRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIuCi0KLTIwMTItMDYtMjYgIEluZmluYWxpdHkgIDxpbmZpbmFsaXR5QGluZmluYWxpdHkubmV0PgotCi0JW3RydWV0eXBlXSBSZW1vdmUgdW51c2VkIHJvdW5kaW5nIGZ1bmN0aW9uYWxpdHkuCi0KLQlUaGUgc3VicGl4ZWwgaGludGluZyBwYXRjaCBjb250YWluZWQgdGhlIGNvbmNlcHQgb2YgYW4gYWRqdXN0YWJsZQotCW51bWJlciBvZiBncmlkbGluZXMgcGVyIHBpeGVsLiAgVGhpcyBpcyBubyBsb25nZXIgdXNlZCBkdWUgdG8geAotCWJlaW5nIGNvbXBsZXRlbHkgaWdub3JlZCBpbnN0ZWFkLiAgVGhpcyB3aWxsIHJldHVybiBzb21lIG9mIHRoZQotCWNvZGUgdG8gaXRzIGV4aXN0aW5nIHN0YXRlIHByaW9yIHRvIHRoZSBvcmlnaW5hbCBJbmZpbmFsaXR5Ci0JY29tbWl0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9QSVhfRkxPT1JfR1JJRCwKLQlGVF9QSVhfUk9VTkRfR1JJRCwgRlRfUElYX0NFSUxfR1JJRCk6IFJlbW92ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jOiBVcGRhdGVkLgotCShSb3VuZF9Ob25lLCBSb3VuZF9Ub19HcmlkLCBSb3VuZF9Ub19IYWxmX0dyaWQsIFJvdW5kX0Rvd25fVG9fR3JpZCwKLQlSb3VuZF9VcF9Ub19HcmlkLCBSb3VuZF9Ub19Eb3VibGVfR3JpZCwgUm91bmRfU3VwZXIsIFJvdW5kX1N1cGVyXzQ1LAotCVNldFN1cGVyUm91bmQpOiBSZW1vdmUgcGFyYW1ldGVyIHRvIGhhbmRsZSB0aGUgbnVtYmVyIG9mIGdyaWQgbGluZXMgcGVyCi0JcGl4ZWwuCi0JKFNFVF9TdXBlclJvdW5kLCBST1VORF9Ob25lLCBDVVJfRnVuY19yb3VuZCk6IFVwZGF0ZWQuCi0JKERPX1NST1VORCwgRE9TNDVST1VORCwgRE9fT0RELCBET19FVkVOKTogVXBkYXRlZC4KLQkoRE9fUk9VTkQsIERPX05ST1VORCk6IFVwZGF0ZWQuCi0JKE1vdmVfWnAyX1BvaW50LCBJbnNfU0hQSVgsIEluc19NU0lSUCwgSW5zX01EQVAsIEluc19NSUFQLAotCUluc19NRFJQLCBJbnNfTUlSUCk6IFBlcmZvcm0gUm91bmRfTm9uZSBpbnN0ZWFkIG9mIGNhbGxpbmcgYSBtb2RpZmllZAotCXJvdW5kaW5nIGZ1bmN0aW9uLiAgUmVtb3ZlIGdyaWRsaW5lc19wZXJfcGl4ZWwuICBDcmVhdGUgYSBsb2NhbAotCXZhcmlhYmxlIHRvIHN0b3JlIGNvbnRyb2wgdmFsdWUgY3V0aW4uIFNpbXBsaWZ5IHRoZSBjb25kaXRpb25hbCBmb3IKLQlpZ25vcmVfeF9tb2RlLiAgQWRqdXN0IHJvdW5kaW5nIGNhbGxzIHRvIHBhc3Mgb25seSB0d28gdmFsdWVzLgotCi0yMDEyLTA2LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBGaXggU2F2YW5uYWggYnVnICMzNjcwNS4KLQotCUhhbmRsZSBudW1iZXJzIGxpa2UgMi4wMDEgY29ycmVjdGx5LgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9yZWFsKTogQXZvaWQgbmVnYXRpdmUgdmFsdWVzIGZvcgotCWBzaGlmdCcuCi0KLTIwMTItMDYtMTggIEluZmluYWxpdHkgIDxpbmZpbmFsaXR5QGluZmluYWxpdHkubmV0PgotCi0JW3RydWV0eXBlXSBTdXBwb3J0IHN1YnBpeGVsIGhpbnRpbmcuCi0KLQlUaGlzIGlzIHRoZSBsYXJnZSwgZmFtb3VzIGBJbmZpbmFsaXR5JyBwYXRjaCB0byBzdXBwb3J0IENsZWFyVHlwZQotCWJ5dGVjb2RlIHdoaWNoIGhhcyBiZWVuIGF2YWlsYWJsZSBmcm9tCi0JaHR0cDovL3d3dy5pbmZpbmFsaXR5Lm5ldC9ibG9nLyBmb3Igc29tZSB0aW1lLCBhbmQgd2hpY2ggaGFzIGJlZW4KLQlyZWZpbmVkIG92ZXIgdGhlIGxhc3QgeWVhcnMuICBXaGlsZSBzdGlsbCBleHBlcmltZW50YWwsIGl0IGlzIG5vdwotCW1hdHVyZSBlbm91Z2ggdG8gYmUgaW5jbHVkZWQgZGlyZWN0bHkgaW50byBGcmVlVHlwZS4KLQotCU1vc3Qgb2YgdGhlIGNvZGUgaXMgYmFzZWQgb24gdGhlIENsZWFyVHlwZSB3aGl0ZXBhcGVyIHdyaXR0ZW4gYnkKLQlHcmVnIEhpdGNoY29jawotCi0JICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9jbGVhcnR5cGUvdHJ1ZXR5cGVjbGVhcnR5cGUuYXNweAotCi0Jd2hpY2ggZ2l2ZXMgYSBkZXRhaWxlZCBvdmVydmlldyBvZiB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gdGhlCi0JTWljcm9zb2Z0IHJhc3Rlcml6ZXIgc28gdGhhdCBvbGRlciBmb250cyBhcmUgc3VwcG9ydGVkLiAgSG93ZXZlciwgYQotCWxvdCBvZiBkZXRhaWxzIGFyZSBzdGlsbCBtaXNzaW5nLCBhbmQgdGhpcyBwYXRjaGVzIHByb3ZpZGVzIGEKLQlmcmFtZXdvcmsgdG8gZWFzaWx5IGhhbmRsZSByZW5kZXJpbmcgaXNzdWVzIGRvd24gdG8gdGhlIGdseXBoIGxldmVsCi0Jb2YgY2VydGFpbiBmb250cy4KLQotCU5vdGUgdGhhdCBDbGVhclR5cGUgc3VwcG9ydCBpcyBub3QgY29tcGxldGVseSBpbXBsZW1lbnRlZCEgIEluCi0JcGFydGljdWxhciwgZnVsbCBzdXBwb3J0IGZvciB0aGUgb3B0aW9ucyBgY29tcGF0aWJsZV93aWR0aHMnLAotCWBzeW1tZXRyaWNhbF9zbW9vdGhpbmcsIGFuZCBgYmdyJyAodmlhIHRoZSBHRVRJTkZPIGJ5dGVjb2RlCi0JaW5zdHJ1Y3Rpb24pIGlzIG1pc3NpbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5jOiBOZXcgZmlsZSwgcHJvdmlkaW5nIGNvZGUgdG8gaGFuZGxlCi0JYHR3ZWFrcycsIHRoaXMgaXMsIHJ1bGVzIGZvciBjZXJ0YWluIGdseXBocyBpbiBjZXJ0YWluIGZvbnRzCi0JKGluY2x1ZGluZyB3aWxkY2FyZHMpIHdoaWNoIG5lZWQgYSBzcGVjaWFsIHRyZWF0bWVudC4KLQotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4Lmg6IE5ldyBmaWxlLCBob2xkaW5nIHRoZSB0d2Vha2luZyBydWxlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCwgc3JjL2RldmVsL2Z0b3B0aW9uLmgKLQkoVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HKTogTmV3IG1hY3JvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9QSVhfRkxPT1JfR1JJRCwKLQlGVF9QSVhfUk9VTkRfR1JJRCwgRlRfUElYX0NFSUxfR1JJRCk6IE5ldyBtYWNyb3MuCi0KLQkqIHNyYy90cnVldHlwZS90cnVldHlwZS5jIFtUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVJdOiBJbmNsdWRlCi0JYHR0c3VicGl4LmMnLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jOiBJbmNsdWRlIGB0dHN1YnBpeC5oJy4KLQlbQWxsIGNoYW5nZXMgYmVsb3cgYXJlIGd1YXJkZWQgYnkgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HLl0KLQotCSh0dF9nZXRfbWV0cmljcyk6IFNldCB0d2VhayBmbGFncy4KLQkoVFRfSGludF9HbHlwaCk6IENhbGwgYEZUX091dGxpbmVfRW1ib2xkZW5YWScgaWYgbmVjZXNzYXJ5LgotCShUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCk6IENvbXBlbnNhdGUgZW1ib2xkZW5pbmcgaWYgbmVjZXNzYXJ5LgotCShjb21wdXRlX2dseXBoX21ldHJpY3MpOiBIYW5kbGUgYGNvbXBhdGlibGUgd2lkdGhzJyBvcHRpb24uCi0JKHR0X2xvYWRlcl9pbml0KTogSGFuZGxlIENsZWFyVHlwZSBHRVRJTkZPIGluZm9ybWF0aW9uIGJpdHMuCi0KLQkqIHNyYy90cnVldHlwZS9ydWxlcy5tayAoVFRfRFJWX1NSQyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jOiBJbmNsdWRlIGB0dHN1YnBpeC5oJy4KLQlbV2hlcmUgbmVjZXNzYXJ5LCBjaGFuZ2VzIGJlbG93IGFyZSBndWFyZGVkIGJ5Ci0JVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HLl0KLQotCShEaXJlY3RfTW92ZSwgRGlyZWN0X01vdmVfWCk6IEV4dGVuZGVkLgotCShSb3VuZF9Ob25lLCBSb3VuZF9Ub19HcmlkLCBSb3VuZF9Ub19IYWxmX0dyaWQsIFJvdW5kX0Rvd25fVG9fR3JpZCwKLQlSb3VuZF9VcF9Ub19HcmlkLCBSb3VuZF9Ub19Eb3VibGVfR3JpZCwgUm91bmRfU3VwZXIsIFJvdW5kX1N1cGVyXzQ1LAotCVNldFN1cGVyUm91bmQpOiBBZGQgcGFyYW1ldGVyIHRvIGhhbmRsZSB0aGUgbnVtYmVyIG9mIGdyaWQgbGluZXMgcGVyCi0JcGl4ZWwuCi0JKFNFVF9TdXBlclJvdW5kLCBST1VORF9Ob25lLCBDVVJfRnVuY19yb3VuZCk6IFVwZGF0ZWQuCi0JKERPX1NST1VORCwgRE9TNDVST1VORCwgRE9fT0RELCBET19FVkVOKTogVXBkYXRlZC4KLQkoRE9fUk9VTkQsIERPX05ST1VORCk6IFVwZGF0ZWQuCi0JKERPX1JTKTogVGFrZSBjYXJlIG9mIGBUeXBlbWFuJyBieXRlY29kZSBwYXR0ZXJucy4KLQkoSW5zX0ZERUYpOiBBZGQgc29tZSBkZWJ1Z2dpbmcgY29kZS4gIENvbW1lbnRlZCBvdXQuCi0JKEluc19FTkRGKTogUmVzdG9yZSBzdGF0ZS4KLQkoSW5zX0NBTEwsIEluc19MT09QQ0FMTCk6IEhhbmRsZSBpbmxpbmUgZGVsdGEgZnVuY3Rpb25zLgotCShJbnNfTUQpOiBIYW5kbGUgYFZhY3Vmb3JtJyByb3VuZHMuCi0JKE1vdmVfWnAyX1BvaW50LCBJbnNfU0hQSVgsIEluc19NU0lSUCwgSW5zX01EQVAsIEluc19NSUFQLAotCUluc19NRFJQLCBJbnNfTUlSUCk6IEhhbmRsZSB0d2Vha3MuCi0JKEluc19BTElHTlJQKTogQWRkIHR3ZWFrIGd1YXJkLgotCShJbnNfSVVQLCBJbnNfREVMVEFQKTogSGFuZGxlIHR3ZWFrcy4KLQkoSW5zX0dFVElORk8pOiBIYW5kbGUgbmV3IENsZWFyVHlwZSBiaXRzLgotCShUVF9SdW5JbnMpOiBIYW5kbGUgdHdlYWtzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaDogVXBkYXRlZC4KLQkoU1BIX1R3ZWFrUnVsZSwgU1BIX1NjYWxlUnVsZSk6IE5ldyBzdHJ1Y3R1cmVzIGZvciB0d2Vha3MuCi0JKFRUX0V4ZWNDb250ZXh0UmVjKTogQWRkIG1lbWJlcnMgZm9yIHN1YnBpeGVsIGhpbnRpbmcgc3VwcG9ydC4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5oIChUVF9EZWZSZWNvcmQpOiBBZGQgYGlubGluZV9kZWx0YScgbWVtYmVyLgotCi0yMDEyLTA2LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi40LjEwIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNC0xMCcuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi40LjEwLgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksCi0JYnVpbGRzL3dpbjMyL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDUvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwOC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAxMC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwgYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi40LjkvMi40LjEwLywgcy8yNDkvMjQxMC8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gMTAuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxNTowOjkuCi0KLTIwMTItMDYtMTUgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRzeW50aC5jIChGVF9HbHlwaFNsb3RfRW1ib2xkZW4pOiBJbXByb3ZlIHNwYWNpbmcuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxMi0wNi0xNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogYnVpbGRzL2V4cG9ydHMubWs6IEFkZCBDQ2V4ZV9DRkxBR1MgYW5kIENDZXhlX0xERkxBR1MuCi0KLQl0byBwYXNzIHNwZWNpYWwgY29tcGlsZXIvbGlua2VyIGZsYWdzIHVuZGVyIGNyb3NzIGRldmVsb3BtZW50LgotCVN1Z2dlc3RlZCBieSBTYXZhbm5haCBidWcgIzM2MzY3LgotCi0JQ2hhbmdlTG9nIG9uIDIwMTAtMDctMTUgc2F5aW5nIGFzIHRoZXkgd2VyZSByZW1vdmVkIHdhcyB3cm9uZwotCWZvciB0aGUgb2ZmaWNpYWwgdHJ1bmsgb2YgRnJlZVR5cGUyLiAgVGhpcyBjb21taXQgaXMgdGhlIGZpcnN0Ci0JaW50cm9kdWN0aW9uIG9mIHRoZW0uCi0KLTIwMTItMDYtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDEyLTA2LTE0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW3RydWV0eXBlXSBBZGQgbmV3IHZlcnNpb25zIG9mIE5FQyBGQSBmYW1pbHkgdG8gdHJpY2t5IGZvbnQgbGlzdC4KLQotCU5FQyBGQSBmYW1pbHkgZGF0ZWQgaW4gMTk5NiBoYXZlIGRpZmZlcmVudCBjaGVja3N1bS4KLQlSZXBvcnRlZCBieSBKb2huc29uIFkuIFlhbiA8eWluc2VuX3lhbkBmb3hpdHNvZnR3YXJlLmNvbT47IHNlZQotCi0JICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMi0wNi9tc2cwMDAyMy5odG1sCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfY2hlY2tfdHJpY2t5bmVzc19zZm50X2lkcyk6IDQgc2V0cwotCW9mIGZwZ20gJiBwcmVwIHRhYmxlIGNoZWNrc3VtcyBmb3IgRkEtR290aGljLCBGQS1NaW5jaG91LAotCUZBLVJvdW5kZWRHb3RoaWNNLCBGQS1Sb3VuZGVkR290aGljQiBhcmUgYWRkZWQuICBUaGUgZmFtaWx5Ci0JbmFtZXMgaW4gc2FtcGxlIFBERiBhcmUgdHJ1bmNhdGVkLCB0aHVzIHRoZSBsaXN0IG9mIHRoZQotCWZhbWlseSBuYW1lcyBpbiB0dF9jaGVja190cmlja3luZXNzX2ZhbWlseSgpIGlzIG5vdCB1cGRhdGVkIHlldC4KLQotMjAxMi0wNi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Z0cmFzdGVyXSBGaXggcm91bmRpbmcgaXNzdWUgY2F1c2luZyB2aXN1YWwgYXJ0aWZhY3RzLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBqb2xhIDxoYW5zLWpvY2hlbi5sYXVAbGhzeXN0ZW1zLmNvbT47IHNlZQotCi0JICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMi0wNS9tc2cwMDAzNi5odG1sCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoU011bERpdl9Ob19Sb3VuZCk6IE5ldyBtYWNyby4KLQkoTGluZV9VcCk6IFVzZSBpdC4KLQkqIHNyYy9yYXN0ZXIvZnRtaXNjLmggKEZUX011bERpdl9Ob19Sb3VuZCk6IENvcGllZCBmcm9tIGBmdGNhbGMuYycuCi0KLTIwMTItMDUtMjggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbik6IFNpbXBsaWZ5LgotCi0JV2Ugbm93IHVzZSB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgZGlyZWN0aW9uIHZlY3RvcnMgdG8gY29tcHV0ZSB0aGUKLQlvdXRsaW5lJ3Mgb3JpZW50YXRpb24uCi0KLTIwMTItMDUtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDEyLTA1LTI4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlOZXcgZnVuY3Rpb24gRlRfT3V0bGluZV9FbWJvbGRlblhZLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaCAoRlRfT3V0bGluZV9FbWJvbGRlblhZKTogRGVmaW5lIGl0LgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfRW1ib2xkZW5YWSk6IEltcGxlbWVudCBpdCwgdXNpbmcgYQotCXNpbXBsaWZpZWQgZW1ib2xkZW5pbmcgYWxnb3JpdGhtLgotCShGVF9PdXRsaW5lX0VtYm9sZGVuKTogTWFrZSBpdCBhIHNwZWNpYWwgY2FzZSBvZgotCWBGVF9PdXRsaW5lX0VtYm9sZGVuWFknCi0KLTIwMTItMDUtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gRml4IFNhdmFubmFoIGJ1ZyAjMzYzODYuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAodDFfbG9hZF9rZXl3b3JkKTogSWdub3JlIGtleXdvcmQgaWYgY29udGV4dCBpcwotCW5vdCB2YWxpZC4KLQotMjAxMi0wNC0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfR2x5cGgpCi0JWyFUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFNdOiBBY2Nlc3MgYGdseXBoLT5mYWNlJyBkaXJlY3RseS4KLQotMjAxMi0wMy0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFByb3Blcmx5IGNvcHkgc2NhbGVyIGZsYWdzIHRvIHNjcmlwdCBtZXRyaWNzIG9iamVjdC4KLQotCVdpdGhvdXQgdGhpcyBwYXRjaCwgb25seSB0aGUgZHVtbXkgYW5kIGNqayBhdXRvaGludGVyIG1vZHVsZXMgZ2V0Ci0JdGhlbSAoc2luY2UgdGhleSBjb3B5IHRoZSB3aG9sZSBzY2FsZXIgb2JqZWN0KS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX3NjYWxlKSwKLQlzcmMvYXV0b2ZpdC9hZmxhdGluMi5jIChhZl9sYXRpbjJfbWV0cmljc19zY2FsZSk6IEltcGxlbWVudCBpdC4KLQotMjAxMi0wMy0yMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2JkZmxpYl0gUmVtb3ZlIHJlZHVuZGFudCBtYWNyby4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoaXNkaWdvayk6IFJlbW92ZSBhbmQgcmVwbGFjZSB3aXRoIHNiaXRzZXQsIHdoaWNoCi0JaXMgZXhhY3RseSB0aGUgc2FtZS4KLQotMjAxMi0wMy0yMCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtjb25maWd1cmVdIEZpeCBTYXZhbm5haCBidWcgIzM1NjQ0LgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBDaGVjayBgLWFuc2knIGZsYWcgd29ya3MgZXZlbiBpZiBnY2MKLQlpcyB1c2VkLiAgQmlvbmljIGxpYmMgaGVhZGVycyBmb3IgQW5kcm9pZCBsb3NlIHRoZSBjb25zaXN0ZW5jeQotCXdoZW4gdGhleSBhcmUgcGFyc2VkIHdpdGggX19TVERDX1ZFUlNJT05fXyBvbGRlciB0aGFuIDE5OTkwMUwgb3IKLQlfX1NUUklDVF9BTlNJX18uCi0KLTIwMTItMDMtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGZdIEltcHJvdmVtZW50IHRvIFNhdmFubmFoIGJ1ZyAjMzU2NTYuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKGlzZGlnb2spOiBBZGQgY2FzdCwgYXMgc3VnZ2VzdGVkIGluIHJlcG9ydC4KLQotMjAxMi0wMy0xNyAgQ2hyaXMgTGlkZGVsbCAgPGNocmlzLmxpZGRlbGxAYXJ0aWZleC5jb20+Ci0KLQlbdHlwZTFdIEZpeCBTYXZhbm5haCBidWcgIzM1ODQ3LgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX3N1YnJzKTogRml4IHRoZSBsb29wIGV4aXQgY29uZGl0aW9uOwotCXdlIHdhbnQgdG8gZXhpdCB3aGVuIHdlIGhhdmUgcnVuIG91dCBvZiBkYXRhLgotCi0yMDEyLTAzLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBSZWFsbHkgZml4IFNhdmFubmFoIGJ1ZyAjMzU2NTguCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfbGlzdF9zcGxpdCk6IEFkZCBvbmUgbW9yZSBgZmllbGQnIGluaXRpYWxpemVyLgotCi0yMDEyLTAzLTE0ICBZYW5uIERyb25lYXVkICA8eWFubkBkcm9uZWF1ZC5mcj4KLQotCVtzZm50XSBNYWtlIGFycmF5cyBzdGF0aWMgbGlrZSBhbGwgb3RoZXJzLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX21heHAsIHR0X2ZhY2VfbG9hZF9vczIpLAotCXNyYy9zZm50L3R0bXR4LmMgKHR0X2ZhY2VfbG9hZF9oaGVhKTogQWRkIGBzdGF0aWMnIGtleXdvcmQgdG8gZnJhbWUKLQlmaWVsZHMuCi0KLTIwMTItMDMtMTQgIEh1dyBEYXZpZXMgIDxodXdAY29kZXdlYXZlcnMuY29tPgotCi0JW3NmbnRdIEEgcmVmaW5lbWVudCBvZiB0aGUgcHJldmlvdXMgY29tbWl0LgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAodHRfbmFtZV9lbnRyeV9hc2NpaV9mcm9tX3V0ZjE2LAotCXR0X25hbWVfZW50cnlfYXNjaWlfZnJvbV9vdGhlcik6IFN0b3AgYXQgbnVsbCBieXRlLgotCi0yMDEyLTAzLTE0ICBIdXcgRGF2aWVzICA8aHV3QGNvZGV3ZWF2ZXJzLmNvbT4KLQotCVtzZm50XSBBZGQgYG5hbWUnIHRhYmxlIGNvbXBhdGliaWxpdHkgdG8gTVMgV2luZG93cy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHR0X25hbWVfZW50cnlfYXNjaWlfZnJvbV91dGYxNiwKLQl0dF9uYW1lX2VudHJ5X2FzY2lpX2Zyb21fb3RoZXIpOiBEb24ndCByZXBsYWNlIGBcMCcgd2l0aCBxdWVzdGlvbgotCW1hcmtzIHdoZW4gY29udmVydGluZyBzdHJpbmdzLgotCi0yMDEyLTAzLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTFdIEZpeCBTYXZhbm5haCBidWcgIzM1ODMzLgotCi0JQmFzZWQgb24gdGhlIHBhdGNoIGdpdmVuIGluIHRoZSBidWcgcmVwb3J0LgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKElTX0lOQ1JFTUVOVEFMKTogTmV3IG1hY3JvLgotCShyZWFkX2JpbmFyeV9kYXRhKTogQWRkIHBhcmFtZXRlciBgaW5jcmVtZW50YWwnLgotCVVwZGF0ZSBhbGwgY2FsbGVycyB1c2luZyBgSVNfSU5DUkVNRU5UQUwnLgotCi0yMDEyLTAzLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gUmV0dXJuIGNvcnJlY3QgbGluZWFyIGFkdmFuY2Ugd2lkdGggdmFsdWVzLgotCi0JVGhpcyB3YXMgcXVpdGUgYSBzdWJ0bGUgYnVnIHdoaWNoIGFjY2lkZW50YWxseSBzaG93ZWQgdXAgd2l0aCBnbHlwaAotCWBhZmlpMTAwMjMnIG9mIGFyaWFsLnR0ZiAodmVyc2lvbiAyLjc2KS4gIFRoaXMgZ2x5cGggaXMgYSBjb21wb3NpdGU7Ci0JdGhlIGZpcnN0IGNvbXBvbmVudCwgYEUnLCBoYXMgYW4gYWR2YW5jZSB3aWR0aCBvZiAxMzY2IGZvbnQgdW5pdHMsCi0Jd2hpbGUgdGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGNvbXBvc2l0ZSBpdHNlbGYgKHdoaWNoIGxvb2tzIGxpa2UKLQl1cHBlcmNhc2UgYEUnIHdpdGggZGllcmVzaXMpIGlzIDEzNjcgZm9udCB1bml0cy4gIEkgdGhpbmsgdGhpcyBpcwotCWFjdHVhbGx5IGEgYnVnIGluIHRoZSBmb250IGl0c2VsZiwgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gdGhhdAotCXRoaXMgZ2x5cGggaGFzIG5vdCB0aGUgc2FtZSB3aWR0aCBhcyB1cHBlcmNhc2UgYEUnIHdpdGhvdXQgdGhlCi0JZGllcmVzaXMuICBBbnl3YXksIGl0IGhlbHBlZCBpZGVudGlmeSB0aGlzIHByb2JsZW0uCi0KLQlVc2luZyB0aGUgVHJ1ZVR5cGUgaGludGVyLCB0aGUgY29ycmVjdCB2YWx1ZSAoMTM2Nykgb2YgYGFmaWkxMDAyMycKLQl3YXMgcmV0dXJuZWQsIGJ1dCB0aGUgYXV0b2hpbnRlciBteXN0ZXJpb3VzbHkgcmV0dXJuZWQgMTM2Ni4KLQotCURpZ2dpbmcgaW4gdGhlIGNvZGUgc2hvd2VkIHRoYXQgdGhlIGF1dG9oaW50ZXIgcmVjdXJzaXZlbHkgY2FsbHMKLQlGVF9Mb2FkX0dseXBoIHRvIGxvYWQgdGhlIGdseXBoLCBhZGRpbmcgdGhlIEZUX0xPQURfTk9fU0NBTEUgbG9hZAotCWZsYWcuICBIb3dldmVyLCB0aGUgYGxpbmVhckhvcmlBZHZhbmNlJyBmaWVsZCBpcyBzdGlsbCByZXR1cm5lZCBhcyBhCi0Jc2NhbGVkIHZhbHVlLiAgVG8gYXZvaWQgc2NhbGluZyB0d2ljZSwgdGhlIG9sZCBjb2RlIGluIGF1dG9maXQgcmVzZXQKLQlgbGluZWFySG9yaUFkdmFuY2UnLCB1c2luZyB0aGUgYGhvcmlBZHZhbmNlJyBmaWVsZC4gIFRoaXMgc2VlbWVkIHRvCi0Jd29yayBzaW5jZSBGVF9MT0FEX05PX1NDQUxFIHdhcyBpbiB1c2UsIGJ1dCBpdCBmYWlsZWQgYWN0dWFsbHksCi0JYmVjYXVzZSBgaG9yaUFkdmFuY2UnIGlzIGRlZmluZWQgYXMgdGhlIGRpc3RhbmNlIG9mIHRoZSBmaXJzdAotCXN1YmdseXBoJ3MgcGhhbnRvbSBwb2ludHMsIHdoaWNoIGluIHR1cm4gYXJlIGluaXRpYWxpemVkIHVzaW5nIHRoZQotCWFkdmFuY2Ugd2lkdGggb2YgdGhlIGZpcnN0IHN1YmdseXBoLiAgQW5kIGFzIHRoZSBnaXZlbiBleGFtcGxlCi0Jc2hvd3MsIHRoZXNlIHdpZHRocyBjYW4gZGlmZmVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nKTogVGVtcG9yYXJpbHkgc2V0Ci0JRlRfTE9BRF9MSU5FQVJfREVTSUdOIHdoaWxlIGNhbGxpbmcgRlRfTG9hZF9HbHlwaCB0byBnZXQgdW5zY2FsZWQKLQl2YWx1ZXMgZm9yIHRoZSBsaW5lYXIgYWR2YW5jZSB3aWR0aHMuCi0KLTIwMTItMDMtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IFNTVyBpbnN0cnVjdGlvbi4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKERPX1NTVyk6IFNTVyAqZG9lcyogdXNlIGZvbnQgdW5pdHMuICBGb3IKLQl2ZXJpZmljYXRpb24sIGl0IHRvb2sgc29tZSB0aW1lIHRvIGZpbmQgYSBmb250IHdoaWNoIGFjdHVhbGx5IHVzZXMKLQl0aGlzIGluc3RydWN0aW9uLgotCi0yMDEyLTAzLTA5ICBWaW5uaWUgRmFsY28gIDx2aW5uaWUuZmFsY29AZ21haWwuY29tPgotCi0JUHJlcGFyZSBzb3VyY2UgY29kZSBmb3IgYW1hbGdhbWF0aW9uLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IFN3YXAgb3JkZXIgb2YgcHJlcHJvY2Vzc29yIGJsb2Nrcy4KLQotMjAxMi0wMy0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNC45IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNC05Jy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNC45LgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksCi0JYnVpbGRzL3dpbjMyL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDUvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwOC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAxMC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwgYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi40LjgvMi40LjkvLCBzLzI0OC8yNDkvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDkuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxNDoxOjguCi0KLTIwMTItMDMtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGZdIEFkZCBtaXNzaW5nIG92ZXJmbG93IGNoZWNrLgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3BhcnNlX2dseXBocykgPEJJVE1BUD46IEFkZCB0aHJlc2hvbGQgZm9yCi0JYGdseXBoLT5icHInLgotCi0yMDEyLTAzLTA3ICBWaW5uaWUgRmFsY28gIDx2aW5uaWUuZmFsY29AZ21haWwuY29tPgotCi0JUHJlcGFyZSBzb3VyY2UgY29kZSBmb3IgYW1hbGdhbWF0aW9uLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmVycm9ycy5oLCBzcmMvYmRmL2JkZmVycm9yLmgsIHNyYy9iemlwMi9mdGJ6aXAyLmMsCi0Jc3JjL2NhY2hlL2Z0Y2Vycm9yLmgsIHNyYy9jZmYvY2ZmZXJycy5oLCBzcmMvY2lkL2NpZGVycnMuaCwKLQlzcmMvZ3h2YWxpZC9neHZlcnJvci5oLCBzcmMvZ3ppcC9mdGd6aXAuYywgc3JjL2x6dy9mdGx6dy5jLAotCXNyYy9vdHZhbGlkL290dmVycm9yLmgsIHNyYy9wY2YvcGNmZXJyb3IuaCwgc3JjL3Bmci9wZnJlcnJvci5oLAotCXNyYy9wc2F1eC9wc2F1eGVyci5oLCBzcmMvcHNoaW50ZXIvcHNobnRlcnIuaCwKLQlzcmMvcHNuYW1lcy9wc25hbWVyci5oLCBzcmMvcmFzdGVyL3Jhc3RlcnJzLmgsIHNyYy9zZm50L3NmZXJyb3JzLmgsCi0Jc3JjL3Ntb290aC9mdHNtZXJycy5oLCBzcmMvdHJ1ZXR5cGUvdHRlcnJvcnMuaCwKLQlzcmMvdHlwZTEvdDFlcnJvcnMuaCwgc3JjL3R5cGU0Mi90NDJlcnJvci5oLCBzcmMvd2luZm9udHMvZm50ZXJycy5oOgotCUFkZCAjdW5kZWYgRlRfRVJSX1BSRUZJWCBiZWZvcmUgI2RlZmluZSBGVF9FUlJfUFJFRklYLgotCi0yMDEyLTAzLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzNTY2MC4KLQotCUZvciBzb21lIGRpdmlzaW9ucywgd2UgdXNlIGNhc3RzIHRvIDMyYml0IGVudGl0aWVzLiAgQWx3YXlzIGd1YXJkCi0JYWdhaW5zdCBkaXZpc2lvbiBieSB6ZXJvIHdpdGggdGhlc2UgY2FzdHMgYWxzby4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKGZ0X2RpdjY0YnkzMik6IFJlbW92ZSByZWR1bmRhbnQgY2FzdC4KLQkoRlRfTXVsRGl2LCBGVF9NdWxEaXZfTm9fUm91bmQpOiBBZGQgMzJiaXQgY2FzdC4KLQkoRlRfRGl2Rml4KTogQWRkIDMyYml0IGNhc3QgKHRoaXMgb21pc3Npb24gdHJpZ2dlcmVkIHRoZSBidWcpLgotCi0yMDEyLTAzLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNhdXhdIEZpeCBoYW5kbGluZyBvZiB0cmFjayBrZXJuaW5nLgotCi0JKiBzcmMvcHNhdXgvYWZtcGFyc2UuYyAoYWZtX3BhcnNlX3RyYWNrX2tlcm4pOiBEb24ndCBpbnZlcnNlIHNpZ24KLQlmb3IgYG1pbl9rZXJuJy4gIEl0IGlzIGluZGVlZCBxdWl0ZSBjb21tb24gdGhhdCB0cmFjayBrZXJuaW5nCi0JKmluY3JlYXNlcyogc3BhY2luZyBmb3IgdmVyeSBzbWFsbCBzaXplcy4KLQotMjAxMi0wMy0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggU2F2YW5uYWggYnVnICMzNTY4OS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBDaGVjayBmaXJzdCBvdXRsaW5lCi0JcG9pbnQuCi0KLTIwMTItMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGZdIEZpeCBTYXZhbm5haCBidWcgIzM1NjU2LgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3BhcnNlX2dseXBocykgPF9CREZfQklUTUFQPjogQ2hlY2sgdmFsaWRpdHkKLQlvZiBuaWJibGUgY2hhcmFjdGVycyBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBgYTJpJyBhcnJheS4KLQotMjAxMi0wMy0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3dpbmZvbnRzXSBGaXggU2F2YW5uYWggYnVnICMzNTY1OS4KLQotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfRmFjZV9Jbml0KTogQ2hlY2sgbnVtYmVyIG9mIGdseXBocy4KLQotMjAxMi0wMy0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gRml4IFNhdmFubmFoIGJ1ZyAjMzU2NTguCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfbGlzdF9zcGxpdCk6IEluaXRpYWxpemUgYGZpZWxkJyBlbGVtZW50cwotCXByb3Blcmx5LgotCi0yMDEyLTAzLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNhdXhdIEZpeCBTYXZhbm5haCBidWcgIzM1NjU3LgotCi0JSWYgaW4gZnVuY3Rpb24gYHNraXBfc3BhY2VzJyB0aGUgcm91dGluZSBgc2tpcF9jb21tZW50JyBjb21lcyB0byB0aGUKLQllbmQgb2YgYnVmZmVyLCBgY3VyJyBpcyBzdGlsbCBpbmNyZWFzZWQgYnkgb25lLCBzbyB3ZSBuZWVkIHRvIGNoZWNrCi0JZm9yIGBwID49IGxpbWl0JyBhbmQgbm90IGBwID09IGxpbWl0Jy4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jIChQU19Db252X1N0cnRvbCwgUFNfQ29udl9Ub0ZpeGVkLAotCVBTX0NvbnZfQVNDSUlIZXhEZWNvZGUsIFBTX0NvbnZfRWV4ZWNEZWNvZGUpOiBGaXggYm91bmRhcnkgY2hlY2tpbmcuCi0KLTIwMTItMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IFNhdmFubmFoIGJ1ZyAjMzU2NDYuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTUlSUCk6IFR5cG8sIHByZXNlbnQgc2luY2UgYWdlcy4gIFRoZQotCWNvZGUgaXMgbm93IGluIHN5bmMgd2l0aCB0aGUgb3RoZXIgb3BlcmF0b3JzIChlLmcuIE1TSVJQKSB3aGljaAotCW1vZGlmeSB0d2lsaWdodCBwb2ludHMuCi0KLTIwMTItMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGZdIEZpeCBTYXZhbm5haCBidWcgIzM1NjQzLgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX2xpc3RfZW5zdXJlKTogQnJpbmcgY29kZSBpbiBzeW5jIHdpdGgKLQljb21tZW50IGJlZm9yZSBgX2JkZl9saXN0X3NwbGl0JywgdGhpcyBpcywgcmVhbGx5IGFsbG9jYXRlIGF0IGxlYXN0Ci0JZml2ZSBgZmllbGQnIGVsZW1lbnRzLgotCi0yMDEyLTAzLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBGaXggU2F2YW5uYWggYnVnICMzNTY0MS4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9nbHlwaHMpIDxEV0lEVEgsIEJCWD46IEFib3J0IGlmCi0JX0JERl9FTkNPRElORyBpc24ndCBzZXQuICBXZSBuZWVkIHRoaXMgYmVjYXVzZSBhY2Nlc3MgdG8gdGhlIGBnbHlwaCcKLQl2YXJpYWJsZSBtaWdodCBiZSB1bmRlZmluZWQgb3RoZXJ3aXNlLgotCi0yMDEyLTAzLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBTYXZhbm5haCBidWcgIzM1NjQwLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoU2tpcENvZGUsIFRUX1J1bklucyk6IEZpeCBib3VuZGFyeSBjaGVjawotCWZvciBOUFVTSEIgYW5kIE5QVVNIVyBpbnN0cnVjdGlvbnMuCi0KLTIwMTItMDItMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IFNhdmFubmFoIGJ1ZyAjMzU2MDEuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfU0haKTogVXNlIG51bWJlciBvZiBwb2ludHMgaW5zdGVhZCBvZgotCWxhc3QgcG9pbnQgZm9yIGxvb3AuCi0JQWxzbyByZW1vdmUgcmVkdW5kYW50IGJvdW5kYXJ5IGNoZWNrLgotCi0yMDEyLTAyLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFJlbW92ZSByZWR1bmRhbnQgY2hlY2suCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfU2ltcGxlX0dseXBoKTogUmVtb3ZlIHJlZHVuZGFudAotCXNlY29uZCBjaGVjayBmb3Igb3JkZXJlZCBjb250b3VyIHN0YXJ0IHBvaW50cy4KLQotMjAxMi0wMi0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBNYWtlIFNIQyBpbnN0cnVjdGlvbiBiZWhhdmUgc2ltaWxhciB0byBNUyByYXN0ZXJpemVyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX1NIQyk6IEhhbmRsZSB2aXJ0dWFsIGNvbnRvdXIgaW4KLQl0d2lsaWdodCB6b25lLgotCi0yMDEyLTAyLTI5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlBdm9pZCBtb2R1bG8gb3BlcmF0b3JzIGFnYWluc3QgYSBwb3dlci1vZi10d28gZGVub21pbmF0b3IuCi0KLQkqIHNyYy9hZmNqay5jIChhZl9oaW50X25vcm1hbF9zdGVtKSwgc3JjL2Jhc2UvZnRvdXRsbi5jCi0JKGZ0X2NvbnRvdXJfaGFzKSwgc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykKLQk8Y2ZmX29wX3Z2Y3VydmV0bywgY2ZmX29wX2hoY3VydmV0bywgY2ZmX29wX2h2Y3VydmV0bz4sCi0Jc3JjL2d4dmFsaWQvZ3h2Y29tbW4uYyAoR1hWXzMyQklUX0FMSUdOTUVOVF9WQUxJREFURSksCi0Jc3JjL2d4dmFsaWQvZ3h2ZmVhdC5jIChneHZfZmVhdF9zZXR0aW5nX3ZhbGlkYXRlKTogUmVwbGFjZSBgJScgd2l0aAotCWAmJyBvcGVyYXRvci4KLQotMjAxMi0wMi0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIERvbid0IHN5bmNocm9uaXplIGRpZ2l0IHdpZHRocyBmb3IgbGlnaHQgcmVuZGVyaW5nIG1vZGUuCi0KLQlXZSBkb24ndCBoaW50IGhvcml6b250YWxseSBpbiB0aGlzIG1vZGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2cpIDxIaW50X01ldHJpY3M+OgotCUltcGxlbWVudCBpdC4KLQotMjAxMi0wMi0yNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3R5cGU0Ml0gTWlub3IgY29kZSBvcHRpbWl6YXRpb24gKGFnYWluKS4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2Vfc2ZudHMpOiBTaW1wbGlmeSBwcmV2aW91cyBjaGFuZ2UuCi0KLTIwMTItMDItMjYgIE1hdGV1c3ogSnVyY3p5ayAgPG1qdXJjenlrQGdvb2dsZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzbW9vdGhdIEZpeCBTYXZhbm5haCBidWcgIzM1NjA0LgotCi0JKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyk6IFVzZSBgRlRfUG9zJwotCWluc3RlYWQgb2YgYEZUX1VJbnQnIGZvciBzb21lIHZhcmlhYmxlcyBhbmQgdXBkYXRlIGNvbXBhcmlzb25zCi0JYWNjb3JkaW5nbHkuICBBIGRldGFpbGVkIGFuYWx5c2lzIGNhbiBiZSBmb3VuZCBpbiB0aGUgYnVnIHJlcG9ydC4KLQotMjAxMi0wMi0yNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3R5cGU0Ml0gTWlub3IgY29kZSBvcHRpbWl6YXRpb24uCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX3NmbnRzKTogVXNlIGJpdG1hc2sgaW5zdGVhZCBvZgotCW1vZHVsbyBvcGVyYXRvci4KLQotMjAxMi0wMi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTItMDItMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gRml4IFNhdmFubmFoIGJ1ZyAjMzU2MDguCi0KLQkqIHNyYy90eXBlMS90MXBhcnNlLmMgKFQxX0dldF9Qcml2YXRlX0RpY3QpOiBSZWplY3QgdG9vIHNob3J0Ci0JZGljdGlvbmFyaWVzLgotCi0yMDEyLTAyLTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBTdXBwb3J0IGBFTkNPRElORyAtMSA8bj4nIGZvcm1hdC4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9nbHlwaHMpIDxFTkNPRElORz46IEltcGxlbWVudCBpdC4KLQotMjAxMi0wMi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gRml4IFNhdmFubmFoIGJ1ZyAjMzU2MDcuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcGFyc2VfZ2x5cGhzKSA8RU5DT0RJTkc+OiBOb3JtYWxpemUKLQluZWdhdGl2ZSBlbmNvZGluZyB2YWx1ZXMuCi0KLTIwMTItMDItMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gRml4IFNhdmFubmFoIGJ1ZyAjMzU2MDYuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2Vfc3VicnMpOiBBZGQgcHJvcGVyIGd1YXJkcyBmb3IgYHN0cm5jbXAnLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuKTogRW1pdCBlcnJvciBtZXNzYWdlCi0Jb25seSBpZiBjdXIgPCBsaW1pdC4KLQotMjAxMi0wMi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gRml4IFNhdmFubmFoIGJ1ZyAjMzU2MDMuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X3Byb3BlcnRpZXMpOiBBc3N1cmUgZmluYWwgemVybyBieXRlIGluCi0JYHN0cmluZ3MnIGFycmF5LgotCi0yMDEyLTAyLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTQyXSBGaXggU2F2YW5uYWggYnVnICMzNTYwMi4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2Vfc2ZudHMpOiBDaGVjayBgc3RyaW5nX3NpemUnIG1vcmUKLQl0aG9yb3VnaGx5LgotCi0yMDEyLTAyLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBGaXggU2F2YW5uYWggYnVncyAjMzU1OTkgYW5kICMzNTYwMC4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoQUNNU0cxNik6IE5ldyB3YXJuaW5nIG1lc3NhZ2UuCi0JKF9iZGZfcGFyc2VfZ2x5cGhzKSA8X0JERl9CSVRNQVA+OiBDaGVjayBsaW5lIGxlbmd0aC4KLQotMjAxMi0wMi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gRml4IFNhdmFubmFoIGJ1Z3MgIzM1NTk3IGFuZCAjMzU1OTguCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfaXNfYXRvbSk6IEZpeCBoYW5kbGluZyBvZiBwcm9wZXJ0eSB2YWx1ZS4KLQotMjAxMi0wMi0yNCAgVmlubmllIEZhbGNvICA8dmlubmllLmZhbGNvQGdtYWlsLmNvbT4KLQotCVByZXBhcmUgc291cmNlIGNvZGUgZm9yIGFtYWxnYW1hdGlvbiAoNi82KS4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jOiBzL0xvYWRfR2x5cGgvY2ZmX2dseXBoX2xvYWQvLgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYzogcy9wYXJzZV9mb250X21hdHJpeC9jaWRfcGFyc2VfZm9udF9tYXRyaXgvLgotCXMvdDFfaW5pdF9sb2FkZXIvY2lkX2luaXRfbG9hZGVyLy4KLQlzL3QxX2RvbmVfbG9hZGVyL2NpZF9kb25lX2xvYWRlci8uCi0KLQkqIHNyYy9wc2F1eC90MWNtYXAuYzogcy90MV9nZXRfZ2x5cGhfbmFtZS9wc2F1eF9nZXRfZ2x5cGhfbmFtZS8uCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jOiBzL0xvYWRfR2x5cGgvdHRfZ2x5cGhfbG9hZC8uCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYzogcy9wYXJzZV9mb250X21hdHJpeC90MV9wYXJzZV9mb250X21hdHJpeC8uCi0KLTIwMTItMDItMjQgIFZpbm5pZSBGYWxjbyAgPHZpbm5pZS5mYWxjb0BnbWFpbC5jb20+Ci0KLQlQcmVwYXJlIHNvdXJjZSBjb2RlIGZvciBhbWFsZ2FtYXRpb24gKDUvNikuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaDogVW5kZWZpbmUgRlRfS0VFUF9FUlJfUFJFRklYIGFmdGVyCi0JdXNpbmcgaXQuCi0KLTIwMTItMDItMjIgIFZpbm5pZSBGYWxjbyAgPHZpbm5pZS5mYWxjb0BnbWFpbC5jb20+Ci0KLQlQcmVwYXJlIHNvdXJjZSBjb2RlIGZvciBhbWFsZ2FtYXRpb24gKDQvNikuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jLCBzcmMvcmFzdGVyL2Z0cmFzdGVyLmM6IFVuZGVmaW5lIFJBU19BUkcsCi0JUkFTX0FSR1MsIFJBU19WQVIsIGFuZCBSQVNfVkFSUyBiZWZvcmUgZGVmaW5pbmcgaXQuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jOiBzL1RSYXN0ZXIvYmxhY2tfVFJhc3Rlci8sCi0Jcy9QUmFzdGVyL2JsYWNrX1BSYXN0ZXIvLgotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jOiBzL1RSYXN0ZXIvZ3JheV9UUmFzdGVyLywKLQlzL1BSYXN0ZXIvZ3JheV9QUmFzdGVyLy4KLQotMjAxMi0wMi0yMCAgVmlubmllIEZhbGNvICA8dmlubmllLmZhbGNvQGdtYWlsLmNvbT4KLQotCVByZXBhcmUgc291cmNlIGNvZGUgZm9yIGFtYWxnYW1hdGlvbiAoMy82KS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmM6IHMvVFdvcmtlci9ibGFja19UV29ya2VyLywKLQlzL1BXb3JrZXIvYmxhY2tfUFdvcmtlci8uCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmM6IHMvVFdvcmtlci9ncmF5X1RXb3JrZXIvLAotCXMvUFdvcmtlci9ncmF5X1BXb3JrZXIvLgotCi0yMDEyLTAyLTIwICBWaW5uaWUgRmFsY28gIDx2aW5uaWUuZmFsY29AZ21haWwuY29tPgotCi0JUHJlcGFyZSBzb3VyY2UgY29kZSBmb3IgYW1hbGdhbWF0aW9uICgyLzYpLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYywgc3JjL3Jhc3Rlci9mdHJhc3Rlci5jOiBVbmRlZmluZSBGTE9PUiwKLQlDRUlMSU5HLCBUUlVOQywgYW5kIFNDQUxFRCBiZWZvcmUgZGVmaW5pbmcgaXQuCi0KLTIwMTItMDItMjAgIFZpbm5pZSBGYWxjbyAgPHZpbm5pZS5mYWxjb0BnbWFpbC5jb20+Ci0KLQlQcmVwYXJlIHNvdXJjZSBjb2RlIGZvciBhbWFsZ2FtYXRpb24gKDEvNikuCi0KLQlTZWUgZGlzY3Vzc2lvbiBzdGFydGluZyBhdAotCi0JICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMi0wMS9tc2cwMDAzNy5odG1sCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jOiBzL1RCYW5kL2dyYXlfVEJhbmQvLgotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jOiBzL1RCYW5kL2JsYWNrX1RCYW5kLy4KLQotMjAxMi0wMi0xNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2F1dG9maXRdIEZpeCBvdXRsaW5lIGZsYWdzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nKTogRG9uJ3QgcmVhc3NpZ24KLQlgb3V0bGluZS5mbGFncycgc28gdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIHByZXNlcnZlZC4gIFNlZQotCWRpc2N1c3Npb24gc3RhcnRpbmcgYXQKLQotCSAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTItMDIvbXNnMDAwNDYuaHRtbAotCi0yMDEyLTAyLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBTYXZhbm5haCBidWcgIzM1NDY2LgotCi0JSnVtcCBpbnN0cnVjdGlvbnMgYXJlIG5vdyBib3VuZCB0byB0aGUgY3VycmVudCBmdW5jdGlvbi4gIFRoZSBNUwotCVdpbmRvd3MgcmFzdGVyaXplciBiZWhhdmVzIHRoZSBzYW1lLCBhcyBjb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2suCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5oIChUVF9DYWxsUmVjKTogQWRkIGBDdXJfRW5kJyBlbGVtZW50LgotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5oIChUVF9EZWZSZWNvcmQpOiBBZGQgYGVuZCcgZWxlbWVudC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKERPX0pST1QsIERPX0pNUFIsIERPX0pST0YpOiBDaGVjayB1cHBlcgotCWJvdW5kIG9mIGp1bXAgYWRkcmVzcy4KLQkoSW5zX0ZERUYsIEluc19DQUxMLCBJbnNfTE9PUENBTEwsIEluc19VTktOT1dOLCBUVF9SdW5JbnMpOiBVcGRhdGVkLgotCi0yMDEyLTAyLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlXZSBkb24ndCB1c2UgYGV4dGVuc2lvbnMnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9Ecml2ZXJSZWMpOiBSZW1vdmUKLQlgZXh0ZW5zaW9ucycgZmllbGQuCi0KLTIwMTItMDItMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUNsZWFuIHVwIGBnZW5lcmljJyBmaWVsZHMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX01vZHVsZVJlYywgRlRfTGlicmFyeVJlYyk6Ci0JUmVtb3ZlIGBnZW5lcmljJyBmaWVsZCBzaW5jZSB1c2VycyBjYW4ndCBhY2Nlc3MgaXQuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Eb25lX0dseXBoU2xvdCk6IENhbGwgYGdlbmVyaWMuZmluYWxpemVyJyBhcwotCWFkdmVydGlzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgRlRfR2VuZXJpYy4KLQkoRGVzdHJveV9Nb2R1bGUsIEZUX0RvbmVfTGlicmFyeSk6IFVwZGF0ZWQgdG8gY2hhbmdlcyBpbiBgZnRvYmpzLmgnLgotCi0yMDEyLTAyLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSGFybW9uaXplIGZ1bmN0aW9uIGFyZ3VtZW50cy4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYywgc3JjL2F1dG9maXQvYWZsb2FkZXIuaDogVXNlIGBGVF9JbnQzMicgZm9yCi0JYGxvYWRfZmxhZ3MnLgotCi0yMDEyLTAyLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhc3RzLgotCi0yMDEyLTAxLTE3ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2d4dmFsaWRdIEZpeCBTYXZhbm5haCBidWcgIzM1Mjg2LgotCi0JUGF0Y2ggc3VibWl0dGVkIGJ5IGFub255bW91cyByZXBvcnRlci4KLQotCSogc3JjL2d4dmFsaWQvZ3h2Y29tbW4uYyAoZ3h2X1hTdGF0ZVRhYmxlX3N1YnRhYmxlX3NldHVwKToKLQlneHZfc2V0X2xlbmd0aF9ieV91bG9uZ19vZmZzZXQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIDMsIG5vdCA0LAotCXRoZSBudW1iZXIgb2YgdGhlIHN1YnRhYmxlcyBpbiB0aGUgc3RhdGUgdGFibGVzOyBjbGFzc1RhYmxlLAotCXN0YXRlQXJyYXksIGVudHJ5VGFibGUuCi0KLTIwMTItMDEtMTcgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbcmFjY2Vzc10gTW9kaWZ5IGZvciBQSUMgYnVpbGQuCi0KLQlCYXNlZCBvbiB0aGUgcGF0Y2ggcHJvdmlkZWQgYnkgRXJpayBEYWhsc3Ryb20gPGVkQG9wZXJhLmNvbT4sCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTItMDEvbXNnMDAwMTAuaHRtbAotCi0JQWxzbyBgcmFjY2Vzc19ndWVzc190YWJsZVtdJyBhbmQgYHJhY2Nlc3NfcnVsZV9ieV9kYXJ3aW5fdmZzKCknCi0JYXJlIHJlbmFtZWQgd2l0aCBgZnRfJyBzdWZmaXhlcy4KLQotCSogc3JjL2Jhc2UvZnRiYXNlLmg6IGByYWNjZXNzX3J1bGVfYnlfZGFyd2luX3ZmcygpJyBpcyByZW5hbWVkCi0JdG8gYGZ0X3JhY2Nlc3NfcnVsZV9ieV9kYXJ3aW5fdmZzKCknLgotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IERpdHRvLgotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmM6IERlY2xhcmF0aW9ucyBvZiBGVF9SRm9ya19SdWxlLAotCXJhY2Nlc3NfZ3Vlc3NfcmVjLCBhcmUgbW92ZWQgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oOiBIZXJlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaDoKLQlGVF9SRk9SS19SVUxFX0FSUkFZX3tCRUdJTixFTlRSWSxFTkR9IG1hY3JvcyBhcmUgZGVmaW5lZAotCXRvIHJlcGxhY2UgcmFjY2Vzc19ndWVzc190YWJsZVtdIGluIGJvdGggb2YgUElDIGFuZCBub24tUElDCi0JbW9kZXMuCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmM6IHJhY2Nlc3NfZ3Vlc3NfdGFibGVbXSBhcnJheSBpcyByZXdyaXR0ZW4KLQlieSBGVF9SRk9SS19SVUxFX0FSUkFZX3tCRUdJTixFTlRSWSxFTkR9LgotCi0JKiBzcmMvYmFzZS9iYXNlcGljLmggKEJhc2VQSUMpOiBBZGQgYGZ0X3JhY2Nlc3NfZ3Vlc3NfdGFibGUnCi0Jc3RvcmFnZS4gIChGVF9SQUNDRVNTX0dVRVNTX1RBQkxFX0dFVCk6IE5ldyBtYWNybyB0byByZXRyaWV2ZQotCXRoZSBmdW5jdGlvbiBwb2ludGVyIGZyb20gYGZ0X3JhY2Nlc3NfZ3Vlc3NfdGFibGUnIHN0b3JhZ2UgaW4KLQlgQmFzZVBJQycgc3RydWN0dXJlLgotCSogc3JjL2Jhc2UvZnRyZm9yay5jIChGVF9SYWNjZXNzX0d1ZXNzKTogUmV3cml0dGVuIHdpdGgKLQlGVF9SQUNDRVNTX0dVRVNTX1RBQkxFX0dFVC4KLQkocmFjY2Vzc19nZXRfcnVsZV90eXBlX2Zyb21fcnVsZV9pbmRleCk6IEFkZCBgbGlicmFyeScgYXMgdGhlCi0JZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uLCB0byByZXRyaWV2ZSB0aGUgc3RvcmFnZSBvZgotCWBmdF9yYWNjZXNzX2d1ZXNzX3RhYmxlJyBmcm9tIGl0LiAgQWxzbyBgcmFjY2Vzc19ndWVzc190YWJsZScKLQlpcyByZXBsYWNlZCBieSBGVF9SQUNDRVNTX0dVRVNTX1RBQkxFX0dFVC4KLQkoZnRfcmFjY2Vzc19ydWxlX2J5X2Rhcndpbl92ZnMpOiBEaXR0by4KLQotMjAxMi0wMS0xNiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVJlbW92ZSB0cmFpbGluZyBzcGFjZXMuCi0KLTIwMTItMDEtMTYgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGb3JtYXR0aW5nIFBJQyByZWxhdGVkIHNvdXJjZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcGljLmM6IEhhcm1vbml6ZSB0byBGVDIgY29kaW5nIGNvbnZlbnRpb25zLgotCSogc3JjL2Jhc2UvYmFzZXBpYy5jOiBEaXR0by4KLQkqIHNyYy9iYXNlL2Z0cGljLmM6IERpdHRvLgotCSogc3JjL2NmZi9jZmZwaWMuYzogRGl0dG8uCi0JKiBzcmMvcHNoaW50ZXIvcHNocGljLmM6IERpdHRvLgotCSogc3JjL3BzbmFtZXMvcHNwaWMuYzogRGl0dG8uCi0JKiBzcmMvcmFzdGVyL3Jhc3RwaWMuYzogRGl0dG8uCi0JKiBzcmMvc2ZudC9zZm50cGljLmM6IERpdHRvLgotCSogc3JjL3Ntb290aC9mdHNwaWMuYzogRGl0dG8uCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwaWMuYzogRGl0dG8uCi0KLTIwMTItMDEtMTYgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbYXV0b2ZpdF0gRml4IHRoZSBpbmNsdXNpb24gb2YgYGFmbGF0aW4yLmgnIGluIFBJQyBmaWxlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnBpYy5jOiBJbmNsdWRlIGBhZmxhdGluMi5oJyB3aGVuCi0JRlRfT1BUSU9OX0FVVE9GSVQyIGlzIGRlZmluZWQsIGFzIGFmZ2xvYmFsLmMgZG9lcyBzby4KLQlVbmNvbmRpdGlvbmFsbHkgaW5jbHVzaW9uIGNhdXNlcyBkZWNsYXJlZCBidXQgdW5pbXBsZW1lbnRlZAotCXdhcm5pbmcgYnkgR0NDIDQuNi4KLQotMjAxMi0wMS0xNiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtjZmZdIFJlbW92ZSByZWR1bmRhbnQgZGVjbGFyYXRpb25zIG9mIGNmZl9jbWFwX1hYWF9jbGFzc19yZWMuCi0KLQkqIHNyYy9jZmYvY2ZmcGljLmM6IFRoZSBkZWNsYXJhdGlvbnMgb2YKLQlGVF9Jbml0X0NsYXNzX2NmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYygpIGFuZAotCUZUX0luaXRfQ2xhc3NfY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMoKSBhcmUgcmVtb3ZlZC4KLQlUaGV5IGNhbiBiZSBvYnRhaW5lZCBieSB0aGUgaW5jbHVzaW9uIG9mIGNmZmNtYXAuaC4KLQljZmZjbWFwLmggaW52b2tlcyBGVF9ERUNMQVJFX0NNQVBfQ0xBU1MoKSBhbmQgaXQgZGVjbGFyZXMKLQlGVF9Jbml0X0NsYXNzX2NmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYygpIGV0YyBpbiBQSUMgbW9kZS4KLQotMjAxMi0wMS0xNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZpeCByZWR1bmRhbnQgZGVjbGFyYXRpb24gd2FybmluZyBpbiBQSUMgbW9kZS4KLQotCU9yaWdpbmFsbHkgRlRfREVGSU5FX3tEUklWRVIsTU9EVUxFLFJFTkRFUkVSfSgpIG1hY3JvcyB3ZXJlCi0JZGVzaWduZWQgdG8gZGVjbGFyZSB4eHhfcGljX3tmcmVlLGluaXR9IGJ5IHRoZW1zZWx2ZXMuCi0JQmVjYXVzZSB0aGVzZSBtYWNyb3MgYXJlIHVzZWQgYXQgdGhlIGVuZCBvZiB0aGUgbW9kdWxlCi0JaW50ZXJmYWNlIChlLmcuIHR0ZHJpdmVyLmMpIGFuZCB0aGUgd3JhcHBlciBzb3VyY2UgdG8gYnVpbGQKLQlhIG1vZHVsZSBhcyBhIHNpbmdsZSBvYmplY3QgKGUuZy4gdHJ1ZXR5cGUuYykgaW5jbHVkZXMKLQl0aGUgUElDIGZpbGUgKGUuZy4gdHRwaWMuYykgYmVmb3JlIHRoZSBtb2R1bGUgaW50ZXJmYWNlLAotCXRoZXNlIG1hY3JvcyBhcmUgZXhwYW5kZWQgQUZURVIgeHh4X3BpY197ZnJlZSxpbml0fSBib2R5Ci0Jd2hlbiB0aGUgbW9kdWxlcyBhcmUgYnVpbHQgYXMgc2luZ2xlIG9iamVjdC4KLQlUaGUgZGVjbGFyYXRpb24gYWZ0ZXIgdGhlIGltcGxlbWVudGF0aW9uIGNhdXNlcyB0aGUgcmVkdW5kYW50Ci0JZGVjbGFyYXRpb24gd2FybmluZ3MsIHNvIHRoZSBkZWNsYXJhdGlvbnMgYXJlIG1vdmVkIHRvIG1vZHVsZQotCVBJQyBoZWFkZXJzIChlLmcuIHR0cGljLmgpLiAgU2VwYXJhdGluZyB0byBvdGhlciBoZWFkZXIgZmlsZXMKLQlhcmUgbmVlZGVkIGZvciBtdWx0aSBidWlsZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oIChGVF9ERUZJTkVfRFJJVkVSKToKLQlSZW1vdmUgY2xhc3NfIyNfcGljX2ZyZWUgYW5kIGNsYXNzXyMjX3BpY19pbml0IGRlY2xhcmF0aW9ucy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0RFRklORV9SRU5ERVJFUiwKLQlGVF9ERUZJTkVfTU9EVUxFKTogRGl0dG8uCi0KLQkqIHNyYy9iYXNlL2Jhc2VwaWMuaDogSW5zZXJ0IGEgY29tbWVudCBhbmQgZml4IGNvZGluZyBzdHlsZS4KLQkqIHNyYy9hdXRvZml0L2FmcGljLmg6IERlY2xhcmUgYXV0b2ZpdF9tb2R1bGVfY2xhc3NfcGljX3tmcmVlLAotCWluaXR9LgotCSogc3JjL2NmZi9jZmZwaWMuaDogRGVjbGFyZSBjZmZfZHJpdmVyX2NsYXNzX3BpY197ZnJlZSxpbml0fS4KLQkqIHNyYy9wc2hpbnRlci9wc2hwaWMuaDogRGVjbGFyZSBwc2hpbnRlcl9tb2R1bGVfY2xhc3NfcGljX3tmcmVlLAotCWluaXR9LgotCSogc3JjL3BzbmFtZXMvcHNwaWMuaDogRGVjbGFyZSBwc25hbWVzX21vZHVsZV9jbGFzc19waWNfe2ZyZWUsCi0JaW5pdH0uCi0JKiBzcmMvcmFzdGVyL3Jhc3RwaWMuaDogRGVjbGFyZQotCWZ0X3Jhc3RlcnsxLDV9X3JlbmRlcmVyX2NsYXNzX3BpY197ZnJlZSxpbml0fQotCSogc3JjL3NmbnQvc2ZudHBpYy5oOiBEZWNsYXJlIHNmbnRfbW9kdWxlX2NsYXNzX3BpY197ZnJlZSxpbml0fS4KLQkqIHNyYy9zbW9vdGgvZnRzcGljLmg6IERlY2xhcmUKLQlmdF9zbW9vdGhfeyxsY2RfLGxjZHZffXJlbmRlcmVyX2NsYXNzX3BpY197ZnJlZSxpbml0fS4KLQkqIHNyYy90cnVldHlwZS90dHBpYy5oOiBEZWNsYXJlIHR0X2RyaXZlcl9jbGFzc19waWNfe2ZyZWUsaW5pdH0uCi0KLTIwMTItMDEtMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlNYWtlIHBzcGljLmMgdG8gaW5jbHVkZSBtb2R1bGUgZXJyb3IgaGVhZGVyIHRvIGZpeCBtdWx0aSBidWlsZC4KLQotCSogc3JjL3BzbmFtZXMvcHNwaWMuYzogSW5jbHVkZSBgcHNuYW1lcnIuaCcuCi0KLTIwMTItMDEtMTQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbYmFzZV0gRml4IGEgZGVyZWZlcmVuY2Ugb2YgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBpbiBQSUMgbW9kZS4KLQotCSogc3JjL2Jhc2UvZnRnbHlwaC5jIChGVF9HbHlwaF9Ub19CaXRtYXApOiBgZ2x5cGgnIG11c3QgYmUKLQlzZXQgYmVmb3JlIGRlcmVmZXJyaW5nIHRvIG9idGFpbiBgbGlicmFyeScuICBUaGUgaW5pdGlhbGl6YXRpb24KLQlvZiBgY2xhenonLCBgZ2x5cGgnLCBgbGlicmFyeScgYW5kIE5VTEwgcG9pbnRlciBjaGVjayBhcmUKLQlyZW9yZGVyZWQgdG8gbWluaW1pemUgUElDIGNvbmRpdGlvbmFscy4KLQotMjAxMi0wMS0xNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtiYXNlXSBJbnNlcnQgZXhwbGljaXQgY2FzdCBmb3IgR0NDIDQuNiBpbiBQSUMgbW9kZS4KLQotCSogc3JjL2Jhc2UvZnRpbml0LmMgKEZUX0FkZF9EZWZhdWx0X01vZHVsZXMpOiBVbmRlciBQSUMKLQljb25maWd1cmF0aW9uLCBGVF9ERUZBVUxUX01PRFVMRVNfR0VUIHJldHVybnMKLQlGVF9Nb2R1bGVfQ2xhc3MqKiBwb2ludGVyLCBHQ0MgNC42IHdhcm5zIHRoYXQKLQljb25zdCBGVF9Nb2R1bGVfQ2xhc3MqIGNvbnN0KiB2YXJpYWJsZSBpcyB3YXJuZWQgYXMKLQlpbmFwcHJvcHJpYXRlIHRvIHN0b3JlIGl0LiAgVG8gY2FsbSBpdCwgZXhwbGljaXQgY2FzdCBpcwotCWluc2VydGVkLiAgQWxzbyBgbGlicmFyeScgaXMgY2hlY2tlZCB0byBwcmV2ZW50IHRoZSBOVUxMCi0JcG9pbnRlciBkZXJlZmVyZW5jZSBpbiBGVF9ERUZBVUxUX01PRFVMRVNfR0VULgotCi0yMDEyLTAxLTEzICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JRml4IFBJQyBidWlsZCBicm9rZW4gYnkgZDkxNDUyNDFmZTM3ODEwNGJhNGMxMmE0MjUzNDU0OWZhYWNjOTJlNi4KLQotCVVuZGVyIFBJQyBjb25maWd1cmF0aW9uLCBGVF97Q0ZGLFBTQ01BUFMsU0ZOVCxUVH1fU0VSVklDRVNfR0VUCi0JdGFrZSBubyBhcmd1bWVudHMgYnV0IGRlcmVmZXIgdGhlIHZhcmlhYmxlIG5hbWVkIGBsaWJyYXJ5JwotCWludGVybmFsbHkuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9pbnRlcmZhY2UpOiBEZWNsYXJlIGBsaWJyYXJ5JyBhbmQKLQlzZXQgaXQgaWYgbm9uLU5VTEwgZHJpdmVyIGlzIHBhc3NlZC4KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9nZXRfaW50ZXJmYWNlKTogRGl0dG8uCi0KLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X2ludGVyZmFjZSk6IERlY2xhcmUgYGxpYnJhcnknCi0JdW5kZXIgUElDIGNvbmZpZ3VyYXRpb24sIGFuZCBzZXQgaXQgaWYgbm9uLU5VTEwgbW9kdWxlIGlzIGdpdmVuLgotCSogc3JjL3BzbmFtZXMvcHNtb2R1bGUuYyAocHNuYW1lc19nZXRfaW50ZXJmYWNlKTogRGl0dG8uCi0KLTIwMTItMDEtMTMgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlNYWtlIFBJQyBmaWxlcyBpbmNsdWRlIG1vZHVsZSBlcnJvciBoZWFkZXJzLCB0byB1c2UgdGhlIGVycm9yIGNvZGVzCi0Jd2l0aCBwZXItbW9kdWxlIHByZWZpeC4KLQotCSogc3JjL2F1dG9maXQvYWZwaWMuYzogSW5jbHVkZSBgYWZlcnJvcnMuaCcuCi0JKiBzcmMvY2ZmL2NmZnBpYy5jOiBJbmNsdWRlIGBjZmZlcnJzLmgnLgotCSogc3JjL3BzaGludGVyL3BzaHBpYy5jOiBJbmNsdWRlIGBwc2hudGVyci5oJy4KLQkqIHNyYy9yYXN0ZXIvcmFzdHBpYy5jOiBJbmNsdWRlIGByYXN0ZXJycy5oJy4KLQkqIHNyYy9zZm50L3NmbnRwaWMuYzogSW5jbHVkZSBgc2ZlcnJvcnMuaCcuCi0JKiBzcmMvc21vb3RoL2Z0c3BpYy5jOiBJbmNsdWRlIGBmdHNtZXJycy5oJy4KLQkqIHNyYy90cnVldHlwZS90dHBpYy5jOiBJbmNsdWRlIGB0dGVycm9ycy5oJy4KLQotMjAxMi0wMS0wNCAgVG9iaWFzIFJpbmdzdHLDtm0gIDx0b2JpYXNAcmluZ2lzLnNlPgotCi0JW3RydWV0eXBlXSBGaXggSVAgaW5zdHJ1Y3Rpb24gaWYgeF9wcGVtICE9IHlfcHBlbS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JUCk6IFNjYWxlIGBvcnVzJyBjb29yZGluYXRlcwotCXByb3Blcmx5LgotCi0yMDEyLTAxLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggdHJhY2luZyBtZXNzYWdlIGZvciBgbG9jYScgdGFibGUuCi0KLQkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKTogRG9uJ3QgZW1pdCBhCi0Jd2FybmluZyBtZXNzYWdlIGlmIHRoZSBsYXN0IGBsb2NhJyBlbnRyeSByZWZlcmVuY2VzIGFuIGVtcHR5IGdseXBoLgotCi0yMDExLTEyLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgc29tZSB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMuCi0JUmVwb3J0ZWQgYnkgUmljaGFyZCBDT09LIDxyc2Nvb2tAdW5pY29kZS5vcmc+LgotCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYyAodDFfcHNfZ2V0X2ZvbnRfdmFsdWUpOiBJbml0aWFsaXplIGB2YWwnLgotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmVuZGVyX2NvbmljKTogSW5pdGlhbGl6ZSBgbGV2ZWxzJwotCWVhcmxpZXIuCi0KLTIwMTEtMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBzZXJpb3VzIHNjYWxpbmcgYnVnIGluIGBGVF9HZXRfQWR2YW5jZXMnLgotCi0JKiBzcmMvYmFzZS9mdGFkdmFuYy5jIChGVF9HZXRfQWR2YW5jZXMpOiBBZHZhbmNlIHZhbHVlcyByZXR1cm5lZCBieQotCWBGVF9Mb2FkX0dseXBoJyBtdXN0IGJlIHNpbXBseSBtdWx0aXBsaWVkIGJ5IDEwMjQuCi0KLTIwMTEtMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9zdGFydCk6IERyb3AgcmVkdW5kYW50IGVycm9yIHRyYWNpbmcuCi0KLTIwMTEtMTItMDIgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbbWFjXSBVbmlmeSBEQVJXSU5fTk9fQ0FSQk9OIHdpdGggRlRfTUFDSU5UT1NILgotCi0JT3JpZ2luYWxseSBGVF9NQUNJTlRPU0ggd2FzIGEgcHVyZSBhdXRvIG1hY3JvIGFuZCBEQVJXSU5fTk9fQ0FSQk9OCi0Jd2FzIGEgY29uZmlndXJhYmxlIG1hY3JvIHRvIGRpc2FibGUgQ2FyYm9uLWRlcGVuZGVudCBjb2RlLiAgQmVjYXVzZQotCW5vdyBjb25maWd1cmUgc2NyaXB0IHNldHMgREFSV0lOX05PX0NBUkJPTiBieSBkZWZhdWx0IGFuZCBkaXNhYmxlcwotCURhcndpbiAmIENhcmJvbi1kZXBlbmRlbnQgY29kZXMsIHRoZXNlIG1hY3JvcyBjYW4gYmUgdW5pZmllZC4KLQlGVF9NQUNJTlRPU0ggKHVuZGVmaW5lZCBieSBkZWZhdWx0KSBpcyBrZXB0IGFuZCBEQVJXSU5fTk9fQ0FSQk9OCi0JKGRlZmluZWQgYnkgZGVmYXVsdCkgaXMgcmVtb3ZlZCwgYmVjYXVzZSBEQVJXSU5fTk9fQ0FSQk9OIHZpb2xhdGVzCi0JRlRfWFhYIG5hbWluZyBjb252ZW50aW9uIG9mIHB1YmxpYyBtYWNyb3MsIGFuZCBhIG1hY3JvIGNvbmZpZ3VyZWQgYnkKLQlkZWZhdWx0IGlzIG5vdCBwb3J0YWJsZSBmb3IgdGhlIGJ1aWxkaW5nIHdpdGhvdXQgY29uZmlndXJlIChlLmcuCi0JbWFrZSBkZXZlbCkuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IERlZmluZSBGVF9NQUNJTlRPU0ggaWYgQ2FyYm9uLWJhc2VkCi0Jb2xkIE1hYyBmb250IHN1cHBvcnQgaXMgcmVxdWVzdGVkIGFuZCBDYXJib24gaXMgYXZhaWxhYmxlLgotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW46IFVuZGVmaW5lIEZUX01BQ0lOVE9TSCB3aGVuIHRoZSBzdXBwb3J0Ci0JZm9yIE1hYyBPUyBYIHdpdGhvdXQgQ2FyYm9uIChlLmcuICBNYWMgT1MgWCAxMC40IGZvciBwcGM2NCkgaXMKLQlyZXF1ZXN0ZWQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5pbjogRGl0dG8uCi0JKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmg6IERpdHRvLgotCi0JKiBzcmMvYmFzZS9mdGJhc2UuaDogUmVtb3ZlIERBUldJTl9OT19DQVJCT04uCi0JKiBzcmMvYmFzZS9mdGJhc2UuYzogRGl0dG8uCi0JKiBzcmMvYmFzZS9mdG9ianMuYzogRGl0dG8uCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmM6IERpdHRvLgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jOiBDb21waWxlIHRoZSBib2R5IGlmIEZUX01BQ0lOVE9TSCBpcyBkZWZpbmVkCi0JKHNhbWUgd2l0aCBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgaW4gdHRpbnRlcnAuYykuCi0JKiBidWlsZHMvbWFjL2Z0bWFjLmM6IERpdHRvLgotCi0JKiBidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfY2ZtLm1ha2UudHh0OiBEZWZpbmUgRlRfTUFDSU5UT1NILgotCSogYnVpbGRzL21hYy9GcmVlVHlwZS5tNjhrX2Zhci5tYWtlLnR4dDogRGl0dG8uCi0JKiBidWlsZHMvbWFjL0ZyZWVUeXBlLnBwY19jbGFzc2ljLm1ha2UudHh0OiBEaXR0by4KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NhcmJvbi5tYWtlLnR4dDogRGl0dG8uCi0KLTIwMTEtMTEtMzAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzNDcyOCAoYG1ha2UgZGV2ZWwnIG9uIE1hYyBPUyBYKS4KLQotCSogYnVpbGRzL3RvcGxldmVsLm1rOiBDaGVjayBgL2Rldi9udWxsJyB0byBpZGVudGlmeSB0aGUgVW5peC0KLQlsaWtlIHN5c3RlbXMgd2l0aG91dCBgaW5pdCcgbm9yIGBodXJkJyAoZS5nLiBNYWMgT1MgWCA+PSAxMC40KS4KLQkqIGJ1aWxkcy91bml4L2RldGVjdC5tazogRGl0dG8uCi0KLTIwMTEtMTEtMzAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbYXBpbmFtZXNdIEZpeCB0aGUgb3ZlcmZsb3cgb2Ygc2lnbmVkIGludGVnZXIgaGFzaC4KLQotCSogc3JjL3Rvb2xzL2FwaW5hbWVzLmMgKG5hbWVzX2FkZCk6IENoYW5nZSB0aGUgdHlwZSBvZiBgaCcgZnJvbQotCWludCB0byB1bnNpZ25lZCBpbnQsIHRvIHByZXZlbnQgdW5kZWZpbmVkIGJlaGF2aW91ciBpbiB0aGUKLQlvdmVyZmxvdyBvZiBzaWduZWQgaW50ZWdlcnMgKG92ZXJmbG93IG9mIHVuc2lnbmVkIGludCBpcyBkZWZpbmVkCi0JdG8gYmUgd3JhcCBhcm91bmQpLiAgRm91bmQgYnkgY2xhbmcgdGVzdCBzdWdnZXN0ZWQgYnkgU2VhbgotCU1jQnJpZGUuCi0KLTIwMTEtMTEtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt3aW5mb250c10gUmVtb3ZlIGNhc3RzLgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKHdpbmZudF9kcml2ZXJfY2xhc3MpOiBSZW1vdmUgYWxsIGNhc3RzIGFuZAotCXVwZGF0ZSBhZmZlY3RlZCBmdW5jdGlvbnMuCi0JKEZOVF9TaXplX1NlbGVjdCk6IEZpeCBudW1iZXIgb2YgYXJndW1lbnRzLgotCi0yMDExLTExLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTQyXSBSZW1vdmUgY2FzdHMuCi0KLQkqIHNyYy90eXBlNDIvdDQyZHJpdnIuYyAodDQyX2RyaXZlcl9jbGFzcyk6IFJlbW92ZSBhbGwgY2FzdHMgYW5kCi0JdXBkYXRlIGFmZmVjdGVkIGZ1bmN0aW9ucy4KLQotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmMsIHNyYy90eXBlNDIvdDQyb2Jqcy5oOiBVcGRhdGVkIGZvciB0NDIgZHJpdmVyCi0JY2hhbmdlcy4KLQotMjAxMS0xMS0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGUxXSBSZW1vdmUgY2FzdHMuCi0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9kcml2ZXJfY2xhc3MpOiBSZW1vdmUgYWxsIGNhc3RzIGFuZAotCXVwZGF0ZSBhZmZlY3RlZCBmdW5jdGlvbnMuCi0KLQkqIHNyYy90eXBlMS90MWdsb2FkLmMsIHNyYy90eXBlMS90MWdsb2FkLmgsIHNyYy90eXBlMS90MW9ianMuYzoKLQlVcGRhdGVkIGZvciB0MWRyaXZlciBjaGFuZ2VzLgotCXNyYy90eXBlMS90MW9ianMuaCAoVDFfRHJpdmVyKTogUmVtb3ZlIHVudXNlZCB0eXBlZGVmLgotCVVwZGF0ZWQgZm9yIHQxZHJpdmVyIGNoYW5nZXMuCi0KLTIwMTEtMTEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGZdIEZpeCBTYXZhbm5haCBidWcgIzM0ODk2LgotCi0JRU5DT0RJTkcgbm93IGNvdmVycyB0aGUgd2hvbGUgVW5pY29kZSByYW5nZS4KLQotCU5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhpcyBjaGFuZ2UgaXMgcXVpdGUgZXhwZW5zaXZlIHNpbmNlIGl0Ci0JaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRocmVlIGFycmF5cyBieSBhbG1vc3QgNDAwa0J5dGUgaW4gdG90YWwuICBUaGUKLQlyaWdodCBmaXggaXMgdG8gcmVwbGFjZSB0aGUgbG9naWMgd2l0aCBzb21ldGhpbmcgc21hcnRlci4KLQlBZGRpdGlvbmFsbHksIHRoZXJlIGV4aXN0IHZlcnkgb2xkIEJERnMgZm9yIHRocmVlLWJ5dGUgQ0NDSUkKLQllbmNvZGluZyB3aGljaCBleGNlZWRzIHRoZSByYW5nZSBvZiBVbmljb2RlIChhbm90aGVyIHJlYXNvbiB0byBoYXZlCi0JYSBzbWFydGVyIGxvZ2ljKS4KLQotCSogc3JjL2JkZi9iZGYuaCAoYmRmX2ZvbnRfdCk6IEluY3JlYXNlIHNpemUgb2YgYG5tb2QnIGFuZCBgdW1vZCcKLQlhcnJheXMuCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChiZGZfcGFyc2VfdCk6IEluY3JlYXNlIHNpemUgb2YgYGhhdmUnIGFycmF5LgotCi0yMDExLTExLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBJbXByb3ZlIHRyYWNpbmcuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKERCR01TRzEsIERCR01TRzIpOiBOZXcgbWFjcm9zLgotCShfYmRmX3BhcnNlX2dseXBocyk6IFVzZSB0aGVtLgotCi0yMDExLTExLTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlJbXByb3ZlIHRyYWNpbmcuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfRG9uZSksIHNyYy9wY2YvcGNmZHJpdnIuYwotCShQQ0ZfRmFjZV9Eb25lKTogUmVtb3ZlIHRyYWNpbmcgbWVzc2FnZS4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfRmFjZV9Jbml0KSwgc3JjL2NmZi9jZmZvYmpzLmMKLQkoY2ZmX2ZhY2VfaW5pdCksIHNyYy9jaWQvY2lkb2Jqcy5jIChjaWRfZmFjZV9pbml0KSwKLQlzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfaW5pdCksIHNyYy9zZm50L3Nmb2Jqcy5jCi0JKHNmbnRfaW5pdF9mYWNlKSwgc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpLAotCXNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KSwgc3JjL3R5cGU0Mi90NDJvYmpzLmMKLQkoVDQyX0ZhY2VfSW5pdCksIHNyYy93aW5mb250cy93aW5mbnQuYyAoRk5UX0ZhY2VfSW5pdCk6IEFkZAotCWBncmVldGluZycgbWVzc2FnZS4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfb3Blbl9mb250KSwgc3JjL3R5cGU0Mi90NDJvYmpzLmMKLQkoVDQyX09wZW5fRmFjZSk6IEltcHJvdmUgdHJhY2luZy4KLQotMjAxMS0xMS0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NpZF0gRml4IGVycm9yIGNvZGUuCi0KLQkqIHNyYy9jaWQvY2lkcGFyc2UuYyAoY2lkX3BhcnNlcl9uZXcpOiBEbyBpdC4KLQotMjAxMS0xMS0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gRml4IGVycm9yIGNvZGUuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfZm9udF9sb2FkKTogRG8gaXQuCi0KLTIwMTEtMTEtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBuZXcgZXJyb3IgY29kZSBGVF9FcnJfTWlzc2luZ19Nb2R1bGUuCi0KLQlQcmV2aW91c2x5LCBGcmVlVHlwZSBtaXNsZWFkaW5nbHkgcmV0dXJuZWQKLQlGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdCBpZiBhIG1vZHVsZSB3YXMgbWlzc2luZyAob3IgYSB0ZXN0IHdhcwotCW1pc3NpbmcgY29tcGxldGVseSkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaCAoRlRfRXJyX01pc3NpbmdfTW9kdWxlKTogRGVmaW5lLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCksIHNyYy9jZmYvY2ZmZHJpdnIuYwotCShjZmZfZ2V0X2dseXBoX25hbWUpLCBzcmMvY2lkL2NpZG9ianMuYyAoY2lkX2ZhY2VfaW5pdCksCi0Jc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfaW5pdF9mYWNlKSwgc3JjL3RydWV0eXBlL3R0b2Jqcy5jCi0JKHR0X2ZhY2VfaW5pdCksIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KSwKLQlzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCwgVDQyX0RyaXZlcl9Jbml0KTogVXBkYXRlZC4KLQotCSogc3JjL3R5cGUxL3QxYWZtLmMgKFQxX1JlYWRfTWV0cmljcyksIHNyYy90eXBlL3Qxb2Jqcy5jCi0JKFQxX0ZhY2VfSW5pdCksIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KTogUmVtb3ZlIG5vdwotCXJlZHVuZGFudCB0ZXN0IGZvciBgcHNhdXgnLgotCi0yMDExLTExLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBBZGQgbW9yZSBlcnJvciBtZXNzYWdlcy4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9zZXRfZGVmYXVsdF9zcGFjaW5nLCBfYmRmX2FkZF9wcm9wZXJ0eSk6Ci0JQWRkIGxpbmUgbnVtYmVyIGFyZ3VtZW50LgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoRVJSTVNHNSwgRVJSTVNHNiwgRVJSTVNHNywgRVJSTVNHOCwgRVJSTVNHOSk6IE5ldyBtYWNyb3MuCi0JKF9iZGZfcmVhZHN0cmVhbSwgX2JkZl9zZXRfZGVmYXVsdF9zcGFjaW5nLCBfYmRmX2FkZF9wcm9wZXJ0eSwKLQlfYmRmX3BhcnNlX2dseXBocywgX2JkZl9wYXJzZV9zdGFydCk6IEFkZCBlcnJvciBtZXNzYWdlcy4KLQotMjAxMS0xMS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmg6IFJlbW92ZSBkZWFkIGNvZGUuCi0KLTIwMTEtMTEtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9yZWxlYXNlczogVXBkYXRlZC4KLQotMjAxMS0xMS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNC44IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNC04Jy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNC44LgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksCi0JYnVpbGRzL3dpbjMyL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDUvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwOC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAxMC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwgYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi40LjcvMi40LjgvLCBzLzI0Ny8yNDgvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDguCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxNDowOjguCi0KLTIwMTEtMTEtMTMgIENocmlzIExpZGRlbGwgIDxjaHJpcy5saWRkZWxsQGFydGlmZXguY29tPgotCi0JQWRkIEZUX0dldF9QU19Gb250X1ZhbHVlKCkgQVBJLgotCi0JVGhpcyBhbGxvd3MgYSBUeXBlIDEgZm9udCBmYWNlIHRvIGJlIGludGVycm9nYXRlZCB0byByZXRyaWV2ZSBtb3N0Ci0Jb2YgdGhlIGRpY3Rpb25hcnkga2V5cyAoa2V5cyBub3QgcmVsZXZhbnQgdG8gRnJlZVR5cGUncyBUeXBlIDEKLQlpbnRlcnByZXRlciBhcmUgbm90IGF2YWlsYWJsZSkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaAotCShQU19HZXRGb250VmFsdWVGdW5jKTogTmV3IHR5cGVkZWYuCi0JKFBTSW5mbyk6IEFkZCBgcHNfZ2V0X2ZvbnRfdmFsdWUnLgotCShGVF9ERUZJTkVfU0VSVklDRV9QU0lORk9SRUMpOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCAoVDFfRW5jb2RpbmdUeXBlKTogTW92ZWQgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaDogSGVyZS4KLQkoUFNfRGljdF9LZXlzKTogTmV3IGVudW1lcmF0aW9uLgotCShGVF9HZXRfUFNfRm9udF9WYWx1ZSk6IE5ldyBkZWNsYXJhdGlvbi4KLQotCSogc3JjL2Jhc2UvZnR0eXBlMS5jIChGVF9HZXRfUFNfRm9udF9WYWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQotCSogc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX3BzX2dldF9mb250X3ZhbHVlKTogVGhpcyBuZXcgZnVuY3Rpb24KLQlkb2VzIHRoZSByZWFsIGpvYi4KLQkodDFfc2VydmljZV9wc19pbmZvKTogQWRkIGl0LgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9zZXJ2aWNlX3BzX2luZm8pLCBzcmMvY2lkL2NpZHJpdmVyLmMKLQkoY2lkX3NlcnZpY2VfcHNfaW5mbyksIHNyYy90eXBlNDIvdDQyZHJpdnIuYyAodDQyX3NlcnZpY2VfcHNfaW5mbyk6Ci0JVXBkYXRlZC4KLQotMjAxMS0xMS0wOCAgQnJhZGVuIFRob21hcyAgPGJ0aG9tYXNAYXBwbGUuY29tPgotCi0JW2NpZF0gVmFyaW91cyBsb2FkaW5nIGZpeGVzLgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAoY2lkX2xvYWRfa2V5d29yZCkgPGRlZmF1bHQ+LAotCShwYXJzZV9mb250X21hdHJpeCwgcGFyc2VfZXhwYW5zaW9uX2ZhY3Rvcik6IENvcnJlY3RseSBjaGVjayBudW1iZXIKLQlvZiBkaWN0aW9uYXJpZXMuCi0JKGNpZF9yZWFkX3N1YnJzKTogUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgdmFsdWVzIG9mIGBudW1fc3VicnMnLgotCUFzc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBvZiB0aGUgYG9mZnNldHMnIGFycmF5IGFyZSBhc2NlbmRpbmcuCi0KLTIwMTEtMTEtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogUkVBRE1FOiBXZSB1c2UgY29weXJpZ2h0IHJhbmdlcyBhbHNvLgotCi0JQWNjb3JkaW5nIHRvCi0KLQkgIGh0dHA6Ly93d3cuZ251Lm9yZy9wcmVwL21haW50YWluL2h0bWxfbm9kZS9Db3B5cmlnaHQtTm90aWNlcy5odG1sCi0KLQl0aGlzIHNob3VsZCBiZSBtZW50aW9uZWQgZXhwbGljaXRseS4KLQotMjAxMS0xMC0zMCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtyYWNjZXNzXSBTdXBwbGVtZW50IGZvciBwcmV2aW91cyBmaXguCi0KLQkqIHNyYy9iYXNlL2Z0YmFzZS5oIChyYWNjZXNzX3J1bGVfYnlfZGFyd2luX3Zmcyk6IERvIG5vdCBkZWNsYXJlCi0JaXQgb24gbmF0aXZlIE1hYyBPUyBYLgotCSogc3JjL2Jhc2UvZnRyZm9yay5jIChyYWNjZXNzX2dldF9ydWxlX3R5cGVfZnJvbV9ydWxlX2luZGV4KToKLQlIaWRlIHJhY2Nlc3NfZ2V0X3J1bGVfdHlwZV9mcm9tX3J1bGVfaW5kZXgoKSBvbiBuYXRpdmUgTWFjIE9TIFgKLQl0b28uCi0KLTIwMTEtMTAtMzAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbcmFjY2Vzc10gSGlkZSByYWNjZXNzX3J1bGVfYnlfZGFyd2luX3ZmcygpIG9uIG5hdGl2ZSBNYWMgT1MgWC4KLQotCSogc3JjL2Jhc2UvZnRyZm9yay5jIChyYWNjZXNzX3J1bGVfYnlfZGFyd2luX3Zmcyk6IERvIG5vdAotCWNvbXBpbGUgb24gbmF0aXZlIE1hYyBPUyBYIGJlY2F1c2UgaXQgaXMgbm90IHVzZWQuCi0KLTIwMTEtMTAtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IE1EIGluc3RydWN0aW9uIGZvciB0d2lsaWdodCB6b25lLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX01EKTogV2l0aG91dCB0aGlzIGZpeCwgdGhlIE1ECi0JaW5zdHJ1Y3Rpb24gYXBwbGllZCB0byBvcmlnaW5hbCBjb29yZGluYXRlcyBvZiB0d2lsaWdodCBwb2ludHMKLQlhbHdheXMgcmV0dXJucyB6ZXJvLgotCi0yMDExLTEwLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi40LjcgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi00LTcnLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi40LjcuCi0KLQkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwKLQlidWlsZHMvd2luMzIvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMDgvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLCBidWlsZHMvd2luMzIvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sLCBidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbDogcy8yLjQuNi8yLjQuNy8sIHMvMjQ2LzI0Ny8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gNy4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDEzOjI6Ny4KLQotMjAxMS0xMC0xNSAgS2FsIENvbmxleSAgPGtjY29ubGV5QGdtYWlsLmNvbT4KLQotCUZpeCBoYW5kbGluZyBvZiB0cmFuc2Zvcm1hdGlvbnMgaWYgbm8gcmVuZGVyZXIgaXMgcHJlc2VudC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBUaGlua28uCi0KLTIwMTEtMTAtMTUgIEthbCBDb25sZXkgIDxrY2NvbmxleUBnbWFpbC5jb20+Ci0KLQlGaXggY29uZGl0aW9ucyBmb3IgYXV0b2hpbnRpbmcuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogSGFuZGxlCi0JRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNLgotCi0yMDExLTEwLTA3ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2d4dmFsaWRdIEZpeCBhIGJ1ZyB0byBkZXRlY3QgdG9vIGxhcmdlIG9mZnNldCBpbiBtb3J4IHRhYmxlLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J4Mi5jCi0JKGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX2xpZ0FjdGlvbkluZGV4X3ZhbGlkYXRlKTogRml4IGEgYnVnCi0JdGhhdCB0b28gbGFyZ2UgcG9zaXRpdmUgb2Zmc2V0IGNhbm5vdCBiZSBkZXRlY3RlZC4KLQotMjAxMS0xMC0wMSAgQnJhZGVuIFRob21hcyAgPGJ0aG9tYXNAYXBwbGUuY29tPgotCi0JSGFuZGxlIHNvbWUgYm9yZGVyIGNhc2VzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oIChGVF9VU0hPUlRfTUFYKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfQ29udmVydCk6IFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkCi0JdmFsdWUgb2YgYHRhcmdldC0+cm93cycuCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogQWRkIGNoZWNrIGZvcgotCWZsZXggc3RhcnQuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyZW5kMS5jIChmdF9yYXN0ZXIxX3JlbmRlcik6IENoZWNrIGB3aWR0aCcgYW5kCi0JYGhlaWdodCcuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1ZhcnlfR2V0X0dseXBoX0RlbHRhcyk6IFByb3RlY3QgYWdhaW5zdAotCWludmFsaWQgdmFsdWVzIGluIGBsb2NhbHBvaW50cycgYXJyYXkuCi0KLTIwMTEtMTAtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc25hbWVzXSBIYW5kbGUgemFwZmRpbmdiYXRzLgotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTmljb2xhcyBSb3VnaWVyIDxOaWNvbGFzLlJvdWdpZXJAaW5yaWEuZnI+LgotCi0JKiBzcmMvdG9vbHMvZ2xuYW1lcy5weSAoYWRvYmVfZ2x5cGhfbGlzdCk6IEFkZCBkYXRhIGZyb20gQUdMJ3MKLQlgemFwZmRpbmdiYXRzLnR4dCcgZmlsZS4KLQotCSogc3JjL3BzbmFtZXMvcHN0YWJsZXMuaDogUmVnZW5lcmF0ZWQuCi0KLTIwMTEtMDktMjcgIFNpbW9uIELDvG56bGkgIDx6ZW5pa29AZ21haWwuY29tPgotCi0JW3R5cGUxXSBGaXggU2F2YW5uYWggYnVnICMzNDE4OS4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9PcGVuX0ZhY2UpOiBJbml0aWFsaXplCi0JYGZhY2UtPmxlbl9idWlsZGNoYXInLgotCi0yMDExLTA5LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBEdW1wIFNJRHMgd2hpbGUgdHJhY2luZy4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBEbyBpdC4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VyX3J1bikgW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXQotCTxjZmZfa2luZF9zdHJpbmc+OiBJZGVudGlmeSBhcyBTSUQuCi0KLTIwMTEtMDktMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJlbW92ZSB1bnVzZWQgRlRfQUxJR05NRU5UIG1hY3JvLgotCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiwgYnVpbGRzL3Ztcy9mdGNvbmZpZy5oLAotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IERvIGl0LgotCi0yMDExLTA5LTE3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBTbGlnaHRseSBvcHRpbWl6ZSBjb25pYyBhbmQgY3ViaWMgZmxhdHRlbmVycy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmVuZGVyX2NvbmljLCBncmF5X3JlbmRlcl9jdWJpYyk6IE1vdmUKLQlvdXQgc29tZSBjb2RlIGZyb20gdGhlIG1haW4gbG9vcCB0byBzcGVlZCBpdCB1cC4KLQotMjAxMS0wOS0xMSAgVG9tYXMgSG9nZXIgIDx0aG9nZXJAcmVkaGF0LmNvbT4KLQotCVNsaWdodGx5IGltcHJvdmUgTFpXX0NMRUFSIGhhbmRsaW5nLgotCi0JKiBzcmMvbHp3L2Z0em9wZW4uYyAoZnRfbHp3c3RhdGVfaW8pIDxGVF9MWldfUEhBU0VfQ09ERT46Ci0JRW5zdXJlIHRoYXQgc3Vic2VxdWVudCAobW9kdWxvIGdhcmJhZ2UgYnl0ZShzKSkgTFpXX0NMRUFSIGNvZGVzIGFyZQotCWhhbmRsZWQgYXMgY2xlYXIgY29kZXMuICBUaGlzIGFsc28gcmUtc2V0cyBvbGRfY29kZSBhbmQgb2xkX2NoYXIgdG8KLQlwcmVkaWN0YWJsZSB2YWx1ZXMsIHdoaWNoIGlzIGEgbGl0dGxlIGJldHRlciB0aGFuIHVzaW5nIGByYW5kb20nCi0Jb25lcyBpZiB0aGUgY29kZSBmb2xsb3dpbmcgTFpXX0NMRUFSIGlzIGludmFsaWQuCi0KLTIwMTEtMDktMTEgIFRvbWFzIEhvZ2VyICA8dGhvZ2VyQHJlZGhhdC5jb20+Ci0KLQlBZGQgZXhwbGljaXQgTFpXIGRlY29tcHJlc3Npb24gc3RhY2sgc2l6ZSBsaW1pdC4KLQotCVN0YWNrIGxhcmdlciB0aGFuIDE8PExaV19NQVhfQklUUyBpcyBuZXZlciBuZWVkZWQgaWYgcHJlZml4IHRhYmxlIGlzCi0JY29uc3RydWN0ZWQgY29ycmVjdGx5LiAgSXQncyBldmVuIGxlc3MgdGhhbiB0aGF0LCBzZWUgZS5nLgotCWxpYmFyY2hpdmUgY29kZSBjb21tZW50IGZvciBhIGJldHRlciBzaXplIHVwcGVyIGJvdW5kOgotCi0JICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvbGliYXJjaGl2ZS9zb3VyY2UvYnJvd3NlL3RydW5rL2xpYmFyY2hpdmUvYXJjaGl2ZV9yZWFkX3N1cHBvcnRfZmlsdGVyX2NvbXByZXNzLmM/cj0zNjM1IzEyMQotCi0JVGhpcyBwYXRjaCBhZGRzIGV4cGxpY2l0IHN0YWNrIHNpemUgbGltaXQsIGVuZm9yY2VkIHdoZW4gc3RhY2sgaXMKLQlyZWFsbG9jZWQuCi0KLQlBbiBhbHRlcm5hdGl2ZSBpcyB0byBlbnN1cmUgdGhhdCBjb2RlIDwgc3RhdGUtPnByZWZpeFtjb2RlIC0gMjU2XQotCXdoZW4gdHJhdmVyc2luZyBwcmVmaXggdGFibGUuICBTdWNoIGNoZWNrIGlzIGxlc3MgZWZmaWNpZW50IGFuZAotCXNob3VsZCBub3QgYmUgcmVxdWlyZWQgaWYgcHJlZml4IHRhYmxlIGlzIGNvbnN0cnVjdGVkIGNvcnJlY3RseSBpbgotCXRoZSBmaXJzdCBwbGFjZS4KLQotCSogc3JjL2x6dy9mdHpvcGVuLmMgKGZ0X2x6d3N0YXRlX3N0YWNrX2dyb3cpOiBJbXBsZW1lbnQgaXQuCi0KLTIwMTEtMDktMTEgIFRvbWFzIEhvZ2VyICA8dGhvZ2VyQHJlZGhhdC5jb20+Ci0KLQlQcm90ZWN0IGFnYWluc3QgbG9vcHMgaW4gdGhlIHByZWZpeCB0YWJsZS4KLQotCUxaVyBkZWNvbXByZXNzb3IgZGlkIG5vdCBzdWZmaWNpZW50bHkgY2hlY2sgY29kZXMgcmVhZCBmcm9tIHRoZQotCWlucHV0IExaVyBzdHJlYW0uICBBIHNwZWNpYWxseS1jcmFmdGVkIG9yIGNvcnJ1cHRlZCBpbnB1dCBjb3VsZAotCWNyZWF0ZSBhIGxvb3AgaW4gdGhlIHByZWZpeCB0YWJsZSwgd2hpY2ggbGVhZHMgdG8gbWVtb3J5IHVzYWdlCi0Jc3Bpa2VzLCBhcyB0aGVyZSdzIG5vIGRlY29tcHJlc3Npb24gc3RhY2sgc2l6ZSBsaW1pdC4KLQotCSogc3JjL2x6dy9mdHpvcGVuLmMgKGZ0X2x6d3N0YXRlX2lvKSA8RlRfTFpXX1BIQVNFX1NUQVJUPjogRmlyc3QKLQljb2RlIGluIHZhbGlkIExaVyBzdHJlYW0gbXVzdCBiZSAwLi4yNTUuCi0JPEZUX0xaV19QSEFTRV9DT0RFPjogSW4gdGhlIHNwZWNpYWwgS3dLd0sgY2FzZSwgY29kZSA9PSBmcmVlX2VudCwKLQljb2RlID4gZnJlZV9lbnQgaXMgaW52YWxpZC4KLQotMjAxMS0wOS0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQmV0dGVyIHRyYWNpbmcgb2YgbWV0cmljcy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1JlcXVlc3RfU2l6ZSwgRlRfU2VsZWN0X1NpemUpOiBEZWNvcmF0ZSB3aXRoCi0JRlRfVFJBQ0UuCi0KLTIwMTEtMDktMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBTYXZhbm5haCBidWcgIzMzODE2LgotCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9Gb250UmVjRGljdFJlYyk6IE5ldyBtZW1iZXIKLQlgaGFzX2ZvbnRfbWF0cml4Jy4KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX2ZvbnRfbWF0cml4KTogU2V0IGl0LgotCVVwZGF0ZSB0cmFjaW5nIG91dHB1dC4KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogVXNlIGl0IHNvIHRoYXQgdGhlIGhldXJpc3RpY3MKLQljYW4gYmUgcmVtb3ZlZC4KLQotMjAxMS0wOC0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQmV0dGVyIHRyYWNpbmcgb2YgbWV0cmljcy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1NlbGVjdF9NZXRyaWNzLCBGVF9SZXF1ZXN0X01ldHJpY3MpOgotCURlY29yYXRlIHdpdGggRlRfVFJBQ0UuCi0KLTIwMTEtMDgtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEJldHRlciB0cmFjaW5nIG9mIHRoZSBwYXJzaW5nIHByb2Nlc3MuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfc3ViZm9udF9sb2FkLCBjZmZfZm9udF9sb2FkKTogRGVjb3JhdGUgd2l0aAotCUZUX1RSQUNFLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9mb250X21hdHJpeCwgY2ZmX3BhcnNlX2ZvbnRfYmJveCwKLQljZmZfcGFyc2VfcHJpdmF0ZV9kaWN0LCBjZmZfcGFyc2VfY2lkX3Jvcyk6IFVwZGF0ZWQuCi0JKENGRl9GSUVMRF9OVU0sIENGRl9GSUVMRF9GSVhFRCwgQ0ZGX0ZJRUxEX0ZJWEVEXzEwMDAsCi0JQ0ZGX0ZJRUxEX1NUUklORywgQ0ZGX0ZJRUxEX0JPT0wsIENGRl9GSUVMRF9DQUxMQkFDSywgQ0ZGX0ZJRUxELAotCUNGRl9GSUVMRF9ERUxUQSk6IEFkZCBhcmd1bWVudCBmb3IgSUQuCi0JKGNmZl9wYXJzZXJfcnVuKTogRGVjb3JhdGUgd2l0aCBGVF9UUkFDRS4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5oIChDRkZfRmllbGRfSGFuZGxlcikgW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXTogQWRkCi0JYGlkJyBtZW1iZXIuCi0KLQkqIHNyYy9jZmYvY2ZmdG9rZW4uaDogQWRkIElEcyB0byBhbGwgZmllbGRzLgotCi0yMDExLTA4LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzNDAyMi4KLQotCSogUkVBRE1FLCBkb2NzL0lOU1RBTEw6IFJlbW92ZSByZWZlcmVuY2VzIHRvIFVQR1JBREUuVU5JWC4KLQotMjAxMS0wOC0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzQwMTguCi0KLQkqIGRvY3MvVVBHUkFERS5VTklYOiBSZW1vdmVkLiAgT2Jzb2xldGUuCi0KLTIwMTEtMDgtMTUgIERhdmlkIEJldmFuICA8ZGF2aWQuYmV2YW5AcGIuY29tPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzM5OTIuCi0KLQkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lKTogRml4IGJvcmRlciBjYXNlLgotCi0yMDExLTA4LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVt0cnVldHlwZV0gRml4IGRlZ2VuZXJhdGUgY2FzZSBpbiBTe1AsRixEUH1WVEwgb3Bjb2Rlcy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TeFZUTCk6IEhhbmRsZSBwMSA9PSBwMiBzcGVjaWFsbHkuCi0JKEluc19TRFBWVEwpOiBIYW5kbGUgdjEgPT0gdjIgc3BlY2lhbGx5LgotCi0yMDExLTA4LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBGaXggU2F2YW5uYWggYnVnICMzMzk3NS4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfZm9udF9tYXRyaXgpOiBGaXggdHlwby4KLQotMjAxMS0wNy0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNC42IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNC02Jy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNC42LgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksCi0JYnVpbGRzL3dpbjMyL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDUvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwOC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAxMC9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvaW5kZXguaHRtbCwgYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi40LjUvMi40LjYvLCBzLzI0NS8yNDYvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDYuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxMzoxOjcuCi0KLTIwMTEtMDctMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEFkZCBzb21lIG1vcmUgdHJhY2luZyBpbmZvcy4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfZm9udF9tYXRyaXgsIGNmZl9wYXJzZV9mb250X2Jib3gsCi0JY2ZmX3BhcnNlX2NpZF9yb3MpOiBBZGQgdHJhY2luZy4KLQotMjAxMS0wNy0yMiAgRGlyayBNw7xsbGVyICA8ZG11ZWxsZXJAc3VzZS5kZT4KLQotCVtwc2F1eCwgdHlwZTFdIEZpeCBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2VzLgotCi0JRm91bmQgd2l0aCBmb250IGZ1enp5aW5nLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IENoZWNrCi0JYGRlY29kZXItPmJ1aWxkY2hhcicuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAodDFfbG9hZF9rZXl3b3JkKTogQ2hlY2sgYGJsZW5kLT5udW1fZGVzaWducycuCi0KLTIwMTEtMDctMjAgIENocmlzIE1vcmdhbiAgPGNtb3JnYW5AY3liZXhpbnRsLmNvbT4KLQotCUFkZCBGVF9DT05GSUdfT1BUSU9OX0RJU0FCTEVfU1RSRUFNX1NVUFBPUlQuCi0KLQlVc2VmdWwgZm9yIGVtYmVkZGVkIHN5c3RlbXMgd2hpY2ggZG9uJ3QgbmVlZCBmaWxlIHN0cmVhbSBzdXBwb3J0LgotCi0JKiBzcmMvYmFzZS9mdHN5c3RlbS5jLCBzcmMvYmFzZS9mdG9ianMuYyAoRlRfU3RyZWFtX05ldyk6IEltcGxlbWVudAotCWl0LgotCi0yMDExLTA3LTIwICBFbHRvbiBDaHVuZyAgPGVsdG9uMzI4QGdtYWlsLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRwYXRlbnQuYyAoRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZyk6IEZpeCB0eXBvLgotCi0yMDExLTA3LTE2ICBTdGV2ZW4gQ2h1ICA8c3RldmVuLmYuY2h1QGdtYWlsLmNvbT4KLQotCVt0cnVldHlwZV0gRml4IG1ldHJpY3Mgb24gc2l6ZSByZXF1ZXN0IGZvciBzY2FsYWJsZSBmb250cy4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X3NpemVfcmVxdWVzdCk6IEZpeCBjb3B5aW5nIG1ldHJpY3MKLQlmcm9tIFRUX1NpemUgdG8gRlRfU2l6ZSBpZiBzY2FsYWJsZSBmb250LgotCi0JU2VlCi0KLQkgIGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDExLTA3L21zZzAwMDQ5Lmh0bWwKLQotCWZvciBzb21lIGNvbXBhcmlzb24gaW1hZ2VzLgotCi0yMDExLTA3LTE0ICBNYXR0aGlhcyBEcm9jaG5lciAgPE0uRHJvY2huZXJAZnotanVlbGljaC5kZT4uCi0KLQlbcHNhdXhdIEZpeCBwb3RlbnRpYWwgc2lnbiBleHRlbnNpb24gcHJvYmxlbXMuCi0KLQlXaGVuIHNoaWZ0aW5nIHJpZ2h0IGEgc2lnbmVkIHZhbHVlLCBpdCBpcyBub3QgZGVmaW5lZCBieSB0aGUKLQlDIHN0YW5kYXJkIHdoZXRoZXIgb25lIGdldHMgYSBzaWduIGV4dGVuc2lvbiBvciBub3QuICBVc2UgYSBtYWNybyB0bwotCWRvIGFuIGV4cGxpY2l0IGNhc3QgZnJvbSBhIHNpZ25lZCBzaG9ydCAoYXNzdW1pbmcgdGhhdCB0aGlzIGlzCi0JMTZiaXQpIHRvIGFuIGludC4KLQotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKEZpeDJJbnQpOiBOZXcgbWFjcm8uCi0JVXNlIGl0IHdoZXJlIGFwcHJvcHJpYXRlLgotCi0yMDExLTA3LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxvcF9jYWxsb3RoZXJzdWJyPjogQmV0dGVyIGhhbmRsaW5nIG9mIHN1YnJvdXRpbmUgaW5kZXggMC4KLQlGcm9tIE1hdHRoaWFzIERyb2NobmVyIDxNLkRyb2NobmVyQGZ6LWp1ZWxpY2guZGU+LgotCi0yMDExLTA3LTEwICDQkNC70LXQutGB0LXQuSDQn9C+0LTRgtC10LvQtdC20L3QuNC60L7QsiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtwc2F1eF0gT3B0aW1pemUgcHJldmlvdXMgY29tbWl0LgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykKLQk8b3BfY2FsbG90aGVyc3Vicj46IE1vdmUgZXJyb3IgY2hlY2sgZG93biB0byBhdm9pZCB0ZXN0aW5nIHR3aWNlIGZvcgotCWdvb2QgY2FzZXMuCi0KLTIwMTEtMDctMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eF0gQWRkIGJldHRlciBhcmd1bWVudCBjaGVjayBmb3IgYGNhbGxvdGhlcnN1YnInLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykKLQk8b3BfY2FsbG90aGVyc3Vicj46IFJlamVjdCBuZWdhdGl2ZSBhcmd1bWVudHMuCi0KLTIwMTEtMDctMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBUcnkgaGFyZGVyIHRvIGZpbmQgbm9uLXplcm8gdmFsdWVzIGZvciBhc2NlbmRlciBhbmQgZGVzY2VuZGVyLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBDb25zdWx0IGBPUy8yJyB0YWJsZSBpbiBjYXNlCi0JdGhlIGBoaGVhJyB0YWJsZSdzIHZhbHVlcyBhcmUgemVyby4KLQotMjAxMS0wNy0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IHByZXZpb3VzIGNvbW1pdC4KLQotCVdlIHdhbnQgdG8gdW5zZXQgRlRfRkFDRV9GTEFHX1NDQUxBQkxFIG9ubHkgaWYgdGhlcmUgYXJlIGJpdG1hcAotCXN0cmlrZXMgaW4gdGhlIGZvbnQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZmFjZV9pbml0KTogSW1wbGVtZW50IGl0LgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTEtMDctMDIgIEp1c3QgRmlsbCBCdWdzICA8bW96YnVnYm94QHlhaG9vLmNvbS5hdT4KLQotCVt0cnVldHlwZV0gRml4IFNhdmFubmFoIGJ1ZyAjMzMyNDYuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfY2hlY2tfc2luZ2xlX25vdGRlZik6IE5ldyBmdW5jdGlvbi4KLQkodHRfZmFjZV9pbml0KTogVXNlIGl0IHRvIHRlc3QgRlRfRkFDRV9GTEFHX1NDQUxBQkxFLgotCi0yMDExLTA3LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxMS0wNy0wMiAgRGF2aWQgQmV2YW4gIDxkYXZpZC5iZXZhbkBwYi5jb20+Ci0KLQlbZnRzdHJva2VdIE1ham9yIHJldmlzaW9uLgotCi0JVGhlIG1haW4gcHJvYmxlbXMKLQktLS0tLS0tLS0tLS0tLS0tLQotCi0JICBvIElmIEZUX1NUUk9LRVJfTElORUpPSU5fQkVWRUwgd2FzIHNwZWNpZmllZCwgdW5saW1pdGVkIG1pdGVyCi0JICAgIGpvaW5zIChub3QgYmV2ZWwgam9pbnMpIHdlcmUgZ2VuZXJhdGVkLiAgSW5kZWVkLCB0aGUgbWVhbmluZ3Mgb2YKLQkgICAgYG1pdGVyJyBhbmQgYGJldmVsJyB3ZXJlIGluY29ycmVjdGx5IHJldmVyc2VkIChjb25zaXN0ZW50bHkpIGluCi0JICAgIGJvdGggdGhlIGNvZGUgYW5kIGNvbW1lbnRzLgotCi0JICBvIFRoZSB3YXkgYmV2ZWwgam9pbnMgd2VyZSBjb25zdHJ1Y3RlZCAod2hldGhlciBzcGVjaWZpZWQKLQkgICAgZXhwbGljaXRseSwgb3IgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBleGNlZWRpbmcgdGhlIG1pdGVyIGxpbWl0KQotCSAgICBkaWQgbm90IG1hdGNoIHdoYXQgaXMgcmVxdWlyZWQgZm9yIHN0cm9rZWQgdGV4dCBpbiBQb3N0U2NyaXB0IG9yCi0JICAgIFBERi4KLQotCVRoZSBtYWluIGZpeGVzCi0JLS0tLS0tLS0tLS0tLS0KLQotCSAgbyBUaGUgYmVoYXZpb3VyIG9mIEZUX1NUUk9LRVJfTElORUpPSU5fQkVWRUwgaGFzIGJlZW4gY29ycmVjdGVkLgotCi0JICBvIEEgbmV3IGxpbmUgam9pbiBzdHlsZSwgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9GSVhFRCwgaGFzIGJlZW4KLQkgICAgaW50cm9kdWNlZCB0byBzdXBwb3J0IFBvc3RTY3JpcHQgYW5kIFBERiBtaXRlciBqb2lucy4KLQotCSAgbyBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYW4KLQkgICAgYWxpYXMgZm9yIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVIuCi0KLQlBZGRpdGlvbmFsbHksIGEgdmFyaWV0eSBvZiBzdHJva2luZyBlcnJvcnMgaGF2ZSBiZWVuIGZpeGVkLiAgVGhlc2UKLQl3b3VsZCBjYXVzZSB2YXJpb3VzIGFydGlmYWN0cyAoaW5jbHVkaW5nIHBvaW50cyBgYXQgaW5maW5pdHknKSwKLQllc3BlY2lhbGx5IHdoZW4gc3Ryb2tpbmcgcG9vciBxdWFsaXR5IGZvbnRzLgotCi0JU2VlCi0KLQkgIGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDExLTA3L21zZzAwMDAxLmh0bWwKLQotCWZvciBleGFtcGxlIGRvY3VtZW50cy4gIFRoZSBGcmVlVHlwZSBzdHJva2VyIG5vdyBwcm9kdWNlcyByZXN1bHRzCi0JdmVyeSBzaW1pbGFyIHRvIHRoYXQgcHJvZHVjZWQgYnkgR2hvc3RTY3JpcHQgYW5kIERpc3RpbGxlciBmb3IgdGhlc2UKLQlmb250cy4KLQotCU90aGVyIHByb2JsZW1zCi0JLS0tLS0tLS0tLS0tLS0KLQotCVRoZSBmb2xsb3dpbmcgcHJvYmxlbXMgaGF2ZSBiZWVuIHJlc29sdmVkOgotCi0JICBvIEluc2lkZSBjb3JuZXJzIGNvdWxkIGJlIGdlbmVyYXRlZCBpbmNvcnJlY3RseS4gIEludGVyc2VjdGluZyB0aGUKLQkgICAgaW5zaWRlIGNvcm5lciBjb3VsZCBjYXVzZSBhIG1pc3NpbmcgdHJpYW5ndWxhciBhcmVhIGFuZCBvdGhlcgotCSAgICBlZmZlY3RzLgotCi0JICAgIFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCBpZiB0aGUgam9pbiBpcyBiZXR3ZWVuCi0JICAgIHR3byBsaW5lcyBhbmQgYm90aCBsaW5lcyBhcmUgbG9uZyBlbm91Z2guICBUaGUgYG9wdGltaXphdGlvbicKLQkgICAgY29uZGl0aW9uIGluIGBmdF9zdHJva2VyX2luc2lkZScgaGFzIGJlZW4gY29ycmVjdGVkOyB0aGlzCi0JICAgIHJlcXVpcmVzIHRoZSBsaW5lIGxlbmd0aCB0byBiZSBwYXNzZWQgaW50byB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQKLQkgICAgc3RvcmVkIGluIGBGVF9TdHJva2VyUmVjJy4KLQotCSAgbyBJbmNvcnJlY3QgY3ViaWMgY3VydmVzIGNvdWxkIGJlIGdlbmVyYXRlZC4gIFRoZSBhbmdsZQotCSAgICBjYWxjdWxhdGlvbnMgaW4gYEZUX1N0cm9rZXJfQ3ViaWNUbycgaGF2ZSBiZWVuIGNvcnJlY3RlZCB0bwotCSAgICBoYW5kbGUgdGhlIGNhc2Ugb2YgdGhlIGN1cnZlIGNyb3NzaW5nIHRoZSArLy1QSSBkaXJlY3Rpb24uCi0KLQkgIG8gSWYgdGhlIGJvcmRlciByYWRpdXMgd2FzIGdyZWF0ZXIgdGhhbiB0aGUgcmFkaXVzIG9mIGN1cnZhdHVyZSBvZgotCSAgICBhIGN1cnZlLCB0aGVuIHRoZSBuZWdhdGl2ZSBzZWN0b3Igd291bGQgZW5kIHVwIG91dHNpZGUgKG5vdAotCSAgICBpbnNpZGUpIHRoZSBib3JkZXIuICBUaGlzIHNpdHVhdGlvbiBpcyBub3cgcmVjb2duaXplZCBhbmQgdGhlCi0JICAgIG5lZ2F0aXZlIHNlY3RvciBpcyBjaXJjdW1uYXZpZ2F0ZWQgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4KLQkgICAgKElmIHJvdW5kIGxpbmUgam9pbnMgYXJlIGJlaW5nIHVzZWQsIHRoaXMgY29kZSBpcyBkaXNhYmxlZAotCSAgICBiZWNhdXNlIHRoZSBsaW5lIGpvaW4gd2lsbCBhbHdheXMgY292ZXIgdGhlIG5lZ2F0aXZlIHNlY3Rvci4pCi0KLQkgIG8gV2hlbiBhIGN1cnZlIGlzIHNwbGl0LCB0aGUgYXJjcyBtYXkgbm90IGpvaW4gc21vb3RobHkgKGVzcGVjaWFsbHkKLQkgICAgaWYgdGhlIGN1cnZlIHR1cm5zIHNoYXJwbHkgYmFjayBvbiBpdHNlbGYpLiAgQ2hhbmdlcyBpbgotCSAgICBkaXJlY3Rpb24gYmV0d2VlbiBhZGphY2VudCBhcmNzIHdlcmUgbm90IGhhbmRsZWQuICBBIHJvdW5kCi0JICAgIGNvcm5lciBpcyBub3cgYWRkZWQgaWYgdGhlIGRldmlhdGlvbiBmcm9tIG9uZSBhcmMgdG8gdGhlIG5leHQgaXMKLQkgICAgZ3JlYXRlciB0aGFuIGEgc3VpdGFibGUgdGhyZXNob2xkLgotCi0JICBvIFRoZSBjdXJyZW50IGRpcmVjdGlvbiB3YXNuJ3QgcmV0YWluZWQgaWYgYSB0aGUgb3V0bGluZSBjb250YWluZWQKLQkgICAgYSB6ZXJvIGxlbmd0aCBsaW5ldG8gb3IgYSBjdXJ2ZSB0aGF0IHdhcyBkZXRlcm1pbmVkIHRvIGJlCi0JICAgIGBiYXNpY2FsbHkgYSBwb2ludCcuICBUaGlzIGNvdWxkIGNhdXNlIGEgc3B1cmlvdXMgam9pbiB0byBiZQotCSAgICBhZGRlZC4KLQotCSAgbyBDdWJpY3Mgd2l0aCBjbG9zZSBjb250cm9sIHBvaW50cyBjb3VsZCBiZSBtaXNoYW5kbGVkLiAgQWxsIGVpZ2h0Ci0JICAgIGNhc2VzIGFyZSBub3cgZGlzdGluZ3Vpc2hlZCBjb3JyZWN0bHkuCi0KLQlPdGhlciBpbXByb3ZlbWVudHMKLQktLS0tLS0tLS0tLS0tLS0tLS0KLQotCW8gQm9yZGVycyBmb3IgY3ViaWMgY3VydmVzIGNvdWxkIGJlIHRvbyBgZmxhdCcuCi0JICBGVF9TTUFMTF9DVUJJQ19USFJFU0hPTEQgaGFzIGJlZW4gcmVkdWNlZCBhIGxpdHRsZSB0byBwcmV2ZW50Ci0JICB0aGlzLgotCi0JbyBUaGUgaGFuZGxpbmcgYW5kIHVzZSBvZiBtb3ZhYmxlIHBvaW50cyBoYXMgYmVlbiBzaW1wbGlmaWVkIGEKLQkgIGxpdHRsZS4KLQotCW8gVmFyaW91cyB2YWx1ZXMgYXJlIG5vdyBjb21wdXRlZCBvbmx5IGlmIHRoZSByZXN1bHRzIGFyZSBhY3R1YWxseQotCSAgbmVlZGVkLgotCi0JbyBUaGUgZGlyZWN0aW9ucyBvZiB0aGUgb3V0ZXIgYW5kIGlubmVyIGJvcmRlcnMgaGF2ZSBiZWVuIHN3YXBwZWQsCi0JICBhcyByZWNvbW1lbmRlZCBieSBHcmFoYW0gQXNoZXIuCi0KLQkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmM6IFJldmlzZWQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlLmg6IFVwZGF0ZWQuCi0KLTIwMTEtMDYtMzAgIMSwc21haWwgRMO2bm1leiAgPGlzbWFpbEBuYW10cmFjLm9yZz4KLQotCSogYnVpbGRzL3RvcGxldmVsLm1rOiBXZSB1c2UgZ2l0LCBub3QgQ1ZTLCB0aHVzIHNraXAgYC5naXRpZ25vcmUnLgotCi0yMDExLTA2LTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBGaXggU2F2YW5uYWggYnVnICMzMzY2My4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9nbHlwaHMpOiBIYW5kbGUgbmVnYXRpdmUgdmFsdWVzIGZvcgotCUVOQ09ESU5HIGNvcnJlY3RseS4KLQotCSogZG9jcy9DSEFOR0VTOiBEb2N1bWVudCBpdC4KLQotMjAxMS0wNi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNC41IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNC01Jy4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNC41Ci0KLQkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwKLQlidWlsZHMvd2luMzIvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiwgYnVpbGRzL3dpbjMyL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW4zMi92YzIwMDgvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLCBidWlsZHMvd2luMzIvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9pbmRleC5odG1sLCBidWlsZHMvd2luMzIvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbDogcy8yLjQuNC8yLjQuNS8sIHMvMjQ0LzI0NS8uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gNS4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDEzOjA6Ny4KLQotMjAxMS0wNi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3Nfc2NhbGVfZGltKTogRml4IGNoYW5nZQotCWZyb20gMjAxMS0wNS0wNC4KLQotMjAxMS0wNi0xOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtneHZhbGlkXSBtYWtlIHRoZSBgcHJvcCcgdmFsaWRhdGlvbiB0cmFjaW5nIHZlcmJvc2UuCi0KLQkqIHNyYy9neHZhbGlkL2d4dnByb3AuYzogQWRkIHRyYWNpbmcgbWVzc2FnZXMgZm9yIGVycm9ycy4KLQotMjAxMS0wNi0xOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVthdXRvZ2VuLnNoXSBSZWZsZWN0IGVudmlyb25tZW50IHZhcmlhYmxlIExJQlRPT0xJWkUuCi0KLTIwMTEtMDYtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVVwZGF0ZSBsaWNlbnNlIGRvY3VtZW50YXRpb24uCi0KLQkqIGRvY3MvR1BMLlRYVDogUmVuYW1lZCB0by4uLgotCSogZG9jcy9HUEx2Mi5UWFQ6IFRoaXMuCi0KLQkqIGRvY3MvTElDRU5TRS5UWFQ6IFVwZGF0ZWQuCi0KLTIwMTEtMDYtMTQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGaXggZysrNC42IGNvbXBpbGVyIHdhcm5pbmdzIGluIG1vZHVsZSBkcml2ZXJzLgotCi0JVGhlIGJhY2tncm91bmQgaXMgc2FtZSB3aXRoIHByZXZpb3VzIGNvbW1pdC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMpOgotCUluaXQgYHBvaW50cycuICAoVFRfVmFyeV9HZXRfR2x5cGhfRGVsdGFzKTogSW5pdAotCWBkZWx0YV94eScuICAoVFRfR2V0X01NX1Zhcik6IEluaXQgYG1tdmFyJy4KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfR2V0X01NX1Zhcik6IERpdHRvLgotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfcHNfZ2V0X2ZvbnRfaW5mbyk6IEluaXQKLQlgZm9udF9pbmZvJy4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKTogSW5pdCBgdCcuCi0JKGNmZl9mb250X2xvYWQpOiBJbml0IGBzdWInLgotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9zaXplX2luaXQpOiBJbml0IGBpbnRlcm5hbCcuCi0JKGNmZl9mYWNlX2luaXQpOiBJbml0IGBjZmYnLgotCSogc3JjL3Bmci9wZnJsb2FkLmMgKHBmcl9leHRyYV9pdGVtX2xvYWRfc3RlbV9zbmFwcyk6Ci0JSW5pdCBgc25hcHMnLgotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfcHJvcGVydGllcyk6IEluaXQgYHByb3BlcnRpZXMnLgotCShwY2ZfZ2V0X2JpdG1hcHMpOiBJbml0IGBvZmZzZXRzJy4gIChwY2ZfZ2V0X2VuY29kaW5ncyk6Ci0JSW5pdCBgdG1wRW5jb2RpbmcnLgotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9nYXNwKTogSW5pdCBgZ2FzcHJhbmdlcycuCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAoTG9hZF9TQml0X0ltYWdlKTogSW5pdCBgY29tcG9uZW50cycuCi0JKiBzcmMvY2FjaGUvZnRjbXJ1LmMgKEZUQ19NcnVMaXN0X05ldyk6IEluaXQgYG5vZGUnLgotCSogc3JjL2d6aXAvZnRnemlwLmMgKEZUX1N0cmVhbV9PcGVuR3ppcCk6IEluaXQgYHppcCcgYW5kCi0JYHppcF9idWZmJy4KLQkqIHNyYy9sencvZnRsencuYyAoRlRfU3RyZWFtX09wZW5MWlcpOiBJbml0IGB6aXAnLgotCSogc3JjL2J6aXAyL2Z0YnppcDIuYyAoRlRfU3RyZWFtX09wZW5CemlwMik6IEluaXQgYHppcCcuCi0KLTIwMTEtMDYtMTQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbYmFzZV0gRml4IGcrKzQuNiBjb21waWxlciB3YXJuaW5ncyBpbiBzcmMvYmFzZS8qLmMuCi0KLQlQYXNzaW5nIHVuaW5pdGlhbGl6ZWQgcG9pbnRlciB0byBGVF9ORVcoKSBmYW1pbGllcyBpcwotCW5vdCBwcm9ibGVtYXRpYyB0aGVvcmV0aWNhbGx5IChhcyBmYXIgYXMgdGhlIHJldHVybmVkCi0JcG9pbnRlciBpcyBjaGVja2VkIGJlZm9yZSB3cml0aW5nKSwgYnV0IGcrKzQuNiBkaXNsaWtlcwotCWl0IGFuZCB3YXJucyBieSAtV3VuaW5pdGlhbGl6ZWQuICBJbml0aWFsaXplIHRoZW0gYnkgTlVMTC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1N0cmVhbV9OZXcpOiBJbml0IGBzdHJlYW0nLgotCShuZXdfbWVtb3J5X3N0cmVhbSk6IERpdHRvLgotCShGVF9OZXdfR2x5cGhTbG90KTogSW5pdCBgc2xvdCcuCi0JKEZUX0NNYXBfTmV3KTogSW5pdCBgY21hcCcuCi0JKG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKTogSW5pdCBgc2ZudF9wcycuCi0JKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBJbml0IGBwZmJfZGF0YScuCi0JKE1hY19SZWFkX3NmbnRfUmVzb3VyY2UpOiBJbml0IGBzZm50X2RhdGEnLgotCSogc3JjL2Jhc2UvZnRyZm9yay5jIChGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyk6Ci0JSW5pdCBgb2Zmc2V0c19pbnRlcm5hbCcgYW5kIGByZWYnLgotCShyYWNjZXNzX2d1ZXNzX2Rhcndpbl9oZnNwbHVzKTogSW5pdCBgbmV3cGF0aCcuCi0JKHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX25ld3Zmcyk6IERpdHRvLgotCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoZnRfYml0bWFwX2Fzc3VyZV9idWZmZXIpOgotCUluaXQgYGJ1ZmZlcicuCi0JKiBzcmMvYmFzZS9mdHN0cm9rZS5jIChGVF9TdHJva2VyX05ldyk6IEluaXQgYHN0cm9rZXInLgotCi0yMDExLTA2LTE0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2d4dmFsaWRdIENsZWFudXAuCi0KLQlTb21lIGludmFsaWQsIG92ZXJydW5uaW5nLCB1bnJlY29tbWVuZGVkIG5vbi16ZXJvIHZhbHVlcwotCWFyZSBjYXJlZCBpbiBwYXJhbm9pZCB2YWxpZGF0aW9uIG1vZGUgb25seS4gIFRoZXJlIGFyZQotCW1hbnkgbGluZXMgbG9va2luZyBsaWtlOgotCi0JICBpZiAoIHZhbGlkLT5yb290LT5sZXZlbCA+PSBGVF9WQUxJREFURV9QQVJBTk9JRCApCi0JICAgIEZUX0lOVkFMSURfeHh4OwotCi0JVG8gc2ltcGxpZnkgdGhlbSwgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIGVyciApIGlzCi0JaW50cm9kdWNlZCBmb3IgbW9yZSBwYXJhbm9pZCB2YWxpZGF0aW9uIGluIGZ1dHVyZS4KLQotCSogc3JjL2d4dmFsaWQvZ3h2Y29tbW4uaCAoSVNfUEFSQU5PSURfVkFMSURBVElPTik6Ci0JTmV3IG1hY3JvIHRvIGFzc3VyZSB2YWxpZC0+cm9vdC0+bGV2ZWwgaXMgbW9yZSBvcgotCWVxdWFsIHRvIEZUX1ZBTElEQVRFX1BBUkFOT0lELiAgKEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKToKLQlOZXcgbWFjcm8gdG8gcmFpc2UgYW4gZXJyb3IgaWYgaW4gcGFyYW5vaWQgdmFsaWRhdGlvbi4KLQkqIHNyYy9neHZhbGlkL2d4dmNvbW1uLmM6IFVzZSBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCgpLgotCSogc3JjL2d4dmFsaWQvZ3h2ZmVhdC5jOiBEaXR0by4KLQkqIHNyYy9neHZhbGlkL2d4dmp1c3QuYzogRGl0dG8uCi0JKiBzcmMvZ3h2YWxpZC9neHZrZXJuLmM6IERpdHRvLgotCSogc3JjL2d4dmFsaWQvZ3h2bW9ydC5jOiBEaXR0by4KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQwLmM6IERpdHRvLgotCSogc3JjL2d4dmFsaWQvZ3h2bW9ydDEuYzogRGl0dG8uCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0Mi5jOiBEaXR0by4KLQkqIHNyYy9neHZhbGlkL2d4dm1vcngxLmM6IERpdHRvLgotCSogc3JjL2d4dmFsaWQvZ3h2bW9yeDIuYzogRGl0dG8uCi0KLTIwMTEtMDYtMTQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbZ3h2YWxpZF0gRml4IGdjYzQuNiBjb21waWxlciB3YXJuaW5ncyBpbiBneHZ0cmFrLmMuCi0KLQkqIHNyYy9neHZhbGlkL2d4dnRyYWsuYyAoZ3h2X3RyYWtfdHJhY2tUYWJsZV92YWxpZGF0ZSk6Ci0JQ2hlY2sgZGlmZmVyZW50IGVudHJpZXMgcG9pbnRpbmcgc2FtZSB0cmFja2luZyB2YWx1ZS4KLQkoZ3h2X3RyYWtfdmFsaWRhdGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGB0YWJsZV9zaXplJy4KLQotMjAxMS0wNi0xNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtneHZhbGlkXSBGaXggZ2NjNC42IGNvbXBpbGVyIHdhcm5pbmdzIGluIGd4dm1vcngqLmMuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnguYyAoZ3h2X21vcnhfc3VidGFibGVzX3ZhbGlkYXRlKToKLQlDb25kaXRpb25hbGl6ZSB1bnZhbGlkYXRlZCB2YXJpYWJsZSBgc3ViRmVhdHVyZUZsYWdzJy4KLQkoZ3h2X21vcnhfY2hhaW5fdmFsaWRhdGUpOiBDb25kaXRpb25hbGl6ZSB1bnZhbGlkYXRlZAotCXZhcmlhYmxlIGBkZWZhdWx0RmxhZ3MnLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J4MC5jCi0JKGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlKToKLQlDb25kaXRpb25hbGl6ZSB1bnZhbGlkYXRlZCB2YXJpYWJsZXM7IGBtYXJrRmlyc3QnLAotCWBkb250QWR2YW5jZScsIGBtYXJrTGFzdCcsIGB2ZXJiJy4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9yeDEuYwotCShneHZfbW9yeF9zdWJ0YWJsZV90eXBlMV9lbnRyeV92YWxpZGF0ZSk6IENvbmRpdGlvbmFsaXplCi0JdW52YWxpZGF0ZWQgdmFyaWFibGVzOyBgc2V0TWFyaycsIGBkb250QWR2YW5jZScuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcngyLmMKLQkoZ3h2X21vcnhfc3VidGFibGVfdHlwZTJfbGlnQWN0aW9uT2Zmc2V0X3ZhbGlkYXRlKToKLQlDb25kaXRpb25hbGl6ZSB1bnZhbGlkYXRlZCB2YXJpYWJsZXM7IGBsYXN0JywgYHN0b3JlJy4KLQlDaGVja2luZyBmb3Igb3ZlcnJ1bm5pbmcgb2Zmc2V0IGlzIGFkZGVkLgotCShneHZfbW9yeF9zdWJ0YWJsZV90eXBlMl9lbnRyeV92YWxpZGF0ZSk6Ci0JQ29uZGl0aW9uYWxpemUgdW52YWxpZGF0ZWQgdmFyaWFibGVzOyBgc2V0Q29tcG9uZW50JywKLQlgZG9udEFkdmFuY2UnLCBgcGVyZm9ybUFjdGlvbicuCi0JKGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX2xpZ2F0dXJlVGFibGVfdmFsaWRhdGUpOgotCUNoZWNrIGlmIHRoZSBHSUQgZm9yIGxpZ2F0dXJlIGRvZXMgbm90IGV4Y2VlZCB0aGUKLQltYXggR0lEIGluIGBtYXhwJyB0YWJsZS4KLQotCSogc3JjL2d4dmFsaWQvZ3h2bW9ydDUuYwotCShneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV9JbnNlcnRMaXN0X3ZhbGlkYXRlKToKLQlDb25kaXRpb25hbGl6ZSB1bnZhbGlkYXRlZCBsb2FkaW5nIG9mIGBpbnNlcnRfZ2x5cGhJRCcKLQlhcnJheS4gIChneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV9lbnRyeV92YWxpZGF0ZSk6Ci0JQ29uZGl0aW9uYWxpemUgdW52YWxpZGF0ZWQgdmFyaWFibGVzOyBgc2V0TWFyaycsCi0JYGRvbnRBZHZhbmNlJywgYGN1cnJlbnRJc0thc2hpZGFMaWtlJywKLQlgbWFya2VkSXNLYXNoaWRhTGlrZScsIGBjdXJyZW50SW5zZXJ0QmVmb3JlJywKLQlgbWFya2VkSW5zZXJ0QmVmb3JlJy4KLQotMjAxMS0wNi0xNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtneHZhbGlkXSBGaXggZ2NjNC42IGNvbXBpbGVyIHdhcm5pbmdzIGluIGd4dm1vcnQqLmMuCi0KLQkqIHNyYy9neHZhbGlkL2d4dm1vcnQuYyAoZ3h2X21vcnRfc3VidGFibGVzX3ZhbGlkYXRlKToKLQlDb25kaXRpb25hbGl6ZSB1bnZhbGlkYXRlZCB2YXJpYWJsZSBgc3ViRmVhdHVyZUZsYWdzJy4KLQkoZ3h2X21vcnRfY2hhaW5fdmFsaWRhdGUpOiBDb25kaXRpb25hbGl6ZSB1bnZhbGlkYXRlZAotCXZhcmlhYmxlIGBkZWZhdWx0RmxhZ3MnLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0MC5jCi0JKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlKTogQ2hlY2sgdGhlCi0JY29uZmxpY3Qgb2YgdGhlIG1hcmtzIGZvciB0aGUgZ2x5cGhzLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0MS5jCi0JKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX29mZnNldF90b19zdWJzdF92YWxpZGF0ZSk6Ci0JTG9jYWwgdmFyaWFibGVzIGBtaW5fZ2lkJywgYG1heF9naWQnIGFyZSByZXBsYWNlZCBieQotCXZhcmlhYmxlcyBpbiB0aGUgdmFsaWRhdG9yLgotCShneHZfbW9ydF9zdWJ0YWJsZV90eXBlMV9lbnRyeV92YWxpZGF0ZSk6IENvbmRpdGlvbmFsaXplCi0JdW52YWxpZGF0ZWQgdmFyaWFibGVzOyBgc2V0TWFyaycsIGBkb250QWR2YW5jZScuCi0JKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX3N1YnN0VGFibGVfdmFsaWRhdGUpOgotCVZhbGlkYXRlIHRoZSBHSUQgYnkgdGhlIG1pbi9tYXggR0lEcyBpbiB0aGUgdmFsaWRhdG9yLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0Mi5jCi0JKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUyX2xpZ0FjdGlvbk9mZnNldF92YWxpZGF0ZSk6Ci0JQ29uZGl0aW9uYWxpemUgdW52YWxpZGF0ZWQgdmFyaWFibGVzOyBgbGFzdCcsIGBzdG9yZScuCi0JQ2hlY2tpbmcgZm9yIG92ZXJydW5uaW5nIG9mZnNldCBpcyBhZGRlZC4KLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTJfZW50cnlfdmFsaWRhdGUpOgotCUNvbmRpdGlvbmFsaXplIHVudmFsaWRhdGVkIHZhcmlhYmxlczsgYHNldENvbXBvbmVudCcsCi0JYGRvbnRBZHZhbmNlJy4KLQkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTJfbGlnYXR1cmVUYWJsZV92YWxpZGF0ZSk6Ci0JQ2hlY2sgaWYgdGhlIEdJRCBmb3IgbGlnYXR1cmUgZG9lcyBub3QgZXhjZWVkIHRoZQotCW1heCBHSUQgaW4gYG1heHAnIHRhYmxlLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZtb3J0NS5jCi0JKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU1X0luc2VydExpc3RfdmFsaWRhdGUpOgotCUNvbmRpdGlvbmFsaXplIHVudmFsaWRhdGVkIGxvYWRpbmcgb2YgYGluc2VydF9nbHlwaElEJwotCWFycmF5LiAgKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU1X2VudHJ5X3ZhbGlkYXRlKToKLQlDb25kaXRpb25hbGl6ZSB1bnZhbGlkYXRlZCB2YXJpYWJsZXM7IGBzZXRNYXJrJywKLQlgZG9udEFkdmFuY2UnLCBgY3VycmVudElzS2FzaGlkYUxpa2UnLAotCWBtYXJrZWRJc0thc2hpZGFMaWtlJywgYGN1cnJlbnRJbnNlcnRCZWZvcmUnLAotCWBtYXJrZWRJbnNlcnRCZWZvcmUnLgotCi0yMDExLTA2LTE0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2d4dmFsaWRdIEZpeCBnY2M0LjYgY29tcGlsZXIgd2FybmluZ3MgaW4gZ3h2a2Vybi5jLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZrZXJuLmMKLQkoZ3h2X2tlcm5fc3VidGFibGVfZm10MF9wYWlyc192YWxpZGF0ZSk6IENvbmRpdGlvbmFsaXplCi0JdW52YWxpZGF0ZWQgdmFyaWFibGUgYGtlcm5WYWx1ZScuCi0JKGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDFfZW50cnlfdmFsaWRhdGUpOiBDb25kaXRpb25hbGl6ZQotCXVudmFsaWRhdGVkIHZhcmlhYmxlczsgYHB1c2gnLCBgZG9udEFkdmFuY2UnLCBga2VybkFjdGlvbicsCi0JYGtlcm5WYWx1ZScuCi0JKGd4dl9rZXJuX2NvdmVyYWdlX25ld19hcHBsZV92YWxpZGF0ZSk6IENvbmRpdGlvbmFsaXplCi0JdHJhY2Utb25seSB2YXJpYWJsZXM7IGBrZXJuVmVydGljYWwnLCBga2VybkNyb3NzU3RyZWFtJywKLQlga2VyblZhcmlhdGlvbicuCi0JKGd4dl9rZXJuX2NvdmVyYWdlX2NsYXNzaWNfYXBwbGVfdmFsaWRhdGUpOiBDb25kaXRpb25hbGl6ZQotCXRyYWNlLW9ubHkgdmFyaWFibGVzOyBgaG9yaXpvbnRhbCcsIGBjcm9zc19zdHJlYW0nLgotCShneHZfa2Vybl9jb3ZlcmFnZV9jbGFzc2ljX21pY3Jvc29mdF92YWxpZGF0ZSk6Ci0JQ29uZGl0aW9uYWxpemUgdHJhY2Utb25seSB2YXJpYWJsZXM7IGBob3Jpem9udGFsJywKLQlgbWluaW11bScsIGBjcm9zc19zdHJlYW0nLCBgb3ZlcnJpZGUnLgotCShneHZfa2Vybl9zdWJ0YWJsZV92YWxpZGF0ZSk6IENvbmRpdGlvbmFsaXplIHRyYWNlLW9ubHkKLQl2YXJpYWJsZXM7IGB2ZXJzaW9uJywgYHR1cGxlSW5kZXgnLgotCi0yMDExLTA2LTE0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2d4dmFsaWRdIEZpeCBnY2M0LjYgY29tcGlsZXIgd2FybmluZ3MgaW4gZ3h2anVzdC5jLgotCi0JKiBzcmMvZ3h2YWxpZC9neHZqdXN0LmMgKGd4dl9qdXN0X2NoZWNrX21heF9naWQpOgotCU5ldyBmdW5jdGlvbiB0byB1bmlmeSB0aGUgY2hlY2tzIG9mIHRvbyBsYXJnZSBHSUQuCi0JKGd4dl9qdXN0X3dkcF9lbnRyeV92YWxpZGF0ZSk6IENvbmRpdGlvbmFsaXplIHVudmFsaWRhdGVkCi0JdmFyaWFibGVzOyBgYmVmb3JlR3Jvd0xpbWl0JywgYGJlZm9yZVNocmlua0dyb3dMaW1pdCcsCi0JYGFmdGVyR3Jvd0xpbWl0JywgYGFmdGVyU2hyaW5rR3Jvd0xpbWl0JywgYGdyb3dGbGFncycsCi0JYHNocmlua0ZsYWdzJy4gIEFkZGl0aW9uYWwgY2hlY2sgZm9yIG5vbi16ZXJvIHZhbHVlcyBpbgotCXVudXNlZCBzdG9yYWdlIGBqdXN0Q2xhc3MnIGlzIGFkZGVkLgotCShneHZfanVzdF9hY3RTdWJyZWNvcmRfdHlwZTBfdmFsaWRhdGUpOiBDb25kaXRpb25hbGl6ZQotCXVudmFsaWRhdGVkIHZhcmlhYmxlIGBvcmRlcicuICBHSUQgaXMgY2hlY2tlZCBieQotCWd4dl9qdXN0X2NoZWNrX21heF9naWQoKS4gIEFkZGl0aW9uYWwgY2hlY2sgZm9yIHVwc2lkZS1kb3duCi0JcmVsYXRpb25zaGlwIGJldHdlZW4gYGxvd2VyTGltaXQnIGFuZCBgdXBwZXJMaW1pdCcgaXMgYWRkZWQuCi0JKGd4dl9qdXN0X2FjdFN1YnJlY29yZF90eXBlMV92YWxpZGF0ZSk6IEdJRCBpcyBjaGVja2VkIGJ5Ci0JZ3h2X2p1c3RfY2hlY2tfbWF4X2dpZCgpLgotCShneHZfanVzdF9hY3RTdWJyZWNvcmRfdHlwZTJfdmFsaWRhdGUpOiBDb25kaXRpb25hbGl6ZQotCXVudmFsaWRhdGVkIHZhcmlhYmxlIGBzdWJzdFRocmVzaGhvbGQnLiAgR0lEIGlzIGNoZWNrZWQgYnkKLQlneHZfanVzdF9jaGVja19tYXhfZ2lkKCkuCi0JKGd4dl9qdXN0X2FjdFN1YnJlY29yZF90eXBlNV92YWxpZGF0ZSk6IEdJRCBpcyBjaGVja2VkIGJ5Ci0JZ3h2X2p1c3RfY2hlY2tfbWF4X2dpZCgpLgotCShneHZfanVzdF9jbGFzc1RhYmxlX2VudHJ5X3ZhbGlkYXRlKTogQ29uZGl0aW9uYWxpemUKLQl1bnZhbGlkYXRlZCB2YXJpYWJsZXM7IGBzZXRNYXJrJywgYGRvbnRBZHZhbmNlJywKLQlgbWFya0NsYXNzJywgYGN1cnJlbnRDbGFzcycuCi0KLTIwMTEtMDYtMTQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbZ3h2YWxpZF0gUHJlcGFyYXRpb24gdG8gZml4IGdjYzQuNiBjb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL2d4dmFsaWQvZ3h2Y29tbW4uaCAoR1hWX0xPQURfVFJBQ0VfVkFSUyk6IE5ldyBtYWNybyB0bwotCWNvbmRpdGlvbmFsaXplIHRoZSB2YXJpYWJsZSB3aGljaCBpcyBvbmx5IHVzZWQgZm9yIHRyYWNlIG1lc3NhZ2VzLgotCUF1dG9tYXRpY2FsbHkgc2V0IGJ5IEZUX0RFQlVHX0xFVkVMX1RSQUNFLgotCShHWFZfTE9BRF9VTlVTRURfVkFSUyk6IE5ldyBtYWNybyB0byBjb25kaXRpb25hbGl6ZSB0aGUgbG9hZGluZyBvZgotCXVudmFsaWRhdGVkIHZhcmlhYmxlcy4gIFVuZGVmaW5lZCBieSBkZWZhdWx0IHRvIGNhbG0gZ2NjNC42IHdhcm5pbmcuCi0JKEdYVl9WYWxpZGF0b3JSZWMue21pbl9naWQsbWF4X2dpZH0pOiBOZXcgdmFyaWFibGVzIHRvIGhvbGQgZGVmaW5lZAotCUdJRCByYW5nZXMsIGZvciB0aGUgY29tcGFyaXNvbiBvZiBHSUQgcmFuZ2VzIGluIGRpZmZlcmVudCBzdWJ0YWJsZXMuCi0KLTIwMTEtMDYtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBSZW1vdmUgdW51c2VkIHN0cnVjdHVyZSBtZW1iZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuaCAoQUZfU2VnbWVudFJlYyk6IFJlbW92ZSBgY29udG91cicuCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMpLAotCXNyYy9hdXRvZml0L2FmbGF0aW4yLmMgKGFmX2xhdGluMl9oaW50c19jb21wdXRlX3NlZ21lbnRzKTogVXBkYXRlZC4KLQotMjAxMS0wNS0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGcrKyA0LjYgY29tcGlsYXRpb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfZHVtcF9zZWdtZW50cywKLQlhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzKTogVXNlIGNhc3QuCi0KLTIwMTEtMDUtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBnY2MgNC42IGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfbWV0cmljc19pbml0X2JsdWVzKTogVXNlIGNhc3RzIGFuZAotCXJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19jb21wdXRlX2VkZ2VzKTogQ29tbWVudCBvdXQKLQlgdXBfZGlyJy4KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogVXNlIGBoZWlnaHRfb3JnJwotCWFuZCBgd2lkdGhfb3JnJyBjb25kaXRpb25hbGl6ZWQuCi0KLTIwMTEtMDUtMjggIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbbWFjXSBDb25kaXRpb25hbGl6ZSB0aGUgaW5jbHVzaW9uIG9mIGBBdmFpbGFiaWxpdHlNYWNyb3MuaCcuCi0KLQlUaGUgbmF0aXZlIFNESyBvbiBlYXJsaWVzdCBNYWMgT1MgWCAoMTAuMC0xMC4xKSBkaWQgbm90IGhhdmUKLQlgQXZhaWxhYmlsaXR5TWFjcm9zLmgnLiAgVG8gcHJldmVudCB0aGUgaW5jbHVzaW9uIG9mIG1pc3NpbmcKLQloZWFkZXIgZmlsZSwgRUNBTkNFTEVEIChpbnRyb2R1Y2VkIGluIDEwLjIpIGluIFBPU0lYIGhlYWRlcgotCWZpbGUgPGVycm5vLmg+IGlzIGNoZWNrZWQgdG8gZGV0ZWN0IHRoZSBzeXN0ZW0gdmVyc2lvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogQ29uZGl0aW9uYWxpemUgdGhlCi0JaW5jbHVzaW9uIG9mIGBBdmFpbGFiaWxpdHlNYWNyb3MuaCcuCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbjogRGl0dG8uCi0JKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmg6IERpdHRvLgotCi0yMDExLTA1LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSB0cmFjaW5nIG9mIGhpbnRpbmcgcHJvY2Vzcy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50X2VkZ2VzKTogQWRkIHRyYWNpbmcgbWVzc2FnZQotCWBBREpVU1QnLgotCi0yMDExLTA1LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gRml4IHRyYWNlIG1lc3NhZ2UuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludF9lZGdlcyk6IFNob3cgY29ycmVjdCB2YWx1ZSBpbgotCXRyYWNpbmcgbWVzc2FnZS4KLQotMjAxMS0wNS0yNCAgRGFuaWVsIFppbW1lcm1hbm4gIDxuZXR6aW1tZUBnb29nbGVtYWlsLmNvbT4KLQotCVJlZHVjZSB3YXJuaW5ncyBmb3IgTVMgVmlzdWFsIFN0dWRpbyAyMDEwLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX2dldF9udW1fc2VnbWVudHMsCi0JYWZfZ2x5cGhfaGludHNfZ2V0X3NlZ21lbnRfb2Zmc2V0KSBbIUZUX0RFQlVHX0FVVE9GSVRdOiBQcm92aWRlCi0JcmV0dXJuIHZhbHVlLgotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfc2xvdF9sb2FkKTogQWRkIGNhc3QuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2NoZWNrX3RyaWNreW5lc3Nfc2ZudF9pZHMpOiBVc2UgcHJvcGVyCi0JbG9vcCB2YXJpYWJsZSB0eXBlLgotCi0yMDExLTA1LTE2ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JQXV0b21ha2UgY29tcG9uZW50IGBidWlsZHMvdW5peC9pbnN0YWxsLXNoJyBpcyByZW1vdmVkLgotCi0JKiBidWlsZHMvdW5peC9pbnN0YWxsLXNoOiBSZW1vdmVkLiAgSXQgaXMgbm90IG5lZWRlZCB0bwotCWluY2x1ZGUgcmVwb3NpdG9yeSwgYmVjYXVzZSBhdXRvZ2VuLnNoIGluc3RhbGxzIGl0LgotCSogYnVpbGRzL3VuaXgvLmdpdGlnbm9yZTogUmVnaXN0ZXIgaW5zdGFsbC1zaC4KLQotMjAxMS0wNS0xMiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVthdXRvZml0XSBNYWtlIHRyYWNlIG1lc3NhZ2UgZm9yIENKSyBibHVlem9uZSBtb3JlIHZlcmJvc2UuCi0KLTIwMTEtMDUtMDggIEp1c3QgRmlsbCBCdWdzICA8bW96YnVnYm94QHlhaG9vLmNvbS5hdT4KLSAgICAgICAgICAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbYXV0b2ZpdF0gQWRkIGJsdWV6b25lcyBmb3IgQ0pLIElkZW9ncmFwaHMuCi0KLQlUbyByZW1vdmUgZXh0cmVtYSBvZiB2ZXJ0aWNhbCBzdHJva2VzIG9mIENKSyBJZGVvZ3JhcGhzIGF0Ci0JbG93IHJlc29sdXRpb24gYW5kIG1ha2UgdGhlIHRvcCBhbmQgYm90dG9tIGhvcml6b250YWwgc3RlbXMKLQlhbGlnbmVkLCBibHVlem9uZXMgZm9yIENKSyBJZGVvZ3JhcGhzIGFyZSBjYWxjdWxhdGVkIGZyb20KLQlzYW1wbGUgZ2x5cGhzLiAgQXQgcHJlc2VudCwgdmVydGljYWwgYmx1ZXpvbmVzIChibHVlem9uZXMKLQl0byBhbGlnbiB2ZXJ0aWNhbCBzdGVtcykgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBGb3IgZGV0YWlsLCBzZWUKLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMS0wNC9tc2cwMDA3MC5odG1sCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTEtMDQvbXNnMDAwOTIuaHRtbAotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDExLTA1L21zZzAwMDAxLmh0bWwKLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IE5ldyB0cmFjZSBjb21wb25lbnQgYGFmY2prJy4KLQkqIHNyYy9hdXRvZml0L2FmY2prLmggKEFGX0NKS3tCbHVlLEF4aXMsTWV0cmljfVJlYyk6IEFkZCBDSksgdmVyc2lvbgotCWZvciBBRl9MYXRpbntCbHVlLEF4aXMsTWV0cmljfVJlYy4KLQkoYWZfY2prX21ldHJpY3NfY2hlY2tfZGlnaXRzKTogRGl0dG8sIHNoYXJlZCB3aXRoIEluZGljIG1vZHVsZS4KLQkoYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMpOiBEaXR0by4KLQkoYWZfY2prX21ldHJpY3NfaW5pdCk6IFRha2UgQUZfQ0pLTWV0cmljIGluc3RlYWQgb2YgQUZfTGF0aW5NZXRyaWMuCi0JKGFmX2Nqa19tZXRyaWNzX3NjYWxlKTogRGl0dG8gKGRlY2xhcmF0aW9uKS4KLQkoYWZfY2prX2hpbnRzX2luaXQpOiBEaXR0byAoZGVjbGFyYXRpb24pLgotCShhZl9jamtfaGludHNfYXBwbHkpOiBEaXR0byAoZGVjbGFyYXRpb24pLgotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX21ldHJpY3Nfc2NhbGUpOiBEaXR0byAoYm9keSkuCi0JKGFmX2Nqa19oaW50c19pbml0KTogRGl0dG8gKGJvZHkpLgotCShhZl9jamtfaGludHNfYXBwbHkpOiBEaXR0byAoYm9keSkuCi0JKGFmX2Nqa19tZXRyaWNzX2luaXRfd2lkdGhzKTogRHVwbGljYXRlIGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMuCi0JKGFmX2Nqa19tZXRyaWNzX2NoZWNrX2RpZ2l0cyk6IER1cGxpY2F0ZSBhZl9sYXRpbl9tZXRyaWNzX2NoZWNrX2RpZ2l0cy4KLQkoYWZfY2prX21ldHJpY3NfaW5pdCk6IENhbGwgQ0pLIGJsdWV6b25lIGluaXRpYWxpemVyLgotCShhZl9jamtfbWV0cmljc19zY2FsZV9kaW0pOiBBZGQgY29kZSB0byBzY2FsZSBibHVlem9uZXMuCi0JKGFmX2Nqa19oaW50c19jb21wdXRlX2JsdWVfZWRnZXMpOiBOZXcgZnVuY3Rpb24sIENKSyB2ZXJzaW9uIG9mCi0JYWZfbGF0aW5faGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzLgotCShhZl9jamtfbWV0cmljc19pbml0X2JsdWVzKTogTmV3IGZ1bmN0aW9uLCBDSksgdmVyc2lvbiBvZgotCWFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcy4KLQkoYWZfY2prX2hpbnRfZWRnZXMpOiBBZGQgY29kZSB0byBhbGlnbiB0aGUgZWRnZSBzdGVtcyB0byBibHVlIHpvbmVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmluZGljLmMgKGFmX2luZGljX21ldHJpY3NfaW5pdCk6IFRha2UgQUZfQ0pLTWV0cmljCi0JaW5zdGVhZCBvZiBBRl9MYXRpbk1ldHJpYywgYW5kIGluaXRpYWxpemUgYXMgYWZfY2prX21ldHJpY3NfaW5pdC4KLQlIb3dldmVyIGJsdWV6b25lcyBhcmUgbm90IGluaXRpYWxpemVkLgotCShhZl9pbmRpY19tZXRyaWNzX3NjYWxlKTogVGFrZSBBRl9DSktNZXRyaWMgaW5zdGVhZCBvZiBBRl9MYXRpbk1ldHJpYy4KLQkoYWZfaW5kaWNfaGludHNfaW5pdCk6IERpdHRvLgotCShhZl9pbmRpY19oaW50c19hcHBseSk6IERpdHRvLgotCi0JKiBkb2NzL0NIQU5HRVM6IE5vdGUgYWJvdXQgQ0pLIGJsdWV6b25lIHN1cHBvcnQuCi0KLTIwMTEtMDUtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBSZW1vdmUgdW51c2VkIHN0cnVjdCBtZW1iZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaCAoQUZfTGF0aW5BeGlzKTogUmVtb3ZlIGBjb250cm9sX292ZXJzaG9vdCcuCi0KLTIwMTEtMDUtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSk6IFNpbXBsaWZ5LgotCi0yMDExLTA1LTAxICBKdXN0IEZpbGwgQnVncyAgPG1vemJ1Z2JveEB5YWhvby5jb20uYXU+Ci0gICAgICAgICAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIG1vcmUgZGVidWdnaW5nIGZ1bmN0aW9ucy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19nZXRfbnVtX3NlZ21lbnRzLAotCWFmX2dseXBoX2hpbnRzX2dldF9zZWdtZW50X29mZnNldCk6IE5ldyBmdW5jdGlvbnMuCi0KLTIwMTEtMDUtMDEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlBZGQgbmV3IG9wdGlvbiBgLS1kaXNhYmxlLW1tYXAnIHRvIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IE5ldyBvcHRpb24gYC0tZGlzYWJsZS1tbWFwJwotCWlzIGFkZGVkLiAgSXQgaXMgZm9yIHRoZSBkZXZlbG9wZXJzIHRvIHNpbXVsYXRlIHRoZSBzeXN0ZW1zCi0Jd2l0aG91dCBtbWFwKCkgKGxpa2UgNC4zQlNELCBtaW5peCBldGMpIG9uIFBPU0lYIHN5c3RlbXMuCi0KLTIwMTEtMDQtMzAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbdHJ1ZXR5cGVdIEFsd2F5cyByZWNhbGN1bGF0ZSB0aGUgc2ZudCB0YWJsZSBjaGVja3N1bS4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9nZXRfc2ZudF9jaGVja3N1bSk6IFJlY2FsY3VsYXRlCi0JdGhlIHNmbnQgdGFibGUgY2hlY2tzdW0gZXZlbiBpZiBub24temVybyB2YWx1ZSBpcyB3cml0dGVuIGluCi0JdGhlIFRydWVUeXBlIGZvbnQgaGVhZGVyLiAgU29tZSBiYWQgUERGIGdlbmVyYXRvcnMgd3JpdGUKLQl3cm9uZyB2YWx1ZXMuICBGb3IgZGV0YWlscyBzZWUgZXhhbXBsZXMgYW5kIGJlbmNobWFyayB0ZXN0cwotCW9mIHRoZSBsYXRlbmN5IGJ5IHJlY2FsY3VsYXRpb246Ci0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTEtMDQvbXNnMDAwOTEuaHRtbAotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDExLTA0L21zZzAwMDk2Lmh0bWwKLQotMjAxMS0wNC0zMCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVt0cnVldHlwZV0gUmVnaXN0ZXIgYSBzZXQgb2YgdHJpY2t5IGZvbnRzLCBORUMgRkEgZmFtaWx5LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2NoZWNrX3RyaWNreW5lc3Nfc2ZudF9pZHMpOgotCUFkZCA4IGNoZWNrc3VtIHNldHMgZm9yIE5FQyBGQSBmYW1pbHkuICBGb3IgdGhlIHRyaWNreSBmb250cwotCXdpdGhvdXQgc29tZSB0YWJsZXMgKGUuZy4gTkVDIEZBIGZvbnRzIGxhY2sgY3Z0IHRhYmxlKSwKLQlleHRyYSBjaGVjayBpcyBhZGRlZCB0byBhc3N1cmUgdGhhdCBhIHplcm8tbGVuZ3RoIHRhYmxlIGluIHRoZQotCXJlZ2lzdHJ5IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgZm9udC4KLQotMjAxMS0wNC0yOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVt0cnVldHlwZV0gRml4IGEgYnVnIGluIHRoZSBzZm50IHRhYmxlIGNoZWNrc3VtIGdldHRlci4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9nZXRfc2ZudF9jaGVja3N1bSk6IENoZWNrIHRoZQotCXJldHVybiB2YWx1ZSBvZiBmYWNlLT5nb3RvX3RhYmxlKCkgY29ycmVjdGx5LgotCi0yMDExLTA0LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSB0cmFjaW5nIG1lc3NhZ2VzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcywKLQlhZl9sYXRpbl9hbGlnbl9saW5rZWRfZWRnZSwgYWZfbGF0aW5faGludF9lZGdlcyk6IERvIGl0LgotCi0yMDExLTA0LTI1ICBLYW4tUnUgQ2hlbiAgPGthbnJ1QGthbnJ1LmluZm8+Ci0KLQlbdHJ1ZXR5cGVdIEFsd2F5cyBjaGVjayB0aGUgY2hlY2tzdW0gdG8gaWRlbnRpZnkgdHJpY2t5IGZvbnRzLgotCi0JQmVjYXVzZSBzb21lIFBERiBnZW5lcmF0b3JzIG1hbmdsZSB0aGUgZmFtaWx5IG5hbWUgYmFkbHksCi0JdGhlIHRyaWNreW5lc3MgY2hlY2sgYnkgdGhlIGNoZWNrc3VtIHNob3VsZCBiZSBpbnZva2VkIGFsd2F5cy4KLQlGb3Igc2FtcGxlIFBERiwgc2VlCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTEtMDQvbXNnMDAwNzMuaHRtbAotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X2NoZWNrX3RyaWNreW5lc3MpOiBFdmVuIHdoZW4KLQl0dF9jaGVja190cmlja3luZXNzX2ZhbWlseSgpIGZpbmRzIG5vIHRyaWNreW5lc3MsCi0JdHRfY2hlY2tfdHJpY2t5bmVzc19zZm50X2lkcygpIGlzIGludm9rZWQuCi0KLTIwMTEtMDQtMjIgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbYXV0b2ZpdF0gQWRkIG1vcmUgSW5kaWMgc2NyaXB0cyB3aXRoIGhhbmdpbmcgYmFzZWxpbmUuCi0KLQkqIHNyYy9hdXRvZml0L2FmaW5kaWMuYyAoYWZfaW5kaWNfdW5pcmFuZ2VzKTogVGliZXRhbiwgTGltYnUsCi0JU3VuZGFuZXNlLCBNZWV0ZWkgTWF5ZWssIFN5bG90aSBOYWdyaSBhbmQgU2hhcmFkYSBzY3JpcHRzIGFyZQotCWFkZGVkLgotCi0yMDExLTA0LTIxICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCUFsd2F5cyBpZ25vcmUgZ2xvYmFsIGFkdmFuY2UuCi0KLQlUaGlzIG1ha2VzIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIIHJlZHVuZGFudCwKLQlkZXByZWNhdGVkLCBhbmQgaWdub3JlZC4gIFRoZSBuZXcgYmVoYXZpb3IgaXMgd2hhdCBldmVyeSBtYWpvciB1c2VyCi0Jb2YgRnJlZVR5cGUgaGFzIGJlZW4gcmVxdWVzdGluZy4gIEdsb2JhbCBhZHZhbmNlIGlzIGJyb2tlbiBpbiBtYW55Ci0JQ0pLIGZvbnRzLiAgSnVzdCBpZ25vcmluZyBpdCBieSBkZWZhdWx0IG1ha2VzIG1vc3Qgc2Vuc2UuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9nZXRfYWR2YW5jZXMpLAotCXNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0dldF9ITWV0cmljcywgVFRfR2V0X1ZNZXRyaWNzLAotCXR0X2dldF9tZXRyaWNzLCBjb21wdXRlX2dseXBoX21ldHJpY3MsIFRUX0xvYWRfR2x5cGgpLAotCXNyYy90cnVldHlwZS90dGdsb2FkLmg6IEltcGxlbWVudCBpdC4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDExLTA0LTIxICByYWlueTYxNDQgIDxyYWlueTYxNDRAZ21haWwuY29tPgotCi0JW2F1dG9maXRdIEJsdXIgQ0pLIHN0ZW1zIGlmIHRvbyBtYW55IHRvIHByZXNlcnZlIHRoZWlyIGdhcHMuCi0KLQlXaGVuIHRoZXJlIGFyZSB0b28gbWFueSBzdGVtcyB0byBwcmVzZXJ2ZSB0aGVpciBnYXBzIGluIHRoZQotCXJhc3Rlcml6YXRpb24gb2YgQ0pLIElkZW9ncmFwaHMgYXQgYSBsb3cgcmVzb2x1dGlvbiwgYmx1ciB0aGUKLQlzdGVtcyBpbnN0ZWFkIG9mIHNob3dpbmcgY2x1bXBlZCBzdGVtcy4gIFNlZQotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDExLTAyL21zZzAwMDExLmh0bWwKLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMS0wNC9tc2cwMDA0Ni5odG1sCi0JZm9yIGRldGFpbHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19oaW50X2VkZ2VzKTogU3RvcmUgdGhlIHBvc2l0aW9uIG9mCi0JdGhlIHByZXZpb3VzIHN0ZW0gYnkgYGhhc19sYXN0X3N0ZW0nIGFuZCBgbGFzdF9zdGVtX3BvcycsIGFuZCBza2lwCi0JYSBzdGVtIGlmIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGVtIGFyZSB0b28gbmVhciB0byBwcmVzZXJ2ZQotCXRoZSBnYXAuCi0KLTIwMTEtMDQtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUludGVncmF0ZSBhdXRvZml0dGVyIGRlYnVnZ2luZyBzdHVmZi4KLQotCSogZGV2ZWwvZnRvcHRpb24uaCwgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAotCShGVF9ERUJVR19BVVRPRklUKTogTmV3IG1hY3JvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogQWRkIHRyYWNlIGNvbXBvbmVudHMgZm9yCi0JYXV0b2ZpdHRlci4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9MT0cpOiBSZW1vdmVkLgotCShfYWZfZGVidWcpOiBSZW1vdmVkLgotCi0JKiBzcmMvYXV0b2ZpdC8qOiBzL0FGX0RFQlVHL0ZUX0RFQlVHX0FVVE9GSVQvLgotCXMvQUZfTE9HL0ZUX1RSQUNFNS8uCi0JRGVmaW5lIEZUX0NPTVBPTkVOVCB3aGVyZSBuZWNlc3NhcnkuCi0KLTIwMTEtMDQtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVN5bmNocm9uaXplIGNvbmZpZyBmaWxlcy4KLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW46IENvcHkgbWlzc2luZyBhc3NlbWJsZXIgcm91dGluZXMgZnJvbQotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmguCi0KLTIwMTEtMDQtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eF0gRml4IFNhdmFubmFoIGJ1ZyAjMzMwNDcuCi0KLQlQYXRjaCBzdWJtaXR0ZWQgYnkgYW5vbnltb3VzIHJlcG9ydGVyLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX3RhYmxlX2FkZCk6IFVzZSBGVF9QdHJEaXN0IGZvciBwb2ludGVyCi0JZGlmZmVyZW5jZS4KLQotMjAxMS0wNC0xMSAgS2FuLVJ1IENoZW4gIDxrYW5ydUBrYW5ydS5pbmZvPgotCi0JRml4IHJlYWRpbmcgb2Ygc2lnbmVkIGludGVnZXJzIGZyb20gZmlsZXMgb24gNjRiaXQgcGxhdGZvcm1zLgotCi0JUHJldmlvdXNseSwgc2lnbmVkIGludGVnZXJzIHdlcmUgY29udmVydGVkIHRvIHVuc2lnbmVkIGludGVnZXJzLCBidXQKLQl0aGlzIGNhbiBmYWlsIGJlY2F1c2Ugb2Ygc2lnbiBleHRlbnNpb24uICBGb3IgZXhhbXBsZSwgMHhhMzQ0YTFlYgotCWJlY29tZXMgMHhmZmZmZmZmZmEzNDRhMWViLgotCi0JV2Ugbm93IGRvIHRoZSByZXZlcnNlIHdoaWNoIGlzIGFsd2F5cyBjb3JyZWN0IGJlY2F1c2UgdGhlIGludGVnZXIKLQlzaXplIGlzIHRoZSBzYW1lIGR1cmluZyB0aGUgY2FzdCBmcm9tIHVuc2lnbmVkIHRvIHNpZ25lZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oLCBzcmMvYmFzZS9mdHN0cmVhbS5jCi0JKEZUX1N0cmVhbV9HZXQqKTogUmVwbGFjZSB3aXRoLi4uCi0JKEZUX1N0cmVhbV9HZXRVKik6IEZ1bmN0aW9ucyB3aGljaCByZWFkIHVuc2lnbmVkIGludGVnZXJzLgotCVVwZGF0ZSBhbGwgbWFjcm9zIGFjY29yZGluZ2x5LgotCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYyAoZnRfZ3ppcF9nZXRfdW5jb21wcmVzc2VkX3NpemUpOiBVcGRhdGVkLgotCi0yMDExLTA0LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlVcGRhdGUgVW5pY29kZSByYW5nZXMgZm9yIENKSyBhdXRvZml0dGVyOyBpbiBwYXJ0aWN1bGFyLCBhZGQgSGFuZ3VsLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfdW5pcmFuZ2VzKTogVXBkYXRlIHRvIFVuaWNvZGUgNi4wLgotCi0yMDExLTA0LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggZm9ybWF0dGluZyBvZiBhdXRvZml0IGRlYnVnIGR1bXBzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzLAotCWFmX2dseXBoX2hpbnRzX2R1bXBfc2VnbWVudHMsIGFmX2dseXBoX2hpbnRzX2R1bXBfZWRnZXMpOiBBZGp1c3QKLQljb2x1bW4gd2lkdGhzLgotCi0yMDExLTAzLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCAoQUZfT3V0bGluZVJlYyk6IFJlbW92ZWQsIHVudXNlZC4KLQotMjAxMS0wMy0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9NQVhfQ0lEX0ZPTlRTKTogSW5jcmVhc2UgdG8gMjU2LgotCVRoaXMgbGltaXQgaXMgZ2l2ZW4gb24gcC4gMzcgb2YgQWRvYmUgVGVjaG5pY2FsIE5vdGUgIzUwMTQuCi0KLTIwMTEtMDMtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYyAodHRfZmFjZV9sb2FkX2xvY2EpOiBGaXggbWlzbWF0Y2ggd2FybmluZy4KLQotMjAxMS0wMy0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9vcGVuX2ZvbnQpOiBDaGVjayBudW1iZXIgb2YgVFRDIHN1YmZvbnRzLgotCi0yMDExLTAzLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNb3JlIEMrKyBjb21waWxhdGlvbiBmaXhlcy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cywKLQlhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzLCBhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzKQotCVtfX2NwbHVzcGx1c106IFByb3RlY3Qgd2l0aCBgZXh0ZXJuICJDIicuCi0KLTIwMTEtMDMtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUMrKyBjb21waWxhdGlvbiBmaXhlcy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19hcHBseSksIHNyYy9hdXRvZml0L2FmY2prLmMKLQkoYWZfY2prX2hpbnRzX2FwcGx5KTogVXNlIGNhc3QgZm9yIGBkaW0nLgotCi0yMDExLTAzLTE3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlBIGJldHRlciBmaXggZm9yIFNhdmFubmFoIGJ1ZyAjMzI2NzEuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9jb25pYyk6IENsZWFuIHVwIGNvZGUgYW5kCi0JcmVwbGFjZSBXSElMRSBsb29wIHdpdGggYSBtb3JlIG5hdHVyYWwgRE8tV0hJTEUgY29uc3RydWN0LgotCi0yMDExLTAzLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+LgotCi0JKiBzcmMvYmFzZS9mdHN0cm9rZS5jIChGVF9TdHJva2VyUmVjKTogUmVtb3ZlIHVudXNlZCBgdmFsaWQnIGZpZWxkLgotCVN1Z2dlc3RlZCBieSBHcmFoYW0gQXNoZXIuCi0KLTIwMTEtMDMtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgRlRfU2ZudF9UYWJsZV9JbmZvIHJldHVybiB0aGUgbnVtYmVyIG9mIFNGTlQgdGFibGVzLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X3RhYmxlX2luZm8pOiBJbXBsZW1lbnQgaXQuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0dGFibGVzLmg6IFVwZGF0ZSBkb2N1bWVudGF0aW9uLgotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDExLTAzLTA3ICBCcmFtIFRhc3N5bnMgIDxicmFtdEBlbmZvY3VzLmJlPgotCi0JW2NmZl0gRml4IFNhdmFubmFoIGJ1ZyAjMjc5ODguCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChyZW1vdmVfc3R5bGUpOiBOZXcgZnVuY3Rpb24uCi0JKGNmZl9mYWNlX2luaXQpOiBVc2UgaXQgdG8gc3RyaXAgb2ZmIHRoZSBzdHlsZSBwYXJ0IG9mIHRoZSBmYW1pbHkKLQluYW1lLgotCi0yMDExLTAzLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxMS0wMy0wNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JUXVpY2sgZml4IGZvciBTYXZhbm5haCBidWcgIzMyNjcxLgotCi0JVGhpcyBpc24ndCB0aGUgb3B0aW1hbCBzb2x1dGlvbiB5ZXQsIGJ1dCBpdCByZXN0b3JlcyB0aGUgcHJldmlvdXMKLQlyZW5kZXJpbmcgcXVhbGl0eSAobW9yZSBvciBsZXNzKS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmVuZGVyX2NvbmljKTogRG8gbW9yZSBzcGxpdHRpbmcuCi0KLTIwMTEtMDMtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBhdXRvaGludGluZyBmYWxsYmFjay4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBBc3N1cmUgdGhhdCB3ZSBvbmx5IGNoZWNrIFRURnMsCi0JaWdub3JpbmcgQ0ZGLWJhc2VkIE9URnMuCi0KLTIwMTEtMDItMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIgdG8gY29udHJvbCB0aGUgYXV0b2ZpdCB3YXJwZXIuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmgsIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSKTogTmV3IG1hY3JvLgotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9VU0VfV0FSUEVSKTogUmVtb3ZlLgotCi0JKiBzcmMvYXV0b2ZpdC8qOiBzL0FGX1VTRV9XQVJQRVIvQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSLy4KLQotCSogc3JjL2F1dG9maXQvYWZ3YXJwLmMgWyFBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVJdOiBSZXBsYWNlIGR1bW15Ci0JdmFyaWFibGUgYXNzaWdubWVudCB3aXRoIGEgdHlwZWRlZi4KLQotMjAxMS0wMi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFNsaWdodCBzaW1wbGlmaWNhdGlvbnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfbGlua19zZWdtZW50cyk6IFJlbW92ZQotCXRlc3Qgd2hpY2ggYWx3YXlzIHJldHVybnMgZmFsc2UuCi0JKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfYmx1ZV9lZGdlcyk6IFJlbW92ZSByZWR1bmRhbnQgYXNzaWdubWVudC4KLQotMjAxMS0wMi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL1BST0JMRU1TOiBNZW50aW9uIHJlbmRlcmluZyBkaWZmZXJlbmNlcyBvbiBkaWZmZXJlbnQKLQlwbGF0Zm9ybXMuCi0JU3VnZ2VzdGVkIGFuZCB3b3JkZWQgYnkgSmFzb24gT3dlbiA8amFzb24uYS5vd2VuQGdtYWlsLmNvbT4uCi0KLTIwMTEtMDItMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBDb21tZW50IG91dCB1bnVzZWQgY29kZS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jLCBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jCi0JKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfZWRnZXMpOiBEbyBpdC4KLQotMjAxMS0wMi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmggKEFGX0dseXBoSGludHMpOiBSZW1vdmUgdW51c2VkIGZpZWxkLgotCi0yMDExLTAyLTIwICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2NhY2hlXSBGaXggYW4gb2ZmLWJ5LW9uZSBidWcgaW4gYEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCcuCi0JRm91bmQgYnkgPHljaGVuMTM5MjAwMUB5YWhvby5jb20uY24+LCBzZWUgZGV0YWlsIGluCi0KLQkgIGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS8yMDExLTAxL21zZzAwMDIzLmh0bWwKLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKEZUQ19DYWNoZV9SZW1vdmVGYWNlSUQpOiBDaGVjayB0aGUgbm9kZQotCWJ1Y2tldHNbY2FjaGUtPnAgKyBjYWNoZS0+bWFza10gdG9vLgotCi0yMDExLTAyLTE5ICBLZXZpbiBLb2ZsZXIgIDxrZXZpbi5rb2ZsZXJAY2hlbGxvLmF0PgotCi0JRmFsbCBiYWNrIHRvIGF1dG9oaW50aW5nIGlmIGEgVFRGL09URiBkb2Vzbid0IGNvbnRhaW4gYW55IGJ5dGVjb2RlLgotCVRoaXMgaXMgU2F2YW5uYWggcGF0Y2ggIzc0NzEuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogSW1wbGVtZW50IGl0LgotCi0yMDExLTAyLTE5ICBKb2huIFR5dGdhdCAgPEpvaG4uVHl0Z2F0QGVza28uY29tPgotCi0JW2NmZl0gRml4IHN1YnNldCBwcmVmaXggcmVtb3ZhbC4KLQlUaGlzIGlzIFNhdmFubmFoIHBhdGNoICM3NDY1LgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAocmVtb3ZlX3N1YnNldF9wcmVmaXgpOiBVcGRhdGUgbGVuZ3RoIGFmdGVyCi0Jc3Vic2V0IHByZWZpeCByZW1vdmFsLgotCi0yMDExLTAyLTEzICBCcmFkbGV5IEdyYWluZ2VyICA8YmdyYWluZ2VyQGxvZ29zLmNvbT4KLQotCUFkZCBpbmxpbmUgYXNzZW1ibHkgdmVyc2lvbiBvZiBGVF9NdWxGaXggZm9yIE1TVkMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IFBvcnRlZCB0aGUgRlRfTXVsRml4X2kzODYKLQlmdW5jdGlvbiBmcm9tIEdOVSBpbmxpbmUgYXNzZW1ibHkgc3ludGF4IChzZWUgI2lmZGVmIF9fR05VQ19fIGJsb2NrCi0JYWJvdmUpIHRvIE1BU00gc3ludGF4IGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLQotMjAxMS0wMi0xMyAgQnJhZGxleSBHcmFpbmdlciAgPGJncmFpbmdlckBsb2dvcy5jb20+Ci0KLQlBZGQgcHJvamVjdCBhbmQgc29sdXRpb24gZmlsZXMgaW4gVmlzdWFsIFN0dWRpbyAyMDEwIGZvcm1hdC4KLQotCSogYnVpbGRzL3dpbjMyLy5naXRpZ25vcmU6IElnbm9yZSB1c2VyLXNwZWNpZmljIGNhY2hlIGZpbGVzLgotCSogYnVpbGRzL3dpbjMyL3ZjMjAxMC86IEFkZCBWUzIwMTAgcHJvamVjdCAmIHNvbHV0aW9uIGZpbGVzLCBjcmVhdGVkCi0JYnkgdXBncmFkaW5nIGJ1aWxkcy93aW4zMi92YzIwMDgvZnJlZXR5cGUudmNwcm9qLgotCSogb2Jqcy8uZ2l0aWdub3JlOiBJZ25vcmUgVmlzdWFsIFN0dWRpbyBvdXRwdXQgZmlsZXMuCi0KLTIwMTEtMDItMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZkdW1teS5jOiBJbmNsdWRlIGBhZmVycm9ycy5oJy4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IENocmlzIExpZGRlbGwgPGNocmlzLmxpZGRlbGxAYXJ0aWZleC5jb20+LgotCi0yMDExLTAyLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBJZ25vcmUgdW5rbm93biBvcGVyYXRvcnMgaW4gY2hhcnN0cmluZ3MuCi0JUGF0Y2ggc3VnZ2VzdGVkIGJ5IE1pbGVzLkxhdSA8c3VubGlhbmdfbGl1QGZveGl0c29mdHdhcmUuY29tPi4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IEVtaXQgdHJhY2luZwotCW1lc3NhZ2UgZm9yIHVua25vd24gb3BlcmF0b3JzIGFuZCBjb250aW51ZSBpbnN0ZWFkIG9mIGV4aXRpbmcgd2l0aCBhCi0Jc3ludGF4IGVycm9yLgotCi0yMDExLTAyLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZUX0xPQURfUEVEQU5USUMgbm93IGFmZmVjdHMgYHByZXAnIGFuZCBgZnBnbScgYWxzby4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfbG9hZGVyX2luaXQpOiBIYW5kbGUKLQlgRlRfTE9BRF9QRURBTlRJQycuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcnVuX2ZwZ20sIHR0X3NpemVfcnVuX3ByZXAsCi0JdHRfc2l6ZV9pbml0X2J5dGVjb2RlLCB0dF9zaXplX3JlYWR5X2J5dGVjb2RlKTogTmV3IGFyZ3VtZW50IHRvCi0JaGFuZGxlIHBlZGFudGljIG1vZGUuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmg6IFVwZGF0ZWQuCi0KLTIwMTEtMDEtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gUHJvdGVjdCBqdW1wIGluc3RydWN0aW9ucyBhZ2FpbnN0IGVuZGxlc3MgbG9vcHMuCi0KLQkqIHNyYy90cnVldHlwZS9pbnRlcnAuYyAoRE9fSlJPVCwgRE9fSk1QUiwgRE9fSlJPRik6IEV4aXQgd2l0aCBlcnJvcgotCWlmIG9mZnNldCBpcyB6ZXJvLgotCi0yMDExLTAxLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEltcHJvdmUgaGFuZGxpbmcgb2YgaW52YWxpZCByZWZlcmVuY2VzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvaW50ZXJwLmM6IFNldCBldmVuIG1vcmUgVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlCi0JZXJyb3IgY29kZXMgb25seSBpZiBwZWRhbnRpYyBoaW50aW5nIGlzIGFjdGl2ZS4gIEF0IHRoZSBzYW1lIHRpbWUsCi0JdHJ5IHRvIHByb3ZpZGUgc2FuZSB2YWx1ZXMgd2hpY2ggaG9wZWZ1bGx5IGFsbG93IHVzZWZ1bAotCWNvbnRpbnVhdGlvbi4gIEV4Y2VwdGlvbiB0byB0aGlzIGlzIENBTEwgYW5kIExPT1BDQUxMIOKAkyBkdWUgdG8KLQlwb3NzaWJsZSBzdGFjayBjb3JydXB0aW9uIGl0IGlzIG5lY2Vzc2FyeSB0byBiYWlsIG91dC4KLQotMjAxMS0wMS0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJbXByb3ZlIGhhbmRsaW5nIG9mIHN0YWNrIHVuZGVyZmxvdy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX1J1bklucywgSW5zX0ZMSVBQVCwgSW5zX0RFTFRBUCwKLQlJbnNfREVMVEFDKTogRXhpdCB3aXRoIGVycm9yIG9ubHkgaWYgYHBlZGFudGljX2hpbnRpbmcnIGlzIHNldC4KLQlPdGhlcndpc2UsIHRyeSB0byBkbyBzb21ldGhpbmcgc2FuZS4KLQotMjAxMS0wMS0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dG10eC5jICh0dF9mYWNlX2xvYWRfaG10eCk6IEZpeCB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMTEtMDEtMzAgIExJVSBTdW4tTGlhbmcgIDxzdW5saWFuZ19saXVAZm94aXRzb2Z0d2FyZS5jb20+Ci0KLQlbdHJ1ZXR5cGVdOiBGaXggYmVoYXZpb3VyIG9mIE1JQVAgZm9yIGludmFsaWQgYXJndW1lbnRzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX01JQVApOiBTZXQgcmVmZXJlbmNlIHBvaW50cyBldmVuIGluCi0JY2FzZSBvZiBlcnJvci4KLQotMjAxMS0wMS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggaGFuZGxpbmcgb2YgTUlSUCBpbnN0cnVjdGlvbi4KLQotCVRoYW5rcyB0byBHcmVnIEhpdGNoY29jayB3aG8gZXhwbGFpbmVkIHRoZSBpc3N1ZS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NSVJQKTogUmVwbGFjZSBhIGA+PScgb3BlcmF0b3Igd2l0aAotCWA+JyBzaW5jZSB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIHNwZWNpZmljYXRpb24gaXMgaW5jb3JyZWN0LgotCVRoaXMgZml4ZXMsIGZvciBleGFtcGxlLCBnbHlwaCBgdHdvJyBpbiBmb250IGBIZWx2ZXRpY2EgTmV1ZSBMVCBDb20KLQk2NSBtZWRpdW0nIGF0IDE1cHBlbS4KLQotMjAxMS0wMS0xNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZpeCBBUk0gYXNzZW1ibHkgY29kZSBpbiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIChGVF9NdWxGaXhfYXJtKToKLQlDb3B5IHRoZSBtYWludGFpbmVkIGNvZGUgZnJvbSBidWlsZHMvdW5peC9mdGNvbmZpZy5pbi4KLQlPbGQgR05VIGJpbnV0aWxzIGNvdWxkIG5vdCBhY2NlcHQgdGhlIHJlZHVjZWQgc3ludGF4Ci0JYG9yciAlMCwgJTIsIGxzbCAjMTYnLiAgVW4tb21pdHRlZCBzeW50YXggbGlrZSBSVkNULAotCWBvcnIgJTAsICUwLCAlMiwgbHNsICMxNicgaXMgYmV0dGVyLiAgUmVwb3J0ZWQgYnkKLQlKb2huc29uIFkuIFlhbi4gIFRoZSBidWcgcmVwb3J0IGJ5IFF0IGRldmVsb3BlcnMgaXMKLQljb25zaWRlcmVkIHRvby4KLQotCWh0dHA6Ly9idWdyZXBvcnRzLnF0Lm5va2lhLmNvbS9icm93c2UvUVRCVUctNjUyMQotCi0yMDExLTAxLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcmFzdGVyXSBNYWtlIGJib3ggaGFuZGxpbmcgdGhlIHNhbWUgYXMgd2l0aCBNaWNyb3NvZnQncyByYXN0ZXJpemVyLgotCi0JUmlnaHQgYmVmb3JlIEIvVyByYXN0ZXJpemluZywgdGhlIGJib3ggZ2V0cyBzaW1wbHkgcm91bmRlZCB0bwotCWludGVnZXJzLiAgVGhpcyBmaXhlcywgZm9yIGV4YW1wbGUsIGdseXBoIGB0aHJlZScgaW4gZm9udCBgSGVsdmV0aWNhCi0JTmV1ZSBMVCBDb20gNjUgTWVkaXVtJyBhdCAxMXBwZW0uCi0KLQlUaGFua3MgdG8gR3JlZyBIaXRjaGNvY2sgd2hvIGV4cGxhaW5lZCB0aGlzIGJlaGF2aW91ci4KLQotCSogc3JjL3Jhc3Rlci9mdHJlbmQxLmMgKGZ0X3Jhc3RlcjFfcmVuZGVyKTogSW1wbGVtZW50IGl0LgotCi0yMDExLTAxLTE1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JQ29weSAtbWNwdT0qICYgLW1hcmNoPSogb3B0aW9ucyBmcm9tIENGTEFHUyB0byBMREZMQUdTLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBDb25zaWRlciByZWNlbnQgZ2NjLXN0YW5kYXJkCi0JZmxhZ3MgdG8gc3BlY2lmeSBhcmNoaXRlY3R1cmUgaW4gQ0ZMQUdTICYgTERGTEFHUwotCWhhcm1vbml6YXRpb24uICBSZXF1ZXN0ZWQgYnkgU2F2YW5uYWggYnVnICMzMjExNCwgdG8KLQlzdXBwb3J0IG11bHRpbGliIGZlYXR1cmUgb2YgQnVpbGRSb290IFNESyBjb3JyZWN0bHkuCi0KLTIwMTEtMDEtMTUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGaXggb2ZmLWJ5LW9uZSBidWcgaW4gQ0ZMQUdTICYgTERGTEFHUyBoYXJtb25pemVyLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBTb21lIGltcG9ydGFudCBvcHRpb25zIHRoYXQKLQlpbmNsdWRlZCBpbiBDRkxBR1MgYnV0IG5vdCBpbiBMREZMQUdTIGFyZSBjb3BpZWQgdG8KLQlMREZMQUdTLCBidXQgdGhlIGxhc3Qgb3B0aW9uIGluIENGTEFHUyB3YXMgbm90IGNoZWNrZWQuCi0KLTIwMTEtMDEtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtyYXN0ZXJdIEFkZCB1bmRvY3VtZW50ZWQgZHJvcC1vdXQgcnVsZSB0byB0aGUgb3RoZXIgYmJveCBzaWRlIGFsc28uCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoVmVydGljYWxfU3dlZXBfRHJvcCwKLQlIb3Jpem9udGFsX1N3ZWVwX0Ryb3ApOiBJbXBsZW1lbnQgaXQuCi0KLTIwMTEtMDEtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtyYXN0ZXJdIFJlZHVjZSBqaXR0ZXIgdmFsdWUuCi0KLQlUaGlzIGNhdGNoZXMgYSByZW5kZXJpbmcgcHJvYmxlbSB3aXRoIGdseXBoIGB4JyBmcm9tIFRhaG9tYSBhdAotCTEwcHBlbS4gIEl0IHNlZW1zIHRoYXQgdGhlIGluY3JlYXNlIG9mIHRoZSBwcmVjaXNpb24gaW4gdGhlIGNoYW5nZQotCWZyb20gMjAwOS0wNi0xMSBtYWtlcyBhIGxhcmdlciBqaXR0ZXIgdmFsdWUgdW5uZWNlc3NhcnkuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoU2V0X0hpZ2hfUHJlY2lzaW9uKTogSW1wbGVtZW50IGl0LgotCi0yMDExLTAxLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcmFzdGVyXSBIYW5kbGUgZHJvcC1vdXRzIGF0IGdseXBoIGJvcmRlcnMgYWNjb3JkaW5nIHRvIE1pY3Jvc29mdC4KLQotCUlmIGEgZHJvcC1vdXQgcnVsZSB3b3VsZCBzd2l0Y2ggb24gYSBwaXhlbCBvdXRzaWRlIG9mIHRoZSBnbHlwaCdzCi0JYm91bmRpbmcgYm94LCB1c2UgdGhlIHJpZ2h0IChvciB0b3ApIHBpeGVsIGluc3RlYWQuICBUaGlzIGlzIGFuCi0JdW5kb2N1bWVudGVkIGZlYXR1cmUsIGJ1dCBzb21lIGZvbnRzIGxpa2UgYEhlbHZldGljYSBOZXVlIExUIENvbSA2NQotCU1lZGl1bScgaGVhdmlseSByZWx5IG9uIGl0LgotCi0JVGhhbmtzIHRvIEdyZWcgSGl0Y2hjb2NrIHdobyBleHBsYWluZWQgdGhpcyBiZWhhdmlvdXIuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoVmVydGljYWxfU3dlZXBfRHJvcCwKLQlIb3Jpem9udGFsX1N3ZWVwX0Ryb3ApOiBJbXBsZW1lbnQgaXQuCi0KLTIwMTEtMDEtMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbY2FjaGVdIEZpeCBTYXZhbm5haCBidWcgIzMxOTIzLCBwYXRjaCBkcmFmdGVkIGJ5IEhhcnNoYS4KLQotCVdoZW4gYSBub2RlIGNvbXBhcmF0b3IgY2hhbmdlcyB0aGUgY2FjaGVkIG5vZGVzIGR1cmluZyB0aGUKLQlzZWFyY2ggb2YgYSBub2RlIG1hdGNoaW5nIHdpdGggcXVlcmllZCBwcm9wZXJ0aWVzLCB0aGUKLQlwb2ludGVycyBvYnRhaW5lZCBiZWZvcmUgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSB1cGRhdGVkIHRvCi0JcHJldmVudCB0aGUgZGVyZWZlcmVuY2UgdG8gZnJlZWQgb3IgcmVhbGxvY2F0ZWQgbm9kZXMuCi0JVG8gbWluaW1pemUgdGhlIHJlc2NhbiBvZiB0aGUgbGlua2VkIGxpc3QsIHRoZSB1cGRhdGUgaXMKLQlleGVjdXRlZCB3aGVuIHRoZSBjb21wYXJhdG9yIG5vdGlmaWVzIHRoZSBjaGFuZ2Ugb2YgY2FjaGVkCi0Jbm9kZXMuIFRoaXMgY2hhbmdlIGRlcGVuZHMgcHJldmlvdXMgY2hhbmdlOgotCTM4YjI3MmZmYmJkYWFlMjc2ZDYzNmFlYzRlZjg0YWY0MDdkMTYxODEKLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmggKEZUQ19DQUNIRV9MT09LVVBfQ01QKTogUmVzY2FuIHRoZQotCXRvcCBub2RlIGlmIHRoZSBjYWNoZWQgbm9kZXMgYXJlIGNoYW5nZWQuCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuYyAoRlRDX0NhY2hlX0xvb2t1cCk6IERpdHRvLgotCi0yMDExLTAxLTA5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2NhY2hlXSBOb3RpY2UgaWYgYSBjYWNoZSBxdWVyeSBpbmR1Y2VkIHRoZSBub2RlIGxpc3QgY2hhbmdlLgotCi0JU29tZSBub2RlIGNvbXBhcmF0b3JzIChjb21wYXJpbmcgdGhlIGNhY2hlIG5vZGUgY29udGVudHMgYW5kIHRoZQotCXByb3BlcnRpZXMgc3BlY2lmaWVkIGJ5IHRoZSBxdWVyeSkgY2FuIGZsdXNoIHRoZSBjYWNoZSBub2RlIHRvCi0JcHJldmVudCB0aGUgY2FjaGUgaW5mbGF0aW9uLiAgVGhlIGNoYW5nZSBtYXkgaW52YWxpZGF0ZSB0aGUgcG9pbnRlcnMKLQl0byB0aGUgbm9kZSBvYnRhaW5lZCBiZWZvcmUgdGhlIG5vZGUgY29tcGFyaXNvbiwgc28gaXQgc2hvdWxkIGJlCi0Jbm90aWNlZCB0byB0aGUgY2FsbGVyLiAgVGhlIHByb2JsZW0gY2F1c2VkIGJ5IHRoZSBjYWNoZSBub2RlCi0JY2hhbmdpbmcgaXMgcmVwb3J0ZWQgYnkgSGFyc2hhLCBzZWUgU2F2YW5uYWggYnVnICMzMTkyMy4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmggKEZUQ19Ob2RlX0NvbXBhcmVGdW5jKTogQWRkIG5ldyBhcmd1bWVudAotCWBGVF9Cb29sKiBsaXN0X2NoYW5nZWQnIHRvIGluZGljYXRlIHRoZSBjaGFuZ2Ugb2YgdGhlIGNhY2hlZCBub2RlcwotCXRvIHRoZSBjYWxsZXIuCi0JKEZUQ19DQUNIRV9MT09LVVBfQ01QKTogV2F0Y2ggdGhlIGNoYW5nZSBvZiB0aGUgY2FjaGVkIG5vZGVzIGJ5Ci0JYF9saXN0X2NoYW5nZWQnLgotCShGVENfQ0FDSEVfVFJZTE9PUF9FTkQpOiBUYWtlIG5ldyBtYWNybyBhcmd1bWVudCBgX2xpc3RfY2hhbmdlZCcKLQlhbmQgdXBkYXRlIGl0IHdoZW4gYEZUQ19NYW5hZ2VyX0ZsdXNoTicgZmx1c2hlcyBhbnkgbm9kZXMuCi0KLQkqIHNyYy9jYWNoZS9mdGNjYmFjay5oIChmdGNfc25vZGVfY29tcGFyZSk6IFVwZGF0ZWQgdG8gZml0IHdpdGggbmV3Ci0JRlRDX05vZGVfQ29tcGFyZUZ1bmMgdHlwZS4KLQkoZnRjX2dub2RlX2NvbXBhcmUpOiBEaXR0by4KLQotCSogc3JjL2NhY2hlL2Z0Y2Jhc2ljLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19IIHRvIHVzZQotCVRSVUUvRkFMU0UgbWFjcm9zLgotCShmdGNfYmFzaWNfZ25vZGVfY29tcGFyZV9mYWNlaWQpOiBOZXcgYXJndW1lbnQgYEZUX0Jvb2wqCi0JbGlzdF9jaGFuZ2VkJyB0byBpbmRpY2F0ZSB0aGUgY2hhbmdlIG9mIHRoZSBjYWNoZSBub2RlcyAoYW55d2F5LCBpdAotCWlzIGFsd2F5cyBGQUxTRSkuCi0KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19IIHRvIHVzZQotCVRSVUUvRkFMU0UgbWFjcm9zLgotCShmdGNfY21hcF9ub2RlX2NvbXBhcmUpOiBOZXcgYXJndW1lbnQgYEZUX0Jvb2wqIGxpc3RfY2hhbmdlZCcgdG8KLQlpbmRpY2F0ZSB0aGUgY2hhbmdlIG9mIHRoZSBjYWNoZSBub2RlcyAoYW55d2F5LCBpdCBpcyBhbHdheXMgRkFMU0UpLgotCShmdGNfY21hcF9ub2RlX3JlbW92ZV9mYWNlaWQpOiBEaXR0by4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKEZUQ19DYWNoZV9OZXdOb2RlKTogUGFzcyBhIE5VTEwgcG9pbnRlciB0bwotCWBGVENfQ0FDSEVfVFJZTE9PUF9FTkQnLCBiZWNhdXNlIHRoZSByZXN1bHQgaXMgbm90IG5lZWRlZC4KLQkoRlRDX0NhY2hlX0xvb2t1cCk6IFdhdGNoIHRoZSBjaGFuZ2Ugb2YgdGhlIGNhY2hlIG5vZGVzIGJ5Ci0JYGxpc3RfY2hhbmdlZCcuCi0JKEZUQ19DYWNoZV9SZW1vdmVGYWNlSUQpOiBEaXR0by4KLQotCSogc3JjL2NhY2hlL2Z0Y2dseXBoLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19IIHRvIHVzZQotCVRSVUUvRkFMU0UgbWFjcm9zLgotCShmdGNfZ25vZGVfY29tcGFyZSk6IE5ldyBhcmd1bWVudCBgRlRfQm9vbCogbGlzdF9jaGFuZ2VkJyB0bwotCWluZGljYXRlIHRoZSBjaGFuZ2Ugb2YgdGhlIGNhY2hlIG5vZGVzIChhbnl3YXksIGl0IGlzIGFsd2F5cyBGQUxTRSkuCi0JKEZUQ19HTm9kZV9Db21wYXJlKTogTmV3IGFyZ3VtZW50IGBGVF9Cb29sKiBsaXN0X2NoYW5nZWQnIHRvIGJlCi0JcGFzc2VkIHRvIGBmdGNfZ25vZGVfY29tcGFyZScuCi0JKiBzcmMvY2FjaGUvZnRjZ2x5cGguaCAoRlRDX0dOb2RlX0NvbXBhcmUpOiBEaXR0by4KLQotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgKGZ0Y19zbm9kZV9jb21wYXJlKTogTmV3IGFyZ3VtZW50IGBGVF9Cb29sKgotCWxpc3RfY2hhbmdlZCcgdG8gaW5kaWNhdGUgdGhlIGNoYW5nZSBvZiB0aGUgY2FjaGUgbm9kZXMsIGFueXdheS4gIEl0Ci0JaXMgdXBkYXRlZCBieSBgRlRDX0NBQ0hFX1RSWUxPT1AnLgotCShGVENfU05vZGVfQ29tcGFyZSk6IE5ldyBhcmd1bWVudCBgRlRfQm9vbCogbGlzdF9jaGFuZ2VkJyB0byBiZQotCXBhc3NlZCB0byBgZnRjX3Nub2RlX2NvbXBhcmUnLgotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmggKEZUQ19TTm9kZV9Db21wYXJlKTogRGl0dG8uCi0KLTIwMTEtMDEtMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbY2FjaGVdIEZpdCBgRlRDX0dOb2RlX0NvbXBhcmUnIHRvIGBGVENfTm9kZV9Db21wYXJlRnVuYycuCi0KLQkqIHNyYy9jYWNoZS9mdGNnbHlwaC5oIChGVENfR05vZGVfQ29tcGFyZSk6IEFkZCB0aGUgM3JkCi0JYXJndW1lbnQgYEZUQ19DYWNoZSAgY2FjaGUnIHRvIGZpdCBGVENfTm9kZV9Db21wYXJlRnVuYwotCXByb3RvdHlwZS4KLQkqIHNyYy9jYWNoZS9mdGNnbHlwaC5jIChGVENfR05vZGVfQ29tcGFyZSk6IERpdHRvLiBBbnl3YXksCi0JYGNhY2hlJyBpcyBub3QgdXNlZCBieSBpdHMgY2hpbGQgYGZ0Y19nbm9kZV9jb21wYXJlJy4KLQotMjAxMS0wMS0wOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtjYWNoZV0gRGVkdXBsaWNhdGUgdGhlIGNvZGUgdG8gZ2V0IHRoZSB0b3Agbm9kZSBieSBhIGhhc2guCi0KLQlUaGVyZSBhcmUgc2V2ZXJhbCBkdXBsaWNhdGVkIGNvZGUgZnJhZ21lbnRzIGdldHRpbmcgdGhlIHRvcCBub2RlCi0JZnJvbSBhIGNhY2hlIGJ5IGEgZ2l2ZW4gaGFzaCwgbGlrZToKLQotCSAgICBpZHggPSBoYXNoICYgY2FjaGUtPm1hc2s7Ci0JICAgIGlmICggaWR4IDwgY2FjaGUtPnAgKQotCSAgICAgIGlkeCA9IGhhc2ggJiAoIGNhY2hlLT5tYXNrICogMiArIDEgKTsKLQkgICAgcG5vZGUgPSBjYWNoZS0+YnVja2V0cyArIGlkeDsKLQotCVRvIHJlbW92ZSBkdXBsaWNhdGlvbiwgYSBjcHAtbWFjcm8gdG8gZG8gc2FtZSB3b3JrCi0JYEZUQ19OT0RFX19UT1BfRk9SX0hBU0gnIGlzIGludHJvZHVjZWQuICBGb3Igbm9uLWlubGluZWQKLQljb25maWd1cmF0aW9uLCBub24tYGZ0Y19nZXRfdG9wX25vZGVfZm9yX2hhc2gnIGlzIGFsc28gaW50cm9kdWNlZC4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmggKEZUQ19OT0RFX19UT1BfRk9SX0hBU0gpOiBEZWNsYXJlCi0JYW5kIGltcGxlbWVudCBpbmxpbmVkIHZlcnNpb24uCi0JKEZUQ19DQUNIRV9MT09LVVBfQ01QKTogVXNlIGBGVENfTk9ERV9fVE9QX0ZPUl9IQVNIJy4KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChmdGNfZ2V0X3RvcF9ub2RlX2Zvcl9oYXNoKTogTm9uLWlubGluZWQKLQl2ZXJzaW9uLgotCShmdGNfbm9kZV9oYXNoX3VubGluayk6IFVzZSBgRlRDX05PREVfX1RPUF9GT1JfSEFTSCcuCi0JKGZ0Y19ub2RlX2hhc2hfbGluayk6IERpdHRvLgotCShGVENfQ2FjaGVfTG9va3VwKTogRGl0dG8uCi0KLTIwMTEtMDEtMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbY2FjaGVdIGlubGluZS1zcGVjaWZpYyBmdW5jdGlvbnMgYXJlIGNvbmRpdGlvbmFsaXplZC4KLQotCSogc3JjL2NhY2hlL2Z0Y2dseXBoLmMgKEZUQ19HTm9kZV9Db21wYXJlKTogQ29uZGl0aW9uYWxpemVkIGZvcgotCWlubGluZWQgY29uZmlndXJhdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgYSB0aGluIHdyYXBwZXIgb2YKLQlgZnRjX2dub2RlX2NvbXBhcmUnIGZvciBpbmxpbmVkIGBGVENfQ0FDSEVfTE9PS1VQX0NNUCcgKHNlZQotCWBub2RlY21wJyBhcmd1bWVudCkuICBVbmRlciBub24taW5saW5lZCBjb25maWd1cmF0aW9uLAotCWBmdGNfZ25vZGVfY29tcGFyZScgaXMgaW52b2tlZCBieSBgRlRDX0NhY2hlX0xvb2t1cCcsIHZpYQotCWBGVENfQ2FjaGUtPmNsYXp6Lm5vZGVfY29tcGFyZScuCi0KLQkqIHNyYy9jYWNoZS9mdGNnbHlwaC5oIChGVENfR05vZGVfQ29tcGFyZSk6IERpdHRvLgotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgKEZUQ19TTm9kZV9Db21wYXJlKTogRGl0dG8sIGZvcgotCWBmdGNfc25vZGVfY29tcGFyZScuCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuaCAoRlRDX1NOb2RlX0NvbXBhcmUpOiBEaXR0by4KLQotMjAxMS0wMS0wOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtjYWNoZV0gQ29ycmVjdCBhIHR5cGUgbWlzbWF0Y2ggdW5kZXIgbm9uLWlubGluZWQgY29uZmlnLgotCi0JKiBzcmMvY2FjaGUvZnRjZ2x5cGguaCAoRlRDX0dDQUNIRV9MT09LVVBfQ01QKTogYEZUQ19HQ2FjaGVfTG9va3VwJwotCXRha2VzIHRoZSBub2RlIHZpYSBhIHBvaW50ZXIgYEZUQ19Ob2RlKicsIGRpZmZlcmVudGx5IGZyb20gY3BwLW1hY3JvCi0JYEZUQ19DQUNIRV9MT09LVVBfQ01QJy4KLQotMjAxMS0wMS0wNiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVVwZGF0ZSBKYW1maWxlIHRvIGluY2x1ZGUgQnppcDIgc3VwcG9ydC4KLQotCSogSmFtZmlsZTogSW5jbHVkZSBzcmMvYnppcDIgdG8gcHJvamVjdC4KLQlDb21tZW50cyBmb3IgbHp3LCBnemlwLCBiemlwMiBhcmUgY2hhbmdlZCB0byBjbGFyaWZ5IHRoYXQKLQl0aGV5IGFyZSBmb3IgY29tcHJlc3NlZCBQQ0YgZm9udHMsIG5vdCBvdGhlcnMuCi0JKGUuZy4gY29tcHJlc3NlZCBCREYgZm9udHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0KQotCi0yMDExLTAxLTA1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JVXBkYXRlIFN5bWJpYW4gcHJvamVjdCBmaWxlcyB0byBpbmNsdWRlIEJ6aXAyIHN1cHBvcnQuCi0KLQlDdXJyZW50bHksIGl0IHByb3ZpZGVzIGBGVF9TdHJlYW1fT3BlbkJ6aXAyJyB0aGF0IHJldHVybnMKLQl1bmltcGxlbWVudGVkIGVycm9yIGFsd2F5cywgdG8gcHJldmVudCB1bnJlc29sdmVkIHN5bWJvbAotCWVycm9yIGZvciB0aGUgYXBwbGljYXRpb25zIGRlc2lnbmVkIGZvciBVbml4IHN5c3RlbXMuCi0KLQkqIGJ1aWxkcy9zeW1iaWFuL2JsZC5pbmY6IEluY2x1ZGUgZnRiemlwMi5oLgotCSogYnVpbGRzL3N5bWJpYW4vZnJlZXR5cGUubW1wOiBJbmNsdWRlIGZ0YnppcDIuYy4KLQotMjAxMS0wMS0wNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVVwZGF0ZSBjbGFzc2ljIE1hY09TIG1ha2VmaWxlcyB0byBpbmNsdWRlIEJ6aXAyIHN1cHBvcnQuCi0KLQlDdXJyZW50bHksIGl0IHByb3ZpZGVzIGBGVF9TdHJlYW1fT3BlbkJ6aXAyJyB0aGF0IHJldHVybnMKLQl1bmltcGxlbWVudGVkIGVycm9yIGFsd2F5cywgdG8gcHJldmVudCB1bnJlc29sdmVkIHN5bWJvbAotCWVycm9yIGZvciB0aGUgYXBwbGljYXRpb25zIGRlc2lnbmVkIGZvciBVbml4IHN5c3RlbXMuCi0KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19jZm0ubWFrZS50eHQ6IEluY2x1ZGUgZnRiemlwMi5jLm8uCi0JKiBidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfZmFyLm1ha2UudHh0OiBEaXR0by4KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NhcmJvbi5tYWtlLnR4dDogSW5jbHVkZSBmdGJ6aXAyLmMueC4KLQkqIGJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NsYXNzaWMubWFrZS50eHQ6IERpdHRvLgotCi0yMDExLTAxLTA1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JVXBkYXRlIEFtaWdhIG1ha2VmaWxlcyB0byBpbmNsdWRlIEJ6aXAyIHN1cHBvcnQuCi0KLQlDdXJyZW50bHksIGl0IHByb3ZpZGVzIGBGVF9TdHJlYW1fT3BlbkJ6aXAyJyB0aGF0IHJldHVybnMKLQl1bmltcGxlbWVudGVkIGVycm9yIGFsd2F5cywgdG8gcHJldmVudCB1bnJlc29sdmVkIHN5bWJvbAotCWVycm9yIGZvciB0aGUgYXBwbGljYXRpb25zIGRlc2lnbmVkIGZvciBVbml4IHN5c3RlbXMuCi0KLQkqIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZTogSW5jbHVkZSBiemlwMi5wcGMubyBidWlsdCBmcm9tIGZ0YnppcDIuYy4KLQkqIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQ6IEluY2x1ZGUgYnppcDIubyBidWlsdCBmcm9tIGZ0YnppcDIuYy4KLQkqIGJ1aWxkcy9hbWlnYS9zbWFrZWZpbGU6IERpdHRvLgotCi0yMDExLTAxLTA1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JVXBkYXRlIHBrZy1jb25maWcgdG9vbHMgdG8gcmVmbGVjdCBCemlwMiBzdXBwb3J0LgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW46IEluY2x1ZGUgYC1sYnoyJyB0bwotCS0tbGlicyBvdXRwdXQsIGlmIGJ1aWx0IHdpdGggQnppcDIgc3VwcG9ydC4KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlMi5pbjogRGl0dG8uCi0KLTIwMTEtMDEtMDUgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IFJlbW92ZSBgU1lTVEVNX0JaMkxJQicgbWFjcm8uCi0KLQlTWVNURU1fWkxJQiBpcyB1c2VkIHRvIHN3aXRjaCB0aGUgYnVpbHRpbiB6bGliIHNvdXJjZQotCW9yIHN5c3RlbSB6bGliIHNvdXJjZSBvdXQgb2YgRnJlZVR5cGUyLiAgQnV0IGZ0YnppcDIKLQltb2R1bGUgaGFzIG5vIGJ1aWx0aW4gYnppcDIgbGlicmFyeSBhbmQgYWx3YXlzIHJlcXVpcmVzCi0Jc3lzdGVtIGJ6aXAyIGxpYnJhcnkuICBUaHVzIFNZU1RFTV9CWjJMSUIgaXMgYWx3YXlzIHllcywKLQlpdCBpcyBub3QgdXNlZC4KLQotMjAxMS0wMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKi9ydWxlcy5tazogSGFuZGxlIGAqcGljLmMnIGZpbGVzLgotCi0yMDEwLTEyLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmdHlwZXMuaCAoQ0ZGX01BWF9DSURfRk9OVFMpOiBJbmNyZWFzZSB0byA2NC4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IFRvbSBCaXNob3AgPHdlbmxpbkB3ZW5saW4uY29tPi4KLQotMjAxMC0xMi0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSW1wcm92ZSBiemlwMiBzdXBwb3J0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyLmg6IEFkZCBiemlwMi4KLQotCSogZG9jcy9JTlNUQUxMLkFOWSwgZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0JKiBzcmMvcGNmL1JFQURNRTogVXBkYXRlZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcGNmdHlwZXMuaDogT2Jzb2xldGUsIHJlbW92ZWQuCi0KLTIwMTAtMTItMzEgIEpvZWwgS2xpbmdoZWQgIDx0aGVfamtAeWFob28uY29tPgotCi0JQWRkIGJ6aXAyIGNvbXByZXNzaW9uIHN1cHBvcnQgdG8gaGFuZGxlICoucGNmLmJ6MiBmaWxlcy4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogVGVzdCBmb3IgbGliYnoyIGxpYnJhcnkuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmgsIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoRlRfQ09ORklHX09QVElPTl9VU0VfQlpJUDIpOiBEZWZpbmUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9CWklQMl9IKTogRGVmaW5lLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaDogTmV3IGZpbGUuCi0KLQkqIHNyYy9iemlwMi8qOiBOZXcgZmlsZXMuCi0KLQkqIHNyYy9wY2YvcGNmLmg6IHMvZ3ppcF8vY29tcF8vLgotCSogc3JjL3BjZi9wY2Zkcml2ci5jOiBJbmNsdWRlIEZUX0JaSVAyX0guCi0Jcy9nemlwXy9jb21wXy8uCi0JKFBDRl9GYWNlX0luaXQpOiBIYW5kbGUgYnppcDIgY29tcHJlc3NlZCBmaWxlcy4KLQotCSogZG9jcy9mb3JtYXRzLnR4dCwgbW9kdWxlcy5jZmc6IFVwZGF0ZWQuCi0KLTIwMTAtMTItMjUgIEhhcnNoYSAgPG1tLmhhcnNoYUBnbWFpbC5jb20+Ci0KLQlBcHBseSBTYXZhbm5haCBwYXRjaCAjNzQyMi4KLQotCUlmIHdlIGVuY291bnRlciBhIHNwYWNlIGluIGEgc3RyaW5nIHRoZW4gdGhlIHNiaXQgYnVmZmVyIGlzIE5VTEwsCi0JaGVpZ2h0IGFuZCB3aWR0aCBhcmUgMHMuICBTbyB0aGUgY2hlY2sgaW4gZnRjX3Nub2RlX2NvbXBhcmUgd2lsbAotCWFsd2F5cyBwYXNzIGZvciBzcGFjZXMgKGNvbXBhcmlzb24gd2l0aCAyNTUpLiAgSGVyZSB0aGUgY29tbWVudHMKLQlhYm92ZSB0aGUgY29uZGl0aW9uIGFyZSBwcm9wZXIgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QuICBXaGVuCi0Jd2UgY3JlYXRlIGFuIHNub2RlIEkgdGhpbmsgaXQgaXMgdGhlIHByb3BlciB3YXkgdG8gaW5pdGlhbGl6ZSB0aGUKLQl3aWR0aCB0byAyNTUgYW5kIHRoZW4gcHV0IGEgY2hlY2sgZm9yIGJlaW5nIGVxdWFsIHRvIDI1NSBpbiBzbm9kZQotCWNvbXBhcmUgZnVuY3Rpb24uCi0KLQkqIHNyYy9jYWNoZS9mdGNzYml0cy5jIChGVENfU05vZGVfTmV3KTogSW5pdGlhbGl6ZSBzYml0IHdpZHRocyB3aXRoCi0JdmFsdWUgMjU1LgotCShmdGNfc25vZGVfY29tcGFyZSk6IEZpeCBjb25kaXRpb24uCi0KLTIwMTAtMTItMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBwYXJhbWV0ZXIgaGFuZGxpbmcgb2YgYEZUX1NldF9SZW5kZXJlcicuCi0JUmVwb3J0ZWQgYnkgS2lyaWxsIFRpc2hpbiA8c2llZ2VAYmsucnU+LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfU2V0X1JlbmRlcmVyKTogSW5jcmVtZW50IGBwYXJhbWV0ZXJzJy4KLQotMjAxMC0xMi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gQWxsb3cgYGhsaW5ldG8nIGFuZCBgdmxpbmV0bycgd2l0aG91dCBhcmd1bWVudHMuCi0KLQlXZSBzaW1wbHkgaWdub3JlIHN1Y2ggaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyBpbnZhbGlkLCBidXQgaXQgZG9lc24ndAotCWhhcm07IGFuZCBpbmRlZWQsIHRoZXJlIGV4aXN0IHN1Y2ggc3Vic2V0dGVkIGZvbnRzIGluIFBERnMuCi0KLQlSZXBvcnRlZCBieSBBbGJlcnQgQXN0YWxzIENpZCA8YWFjaWRAa2RlLm9yZz4uCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpCi0JW2NmZl9vcF9obGluZXRvXTogSWdub3JlIGluc3RydWN0aW9uIGlmIHRoZXJlIGFyZW4ndCBhbnkgYXJndW1lbnRzCi0Jb24gdGhlIHN0YWNrLgotCi0yMDEwLTExLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi40LjQgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi00LTQnLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi40LjQKLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLAotCWJ1aWxkcy93aW4zMi92YzIwMDUvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsIGJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNC4zLzIuNC40Lywgcy8yNDMvMjQ0Ly4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byA0LgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTI6Mjo2LgotCi0yMDEwLTExLTI4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbZnRzbW9vdGhdOiBNaW5vciBjb2RlIHNpbXBsaWZpY2F0aW9uLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMgKGdyYXlfcmVuZGVyX2N1YmljKTogRG8gb25seSBvbmUgY29tcGFyaXNvbgotCWluc3RlYWQgb2YgdHdvLgotCi0yMDEwLTExLTI2ICBKb2huc29uIFkuIFlhbiAgPHlpbnNlbl95YW5AZm94aXRzb2Z0d2FyZS5jb20+Ci0KLQlbdHJ1ZXR5cGVdIEJldHRlciBtdWx0aS10aHJlYWRpbmcgc3VwcG9ydC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX0xvYWRfQ29udGV4dCk6IFJlc2V0IGdseXBoIHpvbmUKLQlyZWZlcmVuY2VzLgotCi0yMDEwLTExLTIzICBKb2huIFR5dGdhdCAgPEpvaG4uVHl0Z2F0QGVza28uY29tPgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nKTogRXhwYW5kCi0Jc3RhcnRfcG9pbnQsIGNoZWNrX3BvaW50cywgYWRkX3BvaW50LCBhZGRfcG9pbnQxLCBjbG9zZV9jb250b3VyCi0JbWFjcm9zLgotCVJlbW92ZSBhZGRfY29udG91ciBtYWNyby4KLQlSZXR1cm4gZXJyb3IgY29kZSBmcm9tIHQxX2J1aWxkZXJfc3RhcnRfcG9pbnQgYW5kCi0JdDFfYnVpbGRlcl9jaGVja19wb2ludHMgd2hlbiB0aGVyZSB3YXMgb25lIChpbnN0ZWFkIG9mIHJldHVybmluZyAwKS4KLQotMjAxMC0xMS0yMiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVt0cnVldHlwZV0gSWRlbnRpZnkgdGhlIHRyaWNreSBmb250cyBieSBjdnQvZnBnbS9wcmVwIGNoZWNrc3Vtcy4KLQlTb21lIExhdGluIFRydWVUeXBlIGZvbnRzIGFyZSBzdGlsbCBleHBlY3RlZCB0byBiZSB1bmhpbnRlZC4KLQlGaXggU2F2YW5uYWggYnVnICMzMTY0NS4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9jaGVja190cmlja3luZXNzKTogRGl2aWRlZCB0by4uLgotCSh0dF9jaGVja190cmlja3luZXNzX2ZhbWlseSk6IHRoaXMgY2hlY2tpbmcgZmFtaWx5IG5hbWUsIGFuZAotCSh0dF9jaGVja190cmlja3luZXNzX3NmbnRfaWRzKTogdGhpcyBjaGVja2luZyBjdnQvZnBnbS9wcmVwLgotCSh0dF9nZXRfc2ZudF9jaGVja3N1bSk6IEZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBzZm50IGNoZWNrc3VtCi0JZm9yIHNwZWNpZmllZCBzdWJ0YWJsZSBldmVuIGlmIGNsZWFyZWQgYnkgbGF6eSBQREYgZ2VuZXJhdG9ycy4KLQkodHRfc3ludGhfc2ZudF9jaGVja3N1bSk6IEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0uCi0KLTIwMTAtMTEtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IGBsb2NhJyBoYW5kbGluZyBmb3IgaW5jb25zaXN0ZW50IG51bWJlciBvZiBnbHlwaHMuCi0JUmVwb3J0ZWQgYnkgSm9obnNvbiBZLiBZYW4gPHlpbnNlbl95YW5AZm94aXRzb2Z0d2FyZS5jb20+LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2xvYWRfbG9jYSk6IFdoaWxlIHNhbml0aXppbmcsCi0JaGFuZGxlIGNhc2Ugd2hlcmUgYGxvY2EnIGlzIHRoZSBsYXN0IHRhYmxlIGluIHRoZSBmb250LgotCi0yMDEwLTExLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSWdub3JlIGFsbCBlcnJvcnMgd2hpbGUgbG9hZGluZyBgT1MvMicgdGFibGUuCi0JU3VnZ2VzdGVkIGJ5IEpvaG5zb24gWS4gWWFuIDx5aW5zZW5feWFuQGZveGl0c29mdHdhcmUuY29tPi4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogRG8gaXQuCi0KLTIwMTAtMTEtMTggIEpvaG5zb24gWS4gWWFuICA8eWluc2VuX3lhbkBmb3hpdHNvZnR3YXJlLmNvbT4KLQotCVt0eXBlMV0gRml4IG1hdHJpeCBub3JtYWxpemF0aW9uLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2ZvbnRfbWF0cml4KTogSGFuZGxlIHNpZ24gb2Ygc2NhbGluZwotCWZhY3Rvci4KLQotMjAxMC0xMS0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGUxXSBJbXByb3ZlIGd1YXJkIGFnYWluc3QgbWFsZm9ybWVkIGRhdGEuCi0JQmFzZWQgb24gYSBwYXRjaCBzdWJtaXR0ZWQgYnkgSm9obnNvbiBZLiBZYW4KLQk8eWluc2VuX3lhbkBmb3hpdHNvZnR3YXJlLmNvbT4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChyZWFkX2JpbmFyeV9kYXRhKTogQ2hlY2sgYHNpemUnLgotCi0yMDEwLTExLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gV2hpbGUgdHJhY2luZywgb3V0cHV0IHRhYmxlIGNoZWNrc3VtcyBhbHNvLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX2ZvbnRfZGlyKTogRG8gaXQuCi0KLTIwMTAtMTEtMDQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbVVZTXSBGaXggYGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwJywgU2F2YW5uYWggYnVnICMzMTU0NS4KLQotCVNpbmNlIDIwMTAtMDctMDQsIGBmaW5kX3ZhcmlhbnRfc2VsZWN0b3JfY2hhcm1hcCcgcmV0dXJucwotCXRoZSBmaXJzdCBjbWFwIHN1YnRhYmxlIGFsd2F5cyB1bmRlciByb2d1ZS1jb21wYXRpYmxlCi0JY29uZmlndXJhdGlvbiwgaXQgY2F1c2VzIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBhbmQKLQltYWtlIFVWUy1yZWxhdGVkIGZ1bmN0aW9ucyBjcmFzaGVkLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRml4IGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKToKLQlSZXR1cm5zIFVWUyBjbWFwIGNvcnJlY3RseS4KLQotMjAxMC0xMS0wMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Z0c21vb3RoXSBJbXByb3ZlIHJlbmRlcmluZy4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChncmF5X3JlbmRlcl9jb25pYyk6IFNpbmNlIHZlcnNpb24gMi40LjMsCi0JY3ViaWMgZGV2aWF0aW9ucyBoYXZlIGJlZW4gZXN0aW1hdGVkIF9hZnRlcl8gVVBTQ0FMRSwgd2hlcmVhcwotCWNvbmljIG9uZXMgaGF2ZSBiZWVuIGV2YWx1YXRlZCBfYmVmb3JlXyBVUFNDQUxFLCB3aGljaCBwcm9kdWNlcwotCWluZmVyaW9yIHJlbmRlcmluZyByZXN1bHRzLiAgRml4IHRoaXMuCi0JUGFydGlhbGx5IHVuZG8gY2hhbmdlIGZyb20gMjAxMC0xMC0xNSBieSB1c2luZyBPTkVfUElYRUwvNDsgdGhpcyBoYXMKLQliZWVuIHRlc3RlZCB3aXRoIGRlbW8gaW1hZ2VzIHNlbnQgdG8gdGhlIG1haWxpbmcgbGlzdC4gIFNlZQotCi0JICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMC0xMC9tc2cwMDA1NS5odG1sCi0KLQlhbmQgbGF0ZXIgbWFpbHMgaW4gdGhpcyB0aHJlYWQuCi0KLTIwMTAtMTAtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtmdHJhc3Rlcl0gTWlub3IgZml4ZXMuCi0KLQlSZXBvcnRlZCBieSBUb20gQmlzaG9wIDx3ZW5saW5Ad2VubGluLmNvbT4uCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoVUxvbmcpOiBSZW1vdmUgdW51c2VkIHR5cGVkZWYuCi0JKFRXb3JrZXIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBwcmVjaXNpb25fbWFzaycuCi0KLTIwMTAtMTAtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtmdHJhc3Rlcl0gRml4IHJlbmRlcmluZy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgVG9tIEJpc2hvcCA8d2VubGluQHdlbmxpbi5jb20+OyBzZWUKLQl0aHJlYWQgc3RhcnRpbmcgd2l0aAotCi0JICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUvMjAxMC0xMC9tc2cwMDA0OS5odG1sCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoTGluZV9VcCk6IFJlcGxhY2UgRk11bERpdiB3aXRoIFNNdWxEaXYKLQlzaW5jZSB0aGUgaW52b2x2ZWQgbXVsdGlwbGljYXRpb24gZXhjZWVkcyAzMiBiaXRzLgotCi0yMDEwLTEwLTI1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JUmV2ZXJ0IGEgY2hhbmdlIG9mIGBfaWR4JyB0eXBlIGluIGBGVENfQ0FDSEVfTE9PS1VQX0NNUCcuCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5oIChGVENfQ0FDSEVfTE9PS1VQX0NNUCk6IFJldmVydAotCXRoZSB0eXBlIG9mIGBfaWR4JyBmcm9tIEZUX1B0ckRpc3QgKGJ5IHByZXZpb3VzIGNoYW5nZSkKLQl0byBvcmlnaW5hbCBGVF9VRmFzdCwgdG8gbWF0Y2ggd2l0aCBGVF9DYWNoZVJlYy4KLQotMjAxMC0xMC0yNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtjYWNoZV0gQ2hhbmdlIHRoZSBoYXNoIHR5cGVzIHRvIEZUX1B0ckRpc3QuCi0KLQlPbiBMTFA2NCBwbGF0Zm9ybXMgKGUuZy4gV2luNjQpLCBGVF9VTG9uZyAoMzItYml0KQotCXZhcmlhYmxlcyBhcmUgaW5hcHByb3ByaWF0ZSB0byBjYWxjdWxhdGUgaGFzaCB2YWx1ZXMKLQlmcm9tIHRoZSBtZW1vcnkgYWRkcmVzcyAoNjQtYml0KS4gIFRoZSBoYXNoIHZhcmlhYmxlcwotCWFyZSBleHRlbmRlZCBmcm9tIEZUX1VMb25nIHRvIEZUX1B0ckRpc3QgYW5kIG5ldwotCWhhc2hpbmcgbWFjcm8gZnVuY3Rpb25zIGFyZSBpbnRyb2R1Y2VkLiAgVGhlIGhhc2gKLQl2YWx1ZXMgb24gMTYtYml0IG1lbW9yeSBwbGF0Zm9ybXMgYXJlIGNoYW5nZWQsIGJ1dAotCUlMUDMyIGFuZCBMUDY0IGFyZSBub3QgY2hhbmdlZC4gIFRoZSBoYXNoIHZhbHVlIGluCi0JdGhlIGNhY2hlIHN1YnN5c3RlbSBpcyBub3QgcmV2ZXJ0ZWQgdG8gdGhlIG1lbW9yeQotCWFkZHJlc3MsIHNvIHVzaW5nIHNpZ25lZCB0eXBlIEZUX1B0ckRpc3QgaXMgc2FmZS4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmggKF9GVENfRkFDRV9JRF9IQVNIKTogTmV3IGhhc2gKLQlmdW5jdGlvbiB0byByZXBsYWNlIGBGVENfRkFDRV9JRF9IQVNIJyBmb3IgcG9ydGFiaWxpdHkuCi0JKiBzcmMvY2FjaGUvZnRjbWFuYWcuaCAoRlRDX1NDQUxFUl9IQVNIKTogUmVwbGFjZQotCWBGVENfRkFDRV9JRF9IQVNIJyBieSBgX0ZUQ19GQUNFX0lEX0hBU0gnLgotCSogc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoRlRDX0NNQVBfSEFTSCk6IERpdHRvLgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuaCAoRlRDX05vZGVSZWMpOiBUaGUgdHlwZSBvZiB0aGUKLQltZW1iZXIgYGhhc2gnIGlzIGNoYW5nZWQgZnJvbSBGVF9VSW50MzIgdG8gRlRfUHRyRGlzdC4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmggKEZUQ19DYWNoZV9Mb29rdXApOiBUaGUgdHlwZSBvZiB0aGUKLQlhcmd1bWVudCBgaGFzaCcgaXMgY2hhbmdlZCBmcm9tIEZUX1VJbnQzMiB0byBGVF9QdHJEaXN0LgotCShGVENfQ2FjaGVfTmV3Tm9kZSk6IERpdHRvLgotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmMgKGZ0Y19jYWNoZV9hZGQpOiBEaXR0by4KLQkoRlRDX0NhY2hlX0xvb2t1cCk6IERpdHRvLiAgKEZUQ19DYWNoZV9OZXdOb2RlKTogRGl0dG8uCi0JKiBzcmMvY2FjaGUvZnRjZ2x5cGguaCAoRlRDX0dDYWNoZV9Mb29rdXApOiBEaXR0by4KLQkqIHNyYy9jYWNoZS9mdGNnbHlwaC5jIChGVENfR0NhY2hlX0xvb2t1cCk6IERpdHRvLgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYyAoRlRDX0ltYWdlQ2FjaGVfTG9va3VwKTogVGhlIHR5cGUKLQlvZiB0aGUgaW50ZXJuYWwgdmFyaWFibGUgYGhhc2gnIGlzIGNoYW5nZWQgdG8gRlRfUHRyRGlzdAotCWZyb20gRlRfVUludDMyLiAgKEZUQ19JbWFnZUNhY2hlX0xvb2t1cFNjYWxlcik6IERpdHRvLgotCShGVENfU0JpdENhY2hlX0xvb2t1cCk6IERpdHRvLgotCShGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlcik6IERpdHRvLgotCSogc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoRlRDX0NNYXBDYWNoZV9Mb29rdXApOiBEaXR0by4KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5oIChGVENfQ0FDSEVfTE9PS1VQX0NNUCk6IERpdHRvLgotCUFsc28gdGhlIHR5cGUgb2YgdGhlIGludGVybmFsIHZhcmlhYmxlIGBfaWR4JyBpcyBjaGFuZ2VkIHRvCi0JRlRfUHRyRGlzdCBmcm9tIEZUX1VGYXN0IGZvciBiZXR0ZXIgcG9pbnRlciBjYWxjdWxhdGlvbi4KLQotMjAxMC0xMC0yNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtjYWNoZV0gSGlkZSBpbnRlcm5hbCBtYWNyb3MgaW5jb21wYXRpYmxlIHdpdGggTExQNjQuCi0KLQlgRlRfUE9JTlRFUl9UT19VTE9ORycsIGBGVENfRkFDRV9JRF9IQVNIJywgYW5kCi0JYEZUQ19JTUFHRV9UWVBFX0hBU0gnIGFyZSBlbmNsb3NlZCBieQotCUZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyBhbmQgaGlkZGVuIGZyb20KLQlub3JtYWwgY2xpZW50cy4KLQotCUZvciB0aGUgaGlzdG9yeSBvZiB0aGVzZSBtYWNyb3MsIHNlZSB0aGUgaW52ZXN0aWdhdGlvbjoKLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUvMjAxMC0xMC9tc2cwMDAyMi5odG1sCi0KLTIwMTAtMTAtMjQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlDaGFuZ2UgdGhlIHR5cGUgb2YgYEZUX01FTV9WQUwnIGZyb20gRlRfVUxvbmcgdG8gRlRfUHRyRGlzdC4KLQotCU9uIExMUDY0IHBsYXRmb3JtcyAoZS5nLiBXaW42NCksIHVuc2lnbmVkIGxvbmcgKDMyLWJpdCkKLQljYW5ub3QgY292ZXIgdGhlIG1lbW9yeSBhZGRyZXNzICg2NC1iaXQpLiAgYEZUX01FTV9WQUwnIGlzCi0JdXNlZCBmb3IgaGFzaGluZyBvbmx5IGFuZCBub3QgZGVyZWZlcnJlZCwgc28gdXNpbmcgc2lnbmVkCi0JdHlwZSBGVF9QdHJEaXN0IGlzIHNhZmUuCi0KLQkqIHNyYy9iYXNlL2Z0ZGJnbWVtLmMgKEZUX01FTV9WQUwpOiBDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlCi0JcmV0dXJuIHZhbHVlIGZyb20gRlRfVUxvbmcgdG8gRlRfUHRyRGlzdC4KLQkoZnRfbWVtX3RhYmxlX3Jlc2l6ZSk6IFRoZSB0eXBlIG9mIGhhc2ggaXMgY2hhbmdlZCB0bwotCUZUX1B0ckRpc3QuICAoZnRfbWVtX3RhYmxlX2dldF9ub2RlcCk6IERpdHRvLgotCi0yMDEwLTEwLTI0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JUmVwbGFjZSAiJWx4IiBmb3IgbWVtb3J5IGFkZHJlc3MgYnkgIiVwIiwgTExQNjQgcGxhdGZvcm1zLgotCi0JT24gTExQNjQgcGxhdGZvcm1zIChlLmcuIFdpbjY0KSwgbG9uZyAoMzItYml0KSBjYW5ub3QgY292ZXIKLQl0aGUgbWVtb3J5IGFkZHJlc3MgKDY0LWJpdCkuICBBbHNvIHRoZSBjYXN0cyBmcm9tIHRoZSBwb2ludGVyCi0JdHlwZSB0byBsb25nIGludCBzaG91bGQgYmUgcmVtb3ZlZCB0byBwcmVzZXJ2ZSB0aGUgYWRkcmVzcwotCWNvcnJlY3RseS4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChOZXdfUHJvZmlsZSk6IFJlcGxhY2UgIiVseCIgYnkgIiVwIi4KLQkoRW5kX1Byb2ZpbGUpIERpdHRvLgotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluaXRfQ29udGV4dCk6IERpdHRvLgotCi0yMDEwLTEwLTE1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlGaXggdGhpbmtvIGluIHNwbGluZSBmbGF0dGVuaW5nLgotCi0JRlRfTUFYX0NVUlZFX0RFVklBVElPTiBpcyBkZXBlbmRlbnQgb24gdGhlIHZhbHVlIG9mIE9ORV9QSVhFTC4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKEZUX01BWF9DVVJWRV9ERVZJQVRJT04pOiBSZW1vdmUgaXQgYW5kCi0JcmVwbGFjZSBpdCBldmVyeXdoZXJlIHdpdGggT05FX1BJWEVMLzguCi0KLTIwMTAtMTAtMTMgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbcmFjY2Vzc10gU2tpcCB1bnJlcXVpcmVkIHJlc291cmNlIGFjY2VzcyBydWxlcyBieSBEYXJ3aW4gVkZTLgotCi0JV2hlbiBhIHJlc291cmNlIGZvcmsgYWNjZXNzIHJ1bGUgYnkgRGFyd2luIFZGUyBjb3VsZCBvcGVuIHRoZQotCXJlc291cmNlIGZvcmsgYnV0IG5vIGZvbnQgaXMgZm91bmQgaW4gaXQsIHRoZSByZXN0IG9mIHJ1bGVzCi0JYnkgRGFyd2luIFZGUyBhcmUgc2tpcHBlZC4gIEl0IHJlZHVjZXMgdGhlIHdhcm5pbmdzIG9mIHRoZQotCWRlcHJlY2F0ZWQgcmVzb3VyY2UgZm9yayBhY2Nlc3MgbWV0aG9kIGJ5IHJlY2VudCBEYXJ3aW4ga2VybmVsLgotCUZpeCBNYWNQb3J0cyB0aWNrZXQgIzE4ODU5OgotCQlodHRwOi8vdHJhYy5tYWNwb3J0cy5vcmcvdGlja2V0LzE4ODU5Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChsb2FkX2ZhY2VfaW5fZW1iZWRkZWRfcmZvcmspOgotCVdoZW4gYEZUX1N0cmVhbV9OZXcnIHJldHVybnMgRlRfRXJyX0Nhbm5vdF9PcGVuX1N0cmVhbSwgaXQKLQltZWFucyB0aGF0IHRoZSBmaWxlIGlzIHBvc3NpYmxlIHRvIGJlIGBmb3BlbictZWQgYnV0IHplcm8tc2l6ZWQuCi0JQWxzbyB0aGVyZSBpcyBhIGNhc2UgdGhhdCB0aGUgcmVzb3VyY2UgZm9yayBpcyBub3QgemVyby1zaXplZCwKLQlidXQgbm8gc3VwcG9ydGVkIGZvbnQgZXhpc3RzIGluIGl0LiAgSWYgYSBydWxlIGJ5IERhcndpbiBWRlMKLQlmYWxscyBpbnRvIHN1Y2ggY2FzZXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdHJ5IG90aGVyIERhcndpbiBWRlMKLQlydWxlcyBhbnltb3JlLiAgU3VjaCBjYXNlcyBhcmUgbWFya2VkIGJ5IHZmc19yZm9ya19oYXNfbm9fZm9udC4KLQlJZiBpdCBpcyBUUlVFLCB0aGUgRGFyd2luIFZGUyBydWxlcyBhcmUgc2tpcHBlZC4KLQotMjAxMC0xMC0xMyAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtyYWNjZXNzXSBHcm91cGluZyByZXNvdXJjZSBhY2Nlc3MgcnVsZXMgYmFzZWQgb24gRGFyd2luIFZGUy4KLQotCU1hY09TIFgvRGFyd2luIGtlcm5lbCBzdXBwb3J0cyBhIGZldyB0cmlja3kgbWV0aG9kcyB0byBhY2Nlc3MKLQlhIHJlc291cmNlIGZvcmsgdmlhIEFOU0kgQyBvciBQT1NJWCBpbnRlcmZhY2UuICBDdXJyZW50IHJlc291cmNlCi0JZm9yayBhY2Nlc3NvciB0cmllcyBhbGwgcG9zc2libGUgbWV0aG9kcyB0byBzdXBwb3J0IGFsbCBrZXJuZWxzLgotCUJ1dCBpZiBhIG1ldGhvZCBjb3VsZCBvcGVuIGEgcmVzb3VyY2UgZm9yayBidXQgbm8gZm9udCBpcyBmb3VuZCwKLQl0aGVyZSBpcyBubyBuZWVkIHRvIHRyeSBvdGhlciBtZXRob2RzIG9sZGVyIHRoYW4gdGVzdGVkIG1ldGhvZC4KLQlUbyBkZXRlcm1pbmUgd2hldGhlciB0aGUgcnVsZSBpbmRleCBpcyBmb3IgRGFyd2luIFZGUywgYSBsb2NhbAotCWZ1bmN0aW9uIGBmdHJmb3JrLmM6OnJhY2Nlc3NfcnVsZV9ieV9kYXJ3aW5fdmZzJyBpcyBpbnRyb2R1Y2VkLgotCVRvIHVzZSB0aGlzIGZ1bmN0aW9uIGluIGZ0b2Jqcy5jIGV0YyBidXQgaXQgc2hvdWxkIGJlIGlubGluZWQsCi0JaXQgaXMgZXhwb3NlZCBieSBmdGJhc2UuaC4KLQotCSogc3JjL2Jhc2UvZnRyZm9yay5jIChGVF9SRm9ya19SdWxlKTogTmV3IGVudW0gdHlwZSB0byBpZGVudGlmeQotCXRoZSBydWxlcyB0byBhY2Nlc3MgdGhlIHJlc291cmNlIGZvcmsuCi0JKHJhY2Nlc3NfZ3Vlc3NfcmVjKTogTmV3IHN0cnVjdHVyZSB0byBiaW5kIHRoZSBydWxlIGZ1bmN0aW9uIGFuZAotCXJ1bGUgZW51bSB0eXBlLgotCShGVF9SYWNjZXNzX0d1ZXNzKTogVGhlIGxpc3Qgb2YgdGhlIHJ1bGUgZnVuY3Rpb25zIGlzIHJlcGxhY2VkIGJ5Ci0JKHJhY2Nlc3NfZ3Vlc3NfdGFibGUpOiBUaGlzLiAgVGhpcyBpcyBleHBvc2VkIHRvIGJlIHVzZWQgYnkgb3RoZXIKLQlpbnRyYSBtb2R1bGUgZnVuY3Rpb25zLgotCShyYWNjZXNzX3J1bGVfYnlfZGFyd2luX3Zmcyk6IEEgZnVuY3Rpb24gdG8gcmV0dXJuIGEgYm9vbGVhbgotCWlmIHRoZSBydWxlIHNwZWNpZmllZCBieSB0aGUgcnVsZSBpbmRleCBpcyBiYXNlZCBvbiBEYXJ3aW4gVkZTLgotCi0yMDEwLTEwLTEzICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JUHJldmVudCB0byBvcGVuIGEgRlRfU3RyZWFtIGZvciB6ZXJvLXNpemVkIGZpbGUgb24gbm9uLVVuaXguCi0KLQlidWlsZHMvdW5peC9mdHN5c3RlbS5jIHByZXZlbnRzIHRvIG9wZW4gYW4gdXNlbGVzcyBzdHJlYW0gZnJvbQotCXplcm8tc2l6ZWQgZmlsZSBhbmQgcmV0dXJucyBGVF9FcnJfQ2Fubm90X09wZW5fU3RyZWFtLCBidXQgdGhlCi0Jc3RyZWFtIGRyaXZlcnMgZm9yIEFOU0kgQywgQW1pZ2EgYW5kIFZNUyByZXR1cm4gdXNlbGVzcyBzdHJlYW1zLgotCUZvciBjcm9zcy1wbGF0Zm9ybSBjb25zaXN0ZW5jeSwgYWxsIHN0cmVhbSBkcml2ZXJzIHNob3VsZCBhY3QKLQlzYW1lLgotCi0JKiBzcmMvYmFzZS9mdHN5c3RlbS5jIChGVF9TdHJlYW1fT3Blbik6IElmIHRoZSBzaXplIG9mIHRoZSBvcGVuZWQKLQlmaWxlIGlzIHplcm8sIEZUX0Vycl9DYW5ub3RfT3Blbl9TdHJlYW0gaXMgcmV0dXJuZWQuCi0JKiBidWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRzeXN0ZW0uYyAoRlRfU3RyZWFtX09wZW4pOiBEaXR0by4KLQkqIHNyYy92bXMvZnRzeXN0ZW0uYyAoRlRfU3RyZWFtX09wZW4pOiBEaXR0by4KLQotMjAxMC0xMC0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggU2F2YW5uYWggYnVnICMzMTMxMC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMpOiBQcm90ZWN0IGFnYWluc3QKLQlpbnZhbGlkIGBydW5jbnQnIHZhbHVlcy4KLQotMjAxMC0xMC0wOCAgQ2hyaXMgTGlkZGVsbCAgPGNocmlzLmxpZGRlbGxAYXJ0aWZleC5jb20+Ci0KLQlbc2ZudF0gRml4IFNhdmFubmFoIGJ1ZyAjMzEyNzUuCi0KLQkqIHNyYy9zZm50L3R0cG9zdC5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0guCi0KLTIwMTAtMTAtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gSW1wcm92ZSBlcnJvciBoYW5kbGluZyBvZiBgU0haJyBieXRlY29kZSBpbnN0cnVjdGlvbi4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IENocmlzIEV2YW5zIDxzY2FyeWJlYXN0c0BnbWFpbC5jb20+LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX1NIWik6IENoZWNrIGBsYXN0X3BvaW50Jy4KLQotMjAxMC0xMC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzEyNTMuCi0JUGF0Y2ggc3VibWl0dGVkIGJ5IGFuIGFub255bW91cyByZXBvcnRlci4KLQotCSogY29uZmlndXJlOiBVc2UgYGF3aycgaW5zdGVhZCBvZiBgc2VkJyB0byBtYW5pcHVsYXRlIG91dHB1dCBvZiBgbHMKLQktaWQnLgotCi0yMDEwLTEwLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi40LjMgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi00LTMnLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi40LjMKLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLAotCWJ1aWxkcy93aW4zMi92YzIwMDUvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsIGJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNC4yLzIuNC4zLywgcy8yNDIvMjQzLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAzLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTI6MTo2LgotCi0yMDEwLTEwLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBdm9pZCBgY29uZmlndXJlJyBpc3N1ZXMgd2l0aCBzeW1ib2xpYyBsaW5rcy4KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gQWxleGFuZGVyIFN0b2hyIDxBbGV4YW5kZXIuU3RvaHJAZ214LmRlPi4KLQotCSogY29uZmlndXJlOiBDb21wYXJlIGRpcmVjdG9yaWVzIHVzaW5nIGBscyAtaWQnLgotCUNoZWNrIGV4aXN0ZW5jZSBvZiBgcmVmZXJlbmNlJyBzdWJkaXJlY3RvcnkgYmVmb3JlIGNyZWF0aW5nIGl0LgotCi0yMDEwLTEwLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IFNhdmFubmFoIGJ1ZyAjMzEwODggKHNvcnQgb2YpLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX21heHApOiBBbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgNjQKLQlmdW5jdGlvbiBlbnRyaWVzLgotCi0yMDEwLTEwLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc21vb3RoXSBGaXggc3BsaXR0aW5nIG9mIGN1YmljcyBmb3IgbmVnYXRpdmUgdmFsdWVzLgotCi0JUmVwb3J0ZWQgYnkgUsOzYmVydCBNw6Fya2kgPGdzbWlrb0BnbWFpbC5jb20+OyBzZWUKLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUvMjAxMC0wOS9tc2cwMDAxOS5odG1sLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfY3ViaWMpOiBGaXggdGhpbmtvLgotCi0yMDEwLTEwLTAxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW3RydWV0eXBlXSBGaXggU2F2YW5uYWggYnVnICMzMTA0MC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKGZyZWVfYnVmZmVyX2luX3NpemUpOiBSZW1vdmUuCi0JKFRUX1J1bklucyk6IFVwZGF0ZWQuCi0KLTIwMTAtMDktMjAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbc2ZudF0gTWFrZSBlcnJvciBtZXNzYWdlIGZpbGxpbmcgTlVMTCBuYW1lcyBsZXNzIHZlcmJvc2UuCi0KLQkqIHNyYy9zZm50L3R0cG9zdC5jIChsb2FkX2Zvcm1hdF8yMCk6IFNob3dpbmcgMSBzdW1tYXJ5IG1lc3NhZ2UKLQl3aGVuIHdlIGZpbGwgYHBvc3QnIG5hbWVzIGJ5IE5VTEwsIGluc3RlYWQgb2YgcGVyLWVudHJ5IG1lc3NhZ2UuCi0KLTIwMTAtMDktMjAgIEdyYWhhbSBBc2hlciAgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4KLQkgICAgRGF2aWQgQmV2YW4gIDxkYXZpZC5iZXZhbkBwYi5jb20+Ci0KLQlbc21vb3RoXSBGaXggYW5kIGltcHJvdmUgc3BsaW5lIGZsYXR0ZW5pbmcuCi0KLQlUaGlzIGZpeGVzIHRoZSBmbGF0dGVuaW5nIG9mIGN1YmljLCBTLXNoYXBlZCBjdXJ2ZXMgYW5kIHNwZWVkcyB1cAotCXRoZSBoYW5kbGluZyBvZiBib3RoIHRoZSBjb25pYyBhbmQgY3ViaWMgYXJjcy4KLQotCVNlZSB0aGUgZGlzY3Vzc2lvbnMgb24gdGhlIGZyZWV0eXBlLWRldmVsIG1haWxpbmcgbGlzdCBpbiBsYXRlCi0JQXVndXN0IGFuZCBTZXB0ZW1iZXIgMjAxMCBmb3IgZGV0YWlscy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKEZUX01BWF9DVVJWRV9ERVZJQVRJT04pOiBOZXcgbWFjcm8uCi0JKFRXb3JrZXIpOiBSZW1vdmUgYGNvbmljX2xldmVsJyBhbmQgYGN1YmljX2xldmVsJyBlbGVtZW50cy4KLQkoZ3JheV9yZW5kZXJfY29uaWMpOiBTaW1wbGlmeSBhbGdvcml0aG0uCi0JKGdyYXlfcmVuZGVyX2N1YmljKTogTmV3IGFsZ29yaXRobTsgZGV0YWlscyBhcmUgZ2l2ZW4gaW4gdGhlIGNvZGUKLQljb21tZW50cy4KLQkoZ3JheV9jb252ZXJ0X2dseXBoKTogUmVtb3ZlIGhldXJpc3RpY3MuCi0KLTIwMTAtMDktMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1pbm9yIGZpeGVzLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2NoYXJzZXRfY29tcHV0ZV9jaWRzKTogYGNoYXJzZXQtPnNpZHNbaV0nCi0JaXMgYEZUX1VTaG9ydCcuCi0JKGNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudCk6IERvbid0IHVzZSBhZGRpdGlvbnMgaW4gY29tcGFyaXNvbi4KLQkqIHNyYy9zZm50L3R0cG9zdC5jIChsb2FkX2Zvcm1hdF8yMCk6IE1ha2UgYHBvc3RfbGltaXQnIG9mIHR5cGUKLQlgRlRfTG9uZycuCi0JRG9uJ3QgdXNlIGFkZGl0aW9ucyBpbiBjb21wYXJpc29uLgotCUltcHJvdmUgdHJhY2luZyBtZXNzYWdlcy4KLQkobG9hZF9mb3JtYXRfMjUsIGxvYWRfcG9zdF9uYW1lcyk6IE1ha2UgYHBvc3RfbGltaXQnIG9mIHR5cGUKLQlgRlRfTG9uZycuCi0KLTIwMTAtMDktMTkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbY2ZmXSBUcnVuY2F0ZSB0aGUgZWxlbWVudCBsZW5ndGggYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgotCVNlZSBTYXZhbm5haCBidWcgIzMwOTc1LgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50KTogYG9mZjInLCB0aGUgb2Zmc2V0Ci0JdG8gdGhlIG5leHQgZWxlbWVudCBpcyB0cnVuY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHRvIHByZXZlbnQKLQlpbnZhbGlkIEkvTy4gIEFzIGBvZmYxJywgdGhlIG9mZnNldCB0byB0aGUgcmVxdWVzdGVkIGVsZW1lbnQgaGFzCi0JYmVlbiBjaGVja2VkIGJ5IGBGVF9TVFJFQU1fU0VFSycsIGBvZmYyJyBzaG91bGQgYmUgY2hlY2tlZAotCXNpbWlsYXJseS4KLQotMjAxMC0wOS0xOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtjZmZdIElnbm9yZSBDSUQgPiAweEZGRkZVLgotCVNlZSBTYXZhbm5haCBidWcgIzMwOTc1LgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2NoYXJzZXRfY29tcHV0ZV9jaWRzKTogSWdub3JlIENJRCBpZgotCWdyZWF0ZXIgdGhhbiAweEZGRkZVLiAgQ0ZGIGZvbnQgc3BlYyBkb2VzIG5vdCBtZW50aW9uIG1heGltdW0gQ0lEIGluCi0JdGhlIGZvbnQsIGJ1dCBQb3N0U2NyaXB0IGFuZCBQREYgc3BlYyBkZWZpbmUgdGhhdCBtYXhpbXVtIENJRCBpcwotCTB4RkZGRlUuCi0KLTIwMTAtMDktMTkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbY2ZmXSBNYWtlIHRyYWNlIG1lc3NhZ2UgaW5gIGNmZl9jaGFyc2V0X2xvYWQnIHZlcmJvc2UuCi0JU2VlIFNhdmFubmFoIGJ1ZyAjMzA5NzUuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfY2hhcnNldF9sb2FkKTogUmVwb3J0IHRoZSBvcmlnaW5hbCBgbmxlZnQnCi0JYW5kIHRydW5jYXRlZCBgbmxlZnQnLgotCi0yMDEwLTA5LTE5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2NmZl0gQ29ycmVjdCBgbWF4X2NpZCcgZnJvbSBDSUQgYXJyYXkgbGVuZ3RoIHRvIG1heCBDSUQuCi0JU2VlIFNhdmFubmFoIGJ1ZyAjMzA5NzUuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfY2hhcnNldF9jb21wdXRlX2NpZHMpOiBEb24ndCBpbmNyZW1lbnQKLQltYXhfY2lkIGFmdGVyIGRldGVjdGluZyBtYXggQ0lELiAgVGhlIGFycmF5IENGRl9DaGFyc2V0LT5jaWRzIGlzCi0JYWxsb2NhdGVkIGJ5IG1heF9jaWQgKyAxLgotCShjZmZfY2hhcnNldF9jaWRfdG9fZ2luZGV4KTogUGVybWl0IENJRCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KLQlDRkZfQ2hhcnNldC0+bWF4X2NpZC4KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogRlRfRmFjZS0+bnVtX2dseXBocyBpcwotCWNhbGN1bGF0ZWQgYXMgQ0ZGX0NoYXJzZXQtPm1heF9jaWQgKyAxLgotCi0yMDEwLTA5LTE5ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW3RydWV0eXBlXSBTYW5pdGl6ZSB0aGUgYnJva2VuIG9mZnNldHMgaW4gYGxvY2EnLgotCVNlZSBTYXZhbm5haCBidWcgIzMxMDQwLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2dldF9sb2NhdGlvbik6IElmIGBwb3MxJywgdGhlCi0Jb2Zmc2V0IHRvIHRoZSByZXF1ZXN0ZWQgZW50cnkgaW4gYGdseWYnIGV4Y2VlZHMgdGhlIGVuZCBvZiB0aGUKLQl0YWJsZSwgcmV0dXJuIG9mZnNldD0wLCBsZW5ndGg9MC4gIElmIGBwb3MyJywgdGhlIG9mZnNldCB0byB0aGUgbmV4dAotCWVudHJ5IGluIGBnbHlmJyBleGNlZWRzIHRoZSBlbmQgb2YgdGhlIHRhYmxlLCB0cnVuY2F0ZSB0aGUgZW50cnkKLQlsZW5ndGggYXQgdGhlIGVuZCBvZiBgZ2x5ZicgdGFibGUuCi0KLTIwMTAtMDktMTkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbc2ZudF0gUHJldmVudCBvdmVycnVubmluZyBpbiBgcG9zdCcgdGFibGUgcGFyc2VyLgotCVNlZSBTYXZhbm5haCBidWcgIzMxMDQwLgotCi0JKiBzcmMvc2ZudC90dHBvc3QuYyAobG9hZF9wb3N0X25hbWVzKTogR2V0IHRoZSBsZW5ndGggb2YgYHBvc3QnCi0JdGFibGUgYW5kIHBhc3MgdGhlIGxpbWl0IG9mIGBwb3N0JyB0YWJsZSB0byBgbG9hZF9mb3JtYXRfMjAnIGFuZAotCWBsb2FkX2Zvcm1hdF8yNScuCi0JKGxvYWRfZm9ybWF0XzIwKTogU3RvcCB0aGUgcGFyc2luZyB3aGVuIHdlIHJlYWNoZWQgYXQgdGhlIGxpbWl0IG9mCi0JYHBvc3QnIHRhYmxlLiAgSWYgbW9yZSBnbHlwaCBuYW1lcyBhcmUgcmVxdWlyZWQsIHRoZXkgYXJlIGZpbGxlZCBieQotCU5VTEwgbmFtZXMuCi0KLTIwMTAtMDktMTcgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbdHJ1ZXR5cGVdIERvbid0IGR1cGxpY2F0ZSBzaXplLT50d2lsaWdodCBzdHJ1Y3R1cmUgdG8gYmUgZnJlZWQuCi0JU2VlIFNhdmFubmFoIGJ1ZyAjMzEwNDAgZm9yIGRldGFpbC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKGZyZWVfYnVmZmVyX2luX3NpemUpOiBEb24ndCBkdXBsaWNhdGUKLQlGVF9HbHlwaFpvbmVSZWMgc2l6ZS0+dHdpbGlnaHQgdG8gYmUgZnJlZWQuICBJZiBkdXBsaWNhdGVkLAotCWBGVF9GUkVFJyBlcmFzZXMgdGhlIGR1cGxpY2F0ZWQgcG9pbnRlcnMgb25seSBhbmQgbGVhdmUgb3JpZ2luYWwKLQlwb2ludGVycy4gIFRoZXkgY2FuIGNhdXNlIHRoZSBkb3VibGUtZnJlZSBjcmFzaCB3aGVuIHRoZSBidXJzdAotCWVycm9ycyBvY2N1ciBpbiBUcnVlVHlwZSBpbnRlcnByZXRlciBhbmQgYGZyZWVfYnVmZmVyX2luX3NpemUnIGlzCi0JaW52b2tlZCByZXBlYXRlZGx5LgotCi0yMDEwLTA5LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNYWtlIGJ5dGVjb2RlIGRlYnVnZ2luZyB3aXRoIEZvbnRGb3JnZSB3b3JrIGFnYWluLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogRG9uJ3QgY2FsbAotCWBmcmVlX2J1ZmZlcl9pbl9zaXplJyBpbiBjYXNlIG9mIGVycm9yIGlmIGEgZGVidWdnZXIgaXMgYWN0aXZlLgotCi0yMDEwLTA5LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlJbXByb3ZlIHRyYWNpbmcgbWVzc2FnZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9SdW5JbnMpOiBJbXByb3ZlIHdvcmRpbmcgb2YgdHJhY2luZwotCW1lc3NhZ2UuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcnVuX2ZwZ20sIHR0X3NpemVfcnVuX3ByZXApOiBBZGQKLQl0cmFjaW5nIG1lc3NhZ2UuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jICh0dF9sb2FkZXJfaW5pdCk6IEFkZCB0cmFjaW5nIG1lc3NhZ2UuCi0JKiBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3Nub2RlX2xvYWQpOiBFbWl0IHRyYWNpbmcgbWVzc2FnZSBpZgotCWdseXBoIGRvZXNuJ3QgZml0IGludG8gYSBzbWFsbCBiaXRtYXAgY29udGFpbmVyLgotCi0yMDEwLTA5LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggbWlub3IgaXNzdWVzIHJlcG9ydGVkIGJ5IDxtdWt0aGEubmFyYXlhbkB3aXByby5jb20+LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2NvbXB1dGVfc3RlbV93aWR0aCk6IFJlbW92ZQotCXJlZHVuZGFudCBjb25kaXRpb25hbCBjaGVjay4KLQkqIHNyYy9iYXNlL2Z0c3ludGguYyAoRlRfR2x5cGhTbG90X0VtYm9sZGVuKTogRGl0dG8uCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2VuY29kaW5nX2xvYWQpOiBSZW1vdmUgY29uZGl0aW9uYWwgY2hlY2sKLQl3aGljaCBhbHdheXMgZXZhbHVhdGVzIHRvIGB0cnVlJy4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmMgKHBzX2dseXBoX2ludGVycG9sYXRlX3N0cm9uZ19wb2ludHMpOgotCURpdHRvLgotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JVVApOiBEaXR0by4KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX3Nsb3RfbG9hZF9nbHlwaCk6IERvbid0IGNoZWNrIGZvciBOVUxMIGlmCi0JdmFsdWUgaXMgYWxyZWFkeSBkZXJlZmVyZW5jZWQuCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9Mb2FkX0dseXBoKTogRml4IGNoZWNrIG9mIGBmYWNlJy4KLQotMjAxMC0wOC0zMSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUlnbm9yZSB0aGUgZW52aXJvbm1lbnRhbCBzZXR0aW5nIG9mIExJQlRPT0wuCi0JUGF0Y2ggaXMgc3VnZ2VzdGVkIGJ5IEFkcmlhbiBCdW5rLCB0byBwcmV2ZW50IHVuZXhwZWN0ZWQKLQlyZWZsZWN0aW9uIG9mIGVudmlyb25tZW50YWwgTElCVE9PTC4gIFNlZToKLQlodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wYXRjaC8/NzI5MAotCi0JKiBidWlsZHMvdW5peC91bml4LWNjLmluOiBMSUJUT09MIGlzIHVuY29uZGl0aW9uYWxseSBzZXQgdG8KLQkkKEZUX0xJQlRPT0xfRElSKS9saWJ0b29sLiAgRlRfTElCVE9PTF9ESVIgaXMgc2V0IHRvICQoQlVJTERfRElSKQotCWJ5IGRlZmF1bHQuCi0JKiBjb25maWd1cmU6IFdoZW4gY29uZmlndXJlZCBmb3IgdGhlIGJ1aWxkaW5nIG91dCBvZiBzb3VyY2UgdGVlLAotCUZUX0xJQlRPT0xfRElSIGlzIHNldCB0byAkKE9CSl9ESVIpLgotCi0yMDEwLTA4LTMxICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW3RydWV0eXBlXSBEZWNyZWFzZSB0aGUgdHJhY2UgbGV2ZWwgY2F0Y2hpbmcgdGhlIGludGVycHJldGVyIGVycm9yLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogRGVjcmVhc2UgdGhlIHRyYWNlIGxldmVsCi0Jc2hvd2luZyB0aGUgZXJyb3Igd2hlbiB0aGUgaW50ZXJwcmV0ZXIgcmV0dXJucyB3aXRoIGFuIGVycm9yLAotCWZyb21gIEZUX1RSQUNFNycgdG8gYEZUX1RSQUNFMScuCi0KLTIwMTAtMDgtMzAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbdHJ1ZXR5cGVdIFByZXZlbnQgYnl0ZWNvZGUgcmV1c2UgYWZ0ZXIgdGhlIGludGVycHJldGF0aW9uIGVycm9yLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoZnJlZV9idWZmZXJfaW5fc2l6ZSk6IE5ldyBmdW5jdGlvbiB0bwotCWZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgZHVyaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGdseXBoLgotCShUVF9SdW5JbnMpOiBVbnNldCBGVF9GYWNlLT5zaXplLT57Y3Z0X3JlYWR5LGJ5dGVjb2RlX3JlYWR5fSBpZgotCWFuIGVycm9yIG9jY3VycyBpbiB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24uICBUaGUgaW50ZXJwcmV0YXRpb24KLQlvZiBpbnZhbGlkIGJ5dGVjb2RlIG1heSBicmVhayB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIHJlZmVycmluZwotCXRoZW0gaW4gbGF0ZXIgaW50ZXJwcmV0YXRpb24gaXMgZGFuZ2VyLiAgQnkgdW5zZXR0aW5nIHRoZXNlIGZsYWdzLAotCWBmcGdtJyBhbmQgYHByZXAnIHRhYmxlcyBhcmUgZXhlY3V0ZWQgYWdhaW4gaW4gbmV4dCBpbnRlcnByZXRhdGlvbi4KLQotCVRoaXMgZml4ZXMgU2F2YW5uYWggYnVnICMzMDc5OCwgcmVwb3J0ZWQgYnkgUm9iZXJ0IMWad2nEmWNraS4KLQotMjAxMC0wOC0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Z0cmFzdGVyXSBQYWNpZnkgY29tcGlsZXIuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoZnRfYmxhY2tfbmV3KSBbX1NUQU5EQUxPTkVfXTogYG1lbW9yeScgaXMKLQlub3QgdXNlZC4KLQotMjAxMC0wOC0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gQWxsb3cgU0lEcyA+PSA2NTAwMC4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9jaGFyc2V0X2xvYWQpOiBGaXggY2hhbmdlIGZyb20gMjAwOS0wMy0yMDoKLQlUaGUgdGhyZXNob2xkIGZvciBTSURzIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuICBJIG1pc2ludGVycHJldGVkIHRoZQotCWBTSUQgdmFsdWVzIDY1MDAwIGFuZCBhYm92ZSBhcmUgYXZhaWxhYmxlIGZvciBpbXBsZW1lbnRhdGlvbiB1c2UnCi0Jc2VudGVuY2UgaW4gdGhlIENGRiBzcGVjaWZpY2F0aW9uLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBJdmFuIE5pbsSNacSHIDxpbmluY2ljQHBkZnRyb24uY29tPi4KLQotMjAxMC0wOC0yOCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZvcmNlIGhpbnRpbmcgd2hlbiB0aGUgZm9udCBsYWNrcyBpdHMgZmFtaWx5bmFtZS4KLQotCUluIFR5cGU0MiBvciBUeXBlMTEgZm9udCBlbWJlZGRlZCBpbiBQb3N0U2NyaXB0ICYgUERGLCBUcnVlVHlwZSBzZm50Ci0Jc3RyZWFtIG1heSBsYWNrIGBuYW1lJyB0YWJsZSBiZWNhdXNlIHRoZXkgYXJlIG5vdCByZXF1aXJlZC4gIEhpbnRpbmcKLQlmb3IgbmFtZWxlc3MgZm9udHMgaXMgc2FmZXIgZm9yIFBERnMgaW5jbHVkaW5nIGVtYmVkZGVkIENoaW5lc2UKLQlmb250cy4gIFdyaXR0ZW4gYnkgRGF2aWQgQmV2YW4sIHNlZToKLQotCWh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDEwLTA4L21zZzAwMDIxLmh0bWwKLQlodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL3BvcHBsZXIvMjAxMC1BdWd1c3QvMDA2MzEwLmh0bWwKLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9jaGVja190cmlja3luZXNzKTogSWYgYSBOVUxMIHBvaW50ZXIgYnkKLQluYW1lbGVzcyBmb250IGlzIGdpdmVuLCBUUlVFIGlzIHJldHVybmVkIHRvIGVuYWJsZSBoaW50aW5nLgotCi0yMDEwLTA4LTI4ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JUmVnaXN0ZXIgeWV0IGFub3RoZXIgdHJpY2t5IFRydWVUeXBlIGZvbnQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfY2hlY2tfdHJpY2t5bmVzcyk6IEFkZCBgSHVhVGlhbkthaVRpPycsCi0JYSBLYWlzaHUgdHlwZWZhY2UgcGFpcmVkIHdpdGggYEh1YVRpYW5Tb25nVGk/JyBieSBIdWF0aWFuCi0JSW5mb3JtYXRpb24gSW5kdXN0cnkuCi0KLTIwMTAtMDgtMTcgIFRlaWpvIEtpbm51bmVuICA8VGVpam8uS2lubnVuZW5AbnVhbmNlLmNvbT4KLQotCVtjYWNoZV0gRml4IFNhdmFubmFoIGJ1ZyAjMzA3ODguCi0KLQkqIHNyYy9jYWNoZS9mdGNjYWNoZS5jIChGVENfQ2FjaGVfQ2xlYXIpOiBDaGVjayBgY2FjaGUtPmJ1Y2tldHMnIGZvcgotCU5VTEwgdG9vLgotCi0yMDEwLTA4LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlUcnkgdG8gZml4IFNhdmFubmFoIGJ1ZyAjMzA3MTcgKGFuZCBwcm9iYWJseSAjMzA3MTkgdG9vKS4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBBZGQgYW5vdGhlcgotCW92ZXJmbG93IHRlc3QgZm9yIGB3aWR0aCcgYW5kIGBoZWlnaHQnLgotCi0yMDEwLTA4LTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi40LjIgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi00LTInLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBidW1wIHZlcnNpb24gbnVtYmVyIHRvCi0JMi40LjIKLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLAotCWJ1aWxkcy93aW4zMi92YzIwMDUvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsIGJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNC4xLzIuNC4yLywgcy8yNDEvMjQyLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAyLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTI6MDo2LgotCi0yMDEwLTA4LTA2ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzA2NDguCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Eb25lX0xpYnJhcnkpOiBTcGVjaWZ5IHRoZSBvcmRlciBvZiBmb250Ci0JZHJpdmVycyBkdXJpbmcgdGhlIGZhY2UgY2xvc2luZyBwcm9jZXNzLiAgVHlwZTQyIGZhY2VzIHNob3VsZCBiZQotCWNsb3NlZCBiZWZvcmUgVHJ1ZVR5cGUgZmFjZXMsIGJlY2F1c2UgYSBUeXBlNDIgZmFjZSByZWZlcnMgdG8KLQlhbm90aGVyIGludGVybmFsIFRydWVUeXBlIGZhY2Ugd2hpY2ggaXMgY3JlYXRlZCBmcm9tIHNmbnRbXSBhcnJheSBvbgotCXRoZSBtZW1vcnkuCi0KLTIwMTAtMDgtMDYgIFl1cml5IEthbWluc2tpeSAgPHl1bWthbUBtYWlsLnJ1PgotCi0JW3Jhc3Rlcl0gRml4IHZhbGdyaW5kIHdhcm5pbmcuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoRGVjb21wb3NlX0N1cnZlKSA8ZGVmYXVsdD46IEFjY2VzcyBwb2ludFswXQotCW9ubHkgaWYgd2UgZG9uJ3QgaGl0IGBsaW1pdCcuCi0KLTIwMTAtMDgtMDYgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzMDY1OC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBDaGVjayB0aGF0IHRoZSB0b3RhbAotCWxlbmd0aCBvZiBjb2xsZWN0ZWQgUE9TVCBzZWdtZW50cyBkb2VzIG5vdCBvdmVycnVuIHRoZSBhbGxvY2F0ZWQKLQlidWZmZXIuCi0KLTIwMTAtMDgtMDYgIFl1cml5IEthbWluc2tpeSAgPHl1bWthbUBtYWlsLnJ1PgotCi0JRml4IGNvbmRpdGlvbmFsIHVzYWdlIG9mIEZUX011bEZpeF9pMzg2LgotCVdpdGggLWFuc2kgZmxhZywgZ2NjIGRvZXMgbm90IGRlZmluZSBgaTM4NicsIG9ubHkgYF9faTM4Nl9fJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCwgYnVpbGRzL3VuaXgvZnRjb25maWcuaW46Ci0Jcy9pMzg2L19faTM4Nl9fLy4KLQotMjAxMC0wOC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggU2F2YW5uYWggYnVnICMzMDY1Ny4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEJPVU5EU0wpOiBOZXcgbWFjcm8uCi0JQ2hhbmdlIGBCT1VORFMnIHRvIGBCT1VORFNMJyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmggKFRUX0V4ZWNDb250ZXh0UmVjKTogRml4IHR5cGUgb2YKLQlgY3Z0U2l6ZScuCi0KLTIwMTAtMDgtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlNDJdIEZpeCBTYXZhbm5haCBidWcgIzMwNjU2LgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9zZm50cyk6IFByb3RlY3QgYWdhaW5zdCBuZWdhdGl2ZQotCXN0cmluZ19zaXplLgotCUZpeCBjb21wYXJpc29uLgotCi0yMDEwLTA4LTA1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2NmZl0gRG9uJ3QgdXNlIGFueSB2YWx1ZXMgaW4gZGVjb2RlciBhZnRlciBwYXJzaW5nIGVycm9yLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBTa2lwIHRoZSBldmFsdWF0aW9ucwotCW9mIHRoZSB2YWx1ZXMgaW4gZGVjb2RlciwgaWYgYGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzJwotCXJldHVybnMgYW55IGVycm9yLgotCi0yMDEwLTA4LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzMDY0NC4KLQotCSogc3JjL2Jhc2UvZnRzdHJlYW0uYyAoRlRfU3RyZWFtX0VudGVyRnJhbWUpOiBGaXggY29tcGFyaXNvbi4KLQotMjAxMC0wOC0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JYG1ha2UgZGV2ZWwnIGZhaWxzIGlmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyBpcyBzZXQuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmg6IFN5bmNocm9uaXplIHdpdGgKLQlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oLgotCi0yMDEwLTA4LTA0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2NmZl0gSW1wcm92ZSBzdGFjayBvdmVyZmxvdyB0ZXN0LgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogQ2hlY2sgc3RhY2sKLQlhZnRlciBleGVjdXRpb24gb2Ygb3BlcmF0aW9ucyB0b28uCi0KLTIwMTAtMDctMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCByZWZlcmVuY2UgY291bnRlcnMgYW5kIHRvIEZUX0xpYnJhcnkgYW5kIEZUX0ZhY2Ugb2JqZWN0cy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9SZWZlcmVuY2VfRmFjZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtb2RhcGkuaCAoRlRfUmVmZXJlbmNlX0xpYnJhcnkpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0ZhY2VfSW50ZXJuYWxSZWMsCi0JRlRfTGlicmFyeVJlYyk6IE5ldyBmaWVsZCBgcmVmY291bnQnLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfT3Blbl9GYWNlLCBGVF9OZXdfTGlicmFyeSk6IEhhbmRsZQotCWByZWZjb3VudCcuCi0JKEZUX1JlZmVyZW5jZV9GYWNlLCBGVF9SZWZlcmVuY2VfTGlicmFyeSk6IEltcGxlbWVudCBuZXcgZnVuY3Rpb25zLgotCShGVF9Eb25lX0ZhY2UsIEZUX0RvbmVfTGlicmFyeSk6IEhhbmRsZSBgcmVmY291bnQnLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTAtMDctMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjQuMSByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTQtMScuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjQuMS4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLAotCWJ1aWxkcy93aW4zMi92YzIwMDUvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsIGJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNC4wLzIuNC4xLywgcy8yNDAvMjQxLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTE6MTo1LgotCi0yMDEwLTA3LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBGaW5hbCB0cnkgdG8gZml4IGBoaW50bWFzaycgYW5kIGBjbnRybWFzaycgbGltaXQgY2hlY2suCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IFRvYmlhcyBXb2xmIDx0b3dvbGZAZ21haWwuY29tPi4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykKLQk8Y2ZmX29wX2hpbnRtYXNrPjogU2lnaC4gIEknbSBhcHBhcmVudGx5IHRvbyBzaWxseSB0byBmaXggdGhpcwotCWNvcnJlY3RseSBpbiBsZXNzIHRoYW4gdGhyZWUgdHJpZXMuCi0KLTIwMTAtMDctMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjQuMCByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTQtMCcuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjQuMC4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLAotCWJ1aWxkcy93aW4zMi92YzIwMDUvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsIGJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuMy4xMi8yLjQuMC8sIHMvMjMxMi8yNDAvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX01JTk9SKTogU2V0IHRvIDQuCi0JKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDAuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxMTowOjUuCi0KLTIwMTAtMDctMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJlbW92ZSBDKysgd2FybmluZ3MuCi0KLQkqLyo6IEluaXRpYWxpemUgcG9pbnRlcnMgd2hlcmUgbmVjZXNzYXJ5IHRvIG1ha2UgZysrIGhhcHB5LgotCi0yMDEwLTA3LTEyICBtYWxjICA8YXYxNDc0QGNvbXR2LnJ1PgotCSAgICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEByZWRoYXQuY29tPgotCi0JRml4IHR5cGUtcHVubmluZyBpc3N1ZXMgd2l0aCBDKysuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCAoRlRfQVNTSUdOUCkgW19fY3BsdXNwbHVzXToKLQlFbXVsYXRlIGEgYHR5cGVvZicgb3BlcmF0b3Igd2l0aCBhbiBpbmxpbmUgdGVtcGxhdGUgd2hpY2ggdXNlcwotCWBzdGF0aWNfY2FzdCcuCi0KLTIwMTAtMDctMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBDKysgY29tcGlsYXRpb24gaXNzdWUuCi0KLQkqIHNyYy90b29scy9hcGluYW1lcy5jIChuYW1lc19kdW1wKSA8T1VUUFVUX1dBVENPTV9MQkM+OiBGaXgKLQl0eXBlIG9mIGBkb3QnIHZhcmlhYmxlLgotCi0yMDEwLTA3LTEwICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JRml4IGFub3RoZXIgY2FzZSByZXBvcnRlZCBpbiBTYXZhbm5haCBidWcgIzMwMzczLgotCVBlcm1pdCBhIGZhY2UgZm9yIFR5cGUxLCBUeXBlNDIgYW5kIENGRiB3aXRob3V0IGNoYXJtYXAsCi0JcGF0Y2ggYnkgVG9yIEFuZGVyc3Nvbi4KLQotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0luaXQpOiBSZXNldCB0aGUgZXJyb3IgaWYgaXQKLQlpcyBGVF9FcnJfTm9fVW5pY29kZV9HbHlwaF9OYW1lLgotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmMgKFQ0Ml9GYWNlX0luaXQpOiBEaXR0by4KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogRGl0dG8uCi0KLTIwMTAtMDctMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlVc2UgZGVmaW5lZCBtYWNyb3MgdG8gc2V0IHtwbGF0Zm9ybSxlbmNvZGluZ31faWQuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYzogSW5jbHVkZSB0dG5hbWVpZC5oIGFuZCB1c2UgbWFjcm9zIHRvCi0Jc2V0IGNoYXJtYXAue3BsYXRmb3JtLGVuY29kaW5nfV9pZC4KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYzogRGl0dG8uCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmM6IERpdHRvLgotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jOiBEaXR0by4KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jOiBEaXR0by4KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jOiBEaXR0by4KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jOiBEaXR0by4KLQotMjAxMC0wNy0wOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZpeCBTYXZhbm5haCBidWcgIzMwMzczLgotCVRvbyBzZXJpb3VzIGNoZWNrIG9mIGVycm9ycyBieSBgRlRfQ01hcF9OZXcnIHNpbmNlIDIwMTAtMDctMDQKLQlpcyBmaXhlZC4gUmVwb3J0ZWQgYnkgVG9yIEFuZGVyc3Nvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oCi0JKFBTbmFtZXNfRXJyX05vX1VuaWNvZGVfR2x5cGhfTmFtZSk6IE5ldyBlcnJvciBjb2RlIHRvCi0JaW5kaWNhdGUgdGhlIFVuaWNvZGUgY2hhcm1hcCBzeW50aGVzaXMgZmFpbGVkIGJlY2F1c2UKLQlubyBVbmljb2RlIGdseXBoIG5hbWUgaXMgZm91bmQuCi0KLQkqIHNyYy9wc25hbWVzL3BzbW9kdWxlLmMgKHBzX3VuaWNvZGVzX2luaXQpOiBSZXR1cm4KLQlQU25hbWVzX0Vycl9Ob19Vbmljb2RlX0dseXBoX05hbWUgd2hlbiBubyBVbmljb2RlIGdseXBoIG5hbWUKLQlpcyBmb3VuZCBpbiB0aGUgZm9udC4KLQkqIHNyYy9jZmYvY2ZmY21hcC5jIChjZmZfY21hcF91bmljb2RlX2luaXQpOiBSZXR1cm4KLQlDRkZfRXJyX05vX1VuaWNvZGVfR2x5cGhfTmFtZSB3aGVuIG5vIFNJRCBpcyBhdmFpbGFibGUuCi0KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KTogUHJvY2VlZCBpZiBgRlRfQ01hcF9OZXcnCi0JaXMgZmFpbGVkIGJ5IHRoZSBsYWNrIG9mIFVuaWNvZGUgZ2x5cGggbmFtZS4KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KTogRGl0dG8uCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IERpdHRvLgotCi0yMDEwLTA3LTA5ICBLZW4gU2hhcnAgIDxrZW4uc2hhcnBAYXJ0aWZleC5jb20+Ci0KLQlNYWtlIGZ0cmFzdGVyLmMgY29tcGlsZSBpbiBzdGFuZC1hbG9uZSBtb2RlIHdpdGggTVNWQyBjb21waWxlci4KLQotCSogc3JjL3Jhc3Rlci9mdG1pc2MuaCAoRlRfSW50NjQpIFtfV0lOMzIsIF9XSU42NF06IEZpeCB0eXBlZGVmCi0Jc2luY2UgdGhlcmUgaXMgbm8gYGludHR5cGVzLmgnIGZvciBNU1ZDLgotCi0yMDEwLTA3LTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBTYXZhbm5haCBidWcgIzMwMzYxLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX0lVUCk6IEZpeCBib3VuZHMgY2hlY2suCi0KLTIwMTAtMDctMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVBhY2lmeSBjb21waWxlci4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9pbmRleF9nZXRfcG9pbnRlcnMpOiBJbml0aWFsaXplCi0JYG5ld19ieXRlcycuCi0KLTIwMTAtMDctMDUgIEV1Z2VuZSBBLiBTaGF0b2toaW4gIDxzcGVjdHJlQGlzcHJhcy5ydT4KLQotCUZpeCBTYXZhbm5haCBidWcgIzI3NjQ4LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfcmVtb3ZlX3JlbmRlcmVyLCBGVF9BZGRfTW9kdWxlKTogQ2FsbAotCWByYXN0ZXJfZG9uZScgb25seSBpZiB3ZSBoYXZlIGFuIG91dGxpbmUgZ2x5cGggZm9ybWF0LgotCi0yMDEwLTA3LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzMDAzMC4KLQotCSogYnVpbGRzL3dpbjMyLyovZnJlZXR5cGUudmNwcm9qOiBBZGQgZnR4Zjg2LmMuCi0KLTIwMTAtMDctMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIE5leHQgdHJ5IHRvIGZpeCBgaGludG1hc2snIGFuZCBgY250cm1hc2snIGxpbWl0IGNoZWNrLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBtYWxjIDxhdjE0NzRAY29tdHYucnU+LgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxjZmZfb3BfaGludG1hc2s+OiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzIGp1c3QgYSBzaW5nbGUgYnl0ZQotCWFmdGVyIHRoZSBgaGludG1hc2snIG9yIGBjbnRybWFzaycsIGUuZy4sIGEgYHJldHVybicgaW5zdHJ1Y3Rpb24uCi0KLTIwMTAtMDctMDQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlSZXN0cmljdCB0aGUgbnVtYmVyIG9mIHRoZSBjaGFybWFwcyBpbiBhIHJvZ3VlLWNvbXBhdGlibGUgbW9kZS4KLQlGaXggZm9yIFNhdmFubmFoIGJ1ZyAjMzAwNTkuCi0KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmMgKEZUQ19DTWFwQ2FjaGVfTG9va3VwKTogUmVwbGFjZSBgMTYnIHRoZQotCW1pbmltdW0gY2hhcmFjdGVyIGNvZGUgcGFzc2VkIGJ5IGEgbGVnYWN5IHJvZ3VlIGNsaWVudCBieS4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCAoRlRfTUFYX0NIQVJNQVBfQ0FDSEVBQkxFKToKLQlUaGlzLiAgSXQgaXMgdW5kZWZpbmVkIHdoZW4gRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTIGlzCi0JdW5kZWZpbmVkICh0aHVzIHRoZSByb2d1ZSBjbGllbnQgY29tcGF0aWJpbGl0eSBpcyBub3QgcmVxdWlyZWQpLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IEFib3J0IHRoZSBhdXRvbWF0aWMKLQlzZWxlY3Rpb24gb3Igc3ludGhlc2lzIG9mIFVuaWNvZGUgY21hcCBzdWJ0YWJsZSB3aGVuIHRoZSBjaGFybWFwCi0JaW5kZXggZXhjZWVkcyBGVF9NQVhfQ0hBUk1BUF9DQUNIRUFCTEUuCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfZmFjZV9idWlsZF9jbWFwcyk6IElzc3VlIGVycm9yIG1lc3NhZ2UKLQl3aGVuIHRoZSBjaGFybWFwIGluZGV4IGV4Y2VlZHMgRlRfTUFYX0NIQVJNQVBfQ0FDSEVBQkxFLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZmluZF91bmljb2RlX2NoYXJtYXApOiBXaGVuIFVuaWNvZGUgY2hhcm1hcAotCWlzIGZvdW5kIGFmdGVyIEZUX01BWF9DSEFSTUFQX0NBQ0hFQUJMRSwgaWdub3JlIGl0IGFuZCBzZWFyY2gKLQllYXJsaWVyIG9uZS4KLQkoZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXApOiBXaGVuIFVWUyBjaGFybWFwIGlzIGZvdW5kIGFmdGVyCi0JRlRfTUFYX0NIQVJNQVBfQ0FDSEVBQkxFLCBpZ25vcmUgaXQgYW5kIHNlYXJjaCBlYXJsaWVyIG9uZS4KLQkoRlRfU2VsZWN0X0NoYXJtYXApOiBXaGVuIGEgY2hhcm1hcCBtYXRjaGluZyB3aXRoIHJlcXVlc3RlZAotCWVuY29kaW5nIGJ1dCBhZnRlciBGVF9NQVhfQ0hBUk1BUF9DQUNIRUFCTEUsIGlnbm9yZSBhbmQgc2VhcmNoCi0JZWFybGllciBvbmUuCi0JKEZUX1NldF9DaGFybWFwKTogV2hlbiBhIGNoYXJtYXAgbWF0Y2hpbmcgd2l0aCByZXF1ZXN0ZWQKLQljaGFybWFwIGJ1dCBhZnRlciBGVF9NQVhfQ0hBUk1BUF9DQUNIRUFCTEUsIGlnbm9yZSBhbmQgc2VhcmNoCi0JZWFybGllciBvbmUuCi0JKEZUX0dldF9DaGFybWFwX0luZGV4KTogV2hlbiBhIHJlcXVlc3RlZCBjaGFybWFwIGlzIGZvdW5kCi0JYWZ0ZXIgRlRfTUFYX0NIQVJNQVBfQ0FDSEVBQkxFLCByZXR1cm4gdGhlIGludmVydGVkIGNoYXJtYXAKLQlpbmRleC4KLQotMjAxMC0wNy0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JVHJ1ZVR5cGUgaGludGluZyBpcyBubyBsb25nZXIgcGF0ZW50ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgsIGRldmVsL2Z0b3B0aW9uLmgKLQkoVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUik6IERlZmluZS4KLQkoVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcpOiBVbmRlZmluZS4KLQotCSogZG9jcy9DSEFOR0VTLCBkb2NzL0lOU1RBTEwsIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaDogVXBkYXRlZC4KLQkqIGRvY3MvVFJVRVRZUEUsIGRvY3MvUEFURU5UUzogUmVtb3ZlZC4KLQotMjAxMC0wNy0wNCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUNoZWNrIGVycm9yIHZhbHVlIGJ5IGBGVF9DTWFwX05ldycuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogQ2hlY2sgZXJyb3IgdmFsdWUgYnkKLQlgRlRfQ01hcF9OZXcnLgotCSogc3JjL3Bmci9wZnJvYmpzLmMgKHBmcl9mYWNlX2luaXQpOiBEaXR0by4KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KTogRGl0dG8uCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCk6IERpdHRvLgotCi0yMDEwLTA3LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNYWtlIGZ0Z3JheXMuYyBjb21waWxlIHN0YW5kLWFsb25lIGFnYWluLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyBbX1NUQU5EQUxPTkVfXTogSW5jbHVkZSBgc3RkZGVmLmgnLgotCShGVF9JTlRfTUFYLCBGVF9QdHJEaXN0KVtfU1RBTkRBTE9ORV9dOiBEZWZpbmUuCi0KLTIwMTAtMDctMDIgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlBZGRpdGlvbmFsIGZpeCBmb3IgU2F2YW5uYWggYnVnICMzMDMwNi4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBJZiB0aGUgdHlwZSBvZiB0aGUKLQlQT1NUIGZyYWdtZW50IGlzIDAsIHRoZSBzZWdtZW50IGlzIGNvbXBsZXRlbHkgaWdub3JlZC4gIFRoZSBkZWNsYXJlZAotCWxlbmd0aCBvZiB0aGUgc2VnbWVudCBpcyBub3QgY2FyZWQgYXQgYWxsLiAgQWNjb3JkaW5nIHRvIEFkb2JlCi0JVGVjaG5pY2FsIE5vdGUgNTA0MCwgdHlwZSAwIHNlZ21lbnQgaXMgYSBjb21tZW50IG9ubHkgYW5kIHNob3VsZCBub3QKLQliZSBsb2FkZWQgZm9yIHRoZSBpbnRlcnByZXRlci4gIFJlcG9ydGVkIGJ5IFJvYmVydCDFmndpxJlja2kuCi0KLTIwMTAtMDctMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gUHJvdGVjdCBhZ2FpbnN0IGNvZGUgcmFuZ2UgdW5kZXJmbG93LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoRE9fSlJPVCwgRE9fSk1QUiwgRE9fSlJPRik6IERvbid0IGFsbG93Ci0JbmVnYXRpdmUgSVAgdmFsdWVzLgotCi0yMDEwLTA3LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCBydWRpbWVudGFyeSB0cmFjaW5nIGZvciBieXRlY29kZSBpbnN0cnVjdGlvbnMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChvcGNvZGVfbmFtZSkgW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXTogTmV3Ci0JYXJyYXkuCi0JKFRUX1J1bklucyk6IFRyYWNlIG9wY29kZXMuCi0KLTIwMTAtMDYtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzbW9vdGhdIEZpeCBTYXZhbm5haCBidWcgIzMwMjYzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfc3Bhbik6IFVzZSBjYXN0IHRvIGB1bnNpZ25lZAotCWludCcgdG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvdy4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBVc2Ugc21hbGxlcgotCXRocmVzaG9sZCB2YWx1ZXMgZm9yIGB3aWR0aCcgYW5kIGBoZWlnaHQnLiAgVGhpcyBpcyBub3QgZGlyZWN0bHkKLQlyZWxhdGVkIHRvIHRoZSBidWcgZml4IGJ1dCBtYWtlcyBzZW5zZSBhbnl3YXkuCi0KLTIwMTAtMDctMDEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlJbml0aWFsIGZpeCBmb3IgU2F2YW5uYWggYnVnICMzMDMwNi4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBDaGVjayBgcmxlbicsIHRoZQotCWxlbmd0aCBvZiBmcmFnbWVudCBkZWNsYXJlZCBpbiB0aGUgUE9TVCBmcmFnbWVudCBoZWFkZXIsIGFuZCBwcmV2ZW50Ci0JYW4gdW5kZXJmbG93IGluIGxlbmd0aCBjYWxjdWxhdGlvbi4gIFNvbWUgZm9udHMgc2V0IHRoZSBsZW5ndGggdG8KLQl6ZXJvIGluIHNwaXRlIG9mIHRoZSBleGlzdGVuY2Ugb2YgYSBmb2xsb3dpbmcgMTZiaXQgYHR5cGUnLgotCVJlcG9ydGVkIGJ5IFJvYmVydCDFmndpxJlja2kuCi0KLTIwMTAtMDctMDEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlBZGRpdGlvbmFsIGZpeCBmb3IgU2F2YW5uYWggYnVnICMzMDI0OCBhbmQgIzMwMjQ5LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoTWFjX1JlYWRfUE9TVF9SZXNvdXJjZSk6IENoZWNrIHRoZSBidWZmZXIgc2l6ZQotCWR1cmluZyBnYXRoZXJpbmcgUEZCIGZyYWdtZW50cyBlbWJlZGRlZCBpbiBMYXNlcldyaXRlciBQUyBmb250IGZvcgotCU1hY2ludG9zaC4gIFJlcG9ydGVkIGJ5IFJvYmVydCDFmndpxJlja2kuCi0KLTIwMTAtMDYtMzAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCU1pbm9yIG9wdGltaXphdGlvbnMgYnkgYXZvaWRpbmcgZGl2aXNpb25zLgotCi0JKiBzcmMvc2ZudC90dGtlcm4uYyAodHRfZmFjZV9sb2FkX2tlcm4sIHR0X2ZhY2VfZ2V0X2tlcm5pbmcpOgotCVJlcGxhY2UgZGl2aXNpb25zIHdpdGggbXVsdGlwbGljYXRpb24gaW4gY29tcGFyaXNvbnMuCi0KLTIwMTAtMDYtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBtaW5vciB0cmFjaW5nIGlzc3Vlcy4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jLCBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jOiBBZGp1c3QgdHJhY2luZyBsZXZlbHMuCi0KLTIwMTAtMDYtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFJlYWxseSBmaXggYGhpbnRtYXNrJyBhbmQgYGNudHJtYXNrJyBsaW1pdCBjaGVjay4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykKLQk8Y2ZmX29wX2hpbnRtYXNrPjogRml4IHRoaW5rbyBhbmQgaGFuZGxlIHRyYWNpbmcgYWxzby4KLQotMjAxMC0wNi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IHZhbGdyaW5kIHdhcm5pbmcuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24pOiBJbml0aWFsaXplCi0JYHJlc3VsdCcgYXJyYXkuCi0KLTIwMTAtMDYtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBtZW1vcnkgbGVhay4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfb3BlcmF0b3Jfc2VhYyk6IEZyZWUgY2hhcnN0cmluZ3MgZXZlbiBpbgotCWNhc2Ugb2YgZXJyb3JzLgotCi0yMDEwLTA2LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBgaGludG1hc2snIGFuZCBgY250cm1hc2snIG9wZXJhdG9ycy4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykKLQk8Y2ZmX29wX2hpbnRtYXNrPjogRW5zdXJlIHRoYXQgd2UgZG9uJ3QgZXhjZWVkIGBsaW1pdCcgd2hpbGUgcGFyc2luZwotCXRoZSBiaXQgbWFza3Mgb2YgdGhlIGBoaW50bWFzaycgYW5kIGBjbnRybWFzaycgb3BlcmF0b3JzLgotCi0yMDEwLTA2LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggUEZSIGNoYW5nZSAyMDEwLTA2LTI0LgotCi0JKiBzcmMvcGZyL3Bmcmdsb2FkLmMgKHBmcl9nbHlwaF9sb2FkX3NpbXBsZSk6IFJlYWxseSBwcm90ZWN0IGFnYWluc3QKLQlpbnZhbGlkIGluZGljZXMuCi0KLTIwMTAtMDYtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUltcHJvdmUgUEZSIHRyYWNpbmcgbWVzc2FnZXMuCi0KLQkqIHNyYy9wZnIvcGZyZ2xvYWQuYyAocGZyX2dseXBoX2xvYWRfcmVjKTogRW1pdCB0cmFjaW5nIG1lc3NhZ2VzIGZvcgotCXNpbXBsZSBhbmQgY29tcG91bmQgZ2x5cGggb2Zmc2V0cy4KLQotMjAxMC0wNi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGxhc3QgUEZSIGNoYW5nZS4KLQotCSogc3JjL3Bmci9wZnJvYmpzLmMgKHBmcl9mYWNlX2luaXQpOiBGaXggcmVqZWN0aW9uIGxvZ2ljLgotCi0yMDEwLTA2LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IFNhdmFubmFoIGJ1ZyAjMzAyNjIuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfbWF4cCk6IExpbWl0IGBtYXhDb21wb25lbnREZXB0aCcKLQlhcmJpdHJhcmlseSB0byAxMDAgdG8gYXZvaWQgc3RhY2sgZXhoYXVzdGlvbi4KLQotMjAxMC0wNi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkIHNvbWUgbWVtb3J5IGNoZWNrcyAobWFpbmx5IGZvciBkZWJ1Z2dpbmcpLgotCi0JKiBzcmMvYmFzZS9mdHN0cmVhbS5jIChGVF9TdHJlYW1fRW50ZXJGcmFtZSk6IEV4aXQgd2l0aCBlcnJvcgotCWlmIHRoZSBmcmFtZSBzaXplIGlzIGxhcmdlciB0aGFuIHRoZSBzdHJlYW0gc2l6ZS4KLQotCSogc3JjL2Jhc2UvZnRzeXN0ZW0uYyAoZnRfYW5zaV9zdHJlYW1faW8pOiBFeGl0IHdpdGggZXJyb3IgaWYKLQlzZWVraW5nIGEgcG9zaXRpb24gbGFyZ2VyIHRoYW4gdGhlIHN0cmVhbSBzaXplLgotCi0yMDEwLTA2LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcGZyXSBGaXggU2F2YW5uYWggYnVnICMzMDI2MS4KLQotCSogc3JjL3Bmci9wZnJvYmpzLmMgKHBmcl9mYWNlX2luaXQpOiBSZWplY3QgZm9udHMgd2hpY2ggY29udGFpbgotCW5laXRoZXIgb3V0bGluZSBub3IgYml0bWFwIGdseXBocy4KLQotMjAxMC0wNi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gRml4IFNhdmFubmFoIGJ1ZyAjMzAyNTQuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKTogRG8gc2FuaXR5IGNoZWNrIGZvcgotCWZpcnN0IG9mZnNldCBhbHNvLgotCi0yMDEwLTA2LTI1ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JSW5pdGlhbCBmaXggZm9yIFNhdmFubmFoIGJ1ZyAjMzAyNDggYW5kICMzMDI0OS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBDaGVjayB0aGUgZXJyb3IgZHVyaW5nCi0JcmVhZGluZyBhIFBGQiBmcmFnbWVudCBlbWJlZGRlZCBpbiBMYXNlcldyaXRlciBQUyBmb250IGZvciBNYWNpbnRvc2guCi0JUmVwb3J0ZWQgYnkgUm9iZXJ0IMWad2nEmWNraS4KLQotMjAxMC0wNi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gRml4IFNhdmFubmFoIGJ1ZyAjMzAyNDcuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X21ldHJpY3MpOiBEaXNhbGxvdyAoaW52YWxpZCkgZm9udHMgd2l0aAotCXplcm8gbWV0cmljcy4KLQotMjAxMC0wNi0yNCAgR3JhaGFtIEFzaGVyICA8Z3JhaGFtLmFzaGVyQGJ0aW50ZXJuZXQuY29tPgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfY3ViaWMpOiBGaXggYWxnb3JpdGhtLgotCVRoZSBwcmV2aW91cyB2ZXJzaW9uIHdhcyB0b28gYWdncmVzc2l2ZSwgYXMgZGVtb25zdHJhdGVkIGluCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTAtMDYvbXNnMDAwMjAuaHRtbC4KLQotMjAxMC0wNi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKi8qOiBVc2UgbW9kdWxlIHNwZWNpZmljIGVycm9yIG5hbWVzIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0yMDEwLTA2LTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IFNhdmFubmFoIGJ1ZyAjMzAyMzYuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9mYWNlX2J1aWxkX2NtYXBzKTogSW1wcm92ZSBjaGVjayBmb3IgcG9pbnRlcgotCXRvIGBjbWFwX3RhYmxlJy4KLQotMjAxMC0wNi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Bmcl0gRml4IFNhdmFubmFoIGJ1ZyAjMzAyMzUuCi0KLQkqIHNyYy9wZnIvcGZyZ2xvYWQuYyAocGZyX2dseXBoX2xvYWRfc2ltcGxlKTogUHJvdGVjdCBhZ2FpbnN0Ci0JaW52YWxpZCBpbmRpY2VzIGlmIHRoZXJlIGFyZW4ndCBhbnkgY29vcmRpbmF0ZXMgZm9yIGluZGV4aW5nLgotCi0yMDEwLTA2LTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXTogRm9udCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbC4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9yZWFkc3RyZWFtKTogVXNlIHNwZWNpYWwgZXJyb3IgY29kZSB0bwotCWluZGljYXRlIGEgcmVkbyBvcGVyYXRpb24uCi0JKF9iZGZfcGFyc2Vfc3RhcnQpOiBIYW5kbGUgYENIQVJTJyBrZXl3b3JkIGhlcmUgdG9vIGFuZCBwYXNzIGN1cnJlbnQKLQlpbnB1dCBsaW5lIHRvIGBfYmRmX3BhcnNlX2dseXBoJy4KLQotMjAxMC0wNi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gRml4IFNhdmFubmFoIGJ1ZyAjMzAyMjAuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaAotCShCREZfRXJyX01pc3NpbmdfRm9udGJvdW5kaW5nYm94X0ZpZWxkKTogTmV3IGVycm9yIGNvZGUuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcGFyc2Vfc3RhcnQpOiBDaGVjayBmb3IgbWlzc2luZwotCWBGT05UQk9VTkRJTkdCT1gnIGZpZWxkLgotCUF2b2lkIG1lbW9yeSBsZWFrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBgRk9OVCcgbGluZXMgKHdoaWNoIGlzCi0JaW52YWxpZCBidXQgZG9lc24ndCBodXJ0KS4KLQotMjAxMC0wNi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Bmcl0gRml4IFNhdmFubmFoIGJ1ZyAjMzAxNjguCi0KLQkqIHNyYy9wZnIvcGZyZ2xvYWQuYyAocGZyX2dseXBoX2xvYWRfY29tcG91bmQpOiBMaW1pdCB0aGUgbnVtYmVyIG9mCi0Jc3ViZ2x5cGhzIHRvIGF2b2lkIGVuZGxlc3MgcmVjdXJzaW9uLgotCi0yMDEwLTA2LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcHNhdXhdIEZpeCBTYXZhbm5haCBidWcgIzMwMTQ1LgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHQxX2J1aWxkZXJfYWRkX2NvbnRvdXIpOiBQcm90ZWN0IGFnYWluc3QKLQlgb3V0bGluZSA9PSBOVUxMJyB3aGljaCBtaWdodCBoYXBwZW4gaW4gaW52YWxpZCBmb250cy4KLQotMjAxMC0wNi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gRml4IFNhdmFubmFoIGJ1ZyAjMzAxMzUuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfbGlzdF9qb2luKTogRG9uJ3QgbW9kaWZ5IHZhbHVlIGluIHN0YXRpYwotCXN0cmluZyBgZW1wdHknLgotCShfYmRmX3BhcnNlX2dseXBoKTogQXZvaWQgbWVtb3J5IGxlYWsgaW4gY2FzZSBvZiBlcnJvci4KLQotMjAxMC0wNi0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCBTYXZhbm5haCBidWcgIzMwMTA4LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zY3JpcHRfY292ZXJhZ2UpOgotCVByb3Blcmx5IG1hc2sgQUZfRElHSVQgYml0IGluIGNvbXBhcmlzb24uCi0KLTIwMTAtMDYtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2hpbnRlcl0gRml4IFNhdmFubmFoIGJ1ZyAjMzAxMDYuCi0KLQlQb2ludCBudW1iZXJzIGZvciBGcmVlVHlwZSdzIGltcGxlbWVudGF0aW9uIG9mIGhpbnRpbmcgbWFza3MgYXJlCi0JY29sbGVjdGVkIGJlZm9yZSB0aGUgZmluYWwgbnVtYmVyIG9mIHBvaW50cyBvZiBhIGdseXBoIGhhcyBiZWVuCi0JZGV0ZXJtaW5lZDsgaW4gcGFydGljdWxhciwgdGhlIGNvZGUgZm9yIGhhbmRsaW5nIHRoZSBgZW5kY2hhcicKLQlvcGNvZGUgY2FuIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHBvaW50cy4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uYyAocHNoX2dseXBoX2ZpbmRfc3Ryb25nX3BvaW50cyk6IEFzc3VyZSB0aGF0Ci0JYGVuZF9wb2ludCcgaXMgbm90IGxhcmdlciB0aGFuIGBnbHlwaC0+bnVtX3BvaW50cycuCi0KLTIwMTAtMDYtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdOiBJbXByb3ZlIGRlYnVnZ2luZyBvdXRwdXQuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpCi0JPGNmZl9vcF9oaW50bWFzaz46IEltcGxlbWVudCBpdC4KLQotMjAxMC0wNi0xMCAgR3JhaGFtIEFzaGVyICA8Z3JhaGFtLmFzaGVyQGJ0aW50ZXJuZXQuY29tPgotCi0JZnRncmF5czogU3BlZWQgdXAgcmVuZGVyaW5nIG9mIHNtYWxsIGN1YmljIHNwbGluZXMuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9jdWJpYyk6IEltcGxlbWVudCBuZXcsCi0Jc2ltcGxpZmllZCBhbGdvcml0aG0gdG8gZmluZCBvdXQgd2hldGhlciB0aGUgc3BsaW5lIGNhbiBiZSByZXBsYWNlZAotCXdpdGggdHdvIHN0cmFpZ2h0IGxpbmVzLiAgU2VlIHRoaXMgdGhyZWFkIGZvciBtb3JlOgotCi0JICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMC0wNi9tc2cwMDAwMC5odG1sCi0KLTIwMTAtMDYtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBTYXZhbm5haCBidWcgIzMwMDgyLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQotCTxjZmZfb3BfY2FsbG90aGVyc3Vicj46IFByb3RlY3QgYWdhaW5zdCBzdGFjayB1bmRlcmZsb3cuCi0KLTIwMTAtMDYtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBTYXZhbm5haCBidWcgIzMwMDUzLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9yZWFsKTogSGFuZGxlIGJvcmRlciBjYXNlIHdoZXJlCi0JYGZyYWN0aW9uX2xlbmd0aCcgaGFzIHZhbHVlIDEwLgotCi0yMDEwLTA2LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzMDA1Mi4KLQlUaGlzIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIHdpdGggY29tbWl0IDI0MTVjYmYzLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X0ZpcnN0X0NoYXIsIEZUX0dldF9OZXh0X0NoYXIpOiBQcm90ZWN0Ci0JYWdhaW5zdCBlbmRsZXNzIGxvb3AgaW4gY2FzZSBvZiBjb3JydXB0ZWQgZm9udCBoZWFkZXIgZGF0YS4KLQotMjAxMC0wNS0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQlGb3VuZCBieSBHcmFoYW0uCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlIGBmaXJzdCcgaW4gZmlyc3QgYmxvY2suCi0KLTIwMTAtMDUtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCB2YXJpb3VzIG1lbW9yeSBwcm9ibGVtcyBmb3VuZCBieSBsaW51eHRlc3Rpbmcub3JnLgotCi0JKiBzcmMvYmFzZS9mdGd4dmFsLmMgKEZUX1RydWVUeXBlR1hfRnJlZSwgRlRfQ2xhc3NpY0tlcm5fRnJlZSksCi0Jc3JjL2Jhc2UvZnRvdHZhbC5jIChGVF9PcGVuVHlwZV9GcmVlKSwgc3JjL2Jhc2UvZnRwZnIuYwotCShmdF9wZnJfY2hlY2spOiBDaGVjayBgZmFjZScuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfQ2hhcm1hcF9JbmRleCk6IENoZWNrIGBjaGFybWFwJyBhbmQKLQlgY2hhcm1hcC0+ZmFjZScuCi0JKEZUX1JlbmRlcl9HbHlwaCk6IENoZWNrIGBzbG90LT5mYWNlJy4KLQkoRlRfR2V0X1N1YkdseXBoX0luZm8pOiBDaGVjayBgZ2x5cGgtPnN1YmdseXBocycuCi0KLTIwMTAtMDUtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCWF1dG9maXQ6IFJlbW92ZSBkZWFkIGNvZGUuCi0JU3VnZ2VzdGVkIGJ5IEdyYWhhbS4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19jb21wdXRlX2luZmxlY3Rpb25zKToKLQlSZW1vdmVkLgotCShhZl9nbHlwaF9oaW50c19yZWxvYWQpOiBSZW1vdmUgdGhpcmQgYXJndW1lbnQuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCi0yMDEwLTA1LTIxICBCcmFtIFRhc3N5bnMgIDxicmFtdEBlbmZvY3VzLmJlPgotCi0JW2NmZl0gRml4IFNhdmFubmFoIGJ1ZyAjMjc5ODcuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChyZW1vdmVfc3Vic2V0X3ByZWZpeCk6IE5ldyBmdW5jdGlvbi4KLQkoY2ZmX2ZhY2VfaW5pdCk6IFVzZSBpdCB0byBhZGp1c3QgYGNmZmZhY2UtPmZhbWlseV9uYW1lJy4KLQotMjAxMC0wNS0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JVHJ1ZVR5cGU6IE1ha2UgRnJlZVR5cGUgaWdub3JlIG1heFNpemVPZkluc3RydWN0aW9ucyBpbiBgbWF4cCcuCi0KLQlBY3JvcmVhZCBkb2VzIHRoZSBzYW1lLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9HbHlwaCk6IENhbGwKLQlgVXBkYXRlX01heCcgdG8gYWRqdXN0IHNpemUgb2YgaW5zdHJ1Y3Rpb25zIGFycmF5IGlmIG5lY2Vzc2FyeSBhbmQKLQlhZGQgYSByb3VnaCBzYWZldHkgY2hlY2suCi0KLQkobG9hZF90cnVldHlwZV9nbHlwaCk6IFNhdmUgYGxvYWRlci0+Ynl0ZV9sZW4nIGJlZm9yZSByZWN1cnNpdmUKLQljYWxsLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCwgc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFVwZGF0ZV9NYXgpOgotCURlY2xhcmUgaXQgYXMgRlRfTE9DQUwuCi0KLTIwMTAtMDUtMTggIEhvbmdibyBOaSAgPGhvbmdib0BuanN0YXIuY29tPgotCi0JQXBwbHkgU2F2YW5uYWggcGF0Y2ggIzcxOTYuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCk6IFByZXZlbnQgY3Jhc2ggaWYgQ0ZGIHN1YmZvbnQKLQlpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0KLTIwMTAtMDUtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9mb3JtYXRzLnR4dDogR2l2ZSBwb2ludGVyIHRvIFBDRiBkb2N1bWVudGF0aW9uLgotCUluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IEFsYW4gQ29vcGVyc21pdGgKLQk8YWxhbi5jb29wZXJzbWl0aEBvcmFjbGUuY29tPi4KLQotMjAxMC0wNS0xMCAgS2VuIFNoYXJwICA8a2VuLnNoYXJwQGFydGlmZXguY29tPgotCi0JW3BzYXV4XSBGaXggU2F2YW5uYWggYnVnICMyOTg0Ni4KLQotCVByZXZpb3VzbHkgd2UgZGlzY292ZXJlZCBmb250cyB3aGljaCB1c2VkIGBzZXRjdXJyZW50cG9pbnQnIHRvIHNldAotCXRoZSBpbml0aWFsIHBvaW50IG9mIGEgY29udG91ciB0byAwLDAuICBUaGlzIGNhdXNlZCBGcmVlVHlwZSB0bwotCXJhaXNlIGFuIGVycm9yLCBiZWNhdXNlIHRoZSBgc2V0Y3VycmVudHBvaW50JyBvcGVyYXRvciBpcyBvbmx5Ci0Jc3VwcG9zZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXN1bHRzIGZyb20gYW4gT3RoZXJTdWJyIHN1YnJvdXRpbmUuCi0KLQlUaGlzIHdhcyBmaXhlZCBieSBzaW1wbHkgaWdub3JpbmcgdGhlIGVycm9yIGFuZCBjYXJyeWluZyBvbi4KLQotCU5vdyB3ZSBoYXZlIGZvdW5kIGEgZm9udCB3aGljaCB1c2VzIHNldGN1cnJlbnRwb2ludCB0byBhY3R1YWxseQotCWVzdGFibGlzaCBhIG5vbi16ZXJvIHBvaW50IGZvciBhIGNvbnRvdXIgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYQotCWdseXBoIHByb2dyYW0uICBGV0lXLCB0aGVzZSBmaWxlcyBtYXkgYmUgcHJvZHVjZWQgYnkgYW4gYXBwbGljYXRpb24KLQljYWxsZWQgYEludGFnbGlvJyBvbiB0aGUgTWFjLCB3aGVuIGNvbnZlcnRpbmcgVHJ1ZVR5cGUgZm9udHMgdG8KLQlUeXBlIDEuCi0KLQlUaGUgZml4IGFsbG93cyB0aGUgbmV3IGludmFsaWQgYmVoYXZpb3VyLCB0aGUgb2xkIGludmFsaWQgYmVoYXZpb3VyCi0JYW5kIHJlYWwgcHJvcGVyIHVzYWdlIG9mIHRoZSBvcGVyYXRvciB0byB3b3JrIHRoZSBzYW1lIHdheSBhcyBBZG9iZQotCWludGVycHJldGVycyBhcHBhcmVudGx5IGRvLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IE1ha2UKLQlgc2V0Y3VycmVudHBvaW50JyB1c2UgdGhlIHRvcCB0d28gZWxlbWVudHMgb2YgdGhlIHN0YWNrIHRvIGVzdGFibGlzaAotCXVuY29uZGl0aW9uYWxseSB0aGUgY3VycmVudCB4IGFuZCB5IGNvb3JkaW5hdGVzLgotCi0JTWFrZSB0aGUgYGZsZXgnIHN1YnJvdXRpbmUgaGFuZGxpbmcgKE90aGVyU3ViciAwKSBwdXQgdGhlIGN1cnJlbnQKLQl4LHkgY29vcmRpbmF0ZXMgb250byB0aGUgc3RhY2ssIGluc3RlYWQgb2YgdHdvIGR1bW15IHVuaW5pdGlhbGlzZWQKLQl2YWx1ZXMuCi0KLTIwMTAtMDQtMTQgIEtlbiBTaGFycCAgPGtlbi5zaGFycEBhcnRpZmV4LmNvbT4KLQotCVtwc2F1eF0gRml4IFNhdmFubmFoIGJ1ZyAjMjk0NDQuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAodDFfYnVpbGRlcl9zdGFydF9wb2ludCk6IEFjY2VwdCAoaW52YWxpZCkKLQlgbGluZXRvJyBpbW1lZGlhdGVseSBhZnRlciBgaHNidycsIGluIGFjY29yZGFuY2Ugd2l0aCBBY3JvYmF0LCBHUywKLQlhbmQgb3RoZXJzLgotCi0yMDEwLTA0LTE0ICBNaWNoYcWCIENpY2hvxYQgIDx0aGVkbWRAYXJ0aWZleG11bmRpLmNvbT4KLQotCVtwc2F1eF0gRml4IFNhdmFubmFoIGJ1ZyAjMjc5OTkuCi0KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQpOiBPbmx5IHJlbW92ZQotCXNlbGVjdGVkIGVudHJ5LCBub3QgYWxsLgotCi0yMDEwLTA0LTA2ICBKb25hdGhhbiBLZXcgIDxqZmt0aGFtZUBnbWFpbC5jb20+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCBvdmVyZmxvdyBjaGVjayB0byBgZnZhcicgdGFibGUuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBDaGVjayBheGlzIGFuZCBpbnN0YW5jZQotCWNvdW50LgotCi0yMDEwLTA0LTA1ICBLZW4gU2hhcnAgIDxrZW4uc2hhcnBAYXJ0aWZleC5jb20+Ci0KLQlbcmFzdGVyXSBGaXggU2F2YW5uYWggYnVnICMyOTMzNS4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChMaW5lX1VwKTogVXNlIHNsb3cgbXVsdGlwbGljYXRpb24gdG8KLQlwcmV2ZW50IG92ZXJmbG93LiAgVGhpcyBzaG91bGRuJ3QgaGF2ZSBhbnkgc2VyaW91cyBpbXBhY3Qgb24gc3BlZWQsCi0JaG93ZXZlci4KLQotMjAxMC0wNC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkIG5ldyBmdW5jdGlvbiBgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzJy4KLQotCVRoaXMgaXMgYmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IExpZnRlcgotCTxodHRwOi8vdW5peGZvcnVtLm9yZy9pbmRleC5waHA/c2hvd3VzZXI9MTE2OTE+LiAgSXQgZml4ZXMKLQlGcmVlRGVza3RvcCBidWcgIzI3Mzg2LgotCi0JKiBzcmMvYmFzZS9mdGxjZGZpbC5jIChGVF9MaWJyYXJ5X1NldExjZEZpbHRlcldlaWdodHMpOiBOZXcKLQlmdW5jdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oOiBVcGRhdGVkLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTAtMDQtMDEgIEpvaG4gVHl0Z2F0ICA8Sm9obi5UeXRnYXRAZXNrby5jb20+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBTYXZhbm5haCBidWcgIzI5NDA0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jOiBSZXZlcnQgY2hhbmdlIDI3NTJiZDFhIChjaGVjayBvbiBiaXQgMQotCW9mIGBoZWFkJyB0YWJsZSBvZiBUcnVlVHlwZSBmb250cykuCi0KLTIwMTAtMDMtMTQgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGaXggYG11bHRpIGJ1aWxkJyBmb3IgVHl0Z2F0J3MgQ0ZGIGRyaXZlciBpbXByb3ZlbWVudC4KLQotCSogc3JjL2Jhc2UvY2ZmbG9hZC5oIChjZmZfaW5kZXhfZ2V0X25hbWUpOiBBZGRlZC4KLQotMjAxMC0wMy0xMiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVJlbW92ZSBkdXBsaWNhdGVkIGluY2x1c2lvbiBvZiBgRlRfT1VUTElORV9IJyBpbiBmdG9ianMuYy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IFJlbW92ZSAybmQgaW5jbHVzaW9uIG9mIGBGVF9PVVRMSU5FX0gnLgotCi0yMDEwLTAzLTExICBDaHJpcyBMaWRkZWxsICA8Y2hyaXMubGlkZGVsbEBhcnRpZmV4LmNvbT4KLQotCVtyYXN0ZXJdIEZpeCBTYXZhbm5haCBidWcgIzI3NDQyLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKGZ0X2JsYWNrX3Jlc2V0KTogRml4IGBidWZmZXJfc2l6ZScuCi0KLTIwMTAtMDMtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0JUmVwb3J0ZWQgYnkgR3JhaGFtLgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZV9yZWFsKTogUmVtb3ZlIGByZXN0Jy4KLQotMjAxMC0wMy0wMiAgSm9obiBUeXRnYXQgIDxKb2huLlR5dGdhdEBlc2tvLmNvbT4KLQotCVtjZmZdIEltcHJvdmUgQ0ZGIHN0cmluZyAoZXNwZWNpYWxseSBnbHlwaG5hbWUpIGxvb2t1cCBwZXJmb3JtYW5jZS4KLQotCVdlIGRvIHRoaXMgYnkgYXZvaWRpbmcgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZpbGUgSS9PLiAgVGhpcyBpcwotCVNhdmFubmFoIHBhdGNoICM3MTA0LgotCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmg6IEluY2x1ZGUgUFMgY21hcHMgc2VydmljZSBhbmQKLQlGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0guCi0JKENGRl9TdWJGb250UmVjKTogUmVtb3ZlIGBudW1fbG9jYWxfc3VicnMnLgotCShDRkZfRm9udFJlYyk6IEFkZCBgbnVtX3N0cmluZ3MnLCBgc3RyaW5ncycsIGFuZCBgc3RyaW5nX3Bvb2wnCi0JZmllbGRzLgotCVJlbW92ZSBgc3RyaW5nX2luZGV4JyBhbmQgYG51bV9nbG9iYWxfc3VicnMnIGZpZWxkcy4KLQlVc2UgcmVhbCB0eXBlcyBpbnN0ZWFkIG9mIGB2b2lkJyBmb3IgYHBzaGludGVyJyBhbmQgYHBzbmFtZXMnIGZpZWxkcy4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmM6IERvbid0IGluY2x1ZGUgUFMgY21hcHMgc2VydmljZS4KLQkoY2ZmX2luZGV4X2dldF9wb2ludGVycyk6IEFkZCBgcG9vbCcgcGFyYW1ldGVyIHdoaWNoIGFsbG93cyBpbnNlcnRpbmcKLQlhbiBleHRyYSBOVUwgY2hhcmFjdGVyIGZvciBlYWNoIFN0cmluZyBJTkRFWCBlbnRyeS4KLQkoY2ZmX2luZGV4X2dldF9uYW1lKTogTWFrZSBpdCBhIGxvY2FsIGZ1bmN0aW9uLgotCShjZmZfaW5kZXhfZ2V0X3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KLQkoY2ZmX3N1YmZvbnRfbG9hZCk6IFVwZGF0ZWQuCi0JKGNmZl9mb250X2xvYWQpOiBJbml0aWFsaXplIGBudW1fc3RyaW5ncycsIGBzdHJpbmdzJywgYW5kCi0JYHN0cmluZ19wb29sJyBmaWVsZHMgaW4gdGhlIGBDRkZfRm9udFJlYycgc3RydWN0dXJlLgotCShjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcpOiBVc2UgYGNmZl9pbmRleF9nZXRfc3RyaW5nJyBpbnN0ZWFkIG9mCi0JYGNmZl9pbmRleF9nZXRfbmFtZScuCi0JKGNmZl9mb250X2RvbmUpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuaDogRG9uJ3QgaW5jbHVkZSBQUyBjbWFwcyBzZXJ2aWNlLgotCShjZmZfaW5kZXhfZ2V0X3N0cmluZyk6IEFkZGVkLgotCShjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYzogRG9uJ3QgaW5jbHVkZSBQUyBjbWFwcyBzZXJ2aWNlIGFuZAotCUZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSC4KLQkoY2ZmX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MsIGNmZl9zbG90X2luaXQpOiBVcGRhdGVkLgotCShjZmZfZmFjZV9pbml0KTogRm9sbG93IGBjZmZfaW5kZXhfZ2V0X25hbWUnLAotCWBjZmZfaW5kZXhfZ2V0X3N0cmluZycsIGFuZCBgY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nJyBjaGFuZ2VzLgotCi0JKiBzcmMvY2ZmL2NmZmNtYXAuYyAoY2ZmX3NpZF9mcmVlX2dseXBoX25hbWUpOiBSZW1vdmVkLgotCShjZmZfc2lkX3RvX2dseXBoX25hbWUpOiBVc2UgYGNmZl9pbmRleF9nZXRfY2lkX3N0cmluZycuCi0JKGNmZl9jbWFwX3VuaWNvZGVfaW5pdCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYzogRG9uJ3QgaW5jbHVkZSBQUyBjbWFwIHNlcnZpY2UuCi0JKGNmZl9nZXRfZ2x5cGhfbmFtZSk6IEF2b2lkIHVubmVjZXNzYXJ5IGxvb2t1cCBmb3IgUE9TVFNDUklQVF9DTUFQUwotCXNlcnZpY2UuCi0JKGNmZl9nZXRfZ2x5cGhfbmFtZSwgY2ZmX3BzX2dldF9mb250X2luZm8sIGNmZl9nZXRfcm9zKTogRm9sbG93IEFQSQotCWBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcnIGNoYW5nZS4KLQkoY2ZmX2dldF9uYW1lX2luZGV4KTogVXNlIGBjZmZfaW5kZXhfZ2V0X3N0cmluZycgaW5zdGVhZCBvZgotCWBjZmZfaW5kZXhfZ2V0X25hbWUnLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmM6IERvbid0IGluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ILgotCShjZmZfZGVjb2Rlcl9pbml0LCBjZmZfZGVjb2Rlcl9wcmVwYXJlKTogVXBkYXRlZC4KLQotMjAxMC0wMi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JU2ltcGxpZnkgY29kZS4KLQlTdWdnZXN0ZWQgYnkgQmVoZGFkLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X0ZpcnN0X0NoYXIpOiBEb24ndCB1c2UgYSBsb29wIHNpbmNlIHdlCi0JY2FsbCBGVF9HZXRfTmV4dF9DaGFyIGFueXdheSBpZiBuZWNlc3NhcnkuCi0KLTIwMTAtMDItMjYgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JSW1wcm92ZSBoYW5kbGluZyBvZiBpbnZhbGlkIGdseXBoIGluZGljZXMgaW4gY2hhci0+aW5kZXggZnVuY3Rpb25zLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X0ZpcnN0X0NoYXIsIEZUX0dldF9OZXh0X0NoYXIpOiBVc2UgYQotCWxvb3AuCi0KLTIwMTAtMDItMTggIENocmlzIExpZGRlbGwgIDxjaHJpcy5saWRkZWxsQGFydGlmZXguY29tPgotCi0JW3RydWV0eXBlXSBGaXggU2F2YW5uYWggYnVnICMyODkwNS4KLQotCUluaXRpYWxpemUgcGhhbnRvbSBwb2ludHMgYmVmb3JlIGNhbGxpbmcgdGhlIGluY3JlbWVudGFsIGludGVyZmFjZQotCXRvIHVwZGF0ZSBnbHlwaCBtZXRyaWNzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jICh0dF9nZXRfbWV0cmljc19pbmNyX292ZXJyaWRlcykKLQlbRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTF06IE5ldyBmdW5jdGlvbiwgc3BsaXQgb2ZmIGZyb20uLi4KLQkodHRfZ2V0X21ldHJpY3MpOiBUaGlzLgotCVVwZGF0ZWQuCi0JKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBVc2UgdHRfZ2V0X21ldHJpY3NfaW5jcl9vdmVycmlkZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMTAtMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLWluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci1mdWxseS4KLQotCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1jb2Rpbmc6IHV0Zi04Ci1FbmQ6CmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cuMjUgYi9DaGFuZ2VMb2cuMjUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZmVkNzEuLjAwMDAwMDAKLS0tIGEvQ2hhbmdlTG9nLjI1CisrKyAvZGV2L251bGwKQEAgLTEsNTE2MSArMCwwIEBACi0yMDE0LTEyLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi41LjUgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi01LTUnLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNS41LgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIGJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi41LjQvMi41LjUvLCBzLzI1NC8yNTUvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDUuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxNzo0OjExLgotCSogQ01ha2VMaXN0cy50eHQgKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gNS4KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotCSogYnVpbGRzL3RvcGxldmVsLm1rIChkaXN0KTogRml4IHR5cG9zLgotCi0yMDE0LTEyLTI0ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gRm9ybWF0dGluZyBhbmQgbmFub29wdGltaXphdGlvbnMuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jLAotCSogc3JjL2Jhc2UvZnR0cmlnb24uYzogUmV2aXNlIHNpZ24gcmVzdG9yYXRpb24uCi0KLTIwMTQtMTItMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9yZWFkX1RPQyk6IEltcHJvdmUgZml4IGZyb20gMjAxNC0xMi0wOC4KLQotMjAxNC0xMi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdG9wbGV2ZWwubWsgKGRpc3QpOiBVc2Ugb2xkZXIgUE9TSVggc3RhbmRhcmQgZm9yIGB0YXInLgotCi0JQXBwYXJlbnRseSwgQlNEIHRhciBpc24ndCBjYXBhYmxlIHlldCBvZiBoYW5kbGluZyBQT1NJWC0xLjIwMDEKLQkoY29udHJhcnkgdG8gR05VIHRhciksIHNvIGZvcmNlIHRoZSBQT1NJWC0xLjE5ODggZm9ybWF0LgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBTdGVwaGVuIEZpc2hlciA8c2Zpc2hlckBTREYuT1JHPi4KLQotMjAxNC0xMi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9zZm50cyk6IFJlamVjdCBpbnZhbGlkIFRURiBzaXplLgotCi0yMDE0LTEyLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfR2x5cGhfTmFtZSk6IEZpeCBvZmYtYnktb25lIGNoZWNrLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBEZW5uaXMgRmVsc2luZyA8ZGVubmlzQGZlbHNpbjkuZGU+LgotCi0yMDE0LTEyLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX3NmbnRzKTogQ2hlY2sgYHN0cmluZ19zaXplJy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgRGVubmlzIEZlbHNpbmcgPGRlbm5pc0BmZWxzaW45LmRlPi4KLQotMjAxNC0xMi0wOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtneHZhbGlkXSBGaXggYSBuYW1pbmcgY29udmVudGlvbiBjb25mbGljdGluZyB3aXRoIGZ0dmFsaWQuCi0KLQlTZWUgcHJldmlvdXMgY2hhbmdlc2V0IGZvciBvdHZhbGlkLgotCi0JKiBzcmMvZ3h2YWxpZC97Z3h2Y29tbW4uaCwgZ3h2bW9ydC5oLCBneHZtb3J4Lmh9OiBSZXBsYWNlCi0JYHZhbGlkJyBieSBgZ3h2YWxpZCcuCi0JKiBzcmMvZ3h2YWxpZC97Z3h2YnNsbi5jLCBneHZjb21tbi5jLCBneHZmZWF0LmMsIGd4dmp1c3QuYywKLQlneHZrZXJuLmMsIGd4dmxjYXIuYywgZ3h2bW9ydC5jLCBneHZtb3J0MC5jLCBneHZtb3J0MS5jLAotCWd4dm1vcnQyLmMsIGd4dm1vcnQ0LmMsIGd4dm1vcnQ1LmMsIGd4dm1vcnguYywgZ3h2bW9yeDAuYywKLQlneHZtb3J4MS5jLCBneHZtb3J4Mi5jLCBneHZtb3J4NC5jLCBneHZtb3J4NS5jLCBneHZvcGJkLmMsCi0JZ3h2cHJvcC5jLCBneHZ0cmFrLmN9OiBSZXBsYWNlIGB2YWxpZCcgYnkgYGd4dmFsaWQnIGlmCi0JaXQgaXMgdHlwZWQgYXMgR1hWX1ZhbGlkYXRvci4KLQotMjAxNC0xMi0wOSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtvdHZhbGlkXSBGaXggYSBuYW1pbmcgY29udmVudGlvbiBjb25mbGljdGluZyB3aXRoIGZ0dmFsaWQuCi0KLQlTb21lIHByb3RvdHlwZXMgaW4gZnR2YWxpZC5oIHVzZSBgdmFsaWQnIGZvciB0aGUgdmFyaWFibGVzCi0JdHlwZWQgYXMgRlRfVmFsaWRhdG9yLiAgVGhlaXIgaW1wbGVtZW50YXRpb25zIGluIHNyYy9iYXNlLwotCWZ0b2Jqcy5jIGFuZCB1dGlsaXphdGlvbnMgaW4gc3JjL3NmbnQvdHRjbWFwLmMgZG8gc2ltaWxhci4KLQotCVNvbWUgbWFjcm9zIGluIG90dmNvbW1uLmggYXNzdW1lIHRoZSBleGlzdCBvZiB0aGUgdmFyaWFibGUKLQlgdmFsaWQnIHR5cGVkIGFzIE9UVl9WYWxpZGF0b3IgaW4gdGhlIGNhbGxlci4KLQotCU1peGluZyB0aGVzZSB0d28gY29udmVudGlvbnMgY2F1c2UgaW52YWxpZCBwb2ludGVyIGNvbnZlcnNpb24KLQlhbmQgdW5leHBlY3RlZCBTRUdWIGluIGxvbmdqbXAuICBUbyBwcmV2ZW50IGl0LCBhbGwgdmFyaWFibGVzCi0JdHlwZWQgYXMgT1RWX1ZhbGlkYXRvciBhcmUgcmVuYW1lZCB0byBgb3R2YWxpZCcuCi0KLQkqIHNyYy9vdHZhbGlkL290dmNvbW1uLmg6IFJlcGxhY2UgYHZhbGlkJyBieSBgb3R2YWxpZCcuCi0JKiBzcmMvb3R2YWxpZC97b3R2Y29tbW4uYywgb3R2YmFzZS5jLCBvdHZnZGVmLmMsIG90dmdwb3MuYywKLQlvdHZnc3ViLmMsIG90dmpzdGYuYywgb3R2bWF0aC5jfTogUmVwbGFjZSBgdmFsaWQnIGJ5IGBvdHZhbGlkJwotCWlmIGl0IGlzIHR5cGVkIGFzIE9UVl9WYWxpZGF0b3IuCi0KLTIwMTQtMTItMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbZnR2YWxpZF0gSW50cm9kdWNlIEZUX1RIUk9XKCkgaW4gRlRfSU5WQUxJRF9YWFggbWFjcm9zLgotCi0JT3JpZ2luYWwgcGF0Y2ggaXMgZGVzaWduZWQgYnkgV2VybmVyIExlbWJlcmcuICBFeHRyYSBwYXJ0Ci0JZm9yIG90dmFsaWQgYW5kIGd4dmFsaWQgYXJlIGFkZGVkIGJ5IHN1enVraSB0b3NoaXlhLCBzZWUKLQlkaXNjdXNzaW9uOgotCWh0dHA6Ly9saXN0cy5ub25nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDE0LTEyL21zZzAwMDAyLmh0bWwKLQlodHRwOi8vbGlzdHMubm9uZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxNC0xMi9tc2cwMDAwNy5odG1sCi0KLQkqIGluY2x1ZGUvaW50ZXJuYWwvZnR2YWxpZC5oOiBJbnRyb2R1Y2UgRlRfVEhST1coKSBpbiBGVF9JTlZBTElEXygpLgotCSogc3JjL2d4dmFsaWQvZ3h2Y29tbW4uaDogRGl0dG8uCi0JKiBzcmMvb3R2YWxpZC9vdHZjb21tbi5oOiBEaXR0by4KLQotMjAxNC0xMi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gRml4IFNhdmFubmFoIGJ1ZyAjNDM3NzQuCi0KLQlXb3JrIGFyb3VuZCBgZmVhdHVyZXMnIG9mIFgxMSdzIGBwY2ZXcml0ZUZvbnQnIGFuZCBgcGNmUmVhZEZvbnQnCi0JZnVuY3Rpb25zLiAgU2luY2UgdGhlIFBDRiBmb3JtYXQgZG9lc24ndCBoYXZlIGFuIG9mZmljaWFsCi0Jc3BlY2lmaWNhdGlvbiwgd2UgaGF2ZSB0byBleGFjdGx5IGZvbGxvdyB0aGVzZSBmdW5jdGlvbnMnIGJlaGF2aW91ci4KLQotCVRoZSBwcm9ibGVtIHdhcyB1bnZlaWxlZCB3aXRoIGEgcGF0Y2ggZnJvbSAyMDE0LTExLTA2LCBmaXhpbmcgaXNzdWUKLQkjNDM1NDcuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfcmVhZF9UT0MpOiBEb24ndCBjaGVjayB0YWJsZSBzaXplIGZvciBsYXN0Ci0JZWxlbWVudC4gIEluc3RlYWQsIGFzc2lnbiByZWFsIHNpemUuCi0KLTIwMTQtMTItMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVdvcmsgYXJvdW5kIGEgYnVnIGluIEJvcmxhbmQncyBDKysgY29tcGlsZXIuCi0KLQlTZWUKLQotCSAgaHR0cDovL3FjLmVtYmFyY2FkZXJvLmNvbS93Yy9xY21haW4uYXNweD9kPTExODk5OAotCi0JZm9yIEJvcmxhbmQncyBidWcgdHJhY2tlciBlbnRyeS4KLQotCVJlcG9ydGVkIGJ5IFl1bGlhbmEgWmlnYW5naXJvdmEgPHppZ2FuZ2lyb3ZhQGluYm94LnJ1PiwKLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxNC0wNC9tc2cwMDAwMS5odG1sLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL2Z0dmFsaWQuaCAoRlRfVmFsaWRhdG9yUmVjKSwgc3JjL3Ntb290aC9mdGdyYXlzLmMKLQkoZ3JheV9UV29ya2VyXyk6IE1vdmUgYGZ0X2ptcF9idWYnIGZpZWxkIHRvIGJlIHRoZSBmaXJzdCBlbGVtZW50LgotCi0yMDE0LTEyLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqLyo6IERlY29yYXRlIGhleCBjb25zdGFudHMgd2l0aCBgVScgYW5kIGBMJyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotMjAxNC0xMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBQcmV2ZW50IG1lbW9yeSBsZWFrIGZvciBidWdneSBmb250cy4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX2RvbmUpOiBVbmNvbmRpdGlvbmFsbHkgY2FsbAotCWB0dF9zaXplX2RvbmVfYnl0ZWNvZGUnLgotCi0yMDE0LTEyLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi41LjQgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi01LTQnLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNS40LgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIGJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi41LjMvMi41LjQvLCBzLzI1My8yNTQvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDQuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxNzozOjExLgotCSogQ01ha2VMaXN0cy50eHQgKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gNC4KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNC0xMi0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JZG9jcy9DSEFOR0VTOiBVcGRhdGVkLCBmb3JtYXR0ZWQuCi0KLTIwMTQtMTItMDQgIERhdmUgQXJub2xkICA8ZGFybm9sZEBhZG9iZS5jb20+Ci0KLQlbY2ZmXSBNb2RpZnkgYW4gRlRfQVNTRVJULgotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmMgKGNmMl9oaW50bWFwX21hcCk6IEFmdGVyIHRoZSBmaXggZm9yIFNhdmFubmFoCi0JYnVnICM0MzY2MSwgdGhlIHRlc3QgZm9udCBgLi4uYXNwYXJ0YW0ub3RmJyBzdGlsbCB0cmlnZ2VycyBhbgotCUZUX0FTU0VSVC4gIFNpbmNlIGhpbnRtYXAgc3RpbGwgd29ya3Mgd2l0aCBjb3VudD09MCwgLi4uCi0JKGNmMl9nbHlwaHBhdGhfbGluZVRvLCBjZjJfZ2x5cGhwYXRoX2N1cnZlVG8pOiAuLi4gYWRkIHRoYXQgdGVybSB0bwotCXN1cHByZXNzIHRoZSBhc3NlcnQuCi0KLTIwMTQtMTItMDQgIERhdmUgQXJub2xkICA8ZGFybm9sZEBhZG9iZS5jb20+Ci0KLQlbY2ZmXSBGaXggU2F2YW5uYWggYnVnICM0MzY2MS4KLQotCSogc3JjL2NmZi9jZjJpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8Y2YyX2NtZEhTVEVNLAotCWNmMl9jbWRWU1RFTSwgY2YyX2NtZEhJTlRNQVNLPjogRG9uJ3QgYXBwZW5kIHRvIHN0ZW0gYXJyYXlzIGFmdGVyCi0JaGludG1hc2sgaXMgY29uc3RydWN0ZWQuCi0KLQkqIHNyYy9jZmYvY2YyaGludHMuYyAoY2YyX2hpbnRtYXBfYnVpbGQpOiBBZGQgZGVmZW5zaXZlIGNvZGUgdG8KLQlhdm9pZCByZWFkaW5nIHBhc3QgZW5kIG9mIGhpbnRtYXNrLgotCi0yMDE0LTEyLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTQtMTItMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBCZXR0ZXIgZml4IGZvciBjb252ZXJzaW9uIHNwZWNpZmllcnMgaW4gZGVidWcgbWVzc2FnZXMuCi0KLQlVc2luZyBgJWxkJyBmb3IgcG9pbnRlciBkaWZmZXJlbmNlcyBjYXVzZXMgd2FybmluZ3Mgb24gMzJiaXQKLQlwbGF0Zm9ybXMuICBUaGUgY29ycmVjdCB0eXBlIHdvdWxkIGJlICh0aGUgcmVsYXRpdmVseSBuZXcpIGAldGQnLAotCWhvd2V2ZXIsIHRoaXMgaXMgbWlzc2luZyBvbiBzb21lIGltcG9ydGFudCBwbGF0Zm9ybXMuCi0KLQlUaGlzIHBhdGNoIGltcHJvdmVzIHRoZSBjaGFuZ2UgZnJvbSAyMDE0LTExLTI4LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKEFGX0lOREVYX05VTSk6IFVzZSBgaW50JyB0eXBlY2FzdC4gIE91cgotCXBvaW50ZXIgZGlmZmVyZW5jZXMgYXJlIGFsd2F5cyBzdWZmaWNpZW50bHkgc21hbGwuCi0JKGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzLCBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzLAotCWFmX2dseXBoX2hpbnRzX2R1bXBfZWRnZSk6IFJldmVydCB0byBgJWQnIGFuZCB1c2UgYEFGX0lOREVYX05VTScuCi0KLTIwMTQtMTItMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZUX1NmbnRfVGFnOiBzL2Z0X3NmbnRfeHh4L0ZUX1NGTlRfWFhYLyBmb3Igb3J0aG9nb25hbGl0eS4KLQotCUFsbCBwdWJsaWMgRnJlZVR5cGUgZW51bWVyYXRpb24gYW5kIGZsYWcgdmFsdWVzIGFyZSB1cHBlcmNhc2UuLi4KLQotCSogaW5jbHVkZS90dHRhYmxlcy5oIChGVF9TZm50X1RhZyk6IEltcGxlbWVudCBpdC4gIEZvciBiYWNrd2FyZAotCWNvbXBhdGliaWxpdHksIHJldGFpbiB0aGUgb2xkIHZhbHVlcyBhcyBtYWNyb3MuCi0KLQkqIHNyYy9iYXNlL2Z0ZnN0eXBlLmMgKEZUX0dldF9GU1R5cGVfRmxhZ3MpLCBzcmMvc2ZudC9zZmRyaXZlci5jCi0JKGdldF9zZm50X3RhYmxlKTogVXBkYXRlZC4KLQotMjAxNC0xMi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlLyo6IEltcHJvdmUgc3RydWN0dXJlIG9mIGRvY3VtZW50YXRpb24uCi0KLQkuIEFkZCBhbmQgdXBkYXRlIG1hbnkgYDxPcmRlcj4nIHRhZ3MuCi0JLiBBcHBseSB2YXJpb3VzIGRvY3VtZW50YXRpb24gZml4ZXMuCi0JLiBSZW1vdmUgZGV0YWlscyB0byBkZXByZWNhdGVkIChvciBuZXZlciBpbXBsZW1lbnRlZCkgZGF0YS4KLQotMjAxNC0xMi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBBbHdheXMgaGFuZGxlIGA8T3JkZXI+JyBzZWN0aW9uIGVsZW1lbnRzLgotCi0JUHJldmlvdXNseSwgdGhvc2UgZWxlbWVudHMgd2VyZSBoYW5kbGVkIG9ubHkgZm9yIHNlY3Rpb25zIHByZXNlbnQgaW4KLQlhIGA8U2VjdGlvbnM+JyBjaGFwdGVyIGVsZW1lbnQuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci9jb250ZW50LnB5IChDb250ZW50UHJvY2Vzc29yOjpmaW5pc2gpOgotCUltcGxlbWVudCBpdC4KLQotMjAxNC0xMi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBQcm9wZXJseSBoYW5kbGUgZW1wdHkgcm93cyBpbiBTeW5vcHNpcy4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAoSHRtbEZvcm1hdHRlcjo6c2VjdGlvbl9lbnRlcik6IEVtaXQKLQlgJm5ic3A7JyBmb3IgZW1wdHkgZmllbGRzLgotCi0yMDE0LTEyLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZG9jbWFrZXJdIFRoaW5rby4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL2NvbnRlbnQucHkgKERvY0Jsb2NrOjpnZXRfbWFya3VwX3dvcmRzX2FsbCk6Ci0JRW1pdCBgL2VtcHR5Lycgc3RyaW5nIGZvciBmaXJzdCBlbGVtZW50IGFsc28uCi0KLTIwMTQtMTItMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtkb2NtYWtlcl0gSG9ub3VyIGVtcHR5IGxpbmVzIGluIGA8T3JkZXI+JyBzZWN0aW9uIGVsZW1lbnQuCi0KLQlUaGlzIGdyZWF0bHkgaW1wcm92ZXMgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBgU3lub3BzaXMnIGxpbmtzLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvY29udGVudC5weSAoRG9jQmxvY2s6OmdldF9tYXJrdXBfd29yZHNfYWxsKToKLQlJbnNlcnQgc3RyaW5nIGAvZW1wdHkvJyBiZXR3ZWVuIGl0ZW1zLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvZm9ybWF0dGVyLnB5IChGb3JtYXR0ZXI6OnNlY3Rpb25fZHVtcCk6IE1ha2UgaXQKLQlyb2J1c3QgYWdhaW5zdCBub25leGlzdGVudCBrZXlzLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChIdG1sRm9ybWF0dGVyOjpzZWN0aW9uX2VudGVyKTogRW1pdAotCWVtcHR5IDx0ZD4gZWxlbWVudHMgZm9yIGAvZW1wdHkvJy4KLQotMjAxNC0xMi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBFbnN1cmUgUHl0aG9uIDMgY29tcGF0aWJpbGl0eS4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL2NvbnRlbnQucHkgKENvbnRlbnRQcm9jZXNzb3I6OnNldF9zZWN0aW9uLAotCUNvbnRlbnRQcm9jZXNzb3I6OmZpbmlzaCk6IFJlcGxhY2UgYGhhc19rZXknIGZ1bmN0aW9uIHdpdGggYGluJwotCWtleXdvcmQuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci9mb3JtYXR0ZXIucHkgKEZvcm1hdHRlcjo6X19pbml0X18pOiBSZXBsYWNlCi0Jc29ydGluZyBmdW5jdGlvbiB3aXRoIGEga2V5IGdlbmVyYXRvci4KLQkoRm9ybWF0dGVyOjphZGRfaWRlbnRpZmllcik6IFJlcGxhY2UgYGhhc19rZXknIGZ1bmN0aW9uIHdpdGggYGluJwotCWtleXdvcmQuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkgKEh0bWxGb3JtYXR0ZXI6Omh0bWxfc291cmNlX3F1b3RlKToKLQlSZXBsYWNlIGBoYXNfa2V5JyBmdW5jdGlvbiB3aXRoIGBpbicga2V5d29yZC4KLQkoSHRtbEZvcm1hdHRlcjo6aW5kZXhfZXhpdCwgSHRtbEZvcm1hdHRlcjo6c2VjdGlvbl9lbnRlcik6IFVzZQotCWludGVnZXIgZGl2aXNpb24uCi0Jcy88Pi8+Ly4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3V0aWxzLnB5OiBJbXBvcnQgYGl0ZXJ0b29scycuCi0JKGluZGV4X3NvcnQpOiBSZXBsYWNlZCBieS4uLgotCShpbmRleF9rZXkpOiAuLi4gdGhpcyBuZXcga2V5IGdlbmVyYXRvciAoZG9pbmcgZXhhY3RseSB0aGUgc2FtZSkuCi0KLTIwMTQtMTEtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtkb2NtYWtlcl0gRG9uJ3Qgb3V0cHV0IGEgYmxvY2sgbXVsdGlwbGUgdGltZXMuCi0KLQlUaGlzIGJ1ZyB3YXMgaGlkZGVuIGJ5IG5vdCBwcm9jZXNzaW5nIGFsbCBsaW5lcyBvZiBgPE9yZGVyPicgYmxvY2tzLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvZm9ybWF0dGVyLnB5IChGb3JtYXR0ZXI6OnNlY3Rpb25fZHVtcCk6IEZpbHRlcgotCW91dCBmaWVsZCBuYW1lcy4KLQotMjAxNC0xMS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBVc2UgZmllbGQgdmFsdWVzIGFzIEhUTUwgbGluayB0YXJnZXRzIHdoZXJlIHBvc3NpYmxlLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChIdG1sRm9ybWF0dGVyOjptYWtlX2Jsb2NrX3VybCk6Ci0JQWNjZXB0IHNlY29uZCwgb3B0aW9uYWwgYXJndW1lbnQgdG8gc3BlY2lmeSBhIG5hbWUuCi0JKEh0bWxGb3JtYXR0ZXI6Omh0bWxfc291cmNlX3F1b3RlKTogTGluayB0byBmaWVsZCBJRCBpZiBwb3NzaWJsZS4KLQkoSHRtbEZvcm1hdHRlcjo6cHJpbnRfaHRtbF9maWVsZF9saXN0KTogRW1pdCBgaWQnIGF0dHJpYnV0ZS4KLQotMjAxNC0xMS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBBbGxvdyBlbXB0eSBsaW5lcyBpbiBgPE9yZGVyPicgYmxvY2tzLgotCi0JQmVmb3JlIHRoaXMgcGF0Y2gsIHRoZSBzdWdnZXN0ZWQgb3JkZXIgb2YgZW50cmllcyBzdG9wcGVkIGF0IHRoZQotCWZpcnN0IGVtcHR5IGxpbmUuCi0KLQlPYnZpb3VzbHksIG5vYm9keSBub3RpY2VkIHRoYXQgdGhpcyBwcm9ibGVtIGNhdXNlZCBhIG11Y2ggcmVkdWNlZAotCXNldCBvZiBsaW5rcyBpbiB0aGUgYFN5bm9wc2lzJyBzZWN0aW9uczsgaW4gcGFydGljdWxhciwgdGhlCi0JYDxPcmRlcj4nIGJsb2NrcyBjb250YWluIGEgbG90IG9mIGVudHJpZXMgdGhhdCB3b3VsZG4ndCBiZSBsaXN0ZWQKLQlvdGhlcndpc2UuLi4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL2NvbnRlbnQucHkgKERvY0Jsb2NrOjpnZXRfbWFya3VwX3dvcmRzX2FsbCk6Ci0JTmV3IGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhbGwgaXRlbXMuCi0JKERvY1NlY3Rpb246OnByb2Nlc3MpOiBVc2UgaXQuCi0KLTIwMTQtMTEtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3NvdXJjZXMucHkgKGNvbHVtbikgW0Zvcm1hdCAyXTogRml4IHJlZ2V4cC4KLQotCUFmdGVyIHRoZSBzaW5nbGUgYXN0ZXJpc2sgdGhlcmUgbXVzdCBiZSBubyBvdGhlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcKLQlhc3Rlcmlzay4KLQotMjAxNC0xMS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5OiBJbXByb3ZlIENTUyBmb3IgdmVydGljYWwgc3BhY2luZy4KLQotMjAxNC0xMS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBJbXByb3ZlIEhUTUwgY29kZSBmb3IgdGFibGUgb2YgY29udGVudHMuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IEludHJvZHVjZSBhIG5ldyB0YWJsZSBjbGFzcyBgdG9jJywKLQl0b2dldGhlciB3aXRoIHByb3BlciBDU1MuCi0KLTIwMTQtMTEtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtkb2NtYWtlcl0gUHJvdmlkZSBoaWdoZXItbGV2ZWwgbWFya3VwIGFuZCBzaW1wbGlmeSBIVE1MLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5OiBJbnN0ZWFkIG9mIHVzaW5nIGV4dHJhbmVvdXMgYDxkaXY+JwotCWVsZW1lbnRzLCB1c2UgQ1NTIGRlc2NlbmRhbnRzIChvZiBjbGFzcyBgc2VjdGlvbicpIHRvIGZvcm1hdCB0aGUKLQlkYXRhLgotCi0JQWxzbyByZW1vdmUgcmVkdW5kYW50IDxwPiBhbmQgPGJyPiBlbGVtZW50cywgcmVwbGFjaW5nIHRoZW0gd2l0aAotCXByb3BlciBDU1MuCi0KLQlHbG9iYWxseSByZWR1Y2UgcGFnZSB3aWR0aCB0byA3NSUuCi0KLQkoYmxvY2tfaGVhZGVyKTogUmVuYW1lIDxkaXY+IGNsYXNzIHRvIGBzZWN0aW9uJy4KLQotMjAxNC0xMS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBBZGQgYHRvcCcgbGlua3MgYWZ0ZXIgYmxvY2tzLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChibG9ja19mb290ZXJfbWlkZGxlKTogSW1wbGVtZW50IGl0LgotCi0yMDE0LTExLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IEltcHJvdmUgQ1NTIGZvciBmaWVsZHMuCi0KLQlNYWtlIGZpZWxkcyBhbGlnbiBob3Jpem9udGFsbHkgcmVsYXRpdmUgdG8gZnVsbCBsaW5lIHdpZHRoLgotCi0yMDE0LTExLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IEZpeCBpbmRleCBhbmQgVE9DIHRlbXBsYXRlcy4KLQotCVRoaXMgdGhpbmtvIHdhcyBpbnRyb2R1Y2VkIDIwMTQtMTEtMjcuCi0KLTIwMTQtMTEtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtkb2NtYWtlcl0gRm9ybWF0IGZpZWxkIGxpc3RzIHdpdGggQ1NTLgotCi0JVGhpcyBhbHNvIHNpbXBsaWZpZXMgdGhlIGluc2VydGVkIEhUTUwgY29kZS4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weQotCShIdG1sRm9ybWF0dGVyOjpwcmludF9odG1sX2ZpZWxkX2xpc3QpOiBEbyBpdC4KLQotMjAxNC0xMS0yOCAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZpeCBjb21waWxlciB3YXJuaW5nIHRvIHRoZSBjb21wYXJpc29uIGJldHdlZW4gc2lnbmVkIGFuZAotCXVuc2lnbmVkIHZhcmlhYmxlLgotCi0JKiBzcmMvcGZyL3BmcnNiaXQuYyAocGZyX3Nsb3RfbG9hZF9iaXRtYXApOiBGaXggdGhlIGNvbXBhcmlzb24KLQliZXR3ZWVuIGB5cG9zICsgeXNpemUnIGFuZCBGVF9JTlRfe01BWCxNSU59LgotCi0yMDE0LTExLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZG9jbWFrZXJdIFJlcGxhY2UgZW1wdHkgYDx0ZD4nIHdpdGggQ1NTLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChIdG1sRm9ybWF0dGVyOjpzZWN0aW9uX2VudGVyKTogRG8KLQlpdC4KLQotMjAxNC0xMS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBSZXBsYWNlIHNvbWUgYDx0YWJsZT4nIHRhZ3Mgd2l0aCBgPGg0PicgYW5kIGA8ZGl2PicuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkgKG1hcmtlcl8qKTogVXNlIGA8aDQ+Jy4KLQkoc291cmNlXyopOiBVc2UgYDxkaXY+Jy4KLQkoSHRtbEZvcm1hdHRlcjo6YmxvY2tfZW50ZXIpOiBzLzxoND4vPGgzPi8uCi0KLTIwMTQtMTEtMjggIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGaXggY29tcGlsZXIgd2FybmluZyB0byBjb252ZXJzaW9uIHNwZWNpZmllcnMgaW4gZGVidWcgbWVzc2FnZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMpOiBBZGQgbGVuZ3RoCi0JbW9kaWZpZXIgdG8gZHVtcCBsb25nIGludGVnZXJzLgotCShhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzLCBhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzKTogRGl0dG8uCi0KLTIwMTQtMTEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weTogVXNlIG1vcmUgQ1NTIGZvciBpbmRleC4KLQotMjAxNC0xMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBSZXBsYWNlIGBuYW1lJyBhdHRyaWJ1dGUgb2YgYDxhPicgd2l0aCBgaWQnLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChIdG1sRm9ybWF0dGVyOjpibG9ja19lbnRlcik6IERvIGl0LgotCi0yMDE0LTExLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IFJlbW92ZSByZW1haW5pbmcgYHdpZHRoJyBhdHRyaWJ1dGVzLgotCi0JRm9yIGBJbmRleCcgYW5kIGBUT0MnIGxpbmtzLCB3ZSBub3cgc2ltcGx5IHVzZSB0aGUgYHRleHQtYWxpZ24nIENTUwotCXByb3BlcnR5IG9mIGA8dGQ+JyB0byBlbmZvcmNlIGZsdXNoLWxlZnQgYW5kIGZsdXNoLXJpZ2h0LAotCWVsaW1pbmF0aW5nIHRoZSBoYWNrIHdpdGggYW4gZW1wdHksIGZ1bGwtd2lkdGggYDx0ZD4nIGVsZW1lbnQKLQlpbmJldHdlZW4uCi0KLQlUaGUgY2hhbmdlIGFsc28gZW5mb3JjZXMgdGhlIHNhbWUgKHNtYWxsZXIpIHNpemUgZm9yIGFsbCBpbmRleCBhbmQKLQlUT0MgbGlua3MuCi0KLTIwMTQtMTEtMjcgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9jZmYvY2YyZm9udC5jOiBJbmNsdWRlIGBmdGNhbGMuaCcgdG8gdXNlIEZUX01TQigpLAotCWNmMmZvbnQuYyBjb3VsZCBub3QgZmluZCBpdCB1bmRlciBgbWFrZSBtdWx0aScgYnVpbGQuCi0KLTIwMTQtMTEtMjcgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogUmVtb3ZlCi0JdW5yZXF1aXJlZCBuZWdhdGl2ZSB2YWx1ZSBjaGVjayBmb3IgYHdpZHRoJyBhbmQgYGhlaWdodCcuCi0KLTIwMTQtMTEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weTogTW9yZSBIVE1MIHRhYmxlIHJlZmFjdG9yaW5nLgotCi0JUmVwbGFjZSBzb21lIGA8dGFibGU+JyB0YWdzIHdpdGggYDxkaXY+JyB0byBzaW1wbGlmeSBzdHJ1Y3R1cmUuCi0KLQlNb3ZlIGBiZ2NvbG9yJyBhdHRyaWJ1dGUgdG8gQ1NTLgotCi0JUmVwbGFjZSBtb3N0IGB3aWR0aCcgYXR0cmlidXRlcyB3aXRoIENTUy4gIFRoZSByZW1haW5pbmcgaW5zdGFuY2VzCi0JKHByb3ZpZGluZyBhIHNpbWlsYXIgZWZmZWN0IGFzIExhVGVYJ3MgYFxoZmlsbCcgY29tbWFuZCkgYXJlIHJlbW92ZWQKLQlpbiBhIGxhdGVyIHBhdGNoLgotCi0yMDE0LTExLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IFJlcGxhY2UgPGZvbnQ+IHdpdGggQ1NTLgotCi0yMDE0LTExLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IENlbnRlciA8dGFibGU+IHdpdGggQ1NTLgotCi0yMDE0LTExLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IFJlcGxhY2UgYDxjZW50ZXI+JyB3aXRoIGA8ZGl2PicuCi0KLTIwMTQtMTEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weTogUmVtb3ZlIHJlZHVuZGFudCBgPGNlbnRlcj4nIHRhZ3MuCi0KLQlUaGlzIHN0YXJ0cyBhIHNlcmllcyBvZiBjb21taXRzIGludG8gdGhlIGRpcmVjdGlvbiBvZiBnZW5lcmF0aW5nCi0JdmFsaWQgSFRNTCA1IGNvZGUsIGVzcGVjaWFsbHkgdXNpbmcgbXVjaCBtb3JlIENTUy4KLQotMjAxNC0xMS0yNyAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVByZXZlbnQgdG9vIG5lZ2F0aXZlIHZhbHVlcyAoPCBGVF9JTlRfTUlOKSBpbiBiaXRtYXAgbWV0cmljcywKLQlzdWdnZXN0ZWQgYnkgQWxleGVpLgotCi0JKiBzcmMvcGZyL3BmcnNiaXQuYyAocGZyX3Nsb3RfbG9hZF9iaXRtYXApOiBQcmV2ZW50IHRvbwotCW5lZ2F0aXZlIHZhbHVlcyBpbiBgeHBvcycgYW5kIGB5cG9zICsgeXNpemUnLgotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBQcmV2ZW50Ci0JdG9vIG5lZ2F0aXZlIHZhbHVlcyBpbiBgeF9sZWZ0JyBhbmQgYHlfdG9wJy4gIEVpdGhlciBuZWdhdGl2ZQotCXZhbHVlcyBpbiBgd2lkdGgnIGFuZCBgaGVpZ2h0JyBhcmUgY2hlY2tlZC4KLQotMjAxNC0xMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBQcm9kdWNlIGJldHRlciBIVE1MIGNvZGUuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHk6IEFsd2F5cyB1c2UgZG91YmxlIHF1b3RlcyBmb3IKLQlhdHRyaWJ1dGUgdmFsdWVzLgotCShzb3VyY2VfZm9vdGVyKTogQ2xvc2UgYHRkJyBhbmQgYHRyJyBncm91cHMuCi0KLTIwMTQtMTEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVVzZSBiZXR0ZXIgd2F5IHRvIGRpc2FibGUgY3JlYXRpb24gb2YgLnB5YyBmaWxlcyBmb3IgYG1ha2UgcmVmZG9jJy4KLQotCVB5dGhvbiAyLjYgd2FzIHJlbGVhc2VkIGluIDIwMDguLi4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChyZWZkb2MpOiBVc2UgcHl0aG9uJ3MgYC1CJyBvcHRpb24uCi0KLQkqIGJ1aWxkcy9kZXRlY3QubWsgKHN0ZF9zZXR1cCwgZG9zX3NldHVwKTogTWVudGlvbiByZXF1aXJlZCBweXRob24KLQl2ZXJzaW9uIGZvciBgcmVmZG9jJyB0YXJnZXQuCi0KLTIwMTQtMTEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3NvdXJjZXMucHkgKHJlX2JvbGQsIHJlX2l0YWxpYyk6IFVzZQotCW5vbi1ncm91cGluZyBwYXJlbnRoZXNlcy4KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkgKEh0bWxGb3JtYXR0ZXI6Om1ha2VfaHRtbF93b3JkKToKLQlVcGRhdGVkLgotCi0yMDE0LTExLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfR2x5cGhfTmFtZSk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCi0JSW50cm9kdWNlZCBpbiBwcmV2aW91cyBjaGFuZ2UuICBSZXBvcnRlZCBieSBBbGV4ZWkuCi0KLTIwMTQtMTEtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjLyo6IEFkZCBjaGVja3MgZm9yIHBhcmFtZXRlcnMgb2YgQVBJIGZ1bmN0aW9ucyB3aGVyZSBtaXNzaW5nLgotCi0JYEFQSSBmdW5jdGlvbnMnIGFyZSBmdW5jdGlvbnMgdGFnZ2VkIHdpdGggYEZUX0VYUE9SVF9ERUYnLgotCi0JQmVzaWRlcyB0cml2aWFsIGZpeGVzLCB0aGUgZm9sbG93aW5nIGNoYW5nZXMgYXJlIGluY2x1ZGVkLCB0b28uCi0KLQkqIHNyYy9iYXNlL2Z0YmRmLmMgKEZUX0dldF9CREZfQ2hhcnNldF9JRCwgRlRfR2V0X0JERl9Qcm9wZXJ0eSk6IFNldAotCWVycm9yIGNvZGUgaWYgbm8gc2VydmljZSBpcyBhdmFpbGFibGUuCi0KLQkqIHNyYy9iYXNlL2Z0aW5pdC5jIChGVF9Eb25lX0ZyZWVUeXBlKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBmb3IKLQlpbnZhbGlkIGBsaWJyYXJ5JyBwYXJhbWV0ZXIgdG8gYEludmFsaWRfTGlicmFyeV9IYW5kbGUnLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTmV3X1NpemUpOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGZvciBpbnZhbGlkCi0JYGFzaXplJyBwYXJhbWV0ZXIgdG8gYEludmFsaWRfQXJndW1lbnQnLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfQ29weSk6IENoYW5nZSByZXR1cm4gdmFsdWUgZm9yCi0JaW52YWxpZCBgc291cmNlJyBhbmQgYHRhcmdldCcgcGFyYW1ldGVycyB0byBgSW52YWxpZF9PdXRsaW5lJy4KLQkoRlRfT3V0bGluZV9Eb25lX0ludGVybmFsKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBmb3IgaW52YWxpZAotCWBvdXRsaW5lJyBwYXJhbWV0ZXIgdG8gYEludmFsaWRfT3V0bGluZScuCi0KLTIwMTQtMTEtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NhY2hlL2Z0Y2Jhc2ljLmM6IFVzZSBzaW5nbGUgY2FsbHMgdG8gYEZUX1RSQUNFJy4KLQotMjAxNC0xMS0yNiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBBZGRpdGlvbmFsCi0Jb3ZlcmZsb3cgY2hlY2sgaW4gdGhlIHN1bW1hdGlvbiBvZiBQT1NUIGZyYWdtZW50IGxlbmd0aHMsCi0Jc3VnZ2VzdGVkIGJ5IE1hdGV1c3ogSnVyY3p5ayA8bWp1cmN6eWtAZ29vZ2xlLmNvbT4uCi0KLTIwMTQtMTEtMjYgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChNYWNfUmVhZF9QT1NUX1Jlc291cmNlKTogSW5zZXJ0IGNvbW1lbnRzCi0JYW5kIGZvbGQgdG9vIGxvbmcgdHJhY2luZyBtZXNzYWdlcy4KLQotMjAxNC0xMS0yNiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZpeCBTYXZhbm5haCBidWcgIzQzNTQwLgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jIChwYXJzZV9mb25kKTogUHJldmVudCBhIGJ1ZmZlciBvdmVycnVuCi0JY2F1c2VkIGJ5IGEgZm9udCBpbmNsdWRpbmcgdG9vIG1hbnkgKD4gNjMpIHN0cmluZ3MgdG8gc3RvcmUKLQluYW1lc1tdIHRhYmxlLgotCi0yMDE0LTExLTI2ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoTWFjX1JlYWRfUE9TVF9SZXNvdXJjZSk6IFVzZSB1bnNpZ25lZCBsb25nCi0JdmFyaWFibGVzIHRvIHJlYWQgdGhlIGxlbmd0aHMgaW4gUE9TVCBmcmFnbWVudHMuICBTdWdnZXN0ZWQgYnkKLQlNYXRldXN6IEp1cmN6eWsgPG1qdXJjenlrQGdvb2dsZS5jb20+LgotCi0yMDE0LTExLTI2ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDM1MzkuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChNYWNfUmVhZF9QT1NUX1Jlc291cmNlKTogRml4IGludGVnZXIgb3ZlcmZsb3cKLQlieSBhIGJyb2tlbiBQT1NUIHRhYmxlIGluIHJlc291cmNlLWZvcmsuCi0KLTIwMTQtMTEtMjYgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0MzUzOC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBGaXggaW50ZWdlciBvdmVyZmxvdwotCWJ5IGEgYnJva2VuIFBPU1QgdGFibGUgaW4gcmVzb3VyY2UtZm9yay4KLQotMjAxNC0xMS0yNiAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX1BPU1RfUmVzb3VyY2UpOiBBdm9pZCBtZW1vcnkgbGVhawotCWJ5IGEgYnJva2VuIFBPU1QgdGFibGUgaW4gcmVzb3VyY2UtZm9yay4gIFJldHVybiBhZnRlciBmcmVlaW5nCi0JdGhlIGJ1ZmZlcmVkIFBPU1QgdGFibGUgd2hlbiBpdCBpcyBmb3VuZCB0byBiZSBicm9rZW4uCi0KLTIwMTQtMTEtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSovKjogcy9JbnZhbGlkX0FyZ3VtZW50L0ludmFsaWRfU2l6ZV9IYW5kbGUvIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0yMDE0LTExLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqLyo6IHMvSW52YWxpZF9Bcmd1bWVudC9JbnZhbGlkX1N0cmVhbV9IYW5kbGUvIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0yMDE0LTExLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqLyo6IHMvSW52YWxpZF9Bcmd1bWVudC9JbnZhbGlkX0xpYnJhcnlfSGFuZGxlLyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotMjAxNC0xMS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKi8qOiBzL0ludmFsaWRfQXJndW1lbnQvSW52YWxpZF9PdXRsaW5lLyB3aGVyZSBhcHByb3ByaWF0ZS4KLQotMjAxNC0xMS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKi8qOiBzL0ludmFsaWRfQXJndW1lbnQvSW52YWxpZF9GYWNlX0hhbmRsZS8gd2hlcmUgYXBwcm9wcmlhdGUuCi0KLTIwMTQtMTEtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtTYXZhbm5haCBidWcgIzQzNjgyXSBBZGp1c3Qgc29tZSByZW5kZXJlciBjYWxsYmFja3MuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoZnRfYmxhY2tfc2V0X21vZGUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlgaW50JyB0byBzdGF5IGluIHN5bmMgd2l0aCBgRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMnIHByb3RvdHlwZS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmFzdGVyX3NldF9tb2RlKTogTmV3IGR1bW15IGZ1bmN0aW9uCi0JZm9yIG9ydGhvZ29uYWxpdHkuCi0JKGZ0X2dyYXlzX3Jhc3Rlcik6IFVzZSBpdC4KLQotMjAxNC0xMS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW1NhdmFubmFoIGJ1ZyAjNDM2ODJdIFByb3Blcmx5IGhhbmRsZSBtaXNzaW5nIHJldHVybiBlcnJvcnMuCi0KLQlUaGUgZnVuY3Rpb25zIGluIHRoaXMgcGF0Y2ggKmRvKiByZXR1cm4gbm9uLXRyaXZpYWwgZXJyb3JzIHRoYXQgbXVzdAotCWJlIHRha2VuIGNhcmUgb2YuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2cpLCBzcmMvYmFzZS9mdG9ianMuYwotCShGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwpLCBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfUmVuZGVyKSwKLQlzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKSA8Y2ZmX29wX2VuZGNoYXI+LAotCXNyYy9wc2F1eC9wc29ianMuYyAocHNfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUpLCBzcmMvcHNhdXgvdDFkZWNvZGUKLQkodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykgPG9wX2VuZGNoYXI+LCBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jCi0JKGxvYWRfdHJ1ZXR5cGVfZ2x5cGggPHN1YmdseXBoIGxvb3A+LCB0dF9sb2FkZXJfaW5pdCwKLQlUVF9Mb2FkX0dseXBoKSwgc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfU2V0X01NX0JsZW5kKSwKLQlzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcnVuX2ZwZ20sIHR0X3NpemVfcnVuX3ByZXApOiBEbyBpdC4KLQotMjAxNC0xMS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW1NhdmFubmFoIGJ1ZyAjNDM2ODJdIEFkZC9yZW1vdmUgYHZvaWQnIGNhc3RzIHRvIHNvbWUgZnVuY3Rpb25zLgotCi0JV2UgdXNlIGEgY2FzdCB0byBpbmRpY2F0ZSB0aGF0IHdlIGludGVudGlvbmFsbHkgaWdub3JlIGEgZnVuY3Rpb24ncwotCXJldHVybiB2YWx1ZS4gIEhvd2V2ZXIsIHRoaXMgZG9lc24ndCBhcHBseSB0byBBUEkgZnVuY3Rpb25zIHdoZXJlCi0JZXJyb3JzIGNhbiBvbmx5IGhhcHBlbiBmb3IgdHJpdmlhbGx5IGludmFsaWQgaW5wdXQuCi0KLQkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKEZUX0dseXBoX1N0cm9rZSwgRlRfR2x5cGhfU3Ryb2tlQm9yZGVyKSwKLQlzcmMvYmFzZS9mdHN5bnRoLmMgKEZUX0dseXBoU2xvdF9FbWJvbGRlbiksIHNyYy9jZmYvY2ZmZ2xvYWQuYwotCShjZmZfc2xvdF9sb2FkKSwgc3JjL3Bmci9wZnJkcml2ci5jIChwZnJfZ2V0X2tlcm5pbmcpLAotCXNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZW5jb2RpbmcpLCBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMKLQkodDQyX3BhcnNlX2VuY29kaW5nKTogRG8gaXQuCi0KLTIwMTQtMTEtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtTYXZhbm5haCBidWcgIzQzNjgyXSBDaGFuZ2Ugc29tZSBzaWduYXR1cmVzIHRvIGB2b2lkJyByZXR1cm4gdHlwZS4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9wc2hpbnRzLmggKFBTSF9HbG9iYWxzX1NldFNjYWxlRnVuYyksCi0JaW5jbHVkZS9pbnRlcm5hbC9zZm50LmggKFRUX0dldF9NZXRyaWNzX0Z1bmMpLAotCXNyYy9wc2hpbnRlci9wc2hnbG9iLmMgKHBzaF9nbG9iYWxzX3NldF9zY2FsZSksCi0Jc3JjL3BzaGludGVyL3BzaHJlYy5jIChwc19oaW50c19pbml0KSwgc3JjL3NmbnQvdHRtdHguYwotCSh0dF9mYWNlX2dldF9tZXRyaWNzKSwgc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX0dvdG9fQ29kZVJhbmdlLAotCVRUX1NldF9Db2RlUmFuZ2UsIFRUX0NsZWFyX0NvZGVSYW5nZSwgVFRfRG9uZV9Db250ZXh0LAotCVRUX1NhdmVfQ29udGV4dCk6IERvIGl0LgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoZ2xvYi5oLCBzcmMvcHNoaW50ZXIvcHNocmVjLmgsIHNyYy9zZm50L3R0bXR4LmgsCi0Jc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfSGludF9HbHlwaCksIHNyYy90cnVldHlwZS90dGludGVycC5jCi0JKFRUX1J1bl9Db250ZXh0KSwgc3JjL3RydWV0eXBlL3R0aW50ZXJwLmgsIHNyYy90cnVldHlwZS90dG9ianMuYwotCSh0dF9zaXplX3J1bl9mcGdtLCB0dF9zaXplX3J1bl9wcmVwKTogVXBkYXRlZC4KLQotMjAxNC0xMS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmVtb3ZlIGFsbCBjb2RlIHJlbGF0ZWQgdG8gRlRfTUFYX0NIQVJNQVBfQ0FDSEVBQkxFLgotCi0JVGhpcyBpcyBubyBsb25nZXIgdXNlZC4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMsIHNyYy9jYWNoZS9mdGNjbWFwLmMsIHNyYy9jZmYvY2Zmb2Jqcy5jLAotCXNyYy9zZm50L3R0Y21hcC5jOiBEbyBpdC4KLQotMjAxNC0xMS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBTYXZhbm5haCBidWcgIzQzNjgwLgotCi0JVGhpcyBhZGRzIGFuIGFkZGl0aW9uYWwgY29uc3RyYWludCB0byBtYWtlIHRoZSBmaXggZnJvbSAyMDEzLTAxLTI1Ci0JcmVhbGx5IHdvcmsuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSkgPGluZGV4X2Zvcm1hdD09ND46Ci0JQ2hlY2sgYHAnIGJlZm9yZSBgbnVtX2dseXBocycuCi0KLTIwMTQtMTEtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IFNhdmFubmFoIGJ1ZyAjNDM2NzkuCi0KLQkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfbG9hZF9oZG14KTogQ2hlY2sgbWluaW11bSBzaXplIG9mCi0JYHJlY29yZF9zaXplJy4KLQotMjAxNC0xMS0yNCAgSmFya2tvIFDDtnlyeSAgPGphcmtrby5wb3lyeUBnbWFpbC5jb20+Ci0KLQlbY2ZmLCBwZnIsIHBzYXV4LCB3aW5mb250c10gRml4IFNhdmFubmFoIGJ1ZyAjNDM2NzYuCi0KLQlEb24ndCBjYXN0IGNtYXAgaW5pdCBmdW5jdGlvbiBwb2ludGVycyB0byBhbiBpbmNvbXBhdGlibGUgdHlwZS4KLQotCVdpdGhvdXQgdGhpcyBwYXRjaCwgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGJldHdlZW4gZGVjbGFyYXRpb24gYW5kCi0JdGhlIHJlYWwgc2lnbmF0dXJlIGRpZmZlcnMuICBDYWxsaW5nIHN1Y2ggYSBmdW5jdGlvbiByZXN1bHRzIGluCi0JdW5kZWZpbmVkIGJlaGF2aW9yLgotCi0JICBJU08vSUVDIDk4OTk6VEMzIChDb21taXR0ZWUgRHJhZnQgU2VwdGVtYmVyIDcsIDIwMDcpCi0JICAgIDYuNS4yLjIgRnVuY3Rpb24gY2FsbHMKLQkgICAgICA5IElmIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIHdpdGggYSB0eXBlIHRoYXQgaXMgbm90Ci0JICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgKG9mIHRoZSBleHByZXNzaW9uKSBwb2ludGVkIHRvIGJ5Ci0JICAgICAgICB0aGUgZXhwcmVzc2lvbiB0aGF0IGRlbm90ZXMgdGhlIGNhbGxlZCBmdW5jdGlvbiwgdGhlCi0JICAgICAgICBiZWhhdmlvciBpcyB1bmRlZmluZWQuCi0KLQlPbiBjZXJ0YWluIHBsYXRmb3JtcyAoYyAtPiBqcyB3aXRoIGVtc2NyaXB0ZW4pIHRoaXMgY2F1c2VzCi0JdGVybWluYXRpb24gb2YgZXhlY3V0aW9uIG9yIGludmFsaWQgY2FsbHMgYmVjYXVzZSBpbiB0aGUgZW1zY3JpcHRlbgotCWltcGxlbWVudGF0aW9uLCBmdW5jdGlvbiBwb2ludGVycyBvZiBkaWZmZXJlbnQgdHlwZXMgYXJlIHN0b3JlZCBpbgotCWRpZmZlcmVudCBwb2ludGVyIGFycmF5cy4gIEluY29ycmVjdCBwb2ludGVyIHR5cGUgaGVyZSByZXN1bHRzIGluCi0JaW5kZXhpbmcgb2YgYW4gaW5jb3JyZWN0IGFycmF5LgotCi0JKiBzcmMvY2ZmL2NmZmNtYXAuYyAoY2ZmX2NtYXBfZW5jb2RpbmdfaW5pdCwgY2ZmX2NtYXBfdW5pY29kZV9pbml0KSwKLQlzcmMvcGZyL3BmcmNtYXAuYyAocGZyX2NtYXBfaW5pdCksIHNyYy9wc2F1eC90MWNtYXAuYwotCXQxX2NtYXBfc3RhbmRhcmRfaW5pdCwgdDFfY21hcF9leHBlcnRfaW5pdCwgdDFfY21hcF9jdXN0b21faW5pdCwKLQl0MV9jbWFwX3VuaWNvZGVfaW5pdCksIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2NtYXBfaW5pdCk6IEZpeAotCXNpZ25hdHVyZS4KLQotMjAxNC0xMS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBTYXZhbm5haCBidWcgIzQzNjcyLgotCi0JKiBzcmMvc2ZudC90dGtlcm4uYyAodHRfZmFjZV9sb2FkX2tlcm4pOiBVc2UgY29ycmVjdCB2YWx1ZSBmb3IKLQltaW5pbXVtIHRhYmxlIGxlbmd0aCB0ZXN0LgotCi0yMDE0LTExLTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTEsIHR5cGU0Ml0gQW5vdGhlciBmaXggZm9yIFNhdmFubmFoIGJ1ZyAjNDM2NTUuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfY2hhcnN0cmluZ3MpLCBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMKLQkodDQyX3BhcnNlX2NoYXJzdHJpbmdzKTogQWRkIGFub3RoZXIgYm91bmRhcnkgdGVzdGluZy4KLQotMjAxNC0xMS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBGb3JtYXR0aW5nLCBjb3B5cmlnaHQsIGltcHJvdmVkIGRvY3VtZW50YXRpb24uCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci8qOiBObyBjb2RlIGNoYW5nZXMgYmVzaWRlcyB0cml2aWFsCi0JbW9kaWZpY2F0aW9ucy4KLQotMjAxNC0xMS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gRml4IFNhdmFubmFoIGJ1ZyAjNDM2NjAuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcGFyc2VfZ2x5cGhzKSA8IkVOREZPTlQiPjogQ2hlY2sKLQlgX0JERl9HTFlQSF9CSVRTJy4KLQotMjAxNC0xMS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGU0Ml0gQWxsb3cgb25seSBlbWJlZGRlZCBUcnVlVHlwZSBmb250cy4KLQotCVRoaXMgaXMgYSBmb2xsb3ctdXAgdG8gU2F2YW5uYWggYnVnICM0MzY1OS4KLQotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmMgKFQ0Ml9GYWNlX0luaXQpOiBFeGNsdXNpdmVseSB1c2UgdGhlCi0JYHRydWV0eXBlJyBmb250IGRyaXZlciBmb3IgbG9hZGluZyB0aGUgZm9udCBjb250YWluZWQgaW4gdGhlIGBzZm50cycKLQlhcnJheS4KLQotMjAxNC0xMS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGU0Ml0gRml4IFNhdmFubmFoIGJ1ZyAjNDM2NTkuCi0KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfT3Blbl9GYWNlKTogSW5pdGlhbGl6ZSBgZmFjZS0+dHRmX3NpemUnLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9zZm50cyk6IEFsd2F5cyBzZXQKLQlgZmFjZS0+dHRmX3NpemUnIGRpcmVjdGx5LiAgVGhpcyBlbnN1cmVzIGEgY29ycmVjdCBzdHJlYW0gc2l6ZSBpbgotCXRoZSBjYWxsIHRvIGBGVF9PcGVuX0ZhY2UnLCB3aGljaCBmb2xsb3dzIGFmdGVyIHBhcnNpbmcsIGV2ZW4gZm9yCi0JYnVnZ3kgaW5wdXQgZGF0YS4KLQlGaXggZXJyb3IgbWVzc2FnZXMuCi0KLTIwMTQtMTEtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBTYXZhbm5haCBidWcgIzQzNjU4LgotCi0JKiBzcmMvY2ZmL2NmMmZ0LmMgKGNmMl9idWlsZGVyX2xpbmVUbywgY2YyX2J1aWxkZXJfY3ViZVRvKTogSGFuZGxlCi0JcmV0dXJuIHZhbHVlcyBvZiBwb2ludCBhbGxvY2F0aW9uIHJvdXRpbmVzLgotCi0yMDE0LTExLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IFNhdmFubmFoIGJ1ZyAjNDM2NTYuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9jbWFwNF92YWxpZGF0ZSk6IEZpeCBvcmRlciBvZiB2YWxpZGl0eQotCXRlc3RzLgotCi0yMDE0LTExLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTEsIHR5cGU0Ml0gRml4IFNhdmFubmFoIGJ1ZyAjNDM2NTUuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfY2hhcnN0cmluZ3MpLCBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMKLQkodDQyX3BhcnNlX2NoYXJzdHJpbmdzKTogRml4IGJvdW5kYXJ5IHRlc3RpbmcuCi0KLTIwMTQtMTEtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfbWV0cmljcyk6IFNhbml0aXplIGludmFsaWQgbWV0cmljcy4KLQotMjAxNC0xMS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Z0bGNkZmlsXSBPYmV5IGZsb3cgZGlyZWN0aW9uLgotCi0JKiBzcmMvYmFzZS9mdGxjZGZpbC5jIChfZnRfbGNkX2ZpbHRlcl9maXIsIF9mdF9sY2RfZmlsdGVyX2xlZ2FjeSk6Ci0JSGFuZGxlIGB1cCcgZmxvdy4KLQotMjAxNC0xMS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfQ29udmVydCk6IEltcHJvdmUuCi0KLQlUaGlzIGNvbW1pdCBjb21wbGV0ZXMgYXJndW1lbnQgY2hlY2tzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIGRpZmZlcmVudAotCWZsb3cgZGlyZWN0aW9ucy4KLQotMjAxNC0xMS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfQ29weSk6IEltcHJvdmUuCi0KLQlUaGlzIGNvbW1pdCBhZGRzIGFyZ3VtZW50IGNoZWNrcyBhbmQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGZsb3cKLQlkaXJlY3Rpb25zLgotCi0yMDE0LTExLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKEZUX0JpdG1hcF9OZXcpOiBDaGVjayBhcmd1bWVudC4KLQotMjAxNC0xMS0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQ2hhbmdlIHNvbWUgZmllbGRzIGluIGBGVF9CaXRtYXAnIHRvIHVuc2lnbmVkIHR5cGUuCi0KLQlUaGlzIGRvZXNuJ3QgYnJlYWsgQUJJLgotCi0JKiBpbmNsdWRlL2Z0aW1hZ2UuaCAoRlRfQml0bWFwKTogTWFrZSBgcm93cycsIGB3aWR0aCcsIGBudW1fZ3JheXMnLAotCWBwaXhlbF9tb2RlJywgYW5kIGBwYWxldHRlX21vZGUnIHVuc2lnbmVkIHR5cGVzLgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jOiBVcGRhdGVkLgotCShGVF9CaXRtYXBfQ29weSk6IEZpeCBjYXN0cy4KLQotCSogc3JjL2NhY2hlL2Z0Y3NiaXRzLmMsIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYywgc3JjL3NmbnQvcG5nc2hpbS5jOgotCVVwZGF0ZWQuCi0KLTIwMTQtMTEtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgYEZUX0JpdG1hcF9Db252ZXJ0JyBjb3JyZWN0bHkgaGFuZGxlIG5lZ2F0aXZlIGBwaXRjaCcgdmFsdWVzLgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfQ29udmVydCk6IEFsd2F5cyB1c2UgcG9zaXRpdmUgdmFsdWUKLQlmb3IgdGhlIHBpdGNoIHdoaWxlIGNvcHlpbmcgZGF0YS4KLQlDb3JyZWN0bHkgc2V0IHBpdGNoIHNpZ24gaW4gdGFyZ2V0IGJpdG1hcC4KLQotMjAxNC0xMS0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWlub3IgY29kZSBpbXByb3ZlbWVudCBpbiBgRlRfQml0bWFwX0VtYm9sZGVuJy4KLQotCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoRlRfQml0bWFwX0VtYm9sZGVuKSA8RlRfUElYRUxfTU9ERV9HUkFZWzI0XT46Ci0JRml4IHRoaW5rby4KLQotMjAxNC0xMS0xOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jOiBVc2UgZGVkaWNhdGVkIGBGVF9BbmdsZScgZm9yIGFyY3RhbiB0YWJsZS4KLQotMjAxNC0xMS0xOSAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlBdm9pZCBjb21waWxlciB3YXJuaW5ncyBvbiB4ODYtNjQgZm9yIGBGVF9NdWxGaXgnLgotCi0JYEZUX011bEZpeCcgdGFrZXMgYEZUX0xvbmcnIHBhcmFtZXRlcnMgYXMgZGVmaW5lZCBpbiBgZnJlZXR5cGUuaCcsCi0JYnV0IHNldmVyYWwgaW5saW5lIGltcGxlbWVudGF0aW9ucyBvZiBpdCBpbiBgZnRjYWxjLmgnIHRha2UKLQlgRlRfSW50MzInIGFyZ3VtZW50cy4gIFRoaXMgaXMgY2F1c2luZyBjb21waWxlciB3YXJuaW5ncyBvbiB4ODYtNjQ6Ci0JSWYgcGFyYW1ldGVycyBvZiB0eXBlIGBGVF9GaXhlZCcgKD0gYEZUX0xvbmcnKSBhcmUgcGFzc2VkIHRvIHRoZQotCWlubGluZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLCBpbnRlZ2VyIHZhbHVlcyBhcmUgdHJ1bmNhdGVkCi0JZnJvbSA2NGJpdCB0byAzMmJpdC4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9mdGNhbGMuaCAoRlRfTXVsRml4KSBbRlRfTVVMRklYX0FTU0VNQkxFUl06IEFkZAotCWNhc3RzLgotCi0yMDE0LTExLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IFNhdmFubmFoIGJ1ZyAjNDM1OTcuCi0KLQkqIHNyYy9zZm50L3BuZ3NoaW0uYyAoTG9hZF9TQml0X1BuZyk6IFByb3RlY3QgYWdhaW5zdCB0b28gbGFyZ2UKLQliaXRtYXBzLgotCi0yMDE0LTExLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IFNhdmFubmFoIGJ1ZyAjNDM1OTEuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfaW5pdCk6IFByb3RlY3QgYWdhaW5zdCBhZGRpdGlvbgotCWFuZCBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvdy4KLQotMjAxNC0xMS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBTYXZhbm5haCBidWcgIzQzNTkwLgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoY2hlY2tfdGFibGVfZGlyLCB0dF9mYWNlX2xvYWRfZm9udF9kaXIpOgotCVByb3RlY3QgYWdhaW5zdCBhZGRpdGlvbiBvdmVyZmxvdy4KLQotMjAxNC0xMS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBTYXZhbm5haCBidWcgIzQzNTg5LgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAod29mZl9vcGVuX2ZvbnQpOiBQcm90ZWN0IGFnYWluc3QgYWRkaXRpb24KLQlvdmVyZmxvdy4KLQotMjAxNC0xMS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBTYXZhbm5haCBidWcgIzQzNTg4LgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDhfdmFsaWRhdGUsIHR0X2NtYXAxMF92YWxpZGF0ZSwKLQl0dF9jbWFwMTJfdmFsaWRhdGUsIHR0X2NtYXAxM192YWxpZGF0ZSwgdHRfY21hcDE0X3ZhbGlkYXRlKTogUHJvdGVjdAotCWFnYWluc3Qgb3ZlcmZsb3cgaW4gYWRkaXRpb25zIGFuZCBtdWx0aXBsaWNhdGlvbnMuCi0KLTIwMTQtMTEtMTAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBDT1JESUMgaW1wcm92ZW1lbnRzLgotCi0JVGhlIHNjYWxpbmcgYmV0d2VlbiB0aGUgaHlwb3RlbnVzZSBhbmQgaXRzIENPUkRJQyBhcHByb3hpbWF0aW9uIGlzCi0JYmFzZWQgb24gcmVncmVzc2lvbiBhbmFseXNpcy4gVGhlIHNtYWxsZXIgcGFkZGluZyBmb3IgYHRoZXRhJyBpcwotCWp1c3RpZmllZCBieSBpdHMgbWF4aW11bSBlcnJvciBvZiBsZXNzIHRoYW4gNi4KLQotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoZnRfdHJpZ19kb3duc2NhbGUpOiBCb3Jyb3cgY29kZSBmcm9tCi0JLi9mdGNhbGMuYyAoZnRfbXVsdG82NCksIGNoYW5nZSBsaW5lYXIgaW50ZXJjZXB0LgotCShmdF90cmlnX3BzZXVkb19wb2xhcml6ZSk6IERlY3JlYXNlIGB0aGV0YScgcGFkZGluZy4KLQotMjAxNC0xMS0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdHN0cm9rZS5jIChmdF9zdHJva2VyX2luc2lkZSk6IEZpeCBib3JkZXIgaW50ZXJzZWN0aW9ucy4KLQotCU9uZSBtb3JlIHBsYWNlIHRvIGNoZWNrIHdoZXRoZXIgYHJhZGl1cycgaXMgemVyby4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTWFyY28gV2VydHogPG1hcmNvLndlcnR6QGdteC5kZT4uCi0KLTIwMTQtMTEtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGZdIEZpeCBTYXZhbm5haCBidWcgIzQzNTM1LgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3N0cm5jbXApOiBOZXcgbWFjcm8gdGhhdCBjaGVja3Mgb25lCi0JY2hhcmFjdGVyIG1vcmUgdGhhbiBgc3RybmNtcCcuCi0Jcy9mdF9zdHJuY21wL19iZGZfc3RybmNtcC8gZXZlcnl3aGVyZS4KLQotMjAxNC0xMS0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gRml4IFNhdmFubmFoIGJ1ZyAjNDM1NDguCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X2VuY29kaW5ncyk6IEFkZCBzYW5pdHkgY2hlY2tzIGZvciByb3cKLQlhbmQgY29sdW1uIHZhbHVlcy4KLQotMjAxNC0xMS0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gRml4IFNhdmFubmFoIGJ1ZyAjNDM1NDcuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfcmVhZF9UT0MpOiBDaGVjayBgc2l6ZScgYW5kIGBvZmZzZXQnCi0JdmFsdWVzLgotCi0yMDE0LTExLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfcmVhZF9UT0MpOiBBdm9pZCBtZW1vcnkgbGVhay4KLQotMjAxNC0xMS0wMyAgSW5maW5hbGl0eSAgPGluZmluYWxpdHlAaW5maW5hbGl0eS5uZXQ+Ci0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5jIChDT01QQVRJQklMSVRZX01PREVfUnVsZXMpOiBVcGRhdGVkLgotCi0JVGhlIHByZXZpb3VzIGNvbW1pdCBkZXRlcmlvcmF0ZXMgcmVuZGVyaW5nIG9mIERlamFWdSBhbmQgc2ltaWxhcgotCWZvbnRzOyB0aGlzIGdldHMgY29tcGVuc2F0ZWQgd2l0aCB0aGlzIHJ1bGUuCi0KLTIwMTQtMTEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19ERUxUQVApOiBGaXggc3VicGl4ZWwgaGludGluZy4KLQotCUJlZm9yZSB0aGlzIHBhdGNoLCBpdCB3YXMgaW1wb3NzaWJsZSB0byBldmVyIGNhbGwgREVMVEFQWzEyM10gaW4KLQlzdWJwaXhlbCBoaW50aW5nIG1vZGUgYXMgZGVzY3JpYmVkIGluIHRoZSBDbGVhclR5cGUgd2hpdGVwYXBlcjsgaXQKLQlvbmx5IHdvcmtlZCBpZiBpbiBgY29tcGF0aWJpbGl0eSBtb2RlJy4gIEhvd2V2ZXIsIGNvbXBhdGliaWxpdHkgbW9kZQotCWVzc2VudGlhbGx5IGRpc2FibGVzIFNIUElYLCBjb21wbGV0ZWx5IHJ1aW5pbmcgaGludGluZyBvZgotCXR0ZmF1dG9oaW50IG91dHB1dCwgZm9yIGV4YW1wbGUuCi0KLQlXZSBub3cgZm9sbG93IHRoZSB3aGl0ZXBhcGVyIG1vcmUgY2xvc2VseSBzbyB0aGF0IERFTFRBUFsxMjNdCi0JaW5zdHJ1Y3Rpb25zIGZvciB0b3VjaGVkIHBvaW50cyBpbiB0aGUgbm9uLXN1YnBpeGVsIGRpcmVjdGlvbiBhcmUKLQlleGVjdXRlZC4KLQotMjAxNC0xMC0zMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gSW1wcm92ZSBjb2RlIHJlYWRhYmlsaXR5LgotCi0JKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyk6IFJlYXJyYW5nZSBjb2RlLgotCi0yMDE0LTEwLTMxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBSZWR1Y2Ugb3V0bGluZSB0cmFuc2xhdGlvbnMgZHVyaW5nIHJlbmRlcmluZy4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBUcmFuc2xhdGUgb3JpZ2luCi0JdmlydHVhbGx5IGJ5IG1vZGlmeWluZyBjYm94LCBhY3R1YWxseSB0cmFuc2xhdGUgb3V0bGluZSBpZiBjdW11bGF0aXZlCi0Jc2hpZnQgaXMgbm90IHplcm8uCi0KLTIwMTQtMTAtMzAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIEZpeCBTYXZhbm5haCBidWcgIzM1NjA0IChjb250J2QpLgotCi0JKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyk6IFJlbW92ZSBjaGVja3MgYW5kCi0JY2FzdHMgdGhhdCBiZWNhbWUgdW5uZWNlc3NhcnkgYWZ0ZXIgdGhlIHZhcmlhYmxlIHR5cGUgdXBncmFkZXMuCi0KLTIwMTQtMTAtMjkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIEltcHJvdmUgY29kZSByZWFkYWJpbGl0eS4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBSZWFycmFuZ2UgY29kZS4KLQotMjAxNC0xMC0yOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JVW5pZnkgaHlwb3RlbnVzZSBhcHByb3hpbWF0aW9ucy4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9mdGNhbGMuaCAoRlRfSFlQT1QpOiBNb3ZlIG1hY3JvIGZyb20gaGVyZS4uLgotCSogaW5jbHVkZS9pbnRlcm5hbC9mdG9ianMuaDogLi4uIHRvIGhlcmUsIG5leHQgdG8gcmVxdWlyZWQgYEZUX0FCUycuCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfY3ViaWMpOiBVc2UgaXQgaGVyZS4KLQotMjAxNC0xMC0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gVGVzdCB2YWxpZCBkYXJrZW5pbmcgcGFyYW1ldGVyIG1hY3JvcyBpbiBgZnRvcHRpb24uaCcuCi0KLQlXZSBubyBsb25nZXIgbmVlZCBhbiBvdGhlcndpc2UgdW51c2VkIHR5cGVkZWYgdGhhdCBjYW4gY2F1c2UgYSBnY2MKLQl3YXJuaW5nLgotCVByb2JsZW0gcmVwb3J0ZWQgYnkgQWxleGVpLgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2RyaXZlcl9pbml0KTogVXNlCi0JYENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWFhYJyBtYWNyb3MgZGlyZWN0bHkuCi0JKFNFVF9EQVJLRU5JTkdfUEFSQU1FVEVSUyk6IFJlbW92ZWQuCi0JQ29tcGlsZSB0aW1lIHRlc3RzIGFyZSBub3cgLi4uCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmgsIGluY2x1ZGUvY29uZmlnL2Z0b3B0aW9uLmg6IC4uLiBoZXJlLgotCi0yMDE0LTEwLTI1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlJbXByb3ZlIGZsYXQgY29ybmVyIGRlZmluaXRpb24uCi0KLQkqIGluY2x1ZGUvaW50ZXJuYWwvZnRjYWxjLmggKEZUX0hZUE9UKTogTWFjcm8gdG8gYXBwcm94aW1hdGUgRXVjbGlkZWFuCi0JZGlzdGFuY2Ugd2l0aCB0aGUgYWxwaGEgbWF4IHBsdXMgYmV0YSBtaW4gYWxnb3JpdGhtLgotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKGZ0X2Nvcm5lcl9pc19mbGF0KTogVXNlIGl0IGluc3RlYWQgb2YgVGF4aWNhYgotCW1ldHJpYy4KLQotMjAxNC0xMC0yMyAgRGF2aWQgV2Vpw58gIDxEYXZpZC5XZWlzc0BwdHZncm91cC5jb20+Ci0KLQlbYnVpbGRdIEltcHJvdmUgcHJvcGVydHkgZmlsZSBmb3IgdmMyMDEwLgotCi0JVXNlci1kZWZpbmVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGVtcHR5IGJ5IGRlZmF1bHQgdG8gcHJldmVudCBsaW5rZXIKLQlmYWlsdXJlcy4KLQotCSogYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnVzZXIucHJvcHMsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6Ci0Jcy9PcHRpb25zRGlyZWN0b3J5L1VzZXJPcHRpb25EaXJlY3RvcnkvLgotCUNvbW1lbnQgb3V0IGFsbCB1c2VyIG9wdGlvbnMuCi0KLTIwMTQtMTAtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFdvcmsgYXJvdW5kIGJ1ZyBpbiBwcmVwcm9jZXNzb3Igb2YgTVNWQyAyMDEwLgotCi0JV2UgaGF2ZSBiZWVuIGhpdCBieQotCi0JICBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9WaXN1YWxTdHVkaW8vZmVlZGJhY2svZGV0YWlscy83MTg5NzYvbXN2Yy1wcgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2NvbmZpZy9mdG9wdGlvbi5oOiBSZXBsYWNlCi0JYENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJTJyB3aXRoIGVpZ2h0IG1hY3JvcwotCWBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX3tYLFl9ezEsMiwzLDR9Jy4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmMgKFNFVF9EQVJLRU5JTkdfUEFSQU1FVEVSUyk6IFJlbW92ZWQuICBXZSBubwotCWxvbmdlciBuZWVkIGRvdWJsZSBleHBhbnNpb24uCi0JKFNFVF9EQVJLRU5JTkdfUEFSQU1FVEVSU18wKTogUmVuYW1lZCB0byAuLi4KLQkoU0VUX0RBUktFTklOR19QQVJBTUVURVJTKTogLi4uIHRoaXMuCi0JVXBkYXRlIGNhbGwuCi0KLTIwMTQtMTAtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzYml0XSBNaW5vciBmaXhlcy4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zYml0KSBbVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVhdOgotCUFjY2VwdCBvdmVybGF5IGZvcm1hdCBhbHNvLCBidXQgZW1pdCB3YXJuaW5nIG1lc3NhZ2UgaW4gdGhhdCBjYXNlLgotCSh0dF9zYml0X2RlY29kZXJfbG9hZF9tZXRyaWNzKTogQWRkIG1pc3NpbmcgbmV3bGluZSB0byBlcnJvcgotCW1lc3NhZ2UuCi0JKHR0X3NiaXRfbG9hZF9zYml4X2ltYWdlKTogQWRkIGByZ2JsJyBncmFwaGljIHR5cGUgKGFzIHVzZWQgb24gaU9TCi0JNy4xKSB0byB0aGUgbGlzdCBvZiB1bnN1cHBvcnRlZCBmb3JtYXRzLgotCi0yMDE0LTEwLTE5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbdHJ1ZXR5cGVdIENsZWFuIHVwIGJ5dGVjb2RlIHJvdW5kaW5nLgotCi0JWmVybyBkaXN0YW5jZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHRyZWF0ZWQgc3BlY2lhbGx5IGlmIHlvdSBmb2xsb3cKLQlzcGVjaWZpY2F0aW9ucyBhbmQgY2hlY2sgdGhlIHNpZ24gYXMgdGhlIHZlcnkgbGFzdCBzdGVwIG9mIHJvdW5kaW5nLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoUm91bmRfTm9uZSwgUm91bmRfVG9fR3JpZCwKLQlSb3VuZF9Eb3duX1RvX0dyaWQsIFJvdW5kX1VwX1RvX0dyaWQsIFJvdW5kX1RvX0RvdWJsZV9HcmlkKTogVXNlCi0JbWFjcm9zIHdoZW4gYXZhaWxhYmxlLCBkbyBub3QgY2hlY2sgZm9yIG5vbi16ZXJvIGRpc3RhbmNlLgotCShSb3VuZF9Ub19IYWxmX0dyaWQsIFJvdW5kX1N1cGVyLCBSb3VuZF9TdXBlcl80NSk6IERpdHRvLCByZXR1cm4gcGhhc2UKLQlpZiBzaWduIGNoYW5nZWQuCi0KLTIwMTQtMTAtMTggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVt0cnVldHlwZV0gVW53cmFwIGVuZ2luZSBjb21wZW5zYXRpb24gc2V0dGluZ3MuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfc2l6ZV9pbml0X2J5dGVjb2RlKTogVXBkYXRlZC4KLQotMjAxNC0xMC0xOCAgRGF2aWQgV2Vpw58gIDxEYXZpZC5XZWlzc0BwdHZncm91cC5jb20+Ci0KLQlbYnVpbGRdIEFkZCBwcm9wZXJ0eSBmaWxlIHRvIHZjMjAxMCBwcm9qZWN0LgotCi0JVGhpcyBzaW1wbGlmaWVzIGN1c3RvbSBidWlsZCBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSBmb3IKLQlhdXRvbWF0ZWQgYnVpbGQgZW52aXJvbm1lbnRzLgotCi0JKiBidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudXNlci5wcm9wczogTmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotCSogYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IEluY2x1ZGUKLQlgZnJlZXR5cGUudXNlci5wcm9wcycgYW5kIHVzZSBpdHMgZGF0YSBmaWVsZHMuCi0KLQkqIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sOiBVcGRhdGVkLgotCi0yMDE0LTEwLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIGJsdWUtem9uZSBzdXBwb3J0IGZvciBUZWx1Z3UuCi0KLQlUaGlzIGVzc2VudGlhbGx5IG1vdmVzIHRoZSBUZWx1Z3Ugc2NyaXB0IGZyb20gdGhlIGBJbmRpYycgaGludGVyIHRvCi0JdGhlIGBMYXRpbicgaGludGVyLgotCi0JTm90ZSB0aGF0IHRoaXMgaXMgYSBmaXJzdCBzaG90IGFuZCBxdWl0ZSBjZXJ0YWlubHkgbmVlZHMKLQlyZWZpbmVtZW50cy4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBUZWx1Z3UuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBUZWx1Z3Ugc3RhbmRhcmQgY2hhcmFjdGVycyBhbmQgbW92ZQotCWRhdGEgb3V0IG9mIEFGX0NPTkZJR19PUFRJT05fSU5ESUMgYmxvY2suCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmM6IE1vdmUgVGVsdWd1IGRhdGEgb3V0IG9mCi0JQUZfQ09ORklHX09QVElPTl9JTkRJQyBibG9jay4KLQotCSogc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogVXBkYXRlIFRlbHVndSBkYXRhOyBpbiBwYXJ0aWN1bGFyLCB1c2UKLQlBRl9XUklUSU5HX1NZU1RFTV9MQVRJTi4KLQotMjAxNC0xMC0xOCAgRGF2aWQgV2ltc2V5ICA8ZGF2aWRAd2ltc2V5LnVzPgotCi0JW2NtYWtlXSBBZGQgaU9TIGJ1aWxkIHN1cHBvcnQuCi0JRnJvbSBTYXZhbm5haCBwYXRjaCAjODQ5Ny4KLQotCSogYnVpbGRzL2NtYWtlL2lPUy5jbWFrZTogTmV3IGZpbGUuICBVbml2ZXJzYWwgYmluYXJpZXMgYXJlIGJ1aWx0Ci0Jd2l0aCBib3RoIDMyIGFuZCA2NCBiaXQgYXJtIGFyY2hpdGVjdHVyZXMuCi0KLQkqIENNYWtlTGlzdHMudHh0IChJT1NfUExBVEZPUk0pOiBOZXcgdmFyaWFibGUgZm9yIHJ1bm5pbmcgdGhlIGlPUwotCXRvb2xjaGFpbi4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgYE9TJyB0byBidWlsZCBvbiBpT1MsIG9yCi0JYFNJTVVMQVRPUicgdG8gYnVpbGQgb24gQVBQTEUuCi0KLTIwMTQtMTAtMTYgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBBZGQgYENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJTJyBjb25maWcgbWFjcm8uCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmgsIGluY2x1ZGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUlMpOiBOZXcgbWFjcm8uCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChTRVRfREFSS0VOSU5HX1BBUkFNRVRFUlMsCi0JU0VUX0RBUktFTklOR19QQVJBTUVURVJTXzApOiBOZXcgbWFjcm9zLgotCShjZmZfZHJpdmVyX2luaXQpOiBVc2UgbmV3IG1hY3Jvcy4KLQotMjAxNC0xMC0xNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBMaW1pdCBkZWx0YSBzaGlmdCByYW5nZS4KLQotCVRoZSB2YWxpZCByYW5nZSBmb3IgZGVsdGEgc2hpZnQgaXMgemVybyB0aHJvdWdoIHNpeC4gIE5lZ2F0aXZlIHZhbHVlcwotCWFyZSBpbnZhbGlkIGFjY29yZGluZyB0bwotCi0JICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA0L0NoYXA0Lmh0bWwjZGVsdGElMjBzaGlmdAotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmggKGRlbHRhX3NoaWZ0LCBkZWx0YV9iYXNlKTogTWFrZSB1bnNpZ25lZC4KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5oIChET19TRFMpOiBUaHJvdyBhbiBlcnJvciBpZiBgZGVsdGFfc2hpZnQnCi0JaXMgb3V0IG9mIHJhbmdlLgotCShJbnNfREVMVEFQLCBJbnNfREVMVEFDKTogT3B0aW1pemUgZm9yIHZhbGlkIGBkZWx0YV9zaGlmdCcuCi0KLTIwMTQtMTAtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUEgYmV0dGVyIGZpeCBmb3IgU2F2YW5uYWggYnVnICM0MzM5Mi4KLQlTdWdnZXN0ZWQgYnkgRG91ZyBGZWx0IDxkb3VnZmVsdEBnbWFpbC5jb20+LgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAodHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyk6IFNldAotCWB2ZXJ0QWR2YW5jZScgdG8gemVyby4uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0dseXBoKTogLi4uIGFuZCBzZXQgaGVyZSBhIGRlZmF1bHQKLQl2YWx1ZSBmb3IgYHZlcnRBZHZhbmNlJyBiYXNlZCBvbiBgbGluZWFyVmVydEFkdmFuY2UnIGluIGNhc2UKLQlgdmVydEFkdmFuY2UnIGlzIHplcm8uICBOb3RlIHRoYXQgdGhlIHByZXZpb3VzIGNvbXB1dGVkIGFkLWhvYyB2YWx1ZQotCWZvciBgbGluZWFyVmVydEFkdmFuY2UnIHdhcyBhcHBhcmVudGx5IG5vdCB0ZXN0ZWQgaW4gYSByZWFsLWxpZmUKLQlzaXR1YXRpb24uCi0KLTIwMTQtMTAtMTQgIERhdmlkIFdlacOfICA8RGF2aWQuV2Vpc3NAcHR2Z3JvdXAuY29tPgotCi0JW2J1aWxkXSBCZXR0ZXIgb3B0aW1pemF0aW9uIHNldHRpbmdzIGZvciB2YzIwMTAgc29sdXRpb24gZmlsZS4KLQotCSogYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnNsbiwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvajogVXBkYXRlZC4KLQotMjAxNC0xMC0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkanVzdCBEZXZhbmFnYXJpIGNoYXJhY3RlciByYW5nZS4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYyAoYWZfZGV2YV91bmlyYW5nZXMpOiBPbWl0IGNoYXJhY3RlcnMgdGhhdAotCWFyZSBjb21tb24gdG8gYWxsIG90aGVyIEluZGljIHNjcmlwdHMuCi0KLTIwMTQtMTAtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBGaXggU2F2YW5uYWggYnVnICM0MzM5Mi4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX21ldHJpY3MpOiBEb24ndCBsZXQKLQl2ZXJ0aWNhbCBtZXRyaWNzIHVuaW5pdGlhbGl6ZWQuCi0KLTIwMTQtMTAtMTEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBTbWFsbCBiYm94IGNvcnJlY3Rpb24uCi0KLQkqIHNyYy9iYXNlL2Z0YmJveC5jIChGVF9PdXRsaW5lX0dldF9CQm94KTogU3RhcnQgZnJvbSBub25zZW5zZSBiYm94Ci0JaW5zdGVhZCBvZiBpbml0aWFsIHBvaW50IHRoYXQgY291bGQgYmUgYG9mZicgaW4gY29uaWMgb3V0bGluZXMuCi0KLTIwMTQtMTAtMDggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBGaXggU2F2YW5uYWggYnVnICM0MzM1Ni4KLQotCSogc3JjL2Jhc2UvZnRiYm94LmMgKEJCb3hfTW92ZV9UbywgQkJveF9Db25pY19Ubyk6IFVwZGF0ZSBiYm94IGluIGNhc2UKLQlvZiBpbXBsaWNpdCBgdG8nLgotCShCQm94X0xpbmVfVG8pOiBOZXcgZW1pdHRlciB0aGF0IGRvZXMgbm90IHVwZGF0ZSBiYm94LgotCi0yMDE0LTEwLTA4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gSW50cm9kdWNlIGFuZCB1c2UgbmV3IG1hY3JvIGBGVF9VUERBVEVfQkJPWCcKLQotCSogc3JjL2Jhc2UvZnRiYm94LmMgKEZUX1VQREFURV9CQk9YKTogTmV3IG1hY3JvLgotCShGVF9PdXRsaW5lX0dldF9CQm94KTogVXNlIGl0IGhlcmUuCi0KLTIwMTQtMTAtMDIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBTaWduaWZpY2FudCBvcHRpbWl6YXRpb24gb2YgYGZ0X2RpdjY0YnkzMicKLQotCVdlIHNoaWZ0IGFzIG1hbnkgYml0cyBhcyB3ZSBjYW4gaW50byB0aGUgaGlnaCByZWdpc3RlciwgcGVyZm9ybQotCTMyLWJpdCBkaXZpc2lvbiB3aXRoIG1vZHVsbyB0aGVyZSwgdGhlbiB3b3JrIHRocm91Z2ggdGhlIHJlbWFpbmluZwotCWJpdHMgd2l0aCBsb25nIGRpdmlzaW9uLiBUaGlzIG9wdGltaXphdGlvbiBpcyBlc3BlY2lhbGx5IG5vdGljZWFibGUKLQlmb3Igc21hbGxlciBkaXZpZGVuZHMgdGhhdCBiYXJlbHkgdXNlIHRoZSBoaWdoIHJlZ2lzdGVyLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoZnRfZGl2NjRieTMyKTogVXBkYXRlZC4KLQotMjAxNC0xMC0wMiAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCVtjZmZdIEZpeCBTYXZhbm5haCBidWcgIzQzMjcxLgotCi0JKiBzcmMvY2ZmL2NmMmZvbnQuYyAoY2YyX2NvbXB1dGVEYXJrZW5pbmcpOiBDaGFuZ2Ugb3ZlcmZsb3cKLQlkZXRlY3Rpb24gdG8gdXNlIGxvZ2FyaXRobXMgYW5kIGNsYW1wIGBzY2FsZWRTdGVtJy4KLQotMjAxNC0xMC0wMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYzogUmVtb3ZlIG1pc2NlbGxhbmVvdXMgdHlwZSBjYXN0cy4KLQotMjAxNC0xMC0wMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIFVzZSBtb3JlIGNvbW1vbiBgRlRfTVNCJyBpbXBsZW1lbnRhdGlvbiB3aXRoIG1hc2tzLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTVNCKTogVXBkYXRlZC4KLQotMjAxNC0wOS0zMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIENsZWFuIHVwLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTU9WRV9TSUdOKTogTmV3IG1hY3JvIGZvciBmcmVxdWVudGx5IHVzZWQKLQljb2RlLgotCi0yMDE0LTA5LTI1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gQXZvaWQgdW5uZWNlc3NhcnkgbG9uZyBkaXZpc2lvbi4KLQotCVRoaXMgYXBwbGllcyB0byBgRlRfTXVsRGl2JyBidXQgbm90IHRvIGBGVF9EaXZGaXgnLCB3aGVyZSBvdmVyZmxvd3Mgb3IKLQlsYWNrIHRoZXJlb2YgYXJlIHByZWRpY3RlZCBhY2N1cmF0ZWx5LgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoZnRfZGl2NjRieTMyKTogSW1wcm92ZSByZWFkYWJpbGl0eS4KLQkoRlRfTXVsRGl2LCBGVF9NdWxEaXZfTm9fUm91bmQpIFshRlRfTE9ORzY0XTogVXNlIHN0cmFpZ2h0IGRpdmlzaW9uCi0Jd2hlbiBtdWx0aXBsaWNhdGlvbiBzdGF5ZWQgd2l0aGluIDMyIGJpdHMuCi0KLTIwMTQtMDktMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNaW5vciBjbGVhbi11cHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoQUZfRkxBR1MpOiBSZW1vdmUgb2Jzb2xldGUgdmFsdWVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzLAotCWFmX2dseXBoX2hpbnRzX2FsaWduX3N0cm9uZ19wb2ludHMpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRzX2xpbmtfc2VnbWVudHMsCi0JYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyksIHNyYy9hdXRvZml0L2FmY2prLmMKLQkoYWZfY2prX2hpbnRzX2xpbmtfc2VnbWVudHMpLCBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jCi0JKGFmX2xhdGluMl9oaW50c19saW5rX3NlZ21lbnRzLCBhZl9sYXRpbjJfaGludHNfY29tcHV0ZV9zZWdtZW50cyk6Ci0JVGhlcmUgYXJlIG5vIGxvbmdlciBmYWtlIHNlZ21lbnRzIHNpbmNlIG1vcmUgdGhhbiAxMCB5ZWFycy4uLgotCi0yMDE0LTA5LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWlub3IgY29kZSBzdHJlYW1saW5pbmcuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfYXhpc19oaW50c19uZXdfZWRnZSk6IFJlbW92ZSByZWR1bmRhbnQKLQlpbml0aWFsaXphdGlvbi4KLQotMjAxNC0wOS0xOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYzogSGFybW9uaXplIGNvZGUuCi0KLTIwMTQtMDktMTUgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBUaWdodGVuIHRoZSBvdmVyZmxvdyBjaGVjayBpbiBgRlRfTXVsRGl2Jy4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX011bERpdikgWyFGVF9MT05HNjRdOiBVcGRhdGVkLgotCi0yMDE0LTA5LTA4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0MzE1My4KLQotCSogc3JjL3BzYXV4L3BzY29udi5jIChQU19Db252X1RvRml4ZWQpOiBBZGQgcHJvdGVjdGlvbiBhZ2FpbnN0Ci0Jb3ZlcmZsb3cgaW4gYGRpdmlkZXInLgotCi0yMDE0LTA5LTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gVGlnaHRlbiB0aGUgb3ZlcmZsb3cgY2hlY2sgaW4gYEZUX0RpdkZpeCcuCi0KLQlUaGlzIGZpeGVzIGEgMTMteWVhciBvbGQgYnVnLiBUaGUgb3JpZ2luYWwgb3ZlcmZsb3cgY2hlY2sgc2hvdWxkIGhhdmUKLQliZWVuIHVwZGF0ZWQgd2hlbiByb3VuZGluZyB3YXMgaW50cm9kdWNlZCBpbnRvIHRoaXMgZnVuY3Rpb24KLQkoYzJjZDAwNDQzYikuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9EaXZGaXgpIFshRlRfTE9ORzY0XTogVXBkYXRlZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUuaCAoRlRfRGl2Rml4KTogVXBkYXRlZCBkb2N1bWVudGF0aW9uLgotCi0yMDE0LTA5LTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gVGlnaHRlbiB0aGUgb3ZlcmZsb3cgY2hlY2sgaW4gYEZUX011bEZpeCcuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NdWxGaXgpIFshRlRfTE9ORzY0XTogVXBkYXRlZC4KLQotMjAxNC0wOS0wMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBTaG9ydGN1dCBwcGVtIGNhbGN1bGF0aW9ucyBmb3Igc3F1YXJlIHBpeGVscy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmggKFRUX0V4ZWNDb250ZXh0UmVjKTogTmV3IGZpZWxkCi0JYGN1cl9wcGVtX2Z1bmMnIHdpdGggYSBmdW5jdGlvbiBwb2ludGVyLgotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX1J1bklucyk6IEluaXRpYWxpemUgYGN1cl9wcGVtX2Z1bmMnCi0JZGVwZW5kaW5nIG9uIHRoZSBwaXhlbCBnZW9tZXRyeSB0byBlaXRoZXIuLi4KLQkoQ3VycmVudF9QcGVtX1N0cmV0Y2hlZCk6IC4uLiB0aGlzIGZvciBzdHJldGNoZWQgcGl4ZWxzLgotCShDdXJyZW50X1BwZW0pOiAuLi4gb3IgdGhpcyBmb3Igc3F1YXJlIHBpeGVscy4KLQkoRE9fTVBQRU0sIERPX01QUywgSW5zX0RFTFRBUCwgSW5zX0RFTFRBQyk6IFVzZSBgY3VyX3BwZW1fZnVuYycuCi0KLTIwMTQtMDgtMzEgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JRG9uJ3QgdXNlIGByZWdpc3Rlcicga2V5d29yZC4gIEZpeGVzIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfQWRkNjQpIFshRlRfTE9ORzY0XTogRG8gaXQuCi0JKiBzcmMvZ3ppcC9pbmZ0cmVlcy5jIChodWZ0X2J1aWxkKTogRGl0dG8uCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfTXVsRml4MTRfYXJtKTogRGl0dG8uCi0KLTIwMTQtMDgtMjQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVt0cnVldHlwZV0gT3B0aW1pemUgREVMVEFQIGFuZCBERUxUQUMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfREVMVEFQLCBJbnNfREVMVEFDKTogTW92ZSBwcGVtCi0JY2FsY3VsYXRpb25zIG91dHNpZGUgb2YgdGhlIGxvb3AuCi0KLTIwMTQtMDgtMjEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCUZpeCBTYXZhbm5haCBidWcgIzQzMDMzLgotCi0JKiBpbmNsdWRlL2NvbmZpZy9mdGNvbmZpZy5oLCBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiwKLQlidWlsZHMvdm1zL2Z0Y29uZmlnLmggW0ZUX0xPTkc2NF06IERvIG5vdCBkaXNhYmxlIHRoZSBtYWNybyB3aGVuCi0JNjQtYml0IHR5cGUgaXMgYGxvbmcnLgotCi0yMDE0LTA4LTIwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gU21hbGwgb3B0aW1pemF0aW9uIG9mIGBGVF9NdWxGaXgnLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRml4KTogTG9vc2VuIHVwIHRoZSBjb25kaXRpb24gZm9yIGRpcmVjdAotCTMyLWJpdCBjYWxjdWxhdGlvbnMuCi0KLTIwMTQtMDgtMTkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBVc2UgdW5zaWduZWQgY2FsY3VsYXRpb24gaW4gYEZUX011bERpdicuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NdWxEaXYpOiBVcGRhdGVkIHRvIGV4cGFuZCAzMi1iaXQgcmFuZ2UuCi0KLTIwMTQtMDgtMTggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBSZW1vdmUgdHJ1bmNhdGlvbiBpbiBgRlRfRGl2Rml4Jy4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX0RpdkZpeCk6IFVwZGF0ZWQuCi0KLTIwMTQtMDgtMTQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCU1pbm9yIHJlZmFjdG9yaW5nLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRGl2LCBGVF9NdWxEaXZfTm9fUm91bmQpOiBVcGRhdGVkLgotCi0yMDE0LTA4LTE0ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlUdXJuIEZUX01TQiBpbnRvIGEgbWFjcm8gd2hlbiB1c2luZyBnY2MgYnVpbHRpbnMuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jLCBpbmNsdWRlL2ludGVybmFsL2Z0Y2FsYy5oOiBVcGRhdGVkLgotCi0yMDE0LTA4LTEyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gQXZvaWQgdW5kZWZpbmVkIEZUX01TQiBpbiBgQkJveF9DdWJpY19DaGVjaycuCi0KLQkqIHNyYy9iYXNlL2Z0YmJveC5jIChCQm94X0N1YmljX0NoZWNrKTogVXBkYXRlLgotCSh1cGRhdGVfY3ViaWNfbWF4KTogUmVwbGFjZSB3aXRoLi4uCi0JKGN1YmljX3BlYWspOiAuLi4gdGhpcywgd2hpY2ggbm93IGhhbmRsZXMgdXBzY2FsaW5nLgotCi0yMDE0LTA4LTExICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gSGFuZGxlIGNvbGxhcHNlZCBvdXRsaW5lcyB0byBhdm9pZCB1bmRlZmluZWQgRlRfTVNCLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKTogVXBkYXRlLgotCi0yMDE0LTA4LTExICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gUmVzdG9yZSBGVF9NdWxGaXggaW5saW5pbmcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUuaCAoRlRfTXVsRml4KTogVW5jb25kaXRpb25hbGx5IGRlZmluZWQuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIFtGVF9NVUxGSVhfQVNTRU1CTEVSXTogTW92ZSBjb2RlIGZyb20gaGVyZS4uLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL2Z0Y2FsYy5oIFtGVF9NVUxGSVhfQVNTRU1CTEVSXTogLi4uIHRvIGhlcmUsCi0Jd2hpY2ggY29uZGl0aW9uYWxseSByZXBsYWNlcyB0aGUgZnVuY3Rpb24gd2l0aCBhbiBpbmxpbmUgdmVyc2lvbgotCXRocm91Z2ggdGhlIG1hY3JvLgotCi0yMDE0LTA4LTA4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKGZ0X2dyYXlfZm9yX3ByZW11bHRpcGxpZWRfc3JnYl9iZ3JhKTogUmVmYWN0b3IuCi0KLTIwMTQtMDctMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCB0eXBvLgotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmMgKGNmMl9nbHlwaHBhdGhfY29tcHV0ZU9mZnNldCk6IFVzZSBjb3JyZWN0Ci0Jb2Zmc2V0cyBpbiB0aGlyZCBxdWFkcmFudC4KLQotCVJlcG9ydGVkIGJ5IG1ha3MgPG1ha3Nxd2UxQHVrci5uZXQ+LgotCi0yMDE0LTA3LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0Mjc4OC4KLQotCSogc3JjL3Bmci9wZnJvYmpzLmM6IEluY2x1ZGUgYGZ0Y2FsYy5oJy4KLQotMjAxNC0wNy0xNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JUmVwbGFjZSBgZnRfaGlnaHBvdzInIGZ1bmN0aW9uLgotCi0JKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX2ZhY2VfZ2V0X2tlcm5pbmcpOiBVc2UgYEZUX01TQicgaW5zdGVhZCBvZgotCWBmdF9oaWdocG93MicuCi0KLQkqIHNyYy9iYXNlL2Z0dXRpbC5jLCBpbmNsdWRlL2ludGVybmFsL2Z0b2Jqcy5oIChmdF9oaWdocG93Mik6IFJlbW92ZQotCWl0LgotCi0yMDE0LTA3LTE1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NU0IpOiBVdGlsaXplIGdjYyBidWlsdGlucy4KLQotMjAxNC0wNy0xNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIE1vdmUgYXNzZW1ibGVyIGNvZGUgYmFjayBpbiB0aGUgc291cmNlIGZpbGUuCi0KLQlGVF9NdWxGaXggYXNzZW1ibGVyIHVzZWQgdG8gcmVzaWRlIGluIGZ0Y2FsYy5jIGJlZm9yZSBmNDdkMjYzZjFiLgotCi0JKiBpbmNsdWRlL2NvbmZpZy9mdGNvbmZpZy5oLCBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiwKLQlidWlsZHMvdm1zL2Z0Y29uZmlnLmggW0ZUX01VTEZJWF9BU1NFTUJMRVJdOiBNb3ZlIGNvZGUgZnJvbSBoZXJlLi4uCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIFtGVF9NVUxGSVhfQVNTRU1CTEVSXTogLi4uIHRvIGhlcmUuCi0KLTIwMTQtMDctMTQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBGdXJ0aGVyIGNsZWFuIHVwIGNvbG9yIGJpdG1hcCBjb252ZXJzaW9uLgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChmdF9ncmF5X2Zvcl9wcmVtdWx0aXBsaWVkX3NyZ2JfYmdyYSk6IFN0b3AKLQl1c2luZyBGVF9NdWxGaXggYW5kIEZUX0RpdkZpeCBzaW5jZSBhbGwgY2FsY3VsYXRpb25zIGZpdCBpbnRvIDMyIGJpdHMuCi0KLTIwMTQtMDctMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gSW1wcm92ZSBoYW5kbGluZyBvZiBidWdneSBgcHJlcCcgdGFibGVzLgotCi0JSW4gY2FzZSBvZiBhbiBlcnJvciBpbiB0aGUgYHByZXAnIHRhYmxlLCBubyBsb25nZXIgdHJ5IHRvIGV4ZWN1dGUgaXQKLQlhZ2FpbiBhbmQgYWdhaW4uICBUaGlzIG1ha2VzIEZyZWVUeXBlIGhhbmRsZSBlbmRsZXNzIGxvb3BzIGluIGJ1Z2d5Ci0JZm9udHMgbXVjaCBmYXN0ZXIuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuaCAoVFRfU2l6ZVJlYyk6IFRoZSBmaWVsZHMgYGJ5dGVjb2RlX3JlYWR5JwotCWFuZCBgY3Z0X3JlYWR5JyBhcmUgbm93IG5lZ2F0aXZlIGlmIG5vdCBpbml0aWFsaXplZCB5ZXQsIG90aGVyd2lzZQotCXRoZXkgaW5kaWNhdGUgdGhlIGVycm9yIGNvZGUgb2YgdGhlIGxhc3QgcnVuLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcnVuX2ZwZ20sIHR0X3NpemVfcnVuX3ByZXAsCi0JdHRfc2l6ZV9kb25lX2J5dGVjb2RlLCB0dF9zaXplX2luaXRfYnl0ZWNvZGUsCi0JdHRfc2l6ZV9yZWFkeV9ieXRlY29kZSwgdHRfc2l6ZV9pbml0LCB0dF9zaXplX2RvbmUsIHR0X3NpemVfcmVzZXQpOgotCVVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKHR0X2xvYWRlcl9pbml0KTogVXBkYXRlZC4KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9SdW5JbnMpOiBGb3JjZSByZWV4ZWN1dGlvbiBvZiBgZnBnbScKLQlhbmQgYHByZXAnIG9ubHkgaWYgd2UgYXJlIGluIHRoZSBgZ2x5ZicgdGFibGUuCi0KLTIwMTQtMDctMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3Ztcy9mdGNvbmZpZy5oOiBTeW5jaHJvbml6ZS4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEFsZXhlaS4KLQotMjAxNC0wNy0xMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIENsZWFuIHVwIGJpdG1hcCBjb252ZXJzaW9uLgotCi0JKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChmdF9ncmF5X2Zvcl9wcmVtdWx0aXBsaWVkX3NyZ2JfYmdyYSk6IFVzZQotCWFwcHJvcHJpYXRlIEZUX0RpdkZpeCBhbmQgcmVtb3ZlIHN1cGVyZmx1b3VzIHVwc2NhbGluZy4KLQotMjAxNC0wNy0wNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIFNtYWxsIG9wdGltaXphdGlvbiBvZiB0aGUgYW5jaWVudCBjb2RlLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRGl2LCBGVF9NdWxEaXZfTm9fUm91bmQpOiBMb29zZW4gdXAgdGhlCi0JY29uZGl0aW9uIGZvciBkaXJlY3QgMzItYml0IGNhbGN1bGF0aW9ucy4KLQotMjAxNC0wNi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IEFwcGxlIHN0YW5kYXJkIGdseXBoIG5hbWVzLgotCi0JKiBzcmMvc2ZudC90dHBvc3QuYyAodHRfcG9zdF9kZWZhdWx0X25hbWVzKTogU3luY2hyb25pemUgd2l0aAotCWB0b29scy9nbG5hbWVzLnB5JwotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBBZGFtIFR3YXJkb2NoIDxhZGFtQGZvbnRsYWIuY29tPi4KLQotMjAxNC0wNi0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUGFydGlhbGx5IHJldmVydCBjb21taXQgZnJvbSAyMDE0LTA2LTEzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcyk6IE1vdmUKLQlkZWNsYXJhdGlvbiBvZiBgcF9maXJzdCcgYW5kIGBwX2xhc3QnIG91dCBvZiB0aGUgbG9vcC4KLQotMjAxNC0wNi0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZTIubTQ6IHMvQUNfUEFUSF9QUk9HL0FDX1BBVEhfVE9PTC8uCi0KLQlUaGlzIHNpbXBsaWZpZXMgY3Jvc3MtY29tcGlsaW5nLgotCi0yMDE0LTA2LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggbW9yZSBjb21waWxlciB3YXJuaW5ncy4KLQlSZXBvcnRlZCBieSBXb2pjaWVjaCBNYW1yYWsgPHdtYW1yYWtAZ21haWwuY29tPi4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYyAoYWZfZmFjZV9nbG9iYWxzX2NvbXB1dGVfc3R5bGVfY292ZXJhZ2UpOgotCU1ha2UgaW50ZWdlciBjb25zdGFudCB1bnNpZ25lZC4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcykKLQk8VFRfU0JJVF9UQUJMRV9UWVBFX1NCSVg+OiBGaXggdHlwZXMuCi0JKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2NvbXBvdW5kLCB0dF9mYWNlX2xvYWRfc2JpeF9pbWFnZSk6IEFkZCBwcm9wZXIKLQljYXN0cy4KLQotMjAxNC0wNi0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGNvbXBpbGVyIHdhcm5pbmdzLgotCVJlcG9ydGVkIGJ5IFdvamNpZWNoIE1hbXJhayA8d21hbXJha0BnbWFpbC5jb20+LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zdHlsZV9jb3ZlcmFnZSksCi0Jc3JjL2F1dG9maXQvYWZtb2R1bGUuYyAoYWZfcHJvcGVydHlfc2V0KTogRml4IGBzaWduZWQnIHZzLgotCWB1bnNpZ25lZCcgaXNzdWVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcyk6IE1ha2UgY29tcGlsZXIKLQloYXBweS4KLQotCSogc3JjL2Jhc2UvZnRsY2RmaWwuYyAoX2Z0X2xjZF9maWx0ZXJfZmlyKTogVXNlIG9ubHkgZm91ciBlbGVtZW50cwotCWZvciBgZmlyJy4KLQlGaXggYHNpZ25lZCcgdnMuIGB1bnNpZ25lZCcgaXNzdWVzLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoV1JJVEVfQllURSk6IFJlbW92ZWQsIHVudXNlZC4KLQkoV1JJVEVfVVNIT1JULCBXUklURV9VTE9ORyk6IEFkZCBwcm9wZXIgY2FzdHMuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0dldF9WTWV0cmljcyk6IEFkZCBwcm9wZXIgY2FzdHMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfREVMVEFQKTogQWRkIHByb3BlciBjYXN0cyBmb3IgYEIxJwotCWFuZCBgQjInLgotCi0yMDE0LTA1LTE2ICBBbGV4ZXkgUGV0cnVjaGlrICA8YWxleGV5LnBldHJ1Y2hpa0BnbWFpbC5jb20+Ci0KLQlbY21ha2VdIEFkZCBvcHRpb24gdG8gYnVpbGQgT1MgWCBmcmFtZXdvcmsuCi0KLQkqIENNYWtlTGlzdHMudHh0OiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIGJ1aWxkcy9tYWMvZnJlZXR5cGUtSW5mby5wbGlzdDogTmV3IGZpbGUuCi0KLTIwMTQtMDUtMTMgIFBhdmVsIEtvc2hldm95ICA8cGtvc2hldm95QGdtYWlsLmNvbT4KLQotCSogQ01ha2VMaXN0cy50eHQgKEJBU0VfU1JDUyk6IEFkZCBtaXNzaW5nIGBmdGJkZi5jJy4KLQotMjAxNC0wNS0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogQXNzaWduIGRlZmF1bHQKLQl2YWx1ZXMgdG8gYGluX2RpcicgYW5kIGBvdXRfZGlyJyBmb3IgYWxsIHBvaW50cy4KLQotMjAxNC0wNS0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCBjcmFzaCB3aXRoIGZvbnQgYENhYmluU2tldGNoLUJvbGQudHRmJy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4uCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogRml4IHRocmVzaG9sZCBmb3IKLQlmaW5kaW5nIGZpcnN0IG5vbi1uZWFyIHBvaW50LgotCVByb3Blcmx5IGluaXRpYWxpemUgbm9uLW5lYXIgcG9pbnQgZGVsdGFzLgotCi0yMDE0LTA1LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIGJsdWUtem9uZSBzdXBwb3J0IGZvciBEZXZhbmFnYXJpLgotCi0JVGhpcyBlc3NlbnRpYWxseSBtb3ZlcyB0aGUgRGV2YW5hZ2FyaSBzY3JpcHQgZnJvbSB0aGUgYEluZGljJyBoaW50ZXIKLQl0byB0aGUgYExhdGluJyBoaW50ZXIuICBUaGFua3MgdG8gR2lyaXNoIERhbHZpCi0JPGdpcmlzaC5kYWx2aUBnbWFpbC5jb20+IGZvciBndWlkYW5jZSB3aXRoIGJsdWUgem9uZSBjaGFyYWN0ZXJzIQotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIERldmFuYWdhcmkuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBEZXZhbmFnYXJpIHN0YW5kYXJkIGNoYXJhY3RlcnMgYW5kCi0JbW92ZSBkYXRhIG91dCBvZiBBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBNb3ZlIERldmFuYWdhcmkgZGF0YSBvdXQgb2YKLQlBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCU1vdmUgVSsyMEI5LCAobmV3KSBSdXBlZSBzaWduLCBmcm9tIExhdGluIHRvIERldmFuYWdhcmkuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IFVwZGF0ZSBEZXZhbmFnYXJpIGRhdGE7IGluIHBhcnRpY3VsYXIsIHVzZQotCUFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLgotCi0yMDE0LTA1LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gRml4IGhhbmRsaW5nIG9mIG5ldXRyYWwgYmx1ZSB6b25lcyBpbiBzdGVtcy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9FZGdlX0ZsYWdzKTogTmV3IHZhbHVlCi0JYEFGX0VER0VfTkVVVFJBTCcuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKTogVHJhY2UKLQluZXV0cmFsIGJsdWUgem9uZXMgd2l0aCBBRl9FREdFX05FVVRSQUwuCi0JKGFmX2xhdGluX2hpbnRfZWRnZXMpOiBTa2lwIG5ldXRyYWwgYmx1ZSB6b25lcyBpZiBuZWNlc3NhcnkuCi0KLTIwMTQtMDQtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbnRyb2R1Y2UgbmV1dHJhbCBibHVlIHpvbmVzIHRvIHRoZSBsYXRpbiBtb2R1bGUuCi0KLQlTdWNoIGJsdWUgem9uZXMgbWF0Y2ggZWl0aGVyIHRoZSB0b3Agb3IgdGhlIGJvdHRvbSBvZiBhIGNvbnRvdXIuICBXZQotCW5lZWQgdGhlbSBmb3Igc2NyaXB0cyB3aGVyZSBhY2NlbnQtbGlrZSBlbGVtZW50cyBkaXJlY3RseSB0b3VjaCB0aGUKLQliYXNlIGNoYXJhY3RlciAoZm9yIGV4YW1wbGUsIHNvbWUgdm93ZWwgc2lnbnMgaW4gRGV2YW5hZ2FyaSwgY2YuCi0JVSswOTEzIG9yIFUrMDkxNCkuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5oaW4gKEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fTkVVVFJBTCk6IE5ldwotCXByb3BlcnR5LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaCAoQUZfTEFUSU5fSVNfTkVVVFJBTF9CTFVFKTogTmV3IG1hY3JvLgotCShBRl9MQVRJTl9CTFVFX05FVVRSQUwpOiBOZXcgZW51bWVyYXRpb24gdmFsdWUuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzLAotCWFmX2xhdGluX2hpbnRzX2NvbXB1dGVfYmx1ZV9lZGdlcyk6IEhhbmRsZSBuZXV0cmFsIGJsdWUgem9uZXMuCi0KLTIwMTQtMDQtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvaGJzaGltLmM6IFBhcnRpYWxseSByZXZlcnQgY29tbWl0IGZyb20gMjAxNC0wNC0xNy4KLQotCVVzaW5nIGlucHV0IGdseXBoIGNvdmVyYWdlIGRhdGEgaXMgc2ltcGx5IHdyb25nLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBOaWtvbGF1cyBXYXh3ZWlsZXIgPG1hZGlnZW5zQGdtYWlsLmNvbT4gYW5kCi0JTWFudGFzIE1pa3VsxJduYXMgPGdyYXdpdHlAZ21haWwuY29tPi4KLQotMjAxNC0wNC0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKFZlcnRpY2FsX1N3ZWVwX1NwYW4pOiBVc2UgZHJvcC1vdXQgbW9kZS4KLQotCVRoaXMgc3BvdCBoYXMgYmVlbiBtaXNzZWQgd2hpbGUgaW50cm9kdWNpbmcgc3VwcG9ydCBmb3IgdmFyaW91cwotCWRyb3Atb3V0IG1vZGVzIHllYXJzIGFnbyAoaW5jbHVkaW5nIG5vIGRyb3Atb3V0IG1vZGUsIHdoaWNoIHRoaXMKLQljb21taXQgZml4ZXMpLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBQYXRyaWNrIFRob21hcyA8cHRob21hczUwNUBnbWFpbC5jb20+LgotCi0yMDE0LTA0LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3BuZ3NoaW0uYyAoZXJyb3JfY2FsbGJhY2spOiBzL2xvbmdqbXAvZnRfbG9uZ2ptcC8uCi0KLTIwMTQtMDQtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggU2F2YW5uYWggYnVnICM0MjE0OC4KLQotCVRoZSBhZGFwdGF0aW9uIG9mIHRoZSBjamsgYXV0by1oaW50ZXIgbW9kdWxlIHRvIGJsdWUgc3RyaW5nc2V0cyBpbgotCTIwMTMtMDgtMjUgaGFkIHRocmVlIHNldmVyZSBidWdzLiAgTWVhIGN1bHBhLgotCi0JMS4gQ29udHJhcnkgdG8gdGhlIGxhdGluIGF1dG8taGludGVyLCBjaGFyYWN0ZXJzIGZvciByZWZlcmVuY2UgYW5kCi0JICAgb3ZlcnNob290IHZhbHVlcyBvZiBhIGJsdWUgem9uZSBhcmUgc3BlY2lmaWVkIHNlcGFyYXRlbHkuICBEdWUgdG8KLQkgICB0aGUgc2NyZXdlZC11cCBjaGFuZ2UgaXQgZGlkbid0IHdvcmsgYXQgYWxsLgotCi0JMi4gQSBib29sZWFuIGNvbXBhcmlzb24gd2FzIGVycm9uZW91c2x5IHJlcGxhY2VkIHdpdGggYSBjYXN0LAotCSAgIGNhdXNpbmcgaW52YWxpZCByZXN1bHRzIHdpdGggdGhlIGBeJyBvcGVyYXRvciBsYXRlciBvbi4gIFRoZQotCSAgIHZpc3VhbCBhcnRpZmFjdCBjYXVzZWQgYnkgdGhpcyBwcm9ibGVtIGlzIHRoZSB0b3BpYyBvZiB0aGUgYnVnCi0JICAgcmVwb3J0LgotCi0JMy4gVHdvIGZsYWcgdmFsdWVzIHdlcmUgaW52ZXJ0ZWQsIGNhdXNpbmcgaW5jb3JyZWN0IGFzc2lnbm1lbnQgb2YKLQkgICByZWZlcmVuY2UgYW5kIG92ZXJzaG9vdCB2YWx1ZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEZpeCBDSksgYmx1ZXN0cmluZ3MsIGludHJvZHVjaW5nIGEgbmV3Ci0Jc3ludGF4IHRvIGhhdmUgYm90aCByZWZlcmVuY2UgYW5kIG92ZXJzaG9vdCBjaGFyYWN0ZXJzIGluIGEgc2luZ2xlCi0Jc3RyaW5nLiAgVGhpcyBpcyBlcnJvciAjMS4KLQlBZGQgZXh0ZW5zaXZlIGNvbW1lbnRzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuaGluIChBRl9CTFVFX1BST1BFUlRZX0NKS19GSUxMKTogUmVtb3ZlZCwgbm8KLQlsb25nZXIgdXNlZC4KLQkoQUZfQkxVRV9QUk9QRVJUWV9DSktfVE9QLCBBRl9CTFVFX1BST1BFUlRZX0NKS19IT1JJWik6IEZpeCB2YWx1ZXMuCi0JVGhpcyBpcyBlcnJvciAjMy4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX21ldHJpY3NfaW5pdF9ibHVlcyk6IENvcnJlY3QgZXJyb3IgIzEuCi0JVXNlIGNoYXJhY3RlciBgfCcgdG8gc2VwYXJhdGUgY2hhcmFjdGVycyBmb3IgcmVmZXJlbmNlIGFuZCBvdmVyc2hvb3QKLQl2YWx1ZXMuCi0JSW1wcm92ZSB0cmFjaW5nIG1lc3NhZ2VzLCBzeW5jaHJvbml6aW5nIHRoZW0gd2l0aCB0aGUgbGF0aW4KLQlhdXRvLWhpbnRlci4KLQkoYWZfY2prX2hpbnRzX2NvbXB1dGVfYmx1ZV9lZGdlcyk6IEZpeCB2YWx1ZSBvZiBgaXNfdG9wX3JpZ2h0X2JsdWUnLgotCVRoaXMgaXMgZXJyb3IgIzIuCi0JKGFmX2Nqa19hbGlnbl9saW5rZWRfZWRnZSk6IEFkZCB0cmFjaW5nIG1lc3NhZ2UuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmggKEFGX0NKS19JU19GSUxMRURfQkxVRSk6IFJlbW92ZWQsIG5vIGxvbmdlcgotCXVzZWQuCi0KLTIwMTQtMDQtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNb3JlIGNvdmVyYWdlIGZpeGVzIGZvciBjb21wbGV4IHNjcmlwdHMuCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5jIChhZl9nZXRfY292ZXJhZ2UpOiBNZXJnZSBpbnB1dCBnbHlwaCBjb3ZlcmFnZQotCW9mIEdTVUIgbG9va3VwcyBpbnRvIG91dHB1dCBjb3ZlcmFnZS4gIE90aGVyd2lzZSwgbGlnYXR1cmVzIGFyZSBub3QKLQloYW5kbGVkIHByb3Blcmx5LgotCURvbid0IGNoZWNrIGJsdWUgem9uZSBjaGFyYWN0ZXJzIGZvciBkZWZhdWx0IGNvdmVyYWdlLgotCi0yMDE0LTA0LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNYWtlIGBGVF9HZXRfU3ViR2x5cGhfSW5mbycgYWN0dWFsbHkgd29yay4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0dldF9TdWJHbHlwaF9JbmZvKTogUmV0dXJuIEZUX0Vycl9PawotCWlmIHRoZXJlIGlzIG5vIGVycm9yLgotCi0yMDE0LTA0LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYWZibHVlLnBsXTogTWlub3IgaW1wcm92ZW1lbnRzLgotCi0JKiBzcmMvdG9vbHMvYWZibHVlLnBsOiBBbGxvdyB3aGl0ZXNwYWNlIGJlZm9yZSBjb21tZW50cy4KLQlJZ25vcmUgd2hpdGVzcGFjZSBpbiBzdHJpbmdzLgotCi0yMDE0LTA0LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSBjb3ZlcmFnZSBoYW5kbGluZy4KLQotCSogc3JjL2F1dG9maXQvaGJzaGltLmMgKGFmX2dldF9jb3ZlcmFnZSk6IERvbid0IGV4Y2x1ZGUgZ2x5cGhzCi0JYXBwZWFyaW5nIGluIHRoZSBHUE9TIHRhYmxlIGlmIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBkZWZhdWx0Ci0JY292ZXJhZ2UuCi0KLTIwMTQtMDQtMTMgIERhdmlkIFdlYmVyICA8d2ViZXIuYXVsZW5kb3JmQGdvb2dsZW1haWwuY29tPgotCi0JW3Ntb290aF0gRml4IHN0YW5kLWFsb25lIGNvbXBpbGF0aW9uLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoRlRfQkVHSU5fU1RNTlQsIEZUX0VORF9TVE1OVCk6IERlZmluZS4KLQotMjAxNC0wNC0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFJlZGVzaWduIHRoZSByZWNvZ25pdGlvbiBhbGdvcml0aG0gb2Ygc3Ryb25nIHBvaW50cy4KLQotCUluIHBhcnRpY3VsYXIsIGxvY2FsIGV4dHJlbWEgd2l0aG91dCBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHNlZ21lbnRzCi0JYXJlIGJldHRlciByZWNvZ25pemVkOgotCi0JICArIEEgICAgICAgICAgICAgICAgKyBECi0JICAgXCAgICAgICAgICAgICAgICAvCi0JICAgIFwgICAgICAgICAgICAgIC8KLQkgICAgIFwgICAgICAgICAgICAvCi0JICAgICAgXCAgICAgICAgICAvCi0JICAgICAgIFwgICAgICAgICsgQwotCSAgICAgICAgXCAgICAvCi0JICAgICAgIEIgKy8KLQotCUlmIHRoZSBkaXN0YW5jZXMgQUIgYW5kIENEIGFyZSBsYXJnZSwgcG9pbnQgQiB3YXNuJ3QgcHJldmlvdXNseQotCWRldGVjdGVkIGFzIGFuIGV4dHJlbXVtIHNpbmNlIHRoZSBgZnRfY29ybmVyX2lzX2ZsYXQnIGZ1bmN0aW9uCi0JYHN3YWxsb3dlZCcgQkMgcmVnYXJkbGVzcyBvZiBpdHMgZGlyZWN0aW9uLCB0YWdnaW5nIHBvaW50IEIgYXMgd2Vhay4KLQlUaGUgbmV4dCBpdGVyYXRpb24gc3RhcnRlZCBhdCBCIGFuZCBtYWRlIGBmdF9jb3JuZXJfaXNfZmxhdCcgc3dhbGxvdwotCXBvaW50IEMsIHRhZ2dpbmcgaXQgYXMgd2VhayBhbHNvLCBldCB2b2lsw6AuCi0KLQlUbyBpbXByb3ZlIHRoYXQsIGFub3RoZXIgcGFzcyBnZXRzIG5vdyBwZXJmb3JtZWQgYmVmb3JlIGNhbGxpbmcKLQlgZnRfY29ybmVyX2lzX2ZsYXQnIHRvIGltcHJvdmUgdGhlIGB0b3BvbG9neScgb2YgYW4gb3V0bGluZTogQQotCXNlcXVlbmNlIG9mIG5vbi1ob3Jpem9udGFsIG9yIG5vbi12ZXJ0aWNhbCB2ZWN0b3JzIHRoYXQgcG9pbnQgaW50bwotCXRoZSBzYW1lIHF1YWRyYW50IGFyZSBoYW5kbGVkIGFzIGEgc2luZ2xlLCBsYXJnZSB2ZWN0b3IuCi0KLQlBZGRpdGlvbmFsbHksIGRpc3RhbmNlcyBvZiBuZWFyIHBvaW50cyBhcmUgbm93IGFjY3VtdWxhdGVkLCB3aGljaAotCW1ha2VzIHRoZSBhdXRvLWhpbnRlciBoYW5kbGUgdGhlbSBhcyBpZiB0aGV5IHdlcmUgcHJlcGVuZGVkIHRvIHRoZQotCW5leHQgbm9uLW5lYXIgdmVjdG9yLgotCi0JVGhpcyBnZW5lcmFsbHkgaW1wcm92ZXMgdGhlIGF1dG8taGludGVyJ3MgcmVuZGVyaW5nIHJlc3VsdHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogSW1wbGVtZW50IGl0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmggKEFGX0ZMQUdTKTogUmVtb3ZlIG5vIGxvbmdlciB1c2VkIGZsYWcKLQlgQUZfRkxBR19ORUFSJy4KLQotMjAxNC0wNC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEltcHJvdmUgc2NvcmluZyBhbGdvcml0aG0gZm9yIGlkZW50aWZ5aW5nIHN0ZW1zLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBLYXJzdGVuIEzDvGNrZSA8a2Fyc3Rlbi5sdWVja2VAa2x0Zi5kZT4uCi0KLQlUaGUgbmV3IGFsZ29yaXRobSB0YWtlcyBjYXJlIG9mIHRoZSB3aWR0aCBvZiBzdGVtczogSWYgdGhlIGRpc3RhbmNlCi0JYmV0d2VlbiB0d28gc2VnbWVudHMgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3Qgc3RlbSB3aWR0aCwgdGhlCi0JZGVtZXJpdHMgcXVpY2tseSBpbmNyZWFzZSBmb3IgbGFyZ2VyIGRpc3RhbmNlcy4gIFRoaXMgaW1wcm92ZXMKLQloaW50aW5nIG9mIHNsYW50ZWQgZm9udHMgKGVzcGVjaWFsbHkgaWYgdGhlIGlubmVyIHBhcnRzIG9mIHNlcmlmcwotCWhhdmUgbm9uLWhvcml6b250YWwgYHNob3VsZGVycycpLCBhdm9pZGluZyBmYWxzZSBzdGVtIGxpbmtzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRzX2xpbmtfc2VnbWVudHMpOiBVc2UgbGFyZ2VzdAotCXN0ZW0gd2lkdGggKGlmIGF2YWlsYWJsZSkgdG8gY29tcHV0ZSBiZXR0ZXIgZGVtZXJpdHMgZm9yIGRpc3RhbmNlcwotCWJldHdlZW4gc3RlbXMuCi0JKGFmX2xhdGluX2hpbnRzX2RldGVjdF9mZWF0dXJlcyk6IFBhc3Mgc3RlbSB3aWR0aCBhcnJheSBhbmQgYXJyYXkKLQlzaXplLgotCShhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzKTogVXBkYXRlZCB0byB1c2Ugb3JpZ2luYWwgYWxnb3JpdGhtLgotCShhZl9sYXRpbl9oaW50c19hcHBseSk6IFVwZGF0ZWQgdG8gdXNlIG5ldyBhbGdvcml0aG0uCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaDogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmY2prLmM6IFVwZGF0ZWQuCi0KLTIwMTQtMDQtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCURvbid0IHJlcXVpcmUgYGd6aXAnIG1vZHVsZSBmb3IgYHNmbnQnLgotCi0JUmVwb3J0ZWQgYnkgUHJlZXQgPHByaXNtYXRpYy5wcm9qZWN0QGdtYWlsLmNvbT4uCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jICh3b2ZmX29wZW5fZm9udCk6IEd1YXJkIHVzZSBvZgotCUZUX0d6aXBfVW5jb21wcmVzcyB3aXRoIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIuCi0KLTIwMTQtMDMtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzM4MjM1LgotCi0JV29yayBhcm91bmQgYSBidWcgaW4gcGtnLWNvbmZpZyB2ZXJzaW9uIDAuMjggYW5kIGVhcmxpZXI6IElmIGEKLQl2YXJpYWJsZSB2YWx1ZSBnZXRzIHN1cnJvdW5kZWQgYnkgZG91YmxlcXVvdGVzIChpbiBwYXJ0aWN1bGFyIHZhbHVlcwotCWZvciB0aGUgYHByZWZpeCcgdmFyaWFibGUpLCB0aGUgcHJlZml4IG92ZXJyaWRlIG1lY2hhbmlzbSBmYWlscy4KLQotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluOiBEb24ndCB1c2UgZG91YmxlcXVvdGVzLgotCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKGZyZWV0eXBlLnBjKTogRXNjYXBlIHNwYWNlcyBpbiBkaXJlY3RvcnkKLQluYW1lcyB3aXRoIGJhY2tzbGFzaGVzLgotCi0yMDE0LTAzLTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0MTk0Ni4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBNYXJlayBLYcWhw61rIDxta2FzaWtAcmVkaGF0LmNvbT4uCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKExJQlNfQ09ORklHKTogUmVtb3ZlLgotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluIChsaWJzKTogSGFyZC1jb2RlIHZhbHVlLgotCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW46IFVwZGF0ZWQuCi0KLTIwMTQtMDMtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFub3RoZXIgcmV2ZXJ0IGZvciB0aGUgY2hhbmdlIGZyb20gMjAxNC0wMy0xOC4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTmlrb2xhdXMgV2F4d2VpbGVyIDxtYWRpZ2Vuc0BnbWFpbC5jb20+LgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRml4KTogRW5zdXJlIHRoYXQgYW4gYEZUX011bEZpeCcgc3ltYm9sCi0JZ2V0cyBhbHdheXMgZXhwb3J0ZWQuCi0KLTIwMTQtMDMtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUNNYWtlTGlzdHMudHh0OiBBbm90aGVyIGZpeCBmb3IgaW5jbHVkZSBkaXJlY3Rvcmllcy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgVGF5bG9yIEhvbGJlcnRvbiA8dGF5bG9yY2hvbGJlcnRvbkBnbWFpbC5jb20+LgotCi0yMDE0LTAzLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlDTWFrZUxpc3RzLnR4dDogRml4IGluY2x1ZGUgZGlyZWN0b3JpZXMuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IFRheWxvciBIb2xiZXJ0b24gPHRheWxvcmNob2xiZXJ0b25AZ21haWwuY29tPi4KLQotMjAxNC0wMy0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUGFydGlhbGx5IHJldmVydCBsYXN0IGNvbW1pdC4KLQotCUZvdW5kIGJ5IEFsZXhlaS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBJbml0aWFsaXppbmcKLQl0aG9zZSB2YXJpYWJsZXMgaXMgcGxhaW4gd3JvbmcsIHNpbmNlIHdlIGFyZSBpbiBhIGxvb3AuCi0KLTIwMTQtMDMtMTggIFNlYW4gTWNCcmlkZSAgPHNlYW5Acm9ndWUtcmVzZWFyY2guY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY2xhbmcgd2FybmluZ3MuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogSW5pdGlhbGl6ZQotCXNvbWUgdmFyaWFibGVzLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRml4KTogT25seSB1c2UgY29kZSBpZgotCWBGVF9NVUxGSVhfSU5MSU5FRCcgaXMgbm90IGRlZmluZWQuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoYmRmX2NtYXBfY2xhc3MpLCBzcmMvY2FjaGUvZnRjYmFzaWMuYwotCShmdGNfYmFzaWNfaW1hZ2VfZmFtaWx5X2NsYXNzLCBmdGNfYmFzaWNfaW1hZ2VfY2FjaGVfY2xhc3MsCi0JZnRjX2Jhc2ljX3NiaXRfZmFtaWx5X2NsYXNzLCBmdGNfYmFzaWNfc2JpdF9jYWNoZV9jbGFzcyksCi0Jc3JjL2NhY2hlL2Z0Y2NtYXAuYyAoZnRjX2NtYXBfY2FjaGVfY2xhc3MpLCBzcmMvY2FjaGUvZnRjbWFuYWcuYwotCShmdGNfc2l6ZV9saXN0X2NsYXNzLCBmdGNfZmFjZV9saXN0X2NsYXNzKSwgc3JjL3BjZi9wY2Zkcml2ci5jCi0JKHBjZl9jbWFwX2NsYXNzKSwgc3JjL3Bmci9wZnJkcml2ci5jIChwZnJfbWV0cmljc19zZXJ2aWNlX3JlYyk6IE1ha2UKLQlmdW5jdGlvbiBzdGF0aWMuCi0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9wc19nZXRfZm9udF92YWx1ZSk6IFJlbW92ZSByZWR1bmRhbnQKLQljb2RlLgotCi0yMDE0LTAzLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0MTg2OS4KLQotCVRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSB3aXRoIEhhcmZCdXp6ICg8PSAwLjkuMjYpLCB3aGljaCBkb2Vzbid0Ci0JdmFsaWRhdGUgZ2x5cGggaW5kaWNlcyByZXR1cm5lZCBieQotCWBoYl9vdF9sYXlvdXRfbG9va3VwX2NvbGxlY3RfZ2x5cGhzJy4KLQotCSogc3JjL2F1dG9maXQvaGJzaGltLmMgKGFmX2dldF9jb3ZlcmFnZSk6IEd1YXJkIGBpZHgnLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTQtMDMtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogRG9uJ3Qgc2hvdyBlcnJvciBtZXNzYWdlcyBvZiBgd2hpY2gnLgotCi0yMDE0LTAzLTA5ICBBbGFuIENvb3BlcnNtaXRoICA8YWxhbi5jb29wZXJzbWl0aEBvcmFjbGUuY29tPgotCi0JRml4IGNwcGNoZWNrIDEuNjQgd2FybmluZy4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYyAoYWZfZmFjZV9nbG9iYWxzX25ldyk6IENhdGNoIE5VTEwgcG9pbnRlcgotCWRlcmVmZXJlbmNlIGluIGNhc2Ugb2YgZXJyb3IuCi0KLTIwMTQtMDMtMDkgIFNlYW4gTWNCcmlkZSAgPHNlYW5Acm9ndWUtcmVzZWFyY2guY29tPgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfZmFjZV9idWlsZF9jbWFwcyk6IFJlbW92ZSBjbGFuZyB3YXJuaW5nLgotCi0yMDE0LTAzLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi41LjMgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi01LTMnLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNS4zLgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIGJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi41LjIvMi41LjMvLCBzLzI1Mi8yNTMvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDMuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxNzoyOjExLgotCSogQ01ha2VMaXN0cy50eHQgKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gMy4KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNC0wMy0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4ZXMgZm9yIGNvbXBpbGF0aW9uIHdpdGggQysrLgotCi0JKiBzcmMvYXV0b2ZpdC9oYnNoaW0uYyAoc2NyaXB0cyk6IENoYW5nZSB0eXBlIHRvIGBoYl9zY3JpcHRfdCcuCi0JKGFmX2dldF9jb3ZlcmFnZSk6IFVwZGF0ZWQuCi0JKENPVkVSQUdFKTogQWRkIGNhc3QuCi0KLTIwMTQtMDMtMDYgIFNlYW4gTWNCcmlkZSAgPHNlYW5Acm9ndWUtcmVzZWFyY2guY29tPgotCi0JUmVtb3ZlIG1vcmUgY2xhbmcgYW5hbHl6ZXIgd2FybmluZ3MuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcmVhZHN0cmVhbSksIHNyYy90cnVldHlwZS90dGdsb2FkLmMKLQkoVFRfTG9hZF9HbHlwaCk6IFJlbW92ZSBkZWFkIHN0b3Jlcy4KLQotMjAxNC0wMy0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBTaW1wbGlmeS4KLQotMjAxNC0wMy0wNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCUZpeCBhIGJ1ZyBpbiBjb25maWd1cmUgaW4gbGlicmFyeSBkZXBlbmRlbmN5IHNldHRpbmcKLQlSZXBvcnRlZCBpbiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD03NTY1Mi4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogVXNlIGB4IiR7eHh4fSIgIT0geG5vJyBzdHlsZS4KLQotMjAxNC0wMy0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWlub3IgZml4IGZvciBgbWFrZSBkZXZlbCcuCi0KLQkqIGJ1aWxkcy9mcmVldHlwZS5tayAoSU5DTFVERV9GTEFHUykgW0RFVkVMX0RJUl06IERvbid0IHVzZQotCXBrZy1jb25maWcgZm9yIGJ6aXAyIHNpbmNlIG5vdCBhbGwgR05VL0xpbnV4IGRpc3RyaWJ1dGlvbnMgaGF2ZQotCWBiemlwMi5wYycgKGFuZCB0aGUgaGVhZGVyIGZpbGUgYGJ6bGliLmgnIGlzIGxvY2F0ZWQgaW4gL3Vzci9pbmNsdWRlCi0Jbm9ybWFsbHkpLgotCi0yMDE0LTAzLTA0ICBTZWFuIE1jQnJpZGUgIDxzZWFuQHJvZ3VlLXJlc2VhcmNoLmNvbT4KLQotCUZpeCBzZXZlcmFsIGNsYW5nIHN0YXRpYyBhbmFseXplciBkZWFkIHN0b3JlIHdhcm5pbmdzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX3JlbG9hZCwKLQlhZl9nbHlwaF9oaW50c19hbGlnbl93ZWFrX3BvaW50cyk6IFJlbW92ZSB1bm5lY2Vzc2FyeSBhc3NpZ25tZW50cy4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoYmRmX2ZvbnRfbG9hZCk6IERpdHRvLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jIChwc2hfZ2x5cGhfY29tcHV0ZV9leHRyZW1hLAotCXBzaF9nbHlwaF9pbnRlcnBvbGF0ZV9vdGhlcl9wb2ludHMpOiBEaXR0by4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9TZXRfTU1fQmxlbmQpOiBEaXR0by4KLQotMjAxNC0wMy0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmV3cml0ZSBsaWJyYXJ5IG9wdGlvbiBoYW5kbGluZyBpbiBgY29uZmlndXJlJy4KLQotCW8gSW50cm9kdWNlIGBhdXRvJyB2YWx1ZSBmb3IgYC0td2l0aC1YWFgnIGxpYnJhcnkgb3B0aW9uczsgdGhpcyBpcwotCSAgbm93IHRoZSBkZWZhdWx0LgotCi0JbyBGaXJzdCB1c2UgYHBrZy1jb25maWcnIGZvciBsaWJyYXJ5IGRldGVjdGlvbiwgdGhlbiBmYWxsIGJhY2sgdG8KLQkgIG90aGVyIHRlc3RzLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICgtLXdpdGgtemxpYiwgLS13aXRoLWJ6aXAyLCAtLXdpdGgtcG5nLAotCS0td2l0aC1oYXJmYnV6eik6IFJld3JpdGUuCi0JVXNlIG5ldyBgeHh4X3JlcXByaXYnLCBgeHh4X2xpYnByaXYnLCBhbmQgYHh4eF9saWJzdGF0aWNjb25mJwotCXZhcmlhYmxlcyB0byBjb2xsZWN0IGRhdGEgZm9yIGBmcmVldHlwZTIucGMnIGFuZCBgZnJlZXR5cGUtY29uZmlnJy4KLQkoRlQyX0VYVFJBX0xJQlMpOiBSZW5hbWVkIHRvIC4uLgotCShmdDJfZXh0cmFfbGlicyk6IFRoaXMgc2luY2UgaXQgZ2V0cyBubyBsb25nZXIgc3Vic3RpdHV0ZWQuCi0JKFJFUVVJUkVTX1BSSVZBVEUsIExJQlNfUFJJVkFURSwgTElCU19DT05GSUcsIExJQlNTVEFUSUNfQ09ORklHKToKLQlOZXcgb3V0cHV0IHZhcmlhYmxlcywgcmVwbGFjaW5nIGBYWFhfUEtHJyBhbmQgYExJQlhYWCcuCi0JQWRkIG5vdGljZSBhdCB0aGUgZW5kIG9mIGBjb25maWd1cmUnIHNob3dpbmcgdGhlIGxpYnJhcnkKLQljb25maWd1cmF0aW9uLgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW4gKC0tc3RhdGljKTogTmV3IGNvbW1hbmQgbGluZQotCW9wdGlvbi4KLQkobGlicyk6IFVwZGF0ZWQuCi0JKHN0YXRpY2xpYnMpOiBOZXcgdmFyaWFibGUsIHRvIGJlIHVzZWQgaWYgYC0tc3RhdGljJyBpcyBnaXZlbi4KLQkqIGRvY3MvZnJlZXR5cGUtY29uZmlnLjE6IERvY3VtZW50IGAtLXN0YXRpYycuCi0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlMi5pbiwgYnVpbGRzL3VuaXgvdW5peC1kZWYuaW46IFVwZGF0ZWQuCi0KLTIwMTQtMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUF2b2lkIGBsb25nIGxvbmcnIHdhcm5pbmdzIHdpdGggb2xkZXIgZ2NjIGNvbXBpbGVycy4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEhpbi1UYWsgTGV1bmcgPGh0bDEwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IERvbid0IHVzZSBnY2MncyBgLXBlZGFudGljJyBmbGFnIGZvcgotCXZlcnNpb25zIDwgNC42LiAgVGhpcyBpcyBlc3BlY2lhbGx5IG5lZWRlZCBmb3IgTWF4IE9TIFggc2luY2UgdGhpcwotCU9TIHJ1bnMgYSBnY2MgdmFyaWFudCAob3IgZW11bGF0aW9uKSBiYXNlZCBvbiB2ZXJzaW9uIDQuMi4xLgotCi0yMDE0LTAzLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvSU5TVEFMTC5DUk9TUzogUmV2aXNlZCBhbmQgdXBkYXRlZC4KLQotMjAxNC0wMy0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWFrZSBgbWFrZSBjbGVhbicgcmVtb3ZlIGBmcmVldHlwZTIucGMnLgotCi0JVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlIGF0IGJ1aWxkIHRpbWUsIG5vdCBjb25maWd1cmUgdGltZS4KLQotCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKERJU1RDTEVBTik6IE1vdmUgYGZyZWV0eXBlMi5wYycgdG8gLi4uCi0JKENMRUFOKTogVGhpcyB2YXJpYWJsZS4KLQotMjAxNC0wMy0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JVXNlIHBrZy1jb25maWcgZm9yIGRldGVjdGluZyBsaWJwbmcgYW5kIGxpYmJ6MiBhbHNvLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3IChIQVZFX1BLRyk6IE5ldyB2YXJpYWJsZS4KLQlTZWFyY2ggZm9yIGxpYmJ6MiB1c2luZyBgcGtnLWNvbmZpZyc7IHMvQloyL0JaSVAyLy4KLQlTZWFyY2ggZm9yIGxpYnBuZyB1c2luZyBgcGtnLWNvbmZpZycuCi0JRml4IGRlZmluaXRpb24gb2YgYExJQkhBUkZCVVpaJyB2YXJpYWJsZS4KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbiAoJGxpYnMpOiBVcGRhdGVkLgotCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluOiBBZGQgYFVSTCcgZmllbGQuCi0JVXBkYXRlIGBSZXF1aXJlcy5wcml2YXRlJyBhbmQgYExpYnMucHJpdmF0ZScuCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbjogVXBkYXRlZC4KLQotMjAxNC0wMy0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkIGNvbmZpZ3VyZSBzdXBwb3J0IGZvciBIYXJmQnV6ei4KLQotCSogYnVpbGRzL3VuaXgvcGtnLm00OiBOZXcgZmlsZS4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IFNlYXJjaCBmb3IgbGliaGFyZmJ1enogdXNpbmcKLQlgcGtnLWNvbmZpZycuCi0JQWRkIGAtLXdpdGhvdXQtaGFyZmJ1enonIG9wdGlvbi4KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbiwgYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluLAotCWJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChmcmVldHlwZS1jb25maWcsIGZyZWV0eXBlMi5wYyk6IEhhbmRsZQotCUhhcmZCdXp6LgotCi0JKiBkb2NzL0lOU1RBTEwuVU5JWDogRG9jdW1lbnQgaW50ZXJkZXBlbmRlbmN5IG9mIEZyZWV0eXBlIHdpdGgKLQlIYXJmQnV6ei4KLQotMjAxNC0wMi0yOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2NmZl0gTWF0aCBzaW1wbGlmaWNhdGlvbnMuCi0KLQkqIHNyYy9jZjJibHVlcy5jIChjZjJfYmx1ZXNfaW5pdCk6IFVzZSBgRlRfTXVsRGl2Jy4KLQkqIHNyYy9jZjJmdC5jIChjZjJfZ2V0U2NhbGVBbmRIaW50RmxhZyk6IFVzZSBzaW1wbGUgZGl2aXNpb24uCi0KLTIwMTQtMDItMjggIERhdmUgQXJub2xkICA8ZGFybm9sZEBhZG9iZS5jb20+Ci0KLQlbY2ZmXSBGaXggU2F2YW5uYWggYnVnICM0MTY5NywgcGFydCAyLgotCi0JKiBzcmMvY2ZmL2NmMmZ0LmMgKGNmMl9pbml0TG9jYWxSZWdpb25CdWZmZXIsCi0JY2YyX2luaXRHbG9iYWxSZWdpb25CdWZmZXIpOiBJdCBpcyBwb3NzaWJsZSBmb3IgYSBjaGFyc3RyaW5nIHRvIGNhbGwKLQlhIHN1YnJvdXRpbmUgaWYgbm8gc3Vicm91dGluZXMgZXhpc3QuICBUaGlzIGlzIGFuIGVycm9yIGJ1dCBzaG91bGQKLQlub3QgdHJpZ2dlciBhbiBhc3NlcnQuICBTcGxpdCB0aGUgYXNzZXJ0IHRvIGFjY291bnQgZm9yIHRoaXMuCi0KLTIwMTQtMDItMjggIERhdmUgQXJub2xkICA8ZGFybm9sZEBhZG9iZS5jb20+Ci0KLQlbY2ZmXSBGaXggU2F2YW5uYWggYnVnICM0MTY5NywgcGFydCAxLgotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmMgKGNmMl9oaW50bWFwX2J1aWxkKTogUmV0dXJuIHdoZW4gYGhpbnRNYXNrJyBpcwotCWludmFsaWQuICBJbiB0aGlzIGNhc2UsIGl0IGlzIG5vdCBzYWZlIHRvIHVzZSB0aGUgbGVuZ3RoIG9mCi0JYGhTdGVtSGludEFycmF5JzsgdGhlIGV4Y2VwdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlY29yZGVkIGluCi0JYGhpbnRNYXNrJy4KLQotMjAxNC0wMi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBTYXZhbm5haCBidWcgIzQxNjk2LgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDBfdmFsaWRhdGUsIHR0X2NtYXAyX3ZhbGlkYXRlLAotCXR0X2NtYXA0X3ZhbGlkYXRlLCB0dF9jbWFwMTRfdmFsaWRhdGUpOiBGaXggbGltaXQgdGVzdHMuCi0KLTIwMTQtMDItMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt3aW5mbnRdIEZpeCBTYXZhbm5haCBidWcgIzQxNjk0LgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9Mb2FkX0dseXBoKTogQ2hlY2sgZ2x5cGggb2Zmc2V0LgotCi0yMDE0LTAyLTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBGaXggU2F2YW5uYWggYnVnICM0MTY5My4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKENGRl9Mb2FkX0ZEX1NlbGVjdCk6IFJlamVjdCBlbXB0eSBhcnJheS4KLQotMjAxNC0wMi0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gRml4IFNhdmFubmFoIGJ1ZyAjNDE2OTIuCi0KLQliZGZsaWIgcHV0cyBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpbnRvIGEgYnVmZmVyIGluIGNodW5rcyBvZgotCTEwMjQgYnl0ZXMuICBUaGUgZGF0YSBpdHNlbGYgZ2V0cyB0aGVuIHBhcnNlZCBsaW5lIGJ5IGxpbmUsIHNpbXBseQotCWluY3JlYXNpbmcgdGhlIGN1cnJlbnQgcG9pbnRlciBpbnRvIHRoZSBidWZmZXI7IGlmIHRoZSBzZWFyY2ggZm9yCi0JdGhlIGZpbmFsIG5ld2xpbmUgY2hhcmFjdGVyIGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplLCBtb3JlIGRhdGEgZ2V0cwotCXJlYWQuCi0KLQlIb3dldmVyLCBpbiBjYXNlIHRoZSBjdXJyZW50IGxpbmUncyBlbmQgaXMgdmVyeSBuZWFyIHRvIHRoZSBidWZmZXIKLQllbmQsIGFuZCB0aGUga2V5d29yZCB0byBjb21wYXJlIHdpdGggaXMgbG9uZ2VyIHRoYW4gdGhlIGN1cnJlbnQKLQlsaW5lJ3MgbGVuZ3RoLCBhbiBvdXQtb2YtYm91bmRzIHJlYWQgbWlnaHQgaGFwcGVuIHNpbmNlIGBtZW1jbXAnCi0JZG9lc24ndCBzdG9wIHByb3Blcmx5IGF0IHRoZSBzdHJpbmcgZW5kLgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jOiBzL2Z0X21lbWNtcC9mdF9zdHJuY21wLyB0byBtYWtlIGNvbXBhcmlzb25zCi0Jc3RvcCBhdCBzdHJpbmcgZW5kcy4KLQotMjAxNC0wMi0xNyAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVthdXRvZml0XSBGaXggYG1ha2UgbXVsdGknIGNvbXBpbGF0aW9uLgotCi0JKiBzcmMvYXV0b2ZpdC9oYnNoaW0uYzogSW5jbHVkZSBgYWZnbG9iYWwuaCcgYW5kIGBhZnR5cGVzLmgnLgotCi0yMDE0LTAyLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0JICAgIFNpbW9uIELDvG56bGkgIDx6ZW5pa29AZ21haWwuY29tPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzI5MDIuCi0KLQlQYXRjaCB0YWtlbiBmcm9tCi0KLQkgIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avc3VtYXRyYXBkZi9zb3VyY2UvYnJvd3NlL3RydW5rL2V4dC9fcGF0Y2hlcy9mcmVldHlwZTIucGF0Y2g/c3BlYz1zdm44NjIwJnI9ODYyMCM4NwotCi0Jd2l0aCBzbGlnaHQgbW9kaWZpY2F0aW9ucy4KLQotCSogc3JjL3R5cGUxL3QxcGFyc2UuYyAoVDFfR2V0X1ByaXZhdGVfRGljdCk6IEFkZCBoZXVyaXN0aWMgdGVzdCB0bwotCWhhbmRsZSBmb250cyB0aGF0IGluY29ycmVjdGx5IHVzZSBcciBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGVleGVjCi0JYmxvY2suCi0KLTIwMTQtMDItMTkgIFNpbW9uIELDvG56bGkgIDx6ZW5pa29AZ21haWwuY29tPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDE1OTAuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZW5jb2RpbmcpOiBQcm90ZWN0IGFnYWluc3QgaW52YWxpZAotCW51bWJlci4KLQotMjAxNC0wMi0xMiAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCVtjZmZdIE9wdGltaXplIGJ5IHVzaW5nIGBGVF9NdWxEaXYnLgotCVN1Z2dlc3RlZCBieSBBbGV4ZWkuCi0KLQkqIHNyYy9jZmYvY2YyZm9udC5jIChjZjJfY29tcHV0ZURhcmtlbmluZyk6IERvIGl0LgotCi0yMDE0LTAyLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0MTQ2NS4KLQotCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKENMRUFOKTogQWRkIGBmcmVldHlwZS1jb25maWcnLgotCShESVNUQ0xFQU4pOiBSZW1vdmUgYGZyZWV0eXBlLWNvbmZpZycuCi0KLTIwMTQtMDItMDggIFNlYW4gTWNCcmlkZSAgPHNlYW5Acm9ndWUtcmVzZWFyY2guY29tPgotCi0JRml4IGNsYW5nIHN0YXRpYyBhbmFseXplciBhbmQgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfYWxpZ25fd2Vha19wb2ludHMpLAotCXNyYy9hdXRvZml0L2FmbG9hZGVyIChhZl9sb2FkZXJfbG9hZF9nKSA8RlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURT4sCi0Jc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX01TQiksIHNyYy9iYXNlL2Z0b3V0bG4uYwotCShGVF9PdXRsaW5lX0RlY29tcG9zZSksIHNyYy9iZGYvYmRmZHJpdnIuYyAoYmRmX2ludGVycHJldF9zdHlsZSksCi0Jc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfaW50ZWdlciksIHNyYy9jaWQvY2lkcGFyc2UuYwotCShjaWRfcGFyc2VyX25ldyksIHNyYy9wZnIvcGZybG9hZC5jIChwZnJfcGh5X2ZvbnRfbG9hZCksCi0Jc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChEZWNvbXBvc2VfQ3VydmUpLCBzcmMvc2ZudC9zZmRyaXZlci5jCi0JKHNmbnRfZ2V0X3BzX25hbWUpLCBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDEyX25leHQsCi0JdHRfY21hcDEzX25leHQpLCBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9obGluZSk6IFJlbW92ZSBkZWFkCi0JY29kZS4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYyAoYWZfcHJvcGVydHlfZ2V0X2ZhY2VfZ2xvYmFscywKLQlhZl9wcm9wZXJ0eV9zZXQsIGFmX3Byb3BlcnR5X2dldCksIHNyYy9iYXNlL2Z0Yml0bWFwLmMKLQkoZnRfZ3JheV9mb3JfcHJlbXVsdGlwbGllZF9zcmdiX2JncmEpOiBNYWtlIGZ1bmN0aW9ucyBzdGF0aWMuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9yZW1vdmVfcmVuZGVyZXIpOiBQcm90ZWN0IGFnYWluc3QKLQlsaWJyYXJ5ID09IE5VTEwuCi0JKGZ0X3Byb3BlcnR5X2RvKTogTWFrZSBmdW5jdGlvbiBzdGF0aWMuCi0KLQkqIHNyYy9iYXNlL2Z0cmZvcmsuYzogSW5jbHVkZSBgZnRiYXNlLmgnLgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAodHRfZmFjZV9sb2FkX3NiaXhfaW1hZ2UpCi0JWyFGVF9DT05GSUdfT1BUSU9OX1VTRV9QTkddLCBzcmMvdHlwZTEvdDFnbG9hZC5jCi0JKFQxX0NvbXB1dGVfTWF4X0FkdmFuY2UpOiBBdm9pZCBjb21waWxlciB3YXJuaW5nLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfTmV3X0NvbnRleHQpOiBSZWR1Y2Ugc2NvcGUgb2YKLQl2YXJpYWJsZS4KLQotMjAxNC0wMi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFdpbmRvd3MgYnVpbGQgZGlyZWN0b3JpZXMuCi0KLQlUaGUgYnVpbGQgdGFyZ2V0IGlzIG5vdyBgd2luZG93cycgaW5zdGVhZCBvZiBgd2luMzInLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBOaWNrb2xhcyBHZW9yZ2UgPGRhcmtub3ZhLmNsYW5AZ21haWwuY29tPi4KLQotCSogYnVpbGRzL21vZHVsZXMubWs6IERvbid0IHVzZSBgd2luMzInIGFuZCBgd2luMTYnICghKSBidXQKLQlgd2luZG93cycuCi0KLQkqIGJ1aWxkcy93aW5kb3dzL2RldGVjdC5taywgYnVpbGRzL3dpbmRvd3Mvd2luMzItZGVmLm1rOgotCXMvd2luMzIvd2luZG93cy8uCi0KLTIwMTQtMDItMDggIEV1Z2VuIFNhd2luICA8ZXNhd2luQG1vemlsbGEuY29tPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDE1MDcuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRtYXApCi0JWyFGVF9DT05GSUdfT1BUSU9OX1VTRV9QTkddIDwxNywgMTcsIDE5PjogRml4IGVycm9yIGhhbmRsaW5nLgotCi0yMDE0LTAyLTA4ICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCi0JW2NmZl0gRml4IG1pbm9yIHBlcmZvcm1hbmNlIGJ1Zy4KLQotCSogc3JjL2NmZi9jZjJmb250LmMgKGNmMl9mb250X3NldHVwKTogRGFya2VuaW5nIGFtb3VudCBhbmQgYmx1ZSB6b25lCi0JY2FsY3VsYXRpb25zIGFyZSBub3cgY2FjaGVkIGFuZCBub3QgcmVjb21wdXRlZCBvbiBlYWNoIGdseXBoLgotCi0yMDE0LTAyLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggcHJvYmxlbXMgd2l0aCBwZXJsIDUuOC44IGFzIGRpc3RyaWJ1dGVkIHdpdGggY3VycmVudCBNaW5HVy4KLQotCSogc3JjL3Rvb2xzL2FmYmx1ZS5wbDogV29yay1hcm91bmQgZm9yIFBlcmwgYnVnICM2MzQwMi4KLQkoc3RyaW5nX3JlKTogQXZvaWQgYHBvc3Nlc3NpdmUgcXVhbnRpZmllcnMnLCB3aGljaCBoYXZlIGJlZW4KLQlpbnRyb2R1Y2VkIGluIFBlcmwgdmVyc2lvbiA1LjEwLgotCi0yMDE0LTAyLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsYXRpb24gd2l0aCBNaW5HVy4KLQotCVJpZ2h0IG5vdywgY29tcGlsYXRpb24gb3V0IG9mIHRoZSBib3ggd2l0aCBsYXRlc3QgTWluR1cgaXMgYnJva2VuCi0JZHVlIHRvIGJ1Z3MgaW4gaGVhZGVyIGZpbGVzIG9mIG1pbmd3cnQgNC4wLjMgaW4gc3RyaWN0IEFOU0kgbW9kZSwKLQljZi4KLQotCSAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9taW5ndy9idWdzLzIwMjQvCi0JICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL21pbmd3L2J1Z3MvMjA0Ni8KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogRG9uJ3Qgc2V0IGAtYW5zaScgZmxhZyBmb3IgTWluR1cuCi0KLTIwMTQtMDItMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNaW5vciBmaXguCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19tZXRyaWNzX2luaXRfd2lkdGhzKSwKLQlzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMpOiBGaXggaGFuZGxpbmcKLQlvZiBhbHRlcm5hdGl2ZSBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCVRoaXMgYWxzbyBmaXhlcyBhIGNvbXBpbGF0aW9uIHdhcm5pbmcgaW4gbm9uLWRlYnVnIG1vZGUuCi0KLTIwMTQtMDItMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBTYXZhbm5haCBidWcgIzQxMzYzLgotCi0JKiBzcmMvY2ZmL2NmMmZ0LmMgKGNmMl9jaGVja1RyYW5zZm9ybSk6IENvbnZlcnQgYXNzZXJ0aW9uIGludG8KLQlwYXJhbWV0ZXIgY2hlY2suCi0JKGNmMl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogQ2FsbCBgY2YyX2NoZWNrVHJhbnNmb3JtJyBvbmx5IGlmCi0Jd2UgYXJlIHNjYWxpbmcgdGhlIG91dGxpbmUuCi0JKGNmMl9nZXRQcGVtWSk6IFJlbW92ZSBwcm9ibGVtYXRpYyBhc3NlcnRpb24uCi0KLTIwMTQtMDEtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbnRyb2R1Y2UgdHdvIG1vcmUgc2xvdHMgZm9yIHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQlUaGlzIGlzIHVzZWZ1bCBmb3IgT3BlblR5cGUgZmVhdHVyZXMgbGlrZSBgYzJzYycgKGNhcHMgdG8gc21hbGwKLQljYXBzKSB0aGF0IGRvbid0IGhhdmUgbG93ZXJjYXNlIGxldHRlcnMgYnkgZGVmaW5pdGlvbiwgb3Igb3RoZXIKLQlmZWF0dXJlcyB0aGF0IG1haW5seSBvcGVyYXRlIG9uIG51bWVyYWxzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgbW9yZSBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmg6IFVwZGF0ZSB1c2Ugb2YgYFNDUklQVCcgbWFjcm8uCi0JKEFGX1NjcmlwdENsYXNzUmVjKTogQWRkIG1lbWJlcnMgdG8gaG9sZCB0d28gbW9yZSBzdGFuZGFyZAotCWNoYXJhY3RlcnMuCi0JKEFGX0RFRklORV9TQ1JJUFRfQ0xBU1MpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jLCBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oLAotCSogc3JjL2F1dG9maXQvYWZwaWMuYywgc3JjL2F1dG9maXQvYWZyYW5nZXMuaCwgc3JjL2F1dG9maXQvaGJzaGltLmM6Ci0JVXBkYXRlIHVzZSBvZiBgU0NSSVBUJyBtYWNyby4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMpLAotCXNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyk6IFNjYW4gdHdvIG1vcmUKLQlzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0yMDE0LTAxLTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0MTMyMC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpCi0JPEFGX0xBVElOX0lTX0xPTkdfQkxVRT46IEF2b2lkIG5lZ2F0aXZlIGluZGV4IG9mIGBsYXN0Jy4KLQotMjAxNC0wMS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDEzMTAuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRtYXApIDxnbHlwaF9mb3JtYXQ9PTU+OgotCURvbid0IGNoZWNrIG1ldHJpY3MsIHdoaWNoIHRoaXMgZm9ybWF0IGRvZXNuJ3QgaGF2ZS4KLQlUaGlzIGlzIGFub3RoZXIgY29ycmVjdGlvbiB0byB0aGUgY29tbWl0IGZyb20gMjAxMy0xMS0yMS4KLQotMjAxNC0wMS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDEzMDkuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAodDFfcGFyc2VfZm9udF9tYXRyaXgpOiBQcm9wZXJseSBoYW5kbGUgcmVzdWx0Ci0Jb2YgYFQxX1RvRml4ZWRBcnJheScuCi0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfcGFyc2VfZm9udF9tYXRyaXgpOiBTeW5jaHJvbml6ZSB3aXRoCi0JYHQxX3BhcnNlX2ZvbnRfbWF0cml4Jy4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VfZm9udF9tYXRyaXgpOiBTeW5jaHJvbml6ZSB3aXRoCi0JYHQxX3BhcnNlX2ZvbnRfbWF0cml4Jy4KLQkodDQyX3BhcnNlX2VuY29kaW5nKTogU3luY2hyb25pemUgd2l0aCBgdDFfcGFyc2VfZW5jb2RpbmcnLgotCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX3BhcnNlcl9sb2FkX2ZpZWxkKSA8VDFfRklFTERfVFlQRV9CQk9YPiwKLQk8VDFfRklFTERfVFlQRV9NTU9YPjogUHJvcGVybHkgaGFuZGxlIHJlc3VsdCBvZiBgcHNfdG9maXhlZGFycmF5Jy4KLQotMjAxNC0wMS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9oYnNoaW0uYyAoYWZfZ2V0X2NvdmVyYWdlKTogRml4IG1lbW9yeSBsZWFrcy4KLQotMjAxNC0wMS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEltcHJvdmUgdHJhY2luZyBvZiBzdHlsZSBjb3ZlcmFnZXMuCi0KLQkqIGluY2x1ZGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGQgYGFmZ2xvYmFsJyBmb3IgdHJhY2luZyBzdHlsZQotCWNvdmVyYWdlcy4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ILgotCShGVF9DT01QT05FTlQpOiBEZWZpbmUuCi0JKGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3N0eWxlX2NvdmVyYWdlKTogVHJhY2UgYGdzdHlsZXMnIGFycmF5Ci0JZGF0YS4KLQotMjAxNC0wMS0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDExNTguCi0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBDcmVhdGUgbWFuIHBhZ2UgZGlyZWN0b3J5LgotCi0yMDE0LTAxLTA4ICBDaG9uZ3l1IFpodSAgPGxlbWJhY29uQGdtYWlsLmNvbT4KLQotCVthcm1dIEZpeCBTYXZhbm5haCBidWcgIzQxMTM4LCBwYXJ0IDIuCi0KLQkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluIChGVF9NdWxGaXhfYXJtKSwgaW5jbHVkZS9jb25maWcvZnRjb25maWcuaAotCShGVF9NdWxGaXhfYXJtKSwgc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX011bEZpeDE0X2FybSk6IEZpeAotCXByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgZm9yIGBhZGQudycuCi0KLTIwMTQtMDEtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggU2F2YW5uYWggYnVnICM0MTEzOCwgcGFydCAxLgotCi0JKiBzcmMvdG9vbHMvYWZibHVlLnBsIDxIYW5kbGluZyAjZW5kaWY+OiBQcm9kdWNlIGNvcnJlY3QgYXV4aWxpYXJ5Ci0JZW51bWVyYXRpb24gbmFtZXMgZm9yIGdlbmVyYXRlZCBgI2Vsc2UnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLTIwMTQtMDEtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBtYW51YWwgcGFnZSBmb3IgYGZyZWV0eXBlLWNvbmZpZycuCi0JQ29udHJpYnV0ZWQgYnkgTmlzIE1hcnRlbnNlbiA8bmlzLm1hcnRlbnNlbkB3ZWIuZGU+LgotCi0JKiBkb2NzL2ZyZWV0eXBlLWNvbmZpZy4xOiBOZXcgZmlsZS4KLQotCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKG1hbmRpcik6IERlZmluZS4KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwsIHVuaW5zdGFsbCk6IEhhbmRsZSBtYW5wYWdlLgotCi0yMDE0LTAxLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWlub3IgZml4ZXMgZm9yIGBhZmJsdWUucGwnLgotCi0JKiBzcmMvdG9vbHMvYWZibHVlLnBsIChhdXhfbmFtZSk6IERvbid0IHVzZSBgcmV2ZXJzZScuCi0JPEhhbmRsaW5nICNlbmRpZj46IFVzZSBwcm9wZXIgaW5kZW50YXRpb24gZm9yIGdlbmVyYXRlZCBgI2Vsc2UnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLTIwMTQtMDEtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggSW5kaWMgc2NyaXB0cy4KLQotCVNwbGl0IHRoZSBzaW5nbGUsIGluY29ycmVjdCBJbmRpYyBlbnRyeSBpbnRvIHNlcGFyYXRlIHNjcmlwdHMgc28KLQl0aGF0IHRoZSBjb3ZlcmVkIHJhbmdlcyBhcmUgdGhlIHNhbWU6IEJlbmdhbGksIERldmFuYWdhcmksIEd1amFyYXRpLAotCUd1cm11a2hpLCBLYW5uYWRhLCBMaW1idSwgTWFsYXlhbGFtLCBPcml5YSwgU2luaGFsYSwgU3VuZGFuZXNlLAotCVN5bG90aSBOYWdyaSwgVGFtaWwsIFRlbHVndSwgYW5kIFRpYmV0YW4uICBBdCB0aGUgc2FtZSB0aW1lLCByZW1vdmUKLQllbnRyaWVzIGZvciBNZWV0ZWkgTWF5ZWsgYW5kIFNoYXJhZGEg4oCTIHRoZSBVbmljb2RlIHJhbmdlcyB3ZXJlCi0JaW5jb3JyZWN0IChhbmQgbm9ib2R5IGhhcyBjb21wbGFpbmVkIGFib3V0IHRoYXQpLCBmb250cyBhcmUgc2NhcmNlCi0JZm9yIHRob3NlIHNjcmlwdHMsIGFuZCB0aGUgSW5kaWMgYXV0by1oaW50ZXIgc3VwcG9ydCBpcyBydWRpbWVudGFyeQotCWFueXdheXMuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IFVwZGF0ZWQsIHVzaW5nIEFGX0NPTkZJR19PUFRJT05fSU5ESUMgYW5kCi0JQUZfQ09ORklHX09QVElPTl9DSksuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmggKFNUWUxFX0RFRkFVTFRfSU5ESUMpOiBOZXcgYXV4aWxpYXJ5IG1hY3JvLgotCVVzZSBpdCwgdG9nZXRoZXIgd2l0aCBBRl9DT05GSUdfT1BUSU9OX0lORElDIGFuZAotCUFGX0NPTkZJR19PUFRJT05fQ0pLLCB0byB1cGRhdGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMgW0FGX0NPTkZJR19PUFRJT05fSU5ESUNdOiBVcGRhdGVkLgotCVshQUZfQ09ORklHX09QVElPTl9JTkRJQywgIUFGX0NPTkZJR19PUFRJT05fQ0pLXTogUmVtb3ZlZC4KLQlTb3J0IGVudHJpZXMgYnkgdGFncy4KLQotMjAxNC0wMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFRoaW5rby4KLQotCSogc3JjL2F1dG9maXQvaGJzaGltLmMgKGFmX2dldF9jaGFyX2luZGV4KTogU2ltaWxhciB0bwotCWBhZl9nZXRfY292ZXJhZ2UnLCByZWplY3QgZ2x5cGhzIHdoaWNoIGFyZSBub3Qgc3Vic3RpdHV0ZWQuCi0KLTIwMTQtMDEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggaGFuZGxpbmcgb2YgZGVmYXVsdCBjb3ZlcmFnZXMuCi0KLQlXaXRoIHRoaXMgY29tbWl0LCB0aGUgaW1wbGVtZW50YXRpb24gb2YgY292ZXJhZ2UgaGFuZGxpbmcgaXMKLQljb21wbGV0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5jIChhZl9nZXRfY292ZXJhZ2UpOiBFeGl0IGVhcmx5IGlmIG5vdGhpbmcgdG8KLQlkby4KLQlSZWplY3QgY292ZXJhZ2VzIHdoaWNoIGRvbid0IGNvbnRhaW4gYXBwcm9wcmlhdGUgZ2x5cGhzIGZvciBibHVlCi0Jem9uZXMuCi0KLTIwMTQtMDEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggaGFuZGxpbmcgb2YgZGVmYXVsdCBjb3ZlcmFnZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3N0eWxlX2NvdmVyYWdlKToKLQlGaXJzdCBoYW5kbGUgbm9uLWRlZmF1bHQgY292ZXJhZ2VzLCB0aGVuIHRoZSBkZWZhdWx0IGNvdmVyYWdlIG9mIHRoZQotCWRlZmF1bHQgc2NyaXB0LCBhbmQgZmluYWxseSB0aGUgb3RoZXIgZGVmYXVsdCBjb3ZlcmFnZXMuCi0KLTIwMTQtMDEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggc2NhbGluZyBvZiBIYXJmQnV6eiBzaGFwaW5nLgotCi0JKiBzcmMvYXV0b2ZpdC9oYnNoaW0uYyAoYWZfZ2V0X2NoYXJfaW5kZXgpOiBTY2FsZSB0byB1bml0cyBwZXIgRU0uCi0KLTIwMTQtMDEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBCZXR0ZXIgZnRncmlkIHN1cHBvcnQuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfZ2V0X3NlZ21lbnRfb2Zmc2V0KTogQWRkCi0JcGFyYW1ldGVycyBgaXNfYmx1ZScgYW5kIGBibHVlX29mZnNldCcuCi0KLTIwMTQtMDEtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBSZW1vdmUgc29tZSBzdHlsZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmY292ZXIuaDogUmVtb3ZlIGNvdmVyYWdlcyBmb3IgYWx0ZXJuYXRpdmUgZnJhY3Rpb25zLAotCWRlbm9taW5hdG9ycywgbnVtZXJhdG9ycywgYW5kIGZyYWN0aW9ucy4KLQotCSogc3JjL2F1dG9maXQvYWZzdHlsZXMuaCAoTUVUQV9TVFlMRV9MQVRJTik6IFVwZGF0ZWQuCi0KLTIwMTQtMDEtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBZGQgbW9yZSBzdHlsZXMuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmggKFNUWUxFX0xBVElOLCBNRVRBX1NUWUxFX0xBVElOKTogTmV3Ci0JYXV4aWxpYXJ5IG1hY3JvczsgdXNlIHRoZW0gdG8gZGVmaW5lIHN0eWxlcyBmb3IgQ3lyaWxsaWMsIEdyZWVrLCBhbmQKLQlMYXRpbi4KLQotCSogc3JjL2F1dG9maXQvYWZjb3Zlci5oOiBSZW1vdmUgY292ZXJhZ2UgZm9yIG9sZHN0eWxlIGZpZ3VyZXMuCi0JU2luY2UgdGhvc2UgZGlnaXRzIGFyZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggb3JkaW5hcnkgbGV0dGVycywgaXQKLQltYWtlcyBubyBzZW5zZSB0byBoYW5kbGUgdGhlbSBzZXBhcmF0ZWx5LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfZ2V0X21ldHJpY3MpOiBEb24ndCBsaW1pdAotCWBvcHRpb25zJyBwYXJhbWV0ZXIgdG8gNCBiaXRzLgotCi0yMDE0LTAxLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gRml4IHN0eWxlIGFzc2lnbm1lbnRzIHRvIGdseXBocy4KLQotCSogc3JjL2F1dG9maXQvaGJzaGltLmMgKGFmX2dldF9jb3ZlcmFnZSkKLQlbRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlpdOiBTY2FuIEdQT1MgY292ZXJhZ2Ugb2YgZmVhdHVyZXMgYWxzbwotCXNvIHRoYXQgd2UgY2FuIHNraXAgZ2x5cGhzIHRoYXQgaGF2ZSBib3RoIEdTVUIgYW5kIEdQT1MgZGF0YS4KLQotMjAxNC0wMS0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9oYnNoaW0uYzogcy97bG9va3VwcyxnbHlwaHN9L2dzdWJfe2xvb2t1cHMsZ2x5cGhzfS8uCi0KLTIwMTQtMDEtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbXBsZW1lbnQgYW5kIHVzZSBgYWZfZ2V0X2NoYXJfaW5kZXgnIHdpdGggSGFyZkJ1enouCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5jIChDT1ZFUkFHRSkgW0ZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaXToKLQlSZWRlZmluZSB0byBjb25zdHJ1Y3QgSGFyZkJ1enogZmVhdHVyZXMuCi0JKGFmX2dldF9jaGFyX2luZGV4KSBbRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlpdOiBSZXdyaXR0ZW4uCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogVXNlCi0JYHlfb2Zmc2V0JyB0byBhZGp1c3QgYGJlc3RfeScuCi0KLTIwMTMtMTItMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBzL0FGX1NUWUxFXy4uLi5fREVGQVVMVC9BRl9TVFlMRV8uLi4uX0RGTFQvaS4KLQotMjAxMy0xMi0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCBpbnRlcmZhY2Ugb2YgYGFmX2dldF9jaGFyX2luZGV4Jy4KLQotCSogc3JjL2F1dG9maXQvaGJzaGltLmMgKGFmX2dldF9jaGFyX2luZGV4KTogUmV0dXJuIGVycm9yIHZhbHVlLgotCUFkZCBhcmd1bWVudCBmb3IgeSBvZmZzZXQgKHRvIGJlIHVzZWQgaW4gYSB5ZXQtdG8tY29tZSBwYXRjaCkuCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5oLCBzcmMvYXV0b2ZpdC9hZmNqay5jLAotCXNyYy9hdXRvZml0L2FmbGF0aW4uYzogVXBkYXRlZC4KLQotMjAxMy0xMi0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIERvbid0IGNvbWJpbmUgbXVsdGlwbGUgZmVhdHVyZXMgaW50byBvbmUgc2V0LgotCi0JQ29tYmluaW5nIHRoZW0sIGFzIG9yaWdpbmFsbHkgZW52aXNpb25lZCwgd291bGQgbGVhZCB0byBtdWNoIG1vcmUKLQljb21wbGljYXRlZCBjb2RlLCBhcyBpbnZlc3RpZ2F0aW9ucyBoYXZlIHNob3duIG1lYW53aGlsZS4gIFRoZSBtYWpvcgotCWRyYXdiYWNrIGlzIHRoYXQgd2UgcnVuIG91dCBvZiBhdmFpbGFibGUgc3R5bGUgc2xvdHMgbXVjaCBlYXJsaWVyLgotCUhvd2V2ZXIsIHRoaXMgaXMgb25seSBhIHRoZW9yZXRpY2FsIGlzc3VlIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgYQotCWxhcmdlIG51bWJlciBvZiBzY3JpcHRzIGN1cnJlbnRseS4KLQotCSogc3JjL2F1dG9maXQvYWZjb3Zlci5oOiBSZXBsYWNlIGBDT1ZFUkFHRV97MSwyLDN9JyBtYWNyb3Mgd2l0aAotCWEgc2luZ2xlLWVsZW1lbnQgYENPVkVSQUdFJyBtYWNybywgc29ydCB0aGUgZWxlbWVudHMgYnkgdGhlIGZlYXR1cmUKLQl0YWdzLCBhbmQgYWRkIGVudHJ5IGZvciBgcnVieScuCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaDogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5jOiBVcGRhdGVkLgotCi0yMDEzLTEyLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQ29kZSBzaHVmZmxpbmcgdG8gcmVkdWNlIHVzZSBvZiBjcHAgbWFjcm9zLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zdHlsZV9jb3ZlcmFnZSk6Ci0JQ2FsbCBgYWZfZ2V0X2NvdmVyYWdlJyB1bmNvbmRpdGlvbmFsbHkuCi0KLQkqIHNyYy9hdXRvZml0L2F1dG9maXQuYzogSW5jbHVkZSBgaGJzaGltLmMnIHVuY29uZGl0aW9uYWxseS4KLQotCSogc3JjL2F1dG9maXQvaGJzaGltLmMgKGFmX2dldF9jb3ZlcmFnZSkKLQlbIUZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaXTogUHJvdmlkZSBkdW1teSBmdW5jdGlvbi4KLQotCSogc3JjL2F1dG9maXQvaGJzaGltLmg6IFByb3ZpZGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0JdW5jb25kaXRpb25hbGx5LgotCi0yMDEzLTEyLTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGBGVF9HZXRfQ2hhcl9JbmRleCcuCi0KLQlZZXQtdG8tY29tZSBjaGFuZ2VzIHdpbGwgcHJvdmlkZSBIYXJmQnV6eiBmdW5jdGlvbmFsaXR5IGZvciB0aGUgbmV3Ci0JZnVuY3Rpb24uCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5jIChhZl9nZXRfY2hhcl9pbmRleCk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5oOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfbWV0cmljc19pbml0X3dpZHRocywKLQlhZl9jamtfbWV0cmljc19pbml0X2JsdWVzLCBhZl9jamtfbWV0cmljc19jaGVja19kaWdpdHMpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMsCi0JYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzLCBhZl9sYXRpbl9tZXRyaWNzX2NoZWNrX2RpZ2l0cyk6Ci0JVXBkYXRlZC4KLQotMjAxMy0xMi0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFVzZSBgZ2xvYmFsJyBIYXJmQnV6eiBmb250IG9iamVjdC4KLQotCVdlIG5vdyB1c2UgYGhiX2ZvbnQnIGluc3RlYWQgb2YgYGhiX2ZhY2UnIHNpbmNlIHlldC10by1jb21lIGNoYW5nZXMKLQluZWVkIHRoaXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmg6IEluY2x1ZGUgYGhic2hpbS5oJy4KLQkoQUZfRmFjZUdsb2JhbHNSZWMpIFtGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWl06IE5ldyBtZW1iZXIKLQlgaGJfZm9udCcuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19uZXcpCi0JW0ZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaXTogQ3JlYXRlIGBoYl9mb250Jy4KLQkoYWZfZmFjZV9nbG9iYWxzX2ZyZWUpIFtGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWl06IERlc3Ryb3kKLQlgaGJfZm9udCcuCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5oOiBJbmNsdWRlIEhhcmZCdXp6IGhlYWRlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5jOiBJbmNsdWRlIGBoYnNoaW0uaCcgaW5zdGVhZCBvZiBIYXJmQnV6egotCWhlYWRlcnMuCi0JKGFmX2dldF9jb3ZlcmFnZSk6IFVwZGF0ZWQuCi0KLTIwMTMtMTItMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBIYW5kbGUgYERGTFQnIE9wZW5UeXBlIHNjcmlwdCBmb3IgY292ZXJhZ2VzLgotCi0JKiBpbmNsdWRlL2Z0YXV0b2guaDogRG9jdW1lbnQgbmV3IGBkZWZhdWx0LXNjcmlwdCcgcHJvcGVydHkuCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5jIChhZl9nZXRfY292ZXJhZ2UpOiBVc2UgYEFGX0ZhY2VHbG9iYWxzJyBmb3IKLQl0eXBlIG9mIGZpcnN0IHBhcmFtZXRlci4KLQkoc2NyaXB0X3RhZ3MpOiBBZGQgb25lIG1vcmUgZWxlbWVudC4KLQkoYWZfZ2V0X2NvdmVyYWdlKTogQWRqdXN0IGBzY3JpcHRfdGFncycgdG8gaGFuZGxlIGBERkxUJyBzY3JpcHQgdGFnLgotCi0JKiBzcmMvYXV0b2ZpdC9oYnNoaW0uaDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYyAoYWZfZmFjZV9nbG9iYWxzX2NvbXB1dGVfc3R5bGVfY292ZXJhZ2UpOgotCVVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmggKEFGX1NDUklQVF9ERUZBVUxUKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5oIChBRl9Nb2R1bGVSZWMpOiBOZXcgYGRlZmF1bHRfc2NyaXB0JwotCW1lbWJlci4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYyAoYWZfcHJvcGVydHlfc2V0LCBhZl9wcm9wZXJ0eV9nZXQpOiBIYW5kbGUKLQlgZGVmYXVsdC1zY3JpcHQnIHByb3BlcnR5LgotCShhZl9hdXRvZml0dGVyX2luaXQpOiBVcGRhdGVkLgotCi0yMDEzLTEyLTI3ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW2Z0cmZvcmtdIEZpeCB0aGUgZmFjZSBvcmRlciBkaWZmZXJlbmNlIGJldHdlZW4gUE9TSVggYW5kIENhcmJvbi4KLQotCVRoZSBmcmFnbWVudGVkIHJlc291cmNlcyBpbiBTdWl0Y2FzZSBhbmQgLmRmb250IHNob3VsZCBiZSByZW9yZGVyZWQKLQl3aGVuIGBQT1NUJyByZXNvdXJjZSBmb3IgVHlwZTEgaXMgYmVpbmcgcmVzdG9yZWQsIGJ1dCByZW9yZGVyaW5nIG9mCi0Jc2ZudCByZXNvdXJjZXMgaW5kdWNlcyB0aGUgZGlmZmVyZW50IGZhY2Ugb3JkZXIuICBOb3cgdGhlIG9yZGVyaW5nCi0JaXMgcmVzdHJpY3RlZCB0byBgUE9TVCcgcmVzb3VyY2Ugb25seSwgdG8gcHJldmVudCB0aGUgZGlmZmVyZW50Ci0Jb3JkZXIgaXNzdWUgKGUuZy4gdGhlIGZhY2UgaW5kZXggaW4gdGhlIGZvbnRjb25maWcgY2FjaGUgZ2VuZXJhdGVkCi0Jd2l0aCBDYXJib24gZnJhbWV3b3JrIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoYXQgYnkgRnJlZVR5cGUgMgotCXdpdGhvdXQgQ2FyYm9uIGZyYW1ld29yay4pICBGb3VuZCBieSBLaGFsZWQgSG9zbnkgYW5kIEhpbi1UYWsgTGV1bmcuCi0KLQlodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMy0wMi9tc2cwMDAzNS5odG1sCi0JaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTMtMTIvbXNnMDAwMjcuaHRtbAotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzKTogQWRkIGEgc3dpdGNoCi0JYHNvcnRfYnlfcmVzX2lkJyB0byBjb250cm9sIHRoZSBmcmFnbWVudGVkIHJlc291cmNlIG9yZGVyaW5nLgotCSogaW5jbHVkZS9pbnRlcm5hbC9mdHJmb3JrLmg6IERlY2xhcmUgbmV3IHN3aXRjaC4KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChJc01hY1Jlc291cmNlKTogRW5hYmxlIHRoZSBzb3J0aW5nIGZvciBgUE9TVCcKLQlyZXNvdXJjZSwgYW5kIGRpc2FibGUgdGhlIHNvcnRpbmcgZm9yIGBzZm50JyByZXNvdXJjZS4KLQotMjAxMy0xMi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDA5OTcuCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IE9ubHkgdXNlIE9SIG9wZXJhdG9yIHRvCi0JYWRqdXN0IGZhY2UgZmxhZ3Mgc2luY2UgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSBtaWdodCBhbHJlYWR5Ci0JYmUgc2V0LgotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBEaXR0by4KLQkqIHNyYy9jaWQvY2lkb2Jqcy5jIChjaWRfZmFjZV9pbml0KTogRGl0dG8uCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2xvYWRfZm9udCk6IERpdHRvLgotCSogc3JjL3Bmci9wZnJvYmpzLmMgKHBmcl9mYWNlX2luaXQpOiBEaXR0by4KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KTogRGl0dG8uCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCk6IERpdHRvLgotCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChGTlRfRmFjZV9Jbml0KTogRGl0dG8uCi0KLTIwMTMtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbnRyb2R1Y2UgYGNvdmVyYWdlcycuCi0KLQlDb3ZlcmFnZXMgYXJlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIEhhcmZCdXp6IGxpYnJhcnkgdG8gYWNjZXNzCi0JT3BlblR5cGUgZmVhdHVyZXMgZm9yIGhhbmRsaW5nIGdseXBocyBub3QgYWRkcmVzc2FibGUgYnkgdGhlIGNtYXAuCi0KLQlSaWdodCBub3csIGNvbXBpbGF0aW9uIG9mIEhhcmZCdXp6IGlzIG9ubHkgYWRkZWQgdG8gdGhlIGRldmVsb3BtZW50Ci0JYnVpbGQuICBBIHNvbHV0aW9uIGZvciBzdGFuZGFyZCBidWlsZCBtb2RlIHdpbGwgYmUgZGVsYXllZCB1bnRpbAotCUhhcmZCdXp6IGdldHMgc3BsaXQgaW50byB0d28gbGlicmFyaWVzIHRvIGF2b2lkIG11dHVhbCBkZXBlbmRlbmNpZXMKLQliZXR3ZWVuIEZyZWVUeXBlIGFuZCBIYXJmQnV6ei4KLQotCU5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgYSBmaXJzdCBzdGVwIGluIGhhbmRsaW5nIGNvdmVyYWdlcywgYmFzaWNhbGx5Ci0JcHJvdmlkaW5nIHRoZSBmcmFtZXdvcmsgb25seS4gIENvZGUgZm9yIGhhbmRsaW5nIHNlbGVjdGVkIE9wZW5UeXBlCi0JZmVhdHVyZXMgKHRoaXMgaXMsIGFjdHVhbGx5IHVzaW5nIHRoZSBkYXRhIGluIGBhZmNvdmVyLmgnKSB3aWxsCi0JZm9sbG93LgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvYXV0b2ZpdC9oYnNoaW0uYywgc3JjL2F1dG9maXQvaGJzaGltLmgsIHNyYy9hdXRvZml0L2FmY292ZXIuaDoKLQlOZXcgZmlsZXMuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBIYXJmQnV6eiBzY3JpcHQgbmFtZSB0YWdzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgZGVmYXVsdCBjb3ZlcmFnZSBlbnVtZXJhdGlvbiB2YWx1ZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaDogVXBkYXRlIHVzZSBvZiBgU0NSSVBUJyBhbmQgYFNUWUxFJyBtYWNyb3MuCi0JKEFGX0NvdmVyYWdlKTogTmV3IGVudW1lcmF0aW9uIChnZW5lcmF0ZWQgYnkgYGFmY292ZXIuaCcpLgotCShBRl9TdHlsZUNsYXNzUmVjKTogTmV3IG1lbWJlciBgY292ZXJhZ2UnLgotCShBRl9ERUZJTkVfU1RZTEVfQ0xBU1MpOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL2Z0dHJhY2UuaDogQWRkIGBhZmhhcmZidXp6JyBmb3IgdHJhY2luZyBjb3ZlcmFnZQotCWRhdGEuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmg6IFVwZGF0ZSB1c2Ugb2YgYFNDUklQVCcgYW5kIGBTVFlMRScgbWFjcm9zLgotCShBRl9TQ1JJUFRfRkFMTEJBQ0spOiBSZW5hbWVkIHRvIC4uLgotCShBRl9TVFlMRV9GQUxMQkFDSyk6IC4uLiB0aGlzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jOiBJbmNsdWRlIGBoYnNoaW0uYycuCi0JVXBkYXRlIHVzZSBvZiBgU0NSSVBUJyBhbmQgYFNUWUxFJyBtYWNyb3MuCi0JKGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3N0eWxlX2NvdmVyYWdlKQotCVtGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWl06IENhbGwgYGFmX2dldF9jb3ZlcmFnZScuCi0JVXBkYXRlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5oIChBRl9Nb2R1bGVSZWMpOgotCXMvZmFsbGJhY2tfc2NyaXB0L2ZhbGxiYWNrX3N0eWxlLy4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYyAoYWZfcHJvcGVydHlfc2V0KTogQWRhcHQgaGFuZGxpbmcgb2YKLQlgZmFsbGJhY2stc2NyaXB0JyBwcm9wZXJ0eSB0byBzZXQgYSBmYWxsYmFjayBzdHlsZS4KLQkoYWZfcHJvcGVydHlfZ2V0LCBhZl9hdXRvZml0dGVyX2luaXQpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnBpYy5jOiBVcGRhdGUgdXNlIG9mIGBTQ1JJUFQnIGFuZCBgU1RZTEUnIG1hY3Jvcy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuaDogVXBkYXRlIHVzZSBvZiBgU0NSSVBUJyBtYWNyby4KLQotCSogc3JjL2F1dG9maXQvYXV0b2ZpdC5jIFtGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWl06IEluY2x1ZGUKLQlgaGJzaGltLmMnLgotCi0JKiBzcmMvYXV0b2ZpdC9ydWxlcy5tayAoQVVUT0ZfRFJWX1NSQyk6IEFkZCBgaGJzaGltLmMnLgotCShBVVRPRl9EUlZfSCk6IEFkZCBgYWZjb3Zlci5oJy4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChJTkNMVURFX0ZMQUdTKSBbREVWRUxfRElSXTogVXNlIHBrZy1jb25maWcgZm9yCi0JYWxsIGxpYnJhcmllcyBuZWVkZWQgYnkgRnJlZVR5cGUuCi0KLTIwMTMtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzQwOTc1IChzb3J0IG9mKS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JUCk6IEZpeCBzaWduIHR5cG8gdG8gbWFrZSBGcmVlVHlwZQotCWJlaGF2ZSB0aGUgc2FtZSBhcyB0aGUgV2luZG93cyBUcnVlVHlwZSBlbmdpbmUgZm9yIHRoZSBpbnZhbGlkIGNhc2UuCi0KLTIwMTMtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNYWtlIFBJQyBtb2RlIHdvcmsgYWN0dWFsbHkuCi0KLQkqIHNyYy9hdXRvZml0L2FmcGljLmggKEFGTW9kdWxlUElDKTogRml4IGFycmF5IHNpemVzIHRvIGZpdCB0aGUKLQllbnVtZXJhdGlvbiB2YWx1ZXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgaW5jbHVkaW5nIGBhZnNjcmlwdC5oJwotCWFuZCBmcmllbmRzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnBpYy5jIChhdXRvZml0X21vZHVsZV9jbGFzc19waWNfaW5pdCk6IFVwZGF0ZWQuCi0KLTIwMTMtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBQSUMgbGlua2luZy4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9mdHJmb3JrLmggKENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfQkVHSU4pOiBGaXgKLQlnZW5lcmF0ZWQgZnVuY3Rpb24gbmFtZS4KLQotCSogc3JjL2Jhc2UvYmFzZXBpYy5jIChGVF9Jbml0X1RhYmxlX3JhY2Nlc3NfZ3Vlc3NfdGFibGUpOiBSZW5hbWUKLQl0byAuLi4KLQkoRlRfSW5pdF9UYWJsZV9mdF9yYWNjZXNzX2d1ZXNzX3RhYmxlKTogLi4uIHRoaXMgc28gdGhhdCB0aGUKLQlmdW5jdGlvbiBuYW1lIGNvcnJlY3RseSBjb3JyZXNwb25kcyB0byB3aGF0IHRoZSBtYWNybyBmcmFtZXdvcmsKLQlleHBlY3RzLgotCi0JKiBzcmMvcHNuYW1lcy9ydWxlcy5tayAoUFNOQU1FU19EUlZfU1JDX1MpOiBVc2UgY29ycmVjdCBmaWxlIG5hbWUgc28KLQl0aGF0IFBJQyBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkIGFsc28uCi0KLTIwMTMtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBBZGQgbWlzc2luZyBkZXBlbmRlbmNpZXMgdG8gTWFrZWZpbGUuCi0KLQkqIHNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyk6IEFkZCBgYmFzZXBpYy5jJyBhbmQgYGZ0cGljLmMnLgotCShCQVNFX0gpOiBBZGQgYGJhc2VwaWMuaCcuCi0KLTIwMTMtMTItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggUElDIGNvbXBpbGF0aW9uLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfbWV0cmljc19pbml0X3dpZHRocyksCi0Jc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzKQotCVtGVF9DT05GSUdfT1BUSU9OX1BJQ106IERlY2xhcmUgYGdsb2JhbHMnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jOiBBbHdheXMgY2FsbCBBRl9ERUZJTkVfU0NSSVBUX0NMQVNTLCBhbmQKLQlBRl9ERUZJTkVfU1RZTEVfQ0xBU1MuCi0KLQkqIHNyYy9hdXRvZml0L2FmcGljLmM6IEluY2x1ZGUgYGFmZ2xvYmFsLmgnLgotCShhdXRvZml0X21vZHVsZV9jbGFzc19waWNfaW5pdCk6IFR5cG8uCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCAoQUZfREVGSU5FX1NDUklQVF9DTEFTUywKLQlBRl9ERUZJTkVfU1RZTEVfQ0xBU1MpOiBEb24ndCB1c2UgdGhlIHNhbWUgaWRlbnRpZmllciBmb3IgbWFjcm8KLQlwYXJhbWV0ZXIgYW5kIHN0cnVjdHVyZSBtZW1iZXIuCi0KLTIwMTMtMTItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbnRyb2R1Y2UgYHN0eWxlcycuCi0KLQlUaGlzIGlzIHRoZSBuZXcgdG9wLWxldmVsIHN0cnVjdHVyZSBmb3IgaGFuZGxpbmcgZ2x5cGggaW5wdXQgZGF0YTsKLQlzY3JpcHRzIGFyZSBub3cgZGVmaW5lZCBzZXBhcmF0ZWx5LgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggKFNDUklQVCk6IFVwZGF0ZWQuCi0JKEFGX1NjcmlwdENsYXNzUmVjKTogTW92ZSBgYmx1ZV9zdHJpbmdzZXQnIGFuZCBgd3JpdGluZ19zeXN0ZW0nCi0JbWVtYmVycyB0byAuLi4KLQkoQUZfU3R5bGVfQ2xhc3NSZWMpOiAuLi4gdGhpcyBuZXcgc3RydWN0dXJlLgotCShBRl9TdHlsZSk6IE5ldyBlbnVtZXJhdGlvbi4KLQkoQUZfU3R5bGVNZXRyaWNzUmVjKTogUmVwbGFjZSBgc2NyaXB0JyBlbnVtZXJhdGlvbiB3aXRoCi0JYHN0eWxlX2NsYXNzJyBwb2ludGVyLgotCShBRl9ERUZJTkVfU0NSSVBUX0NMQVNTLCBBRl9ERUNMQVJFX1NDUklQVF9DTEFTUyk6IFVwZGF0ZWQuCi0JKEFGX0RFRklORV9TVFlMRV9DTEFTUywgQUZfREVDTEFSRV9TVFlMRV9DTEFTUyk6IE5ldyBtYWNyb3MuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IE5ldyBmaWxlLCB1c2luZyBkYXRhIGZyb20gYGFmc2NyaXB0LmgnLgotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMsCi0JYWZfY2prX21ldHJpY3NfaW5pdF9ibHVlcywgYWZfY2prX2hpbnRfZWRnZXMpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChTQ1JJUFQpOiBVcGRhdGVkLgotCShTVFlMRSk6IFJlZGVmaW5lIG1hY3JvIHRvIGxvYWQgYGFmc3R5bGVzLmgnLgotCShhZl9zY3JpcHRfbmFtZXMpIFtGVF9ERUJVR19MRVZFTF9UUkFDRV06IFJlcGxhY2Ugd2l0aC4uLgotCShhZl9zdHlsZV9uYW1lcyk6IC4uLiB0aGlzIGFycmF5LgotCShhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zY3JpcHRfY292ZXJhZ2UpOiBSZW5hbWVkIHRvLi4uCi0JKGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3N0eWxlX2NvdmVyYWdlKTogLi4uIHRoaXMuCi0JVXBkYXRlZC4KLQkoYWZfZmFjZV9nbG9iYWxzX25ldywgYWZfZmFjZV9nbG9iYWxzX2ZyZWUsCi0JYWZfZmFjZV9nbG9iYWxzX2dldF9tZXRyaWNzKTogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuaCAoU0NSSVBUKTogVXBkYXRlZC4KLQkoU1RZTEUpOiBSZWRlZmluZSBtYWNybyB0byBsb2FkIGBhZnN0eWxlcy5oJy4KLQkoQUZfU0NSSVBUX0ZBTExCQUNLKTogVXBkYXRlIGRlZmluaXRpb24uICBUaGlzIHdpbGwgZ2V0IG1vcmUKLQlyZWZpbmVtZW50cyB3aXRoIGxhdGVyIG9uLgotCShBRl9TQ1JJUFRfVU5BU1NJR05FRCk6IFJlcGxhY2Ugd2l0aC4uLgotCShBRl9TVFlMRV9VTkFTU0lHTkVEKTogLi4uIHRoaXMgbWFjcm8uCi0JKEFGX0ZhY2VHbG9iYWxzUmVjKTogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzLAotCWFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcywgYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0sCi0JYWZfbGF0aW5faGludF9lZGdlcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4yLmMgKGFmX2xhdGluMl9tZXRyaWNzX2luaXRfd2lkdGhzKTogVXBkYXRlZC4KLQkoYWZfbHRuMl91bmlyYW5nZXMpOiBSZW1vdmVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nLCBhZl9sb2FkZXJfbG9hZF9nbHlwaCk6Ci0JVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZwaWMuYyAoYXV0b2ZpdF9tb2R1bGVfY2xhc3NfcGljX2luaXQpOiBVcGRhdGVkLgotCSogc3JjL2F1dG9maXQvYWZwaWMuaCAoQUZfU1RZTEVfQ0xBU1NFU19HRVQpOiBOZXcgbWFjcm8uCi0JKEFGTW9kdWxlUElDKTogQWRkIGBhZl9zdHlsZV9jbGFzc2VzJyBhbmQgYGFmX3N0eWxlX2NsYXNzZXNfcmVjJwotCW1lbWJlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L3J1bGVzLm1rIChBVVRPRl9EUlZfSCk6IEFkZCBgYWZzdHlsZXMuaCcuCi0KLTIwMTMtMTItMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGYWN0b3Igc2NyaXB0cyBhbmQgdW5pcmFuZ2VzIG91dCBvZiB3cml0aW5nIHN5c3RlbSBmaWxlcy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZyYW5nZXMuaDogTmV3IGZpbGVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBFeHRlbmQgYFNDUklQVCcgbWFjcm8gd2l0aCBtb3JlCi0JcGFyYW1ldGVycywgdGFraW5nIGRhdGEgZnJvbSB0aGUgd3JpdGluZyBzeXN0ZW0gZmlsZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYzogSW5jbHVkZSBgYWZyYW5nZXMuaCcuCi0JTG9hZCBgYWZzY3JpcHQuaCcgdG8gY2FsbCBBRl9ERUZJTkVfU0NSSVBUX0NMQVNTLgotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYzogSW5jbHVkZSBgYWZyYW5nZXMuaCcuCi0JTG9hZCBgYWZzY3JpcHQuaCcgdG8gY2FsbCBBRl9ERUNMQVJFX1NDUklQVF9DTEFTUy4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYywgc3JjL2F1dG9maXQvYWZjamsuaDogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmZHVtbXkuYywgc3JjL2F1dG9maXQvYWZkdW1teS5oOiBVcGRhdGVkLgotCSogc3JjL2F1dG9maXQvYWZpbmRpYy5jLCBzcmMvYXV0b2ZpdC9hZmluZGljLmg6IFVwZGF0ZWQuCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMsIHNyYy9hdXRvZml0L2FmbGF0aW4uaDogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4yLmMsIHNyYy9hdXRvZml0L2FmbGF0aW4yLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmcGljLmM6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2F1dG9maXQuYzogSW5jbHVkZSBgYWZyYW5nZXMuYycuCi0JKiBzcmMvYXV0b2ZpdC9ydWxlcy5tayAoQVVUT0ZfRFJWX1NSQyk6IEFkZCBgYWZyYW5nZXMuYycuCi0KLTIwMTMtMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNb3JlIGNvZGUgb3J0aG9nb25hbGl0eS4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9TdHlsZU1ldHJpY3MpOiBSZXBsYWNlIGBzY3JpcHRfY2xhc3MnCi0JcG9pbnRlciB0byBhbiBgQUZfU2NyaXB0Q2xhc3MnIHN0cnVjdHVyZSB3aXRoIGBzY3JpcHQnIGluZGV4IG9mIHR5cGUKLQlgQUZfU2NyaXB0Jy4KLQlNb3ZlIHNvbWUgY29kZSBhcm91bmQuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmM6IEluY2x1ZGUgYGFmcGljLmgnLgotCShhZl9jamtfbWV0cmljc19pbml0X3dpZHRocywgYWZfY2prX21ldHJpY3NfaW5pdF9ibHVlcywKLQlhZl9jamtfaGludF9lZGdlcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYzogSW5jbHVkZSBgYWZwaWMuaCcuCi0JKGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMsIGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcywKLQlhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSwgYWZfbGF0aW5faGludF9lZGdlcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19nZXRfbWV0cmljcyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2csIGFmX2xvYWRlcl9sb2FkX2dseXBoKToKLQlVcGRhdGVkLgotCi0yMDEzLTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gcy9TY3JpcHRNZXRyaWNzL1N0eWxlTWV0cmljcy8uCi0KLTIwMTMtMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBzL3NjcmlwdF97bWV0cmljcyxoaW50c30vc3R5bGVfe21ldHJpY3MsaGludHN9LwotCi0yMDEzLTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gcy9nc2NyaXB0cy9nc3R5bGVzLy4KLQotMjAxMy0xMi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIHMvZ2x5cGhfc2NyaXB0cy9nbHlwaF9zdHlsZXMvLgotCi0JVGhpcyBpcyB0aGUgZmlyc3QgY29tbWl0IG9mIGEgc2VyaWVzIHRvIGNyZWF0ZSBhIG5ldyB0b3AtbGV2ZWwKLQlzdHJ1Y3R1cmUgKGEgYHN0eWxlJykgZm9yIGhhbmRsaW5nIHNjcmlwdHMsIHdyaXRpbmdfc3lzdGVtcywgYW5kCi0Jc29vbi10by1iZS1hZGRlZCBjb3ZlcmFnZXMuCi0KLTIwMTMtMTItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBzL0FGX1NjcmlwdF8vQUZfV3JpdGluZ1N5c3RlbV8vIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0yMDEzLTEyLTExICBJbmZpbmFsaXR5ICA8aW5maW5hbGl0eUBpbmZpbmFsaXR5Lm5ldD4KLQotCVt0cnVldHlwZV0gU2ltcGxpZnkgbG9naWMgb2YgcmVuZGVyaW5nIG1vZGVzLgotCi0JVGhpcyBwYXRjaCB1bmlmaWVzIHRoZSBzdWJwaXhlbCBhbmQgbm9uLXN1YnBpeGVsIGNhc2VzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCAoVFRfRXhlY0NvbnRleHRSZWMpOiBSZW1vdmUKLQlgZ3JheXNjYWxlX2hpbnRpbmcnOyBhbGwgY29kZSBzaG91bGQgcmVmZXIgdG8gYGdyYXlzY2FsZScgaW5zdGVhZC4KLQlSZW1vdmUgdW51c2VkIGBuYXRpdmVfaGludGluZycgbWVtYmVyLgotCVJlbmFtZSBgc3VicGl4ZWxfaGludGluZycgbWVtYmVyIHRvIGBzdWJwaXhlbC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTE9BREVSX1NFVF9QUCk6IFVwZGF0ZWQuCi0JKHR0X2xvYWRlcl9pbml0KTogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19HRVRJTkZPKTogU2ltcGxpZnkuCi0JVXBkYXRlZC4KLQotMjAxMy0xMi0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY3VtZW50YXRpb25dIEFkZCBzZWN0aW9uIGhvdyB0byBpbmNsdWRlIEZyZWVUeXBlIGhlYWRlciBmaWxlcy4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IERhdmlkIEthc3RydXAgPGRha0BnbnUub3JnPi4KLQotCVN1cnByaXNpbmdseSwgYSBkZXNjcmlwdGlvbiBob3cgdG8gZG8gdGhhdCB3YXMgY29tcGxldGVseSBtaXNzaW5nIGluCi0JdGhlIEFQSSByZWZlcmVuY2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUuaCwgaW5jbHVkZS9mdGNoYXB0ZXJzLmg6IE5ldyBkb2N1bWVudGF0aW9uCi0Jc2VjdGlvbiBgaGVhZGVyX2luY2x1c2lvbicuCi0KLTIwMTMtMTItMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBzL0RGTFQvTk9ORS8sIHMvZGZsdC9ub25lLy4KLQotMjAxMy0xMi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIHMvQUZfU0NSSVBUX05PTkUvQUZfU0NSSVBUX1VOQVNTSUdORUQvLgotCi0yMDEzLTEyLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBzY2FsaW5nIG9mIHZlcnRpY2FsIHBoYW50b20gcG9pbnRzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogU2NhbGUgcHAzLnggYW5kCi0JcHA0LnggYWxzby4KLQotMjAxMy0xMi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggcG9zaXRpb25pbmcgb2YgY29tcG9zaXRlIGdseXBocy4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IE5pZ2VsIFRhbyA8bmlnZWx0YW9AZ29sYW5nLm9yZz4uCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0hpbnRfR2x5cGgpOiBSZW1vdmUgY29kZSB0aGF0IHNoaWZ0cwotCXRoZSBnbHlwaCAoY29tcG9uZW50KSBieSBhIGZyYWN0aW9uYWwgdmFsdWUgY29tcHV0ZWQgZnJvbSB0aGUgTFNCCi0JcGhhbnRvbSBwb2ludC4gIFRoaXMgaXMgd3JvbmcsIHNpbmNlIHRoZSBob3Jpem9udGFsIHBoYW50b20gcG9pbnRzCi0JZ2V0IHJvdW5kZWQgaG9yaXpvbnRhbGx5IGxhdGVyIG9uLgotCi0yMDEzLTEyLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi41LjIgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi01LTInLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNS4yLgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIGJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi41LjEvMi41LjIvLCBzLzI1MS8yNTIvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDIuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxNzoxOjExLgotCSogQ01ha2VMaXN0cy50eHQgKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gMi4KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxMy0xMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBOZXh0IHJvdW5kIGluIHBoYW50b20gcG9pbnQgaGFuZGxpbmcuCi0KLQlHcmVnIEhpdGNoY29jayBwcm92aWRlZCB2ZXJ5IGludGVyZXN0aW5nIGluc2lnaHRzIGludG8gdGhlCi0JY29tcGxpY2F0ZWQgaGlzdG9yeSBvZiB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbnMgb2YgdGhlIFRTQiBhbmQgQlNCCi0JcGhhbnRvbSBwb2ludHMuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xPQURFUl9TRVRfUFApCi0JW1RUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElOR106IFVzZSBgc3VicGl4ZWxfaGludGluZycgYW5kCi0JYGdyYXlzY2FsZV9oaW50aW5nJyBmbGFncyBhcyBjb25kaXRpb25hbHMgZm9yIHRoZSB4IHBvc2l0aW9uIG9mIFRTQgotCWFuZCBCU0IuCi0KLTIwMTMtMTItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChGVF9DQyk6IFJlbW92ZWQuICBVbnVzZWQuCi0KLTIwMTMtMTItMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBGaXggaGFuZGxpbmcgb2YgZW1iZWRkZWQgYml0bWFwIHN0cmlrZXMuCi0KLQlUaGlzIGNvcnJlY3RzIHRoZSBjb21taXQgZnJvbSAyMDEzLTExLTIxLiAgUHJvYmxlbSByZXBvcnRlZCBieQotCUFuZHJleSBQYW5vdiA8cGFub3ZAY2Fub3B1cy5pYWNwLmR2by5ydT4uCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRtYXApOiBGaXggbG9naWMgdG8KLQlkZXRlY3QgZXhjZXNzaXZlIGJ5dGVzIGZvciBiaXQtYWxpZ25lZCBiaXRtYXBzLgotCi0yMDEzLTEyLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFJlbW92ZSBkZWFkIGNvZGUuCi0KLQlSZXBvcnRlZCBieSBOaWdlbCBUYW8gPG5pZ2VsdGFvQGdvbGFuZy5vcmc+LgotCi0JKiBpbmNsdWRlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfTG9hZGVyUmVjKTogUmVtb3ZlIHVudXNlZAotCWBwcmVzZXJ2ZV9wcHMnIGZpZWxkLgotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfSGludF9HbHlwaCk6IFVwZGF0ZWQuCi0KLTIwMTMtMTItMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IHBoYW50b20gcG9pbnQgaGFuZGxpbmcuCi0KLQlUaGlzIGlzIGEgZnVydGhlciBpbXByb3ZlbWVudCB0byB0aGUgY2hhbmdlcyBmcm9tIDIwMTMtMTEtMDYuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0hpbnRfR2x5cGgpOiBIb3Jpem9udGFsIHBoYW50b20gcG9pbnRzCi0JYXJlIHJvdW5kZWQgaG9yaXpvbnRhbGx5LCB2ZXJ0aWNhbCBvbmVzIGFyZSByb3VuZGVkIHZlcnRpY2FsbHkuCi0JKFRUX0xPQURFUl9TRVRfUFApOiBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB2ZXJ0aWNhbCBwaGFudG9tCi0JcG9pbnRzIGluIHByZS1DbGVhclR5cGUgbW9kZSBpcyB6ZXJvLCBhcyBzaG93biBpbiB0aGUgT3BlblR5cGUKLQlzcGVjaWZpY2F0aW9uLgotCi0yMDEzLTEyLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBjaGFuZ2UgZnJvbSAyMDEzLTExLTIwLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBBa2lyYSBLYWt1dG8gPGtha3V0b0BmdWsua2luZGFpLmFjLmpwPi4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBQcm90ZWN0IGNhbGwgdG8KLQlgVXBkYXRlX01heCcgd2l0aCBib3RoIGEgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSIGd1YXJkIGFuZCBhCi0JYElTX0hJTlRFRCcgY2xhdXNlLgotCUFsc28gcmVtb3ZlIHJlZHVuZGFudCBjaGVjayB1c2luZyBgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zJyDigJMgaW4KLQlzaW1wbGUgZ2x5cGhzLCB0aGUgYnl0ZWNvZGUgZGF0YSBjb21lcyBiZWZvcmUgdGhlIG91dGxpbmUgZGF0YSwgYW5kCi0JYSB2YWxpZGl0eSB0ZXN0IGZvciB0aGlzIGlzIGFscmVhZHkgcHJlc2VudC4KLQotMjAxMy0xMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCB1c2Ugb2YgZHVtcGluZyBmdW5jdGlvbnMgaW4gYGZ0Z3JpZCcgZGVtbyBwcm9ncmFtLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKEFGX0RVTVApIFtGVF9ERUJVR19BVVRPRklUXTogTmV3IG1hY3JvLgotCShhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cywgYWZfZ2x5cGhfaGludHNfZHVtcF9zZWdtZW50cywKLQlhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzKSBbRlRfREVCVUdfQVVUT0ZJVF06IEFkZCBwYXJhbWV0ZXIgdG8KLQloYW5kbGUgb3V0cHV0IHRvIHN0ZG91dC4KLQlVc2UgQUZfRFVNUC4KLQkoYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMsIGFmX2dseXBoX2hpbnRzX2R1bXBfc2VnbWVudHMsCi0JYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcykgWyFGVF9ERUJVR19BVVRPRklUXTogUmVtb3ZlZC4KLQotMjAxMy0xMS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNS4xIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNS0xJy4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjUuMS4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNS4wLzIuNS4xLywgcy8yNTAvMjUxLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTc6MDoxMS4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDEuCi0JKiBkb2NzL0NIQU5HRVMsIGRvY3MvcmVsZWFzZTogVXBkYXRlZC4KLQotMjAxMy0xMS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXTogQWRkIHRyaWNreSBmb250IG5hbWVzIGBoa3Njc2lpYy50dGYnIGFuZCBgaWljb3JlLnR0ZicuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAoVFJJQ0tfTkFNRVNfTUFYX0NIQVJBQ1RFUlMsCi0JVFJJQ0tfTkFNRVNfQ09VTlQpOiBVcGRhdGVkLgotCSh0cmlja19uYW1lcyk6IEFkZCBmYW1pbHkgbmFtZSBmb3IgdGhlIHR3byBmb250cy4KLQotMjAxMy0xMS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAodHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0bWFwKTogVHlwby4KLQotMjAxMy0xMS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFR5cG8uCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEhpbi1UYWsgTGV1bmcgPGh0bDEwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2xvYWRfZmFjZSk6IFJldHVybiBjb3JyZWN0IGBic2l6ZS0+d2lkdGgnCi0JdmFsdWUgaWYgdGhlIGZvbnQgbGFja3MgYW4gYE9TLzInIHRhYmxlLgotCi0yMDEzLTExLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSW1wcm92ZSBoYW5kbGluZyBvZiBidWdneSBlbWJlZGRlZCBiaXRtYXAgc3RyaWtlcy4KLQotCVdlIGFyZSBub3cgYWJsZSB0byBzdWNjZXNzZnVsbHkgbG9hZCBgQXBwbGVNeW91bmdKby50dGYnLgotCVByb2JsZW0gcmVwb3J0ZWQgYnkgSGluLVRhayBMZXVuZyA8aHRsMTBAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdG1hcCk6IERvbid0IHRydXN0IGdseXBoCi0JZm9ybWF0LgotCi0yMDEzLTExLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIERvbid0IHRydXN0IGBtYXhwJ3MgYG1heFNpemVPZkluc3RydWN0aW9ucycuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEhpbi1UYWsgTGV1bmcgPGh0bDEwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD47IHNlZQotCi0JICBodHRwOi8vbGlzdHMubm9uZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxMy0wOC9tc2cwMDAwNS5odG1sCi0KLQlmb3IgZGV0YWlscy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBDaGVjayBzaXplIG9mIGBmcGdtJyBhbmQgYHByZXAnCi0JdGFibGVzIGFsc28gZm9yIHNldHRpbmcgYGF1dG9oaW50Jy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBVc2UgY29kZSBmcm9tCi0JYFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0dseXBoJyBmb3IgaGFuZGxpbmcgdW5yZWxpYWJsZSB2YWx1ZXMgb2YKLQlgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zJy4KLQotMjAxMy0xMS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBgT1MvMicgdGFibGUgdmVyc2lvbiA1IHN1cHBvcnQuCi0KLQlXZSBub3cgZm9sbG93IHRoZSBgb2ZmaWNpYWwnIGFubm91bmNlbWVudCBmcm9tIE1pY3Jvc29mdCAob24gdGhlCi0JT3BlblR5cGUgbWFpbGluZyBsaXN0LCB3aGljaCB1bmZvcnR1bmF0ZWx5IGhhc24ndCBhIHB1YmxpYyBhcmNoaXZlKS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oIChUVF9PUzIpOgotCXMvdXNMb3dlclBvaW50U2l6ZS91c0xvd2VyT3B0aWNhbFBvaW50U2l6ZS8sCi0Jcy91c1VwcGVyUG9pbnRTaXplL3VzVXBwZXJPcHRpY2FsUG9pbnRTaXplLy4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9vczIpOiBVcGRhdGUsIGFuZCBzZXQgY29ycmVjdAotCWRlZmF1bHQgdmFsdWVzLgotCi0yMDEzLTExLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2Z0MnVuaXguaDogUmVtb3ZlLiAgTm8gbG9uZ2VyIG5lY2Vzc2FyeS4KLQotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5tayAoaW5zdGFsbCk6IFVwZGF0ZWQuCi0KLTIwMTMtMTEtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVNpbXBsaWZ5IGhlYWRlciBmaWxlIGhpZXJhcmNoeS4KLQotCVRoaXMgbGFyZ2UgcGF0Y2ggY2hhbmdlcyB0aGUgaGVhZGVyIGZpbGUgZGlyZWN0b3J5IGxheW91dCBmcm9tCi0JYGluY2x1ZGUvZnJlZXR5cGUvLi4uJyB0byBgaW5jbHVkZS8uLi4nLCBlZmZlY3RpdmVseSByZW1vdmluZyBvbmUKLQlsZXZlbC4gIFNpbmNlIHRoZSBmaWxlIGBmdDJidWlsZC5oJyBpcyBhbHNvIGxvY2F0ZWQgaW4gYGluY2x1ZGUnCi0JKGFuZCBpdCBzdGF5cyB0aGVyZSBldmVuIGFmdGVyIGluc3RhbGxhdGlvbiksIGFsbCBGcmVlVHlwZSBoZWFkZXIKLQlmaWxlcyBhcmUgbm93IGluIGEgc2luZ2xlIGRpcmVjdG9yeS4KLQotCUFwcGxpY2F0aW9ucyB0aGF0IHVzZSAoYSkgYGZyZWV0eXBlLWNvbmZpZycgb3IgRnJlZVR5cGUncwotCWBwa2ctY29uZmlnJyBmaWxlIHRvIGdldCB0aGUgaW5jbHVkZSBkaXJlY3RvcnkgZm9yIHRoZSBjb21waWxlciwgYW5kCi0JKGIpIHRoZSBkb2N1bWVudGVkIHdheSBmb3IgaGVhZGVyIGluY2x1c2lvbiBsaWtlCi0KLQkgICNpbmNsdWRlIDxmdDJidWlsZC5oPgotCSAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCSAgLi4uCi0KLQlkb24ndCBuZWVkIGFueSBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlLyo6IE1vdmUgdXAgdG8uLi4KLQkqIGluY2x1ZGUvKjogLi4uIHRoaXMgZGlyZWN0b3J5LgotCi0JKiBidWlsZHMvYW1pZ2EvaW5jbHVkZS9mcmVldHlwZS8qOiBNb3ZlIHVwIHRvLi4uCi0JKiBidWlsZHMvYW1pZ2EvaW5jbHVkZS8qOiAuLi4gdGhpcyBkaXJlY3RvcnkuCi0KLQkqLyo6IEVzc2VudGlhbGx5IGRvIGBzQC9mcmVldHlwZS9AL0AnIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JKiBDTWFrZUxpc3RzLnR4dDogU2ltcGxpZnkuCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW4sIGJ1aWxkcy91bml4L2ZyZWV0eXBlMi5pbjogRm9yCi0JYC0tY2ZsYWdzJywgcmV0dXJuIGEgc2luZ2xlIGRpcmVjdG9yeS4KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBObyBsb25nZXIgdHJ5IHRvIHJlbW92ZSBgY2FjaGUnCi0JYW5kIGBpbnRlcm5hbCcgc3ViZGlyZWN0b3JpZXM7IGluc3RlYWQsIHJlbW92ZSB0aGUgYGZyZWV0eXBlJwotCXN1YmRpcmVjdG9yeS4KLQotMjAxMy0xMS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggbGFzdCBgdHJ1ZXR5cGUnIGNvbW1pdC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAodHRfZ2V0X21ldHJpY3MpOiBQcmVzZXJ2ZSBzdHJlYW0gcG9zaXRpb24uCi0JUmV0dXJuIGVycm9yIHZhbHVlLgotCShsb2FkX3RydWV0eXBlX2dseXBoKTogVXBkYXRlZC4KLQotMjAxMy0xMS0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NNQUtFOiBOZXcgZHVtbXkgZmlsZS4KLQotMjAxMy0xMS0wOCAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCVtjZmZdIEZpeCBmb3IgaGludHMgdGhhdCB0b3VjaC4KLQotCSogc3JjL2NmZi9jZjJoaW50cy5jIChjZjJfaGludG1hcF9pbnNlcnRIaW50KTogRml4IGNvbmRpdGlvbiBmb3IKLQlmaW5kaW5nIGluZGV4IHZhbHVlIG9mIGluc2VydGlvbiBwb2ludC4KLQotMjAxMy0xMS0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggaGFuZGxpbmcgb2YgcGhhbnRvbSBwb2ludHMgaW4gY29tcG9zaXRlIGdseXBocy4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IE5pZ2VsIFRhbyA8bmlnZWx0YW9AZ29sYW5nLm9yZz4uCi0KLQlUaGlzIGlzIGEgZm9sbG93LXVwIGNvbW1pdCB0byB0aGUgcHJldmlvdXMgb25lLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogQ2FsbAotCWB0dF9nZXRfbWV0cmljcycgYWZ0ZXIgbG9hZGluZyB0aGUgZ2x5cGggaGVhZGVyLgotCi0yMDEzLTExLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEltcHJvdmUgZW11bGF0aW9uIG9mIHZlcnRpY2FsIG1ldHJpY3MuCi0KLQlUaGlzIGNvbW1pdCBhbHNvIGltcHJvdmVzIHRoZSBzdGFydCB2YWx1ZXMgb2YgdmVydGljYWwgcGhhbnRvbQotCXBvaW50cy4gIEt1ZG9zIHRvIEdyZWcgSGl0Y2hjb2NrIGZvciBoZWxwLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9HZXRfVk1ldHJpY3MpOiBBZGQgcGFyYW1ldGVyIHRvIHBhc3MKLQlgeU1heCcgdmFsdWUuICBSZXBsYWNlIGNvZGUgd2l0aCBmaXhlZCBNaWNyb3NvZnQgZGVmaW5pdGlvbi4KLQkodHRfZ2V0X21ldHJpY3MpOiBVcGRhdGVkLgotCShUVF9MT0FERVJfU0VUX1BQKTogQWRkIGV4cGxhbmF0aW9uIGhvdyB0byBpbml0aWFsaXplIHBoYW50b20KLQlwb2ludHMsIHRha2VuIGZyb20gYm90aCB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiBhbmQgcHJpdmF0ZQotCWNvbW11bmljYXRpb24gd2l0aCBHcmVnICh3aGljaCB3aWxsIGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gdGhlCi0Jc3RhbmRhcmQpLgotCUZpeCBob3Jpem9udGFsIHBvc2l0aW9uIG9mIGBwcDMnIGFuZCBgcHA0Jy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuaDogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X2dldF9hZHZhbmNlcyk6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxMy0xMS0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvajogcy92MTEwL3YxMDAvLgotCVBsYXRmb3JtVG9vbFNldCB2ZXJzaW9uIDExMCBpcyBmb3IgVkMyMDEyLgotCi0JUHJvYmxlbSByZXBvcnRlZCAod2l0aCBzb2x1dGlvbikgYnkgRGF2ZSBBcm5vbGQgPGRhcm5vbGRAYWRvYmUuY29tPi4KLQotMjAxMy0xMS0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBDb3JyZWN0bHkgcmVzZXQgcG9pbnQgdGFncyBmb3IgZ2x5cGggY29tcG9uZW50cy4KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IE5pZ2VsIFRhbyA8bmlnZWx0YW9AZ29sYW5nLm9yZz4uCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0dseXBoKTogRml4IGxvb3AuCi0KLTIwMTMtMTEtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IEdFVElORk8gb3Bjb2RlIGhhbmRsaW5nIG9mIHN1YnBpeGVsIGhpbnRpbmcgYml0cy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19HRVRJTkZPKTogRG9uJ3QgcmVxdWVzdCBiaXQgNiBzZXQgdG8KLQlnZXQgaW5mbyBvbiBzdWJwaXhlbCBoaW50aW5nLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTMtMTEtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzQwNDUxLgotCi0JU2ltcGx5IGFwcGx5IHRoZSBwYXRjaCBmcm9tIHRoZSBidWcgcmVwb3J0LgotCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiwgYnVpbGRzL3Ztcy9mdGNvbmZpZy5oLAotCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IFRoZSB1c2VkICNwcmFnbWEgZGlyZWN0aXZlcyBvbmx5Ci0Jd29yayB3aXRoIGdjYyB2ZXJzaW9ucyA0LjYgYW5kIGhpZ2hlci4KLQotMjAxMy0xMS0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTMtMTEtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gTWlub3IgY29kZSByZWZhY3RvcmluZy4KLQotCVR3byBiZW5lZml0czogVGhlIGFsbG9jYXRlZCBGREVGIChhbmQgSURFRikgYXJyYXkgZ2V0cyBzbGlnaHRseQotCXNtYWxsZXIsIGFuZCB0aGUgYHR0ZGVidWcnIGRlbW8gcHJvZ3JhbSBoYXMgYWNjZXNzIHRvIGZ1bmN0aW9uCi0JbnVtYmVycyB3aXRob3V0IGFkZGl0aW9uYWwgY29zdHMuCi0KLQlGb3J0dW5hdGVseSwgbm8gY2hhbmdlcyB0byBGb250Rm9yZ2UgYXJlIG5lY2Vzc2FyeSDigJMgdGhpcyBpcyB0aGUKLQlvbmx5IGV4dGVybmFsIFRydWVUeXBlIGRlYnVnZ2VyIEkga25vdyBvZiwgYnV0IG90aGVycyBtYXkgZXhpc3QgYW5kCi0Jc2hvdWxkIGNoZWNrIHRoZSBjb2RlIGFjY29yZGluZ2x5LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCAoVFRfQ2FsbFJlYyk6IFJlcGxhY2UgYEN1cl9SZXN0YXJ0JyBhbmQKLQlgQ3VyX0VuZCcgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYFRUX0RlZlJlY29yZCcKLQlzdHJ1Y3R1cmUuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChET19KUk9ULCBET19KTVBSLCBET19KUk9GLCBJbnNfRU5ERiwKLQlJbnNfQ0FMTCwgSW5zX0xPT1BDQUxMLCBJbnNfVU5LTk9XTiwgVFRfUnVuSW5zIDxJbnZhbGlkX09wY29kZT4pOgotCVVwZGF0ZWQuCi0KLTIwMTMtMTAtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgYE9TLzInIHRhYmxlIHZlcnNpb24gNS4KLQotCVNlZQotCi0JICBodHRwOi8vdHlwZWRyYXdlcnMuY29tL2Rpc2N1c3Npb24vNDcwL25ldy1taWNyb3NvZnQtc2l6ZS1zcGVjaWZpYy1kZXNpZ24tc2VsZWN0aW9uLW1lY2hhbmlzbQotCi0JZm9yIHRoZSBhbm5vdW5jZW1lbnQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaCAoVFRfT1MyKTogQWRkIGZpZWxkcwotCWB1c0xvd2VyUG9pbnRTaXplJyBhbmQgYHVzVXBwZXJQb2ludFNpemUnLiAgU2luY2UgRnJlZVR5cGUgcmV0dXJucwotCXRoaXMgc3RydWN0dXJlIG9ubHkgYXMgYSBwb2ludGVyIHRocm91Z2ggYEZUX0dldF9TZm50X1RhYmxlJywgdGhlcmUKLQlzaG91bGRuJ3QgYmUgYW55IEFCSSBwcm9ibGVtcy4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9vczIpOiBJbXBsZW1lbnQgaXQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxMy0xMC0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBSRUFETUUuZ2l0LCBkb2NzL0NIQU5HRVMsIGRvY3MvSU5TVEFMTDogVXBkYXRlZC4KLQotMjAxMy0xMC0yNCAgSm9obiBDYXJ5ICA8Y2FyeUB0eGNvcnAuY29tPgotCi0JUHJvdmlkZSBjbWFrZSBzdXBwb3J0LgotCi0JKiBDTWFrZUxpc3RzLnR4dDogTmV3IGZpbGUuCi0KLTIwMTMtMTAtMjMgIEtlbm5ldGggTWlsbGVyICA8a2VubmV0aGFkYW1taWxsZXJAeWFob28uY29tPgotCSAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlQcm92aWRlIHN1cHBvcnQgZm9yIHg2NCBidWlsZHMgaW4gVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGVzLgotCi0JKiBzcmMvYnVpbGRzL3dpbjMyOiBSZW5hbWVkIHRvLi4uCi0JKiBzcmMvYnVpbGRzL3dpbmRvd3M6IFRoaXMuCi0KLQkqIHNyYy9idWlsZHMvd2luZG93cy92YzIwMTAvKjogVXBkYXRlZCB0byBoYW5kbGUgeDY0IHRhcmdldC4KLQotCSogc3JjL2J1aWxkcy93aW5kb3dzLyoubWssIGRvY3MvSU5TVEFMTC5HTlU6IHMvd2luMzIvd2luZG93cy8gd2hlcmUKLQlhcHByb3ByaWF0ZS4KLQotMjAxMy0xMC0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9tZDUuYywgc3JjL2Jhc2UvbWQ1Lmg6IFVwZGF0ZWQgdG8gcmVjZW50IHZlcnNpb24uCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jOiBVcGRhdGVkOyBgbWQ1LmMnIG5vIGxvbmdlciB1c2VzIGBmcmVlJy4KLQotCVRoZSBjYW5vbmljYWwgVVJMIHRvIGdldCB1cGRhdGVzIGZvciB0aGlzIGZpbGUgaXMKLQotCSAgaHR0cDovL2N2c3dlYi5vcGVud2FsbC5jb20vY2dpL2N2c3dlYi5jZ2kvT3dsL3BhY2thZ2VzL3BvcGEzZC9wb3BhM2QvbWQ1LwotCi0JYXMgdGhlIGF1dGhvciB0b2xkIG1lIGluIHByaXZhdGUgY29tbXVuaWNhdGlvbi4KLQotMjAxMy0xMC0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIHMvU01BTExfVE9QL1hfSEVJR0hULy4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jLCBzcmMvYXV0b2ZpdC9hZmxhdGluLmgsCi0Jc3JjL2F1dG9maXQvYWZsYXRpbjIuYzogVXBkYXRlZC4KLQotMjAxMy0xMC0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBzL01JTk9SL0RFU0NFTkRFUi8uCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLTIwMTMtMTAtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBZGQgZGVzY3JpcHRpb24gc3RyaW5ncyB0byBzY3JpcHQgZW50cmllcy4KLQotCUN1cnJlbnRseSwgdGhpcyBpcyB1bnVzZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IERvIGl0LgotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYywgc3JjL2F1dG9maXQvYWZwaWMuYywKLQlzcmMvYXV0b2ZpdC9hZnR5cGVzLmg6IFVwZGF0ZWQuCi0KLTIwMTMtMTAtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbXByb3ZlIHRyYWNpbmcgbWVzc2FnZSBmb3IgZXh0cmEgbGlnaHQgZmxhZy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSk6IERvIGl0LgotCi0yMDEzLTEwLTE1ICBDaG9uZ3l1IFpodSAgPGxlbWJhY29uQGdtYWlsLmNvbT4KLQotCVthcm1dIEZpeCB0aHVtYjIgaW5saW5lIGFzc2VtYmx5IHVuZGVyIExMVk0uCi0KLQlXaGVuIHVzaW5nIGBBREQnIHdpdGggYW4gaW1tZWRpYXRlIG9wZXJhbmQsIHRoZSBpbnN0cnVjdGlvbiBpcwotCWFjdHVhbGx5IGBBREQgUmQsIFJuLCAjPGltbTEyPicsIHRoYXQgaXMsIHRoZSBtYXhpbXVtIG9mIHRoZQotCWltbWVkaWF0ZSBvcGVyYW5kIGNhbm5vdCBleGNlZWQgNDA5NS4gIEl0IHdpbGwgZmFpbCB0byBjb21waWxlIHdpdGgKLQlMTFZNLgotCi0JSG93ZXZlciwgaW4gR0NDLCBkdWUgdG8gc29tZSBsZWdhY3kgY29tcGF0aWJpbGl0eSBjb25zaWRlcmF0aW9ucywKLQlgQURELlcnIHdpbGwgYmUgYXV0b21hdGljYWxseSBlbWl0dGVkIHdoZW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGlzCi0JbGFyZ2VyIHRoYW4gNDA5NS4KLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW4sIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgKLQkoRlRfTXVsRml4X2FybSkgW19fR05VQ19fXTogU3VwcG9ydCBjbGFuZyBjb21waWxlci4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX011bEZpeDE0X2FybSkgW19fR05VQ19fXTogRGl0dG8uCi0KLTIwMTMtMTAtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbXByb3ZlIHRyYWNpbmcgb2YgYGxhdGluJyBoaW50ZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogUmVwb3J0IGJsdWUKLQl6b25lIHR5cGVzLgotCShhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSk6IFJlcG9ydCBzY2FsaW5nIGNoYW5nZXMgZHVlIHRvIHggaGVpZ2h0Ci0JYWxpZ25tZW50LgotCVJlcG9ydCBzY2FsZWQgc3Ryb2tlIHdpZHRoIGFuZCBibHVlIHpvbmUgdmFsdWVzLgotCi0yMDEzLTEwLTAzICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCi0JKiBzcmMvY2ZmL2NmMmZvbnQuYyAoY2YyX2NvbXB1dGVEYXJrZW5pbmcpOiBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvLgotCi0JTm90ZSB0aGF0IHRoZSBvbGQgY29kZSBhdm9pZGVkIHVzaW5nIGEgcmVnaW9uIG9mIHRoZSBwaWVjZXdpc2UKLQlsaW5lYXIgZnVuY3Rpb24gd2hlcmUgdGhlIHNsb3BlIHdhcyB6ZXJvLiAgVGhlIHJlY292ZXJ5IHdhcyB0byB1c2UgYQotCWRpZmZlcmVudCBzZWN0aW9uIG9mIHRoZSBmdW5jdGlvbiwgd2hpY2ggcHJvZHVjZWQgYSBkaWZmZXJlbnQsCi0JaW5jb3JyZWN0IGFtb3VudCBvZiBkYXJrZW5pbmcuCi0KLTIwMTMtMTAtMDIgIERhcnJlbGwgQmVsbGVydCAgPGRhcnJlbGwuYmVsbGVydEBobC5rb25pY2FtaW5vbHRhLnVzPgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX3BjbHQpOiBGaXggYHBjbHRfZmllbGRzJy4KLQotMjAxMy0xMC0wMiAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCSogc3JjL2NmZi9jZjJmb250LmMgKGNmMl9jb21wdXRlRGFya2VuaW5nKTogSW5pdGlhbGl6ZSBkYXJrZW5BbW91bnQuCi0KLQlUaGlzIGxpbmUgd2FzIGxvc3QgaW4gY29tbWl0IDg5Y2ExZmQ2IChmcm9tIDIwMTMtMDYtMjUpLiAgVGhlIGVmZmVjdAotCWlzIHRvIHVzZSBhIHByZXZpb3VzIGRhcmtlbmluZyBhbW91bnQgd2hlbiBwcm9kdWNpbmcgYW4gdW5oaW50ZWQsCi0JdW5zY2FsZWQgb3V0bGluZS4gIFRoaXMgY2FuIGNhdXNlIGF1dG9oaW50IHNhbXBsZXMgaW4gZnRncmlkIGFuZAotCWZ0dmlldyB0byBiZSBiYXNlZCBvbiBkYXJrZW5lZCBDRkYgb3V0bGluZXMgaW5zdGVhZCBvZiB1bmhpbnRlZCwKLQl1bmRhcmtlbmVkIG9uZXMuCi0KLTIwMTMtMDktMjkgIERhdmUgQXJub2xkICA8ZGFybm9sZEBhZG9iZS5jb20+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzOTI5NS4KLQotCVRoZSBidWcgd2FzIGNhdXNlZCBieSBzd2l0Y2hpbmcgdG8gdGhlIGluaXRpYWwgaGludG1hcCAodGhlIG9uZSBpbgotCWVmZmVjdCB3aGVuIGBtb3ZldG8nIGV4ZWN1dGVzKSBqdXN0IGJlZm9yZSBkcmF3aW5nIHRoZSBmaW5hbCBlbGVtZW50Ci0JaW4gdGhlIGNoYXJzdHJpbmcuICBUaGlzIGVuc3VyZWQgdGhhdCB0aGUgcGF0aCB3YXMgY2xvc2VkIChpbiBib3RoCi0JQ2hhcmFjdGVyIFNwYWNlIGFuZCBEZXZpY2UgU3BhY2UpLiAgQnV0IGlmIHRoZSBmaW5hbCBlbGVtZW50IHdhcyBhCi0JY3VydmUgYW5kIGlmIHRoZSBmaW5hbCBoaW50bWFwIHdhcyBkaWZmZXJlbnQgZW5vdWdoIGZyb20gdGhlIGluaXRpYWwKLQlvbmUsIHRoZW4gdGhlIGN1cnZlIHdhcyB2aXNpYmx5IGRpc3RvcnRlZC4KLQotCVRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaXggaXMgdG8gZHJhdyB0aGUgZmluYWwgY3VydmUgdXNpbmcgdGhlIGZpbmFsCi0JaGludG1hcCBhcyBzcGVjaWZpZWQgYnkgdGhlIGNoYXJzdHJpbmcuICBUaGlzIGNvcnJlY3RzIHRoZQotCWRpc3RvcnRpb24gYnV0IGRvZXMgbm90IGVuc3VyZSBjbG9zaW5nIGluIERldmljZSBTcGFjZS4gIEl0IG1heQotCXJlcXVpcmUgdGhlIHJhc3Rlcml6ZXIgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhbiBleHRyYSBjbG9zaW5nCi0JbGluZS4gIERlcGVuZGluZyBvbiB0aGUgaGludG1hcCBkaWZmZXJlbmNlcywgdGhpcyBsaW5lIGNvdWxkIGJlIGZyb20KLQl6ZXJvIHRvIGEgY291cGxlIHBpeGVscyBpbiBsZW5ndGguCi0KLQlUaGUgc2Vjb25kIHBhcnQgb2YgdGhlIGZpeCBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgdGhlIGNoYXJzdHJpbmcKLQlzdWJwYXRoIGlzIGNsb3NlZCB3aXRoIGFuIGV4cGxpY2l0IGxpbmUuICBXZSBub3cgbW9kaWZ5IHRoYXQgbGluZSdzCi0JZW5kIHBvaW50IHRvIGF2b2lkIHRoZSBkaXN0b3J0aW9uLgotCi0JU29tZSBnbHlwaHMgaW4gdGhlIGJ1ZyByZXBvcnQgZm9udCAoVGV4R3lyZUhlcm9zLVJlZ3VsYXIpIHRoYXQgc2hvdwotCXRoZSBjaGFuZ2UgYXJlOgotCi0JICAyNXBwZW0gICAgUyAoOTgpCi0JICAyNHBwZW0gICAgZWlnaHQgKDUyKQotCSAgMjUuNXBwZW0gIHAgKDg1KQotCi0JQ3VydmVzIGF0IHRoZSAqZW5kKiBvZiBhIHN1YnBhdGggYXJlIG5vIGxvbmdlciBkaXN0b3J0ZWQuICBIb3dldmVyLAotCXNvbWUgb2YgdGhlc2UgZ2x5cGhzIGhhdmUgYmFkIGhpbnQgc3Vic3RpdHV0aW9ucyBpbiB0aGUgbWlkZGxlIG9mIGEKLQlzdWJwYXRoLCBhbmQgdGhlc2UgYXJlIG5vdCBhZmZlY3RlZC4KLQotCVRoZSBwYXRjaCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBhIHNldCBvZiAxMDYgZm9udHMgdGhhdCBzaGlwcGVkIHdpdGgKLQlBZG9iZSBDcmVhdGl2ZSBTdWl0ZSA0LCB0b2dldGhlciB3aXRoIDc1NiBPcGVuIFNvdXJjZSBDRkYgZm9udHMgZnJvbQotCUdvb2dsZSBGb250cy4gIFRoZXJlIGFyZSAxLjUgbWlsbGlvbiBnbHlwaHMsIG9mIHdoaWNoIHNvbWUgMjBrIGFyZQotCWNoYW5nZWQgd2l0aCB0aGUgZml4LiAgQSBzYW1wbGluZyBvZiBhIGZldyBodW5kcmVkIG9mIHRoZXNlIGNoYW5nZXMKLQloYXZlIGJlZW4gZXhhbWluZWQgbW9yZSBjbG9zZWx5LCBhbmQgdGhlIGNoYW5nZXMgbG9vayBnb29kIChvciBhdAotCWxlYXN0IGFjY2VwdGFibGUpLgotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmggKENGMl9HbHlwaFBhdGhSZWMpOiBOZXcgZWxlbWVudCBgcGF0aElzQ2xvc2luZycKLQl0byBpbmRpY2F0ZSB0aGF0IHdlIHN5bnRoZXNpemUgYSBjbG9zZXBhdGggbGluZS4KLQotCSogc3JjL2NmZi9jZjJoaW50cy5jIChjZjJfZ2x5cGhwYXRoX2luaXQpOiBVcGRhdGVkLgotCShjZjJfZ2x5cGhwYXRoX3B1c2hQcmV2RWxlbSk6IElmIGNsb3NpbmcsIHVzZSBmaXJzdCBoaW50IG1hcCAoZm9yCi0JYGxpbmV0bycgb3BlcmF0b3IpIGFuZCBhZGp1c3QgaGludCB6b25lLgotCUZvciBzeW50aGVzaXplZCBjbG9zaW5nIGxpbmVzLCB1c2UgZW5kIHBvaW50IGluIGZpcnN0IGhpbnQgem9uZS4KLQkoY2YyX2dseXBocGF0aF9saW5lVG8pOiBUYWtlIGNhcmUgb2Ygc3ludGhlc2l6ZWQgY2xvc2luZyBsaW5lcy4gIEluCi0JcGFydGljdWxhciwgc2hpZnQgdGhlIGRldGVjdGlvbiBvZiB6ZXJvLWxlbmd0aCBsaW5lcyBmcm9tIGNoYXJhY3RlcgotCXNwYWNlIHRvIGRldmljZSBzcGFjZS4KLQkoY2YyX2dseXBocGF0aF9jbG9zZU9wZW5QYXRoKTogUmVtb3ZlIGFzc2VydGlvbi4KLQlVcGRhdGVkLgotCi0yMDEzLTA5LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfe2dyZWssY3lybH1fdW5pcmFuZ2VzKTogRml4IGFycmF5cy4KLQotMjAxMy0wOS0yNSAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtiZGYsIHBjZl0gUmVmdXNlIG5vbi16ZXJvIGZhY2VfaW5kZXguCi0KLQlTdWdnZXN0ZWQgYnkgQWtpcmEgVGFnb2gsIHNlZQotCi0JICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUvMjAxMy0wOS9tc2cwMDAzMC5odG1sCi0KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IFJldHVybiBgSW52YWxpZF9Bcmd1bWVudCcKLQllcnJvciBpZiB0aGUgZm9udCBjb3VsZCBiZSBvcGVuZWQgYnV0IG5vbi16ZXJvIGBmYWNlX2luZGV4JyBpcwotCWdpdmVuLgotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfRmFjZV9Jbml0KTogRGl0dG8uCi0KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KTogUmVtb3ZlIHVucmVxdWlyZWQgRlRfVU5VU0VECi0JbWFjcm8gZm9yIGBmYWNlX2luZGV4JyBiZWNhdXNlIGl0IGlzIHZhbGlkYXRlZCBsYXRlci4KLQotMjAxMy0wOS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDAwOTAuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19tZXRyaWNzX3NjYWxlKTogUmV2ZXJ0IGNvbW1pdAotCTMwNmY4YzVkIChmcm9tIDIwMTMtMDgtMjUpIGFmZmVjdGluZyB0aGlzIGZ1bmN0aW9uLgotCi0yMDEzLTA5LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gRGlzdW5pZnkgQ3lyaWxsaWMgYW5kIEdyZWVrIGhhbmRsaW5nIGZyb20gTGF0aW4uCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBDeXJpbGxpYyBhbmQgR3JlZWsuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQgKEFGX0JMVUVfU1RSSU5HU0VUX0dSRUssCi0JQUZfQkxVRV9TVFJJTkdTRVRfQ1lSTCk6IEFkZCBibHVlIHpvbmVzIGZvciBHcmVlayBhbmQgQ3lyaWxsaWMuCi0JKEFGX0JMVUVfU1RSSU5HU0VUX0xBVE4pOiBGaXggdHlwby4KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfZ3Jla191bmlyYW5nZXMsIGFmX2N5cmxfdW5pcmFuZ2VzKTogTmV3Ci0JYXJyYXlzLgotCShhZl9ncmVrX3NjcmlwdF9jbGFzcywgYWZfY3lybF9zY3JpcHRfY2xhc3MpOiBOZXcgc2NyaXB0cy4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaDogVXBkYXRlZC4KLQotMjAxMy0wOS0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTMtMDktMjAgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JRml4IHZlcnRpY2FsIHNpemUgb2YgZW1ib2xkZW5lZCBnbHlwaHMuCi0KLQlDZi4gaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NjcwOQotCi0JKiBzcmMvYmFzZS9mdHN5bnRoLmMgKEZUX0dseXBoU2xvdF9FbWJvbGRlbik6IEFkanVzdCBgaG9yaUJlYXJpbmdZJwotCWFsc28uCi0KLTIwMTMtMDktMTEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmg6IENvcnJlY3QgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24KLQlhbGdvcml0aG0gZGVzY3JpcHRpb24uCi0KLTIwMTMtMDktMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbXByb3ZlIEhlYnJldyByZW5kZXJpbmcuCi0KLQlUaGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGEgbmV3IGJsdWUgem9uZSBwcm9wZXJ0eQotCWBBRl9CTFVFX1BST1BFUlRZX0xBVElOX0xPTkcnIHRvIG1ha2UgdGhlIGF1dG8taGludGVyIGlnbm9yZSBzaG9ydAotCXRvcCBzZWdtZW50cy4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogRml4IEhlYnJldyBibHVlIHN0cmluZ3MuCi0JVXNlIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fTE9ORyBmb3IgQUZfQkxVRV9TVFJJTkdfSEVCUkVXX1RPUC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmhpbiAoQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9MT05HKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogSGFuZGxlCi0JYEFGX0xBVElOX0lTX0xPTkdfQkxVRScuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaCAoQUZfTEFUSU5fSVNfTE9OR19CTFVFKTogTmV3IG1hY3JvLgotCi0yMDEzLTA4LTI4ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAZ29vZ2xlLmNvbT4KLQotCVtzZm50XSBGaXggZnJhbWUgYWNjZXNzIHdoaWxlIHJlYWRpbmcgV09GRiB0YWJsZSBkaXJlY3RvcnkuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jICh3b2ZmX29wZW5fZm9udCk6IFVzaW5nIHNpbmdsZSBtZW1vcnkgZnJhbWUKLQl3aGlsZSByZWFkaW5nIHRoZSBkaXJlY3RvcnkgZW50cmllcyBmb3IgdGhlIHdob2xlIGxvb3AuCi0KLTIwMTMtMDgtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLSAgICAgICAgICAgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBnb29nbGUuY29tPgotCi0JSW1wbGVtZW50IHN1cHBvcnQgZm9yIFdPRkYgY29udGFpbmVycy4KLQotCVdlIHNpbXBseSBzeW50aGVzaXplIGEgU0ZOVCBmcm9tIHRoZSBXT0ZGLCBjcmVhdGUgYSBtZW1vcnkgc3RyZWFtCi0JZm9yIHRoZSBuZXcgZGF0YSwgYW5kIGxvYWQgdGhlIFNGTlQgYXMgdXN1YWwuCi0KLQlEb2VzIE5PVCBhZGQgYW55IEFQSSB0byBhY2Nlc3MgV09GRiBtZXRhZGF0YSBvciBwcml2YXRlIGJsb2Nrcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFdPRkZfSGVhZGVyUmVjLAotCVdPRkZfVGFibGVSZWMpOiBOZXcgc3RydWN0dXJlcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaCAoVFRBR193T0ZGKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfT3Blbl9GYWNlKTogU2V0IGBzdHJlYW0nIGFmdGVyIGNhbGxpbmcKLQlgb3Blbl9mYWNlJy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgW0ZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUJdOiBJbmNsdWRlCi0JYEZUX0daSVBfSCcuCi0JKFdSSVRFX0JZVEUsIFdSSVRFX1VTSE9SVCwgV1JJVEVfVUxPTkcpOiBOZXcgdGVtcG9yYXJ5IG1hY3JvcyBmb3IKLQl3cml0aW5nIHRvIGEgc3RyZWFtLgotCShzZm50X3N0cmVhbV9jbG9zZSwgY29tcGFyZV9vZmZzZXRzLCB3b2ZmX29wZW5fZm9udCk6IE5ldyBmdW5jdGlvbnMuCi0JKHNmbnRfb3Blbl9mb250KTogSGFuZGxlIGBUVEFHX3dPRkYnLgotCShzZm50X2luaXRfZmFjZSk6IFNldCBgc3RyZWFtJyBhZnRlciBjYWxsaW5nIGBzZm50X29wZW5fZm9udCcuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZmFjZV9pbml0KTogU2V0IGBzdHJlYW0nIGFmdGVyIGNhbGxpbmcKLQlgc2ZudC0+aW5pdF9mYWNlJy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKG9wZW5fZmFjZSk6IFVzZSBhIHBvaW50ZXIgdG8gRlRfU3RyZWFtIGFzIGFuCi0JYXJndW1lbnQgc28gdGhhdCBhIGNoYW5nZWQgc3RyZWFtIHN1cnZpdmVzLgotCVVwZGF0ZSBjYWxsZXJzLgotCi0yMDEzLTA4LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZ3ppcF0gTmV3IGZ1bmN0aW9uIGBGVF9HemlwX1VuY29tcHJlc3MnLgotCi0JVGhpcyBpcyBtb2RlbGVkIGFmdGVyIHpsaWIncyBgdW5jb21wcmVzcycgZnVuY3Rpb24uICBXZSBuZWVkIHRoaXMKLQlmb3IgV09GRiBzdXBwb3J0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oLCBzcmMvZ3ppcC9mdGd6aXAuYyAoRlRfR3ppcF9VbmNvbXByZXNzKToKLQlOZXcgZnVuY3Rpb24uCi0KLQkqIHNyYy9nemlwL3J1bGVzLm1rOiBSZXdyaXRlIHRvIGJldHRlciByZWZsZWN0IGRlcGVuZGVuY2llcy4KLQotMjAxMy0wOC0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCBgbWFrZSBtdWx0aScgY29tcGlsYXRpb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jaW4sIHNyYy9hdXRvZml0L2FmYmx1ZS5jOiBEb24ndCBpbmNsdWRlCi0JYGFmYmx1ZS5oJyBidXQgYGFmdHlwZXMuaCcuCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jOiBEb24ndCBpbmNsdWRlIGBhZnR5cGVzLmgnIGJ1dCBgYWZnbG9iYWwuaCcuCi0KLTIwMTMtMDgtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggQysrIGNvbXBpbGF0aW9uLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfZ2V0X21ldHJpY3MpLAotCXNyYy9hdXRvZml0L2FmZHVtbXkuYyAoYWZfZGZsdF9zY3JpcHRfY2xhc3MpLCBzcmMvYXV0b2ZpdC9hZmluZGljLmMKLQkoYWZfZGV2YV9zY3JpcHRfY2xhc3MpOiBVc2UgcHJvcGVyIGNhc3RzLgotCi0yMDEzLTA4LTI3ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAZ29vZ2xlLmNvbT4KLQotCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9mb250X2Rpcik6IEZpeCBzaWduIHR5cG9zLgotCi0yMDEzLTA4LTI3ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAZ29vZ2xlLmNvbT4KLQotCUZUX09wZW5fRmFjZTogSW1wcm92ZSBleHRlcm5hbCBzdHJlYW0gaGFuZGxpbmcuCi0KLQlJZiB0aGUgZm9udCdzIGBjbGF6ei0+aW5pdF9mYWNlJyBmdW5jdGlvbiB3YW50cyB0byBzd2FwIHRvIG5ldwotCXN0cmVhbSwgaGFuZGxpbmcgb2Ygd2hldGhlciBvcmlnaW5hbCBzdHJlYW0gd2FzIGV4dGVybmFsIGNvdWxkCi0JcmVzdWx0IHRvIGVpdGhlciBtZW1vcnkgbGVhayBvciBkb3VibGUgZnJlZS4gIE1hcmsgZXh0ZXJuYWxpdHkgaW50bwotCWZhY2UgZmxhZ3MgYmVmb3JlIGNhbGxpbmcgYGluaXRfZmFjZScgc3VjaCB0aGF0IHRoZSBjbGF6eiBjYW4gaGFuZGxlCi0JZXh0ZXJuYWwgc3RyZWFtcyBwcm9wZXJseS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX09wZW5fRmFjZSk6IE1vdmUgY29kZSB0byBzZXQKLQlGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNIHRvLi4uCi0JKG9wZW5fZmFjZSk6IFRoaXMgZnVuY3Rpb24uCi0KLTIwMTMtMDgtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVJlbW92ZSBgRlRfU3FydEZpeGVkJyBmdW5jdGlvbi4KLQotCUl0J3Mgbm8gbG9uZ2VyIHVzZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmgsIHNyYy9iYXNlL2Z0Y2FsYy5jOiBEbyBpdC4KLQotMjAxMy0wOC0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFdoaWxlIHRyYWNpbmcsIHJlcG9ydCBzY3JpcHQgbmFtZXMgaW5zdGVhZCBvZiBJRCB2YWx1ZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX3NjcmlwdF9uYW1lcykgW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXToKLQlOZXcgYXJyYXkuCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfbWV0cmljc19pbml0X3dpZHRocywKLQlhZl9jamtfaGludF9lZGdlcyk6IFVzZSBgYWZfc2NyaXB0X25hbWVzJy4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocywKLQlhZl9sYXRpbl9oaW50X2VkZ2VzKTogRGl0dG8uCi0KLTIwMTMtMDgtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBSZXBvcnQgdXNlZCBzY3JpcHQgd2hpbGUgaGludGluZyBhIGdseXBoLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfaGludF9lZGdlcyksIHNyYy9hdXRvZml0L2FmbGF0aW4uYwotCShhZl9sYXRpbl9oaW50X2VkZ2VzKTogSW1wbGVtZW50IGl0LgotCi0yMDEzLTA4LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIEhlYnJldyBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHN0cmluZ3MgZm9yIEhlYnJldy4KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfaGVicl91bmlyYW5nZXMpOiBOZXcgYXJyYXkuCi0JKGFmX2hlYnJfc2NyaXB0X2NsYXNzKTogTmV3IHNjcmlwdC4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaCwgc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogVXBkYXRlZC4KLQotMjAxMy0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEltcHJvdmUgdHJhY2luZyBtZXNzYWdlcy4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMpOiBNZW50aW9uIHNjcmlwdAotCUlEIGluIHRyYWNpbmcgbWVzc2FnZS4KLQkoYWZfY2prX21ldHJpY3NfaW5pdF9ibHVlcyk6IEluaXRpYWxpemUgYGF4aXMnIG91dHNpZGUgb2YgdGhlIGlubmVyCi0JbG9vcC4KLQlJbXByb3ZlIHRyYWNpbmcgbWVzc2FnZXMuCi0JKGFmX2Nqa19oaW50X2VkZ2VzKSBbRlRfREVCVUdfTEVWRUxfVFJBQ0VdOiBOZXcgdmFyaWFibGUKLQlgbnVtX2FjdGlvbnMnIHRvIGNvdW50IGhpbnRpbmcgYWN0aW9ucy4KLQlJbXByb3ZlIHRyYWNpbmcgbWVzc2FnZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyk6IE1lbnRpb24KLQlzY3JpcHQgSUQgaW4gdHJhY2luZyBtZXNzYWdlLgotCShhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMsIGFmX2xhdGluX2hpbnRfZWRnZXMpOiBJbXByb3ZlIHRyYWNpbmcKLQltZXNzYWdlcy4KLQotMjAxMy0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQmV0dGVyIHRyYWNpbmcgb2YgbG9hZGVkIGdseXBocy4KLQotCVByZXZpb3VzbHksIHRoZSBsb2FkaW5nIG9mIGEgZ2x5cGggd2FzIHRyYWNlZCBhdCBsZXZlbCA0LCBpZiBhdCBhbGwuCi0JV2l0aCB0aGlzIGNoYW5nZSwgYWxsIGZvbnQgbG9hZGluZyByb3V0aW5lcyBlbWl0IGEgdHJhY2luZyBtZXNzYWdlCi0JYXQgbGV2ZWwgMSwgbWFraW5nIGl0IGVhc2llciB0byBzZWxlY3QgdHJhY2luZyBvdXRwdXQgKGZvciBleGFtcGxlCi0JdXNpbmcgRjJfREVCVUc9ImFueToxIGFmaGludHM6NyBhZmxhdGluOjciKS4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfR2x5cGhfTG9hZCk6IEFkZCB0cmFjaW5nIG1lc3NhZ2UuCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nbHlwaF9sb2FkKTogRGl0dG8uCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3ByZXBhcmUpOiBJbXByb3ZlIHRyYWNpbmcKLQltZXNzYWdlcy4KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX2xvYWRfZ2x5cGgpOiBVc2UgbGV2ZWwgMSBmb3IgdHJhY2luZwotCW1lc3NhZ2UuCi0JKiBzcmMvcGNmL3BjZmRyaXZyLmMgKFBDRl9HbHlwaF9Mb2FkKTogRGl0dG8uCi0JKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX3Nsb3RfbG9hZCk6IEFkZCB0cmFjaW5nIG1lc3NhZ2UuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0dseXBoKTogRGl0dG8uCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9Mb2FkX0dseXBoKTogRGl0dG8uCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0dseXBoU2xvdF9Mb2FkKTogRGl0dG8uCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmMgKEZOVF9Mb2FkX0dseXBoKTogRGl0dG8uCi0KLTIwMTMtMDgtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggc2NyaXB0IHNlbGVjdGlvbi4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYyAoYWZfZmFjZV9nbG9iYWxzX2dldF9tZXRyaWNzKTogVXNlCi0JYEFGX1NDUklQVF9ERkxUJywgbm90IHZhbHVlIDAuCi0JU2ltcGxpZnkgY29kZS4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogU29ydCBieSBzY3JpcHQgbmFtZS4KLQotMjAxMy0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIE1ha2UgYGR1bW15JyBoaW50ZXIgd29yayBhcyBleHBlY3RlZC4KLQotCSogc3JjL2F1dG9maXQvYWZkdW1teS5jIChhZl9kdW1teV9oaW50c19pbml0KTogUHJvcGVybHkgc2V0IHNjYWxpbmcKLQlpbmZvcm1hdGlvbi4KLQkoYWZfZHVtbXlfaGludHNfYXBwbHkpOiBTY2FsZSB0aGUgZ2x5cGhzLgotCi0yMDEzLTA4LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWFrZSBgY2prJyBtb2R1bGUgdXNlIGJsdWUgc3RyaW5nc2V0cy4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoQUZfQ0pLX01BWF9URVNUX0NIQVJBQ1RFUlMpOiBSZW1vdmVkLgotCShhZl9jamtfaGFuaV9ibHVlX2NoYXJzKTogUmVtb3ZlZC4KLQkoQUZfQ0pLX0JMVUVfVFlQRV8qKTogUmVtb3ZlZC4KLQkoYWZfY2prX21ldHJpY3NfaW5pdF9ibHVlcyk6IFJlcGxhY2UgQUZfQ0pLX01BWF9URVNUX0NIQVJBQ1RFUlMgd2l0aAotCUFGX0JMVUVfU1RSSU5HX01BWF9MRU4uCi0JQ2hhbmdlIGxvb3BzIHRvIHVzZSBvZmZzZXRzIChpbiBmaWxlIGBhZmJsdWUuaCcpIGludG8gdGhlIG5ldyBhcnJheXMKLQlgYWZfYmx1ZV9zdHJpbmdzZXRzJyBhbmQgYGFmX2JsdWVfc3RyaW5ncycgKGluIGZpbGUgYGFmYmx1ZS5jJykuCi0JSW5zdGVhZCBvZiB0aHJlZSBkaW1lbnNpb25zIChhcyB1c2VkIGluIHRoZSBvbGQgYmx1ZSBzdHJpbmcgYXJyYXkpCi0Jd2Ugbm93IHVzZSBwcm9wZXJ0aWVzIHRvIGRvIHRoZSBzYW1lLCBzYXZpbmcgb25lIGxvb3AgbmVzdGluZyBsZXZlbC4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuaDogUmVtb3ZlIG9sZCBlbnVtZXJhdGlvbiB2YWx1ZXMgc3VwZXJzZWRlZCBieQotCXRoZSBuZXcgZGF0YSBpbiBgYWZibHVlLmgnLgotCShBRl9DSktfSVNfVE9QX0JMVUUsIEFGX0NKS19JU19IT1JJWl9CTFVFLCBBRl9DSktfSVNfRklMTEVEX0JMVUUsCi0JQUZfQ0pLX0lTX1JJR0hUX0JMVUUpOiBOZXcgbWFjcm9zLCB0byBiZSB1c2VkIGluCi0JYGFmX2Nqa19tZXRyaWNzX2luaXRfYmx1ZXMnLgotCShBRl9DSktfQkxVRV9JU19SSUdIVCk6IFJlbW92ZSB0aGlzIG5vdyByZWR1bmRhbnQgZW51bSB2YWx1ZS4KLQkoQUZfQ0pLX0JMVUVfSVNfVE9QKTogUmVuYW1lZCB0by4uLgotCShBRl9DSktfQkxVRV9UT1ApOiBUaGlzLgotCShBRl9DSktfTUFYX0JMVUVTKTogUmVtb3ZlLgotCShBRl9DSktBeGlzUmVjKTogVXBkYXRlZC4KLQotMjAxMy0wOC0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFR5cG8uCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5oaW4sIHNyYy9hdXRvZml0L2FmYmx1ZS5jIChHRVRfVVRGOF9DSEFSKTogVXNlCi0JY2FzdC4KLQotMjAxMy0wOC0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFN5bmNocm9uaXplIGBjamsnIHdpdGggYGxhdGluJyBtb2R1bGUgKGFuZCB2aWNlIHZlcnNhKS4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMpOiBBZGQgdHJhY2luZwotCW1lc3NhZ2VzLgotCShhZl9jamtfbWV0cmljc19pbml0X2JsdWVzKTogRG9uJ3QgcGFzcyBibHVlIHN0cmluZyBhcnJheSBhcwotCWFyZ3VtZW50IGJ1dCB1c2UgdGhlIGdsb2JhbCBhcnJheSBkaXJlY3RseS4KLQlVc2UgYG91dGxpbmUnIGRpcmVjdGx5LgotCVVwZGF0ZSBhbmQgYWRkIHRyYWNpbmcgbWVzc2FnZXMuCi0JKGFmX2Nqa19tZXRyaWNzX2luaXQpOiBTaW1wbGlmeSBjb2RlLgotCShhZl9jamtfbWV0cmljc19zY2FsZV9kaW0pOiBJbXByb3ZlIHRyYWNpbmcgbWVzc2FnZS4KLQkoYWZfY2prX21ldHJpY3Nfc2NhbGUpOiBTeW5jaHJvbml6ZS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzLAotCWFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcyk6IEltcHJvdmUgYW5kIGFkZCB0cmFjaW5nIG1lc3NhZ2VzLgotCi0yMDEzLTA4LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWFrZSBgbGF0aW4nIG1vZHVsZSB1c2UgYmx1ZSBzdHJpbmdzZXRzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKEFGX0xBVElOX01BWF9URVNUX0NIQVJBQ1RFUlMpOiBSZW1vdmVkLgotCShhZl9sYXRpbl9ibHVlX2NoYXJzKTogUmVtb3ZlZC4KLQkoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogUmVwbGFjZSBBRl9MQVRJTl9NQVhfVEVTVF9DSEFSQUNURVJTCi0Jd2l0aCBBRl9CTFVFX1NUUklOR19NQVhfTEVOLgotCUNoYW5nZSBsb29wcyB0byB1c2Ugb2Zmc2V0cyAoaW4gZmlsZSBgYWZibHVlLmgnKSBpbnRvIHRoZSBuZXcgYXJyYXlzCi0JYGFmX2JsdWVfc3RyaW5nc2V0cycgYW5kIGBhZl9ibHVlX3N0cmluZ3MnIChpbiBmaWxlIGBhZmJsdWUuYycpLgotCVVzZSBgQUZfTEFUSU5fSVNfU01BTExfVE9QX0JMVUUnIG1hY3JvLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmg6IFJlbW92ZSBvbGQgZW51bWVyYXRpb24gdmFsdWVzIHN1cGVyc2VkZWQgYnkKLQl0aGUgbmV3IGRhdGEgaW4gYGFmYmx1ZS5oJy4KLQkoQUZfTEFUSU5fSVNfVE9QX0JMVUUpOiBVcGRhdGVkIGRlZmluaXRpb24uCi0JKEFGX0xBVElOX0lTX1NNQUxMX1RPUF9CTFVFKTogTmV3IG1hY3JvLgotCShBRl9MQVRJTl9NQVhfQkxVRVMpOiBSZW1vdmUuCi0JKEFGX0xhdGluQXhpc1JlYyk6IFVwZGF0ZWQuCi0KLTIwMTMtMDgtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBZGQgYmx1ZSBzdHJpbmdzZXRzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmg6IEluY2x1ZGUgYGFmYmx1ZS5oJy4KLQkoQUZfU2NyaXB0Q2xhc3NSZWMpOiBBZGQgYGJsdWVfc3RyaW5nc2V0JyBmaWVsZC4KLQkoQUZfREVGSU5FX1NDUklQVF9DTEFTUyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2F1dG9maXQuYzogSW5jbHVkZSBgYWZibHVlLmMnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9oYW5pX3NjcmlwdF9jbGFzcyksIHNyYy9hdXRvZml0L2FmZHVtbXkuYwotCShhZl9kZmx0X3NjcmlwdF9jbGFzcyksIHNyYy9hdXRvZml0L2FmaW5kaWMuYwotCShhZl9kZXZhX3NjcmlwdF9jbGFzcyksIHNyYy9hdXRvZml0L2FmbGF0aW4uYwotCShhZl9sYXRuX3NjcmlwdF9jbGFzcyksIHNyYy9hdXRvZml0L2FmbGF0aW4yLmMKLQkoYWZfbHRuMl9zY3JpcHRfY2xhc3MpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9ydWxlcy5tayAoQVVUT0ZfRFJWX1NSQyk6IEFkZCBgYWZibHVlLmMnLgotCi0yMDEzLTA4LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW50cm9kdWNlIGRhdGEgZmlsZSBmb3IgYmx1ZSBzdHJpbmdzLgotCi0JVGhlIGlkZWEgaXMgdG8gaGF2ZSBhIGNlbnRyYWwgZmlsZSB3aGljaCBnZXRzIHByb2Nlc3NlZCBieSBhIFBlcmwKLQlzY3JpcHQgdG8gY3JlYXRlIHByb3BlciBgLmMnIGFuZCBgLmgnIGZpbGVzIHVzaW5nIHRlbXBsYXRlcy4gIFRoZXJlCi0JYXJlIHR3byBvdGhlciByZWFzb25zIHRvIGRvIHRoYXQ6Ci0KLQkgIC4gVGhlIGRhdGEgZmlsZSBzaG91bGQgYmUgZWFzaWx5IHJlYWRhYmxlLiAgV2UgdXNlIFVURi04IGVuY29kaW5nCi0JICAgIHdoaWNoIHRoZW4gZ2V0cyBjb252ZXJ0ZWQgdG8gc2luZ2xlIGJ5dGVzLgotCi0JICAuIFNpbmNlIHRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIHNjcmlwdHMgd2lsbCBpbmNyZWFzZSBzb29uLCB0aGUKLQkgICAgY3VycmVudCB1c2FnZSBvZiBibHVlIHN0cmluZyBhcnJheXMgaXMgYSB3YXN0ZSBvZiBzcGFjZS4gIFVzaW5nCi0JICAgIHRoZSBQZXJsIHNjcmlwdCBpdCBpcyBwb3NzaWJsZSB0byBpbWl0YXRlIGphZ2dlZCBhcnJheXMsCi0JICAgIGRlZmluaW5nIGVudW1lcmF0aW9uIGNvbnN0YW50cyBhcyBvZmZzZXRzIGludG8gdGhlIGFycmF5cy4KLQotCVRoaXMgY29tbWl0IG9ubHkgYWRkcyBmaWxlcyB3aXRob3V0IGNoYW5naW5nIGFueSBmdW5jdGlvbmFsaXR5LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBOZXcgZGF0YSBmaWxlLgotCSogc3JjL3Rvb2xzL2FmYmx1ZS5wbDogTmV3IFBlcmwgc2NyaXB0IGZvciBwcm9jZXNzaW5nIGBhZmJsdWUuZGF0Jy4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmNpbiwgc3JjL2F1dG9maXQvYWZibHVlLmhpbjogTmV3IHRlbXBsYXRlIGZpbGVzCi0JZm9yLi4uCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmM6IE5ldyBzb3VyY2UgZmlsZXMuCi0JVG8gYXZvaWQgYSBkZXBlbmRlbmN5IG9uIFBlcmwsIHdlIGFkZCB0aGVtIHRvby4KLQotMjAxMy0wOC0xOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEVuYWJsZSBuZXcgYWxnb3JpdGhtIGZvciBgQkJveF9DdWJpY19DaGVjaycuCi0KLQkqIHNyYy9iYXNlL2Z0YmJveC5jOiBFbmFibGUgbmV3IEJCb3hfQ3ViaWNfQ2hlY2sgYWxnb3JpdGhtLCByZW1vdmUKLQl0aGUgb2xkIG9uZS4KLQlJbXByb3ZlIGNvbW1lbnRzLgotCi0yMDEzLTA4LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L3VuaXgtZGVmLmluIChmcmVldHlwZTIucGMpOiBEb24ndCBzZXQgZXhlY3V0YWJsZSBiaXQuCi0KLTIwMTMtMDgtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzM5ODA0LgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3IChMSUJQTkcpOiBEZWZpbmUgYW5kIGV4cG9ydC4KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbiwgYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluOiBIYW5kbGUKLQlsaWJwbmcuCi0KLTIwMTMtMDgtMTcgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBDbGVhbiB1cCBCQm94X0NvbmljX0NoZWNrLgotCi0JKiBzcmMvYmFzZS9mdGJib3guYyAoQkJveF9Db25pY19DaGVjayk6IFJlbW92ZSByZWR1bmRhbnQgY2hlY2tzIGZvcgotCWV4dHJlbXVtIGF0IHRoZSBzZWdtZW50IGVuZHMsIHdoaWNoIGFyZSBhbHJlYWR5IHdpdGhpbiB0aGUgYmJveC4KLQlTbGlnaHRseSBtb2RpZnkgY2FsY3VsYXRpb25zLgotCi0yMDEzLTA4LTE1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gRmluaXNoIGV4cGVyaW1lbnRhbCAoZGlzYWJsZWQpIEJCb3hfQ3ViaWNfQ2hlY2sgaW1wbGVtZW50YXRpb24uCi0KLQkqIHNyYy9iYXNlL2Z0YmJveC5jIChCQm94X0N1YmljX0NoZWNrKTogU2NhbGUgYXJndW1lbnRzIHRvIGltcHJvdmUKLQlhY2N1cmFjeSBhbmQgYXZvaWQgb3ZlcmZsb3dzLgotCi0yMDEzLTA4LTEzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gUmVmYWN0b3IgZXhwZXJpbWVudGFsIChkaXNhYmxlZCkgQkJveF9DdWJpY19DaGVjay4KLQotCSogc3JjL2Jhc2UvZnRiYm94LmMgKEJCb3hfQ3ViaWNfQ2hlY2spOiBJbXBsZW1lbnQgdGhlIG1pbmltdW0gc2VhcmNoCi0JYXMgdGhlIG1pcnJvciBpbWFnZSBvZiB0aGUgbWF4aW11bSBzZWFyY2ggaW1wbGVtZW50ZWQgaGVyZS4uLgotCSh1cGRhdGVfbWF4KTogTmV3IGZ1bmN0aW9uLgotCi0yMDEzLTA4LTA2ICBKb2huIFR5dGdhdCAgPEpvaG4uVHl0Z2F0QGVza28uY29tPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzk3MDIuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKTogQ2hlY2sgZm9yIGBjdXJfb2Zmc2V0Ci0JIT0gMCc7IHRoaXMgc3Ryb25nZXIgdGVzdCBpcyBtYW5kYXRlZCBieSB0aGUgQ0ZGIHNwZWNpZmljYXRpb24uCi0JRml4IHRlc3QgZm9yIElOREVYIHN0cnVjdHVyZXMgd2hpY2ggaGF2ZSBvbmUgb3IgbW9yZSBlbXB0eSBlbnRyaWVzCi0JYXQgdGhlIGVuZC4KLQotMjAxMy0wOC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGdjYyBwcmFnbWFzLCBwYXJ0IDIuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9NdWxGaXgxNF9sb25nX2xvbmcsCi0JVFRfRG90Rml4MTRfbG9uZ19sb25nKTogYCNwcmFnbWEgZ2NjIGRpYWdub3N0aWMge3B1c2gscG9wfScgaGFzIGJlZW4KLQlpbnRyb2R1Y2VkIHdpdGggZ2NjIHZlcnNpb24gNC42LgotCi0yMDEzLTA4LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggZ2NjIHByYWdtYXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9NdWxGaXgxNF9sb25nX2xvbmcsCi0JVFRfRG90Rml4MTRfbG9uZ19sb25nKTogT2xkZXIgZ2NjIHZlcnNpb25zIGRvbid0IGFjY2VwdCBkaWFnbm9zdGljCi0JcHJhZ21hcyB3aXRoaW4gYSBmdW5jdGlvbiBib2R5LgotCi0yMDEzLTA4LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzOTcwMC4KLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaDogU3luY2hyb25pemUgd2l0aAotCWBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oJy4KLQotCSogYnVpbGRzL3Ztcy9mdGNvbmZpZy5oOiBEaXR0by4KLQlNYWtlIHRoZSBkaWZmZXJlbmNlcyB0byB0aGUgbWFzdGVyIGBmdGNvbmZpZy5oJyBmaWxlIGFzIHNtYWxsIGFzCi0JcG9zc2libGUgZm9yIGVhc2llciBtYWludGVuYW5jZS4KLQotMjAxMy0wOC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEltcHJvdmUgaGFuZGxpbmcgb2YgYG5lYXInIHBvaW50cy4KLQotCVBvaW50cyB3aGljaCBhcmUgdmVyeSBuZWFyIHRvIGVhY2ggb3RoZXIgYXJlIG5vdyBtYXJrZWQgYXMgc3VjaC4KLQlUaGUgYHdlYWsnIGZsYWcgaXMgdGhlbiBjb21wdXRlZCBieSB1c2luZyB0aGUgYGluJyB2ZWN0b3Igb2YgdGhlCi0JZmlyc3QgYW5kIHRoZSBgb3V0JyB2ZWN0b3Igb2YgdGhlIGxhc3QgcG9pbnQgb2YgYSBncm91cCBvZiBuZWFyCi0JcG9pbnRzLgotCi0JRm9yIGV4YW1wbGUsIHRoaXMgZml4ZXMgdGhlIHJlbmRlcmluZyBvZiBnbHlwaCBgT3NsYXNoJyBpbgotCWBSb2JvdG8tVGhpbi50dGYnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmggKEFGX0ZsYWdzKTogTmV3IHZhbHVlIGBBRl9GTEFHU19ORUFSJy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19yZWxvYWQpOiBJbnRyb2R1Y2UKLQl0aGUgaGV1cmlzdGljIHZhbHVlIGBuZWFyX2xpbWl0JyB0byBkZWNpZGUgd2hldGhlciB0aGUgY3VycmVudCBwb2ludAotCWlzIG5lYXIgdG8gdGhlIHByZXZpb3VzIG9uZSwgdGhlbiBzZXQgYEFGX0ZMQUdfTkVBUicgYWNjb3JkaW5nbHkuCi0JU3RvcmUgZ29vZCBgaW4nIHZlY3RvciAob2YgbGFzdCBub24tbmVhciBwb2ludCkgaW4KLQlgbGFzdF9nb29kX2luX3t4LHl9JyBhbmQgdXNlIGl0IGFzIGFuIGFyZ3VtZW50IHRvCi0JYGZ0X2Nvcm5lcl9pc19mbGF0JyBpZiBuZWNlc3NhcnkuCi0KLTIwMTMtMDgtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGNmZmRydi5oOiBJbXByb3ZlIGRvY3VtZW50YXRpb24uCi0JVGhpcyBpcyBiYXNlZCBvbiBibG9nIGVudHJpZXMgZnJvbSBEYXZpZCBMZW1vbiBhbmQgRGF2ZSBBcm5vbGQgKGJvdGgKLQlmcm9tIEFkb2JlKSB3aXRoIGtpbmQgcGVybWlzc2lvbi4gIERhdmUgYWxzbyBoZWxwZWQgaW4KLQlwcm9vZi1yZWFkaW5nLgotCi0yMDEzLTA4LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTW92ZSBkZWNsYXJhdGlvbiBvZiBzY3JpcHRzIGludG8gc2VwYXJhdGUgZmlsZS4KLQotCVRoaXMgaGFzIHRoZSBiZW5lZml0IHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBkdXBsaWNhdGUgdGhlIGRhdGEgYXQKLQlkaWZmZXJlbnQgcGxhY2VzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBOZXcgZmlsZS4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9TY3JpcHQpOiBJbmNsdWRlIGBhZnNjcmlwdC5oJyB0byBkZWZpbmUKLQl0aGUgZW51bWVyYXRpb24gdmFsdWVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jOiBJbmNsdWRlIGBhZnNjcmlwdC5oJyB0byBnZXQgdGhlIHNjcmlwdAotCXNwZWNpZmljIGhlYWRlciBmaWxlcy4KLQkoYWZfc2NyaXB0X2NsYXNzZXMpOiBJbmNsdWRlIGBhZnNjcmlwdC5oJyB0byBmaWxsIHRoaXMgYXJyYXkuCi0KLQkqIHNyYy9hdXRvZml0L2FmcGljLmM6IEluY2x1ZGUgYGFmc2NyaXB0LmgnIHRvIGdldCB0aGUgc2NyaXB0Ci0Jc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCShhdXRvZml0X21vZHVsZV9jbGFzc19waWNfaW5pdCk6IEluY2x1ZGUgYGFmc2NyaXB0LmgnIGZvcgotCWluaXRpYWxpemF0aW9uLgotCSogc3JjL2F1dG9maXQvYWZwaWMuaCAoQUZfU0NSSVBUX0NMQVNTRVNfQ09VTlQsCi0JQUZfU0NSSVBUX0NMQVNTRVNfUkVDX0NPVU5UKTogUmVtb3ZlZC4gIFVzZSBgQUZfU0NSSVBUX01BWCcgaW5zdGVhZC4KLQotCSogc3JjL2F1dG9maXQvcnVsZXMubWsgKEFVVE9GX0RSVl9IKTogVXBkYXRlZC4KLQotMjAxMy0wOC0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIE1vdmUgZGVjbGFyYXRpb24gb2Ygd3JpdGluZyBzeXN0ZW1zIGludG8gc2VwYXJhdGUgZmlsZS4KLQotCVRoaXMgaGFzIHRoZSBiZW5lZml0IHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBkdXBsaWNhdGUgdGhlIGRhdGEgYXQKLQlkaWZmZXJlbnQgcGxhY2VzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZndydHN5cy5oOiBOZXcgZmlsZS4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9Xcml0aW5nU3lzdGVtKTogSW5jbHVkZSBgYWZ3cnRzeXMuaCcgdG8KLQlkZWZpbmUgdGhlIGVudW1lcmF0aW9uIHZhbHVlcy4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYzogSW5jbHVkZSBgYWZ3cnRzeXMuaCcgdG8gZ2V0IHRoZSB3cml0aW5nCi0Jc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLQlJbmNsdWRlIGBhZnBpYy5oJy4KLQkoYWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlcyk6IEluY2x1ZGUgYGFmd3J0c3lzLmgnIHRvIGZpbGwgdGhpcwotCWFycmF5LgotCi0JKiBzcmMvYXV0b2ZpdC9hZnBpYy5jOiBJbmNsdWRlIGBhZndydHN5cy5oJyB0byBnZXQgdGhlIHdyaXRpbmcKLQlzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCShhdXRvZml0X21vZHVsZV9jbGFzc19waWNfaW5pdCk6IEluY2x1ZGUgYGFmd3J0c3lzLmgnIGZvcgotCWluaXRpYWxpemF0aW9uLgotCSogc3JjL2F1dG9maXQvYWZwaWMuaCAoQUZfV1JJVElOR19TWVNURU1fQ0xBU1NFU19DT1VOVCwKLQlBRl9XUklUSU5HX1NZU1RFTV9DTEFTU0VTX1JFQ19DT1VOVCk6IFJlbW92ZWQuICBVc2UKLQlgQUZfV1JJVElOR19TWVNURU1fTUFYJyBpbnN0ZWFkLgotCi0yMDEzLTA4LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IGNvbXBpbGF0aW9uIHdpdGggZysrLgotCi0JKiBzcmMvc2ZudC9wbmdzaGltLmMgKGVycm9yX2NhbGxiYWNrLCByZWFkX2RhdGFfZnJvbV9GVF9zdHJlYW0pOiBVc2UKLQljYXN0LgotCShMb2FkX1NCaXRfUG5nKTogUGFjaWZ5IGNvbXBpbGVyLgotCi0yMDEzLTA4LTAyICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotICAgICAgICAgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCBgbWFrZSBtdWx0aScuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmggKEZUX0xPQ0FMX0FSUkFZLAotCUZUX0xPQ0FMX0FSUkFZX0RFRik6IE5ldyBtYWNyb3MuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX3dyaXRpbmdfc3lzdGVtX2NsYXNzZXMsCi0JYWZfc2NyaXB0X2NsYXNzZXMpOiBVc2UgRlRfTE9DQUxfQVJSQVlfREVGLgotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuaDogRGVjbGFyZSBgYWZfd3JpdGluZ19zeXN0ZW1fY2xhc3NlcycgYW5kCi0JYGFmX3NjcmlwdF9jbGFzc2VzJy4KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmM6IEluY2x1ZGUgYGFmcGljLmgnLgotCi0yMDEzLTA4LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBbm90aGVyIHJvdW5kIG9mIGNwcGNoZWNrIG5pdHBpY2tzLgotCi0JVGhlIGNhbGwgd2FzIChmcm9tIHRoZSB0b3AtbGV2ZWwgb2YgdGhlIEZyZWVUeXBlIHRyZWUpOgotCi0JICBjcHBjaGVjayAtLWZvcmNlIFwKLQkgICAgICAgICAgIC0tZW5hYmxlPWFsbCBcCi0JICAgICAgICAgICAtSSAvdXNyL2luY2x1ZGUgXAotCSAgICAgICAgICAgLUkgL3Vzci9sb2NhbC9pbmNsdWRlIFwKLQkgICAgICAgICAgIC1JIC91c3IvbGliL2djYy9pNTg2LXN1c2UtbGludXgvNC43L2luY2x1ZGUgXAotCSAgICAgICAgICAgLUkgaW5jbHVkZSBcCi0JICAgICAgICAgICAtSSBpbmNsdWRlL2ZyZWV0eXBlIFwKLQkgICAgICAgICAgIC1JIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnIFwKLQkgICAgICAgICAgIC1JIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwgXAotCSAgICAgICAgICAgLURGVDJfQlVJTERfTElCUkFSWSBcCi0JICAgICAgICAgICAuICY+IGNwcGNoZWNrLmxvZwotCi0JdXNpbmcgY3BwY2hlY2sgZ2l0IGNvbW1pdCBmN2U5M2Y5OS4KLQotCU5vdGUgdGhhdCBjcHBjaGVjayBzdGlsbCBjYW4ndCBoYW5kbGUgYCNpbmNsdWRlIEZPTycgKHdpdGggYEZPTycgYQotCW1hY3JvKS4KLQotCSovKiBJbXByb3ZlIHZhcmlhYmxlIHNjb3Blcy4KLQkqLyogUmVtb3ZlIHJlZHVuZGFudCBpbml0aWFsaXphdGlvbnMgd2hpY2ggZ2V0IG92ZXJ3cml0dGVuLgotCi0JKiBzcmMvZ3h2YWxpZC8qOiBDb21tZW50IG91dCByZWR1bmRhbnQgY29kZSBvciBndWFyZCBpdCB3aXRoCi0JRlRfREVCVUdfTEVWRUxfVFJBQ0UuCi0KLTIwMTMtMDctMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBJbnRyb2R1Y2UgYHdyaXRpbmcgc3lzdGVtcycuCi0KLQlUaGlzIHBhdGNoIGFkZHMgYSBuZXcgdG9wIGxldmVsIHRvIHRoZSBhdXRvLWhpbnRlcidzIHNjcmlwdCBjbGFzcwotCWhpZXJhcmNoeS4gIEl0IGRlZmluZXMgYHdyaXRpbmcgc3lzdGVtcycgd2hpY2ggY2FuIGNvbnRhaW4gbXVsdGlwbGUKLQlzY3JpcHRzLgotCi0JRm9yIGV4YW1wbGUsIHRoZSBgbGF0aW4nIHdyaXRpbmcgc3lzdGVtIChpbiBmaWxlIGBhZmxhdGluLmMnKSBpcwotCWFibGUgdG8gc3VwcG9ydCBzY3JpcHRzIGxpa2UgTGF0aW4sIEN5cmlsbGljLCBBcm1lbmlhbiwgZXRjLiwgd2hpY2gKLQljYW4gYmUgaGFuZGxlZCBzaW1pbGFybHkuCi0KLQlTY3JpcHRzIGFyZSBub3cgbmFtZWQgdXNpbmcgZm91ci1sZXR0ZXIgT3BlblR5cGUgdGFncy4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9TY3JpcHRDbGFzc1JlYyk6IE1vdmUgcmVsZXZhbnQgbWVtYmVycwotCXRvLi4uCi0JKEFGX1dyaXRpbmdTeXN0ZW1DbGFzc1JlYyk6IFRoaXMgbmV3IHN0cnVjdHVyZS4gIEl0IGhvbGRzIHBvaW50ZXJzCi0JdG8gZnVuY3Rpb25zIHdoaWNoIGNhbiBiZSBzaGFyZWQgYW1vbmcgcmVsYXRlZCBzY3JpcHRzLgotCShBRl9Xcml0aW5nU3lzdGVtKTogTmV3IGVudW1lcmF0aW9uLgotCShBRl9TY3JpcHQpOiBSZXZpc2VkIHZhbHVlcyB1c2luZyBmb3VyLWxldHRlciB0YWdzLgotCShBRl9ERUZJTkVfV1JJVElOR19TWVNURU1fQ0xBU1MpOiBOZXcgbWFjcm8uCi0JKEFGX0RFRklORV9TQ1JJUFRfQ0xBU1MpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl93cml0aW5nX3N5c3RlbV9jbGFzc2VzKTogTmV3IGdsb2JhbCwKLQljb25zdGFudCBhcnJheS4KLQkoYWZfc2NyaXB0X2NsYXNzZXMpOiBVcGRhdGVkLgotCShhZl9mYWNlX2dsb2JhbHNfZnJlZSk6IFVwZGF0ZWQuCi0JUmVtb3ZlIGFzc2VydGlvbi4KLQkoYWZfZmFjZV9nbG9iYWxzX2dldF9tZXRyaWNzKTogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuaCAoQUZfU0NSSVBUX0ZBTExCQUNLKQotCVshQUZfQ09ORklHX09QVElPTl9DSktdOiBIYW5kbGUgdGhpcyBjYXNlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfbG9hZF9nLCBhZl9sb2FkZXJfbG9hZF9nbHlwaCk6Ci0JVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZwaWMuYyAoYXV0b2ZpdF9tb2R1bGVfY2xhc3NfcGljX2luaXQpOiBVcGRhdGVkOwotCWluaXRpYWxpemUgc3RydWN0dXJlcyBmb3IgYm90aCB3cml0aW5nIHN5c3RlbXMgYW5kIHNjcmlwdHMuCi0JKiBzcmMvYXV0b2ZpdC9hZnBpYy5oOiBVcGRhdGVkLgotCShBRl9XUklUSU5HX1NZU1RFTV9DTEFTU0VTX0dFVCk6IE5ldyBtYWNyby4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX3dyaXRpbmdfc3lzdGVtX2NsYXNzKTogTmV3IHdyaXRpbmcKLQlzeXN0ZW0uCi0JKGFmX2Nqa191bmlyYW5nZXMpOiBSZW5hbWVkIHRvLi4uCi0JKGFmX2hhbmlfdW5pcmFuZ2VzKTogVGhpcy4KLQkoYWZfY2prX3NjcmlwdF9jbGFzcyk6IFJlZHVjZWQgYW5kIHJlbmFtZWQgdG8uLi4KLQkoYWZfaGFuaV9zY3JpcHRfY2xhc3MpOiBUaGlzLgotCSogc3JjL2F1dG9maXQvYWZjamsuaDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZkdW1teS5jIChhZl9kdW1teV93cml0aW5nX3N5c3RlbV9jbGFzcyk6IE5ldyB3cml0aW5nCi0Jc3lzdGVtLgotCShhZl9kdW1teV9zY3JpcHRfY2xhc3MpOiBSZWR1Y2VkIGFuZCByZW5hbWVkIHRvLi4uCi0JKGFmX2RmbHRfc2NyaXB0X2NsYXNzKTogVGhpcy4KLQkqIHNyYy9hdXRvZml0L2FmZHVtbXkuaDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZpbmRpYy5jIChhZl9pbmRpY193cml0aW5nX3N5c3RlbV9jbGFzcyk6IE5ldyB3cml0aW5nCi0Jc3lzdGVtLgotCShhZl9pbmRpY191bmlyYW5nZXMpOiBSZW5hbWVkIHRvLi4uCi0JKGFmX2RldmFfdW5pcmFuZ2VzKTogVGhpcy4KLQkoYWZfaW5kaWNfc2NyaXB0X2NsYXNzKTogUmVkdWNlZCBhbmQgcmVuYW1lZCB0by4uLgotCShhZl9kZXZhX3NjcmlwdF9jbGFzcyk6IFRoaXMuCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5oOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX3dyaXRpbmdfc3lzdGVtX2NsYXNzKTogTmV3IHdyaXRpbmcKLQlzeXN0ZW0uCi0JKGFmX2xhdGluX3VuaXJhbmdlcyk6IFJlbmFtZWQgdG8uLi4KLQkoYWZfbGF0bl91bmlyYW5nZXMpOiBUaGlzLgotCShhZl9sYXRpbl9zY3JpcHRfY2xhc3MpOiBSZWR1Y2VkIGFuZCByZW5hbWVkIHRvLi4uCi0JKGFmX2xhdG5fc2NyaXB0X2NsYXNzKTogVGhpcy4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaDogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbjIuYyAoYWZfbGF0aW4yX3dyaXRpbmdfc3lzdGVtX2NsYXNzKTogTmV3Ci0Jd3JpdGluZyBzeXN0ZW0uCi0JKGFmX2xhdGluMl91bmlyYW5nZXMpOiBSZW5hbWVkIHRvLi4uCi0JKGFmX2x0bjJfdW5pcmFuZ2VzKTogVGhpcy4KLQlTeW5jaHJvbml6ZSByYW5nZXMgd2l0aCBgbGF0aW4nLgotCShhZl9sYXRpbjJfc2NyaXB0X2NsYXNzKTogUmVkdWNlZCBhbmQgcmVuYW1lZCB0by4uLgotCShhZl9sdG4yX3NjcmlwdF9jbGFzcyk6IFRoaXMuCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluMi5oOiBVcGRhdGVkLgotCi0yMDEzLTA3LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gVmFyaWFibGUgcmVuYW1pbmcuCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCAoQUZfU2NyaXB0TWV0cmljc1JlYyk6Ci0Jcy9jbGF6ei9zY3JpcHRfY2xhc3MvLgotCVVwZGF0ZSBhbGwgdXNlcnMuCi0KLTIwMTMtMDctMzAgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlJZ25vcmUgbGlicG5nLWNvbmZpZyB1bmRlciBjcm9zcy1idWlsZGluZyBjb25maWd1cmF0aW9uLAotCWJlY2F1c2UgaXQgd2lsbCByZXR1cm4gdGhlIGZsYWdzIGZvciB0aGUgaG9zdGluZyBlbnZpcm9ubWVudC4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogSWdub3JlIGxpYnBuZy1jb25maWcgd2hlbgotCWBjcm9zc19jb21waWxpbmcnID09IHllcy4KLQotMjAxMy0wNy0zMCAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGdvb2dsZS5jb20+Ci0KLQlQcmV2ZW50IGRpdmlzaW9uIGJ5IHplcm8gYnkgYSB0cmFuc3BhcmVudCBjb2xvci4KLQotCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoZnRfZ3JheV9mb3JfcHJlbXVsdGlwbGllZF9zcmdiX2JncmEpOgotCVJldHVybiAwIGltbWVkaWF0ZWx5LCB3aGVuIGFscGhhIGNoYW5uZWwgaXMgemVyby4KLQotMjAxMy0wNy0yNSAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGdvb2dsZS5jb20+Ci0KLQlBZGQgRlRfRkFDRV9GTEFHX0NPTE9SIGFuZCBGVF9IQVNfQ09MT1IuCi0KLQlBbHNvIGRpc2FtYmlndWF0ZSBHb29nbGUncyBjb2xvciBiaXRtYXAgdGFibGVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0ZBQ0VfRkxBR19DT0xPUiwgRlRfSEFTX0NPTE9SKToKLQlOZXcgbWFjcm9zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfU2JpdFRhYmxlVHlwZSk6IEFkZAotCVRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBIYW5kbGUgRlRfRkFDRV9GTEFHX0NPTE9SLgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAodHRfZmFjZV9sb2FkX3NiaXQsCi0JdHRfZmFjZV9sb2FkX3N0cmlrZV9tZXRyaWNzLCB0dF9mYWNlX2xvYWRfc2JpdF9pbWFnZSk6IEhhbmRsZQotCVRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDLgotCi0yMDEzLTA3LTI0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW3NmbnRdIEZpeCBmb3IgYG1ha2UgbXVsdGknIHRhcmdldC4KLQotCSogc3JjL3NmbnQvcG5nc2hpbS5jIChMb2FkX1NCaXRfUG5nKTogVXNlIEZUX0xPQ0FMX0RFRigpLgotCi0yMDEzLTA3LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGRvY3MvSU5TVEFMTC5HTlU6IFVwZGF0ZWQuCi0KLTIwMTMtMDctMjAgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBnb29nbGUuY29tPgotCi0JW3NmbnRdIEZpeCBgc2JpeCcgdGFibGUgdmVyc2lvbiBoYW5kbGluZy4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zYml0KSBbVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVhdOgotCVVTSE9SVCB2ZXJzaW9uIG51bWJlcnMgYXJlIHRvIGJlIGNvbnNpZGVyZWQgYXMgYG1pbm9yJy4KLQotMjAxMy0wNy0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCBzZWdtZW50IGNsYXNzaWZpY2F0aW9uIGZvciBibHVlIHpvbmVzLgotCi0JVGhlIG9sZCBjb2RlIChlc3NlbnRpYWxseSB1bmNoYW5nZWQgc2luY2UgdGhlIHZlcnkgYmVnaW5uaW5nKQotCWluY29ycmVjdGx5IGhhbmRsZWQgdGhpcyBjb25maWd1cmF0aW9uCi0KLQkgICAgICAgICAgICAgICB4IC1vLSB4Ci0JICAgICAgICAgICAgICAgIC8gICBcCi0JICAgICAgICAgICAgICAgLyAgICAgXAotCSAgICAgICAgICAgICAgLyAgICAgICBcCi0JICAgICAgICAgICAgIG8gICAgICAgICBvCi0KLQlhcyBmbGF0IGFuZCB0aGlzCi0KLQkgICAgICAgICAgICAgICAgbyAgICAgICAgICAgICAgIG8KLQkgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgLwotCSAgICAgICAgICAgICB4fCAgICAgICAgICAgICAgeHwKLQkgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0JICAgICAgICAgICAgICBvLS0tLS0tLS0tLS0tLS0tbwotCi0JYXMgcm91bmQuICAoYG8nIGFuZCBgeCcgYXJlIG9uIGFuZCBvZmYgcG9pbnRzLCByZXNwZWN0aXZlbHkpLgotCi0JVGhpcyBpcyBhIG1ham9yIGNoYW5nZSB3aGljaCBzaG91bGQgaW1wcm92ZSB0aGUgcmVuZGVyaW5nIHJlc3VsdHMKLQllbm9ybW91c2x5IGZvciBtYW55IFRydWVUeXBlIGZvbnRzLCBlc3BlY2lhbGx5IGluIHRoZSByYW5nZSBhcHByb3guCi0JMjAtNDBwcGVtLCBmaXhpbmcgdGhlIGFwcGVhcmFuY2Ugb2YgbWFueSBvdmVyc2hvb3RzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcyk6IExvb2sgYXQgdGhlCi0JZmlyc3QgYW5kIGxhc3QgcG9pbnRzIG9mIHRoZSBzZWdtZW50LCBub3QgdGhlIHBvaW50cyByaWdodCBiZWZvcmUKLQlhbmQgYWZ0ZXIuCi0KLTIwMTMtMDctMTkgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBnb29nbGUuY29tPgotCi0JW3NmbnRdIGBzYml4JyBmaXgtdXBzLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9sb2FkX2ZhY2UpOiBBcHBsZSdzIGBzYml4JyBjb2xvciBiaXRtYXBzCi0JYXJlIHJlbmRlcmVkIHNjYWxlZCBhbmQgdGhlbiB0aGUgYGdseWYnIG91dGxpbmUgcmVuZGVyZWQgb24gdG9wLiAgV2UKLQlkb24ndCBzdXBwb3J0IHRoYXQgeWV0LCBzbyBqdXN0IGlnbm9yZSB0aGUgYGdseWYnIG91dGxpbmUgYW5kCi0JYWR2ZXJ0aXNlIGl0IGFzIGEgYml0bWFwLW9ubHkgZm9udC4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcykKLQlbVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVhdOiBSZXR1cm4gbWV0cmljcyBpbiAyNi42IHVuaXRzLgotCSh0dF9mYWNlX2xvYWRfc2JpeF9pbWFnZSk6IFR5cG8uCi0KLTIwMTMtMDctMTggIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBnb29nbGUuY29tPgotCi0JW3NmbnRdIEFkZCBzdXBwb3J0IGZvciBBcHBsZSdzIGBzYml4JyBjb2xvciBiaXRtYXAgdGFibGUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9TQml0X01ldHJpY3NSZWMpOiBXaWRlbgotCWZpZWxkcyB0byBGVF9TaG9ydCBhbmQgRlRfVVNob3J0LCByZXNwZWN0aXZlbHkuCi0JKFRUX1NiaXRUYWJsZVR5cGUpOiBOZXcgZW51bWVyYXRpb24uCi0JKFRUX0ZhY2VSZWMpOiBBZGQgYHNiaXRfdGFibGVfdHlwZScgZmllbGQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvdHR0YWdzLmggKFRUQUdfc2JpeCk6IE5ldyBtYWNyby4KLQotCSogc3JjL3NmbnQvcG5nc2hpbS5jIChMb2FkX1NCaXRfUG5nKTogUGFzcyBhIG1vcmUgZ2VuZXJpYwotCUZUX0dseXBoU2xvdCBhcmd1bWVudCBpbnN0ZWFkIEZUX0JpdG1hcC4KLQlBZGQgZmxhZyB0byBjb250cm9sIG1hcCBhbmQgbWV0cmljcyBoYW5kbGluZy4KLQlVcGRhdGUgYWxsIHVzZXJzLgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYzogSW5jbHVkZSBgdHRtdHguaCcuCi0JKHR0X2ZhY2VfbG9hZF9lYmxjKTogUmVuYW1lZCB0by4uLgotCSh0dF9mYWNlX2xvYWRfc2JpdCk6IFRoaXMuCi0JSGFuZGxlIGBzYml4JyBiaXRtYXBzLgotCSh0dF9mYWNlX2ZyZWVfZWJsYyk6IFJlbmFtZWQgdG8uLi4KLQkodHRfZmFjZV9sb2FkX3NiaXQpOiBUaGlzLgotCVVwZGF0ZWQuCi0JKHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcyk6IEhhbmRsZSBgc2JpeCcgYml0bWFwcy4KLQkodHRfZmFjZV9sb2FkX3NiaXhfaW1hZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKHR0X3NiaXRfZGVjb2Rlcl9hbGxvY19iaXRtYXAsIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlLAotCXR0X3NiaXRfZGVjb2Rlcl9sb2FkX2J5dGVfYWxpZ25lZCwgdHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQsCi0JdHRfc2JpdF9kZWNvZGVyX2xvYWRfY29tcG91bmQsIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX3BuZywKLQl0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSwgdHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0bWFwKTogRG9uJ3QgcGFzcwotCWFuZCBoYW5kbGUgbG9hZCBmbGFncy4KLQkodHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0bWFwKSBbIUZUX0NPTkZJR19PUFRJT05fVVNFX1BOR106IEJldHRlcgotCWhhbmRsZSBmb3JtYXRzIDE3LTE5LgotCU1vdmUgY29sb3IgdG8gZ3JheXNjYWxlIGNvbnZlcnNpb24gdG8uLi4KLQkodHRfZmFjZV9sb2FkX3NiaXRfaW1hZ2UpOiBIZXJlLgotCUhhbmRsZSBgc2JpeCcgYml0bWFwcy4KLQotCSogc3JjL3NmbnQvcG5nc2hpbS5oOiBVcGRhdGVkLgotCSogc3JjL3NmbnQvdHRzYml0Lmg6IFVwZGF0ZWQuCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jOiBVcGRhdGVkLgotCi0yMDEzLTA3LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSWdub3JlIGludmFsaWQgbWFnaWMgbnVtYmVyIGluIGBoZWFkJyBvciBgYmhlZCcuCi0KLQlPdGhlciBmb250IGVuZ2luZXMgc2VlbSB0byBpZ25vcmUgaXQgYWxzby4gIFByb2JsZW0gcmVwb3J0ZWQgYnkKLQlIaW4tVGFrIExldW5nIDxodGwxMEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAoY2hlY2tfdGFibGVfZGlyKTogRG9uJ3QgYWJvcnQgYnV0IHdhcm4gb25seSBpZgotCXdlIGhhdmUgYW4gaW52YWxpZCBtYWdpYyBudW1iZXIuCi0KLTIwMTMtMDctMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzbW9vdGhdIEZpeCBzZWdmYXVsdCBjYXVzZWQgYnkgcHJldmlvdXMgY29tbWl0LgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9zZXRfY2VsbCk6IEFsd2F5cyBjb21wdXRlCi0JYHJhcy5pbnZhbGlkJy4KLQotMjAxMy0wNy0xNiAgRGF2aWQgVHVybmVyICA8ZGlnaXRAZ29vZ2xlLmNvbT4KLQotCVtzbW9vdGhdIEltcHJvdmUgcGVyZm9ybWFuY2UuCi0KLQlQcm92aWRlIGEgd29yay1hcm91bmQgZm9yIGFuIEFSTS1zcGVjaWZpYyBwZXJmb3JtYW5jZSBidWcgaW4gR0NDLgotCVRoaXMgc3BlZWRzIHVwIHRoZSByYXN0ZXJpemVyIGJ5IG1vcmUgdGhhbiA1JS4KLQotCUFsc28gc2xpZ2h0bHkgb3B0aW1pemUgYHNldF9ncmF5X2NlbGwnIGFuZCBgZ3JheV9yZWNvcmRfY2VsbCcgKHdoaWNoCi0JYWxzbyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvbiBvdGhlciBwbGF0Zm9ybXMgYnkgYSB0aW55IGJpdCAoPDElKS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKEZUX0RJVl9NT0QpOiBOZXcgbWFjcm8uCi0JVXNlIGl0IHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JKGdyYXlfcmVjb3JkX2NlbGwsIGdyYXlfc2V0X2NlbGwsIGdyYXlfbW92ZV90bywKLQlncmF5X2NvbnZlcnRfZ2x5cGhfaW5uZXIpOiBTdHJlYW1saW5lIGNvbmRpdGlvbiBoYW5kbGluZy4KLQotMjAxMy0wNy0xNiAgRGF2aWQgVHVybmVyICA8ZGlnaXRAZ29vZ2xlLmNvbT4KLQotCVt0cnVldHlwZV0gQWRkIGFzc2VtYmxlciBjb2RlIGZvciBUVF9NdWxGaXgxNCBhbmQgVFRfRG90Rml4MTQuCi0KLQlUaGlzIHBhdGNoIHByb3ZpZGVzIHNsaWdodGx5IG9wdGltaXplZCB2ZXJzaW9ucyBmb3IgQVJNLCB4ODYsIGFuZAotCXg4Nl82NCBDUFVzIGlmIGJ1aWx0IHdpdGggR0NDLgotCi0JQWxzbyByZW1vdmUgc29tZSBkZWFkIGNvZGUuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9NdWxGaXgxNF9hcm0sIFRUX011bEZpeDE0X2xvbmdfbG9uZywKLQlUVF9Eb3RGaXgxNF9sb25nX2xvbmcpOiBOZXcgZnVuY3Rpb25zLgotCi0yMDEzLTA3LTE2ICBEYXZpZCBUdXJuZXIgIDxkaWdpdEBnb29nbGUuY29tPgotCi0JT3B0aW1pemUgRlRfTXVsRml4IGZvciB4ODZfNjQgR0NDIGJ1aWxkcy4KLQotCVRoaXMgcGF0Y2ggcHJvdmlkZXMgYW4gb3B0aW1pemVkIGBGVF9NdWxGaXgnIGltcGxlbWVudGF0aW9uIGZvcgotCXg4Nl82NCBtYWNoaW5lcyB3aGVuIEZyZWVUeXBlIGlzIGJ1aWx0IHdpdGggR0NDLCBvciBjb21wYXRpYmxlCi0JY29tcGlsZXJzIGxpa2UgQ2xhbmcuCi0KLQlFeGFtcGxlOgotCSAgYmluL2Z0YmVuY2ggLXAgLXQgNSAtcyAxNCAtZiAwMDA4IEFyaWFsLnR0ZgotCi0JQmVmb3JlOgotCi0JICBMb2FkICAgICAgICAgICAgICAgICAgICAgICA0Ljg2MyB1cy9vcAotCSAgTG9hZF9BZHZhbmNlcyAoTm9ybWFsKSAgICAgNC44MTYgdXMvb3AKLQkgIExvYWRfQWR2YW5jZXMgKEZhc3QpICAgICAgIDAuMDI4IHVzL29wCi0JICBSZW5kZXIgICAgICAgICAgICAgICAgICAgICAyLjc1MyB1cy9vcAotCSAgR2V0X0dseXBoICAgICAgICAgICAgICAgICAgMC40NjMgdXMvb3AKLQkgIEdldF9DQm94ICAgICAgICAgICAgICAgICAgIDAuMDc3IHVzL29wCi0JICBHZXRfQ2hhcl9JbmRleCAgICAgICAgICAgICAwLjAyMyB1cy9vcAotCSAgSXRlcmF0ZSBDTWFwICAgICAgICAgICAgICAxMy44OTggdXMvb3AKLQkgIE5ld19GYWNlICAgICAgICAgICAgICAgICAgMTIuMzY4IHVzL29wCi0JICBFbWJvbGRlbiAgICAgICAgICAgICAgICAgICAwLjAyOCB1cy9vcAotCSAgR2V0X0JCb3ggICAgICAgICAgICAgICAgICAgMC4zMDIgdXMvb3AKLQotCUFmdGVyOgotCi0JICBMb2FkICAgICAgICAgICAgICAgICAgICAgICA0LjYxNyB1cy9vcAotCSAgTG9hZF9BZHZhbmNlcyAoTm9ybWFsKSAgICAgNC42NDUgdXMvb3AKLQkgIExvYWRfQWR2YW5jZXMgKEZhc3QpICAgICAgIDAuMDI3IHVzL29wCi0JICBSZW5kZXIgICAgICAgICAgICAgICAgICAgICAyLjc4OSB1cy9vcAotCSAgR2V0X0dseXBoICAgICAgICAgICAgICAgICAgMC40NjAgdXMvb3AKLQkgIEdldF9DQm94ICAgICAgICAgICAgICAgICAgIDAuMDc3IHVzL29wCi0JICBHZXRfQ2hhcl9JbmRleCAgICAgICAgICAgICAwLjAyNCB1cy9vcAotCSAgSXRlcmF0ZSBDTWFwICAgICAgICAgICAgICAxMy40MDMgdXMvb3AKLQkgIE5ld19GYWNlICAgICAgICAgICAgICAgICAgMTIuMjc4IHVzL29wCi0JICBFbWJvbGRlbiAgICAgICAgICAgICAgICAgICAwLjAyOCB1cy9vcAotCSAgR2V0X0JCb3ggICAgICAgICAgICAgICAgICAgMC4zMDEgdXMvb3AKLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW4sIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgKLQkoRlRfTXVsRml4X3g4Nl82NCk6IE5ldyBmdW5jdGlvbi4KLQotMjAxMy0wNy0xNiAgRGF2aWQgVHVybmVyICA8ZGlnaXRAZ29vZ2xlLmNvbT4KLQotCVNwZWVkIHVwIEFSTXY3IHN1cHBvcnQuCi0KLQlXaGVuIGJ1aWxkaW5nIGZvciBBUk12NyB3aXRoIHRodW1iMiBpbnN0cnVjdGlvbnMsIHRoZSBvcHRpbWl6ZWQKLQlgRlRfTXVsRml4X2FybScgYXNzZW1ibHkgcm91dGluZSB3YXMgbm90IGJlaW5nIHVzZWQuCi0KLQlUaGUgcmVhc29uIGZvciB0aGlzIGlzIGluIHRoZSBgZnRjb25maWcuaCcgaGVhZGVyLCBuYW1lbHk6Ci0KLQktIFRoZSBhc3NlbWJseSByb3V0aW5lIHVzZXMgdGhlIGBzbXVsbCcgaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbm90Ci0JICBhdmFpbGFibGUgd2hlbiBnZW5lcmF0aW5nIFRodW1iLTEgbWFjaGluZSBjb2RlLiAgSXQgaXMgYXZhaWxhYmxlCi0JICBpbiBUaHVtYi0yIG1vZGUsIHRob3VnaC4KLQotCS0gVGhlIGhlYWRlciB3YXMgd3JpdHRlbiBhIGxvbmcgdGltZSBhZ28gYmVmb3JlIFRodW1iLTIgYmVjYW1lCi0JICB3aWRlbHkgcG9wdWxhciAoZS5nLiB3aXRoIEFuZHJvaWQpLiAgU28gaXQgc2ltcGx5IGRvZXNuJ3QgdXNlIHRoZQotCSAgYXNzZW1ibHkgcm91dGluZSBpZiB0aGUgYF9fdGh1bWJfXycgYnVpbHQtaW4gbWFjcm8gaXMgZGVmaW5lZC4KLQotCS0gV2hlbiBjb21waWxpbmcgaW4gVGh1bWItMiBtb2RlLCB0aGUgY29tcGlsZXIgd2lsbCBkZWZpbmUgYm90aAotCSAgYF9fdGh1bWJfXycgYW5kIGBfX3RodW1iMl9fJy4KLQotCUJ5IGNoZWNraW5nIGZvciBgKF9fdGh1bWIyX18gfHwgIV9fdGh1bWJfXyknLCB3ZSBlbnN1cmUgdGhhdCB0aGUKLQlhc3NlbWJseSByb3V0aW5lIGlzIG9ubHkgYXZvaWRlZCB3aGVuIGdlbmVyYXRpbmcgVGh1bWItMSBjb2RlLgotCi0JR2l2ZW4gdGhhdCB0aGlzIGlzIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBmdW5jdGlvbiwgdGhpcyBpbXByb3ZlcwotCWBmdGJlbmNoJyBhcyBmb2xsb3dzIG9uIGEgR2FsYXh5IE5leHVzOgotCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVmb3JlICh1cy9vcCkgICBBZnRlciAodXMvb3ApCi0KLQkgIC0gbG9hZGluZyBBcmlhbC50dGYgZ2x5cGhzIGF0IDE0IHBwZW0gWzFdCi0KLQkgICAgICBMb2FkICAgICAgICAgICAgICAgICAgIDM0LjI4NSAgICAgICAgICAzMy4wOTgKLQotCSAgLSBzYW1lIG9wZXJhdGlvbiB3aXRoIHRoZSBsaWdodCBhdXRvLWhpbnRlciBbMl0KLQotCSAgICAgIExvYWQgICAgICAgICAgICAgICAgICAgMzEuMzE3ICAgICAgICAgIDI5LjU5MAotCi0JICAtIHNhbWUgb3BlcmF0aW9uIHdpdGhvdXQgaGludGluZyBbM10KLQotCSAgICAgIExvYWQgICAgICAgICAgICAgICAgICAgIDYuMTQzICAgICAgICAgICA1LjM3NgotCi0JICAtIGxvYWRpbmcgQXJpYWwudHRmIGFkdmFuY2VzIGF0IDE0IHBwZW0gWzRdCi0KLQkgICAgICBMb2FkX0FkdmFuY2VzIChub3JtYWwpIDM0LjIxNiAgICAgICAgICAzMy4wMTYKLQkgICAgICBMb2FkX0FkdmFuY2VzIChmYXN0KSAgICAwLjE3NiAgICAgICAgICAgMC4xNzYKLQotCSAgWzFdIGZ0YmVuY2ggLXQgNSAtcCAtcyAxNCAtYiBhIC1mIDAwMDggQXJpYWwudHRmCi0JICBbMl0gZnRiZW5jaCAtdCA1IC1wIC1zIDE0IC1iIGEgLXIgMSAtZiAwMDI4IEFyaWFsLnR0ZgotCSAgWzNdIGZ0YmVuY2ggLXQgNSAtcCAtcyAxNCAtYiBhIC1mIDAwMGEgQXJpYWwudHRmCi0JICBbNF0gZnRiZW5jaCAtdCA1IC1wIC1zIDE0IC1iIGIgLWYgMDAwOCBBcmlhbC50dGYKLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW4sIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgKLQkoRlRfTVVMRklYX0FTU0VNQkxFUik6IEZpeCBoYW5kbGluZyBmb3IgQVJNdjcuCi0KLTIwMTMtMDYtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDEzLTA2LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoRk5UX0xvYWRfR2x5cGgpOiBGaXggYml0bWFwIHdpZHRoIGd1YXJkLgotCi0yMDEzLTA2LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBBZGQgZGFya2VuaW5nIGxpbWl0IHRvIGBkYXJrZW5pbmctcGFyYW1ldGVycycuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3Byb3BlcnR5X3NldCk6IEFkZCBjaGVjay4KLQotMjAxMy0wNi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gQWRkIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjZmZkcnYuaDogRG9jdW1lbnQgaXQuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3Byb3BlcnR5X3NldCwgY2ZmX3Byb3BlcnR5X2dldCk6IEhhbmRsZQotCWBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkuCi0KLQkqIHNyYy9jZmYvY2YyZm9udC5oIChDRjJfRm9udFJlYyk6IEFkZCBgZGFya2VuUGFyYW1zJyBhcnJheS4KLQotCSogc3JjL2NmZi9jZjJmb250LmMgKGNmMl9jb21wdXRlRGFya2VuaW5nKTogQWRkIGBkYXJrZW5QYXJhbXMnCi0JYXJndW1lbnQgYW5kIHVzZSBpdC4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLQkqIHNyYy9jZmYvY2YyZnQuYyAoY2YyX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBDb3B5Ci0JYGRhcmtlbl9wYXJhbXMnIHZhbHVlcy4KLQotCSogc3JjL2NmZi9jZmZvYmpzLmggKENGRl9Ecml2ZXJSZWMpOiBBZGQgYGRhcmtlbl9wYXJhbXMnIGFycmF5LgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2RyaXZlcl9pbml0KTogU2V0IGRlZmF1bHQgdmFsdWVzIGZvcgotCWBkYXJrZW5fcGFyYW1zJy4KLQotMjAxMy0wNi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBDb2RlIHNodWZmbGluZy4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAocmVfdXJsKTogTW92ZSByZWdleHAuLi4KLQkqIHNyYy90b29scy9kb2NtYWtlci9zb3VyY2VzLnB5OiAuLi4gdG8gdGhpcyBmaWxlLgotCi0yMDEzLTA2LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZG9jbWFrZXJdIFJlbW92ZSB1bnVzZWQgZnVuY3Rpb25zLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvY29udGVudC5weSAoRG9jTWFya3VwLmdldF9zdGFydCwKLQlEb2NCbG9jay5nZXRfbWFya3VwX25hbWUpOiBSZW1vdmVkLgotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAoaHRtbF9xdW90ZTAsIGR1bXBfaHRtbF9jb2RlLAotCUh0bWxGb3JtYXR0ZXIubWFrZV9odG1sX3dvcmRzKTogUmVtb3ZlZC4KLQotMjAxMy0wNi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvZnJlZXR5cGUubWsgKGRsbCk6IFJlbW92ZSB0YXJnZXQuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IErDtnJnIEfDvG5uZXdpZyA8am9lcmcuZ3Vlbm5ld2lnQGdvb2dsZW1haWwuY29tPi4KLQotMjAxMy0wNi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBSZWNvZ25pc2UgVVJMcy4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAocmVfdXJsKTogTmV3IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLQkobWFrZV9odG1sX3BhcmEpOiBVc2UgaXQuCi0KLTIwMTMtMDYtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjUuMC4xIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi01LTAtMScuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg6IFVuZGVmaW5lCi0JQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORS4KLQkqIGRldmVsL2Z0b3B0aW9uLmg6IERlZmluZSBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FLgotCi0yMDEzLTA2LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBEb24ndCBjcmVhdGUgYGNhY2hlJyBkaXJlY3RvcnkuCi0KLQlGb3VuZCBieSBQZXRlciBCcmVpdGVubG9obmVyIDxwZWJAbXBwbXUubXBnLmRlPi4KLQotMjAxMy0wNi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNS4wIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNS0wJy4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjUuMC4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLAotCWJ1aWxkcy93aW4zMi92YzIwMDUvZnJlZXR5cGUudmNwcm9qLCBidWlsZHMvd2luMzIvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbjMyL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osIGJ1aWxkcy93aW4zMi92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osIGJ1aWxkcy93aW4zMi92YzIwMTAvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW4zMi92aXN1YWxjL2luZGV4Lmh0bWwsIGJ1aWxkcy93aW4zMi92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbjMyL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luMzIvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNC4xMi8yLjUuMC8sIHMvMjQxMi8yNTAvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX01JTk9SKTogU2V0IHRvIDUuCi0JKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDAuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxNjoyOjEwLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfT3Blbl9GYWNlKTogUGFjaWZ5IGNvbXBpbGVyLgotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NU0lSUCwgSW5zX01JUlApOiBEaXR0by4KLQotMjAxMy0wNi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzkyNjkuCi0KLQkqIHNyYy9iYXNlL2Z0Z2xvYWRyLmMgKEZUX0dseXBoTG9hZGVyX0NoZWNrUG9pbnRzKTogRnJlZSBtZW1vcnkgaW4KLQljYXNlIG9mIHJlYWxsb2NhdGlvbiBmYWlsdXJlcy4KLQotMjAxMy0wNi0xOCAgQW5kcmV3IENodXJjaCAgPGFjaHVyY2grc2F2YW5uYWhAYWNodXJjaC5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzOTI2Ni4KLQotCUlmIG1lbW9yeSBhbGxvY2F0aW9ucyBmYWlsIGF0IGNlcnRhaW4gcG9pbnRzIHdoaWxlIG9wZW5pbmcgYSBmb250LAotCUZyZWVUeXBlIGNhbiBlaXRoZXIgY3Jhc2ggZHVlIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvciBsZWFrIG1lbW9yeS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuYyAoRlRfRmFjZV9JbnRlcm5hbFJlYywKLQlGVF9MaWJyYXJ5UmVjKTogTWFrZSBgcmVmY291bnQnIGEgc2lnbmVkIGludGVnZXIuICBJZiwgZm9yIGV4YW1wbGUsCi0JRlRfT3Blbl9GYWNlKCkgZmFpbHMgaW4gYSBtZW1vcnkgYWxsb2NhdGlvbiBiZWZvcmUgdGhlIGZhY2UncwotCXJlZmVyZW5jZSBjb3VudCBpcyBzZXQgdG8gMSwgYSBzdWJzZXF1ZW50IGBGVF9Eb25lX0xpYnJhcnknIGNhbGwKLQl3b3VsZCBvdGhlcndpc2UgbG9vcCBvdmVyIGBGVF9Eb25lX0ZhY2UnIDJeMzIgdGltZXMgYmVmb3JlIGZyZWVpbmcKLQl0aGUgZmFjZS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKG9wZW5fZmFjZSk6IEluaXRpYWxpemUgYHN0cmVhbScgYW5kIGZyaWVuZHMKLQllYXJsaWVyLgotCShGVF9PcGVuX0ZhY2UpIDxGYWlsPjogQmVoYXZlIGNvcnJlY3RseSBpZiBgbm9kZScgaXMgTlVMTC4KLQkoRlRfRGVzdHJveV9Nb2R1bGUpIDxGYWlsPjogQ2hlY2sgdGhhdCBgcmVuZGVyZXJfY2xhenonIGlzIHZhbGlkLgotCi0yMDEzLTA2LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIE9uZSBmaW5hbCBwcmFnbWEgdG8gc2lsZW5jZSA2NC1iaXQgTVNWQy4KLQotMjAxMy0wNi0wNiAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQkgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gQWRkIGNvZGUgdG8gQWRvYmUncyBlbmdpbmUgdG8gaGFuZGxlIHBwZW0gPiAyMDAwLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBJZiB3ZSBnZXQKLQlGVF9FcnJfR2x5cGhfVG9vX0JpZywgcmV0cnkgdW5oaW50ZWQgYW5kIHNjYWxlIHVwIGxhdGVyIG9uLgotCi0yMDEzLTA2LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBbm90aGVyIHRyeSBvbiBwcmFnbWFzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaDogTW92ZSBwcmFnbWFzIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmg6IC4uLiB0aGlzIGZpbGUgc2luY2UgaXQgZ2V0cwotCWluY2x1ZGVkIGJ5IGFsbCBzb3VyY2UgZmlsZXMuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oOiBSZW1vdmUgcHJhZ21hIHdoaWNoIGhhcyBubwotCWVmZmVjdC4KLQotMjAxMy0wNi0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaDogRGlzYWJsZSBNU1ZDIHdhcm5pbmcgQzQxMjcuCi0KLQlUaGlzIHBhcnRpYWxseSB1bmRvZXMgY29tbWl0IDNmNmUwZTBjLgotCi0yMDEzLTA2LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNb3JlIGNvbXBpbGVyIHdhcm5pbmcgZml4ZXMuCi0KLQkqLyo6IFVzZSBjYXN0IHRvIGBGVF9Cb29sJyAob3IgYEJvb2wnKSB3aGVyZSBhcHByb3ByaWF0ZS4KLQotMjAxMy0wNi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJbXByb3ZlIGhhbmRsaW5nIG9mIGJyb2tlbiBzYml0IGFkdmFuY2Ugd2lkdGhzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0dseXBoKTogVXNlIHRoZSBnbHlwaCdzIChzY2FsZWQpCi0JYGxpbmVhckhvcmlBZHZhbmNlJyBpZiB0aGUgc2JpdCdzIGBob3JpQWR2YW5jZScgdmFsdWUgaXMgemVyby4KLQotCUNmLiBmb250IGBGaXhlZHN5cyBFeGNlbHNpb3InIHYzLjAxIChGU0VYMzAwLnR0ZiksIGdseXBoIEEsIDE2cHBlbS4KLQotMjAxMy0wNi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEltcHJvdmUgZW1iZWRkZWQgYml0bWFwIHRyYWNpbmcuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9SZXF1ZXN0X1NpemUpOiBNb3ZlIHRyYWNlIG1lc3NhZ2UgcmVnYXJkaW5nCi0JYml0bWFwIHN0cmlrZSBtYXRjaCB0by4uLgotCShGVF9NYXRjaF9TaXplKTogVGhpcyBmdW5jdGlvbi4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX21ldHJpY3MsCi0JdHRfc2JpdF9kZWNvZGVyX2xvYWRfYnl0ZV9hbGlnbmVkLCB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRfYWxpZ25lZCwKLQl0dF9zYml0X2RlY29kZXJfbG9hZF9jb21wb3VuZCwgdHRfc2JpdF9kZWNvZGVyX2xvYWRfcG5nLAotCXR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlKTogRGVjb3JhdGUgd2l0aCB0cmFjaW5nIG1lc3NhZ2VzLgotCi0yMDEzLTA2LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICMzOTE2MC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TRFBWVEwpOiBTZXQgcHJvamVjdGlvbiB2ZWN0b3IgdG9vCi0JZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2UuCi0KLTIwMTMtMDYtMDkgIERhdmlkIFR1cm5lciAgPGRpZ2l0QGdvb2dsZS5jb20+Ci0KLQkqIHNyYy9jYWNoZS9mdGNtYW5hZy5jIChGVENfTWFuYWdlcl9SZXNldCk6IEFkZCBtaXNzaW5nIGNhY2hlIGZsdXNoLgotCi0JVGhpcyBjb2RlLCBwcmVzZW50IHNpbmNlIGVpZ2h0KCEpIHllYXJzIGluIHRoZSB1bnVzZWQgYENBQ0hFJwotCWJyYW5jaCwgaGFzIGJlZW4gZm9yZ290dGVuIHRvIGFwcGx5IHRvIHRoZSBtYXN0ZXIgYnJhbmNoLiAgSXQncwotCXJlYWxseSBhbWF6aW5nIHRoYXQgbm9vbmUgaGFzIGV2ZXIgY29tcGxhaW5lZCBzaW5jZQotCWBGVENfTWFuYWdlcl9SZXNldCcgaXMgcHJldHR5IHVzZWxlc3Mgd2l0aG91dCBmbHVzaGluZyB0aGUgY2FjaGUuCi0KLTIwMTMtMDYtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBhbmQgaW1wcm92ZSBwcmFnbWFzIGZvciBNU1ZDIGNvbXBpbGVyLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaDogUmVtb3ZlIHByYWdtYXMuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oOiBVc2UgcHVzaCBhbmQgcG9wIGZvciBwcmFnbWFzLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmg6IEhhbmRsZSB3YXJuaW5nIEM0MzI0LgotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IFVzZSBwdXNoIGFuZCBwb3AgZm9yIHByYWdtYXMuCi0JKiBzcmMvZ3ppcC9mdGd6aXAuYzogSGFuZGxlIHdhcm5pbmcgQzQyNDQuCi0KLTIwMTMtMDYtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIHMvY2YyX2dldEdseXBoV2lkdGgvY2YyX2dldEdseXBoT3V0bGluZS8uCi0KLQkqIHNyYy9jZmYvY2YyZm9udC5jLCBzcmMvY2ZmL2NmMmZvbnQuaCwgc3JjL2NmZi9jZjJmdC5jOiBEbyBpdC4KLQotMjAxMy0wNi0wNiAgRGF2ZSBBcm5vbGQgIDxkYXJub2xkQGFkb2JlLmNvbT4KLQotCVtjZmZdIEFkZCBlYXJseSBleGl0IGZlYXR1cmUgZm9yIHdpZHRoLW9ubHkgY2FsbHMuCi0KLQlUaGlzIGlzIGZvciBgRlRfR2V0X0FkdmFuY2UnLgotCi0JVGhlcmUgYXJlIDcgcGxhY2VzIHdoZXJlIHRoZSBzcGVjIHNheXMgdGhlIHdpZHRoIGNhbiBiZSBkZWZpbmVkOgotCi0JICBoc3RlbS9oc3RlbWhtCi0JICB2c3RlbS92c3RlbWhtCi0JICBjbnRybWFzay9oaW50bWFzawotCSAgaG1vdmV0bwotCSAgdm1vdmV0bwotCSAgcm1vdmV0bwotCSAgZW5kY2hhcgotCi0JKiBzcmMvY2ZmL2NmMmludHJwLmMgKGNmMl9kb1N0ZW1zKTogRXhpdCBlYXJseSBmb3Igd2lkdGgtb25seSBjYWxscywKLQlpZiBwb3NzaWJsZS4KLQotCShjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8Y2YyX2NtZEhTVEVNPiwgPGNmMl9jbWRWU1RFTT4sCi0JPGNmMl9jbWRWTU9WRVRPPiwgPGNmMl9jbWRFTkRDSEFSPiwgPGNmMl9jbWRISU5UTUFTSz4sCi0JPGNmMl9jbWRSTU9WRVRPPiwgPGNmMl9jbWRITU9WRVRPPjogRXhpdCBlYXJseSBmb3Igd2lkdGgtb25seSBjYWxscy4KLQotMjAxMy0wNi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTmV4dCByb3VuZCBvZiBjb21waWxlciBmaXhlcy4KLQotCSogYnVpbGRzL3dpbjMyL2Z0ZGVidWcuYywgYnVpbGRzL3dpbmNlL2Z0ZGVidWcuYyAoZnRfZGVidWdfaW5pdCk6Ci0JQWRkIHByb3BlciBjYXN0LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIChGVF9TRVJWSUNFX1VOQVZBSUxBQkxFKTogRml4Ci0JY2FzdC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaDogRGVjb3JhdGUgc3RyZWFtIGFuZCBmcmFtZQotCW1hY3JvcyB3aXRoIGBGVF9Mb25nJyBhbmQgYEZUX1VMb25nJyBhcyBhcHByb3ByaWF0ZS4KLQotCSogc3JjL2Jhc2UvZnRyZm9yay5jIChyYWNjZXNzX2d1ZXNzX2Rhcndpbl9oZnNwbHVzLAotCXJhY2Nlc3NfZ3Vlc3NfZGFyd2luX25ld3Zmcyk6IFVzZSBjYXN0LgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3NldF9kZWZhdWx0X3NwYWNpbmcpOiBVc2UgY2FzdC4KLQotCSogc3JjL2NhY2hlL2Z0Y21hbmFnLmMgKEZUQ19NYW5hZ2VyX0NoZWNrKTogRml4IGNhc3QuCi0JKiBzcmMvY2FjaGUvZnRjbWFuYWcuaCAoRlRDX01hbmFnZXJSZWMpOiBEaXR0by4KLQotCSogc3JjL2NmZi9jZjJhcnJzdC5jIChjZjJfYXJyc3RhY2tfc2V0TnVtRWxlbWVudHMpOiBVc2UgY2FzdC4KLQkqIHNyYy9jZmYvY2YyZnQuYyAoY2YyX2ZyZWVTZWFjQ29tcG9uZW50KTogRGl0dG8uCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAocmVtb3ZlX3N1YnNldF9wcmVmaXgsIHJlbW92ZV9zdHlsZSk6IERpdHRvLgotCi0JKiBzcmMvY2lkL2NpZHBhcnNlLmMgKGNpZF9wYXJzZXJfbmV3KTogVXNlIGNhc3QuCi0KLQkqIHNyYy9wY2YvcGNmZHJpdnIuYyAoUENGX0dseXBoX0xvYWQpOiBVc2UgY2FzdC4KLQotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChyZWFsbG9jYXRlX3QxX3RhYmxlKTogRml4IGFyZ3VtZW50IHR5cGUuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoZnRfYmxhY2tfcmVzZXQpOiBVc2UgY2FzdC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoRlRfU3RyZWFtX0ZUZWxsKTogVXNlIGNhc3QuCi0JKEFMTF9QT0lOVFMpOiBGaXggY2FzdC4KLQotCSogc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX3BzX2dldF9mb250X3ZhbHVlKTogQWRkIGNhc3RzLgotCSogc3JjL3R5cGUxL3QxcGFyc2UuYyAoVDFfR2V0X1ByaXZhdGVfRGljdCk6IEFkZCBjYXN0LgotCi0yMDEzLTA2LTA1ICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCi0JRml4IG1vcmUgTVNWQyBXaW4zMiBjb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEZpeCB0eXBvIGluIE1TIHByYWdtYS4KLQotCSogc3JjL2Jhc2UvYmRmbGliLmMgKF9iZGZfc2V0X2RlZmF1bHRfc3BhY2luZywgX2JkZl9hZGRfcHJvcGVydHkpOgotCWBsaW5lbm8nIGlzIG9ubHkgdXNlZCBpbiBkZWJ1ZyBtb2RlLgotCi0JKiBzcmMvY2ZmL2NmMmZ0LmMgKGNmMl9idWlsZGVyX21vdmVUbyk6IGBwYXJhbXMnIGlzIG9ubHkgdXNlZCBpbgotCWRlYnVnIG1vZGUuCi0KLTIwMTMtMDYtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjb21waWxlciB3YXJuaW5ncy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oOiBEZWNvcmF0ZSBtZW1vcnkgYWxsb2NhdGlvbgotCW1hY3JvcyB3aXRoIGBGVF9Mb25nJyB3aGVyZSBhcHByb3ByaWF0ZS4KLQlSZW1vdmUgZHVwbGljYXRlIG9mIEZUX01FTV9RUkVORVdfQVJSQVkgZGVmaW5pdGlvbi4KLQotCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoZnRfZ3JheV9mb3JfcHJlbXVsdGlwbGllZF9zcmdiX2JncmEpOiBVc2UKLQljYXN0LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYzogQWRkIHdhcm5pbmcgZGlzYWJsaW5nIHByYWdtYSBmb3IgTVNWQyB3aGlsZQotCWluY2x1ZGluZyBgbWQ1LmMnLgotCi0JKiBzcmMvY2ZmL2NmMmludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfY21kRVNDPjogQWRkCi0JY2FzdC4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2NvbXBvdW5kKTogRml4IGNhc3RzLgotCSh0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRtYXApOiBCZWF1dGlmaWNhdGlvbi4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBJbml0aWFsaXplCi0JdmFyaWFibGVzIChlYXJsaWVyKS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgpOiBQYWNpZnkgY29tcGlsZXIuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBVc2UgdW5zaWduZWQgY29uc3RhbnRzCi0Jd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfR2V0X01NX1Zhcik6IERpdHRvLgotCi0yMDEzLTA2LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2YyZm9udC5jIChjZjJfZ2V0R2x5cGhXaWR0aCk6IEluaXRpYWxpemUgYGFkdldpZHRoJy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgSW5nbWFyIFNpdHRsIDxpbmdtYXIuc2l0dGxAZWxla3Ryb2JpdC5jb20+LgotCi0yMDEzLTA2LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBcHBseSBmaXhlcyBmb3IgY3BwY2hlY2sgbml0cGlja3MuCi0KLQkgIGh0dHA6Ly9jcHBjaGVjay5zb3VyY2Vmb3JnZS5uZXQvCi0KLQlUaGUgY2FsbCB3YXMgKGZyb20gdGhlIHRvcC1sZXZlbCBvZiB0aGUgRnJlZVR5cGUgdHJlZSk6Ci0KLQkgIGNwcGNoZWNrIC0tZm9yY2UgXAotCSAgICAgICAgICAgLS1lbmFibGU9YWxsIFwKLQkgICAgICAgICAgIC1JIGluY2x1ZGUgXAotCSAgICAgICAgICAgLUkgaW5jbHVkZS9mcmVldHlwZS8gXAotCSAgICAgICAgICAgLUkgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvIFwKLQkgICAgICAgICAgIC1JIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvIFwKLQkgICAgICAgICAgIC4gJj4gY3BwY2hlY2subG9nCi0KLQlOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBoZWF2aWx5IGNob2tlcyBvbiBGcmVlVHlwZSwgZGVsaXZlcmluZwotCW1hbnkgd3JvbmcgcmVzdWx0cy4gIEkgd2lsbCByZXBvcnQgdGhvc2UgaXNzdWVzIHRvIHRoZSBjcHBjaGVjayB0ZWFtCi0Jc28gdGhhdCBhIG5ld2VyIHZlcnNpb24gZ2l2ZXMgaW1wcm92ZWQgcmVzdWx0cyBob3BlZnVsbHkuCi0KLQkqLyogSW1wcm92ZSB2YXJpYWJsZSBzY29wZXMuCi0JKi8qIFJlbW92ZSByZWR1bmRhbnQgaW5pdGlhbGl6YXRpb25zIHdoaWNoIGdldCBvdmVyd3JpdHRlbi4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYywgYnVpbGRzL21hYy9mdG1hYy5jIChjb3VudF9mYWNlc19zY2FsYWJsZSk6Ci0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYyAoZnRfbWVtX3RhYmxlX2Rlc3Ryb3kpOiBgdGFibGUnIGNhbid0IGJlIHplcm8uCi0KLQkqIHNyYy9neHZhbGlkL2d4dmtlcm4uYyAoZ3h2X2tlcm5fc3VidGFibGVfZm10MV9lbnRyeV92YWxpZGF0ZSk6Ci0JUmVtb3ZlIGZ1bmN0aW9ubGVzcyBjb2RlLgotCi0JKiBzcmMvdG9vbHMvZnRyYW5kb20uYyAobWFpbik6IEZpeCBtZW1vcnkgbGVhay4KLQotMjAxMy0wNi0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQWRkIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgY29uZmlndXJhdGlvbiBvcHRpb24uCi0KLQlUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIG9sZCBGcmVlVHlwZSBDRkYgZW5naW5lIGdldHMgY29tcGlsZWQgaW50bwotCUZyZWVUeXBlLiAgSXQgaXMgbm93IGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmgsIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSk6IE5ldyBtYWNyby4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfcHJvcGVydHlfc2V0KSwgc3JjL2NmZi9jZmZnbG9hZC5jCi0JKENGRl9PcGVyYXRvciwgY2ZmX2FyZ3VtZW50X2NvdW50cywgY2ZmX2J1aWxkZXJfYWRkX3BvaW50LAotCWNmZl9vcGVyYXRvcl9zZWFjLCBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncywgY2ZmX3Nsb3RfbG9hZCksCi0Jc3JjL2NmZi9jZmZnbG9hZC5oLCBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2RyaXZlcl9pbml0KTogVXNlCi0JQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSB0byBndWFyZCB0aGUgYWZmZWN0ZWQgY29kZS4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDEzLTA2LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggUE5HIGxpYnJhcnkgaGFuZGxpbmcuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IERvbid0IHVzZSBMSUJQTkdfTElCUyBidXQKLQlMSUJQTkdfTERGTEFHUy4KLQotMjAxMy0wNS0yMyAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGdvb2dsZS5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgY29sb3IgZW1iZWRkZWQgYml0bWFwcyAoZWcuIGNvbG9yIGVtb2ppKS4KLQotCUEgbmV3IGxvYWQgZmxhZywgRlRfTE9BRF9DT0xPUiwgbWFrZXMgRnJlZVR5cGUgbG9hZCBjb2xvcgotCWVtYmVkZGVkLWJpdG1hcHMsIGZvbGxvd2luZyB0aGlzIGRyYWZ0IHNwZWNpZmljYXRpb24KLQotCSAgaHR0cHM6Ly9jb2xvci1lbW9qaS5nb29nbGVjb2RlLmNvbS9naXQvc3BlY2lmaWNhdGlvbi92MS5odG1sCi0KLQl3aGljaCBkZWZpbmVzIHR3byBuZXcgU0ZOVCB0YWJsZXMsIGBDQkRUJyBhbmQgYENCTEMnIChuYW1lZCBhbmQKLQltb2RlbGVkIGFmdGVyIGBFQkRUJyBhbmQgYEVCTEMnLCByZXNwZWN0aXZlbHkpLiAgVGhlIGNvbG9yIGJpdG1hcHMKLQlhcmUgc3RvcmVkIGluIHRoZSBuZXcgRlRfUElYRUxfTU9ERV9CR1JBIGZvcm1hdCB0byByZXByZXNlbnQgQkdSQQotCXByZS1tdWx0aXBsaWVkIHNSR0IgaW1hZ2VzLiAgSWYgUE5HIHN1cHBvcnQgaXMgYXZhaWxhYmxlLCBQTkcgY29sb3IKLQlpbWFnZXMgYXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBwcm9wb3NlZCBzcGVjaWZpY2F0aW9uIGFyZSBzdXBwb3J0ZWQKLQlhbHNvLgotCi0JTm90ZSB0aGF0IGNvbG9yIGJpdG1hcHMgYXJlIGNvbnZlcnRlZCB0byBncmF5c2NhbGUgaWYgY2xpZW50IGRpZG4ndAotCWFzayBmb3IgY29sb3IuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IFNlYXJjaCBmb3IgbGlicG5nLgotCUFkZCBgLS13aXRob3V0LXBuZycgb3B0aW9uLgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKEZUX0NPTkZJR19PUFRJT05fVVNFX1BORyk6IE5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9MT0FEX0NPTE9SKTogTmV3IGxvYWQgZmxhZy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmggKEZUX1BpeGVsX01vZGUpOiBBZGQKLQlgRlRfUElYRUxfTU9ERV9CR1JBJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaCAoVFRBR19DQkRULCBUVEFHX0NCTEMpOiBOZXcgdGFncy4KLQotCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoRlRfQml0bWFwX0VtYm9sZGVuKTogVXBkYXRlZC4KLQkoZnRfZ3JheV9mb3JfcHJlbXVsdGlwbGllZF9zcmdiX2JncmEpOiBOZXcgZnVuY3Rpb24uCi0JKEZUX0JpdG1hcF9Db252ZXJ0KTogSGFuZGxlIEZUX1BJWEVMX01PREVfQkdSQS4KLQotCSogc3JjL3NmbnQvcG5nc2hpbS5jLCBzcmMvc2ZudC9wbmdzaGltLmg6IE5ldyBmaWxlcy4KLQotCSogc3JjL3NmbnQvc2ZudC5jOiBJbmNsdWRlIGBwbmdzaGltLmMnLgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYzogSW5jbHVkZSBGVF9CSVRNQVBfSCBhbmQgYHBuZ3NoaW0uaCcKLQkodHRfZmFjZV9sb2FkX2VibGMpOiBMb2FkIGBDQkxDJy4KLQkodHRfc2JpdF9kZWNvZGVyX2luaXQpOiBMb2FkIGBDQkRUJy4KLQkodHRfc2JpdF9kZWNvZGVyX2FsbG9jX2JpdG1hcCk6IFBhc3MgbG9hZCBmbGFncyB0byBzZWxlY3QgYmV0d2VlbgotCWNvbG9yIGFuZCBncmF5c2NhbGUgYml0bWFwcy4KLQlTZXQgYG51bV9ncmF5cycuICBUaGlzIGlzIHVzZWQgYnkgYGZ0dmlldycgdG8gY2hvb3NlIHRoZSBibGVuZGluZwotCWFsZ29yaXRobS4KLQkodHRfc2JpdF9kZWNvZGVyX2xvYWRfYnl0ZV9hbGlnbmVkLAotCXR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdF9hbGlnbmVkLCB0dF9zYml0X2RlY29kZXJfbG9hZF9jb21wb3VuZCwKLQl0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSk6IFBhc3MgbG9hZCBmbGFnLgotCXMvd3JpdGUvcHdyaXRlLy4KLQlEb24ndCBjYWxsIGB0dF9zYml0X2RlY29kZXJfYWxsb2NfYml0bWFwJy4KLQlVcGRhdGVkLgotCSh0dF9zYml0X2RlY29kZXJfbG9hZF9wbmcpIFtGVF9DT05GSUdfT1BUSU9OX1VTRV9QTkddOiBOZXcgZnVuY3Rpb24uCi0JKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdG1hcCk6IFBhc3MgbG9hZCBmbGFnLgotCUhhbmRsZSBuZXcgZ2x5cGggZm9ybWF0cyAxNywgMTgsIGFuZCAxOS4KLQlDYWxsIGB0dF9zYml0X2RlY29kZXJfYWxsb2NfYml0bWFwJy4KLQlGbGF0dGVuIGNvbG9yIGJpdG1hcHMgaWYgbmVjZXNzYXJ5LgotCSh0dF9mYWNlX2xvYWRfc2JpdF9pbWFnZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L3J1bGVzLm1rIChTRk5UX0RSVl9TUkMpOiBBZGQgYHBuZ3NoaW0uYycuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxMy0wNS0yNCAgR3VlbnRlciAgPGluZm9AZ2tudy5uZXQ+Ci0KLQlBcHBseSBTYXZhbm5haCBwYXRjaCAjODA1NS4KLQotCU1ha2UgYGFwaW5hbWVzJyBjcmVhdGUgYW4gaW1wb3J0IGZpbGUgZm9yIE5ldFdhcmUuCi0KLQkqIHNyYy90b29scy9hcGluYW1lcy5jIChQUk9HUkFNX1ZFUlNJT04pOiBTZXQgdG8gMC4yLgotCShPdXRwdXRGb3JtYXQpOiBBZGQgYE9VVFBVVF9ORVRXQVJFX0lNUCcuCi0JKG5hbWVzX2R1bXApOiBIYW5kbGUgaXQuCi0JKHVzYWdlKTogVXBkYXRlZC4KLQkobWFpbik6IEhhbmRsZSBuZXcgY29tbWFuZCBsaW5lIGZsYWcgYC13TicuCi0KLTIwMTMtMDUtMjMgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JQ29tcGlsYXRpb24gZml4LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKQotCVshVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HXTogTWFrZSBpdCB3b3JrLgotCi0yMDEzLTA1LTIyICBJbmZpbmFsaXR5ICA8aW5maW5hbGl0eUBpbmZpbmFsaXR5Lm5ldD4KLQotCVt0cnVldHlwZV0gRm9ybWF0dGluZyBhbmQgYW4gYWRkaXRpb25hbCBzdWJwaXhlbCB0d2Vhay4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TSFBJWCk6IEZvcm1hdHRpbmcgZml4LgotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4LmMgKFNLSVBfTk9OUElYRUxfWV9NT1ZFU19SdWxlcyk6Ci0JUmV2ZXJ0IHByZXZpb3VzIG1vZGlmaWNhdGlvbiBmb3IgVmVyZGFuYSBjbG9uZXMuCi0KLTIwMTMtMDUtMjIgIEluZmluYWxpdHkgIDxpbmZpbmFsaXR5QGluZmluYWxpdHkubmV0PgotCi0JW3RydWV0eXBlXSBBZGp1c3Qgc3VicGl4ZWwgenAyIG1vdmVzIGFuZCB0d2VhayBydWxlcy4KLQotCVRoZXNlIG1vZGlmaWNhdGlvbnMgZml4IHRoaW4gZGlhZ29uYWwgc3RlbXMgaW4gc29tZSBsZWdhY3kgZm9udHMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChEaXJlY3RfTW92ZV9YKTogUmVtb3ZlIHVudXNlZCBtYWNyby4KLQkoTW92ZV9acDJfUG9pbnQpOiBEb24ndCBhbHdheXMgZGlzYWJsZSB4IG1vdmVzIGZvciBzdWJwaXhlbCByZW5kZXJpbmcuCi0JKEluc19TSFApOiBEaXNhYmxlIHggbW92ZXMgaGVyZSBmb3Igc3VicGl4ZWwgcmVuZGVyaW5nLgotCShJbnNfU0hQSVgpOiBPbmx5IGRpc2FibGUgeCBtb3ZlcyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuCi0JU3BsaXQgb3V0IHpwMiBtb3ZlIHJldmVyc2FscyBhbmQgcmVvcmRlciBjb25kaXRpb25hbCByZXNwZWN0aXZlbHkuCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5jIChTS0lQX05PTlBJWEVMX1lfTU9WRVNfUnVsZXMpOiBGaXggb3ZlcnNpZ2h0LgotCU9ubHkgYWRqdXN0IFZlcmRhbmEgY2xvbmVzIGZvciAxNyBwcGVtLgotCShTS0lQX05PTlBJWEVMX1lfTU9WRVNfUnVsZXNfRXhjZXB0aW9ucyk6IEFkZCBDb3VyaWVyIE5ldy4KLQkoQUxXQVlTX1NLSVBfREVMVEFQX1J1bGVzKTogRm91bmQgYWRkaXRpb25hbCBjYXNlcyBmb3IgQXJpYWwgYHMnLgotCi0yMDEzLTA1LTIwICBJbmZpbmFsaXR5ICA8aW5maW5hbGl0eUBpbmZpbmFsaXR5Lm5ldD4KLQotCVt0cnVldHlwZV0gU2ltcGxpZnkgYW5kIGltcHJvdmUgc3VicGl4ZWwgZnVuY3Rpb24gZGV0ZWN0aW9uLgotCi0JU29tZSBzbWFsbCBlbmhhbmNlbWVudHMgaGF2ZSBhbGxvd2VkIHRoZSByZW1vdmFsIG9mIG1hbnkgbWFjcm9zIGFuZAotCXRoZSBzaW1wbGlmaWNhdGlvbiBvZiBleGlzdGluZyBydWxlcyBpbiBgdHRzdWJwaXguYycuCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5oIChTUEhfVFdFQUtfQUxMT1dfWF9ETU9WRVgsCi0JU1BIX1RXRUFLX0FMTE9XX1hfTU9WRV9aUDIsCi0JU1BIX1RXRUFLX0RFTFRBUF9TS0lQX0VYQUdHRVJBVEVEX1ZBTFVFUywKLQlTUEhfVFdFQUtfU0tJUF9JTkxJTkVfREVMVEFTLCBTUEhfVFdFQUtfTUlSUF9DVlRfWkVSTyk6IFJlbW92ZWQuCi0JKFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVNfREVMVEFQKTogTmV3IHJ1bGUgbWFjcm8uCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5jOiBVcGRhdGVkIGFmZmVjdGVkIHJ1bGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoRGlyZWN0X01vdmVfWCk6IFVwZGF0ZWQuCi0JKElOU19GREVGKTogQWRkIGFkZGl0aW9uYWwgZnVuY3Rpb24gZGV0ZWN0aW9uLgotCShJTlNfRU5ERik6IFNldCBydW50aW1lIGZsYWcuCi0JKEluc19DQUxMKTogU2tpcCB0aGUgY2FsbCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCi0JUmVtb3ZlIGJhZCBjb2RlLgotCShJbnNfTE9PUENBTEwpOiBTa2lwIHRoZSBjYWxsIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4KLQlSZW1vdmUgYmFkIGNvZGUuCi0JKE1vdmVfWnAyX1BvaW50KTogVXBkYXRlZC4KLQkoSW5zX1NIUElYKTogVXBkYXRlZC4KLQlTa2lwIHRoZSBtb3ZlIHVuZGVyIHNvbWUgc2l0dWF0aW9ucy4KLQkoSW5zX01JQVApOiBJbXByb3ZlIGNvbmRpdGlvbnMuCi0JKEluc19NSVJQKTogVXBkYXRlZC4KLQkoSW5zX0RFTFRBUCk6IFNraXAgbW92ZSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCi0JU2ltcGxpZnkgY29uZGl0aW9ucy4KLQkoVFRfUnVuSW5zKTogVXBkYXRlZC4KLQlBZGQgY29kZSB0byBoYW5kbGUgbmV3IGZ1bmN0aW9uIGRldGVjdGlvbi4KLQlUcmFjZSBtZXNzYWdlcy4KLQotMjAxMy0wNS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JVXBkYXRlIG1vcmUgRlRfRXJyX1hYWCBtYWNyb3MgdXNpbmcgRlRfRVJSIGFuZCBGVF9USFJPVzsKLQotCSogYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0c3lzdGVtLmMsIGJ1aWxkcy9tYWMvZnRtYWMuYywKLQlidWlsZHMvdW5peC9mdHN5c3RlbS5jLCBidWlsZHMvdm1zL2Z0c3lzdGVtLmM6IERvIGl0LgotCi0yMDEzLTA1LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCBgaW50ZXJwcmV0ZXItdmVyc2lvbicgcHJvcGVydHkuCi0KLQlUaGlzIG1ha2VzIHRoZSBvcHRpb24gVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HIGNvbnRyb2xsYWJsZQotCWF0IHJ1bnRpbWUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnR0dGRydi5oOiBOZXcgZmlsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfVFJVRVRZUEVfRFJJVkVSX0gpOiBOZXcKLQltYWNyby4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmM6IEluY2x1ZGUgRlRfVFJVRVRZUEVfRFJJVkVSX0guCi0JKHR0X3Byb3BlcnR5X3NldCwgdHRfcHJvcGVydHlfZ2V0KTogRmlsbCB0ZW1wbGF0ZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuaCAoVFRfRHJpdmVyUmVjKTogQWRkIGBpbnRlcnByZXRlcl92ZXJzaW9uJwotCW1lbWJlci4KLQlSZW1vdmUgdW51c2VkIGBleHRlbnNpb25fY29tcG9uZW50JyBtZW1iZXIuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmM6IEluY2x1ZGUgRlRfVFJVRVRZUEVfRFJJVkVSX0guCi0JKHR0X2dldF9tZXRyaWNzLCBUVF9IaW50X0dseXBoLCBUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwKLQljb21wdXRlX2dseXBoX21ldHJpY3MsIHR0X2xvYWRlcl9pbml0KTogVXNlIGBpbnRlcnByZXRlcl92ZXJzaW9uJy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmM6IEluY2x1ZGUgRlRfVFJVRVRZUEVfRFJJVkVSX0guCi0JKFNVQlBJWEVMX0hJTlRJTkcpOiBOZXcgbWFjcm8gdG8gY2hlY2sgYGludGVycHJldGVyX3ZlcnNpb24nIGZsYWcuCi0JVXBkYXRlIGFsbCBhZmZlY3RlZCBmdW5jdGlvbnMgdG8gdXNlIGl0LgotCVVzZSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OX1hYWCB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jOiBJbmNsdWRlIEZUX1RSVUVUWVBFX0RSSVZFUl9ILgotCSh0dF9kcml2ZXJfaW5pdCk6IEluaXRpYWxpemUgYGludGVycHJldGVyX3ZlcnNpb24nLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYzogSW5jbHVkZSBGVF9UUlVFVFlQRV9EUklWRVJfSC4KLQlVc2UgVFRfSU5URVJQUkVURVJfVkVSU0lPTl9YWFggd2hlcmUgYXBwcm9wcmlhdGUuCi0KLTIwMTMtMDUtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQXZvaWQgZW1wdHkgc291cmNlIGZpbGUuCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5jIFshVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HXToKLQlQcm92aWRlIGR1bW15IHR5cGVkZWYuCi0KLTIwMTMtMDUtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NmZi9jZjJmb250LmMgKGNmMl9nZXRHbHlwaFdpZHRoKTogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUuCi0KLQlGaXggc3VnZ2VzdGVkIGJ5IFZhaWJoYXYgTmFnYXJuYWlrIDx2bmFnYXJuYWlrQGdtYWlsLmNvbT4uCi0KLTIwMTMtMDUtMTMgIEJyaWFuIE5peG9uICA8Ym5peG9uQHlhaG9vLmNvbT4KLQotCUZpeCBTYXZhbm5haCBidWcgIzM4OTcwLgotCi0JKiBzcmMvYmFzZS9mdGRlYnVnLmMsIGJ1aWxkcy93aW4zMi9mdGRlYnVnLmMsCi0JYnVpbGRzL3dpbmNlL2Z0ZGVidWcuYywgYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0ZGVidWcuYwotCShmdF9kZWJ1Z19pbml0KTogRG9uJ3QgcmVhZCBwYXN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBGVDJfREVCVUcuCi0KLTIwMTMtMDUtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQWRkIGZyYW1ld29yayBmb3IgVHJ1ZVR5cGUgcHJvcGVydGllcy4KLQotCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0guCi0JKHR0X3Byb3BlcnR5X3NldCwgdHRfcHJvcGVydHlfZ2V0KTogTmV3IGZ1bmN0aW9ucywgc3RpbGwgZW1wdHkuCi0JRGVmaW5lIGB0dF9zZXJ2aWNlX3Byb3BlcnRpZXMnIHNlcnZpY2UuCi0JVXBkYXRlIGB0dF9zZXJ2aWNlcycuCi0KLQkqIHNyYy90cnVldHlwZS90dHBpYy5oOiBJbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ILgotCShUVF9TRVJWSUNFX1BST1BFUlRJRVNfR0VUKTogTmV3IG1hY3JvLgotCShUVE1vZHVsZVBJQyk6IEFkZCBgdHRfc2VydmljZV9wcm9wZXJ0aWVzJy4KLQotMjAxMy0wNS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzg5NjcuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9EaXZGaXgpIFtGVF9MT05HNjRdOiBGaXggY2FzdC4KLQotMjAxMy0wNS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSW50cm9kdWNlIHVuc2lnbmVkIDY0Yml0IHR5cGUgKGlmIGF2YWlsYWJsZSkuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IERlZmluZSBGVF9VSU5UNjQgaWYgYXZhaWxhYmxlLgotCVtGVF9MT05HNjRdOiBQcm92aWRlIEZUX1VJbnQ2NC4KLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW46IFN5bmNocm9uaXplZC4KLQotMjAxMy0wNS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjMzg5NjguCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtb2RhcGkuaDogQWRkIGBGVF9FWFBPUlQnIHRvCi0JRlRfUHJvcGVydHlfe1NldCxHZXR9LgotCSogc3JjL2Jhc2UvZnRvYmpzLmM6IEFkZCBgRlRfRVhQT1JUX0RFRicgdG8KLQlGVF9Qcm9wZXJ0eV97U2V0LEdldH0uCi0KLTIwMTMtMDUtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBDbGVhbiB1cCBiaXRtYXAgY29kZS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmM6IERlbGV0ZWQuCi0JKiBzcmMvc2ZudC90dHNiaXQwLmM6IFJlbmFtZWQgdG8gYHR0c2JpdC5jJy4KLQkqIHJ1bGVzLm1rIChTRk5UX0RSVl9IKTogVXBkYXRlZC4KLQotMjAxMy0wNS0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKi8qIFtGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFNdOiBSZW1vdmUgbWFjcm8gYW5kIGd1YXJkZWQgY29kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAxMy0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi1hbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi1MSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLWZ1bGx5LgotCi0KLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLWNvZGluZzogdXRmLTgKLUVuZDoKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yNiBiL0NoYW5nZUxvZy4yNgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3NGI2ZC4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cuMjYKKysrIC9kZXYvbnVsbApAQCAtMSw1NzExICswLDAgQEAKLTIwMTYtMDctMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogVmVyc2lvbiAyLjYuNSByZWxlYXNlZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTYtNScuCi0KLQlUaGlzIGNvbW1pdCBpbW1lZGlhdGVseSBmb2xsb3dzIGBbbWFjXSBGaXggZnRleHBvcnQuc3ltIHRhcmdldCBpbgotCUphbWZpbGUuJyBvbiBhIHNlcGFyYXRlIGJyYW5jaCwgd2hpY2ggd2FzIHRoZW4gbWVyZ2VkIHdpdGggbWFzdGVyCi0JYWZ0ZXIgdGhlIHJlbGVhc2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HKTogQ29tbWVudCBvdXQuCi0KLQkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjYuNS4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNi40LzIuNi41Lywgcy8yNjQvMjY1Ly4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byA1LgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTg6NToxMi4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDUuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNi0wNy0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JQ29uZGl0aW9uYWxseSBjb21waWxlIGVudmlyb25tZW50IHN1cHBvcnQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgsIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMsCi0Jc3JjL2Jhc2UvZnRvYmpzLmMsIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmM6Ci0JRGVjb3JhdGUgd2l0aCBgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTJyB3aGVyZQotCW5lY2Vzc2FyeS4KLQotMjAxNi0wNy0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSGFuZGxlIHByb3BlcnRpZXMgaW4gYEZSRUVUWVBFX1BST1BFUlRJRVMnIGVudmlyb25tZW50IHZhcmlhYmxlLgotCi0JVGhpcyBjb21taXQgY292ZXJzIHRoZSBtb3N0IGltcG9ydGFudCBvbmUuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKGFmX3Byb3BlcnR5X3NldCk6IEhhbmRsZSBgd2FycGluZycsCi0JYGRhcmtlbmluZy1wYXJhbWV0ZXJzJywgYW5kIGBuby1zdGVtLWRhcmtlbmluZycuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3Byb3BlcnR5X3NldCk6IEhhbmRsZQotCWBkYXJrZW5pbmctcGFyYW1ldGVycycsIGBoaW50aW5nLWVuZ2luZScsIGFuZCBgbm8tc3RlbS1kYXJrZW5pbmcnLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfcHJvcGVydHlfc2V0KTogSGFuZGxlCi0JYGludGVycHJldGVyLXZlcnNpb24nLgotCi0yMDE2LTA3LTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZXBsYWNlIGNhbGxzIHRvIGBhdG9sJyB3aXRoIGBzdHJ0b2wnLgotCi0JV2UgbGF0ZXIgb24gbmVlZCBzdHJ0b2wncyBgZW5kcHRyJyBmZWF0dXJlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oIChmdF9hdG9sKTogUmVwbGFjZSB3aXRoLi4uCi0JKGZ0X3N0cnRvbCk6IC4uLiB0aGlzLgotCi0JKiBzcmMvYmFzZS9mdGRiZ21lbS5jIChmdF9tZW1fZGVidWdfaW5pdCk6IFVwZGF0ZWQuCi0JKiBzcmMvY2lkL2NpZHBhcnNlLmMgKGNpZF9wYXJzZXJfbmV3KTogRGl0dG8uCi0JKiBzcmMvdHlwZTQyL3Q0MmRyaXZyLmMgKHQ0Ml9nZXRfbmFtZV9pbmRleCksIHNyYy90eXBlNDIvdDQyb2Jqcy5jCi0JKFQ0Ml9HbHlwaFNsb3RfTG9hZCk6IERpdHRvLgotCi0yMDE2LTA3LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlJbXBsZW1lbnQgaGFuZGxpbmcgb2YgYEZSRUVUWVBFX1BST1BFUlRJRVMnIGVudmlyb25tZW50IHZhcmlhYmxlLgotCi0JUmVjb2duaXppbmcgcHJvcGVydGllcyBmb2xsb3dzIGluIGFub3RoZXIgY29tbWl0LgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyk6IE5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCAoZnRfZ2V0ZW52KTogTmV3IG1hY3JvLgotCi0JKiBzcmMvYmFzZS9mdGluaXQuYyAoZnRfc2V0X2RlZmF1bHRfcHJvcGVydGllcyk6IE5ldyBmdW5jdGlvbiB0bwotCXBhcnNlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBhbmQgY2FsbGluZyBgZnRfcHJvcGVydHlfc3RyaW5nX3NldCcuCi0JKEZUX0luaXRfRnJlZVR5cGUpOiBVcGRhdGVkLgotCi0yMDE2LTA3LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgZnVuY3Rpb24gYGZ0X3Byb3BlcnR5X3N0cmluZ19zZXQnLgotCi0JVGhpcyBpcyBhIHByZXBhcmF0aW9uIGZvciBoYW5kbGluZyBhbiBgRlJFRVRZUEVfUFJPUEVSVElFUycKLQllbnZpcm9ubWVudCB2YXJpYWJsZSB0byBjb250cm9sIChzb21lKSBkcml2ZXIgcHJvcGVydGllcy4KLQotCU5vIGNoYW5nZSBpbiBmdW5jdGlvbmFsaXR5LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfcHJvcGVydHlfZG8pOiBBZGQgYHZhbHVlX2lzX3N0cmluZycKLQlwYXJhbWV0ZXIuCi0JKGZ0X3Byb3BlcnR5X3N0cmluZ19zZXQpOiBOZXcgZnVuY3Rpb24uCi0JKEZUX1Byb3BlcnR5X1NldCwgRlRfUHJvcGVydHlfR2V0KTogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaDogVXBkYXRlZC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaAotCShGVF9Qcm9wZXJ0aWVzX1NldEZ1bmMpOiBBZGQgYHZhbHVlX2lzX3N0cmluZycgcGFyYW1ldGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIChhZl9wcm9wZXJ0eV9zZXQpLCBzcmMvY2ZmL2NmZmRyaXZyLmMKLQkoY2ZmX3Byb3BlcnR5X3NldCksIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9wcm9wZXJ0eV9zZXQpOgotCVVwZGF0ZWQsIGVtaXR0aW5nIGFuIGVycm9yIGN1cnJlbnRseSBpZiBgdmFsdWVfaXNfc3RyaW5nJyBpcyBzZXQuCi0KLTIwMTYtMDctMDkgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbbWFjXSBGaXggZnRleHBvcnQuc3ltIHRhcmdldCBpbiBKYW1maWxlLgotCi0JKiBKYW1maWxlOiBVcGRhdGUgdGhlIGRpcmVjdG9yaWVzIG9mIHRoZSBoZWFkZXIgZmlsZXMgc2Nhbm5lZCBmb3IKLQlmdGV4cG9ydC5zeW0uICBUaGV5IHdlcmUgaW5jb3JyZWN0IHNpbmNlIHRoZSBtaWdyYXRpb24gb2YgdGhlCi0JaGVhZGVyIGZpbGVzLCBvbiAyMDE1LTA2LTIyLiAgRWl0aGVyIGluZXhpc3RpbmcgaW5jbHVkZS9jYWNoZQotCShyZW1vdmVkIG9uIDIwMDYtMDMtMjApIGlzIG5vdCBuZWVkZWQgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHkuCi0JTm93IGZ0bWFjLmggaXMgc2Nhbm5lZCBvbmx5IGluIHRoZSBjYXNlIG9mIE1hYyBPUyAmIE1hYyBPUyBYLgotCi0yMDE2LTA3LTA4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBTdWItYmFuZGluZyBwcm90b2NvbCByZXZpc2lvbi4KLQotCVJhc3Rlcml6YXRpb24gc3ViLWJhbmRpbmcgaXMgdXRpbGl6ZWQgYXQgbGFyZ2Ugc2l6ZXMgd2hpbGUgdXNpbmcgYQotCXJhdGhlciBzbWFsbCBmaXhlZCBtZW1vcnkgcG9vbC4gIEluZGVlZCBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIGFuCi0JZWR1Y2F0ZWQgZ3Vlc3MgaG93IG11Y2ggbWVtb3J5IGlzIG5lY2Vzc2FyeSBhdCBhIGdpdmVuIHNpemUgZm9yIGEKLQlnaXZlbiBnbHlwaC4gIEl0IHR1cm5zIG91dCB0aGF0LCBmb3IgYSBsYXJnZSBtYWpvcml0eSBvZiBFdXJvcGVhbgotCWdseXBocywgeW91IHNob3VsZCBzdG9yZSBhYm91dCA4IHRpbWVzIG1vcmUgYm91bmRhcnkgcGl4ZWxzIHRoYW4KLQl0aGVpciBoZWlnaHQuICBPciwgdmljZSB2ZXJzYSwgaWYgeW91ciBtZW1vcnkgcG9vbCBjYW4gaG9sZCA4MDAKLQlwaXhlbHMgdGhlIGJhbmQgaGVpZ2h0IHNob3VsZCBiZSAxMDAgYW5kIHlvdSBzaG91bGQgc3ViLWJhbmQKLQlhbnl0aGluZyBsYXJnZXIgdGhhbiB0aGF0LiAgU2hvdWxkIHlvdSBzdGlsbCBydW4gb3V0IG9mIG1lbW9yeSwKLQlGcmVlVHlwZSBiaXNlY3RzIHRoZSBiYW5kIGJ1dCB5b3UgaGF2ZSB3YXN0ZWQgc29tZSB0aW1lLiAgVGhpcyBpcwotCXdoYXQgaGFzIGJlZW4gaW1wbGVtZW50ZWQgaW4gRnJlZVR5cGUgc2luY2UgdGhlIGJlZ2lubmluZy4KLQotCUl0IHdhcyBvdmVybG9va2VkLCBob3dldmVyLCB0aGF0IHRoZSB0b3AgYmFuZCBjb3VsZCBncm93IHRvIHR3aWNlCi0JdGhlIGRlZmF1bHQgYmFuZCBzaXplIGxlYWRpbmcgdG8gdW5uZWNlc3NhcnkgbWVtb3J5IG92ZXJmbG93cyB0aGVyZS4KLQlUaGlzIGNvbW1pdCBmaXhlcyB0aGF0LiAgTm93IHRoZSBiYW5kcyBhcmUgZGlzdHJpYnV0ZWQgbW9yZSBldmVubHkKLQlhbmQgY2Fubm90IGV4Y2VlZCB0aGUgZGVmYXVsdCBzaXplLgotCi0JTm93IHRoZSBtYWdpYyBudW1iZXIgOCBpcyByZWFsbHkgc3VpdGFibGUgZm9yIHJhdGhlciBzaW1wbGUgRXVyb3BlYW4KLQlzY3JpcHRzLiAgRm9yIGNvbXBsZXggQ2hpbmVzZSBsb2dvZ3JhbXMgdGhlIG1hZ2ljIG51bWJlciBzaG91bGQgYmUKLQkxMyBidXQgdGhhdCBpcyBzdWJqZWN0IGZvciBhbm90aGVyIGRheS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfY29udmVydF9nbHlwaCk6IFJldmlzZSBzdWItYmFuZGluZwotCXByb3RvY29sLgotCi0yMDE2LTA3LTA3ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotCi0JW21hY10gRml4IFNhdmFubmFoIGJ1ZyAjNDg0MTcuCi0KLQlNYWMgT1MgWCBsaW5rZXIgdGhyb3dzIGVycm9ycyB3aGVuIGAtZXhwb3J0ZWRfc3ltYm9sX2xpc3QnIGlucHV0Ci0JZmlsZSBpbmNsdWRlcyBub24tZXhpc3Rpbmcgc3ltYm9scy4gIFJlcG9ydGVkIGJ5IFJ5YW4gU2NobWlkdC4KLQotCSogYnVpbGRzL2V4cG9ydHMubWs6IEV4Y2x1ZGUgZnRtYWMuaCBmcm9tIHRoZSBoZWFkZXJzIGZvciBhcGluYW1lcwotCWJ5IGRlZmF1bHQuICBJbmNsdWRlIGl0IHdoZW4gZnRtYWMuYyB3b3VsZCBiZSBjb21waWxlZC4KLQotMjAxNi0wNy0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVEluc3RydWN0aW9uX0Z1bmN0aW9uKTogUmVtb3ZlZCwgdW51c2VkLgotCi0yMDE2LTA3LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi42LjQgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQlUYWcgc291cmNlcyB3aXRoIGBWRVItMi02LTQnLgotCi0JKiBkb2NzL1ZFUlNJT04uVFhUOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNi40LgotCi0JKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIGJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi42LjMvMi42LjQvLCBzLzI2My8yNjQvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDQuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAxODo0OjEyLgotCSogQ01ha2VMaXN0cy50eHQgKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gNC4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDE2LTA3LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wZnIvcGZyc2JpdC5jIChwZnJfbG9va3VwX2JpdG1hcF9kYXRhKTogRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLTIwMTYtMDctMDQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIFZhcmlhYmxlIHR5cGUgcmV2aXNpb24gKHBhcnQgMikuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChUQXJlYSk6IFJlc3RvcmUgb3JpZ2luYWwgZGVmaW5pdGlvbiBhcyBgaW50Jy4KLQkoZ3JheV9yZW5kZXJfbGluZSkgW0ZUX0xPTkc2NF06IFVwZGF0ZWQuCi0JKGdyYXlfY29udmVydF9nbHlwaCk6IDMyLWJpdCBiYW5kIGJpc2VjdGlvbiBzdGFjayBzaG91bGQgYmUgMzIgYmFuZHMuCi0JKGdyYXlfY29udmVydF9nbHlwaF9pbm5lcik6IFRyYWNlIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMuCi0KLTIwMTYtMDctMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBIYW5kbGUgc2luZ2xlLXBvaW50IGNvbnRvdXJzIGFzIHNlZ21lbnRzLgotCi0JRG9pbmcgc28gYWxsb3dzIHVzIHRvIGxpbmsgdGhlbSB0byBlZGdlcyDigJMgc29tZSBmb250cyBsaWtlCi0JYE5vdG9TYW5zR3VybXVraGktUmVndWxhcicgaGF2ZSBzdWNoIGlzb2xhdGVkIHBvaW50cyBzaXR0aW5nIGV4YWN0bHkKLQlvbiBvdGhlciBvdXRsaW5lcy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzKTogRG9uJ3QKLQlpZ25vcmUgb25lLXBvaW50IGNvbnRvdXJzIGJ1dCBoYW5kbGUgdGhlbSBzcGVjaWFsbHkgYXMgb25lLXBvaW50Ci0Jc2VnbWVudHMuCi0JKGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfZWRnZXMpOiBBcHBlbmQgb25lLXBvaW50IHNlZ21lbnRzIHRvIGVkZ2VzCi0JaWYgcG9zc2libGUuCi0KLTIwMTYtMDctMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBSZW1vdmUgdW51c2VkIHN0cnVjdHVyZSBtZW1iZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmggKEFGX1NlZ21lbnRSZWMsIEFGX0VkZ2VSZWMpOiBSZW1vdmUKLQlgbnVtX2xpbmtlZCcuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19oaW50c19saW5rX3NlZ21lbnRzKTogVXBkYXRlZC4KLQotMjAxNi0wNy0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFVwZGF0ZSB0byBVbmljb2RlIDkuMC4wLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jIChhZl9hcmFiX25vbmJhc2VfdW5pcmFuZ2VzLAotCWFmX2N5cmxfdW5pcmFuZ2VzKTogQWRkIG5ldyBkYXRhLgotCi0yMDE2LTA3LTAxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBWYXJpYWJsZSB0eXBlIHJldmlzaW9uIChwYXJ0IDEpLgotCi0JVGhpcyBwYXRjaCByZXN0b3JlcyBvcmlnaW5hbCBgVENvb3JkJyBkZWZpbml0aW9uIGFzIGBpbnQnIHNvIHRoYXQgdGhlCi0JcmVuZGVyaW5nIHBvb2wgaXMgdXNlZCBtb3JlIGVmZmljaWVudGx5IG9uIExQNjQgcGxhdGZvcm1zICh1bml4KS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfVFdvcmtlciwgVENlbGwsIGdyYXlfVEJhbmQpOiBTd2l0Y2ggc29tZQotCWZpZWxkcyB0byBgVENvb3JkJy4KLQkoZ3JheV9maW5kX2NlbGwsIGdyYXlfcmVuZGVyX3NjYW5saW5lLCBncmF5X3JlbmRlcl9saW5lLCBncmF5X2hsaW5lLAotCWdyYXlfc3dlZXAsIGdyYXlfY29udmVydF9nbHlwaCk6IFVwZGF0ZWQuCi0KLTIwMTYtMDYtMjggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIE1pbm9yIGNsZWFuLXVwcy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfVFdvcmtlcik6IFJlbW92ZSByZWR1bmRhbnQgYHljb3VudCcuCi0JKGdyYXlfc3dlZXAsIGdyYXlfY29udmVydF9nbHlwaCwgZ3JheV9kdW1wX2NlbGxzKTogVXBkYXRlZC4KLQotMjAxNi0wNi0yNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gTWlub3IgY2xlYW4tdXBzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9jb252ZXJ0X2dseXBoKTogRG8gbm90IHVzZSB2b2xhdGlsZQotCXF1YWxpZmllci4KLQkoZ3JheV9yYXN0ZXJfcmVuZGVyKTogTW92ZSBzcGFuIGluaXRpYWxpemF0aW9ucyBmcm9tIGhlcmUuCi0JKGdyYXlfc3dlZXApOiAuLi4gdG8gaGVyZSBhbmQgcmVtb3ZlIHVudXNlZCBgdGFyZ2V0JyBhcmd1bWVudC4KLQotMjAxNi0wNi0yNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3BjZl0gRml4IGhhbmRsaW5nIG9mIHZlcnkgbGFyZ2UgZm9udHMgKCM0NzcwOCkuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X2VuY29kaW5ncyk6IE1ha2UgYGVuY29kaW5nT2Zmc2V0JyBhbgotCXVuc2lnbmVkIHNob3J0LgotCU9ubHkgcmVqZWN0IGAweEZGRkYnIGFzIGFuIGludmFsaWQgZW5jb2Rpbmcgb2Zmc2V0LgotCi0yMDE2LTA2LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFJlYWxseSBmaXggZGVhbGxvY2F0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKCM0NzcyNikuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBUaGlua287IGluaXRpYWxpemUKLQlgb3V0bGluZS5wb2ludHMnIGFsc28uCi0KLTIwMTYtMDYtMjMgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIENvbnNvbGlkYXRlIG1lbW9yeSBtYW5hZ2VtZW50LgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9pbml0X2NlbGxzKTogUmVtb3ZlIGZ1bmN0aW9uLgotCShncmF5X1RXb3JrZXIpOiBSZW1vdmUgZmllbGRzIHRoYXQgYmVjb21lIGxvY2FsIHZhcmlhYmxlcy4KLQkoZ3JheV9yYXN0ZXJfcmVuZGVyKTogTW92ZSByZW5kZXJpbmcgYnVmZmVyIGRlY2xhcmF0aW9uIGZyb20gaGVyZS4KLQkoZ3JheV9jb252ZXJ0X2dseXBoKTogLi4uIHRvIGhlcmUgYW5kIHVwZGF0ZSBhY2NvcmRpbmdseS4KLQotMjAxNi0wNi0yMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gQ29uc29saWRhdGUgYm91bmRhcnkgY2hlY2tzLgotCi0JUmVtb3ZpbmcgdGhlIGNoZWNrcyBmcm9tIGBncmF5X2hsaW5lJyBzaGF2ZXMgMSUgb2ZmIHJlbmRlcmluZyBzcGVlZC4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgW1NUQU5EQUxPTkVfXTogRHVwbGljYXRlIGBGVF9NSU4nIGFuZCBgRlRfTUFYJy4KLQkoZ3JheV9UV29ya2VyKTogTm8gbmVlZCB0byBzdG9yZSBgY2xpcF9ib3gnLgotCShncmF5X2hsaW5lKTogUmVtb3ZlIHVubmVjZXNzYXJ5IGJvdW5kYXJ5IGNoZWNrcy4KLQkoZ3JheV9jb252ZXJ0X2dseXBoKTogTW92ZSBib3VuZGFyeSBjaGVja3MgZnJvbSBoZXJlLgotCShncmF5X3Jhc3Rlcl9yZW5kZXIpOiAuLi4gdG8gaGVyZSBhbmQgY29uc29saWRhdGUuCi0KLTIwMTYtMDYtMjEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIFVzZSBgRlRfT3V0bGluZV9HZXRfQ0JveCcuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIFtTVEFOREFMT05FX106IER1cGxpY2F0ZSBgRlRfT3V0bGluZV9HZXRfQ0JveCcuCi0JKGdyYXlfY29tcHV0ZV9jYm94KTogUmVtb3ZlIHRoaXMgZnVuY3Rpb24uCi0JKGdyYXlfY29udmVydF9nbHlwaCk6IFVwZGF0ZSB0byB1c2UgYEZUX091dGxpbmVfR2V0X0NCb3gnLgotCi0yMDE2LTA2LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc21vb3RoXSBSZW1vdmUgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2NvbnZlcnRfZ2x5cGgpOiBGaXggcmVwb3J0cyBmcm9tIGNsYW5nLgotCi0yMDE2LTA2LTIwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBTYW5pdGl6ZSBtZW1vcnkgbWFuYWdlbWVudC4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfY29udmVydF9nbHlwaCk6IENsZWFuZWQgdXAuCi0KLTIwMTYtMDYtMTggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIFJlbW92ZSBgYmFuZF9zaG9vdCcgdGhhdCBuZXZlciB3b3JrZWQuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X1RXb3JrZXIpOiBSZW1vdmUgYGJhbmRfc2hvb3QnLgotCShncmF5X2NvbnZlcnRfZ2x5cGgpOiBVcGRhdGVkLgotCi0yMDE2LTA2LTE3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbcmFzdGVyLCBzbW9vdGhdIEhhbmRsZSBGVF9SRU5ERVJfUE9PTF9TSVpFIGJldHRlci4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChGVF9NQVhfQkxBQ0tfUE9PTCk6IE5ldyBtYWNyby4KLQkoZnRfYmxhY2tfcmVuZGVyKTogVXBkYXRlZC4KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChGVF9NQVhfR1JBWV9QT09MKTogTmV3IG1hY3JvLgotCShncmF5X3Jhc3Rlcl9yZW5kZXIpOiBVcGRhdGVkLgotCi0yMDE2LTA2LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL21kNS5jOiBVcGRhdGVkIHRvIHJlY2VudCB2ZXJzaW9uLgotCi0yMDE2LTA2LTE0ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2hsaW5lKTogT3B0aW1pemUgaWYtY29uZGl0aW9uLgotCi0yMDE2LTA2LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIENoZXJva2VlIHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBDaGVyb2tlZS4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIENoZXJva2VlIHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmM6IEFkZCBDaGVyb2tlZSBkYXRhLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgQ2hlcm9rZWUgZGF0YS4KLQotMjAxNi0wNi0wOSAgRGF2aWQgQ2FwZWxsbyAgPGRhdmlkY2FwZWxsb0BnbWFpbC5jb20+Ci0KLQlbY21ha2VdIEF2b2lkIG1vZGlmeWluZyBgZnRjb25maWcuaCcgYW5kIGBmdG9wdGlvbi5oJyBmaWxlcy4KLQotCSogQ01ha2VMaXN0cy50eHQ6IEVhY2ggdGltZSBjbWFrZSBpcyBydW4gdGhvc2UgZmlsZXMgYXJlCi0JbW9kaWZpZWQgYW5kIHRoZSB3aG9sZSBGcmVlVHlwZSBsaWJyYXJ5IGlzIHJlY29tcGlsZWQuICBXaXRoIHRoaXMKLQljaGFuZ2Ugd2UgY2hhbmdlIHRoZSBmaWxlcyBvbmx5IGlmIHRoZXJlIGFyZSByZWFsIG1vZGlmaWNhdGlvbnMsIHNvCi0Jd2UgY2FuIGF2b2lkIHJlY29tcGlsYXRpb25zLgotCi0yMDE2LTA2LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBDaGVjayBudW1iZXIgb2YgcHJvcGVydGllcyAoIzQ4MTY2KS4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9zdGFydCk6IEltcGxlbWVudC4KLQotMjAxNi0wNi0wOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gUmUtZW5hYmxlIG5ldyBsaW5lIHJlbmRlcmVyIG9uIDY0LWJpdCBhcmNocy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmVuZGVyX2xpbmUpOiBDb25kaXRpb25hbGx5IHJlLWVuYWJsZSBuZXcKLQlpbXBsZW1lbnRhdGlvbiwgd2hlcmUgaXQgaXMgc2FmZSBmcm9tIG92ZXJmbG93cy4KLQotMjAxNi0wNi0wOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gTWlub3IgY2xlYW4tdXBzLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9kdW1wX2NlbGxzKTogTW92ZSBvdXQgb2YgdGhlIHdheS4KLQkoZ3JheV9yZW5kZXJfc3Bhbik6IFJlbW92ZSBzcHVyaW91cyBjYXN0cyBhbmQgc3RyZWFtbGluZS4KLQotMjAxNi0wNi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBFdGhpb3BpYyBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgRXRoaW9waWMuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBFdGhpb3BpYyBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBBZGQgRXRoaW9waWMgZGF0YS4KLQotCSogc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIEV0aGlvcGljIGRhdGEuCi0KLTIwMTYtMDYtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggY29tcGlsYXRpb24gd2l0aCBWUzIwMTYgKCM0ODEyNikuCi0KLQlUaGlzIGNvbXBpbGVyIGRvZXNuJ3QgcmVjb2duaXplIHRoZSBlbmQtb2YtY29tbWVudCBzZXF1ZW5jZSBgKi8nIGlmCi0JaXQgaW1tZWRpYXRlbHkgZm9sbG93cyBub24tQVNDSUkgY2hhcmFjdGVycy4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogRW5zdXJlIHdoaXRlc3BhY2UgYmVmb3JlIGAqLycuCi0KLTIwMTYtMDYtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBhIHRlc3QgZm9yIG5hbWVkIGluc3RhbmNlcyAoIzQ4MTIyKS4KLQotCVRoaXMgd2FzIG1pc3NlZCB3aGlsZSBnaXZpbmcgbmVnYXRpdmUgZmFjZSBpbmRpY2VzIGFuIGV4dGVuZGVkCi0JbWVhbmluZy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX3NmbnRfUmVzb3VyY2UpOiBJbXBsZW1lbnQuCi0KLTIwMTYtMDUtMzEgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCVt0cnVldHlwZV0gTGV0IFNIUElYIG1vdmUgcG9pbnRzIGluIHRoZSB0d2lsaWdodCB6b25lIGluIHY0MC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TSFBJWCk6IEFsbG93IFNIUElYIHRvIG1vdmUgcG9pbnRzIGluCi0JdGhlIHR3aWxpZ2h0IHpvbmUuICBPdGhlcndpc2UsIHRyZWF0IFNIUElYIHRoZSBzYW1lIGFzIERFTFRBUC4KLQlVbmJyZWFrcyB2YXJpb3VzIGZvbnRzIHN1Y2ggYXMgb2xkZXIgdmVyc2lvbnMgb2YgUm9ra2l0dCBhbmQgRFRMCi0JQXJnbyBUIExpZ2h0IHRoYXQgd291bGQgZ2xpdGNoIHNldmVyZWx5IGFmdGVyIGNhbGxpbmcgQUxJR05SUCBhZnRlciBhCi0JYmxvY2tlZCBTSFBJWC4KLQotMjAxNi0wNS0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGU0Ml0gU3VwcG9ydCBgQ2hhclN0cmluZ3MnIGVudHJ5IGZvcm1hdCBhcyBjcmVhdGVkIGJ5IExpbHlQb25kLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9jaGFyc3RyaW5ncyk6IEhhbmRsZSBlbnRyaWVzCi0JaGF2aW5nIHRoZSBmb3JtYXQKLQotCSAgKGZvbykgY3ZuIDEyMzQ1IGRlZgotCi0yMDE2LTA1LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmM6IFJlbW92ZSBgVUwnIHBvc3RmaXggZnJvbSBoZXggbnVtYmVycy4KLQotCVN1Z2dlc3RlZCBieSBBbGV4ZWkuICBgVUwnIGlzIG9ubHkgbmVlZGVkIGZvciAxNmJpdCBjb21waWxlcnMsIGJ1dAotCWl0IHNlZW1zIG5vb25lIGlzIHVzaW5nIHRoaXMgYW55bW9yZSAoYW5kIHdlIG5vIGxvbmdlciB0ZXN0IHdoZXRoZXIKLQlGcmVlVHlwZSBjb21waWxlcyBpbiBzdWNoIGFuIGVudmlyb25tZW50KS4gIE90aGVyd2lzZSwgaXQgaXMgZWFzeSB0bwotCWFkZCB0aGUgcG9zdGZpeCB0byB0aGUgYEFGX1VOSUNPREVfUkFOR0UnIG1hY3JvLgotCi0yMDE2LTA1LTI2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBTaHJpbmsgYmlzZWN0aW9uIHN0YWNrLgotCi0JVGhlIGNvbnZlcmdlbmNlIG9mIELDqXppZXIgZmxhdHRlbmVycyBpcyBmYXN0IHdpdGggdGhlIGRldmlhdGlvbgotCWZyb20gc3RyYWlnaHQgbGluZSBiZWluZyBhc3ltcHRvdGljYWxseSBjdXQgNC1mb2xkIG9uIGVhY2ggYmlzZWN0aW9uLgotCVRoaXMganVzdGlmaWVzIHNtYWxsZXIgYmlzZWN0aW9uIHN0YWNrIHNpemUuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X1RXb3JrZXIpOiBSZW1vdmUgY29tbW9uIGBiZXpfc3RhY2snLgotCShncmF5X3JlbmRlcl9jb25pYyk6IENyZWF0ZSBhbmQgdXNlIGNvbmljIGBiZXpfc3RhY2snLiBNb3ZlIGJhY2sgdGhlCi0JYmFuZCBhbmFseXNpcyBmcm9tLi4uCi0JKGdyYXlfY29uaWNfdG8pOiAuLi4gaGVyZS4KLQkoZ3JheV9yZW5kZXJfY3ViaWMpOiBDcmVhdGUgYW5kIHVzZSBjdWJpYyBgYmV6X3N0YWNrJy4gTW92ZSBiYWNrIHRoZQotCWJhbmQgYW5hbHlzaXMgZnJvbS4uLgotCShncmF5X2N1YmljX3RvKTogLi4uIGhlcmUuCi0JKGdyYXlfbW92ZV90byk6IFVwZGF0ZWQuCi0KLTIwMTYtMDUtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXhlcyBmb3IgQXJtZW5pYW4gYW5kIEd1amFyYXRpIHJhbmdlcy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYyAoYWZfYXJtbl91bmlyYW5nZXMpOiBDb3JyZWN0ZWQuCi0JKGFmX2d1cnVfbm9uYmFzZV91bmlyYW5nZXMpOiBNYWtlIFUrMEEzRSBhIGJhc2UgY2hhcmFjdGVyLgotCi0yMDE2LTA1LTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIEFybWVuaWFuIHNjcmlwdC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBBcm1lbmlhbi4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIEFybWVuaWFuIHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmM6IEFkZCBBcm1lbmlhbiBkYXRhLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgQXJtZW5pYW4gZGF0YS4KLQotMjAxNi0wNS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC91bml4LWNjLmluIChMSU5LX0xJQlJBUlkpOiBVc2UgYC1leHBvcnQtc3ltYm9scycuCi0KLQlUaGlzIHdhcyBjb21tZW50ZWQgYWJvdXQgMTAgeWVhcnMgYWdvIOKAkyBJIHRoaW5rIHRoZSByZWFzb24gdGhlbiB0bwotCWRpc2FibGUgbGlidG9vbCdzIGAtZXhwb3J0LXN5bWJvbHMnIG9wdGlvbiB3YXMgdG8gZ2l2ZSBzb21lIGJhZGx5Ci0JcHJvZ3JhbW1lZCBhcHBsaWNhdGlvbnMgYWNjZXNzIHRvIGludGVybmFsIEZyZWVUeXBlIGZ1bmN0aW9ucy4KLQotCUkgYmVsaWV2ZSB0aGF0IHdlIHNob3VsZCBubyBsb25nZXIgdGFrZSBjYXJlIG9mIHN1Y2ggcHJvZ3JhbXM7IHRoZQotCW51bWJlciBvZiBzeW1ib2xzIGV4cG9ydGVkIHNob3VsZCBiZSByYXRoZXIgcmVzdHJpY3RlZCBhcyBtdWNoIGFzCi0JcG9zc2libGUuCi0KLTIwMTYtMDUtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBZGQgYmx1ZS16b25lIHN1cHBvcnQgZm9yIEd1cm11a2hpIHNjcmlwdC4KLQotCVRoaXMgZXNzZW50aWFsbHkgbW92ZXMgdGhlIEd1cm11a2hpIHNjcmlwdCBmcm9tIHRoZSBgSW5kaWMnIGhpbnRlciB0bwotCXRoZSBgTGF0aW4nIGhpbnRlci4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBHdXJtdWtoaS4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIEd1cm11a2hpIHN0YW5kYXJkIGNoYXJhY3RlcnMgYW5kIG1vdmUKLQlkYXRhIG91dCBvZiBBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBNb3ZlIEd1cm11a2hpIGRhdGEgb3V0IG9mCi0JQUZfQ09ORklHX09QVElPTl9JTkRJQyBibG9jay4KLQotCSogc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogVXBkYXRlIEd1cm11a2hpIGRhdGE7IGluIHBhcnRpY3VsYXIsIHVzZQotCUFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLgotCi0yMDE2LTA1LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlNaW5vciBjbGFuZysrIGZpeGVzLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfQWRkX01vZHVsZSksIHNyYy9wc2F1eC9wc29ianMuYwotCShwc19wYXJzZXJfbG9hZF9maWVsZCksIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2Vfc3VicnMpOiBBZGQKLQlpbml0aWFsaXplci4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmggKEZUQ19DQUNIRV9UUllMT09QX0VORCk6IEF2b2lkIGltcGxpY2l0Ci0JY29udmVyc2lvbiBmcm9tIE5VTEwgdG8gYm9vbGVhbi4KLQotMjAxNi0wNS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JV29yayBhcm91bmQgYSBidWcgb2YgdGhlIEMgOC4wLjAuMSBjb21waWxlciBvbiBBSVggNS4zICgjNDc5NTUpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmggKGNwbHVzcGx1c190eXBlb2YpOiBVc2UKLQlicmFjZXMgZm9yIGBleHRlcm4gIkMrKyInLgotCi0yMDE2LTA1LTE3ICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+Ci0KLQlbdHJ1ZXR5cGVdIE1ha2UgVFRfTE9BREVSX1NFVF9QUCBzdXBwb3J0IHN1YnBpeGVsIGhpbnRpbmcgWzMvM10uCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xPQURFUl9TRVRfUFApOiBSZXBsYWNlIG1hY3JvIHdpdGguLi4KLQkodHRfbG9hZGVyX3NldF9wcCk6IC4uLiB0aGlzIG5ldyBmdW5jdGlvbi4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLTIwMTYtMDUtMTcgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCVt0cnVldHlwZV0gTmV3IGltcGxlbWVudGF0aW9uIG9mIHYzOCBieXRlY29kZSBpbnRlcnByZXRlciBbMi8zXS4KLQotCVRoaXMgcGF0Y2ggYWN0dWFsbHkgbW9kaWZpZXMgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyLgotCi0JU2VlIGFkZGVkIGNvbW1lbnRzIGluIGB0dGludGVycC5oJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGFuZAotCXRoZSBmb2xsb3dpbmcgY29tbWl0IGluIHRoZSBzZXJpZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChTVUJQSVhFTF9ISU5USU5HKTogUmVwbGFjZWQgYnkuLi4KLQkoTk9fU1VCUElYRUxfSElOVElORywgU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZLAotCVNVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTCk6IC4uLm5ldyBtYWNyb3MuCi0JKERpcmVjdF9Nb3ZlLCBEaXJlY3RfTW92ZV9YLCBEaXJlY3RfTW92ZV9ZKTogSGFuZGxlIGJhY2t3YXJkCi0JY29tcGF0aWJpbGl0eS4KLQlVcGRhdGVkLgotCShJbnNfUlMsIEluc19GREVGLCBJbnNfRU5ERiwgSW5zX0NBTEwsIEluc19MT09QQ0FMTCwgSW5zX01EKToKLQlVcGRhdGVkLgotCShJbnNfSU5TVENUUkwpOiBIYW5kbGUgbmF0aXZlIENsZWFyVHlwZSBtb2RlIGZsYWcuCi0JVXBkYXRlZC4KLQkoSW5zX0ZMSVBQVCwgSW5zX0ZMSVBSR09OLCBJbnNfRkxJUFJHT0ZGKTogSGFuZGxlIGJhY2t3YXJkCi0JY29tcGF0aWJpbGl0eS4KLQkoTW92ZV9acDJfUG9pbnQpOiBEaXR0by4KLQkoSW5zX1NIUCk6IFVwZGF0ZWQuCi0JKEluc19TSFBJWCk6IEhhbmRsZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCVVwZGF0ZWQuCi0JKEluc19NU0lSUCwgSW5zX01EQVAsIEluc19NSUFQLCBJbnNfTURSUCwgSW5zX01JUlApOiBVcGRhdGVkLgotCShJbnNfQUxJR05SUCk6IFVwZGF0ZWQuCi0JKEluc19JVVAsIEluc19ERUxUQVApOiBIYW5kbGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQlVcGRhdGVkLgotCShJbnNfR0VUSU5GTyk6IEhhbmRsZSB2MzggZmxhZ3MuCi0JVXBkYXRlZC4KLQkoVFRfUnVuSW5zKTogSGFuZGxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4KLQlVcGRhdGVkLgotCi0yMDE2LTA1LTE3ICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+Ci0KLQlbdHJ1ZXR5cGVdIE5ldyBpbXBsZW1lbnRhdGlvbiBvZiB2MzggYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgWzEvM10uCi0KLQlUaGlzIHBhdGNoIHByZXBhcmVzIGRhdGEgc3RydWN0dXJlcyBhbmQgdGhlIGxpa2UuCi0KLQlTZWUgYWRkZWQgY29tbWVudHMgaW4gYHR0aW50ZXJwLmgnIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgYW5kCi0JdGhlIGZvbGxvd2luZyBjb21taXRzIGluIHRoZSBzZXJpZXMuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmgsIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLQkoVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HKTogQXNzaWduIHZhbHVlcyB0byBkaWZmZXJlbnRpYXRlCi0JYmV0d2VlbiBzdWJwaXhlbCB2ZXJzaW9ucy4KLQkoVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFksCi0JVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwpOiBOZXcgbWFjcm9zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHRkcnYuaCAoVFRfSU5URVJQUkVURVJfVkVSU0lPTl80MCk6IE5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCAoVFRfRXhlY0NvbnRleHRSZWMpOiBEZWZpbmUgbmV3IGZpZWxkcwotCWBzdWJwaXhlbF9oaW50aW5nX2xlYW4nLCBgdmVydGljYWxfbGNkX2xlYW4nLAotCWBiYWNrd2FyZF9jb21wYXRpYmlsaXR5JywgYGl1cHhfY2FsbGVkJywgaXVweV9jYWxsZWQnLCBhbmQKLQlgZ3JheXNjYWxlX2NsZWFydHlwZScgZm9yIG5ldyBoaW50aW5nIG1vZGUuCi0KLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9wcm9wZXJ0eV9zZXQpOiBIYW5kbGUgdjM4IGFuZCB2NDAKLQlpbnRlcnByZXRlcnMgY29uZGl0aW9uYWxseS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfSGludF9HbHlwaCk6IFNhdmUgcGhhbnRvbSBwb2ludHMgdW5sZXNzCi0JaW4gdjM4IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4KLQlVcGRhdGVkLgotCShjb21wdXRlX2dseXBoX21ldHJpY3MpOiBBZGQgdjM4IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZQotCWNvbnN0cmFpbnQgZm9yIGFkanVzdGluZyBhZHZhbmNlIHdpZHRocy4KLQlVcGRhdGVkLgotCSh0dF9sb2FkZXJfaW5pdCk6IEhhbmRsZSBuZXcgZmxhZ3MgYHN1YnBpeGVsX2hpbnRpbmdfbGVhbicsCi0JYGdyYXlzY2FsZV9jbGVhcnR5cGUnLCBhbmQgYHZlcnRpY2FsX2xjZF9sZWFuJy4KLQlVcGRhdGVkLgotCSh0dF9nZXRfbWV0cmljcywgVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgsIFRUX0xPQURFUl9TRVRfUFApOgotCVVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZHJpdmVyX2luaXQpOiBDb25kaXRpb25hbGx5IHNldAotCWRlZmF1bHQgaW50ZXJwcmV0ZXIgdmVyc2lvbiBudW1iZXIuCi0KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5jLCBzcmMvdHJ1ZXR5cGUvdHRzdWJwaXguaDogVXBkYXRlZC4KLQotMjAxNi0wNS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gRml4IG1hdHJpeCBzY2FsaW5nICgjNDc4NDgpLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oIChGVF9MT05HX01JTik6IE5ldyBtYWNyby4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfZm9udF9tYXRyaXgpOiBVc2UgbGFyZ2VzdCBzY2FsaW5nCi0JdmFsdWUgb2YgYWxsIG1hdHJpeCBjb2VmZmljaWVudHMgdG8gc2NhbGUgbWF0cml4LgotCi0JKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX2ZhY2VfaW5pdCk6IFVzZSBgbWF0cml4LT55eCcgbWVtYmVyIGZvcgotCW1hdHJpeCBub3JtYWxpemF0aW9uIGlmIGBtYXRyaXgtPnl5JyBpcyB6ZXJvLgotCi0yMDE2LTA1LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gUmVqZWN0IGludmFsaWQgc2ZudCBNYWMgcmVzb3VyY2UgKCM0Nzg5MSkuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbSk6IENoZWNrIHZhbGlkaXR5Ci0Jb2YgYENJRCAnIGFuZCBgVFlQRTEnIHRhYmxlIG9mZnNldCBhbmQgbGVuZ3RoLgotCi0yMDE2LTA1LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2lkXSBGaXggc2Nhbm5pbmcgZm9yIGBTdGFydERhdGEnIGFuZCBgL3NmbnRzJyAoIzQ3ODkyKS4KLQotCSogc3JjL2NpZC9jaWRwYXJzZS5jIChTVEFSVERBVEEsIFNUQVJUREFUQV9MRU4sIFNGTlRTLCBTRk5UU19MRU4pOgotCU5ldyBtYWNyb3MuCi0JKGNpZF9wYXJzZXJfbmV3KTogRml4IGFuZCBkb2N1bWVudCBhbGdvcml0aG0uCi0KLTIwMTYtMDUtMTYgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbdHJ1ZXR5cGVdIEltcHJvdmUgdGhlIHJlY3Vyc2l2ZSByZWZlcmVuY2UgZGV0ZWN0b3IuCi0KLQlUaGUgcHJldmlvdXMgZml4IGZvciAjNDYzNzIgbWlzdW5kZXJzdG9vZCBhIGNvbXBvc2l0ZSBnbHlwaCByZWZlcnJpbmcKLQlzYW1lIGNvbXBvbmVudCB0d2ljZSBhcyBhIHJlY3Vyc2l2ZSByZWZlcmVuY2UuICBTZWUgdGhlIGRpc2N1c3Npb24KLQotCSAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLzIwMTYtMDUvbXNnMDAwMDAuaHRtbAotCi0JVGhhbmtzIHRvIEtoYWxlZCBIb3NueSBmb3IgZmluZGluZyB0aGlzIGlzc3VlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChmdF9saXN0X2dldF9ub2RlX2F0KTogQSBmdW5jdGlvbiB0byBnZXQKLQl0aGUgaS10aCBub2RlIGZyb20gRlRfTGlzdC4KLQkobG9hZF90cnVldHlwZV9nbHlwaCk6IEluIHRoZSB0cmF2ZXJzYWwgc2NhbiBvZiB0aGUgcmVmZXJlbmNlIHRyZWUKLQlpbiB0aGUgY29tcG9zaXRlIGdseXBoLCB3ZSBjbGVhciB0aGUgbm9kZXMgZmlsbGVkIGJ5IHByZXZpb3VzCi0Jc2libGluZyBjaGFpbi4KLQotMjAxNi0wNS0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NhY2hlXSBBbGxvdyB2YWx1ZSAwIGZvciBmYWNlIElELgotCi0JV2UgbmV2ZXIgZGVyZWZlcmVuY2UgYGZhY2VfaWQnLCBhbmQgc29tZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgdXNlIGEKLQlydW5uaW5nIG51bWJlciBpbnN0ZWFkIG9mIGEgcG9pbnRlci4gIEFkZGl0aW9uYWxseSwgZGlzYWxsb3dpbmcKLQl2YWx1ZSB6ZXJvIHdhcyB1bmRvY3VtZW50ZWQuCi0KLQkqIHNyYy9jYWNoZS9mdGNjbWFwLmMgKEZUQ19DTWFwQ2FjaGVfTG9va3VwKSwgc3JjL2NhY2hlL2Z0Y21hbmFnLmMKLQkoRlRDX01hbmFnZXJfTG9va3VwRmFjZSwgRlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlEKTogUmVtb3ZlIHRlc3QgZm9yCi0JYGZhY2VfaWQnLgotCi0yMDE2LTA1LTA1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBNb3JlIGVmZmljaWVudCBhY2NvdW50aW5nIG9mIGNvbmljIHNwbGl0cyBhbmQgZHJhd3MuCi0KLQlBIHNpbmdsZSBkZWNyZW1lbnQgY291bnRlciBvZiBzZWdtZW50cyB0byBkcmF3LCBpbnN0ZWFkIG9mIGFuIGFycmF5LAotCWNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGRlY2lkZSB3aGVuIHRvIHNwbGl0IGFuZAotCXdoZW4gdG8gZHJhdyBhIGNvbmljIHNlZ21lbnQuIFRoZSBudW1iZXIgb2Ygc3BsaXRzIGJlZm9yZSBlYWNoIGRyYXcgaXMKLQllcXVhbCB0byB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zIGluIHRoZSBjb3VudGVyLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9UV29ya2VyKTogUmVtb3ZlIGBsZXZfc3RhY2snLgotCShncmF5X3JlbmRlcl9jb25pYyk6IFVwZGF0ZWQgdG8gdXNlIGRlY3JlbWVudCBjb3VudGVyIG9mIHNlZ21lbnRzLgotCi0yMDE2LTA1LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmLCB0cnVldHlwZV0gRml4IGxvZ2ljIGZvciBgRlRfUHJvcGVydHlfU2V0Jy4KLQotCU90aGVyd2lzZSBzb21lIHByb3BlcnRpZXMgY291bGQgYmUgc2V0IHRvIGFyYml0cmFyeSB2YWx1ZXMsIHdoaWNoIGlzCi0JaGFybWxlc3MsIGJ1dCBxdWVyeWluZyBjb3VsZCBnaXZlIHdyb25nIHBvc2l0aXZlIHJlc3VsdHMuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3Byb3BlcnR5X3NldCkgW2hpbnRpbmctZW5naW5lXSwKLQkqIHNyYy90cnVldHlwZS90dGRyaXZlci5jICh0dF9wcm9wZXJ0eV9zZXQpIFtpbnRlcnByZXRlci12ZXJzaW9uXToKLQlPbmx5IGFsbG93IGRlZmluZWQgdmFsdWVzLgotCi0yMDE2LTA0LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIGJsdWUtem9uZSBzdXBwb3J0IGZvciBHdWphcmF0aSBzY3JpcHQuCi0KLQlUaGlzIGVzc2VudGlhbGx5IG1vdmVzIHRoZSBHdWphcmF0aSBzY3JpcHQgZnJvbSB0aGUgYEluZGljJyBoaW50ZXIgdG8KLQl0aGUgYExhdGluJyBoaW50ZXIuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgR3VqYXJhdGkuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBHdWphcmF0aSBzdGFuZGFyZCBjaGFyYWN0ZXJzIGFuZCBtb3ZlCi0JZGF0YSBvdXQgb2YgQUZfQ09ORklHX09QVElPTl9JTkRJQyBibG9jay4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYzogTW92ZSBHdWphcmF0aSBkYXRhIG91dCBvZgotCUFGX0NPTkZJR19PUFRJT05fSU5ESUMgYmxvY2suCi0KLQkqIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IFVwZGF0ZSBHdWphcmF0aSBkYXRhOyBpbiBwYXJ0aWN1bGFyLCB1c2UKLQlBRl9XUklUSU5HX1NZU1RFTV9MQVRJTi4KLQotMjAxNi0wNC0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWlub3IuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfSEFTXyosIEZUX0lTXyopOiBQcm90ZWN0IG1hY3JvCi0JYXJndW1lbnQgd2l0aCBwYXJlbnRoZXNlcy4KLQotMjAxNi0wNC0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggZGVhbGxvY2F0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKCM0NzcyNikuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBJbml0aWFsaXplIGZpZWxkcyBpbgotCWBvdXRsaW5lJyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWFsbG9jYXRlZCBpbiBjYXNlIG9mIGVycm9yLgotCi0yMDE2LTA0LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSBHZW9yZ2lhbiBibHVlIHpvbmUgY2hhcmFjdGVycy4KLQotCVN1Z2dlc3RlZCBieSBBa2FraSBSYXptYWR6ZSA8cmF6bWFkemVrb2tvQGdtYWlsLmNvbT4uCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQgKEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX01LSEVEUlVMSV9CT1RUT00pOgotCVVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jOiBSZWdlbmVyYXRlZC4KLQotMjAxNi0wNC0xNiAgRGF2aWQgQ2FwZWxsbyAgPGRhdmlkY2FwZWxsb0BnbWFpbC5jb20+Ci0KLQlbY21ha2VdIEhvbm9yIFNLSVBfSU5TVEFMTF8qIHNldHRpbmdzIChhcyB1c2VkIGluIHpsaWIpLgotCi0JQXMgRnJlZVR5cGUgZGVwZW5kcyBvbiB6bGliLCBpZiB3ZSBkb24ndCBpbnN0YWxsIHpsaWIgKGUuZy4sIGJlY2F1c2UKLQl3ZSBkZWZpbmVkIFNLSVBfSU5TVEFMTF9BTEwpLCBGcmVlVHlwZSBjYW5ub3QgYmUgaW5zdGFsbGVkLCB0b28KLQkoY21ha2UgdHJpZ2dlcnMgYW4gZXJyb3Igc2F5aW5nIHRoYXQgRnJlZVR5cGUgY2Fubm90IGJlIGluc3RhbGxlZAotCWJlY2F1c2UgemxpYiB0YXJnZXQgaXNuJ3QgaW4gdGhlIGV4cG9ydCBzZXQpLgotCi0JKiBDTWFrZUxpc3RzLnR4dDogSG9ub3IgYFNLSVBfSU5TVEFMTF9IRUFERVJTJywKLQlgU0tJUF9JTlNUQUxMX0xJQlJBUklFUycsIGFuZCBgU0tJUF9JTlNUQUxMX0FMTCcgc2V0dGluZ3MuCi0KLTIwMTYtMDQtMTYgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW3RydWV0eXBlXSBBbm90aGVyIGZpeCBmb3Igbm9uLWludGVybWVkaWF0ZSBHWCB0dXBsZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9hcHBseV90dXBsZSk6IEFkZCBzb21lIG1pc3NpbmcKLQljYXNlcy4KLQotMjAxNi0wNC0xMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JUmVtb3ZlIGZvcmdvdHRlbiBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oCi0JW0ZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfR0xPQkFMU19IXTogUmVtb3ZlLgotCi0yMDE2LTA0LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIEdlb3JnaWFuIHNjcmlwdHMuCi0KLQlHZW9yZ2lhbiBpcyBwcm9ibGVtYXRpYywgc2luY2UgYHVwcGVyY2FzZScgZm9ybXMgb2YgTWtoZWRydWxpCi0JKGNhbGxlZCBNdGF2cnVsaSkgYXJlIG5vdCB5ZXQgZGVmaW5lZCBpbiBVbmljb2RlLCB3aGljaCBtZWFucyB0aGF0Ci0JcHJvcGVyIGJsdWUgem9uZXMgY2FuJ3QgYmUgZGVmaW5lZC4gIEhvd2V2ZXIsIHRoZXJlIGlzIGFscmVhZHkgYQotCXByb3Bvc2FsIHN1Ym1pdHRlZCB0byBVbmljb2RlOyBzZWUKLQotCSAgaHR0cDovL3d3dy51bmljb2RlLm9yZy9MMi9MMjAxNi8xNjAzNC1uNDcwNy1nZW9yZ2lhbi5wZGYKLQotCUFkZGl0aW9uYWxseSwgZHVlIHRvIGhpc3RvcmljYWwgcmVhc29ucywgVW5pY29kZSB0cmVhdHMgS2h1dHN1cmkgYXMKLQl0aGUgc2FtZSBzY3JpcHQgYXMgTWtoZWRydWxpLCBhbmQgc28gZG9lcyBPcGVuVHlwZS4gIEhvd2V2ZXIsIHNpbmNlCi0JdGhlIHR3byBzY3JpcHRzIGhhdmUgY29tcGxldGVseSBkaWZmZXJlbnQgc2hhcGVzIGl0IGNhbiBoYXBwZW4gdGhhdAotCWJsdWUgem9uZXMgZGlmZmVyIGNvbnNpZGVyYWJseS4gIFRoZSB0YWcgYGdlb2snIHVzZWQgaGVyZSAoZGVyaXZlZAotCWZyb20gSVNPIDE1OTI0KSB0byBkaWZmZXJlbnRpYXRlIHRoZSB0d28gc2NyaXB0cyBpcyBub3QgYW4gT3BlblR5cGUKLQl0YWcgaW4gdXNlLiAgSWYgd2Ugbm93IGhhdmUgYSBmb250IHRoYXQgY29udGFpbnMgYm90aCBnbHlwaHMgZm9yCi0JTWtoZWRydWxpIGFuZCBLaHV0c3VyaSwgYW5kIGl0IHVzZXMgT3BlblR5cGUgZmVhdHVyZXMgZm9yIGJvdGggYWxzbywKLQlIYXJmQnV6eiB1bmF2b2lkYWJseSB0cmVhdHMgYWxsIGdseXBocyBhcyBgZ2VvcicuICBBcyBhIGNvbnNlcXVlbmNlLAotCWJsdWUgem9uZXMgZm9yIGBnZW9rJyBhcmUgbm90IHVzZWQgZm9yIGdseXBocyBpbnZvbHZlZCBpbiB0aGUKLQlPcGVuVHlwZSBmZWF0dXJlcy4KLQotCUFuIGlzc3VlIG5vdCB5ZXQgcmVzb2x2ZWQgaXMgd2hpY2ggT3BlblR5cGUgZmVhdHVyZSBzaG91bGQgYmUgdXNlZAotCXRvIGFjY2VzcyBNdGF2cnVsaSBnbHlwaCBzaGFwZXM7IHJpZ2h0IG5vdywgRnJlZVR5cGUgZG9lc24ndCBzZXQgdXAKLQlzdXBwb3J0IGZvciB0aGVtLCBidXQgaXQgaXMgZWFzeSB0byBhZGQgdGhlbSBsYXRlciBvbiBhcyBzb29uIGFzCi0JbW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgR2VvcmdpYW4uCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBHZW9yZ2lhbiBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBBZGQgR2VvcmdpYW4gZGF0YS4KLQotCSogc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIEdlb3JnaWFuIGRhdGEuCi0KLTIwMTYtMDQtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBQcm92aWRlIGR1bW15IGJsdWUgem9uZSBmb3IgcHNldWRvIHNjcmlwdCBgbm9uZScuCi0KLQlFdmVuIGlmIHRoZSBkdW1teSBoaW50ZXIgaXMgdXNlZCBhcyB0aGUgaGFuZGxlciBmb3IgYG5vbmUnICh3aGljaAotCWRvZXNuJ3QgdXNlIGJsdWUgem9uZXMpLCBpdCBpcyBtb3JlIGNvbnNpc3RlbnQgdGhhbiB0aGUgb2xkIHZhbHVlCi0JKHdoaWNoIHdhcyAwKSwgcG9pbnRpbmcgdG8gQXJhYmljLi4uCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBgQUZfQkxVRV9TVFJJTkdTRVRfTk9ORScuCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oIChub25lX2RmbHQpOiBVc2UgQUZfQkxVRV9TVFJJTkdTRVRfTk9ORS4KLQotMjAxNi0wMy0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcGZyL3BmcmxvYWQuYyAocGZyX2F1eF9uYW1lX2xvYWQpOiBUaGlua28gKCM0NzU2NykuCi0KLTIwMTYtMDMtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Bmci9wZnJsb2FkLmMgKHBmcl9sb2dfZm9udF9jb3VudCk6IEJldHRlciBmb250IHNpemUgZXN0aW1hdGUuCi0KLTIwMTYtMDMtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Bmci9wZnJsb2FkLmMgKHBmcl9hdXhfbmFtZV9sb2FkKTogRml4IG1lbW9yeSBsZWFrICgjNDc1NjcpLgotCi0yMDE2LTAzLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0YWR2YW5jLmMgKEZUX0dldF9BZHZhbmNlcyk6IEZpeCBpbnZhbGlkIGxlZnQgc2hpZnQuCi0KLTIwMTYtMDMtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwZnJdIEZpeCBiaW5hcnkgc2VhcmNoICgjNDc1MTQpLgotCi0JKiBzcmMvcGZyL3BmcnNiaXQuYyAocGZyX2xvb2t1cF9iaXRtYXBfZGF0YSk6IEhhbmRsZSBib3JkZXIKLQljb25kaXRpb25zIGNvcnJlY3RseS4KLQotMjAxNi0wMy0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Bmcl0gTWlub3IuCi0KLQkqIHNyYy9wZnIvcGZyc2JpdC5jIChwZnJfbG9va3VwX2JpdG1hcF9kYXRhKTogUmVwbGFjZSBgbGVmdCcsCi0JYHJpZ2h0JywgYW5kIGBtaWRkbGUnIHdpdGggYG1pbicsIGBtYXgnLCBhbmQgYG1pZCcgYXMgdXNlZCBpbiBvdGhlcgotCUZyZWVUeXBlIGJpbmFyeSBzZWFyY2ggY29kZS4KLQkocGZyX2xvYWRfYml0bWFwX21ldHJpY3MpOiBGaXggaW52YWxpZCBsZWZ0IHNoaWZ0LgotCi0yMDE2LTAzLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wZnIvcGZydHlwZXMuaDogUmVwbGFjZSBhbGwgZW51bXMgd2l0aCBtYWNyb3MuCi0KLQlXZSBuZWVkIGB+Rk9PJyB0byB1bnNldCBiaXRzLCBhbmQgb25seSB3aXRoIHVuc2lnbmVkIHZhbHVlcyAod2hpY2gKLQlgZW51bScgaXNuJ3Qgbm9ybWFsbHkpIHRoaXMgd29ya3MgY2xlYW5seS4KLQotMjAxNi0wMy0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Bmcl0gUm9idXN0aWZ5IGJpdG1hcCBzdHJpa2UgaGFuZGxpbmcgKCM0NzUxNCkuCi0KLQlXZSBkaWQgYSBiaW5hcnkgc2VhcmNoIGZvciBhIGNoYXJjb2RlIHdpdGhvdXQgZW5zdXJpbmcgdGhhdCB0aGUKLQlzZWFyY2hlZCBkYXRhIGlzIG9yZGVyZWQuICBWYWxpZGF0aW5nIHRoZSBvcmRlciBpcyBub3cgZG9uZSBsYXppbHksCi0JdGhpcyBpcywgdGhlIGZpcnN0IGFjY2VzcyB0byBhIGJpdG1hcCBnbHlwaCB0cmlnZ2VycyB0aGUgb3JkZXIgY2hlY2sKLQlpbiB0aGUgY29ycmVzcG9uZGluZyBiaXRtYXAgc3RyaWtlLgotCi0JKiBzcmMvcGZyL3BmcnR5cGVzLmggKFBGUl9CaXRtYXBGbGFncyk6IE5ldyB2YWx1ZXMKLQlgUEZSX0JJVE1BUF9WQUxJRF9DSEFSQ09ERVMnIGFuZCBgUEZSX0JJVE1BUF9DSEFSQ09ERVNfVkFMSURBVEVEJy4KLQotCSogc3JjL3Bmci9wZnJzYml0LmMgKHBmcl9sb29rdXBfYml0bWFwX2RhdGEpOiBNYWtlIGBmbGFncycgYXJndW1lbnQKLQlhIHBvaW50ZXIuICBIYW5kbGUgbmV3IFBGUl9CSVRNQVBfWFhYIGZsYWdzLgotCShwZnJfc2xvdF9sb2FkX2JpdG1hcCk6IFVwZGF0ZWQuCi0KLTIwMTYtMDMtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwZnJdIEZpeCBoYW5kbGluZyBvZiBjb21wb3VuZCBnbHlwaHMuCi0KLQlFeHRyYSBpdGVtcyBhcmUgaW5kaWNhdGVkIHdpdGggZGlmZmVyZW50IGJpdCBwb3NpdGlvbnMuCi0KLQkqIHNyYy9wZnIvcGZydHlwZXMuaCAoUEZSX0dseXBoRmxhZ3MpOiBSZXBsYWNlCi0JYFBGUl9HTFlQSF9FWFRSQV9JVEVNUycgd2l0aCBgUEZSX0dMWVBIX1NJTVBMRV9FWFRSQV9JVEVNUycgYW5kCi0JYFBGUl9HTFlQSF9DT01QT1VORF9FWFRSQV9JVEVNUycuCi0KLQkqIHNyYy9wZnIvcGZyZ2xvYWQuYyAocGZyX2dseXBoX2xvYWRfc2ltcGxlLAotCXBmcl9nbHlwaF9sb2FkX2NvbXBvdW5kKTogVXNlIHRoZW0uCi0KLTIwMTYtMDMtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwZnJdIE1pbm9yLgotCi0JKiBzcmMvcGZyL3BmcnNiaXQuYywgc3JjL3Bmci9wZnJvYmpzLmM6IFVzZSBmbGFnIG5hbWVzIGluc3RlYWQgb2YKLQliYXJlIG51bWJlcnMuCi0KLTIwMTYtMDMtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwZnJdIFZhcmlvdXMgY2xhbmcgc2FuaXRpemVyIGZpeGVzLgotCi0JKiBzcmMvcGZyL3BmcnNiaXQuYyAocGZyX2xvYWRfYml0bWFwX21ldHJpY3MpOiBDb3JyZWN0bHkgaGFuZGxlCi0Jc2lnbmVkIG5pYmJsZXMuCi0JKHBmcl9zbG90X2xvYWRfYml0bWFwKTogQ29ycmVjdGx5IGV4aXQgZnJhbWUgaW4gY2FzZSBvZiBlcnJvci4KLQlGaXggaW52YWxpZCBsZWZ0IHNoaWZ0cy4KLQotMjAxNi0wMy0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmVuYW1lIGBWRVJTSU9OLkRMTCcgKCM0NzQ3MikuCi0KLQkqIGRvY3MvVkVSU0lPTi5ETEw6IFJlbmFtZWQgdG8uLi4KLQkqIGRvY3MvVkVSU0lPTlMuVFhUOiAuLi50aGlzLgotCi0yMDE2LTAzLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcmFzdGVyLCBzbW9vdGhdIERpcmVjdGx5IHRlc3Qgb3V0bGluZSBzaXplICgjNDc1MDApLgotCi0JVGhpcyBpbXByb3ZlcyBzdGFuZC1hbG9uZSBjb21waWxhdGlvbi4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX1JlbmRlcik6IE1vdmUgY2JveCBzaXplIHRlc3QgdG8uLi4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChmdF9ibGFja19yZW5kZXIpLCBzcmMvc21vb3RoL2Z0Z3JheXMuYwotCShncmF5X3Jhc3Rlcl9yZW5kZXIpOiAuLi50aGVzZSBmdW5jdGlvbnMuCi0KLTIwMTYtMDMtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtyYXN0ZXIsIHNtb290aF0gRml4IHNvbWUgY2xhbmcgc2FuaXRpemVyIHJ1bnRpbWUgaXNzdWVzLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKGZ0X2JsYWNrX3Jlc2V0LCBmdF9ibGFja19zZXRfbW9kZSwKLQlmdF9ibGFja19yZW5kZXIpOiBIYXJtb25pemUgc2lnbmF0dXJlcyB3aXRoIGBmdGltYWdlLmgnLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yYXN0ZXJfcmVuZGVyLCBncmF5X3Jhc3Rlcl9yZXNldCk6Ci0JRGl0dG8uCi0KLTIwMTYtMDMtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBNaW5vci4KLQotCVRoaXMgZml4ZXMgYW4gQWRkcmVzc1Nhbml0aXplciBpc3N1ZToKLQotCSAgdHRnbG9hZC5jOjQzMDo3OiBydW50aW1lIGVycm9yOiBudWxsIHBvaW50ZXIgcGFzc2VkIGFzIGFyZ3VtZW50IDEsCi0JICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIGRlY2xhcmVkIHRvIG5ldmVyIGJlIG51bGwKLQotMjAxNi0wMy0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX3JlbG9hZCk6IFRoaW5rby4KLQotCVRoaXMgZml4ZXMgdGhlIHByZXZpb3VzIGNvbW1pdCB0byB0aGlzIGZpbGUuCi0KLTIwMTYtMDMtMjEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIFBhcnRseSByZXZlcnQgcmVjZW50IGNoYW5nZXMuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2NvbmljX3RvLCBncmF5X2N1YmljX3RvKTogUmV3b3JrCi0JY29uZGl0aW9ucyB0byBmaXggcmVuZGVyaW5nIGlzc3Vlcy4KLQotMjAxNi0wMy0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFNob3cgYG5lYXInIHBvaW50cyBpbiB0cmFjaW5nLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmggKEFGX0ZMQUdfTkVBUik6IE5ldyBtYWNyby4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cyk6IEltcGxlbWVudCBpdC4KLQkoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogSGFuZGxlIEFGX0ZMQUdfTkVBUi4KLQotMjAxNi0wMy0xOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gTWlub3IgcmVmYWN0b3JpbmcgYW5kIG1pY3Jvb3B0aW1pemF0aW9ucy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmVuZGVyX2NvbmljLCBncmF5X3JlbmRlcl9jdWJpYyk6IE1vdmUKLQliYW5kIGNsaXBwaW5nIGZyb20gaGVyZS4KLQkoZ3JheV9jb25pY190bywgZ3JheV9jdWJpY190byk6IC4uLiB0byBoZXJlLgotCShncmF5X3JlbmRlcl9saW5lLCBncmF5X3JlbmRlcl9zY2FubGluZSk6IEluaXRpYWxpemUgdmFyaWFibGVzIGNsb3NlcgotCXRvIHRoZWlyIHVzZS4KLQotMjAxNi0wMy0xNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gTWlub3IgcmVmYWN0b3JpbmcuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9jb25pYywgZ3JheV9yZW5kZXJfY3ViaWMpOiBNb3ZlCi0JdXBzY2FsaW5nIGZyb20gaGVyZS4KLQkoZ3JheV9jb25pY190bywgZ3JheV9jdWJpY190byk6IC4uLiB0byBoZXJlLgotCi0yMDE2LTAzLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoKTogT3B0aW1pemUuCi0KLTIwMTYtMDMtMTQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIFRlbXBvcmFyaWx5IHJldmVydCA2ZWI2MTU4ZGQ3ODcgKCM0NzExNCkuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9saW5lKTogT2xkIGltcGxlbWVudGF0aW9uLgotCi0yMDE2LTAzLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZnRmdXp6ZXJdIEltcHJvdmUgY292ZXJhZ2Ugb2YgcmFzdGVyZnV6emVyLgotCi0JKiBzcmMvdG9vbHMvZnRmdXp6ZXIvcmFzdGVyZnV6emVyLmNjIChMTFZNRnV6emVyVGVzdE9uZUlucHV0KTogVXNlCi0JaW5wdXQgZGF0YSBmb3IgYHRhZ3MnIGFycmF5IGFsc28uCi0JVHJpbSBpbnB1dCBkYXRhIHRvIGdldCBtb3JlIHBvc2l0aXZlIGhpdHMuCi0KLTIwMTYtMDMtMTEgIFBhdmxvIERlbnlzb3YgIDxwYXVsLmtpZXYrc2F2YW5uYWhAZ21haWwuY29tPgotCi0JRml4IENNYWtlIGlzc3VlcyBmb3IgaU9TIChwYXRjaCAjODk0MSkuCi0KLQkqIENNYWtlTGlzdHMudHh0IChDTUFLRV9UT09MQ0hBSU5fRklMRSk6IEZpeCBkaXJlY3RvcnkuCi0JKiBidWlsZHMvY21ha2UvaU9TLmNtYWtlOiBObyBsb25nZXIgZW5mb3JjZSBnY2MuCi0KLTIwMTYtMDMtMDkgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW3RydWV0eXBlXSBGaXggaGFuZGxpbmcgb2Ygbm9uLWludGVybWVkaWF0ZSBHWCB0dXBsZXMuCi0KLQlXZSBwcm9iYWJseSBkaWQgbm90IG5vdGljZSB0aGlzIGFzIGFsbCBmb250cyB3ZSB0ZXN0ZWQgaGFkIG9ubHkKLQl0dXBsZV9jb29yZHNbaV0gYmUgKzEgb3IgLTEgZm9yIG5vbi1pbnRlcm1lZGlhdGUgdHVwbGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfYXBwbHlfdHVwbGUpOiBJbXBsZW1lbnQgaXQuCi0KLTIwMTYtMDMtMDYgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBSZWZ1c2UgdG8gcmVuZGVyIGVub3Jtb3VzIG91dGxpbmVzICgjNDcxMTQpLgotCi0JVGhlIGdvYWwgaXMgdG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvd3MgaW4gdGhlIHJlbmRlcmluZyBhbGdvcml0aG1zLgotCVRoZSBsaW1pdCBpcyBjaG9zZW4gYXJiaXRyYXJpbHkgYXQgc29tZSAyXjE4IHBpeGVscywgd2hpY2ggc2hvdWxkIGJlCi0JZW5vdWdoIGZvciBtb2Rlcm4gZGV2aWNlcyBpbmNsdWRpbmcgcHJpbnRlcnMuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9SZW5kZXIpOiBDaGVjayBDQm94IGFuZCByZWplY3QKLQllbm9ybW91cyBvdXRsaW5lcy4KLQotMjAxNi0wMy0wNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gUmVwbGFjZSBsZWZ0IHNoaWZ0cyB3aXRoIG11bHRpcGxpY2F0aW9ucyAoIzQ3MTE0KS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKFNVQlBJWEVMUywgVVBTQ0FMRSwgRE9XTlNDQUxFKTogRG8gaXQuCi0KLTIwMTYtMDMtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBdm9pZCBleGNlc3NpdmUgc3RlbSBsZW5ndGggcm91bmRpbmcgKCMyNTM5MikuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoKTogQWRkIGFyZ3VtZW50Ci0JdG8gcGFzcyBkaWZmZXJlbmNlIGJldHdlZW4gaGludGVkIGFuZCB1bmhpbnRlZCBwb3NpdGlvbiBvZiBiYXNlCi0JcG9pbnQ7IHVzZSB0aGlzIHRvIGFkanVzdCB0aGUgc3RlbSB3aWR0aCBkZXBlbmRpbmcgb24gdGhlIFBQRU0gc28KLQl0aGF0IGl0IGRvZXNuJ3QgYmVjb21lIHRvbyBsYXJnZSB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuCi0JVXBkYXRlIGFsbCBjYWxsZXJzIHVzaW5nIHZhbHVlIDAgZm9yIHRoaXMgYXJndW1lbnQgZXhjZXB0Li4uCi0JKGFmX2xhdGluX2FsaWduX2xpbmtlZF9lZGdlKTogUGFzcyBwb3NpdGlvbiBkZWx0YSBvZiBiYXNlIHBvaW50IHRvCi0JYGFmX2xhdGluX2NvbXB1dGVfc3RlbV93aWR0aCcuCi0KLTIwMTYtMDMtMDUgIEogUmF5bm9yICA8anhyYXlub3JAZ21haWwuY29tPgotCi0JTWFrZSBGcmVlVHlwZSBjb21waWxlIG9uIEFJWCBvdXQgb2YgdGhlIGJveC4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAoWFhfQU5TSUZMQUdTKTogRG9uJ3QgdXNlIGAtYW5zaScgb24KLQlBSVguCi0KLTIwMTYtMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQkgICAgS29zdHlhIFNlcmVicnlhbnkgIDxrY2NAZ29vZ2xlLmNvbT4KLQotCVtmdGZ1enplcl0gQWRkIHVuaXQgZm9yIHRlc3Rpbmcgc21vb3RoIGFuZCBibGFjayByYXN0ZXJpemVycy4KLQotCSogc3JjL3Rvb2xzL2Z0ZnV6emVyL3Jhc3RlcmZ1enplci5jYzogTmV3IGZpbGUuCi0KLTIwMTYtMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggcmVhbGxvY2F0aW9uIGVycm9yIGludHJvZHVjZWQgaW4gMjAxNi0wMi0yNyAoIzQ3MzEwKS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzKTogUmVhc3NpZ24KLQlgcHJldl9zZWdtZW50JyBhZnRlciByZWFsbG9jYXRpb24uCi0KLTIwMTYtMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBjbGFuZyB3YXJuaW5ncy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzKTogVXNlCi0JRlRfVVNob3J0IGZvciBgbWluX2ZsYWdzJyBhbmQgYG1heF9mbGFncycuCi0JSW5pdGlhbGl6ZSBgcHJldl8qJyB2YXJpYWJsZXMuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KSBbRlRfREVCVUdfTEVWRUxfVFJBQ0VdOiBGaXgKLQl0eXBlcyBvZiBsb2NhbCB2YXJpYWJsZXMuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2R1bXBfY2VsbHMpIFtGVF9ERUJVR19MRVZFTF9UUkFDRV06Ci0JVXBkYXRlIGBwcmludGYnIGZvcm1hdCBzdHJpbmcuCi0KLQkqIHNyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYyAoc2V0SW50ZXJtZWRpYXRlQXhpcyk6IEFkZCBjYXN0LgotCShMTFZNRnV6emVyVGVzdE9uZUlucHV0KTogRml4IGxvb3AgdHlwZS4KLQotMjAxNi0wMi0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkZCBibHVlLXpvbmUgc3VwcG9ydCBmb3IgU2luaGFsYSBzY3JpcHQuCi0KLQlUaGlzIGVzc2VudGlhbGx5IG1vdmVzIHRoZSBTaW5oYWxhIHNjcmlwdCBmcm9tIHRoZSBgSW5kaWMnIGhpbnRlciB0bwotCXRoZSBgTGF0aW4nIGhpbnRlci4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBTaW5oYWxhLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgU2luaGFsYSBzdGFuZGFyZCBjaGFyYWN0ZXIgYW5kIG1vdmUgZGF0YQotCW91dCBvZiBBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBNb3ZlIFNpbmhhbGEgZGF0YSBvdXQgb2YKLQlBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBVcGRhdGUgU2luaGFsYSBkYXRhOyBpbiBwYXJ0aWN1bGFyLCB1c2UKLQlBRl9XUklUSU5HX1NZU1RFTV9MQVRJTi4KLQotMjAxNi0wMi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFByb3Blcmx5IGhhbmRsZSBzcGlrZXMgcG9pbnRpbmcgdG8gdGhlIHgtYXhpcy4KLQotCUFuIGV4YW1wbGUgdGhhdCBnZXRzIGJldHRlciByZW5kZXJlZCBpcyBnbHlwaCBgdXVzaWduVGFtbCcgKGdseXBoCi0JaW5kZXggMjI4NikgaW4gZm9udCBgRnJlZVNlcmlmLnR0ZicgKFZlcnNpb24gMDQxMi4yMjYzKSBhdCAyMnBwZW0uCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyk6IFByb3Blcmx5Ci0JaGFuZGxlIHNlZ21lbnRzIHdoZXJlIHRoZSBsYXN0IHBvaW50IG9mIHRoZSBmaXJzdCBzZWdtZW50IGlzCi0JaWRlbnRpY2FsIHRvIHRoZSBmaXJzdCBwb2ludCBpbiB0aGUgc2Vjb25kIG9uZS4gIFRoaXMgY2FuIGhhcHBlbiBmb3IKLQltYWxmb3JtZWQgZm9udHMgb3Igc3Bpa2VzLiAgV2UgZWl0aGVyIG1lcmdlIHRoZSBuZXcgc2VnbWVudCB3aXRoIHRoZQotCXByZXZpb3VzIG9uZSAoYm90aCBzZWdtZW50cyBwb2ludCBpbnRvIHRoZSBzYW1lIGRpcmVjdGlvbiksIG9yIHdlCi0JZGlzY2FyZCB0aGUgc2hvcnRlciBzZWdtZW50IGlmIHRoZXkgcG9pbnQgaW50byBkaWZmZXJlbnQgZGlyZWN0aW9ucy4KLQotMjAxNi0wMi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIE1pbm9yIGNvZGUgY2xlYW4tdXAuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyk6IENoYW5nZQotCXNvbWUgbG9jYWwgdmFyaWFibGUgbmFtZXMgdG8gYmV0dGVyIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB2YWx1ZXMKLQlhbG9uZyBhIHNlZ21lbnQgYW5kIHZhbHVlcyBvcnRob2dvbmFsIHRvIGl0LgotCi0yMDE2LTAyLTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSBCT1VORCBhY3Rpb24uCi0KLQlJbiBjb21wbGV4IGdseXBoIHNoYXBlcywgdGhlIG9yaWdpbmFsIGxvZ2ljIHdhcyB0b28gc2ltcGxlIHRvIGNhdGVyCi0JZm9yIHNpdHVhdGlvbnMgdGhhdCB3b3VsZCBhY3R1YWxseSBuZWVkIHNvbWV0aGluZyBzaW1pbGFyIHRvIFBTIEhpbnQKLQltYXNrcy4gIFRoaXMgZml4IHNob3VsZCBhbGxldmlhdGUgdGhlIHdvcnN0IGNhc2VzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRfZWRnZXMpOiBEb24ndCBhbGxvdwotCWNvbXBsZXRlIGRpc2FwcGVhcmFuY2Ugb2Ygc3RlbXMuCi0KLTIwMTYtMDItMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBZGQgYmx1ZS16b25lIHN1cHBvcnQgZm9yIFRhbWlsIHNjcmlwdC4KLQotCVRoaXMgZXNzZW50aWFsbHkgbW92ZXMgdGhlIFRhbWlsIHNjcmlwdCBmcm9tIHRoZSBgSW5kaWMnIGhpbnRlciB0bwotCXRoZSBgTGF0aW4nIGhpbnRlci4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBUYW1pbC4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIFRhbWlsIHN0YW5kYXJkIGNoYXJhY3RlciBhbmQgbW92ZSBkYXRhCi0Jb3V0IG9mIEFGX0NPTkZJR19PUFRJT05fSU5ESUMgYmxvY2suCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmM6IE1vdmUgVGFtaWwgZGF0YSBvdXQgb2YKLQlBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBVcGRhdGUgVGFtaWwgZGF0YTsgaW4gcGFydGljdWxhciwgdXNlCi0JQUZfV1JJVElOR19TWVNURU1fTEFUSU4uCi0KLTIwMTYtMDItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBZGQgYmx1ZS16b25lIHN1cHBvcnQgZm9yIE1hbGF5YWxhbSBzY3JpcHQuCi0KLQlUaGlzIGVzc2VudGlhbGx5IG1vdmVzIHRoZSBNYWxheWFsYW0gc2NyaXB0IGZyb20gdGhlIGBJbmRpYycgaGludGVyCi0JdG8gdGhlIGBMYXRpbicgaGludGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIE1hbGF5YWxhbS4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIE1hbGF5YWxhbSBzdGFuZGFyZCBjaGFyYWN0ZXJzIGFuZCBtb3ZlCi0JZGF0YSBvdXQgb2YgQUZfQ09ORklHX09QVElPTl9JTkRJQyBibG9jay4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYzogTW92ZSBNYWxheWFsYW0gZGF0YSBvdXQgb2YKLQlBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBVcGRhdGUgTWFsYXlhbGFtIGRhdGE7IGluIHBhcnRpY3VsYXIsIHVzZQotCUFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLgotCi0yMDE2LTAyLTE2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBGaXggaW50ZWdlciBvdmVyZmxvdyAoIzQ3MTE0KS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKFRBcmVhKTogTWFrZSBpdCB1bmNvbmRpdGlvbmFsbHkgYGxvbmcnLgotCi0yMDE2LTAyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX211bHRpcGxlX21hc3Rlcik6IEltcHJvdmUgdHJhY2luZy4KLQotMjAxNi0wMi0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gSGFuZGxlIFQyIG9wZXJhdG9yIG9ubHkgd2l0aCBvbGQgQ0ZGIGVuZ2luZSAoIzQ3MTU3KS4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VyX3J1bikgPG9wY29kZSAzMT46IEVuY2xvc2Ugd2l0aAotCSNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FLi4uI2VuZGlmLgotCi0yMDE2LTAyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBQYXJ0aWFsbHkgaGFuZGxlIGBsb2FkJyBhbmQgYHN0b3JlJyBvcHMgaW4gb2xkIENGRiBlbmdpbmUuCi0KLQlOb3cgYWxsIGdseXBocyBvZiBNTSBDRkZzIGxpa2UgYElUQ0dhcmFtb25kTU0tSXQub3RmJyBjYW4gYmUKLQlkaXNwbGF5ZWQuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpIDxjZmZfb3Bfc3RvcmUsCi0JY2ZmX29wX2xvYWQ+OiBQYXJ0aWFsbHkgaW1wbGVtZW50IGl0LgotCi0JKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZXJfaW5pdCk6IEFkZCBuZXcgcGFyYW1ldGVyIHRvIHBhc3MKLQl0aGUgbnVtYmVyIG9mIE11bHRpcGxlIE1hc3RlciBheGVzLgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkoY2ZmX3BhcnNlX211bHRpcGxlX21hc3Rlcik6IEdldCBudW1iZXIgb2YgYXhlcy4KLQkoY2ZmX3BhcnNlcl9ydW4pIDxvcGNvZGUgMzE+OiBVcGRhdGVkLgotCSogc3JjL2NmZi9jZmZwYXJzZS5oOiBVcGRhdGVkLgotCShDRkZfUGFyc2VyUmVjKTogQWRkIGBudW1fYXhlcycgZmllbGQuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9Gb250UmVjRGljdFJlYyk6IEFkZCBgbnVtX2F4ZXMnIGZpZWxkLgotCi0yMDE2LTAyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBDb3JyZWN0bHkgdHJhY2UgU0lEcyB0aGF0IGNvbnRhaW4gTlVMTCBieXRlcy4KLQotCVdlIG5lZWQgdGhpcyB0byBwcm9wZXJseSB0cmFjZSBNdWx0aXBsZSBNYXN0ZXIgQ0ZGcywgd2hpY2ggY29udGFpbgotCXR3byBTSURzIHRoYXQgYXJlIGNoYXJzdHJpbmdzLgotCi0JVGhpcyBjb21taXQgbWFrZXMgRnJlZVR5cGUgYWxzbyBzaG93IHRoZSBsYXN0IFNJRCwgb21pdHRlZAotCXByZXZpb3VzbHkgZHVlIHRvIGEgYnVnLgotCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9Gb250UmVjKTogQWRkIGBzdHJpbmdfcG9vbF9zaXplJyBmaWVsZC4KLQotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9pbmRleF9nZXRfcG9pbnRlcnMpOiBBZGQgYXJndW1lbnQgdG8gcmV0dXJuCi0JdGhlIHBvb2wgc2l6ZS4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KSBbRlRfREVCVUdfTEVWRUxfVFJBQ0VdOiBEaXJlY3RseQotCWFjY2VzcyBgY2ZmLT5zdHJpbmdzJyB0byBkaXNwbGF5IHRoZSBub24tZGVmYXVsdCBzdHJpbmdzLgotCi0yMDE2LTAyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0aGFzaC5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ILgotCi0yMDE2LTAyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYzogSW5jbHVkZSBgY2ZmZ2xvYWQuaCcuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IENvbGluIFdhbHRlcnMgPHdhbHRlcnNAdmVyYnVtLm9yZz4uCi0KLTIwMTYtMDItMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIE1ha2Ugb2xkIENGRiBlbmdpbmUgc2hvdyBNTSBDRkZzICh3aXRob3V0IHZhcmlhdGlvbnMpLgotCi0JVGhlIG5ldyBjb2RlIG9ubHkgZGlzcGxheXMgdGhlIGZpcnN0IG1hc3RlciBpbiB0aGUgZm9udC4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfZGVjb2RlX3BhcnNlX2NoYXJzdHJpbmdzKTogQWRkIG5ldwotCXBhcmFtZXRlciB0byBhbGxvdyBmdW5jdGlvbiBjYWxscyBmcm9tIGRpY3Rpb25hcmllcyBhbHNvLgotCTxjZmZfb3BfYmxlbmQ+OiBQYXJ0aWFsbHkgaW1wbGVtZW50IGl0LgotCVVwZGF0ZSBhbGwgY2FsbGVycy4KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuaDogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VyX2luaXQpOiBBZGQgbmV3IHBhcmFtZXRlciB0byBwYXNzIHRoZQotCW51bWJlciBvZiBNdWx0aXBsZSBNYXN0ZXIgZGVzaWducy4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKGNmZl9wYXJzZV9tdWx0aXBsZV9tYXN0ZXIpOiBOZXcgZnVuY3Rpb24gdG8gcnVkaW1lbnRhcmlseSBwYXJzZQotCW9wZXJhdG9yLgotCShjZmZfcGFyc2VyX3J1bik6IEhhbmRsZSBgVDInIG9wZXJhdG9yLgotCSogc3JjL2NmZi9jZmZwYXJzZS5oOiBVcGRhdGVkLgotCShDRkZfUGFyc2VyUmVjKTogQWRkIGBudW1fZGVzaWducycgZmllbGQuCi0KLQkqIHNyYy9jZmYvY2ZmbG9hZC5jOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZnRva2VuLmg6IEhhbmRsZSBgTXVsdGlwbGVNYXN0ZXInIG9wZXJhdG9yLgotCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9Gb250UmVjRGljdFJlYyk6IEFkZCBgbnVtX2Rlc2lnbnMnIGZpZWxkLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9pbml0X2ZhY2UpOiBEb24ndCBoYW5kbGUgYGZ2YXInIHRhYmxlIGZvcgotCU1NIENGRnMuCi0KLTIwMTYtMDItMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtkb2NtYWtlcl0gRG9uJ3QgZW1pdCB0cmFpbGluZyBuZXdsaW5lcy4KLQotCSogc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSAoSHRtbEZvcm1hdHRlcjo6bWFrZV9odG1sX2NvZGUpOgotCVVzZSBgcnN0cmlwJy4KLQotMjAxNi0wMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNi4zIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNi0zJy4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjYuMy4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNi4yLzIuNi4zLywgcy8yNjIvMjYzLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAzLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTg6MzoxMi4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDMuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNi0wMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGFub3RoZXIgcnVudGltZSBlcnJvciBmb3VuZCBieSBjbGFuZydzIHNhbml0aXplciAoIzQ3MDgyKS4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoZnRfc3Ryb2tlX2JvcmRlcl9leHBvcnQpOiBQcm9wZXJseSBoYW5kbGUKLQllbXB0eSBpbnB1dCBidWZmZXIuCi0KLTIwMTYtMDItMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBydW50aW1lIGVycm9ycyBmb3VuZCBieSBjbGFuZydzIHNhbml0aXplciAoIzQ3MDgyKS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCksIHNyYy9iYXNlL2Z0b3V0bG4uYwotCShGVF9PdXRsaW5lX0NvcHkpLCBzcmMvY2FjaGUvZnRjc2JpdHMuYyAoZnRjX3NiaXRfY29weV9iaXRtYXApOgotCVByb3Blcmx5IGhhbmRsZSBlbXB0eSBpbnB1dCBidWZmZXIuCi0KLTIwMTYtMDItMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIE1pbm9yLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKSA8Y2ZmX29wX3NxcnQ+OgotCVJlbW92ZSBkZWFkIGNvZGUuCi0KLTIwMTYtMDItMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEltcGxlbWVudCBtaXNzaW5nIG9wZXJhdG9ycyBpbiBuZXcgZW5naW5lIChleGNlcHQgYHJhbmRvbScpLgotCi0JKiBzcmMvY2ZmL2NmMmZvbnQuaCAoQ0YyX1NUT1JBR0VfU0laRSk6IE5ldyBtYWNyby4KLQotCSogc3JjL2NmZi9jZjJpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKTogSW1wbGVtZW50IHRoZQotCWZvbGxvd2luZyBvcGVyYXRvcnM6IGFicywgYWRkLCBhbmQsIGRpdiwgZHJvcCwgZHVwLCBlcSwgZXhjaCwgZ2V0LAotCWlmZWxzZSwgaW5kZXgsIG11bCwgbmVnLCBub3QsIG9yLCBwdXQsIHJvbGwsIHNxcnQsIHN1Yi4KLQotCSogc3JjL2NmZi9jZjJzdGFjay5oLCBzcmMvY2ZmL2NmMnN0YWNrLmMgKGNmMl9zdGFja19yb2xsKTogTmV3Ci0JYXV4aWxpYXJ5IGZ1bmN0aW9uIGZvciBgcm9sbCcgb3BlcmF0b3IuCi0KLTIwMTYtMDItMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBzb21lIFR5cGUgMiBvcGVyYXRvcnMgaW4gb2xkIENGRiBlbmdpbmUuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBGaXggYGVxJwotCW9wZXJhdG9yLCBhZGQgYG5vdCcgYW5kICh1bnN1cHBvcnRlZCkgYGJsZW5kJyBvcGVyYXRvcnMuCi0KLTIwMTYtMDItMDUgIFNlYmFzdGlhbiBSYXNtdXNzZW4gIDxzZWJyYXNAZ21haWwuY29tPgotCi0JTWFrZSBkaXJlY3QgY2FsbCBvZiBgbWFrZSBpbnN0YWxsJyB3b3JrICgjNDcwNzIpLgotCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbiAoZnJlZXR5cGUtY29uZmlnKTogTWFrZSBzdXJlCi0JYGZyZWV0eXBlLWNvbmZpZycgaXMgZ2VuZXJhdGVkIGZvciBib3RoIG1ha2UgdGFyZ2V0cyAoYGFsbCcgYW5kCi0JYGluc3RhbGwnKS4KLQotMjAxNi0wMi0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2VdIEZpeCBhZHZhbmNlIHdpZHRoIGxvYWRpbmcgZm9yIE1NIGFuZCBHWCBmb250cyAoIzQ3MDY0KS4KLQotCSogc3JjL2Jhc2UvZnRhZHZhbmMuYyAoTE9BRF9BRFZBTkNFX0ZBU1RfQ0hFQ0spOiBSZXR1cm4gZmFsc2UgZm9yCi0JTU0gYW5kIEdYIGZvbnRzLgotCVVwZGF0ZSBjYWxsZXJzLgotCi0yMDE2LTAyLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBGaXggaGFuZGxpbmcgb2YgZmFjZV9pbmRleCA9PSAtMSBmb3IgcHVyZSBDRkYuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogUmV0dXJuIGNvcnJlY3QgbnVtYmVyIG9mIGZhY2VzLgotCi0yMDE2LTAxLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWlub3IgdHJhY2luZyBpbXByb3ZlbWVudC4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cyk6IEluc2VydCBuZXdsaW5lCi0JYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IGNvbnRvdXIuCi0KLTIwMTYtMDEtMjggIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCVJlbW92ZSB1bnBhdGVudGVkIGhpbnRlciAoMy8zKS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAotCShUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyk6IFJlbW92ZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfRmFjZV9JbnRlcm5hbFJlYyk6IFJlbW92ZQotCWBpZ25vcmVfdW5wYXRlbnRlZF9oaW50ZXInIGZpZWxkLgotCVVwZGF0ZSB1c2Vycy4KLQkoRlRfREVCVUdfSE9PS19VTlBBVEVOVEVEX0hJTlRJTkcpOiBSZW1vdmUuCi0JVXBkYXRlIHVzZXJzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZVJlYyk6IFJlbW92ZQotCWB1bnBhdGVudGVkX2hpbnRpbmcnIGZpZWxkLgotCVVwZGF0ZSB1c2Vycy4KLQotCSogc3JjL2Jhc2UvZnRwYXRlbnQuYyAoX3R0X2NoZWNrX3BhdGVudHNfaW5fcmFuZ2UsCi0JX3R0X2NoZWNrX3BhdGVudHNfaW5fdGFibGUsIF90dF9mYWNlX2NoZWNrX3BhdGVudHMpOiBSZW1vdmUuCi0JKEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMsIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcpOgotCVJlcGxhY2UgY29kZSB3aXRoIGR1bW1pZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZmFjZV9pbml0KTogUmVtb3ZlIG5vdyBkZWZ1bmN0IGNvZGUuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmggKFRUX0dyYXBoaWNzU3RhdGUpOiBSZW1vdmUgYGJvdGhfeF9heGlzJwotCWZpZWxkLgotCi0yMDE2LTAxLTI4ICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+Ci0KLQlSZW1vdmUgdW5wYXRlbnRlZCBoaW50ZXIgKDIvMykuCi0KLQkqIGRldmVsL2Z0b3B0aW9uLmggKFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HKTogUmVtb3ZlLgotCi0yMDE2LTAxLTI4ICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+Ci0KLQlSZW1vdmUgdW5wYXRlbnRlZCBoaW50ZXIgKDEvMykuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIFtUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElOR106Ci0JUmVtb3ZlIGFsbCBjb2RlIHJlbGF0ZWQgdG8gdGhpcyBtYWNyby4KLQotMjAxNi0wMS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkZCBibHVlLXpvbmUgc3VwcG9ydCBmb3IgS2FubmFkYSBzY3JpcHQuCi0KLQlUaGlzIGVzc2VudGlhbGx5IG1vdmVzIHRoZSBLYW5uYWRhIHNjcmlwdCBmcm9tIHRoZSBgSW5kaWMnIGhpbnRlciB0bwotCXRoZSBgTGF0aW4nIGhpbnRlci4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBLYW5uYWRhLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgS2FubmFkYSBzdGFuZGFyZCBjaGFyYWN0ZXJzIGFuZCBtb3ZlCi0JZGF0YSBvdXQgb2YgQUZfQ09ORklHX09QVElPTl9JTkRJQyBibG9jay4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYzogTW92ZSBLYW5uYWRhIGRhdGEgb3V0IG9mCi0JQUZfQ09ORklHX09QVElPTl9JTkRJQyBibG9jay4KLQotCSogc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogVXBkYXRlIEthbm5hZGEgZGF0YTsgaW4gcGFydGljdWxhciwgdXNlCi0JQUZfV1JJVElOR19TWVNURU1fTEFUSU4uCi0KLTIwMTYtMDEtMjIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCUJldHRlciBhY2Nlc3MgdG8gNjQtYml0IGludGVnZXJzIGZvciBDOTkgY29tcGlsZXJzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIFtGVF9MT05HNjRdOiBVc2UKLQlfX1NURENfVkVSU0lPTl9fIHRvIGRlZmluZSA2NC1iaXQgaW50ZWdlcnMuCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiBbRlRfTE9ORzY0XTogRGl0dG8uCi0JKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmggW0ZUX0xPTkc2NF06IERpdHRvLgotCi0yMDE2LTAxLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZ3h2YWxpZF0gUmVtb3ZlIGNvbW1lbnRlZCBvdXQgY29kZS4KLQotCSogc3JjL2d4dmFsaWQvZ3h2Y29tbW4uYyAoZ3h2X0VudHJ5VGFibGVfdmFsaWRhdGUpOiBEbyBpdC4KLQotMjAxNi0wMS0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIENvbXBsZXRlIGxhc3QgYXV0b2ZpdCBjb21taXQuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEtvc3R5YSBTZXJlYnJ5YW55IDxrY2NAZ29vZ2xlLmNvbT4uCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2hhcGVyLmMgKGFmX3NoYXBlcl9nZXRfY292ZXJhZ2UpCi0JWyFGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWl06IFVwZGF0ZSBzaWduYXR1cmUuCi0KLTIwMTYtMDEtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVN0aWxsIGhhbmRsZSBgX19GVEVSUk9SU19IX18nLgotCi0JV2UgbmVlZCB0aGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBKb2huIEVtbWFzIDxqb2huZTUzQHRpc2NhbGkuY28udWs+LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmg6IEZpeCBpbmNsdXNpb24gZ3VhcmQgc28gdGhhdAotCXVuZGVmaW5pbmcgZWl0aGVyIGBGVEVSUk9SU19IXycgb3IgYF9fRlRFUlJPUlNfSF9fJyB3b3JrcyBhcwotCWV4cGVjdGVkLgotCi0yMDE2LTAxLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gRml4IGhhbmRsaW5nIG9mIGRlZmF1bHQgc2NyaXB0LgotCi0JUGF0Y2ggdGFrZW4gZnJvbSB0dGZhdXRvaGludCwgY29tbWl0Ci0JMDcxYWUyYzAwZTBkNjdmOWQxOTQxOGY0ZmFkZTFjMjNkMjdkYzE4NS4KLQotCVRoZXJlIHdlcmUgdHdvIGJ1Z3MuCi0KLQkgIC0gV2Ugbm93IHVzZSBub24tc3RhbmRhcmQgc2NyaXB0IHRhZ3MgbGlrZSBga2htcycgZm9yIHNwZWNpYWwKLQkgICAgcHVycG9zZXMuICBIb3dldmVyLCBIYXJmQnV6eiBtYXBzIHN1Y2ggdGFncyB0byBgREZMVCcsIGFuZAotCSAgICB3aXRob3V0IHRoaXMgY29tbWl0IHRoZSBhc3NvY2lhdGVkIGxvb2t1cHMgd2VyZSBpbmNvcnJlY3RseQotCSAgICBhc3NpZ25lZCB0byB0aGUgbm9uLXN0YW5kYXJkIHRhZ3MuCi0KLQkgIC0gTGV0J3MgYXNzdW1lIHdlIGhhdmUgYSBCZW5nYWxpIGZvbnQsIGFuZCB0aGUgZm9udCdzIGBERkxUJwotCSAgICBzY3JpcHQgdGFnIGhhbmRsZXMgdGhlIG5lY2Vzc2FyeSBsb29rdXBzIGZvciBCZW5nYWxpLCB0b28uCi0JICAgIFdpdGhvdXQgdGhpcyBjb21taXQsIHRoZSBgREZMVCcgbG9va3VwcyB3ZXJlIGFzc2lnbmVkIHRvCi0JICAgIHR0ZmF1dG9oaW50J3MgZGVmYXVsdCBzY3JpcHQgKHVzdWFsbHkgYGxhdG4nKSBiZWZvcmUgdGhlCi0JICAgIHN0YW5kYXJkIGxvb2t1cHMgZm9yIEJlbmdhbGkgd2VyZSBoYW5kbGVkLgotCi0JICAgIFdlIG5vdyBoYXZlIHRoZSBmb2xsb3dpbmcgb3JkZXIgd2hpbGUgc2VhcmNoaW5nIGZvciBjb3ZlcmVkCi0JICAgIGdseXBoIGluZGljZXMuCi0KLQkgICAgICBzcGVjaWFsIGZlYXR1cmVzIG9mIHNjcmlwdHMgKGUuZy4gYHN1cHMnIGZvciBDeXJpbGxpYykKLQkgICAgICBVbmljb2RlIG1hcHBpbmdzIG9mIHNjcmlwdHMKLQkgICAgICByZW1haW5pbmcgZmVhdHVyZXMgb2Ygc2NyaXB0cyAoZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIEluZGljCi0JICAgICAgICBzY3JpcHRzKQotCSAgICAgIGRlZmF1bHQgZmVhdHVyZXMgb2YgZGVmYXVsdCBzY3JpcHQKLQotCSogc3JjL2F1dG9maXQvYWZzaGFwZXIuYywgc3JjL2F1dG9maXQvYWZzaGFwZXIuaAotCShhZl9zaGFwZXJfZ2V0X2NvdmVyYWdlKTogQWRkIGJvb2xlYW4gcGFyYW1ldGVyIHRvIGluZGljYXRlIGRlZmF1bHQKLQlzY3JpcHQuCi0JVXBkYXRlIGFsbCBjYWxsZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zdHlsZV9jb3ZlcmFnZSk6Ci0JRml4IHNlYXJjaCBvcmRlciBmb3IgY292ZXJhZ2VzLgotCi0yMDE2LTAxLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlWYXJpb3VzIG1pbm9yIGNsYW5nIGZpeGVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfbWV0cmljc19pbml0X3dpZHRocyksCi0Jc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzKTogSW5pdGlhbGl6ZQotCWBjaCcuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NdWxGaXgpIFtGVF9MT05HNjRdOiBBZGQgY2FzdC4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYyAoZnRfbWVtX3RhYmxlX2Rlc3Ryb3kpOiBBZGQgY2FzdC4KLQotCSogc3JjL2Jhc2UvZnRoYXNoLmMgKGhhc2hfbnVtX2xvb2t1cCk6IEFkZCBjYXN0LgotCi0JKiBzcmMvYmFzZS9mdHRyaWdvbi5jIChmdF90cmlnX2Rvd25zY2FsZSkgW0ZUX0xPTkc2NF06IEZpeCBjYXN0LgotCi0JKiBzcmMvZ3h2YWxpZC9neHZjb21tbi5jIChneHZfRW50cnlUYWJsZV92YWxpZGF0ZSk6IENvbW1lbnQgb3V0Ci0JcmVkdW5kYW50IGNvZGUuCi0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9nZXRfcHNfZm9udF92YWx1ZSkgPFBTX0RJQ1RfU1VCUj46IEFkZAotCWNhc3QuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2Vfc3VicnMpOiBGaXggdHlwZSBvZiBgY291bnQnLgotCi0yMDE2LTAxLTE5ICBEZXJlayBCLiBOb29uYnVyZyAgPGRlcmVrbkBnbHlwaGFuZGNvZy5jb20+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCBhbm90aGVyIHRyaWNreSBmb250LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKFRSSUNLX1NGTlRfSURTX05VTV9GQUNFUyk6IEluY3JlYXNlLgotCShzZm50X2lkKTogQWRkIHZhcmlhbnQgb2YgYERGS2FpU2h1Jy4KLQotMjAxNi0wMS0xNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEVtcG93ZXIgYEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cycuCi0KLQkqIHNyYy9iYXNlL2Z0bGNkZmlsLmMgKEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cyk6IEVuYWJsZSBmaWx0ZXIKLQlpbiBhZGRpdGlvbiB0byBzZXR0aW5nIHdlaWdodHMuCi0JKEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKTogQ2xlYW4gb3V0IEZUX0ZPUkNFX0xJR0hUX0xDRF9GSUxURVIgYW5kCi0JRlRfRk9SQ0VfTEVHQUNZX0xDRF9GSUxURVIuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmg6IERvY3VtZW50YXRpb24gdXBkYXRlLgotCi0yMDE2LTAxLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlEb24ndCB1c2UgbWFjcm8gbmFtZXMgdGhhdCBzdGFydCB3aXRoIGBfW0EtWl0nIFszLzNdLgotCi0JU3VjaCBtYWNybyBuYW1lcyBhcmUgcmVzZXJ2ZWQgZm9yIGJvdGggQyBhbmQgQysrLgotCi0JKiBzcmMvY2FjaGUvZnRjY2FjaGUuaDogcy9fRlRDX0ZBQ0VfSURfSEFTSC9GVENfRkFDRV9JRF9IQVNILy4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKEZUQ19DQUNIRV9MT09LVVBfQ01QKTogUmVwbGFjZSBgX1hYWCcgd2l0aCBgWFhYXycuCi0JKiBzcmMvY2FjaGUvZnRjbXJ1LmMgKEZUQ19NUlVMSVNUX0xPT0tVUF9DTVApOiBEaXR0by4KLQotMjAxNi0wMS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRG9uJ3QgdXNlIG1hY3JvIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBgX1tBLVpdJyBbMi8zXS4KLQotCVN1Y2ggbWFjcm8gbmFtZXMgYXJlIHJlc2VydmVkIGZvciBib3RoIEMgYW5kIEMrKy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgsIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYywKLQlzcmMvc21vb3RoL2Z0Z3JheXMuYywgc3JjL3Ntb290aC9mdGdyYXlzLmg6Ci0Jcy9fU1RBTkRBTE9ORV8vU1RBTkRBTE9ORV8vLgotCi0yMDE2LTAxLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlEb24ndCB1c2UgbWFjcm8gbmFtZXMgdGhhdCBzdGFydCB3aXRoIGBfW0EtWl0nIFsxLzNdLgotCi0JU3VjaCBtYWNybyBuYW1lcyBhcmUgcmVzZXJ2ZWQgZm9yIGJvdGggQyBhbmQgQysrLgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jOiBSZXBsYWNlIG1hY3JvcyBvZiB0aGUgZm9ybSBgX0JERl9YWFgnIHdpdGgKLQlgQkRGX1hYWF8nLgotCi0yMDE2LTAxLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlEb24ndCB1c2UgbWFjcm8gbmFtZXMgdGhhdCBjb250YWluIGBfXycgWzIvMl0uCi0KLQlTdWNoIG1hY3JvIG5hbWVzIGFyZSByZXNlcnZlZCBmb3IgYm90aCBDIGFuZCBDKysuCi0KLQkqIHNyYy9jYWNoZS8qOiBzL19fL18vLgotCi0yMDE2LTAxLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlEb24ndCB1c2UgbWFjcm8gbmFtZXMgdGhhdCBjb250YWluIGBfXycgWzEvMl0uCi0KLQlTdWNoIG1hY3JvIG5hbWVzIGFyZSByZXNlcnZlZCBmb3IgYm90aCBDIGFuZCBDKysuCi0KLQkqICovKjogUmVwbGFjZSBtYWNyb3Mgb2YgdGhlIGZvcm0gYF9fWFhYX0hfXycgd2l0aCBgWFhYX0hfJy4KLQotMjAxNi0wMS0xMCAgSmVyZWQgR3JheSAgPGplZ3JheUBnb29nbGUuY29tPgotCi0JW2NmZl0gRml4IHVzYWdlIG9mIGB8JyBvcGVyYXRvci4KLQotCSogc3JjL2NmZi9jZjJpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSBbY2YyX2NtZEVYVEVOREVETk1CUiwKLQlkZWZhdWx0XTogYHwnIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHByb2Nlc3NlZCBmcm9tIGxlZnQgdG8gcmlnaHQKLQlieSB0aGUgY29tcGlsZXIuICBIb3dldmVyLCB0aGUgY29kZSByZXBlYXRlZGx5IGNhbGxzCi0JYGNmMl9idWZfcmVhZEJ5dGUnIHRvIGdldCB0aGUgYXJndW1lbnRzIHRvIGB8JyAuLi4gIEZpeCB0aGlzLgotCi0yMDE1LTEyLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWFrZSB0b3AtdG8tYm90dG9tIGhpbnRpbmcgd29yayBpbiBsYXRpbiBhdXRvLWhpbnRlci4KLQotCVRoaXMgaW1wcm92ZXMgcmVuZGVyaW5nIG9mIHNjcmlwdHMgbGlrZSBCZW5nYWxpIG9yIERldmFuYWdhcmkuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfYXhpc19oaW50c19uZXdfZWRnZSk6IEFkZCBwYXJhbWV0ZXIgdG8KLQlwYXNzIHRvcC10by1ib3R0b20gaGludGluZyBmbGFnLiAgVGhpcyBtYWtlcyB0aGUgZnVuY3Rpb24gc29ydCBlZGdlcwotCWluIGRlc2NlbmRpbmcgdmVydGljYWwgcG9zaXRpb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYzogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19jb21wdXRlX2VkZ2VzLAotCWFmX2xhdGluX2hpbnRfZWRnZXMpOiBVc2UgYHRvcF90b19ib3R0b21faGludGluZycgZmxhZy4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX2hpbnRzX2NvbXB1dGVfZWRnZXMpLAotCXNyYy9hdXRvZml0L2FmbGF0aW4yLmMgKGFmX2xhdGluMl9oaW50c19jb21wdXRlX2VkZ2VzKTogVXBkYXRlZC4KLQotMjAxNS0xMi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkZCBoaW50aW5nIGRpcmVjdGlvbiB0byBgQUZfU2NyaXB0Q2xhc3NSZWMnLgotCi0JU3RpbGwgdW51c2VkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChTQ1JJUFQpOiBIYW5kbGUgaGludGluZyBkaXJlY3Rpb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCAoQUZfU2NyaXB0Q2xhc3NSZWMpOiBBZGQKLQlgdG9wX3RvX2JvdHRvbV9oaW50aW5nJyBmaWVsZC4KLQkoQUZfSElOVElOR19CT1RUT01fVE9fVE9QLCBBRl9ISU5USU5HX1RPUF9UT19CT1RUT00pOiBOZXcgbWFjcm9zLgotCShBRl9ERUZJTkVfU0NSSVBUX0NMQVNTKTogVXBkYXRlZC4KLQotMjAxNS0xMi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFN0YXJ0IGltcGxlbWVudGluZyBoaW50aW5nIGRpcmVjdGlvbiAodXAvZG93biwgZG93bi91cCkuCi0KLQlSaWdodCBub3csIGl0IGRvZXMgbm90aGluZy4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIGFub3RoZXIgcGFyYW1ldGVyIHRvIGBTQ1JJUFQnLAotCXNwZWNpZnlpbmcgaGludGluZyBkaXJlY3Rpb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMsIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmgsCi0Jc3JjL2F1dG9maXQvYWZwaWMuYywgc3JjL2F1dG9maXQvYWZyYW5nZXMuaCwgc3JjL2F1dG9maXQvYWZzaGFwZXIuYywKLQlzcmMvYXV0b2ZpdC9hZnR5cGVzLmg6IEV4dGVuZCBgU0NSSVBUJyBkZWZpbml0aW9ucy4KLQotMjAxNS0xMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX3N1YnJzKTogRml4IG1lbW9yeSBsZWFrICgjNDY3NDQpLgotCi0yMDE1LTEyLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gTWFrZSBoYXNoIGludGVyZmFjZSBzeW1tZXRyaWMuCi0KLQlVc2UgYG51bScgYW5kIGBzdHInIGluZml4ZXMgZXZlcnl3aGVyZS4KLQotCSogc3JjL2Jhc2UvZnRoYXNoLmMgKGZ0X2hhc2hfaW5pdCk6IFJlbmFtZWQgdG8uLi4KLQkoaGFzaF9pbml0KTogLi4uIFRoaXMuCi0JKGZ0X2hhc2hfc3RyX2luaXQsIGZ0X2hhc2hfbnVtX2luaXQpOiBOZXcgZnVuY3Rpb25zLgotCShmdF9oYXNoX2ZyZWUpOiBSZW5hbWVkIHRvLi4uCi0JKGZ0X2hhc2hfc3RyX2ZyZWUpOiAuLi4gVGhpcy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaDogVXBkYXRlZC4KLQotCSogc3JjL2JkZi9iZGZsaWIuYywgc3JjL3R5cGUxL3QxbG9hZC5jLCBzcmMvdHlwZTEvdDFvYmpzLmM6IFVwZGF0ZWQuCi0KLTIwMTUtMTItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gQXZvaWQgc2hpZnQgb2YgbmVnYXRpdmUgbnVtYmVycyAoIzQ2NzMyKS4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9zdWJycyk6IERvIGl0LgotCi0yMDE1LTEyLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTEsIHBzYXV4XSBIYW5kbGUgbGFyZ2UgdmFsdWVzIG9mIG51bV9zdWJycyBjb3JyZWN0bHkgKCM0NjY5MikuCi0KLQlXZSBub3cgdXNlIGEgaGFzaCB0byBtYXAgZnJvbSBzdWJyIGluZGljZXMgdG8gYXJyYXkgZWxlbWVudHMgaG9sZGluZwotCXRoZSBzdWJyb3V0aW5lcywgaWYgbmVjZXNzYXJ5LgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaDogSW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0guCi0JKFQxX0ZvbnRSZWMpOiBBZGQgYHN1YnJzX2hhc2gnIGZpZWxkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg6IEluY2x1ZGUgRlRfSU5URVJOQUxfSEFTSF9ILgotCShUMV9EZWNvZGVyUmVjKTogQWRkIGBzdWJyc19oYXNoJyBmaWVsZC4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5oIChUMV9Mb2FkZXJSZWMpOiBBZGQgYHN1YnJzX2hhc2gnIGZpZWxkLgotCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0guCi0JKHQxX3BzX2dldF9mb250X3ZhbHVlKSBbUFNfRElDVF9TVUJSXTogTG9vayB1cCBoYXNoIGlmIG5lY2Vzc2FyeS4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX0hBU0hfSC4KLQkocGFyc2Vfc3VicnMpOiBVc2UgaGFzaCBmb3Igc3ViciBpbmRpY2VzIHRoYXQgZXhjZWVkIHRoZSBhbGxvY2F0ZWQKLQludW1iZXIgb2Ygc3ViciBzbG90cy4KLQkodDFfaW5pdF9sb2FkZXIpOiBSZW1vdmUgdW5uZWNlc3NhcnkgY29kZS4KLQkodDFfZG9uZV9sb2FkZXIsIFQxX09wZW5fRmFjZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX0NvbXB1dGVfTWF4X0FkdmFuY2UsIFQxX0dldF9BZHZhbmNlcywKLQlUMV9Mb2FkX0dseXBoKTogVXBkYXRlZC4KLQotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0RvbmUpOiBVcGRhdGVkLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0guCi0JKHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpIFtvcF9jYWxsc3Vicl06IExvb2sgdXAgaGFzaCBpZgotCW5lY2Vzc2FyeS4KLQotCSogc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfbG9hZF9nbHlwaCk6IFVwZGF0ZWQuCi0KLTIwMTUtMTItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBUaGlua286IFJlbW92ZSBmcmVlIGZ1bmN0aW9uIHBvaW50ZXIuCi0KLQlXZSBkb24ndCBjb3B5IGtleXMgb3IgdmFsdWVzIHdoaWxlIGhhc2hpbmcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmggKEZUX0hhc2hfRnJlZUZ1bmMpOiBSZW1vdmVkLgotCShGVF9IYXNoUmVjKTogUmVtb3ZlIGBmcmVlJyBmaWVsZC4KLQotCSogc3JjL2Jhc2UvZnRoYXNoLmMgKGhhc2hfc3RyX2ZyZWUpOiBSZW1vdmVkLgotCShmdF9oYXNoX2luaXQsIGZ0X2hhc2hfZnJlZSk6IFVwZGF0ZWQuCi0KLTIwMTUtMTItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlLCBiZGZdIERvbid0IGV4cG9zZSBgRlRfSGFzaG5vZGUnIGluIGhhc2ggZnVuY3Rpb25zLgotCi0JKiBzcmMvYmFzZS9mdGhhc2guYyAoaGFzaF9sb29rdXAsIGZ0X2hhc2hfc3RyX2xvb2t1cCwKLQlmdF9oYXNoX251bV9sb29rdXApOiBSZXR1cm4gcG9pbnRlciB0byBgc2l6ZV90JyBpbnN0ZWFkIG9mCi0JYEZUX0hhc2hub2RlJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaDogVXBkYXRlZC4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoYmRmX2dldF9wcm9wZXJ0eSwgX2JkZl9hZGRfcHJvcGVydHksCi0JYmRmX2dldF9mb250X3Byb3BlcnR5KTogVXBkYXRlZC4KLQotMjAxNS0xMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2UsIGJkZl0gQWRkIG51bWJlciBoYXNoaW5nLgotCi0JKiBzcmMvYmFzZS9mdGhhc2guYyAoaGFzaF9udW1fbG9va3VwLCBoYXNoX251bV9jb21wYXJlKTogTmV3Ci0JZnVuY3Rpb25zLgotCShmdF9oYXNoX2luaXQpOiBBZGQgYXJndW1lbnQgdG8gc2VsZWN0IGJldHdlZW4gbnVtYmVyIGFuZCBzdHJpbmcKLQloYXNoaW5nLgotCShmdF9oYXNoX251bV9pbnNlcnQsIGZ0X2hhc2hfbnVtX2xvb2t1cCk6IE5ldyBmdW5jdGlvbnMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmg6IFVwZGF0ZWQuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcGFyc2Vfc3RhcnQpOiBVcGRhdGVkLgotCi0yMDE1LTEyLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gSW50cm9kdWNlIGhhc2ggbG9va3VwLCBjb21wYXJlLCBhbmQgZnJlZSBmdW5jdGlvbiBwb2ludGVycy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guYyAoRlRfSGFzaF9Mb29rdXBGdW5jLAotCUZUX0hhc2hfQ29tcGFyZUZ1bmMsIEZUX0hhc2hfRnJlZUZ1bmMpOiBOZXcgdHlwZWRlZnMuCi0JKEZUX0hhc2hSZWMpOiBBZGQgYGxvb2t1cCcsIGBjb21wYXJlJywgYW5kIGBmcmVlJyBmaWVsZHMuCi0KLQkqIHNyYy9iYXNlL2Z0aGFzaC5jIChoYXNoX3N0cl9sb29rdXAsIGhhc2hfc3RyX2NvbXBhcmUsCi0JaGFzaF9zdHJfZnJlZSk6IE5ldyBmdW5jdGlvbnMuCi0JKGZ0X2hhc2hfaW5pdCk6IFNldCBmdW5jdGlvbiBwb2ludGVycy4KLQkoaGFzaF9idWNrZXQsIGZ0X2hhc2hfZnJlZSk6IFVzZSB0aGVtLgotCi0yMDE1LTEyLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZSwgYmRmXSBVc2UgYSB1bmlvbiBhcyBhIGhhc2gga2V5LgotCi0JV2Ugd2FudCB0byBzdXBwb3J0IGJvdGggYW4gaW50ZWdlciBhbmQgYSBzdHJpbmcga2V5IGxhdGVyIG9uLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0aGFzaC5oIChGVF9IYXNoa2V5KTogTmV3IHVuaW9uLgotCShGVF9IYXNobm9kZVJlYyk6IFVwZGF0ZWQuCi0JKGZ0X2hhc2hfaW5zZXJ0LCBmdF9oYXNoX2xvb2t1cCk6IFJlbmFtZWQgdG8gLi4uCi0JKGZ0X2hhc2hfc3RyX2luc2VydCwgZnRfaGFzaF9zdHJfbG9va3VwKTogLi4uIHRoaXMuCi0KLQkqIHNyYy9iYXNlL2Z0aGFzaC5jIChoYXNoX2J1Y2tldCk6IFVwZGF0ZWQuCi0JKGZ0X2hhc2hfaW5zZXJ0LCBmdF9oYXNoX2xvb2t1cCk6IFJlbmFtZWQgdG8gLi4uCi0JKGhhc2hfaW5zZXJ0LCBoYXNoX2xvb2t1cCk6IC4uLiB0aGlzLgotCShmdF9oYXNoX3N0cl9pbnNlcnQsIGZ0X2hhc2hfc3RyX2xvb2t1cCk6IE5ldyB3cmFwcGVyIGZ1bmN0aW9ucy4KLQotCSogc3JjL2JkZi9iZGZsaWIuYzogVXBkYXRlZC4KLQotMjAxNS0xMi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gVXNlIG5ldyBoYXNoIGZ1bmN0aW9ucy4KLQotCSogc3JjL2JkZi9iZGYuaDogSW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0guCi0JKGhhc2hub2RlLCBoYXNodGFibGUpOiBSZW1vdmVkLgotCShiZGZfZm9udF90KTogVXNlIGBGVF9IYXNoUmVjJyB0eXBlIGZvciBgcHJvcHRibCcuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmM6IFJlbW92ZSBhbGwgaGFzaCBmdW5jdGlvbnMuCi0JVXBkYXRlIGNvZGUgZm9yIG5ldyBoYXNoIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb24gbmFtZXMuCi0KLTIwMTUtMTItMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiZGYsIGJhc2VdIExpZnQgaGFzaCBmdW5jdGlvbnMgZnJvbSBiZGYgZHJpdmVyIHRvIGJhc2UgbW9kdWxlLgotCi0JKiBzcmMvYmFzZS9mdGhhc2guYywgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaDogTmV3IGZpbGVzLAotCWNvbnRhaW5pbmcgKG1hc3NhZ2VkKSBjb2RlIGZyb20gYGJkZmxpYi5jJyBhbmQgYGJkZi5oJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oIChGVF9JTlRFUk5BTF9IQVNIX0gpOiBOZXcKLQltYWNyby4KLQotCSogc3JjL2Jhc2UvZnRiYXNlLmM6IEluY2x1ZGUgYGZ0aGFzaC5jJy4KLQotCSogc3JjL2Jhc2UvSmFtZmlsZSAoX3NvdXJjZXMpOiBBZGQgYGZ0aGFzaCcuCi0KLQkqIHNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyk6IEFkZCBgZnRoYXNoLmMnLgotCi0JKiBkb2NzL0xJQ0VOU0UuVFhUOiBVcGRhdGVkLgotCi0yMDE1LTEyLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIGJsdWUtem9uZSBzdXBwb3J0IGZvciBCZW5nYWxpIHNjcmlwdC4KLQotCVRoaXMgZXNzZW50aWFsbHkgbW92ZXMgdGhlIEJlbmdhbGkgc2NyaXB0IGZyb20gdGhlIGBJbmRpYycgaGludGVyIHRvCi0JdGhlIGBMYXRpbicgaGludGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIEJlbmdhbGkuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBCZW5nYWxpIHN0YW5kYXJkIGNoYXJhY3RlcnMgYW5kIG1vdmUKLQlkYXRhIG91dCBvZiBBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBNb3ZlIEJlbmdhbGkgZGF0YSBvdXQgb2YKLQlBRl9DT05GSUdfT1BUSU9OX0lORElDIGJsb2NrLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBVcGRhdGUgQmVuZ2FsaSBkYXRhOyBpbiBwYXJ0aWN1bGFyLCB1c2UKLQlBRl9XUklUSU5HX1NZU1RFTV9MQVRJTi4KLQotMjAxNS0xMi0xNCAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdtYWlsLmNvbT4KLQotCVtiZGZdIFJlbW92ZSBkZWFkIGNvZGUgKCM0NjYyNSkuCi0KLQlUaGUgQkRGIHNwZWNpZmljYXRpb24gb25seSBhbGxvd3MgZGVjaW1hbCBudW1iZXJzLCBubyBvY3RhbCBvcgotCWhleGFkZWNpbWFsIGRlY29kaW5nIGlzIG5lZWRlZC4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9hdG91bCwgX2JkZl9hdG9sLCBfYmRmX2F0b3VzLAotCV9iZGZfYXRvcyk6IFJlbW92ZSB1bnVzZWQgY29kZSBhbmQgcGFyYW1ldGVycy4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKG9kaWdpdHMpOiBSZW1vdmUuCi0KLTIwMTUtMTItMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBGaXggY2FsbHMgdG8gYEZUX1N0cmVhbV9TZWVrJy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1hY19SZWFkX3NmbnRfUmVzb3VyY2UsIEZUX09wZW5fRmFjZSk6IFNldAotCWBlcnJvcicuCi0KLTIwMTUtMTItMTQgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gQ2hlY2sgZXJyb3Igd2hlbiBzZWVraW5nIHRvIGRhdGEgc3VwcGxpZWQgb2Zmc2V0ICgjNDY2MzUpLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAob3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW0pOgotCWBmdF9sb29rdXBfUFNfaW5fc2ZudF9zdHJlYW0nIHJldHVybnMgb2Zmc2V0IGFuZCBsZW5ndGggZnJvbQotCXVzZXIgc3VwcGxpZWQgZGF0YS4gIFVzZSBvZiB0aGlzIHRoZXNlIHZhbHVlcyBtdXN0IGJlIGNoZWNrZWQuCi0KLTIwMTUtMTItMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgTXlhbm1hciBzY3JpcHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgTXlhbm1hci4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIE15YW5tYXIgc3RhbmRhcmQgY2hhcmFjdGVycy4KLQotCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYzogQWRkIE15YW5tYXIgZGF0YS4KLQotCSogc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIE15YW5tYXIgZGF0YS4KLQotMjAxNS0xMi0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcyk6IE1pbm9yLgotCi0yMDE1LTEyLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEF2b2lkIHBvdGVudGlhbCBjcmFzaC4KLQotMjAxNS0xMi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFJlc3RvcmUgT3BlblR5cGUgZmVhdHVyZSBjaGVjay4KLQotCVRoaXMgd2FzIHJlbW92ZWQgd2hpbGUgcmV3cml0aW5nIHRoZSBIYXJmQnV6eiBpbnRlcmZhY2UuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmggKEFGX0ZhY2VHbG9iYWxzUmVjKTogQWRkIGBoYl9idWYnIGZpZWxkIHRvCi0JaG9sZCBpbnRlcm5hbCBIYXJmQnV6eiBidWZmZXIsIG5lZWRlZCBmb3IgZmVhdHVyZSBjb21wYXJpc29uLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfbmV3LAotCWFmX2ZhY2VfZ2xvYmFsc19mcmVlKTogSW5pdGlhbGl6ZSBhbmQgZGVzdHJveSBgaGJfYnVmJy4KLQotCSogc3JjL2F1dG9maXQvYWZzaGFwZXIuYyAoYWZfc2hhcGVyX2dldF9jbHVzdGVyKTogQ29tcGFyZSBjaGFyYWN0ZXIKLQkoY2x1c3Rlcikgd2l0aCBhbmQgd2l0aG91dCBhcHBsaWVkIGZlYXR1cmUuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogRml4IHRyYWNpbmcKLQltZXNzYWdlLgotCi0yMDE1LTEyLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gUmVtb3ZlIHJlZHVuZGFudCBjb2RlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMpOiBEbyBpdC4KLQotMjAxNS0xMi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFRoaW5rby4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBEb24ndCBjb3VudAotCWVtcHR5IGJsdWUgem9uZXMgKGJ1ZyBpbnRyb2R1Y2VkIDIwMTUtMTItMDYpLgotCi0yMDE1LTEyLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW50cm9kdWNlIHN1YnNjcmlwdCB0b3AgYmx1ZSB6b25lcy4KLQotCVRoaXMgZmVhdHVyZSBpcyBtYWlubHkgZm9yIEtobWVyOiBUaGUgaWRlYSBpcyB0byBhdm9pZCBhIGNsYXNoCi0JYmV0d2VlbiB0aGUgdG9wIG9mIHN1YnNjcmlwdCBnbHlwaHMgYW5kIHRoZSBib3R0b20gb2Ygbm9ybWFsCi0JYmFzZWxpbmUgZ2x5cGhzLgotCi0JVGhpcyBvbmx5IHdvcmtzIGZvciBjaGFyYWN0ZXIgY2x1c3RlcnMgbWFwcGVkIHRvIG11bHRpcGxlIGdseXBocy4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIHN1YnNjcmlwdCB0b3AgYmx1ZSB6b25lIGZvciBLaG1lci4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmhpbiAoQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9TVUJfVE9QKTogTmV3Ci0JbWFjcm8uCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uaCAoQUZfTEFUSU5fSVNfU1VCX1RPUF9CTFVFLAotCUFGX0xBVElOX0JMVUVfU1VCX1RPUCk6IE5ldyBtYWNyb3MuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogSGFuZGxlIG5ldwotCWJsdWUgem9uZSBwcm9wZXJ0eS4KLQlVcGRhdGUgdHJhY2luZyBtZXNzYWdlcy4KLQkoYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0pOiBIYW5kbGUgbmV3IGJsdWUgem9uZSBwcm9wZXJ0eS4KLQkoYWZfbGF0aW5faGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKTogVXBkYXRlZC4KLQotMjAxNS0xMi0wOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCB0cmFjaW5nIG1lc3NhZ2UuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0pOiBEaXNwbGF5Ci0JaW5hY3RpdmUgYmx1ZSB6b25lcyBhbHNvLgotCi0yMDE1LTEyLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBtb3JlIEtobWVyIGNsdXN0ZXJzLgotCi0JU29tZSBmb250cyBoYXZlIGluY29ycmVjdCBsaWdhdHVyZXM7IHdlIG5lZWQgbW9yZSBzYW1wbGVzIHRvIGdldCBhCi0JZ29vZCBtZWFuIHZhbHVlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0yMDE1LTEyLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gVHlwb3MuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2hhcGVyLmMgKGFmX3NoYXBlcl9idWZfY3JlYXRlLCBhZl9zaGFwZXJfZ2V0X2VsZW0pCi0JWyFGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWl06IE1ha2UgaXQgY29tcGlsZS4KLQotMjAxNS0xMi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBLaG1lciBzY3JpcHQuCi0KLQlXZSBzcGxpdCBLaG1lciBpbnRvIHR3byBhdXRvLWhpbnRlciBzY3JpcHRzOiBgS2htZXInIChga2htcicpIGFuZAotCWBLaG1lciBzeW1ib2xzJyAoYGtobXMnLCBVKzE5RTAtVSsxOUZGKS4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBLaG1lci4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIEtobWVyIHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmM6IEFkZCBLaG1lciBkYXRhLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgS2htZXIgZGF0YS4KLQotMjAxNS0xMi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFJld3JpdGUgSGFyZkJ1enogaW50ZXJmYWNlIHRvIHN1cHBvcnQgY2hhcmFjdGVyIGNsdXN0ZXJzLgotCi0JU2NyaXB0cyBsaWtlIEtobWVyIGhhdmUgYmx1ZSB6b25lcyB0aGF0IGNhbid0IGJlIGRpcmVjdGx5Ci0JcmVwcmVzZW50ZWQgYnkgVW5pY29kZSBjaGFyYWN0ZXJzLiAgSW5zdGVhZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxldAotCUhhcmZCdXp6IGNvbnZlcnQgY2hhcmFjdGVyIGNsdXN0ZXJzIGludG8gcHJvcGVyIGdseXBoIHJlcHJlc2VudGF0aW9uCi0JZm9ybXMsIHRoZW4gZGVyaXZpbmcgdGhlIGJsdWUgem9uZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXN1bHRpbmcKLQlnbHlwaHMuCi0KLQkqIHNyYy9hdXRvZml0L2hic2hpbS5jLCBzcmMvYXV0b2ZpdC9oYnNoaW0uaDogUmVwbGFjZWQgYnkuLi4KLQkqIHNyYy9hdXRvZml0L2Fmc2hhcGVyLmMsIHNyYy9hdXRvZml0L2Fmc2hhcGVyLmg6IC4uLiB0aGVzZSB0d28gbmV3Ci0JZmlsZXMsIHByb3ZpZGluZyBhIG5ldyBBUEkgdG8gYWNjZXNzIEhhcmZCdXp6LgotCi0JVGhlIG5ldyBBUEkgbWFuYWdlcyBhIEhhcmZCdXp6IGJ1ZmZlciB3aXRoIGBhZl9zaGFwZXJfYnVmX2NyZWF0ZScKLQlhbmQgYGFmX3NoYXBlcl9idWZfZGVzdHJveScuICBUaGUgYnVmZmVyIHJlY2VpdmVzIGEgVVRGOCBlbmNvZGVkCi0Jc3RyaW5nIHdpdGggZnVuY3Rpb24gYGFmX3NoYXBlcl9nZXRfY2x1c3RlcicsIGFuZCB0aGUgcmVzdWx0aW5nCi0JZ2x5cGggZGF0YSAoaW5kaWNlcywgYWR2YW5jZSB3aWR0aHMsIHZlcnRpY2FsIG9mZnNldHMpIGNhbiBiZQotCWl0ZXJhdGl2ZWx5IGFjY2Vzc2VkIHdpdGggZnVuY3Rpb24gYGFmX3NoYXBlcl9nZXRfZWxlbScuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19tZXRyaWNzX2luaXRfd2lkdGhzLAotCWFmX2Nqa19tZXRyaWNzX2luaXRfYmx1ZXMsIGFmX2Nqa19tZXRyaWNzX2NoZWNrX2RpZ2l0cyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocywKLQlhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMsIGFmX2xhdGluX21ldHJpY3NfY2hlY2tfZGlnaXRzKToKLQlVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogcy9hZmhhcmZidXp6L2Fmc2hhcGVyLy4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYzogcy9oYnNoaW0uaC9hZnNoYXBlci5oLy4KLQkoYWZfZmFjZV9nbG9iYWxzX2NvbXB1dGVfc3R5bGVfY292ZXJhZ2UpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oOiBzL2hic2hpbS5oL2Fmc2hhcGVyLmgvLgotCi0JKiBzcmMvYXV0b2ZpdC9hdXRvZml0LmM6IHMvaGJzaGltLmMvYWZzaGFwZXIuYy8uCi0KLQkqIHNyYy9hdXRvZml0L0phbWZpbGUsIHNyYy9hdXRvZml0L3J1bGVzLm1rIChBVVRPRl9EUlZfU1JDKToKLQlVcGRhdGVkLgotCi0yMDE1LTEyLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gUHJlcGFyZSBmb3J0aGNvbWluZyBjaGFuZ2VzLgotCi0JVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gY29udHJvbCB0aGUgY29tbWl0cy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBBZGQgZHVtbXkKLQlsb29wLiAgTm8gZnVuY3Rpb25hbCBjaGFuZ2UuCi0KLTIwMTUtMTItMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBVc2Ugc3RyaW5nIG9mIHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQlUaGlzIGlzIG1vcmUgZmxleGlibGU7IGFkZGl0aW9uYWxseSwgaXQgd291bGQgYWxsb3cgY2hhcmFjdGVyCi0JY2x1c3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmdHlwZXMuaCAoU0NSSVBULCBBRl9ERUZJTkVfU0NSSVBUX0NMQVNTKTogVXBkYXRlZC4KLQkoQUZfU2NyaXB0Q2xhc3NSZWMpOiBSZXBsYWNlIGBzdGFuZGFyZF9jaGFyWzEyM10nIHdpdGgKLQlgc3RhbmRhcmRfY2hhcnN0cmluZycuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IFJlcGxhY2UgbGFzdCB0aHJlZSBjaGFyYWN0ZXIgYXJndW1lbnRzCi0Jb2YgdGhlIGBTQ1JJUFQnIGNhbGxzIHdpdGggYSBzdHJpbmcgcGFyYW1ldGVyLCBob2xkaW5nIHRoZSBzdGFuZGFyZAotCWNoYXJhY3RlcnMgKGluIFVURi04IGVuY29kaW5nKSBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMsIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmgsCi0Jc3JjL2F1dG9maXQvYWZwaWMuYywgc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvaGJzaGltLmMKLQkoU0NSSVBUKTogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMpLAotCXNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyk6IFVwZGF0ZWQuCi0KLTIwMTUtMTItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogU2VwYXJhdGUgYmx1ZSB6b25lIGNoYXJhY3RlcnMgd2l0aCBzcGFjZXMuCi0KLQlBbm90aGVyIHByZXBhcmF0aW9uIGZvciBjaGFyYWN0ZXIgY2x1c3RlciBzdXBwb3J0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQuYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0yMDE1LTEyLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9hZmJsdWUucGwgKGNvbnZlcnRfYXNjaWlfY2hhcnMpOiBEb24ndCBpZ25vcmUgc3BhY2VzLgotCi0JSW5zdGVhZCwgcmVkdWNlIG11bHRpcGxlIHNwYWNlcyB0byBhIHNpbmdsZSBvbmUuICBXZSBuZWVkIHRoaXMgbGF0ZXIKLQlmb3Igc3VwcG9ydGluZyBjaGFyYWN0ZXIgY2x1c3RlcnMgaW4gYGFmYmx1ZS5kYXQnLgotCi0yMDE1LTEyLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5oaW4gKEdFVF9VVEY4X0NIQVIpOiBVc2UgYGRvLi4ud2hpbGUoMCknLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCi0KLTIwMTUtMTItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZ3YXJwLmM6IHMvSU5UX01JTi9GVF9JTlRfTUlOLy4KLQotMjAxNS0xMi0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9pbnN0YWxsLm1rIChpbnN0YWxsKTogUmVtb3ZlIHN0YWxlIGBmdDJidWlsZC5oJy4KLQotMjAxNS0xMi0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGUxXSBBdm9pZCBkYW5nbGluZyBwb2ludGVyICgjNDY1NzIpLgotCi0JKiBzcmMvdHlwZTEvdDFhZm0uYyAoVDFfUmVhZF9NZXRyaWNzKTogUHJvcGVybHkgcmVzZXQKLQlgZmFjZS0+YWZtX2RhdGEnLgotCi0yMDE1LTExLTI4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaDogRG9jdW1lbnRhdGlvbiB0d2Vhay4KLQotMjAxNS0xMS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNi4yIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNi0yJy4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjYuMi4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNi4xLzIuNi4yLywgcy8yNjEvMjYyLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAyLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTg6MjoxMi4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDIuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNS0xMS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IEMrKyBjb21waWxhdGlvbi4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0guCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBQYWNpZnkgY29tcGlsZXIuCi0KLTIwMTUtMTEtMjggIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCUNoYW5nZSBkZWZhdWx0IExDRCBmaWx0ZXIgdG8gYmUgbm9ybWFsaXplZCBhbmQgY29sb3ItYmFsYW5jZWQuCi0KLQkqIHNyYy9iYXNlL2Z0bGNkZmlsLmMgKEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKTogVXBkYXRlCi0JYGRlZmF1bHRfZmlsdGVyJy4KLQotMjAxNS0xMS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2RvY21ha2VyXSBBbGxvdyByZWZlcmVuY2VzIHRvIHNlY3Rpb24gbmFtZXMuCi0KLQlJbiB0aGUgcmVmZXJlbmNlLCB3ZSBzaG93IHRoZSBzZWN0aW9uJ3MgdGl0bGUgZW5jbG9zZWQgaW4gc2luZ2xlCi0JcXVvdGVzLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvZm9ybWF0dGVyLnB5IChGb3JtYXR0ZXI6Ol9faW5pdF9fKTogQ29sbGVjdAotCXNlY3Rpb24gbmFtZXMgYXMgaWRlbnRpZmllcnMuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkgKHNlY3Rpb25fdGl0bGVfaGVhZGVyKTogU3BsaXQgaW50by4uLgotCShzZWN0aW9uX3RpdGxlX2hlYWRlcjEsIHNlY3Rpb25fdGl0bGVfaGVhZGVyMik6IC4uLiB0aGVzZSB0d28KLQlzdHJpbmdzLgotCShIdG1sRm9ybWF0dGVyOjptYWtlX2Jsb2NrX3VybCwgbWFrZV9odG1sX3dvcmQsIGh0bWxfc291cmNlX3F1b3RlKToKLQlIYW5kbGUgc2VjdGlvbnMuCi0JKEh0bWxGb3JtYXR0ZXI6OnNlY3Rpb25fZW50ZXIpOiBVcGRhdGVkIHRvIGFkZCBgaWQnIEhUTUwgYXR0cmlidXRlLgotCi0yMDE1LTExLTI3ICBUYW1hcyBLZW5leiAgPHRhbWFzLmtlbmV6QGFkYXN3b3Jrcy5jb20+Ci0KLQlbY21ha2VdIEFkZCBzY3JpcHQgdG8gdGVzdCB0aGUgY29uZmlnIG1vZHVsZS4KLQotCSogYnVpbGRzL2NtYWtlL3Rlc3RidWlsZC5zaDogTmV3IGZpbGUuCi0KLTIwMTUtMTEtMjcgIFRhbWFzIEtlbmV6ICA8dGFtYXMua2VuZXpAYWRhc3dvcmtzLmNvbT4KLQotCSogQ01ha2VMaXN0cy50eHQ6IENyZWF0ZSBgZnJlZXR5cGUtY29uZmlnLmNtYWtlJyBjb25maWcgbW9kdWxlLgotCi0yMDE1LTExLTI3ICBUYW1hcyBLZW5leiAgPHRhbWFzLmtlbmV6QGFkYXN3b3Jrcy5jb20+Ci0KLQkqIENNYWtlTGlzdHMudHh0OiBTZXQgQ01BS0VfREVCVUdfUE9TVEZJWCB0byBgZCcuCi0KLTIwMTUtMTEtMjcgIFRhbWFzIEtlbmV6ICA8dGFtYXMua2VuZXpAYWRhc3dvcmtzLmNvbT4KLQotCVtjbWFrZV0gQWRkIGJldHRlciBjb250cm9sIG9mIGxpYnJhcnkgZGVwZW5kZW5jaWVzLgotCi0JKiBDTWFrZUxpc3RzLnR4dDogQWRkIGBXSVRIXyonIHZhcmlhYmxlcyB0byBmb3JjZS9hdXRvL29taXQKLQlaTElCL0JaaXAyL1BORy9IYXJmQnV6ei4KLQotMjAxNS0xMS0yNyAgVGFtYXMgS2VuZXogIDx0YW1hcy5rZW5lekBhZGFzd29ya3MuY29tPgotCi0JW2NtYWtlXSBNYWtlIGBGaW5kSGFyZkJ1enonIG9ic2VydmUgdGhlIFJFUVVJUkVEIG9wdGlvbi4KLQotCSogYnVpbGRzL2NtYWtlL0ZpbmRIYXJmQnV6ei5jbWFrZTogSW1wbGVtZW50IGl0LgotCi0yMDE1LTExLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY21ha2VdIENvbGxlY3QgZmlsZXMgc3BlY2lmaWMgdG8gY21ha2UgaW4gYGJ1aWxkcy9jbWFrZScuCi0KLQkqIGJ1aWxkcy9GaW5kSGFyZkJ1enouY21ha2U6IE1vdmUgdG8gLi4uCi0JKiBidWlsZHMvY21ha2UvRmluZEhhcmZCdXp6LmNtYWtlOiAuLi4gdGhpcyBwbGFjZS4KLQotCSogQ01ha2VMaXN0cy50eHQgKENNQUtFX01PRFVMRV9QQVRIKTogVXBkYXRlZC4KLQotMjAxNS0xMS0yNyAgQWxleGFuZGVyIEJvY2sgIDxhbGV4YW5kZXIuai5ib2NrQG5hc2EuZ292PgotCi0JQ01ha2VMaXN0cy50eHQ6IEhvbm91ciBuZXcgY29tbWFuZCBsaW5lIGZsYWcgYEZSRUVUWVBFX05PX0RJU1QnLgotCi0yMDE1LTExLTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZG9jbWFrZXJdIEFsbG93IGBmb29bYmFyXScgYXMgaWRlbnRpZmllci4KLQotCVdlIG5lZWQgdGhpcyB0byBoYW5kbGUgZXF1YWxseSBuYW1lZCBwcm9wZXJ0aWVzIGluIGRpZmZlcmVudAotCW1vZHVsZXMuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci9jb250ZW50LnB5IChyZV9pZGVudGlmaWVyKSwKLQlzcmMvdG9vbHMvZG9jbWFrZXIvc291cmNlcy5weSAocmVfY3Jvc3NyZWYpOiBBbGxvdyBgZm9vW2Jhcl0nLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChIdG1sRm9ybWF0dGVyOjptYWtlX2h0bWxfd29yZCwKLQlIdG1sRm9ybWF0dGVyOjppbmRleF9leGl0LCBIdG1sRm9ybWF0dGVyOjpzZWN0aW9uX2VudGVyLAotCUh0bWxGb3JtYXR0ZXI6OmJsb2NrX2VudGVyKTogSGFuZGxlIGBmb29bYmFyXScuCi0KLTIwMTUtMTEtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoYmRmX2xvYWRfZm9udCk6IEZpeCBzbWFsbCBtZW1vcnkgbGVhayAoIzQ2NDgwKS4KLQotCShfYmRmX3BhcnNlX2dseXBocyk6IEFsd2F5cyByZXNldCBgcC0+Z2x5cGhfbmFtZScgYWZ0ZXIgbW92aW5nIGl0cwotCWNvbnRlbnRzLgotCi0yMDE1LTExLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg6IERvbid0IHVzZSBgcmVnaXN0ZXInIGtleXdvcmQuCi0KLQlUaGlzIGZpeGVzIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JUmVwb3J0ZWQgYnkgQmVoZGFkLgotCi0yMDE1LTExLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgYEZUX0xDRF9GSUxURVJfTEVHQUNZMScgZW51bSB2YWx1ZS4KLQotCVRoaXMgZG9lcyB0aGUgc2FtZSBhcyBgRlRfTENEX0ZJTFRFUl9MRUdBQ1knLgotCi0JU2VlCi0KLQkgIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTkyOTgxCi0KLQlmb3IgdGhlIHJlYXNvbmluZy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oIChGVF9MY2RGaWx0ZXIpOiBOZXcgdmFsdWUKLQlgRlRfTENEX0ZJTFRFUl9MRUdBQ1kxJy4KLQotCSogc3JjL2Jhc2UvZnRsY2RmaWwuYyAoRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIpOiBVc2UgaXQuCi0KLTIwMTUtMTEtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nZXRfc2VnbWVudF9pbmRleCk6IEZpeCBpdC4KLQotCVRoZSBvbGQgY29kZSB3YXMgdG9vIHNpbXBsZSwgcmV0dXJuaW5nIGludmFsaWQgdmFsdWVzIGluIG1vc3QgY2FzZXMKLQl3aGVyZSBhIHNlZ21lbnQgY3Jvc3NlcyB0aGUgY29udG91ciBzdGFydC4KLQotMjAxNS0xMS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChiZGZfbG9hZF9mb250KTogRml4IHNtYWxsIG1lbW9yeSBsZWFrICgjNDY0MzkpLgotCi0yMDE1LTExLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmLCBhdXRvZml0XSBTd2l0Y2ggb2ZmIHN0ZW0gZGFya2VuaW5nIGJ5IGRlZmF1bHQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKGFmX2F1dG9maXR0ZXJfaW5pdCksIHNyYy9jZmYvY2Zmb2Jqcy5jCi0JKGNmZl9kcml2ZXJfaW5pdCk6IERvIGl0LgotCi0yMDE1LTExLTEwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpICA8amFuLnN0ZWZmZW5zQGdtYWlsLmNvbT4KLQotCUFsbG93IG5hdGl2ZSBDRkYgaGludGVyIGluIEZUX1JFTkRFUl9NT0RFX0xJR0hULgotCi0JQm90aCB0aGUgbmF0aXZlIENGRiBoaW50ZXIgYW5kIHRoZSBhdXRvLWhpbnRlciBub3cgaGF2ZSBhIHZlcnkKLQlzaW1pbGFyIHJlbmRlcmluZyBzdHlsZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiBNZW50aW9uIHRoYXQgRlRfTE9BRF9UQVJHRVRfTElHSFQgbm8KLQlsb25nZXIgaW1wbGllcyBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5ULgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmggKEZUX01PRFVMRV9EUklWRVJfSElOVFNfTElHSFRMWSk6IE5ldwotCW1hY3JvLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9EUklWRVJfSElOVFNfTElHSFRMWSk6IE5ldwotCW1hY3JvLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9kcml2ZXJfY2xhc3MpOiBVc2UgaXQuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogVXBkYXRlIGF1dG8taGludGVyIHNlbGVjdGlvbgotCWxvZ2ljLgotCi0yMDE1LTExLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfZmFjZV9vcGVuKTogRml4IEdEQnl0ZXMgZ3VhcmQgKCM0NjQwOCkuCi0KLTIwMTUtMTEtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gUmVtb3ZlIGludGVnZXIgdG8gcG9pbnRlciBjb252ZXJzaW9uIGNvbXBpbGVyIHdhcm5pbmcuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEFsZXhlaS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IFVzZSBhIHNvbHV0aW9uIGZvdW5kCi0JaW4gdGhlIGdsaWIgbGlicmFyeSB0byBmaXggdGhlIGlzc3VlLgotCi0yMDE1LTExLTA4ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVtzZm50XSBBY2NlcHQgdmVyc2lvbiAzIG9mIGBFQkxDJyBhbmQgYENCTEMnIHRhYmxlcyBhbHNvLgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAodHRfZmFjZV9sb2FkX3NiaXQpOiBJbXBsZW1lbnQgaXQuCi0KLTIwMTUtMTEtMDggIFBoaWxpcHAgS25lY2h0Z2VzICA8cGhpbGlwcC1kZXZAa25lY2h0Z2VzLmNvbT4KLQotCVthdXRvZml0XSBEb24ndCBkaXN0b3J0IChsYXRpbikgZ2x5cGhzIHRvbyBtdWNoICgjNDYxOTUpLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmggKEFGX0xhdGluQmx1ZVJlYyk6IEFkZCBgYXNjZW5kZXInIGFuZAotCWBkZXNjZW5kZXInIGZpZWxkcy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBDb2xsZWN0Ci0JYXNjZW5kZXIgYW5kIGRlc2NlbmRlciBkYXRhIGZvciBibHVlIHpvbmVzLgotCShhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSk6IFJlamVjdCB2ZXJ0aWNhbCBzY2FsaW5nIHZhbHVlcyB0aGF0Ci0JY2hhbmdlIHRoZSByZXN1bHQgYnkgbW9yZSB0aGFuIHR3byBwaXhlbHMuCi0KLTIwMTUtMTEtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBJZ25vcmUgZW1iZWRkZWQgYml0bWFwcyB3aXRoIHplcm8gc2l6ZSAoIzQ2Mzc5KS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdF9hbGlnbmVkKTogSW1wbGVtZW50Ci0JaXQuCi0KLTIwMTUtMTEtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQ2F0Y2ggaW5maW5pdGUgcmVjdXJzaW9uIGluIHN1YmdseXBocyAoIzQ2MzcyKS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0xvYWRlclJlYyk6IE5ldyBmaWVsZAotCWBjb21wb3NpdGVzJy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYzogSW5jbHVkZSBGVF9MSVNUX0guCi0JKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBBZGQgY29tcG9zaXRlIHN1YmdseXBoIGluZGV4IHRvIGEgbGlzdDsKLQlhYm9ydCBpZiBpbmRleCBpcyBhbHJlYWR5IGluIGxpc3QuCi0JKHR0X2xvYWRlcl9pbml0KTogVXBkYXRlZC4KLQkodHRfbG9hZGVyX2RvbmUpOiBOZXcgZnVuY3Rpb24uCi0JKFRUX0xvYWRfR2x5cGgpOiBDYWxsIGB0dF9sb2FkZXJfZG9uZScuCi0KLTIwMTUtMTEtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQmV0dGVyIHRyYWNpbmcgb2YgY29tcG9zaXRlIGdseXBocy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9Db21wb3NpdGVfR2x5cGgsCi0JbG9hZF90cnVldHlwZV9nbHlwaCk6IEltcGxlbWVudCBpdC4KLQotMjAxNS0xMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFByb3RlY3QgYWdhaW5zdCB6ZXJvLXNpemUgYml0bWFwcyAoIzQ2MzQ1KS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdG1hcCk6IENoZWNrCi0JYGdseXBoX3NpemUnLgotCi0yMDE1LTExLTAyICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+Ci0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2cpOiBJbXBsZW1lbnQgZW1ib2xkZW5pbmcuCi0KLTIwMTUtMTEtMDIgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCVthdXRvZml0XSBJbXBsZW1lbnQgZGFya2VuaW5nIGNvbXB1dGF0aW9uIGZ1bmN0aW9uLgotCi0JVGhpcyBpcyBhIGNydWRlIGFkYXB0aW9uIG9mIHRoZSBvcmlnaW5hbCBgY2YyX2NvbXB1dGVEYXJrZW5pbmcnCi0JZnVuY3Rpb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2ludFRvRml4ZWQsIGFmX2ZpeGVkVG9JbnQsCi0JYWZfZmxvYXRUb0ZpeGVkKTogTmV3IG1hY3JvcywgdGFrZW4gZnJvbSBgY2YyZml4ZWQuaCcuCi0JKGFmX2xvYWRlcl9jb21wdXRlX2RhcmtlbmluZyk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmg6IFVwZGF0ZWQuCi0KLTIwMTUtMTEtMDIgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCVthdXRvZml0XSBBZGQgZnVuY3Rpb25zIHRvIGdldCBzdGFuZGFyZCB3aWR0aHMgZm9yIHdyaXRpbmcgc3lzdGVtcy4KLQotCVdlIG5lZWQgdGhlIGNvbXB1dGVkIHN0YW5kYXJkIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHdpZHRocyBmb3IgdGhlCi0JZW1ib2xkZW5pbmcgY2FsY3VsYXRpb24uICBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvCi0JZXh0cmFjdCBpdCBmcm9tIHdyaXRpbmctc3lzdGVtLXNwZWNpZmljIG1ldHJpY3Mgc3RydWN0dXJlcywgd2hpY2gKLQlhbGwgc2NyaXB0IGRlZmluaXRpb25zIG11c3QgaW1wbGVtZW50LgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggKEFGX1dyaXRpbmdTeXN0ZW1fR2V0U3RkV2lkdGhzRnVuYyk6IE5ldwotCWZ1bmN0aW9uIHR5cGUuCi0JKEFGX1dyaXRpbmdTeXN0ZW1DbGFzc1JlYyk6IE5ldyBtZW1iZXIgYHN0eWxlX21ldHJpY3NfZ2V0c3RkdycuCi0JKEFGX0RFRklORV9XUklUSU5HX1NZU1RFTV9DTEFTUyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19nZXRfc3RhbmRhcmRfd2lkdGgpOiBOZXcgZnVuY3Rpb24uCi0JKGFmX2Nqa193cml0aW5nX3N5c3RlbV9jbGFzcyk6IFVwZGF0ZWQuCi0JKiBzcmMvYXV0b2ZpdC9hZmR1bW15LmMJKGFmX2R1bW15X3dyaXRpbmdfc3lzdGVtX2NsYXNzKTogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmaW5kaWMuYyAoYWZfY2prX2dldF9zdGFuZGFyZF93aWR0aCk6IE5ldyBmdW5jdGlvbi4KLQkoYWZfaW5kaWNfd3JpdGluZ19zeXN0ZW1fY2xhc3MpOiBVcGRhdGVkLgotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9nZXRfc3RhbmRhcmRfd2lkdGgpOiBOZXcgZnVuY3Rpb24uCi0JKGFmX2luZGljX3dyaXRpbmdfc3lzdGVtX2NsYXNzKTogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fZ2V0X3N0YW5kYXJkX3dpZHRoKTogTmV3IGZ1bmN0aW9uLgotCShhZl9pbmRpY193cml0aW5nX3N5c3RlbV9jbGFzcyk6IFVwZGF0ZWQuCi0KLTIwMTUtMTEtMDIgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCVthdXRvZml0XSBFeHRlbmQgYEFGX0ZhY2VHbG9iYWxzUmVjJyB0byBob2xkIGVtYm9sZGVuaW5nIGRhdGEuCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmggKEFGX0ZhY2VHbG9iYWxzUmVjKTogQWRkIGZpZWxkcy4KLQotCSogc3JjL2F1dG9maXQvYWZnbG9iYWwuYyAoYWZfZmFjZV9nbG9iYWxzX25ldyk6IEluaXRpYWxpemUgbmV3Ci0JZmllbGRzLgotCShhZl9mYWNlX2dsb2JhbHNfZnJlZSk6IFJlc2V0IG5ldyBmaWVsZHMuCi0KLTIwMTUtMTEtMDIgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCVthdXRvZml0XSBBZGQgc3RlbS1kYXJrZW5pbmcgcHJvcGVydGllcy4KLQotCUFjdHVhbCBjb2RlIGZvbGxvd3MgaW4gYSBsYXRlciBjb21taXQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRhdXRvaC5oOiBEb2N1bWVudCBgbm8tc3RlbS1kYXJrZW5pbmcnIGFuZAotCWBkYXJrZW5pbmctcGFyYW1ldGVycycuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmg6IE5ldyBmaWVsZHMgYG5vX3N0ZW1fZGFya2VuaW5nJyBhbmQKLQlgZGFya2VuX3BhcmFtcycuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKGFmX3Byb3BlcnR5X3NldCwgYWZfcHJvcGVydHlfZ2V0KToKLQlIYW5kbGUgdGhlbS4KLQkoYWZfYXV0b2ZpdHRlcl9pbml0KTogSW5pdGlhbGl6ZSB0aGVtLgotCi0yMDE1LTExLTAyICBCZW4gV2FnbmVyICA8YnVuZ2VtYW5AZ21haWwuY29tPgotCi0JW2Z0ZnV6emVyXSBBZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZmlsZXMgKHBhdGNoICM4Nzc5KS4KLQotCUN1cnJlbnRseSwgbGliRnV6emVyIG9ubHkgc3VwcG9ydHMgbXV0YXRpb24gb2YgYSBzaW5nbGUgZmlsZS4gIFdlCi0JY2lyY3VtdmVudCB0aGlzIHByb2JsZW0gYnkgdXNpbmcgYW4gdW5jb21wcmVzc2VkIHRhciBhcmNoaXZlIGFzCi0JbXVsdGlwbGUtZmlsZSBpbnB1dCBmb3IgdGhlIGZ1enplci4KLQotCVRoaXMgcGF0Y2ggZW5hYmxlcyB0ZXN0cyBvZiBgRlRfQXR0YWNoX1N0cmVhbScgYW5kIEFGTS9QRk0gcGFyc2luZzsKLQlhIGNvbnN0cnVjdGVkIHRhcmJhbGwgc2hvdWxkIGNvbnRhaW4gYSBmb250IGZpbGUgYXMgdGhlIGZpcnN0Ci0JZWxlbWVudCwgYW5kIGZpbGVzIHRvIGJlIGF0dGFjaGVkIGFzIGZ1cnRoZXIgZWxlbWVudHMuCi0KLQkqIHNyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYzogSW5jbHVkZSBsaWJhcmNoaXZlIGhlYWRlcnMuCi0JKGFyY2hpdmVfcmVhZF9lbnRyeV9kYXRhLCBwYXJzZV9kYXRhKTogTmV3IGZ1bmN0aW9ucy4KLQkoTExWTUZ1enplclRlc3RPbmVJbnB1dCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90b29scy9mdGZ1enplci9mdG11dGF0b3IuY2M6IE5ldyBmaWxlLCBwcm92aWRpbmcgYSBjdXN0b20KLQltdXRhdG9yIGZvciBsaWJGdXp6ZXIgdGhhdCBjYW4gbXV0YXRlIHRhcmJhbGxzIGluIGEgc2Vuc2libGUgd2F5LgotCi0yMDE1LTEwLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IGNtYXAgMTQgdmFsaWRhdGlvbiAoIzQ2MzQ2KS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAxNF92YWxpZGF0ZSk6IENoZWNrIGxpbWl0IGJlZm9yZQotCWFjY2Vzc2luZyBgbnVtUmFuZ2VzJyBhbmQgYG51bU1hcHBpbmdzJy4KLQlGaXggc2l6ZSBjaGVjayBmb3Igbm9uLWRlZmF1bHQgVVZTIHRhYmxlLgotCi0yMDE1LTEwLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSGFuZGxlIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBiaXRtYXAgc3RyaWtlcyAoIzQ2MzQ0KS4KLQotCSogc3JjL3NmbnQvdHRzYml0LmMgKFRUX1NCaXREZWNvZGVyX0xvYWRGdW5jLAotCXR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdG1hcCwgdHRfc2JpdF9kZWNvZGVyX2xvYWRfYnl0ZV9hbGlnbmVkLAotCXR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdF9hbGlnbmVkLCB0dF9zYml0X2RlY29kZXJfbG9hZF9wbmcpOiBBZGQKLQlhcmd1bWVudCBmb3IgcmVjdXJzaW9uIGRlcHRoLgotCSh0dF9zYml0X2RlY29kZXJfbG9hZF9jb21wb3VuZCk6IEFkZCBhcmd1bWVudCBmb3IgcmVjdXJzaW9uIGRlcHRoLgotCUluY3JlYXNlIHJlY3Vyc2lvbiBjb3VudGVyIGZvciByZWN1cnNpdmUgY2FsbC4KLQkodHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2UpOiBBZGQgYXJndW1lbnQgZm9yIHJlY3Vyc2lvbiBkZXB0aC4KLQlDaGVjayByZWN1cnNlIGRlcHRoLgotCSh0dF9mYWNlX2xvYWRfc2JpdF9pbWFnZSk6IFVwZGF0ZWQuCi0KLTIwMTUtMTAtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cyk6IE1pbm9yLgotCi0yMDE1LTEwLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIENNYWtlTGlzdHMudHh0OiBSZW1vdmUgY29kZSB0byBzZXQgTVNWQydzIC9GRCBjb21waWxlciBzd2l0Y2guCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IERhdmlkIENhcGVsbG8gPGRhdmlkY2FwZWxsb0BnbWFpbC5jb20+OyBzZWUKLQotCSAgaHR0cDovL2xpc3RzLm5vbmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTUtMTAvbXNnMDAxMDguaHRtbAotCi0JZm9yIGRldGFpbHMuCi0KLTIwMTUtMTAtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwZnJdIEFkZCBzb21lIHNhZmV0eSBndWFyZHMgKCM0NjMwMikuCi0KLQkqIHNyYy9wZnIvcGZybG9hZC5oIChQRlJfQ0hFQ0spOiBSZW5hbWUgdG8uLi4KLQkoUEZSX0NIRUNLX1NJWkUpOiAuLi4gdGhpcy4KLQkoUEZSX1NJWkUpOiBbIVBGUl9DT05GSUdfTk9fQ0hFQ0tTXTogRGVmaW5lIHRvIFBGUl9DSEVDS19TSVpFLgotCi0JKiBzcmMvcGZyL3BmcmxvYWQuYyAocGZyX2xvZ19mb250X2NvdW50KTogQ2hlY2sgYGNvdW50Jy4KLQkocGZyX2V4dHJhX2l0ZW1fbG9hZF9rZXJuaW5nX3BhaXJzKTogUmVtb3ZlIHRyYWNpbmcgbWVzc2FnZS4KLQkocGZyX3BoeV9mb250X2xvYWQpOiBVc2UgUEZSX0NIRUNLX1NJWkUgd2hlcmUgYXBwcm9wcmlhdGUuCi0JQWxsb2NhdGUgYGNoYXJzJyBhZnRlciBkb2luZyBhIHNpemUgY2hlY2tzLgotCi0JKiBzcmMvcGZyL3BmcnNiaXQuYyAocGZyX2xvYWRfYml0bWFwX2JpdHMpOiBNb3ZlIHRlc3QgZm9yIGludmFsaWQKLQliaXRtYXAgZm9ybWF0IHRvLi4uCi0JKHBmcl9zbG90X2xvYWRfYml0bWFwKTogLi4uIHRoaXMgZnVuY3Rpb24uCi0JQ2hlY2sgYml0bWFwIHNpemUuCi0KLTIwMTUtMTAtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IHNhbml0aXppbmcgbG9naWMgZm9yIGBsb2NhJyAoIzQ2MjIzKS4KLQotCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYyAodHRfZmFjZV9sb2FkX2xvY2EpOiBBIHRoaW5rbyBjYXVzZWQgYW4KLQlpbmNvcnJlY3QgYWRqdXN0bWVudCBvZiB0aGUgbnVtYmVyIG9mIGdseXBocywgbW9zdCBvZnRlbiB1c2luZyBmYXIKLQl0b28gbGFyZ2UgdmFsdWVzLgotCi0yMDE1LTEwLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSB0cmFjaW5nLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX3ByaW50X2lkeCwgYWZfZ2V0X3NlZ21lbnRfaW5kZXgsCi0JYWZfZ2V0X2VkZ2VfaW5kZXgpOiBOZXcgZnVuY3Rpb25zLgotCi0JKGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzKTogUmVtb3ZlIHVubmVjZXNzYXJ5IGB8JywgYFsnLCBhbmQgYF0nLgotCUFkZCBzZWdtZW50IGFuZCBlZGdlIGluZGV4IGZvciBlYWNoIHBvaW50LgotCVNsaWdodGx5IGNoYW5nZSBwcmludGluZyBvcmRlciBvZiBzb21lIGVsZW1lbnRzLgotCURvbid0IHByaW50IGAtMScgYnV0IGAtLScgZm9yIG1pc3NpbmcgZWxlbWVudHMuCi0KLQkoYWZfZ2x5cGhfaGludHNfZHVtcF9zZWdtZW50cywgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyk6IFJlbW92ZQotCXVubmVjZXNzYXJ5IGB8JywgYFsnLCBhbmQgYF0nLgotCURvbid0IHByaW50IGAtMScgYnV0IGAtLScgZm9yIG1pc3NpbmcgZWxlbWVudHMuCi0KLTIwMTUtMTAtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBTYW5pdGl6ZSBiaXRtYXAgc3RyaWtlIGdseXBoIGhlaWdodC4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTmlrb2xheSBTaXZvdiA8YnVuZ2xlaGVhZEBnbWFpbC5jb20+LgotCi0JKiBzcmMvc2ZudC90dHNiaXQuYyAodHRfZmFjZV9sb2FkX3N0cmlrZV9tZXRyaWNzKTogQXZvaWQgemVybyB2YWx1ZQotCWZvciBgbWV0cmljcy0+aGVpZ2h0JyBieSBhcHBseWluZyBzb21lIGhldXJpc3RpY3MuCi0KLTIwMTUtMTAtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50LCB0eXBlNDJdIEZpeCBjbGFuZyBjb21waWxlciB3YXJuaW5ncy4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfaW5pdF9mYWNlKTogSW5pdGlhbGl6ZSBgb2Zmc2V0Jy4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2Vfc2ZudHMpOiBVc2UgcHJvcGVyIGNhc3QuCi0KLTIwMTUtMTAtMjIgIERhdmUgQXJub2xkICA8ZGFybm9sZEBhZG9iZS5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEF2b2lkIG92ZXJmbG93L21vZHVsZSBhcml0aG1ldGljLgotCi0JVGhpcyBtb2RpZmllcyB0aGUgYWRkaXRpb24gb2Ygc3Vicm91dGluZSBudW1iZXIgdG8gc3Vicm91dGluZSBiaWFzCi0JZnJvbSB1bnNpZ25lZCB0byBzaWduZWQsIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgYW55IHJlc3VsdHMuCi0KLQkqIHNyYy9jZmYvY2YyZnQuYyAoY2YyX2luaXRHbG9iYWxSZWdpb25CdWZmZXIsCi0JY2YyX2luaXRMb2NhbFJlZ2lvbkJ1ZmZlcik6IENoYW5nZSB2YXJpYWJsZSBuYW1lcyBmcm9tICh1bnNpZ25lZCkKLQlgaWR4JyB0byAoc2lnbmVkKSBgc3Vick51bScsIHNpbmNlIGl0IGlzIG5vdCBhbiBpbmRleCB1bnRpbCBhZnRlcgotCXRoZSBiaWFzIGlzIGFkZGVkLgotCSogc3JjL2NmZi9jZjJmdC5oOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmMmludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfY21kQ0FMTFNVQlI+OgotCVVwZGF0ZWQgc2ltaWxhcmx5LgotCi0yMDE1LTEwLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2lkXSBCZXR0ZXIgY2hlY2sgb2YgYFN1YnJDb3VudCcgZGljdGlvbmFyeSBlbnRyeSAoIzQ2MjcyKS4KLQotCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9mYWNlX29wZW4pOiBBZGQgbW9yZSBzYW5pdHkgdGVzdHMgZm9yCi0JYGZkX2J5dGVzJywgYGdkX2J5dGVzJywgYHNkX2J5dGVzJywgYW5kIGBudW1fc3VicnMnLgotCi0yMDE1LTEwLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gUGFjaWZ5IGNvbXBpbGVyICgjNDYyNjYpLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfRW1ib2xkZW5YWSk6IEluaXRpYWxpemUgYGluJyBhbmQKLQlgYW5jaG9yJy4KLQotMjAxNS0xMC0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGU0Ml0gRml4IGhlYXAgYnVmZmVyIG92ZXJmbG93ICgjNDYyNjkpLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9zZm50cyk6IEZpeCBvZmYtYnktb25lIGVycm9yIGluCi0JYm91bmRzIGNoZWNraW5nLgotCi0yMDE1LTEwLTIxICBEYXZlIEFybm9sZCAgPGRhcm5vbGRAYWRvYmUuY29tPgotCi0JW2NmZl0gRml4IGxpbWl0IGluIGFzc2VydCBmb3IgbWF4IGhpbnRzLgotCi0JKiBzcmMvY2ZmL2NmMmludGVycC5jIChjZjJfaGludG1hc2tfc2V0QWxsKTogQWxsb3cgbWFzayBlcXVhbCB0byB0aGUKLQlsaW1pdCAoOTYgYml0cykuCi0KLTIwMTUtMTAtMjEgIERhdmUgQXJub2xkICA8ZGFybm9sZEBhZG9iZS5jb20+Ci0KLQlbY2ZmXSBSZW1vdmUgYW4gYXNzZXJ0ICgjNDYxMDcpLgotCi0JKiBzcmMvY2ZmL2NmMmhpbnRzLmMgKGNmMl9oaW50bWFwX2luc2VydEhpbnQpOiBJZ25vcmUgcGFpcmVkIGVkZ2VzCi0JaW4gd3Jvbmcgb3JkZXIuCi0KLTIwMTUtMTAtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBBdm9pZCB1bm5lY2Vzc2FyaWx5IGxhcmdlIGFsbG9jYXRpb24gZm9yIFdPRkZzICgjNDYyNTcpLgotCi0JKiBzcmMvc2ZudC9zZm9ianMuYyAod29mZl9vcGVuX2ZvbnQpOiBVc2UgV09GRidzIGB0b3RhbFNmbnRTaXplJwotCW9ubHkgYWZ0ZXIgdGhvcm91Z2ggY2hlY2tzLgotCUFkZCB0cmFjaW5nIG1lc3NhZ2VzLgotCi0yMDE1LTEwLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTQyXSBCZXR0ZXIgY2hlY2sgaW52YWxpZCBgc2ZudHMnIGFycmF5IGRhdGEgKCM0NjI1NSkuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX3NmbnRzKTogVGFibGUgbGVuZ3RocyBtdXN0IGJlCi0JY2hlY2tlZCBpbmRpdmlkdWFsbHkgYWdhaW5zdCBhdmFpbGFibGUgZGF0YSBzaXplLgotCi0yMDE1LTEwLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2lkXSBBZGQgYSBidW5jaCBvZiBzYWZldHkgY2hlY2tzLgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAocGFyc2VfZmRfYXJyYXkpOiBDaGVjayBgbnVtX2RpY3RzJyBhZ2FpbnN0Ci0Jc3RyZWFtIHNpemUuCi0JKGNpZF9yZWFkX3N1YnJzKTogQ2hlY2sgbGFyZ2VzdCBvZmZzZXQgYWdhaW5zdCBzdHJlYW0gc2l6ZS4KLQkoY2lkX3BhcnNlX2RpY3QpOiBNb3ZlIHNhZmV0eSBjaGVjayB0byAuLi4KLQkoY2lkX2ZhY2Vfb3Blbik6IC4uLiB0aGlzIGZ1bmN0aW9uLgotCUFsc28gdGVzdCBsZW5ndGggb2YgYmluYXJ5IGRhdGEgYW5kIHZhbHVlcyBvZiBgU0RCeXRlcycsCi0JYFN1YnJNYXBPZmZzZXQnLCBgU3VickNvdW50JywgYENJRE1hcE9mZnNldCcsIGFuZCBgQ0lEQ291bnQnLgotCi0yMDE1LTEwLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2lkXSBBdm9pZCBzZWdmYXVsdCB3aXRoIG1hbGZvcm1lZCBpbnB1dCAoIzQ2MjUwKS4KLQotCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9yZWFkX3N1YnJzKTogUmV0dXJuIGEgcHJvcGVyIGVycm9yIGNvZGUgZm9yCi0JdW5zb3J0ZWQgb2Zmc2V0cy4KLQotMjAxNS0xMC0yMCAgU3R1ZGlvRXRyYW5nZSAgPG5vbW9yZ2FuQGdtYWlsLmNvbT4KLQotCSogQ01ha2VMaXN0cy50eHQ6IEVuYWJsZSBzaGFyZWQgbGlicmFyeSBidWlsZHMgb24gTWluR1cgKCM0NjIzMykuCi0KLTIwMTUtMTAtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3R5cGUxL3QxYWZtLmMgKFQxX1JlYWRfTWV0cmljcyk6IEZpeCBtZW1vcnkgbGVhayAoIzQ2MjI5KS4KLQotMjAxNS0xMC0xOSAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdtYWlsLmNvbT4KLQotCVtjaWRdIEJldHRlciBoYW5kbGUgaW52YWxpZCBnbHlwaCBzdHJlYW0gb2Zmc2V0cyAoIzQ2MjIxKS4KLQotCSogc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfbG9hZF9nbHlwaCk6IENoZWNrIG1pbmltdW0gc2l6ZSBvZiBnbHlwaAotCWxlbmd0aC4KLQotMjAxNS0xMC0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BzYXV4XSBGaXggdHJhY2luZyBvZiBuZWdhdGl2ZSBudW1iZXJzLgotCi0JRHVlIHRvIGluY29ycmVjdCBjYXN0aW5nIG5lZ2F0aXZlIG51bWJlcnMgd2VyZSBzaG93biBhcyB2ZXJ5IGxhcmdlCi0JKHBvc2l0aXZlKSBpbnRlZ2VycyBvbiA2NGJpdCBzeXN0ZW1zLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykgPG9wX25vbmU+OgotCVVzZSBkaXZpc2lvbiBpbnN0ZWFkIG9mIHNoaWZ0LgotCi0yMDE1LTEwLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEltcHJvdmUgVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUyAoIzQ2MjIzKS4KLQotCSogZGV2ZWwvZnRvcHRpb24uaCwgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaDogU3Vycm91bmQgaXQKLQl3aXRoICNpZm5kZWYgLi4uICNlbmRpZiwgYXMgc3VnZ2VzdGVkIGluIHRoZSB0cmFja2VyIGlzc3VlLgotCi0yMDE1LTEwLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEJldHRlciBwcm90ZWN0aW9uIGFnYWluc3QgbWFsZm9ybWVkIGBmcGdtJyAoIzQ2MjIzKS4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX2luaXRfYnl0ZWNvZGUpOiBEb24ndCBleGVjdXRlIGEKLQltYWxmb3JtZWQgYGZwZ20nIHRhYmxlIG1vcmUgdGhhbiBvbmNlLgotCi0yMDE1LTEwLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX2xvYWRfZ2x5cGgpOiBGaXggbWVtb3J5IGxlYWsuCi0KLQlSZXBvcnRlZCBieSBLb3N0eWEgU2VyZWJyeWFueSA8a2NjQGdvb2dsZS5jb20+LgotCi0yMDE1LTEwLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBQcmV2ZW50IG1lbW9yeSBsZWFrICgjNDYyMTcpLgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3BhcnNlX2dseXBocykgPFNUQVJUQ0hBUj46IENoZWNrCi0JX0JERl9HTFlQSF9CSVRTLgotCi0yMDE1LTEwLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmRmXSBVc2Ugc3RyZWFtIHNpemUgdG8gYWRqdXN0IG51bWJlciBvZiBnbHlwaHMuCi0KLQkqIHNyYy9iZGYvYmRmbGliLmMgKEFDTVNHMTcpOiBOZXcgbWVzc2FnZSBtYWNyby4KLQkoX2JkZl9wYXJzZV90KTogQWRkIG1lbWJlciBgc2l6ZScuCi0JKGJkZl9sb2FkX2ZvbnQpOiBTZXQgYHNpemUnLgotCShfYmRmX3BhcnNlX2dseXBocyk6IEFkanVzdCBgY250JyBpZiBuZWNlc3NhcnkuCi0KLTIwMTUtMTAtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9wYXJzZV9kaWN0KTogQ2hlY2sgYFtGR11EQnl0ZXMnIHNpemUuCi0KLTIwMTUtMTAtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfZ2x5cGhfbG9hZCk6IENoZWNrIGZpbGUgb2Zmc2V0cyAoIzQ2MjIyKS4KLQotMjAxNS0xMC0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BzYXV4XSBGaXggaGVhcCBidWZmZXIgb3ZlcmZsb3cgKCM0NjIyMSkuCi0KLQkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmcpIDxvcGVyYXRvciAxMj46Ci0JRml4IGxpbWl0IGNoZWNrLgotCi0yMDE1LTEwLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfcGFyc2VfZGljdCk6IEhhbmRsZSBpbnZhbGlkIGlucHV0ICgjNDYyMjApLgotCi0yMDE1LTEwLTE1ICBLb3N0eWEgU2VyZWJyeWFueSAgPGtjY0Bnb29nbGUuY29tPgotCi0JW2Z0ZnV6emVyXSBBZGQgUkVBRE1FLgotCi0JKiBzcmMvdG9vbHMvZnRmdXp6ZXIvUkVBRE1FOiBOZXcgZmlsZS4KLQotMjAxNS0xMC0xNSAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdtYWlsLmNvbT4KLQotCVtiZGZdIEZpeCBtZW1vcnkgbGVhayAoIzQ2MjEzKS4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoYmRmX2xvYWRfZm9udCk6IEFsd2F5cyBnbyB0byBsYWJlbCBgRmFpbCcgaW4KLQljYXNlIG9mIGVycm9yLgotCi0yMDE1LTEwLTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCBUVF9DT05GSUdfT1BUSU9OX01BWF9SVU5OQUJMRV9PUENPREVTICgjNDYyMDgpLgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKFRUX0NPTkZJR19PUFRJT05fTUFYX1JVTk5BQkxFX09QQ09ERVMpOiBOZXcgY29uZmlndXJhdGlvbiBtYWNyby4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKE1BWF9SVU5OQUJMRV9PUENPREVTKTogUmVtb3ZlZC4KLQkoVFRfUnVuSW5zKTogVXBkYXRlZC4KLQotMjAxNS0xMC0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogRml4IGJ5dGVjb2RlIHN0YWNrIHRyYWNpbmcuCi0KLQlUaGUgdXNlZCBpbmRpY2VzIHdlcmUgb2ZmIGJ5IDEuCi0KLTIwMTUtMTAtMTUgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnbWFpbC5jb20+Ci0JICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Rvb2xzL2Z0ZnV6emVyL2Z0ZnV6emVyLmNjOiBIYW5kbGUgZml4ZWQgc2l6ZXMgKCM0NjIxMSkuCi0KLTIwMTUtMTAtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBDb21wdXRlIE1ENSBjaGVja3N1bXMgb25seSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4KLQotCVRoaXMgaW1wcm92ZXMgcHJvZmlsaW5nIGFjY3VyYWN5LgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKTogSW1wbGVtZW50IGl0LgotCi0yMDE1LTEwLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gVXNlIGBGVF8nIG5hbWVzcGFjZSBmb3IgTUQ1IGZ1bmN0aW9ucyAoIzQyMzY2KS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKE1ENV8qKTogRGVmaW5lIGFzIGBGVF9NRDVfKicuCi0JVW5kZWZpbmUgSEFWRV9PUEVOU1NMLgotCi0yMDE1LTEwLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTFdIENvcnJlY3RseSBoYW5kbGUgbWlzc2luZyBNTSBheGlzIG5hbWVzICgjNDYyMDIpLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKFQxX0dldF9NTV9WYXIpOiBJbXBsZW1lbnQgaXQuCi0KLTIwMTUtMTAtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwY2ZdIFF1aWNrbHkgZXhpdCBpZiBmb250IGluZGV4IDwgMC4KLQotCVNpbWlsYXIgdG8gb3RoZXIgZm9udCBmb3JtYXRzLCB0aGlzIGNvbW1pdCBtYWtlcyB0aGUgcGFyc2VyIG5vCi0JbG9uZ2VyIGNoZWNrIHRoZSB3aG9sZSBQQ0YgZmlsZSBidXQgb25seSB0aGUgaGVhZGVyIGFuZCB0aGUgVE9DIGlmCi0Jd2UganVzdCB3YW50IHRvIGdldCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBmYWNlcyAoYW5kIGEgcHJvcGVyCi0JcmVjb2duaXRpb24gb2YgdGhlIGZvbnQgZm9ybWF0KS4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfRmFjZV9Jbml0KTogVXBkYXRlZC4KLQlFeGl0IHF1aWNrbHkgaWYgZmFjZV9pbmRleCA8IDAuCi0KLQkqIHNyYy9wY2ZyZWFkLmMgKHBjZl9sb2FkX2ZvbnQpOiBBZGQgYGZhY2VfaW5kZXgnIGFyZ3VtZW50LgotCUV4aXQgcXVpY2tseSBpZiBmYWNlX2luZGV4IDwgMC4KLQotCSogc3JjL3BjZi9wY2YuaDogVXBkYXRlZC4KLQotMjAxNS0xMC0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Z0ZnV6emVyXSBIYW5kbGUgVFRDcyBhbmQgTU0vR1ggdmFyaWF0aW9ucy4KLQotCVRoaXMgcGF0Y2ggYWxzbyBjb250YWlucyB2YXJpb3VzIG90aGVyIGltcHJvdmVtZW50cy4KLQotCSogc3JjL3Rvb2xzL2Z0ZnV6emVyL2Z0ZnV6emVyLmNjOiBBZGQgcHJlcHJvY2Vzc29yIGd1YXJkIHRvIHJlamVjdAotCXByZS1DKysxMSBjb21waWxlcnMuCi0JKEZUX0dsb2JhbCk6IE5ldyBjbGFzcy4gIFVzZSBpdCB0byBwcm92aWRlIGEgZ2xvYmFsIGNvbnN0cnVjdG9yIGFuZAotCWRlc3RydWN0b3IgZm9yIHRoZSBgRlRfTGlicmFyeScgb2JqZWN0LgotCShzZXRJbnRlcm1lZGlhdGVBeGlzKTogTmV3IGZ1bmN0aW9uIHRvIHNlbGVjdCBhbiAoYXJiaXRyYXJ5KQotCWluc3RhbmNlLgotCShMTFZNRnV6emVyVGVzdE9uZUlucHV0KTogTG9vcCBvdmVyIGFsbCBmYWNlcyBhbmQgbmFtZWQgaW5zdGFuY2VzLgotCUFsc28gY2FsbCBgRlRfU2V0X0NoYXJfU2l6ZScuCi0KLTIwMTUtMTAtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gUmVmaW5lIHNvbWUgR1ggc2FuaXR5IHRlc3RzLgotCi0JVXNlIHRoZSBgZ3ZhcicgdGFibGUgc2l6ZSBpbnN0ZWFkIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlCi0Jc3RyZWFtLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oIChHWF9CbGVuZFJlYyk6IE5ldyBmaWVsZCBgZ3Zhcl9zaXplJy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX2xvYWRfZ3Zhcik6IFNldCBgZ3Zhcl9zaXplJy4KLQkoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMsIGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzOiBOZXcgYXJndW1lbnQKLQlgc2l6ZScuCi0JKHR0X2ZhY2VfdmFyeV9jdnQsIFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKTogVXBkYXRlZC4KLQotMjAxNS0xMC0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBBbm90aGVyIEdYIHNhbml0eSB0ZXN0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IENoZWNrCi0JYHR1cGxlQ291bnQnLgotCUFkZCB0cmFjaW5nIG1lc3NhZ2UuCi0KLTIwMTUtMTAtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IG1lbW9yeSBsZWFrIGZvciBicm9rZW4gR1ggZm9udHMgKCM0NjE4OCkuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKTogRml4IHNjb3BlIG9mCi0JZGVhbGxvY2F0aW9uLgotCi0yMDE1LTEwLTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBjb21taXQgZnJvbSAyMDE1LTEwLTEwLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9ndmFyKTogQWRkIG1pc3NpbmcgZXJyb3IKLQloYW5kbGluZyBib2R5IHRvIGNvbmRpdGlvbi4KLQotMjAxNS0xMC0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3VuaXhdIE1ha2UgTUtESVJfUCBhY3R1YWxseSB3b3JrLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBGaXggdW5kZXJxdW90aW5nIG9mIGBJTlNUQUxMJyBhbmQKLQlgTUtESVJfUCcuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IERhbiBMaWRkZWxsIDxsZGRsbEB5YWhvby5jb20+LgotCi0yMDE1LTEwLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gSW1wcm92ZSBleHRyYWN0aW9uIG9mIG51bWJlciBvZiBuYW1lZCBpbnN0YW5jZXMuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2luaXRfZmFjZSkKLQlbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IENoZWNrIG51bWJlciBvZiBpbnN0YW5jZXMgYWdhaW5zdAotCWBmdmFyJyB0YWJsZSBzaXplLgotCi0yMDE1LTEwLTEwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24pOiBGaXggb3ZlcmZsb3cKLQkoIzQ2MTQ5KS4KLQotMjAxNS0xMC0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBpbmZpbml0ZSBsb29wcyB3aXRoIGJyb2tlbiBjbWFwcyAoIzQ2MTY3KS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA4X2NoYXJfbmV4dCwgdHRfY21hcDEyX25leHQpOiBUYWtlIGNhcmUKLQlvZiBib3JkZXIgY29uZGl0aW9ucyAoaS5lLiwgaWYgdGhlIGxvb3BzIGV4aXQgbmF0dXJhbGx5KS4KLQotMjAxNS0xMC0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBNb3JlIHNhbml0eSB0ZXN0cyBmb3IgR1ggaGFuZGxpbmcuCi0KLQlUaGVzZSB0ZXN0cyBzaG91bGQgbWFpbmx5IGhlbHAgYXZvaWQgdW5uZWNlc3NhcmlseSBsYXJnZSBtZW1vcnkKLQlhbGxvY2F0aW9ucyBpbiBjYXNlIG9mIG1hbGZvcm1lZCBmb250cy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMsCi0JZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXMpOiBDaGVjayBudW1iZXIgb2YgcG9pbnRzIGFnYWluc3Qgc3RyZWFtCi0Jc2l6ZS4KLQkoZnRfdmFyX2xvYWRfYXZhcik6IENoZWNrIGBwYWlyQ291bnQnIGFnYWluc3QgdGFibGUgbGVuZ3RoLgotCShmdF92YXJfbG9hZF9ndmFyKTogQ2hlY2sgYGdsb2JhbENvb3JkQ291bnQnIGFuZCBgZ2x5cGhDb3VudCcKLQlhZ2FpbnN0IHRhYmxlIGxlbmd0aC4KLQkodHRfZmFjZV92YXJ5X2N2dCk6IENoZWNrIGB0dXBsZUNvdW50JyBhbmQgYG9mZnNldFRvRGF0YScuCi0JRml4IHRyYWNlLgotCShUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IEZpeCB0cmFjZS4KLQlGcmVlIGBzaGFyZWRwb2ludHMnIHRvIGF2b2lkIG1lbW9yeSBsZWFrLgotCi0yMDE1LTEwLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEJldHRlciBwcm90ZWN0aW9uIGFnYWluc3QgbWFsZm9ybWVkIEdYIGRhdGEgKCM0NjE2NikuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKTogQ29ycmVjdGx5Ci0JaGFuZGxlIGVtcHR5IGBsb2NhbHBvaW50cycgYXJyYXkuCi0KLTIwMTUtMTAtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9yZWFkX1RPQyk6IENoZWNrIHN0cmVhbSBzaXplICgjNDYxNjIpLgotCi0yMDE1LTEwLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9nemlwL2Z0Z3ppcC5jIChGVF9TdHJlYW1fT3Blbkd6aXApOiBVc2UgcmVhbCBzdHJlYW0gc2l6ZS4KLQotMjAxNS0xMC0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgbnVtYmVyIG9mIFRPQyBlbnRyaWVzICgjNDYxNTkpLgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX3JlYWRfVE9DKTogQ2hlY2sgbnVtYmVyIG9mIFRPQyBlbnRyaWVzCi0JYWdhaW5zdCBzaXplIG9mIGRhdGEgc3RyZWFtLgotCi0yMDE1LTEwLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTQyXSBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBudW1iZXIgb2YgZ2x5cGhzICgjNDYxNTkpLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9jaGFyc3RyaW5ncyk6IENoZWNrIG51bWJlciBvZgotCWBDaGFyU3RyaW5ncycgZGljdGlvbmFyeSBlbnRyaWVzIGFnYWluc3Qgc2l6ZSBvZiBkYXRhIHN0cmVhbS4KLQotMjAxNS0xMC0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEZpeCBzb21lIHNpZ25lZCBvdmVyZmxvd3MgKCM0NjE0OSkuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MpCi0JPFRUX1NCSVRfVEFCTEVfVFlQRV9TQklYPjogVXNlIGBGVF9NdWxEaXYnLgotCi0yMDE1LTEwLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTFdIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIG51bWJlciBvZiBzdWJyb3V0aW5lcyAoIzQ2MTUwKS4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9zdWJycyk6IENoZWNrIG51bWJlciBvZgotCWBTdWJycycgZGljdGlvbmFyeSBlbnRyaWVzIGFnYWluc3Qgc2l6ZSBvZiBkYXRhIHN0cmVhbS4KLQotMjAxNS0xMC0wNyAgS29zdHlhIFNlcmVicnlhbnkgIDxrY2NAZ29vZ2xlLmNvbT4KLQotCVtmdGZ1enplcl0gQWRkIHN1cHBvcnQgZm9yIExMVk0ncyBMaWJGdXp6ZXIuCi0KLQkqIHNyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYywgc3JjL3Rvb2xzL3J1bmlucHV0LmNjOiBOZXcgZmlsZXMuCi0KLTIwMTUtMTAtMDYgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtzbW9vdGhdIEZhc3RlciBhbHRlcm5hdGl2ZSBsaW5lIHJlbmRlcmVyLgotCi0JVGhpcyBpbXBsZW1lbnRhdGlvbiByZW5kZXJzIHRoZSBlbnRpcmUgbGluZSBzZWdtZW50IGF0IG9uY2Ugd2l0aG91dAotCXN1YmRpdmlkaW5nIGl0IGludG8gc2NhbmxpbmVzLiAgVGhlIG1haW4gc3BlZWQgaW1wcm92ZW1lbnQgY29tZXMgZnJvbQotCXJlZHVjaW5nIHRoZSBudW1iZXIgb2YgZGl2aXNpb25zIHRvIGp1c3QgdHdvIHBlciBsaW5lIHNlZ21lbnQsIHdoaWNoCi0JaXMgYSBiYXJlIG1pbmltdW0gdG8gY2FsY3VsYXRlIGNlbGwgY292ZXJhZ2UgaW4gYSBzbW9vdGggcmFzdGVyaXplci4KLQlOb3RhYmx5LCB0aGUgcHJvZ3Jlc3Npb24gZnJvbSBjZWxsIHRvIGNlbGwgZG9lcyBub3QgaXRzZWxmIHJlcXVpcmUgYW55Ci0JZGl2aXNpb25zIGF0IGFsbC4gIFRoZSBzcGVlZCBpbXByb3ZlbWVudCBpcyBtb3JlIG5vdGljZWFibGUgYXQgbGFyZ2VyCi0Jc2l6ZXMuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9saW5lKTogTmV3IGltcGxlbWVudGF0aW9uLgotCi0yMDE1LTEwLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbY2ZmXSBSZXR1cm4gY29ycmVjdCBQUyBuYW1lcyBmcm9tIHB1cmUgQ0ZGICgjNDYxMzApLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfcHNfbmFtZSk6IFVzZSBTRk5UIHNlcnZpY2Ugb25seSBmb3IKLQlTRk5ULgotCi0yMDE1LTEwLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gUmVwbGFjZSBsZWZ0IHNoaWZ0cyB3aXRoIG11bHRpcGxpY2F0aW9uICgjNDYxMTgpLgotCi0JKiBzcmMvYmFzZS9mdGdseXBoLmMgKGZ0X2JpdG1hcF9nbHlwaF9iYm94LCBGVF9HZXRfR2x5cGgpOiBEbyBpdC4KLQotMjAxNS0xMC0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDIuNi4xIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0JVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItNi0xJy4KLQotCSogZG9jcy9WRVJTSU9OLkRMTDogVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGJ1bXAgdmVyc2lvbiBudW1iZXIgdG8KLQkyLjYuMS4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNi8yLjYuMS8sIHMvMjYvMjYxLy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTg6MToxMi4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDEuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgW0FGX0RFQlVHX0FVVE9GSVRdOiBFbnN1cmUgQyBsaW5raW5nIGZvcgotCWR1bXBpbmcgZnVuY3Rpb25zLgotCi0yMDE1LTEwLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYnppcDIsIGd6aXBdIEF2b2lkIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAoIzQ2MTA5KS4KLQotCSogc3JjL2J6aXAyL2Z0YnppcDIuYyAoZnRfYnppcDJfZmlsZV9maWxsX2lucHV0KSwgc3JjL2d6aXAvZnRnemlwLmMKLQkoZnRfZ3ppcF9maWxlX2ZpbGxfaW5wdXQpOiBJbiBjYXNlIG9mIGFuIGVycm9yLCBhZGp1c3QgdGhlIGxpbWl0IHRvCi0JYXZvaWQgY29weWluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4KLQotMjAxNS0xMC0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2J6aXAyLCBnemlwXSBBdm9pZCBhY2Nlc3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgKCM0NjEwOSkuCi0KLQkqIHNyYy9iemlwMi9mdGJ6aXAyLmMgKGZ0X2J6aXAyX2ZpbGVfZmlsbF9vdXRwdXQpLCBzcmMvZ3ppcC9mdGd6aXAuYwotCShmdF9nemlwX2ZpbGVfZmlsbF9vdXRwdXQpOiBJbiBjYXNlIG9mIGFuIGVycm9yLCBhZGp1c3QgdGhlIGxpbWl0IHRvCi0JYXZvaWQgY29weWluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4KLQotMjAxNS0xMC0wMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gQ2xlYW4gdXAgd29ya2VyLgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9UV29ya2VyKTogUmVtb3ZlIG5ldmVyIHVzZWQgZmllbGRzLgotCi0yMDE1LTEwLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gTWFrZSBgdHRfY21hcDRfY2hhcl9tYXBfbGluZWFyJyBtb3JlIHJvYnVzdCAoIzQ2MDc4KS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X2NoYXJfbWFwX2xpbmVhcik6IFRha2UgY2FyZSBvZgotCWJvcmRlciBjb25kaXRpb25zIChpLmUuLCBpZiB0aGUgbG9vcCBleGl0cyBuYXR1cmFsbHkpLgotCi0yMDE1LTEwLTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMgKGFmX2RldmFfbm9uYmFzZV91bmlyYW5nZXMpOiBGaXggcmFuZ2VzLgotCVRoZXkgc2hvdWxkIGJlIGEgc3Vic2V0IG9mIGBhZl9kZXZhX3VuaXJhbmdlcycuCi0KLTIwMTUtMTAtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBNYWtlIGB0dF9jbWFwNF9jaGFyX21hcF9saW5lYXInIGZhc3RlciAoIzQ2MDc4KS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXA0X2NoYXJfbWFwX2xpbmVhcik6IFVzZSBpbm5lciBsb29wIHRvCi0JcmVqZWN0IHRvbyBsYXJnZSBnbHlwaCBpbmRpY2VzLgotCi0yMDE1LTA5LTMwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBDbGVhbiB1cCB3b3JrZXIuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X1RXb3JrZXIpOiBSZW1vdmUgbGlnaHRseSB1c2VkIGBsYXN0X2V5Jy4KLQkoZ3JheV9zdGFydF9jZWxsLCBncmF5X3JlbmRlcl9saW5lKTogVXBkYXRlLgotCi0yMDE1LTA5LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gUmVwbGFjZSBgbm8tYmFzZScgd2l0aCBgbm9uLWJhc2UnLgotCi0JKiBzcmMvYXV0b2ZpdC8qOiBEbyBpdC4KLQotMjAxNS0wOS0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFJld3JpdGUgYHR0X2NtYXA0X2NoYXJfbWFwX2xpbmVhcicgKCM0NjA3OCkuCi0KLQkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9jbWFwNF9jaGFyX21hcF9saW5lYXIpOiBBZGQgY29kZSB0byBiZXR0ZXIKLQlza2lwIGludmFsaWQgc2VnbWVudHMuCi0JSWYgc2VhcmNoaW5nIHRoZSBuZXh0IGNoYXJhY3RlciwgcHJvdmlkZSBhIG1vcmUgZWZmaWNpZW50IGxvZ2ljIHRvCi0Jc3BlZWQgdXAgdGhlIGNvZGUuCi0KLTIwMTUtMDktMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQWRqdXN0IG51bWJlciBvZiBnbHlwaHMgZm9yIG1hbGZvcm1lZCBgbG9jYScgdGFibGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jICh0dF9mYWNlX2xvYWRfbG9jYSk6IEltcGxlbWVudCBpdC4KLQotMjAxNS0wOS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BzaGludGVyXSBBdm9pZCBoYXJtbGVzcyBvdmVyZmxvdyAoIzQ1OTg0KS4KLQotCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYyAocHNoX2JsdWVzX3NldF96b25lcyk6IEZpeCBpdC4KLQotMjAxNS0wOS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBMYW8gc2NyaXB0LgotCi0JVGhhbmtzIHRvIERhbmggSG9uZyA8ZGFuaGhvbmdAZ21haWwuY29tPiBmb3IgZ3VpZGFuY2Ugd2l0aCBibHVlIHpvbmUKLQljaGFyYWN0ZXJzIQotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIExhby4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIExhbyBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBBZGQgTGFvIGRhdGEuCi0KLQkqIHNyYy9hdXRvZml0L2Fmc3R5bGVzLmg6IEFkZCBMYW8gZGF0YS4KLQotMjAxNS0wOS0yNyAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVtiYXNlXSBGaXggYSBsZWFrIGJ5IGJyb2tlbiBzZm50LVBTIG9yIHJlc291cmNlIGZvcmsgKCM0NjAyOCkuCi0KLQlvcGVuX2ZhY2VfZnJvbV9idWZmZXIoKSBmcmVlcyBwYXNzZWQgYnVmZmVyIGlmIHZhbGlkIGZvbnQKLQlpcyBub3QgZm91bmQuICBCdXQgaWYgY29weWluZyB0byB0aGUgYnVmZmVyIGlzIGZhaWxlZCwKLQl0aGUgYWxsb2NhdGVkIGJ1ZmZlciBzaG91bGQgYmUgZnJlZWQgd2l0aGluIHRoZSBjYWxsZXIuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbSk6IEZyZWUKLQl0aGUgYnVmZmVyIGBzZm50X3BzJyBpZiBhbiBlcnJvciBjYXVzZWQgYmVmb3JlIGNhbGxpbmcKLQlvcGVuX2ZhY2VfZnJvbV9idWZmZXIoKS4KLQkoTWFjX1JlYWRfc2ZudF9SZXNvdXJjZSk6IEZyZWUgdGhlIGJ1ZmZlciBgc2ZudF9kYXRhJyBpZgotCWFuIGVycm9yIGNhdXNlZCBiZWZvcmUgY2FsbGluZyBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoKTsKLQotMjAxNS0wOS0yNyAgc3V6dWtpIHRvc2hpeWEgIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLQotCVttYWNdIEZpeCBidWZmZXIgc2l6ZSBjYWxjdWxhdGlvbiBmb3IgTFdGTiBmb250LgotCi0JKiBzcmMvYmFzZS9mdG1hYy5jIChyZWFkX2x3Zm4pOiBDYXN0IHBvc3Rfc2l6ZSB0byBGVF9VTG9uZwotCXRvIHByZXZlbnQgY29uZnVzZWQgY29weSBieSB0b28gbGFyZ2UgY2h1bmsgc2l6ZS4KLQotMjAxNS0wOS0yNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoUElYRUxfTUFTSyk6IFJlbW92ZSB1bnVzZWQgbWFjcm8uCi0KLTIwMTUtMDktMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBNaW5vciB0cmFjaW5nIGltcHJvdmVtZW50LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3Nfc2NhbGVfZGltKTogRG9uJ3QgZW1pdAotCWJsdWUgem9uZXMgaGVhZGVyIGxpbmUgaWYgdGhlcmUgYXJlIG5vIGJsdWUgem9uZXMuCi0KLTIwMTUtMDktMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiemlwMiwgZ3ppcCwgbHp3XSBIYXJtb25pemUgZnVuY3Rpb24gc2lnbmF0dXJlcyB3aXRoIHByb3RvdHlwZS4KLQotCVN1Z2dlc3RlZCBieSBIaW4tVGFrIExldW5nLgotCi0JKiBzcmMvYnppcDIvZnRiemlwMi5jIChmdF9iemlwMl9zdHJlYW1faW8pLCBzcmMvZ3ppcC9mdGd6aXAuYwotCShmdF9nemlwX3N0cmVhbV9pbyksIHNyYy9sencvZnRsencuYyAoZnRfbHp3X3N0cmVhbV9pbyk6IERvIGl0LgotCi0yMDE1LTA5LTI2ICBIaW4tVGFrIExldW5nICA8aHRsMTBAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotCi0JQWRkIG5ldyBGVF9MT0FEX0NPTVBVVEVfTUVUUklDUyBsb2FkIGZsYWcuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfTE9BRF9DT01QVVRFX01FVFJJQ1MpOiBOZXcgbWFjcm8uCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChjb21wdXRlX2dseXBoX21ldHJpY3MpOiBVc2FnZS4KLQotMjAxNS0wOS0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoTWFjX1JlYWRfc2ZudF9SZXNvdXJjZSk6IEFkZCBjYXN0LgotCi0yMDE1LTA5LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTFdIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIG51bWJlciBvZiBnbHlwaHMgKCM0NjAyOSkuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfY2hhcnN0cmluZ3MpOiBDaGVjayBudW1iZXIgb2YKLQlgQ2hhclN0cmluZ3MnIGRpY3Rpb25hcnkgZW50cmllcyBhZ2FpbnN0IHNpemUgb2YgZGF0YSBzdHJlYW0uCi0KLTIwMTUtMDktMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBCZXR0ZXIgY2hlY2tzIGZvciBpbnZhbGlkIGNtYXBzICgyLzIpICgjNDYwMTkpLgotCi0JV2hpbGUgdGhlIGN1cnJlbnQgY29kZSBpbiBgRlRfR2V0X05leHRfQ2hhcicgY29ycmVjdGx5IHJlamVjdHMKLQlvdXQtb2YtYm91bmRzIGdseXBoIGluZGljZXMsIGl0IGNhbiBiZSBleHRyZW1lbHkgc2xvdyBmb3IgbWFsZm9ybWVkCi0JY21hcHMgdGhhdCB1c2UgMzJiaXQgdmFsdWVzLiAgVGhpcyBjb21taXQgdHJpZXMgdG8gaW1wcm92ZSB0aGF0LgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDhfY2hhcl9uZXh0LCB0dF9jbWFwMTJfbmV4dCwKLQl0dF9jbWFwMTJfY2hhcl9tYXBfYmluYXJ5LCB0dF9jbWFwMTNfbmV4dCwKLQl0dF9jbWFwMTNfY2hhcl9tYXBfYmluYXJ5KTogUmVqZWN0IGdseXBoIGluZGljZXMgbGFyZ2VyIHRoYW4gb3IKLQllcXVhbCB0byB0aGUgbnVtYmVyIG9mIGdseXBocy4KLQotMjAxNS0wOS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2UsIHNmbnRdIEJldHRlciBjaGVja3MgZm9yIGludmFsaWQgY21hcHMgKDEvMikuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9HZXRfQ2hhcl9JbmRleCk6IERvbid0IHJldHVybiBvdXQtb2YtYm91bmRzCi0JZ2x5cGggaW5kaWNlcy4KLQkoRlRfR2V0X0ZpcnN0X0NoYXIpOiBVcGRhdGVkLgotCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDZfY2hhcl9uZXh0KTogRG9uJ3QgcmV0dXJuIGNoYXJhY3RlcgotCWNvZGVzIGdyZWF0ZXIgdGhhbiAweEZGRkYuCi0KLQkodHRfY21hcDhfY2hhcl9pbmRleCk6IEF2b2lkIGludGVnZXIgb3ZlcmZsb3cgaW4gY29tcHV0YXRpb24gb2YKLQlnbHlwaCBpbmRleC4KLQkodHRfY21hcDhfY2hhcl9uZXh0KTogQXZvaWQgaW50ZWdlciBvdmVyZmxvd3MgaW4gY29tcHV0YXRpb24gb2YKLQlib3RoIG5leHQgY2hhcmFjdGVyIGNvZGUgYW5kIGdseXBoIGluZGV4LgotCi0JKHR0X2NtYXAxMF9jaGFyX2luZGV4KTogRml4IHVuc2lnbmVkIGludGVnZXIgbG9naWMuCi0JKHR0X2NtYXAxMF9jaGFyX25leHQpOiBBdm9pZCBpbnRlZ2VyIG92ZXJmbG93IGluIGNvbXB1dGF0aW9uIG9mCi0JbmV4dCBjaGFyYWN0ZXIgY29kZS4KLQotCSh0dF9jbWFwMTJfbmV4dCk6IEF2b2lkIGludGVnZXIgb3ZlcmZsb3dzIGluIGNvbXB1dGF0aW9uIG9mIGJvdGgKLQluZXh0IGNoYXJhY3RlciBjb2RlIGFuZCBnbHlwaCBpbmRleC4KLQkodHRfY21hcDEyX2NoYXJfbWFwX2JpbmFyeSk6IERpdHRvLgotCSh0dF9jbWFwMTJfY2hhcl9uZXh0KTogU2ltcGxpZnkuCi0KLQkodHRfY21hcDEzX2NoYXJfbWFwX2JpbmFyeSk6IEF2b2lkIGludGVnZXIgb3ZlcmZsb3cgaW4gY29tcHV0YXRpb24KLQlvZiBuZXh0IGNoYXJhY3RlciBjb2RlLgotCSh0dF9jbWFwMTNfY2hhcl9uZXh0KTogU2ltcGxpZnkuCi0KLTIwMTUtMDktMjEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbYmFzZV0gQ2hlY2sgdG9vIGxvbmcgUE9TVCBhbmQgc2ZudCByZXNvdXJjZSAoIzQ1OTE5KS4KLQotCSogc3JjL2Jhc2UvZnRiYXNlLmggKEZUX01BQ19SRk9SS19NQVhfTEVOKTogTWF4aW11bSBsZW5ndGggb2YgdGhlCi0JcmVzb3VyY2UgZm9yayBmb3IgTWFjIE9TLiAgUmVzb3VyY2UgZm9ya3MgbGFyZ2VyIHRoYW4gMTYgTUIgY2FuIGJlCi0Jd3JpdHRlbiBidXQgY2FuJ3QgYmUgaGFuZGxlZCBjb3JyZWN0bHksIGF0IGxlYXN0IGluIENhcmJvbiByb3V0aW5lLgotCVNlZSBodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9lbi11cy9rYi8xMzA0MzcuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChNYWNfUmVhZF9QT1NUX1Jlc291cmNlKTogTm8gbmVlZCB0byB1c2UgYDB4JwotCXByZWZpeCBmb3IgYCVwJyBmb3JtYXR0ZXIuCi0KLQkqIHNyYy9iYXNlL2Z0YmFzZS5jIChNYWNfUmVhZF9QT1NUX1Jlc291cmNlKTogQ2hlY2sgdGhlIGZyYWdtZW50IGFuZAotCXRvdGFsIHNpemUgb2YgdGhlIGNvbmNhdGVuYXRlZCBQT1NUIHJlc291cmNlIGJlZm9yZSBidWZmZXIKLQlhbGxvY2F0aW9uLgotCShNYWNfUmVhZF9zZm50X1Jlc291cmNlKTogQ2hlY2sgdGhlIGRlY2xhcmVkIHNpemUgb2Ygc2ZudCByZXNvdXJjZQotCWJlZm9yZSBidWZmZXIgYWxsb2NhdGlvbi4KLQotCSogc3JjL2Jhc2UvZnRtYWMuYyAocmVhZF9sd2ZuLCBGVF9OZXdfRmFjZV9Gcm9tX1NGTlQpOiBDaGVjayB0aGUKLQl0b3RhbCByZXNvdXJjZSBzaXplIGJlZm9yZSBidWZmZXIgYWxsb2NhdGlvbi4KLQotMjAxNS0wOS0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIEltcHJvdmUgaGFuZGxpbmcgb2YgaW52YWxpZCBTRk5UIHRhYmxlIGVudHJpZXMgKCM0NTk4NykuCi0KLQlUaGlzIHBhdGNoIGZpeGVzIHdlYWtuZXNzZXMgaW4gZnVuY3Rpb24gYHR0X2ZhY2VfbG9hZF9mb250X2RpcicuCi0KLQktIEl0IGluY29ycmVjdGx5IGFzc3VtZWQgdGhhdCB2YWxpZCB0YWJsZXMgYXJlIGFsd2F5cyBhdCB0aGUKLQkgIGJlZ2lubmluZy4gIEFzIGEgY29uc2VxdWVuY2UsIHNvbWUgdmFsaWQgdGFibGVzIGFmdGVyIGludmFsaWQKLQkgIGVudHJpZXMgKHdoaWNoIGFyZSBpZ25vcmVkKSB3ZXJlIG5ldmVyIHNlZW4uCi0KLQktIER1cGxpY2F0ZSB0YWJsZSBlbnRyaWVzICh0aGlzIGlzLCBoYXZpbmcgdGhlIHNhbWUgdGFnKSB3ZXJlIG5vdAotCSAgcmVqZWN0ZWQuCi0KLQktIFRoZSBudW1iZXIgb2YgdmFsaWQgdGFibGVzIHdhcyBzb21ldGltZXMgdG9vIGxhcmdlLCBsZWFkaW5nIHRvCi0JICBhY2Nlc3Mgb2YgaW52YWxpZCB0YWJsZXMuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChjaGVja190YWJsZV9kaXIpOiBBZGQgYXJndW1lbnQgdG8gcmV0dXJuIG51bWJlcgotCW9mIHZhbGlkIHRhYmxlcy4KLQlBZGQgYW5vdGhlciB0cmFjaW5nIG1lc3NhZ2UuCi0JKHR0X2ZhY2VfbG9hZF9mb250X2Rpcik6IE9ubHkgYWxsb2NhdGUgdGFibGUgYXJyYXkgZm9yIHZhbGlkCi0JZW50cmllcyBhcyByZXR1cm5lZCBieSBgY2hlY2tfdGFibGVfZGlyJy4KLQlSZWplY3QgZHVwbGljYXRlIHRhYmxlcyBhbmQgYWRqdXN0IG51bWJlciBvZiB2YWxpZCB0YWJsZXMKLQlhY2NvcmRpbmdseS4KLQotMjAxNS0wOS0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gSW1wcm92ZSBgRlRfQUJTJyBmaXggZnJvbSAyMDE1LTA5LTE3ICgjNDU5OTkpLgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2xvYWRfZm9udCk6IERvIGZpcnN0IHRoZSBjYXN0IHRvIEZUX1Nob3J0LAotCXRoZW4gdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUuCi0JQWxzbyBhcHBseSBGVF9BQlMgdG8gYGhlaWdodCcuCi0KLTIwMTUtMDktMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlNDJdIEZpeCBtZW1vcnkgbGVhayAoIzQ1OTg5KS4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VfY2hhcnN0cmluZ3MpOiBBbGxvdyBvbmx5IGEgc2luZ2xlCi0JYENoYXJTdHJpbmdzJyBhcnJheS4KLQotMjAxNS0wOS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BzYXV4XSBGaXggbWVtb3J5IGxlYWsgKCM0NTk4NikuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfcGFyc2VyX2xvYWRfZmllbGQpIDxUMV9GSUVMRF9UWVBFX01NX0JCT1g+OgotCUZyZWUgYHRlbXAnIGluIGNhc2Ugb2YgZXJyb3IuCi0KLTIwMTUtMDktMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eF0gSW1wcm92ZSB0cmFjaW5nIG1lc3NhZ2UuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfcGFyc2VyX2xvYWRfZmllbGQpIDxUMV9GSUVMRF9UWVBFX01NX0JCT1g+OgotCUhhbmRsZSBwbHVyYWwgY29ycmVjdGx5LgotCi0yMDE1LTA5LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcGNmXSBGaXggaW50ZWdlciBvdmVyZmxvd3MgKCM0NTk4NSkuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfbG9hZF9mb250KTogVXNlIEZUX011bERpdi4KLQotMjAxNS0wOS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BjZl0gVXNlIEZUX0FCUyBmb3Igc29tZSBwcm9wZXJ0eSB2YWx1ZXMgKCM0NTg5MykuCi0KLQkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfbG9hZF9mb250KTogVGFrZSBhYnNvbHV0ZSB2YWx1ZXMgZm9yCi0JQVZFUkFHRV9XSURUSCwgUE9JTlRfU0laRSwgUElYRUxfU0laRSwgUkVTT0xVVElPTl9YLCBhbmQKLQlSRVNPTFVUSU9OX1kuICBJbiB0cmFjaW5nIG1vZGUsIGFkZCB3YXJuaW5ncy4KLQotMjAxNS0wOS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWlub3IgZml4ZXMgZm9yIHNvbWUgY2xhbmcgd2FybmluZ3MuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9FbWJvbGRlblhZKTogQ2FzdCwgcG9zc2libGUgbWlzc2luZwotCWluaXRpYWxpemF0aW9uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQpOiBDYXN0LgotCi0yMDE1LTA5LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTEsIHR5cGU0Ml0gRml4IG1lbW9yeSBsZWFrcyAoIzQ1OTY2KS4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9ibGVuZF9heGlzX3R5cGVzKTogSGFuZGxlIG11bHRpcGxlIGF4aXMKLQluYW1lcy4KLQkocGFyc2VfYmxlbmRfZGVzaWduX21hcCk6IEFsbG93IG9ubHkgYSBzaW5nbGUgZGVzaWduIG1hcC4KLQkocGFyc2VfZW5jb2RpbmcpOiBIYW5kbGUgbXVsdGlwbGUgZW5jb2RpbmcgdmVjdG9ycy4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VfZW5jb2RpbmcpOiBIYW5kbGUgbXVsdGlwbGUKLQllbmNvZGluZyB2ZWN0b3JzLgotCi0yMDE1LTA5LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBpbnRlZ2VyIHR5cGUgKCM0NTk2NSkuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfc3ludGhfc2ZudF9jaGVja3N1bSk6IEltcGxlbWVudCBpdC4KLQotMjAxNS0wOS0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2xvYWRfZm9udCk6IEZpeCBpbnRlZ2VyIG92ZXJmbG93ICgjNDU5NjQpLgotCi0yMDE1LTA5LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTEsIHR5cGU0Ml0gQ2hlY2sgZW5jb2RpbmcgYXJyYXkgc2l6ZSAoIzQ1OTYxKS4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9lbmNvZGluZyksIHNyYy90eXBlNDIvdDQycGFyc2UuYwotCSh0NDJfcGFyc2VfZW5jb2RpbmcpOiBEbyBpdC4KLQotMjAxNS0wOS0xNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRml4KSBbRlRfTE9ORzY0XTogSW1wcm92ZS4KLQotMjAxNS0wOS0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGUxXSBGaXggYW5vdGhlciBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93ICgjNDU5NTUpLgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZSAoVDFfR2V0X1ByaXZhdGVfRGljdCk6IEFzc3VyZSB0aGF0IGNoZWNrIGZvcgotCWBlZXhlYycgZG9lc24ndCBleGNlZWQgYGxpbWl0Jy4KLQotMjAxNS0wOS0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmVwbGFjZSBgbWtpbnN0YWxsZGlycycgd2l0aCBBQ19QUk9HX01LRElSX1AuCi0KLQkqIGJ1aWxkcy91bml4L21raW5zdGFsbGRpcnM6IFJlbW92ZWQsIG5vIGxvbmdlciBuZWVkZWQuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IENhbGwgYEFDX1BST0dfTUtESVJfUCcuCi0JVXBkYXRlIHB3ZCBjYWxsIGZvciBgJElOU1RBTEwnLgotCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbiAoTUtJTlNUQUxMRElSUyk6IFVzZSBgQE1LRElSX1BAJy4KLQotCSogYXV0b2dlbi5zaDogVXBkYXRlZC4KLQotMjAxNS0wOS0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3dpbmZvbnRzXSBDaGVjayBhbGlnbm1lbnQgc2hpZnQgY291bnQgZm9yIHJlc291cmNlIGRhdGEgKCM0NTkzOCkuCi0KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2ZhY2VfZ2V0X2RsbF9mb250KTogSW1wbGVtZW50IGl0LgotCi0yMDE1LTA5LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTFdIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93ICgjNDU5MjMpLgotCi0JKiBzcmMvdHlwZTEvdDFwYXJzZS5jIChUMV9HZXRfUHJpdmF0ZV9EaWN0KTogQXNzdXJlIGBjdXInIGRvZXNuJ3QKLQlwb2ludCB0byBlbmQgb2YgZmlsZSBidWZmZXIuCi0KLTIwMTUtMDktMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtnemlwXSBGaXggYWNjZXNzIG9mIHNtYWxsIGNvbXByZXNzZWQgZmlsZXMgKCM0NTkzNykuCi0KLQkqIHNyYy9nemlwL2Z0Z3ppcC5jIChmdF9nemlwX3N0cmVhbV9jbG9zZSk6IEF2b2lkIG1lbW9yeSBsZWFrLgotCi0JKGZ0X2d6aXBfZ2V0X3VuY29tcHJlc3NlZF9maWxlKTogQ29ycmVjdCBieXRlIG9yZGVyIHdoaWxlIHJlYWRpbmcKLQl1bnNpZ25lZCBsb25nIHZhbHVlLiAgV2l0aG91dCB0aGlzIGNoYW5nZSwgdGhlIHdob2xlIG9wdGltaXphdGlvbiBvZgotCWFjY2Vzc2luZyBzbWFsbCBmaWxlcyBpbiBgRlRfU3RyZWFtX09wZW5HemlwJyBpcyBuZXZlciBleGVjdXRlZCEgIEFzCi0JYSBjb25zZXF1ZW5jZSwgYWNjZXNzIHRvIFBDRiBmaWxlcyBpbiBnZW5lcmFsICh3aGljaCBhcmUgbm9ybWFsbHkKLQlzbWFsbCBmaWxlcykgc2hvdWxkIGJlIG11Y2ggaW1wcm92ZWQgbm93IGFzIG9yaWdpbmFsbHkgaW50ZW5kZWQuCi0KLTIwMTUtMDktMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eF0gRml4IHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgKCM0NTkyMikuCi0KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfcGFyc2VyX3NraXBfUFNfdG9rZW4pOiBJZiBhIHRva2VuIGlzCi0JZW5jbG9zZWQgaW4gYmFsYW5jZWQgZXhwcmVzc2lvbnMsIGVuc3VyZSB0aGF0IHRoZSBjdXJzb3IgcG9zaXRpb24KLQlkb2Vzbid0IGdldCBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBsaW1pdC4KLQotMjAxNS0wOS0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2VdIEF2b2lkIGNyYXNoIHdoaWxlIHRyYWNpbmcgYGxvYWRfbWFjX2ZhY2UnLgotCi0JUmVwb3J0ZWQgaW4gU2F2YW5uYWggYnVnICM0NTkxOS4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGxvYWRfbWFjX2ZhY2UpOiBIb25vdXIgRlRfT1BFTl9NRU1PUlkgd2hpbGUKLQl0cmFjaW5nLgotCi0yMDE1LTA5LTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHlwZTQyXSBGaXggZW5kbGVzcyBsb29wICgjNDU5MjApLgotCi0JKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZV9lbmNvZGluZyk6IFN5bmNocm9uaXplIHdpdGgKLQl0eXBlMSdzIGBwYXJzZV9lbmNvZGluZycuCi0KLTIwMTUtMDktMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtkb2NtYWtlcl0gQWxsb3cgYC0nIGluIGJvbGQgYW5kIGl0YWxpYyBtYXJrdXAuCi0KLQkqIHNyYy90b29scy9kb2NtYWtlci9zb3VyY2VzLnB5IChyZV9pdGFsaWMsIHJlX2JvbGQpOiBBZGp1c3QKLQlhY2NvcmRpbmdseS4KLQotMjAxNS0wOS0wOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfUm91bmRGaXgpOiBJbXByb3ZlLgotCi0yMDE1LTA5LTA5ICBXb2pjaWVjaCBNYW1yYWsgIDx3bWFtcmFrQGdtYWlsLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX0NlaWxGaXgsIEZUX0Zsb29yRml4KTogTm9ybWFsaXplLgotCi0JVGhpcyBjb21taXQgbWFrZXMgdGhlIGZ1bmN0aW9ucyBiZWhhdmUgYXMgZXhwZWN0ZWQsIHRoaXMgaXMsCi0Jcm91bmRpbmcgdG93YXJkcyBwbHVzIG9yIG1pbnVzIGluZmluaXR5LgotCi0yMDE1LTA5LTA3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9saW5lKTogU2ltcGxpZnkgY2xpcHBpbmcuCi0KLTIwMTUtMDktMDQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtyYXN0ZXIsc21vb3RoXSBNaWNyb29wdGltaXphdGlvbnMuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoSW5zZXJ0X1lfVHVybiwgRmluYWxpemVfUHJvZmlsZV9UYWJsZSwKLQlCZXppZXJfVXApOiBVc2UgZG8td2hpbGUgbG9vcHMuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9zY2FubGluZSwgZ3JheV9yZW5kZXJfbGluZSwKLQlncmF5X2NvbnZlcnRfZ2x5cGgpOiBEaXR0by4KLQotMjAxNS0wOS0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFJlZGVzaWduIGNvZGUgcmFuZ2VzICgyLzIpLgotCi0JVGhpcyBjb21taXQgYWRkcyB0d28gZmFsbGJhY2sgc2NyaXB0cyAoYGxhdGInLCBgbGF0cCcpIGFuZAotCWltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIG5vLWJhc2UgY2hhcmFjdGVyIHJhbmdlcyBpbnRyb2R1Y2VkIGluCi0JdGhlIHByZXZpb3VzIGNvbW1pdC4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9TY3JpcHRDbGFzc1JlYyk6IEFkZAotCWBzY3JpcHRfdW5pX25vYmFzZV9yYW5nZXMnIGZpZWxkLgotCShBRl9ERUZJTkVfU0NSSVBUX0NMQVNTKTogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaCwgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIGBsYXRiJyBhbmQKLQlgbGF0cCcgZmFsbGJhY2sgc2NyaXB0cy4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZXMgZm9yIExhdGluIHN1YnNjcmlwdCBhbmQKLQlzdXBlcnNjcmlwdCBmYWxsYmFjayBzY3JpcHRzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oIChBRl9OT0JBU0UpOiBOZXcgc3R5bGUgZmxhZyBmb3Igbm8tYmFzZQotCWNoYXJhY3RlcnMuCi0JKEFGX1NUWUxFX01BU0spOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChTQ1JJUFQpOiBVcGRhdGVkLgotCShhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zdHlsZV9jb3ZlcmFnZSk6IEhhbmRsZSBuZXcgc3R5bGUgZmxhZy4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19hcHBseSk6IEhhbmRsZSBuZXcgc3R5bGUKLQlmbGFnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5oIChTQ1JJUFQpOiBVc2UgaXQgdG8gZXhwb3J0IG5vLWJhc2UgcmFuZ2VzLgotCi0yMDE1LTA5LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gUmVkZXNpZ24gY29kZSByYW5nZXMgKDEvMikuCi0KLQlUaGlzIHBhdGNoIGludHJvZHVjZXMgYXV4aWxpYXJ5IGNvZGUgcmFuZ2VzIHRoYXQgaWRlbnRpZnkgbm8tYmFzZQotCWNoYXJhY3RlcnM7IHRoZXkgcmVmZXIgdG8gZ2x5cGhzIG9mIGEgc2NyaXB0IHRoYXQgc2hvdWxkIGJlIGhpbnRlZAotCXdpdGhvdXQgYWxpZ25tZW50cyB0byBibHVlIHpvbmVzIChtb3N0bHkgZGlhY3JpdGljcykuCi0KLQlJdCBhbHNvIHNwbGl0cyBvZmYgcmFuZ2VzIGZvciBmYWxsYmFjayBzY3JpcHRzIHRoYXQgaGFuZGxlIHN1YnNjcmlwdAotCWFuZCBzdXBlcnNjcmlwdCBjaGFyYWN0ZXJzIG5vdCBjb3ZlcmVkIGJ5IE9wZW5UeXBlIGZlYXR1cmVzLiAgRm9yCi0JZXhhbXBsZSwgdGhpcyBncmVhdGx5IGhlbHBzIGltcHJvdmUgdGhlIGhpbnRpbmcgb2YgdmFyaW91cyBwaG9uZXRpYwotCWFscGhhYmV0cywgd2hpY2ggY29udGFpbiBhIGxhcmdlIGFtb3VudCBjaGFyYWN0ZXJzIHRoYXQgbG9vayBsaWtlCi0Jc3VwZXJzY3JpcHQgZ2x5cGhzLgotCi0JRmluYWxseSwgY29kZSByYW5nZXMgYXJlIHVwZGF0ZWQgdG8gVW5pY29kZSA4LjAsIGFuZCBlbmNsb3NlZAotCWNoYXJhY3RlcnMgYXJlIHJlbW92ZWQgaW4gZ2VuZXJhbCBzaW5jZSB0aGV5IG5vcm1hbGx5IGxvb2sgYmV0dGVyIGlmCi0JdGhleSBzdGF5IHVuaGludGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jIChhZl9sYXRuX3VuaXJhbmdlcyk6IFVwZGF0ZWQgdG8gVW5pY29kZQotCTguMC4KLQlTcGxpdCBvZmYgc3VwZXJzY3JpcHQtbGlrZSBhbmQgc3Vic2NyaXB0LWxpa2UgZ2x5cGhzIGludG8uLi4KLQotCShhZl9sYXRiX3VuaXJhbmdlcywgYWZfbGF0cF91bmlyYW5nZXMpOiAuLi4gdGhlc2UgdHdvIG5ldyBhcnJheXMuCi0KLQkoYWZfeHh4eF9ub2Jhc2VfdW5pcmFuZ2VzKTogTmV3IGFycmF5cyB0aGF0IGhvbGQgbm8tYmFzZSBjaGFyYWN0ZXJzCi0Jb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIHJhbmdlcy4KLQotMjAxNS0wOS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFBhc3MgZ2x5cGggaW5kZXggdG8gaGludGluZyBmdW5jdGlvbi4KLQotCU5vIGZ1bmN0aW9uYWxpdHkgY2hhbmdlIHlldC4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9Xcml0aW5nU3lzdGVtX0FwcGx5SGludHNGdW5jKTogUGFzcwotCWdseXBoIGluZGV4LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jLCBzcmMvYXV0b2ZpdC9hZmNqay5oIChhZl9jamtfaGludHNfYXBwbHkpLAotCXNyYy9hdXRvZml0L2FmZHVtbXkuYyAoYWZfZHVtbXlfaGludHNfYXBwbHkpLCBzcmMvYXV0b2ZpdC9hZmluZGljLmMKLQkoYWZfaW5kaWNfaGludHNfYXBwbHkpLCBzcmMvYXV0b2ZpdC9hZmxhdGluLmMKLQkoYWZfbGF0aW5faGludHNfYXBwbHkpLCBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jCi0JKGFmX2xhdGluMl9oaW50c19hcHBseSksIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2cpOgotCVVwZGF0ZWQuCi0KLTIwMTUtMDgtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBDb2RlIGNsZWFuLXVwLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oIChBRl9TVFlMRV9NQVNLKTogTmV3IG1hY3JvLgotCShBRl9TVFlMRV9VTkFTU0lHTkVEKTogVXNlIEFGX1NUWUxFX01BU0sgZm9yIGRlZmluaXRpb24uCi0KLQkqIHNyYy9hdXRvZml0L2FmZ2xvYmFsLmMgKGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3N0eWxlX2NvdmVyYWdlKToKLQlVcGRhdGVkLgotCi0yMDE1LTA4LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gTWFrZSBnbHlwaCBzdHlsZSBhcnJheSB1c2UgMTZiaXQgdmFsdWVzLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0YXV0b2guaCAoRlRfUHJvcF9HbHlwaFRvU2NyaXB0TWFwKTogVXNlCi0JYEZUX1VTaG9ydCcgZm9yIGBtYXAnIGZpZWxkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zdHlsZV9jb3ZlcmFnZSwKLQlhZl9mYWNlX2dsb2JhbHNfbmV3KSwgc3JjL2F1dG9maXQvaGJzaGltLmMsIHNyYy9hdXRvZml0L2hic2hpbS5oCi0JKGFmX2dldF9jb3ZlcmFnZSk6IFVzZSBGVF9VU2hvcnQgZm9yIGBnbHlwaF9zdHlsZXMnIGFycmF5LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5oIChBRl9TVFlMRV9VTkFTU0lHTkVELCBBRl9ESUdJVCk6IEV4dGVuZCB0bwotCTE2IGJpdHMuCi0JKEFGX0ZhY2VHbG9iYWxzUmVjKTogVXNlIGBGVF9VU2hvcnQnIGZvciBgZ2x5cGhfc3R5bGVzJyBmaWVsZC4KLQotMjAxNS0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBOZWVkIGhhcmZidXp6ID49IDAuOS4yMSAoIzQ1ODI4KS4KLQotMjAxNS0wOC0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2VdIEltcHJvdmUga2VybmluZyB0cmFjaW5nIGFuZCBkb2N1bWVudGF0aW9uLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X0tlcm5pbmcpOiBFbWl0IHRyYWNpbmcgbWVzc2FnZSBpZgotCXNjYWxlZC1kb3duIGtlcm5pbmcgdmFsdWVzIGRpZmZlci4KLQotMjAxNS0wOC0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Jhc3Rlcl0gUmVtb3ZlIGxhc3QgcmVtbmFudHMgb2YgYHJhc3RlcjUnIGRyaXZlci4KLQotCSogc3JjL3Jhc3Rlci9mdHJlbmQxLmggKGZ0X3Jhc3RlcjVfcmVuZGVyZXJfY2xhc3MpOiBSZW1vdmVkLgotCi0JKiBzcmMvcmFzdGVyL3Jhc3RwaWMuYywgc3JjL3Jhc3Rlci9yYXN0cGljLmgKLQkoZnRfcmFzdGVyNV9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCwKLQlmdF9yYXN0ZXI1X3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKTogUmVtb3ZlZC4KLQotMjAxNS0wOC0xNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEltcHJvdmUgZW1ib2xkZW5lciAoIzQ1NTk2KS4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0VtYm9sZGVuWFkpOiBDb3JyZWN0IGRpc3BsYWNlbWVudAotCW9mIHplcm8tbGVuZ3RoIHNlZ21lbnRzLgotCi0yMDE1LTA4LTE2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gUmVvcHRpbWl6ZSBhcml0aG1ldGljLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRGl2LCBGVF9NdWxGaXgpIFshRlRfTE9ORzY0XTogUmVtb3ZlCi0Jc3BlY2lhbCBjYXNlcyB0aGF0IHNsb3cgZG93biB0aGUgZ2VuZXJhbCB1c2UuCi0KLTIwMTUtMDgtMTUgIHBhemVyICA8aWJlbWFkQGdtYWlsLmNvbT4KLQotCUZpeCBDKysgY29tcGlsYXRpb24gKCM0NTc2MikuCi0KLQkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKGZ0X291dGxpbmVfZ2x5cGhfY2xhc3MpOiBVc2UKLQlGVF9DQUxMQkFDS19UQUJMRS4KLQotMjAxNS0wOC0xNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBDbGVhbiB1cC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfUHJvY2Vzc19Db21wb3NpdGVfQ29tcG9uZW50KTogVXNlCi0JYEZUX091dGxpbmVfVHJhbnNmb3JtJyBhbmQgYEZUX091dGxpbmVfVHJhbnNsYXRlJy4KLQkodHJhbnNsYXRlX2FycmF5KTogRHJvcHBlZC4KLQotMjAxNS0wOC0xNCAgQW5kcmVhcyBFbmdlICA8YW5kcmVhcy5lbmdlQGlucmlhLmZyPgotCi0JKiBidWlsZHMvdW5peC9kZXRlY3QubWsgKENPTkZJR19TSEVMTCk6IERvbid0IGhhbmRsZSBpdCAoIzQ0MjYxKS4KLQotMjAxNS0wOC0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJbnRyb2R1Y2UgbmFtZWQgaW5zdGFuY2UgYWNjZXNzIHRvIEdYIGZvbnRzLgotCi0JRm9yIGZ1bmN0aW9ucyBxdWVyeWluZyBhIGZhY2UsIGJpdHMgMTYtMzAgb2YgdGhlIGZhY2UgaW5kZXggY2FuIGhvbGQKLQl0aGUgbmFtZWQgaW5zdGFuY2UgaW5kZXggaWYgd2UgaGF2ZSBhIEdYIGZvbnQuICBUaGUgaW5kaWNlcyBzdGFydAotCXdpdGggdmFsdWUgMTsgdmFsdWUgMCBpbmRpY2F0ZXMgZm9udCBhY2Nlc3Mgd2l0aG91dCBHWCB2YXJpYXRpb24KLQlkYXRhLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0ZhY2VSZWMpOiBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oOiBEaXR0by4KLQotCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfaW5pdF9mYWNlKQotCVtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogR2V0IG51bWJlciBvZiBuYW1lZCBpbnN0YW5jZXMgYW5kCi0JZG8gYXJndW1lbnQgY2hlY2tzLgotCShzZm50X2xvYWRfZmFjZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfZmFjZV9pbml0KQotCVtUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUXTogVXNlIG5hbWVkIGluc3RhbmNlLCBvdmVyd3JpdGluZwotCXRoZSBzdHlsZSBuYW1lLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAob3Blbl9mYWNlX2Zyb21fYnVmZmVyLAotCW9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKTogVXBkYXRlZC4KLQkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IFVwZGF0ZWQuCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2ZvbnRfbG9hZCk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogTWFrZSBmdW5jdGlvbiBleGl0IGVhcmx5IGZvcgotCXB1cmUgQ0ZGIGZvbnRzIGlmIGBmb250X2luZGV4IDwgMCcuCi0JVXBkYXRlZC4KLQotCSogc3JjL2NpZC9jaWRvYmpzLmMgKGNpZF9mYWNlX2luaXQpOiBVcGRhdGVkLgotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfRmFjZV9Jbml0KTogVXBkYXRlZC4KLQkqIHNyYy9wZnIvcGZyb2Jqcy5jIChwZnJfZmFjZV9pbml0KTogVXBkYXRlZC4KLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KTogVXBkYXRlZC4KLQkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfRmFjZV9Jbml0KTogVXBkYXRlZC4KLQkqIHNyYy93aW5mb250cy93aW5mbnQuYyAoZm50X2ZhY2VfZ2V0X2RsbF9mb250LCBGTlRfRmFjZV9Jbml0KToKLQlVcGRhdGVkLgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCi0KLTIwMTUtMDgtMTIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVt0eXBlMSxjZmYsY2lkXSBTdHJlYW1saW5lIGZvbnQgbWF0cml4IGFwcGxpY2F0aW9uLgotCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9Mb2FkX0dseXBoKTogRGlyZWN0bHkgbW9kaWZ5IGFkdmFuY2VzIG9ubHkKLQlpZiBmb250IG1hdHJpeCBpcyBub3QgdHJpdmlhbC4KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCk6IERpdHRvLgotCSogc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfc2xvdF9sb2FkX2dseXBoKTogRGl0dG8gZm9yIGFkdmFuY2VzIGFuZCB0aGUKLQllbnRpcmUgb3V0bGluZS4KLQotMjAxNS0wOC0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2J1aWxkcy91bml4XSBNaW5vci4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzoKLQlzL2xpYntwcml2LHN0YXRpY2NvbmZ9L2xpYnN7cHJpdixzdGF0aWNjb25mfS8gZm9yIG9ydGhvZ29uYWxpdHkgd2l0aAotCXNpbWlsYXJseSBuYW1lZCB1cHBlcmNhc2UgdmFyaWFibGVzLgotCi0yMDE1LTA4LTEwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbdHlwZTEsY2lkLHR5cGU0Ml0gTWlub3IgaW1wcm92ZW1lbnRzLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHQxX3BhcnNlX2ZvbnRfbWF0cml4KTogU2NhbGUgdW5pdHMgcGVyIEVNIG9ubHkKLQl3aGVuIG5lY2Vzc2FyeS4gUmVmcmVzaCBjb21tZW50cy4KLQkqIHNyYy9jaWQvY2lkbG9hZC5jIChjaWRfcGFyc2VfZm9udF9tYXRyaXgpOiBEaXR0by4KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX2ZvbnRfbWF0cml4KTogUmVmcmVzaCBjb21tZW50cy4KLQotMjAxNS0wOC0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGU0Ml0gRml4IGdseXBoIGFjY2Vzcy4KLQotCVRoaXMgaXMgYSBzZXZlcmUgYnVnOiBXZSd2ZSBtaXNzZWQgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uLCBhcwotCWRlc2NyaWJlZCBpbiB0aGUgVHlwZSA0MiBzcGVjaWZpY2F0aW9uLiAgQXMgYSByZXN1bHQsIGZ0dmlldwotCXNvbWV0aW1lcyBzaG93ZWQgaW5jb3JyZWN0IGdseXBocyBmb3IgZ2l2ZW4gZ2x5cGggbmFtZXMsIGFuZCBldmVuCi0JZGlzcGxheWVkIGBlcnJvciAweDAwMDYnIChpbnZhbGlkIGFyZ3VtZW50ISkgaW4gY2FzZSB0aGUgbnVtYmVyIG9mCi0JZ2x5cGggaW5kaWNlcyBkaWZmZXJlZCBiZXR3ZWVuIHRoZSBUeXBlIDQyIGZvbnQgYW5kIHRoZSBlbWJlZGRlZAotCVRURi4KLQotCUFwcGFyZW50bHksIG5vb25lIGV2ZXIgbm90aWNlZCBpdDsgdGhpcyBzaG93cyBob3cgbXVjaCBUeXBlIDQyIGZvbnRzCi0JYXJlIGluIHVzZS4uLgotCi0JKiBzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0dseXBoU2xvdF9Mb2FkKTogTWFwIFR5cGUgNDIgZ2x5cGggaW5kZXgKLQl0byBlbWJlZGRlZCBUVEYncyBnbHlwaCBpbmRleC4KLQotMjAxNS0wOC0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGU0Ml0gTWlub3IgY2xlYW4tdXAuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX2ZvbnRfbWF0cml4KTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlLgotCi0yMDE1LTA4LTA2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbdHlwZTQyXSBQYXJzZSBGb250TWF0cml4IGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9ucy4KLQotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VfZm9udF9tYXRyaXgpOiBUeXBlIDQyIEZvbnRNYXRyaXgKLQlkb2VzIG5vdCBuZWVkIHNjYWxpbmcgYnkgMTAwMC4gVW5pdHNfcGVyX0VNIGFyZSB0YWtlbiBmcm9tIHRoZQotCWVtYmVkZGVkIFRydWVUeXBlLgotCi0yMDE1LTA4LTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW1wcm92ZSBBcmFiaWMgaGludGluZy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgVGl0dXMgTmVtZXRoIDx0bkB0bnR5cG9ncmFwaHkuZXU+IChieSB1c2luZwotCXR0ZmF1dG9oaW50KS4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIG5ldXRyYWwgYmx1ZSB6b25lIGZvciB0aGUgdGF0d2VlbAotCWNoYXJhY3Rlci4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotMjAxNS0wOC0wNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBDbGVhbiB1cCB0eXBlcy4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jIChUVF9TaXplKTogTW92ZSBkZWNsYXJhdGlvbiBmcm9tIGhlcmUuCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfU2l6ZSk6IC4uLiB0byBoZXJlLgotCShUVF9Mb2FkZXJSZWMpOiBTd2l0Y2ggdG8gYXBwcm9wcmlhdGUgdHlwZXMgZm9yIGBmYWNlJyBhbmQgYHNpemUnLgotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYzogUmVtb3ZlIGNvcnJlc3BvbmRpbmcgdHlwZSBjYXN0cy4KLQkqIHNyYy90cnVldHlwZS90dHN1YnBpeC5jOiBEaXR0by4KLQotMjAxNS0wOC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEltcHJvdmUgcmVjb2duaXRpb24gb2YgZmxhdCB2cy4gcm91bmRlZCBzZWdtZW50cy4KLQotCUxvd2VyIHRoZSBmbGF0bmVzcyB0aHJlc2hvbGQgZnJvbSB1cGVtLzggdG8gdXBlbS8xNCwgbWFraW5nIHRoZQotCWF1dG8taGludGVyIGFjY2VwdCBzaG9ydGVyIGVsZW1lbnRzLgotCi0JU3luY2hyb25pemUgZmxhdC9yb3VuZCBzdGVtIHNlbGVjdGlvbiBhbGdvcml0aG0gd2l0aCBibHVlIHpvbmUgY29kZS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChGTEFUX1RIUkVTSE9MRCk6IE5ldyBtYWNyby4KLQkoYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKTogVXNlIGl0LgotCShhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzKTogQ29sbGVjdCBpbmZvcm1hdGlvbiBvbiBtYXhpbXVtCi0JYW5kIG1pbmltdW0gY29vcmRpbmF0ZXMgb2YgYG9uJyBwb2ludHM7IHVzZSB0aGlzIHRvIGFkZCBhIGNvbnN0cmFpbnQKLQlmb3IgdGhlIGZsYXQvcm91bmQgZGVjaXNpb24gc2ltaWxhciB0bwotCWBhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMnLgotCi0yMDE1LTA4LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBbm90aGVyIGxlZnQtc2hpZnQgYnVnICgjNDU2ODEpLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoSXNNYWNCaW5hcnkpOiBPbmx5IGFjY2VwdCBwb3NpdGl2ZSB2YWx1ZXMgZm9yCi0JYGRsZW4nLgotCi0yMDE1LTA4LTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gRml4IGBmdF9jb3JuZXJfb3JpZW50YXRpb24nLgotCi0JUmVtb3ZlIGNhc3RpbmcgZnJvbSBgRlRfTG9uZycgdG8gYEZUX0ludCcgdGhhdCBtaWdodCBjaGFuZ2UgdGhlIHNpZ24KLQlvZiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBtYWtlIGl0IGZhc3RlciB0b28uCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChmdF9jb3JuZXJfb3JpZW50YXRpb24pOiBPbiAzMi1iaXQgc3lzdGVtcywgc3RheQotCXdpdGggMzItYml0IGFyaXRobWV0aWMgd2hlbiBzYWZlLiBVc2UgcGxhaW4gbWF0aCBvbiA2NC1iaXQgc3lzdGVtcy4KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmM6IFJlbW92ZSBvbGQgdW51c2VkIGNvZGUuCi0KLTIwMTUtMDgtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCkKLQlbVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVF06IEZpeCBjcmFzaCBmb3IgY29tcG9zaXRlIGdseXBocwotCWhhdmluZyBhIGRlcHRoIGdyZWF0ZXIgdGhhbiAxLgotCi0yMDE1LTA4LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggdHlwbyBpbiBjbGFuZyBidWcgZnJvbSAyMDE1LTA3LTMxICgjNDU2NzgpLgotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8pOiBGaXggaW5lcXVhbGl0eS4KLQotMjAxNS0wOC0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBDTWFrZUxpc3RzLnR4dDogSW1wcm92ZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEpvaG4gQ2FyeSA8Y2FyeUB0eGNvcnAuY29tPi4KLQotMjAxNS0wOC0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW4gKGVuYWJsZV9zaGFyZWQpOiBSZW1vdmUuICBVbnVzZWQuCi0KLTIwMTUtMDgtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBtb3JlIGludmFsaWQgbGVmdC1zaGlmdHMuCi0KLQkqIHNyYy9wZnIvcGZyZ2xvYWQuYyAocGZyX2dseXBoX2xvYWRfY29tcG91bmQpOiBVc2UgbXVsdGlwbGljYXRpb24sCi0Jbm90IGxlZnQtc2hpZnQuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9sb2FkX2F2YXIsIGZ0X3Zhcl9sb2FkX2d2YXIsCi0JdHRfZmFjZV92YXJ5X2N2dCwgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBVc2UgbXVsdGlwbGljYXRpb24sCi0Jbm90IGxlZnQtc2hpZnQuCi0KLTIwMTUtMDctMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBzb21lIGJ1Z3MgZm91bmQgYnkgY2xhbmcncyBgLWZzYW5pdGl6ZT11bmRlZmluZWQnICgjNDU2NjEpLgotCi0JKiBzcmMvYmFzZS9mdHJmb3JrLmMgKEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8pOiBPbmx5IGFjY2VwdAotCXBvc2l0aXZlIHZhbHVlcyBmcm9tIGhlYWRlci4KLQlDaGVjayBvdmVyZmxvdy4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChTQ0FMRUQpOiBDb3JyZWN0bHkgaGFuZGxlIGxlZnQtc2hpZnQgb2YKLQluZWdhdGl2ZSB2YWx1ZXMuCi0KLQkqIHNyYy9iZGYvYmRmLmggKF9iZGZfZ2x5cGhfbW9kaWZpZWQsIF9iZGZfc2V0X2dseXBoX21vZGlmaWVkLAotCV9iZGZfY2xlYXJfZ2x5cGhfbW9kaWZpZWQpOiBVc2UgdW5zaWduZWQgbG9uZyBjb25zdGFudC4KLQotCSogc3JjL2JkZi9iZGZkcml2ci5jIChCREZfU2l6ZV9TZWxlY3QsIEJERl9HbHlwaF9Mb2FkKTogRG9uJ3QKLQlsZWZ0LXNoaWZ0IHZhbHVlcyB0aGF0IGNhbiBiZSBuZWdhdGl2ZS4KLQotCSogc3JjL3BjZi9wY2Zkcml2ci5jIChQQ0ZfU2l6ZV9TZWxlY3QsIFBDRl9HbHlwaF9Mb2FkKTogRG9uJ3QKLQlsZWZ0LXNoaWZ0IHZhbHVlcyB0aGF0IGNhbiBiZSBuZWdhdGl2ZS4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChTQ0FMRUQpOiBDb3JyZWN0bHkgaGFuZGxlIGxlZnQtc2hpZnQgb2YKLQluZWdhdGl2ZSB2YWx1ZXMuCi0KLQkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MpOiBEb24ndCBsZWZ0LXNoaWZ0Ci0JdmFsdWVzIHRoYXQgY2FuIGJlIG5lZ2F0aXZlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaCwKLQljb21wdXRlX2dseXBoX21ldHJpY3MsIGxvYWRfc2JpdF9pbWFnZSk6IERvbid0IGxlZnQtc2hpZnQgdmFsdWVzCi0JdGhhdCBjYW4gYmUgbmVnYXRpdmUuCi0KLTIwMTUtMDctMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCURlZmluZSBGVF9MT05HX01BWC4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCAoRlRfTE9OR19NQVgpOiBOZXcgbWFjcm8uCi0JKiBzcmMvY2ZmL2NmMmFycnN0LmMgKGNmMl9hcnJzdGFja19zZXROdW1FbGVtZW50cyk6IFVzZSBpdC4KLQotMjAxNS0wNy0yOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfVmVjdG9yX05vcm1MZW4pOiBDbGFyaWZ5LgotCi0yMDE1LTA3LTI3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9WZWN0b3JfTm9ybUxlbik6IEV4cGxpY2F0ZSB0eXBlIGNvbnZlcnNpb25zLgotCi0yMDE1LTA3LTI2ICBNYXR0aGlhcyBDbGFzZW4gIDxtYXR0aGlhcy5jbGFzZW5AZ21haWwuY29tPgotCi0JW2NmZl0gRG9uJ3QgdXNlIGBobXR4JyB0YWJsZSBmb3IgTFNCICgjNDU1MjApLgotCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBVc2UgYGh0bXgnIHRhYmxlIGZvciBhZHZhbmNlCi0Jd2lkdGggb25seS4gIEJ1ZyBpbnRyb2R1Y2VkIDIwMTUtMDQtMTAuCi0KLTIwMTUtMDctMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUJldHRlciBzdXBwb3J0IG9mIHVzZXItc3VwcGxpZWQgQysrIG5hbWVzcGFjZXMuCi0KLQlTZWUKLQotCSAgaHR0cDovL2xpc3RzLm5vbmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTUtMDcvbXNnMDAwMDguaHRtbAotCi0JZm9yIGEgcmF0aW9uYWxlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnBpYy5oLCBzcmMvYmFzZS9iYXNlcGljLmgsIHNyYy9jZmYvY2ZmcGljLmgsCi0Jc3JjL3BzaGludGVyL3BzaHBpYy5oLCBzcmMvcHNuYW1lcy9wc3BpYy5oLCBzcmMvcmFzdGVyL3Jhc3RwaWMuaCwKLQlzcmMvc2ZudC9zZm50cGljLmgsIHNyYy9zbW9vdGgvZnRzcGljLmgsIHNyYy90cnVldHlwZS90dHBpYy5oCi0JKEZUX0JFR0lOX0hFQURFUiwgRlRfRU5EX0hFQURFUik6IE1vdmUgbWFjcm8gY2FsbHMgdG8gbm90IGVuY2xvc2UKLQloZWFkZXIgZmlsZXMgdGhhdCBjb250YWluIEZUX3tCRUdJTixFTkR9X0hFQURFUiBtYWNyb3MgYnkKLQl0aGVtc2VsdmVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggW0ZUX0RFQlVHX0FVVE9GSVRdOiBJbmNsdWRlCi0JRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSCBlYXJsaWVyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRwaWMuaDogSW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSC4KLQotMjAxNS0wNy0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIE1ha2UgYHR0X2ZhY2VfZ2V0X25hbWUnIG1lbWJlciBvZiB0aGUgU0ZOVCBpbnRlcmZhY2UuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIChUVF9HZXRfTmFtZV9GdW5jKTogTmV3Ci0JcHJvdG90eXBlLgotCShTRk5UX0ludGVyZmFjZSwgRlRfREVGSU5FX1NGTlRfSU5URVJGQUNFKTogTmV3IG1lbWJlciBgZ2V0X25hbWUnLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2ludGVyZmFjZSk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9zZm50L3Nmb2Jqcy5jICh0dF9mYWNlX2dldF9uYW1lKTogVGFnIGl0IHdpdGggYExPQ0FMX0RFRicuCi0JKiBzcmMvc2ZudC9zZm9ianMuaDogQWRkIHByb3RvdHlwZSBmb3IgaXQuCi0KLTIwMTUtMDYtMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBzb21lIGNsYW5nIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfRW1ib2xkZW5YWSksIHNyYy9jZmYvY2YyaW50cnAuYwotCShjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSwgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYwotCShsb2FkX3RydWV0eXBlX2dseXBoKSwgc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfaGFuZGxlX2RlbHRhcyksCi0Jc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JTlNUQ1RSTCk6IEZpeCBzaWduZWRuZXNzIGlzc3Vlcy4KLQotMjAxNS0wNi0yOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3RydWV0eXBlXSBTcGVlZCB1cCBieXRlY29kZSBpbnRlcnByZXRlci4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKE5vcm1hbGl6ZSk6IFVzZSBgRlRfVmVjdG9yX05vcm1MZW4nLgotCi0yMDE1LTA2LTI5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gU3BlZWQgdXAgZW1ib2xkZW5pbmcuCi0KLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9FbWJvbGRlblhZKTogVXNlCi0JYEZUX1ZlY3Rvcl9Ob3JtTGVuJy4KLQotMjAxNS0wNi0yOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEltcGxlbWVudCBmYXN0IHZlY3RvciBub3JtYWxpemF0aW9uLgotCi0JVGhlIGZ1bmN0aW9uIHVzZXMgTmV3dG9uJ3MgaXRlcmF0aW9ucyBpbnN0ZWFkIG9mIGRpdmlkaW5nIHZlY3RvcgotCWNvbXBvbmVudHMgYnkgaXRzIGxlbmd0aCwgd2hpY2ggbmVlZHMgYSBzcXVhcmUgcm9vdC4gVGhpcyBpcywKLQlsaXRlcmFsbHksIGEgYml0IGxlc3MgYWNjdXJhdGUgYnV0IGEgbG90IGZhc3Rlci4KLQotCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX1ZlY3Rvcl9Ob3JtTGVuKTogTmV3IGZ1bmN0aW9uLgotCi0yMDE1LTA2LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIENNYWtlTGlzdHMudHh0OiBBbHdheXMgY3JlYXRlIGBmdGNvbmZpZy5oJy4KLQotCUZvciBub24tVU5JWCBidWlsZHMsIHRoZSBmaWxlIHN0YXlzIHVubW9kaWZpZWQuICBIb3dldmVyLCBpdCdzCi0JYmV0dGVyIHRvIGhhdmUgdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlcyBhdCB0aGUgc2FtZSBwbGFjZQotCXJlZ2FyZGxlc3Mgb2YgdGhlIE9TLgotCi0yMDE1LTA2LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIENNYWtlTGlzdHMudHh0OiBJbXByb3ZlIE1TVkMgc3VwcG9ydCAoIzQzNzM3KS4KLQotMjAxNS0wNi0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NtYWtlXSBDaGVjayBmb3IgbGlicmFyaWVzIGFuZCBjcmVhdGUgYGZ0b3B0aW9uLmgnLgotCi0JKiBidWlsZHMvRmluZEhhcmZCdXp6LmNtYWtlOiBOZXcgZmlsZSwgdGFrZW4gZnJvbQotCi0JICBodHRwczovL3RyYWMud2Via2l0Lm9yZy9icm93c2VyL3RydW5rL1NvdXJjZS9jbWFrZS9GaW5kSGFyZkJ1enouY21ha2UKLQotCSogQ01ha2VMaXN0cy5UeHQ6IEFkZCBwYXRoIHRvIGxvY2FsIGNtYWtlIG1vZHVsZXMuCi0JRmluZCBkZXBlbmRlbmNpZXMgZm9yIHpsaWIsIGJ6aXAyLCBsaWJwbmcsIGFuZCBoYXJmYnV6ei4KLQlDcmVhdGUgYGZ0b3B0aW9uLmgnIGZpbGUuCi0JU2V0IHVwIGluY2x1ZGUgYW5kIGxpbmtlciBzdHVmZiBmb3IgbGlicmFyaWVzLgotCi0yMDE1LTA2LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIENNYWtlTGlzdHMudHh0OiBGaXggY3JlYXRpb24gb2YgYGZ0Y29uZmlnLmgnLgotCUNoZWNrIGZvciBVTklYIGhlYWRlciBmaWxlcyB1c2luZyBgY2hlY2tfaW5jbHVkZV9maWxlJy4KLQlTZXQgdXAgY29ycmVjdCBoZWFkZXIgaW5jbHVkZSBkaXJlY3Rvcmllcy4KLQotMjAxNS0wNi0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBDTWFrZUxpc3RzLnR4dDogRGlzYWxsb3cgaW4tc291cmNlIGJ1aWxkcy4KLQotMjAxNS0wNi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvdXRpbHMucHkgKGNoZWNrX291dHB1dCk6IEFkZCBtaXNzaW5nIGBcbicuCi0KLTIwMTUtMDYtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogQ01ha2VMaXN0cy50eHQ6IFNlbGVjdCBwbGF0Zm9ybS1kZXBlbmRlbnQgYGZ0ZGVidWcuYycuCi0KLTIwMTUtMDYtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogQ01ha2VMaXN0cy50eHQ6IFVzZSBjbWFrZSBmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgYGZ0Y29uZmlnLmgnLgotCUFkZGl0aW9uYWxseSwgZG8gdGhpcyBmb3IgVU5JWCBvbmx5LgotCi0yMDE1LTA2LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIENNYWtlTGlzdHMudHh0IChCQVNFX1NSQ1MpOiBVc2UgYGZ0YmFzZS5jJyBhbmQgYHBzbmFtZXMuYycuCi0KLTIwMTUtMDYtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFub3RoZXIgYWRqdXN0bWVudCB0byBoZWFkZXIgbG9jYXRpb25zLgotCi0JVGhpcyBjaGFuZ2UgaXMgYSByZXN1bHQgb2YgYSBkaXNjdXNzaW9uIHRocmVhZCBvbiBmcmVldHlwZS1kZXZlbAotCi0JICBodHRwOi8vbGlzdHMubm9uZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxNS0wNi9tc2cwMDA0MS5odG1sCi0KLQlSZS1pbnRyb2R1Y2UgdGhlIGBmcmVldHlwZTInIHN1YmRpcmVjdG9yeSBmb3IgYWxsIEZyZWVUeXBlIGhlYWRlcgotCWZpbGVzIGFmdGVyIGluc3RhbGxhdGlvbiwgYW5kIHJlbmFtZSB0aGUgYGZyZWV0eXBlMicgc3ViZGlyZWN0b3J5IGluCi0JdGhlIGdpdCByZXBvc2l0b3J5IHRvIGBmcmVldHlwZScuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUyOiBSZW5hbWVkIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlOiBUaGlzLgotCi0JKiBDTWFrZUxpc3RzLnR4dCAoUFVCTElDX0hFQURFUlMsIFBVQkxJQ19DT05GSUdfSEVBREVSUywKLQlQUklWQVRFX0hFQURFUlMpOiBVcGRhdGVkLgotCVVwZGF0ZSBjcmVhdGlvbiBvZiBgZnRjb25maWcuaCcuCi0JSW5zdGFsbCBnZW5lcmF0ZWQgYGZ0Y29uZmlnLmgnLgotCi0JKiBKYW1maWxlIChIRFJNQUNSTywgUmVmRG9jKSwgYXV0b2dlbi5zaDogVXBkYXRlZC4KLQotCSogYnVpbGRzL2FtaWdhL2luY2x1ZGUvY29uZmlnL2Z0Y29uZmlnLmgsIGJ1aWxkcy9mcmVldHlwZS5tawotCShQVUJMSUNfRElSKSwgYnVpbGRzL3N5bWJpYW4vYmxkLmluZiwgYnVpbGRzL3RvcGxldmVsLm1rICh3b3JrKSwKLQlidWlsZHMvdW5peC9mcmVldHlwZTIuaW46IFVwZGF0ZWQuCi0KLQkqIGJ1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbjogVXBkYXRlZC4KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IERvbid0IGNoZWNrIGZvciBgcm1kaXInLgotCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKERFTERJUik6IFVzZSBgcm0gLXJmJywgd2hpY2ggaXMgcG9ydGFibGUKLQlhY2NvcmRpbmcgdG8gdGhlIGF1dG9jb25mIGluZm8gbWFudWFsLgotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5tayAoaW5zdGFsbCwgdW5pbnN0YWxsLAotCWRpc3RjbGVhbl9wcm9qZWN0X3VuaXgpOiBVcGRhdGUgYW5kIHNpbXBsaWZ5LgotCi0JKiBidWlsZHMvd2luY2UvKiwgYnVpbGRzL3dpbmRvd3MvKjogVXBkYXRlZC4KLQotCSogZGV2ZWwvZnQyYnVpbGQuaCwgaW5jbHVkZS9mdDJidWlsZC5oOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlMi9jb25maWcvZnRoZWFkZXIuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlMi9pbnRlcm5hbC9mdHNlcnYuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlMi9pbnRlcm5hbC9pbnRlcm5hbC5oOiBVcGRhdGUgYWxsIGhlYWRlciBmaWxlCi0JbWFjcm9zLgotCi0JKiBzcmMvdG9vbHMvY2hrdHJjbXAucHkgKFRSQUNFX0RFRl9GSUxFUyk6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvKjogVXBkYXRlZC4KLQotMjAxNS0wNi0yNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX3BhcnNlX3N0YXJ0KTogRGlzYWxsb3cgMCBicHAuCi0KLTIwMTUtMDYtMjQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9zdGFydCk6IFNpbXBsaWZ5IGJwcCBwYXJzaW5nLgotCi0yMDE1LTA2LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlzL1RZUEVPRi9GVF9UWVBFT0YvICgjNDUzNzYpLgotCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiwgYnVpbGRzL3Ztcy9mdGNvbmZpZy5pbiwKLQlpbmNsdWRlL2ZyZWV0eXBlMi9jb25maWcvZnRjb25maWcuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlMi9pbnRlcm5hbC9mdG9ianMuaCwgc3JjL2F1dG9maXQvYWZ3YXJwLmg6IERvIGl0LgotCi0yMDE1LTA2LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0NTA5Ny4KLQotCVdlIG5vIGxvbmdlciBgcG9sbHV0ZScgdGhlIG5hbWVzcGFjZSBvZiBwb3NzaWJsZSBoZWFkZXIgZmlsZSBuYW1lczsKLQlpbnN0ZWFkIHdlIG1vdmUgYGZ0MmJ1aWxkLmgnIHVwIGJ5IG9uZSBsZXZlbCBzbyB0aGF0IGl0IGdldHMKLQlpbnN0YWxsZWQgaW4gdGhlIGRlZmF1bHQgaW5jbHVkZSBkaXJlY3RvcnkgKGUuZy4sCi0JL3Vzci9sb2NhbC9pbmNsdWRlKS4gIEFmdGVyIHRoaXMgY29tbWl0LCBvbmx5IGBmdDJidWlsZC5oJyBzdGF5cyBpbgotCXRoZSBjb21waWxlcidzIGluY2x1ZGUgcGF0aC4KLQotCU5vIHZpc2libGUgY2hhbmdlcyBmb3IgdGhlIHVzZXIgd2hvIGZvbGxvd3MgdGhlIHN0YW5kYXJkIEZyZWVUeXBlCi0JaGVhZGVyIGluY2x1c2lvbiBydWxlcy4KLQotCSogaW5jbHVkZS8qOiBNb3ZlIHRvIC4uLgotCSogaW5jbHVkZS9mcmVldHlwZTIvKjogVGhpcyBkaXJlY3RvcnksIGV4Y2VwdCBgZnQyYnVpbGQuaCcuCi0KLQkqIENNYWtlTGlzdHMudHh0IChQVUJMSUNfSEVBREVSUywgUFVCTElDX0NPTkZJR19IRUFERVJTLAotCVBSSVZBVEVfSEVBREVSUyksIEphbWZpbGUgKEhEUk1BQ1JPLCBSZWZEb2MpLCBhdXRvZ2VuLnNoOiBVcGRhdGVkLgotCi0JKiBidWlsZHMvYW1pZ2EvaW5jbHVkZS9jb25maWcvZnRjb25maWcuaCwgYnVpbGRzL2ZyZWV0eXBlLm1rCi0JKFBVQkxJQ19ESVIpLCBidWlsZHMvc3ltYmlhbi9ibGQuaW5mLCBidWlsZHMvdG9wbGV2ZWwubWsgKHdvcmspLAotCWJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwsIHVuaW5zdGFsbCksCi0JYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluOiBVcGRhdGVkLgotCi0JKiBidWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW46IFVwZGF0ZWQuCi0JRW1pdCAtSSBkaXJlY3Rvcnkgb25seSBpZiBpdCBpcyBub3QgYC91c3IvaW5jbHVkZScuCi0KLQkqIGJ1aWxkcy93aW5jZS8qLCBidWlsZHMvd2luZG93cy8qOiBVcGRhdGVkLgotCi0JKiBkZXZlbC9mdDJidWlsZC5oLCBpbmNsdWRlL2Z0MmJ1aWxkLmg6IFVwZGF0ZWQuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUyL2NvbmZpZy9mdGhlYWRlci5oLAotCWluY2x1ZGUvZnJlZXR5cGUyL2ludGVybmFsL2Z0c2Vydi5oLAotCWluY2x1ZGUvZnJlZXR5cGUyL2ludGVybmFsL2ludGVybmFsLmg6IFVwZGF0ZSBhbGwgaGVhZGVyIGZpbGUKLQltYWNyb3MuCi0KLQkqIHNyYy90b29scy9jaGt0cmNtcC5weSAoVFJBQ0VfREVGX0ZJTEVTKTogVXBkYXRlZC4KLQotMjAxNS0wNi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWFrZSBKYW0gc3VwcG9ydCB3b3JrIGFnYWluLgotCi0JVGhpcyBpcyBqdXN0IHZlcnkgYmFzaWMgc3R1ZmYgYW5kIGp1c3QgYSBsaXR0bGUgYml0IHRlc3RlZCBvbgotCUdOVS9MaW51eCBvbmx5LiAgSSB3b24ndCBkZWx2ZSBpbnRvIHRoaXMgc2luY2UgSSdtIG5vdCBhIEphbSB1c2VyLgotCi0JKiBKYW1maWxlOiBDYWxsIGBIRFJNQUNSTycgZm9yIGBmdHNlcnYuaCcgYWxzby4KLQkoREVGSU5FUyk6IFJlcGxhY2Ugd2l0aC4uLgotCShDQ0ZMQUdTKTogLi4uIHRoaXMuCi0KLQkqIHNyYy9KYW1maWxlOiBEb24ndCBjYWxsIGBIRFJNQUNSTycgZm9yIGBpbnRlcm5hbC5oJzsgdGhpcyBpcwotCWFscmVhZHkgaGFuZGxlZCBpbiB0aGUgdG9wLWxldmVsIEphbWZpbGUuCi0KLQkqIHNyYy9hdXRvZml0L0phbWZpbGUgKERFRklORVMpOiBSZXBsYWNlIHdpdGguLi4KLQkoQ0NGTEFHUyk6IC4uLiB0aGlzLgotCShfc291cmNlcyk6IEFkZCBtaXNzaW5nIGZpbGVzLgotCi0JKiBzcmMvY2FjaGUvSmFtZmlsZTogRG9uJ3QgY2FsbCBgSERSTUFDUk8nIGZvciBgZnRjYWNoZS5oJzsgaXQgbm8KLQlsb25nZXIgY29udGFpbnMgbWFjcm8gaGVhZGVyIGRlZmluaXRpb25zLgotCi0JKiBzcmMvYmFzZS9KYW1maWxlLCBzcmMvY2ZmL0phbWZpbGUsIHNyYy9zZm50L0phbWZpbGUsCi0Jc3JjL3RydWV0eXBlL0phbWZpbGUgKF9zb3VyY2VzKTogQWRkIG1pc3NpbmcgZmlsZXMuCi0KLTIwMTUtMDYtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBTYXZhbm5haCBidWcgIzQ1MzI2LgotCi0JKiBzcmMvc2ZudC9zZm50cGljLmggKFNGTlRfU0VSVklDRVNfR0VUKTogUmVtb3ZlIGR1cGxpY2F0ZQotCWRlZmluaXRpb25zLgotCi0yMDE1LTA2LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMi42IHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTYnLgotCi0JKiBkb2NzL1ZFUlNJT04uRExMOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgYnVtcCB2ZXJzaW9uIG51bWJlciB0bwotCTIuNi4KLQotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuNS41LzIuNi8sIHMvMjU1LzI2Ly4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9NSU5PUik6IFNldCB0byA2LgotCShGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAwLgotCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMTg6MDoxMi4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX01JTk9SKTogU2V0IHRvIDYuCi0JKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gMC4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYyBbIUZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1RdOiBBZGQKLQlkZWNsYXJhdGlvbnMgZm9yIGR1bXBpbmcgZnVuY3Rpb25zLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfTmV3X0NvbnRleHQpOiBQYWNpZnkgY29tcGlsZXIuCi0KLQkqIGJ1aWxkcy90b3BsZXZlbC5tazogVXNlIGBmcmVldHlwZS5taydzIGNvZGUgdG8gY29tcHV0ZSB0aGUgdmVyc2lvbgotCXN0cmluZy4KLQlEb24ndCBpbmNsdWRlIGEgemVybyBwYXRjaCBsZXZlbCBpbiB2ZXJzaW9uIHN0cmluZy4KLQkqIGJ1aWxkcy9mcmVldHlwZS5tazogUmVtb3ZlIGNvZGUgZm9yIGNvbXB1dGluZyB0aGUgdmVyc2lvbiBzdHJpbmcuCi0KLTIwMTUtMDYtMDYgIEFzaGlzaCBBemFkICA8YXNoaXNoLmF6YWRAc2Ftc3VuZy5jb20+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0NTI2MC4KLQotCSogc3JjL3Bmci9wZnJkcml2ci5jIChwZnJfZ2V0X2tlcm5pbmcpOiBGaXggdHlwby4KLQotMjAxNS0wNi0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggbWVtb3J5IGxlYWsuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEdyaXNzaW9tIDxjaGFvcy5wcm90b25AZ21haWwuY29tPjsgaW4KLQotCSAgaHR0cDovL2xpc3RzLm5vbmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLzIwMTUtMDUvbXNnMDAwMTMuaHRtbAotCi0JdGhlcmUgaXMgYW4gZXhhbXBsZSBjb2RlIHRvIHRyaWdnZXIgdGhlIGJ1Zy4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX2luaXRfYnl0ZWNvZGUpOiBGcmVlIG9sZCBgc2l6ZScKLQlkYXRhIGJlZm9yZSBhbGxvY2F0aW5nIGFnYWluLiAgQnVnIG1vc3QgcHJvYmFibHkgaW50cm9kdWNlZCBmb3VyCi0JeWVhcnMgYWdvIGluIHZlcnNpb24gMi40LjMuCi0KLTIwMTUtMDYtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtyYXN0ZXJdIEFkZCBtb3JlIHRyYWNpbmcuCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoRlRfVFJBQ0U3KSBbX1NUQU5EQUxPTkVfXTogRGVmaW5lLgotCShWZXJ0aWNhbF9Td2VlcF9TcGFuLCBWZXJ0aWNhbF9Td2VlcF9Ecm9wLCBIb3Jpem9udGFsX1N3ZWVwX1NwYW4sCi0JSG9yaXpvbnRhbF9Td2VlcF9Ecm9wLCBSZW5kZXJfR2x5cGgpOiBBZGQgdHJhY2luZyBjYWxscy4KLQotMjAxNS0wNi0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBXaGlsZSB0cmFjaW5nIG9wY29kZXMsIHNob3cgY29kZSBwb3NpdGlvbiBhbmQgc3RhY2suCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jOiBDaGFuZ2UgYWxsIGV4aXN0aW5nIFRSQUNFNyBjYWxscyB0bwotCVRSQUNFNi4KLQkob3Bjb2RlX25hbWUpOiBBZGQgc3RyaW5nIGxlbmd0aHMuCi0JKFRUX1J1bklucyk6IEltcGxlbWVudCBkaXNwbGF5IG9mIGNvZGUgcG9zaXRpb24gYW5kIHN0YWNrLgotCi0yMDE1LTA1LTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEluIEdYLCBtYWtlIHByaXZhdGUgcG9pbnQgbnVtYmVycyB3b3JrIGNvcnJlY3RseS4KLQotCVRoaXMgaXMgY29tcGxldGVseSBtaXNzaW5nIGluIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbjogSWYgYSBgZ3ZhcicKLQl0dXBsZSB1c2VzIHByaXZhdGUgcG9pbnQgbnVtYmVycyAodGhpcyBpcywgZGVsdGFzIGFyZSBzcGVjaWZpZWQgZm9yCi0Jc29tZSBwb2ludHMgb25seSksIHRoZSB1bmNvdmVyZWQgcG9pbnRzIG11c3QgYmUgaW50ZXJwb2xhdGVkIGZvcgotCXRoaXMgdHVwbGUgc2ltaWxhciB0byB0aGUgSVVQIGJ5dGVjb2RlIGluc3RydWN0aW9uLiAgRXhhbXBsZXMgdGhhdAotCW5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5IGFyZSBnbHlwaHMgYE9zbGFzaCcgYW5kIGBRJyBpbiBTa2lhLnR0Zi4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfZGVsdGFfc2hpZnQsIHR0X2RlbHRhX2ludGVycG9sYXRlLAotCXR0X2hhbmRsZV9kZWx0YXMpOiBOZXcgZnVuY3Rpb25zLgotCShUVF9WYXJ5X0dldF9HbHlwaF9EZWx0YXMpOiBSZW5hbWVkIHRvLi4uCi0JKFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKTogLi4uIHRoaXM7IGl0IGRpcmVjdGx5IHByb2Nlc3NlcyB0aGUKLQlwb2ludHMgYW5kIGRvZXMgbm8gbG9uZ2VyIHJldHVybiBhbiBhcnJheSBvZiBkZWx0YXMuCi0JQWRkIHRyYWNpbmcgaW5mb3JtYXRpb24uCi0JQ2FsbCBgdHRfaGFuZGxlX2RlbHRhcycgdG8gaW50ZXJwb2xhdGUgbWlzc2luZyBkZWx0YXMuCi0JQWxzbyBmaXggYSBtaW5vciBtZW1vcnkgbGVhayBpbiBjYXNlIG9mIGVycm9yLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwKLQlsb2FkX3RydWV0eXBlX2dseXBoKTogVXBkYXRlZC4KLQotMjAxNS0wNS0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJbiBHWCwgbWFrZSBpbnRlcm1lZGlhdGUgdHVwbGV0cyB3b3JrIGF0IGV4dHJlbWEuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9hcHBseV90dXBsZSk6IEZpeCByYW5nZSBjb25kaXRpb24uCi0KLTIwMTUtMDUtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gQWRkIHRyYWNpbmcgaW5mb3JtYXRpb24gdG8gR1ggY29kZS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX2xvYWRfYXZhciwgZnRfdmFyX2xvYWRfZ3ZhciwKLQlmdF92YXJfYXBwbHlfdHVwbGUsIFRUX0dldF9NTV9WYXIsIFRUX1NldF9NTV9CbGVuZCwKLQlUVF9TZXRfVmFyX0Rlc2lnbiwgdHRfZmFjZV92YXJ5X2N2dCk6IERvIGl0LgotCi0yMDE1LTA1LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90b29scy9hcGluYW1lcy5jIChuYW1lc19kdW1wKTogRml4IGludmFsaWQgcmVmZXJlbmNlLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBHdXptYW4gTW9zcXVlZGEsIEpvc2UgUgotCTxqb3NlLnIuZ3V6bWFuLm1vc3F1ZWRhQGludGVsLmNvbT4uCi0KLTIwMTUtMDUtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IGNvbW1pdCBmcm9tIDIwMTUtMDUtMjIuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMsIHNyYy90cnVldHlwZS90dGludGVycC5jOiBHdWFyZCBuZXcgY29kZQotCXdpdGggYFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORycuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IE5pa29sYXVzIFdheHdlaWxlciA8bWFkaWdlbnNAZ21haWwuY29tPi4KLQotMjAxNS0wNS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggcmV0dXJuIHZhbHVlcyBvZiBHRVRJTkZPIGJ5dGVjb2RlIGluc3RydWN0aW9uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCAoVFRfRXhlY0NvbnRleHRSZWMpOiBOZXcgZmllbGRzCi0JYHZlcnRpY2FsX2xjZCcgYW5kIGBncmF5X2NsZWFydHlwZScuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKHR0X2xvYWRlcl9pbml0KTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCUNoYW5nZSBgc3ltbWV0cmljYWwgc21vb3RoaW5nJyB0byBUUlVFLCBzaW5jZSBGcmVlVHlwZSBwcm9kdWNlcwotCWV4YWN0bHkgdGhpcy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19HRVRJTkZPKTogRml4IHNlbGVjdG9yL3JldHVybiBiaXQKLQl2YWx1ZXMgZm9yIHN5bW1ldHJpY2FsIHNtb290aGluZywgbmFtZWx5IDExLzE4LgotCUhhbmRsZSBiaXRzIGZvciB2ZXJ0aWNhbCBMQ0Qgc3VicGl4ZWxzICg4LzE1KSBhbmQgR3JheSBDbGVhclR5cGUKLQkoMTIvMTkpLgotCi0yMDE1LTA1LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1pbm9yLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCAoVFRfRXhlY0NvbnRleHQpOgotCSBzL3N1YnBpeGVsL3N1YnBpeGVsX2hpbnRpbmcuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMsIHNyYy90cnVldHlwZS90dGdsb2FkLmg6IFVwZGF0ZWQuCi0KLTIwMTUtMDUtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gU3VwcG9ydCBzZWxlY3RvciBpbmRleCAzIG9mIHRoZSBJTlNUQ1RSTCBpbnN0cnVjdGlvbi4KLQotCVRoaXMgZmxhZyBhY3RpdmF0ZXMgYG5hdGl2ZSBDbGVhclR5cGUgaGludGluZycsIGRpc2FibGluZyBiYWNrd2FyZAotCWNvbXBhdGliaWxpdHkgbW9kZSBhcyBkZXNjcmliZWQgaW4gR3JlZyBIaXRjaGNvY2tzIHdoaXRlcGFwZXIuICBJbgotCW90aGVyIHdvcmRzLCBpdCBlbmFibGVzIHVucmVzdHJpY3RlZCBmdW5jdGlvbmFsaXR5IG9mIGFsbCBUcnVlVHlwZQotCWluc3RydWN0aW9ucyBpbiBDbGVhclR5cGUuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKHR0X2dldF9tZXRyaWNzKTogQ2FsbCBgc3BoX3NldF90d2Vha3MnCi0JdW5jb25kaXRpb25hbGx5LgotCSh0dF9sb2FkZXJfaW5pdCk6IFVuc2V0IGBpZ25vcmVfeF9tb2RlJyBmbGFnIGlmIGJpdCAyIG9mCi0JYEdTLmluc3RydWN0X2NvbnRyb2wnIGlzIGFjdGl2ZS4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19JTlNUQ1RSTCk6IEhhbmRsZSBzZWxlY3RvciBpbmRleCAzLgotCShJbnNfR0VUSU5GTyk6IFVwZGF0ZWQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgaXQuCi0KLTIwMTUtMDUtMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gTWlub3IuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5oIChTZXRTdXBlclJvdW5kKTogRml4IHR5cGUgb2YgYEdyaWRQZXJpb2QnCi0JYXJndW1lbnQuCi0KLTIwMTUtMDUtMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRml4IGxvYWRpbmcgb2YgY29tcG9zaXRlIGdseXBocy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9Db21wb3NpdGVfR2x5cGgpOiBJZiB0aGUKLQlBUkdTX0FSRV9YWV9WQUxVRVMgZmxhZyBpcyBub3Qgc2V0LCBoYW5kbGUgYXJndW1lbnQgdmFsdWVzIGFzCi0JdW5zaWduZWQuICBJIHRydXN0IGB0dHgnICh3aGljaCBoYXMgZXhhY3RseSBzdWNoIGNvZGUpIHRoYXQgaXQgZG9lcwotCXRoZSByaWdodCB0aGluZyBoZXJlLi4uCi0KLQlUaGUgcmVhc29uIHRoYXQgbm9vbmUgaGFzIGV2ZXIgbm90aWNlZCB0aGlzIGJ1ZyBpcyBwcm9iYWJseSB0aGUgZmFjdAotCXRoYXQgcG9pbnQtYWxpZ25lZCBzdWJnbHlwaHMgYXJlIHJhcmUsIGFzIGFyZSBzdWJnbHlwaHMgd2l0aCBhCi0JbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgcmFuZ2UgWzEyODsyNTVdLCB3aGljaCBpcyBxdWl0ZSBsYXJnZSAob3IKLQlldmVuIGluIHRoZSByYW5nZSBbMzI3Njg7NjU1MzVdLCB3aGljaCBpcyBleHRyZW1lbHkgdW5saWtlbHkpLgotCi0yMDE1LTA1LTEyICBDaHJpcyBMaWRkZWxsICA8Y2hyaXMubGlkZGVsbEBhcnRpZmV4LmNvbT4KLQotCVtjZmZdIE1ha2UgdGhlIGAqY3VydmV0bycgb3BlcmF0b3JzIG1vcmUgdG9sZXJhbnQuCi0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IFRoZSBvcGNvZGVzCi0JYHZ2Y3VydmV0bycsIGBoaGN1cnZldG8nLCBgdmhjdXJ2ZXRvJywgYW5kIGBodmN1cnZldG8nIGFsbCBpdGVyYXRlLAotCXB1bGxpbmcgdmFsdWVzIG9mZiB0aGUgc3RhY2sgdW50aWwgdGhlIHN0YWNrIGlzIGV4aGF1c3RlZC4KLQlJbXBsaWNpdGx5IHRoZSBzdGFjayBtdXN0IGJlIGEgbXVsdGlwbGUgKG9yIGZvciBzdWJ0bHkgZGlmZmVyZW50Ci0JYmVoYXZpb3VyKSBhIG11bHRpcGxlIHBsdXMgYSBzcGVjaWZpYyBudW1iZXIgb2YgZXh0cmEgdmFsdWVzIGRlZXAuCi0JSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgZW5mb3JjZSBpdCAoYXMgdGhlIG9sZCBjb2RlIGRpZCkuCi0KLTIwMTUtMDUtMTIgIENocmlzIExpZGRlbGwgIDxjaHJpcy5saWRkZWxsQGFydGlmZXguY29tPgotCi0JW2NmZl0gZml4IGluY3JlbWVudGFsIGludGVyZmFjZSB3aXRoIG5ldyBjZmYgY29kZS4KLQotCSogc3JjL2NmZi9jZjJmdC5jIChjZjJfZ2V0U2VhY0NvbXBvbmVudCk6IFdoZW4gdXNpbmcgdGhlIGluY3JlbWVudGFsCi0JaW50ZXJmYWNlIHRvIHJldHJpZXZlIGdseXBoIGRhdGEgZm9yIGEgU0VBQywgaXQgYmUgbGVmdCB0byB0aGUKLQlpbmNyZW1lbnRhbCBpbnRlcmZhY2UgY2FsbGJhY2sgdG8gYXBwbHkgdGhlIGVuY29kaW5nIHRvIHJhdwotCWNoYXJhY3RlciBpbmRleCAoYXMgaXQgd2FzIGluIHRoZSBwcmV2aW91cyBjb2RlKS4KLQotMjAxNS0wNC0yOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2F1dG9maXRdIFNwZWVkIHVwIElVUC4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9pdXBfaW50ZXJwKTogU2VwYXJhdGUgdHJpdmlhbCBzbmFwcGluZyB0bwotCXRoZSBzYW1lIHBvc2l0aW9uIGZyb20gdHJ1ZSBpbnRlcnBvbGF0aW9uLCB1c2UgYHNjYWxlJyB0byByZWR1Y2UKLQlkaXZpc2lvbnMuCi0KLTIwMTUtMDQtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFVzZSBgbmFtZScgdGFibGUgZm9yIFBTIG5hbWUgaWYgd2UgaGF2ZSBhIFNGTlQtQ0ZGLgotCi0JVGhpcyBmb2xsb3dzIHRoZSBPcGVuVHlwZSAxLjcgc3BlY2lmaWNhdGlvbi4gIFNlZQotCi0JICBodHRwOi8vdHVnLm9yZy9waXBlcm1haWwvdGV4LWxpdmUvMjAxNS1BcHJpbC8wMzY2MzQuaHRtbAotCi0JZm9yIGEgZGlzY3Vzc2lvbi4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X3BzX25hbWUpOiBVc2UgdGhlIGBzZm50JyBzZXJ2aWNlIGlmIHdlCi0JaGF2ZSBhbiBTRk5ULgotCi0yMDE1LTA0LTI3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbdHJ1ZXR5cGVdIFNwZWVkIHVwIElVUC4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKF9pdXBfd29ya2VyX2ludGVycG9sYXRlKTogU2VwYXJhdGUgdHJpdmlhbAotCXNuYXBwaW5nIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGZyb20gdHJ1ZSBpbnRlcnBvbGF0aW9uLgotCi0yMDE1LTA0LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQnkgZGVmYXVsdCwgZW5hYmxlIHdhcnBpbmcgY29kZSBidXQgc3dpdGNoIG9mZiB3YXJwaW5nLgotCi0JU3VnZ2VzdGVkIGJ5IEJlaGRhZC4KLQotCSogaW5jbHVkZS9jb25maWcvZnRvcHRpb24uaDogRGVmaW5lIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUi4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYyAoYWZfYXV0b2ZpdHRlcl9pbml0KTogSW5pdGlhbGl6ZSBgd2FycGluZycKLQl3aXRoIGBmYWxzZScuCi0KLTIwMTUtMDQtMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDE1LTA0LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gSW50cm9kdWNlIGB3YXJwaW5nJyBwcm9wZXJ0eS4KLQotCVRoaXMgY29kZSByZXBsYWNlcyB0aGUgZGVidWdnaW5nIGhvb2sgZnJvbSB0aGUgcHJldmlvdXMgY29tbWl0IHdpdGgKLQlhIGJldHRlciwgbW9yZSBnZW5lcmljIHNvbHV0aW9uLgotCi0JKiBpbmNsdWRlL2Z0YXV0b2guaDogRG9jdW1lbnQgaXQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmggKEFGX01vZHVsZVJlYykKLQlbQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSXTogQWRkIGB3YXJwaW5nJyBmaWVsZC4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuYyAoX2FmX2RlYnVnX2Rpc2FibGVfd2FycGVyKTogUmVtb3ZlLgotCShhZl9wcm9wZXJ0eV9zZXQsIGFmX3Byb3BlcnR5X2dldCwgYWZfYXV0b2ZpdHRlcl9pbml0KQotCVtBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVJdOiBIYW5kbGUgYHdhcnBpbmcnIG9wdGlvbi4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9ISU5UU19ET19XQVJQKTogUmVtb3ZlIHVzZSBvZiB0aGUgbm8KLQlsb25nZXIgZXhpc3RpbmcgYF9hZl9kZWJ1Z19kaXNhYmxlX3dhcnBlcicuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19oaW50c19pbml0KSwgc3JjL2F1dG9maXQvYWZsYXRpbi5jCi0JKGFmX2xhdGluX2hpbnRzX2luaXQpLCBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jIChhZl9sYXRpbjJfaGludHNfaW5pdCkKLQlbQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSXTogQWRkIGBBRl9TQ0FMRVJfRkxBR19OT19XQVJQRVInIHRvIHRoZQotCXNjYWxlciBmbGFncyBpZiB3YXJwaW5nIGlzIG9mZi4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oOiBVcGRhdGVkLgotCi0yMDE1LTA0LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIGRlYnVnZ2luZyBob29rIHRvIGRpc2FibGUgd2FycGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIChfYWZfZGVidWdfZGlzYWJsZV93YXJwZXIpCi0JW0ZUX0RFQlVHX0FVVE9GSVRdOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmg6IFVwZGF0ZWQuCi0JKEFGX1NDQUxFUl9GTEFHX05PX1dBUlBFUik6IE5ldyBtYWNybyAobm90IGFjdGl2ZWx5IHVzZWQgeWV0KS4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9ISU5UU19ET19XQVJQKTogTmV3IG1hY3JvLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRzX2FwcGx5KQotCVtBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVJdOiBVc2UgYEFGX0hJTlRTX0RPX1dBUlAnIHRvIGNvbnRyb2wgdXNlCi0Jb2Ygd2FycGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfaGludHNfaW5pdCwgYWZfY2prX2hpbnRzX2FwcGx5KQotCVtBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVJdOiBTeW5jaHJvbml6ZSB3aXRoIGBhZmxhdGluLmMnLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jIChhZl9sYXRpbjJfaGludHNfYXBwbHkpCi0JW0FGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUl06IFN5bmNocm9uaXplIHdpdGggYGFmbGF0aW4uYycuCi0KLTIwMTUtMDQtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFVwZGF0ZSBhZHZhbmNlIHdpZHRoIGhhbmRsaW5nIHRvIE9wZW5UeXBlIDEuNy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgQmVoZGFkLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfYWR2YW5jZXMpOiBIYW5kbGUgU0ZOVCBjYXNlCi0Jc2VwYXJhdGVseS4KLQotCSogc3JjL2NmZi9jZmZnbG9hZC5jIChjZmZfc2xvdF9sb2FkKTogVXNlIGFkdmFuY2Ugd2lkdGggYW5kIHNpZGUKLQliZWFyaW5nIHZhbHVlcyBmcm9tIGBobXR4JyB0YWJsZSBpZiBwcmVzZW50LgotCi0yMDE1LTA0LTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogVXNlIGRvLXdoaWxlIGxvb3AuCi0KLTIwMTUtMDQtMDIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50X2VkZ2VzKTogUmVkdWNlIGxvZ2ljLgotCi0yMDE1LTA0LTAxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYXV0b2ZpdF0gRmluaXNoIHRoZSB0aG91Z2h0LgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2RpcmVjdGlvbl9jb21wdXRlKTogbWFrZSBzdXJlIHRoZSBsb25nIGFybQotCWlzIG5ldmVyIG5lZ2F0aXZlIHNvIHRoYXQgaXRzIGBGVF9BQlMnIGlzIG5vdCBuZWNlc3NhcnkuCi0KLTIwMTUtMDQtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBDYWxsIGR1bXBlciBmdW5jdGlvbnMgZm9yIHRyYWNpbmcuCi0KLQkqIHNyYy9hdXRvZml0L2FmY2prLmMgKGFmX2Nqa19oaW50c19hcHBseSk6IFJlbW92ZSBkZWFkIGNvZGUuCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzKTogTWlub3IKLQlpbXByb3ZlbWVudC4KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKGFmX2F1dG9maXR0ZXJfbG9hZF9nbHlwaCk6IEltcGxlbWVudCBpdC4KLQotMjAxNS0wNC0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIE1ha2UgZGVidWdnaW5nIHN0dWZmIHdvcmsgYWdhaW4uCi0KLQlUaGUgaW50ZXJmYWNlIHRvIGZ0Z3JpZCB3YXMgYnJva2VuIGluIHRoZSBzZXJpZXMgb2YgY29tbWl0cyBzdGFydGluZwotCXdpdGgKLQotCSAgW2F1dG9maXRdIEFsbG9jYXRlIEFGX0xvYWRlciBvbiB0aGUgc3RhY2sgaW5zdGVhZCBvZiBBRl9Nb2R1bGUuCi0KLQlmcm9tIDIwMTUtMDEtMTQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKF9hZl9kZWJ1Z19oaW50c19yZWMpIFtGVF9ERUJVR19BVVRPRklUXToKLQlVc2UgYSBnbG9iYWwgQUZfR2x5cGhIaW50c1JlYyBvYmplY3QgZm9yIGRlYnVnZ2luZy4KLQkoYWZfYXV0b2ZpdHRlcl9kb25lLCBhZl9hdXRvZml0dGVyX2xvYWRfZ2x5cGgpOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfaW5pdCwgYWZfbG9hZGVyX2RvbmUpOiBVcGRhdGVkLgotCi0yMDE1LTA0LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfZG9uZSk6IEZpeCBtaW5vciB0aGlua28uCi0KLTIwMTUtMDMtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEZpeCBTYXZhbm5haCBidWcgIzQ0NjI5LgotCi0JKiBzcmMvY2ZmL2NmMmZvbnQuaCAoQ0YyX01BWF9TVUJSKSwgc3JjL2NmZi9jZmZnbG9hZC5oCi0JKENGRl9NQVhfU1VCUlNfQ0FMTFMpOiBTZXQgdG8gMTYuCi0KLTIwMTUtMDMtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMSwgdHJ1ZXR5cGVdIE1ha2UgdGhlIE1NIEFQSSBtb3JlIGZsZXhpYmxlIHcuci50LiBgbnVtX2Nvb3JkcycuCi0KLQlUaGlzIGNvbW1pdCBhbGxvd3MgYG51bV9jb29yZHMnIHRvIGJlIGxhcmdlciBvciBzbWFsbGVyIHRoYW4gdGhlCi0JbnVtYmVyIG9mIGF2YWlsYWJsZSBheGVzIHdoaWxlIHNlbGVjdGluZyBhIGRlc2lnbiBpbnN0YW5jZSwgZWl0aGVyCi0JaWdub3JpbmcgZXhjZXNzIGRhdGEgb3IgdXNpbmcgZGVmYXVsdHMgaWYgZGF0YSBpcyBtaXNzaW5nLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9TZXRfTU1fQmxlbmQsIFRUX1NldF9WYXJfRGVzaWduKToKLQlJbXBsZW1lbnQgaXQuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfU2V0X01NX0JsZW5kLCBUMV9TZXRfTU1fRGVzaWduLAotCVQxX1NldF9WYXJfRGVzaWduKTogRGl0dG8uCi0KLTIwMTUtMDMtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gTWlub3IuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfU2V0X01NX0JsZW5kLCBUMV9TZXRfTU1fRGVzaWduKTogVXNlCi0JRlRfVEhST1cuCi0JKFQxX1NldF9WYXJfRGVzaWduKTogVXNlIFQxX01BWF9NTV9BWElTIGFuZCBGVF9USFJPVy4KLQotMjAxNS0wMy0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gVHJhY2UgY2hhcnN0cmluZyBuZXN0aW5nIGxldmVscy4KLQotCSogc3JjL2NmZi9jZjJpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8Y2YyX2NtZENBTExHU1VCUiwKLQljZjJfY21kQ0FMTFNVQlIsIGNmMl9jbWRSRVRVUk4+OiBJbXBsZW1lbnQgaXQuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpCi0JPGNmZl9vcF9jYWxsc3ViciwgY2ZmX29wX2NhbGxnc3ViciwgY2ZmX29wX3JldHVybj46IERpdHRvLgotCi0yMDE1LTAzLTIxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbYmFzZV0gT3B0aW1pemUgYEZUX0FuZ2xlX0RpZmYnLgotCi0JVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgd2UgYXJlIHVzdWFsbHkgY2xvc2UgdG8gdGhlIGRlc2lyZWQgcmFuZ2UKLQlvZiBhbmdsZSB2YWx1ZXMsIHNvIHRoYXQgdGhlIHJlbWFpbmRlciBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeS4KLQotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoRlRfQW5nbGVfRGlmZik6IFVzZSBsb29wcyBpbnN0ZWFkIG9mIHJlbWFpbmRlci4KLQotCSogc3JjL2F1dG9maXQvYWZ0eXBlcy5oIChBRl9BTkdMRV9ESUZGKTogRGl0dG8gaW4gdGhlIHVudXNlZCBtYWNyby4KLQotMjAxNS0wMy0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJbXByb3ZlIGBndmFyJyBoYW5kbGluZy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMpOiBDb3JyZWN0bHkgaGFuZGxlCi0Jc2luZ2xlLWVsZW1lbnQgcnVucy4gIENmLiBnbHlwaCBgUScgaW4gU2tpYS50dGYgd2l0aCB3ZWlnaHRzIGxhcmdlcgotCXRoYW4gdGhlIGRlZmF1bHQuCi0KLTIwMTUtMDMtMjAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoRlRfVmVjdG9yX1JvdGF0ZSk6IE1pbm9yIHJlZmFjdG9yaW5nLgotCi0yMDE1LTAzLTE3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0NDQxMiAocGFydCAyKS4KLQotCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoRlRfU2luLCBGVF9Db3MsIEZUX1Rhbik6IENhbGwgYEZUX1ZlY3Rvcl9Vbml0Jy4KLQotMjAxNS0wMy0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBBcmFiaWMgc2NyaXB0LgotCi0JVGhhbmtzIHRvIFRpdHVzIE5lbWV0aCA8dG5AdG50eXBvZ3JhcGh5LmV1PiBmb3IgZ3VpZGFuY2UhCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgQXJhYmljLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgQXJhYmljIHN0YW5kYXJkIGNoYXJhY3RlcnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmM6IEFkZCBBcmFiaWMgZGF0YS4KLQotCSogc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIEFyYWJpYyBkYXRhLgotCi0JKiBkb2NzL0NIQU5HRVM6IERvY3VtZW50IGl0LgotCi0yMDE1LTAzLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlSZW5hbWUgYHN2eGY4Nm5tLmgnIHRvIGBzdmZudGZtdC5oJzsgdXBkYXRlIHJlbGF0ZWQgc3ltYm9scy4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9mdHNlcnYuaCAoRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSCk6IFJlbmFtZWQKLQl0by4uLgotCShGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gpOiBUaGlzLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2Zm50Zm10LmggKEZUX1hGODZfRk9STUFUXyopOiBSZW5hbWVkCi0JdG8gLi4uCi0JKEZUX0ZPTlRfRk9STUFUXyopOiBUaGlzLgotCi0Jc3JjL2Jhc2UvZnRmbnRmbXQuYywgc3JjL2JkZi9iZGZkcml2ci5jLCBzcmMvY2ZmL2NmZmRyaXZyLmMsCi0Jc3JjL2NpZC9jaWRyaXZlci5jLCBzcmMvcGNmL3BjZmRyaXZyLmMsIHNyYy9wZnIvcGZyZHJpdnIuYywKLQlzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYywgc3JjL3R5cGUxL3QxZHJpdmVyLmMsCi0Jc3JjL3R5cGU0Mi90NDJkcml2ci5jLCBzcmMvd2luZm9udHMvd2luZm50LmM6IFVwZGF0ZWQuCi0KLTIwMTUtMDMtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBSZW5hbWUgYEZUX1hGUkVFODZfSCcgdG8gYEZUX0ZPTlRfRk9STUFUU19IJy4KLQotCSogaW5jbHVkZS9jb25maWcvZnRoZWFkZXIuaDogSW1wbGVtZW50IGl0LgotCSogc3JjL2Jhc2UvZnRmbnRmbXQuYywgZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgotCi0yMDE1LTAzLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gUmVuYW1lIGBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0JyB0byBgRlRfR2V0X0ZvbnRfRm9ybWF0Jy4KLQotCSogaW5jbHVkZS9mdGZudGZtdC5oLCBzcmMvYmFzZS9mdGZudGZtdC5jOiBJbXBsZW1lbnQgaXQuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNS0wMy0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGF1dG9tYXRpYyBjb3B5cmlnaHQgdXBkYXRpbmcuCi0KLQkqIHNyYy90b29scy91cGRhdGUtY29weXJpZ2h0OiBNYWtlIHNjYW5uaW5nIG9mIGBuby1jb3B5cmlnaHQnCi0JYWN0dWFsbHkgd29yay4KLQotCSogc3JjL3Rvb2xzL25vLWNvcHlyaWdodDogRG9uJ3QgaW5jbHVkZSBSRUFETUUgaW4gZ2VuZXJhbC4KLQotMjAxNS0wMy0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUmVuYW1lIGBmdHhmODYuW2NoXScgdG8gYGZ0Zm50Zm10LltjaF0nLgotCi0JQ01ha2VMaXN0cy50eHQsIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZSwgYnVpbGRzL2FtaWdhL21ha2VmaWxlLm9zNCwKLQlidWlsZHMvYW1pZ2Evc21ha2VmaWxlLCBidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfY2ZtLm1ha2UudHh0LAotCWJ1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19mYXIubWFrZS50eHQsCi0JYnVpbGRzL21hYy9GcmVlVHlwZS5wcGNfY2FyYm9uLm1ha2UudHh0LAotCWJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NsYXNzaWMubWFrZS50eHQsIGJ1aWxkcy9zeW1iaWFuL2JsZC5pbmYsCi0JYnVpbGRzL3N5bWJpYW4vZnJlZXR5cGUubW1wLCBidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2ouZmlsdGVycywKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLCBkb2NzL0lOU1RBTEwuQU5ZLAotCWluY2x1ZGUvY29uZmlnL2Z0aGVhZGVyLmgsIGluY2x1ZGUvZnRmbnRmbXQuaCwgbW9kdWxlcy5jZmcsCi0Jc3JjL2Jhc2UvZnRmbnRmbXQuYywgdm1zX21ha2UuY29tOiBVcGRhdGVkLgotCi0yMDE1LTAzLTEwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlGaXggU2F2YW5uYWggYnVnICM0NDQxMiAocGFydCAxKS4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoZnRfc3Ryb2tlcl9pbnNpZGUpOiBIYW5kbGUgbmVhciBVLXR1cm5zLgotCi0yMDE1LTAzLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gUmVuYW1lIGBGVF9CaXRtYXBfTmV3JyB0byBgRlRfQml0bWFwX0luaXQnLgotCi0JKiBpbmNsdWRlL2Z0Yml0bWFwLmgsIHNyYy9iYXNlL2Z0Yml0bWFwLmM6IEltcGxlbWVudCBpdC4KLQlVcGRhdGUgYWxsIGNhbGxlcnMuCi0KLQkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KLQotMjAxNS0wMy0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX2ZvbnRfZGlyKTogRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0KLQlGb3VuZCBieSBBbGV4ZWkuCi0KLTIwMTUtMDMtMDUgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogc3JjL2Jhc2UvZnRzdHJva2UuYzogU2ltcGxpZnkuCi0KLTIwMTUtMDMtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gU29tZSBmaXhlcyBhbmQgY29kZSByZWZhY3RvcmluZyBpbiBgdHRneHZhci5jJy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMpOiBGaXggcmV0dXJuIHZhbHVlCi0Jb2YgYHBvaW50X2NudCcgaWYgdHdvIGJ5dGVzIGFyZSByZWFkLgotCVVzZSBhIG1vcmUgdmVydGljYWwgY29kaW5nIHN0eWxlLgotCShmdF92YXJfcmVhZHBhY2tlZGRlbHRhcyk6IFVzZSBGVF9VSW50IGZvciBgZGVsdGFfY250JyBwYXJhbWV0ZXIuCi0JVXNlIGEgbW9yZSB2ZXJ0aWNhbCBjb2Rpbmcgc3R5bGUuCi0KLTIwMTUtMDMtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVthdXRvZml0XSBGaXggU2F2YW5uYWggYnVnICM0NDI0MS4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBSZWplY3QgZ2x5cGhzCi0Jd2l0aCBsZXNzIHRoYW4gMyBwb2ludHMuCi0KLTIwMTUtMDMtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVNpbXBsaWZ5IGBUWVBFT0YnIG1hY3JvLgotCi0JTm8gbmVlZCBmb3IgdHdvIGFyZ3VtZW50cy4KLQotCSogaW5jbHVkZS9jb25maWcvZnRjb25maWcuaCwgYnVpbGRzL3VuaXgvZnRjb25maWcuaW4sCi0JYnVpbGRzL3Ztcy9mdGNvbmZpZy5oIChUWVBFT0YpOiBVcGRhdGVkLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9QQURfRkxPT1IsIEZUX1BJWF9GTE9PUiksCi0Jc3JjL2F1dG9maXQvYWZ3YXJwLmggKEFGX1dBUlBFUl9GTE9PUik6IFVwZGF0ZWQuCi0KLTIwMTUtMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVZhcmlvdXMgY29tcGlsZXIgd2FybmluZyBmaXhlcyBmb3IgYG1ha2UgbXVsdGknLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfaGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKSwKLQlzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX2hpbnRfY29tcHV0ZV9ibHVlX2VkZ2VzLAotCWFmX2xhdGluX2hpbnRfZWRnZXMpLCBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jCi0JKGFmX2xhdGluMl9oaW50c19jb21wdXRlX2JsdWVfZWRnZXMsIGFmX2xhdGluMl9oaW50X2VkZ2VzKTogRGVjbGFyZQotCWFzIGBzdGF0aWMnLgotCi0JKiBzcmMvY2FjaGUvZnRjY21hcC5jIChGVENfQ01BUF9RVUVSWV9IQVNILCBGVENfQ01BUF9OT0RFX0hBU0gpOgotCVJlbW92ZWQuICBVbnVzZWQuCi0JKiBzcmMvY2FjaGUvZnRjaW1hZ2UuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0guCi0JKiBzcmMvY2FjaGUvZnRjbWFuYWcuYyAoRlRDX0xSVV9HRVRfTUFOQUdFUik6IFJlbW92ZWQuICBVbnVzZWQuCi0KLQkqIHNyYy9jZmYvY2YyaW50cnAuYzogSW5jbHVkZSBgY2YyaW50cnAuaCcuCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKFBBSVJfVEFHKTogUmVtb3ZlZC4gIFVudXNlZC4KLQotCSogc3JjL2d6aXAvZnRnemlwLmMgKE5PX0RVTU1ZX0RFQ0wpOiBSZW1vdmVkLiAgVW51c2VkLgotCi0JKiBzcmMvcHNhdXgvYWZtcGFyc2UuYyAoYWZtX3BhcnNlcl9yZWFkX2ludCk6IERlY2xhcmUgYXMgYHN0YXRpYycuCi0KLQkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmMgKFNUUk9OR0VSLCBQU0hfWk9ORV9NSU4sIFBTSF9aT05FX01BWCk6Ci0JUmVtb3ZlZC4gIFVudXNlZC4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChSZW5kZXJfR2x5cGgpOiBEZWNsYXJlIGFzIGBzdGF0aWMnLgotCi0JKiBzcmMvc2ZudC90dHBvc3QuYyAobG9hZF9mb3JtYXRfMjApOiBGaXggc2lnbmVkbmVzcyB3YXJuaW5nLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAoUEFJUl9UQUcpOiBSZW1vdmVkLiAgVW51c2VkLgotCSogc3JjL3RydWV0eXBlL3R0c3VicGl4LmMgKGlzX21lbWJlcl9vZl9mYW1pbHlfY2xhc3MsCi0JaXNfbWVtYmVyX29mX3N0eWxlX2NsYXNzKTogRGVjbGFyZSBhcyBgc3RhdGljJy4KLQotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZyk6IERlY2xhcmUKLQlhcyBgc3RhdGljJy4KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAobW1fYXhpc191bm1hcCwgbW1fd2VpZ2h0c191bm1hcCk6IERlY2xhcmUgYXMKLQlgc3RhdGljJy4KLQkoVDFfRklFTERfQ09VTlQpOiBSZW1vdmVkLiAgVW51c2VkLgotCSogc3JjL3R5cGUxL3QxcGFyc2UuaCAoVDFfRG9uZV9UYWJsZSk6IFJlbW92ZWQuICBVbnVzZWQuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAoVDFfRG9uZV9UYWJsZSk6IFJlbW92ZWQuICBVbnVzZWQuCi0KLTIwMTUtMDItMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eF0gU2lnbmVkbmVzcyBmaXhlcy4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9wc2F1eC5oLCBzcmMvcHNhdXgvYWZtcGFyc2UuYywKLQlzcmMvcHNhdXgvYWZtcGFyc2UuaCwgc3JjL3BzYXV4L3BzY29udi5jLCBzcmMvcHNhdXgvcHNvYmpzLmMsCi0Jc3JjL3BzYXV4L3QxY21hcC5jLCBzcmMvcHNhdXgvdDFkZWNvZGUuYzogQXBwbHkuCi0KLTIwMTUtMDItMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtvdHZhbGlkXSBTaWduZWRuZXNzIGZpeGVzLgotCi0JKiBzcmMvb3R2YWxpZC9vdHZjb21tbi5jLCBzcmMvb3R2YWxpZC9vdHZnZGVmLmMsCi0Jc3JjL290dmFsaWQvb3R2Z3Bvcy5jLCBzcmMvb3R2YWxpZC9vdHZnc3ViLmMsIHNyYy9vdHZhbGlkL290dm1hdGguYzoKLQlBcHBseS4KLQotMjAxNS0wMi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvYnppcDIvZnRiemlwMi5jIChmdF9iemlwMl9hbGxvYyk6IFNpZ25lZG5lc3MgZml4LgotCi0yMDE1LTAyLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbbHp3XSBTaWduZWRuZXNzIGZpeGVzLgotCi0JKiBzcmMvbHp3L2Z0em9wZW4uYywgc3JjL2x6dy9mdHpvcGVuLmg6IEFwcGx5LgotCi0yMDE1LTAyLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZ3h2YWxpZF0gU2lnbmVkbmVzcyBmaXhlcy4KLQotCSogc3JjL2d4dmFsaWQvZ3h2YnNsbi5jLCBzcmMvZ3h2YWxpZC9neHZjb21tbi5jLAotCXNyYy9neHZhbGlkL2d4dmNvbW1uLmgsIHNyYy9neHZhbGlkL2d4dmp1c3QuYywKLQlzcmMvZ3h2YWxpZC9neHZrZXJuLmMsIHNyYy9neHZhbGlkL2d4dmxjYXIuYywgc3JjL2d4dmFsaWQvZ3h2bW9ydC5jLAotCXNyYy9neHZhbGlkL2d4dm1vcnQxLmMsIHNyYy9neHZhbGlkL2d4dm1vcnQyLmMsCi0Jc3JjL2d4dmFsaWQvZ3h2bW9yeC5jLCBzcmMvZ3h2YWxpZC9neHZtb3J4MS5jLAotCXNyYy9neHZhbGlkL2d4dm1vcngyLmMsIHNyYy9neHZhbGlkL2d4dm9wYmQuYywKLQlzcmMvZ3h2YWxpZC9neHZwcm9wLmMsIHNyYy9neHZhbGlkL2d4dnRyYWsuYzogQXBwbHkuCi0KLTIwMTUtMDItMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjYWNoZV0gU2lnbmVkbmVzcyBmaXhlcy4KLQotCSogc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMsIHNyYy9jYWNoZS9mdGNjbWFwLmMsIHNyYy9jYWNoZS9mdGNpbWFnZS5jLAotCXNyYy9jYWNoZS9mdGNtYW5hZy5jLCBzcmMvY2FjaGUvZnRjc2JpdHMuYzogQXBwbHkuCi0KLTIwMTUtMDItMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUNoYW5nZSBkaW1lbnNpb24gZmllbGRzIGluIGBGVENfSW1hZ2VUeXBlUmVjJyB0byB1bnNpZ25lZCB0eXBlLgotCi0JVGhpcyBkb2Vzbid0IGJyZWFrIEFCSS4KLQotCSogaW5jbHVkZS9mdGNhY2hlLmggKEZUQ19JbWFnZVR5cGVSZWMpOiBVc2UgdW5zaWduZWQgdHlwZXMgZm9yCi0JYHdpZHRoJyBhbmQgYGhlaWdodCcuCi0KLQkqIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgaXQuCi0KLTIwMTUtMDItMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjYWNoZV0gRG9uJ3QgdXNlIGBsYWJzJy4KLQotCVRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgaW4gRnJlZVR5cGUgd2hlcmUgdGhpcyBmdW5jdGlvbiB3YXMgdXNlZC4KLQotCSogaW5jbHVkZS9jb25maWcvZnRzdGRsaWIuaCAoZnRfbGFicyk6IFJlbW92ZS4KLQotCSogc3JjL2NhY2hlL2Z0Y2ltYWdlLmMgKGZ0Y19pbm9kZV93ZWlnaHQpOiBSZXBsYWNlIGBmdF9sYWJzJyB3aXRoCi0JYEZUX0FCUycuCi0KLTIwMTUtMDItMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjYWNoZV0gUmVwbGFjZSBgRlRfUHRyRGlzdCcgd2l0aCBgRlRfT2Zmc2V0Jy4KLQotCSogc3JjL2NhY2hlL2Z0Y2NhY2hlLmggKEZUQ19Ob2RlUmVjKTogYEZUX09mZnNldCcgKGEuay5hLiBgc2l6ZV90JykKLQlpcyBhIGJldHRlciBjaG9pY2UgZm9yIGBoYXNoJyB0byBob2xkIGEgcG9pbnRlciB0aGFuIGBGVF9QdHJEaXN0JwotCShhLmsuYS4gYHB0cmRpZmZfdCcpLCBlc3BlY2lhbGx5IHNpbmNlIHRoZSBsYXR0ZXIgaXMgc2lnbmVkLAotCWNhdXNpbmcgemlsbGlvbnMgb2Ygc2lnbmVkbmVzcyB3YXJuaW5ncy4gIFtOb3RlIHRoYXQgYGhhc2gnIHdhcyBvZgotCXR5cGUgYEZUX1VJbnQzMicgYmVmb3JlIHRoZSBjaGFuZ2UgdG8gYEZUX1B0ckRpc3QnLl0KLQlVcGRhdGUgYWxsIHVzZXJzLgotCi0JKiBzcmMvY2FjaGUvZnRjYmFzaWMuYywgc3JjL2NhY2hlL2Z0Y2NhY2hlLmMsIHNyYy9jYWNoZS9mdGNjbWFwLmMsCi0Jc3JjL2NhY2hlL2Z0Y2dseXBoLmMsIHNyYy9jYWNoZS9mdGNnbHlwaC5oOiBVcGRhdGVkLgotCi0yMDE1LTAyLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc21vb3RoLCByYXN0ZXJdIFJlLWVuYWJsZSBzdGFuZGFsb25lIGNvbXBpbGF0aW9uLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKEZUX1JFTkRFUl9QT09MX1NJWkUsIEZUX01BWCkKLQlbX1NUQU5EQUxPTkVfXTogRGVmaW5lIG1hY3Jvcy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKEZUX1JFTkRFUl9QT09MX1NJWkUsIEZUX01BWCwgRlRfQUJTLAotCUZUX0hZUE9UKSBbX1NUQU5EQUxPTkVfXTogRGVmaW5lIG1hY3Jvcy4KLQotMjAxNS0wMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3Ntb290aF0gU2lnbmVkbmVzcyBmaXhlcy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMsIHNyYy9zbW9vdGgvZnRzbW9vdGguYzogQXBwbHkuCi0KLTIwMTUtMDItMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jOiBVc2UgdGhlIGZpbGUncyB0eXBlZGVmcyBldmVyeXdoZXJlLgotCi0yMDE1LTAyLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9zZm50L3R0cG9zdC5jIChsb2FkX2Zvcm1hdF8yMCk6IEZpeCBlcnJvciB0cmFjaW5nIG1lc3NhZ2UuCi0KLQlCdWcgaW50cm9kdWNlZCA2IGNvbW1pdHMgZWFybGllci4KLQotMjAxNS0wMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BzaGludGVyXSBGaXggdGhpbmtvLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jIChwc2hfZ2x5cGhfZmluZF9zdHJvbmdfcG9pbnRzKTogQ29ycmVjdGx5Ci0JY2hlY2sgYGNvdW50Jy4KLQlCdWcgaW50cm9kdWNlZCB0d28gY29tbWl0cyBlYXJsaWVyLgotCi0yMDE1LTAyLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbcmFzdGVyXSBTaWduZWRuZXNzIGZpeGVzLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMsIHNyYy9yYXN0ZXIvZnRyZW5kMS5jOiBBcHBseS4KLQotMjAxNS0wMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3BzaGludGVyXSBTaWduZWRuZXNzIGZpeGVzLgotCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jLCBzcmMvcHNoaW50ZXIvcHNoZ2xvYi5jLAotCXNyYy9wc2hpbnRlci9wc2hyZWMuYzogQXBwbHkuCi0KLTIwMTUtMDItMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2hpbnRlcl0gVXNlIG1hY3JvcyBmb3IgKHVuc2lnbmVkKSBmbGFncywgbm90IGVudW1lcmF0aW9ucy4KLQotCSogc3JjL3BzaGludGVyL3BzaGFsZ28uaCAoUFNIX0hpbnRfRmxhZ3MpOiBSZXBsYWNlIHdpdGggbWFjcm9zLgotCVVwZGF0ZWQuCi0JKiBzcmMvcHNoaW50ZXIvcHNocmVjLmggKFBTX0hpbnRfRmxhZ3MpOiBSZXBsYWNlIHdpdGggbWFjcm9zLgotCi0yMDE1LTAyLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2hpbnRlci9wc2hyZWMuYzogU2ltcGxpZnkuCi0JKHBzX2hpbnRzX29wZW4sIHBzX2hpbnRzX3N0ZW0pOiBSZW1vdmUgc3dpdGNoIHN0YXRlbWVudC4KLQotMjAxNS0wMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3NmbnRdIFNpZ25lZG5lc3MgZml4ZXMuCi0KLQkqIHNyYy9zZm50L3BuZ3NoaW0uYywgc3JjL3NmbnQvc2ZvYmpzLmMsIHNyYy9zZm50L3R0Y21hcC5jLAotCXNyYy9zZm50L3R0a2Vybi5jLCBzcmMvc2ZudC90dGxvYWQuYywgc3JjL3NmbnQvdHRwb3N0LmMsCi0Jc3JjL3NmbnQvdHRzYml0LmM6IEFwcGx5LgotCSogc3JjL3NmbnQvc2Zkcml2ZXIuYzogQXBwbHkuCi0JKHNmbnRfZ2V0X3BzX25hbWUpOiBTaW1wbGlmeS4KLQotMjAxNS0wMi0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2JkZl0gU2lnbmVkbmVzcyBmaXhlcy4KLQotCSogc3JjL2JkZi9iZGYuaCwgc3JjL2JkZi9iZGZkcml2ci5jLCBzcmMvYmRmL2JkZmRyaXZyLmgsCi0Jc3JjL2JkZi9iZGZsaWIuYzogQXBwbHkuCi0KLTIwMTUtMDItMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9hdG91cyk6IE5ldyBmdW5jdGlvbi4KLQkoX2JkZl9wYXJzZV9nbHlwaHMsIF9iZGZfcGFyc2Vfc3RhcnQpOiBVc2UgaXQuCi0KLTIwMTUtMDItMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwY2ZdIFNpZ25lZG5lc3MgZml4ZXMuCi0KLQkqIHNyYy9wY2YvcGNmLmgsIHNyYy9wY2YvcGNmZHJpdnIuYzogQXBwbHkuCi0JKiBzcmMvcGNmL3BjZnJlYWQuYzogQXBwbHkuCi0JKHBjZl9nZXRfZW5jb2RpbmdzKTogSWdub3JlIGludmFsaWQgbmVnYXRpdmUgZW5jb2Rpbmcgb2Zmc2V0cy4KLQotMjAxNS0wMi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvd2luZm9udHMvd2luZm50LmM6IFNpZ25lZG5lc3MgZml4ZXMuCi0KLTIwMTUtMDItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlNDJdIFNpZ25lZG5lc3MgZml4ZXMuCi0KLQkqIHNyYy90eXBlNDIvdDQycGFyc2UuYywgc3JjL3R5cGU0Mi90NDJwYXJzZS5oLAotCXNyYy90eXBlNDIvdDQydHlwZXMuaDogQXBwbHkuCi0KLTIwMTUtMDItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwZnJdIFNpZ25lZG5lc3MgZml4ZXMuCi0KLQkqIHNyYy9wZnIvcGZyZHJpdnIuYywgc3JjL3Bmci9wZnJnbG9hZC5jLCBzcmMvcGZyL3BmcmxvYWQuYywKLQlzcmMvcGZyL3BmcmxvYWQuaCwgc3JjL3Bmci9wZnJvYmpzLmMsIHNyYy9wZnIvcGZyc2JpdC5jLAotCXNyYy9wZnIvcGZydHlwZXMuaDogQXBwbHkuCi0KLTIwMTUtMDItMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIE1pbm9yIHNpZ25lZG5lc3MgZml4ZXMgcmVsYXRlZCB0byBsYXN0IGNvbW1pdC4KLQotCSogc3JjL2NmZi9jZjJmdC5jLCBzcmMvY2ZmL2NmMmludHJwLmMsIHNyYy9jZmYvY2ZmZ2xvYWQuYzogQXBwbHkuCi0KLTIwMTUtMDItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIFRoaW5rb3MgaW4gYmlhcyBoYW5kbGluZy4KLQotCU9ubHkgdGhlIGZpbmFsIHJlc3VsdCBpcyBhbHdheXMgcG9zaXRpdmUuCi0KLQlCdWcgaW50cm9kdWNlZCB0aHJlZSBjb21taXRzIGVhcmxpZXIuCi0KLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYywgc3JjL2NmZi9jZmZnbG9hZC5oOiBBcHBseS4KLQotMjAxNS0wMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NpZF0gRml4IHNpZ25lZG5lc3MgaXNzdWVzIGFuZCBlbWl0IHNvbWUgYmV0dGVyIGVycm9yIGNvZGVzLgotCi0JKiBzcmMvY2lkL2NpZGdsb2FkLmMsIHNyYy9jaWQvY2lkbG9hZC5oLCBzcmMvY2lkL2NpZG9ianMuYywKLQlzcmMvY2lkL2NpZHBhcnNlLmg6IEFwcGx5LgotCSogc3JjL2NpZC9jaWRsb2FkLmM6IEFwcGx5LgotCShwYXJzZV9mZF9hcnJheSk6IFJlamVjdCBuZWdhdGl2ZSB2YWx1ZXMgZm9yIG51bWJlciBvZiBkaWN0aW9uYXJpZXMuCi0JKiBzcmMvY2lkL2NpZHBhcnNlLmM6IEFwcGx5LgotCShjaWRfcGFyc2VyX25ldyk6IFJlamVjdCBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGhleCBkYXRhIGxlbmd0aC4KLQotMjAxNS0wMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gU2lnbmVkbmVzcyBmaXhlcyBmb3IgbmV3IGVuZ2luZS4KLQotCSogc3JjL2NmZi9jZjJhcnJzdC5jLCBzcmMvY2ZmL2NmMmZpeGVkLmgsIHNyYy9jZmYvY2YyZnQuYywKLQlzcmMvY2ZmL2NmMmZ0LmgsIHNyYy9jZmYvY2YyaGludHMuYywgc3JjL2NmZi9jZjJpbnRycC5jOiBBcHBseS4KLQotMjAxNS0wMi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZl0gU2lnbmVkbmVzcyBmaXhlcyBmb3IgYmFzaWMgaW5mcmFzdHJ1Y3R1cmUgYW5kIG9sZCBlbmdpbmUuCi0KLQkqIGluY2x1ZGUvaW50ZXJuYWwvcHNoaW50cy5oLCBzcmMvY2ZmL2NmZmRyaXZyLmMsCi0Jc3JjL2NmZi9jZmZnbG9hZC5jLCBzcmMvY2ZmL2NmZmdsb2FkLmgsIHNyYy9jZmYvY2ZmbG9hZC5jLAotCXNyYy9jZmYvY2Zmb2Jqcy5jLCBzcmMvY2ZmL2NmZnBhcnNlLmMsIHNyYy9wc2hpbnRlci9wc2hyZWMuYzogQXBwbHkuCi0KLTIwMTUtMDItMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X01NX1Zhcik6IElnbm9yZSBgY291bnRTaXplUGFpcnMnLgotCi0JVGhpcyBpcyBoYXJkLWNvZGVkIHRvIHZhbHVlIDIgaW4gYGZ2YXInIHZlcnNpb24gMS4wIChhbmQgbm8gbmV3ZXIKLQl2ZXJzaW9uIGV4aXN0cyksIGJ1dCBzb21lIGZvbnRzIHNldCBpdCBpbmNvcnJlY3RseS4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgQWRhbSBUd2FyZG9jaCA8YWRhbUBmb250bGFiLmNvbT4uCi0KLTIwMTUtMDItMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtjZmZdIEVtaXQgYmV0dGVyIGVycm9yIGNvZGUgZm9yIGludmFsaWQgcHJpdmF0ZSBkaWN0IHNpemUuCi0KLQkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX3ByaXZhdGVfZGljdCk6IFJlamVjdCBuZWdhdGl2ZQotCXZhbHVlcyBmb3Igc2l6ZSBhbmQgb2Zmc2V0LgotCi0yMDE1LTAyLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gRml4IHNpZ25lZG5lc3MgaXNzdWVzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmFuZ2xlcy5jLCBzcmMvYXV0b2ZpdC9hZmNqay5jLAotCXNyYy9hdXRvZml0L2FmZ2xvYmFsLmMsIHNyYy9hdXRvZml0L2FmaGludHMuYywKLQlzcmMvYXV0b2ZpdC9hZmxhdGluLmMsIHNyYy9hdXRvZml0L2FmbGF0aW4yLmMsIHNyYy9hdXRvZml0L2Fmd2FycC5jLAotCXNyYy9hdXRvZml0L2hic2hpbS5jOiBBcHBseS4KLQotMjAxNS0wMi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIFVzZSBtYWNyb3MgZm9yICh1bnNpZ25lZCkgZmxhZ3MsIG5vdCBlbnVtZXJhdGlvbnMuCi0KLQlUaGlzIGhhcm1vbml6ZXMgd2l0aCBvdGhlciBjb2RlIGluIEZyZWVUeXBlIChhbmQgcmVkdWNlcyB0aGUgbnVtYmVyCi0Jb2YgbmVjZXNzYXJ5IGNhc3RzIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzKS4KLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmhpbjogTWFrZSBmbGFnIG1hY3JvcyB1bnNpZ25lZC4KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZjamsuaDogUmVwbGFjZSBmbGFnIGVudW1lcmF0aW9uIHdpdGggbWFjcm9zLgotCSogc3JjL2F1dG9maXQvYWZjamsuYzogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9GbGFncywgQUZfRWRnZV9GbGFncyk6IFJlcGxhY2Ugd2l0aAotCW1hY3Jvcy4KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYzogVXBkYXRlZC4KLQotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5oOiBSZXBsYWNlIGZsYWcgZW51bWVyYXRpb25zIHdpdGggbWFjcm9zLgotCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jLCBzcmMvYXV0b2ZpdC9hZmxhdGluMi5jOiBVcGRhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnR5cGVzLmggKEFGX1NjYWxlckZsYWdzKTogUmVwbGFjZSB3aXRoIG1hY3Jvcy4KLQotMjAxNS0wMi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3R5cGUxXSBGaXggc2lnbmVkbmVzcyBpc3N1ZXMuCi0KLQkqIGluY2x1ZGUvaW50ZXJuYWwvcHNhdXguaCwgaW5jbHVkZS9pbnRlcm5hbC90MXR5cGVzLmgsCi0Jc3JjL3BzYXV4L3Bzb2Jqcy5jLCBzcmMvcHNhdXgvcHNvYmpzLmgsIHNyYy9wc2F1eC90MWRlY29kZS5jLAotCXNyYy90eXBlMS90MWdsb2FkLmMsIHNyYy90eXBlMS90MWxvYWQuYywgc3JjL3R5cGUxL3QxcGFyc2UuYzogQXBwbHkuCi0KLTIwMTUtMDItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtwc2F1eCwgdHlwZTFdIEZpeCBtaW5vciBBRk0gaXNzdWVzLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL3QxdHlwZXMuaCAoQUZNX0tlcm5QYWlyUmVjKTogTWFrZSBpbmRpY2VzCi0JdW5zaWduZWQuCi0JVXBkYXRlIHVzZXJzLgotCShBRk1fRm9udEluZm9SZWMpOiBNYWtlIGVsZW1lbnQgY291bnRlcnMgdW5zaWduZWQuCi0JVXBkYXRlIHVzZXJzLgotCSogc3JjL3BzYXV4L2FmbXBhcnNlLmggKEFGTV9WYWx1ZVJlYyk6IEFkZCB1bmlvbiBtZW1iZXIgZm9yIHVuc2lnbmVkCi0JaW50LgotCi0JKiBzcmMvcHNhdXgvYWZtcGFyc2UuYyAoYWZtX3BhcnNlX3RyYWNrX2tlcm4sIGFmbV9wYXJzZV9rZXJuX3BhaXJzKToKLQlSZWplY3QgbmVnYXRpdmUgdmFsdWVzIGZvciBudW1iZXIgb2Yga2VybmluZyBlbGVtZW50cy4KLQotCSogc3JjL3R5cGUxL3QxYWZtLmMsIHNyYy90b29scy90ZXN0X2FmbS5jOiBVcGRhdGVkLgotCi0yMDE1LTAyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlEb24ndCB1c2UgYEZUX1B0ckRpc3QnIGZvciBsZW5ndGhzLgotCi0JVXNlIEZUX1VJbnQgaW5zdGVhZC4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9wc2F1eC5oIChQU19UYWJsZV9GdW5jc1JlYywgUFNfVGFibGVSZWMsCi0JVDFfRGVjb2RlclJlYyk6IERvIGl0LgotCi0JKiBpbmNsdWRlL2ludGVybmFsL3QxdHlwZXMuaCAoVDFfRm9udFJlYyk6IERpdHRvLgotCi0JKiBzcmMvY2lkL2NpZGxvYWQuYyAoY2lkX3BhcnNlX2RpY3QpOiBVcGRhdGVkLgotCSogc3JjL3Bmci9wZnJsb2FkLmMgKHBmcl9leHRyYV9pdGVtX2xvYWRfZm9udF9pZCk6IERpdHRvLgotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc190YWJsZV9hZGQpLCBzcmMvcHNhdXgvcHNvYmpzLmg6IERpdHRvLgotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChwYXJzZV9ibGVuZF9heGlzX3R5cGVzLCBwYXJzZV9lbmNvZGluZywKLQlwYXJzZV9jaGFyc3RyaW5ncywgcGFyc2VfZGljdCk6IERpdHRvLgotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VfZW5jb2RpbmcsIHQ0Ml9wYXJzZV9jaGFyc3RyaW5ncywKLQl0NDJfcGFyc2VfZGljdCk6IERpdHRvLgotCi0yMDE1LTAyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9wc19nZXRfZm9udF92YWx1ZSk6IENsZWFuIHVwLgotCVRoaXMgaGFuZGxlcyBuZWdhdGl2ZSB2YWx1ZXMgYmV0dGVyLCBhdm9pZGluZyBtYW55IGNhc3RzLgotCi0yMDE1LTAyLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYmFzZV0gRml4IFNhdmFubmFoIGJ1ZyAjNDQyODQuCi0KLQkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NdWxGaXgpOiBUeXBvcy4KLQotMjAxNS0wMi0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaW5pc2ggY29tcGlsZXIgd2FybmluZyBmaXhlcyBmb3Igc2lnbmVkbmVzcyBpc3N1ZXMuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMsIHNyYy90cnVldHlwZS90dHN1YnBpeC5jLAotCXNyYy90cnVldHlwZS90dHN1YnBpeC5oOiBBcHBseS4KLQotMjAxNS0wMi0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYzogQWRkaW5nIG1pc3NpbmcgYHN0YXRpYycga2V5d29yZHMuCi0KLTIwMTUtMDItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gTW9yZSBzaWduZWRuZXNzIGZpeGVzLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL3R0dHlwZXMuaCwgc3JjL3RydWV0eXBlL3R0aW50ZXJwLmgsCi0Jc3JjL3RydWV0eXBlL3R0b2Jqcy5oLCBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYywKLQlzcmMvdHJ1ZXR5cGUvdHRvYmpzLmM6IEFwcGx5LgotCi0yMDE1LTAyLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFZhcmlvdXMgc2lnbmVkbmVzcyBmaXhlcy4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9mdGdsb2Fkci5oLCBzcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jOiBBcHBseS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYzogQXBwbHkuCi0JKFRUX0dldF9WTWV0cmljcyk6IFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIGFzY2VuZGVycyBhbmQgZGVzY2VuZGVycwotCXdoaWxlIGNvbnN0cnVjdGluZyBhZHZhbmNlIGhlaWdodC4KLQotMjAxNS0wMi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2VdIEZpbmlzaCBjb21waWxlciB3YXJuaW5nIGZpeGVzIGZvciBzaWduZWRuZXNzIGlzc3Vlcy4KLQotCSogc3JjL2Jhc2UvZnRnbHlwaC5jLCBzcmMvYmFzZS9mdGxjZGZpbC5jLCBzcmMvYmFzZS9mdHN0cm9rZS5jOgotCUFwcGx5LgotCi0yMDE1LTAyLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGluY2x1ZGUvdHR0YWJsZXMuaCAoVFRfT1MyKTogYGZzVHlwZScgbXVzdCBiZSBGVF9VU2hvcnQuCi0KLTIwMTUtMDItMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1vcmUgbWlub3Igc2lnbmVkbmVzcyB3YXJuaW5nIGZpeGVzLgotCi0JKiBzcmMvYmFzZS9mdGJib3guYywgc3JjL2Jhc2UvZnRiaXRtYXAuYywgc3JjL2Jhc2UvZnR0cmlnb24uYywKLQlzcmMvYmFzZS9mdHV0aWwuYzogQXBwbHkuCi0KLTIwMTUtMDItMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU5leHQgcm91bmQgb2YgbWlub3IgY29tcGlsZXIgd2FybmluZyBmaXhlcy4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9mdHJmb3JrLmggKEZUX1JGb3JrX1JlZik6IENoYW5nZSBgb2Zmc2V0JyBtZW1iZXIKLQl0eXBlIHRvIGBGVF9Mb25nJy4KLQkoQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9CRUdJTik6IEFkZCBgc3RhdGljJyBrZXl3b3JkLgotCi0JKiBpbmNsdWRlL2ludGVybmFsL2Z0c3RyZWFtLmggKEZUX1N0cmVhbV9Qb3MpOiBSZXR1cm4gYEZUX1VMb25nJy4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jLCBzcmMvYmFzZS9mdHJmb3JrLmMsIHNyYy9iYXNlL2Z0c3RyZWFtLmM6Ci0JU2lnbmVkbmVzcyBmaXhlcy4KLQotMjAxNS0wMi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JVmFyaW91cyBtaW5vciBzaWduZWRuZXNzIGZpeGVzLgotCi0JKiBpbmNsdWRlL2Z0YWR2YW5jLmgsIGluY2x1ZGUvaW50ZXJuYWwvZnRvYmpzLmgsCi0Jc3JjL2Jhc2UvZnRnbG9hZHIuYywgc3JjL2Jhc2UvZnRvYmpzLmM6IEFwcGx5LgotCi0yMDE1LTAyLTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlOZXcgYFRZUEVPRicgbWFjcm8uCi0KLQlUaGlzIGhlbHBzIHN1cHByZXNzIHNpZ25lZG5lc3Mgd2FybmluZ3MsIGF2b2lkaW5nIGlzc3VlcyB3aXRoCi0JaW1wbGljaXQgY29udmVyc2lvbiBjaGFuZ2VzLgotCi0JKiBpbmNsdWRlL2NvbmZpZy9mdGNvbmZpZy5oLCBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiwKLQlidWlsZHMvdm1zL2Z0Y29uZmlnLmggKFRZUEVPRik6IERlZmluZS4KLQotCSogaW5jbHVkZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfUEFEX0ZMT09SLCBGVF9QSVhfRkxPT1IpLAotCXNyYy9hdXRvZml0L2Fmd2FycC5oIChBRl9XQVJQRVJfRkxPT1IpOiBVc2UgaXQuCi0KLTIwMTUtMDItMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRzeXN0ZW0uYzogVXNlIGNhc3RzIGluIHN0YW5kYXJkIEMgZnVuY3Rpb24gd3JhcHBlcnMuCi0JKGZ0X2FsbG9jLCBmdF9yZWFsbG9jLCBmdF9hbnNpX3N0cmVhbV9pbywgRlRfU3RyZWFtX09wZW4pOiBEbyBpdC4KLQotMjAxNS0wMi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDQyNjEuCi0KLQkqIGJ1aWxkcy91bml4L2RldGVjdC5tayAoc2V0dXApIFt1bml4XTogU2V0IGBDT05GSUdfU0hFTEwnIGluIHRoZQotCWVudmlyb25tZW50IGFsc28gd2hpbGUgY2FsbGluZyB0aGUgY29uZmlndXJlIHNjcmlwdC4KLQotMjAxNS0wMi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ludGVybmFsL2Z0bWVtb3J5Lmg6IEFkZCBzb21lIGBGVF9PZmZzZXQnIGNhc3RzLgotCShGVF9NRU1fU0VULCBGVF9NRU1fQ09QWSwgRlRfTUVNX01PVkUsIEZUX0FSUkFZX1pFUk8sIEZUX0FSUkFZX0NPUFksCi0JRlRfTUVNX01PVkUpOiBEbyBpdC4KLQotMjAxNS0wMi0xNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2Jhc2VdIENsZWFuIHVwIHNpZ25lZG5lc3MgaXNzdWVzIGluIGBmdGRiZ21lbS5jJy4KLQotCUFsc28gZml4IG90aGVyIG1pbm9yIGlzc3Vlcy4KLQotCSogc3JjL2Jhc2UvZnRkYmdtZW0uYyAoRlRfTWVtVGFibGVSZWMpOiBSZXBsYWNlIGFsbCBGVF9VTG9uZyB0eXBlcwotCXdpdGggRlRfTG9uZyBmb3IgY29uc2lzdGVuY3kuCi0JKGZ0X21lbV9wcmltZXMpOiBDaGFuZ2UgdHlwZSB0byBgRlRfSW50Jy4KLQkoZnRfbWVtX2Nsb3Nlc3RfcHJpbWUsIGZ0X21lbV90YWJsZV9zZXQpOiBVcGRhdGVkLgotCi0JKGZ0X21lbV9kZWJ1Z19wYW5pYywgZnRfbWVtX2RlYnVnX2FsbG9jLCBmdF9tZW1fZGVidWdfZnJlZSwKLQlmdF9tZW1fZGVidWdfcmVhbGxvYyk6IFVzZSBgc3RhdGljJyBrZXl3b3JkIGFuZCBmaXggc2lnbmVkbmVzcwotCXdhcm5pbmdzIHdoZXJlIG5lY2Vzc2FyeS4KLQotCShmdF9tZW1fdGFibGVfcmVzaXplLCBmdF9tZW1fdGFibGVfbmV3LCBmdF9tZW1fdGFibGVfZGVzdHJveSwKLQlmdF9tZW1fdGFibGVfZ2V0X25vZGVwLCBmdF9tZW1fZGVidWdfaW5pdCwgRlRfRHVtcE1lbW9yeSk6IEZpeCB0eXBlcwotCWFuZCBhZGQgb3IgcmVtb3ZlIGNhc3RzIHRvIGF2b2lkIHNpZ25lZG5lc3Mgd2FybmluZ3MuCi0KLTIwMTUtMDItMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtiYXNlXSBDbGVhbiB1cCBzaWduZWRuZXNzIGluIGFyaXRobWV0aWMgZnVuY3Rpb25zLgotCi0JVGhpcyBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlIGFuZCByZWR1Y2VzIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBzcmMvYmFzZS9mdGNhbGMuYyAoRlRfTXVsRGl2LCBGVF9NdWxEaXZfTm9fUm91bmQsIEZUX011bEZpeCwKLQlGVF9EaXZGaXgpOiBDb252ZXJ0IGlucHV0IHBhcmFtZXRlcnMgdG8gdW5zaWduZWQsIGRvIHRoZQotCWNvbXB1dGF0aW9uLCB0aGVuIGNvbnZlcnQgdGhlIHJlc3VsdCBiYWNrIHRvIHNpZ25lZC4KLQkoZnRfY29ybmVyX29yaWVudGF0aW9uKTogRml4IGNhc3RzLgotCi0yMDE1LTAyLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IFNhdmFubmFoIGJ1ZyAjNDQxODQuCi0KLQkqIHNyYy9zZm50L3R0bG9hZC5jIChjaGVja190YWJsZV9kaXIsIHR0X2ZhY2VfbG9hZF9mb250X2Rpcik6IE5vCi0JbG9uZ2VyIHJlamVjdCBgaHRteCcgYW5kIGB2bXR4JyB0YWJsZXMgd2l0aCBpbnZhbGlkIGxlbmd0aCBidXQKLQlzYW5pdGl6ZSB0aGVtLgotCi0yMDE1LTAyLTA2ICBKb24gQW5kZXJzb24gIDxqb25Ad2Vic3VwZXJnb28uY29tPgotCi0JW3RydWV0eXBlXSBGaXggcmVncmVzc2lvbiBpbiB0aGUgaW5jcmVtZW50YWwgZ2x5cGggbG9hZGVyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogRm9yIGluY3JlbWVudGFsCi0JZm9udHMsIHRoZSBnbHlwaCBpbmRleCBtYXkgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgZ2x5cGhzCi0JaW5kaWNhdGVkLCBzbyBndWFyZCB0aGUgY2hlY2sgd2l0aCBhIHByZXByb2Nlc3NvciBjb25kaXRpb25hbC4KLQotMjAxNS0wMi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2F1dG9maXRdIEZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCi0KLQlXaGlsZSB0aGlzIGRvZXNuJ3Qgc2hvdyB1cCB3aXRoIEZyZWVUeXBlLCBleGFjdGx5IHRoZSBzYW1lIGNvZGUKLQlsZWFrcyB3aXRoIHR0ZmF1dG9oaW50J3MgbW9kaWZpZWQgYXV0by1oaW50ZXIgY29kZSAod2hpY2ggZ2V0cyB1c2VkCi0JaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5KS4KLQotCUl0IGNlcnRhaW5seSBkb2Vzbid0IGhhcm0gc2luY2UgaXQgaXMgc2ltaWxhciB0byBhbHJlYWR5IGV4aXN0aW5nCi0JY2hlY2tzIGluIHRoZSBjb2RlIGZvciBlbWJlZGRlZCBhcnJheXMuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogU2V0IGBtYXhfY29udG91cnMnCi0JYW5kIGBtYXhfcG9pbnRzJyBmb3IgYWxsIGNhc2VzLgotCi0yMDE1LTAxLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIFRoYWkgc2NyaXB0LgotCi0JVGhhbmtzIHRvIEJlbiBNaXRjaGVsbCA8YmVuQHJvc2V0dGF0eXBlLmNvbT4gZm9yIGd1aWRhbmNlIHdpdGggYmx1ZQotCXpvbmUgY2hhcmFjdGVycyEKLQotCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBUaGFpLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNjcmlwdC5oOiBBZGQgVGhhaSBzdGFuZGFyZCBjaGFyYWN0ZXJzLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jOiBBZGQgVGhhaSBkYXRhLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgVGhhaSBkYXRhLgotCi0yMDE1LTAxLTIzICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVtyYXN0ZXJdIEhhbmRsZSBgRlRfUkFTVEVSX0ZMQUdfQUEnIGNvcnJlY3RseS4KLQotCVRoaXMgZml4ZXMgYSBicmVha2FnZSBjYXVzZWQgYnkgdGhlIGNvbW1pdCBgW3Jhc3Rlcl0gUmVtb3ZlCi0JNS1sZXZlbCBncmF5IEFBIG1vZGUgZnJvbSBtb25vY2hyb21lIHJhc3Rlcml6ZXIuJy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgTWFya3VzIFRyaXBwZWxzZG9yZiA8bWFya3VzQHRyaXBwZWxzZG9yZi5kZT4uCi0KLQkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoZnRfYmxhY2tfcmVuZGVyKTogSGFuZGxlCi0JYEZUX1JBU1RFUl9GTEFHX0FBJy4KLQotCSogc3JjL3Jhc3Rlci9mdHJlbmQxLmMgKGZ0X3Jhc3RlcjFfcmVuZGVyKTogUmVtb3ZlIGdyYXkgQUEgbW9kZQotCXJlbW5hbnRzLgotCi0yMDE1LTAxLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9OZXdfTGlicmFyeSk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCi0yMDE1LTAxLTE4ICBDaHJpcyBMaWRkZWxsICA8Y2hyaXMubGlkZGVsbEBhcnRpZmV4LmNvbT4KLQotCVtyYXN0ZXJdIEZpeCBTYXZhbm5haCBidWcgIzQ0MDIyLgotCi0JQWRkIGZhbGxiYWNrIGZvciBnbHlwaHMgd2l0aCBkZWdlbmVyYXRlIGJvdW5kaW5nIGJveGVzLgotCi0JSWYgYSBnbHlwaCBoYXMgb25seSBvbmUgdmVyeSBuYXJyb3cgZmVhdHVyZSwgdGhlIGJib3ggY2FuIGVuZCB1cAotCXdpdGggZWl0aGVyIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJib3ggYmVpbmcgMCwgaW4gd2hpY2ggY2FzZQotCW5vIHJhc3RlciBtZW1vcnkgaXMgYWxsb2NhdGVkIGFuZCBubyBhdHRlbXB0IGlzIG1hZGUgdG8gcmVuZGVyIHRoZQotCWdseXBoLiAgVGhpcyBpcyBsZXNzIHRoYW4gaWRlYWwgd2hlbiB0aGUgZHJvcC1vdXQgY29tcGVuc2F0aW9uIGluCi0JdGhlIHJlbmRlcmluZyBjb2RlIHdvdWxkIGFjdHVhbGx5IHJlc3VsdCBpbiB0aGUgZ2x5cGggYmVpbmcKLQlyZW5kZXJlZC4KLQotCVRoaXMgcHJvYmxlbSBjYW4gYmUgb2JzZXJ2ZWQgd2l0aCB0aGUgYEknIGdseXBoIChnaWQgNDcpIGluIHRoZQotCUF1dG9kZXNrIFJvbWFuUyBUcnVlVHlwZSBmb250LgotCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBBZGQgYSBmYWxsYmFjayBpZiBlaXRoZXIKLQlkaW1lbnNpb24gaXMgemVybyB0byBleHBsaWNpdGx5IHJvdW5kIHVwL2Rvd24gKGluc3RlYWQgb2Ygc2ltcGx5Ci0Jcm91bmQpLgotCi0yMDE1LTAxLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlBZGQgc29tZSB0b29scyB0byBoYW5kbGUgeWVhcmx5IGNvcHlyaWdodCBub3RpY2UgdXBkYXRlcy4KLQotCVdlIGFyZSBub3cgZm9sbG93aW5nIHRoZSBHTlUgZ3VpZGVsaW5lczogQSBuZXcgcmVsZWFzZSBhdXRvbWF0aWNhbGx5Ci0JbWVhbnMgdGhhdCB0aGUgY29weXJpZ2h0IHllYXIgb2YgYWxsIGFmZmVjdGVkIGZpbGVzIGdldHMgdXBkYXRlZDsgaXQKLQlpcyBubyBsb25nZXIgdXNlZCB0byB0cmFjayB5ZWFycyBvZiBtb2RpZmljYXRpb24gY2hhbmdlcy4KLQotCSogc3JjL3Rvb2xzL3VwZGF0ZS1jb3B5cmlnaHQteWVhcjogTmV3IFBlcmwgc2NyaXB0LgotCSogc3JjL3Rvb2xzL3VwZGF0ZS1jb3B5cmlnaHQ6IE5ldyBzaGVsbCBzY3JpcHQgdGhhdCBjYWxscwotCWB1cGRhdGUtY29weXJpZ2h0LXllYXInIG9uIGFsbCBmaWxlcy4KLQkqIHNyYy90b29scy9uby1jb3B5cmlnaHQ6IEV4Y2VwdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGhhbmRsZWQgYnkKLQlgdXBkYXRlLWNvcHlyaWdodCcKLQotMjAxNS0wMS0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQsIHVzaW5nIGEgZGVzY3JpcHRpb24gZnJvbSBCZWhkYWQuCi0KLTIwMTUtMDEtMTQgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIChhZl9hdXRvZml0dGVyX2RvbmUpOiBGaXggY29tcGlsZXIgd2FybmluZy4KLQotMjAxNS0wMS0xNCAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlbYXV0b2ZpdF0gQWRkIGVtYmVkZGVkIGFycmF5IG9mIHNlZ21lbnRzIGFuZCBlZGdlcy4KLQotCUF2b2lkcyBtdWx0aXBsZSBtYWxsb2NzIHBlciB0eXBpY2FsIGdseXBocy4KLQotCVdpdGggdGhpcyBhbmQgcmVjZW50IGNoYW5nZXMgdG8gYXZvaWQgbWFsbG9jcywgdGhlIHRocmVhZC1zYWZlCi0Jc3RhY2stYmFzZWQgbG9hZGVyIGlzIG5vdyBhcyBmYXN0IGFzIHRoZSBwcmV2aW91cyBtb2RlbCB0aGF0IGhhZCBvbmUKLQljYWNoZWQgc2luZ2xldG9uLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmggKEFGX1NFR01FTlRTX0VNQkVEREVELCBBRl9FREdFU19FTUJFRERFRCk6Ci0JTmV3IG1hY3Jvcy4KLQkoQUZfQXhpc0hpbnRzUmVjKTogQWRkIHR3byBhcnJheXMgZm9yIHNlZ21lbnRzIGFuZCBlZGdlcy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5jIChhZl9heGlzX2hpbnRzX25ld19zZWdtZW50KTogT25seSBhbGxvY2F0ZQotCWRhdGEgaWYgbnVtYmVyIG9mIHNlZ21lbnRzIGV4Y2VlZHMgZ2l2ZW4gdGhyZXNob2xkIHZhbHVlLgotCShhZl9heGlzX2hpbnRzX25ld19lZGdlKTogIE9ubHkgYWxsb2NhdGUgZGF0YSBpZiBudW1iZXIgb2YgZWRnZXMKLQlleGNlZWRzIGdpdmVuIHRocmVzaG9sZCB2YWx1ZS4KLQkoYWZfZ2x5cGhfaGludHNfZG9uZSk6IFVwZGF0ZWQuCi0KLTIwMTUtMDEtMTQgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW2F1dG9maXRdIEFkZCBlbWJlZGRlZCBhcnJheXMgZm9yIHBvaW50cyBhbmQgY29udG91cnMuCi0KLQlUaGlzIGF2b2lkcyBhdCBsZWFzdCB0d28gbWFsbG9jIGNhbGxzIGZvciB0eXBpY2FsIGdseXBocy4KLQotCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9QT0lOVFNfRU1CRURERUQsIEFGX0NPTlRPVVJTX0VNQkVEREVEKToKLQlOZXcgbWFjcm9zLgotCShBRl9HbHlwaEhpbnRzUmVjKTogQWRkIHR3byBhcnJheXMgZm9yIGNvbnRvdXJzIGFuZCBwb2ludHMuCi0KLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfaW5pdCwgYWZfZ2x5cGhfaGludHNfZG9uZSk6Ci0JVXBkYXRlZC4KLQkoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogT25seSBhbGxvY2F0ZSBkYXRhIGlmIG51bWJlciBvZiBjb250b3VycyBvcgotCXBvaW50cyBleGNlZWRzIGdpdmVuIHRocmVzaG9sZCB2YWx1ZXMuCi0KLTIwMTUtMDEtMTQgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW2F1dG9maXRdIEFsbG9jYXRlIGhpbnRzIG9iamVjdCBvbiB0aGUgc3RhY2suCi0KLQlUaGlzIGF2b2lkcyBvbmUgbWFsbG9jIHBlciBsb2FkLgotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5oIChBRl9Mb2FkZXJSZWMpOiBDaGFuZ2UgdHlwZSBvZiBgaGludHMnIHRvCi0JYEFGX0dseXBoSGludHMnLgotCVVwZGF0ZSBwcm90b3R5cGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9pbml0KTogVXNlIGBBRl9HbHlwaEhpbnRzJwotCXBhcmFtZXRlciBpbnN0ZWFkIG9mIGBGVF9NZW1vcnknLgotCShhZl9sb2FkZXJfZG9uZSk6IERpcmVjdGx5IHJlc2V0IGBsb2FkX2hpbnRzJy4KLQkoYWZfbG9hZGVyX2xvYWRfZyk6IFVwZGF0ZWQuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKGFmX2F1dG9maXR0ZXJfbG9hZF9nbHlwaCk6IFVzZSBsb2NhbAotCWBoaW50cycgb2JqZWN0LgotCi0yMDE1LTAxLTE0ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVthdXRvZml0XSBSZXVzZSBzbG90IGdseXBoIGxvYWRlci4KLQotCU5vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGdseXBoIGxvYWRlcjsgd2UgY2FuIHJldXNlIHRoZSBvbmUgZnJvbQotCWBzbG90LT5pbnRlcm5hbC0+bG9hZGVyJy4gIEl0J3MgaGFyZCB0byB0ZWxsIHdoeSBpdCB3YXMgd3JpdHRlbiB0aGF0Ci0Jd2F5IG9yaWdpbmFsbHksIGJ1dCBuZXcgY29kZSBsb29rcyBzb3VuZCBhbmQgY29ycmVjdCB0byBtZSwgYW5kCi0JYXZvaWRzIGxvdHMgb2YgYWxsb2NhdGlvbnMuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9pbml0KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYHZvaWQnLgotCURvbid0IGNhbGwgYEZUX0dseXBoTG9hZGVyX05ldycuCi0JKGFmX2xvYWRlcl9yZXNldCk6IERvbid0IGNhbGwgYEZUX0dseXBoTG9hZGVyX1Jld2luZCcuCi0JKGFmX2xvYWRlcl9sb2FkX2cpOiBVcGRhdGUgY29kZSB0byB1c2UgYGludGVybmFsLT5sb2FkZXInLCB3aGljaAotCWRvZXNuJ3QgbmVlZCBjb3B5aW5nIG9mIGRhdGEuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmggKEFGX0xvYWRlclJlYyk6IFJlbW92ZSBgZ2xvYWRlcicgbWVtYmVyLgotCVVwZGF0ZSBwcm90b3R5cGUuCi0KLQkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmMgKGFmX2F1dG9maXR0ZXJfbG9hZF9nbHlwaCk6IFVwZGF0ZWQuCi0KLTIwMTUtMDEtMTQgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW2F1dG9maXRdIFJlbW92ZSAodW51c2VkKSBzdXBwb3J0IGZvciBjb21wb3NpdGUgZ2x5cGhzLgotCi0JV2UgbmV2ZXIgaGF2ZSB0byBkZWFsIHdpdGggY29tcG9zaXRlIGdseXBocyBpbiB0aGUgYXV0b2hpbnRlciwgYXMKLQl0aG9zZSB3aWxsIGJlIGxvYWRlZCBpbnRvIEZPUk1BVF9PVVRMSU5FIGJ5IHRoZSByZWN1cnNlZAotCWBGVF9Mb2FkX0dseXBoJyBmdW5jdGlvbi4KLQotCUluIHRoZSByYXJlIGNhc2VzIHRoYXQgRlRfTE9BRF9OT19SRUNVUlNFIGlzIHNldCwgaXQgd2lsbCBpbXBseQotCUZUX0xPQURfTk9fU0NBTEUgYXMgcGVyIGBGVF9Mb2FkX0dseXBoJywgd2hpY2ggdGhlbiBpbXBsaWVzCi0JRlRfTE9BRF9OT19ISU5USU5HOgotCi0JICAvKiByZXNvbHZlIGxvYWQgZmxhZ3MgZGVwZW5kZW5jaWVzICovCi0KLQkgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fUkVDVVJTRSApCi0JICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19TQ0FMRSAgICAgICAgIHwKLQkgICAgICAgICAgICAgICAgICBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk07Ci0KLQkgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKQotCSAgewotCSAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fSElOVElORyB8Ci0JICAgICAgICAgICAgICAgICAgRlRfTE9BRF9OT19CSVRNQVA7Ci0KLQkgICAgbG9hZF9mbGFncyAmPSB+RlRfTE9BRF9SRU5ERVI7Ci0JICB9Ci0KLQlhbmQgYXMgc3VjaCB0aGUgYXV0by1oaW50ZXIgaXMgbmV2ZXIgY2FsbGVkLiAgVGh1cywgdGhlIHJlY3Vyc2lvbiBpbgotCWBhZl9sb2FkZXJfbG9hZF9nJyBuZXZlciBhY3R1YWxseSBoYXBwZW5zLiAgU28gcmVtb3ZlIHRoZSBkZXB0aAotCWNvdW50ZXIgYXMgd2VsbC4KLQotCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZyk6IFJlbW92ZSBgZGVwdGgnCi0JcGFyYW1ldGVyLgotCTxGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFPjogUmVtb3ZlIGFzc29jaWF0ZWQgY29kZS4KLQkoYWZfbG9hZGVyX2xvYWRfZ2x5cGgpOiBVcGRhdGVkLgotCi0yMDE1LTAxLTE0ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVtyYXN0ZXJdIEZpeCB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MuCi0KLQlBcHBhcmVudGx5IGByYXMuY1Byb2ZpbGUnIG1pZ2h0IGJlIHVuaW5pdGlhbGl6ZWQuICBUaGlzIHdpbGwgYmUgdGhlCi0JY2FzZSBpZiBgcmFzLnRvcCA9PSByYXMuY1Byb2ZpbGUtPm9mZnNldCcsIGFzIGNhbiBiZSBzZWVuIGluCi0JYEVuZF9Qcm9maWxlJy4gIFRoZSBvdmVyc2hvb3QgY29kZSBpbnRyb2R1Y2VkIGluIGEgY2hhbmdlIGBGaXggQi9XCi0JcmFzdGVyaXphdGlvbiBvZiBzdWJnbHlwaHMgd2l0aCBkaWZmZXJlbnQgZHJvcC1vdXQgbW9kZXMuJyAoZnJvbQotCTIwMDktMDYtMTgpIHZpb2xhdGVkIHRoaXMsIGFjY2Vzc2luZyBgcmFzLmNQcm9maWxlLT5mbGFncycKLQl1bmNvbmRpdGlvbmFsbHkganVzdCBiZWZvcmUgY2FsbGluZyBgRW5kX1Byb2ZpbGUnICh3aGljaCB0aGVuCi0JZGV0ZWN0ZWQgdGhhdCBgY1Byb2ZpbGUnIGlzIHVuaW5pdGlhbGl6ZWQgYW5kIGRpZG4ndCB0b3VjaCBpdCkuCi0KLQlUaGlzIHdhcyBoYXJtbGVzcywgYW5kIHdhcyBub3QgZGV0ZWN0ZWQgYnkgdmFsZ3JpbmQgYmVmb3JlIGJlY2F1c2UKLQl0aGUgb2JqZWN0cyB3ZXJlIGFsbG9jYXRlZCBvbiB0aGUgYHJhc3Rlcl9wb29sJywgd2hpY2ggd2FzIGFsd2F5cwotCWluaXRpYWxpemVkLiAgV2l0aCByZWNlbnQgY2hhbmdlIHRvIGFsbG9jYXRlIHJhc3RlciBidWZmZXJzIG9uIHRoZQotCXN0YWNrLCB2YWxncmluZCBub3cgcmVwb3J0ZWQgdGhpcyBpbnZhbGlkIGFjY2Vzcy4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChDb252ZXJ0X0dseXBoKTogRG9uJ3QgYWNjZXNzIGFuCi0JdW5pbml0aWFsaXplZCBgY1Byb2ZpbGUnLgotCi0yMDE1LTAxLTE0ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVtzbW9vdGhdIEZpeCB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MuCi0KLQlMb29rcyBsaWtlIGByYXMuc3Bhbl95JyBjb3VsZCBhbHdheXMgYmUgdXNlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLgotCVRoaXMgd2FzIG5ldmVyIGRldGVjdGVkIGJ5IHZhbGdyaW5kIGJlZm9yZSBiZWNhdXNlIHRoZSBsaWJyYXJ5LXdpZGUKLQlgcmFzdGVyX3Bvb2wnIHdhcyB1c2VkIGZvciB0aGUgd29ya2VyIG9iamVjdCBhbmQgYHJhc3Rlcl9wb29sJyB3YXMKLQlvcmlnaW5hbGx5IHplcm8nZWQuICBCdXQgc3Vic2VxdWVudCByZXVzZXMgb2YgaXQgd2VyZSB1c2luZyBgc3Bhbl95JwotCXVuaW5pdGlhbGl6ZWQuICBXaXRoIHRoZSByZWNlbnQgY2hhbmdlIHRvIG5vdCB1c2UgYHJlbmRlcl9wb29sJyBhbmQKLQlhbGxvY2F0ZSB3b3JrZXIgYW5kIGJ1ZmZlciBvbiB0aGUgc3RhY2ssIHZhbGdyaW5kIG5vdyBkZXRlY3RzIHRoaXMKLQl1bmluaXRpYWxpemVkIGFjY2Vzcy4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmFzdGVyX3JlbmRlcik6IEluaXRpYWxpemUKLQlgcmFzLnNwYW5feScuCi0KLTIwMTUtMDEtMTQgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW2Jhc2VdIERvbid0IGluaXRpYWxpemUgdW51c2VkIGBkcml2ZXItPmdseXBoX2xvYWRlcicuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChEZXN0cm95X0RyaXZlcik6IERvbid0IGNhbGwKLQlgRlRfR2x5cGhMb2FkZXJfRG9uZScuCi0JKEZUX0FkZF9Nb2R1bGUpOiBEb24ndCBjYWxsIGBGVF9HbHlwaExvYWRlcl9OZXcnLgotCi0yMDE1LTAxLTE0ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVtiYXNlXSBEb24ndCBhbGxvY2F0ZSBgbGlicmFyeS0+cmFzdGVyX3Bvb2wnIGFueW1vcmUuCi0KLQlJdCdzIHVudXNlZCBhZnRlciB0aGUgZm9sbG93aW5nIGNvbW1pdHM6Ci0KLQkgIFtyYXN0ZXJdIEFsbG9jYXRlIHJlbmRlciBwb29sIGZvciBtb25vIHJhc3Rlcml6ZXIgb24gdGhlIHN0YWNrLgotCSAgW3Jhc3Rlcl0gUmVtb3ZlIDUtbGV2ZWwgZ3JheSBBQSBtb2RlIGZyb20gbW9ub2Nocm9tZSByYXN0ZXJpemVyLgotCi0JVGhlIHZhbHVlIG9mIEZUX1JFTkRFUl9QT09MX1NJWkUgc3RpbGwgc2VydmVzIHRoZSBwdXJwb3NlIGl0IHVzZWQgdG8KLQlzZXJ2ZSwgd2hpY2ggaXMsIHRvIGFkanVzdCB0aGUgcG9vbCBzaXplLiAgQnV0IHRoZSBwb29sIGlzIG5vdwotCWFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgb24gZGVtYW5kLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTmV3X0xpYnJhcnksIEZUX0RvbmVfTGlicmFyeSk6IEltcGxlbWVudC4KLQotMjAxNS0wMS0xNCAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlbYmFzZV0gRG8gbm90IHJlb3JkZXIgbGlicmFyeS0+cmVuZGVyZXJzIHVwb24gdXNlLgotCi0JSW5zdGVhZCBvZiBrZWVwaW5nIGBsaWJyYXJ5LT5yZW5kZXJlcnMnIGluIGEgTVJVIG9yZGVyLCBqdXN0IGxlYXZlCi0JaXQgYXMtaXMuICBUaGUgTVJVIG1hY2hpbmVyeSB3YXNuJ3QgdGhyZWFkLXNhZmUuCi0KLQlXaXRoIHRoaXMgcGF0Y2gsIHJhc3Rlcml6aW5nIGdseXBocyBmcm9tIGRpZmZlcmVudCBmYWNlcyBmcm9tCi0JZGlmZmVyZW50IHRocmVhZHMgZG9lc24ndCBmYWlsIGNob29zaW5nIHJhc3Rlcml6ZXIKLQkoRlRfRXJyX0Nhbm5vdF9SZW5kZXJfR2x5cGgpLgotCi0JRWFzaWVzdCB0byBzZWUgdGhhdCBjcmFzaCB3YXMgdG8gYWRkIGEgYHByaW50ZicgKG9yIG90aGVyd2lzZSBsZXQKLQl0aHJlYWQgeWllbGQgaW4gRlRfVGhyb3cgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZCkuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwpLCBzcmMvYmFzZS9mdG91dGxuLmMKLQkoRlRfT3V0bGluZV9SZW5kZXIpOiBEb24ndCBjYWxsIGBGVF9TZXRfUmVuZGVyZXInLgotCi0yMDE1LTAxLTE0ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVtyYXN0ZXJdIEFsbG9jYXRlIHJlbmRlciBwb29sIGZvciBtb25vIHJhc3Rlcml6ZXIgb24gdGhlIHN0YWNrLgotCi0JSW5zdGVhZCBvZiB1c2luZyB0aGUgYHJlbmRlcl9wb29sJyBtZW1iZXIgb2YgYEZUX0xpYnJhcnknIHRoYXQgaXMKLQlwcm92aWRlZCBkb3duIHRvIHRoZSByYXN0ZXJpemVyLCBjb21wbGV0ZWx5IGlnbm9yZSB0aGF0IGFuZCBhbGxvY2F0ZQotCW5lZWRlZCBvYmplY3RzIG9uIHRoZSBzdGFjayBpbnN0ZWFkLgotCi0JV2l0aCB0aGlzIHBhdGNoLCByYXN0ZXJpemluZyBnbHlwaHMgZnJvbSBkaWZmZXJlbnQgZmFjZXMgZnJvbQotCWRpZmZlcmVudCB0aHJlYWRzIGRvZXNuJ3QgY3Jhc2ggaW4gdGhlIG1vbm9jaHJvbWUgcmFzdGVyaXplci4KLQotCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChibGFja19UUmFzdGVyKTogUmVtb3ZlIGBidWZmZXInLAotCWBidWZmZXJfc2l6ZScsIGFuZCBgd29ya2VyJyBtZW1iZXJzLgotCi0JKGZ0X2JsYWNrX3JlbmRlcik6IENyZWF0ZSBgYnVmZmVyJyBsb2NhbGx5LgotCShmdF9ibGFja19yZXNldCk6IFVwZGF0ZWQuCi0KLTIwMTUtMDEtMTQgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgotCi0JW3Jhc3Rlcl0gUmVtb3ZlIDUtbGV2ZWwgZ3JheSBBQSBtb2RlIGZyb20gbW9ub2Nocm9tZSByYXN0ZXJpemVyLgotCi0JSXQgd2FzIG9mZiBieSBkZWZhdWx0IGFuZCBjb3VsZG4ndCBiZSB0dXJuZWQgb24gYXQgcnVudGltZS4gIEFuZCB0aGUKLQlzbW9vdGggcmFzdGVyaXplciBzdXBlcnNlZGVkIGl0IG92ZXIgdGVuIHllYXJzIGFnby4gIE5vIHBvaW50IGluCi0Ja2VlcGluZy4gIENvbW1lbnRzIHN1Z2dlc3RlZCB0aGF0IGl0IHdhcyB0aGVyZSBmb3IgY29tcGF0aWJpbGl0eQotCXdpdGggRnJlZVR5cGUgMS4KLQotCTU1MCBsaW5lcyBkb3duLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORywKLQlSQVNURVJfR1JBWV9MSU5FUyk6IFJlbW92ZSBtYWNyb3MgYW5kIGFsbCBhc3NvY2lhdGVkIGNvZGUuCi0KLQkoYmxhY2tfVFdvcmtlcik6IFJlbW92ZSBgZ3JheV9taW5feCcgYW5kIGBncmF5X21heF94Jy4KLQkoYmxhY2tfVFJhc3Rlcik6IFJlbW92ZSBgZ3JheXMnIGFuZCBgZ3JheV93aWR0aCcuCi0KLQkoVmVydGljYWxfU3dlZXBfSW5pdCwgVmVydGljYWxfU3dlZXBfU3BhbiwgVmVydGljYWxfU3dlZXBfRHJvcCwKLQlmdF9ibGFja19yZW5kZXIpOiBVcGRhdGVkLgotCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBTaW1wbGlmeSBjb2RlLgotCShmdF9yYXN0ZXI1X3JlbmRlcmVyX2NsYXNzKTogUmVtb3ZlZC4KLQotMjAxNS0wMS0xNCAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlbc21vb3RoXSBBbGxvY2F0ZSByZW5kZXIgcG9vbCBmb3Igc21vb3RoIHJhc3Rlcml6ZXIgb24gdGhlIHN0YWNrLgotCi0JSW5zdGVhZCBvZiB1c2luZyB0aGUgYHJlbmRlcl9wb29sJyBtZW1iZXIgb2YgYEZUX0xpYnJhcnknIHRoYXQgaXMKLQlwcm92aWRlZCBkb3duIHRvIHRoZSByYXN0ZXJpemVyLCBjb21wbGV0ZWx5IGlnbm9yZSB0aGF0IGFuZCBhbGxvY2F0ZQotCW5lZWRlZCBvYmplY3RzIG9uIHRoZSBzdGFjayBpbnN0ZWFkLgotCi0JV2l0aCB0aGlzIHBhdGNoLCByYXN0ZXJpemluZyBnbHlwaHMgZnJvbSBkaWZmZXJlbnQgZmFjZXMgZnJvbQotCWRpZmZlcmVudCB0aHJlYWRzIGRvZXNuJ3QgY3Jhc2ggaW4gdGhlIHNtb290aCByYXN0ZXJpemVyLgotCi0JQnVnczoKLQotCSAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD02NzgzOTcKLQkgIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTAwNDMxNQotCSAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMTY1NDcxCi0JICBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD02OTAzNAotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9UUmFzdGVyKTogUmVtb3ZlIGBidWZmZXInLAotCWBidWZmZXJfc2l6ZScsIGBiYW5kX3NpemUnLCBhbmQgYHdvcmtlcicgbWVtYmVycy4KLQotCShncmF5X3Jhc3Rlcl9yZW5kZXIpOiBDcmVhdGUgYGJ1ZmZlcicsIGBidWZmZXJfc2l6ZScsIGFuZAotCWBiYW5kX3NpemUnIGxvY2FsbHkuCi0JKGdyYXlfcmFzdGVyX3Jlc2V0KTogVXBkYXRlZC4KLQotMjAxNS0wMS0xNCAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFsbG9jYXRlIFRUX0V4ZWNDb250ZXh0IGluIFRUX1NpemUgaW5zdGVhZCBvZiBUVF9Ecml2ZXIuCi0KLQlQcmV2aW91c2x5IHRoZSBjb2RlIGhhZCBzdGlwdWxhdGlvbiBmb3IgdXNpbmcgYSBwZXItVFRfU2l6ZSBleGVjCi0JY29udGV4dCBpZiBgc2l6ZS0+ZGVidWcnIHdhcyB0cnVlLiAgQnV0IHRoZXJlIHdhcyBubyB3YXkgdGhhdAotCWBzaXplLT5kZWJ1ZycgY291bGQgKmV2ZXIqIGJlIHRydWUuICBBcyBzdWNoLCB0aGUgY29kZSB3YXMgYWx3YXlzCi0JdXNpbmcgdGhlIHNpbmdsZXRvbiBgVFRfRXhlY0NvbnRleHQnIHRoYXQgd2FzIHN0b3JlZCBpbiBgVFRfRHJpdmVyJy4KLQlUaGlzIHdhcywgY2xlYXJseSwgbm90IHRocmVhZHNhZmUuCi0KLQlXaXRoIHRoaXMgcGF0Y2gsIGxvYWRpbmcgZ2x5cGhzIGZyb20gZGlmZmVyZW50IGZhY2VzIGZyb20gZGlmZmVyZW50Ci0JdGhyZWFkcyBkb2Vzbid0IGNyYXNoIGluIHRoZSBieXRlY29kZSBsb2FkZXIgY29kZS4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5oIChUVF9TaXplUmVjKTogUmVtb3ZlIGBkZWJ1ZycgbWVtYmVyLgotCShUVF9Ecml2ZXJSZWMpOiBSZW1vdmUgYGNvbnRleHQnIG1lbWJlci4KLQotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX3J1bl9mcGdtLCB0dF9zaXplX3J1bl9wcmVwKTogUmVtb3ZlCi0JYFRUX0V4ZWNDb250ZXh0JyBjb2RlIHJlbGF0ZWQgdG8gYSBnbG9iYWwgYFRUX0RyaXZlcicgb2JqZWN0LgotCi0JKHR0X2RyaXZlcl9kb25lKTogRG9uJ3QgcmVtb3ZlIGBUVF9FeGVjQ29udGV4dCcgb2JqZWN0IGhlcmUgYnV0IC4uLgotCSh0dF9zaXplX2RvbmVfYnl0ZWNvZGUpOiAuLi4gaGVyZS4KLQotCSh0dF9kcml2ZXJfaW5pdCk6IERvbid0IGNyZWF0ZSBgVFRfRXhlY0NvbnRleHQnIG9iamVjdCBoZXJlIGJ1dCAuLi4KLQkodHRfc2l6ZV9pbml0X2J5dGVjb2RlKTogLi4uIGhlcmUsIG9ubHkgb24gZGVtYW5kLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuX0NvbnRleHQpOiBSZW1vdmUgZGVmdW5jdCBkZWJ1ZwotCWNvZGUuCi0JKFRUX05ld19Db250ZXh0KTogUmVtb3ZlIGBUVF9FeGVjQ29udGV4dCcgY29kZSByZWxhdGVkIHRvIGEgZ2xvYmFsCi0JYFRUX0RyaXZlcicgb2JqZWN0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaDogVXBkYXRlZC4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfSGludF9HbHlwaCwgdHRfbG9hZGVyX2luaXQpOiBVcGRhdGVkLgotCi0yMDE1LTAxLTE0ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCVthdXRvZml0XSBBbGxvY2F0ZSBBRl9Mb2FkZXIgb24gdGhlIHN0YWNrIGluc3RlYWQgb2YgQUZfTW9kdWxlLgotCi0JU3RvcCBzaGFyaW5nIGEgZ2xvYmFsIGBBRl9Mb2FkZXInLiAgQWxsb2NhdGUgb25lIG9uIHRoZSBzdGFjayBkdXJpbmcKLQlnbHlwaCBsb2FkLgotCi0JUmlnaHQgbm93IHRoaXMgcmVzdWx0cyBpbiBhYm91dCAyNSUgc2xvd2Rvd24sIHRvIGJlIGZpeGVkIGluIGEKLQlmb2xsb3dpbmcgY29tbWl0LgotCi0JV2l0aCB0aGlzIHBhdGNoIGxvYWRpbmcgZ2x5cGhzIGZyb20gZGlmZmVyZW50IGZhY2VzIGZyb20gZGlmZmVyZW50Ci0JdGhyZWFkcyBkb2Vzbid0IGltbWVkaWF0ZWx5IGNyYXNoIGluIHRoZSBhdXRvaGludGluZyBsb2FkZXIgY29kZS4KLQotCUJ1Z3M6Ci0KLQkgIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTE2NDk0MQotCi0JKiBzcmMvYXV0b2ZpdC9hZmxvYWRlci5jIChhZl9sb2FkZXJfaW5pdCk6IFBhc3MKLQlgQUZfTG9hZGVyJyBhbmQgYEZUX01lbW9yeScgaW5zdGVhZCBvZiBgQUZfTW9kdWxlJyBhcyBhcmd1bWVudHMuCi0JKGFmX2xvYWRlcl9yZXNldCwgYWZfbG9hZGVyX2xvYWRfZ2x5cGgpOiBBbHNvIHBhc3MgYGxvYWRlcicgYXMKLQlhcmd1bWVudC4KLQkoYWZfbG9hZGVyX2RvbmUpOiBVc2UgYEFGX0xvYWRlcicgaW5zdGVhZCBvZiBgQUZfTW9kdWxlJyBhcwotCWFyZ3VtZW50LgotCi0JKiBzcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIChhZl9hdXRvZml0dGVyX2luaXQpOiBEb24ndCBjYWxsCi0JYGFmX2xvYWRlcl9pbml0Jy4KLQkoYWZfYXV0b2ZpdHRlcl9kb25lKTogRG9uJ3QgY2FsbCBgYWZfbG9hZGVyX2RvbmUnLgotCShhZl9hdXRvZml0dGVyX2xvYWRfZ2x5cGgpOiBVc2UgYSBsb2NhbCBgQUZfTG9hZGVyJyBvYmplY3QuCi0KLQkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmg6IEluY2x1ZGUgYGFmbW9kdWxlLmgnLgotCVVwZGF0ZSBwcm90b3R5cGVzLgotCU1vdmUgdHlwZWRlZiBmb3IgYEFGX01vZHVsZScgdG8uLi4KLQotCSogc3JjL2F1dG9maXQvYWZtb2R1bGUuaDogLi4uIHRoaXMgcGxhY2UuCi0JTm8gbG9uZ2VyIGluY2x1ZGUgYGFmbG9hZGVyLmgnLgotCi0yMDE1LTAxLTE0ICBCZWhkYWQgRXNmYWhib2QgIDxiZWhkYWRAYmVoZGFkLm9yZz4KLQotCSogc3JjL3R5cGU0Mi90NDJvYmpzLmggKFQ0Ml9Ecml2ZXJSZWMpOiBSZW1vdmUgdW51c2VkIG1lbWJlci4KLQotMjAxNS0wMS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IFNhdmFubmFoIGJ1ZyAjNDM5NzYuCi0KLQlBc3N1cmUgdGhhdCBGcmVlVHlwZSdzIGludGVybmFsIGluY2x1ZGUgZGlyZWN0b3JpZXMgYXJlIGZvdW5kIGJlZm9yZQotCWBDUFBGTEFHUycgKHdoaWNoIG1pZ2h0IGJlIHNldCBieSB0aGUgdXNlciBpbiB0aGUgZW52aXJvbm1lbnQpLCBhbmQKLQlgQ1BQRkxBR1MnIGJlZm9yZSBgQ0ZMQUdTJy4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rIChGVF9DRkxBR1MpOiBEb24ndCBhZGQgYElOQ0xVREVfRkxBR1MnLgotCShGVF9DT01QSUxFKTogTWFrZSB0aGlzIGEgc3BlY2lhbCB2YXJpYWJsZSBmb3IgY29tcGlsaW5nIG9ubHkgdGhlCi0JZmlsZXMgaGFuZGxlZCBpbiBgZnJlZXR5cGUubWsnLgotCSguYy4kTyk6IFJlbW92ZWQsIHVudXNlZC4KLQotCSogc3JjLyovcnVsZXMubWsgKCpfQ09NUElMRSk6IEZpeCBvcmRlciBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzLgotCi0yMDE1LTAxLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFByZXR0aWZ5aW5nLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAocHJvamVjdCwgZHVhbHByb2osIGZhc3RfcHJvamVjdCwKLQlmYXN0X2R1YWxwcm9qKTogUmVuYW1lIHRvLi4uCi0JKFBST0pFQ1QsIERVQUxQUk9KLCBGQVNUX1BST0pFQ1QsIEZBU1RfRFVBTFBST0opOiAuLi4gdGhpcy4KLQotMjAxNS0wMS0xMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX0pST1QsIEluc19KUk9GKTogU2ltcGxpZnkuCi0KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gQmVoZGFkLgotCi0yMDE1LTAxLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfU3hWVEwpOiBTaW1wbGlmeSBmdW5jdGlvbiBjYWxsLgotCi0yMDE1LTAxLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChOb3JtYWxpemUpOiBSZW1vdmUgdW51c2VkIGFyZ3VtZW50LgotCi0yMDE1LTAxLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1vcmUgbWFjcm8gZXhwYW5zaW9ucy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEZUX1VOVVNFRF9FWEVDKTogUmVtb3ZlIG1hY3JvIGJ5Ci0JZXhwYW5zaW9uLgotCi0yMDE1LTAxLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1vcmUgbWFjcm8gZXhwYW5zaW9ucy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKElOU19BUkcpOiBSZW1vdmUgbWFjcm8gYnkgZXhwYW5zaW9uLAotCWFkanVzdGluZyBmdW5jdGlvbiBjYWxscyB3aGVyZSBuZWNlc3NhcnkuCi0JKEZUX1VOVVNFRF9BUkcpOiBSZW1vdmVkLCBubyBsb25nZXIgbmVlZGVkLgotCi0yMDE1LTAxLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1vcmUgbWFjcm8gZXhwYW5zaW9ucy4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBCZWhkYWQuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChET18qKTogRXhwYW5kIG1hY3JvcyBpbnRvIGNvcnJlc3BvbmRpbmcKLQlgSW5zXyonIGZ1bmN0aW9ucy4KLQkoVFRfUnVuSW5zKTogUmVwbGFjZSBgRE9fKicgbWFjcm9zIHdpdGggYEluc18qJyBmdW5jdGlvbiBjYWxscy4KLQkoQVJSQVlfQk9VTkRfRVJST1IpOiBSZW1vdmUgc2Vjb25kIGRlZmluaXRpb24sIHdoaWNoIGlzIG5vIGxvbmdlcgotCW5lZWRlZC4KLQkoSW5zX1NWVENBLCBJbnNfU1BWVENBLCBJbnNfU0ZWVENBKTogUmVwbGFjZWQgd2l0aC4uLgotCShJbnNfU3h5VENBKTogTmV3IGZ1bmN0aW9uLgotCi0yMDE1LTAxLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFJlbW92ZSBUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSC4KLQotCUJlaGRhZCBzdWdnZXN0ZWQgdGhpcyBjb2RlIHNpbXBsaWZpY2F0aW9uLCBhbmQgbm9ib2R5IG9iamVjdGVkLi4uCi0KLQkqIGluY2x1ZGUvY29uZmlnL2Z0b3B0aW9uLmgsIGRldmVsL2Z0b3B0aW9uLmgKLQkoVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0gpOiBSZW1vdmUuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIFtUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSF06Ci0JUmVtb3ZlIHJlbGF0ZWQgY29kZS4KLQkoQVJSQVlfQk9VTkRfRVJST1IpOiBVc2UgZG8td2hpbGUgbG9vcC4KLQotMjAxNS0wMS0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBNb3JlIG1hY3JvIGV4cGFuc2lvbnMuCi0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jLCBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCAoRVhFQ19BUkdfLAotCUVYRUNfQVJHKTogUmVtb3ZlIGJ5IHJlcGxhY2luZyB3aXRoIGV4cGFuc2lvbi4KLQotMjAxNS0wMS0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBNb3JlIG1hY3JvIGV4cGFuc2lvbnMuCi0KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gQmVoZGFkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoU0tJUF9Db2RlLCBHRVRfU2hvcnRJbnMsIE5PUk1hbGl6ZSwKLQlTRVRfU3VwZXJSb3VuZCwgUk9VTkRfTm9uZSwgSU5TX0dvdG9fQ29kZVJhbmdlLCBDVVJfRnVuY19tb3ZlLAotCUNVUl9GdW5jX21vdmVfb3JpZywgQ1VSX0Z1bmNfcm91bmQsIENVUl9GdW5jX2N1cl9wcGVtLAotCUNVUl9GdW5jX3JlYWRfY3Z0LCBDVVJfRnVuY193cml0ZV9jdnQsIENVUl9GdW5jX21vdmVfY3Z0LAotCUNVUlJFTlRfUmF0aW8sIElOU19TeFZUTCwgQ09NUFVURV9GdW5jcywgQ09NUFVURV9Sb3VuZCwKLQlDT01QVVRFX1BvaW50X0Rpc3BsYWNlbWVudCwgTU9WRV9acDJfUG9pbnQpOiBSZW1vdmUgYnkgcmVwbGFjaW5nCi0Jd2l0aCBleHBhbnNpb24uCi0KLQkoQ3VyX0Z1bmNfcHJvamVjdCwgQ1VSX0Z1bmNfZHVhbHByb2osIENVUl9mYXN0X3Byb2plY3QsCi0JQ1VSX2Zhc3RfZHVhbHByb2opOiBSZXBsYWNlIHdpdGggbWFjcm9zIGBwcm9qZWN0JywgYGR1YWxwcm9qJywKLQlgZmFzdF9wcm9qZWN0JywgYGZhc3RfZHVhbHByb2onLgotCi0yMDE1LTAxLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIE1vcmUgbWFjcm8gZXhwYW5zaW9ucy4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEVYRUNfT1BfLCBFWEVDX09QKTogUmVtb3ZlIGJ5IHJlcGxhY2luZwotCXdpdGggZXhwYW5zaW9uLgotCi0yMDE1LTAxLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIFJlbW92ZSBjb2RlIGZvciBzdGF0aWMgVHJ1ZVR5cGUgaW50ZXJwcmV0ZXIuCi0KLQlUaGlzIGlzIGEgZm9sbG93LXVwIHBhdGNoLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYywgc3JjL3RydWV0eXBlL3R0aW50ZXJwLmgKLQlbVFRfQ09ORklHX09QVElPTl9TVEFUSUNfSU5URVJQUkVURVIsCi0JVFRfQ09ORklHX09QVElPTl9TVEFUSUNfUkFTVEVSXTogUmVtb3ZlIG1hY3JvcyBhbmQgcmVsYXRlZCBjb2RlLgotCi0yMDE1LTAxLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChDVVIpOiBSZW1vdmUgYnkgcmVwbGFjaW5nIHdpdGggZXhwYW5zaW9uLgotCi0JVGhpcyBzdGFydHMgYSBzZXJpZXMgb2YgcGF0Y2hlcyB0aGF0IHNpbXBsaWZpZXMgdGhlIGNvZGUgb2YgdGhlCi0JYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAxNS0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi1hbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi1MSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLWZ1bGx5LgotCi0KLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLWNvZGluZzogdXRmLTgKLUVuZDoKZGlmZiAtLWdpdCBhL0phbWZpbGUgYi9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGY5YjhmLi4wMDAwMDAwCi0tLSBhL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHRvcCBKYW1maWxlLgotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIFRoZSBIRFJNQUNSTyBpcyBhbHJlYWR5IGRlZmluZWQgaW4gRlRKYW0gYW5kIGlzIHVzZWQgdG8gYWRkCi0jIHRoZSBjb250ZW50IG9mIGNlcnRhaW4gbWFjcm9zIHRvIHRoZSBsaXN0IG9mIGluY2x1ZGVkIGhlYWRlcgotIyBmaWxlcy4KLSMKLSMgV2UgY2FuIGNvbXBpbGUgRnJlZVR5cGUgMiB3aXRoIGNsYXNzaWMgSmFtIGhvd2V2ZXIgdGhhbmtzIHRvCi0jIHRoZSBmb2xsb3dpbmcgY29kZQotIwotaWYgISAkKEpBTV9UT09MU0VUKQotewotICBydWxlIEhEUk1BQ1JPCi0gIHsKLSAgICAjIG5vdGhpbmcKLSAgfQotfQotCi0KLSMgV2UgbmVlZCB0byBpbnZva2UgYSBTdWJEaXIgcnVsZSBpZiB0aGUgRlQyIHNvdXJjZSBkaXJlY3RvcnkgdG9wIGlzIG5vdCB0aGUKLSMgY3VycmVudCBkaXJlY3RvcnkuICBUaGlzIGFsbG93cyB1cyB0byBidWlsZCBGcmVlVHlwZSAyIGFzIHBhcnQgb2YgYSBsYXJnZXIKLSMgcHJvamVjdCBlYXNpbHkuCi0jCi1pZiAkKEZUMl9UT1ApICE9ICQoRE9UKQotewotICBTdWJEaXIgIEZUMl9UT1AgOwotfQotCi0KLSMgVGhlIGZvbGxvd2luZyBtYWNyb3MgZGVmaW5lIHRoZSBpbmNsdWRlIGRpcmVjdG9yeSwgdGhlIHNvdXJjZSBkaXJlY3RvcnksCi0jIGFuZCB0aGUgZmluYWwgbGlicmFyeSBuYW1lICh3aXRob3V0IGxpYnJhcnkgZXh0ZW5zaW9ucykuICBUaGV5IGNhbiBiZQotIyByZXBsYWNlZCBieSBvdGhlciBkZWZpbml0aW9ucyB3aGVuIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIGFzIHBhcnQgb2YKLSMgYSBsYXJnZXIgcHJvamVjdC4KLSMKLQotIyBOYW1lIG9mIEZyZWVUeXBlIGluY2x1ZGUgZGlyZWN0b3J5IGR1cmluZyBjb21waWxhdGlvbi4KLSMgVGhpcyBpcyByZWxhdGl2ZSB0byBGVDJfVE9QLgotIwotRlQyX0lOQ0xVREVfRElSID89IGluY2x1ZGUgOwotCi0jIE5hbWUgb2YgRnJlZVR5cGUgc291cmNlIGRpcmVjdG9yeSBkdXJpbmcgY29tcGlsYXRpb24uCi0jIFRoaXMgaXMgcmVsYXRpdmUgdG8gRlQyX1RPUC4KLSMKLUZUMl9TUkNfRElSID89IHNyYyA7Ci0KLSMgTmFtZSBvZiBmaW5hbCBsaWJyYXJ5LCB3aXRob3V0IGV4dGVuc2lvbi4KLSMKLUZUMl9MSUIgPz0gJChMSUJQUkVGSVgpZnJlZXR5cGUgOwotCi0KLSMgRGVmaW5lIEZUMl9CVUlMRF9JTkNMVURFIHRvIHBvaW50IHRvIHlvdXIgYnVpbGQtc3BlY2lmaWMgZGlyZWN0b3J5LgotIyBUaGlzIGlzIHByZXBlbmRlZCB0byBGVDJfSU5DTFVERV9ESVIuICBJdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5Ci0jIHRoZSBsb2NhdGlvbiBvZiBhIGN1c3RvbSA8ZnQyYnVpbGQuaD4gd2hpY2ggd2lsbCBwb2ludCB0byBjdXN0b20KLSMgdmVyc2lvbnMgb2YgYGZ0bW9kdWxlLmgnIGFuZCBgZnRvcHRpb24uaCcsIGZvciBleGFtcGxlLgotIwotRlQyX0JVSUxEX0lOQ0xVREUgPz0gOwotCi0jIFRoZSBsaXN0IG9mIG1vZHVsZXMgdG8gY29tcGlsZSBvbiBhbnkgZ2l2ZW4gYnVpbGQgb2YgdGhlIGxpYnJhcnkuCi0jIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBjb250YWluIF9hbGxfIG1vZHVsZXMgZGVmaW5lZCBpbiBGVDJfU1JDX0RJUi4KLSMKLSMgSU1QT1JUQU5UOiBZb3UnbGwgbmVlZCB0byBjaGFuZ2UgdGhlIGNvbnRlbnQgb2YgYGZ0bW9kdWxlLmgnIGFzIHdlbGwKLSMgICAgICAgICAgICBpZiB5b3UgbW9kaWZ5IHRoaXMgbGlzdCBvciBwcm92aWRlIHlvdXIgb3duLgotIwotRlQyX0NPTVBPTkVOVFMgPz0gYXV0b2ZpdCAgICAjIGF1dG8tZml0dGVyCi0gICAgICAgICAgICAgICAgICBiYXNlICAgICAgICMgYmFzZSBjb21wb25lbnQgKHB1YmxpYyBBUElzKQotICAgICAgICAgICAgICAgICAgYmRmICAgICAgICAjIEJERiBmb250IGRyaXZlcgotICAgICAgICAgICAgICAgICAgYnppcDIgICAgICAjIHN1cHBvcnQgZm9yIGJ6aXAyLWNvbXByZXNzZWQgUENGIGZvbnQKLSAgICAgICAgICAgICAgICAgIGNhY2hlICAgICAgIyBjYWNoZSBzdWItc3lzdGVtCi0gICAgICAgICAgICAgICAgICBjZmYgICAgICAgICMgQ0ZGL0NFRiBmb250IGRyaXZlcgotICAgICAgICAgICAgICAgICAgY2lkICAgICAgICAjIFBvc3RTY3JpcHQgQ0lELWtleWVkIGZvbnQgZHJpdmVyCi0gICAgICAgICAgICAgICAgICBnemlwICAgICAgICMgc3VwcG9ydCBmb3IgZ3ppcC1jb21wcmVzc2VkIFBDRiBmb250Ci0gICAgICAgICAgICAgICAgICBsencgICAgICAgICMgc3VwcG9ydCBmb3IgTFpXLWNvbXByZXNzZWQgUENGIGZvbnQKLSAgICAgICAgICAgICAgICAgIHBjZiAgICAgICAgIyBQQ0YgZm9udCBkcml2ZXIKLSAgICAgICAgICAgICAgICAgIHBmciAgICAgICAgIyBQRlIvVHJ1ZURvYyBmb250IGRyaXZlcgotICAgICAgICAgICAgICAgICAgcHNhdXggICAgICAjIGNvbW1vbiBQb3N0U2NyaXB0IHJvdXRpbmVzIG1vZHVsZQotICAgICAgICAgICAgICAgICAgcHNoaW50ZXIgICAjIFBvc3RTY3JpcHQgaGludGVyIG1vZHVsZQotICAgICAgICAgICAgICAgICAgcHNuYW1lcyAgICAjIFBvc3RTY3JpcHQgbmFtZXMgaGFuZGxpbmcKLSAgICAgICAgICAgICAgICAgIHJhc3RlciAgICAgIyBtb25vY2hyb21lIHJhc3Rlcml6ZXIKLSAgICAgICAgICAgICAgICAgIHNmbnQgICAgICAgIyBTRk5ULWJhc2VkIGZvcm1hdCBzdXBwb3J0IHJvdXRpbmVzCi0gICAgICAgICAgICAgICAgICBzbW9vdGggICAgICMgYW50aS1hbGlhc2VkIHJhc3Rlcml6ZXIKLSAgICAgICAgICAgICAgICAgIHRydWV0eXBlICAgIyBUcnVlVHlwZSBmb250IGRyaXZlcgotICAgICAgICAgICAgICAgICAgdHlwZTEgICAgICAjIFBvc3RTY3JpcHQgVHlwZSAxIGZvbnQgZHJpdmVyCi0gICAgICAgICAgICAgICAgICB0eXBlNDIgICAgICMgUG9zdFNjcmlwdCBUeXBlIDQyIChlbWJlZGRlZCBUcnVlVHlwZSkgZHJpdmVyCi0gICAgICAgICAgICAgICAgICB3aW5mb250cyAgICMgV2luZG93cyBGT04vRk5UIGZvbnQgZHJpdmVyCi0gICAgICAgICAgICAgICAgICA7Ci0KLQotIyBEb24ndCB0b3VjaC4KLSMKLUZUMl9JTkNMVURFICA9ICQoRlQyX0JVSUxEX0lOQ0xVREUpCi0gICAgICAgICAgICAgICBbIEZUMl9TdWJEaXIgJChGVDJfSU5DTFVERV9ESVIpIF0gOwotCi1GVDJfU1JDICAgICAgPSBbIEZUMl9TdWJEaXIgJChGVDJfU1JDX0RJUikgXSA7Ci0KLSMgTG9jYXRpb24gb2YgQVBJIFJlZmVyZW5jZSBEb2N1bWVudGF0aW9uCi0jCi1pZiAkKERPQ19ESVIpCi17Ci0gIERPQ19ESVIgPSAkKERPQ0RJUjpUKSA7Ci19Ci1lbHNlCi17Ci0gIERPQ19ESVIgPSBkb2NzL3JlZmVyZW5jZSA7Ci19Ci0KLQotIyBPbmx5IHVzZWQgYnkgRnJlZVR5cGUgZGV2ZWxvcGVycy4KLSMKLWlmICQoREVCVUdfSElOVEVSKQotewotICBDQ0ZMQUdTICs9IC1EREVCVUdfSElOVEVSIDsKLX0KLQotCi0jIFdlIG5lZWQgYGluY2x1ZGUnIGluIHRoZSBjdXJyZW50IGluY2x1ZGUgcGF0aCBpbiBvcmRlciB0bwotIyBjb21waWxlIGFueSBwYXJ0IG9mIEZyZWVUeXBlIDIuCi0jCi1IRFJTICs9ICQoRlQyX0lOQ0xVREUpIDsKLQotCi0jIFdlIG5lZWQgdG8gI2RlZmluZSBGVDJfQlVJTERfTElCUkFSWSBzbyB0aGF0IG91ciBzb3VyY2VzIGZpbmQgdGhlCi0jIGludGVybmFsIGhlYWRlcnMKLSMKLUNDRkxBR1MgKz0gLURGVDJfQlVJTERfTElCUkFSWSA7Ci0KLSMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSBpZiB5b3Ugd2FudCB0byBidWlsZCBpbmRpdmlkdWFsIHNvdXJjZSBmaWxlcwotIyBmb3IgZWFjaCBGcmVlVHlwZSAyIG1vZHVsZS4gIFRoaXMgaXMgb25seSB1c2VmdWwgZHVyaW5nIGRldmVsb3BtZW50LCBhbmQKLSMgaXMgYmV0dGVyIGRlZmluZWQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYW55d2F5IQotIwotIyBGVDJfTVVMVEkgPSB0cnVlIDsKLQotCi0jIFRoZSBmaWxlcyBgZnRoZWFkZXIuaCcsIGBpbnRlcm5hbC5oJywgYW5kIGBmdHNlcnYuaCcgYXJlIHVzZWQgdG8gZGVmaW5lCi0jIG1hY3JvcyB0aGF0IGFyZSBsYXRlciB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMuICBUaGV5IG5lZWQgdG8gYmUgcGFyc2VkCi0jIGluIG9yZGVyIHRvIHJlY29yZCB0aGVzZSBkZWZpbml0aW9ucy4KLSMKLUhEUk1BQ1JPICBbIEZUMl9TdWJEaXIgICQoRlQyX0lOQ0xVREVfRElSKSBmcmVldHlwZSBjb25maWcgZnRoZWFkZXIuaCBdIDsKLUhEUk1BQ1JPICBbIEZUMl9TdWJEaXIgICQoRlQyX0lOQ0xVREVfRElSKSBmcmVldHlwZSBpbnRlcm5hbCBpbnRlcm5hbC5oIF0gOwotSERSTUFDUk8gIFsgRlQyX1N1YkRpciAgJChGVDJfSU5DTFVERV9ESVIpIGZyZWV0eXBlIGludGVybmFsIGZ0c2Vydi5oIF0gOwotCi0KLSMgTm93IGluY2x1ZGUgdGhlIEphbWZpbGUgaW4gYGZyZWV0eXBlMi9zcmMnLCB1c2VkIHRvIGRyaXZlIHRoZSBjb21waWxhdGlvbgotIyBvZiBlYWNoIEZyZWVUeXBlIDIgY29tcG9uZW50IGFuZC9vciBtb2R1bGUuCi0jCi1TdWJJbmNsdWRlICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIDsKLQotIyBIYW5kbGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGBmdGV4cG9ydC5zeW0nIGZpbGUsIHdoaWNoIGNvbnRhaW5zIHRoZSBsaXN0Ci0jIG9mIGV4cG9ydGVkIHN5bWJvbHMuICBUaGlzIGNhbiBiZSB1c2VkIG9uIFVuaXggYnkgbGlidG9vbC4KLSMKLVN1YkluY2x1ZGUgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSB0b29scyA7Ci0KLXJ1bGUgR2VuRXhwb3J0U3ltYm9scwotewotICBsb2NhbCAgYXBpbmFtZXMgPSBhcGluYW1lcyQoU1VGRVhFKSA7Ci0gIGxvY2FsICBhaGVhZGVyIDsKLSAgbG9jYWwgIGhlYWRlcnMgOwotCi0gIGZvciBhaGVhZGVyIGluIFsgR2xvYiAkKDIpIDogKi5oIF0KLSAgewotICAgIHN3aXRjaCAkKGFoZWFkZXIpCi0gICAgewotICAgICAgY2FzZSAqL2Z0bWFjLmggOgotICAgICAgICBpZiAoICQoTUFDKSB8fCAkKE9TKSA9IE1BQ09TWCApIHsKLSAgICAgICAgICBoZWFkZXJzICs9ICQoYWhlYWRlcikgOwotICAgICAgICB9Ci0gICAgICBjYXNlICouaCA6IGhlYWRlcnMgKz0gJChhaGVhZGVyKSA7Ci0gICAgfQotICB9Ci0KLSAgTE9DQVRFIG9uICQoMSkgPSAkKEFMTF9MT0NBVEVfVEFSR0VUKSA7Ci0KLSAgQVBJTkFNRVMgb24gJCgxKSA9IGFwaW5hbWVzJChTVUZFWEUpIDsKLQotICBEZXBlbmRzICAgICAgICAgICAgJCgxKSA6ICQoYXBpbmFtZXMpICQoaGVhZGVycykgOwotICBHZW5FeHBvcnRTeW1ib2xzMSAgJCgxKSA6ICQoaGVhZGVycykgOwotICBDbGVhbiAgICAgICAgICAgICAgY2xlYW4gOiAkKDEpIDsKLX0KLQotYWN0aW9ucyBHZW5FeHBvcnRTeW1ib2xzMSBiaW5kIEFQSU5BTUVTCi17Ci0gICQoQVBJTkFNRVMpICQoMikgPiAkKDEpCi19Ci0KLUdlbkV4cG9ydFN5bWJvbHMgIGZ0ZXhwb3J0LnN5bSA6IGluY2x1ZGUvZnJlZXR5cGUgOwotCi0jIFRlc3QgZmlsZXMgKGhpbnRlciBkZWJ1Z2dpbmcpLiAgT25seSB1c2VkIGJ5IEZyZWVUeXBlIGRldmVsb3BlcnMuCi0jCi1pZiAkKERFQlVHX0hJTlRFUikKLXsKLSAgU3ViSW5jbHVkZSBGVDJfVE9QIHRlc3RzIDsKLX0KLQotcnVsZSBSZWZEb2MKLXsKLSAgRGVwZW5kcyAgJDEgOiBhbGwgOwotICBOb3RGaWxlICAkMSA7Ci0gIEFsd2F5cyAgICQxIDsKLX0KLQotYWN0aW9ucyBSZWZEb2MKLXsKLSAgcHl0aG9uICQoRlQyX1NSQykvdG9vbHMvZG9jbWFrZXIvZG9jbWFrZXIucHkKLSAgICAgICAgIC0tcHJlZml4PWZ0MgotICAgICAgICAgLS10aXRsZT1GcmVlVHlwZS0yLjgKLSAgICAgICAgIC0tb3V0cHV0PSQoRE9DX0RJUikKLSAgICAgICAgICQoRlQyX0lOQ0xVREUpL2ZyZWV0eXBlLyouaAotICAgICAgICAgJChGVDJfSU5DTFVERSkvZnJlZXR5cGUvY29uZmlnLyouaAotfQotCi1SZWZEb2MgIHJlZmRvYyA7Ci0KLQotIyBlbmQgb2YgdG9wIEphbWZpbGUKZGlmZiAtLWdpdCBhL0phbXJ1bGVzIGIvSmFtcnVsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDdlNTMuLjAwMDAwMDAKLS0tIGEvSmFtcnVsZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jIEZyZWVUeXBlIDIgSmFtUnVsZXMuCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKYW0gcnVsZXMgbmVlZGVkIHRvIGJ1aWxkIHRoZSBGcmVlVHlwZSAyIGxpYnJhcnkuCi0jIEl0IGlzIHNoYXJlZCBieSBhbGwgSmFtZmlsZXMgYW5kIGlzIGluY2x1ZGVkIG9ubHkgb25jZSBpbiB0aGUgYnVpbGQKLSMgcHJvY2Vzcy4KLSMKLQotCi0jIENhbGwgU3ViRGlySGRycyBvbiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMuCi0jCi1ydWxlIEFkZFN1YkRpckhkcnMKLXsKLSAgbG9jYWwgeCA7Ci0KLSAgZm9yIHggaW4gJCg8KQotICB7Ci0gICAgU3ViRGlySGRycyAkKHgpIDsKLSAgfQotfQotCi0KLSMgRGV0ZXJtaW5lIHByZWZpeCBvZiBsaWJyYXJ5IGZpbGUuICBXZSBtdXN0IHVzZSAibGlieHh4eHgiIG9uIFVuaXggc3lzdGVtcywKLSMgd2hpbGUgYWxsIG90aGVyIHNpbXBseSB1c2UgdGhlIHJlYWwgbmFtZS4KLSMKLWlmICQoVU5JWCkKLXsKLSAgTElCUFJFRklYID89IGxpYiA7Ci19Ci1lbHNlCi17Ci0gIExJQlBSRUZJWCA/PSAiIiA7Ci19Ci0KLSMgRlQyX1RPUCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIEZyZWVUeXBlIHNvdXJjZSBkaXJlY3RvcnkuICBZb3UgY2FuCi0jIHNldCBpdCB0byBhIHNwZWNpZmljIHZhbHVlIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgYXMgcGFydCBvZiBhCi0jIGxhcmdlciBwcm9qZWN0LgotIwotRlQyX1RPUCA/PSAkKERPVCkgOwotCi0jIERlZmluZSBhIG5ldyBydWxlIHVzZWQgdG8gZGVjbGFyZSBhIHN1YiBkaXJlY3Rvcnkgb2YgdGhlIE5pcnZhbmEgc291cmNlCi0jIHRyZWUuCi0jCi1ydWxlIEZUMl9TdWJEaXIKLXsKLSAgaWYgJChGVDJfVE9QKSA9ICQoRE9UKQotICB7Ci0gICAgcmV0dXJuIFsgRkRpck5hbWUgICQoPCkgXSA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgcmV0dXJuIFsgRkRpck5hbWUgICQoRlQyX1RPUCkgJCg8KSBdIDsKLSAgfQotfQotCi0jIFdlIGFsc28gc2V0IEFMTF9MT0NBVEVfVEFSR0VUIGluIG9yZGVyIHRvIHBsYWNlIGFsbCBvYmplY3QgYW5kIGxpYnJhcnkKLSMgZmlsZXMgaW4gIm9ianMiLgotIwotQUxMX0xPQ0FURV9UQVJHRVQgPz0gWyBGVDJfU3ViRGlyICBvYmpzIF0gOwotCi0KLSMgZW5kIG9mIEphbXJ1bGVzCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQxNDU4Li4wMDAwMDAwCi0tLSBhL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGJ1aWxkIHN5c3RlbSAtLSB0b3AtbGV2ZWwgTWFrZWZpbGUKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgUHJvamVjdCBuYW1lcwotIwotUFJPSkVDVCAgICAgICA6PSBmcmVldHlwZQotUFJPSkVDVF9USVRMRSA6PSBGcmVlVHlwZQotCi0jIFRoZSB2YXJpYWJsZSBUT1BfRElSIGhvbGRzIHRoZSBwYXRoIHRvIHRoZSB0b3Btb3N0IGRpcmVjdG9yeSBpbiB0aGUgcHJvamVjdAotIyBlbmdpbmUgc291cmNlIGhpZXJhcmNoeS4gIElmIGl0IGlzIG5vdCBkZWZpbmVkLCBkZWZhdWx0IGl0IHRvIGAuJy4KLSMKLVRPUF9ESVIgPz0gLgotCi0jIFRoZSB2YXJpYWJsZSBPQkpfRElSIGdpdmVzIHRoZSBsb2NhdGlvbiB3aGVyZSBvYmplY3QgZmlsZXMgYW5kIHRoZQotIyBGcmVlVHlwZSBsaWJyYXJ5IGFyZSBidWlsdC4KLSMKLU9CSl9ESVIgPz0gJChUT1BfRElSKS9vYmpzCi0KLQotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy90b3BsZXZlbC5tawotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjZlOWRjLi4wMDAwMDAwCi0tLSBhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSAgRnJlZVR5cGUgMi44Ci0gID09PT09PT09PT09PQotCi0gIEhvbWVwYWdlOiBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZwotCi0gIEZyZWVUeXBlIGlzIGEgZnJlZWx5IGF2YWlsYWJsZSBzb2Z0d2FyZSBsaWJyYXJ5IHRvIHJlbmRlciBmb250cy4KLQotICBJdCAgaXMgIHdyaXR0ZW4gIGluICBDLCAgZGVzaWduZWQgdG8gIGJlICBzbWFsbCwgIGVmZmljaWVudCwgIGhpZ2hseQotICBjdXN0b21pemFibGUsIGFuZCAgcG9ydGFibGUgd2hpbGUgY2FwYWJsZSBvZiAgcHJvZHVjaW5nIGhpZ2gtcXVhbGl0eQotICBvdXRwdXQgIChnbHlwaCAgaW1hZ2VzKSBvZiAgbW9zdCAgdmVjdG9yICBhbmQgYml0bWFwICBmb250ICBmb3JtYXRzLgotCi0gIFBsZWFzZSAgIHJlYWQgICB0aGUgIGRvY3MvQ0hBTkdFUyAgIGZpbGUsICAgaXQgIGNvbnRhaW5zICAgSU1QT1JUQU5UCi0gIElORk9STUFUSU9OLgotCi0gIFJlYWQgdGhlICBmaWxlcyBgZG9jcy9JTlNUQUxMKicgIGZvciBpbnN0YWxsYXRpb24gIGluc3RydWN0aW9uczsgc2VlCi0gIHRoZSBmaWxlIGBkb2NzL0xJQ0VOU0UuVFhUJyBmb3IgdGhlIGF2YWlsYWJsZSBsaWNlbnNlcy4KLQotICBUaGUgRnJlZVR5cGUgMiBBUEkgcmVmZXJlbmNlIGlzIGxvY2F0ZWQgaW4gYGRvY3MvcmVmZXJlbmNlJzsgdXNlIHRoZQotICBmaWxlICAgYGZ0Mi10b2MuaHRtbCcgICBhcyAgIHRoZSAgIHRvcCAgZW50cnkgICBwb2ludC4gICAgQWRkaXRpb25hbAotICBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhcyBhIHNlcGFyYXRlIHBhY2thZ2UgZnJvbSBvdXIgc2l0ZXMuICBHbwotICB0bwotCi0gICAgaHR0cDovL2Rvd25sb2FkLnNhdmFubmFoLmdudS5vcmcvcmVsZWFzZXMvZnJlZXR5cGUvCi0KLSAgYW5kIGRvd25sb2FkIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZpbGVzLgotCi0gICAgZnJlZXR5cGUtZG9jLTIuOC50YXIuYnoyCi0gICAgZnJlZXR5cGUtZG9jLTIuOC50YXIuZ3oKLSAgICBmdGRvYzI4LnppcAotCi0gIFRvIHZpZXcgdGhlIGRvY3VtZW50YXRpb24gb25saW5lLCBnbyB0bwotCi0gICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvZnJlZXR5cGUyL2RvY3VtZW50YXRpb24uaHRtbAotCi0KLSAgTWFpbGluZyBMaXN0cwotICA9PT09PT09PT09PT09Ci0KLSAgVGhlIHByZWZlcnJlZCB3YXkgIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgRnJlZVR5cGUgIHRlYW0gaXMgdXNpbmcKLSAgZS1tYWlsIGxpc3RzLgotCi0gICAgZ2VuZXJhbCB1c2UgYW5kIGRpc2N1c3Npb246ICAgICAgZnJlZXR5cGVAbm9uZ251Lm9yZwotICAgIGVuZ2luZSBpbnRlcm5hbHMsIHBvcnRpbmcsIGV0Yy46IGZyZWV0eXBlLWRldmVsQG5vbmdudS5vcmcKLSAgICBhbm5vdW5jZW1lbnRzOiAgICAgICAgICAgICAgICAgICBmcmVldHlwZS1hbm5vdW5jZUBub25nbnUub3JnCi0gICAgZ2l0IHJlcG9zaXRvcnkgdHJhY2tlcjogICAgICAgICAgZnJlZXR5cGUtY29tbWl0QG5vbmdudS5vcmcKLQotICBUaGUgbGlzdHMgYXJlIG1vZGVyYXRlZDsgc2VlCi0KLSAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy9jb250YWN0Lmh0bWwKLQotICBob3cgdG8gc3Vic2NyaWJlLgotCi0KLSAgQnVncwotICA9PT09Ci0KLSAgUGxlYXNlIHN1Ym1pdCBidWcgcmVwb3J0cyBhdAotCi0gICAgaHR0cHM6Ly9zYXZhbm5haC5ub25nbnUub3JnL2J1Z3MvP2dyb3VwPWZyZWV0eXBlCi0KLSAgQWx0ZXJuYXRpdmVseSwgICAgeW91ICAgbWlnaHQgICAgcmVwb3J0ICAgIGJ1Z3MgICAgYnkgICBlLW1haWwgICAgdG8KLSAgYGZyZWV0eXBlLWRldmVsQG5vbmdudS5vcmcnLiAgIERvbid0ICBmb3JnZXQgICB0byAgc2VuZCAgYSAgZGV0YWlsZWQKLSAgZXhwbGFuYXRpb24gb2YgdGhlIHByb2JsZW0gLS0gIHRoZXJlIGlzIG5vdGhpbmcgd29yc2UgdGhhbiByZWNlaXZpbmcKLSAgYSB0ZXJzZSBtZXNzYWdlIHRoYXQgb25seSBzYXlzIGBpdCBkb2Vzbid0IHdvcmsnLgotCi0KLSAgRW5qb3khCi0KLQotICAgIFRoZSBGcmVlVHlwZSBUZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDYtMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzICBmaWxlIGlzICBwYXJ0IG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5IG9ubHkgIGJlIHVzZWQsCi1tb2RpZmllZCwgIGFuZCBkaXN0cmlidXRlZCAgdW5kZXIgdGhlICB0ZXJtcyBvZiAgdGhlICBGcmVlVHlwZSBwcm9qZWN0Ci1saWNlbnNlLCAgTElDRU5TRS5UWFQuICBCeSAgY29udGludWluZyB0byAgdXNlLCBtb2RpZnksICBvciBkaXN0cmlidXRlCi10aGlzIGZpbGUgeW91ICBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kCi1hbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLS0tLSBlbmQgb2YgUkVBRE1FIC0tLQpkaWZmIC0tZ2l0IGEvUkVBRE1FLmdpdCBiL1JFQURNRS5naXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Zjc3OGIuLjAwMDAwMDAKLS0tIGEvUkVBRE1FLmdpdAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLVRoZSBnaXQgIGFyY2hpdmUgZG9lc24ndCAgY29udGFpbiBwcmUtYnVpbHQgY29uZmlndXJhdGlvbiAgc2NyaXB0cyBmb3IKLVVOSVhpc2ggcGxhdGZvcm1zLiAgVG8gZ2VuZXJhdGUgdGhlbSBzYXkKLQotICBzaCBhdXRvZ2VuLnNoCi0KLXdoaWNoIGluIHR1cm4gZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgotCi0gIGF1dG9tYWtlICgxLjEwLjEpCi0gIGxpYnRvb2wgKDIuMi40KQotICBhdXRvY29uZiAoMi42MikKLQotVGhlIHZlcnNpb25zIGdpdmVuICBpbiBwYXJlbnRoZXNlcyBhcmUga25vd24gdG8gIHdvcmsuICBOZXdlciB2ZXJzaW9ucwotc2hvdWxkIHdvcmsgdG9vLCBvZiBjb3Vyc2UuICAgTm90ZSB0aGF0IGF1dG9nZW4uc2ggYWxzbyBzZXRzIHVwIHByb3BlcgotZmlsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIGBjb25maWd1cmUnIGFuZCBhdXhpbGlhcnkgc2NyaXB0cy4KLQotVGhlIGF1dG9nZW4uc2ggc2NyaXB0ICBub3cgY2hlY2tzIHRoZSB2ZXJzaW9uIG9mICBhYm92ZSB0aHJlZSBwYWNrYWdlcwotd2hldGhlciB0aGV5IG1hdGNoIHRoZSBudW1iZXJzICBhYm92ZS4gIE90aGVyd2lzZSBpdCB3aWxsIGNvbXBsYWluIGFuZAotc3VnZ2VzdCBlaXRoZXIgdXBncmFkaW5nIG9yIHVzaW5nICBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0bwotYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIHRoZSByZXF1aXJlZCB0b29sKHMpLgotCi1Ob3RlIHRoYXQgIGBhY2xvY2FsJyBpcyBwcm92aWRlZCAgYnkgdGhlIGBhdXRvbWFrZScgcGFja2FnZSAgb24gTGludXgsCi1hbmQgdGhhdCBgbGlidG9vbGl6ZScgaXMgY2FsbGVkIGBnbGlidG9vbGl6ZScgb24gRGFyd2luIChPUyBYKS4KLQotCi1Gb3Igc3RhdGljIGJ1aWxkcyB3aGljaCAgZG9uJ3QgdXNlIHBsYXRmb3JtIHNwZWNpZmljIG9wdGltaXphdGlvbnMsIG5vCi1jb25maWd1cmUgc2NyaXB0IGlzIG5lY2Vzc2FyeSBhdCBhbGw7IHNheWluZwotCi0gIG1ha2Ugc2V0dXAgYW5zaQotICBtYWtlCi0KLXNob3VsZCB3b3JrIG9uIGFsbCBwbGF0Zm9ybXMgd2hpY2ggaGF2ZSBHTlUgbWFrZSAob3IgbWFrZXBwKS4KLQotCi1TaW1pbGFybHksIGEgIGJ1aWxkIHdpdGggIGBjbWFrZScgY2FuICBiZSBkb25lICBkaXJlY3RseSBmcm9tICB0aGUgZ2l0Ci1yZXBvc2l0b3J5LgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDUtMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzICBmaWxlIGlzICBwYXJ0IG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5IG9ubHkgIGJlIHVzZWQsCi1tb2RpZmllZCwgIGFuZCBkaXN0cmlidXRlZCAgdW5kZXIgdGhlICB0ZXJtcyBvZiAgdGhlICBGcmVlVHlwZSBwcm9qZWN0Ci1saWNlbnNlLCAgTElDRU5TRS5UWFQuICBCeSAgY29udGludWluZyB0byAgdXNlLCBtb2RpZnksICBvciBkaXN0cmlidXRlCi10aGlzIGZpbGUgeW91ICBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kCi1hbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLS0tLSBlbmQgb2YgUkVBRE1FLmdpdCAtLS0KZGlmZiAtLWdpdCBhL2F1dG9nZW4uc2ggYi9hdXRvZ2VuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMWMxNTM0Li4wMDAwMDAwCi0tLSBhL2F1dG9nZW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgQ29weXJpZ2h0IDIwMDUtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLXJ1biAoKQotewotICBlY2hvICJydW5uaW5nIFxgJConIgotICBldmFsICQqCi0KLSAgaWYgdGVzdCAkPyAhPSAwIDsgdGhlbgotICAgIGVjaG8gImVycm9yIHdoaWxlIHJ1bm5pbmcgXGAkKiciCi0gICAgZXhpdCAxCi0gIGZpCi19Ci0KLWdldF9tYWpvcl92ZXJzaW9uICgpCi17Ci0gIGVjaG8gJDEgfCBzZWQgLWUgJ3MvXChbMC05XVswLTldKlwpXC4uKi9cMS9nJwotfQotCi1nZXRfbWlub3JfdmVyc2lvbiAoKQotewotICBlY2hvICQxIHwgc2VkIC1lICdzL1swLTldWzAtOV0qXC5cKFswLTldWzAtOV0qXCkuKi9cMS9nJwotfQotCi1nZXRfcGF0Y2hfdmVyc2lvbiAoKQotewotICAjIHRyaWNreTogc29tZSB2ZXJzaW9uIG51bWJlcnMgZG9uJ3QgaW5jbHVkZSBhIHBhdGNoCi0gICMgc2VwYXJhdGVkIHdpdGggYSBwb2ludCwgYnV0IHNvbWV0aGluZyBsaWtlIDEuNC1wNgotICBwYXRjaD1gZWNobyAkMSB8IHNlZCAtZSAncy9bMC05XVswLTldKlwuWzAtOV1bMC05XSpcLlwoWzAtOV1bMC05XSpcKS4qL1wxL2cnYAotICBpZiB0ZXN0ICIkcGF0Y2giID0gIiQxIjsgdGhlbgotICAgIHBhdGNoPWBlY2hvICQxIHwgc2VkIC1lICdzL1swLTldWzAtOV0qXC5bMC05XVswLTldKlwtcFwoWzAtOV1bMC05XSpcKS4qL1wxL2cnYAotICAgICMgaWYgdGhlcmUgaXNuJ3QgYW55IHBhdGNoIG51bWJlciwgZGVmYXVsdCB0byAwCi0gICAgaWYgdGVzdCAiJHBhdGNoIiA9ICIkMSI7IHRoZW4KLSAgICAgIHBhdGNoPTAKLSAgICBmaQotICBmaQotICBlY2hvICRwYXRjaAotfQotCi0jICQxOiB2ZXJzaW9uIHRvIGNoZWNrCi0jICQyOiBtaW5pbXVtIHZlcnNpb24KLQotY29tcGFyZV90b19taW5pbXVtX3ZlcnNpb24gKCkKLXsKLSAgTUFKT1IxPWBnZXRfbWFqb3JfdmVyc2lvbiAkMWAKLSAgTUFKT1IyPWBnZXRfbWFqb3JfdmVyc2lvbiAkMmAKLSAgaWYgdGVzdCAkTUFKT1IxIC1sdCAkTUFKT1IyOyB0aGVuCi0gICAgZWNobyAwCi0gICAgcmV0dXJuCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICRNQUpPUjEgLWd0ICRNQUpPUjI7IHRoZW4KLSAgICAgIGVjaG8gMQotICAgICAgcmV0dXJuCi0gICAgZmkKLSAgZmkKLQotICBNSU5PUjE9YGdldF9taW5vcl92ZXJzaW9uICQxYAotICBNSU5PUjI9YGdldF9taW5vcl92ZXJzaW9uICQyYAotICBpZiB0ZXN0ICRNSU5PUjEgLWx0ICRNSU5PUjI7IHRoZW4KLSAgICBlY2hvIDAKLSAgICByZXR1cm4KLSAgZWxzZQotICAgIGlmIHRlc3QgJE1JTk9SMSAtZ3QgJE1JTk9SMjsgdGhlbgotICAgICAgZWNobyAxCi0gICAgICByZXR1cm4KLSAgICBmaQotICBmaQotCi0gIFBBVENIMT1gZ2V0X3BhdGNoX3ZlcnNpb24gJDFgCi0gIFBBVENIMj1gZ2V0X3BhdGNoX3ZlcnNpb24gJDJgCi0gIGlmIHRlc3QgJFBBVENIMSAtbHQgJFBBVENIMjsgdGhlbgotICAgIGVjaG8gMAotICBlbHNlCi0gICAgZWNobyAxCi0gIGZpCi19Ci0KLSMgY2hlY2sgdGhlIHZlcnNpb24gb2YgYSBnaXZlbiB0b29sIGFnYWluc3QgYSBtaW5pbXVtIHZlcnNpb24gbnVtYmVyCi0jCi0jICQxOiB0b29sIHBhdGgKLSMgJDI6IHRvb2wgdXN1YWwgbmFtZSAoZS5nLiBgYWNsb2NhbCcpCi0jICQzOiB0b29sIHZhcmlhYmxlICAoZS5nLiBgQUNMT0NBTCcpCi0jICQ0OiBtaW5pbXVtIHZlcnNpb24gdG8gY2hlY2sgYWdhaW5zdAotIyAkNTogb3B0aW9uIGZpZWxkIGluZGV4IHVzZWQgdG8gZXh0cmFjdCB0aGUgdG9vbCB2ZXJzaW9uIGZyb20gdGhlCi0jICAgICBvdXRwdXQgb2YgLS12ZXJzaW9uCi0KLWNoZWNrX3Rvb2xfdmVyc2lvbiAoKQotewotICBmaWVsZD0kNQotICAjIGFzc3VtZSB0aGUgb3V0cHV0IG9mICJbVE9PTF0gLS12ZXJzaW9uIiBpcyAidG9vbG5hbWUgKEdOVSB0b29sbmFtZSBmb28gYmFyKSB2ZXJzaW9uIgotICBpZiB0ZXN0ICIkZmllbGQieCA9IHg7IHRoZW4KLSAgICBmaWVsZD0zICAjIGRlZmF1bHQgdG8gMyBmb3IgYWxsIEdOVSBhdXRvdG9vbHMsIGFmdGVyIGZpbHRlcmluZyBlbmNsb3NlZCBzdHJpbmcKLSAgZmkKLSAgdmVyc2lvbj1gJDEgLS12ZXJzaW9uIHwgaGVhZCAtMSB8IHNlZCAncy8oW14pXSopLygpL2cnIHwgY3V0IC1kICcgJyAtZiAkZmllbGRgCi0gIHZlcnNpb25fY2hlY2s9YGNvbXBhcmVfdG9fbWluaW11bV92ZXJzaW9uICR2ZXJzaW9uICQ0YAotICBpZiB0ZXN0ICIkdmVyc2lvbl9jaGVjayJ4ID0gMHg7IHRoZW4KLSAgICBlY2hvICJFUlJPUjogWW91ciB2ZXJzaW9uIG9mIHRoZSBcYCQyJyB0b29sIGlzIHRvbyBvbGQuIgotICAgIGVjaG8gIiAgICAgICBNaW5pbXVtIHZlcnNpb24gJDQgaXMgcmVxdWlyZWQgKHlvdXJzIGlzIHZlcnNpb24gJHZlcnNpb24pLiIKLSAgICBlY2hvICIgICAgICAgUGxlYXNlIHVwZ3JhZGUgb3IgdXNlIHRoZSAkMyB2YXJpYWJsZSB0byBwb2ludCB0byBhIG1vcmUgcmVjZW50IG9uZS4iCi0gICAgZWNobyAiIgotICAgIGV4aXQgMQotICBmaQotfQotCi1pZiB0ZXN0ICEgLWYgLi9idWlsZHMvdW5peC9jb25maWd1cmUucmF3OyB0aGVuCi0gIGVjaG8gIllvdSBtdXN0IGJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBcYGF1dG9nZW4uc2gnLiIKLSAgZWNobyAiQm9vdHN0cmFwcGluZyBkb2Vzbid0IHdvcmsgaWYgc3JjZGlyICE9IGJ1aWxkZGlyLiIKLSAgZXhpdCAxCi1maQotCi0jIE9uIE1hY09TIFgsIHRoZSBHTlUgbGlidG9vbCBpcyBuYW1lZCBgZ2xpYnRvb2wnLgotSE9TVE9TPWB1bmFtZWAKLWlmIHRlc3QgIiRMSUJUT09MSVpFInggIT0geDsgdGhlbgotICA6Ci1lbGlmIHRlc3QgIiRIT1NUT1MieCA9IERhcndpbng7IHRoZW4KLSAgTElCVE9PTElaRT1nbGlidG9vbGl6ZQotZWxzZQotICBMSUJUT09MSVpFPWxpYnRvb2xpemUKLWZpCi0KLWlmIHRlc3QgIiRBQ0xPQ0FMInggPSB4OyB0aGVuCi0gIEFDTE9DQUw9YWNsb2NhbAotZmkKLQotaWYgdGVzdCAiJEFVVE9DT05GInggPSB4OyB0aGVuCi0gIEFVVE9DT05GPWF1dG9jb25mCi1maQotCi1jaGVja190b29sX3ZlcnNpb24gJEFDTE9DQUwgICAgYWNsb2NhbCAgICBBQ0xPQ0FMICAgIDEuMTAuMQotY2hlY2tfdG9vbF92ZXJzaW9uICRMSUJUT09MSVpFIGxpYnRvb2xpemUgTElCVE9PTElaRSAyLjIuNAotY2hlY2tfdG9vbF92ZXJzaW9uICRBVVRPQ09ORiAgIGF1dG9jb25mICAgQVVUT0NPTkYgICAyLjYyCi0KLSMgVGhpcyBzZXRzIGZyZWV0eXBlX21ham9yLCBmcmVldHlwZV9taW5vciwgYW5kIGZyZWV0eXBlX3BhdGNoLgotZXZhbCBgc2VkIC1uZiB2ZXJzaW9uLnNlZCBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmhgCi0KLSMgV2Ugc2V0IGZyZWV0eXBlLXBhdGNoIHRvIGFuIGVtcHR5IHZhbHVlIGlmIGl0IGlzIHplcm8uCi1pZiB0ZXN0ICIkZnJlZXR5cGVfcGF0Y2giID0gIi4wIjsgdGhlbgotICBmcmVldHlwZV9wYXRjaD0KLWZpCi0KLWNkIGJ1aWxkcy91bml4Ci0KLWVjaG8gImdlbmVyYXRpbmcgXGBjb25maWd1cmUuYWMnIgotc2VkIC1lICJzO0BWRVJTSU9OQDskZnJlZXR5cGVfbWFqb3IkZnJlZXR5cGVfbWlub3IkZnJlZXR5cGVfcGF0Y2g7IiBcCi0gIDwgY29uZmlndXJlLnJhdyA+IGNvbmZpZ3VyZS5hYwotCi1ydW4gYWNsb2NhbCAtSSAuIC0tZm9yY2UKLXJ1biAkTElCVE9PTElaRSAtLWZvcmNlIC0tY29weSAtLWluc3RhbGwKLXJ1biBhdXRvY29uZiAtLWZvcmNlCi0KLWNobW9kICt4IGluc3RhbGwtc2gKLQotY2QgLi4vLi4KLQotY2htb2QgK3ggLi9jb25maWd1cmUKLQotIyBFT0YKZGlmZiAtLWdpdCBhL2dseXBodGVzdC9iaXRtYXAuYyBiL2JpdG1hcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBnbHlwaHRlc3QvYml0bWFwLmMKcmVuYW1lIHRvIGJpdG1hcC5jCmRpZmYgLS1naXQgYS9nbHlwaHRlc3QvYml0bWFwLmggYi9iaXRtYXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ2x5cGh0ZXN0L2JpdG1hcC5oCnJlbmFtZSB0byBiaXRtYXAuaApkaWZmIC0tZ2l0IGEvYnVpbGRzL2FtaWdhL1JFQURNRSBiL2J1aWxkcy9hbWlnYS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDQxMTYuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2FtaWdhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0KLVJFQURNRSBmb3IgdGhlIGJ1aWxkcy9hbWlnYSBzdWJkaXJlY3RvcnkuCi0KLUNvcHlyaWdodCAyMDA1LTIwMTcgYnkKLVdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLWFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLUxJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci1pbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotZnVsbHkuCi0KLQotVGhlIG1ha2VmaWxlLm9zNCBpcyBmb3IgdGhlIEFtaWdhT1M0IFNESy4gIFRvIHVzZSBpdCwgdHlwZQotIm1ha2UgLWYgbWFrZWZpbGUub3M0IiwgaXQgcHJvZHVjZXMgYSBsaW5rIGxpYnJhcnkgbGliZnQyX3BwYy5hLgotCi1UaGUgbWFrZWZpbGUgaXMgZm9yIHBwYy1tb3JwaG9zLWdjYy0yLjk1LjMtYmluLnRneiAoZ2NjIDIuOTUuMyBob3N0ZWQgb24KLTY4ay1BbWlnYSBwcm9kdWNpbmcgTW9ycGhPUy1QUEMtYmluYXJpZXMgZnJvbSBodHRwOi8vd3d3Lm1vcnBob3MuZGUpLgotVG8gdXNlIGl0LCB0eXBlICJtYWtlIGFzc2lnbiIsIHRoZW4gIm1ha2UiOyBpdCBwcm9kdWNlcyBhIGxpbmsgbGlicmFyeQotbGliZnQyX3BwYy5hLgotCi1UaGUgc21ha2VmaWxlIGlzIGEgbWFrZWZpbGUgZm9yIEFtaWdhIFNBUy9DIDYuNTggKG5vIGxvbmdlciBhdmFpbGFibGUsCi1sYXRlc3Qgc29sZCB2ZXJzaW9uIHdhcyA2LjUwLCB1cGRhdGVzIGNhbiBiZSBmb3VuZCBpbiBBbWluZXQpLiAgSXQgaXMKLWJhc2VkIG9uIHRoZSB2ZXJzaW9uIGZvdW5kIGluIHRoZSBzb3VyY2Vjb2RlIG9mIHR0Zi5saWJyYXJ5IDAuODNiIGZvcgotRnJlZVR5cGUgMS4zLjEgZnJvbSBSaWNoYXJkIEdyaWZmaXRoIChyYWdyaWZmaUBzcHJ5bmV0LmNvbSwKLWh0dHA6Ly9yYWdyaWZmaS5ob21lLnNwcnluZXQuY29tKS4KLQotWW91IHdpbGwgYWxzbyBuZWVkIHRoZSBsYXRlc3QgaW5jbHVkZSBmaWxlcyBhbmQgYW1pZ2EubGliIGZyb20gdGhlCi1BbWlnYSB3ZWIgc2l0ZSAoaHR0cDovL3d3dy5hbWlnYS5jb20vMy45L2Rvd25sb2FkL05ESzMuOS5saGEpIGZvcgotQW1pZ2FPUyAzLjk7IHRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgd29yayB1bmRlciBBbWlnYU9TIDIuMDQgYW5kIHVwLgotCi1UbyB1c2UgaXQsIGNhbGwgInNtYWtlIGFzc2lnbiIgYW5kIHRoZW4gInNtYWtlIiBmcm9tIHRoZSBidWlsZHMvYW1pZ2EKLWRpcmVjdG9yeS4gIFRoZSByZXN1bHRzIGFyZToKLQotLSBBIGxpbmsgbGlicmFyeSAiZnQyXzY4MHgwLmxpYiIgKHdoZXJlIHggZGVwZW5kcyBvbiB0aGUgc2V0dGluZyBvZgotICB0aGUgQ1BVIGVudHJ5IGluIHRoZSBzbWFrZWZpbGUpIGNvbnRhaW5pbmcgYWxsIEZyZWVUeXBlMiBwYXJ0cwotICBleGNlcHQgb2YgdGhlIGluaXQgY29kZSwgZGVidWdnaW5nIGNvZGUsIGFuZCB0aGUgc3lzdGVtIGludGVyZmFjZQotICBjb2RlLgotCi0tIGZ0c3lzdGVtLm8sIGFuIG9iamVjdCBtb2R1bGUgY29udGFpbmluZyB0aGUgc3RhbmRhcmQgdmVyc2lvbiBvZiB0aGUKLSAgc3lzdGVtIGludGVyZmFjZSBjb2RlIHdoaWNoIHVzZXMgZm9wZW4oKSBmY2xvc2UoKSBmcmVhZCgpIGZzZWVrKCkKLSAgZnRlbGwoKSBtYWxsb2MoKSByZWFsbG9jKCkgYW5kIGZyZWUoKSBmcm9tIGxpYjpzYy5saWIgKG5vdCBwdXJlKS4KLQotLSBmdHN5c3RlbXB1cmUubywgYW4gb2JqZWN0IG1vZHVsZSBjb250YWluaW5nIHRoZSBwdXJlIHZlcnNpb24gb2YgdGhlCi0gIHN5c3RlbSBpbnRlcmZhY2UgY29kZSB3aGljaCB1c2VzIE9wZW4oKSBDbG9zZSgpIFJlYWQoKSBTZWVrKCkKLSAgRXhhbWluZUZIKCkgQXNtQWxsb2NQb29sZWQoKSBBc21GcmVlUG9vbGVkKCkgZXRjLiAgVGhpcyB2ZXJzaW9uIGNhbgotICBiZSB1c2VkIGluIGJvdGggbm9ybWFsIHByb2dyYW1zIGFuZCBpbiBBbWlnYSBydW4tdGltZSBzaGFyZWQgc3lzdGVtCi0gIGxpYnJhcnlzIChjYW4gYmUgbGlua2VkIHdpdGggbGliOmxpYmluaXQubywgbm8gY29weWluZyBvZiBEQVRBIGFuZAotICBCU1MgaHVua3MgZm9yIGVhY2ggT3BlbkxpYnJhcnkoKSBuZWNlc3NhcnkpLiAgU291cmNlIGNvZGUgaXMgaW4KLSAgc3JjL2Jhc2UvZnRzeXN0ZW0uYy4KLQotLSBmdGRlYnVnLm8sIGFuIG9iamVjdCBtb2R1bGUgY29udGFpbmluZyB0aGUgc3RhbmRhcmQgdmVyc2lvbiBvZiB0aGUKLSAgZGVidWdnaW5nIGNvZGUgd2hpY2ggdXNlcyB2cHJpbnRmKCkgYW5kIGV4aXQoKSAobm90IHB1cmUpLgotICBEZWJ1Z2dpbmcgY2FuIGJlIHR1cm5lZCBvbiBpbiBGVDppbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0gIGFuZCB3aXRoIEZUX1NldFRyYWNlTGV2ZWwoKS4KLQotLSBmdGRlYnVncHVyZS5vLCBhbiBvYmplY3QgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIHB1cmUgdmVyc2lvbiBvZiB0aGUKLSAgZGVidWdnaW5nIGNvZGUgd2hpY2ggdXNlcyBLVlByaW50ZigpIGZyb20gbGliOmRlYnVnLmxpYiBhbmQgbm8KLSAgZXhpdCgpLiAgRm9yIGRlYnVnZ2luZyBvZiBBbWlnYSBydW4tdGltZSBzaGFyZWQgc3lzdGVtIGxpYnJhcmllcy4KLSAgU291cmNlIGNvZGUgaXMgaW4gc3JjL2Jhc2UvZnRkZWJ1Zy5jLgotCi0tIE5PIGZ0aW5pdC5vLiAgQmVjYXVzZSBsaW5raW5nIHdpdGggYSBsaW5rIGxpYnJhcnkgc2hvdWxkIHJlc3VsdCBpbgotICBsaW5raW5nIG9ubHkgdGhlIG5lZWRlZCBvYmplY3QgbW9kdWxlcyBpbiBpdCwgYnV0IHN0YW5kYXJkCi0gIGZ0c3lzdGVtLm8gd291bGQgZm9yY2UgQUxMIEZyZWVUeXBlMiBtb2R1bGVzIHRvIGJlIGxpbmtlZCB0byB5b3VyCi0gIHByb2dyYW0sIEkgZGVjaWRlZCB0byB1c2UgYSBkaWZmZXJlbnQgc2NoZW1lOiBZb3UgbXVzdCAjaW5jbHVkZQotICBGVDpzcmMvYmFzZS9mdGluaXQuYyBpbiB5b3VyIHNvdXJjZWNvZGUgYW5kIHNwZWNpZnkgd2l0aCAjZGVmaW5lCi0gIHN0YXRlbWVudHMgd2hpY2ggbW9kdWxlcyB5b3UgbmVlZC4gIFNlZQotICBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oLgotCi0KLVRvIHVzZSBpbiB5b3VyIG93biBwcm9ncmFtczoKLQotLSBJbnNlcnQgdGhlICNkZWZpbmUgYW5kICNpbmNsdWRlIHN0YXRlbWVudHMgZnJvbSB0b3Agb2YKLSAgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCBpbiB5b3VyIHNvdXJjZSBjb2RlIGFuZAotICB1bmNvbW1lbnQgdGhlICNkZWZpbmUgc3RhdGVtZW50cyBmb3IgdGhlIEZyZWVUeXBlMiBtb2R1bGVzIHlvdSBuZWVkLgotCi0tIFlvdSBjYW4gdXNlIGVpdGhlciBQQVJBTUVURVJTPVJFR0lTVEVSIG9yIFBBUkFNRVRFUlM9U1RBQ0sgZm9yCi0gIGNhbGxpbmcgdGhlIEZyZWVUeXBlMiBmdW5jdGlvbnMsIGJlY2F1c2UgdGhlIGxpbmsgbGlicmFyeSBhbmQgdGhlCi0gIG9iamVjdCBmaWxlcyBhcmUgY29tcGlsZWQgd2l0aCBQQVJBTUVURVJTPUJPVEguCi0KLS0gInNtYWtlIGFzc2lnbiIgKGFzc2lnbiAiRlQ6IiB0byB0aGUgRnJlZVR5cGUyIG1haW4gZGlyZWN0b3J5KS4KLQotLSBDb21waWxlIHlvdXIgcHJvZ3JhbS4KLQotLSBMaW5rIHdpdGggZWl0aGVyIGZ0c3lzdGVtLm8gb3IgZnRzeXN0ZW1wdXJlLm8sIGlmIGRlYnVnZ2luZyBlbmFibGVkCi0gIHdpdGggZWl0aGVyIGZ0ZGVidWcubyBvciAoZnRkZWJ1Z3B1cmUubyBhbmQgbGliOmRlYnVnLmxpYiksIGFuZCB3aXRoCi0gIGZ0Ml82ODB4MC5saWIgYXMgbGluayBsaWJyYXJ5LgotCi0KLVRvIGFkYXB0IHRvIG90aGVyIGNvbXBpbGVyczoKLQotLSBUaGUgc3RhbmRhcmQgQU5TSSBDIG1heGltdW0gbGVuZ3RoIG9mIDMxIHNpZ25pZmljYW50IGNoYXJhY3RlcnMgaW4KLSAgaWRlbnRpZmllcnMgaXMgbm90IGVub3VnaCBmb3IgRnJlZVR5cGUyLiAgQ2hlY2sgaWYgeW91ciBjb21waWxlciBoYXMKLSAgYSBtaW5pbXVtIGxlbmd0aCBvZiA0MCBzaWduaWZpY2FudCBjaGFyYWN0ZXJzIG9yIGNhbiBiZSBzd2l0Y2hlZCB0bwotICBpdC4gICJpZGxlbj00MCIgaXMgdGhlIG9wdGlvbiBmb3IgU0FTL0MuICBTZXR0aW5nICNkZWZpbmUKLSAgSEFWRV9MSU1JVF9PTl9JREVOVFMgaW4gYW4gaW5jbHVkZSBmaWxlIG1heSBhbHNvIHdvcmsgKG5vdCB0ZXN0ZWQpLgotCi0tIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbmNsdWRlIGRpcmVjdG9yeSBpbiBidWlsZHMvYW1pZ2EgaXMgc2VhcmNoZWQKLSAgYmVmb3JlIHRoZSBub3JtYWwgRnJlZVR5cGUyIGluY2x1ZGUgZGlyZWN0b3J5LCBzbyB5b3UgYXJlIGFibGUgdG8KLSAgcmVwbGFjZSBwcm9ibGVtYXRpYyBpbmNsdWRlIGZpbGVzIHdpdGggeW91ciBvd24gdmVyc2lvbiAoc2FtZSBtYXkgYmUKLSAgdXNlZnVsIGZvciB0aGUgc3JjIGRpcmVjdG9yeSkuCi0KLS0gQW4gZXhhbXBsZSBvZiBob3cgdG8gcmVwbGFjZS93b3JrYXJvdW5kIGEgcHJvYmxlbWF0aWMgaW5jbHVkZSBmaWxlCi0gIGlzIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg7IGl0IGNoYW5nZXMgYSAjZGVmaW5lIHRoYXQKLSAgd291bGQgcHJldmVudCBTQVMvQyBmcm9tIGdlbmVyYXRpbmcgWERFRidzIHdoZXJlIGl0IHNob3VsZCBkbyB0aGF0IGFuZAotICB0aGVuIGluY2x1ZGVzIHRoZSBzdGFuZGFyZCBGcmVlVHlwZTIgaW5jbHVkZSBmaWxlLgotCi1Mb2NhbCBWYXJpYWJsZXM6Ci1jb2Rpbmc6IGxhdGluLTEKLUVuZDoKZGlmZiAtLWdpdCBhL2J1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdGNvbmZpZy5oIGIvYnVpbGRzL2FtaWdhL2luY2x1ZGUvY29uZmlnL2Z0Y29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzQ4NDEuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2FtaWdhL2luY2x1ZGUvY29uZmlnL2Z0Y29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQW1pZ2Etc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhpcyBpcyBhbiBleGFtcGxlIGhvdyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBGcmVlVHlwZTIgaGVhZGVyIGZpbGVzCi0gKiB3aXRoIEFtaWdhLXNwZWNpZmljIGNoYW5nZXMuIFdoZW4gdGhlIGNvbXBpbGVyIHNlYXJjaGVzIHRoaXMgZGlyZWN0b3J5Ci0gKiBiZWZvcmUgdGhlIGRlZmF1bHQgZGlyZWN0b3J5LCB3ZSBjYW4gZG8gc29tZSBtb2RpZmljYXRpb25zLgotICoKLSAqIEhlcmUgd2UgbXVzdCBjaGFuZ2UgRlRfRVhQT1JUX0RFRiBzbyB0aGF0IFNBUy9DIGRvZXMKLSAqIGdlbmVyYXRlIHRoZSBuZWVkZWQgWERFRnMuCi0gKi8KLQotI2lmIDAKLSNkZWZpbmUgRlRfRVhQT1JUX0RFRiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jdW5kZWYgRlRfRVhQT1JUX0RFRgotI2RlZmluZSBGVF9FWFBPUlRfREVGKCB4ICkgIHgKLQotLyogTm93IGluY2x1ZGUgdGhlIG9yaWdpbmFsIGZpbGUgKi8KLSNpZm5kZWYgX19NT1JQSE9TX18KLSNpZmRlZiBfX1NBU0MKLSNpbmNsdWRlICJGVDppbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIgotI2Vsc2UKLSNpbmNsdWRlICIvRlQvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCIKLSNlbmRpZgotI2Vsc2UKLS8qIFdlIG11c3QgZGVmaW5lIHRoYXQsIGl0IHNlZW1zIHRoYXQKLSAqIGxpYi9nY2MtbGliL3BwYy1tb3JwaG9zLzIuOTUuMy9pbmNsdWRlL3N5c2xpbWl0cy5oIGlzIG1pc3NpbmcgaW4KLSAqIHBwYy1tb3JwaG9zLWdjYy0yLjk1LjMtYmluLnRneiAoZ2NjIGZvciA2OGsgcHJvZHVjaW5nIE1vcnBoT1MgUFBDIGVsZgotICogYmluYXJpZXMgZnJvbSBodHRwOi8vd3d3Lm1vcnBob3MuZGUpCi0gKi8KLSNkZWZpbmUgX0xJQkNfTElNSVRTX0hfCi0jaW5jbHVkZSAiL0ZUL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgiCi0jZW5kaWYKLQotLyoKLUxvY2FsIFZhcmlhYmxlczoKLWNvZGluZzogbGF0aW4tMQotRW5kOgotKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdG1vZHVsZS5oIGIvYnVpbGRzL2FtaWdhL2luY2x1ZGUvY29uZmlnL2Z0bW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZWE0YzkuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2FtaWdhL2luY2x1ZGUvY29uZmlnL2Z0bW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtb2R1bGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFtaWdhLXNwZWNpZmljIEZyZWVUeXBlIG1vZHVsZSBzZWxlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXZXJuZXIgTGVtYmVyZyBhbmQgRGV0bGVmIFf8cmtuZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRvIGF2b2lkIHRoYXQgYWxsIHlvdXIgcHJvZ3JhbXMgaW5jbHVkZSBhbGwgRnJlZVR5cGUgbW9kdWxlcywKLSAqIHlvdSBjb3B5IHRoZSBmb2xsb3dpbmcgcGllY2Ugb2Ygc291cmNlIGNvZGUgaW50byB5b3VyIG93bgotICogc291cmNlIGZpbGUgYW5kIHNwZWNpZnkgd2hpY2ggbW9kdWxlcyB5b3UgcmVhbGx5IG5lZWQgaW4geW91cgotICogYXBwbGljYXRpb24gYnkgdW5jb21tZW50aW5nIHRoZSBhcHByb3ByaWF0ZSBsaW5lcy4KLSAqLwotLyoKLS8vI2RlZmluZSBGVF9VU0VfQVVUT0ZJVCAvLyBhdXRvZml0dGVyCi0vLyNkZWZpbmUgRlRfVVNFX1JBU1RFUiAgLy8gbW9ub2Nocm9tZSByYXN0ZXJpemVyCi0vLyNkZWZpbmUgRlRfVVNFX1NNT09USCAgLy8gYW50aS1hbGlhc2luZyByYXN0ZXJpemVyCi0vLyNkZWZpbmUgRlRfVVNFX1RUICAgICAgLy8gdHJ1ZXR5cGUgZm9udCBkcml2ZXIKLS8vI2RlZmluZSBGVF9VU0VfVDEgICAgICAvLyB0eXBlMSBmb250IGRyaXZlcgotLy8jZGVmaW5lIEZUX1VTRV9UNDIgICAgIC8vIHR5cGU0MiBmb250IGRyaXZlcgotLy8jZGVmaW5lIEZUX1VTRV9UMUNJRCAgIC8vIGNpZC1rZXllZCB0eXBlMSBmb250IGRyaXZlciAgLy8gbm8gY21hcCBzdXBwb3J0Ci0vLyNkZWZpbmUgRlRfVVNFX0NGRiAgICAgLy8gb3BlbnR5cGUgZm9udCBkcml2ZXIKLS8vI2RlZmluZSBGVF9VU0VfQkRGICAgICAvLyBiZGYgYml0bWFwIGZvbnQgZHJpdmVyCi0vLyNkZWZpbmUgRlRfVVNFX1BDRiAgICAgLy8gcGNmIGJpdG1hcCBmb250IGRyaXZlcgotLy8jZGVmaW5lIEZUX1VTRV9QRlIgICAgIC8vIHBmciBmb250IGRyaXZlcgotLy8jZGVmaW5lIEZUX1VTRV9XSU5GTlQgIC8vIHdpbmRvd3MgLmZudHwuZm9uIGJpdG1hcCBmb250IGRyaXZlcgotLy8jZGVmaW5lIEZUX1VTRV9PVFYgICAgIC8vIG9wZW50eXBlIHZhbGlkYXRvcgotLy8jZGVmaW5lIEZUX1VTRV9HWFYgICAgIC8vIHRydWV0eXBlIGd4IHZhbGlkYXRvcgotI2luY2x1ZGUgIkZUOnNyYy9iYXNlL2Z0aW5pdC5jIgotKi8KLQotLyogTWFrZSBzdXJlIHRoYXQgdGhlIG5lZWRlZCBzdXBwb3J0IG1vZHVsZXMgYXJlIGJ1aWx0IGluLgotICogRGVwZW5kZW5jaWVzIGNhbiBiZSBmb3VuZCBieSBzZWFyY2hpbmcgZm9yIEZUX0dldF9Nb2R1bGUuCi0gKi8KLQotI2lmZGVmIEZUX1VTRV9UNDIKLSNkZWZpbmUgRlRfVVNFX1RUCi0jZW5kaWYKLQotI2lmZGVmIEZUX1VTRV9UVAotI2RlZmluZSBGVF9VU0VfU0ZOVAotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfQ0ZGCi0jZGVmaW5lIEZUX1VTRV9TRk5UCi0jZGVmaW5lIEZUX1VTRV9QU0hJTlQKLSNkZWZpbmUgRlRfVVNFX1BTTkFNRVMKLSNlbmRpZgotCi0jaWZkZWYgRlRfVVNFX1QxCi0jZGVmaW5lIEZUX1VTRV9QU0FVWAotI2RlZmluZSBGVF9VU0VfUFNISU5UCi0jZGVmaW5lIEZUX1VTRV9QU05BTUVTCi0jZW5kaWYKLQotI2lmZGVmIEZUX1VTRV9UMUNJRAotI2RlZmluZSBGVF9VU0VfUFNBVVgKLSNkZWZpbmUgRlRfVVNFX1BTSElOVAotI2RlZmluZSBGVF9VU0VfUFNOQU1FUwotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfUFNBVVgKLSNkZWZpbmUgRlRfVVNFX1BTTkFNRVMKLSNlbmRpZgotCi0jaWZkZWYgRlRfVVNFX1NGTlQKLSNkZWZpbmUgRlRfVVNFX1BTTkFNRVMKLSNlbmRpZgotCi0vKiBOb3cgaW5jbHVkZSB0aGUgbW9kdWxlcyAqLwotCi0jaWZkZWYgRlRfVVNFX0FVVE9GSVQKLUZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgYXV0b2ZpdF9tb2R1bGVfY2xhc3MgKQotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfVFQKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgdHRfZHJpdmVyX2NsYXNzICkKLSNlbmRpZgotCi0jaWZkZWYgRlRfVVNFX1QxCi1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHQxX2RyaXZlcl9jbGFzcyApCi0jZW5kaWYKLQotI2lmZGVmIEZUX1VTRV9DRkYKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgY2ZmX2RyaXZlcl9jbGFzcyApCi0jZW5kaWYKLQotI2lmZGVmIEZUX1VTRV9UMUNJRAotRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0MWNpZF9kcml2ZXJfY2xhc3MgKQotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfUEZSCi1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHBmcl9kcml2ZXJfY2xhc3MgKQotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfVDQyCi1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHQ0Ml9kcml2ZXJfY2xhc3MgKQotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfV0lORk5UCi1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHdpbmZudF9kcml2ZXJfY2xhc3MgKQotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfUENGCi1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHBjZl9kcml2ZXJfY2xhc3MgKQotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfUFNBVVgKLUZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNhdXhfbW9kdWxlX2NsYXNzICkKLSNlbmRpZgotCi0jaWZkZWYgRlRfVVNFX1BTTkFNRVMKLUZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNuYW1lc19tb2R1bGVfY2xhc3MgKQotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfUFNISU5UCi1GVF9VU0VfTU9EVUxFKCBGVF9Nb2R1bGVfQ2xhc3MsIHBzaGludGVyX21vZHVsZV9jbGFzcyApCi0jZW5kaWYKLQotI2lmZGVmIEZUX1VTRV9SQVNURVIKLUZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzICkKLSNlbmRpZgotCi0jaWZkZWYgRlRfVVNFX1NGTlQKLUZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgc2ZudF9tb2R1bGVfY2xhc3MgKQotI2VuZGlmCi0KLSNpZmRlZiBGVF9VU0VfU01PT1RICi1GVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzcyApCi0jZW5kaWYKLQotI2lmZGVmIEZUX1VTRV9PVFYKLUZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgb3R2X21vZHVsZV9jbGFzcyApCi0jZW5kaWYKLQotI2lmZGVmIEZUX1VTRV9CREYKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgYmRmX2RyaXZlcl9jbGFzcyApCi0jZW5kaWYKLQotI2lmZGVmIEZUX1VTRV9HWFYKLUZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgZ3h2X21vZHVsZV9jbGFzcyApCi0jZW5kaWYKLQotLyoKLUxvY2FsIFZhcmlhYmxlczoKLWNvZGluZzogbGF0aW4tMQotRW5kOgotKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy9hbWlnYS9tYWtlZmlsZSBiL2J1aWxkcy9hbWlnYS9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2N2Y5YS4uMDAwMDAwMAotLS0gYS9idWlsZHMvYW1pZ2EvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgRnJlZVR5cGUyIGxpbmsgbGlicmFyeSB1c2luZyBwcGMtbW9ycGhvcy1nY2MtMi45NS4zLWJpbi50Z3oKLSMgKGdjYyAyLjk1LjMgaG9zdGVkIG9uIDY4ay1BbWlnYSBwcm9kdWNpbmcgTW9ycGhPUy1QUEMtYmluYXJpZXMgZnJvbQotIyBodHRwOi8vd3d3Lm1vcnBob3MuZGUpCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5Ci0jIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jCi0jIHRvIGJ1aWxkIGZyb20gdGhlIGJ1aWxkcy9hbWlnYSBkaXJlY3RvcnkgY2FsbAotIwotIyAgbWFrZSBhc3NpZ24KLSMgIG1ha2UKLSMKLSMgWW91ciBwcm9ncmFtcyBzb3VyY2UgY29kZSBzaG91bGQgc3RhcnQgd2l0aCB0aGlzCi0jICh1bmNvbW1lbnQgdGhlIHBhcnRzIHlvdSBkbyBub3QgbmVlZCB0byBrZWVwIHRoZSBwcm9ncmFtIHNtYWxsKToKLSMgLS0tODwtLS0KLSNkZWZpbmUgRlRfVVNFX0FVVE9GSVQgLy8gYXV0b2ZpdHRlcgotI2RlZmluZSBGVF9VU0VfUkFTVEVSICAvLyBtb25vY2hyb21lIHJhc3Rlcml6ZXIKLSNkZWZpbmUgRlRfVVNFX1NNT09USCAgLy8gYW50aS1hbGlhc2luZyByYXN0ZXJpemVyCi0jZGVmaW5lIEZUX1VTRV9UVCAgICAgIC8vIHRydWV0eXBlIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9UMSAgICAgIC8vIHR5cGUxIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9UNDIgICAgIC8vIHR5cGU0MiBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfVDFDSUQgICAvLyBjaWQta2V5ZWQgdHlwZTEgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX0NGRiAgICAgLy8gb3BlbnR5cGUgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX0JERiAgICAgLy8gYmRmIGJpdG1hcCBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfUENGICAgICAvLyBwY2YgYml0bWFwIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9QRlIgICAgIC8vIHBmciBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfV0lORk5UICAvLyB3aW5kb3dzIC5mbnR8LmZvbiBiaXRtYXAgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX09UViAgICAgLy8gb3BlbnR5cGUgdmFsaWRhdG9yCi0jZGVmaW5lIEZUX1VTRV9HWFYgICAgIC8vIHRydWV0eXBlIGd4IHZhbGlkYXRvcgotI2luY2x1ZGUgIkZUOnNyYy9iYXNlL2Z0aW5pdC5jIgotIyAtLS04PC0tLQotIwotIyBsaW5rIHlvdXIgcHJvZ3JhbXMgd2l0aCBsaWJmdDJfcHBjLmEgYW5kIGVpdGhlciBmdHN5c3RlbS5wcGMubyBvciBmdHN5c3RlbXB1cmUucHBjLm8KLSMgKGFuZCBlaXRoZXIgZnRkZWJ1Zy5wcGMubyBvciBmdGRlYnVncHVyZS5wcGMubyBpZiB5b3UgZW5hYmxlZCBGVF9ERUJVR19MRVZFTF9FUlJPUiBvcgotIyBGVF9ERUJVR19MRVZFTF9UUkFDRSBpbiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oKS4KLQotYWxsOglsaWJmdDJfcHBjLmEgZnRzeXN0ZW0ucHBjLm8gZnRzeXN0ZW1wdXJlLnBwYy5vCi0KLWFzc2lnbjoKLQlhc3NpZ24gRlQ6IC8vCi0KLUZUU1JDID0gL0ZUL3NyYwotCi1DQyA9ICAgICBwcGMtbW9ycGhvcy1nY2MKLUFSID0gICAgIHBwYy1tb3JwaG9zLWFyIHJjCi1SQU5MSUIgPSBwcGMtbW9ycGhvcy1yYW5saWIKLUxEID0gICAgIHBwYy1tb3JwaG9zLWxkCi1DRkxBR1MgPSAtREZUMl9CVUlMRF9MSUJSQVJZIC1PMiAtSS9lbXUvZW11bGluY2x1ZGUvaW5jbHVkZWdjYyAtSS9lbXUvaW5jbHVkZSAtSWluY2x1ZGUgLUkkKEZUU1JDKSAtSS9GVC9pbmNsdWRlCi0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgYmFzZQotIwotZnRiYXNlLnBwYy5vOiAkKEZUU1JDKS9iYXNlL2Z0YmFzZS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0aW5pdC5wcGMubzogJChGVFNSQykvYmFzZS9mdGluaXQuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1mdHN5c3RlbS5wcGMubzogJChGVFNSQykvYmFzZS9mdHN5c3RlbS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMgcHVyZSB2ZXJzaW9uIGZvciB1c2UgaW4gcnVuLXRpbWUgbGlicmFyeSBldGMKLWZ0c3lzdGVtcHVyZS5wcGMubzogc3JjL2Jhc2UvZnRzeXN0ZW0uYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1mdGRlYnVnLnBwYy5vOiAkKEZUU1JDKS9iYXNlL2Z0ZGVidWcuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0jIHB1cmUgdmVyc2lvbiBmb3IgdXNlIGluIHJ1bi10aW1lIGxpYnJhcnkgZXRjCi1mdGRlYnVncHVyZS5wcGMubzogc3JjL2Jhc2UvZnRkZWJ1Zy5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgYmFzZSBleHRlbnNpb25zCi0jCi1mdGJib3gucHBjLm86ICQoRlRTUkMpL2Jhc2UvZnRiYm94LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotZnRiZGYucHBjLm86ICQoRlRTUkMpL2Jhc2UvZnRiZGYuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1mdGJpdG1hcC5wcGMubzogJChGVFNSQykvYmFzZS9mdGJpdG1hcC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0Y2lkLnBwYy5vOiAkKEZUU1JDKS9iYXNlL2Z0Y2lkLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotZnRmbnRmbXQucHBjLm86ICQoRlRTUkMpL2Jhc2UvZnRmbnRmbXQuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1mdGZzdHlwZS5wcGMubzogJChGVFNSQykvYmFzZS9mdGZzdHlwZS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0Z2FzcC5wcGMubzogJChGVFNSQykvYmFzZS9mdGdhc3AuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1mdGdseXBoLnBwYy5vOiAkKEZUU1JDKS9iYXNlL2Z0Z2x5cGguYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1mdGd4dmFsLnBwYy5vOiAkKEZUU1JDKS9iYXNlL2Z0Z3h2YWwuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1mdGxjZGZpbC5wcGMubzogJChGVFNSQykvYmFzZS9mdGxjZGZpbC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0bW0ucHBjLm86ICQoRlRTUkMpL2Jhc2UvZnRtbS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0b3R2YWwucHBjLm86ICQoRlRTUkMpL2Jhc2UvZnRvdHZhbC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0cGF0ZW50LnBwYy5vOiAkKEZUU1JDKS9iYXNlL2Z0cGF0ZW50LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotZnRwZnIucHBjLm86ICQoRlRTUkMpL2Jhc2UvZnRwZnIuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1mdHN0cm9rZS5wcGMubzogJChGVFNSQykvYmFzZS9mdHN0cm9rZS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0c3ludGgucHBjLm86ICQoRlRTUkMpL2Jhc2UvZnRzeW50aC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0dHlwZTEucHBjLm86ICQoRlRTUkMpL2Jhc2UvZnR0eXBlMS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWZ0d2luZm50LnBwYy5vOiAkKEZUU1JDKS9iYXNlL2Z0d2luZm50LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBhdXRvZml0dGluZyBtb2R1bGUKLSMKLWF1dG9maXQucHBjLm86ICQoRlRTUkMpL2F1dG9maXQvYXV0b2ZpdC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgcG9zdHNjcmlwdCBoaW50aW5nIG1vZHVsZQotIwotcHNoaW50ZXIucHBjLm86ICQoRlRTUkMpL3BzaGludGVyL3BzaGludGVyLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBQUyBzdXBwb3J0IG1vZHVsZQotIwotcHNhdXgucHBjLm86ICQoRlRTUkMpL3BzYXV4L3BzYXV4LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBQUyBnbHlwaCBuYW1lcyBtb2R1bGUKLSMKLXBzbmFtZXMucHBjLm86ICQoRlRTUkMpL3BzbmFtZXMvcHNuYW1lcy5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgbW9ub2Nocm9tZSByYXN0ZXIgbW9kdWxlCi0jCi1yYXN0ZXIucHBjLm86ICQoRlRTUkMpL3Jhc3Rlci9yYXN0ZXIuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IGFudGktYWxpYXNpbmcgcmFzdGVyIG1vZHVsZQotIwotc21vb3RoLnBwYy5vOiAkKEZUU1JDKS9zbW9vdGgvc21vb3RoLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSAnc2ZudCcgbW9kdWxlCi0jCi1zZm50LnBwYy5vOiAkKEZUU1JDKS9zZm50L3NmbnQuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IGdseXBoIGFuZCBpbWFnZSBjYWNoaW5nIHN5c3RlbQotIwotZnRjYWNoZS5wcGMubzogJChGVFNSQykvY2FjaGUvZnRjYWNoZS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgT3BlblR5cGUgZm9udCBkcml2ZXIKLSMKLWNmZi5wcGMubzogJChGVFNSQykvY2ZmL2NmZi5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgVHJ1ZVR5cGUgZm9udCBkcml2ZXIKLSMKLXRydWV0eXBlLnBwYy5vOiAkKEZUU1JDKS90cnVldHlwZS90cnVldHlwZS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgVHlwZTEgZm9udCBkcml2ZXIKLSMKLXR5cGUxLnBwYy5vOiAkKEZUU1JDKS90eXBlMS90eXBlMS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgVHlwZTQyIGZvbnQgZHJpdmVyCi0jCi10eXBlNDIucHBjLm86ICQoRlRTUkMpL3R5cGU0Mi90eXBlNDIuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IENJRC1rZXllZCBUeXBlMSBmb250IGRyaXZlcgotIwotdHlwZTFjaWQucHBjLm86ICQoRlRTUkMpL2NpZC90eXBlMWNpZC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgQkRGIGJpdG1hcCBmb250IGRyaXZlcgotIwotYmRmLnBwYy5vOiAkKEZUU1JDKS9iZGYvYmRmLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBQQ0YgYml0bWFwIGZvbnQgZHJpdmVyCi0jCi1wY2YucHBjLm86ICQoRlRTUkMpL3BjZi9wY2YuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IGd6aXAgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBQQ0YgYml0bWFwIGZvbnRzCi0jCi1nemlwLnBwYy5vOiAkKEZUU1JDKS9nemlwL2Z0Z3ppcC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMgRnJlZVR5cGUyIGxpYnJhcnkgYnppcDIgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBQQ0YgYml0bWFwIGZvbnRzCi0jCi1iemlwMi5wcGMubzogJChGVFNSQykvYnppcDIvZnRiemlwMi5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgY29tcHJlc3Mgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBQQ0YgYml0bWFwIGZvbnRzCi0jCi1sencucHBjLm86ICQoRlRTUkMpL2x6dy9mdGx6dy5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgUEZSIGZvbnQgZHJpdmVyCi0jCi1wZnIucHBjLm86ICQoRlRTUkMpL3Bmci9wZnIuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IFdpbmRvd3MgRk5UL0ZPTiBiaXRtYXAgZm9udCBkcml2ZXIKLSMKLXdpbmZudC5wcGMubzogJChGVFNSQykvd2luZm9udHMvd2luZm50LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBUcnVlVHlwZUdYIFZhbGlkYXRvcgotIwotZ3h2YWxpZC5wcGMubzogJChGVFNSQykvZ3h2YWxpZC9neHZhbGlkLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBPcGVuVHlwZSB2YWxpZGF0b3IKLSMKLW90dmFsaWQucHBjLm86ICQoRlRTUkMpL290dmFsaWQvb3R2YWxpZC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLUJBU0VQUEMgPSBmdGJhc2UucHBjLm8gZnRiYm94LnBwYy5vIGZ0YmRmLnBwYy5vIGZ0Yml0bWFwLnBwYy5vIGZ0Y2lkLnBwYy5vIFwKLQkgIGZ0Zm50Zm10LnBwYy5vZnRmc3R5cGUucHBjLm8gZnRnYXNwLnBwYy5vIGZ0Z2x5cGgucHBjLm8gICAgICAgICAgXAotCSAgZnRneHZhbC5wcGMubyBmdGxjZGZpbC5wcGMubyBmdG1tLnBwYy5vIGZ0b3R2YWwucHBjLm8gICAgICAgICAgICBcCi0JICBmdHBhdGVudC5wcGMubyBmdHBmci5wcGMubyBmdHN0cm9rZS5wcGMubyBmdHN5bnRoLnBwYy5vICAgICAgICAgIFwKLQkgIGZ0dHlwZTEucHBjLm8gZnR3aW5mbnQucHBjLm8KLQotREVCVUdQUEMgPSBmdGRlYnVnLnBwYy5vIGZ0ZGVidWdwdXJlLnBwYy5vCi0KLUFGSVRQUEMgPSBhdXRvZml0LnBwYy5vCi0KLUdYVlBQQyA9IGd4dmFsaWQucHBjLm8KLQotT1RWUFBDID0gb3R2YWxpZC5wcGMubwotCi1QU1BQQyA9IHBzYXV4LnBwYy5vIHBzbmFtZXMucHBjLm8gcHNoaW50ZXIucHBjLm8KLQotUkFTVEVSUFBDID0gcmFzdGVyLnBwYy5vIHNtb290aC5wcGMubwotCi1GT05URFBQQyA9IGNmZi5wcGMubyB0eXBlMS5wcGMubyB0eXBlNDIucHBjLm8gdHlwZTFjaWQucHBjLm8gdHJ1ZXR5cGUucHBjLm9cCi0JICAgYmRmLnBwYy5vIHBjZi5wcGMubyBwZnIucHBjLm8gd2luZm50LnBwYy5vCi0KLWxpYmZ0Ml9wcGMuYTogICAgJChCQVNFUFBDKSAkKEFGSVRQUEMpICQoR1hWUFBDKSAkKE9UVlBQQykgJChQU1BQQykgJChSQVNURVJQUEMpIHNmbnQucHBjLm8gZnRjYWNoZS5wcGMubyAkKEZPTlREUFBDKSBnemlwLnBwYy5vIGJ6aXAyLnBwYy5vIGx6dy5wcGMubwotCSQoQVIpICRAICQoQkFTRVBQQykgJChBRklUUFBDKSAkKEdYVlBQQykgJChPVFZQUEMpICQoUFNQUEMpICQoUkFTVEVSUFBDKSBzZm50LnBwYy5vIGZ0Y2FjaGUucHBjLm8gJChGT05URFBQQykgZ3ppcC5wcGMubyBiemlwMi5wcGMubyBsencucHBjLm8KLQktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotCi0jTG9jYWwgVmFyaWFibGVzOgotI2NvZGluZzogbGF0aW4tMQotI0VuZDoKZGlmZiAtLWdpdCBhL2J1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQgYi9idWlsZHMvYW1pZ2EvbWFrZWZpbGUub3M0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmVlODY0Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgRnJlZVR5cGUyIGxpbmsgbGlicmFyeSB1c2luZyBnY2MgNC4wLjMgZnJvbSB0aGUKLSMgQW1pZ2FPUzQgU0RLCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5Ci0jIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIHRvIGJ1aWxkIGZyb20gdGhlIGJ1aWxkcy9hbWlnYSBkaXJlY3RvcnkgY2FsbAotIwotIyAgbWFrZSAtZiBtYWtlZmlsZS5vczQKLSMKLSMgWW91ciBwcm9ncmFtcyBzb3VyY2UgY29kZSBzaG91bGQgc3RhcnQgd2l0aCB0aGlzCi0jICh1bmNvbW1lbnQgdGhlIHBhcnRzIHlvdSBkbyBub3QgbmVlZCB0byBrZWVwIHRoZSBwcm9ncmFtIHNtYWxsKToKLSMgLS0tODwtLS0KLSNkZWZpbmUgRlRfVVNFX0FVVE9GSVQgLy8gYXV0b2ZpdHRlcgotI2RlZmluZSBGVF9VU0VfUkFTVEVSICAvLyBtb25vY2hyb21lIHJhc3Rlcml6ZXIKLSNkZWZpbmUgRlRfVVNFX1NNT09USCAgLy8gYW50aS1hbGlhc2luZyByYXN0ZXJpemVyCi0jZGVmaW5lIEZUX1VTRV9UVCAgICAgIC8vIHRydWV0eXBlIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9UMSAgICAgIC8vIHR5cGUxIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9UNDIgICAgIC8vIHR5cGU0MiBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfVDFDSUQgICAvLyBjaWQta2V5ZWQgdHlwZTEgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX0NGRiAgICAgLy8gb3BlbnR5cGUgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX0JERiAgICAgLy8gYmRmIGJpdG1hcCBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfUENGICAgICAvLyBwY2YgYml0bWFwIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9QRlIgICAgIC8vIHBmciBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfV0lORk5UICAvLyB3aW5kb3dzIC5mbnR8LmZvbiBiaXRtYXAgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX09UViAgICAgLy8gb3BlbnR5cGUgdmFsaWRhdG9yCi0jZGVmaW5lIEZUX1VTRV9HWFYgICAgIC8vIHRydWV0eXBlIGd4IHZhbGlkYXRvcgotI2luY2x1ZGUgIkZUOnNyYy9iYXNlL2Z0aW5pdC5jIgotIyAtLS04PC0tLQotIwotIyBsaW5rIHlvdXIgcHJvZ3JhbXMgd2l0aCBsaWJmdDJfcHBjLmEgYW5kIGVpdGhlciBmdHN5c3RlbS5wcGMubyBvciBmdHN5c3RlbXB1cmUucHBjLm8KLSMgKGFuZCBlaXRoZXIgZnRkZWJ1Zy5wcGMubyBvciBmdGRlYnVncHVyZS5wcGMubyBpZiB5b3UgZW5hYmxlZCBGVF9ERUJVR19MRVZFTF9FUlJPUiBvcgotIyBGVF9ERUJVR19MRVZFTF9UUkFDRSBpbiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oKS4KLQotYWxsOglhc3NpZ24gbGliZnQyX3BwYy5hIGZ0c3lzdGVtLnBwYy5vIGZ0c3lzdGVtcHVyZS5wcGMubwotCi1hc3NpZ246Ci0JYXNzaWduIEZUOiAvLwotCi1DQyA9ICAgICBwcGMtYW1pZ2Fvcy1nY2MKLUFSID0gICAgIHBwYy1hbWlnYW9zLWFyCi1SQU5MSUIgPSBwcGMtYW1pZ2Fvcy1yYW5saWIKLQotRElSRkxBR1MgID0gLUlpbmNsdWRlIC1JL0ZUL3NyYyAtSS9GVC9pbmNsdWRlIC1JL1NESy9pbmNsdWRlCi0KLVdBUk5JTkdTID0gLVdhbGwgLVcgLVd1bmRlZiAtV3BvaW50ZXItYXJpdGggLVdiYWQtZnVuY3Rpb24tY2FzdCBcCi0JICAgLVdhZ2dyZWdhdGUtcmV0dXJuIC1Xd3JpdGUtc3RyaW5ncyAtV3NoYWRvdwotCi1PUFRJT05TICA9IC1ERlQyX0JVSUxEX0xJQlJBUlkgLUROREVCVUcgLWZuby1idWlsdGluCi1PUFRJTUlaRSA9IC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtZnN0cmVuZ3RoLXJlZHVjZSAtZmlubGluZS1mdW5jdGlvbnMKLQotQ0ZMQUdTICAgPSAtbWNydD1jbGliMiAkKERJUkZMQUdTKSAkKFdBUk5JTkdTKSAkKEZUMkZMQUdTKSAkKE9QVElPTlMpICQoT1BUSU1JWkUpCi0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgYmFzZQotIwotZnRiYXNlLnBwYy5vOiBGVDpzcmMvYmFzZS9mdGJhc2UuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnRiYXNlLmMKLQotZnRpbml0LnBwYy5vOiBGVDpzcmMvYmFzZS9mdGluaXQuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnRpbml0LmMKLQotZnRzeXN0ZW0ucHBjLm86IEZUOnNyYy9iYXNlL2Z0c3lzdGVtLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9iYXNlL2Z0c3lzdGVtLmMKLQotIyBwdXJlIHZlcnNpb24gZm9yIHVzZSBpbiBydW4tdGltZSBsaWJyYXJ5IGV0YwotZnRzeXN0ZW1wdXJlLnBwYy5vOiBzcmMvYmFzZS9mdHN5c3RlbS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIHNyYy9iYXNlL2Z0c3lzdGVtLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBiYXNlIGV4dGVuc2lvbnMKLSMKLWZ0YmJveC5wcGMubzogRlQ6c3JjL2Jhc2UvZnRiYm94LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9iYXNlL2Z0YmJveC5jCi0KLWZ0YmRmLnBwYy5vOiBGVDpzcmMvYmFzZS9mdGJkZi5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdGJkZi5jCi0KLWZ0Yml0bWFwLnBwYy5vOiBGVDpzcmMvYmFzZS9mdGJpdG1hcC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdGJpdG1hcC5jCi0KLWZ0Y2lkLnBwYy5vOiBGVDpzcmMvYmFzZS9mdGNpZC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdGNpZC5jCi0KLWZ0ZGVidWcucHBjLm86IEZUOnNyYy9iYXNlL2Z0ZGVidWcuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnRkZWJ1Zy5jCi0KLSMgcHVyZSB2ZXJzaW9uIGZvciB1c2UgaW4gcnVuLXRpbWUgbGlicmFyeSBldGMKLWZ0ZGVidWdwdXJlLnBwYy5vOiBzcmMvYmFzZS9mdGRlYnVnLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgc3JjL2Jhc2UvZnRkZWJ1Zy5jCi0KLWZ0Zm50Zm10LnBwYy5vOiBGVDpzcmMvYmFzZS9mdGZudGZtdC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdGZudGZtdC5jCi0KLWZ0ZnN0eXBlLnBwYy5vOiBGVDpzcmMvYmFzZS9mdGZzdHlwZS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdGZzdHlwZS5jCi0KLWZ0Z2FzcC5wcGMubzogRlQ6c3JjL2Jhc2UvZnRnYXNwLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9iYXNlL2Z0Z2FzcC5jCi0KLWZ0Z2x5cGgucHBjLm86IEZUOnNyYy9iYXNlL2Z0Z2x5cGguYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnRnbHlwaC5jCi0KLWZ0Z3h2YWwucHBjLm86IEZUOnNyYy9iYXNlL2Z0Z3h2YWwuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnRneHZhbC5jCi0KLWZ0bGNkZmlsLnBwYy5vOiBGVDpzcmMvYmFzZS9mdGxjZGZpbC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdGxjZGZpbC5jCi0KLWZ0bW0ucHBjLm86IEZUOnNyYy9iYXNlL2Z0bW0uYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnRtbS5jCi0KLWZ0b3R2YWwucHBjLm86IEZUOnNyYy9iYXNlL2Z0b3R2YWwuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnRvdHZhbC5jCi0KLWZ0cGF0ZW50LnBwYy5vOiBGVDpzcmMvYmFzZS9mdHBhdGVudC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdHBhdGVudC5jCi0KLWZ0cGZyLnBwYy5vOiBGVDpzcmMvYmFzZS9mdHBmci5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdHBmci5jCi0KLWZ0c3Ryb2tlLnBwYy5vOiBGVDpzcmMvYmFzZS9mdHN0cm9rZS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdHN0cm9rZS5jCi0KLWZ0c3ludGgucHBjLm86IEZUOnNyYy9iYXNlL2Z0c3ludGguYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnRzeW50aC5jCi0KLWZ0dHlwZTEucHBjLm86IEZUOnNyYy9iYXNlL2Z0dHlwZTEuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2Jhc2UvZnR0eXBlMS5jCi0KLWZ0d2luZm50LnBwYy5vOiBGVDpzcmMvYmFzZS9mdHdpbmZudC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvYmFzZS9mdHdpbmZudC5jCi0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgYXV0b2ZpdHRpbmcgbW9kdWxlCi0jCi1hdXRvZml0LnBwYy5vOiBGVDpzcmMvYXV0b2ZpdC9hdXRvZml0LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9hdXRvZml0L2F1dG9maXQuYwotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IHBvc3RzY3JpcHQgaGludGluZyBtb2R1bGUKLSMKLXBzaGludGVyLnBwYy5vOiBGVDpzcmMvcHNoaW50ZXIvcHNoaW50ZXIuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL3BzaGludGVyL3BzaGludGVyLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBQUyBzdXBwb3J0IG1vZHVsZQotIwotcHNhdXgucHBjLm86IEZUOnNyYy9wc2F1eC9wc2F1eC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvcHNhdXgvcHNhdXguYwotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IFBTIGdseXBoIG5hbWVzIG1vZHVsZQotIwotcHNuYW1lcy5wcGMubzogRlQ6c3JjL3BzbmFtZXMvcHNuYW1lcy5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvcHNuYW1lcy9wc25hbWVzLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBtb25vY2hyb21lIHJhc3RlciBtb2R1bGUKLSMKLXJhc3Rlci5wcGMubzogRlQ6c3JjL3Jhc3Rlci9yYXN0ZXIuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL3Jhc3Rlci9yYXN0ZXIuYwotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IGFudGktYWxpYXNpbmcgcmFzdGVyIG1vZHVsZQotIwotc21vb3RoLnBwYy5vOiBGVDpzcmMvc21vb3RoL3Ntb290aC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvc21vb3RoL3Ntb290aC5jCi0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgJ3NmbnQnIG1vZHVsZQotIwotc2ZudC5wcGMubzogRlQ6c3JjL3NmbnQvc2ZudC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvc2ZudC9zZm50LmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBnbHlwaCBhbmQgaW1hZ2UgY2FjaGluZyBzeXN0ZW0KLSMKLWZ0Y2FjaGUucHBjLm86IEZUOnNyYy9jYWNoZS9mdGNhY2hlLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9jYWNoZS9mdGNhY2hlLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBPcGVuVHlwZSBmb250IGRyaXZlcgotIwotY2ZmLnBwYy5vOiBGVDpzcmMvY2ZmL2NmZi5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvY2ZmL2NmZi5jCi0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgVHJ1ZVR5cGUgZm9udCBkcml2ZXIKLSMKLXRydWV0eXBlLnBwYy5vOiBGVDpzcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL3RydWV0eXBlL3RydWV0eXBlLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBUeXBlMSBmb250IGRyaXZlcgotIwotdHlwZTEucHBjLm86IEZUOnNyYy90eXBlMS90eXBlMS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvdHlwZTEvdHlwZTEuYwotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IFR5cGU0MiBmb250IGRyaXZlcgotIwotdHlwZTQyLnBwYy5vOiBGVDpzcmMvdHlwZTQyL3R5cGU0Mi5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvdHlwZTQyL3R5cGU0Mi5jCi0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgQ0lELWtleWVkIFR5cGUxIGZvbnQgZHJpdmVyCi0jCi10eXBlMWNpZC5wcGMubzogRlQ6c3JjL2NpZC90eXBlMWNpZC5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvY2lkL3R5cGUxY2lkLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBCREYgYml0bWFwIGZvbnQgZHJpdmVyCi0jCi1iZGYucHBjLm86IEZUOnNyYy9iZGYvYmRmLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9iZGYvYmRmLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBQQ0YgYml0bWFwIGZvbnQgZHJpdmVyCi0jCi1wY2YucHBjLm86IEZUOnNyYy9wY2YvcGNmLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9wY2YvcGNmLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBnemlwIHN1cHBvcnQgZm9yIGNvbXByZXNzZWQgUENGIGJpdG1hcCBmb250cwotIwotZ3ppcC5wcGMubzogRlQ6c3JjL2d6aXAvZnRnemlwLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9nemlwL2Z0Z3ppcC5jCi0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgYnppcDIgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBQQ0YgYml0bWFwIGZvbnRzCi0jCi1iemlwMi5wcGMubzogRlQ6c3JjL2J6aXAyL2Z0YnppcDIuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL2J6aXAyL2Z0YnppcDIuYwotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IGNvbXByZXNzIHN1cHBvcnQgZm9yIGNvbXByZXNzZWQgUENGIGJpdG1hcCBmb250cwotIwotbHp3LnBwYy5vOiBGVDpzcmMvbHp3L2Z0bHp3LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy9sencvZnRsencuYwotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IFBGUiBmb250IGRyaXZlcgotIwotcGZyLnBwYy5vOiBGVDpzcmMvcGZyL3Bmci5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAIC9GVC9zcmMvcGZyL3Bmci5jCi0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgV2luZG93cyBGTlQvRk9OIGJpdG1hcCBmb250IGRyaXZlcgotIwotd2luZm50LnBwYy5vOiBGVDpzcmMvd2luZm9udHMvd2luZm50LmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgL0ZUL3NyYy93aW5mb250cy93aW5mbnQuYwotCi0jCi0jIEZyZWVUeXBlMiBsaWJyYXJ5IFRydWVUeXBlR1ggVmFsaWRhdG9yCi0jCi1neHZhbGlkLnBwYy5vOiBGVDpzcmMvZ3h2YWxpZC9neHZhbGlkLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLVduby1hZ2dyZWdhdGUtcmV0dXJuIC1vICRAIC9GVC9zcmMvZ3h2YWxpZC9neHZhbGlkLmMKLQotIwotIyBGcmVlVHlwZTIgbGlicmFyeSBPcGVuVHlwZSB2YWxpZGF0b3IKLSMKLW90dmFsaWQucHBjLm86IEZUOnNyYy9vdHZhbGlkL290dmFsaWQuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAvRlQvc3JjL290dmFsaWQvb3R2YWxpZC5jCi0KLUJBU0UgPSBmdGJhc2UucHBjLm8gZnRiYm94LnBwYy5vIGZ0YmRmLnBwYy5vIGZ0Yml0bWFwLnBwYy5vIGZ0Y2lkLnBwYy5vIFwKLSAgICAgICBmdGZudGZtdC5wcGMubyBmdGZzdHlwZS5wcGMubyBmdGdhc3AucHBjLm8gZnRnbHlwaC5wcGMubyAgICAgICAgIFwKLSAgICAgICBmdGd4dmFsLnBwYy5vIGZ0bGNkZmlsLnBwYy5vIGZ0bW0ucHBjLm8gZnRvdHZhbC5wcGMubyAgICAgICAgICAgIFwKLSAgICAgICBmdHBhdGVudC5wcGMubyBmdHBmci5wcGMubyBmdHN0cm9rZS5wcGMubyBmdHN5bnRoLnBwYy5vICAgICAgICAgIFwKLSAgICAgICBmdHR5cGUxLnBwYy5vIGZ0d2luZm50LnBwYy5vCi0KLURFQlVHID0gZnRkZWJ1Zy5wcGMubyBmdGRlYnVncHVyZS5wcGMubwotCi1BRklUID0gYXV0b2ZpdC5wcGMubwotCi1HWFYgPSBneHZhbGlkLnBwYy5vCi0KLU9UViA9IG90dmFsaWQucHBjLm8KLQotUFMgPSBwc2F1eC5wcGMubyBwc25hbWVzLnBwYy5vIHBzaGludGVyLnBwYy5vCi0KLVJBU1RFUiA9IHJhc3Rlci5wcGMubyBzbW9vdGgucHBjLm8KLQotRk9OVEQgPSBjZmYucHBjLm8gdHlwZTEucHBjLm8gdHlwZTQyLnBwYy5vIHR5cGUxY2lkLnBwYy5vIHRydWV0eXBlLnBwYy5vXAotCWJkZi5wcGMubyBwY2YucHBjLm8gcGZyLnBwYy5vIHdpbmZudC5wcGMubwotCi1saWJmdDJfcHBjLmE6ICAgICAgJChCQVNFKSAkKEFGSVQpICQoR1hWKSAkKE9UVikgJChQUykgJChSQVNURVIpIHNmbnQucHBjLm8gZnRjYWNoZS5wcGMubyAkKEZPTlREKSBnemlwLnBwYy5vIGx6dy5wcGMubwotCSQoQVIpIHIgJEAgJChCQVNFKSAkKEFGSVQpICQoR1hWKSAkKE9UVikgJChQUykgJChSQVNURVIpIHNmbnQucHBjLm8gZnRjYWNoZS5wcGMubyAkKEZPTlREKSBnemlwLnBwYy5vIGx6dy5wcGMubwotCSQoUkFOTElCKSAkQAotCi0jTG9jYWwgVmFyaWFibGVzOgotI2NvZGluZzogbGF0aW4tMQotI0VuZDoKZGlmZiAtLWdpdCBhL2J1aWxkcy9hbWlnYS9zbWFrZWZpbGUgYi9idWlsZHMvYW1pZ2Evc21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUwYTM4Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9hbWlnYS9zbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgRnJlZVR5cGUyIGxpbmsgbGlicmFyeSB1c2luZyBBbWlnYSBTQVMvQyA2LjU4Ci0jCi0KLQotIyBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5Ci0jIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIHRvIGJ1aWxkIGZyb20gdGhlIGJ1aWxkcy9hbWlnYSBkaXJlY3RvcnkgY2FsbAotIwotIyAgc21ha2UgYXNzaWduCi0jICBzbWFrZQotIwotIyBZb3VyIHByb2dyYW1zIHNvdXJjZSBjb2RlIHNob3VsZCBzdGFydCB3aXRoIHRoaXMKLSMgKHVuY29tbWVudCB0aGUgcGFydHMgeW91IGRvIG5vdCBuZWVkIHRvIGtlZXAgdGhlIHByb2dyYW0gc21hbGwpOgotIyAtLS04PC0tLQotI2RlZmluZSBGVF9VU0VfQVVUT0ZJVCAvLyBhdXRvZml0dGVyCi0jZGVmaW5lIEZUX1VTRV9SQVNURVIgIC8vIG1vbm9jaHJvbWUgcmFzdGVyaXplcgotI2RlZmluZSBGVF9VU0VfU01PT1RIICAvLyBhbnRpLWFsaWFzaW5nIHJhc3Rlcml6ZXIKLSNkZWZpbmUgRlRfVVNFX1RUICAgICAgLy8gdHJ1ZXR5cGUgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX1QxICAgICAgLy8gdHlwZTEgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX1Q0MiAgICAgLy8gdHlwZTQyIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9UMUNJRCAgIC8vIGNpZC1rZXllZCB0eXBlMSBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfQ0ZGICAgICAvLyBvcGVudHlwZSBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfQkRGICAgICAvLyBiZGYgYml0bWFwIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9QQ0YgICAgIC8vIHBjZiBiaXRtYXAgZm9udCBkcml2ZXIKLSNkZWZpbmUgRlRfVVNFX1BGUiAgICAgLy8gcGZyIGZvbnQgZHJpdmVyCi0jZGVmaW5lIEZUX1VTRV9XSU5GTlQgIC8vIHdpbmRvd3MgLmZudHwuZm9uIGJpdG1hcCBmb250IGRyaXZlcgotI2RlZmluZSBGVF9VU0VfT1RWICAgICAvLyBvcGVudHlwZSB2YWxpZGF0b3IKLSNkZWZpbmUgRlRfVVNFX0dYViAgICAgLy8gdHJ1ZXR5cGUgZ3ggdmFsaWRhdG9yCi0jaW5jbHVkZSAiRlQ6c3JjL2Jhc2UvZnRpbml0LmMiCi0jIC0tLTg8LS0tCi0jCi0jIGxpbmsgeW91ciBwcm9ncmFtcyB3aXRoIGZ0Ml82ODB4MC5saWIgYW5kIGVpdGhlciBmdHN5c3RlbS5vIG9yIGZ0c3lzdGVtcHVyZS5vCi0jIChhbmQgZWl0aGVyIGZ0ZGVidWcubyBvciBmdGRlYnVncHVyZS5vIGlmIHlvdSBlbmFibGVkIEZUX0RFQlVHX0xFVkVMX0VSUk9SIG9yCi0jIEZUX0RFQlVHX0xFVkVMX1RSQUNFIGluIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgpLgotCi1PQkpCQVNFID0gZnRiYXNlLm8gZnRiYm94Lm8gZnRiZGYubyBmdGJpdG1hcC5vIGZ0Y2lkLm8gZnRmbnRmbXQubyBmdGZzdHlwZS5vIFwKLQkgIGZ0Z2FzcC5vIGZ0Z2x5cGgubyBmdGd4dmFsLm8gZnRsY2RmaWwubyBmdG1tLm8gZnRvdHZhbC5vICAgICAgICAgICBcCi0JICBmdHBhdGVudC5vIGZ0cGZyLm8gZnRzdHJva2UubyBmdHN5bnRoLm8gZnR0eXBlMS5vIGZ0d2luZm50Lm8KLQotT0JKU1lTVEVNID0gZnRzeXN0ZW0ubyBmdHN5c3RlbXB1cmUubwotCi1PQkpERUJVRyA9IGZ0ZGVidWcubyBmdGRlYnVncHVyZS5vCi0KLU9CSkFGSVQgPSBhdXRvZml0Lm8KLQotT0JKR1hWID0gZ3h2YWxpZC5vCi0KLU9CSk9UViA9IG90dmFsaWQubwotCi1PQkpQUyA9IHBzYXV4Lm8gcHNuYW1lcy5vIHBzaGludGVyLm8KLQotT0JKUkFTVEVSID0gcmFzdGVyLm8gc21vb3RoLm8KLQotT0JKU0ZOVCA9IHNmbnQubwotCi1PQkpDQUNIRSA9IGZ0Y2FjaGUubwotCi1PQkpGT05URCA9IGNmZi5vIHR5cGUxLm8gdHlwZTQyLm8gdHlwZTFjaWQub1wKLQkgICB0cnVldHlwZS5vIHdpbmZudC5vIGJkZi5vIHBjZi5vIHBmci5vCi0KLUNPUkUgPSBGVDpzcmMvCi0KLUNQVSAgICAgICA9IDY4MDAwCi0jQ1BVICAgICAgPSA2ODAyMAotI0NQVSAgICAgID0gNjgwMzAKLSNDUFUgICAgICA9IDY4MDQwCi0jQ1BVICAgICAgPSA2ODA2MAotCi1PUFRJTUlaRVIgPSBvcHRpbmxvY2FsCi0KLVNDRkxBR1MgPSBvcHRpbWl6ZSBvcHR0aW1lIG9wdHNjaGVkIHN0cm1lcmdlIGRhdGE9ZmFyb25seSBpZGxlbj01MCBjcHU9JChDUFUpXAotCSAgaWRpcj1pbmNsdWRlLyBpZGlyPSQoQ09SRSkgaWRpcj1GVDppbmNsdWRlLyBub3N0YWNrY2hlY2sgbm9jaGthYm9ydFwKLQkgIG5vaWNvbnMgaWdub3JlPTc5LDg1LDExMCwzMDYgcGFyYW1ldGVycz1ib3RoIGRlZmluZT1GVDJfQlVJTERfTElCUkFSWQotCi1MSUIgID0gZnQyXyQoQ1BVKS5saWIKLQotIyBzYW1wbGUgbGlua2VyIG9wdGlvbnMKLU9QVFMgPSBsaW5rIGxpYj0kKExJQiksbGliOnNjLmxpYixsaWI6YW1pZ2EubGliLGxpYjpkZWJ1Zy5saWJcCi0gICAgICAgc21hbGxjb2RlIHNtYWxsZGF0YSBub2ljb25zIHV0aWxsaWIKLQotIyBzYW1wbGUgcHJvZ3JhbSBlbnRyeQotI215cHJvZzogbXlwcm9nLmMgZnRzeXN0ZW0ubyAkKExJQikKLSMJc2MgJDwgcHJvZ3JhbW5hbWU9JEAgZnRzeXN0ZW0ubyAkKFNDRkxBR1MpICQoT1BUUykKLQotYWxsOgkkKExJQikgJChPQkpTWVNURU0pICQoT0JKREVCVUcpCi0KLWFzc2lnbjoKLQlhc3NpZ24gRlQ6IC8vCi0KLSMgdXNlcyBzZXBhcmF0ZSBvYmplY3QgbW9kdWxlcyBpbiBsaWIgdG8gbWFrZSBmb3IgZWFzaWVyIGRlYnVnZ2luZwotIyBhbHNvLCBjYW4gbWFrZSBzbWFsbGVyIHByb2dyYW1zIGlmIGVudGlyZSBlbmdpbmUgaXMgbm90IHVzZWQKLWZ0Ml8kKENQVSkubGliOiAgJChPQkpCQVNFKSAkKE9CSkFGSVQpICQoT0JKT1RWKSAkKE9CSlBTKSAkKE9CSlJBU1RFUikgJChPQkpTRk5UKSAkKE9CSkNBQ0hFKSAkKE9CSkZPTlREKSBsencubyBnemlwLm8gYnppcDIubwotCW9tbCAkQCByICQoT0JKQkFTRSkgJChPQkpBRklUKSAkKE9CSk9UVikgJChPQkpQUykgJChPQkpSQVNURVIpICQoT0JKU0ZOVCkgJChPQkpDQUNIRSkgJChPQkpGT05URCkgbHp3Lm8gZ3ppcC5vIGJ6aXAyLm8KLQotY2xlYW46Ci0JLWRlbGV0ZSBcIz8ubwotCi1yZWFsY2xlYW46IGNsZWFuCi0JLWRlbGV0ZSBmdDIkKENQVSkubGliCi0KLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBiYXNlCi0jCi1mdGJhc2UubzogJChDT1JFKWJhc2UvZnRiYXNlLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLWZ0aW5pdC5vOiAkKENPUkUpYmFzZS9mdGluaXQuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRzeXN0ZW0ubzogJChDT1JFKWJhc2UvZnRzeXN0ZW0uYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRzeXN0ZW1wdXJlLm86IHNyYy9iYXNlL2Z0c3lzdGVtLmMJIyMgcHVyZSB2ZXJzaW9uIGZvciB1c2UgaW4gcnVuLXRpbWUgbGlicmFyeSBldGMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLWZ0ZGVidWcubzogJChDT1JFKWJhc2UvZnRkZWJ1Zy5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci1mdGRlYnVncHVyZS5vOiBzcmMvYmFzZS9mdGRlYnVnLmMJIyMgcHVyZSB2ZXJzaW9uIGZvciB1c2UgaW4gcnVuLXRpbWUgbGlicmFyeSBldGMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBiYXNlIGV4dGVuc2lvbnMKLSMKLWZ0YmJveC5vOiAkKENPUkUpYmFzZS9mdGJib3guYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRiZGYubzogJChDT1JFKWJhc2UvZnRiZGYuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRiaXRtYXAubzogJChDT1JFKWJhc2UvZnRiaXRtYXAuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRjaWQubzogJChDT1JFKWJhc2UvZnRjaWQuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRmbnRmbXQubzogJChDT1JFKWJhc2UvZnRmbnRmbXQuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRmc3R5cGUubzogJChDT1JFKWJhc2UvZnRmc3R5cGUuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRnYXNwLm86ICQoQ09SRSliYXNlL2Z0Z2FzcC5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci1mdGdseXBoLm86ICQoQ09SRSliYXNlL2Z0Z2x5cGguYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRneHZhbC5vOiAkKENPUkUpYmFzZS9mdGd4dmFsLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLWZ0bGNkZmlsLm86ICQoQ09SRSliYXNlL2Z0bGNkZmlsLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLWZ0bW0ubzogJChDT1JFKWJhc2UvZnRtbS5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci1mdG90dmFsLm86ICQoQ09SRSliYXNlL2Z0b3R2YWwuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRwYXRlbnQubzogJChDT1JFKWJhc2UvZnRwYXRlbnQuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRwZnIubzogJChDT1JFKWJhc2UvZnRwZnIuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRzdHJva2UubzogJChDT1JFKWJhc2UvZnRzdHJva2UuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotZnRzeW50aC5vOiAkKENPUkUpYmFzZS9mdHN5bnRoLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLWZ0dHlwZTEubzogJChDT1JFKWJhc2UvZnR0eXBlMS5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci1mdHdpbmZudC5vOiAkKENPUkUpYmFzZS9mdHdpbmZudC5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci0KLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBhdXRvZml0dGVyIG1vZHVsZQotIwotYXV0b2ZpdC5vOiAkKENPUkUpYXV0b2ZpdC9hdXRvZml0LmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLQotIwotIyBmcmVldHlwZSBsaWJyYXJ5IFBTIGhpbnRpbmcgbW9kdWxlCi0jCi1wc2hpbnRlci5vOiAkKENPUkUpcHNoaW50ZXIvcHNoaW50ZXIuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotIwotIyBmcmVldHlwZSBsaWJyYXJ5IFBTIHN1cHBvcnQgbW9kdWxlCi0jCi1wc2F1eC5vOiAkKENPUkUpcHNhdXgvcHNhdXguYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotCi0jCi0jIGZyZWV0eXBlIGxpYnJhcnkgUFMgZ2x5cGggbmFtZXMgbW9kdWxlCi0jCi1wc25hbWVzLm86ICQoQ09SRSlwc25hbWVzL3BzbmFtZXMuYwotCXNjICQoU0NGTEFHUykgY29kZT1mYXIgb2JqbmFtZT0kQCAkPAotCi0jCi0jIGZyZWV0eXBlIGxpYnJhcnkgbW9ub2Nocm9tZSByYXN0ZXIgbW9kdWxlCi0jCi1yYXN0ZXIubzogJChDT1JFKXJhc3Rlci9yYXN0ZXIuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotCi0jCi0jIGZyZWV0eXBlIGxpYnJhcnkgYW50aS1hbGlhc2luZyByYXN0ZXIgbW9kdWxlCi0jCi1zbW9vdGgubzogJChDT1JFKXNtb290aC9zbW9vdGguYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotCi0jCi0jIGZyZWV0eXBlIGxpYnJhcnkgJ3NmbnQnIG1vZHVsZQotIwotc2ZudC5vOiAkKENPUkUpc2ZudC9zZm50LmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLQotIwotIyBmcmVldHlwZSBsaWJyYXJ5IGdseXBoIGFuZCBpbWFnZSBjYWNoaW5nIHN5c3RlbSAoc3RpbGwgZXhwZXJpbWVudGFsKQotIwotZnRjYWNoZS5vOiAkKENPUkUpY2FjaGUvZnRjYWNoZS5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci0KLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBPcGVuVHlwZSBmb250IGRyaXZlcgotIwotY2ZmLm86ICQoQ09SRSljZmYvY2ZmLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLQotIwotIyBmcmVldHlwZSBsaWJyYXJ5IFRydWVUeXBlIGZvbnQgZHJpdmVyCi0jCi10cnVldHlwZS5vOiAkKENPUkUpdHJ1ZXR5cGUvdHJ1ZXR5cGUuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotCi0jCi0jIGZyZWV0eXBlIGxpYnJhcnkgVHlwZTEgZm9udCBkcml2ZXIKLSMKLXR5cGUxLm86ICQoQ09SRSl0eXBlMS90eXBlMS5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci0KLSMKLSMgRnJlZVR5cGUyIGxpYnJhcnkgVHlwZTQyIGZvbnQgZHJpdmVyCi0jCi10eXBlNDIubzogJChDT1JFKXR5cGU0Mi90eXBlNDIuYwotCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotCi0jCi0jIGZyZWV0eXBlIGxpYnJhcnkgQ0lELWtleWVkIFR5cGUxIGZvbnQgZHJpdmVyCi0jCi10eXBlMWNpZC5vOiAkKENPUkUpY2lkL3R5cGUxY2lkLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBDSUQta2V5ZWQgVHlwZTEgZm9udCBkcml2ZXIgZXh0ZW5zaW9ucwotIwotI2NpZGFmbS5vOiAkKENPUkUpY2lkL2NpZGFmbS5jCi0jCXNjICQoU0NGTEFHUykgb2JqbmFtZT0kQCAkPAotCi0jCi0jIGZyZWV0eXBlIGxpYnJhcnkgQkRGIGJpdG1hcCBmb250IGRyaXZlcgotIwotYmRmLm86ICQoQ09SRSliZGYvYmRmLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLQotIwotIyBmcmVldHlwZSBsaWJyYXJ5IFBDRiBiaXRtYXAgZm9udCBkcml2ZXIKLSMKLXBjZi5vOiAkKENPUkUpcGNmL3BjZi5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci0KLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBnemlwIHN1cHBvcnQgZm9yIGNvbXByZXNzZWQgUENGIGJpdG1hcCBmb250cwotIwotZ3ppcC5vOiAkKENPUkUpZ3ppcC9mdGd6aXAuYwotCXNjICQoU0NGTEFHUykgZGVmaW5lIEZBUiBvYmpuYW1lPSRAICQ8Ci0KLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBiemlwMiBzdXBwb3J0IGZvciBjb21wcmVzc2VkIFBDRiBiaXRtYXAgZm9udHMKLSMKLWJ6aXAyLm86ICQoQ09SRSliemlwMi9mdGJ6aXAyLmMKLQlzYyAkKFNDRkxBR1MpIGRlZmluZSBGQVIgb2JqbmFtZT0kQCAkPAotCi0jCi0jIGZyZWV0eXBlIGxpYnJhcnkgY29tcHJlc3Mgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBQQ0YgYml0bWFwIGZvbnRzCi0jCi1sencubzogJChDT1JFKWx6dy9mdGx6dy5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci0KLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBQRlIgZm9udCBkcml2ZXIKLSMKLXBmci5vOiAkKENPUkUpcGZyL3Bmci5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci0KLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBXaW5kb3dzIEZOVC9GT04gYml0bWFwIGZvbnQgZHJpdmVyCi0jCi13aW5mbnQubzogJChDT1JFKXdpbmZvbnRzL3dpbmZudC5jCi0Jc2MgJChTQ0ZMQUdTKSBvYmpuYW1lPSRAICQ8Ci0KLSMKLSMgZnJlZXR5cGUgbGlicmFyeSBUcnVlVHlwZUdYIHZhbGlkYXRvcgotIwotZ3h2YWxpZC5vOiAkKENPUkUpZ3h2YWxpZC9neHZhbGlkLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLQotIwotIyBmcmVldHlwZSBsaWJyYXJ5IE9wZW5UeXBlIHZhbGlkYXRvcgotIwotb3R2YWxpZC5vOiAkKENPUkUpb3R2YWxpZC9vdHZhbGlkLmMKLQlzYyAkKFNDRkxBR1MpIG9iam5hbWU9JEAgJDwKLQotI0xvY2FsIFZhcmlhYmxlczoKLSNjb2Rpbmc6IGxhdGluLTEKLSNFbmQ6CmRpZmYgLS1naXQgYS9idWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRkZWJ1Zy5jIGIvYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0ZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4OTdjZi4uMDAwMDAwMAotLS0gYS9idWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRkZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZGVidWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBEZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgY29tcG9uZW50IGZvciBhbWlnYSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcgYW5kIERldGxlZiBX/HJrbmVyLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZSAqLwotICAvKiBkZWJ1Z2dpbmcgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZS4gIEl0cyBtYWluIHB1cnBvc2UgaXMgaW4gYXNzZXJ0aW9uICAgKi8KLSAgLyogY2hlY2tpbmcsIHRyYWNpbmcsIGFuZCBlcnJvciBkZXRlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgbm93IHRocmVlIGRlYnVnZ2luZyBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gdHJhY2UgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFcnJvciBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIGxvZyBmaWxlICh3aGljaCBjYW4gYmUgdGhlICovCi0gIC8qICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBlcnJvciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9ubHkgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gcmVsZWFzZSBtb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBObyBlcnJvciBtZXNzYWdlIGlzIHNlbnQgb3IgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgaXMgZnJlZSBmcm9tIGFueSAgICovCi0gIC8qICAgZGVidWdnaW5nIHBhcnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiBCYXNlZCBvbiB0aGUgZGVmYXVsdCBmdGRlYnVnLmMsCi0gICAqIHJlcGxhY2VkIHZwcmludGYoKSB3aXRoIEtWUHJpbnRGKCksCi0gICAqIGNvbW1lbnRlZCBvdXQgZXhpdCgpLAotICAgKiByZXBsYWNlZCBnZXRlbnYoKSB3aXRoIEdldFZhcigpLgotICAgKi8KLQotI2luY2x1ZGUgPGV4ZWMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlsaXR5L3RhZ2l0ZW0uaD4KLSNpbmNsdWRlIDxkb3MvZXhhbGwuaD4KLSNpbmNsdWRlIDxkb3MvdmFyLmg+Ci0jZGVmaW5lIF9fTk9MSUJCQVNFX18KLSNkZWZpbmUgX19OT0xPQkFMSUZBQ0VfXwotI2RlZmluZSBfX1VTRV9JTkxJTkVfXwotI2luY2x1ZGUgPHByb3RvL2Rvcy5oPgotI2luY2x1ZGUgPGNsaWIvZGVidWdfcHJvdG9zLmg+Ci0KLSNpZm5kZWYgX19hbWlnYW9zNF9fCi0gIGV4dGVybiBzdHJ1Y3QgTGlicmFyeSAqRE9TQmFzZTsKLSNlbHNlCi0gIGV4dGVybiBzdHJ1Y3QgRE9TSUZhY2UgKklET1M7Ci0jZW5kaWYKLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotCi0jaWYgZGVmaW5lZCggRlRfREVCVUdfTEVWRUxfRVJST1IgKQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9NZXNzYWdlKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgICAuLi4gKQotICB7Ci0gICAgdmFfbGlzdCAgYXA7Ci0KLQotICAgIHZhX3N0YXJ0KCBhcCwgZm10ICk7Ci0gICAgS1ZQcmludEYoIGZtdCwgYXAgKTsKLSAgICB2YV9lbmQoIGFwICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9QYW5pYyggY29uc3QgY2hhciogIGZtdCwKLSAgICAgICAgICAgIC4uLiApCi0gIHsKLSAgICB2YV9saXN0ICBhcDsKLQotCi0gICAgdmFfc3RhcnQoIGFwLCBmbXQgKTsKLSAgICBLVlByaW50RiggZm10LCBhcCApOwotICAgIHZhX2VuZCggYXAgKTsKLQotLyogIGV4aXQoIEVYSVRfRkFJTFVSRSApOyAqLwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBpbnQgKQotICBGVF9UaHJvdyggRlRfRXJyb3IgICAgIGVycm9yLAotICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0gICAgRlRfVU5VU0VEKCBsaW5lICk7Ci0gICAgRlRfVU5VU0VEKCBmaWxlICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLQotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gIC8qIGFycmF5IG9mIHRyYWNlIGxldmVscywgaW5pdGlhbGl6ZWQgdG8gMCAqLwotICBpbnQgIGZ0X3RyYWNlX2xldmVsc1t0cmFjZV9jb3VudF07Ci0KLQotICAvKiBkZWZpbmUgYXJyYXkgb2YgdHJhY2UgdG9nZ2xlIG5hbWVzICovCi0jZGVmaW5lIEZUX1RSQUNFX0RFRiggeCApICAjeCAsCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqICBmdF90cmFjZV90b2dnbGVzW3RyYWNlX2NvdW50ICsgMV0gPQotICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICi0gICAgTlVMTAotICB9OwotCi0jdW5kZWYgRlRfVFJBQ0VfREVGCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQgKQotICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuIHRyYWNlX2NvdW50OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyICogKQotICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKQotICB7Ci0gICAgaW50ICBtYXggPSBGVF9UcmFjZV9HZXRfQ291bnQoKTsKLQotCi0gICAgaWYgKCBpZHggPCBtYXggKQotICAgICAgcmV0dXJuIGZ0X3RyYWNlX3RvZ2dsZXNbaWR4XTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbml0aWFsaXplIHRoZSB0cmFjaW5nIHN1Yi1zeXN0ZW0uICBUaGlzIGlzIGRvbmUgYnkgcmV0cmlldmluZyB0aGUgICAgKi8KLSAgLyogdmFsdWUgb2YgdGhlIGBGVDJfREVCVUcnIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSXQgbXVzdCBiZSBhIGxpc3Qgb2YgICovCi0gIC8qIHRvZ2dsZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGA7Jywgb3IgYCwnLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhwb3J0IEZUMl9ERUJVRz0iYW55OjMgbWVtb3J5Ojcgc3RyZWFtOjUiICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIHJlcXVlc3RzIHRoYXQgYWxsIGxldmVscyBiZSBzZXQgdG8gMywgZXhjZXB0IHRoZSB0cmFjZSBsZXZlbCBmb3IgKi8KLSAgLyogdGhlIG1lbW9yeSBhbmQgc3RyZWFtIGNvbXBvbmVudHMgd2hpY2ggYXJlIHNldCB0byA3IGFuZCA1LCAgICAgICAgICAgICovCi0gIC8qIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2VlIHRoZSBmaWxlIGBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCcgZm9yIGRldGFpbHMgb2YgdGhlICovCi0gIC8qIGF2YWlsYWJsZSB0b2dnbGUgbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGxldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA3OyAwIG1lYW5zIHF1aWV0IChleGNlcHQgZm9yIHNlcmlvdXMgICovCi0gIC8qIHJ1bnRpbWUgZXJyb3JzKSwgYW5kIDcgbWVhbnMgX3ZlcnlfIHZlcmJvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKLSAgewotLyogIGNvbnN0IGNoYXIqICBmdDJfZGVidWcgPSBnZXRlbnYoICJGVDJfREVCVUciICk7ICovCi0gICAgY2hhciAgICAgICAgIGJ1ZlsyNTZdOwotICAgIGNvbnN0IGNoYXIqICBmdDJfZGVidWcgPSAmYnVmWzBdOwotCi0KLS8qICBpZiAoIGZ0Ml9kZWJ1ZyApICovCi0gICAgaWYgKCBHZXRWYXIoICJGVDJfREVCVUciLCAoU1RSUFRSKWZ0Ml9kZWJ1ZywgMjU2LCBMVl9WQVIgKSA+IDAgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqICBwID0gZnQyX2RlYnVnOwotICAgICAgY29uc3QgY2hhciogIHE7Ci0KLQotICAgICAgZm9yICggOyAqcDsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHNlcGFyYXRvcnMgKi8KLSAgICAgICAgaWYgKCAqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnLCcgfHwgKnAgPT0gJzsnIHx8ICpwID09ICc9JyApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogcmVhZCB0b2dnbGUgbmFtZSwgZm9sbG93ZWQgYnkgJzonICovCi0gICAgICAgIHEgPSBwOwotICAgICAgICB3aGlsZSAoICpwICYmICpwICE9ICc6JyApCi0gICAgICAgICAgcCsrOwotCi0gICAgICAgIGlmICggISpwICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoICpwID09ICc6JyAmJiBwID4gcSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIG4sIGksIGxlbiA9IChGVF9JbnQpKCBwIC0gcSApOwotICAgICAgICAgIEZUX0ludCAgbGV2ZWwgPSAtMSwgZm91bmQgPSAtMTsKLQotCi0gICAgICAgICAgZm9yICggbiA9IDA7IG4gPCB0cmFjZV9jb3VudDsgbisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiAgdG9nZ2xlID0gZnRfdHJhY2VfdG9nZ2xlc1tuXTsKLQotCi0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCB0b2dnbGVbaV0gIT0gcVtpXSApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggaSA9PSBsZW4gJiYgdG9nZ2xlW2ldID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmb3VuZCA9IG47Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHJlYWQgbGV2ZWwgKi8KLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgaWYgKCAqcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbGV2ZWwgPSAqcCAtICcwJzsKLSAgICAgICAgICAgIGlmICggbGV2ZWwgPCAwIHx8IGxldmVsID4gNyApCi0gICAgICAgICAgICAgIGxldmVsID0gLTE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBmb3VuZCA+PSAwICYmIGxldmVsID49IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZm91bmQgPT0gdHJhY2VfYW55ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBgYW55JyAqLwotICAgICAgICAgICAgICBmb3IgKCBuID0gMDsgbiA8IHRyYWNlX2NvdW50OyBuKysgKQotICAgICAgICAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1tuXSA9IGxldmVsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNbZm91bmRdID0gbGV2ZWw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotI2Vsc2UgIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKLSAgewotICAgIC8qIG5vdGhpbmcgKi8KLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0ludCApCi0gIEZUX1RyYWNlX0dldF9Db3VudCggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIGNvbnN0IGNoYXIgKiApCi0gIEZUX1RyYWNlX0dldF9OYW1lKCBGVF9JbnQgIGlkeCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGlkeCApOwotCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotCi0jZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLS8qCi1Mb2NhbCBWYXJpYWJsZXM6Ci1jb2Rpbmc6IGxhdGluLTEKLUVuZDoKLSovCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy9hbWlnYS9zcmMvYmFzZS9mdHN5c3RlbS5jIGIvYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0c3lzdGVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTYwZDkuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0c3lzdGVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeXN0ZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFtaWdhLXNwZWNpZmljIEZyZWVUeXBlIGxvdy1sZXZlbCBzeXN0ZW0gaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZyBhbmQgRGV0bGVmIFf8cmtuZXIuICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQW1pZ2EgaW50ZXJmYWNlIHVzZWQgYnkgRnJlZVR5cGUgdG8gYWNjZXNzICAgICAqLwotICAvKiBsb3ctbGV2ZWwsIGkuZS4gbWVtb3J5IG1hbmFnZW1lbnQsIGkvbyBhY2Nlc3MgYXMgd2VsbCBhcyB0aHJlYWQgICAgICAgKi8KLSAgLyogc3luY2hyb25pc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWFpbnRhaW5lZCBieSBEZXRsZWYgV/xya25lciA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgZnRzeXN0ZW0uYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogbW9kaWZpZWQgdG8gYXZvaWQgZm9wZW4oKSwgZmNsb3NlKCksIGZyZWFkKCksIGZzZWVrKCksIGZ0ZWxsKCksICAgICAgICovCi0gIC8qIG1hbGxvYygpLCByZWFsbG9jKCksIGFuZCBmcmVlKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhvc2UgQyBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgb2Z0ZW4gbm90IHRocmVhZC1zYWZlIG9yIGNhbnQgYmUgICAgICAgICovCi0gIC8qIHVzZWQgaW4gYSBzaGFyZWQgQW1pZ2EgbGlicmFyeS4gSWYgdGhhdCdzIG5vdCBhIHByb2JsZW0gZm9yIHlvdSwgICAgICAgKi8KLSAgLyogeW91IGNhbiBvZiBjb3Vyc2UgdXNlIHRoZSBkZWZhdWx0IGZ0c3lzdGVtLmMgd2l0aCBDIGxpYnJhcnkgY2FsbHMgICAgICovCi0gIC8qIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBleGVjIFYzOSsgYmVjYXVzZSBpdCB1c2VzIEFsbG9jUG9vbGVkKCkgZXRjICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBfX05PTElCQkFTRV9fCi0jZGVmaW5lIF9fTk9HTE9CQUxJRkFDRV9fCi0jZGVmaW5lIF9fVVNFX0lOTElORV9fCi0jaW5jbHVkZSA8cHJvdG8vZXhlYy5oPgotI2luY2x1ZGUgPGRvcy9zdGRpby5oPgotI2luY2x1ZGUgPHByb3RvL2Rvcy5oPgotI2lmZGVmIF9fYW1pZ2FvczRfXwotZXh0ZXJuIHN0cnVjdCBFeGVjSUZhY2UgKklFeGVjOwotZXh0ZXJuIHN0cnVjdCBET1NJRmFjZSAgKklET1M7Ci0jZWxzZQotZXh0ZXJuIHN0cnVjdCBMaWJyYXJ5ICAgKlN5c0Jhc2U7Ci1leHRlcm4gc3RydWN0IExpYnJhcnkgICAqRE9TQmFzZTsKLSNlbmRpZgotCi0jZGVmaW5lIElPQlVGX1NJWkUgNTEyCi0KLS8qIHN0cnVjdHVyZSB0aGF0IGhlbHBzIHVzIHRvIGF2b2lkCi0gKiB1c2VsZXNzIGNhbGxzIG9mIFNlZWsoKSBhbmQgUmVhZCgpCi0gKi8KLXN0cnVjdCBTeXNGaWxlCi17Ci0gIEJQVFIgIGZpbGU7Ci0gIFVMT05HIGlvYnVmX3N0YXJ0OwotICBVTE9ORyBpb2J1Zl9lbmQ7Ci0gIFVCWVRFIGlvYnVmW0lPQlVGX1NJWkVdOwotfTsKLQotI2lmbmRlZiBfX2FtaWdhb3M0X18KLS8qIEMgaW1wbGVtZW50YXRpb24gb2YgQWxsb2NWZWNQb29sZWQgKHNlZSBhdXRvZG9jIGV4ZWMvQWxsb2NQb29sZWQpICovCi1BUFRSCi1BbGxvY19WZWNQb29sZWQoIEFQVFIgICBwb29sSGVhZGVyLAotICAgICAgICAgICAgICAgICBVTE9ORyAgbWVtU2l6ZSApCi17Ci0gIFVMT05HICBuZXdTaXplID0gbWVtU2l6ZSArIHNpemVvZiAoIFVMT05HICk7Ci0gIFVMT05HICAqbWVtID0gQWxsb2NQb29sZWQoIHBvb2xIZWFkZXIsIG5ld1NpemUgKTsKLQotICBpZiAoICFtZW0gKQotICAgIHJldHVybiBOVUxMOwotICAqbWVtID0gbmV3U2l6ZTsKLSAgcmV0dXJuIG1lbSArIDE7Ci19Ci0KLS8qIEMgaW1wbGVtZW50YXRpb24gb2YgRnJlZVZlY1Bvb2xlZCAoc2VlIGF1dG9kb2MgZXhlYy9BbGxvY1Bvb2xlZCkgKi8KLXZvaWQKLUZyZWVfVmVjUG9vbGVkKCBBUFRSICBwb29sSGVhZGVyLAotICAgICAgICAgICAgICAgIEFQVFIgIG1lbW9yeSApCi17Ci0gIFVMT05HICAqcmVhbG1lbSA9IChVTE9ORyAqKW1lbW9yeSAtIDE7Ci0KLSAgRnJlZVBvb2xlZCggcG9vbEhlYWRlciwgcmVhbG1lbSwgKnJlYWxtZW0gKTsKLX0KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgTUVNT1JZIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkbyBhbnkgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSAgICAgICAgICAgICAgICAgICovCi0gIC8qIGFsbG9jYXRpb24tcmVsYXRlZCBmdW5jdGlvbnMuICBUaGlzIGlzIGRvbmUgYnkgdGhlIGhpZ2hlciBsZXZlbCAgICAgICAqLwotICAvKiByb3V0aW5lcyBsaWtlIGZ0X21lbV9hbGxvYygpIG9yIGZ0X21lbV9yZWFsbG9jKCkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgOjogVGhlIHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWRkcmVzcyBvZiBuZXdseSBhbGxvY2F0ZWQgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCogKQotICBmdF9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICBsb25nICAgICAgIHNpemUgKQotICB7Ci0jaWZkZWYgX19hbWlnYW9zNF9fCi0gICAgcmV0dXJuIEFsbG9jVmVjUG9vbGVkKCBtZW1vcnktPnVzZXIsIHNpemUgKTsKLSNlbHNlCi0gICAgcmV0dXJuIEFsbG9jX1ZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBzaXplICk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1lbW9yeSByZWFsbG9jYXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJfc2l6ZSA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5ld19zaXplIDo6IFRoZSBuZXdseSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxvY2sgICAgOjogVGhlIGN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgYmxvY2sgaW4gbWVtb3J5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHJlYWxsb2NhdGVkIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkKLSAgZnRfcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsCi0gICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQotICB7Ci0gICAgdm9pZCogbmV3X2Jsb2NrOwotCi0jaWZkZWYgX19hbWlnYW9zNF9fCi0gICAgbmV3X2Jsb2NrID0gQWxsb2NWZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIG5ld19zaXplICk7Ci0jZWxzZQotICAgIG5ld19ibG9jayA9IEFsbG9jX1ZlY1Bvb2xlZCAoIG1lbW9yeS0+dXNlciwgbmV3X3NpemUgKTsKLSNlbmRpZgotICAgIGlmICggbmV3X2Jsb2NrICE9IE5VTEwgKQotICAgIHsKLSAgICAgIENvcHlNZW0gKCBibG9jaywgbmV3X2Jsb2NrLAotICAgICAgICAgICAgICAgICggbmV3X3NpemUgPiBjdXJfc2l6ZSApID8gY3VyX3NpemUgOiBuZXdfc2l6ZSApOwotI2lmZGVmIF9fYW1pZ2FvczRfXwotICAgICAgRnJlZVZlY1Bvb2xlZCAoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsKLSNlbHNlCi0gICAgICBGcmVlX1ZlY1Bvb2xlZCAoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsKLSNlbmRpZgotICAgIH0KLSAgICByZXR1cm4gbmV3X2Jsb2NrOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVtb3J5IHJlbGVhc2UgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgIDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsb2NrICAgOjogVGhlIGFkZHJlc3Mgb2YgYmxvY2sgaW4gbWVtb3J5IHRvIGJlIGZyZWVkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfZnJlZSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQotICB7Ci0jaWZkZWYgX19hbWlnYW9zNF9fCi0gICAgRnJlZVZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBibG9jayApOwotI2Vsc2UKLSAgICBGcmVlX1ZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBibG9jayApOwotI2VuZGlmCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCi0KLSAgLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRklMRSBmb3IgY29udmVuaWVuY2UgdG8gZXh0cmFjdCB0aGUgICAgICAgKi8KLSAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8KLSNkZWZpbmUgU1RSRUFNX0ZJTEUoIHN0cmVhbSApICAoIChzdHJ1Y3QgU3lzRmlsZSAqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2FtaWdhX3N0cmVhbV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmdW5jdGlvbiB0byBjbG9zZSBhIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBzdHJ1Y3QgU3lzRmlsZSogc3lzZmlsZTsKLQotICAgIHN5c2ZpbGUgPSBTVFJFQU1fRklMRSggc3RyZWFtICk7Ci0gICAgQ2xvc2UgKCBzeXNmaWxlLT5maWxlICk7Ci0gICAgRnJlZU1lbSAoIHN5c2ZpbGUsIHNpemVvZiAoIHN0cnVjdCBTeXNGaWxlICkpOwotCi0gICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwotICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2FtaWdhX3N0cmVhbV9pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0IDo6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBzdHJlYW0gdG8gc3RhcnQgcmVhZGluZy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB1bnNpZ25lZCBsb25nICkKLSAgZnRfYW1pZ2Ffc3RyZWFtX2lvKCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKQotICB7Ci0gICAgc3RydWN0IFN5c0ZpbGUqIHN5c2ZpbGU7Ci0gICAgdW5zaWduZWQgbG9uZyAgIHJlYWRfYnl0ZXM7Ci0KLSAgICBpZiAoIGNvdW50ICE9IDAgKQotICAgIHsKLSAgICAgIHN5c2ZpbGUgPSBTVFJFQU1fRklMRSggc3RyZWFtICk7Ci0KLSAgICAgIC8qIGhhbmRsZSB0aGUgc2VlayAqLwotICAgICAgaWYgKCAob2Zmc2V0IDwgc3lzZmlsZS0+aW9idWZfc3RhcnQpIHx8IChvZmZzZXQgKyBjb3VudCA+IHN5c2ZpbGUtPmlvYnVmX2VuZCkgKQotICAgICAgewotICAgICAgICAvKiByZXF1ZXN0ZWQgb2Zmc2V0IGltcGxpZXMgd2UgbmVlZCBhIGJ1ZmZlciByZWZpbGwgKi8KLSAgICAgICAgaWYgKCAhc3lzZmlsZS0+aW9idWZfZW5kIHx8IG9mZnNldCAhPSBzeXNmaWxlLT5pb2J1Zl9lbmQgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogYSBwaHlzaWNhbCBzZWVrIGlzIG5lY2Vzc2FyeSAqLwotICAgICAgICAgIFNlZWsoIHN5c2ZpbGUtPmZpbGUsIG9mZnNldCwgT0ZGU0VUX0JFR0lOTklORyApOwotICAgICAgICB9Ci0gICAgICAgIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0ID0gb2Zmc2V0OwotICAgICAgICBzeXNmaWxlLT5pb2J1Zl9lbmQgPSAwOyAvKiB0cmlnZ2VyIGEgYnVmZmVyIHJlZmlsbCAqLwotICAgICAgfQotCi0gICAgICAvKiBoYW5kbGUgdGhlIHJlYWQgKi8KLSAgICAgIGlmICggb2Zmc2V0ICsgY291bnQgPD0gc3lzZmlsZS0+aW9idWZfZW5kICkKLSAgICAgIHsKLSAgICAgICAgLyogd2UgaGF2ZSBidWZmZXIgYW5kIHJlcXVlc3RlZCBieXRlcyBhcmUgYWxsIGluc2lkZSBvdXIgYnVmZmVyICovCi0gICAgICAgIENvcHlNZW0oICZzeXNmaWxlLT5pb2J1ZltvZmZzZXQgLSBzeXNmaWxlLT5pb2J1Zl9zdGFydF0sIGJ1ZmZlciwgY291bnQgKTsKLSAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiAocmUpZmlsbCBidWZmZXIgKi8KLSAgICAgICAgaWYgKCBjb3VudCA8PSBJT0JVRl9TSVpFICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHJlcXVlc3RlZCBieXRlcyBpcyBhIHN1YnNldCBvZiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgcmVhZF9ieXRlcyA9IFJlYWQoIHN5c2ZpbGUtPmZpbGUsIHN5c2ZpbGUtPmlvYnVmLCBJT0JVRl9TSVpFICk7Ci0gICAgICAgICAgaWYgKCByZWFkX2J5dGVzID09IC0xVUwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGVycm9yICovCi0gICAgICAgICAgICByZWFkX2J5dGVzID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCA9IG9mZnNldCArIHJlYWRfYnl0ZXM7Ci0gICAgICAgICAgICBDb3B5TWVtKCBzeXNmaWxlLT5pb2J1ZiwgYnVmZmVyLCBjb3VudCApOwotICAgICAgICAgICAgaWYgKCByZWFkX2J5dGVzID4gY291bnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWFkX2J5dGVzID0gY291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIHdlIGFjdHVhbGx5IG5lZWQgbW9yZSB0aGFuIG91ciBidWZmZXIgY2FuIGhvbGQsIHNvIHdlIGRlY2lkZQotICAgICAgICAgICoqIHRvIGRvIGEgc2luZ2xlIGJpZyByZWFkLCBhbmQgdGhlbiBjb3B5IHRoZSBsYXN0IElPQlVGX1NJWkUKLSAgICAgICAgICAqKiBieXRlcyBvZiB0aGF0IHRvIG91ciBpbnRlcm5hbCBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLwotICAgICAgICAgIHJlYWRfYnl0ZXMgPSBSZWFkKCBzeXNmaWxlLT5maWxlLCBidWZmZXIsIGNvdW50ICk7Ci0gICAgICAgICAgaWYgKCByZWFkX2J5dGVzID09IC0xVUwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGVycm9yICovCi0gICAgICAgICAgICByZWFkX2J5dGVzID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVMT05HIGJ1ZnNpemU7Ci0KLSAgICAgICAgICAgIGJ1ZnNpemUgPSAoIHJlYWRfYnl0ZXMgPiBJT0JVRl9TSVpFICkgPyBJT0JVRl9TSVpFIDogcmVhZF9ieXRlczsKLSAgICAgICAgICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCA9IG9mZnNldCArIHJlYWRfYnl0ZXM7Ci0gICAgICAgICAgICBzeXNmaWxlLT5pb2J1Zl9zdGFydCA9IHN5c2ZpbGUtPmlvYnVmX2VuZCAtIGJ1ZnNpemU7Ci0gICAgICAgICAgICBDb3B5TWVtKCAmYnVmZmVyW3JlYWRfYnl0ZXMgLSBidWZzaXplXSAsIHN5c2ZpbGUtPmlvYnVmLCBidWZzaXplICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWFkX2J5dGVzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVhZF9ieXRlczsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9PcGVuKCBGVF9TdHJlYW0gICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApCi0gIHsKLSAgICBzdHJ1Y3QgRmlsZUluZm9CbG9jayogIGZpYjsKLSAgICBzdHJ1Y3QgU3lzRmlsZSogICAgICAgIHN5c2ZpbGU7Ci0KLQotICAgIGlmICggIXN0cmVhbSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX0hhbmRsZSApOwotCi0jaWZkZWYgX19hbWlnYW9zNF9fCi0gICAgc3lzZmlsZSA9IEFsbG9jTWVtICggc2l6ZW9mIChzdHJ1Y3QgU3lzRmlsZSApLCBNRU1GX1NIQVJFRCApOwotI2Vsc2UKLSAgICBzeXNmaWxlID0gQWxsb2NNZW0gKCBzaXplb2YgKHN0cnVjdCBTeXNGaWxlICksIE1FTUZfUFVCTElDICk7Ci0jZW5kaWYKLSAgICBpZiAoICFzeXNmaWxlICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwotICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBvcGVuIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKLQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIH0KLSAgICBzeXNmaWxlLT5maWxlID0gT3BlbiggKFNUUlBUUilmaWxlcGF0aG5hbWUsIE1PREVfT0xERklMRSApOwotICAgIGlmICggIXN5c2ZpbGUtPmZpbGUgKQotICAgIHsKLSAgICAgIEZyZWVNZW0gKCBzeXNmaWxlLCBzaXplb2YgKCBzdHJ1Y3QgU3lzRmlsZSApKTsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwotCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0gICAgfQotCi0gICAgZmliID0gQWxsb2NEb3NPYmplY3QoIERPU19GSUIsIE5VTEwgKTsKLSAgICBpZiAoICFmaWIgKQotICAgIHsKLSAgICAgIENsb3NlICggc3lzZmlsZS0+ZmlsZSApOwotICAgICAgRnJlZU1lbSAoIHN5c2ZpbGUsIHNpemVvZiAoIHN0cnVjdCBTeXNGaWxlICkpOwotICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKLSAgICAgIEZUX0VSUk9SKCggIiBjb3VsZCBub3Qgb3BlbiBgJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7Ci0KLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLSAgICB9Ci0gICAgaWYgKCAhKCBFeGFtaW5lRkgoIHN5c2ZpbGUtPmZpbGUsIGZpYiApICkgKQotICAgIHsKLSAgICAgIEZyZWVEb3NPYmplY3QoIERPU19GSUIsIGZpYiApOwotICAgICAgQ2xvc2UgKCBzeXNmaWxlLT5maWxlICk7Ci0gICAgICBGcmVlTWVtICggc3lzZmlsZSwgc2l6ZW9mICggc3RydWN0IFN5c0ZpbGUgKSk7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwotICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBvcGVuIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKLQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIH0KLSAgICBzdHJlYW0tPnNpemUgPSBmaWItPmZpYl9TaXplOwotICAgIEZyZWVEb3NPYmplY3QoIERPU19GSUIsIGZpYiApOwotCi0gICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSAodm9pZCAqKXN5c2ZpbGU7Ci0gICAgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyICAgPSAoY2hhciopZmlsZXBhdGhuYW1lOwotICAgIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0ICAgICAgID0gMDsKLSAgICBzeXNmaWxlLT5pb2J1Zl9lbmQgICAgICAgICA9IDA7Ci0gICAgc3RyZWFtLT5wb3MgICAgICAgICAgICAgICAgPSAwOwotCi0gICAgc3RyZWFtLT5yZWFkICA9IGZ0X2FtaWdhX3N0cmVhbV9pbzsKLSAgICBzdHJlYW0tPmNsb3NlID0gZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlOwotCi0gICAgaWYgKCAhc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBmdF9hbWlnYV9zdHJlYW1fY2xvc2UoIHN0cmVhbSApOwotICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKLSAgICAgIEZUX0VSUk9SKCggIiBvcGVuZWQgYCVzJyBidXQgemVyby1zaXplZFxuIiwgZmlsZXBhdGhuYW1lICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9TdHJlYW0gKTsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTEoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKLSAgICBGVF9UUkFDRTEoKCAiIG9wZW5lZCBgJXMnICglbGQgYnl0ZXMpIHN1Y2Nlc3NmdWxseVxuIiwKLSAgICAgICAgICAgICAgICBmaWxlcGF0aG5hbWUsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0KLSAgZXh0ZXJuIEZUX0ludAotICBmdF9tZW1fZGVidWdfaW5pdCggRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICBleHRlcm4gdm9pZAotICBmdF9tZW1fZGVidWdfZG9uZSggRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotI2VuZGlmCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX01lbW9yeSApCi0gIEZUX05ld19NZW1vcnkoIHZvaWQgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLQotI2lmZGVmIF9fYW1pZ2FvczRfXwotICAgIG1lbW9yeSA9IChGVF9NZW1vcnkpQWxsb2NWZWMoIHNpemVvZiAoICptZW1vcnkgKSwgTUVNRl9TSEFSRUQgKTsKLSNlbHNlCi0gICAgbWVtb3J5ID0gKEZUX01lbW9yeSlBbGxvY1ZlYyggc2l6ZW9mICggKm1lbW9yeSApLCBNRU1GX1BVQkxJQyApOwotI2VuZGlmCi0gICAgaWYgKCBtZW1vcnkgKQotICAgIHsKLSNpZmRlZiBfX2FtaWdhb3M0X18KLSAgICAgIG1lbW9yeS0+dXNlciA9IENyZWF0ZVBvb2woIE1FTUZfU0hBUkVELCAxNjM4NCwgMTYzODQgKTsKLSNlbHNlCi0gICAgICBtZW1vcnktPnVzZXIgPSBDcmVhdGVQb29sKCBNRU1GX1BVQkxJQywgMTYzODQsIDE2Mzg0ICk7Ci0jZW5kaWYKLSAgICAgIGlmICggbWVtb3J5LT51c2VyID09IE5VTEwgKQotICAgICAgewotICAgICAgICBGcmVlVmVjKCBtZW1vcnkgKTsKLSAgICAgICAgbWVtb3J5ID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbWVtb3J5LT5hbGxvYyAgID0gZnRfYWxsb2M7Ci0gICAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X3JlYWxsb2M7Ci0gICAgICAgIG1lbW9yeS0+ZnJlZSAgICA9IGZ0X2ZyZWU7Ci0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgICAgIGZ0X21lbV9kZWJ1Z19pbml0KCBtZW1vcnkgKTsKLSNlbmRpZgotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtZW1vcnk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0RvbmVfTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLSAgICBmdF9tZW1fZGVidWdfZG9uZSggbWVtb3J5ICk7Ci0jZW5kaWYKLQotICAgIERlbGV0ZVBvb2woIG1lbW9yeS0+dXNlciApOwotICAgIEZyZWVWZWMoIG1lbW9yeSApOwotICB9Ci0KLS8qCi1Mb2NhbCBWYXJpYWJsZXM6Ci1jb2Rpbmc6IGxhdGluLTEKLUVuZDoKLSovCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy9hbnNpL2Fuc2ktZGVmLm1rIGIvYnVpbGRzL2Fuc2kvYW5zaS1kZWYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzBmMjguLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2Fuc2kvYW5zaS1kZWYubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBydWxlcyBmb3IgYSBgbm9ybWFsJyBBTlNJIHN5c3RlbQotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotREVMRVRFICAgIDo9IHJtIC1mCi1DQVQgICAgICAgOj0gY2F0Ci1TRVAgICAgICAgOj0gLwotQlVJTERfRElSIDo9ICQoVE9QX0RJUikvYnVpbGRzL2Fuc2kKLVBMQVRGT1JNICA6PSBhbnNpCi0KLQotIyBUaGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQuCi0jCi0jIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgJChPQkpfRElSKTsgaG93ZXZlciwgdGhpcyBjYW4gYmUgY2hhbmdlZAotIyB0byBzdWl0IHBhcnRpY3VsYXIgbmVlZHMuCi0jCi1MSUJfRElSIDo9ICQoT0JKX0RJUikKLQotCi0jIFRoZSBuYW1lIG9mIHRoZSBmaW5hbCBsaWJyYXJ5IGZpbGUuICBOb3RlIHRoYXQgdGhlIERPUy1zcGVjaWZpYyBNYWtlZmlsZQotIyB1c2VzIGEgc2hvcnRlciAoOC4zKSBuYW1lLgotIwotTElCUkFSWSA6PSBsaWIkKFBST0pFQ1QpCi0KLQotIyBQYXRoIGluY2x1c2lvbiBmbGFnLiAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiBgLUknIHRvCi0jIHNwZWNpZnkgYW4gYWRkaXRpb25hbCBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgYC9pPScgb3IgYC1KJy4KLSMKLUkgOj0gLUkKLQotCi0jIEMgZmxhZyB1c2VkIHRvIGRlZmluZSBhIG1hY3JvIGJlZm9yZSB0aGUgY29tcGlsYXRpb24gb2YgYSBnaXZlbiBzb3VyY2UKLSMgb2JqZWN0LiAgVXN1YWxseSBpdCBpcyBgLUQnIGxpa2UgaW4gYC1EREVCVUcnLgotIwotRCA6PSAtRAotCi0KLSMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4gIE5vdGUgdGhhdAotIyB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb21waWxlIHRoZSBkZW1vIHByb2dyYW1zLCBub3QgdGhlIGxpYnJhcnkgaXRzZWxmLgotIwotTCA6PSAtbAotCi0KLSMgVGFyZ2V0IGZsYWcuCi0jCi1UIDo9IC1vJChzcGFjZSkKLQotCi0jIEMgZmxhZ3MKLSMKLSMgICBUaGVzZSBzaG91bGQgY29uY2VybjogZGVidWcgb3V0cHV0LCBvcHRpbWl6YXRpb24gJiB3YXJuaW5ncy4KLSMKLSMgICBVc2UgdGhlIEFOU0lGTEFHUyB2YXJpYWJsZSB0byBkZWZpbmUgdGhlIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gZW5mb3JlCi0jICAgQU5TSSBjb21wbGlhbmNlLgotIwotQ0ZMQUdTID89IC1jCi0KLSMgQU5TSUZMQUdTOiBQdXQgdGhlcmUgdGhlIGZsYWdzIHVzZWQgdG8gbWFrZSB5b3VyIGNvbXBpbGVyIEFOU0ktY29tcGxpYW50LgotIwotQU5TSUZMQUdTIDo9Ci0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9hbnNpL2Fuc2kubWsgYi9idWlsZHMvYW5zaS9hbnNpLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNlOGNlLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy9hbnNpL2Fuc2kubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBydWxlcyBmb3IgYSBgbm9ybWFsJyBwc2V1ZG8gQU5TSSBjb21waWxlci9zeXN0ZW0KLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvYW5zaS9hbnNpLWRlZi5tawotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci9hbnNpLWNjLm1rCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2xpbmtfc3RkLm1rCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9hdGFyaS9BVEFSSS5IIGIvYnVpbGRzL2F0YXJpL0FUQVJJLkgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGQyZWIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2F0YXJpL0FUQVJJLkgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWYgZGVmaW5lZCggR1hWQUxJRF9IXyApCi0jcHJhZ21hIHdhcm4gLWF1cyAvKiB0b28gbWFueSB1bmV2YWx1YXRlZCB2YXJpYWJsZXMgaW4gZ3h2YWxpZCAqLwotI2VuZGlmCi0KLSNpZm5kZWYgQVRBUklfSAotI2RlZmluZSBBVEFSSV9ICi0KLSNwcmFnbWEgd2FybiAtc3R1Ci0KLS8qIFB1cmVDIGRvZXNuJ3QgbGlrZSAzMmJpdCBlbnVtZXJhdGlvbnMgKi8KLQotI2lmbmRlZiBGVF9JTUFHRV9UQUcKLSNkZWZpbmUgRlRfSU1BR0VfVEFHKCB2YWx1ZSwgX3gxLCBfeDIsIF94MywgX3g0ICkgdmFsdWUKLSNlbmRpZiAvKiBGVF9JTUFHRV9UQUcgKi8KLQotI2lmbmRlZiBGVF9FTkNfVEFHCi0jZGVmaW5lIEZUX0VOQ19UQUcoIHZhbHVlLCBhLCBiLCBjLCBkICkgdmFsdWUKLSNlbmRpZiAvKiBGVF9FTkNfVEFHICovCi0KLSNlbmRpZiAvKiBBVEFSSV9IICovCmRpZmYgLS1naXQgYS9idWlsZHMvYXRhcmkvRk5hbWVzLlNJQyBiL2J1aWxkcy9hdGFyaS9GTmFtZXMuU0lDCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzY1NzE3Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9hdGFyaS9GTmFtZXMuU0lDCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogdGhlIGZvbGxvd2luZyBjaGFuZ2VzIGZpbGUgbmFtZXMgZm9yIFB1cmVDIHByb2plY3RzICovCi0KLWlmIChhcmdjID4gMCkKLXsKLQlvcmRuZXIgPSBhcmd2WzBdOwotCWlmIChiYXNlbmFtZShvcmRuZXIpID09ICIiKSAvKiBpc3QgT3JkbmVyICovCi0JewotCQlDaGFuZ2VGaWxlbmFtZXMob3JkbmVyKTsKLQl9Ci19Ci0KLXByb2MgQ2hhbmdlRmlsZW5hbWVzKGZvbGRlcikKLWxvY2FsIGksZW50cmllcyxkaXJlY3RvcnksZmlsZTsKLXsKLQllbnRyaWVzID0gZmlsZWxpc3QoZGlyZWN0b3J5LGZvbGRlcik7Ci0JZm9yIChpID0gMDsgaSA8IGVudHJpZXM7ICsraSkKLQl7Ci0JCWZpbGUgPSBkaXJlY3RvcnlbaSwwXTsKLQkJaWYgKChkaXJlY3RvcnlbaSwzXSYxNikgPiAwKSAvKiBzdWJkaXJlY3RvcnkgKi8KLQkJewotCQkJQ2hhbmdlRmlsZW5hbWVzKGZvbGRlcitmaWxlKyJcXCIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKChzdHJpY21wKHN1ZmZpeChmaWxlKSwiLmgiKT09MCl8KHN0cmljbXAoc3VmZml4KGZpbGUpLCIuYyIpPT0wKSkKLQkJCUNoYW5nZUZpbGVuYW1lKGZvbGRlcixmaWxlKTsKLQkJfQotCX0KLX0KLQotcHJvYyBDaGFuZ2VGaWxlbmFtZShwYXRoLGRhdGVpKQotbG9jYWwgbmV3ZmlsZSxlcnI7Ci17Ci0JbmV3ZmlsZT1kYXRlaTsKLQluZXdmaWxlWzBdPShuZXdmaWxlWzBdIHwgMzIpIF4gMzI7Ci0JZXJyPWZpbGVzLnJlbmFtZSgiLXEiLHBhdGgrZGF0ZWksbmV3ZmlsZSk7Ci19CmRpZmYgLS1naXQgYS9idWlsZHMvYXRhcmkvRlJFRVRZUEUuUFJKIGIvYnVpbGRzL2F0YXJpL0ZSRUVUWVBFLlBSSgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NmE1Yi4uMDAwMDAwMAotLS0gYS9idWlsZHMvYXRhcmkvRlJFRVRZUEUuUFJKCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotO0ZyZWVUeXBlIHByb2plY3QgZmlsZQotCi1GUkVFVFlQRS5MSUIKLQotLkMgWy1LIC1QIC1SIC1BXQotLkwgWy1KIC1WXQotLlMKLQotPQotCi0uLlwuLlxzcmNcYmFzZVxmdHN5c3RlbS5jCi0uLlwuLlxzcmNcYmFzZVxmdGRlYnVnLmMKLQotLi5cLi5cc3JjXGJhc2VcZnRpbml0LmMKLS4uXC4uXHNyY1xiYXNlXGZ0Z2x5cGguYwotLi5cLi5cc3JjXGJhc2VcZnRtbQotLi5cLi5cc3JjXGJhc2VcZnRiYm94Ci0KLS4uXC4uXHNyY1xiYXNlXGZ0YmFzZS5jCi0uLlwuLlxzcmNcYXV0b2hpbnRcYXV0b2hpbnQuYwotOy4uXC4uXHNyY1xjYWNoZVxmdGNhY2hlLmMKLS4uXC4uXHNyY1xjZmZcY2ZmLmMKLS4uXC4uXHNyY1xjaWRcdHlwZTFjaWQuYwotLi5cLi5cc3JjXHBzYXV4XHBzYXV4LmMKLS4uXC4uXHNyY1xwc2hpbnRlclxwc2hpbnRlci5jCi0uLlwuLlxzcmNccHNuYW1lc1xwc25hbWVzLmMKLS4uXC4uXHNyY1xyYXN0ZXJccmFzdGVyLmMKLS4uXC4uXHNyY1xzZm50XHNmbnQuYwotLi5cLi5cc3JjXHNtb290aFxzbW9vdGguYwotLi5cLi5cc3JjXHRydWV0eXBlXHRydWV0eXBlLmMKLS4uXC4uXHNyY1x0eXBlMVx0eXBlMS5jCi0uLlwuLlxzcmNcdHlwZTQyXHR5cGU0Mi5jCmRpZmYgLS1naXQgYS9idWlsZHMvYXRhcmkvUkVBRE1FLlRYVCBiL2J1aWxkcy9hdGFyaS9SRUFETUUuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmU2NTQ1Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9hdGFyaS9SRUFETUUuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotQ29tcGlsaW5nIEZyZWVUeXBlIDIgd2l0aCBQdXJlQyBjb21waWxlcgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1bU2VlIGJlbG93IGZvciBhIEdlcm1hbiB2ZXJzaW9uLl0KLQotVG8gY29tcGlsZSBGcmVlVHlwZSAyIGFzIGEgbGlicmFyeSB0aGUgZm9sbG93aW5nIGNoYW5nZXMgbXVzdCBiZSBhcHBsaWVkOgotCi0tIEFsbCAqLmMgZmlsZXMgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuCi0gIChJbiBjYXNlIEdFTVNDUklQVCBpcyBhdmFpbGFibGU6Ci0gIFNpbXBseSBkcmFnIHRoZSB3aG9sZSBGcmVlVHlwZSAyIGRpcmVjdG9yeSB0byB0aGUgZmlsZSBgRk5hbWVzLlNJQycuKQotCi0tIFlvdSBoYXZlIHRvIGNoYW5nZSB0aGUgSU5DTFVERSBkaXJlY3RvcnkgaW4gUHVyZUMncyBjb21waWxlciBvcHRpb25zCi0gIHRvIGNvbnRhaW4gYm90aCB0aGUgYElOQ0xVREUnIGFuZCBgZnJlZXR5cGUyXGluY2x1ZGUnIGRpcmVjdG9yeS4KLSAgRXhhbXBsZToKLQotICAgIElOQ0xVREU7RTpcZnJlZXR5cGUyXGluY2x1ZGUKLQotLSBUaGUgZmlsZSBgZnJlZXR5cGUyL2luY2x1ZGUvRnQyYnVpbGQuaCcgbXVzdCBiZSBwYXRjaGVkIGFzIGZvbGxvd3MgdG8KLSAgaW5jbHVkZSBBVEFSSS5IOgotCi0gICAgI2lmbmRlZiBGVDJfQlVJTERfR0VORVJJQ19IXwotICAgICNkZWZpbmUgRlQyX0JVSUxEX0dFTkVSSUNfSF8KLQotICAgICNpbmNsdWRlICJBVEFSSS5IIgotCi0KLQotQ29tcGlsaWVyZW4gdm9uIEZyZWVUeXBlIDIgbWl0IFB1cmVDCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVW0gRnJlZVR5cGUgMiBhbHMgZWluZSBCaWJsaW90aGVrIChsaWJyYXJ5KSB6dSBjb21waWxpZXJlbiwgbXVzcyBmb2xnZW5kZXMKLWdlhG5kZXJ0IHdlcmRlbjoKLQotLSBBbGxlICouYy1maWxlcyBtgXNzZW4gbWl0IGVpbmVtIEdST1NTQlVDSFNUQUJFTiBiZWdpbm5lbi4KLSAgKEZhbGxzIEdFTVNDUklQVCB6dXIgVmVyZoFndW5nIHN0ZWh0OgotICBEZW4ga29tcGxldHRlbiBPcmRuZXIgZnJlZXR5cGUyIGF1ZiBkaWUgRGF0ZWkgYEZOYW1lcy5TSUMnIGRyYWdnZW4uKQotCi0tIEluIGRlbiBDb21waWxlci1PcHRpb25lbiB2b24gUHVyZUMgbXVzcyBkYXMgSU5DTFVERSBkaXJlY3RvcnkgYXVmIElOQ0xVREUKLSAgdW5kIGZyZWV0eXBlMlxpbmNsdWRlIHZlcndlaXNlbi4gWi5CLjoKLQotICAgIElOQ0xVREU7RTpcZnJlZXR5cGUyXGluY2x1ZGUKLQotLSBJbiBkZXIgRGF0ZWkgZnJlZXR5cGUyL2luY2x1ZGUvRnQyYnVpbGQuaCBtdXNzIHp1IEJlZ2lubgotICBlaW4gI2luY2x1ZGUgIkFUQVJJLkgiIHdpZSBmb2xndCBlaW5nZWaBZ3Qgd2VyZGVuOgotCi0gICAgI2lmbmRlZiBGVDJfQlVJTERfR0VORVJJQ19IXwotICAgICNkZWZpbmUgRlQyX0JVSUxEX0dFTkVSSUNfSF8KLQotICAgICNpbmNsdWRlICJBVEFSSS5IIgotCi0tLS0gZW5kIG9mIFJFQURNRS5UWFQgLS0tCmRpZmYgLS1naXQgYS9idWlsZHMvYXRhcmkvZGVmbGluZWpvaW5lci5hd2sgYi9idWlsZHMvYXRhcmkvZGVmbGluZWpvaW5lci5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDllNmQuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2F0YXJpL2RlZmxpbmVqb2luZXIuYXdrCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IGF3awotCi0KLWZ1bmN0aW9uIHNoaWZ0KCBhcnJheSwgXAotICAgICAgICAgICAgICAgIGp1bmssIGVsbTAsIGwgKQotewotICBlbG0wID0gYXJyYXlbMF0KLSAgZm9yICggbCA9IDA7IGwgPCBhc29ydGkoIGFycmF5LCBqdW5rICkgLSAxOyBsKysgKQotICAgIGFycmF5W2xdID0gYXJyYXlbbCsxXTsKLSAgZGVsZXRlIGFycmF5W2xdCi0gIHJldHVybiBlbG0wCi19Ci0KLQotZnVuY3Rpb24gaW5pdF9jcHBfc3JjX2xpbmUoKQotewotICBsb2dpY2FsX2xpbmUgPSAiIgotICBkZWxldGUgYnJlYWtfcG9zCi19Ci0KLQotZnVuY3Rpb24gc2hpZnRfdmFsaWRfYnAoIGFycmF5LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAganVuaywgZWxtICkKLXsKLSAgZWxtID0gLTEKLQotICBpZiAoIDAgPCBhc29ydGkoIGFycmF5LCBqdW5rICkgKQotICAgIGRvIHsKLSAgICAgIGVsbSA9IHNoaWZ0KCBhcnJheSApCi0gICAgfSB3aGlsZSAoIDAgPiBlbG0gKTsKLQotICByZXR1cm4gZWxtCi19Ci0KLQotZnVuY3Rpb24gY2hlY2tfY3BwX3NyY19saW5lX2JyZWFrX3BvcyggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwganVuayApCi17Ci0gIHByaW50ZiggImJyZWFrX3BvczoiICkKLSAgZm9yICggaSA9IDA7IGkgPCBhc29ydGkoIGJyZWFrX3BvcywganVuayApOyBpKysgKQotICAgIHByaW50ZiggIiAlZCIsIGJyZWFrX3Bvc1tpXSApOwotICBwcmludGYoICJcbiIgKQotfQotCi0KLWZ1bmN0aW9uIGNoZWNrX2NwcF9zcmNfbGluZSgpCi17Ci0gIHByaW50ZiggImxvZ2ljYWxfbGluZVslc11cbiIsIGxvZ2ljYWxfbGluZSApCi0gIGNoZWNrX2NwcF9zcmNfbGluZV9icmVha19wb3MoKQotfQotCi0KLWZ1bmN0aW9uIGFwcGVuZF9saW5lKCBwaHlzX2xpbmUsIFwKLSAgICAgICAgICAgICAgICAgICAgICBmaWx0X2xpbmUsIGJwX2xlbiApCi17Ci0gIGZpbHRfbGluZSA9IHBoeXNfbGluZQotICBzdWIoIC9cXCQvLCAiICIsIGZpbHRfbGluZSApCi0gIGxvZ2ljYWxfbGluZSAgICA9IGxvZ2ljYWxfbGluZSBmaWx0X2xpbmUKLSAgYnBfbGVuID0gYXNvcnRpKCBicmVha19wb3MsIGp1bmsgKQotICBicmVha19wb3NbYnBfbGVuXSA9IGxlbmd0aCggbG9naWNhbF9saW5lICkgLSAxCi19Ci0KLQotZnVuY3Rpb24gcHJpbnRfbGluZSggXAotICAgICAgICAgICAgICAgICAgICAgYzAsIGMxLCBpLCBqdW5rLCBwYXJ0X3N0ciApCi17Ci0gIGMwID0gMAotCi0gIHdoaWxlKCBhc29ydGkoIGJyZWFrX3BvcywganVuayApID4gMSApCi0gIHsKLSAgICBpZiAoICggYzEgPSBzaGlmdF92YWxpZF9icCggYnJlYWtfcG9zICkgKSA8IDEgKQotICAgIHsKLSAgICAgIHBhcnRfc3RyID0gc3Vic3RyKCBsb2dpY2FsX2xpbmUsIGMwICsgMSApCi0gICAgICBwcmludGYoICIlc1xuIiwgcGFydF9zdHIgKQotICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgcGFydF9zdHIgPSBzdWJzdHIoIGxvZ2ljYWxfbGluZSwgYzAgKyAxLCBjMSAtIGMwICsgMSApCi0gICAgZ3N1YiggLyAkLywgIlxcIiwgcGFydF9zdHIgKQotICAgIHByaW50ZiggIiVzXG4iLCBwYXJ0X3N0ciApCi0gICAgYzAgPSBjMSArIDEKLSAgfQotCi0gIHBhcnRfc3RyID0gc3Vic3RyKCBsb2dpY2FsX2xpbmUsIGMwICsgMSApCi0gIHByaW50ZiggIiVzXG4iLCBwYXJ0X3N0ciApCi19Ci0KLQotZnVuY3Rpb24gc2hyaW5rX3NwYWNlcyggcG9zLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWlsLCByZW1vdmVkX2xlbmd0aCwgayApCi17Ci0gIHRhaWwgPSBzdWJzdHIoIGxvZ2ljYWxfbGluZSwgcG9zICkKLSAgc3ViKCAvXlsgXHRdKy8sICIgIiwgdGFpbCApCi0gIHJlbW92ZWRfbGVuZ3RoID0gbGVuZ3RoKCBsb2dpY2FsX2xpbmUgKSAtIHBvcyAtIGxlbmd0aCggdGFpbCApICsgMQotICBsb2dpY2FsX2xpbmUgPSBzdWJzdHIoIGxvZ2ljYWxfbGluZSwgMCwgcG9zIC0gMSApIHRhaWwKLQotCi0gIGZvciAoIGsgPSAwOyBrIDwgYXNvcnRpKCBicmVha19wb3MsIGp1bmsgKTsgaysrICkKLSAgICBpZiAoICggcG9zICsgcmVtb3ZlZF9sZW5ndGggKSA8PSBicmVha19wb3Nba10gKQotICAgICAgYnJlYWtfcG9zW2tdID0gYnJlYWtfcG9zW2tdIC0gcmVtb3ZlZF9sZW5ndGg7Ci0gICAgZWxzZSBpZiAoIHBvcyA8PSBicmVha19wb3Nba10gKQotICAgICAgYnJlYWtfcG9zW2tdID0gLTE7Ci0KLSAgcmV0dXJuIHJlbW92ZWRfbGVuZ3RoCi19Ci0KLQotZnVuY3Rpb24gc2hyaW5rX3NwYWNlc190b19saW5lYnJlYWsoIHBvcywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmssIHBhcnRfc3RyLCByZW1vdmVkX2xlbmd0aCwgaSApCi17Ci0gIGZvciAoIGkgPSAwOyBpIDwgYXNvcnRpKCBicmVha19wb3MsIGp1bmsgKSAmJiBicmVha19wb3NbaV0gPCBwb3MgOyBpKysgKQotICAgIDsKLQotICBpZiAoIGJyZWFrX3Bvc1tpXSA8IDEgKQotICAgIHJldHVybjsKLQotICBwYXJ0X3N0ciA9IHN1YnN0ciggbG9naWNhbF9saW5lLCBwb3MsIGJyZWFrX3Bvc1tpXSAtIHBvcyArIDEgKQotICBzdWIoIC9eWyBcdF0rLywgIiAiLCBwYXJ0X3N0ciApCi0gIHJlbW92ZWRfbGVuZ3RoID0gKCBicmVha19wb3NbaV0gLSBwb3MgKyAxICkgLSBsZW5ndGgoIHBhcnRfc3RyICkKLQotICB0YWlsID0gc3Vic3RyKCBsb2dpY2FsX2xpbmUsIHBvcyArIHJlbW92ZWRfbGVuZ3RoICkKLSAgbG9naWNhbF9saW5lID0gc3Vic3RyKCBsb2dpY2FsX2xpbmUsIDAsIHBvcyAtIDEgKSB0YWlsCi0KLSAgZm9yICggOyBpIDwgYXNvcnRpKCBicmVha19wb3MsIGp1bmsgKTsgaSsrICkKLSAgICBicmVha19wb3NbaV0gLT0gcmVtb3ZlZF9sZW5ndGg7Ci0KLSAgcmV0dXJuIHJlbW92ZWRfbGVuZ3RoCi19Ci0KLQotZnVuY3Rpb24gZGVsZXRlX2xpbmVicmVha3NfaW5fMm5kX3Rva2VuKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCwgcGFyZW5fZGVwdGgsIGp1bmssIGksIGosIGssIGwgKQotewotICBpZiAoIGxvZ2ljYWxfbGluZSB+IC9eWyBcdF0qI1sgXHRdKmRlZmluZVsgXHRdK1swLTlBLVphLXpfXStcKC8gKQotICB7Ci0gICAgdGFpbCA9IGxvZ2ljYWxfbGluZQotICAgIHN1YiggL15bIFx0XSojWyBcdF0qZGVmaW5lWyBcdF0rWzAtOUEtWmEtel9dKy8sICIiLCB0YWlsICkKLQotICAgIHBhcmVuX2RlcHRoID0gMAotICAgIGwgPSAwCi0gICAgaSA9IGxlbmd0aCggbG9naWNhbF9saW5lICkgLSBsZW5ndGgoIHRhaWwgKSArIDEgIyBzZWVrIHRvIHRoZSAxc3Qgb3AgcGFyZW4KLSAgICBqID0gaQotICAgIGRvIHsKLSAgICAgIGlmICggc3Vic3RyKCBsb2dpY2FsX2xpbmUsIGosIDIgKSB+IC9bIFx0XVsgXHRdLyApCi0gICAgICAgIGwgPSBzaHJpbmtfc3BhY2VzKCBqICk7Ci0gICAgICBlbHNlIGlmICggc3Vic3RyKCBsb2dpY2FsX2xpbmUsIGosIDEgKSA9PSAiKCIgKQotICAgICAgICBwYXJlbl9kZXB0aCArPSAxOwotICAgICAgZWxzZSBpZiAoIHN1YnN0ciggbG9naWNhbF9saW5lLCBqLCAxICkgPT0gIikiICkKLSAgICAgICAgcGFyZW5fZGVwdGggLT0gMTsKLSAgICAgIGogKz0gMQotICAgIH0gd2hpbGUgKCBqIDwgbGVuZ3RoKCBsb2dpY2FsX2xpbmUgKSAmJiBwYXJlbl9kZXB0aCAhPSAwICkKLQotICAgIGZvciAoIGsgPSAwOyBrIDwgYXNvcnRpKCBicmVha19wb3MsIGp1bmsgKTsgaysrICkKLSAgICAgIGlmICggaSA8PSBicmVha19wb3Nba10gJiYgYnJlYWtfcG9zW2tdIDwgaiApCi0gICAgICAgIGJyZWFrX3Bvc1trXSA9IC0xOwotCi0gICAgaWYgKCBsID4gMCApCi0gICAgICBzaHJpbmtfc3BhY2VzX3RvX2xpbmVicmVhayggaiApOwotICB9Ci19Ci0KLQotQkVHSU57Ci0gIGluaXRfY3BwX3NyY19saW5lKCkKLX0KLXsKLSAgYXBwZW5kX2xpbmUoICQwICkKLSAgaWYgKCAkMCAhfiAvXFwkLyApCi0gIHsKLSAgICBkZWxldGVfbGluZWJyZWFrc19pbl8ybmRfdG9rZW4oKQotICAgIHByaW50X2xpbmUoKQotICAgIGluaXRfY3BwX3NyY19saW5lKCkKLSAgfQotfQotRU5EewotICBpZiAoIDAgPCBsZW5ndGgoIGxvZ2ljYWxfbGluZSApICkKLSAgewotICAgIGRlbGV0ZV9saW5lYnJlYWtzX2luXzJuZF90b2tlbigpCi0gICAgcHJpbnRfbGluZSgpCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1aWxkcy9hdGFyaS9nZW4tcHVyZWMtcGF0Y2guc2ggYi9idWlsZHMvYXRhcmkvZ2VuLXB1cmVjLXBhdGNoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWMwNTBjLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy9hdGFyaS9nZW4tcHVyZWMtcGF0Y2guc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIS9iaW4vc2gKLQotVE9QX0RJUj0uCi1PQkpfRElSPS4KLQotZm9yIHggaW4gIiRAIgotZG8KLSAgY2FzZSB4IiR4IiBpbgotICB4LS1zcmNkaXI9KiB8IHgtLXRvcGRpcj0qICkKLSAgICBUT1BfRElSPWBlY2hvICR4IHwgc2VkICdzL14tLVthLXpdKmRpcj0vLydgCi0gICAgOzsKLSAgeC0tYnVpbGRkaXI9KiB8IHgtLW9iamRpcj0qICkKLSAgICBPQkpfRElSPWBlY2hvICR4IHwgc2VkICdzL14tLVthLXpdKmRpcj0vLydgCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1ta2RpciAtcCAke09CSl9ESVJ9L2J1aWxkcy9hdGFyaS90bXAvb3JpZwotCi0oIGNkICR7VE9QX0RJUn0gJiYgZmluZCAuIC1uYW1lICcqLltDSGNoXScgLXR5cGUgZiB8IGZncmVwIC12IGJ1aWxkcy9hdGFyaS90bXAgfCBjcGlvIC1vICkgfCBcCi0oIGNkICR7T0JKX0RJUn0vYnVpbGRzL2F0YXJpL3RtcC9vcmlnICYmIGNwaW8gLWlkdW0gKQotY3AgJHtUT1BfRElSfS9idWlsZHMvYXRhcmkvZGVmbGluZWpvaW5lci5hd2sgJHtPQkpfRElSfS9idWlsZHMvYXRhcmkvdG1wCi0KLXB1c2hkICR7T0JKX0RJUn0vYnVpbGRzL2F0YXJpL3RtcAotCi0gIGNwIC1wciBvcmlnIHB1cmVjCi0gIGZvciBmIGluIGBjZCBvcmlnICYmIGZpbmQgLiAtdHlwZSBmYAotICBkbwotICAgIGVjaG8gZmlsdGVyICRmCi0gICAgZW52IExBTkc9QyBhd2sgLWYgZGVmbGluZWpvaW5lci5hd2sgPCBvcmlnLyRmID4gcHVyZWMvJGYKLSAgZG9uZQotCi0gIGVjaG8gJyNkZWZpbmUgRlQyX0JVSUxEX0xJQlJBUlknICA+ICBwdXJlYy9pbmNsdWRlL2Z0MmJ1aWxkLmgKLSAgZWNobyAnI2luY2x1ZGUgIkFUQVJJLkgiJyAgICAgICAgID4+IHB1cmVjL2luY2x1ZGUvZnQyYnVpbGQuaAotICBlbnYgTEFORz1DIGF3ayAtZiBkZWZsaW5lam9pbmVyLmF3ayA8IG9yaWcvaW5jbHVkZS9mdDJidWlsZC5oID4+IHB1cmVjL2luY2x1ZGUvZnQyYnVpbGQuaAotCi0gIGVudiBMQU5HPUMgZGlmZiAtdXIgb3JpZyBwdXJlYyA+IC4uL3B1cmVjLmRpZmYKLQotcG9wZAotcm0gLXJmICR7T0JKX0RJUn0vYnVpbGRzL2F0YXJpL3RtcApkaWZmIC0tZ2l0IGEvYnVpbGRzL2Jlb3MvYmVvcy1kZWYubWsgYi9idWlsZHMvYmVvcy9iZW9zLWRlZi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2ZjIzNi4uMDAwMDAwMAotLS0gYS9idWlsZHMvYmVvcy9iZW9zLWRlZi5taworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIHJ1bGVzIGZvciBhIEJlT1Mgc3lzdGVtCi0jCi0jIHRoaXMgaXMgc2ltaWxhciB0byB0aGUgImFuc2ktZGVmLm1rIiBmaWxlLCBleGNlcHQgZm9yIEJVSUxEIGFuZCBQTEFURk9STQotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotREVMRVRFICAgIDo9IHJtIC1mCi1DQVQgICAgICAgOj0gY2F0Ci1TRVAgICAgICAgOj0gLwotQlVJTERfRElSIDo9ICQoVE9QX0RJUikvYnVpbGRzL2Jlb3MKLVBMQVRGT1JNICA6PSBiZW9zCi0KLQotIyBUaGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQuCi0jCi0jIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgJChPQkpfRElSKTsgaG93ZXZlciwgdGhpcyBjYW4gYmUgY2hhbmdlZAotIyB0byBzdWl0IHBhcnRpY3VsYXIgbmVlZHMuCi0jCi1MSUJfRElSIDo9ICQoT0JKX0RJUikKLQotCi0jIFRoZSBuYW1lIG9mIHRoZSBmaW5hbCBsaWJyYXJ5IGZpbGUuICBOb3RlIHRoYXQgdGhlIERPUy1zcGVjaWZpYyBNYWtlZmlsZQotIyB1c2VzIGEgc2hvcnRlciAoOC4zKSBuYW1lLgotIwotTElCUkFSWSA6PSBsaWIkKFBST0pFQ1QpCi0KLQotIyBQYXRoIGluY2x1c2lvbiBmbGFnLiAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiBgLUknIHRvCi0jIHNwZWNpZnkgYW4gYWRkaXRpb25hbCBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgYC9pPScgb3IgYC1KJy4KLSMKLUkgOj0gLUkKLQotCi0jIEMgZmxhZyB1c2VkIHRvIGRlZmluZSBhIG1hY3JvIGJlZm9yZSB0aGUgY29tcGlsYXRpb24gb2YgYSBnaXZlbiBzb3VyY2UKLSMgb2JqZWN0LiAgVXN1YWxseSBpdCBpcyBgLUQnIGxpa2UgaW4gYC1EREVCVUcnLgotIwotRCA6PSAtRAotCi0KLSMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4gIE5vdGUgdGhhdAotIyB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb21waWxlIHRoZSBkZW1vIHByb2dyYW1zLCBub3QgdGhlIGxpYnJhcnkgaXRzZWxmLgotIwotTCA6PSAtbAotCi0KLSMgVGFyZ2V0IGZsYWcuCi0jCi1UIDo9IC1vJChzcGFjZSkKLQotCi0jIEMgZmxhZ3MKLSMKLSMgICBUaGVzZSBzaG91bGQgY29uY2VybjogZGVidWcgb3V0cHV0LCBvcHRpbWl6YXRpb24gJiB3YXJuaW5ncy4KLSMKLSMgICBVc2UgdGhlIEFOU0lGTEFHUyB2YXJpYWJsZSB0byBkZWZpbmUgdGhlIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gZW5mb3JlCi0jICAgQU5TSSBjb21wbGlhbmNlLgotIwotQ0ZMQUdTID89IC1jCi0KLSMgQU5TSUZMQUdTOiBQdXQgdGhlcmUgdGhlIGZsYWdzIHVzZWQgdG8gbWFrZSB5b3VyIGNvbXBpbGVyIEFOU0ktY29tcGxpYW50LgotIwotQU5TSUZMQUdTIDo9Ci0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9iZW9zL2Jlb3MubWsgYi9idWlsZHMvYmVvcy9iZW9zLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODFlZmU0Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9iZW9zL2Jlb3MubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBydWxlcyBmb3IgYSBCZU9TIHN5c3RlbQotIwotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2Jlb3MvYmVvcy1kZWYubWsKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvY29tcGlsZXIvYW5zaS1jYy5tawotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9saW5rX3N0ZC5tawotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvYmVvcy9kZXRlY3QubWsgYi9idWlsZHMvYmVvcy9kZXRlY3QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjZkMTAuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2Jlb3MvZGV0ZWN0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBkZXRlY3QgYW4gQmVPUyBob3N0IHBsYXRmb3JtLgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotLlBIT05ZOiBzZXR1cAotCi0KLWlmZXEgKCQoUExBVEZPUk0pLGFuc2kpCi0KLSAgaWZkZWYgQkVfSE9TVF9DUFUKLQotICAgIFBMQVRGT1JNIDo9IGJlb3MKLQotICBlbmRpZiAjIHRlc3QgTUFDSFRZUEUgYmVvcwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksYmVvcykKLQotICBERUxFVEUgICAgICA6PSBybSAtZgotICBDQVQgICAgICAgICA6PSBjYXQKLSAgU0VQICAgICAgICAgOj0gLwotICBCVUlMRF9ESVIgICA6PSAkKFRPUF9ESVIpL2J1aWxkcy9iZW9zCi0gIENPTkZJR19GSUxFIDo9IGJlb3MubWsKLQotICBzZXR1cDogc3RkX3NldHVwCi0KLWVuZGlmICAgIyB0ZXN0IFBMQVRGT1JNIGJlb3MKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NtYWtlL0ZpbmRIYXJmQnV6ei5jbWFrZSBiL2J1aWxkcy9jbWFrZS9GaW5kSGFyZkJ1enouY21ha2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTRiODIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2NtYWtlL0ZpbmRIYXJmQnV6ei5jbWFrZQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0jCi0jICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0jICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKLSMgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0jICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLSMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotIyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSMgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSMgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jCi0jIFRyeSB0byBmaW5kIEhhcmZidXp6IGluY2x1ZGUgYW5kIGxpYnJhcnkgZGlyZWN0b3JpZXMuCi0jCi0jIEFmdGVyIHN1Y2Nlc3NmdWwgZGlzY292ZXJ5LCB0aGlzIHdpbGwgc2V0IGZvciBpbmNsdXNpb24gd2hlcmUgbmVlZGVkOgotIyBIQVJGQlVaWl9JTkNMVURFX0RJUlMgLSBjb250YWluZyB0aGUgSGFyZkJ1enogaGVhZGVycwotIyBIQVJGQlVaWl9MSUJSQVJJRVMgLSBjb250YWluZyB0aGUgSGFyZkJ1enogbGlicmFyeQotCi1pbmNsdWRlKEZpbmRQa2dDb25maWcpCi0KLXBrZ19jaGVja19tb2R1bGVzKFBDX0hBUkZCVVpaIGhhcmZidXp6Pj0wLjkuNykKLQotZmluZF9wYXRoKEhBUkZCVVpaX0lOQ0xVREVfRElSUyBOQU1FUyBoYi5oCi0gICAgSElOVFMgJHtQQ19IQVJGQlVaWl9JTkNMVURFX0RJUlN9ICR7UENfSEFSRkJVWlpfSU5DTFVERURJUn0KLSkKLQotZmluZF9saWJyYXJ5KEhBUkZCVVpaX0xJQlJBUklFUyBOQU1FUyBoYXJmYnV6egotICAgIEhJTlRTICR7UENfSEFSRkJVWlpfTElCUkFSWV9ESVJTfSAke1BDX0hBUkZCVVpaX0xJQkRJUn0KLSkKLQotIyBIYXJmQnV6eiAwLjkuMTggc3BsaXQgSUNVIHN1cHBvcnQgaW50byBhIHNlcGFyYXRlIGhhcmZidXp6LWljdSBsaWJyYXJ5LgotaWYgKCIke1BDX0hBUkZCVVpaX1ZFUlNJT059IiBWRVJTSU9OX0dSRUFURVIgIjAuOS4xNyIpCi0gICAgaWYgKEhhcmZCdXp6X0ZJTkRfUkVRVUlSRUQpCi0gICAgICAgIHNldChfSEFSRkJVWlpfUkVRVUlSRUQgUkVRVUlSRUQpCi0gICAgZWxzZSAoKQotICAgICAgICBzZXQoX0hBUkZCVVpaX1JFUVVJUkVEICIiKQotICAgIGVuZGlmICgpCi0gICAgcGtnX2NoZWNrX21vZHVsZXMoUENfSEFSRkJVWlpfSUNVIGhhcmZidXp6LWljdT49MC45LjE4ICR7X0hBUkZCVVpaX1JFUVVJUkVEfSkKLSAgICBmaW5kX2xpYnJhcnkoSEFSRkJVWlpfSUNVX0xJQlJBUklFUyBOQU1FUyBoYXJmYnV6ei1pY3UKLSAgICAgICAgSElOVFMgJHtQQ19IQVJGQlVaWl9JQ1VfTElCUkFSWV9ESVJTfSAke1BDX0hBUkZCVVpaX0lDVV9MSUJESVJ9Ci0gICAgKQotICAgIGlmIChIQVJGQlVaWl9JQ1VfTElCUkFSSUVTKQotICAgICAgICBsaXN0KEFQUEVORCBIQVJGQlVaWl9MSUJSQVJJRVMgIiR7SEFSRkJVWlpfSUNVX0xJQlJBUklFU30iKQotICAgIGVuZGlmICgpCi0gICAgc2V0KF9IQVJGQlVaWl9FWFRSQV9SRVFVSVJFRF9WQVIgIkhBUkZCVVpaX0lDVV9MSUJSQVJJRVMiKQotZWxzZSAoKQotICAgIHNldChfSEFSRkJVWlpfRVhUUkFfUkVRVUlSRURfVkFSICIiKQotZW5kaWYgKCkKLQotaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKLUZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhIYXJmQnV6eiBERUZBVUxUX01TRyBIQVJGQlVaWl9JTkNMVURFX0RJUlMKLSAgICBIQVJGQlVaWl9MSUJSQVJJRVMgJHtfSEFSRkJVWlpfRVhUUkFfUkVRVUlSRURfVkFSfSkKLQotbWFya19hc19hZHZhbmNlZCgKLSAgICBIQVJGQlVaWl9JQ1VfTElCUkFSSUVTCi0gICAgSEFSRkJVWlpfSU5DTFVERV9ESVJTCi0gICAgSEFSRkJVWlpfTElCUkFSSUVTCi0pCmRpZmYgLS1naXQgYS9idWlsZHMvY21ha2UvaU9TLmNtYWtlIGIvYnVpbGRzL2NtYWtlL2lPUy5jbWFrZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxN2U2YS4uMDAwMDAwMAotLS0gYS9idWlsZHMvY21ha2UvaU9TLmNtYWtlCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSMgaU9TLmNtYWtlCi0jCi0jIENvcHlyaWdodCAyMDE0LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBXcml0dGVuIGJ5IERhdmlkIFdpbXNleSA8ZGF2aWRAd2ltc2V5LnVzPgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotIwotIwotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBmaWxlcyBgUGxhdGZvcm0vRGFyd2luLmNtYWtlJyBhbmQKLSMgYFBsYXRmb3JtL1VuaXhQYXRocy5jbWFrZScsIHdoaWNoIGFyZSBwYXJ0IG9mIENNYWtlIDIuOC40LiAgSXQgaGFzIGJlZW4KLSMgYWx0ZXJlZCBmb3IgaU9TIGRldmVsb3BtZW50LgotCi0KLSMgT3B0aW9ucwotIyAtLS0tLS0tCi0jCi0jICAgSU9TX1BMQVRGT1JNID0gT1MgfCBTSU1VTEFUT1IKLSMKLSMgICAgIFRoaXMgZGVjaWRlcyB3aGV0aGVyIFNES1MgYXJlIHNlbGVjdGVkIGZyb20gdGhlIGBpUGhvbmVPUy5wbGF0Zm9ybScgb3IKLSMgICAgIGBpUGhvbmVTaW11bGF0b3IucGxhdGZvcm0nIGZvbGRlcnMuCi0jCi0jICAgICBPUyAtIHRoZSBkZWZhdWx0LCB1c2VkIHRvIGJ1aWxkIGZvciBpUGhvbmUgYW5kIGlQYWQgcGh5c2ljYWwgZGV2aWNlcywKLSMgICAgICAgd2hpY2ggaGF2ZSBhbiBBUk0gYXJjaGl0ZWN0dXJlLgotIyAgICAgU0lNVUxBVE9SIC0gdXNlZCB0byBidWlsZCBmb3IgdGhlIFNpbXVsYXRvciBwbGF0Zm9ybXMsIHdoaWNoIGhhdmUgYW4KLSMgICAgICAgeDg2IGFyY2hpdGVjdHVyZS4KLSMKLSMgICBDTUFLRV9JT1NfREVWRUxPUEVSX1JPT1QgPSAvcGF0aC90by9wbGF0Zm9ybS9EZXZlbG9wZXIgZm9sZGVyCi0jCi0jICAgICBCeSBkZWZhdWx0LCB0aGlzIGxvY2F0aW9uIGlzIGF1dG9tYXRpY2FsbHkgY2hvc2VuIGJhc2VkIG9uIHRoZQotIyAgICAgSU9TX1BMQVRGT1JNIHZhbHVlIGFib3ZlLiAgSWYgeW91IG1hbnVhbGx5IHNldCB0aGlzIHZhcmlhYmxlLCBpdAotIyAgICAgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGFuZCBmb3JjZXMgdGhlIHVzZSBvZiBhIHBhcnRpY3VsYXIKLSMgICAgIERldmVsb3BlciBQbGF0Zm9ybS4KLSMKLSMgICBDTUFLRV9JT1NfU0RLX1JPT1QgPSAvcGF0aC90by9wbGF0Zm9ybS9EZXZlbG9wZXIvU0RLcy9TREsgZm9sZGVyCi0jCi0jICAgICBCeSBkZWZhdWx0LCB0aGlzIGxvY2F0aW9uIGlzIGF1dG9tYXRpY2FsbHkgY2hvc2VuIGJhc2VkIG9uIHRoZQotIyAgICAgQ01BS0VfSU9TX0RFVkVMT1BFUl9ST09UIHZhbHVlLiAgSW4gdGhpcyBjYXNlIGl0IGlzIGFsd2F5cyB0aGUgbW9zdAotIyAgICAgdXAtdG8tZGF0ZSBTREsgZm91bmQgaW4gdGhlIENNQUtFX0lPU19ERVZFTE9QRVJfUk9PVCBwYXRoLiAgSWYgeW91Ci0jICAgICBtYW51YWxseSBzZXQgdGhpcyB2YXJpYWJsZSwgaXQgZm9yY2VzIHRoZSB1c2Ugb2YgYSBzcGVjaWZpYyBTREsKLSMgICAgIHZlcnNpb24uCi0jCi0jCi0jIE1hY3JvcwotIyAtLS0tLS0KLSMKLSMgICBzZXRfeGNvZGVfcHJvcGVydHkgKFRBUkdFVCBYQ09ERV9QUk9QRVJUWSBYQ09ERV9WQUxVRSkKLSMKLSMgICAgIEEgY29udmVuaWVuY2UgbWFjcm8gZm9yIHNldHRpbmcgWGNvZGUgc3BlY2lmaWMgcHJvcGVydGllcyBvbiB0YXJnZXRzLgotIwotIyAgICAgRXhhbXBsZToKLSMKLSMgICAgICAgc2V0X3hjb2RlX3Byb3BlcnR5KG15aW9zbGliIElQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUICIzLjEiKQotIwotIyAgIGZpbmRfaG9zdF9wYWNrYWdlIChQUk9HUkFNIEFSR1MpCi0jCi0jICAgICBBIG1hY3JvIHRvIGZpbmQgZXhlY3V0YWJsZSBwcm9ncmFtcyBvbiB0aGUgaG9zdCBzeXN0ZW0sIG5vdCB3aXRoaW4gdGhlCi0jICAgICBpT1MgZW52aXJvbm1lbnQuICBUaGFua3MgdG8gdGhlIGBhbmRyb2lkLWNtYWtlJyBwcm9qZWN0IGZvciBwcm92aWRpbmcKLSMgICAgIHRoZSBjb21tYW5kLgotCi0KLSMgc3RhbmRhcmQgc2V0dGluZ3MKLXNldChDTUFLRV9TWVNURU1fTkFNRSBEYXJ3aW4pCi1zZXQoQ01BS0VfU1lTVEVNX1ZFUlNJT04gMSkKLXNldChVTklYIFRydWUpCi1zZXQoQVBQTEUgVHJ1ZSkKLXNldChJT1MgVHJ1ZSkKLQotIyByZXF1aXJlZCBhcyBvZiBjbWFrZSAyLjguMTAKLXNldChDTUFLRV9PU1hfREVQTE9ZTUVOVF9UQVJHRVQgIiIKLSAgQ0FDSEUgU1RSSU5HICJGb3JjZSB1bnNldCBvZiB0aGUgZGVwbG95bWVudCB0YXJnZXQgZm9yIGlPUyIgRk9SQ0UKLSkKLQotIyBkZXRlcm1pbmUgdGhlIGNtYWtlIGhvc3Qgc3lzdGVtIHZlcnNpb24gc28gd2Uga25vdyB3aGVyZSB0byBmaW5kIHRoZSBpT1MKLSMgU0RLcwotZmluZF9wcm9ncmFtKENNQUtFX1VOQU1FIHVuYW1lIC9iaW4gL3Vzci9iaW4gL3Vzci9sb2NhbC9iaW4pCi1pZiAoQ01BS0VfVU5BTUUpCi0gIGV4ZWNfcHJvZ3JhbSh1bmFtZSBBUkdTIC1yIE9VVFBVVF9WQVJJQUJMRSBDTUFLRV9IT1NUX1NZU1RFTV9WRVJTSU9OKQotICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXihbMC05XSspXFwuKFswLTldKykuKiQiICJcXDEiCi0gICAgREFSV0lOX01BSk9SX1ZFUlNJT04gIiR7Q01BS0VfSE9TVF9TWVNURU1fVkVSU0lPTn0iKQotZW5kaWYgKENNQUtFX1VOQU1FKQotCi0jIHNraXAgdGhlIHBsYXRmb3JtIGNvbXBpbGVyIGNoZWNrcyBmb3IgY3Jvc3MgY29tcGlsaW5nCi1zZXQoQ01BS0VfQ1hYX0NPTVBJTEVSX1dPUktTIFRSVUUpCi1zZXQoQ01BS0VfQ19DT01QSUxFUl9XT1JLUyBUUlVFKQotCi0jIGFsbCBpT1MvRGFyd2luIHNwZWNpZmljIHNldHRpbmdzIC0gc29tZSBtYXkgYmUgcmVkdW5kYW50Ci1zZXQoQ01BS0VfU0hBUkVEX0xJQlJBUllfUFJFRklYICJsaWIiKQotc2V0KENNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWCAiLmR5bGliIikKLXNldChDTUFLRV9TSEFSRURfTU9EVUxFX1BSRUZJWCAibGliIikKLXNldChDTUFLRV9TSEFSRURfTU9EVUxFX1NVRkZJWCAiLnNvIikKLXNldChDTUFLRV9NT0RVTEVfRVhJU1RTIDEpCi1zZXQoQ01BS0VfRExfTElCUyAiIikKLQotc2V0KENNQUtFX0NfT1NYX0NPTVBBVElCSUxJVFlfVkVSU0lPTl9GTEFHCi0gICItY29tcGF0aWJpbGl0eV92ZXJzaW9uICIpCi1zZXQoQ01BS0VfQ19PU1hfQ1VSUkVOVF9WRVJTSU9OX0ZMQUcKLSAgIi1jdXJyZW50X3ZlcnNpb24gIikKLXNldChDTUFLRV9DWFhfT1NYX0NPTVBBVElCSUxJVFlfVkVSU0lPTl9GTEFHCi0gICIke0NNQUtFX0NfT1NYX0NPTVBBVElCSUxJVFlfVkVSU0lPTl9GTEFHfSIpCi1zZXQoQ01BS0VfQ1hYX09TWF9DVVJSRU5UX1ZFUlNJT05fRkxBRwotICAiJHtDTUFLRV9DX09TWF9DVVJSRU5UX1ZFUlNJT05fRkxBR30iKQotCi0jIGhpZGRlbiB2aXNpYmlsaXR5IGlzIHJlcXVpcmVkIGZvciBjeHggb24gaU9TCi1zZXQoQ01BS0VfQ19GTEFHU19JTklUICIiKQotc2V0KENNQUtFX0NYWF9GTEFHU19JTklUCi0gICItaGVhZGVycGFkX21heF9pbnN0YWxsX25hbWVzIC1mdmlzaWJpbGl0eT1oaWRkZW4gLWZ2aXNpYmlsaXR5LWlubGluZXMtaGlkZGVuIikKLQotc2V0KENNQUtFX0NfTElOS19GTEFHUwotICAiLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QgJHtDTUFLRV9DX0xJTktfRkxBR1N9IikKLXNldChDTUFLRV9DWFhfTElOS19GTEFHUwotICAiLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QgJHtDTUFLRV9DWFhfTElOS19GTEFHU30iKQotCi1zZXQoQ01BS0VfUExBVEZPUk1fSEFTX0lOU1RBTExOQU1FIDEpCi1zZXQoQ01BS0VfU0hBUkVEX0xJQlJBUllfQ1JFQVRFX0NfRkxBR1MKLSAgIi1keW5hbWljbGliIC1oZWFkZXJwYWRfbWF4X2luc3RhbGxfbmFtZXMiKQotc2V0KENNQUtFX1NIQVJFRF9NT0RVTEVfQ1JFQVRFX0NfRkxBR1MKLSAgIi1idW5kbGUgLWhlYWRlcnBhZF9tYXhfaW5zdGFsbF9uYW1lcyIpCi1zZXQoQ01BS0VfU0hBUkVEX01PRFVMRV9MT0FERVJfQ19GTEFHCi0gICItV2wsLWJ1bmRsZV9sb2FkZXIsIikKLXNldChDTUFLRV9TSEFSRURfTU9EVUxFX0xPQURFUl9DWFhfRkxBRwotICAiLVdsLC1idW5kbGVfbG9hZGVyLCIpCi1zZXQoQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTCi0gICIuZHlsaWIiICIuc28iICIuYSIpCi0KLSMgaGFjazogSWYgYSBuZXcgY21ha2UgKHdoaWNoIHVzZXMgQ01BS0VfSU5TVEFMTF9OQU1FX1RPT0wpIHJ1bnMgb24gYW4gb2xkCi0jICAgICAgIGJ1aWxkIHRyZWUgKHdoZXJlIGBpbnN0YWxsX25hbWVfdG9vbCcgd2FzIGhhcmRjb2RlZCksIGFuZCB3aGVyZQotIyAgICAgICBDTUFLRV9JTlNUQUxMX05BTUVfVE9PTCBpc24ndCBpbiB0aGUgY2FjaGUgYW5kIHN0aWxsIGNtYWtlIGRpZG4ndAotIyAgICAgICBmYWlsIGluIGBDTWFrZUZpbmRCaW5VdGlscy5jbWFrZScgKGJlY2F1c2UgaXQgaXNuJ3QgcmVydW4pLCBoYXJkY29kZQotIyAgICAgICBDTUFLRV9JTlNUQUxMX05BTUVfVE9PTCBoZXJlIHRvIGBpbnN0YWxsX25hbWVfdG9vbCcgc28gaXQgYmVoYXZlcyBhcwotIyAgICAgICBpdCBkaWQgYmVmb3JlLgotaWYgKE5PVCBERUZJTkVEIENNQUtFX0lOU1RBTExfTkFNRV9UT09MKQotICBmaW5kX3Byb2dyYW0oQ01BS0VfSU5TVEFMTF9OQU1FX1RPT0wgaW5zdGFsbF9uYW1lX3Rvb2wpCi1lbmRpZiAoTk9UIERFRklORUQgQ01BS0VfSU5TVEFMTF9OQU1FX1RPT0wpCi0KLSMgc2V0IHVwIGlPUyBwbGF0Zm9ybSB1bmxlc3Mgc3BlY2lmaWVkIG1hbnVhbGx5IHdpdGggSU9TX1BMQVRGT1JNCi1pZiAoTk9UIERFRklORUQgSU9TX1BMQVRGT1JNKQotICBzZXQoSU9TX1BMQVRGT1JNICJPUyIpCi1lbmRpZiAoTk9UIERFRklORUQgSU9TX1BMQVRGT1JNKQotCi1zZXQoSU9TX1BMQVRGT1JNICR7SU9TX1BMQVRGT1JNfSBDQUNIRSBTVFJJTkcgIlR5cGUgb2YgaU9TIFBsYXRmb3JtIikKLQotIyBjaGVjayB0aGUgcGxhdGZvcm0gc2VsZWN0aW9uIGFuZCBzZXR1cCBmb3IgZGV2ZWxvcGVyIHJvb3QKLWlmICgke0lPU19QTEFURk9STX0gU1RSRVFVQUwgIk9TIikKLSAgc2V0KElPU19QTEFURk9STV9MT0NBVElPTiAiaVBob25lT1MucGxhdGZvcm0iKQotCi0gICMgdGhpcyBjYXVzZXMgdGhlIGluc3RhbGxlcnMgdG8gcHJvcGVybHkgbG9jYXRlIHRoZSBvdXRwdXQgbGlicmFyaWVzCi0gIHNldChDTUFLRV9YQ09ERV9FRkZFQ1RJVkVfUExBVEZPUk1TICItaXBob25lb3MiKQotCi1lbHNlaWYgKCR7SU9TX1BMQVRGT1JNfSBTVFJFUVVBTCAiU0lNVUxBVE9SIikKLSAgc2V0KElPU19QTEFURk9STV9MT0NBVElPTiAiaVBob25lU2ltdWxhdG9yLnBsYXRmb3JtIikKLQotICAjIHRoaXMgY2F1c2VzIHRoZSBpbnN0YWxsZXJzIHRvIHByb3Blcmx5IGxvY2F0ZSB0aGUgb3V0cHV0IGxpYnJhcmllcwotICBzZXQoQ01BS0VfWENPREVfRUZGRUNUSVZFX1BMQVRGT1JNUyAiLWlwaG9uZXNpbXVsYXRvciIpCi0KLWVsc2UgKCR7SU9TX1BMQVRGT1JNfSBTVFJFUVVBTCAiT1MiKQotICBtZXNzYWdlKEZBVEFMX0VSUk9SCi0gICAgIlVuc3VwcG9ydGVkIElPU19QTEFURk9STSB2YWx1ZSBzZWxlY3RlZC4gIFBsZWFzZSBjaG9vc2UgT1Mgb3IgU0lNVUxBVE9SLiIpCi0KLWVuZGlmICgke0lPU19QTEFURk9STX0gU1RSRVFVQUwgIk9TIikKLQotIyBzZXQgdXAgaU9TIGRldmVsb3BlciBsb2NhdGlvbiB1bmxlc3Mgc3BlY2lmaWVkIG1hbnVhbGx5IHdpdGgKLSMgQ01BS0VfSU9TX0RFVkVMT1BFUl9ST09UIC0tCi0jIG5vdGUgdGhhdCBYY29kZSA0LjMgY2hhbmdlZCB0aGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9uOyBjaG9vc2UgdGhlIG1vc3QKLSMgcmVjZW50IG9uZSBhdmFpbGFibGUKLXNldChYQ09ERV9QT1NUXzQzX1JPT1QKLSAgIi9BcHBsaWNhdGlvbnMvWGNvZGUuYXBwL0NvbnRlbnRzL0RldmVsb3Blci9QbGF0Zm9ybXMvJHtJT1NfUExBVEZPUk1fTE9DQVRJT059L0RldmVsb3BlciIpCi1zZXQoWENPREVfUFJFXzQzX1JPT1QKLSAgIi9EZXZlbG9wZXIvUGxhdGZvcm1zLyR7SU9TX1BMQVRGT1JNX0xPQ0FUSU9OfS9EZXZlbG9wZXIiKQotCi1pZiAoTk9UIERFRklORUQgQ01BS0VfSU9TX0RFVkVMT1BFUl9ST09UKQotICBpZiAoRVhJU1RTICR7WENPREVfUE9TVF80M19ST09UfSkKLSAgICBzZXQoQ01BS0VfSU9TX0RFVkVMT1BFUl9ST09UICR7WENPREVfUE9TVF80M19ST09UfSkKLSAgZWxzZWlmIChFWElTVFMgJHtYQ09ERV9QUkVfNDNfUk9PVH0pCi0gICAgc2V0KENNQUtFX0lPU19ERVZFTE9QRVJfUk9PVCAke1hDT0RFX1BSRV80M19ST09UfSkKLSAgZW5kaWYgKEVYSVNUUyAke1hDT0RFX1BPU1RfNDNfUk9PVH0pCi1lbmRpZiAoTk9UIERFRklORUQgQ01BS0VfSU9TX0RFVkVMT1BFUl9ST09UKQotCi1zZXQoQ01BS0VfSU9TX0RFVkVMT1BFUl9ST09UICR7Q01BS0VfSU9TX0RFVkVMT1BFUl9ST09UfQotICBDQUNIRSBQQVRIICJMb2NhdGlvbiBvZiBpT1MgUGxhdGZvcm0iCi0pCi0KLSMgZmluZCBhbmQgdXNlIHRoZSBtb3N0IHJlY2VudCBpT1MgU0RLIHVubGVzcyBzcGVjaWZpZWQgbWFudWFsbHkgd2l0aAotIyBDTUFLRV9JT1NfU0RLX1JPT1QKLWlmIChOT1QgREVGSU5FRCBDTUFLRV9JT1NfU0RLX1JPT1QpCi0gIGZpbGUoR0xPQiBfQ01BS0VfSU9TX1NES1MgIiR7Q01BS0VfSU9TX0RFVkVMT1BFUl9ST09UfS9TREtzLyoiKQotICBpZiAoX0NNQUtFX0lPU19TREtTKQotICAgIGxpc3QoU09SVCBfQ01BS0VfSU9TX1NES1MpCi0gICAgbGlzdChSRVZFUlNFIF9DTUFLRV9JT1NfU0RLUykKLSAgICBsaXN0KEdFVCBfQ01BS0VfSU9TX1NES1MgMCBDTUFLRV9JT1NfU0RLX1JPT1QpCi0gIGVsc2UgKF9DTUFLRV9JT1NfU0RLUykKLSAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCi0gICAgICAiTm8gaU9TIFNESydzIGZvdW5kIGluIGRlZmF1bHQgc2VhcmNoIHBhdGggJHtDTUFLRV9JT1NfREVWRUxPUEVSX1JPT1R9LiAgTWFudWFsbHkgc2V0IENNQUtFX0lPU19TREtfUk9PVCBvciBpbnN0YWxsIHRoZSBpT1MgU0RLLiIpCi0gIGVuZGlmIChfQ01BS0VfSU9TX1NES1MpCi0KLSAgbWVzc2FnZShTVEFUVVMgIlRvb2xjaGFpbiB1c2luZyBkZWZhdWx0IGlPUyBTREs6ICR7Q01BS0VfSU9TX1NES19ST09UfSIpCi1lbmRpZiAoTk9UIERFRklORUQgQ01BS0VfSU9TX1NES19ST09UKQotCi1zZXQoQ01BS0VfSU9TX1NES19ST09UICR7Q01BS0VfSU9TX1NES19ST09UfQotICBDQUNIRSBQQVRIICJMb2NhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgaU9TIFNESyIKLSkKLQotIyBzZXQgdGhlIHN5c3Jvb3QgZGVmYXVsdCB0byB0aGUgbW9zdCByZWNlbnQgU0RLCi1zZXQoQ01BS0VfT1NYX1NZU1JPT1QgJHtDTUFLRV9JT1NfU0RLX1JPT1R9Ci0gIENBQ0hFIFBBVEggIlN5c3Jvb3QgdXNlZCBmb3IgaU9TIHN1cHBvcnQiCi0pCi0KLSMgc2V0IHRoZSBhcmNoaXRlY3R1cmUgZm9yIGlPUyAtLQotIyBub3RlIHRoYXQgY3VycmVudGx5IGJvdGggQVJDSFNfU1RBTkRBUkRfMzJfQklUIGFuZAotIyBBUkNIU19VTklWRVJTQUxfSVBIT05FX09TIHNldCBhcm12NyBvbmx5LCBzbyBzZXQgYm90aCBtYW51YWxseQotaWYgKCR7SU9TX1BMQVRGT1JNfSBTVFJFUVVBTCAiT1MiKQotICBzZXQoSU9TX0FSQ0ggJChBUkNIU19TVEFOREFSRF8zMl82NF9CSVQpKQotZWxzZSAoJHtJT1NfUExBVEZPUk19IFNUUkVRVUFMICJPUyIpCi0gIHNldChJT1NfQVJDSCBpMzg2KQotZW5kaWYgKCR7SU9TX1BMQVRGT1JNfSBTVFJFUVVBTCAiT1MiKQotCi1zZXQoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMgJHtJT1NfQVJDSH0KLSAgQ0FDSEUgc3RyaW5nICJCdWlsZCBhcmNoaXRlY3R1cmUgZm9yIGlPUyIKLSkKLQotIyBzZXQgdGhlIGZpbmQgcm9vdCB0byB0aGUgaU9TIGRldmVsb3BlciByb290cyBhbmQgdG8gdXNlciBkZWZpbmVkIHBhdGhzCi1zZXQoQ01BS0VfRklORF9ST09UX1BBVEgKLSAgJHtDTUFLRV9JT1NfREVWRUxPUEVSX1JPT1R9Ci0gICR7Q01BS0VfSU9TX1NES19ST09UfQotICAke0NNQUtFX1BSRUZJWF9QQVRIfQotICBDQUNIRSBzdHJpbmcgICJpT1MgZmluZCBzZWFyY2ggcGF0aCByb290IgotKQotCi0jIGRlZmF1bHQgdG8gc2VhcmNoaW5nIGZvciBmcmFtZXdvcmtzIGZpcnN0Ci1zZXQoQ01BS0VfRklORF9GUkFNRVdPUksgRklSU1QpCi0KLSMgc2V0IHVwIHRoZSBkZWZhdWx0IHNlYXJjaCBkaXJlY3RvcmllcyBmb3IgZnJhbWV3b3Jrcwotc2V0KENNQUtFX1NZU1RFTV9GUkFNRVdPUktfUEFUSAotICAke0NNQUtFX0lPU19TREtfUk9PVH0vU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3JrcwotICAke0NNQUtFX0lPU19TREtfUk9PVH0vU3lzdGVtL0xpYnJhcnkvUHJpdmF0ZUZyYW1ld29ya3MKLSAgJHtDTUFLRV9JT1NfU0RLX1JPT1R9L0RldmVsb3Blci9MaWJyYXJ5L0ZyYW1ld29ya3MKLSkKLQotIyBvbmx5IHNlYXJjaCB0aGUgaU9TIFNES3MsIG5vdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBob3N0IGZpbGVzeXN0ZW0KLXNldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX1BST0dSQU0gT05MWSkKLXNldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0xJQlJBUlkgT05MWSkKLXNldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkKLQotIyB0aGlzIGxpdHRsZSBtYWNybyBsZXRzIHlvdSBzZXQgYW55IFhjb2RlIHNwZWNpZmljIHByb3BlcnR5Ci1tYWNybyhzZXRfeGNvZGVfcHJvcGVydHkgVEFSR0VUIFhDT0RFX1BST1BFUlRZIFhDT0RFX1ZBTFVFKQotICBzZXRfcHJvcGVydHkoVEFSR0VUICR7VEFSR0VUfQotICAgIFBST1BFUlRZIFhDT0RFX0FUVFJJQlVURV8ke1hDT0RFX1BST1BFUlRZfSAke1hDT0RFX1ZBTFVFfSkKLWVuZG1hY3JvKHNldF94Y29kZV9wcm9wZXJ0eSkKLQotIyB0aGlzIG1hY3JvIGxldHMgeW91IGZpbmQgZXhlY3V0YWJsZSBwcm9ncmFtcyBvbiB0aGUgaG9zdCBzeXN0ZW0KLW1hY3JvKGZpbmRfaG9zdF9wYWNrYWdlKQotICBzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9QUk9HUkFNIE5FVkVSKQotICBzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZIE5FVkVSKQotICBzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9JTkNMVURFIE5FVkVSKQotICBzZXQoSU9TIEZBTFNFKQotCi0gIGZpbmRfcGFja2FnZSgke0FSR059KQotCi0gIHNldChJT1MgVFJVRSkKLSAgc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfUFJPR1JBTSBPTkxZKQotICBzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZIE9OTFkpCi0gIHNldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkKLWVuZG1hY3JvKGZpbmRfaG9zdF9wYWNrYWdlKQotCi0jIGVvZgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NtYWtlL3Rlc3RidWlsZC5zaCBiL2J1aWxkcy9jbWFrZS90ZXN0YnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0YWRlZDcuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2NtYWtlL3Rlc3RidWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIS9iaW4vc2ggLWUKLQotIyBDb3B5cmlnaHQgMjAxNS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotIyBUaGlzIHNjcmlwdCB0ZXN0cyB0aGUgQ01ha2UgYnVpbGQuIFNpbXBseSBydW4KLSMKLSMgICAgIGJ1aWxkcy9jbWFrZS90ZXN0YnVpbGQuc2gKLSMKLSMgb3IKLSMKLSMgICAgIEJVSUxEX1NIQVJFRF9MSUJTPTEgYnVpbGRzL2NtYWtlL3Rlc3RidWlsZC5zaAotIwotIyBUaGUgc2NyaXB0OgotIwotIyAtIGJ1aWxkcyB0aGUgbWFpbiBDTWFrZUxpc3RzLnR4dAotIyAtIGJ1aWxkcyBhbmQgcnVucyBhIHNtYWxsIHRlc3QgYXBwIGluIGEgc2VwYXJhdGUgYnVpbGQgdHJlZSBzbwotIyAgIHRoZSBjb25maWctbW9kdWxlIGlzIHRlc3RlZCwgdG9vCi0jCi0jIE9wdGlvbnMgKGVudmlyb25tZW50IHZhcmlhYmxlcyk6Ci0jCi0jIC0gVGhlIHZhcmlhYmxlIEJVSUxEX1NIQVJFRF9MSUJTIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBDTWFrZSBwcm9qZWN0Ci0jICAgdGhhdCBidWlsZHMgdGhlIGxpYnJhcnkuCi0jCi0KLQotIyBwcmVwYXJlIHRlbXBvcmFyeSBkaXIKLQotY2QgYGRpcm5hbWUgJDBgLy4uLy4uCi1mdGRpcj1gcHdkYAotdG1wZGlyPS90bXAvZnJlZXR5cGUtY21ha2UtdGVzdGJ1aWxkCi1ybSAtcmYgJHRtcGRpcgotbWtkaXIgLXAgJHRtcGRpcgotCi0KLSMgYnVpbGQgYW5kIGluc3RhbGwgZnJlZXR5cGUKLQotaWYgdGVzdCAtbiAiJEJVSUxEX1NIQVJFRF9MSUJTIjsgdGhlbgotICBic2w9LURCVUlMRF9TSEFSRURfTElCUz0kQlVJTERfU0hBUkVEX0xJQlMKLWVsc2UKLSAgYnNsPS1VQlVJTERfU0hBUkVEX0xJQlMKLWZpCi0KLWJ1aWxkX29wdHM9Ii1EV0lUSF9aTElCPTAgXAotICAgICAgICAgICAgLURXSVRIX0JaaXAyPTAgXAotICAgICAgICAgICAgLURXSVRIX1BORz0wIFwKLSAgICAgICAgICAgIC1EV0lUSF9IYXJmQnV6ej0wIFwKLSAgICAgICAgICAgICRic2wgXAotICAgICAgICAgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0kdG1wZGlyL291dCIKLQotKHNldCAteDsgY21ha2UgLUgkZnRkaXIgXAotICAgICAgICAgICAgICAgLUIkdG1wZGlyL2Z0YiBcCi0gICAgICAgICAgICAgICAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgXAotICAgICAgICAgICAgICAgJGJ1aWxkX29wdHMpCi0oc2V0IC14OyBjbWFrZSAtLWJ1aWxkICR0bXBkaXIvZnRiIFwKLSAgICAgICAgICAgICAgIC0tY29uZmlnIERlYnVnIFwKLSAgICAgICAgICAgICAgIC0tdGFyZ2V0IGluc3RhbGwpCi0KLShzZXQgLXg7IGNtYWtlICR0bXBkaXIvZnRiIFwKLSAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlKQotKHNldCAteDsgY21ha2UgLS1idWlsZCAkdG1wZGlyL2Z0YiBcCi0gICAgICAgICAgICAgICAtLWNvbmZpZyBSZWxlYXNlIFwKLSAgICAgICAgICAgICAgIC0tdGFyZ2V0IGluc3RhbGwgXAotICAgICAgICAgICAgICAgLS1jbGVhbi1maXJzdCkKLQotCi0jIGNyZWF0ZSB0ZXN0IHByb2plY3QgQ01ha2VMaXN0cy50eHQKLQotY2F0ID4kdG1wZGlyL0NNYWtlTGlzdHMudHh0IDw8IEVORAotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNikKLXByb2plY3QoZnJlZXR5cGUtY21ha2UtdGVzdGJ1aWxkKQotCi1maW5kX3BhY2thZ2UoRnJlZXR5cGUgUkVRVUlSRUQgQ09ORklHKQotCi1hZGRfZXhlY3V0YWJsZShmcmVldHlwZS1jbWFrZS10ZXN0IG1haW4uYykKLXRhcmdldF9saW5rX2xpYnJhcmllcyhmcmVldHlwZS1jbWFrZS10ZXN0IGZyZWV0eXBlKQotCi1lbmFibGVfdGVzdGluZygpCi1hZGRfdGVzdChmcmVldHlwZS1jbWFrZS10ZXN0IGZyZWV0eXBlLWNtYWtlLXRlc3QpCi1FTkQKLQotCi0jIGNyZWF0ZSB0ZXN0IHByb2plY3QgbWFpbi5jCi0KLWNhdCA+JHRtcGRpci9tYWluLmMgPDwgRU5ECi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfTGlicmFyeSBsaWJyYXJ5OwotCi0KLWludCBtYWluKGludCBhcmdjLAotICAgICAgICAgY2hhciphcmd2W10pCi17Ci0gIEZUX0Vycm9yIGVycm9yOwotICBGVF9JbnQgbWFqb3IgPSAwOwotICBGVF9JbnQgbWlub3IgPSAwOwotICBGVF9JbnQgcGF0Y2ggPSAwOwotCi0gIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSgmbGlicmFyeSk7Ci0gIGlmIChlcnJvcikKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotCi0gIEZUX0xpYnJhcnlfVmVyc2lvbihsaWJyYXJ5LCAmbWFqb3IsICZtaW5vciwgJnBhdGNoKTsKLSAgaWYgKG1ham9yICE9IEZSRUVUWVBFX01BSk9SCi0gICAgICB8fCBtaW5vciAhPSBGUkVFVFlQRV9NSU5PUgotICAgICAgfHwgcGF0Y2ggIT0gRlJFRVRZUEVfUEFUQ0gpCi0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQotICBwcmludGYoIkZUX0xpYnJhcnlfVmVyc2lvbjogJWQuJWQuJWRcbiIsIG1ham9yLCBtaW5vciwgcGF0Y2gpOwotCi0gIGVycm9yID0gRlRfRG9uZV9GcmVlVHlwZShsaWJyYXJ5KTsKLSAgaWYgKGVycm9yKQotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0KLSAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KLUVORAotCi0KLSMgYnVpbGQgYW5kIHRlc3QKLQotbWtkaXIgLXAgJHRtcGRpci90YgotY2QgJHRtcGRpci90YgotCi1MRF9MSUJSQVJZX1BBVEg9JHRtcGRpci9vdXQvbGliOiRMRF9MSUJSQVJZX1BBVEgKLURZTERfTElCUkFSWV9QQVRIPSR0bXBkaXIvb3V0L2xpYjokRFlMRF9MSUJSQVJZX1BBVEgKLWV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKLWV4cG9ydCBEWUxEX0xJQlJBUllfUEFUSAotCi0oc2V0IC14OyBjbWFrZSAkdG1wZGlyIFwKLSAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyBcCi0gICAgICAgICAgICAgICAtRENNQUtFX1BSRUZJWF9QQVRIPSR0bXBkaXIvb3V0KQotKHNldCAteDsgY21ha2UgLS1idWlsZCAuIFwKLSAgICAgICAgICAgICAgIC0tY29uZmlnIERlYnVnKQotKHNldCAteDsgY3Rlc3QgLVYgLUMgRGVidWcpCi0KLShzZXQgLXg7IGNtYWtlIC4gXAotICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UpCi0oc2V0IC14OyBjbWFrZSAtLWJ1aWxkIC4gXAotICAgICAgICAgICAgICAgLS1jb25maWcgUmVsZWFzZSBcCi0gICAgICAgICAgICAgICAtLWNsZWFuLWZpcnN0KQotKHNldCAteDsgY3Rlc3QgLVYgLUMgUmVsZWFzZSkKLQotcm0gLXJmICR0bXBkaXIKLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9jb21waWxlci9hbnNpLWNjLm1rIGIvYnVpbGRzL2NvbXBpbGVyL2Fuc2ktY2MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTk2NDEuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2NvbXBpbGVyL2Fuc2ktY2MubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgZ2VuZXJpYyBwc2V1ZG8gQU5TSSBjb21waWxlcgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBDb21waWxlciBjb21tYW5kIGxpbmUgbmFtZQotIwotQ0MgICAgICAgICAgIDo9IGNjCi1DT01QSUxFUl9TRVAgOj0gJChTRVApCi0KLQotIyBUaGUgb2JqZWN0IGZpbGUgZXh0ZW5zaW9uIChmb3Igc3RhbmRhcmQgYW5kIHN0YXRpYyBsaWJyYXJpZXMpLiAgVGhpcyBjYW4gYmUKLSMgLm8sIC50Y28sIC5vYmosIGV0Yy4sIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCi0jCi1PICA6PSBvCi1TTyA6PSBvCi0KLSMgVGhlIGxpYnJhcnkgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbgotIyBiZSAuYSwgLmxpYiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLUEgIDo9IGEKLVNBIDo9IGEKLQotCi0jIFBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZmxhZyB0aGFuIGAtSScgdG8KLSMgc3BlY2lmeSBhbiBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSBgL2k9JyBvciBgLUonLgotIwotSSA6PSAtSQotCi0KLSMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuIHNvdXJjZQotIyBvYmplY3QuICBVc3VhbGx5IGl0IGlzIGAtRCcgbGlrZSBpbiBgLURERUJVRycuCi0jCi1EIDo9IC1ECi0KLQotIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLiAgTm90ZSB0aGF0Ci0jIHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdCB0aGUgbGlicmFyeSBpdHNlbGYuCi0jCi1MIDo9IC1sCi0KLQotIyBUYXJnZXQgZmxhZy4KLSMKLVQgOj0gLW8kKHNwYWNlKQotCi0KLSMgQyBmbGFncwotIwotIyAgIFRoZXNlIHNob3VsZCBjb25jZXJuOiBkZWJ1ZyBvdXRwdXQsIG9wdGltaXphdGlvbiAmIHdhcm5pbmdzLgotIwotIyAgIFVzZSB0aGUgQU5TSUZMQUdTIHZhcmlhYmxlIHRvIGRlZmluZSB0aGUgY29tcGlsZXIgZmxhZ3MgdXNlZCB0byBlbmZvcmUKLSMgICBBTlNJIGNvbXBsaWFuY2UuCi0jCi1DRkxBR1MgPz0gLWMKLQotIyBBTlNJRkxBR1M6IFB1dCB0aGVyZSB0aGUgZmxhZ3MgdXNlZCB0byBtYWtlIHlvdXIgY29tcGlsZXIgQU5TSS1jb21wbGlhbnQuCi0jCi0jICB3ZSBhc3N1bWUgdGhlIGNvbXBpbGVyIGlzIGFscmVhZHkgc3RyaWN0bHkgQU5TSQotIwotQU5TSUZMQUdTIDo9Ci0KLQotIyBMaWJyYXJ5IGxpbmtpbmcKLSMKLUNMRUFOX0xJQlJBUlkgPz0gJChERUxFVEUpICQoc3Vic3QgLywkKFNFUCksJChQUk9KRUNUX0xJQlJBUlkpKQotTElOS19MSUJSQVJZICAgPSAkKEFSKSAtciAkQCAkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCQoT0JKRUNUU19MSVNUKSkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NvbXBpbGVyL2JjYy1kZXYubWsgYi9idWlsZHMvY29tcGlsZXIvYmNjLWRldi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0M2ZkMS4uMDAwMDAwMAotLS0gYS9idWlsZHMvY29tcGlsZXIvYmNjLWRldi5taworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMKLSMgIEZyZWVUeXBlIDIgQm9ybGFuZCBDKystc3BlY2lmaWMgd2l0aCBOTyBPUFRJTUlaQVRJT05TICsgREVCVUdHSU5HCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIENvbXBpbGVyIGNvbW1hbmQgbGluZSBuYW1lCi0jCi1DQyAgICAgICAgICAgOj0gYmNjMzIKLUNPTVBJTEVSX1NFUCA6PSAkKFNFUCkKLQotCi0jIFRoZSBvYmplY3QgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbiBiZQotIyAubywgLnRjbywgLm9iaiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLU8gIDo9IG9iagotU08gOj0gb2JqCi0KLSMgVGhlIGxpYnJhcnkgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbgotIyBiZSAuYSwgLmxpYiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLUEgIDo9IGxpYgotU0EgOj0gbGliCi0KLQotIyBQYXRoIGluY2x1c2lvbiBmbGFnLiAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiBgLUknIHRvCi0jIHNwZWNpZnkgYW4gYWRkaXRpb25hbCBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgYC9pPScgb3IgYC1KJy4KLSMKLUkgOj0gLUkKLQotCi0jIEMgZmxhZyB1c2VkIHRvIGRlZmluZSBhIG1hY3JvIGJlZm9yZSB0aGUgY29tcGlsYXRpb24gb2YgYSBnaXZlbiBzb3VyY2UKLSMgb2JqZWN0LiAgVXN1YWxseSBpdCBpcyBgLUQnIGxpa2UgaW4gYC1EREVCVUcnLgotIwotRCA6PSAtRAotCi0KLSMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4gIE5vdGUgdGhhdAotIyB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb21waWxlIHRoZSBkZW1vIHByb2dyYW1zLCBub3QgdGhlIGxpYnJhcnkgaXRzZWxmLgotIwotTCA6PQotCi0KLSMgVGFyZ2V0IGZsYWcgLS0gbm8gdHJhaWxpbmcgc3BhY2UuCi0jCi1UICA6PSAtbwotVEUgOj0gLWUKLQotCi0jIEMgZmxhZ3MKLSMKLSMgICBUaGVzZSBzaG91bGQgY29uY2VybjogZGVidWcgb3V0cHV0LCBvcHRpbWl6YXRpb24gJiB3YXJuaW5ncy4KLSMKLSMgICBVc2UgdGhlIEFOU0lGTEFHUyB2YXJpYWJsZSB0byBkZWZpbmUgdGhlIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gZW5mb3JlCi0jICAgQU5TSSBjb21wbGlhbmNlLgotIwotQ0ZMQUdTID89IC1xIC1jIC15IC1kIC12IC1PZCAtdy1wYXIgLXctY2NjIC13LXJjaCAtdy1wcm8gLXctYXVzCi0KLSMgQU5TSUZMQUdTOiBQdXQgdGhlcmUgdGhlIGZsYWdzIHVzZWQgdG8gbWFrZSB5b3VyIGNvbXBpbGVyIEFOU0ktY29tcGxpYW50LgotIwotQU5TSUZMQUdTIDo9IC1BCi0KLQotIyBMaWJyYXJ5IGxpbmtpbmcKLSMKLUNMRUFOX0xJQlJBUlkgPz0gJChERUxFVEUpICQoc3Vic3QgLywkKFNFUCksJChQUk9KRUNUX0xJQlJBUlkpKQotTElOS19MSUJSQVJZICAgPSB0bGliIC91IC9QMTI4ICQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChPQkpFQ1RTX0xJU1Q6JT0rJSkpCi0KLQotIyBCb3JsYW5kIEMrKyBzcGVjaWZpYyB0ZW1wb3JhcnkgZmlsZXMKLSMKLUNMRUFOICs9IFwKLSAgICAgICAgICQoc3Vic3QgLywkKFNFUCksJChUT1BfRElSKS9hcGluYW1lcy4kKE8pKSBcCi0gICAgICAgICAkKHN1YnN0IC8sJChTRVApLCQoT0JKX0RJUikvYXBpbmFtZXMudGRzKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvYmNjLm1rIGIvYnVpbGRzL2NvbXBpbGVyL2JjYy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlMzgyOS4uMDAwMDAwMAotLS0gYS9idWlsZHMvY29tcGlsZXIvYmNjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIEJvcmxhbmQgQysrLXNwZWNpZmljIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIENvbXBpbGVyIGNvbW1hbmQgbGluZSBuYW1lCi0jCi1DQyAgICAgICAgICAgOj0gYmNjMzIKLUNPTVBJTEVSX1NFUCA6PSAkKFNFUCkKLQotCi0jIFRoZSBvYmplY3QgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbiBiZQotIyAubywgLnRjbywgLm9iaiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLU8gIDo9IG9iagotU08gOj0gb2JqCi0KLSMgVGhlIGxpYnJhcnkgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbgotIyBiZSAuYSwgLmxpYiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLUEgIDo9IGxpYgotU0EgOj0gbGliCi0KLQotIyBQYXRoIGluY2x1c2lvbiBmbGFnLiAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiBgLUknIHRvCi0jIHNwZWNpZnkgYW4gYWRkaXRpb25hbCBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgYC9pPScgb3IgYC1KJy4KLSMKLUkgOj0gLUkKLQotCi0jIEMgZmxhZyB1c2VkIHRvIGRlZmluZSBhIG1hY3JvIGJlZm9yZSB0aGUgY29tcGlsYXRpb24gb2YgYSBnaXZlbiBzb3VyY2UKLSMgb2JqZWN0LiAgVXN1YWxseSBpdCBpcyBgLUQnIGxpa2UgaW4gYC1EREVCVUcnLgotIwotRCA6PSAtRAotCi0KLSMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4gIE5vdGUgdGhhdAotIyB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb21waWxlIHRoZSBkZW1vIHByb2dyYW1zLCBub3QgdGhlIGxpYnJhcnkgaXRzZWxmLgotIwotTCA6PQotCi0KLSMgVGFyZ2V0IGZsYWcgLS0gbm8gdHJhaWxpbmcgc3BhY2UuCi0jCi1UICA6PSAtbwotVEUgOj0gLWUKLQotCi0jIEMgZmxhZ3MKLSMKLSMgICBUaGVzZSBzaG91bGQgY29uY2VybjogZGVidWcgb3V0cHV0LCBvcHRpbWl6YXRpb24gJiB3YXJuaW5ncy4KLSMKLSMgICBVc2UgdGhlIEFOU0lGTEFHUyB2YXJpYWJsZSB0byBkZWZpbmUgdGhlIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gZW5mb3JlCi0jICAgQU5TSSBjb21wbGlhbmNlLgotIwotQ0ZMQUdTID89IC1jIC1xIC15IC1kIC12IC1PZCAtdy1wYXIgLXctY2NjIC13LXJjaCAtdy1wcm8gLXctYXVzCi0KLSMgQU5TSUZMQUdTOiBQdXQgdGhlcmUgdGhlIGZsYWdzIHVzZWQgdG8gbWFrZSB5b3VyIGNvbXBpbGVyIEFOU0ktY29tcGxpYW50LgotIwotQU5TSUZMQUdTIDo9IC1BCi0KLQotIyBMaWJyYXJ5IGxpbmtpbmcKLSMKLUNMRUFOX0xJQlJBUlkgPz0gJChERUxFVEUpICQoc3Vic3QgLywkKFNFUCksJChQUk9KRUNUX0xJQlJBUlkpKQotTElOS19MSUJSQVJZICAgPSB0bGliIC91IC9QMTI4ICQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChPQkpFQ1RTX0xJU1Q6JT0rJSkpCi0KLQotIyBCb3JsYW5kIEMrKyBzcGVjaWZpYyB0ZW1wb3JhcnkgZmlsZXMKLSMKLUNMRUFOICs9IFwKLSAgICAgICAgICQoc3Vic3QgLywkKFNFUCksJChUT1BfRElSKS9hcGluYW1lcy4kKE8pKSBcCi0gICAgICAgICAkKHN1YnN0IC8sJChTRVApLCQoT0JKX0RJUikvYXBpbmFtZXMudGRzKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvZW14Lm1rIGIvYnVpbGRzL2NvbXBpbGVyL2VteC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1ZTRiYy4uMDAwMDAwMAotLS0gYS9idWlsZHMvY29tcGlsZXIvZW14Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGVteC1zcGVjaWZpYyBkZWZpbml0aW9ucwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDMtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBDb21waWxlciBjb21tYW5kIGxpbmUgbmFtZQotIwotQ0MgICAgICAgICAgIDo9IHNldCBHQ0NPUFQ9Ii1hbnNpIC1wZWRhbnRpYyI7IGdjYwotQ09NUElMRVJfU0VQIDo9IC8KLQotCi0jIFRoZSBvYmplY3QgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbiBiZQotIyAubywgLnRjbywgLm9iaiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLU8gIDo9IG8KLVNPIDo9IG8KLQotIyBUaGUgbGlicmFyeSBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuCi0jIGJlIC5hLCAubGliLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotQSAgOj0gYQotU0EgOj0gYQotCi0KLSMgUGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gYC1JJyB0bwotIyBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiAgRXhhbXBsZXMgYXJlIGAvaT0nIG9yIGAtSicuCi0jCi1JIDo9IC1JCi0KLQotIyBDIGZsYWcgdXNlZCB0byBkZWZpbmUgYSBtYWNybyBiZWZvcmUgdGhlIGNvbXBpbGF0aW9uIG9mIGEgZ2l2ZW4gc291cmNlCi0jIG9iamVjdC4gIFVzdWFsbHkgaXQgaXMgYC1EJyBsaWtlIGluIGAtRERFQlVHJy4KLSMKLUQgOj0gLUQKLQotCi0jIFRoZSBsaW5rIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGEgZ2l2ZW4gbGlicmFyeSBmaWxlIG9uIGxpbmsuICBOb3RlIHRoYXQKLSMgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY29tcGlsZSB0aGUgZGVtbyBwcm9ncmFtcywgbm90IHRoZSBsaWJyYXJ5IGl0c2VsZi4KLSMKLUwgOj0gLWwKLQotCi0jIFRhcmdldCBmbGFnLgotIwotVCA6PSAtbyQoc3BhY2UpCi0KLSMgQyBmbGFncwotIwotIyAgIFRoZXNlIHNob3VsZCBjb25jZXJuOiBkZWJ1ZyBvdXRwdXQsIG9wdGltaXphdGlvbiAmIHdhcm5pbmdzLgotIwotIyAgIFVzZSB0aGUgQU5TSUZMQUdTIHZhcmlhYmxlIHRvIGRlZmluZSB0aGUgY29tcGlsZXIgZmxhZ3MgdXNlZCB0byBlbmZvcmUKLSMgICBBTlNJIGNvbXBsaWFuY2UuCi0jCi1DRkxBR1MgPz0gLWMgLWcgLU82IC1XYWxsCi0KLSMgQU5TSUZMQUdTOiBQdXQgdGhlcmUgdGhlIGZsYWdzIHVzZWQgdG8gbWFrZSB5b3VyIGNvbXBpbGVyIEFOU0ktY29tcGxpYW50LgotIwotQU5TSUZMQUdTIDo9Ci0KLQotIyBMaWJyYXJ5IGxpbmtpbmcKLSMKLUNMRUFOX0xJQlJBUlkgPz0gJChERUxFVEUpICQoc3Vic3QgLywkKFNFUCksJChQUk9KRUNUX0xJQlJBUlkpKQotTElOS19MSUJSQVJZICAgPSAkKGZvcmVhY2ggbSwkKE9CSkVDVFNfTElTVCksJChBUikgLXIgJEAgJChtKTspIGVjaG8gPiBudWwKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NvbXBpbGVyL2djYy1kZXYubWsgYi9idWlsZHMvY29tcGlsZXIvZ2NjLWRldi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk5NGZhMi4uMDAwMDAwMAotLS0gYS9idWlsZHMvY29tcGlsZXIvZ2NjLWRldi5taworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBnY2Mtc3BlY2lmaWMgd2l0aCBOTyBPUFRJTUlaQVRJT05TICsgREVCVUdHSU5HCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIENvbXBpbGVyIGNvbW1hbmQgbGluZSBuYW1lCi0jCi1DQyAgICAgICAgICAgOj0gZ2NjCi1DT01QSUxFUl9TRVAgOj0gLwotCi0KLSMgVGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuIGJlCi0jIC5vLCAudGNvLCAub2JqLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotTyAgOj0gbwotU08gOj0gbwotCi0jIFRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uIChmb3Igc3RhbmRhcmQgYW5kIHN0YXRpYyBsaWJyYXJpZXMpLiAgVGhpcyBjYW4KLSMgYmUgLmEsIC5saWIsIGV0Yy4sIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCi0jCi1BICA6PSBhCi1TQSA6PSBhCi0KLQotIyBQYXRoIGluY2x1c2lvbiBmbGFnLiAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiBgLUknIHRvCi0jIHNwZWNpZnkgYW4gYWRkaXRpb25hbCBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgYC9pPScgb3IgYC1KJy4KLSMKLUkgOj0gLUkKLQotCi0jIEMgZmxhZyB1c2VkIHRvIGRlZmluZSBhIG1hY3JvIGJlZm9yZSB0aGUgY29tcGlsYXRpb24gb2YgYSBnaXZlbiBzb3VyY2UKLSMgb2JqZWN0LiAgVXN1YWxseSBpdCBpcyBgLUQnIGxpa2UgaW4gYC1EREVCVUcnLgotIwotRCA6PSAtRAotCi0KLSMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4gIE5vdGUgdGhhdAotIyB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb21waWxlIHRoZSBkZW1vIHByb2dyYW1zLCBub3QgdGhlIGxpYnJhcnkgaXRzZWxmLgotIwotTCA6PSAtbAotCi0KLSMgVGFyZ2V0IGZsYWcuCi0jCi1UIDo9IC1vJChzcGFjZSkKLQotCi0jIEMgZmxhZ3MKLSMKLSMgICBUaGVzZSBzaG91bGQgY29uY2VybjogZGVidWcgb3V0cHV0LCBvcHRpbWl6YXRpb24gJiB3YXJuaW5ncy4KLSMKLSMgICBVc2UgdGhlIEFOU0lGTEFHUyB2YXJpYWJsZSB0byBkZWZpbmUgdGhlIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gZW5mb3JlCi0jICAgQU5TSSBjb21wbGlhbmNlLgotIwotaWZuZGVmIENGTEFHUwotICBpZmVxICgkKGZpbmRzdHJpbmcgZysrLCQoQ0MpKSwpCi0gICAgbmVzdGVkX2V4dGVybnMgICAgOj0gLVduZXN0ZWQtZXh0ZXJucwotICAgIHN0cmljdF9wcm90b3R5cGVzIDo9IC1Xc3RyaWN0LXByb3RvdHlwZXMKLSAgZW5kaWYKLQotICBDRkxBR1MgOj0gLWMgLWcgLU8wIFwKLSAgICAgICAgICAgIC1XYWxsIFwKLSAgICAgICAgICAgIC1XIFwKLSAgICAgICAgICAgIC1XdW5kZWYgXAotICAgICAgICAgICAgLVdzaGFkb3cgXAotICAgICAgICAgICAgLVdwb2ludGVyLWFyaXRoIFwKLSAgICAgICAgICAgIC1Xd3JpdGUtc3RyaW5ncyBcCi0gICAgICAgICAgICAtV3JlZHVuZGFudC1kZWNscyBcCi0gICAgICAgICAgICAtV25vLWxvbmctbG9uZyBcCi0gICAgICAgICAgICAkKG5lc3RlZF9leHRlcm5zKSBcCi0gICAgICAgICAgICAkKHN0cmljdF9wcm90b3R5cGVzKQotZW5kaWYKLQotIyBBTlNJRkxBR1M6IFB1dCB0aGVyZSB0aGUgZmxhZ3MgdXNlZCB0byBtYWtlIHlvdXIgY29tcGlsZXIgQU5TSS1jb21wbGlhbnQuCi0jCi1BTlNJRkxBR1MgOj0gLWFuc2kgLXBlZGFudGljCi0KLQotIyBMaWJyYXJ5IGxpbmtpbmcKLSMKLUNMRUFOX0xJQlJBUlkgPz0gJChERUxFVEUpICQoc3Vic3QgLywkKFNFUCksJChQUk9KRUNUX0xJQlJBUlkpKQotTElOS19MSUJSQVJZICAgPSAkKEFSKSAtciAkQCAkKE9CSkVDVFNfTElTVCkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NvbXBpbGVyL2djYy5tayBiL2J1aWxkcy9jb21waWxlci9nY2MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjUwMzguLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2NvbXBpbGVyL2djYy5taworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBnY2Mtc3BlY2lmaWMgZGVmaW5pdGlvbnMKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgQ29tcGlsZXIgY29tbWFuZCBsaW5lIG5hbWUKLSMKLUNDICAgICAgICAgICA6PSBnY2MKLUNPTVBJTEVSX1NFUCA6PSAvCi0KLQotIyBUaGUgb2JqZWN0IGZpbGUgZXh0ZW5zaW9uIChmb3Igc3RhbmRhcmQgYW5kIHN0YXRpYyBsaWJyYXJpZXMpLiAgVGhpcyBjYW4gYmUKLSMgLm8sIC50Y28sIC5vYmosIGV0Yy4sIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCi0jCi1PICA6PSBvCi1TTyA6PSBvCi0KLSMgVGhlIGxpYnJhcnkgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbgotIyBiZSAuYSwgLmxpYiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLUEgIDo9IGEKLVNBIDo9IGEKLQotCi0jIFBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZmxhZyB0aGFuIGAtSScgdG8KLSMgc3BlY2lmeSBhbiBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSBgL2k9JyBvciBgLUonLgotIwotSSA6PSAtSQotCi0KLSMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuIHNvdXJjZQotIyBvYmplY3QuICBVc3VhbGx5IGl0IGlzIGAtRCcgbGlrZSBpbiBgLURERUJVRycuCi0jCi1EIDo9IC1ECi0KLQotIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLiAgTm90ZSB0aGF0Ci0jIHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdCB0aGUgbGlicmFyeSBpdHNlbGYuCi0jCi1MIDo9IC1sCi0KLQotIyBUYXJnZXQgZmxhZy4KLSMKLVQgOj0gLW8kKHNwYWNlKQotCi0jIEMgZmxhZ3MKLSMKLSMgICBUaGVzZSBzaG91bGQgY29uY2VybjogZGVidWcgb3V0cHV0LCBvcHRpbWl6YXRpb24gJiB3YXJuaW5ncy4KLSMKLSMgICBVc2UgdGhlIEFOU0lGTEFHUyB2YXJpYWJsZSB0byBkZWZpbmUgdGhlIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gZW5mb3JlCi0jICAgQU5TSSBjb21wbGlhbmNlLgotIwotQ0ZMQUdTID89IC1jIC1nIC1PMyAtV2FsbAotCi0jIEFOU0lGTEFHUzogUHV0IHRoZXJlIHRoZSBmbGFncyB1c2VkIHRvIG1ha2UgeW91ciBjb21waWxlciBBTlNJLWNvbXBsaWFudC4KLSMKLUFOU0lGTEFHUyA6PSAtYW5zaSAtcGVkYW50aWMKLQotCi0jIExpYnJhcnkgbGlua2luZwotIwotQ0xFQU5fTElCUkFSWSA/PSAkKERFTEVURSkgJChzdWJzdCAvLCQoU0VQKSwkKFBST0pFQ1RfTElCUkFSWSkpCi1MSU5LX0xJQlJBUlkgICA9ICQoQVIpIC1yICRAICQoT0JKRUNUU19MSVNUKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvaW50ZWxjLm1rIGIvYnVpbGRzL2NvbXBpbGVyL2ludGVsYy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3ZGI0NC4uMDAwMDAwMAotLS0gYS9idWlsZHMvY29tcGlsZXIvaW50ZWxjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIEludGVsIEMvQysrIGRlZmluaXRpb25zIChWQysrIGNvbXBhdGliaWxpdHkgbW9kZSkKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgY29tcGlsZXIgY29tbWFuZCBsaW5lIG5hbWUKLSMKLUNDICAgICAgICAgICA6PSBpY2wKLUNPTVBJTEVSX1NFUCA6PSAkKFNFUCkKLQotCi0jIFRoZSBvYmplY3QgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbiBiZQotIyAubywgLnRjbywgLm9iaiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLU8gIDo9IG9iagotU08gOj0gb2JqCi0KLQotIyBUaGUgbGlicmFyeSBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuCi0jIGJlIC5hLCAubGliLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotQSAgOj0gbGliCi1TQSA6PSBsaWIKLQotCi0jIFBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZmxhZyB0aGFuIGAtSScgdG8KLSMgc3BlY2lmeSBhbiBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSBgL2k9JyBvciBgLUonLgotIwotSSA6PSAvSQotCi0KLSMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuIHNvdXJjZQotIyBvYmplY3QuICBVc3VhbGx5IGl0IGlzIGAtRCcgbGlrZSBpbiBgLURERUJVRycuCi0jCi1EIDo9IC9ECi0KLQotIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLiAgTm90ZSB0aGF0Ci0jIHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdCB0aGUgbGlicmFyeSBpdHNlbGYuCi0jCi1MIDo9IC9GbAotCi0KLSMgVGFyZ2V0IGZsYWcuCi0jCi1UIDo9IC9GbwotVEUgOj0gL0ZlCi0KLQotIyBDIGZsYWdzCi0jCi0jICAgVGhlc2Ugc2hvdWxkIGNvbmNlcm46IGRlYnVnIG91dHB1dCwgb3B0aW1pemF0aW9uICYgd2FybmluZ3MuCi0jCi0jICAgVXNlIHRoZSBBTlNJRkxBR1MgdmFyaWFibGUgdG8gZGVmaW5lIHRoZSBjb21waWxlciBmbGFncyB1c2VkIHRvIGVuZm9yZQotIyAgIEFOU0kgY29tcGxpYW5jZS4KLSMKLSMgICBOb3RlIHRoYXQgdGhlIEludGVsIEMvQysrIGNvbXBpbGVyIHZlcnNpb24gNC41IGNvbXBsYWlucyBhYm91dAotIyAgIHRoZSB1c2Ugb2YgRlRfRklFTERfT0ZGU0VUIHdpdGggInZhbHVlIG11c3QgYmUgYXJpdGhtZXRpYyB0eXBlIiEKLSMgICBUaGlzIHJlYWxseSBsb29rcyBsaWtlIGEgYnVnIGluIHRoZSBjb21waWxlciBiZWNhdXNlIHRoZSBtYWNybwotIyAgIF9kb2VzXyBjb21wdXRlIGFuIGFyaXRobWV0aWMgdmFsdWUsIHNvIHdlIGRpc2FibGUgdGhpcyB3YXJuaW5nCi0jICAgd2l0aCAiL1F3ZDMyIi4KLSMKLUNGTEFHUyA/PSAvbm9sb2dvIC9jIC9PeCAvRzUgL1czIC9Rd2QzMgotCi0jIEFOU0lGTEFHUzogUHV0IHRoZXJlIHRoZSBmbGFncyB1c2VkIHRvIG1ha2UgeW91ciBjb21waWxlciBBTlNJLWNvbXBsaWFudC4KLSMKLUFOU0lGTEFHUyA6PSAvUWFuc2lfYWxpYXMgL1phCi0KLSMgTGlicmFyeSBsaW5raW5nCi0jCi0jQ0xFQU5fTElCUkFSWSA9Ci1MSU5LX0xJQlJBUlkgPSBsaWIgL25vbG9nbyAvb3V0OiQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChPQkpFQ1RTX0xJU1QpKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvdW5peC1sY2MubWsgYi9idWlsZHMvY29tcGlsZXIvdW5peC1sY2MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGM2MWIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2NvbXBpbGVyL3VuaXgtbGNjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFVuaXggTENDIHNwZWNpZmljIGRlZmluaXRpb25zCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIENvbW1hbmQgbGluZSBuYW1lCi0jCi1DQyAgICAgICAgICAgOj0gbGNjCi1DT01QSUxFUl9TRVAgOj0gJChTRVApCi0KLQotIyBUaGUgb2JqZWN0IGZpbGUgZXh0ZW5zaW9uIChmb3Igc3RhbmRhcmQgYW5kIHN0YXRpYyBsaWJyYXJpZXMpLiAgVGhpcyBjYW4gYmUKLSMgLm8sIC50Y28sIC5vYmosIGV0Yy4sIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCi0jCi1PICA6PSBvCi1TTyA6PSBvCi0KLQotIyBUaGUgbGlicmFyeSBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuCi0jIGJlIC5hLCAubGliLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotQSAgOj0gYQotU0EgOj0gYQotCi0KLSMgUGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gYC1JJyB0bwotIyBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiAgRXhhbXBsZXMgYXJlIGAvaT0nIG9yIGAtSicuCi0jCi1JIDo9IC1JCi0KLQotIyBDIGZsYWcgdXNlZCB0byBkZWZpbmUgYSBtYWNybyBiZWZvcmUgdGhlIGNvbXBpbGF0aW9uIG9mIGEgZ2l2ZW4gc291cmNlCi0jIG9iamVjdC4gIFVzdWFsbHkgaXQgaXMgYC1EJyBsaWtlIGluIGAtRERFQlVHJy4KLSMKLUQgOj0gLUQKLQotCi0jIFRoZSBsaW5rIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGEgZ2l2ZW4gbGlicmFyeSBmaWxlIG9uIGxpbmsuICBOb3RlIHRoYXQKLSMgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY29tcGlsZSB0aGUgZGVtbyBwcm9ncmFtcywgbm90IHRoZSBsaWJyYXJ5IGl0c2VsZi4KLSMKLUwgOj0gLWwKLQotCi0jIFRhcmdldCBmbGFnLgotIwotVCA6PSAtbyQoc3BhY2UpCi0KLQotIyBDIGZsYWdzCi0jCi0jICAgVGhlc2Ugc2hvdWxkIGNvbmNlcm46IGRlYnVnIG91dHB1dCwgb3B0aW1pemF0aW9uICYgd2FybmluZ3MuCi0jCi0jICAgVXNlIHRoZSBBTlNJRkxBR1MgdmFyaWFibGUgdG8gZGVmaW5lIHRoZSBjb21waWxlciBmbGFncyB1c2VkIHRvIGVuZm9yZQotIyAgIEFOU0kgY29tcGxpYW5jZS4KLSMKLUNGTEFHUyA/PSAtYyAtZwotCi0jIEFOU0lGTEFHUzogUHV0IHRoZXJlIHRoZSBmbGFncyB1c2VkIHRvIG1ha2UgeW91ciBjb21waWxlciBBTlNJLWNvbXBsaWFudC4KLSMKLSMgIExDQyBpcyBwdXJlIEFOU0kgYW55d2F5IQotIwotIyAgdGhlICItQSIgZmxhZyBzaW1wbHkgaW5jcmVtZW50cyB2ZXJib3NpdHkgYWJvdXQgbm9uIEFOU0kgY29kZQotIwotQU5TSUZMQUdTIDo9IC1BCi0KLQotIyBsaWJyYXJ5IGxpbmtpbmcKLSMKLUNMRUFOX0xJQlJBUlkgPz0gJChERUxFVEUpICQoUFJPSkVDVF9MSUJSQVJZKQotTElOS19MSUJSQVJZICAgPSAkKEFSKSAtciAkQCAkKE9CSkVDVFNfTElTVCkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGFnZS5tayBiL2J1aWxkcy9jb21waWxlci92aXN1YWxhZ2UubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTRmYmUuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGFnZS5taworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBWaXN1YWwgQWdlIEMrKyBzcGVjaWZpYyBkZWZpbml0aW9ucwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBjb21tYW5kIGxpbmUgY29tcGlsZXIgbmFtZQotIwotQ0MgICAgICAgICAgIDo9IGljYwotQ09NUElMRVJfU0VQIDo9ICQoU0VQKQotCi0KLSMgVGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuIGJlCi0jIC5vLCAudGNvLCAub2JqLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotTyAgOj0gb2JqCi1TTyA6PSBvYmoKLQotCi0jIFRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uIChmb3Igc3RhbmRhcmQgYW5kIHN0YXRpYyBsaWJyYXJpZXMpLiAgVGhpcyBjYW4KLSMgYmUgLmEsIC5saWIsIGV0Yy4sIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCi0jCi1BICA6PSBsaWIKLVNBIDo9IGxpYgotCi0KLSMgUGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gYC1JJyB0bwotIyBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiAgRXhhbXBsZXMgYXJlIGAvaT0nIG9yIGAtSicuCi0jCi1JIDo9IC9JCi0KLQotIyBDIGZsYWcgdXNlZCB0byBkZWZpbmUgYSBtYWNybyBiZWZvcmUgdGhlIGNvbXBpbGF0aW9uIG9mIGEgZ2l2ZW4gc291cmNlCi0jIG9iamVjdC4gIFVzdWFsbHkgaXQgaXMgYC1EJyBsaWtlIGluIGAtRERFQlVHJy4KLSMKLUQgOj0gL0QKLQotCi0jIFRoZSBsaW5rIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGEgZ2l2ZW4gbGlicmFyeSBmaWxlIG9uIGxpbmsuICBOb3RlIHRoYXQKLSMgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY29tcGlsZSB0aGUgZGVtbyBwcm9ncmFtcywgbm90IHRoZSBsaWJyYXJ5IGl0c2VsZi4KLSMKLUwgOj0gL0ZsCi0KLQotIyBUYXJnZXQgZmxhZy4KLSMKLVQgOj0gL0ZvCi0KLQotIyBDIGZsYWdzCi0jCi0jICAgVGhlc2Ugc2hvdWxkIGNvbmNlcm46IGRlYnVnIG91dHB1dCwgb3B0aW1pemF0aW9uICYgd2FybmluZ3MuCi0jCi1DRkxBR1MgPz0gL1EtIC9HZCsgL08yIC9HNSAvVzMgL0MKLQotIyBBTlNJRkxBR1M6IFB1dCB0aGVyZSB0aGUgZmxhZ3MgdXNlZCB0byBtYWtlIHlvdXIgY29tcGlsZXIgQU5TSS1jb21wbGlhbnQuCi0jCi1BTlNJX0ZMQUdTIDo9IC9TYQotCi0KLSMgTGlicmFyeSBsaW5raW5nCi0jCi0jQ0xFQU5fTElCUkFSWSA6PQotTElOS19MSUJSQVJZID0gbGliIC9ub2xvZ28gL291dDokKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQoT0JKRUNUU19MSVNUKSkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGMubWsgYi9idWlsZHMvY29tcGlsZXIvdmlzdWFsYy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2ZWNjNS4uMDAwMDAwMAotLS0gYS9idWlsZHMvY29tcGlsZXIvdmlzdWFsYy5taworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBWaXN1YWwgQysrIGRlZmluaXRpb25zCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIGNvbXBpbGVyIGNvbW1hbmQgbGluZSBuYW1lCi0jCi1DQyAgICAgICAgICAgOj0gY2wKLUNPTVBJTEVSX1NFUCA6PSAkKFNFUCkKLQotCi0jIFRoZSBvYmplY3QgZmlsZSBleHRlbnNpb24gKGZvciBzdGFuZGFyZCBhbmQgc3RhdGljIGxpYnJhcmllcykuICBUaGlzIGNhbiBiZQotIyAubywgLnRjbywgLm9iaiwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSMKLU8gIDo9IG9iagotU08gOj0gb2JqCi0KLQotIyBUaGUgbGlicmFyeSBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuCi0jIGJlIC5hLCAubGliLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotQSAgOj0gbGliCi1TQSA6PSBsaWIKLQotCi0jIFBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZmxhZyB0aGFuIGAtSScgdG8KLSMgc3BlY2lmeSBhbiBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSBgL2k9JyBvciBgLUonLgotIwotSSA6PSAvSQotCi0KLSMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuIHNvdXJjZQotIyBvYmplY3QuICBVc3VhbGx5IGl0IGlzIGAtRCcgbGlrZSBpbiBgLURERUJVRycuCi0jCi1EIDo9IC9ECi0KLQotIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLiAgTm90ZSB0aGF0Ci0jIHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdCB0aGUgbGlicmFyeSBpdHNlbGYuCi0jCi1MIDo9IC9GbAotCi0KLSMgVGFyZ2V0IGZsYWcuCi0jCi1UIDo9IC9GbwotCi0jIFRhcmdldCBleGVjdXRhYmxlIGZsYWcKLSMKLVRFIDo9IC9GZQotCi0jIEMgZmxhZ3MKLSMKLSMgICBUaGVzZSBzaG91bGQgY29uY2VybjogZGVidWcgb3V0cHV0LCBvcHRpbWl6YXRpb24gJiB3YXJuaW5ncy4KLSMKLSMgICBVc2UgdGhlIEFOU0lGTEFHUyB2YXJpYWJsZSB0byBkZWZpbmUgdGhlIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gZW5mb3JlCi0jICAgQU5TSSBjb21wbGlhbmNlLgotIwotQ0ZMQUdTID89IC9ub2xvZ28gL2MgL094IC9XMyAvV1gKLQotIyBBTlNJRkxBR1M6IFB1dCB0aGVyZSB0aGUgZmxhZ3MgdXNlZCB0byBtYWtlIHlvdXIgY29tcGlsZXIgQU5TSS1jb21wbGlhbnQuCi0jCi1BTlNJRkxBR1MgOj0gL1phIC9EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCi0KLQotIyBMaWJyYXJ5IGxpbmtpbmcKLSMKLSNDTEVBTl9MSUJSQVJZID0KLUxJTktfTElCUkFSWSAgPSBsaWIgL25vbG9nbyAvb3V0OiQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChPQkpFQ1RTX0xJU1QpKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvd2F0Y29tLm1rIGIvYnVpbGRzL2NvbXBpbGVyL3dhdGNvbS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhNDgxMS4uMDAwMDAwMAotLS0gYS9idWlsZHMvY29tcGlsZXIvd2F0Y29tLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFdhdGNvbS1zcGVjaWZpYyBkZWZpbml0aW9ucwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBDb21waWxlciBjb21tYW5kIGxpbmUgbmFtZQotIwotQ0MgICAgICAgICAgIDo9IHdjYzM4NgotQ09NUElMRVJfU0VQIDo9ICQoU0VQKQotCi0KLSMgVGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuIGJlCi0jIC5vLCAudGNvLCAub2JqLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotTyAgOj0gb2JqCi1TTyA6PSBvYmoKLQotCi0jIFRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uIChmb3Igc3RhbmRhcmQgYW5kIHN0YXRpYyBsaWJyYXJpZXMpLiAgVGhpcyBjYW4KLSMgYmUgLmEsIC5saWIsIGV0Yy4sIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCi0jCi1BICA6PSBsaWIKLVNBIDo9IGxpYgotCi0KLSMgUGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gYC1JJyB0bwotIyBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiAgRXhhbXBsZXMgYXJlIGAvaT0nIG9yIGAtSicuCi0jCi1JIDo9IC1JPQotCi0KLSMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuIHNvdXJjZQotIyBvYmplY3QuICBVc3VhbGx5IGl0IGlzIGAtRCcgbGlrZSBpbiBgLURERUJVRycuCi0jCi1EIDo9IC1ECi0KLQotIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLiAgTm90ZSB0aGF0Ci0jIHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdCB0aGUgbGlicmFyeSBpdHNlbGYuCi0jCi1MIDo9IC1sCi0KLQotIyBUYXJnZXQgZmxhZy4KLSMKLVQgOj0gLUZPPQotCi0KLSMgQyBmbGFncwotIwotIyAgIFRoZXNlIHNob3VsZCBjb25jZXJuOiBkZWJ1ZyBvdXRwdXQsIG9wdGltaXphdGlvbiAmIHdhcm5pbmdzLgotIwotIyAgIFVzZSB0aGUgQU5TSUZMQUdTIHZhcmlhYmxlIHRvIGRlZmluZSB0aGUgY29tcGlsZXIgZmxhZ3MgdXNlZCB0byBlbmZvcmUKLSMgICBBTlNJIGNvbXBsaWFuY2UuCi0jCi1DRkxBR1MgPz0gLXpxCi0KLSMgQU5TSUZMQUdTOiBQdXQgdGhlcmUgdGhlIGZsYWdzIHVzZWQgdG8gbWFrZSB5b3VyIGNvbXBpbGVyIEFOU0ktY29tcGxpYW50LgotIwotQU5TSUZMQUdTIDo9IC16YQotCi0KLSMgTGlicmFyeSBsaW5raW5nCi0jCi1DTEVBTl9MSUJSQVJZID89ICQoREVMRVRFKSAkKHN1YnN0IC8sJChTRVApLCQoUFJPSkVDVF9MSUJSQVJZKSkKLUxJTktfTElCUkFSWSAgID0gJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwgXAotICAgICAgICAgICAgICAgICAgIHdsaWIgLXEgLW4gJEA7IFwKLSAgICAgICAgICAgICAgICAgICAkKGZvcmVhY2ggbSwgJChPQkpFQ1RTX0xJU1QpLCB3bGliIC1xICRAICskKG0pOykgXAotICAgICAgICAgICAgICAgICAgIGVjaG8gPiBudWwpCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvd2luLWxjYy5tayBiL2J1aWxkcy9jb21waWxlci93aW4tbGNjLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWI0MjllLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy9jb21waWxlci93aW4tbGNjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFdpbjMyLUxDQyBzcGVjaWZpYyBkZWZpbml0aW9ucwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBDb21tYW5kIGxpbmUgbmFtZQotIwotQ0MgICAgICAgICAgIDo9IGxjYwotQ09NUElMRVJfU0VQIDo9ICQoU0VQKQotCi0KLSMgVGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuIGJlCi0jIC5vLCAudGNvLCAub2JqLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotTyAgOj0gb2JqCi1TTyA6PSBvYmoKLQotCi0jIFRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uIChmb3Igc3RhbmRhcmQgYW5kIHN0YXRpYyBsaWJyYXJpZXMpLiAgVGhpcyBjYW4KLSMgYmUgLmEsIC5saWIsIGV0Yy4sIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCi0jCi1BICA6PSBsaWIKLVNBIDo9IGxpYgotCi0KLSMgUGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gYC1JJyB0bwotIyBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiAgRXhhbXBsZXMgYXJlIGAvaT0nIG9yIGAtSicuCi0jCi1JIDo9IC1JCi0KLQotIyBDIGZsYWcgdXNlZCB0byBkZWZpbmUgYSBtYWNybyBiZWZvcmUgdGhlIGNvbXBpbGF0aW9uIG9mIGEgZ2l2ZW4gc291cmNlCi0jIG9iamVjdC4gIFVzdWFsbHkgaXQgaXMgYC1EJyBsaWtlIGluIGAtRERFQlVHJy4KLSMKLUQgOj0gLUQKLQotCi0jIFRoZSBsaW5rIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGEgZ2l2ZW4gbGlicmFyeSBmaWxlIG9uIGxpbmsuICBOb3RlIHRoYXQKLSMgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY29tcGlsZSB0aGUgZGVtbyBwcm9ncmFtcywgbm90IHRoZSBsaWJyYXJ5IGl0c2VsZi4KLSMKLUwgOj0gLUZsCi0KLQotIyBUYXJnZXQgZmxhZy4KLSMKLVQgOj0gLUZvCi0KLQotIyBDIGZsYWdzCi0jCi0jICAgVGhlc2Ugc2hvdWxkIGNvbmNlcm46IGRlYnVnIG91dHB1dCwgb3B0aW1pemF0aW9uICYgd2FybmluZ3MuCi0jCi0jICAgVXNlIHRoZSBBTlNJRkxBR1MgdmFyaWFibGUgdG8gZGVmaW5lIHRoZSBjb21waWxlciBmbGFncyB1c2VkIHRvIGVuZm9yZQotIyAgIEFOU0kgY29tcGxpYW5jZS4KLSMKLUNGTEFHUyA/PSAtYyAtZzIgLU8KLQotIyBBTlNJRkxBR1M6IFB1dCB0aGVyZSB0aGUgZmxhZ3MgdXNlZCB0byBtYWtlIHlvdXIgY29tcGlsZXIgQU5TSS1jb21wbGlhbnQuCi0jCi0jICBMQ0MgaXMgcHVyZSBBTlNJIGFueXdheSEKLSMKLUFOU0lGTEFHUyA6PQotCi0KLSMgbGlicmFyeSBsaW5raW5nCi0jCi0jQ0xFQU5fTElCUkFSWSA6PQotTElOS19MSUJSQVJZID0gbGNjbGliIC9vdXQ6JChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKE9CSkVDVFNfTElTVCkpCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9kZXRlY3QubWsgYi9idWlsZHMvZGV0ZWN0Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ0NzhlLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy9kZXRlY3QubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGhvc3QgcGxhdGZvcm0gZGV0ZWN0aW9uIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIFRoaXMgc3ViLU1ha2VmaWxlIGlzIGluIGNoYXJnZSBvZiBkZXRlY3RpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBJdCBzZXRzCi0jIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgotIwotIyAgIEJVSUxEX0RJUiAgICBUaGUgY29uZmlndXJhdGlvbiBhbmQgc3lzdGVtLXNwZWNpZmljIGRpcmVjdG9yeS4gIFVzdWFsbHkKLSMgICAgICAgICAgICAgICAgYGJ1aWxkcy8kKFBMQVRGT1JNKScgYnV0IGNhbiBiZSBkaWZmZXJlbnQgZm9yIGN1c3RvbSBidWlsZHMKLSMgICAgICAgICAgICAgICAgb2YgdGhlIGxpYnJhcnkuCi0jCi0jIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZCBpbiBzeXN0ZW0gc3BlY2lmaWMgYGRldGVjdC5taycKLSMgZmlsZXM6Ci0jCi0jICAgUExBVEZPUk0gICAgIFRoZSBkZXRlY3RlZCBwbGF0Zm9ybS4gIFRoaXMgd2lsbCBkZWZhdWx0IHRvIGBhbnNpJyBpZgotIyAgICAgICAgICAgICAgICBhdXRvLWRldGVjdGlvbiBmYWlscy4KLSMgICBDT05GSUdfRklMRSAgVGhlIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlIHRvIHVzZS4gIFRoaXMgdXN1YWxseSBkZXBlbmRzCi0jICAgICAgICAgICAgICAgIG9uIHRoZSBjb21waWxlciBkZWZpbmVkIGluIHRoZSBgQ0MnIGVudmlyb25tZW50IHZhcmlhYmxlLgotIyAgIERFTEVURSAgICAgICBUaGUgc2hlbGwgY29tbWFuZCB1c2VkIHRvIHJlbW92ZSBhIGdpdmVuIGZpbGUuCi0jICAgQ09QWSAgICAgICAgIFRoZSBzaGVsbCBjb21tYW5kIHVzZWQgdG8gY29weSBvbmUgZmlsZS4KLSMgICBTRVAgICAgICAgICAgVGhlIHBsYXRmb3JtLXNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi0jICAgQ09NUElMRVJfU0VQIFRoZSBzZXBhcmF0b3IgdXNlZCBpbiBhcmd1bWVudHMgb2YgdGhlIGNvbXBpbGF0aW9uIHRvb2xzLgotIyAgIENDICAgICAgICAgICBUaGUgY29tcGlsZXIgdG8gdXNlLgotIwotIyBZb3UgbmVlZCB0byBzZXQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZShzKSBiZWZvcmUgY2FsbGluZyBpdDoKLSMKLSMgICBUT1BfRElSICAgICAgVGhlIHRvcC1tb3N0IGRpcmVjdG9yeSBpbiB0aGUgRnJlZVR5cGUgbGlicmFyeSBzb3VyY2UKLSMgICAgICAgICAgICAgICAgaGllcmFyY2h5LiAgSWYgbm90IGRlZmluZWQsIGl0IHdpbGwgZGVmYXVsdCB0byBgLicuCi0KLSMgU2V0IGF1dG8tZGV0ZWN0aW9uIGRlZmF1bHQgdG8gYGFuc2knIHJlc3AuIFVOSVgtbGlrZSBvcGVyYXRpbmcgc3lzdGVtcy4KLSMKLVBMQVRGT1JNICAgICA6PSBhbnNpCi1ERUxFVEUgICAgICAgOj0gJChSTSkKLUNPUFkgICAgICAgICA6PSBjcAotQ0FUICAgICAgICAgIDo9IGNhdAotU0VQICAgICAgICAgIDo9IC8KLQotQlVJTERfQ09ORklHIDo9ICQoVE9QX0RJUikvYnVpbGRzCi0KLSMgVGhlc2UgdHdvIGFzc2lnbm1lbnRzIG11c3QgYmUgZGVsYXllZC4KLUJVSUxEX0RJUiAgICA9ICQoQlVJTERfQ09ORklHKS8kKFBMQVRGT1JNKQotQ09ORklHX1JVTEVTID0gJChCVUlMRF9ESVIpLyQoQ09ORklHX0ZJTEUpCi0KLSMgV2UgZGVmaW5lIHRoZSBCQUNLU0xBU0ggdmFyaWFibGUgdG8gaG9sZCBhIHNpbmdsZSBiYWNrLXNsYXNoIGNoYXJhY3Rlci4KLSMgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBhIGxpbmUgbGlrZQotIwotIyAgIFNFUCA6PSBcCi0jCi0jIGRvZXMgbm90IHdvcmsgd2l0aCBHTlUgTWFrZSAodGhlIGJhY2tzbGFzaCBpcyBpbnRlcnByZXRlZCBhcyBhIGxpbmUKLSMgY29udGludWF0aW9uKS4gIFdoaWxlIGEgbGluZSBsaWtlCi0jCi0jICAgU0VQIDo9IFxcCi0jCi0jIHJlYWxseSBkZWZpbmVzICQoU0VQKSBhcyBgXCcgb24gVW5peCwgYW5kIGBcXCcgb24gRG9zIGFuZCBXaW5kb3dzIQotIwotQkFDS1NMQVNIIDo9ICQoc3RyaXAgXCApCi0KLSMgRmluZCBhbGwgYXV0by1kZXRlY3RhYmxlIHBsYXRmb3Jtcy4KLSMKLVBMQVRGT1JNUyA6PSAkKG5vdGRpciAkKHN1YnN0IC9kZXRlY3QubWssLCQod2lsZGNhcmQgJChCVUlMRF9DT05GSUcpLyovZGV0ZWN0Lm1rKSkpCi0uUEhPTlk6ICQoUExBVEZPUk1TKSBhbnNpCi0KLSMgRmlsdGVyIG91dCBwbGF0Zm9ybSBzcGVjaWZpZWQgYXMgc2V0dXAgdGFyZ2V0LgotIwotUExBVEZPUk0gOj0gJChmaXJzdHdvcmQgJChmaWx0ZXIgJChNQUtFQ01ER09BTFMpLCQoUExBVEZPUk1TKSkpCi0KLSMgSWYgbm8gc2V0dXAgdGFyZ2V0IHBsYXRmb3JtIHdhcyBzcGVjaWZpZWQsIGVuYWJsZSBhdXRvLWRldGVjdGlvbi8KLSMgZGVmYXVsdCBwbGF0Zm9ybS4KLSMKLWlmZXEgKCQoUExBVEZPUk0pLCkKLSAgUExBVEZPUk0gOj0gYW5zaQotZW5kaWYKLQotIyBJZiB0aGUgdXNlciBoYXMgZXhwbGljaXRseSBhc2tlZCBmb3IgYGFuc2knIG9uIHRoZSBjb21tYW5kIGxpbmUsCi0jIGRpc2FibGUgYXV0by1kZXRlY3Rpb24uCi0jCi1pZmVxICgkKGZpbmRzdHJpbmcgYW5zaSwkKE1BS0VDTURHT0FMUykpLCkKLSAgIyBOb3csIGluY2x1ZGUgYWxsIGRldGVjdGlvbiBydWxlIGZpbGVzIGZvdW5kIGluIHRoZSBgYnVpbGRzLzxzeXN0ZW0+JwotICAjIGRpcmVjdG9yaWVzLiAgTm90ZSB0aGF0IHRoZSBjYWxsaW5nIG9yZGVyIG9mIHRoZSB2YXJpb3VzIGBkZXRlY3QubWsnCi0gICMgZmlsZXMgaXNuJ3QgcHJlZGljdGFibGUuCi0gICMKLSAgaW5jbHVkZSAkKHdpbGRjYXJkICQoQlVJTERfQ09ORklHKS8qL2RldGVjdC5taykKLWVuZGlmCi0KLSMgSW4gY2FzZSBubyBkZXRlY3Rpb24gcnVsZSBmaWxlIHdhcyBzdWNjZXNzZnVsLCB1c2UgdGhlIGRlZmF1bHQuCi0jCi1pZm5kZWYgQ09ORklHX0ZJTEUKLSAgQ09ORklHX0ZJTEUgOj0gYW5zaS5tawotICBzZXR1cDogc3RkX3NldHVwCi0gIC5QSE9OWTogc2V0dXAKLWVuZGlmCi0KLSMgVGhlIGZvbGxvd2luZyB0YXJnZXRzIGFyZSBlcXVpdmFsZW50LCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGV5IHVzZQotIyBhIHNsaWdodGx5IGRpZmZlcmVudCBzeW50YXggZm9yIHRoZSBgZWNobycgY29tbWFuZC4KLSMKLSMgc3RkX3NldHVwOiBkZWZpbmVkIGZvciBtb3N0IChpLmUuIFVuaXgtbGlrZSkgcGxhdGZvcm1zCi0jIGRvc19zZXR1cDogZGVmaW5lZCBmb3IgRG9zLWlzaCBwbGF0Zm9ybXMgbGlrZSBEb3MsIFdpbmRvd3MgJiBPUy8yCi0jCi0uUEhPTlk6IHN0ZF9zZXR1cCBkb3Nfc2V0dXAKLQotc3RkX3NldHVwOgotCUBlY2hvICIiCi0JQGVjaG8gIiQoUFJPSkVDVF9USVRMRSkgYnVpbGQgc3lzdGVtIC0tIGF1dG9tYXRpYyBzeXN0ZW0gZGV0ZWN0aW9uIgotCUBlY2hvICIiCi0JQGVjaG8gIlRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIHVzZWQ6IgotCUBlY2hvICIiCi0JQGVjaG8gIiAgcGxhdGZvcm0gICAgICAgICAgICAgICAgICAgICQoUExBVEZPUk0pIgotCUBlY2hvICIgIGNvbXBpbGVyICAgICAgICAgICAgICAgICAgICAkKENDKSIKLQlAZWNobyAiICBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSAgICAgJChCVUlMRF9ESVIpIgotCUBlY2hvICIgIGNvbmZpZ3VyYXRpb24gcnVsZXMgICAgICAgICAkKENPTkZJR19SVUxFUykiCi0JQGVjaG8gIiIKLQlAZWNobyAiSWYgdGhpcyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHlvdXIgc3lzdGVtIG9yIHNldHRpbmdzIHBsZWFzZSByZW1vdmUgdGhlIGZpbGUiCi0JQGVjaG8gIlxgJChDT05GSUdfTUspJyBmcm9tIHRoaXMgZGlyZWN0b3J5IHRoZW4gcmVhZCB0aGUgSU5TVEFMTCBmaWxlIGZvciBoZWxwLiIKLQlAZWNobyAiIgotCUBlY2hvICJPdGhlcndpc2UsIHNpbXBseSB0eXBlIFxgJChNQUtFKScgYWdhaW4gdG8gYnVpbGQgdGhlIGxpYnJhcnksIgotCUBlY2hvICJvciBcYCQoTUFLRSkgcmVmZG9jJyB0byBidWlsZCB0aGUgQVBJIHJlZmVyZW5jZSAodGhpcyBuZWVkcyBweXRob24gPj0gMi42KS4iCi0JQGVjaG8gIiIKLQlAJChDT1BZKSAkKENPTkZJR19SVUxFUykgJChDT05GSUdfTUspCi0KLQotIyBTcGVjaWFsIGNhc2UgZm9yIERvcywgV2luZG93cywgT1MvMiwgd2hlcmUgZWNobyAiIiBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IQotIwotZG9zX3NldHVwOgotCUB0eXBlIGJ1aWxkcyQoU0VQKW5ld2xpbmUKLQlAZWNobyAkKFBST0pFQ1RfVElUTEUpIGJ1aWxkIHN5c3RlbSAtLSBhdXRvbWF0aWMgc3lzdGVtIGRldGVjdGlvbgotCUB0eXBlIGJ1aWxkcyQoU0VQKW5ld2xpbmUKLQlAZWNobyBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSB1c2VkOgotCUB0eXBlIGJ1aWxkcyQoU0VQKW5ld2xpbmUKLQlAZWNobyAgIHBsYXRmb3Jt////////////////////////////JChQTEFURk9STSkKLQlAZWNobyAgIGNvbXBpbGVy////////////////////////////JChDQykKLQlAZWNobyAgIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5////////JChzdWJzdCAvLCQoU0VQKSwkKEJVSUxEX0RJUikpCi0JQGVjaG8gICBjb25maWd1cmF0aW9uIHJ1bGVz/////////////yQoc3Vic3QgLywkKFNFUCksJChDT05GSUdfUlVMRVMpKQotCUB0eXBlIGJ1aWxkcyQoU0VQKW5ld2xpbmUKLQlAZWNobyBJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZQotCUBlY2hvICckKENPTkZJR19NSyknIGZyb20gdGhpcyBkaXJlY3RvcnkgdGhlbiByZWFkIHRoZSBJTlNUQUxMIGZpbGUgZm9yIGhlbHAuCi0JQHR5cGUgYnVpbGRzJChTRVApbmV3bGluZQotCUBlY2hvIE90aGVyd2lzZSwgc2ltcGx5IHR5cGUgJ21ha2UnIGFnYWluIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgotCUBlY2hvIG9yICdtYWtlIHJlZmRvYycgdG8gYnVpbGQgdGhlIEFQSSByZWZlcmVuY2UgKHRoaXMgbmVlZHMgcHl0aG9uID49IDIuNikuCi0JQHR5cGUgYnVpbGRzJChTRVApbmV3bGluZQotCUAkKENPUFkpICQoc3Vic3QgLywkKFNFUCksJChDT05GSUdfUlVMRVMpICQoQ09ORklHX01LKSkgPiBudWwKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2Rvcy9kZXRlY3QubWsgYi9idWlsZHMvZG9zL2RldGVjdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjNDhkZi4uMDAwMDAwMAotLS0gYS9idWlsZHMvZG9zL2RldGVjdC5taworKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBmaWxlIHRvIGRldGVjdCBhIERPUyBob3N0IHBsYXRmb3JtLgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotLlBIT05ZOiBzZXR1cAotCi0KLWlmZXEgKCQoUExBVEZPUk0pLGFuc2kpCi0KLSAgIyBUZXN0IGZvciBESkdQUCBieSBjaGVja2luZyB0aGUgREpHUFAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdoaWNoIG11c3QgYmUKLSAgIyBzZXQgaW4gb3JkZXIgdG8gdXNlIHRoZSBzeXN0ZW0gKGllLiBpdCB3aWxsIGFsd2F5cyBiZSBwcmVzZW50IHdoZW4gdGhlCi0gICMgYG1ha2UnIHV0aWxpdHkgaXMgcnVuKS4KLSAgIwotICAjIFdlIHRlc3QgZm9yIHRoZSBDT01TUEVDIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGVuIHJ1biB0aGUgYHZlcicKLSAgIyBjb21tYW5kLWxpbmUgcHJvZ3JhbSB0byBzZWUgaWYgaXRzIG91dHB1dCBjb250YWlucyB0aGUgd29yZCBgRG9zJyBvcgotICAjIGBET1MnLgotICAjCi0gICMgSWYgdGhpcyBpcyB0cnVlLCB3ZSBhcmUgcnVubmluZyBhIERvcy1pc2ggcGxhdGZvcm0gKG9yIGFuIGVtdWxhdGlvbikuCi0gICMKLSAgaWZkZWYgREpHUFAKLSAgICBQTEFURk9STSA6PSBkb3MKLSAgZWxzZQotICAgIGlmZGVmIENPTVNQRUMKLSAgICAgIGlzX2RvcyA6PSAkKGZpbmRzdHJpbmcgRE9TLCQoc3Vic3QgRG9zLERPUywkKHNoZWxsIHZlcikpKQotCi0gICAgICAjIFdlIHRyeSB0byByZWNvZ25pemUgYSBEb3Mgc2Vzc2lvbiB1bmRlciBPUy8yLiAgVGhlIGB2ZXInIGNvbW1hbmQKLSAgICAgICMgcmV0dXJucyBgT3BlcmF0aW5nIFN5c3RlbS8yIC4uLicgdGhlcmUsIHNvIGBpc19kb3MnIHNob3VsZCBiZSBlbXB0eS4KLSAgICAgICMKLSAgICAgICMgVG8gcmVjb2duaXplIGEgRG9zIHNlc3Npb24gdW5kZXIgT1MvMiwgd2UgY2hlY2sgQ09NU1BFQyBmb3IgdGhlCi0gICAgICAjIHN1YnN0cmluZyBgTURPU1xDT01NQU5EJwotICAgICAgIwotICAgICAgaWZlcSAoJChpc19kb3MpLCkKLSAgICAgICAgaXNfZG9zIDo9ICQoZmluZHN0cmluZyBNRE9TXENPTU1BTkQsJChDT01TUEVDKSkKLSAgICAgIGVuZGlmCi0KLSAgICAgICMgV2UgYWxzbyB0cnkgdG8gcmVjb2duaXplIERvcyA3Lnggd2l0aG91dCBXaW5kb3dzIDlYIGxhdW5jaGVkLgotICAgICAgIyBTZWUgYnVpbGRzL3dpbmRvd3MvZGV0ZWN0Lm1rIGZvciBleHBsYW5hdGlvbnMgYWJvdXQgdGhlIGxvZ2ljLgotICAgICAgIwotICAgICAgaWZlcSAoJChpc19kb3MpLCkKLSAgICAgICAgaWZkZWYgd2luYm9vdGRpcgotI2lmbmVxICgkKE9TKSxXaW5kb3dzX05UKQotICAgICAgICAgICMgSWYgd2luZG93cyBpcyBhdmFpbGFibGUsIGRvIG5vdCB0cmlnZ2VyIHRoaXMgdGVzdC4KLSAgICAgICAgICBpZm5kZWYgd2luZGlyCi0gICAgICAgICAgICBpc19kb3MgOj0gJChmaW5kc3RyaW5nIFdpbmRvd3MsJChzdHJpcCAkKHNoZWxsIHZlcikpKQotICAgICAgICAgIGVuZGlmCi0jZW5kaWYKLSAgICAgICAgZW5kaWYKLSAgICAgIGVuZGlmCi0KLSAgICBlbmRpZiAjIHRlc3QgQ09NU1BFQwotCi0gICAgaWZuZXEgKCQoaXNfZG9zKSwpCi0KLSAgICAgIFBMQVRGT1JNIDo9IGRvcwotCi0gICAgZW5kaWYgIyB0ZXN0IERvcwotICBlbmRpZiAjIHRlc3QgREpHUFAKLWVuZGlmICMgdGVzdCBQTEFURk9STSBhbnNpCi0KLWlmZXEgKCQoUExBVEZPUk0pLGRvcykKLQotICAjIFVzZSBESkdQUCAoaS5lLiBnY2MpIGJ5IGRlZmF1bHQuCi0gICMKLSAgQ09ORklHX0ZJTEUgOj0gZG9zLWdjYy5tawotICBDQyAgICAgICAgICA/PSBnY2MKLQotICAjIGFkZGl0aW9uYWxseSwgd2UgcHJvdmlkZSBob29rcyBmb3IgdmFyaW91cyBvdGhlciBjb21waWxlcnMKLSAgIwotICBpZm5lcSAoJChmaW5kc3RyaW5nIGVteCwkKE1BS0VDTURHT0FMUykpLCkgICAgICAgICMgRU1YIGdjYwotICAgIENPTkZJR19GSUxFIDo9IGRvcy1lbXgubWsKLSAgICBDQyAgICAgICAgICA6PSBnY2MKLSAgICBlbXg6IHNldHVwCi0gICAgLlBIT05ZOiBlbXgKLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIHR1cmJvYywkKE1BS0VDTURHT0FMUykpLCkgICAgICMgVHVyYm8gQwotICAgIENPTkZJR19GSUxFIDo9IGRvcy10Y2MubWsKLSAgICBDQyAgICAgICAgICA6PSB0Y2MKLSAgICB0dXJib2M6IHNldHVwCi0gICAgLlBIT05ZOiB0dXJib2MKLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIHdhdGNvbSwkKE1BS0VDTURHT0FMUykpLCkgICAgICMgV2F0Y29tIEMvQysrCi0gICAgQ09ORklHX0ZJTEUgOj0gZG9zLXdhdC5tawotICAgIENDICAgICAgICAgIDo9IHdjYzM4NgotICAgIHdhdGNvbTogc2V0dXAKLSAgICAuUEhPTlk6IHdhdGNvbQotICBlbmRpZgotCi0gIGlmbmVxICgkKGZpbmRzdHJpbmcgYm9ybGFuZGMsJChNQUtFQ01ER09BTFMpKSwpICAgIyBCb3JsYW5kIEMvQysrIDMyLWJpdAotICAgIENPTkZJR19GSUxFIDo9IGRvcy1iY2MubWsKLSAgICBDQyAgICAgICAgICA6PSBiY2MzMgotICAgIGJvcmxhbmRjOiBzZXR1cAotICAgIC5QSE9OWTogYm9ybGFuZGMKLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIGJvcmxhbmRjMTYsJChNQUtFQ01ER09BTFMpKSwpICMgQm9ybGFuZCBDL0MrKyAxNi1iaXQKLSAgICBDT05GSUdfRklMRSA6PSBkb3MtYmNjLm1rCi0gICAgQ0MgICAgICAgICAgOj0gYmNjCi0gICAgYm9ybGFuZGMxNjogc2V0dXAKLSAgICAuUEhPTlk6IGJvcmxhbmRjMTYKLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIGJhc2gsJChTSEVMTCkpLCkgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGJhc2gKLSAgICBTRVAgICAgOj0gLwotICAgIERFTEVURSA6PSBybQotICAgIENPUFkgICA6PSBjcAotICAgIENBVCAgICA6PSBjYXQKLSAgICBzZXR1cDogc3RkX3NldHVwCi0gIGVsc2UKLSAgICBTRVAgICAgOj0gJChCQUNLU0xBU0gpCi0gICAgREVMRVRFIDo9IGRlbAotICAgIENBVCAgICA6PSB0eXBlCi0KLSAgICAjIFNldHRpbmcgQ09QWSBpcyBhIGJpdCB0cmlja2llci4gIFdlIGNhbiBiZSBydW5uaW5nIERKR1BQIG9uIHNvbWUKLSAgICAjIFdpbmRvd3MgTlQgZGVyaXZhdGl2ZXMsIGxpa2UgWFAuICBTZWUgYnVpbGRzL3dpbmRvd3MvZGV0ZWN0Lm1rIGZvcgotICAgICMgZXhwbGFuYXRpb25zIHdoeSB3ZSBuZWVkIGhhY2tpbmcgaGVyZS4KLSAgICAjCi0gICAgaWZlcSAoJChPUyksV2luZG93c19OVCkKLSAgICAgIENPUFkgOj0gY21kLmV4ZSAvYyBjb3B5Ci0gICAgZWxzZQotICAgICAgQ09QWSA6PSBjb3B5Ci0gICAgZW5kaWYgICMgdGVzdCBOVAotCi0gICAgc2V0dXA6IGRvc19zZXR1cAotICBlbmRpZgotCi1lbmRpZiAgICAgIyB0ZXN0IFBMQVRGT1JNIGRvcwotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvZG9zL2Rvcy1kZWYubWsgYi9idWlsZHMvZG9zL2Rvcy1kZWYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzJmMjIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2Rvcy9kb3MtZGVmLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIERPUyBzcGVjaWZpYyBkZWZpbml0aW9ucwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotREVMRVRFICAgIDo9IGRlbAotQ0FUICAgICAgIDo9IHR5cGUKLVNFUCAgICAgICA6PSAkKHN0cmlwIFwgKQotQlVJTERfRElSIDo9ICQoVE9QX0RJUikvYnVpbGRzL2RvcwotUExBVEZPUk0gIDo9IGRvcwotCi0KLSMgVGhlIGV4ZWN1dGFibGUgZmlsZSBleHRlbnNpb24gKGZvciB0b29scyksICp3aXRoKiBsZWFkaW5nIGRvdC4KLSMKLUUgOj0gLmV4ZQotCi0jIFRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGxpYnJhcnkgZmlsZXMgYXJlIHBsYWNlZC4KLSMKLSMgQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgc2FtZSBhcyAkKE9CSl9ESVIpOyBob3dldmVyLCB0aGlzIGNhbiBiZSBjaGFuZ2VkCi0jIHRvIHN1aXQgcGFydGljdWxhciBuZWVkcy4KLSMKLUxJQl9ESVIgOj0gJChPQkpfRElSKQotCi0jIFRoZSBuYW1lIG9mIHRoZSBmaW5hbCBsaWJyYXJ5IGZpbGUuICBOb3RlIHRoYXQgdGhlIERPUy1zcGVjaWZpYyBNYWtlZmlsZQotIyB1c2VzIGEgc2hvcnRlciAoOC4zKSBuYW1lLgotIwotTElCUkFSWSA6PSAkKFBST0pFQ1QpCi0KLQotIyBUaGUgTk9fT1VUUFVUIG1hY3JvIGlzIHVzZWQgdG8gaWdub3JlIHRoZSBvdXRwdXQgb2YgY29tbWFuZHMuCi0jCi1OT19PVVRQVVQgPSA+IG51bAotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvZG9zL2Rvcy1lbXgubWsgYi9idWlsZHMvZG9zL2Rvcy1lbXgubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGUwMzcuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2Rvcy9kb3MtZW14Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGNvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIHRoZSBFTVggZ2NjIGNvbXBpbGVyCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2Rvcy9kb3MtZGVmLm1rCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2NvbXBpbGVyL2VteC5tawotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9saW5rX2Rvcy5tawotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvZG9zL2Rvcy1nY2MubWsgYi9idWlsZHMvZG9zL2Rvcy1nY2MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOGFjZmIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2Rvcy9kb3MtZ2NjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGNvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIHRoZSBESkdQUCBjb21waWxlcgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9kb3MvZG9zLWRlZi5tawotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci9nY2MubWsKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvbGlua19kb3MubWsKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2Rvcy9kb3Mtd2F0Lm1rIGIvYnVpbGRzL2Rvcy9kb3Mtd2F0Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGI0ODc2Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9kb3MvZG9zLXdhdC5taworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIHJ1bGVzIGZvciB0aGUgV2F0Y29tIEMvQysrIGNvbXBpbGVyCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9kb3MvZG9zLWRlZi5tawotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci93YXRjb20ubWsKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvbGlua19kb3MubWsKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2V4cG9ydHMubWsgYi9idWlsZHMvZXhwb3J0cy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiNzlkMy4uMDAwMDAwMAotLS0gYS9idWlsZHMvZXhwb3J0cy5taworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBleHBvcnRzIHN1Yi1NYWtlZmlsZQotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDUtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBETyBOT1QgSU5WT0tFIFRISVMgTUFLRUZJTEUgRElSRUNUTFkhICBJVCBJUyBNRUFOVCBUTyBCRSBJTkNMVURFRCBCWQotIyBPVEhFUiBNQUtFRklMRVMuCi0KLQotIyBUaGlzIHN1Yi1NYWtlZmlsZSBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scyB3aGVuZXZlcgotIyB0aGUgRVhQT1JUU19MSVNUIHZhcmlhYmxlIGlzIGRlZmluZWQgYnkgb25lIG9mIHRoZSBwbGF0Zm9ybSBvciBjb21waWxlcgotIyBzcGVjaWZpYyBidWlsZCBmaWxlcy4KLSMKLSMgRVhQT1JUU19MSVNUIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBgbGlzdCcgZmlsZSwgZm9yIGV4YW1wbGUgYSBXaW5kb3dzCi0jIC5ERUYgZmlsZS4KLSMKLWlmbmVxICgkKEVYUE9SVFNfTElTVCksKQotCi0gICMgQ0NleGUgaXMgdGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSB0aGUgYGFwaW5hbWVzJyB0b29sIHByb2dyYW0KLSAgIyBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgVGhpcyBpc24ndCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgY29tcGlsZXIKLSAgIyB3aGljaCBjYW4gYmUgYSBjcm9zcy1jb21waWxlciBmb3IgYSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlLCBmb3IgZXhhbXBsZS4KLSAgIwotICBpZmVxICgkKENDZXhlKSwpCi0gICAgQ0NleGUgOj0gJChDQykKLSAgZW5kaWYKLQotICAjIFRFIGFjdHMgbGlrZSBULCBidXQgZm9yIGV4ZWN1dGFibGVzIGluc3RlYWQgb2Ygb2JqZWN0IGZpbGVzLgotICBpZmVxICgkKFRFKSwpCi0gICAgVEUgOj0gJFQKLSAgZW5kaWYKLQotICAjIFRoZSBsaXN0IG9mIHB1YmxpYyBoZWFkZXJzIHdlJ3JlIGdvaW5nIHRvIHBhcnNlLgotICBQVUJMSUNfSEVBREVSUyA6PSAkKGZpbHRlci1vdXQgJChQVUJMSUNfRElSKS9mdG1hYy5oLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpbGRjYXJkICQoUFVCTElDX0RJUikvKi5oKSkKLSAgaWZuZXEgKCQoZnRtYWNfYyksKQotICAgIFBVQkxJQ19IRUFERVJTICs9ICQoUFVCTElDX0RJUikvZnRtYWMuaAotICBlbmRpZgotCi0gICMgVGhlIGBhcGluYW1lcycgc291cmNlIGFuZCBleGVjdXRhYmxlLiAgV2UgdXNlICRFX0JVSUxEIGFzIHRoZSBob3N0Ci0gICMgZXhlY3V0YWJsZSBzdWZmaXgsIHdoaWNoICppbmNsdWRlcyogdGhlIGZpbmFsIGRvdC4KLSAgIwotICAjIE5vdGUgdGhhdCAkKEFQSU5BTUVTX09QVElPTlMpIGlzIGVtcHR5LCBleGNlcHQgZm9yIFdpbmRvd3MgY29tcGlsZXJzLgotICAjCi0gIEFQSU5BTUVTX1NSQyA6PSAkKHN1YnN0IC8sJChTRVApLCQoVE9QX0RJUikvc3JjL3Rvb2xzL2FwaW5hbWVzLmMpCi0gIEFQSU5BTUVTX0VYRSA6PSAkKHN1YnN0IC8sJChTRVApLCQoT0JKX0RJUikvYXBpbmFtZXMkKEVfQlVJTEQpKQotCi0gICQoQVBJTkFNRVNfRVhFKTogJChBUElOQU1FU19TUkMpCi0JICAkKENDZXhlKSAkKENDZXhlX0NGTEFHUykgJChURSkkQCAkPCAkKENDZXhlX0xERkxBR1MpCi0KLSAgLlBIT05ZOiBzeW1ib2xzX2xpc3QKLQotICBzeW1ib2xzX2xpc3Q6ICQoRVhQT1JUU19MSVNUKQotCi0gICMgV2UgbWFudWFsbHkgYWRkIFRUX05ld19Db250ZXh0IGFuZCBUVF9SdW5JbnMsIHdoaWNoIGFyZSBuZWVkZWQgYnkgVFQKLSAgIyBkZWJ1Z2dlcnMsIHRvIHRoZSBFWFBPUlRTX0xJU1QuCi0gICMKLSAgJChFWFBPUlRTX0xJU1QpOiAkKEFQSU5BTUVTX0VYRSkgJChQVUJMSUNfSEVBREVSUykKLQkgICQoc3Vic3QgLywkKFNFUCksJChBUElOQU1FU19FWEUpKSAtbyRAICQoQVBJTkFNRVNfT1BUSU9OUykgJChQVUJMSUNfSEVBREVSUykKLQkgIEBlY2hvIFRUX05ld19Db250ZXh0ID4+ICQoRVhQT1JUU19MSVNUKQotCSAgQGVjaG8gVFRfUnVuSW5zID4+ICQoRVhQT1JUU19MSVNUKQotCi0gICQoUFJPSkVDVF9MSUJSQVJZKTogJChFWFBPUlRTX0xJU1QpCi0KLSAgQ0xFQU4gKz0gJChFWFBPUlRTX0xJU1QpIFwKLSAgICAgICAgICAgJChBUElOQU1FU19FWEUpCi0KLWVuZGlmCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9mcmVldHlwZS5tayBiL2J1aWxkcy9mcmVldHlwZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjZmQ0MS4uMDAwMDAwMAotLS0gYS9idWlsZHMvZnJlZXR5cGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGxpYnJhcnkgc3ViLU1ha2VmaWxlCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIERPIE5PVCBJTlZPS0UgVEhJUyBNQUtFRklMRSBESVJFQ1RMWSEgIElUIElTIE1FQU5UIFRPIEJFIElOQ0xVREVEIEJZCi0jIE9USEVSIE1BS0VGSUxFUy4KLQotCi0jIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIChzZXQgYnkgb3RoZXIgTWFrZWZpbGUgY29tcG9uZW50cywgaW4gdGhlCi0jIGVudmlyb25tZW50LCBvciBvbiB0aGUgY29tbWFuZCBsaW5lKSBhcmUgdXNlZDoKLSMKLSMgICBCVUlMRF9ESVIgICAgICBUaGUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBkaXJlY3RvcnksCi0jICAgICAgICAgICAgICAgICAgZS5nLiBgJChUT1BfRElSKS9idWlsZHMvdW5peCcuICBBZGRlZCB0byBJTkNMVURFUyBhbHNvLgotIwotIyAgIE9CSl9ESVIgICAgICAgIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggb2JqZWN0IGZpbGVzIGFyZSBjcmVhdGVkLgotIwotIyAgIExJQl9ESVIgICAgICAgIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGxpYnJhcnkgaXMgY3JlYXRlZC4KLSMKLSMgICBET0NfRElSICAgICAgICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBBUEkgcmVmZXJlbmNlIGlzIGNyZWF0ZWQuCi0jCi0jICAgSU5DTFVERVMgICAgICAgQSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGJlIGluY2x1ZGVkIGFkZGl0aW9uYWxseS4KLSMKLSMgICBERVZFTF9ESVIgICAgICBEZXZlbG9wbWVudCBkaXJlY3Rvcnkgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIElOQ0xVREVTCi0jICAgICAgICAgICAgICAgICAgdmFyaWFibGUgYmVmb3JlIHRoZSBzdGFuZGFyZCBpbmNsdWRlIGRpcmVjdG9yaWVzLgotIwotIyAgIENGTEFHUyAgICAgICAgIENvbXBpbGF0aW9uIGZsYWdzLiAgVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MKLSMgICAgICAgICAgICAgICAgICBpbiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlcy4KLSMKLSMgICBGVFNZU19TUkMgICAgICBJZiBzZXQsIGl0cyB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIGEgcmVwbGFjZW1lbnQKLSMgICAgICAgICAgICAgICAgICBmaWxlIGZvciBgc3JjL2Jhc2UvZnRzeXN0ZW0uYycuCi0jCi0jICAgRlRERUJVR19TUkMgICAgSWYgc2V0LCBpdHMgdmFsdWUgaXMgdXNlZCBhcyB0aGUgbmFtZSBvZiBhIHJlcGxhY2VtZW50Ci0jICAgICAgICAgICAgICAgICAgZmlsZSBmb3IgYHNyYy9iYXNlL2Z0ZGVidWcuYycuICBbRm9yIGEgbm9ybWFsIGJ1aWxkLCB0aGlzCi0jICAgICAgICAgICAgICAgICAgZmlsZSBkb2VzIG5vdGhpbmcuXQotIwotIyAgIEZUTU9EVUxFX0ggICAgIFRoZSBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZSBsaXN0IG9mIG1vZHVsZSBjbGFzc2VzIGZvcgotIyAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJ1aWxkLiAgVXN1YWxseSwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5Ci0jICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSBgbW9kdWxlcy5taycuCi0jCi0jICAgQkFTRV9PQkpfUwotIyAgIEJBU0VfT0JKX00gICAgIEEgbGlzdCBvZiBiYXNlIG9iamVjdHMgKGZvciBzaW5nbGUgb2JqZWN0IGFuZCBtdWx0aXBsZQotIyAgICAgICAgICAgICAgICAgIG9iamVjdCBidWlsZHMsIHJlc3BlY3RpdmVseSkuICBTZXQgdXAgaW4KLSMgICAgICAgICAgICAgICAgICBgc3JjL2Jhc2UvcnVsZXMubWsnLgotIwotIyAgIEJBU0VfRVhUX09CSiAgIEEgbGlzdCBvZiBiYXNlIGV4dGVuc2lvbiBvYmplY3RzLiAgU2V0IHVwIGluCi0jICAgICAgICAgICAgICAgICAgYHNyYy9iYXNlL3J1bGVzLm1rJy4KLSMKLSMgICBEUlZfT0JKX1MKLSMgICBEUlZfT0JKX00gICAgICBBIGxpc3Qgb2YgZHJpdmVyIG9iamVjdHMgKGZvciBzaW5nbGUgb2JqZWN0IGFuZCBtdWx0aXBsZQotIyAgICAgICAgICAgICAgICAgIG9iamVjdCBidWlsZHMsIHJlc3BlY3RpdmVseSkuICBTZXQgdXAgY3VtdWxhdGl2ZWx5IGluCi0jICAgICAgICAgICAgICAgICAgYHNyYy88ZHJpdmVyPi9ydWxlcy5taycuCi0jCi0jICAgQ0xFQU4KLSMgICBESVNUQ0xFQU4gICAgICBUaGUgc3ViLW1ha2VmaWxlcyBjYW4gYXBwZW5kIGFkZGl0aW9uYWwgc3R1ZmYgdG8gdGhlc2UgdHdvCi0jICAgICAgICAgICAgICAgICAgdmFyaWFibGVzIHdoaWNoIGlzIHRvIGJlIHJlbW92ZWQgZm9yIHRoZSBgY2xlYW4nIHJlc3AuCi0jICAgICAgICAgICAgICAgICAgYGRpc3RjbGVhbicgdGFyZ2V0LgotIwotIyAgIFRPUF9ESVIsIFNFUCwKLSMgICBDT01QSUxFUl9TRVAsCi0jICAgTElCUkFSWSwgQ0MsCi0jICAgQSwgSSwgTywgVCAgICAgQ2hlY2sgYGNvbmZpZy5taycgZm9yIGRldGFpbHMuCi0KLQotIyBUaGUgdGFyZ2V0cyBgb2JqZWN0cycgYW5kIGBsaWJyYXJ5JyBhcmUgZGVmaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMKLSMgTWFrZWZpbGUgYWZ0ZXIgYWxsIG90aGVyIHJ1bGVzIGhhdmUgYmVlbiBpbmNsdWRlZC4KLSMKLS5QSE9OWTogc2luZ2xlIG11bHRpIG9iamVjdHMgbGlicmFyeSByZWZkb2MKLQotIyBkZWZhdWx0IHRhcmdldCAtLSBidWlsZCBzaW5nbGUgb2JqZWN0cyBhbmQgbGlicmFyeQotIwotc2luZ2xlOiBvYmplY3RzIGxpYnJhcnkKLQotIyBgbXVsdGknIHRhcmdldCAtLSBidWlsZCBtdWx0aXBsZSBvYmplY3RzIGFuZCBsaWJyYXJ5Ci0jCi1tdWx0aTogb2JqZWN0cyBsaWJyYXJ5Ci0KLQotIyBUaGUgRnJlZVR5cGUgc291cmNlIGRpcmVjdG9yeSwgdXN1YWxseSBgLi9zcmMnLgotIwotU1JDX0RJUiA6PSAkKFRPUF9ESVIpL3NyYwotCi0jIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGJhc2UgbGF5ZXIgY29tcG9uZW50cyBhcmUgcGxhY2VkLCB1c3VhbGx5Ci0jIGAuL3NyYy9iYXNlJy4KLSMKLUJBU0VfRElSIDo9ICQoU1JDX0RJUikvYmFzZQotCi0jIE90aGVyIGRlcml2ZWQgZGlyZWN0b3JpZXMuCi0jCi1QVUJMSUNfRElSICAgOj0gJChUT1BfRElSKS9pbmNsdWRlL2ZyZWV0eXBlCi1JTlRFUk5BTF9ESVIgOj0gJChQVUJMSUNfRElSKS9pbnRlcm5hbAotU0VSVklDRVNfRElSIDo9ICQoSU5URVJOQUxfRElSKS9zZXJ2aWNlcwotQ09ORklHX0RJUiAgIDo9ICQoUFVCTElDX0RJUikvY29uZmlnCi0KLSMgVGhlIGRvY3VtZW50YXRpb24gZGlyZWN0b3J5LgotIwotRE9DX0RJUiA/PSAkKFRPUF9ESVIpL2RvY3MvcmVmZXJlbmNlCi0KLSMgVGhlIGZpbmFsIG5hbWUgb2YgdGhlIGxpYnJhcnkgZmlsZS4KLSMKLVBST0pFQ1RfTElCUkFSWSA6PSAkKExJQl9ESVIpLyQoTElCUkFSWSkuJEEKLQotCi0jIGluY2x1ZGUgcGF0aHMKLSMKLSMgSU1QT1JUQU5UIE5PVEU6IFRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGRpcmVjdG9yeSBtdXN0IEFMV0FZUyBiZSBwbGFjZWQKLSMgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgc3RhbmRhcmQgaW5jbHVkZSBsaXN0LiAgUG9ydGVycyBhcmUgdGhlbiBhYmxlIHRvCi0jICAgICAgICAgICAgICAgICBwdXQgdGhlaXIgb3duIHZlcnNpb24gb2Ygc29tZSBvZiB0aGUgRnJlZVR5cGUgY29tcG9uZW50cwotIyAgICAgICAgICAgICAgICAgaW4gdGhlIGBidWlsZHMvPHN5c3RlbT4nIGRpcmVjdG9yeSwgYXMgdGhlc2UgZmlsZXMgd2lsbAotIyAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc291cmNlcy4KLSMKLUlOQ0xVREVTIDo9ICQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJChPQkpfRElSKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoREVWRUxfRElSKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQlVJTERfRElSKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoVE9QX0RJUikvaW5jbHVkZSkKLQotSU5DTFVERV9GTEFHUyA6PSAkKElOQ0xVREVTOiU9JEklKQotCi1pZmRlZiBERVZFTF9ESVIKLSAgIyBXZSBhc3N1bWUgdGhhdCBhbGwgbGlicmFyeSBkZXBlbmRlbmNpZXMgZm9yIEZyZWVUeXBlIGFyZSBmdWxmaWxsZWQgZm9yIGEKLSAgIyBkZXZlbG9wbWVudCBidWlsZCwgc28gd2UgZGlyZWN0bHkgYWNjZXNzIHRoZSBuZWNlc3NhcnkgaW5jbHVkZSBkaXJlY3RvcnkKLSAgIyBpbmZvcm1hdGlvbiB1c2luZyBgcGtnLWNvbmZpZycuCi0gIElOQ0xVREVfRkxBR1MgKz0gJChzaGVsbCBwa2ctY29uZmlnIC0tY2ZsYWdzIGxpYnBuZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmZidXp6ICkKLWVuZGlmCi0KLQotIyBDIGZsYWdzIHVzZWQgZm9yIHRoZSBjb21waWxhdGlvbiBvZiBhbiBvYmplY3QgZmlsZS4gIFRoaXMgbXVzdCBpbmNsdWRlIGF0Ci0jIGxlYXN0IHRoZSBwYXRocyBmb3IgdGhlIGBiYXNlJyBhbmQgYGJ1aWxkcy88c3lzdGVtPicgZGlyZWN0b3JpZXM7Ci0jIGRlYnVnL29wdGltaXphdGlvbi93YXJuaW5nIGZsYWdzICsgYW5zaSBjb21wbGlhbmNlIGlmIG5lZWRlZC4KLSMKLSMgJChJTkNMVURFX0ZMQUdTKSBzaG91bGQgY29tZSBiZWZvcmUgJChDRkxBR1MpIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKLSMgb2xkIEZyZWVUeXBlIHZlcnNpb25zLgotIwotIyBOb3RlIHdoYXQgd2UgYWxzbyBkZWZpbmUgdGhlIG1hY3JvIEZUMl9CVUlMRF9MSUJSQVJZIHdoZW4gYnVpbGRpbmcKLSMgRnJlZVR5cGUuICBUaGlzIGlzIHJlcXVpcmVkIHRvIGxldCBvdXIgc291cmNlcyBpbmNsdWRlIHRoZSBpbnRlcm5hbAotIyBoZWFkZXJzIChzb21ldGhpbmcgZm9yYmlkZGVuIGJ5IGNsaWVudHMpLgotIwotIyBGaW5hbGx5LCB3ZSBkZWZpbmUgRlRfQ09ORklHX01PRFVMRVNfSCBzbyB0aGF0IHRoZSBjb21waWxlciB1c2VzIHRoZQotIyBnZW5lcmF0ZWQgdmVyc2lvbiBvZiBgZnRtb2R1bGUuaCcgaW4gJChPQkpfRElSKS4gIElmIHRoZXJlIGlzIGFuCi0jIGBmdG9wdGlvbi5oJyBmaWxlcyBpbiAkKE9CSl9ESVIpLCBkZWZpbmUgRlRfQ09ORklHX09QVElPTlNfSCB0b28uCi0jCi1pZm5lcSAoJCh3aWxkY2FyZCAkKE9CSl9ESVIpL2Z0b3B0aW9uLmgpLCkKLSAgRlRPUFRJT05fSCAgICA6PSAkKE9CSl9ESVIpL2Z0b3B0aW9uLmgKLSAgRlRPUFRJT05fRkxBRyA6PSAkREZUX0NPTkZJR19PUFRJT05TX0g9IjxmdG9wdGlvbi5oPiIKLWVuZGlmCi0KLSMgYENQUEZMQUdTJyBtaWdodCBiZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaW4gdGhlIGVudmlyb25tZW50LgotIwotRlRfQ0ZMQUdTICA9ICQoQ1BQRkxBR1MpIFwKLSAgICAgICAgICAgICAkKENGTEFHUykgXAotICAgICAgICAgICAgICRERlQyX0JVSUxEX0xJQlJBUlkgXAotICAgICAgICAgICAgICRERlRfQ09ORklHX01PRFVMRVNfSD0iPGZ0bW9kdWxlLmg+IiBcCi0gICAgICAgICAgICAgJChGVE9QVElPTl9GTEFHKQotCi0KLSMgSW5jbHVkZSB0aGUgYGV4cG9ydHMnIHJ1bGVzIGZpbGUuCi0jCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2V4cG9ydHMubWsKLQotCi0jIEluaXRpYWxpemUgdGhlIGxpc3Qgb2Ygb2JqZWN0cy4KLSMKLU9CSkVDVFNfTElTVCA6PQotCi0KLSMgRGVmaW5lICQoUFVCTElDX0gpIGFzIHRoZSBsaXN0IG9mIGFsbCBwdWJsaWMgaGVhZGVyIGZpbGVzIGxvY2F0ZWQgaW4KLSMgYCQoVE9QX0RJUikvaW5jbHVkZS9mcmVldHlwZScuICAkKElOVEVSTkFMX0gpLCBhbmQgJChDT05GSUdfSCkgYXJlIGRlZmluZWQKLSMgc2ltaWxhcmx5LgotIwotIyBUaGlzIGlzIHVzZWQgdG8gc2ltcGxpZnkgdGhlIGRlcGVuZGVuY3kgcnVsZXMgLS0gaWYgb25lIG9mIHRoZXNlIGZpbGVzCi0jIGNoYW5nZXMsIHRoZSB3aG9sZSBsaWJyYXJ5IGlzIHJlY29tcGlsZWQuCi0jCi1QVUJMSUNfSCAgIDo9ICQod2lsZGNhcmQgJChQVUJMSUNfRElSKS8qLmgpCi1JTlRFUk5BTF9IIDo9ICQod2lsZGNhcmQgJChJTlRFUk5BTF9ESVIpLyouaCkgXAotICAgICAgICAgICAgICAkKHdpbGRjYXJkICQoU0VSVklDRVNfRElSKS8qLmgpCi1DT05GSUdfSCAgIDo9ICQod2lsZGNhcmQgJChDT05GSUdfRElSKS8qLmgpIFwKLSAgICAgICAgICAgICAgJCh3aWxkY2FyZCAkKEJVSUxEX0RJUikvY29uZmlnLyouaCkgXAotICAgICAgICAgICAgICAkKEZUTU9EVUxFX0gpIFwKLSAgICAgICAgICAgICAgJChGVE9QVElPTl9IKQotREVWRUxfSCAgICA6PSAkKHdpbGRjYXJkICQoVE9QX0RJUikvZGV2ZWwvKi5oKQotCi1GUkVFVFlQRV9IIDo9ICQoUFVCTElDX0gpICQoSU5URVJOQUxfSCkgJChDT05GSUdfSCkgJChERVZFTF9IKQotCi0KLUZUX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICQoSU5DTFVERV9GTEFHUykgJChGVF9DRkxBR1MpCi0KLSMgZnRzeXN0ZW0gY29tcG9uZW50Ci0jCi1GVFNZU19TUkMgPz0gJChCQVNFX0RJUikvZnRzeXN0ZW0uYwotCi1GVFNZU19PQkogOj0gJChPQkpfRElSKS9mdHN5c3RlbS4kTwotCi1PQkpFQ1RTX0xJU1QgKz0gJChGVFNZU19PQkopCi0KLSQoRlRTWVNfT0JKKTogJChGVFNZU19TUkMpICQoRlJFRVRZUEVfSCkKLQkkKEZUX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkPCkKLQotCi0jIGZ0ZGVidWcgY29tcG9uZW50Ci0jCi1GVERFQlVHX1NSQyA/PSAkKEJBU0VfRElSKS9mdGRlYnVnLmMKLQotRlRERUJVR19PQkogOj0gJChPQkpfRElSKS9mdGRlYnVnLiRPCi0KLU9CSkVDVFNfTElTVCArPSAkKEZUREVCVUdfT0JKKQotCi0kKEZUREVCVUdfT0JKKTogJChGVERFQlVHX1NSQykgJChGUkVFVFlQRV9IKQotCSQoRlRfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQ8KQotCi0KLSMgSW5jbHVkZSBhbGwgcnVsZSBmaWxlcyBmcm9tIEZyZWVUeXBlIGNvbXBvbmVudHMuCi0jCi1pbmNsdWRlICQoU1JDX0RJUikvYmFzZS9ydWxlcy5tawotaW5jbHVkZSAkKHBhdHN1YnN0ICUsJChTUkNfRElSKS8lL3J1bGVzLm1rLCQoTU9EVUxFUykpCi0KLQotIyBmdGluaXQgY29tcG9uZW50Ci0jCi0jICAgVGhlIEMgc291cmNlIGBmdGluaXQuYycgY29udGFpbnMgdGhlIEZyZWVUeXBlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLgotIyAgIEl0IGlzIGFibGUgdG8gYXV0b21hdGljYWxseSByZWdpc3RlciBvbmUgb3IgbW9yZSBkcml2ZXJzIHdoZW4gdGhlIEFQSQotIyAgIGZ1bmN0aW9uIEZUX0luaXRfRnJlZVR5cGUoKSBpcyBjYWxsZWQuCi0jCi0jICAgVGhlIHNldCBvZiBpbml0aWFsIGRyaXZlcnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZHJpdmVyIE1ha2VmaWxlcwotIyAgIGluY2x1ZGVzIGFib3ZlLiAgRWFjaCBkcml2ZXIgTWFrZWZpbGUgdXBkYXRlcyB0aGUgRlRJTklUX3h4eCBsaXN0cwotIyAgIHdoaWNoIGNvbnRhaW4gYWRkaXRpb25hbCBpbmNsdWRlIHBhdGhzIGFuZCBtYWNyb3MgdXNlZCB0byBjb21waWxlIHRoZQotIyAgIHNpbmdsZSBgZnRpbml0LmMnIHNvdXJjZS4KLSMKLUZUSU5JVF9TUkMgOj0gJChCQVNFX0RJUikvZnRpbml0LmMKLUZUSU5JVF9PQkogOj0gJChPQkpfRElSKS9mdGluaXQuJE8KLQotT0JKRUNUU19MSVNUICs9ICQoRlRJTklUX09CSikKLQotJChGVElOSVRfT0JKKTogJChGVElOSVRfU1JDKSAkKEZSRUVUWVBFX0gpCi0JJChGVF9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyBBbGwgRnJlZVR5cGUgbGlicmFyeSBvYmplY3RzLgotIwotT0JKX00gOj0gJChCQVNFX09CSl9NKSAkKEJBU0VfRVhUX09CSikgJChEUlZfT0JKU19NKQotT0JKX1MgOj0gJChCQVNFX09CSl9TKSAkKEJBU0VfRVhUX09CSikgJChEUlZfT0JKU19TKQotCi0KLSMgVGhlIHRhcmdldCBgbXVsdGknIG9uIHRoZSBNYWtlIGNvbW1hbmQgbGluZSBpbmRpY2F0ZXMgdGhhdCB3ZSB3YW50IHRvCi0jIGNvbXBpbGUgZWFjaCBzb3VyY2UgZmlsZSBpbmRlcGVuZGVudGx5LgotIwotIyBPdGhlcndpc2UsIGVhY2ggbW9kdWxlL2RyaXZlciBpcyBjb21waWxlZCBpbiBhIHNpbmdsZSBvYmplY3QgZmlsZSB0aHJvdWdoCi0jIHNvdXJjZSBmaWxlIGluY2x1c2lvbiAoc2VlIGBzcmMvYmFzZS9mdGJhc2UuYycgb3IKLSMgYHNyYy90cnVldHlwZS90cnVldHlwZS5jJyBmb3IgZXhhbXBsZXMpLgotIwotQkFTRV9PQkpFQ1RTIDo9ICQoT0JKRUNUU19MSVNUKQotCi1pZm5lcSAoJChmaW5kc3RyaW5nIG11bHRpLCQoTUFLRUNNREdPQUxTKSksKQotICBPQkpFQ1RTX0xJU1QgKz0gJChPQkpfTSkKLWVsc2UKLSAgT0JKRUNUU19MSVNUICs9ICQoT0JKX1MpCi1lbmRpZgotCi1vYmplY3RzOiAkKE9CSkVDVFNfTElTVCkKLQotbGlicmFyeTogJChQUk9KRUNUX0xJQlJBUlkpCi0KLQotIyBPcHRpb24gYC1CJyBkaXNhYmxlcyBnZW5lcmF0aW9uIG9mIC5weWMgZmlsZXMgKGF2YWlsYWJsZSBzaW5jZSBweXRob24gMi42KQotIwotcmVmZG9jOgotCXB5dGhvbiAtQiAkKFNSQ19ESVIpL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5IFwKLSAgICAgICAgICAgICAgICAgIC0tcHJlZml4PWZ0MiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgLS10aXRsZT1GcmVlVHlwZS0kKHZlcnNpb24pICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAtLW91dHB1dD0kKERPQ19ESVIpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICQoUFVCTElDX0RJUikvKi5oICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgJChQVUJMSUNfRElSKS9jb25maWcvKi5oICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAkKFBVQkxJQ19ESVIpL2NhY2hlLyouaAotCi0KLS5QSE9OWTogY2xlYW5fcHJvamVjdF9zdGQgZGlzdGNsZWFuX3Byb2plY3Rfc3RkCi0KLSMgU3RhbmRhcmQgY2xlYW5pbmcgYW5kIGRpc3RjbGVhbiBydWxlcy4gIFRoZXNlIGFyZSBub3QgYWNjZXB0ZWQKLSMgb24gYWxsIHN5c3RlbXMgdGhvdWdoLgotIwotY2xlYW5fcHJvamVjdF9zdGQ6Ci0JLSQoREVMRVRFKSAkKEJBU0VfT0JKRUNUUykgJChPQkpfTSkgJChPQkpfUykgJChDTEVBTikKLQotZGlzdGNsZWFuX3Byb2plY3Rfc3RkOiBjbGVhbl9wcm9qZWN0X3N0ZAotCS0kKERFTEVURSkgJChQUk9KRUNUX0xJQlJBUlkpCi0JLSQoREVMRVRFKSAqLm9yaWcgKn4gY29yZSAqLmNvcmUgJChESVNUQ0xFQU4pCi0KLQotLlBIT05ZOiBjbGVhbl9wcm9qZWN0X2RvcyBkaXN0Y2xlYW5fcHJvamVjdF9kb3MKLQotIyBUaGUgRG9zIGNvbW1hbmQgc2hlbGwgZG9lcyBub3Qgc3VwcG9ydCB2ZXJ5IGxvbmcgbGlzdCBvZiBhcmd1bWVudHMsIHNvCi0jIHdlIGFyZSBzdHVjayB3aXRoIHdpbGRjYXJkcy4KLSMKLSMgRG9uJ3QgYnJlYWsgdGhlIGNvbW1hbmQgbGluZXMgd2l0aCBcOyB0aGlzIHByZXZlbnRzIHRoZSAiZGVsIiBjb21tYW5kIGZyb20KLSMgd29ya2luZyBjb3JyZWN0bHkgb24gV2luOXguCi0jCi1jbGVhbl9wcm9qZWN0X2RvczoKLQktJChERUxFVEUpICQoc3Vic3QgLywkKFNFUCksJChPQkpfRElSKS8qLiRPICQoQ0xFQU4pICQoTk9fT1VUUFVUKSkKLQotZGlzdGNsZWFuX3Byb2plY3RfZG9zOiBjbGVhbl9wcm9qZWN0X2RvcwotCS0kKERFTEVURSkgJChzdWJzdCAvLCQoU0VQKSwkKFBST0pFQ1RfTElCUkFSWSkgJChESVNUQ0xFQU4pICQoTk9fT1VUUFVUKSkKLQotCi0uUEhPTlk6IHJlbW92ZV9jb25maWdfbWsgcmVtb3ZlX2Z0bW9kdWxlX2gKLQotIyBSZW1vdmUgY29uZmlndXJhdGlvbiBmaWxlICh1c2VkIGZvciBkaXN0Y2xlYW4pLgotIwotcmVtb3ZlX2NvbmZpZ19tazoKLQktJChERUxFVEUpICQoc3Vic3QgLywkKFNFUCksJChDT05GSUdfTUspICQoTk9fT1VUUFVUKSkKLQotIyBSZW1vdmUgbW9kdWxlIGxpc3QgKHVzZWQgZm9yIGRpc3RjbGVhbikuCi0jCi1yZW1vdmVfZnRtb2R1bGVfaDoKLQktJChERUxFVEUpICQoc3Vic3QgLywkKFNFUCksJChGVE1PRFVMRV9IKSAkKE5PX09VVFBVVCkpCi0KLQotLlBIT05ZOiBjbGVhbiBkaXN0Y2xlYW4KLQotIyBUaGUgYGNvbmZpZy5taycgZmlsZSBtdXN0IGRlZmluZSBgY2xlYW5fZnJlZXR5cGUnIGFuZAotIyBgZGlzdGNsZWFuX2ZyZWV0eXBlJy4gIEltcGxlbWVudGF0aW9ucyBtYXkgdXNlIHRvIHJlbGF5IHRoZXNlIHRvIGVpdGhlcgotIyB0aGUgYHN0ZCcgb3IgYGRvcycgdmVyc2lvbnMgZnJvbSBhYm92ZSwgb3Igc2ltcGx5IHByb3ZpZGUgdGhlaXIgb3duCi0jIGltcGxlbWVudGF0aW9uLgotIwotY2xlYW46IGNsZWFuX3Byb2plY3QKLWRpc3RjbGVhbjogZGlzdGNsZWFuX3Byb2plY3QgcmVtb3ZlX2NvbmZpZ19tayByZW1vdmVfZnRtb2R1bGVfaAotCS0kKERFTEVURSkgJChzdWJzdCAvLCQoU0VQKSwkKERPQ19ESVIpLyouaHRtbCAkKE5PX09VVFBVVCkpCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9saW5rX2Rvcy5tayBiL2J1aWxkcy9saW5rX2Rvcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1NGU3MC4uMDAwMDAwMAotLS0gYS9idWlsZHMvbGlua19kb3MubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jCi0jICBMaW5rIGluc3RydWN0aW9ucyBmb3IgRG9zLWxpa2Ugc3lzdGVtcyAoRG9zLCBXaW4zMiwgT1MvMikKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLWlmZGVmIEJVSUxEX1BST0pFQ1QKLQotICAuUEhPTlk6IGNsZWFuX3Byb2plY3QgZGlzdGNsZWFuX3Byb2plY3QKLQotICAjIE5vdyBpbmNsdWRlIHRoZSBtYWluIHN1Yi1tYWtlZmlsZS4gIEl0IGNvbnRhaW5zIGFsbCB0aGUgcnVsZXMgdXNlZCB0bwotICAjIGJ1aWxkIHRoZSBsaWJyYXJ5IHdpdGggdGhlIHByZXZpb3VzIHZhcmlhYmxlcyBkZWZpbmVkLgotICAjCi0gIGluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvJChQUk9KRUNUKS5tawotCi0gICMgVGhlIGNsZWFudXAgdGFyZ2V0cy4KLSAgIwotICBjbGVhbl9wcm9qZWN0OiBjbGVhbl9wcm9qZWN0X2RvcwotICBkaXN0Y2xlYW5fcHJvamVjdDogZGlzdGNsZWFuX3Byb2plY3RfZG9zCi0KLSAgIyBUaGlzIGZpbmFsIHJ1bGUgaXMgdXNlZCB0byBsaW5rIGFsbCBvYmplY3QgZmlsZXMgaW50byBhIHNpbmdsZSBsaWJyYXJ5LgotICAjIHRoaXMgaXMgY29tcGlsZXItc3BlY2lmaWMKLSAgIwotICAkKFBST0pFQ1RfTElCUkFSWSk6ICQoT0JKRUNUU19MSVNUKQotICAgIGlmZGVmIENMRUFOX0xJQlJBUlkKLQkgIC0kKENMRUFOX0xJQlJBUlkpICQoTk9fT1VUUFVUKQotICAgIGVuZGlmCi0JICAkKExJTktfTElCUkFSWSkKLQotZW5kaWYKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2xpbmtfc3RkLm1rIGIvYnVpbGRzL2xpbmtfc3RkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2MyZGM5Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9saW5rX3N0ZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMKLSMgIExpbmsgaW5zdHJ1Y3Rpb25zIGZvciBzdGFuZGFyZCBzeXN0ZW1zCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1pZmRlZiBCVUlMRF9QUk9KRUNUCi0KLSAgLlBIT05ZOiBjbGVhbl9wcm9qZWN0IGRpc3RjbGVhbl9wcm9qZWN0Ci0KLSAgIyBOb3cgaW5jbHVkZSB0aGUgbWFpbiBzdWItbWFrZWZpbGUuICBJdCBjb250YWlucyBhbGwgdGhlIHJ1bGVzIHVzZWQgdG8KLSAgIyBidWlsZCB0aGUgbGlicmFyeSB3aXRoIHRoZSBwcmV2aW91cyB2YXJpYWJsZXMgZGVmaW5lZC4KLSAgIwotICBpbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzLyQoUFJPSkVDVCkubWsKLQotICAjIFRoZSBjbGVhbnVwIHRhcmdldHMuCi0gICMKLSAgY2xlYW5fcHJvamVjdDogY2xlYW5fcHJvamVjdF9zdGQKLSAgZGlzdGNsZWFuX3Byb2plY3Q6IGRpc3RjbGVhbl9wcm9qZWN0X3N0ZAotCi0gICMgVGhpcyBmaW5hbCBydWxlIGlzIHVzZWQgdG8gbGluayBhbGwgb2JqZWN0IGZpbGVzIGludG8gYSBzaW5nbGUgbGlicmFyeS4KLSAgIyB0aGlzIGlzIGNvbXBpbGVyLXNwZWNpZmljCi0gICMKLSAgJChQUk9KRUNUX0xJQlJBUlkpOiAkKE9CSkVDVFNfTElTVCkKLSAgICBpZmRlZiBDTEVBTl9MSUJSQVJZCi0JICAtJChDTEVBTl9MSUJSQVJZKSAkKE5PX09VVFBVVCkKLSAgICBlbmRpZgotCSAgJChMSU5LX0xJQlJBUlkpCi0KLWVuZGlmCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19jZm0ubWFrZS50eHQgYi9idWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfY2ZtLm1ha2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGE1NWY1Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19jZm0ubWFrZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotIyAgIEZpbGU6ICAgICAgIEZyZWVUeXBlLm02OGtfY2ZtLm1ha2UKLSMgICBUYXJnZXQ6ICAgICBGcmVlVHlwZS5tNjhrX2NmbQotIyAgIENyZWF0ZWQ6ICAgIFRodXJzZGF5LCBPY3RvYmVyIDI3LCAyMDA1IDA5OjIzOjI1IFBNCi0KLQotTUFLRUZJTEUgICAgICAgID0gRnJlZVR5cGUubTY4a19jZm0ubWFrZQotXHhBNU1vbmRvQnVpbGRceEE1ICAgID0ge01BS0VGSUxFfSAgIyBNYWtlIGJsYW5rIHRvIGF2b2lkIHJlYnVpbGRzIHdoZW4gbWFrZWZpbGUgaXMgbW9kaWZpZWQKLQotT2JqRGlyICAgICAgICAgID0gOm9ianM6Ci1JbmNsdWRlcyAgICAgICAgPSAgXHhCNgotCQkJCSAgLWFuc2kgc3RyaWN0IFx4QjYKLQkJCQkgIC1pbmNsdWRlcyB1bml4IFx4QjYKLQkJCQkgIC1pIDppbmNsdWRlOiBceEI2Ci0JCQkJICAtaSA6c3JjOiBceEI2Ci0JCQkJICAtaSA6aW5jbHVkZTpmcmVldHlwZTpjb25maWc6Ci0KLVN5bS02OEsgICAgICAgICA9IC1zeW0gb2ZmCi0KLUNPcHRpb25zICAgICAgICA9IFx4QjYKLQkJCS1kIEZUX01BQ0lOVE9TSD0xIFx4QjYKLQkJCS1kIEhBVkVfRlNTUEVDPTEgXHhCNgotCQkJLWQgSEFWRV9GU1JFRj0wIFx4QjYKLQkJCS1kIEhBVkVfUVVJQ0tEUkFXX1RPT0xCT1g9MSBceEI2Ci0JCQktZCBIQVZFX1FVSUNLRFJBV19DQVJCT049MCBceEI2Ci0JCQktZCBIQVZFX0FUUz0wIFx4QjYKLQkJCS1kIEZUMl9CVUlMRF9MSUJSQVJZIFx4QjYKLQkJCS1kIEZUX0NPTkZJR19DT05GSUdfSD0iPGZ0Y29uZmlnLmg+IiBceEI2Ci0JCQktZCBGVF9DT05GSUdfTU9EVUxFU19IPSI8ZnRtb2R1bGUuaD4iIFx4QjYKLQkJCXtJbmNsdWRlc30ge1N5bS02OEt9IC1tb2RlbCBjZm1zZWcKLQotCi0jIyMgU291cmNlIEZpbGVzICMjIwotCi1TcmNGaWxlcyAgICAgICAgPSAgXHhCNgotCQkJCSAgOnNyYzphdXRvZml0OmF1dG9maXQuYyBceEI2Ci0JCQkJICA6YnVpbGRzOm1hYzpmdGJhc2UuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRiYm94LmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0YmRmLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0Yml0bWFwLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0ZGVidWcuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRmbnRmbXQuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRmc3R5cGUuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRnbHlwaC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGd4dmFsLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0aW5pdC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdG1tLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0b3R2YWwuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRwZnIuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRzdHJva2UuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRzeW50aC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdHN5c3RlbS5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdHR5cGUxLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0d2luZm50LmMgXHhCNgotCQkJCSAgOnNyYzpjYWNoZTpmdGNhY2hlLmMgXHhCNgotCQkJCSAgOnNyYzpiZGY6YmRmLmMgXHhCNgotCQkJCSAgOnNyYzpjZmY6Y2ZmLmMgXHhCNgotCQkJCSAgOnNyYzpjaWQ6dHlwZTFjaWQuYyBceEI2Ci0jCQkJCSAgOnNyYzpneHZhbGlkOmd4dmFsaWQuYyBceEI2Ci0JCQkJICA6c3JjOmd6aXA6ZnRnemlwLmMgXHhCNgotCQkJCSAgOnNyYzpiemlwMjpmdGJ6aXAyLmMgXHhCNgotCQkJCSAgOnNyYzpsenc6ZnRsencuYyBceEI2Ci0JCQkJICA6c3JjOm90dmFsaWQ6b3R2YWxpZC5jIFx4QjYKLQkJCQkgIDpzcmM6cGNmOnBjZi5jIFx4QjYKLQkJCQkgIDpzcmM6cGZyOnBmci5jIFx4QjYKLQkJCQkgIDpzcmM6cHNhdXg6cHNhdXguYyBceEI2Ci0JCQkJICA6c3JjOnBzaGludGVyOnBzaGludGVyLmMgXHhCNgotCQkJCSAgOnNyYzpwc25hbWVzOnBzbW9kdWxlLmMgXHhCNgotCQkJCSAgOnNyYzpyYXN0ZXI6cmFzdGVyLmMgXHhCNgotCQkJCSAgOnNyYzpzZm50OnNmbnQuYyBceEI2Ci0JCQkJICA6c3JjOnNtb290aDpzbW9vdGguYyBceEI2Ci0JCQkJICA6c3JjOnRydWV0eXBlOnRydWV0eXBlLmMgXHhCNgotCQkJCSAgOnNyYzp0eXBlMTp0eXBlMS5jIFx4QjYKLQkJCQkgIDpzcmM6dHlwZTQyOnR5cGU0Mi5jIFx4QjYKLQkJCQkgIDpzcmM6d2luZm9udHM6d2luZm50LmMKLQotCi0jIyMgT2JqZWN0IEZpbGVzICMjIwotCi1PYmpGaWxlcy02OEsgICAgPSAgXHhCNgotCQkJCSAgIntPYmpEaXJ9YXV0b2ZpdC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmFzZS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmJveC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmRmLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRiaXRtYXAuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGRlYnVnLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRmbnRmbXQuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGZzdHlwZS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0Z2x5cGguYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGd4dmFsLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRpbml0LmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRtbS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0b3R2YWwuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdHBmci5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0c3Ryb2tlLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRzeW50aC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0c3lzdGVtLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnR0eXBlMS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0d2luZm50LmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRjYWNoZS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWJkZi5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWNmZi5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXR5cGUxY2lkLmMubyIgXHhCNgotIwkJCQkgICJ7T2JqRGlyfWd4dmFsaWQuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGd6aXAuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGJ6aXAyLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRsencuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1vdHZhbGlkLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cGNmLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cGZyLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cHNhdXguYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1wc2hpbnRlci5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXBzbW9kdWxlLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cmFzdGVyLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9c2ZudC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXNtb290aC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXRydWV0eXBlLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9dHlwZTEuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn10eXBlNDIuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn13aW5mbnQuYy5vIgotCi0KLSMjIyBMaWJyYXJpZXMgIyMjCi0KLUxpYkZpbGVzLTY4SyAgICA9Ci0KLQotIyMjIERlZmF1bHQgUnVsZXMgIyMjCi0KLS5jLm8gIFx4QzQgIC5jICB7XHhBNU1vbmRvQnVpbGRceEE1fQotCXtDfSB7ZGVwRGlyfXtkZWZhdWx0fS5jIC1vIHt0YXJnRGlyfXtkZWZhdWx0fS5jLm8ge0NPcHRpb25zfQotCi0KLSMjIyBCdWlsZCBSdWxlcyAjIyMKLQotOmJ1aWxkczptYWM6ZnRiYXNlLmMgXHhDNFx4QzQgOnNyYzpiYXNlOmZ0YmFzZS5jCi0JRHVwbGljYXRlIDpzcmM6YmFzZTpmdGJhc2UuYyA6YnVpbGRzOm1hYzpmdGJhc2UuYwotCi0ie09iakRpcn1mdGJhc2UuYy5vIiBceEM0XHhDNCA6YnVpbGRzOm1hYzpmdGJhc2UuYwotCXtDfSA6YnVpbGRzOm1hYzpmdGJhc2UuYyAtbyAie09iakRpcn1mdGJhc2UuYy5vIiBceEI2Ci0JCS1pIDpidWlsZHM6bWFjOiBceEI2Ci0JCS1pIDpzcmM6YmFzZTogXHhCNgotCQl7Q09wdGlvbnN9Ci0KLUZyZWVUeXBlLm02OGtfY2ZtICAgIFx4QzRceEM0ICBGcmVlVHlwZS5tNjhrX2NmbS5vCi0KLUZyZWVUeXBlLm02OGtfY2ZtLm8gIFx4QzRceEM0ICB7T2JqRmlsZXMtNjhLfSB7TGliRmlsZXMtNjhLfSB7XHhBNU1vbmRvQnVpbGRceEE1fQotCUxpYiBceEI2Ci0JCS1vIHtUYXJnfSBceEI2Ci0JCXtPYmpGaWxlcy02OEt9IFx4QjYKLQkJe0xpYkZpbGVzLTY4S30gXHhCNgotCQl7U3ltLTY4S30gXHhCNgotCQktbWYgLWQKLQotCi0KLSMjIyBSZXF1aXJlZCBEZXBlbmRlbmNpZXMgIyMjCi0KLSJ7T2JqRGlyfWF1dG9maXQuYy5vIiBceEM0IDpzcmM6YXV0b2ZpdDphdXRvZml0LmMKLSMgIntPYmpEaXJ9ZnRiYXNlLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRiYXNlLmMKLSJ7T2JqRGlyfWZ0YmJveC5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0YmJveC5jCi0ie09iakRpcn1mdGJkZi5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0YmRmLmMKLSJ7T2JqRGlyfWZ0Yml0bWFwLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRiaXRtYXAuYwotIntPYmpEaXJ9ZnRkZWJ1Zy5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0ZGVidWcuYwotIntPYmpEaXJ9ZnRmbnRmbXQuYy5vIiBceEM0IDpzcmM6YmFzZTpmdGZudGZtdC5jCi0ie09iakRpcn1mdGZzdHlwZS5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0ZnN0eXBlLmMKLSJ7T2JqRGlyfWZ0Z2x5cGguYy5vIiBceEM0IDpzcmM6YmFzZTpmdGdseXBoLmMKLSJ7T2JqRGlyfWZ0Z3h2YWwuYy5vIiBceEM0IDpzcmM6YmFzZTpmdGd4dmFsLmMKLSJ7T2JqRGlyfWZ0aW5pdC5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0aW5pdC5jCi0ie09iakRpcn1mdG1tLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRtbS5jCi0ie09iakRpcn1mdG90dmFsLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRvdHZhbC5jCi0ie09iakRpcn1mdHBmci5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0cGZyLmMKLSJ7T2JqRGlyfWZ0c3Ryb2tlLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRzdHJva2UuYwotIntPYmpEaXJ9ZnRzeW50aC5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0c3ludGguYwotIntPYmpEaXJ9ZnRzeXN0ZW0uYy5vIiBceEM0IDpzcmM6YmFzZTpmdHN5c3RlbS5jCi0ie09iakRpcn1mdHR5cGUxLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnR0eXBlMS5jCi0ie09iakRpcn1mdHdpbmZudC5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0d2luZm50LmMKLSJ7T2JqRGlyfWZ0Y2FjaGUuYy5vIiBceEM0IDpzcmM6Y2FjaGU6ZnRjYWNoZS5jCi0ie09iakRpcn1iZGYuYy5vIiBceEM0IDpzcmM6YmRmOmJkZi5jCi0ie09iakRpcn1jZmYuYy5vIiBceEM0IDpzcmM6Y2ZmOmNmZi5jCi0ie09iakRpcn10eXBlMWNpZC5jLm8iIFx4QzQgOnNyYzpjaWQ6dHlwZTFjaWQuYwotIyAie09iakRpcn1neHZhbGlkLmMubyIgXHhDNCA6c3JjOmd4dmFsaWQ6Z3h2YWxpZC5jCi0ie09iakRpcn1mdGd6aXAuYy5vIiBceEM0IDpzcmM6Z3ppcDpmdGd6aXAuYwotIntPYmpEaXJ9ZnRiemlwMi5jLm8iIFx4QzQgOnNyYzpiemlwMjpmdGJ6aXAyLmMKLSJ7T2JqRGlyfWZ0bHp3LmMubyIgXHhDNCA6c3JjOmx6dzpmdGx6dy5jCi0ie09iakRpcn1vdHZhbGlkLmMubyIgXHhDNCA6c3JjOm90dmFsaWQ6b3R2YWxpZC5jCi0ie09iakRpcn1wY2YuYy5vIiBceEM0IDpzcmM6cGNmOnBjZi5jCi0ie09iakRpcn1wZnIuYy5vIiBceEM0IDpzcmM6cGZyOnBmci5jCi0ie09iakRpcn1wc2F1eC5jLm8iIFx4QzQgOnNyYzpwc2F1eDpwc2F1eC5jCi0ie09iakRpcn1wc2hpbnRlci5jLm8iIFx4QzQgOnNyYzpwc2hpbnRlcjpwc2hpbnRlci5jCi0ie09iakRpcn1wc21vZHVsZS5jLm8iIFx4QzQgOnNyYzpwc25hbWVzOnBzbW9kdWxlLmMKLSJ7T2JqRGlyfXJhc3Rlci5jLm8iIFx4QzQgOnNyYzpyYXN0ZXI6cmFzdGVyLmMKLSJ7T2JqRGlyfXNmbnQuYy5vIiBceEM0IDpzcmM6c2ZudDpzZm50LmMKLSJ7T2JqRGlyfXNtb290aC5jLm8iIFx4QzQgOnNyYzpzbW9vdGg6c21vb3RoLmMKLSJ7T2JqRGlyfXRydWV0eXBlLmMubyIgXHhDNCA6c3JjOnRydWV0eXBlOnRydWV0eXBlLmMKLSJ7T2JqRGlyfXR5cGUxLmMubyIgXHhDNCA6c3JjOnR5cGUxOnR5cGUxLmMKLSJ7T2JqRGlyfXR5cGU0Mi5jLm8iIFx4QzQgOnNyYzp0eXBlNDI6dHlwZTQyLmMKLSJ7T2JqRGlyfXdpbmZudC5jLm8iIFx4QzQgOnNyYzp3aW5mb250czp3aW5mbnQuYwotCi0KLSMjIyBPcHRpb25hbCBEZXBlbmRlbmNpZXMgIyMjCi0jIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gZ2VuZXJhdGUgImluY2x1ZGUgZmlsZSIgZGVwZW5kZW5jaWVzLiAjIyMKLQotRGVwZW5kZW5jaWVzICBceEM0ICAkT3V0T2ZEYXRlCi0JTWFrZURlcGVuZCBceEI2Ci0JCS1hcHBlbmQge01BS0VGSUxFfSBceEI2Ci0JCS1pZ25vcmUgIntDSW5jbHVkZXN9IiBceEI2Ci0JCS1vYmpkaXIgIntPYmpEaXJ9IiBceEI2Ci0JCS1vYmpleHQgLm8gXHhCNgotCQl7SW5jbHVkZXN9IFx4QjYKLQkJe1NyY0ZpbGVzfQotCi0KZGlmZiAtLWdpdCBhL2J1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19mYXIubWFrZS50eHQgYi9idWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfZmFyLm1ha2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWI3ZjZmLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19mYXIubWFrZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotIyAgIEZpbGU6ICAgICAgIEZyZWVUeXBlLm02OGtfZmFyLm1ha2UKLSMgICBUYXJnZXQ6ICAgICBGcmVlVHlwZS5tNjhrX2ZhcgotIyAgIENyZWF0ZWQ6ICAgIFR1ZXNkYXksIE9jdG9iZXIgMjUsIDIwMDUgMDM6MzQ6MDUgUE0KLQotCi1NQUtFRklMRSAgICAgICAgPSBGcmVlVHlwZS5tNjhrX2Zhci5tYWtlCi1ceEE1TW9uZG9CdWlsZFx4QTUgICAgPSB7TUFLRUZJTEV9ICAjIE1ha2UgYmxhbmsgdG8gYXZvaWQgcmVidWlsZHMgd2hlbiBtYWtlZmlsZSBpcyBtb2RpZmllZAotCi1PYmpEaXIgICAgICAgICAgPSA6b2JqczoKLUluY2x1ZGVzICAgICAgICA9ICBceEI2Ci0JCQkJICAtaW5jbHVkZXMgdW5peCBceEI2Ci0JCQkJICAtaSA6aW5jbHVkZTogXHhCNgotCQkJCSAgLWkgOnNyYzogXHhCNgotCQkJCSAgLWkgOmluY2x1ZGU6ZnJlZXR5cGU6Y29uZmlnOgotCi1TeW0tNjhLICAgICAgICAgPSAtc3ltIG9mZgotCi1DT3B0aW9ucyAgICAgICAgPSBceEI2Ci0JCQktZCBGVF9NQUNJTlRPU0g9MSBceEI2Ci0JCQktZCBIQVZFX0ZTU1BFQz0xIFx4QjYKLQkJCS1kIEhBVkVfRlNSRUY9MCBceEI2Ci0JCQktZCBIQVZFX1FVSUNLRFJBV19UT09MQk9YPTEgXHhCNgotCQkJLWQgSEFWRV9RVUlDS0RSQVdfQ0FSQk9OPTAgXHhCNgotCQkJLWQgSEFWRV9BVFM9MCBceEI2Ci0JCQktZCBGVDJfQlVJTERfTElCUkFSWSBceEI2Ci0JCQktZCBGVF9DT05GSUdfQ09ORklHX0g9IjxmdGNvbmZpZy5oPiIgXHhCNgotCQkJLWQgRlRfQ09ORklHX01PRFVMRVNfSD0iPGZ0bW9kdWxlLmg+IiBceEI2Ci0JCQl7SW5jbHVkZXN9IHtTeW0tNjhLfSAtbW9kZWwgZmFyCi0KLQotIyMjIFNvdXJjZSBGaWxlcyAjIyMKLQotU3JjRmlsZXMgICAgICAgID0gIFx4QjYKLQkJCQkgIDpzcmM6YXV0b2ZpdDphdXRvZml0LmMgXHhCNgotCQkJCSAgOmJ1aWxkczptYWM6ZnRiYXNlLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0YmJveC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGJkZi5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGJpdG1hcC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGRlYnVnLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0Zm50Zm10LmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0ZnN0eXBlLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0Z2x5cGguYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRneHZhbC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGluaXQuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRtbS5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdG90dmFsLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0cGZyLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0c3Ryb2tlLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0c3ludGguYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRzeXN0ZW0uYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnR0eXBlMS5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdHdpbmZudC5jIFx4QjYKLQkJCQkgIDpzcmM6Y2FjaGU6ZnRjYWNoZS5jIFx4QjYKLQkJCQkgIDpzcmM6YmRmOmJkZi5jIFx4QjYKLQkJCQkgIDpzcmM6Y2ZmOmNmZi5jIFx4QjYKLQkJCQkgIDpzcmM6Y2lkOnR5cGUxY2lkLmMgXHhCNgotCQkJCSAgOnNyYzpneHZhbGlkOmd4dmFsaWQuYyBceEI2Ci0JCQkJICA6c3JjOmd6aXA6ZnRnemlwLmMgXHhCNgotCQkJCSAgOnNyYzpiemlwMjpmdGJ6aXAyLmMgXHhCNgotCQkJCSAgOnNyYzpsenc6ZnRsencuYyBceEI2Ci0JCQkJICA6c3JjOm90dmFsaWQ6b3R2YWxpZC5jIFx4QjYKLQkJCQkgIDpzcmM6cGNmOnBjZi5jIFx4QjYKLQkJCQkgIDpzcmM6cGZyOnBmci5jIFx4QjYKLQkJCQkgIDpzcmM6cHNhdXg6cHNhdXguYyBceEI2Ci0JCQkJICA6c3JjOnBzaGludGVyOnBzaGludGVyLmMgXHhCNgotCQkJCSAgOnNyYzpwc25hbWVzOnBzbW9kdWxlLmMgXHhCNgotCQkJCSAgOnNyYzpyYXN0ZXI6cmFzdGVyLmMgXHhCNgotCQkJCSAgOnNyYzpzZm50OnNmbnQuYyBceEI2Ci0JCQkJICA6c3JjOnNtb290aDpzbW9vdGguYyBceEI2Ci0JCQkJICA6c3JjOnRydWV0eXBlOnRydWV0eXBlLmMgXHhCNgotCQkJCSAgOnNyYzp0eXBlMTp0eXBlMS5jIFx4QjYKLQkJCQkgIDpzcmM6dHlwZTQyOnR5cGU0Mi5jIFx4QjYKLQkJCQkgIDpzcmM6d2luZm9udHM6d2luZm50LmMKLQotCi0jIyMgT2JqZWN0IEZpbGVzICMjIwotCi1PYmpGaWxlcy02OEsgICAgPSAgXHhCNgotCQkJCSAgIntPYmpEaXJ9YXV0b2ZpdC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmFzZS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmJveC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmRmLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRiaXRtYXAuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGRlYnVnLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRmbnRmbXQuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGZzdHlwZS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0Z2x5cGguYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGd4dmFsLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRpbml0LmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRtbS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0b3R2YWwuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdHBmci5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0c3Ryb2tlLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRzeW50aC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0c3lzdGVtLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnR0eXBlMS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0d2luZm50LmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRjYWNoZS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWJkZi5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWNmZi5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXR5cGUxY2lkLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9Z3h2YWxpZC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0Z3ppcC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YnppcDIuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1mdGx6dy5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfW90dmFsaWQuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1wY2YuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1wZnIuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1wc2F1eC5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXBzaGludGVyLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cHNtb2R1bGUuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1yYXN0ZXIuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn1zZm50LmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9c21vb3RoLmMubyIgXHhCNgotCQkJCSAgIntPYmpEaXJ9dHJ1ZXR5cGUuYy5vIiBceEI2Ci0JCQkJICAie09iakRpcn10eXBlMS5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXR5cGU0Mi5jLm8iIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXdpbmZudC5jLm8iCi0KLQotIyMjIExpYnJhcmllcyAjIyMKLQotTGliRmlsZXMtNjhLICAgID0KLQotCi0jIyMgRGVmYXVsdCBSdWxlcyAjIyMKLQotLmMubyAgXHhDNCAgLmMgIHtceEE1TW9uZG9CdWlsZFx4QTV9Ci0Je0N9IHtkZXBEaXJ9e2RlZmF1bHR9LmMgLW8ge3RhcmdEaXJ9e2RlZmF1bHR9LmMubyB7Q09wdGlvbnN9IFx4QjYKLQktYW5zaSBzdHJpY3QKLQotIyMjIEJ1aWxkIFJ1bGVzICMjIwotCi06YnVpbGRzOm1hYzpmdGJhc2UuYyBceEM0XHhDNCA6c3JjOmJhc2U6ZnRiYXNlLmMKLQlEdXBsaWNhdGUgOnNyYzpiYXNlOmZ0YmFzZS5jIDpidWlsZHM6bWFjOmZ0YmFzZS5jCi0KLSJ7T2JqRGlyfWZ0YmFzZS5jLm8iIFx4QzRceEM0IDpidWlsZHM6bWFjOmZ0YmFzZS5jCi0Je0N9IDpidWlsZHM6bWFjOmZ0YmFzZS5jIC1vICJ7T2JqRGlyfWZ0YmFzZS5jLm8iIFx4QjYKLQkJCQktaSA6YnVpbGRzOm1hYzogXHhCNgotCQkJCS1pIDpzcmM6YmFzZTogXHhCNgotCQkJCXtDT3B0aW9uc30KLQotRnJlZVR5cGUubTY4a19mYXIgICAgXHhDNFx4QzQgIEZyZWVUeXBlLm02OGtfZmFyLm8KLQotRnJlZVR5cGUubTY4a19mYXIubyAgXHhDNFx4QzQgIHtPYmpGaWxlcy02OEt9IHtMaWJGaWxlcy02OEt9IHtceEE1TW9uZG9CdWlsZFx4QTV9Ci0JTGliIFx4QjYKLQkJLW8ge1Rhcmd9IFx4QjYKLQkJe09iakZpbGVzLTY4S30gXHhCNgotCQl7TGliRmlsZXMtNjhLfSBceEI2Ci0JCXtTeW0tNjhLfSBceEI2Ci0JCS1tZiAtZAotCi0KLQotIyMjIFJlcXVpcmVkIERlcGVuZGVuY2llcyAjIyMKLQotIntPYmpEaXJ9YXV0b2ZpdC5jLm8iIFx4QzQgOnNyYzphdXRvZml0OmF1dG9maXQuYwotIyAie09iakRpcn1mdGJhc2UuYy5vIiBceEM0IDpzcmM6YmFzZTpmdGJhc2UuYwotIntPYmpEaXJ9ZnRiYm94LmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRiYm94LmMKLSJ7T2JqRGlyfWZ0YmRmLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRiZGYuYwotIntPYmpEaXJ9ZnRiaXRtYXAuYy5vIiBceEM0IDpzcmM6YmFzZTpmdGJpdG1hcC5jCi0ie09iakRpcn1mdGRlYnVnLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRkZWJ1Zy5jCi0ie09iakRpcn1mdGZudGZtdC5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0Zm50Zm10LmMKLSJ7T2JqRGlyfWZ0ZnN0eXBlLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRmc3R5cGUuYwotIntPYmpEaXJ9ZnRnbHlwaC5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0Z2x5cGguYwotIntPYmpEaXJ9ZnRneHZhbC5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0Z3h2YWwuYwotIntPYmpEaXJ9ZnRpbml0LmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRpbml0LmMKLSJ7T2JqRGlyfWZ0bW0uYy5vIiBceEM0IDpzcmM6YmFzZTpmdG1tLmMKLSJ7T2JqRGlyfWZ0b3R2YWwuYy5vIiBceEM0IDpzcmM6YmFzZTpmdG90dmFsLmMKLSJ7T2JqRGlyfWZ0cGZyLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRwZnIuYwotIntPYmpEaXJ9ZnRzdHJva2UuYy5vIiBceEM0IDpzcmM6YmFzZTpmdHN0cm9rZS5jCi0ie09iakRpcn1mdHN5bnRoLmMubyIgXHhDNCA6c3JjOmJhc2U6ZnRzeW50aC5jCi0ie09iakRpcn1mdHN5c3RlbS5jLm8iIFx4QzQgOnNyYzpiYXNlOmZ0c3lzdGVtLmMKLSJ7T2JqRGlyfWZ0dHlwZTEuYy5vIiBceEM0IDpzcmM6YmFzZTpmdHR5cGUxLmMKLSJ7T2JqRGlyfWZ0d2luZm50LmMubyIgXHhDNCA6c3JjOmJhc2U6ZnR3aW5mbnQuYwotIntPYmpEaXJ9ZnRjYWNoZS5jLm8iIFx4QzQgOnNyYzpjYWNoZTpmdGNhY2hlLmMKLSJ7T2JqRGlyfWJkZi5jLm8iIFx4QzQgOnNyYzpiZGY6YmRmLmMKLSJ7T2JqRGlyfWNmZi5jLm8iIFx4QzQgOnNyYzpjZmY6Y2ZmLmMKLSJ7T2JqRGlyfXR5cGUxY2lkLmMubyIgXHhDNCA6c3JjOmNpZDp0eXBlMWNpZC5jCi0ie09iakRpcn1neHZhbGlkLmMubyIgXHhDNCA6c3JjOmd4dmFsaWQ6Z3h2YWxpZC5jCi0ie09iakRpcn1mdGd6aXAuYy5vIiBceEM0IDpzcmM6Z3ppcDpmdGd6aXAuYwotIntPYmpEaXJ9ZnRiemlwMi5jLm8iIFx4QzQgOnNyYzpiemlwMjpmdGJ6aXAyLmMKLSJ7T2JqRGlyfWZ0bHp3LmMubyIgXHhDNCA6c3JjOmx6dzpmdGx6dy5jCi0ie09iakRpcn1vdHZhbGlkLmMubyIgXHhDNCA6c3JjOm90dmFsaWQ6b3R2YWxpZC5jCi0ie09iakRpcn1wY2YuYy5vIiBceEM0IDpzcmM6cGNmOnBjZi5jCi0ie09iakRpcn1wZnIuYy5vIiBceEM0IDpzcmM6cGZyOnBmci5jCi0ie09iakRpcn1wc2F1eC5jLm8iIFx4QzQgOnNyYzpwc2F1eDpwc2F1eC5jCi0ie09iakRpcn1wc2hpbnRlci5jLm8iIFx4QzQgOnNyYzpwc2hpbnRlcjpwc2hpbnRlci5jCi0ie09iakRpcn1wc21vZHVsZS5jLm8iIFx4QzQgOnNyYzpwc25hbWVzOnBzbW9kdWxlLmMKLSJ7T2JqRGlyfXJhc3Rlci5jLm8iIFx4QzQgOnNyYzpyYXN0ZXI6cmFzdGVyLmMKLSJ7T2JqRGlyfXNmbnQuYy5vIiBceEM0IDpzcmM6c2ZudDpzZm50LmMKLSJ7T2JqRGlyfXNtb290aC5jLm8iIFx4QzQgOnNyYzpzbW9vdGg6c21vb3RoLmMKLSJ7T2JqRGlyfXRydWV0eXBlLmMubyIgXHhDNCA6c3JjOnRydWV0eXBlOnRydWV0eXBlLmMKLSJ7T2JqRGlyfXR5cGUxLmMubyIgXHhDNCA6c3JjOnR5cGUxOnR5cGUxLmMKLSJ7T2JqRGlyfXR5cGU0Mi5jLm8iIFx4QzQgOnNyYzp0eXBlNDI6dHlwZTQyLmMKLSJ7T2JqRGlyfXdpbmZudC5jLm8iIFx4QzQgOnNyYzp3aW5mb250czp3aW5mbnQuYwotCi0KLSMjIyBPcHRpb25hbCBEZXBlbmRlbmNpZXMgIyMjCi0jIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gZ2VuZXJhdGUgImluY2x1ZGUgZmlsZSIgZGVwZW5kZW5jaWVzLiAjIyMKLQotRGVwZW5kZW5jaWVzICBceEM0ICAkT3V0T2ZEYXRlCi0JTWFrZURlcGVuZCBceEI2Ci0JCS1hcHBlbmQge01BS0VGSUxFfSBceEI2Ci0JCS1pZ25vcmUgIntDSW5jbHVkZXN9IiBceEI2Ci0JCS1vYmpkaXIgIntPYmpEaXJ9IiBceEI2Ci0JCS1vYmpleHQgLm8gXHhCNgotCQl7SW5jbHVkZXN9IFx4QjYKLQkJe1NyY0ZpbGVzfQotCi0KZGlmZiAtLWdpdCBhL2J1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NhcmJvbi5tYWtlLnR4dCBiL2J1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NhcmJvbi5tYWtlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViMWRhYy4uMDAwMDAwMAotLS0gYS9idWlsZHMvbWFjL0ZyZWVUeXBlLnBwY19jYXJib24ubWFrZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotIyAgIEZpbGU6ICAgICAgIEZyZWVUeXBlLnBwY19jYXJib24ubWFrZQotIyAgIFRhcmdldDogICAgIEZyZWVUeXBlLnBwY19jYXJib24KLSMgICBDcmVhdGVkOiAgICBGcmlkYXksIE9jdG9iZXIgMjgsIDIwMDUgMDM6NDA6MDYgUE0KLQotCi1NQUtFRklMRSAgICAgICAgPSBGcmVlVHlwZS5wcGNfY2FyYm9uLm1ha2UKLVx4QTVNb25kb0J1aWxkXHhBNSAgICA9IHtNQUtFRklMRX0gICMgTWFrZSBibGFuayB0byBhdm9pZCByZWJ1aWxkcyB3aGVuIG1ha2VmaWxlIGlzIG1vZGlmaWVkCi0KLU9iakRpciAgICAgICAgICA9IDpvYmpzOgotSW5jbHVkZXMgICAgICAgID0gIFx4QjYKLQkJCQkgIC1hbnNpIHN0cmljdCBceEI2Ci0JCQkJICAtaW5jbHVkZXMgdW5peCBceEI2Ci0JCQkJICAtaSA6aW5jbHVkZTogXHhCNgotCQkJCSAgLWkgOnNyYzogXHhCNgotCQkJCSAgLWkgOmluY2x1ZGU6ZnJlZXR5cGU6Y29uZmlnOgotCi1TeW0tUFBDICAgICAgICAgPSAtc3ltIG9mZgotCi1QUENDT3B0aW9ucyAgICAgPSBceEI2Ci0JCQktZCBGVF9NQUNJTlRPU0g9MSBceEI2Ci0JCQktZCBIQVZFX0ZTU1BFQz0xIFx4QjYKLSAgICAgICAgICAgICAgICAgICAgICAgIC1kIEhBVkVfRlNSRUY9MSBceEI2Ci0JCQktZCBIQVZFX1FVSUNLRFJBV19UT09MQk9YPTEgXHhCNgotCQkJLWQgSEFWRV9RVUlDS0RSQVdfQ0FSQk9OPTEgXHhCNgotICAgICAgICAgICAgICAgICAgICAgICAgLWQgSEFWRV9BVFM9MCBceEI2Ci0JCQktZCBGVDJfQlVJTERfTElCUkFSWSBceEI2Ci0JCQktZCBGVF9DT05GSUdfQ09ORklHX0g9IjxmdGNvbmZpZy5oPiIgXHhCNgotCQkJLWQgRlRfQ09ORklHX01PRFVMRVNfSD0iPGZ0bW9kdWxlLmg+IiBceEI2Ci0JCQl7SW5jbHVkZXN9IHtTeW0tUFBDfSAtZCBUQVJHRVRfQVBJX01BQ19DQVJCT049MQotCi0KLSMjIyBTb3VyY2UgRmlsZXMgIyMjCi0KLVNyY0ZpbGVzICAgICAgICA9ICBceEI2Ci0JCQkJICA6c3JjOmF1dG9maXQ6YXV0b2ZpdC5jIFx4QjYKLQkJCQkgIDpidWlsZHM6bWFjOmZ0YmFzZS5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGJib3guYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRiZGYuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRiaXRtYXAuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRkZWJ1Zy5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGZudGZtdC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGZzdHlwZS5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGdseXBoLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0Z3h2YWwuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRpbml0LmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0bW0uYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRvdHZhbC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdHBmci5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdHN0cm9rZS5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdHN5bnRoLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0c3lzdGVtLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0dHlwZTEuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnR3aW5mbnQuYyBceEI2Ci0JCQkJICA6c3JjOmNhY2hlOmZ0Y2FjaGUuYyBceEI2Ci0JCQkJICA6c3JjOmJkZjpiZGYuYyBceEI2Ci0JCQkJICA6c3JjOmNmZjpjZmYuYyBceEI2Ci0JCQkJICA6c3JjOmNpZDp0eXBlMWNpZC5jIFx4QjYKLQkJCQkgIDpzcmM6Z3h2YWxpZDpneHZhbGlkLmMgXHhCNgotCQkJCSAgOnNyYzpnemlwOmZ0Z3ppcC5jIFx4QjYKLQkJCQkgIDpzcmM6YnppcDI6ZnRiemlwMi5jIFx4QjYKLQkJCQkgIDpzcmM6bHp3OmZ0bHp3LmMgXHhCNgotCQkJCSAgOnNyYzpvdHZhbGlkOm90dmFsaWQuYyBceEI2Ci0JCQkJICA6c3JjOnBjZjpwY2YuYyBceEI2Ci0JCQkJICA6c3JjOnBmcjpwZnIuYyBceEI2Ci0JCQkJICA6c3JjOnBzYXV4OnBzYXV4LmMgXHhCNgotCQkJCSAgOnNyYzpwc2hpbnRlcjpwc2hpbnRlci5jIFx4QjYKLQkJCQkgIDpzcmM6cHNuYW1lczpwc21vZHVsZS5jIFx4QjYKLQkJCQkgIDpzcmM6cmFzdGVyOnJhc3Rlci5jIFx4QjYKLQkJCQkgIDpzcmM6c2ZudDpzZm50LmMgXHhCNgotCQkJCSAgOnNyYzpzbW9vdGg6c21vb3RoLmMgXHhCNgotCQkJCSAgOnNyYzp0cnVldHlwZTp0cnVldHlwZS5jIFx4QjYKLQkJCQkgIDpzcmM6dHlwZTE6dHlwZTEuYyBceEI2Ci0JCQkJICA6c3JjOnR5cGU0Mjp0eXBlNDIuYyBceEI2Ci0JCQkJICA6c3JjOndpbmZvbnRzOndpbmZudC5jCi0KLQotIyMjIE9iamVjdCBGaWxlcyAjIyMKLQotT2JqRmlsZXMtUFBDICAgID0gIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWF1dG9maXQuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGJhc2UuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGJib3guYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGJkZi5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0Yml0bWFwLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRkZWJ1Zy5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0Zm50Zm10LmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRmc3R5cGUuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGdseXBoLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRneHZhbC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0aW5pdC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0bW0uYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdG90dmFsLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRwZnIuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdHN0cm9rZS5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0c3ludGguYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdHN5c3RlbS5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0dHlwZTEuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdHdpbmZudC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0Y2FjaGUuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1iZGYuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1jZmYuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn10eXBlMWNpZC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWd4dmFsaWQuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGd6aXAuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGJ6aXAyLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRsencuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1vdHZhbGlkLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cGNmLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cGZyLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cHNhdXguYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1wc2hpbnRlci5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXBzbW9kdWxlLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cmFzdGVyLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9c2ZudC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXNtb290aC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXRydWV0eXBlLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9dHlwZTEuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn10eXBlNDIuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn13aW5mbnQuYy54IgotCi0KLSMjIyBMaWJyYXJpZXMgIyMjCi0KLUxpYkZpbGVzLVBQQyAgICA9Ci0KLQotIyMjIERlZmF1bHQgUnVsZXMgIyMjCi0KLS5jLnggIFx4QzQgIC5jICB7XHhBNU1vbmRvQnVpbGRceEE1fQotCXtQUENDfSB7ZGVwRGlyfXtkZWZhdWx0fS5jIC1vIHt0YXJnRGlyfXtkZWZhdWx0fS5jLngge1BQQ0NPcHRpb25zfQotCi0KLSMjIyBCdWlsZCBSdWxlcyAjIyMKLQotOmJ1aWxkczptYWM6ZnRiYXNlLmMgXHhDNFx4QzQgOnNyYzpiYXNlOmZ0YmFzZS5jCi0JRHVwbGljYXRlIDpzcmM6YmFzZTpmdGJhc2UuYyA6YnVpbGRzOm1hYzpmdGJhc2UuYwotCi0ie09iakRpcn1mdGJhc2UuYy54IiAgXHhDNFx4QzQgIDpidWlsZHM6bWFjOmZ0YmFzZS5jCi0Je1BQQ0N9IDpidWlsZHM6bWFjOmZ0YmFzZS5jIC1vIHtPYmpEaXJ9ZnRiYXNlLmMueCBceEI2Ci0JCS1pIDpidWlsZHM6bWFjOiBceEI2Ci0JCS1pIDpzcmM6YmFzZTogXHhCNgotCQl7UFBDQ09wdGlvbnN9Ci0KLUZyZWVUeXBlLnBwY19jYXJib24gICAgXHhDNFx4QzQgIEZyZWVUeXBlLnBwY19jYXJib24ubwotCi1GcmVlVHlwZS5wcGNfY2FyYm9uLm8gIFx4QzRceEM0ICB7T2JqRmlsZXMtUFBDfSB7TGliRmlsZXMtUFBDfSB7XHhBNU1vbmRvQnVpbGRceEE1fQotCVBQQ0xpbmsgXHhCNgotCQktbyB7VGFyZ30gXHhCNgotCQl7T2JqRmlsZXMtUFBDfSBceEI2Ci0JCXtMaWJGaWxlcy1QUEN9IFx4QjYKLQkJe1N5bS1QUEN9IFx4QjYKLQkJLW1mIC1kIFx4QjYKLQkJLXQgJ1hDT0YnIFx4QjYKLQkJLWMgJ01QUyAnIFx4QjYKLQkJLXhtIGwKLQotCi0KLSMjIyBSZXF1aXJlZCBEZXBlbmRlbmNpZXMgIyMjCi0KLSJ7T2JqRGlyfWF1dG9maXQuYy54IiBceEM0IDpzcmM6YXV0b2ZpdDphdXRvZml0LmMKLSMgIntPYmpEaXJ9ZnRiYXNlLmMueCIgXHhDNCA6YnVpbGRzOm1hYzpmdGJhc2UuYwotIntPYmpEaXJ9ZnRiYm94LmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRiYm94LmMKLSJ7T2JqRGlyfWZ0YmRmLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRiZGYuYwotIntPYmpEaXJ9ZnRiaXRtYXAuYy54IiBceEM0IDpzcmM6YmFzZTpmdGJpdG1hcC5jCi0ie09iakRpcn1mdGRlYnVnLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRkZWJ1Zy5jCi0ie09iakRpcn1mdGZudGZtdC5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0Zm50Zm10LmMKLSJ7T2JqRGlyfWZ0ZnN0eXBlLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRmc3R5cGUuYwotIntPYmpEaXJ9ZnRnbHlwaC5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0Z2x5cGguYwotIntPYmpEaXJ9ZnRneHZhbC5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0Z3h2YWwuYwotIntPYmpEaXJ9ZnRpbml0LmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRpbml0LmMKLSJ7T2JqRGlyfWZ0bW0uYy54IiBceEM0IDpzcmM6YmFzZTpmdG1tLmMKLSJ7T2JqRGlyfWZ0b3R2YWwuYy54IiBceEM0IDpzcmM6YmFzZTpmdG90dmFsLmMKLSJ7T2JqRGlyfWZ0cGZyLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRwZnIuYwotIntPYmpEaXJ9ZnRzdHJva2UuYy54IiBceEM0IDpzcmM6YmFzZTpmdHN0cm9rZS5jCi0ie09iakRpcn1mdHN5bnRoLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRzeW50aC5jCi0ie09iakRpcn1mdHN5c3RlbS5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0c3lzdGVtLmMKLSJ7T2JqRGlyfWZ0dHlwZTEuYy54IiBceEM0IDpzcmM6YmFzZTpmdHR5cGUxLmMKLSJ7T2JqRGlyfWZ0d2luZm50LmMueCIgXHhDNCA6c3JjOmJhc2U6ZnR3aW5mbnQuYwotIntPYmpEaXJ9ZnRjYWNoZS5jLngiIFx4QzQgOnNyYzpjYWNoZTpmdGNhY2hlLmMKLSJ7T2JqRGlyfWJkZi5jLngiIFx4QzQgOnNyYzpiZGY6YmRmLmMKLSJ7T2JqRGlyfWNmZi5jLngiIFx4QzQgOnNyYzpjZmY6Y2ZmLmMKLSJ7T2JqRGlyfXR5cGUxY2lkLmMueCIgXHhDNCA6c3JjOmNpZDp0eXBlMWNpZC5jCi0ie09iakRpcn1neHZhbGlkLmMueCIgXHhDNCA6c3JjOmd4dmFsaWQ6Z3h2YWxpZC5jCi0ie09iakRpcn1mdGd6aXAuYy54IiBceEM0IDpzcmM6Z3ppcDpmdGd6aXAuYwotIntPYmpEaXJ9ZnRiemlwMi5jLngiIFx4QzQgOnNyYzpiemlwMjpmdGJ6aXAyLmMKLSJ7T2JqRGlyfWZ0bHp3LmMueCIgXHhDNCA6c3JjOmx6dzpmdGx6dy5jCi0ie09iakRpcn1vdHZhbGlkLmMueCIgXHhDNCA6c3JjOm90dmFsaWQ6b3R2YWxpZC5jCi0ie09iakRpcn1wY2YuYy54IiBceEM0IDpzcmM6cGNmOnBjZi5jCi0ie09iakRpcn1wZnIuYy54IiBceEM0IDpzcmM6cGZyOnBmci5jCi0ie09iakRpcn1wc2F1eC5jLngiIFx4QzQgOnNyYzpwc2F1eDpwc2F1eC5jCi0ie09iakRpcn1wc2hpbnRlci5jLngiIFx4QzQgOnNyYzpwc2hpbnRlcjpwc2hpbnRlci5jCi0ie09iakRpcn1wc21vZHVsZS5jLngiIFx4QzQgOnNyYzpwc25hbWVzOnBzbW9kdWxlLmMKLSJ7T2JqRGlyfXJhc3Rlci5jLngiIFx4QzQgOnNyYzpyYXN0ZXI6cmFzdGVyLmMKLSJ7T2JqRGlyfXNmbnQuYy54IiBceEM0IDpzcmM6c2ZudDpzZm50LmMKLSJ7T2JqRGlyfXNtb290aC5jLngiIFx4QzQgOnNyYzpzbW9vdGg6c21vb3RoLmMKLSJ7T2JqRGlyfXRydWV0eXBlLmMueCIgXHhDNCA6c3JjOnRydWV0eXBlOnRydWV0eXBlLmMKLSJ7T2JqRGlyfXR5cGUxLmMueCIgXHhDNCA6c3JjOnR5cGUxOnR5cGUxLmMKLSJ7T2JqRGlyfXR5cGU0Mi5jLngiIFx4QzQgOnNyYzp0eXBlNDI6dHlwZTQyLmMKLSJ7T2JqRGlyfXdpbmZudC5jLngiIFx4QzQgOnNyYzp3aW5mb250czp3aW5mbnQuYwotCi0KLSMjIyBPcHRpb25hbCBEZXBlbmRlbmNpZXMgIyMjCi0jIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gZ2VuZXJhdGUgImluY2x1ZGUgZmlsZSIgZGVwZW5kZW5jaWVzLiAjIyMKLQotRGVwZW5kZW5jaWVzICBceEM0ICAkT3V0T2ZEYXRlCi0JTWFrZURlcGVuZCBceEI2Ci0JCS1hcHBlbmQge01BS0VGSUxFfSBceEI2Ci0JCS1pZ25vcmUgIntDSW5jbHVkZXN9IiBceEI2Ci0JCS1vYmpkaXIgIntPYmpEaXJ9IiBceEI2Ci0JCS1vYmpleHQgLnggXHhCNgotCQl7SW5jbHVkZXN9IFx4QjYKLQkJe1NyY0ZpbGVzfQotCi0KZGlmZiAtLWdpdCBhL2J1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NsYXNzaWMubWFrZS50eHQgYi9idWlsZHMvbWFjL0ZyZWVUeXBlLnBwY19jbGFzc2ljLm1ha2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI3ZWVhLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NsYXNzaWMubWFrZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotIyAgIEZpbGU6ICAgICAgIEZyZWVUeXBlLnBwY19jbGFzc2ljLm1ha2UKLSMgICBUYXJnZXQ6ICAgICBGcmVlVHlwZS5wcGNfY2xhc3NpYwotIyAgIENyZWF0ZWQ6ICAgIFRodXJzZGF5LCBPY3RvYmVyIDI3LCAyMDA1IDA3OjQyOjQzIFBNCi0KLQotTUFLRUZJTEUgICAgICAgID0gRnJlZVR5cGUucHBjX2NsYXNzaWMubWFrZQotXHhBNU1vbmRvQnVpbGRceEE1ICAgID0ge01BS0VGSUxFfSAgIyBNYWtlIGJsYW5rIHRvIGF2b2lkIHJlYnVpbGRzIHdoZW4gbWFrZWZpbGUgaXMgbW9kaWZpZWQKLQotT2JqRGlyICAgICAgICAgID0gOm9ianM6Ci1JbmNsdWRlcyAgICAgICAgPSAgXHhCNgotCQkJCSAgLWFuc2kgc3RyaWN0IFx4QjYKLQkJCQkgIC1pbmNsdWRlcyB1bml4IFx4QjYKLQkJCQkgIC1pIDppbmNsdWRlOiBceEI2Ci0JCQkJICAtaSA6c3JjOiBceEI2Ci0JCQkJICAtaSA6aW5jbHVkZTpmcmVldHlwZTpjb25maWc6Ci0KLVN5bS1QUEMgICAgICAgICA9IC1zeW0gb2ZmCi0KLVBQQ0NPcHRpb25zICAgICA9IFx4QjYKLSAgICAgICAgICAgICAgICAgICAgICAgIC1kIEZUX01BQ0lOVE9TSD0xIFx4QjYKLSAgICAgICAgICAgICAgICAgICAgICAgIC1kIEhBVkVfRlNTUEVDPTEgXHhCNgotICAgICAgICAgICAgICAgICAgICAgICAgLWQgSEFWRV9GU1JFRj0wIFx4QjYKLSAgICAgICAgICAgICAgICAgICAgICAgIC1kIEhBVkVfUVVJQ0tEUkFXX1RPT0xCT1g9MSBceEI2Ci0gICAgICAgICAgICAgICAgICAgICAgICAtZCBIQVZFX1FVSUNLRFJBV19DQVJCT049MCBceEI2Ci0gICAgICAgICAgICAgICAgICAgICAgICAtZCBIQVZFX0FUUz0wIFx4QjYKLQkJCS1kIEZUMl9CVUlMRF9MSUJSQVJZIFx4QjYKLQkJCS1kIEZUX0NPTkZJR19DT05GSUdfSD0iPGZ0Y29uZmlnLmg+IiBceEI2Ci0JCQktZCBGVF9DT05GSUdfTU9EVUxFU19IPSI8ZnRtb2R1bGUuaD4iIFx4QjYKLQkJCXtJbmNsdWRlc30ge1N5bS1QUEN9Ci0KLQotIyMjIFNvdXJjZSBGaWxlcyAjIyMKLQotU3JjRmlsZXMgICAgICAgID0gIFx4QjYKLQkJCQkgIDpzcmM6YXV0b2ZpdDphdXRvZml0LmMgXHhCNgotCQkJCSAgOmJ1aWxkczptYWM6ZnRiYXNlLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0YmJveC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGJkZi5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGJpdG1hcC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGRlYnVnLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0Zm50Zm10LmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0ZnN0eXBlLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0Z2x5cGguYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRneHZhbC5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdGluaXQuYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRtbS5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdG90dmFsLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0cGZyLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0c3Ryb2tlLmMgXHhCNgotCQkJCSAgOnNyYzpiYXNlOmZ0c3ludGguYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnRzeXN0ZW0uYyBceEI2Ci0JCQkJICA6c3JjOmJhc2U6ZnR0eXBlMS5jIFx4QjYKLQkJCQkgIDpzcmM6YmFzZTpmdHdpbmZudC5jIFx4QjYKLQkJCQkgIDpzcmM6Y2FjaGU6ZnRjYWNoZS5jIFx4QjYKLQkJCQkgIDpzcmM6YmRmOmJkZi5jIFx4QjYKLQkJCQkgIDpzcmM6Y2ZmOmNmZi5jIFx4QjYKLQkJCQkgIDpzcmM6Y2lkOnR5cGUxY2lkLmMgXHhCNgotCQkJCSAgOnNyYzpneHZhbGlkOmd4dmFsaWQuYyBceEI2Ci0JCQkJICA6c3JjOmd6aXA6ZnRnemlwLmMgXHhCNgotCQkJCSAgOnNyYzpiemlwMjpmdGJ6aXAyLmMgXHhCNgotCQkJCSAgOnNyYzpsenc6ZnRsencuYyBceEI2Ci0JCQkJICA6c3JjOm90dmFsaWQ6b3R2YWxpZC5jIFx4QjYKLQkJCQkgIDpzcmM6cGNmOnBjZi5jIFx4QjYKLQkJCQkgIDpzcmM6cGZyOnBmci5jIFx4QjYKLQkJCQkgIDpzcmM6cHNhdXg6cHNhdXguYyBceEI2Ci0JCQkJICA6c3JjOnBzaGludGVyOnBzaGludGVyLmMgXHhCNgotCQkJCSAgOnNyYzpwc25hbWVzOnBzbW9kdWxlLmMgXHhCNgotCQkJCSAgOnNyYzpyYXN0ZXI6cmFzdGVyLmMgXHhCNgotCQkJCSAgOnNyYzpzZm50OnNmbnQuYyBceEI2Ci0JCQkJICA6c3JjOnNtb290aDpzbW9vdGguYyBceEI2Ci0JCQkJICA6c3JjOnRydWV0eXBlOnRydWV0eXBlLmMgXHhCNgotCQkJCSAgOnNyYzp0eXBlMTp0eXBlMS5jIFx4QjYKLQkJCQkgIDpzcmM6dHlwZTQyOnR5cGU0Mi5jIFx4QjYKLQkJCQkgIDpzcmM6d2luZm9udHM6d2luZm50LmMKLQotCi0jIyMgT2JqZWN0IEZpbGVzICMjIwotCi1PYmpGaWxlcy1QUEMgICAgPSAgXHhCNgotCQkJCSAgIntPYmpEaXJ9YXV0b2ZpdC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmFzZS5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmJveC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YmRmLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRiaXRtYXAuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGRlYnVnLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRmbnRmbXQuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGZzdHlwZS5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0Z2x5cGguYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGd4dmFsLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRpbml0LmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRtbS5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0b3R2YWwuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdHBmci5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0c3Ryb2tlLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRzeW50aC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0c3lzdGVtLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnR0eXBlMS5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0d2luZm50LmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9ZnRjYWNoZS5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWJkZi5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWNmZi5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXR5cGUxY2lkLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9Z3h2YWxpZC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0Z3ppcC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfWZ0YnppcDIuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1mdGx6dy5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfW90dmFsaWQuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1wY2YuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1wZnIuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1wc2F1eC5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXBzaGludGVyLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9cHNtb2R1bGUuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1yYXN0ZXIuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn1zZm50LmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9c21vb3RoLmMueCIgXHhCNgotCQkJCSAgIntPYmpEaXJ9dHJ1ZXR5cGUuYy54IiBceEI2Ci0JCQkJICAie09iakRpcn10eXBlMS5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXR5cGU0Mi5jLngiIFx4QjYKLQkJCQkgICJ7T2JqRGlyfXdpbmZudC5jLngiCi0KLQotIyMjIExpYnJhcmllcyAjIyMKLQotTGliRmlsZXMtUFBDICAgID0KLQotCi0jIyMgRGVmYXVsdCBSdWxlcyAjIyMKLQotLmMueCAgXHhDNCAgLmMgIHtceEE1TW9uZG9CdWlsZFx4QTV9Ci0Je1BQQ0N9IHtkZXBEaXJ9e2RlZmF1bHR9LmMgLW8ge3RhcmdEaXJ9e2RlZmF1bHR9LmMueCB7UFBDQ09wdGlvbnN9Ci0KLQotIyMjIEJ1aWxkIFJ1bGVzICMjIwotCi06YnVpbGRzOm1hYzpmdGJhc2UuYyBceEM0XHhDNCA6c3JjOmJhc2U6ZnRiYXNlLmMKLQlEdXBsaWNhdGUgOnNyYzpiYXNlOmZ0YmFzZS5jIDpidWlsZHM6bWFjOmZ0YmFzZS5jCi0KLSJ7T2JqRGlyfWZ0YmFzZS5jLngiICBceEM0XHhDNCAgOmJ1aWxkczptYWM6ZnRiYXNlLmMKLQl7UFBDQ30gOmJ1aWxkczptYWM6ZnRiYXNlLmMgLW8gIntPYmpEaXJ9ZnRiYXNlLmMueCIgXHhCNgotCQktaSA6YnVpbGRzOm1hYzogXHhCNgotCQktaSA6c3JjOmJhc2U6IFx4QjYKLQkJe1BQQ0NPcHRpb25zfQotCi1GcmVlVHlwZS5wcGNfY2xhc3NpYyAgICBceEM0XHhDNCAgRnJlZVR5cGUucHBjX2NsYXNzaWMubwotCi1GcmVlVHlwZS5wcGNfY2xhc3NpYy5vICBceEM0XHhDNCAge09iakZpbGVzLVBQQ30ge0xpYkZpbGVzLVBQQ30ge1x4QTVNb25kb0J1aWxkXHhBNX0KLQlQUENMaW5rIFx4QjYKLQkJLW8ge1Rhcmd9IFx4QjYKLQkJe09iakZpbGVzLVBQQ30gXHhCNgotCQl7TGliRmlsZXMtUFBDfSBceEI2Ci0JCXtTeW0tUFBDfSBceEI2Ci0JCS1tZiAtZCBceEI2Ci0JCS10ICdYQ09GJyBceEI2Ci0JCS1jICdNUFMgJyBceEI2Ci0JCS14bSBsCi0KLQotCi0jIyMgUmVxdWlyZWQgRGVwZW5kZW5jaWVzICMjIwotCi0ie09iakRpcn1hdXRvZml0LmMueCIgXHhDNCA6c3JjOmF1dG9maXQ6YXV0b2ZpdC5jCi0jICJ7T2JqRGlyfWZ0YmFzZS5jLngiIFx4QzQgOmJ1aWxkczptYWM6ZnRiYXNlLmMKLSJ7T2JqRGlyfWZ0YmJveC5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0YmJveC5jCi0ie09iakRpcn1mdGJkZi5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0YmRmLmMKLSJ7T2JqRGlyfWZ0Yml0bWFwLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRiaXRtYXAuYwotIntPYmpEaXJ9ZnRkZWJ1Zy5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0ZGVidWcuYwotIntPYmpEaXJ9ZnRmbnRmbXQuYy54IiBceEM0IDpzcmM6YmFzZTpmdGZudGZtdC5jCi0ie09iakRpcn1mdGZzdHlwZS5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0ZnN0eXBlLmMKLSJ7T2JqRGlyfWZ0Z2x5cGguYy54IiBceEM0IDpzcmM6YmFzZTpmdGdseXBoLmMKLSJ7T2JqRGlyfWZ0Z3h2YWwuYy54IiBceEM0IDpzcmM6YmFzZTpmdGd4dmFsLmMKLSJ7T2JqRGlyfWZ0aW5pdC5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0aW5pdC5jCi0ie09iakRpcn1mdG1tLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRtbS5jCi0ie09iakRpcn1mdG90dmFsLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRvdHZhbC5jCi0ie09iakRpcn1mdHBmci5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0cGZyLmMKLSJ7T2JqRGlyfWZ0c3Ryb2tlLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnRzdHJva2UuYwotIntPYmpEaXJ9ZnRzeW50aC5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0c3ludGguYwotIntPYmpEaXJ9ZnRzeXN0ZW0uYy54IiBceEM0IDpzcmM6YmFzZTpmdHN5c3RlbS5jCi0ie09iakRpcn1mdHR5cGUxLmMueCIgXHhDNCA6c3JjOmJhc2U6ZnR0eXBlMS5jCi0ie09iakRpcn1mdHdpbmZudC5jLngiIFx4QzQgOnNyYzpiYXNlOmZ0d2luZm50LmMKLSJ7T2JqRGlyfWZ0Y2FjaGUuYy54IiBceEM0IDpzcmM6Y2FjaGU6ZnRjYWNoZS5jCi0ie09iakRpcn1iZGYuYy54IiBceEM0IDpzcmM6YmRmOmJkZi5jCi0ie09iakRpcn1jZmYuYy54IiBceEM0IDpzcmM6Y2ZmOmNmZi5jCi0ie09iakRpcn10eXBlMWNpZC5jLngiIFx4QzQgOnNyYzpjaWQ6dHlwZTFjaWQuYwotIntPYmpEaXJ9Z3h2YWxpZC5jLngiIFx4QzQgOnNyYzpneHZhbGlkOmd4dmFsaWQuYwotIntPYmpEaXJ9ZnRnemlwLmMueCIgXHhDNCA6c3JjOmd6aXA6ZnRnemlwLmMKLSJ7T2JqRGlyfWZ0YnppcDIuYy54IiBceEM0IDpzcmM6YnppcDI6ZnRiemlwMi5jCi0ie09iakRpcn1mdGx6dy5jLngiIFx4QzQgOnNyYzpsenc6ZnRsencuYwotIntPYmpEaXJ9b3R2YWxpZC5jLngiIFx4QzQgOnNyYzpvdHZhbGlkOm90dmFsaWQuYwotIntPYmpEaXJ9cGNmLmMueCIgXHhDNCA6c3JjOnBjZjpwY2YuYwotIntPYmpEaXJ9cGZyLmMueCIgXHhDNCA6c3JjOnBmcjpwZnIuYwotIntPYmpEaXJ9cHNhdXguYy54IiBceEM0IDpzcmM6cHNhdXg6cHNhdXguYwotIntPYmpEaXJ9cHNoaW50ZXIuYy54IiBceEM0IDpzcmM6cHNoaW50ZXI6cHNoaW50ZXIuYwotIntPYmpEaXJ9cHNtb2R1bGUuYy54IiBceEM0IDpzcmM6cHNuYW1lczpwc21vZHVsZS5jCi0ie09iakRpcn1yYXN0ZXIuYy54IiBceEM0IDpzcmM6cmFzdGVyOnJhc3Rlci5jCi0ie09iakRpcn1zZm50LmMueCIgXHhDNCA6c3JjOnNmbnQ6c2ZudC5jCi0ie09iakRpcn1zbW9vdGguYy54IiBceEM0IDpzcmM6c21vb3RoOnNtb290aC5jCi0ie09iakRpcn10cnVldHlwZS5jLngiIFx4QzQgOnNyYzp0cnVldHlwZTp0cnVldHlwZS5jCi0ie09iakRpcn10eXBlMS5jLngiIFx4QzQgOnNyYzp0eXBlMTp0eXBlMS5jCi0ie09iakRpcn10eXBlNDIuYy54IiBceEM0IDpzcmM6dHlwZTQyOnR5cGU0Mi5jCi0ie09iakRpcn13aW5mbnQuYy54IiBceEM0IDpzcmM6d2luZm9udHM6d2luZm50LmMKLQotCi0KLSMjIyBPcHRpb25hbCBEZXBlbmRlbmNpZXMgIyMjCi0jIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gZ2VuZXJhdGUgImluY2x1ZGUgZmlsZSIgZGVwZW5kZW5jaWVzLiAjIyMKLQotRGVwZW5kZW5jaWVzICBceEM0ICAkT3V0T2ZEYXRlCi0JTWFrZURlcGVuZCBceEI2Ci0JCS1hcHBlbmQge01BS0VGSUxFfSBceEI2Ci0JCS1pZ25vcmUgIntDSW5jbHVkZXN9IiBceEI2Ci0JCS1vYmpkaXIgIntPYmpEaXJ9IiBceEI2Ci0JCS1vYmpleHQgLnggXHhCNgotCQl7SW5jbHVkZXN9IFx4QjYKLQkJe1NyY0ZpbGVzfQotCi0KZGlmZiAtLWdpdCBhL2J1aWxkcy9tYWMvUkVBRE1FIGIvYnVpbGRzL21hYy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGU0N2QuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL21hYy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotVGhpcyBmb2xkZXIgY29udGFpbnMKLQotICAqIE1ha2VmaWxlIHNrZWxldG9ucyBmb3IgQXBwbGUgTVBXIChNYWNpbnRvc2gncyBQcm9ncmFtbWVyJ3MgV29ya3Nob3ApCi0KLSAgKiBQeXRob24gc2NyaXB0IHRvIGdlbmVyYXRlIE1QVyBtYWtlZmlsZSBmcm9tIHNrZWxldG9uCi0KLSAgKiBNZXRyb3dlcmtzIENvZGVXYXJyaW9yIDkuMCBwcm9qZWN0IGZpbGUgaW4gWE1MIGZvcm1hdAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMS4gV2hhdCBpcyB0aGlzCi0tLS0tLS0tLS0tLS0tLS0KLQotRmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIGRlc2lnbmVkIHRvIGJ1aWxkIEZyZWVUeXBlCi1ydW5uaW5nIG9uIGNsYXNzaWMgTWFjT1MuIFRvIGJ1aWxkIEZyZWVUeXBlIHJ1bm5pbmcgb24KLU1hYyBPUyBYLCBidWlsZCBhcyB0aGUgc3lzdGVtIGlzIFVOSVguCi0KLUhvd2V2ZXIsIE1hYyBPUyBYIGlzIG1vc3QgdXNlZnVsIHRvIG1hbmlwdWxhdGUgZmlsZXMgaW4KLXZhbmlsbGEgRnJlZVR5cGUgdG8gZml0IGNsYXNzaWMgTWFjT1MuCi0KLVRoZSBpbmZvcm1hdGlvbiBhYm91dCBNYWNPUyBzcGVjaWZpYyBBUEkgaXMgd3JpdHRlbiBpbgotYXBwZW5kaXggb2YgdGhpcyBkb2N1bWVudC4KLQotMi4gUmVxdWlyZW1lbnQKLS0tLS0tLS0tLS0tLS0tCi0KLVlvdSBjYW4gdXNlIE1QVzogYSBmcmVlLWNoYXJnZWQgZGV2ZWxvcGVyIGVudmlyb25tZW50Ci1ieSBBcHBsZSwgb3IgQ29kZVdhcnJpb3I6IGEgY29tbWVyY2lhbCBkZXZlbG9wZXIKLWVudmlyb25tZW50IGJ5IE1ldHJvd2Vya3MuIEdDQyBmb3IgTVBXIGFuZCBTeW1hbnRlYwotIlRoaW5rIEMiIGFyZSBub3QgdGVzdGVkIGF0IHByZXNlbnQuCi0KLQotICAyLTEuIEFwcGxlIE1QVwotICAtLS0tLS0tLS0tLS0tLQotCi0gIEZvbGxvd2luZyBDIGNvbXBpbGVycyBhcmUgdGVzdGVkOgotCi0gICAgICBtNjhrIHRhcmdldDoJQXBwbGUgU0MgIDguOS4wZDNlMQotICAgICAgcHBjICB0YXJnZXQ6CUFwcGxlIE1yQyA1LjAuMGQzYzEKLQotICBUaGUgZmluYWwgTVBXLUdNIChvZmZpY2lhbCByZWxlYXNlIG9uIDE5OTkvRGVjKSBpcyB0b28KLSAgb2xkIGFuZCBjYW5ub3QgY29tcGlsZSBGcmVlVHlwZSwgYmVjYXVzZSBidW5kbGVkIEMKLSAgY29tcGlsZXJzIGNhbm5vdCBzZWFyY2ggaGVhZGVyIGZpbGVzIGluIHN1YiBkaXJlY3Rvcmllcy4KLSAgVXBkYXRpbmcgYnkgdGhlIGZpbmFsIE1QVy1QUiAocHJlLXJlbGVhc2Ugb24gMjAwMS9GZWIpCi0gIGlzIHJlcXVpcmVkLgotCi0gIFJlcXVpcmVkIGZpbGVzIGFyZSBkb3dubG9hZGFibGUgZnJvbToKLQotICAgICAgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvbXB3LXRvb2xzL2luZGV4Lmh0bWwKLQotICBBbHNvIHlvdSBjYW4gZmluZCBkb2N1bWVudHMgaG93IHRvIHVwZGF0ZSBieSBNUFctUFIuCi0KLSAgUHl0aG9uIGlzIHJlcXVpcmVkIHRvIHJlc3RvcmUgTVBXIG1ha2VmaWxlcyBmcm9tIHRoZQotICBza2VsZXRvbnMuIFB5dGhvbiBidW5kbGVkIHRvIE1hYyBPUyBYIGlzIGVub3VnaC4gRm9yCi0gIGNsYXNzaWMgTWFjT1MsIE1hY1B5dGhvbiBpcyBhdmFpbGFibGU6Ci0KLSAgICAgIGh0dHA6Ly9ob21lcGFnZXMuY3dpLm5sL35qYWNrL21hY3B5dGhvbi8KLQotICBNUFcgcmVxdWlyZXMgYWxsIGZpbGVzIGFyZSB0eXBlZCBieSByZXNvdXJjZSBmb3JrLgotICBSZXNFZGl0IGJ1bmRsZWQgdG8gTVBXIGlzIGVub3VnaC4gSW4gTWFjIE9TIFgsCi0gIC9EZXZlbG9wZXIvVG9vbHMvU2V0RmlsZSBvZiBEZXZUb29sIGlzIHVzZWZ1bCB0bwotICBtYW5pcHVsYXRlIGZyb20gY29tbWFuZGxpbmUuCi0KLSAgMi0yLiBNZXRyb3dlcmtzIENvZGVXYXJyaW9yCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFhNTCBwcm9qZWN0IGZpbGUgaXMgZ2VuZXJhdGVkIGFuZCB0ZXN0ZWQgYnkKLSAgQ29kZVdhcnJpb3IgOS4wLiAgT2xkZXIgdmVyc2lvbnMgYXJlIG5vdCB0ZXN0ZWQKLSAgYXQgYWxsLiBBdCBwcmVzZW50LCBzdGF0aWMgbGlicmFyeSBmb3IgcHBjIHRhcmdldAotICBpcyBhdmFpbGFibGUgaW4gdGhlIHByb2plY3QgZmlsZS4KLQotCi0zLiBIb3cgdG8gYnVpbGQKLS0tLS0tLS0tLS0tLS0tLQotCi0gIDMtMS4gQXBwbGUgTVBXCi0gIC0tLS0tLS0tLS0tLS0tCi0gIERldGFpbGVkIGJ1aWxkaW5nIHByb2NlZHVyZSBieSBBcHBsZSBNUFcgaXMKLSAgZGVzY3JpYmVkIGluIGZvbGxvd2luZy4KLQotICAgIDMtMS0xLiBHZW5lcmF0ZSBNUFcgbWFrZWZpbGVzIGZyb20gdGhlIHNrZWxldG9ucwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgSGVyZSBhcmUgNCBza2VsZXRvbnMgZm9yIGZvbGxvd2luZyB0YXJnZXRzIGFyZQotICAgIGluY2x1ZGVkLgotCi0gICAgLSBGcmVlVHlwZS5tNjhrX2Zhci5tYWtlLnR4dAotICAgICAgQW5jaWVudCAzMmJpdCBiaW5hcnkgZXhlY3V0YWJsZSBmb3JtYXQgZm9yCi0gICAgICBtNjhrIE1hY09TOiBTeXN0ZW0gNiwgd2l0aCAzMmJpdCBhZGRyZXNzaW5nCi0gICAgICBtb2RlIChmYXItcG9pbnRlci1tb2RlbCkgU28tY2FsbGVkICJUb29sYm94IgotICAgICAgQVBJIGlzIHVzZWQuCi0KLSAgICAtIEZyZWVUeXBlLm02OGtfY2ZtLm1ha2UudHh0Ci0gICAgICBDRk0gYmluYXJ5IGV4ZWN1dGFibGUgZm9ybWF0IGZvciBtNjhrIE1hY09TOgotICAgICAgU3lzdGVtIDcuIFNvLWNhbGxlZCAiVG9vbGJveCIgQVBJIGlzIHVzZWQuCi0KLSAgICAtIEZyZWVUeXBlLnBwY19jbGFzc2ljLm1ha2UudHh0Ci0gICAgICBDRk0gYmluYXJ5IGV4ZWN1dGFibGUgZm9ybWF0IGZvciBwcGMgTWFjT1M6Ci0gICAgICBTeXN0ZW0gNywgTWFjT1MgOCwgTWFjT1MgOS4gU28tY2FsbGVkICJUb29sYm94IgotICAgICAgQVBJIGlzIHVzZWQuCi0KLSAgICAtIEZyZWVUeXBlLnBwY19jYXJib24ubWFrZS50eHQKLSAgICAgIENGTSBiaW5hcnkgZXhlY3V0YWJsZSBmb3JtYXQgZm9yIHBwYyBNYWNPUzoKLSAgICAgIE1hY09TIDkuIENhcmJvbiBBUEkgaXMgdXNlZC4KLQotICAgIEF0IHByZXNlbnQsIHN0YXRpYyBsaWJyYXJ5IGlzIG9ubHkgc3VwcG9ydGVkLAotICAgIGFsdGhvdWdoIHRhcmdldHMgZXhjZXB0IG9mIG02OGtfZmFyIGFyZSBjYXBhYmxlCi0gICAgdG8gdXNlIHNoYXJlZCBsaWJyYXJ5LgotCi0gICAgTVBXIG1ha2VmaWxlIHN5bnRheCB1c2VzIDhiaXQgY2hhcmFjdGVycy4gVG8ga2VlcAotICAgIGZyb20gdmlvbGF0aW5nIHRoZW0gZHVyaW5nIHZlcnNpb24gY29udHJvbCwgaGVyZQotICAgIHdlIHN0b3JlIHNrZWxldG9ucyBpbiBwdXJlIEFTQ0lJIGZvcm1hdC4gWW91IG11c3QKLSAgICBnZW5lcmF0ZSBNUFcgbWFrZWZpbGUgYnkgUHl0aG9uIHNjcmlwdCBhc2NpaTJtcHcucHkuCi0KLSAgICBJbiBNYWMgT1MgWCB0ZXJtaW5hbCwgeW91IGNhbiBjb252ZXJ0IGFzOgotCi0JcHl0aG9uIGJ1aWxkcy9tYWMvYXNjaWkybXB3LnB5IFwKLQkJPCBidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfZmFyLm1ha2UudHh0IFwKLQkJPiBGcmVlVHlwZS5tNjhrX2Zhci5tYWtlCi0KLSAgICBUaGUgc2tlbGV0b25zIGFyZSBkZXNpZ25lZCB0byB1c2UgaW4gdGhlIHRvcAotICAgIGRpcmVjdG9yeSB3aGVyZSB0aGVyZSBhcmUgYnVpbGRzLCBpbmNsdWRlLCBzcmMgZXRjLgotICAgIFlvdSBtdXN0IG5hbWUgdGhlIGdlbmVyYXRlZCBNUFcgbWFrZWZpbGUgYnkgcmVtb3ZpbmcKLSAgICAiLnR4dCIgZnJvbSBzb3VyY2Ugc2tlbGV0b24gbmFtZS4KLQotICAgIDMtMS0yLiBBZGQgcmVzb3VyY2UgZm9ya3MgdG8gcmVsYXRlZCBmaWxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTVBXJ3MgTWFrZSBhbmQgQyBjb21waWxlcnMgY2Fubm90IHJlY29nbml6ZSBmaWxlcwotICAgIHdpdGhvdXQgcmVzb3VyY2UgZm9yay4gWW91IGhhdmUgdG8gYWRkIHJlc291cmNlCi0gICAgZm9yayB0byB0aGUgZmlsZXMgdGhhdCBNUFcgdXNlcy4gSW4gTWFjIE9TIFgKLSAgICB0ZXJtaW5hbCBvZiB0aGUgc3lzdGVtLCB5b3UgY2FuIGRvIGFzOgotCi0JZmluZCAuIC1uYW1lICcqLltjaF0nIC1leGVjIFwKLQkJL0RldmVsb3Blci9Ub29scy9TZXRGaWxlIC1hIGwgLWMgIk1QUyAiIC10IFRFWFQgXHtcfSBcOwotCi0JZmluZCAuIC1uYW1lICcqLm1ha2UnIC1leGVjIFwKLQkJL0RldmVsb3Blci9Ub29scy9TZXRGaWxlIC1hIGwgLWMgIk1QUyAiIC10IFRFWFQgXHtcfSBcOwotCi0KLSAgICAzLTEtMy4gT3BlbiBNUFcgc2hlbGwgYW5kIGJ1aWxkCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgT3BlbiBNUFcgc2hlbGwgYW5kIGdvIHRvIHRoZSB0b3AgZGlyZWN0b3J5IHRoYXQKLSAgICBGcmVlVHlwZSBzb3VyY2VzIGFyZSBleHRyYWN0ZWQgKE1QVyBtYWtlZmlsZSBtdXN0Ci0gICAgYmUgbG9jYXRlZCBpbiB0aGVyZSksIGZyb20gIlNldCBEaXJlY3RvcnkiIGluCi0gICAgIkRpcmVjdG9yeSIgbWVudS4KLQotICAgIENob29zZSAiQnVpbGQiIGZyb20gIkJ1aWxkIiBtZW51LCBhbmQgdHlwZSB0aGUKLSAgICBuYW1lIG9mIHByb2plY3QgYnkgcmVtb3ZpbmcgIi5tYWtlIiBmcm9tIE1QVwotICAgIG1ha2VmaWxlLCBhczogRnJlZVR5cGUubTY4a19mYXIKLQotICAgIElmIGJ1aWxkaW5nIGlzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgeW91IGNhbiBmaW5kCi0gICAgYnVpbHQgbGlicmFyeSBpbiBvYmpzLyBkaXJlY3RvcnkuCi0KLQotICAzLTIuIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgRGV0YWlsZWQgYnVpbGRpbmcgcHJvY2VkdXJlIGJ5IE1ldHJvd2Vya3MKLSAgQ29kZVdhcnJpb3IgKENXKSA5LjAgaXMgZGVzY3JpYmVkIGluIGZvbGxvd2luZy4KLQotICAgIDMtMi0xLiBJbXBvcnQgWE1MIHByb2plY3QgZmlsZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQ1cgWE1MIHByb2plY3QgZmlsZSBpcyBub3QgcmVhZHkgZm9yIGRvdWJsZS0KLSAgICBjbGljay4gU3RhcnQgQ29kZVdhcnJpb3IgSURFLCBhbmQgY2hvb3NlCi0gICAgIkltcG9ydCBwcm9qZWN0IiBpbiAiRmlsZSIgbWVudS4gQ2hvb3NlIFhNTAotICAgIHByb2plY3QgZmlsZTogYnVpbGRzL21hYy9mdGxpYi5wcmoueG1sLgotICAgIEluIG5leHQsIHlvdSB3aWxsIGJlIGFza2VkIHdoZXJlIHRvIHNhdmUgQ1cKLSAgICBuYXRpdmUgcHJvamVjdCBmaWxlOiB5b3UgbXVzdCBjaG9vc2UKLSAgICAiYnVpbGRzL21hYy9mdGxpYi5wcmoiLiBUaGUgcHJvamVjdCBmaWxlIGlzCi0gICAgZGVzaWduZWQgd2l0aCByZWxhdGl2ZSBwYXRoIGZyb20gdGhlcmUuIEFmdGVyCi0gICAgQ1cgbmF0aXZlIHByb2plY3QgZmlsZSBpcyBnZW5lcmF0ZWQsIGl0IGlzCi0gICAgYXV0b21hdGljYWxseSBsb2FkZWQsIHNtYWxsIHByb2plY3Qgd2luZG93Ci0gICAgdGl0bGVkICJmdGxpYi5wcmoiIGlzIGRpc3BsYXllZC4KLQotICAgIDMtMi0yLiBCdWlsZGluZwotICAgIC0tLS0tLS0tLS0tLS0tLQotICAgIENob29zZSAiTWFrZSIgZnJvbSAiUHJvamVjdCIgbWVudS4gSWYgYnVpbGRpbmcKLSAgICBpcyBzdWNjZXNzZnVsbHkgZmluaXNoZWQsIHlvdSBjYW4gZmluZCBidWlsdAotICAgIGxpYnJhcnkgYXQgb2Jqcy9GcmVlVHlwZUxpYi4KLQotNC4gVE9ETwotLS0tLS0tLQotCi0gIDQtMS4gQWxsIG1vZHVsZXMgc2hvdWxkIGJlIGluY2x1ZGVkCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgQXQgcHJlc2VudCwgTVBXIG1ha2VmaWxlcyBhbmQgQ1cgcHJvamVjdCBmaWxlIGFyZQotICBqdXN0IHVwZGF0ZWQgdmVyc2lvbnMgb2YgdGhlc2UgYnkgTGVvbmFyZC4gU29tZQotICBtb2R1bGVzIGFyZSBhZGRlZCBhZnRlciB0aGUgbGFzdCBtYWludGVuYW5jZSwgdGhleQotICBhcmUgbm90IGluY2x1ZGVkLgotCi0gIDQtMi4gV29ya2luZyB0ZXN0IHdpdGggZnRkZW1vcwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBBdCBwcmVzZW50LCBNUFcgbWFrZWZpbGVzIGFuZCBDVyBwcm9qZWN0IGZpbGUgY2FuCi0gIGJ1aWxkIEZyZWVUeXBlIGZvciBjbGFzc2ljIE1hY09TLiBCdXQgdGhlaXIgd29ya2luZwotICBiZWhhdmlvdXJzIGFyZSBub3QgdGVzdGVkIGF0IGFsbC4gQnVpbGRpbmcgZnRkZW1vcwotICBmb3IgY2xhc3NpYyBNYWNPUyBhbmQgd29ya2luZyB0ZXN0IGlzIHJlcXVpcmVkLgotCi0gIDQtMy4gUG9ydGluZyBKYW0gb250byBNUFcKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEZyZWVUeXBlIHVzZXMgSmFtIChhbmQgRlQtSmFtKSBmb3IgdW5pZmllZCBjcm9zcy0KLSAgcGxhdGZvcm0gYnVpbGRpbmcgdG9vbC4gQXQgcHJlc2VudCwgSmFtIGlzIG5vdCBwb3J0ZWQKLSAgdG8gTVBXLiBUbyB1cGRhdGUgY2xhc3NpYyBNYWNPUyBzdXBwb3J0IGVhc2lseSwKLSAgYnVpbGRpbmcgYnkgSmFtIGlzIGV4cGVjdGVkIG9uIE1QVy4KLQotCi1BUFBFTkRJWCBJCi0tLS0tLS0tLS0tCi0KLSAgQS0xLiBGcmFtZXdvcmsgZGVwZW5kZW5jaWVzCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHNyYy9iYXNlL2Z0bWFjLmMgYWRkcyB0d28gTWFjLXNwZWNpZmljIGZlYXR1cmVzIHRvCi0gIEZyZWVUeXBlLiBUaGVzZSBmZWF0dXJlcyBhcmUgYmFzZWQgb24gTWFjT1MgbGlicmFyaWVzLgotCi0gICogYWNjZXNzaW5nIHJlc291cmNlLWZvcmsgZm9udAotICBUaGUgZm9udHMgZm9yIGNsYXNzaWMgTWFjT1Mgc3RvcmUgdGhlaXIgZ3JhcGhpY2FsIGRhdGEKLSAgaW4gcmVzb3VyY2UgZm9ya3Mgd2hpY2ggY2Fubm90IGJlIGFjY2Vzc2VkIHZpYSBBTlNJIEMKLSAgZnVuY3Rpb25zLiBGcmVlVHlwZTIgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGhhbmRsZSBzdWNoCi0gIHJlc291cmNlIGZvcmsgZm9udHMsIHRoZXkgYXJlIGJhc2VkIG9uIEZpbGUgTWFuYWdlcgotICBmcmFtZXdvcmsgb2YgTWFjT1MuIEluIGFkZGl0aW9uLCBIRlMgYW5kIEhGUysgZmlsZQotICBzeXN0ZW0gZHJpdmVyIG9mIExpbnV4IGlzIHN1cHBvcnRlZC4gRm9sbG93aW5nCi0gIGZ1bmN0aW9ucyBhcmUgZm9yIHRoaXMgcHVycG9zZS4KLQotICAgIEZUX05ld19GYWNlX0Zyb21fUmVzb3VyY2UoKQotICAgIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKCkKLSAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmKCkKLQotICAqIHJlc29sdmluZyBmb250IG5hbWUgdG8gZm9udCBmaWxlCi0gIFRoZSBmb250IG1lbnUgb2YgTWFjT1MgYXBwbGljYXRpb24gcHJlZmVycyBmb250IG5hbWUKLSAgd3JpdHRlbiBpbiBGT05EIHJlc291cmNlIHRoYW4gc2ZudCByZXNvdXJjZS4gRnJlZVR5cGUyCi0gIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBmaW5kIGZvbnQgZmlsZSBieSBuYW1lIGluIE1hY09TCi0gIGFwcGxpY2F0aW9uLCB0aGV5IGFyZSBiYXNlZCBvbiBRdWlja0RyYXcgRm9udCBNYW5hZ2VyCi0gIGFuZCBBcHBsZSBUeXBlIFNlcnZpY2UgZnJhbWV3b3JrIG9mIE1hY09TLgotCi0gICAgRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lKCkKLSAgICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lKCkKLQotICBXb3JraW5nIGZ1bmN0aW9ucyBmb3IgZWFjaCBNYWNPUyBhcmUgc3VtbWFyaXplZCBhcwotICBmb2xsb3dpbmcuCi0KLSAgdXB0byBNYWNPUyA2OgotICAgIG5vdCB0ZXN0ZWQgKHlvdSBoYXZlIHRvIG9idGFpbiBNUFcgMi54KQotCi0gIE1hY09TIDcueCwgOC54LCA5LnggKHdpdGhvdXQgQ2FyYm9uTGliKToKLSAgICBGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUoKQotICAgIEZUX05ld19GYWNlX0Zyb21fUmVzb3VyY2UoKQotICAgIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKCkKLQotICBNYWNPUyA5LnggKHdpdGggQ2FyYm9uTGliKToKLSAgICBGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUoKQotICAgIEZUX05ld19GYWNlX0Zyb21fUmVzb3VyY2UoKQotICAgIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKCkKLSAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmKCkKLQotICBNYWMgT1MgWCB1cHRvIDEwLjQueDoKLSAgICBGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUoKSAgICAgZGVwcmVjYXRlZAotICAgIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKCkgICAgICBkZXByZWNhdGVkCi0gICAgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZSgpIGRlcHJlY2F0ZWQ/Ci0gICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZigpCi0KLSAgQS0yLiBEZXByZWNhdGVkIEZ1bmN0aW9ucwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBBLTItMS4gRmlsZU1hbmFnZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZvciBjb252ZW5pZW5jZSB0byB3cml0ZSBNYWNPUyBhcHBsaWNhdGlvbiwgZnRtYWMuYwotICAgIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBzcGVjaWZ5IGEgZmlsZSBieSBGU1NwZWMgYW5kIEZTUmVmLAotICAgIGJlY2F1c2UgdGhlIGZpbGUgaWRlbnRpZmljYXRpb24gcGF0aG5hbWUgaGFkIGV2ZXIgYmVlbgotICAgIHVucmVjb21tZW5kZWQgbWV0aG9kIGluIE1hY09TIHByb2dyYW1taW5nLgotCi0gICAgVG93YXJkIHRvIE1hY09TIFggMTAuNCAmIDUsIENhcmJvbiBmdW5jdGlvbnMgdXNpbmcgRlNTcGVjCi0gICAgZGF0YXR5cGUgaXMgbm90aWNlZCBhcyBkZXByZWNhdGVkLCBhbmQgcmVjb21tZW5kZWQgdG8KLSAgICBtaWdyYXRlIHRvIEZTUmVmIGRhdGF0eXBlLiBUaGUgYmlnIGRpZmZlcmVuY2VzIG9mIEZTUmVmCi0gICAgYWdhaW5zdCBGU1NwZWMgYXJlIGV4cGxhaW5lZCBpbiBBcHBsZSBUZWNoTm90ZXMgMjA3OC4KLQotICAgIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3RlY2hub3Rlcy90bjIwMDIvdG4yMDc4Lmh0bWwKLQotICAgIC0gZmlsZW5hbWUgbGVuZ3RoOiB0aGUgbWF4IGxlbmd0aCBvZiBmaWxlCi0gICAgbmFtZSBvZiBGU1JlZiBpcyAyNTUgY2hhcnMgKGl0IGlzIGxpbWl0IG9mIEhGUyspLAotICAgIHRoYXQgb2YgRlNTcGVjIGlzIDMxIGNoYXJzIChpdCBpcyBsaW1pdCBvZiBIRlMpLgotCi0gICAgLSBmaWxlbmFtZSBlbmNvZGluZzogRlNTcGVjIGlzIGxvY2FsaXplZCBieQotICAgIGxlZ2FjeSBlbmNvZGluZyBmb3IgZWFjaCBsYW5ndWFnZSBzeXN0ZW0sCi0gICAgRlNSZWYgaXMgVW5pY29kZSBlbmFibGVkLgotCi0gICAgQS0yLTIuIEZvbnRNYW5hZ2VyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGb2xsb3dpbmcgZnVuY3Rpb25zIHJlY2VpdmUgUXVpY2tEcmF3IGZvbnRuYW1lOgotCi0gICAgICBGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUoKQotCi0gICAgUXVpY2tEcmF3IGlzIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5IFF1YXJ0egotICAgIHNpbmNlIE1hYyBPUyBYIDEwLjQuIFRoZXkgYXJlIHN0aWxsIGtlcHQgZm9yCi0gICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gQnkgdW5kZWZpbml0aW9uIG9mCi0gICAgSEFWRV9RVUlDS0RSQVcgaW4gYnVpbGRpbmcsIHlvdSBjYW4gY2hhbmdlIHRoZXNlCi0gICAgZnVuY3Rpb25zIHRvIHJldHVybiBGVF9FcnJfVW5pbXBsZW1lbnRlZCBhbHdheXMuCi0KLSAgICBSZXBsYWNlbWVudCBmdW5jdGlvbnMgYXJlIGFkZGVkIGZvciBtaWdyYXRpb24uCi0KLSAgICAgIEZUX0dldEZpbGVfRnJvbV9NYWNfQVRTX05hbWUoKQotCi0gICAgVGhleSBhcmUgdXNhYmxlIG9uIE1hYyBPUyBYIG9ubHkuIE9uIG9sZGVyIHN5c3RlbXMsCi0gICAgdGhlc2UgZnVuY3Rpb25zIHJldHVybiBGVF9FcnJfVW5pbXBsZW1lbnRlZCBhbHdheXMuCi0KLSAgICBUaGUgZGV0YWlsZWQgaW5jb21wYXRpYmlsaXRpZXMgYW5kIHBvc3NpYmlsaXR5Ci0gICAgb2YgRm9udE1hbmFnZXIgZW11bGF0aW9uIHdpdGhvdXQgUXVpY2tEcmF3IGlzCi0gICAgZXhwbGFpbmVkIGluCi0KLSAgICAgIGh0dHA6Ly93d3cuZ3l2ZS5vcmcvfm1wc3V6dWtpL2F0c19iZW5jaG1hcmsuaHRtbAotCi0gIEEtMy4gRnJhbWV3b3JrIEF2YWlsYWJpbGl0aWVzCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgVGhlIGZyYW1ld29yayBvZiBNYWNPUyBhcmUgb2Z0ZW4gcmV2aXNlZCwgZXNwZWNpYWxseQotICB3aGVuIG5ldyBmb3JtYXQgb2YgYmluYXJ5IGV4ZWN1dGFibGUgaXMgaW50cm9kdWNlZC4KLSAgRm9sbG93aW5nIHRhYmxlIGlzIHRoZSBtaW5pbXVtIHZlcnNpb24gb2YgZnJhbWV3b3JrcwotICB0byB1c2UgZnVuY3Rpb25zIHVzZWQgaW4gRnJlZVR5cGUyLiBUaGUgdGFibGUgaXMKLSAgZXh0cmFjdGVkIGZyb20gTVBXIGhlYWRlciBmaWxlcyBmb3IgYXNzZW1ibHkgbGFuZ3VhZ2UuCi0KLSAgKioqIE5PVEUgKioqCi0gIFRoZSBjb25kaXRpb25hbCBkZWZpbml0aW9uIG9mIGF2YWlsYWJsZSBkYXRhIHR5cGUKLSAgaW4gTVBXIGNvbXBpbGVyIGlzIGluc3VmZmljaWVudC4gWW91IGNhbiBjb21waWxlCi0gIHByb2dyYW0gdXNpbmcgRlNSZWYgZGF0YSB0eXBlIGZvciBvbGRlciBzeXN0ZW1zCi0gIChNYWNPUyA3LCA4KSB0aGF0IGRvbid0IGtub3cgRlNSZWYgZGF0YSB0eXBlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgIENQVSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBtYzY4MHgwICAgICAgfCAgICAgICAgICAgUG93ZXJQQyAgICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSsKLSAgQmluYXJ5IEV4ZWN1dGFibGUgRm9ybWF0ICAgICAgICAgICAgfCBDbGFzc2ljIHwgNjhLLUNGTSB8IENGTSAgICAgfCBDRk0gICAgIHwgTWFjaC1PICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKwotICAgICAgIEZyYW1ld29yayBBUEkgICAgICAgICAgICAgICAgICB8IFRvb2xib3ggfCBUb29sYm94IHwgVG9vbGJveCB8IENhcmJvbiAgfCBDYXJib24gIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgPygqKSB8SW50ZXJmYWNlfEludGVyZmFjZXxDYXJib25MaWJ8TWFjIE9TIFggfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfExpYiAgICAgIHxMaWIgICAgICB8ICAgICAgICAgfCAgICAgICAgIHwKLSogRmlsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCi1QQkdldEZDQkluZm9TeW5jKCkgICAgICAgICAgICAgICAgICAgIHwgICAgbyAgICB8IDcuMS0gICAgfCA3LjEtICAgIHwgMS4wLSAgICB8ICAgIG8gICAgfAotRlNNYWtlRlNTcGVjKCkgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIG8gICAgfCA3LjEtICAgIHwgNy4xLSAgICB8IDEuMC0gICAgfCAgICBvICAgIHwKLUZTR2V0Rm9ya0NCSW5mbygpICAgICAgICAgICAgICAgICAgICAgfCAgICBvICAgIHwgICAoKiopICB8IDkuMC0gICAgfCAxLjAtICAgIHwgICAgbyAgICB8Ci1GU3BNYWtlRlNSZWYoKSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgbyAgICB8ICAgKCoqKSAgfCA5LjAtICAgIHwgMS4wLSAgICB8ICAgIG8gICAgfAotRlNHZXRDYXRhbG9nSW5mbygpICAgICAgICAgICAgICAgICAgICB8ICAgIG8gICAgfCAgICgqKikgIHwgOS4wLSAgICB8IDEuMC0gICAgfCAgIC0xMC4zIHwKLUZTUGF0aE1ha2VSZWYoKSAgICAgICAgICAgICAgICAgICAgICAgfCAgICB4ICAgIHwgICAgeCAgICB8ICAgIHggICAgfCAxLjEtICAgIHwgICAtMTAuMyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgID8oKikgfEZvbnQgICAgIHxGb250ICAgICB8Q2FyYm9uTGlifE1hYyBPUyBYIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxNYW5hZ2VyICB8TWFuYWdlciAgfCAgICAgICAgIHwgICAgICAgICB8Ci0qIEZvbnRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKwotRk1DcmVhdGVGb250RmFtaWx5SXRlcmF0b3IoKSAgICAgICAgICB8ICAgIHggICAgfCAgICB4ICAgIHwgOS4wLSAgICB8IDEuMC0gICAgfCAgIC0xMC4zIHwKLUZNRGlzcG9zZUZvbnRGYW1pbHlJdGVyYXRvcigpICAgICAgICAgfCAgICB4ICAgIHwgICAgeCAgICB8IDkuMC0gICAgfCAxLjAtICAgIHwgICAtMTAuMyB8Ci1GTUdldE5leHRGb250RmFtaWx5KCkgICAgICAgICAgICAgICAgIHwgICAgeCAgICB8ICAgIHggICAgfCA5LjAtICAgIHwgMS4wLSAgICB8ICAgLTEwLjMgfAotRk1HZXRGb250RmFtaWx5TmFtZSgpICAgICAgICAgICAgICAgICB8ICAgIHggICAgfCAgICB4ICAgIHwgOS4wLSAgICB8IDEuMC0gICAgfCAgIC0xMC4zIHwKLUZNQ3JlYXRlRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3IoKSAgfCAgICB4ICAgIHwgICAgeCAgICB8IDkuMC0gICAgfCAxLjAtICAgIHwgICAtMTAuMyB8Ci1GTURpc3Bvc2VGb250RmFtaWx5SW5zdGFuY2VJdGVyYXRvcigpIHwgICAgeCAgICB8ICAgIHggICAgfCA5LjAtICAgIHwgMS4wLSAgICB8ICAgLTEwLjMgfAotRk1HZXROZXh0Rm9udEZhbWlseUluc3RhbmNlKCkgICAgICAgICB8ICAgIHggICAgfCAgICB4ICAgIHwgOS4wLSAgICB8IDEuMC0gICAgfCAgIC0xMC4zIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgLSAgICB8ICAgIC0gICAgfCAgICAtICAgIHxDYXJib25MaWJ8TWFjIE9TIFggfAotKiBBVFNGb250LmggKCoqKikgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSsKLUFUU0ZvbnRGaW5kRnJvbU5hbWUoKSAgICAgICAgICAgICAgICAgfCAgICB4ICAgIHwgICAgeCAgICB8ICAgIHggICAgfCAgICB4ICAgIHwgICAgbyAgICB8Ci1BVFNGb250R2V0RmlsZVNwZWNpZmljYXRpb24oKSAgICAgICAgIHwgICAgeCAgICB8ICAgIHggICAgfCAgICB4ICAgIHwgICAgeCAgICB8ICAgIG8gICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSsKLQotICAgICgqKQotICAgIEluIHRoZSAiQ2xhc3NpYyI6IHRoZSBvcmlnaW5hbCBiaW5hcnkgZXhlY3V0YWJsZQotICAgIGZvcm1hdCwgdGhlc2UgZnJhbWV3b3JrIGZ1bmN0aW9ucyBhcmUgZGlyZWN0bHkKLSAgICB0cmFuc2Zvcm1lZCB0byBNYWNPUyBzeXN0ZW0gY2FsbC4gVGhlcmVmb3JlLCB0aGUKLSAgICBleGFjdCBhdmFpbGFiaWxpdHkgc2hvdWxkIGJlIGNoZWNrZWQgYnkgcnVubmluZwotICAgIHN5c3RlbS4KLQotICAgICgqKikKLSAgICBJbnRlcmZhY2VMaWIgaXMgYnVuZGxlZCB0byBNYWNPUyBhbmQgaXRzIHZlcnNpb24KLSAgICBpcyB1c3VhbGx5IGVxdWFsIHRvIE1hY09TLiBUaGVyZSdzIG5vIHNlcGFyYXRlCi0gICAgdXBkYXRlIGZvciBJbnRlcmZhY2VMaWIuIEl0IGlzIHN1cHBvc2VkIHRoYXQKLSAgICB0aGVyZSdzIG5vIEludGVyZmFjZUxpYiA5LnggZm9yIG02OGsgcGxhdGZvcm1zLgotICAgIEluIGZhY3QsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgRlNSZWYgZGVwZW5kZW50LgotCi0gICAgKCoqKikKLSAgICBBVFNVSSBmcmFtZXdvcmsgaXMgYXZhaWxhYmxlIG9uIEFUU1VuaWNvZGUgOC41IG9uCi0gICAgcHBjIFRvb2xib3ggQ0ZNLCBDYXJib25MaWIgMS4wIHRvby4gQnV0IGl0cyBiYXNlOgotICAgIEFUUyBmb250IG1hbmFnZXIgaXMgbm90IHB1Ymxpc2hlZCBpbiB0aGVzZSB2ZXJzaW9ucy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MYXN0IHVwZGF0ZTogMjAxMy1Ob3YtMDMuCi0KLUN1cnJlbnRseSBtYWludGFpbmVkIGJ5Ci0Jc3V6dWtpIHRvc2hpeWEsIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLU9yaWdpbmFsbHkgcHJlcGFyZWQgYnkKLQlMZW9uYXJkIFJvc2VudGhvbCwgPGxlb25hcmRyQGxhemVyd2FyZS5jb20+Ci0JSnVzdCB2YW4gUm9zc3VtLCA8anVzdEBsZXR0ZXJyb3IuY29tPgpkaWZmIC0tZ2l0IGEvYnVpbGRzL21hYy9hc2NpaTJtcHcucHkgYi9idWlsZHMvbWFjL2FzY2lpMm1wdy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQzMmIyMS4uMDAwMDAwMAotLS0gYS9idWlsZHMvbWFjL2FzY2lpMm1wdy5weQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotaW1wb3J0IHN5cwotaW1wb3J0IHN0cmluZwotCi1pZiBsZW4oIHN5cy5hcmd2ICkgPT0gMSA6Ci0gIGZvciBhc2NfbGluZSBpbiBzeXMuc3RkaW4ucmVhZGxpbmVzKCk6Ci0gICAgbXB3X2xpbmUgPSBzdHJpbmcucmVwbGFjZShhc2NfbGluZSwgIlxceEE1IiwgIlwyNDUiKQotICAgIG1wd19saW5lID0gc3RyaW5nLnJlcGxhY2UobXB3X2xpbmUsICJcXHhCNiIsICJcMjY2IikKLSAgICBtcHdfbGluZSA9IHN0cmluZy5yZXBsYWNlKG1wd19saW5lLCAiXFx4QzQiLCAiXDMwNCIpCi0gICAgbXB3X2xpbmUgPSBzdHJpbmcucmVwbGFjZShtcHdfbGluZSwgIlxceEM1IiwgIlwzMDUiKQotICAgIG1wd19saW5lID0gc3RyaW5nLnJlcGxhY2UobXB3X2xpbmUsICJcXHhGRiIsICJcMzc3IikKLSAgICBtcHdfbGluZSA9IHN0cmluZy5yZXBsYWNlKG1wd19saW5lLCAiXG4iLCAgICJcciIpCi0gICAgbXB3X2xpbmUgPSBzdHJpbmcucmVwbGFjZShtcHdfbGluZSwgIlxcbiIsICAgIlxuIikKLSAgICBzeXMuc3Rkb3V0LndyaXRlKG1wd19saW5lKQotZWxpZiBzeXMuYXJndlsxXSA9PSAiLXIiIDoKLSAgZm9yIG1wd19saW5lIGluIHN5cy5zdGRpbi5yZWFkbGluZXMoKToKLSAgICBhc2NfbGluZSA9IHN0cmluZy5yZXBsYWNlKG1wd19saW5lLCAiXG4iLCAgICJcXG4iKQotICAgIGFzY19saW5lID0gc3RyaW5nLnJlcGxhY2UoYXNjX2xpbmUsICJcciIsICAgIlxuIikKLSAgICBhc2NfbGluZSA9IHN0cmluZy5yZXBsYWNlKGFzY19saW5lLCAiXDI0NSIsICJcXHhBNSIpCi0gICAgYXNjX2xpbmUgPSBzdHJpbmcucmVwbGFjZShhc2NfbGluZSwgIlwyNjYiLCAiXFx4QjYiKQotICAgIGFzY19saW5lID0gc3RyaW5nLnJlcGxhY2UoYXNjX2xpbmUsICJcMzA0IiwgIlxceEM0IikKLSAgICBhc2NfbGluZSA9IHN0cmluZy5yZXBsYWNlKGFzY19saW5lLCAiXDMwNSIsICJcXHhDNSIpCi0gICAgYXNjX2xpbmUgPSBzdHJpbmcucmVwbGFjZShhc2NfbGluZSwgIlwzNzciLCAiXFx4RkYiKQotICAgIHN5cy5zdGRvdXQud3JpdGUoYXNjX2xpbmUpCmRpZmYgLS1naXQgYS9idWlsZHMvbWFjL2ZyZWV0eXBlLUluZm8ucGxpc3QgYi9idWlsZHMvbWFjL2ZyZWV0eXBlLUluZm8ucGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDExNGQuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL21hYy9mcmVldHlwZS1JbmZvLnBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Ci0KLTxwbGlzdCB2ZXJzaW9uPSIxLjAiPgotCi08ZGljdD4KLSAgPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+Ci0gIDxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgotCi0gIDxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+Ci0gIDxzdHJpbmc+RnJlZVR5cGU8L3N0cmluZz4KLQotICA8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgotICA8c3RyaW5nPkZyZWVUeXBlICR7UFJPSkVDVF9WRVJTSU9OfTwvc3RyaW5nPgotCi0gIDxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KLSAgPHN0cmluZz42LjA8L3N0cmluZz4KLQotICA8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgotICA8c3RyaW5nPkZyZWVUeXBlPC9zdHJpbmc+Ci0KLSAgPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+Ci0gIDxzdHJpbmc+Rk1XSzwvc3RyaW5nPgotCi0gIDxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KLSAgPHN0cmluZz4ke1BST0pFQ1RfVkVSU0lPTn08L3N0cmluZz4KLQotICA8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+Ci0gIDxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgotCi0gIDxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+Ci0gIDxzdHJpbmc+JHtQUk9KRUNUX1ZFUlNJT059PC9zdHJpbmc+Ci08L2RpY3Q+Ci0KLTwvcGxpc3Q+CmRpZmYgLS1naXQgYS9idWlsZHMvbWFjL2Z0bGliLnByai54bWwgYi9idWlsZHMvbWFjL2Z0bGliLnByai54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYmM0NWUuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL21hYy9mdGxpYi5wcmoueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIiA/PgotPD9jb2Rld2FycmlvciBleHBvcnR2ZXJzaW9uPSIxLjAuMSIgaWRldmVyc2lvbj0iNS4wIiA/PgotCi08IURPQ1RZUEUgUFJPSkVDVCBbCi08IUVMRU1FTlQgUFJPSkVDVCAoVEFSR0VUTElTVCwgVEFSR0VUT1JERVIsIEdST1VQTElTVCwgREVTSUdOTElTVD8pPgotPCFFTEVNRU5UIFRBUkdFVExJU1QgKFRBUkdFVCspPgotPCFFTEVNRU5UIFRBUkdFVCAoTkFNRSwgU0VUVElOR0xJU1QsIEZJTEVMSVNUPywgTElOS09SREVSPywgU0VHTUVOVExJU1Q/LCBPVkVSTEFZR1JPVVBMSVNUPywgU1VCVEFSR0VUTElTVD8sIFNVQlBST0pFQ1RMSVNUPywgRlJBTUVXT1JLTElTVD8sIFBBQ0tBR0VBQ1RJT05TTElTVD8pPgotPCFFTEVNRU5UIE5BTUUgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIFVTRVJTT1VSQ0VUUkVFVFlQRSAoI1BDREFUQSk+Ci08IUVMRU1FTlQgUEFUSCAoI1BDREFUQSk+Ci08IUVMRU1FTlQgRklMRUxJU1QgKEZJTEUqKT4KLTwhRUxFTUVOVCBGSUxFIChQQVRIVFlQRSwgUEFUSFJPT1Q/LCBBQ0NFU1NQQVRIPywgUEFUSCwgUEFUSEZPUk1BVD8sIFJPT1RGSUxFUkVGPywgRklMRUtJTkQ/LCBGSUxFRkxBR1M/KT4KLTwhRUxFTUVOVCBQQVRIVFlQRSAoI1BDREFUQSk+Ci08IUVMRU1FTlQgUEFUSFJPT1QgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIEFDQ0VTU1BBVEggKCNQQ0RBVEEpPgotPCFFTEVNRU5UIFBBVEhGT1JNQVQgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIFJPT1RGSUxFUkVGIChQQVRIVFlQRSwgUEFUSFJPT1Q/LCBBQ0NFU1NQQVRIPywgUEFUSCwgUEFUSEZPUk1BVD8pPgotPCFFTEVNRU5UIEZJTEVLSU5EICgjUENEQVRBKT4KLTwhRUxFTUVOVCBGSUxFRkxBR1MgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIEZJTEVSRUYgKFRBUkdFVE5BTUU/LCBQQVRIVFlQRSwgUEFUSFJPT1Q/LCBBQ0NFU1NQQVRIPywgUEFUSCwgUEFUSEZPUk1BVD8pPgotPCFFTEVNRU5UIFRBUkdFVE5BTUUgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIFNFVFRJTkdMSVNUICgoU0VUVElOR3xQQU5FTERBVEEpKyk+Ci08IUVMRU1FTlQgU0VUVElORyAoTkFNRT8sIChWQUxVRXwoU0VUVElORyspKSk+Ci08IUVMRU1FTlQgUEFORUxEQVRBIChOQU1FLCBWQUxVRSk+Ci08IUVMRU1FTlQgVkFMVUUgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIExJTktPUkRFUiAoRklMRVJFRiopPgotPCFFTEVNRU5UIFNFR01FTlRMSVNUIChTRUdNRU5UKyk+Ci08IUVMRU1FTlQgU0VHTUVOVCAoTkFNRSwgQVRUUklCVVRFUz8sIEZJTEVSRUYqKT4KLTwhRUxFTUVOVCBBVFRSSUJVVEVTICgjUENEQVRBKT4KLTwhRUxFTUVOVCBPVkVSTEFZR1JPVVBMSVNUIChPVkVSTEFZR1JPVVArKT4KLTwhRUxFTUVOVCBPVkVSTEFZR1JPVVAgKE5BTUUsIEJBU0VBRERSRVNTLCBPVkVSTEFZKik+Ci08IUVMRU1FTlQgQkFTRUFERFJFU1MgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIE9WRVJMQVkgKE5BTUUsIEZJTEVSRUYqKT4KLTwhRUxFTUVOVCBTVUJUQVJHRVRMSVNUIChTVUJUQVJHRVQrKT4KLTwhRUxFTUVOVCBTVUJUQVJHRVQgKFRBUkdFVE5BTUUsIEFUVFJJQlVURVM/LCBGSUxFUkVGPyk+Ci08IUVMRU1FTlQgU1VCUFJPSkVDVExJU1QgKFNVQlBST0pFQ1QrKT4KLTwhRUxFTUVOVCBTVUJQUk9KRUNUIChGSUxFUkVGLCBTVUJQUk9KRUNUVEFSR0VUTElTVCk+Ci08IUVMRU1FTlQgU1VCUFJPSkVDVFRBUkdFVExJU1QgKFNVQlBST0pFQ1RUQVJHRVQqKT4KLTwhRUxFTUVOVCBTVUJQUk9KRUNUVEFSR0VUIChUQVJHRVROQU1FLCBBVFRSSUJVVEVTPywgRklMRVJFRj8pPgotPCFFTEVNRU5UIEZSQU1FV09SS0xJU1QgKEZSQU1FV09SSyspPgotPCFFTEVNRU5UIEZSQU1FV09SSyAoRklMRVJFRiwgTElCUkFSWUZJTEU/LCBWRVJTSU9OPyk+Ci08IUVMRU1FTlQgUEFDS0FHRUFDVElPTlNMSVNUIChQQUNLQUdFQUNUSU9OKyk+Ci08IUVMRU1FTlQgUEFDS0FHRUFDVElPTiAoI1BDREFUQSk+Ci08IUVMRU1FTlQgTElCUkFSWUZJTEUgKEZJTEVSRUYpPgotPCFFTEVNRU5UIFZFUlNJT04gKCNQQ0RBVEEpPgotPCFFTEVNRU5UIFRBUkdFVE9SREVSIChPUkRFUkVEVEFSR0VUfE9SREVSRURERVNJR04pKj4KLTwhRUxFTUVOVCBPUkRFUkVEVEFSR0VUIChOQU1FKT4KLTwhRUxFTUVOVCBPUkRFUkVEREVTSUdOIChOQU1FLCBPUkRFUkVEVEFSR0VUKyk+Ci08IUVMRU1FTlQgR1JPVVBMSVNUIChHUk9VUHxGSUxFUkVGKSo+Ci08IUVMRU1FTlQgR1JPVVAgKE5BTUUsIChHUk9VUHxGSUxFUkVGKSopPgotPCFFTEVNRU5UIERFU0lHTkxJU1QgKERFU0lHTispPgotPCFFTEVNRU5UIERFU0lHTiAoTkFNRSwgREVTSUdOREFUQSk+Ci08IUVMRU1FTlQgREVTSUdOREFUQSAoI1BDREFUQSk+Ci1dPgotCi08UFJPSkVDVD4KLSAgICA8VEFSR0VUTElTVD4KLSAgICAgICAgPFRBUkdFVD4KLSAgICAgICAgICAgIDxOQU1FPkZyZWVUeXBlTGliPC9OQU1FPgotICAgICAgICAgICAgPFNFVFRJTkdMSVNUPgotCi0gICAgICAgICAgICAgICAgPCEtLSBTZXR0aW5ncyBmb3IgIlNvdXJjZSBUcmVlcyIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+VXNlclNvdXJjZVRyZWVzPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJBY2Nlc3MgUGF0aHMiIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkFsd2F5c1NlYXJjaFVzZXJQYXRoczwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkludGVycHJldERPU0FuZFVuaXhQYXRoczwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlcXVpcmVGcmFtZXdvcmtTdHlsZUluY2x1ZGVzPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlNvdXJjZVJlbGF0aXZlSW5jbHVkZXM8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+VXNlclNlYXJjaFBhdGhzPC9OQU1FPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlNlYXJjaFBhdGg8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aDwvTkFNRT48VkFMVUU+OjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGhGb3JtYXQ8L05BTUU+PFZBTFVFPk1hY09TPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aFJvb3Q8L05BTUU+PFZBTFVFPlByb2plY3Q8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlY3Vyc2l2ZTwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RnJhbWV3b3JrUGF0aDwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkhvc3RGbGFnczwvTkFNRT48VkFMVUU+QWxsPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5TZWFyY2hQYXRoPC9OQU1FPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGg8L05BTUU+PFZBTFVFPjo6OmluY2x1ZGU6PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aEZvcm1hdDwvTkFNRT48VkFMVUU+TWFjT1M8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoUm9vdDwvTkFNRT48VkFMVUU+UHJvamVjdDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVjdXJzaXZlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GcmFtZXdvcmtQYXRoPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SG9zdEZsYWdzPC9OQU1FPjxWQUxVRT5BbGw8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlNlYXJjaFBhdGg8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aDwvTkFNRT48VkFMVUU+Ojo6c3JjOjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGhGb3JtYXQ8L05BTUU+PFZBTFVFPk1hY09TPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aFJvb3Q8L05BTUU+PFZBTFVFPlByb2plY3Q8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlY3Vyc2l2ZTwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RnJhbWV3b3JrUGF0aDwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkhvc3RGbGFnczwvTkFNRT48VkFMVUU+QWxsPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5TZWFyY2hQYXRoPC9OQU1FPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGg8L05BTUU+PFZBTFVFPjo6PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aEZvcm1hdDwvTkFNRT48VkFMVUU+TWFjT1M8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoUm9vdDwvTkFNRT48VkFMVUU+UHJvamVjdDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVjdXJzaXZlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GcmFtZXdvcmtQYXRoPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SG9zdEZsYWdzPC9OQU1FPjxWQUxVRT5BbGw8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5TeXN0ZW1TZWFyY2hQYXRoczwvTkFNRT4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5TZWFyY2hQYXRoPC9OQU1FPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGg8L05BTUU+PFZBTFVFPjo8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoRm9ybWF0PC9OQU1FPjxWQUxVRT5NYWNPUzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGhSb290PC9OQU1FPjxWQUxVRT5Db2RlV2FycmlvcjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVjdXJzaXZlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GcmFtZXdvcmtQYXRoPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SG9zdEZsYWdzPC9OQU1FPjxWQUxVRT5BbGw8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJEZWJ1Z2dlciBSdW50aW1lIiBwYW5lbCAtLT4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1J1bnRpbWVTZXR0aW5nc19Xb3JraW5nRGlyZWN0b3J5PC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1J1bnRpbWVTZXR0aW5nc19Db21tYW5kTGluZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdSdW50aW1lU2V0dGluZ3NfSG9zdEFwcGxpY2F0aW9uPC9OQU1FPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aEZvcm1hdDwvTkFNRT48VkFMVUU+R2VuZXJpYzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoUm9vdDwvTkFNRT48VkFMVUU+QWJzb2x1dGU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdSdW50aW1lU2V0dGluZ3NfRW52VmFyczwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiVGFyZ2V0IFNldHRpbmdzIiBwYW5lbCAtLT4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MaW5rZXI8L05BTUU+PFZBTFVFPk1hY09TIFBQQyBMaW5rZXI8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVMaW5rZXI8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBvc3RMaW5rZXI8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlRhcmdldG5hbWU8L05BTUU+PFZBTFVFPkZyZWVUeXBlTGliPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+T3V0cHV0RGlyZWN0b3J5PC9OQU1FPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoPC9OQU1FPjxWQUxVRT46OjpvYmpzOjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoRm9ybWF0PC9OQU1FPjxWQUxVRT5NYWNPUzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoUm9vdDwvTkFNRT48VkFMVUU+UHJvamVjdDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5TYXZlRW50cmllc1VzaW5nUmVsYXRpdmVQYXRoczwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJGaWxlIE1hcHBpbmdzIiBwYW5lbCAtLT4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlTWFwcGluZ3M8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPkFQUEw8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlVHlwZTwvTkFNRT48VkFMVUU+QXBwbDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZUV4dGVuc2lvbjwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SWdub3JlZEJ5TWFrZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVUeXBlPC9OQU1FPjxWQUxVRT5NTUxCPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvbXBpbGVyPC9OQU1FPjxWQUxVRT5MaWIgSW1wb3J0IFBQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVzb3VyY2VGaWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SWdub3JlZEJ5TWFrZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVUeXBlPC9OQU1FPjxWQUxVRT5NUExGPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvbXBpbGVyPC9OQU1FPjxWQUxVRT5MaWIgSW1wb3J0IFBQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVzb3VyY2VGaWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SWdub3JlZEJ5TWFrZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVUeXBlPC9OQU1FPjxWQUxVRT5NV0NEPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvbXBpbGVyPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkVkaXRMYW5ndWFnZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVzb3VyY2VGaWxlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlJTUkM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlVHlwZTwvTkFNRT48VkFMVUU+VEVYVDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZUV4dGVuc2lvbjwvTkFNRT48VkFMVUU+LmJoPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+QmFsbG9vbiBIZWxwPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlRFWFQ8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPi5jPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+TVcgQy9DKysgUFBDPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPkMvQysrPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlVHlwZTwvTkFNRT48VkFMVUU+VEVYVDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZUV4dGVuc2lvbjwvTkFNRT48VkFMVUU+LmMrKzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPk1XIEMvQysrIFBQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT5DL0MrKzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlRFWFQ8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPi5jYzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPk1XIEMvQysrIFBQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT5DL0MrKzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlRFWFQ8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPi5jcDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPk1XIEMvQysrIFBQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT5DL0MrKzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlRFWFQ8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPi5jcHA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvbXBpbGVyPC9OQU1FPjxWQUxVRT5NVyBDL0MrKyBQUEM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkVkaXRMYW5ndWFnZTwvTkFNRT48VkFMVUU+Qy9DKys8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVzb3VyY2VGaWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SWdub3JlZEJ5TWFrZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVUeXBlPC9OQU1FPjxWQUxVRT5URVhUPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT4uZXhwPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlRFWFQ8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPi5oPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+TVcgQy9DKysgUFBDPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPkMvQysrPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVUeXBlPC9OQU1FPjxWQUxVRT5URVhUPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT4ucDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPk1XIFBhc2NhbCBQUEM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkVkaXRMYW5ndWFnZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlVHlwZTwvTkFNRT48VkFMVUU+VEVYVDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZUV4dGVuc2lvbjwvTkFNRT48VkFMVUU+LnBhczwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPk1XIFBhc2NhbCBQUEM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkVkaXRMYW5ndWFnZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlVHlwZTwvTkFNRT48VkFMVUU+VEVYVDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZUV4dGVuc2lvbjwvTkFNRT48VkFMVUU+LnBjaDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPk1XIEMvQysrIFBQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT5DL0MrKzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlVHlwZTwvTkFNRT48VkFMVUU+VEVYVDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZUV4dGVuc2lvbjwvTkFNRT48VkFMVUU+LnBjaCsrPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+TVcgQy9DKysgUFBDPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPkMvQysrPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVzb3VyY2VGaWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SWdub3JlZEJ5TWFrZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVUeXBlPC9OQU1FPjxWQUxVRT5URVhUPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT4ucHB1PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+TVcgUGFzY2FsIFBQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlRFWFQ8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPi5yPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+UmV6PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPlJlejwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlRFWFQ8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPi5zPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+UFBDQXNtPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPlhDT0Y8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPlhDT0ZGIEltcG9ydCBQUEM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkVkaXRMYW5ndWFnZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlVHlwZTwvTkFNRT48VkFMVUU+ZG9jdTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZUV4dGVuc2lvbjwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Db21waWxlcjwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SWdub3JlZEJ5TWFrZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVUeXBlPC9OQU1FPjxWQUxVRT5yc3JjPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvbXBpbGVyPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkVkaXRMYW5ndWFnZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVzb3VyY2VGaWxlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPnNobGI8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPlBFRiBJbXBvcnQgUFBDPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZVR5cGU8L05BTUU+PFZBTFVFPnN0dWI8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVFeHRlbnNpb248L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPlBFRiBJbXBvcnQgUFBDPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5FZGl0TGFuZ3VhZ2U8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UHJlY29tcGlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkxhdW5jaGFibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RmlsZUV4dGVuc2lvbjwvTkFNRT48VkFMVUU+LmRvYzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5JZ25vcmVkQnlNYWtlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT4ubzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPlhDT0ZGIEltcG9ydCBQUEM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkVkaXRMYW5ndWFnZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmVjb21waWxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoYWJsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlc291cmNlRmlsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT4ucHBvYjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5GaWxlRXh0ZW5zaW9uPC9OQU1FPjxWQUxVRT4ucnNyYzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29tcGlsZXI8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RWRpdExhbmd1YWdlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlByZWNvbXBpbGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYXVuY2hhYmxlPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5SZXNvdXJjZUZpbGU8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPklnbm9yZWRCeU1ha2U8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiQnVpbGQgRXh0cmFzIiBwYW5lbCAtLT4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DYWNoZU1vZERhdGVzPC9OQU1FPjxWQUxVRT50cnVlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+RHVtcEJyb3dzZXJJbmZvPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNhY2hlU3VicHJvamVjdHM8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Vc2VUaGlyZFBhcnR5RGVidWdnZXI8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+QnJvd3NlckdlbmVyYXRvcjwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkRlYnVnZ2VyQXBwUGF0aDwvTkFNRT4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aDwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGhGb3JtYXQ8L05BTUU+PFZBTFVFPkdlbmVyaWM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aFJvb3Q8L05BTUU+PFZBTFVFPkFic29sdXRlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkRlYnVnZ2VyQ21kTGluZUFyZ3M8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkRlYnVnZ2VyV29ya2luZ0RpcjwvTkFNRT4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aDwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGhGb3JtYXQ8L05BTUU+PFZBTFVFPkdlbmVyaWM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aFJvb3Q8L05BTUU+PFZBTFVFPkFic29sdXRlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvZGVDb21wbGV0aW9uUHJlZml4RmlsZU5hbWU8L05BTUU+PFZBTFVFPk1hY0hlYWRlcnMuYzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvZGVDb21wbGV0aW9uTWFjcm9GaWxlTmFtZTwvTkFNRT48VkFMVUU+TWFjT1NfQ2FyYm9uX0MrK19NYWNyb3MuaDwvVkFMVUU+PC9TRVRUSU5HPgotCi0gICAgICAgICAgICAgICAgPCEtLSBTZXR0aW5ncyBmb3IgIkRlYnVnZ2VyIFRhcmdldCIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29uc29sZUVuY29kaW5nPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TG9nU3lzdGVtTWVzc2FnZXM8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5BdXRvVGFyZ2V0RExMczwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5TdG9wQXRXYXRjaHBvaW50czwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdXNlV2hpbGVSdW5uaW5nPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdXNlSW50ZXJ2YWw8L05BTUU+PFZBTFVFPjU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXVzZVVJRmxhZ3M8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5BbHRFeGVQYXRoPC9OQU1FPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aEZvcm1hdDwvTkFNRT48VkFMVUU+R2VuZXJpYzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QYXRoUm9vdDwvTkFNRT48VkFMVUU+QWJzb2x1dGU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+U3RvcEF0VGVtcEJQT25MYXVuY2g8L05BTUU+PFZBTFVFPnRydWU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DYWNoZVN5bWJvbGljczwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlRlbXBCUEZ1bmN0aW9uTmFtZTwvTkFNRT48VkFMVUU+bWFpbjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlRlbXBCUFR5cGU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJSZW1vdGUgRGVidWciIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkVuYWJsZWQ8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q29ubmVjdGlvbk5hbWU8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkRvd25sb2FkUGF0aDwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TGF1bmNoUmVtb3RlQXBwPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlbW90ZUFwcFBhdGg8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvcmVJRDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkpUQUdDbG9ja1NwZWVkPC9OQU1FPjxWQUxVRT44MDAwPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SXNNdWx0aUNvcmU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+T1NEb3dubG9hZDwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5Vc2VHbG9iYWxPU0Rvd25sb2FkPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk9TRG93bmxvYWRDb25uZWN0aW9uTmFtZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+T1NEb3dubG9hZFBhdGg8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkFsdERvd25sb2FkPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkFsdERvd25sb2FkQ29ubmVjdGlvbk5hbWU8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotCi0gICAgICAgICAgICAgICAgPCEtLSBTZXR0aW5ncyBmb3IgIkF1dG8tdGFyZ2V0IiBwYW5lbCAtLT4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5PdGhlckV4ZWN1dGFibGVzPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJBbmFseXplciBDb25uZWN0aW9ucyIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+QW5hbHl6ZXJDb25uZWN0aW9uTmFtZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiQ3VzdG9tIEtleXdvcmRzIiBwYW5lbCAtLT4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DdXN0b21Db2xvcjE8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlZDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5HcmVlbjwvTkFNRT48VkFMVUU+MzI3Njc8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Qmx1ZTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DdXN0b21Db2xvcjI8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlZDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5HcmVlbjwvTkFNRT48VkFMVUU+MzI3Njc8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Qmx1ZTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DdXN0b21Db2xvcjM8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlZDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5HcmVlbjwvTkFNRT48VkFMVUU+MzI3Njc8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Qmx1ZTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DdXN0b21Db2xvcjQ8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlJlZDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5HcmVlbjwvTkFNRT48VkFMVUU+MzI3Njc8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Qmx1ZTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJDL0MrKyBDb21waWxlciIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX2NwbHVzcGx1czwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRnJvbnRFbmRfQ19jaGVja3Byb3RvczwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRnJvbnRFbmRfQ19hcm08L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Zyb250RW5kX0NfdHJpZ3JhcGhzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX29ubHlzdGRrZXl3b3JkczwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRnJvbnRFbmRfQ19lbnVtc2Fsd2F5c2ludDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRnJvbnRFbmRfQ19hbnNpc3RyaWN0PC9OQU1FPjxWQUxVRT4xPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX3djaGFyX3R5cGU8L05BTUU+PFZBTFVFPjE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Zyb250RW5kX0NfZW5hYmxlZXhjZXB0aW9uczwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRnJvbnRFbmRfQ19kb250cmV1c2VzdHJpbmdzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX3Bvb2xzdHJpbmdzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX2RvbnRpbmxpbmU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Zyb250RW5kX0NfdXNlUlRUSTwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRnJvbnRFbmRfQ191bnNpZ25lZGNoYXJzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX2F1dG9pbmxpbmU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Zyb250RW5kX0NfYm9vbHRydWVmYWxzZTwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRnJvbnRFbmRfQ19pbmxpbmVsZXZlbDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRnJvbnRFbmRfQ19lY3BsdXNwbHVzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX2RlZmVyX2NvZGVnZW48L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Zyb250RW5kX0NfdGVtcGxhdGVwYXJzZXI8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Zyb250RW5kX0NfYzk5PC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX2JvdHRvbXVwaW5saW5lPC9OQU1FPjxWQUxVRT4xPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX2djY19leHRlbnNpb25zPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdGcm9udEVuZF9DX2luc3RhbmNlX21hbmFnZXI8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJDL0MrKyBQcmVwcm9jZXNzb3IiIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNfQ1BQX1ByZXByb2Nlc3Nvcl9FbWl0RmlsZTwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNfQ1BQX1ByZXByb2Nlc3Nvcl9FbWl0TGluZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DX0NQUF9QcmVwcm9jZXNzb3JfRW1pdEZ1bGxQYXRoPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNfQ1BQX1ByZXByb2Nlc3Nvcl9LZWVwQ29tbWVudHM8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+Q19DUFBfUHJlcHJvY2Vzc29yX1BDSFVzZXNQcmVmaXhUZXh0PC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNfQ1BQX1ByZXByb2Nlc3Nvcl9FbWl0UHJhZ21hczwvTkFNRT48VkFMVUU+dHJ1ZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNfQ1BQX1ByZXByb2Nlc3Nvcl9LZWVwV2hpdGVTcGFjZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DX0NQUF9QcmVwcm9jZXNzb3JfTXVsdGlCeXRlRW5jb2Rpbmc8L05BTUU+PFZBTFVFPmVuY0FTQ0lJX1VuaWNvZGU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5DX0NQUF9QcmVwcm9jZXNzb3JfUHJlZml4VGV4dDwvTkFNRT48VkFMVUU+Lyogc2V0dGluZ3MgaW1wb3J0ZWQgZnJvbSBvbGQgIkMvQysrIExhbmd1YWdlIiBwYW5lbCAqLwotCi0jaWYgIV9fb3B0aW9uKHByZWNvbXBpbGUpCi0jaW5jbHVkZSAiZnRvcHRpb24uaCIgLyogd2FzICJQcmVmaXggZmlsZSIgKi8KLSNlbmRpZgotPC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiQy9DKysgV2FybmluZ3MiIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XV2FybmluZ19DX3dhcm5faWxscHJhZ21hPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdXYXJuaW5nX0Nfd2Fybl9lbXB0eWRlY2w8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX3Bvc3N1bndhbnQ8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX3VudXNlZHZhcjwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XV2FybmluZ19DX3dhcm5fdW51c2VkYXJnPC9OQU1FPjxWQUxVRT4xPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdXYXJuaW5nX0Nfd2Fybl9leHRyYWNvbW1hPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdXYXJuaW5nX0NfcGVkYW50aWM8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuaW5nZXJyb3JzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdXYXJuaW5nX0Nfd2Fybl9oaWRldmlydHVhbDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XV2FybmluZ19DX3dhcm5faW1wbGljaXRjb252PC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdXYXJuaW5nX0Nfd2Fybl9ub3RpbmxpbmVkPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdXYXJuaW5nX0Nfd2Fybl9zdHJ1Y3RjbGFzczwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XV2FybmluZ19DX3dhcm5fbWlzc2luZ3JldHVybjwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XV2FybmluZ19DX3dhcm5fbm9fc2lkZV9lZmZlY3Q8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX3Jlc3VsdG5vdHVzZWQ8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX3BhZGRpbmc8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX2ltcGxfaTJmX2NvbnY8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX2ltcGxfZjJpX2NvbnY8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX2ltcGxfczJ1X2NvbnY8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX2lsbHRva2VucGFzdGluZzwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XV2FybmluZ19DX3dhcm5fZmlsZW5hbWVjYXBzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdXYXJuaW5nX0Nfd2Fybl9maWxlbmFtZWNhcHNzeXN0ZW08L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX3VuZGVmbWFjcm88L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1dhcm5pbmdfQ193YXJuX3B0cmludGNvbnY8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJNYWNPUyBNZXJnZSBQYW5lbCIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdNZXJnZV9NYWNPU19wcm9qZWN0VHlwZTwvTkFNRT48VkFMVUU+QXBwbGljYXRpb248L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV01lcmdlX01hY09TX291dHB1dE5hbWU8L05BTUU+PFZBTFVFPk1lcmdlIE91dDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTWVyZ2VfTWFjT1Nfb3V0cHV0Q3JlYXRvcjwvTkFNRT48VkFMVUU+Pz8/PzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTWVyZ2VfTWFjT1Nfb3V0cHV0VHlwZTwvTkFNRT48VkFMVUU+QVBQTDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTWVyZ2VfTWFjT1Nfc3VwcHJlc3NXYXJuaW5nPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdNZXJnZV9NYWNPU19jb3B5RnJhZ21lbnRzPC9OQU1FPjxWQUxVRT4xPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdNZXJnZV9NYWNPU19jb3B5UmVzb3VyY2VzPC9OQU1FPjxWQUxVRT4xPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdNZXJnZV9NYWNPU19mbGF0dGVuUmVzb3VyY2U8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV01lcmdlX01hY09TX2ZsYXRGaWxlTmFtZTwvTkFNRT48VkFMVUU+YS5yc3JjPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdNZXJnZV9NYWNPU19mbGF0RmlsZU91dHB1dFBhdGg8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGg8L05BTUU+PFZBTFVFPjo8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aEZvcm1hdDwvTkFNRT48VkFMVUU+TWFjT1M8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aFJvb3Q8L05BTUU+PFZBTFVFPlByb2plY3Q8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdNZXJnZV9NYWNPU19za2lwUmVzb3VyY2VzPC9OQU1FPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48VkFMVUU+RExHWDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48VkFMVUU+Y2tpZDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48VkFMVUU+UHJvajwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgICAgICA8U0VUVElORz48VkFMVUU+V1NQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJPdXRwdXQgRmxhZ3MiIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkZpbGVMb2NrZWQ8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UmVzb3VyY2VzTWFwSXNSZWFkT25seTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QcmludGVyRHJpdmVySXNNdWx0aUZpbmRlckNvbXBhdGlibGU8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SW52aXNpYmxlPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkhhc0J1bmRsZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5OYW1lTG9ja2VkPC9OQU1FPjxWQUxVRT5mYWxzZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlN0YXRpb25lcnk8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SGFzQ3VzdG9tSWNvbjwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5TaGFyZWQ8L05BTUU+PFZBTFVFPmZhbHNlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+SGFzQmVlbkluaXRlZDwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5MYWJlbDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPkNvbW1lbnRzPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5IYXNDdXN0b21CYWRnZTwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5IYXNSb3V0aW5nSW5mbzwvTkFNRT48VkFMVUU+ZmFsc2U8L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJQUEMgQ29kZUdlbiIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX1BQQ19zdHJ1Y3RhbGlnbm1lbnQ8L05BTUU+PFZBTFVFPlBQQ19tdzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9QUENfdHJhY2ViYWNrdGFibGVzPC9OQU1FPjxWQUxVRT5Ob25lPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX1BQQ19wcm9jZXNzb3I8L05BTUU+PFZBTFVFPkdlbmVyaWM8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fUFBDX2Z1bmN0aW9uX2FsaWduPC9OQU1FPjxWQUxVRT40PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX1BQQ190b2NkYXRhPC9OQU1FPjxWQUxVRT4xPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX1BQQ19sYXJnZXRvYzwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9QUENfcHJvZmlsZXI8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fUFBDX3ZlY3RvcnRvY2RhdGE8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fUFBDX3Bvb2xjb25zdDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9QUENfcGVlcGhvbGU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fUFBDX3JlYWRvbmx5c3RyaW5nczwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9QUENfbGlua2VycG9vbHNzdHJpbmdzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX1BQQ192b2xhdGlsZWFzbTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9QUENfc2NoZWR1bGU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fUFBDX2FsdGl2ZWM8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fUFBDX2FsdGl2ZWNfbW92ZV9ibG9jazwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9QUENfc3RyaWN0SUVFRWZwPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX1BQQ19mcGNvbnRyYWN0PC9OQU1FPjxWQUxVRT4xPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX1BQQ19nZW5mc2VsPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX1BQQ19vcmRlcmVkZnBjbXA8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJQUEMgQ29kZUdlbiBNYWNoLU8iIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9NYWNoT19zdHJ1Y3RhbGlnbm1lbnQ8L05BTUU+PFZBTFVFPlBQQ19tdzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9NYWNoT19wcm9maWxlcl9lbnVtPC9OQU1FPjxWQUxVRT5PZmY8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fTWFjaE9fcHJvY2Vzc29yPC9OQU1FPjxWQUxVRT5HZW5lcmljPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX01hY2hPX2Z1bmN0aW9uX2FsaWduPC9OQU1FPjxWQUxVRT40PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX01hY2hPX2NvbW1vbjwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9NYWNoT19ib29saXNpbnQ8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fTWFjaE9fcGVlcGhvbGU8L05BTUU+PFZBTFVFPjE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fTWFjaE9fcmVhZG9ubHlzdHJpbmdzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX01hY2hPX2xpbmtlcnBvb2xzc3RyaW5nczwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9NYWNoT192b2xhdGlsZWFzbTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9NYWNoT19zY2hlZHVsZTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9NYWNoT19hbHRpdmVjPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX01hY2hPX3ZlY21vdmU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fTWFjaE9fZnBfaWVlZV9zdHJpY3Q8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0NvZGVHZW5fTWFjaE9fZnBjb250cmFjdDwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQ29kZUdlbl9NYWNoT19nZW5mc2VsPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdDb2RlR2VuX01hY2hPX2ZwX2NtcHNfb3JkZXJlZDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotCi0gICAgICAgICAgICAgICAgPCEtLSBTZXR0aW5ncyBmb3IgIlBQQyBEaXNhc3NlbWJsZXIiIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRGlzYXNzZW1ibGVyX1BQQ19zaG93Y29kZTwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRGlzYXNzZW1ibGVyX1BQQ19leHRlbmRlZDwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRGlzYXNzZW1ibGVyX1BQQ19taXg8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Rpc2Fzc2VtYmxlcl9QUENfbm9oZXg8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Rpc2Fzc2VtYmxlcl9QUENfc2hvd2RhdGE8L05BTUU+PFZBTFVFPjE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Rpc2Fzc2VtYmxlcl9QUENfc2hvd2V4Y2VwdGlvbnM8L05BTUU+PFZBTFVFPjE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Rpc2Fzc2VtYmxlcl9QUENfc2hvd3N5bTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XRGlzYXNzZW1ibGVyX1BQQ19zaG93bmFtZXM8L05BTUU+PFZBTFVFPjE8L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJQUEMgR2xvYmFsIE9wdGltaXplciIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+R2xvYmFsT3B0aW1pemVyX1BQQ19vcHRpbWl6YXRpb25sZXZlbDwvTkFNRT48VkFMVUU+TGV2ZWwwPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+R2xvYmFsT3B0aW1pemVyX1BQQ19vcHRmb3I8L05BTUU+PFZBTFVFPlNwZWVkPC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiUFBDIExpbmtlciIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdMaW5rZXJfUFBDX2xpbmtzeW08L05BTUU+PFZBTFVFPjE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9QUENfc3ltZnVsbHBhdGg8L05BTUU+PFZBTFVFPjE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9QUENfbGlua21hcDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX1BQQ19ub2xpbmt3YXJuaW5nczwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX1BQQ19kb250ZGVhZHN0cmlwaW5pdGNvZGU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9QUENfcGVybWl0bXVsdGRlZnM8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9QUENfbGlua21vZGU8L05BTUU+PFZBTFVFPkZhc3Q8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9QUENfY29kZV9mb2xkaW5nPC9OQU1FPjxWQUxVRT5Ob25lPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdMaW5rZXJfUFBDX2luaXRuYW1lPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9QUENfbWFpbm5hbWU8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX1BQQ190ZXJtbmFtZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiUFBDIE1hYyBPUyBYIExpbmtlciIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdMaW5rZXJfTWFjT1NYX2xpbmtzeW08L05BTUU+PFZBTFVFPjE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9NYWNPU1hfc3ltZnVsbHBhdGg8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9NYWNPU1hfbm9saW5rd2FybmluZ3M8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9NYWNPU1hfbGlua21hcDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX01hY09TWF9kb250ZGVhZHN0cmlwaW5pdGNvZGU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9NYWNPU1hfcGVybWl0bXVsdGRlZnM8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9NYWNPU1hfdXNlX29iamVjdGl2ZWNfc2VtYW50aWNzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdMaW5rZXJfTWFjT1NYX3N0cmlwX2RlYnVnX3N5bWJvbHM8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9NYWNPU1hfc3BsaXRfc2VnczwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX01hY09TWF9yZXBvcnRfbXNsX292ZXJsb2FkczwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX01hY09TWF9vYmplY3RzX2ZvbGxvd19saW5rb3JkZXI8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9NYWNPU1hfbGlua21vZGU8L05BTUU+PFZBTFVFPk5vcm1hbDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX01hY09TWF9leHBvcnRzPC9OQU1FPjxWQUxVRT5SZWZlcmVuY2VkR2xvYmFsczwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX01hY09TWF9zb3J0Y29kZTwvTkFNRT48VkFMVUU+Tm9uZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XTGlua2VyX01hY09TWF9tYWlubmFtZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdMaW5rZXJfTWFjT1NYX2luaXRuYW1lPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0xpbmtlcl9NYWNPU1hfY29kZV9mb2xkaW5nPC9OQU1FPjxWQUxVRT5Ob25lPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdMaW5rZXJfTWFjT1NYX3N0YWJzZ2VuPC9OQU1FPjxWQUxVRT5Ob25lPC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiUFBDIE1hYyBPUyBYIFByb2plY3QiIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9NYWNPU1hfdHlwZTwvTkFNRT48VkFMVUU+RXhlY3V0YWJsZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9NYWNPU1hfb3V0ZmlsZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X01hY09TWF9maWxlY3JlYXRvcjwvTkFNRT48VkFMVUU+Pz8/PzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9NYWNPU1hfZmlsZXR5cGU8L05BTUU+PFZBTFVFPk1FWEU8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Byb2plY3RfTWFjT1NYX3ZtYWRkcmVzczwvTkFNRT48VkFMVUU+NDA5NjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9NYWNPU1hfdXNlZGVmYXVsdHZtYWRkcjwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9NYWNPU1hfZmxhdHJzcmM8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Byb2plY3RfTWFjT1NYX2ZsYXRyc3JjZmlsZW5hbWU8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9NYWNPU1hfZmxhdHJzcmNvdXRwdXRkaXI8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGg8L05BTUU+PFZBTFVFPjo8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aEZvcm1hdDwvTkFNRT48VkFMVUU+TWFjT1M8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aFJvb3Q8L05BTUU+PFZBTFVFPlByb2plY3Q8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X01hY09TWF9pbnN0YWxscGF0aDwvTkFNRT48VkFMVUU+Li88L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Byb2plY3RfTWFjT1NYX2RvbnRfcHJlYmluZDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9NYWNPU1hfZmxhdF9uYW1lc3BhY2U8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Byb2plY3RfTWFjT1NYX2ZyYW1ld29ya3ZlcnNpb248L05BTUU+PFZBTFVFPkE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Byb2plY3RfTWFjT1NYX2N1cnJlbnR2ZXJzaW9uPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X01hY09TWF9mbGF0X29sZGltcHZlcnNpb248L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Byb2plY3RfTWFjT1NYX0FkZHJNb2RlPC9OQU1FPjxWQUxVRT4xPC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiUFBDIFBFRiIgcGFuZWwgLS0+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQRUZfZXhwb3J0czwvTkFNRT48VkFMVUU+Tm9uZTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUEVGX2xpYmZvbGRlcjwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUEVGX3NvcnRjb2RlPC9OQU1FPjxWQUxVRT5Ob25lPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQRUZfZXhwYW5kYnNzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQRUZfc2hhcmVkYXRhPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQRUZfb2xkZGVmdmVyc2lvbjwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUEVGX29sZGltcHZlcnNpb248L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1BFRl9jdXJyZW50dmVyc2lvbjwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUEVGX2ZyYWdtZW50bmFtZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQRUZfY29sbGFwc2VyZWxvYWRzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiUFBDIFByb2plY3QiIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfdHlwZTwvTkFNRT48VkFMVUU+TGlicmFyeTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfb3V0ZmlsZTwvTkFNRT48VkFMVUU+RnJlZVR5cGVMaWI8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Byb2plY3RfUFBDX2ZpbGVjcmVhdG9yPC9OQU1FPjxWQUxVRT4/Pz8/PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X1BQQ19maWxldHlwZTwvTkFNRT48VkFMVUU+Pz8/PzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfc2l6ZTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfbWluc2l6ZTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfc3RhY2tzaXplPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X1BQQ19mbGFnczwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfc3ltZmlsZW5hbWU8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfcnNyY25hbWU8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfcnNyY2hlYWRlcjwvTkFNRT48VkFMVUU+TmF0aXZlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X1BQQ19yc3JjdHlwZTwvTkFNRT48VkFMVUU+Pz8/PzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfcnNyY2lkPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X1BQQ19yc3JjZmxhZ3M8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Byb2plY3RfUFBDX3JzcmNzdG9yZTwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfcnNyY21lcmdlPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X1BQQ19mbGF0cnNyYzwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUHJvamVjdF9QUENfZmxhdHJzcmNvdXRwdXRkaXI8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGg8L05BTUU+PFZBTFVFPjo8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aEZvcm1hdDwvTkFNRT48VkFMVUU+TWFjT1M8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aFJvb3Q8L05BTUU+PFZBTFVFPlByb2plY3Q8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdQcm9qZWN0X1BQQ19mbGF0cnNyY2ZpbGVuYW1lPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJQUENBc20gUGFuZWwiIHBhbmVsIC0tPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQXNzZW1ibGVyX1BQQ19hdXhoZWFkZXI8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Fzc2VtYmxlcl9QUENfc3ltbW9kZTwvTkFNRT48VkFMVUU+TWFjPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdBc3NlbWJsZXJfUFBDX2RpYWxlY3Q8L05BTUU+PFZBTFVFPlBQQzwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XQXNzZW1ibGVyX1BQQ19wcmVmaXhmaWxlPC9OQU1FPjxWQUxVRT48L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV0Fzc2VtYmxlcl9QUENfdHlwZWNoZWNrPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdBc3NlbWJsZXJfUFBDX3dhcm5pbmdzPC9OQU1FPjxWQUxVRT4wPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdBc3NlbWJsZXJfUFBDX2Nhc2VzZW5zaXRpdmU8L05BTUU+PFZBTFVFPjA8L1ZBTFVFPjwvU0VUVElORz4KLQotICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZ3MgZm9yICJQcm9wZXJ0eSBMaXN0IiBwYW5lbCAtLT4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QTGlzdF9PdXRwdXRUeXBlPC9OQU1FPjxWQUxVRT5GaWxlPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UExpc3RfT3V0cHV0RW5jb2Rpbmc8L05BTUU+PFZBTFVFPlVURi04PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UExpc3RfUExpc3RWZXJzaW9uPC9OQU1FPjxWQUxVRT4xLjA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5QTGlzdF9QcmVmaXg8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBMaXN0X0ZpbGVGaWxlbmFtZTwvTkFNRT48VkFMVUU+SW5mby5wbGlzdDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBMaXN0X0ZpbGVEaXJlY3Rvcnk8L05BTUU+Ci0gICAgICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBhdGg8L05BTUU+PFZBTFVFPjo8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aEZvcm1hdDwvTkFNRT48VkFMVUU+TWFjT1M8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UGF0aFJvb3Q8L05BTUU+PFZBTFVFPlByb2plY3Q8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UExpc3RfUmVzb3VyY2VUeXBlPC9OQU1FPjxWQUxVRT5wbHN0PC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+UExpc3RfUmVzb3VyY2VJRDwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPlBMaXN0X1Jlc291cmNlTmFtZTwvTkFNRT48VkFMVUU+PC9WQUxVRT48L1NFVFRJTkc+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmdzIGZvciAiUmV6IENvbXBpbGVyIiBwYW5lbCAtLT4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Jlel9MYW5ndWFnZV9tYXh3aWR0aDwvTkFNRT48VkFMVUU+ODA8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Jlel9MYW5ndWFnZV9zY3JpcHQ8L05BTUU+PFZBTFVFPlJvbWFuPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdSZXpfTGFuZ3VhZ2VfYWxpZ25tZW50PC9OQU1FPjxWQUxVRT5BbGlnbjE8L1ZBTFVFPjwvU0VUVElORz4KLSAgICAgICAgICAgICAgICA8U0VUVElORz48TkFNRT5NV1Jlel9MYW5ndWFnZV9maWx0ZXJtb2RlPC9OQU1FPjxWQUxVRT5GaWx0ZXJTa2lwPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICAgICAgPFNFVFRJTkc+PE5BTUU+TVdSZXpfTGFuZ3VhZ2Vfc3VwcHJlc3N3YXJuaW5nczwvTkFNRT48VkFMVUU+MDwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUmV6X0xhbmd1YWdlX2VzY2FwZWNvbnRyb2xjaGFyczwvTkFNRT48VkFMVUU+MTwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUmV6X0xhbmd1YWdlX3ByZWZpeG5hbWU8L05BTUU+PFZBTFVFPjwvVkFMVUU+PC9TRVRUSU5HPgotICAgICAgICAgICAgICAgIDxTRVRUSU5HPjxOQU1FPk1XUmV6X0xhbmd1YWdlX2ZpbHRlcmVkdHlwZXM8L05BTUU+PFZBTFVFPidDT0RFJyAnREFUQScgJ1BJQ1QnPC9WQUxVRT48L1NFVFRJTkc+Ci0gICAgICAgICAgICA8L1NFVFRJTkdMSVNUPgotICAgICAgICAgICAgPEZJTEVMSVNUPgotICAgICAgICAgICAgICAgIDxGSUxFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPmZ0c3lzdGVtLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgICAgICA8RklMRUtJTkQ+VGV4dDwvRklMRUtJTkQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFRkxBR1M+RGVidWc8L0ZJTEVGTEFHUz4KLSAgICAgICAgICAgICAgICA8L0ZJTEU+Ci0gICAgICAgICAgICAgICAgPEZJTEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+ZnRiYXNlLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgICAgICA8RklMRUtJTkQ+VGV4dDwvRklMRUtJTkQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFRkxBR1M+RGVidWc8L0ZJTEVGTEFHUz4KLSAgICAgICAgICAgICAgICA8L0ZJTEU+Ci0gICAgICAgICAgICAgICAgPEZJTEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+ZnRpbml0LmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgICAgICA8RklMRUtJTkQ+VGV4dDwvRklMRUtJTkQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFRkxBR1M+RGVidWc8L0ZJTEVGTEFHUz4KLSAgICAgICAgICAgICAgICA8L0ZJTEU+Ci0gICAgICAgICAgICAgICAgPEZJTEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+c2ZudC5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVLSU5EPlRleHQ8L0ZJTEVLSU5EPgotICAgICAgICAgICAgICAgICAgICA8RklMRUZMQUdTPkRlYnVnPC9GSUxFRkxBR1M+Ci0gICAgICAgICAgICAgICAgPC9GSUxFPgotICAgICAgICAgICAgICAgIDxGSUxFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPnBzbmFtZXMuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz5EZWJ1ZzwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgICAgICA8RklMRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5mdGRlYnVnLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgICAgICA8RklMRUtJTkQ+VGV4dDwvRklMRUtJTkQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFRkxBR1M+RGVidWc8L0ZJTEVGTEFHUz4KLSAgICAgICAgICAgICAgICA8L0ZJTEU+Ci0gICAgICAgICAgICAgICAgPEZJTEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+dHlwZTFjaWQuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz5EZWJ1ZzwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgICAgICA8RklMRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5jZmYuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz5EZWJ1ZzwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgICAgICA8RklMRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5zbW9vdGguYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz5EZWJ1ZzwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgICAgICA8RklMRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD53aW5mbnQuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz5EZWJ1ZzwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgICAgICA8RklMRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD50cnVldHlwZS5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVLSU5EPlRleHQ8L0ZJTEVLSU5EPgotICAgICAgICAgICAgICAgICAgICA8RklMRUZMQUdTPkRlYnVnPC9GSUxFRkxBR1M+Ci0gICAgICAgICAgICAgICAgPC9GSUxFPgotICAgICAgICAgICAgICAgIDxGSUxFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPmZ0bWFjLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgICAgICA8RklMRUtJTkQ+VGV4dDwvRklMRUtJTkQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFRkxBR1M+RGVidWc8L0ZJTEVGTEFHUz4KLSAgICAgICAgICAgICAgICA8L0ZJTEU+Ci0gICAgICAgICAgICAgICAgPEZJTEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+cHNhdXguYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz48L0ZJTEVGTEFHUz4KLSAgICAgICAgICAgICAgICA8L0ZJTEU+Ci0gICAgICAgICAgICAgICAgPEZJTEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+ZnRjYWNoZS5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVLSU5EPlRleHQ8L0ZJTEVLSU5EPgotICAgICAgICAgICAgICAgICAgICA8RklMRUZMQUdTPjwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgICAgICA8RklMRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5mdGdseXBoLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgICAgICA8RklMRUtJTkQ+VGV4dDwvRklMRUtJTkQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFRkxBR1M+PC9GSUxFRkxBR1M+Ci0gICAgICAgICAgICAgICAgPC9GSUxFPgotICAgICAgICAgICAgICAgIDxGSUxFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPnR5cGUxLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgICAgICA8RklMRUtJTkQ+VGV4dDwvRklMRUtJTkQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFRkxBR1M+RGVidWc8L0ZJTEVGTEFHUz4KLSAgICAgICAgICAgICAgICA8L0ZJTEU+Ci0gICAgICAgICAgICAgICAgPEZJTEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+cHNoaW50ZXIuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz5EZWJ1ZzwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgICAgICA8RklMRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5wY2YuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz5EZWJ1ZzwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgICAgICA8RklMRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5mdHJhc3Rlci5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVLSU5EPlRleHQ8L0ZJTEVLSU5EPgotICAgICAgICAgICAgICAgICAgICA8RklMRUZMQUdTPkRlYnVnPC9GSUxFRkxBR1M+Ci0gICAgICAgICAgICAgICAgPC9GSUxFPgotICAgICAgICAgICAgICAgIDxGSUxFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPmZ0cmVuZDEuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgICAgIDxGSUxFS0lORD5UZXh0PC9GSUxFS0lORD4KLSAgICAgICAgICAgICAgICAgICAgPEZJTEVGTEFHUz5EZWJ1ZzwvRklMRUZMQUdTPgotICAgICAgICAgICAgICAgIDwvRklMRT4KLSAgICAgICAgICAgIDwvRklMRUxJU1Q+Ci0gICAgICAgICAgICA8TElOS09SREVSPgotICAgICAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPmZ0c3lzdGVtLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5mdGJhc2UuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPmZ0aW5pdC5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+c2ZudC5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+cHNuYW1lcy5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+ZnRkZWJ1Zy5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+dHlwZTFjaWQuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPmNmZi5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+c21vb3RoLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD53aW5mbnQuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPnRydWV0eXBlLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5mdG1hYy5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+cHNhdXguYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPmZ0Y2FjaGUuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPmZ0Z2x5cGguYzwvUEFUSD4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIPnR5cGUxLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5wc2hpbnRlci5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+cGNmLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgICAgICA8UEFUSD5mdHJhc3Rlci5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICAgICAgPFBBVEg+ZnRyZW5kMS5jPC9QQVRIPgotICAgICAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICA8L0xJTktPUkRFUj4KLSAgICAgICAgPC9UQVJHRVQ+Ci0gICAgPC9UQVJHRVRMSVNUPgotCi0gICAgPFRBUkdFVE9SREVSPgotICAgICAgICA8T1JERVJFRFRBUkdFVD48TkFNRT5GcmVlVHlwZUxpYjwvTkFNRT48L09SREVSRURUQVJHRVQ+Ci0gICAgPC9UQVJHRVRPUkRFUj4KLQotICAgIDxHUk9VUExJU1Q+Ci0gICAgICAgIDxHUk9VUD48TkFNRT5iYXNlPC9OQU1FPgotICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPFRBUkdFVE5BTUU+RnJlZVR5cGVMaWI8L1RBUkdFVE5BTUU+Ci0gICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgIDxQQVRIPmZ0YmFzZS5jPC9QQVRIPgotICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPFRBUkdFVE5BTUU+RnJlZVR5cGVMaWI8L1RBUkdFVE5BTUU+Ci0gICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgIDxQQVRIPmZ0ZGVidWcuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgIDxUQVJHRVROQU1FPkZyZWVUeXBlTGliPC9UQVJHRVROQU1FPgotICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICA8UEFUSD5mdGdseXBoLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICA8VEFSR0VUTkFNRT5GcmVlVHlwZUxpYjwvVEFSR0VUTkFNRT4KLSAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgPFBBVEg+ZnRpbml0LmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICA8VEFSR0VUTkFNRT5GcmVlVHlwZUxpYjwvVEFSR0VUTkFNRT4KLSAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgPFBBVEg+ZnRzeXN0ZW0uYzwvUEFUSD4KLSAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgIDxUQVJHRVROQU1FPkZyZWVUeXBlTGliPC9UQVJHRVROQU1FPgotICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICA8UEFUSD5mdG1hYy5jPC9QQVRIPgotICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICA8L0dST1VQPgotICAgICAgICA8R1JPVVA+PE5BTUU+ZnRtb2R1bGVzPC9OQU1FPgotICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPFRBUkdFVE5BTUU+RnJlZVR5cGVMaWI8L1RBUkdFVE5BTUU+Ci0gICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgIDxQQVRIPmNmZi5jPC9QQVRIPgotICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPFRBUkdFVE5BTUU+RnJlZVR5cGVMaWI8L1RBUkdFVE5BTUU+Ci0gICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgIDxQQVRIPmZ0Y2FjaGUuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgIDxUQVJHRVROQU1FPkZyZWVUeXBlTGliPC9UQVJHRVROQU1FPgotICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICA8UEFUSD5wc2F1eC5jPC9QQVRIPgotICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPFRBUkdFVE5BTUU+RnJlZVR5cGVMaWI8L1RBUkdFVE5BTUU+Ci0gICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgIDxQQVRIPnBzbmFtZXMuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgIDxUQVJHRVROQU1FPkZyZWVUeXBlTGliPC9UQVJHRVROQU1FPgotICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICA8UEFUSD5zZm50LmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICA8VEFSR0VUTkFNRT5GcmVlVHlwZUxpYjwvVEFSR0VUTkFNRT4KLSAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgPFBBVEg+c21vb3RoLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICA8VEFSR0VUTkFNRT5GcmVlVHlwZUxpYjwvVEFSR0VUTkFNRT4KLSAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgPFBBVEg+dHJ1ZXR5cGUuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgIDxUQVJHRVROQU1FPkZyZWVUeXBlTGliPC9UQVJHRVROQU1FPgotICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICA8UEFUSD50eXBlMWNpZC5jPC9QQVRIPgotICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPFRBUkdFVE5BTUU+RnJlZVR5cGVMaWI8L1RBUkdFVE5BTUU+Ci0gICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgIDxQQVRIPndpbmZudC5jPC9QQVRIPgotICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPFRBUkdFVE5BTUU+RnJlZVR5cGVMaWI8L1RBUkdFVE5BTUU+Ci0gICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgIDxQQVRIPnR5cGUxLmM8L1BBVEg+Ci0gICAgICAgICAgICAgICAgPFBBVEhGT1JNQVQ+TWFjT1M8L1BBVEhGT1JNQVQ+Ci0gICAgICAgICAgICA8L0ZJTEVSRUY+Ci0gICAgICAgICAgICA8RklMRVJFRj4KLSAgICAgICAgICAgICAgICA8VEFSR0VUTkFNRT5GcmVlVHlwZUxpYjwvVEFSR0VUTkFNRT4KLSAgICAgICAgICAgICAgICA8UEFUSFRZUEU+TmFtZTwvUEFUSFRZUEU+Ci0gICAgICAgICAgICAgICAgPFBBVEg+cHNoaW50ZXIuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgIDxUQVJHRVROQU1FPkZyZWVUeXBlTGliPC9UQVJHRVROQU1FPgotICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICA8UEFUSD5wY2YuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgICAgIDxGSUxFUkVGPgotICAgICAgICAgICAgICAgIDxUQVJHRVROQU1FPkZyZWVUeXBlTGliPC9UQVJHRVROQU1FPgotICAgICAgICAgICAgICAgIDxQQVRIVFlQRT5OYW1lPC9QQVRIVFlQRT4KLSAgICAgICAgICAgICAgICA8UEFUSD5mdHJhc3Rlci5jPC9QQVRIPgotICAgICAgICAgICAgICAgIDxQQVRIRk9STUFUPk1hY09TPC9QQVRIRk9STUFUPgotICAgICAgICAgICAgPC9GSUxFUkVGPgotICAgICAgICAgICAgPEZJTEVSRUY+Ci0gICAgICAgICAgICAgICAgPFRBUkdFVE5BTUU+RnJlZVR5cGVMaWI8L1RBUkdFVE5BTUU+Ci0gICAgICAgICAgICAgICAgPFBBVEhUWVBFPk5hbWU8L1BBVEhUWVBFPgotICAgICAgICAgICAgICAgIDxQQVRIPmZ0cmVuZDEuYzwvUEFUSD4KLSAgICAgICAgICAgICAgICA8UEFUSEZPUk1BVD5NYWNPUzwvUEFUSEZPUk1BVD4KLSAgICAgICAgICAgIDwvRklMRVJFRj4KLSAgICAgICAgPC9HUk9VUD4KLSAgICA8L0dST1VQTElTVD4KLQotPC9QUk9KRUNUPgpkaWZmIC0tZ2l0IGEvYnVpbGRzL21hYy9mdG1hYy5jIGIvYnVpbGRzL21hYy9mdG1hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNmNzNlLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy9tYWMvZnRtYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtYWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE1hYyBGT05EIHN1cHBvcnQuICBXcml0dGVuIGJ5IGp1c3RAbGV0dGVycm9yLmNvbS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgSGVhdmlseSBGaXhlZCBieSBtcHN1enVraSwgR2VvcmdlIFdpbGxpYW1zIGFuZCBTZWFuIE1jQnJpZGUgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSnVzdCB2YW4gUm9zc3VtLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgIE5vdGVzCi0KLSAgICBNYWMgc3VpdGNhc2UgZmlsZXMgY2FuIChhbmQgb2Z0ZW4gZG8hKSBjb250YWluIG11bHRpcGxlIGZvbnRzLiAgVG8KLSAgICBzdXBwb3J0IHRoaXMgSSB1c2UgdGhlIGZhY2VfaW5kZXggYXJndW1lbnQgb2YgRlRfKE9wZW58TmV3KV9GYWNlKCkKLSAgICBmdW5jdGlvbnMsIGFuZCBwcmV0ZW5kIHRoZSBzdWl0Y2FzZSBmaWxlIGlzIGEgY29sbGVjdGlvbi4KLQotICAgIFdhcm5pbmc6IGZiaXQgYW5kIE5GTlQgYml0bWFwIHJlc291cmNlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuICBJbiBvbGQKLSAgICBzZm50IGZvbnRzLCBiaXRtYXAgZ2x5cGggZGF0YSBmb3IgZWFjaCBzaXplIGlzIHN0b3JlZCBpbiBlYWNoIGBORk5UJwotICAgIHJlc291cmNlcyBpbnN0ZWFkIG9mIHRoZSBgYmRhdCcgdGFibGUgaW4gdGhlIHNmbnQgcmVzb3VyY2UuICBUaGVyZWZvcmUsCi0gICAgZmFjZS0+bnVtX2ZpeGVkX3NpemVzIGlzIHNldCB0byAwLCBiZWNhdXNlIGJpdG1hcCBkYXRhIGluIGBORk5UJwotICAgIHJlc291cmNlIGlzIHVuYXZhaWxhYmxlIGF0IHByZXNlbnQuCi0KLSAgICBUaGUgTWFjIEZPTkQgc3VwcG9ydCB3b3JrcyByb3VnaGx5IGxpa2UgdGhpczoKLQotICAgIC0gQ2hlY2sgd2hldGhlciB0aGUgb2ZmZXJlZCBzdHJlYW0gcG9pbnRzIHRvIGEgTWFjIHN1aXRjYXNlIGZpbGUuICBUaGlzCi0gICAgICBpcyBkb25lIGJ5IGNoZWNraW5nIHRoZSBmaWxlIHR5cGU6IGl0IGhhcyB0byBiZSAnRkZJTCcgb3IgJ3RmaWwnLiAgVGhlCi0gICAgICBzdHJlYW0gdGhhdCBnZXRzIHBhc3NlZCB0byBvdXIgaW5pdF9mYWNlKCkgcm91dGluZSBpcyBhIHN0ZGlvIHN0cmVhbSwKLSAgICAgIHdoaWNoIGlzbid0IHVzYWJsZSBmb3IgdXMsIHNpbmNlIHRoZSBGT05EIHJlc291cmNlcyBsaXZlIGluIHRoZQotICAgICAgcmVzb3VyY2UgZm9yay4gIFNvIHdlIGp1c3QgZ3JhYiB0aGUgc3RyZWFtLT5wYXRobmFtZSBmaWVsZC4KLQotICAgIC0gUmVhZCB0aGUgRk9ORCByZXNvdXJjZSBpbnRvIG1lbW9yeSwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEKLSAgICAgIFRydWVUeXBlIGZvbnQgYW5kL29yKCEpIGEgVHlwZSAxIGZvbnQgYXZhaWxhYmxlLgotCi0gICAgLSBJZiB0aGVyZSBpcyBhIFR5cGUgMSBmb250IGF2YWlsYWJsZSAoYXMgYSBzZXBhcmF0ZSBgTFdGTicgZmlsZSksIHJlYWQKLSAgICAgIGl0cyBkYXRhIGludG8gbWVtb3J5LCBtYXNzYWdlIGl0IHNsaWdodGx5IHNvIGl0IGJlY29tZXMgUEZCIGRhdGEsIHdyYXAKLSAgICAgIGl0IGludG8gYSBtZW1vcnkgc3RyZWFtLCBsb2FkIHRoZSBUeXBlIDEgZHJpdmVyIGFuZCBkZWxlZ2F0ZSB0aGUgcmVzdAotICAgICAgb2YgdGhlIHdvcmsgdG8gaXQgYnkgY2FsbGluZyBGVF9PcGVuX0ZhY2UoKS4gIChYWFggVE9ETzogYWZ0ZXIgdGhpcwotICAgICAgaGFzIGJlZW4gZG9uZSwgdGhlIGtlcm5pbmcgZGF0YSBmcm9tIHRoZSBGT05EIHJlc291cmNlIHNob3VsZCBiZQotICAgICAgYXBwZW5kZWQgdG8gdGhlIGZhY2U6IE9uIHRoZSBNYWMgdGhlcmUgYXJlIHVzdWFsbHkgbm8gQUZNIGZpbGVzCi0gICAgICBhdmFpbGFibGUuICBIb3dldmVyLCB0aGlzIGlzIHRyaWNreSBzaW5jZSB3ZSBuZWVkIHRvIG1hcCBNYWMgY2hhcgotICAgICAgY29kZXMgdG8gcHMgZ2x5cGggbmFtZXMgdG8gZ2x5cGggSUQncy4uLikKLQotICAgIC0gSWYgdGhlcmUgaXMgYSBUcnVlVHlwZSBmb250IChhbiBgc2ZudCcgcmVzb3VyY2UpLCByZWFkIGl0IGludG8gbWVtb3J5LAotICAgICAgd3JhcCBpdCBpbnRvIGEgbWVtb3J5IHN0cmVhbSwgbG9hZCB0aGUgVHJ1ZVR5cGUgZHJpdmVyIGFuZCBkZWxlZ2F0ZQotICAgICAgdGhlIHJlc3Qgb2YgdGhlIHdvcmsgdG8gaXQsIGJ5IGNhbGxpbmcgRlRfT3Blbl9GYWNlKCkuCi0KLSAgICAtIFNvbWUgc3VpdGNhc2UgZm9udHMgKG5vdGFibHkgT255eCkgbWlnaHQgcG9pbnQgdGhlIGBMV0ZOJyBmaWxlIHRvCi0gICAgICBpdHNlbGYsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgY29udGFpbnMgYFBPU1QnIHJlc291cmNlcy4gIFRvIGhhbmRsZQotICAgICAgdGhpcyBzcGVjaWFsIGNhc2Ugd2l0aG91dCBvcGVuaW5nIHRoZSBmaWxlIGFuIGV4dHJhIHRpbWUsIHdlIGp1c3QKLSAgICAgIGlnbm9yZSBlcnJvcnMgZnJvbSB0aGUgYExXRk4nIGFuZCBmYWxsYmFjayB0byB0aGUgYHNmbnQnIGlmIGJvdGggYXJlCi0gICAgICBhdmFpbGFibGUuCi0gICovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSAiZnRiYXNlLmgiCi0KLSNpZiBkZWZpbmVkKCBfX0dOVUNfXyApIHx8IGRlZmluZWQoIF9fSUJNQ19fICkKLSAgLyogVGhpcyBpcyBmb3IgTWFjIE9TIFguICBXaXRob3V0IHJlZGVmaW5pdGlvbiwgT1NfSU5MSU5FICovCi0gIC8qIGV4cGFuZHMgdG8gYHN0YXRpYyBpbmxpbmUnIHdoaWNoIGRvZXNuJ3Qgc3Vydml2ZSB0aGUgICAqLwotICAvKiAtYW5zaSBjb21waWxhdGlvbiBmbGFnIG9mIEdDQy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAhSEFWRV9BTlNJX09TX0lOTElORQotI3VuZGVmICBPU19JTkxJTkUKLSNkZWZpbmUgT1NfSU5MSU5FICAgc3RhdGljIF9faW5saW5lX18KLSNlbmRpZgotI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+IC8qIFBBVEhfTUFYICovCi0jZWxzZQotI2luY2x1ZGUgPFJlc291cmNlcy5oPgotI2luY2x1ZGUgPEZvbnRzLmg+Ci0jaW5jbHVkZSA8RW5kaWFuLmg+Ci0jaW5jbHVkZSA8RXJyb3JzLmg+Ci0jaW5jbHVkZSA8RmlsZXMuaD4KLSNpbmNsdWRlIDxUZXh0VXRpbHMuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFBBVEhfTUFYCi0jZGVmaW5lIFBBVEhfTUFYIDEwMjQgLyogc2FtZSB3aXRoIE1hYyBPUyBYJ3Mgc3lzbGltaXRzLmggKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCggX19NV0VSS1NfXyApICYmICFUQVJHRVRfUlRfTUFDX01BQ0hPCi0jaW5jbHVkZSA8RlNwX2ZvcGVuLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURQotCi0jaW5jbHVkZSBGVF9NQUNfSAotCi0gIC8qIHVuZGVmaW5lIGJsb2NraW5nLW1hY3JvcyBpbiBmdG1hYy5oICovCi0jdW5kZWYgRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lCi0jdW5kZWYgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZQotI3VuZGVmIEZUX05ld19GYWNlX0Zyb21fRk9ORAotI3VuZGVmIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjCi0jdW5kZWYgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZgotCi0KLSAgLyogRlNTcGVjIGZ1bmN0aW9ucyBhcmUgZGVwcmVjYXRlZCBzaW5jZSBNYWMgT1MgWCAxMC40ICovCi0jaWZuZGVmIEhBVkVfRlNTUEVDCi0jaWYgVEFSR0VUX0FQSV9NQUNfT1M4IHx8IFRBUkdFVF9BUElfTUFDX0NBUkJPTgotI2RlZmluZSBIQVZFX0ZTU1BFQyAgMQotI2Vsc2UKLSNkZWZpbmUgSEFWRV9GU1NQRUMgIDAKLSNlbmRpZgotI2VuZGlmCi0KLSAgLyogbW9zdCBGU1JlZiBmdW5jdGlvbnMgd2VyZSBpbnRyb2R1Y2VkIHNpbmNlIE1hYyBPUyA5ICovCi0jaWZuZGVmIEhBVkVfRlNSRUYKLSNpZiBUQVJHRVRfQVBJX01BQ19PU1gKLSNkZWZpbmUgSEFWRV9GU1JFRiAgMQotI2Vsc2UKLSNkZWZpbmUgSEFWRV9GU1JFRiAgMAotI2VuZGlmCi0jZW5kaWYKLQotICAvKiBRdWlja0RyYXcgaXMgZGVwcmVjYXRlZCBzaW5jZSBNYWMgT1MgWCAxMC40ICovCi0jaWZuZGVmIEhBVkVfUVVJQ0tEUkFXX0NBUkJPTgotI2lmIFRBUkdFVF9BUElfTUFDX09TOCB8fCBUQVJHRVRfQVBJX01BQ19DQVJCT04KLSNkZWZpbmUgSEFWRV9RVUlDS0RSQVdfQ0FSQk9OICAxCi0jZWxzZQotI2RlZmluZSBIQVZFX1FVSUNLRFJBV19DQVJCT04gIDAKLSNlbmRpZgotI2VuZGlmCi0KLSAgLyogQXBwbGVUeXBlU2VydmljZSBpcyBhdmFpbGFibGUgc2luY2UgTWFjIE9TIFggKi8KLSNpZm5kZWYgSEFWRV9BVFMKLSNpZiBUQVJHRVRfQVBJX01BQ19PU1gKLSNkZWZpbmUgSEFWRV9BVFMgIDEKLSNpZm5kZWYga0FUU09wdGlvbkZsYWdzVW5SZXN0cmljdGVkU2NvcGUgLyogc2luY2UgTWFjIE9TIFggMTAuMSAqLwotI2RlZmluZSBrQVRTT3B0aW9uRmxhZ3NVblJlc3RyaWN0ZWRTY29wZSBrQVRTT3B0aW9uRmxhZ3NEZWZhdWx0Ci0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIEhBVkVfQVRTICAwCi0jZW5kaWYKLSNlbmRpZgotCi0gIC8qIGBjb25maWd1cmUnIGNoZWNrcyB0aGUgYXZhaWxhYmlsaXR5IG9mIGBSZXNvdXJjZUluZGV4JyBzdHJpY3RseSAqLwotICAvKiBhbmQgc2V0cyBIQVZFX1RZUEVfUkVTT1VSQ0VfSU5ERVggdG8gMSBvciAwIGFsd2F5cy4gIElmIGl0IGlzICAgKi8KLSAgLyogbm90IHNldCAoZS5nLiwgYSBidWlsZCB3aXRob3V0IGBjb25maWd1cmUnKSwgdGhlIGF2YWlsYWJpbGl0eSAgICovCi0gIC8qIGlzIGd1ZXNzZWQgZnJvbSB0aGUgU0RLIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBIQVZFX1RZUEVfUkVTT1VSQ0VfSU5ERVgKLSNpZiAhZGVmaW5lZCggTUFDX09TX1hfVkVSU0lPTl8xMF81ICkgfHwgXAotICAgICggTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IE1BQ19PU19YX1ZFUlNJT05fMTBfNSApCi0jZGVmaW5lIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCAwCi0jZWxzZQotI2RlZmluZSBIQVZFX1RZUEVfUkVTT1VSQ0VfSU5ERVggMQotI2VuZGlmCi0jZW5kaWYgLyogIUhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCAqLwotCi0jaWYgKCBIQVZFX1RZUEVfUkVTT1VSQ0VfSU5ERVggPT0gMCApCi10eXBlZGVmIHNob3J0IFJlc291cmNlSW5kZXg7Ci0jZW5kaWYKLQotICAvKiBTZXQgUFJFRkVSX0xXRk4gdG8gMSBpZiBMV0ZOIChUeXBlIDEpIGlzIHByZWZlcnJlZCBvdmVyCi0gICAgIFRydWVUeXBlIGluIGNhc2UgKmJvdGgqIGFyZSBhdmFpbGFibGUgKHRoaXMgaXMgbm90IGNvbW1vbiwKLSAgICAgYnV0IGl0ICppcyogcG9zc2libGUpLiAqLwotI2lmbmRlZiBQUkVGRVJfTFdGTgotI2RlZmluZSBQUkVGRVJfTFdGTiAgMQotI2VuZGlmCi0KLSNpZmRlZiBGVF9NQUNJTlRPU0gKLQotI2lmICFIQVZFX1FVSUNLRFJBV19DQVJCT04gIC8qIFF1aWNrRHJhdyBpcyBkZXByZWNhdGVkIHNpbmNlIE1hYyBPUyBYIDEwLjQgKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZvbnROYW1lICk7Ci0gICAgRlRfVU5VU0VEKCBwYXRoU3BlYyApOwotICAgIEZUX1VOVVNFRCggZmFjZV9pbmRleCApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgfQotCi0jZWxzZQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjKiAgICAgIHBhdGhTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKLSAgewotICAgIE9wdGlvbkJpdHMgICAgICAgICAgICBvcHRpb25zID0ga0ZNVXNlR2xvYmFsU2NvcGVPcHRpb247Ci0KLSAgICBGTUZvbnRGYW1pbHlJdGVyYXRvciAgZmFtSXRlcjsKLSAgICBPU1N0YXR1cyAgICAgICAgICAgICAgc3RhdHVzID0gRk1DcmVhdGVGb250RmFtaWx5SXRlcmF0b3IoIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhbUl0ZXIgKTsKLSAgICBGTUZvbnQgICAgICAgICAgICAgICAgdGhlX2ZvbnQgPSAwOwotICAgIEZNRm9udEZhbWlseSAgICAgICAgICBmYW1pbHkgICA9IDA7Ci0KLQotICAgIGlmICggIWZvbnROYW1lIHx8ICFmYWNlX2luZGV4ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgKmZhY2VfaW5kZXggPSAwOwotICAgIHdoaWxlICggc3RhdHVzID09IDAgJiYgIXRoZV9mb250ICkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBGTUdldE5leHRGb250RmFtaWx5KCAmZmFtSXRlciwgJmZhbWlseSApOwotICAgICAgaWYgKCBzdGF0dXMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQyOwotICAgICAgICBGTUZvbnRGYW1pbHlJbnN0YW5jZUl0ZXJhdG9yICBpbnN0SXRlcjsKLSAgICAgICAgU3RyMjU1ICAgICAgICAgICAgICAgICAgICAgICAgZmFtTmFtZVN0cjsKLSAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtTmFtZVsyNTZdOwotCi0KLSAgICAgICAgLyogZ2V0IHRoZSBmYW1pbHkgbmFtZSAqLwotICAgICAgICBGTUdldEZvbnRGYW1pbHlOYW1lKCBmYW1pbHksIGZhbU5hbWVTdHIgKTsKLSAgICAgICAgQ29weVBhc2NhbFN0cmluZ1RvQyggZmFtTmFtZVN0ciwgZmFtTmFtZSApOwotCi0gICAgICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc3R5bGVzICovCi0gICAgICAgIEZNQ3JlYXRlRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3IoIGZhbWlseSwgJmluc3RJdGVyICk7Ci0KLSAgICAgICAgKmZhY2VfaW5kZXggPSAwOwotICAgICAgICBzdGF0MiAgICAgICA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKCBzdGF0MiA9PSAwICYmICF0aGVfZm9udCApCi0gICAgICAgIHsKLSAgICAgICAgICBGTUZvbnRTdHlsZSAgc3R5bGU7Ci0gICAgICAgICAgRk1Gb250U2l6ZSAgIHNpemU7Ci0gICAgICAgICAgRk1Gb250ICAgICAgIGZvbnQ7Ci0KLQotICAgICAgICAgIHN0YXQyID0gRk1HZXROZXh0Rm9udEZhbWlseUluc3RhbmNlKCAmaW5zdEl0ZXIsICZmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsICZzaXplICk7Ci0gICAgICAgICAgaWYgKCBzdGF0MiA9PSAwICYmIHNpemUgPT0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhciAgZnVsbE5hbWVbMjU2XTsKLQotCi0gICAgICAgICAgICAvKiBidWlsZCB1cCBhIGNvbXBsZXRlIGZhY2UgbmFtZSAqLwotICAgICAgICAgICAgZnRfc3RyY3B5KCBmdWxsTmFtZSwgZmFtTmFtZSApOwotICAgICAgICAgICAgaWYgKCBzdHlsZSAmIGJvbGQgKQotICAgICAgICAgICAgICBmdF9zdHJjYXQoIGZ1bGxOYW1lLCAiIEJvbGQiICk7Ci0gICAgICAgICAgICBpZiAoIHN0eWxlICYgaXRhbGljICkKLSAgICAgICAgICAgICAgZnRfc3RyY2F0KCBmdWxsTmFtZSwgIiBJdGFsaWMiICk7Ci0KLSAgICAgICAgICAgIC8qIGNvbXBhcmUgd2l0aCB0aGUgbmFtZSB3ZSBhcmUgbG9va2luZyBmb3IgKi8KLSAgICAgICAgICAgIGlmICggZnRfc3RyY21wKCBmdWxsTmFtZSwgZm9udE5hbWUgKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogZm91bmQgaXQhICovCi0gICAgICAgICAgICAgIHRoZV9mb250ID0gZm9udDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgKysoKmZhY2VfaW5kZXgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEZNRGlzcG9zZUZvbnRGYW1pbHlJbnN0YW5jZUl0ZXJhdG9yKCAmaW5zdEl0ZXIgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGTURpc3Bvc2VGb250RmFtaWx5SXRlcmF0b3IoICZmYW1JdGVyICk7Ci0KLSAgICBpZiAoIHRoZV9mb250ICkKLSAgICB7Ci0gICAgICBGTUdldEZvbnRDb250YWluZXIoIHRoZV9mb250LCBwYXRoU3BlYyApOwotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gIH0KLQotI2VuZGlmIC8qIEhBVkVfUVVJQ0tEUkFXX0NBUkJPTiAqLwotCi0KLSNpZiBIQVZFX0FUUwotCi0gIC8qIFByaXZhdGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgRlNTcGVjIHR5cGUgaGFzIGJlZW4gZGlzY291cmFnZWQgZm9yIGEgbG9uZyB0aW1lLCAgICAgKi8KLSAgLyogdW5mb3J0dW5hdGVseSBhbiBGU1JlZiByZXBsYWNlbWVudCBBUEkgZm9yICAgICAgICAgICAgICAgICovCi0gIC8qIEFUU0ZvbnRHZXRGaWxlU3BlY2lmaWNhdGlvbigpIGlzIG9ubHkgYXZhaWxhYmxlIGluICAgICAgICAqLwotICAvKiBNYWMgT1MgWCAxMC41IGFuZCBsYXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIE9TU3RhdHVzCi0gIEZUX0FUU0ZvbnRHZXRGaWxlUmVmZXJlbmNlKCBBVFNGb250UmVmICBhdHNfZm9udF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmKiAgICAgIGF0c19mb250X3JlZiApCi0gIHsKLSAgICBPU1N0YXR1cyAgZXJyOwotCi0jaWYgIWRlZmluZWQoIE1BQ19PU19YX1ZFUlNJT05fMTBfNSApIHx8IFwKLSAgICBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IE1BQ19PU19YX1ZFUlNJT05fMTBfNQotICAgIEZTU3BlYyAgICBzcGVjOwotCi0KLSAgICBlcnIgPSBBVFNGb250R2V0RmlsZVNwZWNpZmljYXRpb24oIGF0c19mb250X2lkLCAmc3BlYyApOwotICAgIGlmICggbm9FcnIgPT0gZXJyICkKLSAgICAgIGVyciA9IEZTcE1ha2VGU1JlZiggJnNwZWMsIGF0c19mb250X3JlZiApOwotI2Vsc2UKLSAgICBlcnIgPSBBVFNGb250R2V0RmlsZVJlZmVyZW5jZSggYXRzX2ZvbnRfaWQsIGF0c19mb250X3JlZiApOwotI2VuZGlmCi0KLSAgICByZXR1cm4gZXJyOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgRlRfR2V0RmlsZVJlZl9Gcm9tX01hY19BVFNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZiogICAgICAgYXRzX2ZvbnRfcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gIHsKLSAgICBDRlN0cmluZ1JlZiAgY2ZfZm9udE5hbWU7Ci0gICAgQVRTRm9udFJlZiAgIGF0c19mb250X2lkOwotCi0KLSAgICAqZmFjZV9pbmRleCA9IDA7Ci0KLSAgICBjZl9mb250TmFtZSA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoIE5VTEwsIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbiApOwotICAgIGF0c19mb250X2lkID0gQVRTRm9udEZpbmRGcm9tTmFtZSggY2ZfZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQVRTT3B0aW9uRmxhZ3NVblJlc3RyaWN0ZWRTY29wZSApOwotICAgIENGUmVsZWFzZSggY2ZfZm9udE5hbWUgKTsKLQotICAgIGlmICggYXRzX2ZvbnRfaWQgPT0gMCB8fCBhdHNfZm9udF9pZCA9PSAweEZGRkZGRkZGVUwgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZUX0FUU0ZvbnRHZXRGaWxlUmVmZXJlbmNlKCBhdHNfZm9udF9pZCwgYXRzX2ZvbnRfcmVmICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAvKiBmYWNlX2luZGV4IGNhbGN1bGF0aW9uIGJ5IHNlYXJjaGluZyBwcmVjZWRpbmcgZm9udElEcyAqLwotICAgIC8qIHdpdGggc2FtZSBGU1JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgQVRTRm9udFJlZiAgaWQyID0gYXRzX2ZvbnRfaWQgLSAxOwotICAgICAgRlNSZWYgICAgICAgcmVmMjsKLQotCi0gICAgICB3aGlsZSAoIGlkMiA+IDAgKQotICAgICAgewotICAgICAgICBpZiAoIG5vRXJyICE9IEZUX0FUU0ZvbnRHZXRGaWxlUmVmZXJlbmNlKCBpZDIsICZyZWYyICkgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoIG5vRXJyICE9IEZTQ29tcGFyZUZTUmVmcyggYXRzX2ZvbnRfcmVmLCAmcmVmMiApICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZDItLTsKLSAgICAgIH0KLSAgICAgICpmYWNlX2luZGV4ID0gYXRzX2ZvbnRfaWQgLSAoIGlkMiArIDEgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbmRpZgotCi0jaWYgIUhBVkVfQVRTCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlUGF0aF9Gcm9tX01hY19BVFNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDgqICAgICAgIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgbWF4UGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZvbnROYW1lICk7Ci0gICAgRlRfVU5VU0VEKCBwYXRoICk7Ci0gICAgRlRfVU5VU0VEKCBtYXhQYXRoU2l6ZSApOwotICAgIEZUX1VOVVNFRCggZmFjZV9pbmRleCApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgfQotCi0jZWxzZQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0RmlsZVBhdGhfRnJvbV9NYWNfQVRTX05hbWUoIGNvbnN0IGNoYXIqICBmb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQ4KiAgICAgICBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgIG1heFBhdGhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgRlNSZWYgICAgIHJlZjsKLSAgICBGVF9FcnJvciAgZXJyOwotCi0KLSAgICBlcnIgPSBGVF9HZXRGaWxlUmVmX0Zyb21fTWFjX0FUU19OYW1lKCBmb250TmFtZSwgJnJlZiwgZmFjZV9pbmRleCApOwotICAgIGlmICggZXJyICkKLSAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTUmVmTWFrZVBhdGgoICZyZWYsIHBhdGgsIG1heFBhdGhTaXplICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbmRpZiAvKiBIQVZFX0FUUyAqLwotCi0KLSNpZiAhSEFWRV9GU1NQRUMgfHwgIUhBVkVfQVRTCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgRlRfVU5VU0VEKCBmb250TmFtZSApOwotICAgIEZUX1VOVVNFRCggcGF0aFNwZWMgKTsKLSAgICBGVF9VTlVTRUQoIGZhY2VfaW5kZXggKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gIH0KLQotI2Vsc2UKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBGU1NwZWMgaXMgZGVwcmVjYXRlZCBpbiBNYWMgT1MgWC4gKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgRlNSZWYgICAgIHJlZjsKLSAgICBGVF9FcnJvciAgZXJyOwotCi0KLSAgICBlcnIgPSBGVF9HZXRGaWxlUmVmX0Zyb21fTWFjX0FUU19OYW1lKCBmb250TmFtZSwgJnJlZiwgZmFjZV9pbmRleCApOwotICAgIGlmICggZXJyICkKLSAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTR2V0Q2F0YWxvZ0luZm8oICZyZWYsIGtGU0NhdEluZm9Ob25lLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFNwZWMsIE5VTEwgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQoIF9fTVdFUktTX18gKSAmJiAhVEFSR0VUX1JUX01BQ19NQUNITwotCi0jZGVmaW5lIFNUUkVBTV9GSUxFKCBzdHJlYW0gKSAgKCAoRlRfRklMRSopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgKQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfRlNwX3N0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgZnRfZmNsb3NlKCBTVFJFQU1fRklMRSggc3RyZWFtICkgKTsKLQotICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gTlVMTDsKLSAgICBzdHJlYW0tPnNpemUgICAgICAgICAgICAgICA9IDA7Ci0gICAgc3RyZWFtLT5iYXNlICAgICAgICAgICAgICAgPSAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHVuc2lnbmVkIGxvbmcgKQotICBmdF9GU3Bfc3RyZWFtX2lvKCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKQotICB7Ci0gICAgRlRfRklMRSogIGZpbGU7Ci0KLQotICAgIGZpbGUgPSBTVFJFQU1fRklMRSggc3RyZWFtICk7Ci0KLSAgICBmdF9mc2VlayggZmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCApOwotCi0gICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKWZ0X2ZyZWFkKCBidWZmZXIsIDEsIGNvdW50LCBmaWxlICk7Ci0gIH0KLQotI2VuZGlmICAvKiBfX01XRVJLU19fICYmICFUQVJHRVRfUlRfTUFDX01BQ0hPICovCi0KLQotI2lmIEhBVkVfRlNTUEVDICYmICFIQVZFX0ZTUkVGCi0KLSAgLyogaXNEaXJlY3RvcnkgaXMgYSBkdW1teSB0byBzeW5jaHJvbml6ZSBBUEkgd2l0aCBGU1BhdGhNYWtlUmVmKCkgKi8KLSAgc3RhdGljIE9TRXJyCi0gIEZUX0ZTUGF0aE1ha2VTcGVjKCBjb25zdCBVSW50OCogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgRlNTcGVjKiAgICAgICBzcGVjX3AsCi0gICAgICAgICAgICAgICAgICAgICBCb29sZWFuICAgICAgIGlzRGlyZWN0b3J5ICkKLSAgewotICAgIGNvbnN0IGNoYXIgICpwLCAqcTsKLSAgICBzaG9ydCAgICAgICB2UmVmTnVtOwotICAgIGxvbmcgICAgICAgIGRpcklEOwotICAgIFN0cjI1NSAgICAgIG5vZGVOYW1lOwotICAgIE9TRXJyICAgICAgIGVycjsKLSAgICBGVF9VTlVTRUQoIGlzRGlyZWN0b3J5ICk7Ci0KLQotICAgIHAgPSBxID0gKGNvbnN0IGNoYXIgKilwYXRobmFtZTsKLSAgICBkaXJJRCAgID0gMDsKLSAgICB2UmVmTnVtID0gMDsKLQotICAgIHdoaWxlICggMSApCi0gICAgewotICAgICAgaW50ICBsZW4gPSBmdF9zdHJsZW4oIHAgKTsKLQotCi0gICAgICBpZiAoIGxlbiA+IDI1NSApCi0gICAgICAgIGxlbiA9IDI1NTsKLQotICAgICAgcSA9IHAgKyBsZW47Ci0KLSAgICAgIGlmICggcSA9PSBwICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIGlmICggMjU1IDwgZnRfc3RybGVuKCAoY2hhciAqKXBhdGhuYW1lICkgKQotICAgICAgewotICAgICAgICB3aGlsZSAoIHAgPCBxICYmICpxICE9ICc6JyApCi0gICAgICAgICAgcS0tOwotICAgICAgfQotCi0gICAgICBpZiAoIHAgPCBxICkKLSAgICAgICAgKihjaGFyICopbm9kZU5hbWUgPSBxIC0gcDsKLSAgICAgIGVsc2UgaWYgKCBmdF9zdHJsZW4oIHAgKSA8IDI1NiApCi0gICAgICAgICooY2hhciAqKW5vZGVOYW1lID0gZnRfc3RybGVuKCBwICk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBlcnJGU05hbWVUb29Mb25nOwotCi0gICAgICBmdF9zdHJuY3B5KCAoY2hhciAqKW5vZGVOYW1lICsgMSwgKGNoYXIgKilwLCAqKGNoYXIgKilub2RlTmFtZSApOwotICAgICAgZXJyID0gRlNNYWtlRlNTcGVjKCB2UmVmTnVtLCBkaXJJRCwgbm9kZU5hbWUsIHNwZWNfcCApOwotICAgICAgaWYgKCBlcnIgfHwgJ1wwJyA9PSAqcSApCi0gICAgICAgIHJldHVybiBlcnI7Ci0KLSAgICAgIHZSZWZOdW0gPSBzcGVjX3AtPnZSZWZOdW07Ci0gICAgICBkaXJJRCAgID0gc3BlY19wLT5wYXJJRDsKLQotICAgICAgcCA9IHE7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgT1NFcnIKLSAgRlRfRlNwTWFrZVBhdGgoIGNvbnN0IEZTU3BlYyogIHNwZWNfcCwKLSAgICAgICAgICAgICAgICAgIFVJbnQ4KiAgICAgICAgIHBhdGgsCi0gICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICBtYXhQYXRoU2l6ZSApCi0gIHsKLSAgICBPU0VyciAgIGVycjsKLSAgICBGU1NwZWMgIHNwZWMgPSAqc3BlY19wOwotICAgIHNob3J0ICAgdlJlZk51bTsKLSAgICBsb25nICAgIGRpcklEOwotICAgIFN0cjI1NSAgcGFyRGlyX25hbWU7Ci0KLQotICAgIEZUX01FTV9TRVQoIHBhdGgsIDAsIG1heFBhdGhTaXplICk7Ci0gICAgd2hpbGUgKCAxICkKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgY2hpbGRfbmFtZWxlbiA9IGZ0X3N0cmxlbiggKGNoYXIgKilwYXRoICk7Ci0gICAgICB1bnNpZ25lZCBjaGFyICAgbm9kZV9uYW1lbGVuICA9IHNwZWMubmFtZVswXTsKLSAgICAgIHVuc2lnbmVkIGNoYXIqICBub2RlX25hbWUgICAgID0gc3BlYy5uYW1lICsgMTsKLQotCi0gICAgICBpZiAoIG5vZGVfbmFtZWxlbiArIGNoaWxkX25hbWVsZW4gPiBtYXhQYXRoU2l6ZSApCi0gICAgICAgIHJldHVybiBlcnJGU05hbWVUb29Mb25nOwotCi0gICAgICBGVF9NRU1fTU9WRSggcGF0aCArIG5vZGVfbmFtZWxlbiArIDEsIHBhdGgsIGNoaWxkX25hbWVsZW4gKTsKLSAgICAgIEZUX01FTV9DT1BZKCBwYXRoLCBub2RlX25hbWUsIG5vZGVfbmFtZWxlbiApOwotICAgICAgaWYgKCBjaGlsZF9uYW1lbGVuID4gMCApCi0gICAgICAgIHBhdGhbbm9kZV9uYW1lbGVuXSA9ICc6JzsKLQotICAgICAgdlJlZk51bSAgICAgICAgPSBzcGVjLnZSZWZOdW07Ci0gICAgICBkaXJJRCAgICAgICAgICA9IHNwZWMucGFySUQ7Ci0gICAgICBwYXJEaXJfbmFtZVswXSA9ICdcMCc7Ci0gICAgICBlcnIgPSBGU01ha2VGU1NwZWMoIHZSZWZOdW0sIGRpcklELCBwYXJEaXJfbmFtZSwgJnNwZWMgKTsKLSAgICAgIGlmICggbm9FcnIgIT0gZXJyIHx8IGRpcklEID09IHNwZWMucGFySUQgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIG5vRXJyOwotICB9Ci0KLSNlbmRpZiAvKiBIQVZFX0ZTU1BFQyAmJiAhSEFWRV9GU1JFRiAqLwotCi0KLSAgc3RhdGljIE9TRXJyCi0gIEZUX0ZTUGF0aE1ha2VSZXMoIGNvbnN0IFVJbnQ4KiAgICBwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgUmVzRmlsZVJlZk51bSogIHJlcyApCi0gIHsKLQotI2lmIEhBVkVfRlNSRUYKLQotICAgIE9TRXJyICBlcnI7Ci0gICAgRlNSZWYgIHJlZjsKLQotCi0gICAgaWYgKCBub0VyciAhPSBGU1BhdGhNYWtlUmVmKCBwYXRobmFtZSwgJnJlZiwgRkFMU0UgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0KLSAgICAvKiBhdCBwcmVzZW50LCBubyBzdXBwb3J0IGZvciBkZm9udCBmb3JtYXQgKi8KLSAgICBlcnIgPSBGU09wZW5SZXNvdXJjZUZpbGUoICZyZWYsIDAsIE5VTEwsIGZzUmRQZXJtLCByZXMgKTsKLSAgICBpZiAoIG5vRXJyID09IGVyciApCi0gICAgICByZXR1cm4gZXJyOwotCi0gICAgLyogZmFsbGJhY2sgdG8gb3JpZ2luYWwgcmVzb3VyY2UtZm9yayBmb250ICovCi0gICAgKnJlcyA9IEZTT3BlblJlc0ZpbGUoICZyZWYsIGZzUmRQZXJtICk7Ci0gICAgZXJyICA9IFJlc0Vycm9yKCk7Ci0KLSNlbHNlCi0KLSAgICBPU0VyciAgIGVycjsKLSAgICBGU1NwZWMgIHNwZWM7Ci0KLQotICAgIGlmICggbm9FcnIgIT0gRlRfRlNQYXRoTWFrZVNwZWMoIHBhdGhuYW1lLCAmc3BlYywgRkFMU0UgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0KLSAgICAvKiBhdCBwcmVzZW50LCBubyBzdXBwb3J0IGZvciBkZm9udCBmb3JtYXQgd2l0aG91dCBGU1JlZiAqLwotICAgIC8qIChzZWUgYWJvdmUpLCB0cnkgb3JpZ2luYWwgcmVzb3VyY2UtZm9yayBmb250ICAgICAgICAgICovCi0gICAgKnJlcyA9IEZTcE9wZW5SZXNGaWxlKCAmc3BlYywgZnNSZFBlcm0gKTsKLSAgICBlcnIgID0gUmVzRXJyb3IoKTsKLQotI2VuZGlmIC8qIEhBVkVfRlNSRUYgKi8KLQotICAgIHJldHVybiBlcnI7Ci0gIH0KLQotCi0gIC8qIFJldHVybiB0aGUgZmlsZSB0eXBlIGZvciBnaXZlbiBwYXRobmFtZSAqLwotICBzdGF0aWMgT1NUeXBlCi0gIGdldF9maWxlX3R5cGVfZnJvbV9wYXRoKCBjb25zdCBVSW50OCogIHBhdGhuYW1lICkKLSAgewotCi0jaWYgSEFWRV9GU1JFRgotCi0gICAgRlNSZWYgICAgICAgICAgcmVmOwotICAgIEZTQ2F0YWxvZ0luZm8gIGluZm87Ci0KLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aG5hbWUsICZyZWYsIEZBTFNFICkgKQotICAgICAgcmV0dXJuICggT1NUeXBlICkgMDsKLQotICAgIGlmICggbm9FcnIgIT0gRlNHZXRDYXRhbG9nSW5mbyggJnJlZiwga0ZTQ2F0SW5mb0ZpbmRlckluZm8sICZpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCApICkKLSAgICAgIHJldHVybiAoIE9TVHlwZSApIDA7Ci0KLSAgICByZXR1cm4gKChGSW5mbyAqKShpbmZvLmZpbmRlckluZm8pKS0+ZmRUeXBlOwotCi0jZWxzZQotCi0gICAgRlNTcGVjICBzcGVjOwotICAgIEZJbmZvICAgZmluZm87Ci0KLQotICAgIGlmICggbm9FcnIgIT0gRlRfRlNQYXRoTWFrZVNwZWMoIHBhdGhuYW1lLCAmc3BlYywgRkFMU0UgKSApCi0gICAgICByZXR1cm4gKCBPU1R5cGUgKSAwOwotCi0gICAgaWYgKCBub0VyciAhPSBGU3BHZXRGSW5mbyggJnNwZWMsICZmaW5mbyApICkKLSAgICAgIHJldHVybiAoIE9TVHlwZSApIDA7Ci0KLSAgICByZXR1cm4gZmluZm8uZmRUeXBlOwotCi0jZW5kaWYgLyogSEFWRV9GU1JFRiAqLwotCi0gIH0KLQotCi0gIC8qIEdpdmVuIGEgUG9zdFNjcmlwdCBmb250IG5hbWUsIGNyZWF0ZSB0aGUgTWFjaW50b3NoIExXRk4gZmlsZSBuYW1lLiAqLwotICBzdGF0aWMgdm9pZAotICBjcmVhdGVfbHdmbl9uYW1lKCBjaGFyKiAgIHBzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIFN0cjI1NSAgbHdmbl9maWxlX25hbWUgKQotICB7Ci0gICAgaW50ICAgICAgIG1heCA9IDUsIGNvdW50ID0gMDsKLSAgICBGVF9CeXRlKiAgcCA9IGx3Zm5fZmlsZV9uYW1lOwotICAgIEZUX0J5dGUqICBxID0gKEZUX0J5dGUqKXBzX25hbWU7Ci0KLQotICAgIGx3Zm5fZmlsZV9uYW1lWzBdID0gMDsKLQotICAgIHdoaWxlICggKnEgKQotICAgIHsKLSAgICAgIGlmICggZnRfaXN1cHBlciggKnEgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggY291bnQgKQotICAgICAgICAgIG1heCA9IDM7Ci0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgIH0KLSAgICAgIGlmICggY291bnQgPCBtYXggJiYgKCBmdF9pc2FsbnVtKCAqcSApIHx8ICpxID09ICdfJyApICkKLSAgICAgIHsKLSAgICAgICAgKisrcCA9ICpxOwotICAgICAgICBsd2ZuX2ZpbGVfbmFtZVswXSsrOwotICAgICAgICBjb3VudCsrOwotICAgICAgfQotICAgICAgcSsrOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHNob3J0Ci0gIGNvdW50X2ZhY2VzX3NmbnQoIGNoYXIqICBmb25kX2RhdGEgKQotICB7Ci0gICAgLyogVGhlIGNvdW50IGlzIDEgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBpbiB0aGUgRk9ORC4gICovCi0gICAgLyogSXNuJ3QgdGhhdCBjdXRlPyA6LSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICByZXR1cm4gRW5kaWFuUzE2X0J0b04oICooIChzaG9ydCopKCBmb25kX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIEZhbVJlYyApICkgKSApICsgMTsKLSAgfQotCi0KLSAgc3RhdGljIHNob3J0Ci0gIGNvdW50X2ZhY2VzX3NjYWxhYmxlKCBjaGFyKiAgZm9uZF9kYXRhICkKLSAgewotICAgIEFzc2NFbnRyeSogIGFzc29jOwotICAgIHNob3J0ICAgICAgIGksIGZhY2UsIGZhY2VfYWxsOwotCi0KLSAgICBmYWNlX2FsbCA9IEVuZGlhblMxNl9CdG9OKCAqKCAoc2hvcnQgKikoIGZvbmRfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGYW1SZWMgKSApICkgKSArIDE7Ci0gICAgYXNzb2MgICAgPSAoQXNzY0VudHJ5KikoIGZvbmRfZGF0YSArIHNpemVvZiAoIEZhbVJlYyApICsgMiApOwotICAgIGZhY2UgICAgID0gMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZV9hbGw7IGkrKyApCi0gICAgewotICAgICAgaWYgKCAwID09IEVuZGlhblMxNl9CdG9OKCBhc3NvY1tpXS5mb250U2l6ZSApICkKLSAgICAgICAgZmFjZSsrOwotICAgIH0KLSAgICByZXR1cm4gZmFjZTsKLSAgfQotCi0KLSAgLyogTG9vayBpbnNpZGUgdGhlIEZPTkQgZGF0YSwgYW5zd2VyIHdoZXRoZXIgdGhlcmUgc2hvdWxkIGJlIGFuIFNGTlQKLSAgICAgcmVzb3VyY2UsIGFuZCBhbnN3ZXIgdGhlIG5hbWUgb2YgYSBwb3NzaWJsZSBMV0ZOIFR5cGUgMSBmaWxlLgotCi0gICAgIFRoYW5rcyB0byBQYXVsIE1pbGxlciAocGF1bG1AcHJvZm91bmRlZmZlY3RzLmNvbSkgZm9yIHRoZSBmaXgKLSAgICAgdG8gbG9hZCBhIGZhY2UgT1RIRVIgdGhhbiB0aGUgZmlyc3Qgb25lIGluIHRoZSBGT05EIQotICAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHBhcnNlX2ZvbmQoIGNoYXIqICAgZm9uZF9kYXRhLAotICAgICAgICAgICAgICBzaG9ydCogIGhhdmVfc2ZudCwKLSAgICAgICAgICAgICAgUmVzSUQqICBzZm50X2lkLAotICAgICAgICAgICAgICBTdHIyNTUgIGx3Zm5fZmlsZV9uYW1lLAotICAgICAgICAgICAgICBzaG9ydCAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgQXNzY0VudHJ5KiAgYXNzb2M7Ci0gICAgQXNzY0VudHJ5KiAgYmFzZV9hc3NvYzsKLSAgICBGYW1SZWMqICAgICBmb25kOwotCi0KLSAgICAqc2ZudF9pZCAgICAgICAgICA9IDA7Ci0gICAgKmhhdmVfc2ZudCAgICAgICAgPSAwOwotICAgIGx3Zm5fZmlsZV9uYW1lWzBdID0gMDsKLQotICAgIGZvbmQgICAgICAgPSAoRmFtUmVjKilmb25kX2RhdGE7Ci0gICAgYXNzb2MgICAgICA9IChBc3NjRW50cnkqKSggZm9uZF9kYXRhICsgc2l6ZW9mICggRmFtUmVjICkgKyAyICk7Ci0gICAgYmFzZV9hc3NvYyA9IGFzc29jOwotCi0gICAgLyogdGhlIG1heGltdW0gZmFjZXMgaW4gYSBGT05EIGlzIDQ4LCBzaXplIG9mIFN0eWxlVGFibGUuaW5kZXhlc1tdICovCi0gICAgaWYgKCA0NyA8IGZhY2VfaW5kZXggKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogTGV0J3MgZG8gYSBsaXR0bGUgcmFuZ2UgY2hlY2tpbmcgYmVmb3JlIHdlIGdldCB0b28gZXhjaXRlZCBoZXJlICovCi0gICAgaWYgKCBmYWNlX2luZGV4IDwgY291bnRfZmFjZXNfc2ZudCggZm9uZF9kYXRhICkgKQotICAgIHsKLSAgICAgIGFzc29jICs9IGZhY2VfaW5kZXg7ICAgICAgICAvKiBhZGQgb24gdGhlIGZhY2VfaW5kZXghICovCi0KLSAgICAgIC8qIGlmIHRoZSBmYWNlIGF0IHRoaXMgaW5kZXggaXMgbm90IHNjYWxhYmxlLAotICAgICAgICAgZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBvbmUgKG9sZCBiZWhhdmlvcikgKi8KLSAgICAgIGlmICggRW5kaWFuUzE2X0J0b04oIGFzc29jLT5mb250U2l6ZSApID09IDAgKQotICAgICAgewotICAgICAgICAqaGF2ZV9zZm50ID0gMTsKLSAgICAgICAgKnNmbnRfaWQgICA9IEVuZGlhblMxNl9CdG9OKCBhc3NvYy0+Zm9udElEICk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggYmFzZV9hc3NvYy0+Zm9udFNpemUgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpoYXZlX3NmbnQgPSAxOwotICAgICAgICAqc2ZudF9pZCAgID0gRW5kaWFuUzE2X0J0b04oIGJhc2VfYXNzb2MtPmZvbnRJRCApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggRW5kaWFuUzMyX0J0b04oIGZvbmQtPmZmU3R5bE9mZiApICkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyKiAgcCA9ICh1bnNpZ25lZCBjaGFyKilmb25kX2RhdGE7Ci0gICAgICBTdHlsZVRhYmxlKiAgICAgc3R5bGU7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgc3RyaW5nX2NvdW50OwotICAgICAgY2hhciAgICAgICAgICAgIHBzX25hbWVbMjU2XTsKLSAgICAgIHVuc2lnbmVkIGNoYXIqICBuYW1lc1s2NF07Ci0gICAgICBpbnQgICAgICAgICAgICAgaTsKLQotCi0gICAgICBwICs9IEVuZGlhblMzMl9CdG9OKCBmb25kLT5mZlN0eWxPZmYgKTsKLSAgICAgIHN0eWxlID0gKFN0eWxlVGFibGUqKXA7Ci0gICAgICBwICs9IHNpemVvZiAoIFN0eWxlVGFibGUgKTsKLSAgICAgIHN0cmluZ19jb3VudCA9IEVuZGlhblMxNl9CdG9OKCAqKHNob3J0KikocCkgKTsKLSAgICAgIHAgKz0gc2l6ZW9mICggc2hvcnQgKTsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBzdHJpbmdfY291bnQgJiYgaSA8IDY0OyBpKysgKQotICAgICAgewotICAgICAgICBuYW1lc1tpXSA9IHA7Ci0gICAgICAgIHAgICAgICAgKz0gbmFtZXNbaV1bMF07Ci0gICAgICAgIHArKzsKLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBzaXplX3QgIHBzX25hbWVfbGVuID0gKHNpemVfdCluYW1lc1swXVswXTsKLQotCi0gICAgICAgIGlmICggcHNfbmFtZV9sZW4gIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBmdF9tZW1jcHkocHNfbmFtZSwgbmFtZXNbMF0gKyAxLCBwc19uYW1lX2xlbik7Ci0gICAgICAgICAgcHNfbmFtZVtwc19uYW1lX2xlbl0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICggc3R5bGUtPmluZGV4ZXNbZmFjZV9pbmRleF0gPiAxICYmCi0gICAgICAgICAgICAgc3R5bGUtPmluZGV4ZXNbZmFjZV9pbmRleF0gPD0gRlRfTUlOKCBzdHJpbmdfY291bnQsIDY0ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgY2hhciogIHN1ZmZpeGVzID0gbmFtZXNbc3R5bGUtPmluZGV4ZXNbZmFjZV9pbmRleF0gLSAxXTsKLQotCi0gICAgICAgICAgZm9yICggaSA9IDE7IGkgPD0gc3VmZml4ZXNbMF07IGkrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIHM7Ci0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgaiA9IHN1ZmZpeGVzW2ldIC0gMTsKLQotCi0gICAgICAgICAgICBpZiAoIGogPCBzdHJpbmdfY291bnQgJiYgKCBzID0gbmFtZXNbal0gKSAhPSBOVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2l6ZV90ICBzX2xlbiA9IChzaXplX3Qpc1swXTsKLQotCi0gICAgICAgICAgICAgIGlmICggc19sZW4gIT0gMCAmJiBwc19uYW1lX2xlbiArIHNfbGVuIDwgc2l6ZW9mICggcHNfbmFtZSApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZ0X21lbWNweSggcHNfbmFtZSArIHBzX25hbWVfbGVuLCBzICsgMSwgc19sZW4gKTsKLSAgICAgICAgICAgICAgICBwc19uYW1lX2xlbiArPSBzX2xlbjsKLSAgICAgICAgICAgICAgICBwc19uYW1lW3BzX25hbWVfbGVuXSA9IDA7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgY3JlYXRlX2x3Zm5fbmFtZSggcHNfbmFtZSwgbHdmbl9maWxlX25hbWUgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyAgRlRfRXJyb3IKLSAgbG9va3VwX2x3Zm5fYnlfZm9uZCggY29uc3QgVUludDgqICAgICAgcGF0aF9mb25kLAotICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cjI1NVBhcmFtICBiYXNlX2x3Zm4sCi0gICAgICAgICAgICAgICAgICAgICAgIFVJbnQ4KiAgICAgICAgICAgIHBhdGhfbHdmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcGF0aF9zaXplICkKLSAgewotCi0jaWYgSEFWRV9GU1JFRgotCi0gICAgRlNSZWYgIHJlZiwgcGFyX3JlZjsKLSAgICBpbnQgICAgZGlybmFtZV9sZW47Ci0KLQotICAgIC8qIFBhdGhuYW1lIGZvciBGU1JlZiBjYW4gYmUgaW4gdmFyaW91cyBmb3JtYXRzOiBIRlMsIEhGUyssIGFuZCBQT1NJWC4gKi8KLSAgICAvKiBXZSBzaG91bGQgbm90IGV4dHJhY3QgcGFyZW50IGRpcmVjdG9yeSBieSBzdHJpbmcgbWFuaXB1bGF0aW9uLiAgICAgICovCi0KLSAgICBpZiAoIG5vRXJyICE9IEZTUGF0aE1ha2VSZWYoIHBhdGhfZm9uZCwgJnJlZiwgRkFMU0UgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggbm9FcnIgIT0gRlNHZXRDYXRhbG9nSW5mbyggJnJlZiwga0ZTQ2F0SW5mb05vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmcGFyX3JlZiApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBub0VyciAhPSBGU1JlZk1ha2VQYXRoKCAmcGFyX3JlZiwgcGF0aF9sd2ZuLCBwYXRoX3NpemUgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggZnRfc3RybGVuKCAoY2hhciAqKXBhdGhfbHdmbiApICsgMSArIGJhc2VfbHdmblswXSA+IHBhdGhfc2l6ZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIC8qIG5vdyB3ZSBoYXZlIGFic29sdXRlIGRpcm5hbWUgaW4gcGF0aF9sd2ZuICovCi0gICAgaWYgKCBwYXRoX2x3Zm5bMF0gPT0gJy8nICkKLSAgICAgIGZ0X3N0cmNhdCggKGNoYXIgKilwYXRoX2x3Zm4sICIvIiApOwotICAgIGVsc2UKLSAgICAgIGZ0X3N0cmNhdCggKGNoYXIgKilwYXRoX2x3Zm4sICI6IiApOwotCi0gICAgZGlybmFtZV9sZW4gPSBmdF9zdHJsZW4oIChjaGFyICopcGF0aF9sd2ZuICk7Ci0gICAgZnRfc3RyY2F0KCAoY2hhciAqKXBhdGhfbHdmbiwgKGNoYXIgKiliYXNlX2x3Zm4gKyAxICk7Ci0gICAgcGF0aF9sd2ZuW2Rpcm5hbWVfbGVuICsgYmFzZV9sd2ZuWzBdXSA9ICdcMCc7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTUGF0aE1ha2VSZWYoIHBhdGhfbHdmbiwgJnJlZiwgRkFMU0UgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTR2V0Q2F0YWxvZ0luZm8oICZyZWYsIGtGU0NhdEluZm9Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSNlbHNlCi0KLSAgICBpbnQgICAgIGk7Ci0gICAgRlNTcGVjICBzcGVjOwotCi0KLSAgICAvKiBwYXRobmFtZSBmb3IgRlNTcGVjIGlzIGFsd2F5cyBIRlMgZm9ybWF0ICovCi0gICAgaWYgKCBmdF9zdHJsZW4oIChjaGFyICopcGF0aF9mb25kICkgPiBwYXRoX3NpemUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBmdF9zdHJjcHkoIChjaGFyICopcGF0aF9sd2ZuLCAoY2hhciAqKXBhdGhfZm9uZCApOwotCi0gICAgaSA9IGZ0X3N0cmxlbiggKGNoYXIgKilwYXRoX2x3Zm4gKSAtIDE7Ci0gICAgd2hpbGUgKCBpID4gMCAmJiAnOicgIT0gcGF0aF9sd2ZuW2ldICkKLSAgICAgIGktLTsKLQotICAgIGlmICggaSArIDEgKyBiYXNlX2x3Zm5bMF0gPiBwYXRoX3NpemUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoICc6JyA9PSBwYXRoX2x3Zm5baV0gKQotICAgIHsKLSAgICAgIGZ0X3N0cmNweSggKGNoYXIgKilwYXRoX2x3Zm4gKyBpICsgMSwgKGNoYXIgKiliYXNlX2x3Zm4gKyAxICk7Ci0gICAgICBwYXRoX2x3Zm5baSArIDEgKyBiYXNlX2x3Zm5bMF1dID0gJ1wwJzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZ0X3N0cmNweSggKGNoYXIgKilwYXRoX2x3Zm4sIChjaGFyICopYmFzZV9sd2ZuICsgMSApOwotICAgICAgcGF0aF9sd2ZuW2Jhc2VfbHdmblswXV0gPSAnXDAnOwotICAgIH0KLQotICAgIGlmICggbm9FcnIgIT0gRlRfRlNQYXRoTWFrZVNwZWMoIHBhdGhfbHdmbiwgJnNwZWMsIEZBTFNFICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotI2VuZGlmIC8qIEhBVkVfRlNSRUYgKi8KLQotICB9Ci0KLQotICBzdGF0aWMgc2hvcnQKLSAgY291bnRfZmFjZXMoIEhhbmRsZSAgICAgICAgZm9uZCwKLSAgICAgICAgICAgICAgIGNvbnN0IFVJbnQ4KiAgcGF0aG5hbWUgKQotICB7Ci0gICAgUmVzSUQgICAgIHNmbnRfaWQ7Ci0gICAgc2hvcnQgICAgIGhhdmVfc2ZudCwgaGF2ZV9sd2ZuOwotICAgIFN0cjI1NSAgICBsd2ZuX2ZpbGVfbmFtZTsKLSAgICBVSW50OCAgICAgYnVmZltQQVRIX01BWF07Ci0gICAgRlRfRXJyb3IgIGVycjsKLSAgICBzaG9ydCAgICAgbnVtX2ZhY2VzOwotCi0KLSAgICBoYXZlX3NmbnQgPSBoYXZlX2x3Zm4gPSAwOwotCi0gICAgSExvY2soIGZvbmQgKTsKLSAgICBwYXJzZV9mb25kKCAqZm9uZCwgJmhhdmVfc2ZudCwgJnNmbnRfaWQsIGx3Zm5fZmlsZV9uYW1lLCAwICk7Ci0KLSAgICBpZiAoIGx3Zm5fZmlsZV9uYW1lWzBdICkKLSAgICB7Ci0gICAgICBlcnIgPSBsb29rdXBfbHdmbl9ieV9mb25kKCBwYXRobmFtZSwgbHdmbl9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmLCBzaXplb2YgKCBidWZmICkgICk7Ci0gICAgICBpZiAoICFlcnIgKQotICAgICAgICBoYXZlX2x3Zm4gPSAxOwotICAgIH0KLQotICAgIGlmICggaGF2ZV9sd2ZuICYmICggIWhhdmVfc2ZudCB8fCBQUkVGRVJfTFdGTiApICkKLSAgICAgIG51bV9mYWNlcyA9IDE7Ci0gICAgZWxzZQotICAgICAgbnVtX2ZhY2VzID0gY291bnRfZmFjZXNfc2NhbGFibGUoICpmb25kICk7Ci0KLSAgICBIVW5sb2NrKCBmb25kICk7Ci0gICAgcmV0dXJuIG51bV9mYWNlczsKLSAgfQotCi0KLSAgLyogUmVhZCBUeXBlIDEgZGF0YSBmcm9tIHRoZSBQT1NUIHJlc291cmNlcyBpbnNpZGUgdGhlIExXRk4gZmlsZSwKLSAgICAgcmV0dXJuIGEgUEZCIGJ1ZmZlci4gIFRoaXMgaXMgc29tZXdoYXQgY29udm9sdXRlZCBiZWNhdXNlIHRoZSBGVDIKLSAgICAgUEZCIHBhcnNlciB3YW50cyB0aGUgQVNDSUkgaGVhZGVyIGFzIG9uZSBjaHVuaywgYW5kIHRoZSBMV0ZOCi0gICAgIGNodW5rcyBhcmUgb2Z0ZW4gbm90IG9yZ2FuaXplZCB0aGF0IHdheSwgc28gd2UgZ2x1ZSBjaHVua3MKLSAgICAgb2YgdGhlIHNhbWUgdHlwZSB0b2dldGhlci4gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJlYWRfbHdmbiggRlRfTWVtb3J5ICAgICAgbWVtb3J5LAotICAgICAgICAgICAgIFJlc0ZpbGVSZWZOdW0gIHJlcywKLSAgICAgICAgICAgICBGVF9CeXRlKiogICAgICBwZmJfZGF0YSwKLSAgICAgICAgICAgICBGVF9VTG9uZyogICAgICBzaXplICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIFJlc0lEICAgICAgICAgIHJlc19pZDsKLSAgICB1bnNpZ25lZCBjaGFyICAqYnVmZmVyLCAqcCwgKnNpemVfcCA9IE5VTEw7Ci0gICAgRlRfVUxvbmcgICAgICAgdG90YWxfc2l6ZSA9IDA7Ci0gICAgRlRfVUxvbmcgICAgICAgb2xkX3RvdGFsX3NpemUgPSAwOwotICAgIEZUX1VMb25nICAgICAgIHBvc3Rfc2l6ZSwgcGZiX2NodW5rX3NpemU7Ci0gICAgSGFuZGxlICAgICAgICAgcG9zdF9kYXRhOwotICAgIGNoYXIgICAgICAgICAgIGNvZGUsIGxhc3RfY29kZTsKLQotCi0gICAgVXNlUmVzRmlsZSggcmVzICk7Ci0KLSAgICAvKiBGaXJzdCBwYXNzOiBsb2FkIGFsbCBQT1NUIHJlc291cmNlcywgYW5kIGRldGVybWluZSB0aGUgc2l6ZSBvZiAqLwotICAgIC8qIHRoZSBvdXRwdXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgcmVzX2lkICAgID0gNTAxOwotICAgIGxhc3RfY29kZSA9IC0xOwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwb3N0X2RhdGEgPSBHZXQxUmVzb3VyY2UoIFRUQUdfUE9TVCwgcmVzX2lkKysgKTsKLSAgICAgIGlmICggcG9zdF9kYXRhID09IE5VTEwgKQotICAgICAgICBicmVhazsgIC8qIHdlIGFyZSBkb25lICovCi0KLSAgICAgIGNvZGUgPSAoKnBvc3RfZGF0YSlbMF07Ci0KLSAgICAgIGlmICggY29kZSAhPSBsYXN0X2NvZGUgKQotICAgICAgewotICAgICAgICBpZiAoIGNvZGUgPT0gNSApCi0gICAgICAgICAgdG90YWxfc2l6ZSArPSAyOyAvKiBqdXN0IHRoZSBlbmQgY29kZSAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgdG90YWxfc2l6ZSArPSA2OyAvKiBjb2RlICsgNCBieXRlcyBjaHVuayBsZW5ndGggKi8KLSAgICAgIH0KLQotICAgICAgdG90YWxfc2l6ZSArPSBHZXRIYW5kbGVTaXplKCBwb3N0X2RhdGEgKSAtIDI7Ci0gICAgICBsYXN0X2NvZGUgPSBjb2RlOwotCi0gICAgICAvKiBkZXRlY3QgaW50ZWdlciBvdmVyZmxvd3MgKi8KLSAgICAgIGlmICggdG90YWxfc2l6ZSA8IG9sZF90b3RhbF9zaXplICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9FUlIoIEFycmF5X1Rvb19MYXJnZSApOwotICAgICAgICBnb3RvIEVycm9yOwotICAgICAgfQotCi0gICAgICBvbGRfdG90YWxfc2l6ZSA9IHRvdGFsX3NpemU7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9BTExPQyggYnVmZmVyLCAoRlRfTG9uZyl0b3RhbF9zaXplICkgKQotICAgICAgZ290byBFcnJvcjsKLQotICAgIC8qIFNlY29uZCBwYXNzOiBhcHBlbmQgYWxsIFBPU1QgZGF0YSB0byB0aGUgYnVmZmVyLCBhZGQgUEZCIGZpZWxkcy4gKi8KLSAgICAvKiBHbHVlIGFsbCBjb25zZWN1dGl2ZSBjaHVua3Mgb2YgdGhlIHNhbWUgdHlwZSB0b2dldGhlci4gICAgICAgICAgICovCi0gICAgcCAgICAgICAgICAgICAgPSBidWZmZXI7Ci0gICAgcmVzX2lkICAgICAgICAgPSA1MDE7Ci0gICAgbGFzdF9jb2RlICAgICAgPSAtMTsKLSAgICBwZmJfY2h1bmtfc2l6ZSA9IDA7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHBvc3RfZGF0YSA9IEdldDFSZXNvdXJjZSggVFRBR19QT1NULCByZXNfaWQrKyApOwotICAgICAgaWYgKCBwb3N0X2RhdGEgPT0gTlVMTCApCi0gICAgICAgIGJyZWFrOyAgLyogd2UgYXJlIGRvbmUgKi8KLQotICAgICAgcG9zdF9zaXplID0gKEZUX1VMb25nKUdldEhhbmRsZVNpemUoIHBvc3RfZGF0YSApIC0gMjsKLSAgICAgIGNvZGUgPSAoKnBvc3RfZGF0YSlbMF07Ci0KLSAgICAgIGlmICggY29kZSAhPSBsYXN0X2NvZGUgKQotICAgICAgewotICAgICAgICBpZiAoIGxhc3RfY29kZSAhPSAtMSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3ZSBhcmUgZG9uZSBhZGRpbmcgYSBjaHVuaywgZmlsbCBpbiB0aGUgc2l6ZSBmaWVsZCAqLwotICAgICAgICAgIGlmICggc2l6ZV9wICE9IE5VTEwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICpzaXplX3ArKyA9IChGVF9CeXRlKSggICBwZmJfY2h1bmtfc2l6ZSAgICAgICAgICYgMHhGRiApOwotICAgICAgICAgICAgKnNpemVfcCsrID0gKEZUX0J5dGUpKCAoIHBmYl9jaHVua19zaXplID4+IDggICkgJiAweEZGICk7Ci0gICAgICAgICAgICAqc2l6ZV9wKysgPSAoRlRfQnl0ZSkoICggcGZiX2NodW5rX3NpemUgPj4gMTYgKSAmIDB4RkYgKTsKLSAgICAgICAgICAgICpzaXplX3ArKyA9IChGVF9CeXRlKSggKCBwZmJfY2h1bmtfc2l6ZSA+PiAyNCApICYgMHhGRiApOwotICAgICAgICAgIH0KLSAgICAgICAgICBwZmJfY2h1bmtfc2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAqcCsrID0gMHg4MDsKLSAgICAgICAgaWYgKCBjb2RlID09IDUgKQotICAgICAgICAgICpwKysgPSAweDAzOyAgLyogdGhlIGVuZCAqLwotICAgICAgICBlbHNlIGlmICggY29kZSA9PSAyICkKLSAgICAgICAgICAqcCsrID0gMHgwMjsgIC8qIGJpbmFyeSBzZWdtZW50ICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAqcCsrID0gMHgwMTsgIC8qIEFTQ0lJIHNlZ21lbnQgKi8KLQotICAgICAgICBpZiAoIGNvZGUgIT0gNSApCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3AgPSBwOyAgIC8qIHNhdmUgZm9yIGxhdGVyICovCi0gICAgICAgICAgcCArPSA0OyAgICAgICAvKiBtYWtlIHNwYWNlIGZvciBzaXplIGZpZWxkICovCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZnRfbWVtY3B5KCBwLCAqcG9zdF9kYXRhICsgMiwgcG9zdF9zaXplICk7Ci0gICAgICBwZmJfY2h1bmtfc2l6ZSArPSBwb3N0X3NpemU7Ci0gICAgICBwICs9IHBvc3Rfc2l6ZTsKLSAgICAgIGxhc3RfY29kZSA9IGNvZGU7Ci0gICAgfQotCi0gICAgKnBmYl9kYXRhID0gYnVmZmVyOwotICAgICpzaXplID0gdG90YWxfc2l6ZTsKLQotICBFcnJvcjoKLSAgICBDbG9zZVJlc0ZpbGUoIHJlcyApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogQ3JlYXRlIGEgbmV3IEZUX0ZhY2UgZnJvbSBhIGZpbGUgc3BlYyB0byBhbiBMV0ZOIGZpbGUuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBGVF9OZXdfRmFjZV9Gcm9tX0xXRk4oIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgIGFmYWNlICkKLSAgewotICAgIEZUX0J5dGUqICAgICAgIHBmYl9kYXRhOwotICAgIEZUX1VMb25nICAgICAgIHBmYl9zaXplOwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotICAgIFJlc0ZpbGVSZWZOdW0gIHJlczsKLQotCi0gICAgaWYgKCBub0VyciAhPSBGVF9GU1BhdGhNYWtlUmVzKCBwYXRobmFtZSwgJnJlcyApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIHBmYl9kYXRhID0gTlVMTDsKLSAgICBwZmJfc2l6ZSA9IDA7Ci0gICAgZXJyb3IgPSByZWFkX2x3Zm4oIGxpYnJhcnktPm1lbW9yeSwgcmVzLCAmcGZiX2RhdGEsICZwZmJfc2l6ZSApOwotICAgIENsb3NlUmVzRmlsZSggcmVzICk7IC8qIFBGQiBpcyBhbHJlYWR5IGxvYWRlZCwgdXNlbGVzcyBhbnltb3JlICovCi0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICByZXR1cm4gb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmYl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmYl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmFjZSApOwotICB9Ci0KLQotICAvKiBDcmVhdGUgYSBuZXcgRlRfRmFjZSBmcm9tIGFuIFNGTlQgcmVzb3VyY2UsIHNwZWNpZmllZCBieSByZXMgSUQuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBGVF9OZXdfRmFjZV9Gcm9tX1NGTlQoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVzSUQgICAgICAgc2ZudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgIGFmYWNlICkKLSAgewotICAgIEhhbmRsZSAgICAgc2ZudCA9IE5VTEw7Ci0gICAgRlRfQnl0ZSogICBzZm50X2RhdGE7Ci0gICAgc2l6ZV90ICAgICBzZm50X3NpemU7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgaW50ICAgICAgICBpc19jZmYsIGlzX3NmbnRfcHM7Ci0KLQotICAgIHNmbnQgPSBHZXRSZXNvdXJjZSggVFRBR19zZm50LCBzZm50X2lkICk7Ci0gICAgaWYgKCBzZm50ID09IE5VTEwgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0hhbmRsZSApOwotCi0gICAgc2ZudF9zaXplID0gKEZUX1VMb25nKUdldEhhbmRsZVNpemUoIHNmbnQgKTsKLSAgICBpZiAoIEZUX0FMTE9DKCBzZm50X2RhdGEsIChGVF9Mb25nKXNmbnRfc2l6ZSApICkKLSAgICB7Ci0gICAgICBSZWxlYXNlUmVzb3VyY2UoIHNmbnQgKTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBITG9jayggc2ZudCApOwotICAgIGZ0X21lbWNweSggc2ZudF9kYXRhLCAqc2ZudCwgc2ZudF9zaXplICk7Ci0gICAgSFVubG9jayggc2ZudCApOwotICAgIFJlbGVhc2VSZXNvdXJjZSggc2ZudCApOwotCi0gICAgaXNfY2ZmICAgICA9IHNmbnRfc2l6ZSA+IDQgJiYgIWZ0X21lbWNtcCggc2ZudF9kYXRhLCAiT1RUTyIsIDQgKTsKLSAgICBpc19zZm50X3BzID0gc2ZudF9zaXplID4gNCAmJiAhZnRfbWVtY21wKCBzZm50X2RhdGEsICJ0eXAxIiwgNCApOwotCi0gICAgaWYgKCBpc19zZm50X3BzICkKLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbTsKLQotCi0gICAgICBpZiAoIEZUX05FVyggc3RyZWFtICkgKQotICAgICAgICBnb3RvIFRyeV9PcGVuVHlwZTsKLQotICAgICAgRlRfU3RyZWFtX09wZW5NZW1vcnkoIHN0cmVhbSwgc2ZudF9kYXRhLCBzZm50X3NpemUgKTsKLSAgICAgIGlmICggIW9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX1N0cmVhbV9DbG9zZSggc3RyZWFtICk7Ci0gICAgICAgIEZUX0ZSRUUoIHN0cmVhbSApOwotICAgICAgICBGVF9GUkVFKCBzZm50X2RhdGEgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBGVF9GUkVFKCBzdHJlYW0gKTsKLSAgICB9Ci0gIFRyeV9PcGVuVHlwZToKLSAgICBlcnJvciA9IG9wZW5fZmFjZV9mcm9tX2J1ZmZlciggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZudF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NmZiA/ICJjZmYiIDogInRydWV0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIENyZWF0ZSBhIG5ldyBGVF9GYWNlIGZyb20gYSBmaWxlIHNwZWMgdG8gYSBzdWl0Y2FzZSBmaWxlLiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgRlRfTmV3X0ZhY2VfRnJvbV9TdWl0Y2FzZSggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgICAgYWZhY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3IgPSBGVF9FUlIoIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0gICAgUmVzRmlsZVJlZk51bSAgcmVzX3JlZjsKLSAgICBSZXNvdXJjZUluZGV4ICByZXNfaW5kZXg7Ci0gICAgSGFuZGxlICAgICAgICAgZm9uZDsKLSAgICBzaG9ydCAgICAgICAgICBudW1fZmFjZXNfaW5fcmVzOwotCi0KLSAgICBpZiAoIG5vRXJyICE9IEZUX0ZTUGF0aE1ha2VSZXMoIHBhdGhuYW1lLCAmcmVzX3JlZiApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIFVzZVJlc0ZpbGUoIHJlc19yZWYgKTsKLSAgICBpZiAoIFJlc0Vycm9yKCkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgbnVtX2ZhY2VzX2luX3JlcyA9IDA7Ci0gICAgZm9yICggcmVzX2luZGV4ID0gMTsgOyArK3Jlc19pbmRleCApCi0gICAgewotICAgICAgc2hvcnQgIG51bV9mYWNlc19pbl9mb25kOwotCi0KLSAgICAgIGZvbmQgPSBHZXQxSW5kUmVzb3VyY2UoIFRUQUdfRk9ORCwgcmVzX2luZGV4ICk7Ci0gICAgICBpZiAoIFJlc0Vycm9yKCkgKQotICAgICAgICBicmVhazsKLQotICAgICAgbnVtX2ZhY2VzX2luX2ZvbmQgID0gY291bnRfZmFjZXMoIGZvbmQsIHBhdGhuYW1lICk7Ci0gICAgICBudW1fZmFjZXNfaW5fcmVzICArPSBudW1fZmFjZXNfaW5fZm9uZDsKLQotICAgICAgaWYgKCAwIDw9IGZhY2VfaW5kZXggJiYgZmFjZV9pbmRleCA8IG51bV9mYWNlc19pbl9mb25kICYmIGVycm9yICkKLSAgICAgICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX0ZPTkQoIGxpYnJhcnksIGZvbmQsIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0KLSAgICAgIGZhY2VfaW5kZXggLT0gbnVtX2ZhY2VzX2luX2ZvbmQ7Ci0gICAgfQotCi0gICAgQ2xvc2VSZXNGaWxlKCByZXNfcmVmICk7Ci0gICAgaWYgKCAhZXJyb3IgJiYgYWZhY2UgKQotICAgICAgKCphZmFjZSktPm51bV9mYWNlcyA9IG51bV9mYWNlc19pbl9yZXM7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bWFjLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlX0Zyb21fRk9ORCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgICAgICBmb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgYWZhY2UgKQotICB7Ci0gICAgc2hvcnQgICAgIGhhdmVfc2ZudCwgaGF2ZV9sd2ZuID0gMDsKLSAgICBSZXNJRCAgICAgc2ZudF9pZCwgZm9uZF9pZDsKLSAgICBPU1R5cGUgICAgZm9uZF90eXBlOwotICAgIFN0cjI1NSAgICBmb25kX25hbWU7Ci0gICAgU3RyMjU1ICAgIGx3Zm5fZmlsZV9uYW1lOwotICAgIFVJbnQ4ICAgICBwYXRoX2x3Zm5bUEFUSF9NQVhdOwotICAgIE9TRXJyICAgICBlcnI7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgYWZhY2UnIGFuZCBgbGlicmFyeScgZGVsYXllZCB0byAqLwotICAgIC8qIGBGVF9OZXdfRmFjZV9Gcm9tX1hYWCcgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBHZXRSZXNJbmZvKCBmb25kLCAmZm9uZF9pZCwgJmZvbmRfdHlwZSwgZm9uZF9uYW1lICk7Ci0gICAgaWYgKCBSZXNFcnJvcigpICE9IG5vRXJyIHx8IGZvbmRfdHlwZSAhPSBUVEFHX0ZPTkQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBITG9jayggZm9uZCApOwotICAgIHBhcnNlX2ZvbmQoICpmb25kLCAmaGF2ZV9zZm50LCAmc2ZudF9pZCwgbHdmbl9maWxlX25hbWUsIGZhY2VfaW5kZXggKTsKLSAgICBIVW5sb2NrKCBmb25kICk7Ci0KLSAgICBpZiAoIGx3Zm5fZmlsZV9uYW1lWzBdICkKLSAgICB7Ci0gICAgICBSZXNGaWxlUmVmTnVtICByZXM7Ci0KLQotICAgICAgcmVzID0gSG9tZVJlc0ZpbGUoIGZvbmQgKTsKLSAgICAgIGlmICggbm9FcnIgIT0gUmVzRXJyb3IoKSApCi0gICAgICAgIGdvdG8gZm91bmRfbm9fbHdmbl9maWxlOwotCi0jaWYgSEFWRV9GU1JFRgotCi0gICAgICB7Ci0gICAgICAgIFVJbnQ4ICBwYXRoX2ZvbmRbUEFUSF9NQVhdOwotICAgICAgICBGU1JlZiAgcmVmOwotCi0KLSAgICAgICAgZXJyID0gRlNHZXRGb3JrQ0JJbmZvKCByZXMsIGtGU0ludmFsaWRWb2x1bWVSZWZOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgJnJlZiwgTlVMTCApOwotICAgICAgICBpZiAoIG5vRXJyICE9IGVyciApCi0gICAgICAgICAgZ290byBmb3VuZF9ub19sd2ZuX2ZpbGU7Ci0KLSAgICAgICAgZXJyID0gRlNSZWZNYWtlUGF0aCggJnJlZiwgcGF0aF9mb25kLCBzaXplb2YgKCBwYXRoX2ZvbmQgKSApOwotICAgICAgICBpZiAoIG5vRXJyICE9IGVyciApCi0gICAgICAgICAgZ290byBmb3VuZF9ub19sd2ZuX2ZpbGU7Ci0KLSAgICAgICAgZXJyb3IgPSBsb29rdXBfbHdmbl9ieV9mb25kKCBwYXRoX2ZvbmQsIGx3Zm5fZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfbHdmbiwgc2l6ZW9mICggcGF0aF9sd2ZuICkgKTsKLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgIGhhdmVfbHdmbiA9IDE7Ci0gICAgICB9Ci0KLSNlbGlmIEhBVkVfRlNTUEVDCi0KLSAgICAgIHsKLSAgICAgICAgVUludDggICAgIHBhdGhfZm9uZFtQQVRIX01BWF07Ci0gICAgICAgIEZDQlBCUmVjICBwYjsKLSAgICAgICAgU3RyMjU1ICAgIGZvbmRfZmlsZV9uYW1lOwotICAgICAgICBGU1NwZWMgICAgc3BlYzsKLQotCi0gICAgICAgIEZUX01FTV9TRVQoICZzcGVjLCAwLCBzaXplb2YgKCBGU1NwZWMgKSApOwotICAgICAgICBGVF9NRU1fU0VUKCAmcGIsICAgMCwgc2l6ZW9mICggRkNCUEJSZWMgKSApOwotCi0gICAgICAgIHBiLmlvTmFtZVB0ciA9IGZvbmRfZmlsZV9uYW1lOwotICAgICAgICBwYi5pb1ZSZWZOdW0gPSAwOwotICAgICAgICBwYi5pb1JlZk51bSAgPSByZXM7Ci0gICAgICAgIHBiLmlvRkNCSW5keCA9IDA7Ci0KLSAgICAgICAgZXJyID0gUEJHZXRGQ0JJbmZvU3luYyggJnBiICk7Ci0gICAgICAgIGlmICggbm9FcnIgIT0gZXJyICkKLSAgICAgICAgICBnb3RvIGZvdW5kX25vX2x3Zm5fZmlsZTsKLQotICAgICAgICBlcnIgPSBGU01ha2VGU1NwZWMoIHBiLmlvRkNCVlJlZk51bSwgcGIuaW9GQ0JQYXJJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb25kX2ZpbGVfbmFtZSwgJnNwZWMgKTsKLSAgICAgICAgaWYgKCBub0VyciAhPSBlcnIgKQotICAgICAgICAgIGdvdG8gZm91bmRfbm9fbHdmbl9maWxlOwotCi0gICAgICAgIGVyciA9IEZUX0ZTcE1ha2VQYXRoKCAmc3BlYywgcGF0aF9mb25kLCBzaXplb2YgKCBwYXRoX2ZvbmQgKSApOwotICAgICAgICBpZiAoIG5vRXJyICE9IGVyciApCi0gICAgICAgICAgZ290byBmb3VuZF9ub19sd2ZuX2ZpbGU7Ci0KLSAgICAgICAgZXJyb3IgPSBsb29rdXBfbHdmbl9ieV9mb25kKCBwYXRoX2ZvbmQsIGx3Zm5fZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfbHdmbiwgc2l6ZW9mICggcGF0aF9sd2ZuICkgKTsKLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgIGhhdmVfbHdmbiA9IDE7Ci0gICAgICB9Ci0KLSNlbmRpZiAvKiBIQVZFX0ZTUkVGLCBIQVZFX0ZTU1BFQyAqLwotCi0gICAgfQotCi0gICAgaWYgKCBoYXZlX2x3Zm4gJiYgKCAhaGF2ZV9zZm50IHx8IFBSRUZFUl9MV0ZOICkgKQotICAgICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX0xXRk4oIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9sd2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX0VSUiggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gIGZvdW5kX25vX2x3Zm5fZmlsZToKLSAgICBpZiAoIGhhdmVfc2ZudCAmJiBlcnJvciApCi0gICAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fU0ZOVCggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogQ29tbW9uIGZ1bmN0aW9uIHRvIGxvYWQgYSBuZXcgRlRfRmFjZSBmcm9tIGEgcmVzb3VyY2UgZmlsZS4gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEZUX05ld19GYWNlX0Zyb21fUmVzb3VyY2UoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUludDgqICBwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgIGFmYWNlICkKLSAgewotICAgIE9TVHlwZSAgICBmaWxlX3R5cGU7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICAvKiBMV0ZOIGlzIGEgKHZlcnkpIHNwZWNpZmljIGZpbGUgZm9ybWF0LCBjaGVjayBmb3IgaXQgZXhwbGljaXRseSAqLwotICAgIGZpbGVfdHlwZSA9IGdldF9maWxlX3R5cGVfZnJvbV9wYXRoKCBwYXRobmFtZSApOwotICAgIGlmICggZmlsZV90eXBlID09IFRUQUdfTFdGTiApCi0gICAgICByZXR1cm4gRlRfTmV3X0ZhY2VfRnJvbV9MV0ZOKCBsaWJyYXJ5LCBwYXRobmFtZSwgZmFjZV9pbmRleCwgYWZhY2UgKTsKLQotICAgIC8qIE90aGVyd2lzZSB0aGUgZmlsZSB0eXBlIGRvZXNuJ3QgbWF0dGVyICh0aGVyZSBhcmUgbW9yZSB0aGFuICAqLwotICAgIC8qIGBGRklMJyBhbmQgYHRmaWwnKS4gIEp1c3QgdHJ5IG9wZW5pbmcgaXQgYXMgYSBmb250IHN1aXRjYXNlOyAqLwotICAgIC8qIGlmIGl0IHdvcmtzLCBmaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX1N1aXRjYXNlKCBsaWJyYXJ5LCBwYXRobmFtZSwgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBsZXQgaXQgZmFsbCB0aHJvdWdoIHRvIG5vcm1hbCBsb2FkZXIgKC50dGYsIC5vdGYsIGV0Yy4pOyAqLwotICAgIC8qIHdlIHNpZ25hbCB0aGlzIGJ5IHJldHVybmluZyBubyBlcnJvciBhbmQgbm8gRlRfRmFjZSAgICAgICovCi0gICAgKmFmYWNlID0gTlVMTDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyB0aGUgTWFjLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIEZUX05ld19GYWNlLiAgSW4gICAgICAgICovCi0gIC8qICAgIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBGVF9OZXdfRmFjZSgpIGZ1bmN0aW9uYWxpdHksIGl0IGFsc28gICAgICAqLwotICAvKiAgICBhY2NlcHRzIHBhdGhuYW1lcyB0byBNYWMgc3VpdGNhc2UgZmlsZXMuICBGb3IgZnVydGhlciAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9jdW1lbnRhdGlvbiBzZWUgdGhlIG9yaWdpbmFsIEZUX05ld19GYWNlKCkgaW4gZnJlZXR5cGUuaC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwYXRobmFtZSwKLSAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgRlRfRmFjZSogICAgIGFmYWNlICkKLSAgewotICAgIEZUX09wZW5fQXJncyAgYXJnczsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgbGlicmFyeScgYW5kIGBhZmFjZScgZGVsYXllZCB0byBGVF9PcGVuX0ZhY2UoKSAqLwotICAgIGlmICggIXBhdGhuYW1lICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgKmFmYWNlID0gTlVMTDsKLQotICAgIC8qIHRyeSByZXNvdXJjZWZvcmsgYmFzZWQgZm9udDogTFdGTiwgRkZJTCAqLwotICAgIGVycm9yID0gRlRfTmV3X0ZhY2VfRnJvbV9SZXNvdXJjZSggbGlicmFyeSwgKFVJbnQ4ICopcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LCBhZmFjZSApOwotICAgIGlmICggZXJyb3IgfHwgKmFmYWNlICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIGxldCBpdCBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIGxvYWRlciAoLnR0ZiwgLm90ZiwgZXRjLikgKi8KLSAgICBhcmdzLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBhcmdzLnBhdGhuYW1lID0gKGNoYXIqKXBhdGhuYW1lOwotICAgIHJldHVybiBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmIGlzIGlkZW50aWNhbCB0byBGVF9OZXdfRmFjZSBleGNlcHQgaXQgICAgICAgKi8KLSAgLyogICAgYWNjZXB0cyBhbiBGU1JlZiBpbnN0ZWFkIG9mIGEgcGF0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBDYXJib24gZGF0YSB0eXBlcyAoRlNSZWYpICAgICAgICAgKi8KLSAgLyogYXJlIG5vdCBjcm9zcy1wbGF0Zm9ybSwgYW5kIHRodXMgbm90IHN1aXRhYmxlIGZvciB0aGUgZnJlZXR5cGUgQVBJLiAgICovCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU1JlZiogIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgIGFmYWNlICkKLSAgewotCi0jaWYgIUhBVkVfRlNSRUYKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotICAgIEZUX1VOVVNFRCggcmVmICk7Ci0gICAgRlRfVU5VU0VEKCBmYWNlX2luZGV4ICk7Ci0gICAgRlRfVU5VU0VEKCBhZmFjZSApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLQotI2Vsc2UKLQotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotICAgIE9TRXJyICAgZXJyOwotICAgIFVJbnQ4ICAgcGF0aG5hbWVbUEFUSF9NQVhdOwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgbGlicmFyeScgYW5kIGBhZmFjZScgZGVsYXllZCB0byBgRlRfT3Blbl9GYWNlJyAqLwotCi0gICAgaWYgKCAhcmVmICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyID0gRlNSZWZNYWtlUGF0aCggcmVmLCBwYXRobmFtZSwgc2l6ZW9mICggcGF0aG5hbWUgKSApOwotICAgIGlmICggZXJyICkKLSAgICAgIGVycm9yID0gRlRfRVJSKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX1Jlc291cmNlKCBsaWJyYXJ5LCBwYXRobmFtZSwgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgICBpZiAoIGVycm9yIHx8ICphZmFjZSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBmYWxsYmFjayB0byBkYXRhZm9yayBmb250ICovCi0gICAgYXJncy5mbGFncyAgICA9IEZUX09QRU5fUEFUSE5BTUU7Ci0gICAgYXJncy5wYXRobmFtZSA9IChjaGFyKilwYXRobmFtZTsKLSAgICByZXR1cm4gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmYXJncywgZmFjZV9pbmRleCwgYWZhY2UgKTsKLQotI2VuZGlmIC8qIEhBVkVfRlNSRUYgKi8KLQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyBpcyBpZGVudGljYWwgdG8gRlRfTmV3X0ZhY2UgZXhjZXB0IGl0ICAgICAgKi8KLSAgLyogICAgYWNjZXB0cyBhbiBGU1NwZWMgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBDYXJib24gZGF0YSB0eXBlcyAoRlNTcGVjKSAgICAgICAgKi8KLSAgLyogYXJlIG5vdCBjcm9zcy1wbGF0Zm9ybSwgYW5kIHRodXMgbm90IHN1aXRhYmxlIGZvciB0aGUgZnJlZXR5cGUgQVBJLiAgICovCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMoIEZUX0xpYnJhcnkgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU1NwZWMqICBzcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgICAgIGFmYWNlICkKLSAgewotCi0jaWYgSEFWRV9GU1JFRgotCi0gICAgRlNSZWYgIHJlZjsKLQotCi0gICAgaWYgKCAhc3BlYyB8fCBGU3BNYWtlRlNSZWYoIHNwZWMsICZyZWYgKSAhPSBub0VyciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiggbGlicmFyeSwgJnJlZiwgZmFjZV9pbmRleCwgYWZhY2UgKTsKLQotI2VsaWYgSEFWRV9GU1NQRUMKLQotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotICAgIE9TRXJyICAgICAgICAgZXJyOwotICAgIFVJbnQ4ICAgICAgICAgcGF0aG5hbWVbUEFUSF9NQVhdOwotCi0KLSAgICBpZiAoICFzcGVjICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyID0gRlRfRlNwTWFrZVBhdGgoIHNwZWMsIHBhdGhuYW1lLCBzaXplb2YgKCBwYXRobmFtZSApICk7Ci0gICAgaWYgKCBlcnIgKQotICAgICAgZXJyb3IgPSBGVF9FUlIoIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0KLSAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fUmVzb3VyY2UoIGxpYnJhcnksIHBhdGhuYW1lLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICAgIGlmICggZXJyb3IgfHwgKmFmYWNlICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIGZhbGxiYWNrIHRvIGRhdGFmb3JrIGZvbnQgKi8KLSAgICBhcmdzLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBhcmdzLnBhdGhuYW1lID0gKGNoYXIqKXBhdGhuYW1lOwotICAgIHJldHVybiBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotCi0jZWxzZQotCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0gICAgRlRfVU5VU0VEKCBzcGVjICk7Ci0gICAgRlRfVU5VU0VEKCBmYWNlX2luZGV4ICk7Ci0gICAgRlRfVU5VU0VEKCBhZmFjZSApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLQotI2VuZGlmIC8qIEhBVkVfRlNSRUYsIEhBVkVfRlNTUEVDICovCi0KLSAgfQotCi0jZW5kaWYgLyogRlRfTUFDSU5UT1NIICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9idWlsZHMvbW9kdWxlcy5tayBiL2J1aWxkcy9tb2R1bGVzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlkNTc5Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy9tb2R1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIG1vZHVsZXMgc3ViLU1ha2VmaWxlCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIERPIE5PVCBJTlZPS0UgVEhJUyBNQUtFRklMRSBESVJFQ1RMWSEgIElUIElTIE1FQU5UIFRPIEJFIElOQ0xVREVEIEJZCi0jIE9USEVSIE1BS0VGSUxFUy4KLQotCi0jIFRoaXMgZmlsZSBpcyBpbiBjaGFyZ2Ugb2YgaGFuZGxpbmcgdGhlIGdlbmVyYXRpb24gb2YgdGhlIG1vZHVsZXMgbGlzdAotIyBmaWxlLgotCi0KLSMgQnVpbGQgdGhlIG1vZHVsZXMgbGlzdC4KLSMKLSQoRlRNT0RVTEVfSCk6ICQoTU9EVUxFU19DRkcpCi0JJChGVE1PRFVMRV9IX0lOSVQpCi0JJChGVE1PRFVMRV9IX0NSRUFURSkKLQkkKEZUTU9EVUxFX0hfRE9ORSkKLQotaWZuZXEgKCQoZmluZHN0cmluZyAkKFBMQVRGT1JNKSxkb3Mgd2luZG93cyBvczIpLCkKLSAgT1BFTl9NT0RVTEUgICA6PSBAZWNobyQoc3BhY2UpCi0gIENMT1NFX01PRFVMRSAgOj0gID4+ICQoc3Vic3QgLywkKFNFUCksJChGVE1PRFVMRV9IKSkKLSAgUkVNT1ZFX01PRFVMRSA6PSBALSQoREVMRVRFKSAkKHN1YnN0IC8sJChTRVApLCQoRlRNT0RVTEVfSCkpCi1lbHNlCi0gIE9QRU5fTU9EVUxFICAgOj0gQGVjaG8gIgotICBDTE9TRV9NT0RVTEUgIDo9ICIgPj4gJChGVE1PRFVMRV9IKQotICBSRU1PVkVfTU9EVUxFIDo9IEAtJChERUxFVEUpICQoRlRNT0RVTEVfSCkKLWVuZGlmCi0KLQotZGVmaW5lIEZUTU9EVUxFX0hfSU5JVAotJChSRU1PVkVfTU9EVUxFKQotQC1lY2hvIEdlbmVyYXRpbmcgbW9kdWxlcyBsaXN0IGluICQoRlRNT0RVTEVfSCkuLi4KLSQoT1BFTl9NT0RVTEUpLyogVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlLiAqLyQoQ0xPU0VfTU9EVUxFKQotZW5kZWYKLQotIyBJdCBpcyBubyBtaXN0YWtlIHRoYXQgdGhlIGZpbmFsIGNsb3NpbmcgcGFyZW50aGVzaXMgaXMgb24gdGhlCi0jIG5leHQgbGluZSAtLSBpdCBwcm9kdWNlcyBwcm9wZXIgbmV3bGluZXMgZHVyaW5nIHRoZSBleHBhbnNpb24KLSMgb2YgYGZvcmVhY2gnLgotIwotZGVmaW5lIEZUTU9EVUxFX0hfQ1JFQVRFCi0kKGZvcmVhY2ggQ09NTUFORCwkKEZUTU9EVUxFX0hfQ09NTUFORFMpLCQoJChDT01NQU5EKSkKLSkKLWVuZGVmCi0KLWRlZmluZSBGVE1PRFVMRV9IX0RPTkUKLSQoT1BFTl9NT0RVTEUpLyogRU9GICovJChDTE9TRV9NT0RVTEUpCi1AZWNobyBkb25lLgotZW5kZWYKLQotCi0jICQoT1BFTl9EUklWRVIpICYgJChDTE9TRV9EUklWRVIpIGFyZSB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBmb250IGRyaXZlcgotIyBpbiB0aGUgYG1vZHVsZS5taycgcnVsZXMgZmlsZS4KLSMKLU9QRU5fRFJJVkVSICA6PSAkKE9QRU5fTU9EVUxFKUZUX1VTRV9NT0RVTEUoCi1DTE9TRV9EUklWRVIgOj0gKSQoQ0xPU0VfTU9EVUxFKQotCi1FQ0hPX0RSSVZFUiAgICAgIDo9IEBlY2hvICIqIG1vZHVsZTokKHNwYWNlKQotRUNIT19EUklWRVJfREVTQyA6PSAoCi1FQ0hPX0RSSVZFUl9ET05FIDo9ICkiCi0KLSMgRWFjaCBgbW9kdWxlLm1rJyBpbiB0aGUgYHNyYy8qJyBzdWJkaXJlY3RvcmllcyBhZGRzIGEgdmFyaWFibGUgd2l0aAotIyBjb21tYW5kcyB0byAkKEZUTU9EVUxFX0hfQ09NTUFORFMpLiAgTm90ZSB0aGF0IHdlIGNhbid0IHVzZSBTUkNfRElSIGhlcmUuCi0jCi0taW5jbHVkZSAkKHBhdHN1YnN0ICUsJChUT1BfRElSKS9zcmMvJS9tb2R1bGUubWssJChNT0RVTEVTKSkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL25ld2xpbmUgYi9idWlsZHMvbmV3bGluZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxMzc4OS4uMDAwMDAwMAotLS0gYS9idWlsZHMvbmV3bGluZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQpkaWZmIC0tZ2l0IGEvYnVpbGRzL29zMi9kZXRlY3QubWsgYi9idWlsZHMvb3MyL2RldGVjdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhNjhmYi4uMDAwMDAwMAotLS0gYS9idWlsZHMvb3MyL2RldGVjdC5taworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIGZpbGUgdG8gZGV0ZWN0IGFuIE9TLzIgaG9zdCBwbGF0Zm9ybS4KLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLS5QSE9OWTogc2V0dXAKLQotCi1pZmVxICgkKFBMQVRGT1JNKSxhbnNpKQotCi0gIGlmZGVmIE9TMl9TSEVMTAotCi0gICAgUExBVEZPUk0gOj0gb3MyCi0KLSAgZW5kaWYgIyB0ZXN0IE9TMl9TSEVMTAotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksb3MyKQotCi0gIENPUFkgICA6PSBjb3B5Ci0gIERFTEVURSA6PSBkZWwKLSAgQ0FUICAgIDo9IHR5cGUKLSAgU0VQICAgIDo9ICQoQkFDS1NMQVNIKQotCi0gICMgZ2NjLWVteCBieSBkZWZhdWx0Ci0gIENPTkZJR19GSUxFIDo9IG9zMi1nY2MubWsKLQotICAjIGFkZGl0aW9uYWxseSwgd2UgcHJvdmlkZSBob29rcyBmb3IgdmFyaW91cyBvdGhlciBjb21waWxlcnMKLSAgIwotICBpZm5lcSAoJChmaW5kc3RyaW5nIHZpc3VhbGFnZSwkKE1BS0VDTURHT0FMUykpLCkgICAgICMgVmlzdWFsIEFnZSBDKysKLSAgICBDT05GSUdfRklMRSA6PSBvczItaWNjLm1rCi0gICAgQ0MgICAgICAgICAgOj0gaWNjCi0gICAgdmlzdWFsYWdlOiBzZXR1cAotICAgIC5QSE9OWTogdmlzdWFsYWdlCi0gIGVuZGlmCi0KLSAgaWZuZXEgKCQoZmluZHN0cmluZyB3YXRjb20sJChNQUtFQ01ER09BTFMpKSwpICAgICAgICAjIFdhdGNvbSBDL0MrKwotICAgIENPTkZJR19GSUxFIDo9IG9zMi13YXQubWsKLSAgICBDQyAgICAgICAgICA6PSB3Y2MzODYKLSAgICB3YXRjb206IHNldHVwCi0gICAgLlBIT05ZOiB3YXRjb20KLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIGJvcmxhbmRjLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICMgQm9ybGFuZCBDKysgMzItYml0Ci0gICAgQ09ORklHX0ZJTEUgOj0gb3MyLWJjYy5tawotICAgIENDICAgICAgICAgIDo9IGJjYzMyCi0gICAgYm9ybGFuZGM6IHNldHVwCi0gICAgLlBIT05ZOiBib3JsYW5kYwotICBlbmRpZgotCi0gIGlmbmVxICgkKGZpbmRzdHJpbmcgZGV2ZWwsJChNQUtFQ01ER09BTFMpKSwpICAgICAgICAgIyBkZXZlbG9wbWVudCB0YXJnZXQKLSAgICBDT05GSUdfRklMRSA6PSBvczItZGV2Lm1rCi0gICAgQ0MgICAgICAgICAgOj0gZ2NjCi0gICAgZGV2ZWw6IHNldHVwCi0gICAgLlBIT05ZOiBkZXZlbAotICBlbmRpZgotCi0gIHNldHVwOiBkb3Nfc2V0dXAKLQotZW5kaWYgICAjIHRlc3QgUExBVEZPUk0gb3MyCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9vczIvb3MyLWRlZi5tayBiL2J1aWxkcy9vczIvb3MyLWRlZi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlNjI2My4uMDAwMDAwMAotLS0gYS9idWlsZHMvb3MyL29zMi1kZWYubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgT1MvMiBzcGVjaWZpYyBkZWZpbml0aW9ucwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotREVMRVRFICAgIDo9IGRlbAotQ0FUICAgICAgIDo9IHR5cGUKLVNFUCAgICAgICA6PSAkKHN0cmlwIFwgKQotQlVJTERfRElSIDo9ICQoVE9QX0RJUikvYnVpbGRzL29zMgotUExBVEZPUk0gIDo9IG9zMgotCi0jIFRoZSBleGVjdXRhYmxlIGZpbGUgZXh0ZW5zaW9uIChmb3IgdG9vbHMpLCAqd2l0aCogbGVhZGluZyBkb3QuCi0jCi1FIDo9IC5leGUKLQotIyBUaGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQuCi0jCi0jIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgJChPQkpfRElSKTsgaG93ZXZlciwgdGhpcyBjYW4gYmUgY2hhbmdlZAotIyB0byBzdWl0IHBhcnRpY3VsYXIgbmVlZHMuCi0jCi1MSUJfRElSIDo9ICQoT0JKX0RJUikKLQotIyBUaGUgbmFtZSBvZiB0aGUgZmluYWwgbGlicmFyeSBmaWxlLiAgTm90ZSB0aGF0IHRoZSBET1Mtc3BlY2lmaWMgTWFrZWZpbGUKLSMgdXNlcyBhIHNob3J0ZXIgKDguMykgbmFtZS4KLSMKLUxJQlJBUlkgOj0gJChQUk9KRUNUKQotCi0KLSMgVGhlIE5PX09VVFBVVCBtYWNybyBpcyB1c2VkIHRvIGlnbm9yZSB0aGUgb3V0cHV0IG9mIGNvbW1hbmRzLgotIwotTk9fT1VUUFVUID0gMj4gbnVsCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy9vczIvb3MyLWRldi5tayBiL2J1aWxkcy9vczIvb3MyLWRldi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyYTI4OS4uMDAwMDAwMAotLS0gYS9idWlsZHMvb3MyL29zMi1kZXYubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBydWxlcyBmb3IgT1MvMiArIEdDQwotIwotIyAgIERldmVsb3BtZW50IHZlcnNpb24gd2l0aG91dCBvcHRpbWl6YXRpb25zLgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotREVWRUxfRElSIDo9ICQoVE9QX0RJUikvZGV2ZWwKLQotIyBpbmNsdWRlIE9TLzItc3BlY2lmaWMgZGVmaW5pdGlvbnMKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvb3MyL29zMi1kZWYubWsKLQotIyBpbmNsdWRlIGdjYy1zcGVjaWZpYyBkZWZpbml0aW9ucwotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci9nY2MtZGV2Lm1rCi0KLSMgaW5jbHVkZSBsaW5raW5nIGluc3RydWN0aW9ucwotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9saW5rX2Rvcy5tawotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvb3MyL29zMi1nY2MubWsgYi9idWlsZHMvb3MyL29zMi1nY2MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZGZmYmEuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL29zMi9vczItZ2NjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGNvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIHRoZSBPUy8yICsgZ2NjCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIGluY2x1ZGUgT1MvMi1zcGVjaWZpYyBkZWZpbml0aW9ucwotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9vczIvb3MyLWRlZi5tawotCi0jIGluY2x1ZGUgZ2NjLXNwZWNpZmljIGRlZmluaXRpb25zCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2NvbXBpbGVyL2djYy5tawotCi0jIGluY2x1ZGUgbGlua2luZyBpbnN0cnVjdGlvbnMKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvbGlua19kb3MubWsKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3N5bWJpYW4vYmxkLmluZiBiL2J1aWxkcy9zeW1iaWFuL2JsZC5pbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODcyMDIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3N5bWJpYW4vYmxkLmluZgorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vCi0vLyBGcmVlVHlwZSAyIHByb2plY3QgZm9yIHRoZSBzeW1iaWFuIHBsYXRmb3JtCi0vLwotCi0vLyBDb3B5cmlnaHQgMjAwOC0yMDE3IGJ5Ci0vLyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0vLwotLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLS8vIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLS8vIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0vLyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotLy8gZnVsbHkuCi0KLVBSSl9QTEFURk9STVMKLURFRkFVTFQKLQotUFJKX01NUEZJTEVTCi1mcmVldHlwZS5tbXAKLQotUFJKX0VYUE9SVFMKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnQyYnVpbGQuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaAljb25maWcvZnRjb25maWcuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaAljb25maWcvZnRoZWFkZXIuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaAljb25maWcvZnRtb2R1bGUuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAljb25maWcvZnRvcHRpb24uaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaAljb25maWcvZnRzdGRsaWIuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oCQlmcmVldHlwZS5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmJveC5oCQkJZnRiYm94LmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRiZGYuaAkJCWZ0YmRmLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaAkJZnRiaXRtYXAuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmgJCWZ0Y2FjaGUuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdGNpZC5oCQkJZnRjaWQuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oCQlmdGVycmRlZi5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmgJCWZ0ZXJyb3JzLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaAkJZnRmbnRmbXQuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaAkJCWZ0Z2FzcC5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaAkJZnRnbHlwaC5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaAkJZnRneHZhbC5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oCQkJZnRnemlwLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRiemlwMi5oCQlmdGJ6aXAyLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oCQlmdGltYWdlLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaAkJZnRpbmNyZW0uaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oCQlmdGxjZGZpbC5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGlzdC5oCQkJZnRsaXN0LmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaAkJCWZ0bHp3LmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaAkJCWZ0bWFjLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oCQkJZnRtbS5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmgJCWZ0bW9kYXBpLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RlcnIuaAkJZnRtb2RlcnIuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgJCWZ0b3R2YWwuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmgJCWZ0b3V0bG4uaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdHBmci5oCQkJZnRwZnIuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oCQlmdHJlbmRlci5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaAkJZnRzaXplcy5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmgJCWZ0c25hbWVzLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaAkJZnRzdHJva2UuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdHN5bnRoLmgJCWZ0c3ludGguaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9mdHN5c3RlbS5oCQlmdHN5c3RlbS5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmgJCWZ0dHJpZ29uLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oCQlmdHR5cGVzLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvZnR3aW5mbnQuaAkJZnR3aW5mbnQuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oCQl0MXRhYmxlcy5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmgJCXR0bmFtZWlkLmgKLS4uLy4uL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaAkJdHR0YWJsZXMuaAotLi4vLi4vaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaAkJCXR0dGFncy5oCi0uLi8uLi9pbmNsdWRlL2ZyZWV0eXBlL3R0dW5wYXQuaAkJdHR1bnBhdC5oCmRpZmYgLS1naXQgYS9idWlsZHMvc3ltYmlhbi9mcmVldHlwZS5tbXAgYi9idWlsZHMvc3ltYmlhbi9mcmVldHlwZS5tbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTczMzMuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3N5bWJpYW4vZnJlZXR5cGUubW1wCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vCi0vLyBGcmVlVHlwZSAyIG1ha2VmaWxlIGZvciB0aGUgc3ltYmlhbiBwbGF0Zm9ybQotLy8KLQotLy8gQ29weXJpZ2h0IDIwMDgtMjAxNyBieQotLy8gRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotLy8KLS8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0vLyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0vLyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotLy8gaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLS8vIGZ1bGx5LgotCi10YXJnZXQgCQkJZnJlZXR5cGUubGliCi10YXJnZXR0eXBlIAkJbGliCi0KLW1hY3JvIE5ERUJVRwotbWFjcm8gRlQyX0JVSUxEX0xJQlJBUlkKLQotc291cmNlcGF0aCAuLlwuLlxzcmNcYXV0b2ZpdAotCi1zb3VyY2UgYXV0b2ZpdC5jCi0KLXNvdXJjZXBhdGggLi5cLi5cc3JjXGJhc2UKLQotc291cmNlIGZ0YmFzZS5jCi1zb3VyY2UgZnRiYm94LmMKLXNvdXJjZSBmdGJkZi5jCi1zb3VyY2UgZnRiaXRtYXAuYwotc291cmNlIGZ0Y2lkLmMKLXNvdXJjZSBmdGZudGZtdC5jCi1zb3VyY2UgZnRmc3R5cGUuYwotc291cmNlIGZ0Z2FzcC5jCi1zb3VyY2UgZnRnbHlwaC5jCi1zb3VyY2UgZnRneHZhbC5jCi1zb3VyY2UgZnRpbml0LmMKLXNvdXJjZSBmdGxjZGZpbC5jCi1zb3VyY2UgZnRtbS5jCi1zb3VyY2UgZnRvdHZhbC5jCi1zb3VyY2UgZnRwYXRlbnQuYwotc291cmNlIGZ0cGZyLmMKLXNvdXJjZSBmdHN0cm9rZS5jCi1zb3VyY2UgZnRzeW50aC5jCi1zb3VyY2UgZnRzeXN0ZW0uYwotc291cmNlIGZ0dHlwZTEuYwotc291cmNlIGZ0d2luZm50LmMKLQotc291cmNlcGF0aCAuLlwuLlxzcmNcYmRmCi0KLXNvdXJjZSBiZGYuYwotCi1zb3VyY2VwYXRoIC4uXC4uXHNyY1xjYWNoZQotCi1zb3VyY2UgZnRjYWNoZS5jCi0KLXNvdXJjZXBhdGggLi5cLi5cc3JjXGNmZgotCi1zb3VyY2UgY2ZmLmMKLQotc291cmNlcGF0aCAuLlwuLlxzcmNcY2lkCi0KLXNvdXJjZSB0eXBlMWNpZC5jCi0KLXNvdXJjZXBhdGggLi5cLi5cc3JjXGd6aXAKLQotc291cmNlIGZ0Z3ppcC5jCi0KLXNvdXJjZXBhdGggLi5cLi5cc3JjXGJ6aXAyCi0KLXNvdXJjZSBmdGJ6aXAyLmMKLQotc291cmNlcGF0aCAuLlwuLlxzcmNcbHp3Ci0KLXNvdXJjZSBmdGx6dy5jCi0KLXNvdXJjZXBhdGggLi5cLi5cc3JjXHBjZgotCi1zb3VyY2UgcGNmLmMKLQotc291cmNlcGF0aCAuLlwuLlxzcmNccGZyCi0KLXNvdXJjZSBwZnIuYwotCi1zb3VyY2VwYXRoIC4uXC4uXHNyY1xwc2F1eAotCi1zb3VyY2UgcHNhdXguYwotCi1zb3VyY2VwYXRoIC4uXC4uXHNyY1xwc2hpbnRlcgotCi1zb3VyY2UgcHNoaW50ZXIuYwotCi1zb3VyY2VwYXRoIC4uXC4uXHNyY1xwc25hbWVzCi0KLXNvdXJjZSBwc21vZHVsZS5jCi0KLXNvdXJjZXBhdGggLi5cLi5cc3JjXHJhc3RlcgotCi1zb3VyY2UgcmFzdGVyLmMKLQotc291cmNlcGF0aCAuLlwuLlxzcmNcc2ZudAotCi1zb3VyY2Ugc2ZudC5jCi0KLXNvdXJjZXBhdGggLi5cLi5cc3JjXHNtb290aAotCi1zb3VyY2Ugc21vb3RoLmMKLQotc291cmNlcGF0aCAuLlwuLlxzcmNcdHJ1ZXR5cGUKLQotc291cmNlIHRydWV0eXBlLmMKLQotc291cmNlcGF0aCAuLlwuLlxzcmNcdHlwZTEKLQotc291cmNlIHR5cGUxLmMKLQotc291cmNlcGF0aCAuLlwuLlxzcmNcdHlwZTQyCi0KLXNvdXJjZSB0eXBlNDIuYwotCi1zb3VyY2VwYXRoIC4uXC4uXHNyY1x3aW5mb250cwotCi1zb3VyY2Ugd2luZm50LmMKLQotCi1zeXN0ZW1pbmNsdWRlCQkuLlwuLlxpbmNsdWRlCi1zeXN0ZW1pbmNsdWRlCQlcZXBvYzMyXGluY2x1ZGVcc3RkYXBpcwotdXNlcmluY2x1ZGUJCS4uXC4uXHNyY1xhdXRvZml0Ci11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXGJkZgotdXNlcmluY2x1ZGUJCS4uXC4uXHNyY1xjYWNoZQotdXNlcmluY2x1ZGUJCS4uXC4uXHNyY1xjZmYKLXVzZXJpbmNsdWRlCQkuLlwuLlxzcmNcY2lkCi11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXGd4dmFsaWQKLXVzZXJpbmNsdWRlCQkuLlwuLlxzcmNcZ3ppcAotdXNlcmluY2x1ZGUJCS4uXC4uXHNyY1xiemlwMgotdXNlcmluY2x1ZGUJCS4uXC4uXHNyY1xsencKLXVzZXJpbmNsdWRlCQkuLlwuLlxzcmNcb3R2YWxpZAotdXNlcmluY2x1ZGUJCS4uXC4uXHNyY1xwY2YKLXVzZXJpbmNsdWRlCQkuLlwuLlxzcmNccGZyCi11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXHBzYXV4Ci11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXHBzaGludGVyCi11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXHBzbmFtZXMKLXVzZXJpbmNsdWRlCQkuLlwuLlxzcmNccmFzdGVyCi11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXHNmbnQKLXVzZXJpbmNsdWRlCQkuLlwuLlxzcmNcc21vb3RoCi11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXHRydWV0eXBlCi11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXHR5cGUxCi11c2VyaW5jbHVkZQkJLi5cLi5cc3JjXHR5cGU0MgotdXNlcmluY2x1ZGUJCS4uXC4uXHNyY1x3aW5mb250cwpkaWZmIC0tZ2l0IGEvYnVpbGRzL3RvcGxldmVsLm1rIGIvYnVpbGRzL3RvcGxldmVsLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjFkMDNiLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy90b3BsZXZlbC5taworKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0jCi0jIEZyZWVUeXBlIGJ1aWxkIHN5c3RlbSAtLSB0b3AtbGV2ZWwgc3ViLU1ha2VmaWxlCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIFRoaXMgZmlsZSBpcyBkZXNpZ25lZCBmb3IgR05VIE1ha2UsIGRvIG5vdCB1c2UgaXQgd2l0aCBhbm90aGVyIE1ha2UgdG9vbCEKLSMKLSMgSXQgd29ya3MgYXMgZm9sbG93czoKLSMKLSMgLSBXaGVuIGludm9rZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCB0aGlzIE1ha2VmaWxlIGluY2x1ZGVzIHRoZSBydWxlcyBmb3VuZAotIyAgIGluIGBQUk9KRUNUL2J1aWxkcy9kZXRlY3QubWsnLiAgVGhleSBhcmUgaW4gY2hhcmdlIG9mIGRldGVjdGluZyB0aGUKLSMgICBjdXJyZW50IHBsYXRmb3JtLgotIwotIyAgIEEgc3VtbWFyeSBvZiB0aGUgZGV0ZWN0aW9uIGlzIGRpc3BsYXllZCwgYW5kIHRoZSBmaWxlIGBjb25maWcubWsnIGlzCi0jICAgY3JlYXRlZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0jCi0jIC0gV2hlbiBpbnZva2VkIGxhdGVyLCB0aGlzIE1ha2VmaWxlIGluY2x1ZGVzIHRoZSBydWxlcyBmb3VuZCBpbgotIyAgIGBjb25maWcubWsnLiAgVGhpcyBzdWItTWFrZWZpbGUgZGVmaW5lcyBzb21lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMKLSMgICAobGlrZSBjb21waWxlciwgY29tcGlsYXRpb24gZmxhZ3MsIG9iamVjdCBzdWZmaXgsIGV0Yy4pLCB0aGVuIGluY2x1ZGVzCi0jICAgdGhlIHJ1bGVzIGZvdW5kIGluIGBQUk9KRUNUL2J1aWxkcy9QUk9KRUNULm1rJywgdXNlZCB0byBidWlsZCB0aGUKLSMgICBsaWJyYXJ5LgotIwotIyBTZWUgdGhlIGNvbW1lbnRzIGluIGBidWlsZHMvZGV0ZWN0Lm1rJyBhbmQgYGJ1aWxkcy9QUk9KRUNULm1rJyBmb3IgbW9yZQotIyBkZXRhaWxzIG9uIGhvc3QgcGxhdGZvcm0gZGV0ZWN0aW9uIGFuZCBsaWJyYXJ5IGJ1aWxkcy4KLQotCi0jIEZpcnN0IG9mIGFsbCwgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGAkKHZhbHVlIC4uLiknLiAgV2UgZG8gdGhpcyBieSB0ZXN0aW5nCi0jIGZvciBgJChldmFsIC4uLiknIHdoaWNoIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gdGhlIHNhbWUgR05VIG1ha2UgdmVyc2lvbi4KLQotZXZhbF9hdmFpbGFibGUgOj0KLSQoZXZhbCBldmFsX2F2YWlsYWJsZSA6PSBUKQotaWZuZXEgKCQoZXZhbF9hdmFpbGFibGUpLFQpCi0gICQoZXJyb3IgRnJlZVR5cGUncyBidWlsZCBzeXN0ZW0gbmVlZHMgYSBNYWtlIHByb2dyYW0gd2hpY2ggc3VwcG9ydHMgJCQodmFsdWUpKQotZW5kaWYKLQotCi0uUEhPTlk6IGFsbCBkaXN0IGRpc3RjbGVhbiBtb2R1bGVzIHNldHVwCi0KLQotIyBUaGUgYHNwYWNlJyB2YXJpYWJsZSBpcyB1c2VkIHRvIGF2b2lkIHRyYWlsaW5nIHNwYWNlcyBpbiBkZWZpbmluZyB0aGUKLSMgYFQnIHZhcmlhYmxlIGxhdGVyLgotIwotZW1wdHkgOj0KLXNwYWNlIDo9ICQoZW1wdHkpICQoZW1wdHkpCi0KLQotIyBUaGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGUsIGRlZmluaW5nIHRoZSBgWFhYX01PRFVMRVMnIHZhcmlhYmxlcy4gIFdlCi0jIHByZWZlciBhIGBtb2R1bGVzLmNmZycgZmlsZSBpbiBPQkpfRElSIG92ZXIgVE9QX0RJUi4KLSMKLWlmbmRlZiBNT0RVTEVTX0NGRwotICBNT0RVTEVTX0NGRyA6PSAkKFRPUF9ESVIpL21vZHVsZXMuY2ZnCi0gIGlmbmVxICgkKHdpbGRjYXJkICQoT0JKX0RJUikvbW9kdWxlcy5jZmcpLCkKLSAgICBNT0RVTEVTX0NGRyA6PSAkKE9CSl9ESVIpL21vZHVsZXMuY2ZnCi0gIGVuZGlmCi1lbmRpZgotCi0KLSMgRlRNT0RVTEVfSCwgYXMgaXRzIG5hbWUgc3VnZ2VzdHMsIGluZGljYXRlcyB3aGVyZSB0aGUgRnJlZVR5cGUgbW9kdWxlCi0jIGNsYXNzIGZpbGUgcmVzaWRlcy4KLSMKLUZUTU9EVUxFX0ggPz0gJChPQkpfRElSKS9mdG1vZHVsZS5oCi0KLQotaW5jbHVkZSAkKE1PRFVMRVNfQ0ZHKQotCi0KLSMgVGhlIGxpc3Qgb2YgbW9kdWxlcyB3ZSBhcmUgdXNpbmcuCi0jCi1NT0RVTEVTIDo9ICQoRk9OVF9NT0RVTEVTKSAgICBcCi0gICAgICAgICAgICQoSElOVElOR19NT0RVTEVTKSBcCi0gICAgICAgICAgICQoUkFTVEVSX01PRFVMRVMpICBcCi0gICAgICAgICAgICQoQVVYX01PRFVMRVMpCi0KLQotQ09ORklHX01LID89IGNvbmZpZy5tawotCi0jIElmIG5vIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlIGlzIHByZXNlbnQsIG9yIGlmIGBzZXR1cCcgaXMgdGhlIHRhcmdldAotIyB0byBiZSBidWlsdCwgcnVuIHRoZSBhdXRvLWRldGVjdGlvbiBydWxlcyB0byBmaWd1cmUgb3V0IHdoaWNoCi0jIGNvbmZpZ3VyYXRpb24gcnVsZXMgZmlsZSB0byB1c2UuCi0jCi0jIE5vdGUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIHB1dCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIHdoaWNoIGlzCi0jIG5vdCBuZWNlc3NhcmlseSAkKFRPUF9ESVIpLgotCi0jIElmIGBjb25maWcubWsnIGlzIG5vdCBwcmVzZW50LCBzZXQgYGNoZWNrX3BsYXRmb3JtJy4KLSMKLWlmZXEgKCQod2lsZGNhcmQgJChDT05GSUdfTUspKSwpCi0gIGNoZWNrX3BsYXRmb3JtIDo9IDEKLWVuZGlmCi0KLSMgSWYgYHNldHVwJyBpcyBvbmUgb2YgdGhlIHRhcmdldHMgcmVxdWVzdGVkLCBzZXQgYGNoZWNrX3BsYXRmb3JtJy4KLSMKLWlmbmVxICgkKGZpbmRzdHJpbmcgc2V0dXAsJChNQUtFQ01ER09BTFMpKSwpCi0gIGNoZWNrX3BsYXRmb3JtIDo9IDEKLWVuZGlmCi0KLSMgSW5jbHVkZSB0aGUgYXV0b21hdGljIGhvc3QgcGxhdGZvcm0gZGV0ZWN0aW9uIHJ1bGVzIHdoZW4gd2UgbmVlZCB0bwotIyBjaGVjayB0aGUgcGxhdGZvcm0uCi0jCi1pZmRlZiBjaGVja19wbGF0Zm9ybQotCi0gIGFsbCBtb2R1bGVzOiBzZXR1cAotCi0gIGluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvZGV0ZWN0Lm1rCi0KLSAgIyBUaGlzIHJ1bGUgbWFrZXMgc2Vuc2UgZm9yIFVuaXggb25seSB0byByZW1vdmUgZmlsZXMgY3JlYXRlZCBieSBhIHJ1biBvZgotICAjIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoaWNoIGhhc24ndCBiZWVuIHN1Y2Nlc3NmdWwgKHNvIHRoYXQgbm8KLSAgIyBgY29uZmlnLm1rJyBoYXMgYmVlbiBjcmVhdGVkKS4gIEl0IHVzZXMgdGhlIGJ1aWx0LWluICQoUk0pIGNvbW1hbmQgb2YKLSAgIyBHTlUgbWFrZS4gIFNpbWlsYXJseSwgYG51bCcgaXMgY3JlYXRlZCBpZiBlLmcuIGBtYWtlIHNldHVwIHdpbmRvd3MnIGhhcwotICAjIGJlZW4gZXJyb25lb3VzbHkgdXNlZC4KLSAgIwotICAjIE5vdGU6IFRoaXMgdGVzdCBpcyBkdXBsaWNhdGVkIGluIGBidWlsZHMvdW5peC9kZXRlY3QubWsnLgotICAjCi0gIGlzX3VuaXggOj0gJChzdHJpcCAkKHdpbGRjYXJkIC9zYmluL2luaXQpIFwKLSAgICAgICAgICAgICAgICAgICAgICQod2lsZGNhcmQgL3Vzci9zYmluL2luaXQpIFwKLSAgICAgICAgICAgICAgICAgICAgICQod2lsZGNhcmQgL2Rldi9udWxsKSBcCi0gICAgICAgICAgICAgICAgICAgICAkKHdpbGRjYXJkIC9odXJkL2F1dGgpKQotICBpZm5lcSAoJChpc191bml4KSwpCi0KLSAgICBkaXN0Y2xlYW46Ci0JICAkKFJNKSBidWlsZHMvdW5peC9jb25maWcuY2FjaGUKLQkgICQoUk0pIGJ1aWxkcy91bml4L2NvbmZpZy5sb2cKLQkgICQoUk0pIGJ1aWxkcy91bml4L2NvbmZpZy5zdGF0dXMKLQkgICQoUk0pIGJ1aWxkcy91bml4L3VuaXgtZGVmLm1rCi0JICAkKFJNKSBidWlsZHMvdW5peC91bml4LWNjLm1rCi0JICAkKFJNKSBidWlsZHMvdW5peC9mcmVldHlwZTIucGMKLQkgICQoUk0pIG51bAotCi0gIGVuZGlmICMgdGVzdCBpc191bml4Ci0KLSAgIyBJTVBPUlRBTlQ6Ci0gICMKLSAgIyBgc2V0dXAnIG11c3QgYmUgZGVmaW5lZCBieSB0aGUgaG9zdCBwbGF0Zm9ybSBkZXRlY3Rpb24gcnVsZXMgdG8gY3JlYXRlCi0gICMgdGhlIGBjb25maWcubWsnIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCi1lbHNlCi0KLSAgIyBBIGNvbmZpZ3VyYXRpb24gc3ViLU1ha2VmaWxlIGlzIHByZXNlbnQgLS0gc2ltcGx5IHJ1biBpdC4KLSAgIwotICBhbGw6IHNpbmdsZQotCi0gIEJVSUxEX1BST0pFQ1QgOj0geWVzCi0gIGluY2x1ZGUgJChDT05GSUdfTUspCi0KLWVuZGlmICMgdGVzdCBjaGVja19wbGF0Zm9ybQotCi0KLSMgV2UgYWx3YXlzIG5lZWQgdGhlIGxpc3Qgb2YgbW9kdWxlcyBpbiBmdG1vZHVsZS5oLgotIwotYWxsIHNldHVwOiAkKEZUTU9EVUxFX0gpCi0KLQotIyBUaGUgYG1vZHVsZXMnIHRhcmdldCB1bmNvbmRpdGlvbmFsbHkgcmVidWlsZHMgdGhlIG1vZHVsZSBsaXN0LgotIwotbW9kdWxlczoKLQkkKEZUTU9EVUxFX0hfSU5JVCkKLQkkKEZUTU9EVUxFX0hfQ1JFQVRFKQotCSQoRlRNT0RVTEVfSF9ET05FKQotCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL21vZHVsZXMubWsKLQotCi0jIGdldCBGcmVlVHlwZSB2ZXJzaW9uIHN0cmluZywgdXNpbmcgYQotIyBwb29yIG1hbidzIGBzZWQnIGVtdWxhdGlvbiB3aXRoIG1ha2UncyBidWlsdC1pbiBzdHJpbmcgZnVuY3Rpb25zCi0jCi13b3JrIDo9ICQoc3RyaXAgJChzaGVsbCAkKENBVCkgJChUT1BfRElSKS9pbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmgpKQotd29yayA6PSAkKHN1YnN0IHwseCwkKHdvcmspKQotd29yayA6PSAkKHN1YnN0ICQoc3BhY2UpLHwsJCh3b3JrKSkKLXdvcmsgOj0gJChzdWJzdCBcI2RlZmluZXxGUkVFVFlQRV9NQUpPUnwsJChzcGFjZSksJCh3b3JrKSkKLXdvcmsgOj0gJCh3b3JkIDIsJCh3b3JrKSkKLW1ham9yIDo9ICQoc3Vic3QgfCwkKHNwYWNlKSwkKHdvcmspKQotbWFqb3IgOj0gJChmaXJzdHdvcmQgJChtYWpvcikpCi0KLXdvcmsgOj0gJChzdWJzdCBcI2RlZmluZXxGUkVFVFlQRV9NSU5PUnwsJChzcGFjZSksJCh3b3JrKSkKLXdvcmsgOj0gJCh3b3JkIDIsJCh3b3JrKSkKLW1pbm9yIDo9ICQoc3Vic3QgfCwkKHNwYWNlKSwkKHdvcmspKQotbWlub3IgOj0gJChmaXJzdHdvcmQgJChtaW5vcikpCi0KLXdvcmsgOj0gJChzdWJzdCBcI2RlZmluZXxGUkVFVFlQRV9QQVRDSHwsJChzcGFjZSksJCh3b3JrKSkKLXdvcmsgOj0gJCh3b3JkIDIsJCh3b3JrKSkKLXBhdGNoIDo9ICQoc3Vic3QgfCwkKHNwYWNlKSwkKHdvcmspKQotcGF0Y2ggOj0gJChmaXJzdHdvcmQgJChwYXRjaCkpCi0KLWlmbmVxICgkKGZpbmRzdHJpbmcgeDB4LHgkKHBhdGNoKXgpLCkKLSAgdmVyc2lvbiA6PSAkKG1ham9yKS4kKG1pbm9yKQotICB3aW52ZXJzaW9uIDo9ICQobWFqb3IpJChtaW5vcikKLWVsc2UKLSAgdmVyc2lvbiA6PSAkKG1ham9yKS4kKG1pbm9yKS4kKHBhdGNoKQotICB3aW52ZXJzaW9uIDo9ICQobWFqb3IpJChtaW5vcikkKHBhdGNoKQotZW5kaWYKLQotCi0jIFRoaXMgdGFyZ2V0IGJ1aWxkcyB0aGUgdGFyYmFsbHMuCi0jCi0jIE5vdCB0byBiZSBydW4gYnkgYSBub3JtYWwgdXNlciAtLSB0aGVyZSBhcmUgbm8gYXR0ZW1wdHMgdG8gbWFrZSBpdAotIyBnZW5lcmljLgotCi1kaXN0OgotCS1ybSAtcmYgdG1wCi0Jcm0gLWYgZnJlZXR5cGUtJCh2ZXJzaW9uKS50YXIuZ3oKLQlybSAtZiBmcmVldHlwZS0kKHZlcnNpb24pLnRhci5iejIKLQlybSAtZiBmdCQod2ludmVyc2lvbikuemlwCi0KLQlmb3IgZCBpbiBgZmluZCAuIC13aG9sZW5hbWUgJyovLmdpdCcgLXBydW5lIFwKLQkgICAgICAgICAgICAgICAgIC1vIC10eXBlIGYgXAotCSAgICAgICAgICAgICAgICAgLW8gLXByaW50YCA7IGRvIFwKLQkgIG1rZGlyIC1wIHRtcC8kJGQgOyBcCi0JZG9uZSA7Ci0KLQljdXJyZGlyPWBwd2RgIDsgXAotCWZvciBmIGluIGBmaW5kIC4gLXdob2xlbmFtZSAnKi8uZ2l0JyAtcHJ1bmUgXAotCSAgICAgICAgICAgICAgICAgLW8gLW5hbWUgLmdpdGlnbm9yZSBcCi0JICAgICAgICAgICAgICAgICAtbyAtbmFtZSAubWFpbG1hcCBcCi0JICAgICAgICAgICAgICAgICAtbyAtdHlwZSBkIFwKLQkgICAgICAgICAgICAgICAgIC1vIC1wcmludGAgOyBkbyBcCi0JICBsbiAtcyAkJGN1cnJkaXIvJCRmIHRtcC8kJGYgOyBcCi0JZG9uZQotCi0JQCMgUHJldmVudCBnZW5lcmF0aW9uIG9mIC5weWMgZmlsZXMuICBQeXRob24gZm9sbG93cyAoc29mdCkgbGlua3MgaWYKLQlAIyB0aGUgbGluaydzIGRpcmVjdG9yeSBpcyB3cml0ZSBwcm90ZWN0ZWQsIHNvIHdlIGhhdmUgdGVtcG9yYXJpbHkKLQlAIyBkaXNhYmxlIHdyaXRlIGFjY2VzcyBoZXJlIHRvby4KLQljaG1vZCAtdyBzcmMvdG9vbHMvZG9jbWFrZXIKLQotCWNkIHRtcCA7IFwKLQkkKE1BS0UpIGRldmVsIDsgXAotCSQoTUFLRSkgZG8tZGlzdAotCi0JY2htb2QgK3cgc3JjL3Rvb2xzL2RvY21ha2VyCi0KLQltdiB0bXAgZnJlZXR5cGUtJCh2ZXJzaW9uKQotCi0JdGFyIC1IIHVzdGFyIC1jaGYgLSBmcmVldHlwZS0kKHZlcnNpb24pIFwKLQl8IGd6aXAgLTkgLWMgPiBmcmVldHlwZS0kKHZlcnNpb24pLnRhci5negotCXRhciAtSCB1c3RhciAtY2hmIC0gZnJlZXR5cGUtJCh2ZXJzaW9uKSBcCi0JfCBiemlwMiAtYyA+IGZyZWV0eXBlLSQodmVyc2lvbikudGFyLmJ6MgotCi0JQCMgVXNlIENSL0xGIGZvciB6aXAgZmlsZXMuCi0JemlwIC1scjkgZnQkKHdpbnZlcnNpb24pLnppcCBmcmVldHlwZS0kKHZlcnNpb24pCi0KLQlybSAtZnIgZnJlZXR5cGUtJCh2ZXJzaW9uKQotCi0KLSMgVGhlIGxvY2F0aW9ucyBvZiB0aGUgbGF0ZXN0IGBjb25maWcuZ3Vlc3MnIGFuZCBgY29uZmlnLnN1YicgdmVyc2lvbnMgKGZyb20KLSMgR05VIGBjb25maWcnIGdpdCByZXBvc2l0b3J5KSwgcmVsYXRpdmUgdG8gdGhlIGB0bXAnIGRpcmVjdG9yeSB1c2VkIGR1cmluZwotIyBgbWFrZSBkaXN0Jy4KLSMKLUNPTkZJR19HVUVTUyA9IH4vZ2l0L2NvbmZpZy9jb25maWcuZ3Vlc3MKLUNPTkZJR19TVUIgICA9IH4vZ2l0L2NvbmZpZy9jb25maWcuc3ViCi0KLQotIyBEb24ndCBzYXkgYG1ha2UgZG8tZGlzdCcuICBBbHdheXMgdXNlIGBtYWtlIGRpc3QnIGluc3RlYWQuCi0jCi0uUEhPTlk6IGRvLWRpc3QKLQotZG8tZGlzdDogZGlzdGNsZWFuIHJlZmRvYwotCUAjIFdpdGhvdXQgcmVtb3ZpbmcgdGhlIGZpbGVzLCBgYXV0b2NvbmYnIGFuZCBmcmllbmRzIGZvbGxvdyBsaW5rcy4KLQlybSAtZiBidWlsZHMvdW5peC9hY2xvY2FsLm00Ci0Jcm0gLWYgYnVpbGRzL3VuaXgvY29uZmlndXJlLmFjCi0Jcm0gLWYgYnVpbGRzL3VuaXgvY29uZmlndXJlCi0KLQlzaCBhdXRvZ2VuLnNoCi0Jcm0gLXJmIGJ1aWxkcy91bml4L2F1dG9tNHRlLmNhY2hlCi0KLQljcCAkKENPTkZJR19HVUVTUykgYnVpbGRzL3VuaXgKLQljcCAkKENPTkZJR19TVUIpIGJ1aWxkcy91bml4Ci0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC8uZ2l0aWdub3JlIGIvYnVpbGRzL3VuaXgvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlMGExMi4uMDAwMDAwMAotLS0gYS9idWlsZHMvdW5peC8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotYWNsb2NhbC5tNAotYXV0b200dGUuY2FjaGUKLWNvbmZpZy5jYWNoZQotY29uZmlnLmd1ZXNzCi1jb25maWcubG9nCi1jb25maWcuc3RhdHVzCi1jb25maWcuc3ViCi1jb25maWd1cmUKLWNvbmZpZ3VyZS5hYwotZnJlZXR5cGUyLnBjCi1mcmVldHlwZS1jb25maWcKLWZ0Y29uZmlnLmgKLWluc3RhbGwtc2gKLWxpYnRvb2wKLWx0bWFpbi5zaAotdW5peC1jYy5tawotdW5peC1kZWYubWsKZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgYi9idWlsZHMvdW5peC9jb25maWd1cmUucmF3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjZkZWJlLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMyICswLDAgQEAKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QuCi0jCi0jIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1BQ19JTklUKFtGcmVlVHlwZV0sIFtAVkVSU0lPTkBdLCBbZnJlZXR5cGVAbm9uZ251Lm9yZ10sIFtmcmVldHlwZV0pCi1BQ19DT05GSUdfU1JDRElSKFtmdGNvbmZpZy5pbl0pCi0KLQotIyBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIGBkb2NzL1ZFUlNJT05TLlRYVCchCi0KLXZlcnNpb25faW5mbz0nMjA6MDoxNCcKLUFDX1NVQlNUKFt2ZXJzaW9uX2luZm9dKQotZnRfdmVyc2lvbj1gZWNobyAkdmVyc2lvbl9pbmZvIHwgdHIgOiAuYAotQUNfU1VCU1QoW2Z0X3ZlcnNpb25dKQotCi0KLSMgY2hlY2tzIGZvciBzeXN0ZW0gdHlwZQotCi1BQ19DQU5PTklDQUxfSE9TVAotCi0KLSMgY2hlY2tzIGZvciBwcm9ncmFtcwotCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0NQUAotQUNfU1VCU1QoRVhFRVhUKQotCi1QS0dfUFJPR19QS0dfQ09ORklHKFswLjI0XSkKLQotTFRfSU5JVCh3aW4zMi1kbGwpCi0KLQotIyBjaGVja3MgZm9yIG5hdGl2ZSBwcm9ncmFtcyB0byBnZW5lcmF0ZSBidWlsZGluZyB0b29sCi0KLWlmIHRlc3QgJHtjcm9zc19jb21waWxpbmd9ID0geWVzOyB0aGVuCi0gIEFDX0NIRUNLX1BST0coQ0NfQlVJTEQsICR7YnVpbGR9LWdjYywgJHtidWlsZH0tZ2NjKQotICB0ZXN0IC16ICIke0NDX0JVSUxEfSIgJiYgQUNfQ0hFQ0tfUFJPRyhDQ19CVUlMRCwgZ2NjLCBnY2MpCi0gIHRlc3QgLXogIiR7Q0NfQlVJTER9IiAmJiBBQ19DSEVDS19QUk9HKENDX0JVSUxELCBjYywgY2MsICwgLCAvdXNyL3VjYi9jYykKLSAgdGVzdCAteiAiJHtDQ19CVUlMRH0iICYmIEFDX01TR19FUlJPUihbY2Fubm90IGZpbmQgbmF0aXZlIEMgY29tcGlsZXJdKQotCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIHN1ZmZpeCBvZiBuYXRpdmUgZXhlY3V0YWJsZXNdKQotICBybSAtZiBhLiogYi4qIGFfb3V0LmV4ZSBjb25mdGVzdC4qCi0gIGVjaG8gPiBjb25mdGVzdC5jICJpbnQgbWFpbigpIHsgcmV0dXJuIDA7fSIKLSAgJHtDQ19CVUlMRH0gY29uZnRlc3QuYyB8fCBBQ19NU0dfRVJST1IoW25hdGl2ZSBDIGNvbXBpbGVyIGlzIG5vdCB3b3JraW5nXSkKLSAgcm0gLWYgY29uZnRlc3QuYwotICBpZiB0ZXN0IC14IGEub3V0IC1vIC14IGIub3V0IC1vIC14IGNvbmZ0ZXN0OyB0aGVuCi0gICAgRVhFRVhUX0JVSUxEPSIiCi0gIGVsaWYgdGVzdCAteCBhX291dC5leGUgLW8gLXggY29uZnRlc3QuZXhlOyB0aGVuCi0gICAgRVhFRVhUX0JVSUxEPSIuZXhlIgotICBlbGlmIHRlc3QgLXggY29uZnRlc3QuKjsgdGhlbgotICAgIEVYRUVYVF9CVUlMRD1gZWNobyBjb25mdGVzdC4qIHwgc2VkIC1uICcxcy9eLipcLi8uLydgCi0gIGZpCi0gIHJtIC1mIGEuKiBiLiogYV9vdXQuZXhlIGNvbmZ0ZXN0LioKLSAgQUNfTVNHX1JFU1VMVCgkRVhFRVhUX0JVSUxEKQotZWxzZQotICBDQ19CVUlMRD0ke0NDfQotICBFWEVFWFRfQlVJTEQ9JHtFWEVFWFR9Ci1maQotCi1BQ19TVUJTVChDQ19CVUlMRCkKLUFDX1NVQlNUKEVYRUVYVF9CVUlMRCkKLQotCi0jIFNpbmNlIHRoZXNlIGZpbGVzIHdpbGwgYmUgZXZlbnR1YWxseSBjYWxsZWQgZnJvbSBhbm90aGVyIGRpcmVjdG9yeSAobmFtZWx5Ci0jIGZyb20gdGhlIHRvcCBsZXZlbCkgd2UgbWFrZSB0aGUgcGF0aCBvZiB0aGUgc2NyaXB0cyBhYnNvbHV0ZS4KLSMKLSMgVGhpcyBzbWFsbCBjb2RlIHNuaXBwZXQgaGFzIGJlZW4gdGFrZW4gZnJvbSBhdXRvbWFrZSdzIGB5bHdyYXAnIHNjcmlwdC4KLQotQUNfUFJPR19JTlNUQUxMCi1jYXNlICIkSU5TVEFMTCIgaW4KLVtbXFwvXV0qIHwgPzpbW1xcL11dKikKLSAgOzsKLSpbW1xcL11dKikKLSAgSU5TVEFMTD0iYHB3ZGAvJElOU1RBTEwiCi0gIDs7Ci1lc2FjCi0KLUFDX1BST0dfTUtESVJfUAotY2FzZSAiJE1LRElSX1AiIGluCi1bW1xcL11dKiB8ID86W1tcXC9dXSopCi0gIDs7Ci0qW1tcXC9dXSopCi0gIE1LRElSX1A9ImBwd2RgLyRNS0RJUl9QIgotICA7OwotZXNhYwotCi0KLSMgY2hlY2tzIGZvciBoZWFkZXIgZmlsZXMKLQotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlMoW2ZjbnRsLmggdW5pc3RkLmhdKQotCi0KLSMgY2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcwotCi1BQ19DX0NPTlNUCi1BQ19DSEVDS19TSVpFT0YoW2ludF0pCi1BQ19DSEVDS19TSVpFT0YoW2xvbmddKQotQUNfVFlQRV9MT05HX0xPTkdfSU5UCi0KLQotIyBjaGVjayB3aGV0aGVyIGNwcCBjb21wdXRhdGlvbiBvZiBzaXplIG9mIGludCBhbmQgbG9uZyBpbiBmdGNvbmZpZy5pbiB3b3JrcwotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgY3BwIGNvbXB1dGF0aW9uIG9mIGJpdCBsZW5ndGggaW4gZnRjb25maWcuaW4gd29ya3NdKQotb3JpZ19DUFBGTEFHUz0iJHtDUFBGTEFHU30iCi1DUFBGTEFHUz0iLUkke3NyY2Rpcn0gLUkuICR7Q1BQRkxBR1N9IgotCi1hY19jbGVhbl9maWxlcz0KLWZvciBmIGluIGZ0MmJ1aWxkLmggZnRvcHRpb24uaCBmdHN0ZGxpYi5oOyBkbwotICBpZiB0ZXN0ICEgLWYgJGY7IHRoZW4KLSAgICBhY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRmIgotICAgIHRvdWNoICRmCi0gIGZpCi1kb25lCi0KLWNhdCA+IGNvbmZ0ZXN0LmMgPDxcX0FDRU9GCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggImZ0b3B0aW9uLmgiCi0jZGVmaW5lIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0ggImZ0c3RkbGliLmgiCi0jZGVmaW5lIEZUX1VJTlRfTUFYICBVSU5UX01BWAotI2RlZmluZSBGVF9VTE9OR19NQVggVUxPTkdfTUFYCi0jaW5jbHVkZSAiZnRjb25maWcuaW4iCi1fQUNFT0YKLWVjaG8gPj4gY29uZnRlc3QuYyAiI2lmIEZUX1NJWkVPRl9JTlQgPT0gIiR7YWNfY3Zfc2l6ZW9mX2ludH0KLWVjaG8gPj4gY29uZnRlc3QuYyAiYWNfY3BwX2Z0X3NpemVvZl9pbnQ9IiR7YWNfY3Zfc2l6ZW9mX2ludH0KLWVjaG8gPj4gY29uZnRlc3QuYyAiI2VuZGlmIgotZWNobyA+PiBjb25mdGVzdC5jICIjaWYgRlRfU0laRU9GX0xPTkcgPT0gIiR7YWNfY3Zfc2l6ZW9mX2xvbmd9Ci1lY2hvID4+IGNvbmZ0ZXN0LmMgImFjX2NwcF9mdF9zaXplb2ZfbG9uZz0iJHthY19jdl9zaXplb2ZfbG9uZ30KLWVjaG8gPj4gY29uZnRlc3QuYyAiI2VuZGlmIgotCi0ke0NQUH0gJHtDUFBGTEFHU30gY29uZnRlc3QuYyB8ICR7R1JFUH0gYWNfY3BwX2Z0ID4gY29uZnRlc3Quc2gKLWV2YWwgYGNhdCBjb25mdGVzdC5zaGAKLXJtIC1mIGNvbmZ0ZXN0LiogJGFjX2NsZWFuX2ZpbGVzCi0KLWlmIHRlc3QgeCAhPSAieCR7YWNfY3BwX2Z0X3NpemVvZl9pbnR9IiBcCi0gICAtYSB4ICE9IHgiJHthY19jcHBfZnRfc2l6ZW9mX2xvbmd9IjsgdGhlbgotICB1bnNldCBmdF91c2VfYXV0b2NvbmZfc2l6ZW9mX3R5cGVzCi1lbHNlCi0gIGZ0X3VzZV9hdXRvY29uZl9zaXplb2ZfdHlwZXM9eWVzCi1maQotCi1BQ19BUkdfRU5BQkxFKGJpYXJjaC1jb25maWcsCi1bICAtLWVuYWJsZS1iaWFyY2gtY29uZmlnICBpbnN0YWxsIGJpYXJjaCBmdGNvbmZpZy5oIHRvIHN1cHBvcnQgbXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlcyBieSBzaW5nbGUgZmlsZV0sIFtdLCBbXSkKLQotY2FzZSA6JHtmdF91c2VfYXV0b2NvbmZfc2l6ZW9mX3R5cGVzfToke2VuYWJsZV9iaWFyY2hfY29uZmlnfTogaW4KLSAgOnllczp5ZXM6KQotICAgIEFDX01TR19SRVNVTFQoW2Jyb2tlbiBidXQgdXNlIGl0XSkKLSAgICB1bnNldCBmdF91c2VfYXV0b2NvbmZfc2l6ZW9mX3R5cGVzCi0gICAgOzsKLSAgOjpubzopCi0gICAgQUNfTVNHX1JFU1VMVChbd29ya3MgYnV0IGlnbm9yZSBpdF0pCi0gICAgZnRfdXNlX2F1dG9jb25mX3NpemVvZl90eXBlcz15ZXMKLSAgICA7OwotICA6OnllczogfCA6OjopCi0gICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLSAgICB1bnNldCBmdF91c2VfYXV0b2NvbmZfc2l6ZW9mX3R5cGVzCi0gICAgOzsKLSAgKikKLSAgICBBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgZnRfdXNlX2F1dG9jb25mX3NpemVvZl90eXBlcz15ZXMKLSAgICA7OwotZXNhYwotCi1pZiB0ZXN0IHgiJHtmdF91c2VfYXV0b2NvbmZfc2l6ZW9mX3R5cGVzfSIgPSB4eWVzOyB0aGVuCi0gIEFDX0RFRklORShbRlRfVVNFX0FVVE9DT05GX1NJWkVPRl9UWVBFU10sIFtdLAotICAgICAgICAgICAgW0RlZmluZSBpZiBhdXRvY29uZiBzaXplb2YgdHlwZXMgc2hvdWxkIGJlIHVzZWQuXSkKLWZpCi0KLUNQUEZMQUdTPSIke29yaWdfQ1BQRkxBR1N9IgotCi0KLSMgY2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucwotCi1BQ19TWVNfTEFSR0VGSUxFCi0KLSMgSGVyZSB3ZSBjaGVjayB3aGV0aGVyIHdlIGNhbiB1c2Ugb3VyIG1tYXAgZmlsZSBjb21wb25lbnQuCi0KLUFDX0FSR19FTkFCTEUoW21tYXBdLAotICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLW1tYXBdLAotICAgICAgICAgICAgICAgICBbZG8gbm90IGNoZWNrIG1tYXAoKSBhbmQgZG8gbm90IHVzZV0pLAotICBbZW5hYmxlX21tYXA9Im5vIl0sW2VuYWJsZV9tbWFwPSJ5ZXMiXSkKLWlmIHRlc3QgIngke2VuYWJsZV9tbWFwfSIgIT0gInhubyI7IHRoZW4KLSAgQUNfRlVOQ19NTUFQCi1maQotaWYgdGVzdCAieCR7ZW5hYmxlX21tYXB9IiA9ICJ4bm8iIFwKLSAgIC1vICIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgIT0gInllcyI7IHRoZW4KLSAgRlRTWVNfU1JDPSckKEJBU0VfRElSKS9mdHN5c3RlbS5jJwotZWxzZQotICBGVFNZU19TUkM9JyQoQlVJTERfRElSKS9mdHN5c3RlbS5jJwotCi0gIEFDX0NIRUNLX0RFQ0xTKFttdW5tYXBdLAotICAgIFtdLAotICAgIFtdLAotICAgIFsKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSAgICBdKQotCi0gIEZUX01VTk1BUF9QQVJBTQotZmkKLUFDX1NVQlNUKFtGVFNZU19TUkNdKQotCi1BQ19DSEVDS19GVU5DUyhbbWVtY3B5IG1lbW1vdmVdKQotCi0KLSMgZ2V0IGNvbXBpbGVyIGZsYWdzIHJpZ2h0Ci0jCi0jICAgV2UgdHJ5IHRvIG1ha2UgdGhlIGNvbXBpbGVyIHdvcmsgZm9yIEM4OS1zdHJpY3Qgc291cmNlLiAgRXZlbiBpZiB0aGUKLSMgICBDIGNvbXBpbGVyIGlzIGdjYyBhbmQgQzg5IGZsYWdzIGFyZSBhdmFpbGFibGUsIHNvbWUgc3lzdGVtIGhlYWRlcnMKLSMgICAoZS5nLiwgQW5kcm9pZCBCaW9uaWMgbGliYykgYXJlIGJyb2tlbiBpbiBDODkgbW9kZS4gIFdlIGhhdmUgdG8gY2hlY2sKLSMgICB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiBmaW5pc2hlcyBzdWNjZXNzZnVsbHkuCi0jCi0jICAgRHVlIHRvIGJ1Z3MgaW4gbWluZ3dydCA0LjAuMyB3ZSBkb24ndCB1c2UgYC1hbnNpJyBmb3IgTWluR1cuCi0jCi0jICAgVG8gYXZvaWQgemlsbGlvbnMgb2YKLSMKLSMgICAgIElTTyBDOTAgZG9lcyBub3Qgc3VwcG9ydCAnbG9uZyBsb25nJwotIwotIyAgIHdhcm5pbmdzLCB3ZSBkaXNhYmxlIGAtcGVkYW50aWMnIGZvciBnY2MgdmVyc2lvbiA8IDQuNi4KLSMKLWlmIHRlc3QgIngkR0NDIiA9IHh5ZXM7IHRoZW4KLSAgWFhfQ0ZMQUdTPSItV2FsbCIKLSAgY2FzZSAiJGhvc3QiIGluCi0gICotKi1taW5ndyopCi0gICAgWFhfQU5TSUZMQUdTPSItcGVkYW50aWMiCi0gICAgOzsKLSAgKi0qLWFpeCopCi0gICAgWFhfQU5TSUZMQUdTPSItcGVkYW50aWMiCi0gICAgOzsKLSAgKikKLSAgICBHQ0NfVkVSU0lPTj1gJENDIC1kdW1wdmVyc2lvbmAKLSAgICBHQ0NfTUFKT1I9YGVjaG8gIiRHQ0NfVkVSU0lPTiIgfCBzZWQgJ3MvXChbW14uXV1bW14uXV0qXCkuKi9cMS8nYAotICAgIEdDQ19NSU5PUj1gZWNobyAiJEdDQ19WRVJTSU9OIiB8IHNlZCAncy9bW14uXV1bW14uXV0qLlwoW1teLl1dW1teLl1dKlwpLiovXDEvJ2AKLQotICAgIFhYX1BFREFOVElDPS1wZWRhbnRpYwotICAgIGlmIHRlc3QgJEdDQ19NQUpPUiAtbHQgNDsgdGhlbgotICAgICAgWFhfUEVEQU5USUM9Ci0gICAgZWxzZQotICAgICAgaWYgdGVzdCAkR0NDX01BSk9SIC1lcSA0IC1hICRHQ0NfTUlOT1IgLWx0IDY7IHRoZW4KLSAgICAgICAgWFhfUEVEQU5USUM9Ci0gICAgICBmaQotICAgIGZpCi0KLSAgICBYWF9BTlNJRkxBR1M9IiIKLSAgICBmb3IgYSBpbiAkWFhfUEVEQU5USUMgLWFuc2kKLSAgICBkbwotICAgICAgQUNfTVNHX0NIRUNLSU5HKFtnY2MgY29tcGlsZXIgZmxhZyAke2F9IHRvIGFzc3VyZSBBTlNJIEMgd29ya3MgY29ycmVjdGx5XSkKLSAgICAgIG9yaWdfQ0ZMQUdTPSIke0NGTEFHU30iCi0gICAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAke1hYX0FOU0lGTEFHU30gJHthfSIKLSAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFsKLSAgICAgICAgQUNfTEFOR19QUk9HUkFNKFsKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSAgICAgICAgICBdLAotICAgICAgICAgIFsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwdXRzKCAiIiApOwotICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIF0pXSwKLSAgICAgICAgW0FDX01TR19SRVNVTFQoW29rLCBhZGQgaXQgdG8gWFhfQU5TSUZMQUdTXSkKLSAgICAgICAgIFhYX0FOU0lGTEFHUz0iJHtYWF9BTlNJRkxBR1N9ICR7YX0iCi0gICAgICAgIF0sCi0gICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSkKLSAgICAgIENGTEFHUz0iJHtvcmlnX0NGTEFHU30iCi0gICAgZG9uZQotICAgIDs7Ci0gIGVzYWMKLWVsc2UKLSAgY2FzZSAiJGhvc3QiIGluCi0gICotZGVjLW9zZiopCi0gICAgQ0ZMQUdTPQotICAgIFhYX0NGTEFHUz0iLXN0ZDEgLWczIgotICAgIFhYX0FOU0lGTEFHUz0KLSAgICA7OwotICAqKQotICAgIFhYX0NGTEFHUz0KLSAgICBYWF9BTlNJRkxBR1M9Ci0gICAgOzsKLSAgZXNhYwotZmkKLUFDX1NVQlNUKFtYWF9DRkxBR1NdKQotQUNfU1VCU1QoW1hYX0FOU0lGTEFHU10pCi0KLQotIyBBbGwgbGlicmFyeSB0ZXN0cyBiZWxvdyB0cnkgYHBrZy1jb25maWcnIGZpcnN0LiAgSWYgdGhhdCBmYWlscywgYSBmdW5jdGlvbgotIyBmcm9tIHRoZSBsaWJyYXJ5IGlzIHRlc3RlZCBpbiB0aGUgdHJhZGl0aW9uYWwgYXV0b2NvbmYgd2F5ICh6bGliLCBiemlwMiksCi0jIG9yIGEgY29uZmlnIHNjcmlwdCBpcyBjYWxsZWQgKGxpYnBuZykuCi0jCi0jIFRoZSBgeHh4X3JlcXByaXYnIHZhcmlhYmxlcyBhcmUgZm9yIHRoZSBgUmVxdWlyZXMucHJpdmF0ZScgZmllbGQgaW4KLSMgYGZyZWV0eXBlMi5wYycuICBUaGUgYHh4eF9saWJzcHJpdicgdmFyaWFibGVzIGFyZSBmb3IgdGhlIGBMaWJzLnByaXZhdGUnCi0jIGZpZWxkIGluIGBmcmVldHlwZTIucGMnIGlmIHBrZy1jb25maWcgZG9lc24ndCBmaW5kIGEgcHJvcGVyIC5wYyBmaWxlLgotIwotIyBUaGUgYHh4eF9saWJzc3RhdGljY29uZicgdmFyaWFibGVzIGFyZSBmb3IgdGhlIGBmcmVldHlwZS1jb25maWcnIHNjcmlwdC4KLSMKLSMgTm90ZSB0aGF0IGEgY2FsbCB0byBQS0dfQ0hFQ0tfTU9EVUxFUyhYWFgsIC4uLikgc2V0cyBhbmQgY3JlYXRlcyB0aGUKLSMgb3V0cHV0IHZhcmlhYmxlcyBgWFhYX0NGTEFHUycgYW5kIGBYWFhfTElCUycuICBJbiBjYXNlIG9uZSBvciBib3RoIGFyZSBzZXQKLSMgZm9yIGEgbGlicmFyeSBieSB0aGUgdXNlciwgbm8gZW50cnkgZm9yIHRoaXMgbGlicmFyeSBpcyBhZGRlZCB0bwotIyBgUmVxdWlyZXMucHJpdmF0ZScuICBJbnN0ZWFkLCBpdCBnZXRzIGFkZGVkIHRvIGBMaWJzLnByaXZhdGUnCi0KLQotIyBjaGVjayBmb3Igc3lzdGVtIHpsaWIKLQotQUNfQVJHX1dJVEgoW3psaWJdLAotICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC16bGliPUA8OkB5ZXN8bm98YXV0b0A6PkBdLAotICAgICAgICAgICAgICAgICAgW3VzZSBzeXN0ZW0gemxpYiBpbnN0ZWFkIG9mIGludGVybmFsIGxpYnJhcnkgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKV0sCi0gIFtdLCBbd2l0aF96bGliPWF1dG9dKQotCi1oYXZlX3psaWI9bm8KLWlmIHRlc3QgeCIkd2l0aF96bGliIiA9IHh5ZXMgLW8geCIkd2l0aF96bGliIiA9IHhhdXRvOyB0aGVuCi0gIHpsaWJfcGtnPSJ6bGliIgotICBoYXZlX3psaWJfcGtnPW5vCi0KLSAgaWYgdGVzdCB4IiRaTElCX0NGTEFHUyIgPSB4IC1hIHgiJFpMSUJfTElCUyIgPSB4OyB0aGVuCi0gICAgUEtHX0NIRUNLX0VYSVNUUyhbJHpsaWJfcGtnXSwgW2hhdmVfemxpYl9wa2c9eWVzXSkKLSAgZmkKLSAgUEtHX0NIRUNLX01PRFVMRVMoW1pMSUJdLCBbJHpsaWJfcGtnXSwKLSAgICAgICAgICAgICAgICAgICAgW2hhdmVfemxpYj0ieWVzIChwa2ctY29uZmlnKSJdLCBbOl0pCi0KLSAgaWYgdGVzdCAkaGF2ZV96bGliX3BrZyA9IHllczsgdGhlbgotICAgICMgd2UgaGF2ZSB6bGliLnBjCi0gICAgemxpYl9yZXFwcml2PSIkemxpYl9wa2ciCi0gICAgemxpYl9saWJzcHJpdj0KLSAgICB6bGliX2xpYnNzdGF0aWNjb25mPWAkUEtHX0NPTkZJRyAtLXN0YXRpYyAtLWxpYnMgIiR6bGliX3BrZyJgCi0gIGVsc2UKLSAgICB6bGliX3JlcXByaXY9Ci0KLSAgICBpZiB0ZXN0ICIkaGF2ZV96bGliIiAhPSBubzsgdGhlbgotICAgICAgIyBaTElCX0NGTEFHUyBhbmQgWkxJQl9MSUJTIGFyZSBzZXQgYnkgdGhlIHVzZXIKLSAgICAgIHpsaWJfbGlic3ByaXY9IiRaTElCX0xJQlMiCi0gICAgICB6bGliX2xpYnNzdGF0aWNjb25mPSIkWkxJQl9MSUJTIgotICAgICAgaGF2ZV96bGliPSJ5ZXMgKFpMSUJfQ0ZMQUdTIGFuZCBaTElCX0xJQlMpIgotICAgIGVsc2UKLSAgICAgICMgZmFsbCBiYWNrIHRvIHN0YW5kYXJkIGF1dG9jb25mIHRlc3QKLSAgICAgIEFDX0NIRUNLX0xJQihbel0sCi0gICAgICAgICAgICAgICAgICAgW2d6c2V0cGFyYW1zXSwKLSAgICAgICAgICAgICAgICAgICBbQUNfQ0hFQ0tfSEVBREVSKFt6bGliLmhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhdmVfemxpYj0ieWVzIChhdXRvY29uZiB0ZXN0KSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2xpYnNwcml2PSItbHoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9saWJzc3RhdGljY29uZj0iJHpsaWJfbGlic3ByaXYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9MSUJTPSIkemxpYl9saWJzcHJpdiJdKV0pCi0gICAgZmkKLSAgZmkKLWZpCi0KLWlmIHRlc3QgeCIkd2l0aF96bGliIiA9IHh5ZXMgLWEgIiRoYXZlX3psaWIiID0gbm87IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtleHRlcm5hbCB6bGliIHN1cHBvcnQgcmVxdWVzdGVkIGJ1dCBsaWJyYXJ5IG5vdCBmb3VuZF0pCi1maQotCi0KLSMgY2hlY2sgZm9yIHN5c3RlbSBsaWJiejIKLQotQUNfQVJHX1dJVEgoW2J6aXAyXSwKLSAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYnppcDI9QDw6QHllc3xub3xhdXRvQDo+QF0sCi0gICAgICAgICAgICAgICAgICBbc3VwcG9ydCBiemlwMiBjb21wcmVzc2VkIGZvbnRzIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSldLAotICBbXSwgW3dpdGhfYnppcDI9YXV0b10pCi0KLWhhdmVfYnppcDI9bm8KLWlmIHRlc3QgeCIkd2l0aF9iemlwMiIgPSB4eWVzIC1vIHgiJHdpdGhfYnppcDIiID0geGF1dG87IHRoZW4KLSAgYnppcDJfcGtnPSJiemlwMiIKLSAgaGF2ZV9iemlwMl9wa2c9bm8KLQotICBpZiB0ZXN0IHgiJEJaSVAyX0NGTEFHUyIgPSB4IC1hIHgiJEJaSVAyX0xJQlMiID0geDsgdGhlbgotICAgIFBLR19DSEVDS19FWElTVFMoWyRiemlwMl9wa2ddLCBbaGF2ZV9iemlwMl9wa2c9eWVzXSkKLSAgZmkKLSAgUEtHX0NIRUNLX01PRFVMRVMoW0JaSVAyXSwgWyRiemlwMl9wa2ddLAotICAgICAgICAgICAgICAgICAgICBbaGF2ZV9iemlwMj0ieWVzIChwa2ctY29uZmlnKSJdLCBbOl0pCi0KLSAgaWYgdGVzdCAkaGF2ZV9iemlwMl9wa2cgPSB5ZXM7IHRoZW4KLSAgICAjIHdlIGhhdmUgYnppcDIucGMKLSAgICBiemlwMl9yZXFwcml2PSIkYnppcDJfcGtnIgotICAgIGJ6aXAyX2xpYnNwcml2PQotICAgIGJ6aXAyX2xpYnNzdGF0aWNjb25mPWAkUEtHX0NPTkZJRyAtLXN0YXRpYyAtLWxpYnMgIiRiemlwMl9wa2ciYAotICBlbHNlCi0gICAgYnppcDJfcmVxcHJpdj0KLQotICAgIGlmIHRlc3QgIiRoYXZlX2J6aXAyIiAhPSBubzsgdGhlbgotICAgICAgIyBCWklQMl9DRkxBR1MgYW5kIEJaSVAyX0xJQlMgYXJlIHNldCBieSB0aGUgdXNlcgotICAgICAgYnppcDJfbGlic3ByaXY9IiRCWklQMl9MSUJTIgotICAgICAgYnppcDJfbGlic3N0YXRpY2NvbmY9IiRCWklQMl9MSUJTIgotICAgICAgaGF2ZV9iemlwMj0ieWVzIChCWklQMl9DRkxBR1MgYW5kIEJaSVAyX0xJQlMpIgotICAgIGVsc2UKLSAgICAgICMgZmFsbCBiYWNrIHRvIHN0YW5kYXJkIGF1dG9jb25mIHRlc3QKLSAgICAgIEFDX0NIRUNLX0xJQihbYnoyXSwKLSAgICAgICAgICAgICAgICAgICBbQloyX2J6RGVjb21wcmVzc10sCi0gICAgICAgICAgICAgICAgICAgW0FDX0NIRUNLX0hFQURFUihbYnpsaWIuaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGF2ZV9iemlwMj0ieWVzIChhdXRvY29uZiB0ZXN0KSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemlwMl9saWJzcHJpdj0iLWxiejIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDJfbGlic3N0YXRpY2NvbmY9IiRiemlwMl9saWJzcHJpdiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWklQMl9MSUJTPSIkYnppcDJfbGlic3ByaXYiXSldKQotICAgIGZpCi0gIGZpCi1maQotCi1pZiB0ZXN0IHgiJHdpdGhfYnppcDIiID0geHllcyAtYSAiJGhhdmVfYnppcDIiID0gbm87IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtiemlwMiBzdXBwb3J0IHJlcXVlc3RlZCBidXQgbGlicmFyeSBub3QgZm91bmRdKQotZmkKLQotCi0jIGNoZWNrIGZvciBzeXN0ZW0gbGlicG5nCi0KLUFDX0FSR19XSVRIKFtwbmddLAotICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1wbmc9QDw6QHllc3xub3xhdXRvQDo+QF0sCi0gICAgICAgICAgICAgICAgICBbc3VwcG9ydCBwbmcgY29tcHJlc3NlZCBPcGVuVHlwZSBlbWJlZGRlZCBiaXRtYXBzIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSldLAotICBbXSwgW3dpdGhfcG5nPWF1dG9dKQotCi1oYXZlX2xpYnBuZz1ubwotaWYgdGVzdCB4IiR3aXRoX3BuZyIgPSB4eWVzIC1vIHgiJHdpdGhfcG5nIiA9IHhhdXRvOyB0aGVuCi0gIGxpYnBuZ19wa2c9ImxpYnBuZyIKLSAgaGF2ZV9saWJwbmdfcGtnPW5vCi0KLSAgaWYgdGVzdCB4IiRMSUJQTkdfQ0ZMQUdTIiA9IHggLWEgeCIkTElCUE5HX0xJQlMiID0geDsgdGhlbgotICAgIFBLR19DSEVDS19FWElTVFMoWyRsaWJwbmdfcGtnXSwgW2hhdmVfbGlicG5nX3BrZz15ZXNdKQotICBmaQotICBQS0dfQ0hFQ0tfTU9EVUxFUyhbTElCUE5HXSwgWyRsaWJwbmdfcGtnXSwKLSAgICAgICAgICAgICAgICAgICAgW2hhdmVfbGlicG5nPSJ5ZXMgKHBrZy1jb25maWcpIl0sIFs6XSkKLQotICBpZiB0ZXN0ICRoYXZlX2xpYnBuZ19wa2cgPSB5ZXM7IHRoZW4KLSAgICAjIHdlIGhhdmUgbGlicG5nLnBjCi0gICAgbGlicG5nX3JlcXByaXY9IiRsaWJwbmdfcGtnIgotICAgIGxpYnBuZ19saWJzcHJpdj0KLSAgICBsaWJwbmdfbGlic3N0YXRpY2NvbmY9YCRQS0dfQ09ORklHIC0tc3RhdGljIC0tbGlicyAiJGxpYnBuZ19wa2ciYAotICBlbHNlCi0gICAgbGlicG5nX3JlcXByaXY9Ci0KLSAgICBpZiB0ZXN0ICIkaGF2ZV9saWJwbmciICE9IG5vOyB0aGVuCi0gICAgICAjIExJQlBOR19DRkxBR1MgYW5kIExJQlBOR19MSUJTIGFyZSBzZXQgYnkgdGhlIHVzZXIKLSAgICAgIGxpYnBuZ19saWJzcHJpdj0iJExJQlBOR19MSUJTIgotICAgICAgbGlicG5nX2xpYnNzdGF0aWNjb25mPSIkTElCUE5HX0xJQlMiCi0gICAgICBoYXZlX2xpYnBuZz0ieWVzIChMSUJQTkdfQ0ZMQUdTIGFuZCBMSUJQTkdfTElCUykiCi0gICAgZWxzZQotICAgICAgIyBmYWxsIGJhY2sgdG8gY29uZmlnIHNjcmlwdC4KLSAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGxpYnBuZy1jb25maWddKQotICAgICAgaWYgd2hpY2ggbGlicG5nLWNvbmZpZyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIExJQlBOR19DRkxBR1M9YGxpYnBuZy1jb25maWcgLS1jZmxhZ3NgCi0gICAgICAgIExJQlBOR19MSUJTPWBsaWJwbmctY29uZmlnIC0tbGRmbGFnc2AKLSAgICAgICAgbGlicG5nX2xpYnNwcml2PWBsaWJwbmctY29uZmlnIC0tc3RhdGljIC0tbGRmbGFnc2AKLSAgICAgICAgbGlicG5nX2xpYnNzdGF0aWNjb25mPSIkbGlicG5nX2xpYnNwcml2IgotICAgICAgICBoYXZlX2xpYnBuZz0ieWVzIChsaWJwbmctY29uZmlnKSIKLSAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLSAgICAgIGVsc2UKLSAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQotICAgICAgZmkKLSAgICBmaQotICBmaQotZmkKLQotaWYgdGVzdCB4IiR3aXRoX3BuZyIgPSB4eWVzIC1hICIkaGF2ZV9saWJwbmciID0gbm87IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtsaWJwbmcgc3VwcG9ydCByZXF1ZXN0ZWQgYnV0IGxpYnJhcnkgbm90IGZvdW5kXSkKLWZpCi0KLQotIyBjaGVjayBmb3Igc3lzdGVtIGxpYmhhcmZidXp6Ci0KLUFDX0FSR19XSVRIKFtoYXJmYnV6el0sCi0gIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWhhcmZidXp6PUA8OkB5ZXN8bm98YXV0b0A6PkBdLAotICAgICAgICAgICAgICAgICAgW2ltcHJvdmUgYXV0by1oaW50aW5nIG9mIE9wZW5UeXBlIGZvbnRzIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSldLAotICBbXSwgW3dpdGhfaGFyZmJ1eno9YXV0b10pCi0KLWhhdmVfaGFyZmJ1eno9bm8KLWlmIHRlc3QgeCIkd2l0aF9oYXJmYnV6eiIgPSB4eWVzIC1vIHgiJHdpdGhfaGFyZmJ1enoiID0geGF1dG87IHRoZW4KLSAgaGFyZmJ1enpfcGtnPSJoYXJmYnV6eiA+PSAwLjkuMjEiCi0gIGhhdmVfaGFyZmJ1enpfcGtnPW5vCi0KLSAgaWYgdGVzdCB4IiRIQVJGQlVaWl9DRkxBR1MiID0geCAtYSB4IiRIQVJGQlVaWl9MSUJTIiA9IHg7IHRoZW4KLSAgICBQS0dfQ0hFQ0tfRVhJU1RTKFskaGFyZmJ1enpfcGtnXSwgW2hhdmVfaGFyZmJ1enpfcGtnPXllc10pCi0gIGZpCi0gIFBLR19DSEVDS19NT0RVTEVTKFtIQVJGQlVaWl0sIFskaGFyZmJ1enpfcGtnXSwKLSAgICAgICAgICAgICAgICAgICAgW2hhdmVfaGFyZmJ1eno9InllcyAocGtnLWNvbmZpZykiXSwgWzpdKQotCi0gIGlmIHRlc3QgJGhhdmVfaGFyZmJ1enpfcGtnID0geWVzOyB0aGVuCi0gICAgIyB3ZSBoYXZlIGhhcmZidXp6LnBjCi0gICAgaGFyZmJ1enpfcmVxcHJpdj0iJGhhcmZidXp6X3BrZyIKLSAgICBoYXJmYnV6el9saWJzcHJpdj0KLSAgICBoYXJmYnV6el9saWJzc3RhdGljY29uZj1gJFBLR19DT05GSUcgLS1zdGF0aWMgLS1saWJzICIkaGFyZmJ1enpfcGtnImAKLSAgZWxzZQotICAgIGhhcmZidXp6X3JlcXByaXY9Ci0KLSAgICBpZiB0ZXN0ICIkaGF2ZV9oYXJmYnV6eiIgIT0gbm87IHRoZW4KLSAgICAgICMgSEFSRkJVWlpfQ0ZMQUdTIGFuZCBIQVJGQlVaWl9MSUJTIGFyZSBzZXQgYnkgdGhlIHVzZXIKLSAgICAgIGhhcmZidXp6X2xpYnNwcml2PSIkSEFSRkJVWlpfTElCUyIKLSAgICAgIGhhcmZidXp6X2xpYnNzdGF0aWNjb25mPSIkSEFSRkJVWlpfTElCUyIKLSAgICAgIGhhdmVfaGFyZmJ1eno9InllcyAoSEFSRkJVWlpfQ0ZMQUdTIGFuZCBIQVJGQlVaWl9MSUJTKSIKLSAgICBlbHNlCi0gICAgICAjIHNpbmNlIEhhcmZCdXp6IGlzIHF1aXRlIGEgbmV3IGxpYnJhcnkgd2UgZG9uJ3QgZmFsbCBiYWNrIHRvIGEKLSAgICAgICMgZGlmZmVyZW50IHRlc3Q7IGFkZGl0aW9uYWxseSwgaXQgaGFzIHRvbyBtYW55IGRlcGVuZGVuY2llcwotICAgICAgOgotICAgIGZpCi0gIGZpCi1maQotCi1pZiB0ZXN0IHgiJHdpdGhfaGFyZmJ1enoiID0geHllcyAtYSAiJGhhdmVfaGFyZmJ1enoiID0gbm87IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtoYXJmYnV6eiBzdXBwb3J0IHJlcXVlc3RlZCBidXQgbGlicmFyeSBub3QgZm91bmRdKQotZmkKLQotCi0jIFNvbWUgb3B0aW9ucyBoYW5kbGluZyBTREtzL2FyY2hzIGluIENGTEFHUyBzaG91bGQgYmUgY29waWVkCi0jIHRvIExERkxBR1MuIEFwcGxlIFRlY2hOb3RlIDIxMzcgcmVjb21tZW5kcyB0byBpbmNsdWRlIHRoZXNlCi0jIG9wdGlvbnMgaW4gQ0ZMQUdTIGJ1dCBub3QgaW4gTERGTEFHUy4KLQotc2F2ZV9jb25maWdfYXJncz0kKgotc2V0IGR1bW15ICR7Q0ZMQUdTfQotaT0xCi13aGlsZSB0ZXN0ICRpIC1sZSAkIwotZG8KLSAgYz0kMQotCi0gIGNhc2UgIiR7Y30iIGluCi0gIC1pc3lzcm9vdHwtYXJjaCkgIyBvcHRpb25zIHRha2luZyAxIGFyZ3VtZW50Ci0gICAgYT0kMgotICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBDRkxBR1MgYW5kIExERkxBR1Mgc2hhcmUgJHtjfSAke2F9XSkKLSAgICBpZiBleHByICIgJHtMREZMQUdTfSAiIDogIi4qICR7Y30gKiR7YX0uKiIgPiAvZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotICAgIGVsc2UKLSAgICAgIEFDX01TR19SRVNVTFQoW25vLCBjb3B5IHRvIExERkxBR1NdKQotICAgICAgTERGTEFHUz0iJHtMREZMQUdTfSAke2N9ICR7YX0iCi0gICAgZmkKLSAgICBzaGlmdCAxCi0gICAgOzsKLSAgLW0zMnwtbTY0fC1tYXJjaD0qfC1tY3B1PSopICMgb3B0aW9ucyB0YWtpbmcgbm8gYXJndW1lbnQKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgQ0ZMQUdTIGFuZCBMREZMQUdTIHNoYXJlICR7Y31dKQotICAgIGlmIGV4cHIgIiAke0xERkxBR1N9ICIgOiAiLiogJHtjfSAqJHthfS4qIiA+IC9kZXYvbnVsbAotICAgIHRoZW4KLSAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCi0gICAgZWxzZQotICAgICAgQUNfTVNHX1JFU1VMVChbbm8sIGNvcHkgdG8gTERGTEFHU10pCi0gICAgICBMREZMQUdTPSIke0xERkxBR1N9ICR7Y30iCi0gICAgZmkKLSAgICA7OwotICAjICopCi0gICMgICBBQ19NU0dfUkVTVUxUKFske2N9IGlzIG5vdCBjb3BpZWQgdG8gTERGTEFHU10pCi0gICMgICA7OwotICBlc2FjCi0KLSAgc2hpZnQgMQotZG9uZQotc2V0ICR7c2F2ZV9jb25maWdfYXJnc30KLQotCi0jIFdoZXRoZXIgdG8gdXNlIE1hYyBPUyByZXNvdXJjZS1iYXNlZCBmb250cy4KLQotZnRtYWNfYz0iIiAjIHNyYy9iYXNlL2Z0bWFjLmMgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBtYWtlZmlsZXMgYnkgZGVmYXVsdAotCi1BQ19BUkdfV0lUSChbb2xkLW1hYy1mb250c10sCi0gIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtb2xkLW1hYy1mb250c10sCi0gICAgICAgICAgICAgICAgIFthbGxvdyBNYWMgcmVzb3VyY2UtYmFzZWQgZm9udHMgdG8gYmUgdXNlZF0pKQotaWYgdGVzdCB4JHdpdGhfb2xkX21hY19mb250cyA9IHh5ZXM7IHRoZW4KLSAgb3JpZ19MREZMQUdTPSIke0xERkxBR1N9IgotICBBQ19NU0dfQ0hFQ0tJTkcoW0NvcmVTZXJ2aWNlcyAmIEFwcGxpY2F0aW9uU2VydmljZXMgb2YgTWFjIE9TIFhdKQotICBmdDJfZXh0cmFfbGlicz0iLVdsLC1mcmFtZXdvcmssQ29yZVNlcnZpY2VzIC1XbCwtZnJhbWV3b3JrLEFwcGxpY2F0aW9uU2VydmljZXMiCi0gIExERkxBR1M9IiRMREZMQUdTICRmdDJfZXh0cmFfbGlicyIKLSAgQUNfTElOS19JRkVMU0UoWwotICAgIEFDX0xBTkdfUFJPR1JBTShbCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykKLSMgaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotIyBpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPENvbmRpdGlvbmFsTWFjcm9zLmg+Ci0jIGluY2x1ZGUgPEZpbGVzLmg+Ci0jZW5kaWYKLQotICAgICAgXSwKLSAgICAgIFsKLQotICAgICAgICBzaG9ydCByZXMgPSAwOwotCi0KLSAgICAgICAgVXNlUmVzRmlsZSggcmVzICk7Ci0KLSAgICAgIF0pXSwKLSAgICBbQUNfTVNHX1JFU1VMVChbb2tdKQotICAgICBmdG1hY19jPSdmdG1hYy5jJwotICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgT1NfSU5MSU5FIG1hY3JvIGlzIEFOU0kgY29tcGF0aWJsZV0pCi0gICAgIG9yaWdfQ0ZMQUdTPSIkQ0ZMQUdTIC1ERlRfTUFDSU5UT1NIIgotICAgICBDRkxBR1M9IiRDRkxBR1MgJFhYX0NGTEFHUyAkWFhfQU5TSUZMQUdTIgotICAgICBBQ19DT01QSUxFX0lGRUxTRShbCi0gICAgICAgQUNfTEFOR19QUk9HUkFNKFsKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19BUFBMRV9DQ19fKQotIyBpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jIGluY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8Q29uZGl0aW9uYWxNYWNyb3MuaD4KLSMgaW5jbHVkZSA8RmlsZXMuaD4KLSNlbmRpZgotCi0gICAgICAgICBdLAotICAgICAgICAgWwotCi0gICAgICAgICAgIC8qIE9TSG9zdEJ5dGVPcmRlcigpIGlzIHR5cGVkIGFzIE9TX0lOTElORSAqLwotICAgICAgICAgICBpbnQzMl90ICBvc19ieXRlX29yZGVyID0gT1NIb3N0Qnl0ZU9yZGVyKCk7Ci0KLQotICAgICAgICAgICBpZiAoIE9TQmlnRW5kaWFuICE9IG9zX2J5dGVfb3JkZXIgKQotICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICBdKV0sCi0gICAgICAgW0FDX01TR19SRVNVTFQoW29rXSkKLSAgICAgICAgQ0ZMQUdTPSIkb3JpZ19DRkxBR1MiCi0gICAgICAgIENGTEFHUz0iJENGTEFHUyAtREhBVkVfQU5TSV9PU19JTkxJTkU9MSIKLSAgICAgICBdLAotICAgICAgIFtBQ19NU0dfUkVTVUxUKFtubywgQU5TSSBpbmNvbXBhdGlibGVdKQotICAgICAgICBDRkxBR1M9IiRvcmlnX0NGTEFHUyIKLSAgICAgICBdKQotICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3R5cGUgUmVzb3VyY2VJbmRleF0pCi0gICAgIG9yaWdfQ0ZMQUdTPSIkQ0ZMQUdTIgotICAgICBDRkxBR1M9IiRDRkxBR1MgJFhYX0NGTEFHUyAkWFhfQU5TSUZMQUdTIgotICAgICBBQ19DT01QSUxFX0lGRUxTRShbCi0gICAgICAgQUNfTEFOR19QUk9HUkFNKFsKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19BUFBMRV9DQ19fKQotIyBpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jIGluY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8Q29uZGl0aW9uYWxNYWNyb3MuaD4KLSMgaW5jbHVkZSA8RmlsZXMuaD4KLSMgaW5jbHVkZSA8UmVzb3VyY2VzLmg+Ci0jZW5kaWYKLQotICAgICAgICAgXSwKLSAgICAgICAgIFsKLQotICAgICAgICAgICBSZXNvdXJjZUluZGV4IGkgPSAwOwotICAgICAgICAgICByZXR1cm4gaTsKLQotICAgICAgICAgXSldLAotICAgICAgIFtBQ19NU0dfUkVTVUxUKFtva10pCi0gICAgICAgIENGTEFHUz0iJG9yaWdfQ0ZMQUdTIgotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1RZUEVfUkVTT1VSQ0VfSU5ERVg9MSIKLSAgICAgICBdLAotICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgICAgIENGTEFHUz0iJG9yaWdfQ0ZMQUdTIgotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1RZUEVfUkVTT1VSQ0VfSU5ERVg9MCIKLSAgICAgICBdKV0sCi0gICAgW0FDX01TR19SRVNVTFQoW25vdCBmb3VuZF0pCi0gICAgIGZ0Ml9leHRyYV9saWJzPSIiCi0gICAgIExERkxBR1M9IiR7b3JpZ19MREZMQUdTfSIKLSAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EREFSV0lOX05PX0NBUkJPTiJdKQotZWxzZQotICBjYXNlIHgkaG9zdF9vcyBpbgotICB4ZGFyd2luKikKLSAgICBkbmwgQUNfTVNHX1dBUk4oW2hvc3Qgc3lzdGVtIGlzIE1hY09TIGJ1dCBjb25maWd1cmVkIHRvIGJ1aWxkIHdpdGhvdXQgQ2FyYm9uXSkKLSAgICBDRkxBR1M9IiRDRkxBR1MgLUREQVJXSU5fTk9fQ0FSQk9OIgotICAgIDs7Ci0gICopCi0gICAgOzsKLSAgZXNhYwotZmkKLQotCi0jIFdoZXRoZXIgdG8gdXNlIEZpbGVNYW5hZ2VyLCB3aGljaCBpcyBkZXByZWNhdGVkIHNpbmNlIE1hYyBPUyBYIDEwLjQuCi0KLUFDX0FSR19XSVRIKFtmc3NwZWNdLAotICBBU19IRUxQX1NUUklORyhbLS13aXRoLWZzc3BlY10sCi0gICAgICAgICAgICAgICAgIFt1c2Ugb2Jzb2xldGUgRlNTcGVjIEFQSSBvZiBNYWNPUywgaWYgYXZhaWxhYmxlIChkZWZhdWx0PXllcyldKSkKLWlmIHRlc3QgeCR3aXRoX2Zzc3BlYyA9IHhubzsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX0ZTU1BFQz0wIgotZWxpZiB0ZXN0IHgkd2l0aF9vbGRfbWFjX2ZvbnRzID0geHllcyAtYSB4JHdpdGhfZnNzcGVjICE9IHg7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtGU1NwZWMtYmFzZWQgRmlsZU1hbmFnZXJdKQotICBBQ19MSU5LX0lGRUxTRShbCi0gICAgQUNfTEFOR19QUk9HUkFNKFsKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19BUFBMRV9DQ19fKQotIyBpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jIGluY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8Q29uZGl0aW9uYWxNYWNyb3MuaD4KLSMgaW5jbHVkZSA8RmlsZXMuaD4KLSNlbmRpZgotCi0gICAgICBdLAotICAgICAgWwotCi0gICAgICAgIEZDQlBCUHRyICAgICAgICAgIHBhcmFtQmxvY2s7Ci0gICAgICAgIHNob3J0ICAgICAgICAgICAgIHZSZWZOdW07Ci0gICAgICAgIGxvbmcgICAgICAgICAgICAgIGRpcklEOwotICAgICAgICBDb25zdFN0cjI1NVBhcmFtICBmaWxlTmFtZTsKLSAgICAgICAgRlNTcGVjKiAgICAgICAgICAgc3BlYzsKLQotCi0gICAgICAgIC8qIEZTU3BlYyBmdW5jdGlvbnM6IGRlcHJlY2F0ZWQgc2luY2UgTWFjIE9TIFggMTAuNCAqLwotICAgICAgICBQQkdldEZDQkluZm9TeW5jKCBwYXJhbUJsb2NrICk7Ci0gICAgICAgIEZTTWFrZUZTU3BlYyggdlJlZk51bSwgZGlySUQsIGZpbGVOYW1lLCBzcGVjICk7Ci0KLSAgICAgIF0pXSwKLSAgICBbQUNfTVNHX1JFU1VMVChbb2tdKQotICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX0ZTU1BFQz0xIl0sCi0gICAgW0FDX01TR19SRVNVTFQoW25vdCBmb3VuZF0pCi0gICAgIENGTEFHUz0iJENGTEFHUyAtREhBVkVfRlNTUEVDPTAiXSkKLWZpCi0KLQotIyBXaGV0aGVyIHRvIHVzZSBGaWxlTWFuYWdlciBpbiBDYXJib24gc2luY2UgTWFjT1MgOS54LgotCi1BQ19BUkdfV0lUSChbZnNyZWZdLAotICBBU19IRUxQX1NUUklORyhbLS13aXRoLWZzcmVmXSwKLSAgICAgICAgICAgICAgICAgW3VzZSBDYXJib24gRlNSZWYgQVBJIG9mIE1hY09TLCBpZiBhdmFpbGFibGUgKGRlZmF1bHQ9eWVzKV0pKQotaWYgdGVzdCB4JHdpdGhfZnNyZWYgPSB4bm87IHRoZW4KLSAgQUNfTVNHX1dBUk4oWwotKioqIFdBUk5JTkcKLSAgICBGcmVlVHlwZTIgYnVpbHQgd2l0aG91dCBGU1JlZiBBUEkgY2Fubm90IGxvYWQKLSAgICBkYXRhLWZvcmsgZm9udHMgb24gTWFjT1MsIGV4Y2VwdCBvZiBYWFguZGZvbnQuCi0gICAgXSkKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFWRV9GU1JFRj0wIgotZWxpZiB0ZXN0IHgkd2l0aF9vbGRfbWFjX2ZvbnRzID0geHllcyAtYSB4JHdpdGhfZnNyZWYgIT0geDsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW0ZTUmVmLWJhc2VkIEZpbGVNYW5hZ2VyXSkKLSAgQUNfTElOS19JRkVMU0UoWwotICAgIEFDX0xBTkdfUFJPR1JBTShbCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykKLSMgaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotIyBpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPENvbmRpdGlvbmFsTWFjcm9zLmg+Ci0jIGluY2x1ZGUgPEZpbGVzLmg+Ci0jZW5kaWYKLQotICAgICAgXSwKLSAgICAgIFsKLQotICAgICAgICBzaG9ydCAgICAgICAgICAgICAgICB2UmVmTnVtOwotICAgICAgICBsb25nICAgICAgICAgICAgICAgICBkaXJJRDsKLSAgICAgICAgQ29uc3RTdHIyNTVQYXJhbSAgICAgZmlsZU5hbWU7Ci0KLSAgICAgICAgQm9vbGVhbiogICAgICAgICAgICAgaXNEaXJlY3Rvcnk7Ci0gICAgICAgIFVJbnQ4KiAgICAgICAgICAgICAgIHBhdGg7Ci0gICAgICAgIFNJbnQxNiAgICAgICAgICAgICAgIGRlc2lyZWRSZWZOdW07Ci0gICAgICAgIFNJbnQxNiogICAgICAgICAgICAgIGl0ZXJhdG9yOwotICAgICAgICBTSW50MTYqICAgICAgICAgICAgICBhY3R1YWxSZWZOdW07Ci0gICAgICAgIEhGU1VuaVN0cjI1NSogICAgICAgIG91dEZvcmtOYW1lOwotICAgICAgICBGU1ZvbHVtZVJlZk51bSAgICAgICB2b2x1bWU7Ci0gICAgICAgIEZTQ2F0YWxvZ0luZm9CaXRtYXAgIHdoaWNoSW5mbzsKLSAgICAgICAgRlNDYXRhbG9nSW5mbyogICAgICAgY2F0YWxvZ0luZm87Ci0gICAgICAgIEZTRm9ya0luZm8qICAgICAgICAgIGZvcmtJbmZvOwotICAgICAgICBGU1JlZiogICAgICAgICAgICAgICByZWY7Ci0KLSNpZiBIQVZFX0ZTU1BFQwotICAgICAgICBGU1NwZWMqICAgICAgICAgICAgICBzcGVjOwotI2VuZGlmCi0KLSAgICAgICAgLyogRlNSZWYgZnVuY3Rpb25zOiBubyBuZWVkIHRvIGNoZWNrPyAqLwotICAgICAgICBGU0dldEZvcmtDQkluZm8oIGRlc2lyZWRSZWZOdW0sIHZvbHVtZSwgaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUmVmTnVtLCBmb3JrSW5mbywgcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvcmtOYW1lICk7Ci0gICAgICAgIEZTUGF0aE1ha2VSZWYoIHBhdGgsIHJlZiwgaXNEaXJlY3RvcnkgKTsKLQotI2lmIEhBVkVfRlNTUEVDCi0gICAgICAgIEZTcE1ha2VGU1JlZiAoIHNwZWMsIHJlZiApOwotICAgICAgICBGU0dldENhdGFsb2dJbmZvKCByZWYsIHdoaWNoSW5mbywgY2F0YWxvZ0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvcmtOYW1lLCBzcGVjLCByZWYgKTsKLSNlbmRpZgotICAgICAgXSldLAotICAgIFtBQ19NU0dfUkVTVUxUKFtva10pCi0gICAgIENGTEFHUz0iJENGTEFHUyAtREhBVkVfRlNSRUY9MSJdLAotICAgIFtBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQotICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX0ZTUkVGPTAiXSkKLWZpCi0KLQotIyBXaGV0aGVyIHRvIHVzZSBRdWlja0RyYXcgQVBJIGluIFRvb2xCb3gsIHdoaWNoIGlzIGRlcHJlY2F0ZWQgc2luY2UKLSMgTWFjIE9TIFggMTAuNC4KLQotQUNfQVJHX1dJVEgoW3F1aWNrZHJhdy10b29sYm94XSwKLSAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1xdWlja2RyYXctdG9vbGJveF0sCi0gICAgICAgICAgICAgICAgIFt1c2UgTWFjT1MgUXVpY2tEcmF3IGluIFRvb2xCb3gsIGlmIGF2YWlsYWJsZSAoZGVmYXVsdD15ZXMpXSkpCi1pZiB0ZXN0IHgkd2l0aF9xdWlja2RyYXdfdG9vbGJveCA9IHhubzsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1FVSUNLRFJBV19UT09MQk9YPTAiCi1lbGlmIHRlc3QgeCR3aXRoX29sZF9tYWNfZm9udHMgPSB4eWVzIC1hIHgkd2l0aF9xdWlja2RyYXdfdG9vbGJveCAhPSB4OyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbUXVpY2tEcmF3IEZvbnRNYW5hZ2VyIGZ1bmN0aW9ucyBpbiBUb29sQm94XSkKLSAgQUNfTElOS19JRkVMU0UoWwotICAgIEFDX0xBTkdfUFJPR1JBTShbCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykKLSMgaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotIyBpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPENvbmRpdGlvbmFsTWFjcm9zLmg+Ci0jIGluY2x1ZGUgPEZvbnRzLmg+Ci0jZW5kaWYKLQotICAgICAgXSwKLSAgICAgIFsKLQotICAgICAgICBTdHIyNTUgICAgIGZhbWlseU5hbWU7Ci0gICAgICAgIFNJbnQxNiAgICAgZmFtaWx5SUQgICA9IDA7Ci0gICAgICAgIEZNSW5wdXQqICAgZm1JbiAgICAgICA9IE5VTEw7Ci0gICAgICAgIEZNT3V0cHV0KiAgZm1PdXQgICAgICA9IE5VTEw7Ci0KLQotICAgICAgICBHZXRGb250TmFtZSggZmFtaWx5SUQsIGZhbWlseU5hbWUgKTsKLSAgICAgICAgR2V0Rk51bSggZmFtaWx5TmFtZSwgJmZhbWlseUlEICk7Ci0gICAgICAgIGZtT3V0ID0gRk1Td2FwRm9udCggZm1JbiApOwotCi0gICAgICBdKV0sCi0gICAgW0FDX01TR19SRVNVTFQoW29rXSkKLSAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFWRV9RVUlDS0RSQVdfVE9PTEJPWD0xIl0sCi0gICAgW0FDX01TR19SRVNVTFQoW25vdCBmb3VuZF0pCi0gICAgIENGTEFHUz0iJENGTEFHUyAtREhBVkVfUVVJQ0tEUkFXX1RPT0xCT1g9MCJdKQotZmkKLQotCi0jIFdoZXRoZXIgdG8gdXNlIFF1aWNrRHJhdyBBUEkgaW4gQ2FyYm9uLCB3aGljaCBpcyBkZXByZWNhdGVkIHNpbmNlCi0jIE1hYyBPUyBYIDEwLjQuCi0KLUFDX0FSR19XSVRIKFtxdWlja2RyYXctY2FyYm9uXSwKLSAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1xdWlja2RyYXctY2FyYm9uXSwKLSAgICAgICAgICAgICAgICAgW3VzZSBNYWNPUyBRdWlja0RyYXcgaW4gQ2FyYm9uLCBpZiBhdmFpbGFibGUgKGRlZmF1bHQ9eWVzKV0pKQotaWYgdGVzdCB4JHdpdGhfcXVpY2tkcmF3X2NhcmJvbiA9IHhubzsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1FVSUNLRFJBV19DQVJCT049MCIKLWVsaWYgdGVzdCB4JHdpdGhfb2xkX21hY19mb250cyA9IHh5ZXMgLWEgeCR3aXRoX3F1aWNrZHJhd19jYXJib24gIT0geDsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW1F1aWNrRHJhdyBGb250TWFuYWdlciBmdW5jdGlvbnMgaW4gQ2FyYm9uXSkKLSAgQUNfTElOS19JRkVMU0UoWwotICAgIEFDX0xBTkdfUFJPR1JBTShbCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykKLSMgaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotIyBpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPENvbmRpdGlvbmFsTWFjcm9zLmg+Ci0jIGluY2x1ZGUgPEZvbnRzLmg+Ci0jZW5kaWYKLQotICAgICAgXSwKLSAgICAgIFsKLQotICAgICAgICBGTUZvbnRGYW1pbHlJdGVyYXRvciAgICAgICAgICBmYW1JdGVyOwotICAgICAgICBGTUZvbnRGYW1pbHkgICAgICAgICAgICAgICAgICBmYW1pbHk7Ci0gICAgICAgIFN0cjI1NSAgICAgICAgICAgICAgICAgICAgICAgIGZhbU5hbWVTdHI7Ci0gICAgICAgIEZNRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3IgIGluc3RJdGVyOwotICAgICAgICBGTUZvbnRTdHlsZSAgICAgICAgICAgICAgICAgICBzdHlsZTsKLSAgICAgICAgRk1Gb250U2l6ZSAgICAgICAgICAgICAgICAgICAgc2l6ZTsKLSAgICAgICAgRk1Gb250ICAgICAgICAgICAgICAgICAgICAgICAgZm9udDsKLSAgICAgICAgRlNTcGVjKiAgICAgICAgICAgICAgICAgICAgICAgcGF0aFNwZWM7Ci0KLQotICAgICAgICBGTUNyZWF0ZUZvbnRGYW1pbHlJdGVyYXRvciggTlVMTCwgTlVMTCwga0ZNVXNlR2xvYmFsU2NvcGVPcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFtSXRlciApOwotICAgICAgICBGTUdldE5leHRGb250RmFtaWx5KCAmZmFtSXRlciwgJmZhbWlseSApOwotICAgICAgICBGTUdldEZvbnRGYW1pbHlOYW1lKCBmYW1pbHksIGZhbU5hbWVTdHIgKTsKLSAgICAgICAgRk1DcmVhdGVGb250RmFtaWx5SW5zdGFuY2VJdGVyYXRvciggZmFtaWx5LCAmaW5zdEl0ZXIgKTsKLSAgICAgICAgRk1HZXROZXh0Rm9udEZhbWlseUluc3RhbmNlKCAmaW5zdEl0ZXIsICZmb250LCAmc3R5bGUsICZzaXplICk7Ci0gICAgICAgIEZNRGlzcG9zZUZvbnRGYW1pbHlJbnN0YW5jZUl0ZXJhdG9yKCAmaW5zdEl0ZXIgKTsKLSAgICAgICAgRk1EaXNwb3NlRm9udEZhbWlseUl0ZXJhdG9yKCAmZmFtSXRlciApOwotICAgICAgICBGTUdldEZvbnRDb250YWluZXIoIGZvbnQsIHBhdGhTcGVjICk7Ci0KLSAgICAgIF0pXSwKLSAgICBbQUNfTVNHX1JFU1VMVChbb2tdKQotICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1FVSUNLRFJBV19DQVJCT049MSJdLAotICAgIFtBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQotICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1FVSUNLRFJBV19DQVJCT049MCJdKQotZmkKLQotCi0jIFdoZXRoZXIgdG8gdXNlIEFwcGxlVHlwZVNlcnZpY2Ugc2luY2UgTWFjIE9TIFguCi0KLUFDX0FSR19XSVRIKFthdHNdLAotICBBU19IRUxQX1NUUklORyhbLS13aXRoLWF0c10sCi0gICAgICAgICAgICAgICAgIFt1c2UgQXBwbGVUeXBlU2VydmljZSwgaWYgYXZhaWxhYmxlIChkZWZhdWx0PXllcyldKSkKLWlmIHRlc3QgeCR3aXRoX2F0cyA9IHhubzsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX0FUUz0wIgotZWxpZiB0ZXN0IHgkd2l0aF9vbGRfbWFjX2ZvbnRzID0geHllcyAtYSB4JHdpdGhfYXRzICE9IHg7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtBcHBsZVR5cGVTZXJ2aWNlIGZ1bmN0aW9uc10pCi0gIEFDX0xJTktfSUZFTFNFKFsKLSAgICBBQ19MQU5HX1BST0dSQU0oWwotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0FQUExFX0NDX18pCi0jIGluY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSMgaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxDb25kaXRpb25hbE1hY3Jvcy5oPgotIyBpbmNsdWRlIDxGaWxlcy5oPgotI2VuZGlmCi0KLSAgICAgIF0sCi0gICAgICBbCi0KLSAgICAgICAgRlNTcGVjKiAgcGF0aFNwZWM7Ci0KLQotICAgICAgICBBVFNGb250RmluZEZyb21OYW1lKCBOVUxMLCBrQVRTT3B0aW9uRmxhZ3NVblJlc3RyaWN0ZWRTY29wZSApOwotI2lmIEhBVkVfRlNTUEVDCi0gICAgICAgIEFUU0ZvbnRHZXRGaWxlU3BlY2lmaWNhdGlvbiggMCwgcGF0aFNwZWMgKTsKLSNlbmRpZgotCi0gICAgICBdKV0sCi0gICAgW0FDX01TR19SRVNVTFQoW29rXSkKLSAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFWRV9BVFM9MSJdLAotICAgIFtBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQotICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX0FUUz0wIl0pCi1maQotCi1jYXNlICIkQ0ZMQUdTIiBpbgotICAqSEFWRV9GU1NQRUMqIHwgKkhBVkVfRlNSRUYqIHwgKkhBVkVfUVVJQ0tEUkFXKiB8ICpIQVZFX0FUUyogKQotICAgIEFDX01TR19XQVJOKFsKLSoqKiBXQVJOSU5HCi0gICAgRlNTcGVjL0ZTUmVmL1F1aWNrRHJhdy9BVFMgb3B0aW9ucyBhcmUgZXhwbGljaXRseSBnaXZlbiwKLSAgICB0aHVzIGl0IGlzIHJlY29tbWVuZGVkIHRvIHJlcGxhY2Ugc3JjL2Jhc2UvZnRtYWMuYyBieSBidWlsZHMvbWFjL2Z0bWFjLmMuCi0gICAgXSkKLSAgICBDRkxBR1M9IiRDRkxBR1MgIictSSQoVE9QX0RJUikvYnVpbGRzL21hYy8nCi0gICAgOzsKLSAgKikKLSAgICA7OwotZXNhYwotCi0KLSMgZW50cmllcyBpbiBSZXF1aXJlcy5wcml2YXRlIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzOwotUkVRVUlSRVNfUFJJVkFURT0iJHpsaWJfcmVxcHJpdiwgICAgIFwKLSAgICAgICAgICAgICAgICAgICRiemlwMl9yZXFwcml2LCAgICBcCi0gICAgICAgICAgICAgICAgICAkbGlicG5nX3JlcXByaXYsICAgXAotICAgICAgICAgICAgICAgICAgJGhhcmZidXp6X3JlcXByaXYiCi0jIGJlYXV0aWZ5Ci1SRVFVSVJFU19QUklWQVRFPWBlY2hvICIkUkVRVUlSRVNfUFJJVkFURSIgXAotICAgICAgICAgICAgICAgICAgfCBzZWQgLWUgJ3MvXiAgKi8vJyAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC1lICdzLyAgKiQvLycgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtZSAncy8sICovLC9nJyAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvLCwqLywvZycgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC1lICdzL14sKi8vJyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtZSAncy8sKiQvLycgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvLC8sIC9nJ2AKLQotTElCU19QUklWQVRFPSIkemxpYl9saWJzcHJpdiAgICAgXAotICAgICAgICAgICAgICAkYnppcDJfbGlic3ByaXYgICAgXAotICAgICAgICAgICAgICAkbGlicG5nX2xpYnNwcml2ICAgXAotICAgICAgICAgICAgICAkaGFyZmJ1enpfbGlic3ByaXYgXAotICAgICAgICAgICAgICAkZnQyX2V4dHJhX2xpYnMiCi0jIGJlYXV0aWZ5Ci1MSUJTX1BSSVZBVEU9YGVjaG8gIiRMSUJTX1BSSVZBVEUiICBcCi0gICAgICAgICAgICAgIHwgc2VkIC1lICdzL14gICovLycgICBcCi0gICAgICAgICAgICAgICAgICAgIC1lICdzLyAgKiQvLycgICBcCi0gICAgICAgICAgICAgICAgICAgIC1lICdzLyAgKi8gL2cnYAotCi1MSUJTU1RBVElDX0NPTkZJRz0iLWxmcmVldHlwZSAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAkemxpYl9saWJzc3RhdGljY29uZiAgICAgXAotICAgICAgICAgICAgICAgICAgICRiemlwMl9saWJzc3RhdGljY29uZiAgICBcCi0gICAgICAgICAgICAgICAgICAgJGxpYnBuZ19saWJzc3RhdGljY29uZiAgIFwKLSAgICAgICAgICAgICAgICAgICAkaGFyZmJ1enpfbGlic3N0YXRpY2NvbmYgXAotICAgICAgICAgICAgICAgICAgICRmdDJfZXh0cmFfbGlicyIKLSMgcmVtb3ZlIC1ML3Vzci9saWIgYW5kIC1ML3Vzci9saWI2NCBzaW5jZSBgZnJlZXR5cGUtY29uZmlnJyBhZGRzIHRoZW0gbGF0ZXIKLSMgb24gaWYgbmVjZXNzYXJ5OyBhbHNvIGJlYXV0aWZ5Ci1MSUJTU1RBVElDX0NPTkZJRz1gZWNobyAiJExJQlNTVEFUSUNfQ09ORklHIiAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgfCBzZWQgLWUgJ3N8LUwgKi91c3IvbGliNjQvKiB8IHxnJyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3N8LUwgKi91c3IvbGliLyogfCB8ZycgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvXiAgKi8vJyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvICAqJC8vJyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvICAqLyAvZydgCi0KLQotQUNfU1VCU1QoW2Z0bWFjX2NdKQotQUNfU1VCU1QoW1JFUVVJUkVTX1BSSVZBVEVdKQotQUNfU1VCU1QoW0xJQlNfUFJJVkFURV0pCi1BQ19TVUJTVChbTElCU1NUQVRJQ19DT05GSUddKQotCi1BQ19TVUJTVChbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10pCi1BQ19TVUJTVChbd2xdKQotQUNfU1VCU1QoW2J1aWxkX2xpYnRvb2xfbGlic10pCi0KLQotIyBjaGFuZ2luZyBMREZMQUdTIHZhbHVlIHNob3VsZCBvbmx5IGJlIGRvbmUgYWZ0ZXIKLSMgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MgdGVzdAotCi1pZiB0ZXN0ICIkaGF2ZV96bGliIiAhPSBubzsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgJFpMSUJfQ0ZMQUdTIC1ERlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQiIKLSAgTERGTEFHUz0iJExERkxBR1MgJFpMSUJfTElCUyIKLWZpCi0KLWlmIHRlc3QgIiRoYXZlX2J6aXAyIiAhPSBubzsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgJEJaSVAyX0NGTEFHUyAtREZUX0NPTkZJR19PUFRJT05fVVNFX0JaSVAyIgotICBMREZMQUdTPSIkTERGTEFHUyAkQlpJUDJfTElCUyIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9saWJwbmciICE9IG5vOyB0aGVuCi0gIENGTEFHUz0iJENGTEFHUyAkTElCUE5HX0NGTEFHUyAtREZUX0NPTkZJR19PUFRJT05fVVNFX1BORyIKLSAgTERGTEFHUz0iJExERkxBR1MgJExJQlBOR19MSUJTIgotZmkKLWlmIHRlc3QgIiRoYXZlX2hhcmZidXp6IiAhPSBubzsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgJEhBUkZCVVpaX0NGTEFHUyAtREZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaIgotICBMREZMQUdTPSIkTERGTEFHUyAkSEFSRkJVWlpfTElCUyIKLWZpCi0KLUFDX1NVQlNUKFtDRkxBR1NdKQotQUNfU1VCU1QoW0xERkxBR1NdKQotCi0jIGNvbmZpZ3VyYXRpb24gZmlsZSAtLSBzdGF5IGluIDguMyBsaW1pdAotIwotIyBzaW5jZSAjdW5kZWYgZG9lc24ndCBzdXJ2aXZlIGluIGNvbmZpZ3VyYXRpb24gaGVhZGVyIGZpbGVzIHdlIHJlcGxhY2UKLSMgYC91bmRlZicgd2l0aCBgI3VuZGVmJyBhZnRlciBjcmVhdGluZyB0aGUgb3V0cHV0IGZpbGUKLQotQUNfQ09ORklHX0hFQURFUlMoW2Z0Y29uZmlnLmg6ZnRjb25maWcuaW5dLAotICBbbXYgZnRjb25maWcuaCBmdGNvbmZpZy50bXAKLSAgIHNlZCAnc3wvdW5kZWZ8I3VuZGVmfCcgPCBmdGNvbmZpZy50bXAgPiBmdGNvbmZpZy5oCi0gICBybSBmdGNvbmZpZy50bXBdKQotCi0jIGNyZWF0ZSB0aGUgVW5peC1zcGVjaWZpYyBzdWItTWFrZWZpbGVzIGBidWlsZHMvdW5peC91bml4LWRlZi5taycKLSMgYW5kIGBidWlsZHMvdW5peC91bml4LWNjLm1rJyB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtCi0jCi1BQ19DT05GSUdfRklMRVMoW3VuaXgtY2MubWs6dW5peC1jYy5pbgotICAgICAgICAgICAgICAgICB1bml4LWRlZi5tazp1bml4LWRlZi5pbl0pCi0KLSMgcmUtZ2VuZXJhdGUgdGhlIEphbWZpbGUgdG8gdXNlIGxpYnRvb2wgbm93Ci0jCi0jIEFDX0NPTkZJR19GSUxFUyhbLi4vLi4vSmFtZmlsZTouLi8uLi9KYW1maWxlLmluXSkKLQotQUNfT1VUUFVUCi0KLUFDX01TR19OT1RJQ0UoWwotCi1MaWJyYXJ5IGNvbmZpZ3VyYXRpb246Ci0gIGV4dGVybmFsIHpsaWI6ICRoYXZlX3psaWIKLSAgYnppcDI6ICAgICAgICAgJGhhdmVfYnppcDIKLSAgbGlicG5nOiAgICAgICAgJGhhdmVfbGlicG5nCi0gIGhhcmZidXp6OiAgICAgICRoYXZlX2hhcmZidXp6Ci1dKQotCi0jIGVuZCBvZiBjb25maWd1cmUucmF3CmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC9kZXRlY3QubWsgYi9idWlsZHMvdW5peC9kZXRlY3QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyY2YwYTcuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBkZXRlY3QgYSBVTklYIGhvc3QgcGxhdGZvcm0uCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotLlBIT05ZOiBzZXR1cAotCi1pZmVxICgkKFBMQVRGT1JNKSxhbnNpKQotCi0gICMgTm90ZTogdGhpcyB0ZXN0IGlzIGR1cGxpY2F0ZWQgaW4gImJ1aWxkcy90b3BsZXZlbC5tayIuCi0gICMKLSAgaXNfdW5peCA6PSAkKHN0cmlwICQod2lsZGNhcmQgL3NiaW4vaW5pdCkgXAotICAgICAgICAgICAgICAgICAgICAgJCh3aWxkY2FyZCAvdXNyL3NiaW4vaW5pdCkgXAotICAgICAgICAgICAgICAgICAgICAgJCh3aWxkY2FyZCAvZGV2L251bGwpIFwKLSAgICAgICAgICAgICAgICAgICAgICQod2lsZGNhcmQgL2h1cmQvYXV0aCkpCi0gIGlmbmVxICgkKGlzX3VuaXgpLCkKLQotICAgIFBMQVRGT1JNIDo9IHVuaXgKLQotICBlbmRpZiAjIHRlc3QgaXNfdW5peAotZW5kaWYgIyB0ZXN0IFBMQVRGT1JNIGFuc2kKLQotaWZlcSAoJChQTEFURk9STSksdW5peCkKLSAgQ09QWSAgIDo9IGNwCi0gIERFTEVURSA6PSBybSAtZgotICBDQVQgICAgOj0gY2F0Ci0KLSAgIyBJZiBgZGV2ZWwnIGlzIHRoZSByZXF1ZXN0ZWQgdGFyZ2V0LCB3ZSB1c2UgYSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24KLSAgIyBmaWxlIG5hbWVkIGB1bml4LWRldi5taycuICBJdCBkaXNhYmxlcyBvcHRpbWl6YXRpb24gYW5kIGxpYnRvb2wuCi0gICMKLSAgaWZuZXEgKCQoZmluZHN0cmluZyBkZXZlbCwkKE1BS0VDTURHT0FMUykpLCkKLSAgICBDT05GSUdfRklMRSA6PSB1bml4LWRldi5tawotICAgIENDICAgICAgICAgIDo9IGdjYwotICAgIGRldmVsOiBzZXR1cAotICAgIC5QSE9OWTogZGV2ZWwKLSAgZWxzZQotCi0gICAgIyBJZiBgbGNjJyBpcyB0aGUgcmVxdWVzdGVkIHRhcmdldCwgd2UgdXNlIGEgc3BlY2lhbCBjb25maWd1cmF0aW9uCi0gICAgIyBmaWxlIG5hbWVkIGB1bml4LWxjYy5taycuICBJdCBkaXNhYmxlcyBsaWJ0b29sIGZvciBMQ0MuCi0gICAgIwotICAgIGlmbmVxICgkKGZpbmRzdHJpbmcgbGNjLCQoTUFLRUNNREdPQUxTKSksKQotICAgICAgQ09ORklHX0ZJTEUgOj0gdW5peC1sY2MubWsKLSAgICAgIENDICAgICAgICAgIDo9IGxjYwotICAgICAgbGNjOiBzZXR1cAotICAgICAgLlBIT05ZOiBsY2MKLSAgICBlbHNlCi0KLSAgICAgICMgSWYgYSBVbml4IHBsYXRmb3JtIGlzIGRldGVjdGVkLCB0aGUgY29uZmlndXJlIHNjcmlwdCBpcyBjYWxsZWQgYW5kCi0gICAgICAjIGB1bml4LWRlZi5taycgdG9nZXRoZXIgd2l0aCBgdW5peC1jYy5taycgaXMgY3JlYXRlZC4KLSAgICAgICMKLSAgICAgICMgQXJndW1lbnRzIHRvIGBjb25maWd1cmUnIHNob3VsZCBiZSBpbiB0aGUgQ0ZHIHZhcmlhYmxlLiAgRXhhbXBsZToKLSAgICAgICMKLSAgICAgICMgICBtYWtlIENGRz0iLS1wcmVmaXg9L3VzciAtLWRpc2FibGUtc3RhdGljIgotICAgICAgIwotICAgICAgIyBJZiB5b3UgbmVlZCB0byBzZXQgQ0ZMQUdTIG9yIExERkxBR1MsIGRvIGl0IGhlcmUgYWxzby4KLSAgICAgICMKLSAgICAgICMgRmVlbCBmcmVlIHRvIGFkZCBzdXBwb3J0IGZvciBvdGhlciBwbGF0Zm9ybSBzcGVjaWZpYyBjb21waWxlcnMgaW4KLSAgICAgICMgdGhpcyBkaXJlY3RvcnkgKGUuZy4gc29sYXJpcy5tayArIGNoYW5nZXMgaGVyZSB0byBkZXRlY3QgdGhlCi0gICAgICAjIHBsYXRmb3JtKS4KLSAgICAgICMKLSAgICAgIENPTkZJR19GSUxFIDo9IHVuaXgubWsKLSAgICAgIHVuaXg6IHNldHVwCi0gICAgICBtdXN0X2NvbmZpZ3VyZSA6PSAxCi0gICAgICAuUEhPTlk6IHVuaXgKLSAgICBlbmRpZgotICBlbmRpZgotCi0gIGhhdmVfTWFrZWZpbGUgOj0gJCh3aWxkY2FyZCAkKE9CSl9ESVIpL01ha2VmaWxlKQotCi0gICAgICBzZXR1cDogc3RkX3NldHVwCi0gIGlmZGVmIG11c3RfY29uZmlndXJlCi0gICAgaWZuZXEgKCQoaGF2ZV9NYWtlZmlsZSksKQotICAgICAgIyB3ZSBhcmUgYnVpbGRpbmcgRlQyIG5vdCBpbiB0aGUgc3JjIHRyZWUKLQkgICAgICAgICQoVE9QX0RJUikvYnVpbGRzL3VuaXgvY29uZmlndXJlICQodmFsdWUgQ0ZHKQotICAgIGVsc2UKLQkgICAgICBjZCBidWlsZHMvdW5peDsgXAotCSAgICAgICAgLi9jb25maWd1cmUgJCh2YWx1ZSBDRkcpCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotZW5kaWYgICAjIHRlc3QgUExBVEZPUk0gdW5peAotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW4gYi9idWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMWMxNjAuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSMhIC9iaW4vc2gKLSMKLSMgQ29weXJpZ2h0IDIwMDAtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLUxDX0FMTD1DCi1leHBvcnQgTENfQUxMCi0KLQotIyBpZiBgcGtnLWNvbmZpZycgaXMgYXZhaWxhYmxlLCB1c2UgdmFsdWVzIGZyb20gYGZyZWV0eXBlMi5wYycKLSVQS0dfQ09ORklHJSAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yNCA+L2Rldi9udWxsIDI+JjEKLWlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCi0gICMgbm90ZSB0aGF0IG9wdGlvbiBgLS12YXJpYWJsZScgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZQotICAjIFBLR19DT05GSUdfU1lTUk9PVF9ESVIgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgaWYgdGVzdCAieCRTWVNST09UIiAhPSAieCIgOyB0aGVuCi0gICAgUEtHX0NPTkZJR19TWVNST09UX0RJUj0iJFNZU1JPT1QiCi0gICAgZXhwb3J0IFBLR19DT05GSUdfU1lTUk9PVF9ESVIKLSAgZmkKLQotICBwcmVmaXg9YCVQS0dfQ09ORklHJSAtLXZhcmlhYmxlIHByZWZpeCBmcmVldHlwZTJgCi0gIGV4ZWNfcHJlZml4PWAlUEtHX0NPTkZJRyUgLS12YXJpYWJsZSBleGVjX3ByZWZpeCBmcmVldHlwZTJgCi0KLSAgaW5jbHVkZWRpcj1gJVBLR19DT05GSUclIC0tdmFyaWFibGUgaW5jbHVkZWRpciBmcmVldHlwZTJgCi0gIGxpYmRpcj1gJVBLR19DT05GSUclIC0tdmFyaWFibGUgbGliZGlyIGZyZWV0eXBlMmAKLQotICB2ZXJzaW9uPWAlUEtHX0NPTkZJRyUgLS1tb2R2ZXJzaW9uIGZyZWV0eXBlMmAKLQotICBjZmxhZ3M9YCVQS0dfQ09ORklHJSAtLWNmbGFncyBmcmVldHlwZTJgCi0gIGR5bmFtaWNfbGlicz1gJVBLR19DT05GSUclIC0tbGlicyBmcmVldHlwZTJgCi0gIHN0YXRpY19saWJzPWAlUEtHX0NPTkZJRyUgLS1zdGF0aWMgLS1saWJzIGZyZWV0eXBlMmAKLWVsc2UKLSAgcHJlZml4PSIlcHJlZml4JSIKLSAgZXhlY19wcmVmaXg9IiVleGVjX3ByZWZpeCUiCi0KLSAgaW5jbHVkZWRpcj0iJWluY2x1ZGVkaXIlIgotICBsaWJkaXI9IiVsaWJkaXIlIgotCi0gIHZlcnNpb249JWZ0X3ZlcnNpb24lCi0KLSAgY2ZsYWdzPSItSSR7U1lTUk9PVH0kaW5jbHVkZWRpci9mcmVldHlwZTIiCi0gIGR5bmFtaWNfbGlicz0iLWxmcmVldHlwZSIKLSAgc3RhdGljX2xpYnM9IiVMSUJTU1RBVElDX0NPTkZJRyUiCi0gIGlmIHRlc3QgIiR7U1lTUk9PVH0kbGliZGlyIiAhPSAiL3Vzci9saWIiICAgJiYKLSAgICAgdGVzdCAiJHtTWVNST09UfSRsaWJkaXIiICE9ICIvdXNyL2xpYjY0IiA7IHRoZW4KLSAgICBsaWJzX0w9Ii1MJHtTWVNST09UfSRsaWJkaXIiCi0gIGZpCi1maQotCi1vcmlnX3ByZWZpeD0kcHJlZml4Ci1vcmlnX2V4ZWNfcHJlZml4PSRleGVjX3ByZWZpeAotCi1vcmlnX2luY2x1ZGVkaXI9JGluY2x1ZGVkaXIKLW9yaWdfbGliZGlyPSRsaWJkaXIKLQotaW5jbHVkZV9zdWZmaXg9YGVjaG8gJGluY2x1ZGVkaXIgfCBzZWQgInN8JHByZWZpeHx8ImAKLWxpYl9zdWZmaXg9YGVjaG8gJGxpYmRpciB8IHNlZCAic3wkZXhlY19wcmVmaXh8fCJgCi0KLQotdXNhZ2UoKQotewotICBjYXQgPDxFT0YKLVVzYWdlOiBmcmVldHlwZS1jb25maWcgW09QVElPTl0uLi4KLUdldCBGcmVlVHlwZSBjb21waWxhdGlvbiBhbmQgbGlua2luZyBpbmZvcm1hdGlvbi4KLQotT3B0aW9uczoKLSAgLS1wcmVmaXggICAgICAgICAgICAgICBkaXNwbGF5IFxgLS1wcmVmaXgnIHZhbHVlIHVzZWQgZm9yIGJ1aWxkaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVUeXBlIGxpYnJhcnkKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICBvdmVycmlkZSBcYC0tcHJlZml4JyB2YWx1ZSB3aXRoIFBSRUZJWAotICAtLWV4ZWMtcHJlZml4ICAgICAgICAgIGRpc3BsYXkgXGAtLWV4ZWMtcHJlZml4JyB2YWx1ZSB1c2VkIGZvciBidWlsZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGcmVlVHlwZSBsaWJyYXJ5Ci0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgb3ZlcnJpZGUgXGAtLWV4ZWMtcHJlZml4JyB2YWx1ZSB3aXRoIEVQUkVGSVgKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICBkaXNwbGF5IGxpYnRvb2wgdmVyc2lvbiBvZiB0aGUgRnJlZVR5cGUgbGlicmFyeQotICAtLWZ0dmVyc2lvbiAgICAgICAgICAgIGRpc3BsYXkgRnJlZVR5cGUgdmVyc2lvbiBudW1iZXIKLSAgLS1saWJzICAgICAgICAgICAgICAgICBkaXNwbGF5IGZsYWdzIGZvciBsaW5raW5nIHdpdGggdGhlIEZyZWVUeXBlIGxpYnJhcnkKLSAgLS1saWJ0b29sICAgICAgICAgICAgICBkaXNwbGF5IGxpYnJhcnkgbmFtZSBmb3IgbGlua2luZyB3aXRoIGxpYnRvb2wKLSAgLS1jZmxhZ3MgICAgICAgICAgICAgICBkaXNwbGF5IGZsYWdzIGZvciBjb21waWxpbmcgd2l0aCB0aGUgRnJlZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5Ci0gIC0tc3RhdGljICAgICAgICAgICAgICAgbWFrZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBkaXNwbGF5IGZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHN0YXRpYyBsaW5raW5nCi0gIC0taGVscCAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLUVPRgotICBleGl0ICQxCi19Ci0KLQotaWYgdGVzdCAkIyAtZXEgMCA7IHRoZW4KLSAgdXNhZ2UgMSAxPiYyCi1maQotCi0KLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICIkMSIgaW4KLSAgLSo9KikKLSAgICBvcHRhcmc9YGVjaG8gIiQxIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgCi0gICAgOzsKLSAgKikKLSAgICBvcHRhcmc9Ci0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJDEgaW4KLSAgLS1wcmVmaXg9KikKLSAgICBwcmVmaXg9JG9wdGFyZwotICAgIGxvY2FsX3ByZWZpeD15ZXMKLSAgICA7OwotICAtLXByZWZpeCkKLSAgICBlY2hvX3ByZWZpeD15ZXMKLSAgICA7OwotICAtLWV4ZWMtcHJlZml4PSopCi0gICAgZXhlY19wcmVmaXg9JG9wdGFyZwotICAgIGV4ZWNfcHJlZml4X3NldD15ZXMKLSAgICBsb2NhbF9wcmVmaXg9eWVzCi0gICAgOzsKLSAgLS1leGVjLXByZWZpeCkKLSAgICBlY2hvX2V4ZWNfcHJlZml4PXllcwotICAgIDs7Ci0gIC0tdmVyc2lvbikKLSAgICBlY2hvX3ZlcnNpb249eWVzCi0gICAgYnJlYWsKLSAgICA7OwotICAtLWZ0dmVyc2lvbikKLSAgICBlY2hvX2Z0X3ZlcnNpb249eWVzCi0gICAgOzsKLSAgLS1jZmxhZ3MpCi0gICAgZWNob19jZmxhZ3M9eWVzCi0gICAgOzsKLSAgLS1saWJzKQotICAgIGVjaG9fbGlicz15ZXMKLSAgICA7OwotICAtLWxpYnRvb2wpCi0gICAgZWNob19saWJ0b29sPXllcwotICAgIDs7Ci0gIC0tc3RhdGljKQotICAgIHNob3dfc3RhdGljPXllcwotICAgIDs7Ci0gIC0taGVscCkKLSAgICB1c2FnZSAwCi0gICAgOzsKLSAgKikKLSAgICB1c2FnZSAxIDE+JjIKLSAgICA7OwotICBlc2FjCi0gIHNoaWZ0Ci1kb25lCi0KLQotaWYgdGVzdCAiJGxvY2FsX3ByZWZpeCIgPSAieWVzIiA7IHRoZW4KLSAgaWYgdGVzdCAiJGV4ZWNfcHJlZml4X3NldCIgIT0gInllcyIgOyB0aGVuCi0gICAgZXhlY19wcmVmaXg9JHByZWZpeAotICBmaQotZmkKLQotaWYgdGVzdCAiJGxvY2FsX3ByZWZpeCIgPSAieWVzIiA7IHRoZW4KLSAgaW5jbHVkZWRpcj0ke3ByZWZpeH0ke2luY2x1ZGVfc3VmZml4fQotICBpZiB0ZXN0ICIkZXhlY19wcmVmaXhfc2V0IiA9ICJ5ZXMiIDsgdGhlbgotICAgIGxpYmRpcj0ke2V4ZWNfcHJlZml4fSR7bGliX3N1ZmZpeH0KLSAgZWxzZQotICAgIGxpYmRpcj0ke3ByZWZpeH0ke2xpYl9zdWZmaXh9Ci0gIGZpCi1maQotCi0KLWlmIHRlc3QgIiRlY2hvX3ZlcnNpb24iID0gInllcyIgOyB0aGVuCi0gIGVjaG8gJHZlcnNpb24KLWZpCi0KLWlmIHRlc3QgIiRlY2hvX3ByZWZpeCIgPSAieWVzIiA7IHRoZW4KLSAgZWNobyAke1NZU1JPT1R9JHByZWZpeAotZmkKLQotaWYgdGVzdCAiJGVjaG9fZXhlY19wcmVmaXgiID0gInllcyIgOyB0aGVuCi0gIGVjaG8gJHtTWVNST09UfSRleGVjX3ByZWZpeAotZmkKLQotaWYgdGVzdCAiJGVjaG9fZnRfdmVyc2lvbiIgPSAieWVzIiA7IHRoZW4KLSAgbWFqb3I9YGdyZXAgZGVmaW5lICR7U1lTUk9PVH0kaW5jbHVkZWRpci9mcmVldHlwZTIvZnJlZXR5cGUvZnJlZXR5cGUuaCBcCi0gICAgICAgICB8IGdyZXAgRlJFRVRZUEVfTUFKT1IgXAotICAgICAgICAgfCBzZWQgJ3MvLipbIAldXChbMC05XVswLTldKlwpLiovXDEvJ2AKLSAgbWlub3I9YGdyZXAgZGVmaW5lICR7U1lTUk9PVH0kaW5jbHVkZWRpci9mcmVldHlwZTIvZnJlZXR5cGUvZnJlZXR5cGUuaCBcCi0gICAgICAgICB8IGdyZXAgRlJFRVRZUEVfTUlOT1IgXAotICAgICAgICAgfCBzZWQgJ3MvLipbIAldXChbMC05XVswLTldKlwpLiovXDEvJ2AKLSAgcGF0Y2g9YGdyZXAgZGVmaW5lICR7U1lTUk9PVH0kaW5jbHVkZWRpci9mcmVldHlwZTIvZnJlZXR5cGUvZnJlZXR5cGUuaCBcCi0gICAgICAgICB8IGdyZXAgRlJFRVRZUEVfUEFUQ0ggXAotICAgICAgICAgfCBzZWQgJ3MvLipbIAldXChbMC05XVswLTldKlwpLiovXDEvJ2AKLSAgZWNobyAkbWFqb3IuJG1pbm9yLiRwYXRjaAotZmkKLQotaWYgdGVzdCAiJGVjaG9fY2ZsYWdzIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvICRjZmxhZ3MgfCBzZWQgInN8JG9yaWdfaW5jbHVkZWRpci9mcmVldHlwZTJ8JGluY2x1ZGVkaXIvZnJlZXR5cGUyfCIKLWZpCi0KLWlmIHRlc3QgIiRlY2hvX2xpYnMiID0gInllcyIgOyB0aGVuCi0gIGlmIHRlc3QgIiRzaG93X3N0YXRpYyIgPSAieWVzIiA7IHRoZW4KLSAgICBsaWJzPSIkbGlic19MICRzdGF0aWNfbGlicyIKLSAgZWxzZQotICAgIGxpYnM9IiRsaWJzX0wgJGR5bmFtaWNfbGlicyIKLSAgZmkKLSAgZWNobyAkbGlicyB8IHNlZCAic3wkb3JpZ19saWJkaXJ8JGxpYmRpcnwiCi1maQotCi1pZiB0ZXN0ICIkZWNob19saWJ0b29sIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvICR7U1lTUk9PVH0kbGliZGlyL2xpYmZyZWV0eXBlLmxhCi1maQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluIGIvYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRmZGE0Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy91bml4L2ZyZWV0eXBlMi5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXByZWZpeD0lcHJlZml4JQotZXhlY19wcmVmaXg9JWV4ZWNfcHJlZml4JQotbGliZGlyPSVsaWJkaXIlCi1pbmNsdWRlZGlyPSVpbmNsdWRlZGlyJQotCi1OYW1lOiBGcmVlVHlwZSAyCi1VUkw6IGh0dHA6Ly9mcmVldHlwZS5vcmcKLURlc2NyaXB0aW9uOiBBIGZyZWUsIGhpZ2gtcXVhbGl0eSwgYW5kIHBvcnRhYmxlIGZvbnQgZW5naW5lLgotVmVyc2lvbjogJWZ0X3ZlcnNpb24lCi1SZXF1aXJlczoKLVJlcXVpcmVzLnByaXZhdGU6ICVSRVFVSVJFU19QUklWQVRFJQotTGliczogLUwke2xpYmRpcn0gLWxmcmVldHlwZQotTGlicy5wcml2YXRlOiAlTElCU19QUklWQVRFJQotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vZnJlZXR5cGUyCmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC9mcmVldHlwZTIubTQgYi9idWlsZHMvdW5peC9mcmVldHlwZTIubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MjIxMmYuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvZnJlZXR5cGUyLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLSMgQ29uZmlndXJlIHBhdGhzIGZvciBGcmVlVHlwZTIKLSMgTWFyY2VsbyBNYWdhbGxvbiAyMDAxLTEwLTI2LCBiYXNlZCBvbiBndGsubTQgYnkgT3dlbiBUYXlsb3IKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZQotIyBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQKLSMgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlciB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YKLSMgdGhhdCBwcm9ncmFtLgotIwotIyBzZXJpYWwgNAotCi0jIEFDX0NIRUNLX0ZUMihbTUlOSU1VTS1WRVJTSU9OIFssIEFDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV1dKQotIyBUZXN0IGZvciBGcmVlVHlwZSAyLCBhbmQgZGVmaW5lIEZUMl9DRkxBR1MgYW5kIEZUMl9MSUJTLgotIyBNSU5JTVVNLVZFUlNJT04gaXMgd2hhdCBsaWJ0b29sIHJlcG9ydHM7IHRoZSBkZWZhdWx0IGlzIGA3LjAuMScgKHRoaXMgaXMKLSMgRnJlZVR5cGUgMi4wLjQpLgotIwotQUNfREVGVU4oW0FDX0NIRUNLX0ZUMl0sCi0gIFsjIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMgZnJvbSB0aGUgZnJlZXR5cGUtY29uZmlnIHNjcmlwdAotICAgIwotICAgQUNfQVJHX1dJVEgoW2Z0LXByZWZpeF0sCi0gICAgIGRubCBkb24ndCBxdW90ZSBBU19IRUxQX1NUUklORyEKLSAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1mdC1wcmVmaXg9UFJFRklYXSwKLSAgICAgICAgICAgICAgICAgICAgW1ByZWZpeCB3aGVyZSBGcmVlVHlwZSBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0pLAotICAgICBbZnRfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiXSwKLSAgICAgW2Z0X2NvbmZpZ19wcmVmaXg9IiJdKQotCi0gICBBQ19BUkdfV0lUSChbZnQtZXhlYy1wcmVmaXhdLAotICAgICBkbmwgZG9uJ3QgcXVvdGUgQVNfSEVMUF9TVFJJTkchCi0gICAgIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZnQtZXhlYy1wcmVmaXg9UFJFRklYXSwKLSAgICAgICAgICAgICAgICAgICAgW0V4ZWMgcHJlZml4IHdoZXJlIEZyZWVUeXBlIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSksCi0gICAgIFtmdF9jb25maWdfZXhlY19wcmVmaXg9IiR3aXRodmFsIl0sCi0gICAgIFtmdF9jb25maWdfZXhlY19wcmVmaXg9IiJdKQotCi0gICBBQ19BUkdfRU5BQkxFKFtmcmVldHlwZXRlc3RdLAotICAgICBkbmwgZG9uJ3QgcXVvdGUgQVNfSEVMUF9TVFJJTkchCi0gICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtZnJlZXR5cGV0ZXN0XSwKLSAgICAgICAgICAgICAgICAgICAgW0RvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBGcmVlVHlwZSBwcm9ncmFtXSksCi0gICAgIFtdLAotICAgICBbZW5hYmxlX2Z0dGVzdD15ZXNdKQotCi0gICBpZiB0ZXN0IHgkZnRfY29uZmlnX2V4ZWNfcHJlZml4ICE9IHggOyB0aGVuCi0gICAgIGZ0X2NvbmZpZ19hcmdzPSIkZnRfY29uZmlnX2FyZ3MgLS1leGVjLXByZWZpeD0kZnRfY29uZmlnX2V4ZWNfcHJlZml4IgotICAgICBpZiB0ZXN0IHgke0ZUMl9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgotICAgICAgIEZUMl9DT05GSUc9JGZ0X2NvbmZpZ19leGVjX3ByZWZpeC9iaW4vZnJlZXR5cGUtY29uZmlnCi0gICAgIGZpCi0gICBmaQotCi0gICBpZiB0ZXN0IHgkZnRfY29uZmlnX3ByZWZpeCAhPSB4IDsgdGhlbgotICAgICBmdF9jb25maWdfYXJncz0iJGZ0X2NvbmZpZ19hcmdzIC0tcHJlZml4PSRmdF9jb25maWdfcHJlZml4IgotICAgICBpZiB0ZXN0IHgke0ZUMl9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgotICAgICAgIEZUMl9DT05GSUc9JGZ0X2NvbmZpZ19wcmVmaXgvYmluL2ZyZWV0eXBlLWNvbmZpZwotICAgICBmaQotICAgZmkKLQotICAgaWYgdGVzdCAieCRGVDJfQ09ORklHIiA9IHggOyB0aGVuCi0gICAgIEFDX1BBVEhfVE9PTChbRlQyX0NPTkZJR10sIFtmcmVldHlwZS1jb25maWddLCBbbm9dKQotICAgZmkKLQotICAgbWluX2Z0X3ZlcnNpb249bTRfaWYoWyQxXSwgW10sIFs3LjAuMV0sIFskMV0pCi0gICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBGcmVlVHlwZSAtLSB2ZXJzaW9uID49ICRtaW5fZnRfdmVyc2lvbl0pCi0gICBub19mdD0iIgotICAgaWYgdGVzdCAiJEZUMl9DT05GSUciID0gIm5vIiA7IHRoZW4KLSAgICAgbm9fZnQ9eWVzCi0gICBlbHNlCi0gICAgIEZUMl9DRkxBR1M9YCRGVDJfQ09ORklHICRmdF9jb25maWdfYXJncyAtLWNmbGFnc2AKLSAgICAgRlQyX0xJQlM9YCRGVDJfQ09ORklHICRmdF9jb25maWdfYXJncyAtLWxpYnNgCi0gICAgIGZ0X2NvbmZpZ19tYWpvcl92ZXJzaW9uPWAkRlQyX0NPTkZJRyAkZnRfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAotICAgICAgIHNlZCAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMS8nYAotICAgICBmdF9jb25maWdfbWlub3JfdmVyc2lvbj1gJEZUMl9DT05GSUcgJGZ0X2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKLSAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKLSAgICAgZnRfY29uZmlnX21pY3JvX3ZlcnNpb249YCRGVDJfQ09ORklHICRmdF9jb25maWdfYXJncyAtLXZlcnNpb24gfCBcCi0gICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCi0gICAgIGZ0X21pbl9tYWpvcl92ZXJzaW9uPWBlY2hvICRtaW5fZnRfdmVyc2lvbiB8IFwKLSAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKLSAgICAgZnRfbWluX21pbm9yX3ZlcnNpb249YGVjaG8gJG1pbl9mdF92ZXJzaW9uIHwgXAotICAgICAgIHNlZCAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMi8nYAotICAgICBmdF9taW5fbWljcm9fdmVyc2lvbj1gZWNobyAkbWluX2Z0X3ZlcnNpb24gfCBcCi0gICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCi0gICAgIGlmIHRlc3QgeCRlbmFibGVfZnR0ZXN0ID0geHllcyA7IHRoZW4KLSAgICAgICBmdF9jb25maWdfaXNfbHQ9IiIKLSAgICAgICBpZiB0ZXN0ICRmdF9jb25maWdfbWFqb3JfdmVyc2lvbiAtbHQgJGZ0X21pbl9tYWpvcl92ZXJzaW9uIDsgdGhlbgotICAgICAgICAgZnRfY29uZmlnX2lzX2x0PXllcwotICAgICAgIGVsc2UKLSAgICAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19tYWpvcl92ZXJzaW9uIC1lcSAkZnRfbWluX21ham9yX3ZlcnNpb24gOyB0aGVuCi0gICAgICAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19taW5vcl92ZXJzaW9uIC1sdCAkZnRfbWluX21pbm9yX3ZlcnNpb24gOyB0aGVuCi0gICAgICAgICAgICAgZnRfY29uZmlnX2lzX2x0PXllcwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgaWYgdGVzdCAkZnRfY29uZmlnX21pbm9yX3ZlcnNpb24gLWVxICRmdF9taW5fbWlub3JfdmVyc2lvbiA7IHRoZW4KLSAgICAgICAgICAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19taWNyb192ZXJzaW9uIC1sdCAkZnRfbWluX21pY3JvX3ZlcnNpb24gOyB0aGVuCi0gICAgICAgICAgICAgICAgIGZ0X2NvbmZpZ19pc19sdD15ZXMKLSAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgZmkKLSAgICAgICAgICAgZmkKLSAgICAgICAgIGZpCi0gICAgICAgZmkKLSAgICAgICBpZiB0ZXN0IHgkZnRfY29uZmlnX2lzX2x0ID0geHllcyA7IHRoZW4KLSAgICAgICAgIG5vX2Z0PXllcwotICAgICAgIGVsc2UKLSAgICAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICAgICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkRlQyX0NGTEFHUyIKLSAgICAgICAgIExJQlM9IiRGVDJfTElCUyAkTElCUyIKLQotICAgICAgICAgIwotICAgICAgICAgIyBTYW5pdHkgY2hlY2tzIGZvciB0aGUgcmVzdWx0cyBvZiBmcmVldHlwZS1jb25maWcgdG8gc29tZSBleHRlbnQuCi0gICAgICAgICAjCi0gICAgICAgICBBQ19SVU5fSUZFTFNFKFsKLSAgICAgICAgICAgICBBQ19MQU5HX1NPVVJDRShbWwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1pbnQKLW1haW4oKQotewotICBGVF9MaWJyYXJ5IGxpYnJhcnk7Ci0gIEZUX0Vycm9yICBlcnJvcjsKLQotICBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoJmxpYnJhcnkpOwotCi0gIGlmIChlcnJvcikKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICB7Ci0gICAgRlRfRG9uZV9GcmVlVHlwZShsaWJyYXJ5KTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi0gICAgICAgICAgICAgXV0pCi0gICAgICAgICAgIF0sCi0gICAgICAgICAgIFtdLAotICAgICAgICAgICBbbm9fZnQ9eWVzXSwKLSAgICAgICAgICAgW2VjaG8gJEVDSE9fTiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWluZyBPSy4uLiAkRUNIT19DIl0pCi0KLSAgICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICAgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKLSAgICAgICBmaSAgICAgICAgICAgICAjIHRlc3QgJGZ0X2NvbmZpZ192ZXJzaW9uIC1sdCAkZnRfbWluX3ZlcnNpb24KLSAgICAgZmkgICAgICAgICAgICAgICAjIHRlc3QgeCRlbmFibGVfZnR0ZXN0ID0geHllcwotICAgZmkgICAgICAgICAgICAgICAgICMgdGVzdCAiJEZUMl9DT05GSUciID0gIm5vIgotCi0gICBpZiB0ZXN0IHgkbm9fZnQgPSB4IDsgdGhlbgotICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotICAgICBtNF9pZihbJDJdLCBbXSwgWzpdLCBbJDJdKQotICAgZWxzZQotICAgICBBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgIGlmIHRlc3QgIiRGVDJfQ09ORklHIiA9ICJubyIgOyB0aGVuCi0gICAgICAgQUNfTVNHX1dBUk4oWwotCi0gIFRoZSBmcmVldHlwZS1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBGcmVlVHlwZSAyIGNvdWxkIG5vdCBiZSBmb3VuZC4KLSAgSWYgRnJlZVR5cGUgMiB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4KLSAgeW91ciBwYXRoLCBvciBzZXQgdGhlIEZUMl9DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlCi0gIGZ1bGwgcGF0aCB0byBmcmVldHlwZS1jb25maWcuCi0gICAgICAgXSkKLSAgICAgZWxzZQotICAgICAgIGlmIHRlc3QgeCRmdF9jb25maWdfaXNfbHQgPSB4eWVzIDsgdGhlbgotICAgICAgICAgQUNfTVNHX1dBUk4oWwotCi0gIFlvdXIgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhlIEZyZWVUeXBlIDIgbGlicmFyeSBpcyB0b28gb2xkLgotICBJZiB5b3UgaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgRnJlZVR5cGUgMiwgbWFrZSBzdXJlIHRoYXQKLSAgY29ycmVjdCB2YWx1ZXMgZm9yIC0td2l0aC1mdC1wcmVmaXggb3IgLS13aXRoLWZ0LWV4ZWMtcHJlZml4Ci0gIGFyZSB1c2VkLCBvciBzZXQgdGhlIEZUMl9DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlCi0gIGZ1bGwgcGF0aCB0byBmcmVldHlwZS1jb25maWcuCi0gICAgICAgICBdKQotICAgICAgIGVsc2UKLSAgICAgICAgIEFDX01TR19XQVJOKFsKLQotICBUaGUgRnJlZVR5cGUgdGVzdCBwcm9ncmFtIGZhaWxlZCB0byBydW4uICBJZiB5b3VyIHN5c3RlbSB1c2VzCi0gIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHRoZXkgYXJlIGluc3RhbGxlZCBvdXRzaWRlIHRoZSBub3JtYWwKLSAgc3lzdGVtIGxpYnJhcnkgcGF0aCwgbWFrZSBzdXJlIHRoZSB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEgKLSAgKG9yIHdoYXRldmVyIGlzIGFwcHJvcHJpYXRlIGZvciB5b3VyIHN5c3RlbSkgaXMgY29ycmVjdGx5IHNldC4KLSAgICAgICAgIF0pCi0gICAgICAgZmkKLSAgICAgZmkKLQotICAgICBGVDJfQ0ZMQUdTPSIiCi0gICAgIEZUMl9MSUJTPSIiCi0gICAgIG00X2lmKFskM10sIFtdLCBbOl0sIFskM10pCi0gICBmaQotCi0gICBBQ19TVUJTVChbRlQyX0NGTEFHU10pCi0gICBBQ19TVUJTVChbRlQyX0xJQlNdKV0pCi0KLSMgZW5kIG9mIGZyZWV0eXBlMi5tNApkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvZnQtbXVubWFwLm00IGIvYnVpbGRzL3VuaXgvZnQtbXVubWFwLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RkN2Q1Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy91bml4L2Z0LW11bm1hcC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIEZyZWVUeXBlIHNwZWNpZmljIGF1dG9jb25mIHRlc3RzCi0jCi0jIENvcHlyaWdodCAyMDAyLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0jIHNlcmlhbCAyCi0KLUFDX0RFRlVOKFtGVF9NVU5NQVBfUEFSQU1dLAotICBbQUNfTVNHX0NIRUNLSU5HKFtmb3IgbXVubWFwJ3MgZmlyc3QgcGFyYW1ldGVyIHR5cGVdKQotICAgQUNfQ09NUElMRV9JRkVMU0UoWwotICAgICAgIEFDX0xBTkdfU09VUkNFKFtbCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotaW50IG11bm1hcCh2b2lkICosIHNpemVfdCk7Ci0KLSAgICAgICBdXSkKLSAgICAgXSwKLSAgICAgW0FDX01TR19SRVNVTFQoW3ZvaWQgKl0pCi0gICAgICBBQ19ERUZJTkUoW01VTk1BUF9VU0VTX1ZPSURQXSwKLSAgICAgICAgW10sCi0gICAgICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgbXVubWFwIGlzIG9mIHR5cGUgdm9pZCAqXSldLAotICAgICBbQUNfTVNHX1JFU1VMVChbY2hhciAqXSldKQotICBdKQotCi0jIGVuZCBvZiBmdC1tdW5tYXAubTQKZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L2Z0Y29uZmlnLmluIGIvYnVpbGRzL3VuaXgvZnRjb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDEwMWQuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvZnRjb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjb25maWcuaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVOSVgtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkICovCi0gIC8qIGJ5IHRoZSByZXN0IG9mIHRoZSBlbmdpbmUuICBNb3N0IG9mIHRoZSBtYWNyb3MgaGVyZSBhcmUgYXV0b21hdGljYWxseSAqLwotICAvKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSwgYW5kIHlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2hhbmdlIGl0IHRvICAgKi8KLSAgLyogcG9ydCBGcmVlVHlwZSwgZXhjZXB0IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhIG5vbi1BTlNJICAgICAgICAgICovCi0gIC8qIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSBob3dldmVyIHRoYXQgaWYgc29tZSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWQsIHdlICAgICAgICovCi0gIC8qIGFkdmlzZSB5b3UgdG8gcGxhY2UgYSBtb2RpZmllZCBjb3B5IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyB1c3VhbGx5IGBidWlsZHMvPHN5c3RlbT4nLCBhbmQgY29udGFpbnMgICAgICAgICovCi0gIC8qIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW5jbHVkZWQgZmlyc3Qgd2hlbiBidWlsZGluZyAgICAqLwotICAvKiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRDT05GSUdfSF8KLSNkZWZpbmUgRlRDT05GSUdfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfT1BUSU9OU19ICi0jaW5jbHVkZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgUExBVEZPUk0tU1BFQ0lGSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIHRvIHN1aXQgYSBzcGVjaWZpYyBzeXN0ZW0uICBUaGUgY3VycmVudCAgICovCi0gIC8qIG9uZXMgYXJlIGRlZmF1bHRzIHVzZWQgdG8gY29tcGlsZSBGcmVlVHlwZSBpbiBhbiBBTlNJIEMgZW52aXJvbm1lbnQgICAqLwotICAvKiAoMTZiaXQgY29tcGlsZXJzIGFyZSBhbHNvIHN1cHBvcnRlZCkuICBDb3B5IHRoaXMgZmlsZSB0byB5b3VyIG93biAgICAgKi8KLSAgLyogYGJ1aWxkcy88c3lzdGVtPicgZGlyZWN0b3J5LCBhbmQgZWRpdCBpdCB0byBwb3J0IHRoZSBlbmdpbmUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgSEFWRV9VTklTVERfSAotI3VuZGVmIEhBVkVfRkNOVExfSAotI3VuZGVmIEhBVkVfU1RESU5UX0gKLQotCi0gIC8qIFRoZXJlIGFyZSBzeXN0ZW1zIChsaWtlIHRoZSBUZXhhcyBJbnN0cnVtZW50cyAnQzU0eCkgd2hlcmUgYSBgY2hhcicgKi8KLSAgLyogaGFzIDE2IGJpdHMuICBBTlNJIEMgc2F5cyB0aGF0IHNpemVvZihjaGFyKSBpcyBhbHdheXMgMS4gIFNpbmNlIGFuICAqLwotICAvKiBgaW50JyBoYXMgMTYgYml0cyBhbHNvIGZvciB0aGlzIHN5c3RlbSwgc2l6ZW9mKGludCkgZ2l2ZXMgMSB3aGljaCAgICovCi0gIC8qIGlzIHByb2JhYmx5IHVuZXhwZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgQ0hBUl9CSVQnIChkZWZpbmVkIGluIGxpbWl0cy5oKSBnaXZlcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSAgICAgICovCi0gIC8qIGBjaGFyJyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmbmRlZiBGVF9DSEFSX0JJVAotI2RlZmluZSBGVF9DSEFSX0JJVCAgQ0hBUl9CSVQKLSNlbmRpZgotCi0KLSN1bmRlZiBGVF9VU0VfQVVUT0NPTkZfU0laRU9GX1RZUEVTCi0jaWZkZWYgRlRfVVNFX0FVVE9DT05GX1NJWkVPRl9UWVBFUwotCi0jdW5kZWYgU0laRU9GX0lOVAotI3VuZGVmIFNJWkVPRl9MT05HCi0jZGVmaW5lIEZUX1NJWkVPRl9JTlQgIFNJWkVPRl9JTlQKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgU0laRU9GX0xPTkcKLQotI2Vsc2UgLyogIUZUX1VTRV9BVVRPQ09ORl9TSVpFT0ZfVFlQRVMgKi8KLQotICAvKiBGb2xsb3dpbmcgY3BwIGNvbXB1dGF0aW9uIG9mIHRoZSBiaXQgbGVuZ3RoIG9mIGludCBhbmQgbG9uZyAqLwotICAvKiBpcyBjb3BpZWQgZnJvbSBkZWZhdWx0IGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmguICAqLwotICAvKiBJZiBhbnkgaW1wcm92ZW1lbnQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZmlsZSwgaXQgc2hvdWxkIGJlICAqLwotICAvKiBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCBoZWFkZXIgZmlsZSBmb3IgdGhlIGJ1aWxkZXJzIHRoYXQgICAqLwotICAvKiBkbyBub3QgdXNlIGNvbmZpZ3VyZSBzY3JpcHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIFRoZSBzaXplIG9mIGFuIGBpbnQnIHR5cGUuICAqLwotI2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDE2IC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDMyIC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiBGVF9VSU5UX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfSU5UICAoNjQgLyBGVF9DSEFSX0JJVCkKLSNlbHNlCi0jZXJyb3IgIlVuc3VwcG9ydGVkIHNpemUgb2YgYGludCcgdHlwZSEiCi0jZW5kaWYKLQotICAvKiBUaGUgc2l6ZSBvZiBhIGBsb25nJyB0eXBlLiAgQSBmaXZlLWJ5dGUgYGxvbmcnIChhcyB1c2VkIGUuZy4gb24gdGhlICovCi0gIC8qIERNNjQyKSBpcyByZWNvZ25pemVkIGJ1dCBhdm9pZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoMzIgLyBGVF9DSEFSX0JJVCkKLSNlbGlmIEZUX1VMT05HX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICgzMiAvIEZUX0NIQVJfQklUKQotI2VsaWYgRlRfVUxPTkdfTUFYID4gMHhGRkZGRkZGRlVMICYmIEZUX1VMT05HX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKDY0IC8gRlRfQ0hBUl9CSVQpCi0jZWxzZQotI2Vycm9yICJVbnN1cHBvcnRlZCBzaXplIG9mIGBsb25nJyB0eXBlISIKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX1VTRV9BVVRPQ09ORl9TSVpFT0ZfVFlQRVMgKi8KLQotCi0gIC8qIEZUX1VOVVNFRCBpcyBhIG1hY3JvIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIHBhcmFtZXRlciBpcyBub3QgICovCi0gIC8qIHVzZWQgLS0gdGhpcyBpcyBvbmx5IHVzZWQgdG8gZ2V0IHJpZCBvZiB1bnBsZWFzYW50IGNvbXBpbGVyIHdhcm5pbmdzICovCi0jaWZuZGVmIEZUX1VOVVNFRAotI2RlZmluZSBGVF9VTlVTRUQoIGFyZyApICAoIChhcmcpID0gKGFyZykgKQotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgQVVUT01BVElDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuICBEb24ndCB0b3VjaCAgICovCi0gIC8qIHRoZWlyIGRlZmluaXRpb24sIHVubGVzcyB5b3Uga25vdyBwcmVjaXNlbHkgd2hhdCB5b3UgYXJlIGRvaW5nLiAgTm8gICAqLwotICAvKiBwb3J0ZXIgc2hvdWxkIG5lZWQgdG8gbWVzcyB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNYWMgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBpcyB0aGUgb25seSBuZWNlc3NhcnkgY2hhbmdlLCBzbyBpdCBpcyBkZWZpbmVkIGhlcmUgaW5zdGVhZCAgICAqLwotICAvKiAgIHByb3ZpZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgZGVmaW5lZCggX19BUFBMRV9fICkgfHwgKCBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgZGVmaW5lZCggbWFjaW50b3NoICkgKQotICAvKiBubyBDYXJib24gZnJhbWV3b3JrcyBmb3IgNjRiaXQgMTAuNC54ICovCi0gIC8qIEF2YWlsYWJpbGl0eU1hY3Jvcy5oIGlzIGF2YWlsYWJsZSBzaW5jZSBNYWMgT1MgWCAxMC4yLCAgICAgICAgKi8KLSAgLyogc28gZ3Vlc3MgdGhlIHN5c3RlbSB2ZXJzaW9uIGJ5IG1heGltdW0gZXJybm8gYmVmb3JlIGluY2x1c2lvbiAqLwotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgRUNBTkNFTEVEIC8qIGRlZmluZWQgc2luY2UgMTAuMiAqLwotI2luY2x1ZGUgIkF2YWlsYWJpbGl0eU1hY3Jvcy5oIgotI2VuZGlmCi0jaWYgZGVmaW5lZCggX19MUDY0X18gKSAmJiBcCi0gICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQgKQotL3VuZGVmIEZUX01BQ0lOVE9TSAotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoIF9fU0NfXyApIHx8IGRlZmluZWQoIF9fTVJDX18gKQotICAvKiBDbGFzc2ljIE1hY09TIGNvbXBpbGVycyAqLwotI2luY2x1ZGUgIkNvbmRpdGlvbmFsTWFjcm9zLmgiCi0jaWYgVEFSR0VUX09TX01BQwotI2RlZmluZSBGVF9NQUNJTlRPU0ggMQotI2VuZGlmCi0KLSNlbmRpZgotCi0KLSAgLyogRml4IGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBzZ2kgY29tcGlsZXIgKi8KLSNpZiBkZWZpbmVkKCBfX3NnaSApICYmICFkZWZpbmVkKCBfX0dOVUNfXyApCi0jaWYgZGVmaW5lZCggX0NPTVBJTEVSX1ZFUlNJT04gKSAmJiAoIF9DT01QSUxFUl9WRVJTSU9OID49IDczMCApCi0jcHJhZ21hIHNldCB3b2ZmIDM1MDUKLSNlbmRpZgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNpY190eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDE2Yml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfSW50MTY7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMTZiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEZUX1VJbnQxNjsKLQotICAvKiAqLwotCi0KLSAgLyogdGhpcyAjaWYgMCAuLi4gI2VuZGlmIGNsYXVzZSBpcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyAqLwotI2lmIDAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBYWFggIEZUX0ludDMyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIFhYWCAgRlRfVUludDMyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgNjRiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICBPbmx5IGRlZmluZWQgaWYgdGhlcmUgaXMgcmVhbCA2NGJpdCBzdXBwb3J0OyAgICovCi0gIC8qICAgIG90aGVyd2lzZSwgaXQgZ2V0cyBlbXVsYXRlZCB3aXRoIGEgc3RydWN0dXJlIChpZiBuZWNlc3NhcnkpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgWFhYICBGVF9JbnQ2NDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDY0Yml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgT25seSBkZWZpbmVkIGlmIHRoZXJlIGlzIHJlYWwgNjRiaXQgc3VwcG9ydDsgICAqLwotICAvKiAgICBvdGhlcndpc2UsIGl0IGdldHMgZW11bGF0ZWQgd2l0aCBhIHN0cnVjdHVyZSAoaWYgbmVjZXNzYXJ5KS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgWFhYICBGVF9VSW50NjQ7Ci0KLSAgLyogKi8KLQotI2VuZGlmCi0KLSNpZiBGVF9TSVpFT0ZfSU5UID09IDQKLQotICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfVUludDMyOwotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSA0Ci0KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgRlRfSW50MzI7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIEZUX1VJbnQzMjsKLQotI2Vsc2UKLSNlcnJvciAibm8gMzJiaXQgdHlwZSBmb3VuZCAtLSBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGVzIgotI2VuZGlmCi0KLQotICAvKiBsb29rIHVwIGFuIGludGVnZXIgdHlwZSB0aGF0IGlzIGF0IGxlYXN0IDMyIGJpdHMgKi8KLSNpZiBGVF9TSVpFT0ZfSU5UID49IDQKLQotICB0eXBlZGVmIGludCAgICAgICAgICAgIEZUX0Zhc3Q7Ci0gIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgRlRfVUZhc3Q7Ci0KLSNlbGlmIEZUX1NJWkVPRl9MT05HID49IDQKLQotICB0eXBlZGVmIGxvbmcgICAgICAgICAgIEZUX0Zhc3Q7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUZhc3Q7Ci0KLSNlbmRpZgotCi0KLSAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIDY0LWJpdCBpbnQgdHlwZSAgKi8KLSAgLyogKG1vc3RseSBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgYGF1dG9jb25mJykgKi8KLSNpZiBGVF9TSVpFT0ZfTE9ORyA9PSA4Ci0KLSAgLyogRlRfTE9ORzY0IG11c3QgYmUgZGVmaW5lZCBpZiBhIDY0LWJpdCB0eXBlIGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nCi0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZwotCi0gIC8qIHdlIGhhbmRsZSB0aGUgTExQNjQgc2NoZW1lIHNlcGFyYXRlbHkgZm9yIEdDQyBhbmQgY2xhbmcsICovCi0gIC8qIHN1cHByZXNzaW5nIHRoZSBgbG9uZyBsb25nJyB3YXJuaW5nICAgICAgICAgICAgICAgICAgICAgICovCi0jZWxpZiAoIEZUX1NJWkVPRl9MT05HID09IDQgKSAgICAgICAmJiBcCi0gICAgICBkZWZpbmVkKCBIQVZFX0xPTkdfTE9OR19JTlQgKSAmJiBcCi0gICAgICBkZWZpbmVkKCBfX0dOVUNfXyApCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbG9uZy1sb25nIgotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSA2NC1iaXQgZGF0YSB0eXBlIG1heSBjcmVhdGUgY29tcGlsYXRpb24gcHJvYmxlbXMgaWYgeW91IGNvbXBpbGUgICAgICovCi0gIC8qIGluIHN0cmljdCBBTlNJIG1vZGUuICBUbyBhdm9pZCB0aGVtLCB3ZSBkaXNhYmxlIG90aGVyIDY0LWJpdCBkYXRhICAgICAqLwotICAvKiB0eXBlcyBpZiBfX1NURENfXyBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGlnbm9yZSB0aGlzIHJ1bGUgICAgICAgKi8KLSAgLyogYnkgZGVmaW5pbmcgdGhlIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgY29uZmlndXJhdGlvbiBtYWNyby4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VsaWYgIWRlZmluZWQoIF9fU1REQ19fICkgfHwgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCApCi0KLSNpZiBkZWZpbmVkKCBfX1NURENfVkVSU0lPTl9fICkgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCi0KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VsaWYgZGVmaW5lZCggX01TQ19WRVIgKSAmJiBfTVNDX1ZFUiA+PSA5MDAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0KLSAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgX19pbnQ2NCB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIF9faW50NjQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fQk9STEFORENfXyApICAvKiBCb3JsYW5kIEMrKyAqLwotCi0gIC8qIFhYWFg6IFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgdmFsdWUgb2YgX19CT1JMQU5EQ19fIGluIG9yZGVyICovCi0gIC8qICAgICAgIHRvIHRlc3QgdGhlIGNvbXBpbGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgX19pbnQ2NCB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIF9faW50NjQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fV0FUQ09NQ19fICkgICAvKiBXYXRjb20gQysrICovCi0KLSAgLyogV2F0Y29tIGRvZXNuJ3QgcHJvdmlkZSA2NC1iaXQgZGF0YSB0eXBlcyAqLwotCi0jZWxpZiBkZWZpbmVkKCBfX01XRVJLU19fICkgICAgLyogTWV0cm93ZXJrcyBDb2RlV2FycmlvciAqLwotCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSNlbGlmIGRlZmluZWQoIF9fR05VQ19fICkKLQotICAvKiBHQ0MgcHJvdmlkZXMgdGhlIGBsb25nIGxvbmcnIHR5cGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VuZGlmIC8qIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCAqLwotCi0jZW5kaWYgLyogRlRfU0laRU9GX0xPTkcgPT0gOCAqLwotCi0jaWZkZWYgRlRfTE9ORzY0Ci0gIHR5cGVkZWYgRlRfSU5UNjQgICBGVF9JbnQ2NDsKLSAgdHlwZWRlZiBGVF9VSU5UNjQgIEZUX1VJbnQ2NDsKLSNlbmRpZgotCi0KLSNpZmRlZiBfV0lONjQKLSAgLyogb25seSA2NGJpdCBXaW5kb3dzIHVzZXMgdGhlIExMUDY0IGRhdGEgbW9kZWwsIGkuZS4sICovCi0gIC8qIDMyYml0IGludGVnZXJzLCA2NGJpdCBwb2ludGVycyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9VSU5UX1RPX1BPSU5URVIoIHggKSAodm9pZCopKHVuc2lnbmVkIF9faW50NjQpKHgpCi0jZWxzZQotI2RlZmluZSBGVF9VSU5UX1RPX1BPSU5URVIoIHggKSAodm9pZCopKHVuc2lnbmVkIGxvbmcpKHgpCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogbWlzY2VsbGFuZW91cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX0JFR0lOX1NUTU5UICBkbyB7Ci0jZGVmaW5lIEZUX0VORF9TVE1OVCAgICB9IHdoaWxlICggMCApCi0jZGVmaW5lIEZUX0RVTU1ZX1NUTU5UICBGVF9CRUdJTl9TVE1OVCBGVF9FTkRfU1RNTlQKLQotCi0gIC8qIHR5cGVvZiBjb25kaXRpb24gdGFrZW4gZnJvbSBnbnVsaWIncyBgaW50cHJvcHMuaCcgaGVhZGVyIGZpbGUgKi8KLSNpZiAoICggZGVmaW5lZCggX19HTlVDX18gKSAmJiBfX0dOVUNfXyA+PSAyICkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgICggZGVmaW5lZCggX19JQk1DX18gKSAmJiBfX0lCTUNfXyA+PSAxMjEwICYmICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGVmaW5lZCggX19JQk1fX1RZUEVPRl9fICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgICggZGVmaW5lZCggX19TVU5QUk9fQyApICYmIF9fU1VOUFJPX0MgPj0gMHg1MTEwICYmICFfX1NURENfXyApICkKLSNkZWZpbmUgRlRfVFlQRU9GKCB0eXBlICkgICggX190eXBlb2ZfXyAoIHR5cGUgKSApCi0jZWxzZQotI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgLyogZW1wdHkgKi8KLSNlbmRpZgotCi0KLSNpZmRlZiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIHN0YXRpYyAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgc3RhdGljICB4Ci0KLSNlbHNlCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgZXh0ZXJuICJDIiAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIGV4dGVybiAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUICovCi0KLSNkZWZpbmUgRlRfTE9DQUxfQVJSQVkoIHggKSAgICAgIGV4dGVybiBjb25zdCAgeAotI2RlZmluZSBGVF9MT0NBTF9BUlJBWV9ERUYoIHggKSAgY29uc3QgIHgKLQotCi0jaWZuZGVmIEZUX0JBU0UKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0JBU0UoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQkFTRSggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0JBU0UgKi8KLQotCi0jaWZuZGVmIEZUX0JBU0VfREVGCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4Ci0jZWxzZQotI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9CQVNFX0RFRiAqLwotCi0KLSNpZm5kZWYgRlRfRVhQT1JUCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIGV4dGVybiAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfRVhQT1JUICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfREVGCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfREVGICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfVkFSCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfVkFSKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfVkFSICovCi0KLSAgLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG5lZWRlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSAgICovCi0gIC8qIEMrKyBjb21waWxlciBhbmQgd2l0aCAxNmJpdCBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBUaGlzIGlzIHNwZWNpYWwuICBXaXRoaW4gQysrLCB5b3UgbXVzdCBzcGVjaWZ5IGBleHRlcm4gIkMiJyBmb3IgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIHZpYSBmdW5jdGlvbiBwb2ludGVycywgYW5kIHlvdSBhbHNvICAgICovCi0gIC8qIG11c3QgZG8gdGhhdCBmb3Igc3RydWN0dXJlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIHBvaW50ZXJzIHRvICAqLwotICAvKiBhc3N1cmUgQyBsaW5rYWdlIC0tIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGhhdmUgKGxvY2FsKSBhbm9ueW1vdXMgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSBhY2Nlc3NlZCBieSAoZ2xvYmFsKSBmdW5jdGlvbiBwb2ludGVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfQ0FMTEJBQ0tfREVGIGlzIHVzZWQgdG8gX2RlZmluZV8gYSBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRSBpcyB1c2VkIHRvIF9kZWNsYXJlXyBhIGNvbnN0YW50IHZhcmlhYmxlIHRoYXQgKi8KLSAgLyogY29udGFpbnMgcG9pbnRlcnMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRV9ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNvbnN0YW50IHZhcmlhYmxlICAgKi8KLSAgLyogdGhhdCBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU29tZSAxNmJpdCBjb21waWxlcnMgaGF2ZSB0byByZWRlZmluZSB0aGVzZSBtYWNyb3MgdG8gaW5zZXJ0ICAgICovCi0gIC8qIHRoZSBpbmZhbW91cyBgX2NkZWNsJyBvciBgX19mYXN0Y2FsbCcgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ0FMTEJBQ0tfREVGCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0NBTExCQUNLX0RFRiggeCApICBzdGF0aWMgIHgKLSNlbmRpZgotI2VuZGlmIC8qIEZUX0NBTExCQUNLX0RFRiAqLwotCi0jaWZuZGVmIEZUX0NBTExCQUNLX1RBQkxFCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4gIkMiCi0jZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgZXh0ZXJuICJDIgotI2Vsc2UKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4KLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAvKiBub3RoaW5nICovCi0jZW5kaWYKLSNlbmRpZiAvKiBGVF9DQUxMQkFDS19UQUJMRSAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogRlRDT05GSUdfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L2Z0c3lzdGVtLmMgYi9idWlsZHMvdW5peC9mdHN5c3RlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGEyMzViLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy91bml4L2Z0c3lzdGVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeXN0ZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVuaXgtc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSAgLyogd2UgdXNlIG91ciBzcGVjaWFsIGZ0Y29uZmlnLmggZmlsZSwgbm90IHRoZSBzdGFuZGFyZCBvbmUgKi8KLSNpbmNsdWRlIDxmdGNvbmZpZy5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotCi0gIC8qIG1lbW9yeS1tYXBwaW5nIGluY2x1ZGVzIGFuZCBkZWZpbml0aW9ucyAqLwotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpZm5kZWYgTUFQX0ZJTEUKLSNkZWZpbmUgTUFQX0ZJTEUgIDB4MDAKLSNlbmRpZgotCi0jaWZkZWYgTVVOTUFQX1VTRVNfVk9JRFAKLSNkZWZpbmUgTVVOTUFQX0FSR19DQVNUICB2b2lkICoKLSNlbHNlCi0jZGVmaW5lIE1VTk1BUF9BUkdfQ0FTVCAgY2hhciAqCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfTVVOTUFQX0RFQ0wKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gIGV4dGVybiAiQyIKLSNlbHNlCi0gIGV4dGVybgotI2VuZGlmCi0gIGludAotICBtdW5tYXAoIGNoYXIqICBhZGRyLAotICAgICAgICAgIGludCAgICBsZW4gKTsKLQotI2RlZmluZSBNVU5NQVBfQVJHX0NBU1QgIGNoYXIgKgotCi0jZW5kaWYgLyogTkVFRF9ERUNMQVJBVElPTl9NVU5NQVAgKi8KLQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEhBVkVfRkNOVExfSAotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgIDo6IFRoZSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkKLSAgZnRfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICkKLSAgewotICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0KLSAgICByZXR1cm4gbWFsbG9jKCBzaXplICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtZW1vcnkgcmVhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgIDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3VyX3NpemUgOjogVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jay4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXdfc2l6ZSA6OiBUaGUgbmV3bHkgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsb2NrICAgIDo6IFRoZSBjdXJyZW50IGFkZHJlc3Mgb2YgdGhlIGJsb2NrIGluIG1lbW9yeS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBhZGRyZXNzIG9mIHRoZSByZWFsbG9jYXRlZCBtZW1vcnkgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkKiApCi0gIGZ0X3JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICBsb25nICAgICAgIGN1cl9zaXplLAotICAgICAgICAgICAgICBsb25nICAgICAgIG5ld19zaXplLAotICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICkKLSAgewotICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0gICAgRlRfVU5VU0VEKCBjdXJfc2l6ZSApOwotCi0gICAgcmV0dXJuIHJlYWxsb2MoIGJsb2NrLCBuZXdfc2l6ZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVtb3J5IHJlbGVhc2UgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsb2NrICA6OiBUaGUgYWRkcmVzcyBvZiBibG9jayBpbiBtZW1vcnkgdG8gYmUgZnJlZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfZnJlZSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBtZW1vcnkgKTsKLQotICAgIGZyZWUoIGJsb2NrICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCi0KLSAgLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRklMRSBmb3IgY29udmVuaWVuY2UgdG8gZXh0cmFjdCB0aGUgICAgICAgKi8KLSAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8KLSNkZWZpbmUgU1RSRUFNX0ZJTEUoIHN0cmVhbSApICAoIChGSUxFKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9jbG9zZV9zdHJlYW1fYnlfbXVubWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSBzdHJlYW0gd2hpY2ggaXMgb3BlbmVkIGJ5IG1tYXAuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X2Nsb3NlX3N0cmVhbV9ieV9tdW5tYXAoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIG11bm1hcCggKE1VTk1BUF9BUkdfQ0FTVClzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciwgc3RyZWFtLT5zaXplICk7Ci0KLSAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IE5VTEw7Ci0gICAgc3RyZWFtLT5zaXplICAgICAgICAgICAgICAgPSAwOwotICAgIHN0cmVhbS0+YmFzZSAgICAgICAgICAgICAgID0gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfY2xvc2Vfc3RyZWFtX2J5X2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZ1bmN0aW9uIHRvIGNsb3NlIGEgc3RyZWFtIHdoaWNoIGlzIGNyZWF0ZWQgYnkgZnRfYWxsb2MuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgcG9pbnRlciB0byB0aGUgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9jbG9zZV9zdHJlYW1fYnlfZnJlZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgZnRfZnJlZSggTlVMTCwgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgKTsKLQotICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gTlVMTDsKLSAgICBzdHJlYW0tPnNpemUgICAgICAgICAgICAgICA9IDA7Ci0gICAgc3RyZWFtLT5iYXNlICAgICAgICAgICAgICAgPSAwOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW4oIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lICkKLSAgewotICAgIGludCAgICAgICAgICBmaWxlOwotICAgIHN0cnVjdCBzdGF0ICBzdGF0X2J1ZjsKLQotCi0gICAgaWYgKCAhc3RyZWFtICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fSGFuZGxlICk7Ci0KLSAgICAvKiBvcGVuIHRoZSBmaWxlICovCi0gICAgZmlsZSA9IG9wZW4oIGZpbGVwYXRobmFtZSwgT19SRE9OTFkgKTsKLSAgICBpZiAoIGZpbGUgPCAwICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwotICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBvcGVuIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLSAgICB9Ci0KLSAgICAvKiBIZXJlIHdlIGVuc3VyZSB0aGF0IGEgImZvcmsiIHdpbGwgX25vdF8gZHVwbGljYXRlICAgKi8KLSAgICAvKiBvdXIgb3BlbmVkIGlucHV0IHN0cmVhbXMgb24gVW5peC4gIFRoaXMgaXMgY3JpdGljYWwgKi8KLSAgICAvKiBzaW5jZSBpdCBhdm9pZHMgc29tZSAocG9zc2libGUpIGFjY2VzcyBjb250cm9sICAgICAgKi8KLSAgICAvKiBpc3N1ZXMgYW5kIGNsZWFucyB1cCB0aGUga2VybmVsIGZpbGUgdGFibGUgYSBiaXQuICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBGX1NFVEZECi0jaWZkZWYgRkRfQ0xPRVhFQwotICAgICh2b2lkKWZjbnRsKCBmaWxlLCBGX1NFVEZELCBGRF9DTE9FWEVDICk7Ci0jZWxzZQotICAgICh2b2lkKWZjbnRsKCBmaWxlLCBGX1NFVEZELCAxICk7Ci0jZW5kaWYgLyogRkRfQ0xPRVhFQyAqLwotI2VuZGlmIC8qIEZfU0VURkQgKi8KLQotICAgIGlmICggZnN0YXQoIGZpbGUsICZzdGF0X2J1ZiApIDwgMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKLSAgICAgIEZUX0VSUk9SKCggIiBjb3VsZCBub3QgYGZzdGF0JyBmaWxlIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKLSAgICAgIGdvdG8gRmFpbF9NYXA7Ci0gICAgfQotCi0gICAgLyogWFhYOiBUT0RPIC0tIHJlYWwgNjRiaXQgcGxhdGZvcm0gc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogYHN0cmVhbS0+c2l6ZScgaXMgdHlwZWRlZidkIHRvIHVuc2lnbmVkIGxvbmcgKGluIGBmdHN5c3RlbS5oJyk7ICovCi0gICAgLyogYHN0YXRfYnVmLnN0X3NpemUnLCBob3dldmVyLCBpcyB1c3VhbGx5IHR5cGVkZWYnZCB0byBvZmZfdCAgICAgICovCi0gICAgLyogKGluIHN5cy9zdGF0LmgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogT24gc29tZSBwbGF0Zm9ybXMsIHRoZSBmb3JtZXIgaXMgMzJiaXQgYW5kIHRoZSBsYXR0ZXIgaXMgNjRiaXQuICovCi0gICAgLyogVG8gYXZvaWQgb3ZlcmZsb3cgY2F1c2VkIGJ5IGZvbnRzIGluIGh1Z2UgZmlsZXMgbGFyZ2VyIHRoYW4gICAgICovCi0gICAgLyogMkdCLCBkbyBhIHRlc3QuICBUZW1wb3JhcnkgZml4IHByb3Bvc2VkIGJ5IFNlYW4gTWNCcmlkZS4gICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBzdGF0X2J1Zi5zdF9zaXplID4gTE9OR19NQVggKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiBmaWxlIGlzIHRvbyBiaWdcbiIgKSk7Ci0gICAgICBnb3RvIEZhaWxfTWFwOwotICAgIH0KLSAgICBlbHNlIGlmICggc3RhdF9idWYuc3Rfc2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjogemVyby1sZW5ndGggZmlsZVxuIiApKTsKLSAgICAgIGdvdG8gRmFpbF9NYXA7Ci0gICAgfQotCi0gICAgLyogVGhpcyBjYXN0IHBvdGVudGlhbGx5IHRydW5jYXRlcyBhIDY0Yml0IHRvIDMyYml0ISAqLwotICAgIHN0cmVhbS0+c2l6ZSA9ICh1bnNpZ25lZCBsb25nKXN0YXRfYnVmLnN0X3NpemU7Ci0gICAgc3RyZWFtLT5wb3MgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfRklMRSB8IE1BUF9QUklWQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKLQotICAgIC8qIG9uIHNvbWUgUlRPUywgbW1hcCBtaWdodCByZXR1cm4gMCAqLwotICAgIGlmICggKGxvbmcpc3RyZWFtLT5iYXNlICE9IC0xICYmIHN0cmVhbS0+YmFzZSAhPSBOVUxMICkKLSAgICAgIHN0cmVhbS0+Y2xvc2UgPSBmdF9jbG9zZV9zdHJlYW1fYnlfbXVubWFwOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzc2l6ZV90ICB0b3RhbF9yZWFkX2NvdW50OwotCi0KLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IGBtbWFwJyBmaWxlIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKLQotICAgICAgc3RyZWFtLT5iYXNlID0gKHVuc2lnbmVkIGNoYXIqKWZ0X2FsbG9jKCBOVUxMLCBzdHJlYW0tPnNpemUgKTsKLQotICAgICAgaWYgKCAhc3RyZWFtLT5iYXNlICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKLSAgICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBgYWxsb2MnIG1lbW9yeVxuIiApKTsKLSAgICAgICAgZ290byBGYWlsX01hcDsKLSAgICAgIH0KLQotICAgICAgdG90YWxfcmVhZF9jb3VudCA9IDA7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICBzc2l6ZV90ICByZWFkX2NvdW50OwotCi0KLSAgICAgICAgcmVhZF9jb3VudCA9IHJlYWQoIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmJhc2UgKyB0b3RhbF9yZWFkX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5zaXplIC0gdG90YWxfcmVhZF9jb3VudCApOwotCi0gICAgICAgIGlmICggcmVhZF9jb3VudCA8PSAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggcmVhZF9jb3VudCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUiApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiIGVycm9yIHdoaWxlIGByZWFkJ2luZyBmaWxlIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKLSAgICAgICAgICBnb3RvIEZhaWxfUmVhZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRvdGFsX3JlYWRfY291bnQgKz0gcmVhZF9jb3VudDsKLQotICAgICAgfSB3aGlsZSAoICh1bnNpZ25lZCBsb25nKXRvdGFsX3JlYWRfY291bnQgIT0gc3RyZWFtLT5zaXplICk7Ci0KLSAgICAgIHN0cmVhbS0+Y2xvc2UgPSBmdF9jbG9zZV9zdHJlYW1fYnlfZnJlZTsKLSAgICB9Ci0KLSAgICBjbG9zZSggZmlsZSApOwotCi0gICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBzdHJlYW0tPmJhc2U7Ci0gICAgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyICAgPSAoY2hhciopZmlsZXBhdGhuYW1lOwotCi0gICAgc3RyZWFtLT5yZWFkID0gMDsKLQotICAgIEZUX1RSQUNFMSgoICJGVF9TdHJlYW1fT3BlbjoiICkpOwotICAgIEZUX1RSQUNFMSgoICIgb3BlbmVkIGAlcycgKCVkIGJ5dGVzKSBzdWNjZXNzZnVsbHlcbiIsCi0gICAgICAgICAgICAgICAgZmlsZXBhdGhuYW1lLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEZhaWxfUmVhZDoKLSAgICBmdF9mcmVlKCBOVUxMLCBzdHJlYW0tPmJhc2UgKTsKLQotICBGYWlsX01hcDoKLSAgICBjbG9zZSggZmlsZSApOwotCi0gICAgc3RyZWFtLT5iYXNlID0gTlVMTDsKLSAgICBzdHJlYW0tPnNpemUgPSAwOwotICAgIHN0cmVhbS0+cG9zICA9IDA7Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1N0cmVhbSApOwotICB9Ci0KLQotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotCi0gIGV4dGVybiBGVF9JbnQKLSAgZnRfbWVtX2RlYnVnX2luaXQoIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgZXh0ZXJuIHZvaWQKLSAgZnRfbWVtX2RlYnVnX2RvbmUoIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSNlbmRpZgotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9NZW1vcnkgKQotICBGVF9OZXdfTWVtb3J5KCB2b2lkICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBtZW1vcnkgPSAoRlRfTWVtb3J5KW1hbGxvYyggc2l6ZW9mICggKm1lbW9yeSApICk7Ci0gICAgaWYgKCBtZW1vcnkgKQotICAgIHsKLSAgICAgIG1lbW9yeS0+dXNlciAgICA9IDA7Ci0gICAgICBtZW1vcnktPmFsbG9jICAgPSBmdF9hbGxvYzsKLSAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X3JlYWxsb2M7Ci0gICAgICBtZW1vcnktPmZyZWUgICAgPSBmdF9mcmVlOwotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotICAgICAgZnRfbWVtX2RlYnVnX2luaXQoIG1lbW9yeSApOwotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuIG1lbW9yeTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfRG9uZV9NZW1vcnkoIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotICAgIGZ0X21lbV9kZWJ1Z19kb25lKCBtZW1vcnkgKTsKLSNlbmRpZgotICAgIG1lbW9yeS0+ZnJlZSggbWVtb3J5LCBtZW1vcnkgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvaW5zdGFsbC5tayBiL2J1aWxkcy91bml4L2luc3RhbGwubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTQ4NmMuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvaW5zdGFsbC5taworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciBVbml4IHN5c3RlbXMKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0jIElmIHlvdSBzYXkKLSMKLSMgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL3NvbWV3aGVyZS8KLSMKLSMgZG9uJ3QgZm9yZ2V0IHRoZSBmaW5hbCBiYWNrc2xhc2ggKHRoaXMgY29tbWFuZCBpcyBtYWlubHkgZm9yIHBhY2thZ2UKLSMgbWFpbnRhaW5lcnMpLgotCi0KLS5QSE9OWTogaW5zdGFsbCB1bmluc3RhbGwgY2hlY2sKLQotIyBVbml4IGluc3RhbGxhdGlvbiBhbmQgZGVpbnN0YWxsYXRpb24gdGFyZ2V0cy4KLSMKLSMgTm90ZSB0aGF0IHdlIHJlbW92ZSBhbnkgZGF0YSBmb3VuZCBpbiBgJChpbmNsdWRlZGlyKS9mcmVldHlwZTInIGJlZm9yZQotIyBpbnN0YWxsaW5nIG5ldyBmaWxlcyB0byBhdm9pZCBpbnRlcmZlcmVuY2VzIHdpdGggZmlsZXMgaW5zdGFsbGVkIGJ5Ci0jIHByZXZpb3VzIEZyZWVUeXBlIHZlcnNpb25zICh3aGljaCB1c2Ugc2xpZ2h0bHkgZGlmZmVyZW50IGxvY2F0aW9ucykuCi0jCi0jIFdlIGFsc28gcmVtb3ZlIGAkKGluY2x1ZGVkaXIpL2Z0MmJ1aWxkLmgnIGZvciB0aGUgc2FtZSByZWFzb24uCi0jCi1pbnN0YWxsOiAkKFBST0pFQ1RfTElCUkFSWSkKLQktJChERUxESVIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2ZyZWV0eXBlMgotCS0kKERFTEVURSkgJChERVNURElSKSQoaW5jbHVkZWRpcikvZnQyYnVpbGQuaAotCSQoTUtJTlNUQUxMRElSUykgJChERVNURElSKSQobGliZGlyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChERVNURElSKSQobGliZGlyKS9wa2djb25maWcgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChERVNURElSKSQoaW5jbHVkZWRpcikvZnJlZXR5cGUyL2ZyZWV0eXBlL2NvbmZpZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChERVNURElSKSQoYmluZGlyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChERVNURElSKSQoZGF0YWRpcikvYWNsb2NhbCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0JJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9KRUNUX0xJQlJBUlkpICQoREVTVERJUikkKGxpYmRpcikKLQktZm9yIFAgaW4gJChQVUJMSUNfSCkgOyBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAkKElOU1RBTExfREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAkJFAgJChERVNURElSKSQoaW5jbHVkZWRpcikvZnJlZXR5cGUyL2ZyZWV0eXBlIDsgXAotICAgICAgICBkb25lCi0JLWZvciBQIGluICQoQ09ORklHX0gpIDsgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICQoSU5TVEFMTF9EQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAkJFAgJChERVNURElSKSQoaW5jbHVkZWRpcikvZnJlZXR5cGUyL2ZyZWV0eXBlL2NvbmZpZyA7IFwKLSAgICAgICAgZG9uZQotCSQoSU5TVEFMTF9EQVRBKSAkKFRPUF9ESVIpL2luY2x1ZGUvZnQyYnVpbGQuaCAgXAotICAgICAgICAgICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2ZyZWV0eXBlMi9mdDJidWlsZC5oCi0JJChJTlNUQUxMX0RBVEEpICQoT0JKX0JVSUxEKS9mdGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2ZyZWV0eXBlMi9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaAotCSQoSU5TVEFMTF9EQVRBKSAkKE9CSl9ESVIpL2Z0bW9kdWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9mcmVldHlwZTIvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmgKLQkkKElOU1RBTExfU0NSSVBUKSAtbSA3NTUgJChPQkpfQlVJTEQpL2ZyZWV0eXBlLWNvbmZpZyBcCi0gICAgICAgICAgJChERVNURElSKSQoYmluZGlyKS9mcmVldHlwZS1jb25maWcKLQkkKElOU1RBTExfU0NSSVBUKSAtbSA2NDQgJChCVUlMRF9ESVIpL2ZyZWV0eXBlMi5tNCBcCi0gICAgICAgICAgJChERVNURElSKSQoZGF0YWRpcikvYWNsb2NhbC9mcmVldHlwZTIubTQKLQkkKElOU1RBTExfU0NSSVBUKSAtbSA2NDQgJChPQkpfQlVJTEQpL2ZyZWV0eXBlMi5wYyBcCi0gICAgICAgICAgJChERVNURElSKSQobGliZGlyKS9wa2djb25maWcvZnJlZXR5cGUyLnBjCi0JJChJTlNUQUxMX0RBVEEpICQoVE9QX0RJUikvZG9jcy9mcmVldHlwZS1jb25maWcuMSBcCi0gICAgICAgICAgJChERVNURElSKSQobWFuZGlyKS9tYW4xL2ZyZWV0eXBlLWNvbmZpZy4xCi0KLQotdW5pbnN0YWxsOgotCS0kKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgJChSTSkgJChERVNURElSKSQobGliZGlyKS8kKExJQlJBUlkpLiRBCi0JLSQoREVMRElSKSAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9mcmVldHlwZTIKLQktJChERUxFVEUpICQoREVTVERJUikkKGJpbmRpcikvZnJlZXR5cGUtY29uZmlnCi0JLSQoREVMRVRFKSAkKERFU1RESVIpJChkYXRhZGlyKS9hY2xvY2FsL2ZyZWV0eXBlMi5tNAotCS0kKERFTEVURSkgJChERVNURElSKSQobGliZGlyKS9wa2djb25maWcvZnJlZXR5cGUyLnBjCi0JLSQoREVMRVRFKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEvZnJlZXR5cGUtY29uZmlnLjEKLQotCi1jaGVjazoKLQlAZWNobyBUaGVyZSBpcyBubyB2YWxpZGF0aW9uIHN1aXRlIGZvciB0aGlzIHBhY2thZ2UuCi0KLQotLlBIT05ZOiBjbGVhbl9wcm9qZWN0X3VuaXggZGlzdGNsZWFuX3Byb2plY3RfdW5peAotCi0jIFVuaXggY2xlYW5pbmcgYW5kIGRpc3RjbGVhbiBydWxlcy4KLSMKLWNsZWFuX3Byb2plY3RfdW5peDoKLQktJChERUxFVEUpICQoQkFTRV9PQkpFQ1RTKSAkKE9CSl9NKSAkKE9CSl9TKQotCS0kKERFTEVURSkgJChwYXRzdWJzdCAlLiRPLCUuJChTTyksJChCQVNFX09CSkVDVFMpICQoT0JKX00pICQoT0JKX1MpKSBcCi0gICAgICAgICAgICAgICAgICAgJChDTEVBTikKLQotZGlzdGNsZWFuX3Byb2plY3RfdW5peDogY2xlYW5fcHJvamVjdF91bml4Ci0JLSQoREVMRVRFKSAkKFBST0pFQ1RfTElCUkFSWSkKLQktJChERUxESVIpICQoT0JKX0RJUikvLmxpYnMKLQktJChERUxFVEUpICoub3JpZyAqfiBjb3JlICouY29yZSAkKERJU1RDTEVBTikKLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L3BrZy5tNCBiL2J1aWxkcy91bml4L3BrZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwZTFmYi4uMDAwMDAwMAotLS0gYS9idWlsZHMvdW5peC9wa2cubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotIyBwa2cubTQgLSBNYWNyb3MgdG8gbG9jYXRlIGFuZCB1dGlsaXNlIHBrZy1jb25maWcuICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotIyBzZXJpYWwgMSAocGtnLWNvbmZpZy0wLjI0KQotIyAKLSMgQ29weXJpZ2h0IMKpIDIwMDQgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFBLR19QUk9HX1BLR19DT05GSUcoW01JTi1WRVJTSU9OXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW1BLR19QUk9HX1BLR19DT05GSUddLAotW200X3BhdHRlcm5fZm9yYmlkKFteXz9QS0dfW0EtWl9dKyRdKQotbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUcoXyhQQVRIfExJQkRJUnxTWVNST09UX0RJUnxBTExPV19TWVNURU1fKENGTEFHU3xMSUJTKSkpPyRdKQotbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUdfKERJU0FCTEVfVU5JTlNUQUxMRUR8VE9QX0JVSUxEX0RJUnxERUJVR19TUEVXKSRdKQotQUNfQVJHX1ZBUihbUEtHX0NPTkZJR10sIFtwYXRoIHRvIHBrZy1jb25maWcgdXRpbGl0eV0pCi1BQ19BUkdfVkFSKFtQS0dfQ09ORklHX1BBVEhdLCBbZGlyZWN0b3JpZXMgdG8gYWRkIHRvIHBrZy1jb25maWcncyBzZWFyY2ggcGF0aF0pCi1BQ19BUkdfVkFSKFtQS0dfQ09ORklHX0xJQkRJUl0sIFtwYXRoIG92ZXJyaWRpbmcgcGtnLWNvbmZpZydzIGJ1aWx0LWluIHNlYXJjaCBwYXRoXSkKLQotaWYgdGVzdCAieCRhY19jdl9lbnZfUEtHX0NPTkZJR19zZXQiICE9ICJ4c2V0IjsgdGhlbgotCUFDX1BBVEhfVE9PTChbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKLWZpCi1pZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KLQlfcGtnX21pbl92ZXJzaW9uPW00X2RlZmF1bHQoWyQxXSwgWzAuOS4wXSkKLQlBQ19NU0dfQ0hFQ0tJTkcoW3BrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbl0pCi0JaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uOyB0aGVuCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JZWxzZQotCQlBQ19NU0dfUkVTVUxUKFtub10pCi0JCVBLR19DT05GSUc9IiIKLQlmaQotZmlbXWRubAotXSkjIFBLR19QUk9HX1BLR19DT05GSUcKLQotIyBQS0dfQ0hFQ0tfRVhJU1RTKE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCi0jCi0jIENoZWNrIHRvIHNlZSB3aGV0aGVyIGEgcGFydGljdWxhciBzZXQgb2YgbW9kdWxlcyBleGlzdHMuICBTaW1pbGFyCi0jIHRvIFBLR19DSEVDS19NT0RVTEVTKCksIGJ1dCBkb2VzIG5vdCBzZXQgdmFyaWFibGVzIG9yIHByaW50IGVycm9ycy4KLSMKLSMgUGxlYXNlIHJlbWVtYmVyIHRoYXQgbTQgZXhwYW5kcyBBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKLSMgb25seSBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBjb25maWd1cmUuYWMsIHNvIGlmIHRoZSBmaXJzdCBwbGFjZQotIyBpdCdzIGNhbGxlZCBtaWdodCBiZSBza2lwcGVkIChzdWNoIGFzIGlmIGl0IGlzIHdpdGhpbiBhbiAiaWYiLCB5b3UKLSMgaGF2ZSB0byBjYWxsIFBLR19DSEVDS19FWElTVFMgbWFudWFsbHkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtQS0dfQ0hFQ0tfRVhJU1RTXSwKLVtBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKLWlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCi0gICAgQUNfUlVOX0xPRyhbJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgIiQxIl0pOyB0aGVuCi0gIG00X2RlZmF1bHQoWyQyXSwgWzpdKQotbTRfaWZ2YWxuKFskM10sIFtlbHNlCi0gICQzXSlkbmwKLWZpXSkKLQotIyBfUEtHX0NPTkZJRyhbVkFSSUFCTEVdLCBbQ09NTUFORF0sIFtNT0RVTEVTXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW19QS0dfQ09ORklHXSwKLVtpZiB0ZXN0IC1uICIkJDEiOyB0aGVuCi0gICAgcGtnX2N2X1tdJDE9IiQkMSIKLSBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgotICAgIFBLR19DSEVDS19FWElTVFMoWyQzXSwKLSAgICAgICAgICAgICAgICAgICAgIFtwa2dfY3ZfW10kMT1gJFBLR19DT05GSUcgLS1bXSQyICIkMyIgMj4vZGV2L251bGxgCi0JCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcyBdLAotCQkgICAgIFtwa2dfZmFpbGVkPXllc10pCi0gZWxzZQotICAgIHBrZ19mYWlsZWQ9dW50cmllZAotZmlbXWRubAotXSkjIF9QS0dfQ09ORklHCi0KLSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVEXSwKLVtBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKLWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCi0gICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKLWVsc2UKLSAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCi1maVtdZG5sCi1dKSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECi0KLQotIyBQS0dfQ0hFQ0tfTU9EVUxFUyhWQVJJQUJMRS1QUkVGSVgsIE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLAotIyBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCi0jCi0jCi0jIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoZSBmaXJzdCBjYWxsIHRvCi0jIFBLR19DSEVDS19NT0RVTEVTIG1pZ2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3VyZSB0byBpbmNsdWRlIGFuCi0jIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpbiB5b3VyIGNvbmZpZ3VyZS5hYwotIwotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW1BLR19DSEVDS19NT0RVTEVTXSwKLVtBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKLUFDX0FSR19WQVIoWyQxXVtfQ0ZMQUdTXSwgW0MgY29tcGlsZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAotQUNfQVJHX1ZBUihbJDFdW19MSUJTXSwgW2xpbmtlciBmbGFncyBmb3IgJDEsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZ10pZG5sCi0KLXBrZ19mYWlsZWQ9bm8KLUFDX01TR19DSEVDS0lORyhbZm9yICQxXSkKLQotX1BLR19DT05GSUcoWyQxXVtfQ0ZMQUdTXSwgW2NmbGFnc10sIFskMl0pCi1fUEtHX0NPTkZJRyhbJDFdW19MSUJTXSwgW2xpYnNdLCBbJDJdKQotCi1tNF9kZWZpbmUoW19QS0dfVEVYVF0sIFtBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzICQxW11fQ0ZMQUdTCi1hbmQgJDFbXV9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KLVNlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLl0pCi0KLWlmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KLSAgIAlBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgICAgIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAotICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KLQkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICIkMiIgMj4mMWAKLSAgICAgICAgZWxzZSAKLQkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICIkMiIgMj4mMWAKLSAgICAgICAgZmkKLQkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKLQllY2hvICIkJDFbXV9QS0dfRVJST1JTIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0KLQltNF9kZWZhdWx0KFskNF0sIFtBQ19NU0dfRVJST1IoCi1bUGFja2FnZSByZXF1aXJlbWVudHMgKCQyKSB3ZXJlIG5vdCBtZXQ6Ci0KLSQkMV9QS0dfRVJST1JTCi0KLUNvbnNpZGVyIGFkanVzdGluZyB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdQotaW5zdGFsbGVkIHNvZnR3YXJlIGluIGEgbm9uLXN0YW5kYXJkIHByZWZpeC4KLQotX1BLR19URVhUXSlbXWRubAotICAgICAgICBdKQotZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgotICAgICAJQUNfTVNHX1JFU1VMVChbbm9dKQotCW00X2RlZmF1bHQoWyQ0XSwgW0FDX01TR19GQUlMVVJFKAotW1RoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAotaXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAotcGF0aCB0byBwa2ctY29uZmlnLgotCi1fUEtHX1RFWFQKLQotVG8gZ2V0IHBrZy1jb25maWcsIHNlZSA8aHR0cDovL3BrZy1jb25maWcuZnJlZWRlc2t0b3Aub3JnLz4uXSlbXWRubAotICAgICAgICBdKQotZWxzZQotCSQxW11fQ0ZMQUdTPSRwa2dfY3ZfW10kMVtdX0NGTEFHUwotCSQxW11fTElCUz0kcGtnX2N2X1tdJDFbXV9MSUJTCi0gICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCi0JJDMKLWZpW11kbmwKLV0pIyBQS0dfQ0hFQ0tfTU9EVUxFUwotCi0KLSMgUEtHX0lOU1RBTExESVIoRElSRUNUT1JZKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFN1YnN0aXR1dGVzIHRoZSB2YXJpYWJsZSBwa2djb25maWdkaXIgYXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEgbW9kdWxlCi0jIHNob3VsZCBpbnN0YWxsIHBrZy1jb25maWcgLnBjIGZpbGVzLiBCeSBkZWZhdWx0IHRoZSBkaXJlY3RvcnkgaXMKLSMgJGxpYmRpci9wa2djb25maWcsIGJ1dCB0aGUgZGVmYXVsdCBjYW4gYmUgY2hhbmdlZCBieSBwYXNzaW5nCi0jIERJUkVDVE9SWS4gVGhlIHVzZXIgY2FuIG92ZXJyaWRlIHRocm91Z2ggdGhlIC0td2l0aC1wa2djb25maWdkaXIKLSMgcGFyYW1ldGVyLgotQUNfREVGVU4oW1BLR19JTlNUQUxMRElSXSwKLVttNF9wdXNoZGVmKFtwa2dfZGVmYXVsdF0sIFttNF9kZWZhdWx0KFskMV0sIFsnJHtsaWJkaXJ9L3BrZ2NvbmZpZyddKV0pCi1tNF9wdXNoZGVmKFtwa2dfZGVzY3JpcHRpb25dLAotICAgIFtwa2ctY29uZmlnIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgQDw6QF1wa2dfZGVmYXVsdFtAOj5AXSkKLUFDX0FSR19XSVRIKFtwa2djb25maWdkaXJdLAotICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXBrZ2NvbmZpZ2Rpcl0sIHBrZ19kZXNjcmlwdGlvbildLCwKLSAgICBbd2l0aF9wa2djb25maWdkaXI9XXBrZ19kZWZhdWx0KQotQUNfU1VCU1QoW3BrZ2NvbmZpZ2Rpcl0sIFskd2l0aF9wa2djb25maWdkaXJdKQotbTRfcG9wZGVmKFtwa2dfZGVmYXVsdF0pCi1tNF9wb3BkZWYoW3BrZ19kZXNjcmlwdGlvbl0pCi1dKSBkbmwgUEtHX0lOU1RBTExESVIKLQotCi0jIFBLR19OT0FSQ0hfSU5TVEFMTERJUihESVJFQ1RPUlkpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU3Vic3RpdHV0ZXMgdGhlIHZhcmlhYmxlIG5vYXJjaF9wa2djb25maWdkaXIgYXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEKLSMgbW9kdWxlIHNob3VsZCBpbnN0YWxsIGFyY2gtaW5kZXBlbmRlbnQgcGtnLWNvbmZpZyAucGMgZmlsZXMuIEJ5Ci0jIGRlZmF1bHQgdGhlIGRpcmVjdG9yeSBpcyAkZGF0YWRpci9wa2djb25maWcsIGJ1dCB0aGUgZGVmYXVsdCBjYW4gYmUKLSMgY2hhbmdlZCBieSBwYXNzaW5nIERJUkVDVE9SWS4gVGhlIHVzZXIgY2FuIG92ZXJyaWRlIHRocm91Z2ggdGhlCi0jIC0td2l0aC1ub2FyY2gtcGtnY29uZmlnZGlyIHBhcmFtZXRlci4KLUFDX0RFRlVOKFtQS0dfTk9BUkNIX0lOU1RBTExESVJdLAotW200X3B1c2hkZWYoW3BrZ19kZWZhdWx0XSwgW200X2RlZmF1bHQoWyQxXSwgWycke2RhdGFkaXJ9L3BrZ2NvbmZpZyddKV0pCi1tNF9wdXNoZGVmKFtwa2dfZGVzY3JpcHRpb25dLAotICAgIFtwa2ctY29uZmlnIGFyY2gtaW5kZXBlbmRlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBAPDpAXXBrZ19kZWZhdWx0W0A6PkBdKQotQUNfQVJHX1dJVEgoW25vYXJjaC1wa2djb25maWdkaXJdLAotICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLW5vYXJjaC1wa2djb25maWdkaXJdLCBwa2dfZGVzY3JpcHRpb24pXSwsCi0gICAgW3dpdGhfbm9hcmNoX3BrZ2NvbmZpZ2Rpcj1dcGtnX2RlZmF1bHQpCi1BQ19TVUJTVChbbm9hcmNoX3BrZ2NvbmZpZ2Rpcl0sIFskd2l0aF9ub2FyY2hfcGtnY29uZmlnZGlyXSkKLW00X3BvcGRlZihbcGtnX2RlZmF1bHRdKQotbTRfcG9wZGVmKFtwa2dfZGVzY3JpcHRpb25dKQotXSkgZG5sIFBLR19OT0FSQ0hfSU5TVEFMTERJUgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvdW5peC1jYy5pbiBiL2J1aWxkcy91bml4L3VuaXgtY2MuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjdjZWUuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvdW5peC1jYy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgdGVtcGxhdGUgZm9yIFVuaXgtc3BlY2lmaWMgY29tcGlsZXIgZGVmaW5pdGlvbnMKLSMKLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DQyAgICAgICAgICAgOj0gQENDQAotQ09NUElMRVJfU0VQIDo9ICQoU0VQKQotRlRfTElCVE9PTF9ESVIgPz0gJChCVUlMRF9ESVIpCi0KLUxJQlRPT0wgOj0gJChGVF9MSUJUT09MX0RJUikvbGlidG9vbAotCi0KLSMgVGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiAoZm9yIHN0YW5kYXJkIGFuZCBzdGF0aWMgbGlicmFyaWVzKS4gIFRoaXMgY2FuIGJlCi0jIC5vLCAudGNvLCAub2JqLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotIwotTyAgOj0gbG8KLVNPIDo9IG8KLQotCi0jIFRoZSBleGVjdXRhYmxlIGZpbGUgZXh0ZW5zaW9uLiAgQWx0aG91Z2ggbW9zdCBVbml4IHBsYXRmb3JtcyB1c2Ugbm8KLSMgZXh0ZW5zaW9uLCB3ZSBjb3B5IHRoZSBleHRlbnNpb24gZGV0ZWN0ZWQgYnkgYXV0b2NvbmYuICBVc2VmdWwgZm9yIGNyb3NzCi0jIGJ1aWxkaW5nIG9uIFVuaXggc3lzdGVtcyBmb3Igbm9uLVVuaXggc3lzdGVtcy4KLSMKLUUgOj0gQEVYRUVYVEAKLQotCi0jIFRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uIChmb3Igc3RhbmRhcmQgYW5kIHN0YXRpYyBsaWJyYXJpZXMpLiAgVGhpcyBjYW4KLSMgYmUgLmEsIC5saWIsIGV0Yy4sIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCi0jCi1BICA6PSBsYQotU0EgOj0gYQotCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGZpbmFsIGxpYnJhcnkgZmlsZS4gIE5vdGUgdGhhdCB0aGUgRE9TLXNwZWNpZmljIE1ha2VmaWxlCi0jIHVzZXMgYSBzaG9ydGVyICg4LjMpIG5hbWUuCi0jCi1MSUJSQVJZIDo9IGxpYiQoUFJPSkVDVCkKLQotCi0jIFBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZmxhZyB0aGFuIGAtSScgdG8KLSMgc3BlY2lmeSBhbiBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSBgL2k9JyBvciBgLUonLgotIwotSSA6PSAtSQotCi0KLSMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuIHNvdXJjZQotIyBvYmplY3QuICBVc3VhbGx5IGl0IGlzIGAtRCcgbGlrZSBpbiBgLURERUJVRycuCi0jCi1EIDo9IC1ECi0KLQotIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLiAgTm90ZSB0aGF0Ci0jIHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdCB0aGUgbGlicmFyeSBpdHNlbGYuCi0jCi1MIDo9IC1sCi0KLQotIyBUYXJnZXQgZmxhZy4KLSMKLVQgOj0gLW8kKHNwYWNlKQotCi0KLSMgQyBmbGFncwotIwotIyAgIFRoZXNlIHNob3VsZCBjb25jZXJuOiBkZWJ1ZyBvdXRwdXQsIG9wdGltaXphdGlvbiAmIHdhcm5pbmdzLgotIwotIyAgIFVzZSB0aGUgQU5TSUZMQUdTIHZhcmlhYmxlIHRvIGRlZmluZSB0aGUgY29tcGlsZXIgZmxhZ3MgdXNlZCB0byBlbmZvcmUKLSMgICBBTlNJIGNvbXBsaWFuY2UuCi0jCi0jICAgV2UgdXNlIG91ciBvd24gRnJlZVR5cGUgY29uZmlndXJhdGlvbiBmaWxlLgotIwotQ1BQRkxBR1MgOj0gQENQUEZMQUdTQAotQ0ZMQUdTICAgOj0gLWMgQFhYX0NGTEFHU0AgQENGTEFHU0AgLURGVF9DT05GSUdfQ09ORklHX0g9IjxmdGNvbmZpZy5oPiIKLQotIyBBTlNJRkxBR1M6IFB1dCB0aGVyZSB0aGUgZmxhZ3MgdXNlZCB0byBtYWtlIHlvdXIgY29tcGlsZXIgQU5TSS1jb21wbGlhbnQuCi0jCi1BTlNJRkxBR1MgOj0gQFhYX0FOU0lGTEFHU0AKLQotIyBDIGNvbXBpbGVyIHRvIHVzZSAtLSB3ZSB1c2UgbGlidG9vbCEKLSMKLSMKLUNDcmF3IDo9ICQoQ0MpCi1DQyAgICA6PSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0NyYXcpCi0KLSMgTGlua2VyIGZsYWdzLgotIwotTERGTEFHUyA6PSBATERGTEFHU0AKLQotCi0jIGV4cG9ydCBzeW1ib2xzCi0jCi1DQ3Jhd19idWlsZCAgOj0gQENDX0JVSUxEQAkjIG5hdGl2ZSBDQyBvZiBidWlsZGluZyBzeXN0ZW0KLUVfQlVJTEQgICAgICA6PSBARVhFRVhUX0JVSUxEQAkjIGV4dGVuc2lvbiBmb3IgZXhlY3V0YWJsZSBvbiBidWlsZGluZyBzeXN0ZW0KLUVYUE9SVFNfTElTVCA6PSAkKE9CSl9ESVIpL2Z0ZXhwb3J0LnN5bQotQ0NleGUgICAgICAgIDo9ICQoQ0NyYXdfYnVpbGQpCSMgdXNlZCB0byBjb21waWxlIGBhcGluYW1lcycgb25seQotCi0KLSMgTGlicmFyeSBsaW5raW5nCi0jCi1MSU5LX0xJQlJBUlkgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NyYXcpIC1vICRAICQoT0JKRUNUU19MSVNUKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC1ycGF0aCAkKGxpYmRpcikgLXZlcnNpb24taW5mbyAkKHZlcnNpb25faW5mbykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAkKExERkxBR1MpIC1uby11bmRlZmluZWQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAtZXhwb3J0LXN5bWJvbHMgJChFWFBPUlRTX0xJU1QpCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC91bml4LWRlZi5pbiBiL2J1aWxkcy91bml4L3VuaXgtZGVmLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGUwNmUzLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy91bml4L3VuaXgtZGVmLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIHJ1bGVzIHRlbXBsYXRlcyBmb3IgVW5peCArIGNvbmZpZ3VyZQotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVNIRUxMIDo9IEBTSEVMTEAKLQotVE9QX0RJUiA6PSAkKHNoZWxsIGNkICQoVE9QX0RJUik7IHB3ZCkKLQotREVMRVRFIDo9IHJtIC1mCi1ERUxESVIgOj0gcm0gLXJmCi1DQVQgICAgOj0gY2F0Ci1TRVAgICAgOj0gLwotCi0jIHRoaXMgaXMgdXNlZCBmb3IgYG1ha2UgZGlzdGNsZWFuJyBhbmQgYG1ha2UgaW5zdGFsbCcKLU9CSl9CVUlMRCA/PSAkKEJVSUxEX0RJUikKLQotIyBkb24ndCB1c2UgYDo9JyBoZXJlIHNpbmNlIHRoZSBwYXRoIHN0dWZmIHdpbGwgYmUgaW5jbHVkZWQgYWZ0ZXIgdGhpcyBmaWxlCi0jCi1GVFNZU19TUkMgPSBARlRTWVNfU1JDQAotCi1JTlNUQUxMICAgICAgICAgOj0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgICAgOj0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfUFJPR1JBTSA6PSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgIDo9IEBJTlNUQUxMX1NDUklQVEAKLU1LSU5TVEFMTERJUlMgICA6PSBATUtESVJfUEAKLQotQ0xFQU4gKz0gJChPQkpfQlVJTEQpL2ZyZWV0eXBlLWNvbmZpZyBcCi0gICAgICAgICAkKE9CSl9CVUlMRCkvZnJlZXR5cGUyLnBjCi0KLURJU1RDTEVBTiArPSAkKE9CSl9CVUlMRCkvY29uZmlnLmNhY2hlICBcCi0gICAgICAgICAgICAgJChPQkpfQlVJTEQpL2NvbmZpZy5sb2cgICAgXAotICAgICAgICAgICAgICQoT0JKX0JVSUxEKS9jb25maWcuc3RhdHVzIFwKLSAgICAgICAgICAgICAkKE9CSl9CVUlMRCkvdW5peC1kZWYubWsgICBcCi0gICAgICAgICAgICAgJChPQkpfQlVJTEQpL3VuaXgtY2MubWsgICAgXAotICAgICAgICAgICAgICQoT0JKX0JVSUxEKS9mdGNvbmZpZy5oICAgIFwKLSAgICAgICAgICAgICAkKExJQlRPT0wpICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgJChPQkpfQlVJTEQpL01ha2VmaWxlCi0KLQotIyBTdGFuZGFyZCBpbnN0YWxsYXRpb24gdmFyaWFibGVzLgotIwotcHJlZml4ICAgICAgIDo9IEBwcmVmaXhACi1leGVjX3ByZWZpeCAgOj0gQGV4ZWNfcHJlZml4QAotbGliZGlyICAgICAgIDo9IEBsaWJkaXJACi1iaW5kaXIgICAgICAgOj0gQGJpbmRpckAKLWluY2x1ZGVkaXIgICA6PSBAaW5jbHVkZWRpckAKLWRhdGFyb290ZGlyICA6PSBAZGF0YXJvb3RkaXJACi1kYXRhZGlyICAgICAgOj0gQGRhdGFkaXJACi1tYW5kaXIgICAgICAgOj0gQG1hbmRpckAKLQotdmVyc2lvbl9pbmZvIDo9IEB2ZXJzaW9uX2luZm9ACi0KLSMgVmFyaWFibGVzIG5lZWRlZCBmb3IgYGZyZWV0eXBlLWNvbmZpZycgYW5kIGBmcmVldHlwZS5wYycuCi0jCi1QS0dfQ09ORklHICAgICAgICAgOj0gQFBLR19DT05GSUdACi1SRVFVSVJFU19QUklWQVRFICAgOj0gQFJFUVVJUkVTX1BSSVZBVEVACi1MSUJTX1BSSVZBVEUgICAgICAgOj0gQExJQlNfUFJJVkFURUAKLUxJQlNTVEFUSUNfQ09ORklHICA6PSBATElCU1NUQVRJQ19DT05GSUdACi1idWlsZF9saWJ0b29sX2xpYnMgOj0gQGJ1aWxkX2xpYnRvb2xfbGlic0AKLWZ0X3ZlcnNpb24gICAgICAgICA6PSBAZnRfdmVyc2lvbkAKLQotIyBUaGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQuCi0jCi0jIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgJChPQkpfRElSKTsgaG93ZXZlciwgdGhpcyBjYW4gYmUgY2hhbmdlZAotIyB0byBzdWl0IHBhcnRpY3VsYXIgbmVlZHMuCi0jCi1MSUJfRElSIDo9ICQoT0JKX0RJUikKLQotIyBUaGUgQkFTRV9TUkMgbWFjcm8gbGlzdHMgYWxsIHNvdXJjZSBmaWxlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbgotIyBzcmMvYmFzZS9mdGJhc2UuYy4gIFdoZW4gY29uZmlndXJlIHNldHMgdXAgQ0ZMQUdTIHRvIGJ1aWxkIGZ0bWFjLmMsCi0jIGZ0bWFjLmMgc2hvdWxkIGJlIGFkZGVkIHRvIEJBU0VfU1JDLgotZnRtYWNfYyA6PSBAZnRtYWNfY0AKLQotIyBUaGUgU1lTVEVNX1pMSUIgbWFjcm8gaXMgZGVmaW5lZCBpZiB0aGUgdXNlciB3aXNoZXMgdG8gbGluayBkeW5hbWljYWxseQotIyB3aXRoIGl0cyBzeXN0ZW0gd2lkZSB6bGliLiBJZiBTWVNURU1fWkxJQiBpcyAneWVzJywgdGhlIHpsaWIgcGFydCBvZiB0aGUKLSMgZnRnemlwIG1vZHVsZSBpcyBub3QgY29tcGlsZWQgaW4uCi1TWVNURU1fWkxJQiA6PSBAU1lTVEVNX1pMSUJACi0KLQotIyBUaGUgTk9fT1VUUFVUIG1hY3JvIGlzIGFwcGVuZGVkIHRvIGNvbW1hbmQgbGluZXMgaW4gb3JkZXIgdG8gaWdub3JlCi0jIHRoZSBvdXRwdXQgb2Ygc29tZSBwcm9ncmFtcy4KLSMKLU5PX09VVFBVVCA6PSAyPiAvZGV2L251bGwKLQotCi0jIFRvIHN1cHBvcnQgY2FsbHMgbGlrZQotIwotIyAgIGNvbmZpZ3VyZSAtLWluY2x1ZGVkaXI9JyR7bGliZGlyfScvZnJlZXR5cGUyL2luY2x1ZGUKLSMKLSMgd2UgZ2VuZXJhdGUgYGZyZWV0eXBlLWNvbmZpZycgYW5kIGBmcmVldHlwZS5wYycgYXQgY29tcGlsZSB0aW1lIHNvIHRoYXQKLSMgdGhvc2UgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBleHBhbmRlZC4KLQotJChPQkpfQlVJTEQpL2ZyZWV0eXBlLWNvbmZpZzogJChUT1BfRElSKS9idWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW4KLQlybSAtZiAkQCAkQC50bXAKLQlzZWQgLWUgJ3N8JUxJQlNTVEFUSUNfQ09ORklHJXwkKExJQlNTVEFUSUNfQ09ORklHKXwnICAgXAotCSAgICAtZSAnc3wlUEtHX0NPTkZJRyV8JChQS0dfQ09ORklHKXwnICAgICAgICAgICAgICAgICBcCi0JICAgIC1lICdzfCVidWlsZF9saWJ0b29sX2xpYnMlfCQoYnVpbGRfbGlidG9vbF9saWJzKXwnIFwKLQkgICAgLWUgJ3N8JWV4ZWNfcHJlZml4JXwkKGV4ZWNfcHJlZml4KXwnICAgICAgICAgICAgICAgXAotCSAgICAtZSAnc3wlZnRfdmVyc2lvbiV8JChmdF92ZXJzaW9uKXwnICAgICAgICAgICAgICAgICBcCi0JICAgIC1lICdzfCVpbmNsdWRlZGlyJXwkKGluY2x1ZGVkaXIpfCcgICAgICAgICAgICAgICAgIFwKLQkgICAgLWUgJ3N8JWxpYmRpciV8JChsaWJkaXIpfCcgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAtZSAnc3wlcHJlZml4JXwkKHByZWZpeCl8JyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICQ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgPiAkQC50bXAKLQljaG1vZCAreCAkQC50bXAKLQljaG1vZCBnby13ICRALnRtcAotCW12ICRALnRtcCAkQAotCi0jIFRvIHN1cHBvcnQgZGlyZWN0b3J5IG5hbWVzIHdpdGggc3BhY2VzIChhcyBtaWdodCBlYXNpbHkgaGFwcGVuIG9uIFdpbmRvd3MKLSMgcGxhdGZvcm1zKSwgdGhlIHJpZ2h0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIHN1cnJvdW5kIHRoZSBwa2ctdmFyaWFibGVzIGluCi0jIGBmcmVldHlwZTIucGMnIHdpdGggZG91YmxlIHF1b3Rlcy4gIEhvd2V2ZXIsIGRvaW5nIHNvIGlyb25pY2FsbHkgZGlzYWJsZXMKLSMgdGhlIHByZWZpeCBvdmVycmlkZSBtZWNoYW5pc20gZXNwZWNpYWxseSB3cml0dGVuIGZvciBXaW5kb3dzLiAgVGhpcyBpcyBhCi0jIGJ1ZyBpbiBwa2ctY29uZmlnIHZlcnNpb24gMC4yOCBhbmQgZWFybGllci4KLSMKLSMgRm9yIHRoaXMgcmVhc29uLCB3ZSBlc2NhcGUgc3BhY2VzIHdpdGggYmFja3NsYXNoZXMuCi0KLWV4ZWNfcHJlZml4X3ggOj0gJChzdWJzdCAkKHNwYWNlKSxcXCQoc3BhY2UpLCQoZXhlY19wcmVmaXgpKQotaW5jbHVkZWRpcl94ICA6PSAkKHN1YnN0ICQoc3BhY2UpLFxcJChzcGFjZSksJChpbmNsdWRlZGlyKSkKLWxpYmRpcl94ICAgICAgOj0gJChzdWJzdCAkKHNwYWNlKSxcXCQoc3BhY2UpLCQobGliZGlyKSkKLXByZWZpeF94ICAgICAgOj0gJChzdWJzdCAkKHNwYWNlKSxcXCQoc3BhY2UpLCQocHJlZml4KSkKLQotJChPQkpfQlVJTEQpL2ZyZWV0eXBlMi5wYzogJChUT1BfRElSKS9idWlsZHMvdW5peC9mcmVldHlwZTIuaW4KLQlybSAtZiAkQCAkQC50bXAKLQlzZWQgLWUgJ3N8JVJFUVVJUkVTX1BSSVZBVEUlfCQoUkVRVUlSRVNfUFJJVkFURSl8JyAgICAgXAotCSAgICAtZSAnc3wlTElCU19QUklWQVRFJXwkKExJQlNfUFJJVkFURSl8JyAgICAgICAgICAgICBcCi0JICAgIC1lICdzfCVidWlsZF9saWJ0b29sX2xpYnMlfCQoYnVpbGRfbGlidG9vbF9saWJzKXwnIFwKLQkgICAgLWUgJ3N8JWV4ZWNfcHJlZml4JXwkKGV4ZWNfcHJlZml4X3gpfCcgICAgICAgICAgICAgXAotCSAgICAtZSAnc3wlZnRfdmVyc2lvbiV8JChmdF92ZXJzaW9uKXwnICAgICAgICAgICAgICAgICBcCi0JICAgIC1lICdzfCVpbmNsdWRlZGlyJXwkKGluY2x1ZGVkaXJfeCl8JyAgICAgICAgICAgICAgIFwKLQkgICAgLWUgJ3N8JWxpYmRpciV8JChsaWJkaXJfeCl8JyAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAtZSAnc3wlcHJlZml4JXwkKHByZWZpeF94KXwnICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICQ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgPiAkQC50bXAKLQljaG1vZCBhLXcgJEAudG1wCi0JbXYgJEAudG1wICRACi0KLWFsbCBpbnN0YWxsOiAkKE9CSl9CVUlMRCkvZnJlZXR5cGUtY29uZmlnIFwKLSAgICAgJChPQkpfQlVJTEQpL2ZyZWV0eXBlMi5wYwotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvdW5peC1kZXYubWsgYi9idWlsZHMvdW5peC91bml4LWRldi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjMDYwMC4uMDAwMDAwMAotLS0gYS9idWlsZHMvdW5peC91bml4LWRldi5taworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBDb25maWd1cmF0aW9uIHJ1bGVzIGZvciBVbml4ICsgR0NDCi0jCi0jICAgRGV2ZWxvcG1lbnQgdmVyc2lvbiB3aXRob3V0IG9wdGltaXphdGlvbnMgJiBsaWJ0b29sCi0jICAgYW5kIG5vIGluc3RhbGxhdGlvbi4KLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLURFVkVMX0RJUiA6PSAkKFRPUF9ESVIpL2RldmVsCi0KLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvdW5peC91bml4ZGRlZi5tawotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci9nY2MtZGV2Lm1rCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2xpbmtfc3RkLm1rCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L3VuaXgtbGNjLm1rIGIvYnVpbGRzL3VuaXgvdW5peC1sY2MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjJmZGUuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvdW5peC1sY2MubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgQ29uZmlndXJhdGlvbiBydWxlcyBmb3IgVW5peCArIExDQwotIwotIyAgIERldmVsb3BtZW50IHZlcnNpb24gd2l0aG91dCBvcHRpbWl6YXRpb25zICYgbGlidG9vbAotIyAgIGFuZCBubyBpbnN0YWxsYXRpb24uCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL3VuaXgvdW5peGRkZWYubWsKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvY29tcGlsZXIvdW5peC1sY2MubWsKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvbGlua19zdGQubWsKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvdW5peC5tayBiL2J1aWxkcy91bml4L3VuaXgubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDVjMGMuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvdW5peC5taworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIHJ1bGVzIGZvciBVTklYIHBsYXRmb3JtcwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLSMgV2UgbmVlZCB0aGVzZSBkZWNsYXJhdGlvbnMgaGVyZSBzaW5jZSB1bml4LWRlZi5tayBpcyBhIGdlbmVyYXRlZCBmaWxlLgotQlVJTERfRElSIDo9ICQoVE9QX0RJUikvYnVpbGRzL3VuaXgKLVBMQVRGT1JNICA6PSB1bml4Ci0KLWhhdmVfbWsgOj0gJCh3aWxkY2FyZCAkKE9CSl9ESVIpL3VuaXgtZGVmLm1rKQotaWZuZXEgKCQoaGF2ZV9tayksKQotICAjIFdlIGFyZSBidWlsZGluZyBGcmVlVHlwZSAyIG5vdCBpbiB0aGUgc3JjIHRyZWUuCi0gIGluY2x1ZGUgJChPQkpfRElSKS91bml4LWRlZi5tawotICBpbmNsdWRlICQoT0JKX0RJUikvdW5peC1jYy5tawotZWxzZQotICBpbmNsdWRlICQoQlVJTERfRElSKS91bml4LWRlZi5tawotICBpbmNsdWRlICQoQlVJTERfRElSKS91bml4LWNjLm1rCi1lbmRpZgotCi1pZmRlZiBCVUlMRF9QUk9KRUNUCi0KLSAgLlBIT05ZOiBjbGVhbl9wcm9qZWN0IGRpc3RjbGVhbl9wcm9qZWN0Ci0KLSAgIyBOb3cgaW5jbHVkZSB0aGUgbWFpbiBzdWItbWFrZWZpbGUuICBJdCBjb250YWlucyBhbGwgdGhlIHJ1bGVzIHVzZWQgdG8KLSAgIyBidWlsZCB0aGUgbGlicmFyeSB3aXRoIHRoZSBwcmV2aW91cyB2YXJpYWJsZXMgZGVmaW5lZC4KLSAgIwotICBpbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzLyQoUFJPSkVDVCkubWsKLQotCi0gICMgVGhlIGNsZWFudXAgdGFyZ2V0cy4KLSAgIwotICBjbGVhbl9wcm9qZWN0OiBjbGVhbl9wcm9qZWN0X3VuaXgKLSAgZGlzdGNsZWFuX3Byb2plY3Q6IGRpc3RjbGVhbl9wcm9qZWN0X3VuaXgKLQotCi0gICMgVGhpcyBmaW5hbCBydWxlIGlzIHVzZWQgdG8gbGluayBhbGwgb2JqZWN0IGZpbGVzIGludG8gYSBzaW5nbGUgbGlicmFyeS4KLSAgIyBJdCBpcyBwYXJ0IG9mIHRoZSBzeXN0ZW0tc3BlY2lmaWMgc3ViLU1ha2VmaWxlIGJlY2F1c2Ugbm90IGFsbAotICAjIGxpYnJhcmlhbnMgYWNjZXB0IGEgc2ltcGxlIHN5bnRheCBsaWtlCi0gICMKLSAgIyAgIGxpYnJhcmlhbiBsaWJyYXJ5X2ZpbGUge2xpc3Qgb2Ygb2JqZWN0IGZpbGVzfQotICAjCi0gICAgJChQUk9KRUNUX0xJQlJBUlkpOiAkKE9CSkVDVFNfTElTVCkKLSAgaWZkZWYgQ0xFQU5fTElCUkFSWQotCSAgICAtJChDTEVBTl9MSUJSQVJZKSAkKE5PX09VVFBVVCkKLSAgZW5kaWYKLQkgICAgJChMSU5LX0xJQlJBUlkpCi0KLSAgaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy91bml4L2luc3RhbGwubWsKLQotZW5kaWYKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvdW5peGRkZWYubWsgYi9idWlsZHMvdW5peC91bml4ZGRlZi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmMjMwNy4uMDAwMDAwMAotLS0gYS9idWlsZHMvdW5peC91bml4ZGRlZi5taworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIHJ1bGVzIHRlbXBsYXRlcyBmb3IKLSMgZGV2ZWxvcG1lbnQgdW5kZXIgVW5peCB3aXRoIG5vIGNvbmZpZ3VyZSBzY3JpcHQgKGdjYyBvbmx5KQotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotVE9QX0RJUiA6PSAkKHNoZWxsIGNkICQoVE9QX0RJUik7IHB3ZCkKLU9CSl9ESVIgOj0gJChzaGVsbCBjZCAkKE9CSl9ESVIpOyBwd2QpCi0KLVBMQVRGT1JNIDo9IHVuaXgKLQotREVMRVRFIDo9IHJtIC1mCi1DQVQgICAgOj0gY2F0Ci1TRVAgICAgOj0gLwotCi0jIHdlIHVzZSBhIHNwZWNpYWwgZGV2ZWwgZnRvcHRpb24uaAotREVWRUxfRElSIDo9ICQoVE9QX0RJUikvZGV2ZWwKLQotCi0jIGxpYnJhcnkgZmlsZSBuYW1lCi0jCi1MSUJSQVJZIDo9IGxpYiQoUFJPSkVDVCkKLQotCi0jIFRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGxpYnJhcnkgZmlsZXMgYXJlIHBsYWNlZC4KLSMKLSMgQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgc2FtZSBhcyAkKE9CSl9ESVIpOyBob3dldmVyLCB0aGlzIGNhbiBiZSBjaGFuZ2VkCi0jIHRvIHN1aXQgcGFydGljdWxhciBuZWVkcy4KLSMKLUxJQl9ESVIgOj0gJChPQkpfRElSKQotCi0KLU5PX09VVFBVVCA6PSAyPiAvZGV2L251bGwKLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy92bXMvZnRjb25maWcuaCBiL2J1aWxkcy92bXMvZnRjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhYzJlYy4uMDAwMDAwMAotLS0gYS9idWlsZHMvdm1zL2Z0Y29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjb25maWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFZNUy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkICovCi0gIC8qIGJ5IHRoZSByZXN0IG9mIHRoZSBlbmdpbmUuICBNb3N0IG9mIHRoZSBtYWNyb3MgaGVyZSBhcmUgYXV0b21hdGljYWxseSAqLwotICAvKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSwgYW5kIHlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2hhbmdlIGl0IHRvICAgKi8KLSAgLyogcG9ydCBGcmVlVHlwZSwgZXhjZXB0IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhIG5vbi1BTlNJICAgICAgICAgICovCi0gIC8qIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSBob3dldmVyIHRoYXQgaWYgc29tZSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWQsIHdlICAgICAgICovCi0gIC8qIGFkdmlzZSB5b3UgdG8gcGxhY2UgYSBtb2RpZmllZCBjb3B5IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyB1c3VhbGx5IGBidWlsZHMvPHN5c3RlbT4nLCBhbmQgY29udGFpbnMgICAgICAgICovCi0gIC8qIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW5jbHVkZWQgZmlyc3Qgd2hlbiBidWlsZGluZyAgICAqLwotICAvKiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEZUQ09ORklHX0hfCi0jZGVmaW5lIEZUQ09ORklHX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX09QVElPTlNfSAotI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIFBMQVRGT1JNLVNQRUNJRklDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIG1hY3JvcyBjYW4gYmUgdG9nZ2xlZCB0byBzdWl0IGEgc3BlY2lmaWMgc3lzdGVtLiAgVGhlIGN1cnJlbnQgICAqLwotICAvKiBvbmVzIGFyZSBkZWZhdWx0cyB1c2VkIHRvIGNvbXBpbGUgRnJlZVR5cGUgaW4gYW4gQU5TSSBDIGVudmlyb25tZW50ICAgKi8KLSAgLyogKDE2Yml0IGNvbXBpbGVycyBhcmUgYWxzbyBzdXBwb3J0ZWQpLiAgQ29weSB0aGlzIGZpbGUgdG8geW91ciBvd24gICAgICovCi0gIC8qIGBidWlsZHMvPHN5c3RlbT4nIGRpcmVjdG9yeSwgYW5kIGVkaXQgaXQgdG8gcG9ydCB0aGUgZW5naW5lLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBIQVZFX1VOSVNURF9IICAxCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAgIDEKLQotI2RlZmluZSBTSVpFT0ZfSU5UICAgNAotI2RlZmluZSBTSVpFT0ZfTE9ORyAgNAotCi0jZGVmaW5lIEZUX1NJWkVPRl9JTlQgICA0Ci0jZGVmaW5lIEZUX1NJWkVPRl9MT05HICA0Ci0KLSNkZWZpbmUgRlRfQ0hBUl9CSVQgIDgKLQotCi0gIC8qIEZUX1VOVVNFRCBpcyBhIG1hY3JvIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIHBhcmFtZXRlciBpcyBub3QgICovCi0gIC8qIHVzZWQgLS0gdGhpcyBpcyBvbmx5IHVzZWQgdG8gZ2V0IHJpZCBvZiB1bnBsZWFzYW50IGNvbXBpbGVyIHdhcm5pbmdzICovCi0jaWZuZGVmIEZUX1VOVVNFRAotI2RlZmluZSBGVF9VTlVTRUQoIGFyZyApICAoIChhcmcpID0gKGFyZykgKQotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgQVVUT01BVElDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuICBEb24ndCB0b3VjaCAgICovCi0gIC8qIHRoZWlyIGRlZmluaXRpb24sIHVubGVzcyB5b3Uga25vdyBwcmVjaXNlbHkgd2hhdCB5b3UgYXJlIGRvaW5nLiAgTm8gICAqLwotICAvKiBwb3J0ZXIgc2hvdWxkIG5lZWQgdG8gbWVzcyB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNYWMgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBpcyB0aGUgb25seSBuZWNlc3NhcnkgY2hhbmdlLCBzbyBpdCBpcyBkZWZpbmVkIGhlcmUgaW5zdGVhZCAgICAqLwotICAvKiAgIHByb3ZpZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgZGVmaW5lZCggX19BUFBMRV9fICkgfHwgKCBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgZGVmaW5lZCggbWFjaW50b3NoICkgKQotICAvKiBubyBDYXJib24gZnJhbWV3b3JrcyBmb3IgNjRiaXQgMTAuNC54ICovCi0gIC8qIEF2YWlsYWJpbGl0eU1hY3Jvcy5oIGlzIGF2YWlsYWJsZSBzaW5jZSBNYWMgT1MgWCAxMC4yLCAgICAgICAgKi8KLSAgLyogc28gZ3Vlc3MgdGhlIHN5c3RlbSB2ZXJzaW9uIGJ5IG1heGltdW0gZXJybm8gYmVmb3JlIGluY2x1c2lvbiAqLwotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgRUNBTkNFTEVEIC8qIGRlZmluZWQgc2luY2UgMTAuMiAqLwotI2luY2x1ZGUgIkF2YWlsYWJpbGl0eU1hY3Jvcy5oIgotI2VuZGlmCi0jaWYgZGVmaW5lZCggX19MUDY0X18gKSAmJiBcCi0gICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQgKQotI3VuZGVmIEZUX01BQ0lOVE9TSAotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoIF9fU0NfXyApIHx8IGRlZmluZWQoIF9fTVJDX18gKQotICAvKiBDbGFzc2ljIE1hY09TIGNvbXBpbGVycyAqLwotI2luY2x1ZGUgIkNvbmRpdGlvbmFsTWFjcm9zLmgiCi0jaWYgVEFSR0VUX09TX01BQwotI2RlZmluZSBGVF9NQUNJTlRPU0ggMQotI2VuZGlmCi0KLSNlbmRpZgotCi0KLSAgLyogRml4IGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBzZ2kgY29tcGlsZXIgKi8KLSNpZiBkZWZpbmVkKCBfX3NnaSApICYmICFkZWZpbmVkKCBfX0dOVUNfXyApCi0jaWYgZGVmaW5lZCggX0NPTVBJTEVSX1ZFUlNJT04gKSAmJiAoIF9DT01QSUxFUl9WRVJTSU9OID49IDczMCApCi0jcHJhZ21hIHNldCB3b2ZmIDM1MDUKLSNlbmRpZgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNpY190eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDE2Yml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfSW50MTY7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMTZiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEZUX1VJbnQxNjsKLQotICAvKiAqLwotCi0KLSAgLyogdGhpcyAjaWYgMCAuLi4gI2VuZGlmIGNsYXVzZSBpcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyAqLwotI2lmIDAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBYWFggIEZUX0ludDMyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIFhYWCAgRlRfVUludDMyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgNjRiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICBPbmx5IGRlZmluZWQgaWYgdGhlcmUgaXMgcmVhbCA2NGJpdCBzdXBwb3J0OyAgICovCi0gIC8qICAgIG90aGVyd2lzZSwgaXQgZ2V0cyBlbXVsYXRlZCB3aXRoIGEgc3RydWN0dXJlIChpZiBuZWNlc3NhcnkpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgWFhYICBGVF9JbnQ2NDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDY0Yml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgT25seSBkZWZpbmVkIGlmIHRoZXJlIGlzIHJlYWwgNjRiaXQgc3VwcG9ydDsgICAqLwotICAvKiAgICBvdGhlcndpc2UsIGl0IGdldHMgZW11bGF0ZWQgd2l0aCBhIHN0cnVjdHVyZSAoaWYgbmVjZXNzYXJ5KS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgWFhYICBGVF9VSW50NjQ7Ci0KLSAgLyogKi8KLQotI2VuZGlmCi0KLSNpZiBGVF9TSVpFT0ZfSU5UID09ICgzMiAvIEZUX0NIQVJfQklUKQotCi0gIHR5cGVkZWYgc2lnbmVkIGludCAgICAgIEZUX0ludDMyOwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICBGVF9VSW50MzI7Ci0KLSNlbGlmIEZUX1NJWkVPRl9MT05HID09ICgzMiAvIEZUX0NIQVJfQklUKQotCi0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgICAgIEZUX0ludDMyOwotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBGVF9VSW50MzI7Ci0KLSNlbHNlCi0jZXJyb3IgIm5vIDMyYml0IHR5cGUgZm91bmQgLS0gcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlcyIKLSNlbmRpZgotCi0KLSAgLyogbG9vayB1cCBhbiBpbnRlZ2VyIHR5cGUgdGhhdCBpcyBhdCBsZWFzdCAzMiBiaXRzICovCi0jaWYgRlRfU0laRU9GX0lOVCA+PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIGludCAgICAgICAgICAgIEZUX0Zhc3Q7Ci0gIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgRlRfVUZhc3Q7Ci0KLSNlbGlmIEZUX1NJWkVPRl9MT05HID49ICgzMiAvIEZUX0NIQVJfQklUKQotCi0gIHR5cGVkZWYgbG9uZyAgICAgICAgICAgRlRfRmFzdDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICBGVF9VRmFzdDsKLQotI2VuZGlmCi0KLQotICAvKiBkZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGEgNjQtYml0IGludCB0eXBlIGZvciBwbGF0Zm9ybXMgd2l0aG91dCAqLwotICAvKiBBdXRvY29uZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIEZUX1NJWkVPRl9MT05HID09ICg2NCAvIEZUX0NIQVJfQklUKQotCi0gIC8qIEZUX0xPTkc2NCBtdXN0IGJlIGRlZmluZWQgaWYgYSA2NC1iaXQgdHlwZSBpcyBhdmFpbGFibGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZwotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgNjQtYml0IGRhdGEgdHlwZSBtYXkgY3JlYXRlIGNvbXBpbGF0aW9uIHByb2JsZW1zIGlmIHlvdSBjb21waWxlICAgICAqLwotICAvKiBpbiBzdHJpY3QgQU5TSSBtb2RlLiAgVG8gYXZvaWQgdGhlbSwgd2UgZGlzYWJsZSBvdGhlciA2NC1iaXQgZGF0YSAgICAgKi8KLSAgLyogdHlwZXMgaWYgX19TVERDX18gaXMgZGVmaW5lZC4gIFlvdSBjYW4gaG93ZXZlciBpZ25vcmUgdGhpcyBydWxlICAgICAgICovCi0gIC8qIGJ5IGRlZmluaW5nIHRoZSBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0IGNvbmZpZ3VyYXRpb24gbWFjcm8uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbGlmICFkZWZpbmVkKCBfX1NURENfXyApIHx8IGRlZmluZWQoIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgKQotCi0jaWYgZGVmaW5lZCggX19TVERDX1ZFUlNJT05fXyApICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAotCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkgJiYgX01TQ19WRVIgPj0gOTAwICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAqLwotCi0gIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBfX2ludDY0Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgX19pbnQ2NAotCi0jZWxpZiBkZWZpbmVkKCBfX0JPUkxBTkRDX18gKSAgLyogQm9ybGFuZCBDKysgKi8KLQotICAvKiBYWFhYOiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIHZhbHVlIG9mIF9fQk9STEFORENfXyBpbiBvcmRlciAqLwotICAvKiAgICAgICB0byB0ZXN0IHRoZSBjb21waWxlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBfX2ludDY0Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgX19pbnQ2NAotCi0jZWxpZiBkZWZpbmVkKCBfX1dBVENPTUNfXyApICAgLyogV2F0Y29tIEMrKyAqLwotCi0gIC8qIFdhdGNvbSBkb2Vzbid0IHByb3ZpZGUgNjQtYml0IGRhdGEgdHlwZXMgKi8KLQotI2VsaWYgZGVmaW5lZCggX19NV0VSS1NfXyApICAgIC8qIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IgKi8KLQotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAotCi0jZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCi0KLSAgLyogR0NDIHByb3ZpZGVzIHRoZSBgbG9uZyBsb25nJyB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSNlbmRpZiAvKiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwgKi8KLQotI2VuZGlmIC8qIEZUX1NJWkVPRl9MT05HID09ICg2NCAvIEZUX0NIQVJfQklUKSAqLwotCi0jaWZkZWYgRlRfTE9ORzY0Ci0gIHR5cGVkZWYgRlRfSU5UNjQgICBGVF9JbnQ2NDsKLSAgdHlwZWRlZiBGVF9VSU5UNjQgIEZUX1VJbnQ2NDsKLSNlbmRpZgotCi0KLSNpZmRlZiBfV0lONjQKLSAgLyogb25seSA2NGJpdCBXaW5kb3dzIHVzZXMgdGhlIExMUDY0IGRhdGEgbW9kZWwsIGkuZS4sICovCi0gIC8qIDMyYml0IGludGVnZXJzLCA2NGJpdCBwb2ludGVycyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9VSU5UX1RPX1BPSU5URVIoIHggKSAodm9pZCopKHVuc2lnbmVkIF9faW50NjQpKHgpCi0jZWxzZQotI2RlZmluZSBGVF9VSU5UX1RPX1BPSU5URVIoIHggKSAodm9pZCopKHVuc2lnbmVkIGxvbmcpKHgpCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogbWlzY2VsbGFuZW91cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX0JFR0lOX1NUTU5UICBkbyB7Ci0jZGVmaW5lIEZUX0VORF9TVE1OVCAgICB9IHdoaWxlICggMCApCi0jZGVmaW5lIEZUX0RVTU1ZX1NUTU5UICBGVF9CRUdJTl9TVE1OVCBGVF9FTkRfU1RNTlQKLQotCi0gIC8qIHR5cGVvZiBjb25kaXRpb24gdGFrZW4gZnJvbSBnbnVsaWIncyBgaW50cHJvcHMuaCcgaGVhZGVyIGZpbGUgKi8KLSNpZiAoICggZGVmaW5lZCggX19HTlVDX18gKSAmJiBfX0dOVUNfXyA+PSAyICkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgICggZGVmaW5lZCggX19JQk1DX18gKSAmJiBfX0lCTUNfXyA+PSAxMjEwICYmICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGVmaW5lZCggX19JQk1fX1RZUEVPRl9fICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgICggZGVmaW5lZCggX19TVU5QUk9fQyApICYmIF9fU1VOUFJPX0MgPj0gMHg1MTEwICYmICFfX1NURENfXyApICkKLSNkZWZpbmUgRlRfVFlQRU9GKCB0eXBlICkgICggX190eXBlb2ZfXyAoIHR5cGUgKSApCi0jZWxzZQotI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgLyogZW1wdHkgKi8KLSNlbmRpZgotCi0KLSNpZmRlZiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIHN0YXRpYyAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgc3RhdGljICB4Ci0KLSNlbHNlCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgZXh0ZXJuICJDIiAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIGV4dGVybiAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUICovCi0KLSNkZWZpbmUgRlRfTE9DQUxfQVJSQVkoIHggKSAgICAgIGV4dGVybiBjb25zdCAgeAotI2RlZmluZSBGVF9MT0NBTF9BUlJBWV9ERUYoIHggKSAgY29uc3QgIHgKLQotCi0jaWZuZGVmIEZUX0JBU0UKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0JBU0UoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQkFTRSggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0JBU0UgKi8KLQotCi0jaWZuZGVmIEZUX0JBU0VfREVGCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4Ci0jZWxzZQotI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9CQVNFX0RFRiAqLwotCi0KLSNpZm5kZWYgRlRfRVhQT1JUCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIGV4dGVybiAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfRVhQT1JUICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfREVGCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfREVGICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfVkFSCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfVkFSKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfVkFSICovCi0KLSAgLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG5lZWRlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSAgICovCi0gIC8qIEMrKyBjb21waWxlciBhbmQgd2l0aCAxNmJpdCBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBUaGlzIGlzIHNwZWNpYWwuICBXaXRoaW4gQysrLCB5b3UgbXVzdCBzcGVjaWZ5IGBleHRlcm4gIkMiJyBmb3IgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIHZpYSBmdW5jdGlvbiBwb2ludGVycywgYW5kIHlvdSBhbHNvICAgICovCi0gIC8qIG11c3QgZG8gdGhhdCBmb3Igc3RydWN0dXJlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIHBvaW50ZXJzIHRvICAqLwotICAvKiBhc3N1cmUgQyBsaW5rYWdlIC0tIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGhhdmUgKGxvY2FsKSBhbm9ueW1vdXMgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSBhY2Nlc3NlZCBieSAoZ2xvYmFsKSBmdW5jdGlvbiBwb2ludGVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfQ0FMTEJBQ0tfREVGIGlzIHVzZWQgdG8gX2RlZmluZV8gYSBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRSBpcyB1c2VkIHRvIF9kZWNsYXJlXyBhIGNvbnN0YW50IHZhcmlhYmxlIHRoYXQgKi8KLSAgLyogY29udGFpbnMgcG9pbnRlcnMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRV9ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNvbnN0YW50IHZhcmlhYmxlICAgKi8KLSAgLyogdGhhdCBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU29tZSAxNmJpdCBjb21waWxlcnMgaGF2ZSB0byByZWRlZmluZSB0aGVzZSBtYWNyb3MgdG8gaW5zZXJ0ICAgICovCi0gIC8qIHRoZSBpbmZhbW91cyBgX2NkZWNsJyBvciBgX19mYXN0Y2FsbCcgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ0FMTEJBQ0tfREVGCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0NBTExCQUNLX0RFRiggeCApICBzdGF0aWMgIHgKLSNlbmRpZgotI2VuZGlmIC8qIEZUX0NBTExCQUNLX0RFRiAqLwotCi0jaWZuZGVmIEZUX0NBTExCQUNLX1RBQkxFCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4gIkMiCi0jZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgZXh0ZXJuICJDIgotI2Vsc2UKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4KLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAvKiBub3RoaW5nICovCi0jZW5kaWYKLSNlbmRpZiAvKiBGVF9DQUxMQkFDS19UQUJMRSAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogRlRDT05GSUdfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy92bXMvZnRzeXN0ZW0uYyBiL2J1aWxkcy92bXMvZnRzeXN0ZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzZThlYy4uMDAwMDAwMAotLS0gYS9idWlsZHMvdm1zL2Z0c3lzdGVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeXN0ZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFZNUy1zcGVjaWZpYyBGcmVlVHlwZSBsb3ctbGV2ZWwgc3lzdGVtIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSAgLyogd2UgdXNlIG91ciBzcGVjaWFsIGZ0Y29uZmlnLmggZmlsZSwgbm90IHRoZSBzdGFuZGFyZCBvbmUgKi8KLSNpbmNsdWRlIDxmdGNvbmZpZy5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotICAvKiBtZW1vcnktbWFwcGluZyBpbmNsdWRlcyBhbmQgZGVmaW5pdGlvbnMgKi8KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaWZuZGVmIE1BUF9GSUxFCi0jZGVmaW5lIE1BUF9GSUxFICAweDAwCi0jZW5kaWYKLQotI2lmZGVmIE1VTk1BUF9VU0VTX1ZPSURQCi0jZGVmaW5lIE1VTk1BUF9BUkdfQ0FTVCAgdm9pZCAqCi0jZWxzZQotI2RlZmluZSBNVU5NQVBfQVJHX0NBU1QgIGNoYXIgKgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX01VTk1BUF9ERUNMCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICBleHRlcm4gIkMiCi0jZWxzZQotICBleHRlcm4KLSNlbmRpZgotICBpbnQKLSAgbXVubWFwKCBjaGFyKiAgYWRkciwKLSAgICAgICAgICBpbnQgICAgbGVuICk7Ci0KLSNkZWZpbmUgTVVOTUFQX0FSR19DQVNUICBjaGFyICoKLQotI2VuZGlmIC8qIE5FRURfREVDTEFSQVRJT05fTVVOTUFQICovCi0KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgTUVNT1JZIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgOjogVGhlIHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWRkcmVzcyBvZiBuZXdseSBhbGxvY2F0ZWQgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCogKQotICBmdF9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICBsb25nICAgICAgIHNpemUgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBtZW1vcnkgKTsKLQotICAgIHJldHVybiBtYWxsb2MoIHNpemUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1lbW9yeSByZWFsbG9jYXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJfc2l6ZSA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5ld19zaXplIDo6IFRoZSBuZXdseSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxvY2sgICAgOjogVGhlIGN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgYmxvY2sgaW4gbWVtb3J5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHJlYWxsb2NhdGVkIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkKLSAgZnRfcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsCi0gICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBtZW1vcnkgKTsKLSAgICBGVF9VTlVTRUQoIGN1cl9zaXplICk7Ci0KLSAgICByZXR1cm4gcmVhbGxvYyggYmxvY2ssIG5ld19zaXplICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtZW1vcnkgcmVsZWFzZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxvY2sgIDo6IFRoZSBhZGRyZXNzIG9mIGJsb2NrIGluIG1lbW9yeSB0byBiZSBmcmVlZC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9mcmVlKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwotCi0gICAgZnJlZSggYmxvY2sgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfaW8KLQotICAvKiBXZSB1c2UgdGhlIG1hY3JvIFNUUkVBTV9GSUxFIGZvciBjb252ZW5pZW5jZSB0byBleHRyYWN0IHRoZSAgICAgICAqLwotICAvKiBzeXN0ZW0tc3BlY2lmaWMgc3RyZWFtIGhhbmRsZSBmcm9tIGEgZ2l2ZW4gRnJlZVR5cGUgc3RyZWFtIG9iamVjdCAqLwotI2RlZmluZSBTVFJFQU1fRklMRSggc3RyZWFtICkgICggKEZJTEUqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2Nsb3NlX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmdW5jdGlvbiB0byBjbG9zZSBhIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfY2xvc2Vfc3RyZWFtKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBtdW5tYXAoIChNVU5NQVBfQVJHX0NBU1Qpc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIsIHN0cmVhbS0+c2l6ZSApOwotCi0gICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwotICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IDA7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3BlbiggRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKQotICB7Ci0gICAgaW50ICAgICAgICAgIGZpbGU7Ci0gICAgc3RydWN0IHN0YXQgIHN0YXRfYnVmOwotCi0KLSAgICBpZiAoICFzdHJlYW0gKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9IYW5kbGUgKTsKLQotICAgIC8qIG9wZW4gdGhlIGZpbGUgKi8KLSAgICBmaWxlID0gb3BlbiggZmlsZXBhdGhuYW1lLCBPX1JET05MWSApOwotICAgIGlmICggZmlsZSA8IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIH0KLQotICAgIGlmICggZnN0YXQoIGZpbGUsICZzdGF0X2J1ZiApIDwgMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKLSAgICAgIEZUX0VSUk9SKCggIiBjb3VsZCBub3QgYGZzdGF0JyBmaWxlIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKLSAgICAgIGdvdG8gRmFpbF9NYXA7Ci0gICAgfQotCi0gICAgc3RyZWFtLT5zaXplID0gc3RhdF9idWYuc3Rfc2l6ZTsKLSAgICBpZiAoICFzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgb3BlbmVkIGAlcycgYnV0IHplcm8tc2l6ZWRcbiIsIGZpbGVwYXRobmFtZSApKTsKLSAgICAgIGdvdG8gRmFpbF9NYXA7Ci0gICAgfQotCi0gICAgc3RyZWFtLT5wb3MgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfRklMRSB8IE1BUF9QUklWQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKLQotICAgIGlmICggKGxvbmcpc3RyZWFtLT5iYXNlID09IC0xICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwotICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBgbW1hcCcgZmlsZSBgJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7Ci0gICAgICBnb3RvIEZhaWxfTWFwOwotICAgIH0KLQotICAgIGNsb3NlKCBmaWxlICk7Ci0KLSAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IHN0cmVhbS0+YmFzZTsKLSAgICBzdHJlYW0tPnBhdGhuYW1lLnBvaW50ZXIgICA9IChjaGFyKilmaWxlcGF0aG5hbWU7Ci0KLSAgICBzdHJlYW0tPmNsb3NlID0gZnRfY2xvc2Vfc3RyZWFtOwotICAgIHN0cmVhbS0+cmVhZCAgPSAwOwotCi0gICAgRlRfVFJBQ0UxKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgRlRfVFJBQ0UxKCggIiBvcGVuZWQgYCVzJyAoJWQgYnl0ZXMpIHN1Y2Nlc3NmdWxseVxuIiwKLSAgICAgICAgICAgICAgICBmaWxlcGF0aG5hbWUsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgRmFpbF9NYXA6Ci0gICAgY2xvc2UoIGZpbGUgKTsKLQotICAgIHN0cmVhbS0+YmFzZSA9IE5VTEw7Ci0gICAgc3RyZWFtLT5zaXplID0gMDsKLSAgICBzdHJlYW0tPnBvcyAgPSAwOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9TdHJlYW0gKTsKLSAgfQotCi0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLQotICBleHRlcm4gRlRfSW50Ci0gIGZ0X21lbV9kZWJ1Z19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0gIGV4dGVybiB2b2lkCi0gIGZ0X21lbV9kZWJ1Z19kb25lKCBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0jZW5kaWYKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfTWVtb3J5ICkKLSAgRlRfTmV3X01lbW9yeSggdm9pZCApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgbWVtb3J5ID0gKEZUX01lbW9yeSltYWxsb2MoIHNpemVvZiAoICptZW1vcnkgKSApOwotICAgIGlmICggbWVtb3J5ICkKLSAgICB7Ci0gICAgICBtZW1vcnktPnVzZXIgICAgPSAwOwotICAgICAgbWVtb3J5LT5hbGxvYyAgID0gZnRfYWxsb2M7Ci0gICAgICBtZW1vcnktPnJlYWxsb2MgPSBmdF9yZWFsbG9jOwotICAgICAgbWVtb3J5LT5mcmVlICAgID0gZnRfZnJlZTsKLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLSAgICAgIGZ0X21lbV9kZWJ1Z19pbml0KCBtZW1vcnkgKTsKLSNlbmRpZgotICAgIH0KLQotICAgIHJldHVybiBtZW1vcnk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0RvbmVfTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLSAgICBmdF9tZW1fZGVidWdfZG9uZSggbWVtb3J5ICk7Ci0jZW5kaWYKLSAgICBtZW1vcnktPmZyZWUoIG1lbW9yeSwgbWVtb3J5ICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5jZS9mdGRlYnVnLmMgYi9idWlsZHMvd2luY2UvZnRkZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTIwZTJmLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5jZS9mdGRlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRkZWJ1Zy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIERlYnVnZ2luZyBhbmQgbG9nZ2luZyBjb21wb25lbnQgZm9yIFdpbkNFIChib2R5KS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBjb21wb25lbnQgY29udGFpbnMgdmFyaW91cyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyB1c2VkIHRvIGVhc2UgdGhlICovCi0gIC8qIGRlYnVnZ2luZyBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLiAgSXRzIG1haW4gcHVycG9zZSBpcyBpbiBhc3NlcnRpb24gICAqLwotICAvKiBjaGVja2luZywgdHJhY2luZywgYW5kIGVycm9yIGRldGVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSBub3cgdGhyZWUgZGVidWdnaW5nIG1vZGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSB0cmFjZSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIGFuZCB0cmFjZSBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgbG9nIGZpbGUgKHdoaWNoIGNhbiBiZSB0aGUgKi8KLSAgLyogICBzdGFuZGFyZCBlcnJvciBvdXRwdXQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGVycm9yIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgT25seSBlcnJvciBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSByZWxlYXNlIG1vZGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vIGVycm9yIG1lc3NhZ2UgaXMgc2VudCBvciBnZW5lcmF0ZWQuICBUaGUgY29kZSBpcyBmcmVlIGZyb20gYW55ICAgKi8KLSAgLyogICBkZWJ1Z2dpbmcgcGFydHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKLQotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLQotICB2b2lkCi0gIE91dHB1dERlYnVnU3RyaW5nRXgoIGNvbnN0IGNoYXIqICBzdHIgKQotICB7Ci0gICAgc3RhdGljIFdDSEFSICBidWZbODE5Ml07Ci0KLQotICAgIGludCBzeiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgc3RyLCAtMSwgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIGJ1ZiApIC8gc2l6ZW9mICggKmJ1ZiApICk7Ci0gICAgaWYgKCAhc3ogKQotICAgICAgbHN0cmNweVcoIGJ1ZiwgTCJPdXRwdXREZWJ1Z1N0cmluZ0V4OiBNdWx0aUJ5dGVUb1dpZGVDaGFyIGZhaWxlZCIgKTsKLQotICAgIE91dHB1dERlYnVnU3RyaW5nVyggYnVmICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfTWVzc2FnZSggY29uc3QgY2hhciogIGZtdCwKLSAgICAgICAgICAgICAgLi4uICkKLSAgewotICAgIHN0YXRpYyBjaGFyICBidWZbODE5Ml07Ci0gICAgdmFfbGlzdCAgICAgIGFwOwotCi0KLSAgICB2YV9zdGFydCggYXAsIGZtdCApOwotICAgIHZwcmludGYoIGZtdCwgYXAgKTsKLSAgICAvKiBzZW5kIHRoZSBzdHJpbmcgdG8gdGhlIGRlYnVnZ2VyIGFzIHdlbGwgKi8KLSAgICB2c3ByaW50ZiggYnVmLCBmbXQsIGFwICk7Ci0gICAgT3V0cHV0RGVidWdTdHJpbmdFeCggYnVmICk7Ci0gICAgdmFfZW5kKCBhcCApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1BhbmljKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgLi4uICkKLSAgewotICAgIHN0YXRpYyBjaGFyICBidWZbODE5Ml07Ci0gICAgdmFfbGlzdCAgICAgIGFwOwotCi0KLSAgICB2YV9zdGFydCggYXAsIGZtdCApOwotICAgIHZzcHJpbnRmKCBidWYsIGZtdCwgYXAgKTsKLSAgICBPdXRwdXREZWJ1Z1N0cmluZ0V4KCBidWYgKTsKLSAgICB2YV9lbmQoIGFwICk7Ci0KLSAgICBleGl0KCBFWElUX0ZBSUxVUkUgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KLQotICBGVF9CQVNFX0RFRiggaW50ICkKLSAgRlRfVGhyb3coIEZUX0Vycm9yICAgICBlcnJvciwKLSAgICAgICAgICAgIGludCAgICAgICAgICBsaW5lLAotICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGUgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBlcnJvciApOwotICAgIEZUX1VOVVNFRCggbGluZSApOwotICAgIEZUX1VOVVNFRCggZmlsZSApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLQotICAvKiBhcnJheSBvZiB0cmFjZSBsZXZlbHMsIGluaXRpYWxpemVkIHRvIDAgKi8KLSAgaW50ICBmdF90cmFjZV9sZXZlbHNbdHJhY2VfY291bnRdOwotCi0gIC8qIGRlZmluZSBhcnJheSBvZiB0cmFjZSB0b2dnbGUgbmFtZXMgKi8KLSNkZWZpbmUgRlRfVFJBQ0VfREVGKCB4ICkgICN4ICwKLQotICBzdGF0aWMgY29uc3QgY2hhciogIGZ0X3RyYWNlX3RvZ2dsZXNbdHJhY2VfY291bnQgKyAxXSA9Ci0gIHsKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSQUNFX0gKLSAgICBOVUxMCi0gIH07Ci0KLSN1bmRlZiBGVF9UUkFDRV9ERUYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW5pdGlhbGl6ZSB0aGUgdHJhY2luZyBzdWItc3lzdGVtLiAgVGhpcyBpcyBkb25lIGJ5IHJldHJpZXZpbmcgdGhlICAgICovCi0gIC8qIHZhbHVlIG9mIHRoZSAiRlQyX0RFQlVHIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEl0IG11c3QgYmUgYSBsaXN0IG9mICAqLwotICAvKiB0b2dnbGVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBgOycgb3IgYCwnLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICJhbnk6MyBtZW1vcnk6NiBzdHJlYW06NSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyB3aWxsIHJlcXVlc3QgdGhhdCBhbGwgbGV2ZWxzIGJlIHNldCB0byAzLCBleGNlcHQgdGhlIHRyYWNlIGxldmVsICovCi0gIC8qIGZvciB0aGUgbWVtb3J5IGFuZCBzdHJlYW0gY29tcG9uZW50cyB3aGljaCBhcmUgc2V0IHRvIDYgYW5kIDUsICAgICAgICAqLwotICAvKiByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlZSB0aGUgZmlsZSBgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgnIGZvciBkZXRhaWxzIG9mIHRoZSAqLwotICAvKiBhdmFpbGFibGUgdG9nZ2xlIG5hbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNjsgMCBtZWFucyBxdWlldCAoZXhjZXB0IGZvciBzZXJpb3VzICAqLwotICAvKiBydW50aW1lIGVycm9ycyksIGFuZCA2IG1lYW5zIF92ZXJ5XyB2ZXJib3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfZGVidWdfaW5pdCggdm9pZCApCi0gIHsKLSAgICAvKiBXaW5kb3dzIE1vYmlsZSBkb2Vzbid0IGhhdmUgZW52aXJvbm1lbnQgQVBJOiAgICAgICAgICAgKi8KLSAgICAvKiBHZXRFbnZpcm9ubWVudFN0cmluZ3MsIEdldEVudmlyb25tZW50VmFyaWFibGUsIGdldGVudi4gKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBGSVhNRSEhISBIb3cgdG8gc2V0IGRlYnVnIG1vZGU/ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIGNvbnN0IGNoYXIqICBmdDJfZGVidWcgPSBnZXRlbnYoICJGVDJfREVCVUciICk7ICovCi0KLSAgICBjb25zdCBjaGFyKiAgZnQyX2RlYnVnID0gMDsKLQotCi0gICAgaWYgKCBmdDJfZGVidWcgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqICBwID0gZnQyX2RlYnVnOwotICAgICAgY29uc3QgY2hhciogIHE7Ci0KLQotICAgICAgZm9yICggOyAqcDsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHNlcGFyYXRvcnMgKi8KLSAgICAgICAgaWYgKCAqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnLCcgfHwgKnAgPT0gJzsnIHx8ICpwID09ICc9JyApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogcmVhZCB0b2dnbGUgbmFtZSwgZm9sbG93ZWQgYnkgJzonICovCi0gICAgICAgIHEgPSBwOwotICAgICAgICB3aGlsZSAoICpwICYmICpwICE9ICc6JyApCi0gICAgICAgICAgcCsrOwotCi0gICAgICAgIGlmICggISpwICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoICpwID09ICc6JyAmJiBwID4gcSApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgIG4sIGksIGxlbiA9IChpbnQpKCBwIC0gcSApOwotICAgICAgICAgIGludCAgbGV2ZWwgPSAtMSwgZm91bmQgPSAtMTsKLQotCi0gICAgICAgICAgZm9yICggbiA9IDA7IG4gPCB0cmFjZV9jb3VudDsgbisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiAgdG9nZ2xlID0gZnRfdHJhY2VfdG9nZ2xlc1tuXTsKLQotCi0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCB0b2dnbGVbaV0gIT0gcVtpXSApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggaSA9PSBsZW4gJiYgdG9nZ2xlW2ldID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmb3VuZCA9IG47Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHJlYWQgbGV2ZWwgKi8KLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgaWYgKCAqcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbGV2ZWwgPSAqcCAtICcwJzsKLSAgICAgICAgICAgIGlmICggbGV2ZWwgPCAwIHx8IGxldmVsID4gNyApCi0gICAgICAgICAgICAgIGxldmVsID0gLTE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBmb3VuZCA+PSAwICYmIGxldmVsID49IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZm91bmQgPT0gdHJhY2VfYW55ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciAiYW55IiAqLwotICAgICAgICAgICAgICBmb3IgKCBuID0gMDsgbiA8IHRyYWNlX2NvdW50OyBuKysgKQotICAgICAgICAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1tuXSA9IGxldmVsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNbZm91bmRdID0gbGV2ZWw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotI2Vsc2UgIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKLSAgewotICAgIC8qIG5vdGhpbmcgKi8KLSAgfQotCi0KLSNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9idWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnNsbiBiL2J1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUuc2xuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQ1NDYzLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUuc2xuCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLU1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDkuMDANCi0jIFZpc3VhbCBTdHVkaW8gMjAwNQ0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZnJlZXR5cGUiLCAiZnJlZXR5cGUudmNwcm9qIiwgIns3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9Ig0KLUVuZFByb2plY3QNCi1HbG9iYWwNCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCi0JCUxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpDQotCQlMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSA9IExJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQlMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSA9IExJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQlMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCUxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSA9IExJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkgPSBMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQlMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCUxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQlMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQlMSUIgRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSA9IExJQiBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpDQotCQlMSUIgRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkgPSBMSUIgRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCUxJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSA9IExJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSA9IExJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCUxJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQlMSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCUxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSA9IExJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSA9IExJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCUxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkgPSBMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSA9IExJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSA9IExJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCUxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpID0gTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCUxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCUxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpID0gTElCIFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJTElCIFJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkgPSBMSUIgUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkgPSBMSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkgPSBMSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCUxJQiBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KLQkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQotCUVuZEdsb2JhbFNlY3Rpb24NCi1FbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9idWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiBiL2J1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWMwZTM3Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMzgzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdCBQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIgVmVyc2lvbj0iOC4wMCIgTmFtZT0iZnJlZXR5cGUiIFByb2plY3RHVUlEPSJ7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfSIgVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMCI+DQotICA8UGxhdGZvcm1zPg0KLSAgICA8UGxhdGZvcm0gTmFtZT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIgLz4NCi0gICAgPFBsYXRmb3JtIE5hbWU9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIiAvPg0KLSAgICA8UGxhdGZvcm0gTmFtZT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiIC8+DQotICAgIDxQbGF0Zm9ybSBOYW1lPSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiIC8+DQotICAgIDxQbGF0Zm9ybSBOYW1lPSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiIC8+DQotICAgIDxQbGF0Zm9ybSBOYW1lPSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSIgLz4NCi0gIDwvUGxhdGZvcm1zPg0KLSAgPFRvb2xGaWxlcz4NCi0gIDwvVG9vbEZpbGVzPg0KLSAgPENvbmZpZ3VyYXRpb25zPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiIE91dHB1dERpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0iZmFsc2UiIE1pbmltYWxSZWJ1aWxkPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMiIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIiBPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0iZmFsc2UiIE1pbmltYWxSZWJ1aWxkPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMiIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIiBPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0iZmFsc2UiIE1pbmltYWxSZWJ1aWxkPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMiIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0iZmFsc2UiIE1pbmltYWxSZWJ1aWxkPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMiIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0iZmFsc2UiIE1pbmltYWxSZWJ1aWxkPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMiIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIiBPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0iZmFsc2UiIE1pbmltYWxSZWJ1aWxkPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMiIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIgT3V0cHV0RGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMiIgSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIiBTdHJpbmdQb29saW5nPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMCIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4TVQubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIiBPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0idHJ1ZSIgUnVudGltZUxpYnJhcnk9IjAiIEVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOE1ULmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIyIiBJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giIFN0cmluZ1Bvb2xpbmc9InRydWUiIFJ1bnRpbWVMaWJyYXJ5PSIwIiBFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhNVC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIiBPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMiIgSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIiBTdHJpbmdQb29saW5nPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMCIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4TVQubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0idHJ1ZSIgUnVudGltZUxpYnJhcnk9IjAiIEVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOE1ULmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIyIiBJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giIFN0cmluZ1Bvb2xpbmc9InRydWUiIFJ1bnRpbWVMaWJyYXJ5PSIwIiBFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhNVC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiIE91dHB1dERpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0iZmFsc2UiIFJ1bnRpbWVMaWJyYXJ5PSIwIiBFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4U1QubGliIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiIE91dHB1dERpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMiIgSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIiBTdHJpbmdQb29saW5nPSJmYWxzZSIgUnVudGltZUxpYnJhcnk9IjAiIEVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJmYWxzZSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhTVC5saWIiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIyIiBJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giIFN0cmluZ1Bvb2xpbmc9ImZhbHNlIiBSdW50aW1lTGlicmFyeT0iMCIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOFNULmxpYiIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgU3RyaW5nUG9vbGluZz0iZmFsc2UiIFJ1bnRpbWVMaWJyYXJ5PSIwIiBFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4U1QubGliIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIiBPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMiIgSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIiBTdHJpbmdQb29saW5nPSJmYWxzZSIgUnVudGltZUxpYnJhcnk9IjAiIEVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJmYWxzZSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhTVC5saWIiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIyIiBJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giIFN0cmluZ1Bvb2xpbmc9ImZhbHNlIiBSdW50aW1lTGlicmFyeT0iMCIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOFNULmxpYiIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIiBPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgUnVudGltZUxpYnJhcnk9IjMiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOF9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIiBPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIiBSdW50aW1lTGlicmFyeT0iMyIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4X0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiIE91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giIFJ1bnRpbWVMaWJyYXJ5PSIzIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiIE91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCIgUnVudGltZUxpYnJhcnk9IjMiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOF9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIiBSdW50aW1lTGlicmFyeT0iMyIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4X0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiIE91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giIFJ1bnRpbWVMaWJyYXJ5PSIzIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIiBPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIiBSdW50aW1lTGlicmFyeT0iMSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhTVF9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIiBPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiIFJ1bnRpbWVMaWJyYXJ5PSIxIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOFNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiIE91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giIFJ1bnRpbWVMaWJyYXJ5PSIxIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOFNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIiBPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSIgUnVudGltZUxpYnJhcnk9IjEiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4U1RfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiIE91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIiBSdW50aW1lTGlicmFyeT0iMSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhTVF9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIiBPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiIFJ1bnRpbWVMaWJyYXJ5PSIxIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOFNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIiBPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIgR2VuZXJhdGVQcmVwcm9jZXNzZWRGaWxlPSIwIiBSdW50aW1lTGlicmFyeT0iMSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4TVRfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIiBPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIiBHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiIFJ1bnRpbWVMaWJyYXJ5PSIxIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhNVF9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiIE91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7Tk9fRVJSTk9fSCIgR2VuZXJhdGVQcmVwcm9jZXNzZWRGaWxlPSIwIiBSdW50aW1lTGlicmFyeT0iMSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4TVRfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgVGFyZ2V0RW52aXJvbm1lbnQ9IjEiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgRXhlY3V0aW9uQnVja2V0PSI3IiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIiBHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiIFJ1bnRpbWVMaWJyYXJ5PSIxIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjhNVF9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NvZGVTaWduVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8RGVwbG95bWVudFRvb2wgRm9yY2VEaXJ0eT0iLTEiIFJlbW90ZURpcmVjdG9yeT0iIiBSZWdpc3Rlck91dHB1dD0iMCIgQWRkaXRpb25hbEZpbGVzPSIiIC8+DQotICAgICAgPERlYnVnZ2VyVG9vbCAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIiBPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiBUYXJnZXRFbnZpcm9ubWVudD0iMSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBFeGVjdXRpb25CdWNrZXQ9IjciIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiIEdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCIgUnVudGltZUxpYnJhcnk9IjEiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOE1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ29kZVNpZ25Ub29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxEZXBsb3ltZW50VG9vbCBGb3JjZURpcnR5PSItMSIgUmVtb3RlRGlyZWN0b3J5PSIiIFJlZ2lzdGVyT3V0cHV0PSIwIiBBZGRpdGlvbmFsRmlsZXM9IiIgLz4NCi0gICAgICA8RGVidWdnZXJUb29sIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSIgT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIFRhcmdldEVudmlyb25tZW50PSIxIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIEV4ZWN1dGlvbkJ1Y2tldD0iNyIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIgR2VuZXJhdGVQcmVwcm9jZXNzZWRGaWxlPSIwIiBSdW50aW1lTGlicmFyeT0iMSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4TVRfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDb2RlU2lnblRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPERlcGxveW1lbnRUb29sIEZvcmNlRGlydHk9Ii0xIiBSZW1vdGVEaXJlY3Rvcnk9IiIgUmVnaXN0ZXJPdXRwdXQ9IjAiIEFkZGl0aW9uYWxGaWxlcz0iIiAvPg0KLSAgICAgIDxEZWJ1Z2dlclRvb2wgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiIE91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWSIgU3RyaW5nUG9vbGluZz0idHJ1ZSIgUnVudGltZUxpYnJhcnk9IjAiIEVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4TVQubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiIE91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210IiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIiBHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgUnVudGltZUxpYnJhcnk9IjEiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI4TVRfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gIDwvQ29uZmlndXJhdGlvbnM+DQotICA8UmVmZXJlbmNlcz4NCi0gIDwvUmVmZXJlbmNlcz4NCi0gIDxGaWxlcz4NCi0gICAgPEZpbHRlciBOYW1lPSJTb3VyY2UgRmlsZXMiIEZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYXV0b2ZpdFxhdXRvZml0LmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiZGZcYmRmLmMiPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcY2ZmXGNmZi5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJhc2UuYyI+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiaXRtYXAuYyI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGNhY2hlXGZ0Y2FjaGUuYyI+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cZnRkZWJ1Zy5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRnYXNwLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2x5cGguYyI+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xnemlwXGZ0Z3ppcC5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRpbml0LmMiPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcbHp3XGZ0bHp3LmMiPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN0cm9rZS5jIj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN5c3RlbS5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHNtb290aFxzbW9vdGguYyI+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsdGVyIE5hbWU9IkZUX01PRFVMRVMiPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJib3guYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0YmRmLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGNpZC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmbnRmbXQuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z3h2YWwuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0bGNkZmlsLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdG1tLmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRvdHZhbC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRwYXRlbnQuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0cGZyLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN5bnRoLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHR5cGUxLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHdpbmZudC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBjZlxwY2YuYyI+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccGZyXHBmci5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc2F1eFxwc2F1eC5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc2hpbnRlclxwc2hpbnRlci5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc25hbWVzXHBzbW9kdWxlLmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHJhc3RlclxyYXN0ZXIuYyI+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcc2ZudFxzZm50LmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHRydWV0eXBlXHRydWV0eXBlLmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHR5cGUxXHR5cGUxLmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGNpZFx0eXBlMWNpZC5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0eXBlNDJcdHlwZTQyLmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHdpbmZvbnRzXHdpbmZudC5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgPC9GaWx0ZXI+DQotICAgIDwvRmlsdGVyPg0KLSAgICA8RmlsdGVyIE5hbWU9IkhlYWRlciBGaWxlcyIgRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIj4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnQyYnVpbGQuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRjb25maWcuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRoZWFkZXIuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRtb2R1bGUuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRvcHRpb24uaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRzdGRsaWIuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICA8L0ZpbHRlcj4NCi0gIDwvRmlsZXM+DQotICA8R2xvYmFscz4NCi0gIDwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sIGIvYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2I1MmJjLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTxodG1sPgotPGhlYWRlcj4KLTx0aXRsZT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZTLk5FVCZuYnNwOzIwMDUKLSAgKFBvY2tldCBQQykKLTwvdGl0bGU+Ci0KLTxib2R5PgotPGgxPgotICBGcmVlVHlwZSZuYnNwOzIgUHJvamVjdCBGaWxlcyBmb3IgVlMuTkVUJm5ic3A7MjAwNQotICAoUG9ja2V0IFBDKQotPC9oMT4KLQotPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyBmb3IgVmlzdWFsIEMrKywgbmFtZWQKLTx0dD5mcmVldHlwZS52Y3Byb2o8L3R0PiwgYW5kIFZpc3VhbCBTdHVkaW8sIGNhbGxlZCA8dHQ+ZnJlZXR5cGUuc2xuPC90dD4gZm9yCi10aGUgZm9sbG93aW5nIHRhcmdldHM6Ci0KLTx1bD4KLSAgPGxpPlBQQy9TUCAyMDAzIChQb2NrZXQgUEMgMjAwMyk8L2xpPgotICA8bGk+UFBDL1NQIFdNNSAoV2luZG93cyBNb2JpbGUgNSk8L2xpPgotICA8bGk+UFBDL1NQIFdNNiAoV2luZG93cyBNb2JpbGUgNik8L2xpPgotPC91bD4KLQotSXQgY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi44IHNvdXJjZXM6PC9wPgotCi08dWw+Ci0gIDxwcmU+Ci0gICAgZnJlZXR5cGUyOC5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOF9ELmxpYiAgIC0gZGVidWcgYnVpbGQ7ICAgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOE1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI4TVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgotPC91bD4KLQotPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCi1hcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKLXlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKLXRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgotZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgotdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKLWFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KLQotPHA+QnVpbGQgZGlyZWN0b3JpZXMgYXJlIHBsYWNlZCBpbiB0aGUgdG9wLWxldmVsIDx0dD5vYmpzPC90dD4KLWRpcmVjdG9yeS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUuc2xuIGIvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS5zbG4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTE0MzIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS5zbG4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDANCi0jIFZpc3VhbCBTdHVkaW8gMjAwOA0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZnJlZXR5cGUiLCAiZnJlZXR5cGUudmNwcm9qIiwgIns3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9Ig0KLUVuZFByb2plY3QNCi1HbG9iYWwNCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCi0JCUxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpDQotCQlMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSA9IExJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQlMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSA9IExJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQlMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCUxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSA9IExJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkgPSBMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQlMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCUxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQlMSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQlMSUIgRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSA9IExJQiBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpDQotCQlMSUIgRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkgPSBMSUIgRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCUxJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSA9IExJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSA9IExJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCUxJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQlMSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkgPSBMSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCUxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSA9IExJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSA9IExJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCUxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkgPSBMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSA9IExJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSA9IExJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCUxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpID0gTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCUxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCUxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpID0gTElCIFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJTElCIFJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkgPSBMSUIgUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkgPSBMSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQlMSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkgPSBMSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCUxJQiBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpID0gTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQnVpbGQuMCA9IFJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkNCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQotCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLUVuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qIGIvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2FhNTMuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdA0KLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCi0JVmVyc2lvbj0iOSwwMCINCi0JTmFtZT0iZnJlZXR5cGUiDQotCVByb2plY3RHVUlEPSJ7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfSINCi0JVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMCINCi0JPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCS8+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCS8+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCS8+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkvPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJLz4NCi0JCTxQbGF0Zm9ybQ0KLQkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxUb29sRmlsZXM+DQotCTwvVG9vbEZpbGVzPg0KLQk8Q29uZmlndXJhdGlvbnM+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJTbWFydHBob25lIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giDQotCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOE1ULmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJTbWFydHBob25lIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhNVC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4TVQubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giDQotCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOE1ULmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhNVC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4TVQubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJmYWxzZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOFNULmxpYiINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giDQotCQkJCVN0cmluZ1Bvb2xpbmc9ImZhbHNlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4U1QubGliIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCINCi0JCQkJU3RyaW5nUG9vbGluZz0iZmFsc2UiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhTVC5saWIiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJmYWxzZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOFNULmxpYiINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giDQotCQkJCVN0cmluZ1Bvb2xpbmc9ImZhbHNlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4U1QubGliIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCINCi0JCQkJU3RyaW5nUG9vbGluZz0iZmFsc2UiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhTVC5saWIiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMyINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJTbWFydHBob25lIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCINCi0JCQkJUnVudGltZUxpYnJhcnk9IjMiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4X0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtOT19FUlJOT19IIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMyINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO05PX0VSUk5PX0giDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCINCi0JCQkJUnVudGltZUxpYnJhcnk9IjMiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4X0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4U1RfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJTbWFydHBob25lIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7Tk9fRVJSTk9fSCINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOFNUX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4U1RfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KLQkJCQlHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOE1UX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJTbWFydHBob25lIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4TVRfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtOT19FUlJOT19IIg0KLQkJCQlHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOE1UX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI4TVRfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCi0JCQkJR2VuZXJhdGVQcmVwcm9jZXNzZWRGaWxlPSIwIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjhNVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KLQkJCQlHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOE1UX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210Ig0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOE1ULmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOE1UX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQk8L0NvbmZpZ3VyYXRpb25zPg0KLQk8UmVmZXJlbmNlcz4NCi0JPC9SZWZlcmVuY2VzPg0KLQk8RmlsZXM+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCi0JCQk+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYXV0b2ZpdFxhdXRvZml0LmMiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmRmXGJkZi5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjZmZcY2ZmLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJhc2UuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Yml0bWFwLmMiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcY2FjaGVcZnRjYWNoZS5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlxmdGRlYnVnLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2FzcC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRnbHlwaC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xnemlwXGZ0Z3ppcC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0aW5pdC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xsendcZnRsencuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN0cm9rZS5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzeXN0ZW0uYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcc21vb3RoXHNtb290aC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsdGVyDQotCQkJCU5hbWU9IkZUX01PRFVMRVMiDQotCQkJCT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiYm94LmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiZGYuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGNpZC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Zm50Zm10LmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRneHZhbC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0bGNkZmlsLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRtbS5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdG90dmFsLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRwYXRlbnQuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBmci5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3ludGguYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHR5cGUxLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnR3aW5mbnQuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccGNmXHBjZi5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccGZyXHBmci5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccHNhdXhccHNhdXguYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBzaGludGVyXHBzaGludGVyLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc25hbWVzXHBzbW9kdWxlLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xyYXN0ZXJccmFzdGVyLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xzZm50XHNmbnQuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHRydWV0eXBlXHRydWV0eXBlLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0eXBlMVx0eXBlMS5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcY2lkXHR5cGUxY2lkLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0eXBlNDJcdHlwZTQyLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x3aW5mb250c1x3aW5mbnQuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQk8L0ZpbHRlcj4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IkhlYWRlciBGaWxlcyINCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiDQotCQkJPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmdDJidWlsZC5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRjb25maWcuaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0aGVhZGVyLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdG1vZHVsZS5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRvcHRpb24uaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0c3RkbGliLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQk8L0ZpbHRlcj4NCi0JPC9GaWxlcz4NCi0JPEdsb2JhbHM+DQotCTwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sIGIvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzY2ODQzLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTxodG1sPgotPGhlYWRlcj4KLTx0aXRsZT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZTLk5FVCZuYnNwOzIwMDgKLSAgKFBvY2tldCBQQykKLTwvdGl0bGU+Ci0KLTxib2R5PgotPGgxPgotICBGcmVlVHlwZSZuYnNwOzIgUHJvamVjdCBGaWxlcyBmb3IgVlMuTkVUJm5ic3A7MjAwOAotICAoUG9ja2V0IFBDKQotPC9oMT4KLQotPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyBmb3IgVmlzdWFsIEMrKywgbmFtZWQKLTx0dD5mcmVldHlwZS5kc3A8L3R0PiwgYW5kIFZpc3VhbCBTdHVkaW8sIGNhbGxlZCA8dHQ+ZnJlZXR5cGUuc2xuPC90dD4gZm9yCi10aGUgZm9sbG93aW5nIHRhcmdldHM6Ci0KLTx1bD4KLSAgPGxpPlBQQy9TUCAyMDAzIChQb2NrZXQgUEMgMjAwMyk8L2xpPgotICA8bGk+UFBDL1NQIFdNNSAoV2luZG93cyBNb2JpbGUgNSk8L2xpPgotICA8bGk+UFBDL1NQIFdNNiAoV2luZG93cyBNb2JpbGUgNik8L2xpPgotPC91bD4KLQotSXQgY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi44IHNvdXJjZXM6PC9wPgotCi08dWw+Ci0gIDxwcmU+Ci0gICAgZnJlZXR5cGUyOC5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOF9ELmxpYiAgIC0gZGVidWcgYnVpbGQ7ICAgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOE1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI4TVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgotPC91bD4KLQotPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCi1hcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKLXlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKLXRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgotZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgotdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKLWFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KLQotPHA+QnVpbGQgZGlyZWN0b3JpZXMgYXJlIHBsYWNlZCBpbiB0aGUgdG9wLWxldmVsIDx0dD5vYmpzPC90dD4KLWRpcmVjdG9yeS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzLy5naXRpZ25vcmUgYi9idWlsZHMvd2luZG93cy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQ1NmE0Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgdXNlci1zcGVjaWZpYyBjYWNoZS9zZXR0aW5ncyBmaWxlcwotKi5vcGVuc2RmCi0qLnNkZgotKi5zdW8KLSoudXNlcgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvZGV0ZWN0Lm1rIGIvYnVpbGRzL3dpbmRvd3MvZGV0ZWN0Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBkMTU2Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL2RldGVjdC5taworKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBmaWxlIHRvIGRldGVjdCBhIFdpbjMyIGhvc3QgcGxhdGZvcm0uCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0uUEhPTlk6IHNldHVwCi0KLQotaWZlcSAoJChQTEFURk9STSksYW5zaSkKLQotICAjIERldGVjdGluZyBXaW5kb3dzIE5UIGlzIGVhc3ksIGFzIHRoZSBPUyB2YXJpYWJsZSBtdXN0IGJlIGRlZmluZWQgYW5kCi0gICMgY29udGFpbnMgYFdpbmRvd3NfTlQnLiAgVGhpcyBhbHNvIHdvcmtzIHdpdGggV2luZG93cyAyMDAwIGFuZCBYUC4KLSAgIwotICBpZmVxICgkKE9TKSxXaW5kb3dzX05UKQotCi0gICAgUExBVEZPUk0gOj0gd2luZG93cwotCi0gIGVsc2UKLQotICAgICMgRGV0ZWN0aW5nIFdpbmRvd3MgOVgKLQotICAgICMgV2UgdXNlZCB0byBydW4gdGhlIGB2ZXInIGNvbW1hbmQgdG8gc2VlIGlmIGl0cyBvdXRwdXQgY29udGFpbnMgdGhlCi0gICAgIyB3b3JkIGBXaW5kb3dzJy4gIElmIHRoaXMgaXMgdHJ1ZSwgd2UgYXJlIHJ1bm5pbmcgV2luZG93cyA5NSBvciBsYXRlcjoKLSAgICAjCi0gICAgIyAgIGlmZGVmIENPTVNQRUMKLSAgICAjICAgICAjIEZpcnN0LCBjaGVjayBpZiB3ZSBoYXZlIHRoZSBDT01TUEVDIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aGljaAotICAgICMgICAgICMgaW5kaWNhdGVzIHdlIGNhbiB1c2UgQ09NTUFORC5DT00ncyBpbnRlcm5hbCBjb21tYW5kcwotICAgICMgICAgIGlzX3dpbmRvd3MgOj0gJChmaW5kc3RyaW5nIFdpbmRvd3MsJChzdHJpcCAkKHNoZWxsIHZlcikpKQotICAgICMgICBlbmRpZgotICAgICMKLSAgICAjIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBkZXRlY3RzIHRoZSBjYXNlIHdoZW4gb25lIGlzIHJ1bm5pbmcKLSAgICAjIERPUyA3LnggKHRoZSBNUy1ET1MgdmVyc2lvbiB0aGF0IGxpZXMgYmVsb3cgV2luZG93cykgd2l0aG91dCBhY3R1YWxseQotICAgICMgbGF1bmNoaW5nIHRoZSBHVUkuCi0gICAgIwotICAgICMgQSBiZXR0ZXIgdGVzdCBpcyB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBib3RoIHRoZSBlbnZpcm9ubWVudAotICAgICMgdmFyaWFibGVzIGB3aW5ib290ZGlyJyBhbmQgYHdpbmRpcicuICBUaGUgZmlyc3QgaW5kaWNhdGVzIGFuCi0gICAgIyB1bmRlcmx5aW5nIERPUyA3LngsIHdoaWxlIHRoZSBzZWNvbmQgaXMgc2V0IG9ubHkgaWYgd2luZG93cyBpcwotICAgICMgYXZhaWxhYmxlLgotICAgICMKLSAgICAjIE5vdGUgdGhhdCBvbiBXaW5kb3dzIE5ULCBzdWNoIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdpbGwgbm90IGJlIHNlZW4KLSAgICAjIGZyb20gRE9TLWJhc2VkIHRvb2xzIGxpa2UgREpHUFAncyBtYWtlOyB0aGlzIGlzIG5vdCBhY3R1YWxseSBhIHByb2JsZW0KLSAgICAjIHNpbmNlIE5UIGlzIGRldGVjdGVkIGluZGVwZW5kZW50bHkgYWJvdmUuICBCdXQgZG8gbm90IHRyeSB0byBiZSBjbGV2ZXIhCi0gICAgIwotICAgIGlmZGVmIHdpbmJvb3RkaXIKLSAgICAgIGlmZGVmIHdpbmRpcgotCi0gICAgICAgIFBMQVRGT1JNIDo9IHdpbmRvd3MKLQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotCi0gIGVuZGlmICAjIHRlc3QgTlQKLQotZW5kaWYgIyB0ZXN0IFBMQVRGT1JNIGFuc2kKLQotaWZlcSAoJChQTEFURk9STSksd2luZG93cykKLQotICBERUxFVEUgOj0gZGVsCi0gIENBVCAgICA6PSB0eXBlCi0gIFNFUCAgICA6PSAkKEJBQ0tTTEFTSCkKLQotICAjIFNldHRpbmcgQ09QWSBpcyBhIGJpdCB0cmlja2llci4gIFBsYWluIENPUFkgb24gTlQgd2lsbCBub3Qgd29yawotICAjIGNvcnJlY3RseSwgYmVjYXVzZSBpdCB3aWxsIHVwcGVyY2FzZSA4LjMgZmlsZW5hbWVzLCBjcmVhdGluZyBhCi0gICMgYENPTkZJRy5NSycgZmlsZSB3aGljaCBpc24ndCBmb3VuZCBsYXRlciBvbiBieSBgbWFrZScuCi0gICMgU2luY2Ugd2UgZG8gbm90IHdhbnQgdGhhdCwgd2UgbmVlZCB0byBmb3JjZSBleGVjdXRpb24gb2YgQ01ELkVYRS4KLSAgIyBVbmZvcnR1bmF0ZWx5LCBDTUQuRVhFIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyA5WC4KLSAgIyBTbyB3ZSBuZWVkIHRvIGhhY2suCi0gICMKLSAgIyBLdWRvcyB0byBFbGkgWmFyZXRza2lpIChESkdQUCBndXJ1KSB0aGF0IGhlbHBlZCBkZWJ1ZyBpdC4KLSAgIyBEZXRhaWxzIGFyZSBhdmFpbGFibGUgaW4gdGhyZWFkcyBvZiB0aGUgZnJlZXR5cGUgbWFpbGluZyBsaXN0Ci0gICMgKDIwMDQtMTEtMTEpLCBhbmQgdGhlbiBpbiB0aGUgZGV2ZWwgbWFpbGluZyBsaXN0ICgyMDA0LTExLTIwIHRvIC0yMykuCi0gICMKLSAgaWZlcSAoJChPUyksV2luZG93c19OVCkKLSAgICBDT1BZIDo9IGNtZC5leGUgL2MgY29weQotICBlbHNlCi0gICAgQ09QWSA6PSBjb3B5Ci0gIGVuZGlmICAjIHRlc3QgTlQKLQotCi0gICMgZ2NjIE1ha2VmaWxlIGJ5IGRlZmF1bHQKLSAgQ09ORklHX0ZJTEUgOj0gdzMyLWdjYy5tawotICBpZmVxICgkKGZpcnN0d29yZCAkKENDKSksY2MpCi0gICAgQ0MgICAgICAgIDo9IGdjYwotICBlbmRpZgotCi0gIGlmbmVxICgkKGZpbmRzdHJpbmcgbGlzdCwkKE1BS0VDTURHT0FMUykpLCkgICMgdGVzdCBmb3IgdGhlICJsaXN0IiB0YXJnZXQKLSAgICBkdW1wX3RhcmdldF9saXN0OgotCSAgICBAZWNobyD/Ci0JICAgIEBlY2hvICQoUFJPSkVDVF9USVRMRSkgYnVpbGQgc3lzdGVtIC0tIHN1cHBvcnRlZCBjb21waWxlcnMKLQkgICAgQGVjaG8g/wotCSAgICBAZWNobyBTZXZlcmFsIGNvbW1hbmQtbGluZSBjb21waWxlcnMgYXJlIHN1cHBvcnRlZCBvbiBXaW4zMjoKLQkgICAgQGVjaG8g/wotCSAgICBAZWNobyD//21ha2Ugc2V0dXD///////////////////////////9nY2MgKHdpdGggTWluZ3cpCi0JICAgIEBlY2hvIP//bWFrZSBzZXR1cCB2aXN1YWxj/////////////////01pY3Jvc29mdCBWaXN1YWwgQysrCi0JICAgIEBlY2hvIP//bWFrZSBzZXR1cCBiY2MzMv///////////////////0JvcmxhbmQgQy9DKysKLQkgICAgQGVjaG8g//9tYWtlIHNldHVwIGxjY///////////////////////V2luMzItTENDCi0JICAgIEBlY2hvIP//bWFrZSBzZXR1cCBpbnRlbGP//////////////////0ludGVsIEMvQysrCi0JICAgIEBlY2hvIP8KLQotICAgIHNldHVwOiBkdW1wX3RhcmdldF9saXN0Ci0gICAgLlBIT05ZOiBkdW1wX3RhcmdldF9saXN0IGxpc3QKLSAgZWxzZQotICAgIHNldHVwOiBkb3Nfc2V0dXAKLSAgZW5kaWYKLQotICAjIGFkZGl0aW9uYWxseSwgd2UgcHJvdmlkZSBob29rcyBmb3IgdmFyaW91cyBvdGhlciBjb21waWxlcnMKLSAgIwotICBpZm5lcSAoJChmaW5kc3RyaW5nIHZpc3VhbGMsJChNQUtFQ01ER09BTFMpKSwpICAgICAjIFZpc3VhbCBDL0MrKwotICAgIENPTkZJR19GSUxFIDo9IHczMi12Y2MubWsKLSAgICBDQyAgICAgICAgICA6PSBjbAotICAgIHZpc3VhbGM6IHNldHVwCi0gICAgLlBIT05ZOiB2aXN1YWxjCi0gIGVuZGlmCi0KLSAgaWZuZXEgKCQoZmluZHN0cmluZyBpbnRlbGMsJChNQUtFQ01ER09BTFMpKSwpICAgICAgIyBJbnRlbCBDL0MrKwotICAgIENPTkZJR19GSUxFIDo9IHczMi1pbnRsLm1rCi0gICAgQ0MgICAgICAgICAgOj0gY2wKLSAgICB2aXN1YWxjOiBzZXR1cAotICAgIC5QSE9OWTogaW50ZWxjCi0gIGVuZGlmCi0KLSAgaWZuZXEgKCQoZmluZHN0cmluZyB3YXRjb20sJChNQUtFQ01ER09BTFMpKSwpICAgICAgIyBXYXRjb20gQy9DKysKLSAgICBDT05GSUdfRklMRSA6PSB3MzItd2F0Lm1rCi0gICAgQ0MgICAgICAgICAgOj0gd2NjMzg2Ci0gICAgd2F0Y29tOiBzZXR1cAotICAgIC5QSE9OWTogd2F0Y29tCi0gIGVuZGlmCi0KLSAgaWZuZXEgKCQoZmluZHN0cmluZyB2aXN1YWxhZ2UsJChNQUtFQ01ER09BTFMpKSwpICAgIyBWaXN1YWwgQWdlIEMrKwotICAgIENPTkZJR19GSUxFIDo9IHczMi1pY2MubWsKLSAgICBDQyAgICAgICAgICA6PSBpY2MKLSAgICB2aXN1YWxhZ2U6IHNldHVwCi0gICAgLlBIT05ZOiB2aXN1YWxhZ2UKLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIGxjYywkKE1BS0VDTURHT0FMUykpLCkgICAgICAgICAjIExDQy1XaW4zMgotICAgIENPTkZJR19GSUxFIDo9IHczMi1sY2MubWsKLSAgICBDQyAgICAgICAgICA6PSBsY2MKLSAgICBsY2M6IHNldHVwCi0gICAgLlBIT05ZOiBsY2MKLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIG1pbmd3MzIsJChNQUtFQ01ER09BTFMpKSwpICAgICAjIG1pbmd3MzIKLSAgICBDT05GSUdfRklMRSA6PSB3MzItbWluZ3czMi5tawotICAgIENDICAgICAgICAgIDo9IGdjYwotICAgIG1pbmd3MzI6IHNldHVwCi0gICAgLlBIT05ZOiBtaW5ndzMyCi0gIGVuZGlmCi0KLSAgaWZuZXEgKCQoZmluZHN0cmluZyBiY2MzMiwkKE1BS0VDTURHT0FMUykpLCkgICAgICAgIyBCb3JsYW5kIEMrKwotICAgIENPTkZJR19GSUxFIDo9IHczMi1iY2MubWsKLSAgICBDQyAgICAgICAgICA6PSBiY2MzMgotICAgIGJjYzMyOiBzZXR1cAotICAgIC5QSE9OWTogYmNjMzIKLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIGRldmVsLWJjYywkKE1BS0VDTURHT0FMUykpLCkgICAjIGRldmVsb3BtZW50IHRhcmdldAotICAgIENPTkZJR19GSUxFIDo9IHczMi1iY2NkLm1rCi0gICAgQ0MgICAgICAgICAgOj0gYmNjMzIKLSAgICBkZXZlbC1iY2M6IHNldHVwCi0gICAgLlBIT05ZOiBkZXZlbC1iY2MKLSAgZW5kaWYKLQotICBpZm5lcSAoJChmaW5kc3RyaW5nIGRldmVsLWdjYywkKE1BS0VDTURHT0FMUykpLCkgICAjIGRldmVsb3BtZW50IHRhcmdldAotICAgIENPTkZJR19GSUxFIDo9IHczMi1kZXYubWsKLSAgICBDQyAgICAgICAgICA6PSBnY2MKLSAgICBkZXZlbC1nY2M6IHNldHVwCi0gICAgLlBIT05ZOiBkZXZlbC1nY2MKLSAgZW5kaWYKLQotZW5kaWYgICAjIHRlc3QgUExBVEZPUk0gd2luZG93cwotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy9mdGRlYnVnLmMgYi9idWlsZHMvd2luZG93cy9mdGRlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGZjZWEuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvZnRkZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZGVidWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBEZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgY29tcG9uZW50IGZvciBXaW4zMiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZSAqLwotICAvKiBkZWJ1Z2dpbmcgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZS4gIEl0cyBtYWluIHB1cnBvc2UgaXMgaW4gYXNzZXJ0aW9uICAgKi8KLSAgLyogY2hlY2tpbmcsIHRyYWNpbmcsIGFuZCBlcnJvciBkZXRlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgbm93IHRocmVlIGRlYnVnZ2luZyBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gdHJhY2UgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFcnJvciBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIGxvZyBmaWxlICh3aGljaCBjYW4gYmUgdGhlICovCi0gIC8qICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBlcnJvciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9ubHkgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gcmVsZWFzZSBtb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBObyBlcnJvciBtZXNzYWdlIGlzIHNlbnQgb3IgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgaXMgZnJlZSBmcm9tIGFueSAgICovCi0gIC8qICAgZGVidWdnaW5nIHBhcnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9NZXNzYWdlKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgICAuLi4gKQotICB7Ci0gICAgc3RhdGljIGNoYXIgIGJ1Zls4MTkyXTsKLSAgICB2YV9saXN0ICAgICAgYXA7Ci0KLQotICAgIHZhX3N0YXJ0KCBhcCwgZm10ICk7Ci0gICAgdnByaW50ZiggZm10LCBhcCApOwotICAgIC8qIHNlbmQgdGhlIHN0cmluZyB0byB0aGUgZGVidWdnZXIgYXMgd2VsbCAqLwotICAgIHZzcHJpbnRmKCBidWYsIGZtdCwgYXAgKTsKLSAgICBPdXRwdXREZWJ1Z1N0cmluZ0EoIGJ1ZiApOwotICAgIHZhX2VuZCggYXAgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1BhbmljKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgLi4uICkKLSAgewotICAgIHN0YXRpYyBjaGFyICBidWZbODE5Ml07Ci0gICAgdmFfbGlzdCAgICAgIGFwOwotCi0KLSAgICB2YV9zdGFydCggYXAsIGZtdCApOwotICAgIHZzcHJpbnRmKCBidWYsIGZtdCwgYXAgKTsKLSAgICBPdXRwdXREZWJ1Z1N0cmluZ0EoIGJ1ZiApOwotICAgIHZhX2VuZCggYXAgKTsKLQotICAgIGV4aXQoIEVYSVRfRkFJTFVSRSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBpbnQgKQotICBGVF9UaHJvdyggRlRfRXJyb3IgICAgIGVycm9yLAotICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0gICAgRlRfVU5VU0VEKCBsaW5lICk7Ci0gICAgRlRfVU5VU0VEKCBmaWxlICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0KLSAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBpbml0aWFsaXplZCB0byAwICovCi0gIGludCAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2NvdW50XTsKLQotICAvKiBkZWZpbmUgYXJyYXkgb2YgdHJhY2UgdG9nZ2xlIG5hbWVzICovCi0jZGVmaW5lIEZUX1RSQUNFX0RFRiggeCApICAjeCAsCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqICBmdF90cmFjZV90b2dnbGVzW3RyYWNlX2NvdW50ICsgMV0gPQotICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICi0gICAgTlVMTAotICB9OwotCi0jdW5kZWYgRlRfVFJBQ0VfREVGCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluaXRpYWxpemUgdGhlIHRyYWNpbmcgc3ViLXN5c3RlbS4gIFRoaXMgaXMgZG9uZSBieSByZXRyaWV2aW5nIHRoZSAgICAqLwotICAvKiB2YWx1ZSBvZiB0aGUgIkZUMl9ERUJVRyIgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJdCBtdXN0IGJlIGEgbGlzdCBvZiAgKi8KLSAgLyogdG9nZ2xlcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywgYDsnIG9yIGAsJy4gIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAiYW55OjMgbWVtb3J5OjYgc3RyZWFtOjUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgd2lsbCByZXF1ZXN0IHRoYXQgYWxsIGxldmVscyBiZSBzZXQgdG8gMywgZXhjZXB0IHRoZSB0cmFjZSBsZXZlbCAqLwotICAvKiBmb3IgdGhlIG1lbW9yeSBhbmQgc3RyZWFtIGNvbXBvbmVudHMgd2hpY2ggYXJlIHNldCB0byA2IGFuZCA1LCAgICAgICAgKi8KLSAgLyogcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZWUgdGhlIGZpbGUgYGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oJyBmb3IgZGV0YWlscyBvZiB0aGUgKi8KLSAgLyogYXZhaWxhYmxlIHRvZ2dsZSBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbGV2ZWwgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDY7IDAgbWVhbnMgcXVpZXQgKGV4Y2VwdCBmb3Igc2VyaW91cyAgKi8KLSAgLyogcnVudGltZSBlcnJvcnMpLCBhbmQgNiBtZWFucyBfdmVyeV8gdmVyYm9zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X2RlYnVnX2luaXQoIHZvaWQgKQotICB7Ci0gICAgY29uc3QgY2hhciogIGZ0Ml9kZWJ1ZyA9IGdldGVudiggIkZUMl9ERUJVRyIgKTsKLQotCi0gICAgaWYgKCBmdDJfZGVidWcgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqICBwID0gZnQyX2RlYnVnOwotICAgICAgY29uc3QgY2hhciogIHE7Ci0KLQotICAgICAgZm9yICggOyAqcDsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHNlcGFyYXRvcnMgKi8KLSAgICAgICAgaWYgKCAqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnLCcgfHwgKnAgPT0gJzsnIHx8ICpwID09ICc9JyApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogcmVhZCB0b2dnbGUgbmFtZSwgZm9sbG93ZWQgYnkgJzonICovCi0gICAgICAgIHEgPSBwOwotICAgICAgICB3aGlsZSAoICpwICYmICpwICE9ICc6JyApCi0gICAgICAgICAgcCsrOwotCi0gICAgICAgIGlmICggISpwICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoICpwID09ICc6JyAmJiBwID4gcSApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgIG4sIGksIGxlbiA9IChpbnQpKCBwIC0gcSApOwotICAgICAgICAgIGludCAgbGV2ZWwgPSAtMSwgZm91bmQgPSAtMTsKLQotCi0gICAgICAgICAgZm9yICggbiA9IDA7IG4gPCB0cmFjZV9jb3VudDsgbisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiAgdG9nZ2xlID0gZnRfdHJhY2VfdG9nZ2xlc1tuXTsKLQotCi0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCB0b2dnbGVbaV0gIT0gcVtpXSApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggaSA9PSBsZW4gJiYgdG9nZ2xlW2ldID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmb3VuZCA9IG47Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHJlYWQgbGV2ZWwgKi8KLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgaWYgKCAqcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbGV2ZWwgPSAqcCAtICcwJzsKLSAgICAgICAgICAgIGlmICggbGV2ZWwgPCAwIHx8IGxldmVsID4gNyApCi0gICAgICAgICAgICAgIGxldmVsID0gLTE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBmb3VuZCA+PSAwICYmIGxldmVsID49IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZm91bmQgPT0gdHJhY2VfYW55ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciAiYW55IiAqLwotICAgICAgICAgICAgICBmb3IgKCBuID0gMDsgbiA8IHRyYWNlX2NvdW50OyBuKysgKQotICAgICAgICAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1tuXSA9IGxldmVsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNbZm91bmRdID0gbGV2ZWw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotI2Vsc2UgIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKLSAgewotICAgIC8qIG5vdGhpbmcgKi8KLSAgfQotCi0KLSNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUuc2xuIGIvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnNsbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMzQ1ZC4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUuc2xuCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMA0KLSMgVmlzdWFsIFN0dWRpbyAyMDA1DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJmcmVldHlwZSIsICJmcmVldHlwZS52Y3Byb2oiLCAiezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0iDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KLQkJTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQlMSUIgRGVidWd8V2luMzIgPSBMSUIgRGVidWd8V2luMzINCi0JCUxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIgPSBMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQlMSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQlMSUIgUmVsZWFzZXxXaW4zMiA9IExJQiBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMi5CdWlsZC4wID0gRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCi0JCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiBiL2J1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZTY3ZDUuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdCBQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIgVmVyc2lvbj0iOC4wMCIgTmFtZT0iZnJlZXR5cGUiIFByb2plY3RHVUlEPSJ7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfSIgVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIj4NCi0gIDxQbGF0Zm9ybXM+DQotICAgIDxQbGF0Zm9ybSBOYW1lPSJXaW4zMiIgLz4NCi0gIDwvUGxhdGZvcm1zPg0KLSAgPFRvb2xGaWxlcz4NCi0gIDwvVG9vbEZpbGVzPg0KLSAgPENvbmZpZ3VyYXRpb25zPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIiBPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlkiIFN0cmluZ1Bvb2xpbmc9InRydWUiIFJ1bnRpbWVMaWJyYXJ5PSIyIiBFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDVcZnJlZXR5cGUyOC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIiBPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210IiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210IiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlkiIFN0cmluZ1Bvb2xpbmc9InRydWUiIFJ1bnRpbWVMaWJyYXJ5PSIwIiBFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDVcZnJlZXR5cGUyOE1ULmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIiBPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0IiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0IiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlkiIFN0cmluZ1Bvb2xpbmc9InRydWUiIFJ1bnRpbWVMaWJyYXJ5PSIwIiBFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDVcZnJlZXR5cGUyOFNULmxpYiIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiIE91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1ZyIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgUnVudGltZUxpYnJhcnk9IjMiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbjMyXHZjMjAwNVxmcmVldHlwZTI4X0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIiBPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdCIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIFJ1bnRpbWVMaWJyYXJ5PSIxIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDVcZnJlZXR5cGUyOFNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiIE91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210IiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIiBHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgUnVudGltZUxpYnJhcnk9IjEiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbjMyXHZjMjAwNVxmcmVldHlwZTI4TVRfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gIDwvQ29uZmlndXJhdGlvbnM+DQotICA8UmVmZXJlbmNlcz4NCi0gIDwvUmVmZXJlbmNlcz4NCi0gIDxGaWxlcz4NCi0gICAgPEZpbHRlciBOYW1lPSJTb3VyY2UgRmlsZXMiIEZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYXV0b2ZpdFxhdXRvZml0LmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiZGZcYmRmLmMiPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcY2ZmXGNmZi5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiYXNlLmMiPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJpdG1hcC5jIj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcY2FjaGVcZnRjYWNoZS5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cZnRkZWJ1Zy5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRnYXNwLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2x5cGguYyI+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xnemlwXGZ0Z3ppcC5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRpbml0LmMiPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcbHp3XGZ0bHp3LmMiPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN0cm9rZS5jIj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN5c3RlbS5jIj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHNtb290aFxzbW9vdGguYyI+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsdGVyIE5hbWU9IkZUX01PRFVMRVMiPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJib3guYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Zm50Zm10LmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdG1tLmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRwZnIuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3ludGguYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dHlwZTEuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0d2luZm50LmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGxjZGZpbC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRneHZhbC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRvdHZhbC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRwYXRlbnQuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwY2ZccGNmLmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBmclxwZnIuYyI+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccHNhdXhccHNhdXguYyI+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccHNoaW50ZXJccHNoaW50ZXIuYyI+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccHNuYW1lc1xwc21vZHVsZS5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xyYXN0ZXJccmFzdGVyLmMiPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHNmbnRcc2ZudC5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0cnVldHlwZVx0cnVldHlwZS5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0eXBlMVx0eXBlMS5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjaWRcdHlwZTFjaWQuYyI+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcdHlwZTQyXHR5cGU0Mi5jIj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x3aW5mb250c1x3aW5mbnQuYyI+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiI+DQotICAgICAgICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgLz4NCi0gICAgICAgICAgPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uIE5hbWU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8RmlsZUNvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgICAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMCIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIiBCYXNpY1J1bnRpbWVDaGVja3M9IjMiIC8+DQotICAgICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxGaWxlQ29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiAvPg0KLSAgICAgICAgICA8L0ZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgIDwvRmlsdGVyPg0KLSAgICA8L0ZpbHRlcj4NCi0gICAgPEZpbHRlciBOYW1lPSJIZWFkZXIgRmlsZXMiIEZpbHRlcj0iaDtocHA7aHh4O2htO2lubCI+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZ0MmJ1aWxkLmgiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0Y29uZmlnLmgiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0aGVhZGVyLmgiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0bW9kdWxlLmgiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0b3B0aW9uLmgiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0c3RkbGliLmgiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgPC9GaWx0ZXI+DQotICA8L0ZpbGVzPg0KLSAgPEdsb2JhbHM+DQotICA8L0dsb2JhbHM+DQotPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sIGIvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDliNzUuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08aHRtbD4KLTxoZWFkZXI+Ci08dGl0bGU+Ci0gIEZyZWVUeXBlJm5ic3A7MiBQcm9qZWN0IEZpbGVzIGZvciBWUy5ORVQmbmJzcDsyMDA1Ci08L3RpdGxlPgotCi08Ym9keT4KLTxoMT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZTLk5FVCZuYnNwOzIwMDUKLTwvaDE+Ci0KLTxwPlRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHByb2plY3QgZmlsZXMgZm9yIFZpc3VhbCBDKyssIG5hbWVkCi08dHQ+ZnJlZXR5cGUudmNwcm9qPC90dD4sIGFuZCBWaXN1YWwgU3R1ZGlvLCBjYWxsZWQgPHR0PmZyZWV0eXBlLnNsbjwvdHQ+LiAgSXQKLWNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGZyb20gdGhlIEZyZWVUeXBlIDIuOCBzb3VyY2VzOjwvcD4KLQotPHVsPgotICA8cHJlPgotICAgIGZyZWV0eXBlMjgubGliICAgICAtIHJlbGVhc2UgYnVpbGQ7IHNpbmdsZSB0aHJlYWRlZAotICAgIGZyZWV0eXBlMjhfRC5saWIgICAtIGRlYnVnIGJ1aWxkOyAgIHNpbmdsZSB0aHJlYWRlZAotICAgIGZyZWV0eXBlMjhNVC5saWIgICAtIHJlbGVhc2UgYnVpbGQ7IG11bHRpLXRocmVhZGVkCi0gICAgZnJlZXR5cGUyOE1UX0QubGliIC0gZGVidWcgYnVpbGQ7ICAgbXVsdGktdGhyZWFkZWQ8L3ByZT4KLTwvdWw+Ci0KLTxwPkJlIHN1cmUgdG8gZXh0cmFjdCB0aGUgZmlsZXMgd2l0aCB0aGUgV2luZG93cyAoQ1IrTEYpIGxpbmUgZW5kaW5ncy4gIFpJUAotYXJjaGl2ZXMgYXJlIGFscmVhZHkgc3RvcmVkIHRoaXMgd2F5LCBzbyBubyBmdXJ0aGVyIGFjdGlvbiBpcyByZXF1aXJlZC4gIElmCi15b3UgdXNlIHNvbWUgPHR0Pi50YXIuKno8L3R0PiBhcmNoaXZlcywgYmUgc3VyZSB0byBjb25maWd1cmUgeW91ciBleHRyYWN0aW5nCi10b29sIHRvIGNvbnZlcnQgdGhlIGxpbmUgZW5kaW5ncy4gIEZvciBleGFtcGxlLCB3aXRoIDxhCi1ocmVmPSJodHRwOi8vd3d3LndpbnppcC5jb20iPldpblppcDwvYT4sIHlvdSBzaG91bGQgYWN0aXZhdGUgdGhlIDxlbT5UQVIKLWZpbGUgc21hcnQgQ1IvTEYgQ29udmVyc2lvbjwvZW0+IG9wdGlvbi4gIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgY29uc2lkZXIKLXVzaW5nIHRoZSA8dHQ+dW5peDJkb3M8L3R0PiBvciA8dHQ+dTJkPC90dD4gdXRpbGl0aWVzIHRoYXQgYXJlIGZsb2F0aW5nCi1hcm91bmQsIHdoaWNoIHNwZWNpZmljYWxseSBkZWFsIHdpdGggdGhpcyBwYXJ0aWN1bGFyIHByb2JsZW0uCi0KLTxwPkJ1aWxkIGRpcmVjdG9yaWVzIGFyZSBwbGFjZWQgaW4gdGhlIHRvcC1sZXZlbCA8dHQ+b2JqczwvdHQ+Ci1kaXJlY3RvcnkuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92YzIwMDgvZnJlZXR5cGUuc2xuIGIvYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnNsbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1MjJmOS4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92YzIwMDgvZnJlZXR5cGUuc2xuCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDANCi0jIFZpc3VhbCBTdHVkaW8gMjAwOA0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZnJlZXR5cGUiLCAiZnJlZXR5cGUudmNwcm9qIiwgIns3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9Ig0KLUVuZFByb2plY3QNCi1HbG9iYWwNCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCi0JCUxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyID0gTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCUxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiA9IExJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJTElCIERlYnVnfFdpbjMyID0gTElCIERlYnVnfFdpbjMyDQotCQlMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyID0gTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIgPSBMSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJTElCIFJlbGVhc2V8V2luMzIgPSBMSUIgUmVsZWFzZXxXaW4zMg0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMi5CdWlsZC4wID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQotCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLUVuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2ogYi9idWlsZHMvd2luZG93cy92YzIwMDgvZnJlZXR5cGUudmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJjNjcyLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwyMTgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KLTxWaXN1YWxTdHVkaW9Qcm9qZWN0DQotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI5LDAwIg0KLQlOYW1lPSJmcmVldHlwZSINCi0JUHJvamVjdEdVSUQ9Ins3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9Ig0KLQlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQotCT4NCi0JPFBsYXRmb3Jtcz4NCi0JCTxQbGF0Zm9ybQ0KLQkJCU5hbWU9IldpbjMyIg0KLQkJLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxUb29sRmlsZXM+DQotCTwvVG9vbEZpbGVzPg0KLQk8Q29uZmlndXJhdGlvbnM+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjIiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA4XGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210Ig0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA4XGZyZWV0eXBlMjhNVC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0Ig0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA4XGZyZWV0eXBlMjhTVC5saWIiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1ZyINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1ZyINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMyINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDhcZnJlZXR5cGUyOF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA4XGZyZWV0eXBlMjhTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDhcZnJlZXR5cGUyOE1UX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQk8L0NvbmZpZ3VyYXRpb25zPg0KLQk8UmVmZXJlbmNlcz4NCi0JPC9SZWZlcmVuY2VzPg0KLQk8RmlsZXM+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCi0JCQk+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYXV0b2ZpdFxhdXRvZml0LmMiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmRmXGJkZi5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjZmZcY2ZmLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiYXNlLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiaXRtYXAuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjYWNoZVxmdGNhY2hlLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnRkZWJ1Zy5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0ZnN0eXBlLmMiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGdhc3AuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2x5cGguYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcZ3ppcFxmdGd6aXAuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGluaXQuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcbHp3XGZ0bHp3LmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzdHJva2UuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3lzdGVtLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHNtb290aFxzbW9vdGguYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbHRlcg0KLQkJCQlOYW1lPSJGVF9NT0RVTEVTIg0KLQkJCQk+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0YmJveC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Zm50Zm10LmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRtbS5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBmci5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3ludGguYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHR5cGUxLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnR3aW5mbnQuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGxjZGZpbC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z3h2YWwuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdG90dmFsLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRwYXRlbnQuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccGNmXHBjZi5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccGZyXHBmci5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccHNhdXhccHNhdXguYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBzaGludGVyXHBzaGludGVyLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc25hbWVzXHBzbW9kdWxlLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xyYXN0ZXJccmFzdGVyLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xzZm50XHNmbnQuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHRydWV0eXBlXHRydWV0eXBlLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0eXBlMVx0eXBlMS5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcY2lkXHR5cGUxY2lkLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0eXBlNDJcdHlwZTQyLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x3aW5mb250c1x3aW5mbnQuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQk8L0ZpbHRlcj4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IkhlYWRlciBGaWxlcyINCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiDQotCQkJPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmdDJidWlsZC5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRjb25maWcuaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0aGVhZGVyLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdG1vZHVsZS5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRvcHRpb24uaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0c3RkbGliLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQk8L0ZpbHRlcj4NCi0JPC9GaWxlcz4NCi0JPEdsb2JhbHM+DQotCTwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwgYi9idWlsZHMvd2luZG93cy92YzIwMDgvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1OTA5ZC4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92YzIwMDgvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTxodG1sPgotPGhlYWRlcj4KLTx0aXRsZT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZTLk5FVCZuYnNwOzIwMDgKLTwvdGl0bGU+Ci0KLTxib2R5PgotPGgxPgotICBGcmVlVHlwZSZuYnNwOzIgUHJvamVjdCBGaWxlcyBmb3IgVlMuTkVUJm5ic3A7MjAwOAotPC9oMT4KLQotPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyBmb3IgVmlzdWFsIEMrKywgbmFtZWQKLTx0dD5mcmVldHlwZS52Y3Byb2o8L3R0PiwgYW5kIFZpc3VhbCBTdHVkaW8sIGNhbGxlZCA8dHQ+ZnJlZXR5cGUuc2xuPC90dD4uICBJdAotY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi44IHNvdXJjZXM6PC9wPgotCi08dWw+Ci0gIDxwcmU+Ci0gICAgZnJlZXR5cGUyOC5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOF9ELmxpYiAgIC0gZGVidWcgYnVpbGQ7ICAgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOE1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI4TVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgotPC91bD4KLQotPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCi1hcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKLXlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKLXRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgotZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgotdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKLWFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KLQotPHA+QnVpbGQgZGlyZWN0b3JpZXMgYXJlIHBsYWNlZCBpbiB0aGUgdG9wLWxldmVsIDx0dD5vYmpzPC90dD4KLWRpcmVjdG9yeS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS5zbG4gYi9idWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUuc2xuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjA5ZWRkLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS5zbG4KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMA0KLSMgVmlzdWFsIFN0dWRpbyBFeHByZXNzIDIwMTIgZm9yIFdpbmRvd3MgRGVza3RvcA0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZnJlZXR5cGUiLCAiZnJlZXR5cGUudmN4cHJvaiIsICJ7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfSINCi1FbmRQcm9qZWN0DQotR2xvYmFsDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQotCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyDQotCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQNCi0JCURlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQlEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCA9IERlYnVnIE11bHRpdGhyZWFkZWR8eDY0DQotCQlEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQlEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQNCi0JCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyDQotCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0DQotCQlSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCVJlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0DQotCQlSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NA0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NC5BY3RpdmVDZmcgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NA0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQuQnVpbGQuMCA9IERlYnVnIE11bHRpdGhyZWFkZWR8eDY0DQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQuQWN0aXZlQ2ZnID0gRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0DQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfHg2NA0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0DQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0DQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0DQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NC5CdWlsZC4wID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KLQkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQotCUVuZEdsb2JhbFNlY3Rpb24NCi1FbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudXNlci5wcm9wcyBiL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS51c2VyLnByb3BzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRkZDVkLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS51c2VyLnByb3BzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICogZnJlZXR5cGUudXNlci5wcm9wcw0KLSAqDQotICoNCi0gKiBZb3UgY2FuIHNwZWNpZnkgY3VzdG9tIG9wdGlvbnMgaGVyZSB3aXRob3V0IGFsdGVyaW5nIHRoZSBwcm9qZWN0IGZpbGUuDQotICoNCi0gKiBNdWx0aXBsZSBlbnRyaWVzIHdpdGhpbiBlYWNoIHByb3BlcnR5IGFyZSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAoOykuDQotICoNCi0gKiBOT1RFOiBJZiB5b3Ugd2FudCB0byBsaW5rIGFnYWluc3QgemxpYiwgbGlicG5nLCBiemlwMiBvciBoYXJmYnV6eiwgeW91DQotICogICAgICAgc2hvdWxkIGFsdGVyIHRoZXNlIHZhbHVlcyBhcHByb3ByaWF0ZWx5Lg0KLSAtLT4NCi0NCi08UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCi0NCi0gICAgPCEtLQ0KLSAgICAgKiBgOyctc2VwYXJhdGVkIGxpc3Qgb2Ygc3ltYm9scyB0byAjZGVmaW5lDQotICAgICAtLT4NCi0gICAgPFVzZXJEZWZpbmVzPjwvVXNlckRlZmluZXM+DQotDQotICAgIDwhLS0NCi0gICAgICogcGF0aCB3aGVyZSB5b3VyIGN1c3RvbSBgZnRvcHRpb24uaCcgbGl2ZXM7DQotICAgICAqIHRoaXMgaXMgc2VhcmNoZWQgQkVGT1JFIGFueSBvdGhlciBwYXRoDQotICAgICAtLT4NCi0gICAgPCEtLSA8VXNlck9wdGlvbkRpcmVjdG9yeT4uLlwuLlwuLlxkZXZlbDwvVXNlck9wdGlvbkRpcmVjdG9yeT4gLS0+DQotICAgIDxVc2VyT3B0aW9uRGlyZWN0b3J5PjwvVXNlck9wdGlvbkRpcmVjdG9yeT4NCi0NCi0gICAgPCEtLQ0KLSAgICAgKiBgOyctc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aHMgdG8gYWRkaXRpb25hbCBpbmNsdWRlIGRpcmVjdG9yaWVzLA0KLSAgICAgKiBlLmcuLCB3aGVyZSB0byBmaW5kIHpsaWIuaCwgcG5nLmgsIGV0Yy47DQotICAgICAqIHRoaXMgaXMgc2VhcmNoZWQgQUZURVIgYW55IG90aGVyIHBhdGgNCi0gICAgIC0tPg0KLSAgICA8IS0tIDxVc2VySW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uXC4uXHpsaWItMS4yLjg7Li5cLi5cLi5cLi5cbGlicG5nLTEuNi4xMjwvVXNlckluY2x1ZGVEaXJlY3Rvcmllcz4gLS0+DQotICAgIDxVc2VySW5jbHVkZURpcmVjdG9yaWVzPjwvVXNlckluY2x1ZGVEaXJlY3Rvcmllcz4NCi0NCi0gICAgPCEtLQ0KLSAgICAgKiBgOyctc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aHMgdG8gYWRkaXRpb25hbCBsaWJyYXJ5IGRpcmVjdG9yaWVzLA0KLSAgICAgKiBlLmcuLCB3aGVyZSB0byBmaW5kIHpsaWIubGliLCBsaWJwbmcubGliLCBldGMuDQotICAgICAtLT4NCi0gICAgPCEtLSA8VXNlckxpYnJhcnlEaXJlY3Rvcmllcz4uLlwuLlwuLlwuLlx6bGliLTEuMi44Oy4uXC4uXC4uXC4uXGxpYnBuZy0xLjYuMTI8L1VzZXJMaWJyYXJ5RGlyZWN0b3JpZXM+IC0tPg0KLSAgICA8VXNlckxpYnJhcnlEaXJlY3Rvcmllcz48L1VzZXJMaWJyYXJ5RGlyZWN0b3JpZXM+DQotDQotICAgIDwhLS0NCi0gICAgICogYDsnLXNlcGFyYXRlZCBsaXN0IG9mIGFkZGl0aW9uYWwgbGlua2VyIGRlcGVuZGVuY2llcywNCi0gICAgICogZS5nLiwgemxpYi5saWIsIGxpYnBuZy5saWIsIGV0Yy4NCi0gICAgIC0tPg0KLSAgICA8IS0tIDxVc2VyRGVwZW5kZW5jaWVzPnpsaWIubGliO2xpYnBuZzE2LmxpYjwvVXNlckRlcGVuZGVuY2llcz4gLS0+DQotICAgIDxVc2VyRGVwZW5kZW5jaWVzPjwvVXNlckRlcGVuZGVuY2llcz4NCi0NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0NCi0gIDwhLS0NCi0gICAqIEV4YW1wbGUgY29uZmlndXJhdGlvbiBmb3IgeDY0IGRlYnVnIGJ1aWxkIG9ubHkNCi0gICAtLT4NCi0NCi0gIDwhLS0NCi0gICAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IkRlYnVnUHJvcGVydGllcyINCi0gICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCi0gICAgICA8VXNlckRlZmluZXM+RU5BQkxFX0RFQlVHX0hFTFBFUjtFTkFCTEVfREVCVUdfTE9HR0lORzwvVXNlckRlZmluZXM+DQotICAgICAgPFVzZXJPcHRpb25EaXJlY3Rvcnk+Y29uZmlnXGRlYnVnPC9Vc2VyT3B0aW9uRGlyZWN0b3J5Pg0KLSAgICAgIDxVc2VySW5jbHVkZURpcmVjdG9yaWVzPkM6XG15ZGVidWdoZWxwXGluY2x1ZGU8L1VzZXJJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXM+QzpcbXlkZWJ1Z2hlbHBcbGliPC9Vc2VyTGlicmFyeURpcmVjdG9yaWVzPg0KLSAgICAgIDxVc2VyRGVwZW5kZW5jaWVzPmRoZWxwZXI2NC5saWI8L1VzZXJEZXBlbmRlbmNpZXM+DQotICAgIDwvUHJvcGVydHlHcm91cD4NCi0gICAtLT4NCi08L1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2ogYi9idWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmMTFmYy4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvagorKysgL2Rldi9udWxsCkBAIC0xLDE3MTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQotICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBNdWx0aXRocmVhZGVkPC9Db25maWd1cmF0aW9uPg0KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCI+DQotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWcgTXVsdGl0aHJlYWRlZDwvQ29uZmlndXJhdGlvbj4NCi0gICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBTaW5nbGV0aHJlYWRlZDwvQ29uZmlndXJhdGlvbj4NCi0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0Ij4NCi0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBTaW5nbGV0aHJlYWRlZDwvQ29uZmlndXJhdGlvbj4NCi0gICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCi0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KLSAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIj4NCi0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlIE11bHRpdGhyZWFkZWQ8L0NvbmZpZ3VyYXRpb24+DQotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQiPg0KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTXVsdGl0aHJlYWRlZDwvQ29uZmlndXJhdGlvbj4NCi0gICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiPg0KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgU2luZ2xldGhyZWFkZWQ8L0NvbmZpZ3VyYXRpb24+DQotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0Ij4NCi0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlIFNpbmdsZXRocmVhZGVkPC9Db25maWd1cmF0aW9uPg0KLSAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQotICAgIDxQcm9qZWN0R3VpZD57NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfTwvUHJvamVjdEd1aWQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMDA8L1BsYXRmb3JtVG9vbHNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQotICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQotICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQotICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEwMDwvUGxhdGZvcm1Ub29sc2V0Pg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQotICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQotICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQotICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEwMDwvUGxhdGZvcm1Ub29sc2V0Pg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMDA8L1BsYXRmb3JtVG9vbHNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQotICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCi0gICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCi0gICAgPFBsYXRmb3JtVG9vbHNldD52MTAwPC9QbGF0Zm9ybVRvb2xzZXQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMDA8L1BsYXRmb3JtVG9vbHNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMDA8L1BsYXRmb3JtVG9vbHNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQotICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCi0gICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCi0gICAgPFBsYXRmb3JtVG9vbHNldD52MTAwPC9QbGF0Zm9ybVRvb2xzZXQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMDA8L1BsYXRmb3JtVG9vbHNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMDA8L1BsYXRmb3JtVG9vbHNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMDA8L1BsYXRmb3JtVG9vbHNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQotICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCi0gICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCi0gICAgPFBsYXRmb3JtVG9vbHNldD52MTAwPC9QbGF0Zm9ybVRvb2xzZXQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCi0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KLSAgPC9JbXBvcnRHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQotICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcPC9PdXREaXI+DQotICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcPC9PdXREaXI+DQotICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4uXC4uXC4uXC4uXG9ianNcdmMyMDEwXCQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQotICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVw8L091dERpcj4NCi0gICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4uXC4uXC4uXC4uXG9ianNcdmMyMDEwXCQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQotICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcPC9PdXREaXI+DQotICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVw8L091dERpcj4NCi0gICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KLSAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVw8L091dERpcj4NCi0gICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4uXC4uXC4uXC4uXG9ianNcdmMyMDEwXCQoUGxhdGZvcm0pXDwvT3V0RGlyPg0KLSAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVw8L091dERpcj4NCi0gICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KLSAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVw8L091dERpcj4NCi0gICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4uXC4uXC4uXC4uXG9ianNcdmMyMDEwXCQoUGxhdGZvcm0pXDwvT3V0RGlyPg0KLSAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4uXC4uXC4uXC4uXG9ianNcdmMyMDEwXCQoUGxhdGZvcm0pXDwvT3V0RGlyPg0KLSAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPi5cLi5cLi5cLi5cb2Jqc1x2YzIwMTBcJChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVw8L091dERpcj4NCi0gICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+LlwuLlwuLlwuLlxvYmpzXHZjMjAxMFwkKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIiAvPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciIC8+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIiAvPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciIC8+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIiAvPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIiAvPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIiAvPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciIC8+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIiAvPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyIgLz4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIiAvPg0KLSAgICA8VGFyZ2V0TmFtZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZnJlZXR5cGUyOGQ8L1RhcmdldE5hbWU+DQotICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZnJlZXR5cGUyOGQ8L1RhcmdldE5hbWU+DQotICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPmZyZWV0eXBlMjhNVGQ8L1RhcmdldE5hbWU+DQotICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5mcmVldHlwZTI4TVRkPC9UYXJnZXROYW1lPg0KLSAgICA8VGFyZ2V0TmFtZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+ZnJlZXR5cGUyOFNUZDwvVGFyZ2V0TmFtZT4NCi0gICAgPFRhcmdldE5hbWUgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5mcmVldHlwZTI4U1RkPC9UYXJnZXROYW1lPg0KLSAgICA8VGFyZ2V0TmFtZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mcmVldHlwZTI4PC9UYXJnZXROYW1lPg0KLSAgICA8VGFyZ2V0TmFtZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZnJlZXR5cGUyODwvVGFyZ2V0TmFtZT4NCi0gICAgPFRhcmdldE5hbWUgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5mcmVldHlwZTI4TVQ8L1RhcmdldE5hbWU+DQotICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPmZyZWV0eXBlMjhNVDwvVGFyZ2V0TmFtZT4NCi0gICAgPFRhcmdldE5hbWUgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+ZnJlZXR5cGUyOFNUPC9UYXJnZXROYW1lPg0KLSAgICA8VGFyZ2V0TmFtZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+ZnJlZXR5cGUyOFNUPC9UYXJnZXROYW1lPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFNvbHV0aW9uRGlyKVxmcmVldHlwZS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChTb2x1dGlvbkRpcilcZnJlZXR5cGUudXNlci5wcm9wcycpIiBMYWJlbD0iVXNlclByb3BlcnRpZXMiIC8+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQotICAgIDxDbENvbXBpbGU+DQotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoVXNlck9wdGlvbkRpcmVjdG9yeSk7Li5cLi5cLi5caW5jbHVkZTskKFVzZXJJbmNsdWRlRGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRztXSU4zMjtfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+DQotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDxDb21waWxlQXM+RGVmYXVsdDwvQ29tcGlsZUFzPg0KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MDAxPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCi0gICAgICA8TXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj50cnVlPC9NdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPg0KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPg0KLSAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFRhcmdldE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkRpc2FibGVkPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxSZXNvdXJjZUNvbXBpbGU+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPg0KLSAgICA8L1Jlc291cmNlQ29tcGlsZT4NCi0gICAgPExpYj4NCi0gICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCi0gICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoVXNlckxpYnJhcnlEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4kKFVzZXJEZXBlbmRlbmNpZXMpOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQotICAgIDwvTGliPg0KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCi0gICAgPENsQ29tcGlsZT4NCi0gICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChVc2VyT3B0aW9uRGlyZWN0b3J5KTsuLlwuLlwuLlxpbmNsdWRlOyQoVXNlckluY2x1ZGVEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPnRydWU8L0Rpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+DQotICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4NCi0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQotICAgICAgPENvbXBpbGVBcz5EZWZhdWx0PC9Db21waWxlQXM+DQotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQwMDE8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KLSAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+DQotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+DQotICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoVGFyZ2V0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCi0gICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+RGlzYWJsZWQ8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPFJlc291cmNlQ29tcGlsZT4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8Q3VsdHVyZT4weDA0MDk8L0N1bHR1cmU+DQotICAgIDwvUmVzb3VyY2VDb21waWxlPg0KLSAgICA8TGliPg0KLSAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KLSAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChVc2VyTGlicmFyeURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiQoVXNlckRlcGVuZGVuY2llcyk7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCi0gICAgPC9MaWI+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4NCi0gICAgPENsQ29tcGlsZT4NCi0gICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChVc2VyT3B0aW9uRGlyZWN0b3J5KTsuLlwuLlwuLlxpbmNsdWRlOyQoVXNlckluY2x1ZGVEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc1RvRmlsZT5mYWxzZTwvUHJlcHJvY2Vzc1RvRmlsZT4NCi0gICAgICA8UHJlcHJvY2Vzc1N1cHByZXNzTGluZU51bWJlcnM+ZmFsc2U8L1ByZXByb2Nlc3NTdXBwcmVzc0xpbmVOdW1iZXJzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPnRydWU8L0Rpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+DQotICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4NCi0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQotICAgICAgPENvbXBpbGVBcz5EZWZhdWx0PC9Db21waWxlQXM+DQotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQwMDE8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KLSAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+DQotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+DQotICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoVGFyZ2V0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCi0gICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+RGlzYWJsZWQ8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPFJlc291cmNlQ29tcGlsZT4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8Q3VsdHVyZT4weDA0MDk8L0N1bHR1cmU+DQotICAgIDwvUmVzb3VyY2VDb21waWxlPg0KLSAgICA8TGliPg0KLSAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KLSAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChVc2VyTGlicmFyeURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiQoVXNlckRlcGVuZGVuY2llcyk7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCi0gICAgPC9MaWI+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+DQotICAgIDxDbENvbXBpbGU+DQotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoVXNlck9wdGlvbkRpcmVjdG9yeSk7Li5cLi5cLi5caW5jbHVkZTskKFVzZXJJbmNsdWRlRGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRztXSU4zMjtfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NUb0ZpbGU+ZmFsc2U8L1ByZXByb2Nlc3NUb0ZpbGU+DQotICAgICAgPFByZXByb2Nlc3NTdXBwcmVzc0xpbmVOdW1iZXJzPmZhbHNlPC9QcmVwcm9jZXNzU3VwcHJlc3NMaW5lTnVtYmVycz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+DQotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDxDb21waWxlQXM+RGVmYXVsdDwvQ29tcGlsZUFzPg0KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MDAxPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCi0gICAgICA8TXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj50cnVlPC9NdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPg0KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPg0KLSAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFRhcmdldE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkRpc2FibGVkPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxSZXNvdXJjZUNvbXBpbGU+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPg0KLSAgICA8L1Jlc291cmNlQ29tcGlsZT4NCi0gICAgPExpYj4NCi0gICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCi0gICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoVXNlckxpYnJhcnlEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4kKFVzZXJEZXBlbmRlbmNpZXMpOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQotICAgIDwvTGliPg0KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPg0KLSAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFVzZXJPcHRpb25EaXJlY3RvcnkpOy4uXC4uXC4uXGluY2x1ZGU7JChVc2VySW5jbHVkZURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQotICAgICAgPERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+dHJ1ZTwvRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz4NCi0gICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPg0KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4NCi0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDAwMTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQotICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4NCi0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4NCi0gICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChUYXJnZXROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KLSAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5EaXNhYmxlZDwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8UmVzb3VyY2VDb21waWxlPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fREVCVUc7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxDdWx0dXJlPjB4MDQwOTwvQ3VsdHVyZT4NCi0gICAgPC9SZXNvdXJjZUNvbXBpbGU+DQotICAgIDxMaWI+DQotICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQotICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCi0gICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JChVc2VyRGVwZW5kZW5jaWVzKTslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KLSAgICA8L0xpYj4NCi0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCi0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+DQotICAgIDxDbENvbXBpbGU+DQotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoVXNlck9wdGlvbkRpcmVjdG9yeSk7Li5cLi5cLi5caW5jbHVkZTskKFVzZXJJbmNsdWRlRGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRztXSU4zMjtfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+DQotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDxDb21waWxlQXM+RGVmYXVsdDwvQ29tcGlsZUFzPg0KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MDAxPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCi0gICAgICA8TXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj50cnVlPC9NdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPg0KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPg0KLSAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFRhcmdldE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkRpc2FibGVkPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxSZXNvdXJjZUNvbXBpbGU+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPg0KLSAgICA8L1Jlc291cmNlQ29tcGlsZT4NCi0gICAgPExpYj4NCi0gICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCi0gICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoVXNlckxpYnJhcnlEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4kKFVzZXJEZXBlbmRlbmNpZXMpOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQotICAgIDwvTGliPg0KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQotICAgIDxDbENvbXBpbGU+DQotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQotICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFVzZXJPcHRpb25EaXJlY3RvcnkpOy4uXC4uXC4uXGluY2x1ZGU7JChVc2VySW5jbHVkZURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWTskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPnRydWU8L0Rpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+DQotICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4NCi0gICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4NCi0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDAwMTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQotICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4NCi0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQotICAgICAgPEVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ+U3RyZWFtaW5nU0lNREV4dGVuc2lvbnMyPC9FbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0Pg0KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQotICAgICAgPENyZWF0ZUhvdHBhdGNoYWJsZUltYWdlPmZhbHNlPC9DcmVhdGVIb3RwYXRjaGFibGVJbWFnZT4NCi0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4NCi0gICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCi0gICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCi0gICAgICA8RmF2b3JTaXplT3JTcGVlZD5OZWl0aGVyPC9GYXZvclNpemVPclNwZWVkPg0KLSAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxSZXNvdXJjZUNvbXBpbGU+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPg0KLSAgICA8L1Jlc291cmNlQ29tcGlsZT4NCi0gICAgPExpYj4NCi0gICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCi0gICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj50cnVlPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPg0KLSAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChVc2VyTGlicmFyeURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiQoVXNlckRlcGVuZGVuY2llcyk7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCi0gICAgPC9MaWI+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+DQotICAgIDxDbENvbXBpbGU+DQotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQotICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFVzZXJPcHRpb25EaXJlY3RvcnkpOy4uXC4uXC4uXGluY2x1ZGU7JChVc2VySW5jbHVkZURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWTskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPnRydWU8L0Rpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+DQotICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4NCi0gICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4NCi0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDAwMTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQotICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4NCi0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQotICAgICAgPEVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ+U3RyZWFtaW5nU0lNREV4dGVuc2lvbnMyPC9FbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0Pg0KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQotICAgICAgPENyZWF0ZUhvdHBhdGNoYWJsZUltYWdlPmZhbHNlPC9DcmVhdGVIb3RwYXRjaGFibGVJbWFnZT4NCi0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4NCi0gICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCi0gICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCi0gICAgICA8RmF2b3JTaXplT3JTcGVlZD5OZWl0aGVyPC9GYXZvclNpemVPclNwZWVkPg0KLSAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxSZXNvdXJjZUNvbXBpbGU+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPg0KLSAgICA8L1Jlc291cmNlQ29tcGlsZT4NCi0gICAgPExpYj4NCi0gICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCi0gICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj50cnVlPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPg0KLSAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChVc2VyTGlicmFyeURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiQoVXNlckRlcGVuZGVuY2llcyk7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCi0gICAgPC9MaWI+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPg0KLSAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChVc2VyT3B0aW9uRGlyZWN0b3J5KTsuLlwuLlwuLlxpbmNsdWRlOyQoVXNlckluY2x1ZGVEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlk7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+DQotICAgICAgPENvbXBpbGVBcz5EZWZhdWx0PC9Db21waWxlQXM+DQotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQwMDE8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KLSAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+DQotICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KLSAgICAgIDxFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PlN0cmVhbWluZ1NJTURFeHRlbnNpb25zMjwvRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD4NCi0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KLSAgICAgIDxDcmVhdGVIb3RwYXRjaGFibGVJbWFnZT5mYWxzZTwvQ3JlYXRlSG90cGF0Y2hhYmxlSW1hZ2U+DQotICAgICAgPFJ1bnRpbWVUeXBlSW5mbz5mYWxzZTwvUnVudGltZVR5cGVJbmZvPg0KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPg0KLSAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCi0gICAgICA8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KLSAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQotICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KLSAgICAgIDxGYXZvclNpemVPclNwZWVkPk5laXRoZXI8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQotICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPFJlc291cmNlQ29tcGlsZT4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8Q3VsdHVyZT4weDA0MDk8L0N1bHR1cmU+DQotICAgIDwvUmVzb3VyY2VDb21waWxlPg0KLSAgICA8TGliPg0KLSAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KLSAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPnRydWU8L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+DQotICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCi0gICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JChVc2VyRGVwZW5kZW5jaWVzKTslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KLSAgICA8L0xpYj4NCi0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCi0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPg0KLSAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChVc2VyT3B0aW9uRGlyZWN0b3J5KTsuLlwuLlwuLlxpbmNsdWRlOyQoVXNlckluY2x1ZGVEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlk7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+DQotICAgICAgPENvbXBpbGVBcz5EZWZhdWx0PC9Db21waWxlQXM+DQotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQwMDE8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KLSAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+DQotICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KLSAgICAgIDxFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PlN0cmVhbWluZ1NJTURFeHRlbnNpb25zMjwvRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD4NCi0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KLSAgICAgIDxDcmVhdGVIb3RwYXRjaGFibGVJbWFnZT5mYWxzZTwvQ3JlYXRlSG90cGF0Y2hhYmxlSW1hZ2U+DQotICAgICAgPFJ1bnRpbWVUeXBlSW5mbz5mYWxzZTwvUnVudGltZVR5cGVJbmZvPg0KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPg0KLSAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCi0gICAgICA8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KLSAgICAgIDxFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPnRydWU8L0VuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+DQotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQotICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPg0KLSAgICAgIDxGYXZvclNpemVPclNwZWVkPk5laXRoZXI8L0Zhdm9yU2l6ZU9yU3BlZWQ+DQotICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPFJlc291cmNlQ29tcGlsZT4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8Q3VsdHVyZT4weDA0MDk8L0N1bHR1cmU+DQotICAgIDwvUmVzb3VyY2VDb21waWxlPg0KLSAgICA8TGliPg0KLSAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KLSAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPnRydWU8L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+DQotICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCi0gICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JChVc2VyRGVwZW5kZW5jaWVzKTslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KLSAgICA8L0xpYj4NCi0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCi0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPg0KLSAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChVc2VyT3B0aW9uRGlyZWN0b3J5KTsuLlwuLlwuLlxpbmNsdWRlOyQoVXNlckluY2x1ZGVEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlk7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+DQotICAgICAgPENvbXBpbGVBcz5EZWZhdWx0PC9Db21waWxlQXM+DQotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQwMDE8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KLSAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+DQotICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KLSAgICAgIDxFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PlN0cmVhbWluZ1NJTURFeHRlbnNpb25zMjwvRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD4NCi0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KLSAgICAgIDxDcmVhdGVIb3RwYXRjaGFibGVJbWFnZT5mYWxzZTwvQ3JlYXRlSG90cGF0Y2hhYmxlSW1hZ2U+DQotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+DQotICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KLSAgICAgIDwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCi0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQotICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+TmVpdGhlcjwvRmF2b3JTaXplT3JTcGVlZD4NCi0gICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8UmVzb3VyY2VDb21waWxlPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxDdWx0dXJlPjB4MDQwOTwvQ3VsdHVyZT4NCi0gICAgPC9SZXNvdXJjZUNvbXBpbGU+DQotICAgIDxMaWIgLz4NCi0gICAgPExpYj4NCi0gICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj50cnVlPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPg0KLSAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChVc2VyTGlicmFyeURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiQoVXNlckRlcGVuZGVuY2llcyk7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCi0gICAgPC9MaWI+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+DQotICAgIDxDbENvbXBpbGU+DQotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQotICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFVzZXJPcHRpb25EaXJlY3RvcnkpOy4uXC4uXC4uXGluY2x1ZGU7JChVc2VySW5jbHVkZURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWTskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPnRydWU8L0Rpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+DQotICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4NCi0gICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4NCi0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDAwMTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQotICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4NCi0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQotICAgICAgPEVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ+U3RyZWFtaW5nU0lNREV4dGVuc2lvbnMyPC9FbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0Pg0KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQotICAgICAgPENyZWF0ZUhvdHBhdGNoYWJsZUltYWdlPmZhbHNlPC9DcmVhdGVIb3RwYXRjaGFibGVJbWFnZT4NCi0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4NCi0gICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCi0gICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCi0gICAgICA8RmF2b3JTaXplT3JTcGVlZD5OZWl0aGVyPC9GYXZvclNpemVPclNwZWVkPg0KLSAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxSZXNvdXJjZUNvbXBpbGU+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPg0KLSAgICA8L1Jlc291cmNlQ29tcGlsZT4NCi0gICAgPExpYiAvPg0KLSAgICA8TGliPg0KLSAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPnRydWU8L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+DQotICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCi0gICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JChVc2VyRGVwZW5kZW5jaWVzKTslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KLSAgICA8L0xpYj4NCi0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGF1dG9maXRcYXV0b2ZpdC5jIiAvPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiZGZcYmRmLmMiPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGNmZlxjZmYuYyI+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJhc2UuYyI+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJpdG1hcC5jIiAvPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xjYWNoZVxmdGNhY2hlLmMiPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZnRkZWJ1Zy5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPmZhbHNlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5mYWxzZTwvRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPmZhbHNlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+ZmFsc2U8L0Rpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5mYWxzZTwvRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPmZhbHNlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPmZhbHNlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPmZhbHNlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj5mYWxzZTwvRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz4NCi0gICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+ZmFsc2U8L0Rpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KLSAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyIgLz4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGdhc3AuYyIgLz4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGdseXBoLmMiPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGd6aXBcZnRnemlwLmMiPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRpbml0LmMiPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGx6d1xmdGx6dy5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3Ryb2tlLmMiIC8+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzeXN0ZW0uYyI+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcc21vb3RoXHNtb290aC5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0YmJveC5jIiAvPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Zm50Zm10LmMiIC8+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRtbS5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0cGZyLmMiIC8+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzeW50aC5jIiAvPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dHlwZTEuYyIgLz4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHdpbmZudC5jIiAvPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0bGNkZmlsLmMiIC8+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRneHZhbC5jIiAvPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0b3R2YWwuYyIgLz4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBhdGVudC5jIiAvPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xwY2ZccGNmLmMiPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXHBmclxwZnIuYyI+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNccHNhdXhccHNhdXguYyI+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNccHNoaW50ZXJccHNoaW50ZXIuYyI+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNccHNuYW1lc1xwc21vZHVsZS5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xyYXN0ZXJccmFzdGVyLmMiPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXHNmbnRcc2ZudC5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1x0cnVldHlwZVx0cnVldHlwZS5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1x0eXBlMVx0eXBlMS5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xjaWRcdHlwZTFjaWQuYyI+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcdHlwZTQyXHR5cGU0Mi5jIj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFNpbmdsZXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1x3aW5mb250c1x3aW5mbnQuYyI+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIE11bHRpdGhyZWFkZWR8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBNdWx0aXRocmVhZGVkfHg2NCciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgU2luZ2xldGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyJyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTaW5nbGV0aHJlYWRlZHx4NjQnIj5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3MgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBNdWx0aXRocmVhZGVkfHg2NCciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8eDY0JyI+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPE9wdGltaXphdGlvbiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxPcHRpbWl6YXRpb24gQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmNsdWRlXGZ0MmJ1aWxkLmgiIC8+DQotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRjb25maWcuaCIgLz4NCi0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdGhlYWRlci5oIiAvPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0bW9kdWxlLmgiIC8+DQotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRvcHRpb24uaCIgLz4NCi0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdHN0ZGxpYi5oIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCi0gIDwvSW1wb3J0R3JvdXA+DQotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLmZpbHRlcnMgYi9idWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvai5maWx0ZXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTk0N2Y0Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLmZpbHRlcnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2I0YzE1ODkzLWVjMTEtNDkxZC05NTA3LTBhYzE4NGY5Y2M3OH08L1VuaXF1ZUlkZW50aWZpZXI+DQotICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdDwvRXh0ZW5zaW9ucz4NCi0gICAgPC9GaWx0ZXI+DQotICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzXEZUX01PRFVMRVMiPg0KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0ZDNlNGVmZi0zZmJjLTRiMjAtYjQxMy0yNzQzYjIzYjcxMDl9PC9VbmlxdWVJZGVudGlmaWVyPg0KLSAgICA8L0ZpbHRlcj4NCi0gICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlNmNmNmEwZi0wNDA0LTQwMjQtOGJmOC1mZjViMjlmMzU2NTd9PC9VbmlxdWVJZGVudGlmaWVyPg0KLSAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw8L0V4dGVuc2lvbnM+DQotICAgIDwvRmlsdGVyPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xhdXRvZml0XGF1dG9maXQuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJkZlxiZGYuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGNmZlxjZmYuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiYXNlLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Yml0bWFwLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xjYWNoZVxmdGNhY2hlLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGZ0ZGVidWcuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRnYXNwLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2x5cGguYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGd6aXBcZnRnemlwLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0aW5pdC5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcbHp3XGZ0bHp3LmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3Ryb2tlLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3lzdGVtLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xzbW9vdGhcc21vb3RoLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0YmJveC5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Zm50Zm10LmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEZUX01PRFVMRVM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRtbS5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0cGZyLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEZUX01PRFVMRVM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzeW50aC5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dHlwZTEuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcRlRfTU9EVUxFUzwvRmlsdGVyPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHdpbmZudC5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0bGNkZmlsLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEZUX01PRFVMRVM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXGJhc2VcZnRneHZhbC5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0b3R2YWwuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcRlRfTU9EVUxFUzwvRmlsdGVyPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBhdGVudC5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xwY2ZccGNmLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEZUX01PRFVMRVM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXHBmclxwZnIuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcRlRfTU9EVUxFUzwvRmlsdGVyPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNccHNhdXhccHNhdXguYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcRlRfTU9EVUxFUzwvRmlsdGVyPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNccHNoaW50ZXJccHNoaW50ZXIuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcRlRfTU9EVUxFUzwvRmlsdGVyPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNccHNuYW1lc1xwc21vZHVsZS5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xyYXN0ZXJccmFzdGVyLmMiPg0KLSAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXEZUX01PRFVMRVM8L0ZpbHRlcj4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXHNmbnRcc2ZudC5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1x0cnVldHlwZVx0cnVldHlwZS5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1x0eXBlMVx0eXBlMS5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xjaWRcdHlwZTFjaWQuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcRlRfTU9EVUxFUzwvRmlsdGVyPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcdHlwZTQyXHR5cGU0Mi5jIj4NCi0gICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xGVF9NT0RVTEVTPC9GaWx0ZXI+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1x3aW5mb250c1x3aW5mbnQuYyI+DQotICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcRlRfTU9EVUxFUzwvRmlsdGVyPg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmNsdWRlXGZ0MmJ1aWxkLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0Y29uZmlnLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0aGVhZGVyLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0bW9kdWxlLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0b3B0aW9uLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0c3RkbGliLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgPC9JdGVtR3JvdXA+DQotPC9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sIGIvYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjU4MDAuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08aHRtbD4KLTxoZWFkZXI+Ci08dGl0bGU+Ci0gIEZyZWVUeXBlJm5ic3A7MiBQcm9qZWN0IEZpbGVzIGZvciBWUy5ORVQmbmJzcDsyMDEwIG9yIG5ld2VyCi08L3RpdGxlPgotCi08Ym9keT4KLTxoMT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZTLk5FVCZuYnNwOzIwMTAgb3IgbmV3ZXIKLTwvaDE+Ci0KLTxwPlRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgcHJvamVjdCBmaWxlIGZvciBWaXN1YWwgQysrIChWUy5ORVQmbmJzcDsyMDEwCi1vciBuZXdlciksIG5hbWVkIDx0dD5mcmVldHlwZS52Y3hwcm9qPC90dD4sIGFuZCBWaXN1YWwgU3R1ZGlvLCBjYWxsZWQKLTx0dD5mcmVldHlwZS5zbG48L3R0Pi4gIEl0IGNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGZyb20gdGhlCi1GcmVlVHlwZSAyLjggc291cmNlczo8L3A+Ci0KLTx1bD4KLSAgPHByZT4KLSAgICBmcmVldHlwZTI4LmxpYiAgICAtIHJlbGVhc2UgYnVpbGQKLSAgICBmcmVldHlwZTI4ZC5saWIgICAtIGRlYnVnIGJ1aWxkCi0gICAgZnJlZXR5cGUyOFNULmxpYiAgLSByZWxlYXNlIGJ1aWxkOyBzaW5nbGUgdGhyZWFkZWQKLSAgICBmcmVldHlwZTI4U1RkLmxpYiAtIGRlYnVnIGJ1aWxkOyAgIHNpbmdsZSB0aHJlYWRlZAotICAgIGZyZWV0eXBlMjhNVC5saWIgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI4TVRkLmxpYiAtIGRlYnVnIGJ1aWxkOyAgIG11bHRpLXRocmVhZGVkPC9wcmU+Ci08L3VsPgotCi08cD5Cb3RoIFdpbjMyIGFuZCB4NjQgYnVpbGRzIGFyZSBzdXBwb3J0ZWQuPC9wPgotCi08cD5CZSBzdXJlIHRvIGV4dHJhY3QgdGhlIGZpbGVzIHdpdGggdGhlIFdpbmRvd3MgKENSK0xGKSBsaW5lIGVuZGluZ3MuICBaSVAKLWFyY2hpdmVzIGFyZSBhbHJlYWR5IHN0b3JlZCB0aGlzIHdheSwgc28gbm8gZnVydGhlciBhY3Rpb24gaXMgcmVxdWlyZWQuICBJZgoteW91IHVzZSBzb21lIDx0dD4udGFyLip6PC90dD4gYXJjaGl2ZXMsIGJlIHN1cmUgdG8gY29uZmlndXJlIHlvdXIgZXh0cmFjdGluZwotdG9vbCB0byBjb252ZXJ0IHRoZSBsaW5lIGVuZGluZ3MuICBGb3IgZXhhbXBsZSwgd2l0aCA8YQotaHJlZj0iaHR0cDovL3d3dy53aW56aXAuY29tIj5XaW5aaXA8L2E+LCB5b3Ugc2hvdWxkIGFjdGl2YXRlIHRoZSA8ZW0+VEFSCi1maWxlIHNtYXJ0IENSL0xGIENvbnZlcnNpb248L2VtPiBvcHRpb24uICBBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGNvbnNpZGVyCi11c2luZyB0aGUgPHR0PnVuaXgyZG9zPC90dD4gb3IgPHR0PnUyZDwvdHQ+IHV0aWxpdGllcyB0aGF0IGFyZSBmbG9hdGluZwotYXJvdW5kLCB3aGljaCBzcGVjaWZpY2FsbHkgZGVhbCB3aXRoIHRoaXMgcGFydGljdWxhciBwcm9ibGVtLgotCi08cD5CdWlsZCBkaXJlY3RvcmllcyBhcmUgcGxhY2VkIGluIHRoZSB0b3AtbGV2ZWwgPHR0Pm9ianNcdmMyMDEwPC90dD4KLWRpcmVjdG9yeS48L3A+Ci0KLTxwPkN1c3RvbWl6YXRpb24gb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkgaXMgZG9uZSBieSBlZGl0aW5nIHRoZQotPHR0PmZ0b3B0aW9uLmg8L3R0PiBoZWFkZXIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIDx0dD5kZXZlbDwvdHQ+IHBhdGguCi1BbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGNvcHkgdGhlIGZpbGUgdG8gYW5vdGhlciBkaXJlY3RvcnkgYW5kIGNoYW5nZSB0aGUKLWluY2x1ZGUgZGlyZWN0b3J5IGluIDx0dD5mcmVldHlwZS51c2Vycy5wcm9wczwvdHQ+LjwvcD4KLQotPHA+VG8gY29uZmlndXJlIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGxpa2UgPGVtPnpsaWI8L2VtPiBhbmQgPGVtPmxpYnBuZzwvZW0+LAotZWRpdCB0aGUgPHR0PmZyZWV0eXBlLnVzZXJzLnByb3BzPC90dD4gZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS4gIEl0IGFsc28KLXNpbXBsaWZpZXMgYXV0b21hdGVkIChjb21tYW5kLWxpbmUpIGJ1aWxkcyB1c2luZyA8YQotaHJlZj0iaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RkMzkzNTc0JTI4dj12cy4xMDAlMjkuYXNweCI+bXNidWlsZDwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcCBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzE0YjQ4Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iZnJlZXR5cGUiIC0gUGFja2FnZSBPd25lcj08ND4NCi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQotIyAqKiBETyBOT1QgRURJVCAqKg0KLQ0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQNCi0NCi1DRkc9ZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZA0KLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCi0hTUVTU0FHRQ0KLSFNRVNTQUdFIE5NQUtFIC9mICJmcmVldHlwZS5tYWsiLg0KLSFNRVNTQUdFDQotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KLSFNRVNTQUdFDQotIU1FU1NBR0UgTk1BS0UgL2YgImZyZWV0eXBlLm1hayIgQ0ZHPSJmcmVldHlwZSAtIFdpbjMyIERlYnVnIFNpbmdsZXRocmVhZGVkIg0KLSFNRVNTQUdFDQotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQotIU1FU1NBR0UNCi0hTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQotIU1FU1NBR0UgImZyZWV0eXBlIC0gV2luMzIgRGVidWcgTXVsdGl0aHJlYWRlZCIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQotIU1FU1NBR0UgImZyZWV0eXBlIC0gV2luMzIgUmVsZWFzZSBNdWx0aXRocmVhZGVkIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZCIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQotIU1FU1NBR0UNCi0NCi0jIEJlZ2luIFByb2plY3QNCi0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KLSMgUFJPUCBTY2NfUHJvak5hbWUgIiINCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KLUNQUD1jbC5leGUNCi1SU0M9cmMuZXhlDQotDQotIUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIg0KLQ0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgT3V0cHV0X0RpciAiLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIg0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlwuLlxvYmpzXHJlbGVhc2UiDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvYw0KLSMgQUREIENQUCAvTUQgL1phIC9XNCAvR1ggL08yIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVDJfQlVJTERfTElCUkFSWSIgL0ZEIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWjxub25lPiAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCi0jIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOC5saWIiDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgRGVidWciDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNcZGVidWciDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNcZGVidWciDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KLSMgQUREIENQUCAvTURkIC9aYSAvVzQgL0dYIC9aNyAvT2QgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJGVF9ERUJVR19MRVZFTF9FUlJPUiIgL0QgIkZUX0RFQlVHX0xFVkVMX1RSQUNFIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVDJfQlVJTERfTElCUkFSWSIgL0ZEIC9HWiAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ub2xvZ28gL1ggL1lYDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQotIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhfRC5saWIiDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgRGVidWcgTXVsdGl0aHJlYWRlZCINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJmcmVldHlwZV9fX1dpbjMyX0RlYnVnX011bHRpdGhyZWFkZWQiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZnJlZXR5cGVfX19XaW4zMl9EZWJ1Z19NdWx0aXRocmVhZGVkIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KLSMgUFJPUCBPdXRwdXRfRGlyICIuLlwuLlwuLlxvYmpzXGRlYnVnX210Ig0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlwuLlxvYmpzXGRlYnVnX210Ig0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvWmEgL1czIC9HbSAvR1ggL1pJIC9PZCAvSSAiLi5caW5jbHVkZVxcIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVF9GTEFUX0NPTVBJTEUiIC9ZWCAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBCQVNFIENQUCAvWA0KLSMgQUREIENQUCAvTVRkIC9aYSAvVzQgL0dYIC9aNyAvT2QgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJGVF9ERUJVR19MRVZFTF9FUlJPUiIgL0QgIkZUX0RFQlVHX0xFVkVMX1RSQUNFIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVDJfQlVJTERfTElCUkFSWSIgL0ZEIC9HWiAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ub2xvZ28gL1ggL1lYDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6ImxpYlxmcmVldHlwZTI4X0QubGliIg0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4TVRfRC5saWIiDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgUmVsZWFzZSBNdWx0aXRocmVhZGVkIg0KLQ0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImZyZWV0eXBlX19fV2luMzJfUmVsZWFzZV9NdWx0aXRocmVhZGVkIg0KLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImZyZWV0eXBlX19fV2luMzJfUmVsZWFzZV9NdWx0aXRocmVhZGVkIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBPdXRwdXRfRGlyICIuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQiDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNccmVsZWFzZV9tdCINCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1phIC9XMyAvR1ggL08yIC9JICIuLlxpbmNsdWRlXFwiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUX0ZMQVRfQ09NUElMRSIgL1lYIC9GRCAvYw0KLSMgQUREIENQUCAvTVQgL1phIC9XNCAvR1ggL08yIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVDJfQlVJTERfTElCUkFSWSIgL0ZEIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWjxub25lPiAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoibGliXGZyZWV0eXBlMjgubGliIg0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4TVQubGliIg0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgU2luZ2xldGhyZWFkZWQiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZnJlZXR5cGVfX19XaW4zMl9SZWxlYXNlX1NpbmdsZXRocmVhZGVkIg0KLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImZyZWV0eXBlX19fV2luMzJfUmVsZWFzZV9TaW5nbGV0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgT3V0cHV0X0RpciAiLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0Ig0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QiDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvWmEgL1c0IC9HWCAvWmkgL08yIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQotIyBBREQgQ1BQIC9aYSAvVzQgL0dYIC9PMiAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRCAiRlQyX0JVSUxEX0xJQlJBUlkiIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ub2xvZ28gL1o8bm9uZT4gL1lYDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOC5saWIiDQotIyBBREQgTElCMzIgL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4U1QubGliIg0KLSMgU1VCVFJBQ1QgTElCMzIgL25vbG9nbw0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIFNpbmdsZXRocmVhZGVkIg0KLQ0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImZyZWV0eXBlX19fV2luMzJfRGVidWdfU2luZ2xldGhyZWFkZWQiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZnJlZXR5cGVfX19XaW4zMl9EZWJ1Z19TaW5nbGV0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgT3V0cHV0X0RpciAiLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdCINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdCINCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvWmEgL1c0IC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRCAiRlRfREVCVUdfTEVWRUxfRVJST1IiIC9EICJGVF9ERUJVR19MRVZFTF9UUkFDRSIgL0ZEIC9HWiAvYw0KLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1ggL1lYDQotIyBBREQgQ1BQIC9aYSAvVzQgL0dYIC9aNyAvT2QgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJGVF9ERUJVR19MRVZFTF9FUlJPUiIgL0QgIkZUX0RFQlVHX0xFVkVMX1RSQUNFIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVDJfQlVJTERfTElCUkFSWSIgL0ZEIC9HWiAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ub2xvZ28gL1ggL1lYDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOF9ELmxpYiINCi0jIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOFNUX0QubGliIg0KLQ0KLSFFTkRJRg0KLQ0KLSMgQmVnaW4gVGFyZ2V0DQotDQotIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UiDQotIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIg0KLSMgTmFtZSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBNdWx0aXRocmVhZGVkIg0KLSMgTmFtZSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIE11bHRpdGhyZWFkZWQiDQotIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgU2luZ2xldGhyZWFkZWQiDQotIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIFNpbmdsZXRocmVhZGVkIg0KLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCi0NCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYXV0b2ZpdFxhdXRvZml0LmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJkZlxiZGYuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcY2ZmXGNmZi5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0YmFzZS5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0YmJveC5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0YmRmLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRiaXRtYXAuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdGZudGZtdC5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0ZnN0eXBlLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRnYXNwLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGNhY2hlXGZ0Y2FjaGUuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlxmdGRlYnVnLmMNCi0jIEFERCBDUFAgL1plDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2x5cGguYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdGd4dmFsLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGd6aXBcZnRnemlwLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRpbml0LmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGx6d1xmdGx6dy5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0bW0uYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdG90dmFsLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRwZnIuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdHN0cm9rZS5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0c3ludGguYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdHN5c3RlbS5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0dHlwZTEuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdHdpbmZudC5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xwY2ZccGNmLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHBmclxwZnIuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNccHNhdXhccHNhdXguYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNccHNoaW50ZXJccHNoaW50ZXIuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNccHNuYW1lc1xwc21vZHVsZS5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xyYXN0ZXJccmFzdGVyLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHNmbnRcc2ZudC5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xzbW9vdGhcc21vb3RoLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHRydWV0eXBlXHRydWV0eXBlLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHR5cGUxXHR5cGUxLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGNpZFx0eXBlMWNpZC5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1x0eXBlNDJcdHlwZTQyLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHdpbmZvbnRzXHdpbmZudC5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEVuZCBHcm91cA0KLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCi0NCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxpbmNsdWRlXGZ0MmJ1aWxkLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRjb25maWcuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdGhlYWRlci5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0bW9kdWxlLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRvcHRpb24uaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdHN0ZGxpYi5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEVuZCBHcm91cA0KLSMgRW5kIFRhcmdldA0KLSMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzdyBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHN3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ5ZTc2Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHN3CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCi0jIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1Qcm9qZWN0OiAiZnJlZXR5cGUiPS5cZnJlZXR5cGUuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCi0NCi1QYWNrYWdlPTw1Pg0KLXt7ew0KLX19fQ0KLQ0KLVBhY2thZ2U9PDQ+DQote3t7DQotfX19DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUdsb2JhbDoNCi0NCi1QYWNrYWdlPTw1Pg0KLXt7ew0KLX19fQ0KLQ0KLVBhY2thZ2U9PDM+DQote3t7DQotfX19DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuc2xuIGIvYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5zbG4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjRiZTIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5zbG4KKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwDQotIyBWaXN1YWwgU3R1ZGlvIDIwMDUNCi1Qcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImZyZWV0eXBlIiwgImZyZWV0eXBlLnZjcHJvaiIsICJ7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfSINCi1FbmRQcm9qZWN0DQotR2xvYmFsDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQotCQlEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KLQkJUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQlSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KLQkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQotCUVuZEdsb2JhbFNlY3Rpb24NCi1FbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjhmMmVlLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMjE3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdA0KLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCi0JVmVyc2lvbj0iOC4wMCINCi0JTmFtZT0iZnJlZXR5cGUiDQotCVByb2plY3RHVUlEPSJ7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfSINCi0JPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luMzIiDQotCQkvPg0KLQk8L1BsYXRmb3Jtcz4NCi0JPFRvb2xGaWxlcz4NCi0JPC9Ub29sRmlsZXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMiINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4LmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhNVC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0Ig0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOFNULmxpYiINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4TVRfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCTwvQ29uZmlndXJhdGlvbnM+DQotCTxSZWZlcmVuY2VzPg0KLQk8L1JlZmVyZW5jZXM+DQotCTxGaWxlcz4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQotCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KLQkJCT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xhdXRvZml0XGF1dG9maXQuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiZGZcYmRmLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGNmZlxjZmYuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJhc2UuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJpdG1hcC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2FzcC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGNhY2hlXGZ0Y2FjaGUuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlxmdGRlYnVnLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRnbHlwaC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xnemlwXGZ0Z3ppcC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0aW5pdC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xsendcZnRsencuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN0cm9rZS5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzeXN0ZW0uYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcc21vb3RoXHNtb290aC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsdGVyDQotCQkJCU5hbWU9IkZUX01PRFVMRVMiDQotCQkJCT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiYm94LmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmbnRmbXQuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdG1tLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0cGZyLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzeW50aC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dHlwZTEuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHdpbmZudC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0bGNkZmlsLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRneHZhbC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0b3R2YWwuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBhdGVudC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwY2ZccGNmLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwZnJccGZyLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc2F1eFxwc2F1eC5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccHNoaW50ZXJccHNoaW50ZXIuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBzbmFtZXNccHNtb2R1bGUuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHJhc3RlclxyYXN0ZXIuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHNmbnRcc2ZudC5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcdHJ1ZXR5cGVcdHJ1ZXR5cGUuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHR5cGUxXHR5cGUxLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjaWRcdHlwZTFjaWQuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHR5cGU0Mlx0eXBlNDIuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHdpbmZvbnRzXHdpbmZudC5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCTwvRmlsdGVyPg0KLQkJPC9GaWx0ZXI+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KLQkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCINCi0JCQk+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZ0MmJ1aWxkLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdGNvbmZpZy5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRoZWFkZXIuaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0bW9kdWxlLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdG9wdGlvbi5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRzdGRsaWIuaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwgYi9idWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZjg2OGMuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPGh0bWw+Ci08aGVhZGVyPgotPHRpdGxlPgotICBGcmVlVHlwZSZuYnNwOzIgUHJvamVjdCBGaWxlcyBmb3IgVmlzdWFsJm5ic3A7QysrIGFuZCBWUy5ORVQmbmJzcDsyMDA1Ci08L3RpdGxlPgotCi08Ym9keT4KLTxoMT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZpc3VhbCZuYnNwO0MrKyBhbmQgVlMuTkVUJm5ic3A7MjAwNQotPC9oMT4KLQotPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyBmb3IgVmlzdWFsIEMrKywgbmFtZWQKLTx0dD5mcmVldHlwZS5kc3A8L3R0PiwgYW5kIFZpc3VhbCBTdHVkaW8sIGNhbGxlZCA8dHQ+ZnJlZXR5cGUuc2xuPC90dD4uICBJdAotY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi44IHNvdXJjZXM6PC9wPgotCi08dWw+Ci0gIDxwcmU+Ci0gICAgZnJlZXR5cGUyOC5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOF9ELmxpYiAgIC0gZGVidWcgYnVpbGQ7ICAgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOE1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI4TVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgotPC91bD4KLQotPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCi1hcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKLXlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKLXRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgotZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgotdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKLWFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KLQotPHA+QnVpbGQgZGlyZWN0b3JpZXMgYXJlIHBsYWNlZCBpbiB0aGUgdG9wLWxldmVsIDx0dD5vYmpzPC90dD4KLWRpcmVjdG9yeS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxNGI0OC4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJmcmVldHlwZSIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCi0jICoqIERPIE5PVCBFRElUICoqDQotDQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNA0KLQ0KLUNGRz1mcmVldHlwZSAtIFdpbjMyIERlYnVnIFNpbmdsZXRocmVhZGVkDQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KLSFNRVNTQUdFDQotIU1FU1NBR0UgTk1BS0UgL2YgImZyZWV0eXBlLm1hayIuDQotIU1FU1NBR0UNCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQotIU1FU1NBR0UNCi0hTUVTU0FHRSBOTUFLRSAvZiAiZnJlZXR5cGUubWFrIiBDRkc9ImZyZWV0eXBlIC0gV2luMzIgRGVidWcgU2luZ2xldGhyZWFkZWQiDQotIU1FU1NBR0UNCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCi0hTUVTU0FHRQ0KLSFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KLSFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBNdWx0aXRocmVhZGVkIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIE11bHRpdGhyZWFkZWQiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KLSFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgU2luZ2xldGhyZWFkZWQiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KLSFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIFNpbmdsZXRocmVhZGVkIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRQ0KLQ0KLSMgQmVnaW4gUHJvamVjdA0KLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQotQ1BQPWNsLmV4ZQ0KLVJTQz1yYy5leGUNCi0NCi0hSUYgICIkKENGRykiID09ICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBPdXRwdXRfRGlyICIuLlwuLlwuLlxvYmpzXHJlbGVhc2UiDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNccmVsZWFzZSINCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9jDQotIyBBREQgQ1BQIC9NRCAvWmEgL1c0IC9HWCAvTzIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL2MNCi0jIFNVQlRSQUNUIENQUCAvbm9sb2dvIC9aPG5vbmU+IC9ZWA0KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQotQlNDMzI9YnNjbWFrZS5leGUNCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCi0jIEFERCBCU0MzMiAvbm9sb2dvDQotTElCMzI9bGluay5leGUgLWxpYg0KLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4LmxpYiINCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgT3V0cHV0X0RpciAiLi5cLi5cLi5cb2Jqc1xkZWJ1ZyINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cLi5cLi5cb2Jqc1xkZWJ1ZyINCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL0daIC9jDQotIyBBREQgQ1BQIC9NRGQgL1phIC9XNCAvR1ggL1o3IC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIkZUX0RFQlVHX0xFVkVMX0VSUk9SIiAvRCAiRlRfREVCVUdfTEVWRUxfVFJBQ0UiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWCAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCi0jIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOF9ELmxpYiINCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBNdWx0aXRocmVhZGVkIg0KLQ0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImZyZWV0eXBlX19fV2luMzJfRGVidWdfTXVsdGl0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJmcmVldHlwZV9fX1dpbjMyX0RlYnVnX011bHRpdGhyZWFkZWQiDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNcZGVidWdfbXQiDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNcZGVidWdfbXQiDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9aYSAvVzMgL0dtIC9HWCAvWkkgL09kIC9JICIuLlxpbmNsdWRlXFwiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUX0ZMQVRfQ09NUElMRSIgL1lYIC9GRCAvR1ogL2MNCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9YDQotIyBBREQgQ1BQIC9NVGQgL1phIC9XNCAvR1ggL1o3IC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIkZUX0RFQlVHX0xFVkVMX0VSUk9SIiAvRCAiRlRfREVCVUdfTEVWRUxfVFJBQ0UiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWCAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoibGliXGZyZWV0eXBlMjhfRC5saWIiDQotIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhNVF9ELmxpYiINCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIE11bHRpdGhyZWFkZWQiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZnJlZXR5cGVfX19XaW4zMl9SZWxlYXNlX011bHRpdGhyZWFkZWQiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZnJlZXR5cGVfX19XaW4zMl9SZWxlYXNlX011bHRpdGhyZWFkZWQiDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNccmVsZWFzZV9tdCINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210Ig0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvWmEgL1czIC9HWCAvTzIgL0kgIi4uXGluY2x1ZGVcXCIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRCAiRlRfRkxBVF9DT01QSUxFIiAvWVggL0ZEIC9jDQotIyBBREQgQ1BQIC9NVCAvWmEgL1c0IC9HWCAvTzIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL2MNCi0jIFNVQlRSQUNUIENQUCAvbm9sb2dvIC9aPG5vbmU+IC9ZWA0KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQotQlNDMzI9YnNjbWFrZS5leGUNCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCi0jIEFERCBCU0MzMiAvbm9sb2dvDQotTElCMzI9bGluay5leGUgLWxpYg0KLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbyAvb3V0OiJsaWJcZnJlZXR5cGUyOC5saWIiDQotIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhNVC5saWIiDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZCINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJmcmVldHlwZV9fX1dpbjMyX1JlbGVhc2VfU2luZ2xldGhyZWFkZWQiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZnJlZXR5cGVfX19XaW4zMl9SZWxlYXNlX1NpbmdsZXRocmVhZGVkIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBPdXRwdXRfRGlyICIuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QiDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNccmVsZWFzZV9zdCINCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9aYSAvVzQgL0dYIC9aaSAvTzIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0ZEIC9jDQotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgNCi0jIEFERCBDUFAgL1phIC9XNCAvR1ggL08yIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVDJfQlVJTERfTElCUkFSWSIgL0ZEIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWjxub25lPiAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4LmxpYiINCi0jIEFERCBMSUIzMiAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhTVC5saWIiDQotIyBTVUJUUkFDVCBMSUIzMiAvbm9sb2dvDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgRGVidWcgU2luZ2xldGhyZWFkZWQiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZnJlZXR5cGVfX19XaW4zMl9EZWJ1Z19TaW5nbGV0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJmcmVldHlwZV9fX1dpbjMyX0RlYnVnX1NpbmdsZXRocmVhZGVkIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KLSMgUFJPUCBPdXRwdXRfRGlyICIuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9aYSAvVzQgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVF9ERUJVR19MRVZFTF9FUlJPUiIgL0QgIkZUX0RFQlVHX0xFVkVMX1RSQUNFIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBCQVNFIENQUCAvWCAvWVgNCi0jIEFERCBDUFAgL1phIC9XNCAvR1ggL1o3IC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIkZUX0RFQlVHX0xFVkVMX0VSUk9SIiAvRCAiRlRfREVCVUdfTEVWRUxfVFJBQ0UiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWCAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4X0QubGliIg0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4U1RfRC5saWIiDQotDQotIUVORElGDQotDQotIyBCZWdpbiBUYXJnZXQNCi0NCi0jIE5hbWUgImZyZWV0eXBlIC0gV2luMzIgUmVsZWFzZSINCi0jIE5hbWUgImZyZWV0eXBlIC0gV2luMzIgRGVidWciDQotIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIE11bHRpdGhyZWFkZWQiDQotIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgTXVsdGl0aHJlYWRlZCINCi0jIE5hbWUgImZyZWV0eXBlIC0gV2luMzIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZCINCi0jIE5hbWUgImZyZWV0eXBlIC0gV2luMzIgRGVidWcgU2luZ2xldGhyZWFkZWQiDQotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KLQ0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xhdXRvZml0XGF1dG9maXQuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmRmXGJkZi5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xjZmZcY2ZmLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRiYXNlLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRiYm94LmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRiZGYuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdGJpdG1hcC5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0Zm50Zm10LmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdGdhc3AuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcY2FjaGVcZnRjYWNoZS5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXGZ0ZGVidWcuYw0KLSMgQUREIENQUCAvWmUNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRnbHlwaC5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0Z3h2YWwuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcZ3ppcFxmdGd6aXAuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdGluaXQuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcbHp3XGZ0bHp3LmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRtbS5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0b3R2YWwuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcYmFzZVxmdHBmci5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0c3Ryb2tlLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnRzeW50aC5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0c3lzdGVtLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXGJhc2VcZnR0eXBlMS5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0d2luZm50LmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHBjZlxwY2YuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNccGZyXHBmci5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xwc2F1eFxwc2F1eC5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xwc2hpbnRlclxwc2hpbnRlci5jDQotIyBTVUJUUkFDVCBDUFAgL0ZyDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXHNyY1xwc25hbWVzXHBzbW9kdWxlLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHJhc3RlclxyYXN0ZXIuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcc2ZudFxzZm50LmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHNtb290aFxzbW9vdGguYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcdHJ1ZXR5cGVcdHJ1ZXR5cGUuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcdHlwZTFcdHlwZTEuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcY2lkXHR5cGUxY2lkLmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5cc3JjXHR5cGU0Mlx0eXBlNDIuYw0KLSMgU1VCVFJBQ1QgQ1BQIC9Gcg0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxzcmNcd2luZm9udHNcd2luZm50LmMNCi0jIFNVQlRSQUNUIENQUCAvRnINCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgRW5kIEdyb3VwDQotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KLQ0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXGluY2x1ZGVcZnQyYnVpbGQuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdGNvbmZpZy5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0aGVhZGVyLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Li5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRtb2R1bGUuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdG9wdGlvbi5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0c3RkbGliLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgRW5kIEdyb3VwDQotIyBFbmQgVGFyZ2V0DQotIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzdyBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0OWU3Ni4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3cKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KLSMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLVByb2plY3Q6ICJmcmVldHlwZSI9LlxmcmVldHlwZS5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KLQ0KLVBhY2thZ2U9PDU+DQote3t7DQotfX19DQotDQotUGFja2FnZT08ND4NCi17e3sNCi19fX0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotR2xvYmFsOg0KLQ0KLVBhY2thZ2U9PDU+DQote3t7DQotfX19DQotDQotUGFja2FnZT08Mz4NCi17e3sNCi19fX0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qIGIvYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjhiM2MxLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDEzODg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KLTxWaXN1YWxTdHVkaW9Qcm9qZWN0DQotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI4LDAwIg0KLQlOYW1lPSJmcmVldHlwZSINCi0JUHJvamVjdEdVSUQ9Ins3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9Ig0KLQk+DQotCTxQbGF0Zm9ybXM+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW4zMiINCi0JCS8+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJLz4NCi0JCTxQbGF0Zm9ybQ0KLQkJCU5hbWU9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJLz4NCi0JCTxQbGF0Zm9ybQ0KLQkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJLz4NCi0JCTxQbGF0Zm9ybQ0KLQkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCS8+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkvPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkvPg0KLQk8L1BsYXRmb3Jtcz4NCi0JPFRvb2xGaWxlcz4NCi0JPC9Ub29sRmlsZXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMiINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4LmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhNVC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0Ig0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOFNULmxpYiINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4TVRfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0iZmFsc2UiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMiINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhNVC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7TkRFQlVHO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9ImZhbHNlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhTVC5saWIiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4X0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4U1RfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhNVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOE1ULmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtOREVCVUc7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0iZmFsc2UiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOFNULmxpYiINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJTbWFydHBob25lIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjMiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJTbWFydHBob25lIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCi0JCQkJR2VuZXJhdGVQcmVwcm9jZXNzZWRGaWxlPSIwIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOE1UX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9ImZhbHNlIg0KLQkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjIiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJmYWxzZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4LmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4TVQubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO05ERUJVRztXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJmYWxzZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4U1QubGliIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMyINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOFNUX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KLQkJCQlHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4TVRfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0iZmFsc2UiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMiINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjgubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhNVC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO05ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7TkRFQlVHO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9ImZhbHNlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9ImZhbHNlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhTVC5saWIiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4X0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4U1RfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhNVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOE1ULmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7TkRFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtOREVCVUc7V0lOMzI7X0xJQjtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0iZmFsc2UiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iZmFsc2UiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOFNULmxpYiINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjMiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Zy8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjhTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtfREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19ERUJVRztfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCi0JCQkJR2VuZXJhdGVQcmVwcm9jZXNzZWRGaWxlPSIwIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOE1UX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9ImZhbHNlIg0KLQkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjIiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJmYWxzZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4LmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4TVQubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRT0kKENFVkVSKTtXSU5DRTtOREVCVUc7JChQTEFURk9STURFRklORVMpOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO05ERUJVRztXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJmYWxzZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJmYWxzZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4U1QubGliIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfTElCO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMyINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8RGVwbG95bWVudFRvb2wNCi0JCQkJRm9yY2VEaXJ0eT0iLTEiDQotCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KLQkJCQlSZWdpc3Rlck91dHB1dD0iMCINCi0JCQkJQWRkaXRpb25hbEZpbGVzPSIiDQotCQkJLz4NCi0JCQk8RGVidWdnZXJUb29sDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U9JChDRVZFUik7V0lOQ0U7X0RFQlVHOyQoUExBVEZPUk1ERUZJTkVTKTskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfREVCVUc7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOFNUX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxEZXBsb3ltZW50VG9vbA0KLQkJCQlGb3JjZURpcnR5PSItMSINCi0JCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQotCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KLQkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCi0JCQkvPg0KLQkJCTxEZWJ1Z2dlclRvb2wNCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFPSQoQ0VWRVIpO1dJTkNFO19ERUJVRzskKFBMQVRGT1JNREVGSU5FUyk7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X0RFQlVHO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KLQkJCQlHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI4TVRfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPERlcGxveW1lbnRUb29sDQotCQkJCUZvcmNlRGlydHk9Ii0xIg0KLQkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCi0JCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQotCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KLQkJCS8+DQotCQkJPERlYnVnZ2VyVG9vbA0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCTwvQ29uZmlndXJhdGlvbnM+DQotCTxSZWZlcmVuY2VzPg0KLQk8L1JlZmVyZW5jZXM+DQotCTxGaWxlcz4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQotCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KLQkJCT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xhdXRvZml0XGF1dG9maXQuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiZGZcYmRmLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGNmZlxjZmYuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJhc2UuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJpdG1hcC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjYWNoZVxmdGNhY2hlLmMiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnRkZWJ1Zy5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2FzcC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRnbHlwaC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xnemlwXGZ0Z3ppcC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0aW5pdC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xsendcZnRsencuYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN0cm9rZS5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzeXN0ZW0uYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcc21vb3RoXHNtb290aC5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsdGVyDQotCQkJCU5hbWU9IkZUX01PRFVMRVMiDQotCQkJCT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiYm94LmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmbnRmbXQuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdG1tLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0cGZyLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRzeW50aC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dHlwZTEuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHdpbmZudC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0bGNkZmlsLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRneHZhbC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0b3R2YWwuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBhdGVudC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwY2ZccGNmLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwZnJccGZyLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc2F1eFxwc2F1eC5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccHNoaW50ZXJccHNoaW50ZXIuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBzbmFtZXNccHNtb2R1bGUuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHJhc3RlclxyYXN0ZXIuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHNmbnRcc2ZudC5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcdHJ1ZXR5cGVcdHJ1ZXR5cGUuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHR5cGUxXHR5cGUxLmMiDQotCQkJCQk+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjaWRcdHlwZTFjaWQuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHR5cGU0Mlx0eXBlNDIuYyINCi0JCQkJCT4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHdpbmZvbnRzXHdpbmZudC5jIg0KLQkJCQkJPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQotCQkJCQkJPg0KLQkJCQkJCTxUb29sDQotCQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KLQkJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KLQkJCQkJCS8+DQotCQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQkJTmFtZT0iUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCi0JCQkJCQk+DQotCQkJCQkJPFRvb2wNCi0JCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQotCQkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQotCQkJCQkJLz4NCi0JCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCQlOYW1lPSJEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KLQkJCQkJCT4NCi0JCQkJCQk8VG9vbA0KLQkJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCi0JCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCi0JCQkJCQkvPg0KLQkJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPC9GaWxlPg0KLQkJCTwvRmlsdGVyPg0KLQkJPC9GaWx0ZXI+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KLQkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCINCi0JCQk+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZ0MmJ1aWxkLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdGNvbmZpZy5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRoZWFkZXIuaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0bW9kdWxlLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdG9wdGlvbi5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRzdGRsaWIuaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sIGIvYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxMDdhZS4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPGh0bWw+Ci08aGVhZGVyPgotPHRpdGxlPgotICBGcmVlVHlwZSZuYnNwOzIgUHJvamVjdCBGaWxlcyBmb3IgVmlzdWFsJm5ic3A7QysrIGFuZCBWUy5ORVQmbmJzcDsyMDA1Ci0gIChQb2NrZXQgUEMpCi08L3RpdGxlPgotCi08Ym9keT4KLTxoMT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZpc3VhbCZuYnNwO0MrKyBhbmQgVlMuTkVUJm5ic3A7MjAwNQotICAoUG9ja2V0IFBDKQotPC9oMT4KLQotPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyBmb3IgVmlzdWFsIEMrKywgbmFtZWQKLTx0dD5mcmVldHlwZS5kc3A8L3R0PiwgYW5kIFZpc3VhbCBTdHVkaW8sIGNhbGxlZCA8dHQ+ZnJlZXR5cGUuc2xuPC90dD4gZm9yCi10aGUgZm9sbG93aW5nIHRhcmdldHM6Ci0KLTx1bD4KLSAgPGxpPlBQQy9TUCAyMDAzIChQb2NrZXQgUEMgMjAwMyk8L2xpPgotICA8bGk+UFBDL1NQIFdNNSAoV2luZG93cyBNb2JpbGUgNSk8L2xpPgotICA8bGk+UFBDL1NQIFdNNiAoV2luZG93cyBNb2JpbGUgNik8L2xpPgotPC91bD4KLQotSXQgY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi44IHNvdXJjZXM6PC9wPgotCi08dWw+Ci0gIDxwcmU+Ci0gICAgZnJlZXR5cGUyOC5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOF9ELmxpYiAgIC0gZGVidWcgYnVpbGQ7ICAgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOE1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI4TVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgotPC91bD4KLQotPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCi1hcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKLXlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKLXRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgotZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgotdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKLWFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KLQotPHA+QnVpbGQgZGlyZWN0b3JpZXMgYXJlIHBsYWNlZCBpbiB0aGUgdG9wLWxldmVsIDx0dD5vYmpzPC90dD4KLWRpcmVjdG9yeS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3czMi1iY2MubWsgYi9idWlsZHMvd2luZG93cy93MzItYmNjLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQzM2IxLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3czMi1iY2MubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgQm9ybGFuZCBDKysgb24gV2luMzIKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0jIGRlZmF1bHQgZGVmaW5pdGlvbnMgb2YgdGhlIGV4cG9ydCBsaXN0Ci0jCi1FWFBPUlRTX0xJU1QgICAgICA9ICQoT0JKX0RJUikvZnJlZXR5cGUuZGVmCi1FWFBPUlRTX09QVElPTlMgICA9IC9ERUY6JChFWFBPUlRTX0xJU1QpCi1BUElOQU1FU19PUFRJT05TIDo9IC1kZnJlZXR5cGUuZGxsIC13QgotCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL3dpbmRvd3Mvd2luMzItZGVmLm1rCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2NvbXBpbGVyL2JjYy5tawotCi0jIGluY2x1ZGUgbGlua2luZyBpbnN0cnVjdGlvbnMKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvbGlua19kb3MubWsKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdzMyLWJjY2QubWsgYi9idWlsZHMvd2luZG93cy93MzItYmNjZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2MzRlNS4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy93MzItYmNjZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBCb3JsYW5kIEMrKyBvbiBXaW4zMiArIGRlYnVnZ2luZwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotREVWRUxfRElSIDo9ICQoVE9QX0RJUikvZGV2ZWwKLQotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy93aW5kb3dzL3dpbjMyLWRlZi5tawotCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2NvbXBpbGVyL2JjYy1kZXYubWsKLQotIyBpbmNsdWRlIGxpbmtpbmcgaW5zdHJ1Y3Rpb25zCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2xpbmtfZG9zLm1rCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3czMi1kZXYubWsgYi9idWlsZHMvd2luZG93cy93MzItZGV2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI5NmU5Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3czMi1kZXYubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBydWxlcyBmb3IgV2luMzIgKyBHQ0MKLSMKLSMgICBEZXZlbG9wbWVudCB2ZXJzaW9uIHdpdGhvdXQgb3B0aW1pemF0aW9ucy4KLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgTk9URTogVGhpcyB2ZXJzaW9uIHJlcXVpcmVzIHRoYXQgR05VIE1ha2UgaXMgaW52b2tlZCBmcm9tIHRoZSBXaW5kb3dzCi0jICAgICAgIFNoZWxsIChfbm90XyBDeWd3aW4gQkFTSCkhCi0jCi0KLURFVkVMX0RJUiA6PSAkKFRPUF9ESVIpL2RldmVsCi0KLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvd2luZG93cy93aW4zMi1kZWYubWsKLQotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci9nY2MtZGV2Lm1rCi0KLSMgaW5jbHVkZSBsaW5raW5nIGluc3RydWN0aW9ucwotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9saW5rX2Rvcy5tawotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy93MzItZ2NjLm1rIGIvYnVpbGRzL3dpbmRvd3MvdzMyLWdjYy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhMGE4Zi4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy93MzItZ2NjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGNvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIFdpbjMyICsgR0NDCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotIyBkZWZhdWx0IGRlZmluaXRpb25zIG9mIHRoZSBleHBvcnQgbGlzdAotIwotRVhQT1JUU19MSVNUICAgICAgPSAkKE9CSl9ESVIpL2ZyZWV0eXBlLmRlZgotRVhQT1JUU19PUFRJT05TICAgPSAkKEVYUE9SVFNfTElTVCkKLUFQSU5BTUVTX09QVElPTlMgOj0gLWRmcmVldHlwZS5kbGwgLXcKLQotIyBpbmNsdWRlIFdpbjMyLXNwZWNpZmljIGRlZmluaXRpb25zCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL3dpbmRvd3Mvd2luMzItZGVmLm1rCi0KLSMgaW5jbHVkZSBnY2Mtc3BlY2lmaWMgZGVmaW5pdGlvbnMKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvY29tcGlsZXIvZ2NjLm1rCi0KLSMgaW5jbHVkZSBsaW5raW5nIGluc3RydWN0aW9ucwotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9saW5rX2Rvcy5tawotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy93MzItaWNjLm1rIGIvYnVpbGRzL3dpbmRvd3MvdzMyLWljYy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmM2RiZi4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy93MzItaWNjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGNvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIFdpbjMyICsgSUJNIFZpc3VhbCBBZ2UgQysrCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotIyBkZWZhdWx0IGRlZmluaXRpb25zIG9mIHRoZSBleHBvcnQgbGlzdAotIwotRVhQT1JUU19MSVNUICAgICAgPSAkKE9CSl9ESVIpL2ZyZWV0eXBlLmRlZgotRVhQT1JUU19PUFRJT05TICAgPSAvREVGOiQoRVhQT1JUU19MSVNUKQotQVBJTkFNRVNfT1BUSU9OUyA6PSAtZGZyZWV0eXBlLmRsbCAtdwotCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL3dpbmRvd3Mvd2luMzItZGVmLm1rCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGFnZS5tawotCi0jIGluY2x1ZGUgbGlua2luZyBpbnN0cnVjdGlvbnMKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvbGlua19kb3MubWsKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdzMyLWludGwubWsgYi9idWlsZHMvd2luZG93cy93MzItaW50bC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0MmJkMy4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy93MzItaW50bC5taworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIHJ1bGVzIGZvciBJbnRlbCBDL0MrKyBvbiBXaW4zMgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLSMgZGVmYXVsdCBkZWZpbml0aW9ucyBvZiB0aGUgZXhwb3J0IGxpc3QKLSMKLUVYUE9SVFNfTElTVCAgICAgID0gJChPQkpfRElSKS9mcmVldHlwZS5kZWYKLUVYUE9SVFNfT1BUSU9OUyAgID0gL0RFRjokKEVYUE9SVFNfTElTVCkKLUFQSU5BTUVTX09QVElPTlMgOj0gLWRmcmVldHlwZS5kbGwgLXcKLQotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy93aW5kb3dzL3dpbjMyLWRlZi5tawotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci9pbnRlbGMubWsKLQotIyBpbmNsdWRlIGxpbmtpbmcgaW5zdHJ1Y3Rpb25zCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2xpbmtfZG9zLm1rCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3czMi1sY2MubWsgYi9idWlsZHMvd2luZG93cy93MzItbGNjLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTA4ZmJiLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3czMi1sY2MubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBydWxlcyBmb3IgV2luMzIgKyBMQ0MKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLVNFUCA6PSAvCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL3dpbmRvd3Mvd2luMzItZGVmLm1rCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2NvbXBpbGVyL3dpbi1sY2MubWsKLQotIyBpbmNsdWRlIGxpbmtpbmcgaW5zdHJ1Y3Rpb25zCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2xpbmtfZG9zLm1rCi0KLSMgRU9GCi0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3czMi1taW5ndzMyLm1rIGIvYnVpbGRzL3dpbmRvd3MvdzMyLW1pbmd3MzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDA4MjMuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdzMyLW1pbmd3MzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBydWxlcyBmb3IgbWluZ3czMgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLSMgZGVmYXVsdCBkZWZpbml0aW9ucyBvZiB0aGUgZXhwb3J0IGxpc3QKLSMKLUVYUE9SVFNfTElTVCAgICAgID0gJChPQkpfRElSKS9mcmVldHlwZS5kZWYKLUVYUE9SVFNfT1BUSU9OUyAgID0gJChFWFBPUlRTX0xJU1QpCi1BUElOQU1FU19PUFRJT05TIDo9IC1kZnJlZXR5cGUuZGxsIC13Ci0KLSMgaW5jbHVkZSBXaW4zMi1zcGVjaWZpYyBkZWZpbml0aW9ucwotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy93aW5kb3dzL3dpbjMyLWRlZi5tawotCi1MSUJSQVJZIDo9IGxpYiQoUFJPSkVDVCkKLQotIyBpbmNsdWRlIGdjYy1zcGVjaWZpYyBkZWZpbml0aW9ucwotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci9nY2MubWsKLQotIyBpbmNsdWRlIGxpbmtpbmcgaW5zdHJ1Y3Rpb25zCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2xpbmtfZG9zLm1rCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3czMi12Y2MubWsgYi9idWlsZHMvd2luZG93cy93MzItdmNjLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJmYzYwLi4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3czMi12Y2MubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgVmlzdWFsIEMrKyBvbiBXaW4zMgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLSMgZGVmaW5pdGlvbnMgb2YgdGhlIGV4cG9ydCBsaXN0Ci0jCi1FWFBPUlRTX0xJU1QgICAgICA9ICQoT0JKX0RJUikvZnJlZXR5cGUuZGVmCi1FWFBPUlRTX09QVElPTlMgICA9IC9ERUY6JChFWFBPUlRTX0xJU1QpCi1BUElOQU1FU19PUFRJT05TIDo9IC1kZnJlZXR5cGUuZGxsIC13Ci0KLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvd2luZG93cy93aW4zMi1kZWYubWsKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvY29tcGlsZXIvdmlzdWFsYy5tawotCi0jIGluY2x1ZGUgbGlua2luZyBpbnN0cnVjdGlvbnMKLWluY2x1ZGUgJChUT1BfRElSKS9idWlsZHMvbGlua19kb3MubWsKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdzMyLXdhdC5tayBiL2J1aWxkcy93aW5kb3dzL3czMi13YXQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjEzOGUuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdzMyLXdhdC5taworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIHJ1bGVzIGZvciBXYXRjb20gQy9DKysKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0jIHJlZGVmaW5lIGV4cG9ydCBzeW1ib2wgZGVmaW5pdGlvbnMKLSMKLUVYUE9SVFNfTElTVCAgICAgID0gJChPQkpfRElSKS93YXRjb20tZnRleHBvcnRzLmxiYwotRVhQT1JUU19PUFRJT05TICAgPSAtXCJleHBvcnQgQCQoRVhQT1JUU19MSVNUKVwiLQotQVBJTkFNRVNfT1BUSU9OUyA6PSAtd1cKLQotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy93aW5kb3dzL3dpbjMyLWRlZi5tawotaW5jbHVkZSAkKFRPUF9ESVIpL2J1aWxkcy9jb21waWxlci93YXRjb20ubWsKLQotIyBpbmNsdWRlIGxpbmtpbmcgaW5zdHJ1Y3Rpb25zCi1pbmNsdWRlICQoVE9QX0RJUikvYnVpbGRzL2xpbmtfZG9zLm1rCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3dpbjMyLWRlZi5tayBiL2J1aWxkcy93aW5kb3dzL3dpbjMyLWRlZi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliZWJkYi4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy93aW4zMi1kZWYubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgV2luMzIgc3BlY2lmaWMgZGVmaW5pdGlvbnMKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLURFTEVURSAgICA6PSBkZWwKLUNBVCAgICAgICA6PSB0eXBlCi1TRVAgICAgICAgOj0gJChzdHJpcCBcICkKLUJVSUxEX0RJUiA6PSAkKFRPUF9ESVIpL2J1aWxkcy93aW5kb3dzCi1QTEFURk9STSAgOj0gd2luZG93cwotCi0jIFRoZSBleGVjdXRhYmxlIGZpbGUgZXh0ZW5zaW9uIChmb3IgdG9vbHMpLiBOT1RFOiBXRSBJTkNMVURFIFRIRSBET1QgSEVSRSAhIQotIwotRSA6PSAuZXhlCi1FX0JVSUxEIDo9IC5leGUKLQotCi0jIFRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGxpYnJhcnkgZmlsZXMgYXJlIHBsYWNlZC4KLSMKLSMgQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgc2FtZSBhcyAkKE9CSl9ESVIpOyBob3dldmVyLCB0aGlzIGNhbiBiZSBjaGFuZ2VkCi0jIHRvIHN1aXQgcGFydGljdWxhciBuZWVkcy4KLSMKLUxJQl9ESVIgOj0gJChPQkpfRElSKQotCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGZpbmFsIGxpYnJhcnkgZmlsZS4gIE5vdGUgdGhhdCB0aGUgRE9TLXNwZWNpZmljIE1ha2VmaWxlCi0jIHVzZXMgYSBzaG9ydGVyICg4LjMpIG5hbWUuCi0jCi1MSUJSQVJZIDo9ICQoUFJPSkVDVCkKLQotCi0jIFRoZSBOT19PVVRQVVQgbWFjcm8gaXMgdXNlZCB0byBpZ25vcmUgdGhlIG91dHB1dCBvZiBjb21tYW5kcy4KLSMKLU5PX09VVFBVVCA9IDI+IG51bAotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9nbHlwaHRlc3QvY29tcGFyZS1uZXctdG8tb2xkLmMgYi9jb21wYXJlLW5ldy10by1vbGQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ2x5cGh0ZXN0L2NvbXBhcmUtbmV3LXRvLW9sZC5jCnJlbmFtZSB0byBjb21wYXJlLW5ldy10by1vbGQuYwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OGRiZDk5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgQ29weXJpZ2h0IDIwMDItMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0jCi0jCi0jIENhbGwgdGhlIGBjb25maWd1cmUnIHNjcmlwdCBsb2NhdGVkIGluIGBidWlsZHMvdW5peCcuCi0jCi0KLXJtIC1mIGNvbmZpZy5tayBidWlsZHMvdW5peC91bml4LWRlZi5tayBidWlsZHMvdW5peC91bml4LWNjLm1rCi0KLSMgcmVzcGVjdCBHTlVNQUtFIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci1pZiB0ZXN0ICJ4JEdOVU1BS0UiID0geDsgdGhlbgotICBpZiB0ZXN0ICJ4JE1BS0UiID0geDsgdGhlbgotICAgIGlmIHRlc3QgInhgbWFrZSAtdiAyPi9kZXYvbnVsbCB8IGVncmVwICdHTlV8bWFrZXBwJ2AiID0geDsgdGhlbgotICAgICAgTUFLRT1nbWFrZQotICAgIGVsc2UKLSAgICAgIE1BS0U9bWFrZQotICAgIGZpCi0gIGZpCi1lbHNlCi0gIE1BS0U9JEdOVU1BS0UKLWZpCi0KLWlmIHRlc3QgInhgJE1BS0UgLXYgMj4vZGV2L251bGwgfCBlZ3JlcCAnR05VfG1ha2VwcCdgIiA9IHg7IHRoZW4KLSAgZWNobyAiR05VIG1ha2UgKD49IDMuODApIG9yIG1ha2VwcCAoPj0gMS4xOSkgaXMgcmVxdWlyZWQgdG8gYnVpbGQgRnJlZVR5cGUyLiIgPiYyCi0gIGVjaG8gIlBsZWFzZSB0cnkiID4mMgotICBlY2hvID4mMgotICBlY2hvICIgIE1BS0U9PEdOVSBtYWtlIGNvbW1hbmQgbmFtZT4gJDAiID4mMgotICBlY2hvID4mMgotICBlY2hvICJvciIgPiYyCi0gIGVjaG8gPiYyCi0gIGVjaG8gIiAgTUFLRT1cIm1ha2VwcCAtLW5vcmMtc3Vic3RpdHV0aW9uXCIgJDAiID4mMgotICBleGl0IDEKLWZpCi0KLSMgR2V0IGBkaXJuYW1lJyBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpcyB0YWtlbiBhbmQgYWRhcHRlZCBmcm9tIGF1dG9jb25mJ3MKLSMgbTRzaC5tNCAoX0FTX0VYUFJfUFJFUEFSRSwgQVNfRElSTkFNRV9FWFBSLCBhbmQgQVNfRElSTkFNRV9TRUQpLgotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBmdF9leHByPWV4cHIKLWVsc2UKLSAgZnRfZXhwcj1mYWxzZQotZmkKLQotZnQyX2Rpcj1gKGRpcm5hbWUgIiQwIikgMj4vZGV2L251bGwgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICRmdF9leHByIFgiJDAiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0gICAgICAgICAgICAgICAgICBYIiQwIiA6ICdYXCgvL1wpW14vXScgXHwgXAotICAgICAgICAgICAgICAgICAgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLSAgICAgICAgICAgICAgICAgIFgiJDAiIDogJ1hcKC9cKScgXHwgXAotICAgICAgICAgICAgICAgICAgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGVjaG8gWCIkMCIgfAotICAgICAgICAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotICAgICAgICAgICAgICAgICAgcy8vXDEvCi0gICAgICAgICAgICAgICAgICBxCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC9eWFwoXC9cL1wpW14vXS4qL3sKLSAgICAgICAgICAgICAgICAgIHMvL1wxLwotICAgICAgICAgICAgICAgICAgcQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvXlhcKFwvXC9cKSQvewotICAgICAgICAgICAgICAgICAgcy8vXDEvCi0gICAgICAgICAgICAgICAgICBxCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC9eWFwoXC9cKS4qL3sKLSAgICAgICAgICAgICAgICAgIHMvL1wxLwotICAgICAgICAgICAgICAgICAgcQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzLy4qLy4vOyBxJ2AKLQotYWJzX2N1cnJfZGlyPWBwd2RgCi1hYnNfZnQyX2Rpcj1gY2QgIiRmdDJfZGlyIiAmJiBwd2RgCi0KLSMgYC0tc3JjZGlyPScgb3B0aW9uIGNhbiBvdmVycmlkZSBhYnNfZnQyX2RpcgotCi1pZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gIGZvciB4IGluICIkQCI7IGRvCi0gICAgY2FzZSB4IiR4IiBpbgotICAgIHgtLXNyY2Rpcj0qKQotICAgICAgYWJzX2Z0Ml9kaXI9YGVjaG8gJHggfCBzZWQgJ3MvXi0tc3JjZGlyPS8vJ2AgOzsKLSAgICBlc2FjCi0gIGRvbmUKLWZpCi0KLSMgYnVpbGQgYSBkdW1teSBNYWtlZmlsZSBpZiB3ZSBhcmUgbm90IGJ1aWxkaW5nIGluIHRoZSBzb3VyY2UgdHJlZTsKLSMgd2UgdXNlIGlub2RlcyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBzeW1ib2xpYyBsaW5rcwotaW5vZGVfc3JjPWBscyAtaWQgJGFic19mdDJfZGlyIHwgYXdrICd7cHJpbnQgJDF9J2AKLWlub2RlX2RzdD1gbHMgLWlkICRhYnNfY3Vycl9kaXIgfCBhd2sgJ3twcmludCAkMX0nYAotCi1pZiB0ZXN0ICRpbm9kZV9zcmMgLW5lICRpbm9kZV9kc3Q7IHRoZW4KLSAgaWYgdGVzdCAhIC1kIHJlZmVyZW5jZTsgdGhlbgotICAgIG1rZGlyIHJlZmVyZW5jZQotICBmaQotICBpZiB0ZXN0ICEgLXIgJGFic19jdXJyX2Rpci9tb2R1bGVzLmNmZzsgdGhlbgotICAgIGVjaG8gIkNvcHlpbmcgXGBtb2R1bGVzLmNmZyciCi0gICAgY3AgJGFic19mdDJfZGlyL21vZHVsZXMuY2ZnICRhYnNfY3Vycl9kaXIKLSAgZmkKLSAgZWNobyAiR2VuZXJhdGluZyBcYE1ha2VmaWxlJyIKLSAgZWNobyAiVE9QX0RJUiAgICAgICAgOj0gJGFic19mdDJfZGlyIiAgICAgICAgICAgPiBNYWtlZmlsZQotICBlY2hvICJPQkpfRElSICAgICAgICA6PSAkYWJzX2N1cnJfZGlyIiAgICAgICAgID4+IE1ha2VmaWxlCi0gIGVjaG8gIk9CSl9CVUlMRCAgICAgIDo9IFwkKE9CSl9ESVIpIiAgICAgICAgICAgPj4gTWFrZWZpbGUKLSAgZWNobyAiRE9DX0RJUiAgICAgICAgOj0gXCQoT0JKX0RJUikvcmVmZXJlbmNlIiA+PiBNYWtlZmlsZQotICBlY2hvICJGVF9MSUJUT09MX0RJUiA6PSBcJChPQkpfRElSKSIgICAgICAgICAgID4+IE1ha2VmaWxlCi0gIGVjaG8gImlmbmRlZiBGVDJERU1PUyIgICAgICAgICAgICAgICAgICAgICAgICAgPj4gTWFrZWZpbGUKLSAgZWNobyAiICBpbmNsdWRlIFwkKFRPUF9ESVIpL01ha2VmaWxlIiAgICAgICAgICA+PiBNYWtlZmlsZQotICBlY2hvICJlbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IE1ha2VmaWxlCi0gIGVjaG8gIiAgVE9QX0RJUl8yIDo9IFwkKFRPUF9ESVIpLy4uL2Z0MmRlbW9zIiAgPj4gTWFrZWZpbGUKLSAgZWNobyAiICBQUk9KRUNUICAgOj0gZnJlZXR5cGUiICAgICAgICAgICAgICAgICA+PiBNYWtlZmlsZQotICBlY2hvICIgIENPTkZJR19NSyA6PSBcJChPQkpfRElSKS9jb25maWcubWsiICAgID4+IE1ha2VmaWxlCi0gIGVjaG8gIiAgaW5jbHVkZSBcJChUT1BfRElSXzIpL01ha2VmaWxlIiAgICAgICAgPj4gTWFrZWZpbGUKLSAgZWNobyAiZW5kaWYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBNYWtlZmlsZQotZmkKLQotIyBjYWxsIG1ha2UKLQotQ0ZHPQotIyB3b3JrIGFyb3VuZCB6c2ggYnVnIHdoaWNoIGRvZXNuJ3QgbGlrZSBgJHsxKyIkQCJ9JwotY2FzZSAkIyBpbgotMCkgOzsKLSopIGZvciB4IGluICIkQCI7IGRvCi0gICAgIGNhc2UgeCIkeCIgaW4KLSAgICAgeC0tc3JjZGlyPSogKSBDRkc9IiRDRkcgJyR4Jy9idWlsZHMvdW5peCIgOzsKLSAgICAgKikgQ0ZHPSIkQ0ZHICckeCciIDs7Ci0gICAgIGVzYWMKLSAgIGRvbmUgOzsKLWVzYWMKLUNGRz0kQ0ZHICRNQUtFIHNldHVwIHVuaXgKLQotIyBlb2YKZGlmZiAtLWdpdCBhL2RldmVsL2Z0MmJ1aWxkLmggYi9kZXZlbC9mdDJidWlsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODA1Y2Y5Li4wMDAwMDAwCi0tLSBhL2RldmVsL2Z0MmJ1aWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdDJidWlsZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgMiBidWlsZCBhbmQgc2V0dXAgbWFjcm9zIChkZXZlbG9wbWVudCB2ZXJzaW9uKS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAvKgotICAqICBUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiA8ZnQyYnVpbGQuaD4gdG8gYnVpbGQgdGhlIGxpYnJhcnkgaW4KLSAgKiAgZGVidWcgbW9kZS4gIEl0cyBvbmx5IGRpZmZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgdmVyc2lvbiBpcyB0aGF0IGl0Ci0gICogIGluY2x1ZGVzIGEgbG9jYWwgYGZ0b3B0aW9uLmgnIGhlYWRlciBmaWxlIHdpdGggZGlmZmVyZW50IHNldHRpbmdzIGZvcgotICAqICBtYW55IGNvbmZpZ3VyYXRpb24gbWFjcm9zLgotICAqCi0gICogIFRvIHVzZSBpdCwgc2ltcGx5IGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIGZpbGUgaXMKLSAgKiAgc2Nhbm5lZCBieSB0aGUgY29tcGlsZXIgYmVmb3JlIHRoZSBkZWZhdWx0IEZyZWVUeXBlIGhlYWRlciBkaXJlY3RvcnkuCi0gICoKLSAgKi8KLQotI2lmbmRlZiBGVDJCVUlMRF9IXwotI2RlZmluZSBGVDJCVUlMRF9IXwotCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggIDxmdG9wdGlvbi5oPgotCi0jaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmg+Ci0KLSNlbmRpZiAvKiBGVDJCVUlMRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvZGV2ZWwvZnRvcHRpb24uaCBiL2RldmVsL2Z0b3B0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjYxZTcuLjAwMDAwMDAKLS0tIGEvZGV2ZWwvZnRvcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDk2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG9wdGlvbi5oIChmb3IgZGV2ZWxvcG1lbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVXNlci1zZWxlY3RhYmxlIGNvbmZpZ3VyYXRpb24gbWFjcm9zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRPUFRJT05fSF8KLSNkZWZpbmUgRlRPUFRJT05fSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBVU0VSLVNFTEVDVEFCTEUgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbWFjcm8gZGVmaW5pdGlvbnMgZm9yICAgICovCi0gIC8qIGEgc3RhbmRhcmQgYnVpbGQgb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byAgICAqLwotICAvKiB1c2UgdGhpcyBmaWxlIHRvIGJ1aWxkIHByb2plY3Qtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnk6ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFlvdSBjYW4gbW9kaWZ5IHRoaXMgZmlsZSBieSBoYW5kLCBidXQgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQgaW4gICAqLwotICAvKiAgICBjYXNlcyB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSBmcm9tIGEgc2luZ2xlIHNvdXJjZSBkaXJlY3RvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBZb3UgY2FuIHB1dCBhIGNvcHkgb2YgdGhpcyBmaWxlIGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LCBtb3JlICAgICAgKi8KLSAgLyogICAgcHJlY2lzZWx5IGluIGAkQlVJTEQvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgnLCB3aGVyZSBgJEJVSUxEJyAgICovCi0gIC8qICAgIGlzIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IHRoYXQgaXMgaW5jbHVkZWQgX2JlZm9yZV8gdGhlIEZyZWVUeXBlICAqLwotICAvKiAgICBpbmNsdWRlIHBhdGggZHVyaW5nIGNvbXBpbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZhdWx0IEZyZWVUeXBlIE1ha2VmaWxlcyBhbmQgSmFtZmlsZXMgdXNlIHRoZSBidWlsZCAgICAgICAgICAqLwotICAvKiAgICBkaXJlY3RvcnkgYGJ1aWxkcy88c3lzdGVtPicgYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4gZWFzaWx5IGNoYW5nZSAgKi8KLSAgLyogICAgdGhhdCBmb3IgeW91ciBvd24gcHJvamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBDb3B5IHRoZSBmaWxlIDxmdDJidWlsZC5oPiB0byBgJEJVSUxEL2Z0MmJ1aWxkLmgnIGFuZCBtb2RpZnkgaXQgICAgKi8KLSAgLyogICAgc2xpZ2h0bHkgdG8gcHJlLWRlZmluZSB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTlNfSCB1c2VkIHRvICAgICAgICovCi0gIC8qICAgIGxvY2F0ZSB0aGlzIGZpbGUgZHVyaW5nIHRoZSBidWlsZC4gIEZvciBleGFtcGxlLCAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggIDxteWZ0b3B0aW9ucy5oPiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lsbCB1c2UgYCRCVUlMRC9teWZ0b3B0aW9ucy5oJyBpbnN0ZWFkIG9mIHRoaXMgZmlsZSBmb3IgbWFjcm8gICAgICovCi0gIC8qICAgIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzaW1pbGFybHkgcHJlLWRlZmluZSB0aGUgbWFjcm8gICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NPTkZJR19NT0RVTEVTX0ggdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgbGlzdGluZyBvZiB0aGUgbW9kdWxlcyAqLwotICAvKiAgICB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCB0byB0aGUgbGlicmFyeSBhdCBjb21waWxlIHRpbWUuICBCeSAgICAgKi8KLSAgLyogICAgZGVmYXVsdCwgdGhpcyBmaWxlIGlzIDxmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaD4uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBoaWdobHkgcmVjb21tZW5kIHVzaW5nIHRoZSB0aGlyZCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogRyBFIE4gRSBSIEEgTCAgIEYgUiBFIEUgVCBZIFAgRSAgIDIgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHlvdSBlbmFibGUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiwgRnJlZVR5cGUgcmVjb2duaXplcyBhbiAgICAgICAqLwotICAvKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYWxsZWQgYEZSRUVUWVBFX1BST1BFUlRJRVMnLCB3aGljaCBjYW4gYmUgdXNlZCAgKi8KLSAgLyogdG8gY29udHJvbCB0aGUgdmFyaW91cyBmb250IGRyaXZlcnMgYW5kIG1vZHVsZXMuICBUaGUgY29udHJvbGxhYmxlICAgICovCi0gIC8qIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBpbiB0aGUgc2VjdGlvbiBgQ29udHJvbGxpbmcgRnJlZVR5cGUgTW9kdWxlcycgICAqLwotICAvKiBpbiB0aGUgcmVmZXJlbmNlJ3MgdGFibGUgb2YgY29udGVudHM7IGN1cnJlbnRseSB0aGVyZSBhcmUgcHJvcGVydGllcyAgKi8KLSAgLyogZm9yIHRoZSBhdXRvLWhpbnRlciAoZmlsZSBgZnRhdXRvaC5oJyksIENGRiAoZmlsZSBgZnRjZmZkcnYuaCcpLCAgICAgICovCi0gIC8qIFRydWVUeXBlIChmaWxlIGBmdHR0ZHJ2LmgnKSwgYW5kIFBDRiAoZmlsZSBgZnRwY2ZkcnYuaCcpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYEZSRUVUWVBFX1BST1BFUlRJRVMnIGhhcyB0aGUgZm9sbG93aW5nIHN5bnRheCBmb3JtIChicm9rZW4gaGVyZSBpbnRvICovCi0gIC8qIG11bHRpcGxlIGxpbmVzIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICA8b3B0aW9uYWwgd2hpdGVzcGFjZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgPG1vZHVsZS1uYW1lMT4gJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDxwcm9wZXJ0eS1uYW1lMT4gJz0nIDxwcm9wZXJ0eS12YWx1ZTE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICA8d2hpdGVzcGFjZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgPG1vZHVsZS1uYW1lMj4gJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDxwcm9wZXJ0eS1uYW1lMj4gJz0nIDxwcm9wZXJ0eS12YWx1ZTI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlJFRVRZUEVfUFJPUEVSVElFUz10cnVldHlwZTppbnRlcnByZXRlci12ZXJzaW9uPTM1IFwgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgY2ZmOm5vLXN0ZW0tZGFya2VuaW5nPTEgXCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGF1dG9maXR0ZXI6d2FycGluZz0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3YW50IHRvIGFjdGl2YXRlIHN1Yi1waXhlbCByZW5kZXJpbmcgICovCi0gIC8qIChhLmsuYS4gTENEIHJlbmRlcmluZywgb3IgQ2xlYXJUeXBlKSBpbiB0aGlzIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBjb3ZlcmVkIGJ5IHNldmVyYWwgTWljcm9zb2Z0IHBhdGVudHMgICAgICAgICovCi0gIC8qIGFuZCBzaG91bGQgbm90IGJlIGFjdGl2YXRlZCBpbiBhbnkgZGVmYXVsdCBidWlsZCBvZiB0aGUgbGlicmFyeS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtYWNybyBoYXMgbm8gaW1wYWN0IG9uIHRoZSBGcmVlVHlwZSBBUEksIG9ubHkgb24gaXRzICAgICAgICAgICAgICovCi0gIC8qIF9pbXBsZW1lbnRhdGlvbl8uICBGb3IgZXhhbXBsZSwgdXNpbmcgRlRfUkVOREVSX01PREVfTENEIHdoZW4gY2FsbGluZyAqLwotICAvKiBGVF9SZW5kZXJfR2x5cGggc3RpbGwgZ2VuZXJhdGVzIGEgYml0bWFwIHRoYXQgaXMgMyB0aW1lcyB3aWRlciB0aGFuICAgKi8KLSAgLyogdGhlIG9yaWdpbmFsIHNpemUgaW4gY2FzZSB0aGlzIG1hY3JvIGlzbid0IGRlZmluZWQ7IGhvd2V2ZXIsIGVhY2ggICAgICovCi0gIC8qIHRyaXBsZXQgb2Ygc3VicGl4ZWxzIGhhcyBSPUc9Qi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyBkb25lIHRvIGFsbG93IEZyZWVUeXBlIGNsaWVudHMgdG8gcnVuIHVubW9kaWZpZWQsIGZvcmNpbmcgICAgICovCi0gIC8qIHRoZW0gdG8gZGlzcGxheSBub3JtYWwgZ3JheS1sZXZlbCBhbnRpLWFsaWFzZWQgZ2x5cGhzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWFueSBjb21waWxlcnMgcHJvdmlkZSBhIG5vbi1BTlNJIDY0LWJpdCBkYXRhIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCAgICovCi0gIC8qIGJ5IEZyZWVUeXBlIHRvIHNwZWVkIHVwIHNvbWUgY29tcHV0YXRpb25zLiAgSG93ZXZlciwgdGhpcyB3aWxsIGNyZWF0ZSAqLwotICAvKiBzb21lIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGluIHN0cmljdCBBTlNJIG1vZGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciB0aGlzIHJlYXNvbiwgdGhlIHVzZSBvZiA2NC1iaXQgaW50ZWdlcnMgaXMgbm9ybWFsbHkgZGlzYWJsZWQgd2hlbiAqLwotICAvKiB0aGUgX19TVERDX18gbWFjcm8gaXMgZGVmaW5lZC4gIFlvdSBjYW4gaG93ZXZlciBkaXNhYmxlIHRoaXMgYnkgICAgICAgKi8KLSAgLyogZGVmaW5pbmcgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgaGVyZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3IgbW9zdCBjb21waWxlcnMsIHRoaXMgd2lsbCBvbmx5IGNyZWF0ZSBjb21waWxhdGlvbiB3YXJuaW5ncyB3aGVuICAgKi8KLSAgLyogYnVpbGRpbmcgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPYk5vdGU6IFRoZSBjb21waWxlci1zcGVjaWZpYyA2NC1iaXQgaW50ZWdlcnMgYXJlIGRldGVjdGVkIGluIHRoZSAgICAgKi8KLSAgLyogICAgICAgICBmaWxlIGBmdGNvbmZpZy5oJyBlaXRoZXIgc3RhdGljYWxseSBvciB0aHJvdWdoIHRoZSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgYGNvbmZpZ3VyZScgc2NyaXB0IG9uIHN1cHBvcnRlZCBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgZG8gbm90IHRyeSB0byB1c2UgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgICAqLwotICAvKiBwZXJmb3JtYW5jZS1jcml0aWNhbCBmdW5jdGlvbnMgKGUuZy4gRlRfTXVsRml4KS4gIFlvdSBzaG91bGQgb25seSBkbyAgKi8KLSAgLyogdGhhdCB0byB2ZXJpZnkgdGhhdCB0aGUgYXNzZW1ibGVyIGZ1bmN0aW9uIHdvcmtzIHByb3Blcmx5LCBvciB0byAgICAgICovCi0gIC8qIGV4ZWN1dGUgYmVuY2htYXJrIHRlc3RzIG9mIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucy4gICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIHRyeSB0byB1c2UgYW4gaW5saW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiAgKi8KLSAgLyogdGhlIGBGVF9NdWxGaXgnIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGBob3RzcG90JyB3aGVuIGxvYWRpbmcgYW5kICAgICAgICovCi0gIC8qIGhpbnRpbmcgZ2x5cGhzLCBhbmQgd2hpY2ggc2hvdWxkIGJlIGV4ZWN1dGVkIGFzIGZhc3QgYXMgcG9zc2libGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IGlmIHlvdXIgY29tcGlsZXIgb3IgQ1BVIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgd2lsbCBkZWZhdWx0ICovCi0gIC8qIHRvIHRoZSBzdGFuZGFyZCBhbmQgcG9ydGFibGUgaW1wbGVtZW50YXRpb24gZm91bmQgaW4gYGZ0Y2FsYy5jJy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9JTkxJTkVfTVVMRklYCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIExaVy1jb21wcmVzc2VkIGZpbGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCi0gIC8qICAgYGNvbXByZXNzJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgICAqLwotICAvKiAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgWDExIGRpc3RyaWJ1dGlvbnMuICBUaGUgaW1wbGVtZW50YXRpb24gKi8KLSAgLyogICB1c2VzIE5ldEJTRCdzIGB6b3BlbicgdG8gcGFydGlhbGx5IHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAgICovCi0gIC8qICAgKHNlZSBzcmMvbHp3L2Z0Z3ppcC5jKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9MWlcKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR3ppcC1jb21wcmVzc2VkIGZpbGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KLSAgLyogICBgZ3ppcCcgcHJvZ3JhbS4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gcGFyc2UgbWFueSBvZiB0aGUgUENGIGZpbGVzICovCi0gIC8qICAgdGhhdCBjb21lIHdpdGggWEZyZWU4Ni4gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGB6bGliJyB0byAgICAgICAgICAqLwotICAvKiAgIHBhcnRpYWxseSB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgKHNlZSBzcmMvZ3ppcC9mdGd6aXAuYykuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgU2VlIGFsc28gICAqLwotICAvKiAgIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWkxpYiBsaWJyYXJ5IHNlbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gaXMgb25seSB1c2VkIHdoZW4gRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQiBpcyBkZWZpbmVkLiAgKi8KLSAgLyogICBJdCBhbGxvd3MgRnJlZVR5cGUncyBgZnRnemlwJyBjb21wb25lbnQgdG8gbGluayB0byB0aGUgc3lzdGVtJ3MgICAgICovCi0gIC8qICAgaW5zdGFsbGF0aW9uIG9mIHRoZSBaTGliIGxpYnJhcnkuICBUaGlzIGlzIHVzZWZ1bCBvbiBzeXN0ZW1zIGxpa2UgICAqLwotICAvKiAgIFVuaXggb3IgVk1TIHdoZXJlIGl0IGdlbmVyYWxseSBpcyBhbHJlYWR5IGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgeW91IGxldCBpdCB1bmRlZmluZWQsIHRoZSBjb21wb25lbnQgd2lsbCB1c2UgaXRzIG93biBjb3B5ICAgICAgICAqLwotICAvKiAgIG9mIHRoZSB6bGliIHNvdXJjZXMgaW5zdGVhZC4gIFRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZCB0byBiZSAgICAgICAgKi8KLSAgLyogICBpbmNsdWRlZCBkaXJlY3RseSB3aXRoaW4gdGhlIGNvbXBvbmVudCBhbmQgKm5vdCogZXhwb3J0IGV4dGVybmFsICAgICovCi0gIC8qICAgZnVuY3Rpb24gbmFtZXMuICBUaGlzIGFsbG93cyB5b3UgdG8gbGluayBhbnkgcHJvZ3JhbSB3aXRoIEZyZWVUeXBlICAqLwotICAvKiAgIF9hbmRfIFpMaWIgd2l0aG91dCBsaW5raW5nIGNvbmZsaWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGlzIG1hY3JvIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgICAqLwotICAvKiAgIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnppcDItY29tcHJlc3NlZCBmaWxlIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KLSAgLyogICBgYnppcDInIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiAgICAgICovCi0gIC8qICAgZmlsZXMgdGhhdCBjb21lIHdpdGggWEZyZWU4Ni4gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGBsaWJiejInIHRvICAqLwotICAvKiAgIHBhcnRpYWxseSB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgKHNlZSBzcmMvYnppcDIvZnRiemlwMi5jKS4gKi8KLSAgLyogICBDb250cmFyeSB0byBnemlwLCBiemlwMiBjdXJyZW50bHkgaXMgbm90IGluY2x1ZGVkIGFuZCBuZWVkIHRvIHVzZSAgICovCi0gIC8qICAgdGhlIHN5c3RlbSBhdmFpbGFibGUgYnppcDIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIGZpbGUgc3RyZWFtIGZ1bmN0aW9ucyBhbmQgdHlwZXMsIEZJTEUsICAgKi8KLSAgLyogZm9wZW4oKSBldGMuICBFbmFibGVzIHRoZSB1c2Ugb2Ygc21hbGxlciBzeXN0ZW0gbGlicmFyaWVzIG9uIGVtYmVkZGVkICovCi0gIC8qIHN5c3RlbXMgdGhhdCBoYXZlIG11bHRpcGxlIHN5c3RlbSBsaWJyYXJpZXMsIHNvbWUgd2l0aCBvciB3aXRob3V0ICAgICAqLwotICAvKiBmaWxlIHN0cmVhbSBzdXBwb3J0LCBpbiB0aGUgY2FzZXMgd2hlcmUgZmlsZSBzdHJlYW0gc3VwcG9ydCBpcyBub3QgICAgKi8KLSAgLyogbmVjZXNzYXJ5IHN1Y2ggYXMgbWVtb3J5IGxvYWRpbmcgb2YgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0RJU0FCTEVfU1RSRUFNX1NVUFBPUlQgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUE5HIGJpdG1hcCBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGxvYWRpbmcgY29sb3IgYml0bWFwIGdseXBocyBpbiB0aGUgUE5HIGZvcm1hdC4gKi8KLSAgLyogICBUaGlzIHJlcXVpcmVzIGhlbHAgZnJvbSB0aGUgZXh0ZXJuYWwgbGlicG5nIGxpYnJhcnkuICBVbmNvbXByZXNzZWQgICovCi0gIC8qICAgY29sb3IgYml0bWFwcyBkbyBub3QgbmVlZCBhbnkgZXh0ZXJuYWwgbGlicmFyaWVzIGFuZCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgIHN1cHBvcnRlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfUE5HCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhhcmZCdXp6IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSB1c2VzIHRoZSBIYXJmQnV6eiBsaWJyYXJ5IHRvIGltcHJvdmUgYXV0by1oaW50aW5nIG9mICAgICAgICovCi0gIC8qICAgT3BlblR5cGUgZm9udHMuICBJZiBhdmFpbGFibGUsIG1hbnkgZ2x5cGhzIG5vdCBkaXJlY3RseSBhZGRyZXNzYWJsZSAqLwotICAvKiAgIGJ5IGEgZm9udCdzIGNoYXJhY3RlciBtYXAgd2lsbCBiZSBoaW50ZWQgYWxzby4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWloKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRExMIGV4cG9ydCBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdoZW4gY29tcGlsaW5nIEZyZWVUeXBlIGFzIGEgRExMLCBzb21lIHN5c3RlbXMvY29tcGlsZXJzIG5lZWQgYSAgICAgKi8KLSAgLyogICBzcGVjaWFsIGtleXdvcmQgaW4gZnJvbnQgT1IgYWZ0ZXIgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uICAgICAgICovCi0gIC8qICAgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUd28gbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUgdG8gZGVmaW5lICAgICAgICovCi0gIC8qICAgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnM6IEZUX0VYUE9SVCBhbmQgRlRfRVhQT1JUX0RFRi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VYUE9SVCggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGFzIGluICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfRVhQT1JUKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVhQT1JUX0RFRiggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uLCBhcyBpbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSogIGFsaWJyYXJ5ICkgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IGNhbiBwcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIEZUX0VYUE9SVCBhbmQgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VYUE9SVF9ERUYgaGVyZSBpZiB5b3Ugd2FudC4gIElmIHlvdSBsZWF2ZSB0aGVtIHVuZGVmaW5lZCwgdGhleSAgKi8KLSAgLyogICB3aWxsIGJlIGxhdGVyIGF1dG9tYXRpY2FsbHkgZGVmaW5lZCBhcyBgZXh0ZXJuIHJldHVybl90eXBlJyB0byAgICAgICovCi0gIC8qICAgYWxsb3cgbm9ybWFsIGNvbXBpbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICovCi0gIC8qICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfRVhQT1JUKHgpICAgICAgZXh0ZXJuIHggKi8KLS8qICNkZWZpbmUgRlRfRVhQT1JUX0RFRih4KSAgeCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHbHlwaCBQb3N0c2NyaXB0IE5hbWVzIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBjb21waWxlZCB3aXRoIHRoZSBgcHNuYW1lcycgbW9kdWxlLiAgVGhpcyAqLwotICAvKiAgIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoIG5hbWUgc3RyaW5nIGludG8gYSAgICAgICAgKi8KLSAgLyogICBVbmljb2RlIHZhbHVlLCBvciByZXR1cm4gYSBNYWNpbnRvc2ggc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3IgdGhlICAgICovCi0gIC8qICAgdXNlIHdpdGggdGhlIFRydWVUeXBlIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBVbmRlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSBkbyBub3Qgd2FudCBgcHNuYW1lcycgY29tcGlsZWQgaW4geW91ciAgICovCi0gIC8qICAgYnVpbGQgb2YgRnJlZVR5cGUuICBUaGlzIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6ICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIFRoZSBUcnVlVHlwZSBkcml2ZXIgd2lsbCBwcm92aWRlIGl0cyBvd24gc2V0IG9mIGdseXBoIG5hbWVzLCAgICAgICovCi0gIC8qICAgICBpZiB5b3UgYnVpbGQgaXQgdG8gc3VwcG9ydCBwb3N0c2NyaXB0IG5hbWVzIGluIHRoZSBUcnVlVHlwZSAgICAgICAqLwotICAvKiAgICAgYHBvc3QnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlICAgICAgICAqLwotICAvKiAgICAgY2hhcm1hcCBvdXQgb2YgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IHdvdWxkIG5vcm1hbGx5IHVuZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuIGJ1aWxkaW5nICAqLwotICAvKiAgIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIFR5cGUgMSBvciBDRkYgZHJpdmVyLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3N0c2NyaXB0IE5hbWVzIHRvIFVuaWNvZGUgVmFsdWVzIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBidWlsdCB3aXRoIHRoZSBgUFNOYW1lcycgbW9kdWxlIGNvbXBpbGVkICAqLwotICAvKiAgIGluLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgbW9kdWxlIGlzIHVzZWQgdG8gY29udmVydCBhIGdseXBoIG5hbWUgKi8KLSAgLyogICBpbnRvIGEgVW5pY29kZSB2YWx1ZS4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gb3JkZXIgdG8gICAgICAgICovCi0gIC8qICAgc3ludGhlc2l6ZSBvbiB0aGUgZmx5IGEgVW5pY29kZSBjaGFybWFwIGZyb20gdGhlIENGRi9UeXBlIDEgZHJpdmVyICAqLwotICAvKiAgIHRocm91Z2ggYSBiaWcgdGFibGUgbmFtZWQgdGhlIGBBZG9iZSBHbHlwaCBMaXN0JyAoQUdMKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgdGhlIEFkb2JlIEdseXBoIExpc3QgICAgICAgICAqLwotICAvKiAgIGNvbXBpbGVkIGluIHlvdXIgYFBTTmFtZXMnIG1vZHVsZS4gIFRoZSBUeXBlIDEgZHJpdmVyIHdpbGwgbm90IGJlICAgKi8KLSAgLyogICBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlICovCi0gIC8qICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN1cHBvcnQgZm9yIE1hYyBmb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBvdXRsaW5lIGZvbnRzIGluIE1hYyAgICAgICovCi0gIC8qICAgZm9ybWF0IChtYWMgZGZvbnQsIG1hYyByZXNvdXJjZSwgbWFjYmluYXJ5IGNvbnRhaW5pbmcgYSBtYWMgICAgICAgICAqLwotICAvKiAgIHJlc291cmNlKSBvbiBub24tTWFjIHBsYXRmb3Jtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IHRoZSBgRk9ORCcgcmVzb3VyY2UgaXNuJ3QgY2hlY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR3Vlc3NpbmcgbWV0aG9kcyB0byBhY2Nlc3MgZW1iZWRkZWQgcmVzb3VyY2UgZm9ya3MgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVuYWJsZSBleHRyYSBNYWMgZm9udHMgc3VwcG9ydCBvbiBub24tTWFjIHBsYXRmb3JtcyAoZS5nLiAgICAgICAgICAgKi8KLSAgLyogICBHTlUvTGludXgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFJlc291cmNlIGZvcmtzIHdoaWNoIGluY2x1ZGUgZm9udHMgZGF0YSBhcmUgc3RvcmVkIHNvbWV0aW1lcyBpbiAgICAgKi8KLSAgLyogICBsb2NhdGlvbnMgd2hpY2ggdXNlcnMgb3IgZGV2ZWxvcGVycyBkb24ndCBleHBlY3RlZC4gIEluIHNvbWUgY2FzZXMsICovCi0gIC8qICAgcmVzb3VyY2UgZm9ya3Mgc3RhcnQgd2l0aCBzb21lIG9mZnNldCBmcm9tIHRoZSBoZWFkIG9mIGEgZmlsZS4gIEluICAqLwotICAvKiAgIG90aGVyIGNhc2VzLCB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgc3RvcmVkIGluIGZpbGUgZGlmZmVyZW50ICAgKi8KLSAgLyogICBmcm9tIHdoYXQgdGhlIHVzZXIgc3BlY2lmaWVzLiAgSWYgdGhpcyBvcHRpb24gaXMgYWN0aXZhdGVkLCAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciBzdWNoIG9mZnNldHMgb3IgZGlmZmVyZW50IGZpbGUgICAgICAqLwotICAvKiAgIG5hbWVzIG11c3QgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IG5vcm1hbCwgZGlyZWN0IGFjY2VzcyBvZiByZXNvdXJjZSBmb3JrcyBpcyBjb250cm9sbGVkIHZpYSAqLwotICAvKiAgIHRoZSBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUyBvcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbG93IHRoZSB1c2Ugb2YgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlIHRvIGxvYWQgdHlwZWZhY2VzIHRoYXQgICAgICAqLwotICAvKiBjb250YWluIG5vIGdseXBoIGRhdGEsIGJ1dCBzdXBwbHkgaXQgdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyByZXF1aXJlZCBieSBjbGllbnRzIHN1cHBvcnRpbmcgZG9jdW1lbnQgZm9ybWF0cyB3aGljaCAgICAgICAgICovCi0gIC8qIHN1cHBseSBmb250IGRhdGEgaW5jcmVtZW50YWxseSBhcyB0aGUgZG9jdW1lbnQgaXMgcGFyc2VkLCBzdWNoICAgICAgICAqLwotICAvKiBhcyB0aGUgR2hvc3RzY3JpcHQgaW50ZXJwcmV0ZXIgZm9yIHRoZSBQb3N0U2NyaXB0IGxhbmd1YWdlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfUkVOREVSX1BPT0xfU0laRSAgMTYzODRMCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX01BWF9NT0RVTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbW9kdWxlcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGluIGEgc2luZ2xlICAgICovCi0gIC8qICAgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAzMiBpcyB0aGUgZGVmYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfTUFYX01PRFVMRVMgIDMyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlYnVnIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBjYW4gYmUgY29tcGlsZWQgaW4gZGVidWcgb3IgdHJhY2UgbW9kZS4gIEluIGRlYnVnIG1vZGUsICAgICovCi0gIC8qICAgZXJyb3JzIGFyZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBgZnRkZWJ1ZycgY29tcG9uZW50LiAgSW4gdHJhY2UgICAgICAqLwotICAvKiAgIG1vZGUsIGFkZGl0aW9uYWwgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcgICAgKi8KLSAgLyogICBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUiB0byBidWlsZCB0aGUgbGlicmFyeSBpbiBkZWJ1ZyBtb2RlLiAgICAgKi8KLSAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfVFJBQ0UgdG8gYnVpbGQgaXQgaW4gdHJhY2UgbW9kZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvbid0IGRlZmluZSBhbnkgb2YgdGhlc2UgbWFjcm9zIHRvIGNvbXBpbGUgaW4gYHJlbGVhc2UnIG1vZGUhICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0jZGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEF1dG9maXR0ZXIgZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiBGVF9ERUJVR19BVVRPRklUIGlzIGRlZmluZWQsIEZyZWVUeXBlIHByb3ZpZGVzIHNvbWUgbWVhbnMgdG8gICAgICovCi0gIC8qICAgY29udHJvbCB0aGUgYXV0b2ZpdHRlciBiZWhhdmlvdXIgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aXRoIGdsb2JhbCAqLwotICAvKiAgIGJvb2xlYW4gdmFyaWFibGVzIChjb25zZXF1ZW50bHksIHlvdSBzaG91bGQgKm5ldmVyKiBlbmFibGUgdGhpcyAgICAgKi8KLSAgLyogICB3aGlsZSBjb21waWxpbmcgaW4gYHJlbGVhc2UnIG1vZGUpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2Rpc2FibGVfaG9yel9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgZHVtcHMgb2YgdmFyaW91cyAgICAgICovCi0gIC8qICAgaW50ZXJuYWwgYXV0b2ZpdCBzdHJ1Y3R1cmVzIHRvIHN0ZG91dCAodXNpbmcgYHByaW50ZicpOiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2dldF9udW1fc2VnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19nZXRfc2VnbWVudF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBcyBhbiBhcmd1bWVudCwgdGhleSB1c2UgYW5vdGhlciBnbG9iYWwgdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBgZnRncmlkJyBkZW1vIHByb2dyYW0gdG8gc2VlIGhvdyB0aG9zZSAgICAqLwotICAvKiAgIHZhcmlhYmxlcyBhbmQgbWFjcm9zIHNob3VsZCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0RFQlVHX0FVVE9GSVQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWVtb3J5IERlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBjb21lcyB3aXRoIGFuIGludGVncmF0ZWQgbWVtb3J5IGRlYnVnZ2VyIHRoYXQgaXMgICAgICAgKi8KLSAgLyogICBjYXBhYmxlIG9mIGRldGVjdGluZyBzaW1wbGUgZXJyb3JzIGxpa2UgbWVtb3J5IGxlYWtzIG9yIGRvdWJsZSAgICAgICovCi0gIC8qICAgZGVsZXRlcy4gIFRvIGNvbXBpbGUgaXQgd2l0aGluIHlvdXIgYnVpbGQgb2YgdGhlIGxpYnJhcnksIHlvdSAgICAgICAqLwotICAvKiAgIHNob3VsZCBkZWZpbmUgRlRfREVCVUdfTUVNT1JZIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgZGVidWdnZXIgaXMgb25seSBhY3RpdmF0ZWQgYXQgcnVudGltZSB3aGVuICAgICAqLwotICAvKiAgIHdoZW4gdGhlIF9lbnZpcm9ubWVudF8gdmFyaWFibGUgYEZUMl9ERUJVR19NRU1PUlknIGlzIGRlZmluZWQgYWxzbyEgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGlzIG1hY3JvIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgICAqLwotICAvKiAgIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0RFQlVHX01FTU9SWQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNb2R1bGUgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgdGhlIGhpZ2hlciBieXRlICAqLwotICAvKiAgIG9mIGFuIGVycm9yIGNvZGUgZ2l2ZXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZXJyb3IgaGFzIG9jY3VycmVkLCAgKi8KLSAgLyogICB3aGlsZSB0aGUgbG93ZXIgYnl0ZSBpcyB0aGUgcmVhbCBlcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNldHRpbmcgdGhpcyBtYWNybyBtYWtlcyBzZW5zZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHNpbmNlICAgKi8KLSAgLyogICBpdCB3b3VsZCBicmVhayBzb3VyY2UgY29tcGF0aWJpbGl0eSBvZiBjZXJ0YWluIHByb2dyYW1zIHRoYXQgdXNlICAgICovCi0gIC8qICAgRnJlZVR5cGUgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBmdG1vZGVyci5oIGFuZCBmdGVycm9ycy5oLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIElmIHRoaXMgbWFjcm8gaXMgc2V0ICh3aGljaCBpcyBfbm90XyB0aGUgZGVmYXVsdCksIEZyZWVUeXBlMiB3aWxsICAgKi8KLSAgLyogICBhdm9pZCBjcmVhdGluZyBjb25zdGFudHMgdGhhdCByZXF1aXJlIGFkZHJlc3MgZml4dXBzLiAgSW5zdGVhZCB0aGUgICovCi0gIC8qICAgY29uc3RhbnRzIHdpbGwgYmUgbW92ZWQgaW50byBhIHN0cnVjdCBhbmQgYWRkaXRpb25hbCBpbnRpYWxpemF0aW9uICAqLwotICAvKiAgIGNvZGUgd2lsbCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU2V0dGluZyB0aGlzIG1hY3JvIGlzIG5lZWRlZCBmb3Igc3lzdGVtcyB0aGF0IHByb2hpYml0IGFkZHJlc3MgICAgICAqLwotICAvKiAgIGZpeHVwcywgc3VjaCBhcyBCUkVXLiAgW05vdGUgdGhhdCBzdGFuZGFyZCBjb21waWxlcnMgbGlrZSBnY2Mgb3IgICAgKi8KLSAgLyogICBjbGFuZyBoYW5kbGUgUElDIGdlbmVyYXRpb24gYXV0b21hdGljYWxseTsgeW91IGRvbid0IGhhdmUgdG8gc2V0ICAgICovCi0gIC8qICAgRlRfQ09ORklHX09QVElPTl9QSUMsIHdoaWNoIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciB2ZXJ5IHNwZWNpYWwgICAgICAqLwotICAvKiAgIGNvbXBpbGVycy5dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsICAgICAqLwotICAvKiAgIG1vZHVsZXMgKHNlZSBgbW9kdWxlcy5jZmcnIGZvciBhIGNvbXBsZXRlIGxpc3QpLiAgRm9yIGJ1aWxkaW5nIHdpdGggKi8KLSAgLyogICBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LCBkbyB0aGUgZm9sbG93aW5nLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgMC4gQ2xvbmUgdGhlIHJlcG9zaXRvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIDEuIERlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BJQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAyLiBSZW1vdmUgYWxsIHN1YmRpcmVjdG9yaWVzIGluIGBzcmMnIHRoYXQgZG9uJ3QgaGF2ZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIDMuIENvbW1lbnQgb3V0IHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZXMgaW4gYG1vZHVsZXMuY2ZnJy4gICAgICAgICovCi0gIC8qICAgICA0LiBDb21waWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICBTIEYgTiBUICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgICAgICAgKi8KLSAgLyogZW1iZWRkZWQgYml0bWFwcyBpbiBhbGwgZm9ybWF0cyB1c2luZyB0aGUgU0ZOVCBtb2R1bGUgKG5hbWVseSAgICAgICAgICovCi0gIC8qIFRydWVUeXBlICYgT3BlblR5cGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byAgICAqLwotICAvKiBsb2FkIGFuZCBlbnVtZXJhdGUgdGhlIGdseXBoIFBvc3RzY3JpcHQgbmFtZXMgaW4gYSBUcnVlVHlwZSBvciAgICAgICAgKi8KLSAgLyogT3BlblR5cGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgd2hlbiB5b3UgZG8gbm90IGNvbXBpbGUgdGhlIGBQU05hbWVzJyBtb2R1bGUgYnkgdW5kZWZpbmluZyAgKi8KLSAgLyogdGhlIGFib3ZlIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUywgdGhlIGBzZm50JyBtb2R1bGUgd2lsbCAgICovCi0gIC8qIGNvbnRhaW4gYWRkaXRpb25hbCBjb2RlIHVzZWQgdG8gcmVhZCB0aGUgUFMgTmFtZXMgdGFibGUgZnJvbSBhIGZvbnQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKEJ5IGRlZmF1bHQsIHRoZSBtb2R1bGUgdXNlcyBgUFNOYW1lcycgdG8gZXh0cmFjdCBnbHlwaCBuYW1lcy4pICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUyBpZiB5b3VyIGFwcGxpY2F0aW9ucyBuZWVkIHRvICAgICAgICovCi0gIC8qIGFjY2VzcyB0aGUgaW50ZXJuYWwgbmFtZSB0YWJsZSBpbiBhIFNGTlQtYmFzZWQgZm9ybWF0IGxpa2UgVHJ1ZVR5cGUgICAqLwotICAvKiBvciBPcGVuVHlwZS4gIFRoZSBuYW1lIHRhYmxlIGNvbnRhaW5zIHZhcmlvdXMgc3RyaW5ncyB1c2VkIHRvICAgICAgICAgKi8KLSAgLyogZGVzY3JpYmUgdGhlIGZvbnQsIGxpa2UgZmFtaWx5IG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLiAgSXQgICAgICovCi0gIC8qIGRvZXMgbm90IGNvbnRhaW4gYW55IGdseXBoIG5hbWUgdGhvdWdoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWNjZXNzaW5nIFNGTlQgbmFtZXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gICAgICAgICovCi0gIC8qIGBmdHNuYW1lcy5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRydWVUeXBlIENNYXAgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBIZXJlIHlvdSBjYW4gZmluZS10dW5lIHdoaWNoIFRydWVUeXBlIENNYXAgdGFibGUgZm9ybWF0IHNoYWxsIGJlICAgICovCi0gIC8qICAgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMAotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMgotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNAotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNgotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfOAotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTAKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEyCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMwotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgIFQgUiBVIEUgVCBZIFAgRSAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgaWYgeW91IHdhbnQgdG8gY29tcGlsZSAgICovCi0gIC8qIGEgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaW4gdGhlIFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnkgdW5kZWZpbmluZyB0aGlzLCB5b3Ugd2lsbCBvbmx5IGNvbXBpbGUgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIGxvYWQgICovCi0gIC8qIFRydWVUeXBlIGdseXBocyB3aXRob3V0IGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSwgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCAgICAgICAgICovCi0gIC8qICAgZGVmaW5lIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgICAgICAgKi8KLSAgLyogc3VicGl4ZWwgaGludGluZyBzdXBwb3J0IGludG8gdGhlIFRydWVUeXBlIGRyaXZlci4gIFRoaXMgbW9kaWZpZXMgdGhlICovCi0gIC8qIFRydWVUeXBlIGhpbnRpbmcgbWVjaGFuaXNtIHdoZW4gYW55dGhpbmcgYnV0IEZUX1JFTkRFUl9NT0RFX01PTk8gaXMgICAqLwotICAvKiByZXF1ZXN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluIHBhcnRpY3VsYXIsIGl0IG1vZGlmaWVzIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciB0byBpbnRlcnByZXQgKG9yICAqLwotICAvKiBub3QpIGluc3RydWN0aW9ucyBpbiBhIGNlcnRhaW4gd2F5IHNvIHRoYXQgYWxsIFRydWVUeXBlIGZvbnRzIGxvb2sgICAgKi8KLSAgLyogbGlrZSB0aGV5IGRvIGluIGEgV2luZG93cyBDbGVhclR5cGUgKERpcmVjdFdyaXRlKSBlbnZpcm9ubWVudC4gIFNlZSAgICovCi0gIC8qIFsxXSBmb3IgYSB0ZWNobmljYWwgb3ZlcnZpZXcgb24gd2hhdCB0aGlzIG1lYW5zLiAgU2VlIGB0dGludGVycC5oJyAgICAqLwotICAvKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBMRUFOIG9wdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSB0aHJlZSBvcHRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogMS4gVGhpcyBvcHRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgSW5maW5hbGl0eScgbW9uaWtlci4gICAgICAgICAgICovCi0gIC8qICAgIENvbnRyaWJ1dGVkIGJ5IGFuIGluZGl2aWR1YWwgbmlja25hbWVkIEluZmluYWxpdHkgd2l0aCB0aGUgZ29hbCBvZiAqLwotICAvKiAgICBtYWtpbmcgVHJ1ZVR5cGUgZm9udHMgcmVuZGVyIGJldHRlciB0aGFuIG9uIFdpbmRvd3MuICBBIGhpZ2ggICAgICAgKi8KLSAgLyogICAgYW1vdW50IG9mIGNvbmZpZ3VyYWJpbGl0eSBhbmQgZmxleGliaWxpdHksIGRvd24gdG8gcnVsZXMgZm9yICAgICAgICovCi0gIC8qICAgIHNpbmdsZSBnbHlwaHMgaW4gZm9udHMsIGJ1dCBhbHNvIHZlcnkgc2xvdy4gIEl0cyBleHBlcmltZW50YWwgYW5kICAqLwotICAvKiAgICBzbG93IG5hdHVyZSBhbmQgdGhlIG9yaWdpbmFsIGRldmVsb3BlciBsb3NpbmcgaW50ZXJlc3QgbWVhbnQgdGhhdCAgKi8KLSAgLyogICAgdGhpcyBvcHRpb24gd2FzIG5ldmVyIGVuYWJsZWQgaW4gZGVmYXVsdCBidWlsZHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAyLiBUaGUgbmV3IGRlZmF1bHQgbW9kZSBmb3IgdGhlIFRydWVUeXBlIGRyaXZlci4gIFRoZSBJbmZpbmFsaXR5IGNvZGUgKi8KLSAgLyogICAgYmFzZSB3YXMgc3RyaXBwZWQgdG8gdGhlIGJhcmUgbWluaW11bSBhbmQgYWxsIGNvbmZpZ3VyYWJpbGl0eSAgICAgICovCi0gIC8qICAgIHJlbW92ZWQgaW4gdGhlIG5hbWUgb2Ygc3BlZWQgYW5kIHNpbXBsaWNpdHkuICBUaGUgY29uZmlndXJhYmlsaXR5ICAqLwotICAvKiAgICB3YXMgbWFpbmx5IGFpbWVkIGF0IGxlZ2FjeSBmb250cyBsaWtlIEFyaWFsLCBUaW1lcyBOZXcgUm9tYW4sIG9yICAgKi8KLSAgLyogICAgQ291cmllci4gIExlZ2FjeSBmb250cyBhcmUgZm9udHMgdGhhdCBtb2RpZnkgdmVydGljYWwgc3RlbXMgdG8gICAgICovCi0gIC8qICAgIGFjaGlldmUgY2xlYW4gYmxhY2stYW5kLXdoaXRlIGJpdG1hcHMuICBUaGUgbmV3IG1vZGUgZm9jdXNlcyBvbiAgICAqLwotICAvKiAgICBhcHBseWluZyBhIG1pbmltYWwgc2V0IG9mIHJ1bGVzIHRvIGFsbCBmb250cyBpbmRpc2NyaW1pbmF0ZWx5IHNvICAgKi8KLSAgLyogICAgdGhhdCBtb2Rlcm4gYW5kIHdlYiBmb250cyByZW5kZXIgd2VsbCB3aGlsZSBsZWdhY3kgZm9udHMgcmVuZGVyICAgICovCi0gIC8qICAgIG9rYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogMy4gQ29tcGlsZSBib3RoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCeSB1bmRlZmluaW5nIHRoZXNlLCB5b3UgZ2V0IHJlbmRlcmluZyBiZWhhdmlvciBsaWtlIG9uIFdpbmRvd3MgICAgICAgKi8KLSAgLyogd2l0aG91dCBDbGVhclR5cGUsIGkuZS4sIFdpbmRvd3MgWFAgd2l0aG91dCBDbGVhclR5cGUgZW5hYmxlZCBhbmQgICAgICovCi0gIC8qIFdpbjl4IChpbnRlcnByZXRlciB2ZXJzaW9uIHYzNSkuICBPciBub3QsIGRlcGVuZGluZyBvbiBob3cgbXVjaCAgICAgICAqLwotICAvKiBoaW50aW5nIGJsb29kIGFuZCB0ZXN0aW5nIHRlYXJzIHRoZSBmb250IGRlc2lnbmVyIHB1dCBpbnRvIGEgZ2l2ZW4gICAgKi8KLSAgLyogZm9udC4gIElmIHlvdSBkZWZpbmUgb25lIG9yIGJvdGggc3VicGl4ZWwgaGludGluZyBvcHRpb25zLCB5b3UgY2FuICAgICovCi0gIC8qIHN3aXRjaCBiZXR3ZWVuIGJldHdlZW4gdjM1IGFuZCB0aGUgb25lcyB5b3UgZGVmaW5lLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBvcHRpb24gcmVxdWlyZXMgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiB0byBiZSAgICAgICovCi0gIC8qIGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWzFdIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L2NsZWFydHlwZS90cnVldHlwZWNsZWFydHlwZS5hc3B4ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgIDEgICAgICovCi0vKiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAgMiAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICAgICAoIDEgfCAyICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQ09NUE9ORU5UX09GRlNFVF9TQ0FMRUQgdG8gY29tcGlsZSB0aGUgICAgICAgICovCi0gIC8qIFRydWVUeXBlIGdseXBoIGxvYWRlciB0byB1c2UgQXBwbGUncyBkZWZpbml0aW9uIG9mIGhvdyB0byBoYW5kbGUgICAgICAqLwotICAvKiBjb21wb25lbnQgb2Zmc2V0cyBpbiBjb21wb3NpdGUgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFwcGxlIGFuZCBNUyBkaXNhZ3JlZSBvbiB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBjb21wb25lbnQgb2Zmc2V0cyAgICAqLwotICAvKiBpbiBjb21wb3NpdGVzLiAgQXBwbGUgc2F5cyB0aGF0IHRoZXkgc2hvdWxkIGJlIHNjYWxlZCBieSB0aGUgc2NhbGluZyAgKi8KLSAgLyogZmFjdG9ycyBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IChyb3VnaGx5LCBpdCdzIG1vcmUgY29tcGxleCkgICAgICovCi0gIC8qIHdoaWxlIE1TIHNheXMgdGhleSBzaG91bGQgbm90LiAgT3BlblR5cGUgZGVmaW5lcyB0d28gYml0cyBpbiB0aGUgICAgICAqLwotICAvKiBjb21wb3NpdGUgZmxhZ3MgYXJyYXkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGlzYW1iaWd1YXRlLCBidXQgb2xkICAgICAgKi8KLSAgLyogZm9udHMgd2lsbCBub3QgaGF2ZSB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9nbHlmLmh0bSAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2Z2x5Zi5odG1sICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIFRUX0NPTkZJR19PUFRJT05fQ09NUE9ORU5UX09GRlNFVF9TQ0FMRUQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSAgICAgICAgICovCi0gIC8qIHN1cHBvcnQgZm9yIEFwcGxlJ3MgZGlzdG9ydGFibGUgZm9udCB0ZWNobm9sb2d5IChmdmFyLCBndmFyLCBjdmFyLCAgICAqLwotICAvKiBhbmQgYXZhciB0YWJsZXMpLiAgVGhpcyBoYXMgbWFueSBzaW1pbGFyaXRpZXMgdG8gVHlwZSAxIE11bHRpcGxlICAgICAgKi8KLSAgLyogTWFzdGVycyBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JERiBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yICAgICAgICAqLwotICAvKiBhbiBlbWJlZGRlZCBgQkRGICcgdGFibGUgd2l0aGluIFNGTlQtYmFzZWQgYml0bWFwIGZvcm1hdHMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQkRGCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wdGlvbiBUVF9DT05GSUdfT1BUSU9OX01BWF9SVU5OQUJMRV9PUENPREVTIGNvbnRyb2xzIHRoZSBtYXhpbXVtICAgICAqLwotICAvKiBudW1iZXIgb2YgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkIGZvciBhIHNpbmdsZSBydW4gb2YgdGhlICAgICAgKi8KLSAgLyogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIsIG5lZWRlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLiAgWW91IGRvbid0ICAgICovCi0gIC8qIHdhbnQgdG8gY2hhbmdlIHRoaXMgZXhjZXB0IGZvciB2ZXJ5IHNwZWNpYWwgc2l0dWF0aW9ucyAoZS5nLiwgbWFraW5nICAqLwotICAvKiBhIGxpYnJhcnkgZnV6emVyIHNwZW5kIGxlc3MgdGltZSB0byBoYW5kbGUgYnJva2VuIGZvbnRzKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIG5vdCBleHBlY3RlZCB0aGF0IHRoaXMgdmFsdWUgaXMgZXZlciBtb2RpZmllZCBieSBhIGNvbmZpZ3VyaW5nICAqLwotICAvKiBzY3JpcHQ7IGluc3RlYWQsIGl0IGdldHMgc3Vycm91bmRlZCB3aXRoICNpZm5kZWYgLi4uICNlbmRpZiBzbyB0aGF0ICAgKi8KLSAgLyogdGhlIHZhbHVlIGNhbiBiZSBzZXQgYXMgYSBwcmVwcm9jZXNzb3Igb3B0aW9uIG9uIHRoZSBjb21waWxlcidzICAgICAgICovCi0gIC8qIGNvbW1hbmQgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX01BWF9SVU5OQUJMRV9PUENPREVTICAxMDAwMDAwTAotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgIFQgWSBQIEUgMSAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX0RJQ1RfREVQVEggaXMgdGhlIG1heGltdW0gZGVwdGggb2YgbmVzdCBkaWN0aW9uYXJpZXMgYW5kICAgICAgICovCi0gIC8qIGFycmF5cyBpbiB0aGUgVHlwZSAxIHN0cmVhbSAoc2VlIHQxbG9hZC5jKS4gIEEgbWluaW11bSBvZiA0IGlzICAgICAgICAqLwotICAvKiByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9ESUNUX0RFUFRIICA1Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUgICAqLwotICAvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9TVUJSU19DQUxMUyAgMTYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX0NIQVJTVFJJTkdfT1BFUkFORFMgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEgICAgICovCi0gIC8qIG1pbmltdW0gb2YgMTYgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIENoaW5lc2UgZm9udCBNaW5nVGlFRy1NZWRpdW0gKENOUyAxMTY0MyBjaGFyYWN0ZXIgc2V0KSBuZWVkcyAyNTYuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDI1NgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gb2YgYHQxYWZtJywgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgVHlwZSAxIEFGTSAgICAgICovCi0gIC8qIGZpbGVzIGludG8gYW4gZXhpc3RpbmcgZmFjZS4gIE5vdGUgdGhhdCBpZiBzZXQsIHRoZSBUMSBkcml2ZXIgd2lsbCBiZSAqLwotICAvKiB1bmFibGUgdG8gcHJvZHVjZSBrZXJuaW5nIGRpc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IHRoZSAgICAgICAgICAgICovCi0gIC8qIGNvbXBpbGF0aW9uIG9mIHRoZSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnQgc3VwcG9ydCBpbiB0aGUgVHlwZSAxICAgICAgICAqLwotICAvKiBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgIEMgRiBGICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXNpbmcgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl97WCxZfXsxLDIsMyw0fSBpdCBpcyAgICAgICovCi0gIC8qIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGZvdXIgY29udHJvbCBwb2ludHMgdGhhdCAqLwotICAvKiBkZWZpbmUgdGhlIHN0ZW0gZGFya2VuaW5nIGJlaGF2aW91ciBvZiB0aGUgKG5ldykgQ0ZGIGVuZ2luZS4gIEZvciAgICAgKi8KLSAgLyogbW9yZSBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkgb2YgdGhlIGNmZiBkcml2ZXIgbW9kdWxlIChmaWxlICAgICAgICAqLwotICAvKiBgZnRjZmZkcnYuaCcpLCB3aGljaCBhbGxvd3MgdGhlIGNvbnRyb2wgYXQgcnVuLXRpbWUuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERvICpub3QqIHVuZGVmaW5lIHRoZXNlIG1hY3JvcyEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMSAgIDUwMAotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kxICAgNDAwCi0KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiAgMTAwMAotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyICAgMjc1Ci0KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyAgMTY2NwotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kzICAgMjc1Ci0KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNCAgMjMzMwotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1k0ICAgICAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgY29udHJvbHMgd2hldGhlciB0aGUgcHJlLUFkb2JlIENGRiAgICAgICAqLwotICAvKiBlbmdpbmUgZ2V0cyBjb21waWxlZCBpbnRvIEZyZWVUeXBlLiAgSWYgZGVmaW5lZCwgaXQgaXMgcG9zc2libGUgdG8gICAgKi8KLSAgLyogc3dpdGNoIGJldHdlZW4gdGhlIHR3byBlbmdpbmVzIHVzaW5nIHRoZSBgaGludGluZy1lbmdpbmUnIHByb3BlcnR5IG9mICovCi0gIC8qIHRoZSBjZmYgZHJpdmVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICBQIEMgRiAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSBtYW55IFBDRiBmb250cyBqdXN0IGNhbGxlZCBgRml4ZWQnIHdoaWNoIGxvb2sgY29tcGxldGVseSAgICAqLwotICAvKiBkaWZmZXJlbnQsIGFuZCB3aGljaCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBlYWNoIG90aGVyLiAgV2hlbiAgICAgICAgKi8KLSAgLyogc2VsZWN0aW5nIGBGaXhlZCcgaW4gS0RFIG9yIEdub21lIG9uZSBnZXRzIHJlc3VsdHMgdGhhdCBhcHBlYXIgcmF0aGVyICovCi0gIC8qIHJhbmRvbSwgdGhlIHN0eWxlIGNoYW5nZXMgb2Z0ZW4gaWYgb25lIGNoYW5nZXMgdGhlIHNpemUgYW5kIG9uZSAgICAgICAqLwotICAvKiBjYW5ub3Qgc2VsZWN0IHNvbWUgZm9udHMgYXQgYWxsLiAgVGhpcyBvcHRpb24gbWFrZXMgdGhlIFBDRiBtb2R1bGUgICAgKi8KLSAgLyogcHJlcGVuZCB0aGUgZm91bmRyeSBuYW1lIChwbHVzIGEgc3BhY2UpIHRvIHRoZSBmYW1pbHkgbmFtZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBhbHNvIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBgd2lkZScgY2hhcmFjdGVyczsgYWxsIHB1dCB0b2dldGhlciwgd2UgKi8KLSAgLyogZ2V0IGZhbWlseSBuYW1lcyBsaWtlIGBTb255IEZpeGVkJyBvciBgTWlzYyBGaXhlZCBXaWRlJy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsIGl0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlICAgICAgICAgICAgKi8KLSAgLyogYG5vLWxvbmctZmFtaWx5LW5hbWVzJyBwcm9wZXJ0eSBvZiB0aGUgcGNmIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgQSBVIFQgTyBGIEkgVCAgIE0gTyBEIFUgTCBFICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENvbXBpbGUgYXV0b2ZpdCBtb2R1bGUgd2l0aCBDSksgKENoaW5lc2UsIEphcGFuZXNlLCBLb3JlYW4pIHNjcmlwdCAgICAqLwotICAvKiBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fQ0pLCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggSW5kaWMgc2NyaXB0IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fSU5ESUMKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENvbXBpbGUgYXV0b2ZpdCBtb2R1bGUgd2l0aCB3YXJwIGhpbnRpbmcuICBUaGUgaWRlYSBvZiB0aGUgd2FycGluZyAgICAqLwotICAvKiBjb2RlIGlzIHRvIHNsaWdodGx5IHNjYWxlIGFuZCBzaGlmdCBhIGdseXBoIHdpdGhpbiBhIHNpbmdsZSBkaW1lbnNpb24gKi8KLSAgLyogc28gdGhhdCBhcyBtdWNoIG9mIGl0cyBzZWdtZW50cyBhcmUgYWxpZ25lZCAobW9yZSBvciBsZXNzKSBvbiB0aGUgICAgICovCi0gIC8qIGdyaWQuICBUbyBmaW5kIG91dCB0aGUgb3B0aW1hbCBzY2FsaW5nIGFuZCBzaGlmdGluZyB2YWx1ZSwgdmFyaW91cyAgICAqLwotICAvKiBwYXJhbWV0ZXIgY29tYmluYXRpb25zIGFyZSB0cmllZCBhbmQgc2NvcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZXhwZXJpbWVudGFsIG9wdGlvbiBpcyBhY3RpdmUgb25seSBpZiB0aGUgcmVuZGVyaW5nIG1vZGUgaXMgICAgICAqLwotICAvKiBGVF9SRU5ERVJfTU9ERV9MSUdIVDsgeW91IGNhbiBzd2l0Y2ggd2FycGluZyBvbiBhbmQgb2ZmIHdpdGggdGhlICAgICAgKi8KLSAgLyogYHdhcnBpbmcnIHByb3BlcnR5IG9mIHRoZSBhdXRvLWhpbnRlciAoc2VlIGZpbGUgYGZ0YXV0b2guaCcgZm9yIG1vcmUgICovCi0gIC8qIGluZm9ybWF0aW9uOyBieSBkZWZhdWx0IGl0IGlzIHN3aXRjaGVkIG9mZikuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCi0KLSAgLyogKi8KLQotCi0gIC8qCi0gICAqIFRoaXMgbWFjcm8gaXMgb2Jzb2xldGUuICBTdXBwb3J0IGhhcyBiZWVuIHJlbW92ZWQgaW4gRnJlZVR5cGUKLSAgICogdmVyc2lvbiAyLjUuCi0gICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KLQotCi0gIC8qCi0gICAqIFRoaXMgbWFjcm8gaXMgZGVmaW5lZCBpZiBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyBpcyByZXF1ZXN0ZWQgYnkgdGhlCi0gICAqIGRlZmluaXRpb25zIGFib3ZlLgotICAgKi8KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0jZGVmaW5lICBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotI2lmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAmIDEKLSNkZWZpbmUgIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0jZW5kaWYKLQotI2lmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAmIDIKLSNkZWZpbmUgIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLQotICAvKgotICAgKiBDaGVjayBDRkYgZGFya2VuaW5nIHBhcmFtZXRlcnMuICBUaGUgY2hlY2tzIGFyZSB0aGUgc2FtZSBhcyBpbiBmdW5jdGlvbgotICAgKiBgY2ZmX3Byb3BlcnR5X3NldCcgaW4gZmlsZSBgY2ZmZHJpdnIuYycuCi0gICAqLwotI2lmIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDEgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDQgPCAwICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTIgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTMgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQgPCAwICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDEgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiAgICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyAgICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNCAgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTIgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTMgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQgPiA1MDAKLSNlcnJvciAiSW52YWxpZCBDRkYgZGFya2VuaW5nIHBhcmFtZXRlcnMhIgotI2VuZGlmCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogRlRPUFRJT05fSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2RvY3MvQ0hBTkdFUyBiL2RvY3MvQ0hBTkdFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlOTUxMC4uMDAwMDAwMAotLS0gYS9kb2NzL0NIQU5HRVMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODA3ICswLDAgQEAKLQotQ0hBTkdFUyBCRVRXRUVOIDIuNy4xIGFuZCAyLjgKLQotICBJLiBJTVBPUlRBTlQgQ0hBTkdFUwotCi0gICAgLSBTdXBwb3J0IGZvciBPcGVuVHlwZSBWYXJpYXRpb24gRm9udHMgaXMgbm93IGNvbXBsZXRlLiAgIFRoZSBsYXN0Ci0gICAgICBtaXNzaW5nIHBhcnQgd2FzIGhhbmRsaW5nIHRoZSBgVlZBUicgYW5kIGBNVkFSJyB0YWJsZXMsIHdoaWNoIGlzCi0gICAgICBhdmFpbGFibGUgd2l0aCB0aGlzIHJlbGVhc2UuCi0KLSAgICAtIEEgbmV3ICBmdW5jdGlvbiBgRlRfRmFjZV9Qcm9wZXJ0aWVzJyBhbGxvd3MgdGhlICBjb250cm9sIG9mIHNvbWUKLSAgICAgIG1vZHVsZSAgYW5kICAgbGlicmFyeSAgcHJvcGVydGllcyAgcGVyICBmb250LiAgICBDdXJyZW50bHksICB0aGUKLSAgICAgIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGNhbiBiZSAgaGFuZGxlZDogc3RlbSBkYXJrZW5pbmcsIExDRCBmaWx0ZXIKLSAgICAgIHdlaWdodHMsIGFuZCB0aGUgcmFuZG9tIHNlZWQgZm9yIHRoZSBgcmFuZG9tJyBDRkYgb3BlcmF0b3IuCi0KLSAgICAtIFRoZSBQQ0YgY2hhbmdlIHRvIHNob3cgbW9yZSBgY29sb3VyZnVsJyBmYW1pbHkgbmFtZXMgKGludHJvZHVjZWQKLSAgICAgIGluIHZlcnNpb24gMi43LjEpIHdhcyB0b28gcmFkaWNhbDsgaXQgY2FuIG5vdyBiZSBjb25maWd1cmVkIHdpdGgKLSAgICAgIFBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTICAgYXQgICBjb21waWxlICAgdGltZS4gICAgSWYKLSAgICAgIGFjdGl2YXRlZCwgaXQgY2FuICBiZSBzd2l0Y2hlZCBvZmYgYXQgcnVuIHRpbWUgIHdpdGggdGhlIG5ldyBwY2YKLSAgICAgIHByb3BlcnR5ICBgbm8tbG9uZy1mYW1pbHktbmFtZXMnLiAgSWYgIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFUycKLSAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGF2YWlsYWJsZSwgeW91IGNhbiBzYXkKLQotICAgICAgICBGUkVFVFlQRV9QUk9QRVJUSUVTPXBjZjpuby1sb25nLWZhbWlseS1uYW1lcz0xCi0KLSAgICAtIFN1cHBvcnQgIGZvciAgdGhlICBmb2xsb3dpbmcgIHNjcmlwdHMgIGhhcyAgYmVlbiAgYWRkZWQgIHRvICB0aGUKLSAgICAgIGF1dG8taGludGVyLgotCi0gICAgICAgIEFkbGFtLCBBdmVzdGFuLCBCYW11bSwgQnVoaWQsIENhcmlhbiwgQ2hha21hLCBDb3B0aWMsIEN5cHJpb3QsCi0gICAgICAgIERlc2VyZXQsIEdsYWdvbGl0aWMsIEdvdGhpYywgS2F5YWgsIExpc3UsIE4nS28sIE9sIENoaWtpLCBPbGQKLSAgICAgICAgVHVya2ljLCBPc2FnZSwgT3NtYW55YSwgU2F1cmFzaHRyYSwgU2hhdmlhbiwgU3VuZGFuZXNlLCBUYWkKLSAgICAgICAgVmlldCwgVGlmaW5hZ2gsIFVuaWZpZWQgQ2FuYWRpYW4gU3lsbGFiaWNzLCBWYWkKLQotCi0gIElJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIGBMaWdodCcgYXV0by1oaW50aW5nICBtb2RlIG5vICBsb25nZXIgdXNlcyBUcnVlVHlwZSAgbWV0cmljcyBmb3IKLSAgICAgIFRydWVUeXBlICBmb250cy4gICBUaGlzIGJ1ZyAgd2FzICBpbnRyb2R1Y2VkICBpbiB2ZXJzaW9uICAyLjQuNiwKLSAgICAgIGNhdXNpbmcgICBob3Jpem9udGFsICBzY2FsaW5nICAgYWxzby4gICAgQWxtb3N0ICBhbGwgICBHTlUvTGludXgKLSAgICAgIGRpc3RyaWJ1dGlvbnMgKHdpdGggRmVkb3JhIGFzICBhIG5vdGFibGUgZXhjZXB0aW9uKSBkaXNhYmxlZCB0aGUKLSAgICAgIGNvcnJlc3BvbmRpbmcgcGF0Y2ggZm9yIGdvb2QgcmVhc29uczsgY2hhbmNlcyBhcmUgdGh1cyBoaWdoIHRoYXQKLSAgICAgIHlvdSB3b24ndCBub3RpY2UgYSBkaWZmZXJlbmNlLgotCi0gICAgICBJZiAgb3B0aWNhbCBiYWNrd2FyZCAgY29tcGF0aWJpbGl0eSBmb3IgIGxlZ2FjeSBhcHBsaWNhdGlvbnMgIGlzCi0gICAgICBuZWNlc3NhcnksIHlvdSBtaWdodCBlbmFibGUgdGhlIEFGX0NPTkZJR19PUFRJT05fVFRfU0laRV9NRVRSSUNTCi0gICAgICBjb25maWd1cmF0aW9uIG9wdGlvbi4gICBIb3dldmVyLCBpdCAgaXMgc3Ryb25nbHkgIHJlY29tbWVuZGVkIHRvCi0gICAgICBhdm9pZCB0aGF0LCBhZGp1c3RpbmcgZm9udCBzaXplcyBpbnN0ZWFkLgotCi0gICAgLSBJZiBhIFRydWVUeXBlIGZvbnQgZ2V0cyBsb2FkZWQgd2l0aCBGVF9MT0FEX05PX0hJTlRJTkcsIEZyZWVUeXBlCi0gICAgICBub3cgc2NhbGVzICB0aGUgZm9udCBsaW5lYXJseSAgYWdhaW4gKGJ1ZyBpbnRyb2R1Y2VkICBpbiB2ZXJzaW9uCi0gICAgICAyLjQuNikuCi0KLSAgICAtIENWRS0yMDE3LTgxMDUsICBDVkUtMjAxNy04Mjg3OiAgT2xkZXIgICBGcmVlVHlwZSAgdmVyc2lvbnMgIGhhdmUKLSAgICAgIG91dC1vZi1ib3VuZHMgIHdyaXRlcyAgY2F1c2VkICBieSAgaGVhcC1iYXNlZCAgYnVmZmVyICBvdmVyZmxvd3MKLSAgICAgIHJlbGF0ZWQgdG8gVHlwZSAxIGZvbnRzLgotCi0gICAgICAgIGh0dHBzOi8vY3ZlLm1pdHJlLm9yZy9jZ2ktYmluL2N2ZW5hbWUuY2dpP25hbWU9Q1ZFLTIwMTctODEwNQotICAgICAgICBodHRwczovL2N2ZS5taXRyZS5vcmcvY2dpLWJpbi9jdmVuYW1lLmNnaT9uYW1lPUNWRS0yMDE3LTgyODcKLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBBICBuZXcgZnVuY3Rpb24gIGBGVF9TZXRfRGVmYXVsdF9Qcm9wZXJ0aWVzJyBoYXMgIGJlZW4gYWRkZWQgIHRvCi0gICAgICBwYXJzZSAgICB0aGUgICAgYEZSRUVUWVBFX1BST1BFUlRJRVMnICAgIGVudmlyb25tZW50ICAgIHZhcmlhYmxlCi0gICAgICAocHJldmlvdXNseSwgaXQgIHdhcyBpbnRlcm5hbCBvbmx5KS4gICBgRlRfSW5pdF9GcmVlVHlwZScgYWx3YXlzCi0gICAgICBjYWxsIHRoaXMgIGZ1bmN0aW9uLCBidXQgIGBGVF9OZXdfTGlicmFyeScgZG9lcyBub3QgIChzaW1pbGFyIHRvCi0gICAgICBgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcycpLgotCi0gICAgLSBUbyBiZSBpbiBzeW5jIHdpdGggT3BlblR5cGUgdmVyc2lvbiAxLjcgYW5kIG5ld2VyLCBtYWNyb3MKLQotICAgICAgICBGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9GQU1JTFksCi0gICAgICAgIEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX1NVQkZBTUlMWSwKLSAgICAgICAgVFRfTkFNRV9JRF9QUkVGRVJSRURfRkFNSUxZCi0gICAgICAgIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWQotCi0gICAgICBhcmUgcmVuYW1lZCB0bwotCi0gICAgICAgIEZUX1BBUkFNX1RBR19JR05PUkVfVFlQT0dSQVBISUNfRkFNSUxZLAotICAgICAgICBGVF9QQVJBTV9UQUdfSUdOT1JFX1RZUE9HUkFQSElDX1NVQkZBTUlMWSwKLSAgICAgICAgVFRfTkFNRV9JRF9UWVBPR1JBUEhJQ19GQU1JTFkKLSAgICAgICAgVFRfTkFNRV9JRF9UWVBPR1JBUEhJQ19TVUJGQU1JTFkKLQotICAgICAgVGhlIG9sZCBtYWNybyBuYW1lcyBhcmUgZGVwcmVjYXRlZCAoYnV0IHN0aWxsIGF2YWlsYWJsZSkuCi0KLSAgICAtIFN1cHBvcnQgZm9yIFNGTlQgYG5hbWUnIHRhYmxlcyBoYXMgYmVlbiBpbXByb3ZlZC4KLQotICAgICAgLiBGb3JtYXQgIDEgYG5hbWUnIHRhYmxlcyAgYXJlIG5vdyBzdXBwb3J0ZWQuICBVc2UgIG5ldyBmdW5jdGlvbgotICAgICAgICBgRlRfR2V0X1NmbnRfTGFuZ1RhZycgdG8gYWNjZXNzIGFzc29jaWF0ZWQgbGFuZ3VhZ2UgdGFncy4KLQotICAgICAgLiBMYW5ndWFnZSwgZW5jb2RpbmcsIGFuZCBuYW1lIElEcyBoYXZlIGJlZW4gdXBkYXRlZCB0byBPcGVuVHlwZQotICAgICAgICB2ZXJzaW9uIDEuOC4xLgotCi0gICAgLSBUaGUgbmV3IENGRiAgZW5naW5lIG5vdyBoYW5kbGVzIHRoZSBgcmFuZG9tJyAgb3BlcmF0b3IuICBBbGwgQ0ZGCi0gICAgICBvcGNvZGVzIGFyZSBub3cgc3VwcG9ydGVkLgotCi0gICAgLSBUaGUgQ0ZGIG1vZHVsZSAgaGFzIGEgbmV3IHByb3BlcnR5IGByYW5kb20tc2VlZCcgIHRvIGNvbnRyb2wgdGhlCi0gICAgICBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGZvciB0aGUgYHJhbmRvbScgb3BlcmF0b3IuCi0KLSAgICAtIFRoZSBgZnJlZXR5cGUtY29uZmlnJyBzY3JpcHQgaXMgbm93IGEgd3JhcHBlciBvZiBgcGtnLWNvbmZpZycgaWYKLSAgICAgIHRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgaW4gdGhlIHBhdGguCi0KLSAgICAtIEZUX0xPQURfVEFSR0VUX0xDRCAgaXMgbm93ICBhICB2YXJpYW50IG9mICBGVF9MT0FEX1RBUkdFVF9MSUdIVDsKLSAgICAgIHRoaXMgc2hvdWxkIHByb3ZpZGUgYmV0dGVyIHJlbmRlcmluZyByZXN1bHRzLgotCi0gICAgLSBBIG1vZGUgdG8gZGlzcGxheSAgbGlnaHQgYXV0by1oaW50aW5nIHdpdGggc3ViLXBpeGVsIHBvc2l0aW9uaW5nCi0gICAgICBoYXMgYmVlbiBhZGRlZCB0byBgZnRkaWZmJy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjcgYW5kIDIuNy4xCi0KLSAgSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gU3VwcG9ydCBmb3IgdGhlIG5ldyBDRkYyIGZvbnQgZm9ybWF0IGFzIGludHJvZHVjZWQgd2l0aCBPcGVuVHlwZQotICAgICAgMS44IGhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IERhdmUgQXJub2xkcyBmcm9tIEFkb2JlLgotCi0gICAgLSBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB2YXJpYXRpb24gZm9udHMgYXMgc3BlY2lmaWVkIGluIE9wZW5UeXBlCi0gICAgICAxLjggKGluIGFkZGl0aW9uIHRvIHRoZSAgYWxyZWFkeSBleGlzdGluZyBzdXBwb3J0IGZvciBBZG9iZSdzIE1NCi0gICAgICBhbmQgQXBwbGUncyAgR1ggZm9ybWF0cykuICBEYXZlIEFybm9sZHMgIGNvbnRyaWJ1dGVkIGhhbmRsaW5nIG9mCi0gICAgICBhZHZhbmNlICB3aWR0aCBjaGFuZ2UgIHZhcmlhdGlvbjsgIG1vcmUgd2lsbCAgY29tZSAgaW4gdGhlICBuZXh0Ci0gICAgICB2ZXJzaW9uLgotCi0KLSAgSUkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gSGFuZGxpbmcgb2YgIHJhdyBDSUQgZm9udHMgd2FzIHBhcnRpYWxseSAgYnJva2VuIChidWcgaW50cm9kdWNlZAotICAgICAgaW4gMi42LjQpLgotCi0gICAgLSBDVkUtMjAxNi0xMDMyODogIE9sZGVyICBGcmVlVHlwZSB2ZXJzaW9ucyBoYWQgIGFuICBvdXQtb2YtYm91bmRzCi0gICAgICB3cml0ZSBjYXVzZWQgYnkgYSBoZWFwLWJhc2VkICBidWZmZXIgb3ZlcmZsb3cgcmVsYXRlZCB0byB0aGUgQ0ZGCi0gICAgICBmb250cy4KLQotICAgICAgICBodHRwOi8vY3ZlLm1pdHJlLm9yZy9jZ2ktYmluL2N2ZW5hbWUuY2dpP25hbWU9Q1ZFLTIwMTYtMTAzMjgKLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBTb21lIGxpbWl0cyBmb3IgVHJ1ZVR5cGUgIGJ5dGVjb2RlIGV4ZWN1dGlvbiBoYXZlIGJlZW4gdGlnaHRlbmVkCi0gICAgICB0byAgc3BlZWQgICB1cCAgRnJlZVR5cGUncyAgaGFuZGxpbmcgIG9mICAgbWFsZm9ybWVkICBmb250cywgIGluCi0gICAgICBwYXJ0aWN1bGFyIHRvIHF1aWNrbHkgYWJvcnQgZW5kbGVzcyBsb29wcy4KLQotICAgICAgLSBUaGUgIG51bWJlciBvZiAgdHdpbGlnaHQgcG9pbnRzICBjYW4gbm8gIGxvbmdlciBiZSAgc2V0IHRvICBhbgotICAgICAgICBhcmJpdHJhcmlseSBsYXJnZSB2YWx1ZS4KLQotICAgICAgLSBUaGUgdG90YWwgbnVtYmVyIG9mIGp1bXAgIG9wY29kZSBpbnN0cnVjdGlvbnMgKGxpa2UgSk1QUikgd2l0aAotICAgICAgICBuZWdhdGl2ZSBhcmd1bWVudHMgIGlzIGR5bmFtaWNhbGx5IHJlc3RyaWN0ZWQ7IHRoZSAgc2FtZSBob2xkcwotICAgICAgICBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVyYXRpb25zIGluIExPT1BDQUxMIG9wY29kZXMuCi0KLSAgICAgIFRoZSBkeW5hbWljIGxpbWl0cyBhcmUgYmFzZWQgb24gIHRoZSBudW1iZXIgb2YgcG9pbnRzIGluIGEgZ2x5cGgKLSAgICAgIGFuZCB0aGUgbnVtYmVyIG9mIENWVCBlbnRyaWVzLiAgUGxlYXNlIHJlcG9ydCBpZiB5b3UgZW5jb3VudGVyIGEKLSAgICAgIGZvbnQgd2hlcmUgdGhlIHNlbGVjdGVkIHZhbHVlcyBhcmUgbm90IGFkZXF1YXRlLgotCi0gICAgLSBQQ0YgZmFtaWx5IG5hbWVzIGFyZSBtYWRlIG1vcmUgYGNvbG91cmZ1bCc7IHRoZXkgbm93IGluY2x1ZGUgdGhlCi0gICAgICBmb3VuZHJ5ICBhbmQgaW5mb3JtYXRpb24gIHdoZXRoZXIgdGhleSBjb250YWluICB3aWRlIGNoYXJhY3RlcnMuCi0gICAgICBGb3IgZXhhbXBsZSwgIHlvdSBubyBsb25nZXIgZ2V0IGBGaXhlZCcgYnV0ICByYXRoZXIgYFNvbnkgRml4ZWQnCi0gICAgICBvciBgTWlzYyBGaXhlZCBXaWRlJy4KLQotICAgIC0gQSBuZXcgIGZ1bmN0aW9uIGBGVF9HZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzJyAgKHdpdGggaXRzICBhbGlhcwotICAgICAgbmFtZSAgYEZUX0dldF9NTV9CbGVuZF9Db29yZGluYXRlcycpIHRvIHJldHJpZXZlIHRoZSAgbm9ybWFsaXplZAotICAgICAgYmxlbmQgIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50bHkgIHNlbGVjdGVkIHZhcmlhdGlvbiBpbnN0YW5jZQotICAgICAgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE11bHRpcGxlIE1hc3RlcnMgaW50ZXJmYWNlLgotCi0gICAgLSBBIG5ldyAgZnVuY3Rpb24gYEZUX0dldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzJyB0byAgcmV0cmlldmUgdGhlCi0gICAgICBkZXNpZ24gY29vcmRpbmF0ZXMgb2YgdGhlICBjdXJyZW50bHkgc2VsZWN0ZWQgdmFyaWF0aW9uIGluc3RhbmNlCi0gICAgICBoYXMgYmVlbiBhZGRlZCB0byB0aGUgTXVsdGlwbGUgTWFzdGVycyBpbnRlcmZhY2UuCi0KLSAgICAtIEEgbmV3IGxvYWQgZmxhZyBgRlRfTE9BRF9CSVRNQVBfTUVUUklDU19PTkxZJyB0byByZXRyaWV2ZSBiaXRtYXAKLSAgICAgIGluZm9ybWF0aW9uIHdpdGhvdXQgbG9hZGluZyB0aGUgKGVtYmVkZGVkKSBiaXRtYXAgaXRzZWxmLgotCi0gICAgLSBSZXRyaWV2aW5nICAgYWR2YW5jZSAgIHdpZHRocyAgIGZyb20gICBiaXRtYXAgICBzdHJpa2VzICAgKHVzaW5nCi0gICAgICBgRlRfR2V0X0FkdmFuY2UnIGFuZCBgRlRfR2V0X0FkdmFuY2VzJykgaGF2ZSBiZWVuIHNwZWQgdXAuCi0KLSAgICAtIFRoZSAgdXN1YWwgcm91bmQgIG9mICBmdXp6ZXIgZml4ZXMgIHRvICBiZXR0ZXIgcmVqZWN0ICBtYWxmb3JtZWQKLSAgICAgIGZvbnRzLgotCi0gICAgLSBUaGUgYGZ0bXVsdGknIGRlbW8gcHJvZ3JhbSBjYW4gbm93IHN3aXRjaCBlbmdpbmVzIHdpdGgga2V5IGBIJy4KLQotICAgIC0gVGhlICBgZnRzdHJpbmcnICBkZW1vICBwcm9ncmFtICAgY2FuICBub3cgIHNob3cgIHNvbWUgIGJ1aWx0LWluLAotICAgICAgbm9uLWxhdGluIHNhbXBsZSBzdHJpbmdzICh0byBiZSBzZWxlY3RlZCB3aXRoIHRoZSBUQUIga2V5KS4KLQotICAgIC0gVGhlICBgZnR2aWV3JyAgZGVtbyBwcm9ncmFtICBjYW4gIG5vdyAgc3dpdGNoIGJldHdlZW4gIGEgIGZvbnQncwotICAgICAgY2hhcm1hcHMgdXNpbmcgdGhlIFRBQiBrZXkuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi42LjUgYW5kIDIuNwotCi0gIEkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIEFzIGFubm91bmNlZCBlYXJsaWVyLCB0aGUgMi43Lnggc2VyaWVzIG5vdyB1c2VzIHRoZSBuZXcgc3VicGl4ZWwKLSAgICAgIGhpbnRpbmcgIG1vZGUgYXMgIHRoZSAgZGVmYXVsdCwgZW11bGF0aW5nICBhICBtb2Rlcm4gdmVyc2lvbiAgb2YKLSAgICAgIENsZWFyVHlwZS4KLQotICAgICAgVGhpcyBjaGFuZ2UgaW5ldml0YWJseSBsZWFkcyB0byBkaWZmZXJlbnQgcmVuZGVyaW5nIHJlc3VsdHMsIGFuZAotICAgICAgeW91ICAgbWlnaHQgICBjaGFuZ2UgICB0aGUgICBgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HJwotICAgICAgY29uZmlndXJhdGlvbiBvcHRpb24gdG8gIGFkYXB0IGl0IHRvIHlvdXIgdGFzdGUgKG9yICB1c2UgdGhlIG5ldwotICAgICAgYEZSRUVUWVBFX1BST1BFUlRJRVMnICAgIGVudmlyb25tZW50ICAgIHZhcmlhYmxlKS4gICAgU2VlICAgIHRoZQotICAgICAgY29ycmVzcG9uZGluZyBlbnRyeSAgYmVsb3cgZm9yICB2ZXJzaW9uIDIuNi40LCB3aGljaCAgZ2l2ZXMgbW9yZQotICAgICAgaW5mb3JtYXRpb24uCi0KLSAgICAtIEEgbmV3IG9wdGlvbiAgYEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUycgaGFzIGJlZW4KLSAgICAgIGludHJvZHVjZWQuICAgSWYgIHNldCAod2hpY2ggIGlzICB0aGUgIGRlZmF1bHQpLCBhbiAgZW52aXJvbm1lbnQKLSAgICAgIHZhcmlhYmxlICBgRlJFRVRZUEVfUFJPUEVSVElFUycgY2FuICBiZSB1c2VkICB0byBjb250cm9sICBkcml2ZXIKLSAgICAgIHByb3BlcnRpZXMuICBFeGFtcGxlOgotCi0gICAgICAgIEZSRUVUWVBFX1BST1BFUlRJRVM9dHJ1ZXR5cGU6aW50ZXJwcmV0ZXItdmVyc2lvbj0zNSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZmOm5vLXN0ZW0tZGFya2VuaW5nPTEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9maXR0ZXI6d2FycGluZz0xCi0KLSAgICAgIFRoaXMgYWxsb3dzIHRvIHNlbGVjdCwgc2F5LCB0aGUgc3VicGl4ZWwgaGludGluZyBtb2RlIGF0IHJ1bnRpbWUKLSAgICAgIGZvciBhIGdpdmVuIGFwcGxpY2F0aW9uLiAgU2VlIGZpbGUgYGZ0b3B0aW9uLmgnIGZvciBtb3JlLgotCi0KLSAgSUkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQWZ0ZXIgIGxvYWRpbmcgYSAgbmFtZWQgaW5zdGFuY2UgIG9mICBhIEdYICB2YXJpYXRpb24gZm9udCwgIHRoZQotICAgICAgYGZhY2VfaW5kZXgnICB2YWx1ZSAgaW4gIHRoZSByZXR1cm5lZCAgYEZUX0ZhY2UnICBzdHJ1Y3R1cmUgIG5vdwotICAgICAgY29ycmVjdGx5IGhvbGRzIHRoZSBuYW1lZCBpbnN0YW5jZSAgaW5kZXggaW4gdGhlIHVwcGVyIDE2Yml0cyBhcwotICAgICAgZG9jdW1lbnRlZC4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBBIG5ldyBtYWNybyBgRlRfSVNfTkFNRURfSU5TVEFOQ0UnIHRvICB0ZXN0IHdoZXRoZXIgYSBnaXZlbiBmYWNlCi0gICAgICBpcyBhIG5hbWVkIGluc3RhbmNlLgotCi0gICAgLSBNb3JlIGZpeGVzIHRvIEdYIGZvbnQgaGFuZGxpbmcuCi0KLSAgICAtIEFwcGxlJ3MgICBgR0VUVkFSSUFUSU9OJyAgYnl0ZWNvZGUgICBvcGVyYXRvciAgKG5lZWRlZCAgIGZvciAgR1gKLSAgICAgIHZhcmlhdGlvbiBmb250IHN1cHBvcnQpIGhhcyBiZWVuIGltcGxlbWVudGVkLgotCi0gICAgLSBBbm90aGVyIHJvdW5kICBvZiBmdXp6ZXIgZml4ZXMsICBtYWlubHkgdG8gcmVqZWN0ICBpbnZhbGlkIGZvbnRzCi0gICAgICBmYXN0ZXIuCi0KLSAgICAtIEhhbmRsaW5nIG9mIHJhdyBDSUQgZm9udHMgIHdhcyBicm9rZW4gKGJ1ZyBpbnRyb2R1Y2VkIGluIHZlcnNpb24KLSAgICAgIDIuNi40KS4KLQotICAgIC0gVGhlIHNtb290aCByYXN0ZXJpemVyIGhhcyBiZWVuIHN0cmVhbWxpbmVkICB0byBtYWtlIGl0IGZhc3RlciBieQotICAgICAgYXBwcm94LiAyMCUuCi0KLSAgICAtIFRoZSBgZnRncmlkJyAgZGVtbyBwcm9ncmFtIG5vdyAgdW5kZXJzdGFuZHMgY29tbWFuZCAgbGluZSBvcHRpb24KLSAgICAgIGAtZCcgdG8gZ2l2ZSBzdGFydC11cCBkZXNpZ24gY29vcmRpbmF0ZXMuCi0KLSAgICAtIFRoZSBgZnRkdW1wJyBkZW1vIHByb2dyYW0gaGFzICBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIGAtcCcgdG8KLSAgICAgIGR1bXAgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNi40IGFuZCAyLjYuNQotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQ29tcGlsYXRpb24gd29ya3MgYWdhaW4gIG9uIE1hYyBPUyBYIChidWcgaW50cm9kdWNlZCAgaW4gdmVyc2lvbgotICAgICAgMi42LjQpLgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIFRoZSBuZXcgIHN1YnBpeGVsIGhpbnRpbmcgIG1vZGUgaXMgbm93ICBkaXNhYmxlZCBieSAgZGVmYXVsdDsgaXQKLSAgICAgIHdpbGwgIGJlIGVuYWJsZWQgIGJ5IGRlZmF1bHQgIGluIHRoZSAgZm9ydGhjb21pbmcgMi43LnggIHNlcmllcy4KLSAgICAgIE1haW4gcmVhc29uIGZvciByZXZlcnRpbmcgdGhpcyBmZWF0dXJlIGlzIHRoZSBwcmluY2lwbGUgb2YgbGVhc3QKLSAgICAgIHN1cnByaXNlOiBhICBzdWRkZW4gY2hhbmdlIGluICBhcHBlYXJhbmNlIG9mIGFsbCBmb250cyAgKGV2ZW4gaWYKLSAgICAgIHRoZSByZW5kZXJpbmcgaW1wcm92ZXMgIGZvciBhbG1vc3QgYWxsIHJlY2VudCAgZm9udHMpIHNob3VsZCBub3QKLSAgICAgIGJlIGV4cGVjdGVkIGluIGEgbmV3IG1pY3JvIHZlcnNpb24gb2YgYSBzZXJpZXMuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi42LjMgYW5kIDIuNi40Ci0KLSAgSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gQSBuZXcgIHN1YnBpeGVsIGhpbnRpbmcgIG1vZGUgaGFzICBiZWVuIGNvbnRyaWJ1dGVkICBieSBOaWtvbGF1cwotICAgICAgV2F4d2VpbGVyLCB3aGljaCBpcyBub3cgdGhlICBkZWZhdWx0IHJlbmRlcmluZyBtb2RlIGZvciBUcnVlVHlwZQotICAgICAgZm9udHMuICBJdCBpbXBsZW1lbnRzICAoYWxtb3N0IGV2ZXJ5dGhpbmcgb2YpIHZlcnNpb24gIDQwIG9mIHRoZQotICAgICAgYnl0ZWNvZGUgZW5naW5lLgotCi0gICAgICBUaGUgZXhpc3RpbmcgY29kZSAgYmFzZSBpbiBGcmVlVHlwZSAodGhlICBgSW5maW5hbGl0eSBjb2RlJykgd2FzCi0gICAgICBzdHJpcHBlZCB0byB0aGUgYmFyZSBtaW5pbXVtICBhbmQgYWxsIGNvbmZpZ3VyYWJpbGl0eSByZW1vdmVkIGluCi0gICAgICB0aGUgIG5hbWUgIG9mIHNwZWVkICBhbmQgIHNpbXBsaWNpdHkuICAgVGhlIGNvbmZpZ3VyYWJpbGl0eSAgd2FzCi0gICAgICBtYWlubHkgYWltZWQgIGF0IGxlZ2FjeSAgZm9udHMgbGlrZSBBcmlhbCwgIFRpbWVzIE5ldyAgUm9tYW4sIG9yCi0gICAgICBDb3VyaWVyLiAgW0xlZ2FjeSBmb250cyBhcmUgZm9udHMgIHRoYXQgbW9kaWZ5IHZlcnRpY2FsIHN0ZW1zIHRvCi0gICAgICBhY2hpZXZlIGNsZWFuIGJsYWNrLWFuZC13aGl0ZSBiaXRtYXBzLl0gIFRoZSBuZXcgbW9kZSBmb2N1c2VzIG9uCi0gICAgICBhcHBseWluZyBhIG1pbmltYWwgc2V0IG9mIHJ1bGVzIHRvIGFsbCBmb250cyBpbmRpc2NyaW1pbmF0ZWx5IHNvCi0gICAgICB0aGF0IG1vZGVybiBhbmQgd2ViIGZvbnRzICByZW5kZXIgd2VsbCB3aGlsZSBsZWdhY3kgZm9udHMgcmVuZGVyCi0gICAgICBva2F5LgotCi0gICAgICBBY3RpdmF0aW9uICBvZiB0aGUgIHN1YnBpeGVsIGhpbnRpbmcgIHN1cHBvcnQgY2FuICBiZSBjb250cm9sbGVkCi0gICAgICB3aXRoICAgdGhlICAgYFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORycgICBjb25maWd1cmF0aW9uCi0gICAgICBvcHRpb24gIGF0IGNvbXBpbGUgIHRpbWU6IElmICBzZXQgdG8gIHZhbHVlIDEsICB5b3UgZ2V0ICB0aGUgb2xkCi0gICAgICBJbmZpbmFsaXR5ICBtb2RlICAod2hpY2ggIHdhcyAgbmV2ZXIgIHRoZSAgZGVmYXVsdCAgZHVlICB0byAgaXRzCi0gICAgICBzbG93bmVzcykuICBWYWx1ZSAyIGFjdGl2YXRlcyB0aGUgbmV3IHN1YnBpeGVsIGhpbnRpbmcgbW9kZSwgYW5kCi0gICAgICB2YWx1ZSAzIGFjdGl2YXRlcyBib3RoLiAgVGhlIGRlZmF1bHQgaXMgdmFsdWUgMi4KLQotICAgICAgQXQgcnVuIHRpbWUsICB5b3UgY2FuIHNlbGVjdCB0aGUgc3VicGl4ZWwgaGludGluZyAgbW9kZSB3aXRoIHRoZQotICAgICAgYGludGVycHJldGVyLXZlcnNpb24nICBwcm9wZXJ0eSAocHJvdmlkZWQgIHlvdSBoYXZlICBjb21waWxlZCBpbgotICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgaGludGluZyBtb2RlKTsgc2VlIGBmdHR0ZHJ2LmgnIGZvciBtb3JlLgotCi0gICAgLSBTdXBwb3J0ICBmb3IgIHRoZSAgZm9sbG93aW5nICBzY3JpcHRzICBoYXMgIGJlZW4gIGFkZGVkICB0byAgdGhlCi0gICAgICBhdXRvLWhpbnRlci4KLQotICAgICAgICBBcm1lbmlhbiwgQ2hlcm9rZWUsIEV0aGlvcGljLCBHZW9yZ2lhbiwgR3VqYXJhdGksIEd1cm11a2hpLAotICAgICAgICBNYWxheWFsYW0sIFNpbmhhbGEsIFRhbWlsCi0KLQotICBJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBUeXBlIDQyIGZvbnRzIGFzIGNyZWF0ZWQgYnkgTGlseVBvbmQgYXJlIG5vdyBzdXBwb3J0ZWQuCi0KLSAgICAtIE1pbm9yIHJlbmRlcmluZyBpbXByb3ZlbWVudHMgaW4gdGhlIGF1dG8taGludGVyLgotCi0gICAgLSBGb3IgZXhwZXJpbWVudGFsICByZWFzb25zLCB0aGUgb2xkICBDRkYgZW5naW5lIG5vdyAgc3VwcG9ydHMgYWxsCi0gICAgICBDRkYgb3BlcmF0b3JzIGV4Y2VwdCBgcmFuZG9tJywgaW5jbHVkaW5nIHRoZSBkZXByZWNhdGVkIE11bHRpcGxlCi0gICAgICBNYXN0ZXJzICBpbnN0cnVjdGlvbnMuICBUaGlzICBhbGxvd3MgdGhlICBkaXNwbGF5IG9mICBmb250cyBsaWtlCi0gICAgICBgSVRDR2FyYW1vbmRNTS1JdC5vdGYnICh3aXRob3V0IGZvbnQgdmFyaWF0aW9ucywgdGhvdWdoKS4KLQotICAgIC0gQW5vdGhlciByb3VuZCBvZiBmaXhlcyB0byBpbXByb3ZlIGhhbmRsaW5nIG9mIGludmFsaWQgZm9udHMuCi0KLSAgICAtIFRoZSBgZnRncmlkJyBkZW1vIHByb2dyYW0gbm93IGRpc3BsYXlzIHRoZSByZW5kZXJlZCBwaXhlbHMgYWxzbzsKLSAgICAgIHRoaXMgY2FuIGJlIHN3aXRjaGVkIG9mZiB3aXRoIHRoZSBgYicga2V5LiAgU2VsZWN0aW9uIG9mIHZhcmlvdXMKLSAgICAgIExDRCBmaWx0ZXJpbmcgbW9kZXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgYEwnIGtleS4KLQotICAgIC0gVGhlIGRlbW8gcHJvZ3JhbXMgIGhhdmUgYmVlbiBleHRlbmRlZCB0byBhbGxvdyAgc2VsZWN0aW9uIG9mIGFsbAotICAgICAgYXZhaWxhYmxlIFRydWVUeXBlIGJ5dGVjb2RlIGVuZ2luZXMuCi0KLSAgICAtIEEgdmVyeSBlYXJseSBiZXRhIHZlcnNpb24gb2YgYSBuZXcsIFF0IGJhc2VkIGRlbW8gcHJvZ3JhbSBjYWxsZWQKLSAgICAgIGBmdGluc3BlY3QnICBpcyAgcGFydCAgb2YgIHRoZSAgIHNvdXJjZSAgY29kZSAgYnVuZGxlOyAgaXQgIHdpbGwKLSAgICAgIGV2ZW50dWFsbHkgc3VwZXJzZWRlICB0aGUgb3RoZXIgIGRlbW8gcHJvZ3JhbXMuICAgQ3VycmVudGx5LCB5b3UKLSAgICAgIGhhdmUgdG8gY29tcGlsZSAgaXQgbWFudWFsbHkgd2l0aCBgcW1ha2U7IG1ha2UnOyAgbm90ZSB0aGF0IG1hbnkKLSAgICAgIGZlYXR1cmVzIGFyZSBzdGlsbCBtaXNzaW5nLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNi4yIGFuZCAyLjYuMwotCi0gIEkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIEtobWVyLCAgTXlhbm1hciwgQmVuZ2FsaSwgIGFuZCBLYW5uYWRhICBzY3JpcHQgc3VwcG9ydCAgaGFzIGJlZW4KLSAgICAgIGFkZGVkIHRvIHRoZSBhdXRvLWhpbnRlci4KLQotCi0gIElJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIEJldHRlciAgc3VwcG9ydCBvZiAgSW5kaWMgIHNjcmlwdHMgbGlrZSAgRGV2YW5hZ2FyaSAgYnkgdXNpbmcgIGEKLSAgICAgIHRvcC10by1ib3R0b20gaGludGluZyBmbG93LgotCi0gICAgLSBBbGwgIEZyZWVUeXBlIG1hY3JvcyAgc3RhcnRpbmcgIHdpdGggdHdvICB1bmRlcnNjb3JlcyBoYXZlICBiZWVuCi0gICAgICByZW5hbWVkIHRvICBhdm9pZCBhIHZpb2xhdGlvbiBvZiAgYm90aCB0aGUgQyBhbmQgIEMrKyBzdGFuZGFyZHMuCi0gICAgICBFeGFtcGxlOiBIZWFkZXIgIG1hY3JvcyBvZiB0aGUgIGZvcm0gYF9fRk9PX0hfXycgYXJlICBub3cgY2FsbGVkCi0gICAgICBgRk9PX0hfJy4gIEluIG1vc3QgY2FzZXMsICB0aGlzIHNob3VsZCBiZSBjb21wbGV0ZWx5IHRyYW5zcGFyZW50Ci0gICAgICB0byB0aGUgdXNlci4gICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgIGlzIGBfX0ZURVJST1JTX0hfXycsIHdoaWNoCi0gICAgICBtdXN0IGJlICBzb21ldGltZXMgdW5kZWZpbmVkIGJ5ICB0aGUgdXNlciB0byBnZXQgIEZyZWVUeXBlIGVycm9yCi0gICAgICBzdHJpbmdzOiAgQm90aCB0aGlzICBmb3JtIGFuZCAgdGhlIG5ldyAgYEZURVJST1JTX0hfJyBtYWNybyAgYXJlCi0gICAgICBhY2NlcHRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQotICAgIC0gTWlub3IgaW1wcm92ZW1lbnRzIG1haW5seSB0byB0aGUgVHlwZSAxIGRyaXZlci4KLQotICAgIC0gVGhlICBuZXcgQ0ZGICBlbmdpbmUgbm93ICBzdXBwb3J0cyBhbGwgIFR5cGUgMiAgb3BlcmF0b3JzIGV4Y2VwdAotICAgICAgYHJhbmRvbScuCi0KLSAgICAtIFRoZSBtYWNybyBgX1NUQU5EQUxPTkVfJywgdXNlZCBmb3IgIGNvbXBpbGluZyB0aGUgQi9XIGFuZCBzbW9vdGgKLSAgICAgIHJhc3Rlcml6ZXJzICBhcyAgIHN0YW5kLWFsb25lICBtb2R1bGVzLCAgaGFzICBiZWVuICAgcmVuYW1lZCAgdG8KLSAgICAgIGBTVEFOREFMT05FXycsIHNpbmNlIG1hY3JvIG5hbWVzIHN0YXJ0aW5nIHdpdGggYW4gdW5kZXJzY29yZSBhbmQKLSAgICAgIGZvbGxvd2VkIGJ5IGFuIHVwcGVyY2FzZSBsZXR0ZXIgYXJlIHJlc2VydmVkIGluIGJvdGggQyBhbmQgQysrLgotCi0gICAgLSBGdW5jdGlvbiAgYEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cycgIG5vdyAgYWxzbyAgYWN0aXZhdGVzCi0gICAgICBjdXN0b20gTENEIGZpbHRlciB3ZWlnaHRzIChpbnN0ZWFkIG9mIGp1c3QgYWRqdXN0aW5nIHRoZW0pLgotCi0gICAgLSBTdXBwb3J0IGZvciAgYHVucGF0ZW50ZWQgaGludGluZycgIGhhcyBiZWVuICBjb21wbGV0ZWx5IHJlbW92ZWQ6Ci0gICAgICBDb25zZXF1ZW50bHksICB0aGUgdHdvICBmdW5jdGlvbnMgYEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMnCi0gICAgICBhbmQgIGBGVF9GYWNlX1NldFVucGF0ZW50ZWRIaW50aW5nJyAgbm93ICByZXR1cm4gIGFsd2F5cyAgZmFsc2UsCi0gICAgICBkb2luZyBub3RoaW5nLgotCi0gICAgLSBUaGUgYGZ0Z2FtbWEnIGRlbW8gIHByb2dyYW0gaGFzIGJlZW4gbW9kZXJuaXplZDsgIHRoZSBnYW1tYSBncmlkCi0gICAgICBkaXNwbGF5IGhhcyBiZWVuIG1vdmVkIGZyb20gYGZ0dmlldycgdG8gdGhpcyBwcm9ncmFtLgotCi0gICAgLSBJbiBgZnR2aWV3JywgIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBjeWNsZSB0aHJvdWdoICB0aGUgYXZhaWxhYmxlCi0gICAgICBMQ0QgZmlsdGVyaW5nIG1vZGVzLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNi4xIGFuZCAyLjYuMgotCi0gIEkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIFRoZSBhdXRvLWhpbnRlciBub3cgc3VwcG9ydHMgc3RlbSBkYXJrZW5pbmcsIHRvIGJlIGNvbnRyb2xsZWQgYnkKLSAgICAgIHRoZSAgICBuZXcgICBgbm8tc3RlbS1kYXJrZW5pbmcnICAgIGFuZCAgIGBkYXJrZW5pbmctcGFyYW1ldGVycycKLSAgICAgIHByb3BlcnRpZXMuICAgVGhpcyBpcyAgYW4gIGV4cGVyaW1lbnRhbCAgZmVhdHVyZSBjb250cmlidXRlZCAgYnkKLSAgICAgIE5pa29sYXVzIFdheHdlaWxlciwgYW5kICB0aGUgaW50ZXJmYWNlIG1pZ2h0IGNoYW5nZSAgaW4gYSBmdXR1cmUKLSAgICAgIHJlbGVhc2UuCi0KLSAgICAtIEJ5IGRlZmF1bHQsIHN0ZW0gZGFya2VuaW5nIGlzIG5vdyBzd2l0Y2hlZCBvZmYgKGZvciBib3RoIHRoZSBDRkYKLSAgICAgIGVuZ2luZSBhbmQgdGhlICBhdXRvLWhpbnRlcikuICBUaGUgbWFpbiByZWFzb24gaXMgIHRoYXQgeW91IG5lZWQKLSAgICAgIGxpbmVhciAgYWxwaGEgIGJsZW5kaW5nICBhbmQgIGdhbW1hIGNvcnJlY3Rpb24gIHRvICBnZXQgIGNvcnJlY3QKLSAgICAgIHJlbmRlcmluZyByZXN1bHRzLCBhbmQgIHRoZSBsYXR0ZXIgaXMgbm90IHlldCAgYXZhaWxhYmxlIGluIG1vc3QKLSAgICAgIGZyZWVseSAgYXZhaWxhYmxlICByZW5kZXJpbmcgIHN0YWNrcyBsaWtlICBYMTEuICAgQXBwbHlpbmcgIHN0ZW0KLSAgICAgIGRhcmtlbmluZyB3aXRob3V0IHByb3BlciBnYW1tYSBjb3JyZWN0aW9uICBsZWFkcyB0byBmYXIgdG9vIGRhcmsKLSAgICAgIHJlbmRlcmluZyByZXN1bHRzLgotCi0gICAgLSBUaGUgICBtZWFuaW5nICBvZiAgIGBGVF9SRU5ERVJfTU9ERV9MSUdIVCcgIGhhcyAgIGJlZW4gIHNsaWdodGx5Ci0gICAgICBtb2RpZmllZC4gICBJdCAgbm93ICBlc3NlbnRpYWxseSAgbWVhbnMgYG5vICBoaW50aW5nICBhbG9uZyAgdGhlCi0gICAgICBob3Jpem9udGFsICBheGlzJzsgaW4gIHBhcnRpY3VsYXIsICBubyBjaGFuZ2UgIG9mIGdseXBoICBhZHZhbmNlCi0gICAgICB3aWR0aHMuICBDb25zZXF1ZW50bHksIHRoZSBhdXRvLWhpbnRlciAgaXMgdXNlZCBmb3IgYWxsIHNjYWxhYmxlCi0gICAgICBmb250ICBmb3JtYXRzICBleGNlcHQgIGZvciAgQ0ZGLiAgICBJdCAgaXMgIHBsYW5uZWQgIHRoYXQgIG90aGVyCi0gICAgICBmb250LXNwZWNpZmljIHJlbmRlcmluZyBlbmdpbmVzIChUcnVlVHlwZSwgVHlwZSAxKSB3aWxsIGZvbGxvdy4KLQotCi0gIElJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIFRoZSBkZWZhdWx0ICBMQ0QgZmlsdGVyICBoYXMgYmVlbiBjaGFuZ2VkICB0byBiZSAgbm9ybWFsaXplZCBhbmQKLSAgICAgIGNvbG9yLWJhbGFuY2VkLgotCi0gICAgLSBGb3IgICAgYmV0dGVyICAgIGNvbXBhdGliaWxpdHkgICB3aXRoICAgIEZvbnRDb25maWcsICAgIGZ1bmN0aW9uCi0gICAgICBgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXInICBhY2NlcHRzICAgYSAgbmV3ICAgZW51bWVyYXRpb24gIHZhbHVlCi0gICAgICBgRlRfTENEX0ZJTFRFUl9MRUdBQ1kxJyAgICh3aGljaCAgaGFzICAgdGhlICAgc2FtZSAgbWVhbmluZyAgIGFzCi0gICAgICBgRlRfTENEX0ZJTFRFUl9MRUdBQ1knKS4KLQotICAgIC0gQSBsYXJnZSBudW1iZXIgb2YgYnVncyBoYXZlIGJlZW4gZGV0ZWN0ZWQgYnkgdXNpbmcgdGhlIGxpYkZ1enplcgotICAgICAgZnJhbWV3b3JrLCAgd2hpY2ggc2hvdWxkICBmdXJ0aGVyICBpbXByb3ZlICBoYW5kbGluZyBvZiAgaW52YWxpZAotICAgICAgZm9udHMuICBUaGFua3MgYWdhaW4gdG8gS29zdHlhIFNlcmVicnlhbnkgYW5kIEJ1bmdlbWFuIQotCi0gICAgLSBgVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUycsICBhICAgbmV3ICBjb25maWd1cmF0aW9uCi0gICAgICBvcHRpb24sIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBleGVjdXRlZCBvcGNvZGVzIHdpdGhpbiBhCi0gICAgICBieXRlY29kZSBwcm9ncmFtLiAgWW91IGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoaXMgZXhjZXB0IGZvciB2ZXJ5Ci0gICAgICBzcGVjaWFsICBzaXR1YXRpb25zIChlLmcuLCAgbWFraW5nIGEgIGxpYnJhcnkgZnV6emVyICBzcGVuZCBsZXNzCi0gICAgICB0aW1lIHRvIGhhbmRsZSBicm9rZW4gZm9udHMpLgotCi0gICAgLSBUaGUgc21vb3RoIHJlbmRlcmVyIGhhcyBiZWVuIG1hZGUgZmFzdGVyLgotCi0gICAgLSBUaGUgYGZ0c3RyaW5nJyAgZGVtbyBwcm9ncmFtICBub3cgc3VwcG9ydHMgIHN1Yi1waXhlbCByZW5kZXJpbmc7Ci0gICAgICB1c2Uga2V5IGBsJyB0byBjeWNsZSB0aHJvdWdoIHRoZSBMQ0QgbW9kZXMuCi0KLSAgICAtIFRoZSBgZnRzdHJpbmcnICBkZW1vIHByb2dyYW0gbm93IHN1cHBvcnRzICBjb2xvdXIgcmVuZGVyaW5nOyB1c2UKLSAgICAgIHRoZSBgc3BhY2UnIGtleSB0byBjeWNsZSB0aHJvdWdoIHZhcmlvdXMgY29sb3VyIGNvbWJpbmF0aW9ucy4KLQotICAgIC0gVGhlIGdyYXBoaWNhbCBkZW1vIHByb2dyYW1zIG5vdyB1c2UgYSBkZWZhdWx0IGdhbW1hIHZhbHVlIG9mIDEuOAotICAgICAgKGluc3RlYWQgb2YgMS4yKS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjYgYW5kIDIuNi4xCi0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBJdCB0dXJuZWQgIG91dCB0aGF0IGZvciBDRkZzICBvbmx5IHRoZSBhZHZhbmNlIHdpZHRocyAgc2hvdWxkIGJlCi0gICAgICB0YWtlbiBmcm9tIHRoZSAgYGh0bXgnIHRhYmxlLCBub3QgdGhlIHNpZGUgIGJlYXJpbmdzLiAgVGhpcyBidWcsCi0gICAgICBpbnRyb2R1Y2VkIGluICB2ZXJzaW9uIDIuNi4wLCBtYWtlcyAgaXQgbmVjZXNzYXJ5IHRvICB1cGdyYWRlIGlmCi0gICAgICB5b3UgYXJlIHVzaW5nICBDRkZzOyBvdGhlcndpc2UsIHlvdSBnZXQgY3JvcHBlZCAgZ2x5cGhzIHdpdGggR1VJCi0gICAgICBpbnRlcmZhY2VzIGxpa2UgR1RLIG9yIFF0LgotCi0gICAgLSBBY2Nlc3NpbmcgVHlwZSA0MiBmb250cyByZXR1cm5lZCAgaW5jb3JyZWN0IHJlc3VsdHMgaWYgdGhlIGdseXBoCi0gICAgICBvcmRlciBvZiB0aGUgZW1iZWRkZWQgVHJ1ZVR5cGUgZm9udCBkaWZmZXJzIGZyb20gdGhlIGdseXBoIG9yZGVyCi0gICAgICBvZiB0aGUgVHlwZSA0MiBjaGFyc3RyaW5ncyB0YWJsZS4KLQotCi0gIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwotCi0gICAgLSBUaGUgaGVhZGVyICBmaWxlIGxheW91dCAgaGFzIGJlZW4gIGNoYW5nZWQgKGFnYWluKSwgIG1vdmluZyAgYWxsCi0gICAgICBoZWFkZXIgZmlsZXMgZXhjZXB0IGBmdDJidWlsZC5oJyBpbnRvIGEgc3ViZGlyZWN0b3J5IHRyZWUuCi0KLSAgICAgIERvaW5nIHNvICByZWR1Y2VzIHRoZSAgcG9zc2liaWxpdHkgb2YgIGhlYWRlciBmaWxlICBuYW1lIGNsYXNoZXMKLSAgICAgIChlLmcuLCBGVEdMJ3MgIGBGVEdseXBoLmgnIHdpdGggRnJlZVR5cGUncyBgZnRnbHlwaC5oJykgIG9uIGNhc2UKLSAgICAgIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcyBsaWtlIE1hYyBPUyBYIG9yIFdpbmRvd3MuCi0KLSAgICAgIEFwcGxpY2F0aW9ucyAgdGhhdCAgdXNlICAoYSkgIHRoZSAgYGZyZWV0eXBlLWNvbmZpZycgIHNjcmlwdCAgb3IKLSAgICAgIEZyZWVUeXBlJ3MgYGZyZWV0eXBlMi5wYycgZmlsZSBmb3IgcGtnLWNvbmZpZyB0byBnZXQgdGhlIGluY2x1ZGUKLSAgICAgIGRpcmVjdG9yeSAgZm9yIHRoZSAgY29tcGlsZXIsICBhbmQgKGIpICB0aGUgIGRvY3VtZW50ZWQgd2F5ICBmb3IKLSAgICAgIGhlYWRlciBpbmNsdXNpb24gbGlrZQotCi0gICAgICAgICNpbmNsdWRlIDxmdDJidWlsZC5oPgotICAgICAgICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0gICAgICAgIC4uLgotCi0gICAgICBkb24ndCBuZWVkIGFueSBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlLgotCi0gICAgLSBTaW1wbGUgYWNjZXNzICB0byBuYW1lZCBpbnN0YW5jZXMgIGluIEdYIHZhcmlhdGlvbiBmb250cyAgaXMgbm93Ci0gICAgICBhdmFpbGFibGUgKGluIGFkZGl0aW9uIHRvIHRoZSAgcHJldmlvdXMgbWV0aG9kIHZpYSBGcmVlVHlwZSdzIE1NCi0gICAgICBpbnRlcmZhY2UpLiAgIEluICB0aGUgYEZUX0ZhY2UnICBzdHJ1Y3R1cmUsICBiaXRzICAxNi0zMCBvZiAgdGhlCi0gICAgICBgZmFjZV9pbmRleCcgZmllbGQgaG9sZCB0aGUgY3VycmVudCBuYW1lZCBpbnN0YW5jZSBpbmRleCBmb3IgdGhlCi0gICAgICBnaXZlbiBmYWNlICBpbmRleCwgYW5kIGJpdHMgIDE2LTMwIG9mIGBzdHlsZV9mbGFncycgIGNvbnRhaW4gdGhlCi0gICAgICBudW1iZXIgb2YgIGluc3RhbmNlcyBmb3IgIHRoZSBnaXZlbiBmYWNlICBpbmRleC4gIGBGVF9PcGVuX0ZhY2UnCi0gICAgICBhbmQgZnJpZW5kcyBhbHNvIHVuZGVyc3RhbmQgdGhlICBleHRlbmRlZCBiaXRzIG9mIHRoZSBmYWNlIGluZGV4Ci0gICAgICBwYXJhbWV0ZXIuCi0KLSAgICAgIFlvdSBuZWVkIHRvIGVuYWJsZSAgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCBmb3IgdGhpcyBuZXcKLSAgICAgIGZlYXR1cmUuICBPdGhlcndpc2UsIGJpdHMgIDE2LTMwIG9mIHRoZSB0d28gZmllbGRzICBhcmUgemVybyAob3IKLSAgICAgIGFyZSBpZ25vcmVkKS4KLQotICAgIC0gTGFvIHNjcmlwdCBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBhdXRvLWhpbnRlci4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBUaGUgYXV0by1oaW50ZXIncyBBcmFiaWMgc2NyaXB0IHN1cHBvcnQgaGFzIGJlZW4gZW5oYW5jZWQuCi0KLSAgICAtIFN1cGVyc2NyaXB0LWxpa2UgYW5kICBzdWJzY3JpcHQtbGlrZSBnbHlwaHMgIGFzIHVzZWQgIGJ5IHZhcmlvdXMKLSAgICAgIHBob25ldGljIGFscGhhYmV0cyBsaWtlIHRoZSBJUEEgIGFyZSBub3cgYmV0dGVyIHN1cHBvcnRlZCBieSB0aGUKLSAgICAgIGF1dG8taGludGVyLgotCi0gICAgLSBUaGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgbm93IHJ1bnMgc2xpZ2h0bHkgZmFzdGVyLgotCi0gICAgLSBJbXByb3ZlZCBzdXBwb3J0IGZvciBidWlsZHMgd2l0aCBjbWFrZS4KLQotICAgIC0gVGhlICBmdW5jdGlvbiAgYEZUX0NlaWxGaXgnICBub3cgICBhbHdheXMgIHJvdW5kcyAgdG93YXJkcyAgcGx1cwotICAgICAgaW5maW5pdHkuCi0KLSAgICAtIFRoZSAgZnVuY3Rpb24gIGBGVF9GbG9vckZpeCcgIG5vdyBhbHdheXMgIHJvdW5kcyAgdG93YXJkcyAgbWludXMKLSAgICAgIGluZmluaXR5LgotCi0gICAgLSBBICBuZXcgbG9hZCAgZmxhZyBgRlRfTE9BRF9DT01QVVRFX01FVFJJQ1MnICBoYXMgYmVlbiAgYWRkZWQ7IGl0Ci0gICAgICBtYWtlcyBGcmVlVHlwZSAgaWdub3JlIHByZS1jb21wdXRlZCAgbWV0cmljcywgYXMgbmVlZGVkICBieSBmb250Ci0gICAgICB2YWxpZGF0aW5nICBvciAgZm9udCAgZWRpdGluZyAgcHJvZ3JhbXMuICBSaWdodCAgbm93LCAgb25seSAgdGhlCi0gICAgICBUcnVlVHlwZSAgbW9kdWxlIHN1cHBvcnRzICBpdCAgdG8gaWdub3JlICBkYXRhICBmcm9tIHRoZSAgYGhkbXgnCi0gICAgICB0YWJsZS4KLQotICAgIC0gQW5vdGhlciByb3VuZCBvZiBidWcgZml4ZXMgIHRvIGJldHRlciBoYW5kbGUgYnJva2VuIGZvbnRzLCBmb3VuZAotICAgICAgYnkgS29zdHlhIFNlcmVicnlhbnkgPGtjY0Bnb29nbGUuY29tPi4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjUuNSBhbmQgMi42Ci0KLSAgSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gQmVoZGFkICBFc2ZhaGJvZCBjb250cmlidXRlZCAgY29kZSAgZm9yIGltcHJvdmVkICB0aHJlYWQtc2FmZXR5LAotICAgICAgd2hpY2ggcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIG1vZGVsLgotCi0gICAgICAqIEFuIGBGVF9GYWNlJyBvYmplY3QgY2FuIG9ubHkgYmUgc2FmZWx5IHVzZWQgZnJvbSBvbmUgdGhyZWFkIGF0Ci0gICAgICAgIGEgdGltZS4KLQotICAgICAgKiBBbiBgRlRfTGlicmFyeScgIG9iamVjdCBjYW4gIG5vdyBiZSB1c2VkICB3aXRob3V0IG1vZGlmaWNhdGlvbgotICAgICAgICBmcm9tIG11bHRpcGxlIHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZS4KLQotICAgICAgKiBgRlRfRmFjZScgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICB3aXRoIHRoZSBzYW1lIGBGVF9MaWJyYXJ5JwotICAgICAgICBvYmplY3QgY2FuIG9ubHkgYmUgZG9uZSBmcm9tIG9uZSB0aHJlYWQgYXQgYSB0aW1lLgotCi0gICAgICBPbmUgY2FuIHVzZSBhIHNpbmdsZSAgYEZUX0xpYnJhcnknIG9iamVjdCBhY3Jvc3MgdGhyZWFkcyBhcyBsb25nCi0gICAgICBhcyBhIG11dGV4IGxvY2sgaXMgdXNlZCBhcm91bmQgYEZUX05ld19GYWNlJyBhbmQgYEZUX0RvbmVfRmFjZScuCi0gICAgICBBbnkgY2FsbHMgdG8gYEZUX0xvYWRfR2x5cGgnIGFuZCBzaW1pbGFyIEFQSSBhcmUgc2FmZSBhbmQgZG8gbm90Ci0gICAgICBuZWVkIHRoZSBsb2NrICB0byBiZSBoZWxkIGFzICBsb25nIGFzIHRoZSBzYW1lICBgRlRfRmFjZScgaXMgbm90Ci0gICAgICB1c2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLgotCi0gICAgLSBUaGFpIHNjcmlwdCBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBhdXRvLWhpbnRlci4KLQotICAgIC0gQXJhYmljIHNjcmlwdCBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBhdXRvLWhpbnRlci4KLQotICAgIC0gRm9sbG93aW5nIE9wZW5UeXBlIHZlcnNpb24gMS43LCAgYWR2YW5jZSB3aWR0aHMgYW5kIHNpZGUgYmVhcmluZwotICAgICAgdmFsdWVzIGluICBDRkZzICh3cmFwcGVkICBpbiBhbiBTRk5UICBzdHJ1Y3R1cmUpIGFyZSAgbm93IGFsd2F5cwotICAgICAgdGFrZW4gZnJvbSB0aGUgYGhtdHgnIHRhYmxlLgotCi0gICAgLSBGb2xsb3dpbmcgT3BlblR5cGUgIHZlcnNpb24gMS43LCB0aGUgIFBvc3RTY3JpcHQgZm9udCBuYW1lICBvZiBhCi0gICAgICBDRkYgZm9udCAod3JhcHBlZCBpbiBhbiBTRk5UIHN0cnVjdHVyZSkgaXMgbm93IGFsd2F5cyB0YWtlbiBmcm9tCi0gICAgICB0aGUgYG5hbWUnICB0YWJsZS4gIFRoaXMgaXMgIGFsc28gdHJ1ZSBmb3IgIE9wZW5UeXBlIENvbGxlY3Rpb25zCi0gICAgICAoaS5lLiwgVFRDcyB1c2luZyAgQ0ZGcyBzdWJmb250cyBpbnN0ZWFkIG9mIFRURnMpLCAgd2hlcmUgaXQgbWF5Ci0gICAgICBoYXZlIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4KLQotICAgIC0gRm9udHMgbmF0aXZlbHkgaGludGVkIGZvciAgQ2xlYXJUeXBlIGFyZSBub3cgc3VwcG9ydGVkLCBwcm9wZXJseQotICAgICAgaGFuZGxpbmcgc2VsZWN0b3IgaW5kZXggMyBvZiB0aGUgSU5TVENUUkwgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uCi0KLSAgICAtIE1ham9yIGltcHJvdmVtZW50cyB0byB0aGUgR1ggVHJ1ZVR5cGUgdmFyaWF0aW9uIGZvbnQgaGFuZGxpbmcuCi0KLQotICBJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBBIG5ldyBhdXRvLWhpbnRlciAgcHJvcGVydHkgYHdhcnBpbmcnIGNhbiBzd2l0Y2ggb24gIGFuZCBvZmYgdGhlCi0gICAgICB3YXJwaW5nIGNvZGUgIGlmIHRoaXMgIGV4cGVyaW1lbnRhbCBmZWF0dXJlICBpcyBjb21waWxlZCAgaW4gKGJ5Ci0gICAgICBkZWZpbmluZyAgdGhlIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUiAgY29uZmlndXJhdGlvbiBvcHRpb247Ci0gICAgICBieSBkZWZhdWx0ICB0aGlzIG9wdGlvbiBpcyAgbm93IGVuYWJsZWQgYnV0IHdhcnBpbmcgIGlzIHN3aXRjaGVkCi0gICAgICBvZmYpLgotCi0gICAgICBUaGUgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSIG9wdGlvbiBpdHNlbGYgaXMgYW4gb2xkIGZlYXR1cmUsCi0gICAgICBhdmFpbGFibGUgICBzaW5jZSAgMjAwNi4gICAgV2FycGluZyAgIG9ubHkgICB3b3JrcyAgaW4gICBgbGlnaHQnCi0gICAgICBhdXRvLWhpbnRpbmcgbW9kZS4gICBUaGUgaWRlYSBvZiAgdGhlIGNvZGUgaXMgdG8gIHNsaWdodGx5IHNjYWxlCi0gICAgICBhbmQgIHNoaWZ0IGEgIGdseXBoICBhbG9uZyB0aGUgIG5vbi1oaW50ZWQgIGRpbWVuc2lvbiAod2hpY2ggIGlzCi0gICAgICB1c3VhbGx5IHRoZSBob3Jpem9udGFsIGF4aXMpIHNvIHRoYXQgYXMgbXVjaCBvZiBpdHMgc2VnbWVudHMgYXJlCi0gICAgICBhbGlnbmVkICAobW9yZSBvciAgbGVzcykgdG8gIHRoZSBncmlkLiAgIFRvIGZpbmQgIG91dCBhICBnbHlwaCdzCi0gICAgICBvcHRpbWFsICAgc2NhbGluZyAgIGFuZCAgIHNoaWZ0aW5nICB2YWx1ZSwgICB2YXJpb3VzICAgcGFyYW1ldGVyCi0gICAgICBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuCi0KLSAgICAgIFNlZSAgZmlsZSAgYGZ0YXV0b2guaCcgZm9yICBtb3JlOyAgdGhlICBkZW1vIHByb2dyYW1zICBgZnRkaWZmJywKLSAgICAgIGBmdHZpZXcnLCBhbmQgYGZ0Z3JpZCcgY2FuIHRvZ2dsZSB3YXJwaW5nIHdpdGgga2V5IGB3Jy4KLQotICAgIC0gU29tZSAgZmllbGRzICBpbiAgdGhlICBgRlRDX0ltYWdlVHlwZVJlYycgIHN0cnVjdHVyZSAgaGF2ZSAgYmVlbgotICAgICAgY2hhbmdlZCBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZCAgdHlwZSwgd2hpY2ggYmV0dGVyIHJlZmxlY3RzIHRoZQotICAgICAgYWN0dWFsIHVzYWdlLiAgSXQgaXMgYWxzbyBhbiBhZGRpdGlvbmFsIG1lYW5zIHRvIHByb3RlY3QgYWdhaW5zdAotICAgICAgbWFsZm9ybWVkIGlucHV0LgotCi0gICAgICBUaGlzICBjaGFuZ2UgZG9lc24ndCAgYnJlYWsgIHRoZSBBQkk7ICBob3dldmVyLCAgaXQgbWlnaHQgIGNhdXNlCi0gICAgICBjb21waWxlciB3YXJuaW5ncy4KLQotICAgIC0gRnVuY3Rpb24gYEZUX0JpdG1hcF9OZXcnICBoYXMgYmVlbiByZW5hbWVkICB0byBgRlRfQml0bWFwX0luaXQnLAotICAgICAgc2luY2UgIHRoaXMgbmFtZSAgYmV0dGVyIHJlZmxlY3RzICBpdHMgIGZ1bmN0aW9uLiAgIEZvciBiYWNrd2FyZAotICAgICAgY29tcGF0aWJpbGl0eSwgdGhlIG9sZCBmdW5jdGlvbiBuYW1lIGlzIHN0aWxsIGF2YWlsYWJsZS4KLQotICAgIC0gRnVuY3Rpb24gICBgRlRfR2V0X1gxMV9Gb250X0Zvcm1hdCcgICBoYXMgICAgYmVlbiAgIHJlbmFtZWQgICB0bwotICAgICAgYEZUX0dldF9Gb250X0Zvcm1hdCcsICBzaW5jZSAgdGhpcyAgIG5hbWUgIGJldHRlciAgcmVmbGVjdHMgIGl0cwotICAgICAgZnVuY3Rpb24uICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgIHRoZSBvbGQgZnVuY3Rpb24gbmFtZSBpcwotICAgICAgc3RpbGwgYXZhaWxhYmxlLgotCi0gICAgICBBZGRpdGlvbmFsbHksIHRoZSBoZWFkZXIgIGZpbGUgbWFjcm8gZm9yIHRoaXMgIGZ1bmN0aW9uIGhhcyBiZWVuCi0gICAgICByZW5hbWVkIHRvICBgRlRfRk9OVF9GT1JNQVRTX0gnICh0aGUgb2xkIG5hbWUgIGBGVF9YRlJFRTg2X0gnIGlzCi0gICAgICByZXRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCi0KLSAgICAtIFZhcmlvdXMgaW1wcm92ZW1lbnRzIHRvIHRoZSBgZnRncmlkJyBkZW1vIHByb2dyYW0uCi0KLSAgICAgIC4gSXQgIGNhbiAgbm93ICBkaXNwbGF5ICBHWCBhbmQgIE1NICBmb250cyAgd2hpbGUgIGludGVyYWN0aXZlbHkKLSAgICAgICAgbWFuaXB1bGF0aW5nIHRoZSBheGVzICh3aXRoIGtleXMgRjIsIEYzLCBhbmQgRjQpLgotCi0gICAgICAuIEFudGktYWxpYXNpbmcgcmVuZGVyaW5nICBtb2RlcyBjYW4gbm93IGJlICBzZWxlY3RlZCAod2l0aCBrZXlzCi0gICAgICAgIEY1IGFuZCBGNikuCi0KLSAgICAgIC4gVGhlIGRpc3BsYXkgb2YgcG9pbnQgbnVtYmVycyBjYW4gYmUgdG9nZ2xlZCB3aXRoIGtleSBgRCcuCi0KLSAgICAtIFZhcmlvdXMgaW1wcm92ZW1lbnRzIHRvIHRoZSBgZnRkdW1wJyBkZW1vIHByb2dyYW0uCi0KLSAgICAgIC4gSXQgbm93IGRpc3BsYXlzIGluZm9ybWF0aW9uIG9uIE1NIGFuZCBHWCB2YXJpYXRpb24gYXhlcy4KLQotICAgICAgLiBOZXcgIGNvbW1hbmQgbGluZSBvcHRpb24gIGAtdScgbWFrZXMgIGl0IG91dHB1dCBkYXRhICBpbiB1dGYtOAotICAgICAgICBlbmNvZGluZy4KLQotICAgIC0gVGhlIGBmdG11bHRpJyAgZGVtbyBwcm9ncmFtIGNhbiAgbm93IGhhbmRsZSB1cCAgdG8gc2l4IE1NICBvciBHWAotICAgICAgYXhlcy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjUuNCBhbmQgMi41LjUKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIEhhbmRsaW5nIG9mICB1bmNvbXByZXNzZWQgUENGIGZpbGVzIHdvcmtzIGFnYWluIChidWcgIGludHJvZHVjZWQKLSAgICAgIGluIHZlcnNpb24gMi41LjQpLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNS4zIGFuZCAyLjUuNAotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQSAgIHZhcmlhbnQgIG9mICAgdnVsbmVyYWJpbGl0eSAgQ1ZFLTIwMTQtMjI0MCAgIHdhcyAgaWRlbnRpZmllZAotICAgICAgKGNmLiAgaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvYnVncy8/NDM2NjEpIGFuZCAgZml4ZWQgaW4gIHRoZQotICAgICAgbmV3IENGRiBkcml2ZXIuICBBbGwgdXNlcnMgc2hvdWxkIHVwZ3JhZGUuCi0KLSAgICAtIFRoZSBuZXcgYXV0by1oaW50ZXIgY29kZSB1c2luZyBIYXJmQnV6eiBjcmFzaGVkIGZvciBzb21lIGludmFsaWQKLSAgICAgIGZvbnRzLgotCi0gICAgLSBNYW55IGZpeGVzIHRvIGJldHRlciBwcm90ZWN0IGFnYWluc3QgbWFsZm9ybWVkIGlucHV0LgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIEZ1bGwgYXV0by1oaW50ZXIgc3VwcG9ydCBvZiB0aGUgRGV2YW5hZ2FyaSBzY3JpcHQuCi0KLSAgICAtIEV4cGVyaW1lbnRhbCBhdXRvLWhpbnRlciBzdXBwb3J0IG9mIHRoZSBUZWx1Z3Ugc2NyaXB0LgotCi0gICAgLSBDRkYgc3RlbSBkYXJrZW5pbmcgYmVoYXZpb3VyIGNhbiBub3cgYmUgY29udHJvbGxlZCBhdCBidWlsZCB0aW1lCi0gICAgICB1c2luZyB0aGUgZWlnaHQgbWFjcm9zCi0KLSAgICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl97WCxZfXsxLDIsMyw0fSAgICAuCi0KLSAgICAtIFNvbWUgZmllbGRzIGluIHRoZSBgRlRfQml0bWFwJyAgc3RydWN0dXJlIGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20KLSAgICAgIHNpZ25lZCB0byB1bnNpZ25lZCB0eXBlLCB3aGljaCBiZXR0ZXIgcmVmbGVjdHMgdGhlIGFjdHVhbCB1c2FnZS4KLSAgICAgIEl0ICBpcyBhbHNvICBhbiBhZGRpdGlvbmFsICBtZWFucyB0byAgcHJvdGVjdCBhZ2FpbnN0ICBtYWxmb3JtZWQKLSAgICAgIGlucHV0LgotCi0gICAgICBUaGlzICBjaGFuZ2UgZG9lc24ndCAgYnJlYWsgIHRoZSBBQkk7ICBob3dldmVyLCAgaXQgbWlnaHQgIGNhdXNlCi0gICAgICBjb21waWxlciB3YXJuaW5ncy4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBJbXByb3ZlbWVudHMgdG8gIHRoZSBhdXRvLWhpbnRlcidzIGFsZ29yaXRobSB0byAgcmVjb2duaXplIHN0ZW1zCi0gICAgICBhbmQgbG9jYWwgZXh0cmVtYS4KLQotICAgIC0gRnVuY3Rpb24gYEZUX0dldF9TdWJHbHlwaF9JbmZvJyBhbHdheXMgcmV0dXJuZWQgYW4gZXJyb3IgZXZlbiBpbgotICAgICAgY2FzZSBvZiBzdWNjZXNzLgotCi0gICAgLSBWZXJzaW9uICAyLjUuMSBpbnRyb2R1Y2VkICBtYWpvciBidWdzICBpbiAgdGhlIGNqayAgcGFydCBvZiAgdGhlCi0gICAgICBhdXRvLWhpbnRlciwgd2hpY2ggYXJlIG5vdyBmaXhlZC4KLQotICAgIC0gVGhlICBgRlRfU2ZudF9UYWcnICBlbnVtZXJhdGlvbiAgdmFsdWVzICBoYXZlICBiZWVuICBjaGFuZ2VkICB0bwotICAgICAgdXBwZXJjYXNlLCAgZS5nLiAgYEZUX1NGTlRfSEVBRCcuICAgVGhlIGxvd2VyY2FzZSAgdmFyaWFudHMgIGFyZQotICAgICAgZGVwcmVjYXRlZC4gICAgVGhpcyAgaXMgICBmb3IgIG9ydGhvZ29uYWxpdHkgICB3aXRoICBhbGwgICBvdGhlcgotICAgICAgZW51bWVyYXRpb24gKGFuZCBlbnVtZXJhdGlvbi1saWtlKSB2YWx1ZXMgaW4gRnJlZVR5cGUuCi0KLSAgICAtIGBjbWFrZScgbm93IHN1cHBvcnRzIGJ1aWxkcyBvZiBGcmVlVHlwZSBhcyBhbiBPUyBYIGZyYW1ld29yayBhbmQKLSAgICAgIGZvciBpT1MuCi0KLSAgICAtIEltcHJvdmVkIHByb2plY3QgZmlsZXMgZm9yIHZjMjAxMCwgaW50cm9kdWNpbmcgYSBwcm9wZXJ0eSBmaWxlLgotCi0gICAgLSBUaGUgIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yICBmb3IgIHRoZSBBUEkgIHJlZmVyZW5jZSAgaGFzICBiZWVuCi0gICAgICB1cGRhdGVkIHRvIHByb2R1Y2UgIGJldHRlciBIVE1MIGNvZGUgKHdpdGggcHJvcGVyICBDU1MpLiAgQXQgdGhlCi0gICAgICBzYW1lIHRpbWUsIHRoZSBkb2N1bWVudGF0aW9uIGdvdCBhIGJldHRlciBzdHJ1Y3R1cmUuCi0KLSAgICAtIFRoZSBGVF9MT0FEX0JJVE1BUF9DUk9QIGZsYWcgaXMgb2Jzb2xldGU7ICBpdCBpcyBub3QgdXNlZCBieSBhbnkKLSAgICAgIGRyaXZlci4KLQotICAgIC0gVGhlICBUcnVlVHlwZSAgREVMVEFQWzEyM10gIGJ5dGVjb2RlIGluc3RydWN0aW9ucyAgbm93ICB3b3JrICBpbgotICAgICAgc3VicGl4ZWwgaGludGluZyAgbW9kZSBhcyBkZXNjcmliZWQgaW4gIHRoZSBDbGVhclR5cGUgd2hpdGVwYXBlcgotICAgICAgKGkuZS4sIGZvciB0b3VjaGVkIHBvaW50cyBpbiB0aGUgbm9uLXN1YnBpeGVsIGRpcmVjdGlvbikuCi0KLSAgICAtIE1hbnkgc21hbGwgaW1wcm92ZW1lbnRzIHRvIHRoZSBpbnRlcm5hbCBhcml0aG1ldGljIHJvdXRpbmVzLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNS4yIGFuZCAyLjUuMwotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQSB2dWxuZXJhYmlsaXR5IChDVkUtMjAxNC0yMjQwKSB3YXMgIGlkZW50aWZpZWQgYW5kIGZpeGVkIGluIHRoZQotICAgICAgbmV3ICBDRkYgIGRyaXZlciAgKGNmLiAgaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvYnVncy8/NDE2OTcpLgotICAgICAgQWxsIHVzZXJzIHNob3VsZCB1cGdyYWRlLgotCi0gICAgLSBNb3JlICBidWcgIGZpeGVzIHJlbGF0ZWQgIHRvICBjb3JyZWN0ICBwb3NpdGlvbmluZyBvZiAgY29tcG9zaXRlCi0gICAgICBnbHlwaHMuCi0KLSAgICAtIE1hbnkgZml4ZXMgdG8gYmV0dGVyIHByb3RlY3QgYWdhaW5zdCBtYWxmb3JtZWQgaW5wdXQuCi0KLQotICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gRnJlZVR5cGUgY2FuIG5vdyB1c2UgdGhlIEhhcmZCdXp6IGxpYnJhcnkgdG8gZ3JlYXRseSBpbXByb3ZlIHRoZQotICAgICAgYXV0by1oaW50aW5nIG9mICBmb250cyB0aGF0ICB1c2UgT3BlblR5cGUgZmVhdHVyZXM6ICBNYW55IGdseXBocwotICAgICAgdGhhdCBhcmUgcGFydCAgb2Ygc3VjaCBmZWF0dXJlcyBidXQgZG9uJ3QgaGF2ZSAgY21hcCBlbnRyaWVzIGFyZQotICAgICAgbm93IGhhbmRsZWQgIHByb3Blcmx5LCBmb3IgIGV4YW1wbGUgc21hbGwgY2FwcyAgb3Igc3VwZXJzY3JpcHRzLgotICAgICAgRGVmaW5lIHRoZSBjb25maWd1cmF0aW9uICBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWiB0bwotICAgICAgYWN0aXZhdGUgSGFyZkJ1enogc3VwcG9ydC4KLQotICAgICAgWW91IG5lZWQgSGFyZkJ1enogdmVyc2lvbiAwLjkuMTkgb3IgbmV3ZXIuCi0KLSAgICAgIE5vdGUgdGhhdCBIYXJmQnV6eiBkZXBlbmRzIG9uICBGcmVlVHlwZTsgdGhpcyBjdXJyZW50bHkgY2F1c2VzIGEKLSAgICAgIGNoaWNrZW4tYW5kLWVnZyBwcm9ibGVtICB0aGF0IGNhbiBiZSAgc29sdmVkIGFzIGZvbGxvd3MgIGluIGNhc2UKLSAgICAgIEhhcmZCdXp6IGlzIG5vdCB5ZXQgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLgotCi0gICAgICAgIDEuIENvbXBpbGUgIGFuZCAgaW5zdGFsbCAgRnJlZVR5cGUgd2l0aG91dCAgdGhlICBjb25maWd1cmF0aW9uCi0gICAgICAgICAgIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaLgotCi0gICAgICAgIDIuIENvbXBpbGUgYW5kIGluc3RhbGwgSGFyZkJ1enouCi0KLSAgICAgICAgMy4gRGVmaW5lICBtYWNybyAgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlosIHRoZW4gIGNvbXBpbGUKLSAgICAgICAgICAgYW5kIGluc3RhbGwgRnJlZVR5cGUgYWdhaW4uCi0KLSAgICAgIFdpdGggRnJlZVR5cGUncyAgYGNvbmZpZ3VyZScgc2NyaXB0IHRoZSBwcm9jZWR1cmUgIGJvaWxzIGRvd24gdG8KLSAgICAgIGNvbmZpZ3VyZSwgYnVpbGQsIGFuZCBpbnN0YWxsIEZyZWV0eXBlLCB0aGVuIGNvbmZpZ3VyZSwgY29tcGlsZSwKLSAgICAgIGFuZCAgaW5zdGFsbCAgSGFyZkJ1enosICB0aGVuIGNvbmZpZ3VyZSwgIGNvbXBpbGUsICBhbmQgIGluc3RhbGwKLSAgICAgIEZyZWVUeXBlIGFnYWluIChhZnRlciBleGVjdXRpbmcgYG1ha2UgZGlzdGNsZWFuJykuCi0KLSAgICAtIEFsbCAgbGlicmFyaWVzIEZyZWVUeXBlICBkZXBlbmRzIG9uICBhcmUgbm93ICBjaGVja2VkIHVzaW5nICB0aGUKLSAgICAgIGBwa2ctY29uZmlnJyBjb25maWd1cmF0aW9uIGZpbGVzICBmaXJzdCwgZm9sbG93ZWQgYnkgYWx0ZXJuYXRpdmUKLSAgICAgIG1ldGhvZHMuCi0KLSAgICAtIFRoZSAgbmV3ICB2YWx1ZSAgYGF1dG8nICBmb3IgdGhlICB2YXJpb3VzICBgLS13aXRoLVhYWCcgIGxpYnJhcnkKLSAgICAgIG9wdGlvbnMgICAoZm9yICAgZXhhbXBsZSAgIGAtLXdpdGgtaGFyZmJ1eno9YXV0bycpICAgbWFrZXMgICB0aGUKLSAgICAgIGBjb25maWd1cmUnIHNjcmlwdCBhdXRvbWF0aWNhbGx5IGxpbmsgdG8gdGhlIGxpYnJhcmllcyBpdCBmaW5kcy4KLSAgICAgIFRoaXMgaXMgbm93IHRoZSBkZWZhdWx0LgotCi0gICAgLSBJbiBjYXNlIEZyZWVUeXBlJ3MgYGNvbmZpZ3VyZScgc2NyaXB0ICBjYW4ndCBmaW5kIGEgbGlicmFyeSwgeW91Ci0gICAgICBjYW4gIHBhc3MgZW52aXJvbm1lbnQgIHZhcmlhYmxlcyB0byAgY2lyY3VtdmVudCBwa2ctY29uZmlnLCAgYW5kCi0gICAgICB0aG9zZSB2YXJpYWJsZXMgIGhhdmUgYmVlbiAgaGFybW9uaXplZCBhcyAgYSBjb25zZXF1ZW5jZSAgb2YgdGhlCi0gICAgICBjaGFuZ2VzIG1lbnRpb25lZCBhYm92ZToKLQotICAgICAgICBMSUJaICAgICAgICAgICAtPiByZW1vdmVkOyB1c2UgTElCWl9DRkxBR1MgYW5kIExJQlpfTElCUwotICAgICAgICBMSUJCWjIgICAgICAgICAtPiByZW1vdmVkOyB1c2UgQlpJUDJfQ0ZMQUdTIGFuZCBCWklQMl9MSUJTCi0gICAgICAgIExJQlBOR19MREZMQUdTIC0+IExJQlBOR19MSUJTCi0KLSAgICAgIGAuL2NvbmZpZ3VyZSAtLWhlbHAnIHNob3dzIGFsbCBhdmFpbGFibGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotCi0gICAgLSBUaGUgYGZyZWV0eXBlLWNvbmZpZycgIHNjcmlwdCBub3cgdW5kZXJzdGFuZHMgIG9wdGlvbiBgLS1zdGF0aWMnCi0gICAgICB0byBlbWl0IHN0YXRpYyBsaW5raW5nIGluZm9ybWF0aW9uLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNS4xIGFuZCAyLjUuMgotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gSW1wcm92aW5nIHRoZSBkaXNwbGF5IG9mIHNvbWUgYnJva2VuIFRydWVUeXBlIGZvbnRzIGludHJvZHVjZWQgYQotICAgICAgYnVnICB0aGF0IG1hZGUgIEZyZWVUeXBlIGNyYXNoICBvbiBzb21lICBwb3B1bGFyIChidXQgIG5vdCBmdWxseQotICAgICAgY29uZm9ybWFudCkgZm9udHMgbGlrZSBgYWhyb25iZC50dGYnLgotCi0gICAgLSBBbm90aGVyIHJvdW5kIG9mIGltcHJvdmVtZW50cyB0byBjb3JyZWN0IHBvc2l0aW9uaW5nIGFuZCBoaW50aW5nCi0gICAgICBvZiBjb21wb3NpdGUgZ2x5cGhzIGluIFRydWVUeXBlIGZvbnRzLgotCi0KLSAgSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gVmVyc2lvbiAgMi41LjEgIGludHJvZHVjZWQgYSAgYnVnICBpbiAgaGFuZGxpbmcgZW1iZWRkZWQgIGJpdG1hcAotICAgICAgc3RyaWtlcyBvZiAgVHJ1ZVR5cGUgZm9udHMsICBjYXVzaW5nIGdhcmJhZ2UgZGlzcGxheSAgdW5kZXIgc29tZQotICAgICAgY2lyY3Vtc3RhbmNlcy4KLQotICAgIC0gVGhlICAgYGZ0Z3JpZCcgICBkZW1vICAgcHJvZ3JhbSAgICBjb3VsZG4ndCAgIGJlICAgY29tcGlsZWQgICBpbgotICAgICAgbm9uLWRldmVsb3BtZW50IGJ1aWxkcy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjUgYW5kIDIuNS4xCi0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBGb3IgIHNvbWUgV2luRk5UICBmaWxlcywgIHRoZSBsYXN0ICBnbHlwaCAgd2Fzbid0IGRpc3BsYXllZCAgYnV0Ci0gICAgICBpbmNvcnJlY3RseSBtYXJrZWQgYXMgaW52YWxpZC4KLQotICAgIC0gVGhlIHZlcnRpY2FsIHNpemUgb2YgZ2x5cGhzIHdhcyAgaW5jb3JyZWN0bHkgc2V0IGFmdGVyIGEgY2FsbCB0bwotICAgICAgYEZUX0dseXBoU2xvdF9FbWJvbGRlbicsIHJlc3VsdGluZyBpbiBjbGlwcGVkIGdseXBocy4KLQotICAgIC0gTWFueSBmaWVsZHMgb2YgdGhlIGBQQ0xUJyB0YWJsZSBpbiBTRk5UIGJhc2VkIGZvbnRzIChpZiBhY2Nlc3NlZAotICAgICAgd2l0aCBgRlRfR2V0X1NmbnRfVGFibGUnKSB3ZXJlIGNvbXB1dGVkIGluY29ycmVjdGx5LgotCi0gICAgLSBJbiBUcnVlVHlwZSBmb250cywgIGhpbnRpbmcgb2YgY29tcG9zaXRlIGdseXBocyAgY291bGQgc29tZXRpbWVzCi0gICAgICBkZWxpdmVyICBpbmNvcnJlY3QgcG9zaXRpb25zICBvZiAgY29tcG9uZW50cyBvciAgZXZlbiAgZGlzdG9ydGVkCi0gICAgICBzaGFwZXMuCi0KLQotICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gV09GRiBmb250IGZvcm1hdCBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLgotCi0gICAgLSBUaGUgYXV0by1oaW50ZXIgbm93IHN1cHBvcnRzIEhlYnJldy4gIEdyZWVrIGFuZCBDeXJpbGxpYyBzdXBwb3J0Ci0gICAgICBoYXMgYmVlbiBpbXByb3ZlZC4KLQotICAgIC0gU3VwcG9ydCBmb3IgdGhlIGZvcnRoY29taW5nIGBPUy8yJyAgU0ZOVCB0YWJsZSB2ZXJzaW9uIDUsIGFzIGNhbgotICAgICAgYmUgZm91bmQgZS5nLiBpbiB0aGUgYFNpdGthJyBmb250IGZhbWlseSBmb3IgV2luZG93cyA4LjEuCi0KLSAgICAtIFRoZSBoZWFkZXIgIGZpbGUgbGF5b3V0ICBoYXMgYmVlbiBjaGFuZ2VkLiAgIEFmdGVyIGluc3RhbGxhdGlvbiwKLSAgICAgIGFsbCBmaWxlcyBhcmUgbm93IGxvY2F0ZWQgaW4gYDxwcmVmaXg+L2luY2x1ZGUvZnJlZXR5cGUyJy4KLQotICAgICAgQXBwbGljYXRpb25zICB0aGF0ICB1c2UgICAoYSkgIGBmcmVldHlwZS1jb25maWcnICBvciAgRnJlZVR5cGUncwotICAgICAgYHBrZy1jb25maWcnIGZpbGUgdG8gZ2V0IHRoZSBpbmNsdWRlIGRpcmVjdG9yeSBmb3IgdGhlIGNvbXBpbGVyLAotICAgICAgYW5kIChiKSB0aGUgZG9jdW1lbnRlZCB3YXkgZm9yIGhlYWRlciBpbmNsdXNpb24gbGlrZQotCi0gICAgICAgICNpbmNsdWRlIDxmdDJidWlsZC5oPgotICAgICAgICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0gICAgICAgIC4uLgotCi0gICAgICBkb24ndCBuZWVkIGFueSBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlLgotCi0KLSAgSUlJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIFRoZSBzdGVtICBkYXJrZW5pbmcgZmVhdHVyZSAgb2YgdGhlICBuZXcgQ0ZGICBlbmdpbmUgY2FuICBub3cgYmUKLSAgICAgIGZpbmUtdHVuZWQgd2l0aCB0aGUgbmV3IGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkuCi0KLSAgICAtIGBmdGdyaWQnIGhhcyBiZWVuIHVwZGF0ZWQgdG8gdG9nZ2xlIHZhcmlvdXMgZW5naW5lcyB3aXRoIHRoZSBgSCcKLSAgICAgIGtleSwgc2ltaWxhciB0byBgZnR2aWV3JyBhbmQgYGZ0ZGlmZicuCi0KLSAgICAtIFRoZSBmdW5jdGlvbmFsaXR5IG9mIGB0dGRlYnVnJyBoYXMgYmVlbiBncmVhdGx5IGVuaGFuY2VkLgotCi0gICAgICAuIEl0IG5vdyBkaXNwbGF5cyB0d2lsaWdodCwgc3RvcmFnZSwgYW5kIGNvbnRyb2wgdmFsdWUgZGF0YTsga2V5Ci0gICAgICAgIGBUJyBzaG93cyB0aGUgdHdpbGlnaHQgcG9pbnQgIHRhYmxlLCBrZXkgYFMnIHRoZSBzdG9yYWdlIGRhdGEsCi0gICAgICAgIGFuZCBrZXkgYEMnIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlLgotCi0gICAgICAuIFNvbWUgIGtleXMgIGhhdmUgIGJlZW4gIHJlYXNzaWduZWQgIGZyb20gIGxvd2VyY2FzZSAgdG8gIHRoZWlyCi0gICAgICAgIHVwcGVyY2FzZSBlcXVpdmFsZW50czsgZm9yIGV4YW1wbGUgYHEnICB0byBxdWl0IHRoZSBwcm9ncmFtIGlzCi0gICAgICAgIG5vdyBgUScuCi0KLSAgICAgIC4gS2V5IGBmJyBmaW5pc2hlcyB0aGUgY3VycmVudCBmdW5jdGlvbi4KLQotICAgICAgLiBLZXkgYFInIHJlc3RhcnRzIHRoZSBkZWJ1Z2dlci4KLQotICAgICAgLiBLZXlzIGBiJyBhbmQgYHAnIHNldCBhIGJyZWFrcG9pbnQuCi0KLSAgICAgIC4gS2V5IGBCJyBwcm92aWRlcyBhIGZ1bmN0aW9uIGNhbGwgYmFja3RyYWNlLgotCi0gICAgLSBCZXR0ZXIgc3VwcG9ydCBvZiBBUk12NyBhbmQgeDg2XzY0IHByb2Nlc3NvcnMuCi0KLSAgICAtIEFwcGxlJ3MgYHNiaXgnIGNvbG9yIGJpdG1hcCBmb3JtYXQgaXMgbm93IHN1cHBvcnRlZC4KLQotICAgIC0gSW1wcm92ZWQgICBhdXRvLWhpbnRlciAgcmVuZGVyaW5nICAgZm9yICBtYW55ICAgVHJ1ZVR5cGUgIGZvbnRzLAotICAgICAgZXNwZWNpYWxseSBpbiB0aGUgcmFuZ2UgMjAtNDBwcGVtLgotCi0gICAgLSBBICBuZXcgZmFjZSAgZmxhZyAgYEZUX0ZBQ0VfRkxBR19DT0xPUicgaGFzICBiZWVuICBhZGRlZCAodG8gIGJlCi0gICAgICBhY2Nlc3NlZCB3aXRoIHRoZSBtYWNybyBgRlRfSEFTX0NPTE9SJykuCi0KLSAgICAtIGBGVF9HemlwX1VuY29tcHJlc3MnICAgKG1vZGVsZWQgICAgYWZ0ZXIgICB6bGliJ3MgICBgdW5jb21wcmVzcycKLSAgICAgIGZ1bmN0aW9uKSAgaGFzIGJlZW4gIGFkZGVkOyB0aGlzICBpcyBhICBieS1wcm9kdWN0IG9mICB0aGUgbmV3bHkKLSAgICAgIGFkZGVkIFdPRkYgc3VwcG9ydC4KLQotICAgIC0gU3VwcG9ydCBmb3IgIGEgYnVpbGQgd2l0aCAgYGNtYWtlJyBoYXMgYmVlbiBjb250cmlidXRlZCAgYnkgSm9obgotICAgICAgQ2FyeSA8Y2FyeUB0eGNvcnAuY29tPi4KLQotICAgIC0gU3VwcG9ydCBmb3IgeDY0ICBidWlsZHMgd2l0aCBWaXN1YWwgQysrIGhhcyAgYmVlbiBjb250cmlidXRlZCBieQotICAgICAgS2VubmV0aCBNaWxsZXIgPGtlbm5ldGhhZGFtbWlsbGVyQHlhaG9vLmNvbT4KLQotICAgIC0gTWFudWFsIHBhZ2VzIGZvciBtb3N0IGRlbW8gcHJvZ3JhbXMgaGF2ZSBiZWVuIGFkZGVkLgotCi0gICAgLSBUaGUgR0VUSU5GTyBieXRlY29kZSBpbnN0cnVjdGlvbiBmb3IgVHJ1ZVR5cGUgZm9udHMgd2FzIGJ1Z2d5IGlmCi0gICAgICB1c2VkIHRvIHJldHJpZXZlIHN1YnBpeGVsIGhpbnRpbmcgaW5mb3JtYXRpb24uICBJdCB3YXMgbmVjZXNzYXJ5Ci0gICAgICB0byBzZXQgIHNlbGVjdG9yIGJpdCA2ICB0byBnZXQgIHJlc3VsdHMgZm9yIHNlbGVjdG9yICBiaXRzIDctMTAsCi0gICAgICB3aGljaCBpcyB3cm9uZy4KLQotICAgIC0gSW1wcm92ZWQgY29tcHV0YXRpb24gIG9mIGVtdWxhdGVkIHZlcnRpY2FsIG1ldHJpY3MgIGZvciBUcnVlVHlwZQotICAgICAgZm9udHMuCi0KLSAgICAtIEZpeGVkIGhvcml6b250YWwgc3RhcnQtdXAgcG9zaXRpb24gb2YgdmVydGljYWwgcGhhbnRvbSBwb2ludHMgaW4KLSAgICAgIFRydWVUeXBlIGJ5dGVjb2RlLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC4xMiBhbmQgMi41Ci0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBUaGUgY2FjaGUgbWFuYWdlciBmdW5jdGlvbiBgRlRDX01hbmFnZXJfUmVzZXQnICBkaWRuJ3QgZmx1c2ggdGhlCi0gICAgICBjYWNoZS4KLQotCi0gIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwotCi0gICAgLSBCZWhkYWQgRXNmYWhib2QgIChvbiBiZWhhbGYgIG9mIEdvb2dsZSkgY29udHJpYnV0ZWQgIHN1cHBvcnQgZm9yCi0gICAgICBjb2xvciBlbWJlZGRlZCBiaXRtYXBzIChlZy4gY29sb3IgZW1vamkpLgotCi0gICAgICBBICBuZXcgIGxvYWQgIGZsYWcsICBGVF9MT0FEX0NPTE9SLCBtYWtlcyAgRnJlZVR5cGUgIGxvYWQgIGNvbG9yCi0gICAgICBlbWJlZGRlZC1iaXRtYXBzLCBmb2xsb3dpbmcgdGhpcyBkcmFmdCBzcGVjaWZpY2F0aW9uCi0KLSAgICAgICAgaHR0cHM6Ly9jb2xvci1lbW9qaS5nb29nbGVjb2RlLmNvbS9naXQvc3BlY2lmaWNhdGlvbi92MS5odG1sCi0KLSAgICAgIHdoaWNoIGRlZmluZXMgdHdvIG5ldyBTRk5UICB0YWJsZXMsIGBDQkRUJyBhbmQgYENCTEMnIChuYW1lZCBhbmQKLSAgICAgIG1vZGVsZWQgIGFmdGVyICBgRUJEVCcgIGFuZCBgRUJMQycsICByZXNwZWN0aXZlbHkpLiAgIFRoZSAgY29sb3IKLSAgICAgIGJpdG1hcHMgIGFyZSAgc3RvcmVkIGluICB0aGUgIG5ldyAgRlRfUElYRUxfTU9ERV9CR1JBIGZvcm1hdCAgdG8KLSAgICAgIHJlcHJlc2VudCBCR1JBICBwcmUtbXVsdGlwbGllZCBzUkdCICBpbWFnZXMuICBJZiBQTkcgIHN1cHBvcnQgaXMKLSAgICAgIGF2YWlsYWJsZSwgIFBORyBjb2xvciAgaW1hZ2VzIGFzICBkZWZpbmVkIGluICB0aGUgc2FtZSAgcHJvcG9zZWQKLSAgICAgIHNwZWNpZmljYXRpb24gYXJlIHN1cHBvcnRlZCBhbHNvLgotCi0gICAgICBOb3RlIHRoYXQgIGNvbG9yIGJpdG1hcHMgIGFyZSBjb252ZXJ0ZWQgIHRvIGdyYXlzY2FsZSAgaWYgY2xpZW50Ci0gICAgICBkaWRuJ3QgYXNrIGZvciBjb2xvci4KLQotICAgIC0gQXMgIGFubm91bmNlZCBpbiAgdGhlICBwcmV2aW91cyByZWxlYXNlLCAgdGhlICBvbGQgRnJlZVR5cGUgIENGRgotICAgICAgZW5naW5lICBpcyBub3cgIGRpc2FibGVkIGJ5ICBkZWZhdWx0LiAgSXQgIGNhbiBiZSAgY29uZGl0aW9uYWxseQotICAgICAgY29tcGlsZWQgICAgIGJ5ICAgICBkZWZpbmluZyAgICAgdGhlICAgICBjb25maWd1cmF0aW9uICAgICBtYWNybwotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORS4KLQotICAgIC0gQXMgYW5ub3VuY2VkIGluIHRoZSBwcmV2aW91cyByZWxlYXNlLCAgYWxsIGNvZGUgcmVsYXRlZCB0byBtYWNybwotICAgICAgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTICBoYXMgYmVlbiByZW1vdmVkLCAgdGh1cyBiZWNvbWluZwotICAgICAgb2Jzb2xldGUuCi0KLQotICBJSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gVGhlICBwcm9wZXJ0eSBBUEkgIChgRlRfUHJvcGVydHlfR2V0JyBhbmQgIGBGVF9Qcm9wZXJ0eV9TZXQnKSBpcwotICAgICAgbm93IGRlY2xhcmVkIGFzIHN0YWJsZS4KLQotICAgICAgVGhlICBleGNlcHRpb24sICAgaG93ZXZlciwgIGFyZSAgdGhlICAgZXhwZXJpbWVudGFsICBhdXRvLWhpbnRlcgotICAgICAgcHJvcGVydGllcyBgZ2x5cGgtdG8tc2NyaXB0LW1hcCcgYW5kIGBmYWxsYmFjay1zY3JpcHQnIHdoaWNoIGFyZQotICAgICAgc3ViamVjdCB0byBjaGFuZ2UgaW4gYSBmb3J0aGNvbWluZyByZWxlYXNlLgotCi0gICAgLSBgZnR2aWV3JyBoYXMgYmVlbiB1cGRhdGVkIHRvICBzdXBwb3J0IGNvbG9yIGVtYmVkZGVkIGJpdG1hcHM7IGl0Ci0gICAgICBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmICB3aXRoIGtleSBgYycuICBUaGUgc21hbGwgY2FjaGUgdG9nZ2xlCi0gICAgICBpcyBub3cga2V5IGBLJy4KLQotICAgIC0gSXQgIGlzIG5vdyAgcG9zc2libGUgIHRvICBjb250cm9sIHRoZSAgdmVyc2lvbiAgb2YgdGhlICBUcnVlVHlwZQotICAgICAgaGludGluZyBlbmdpbmUgIHVzaW5nIHRoZSBuZXcgYGludGVycHJldGVyLXZlcnNpb24nICBwcm9wZXJ0eSBvZgotICAgICAgdGhlICBgdHJ1ZXR5cGUnIG1vZHVsZTogIFZlcnNpb25zIDM1ICBhbmQgMzggICh0aGUgZGVmYXVsdCkgIGFyZQotICAgICAgc3VwcG9ydGVkLCAgd2hpY2ggIHJvdWdobHkgIGNvcnJlc3BvbmRzIHRvICBkaXNhYmxlICBhbmQgIGVuYWJsZQotICAgICAgc3VicGl4ZWwgaGludGluZyBzdXBwb3J0LCByZXNwZWN0aXZlbHkuCi0KLSAgICAgIEluICBib3RoICBgZnR2aWV3JyAgYW5kICBgZnRkaWZmJywgIHN3aXRjaGluZyAgYmV0d2VlbiAgdGhlICB0d28KLSAgICAgIHZlcnNpb25zICBjYW4gYmUgIGRvbmUgIHdpdGggIGtleSBgSCcuICAgSW4gIHRoZSBgZnRiZW5jaCcgIGRlbW8KLSAgICAgIHByb2dyYW0sIGNvbW1hbmQgbGluZSBvcHRpb24gYC1IJyAgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gYWN0aXZhdGUKLSAgICAgIHRoZSBub24tZGVmYXVsdCBpbnRlcnByZXRlciB2ZXJzaW9uLgotCi0gICAgLSBUaGUgYHR0ZGVidWcnIHByb2dyYW0gaGFzIGJlZW4gZnVydGhlciBpbXByb3ZlZC4gIEluIHBhcnRpY3VsYXIsCi0gICAgICBpdCBhY2NlcHRzIGEgbmV3IGNvbW1hbmQgbGluZSAgb3B0aW9uIGAtSCcgdG8gc2VsZWN0IHRoZSBoaW50aW5nCi0gICAgICBlbmdpbmUuCi0KLSAgICAtIGBmdGR1bXAncyB2ZXJib3NlIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIGAtVicuICBGb3IgYWxsIGRlbW8KLSAgICAgIHByb2dyYW1zLCBgLXYnIG5vdyBzaG93cyB2ZXJzaW9uIGluZm9ybWF0aW9uLgotCi0gICAgLSBBbm90aGVyIHJvdW5kIG9mIFRydWVUeXBlIHN1YnBpeGVsIGhpbnRpbmcgZml4ZXMuCi0KLSAgICAtIFRoZSBgYXBpbmFtZXMnIHRvb2wgY2FuIG5vdyBjcmVhdGUgYW4gaW1wb3J0IGZpbGUgZm9yIE5ldFdhcmUuCi0KLSAgICAtIDY0Yml0IGNvbXBpbGF0aW9uIG9mIHRoZSBuZXcgQ0ZGIGVuZ2luZSB3YXMgYnVnZ3kuCi0KLSAgICAtIFNvbWUgZml4ZXMgdG8gaW1wcm92ZSByb2J1c3RuZXNzIGluIG1lbW9yeS10aWdodCBzaXR1YXRpb25zLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC4xMSBhbmQgMi40LjEyCi0KLSAgICAtIFdlIGhhdmUgYW5vdGhlciBDRkYgcGFyc2luZyBhbmQgaGludGluZyBlbmdpbmUhICBXcml0dGVuIGJ5IERhdmUKLSAgICAgIEFybm9sZCA8ZGFybm9sZEBhZG9iZS5jb20+LCAgdGhpcyB3b3JrICBoYXMgYmVlbiAgY29udHJpYnV0ZWQgYnkKLSAgICAgIEFkb2JlIGluICBjb2xsYWJvcmF0aW9uIHdpdGggR29vZ2xlLiAgIEl0IGlzIHZhc3RseSAgc3VwZXJpb3IgdG8KLSAgICAgIHRoZSBvbGQgQ0ZGIGVuZ2luZSwgYW5kIGl0ICB3aWxsIHJlcGxhY2UgaXQgaW4gdGhlIG5leHQgcmVsZWFzZS4KLSAgICAgIFJpZ2h0ICBub3csICBpdCAgaXMgIHN0aWxsICBvZmYgYnkgIGRlZmF1bHQsICBhbmQgIHlvdSAgaGF2ZSAgdG8KLSAgICAgIGV4cGxpY2l0bHkgc2VsZWN0IGl0IHVzaW5nICB0aGUgbmV3IGBoaW50aW5nLWVuZ2luZScgcHJvcGVydHkgb2YKLSAgICAgIHRoZSBjZmYgZHJpdmVyOgotCi0gICAgICAgIC4uLgotICAgICAgICAjaW5jbHVkZSBGVF9NT0RVTEVfSAotICAgICAgICAjaW5jbHVkZSBGVF9DRkZfRFJJVkVSX0gKLQotICAgICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICAgICAgICBpbnQgICAgICAgICBlbmdpbmUgPSBGVF9DRkZfSElOVElOR19BRE9CRTsKLQotCi0gICAgICAgIC4uLgotICAgICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJjZmYiLCAiaGludGluZy1lbmdpbmUiLCAmZW5naW5lICk7Ci0KLSAgICAgIFRoZSBjb2RlIGhhcyAgYSAobWF0dXJlKSBiZXRhIHN0YXR1czsgd2UgZW5jb3VyYWdlICBhbGwgdXNlcnMgdG8KLSAgICAgIHRlc3QgaXQgYW5kIHJlcG9ydCBhbnkgcHJvYmxlbXMuCi0KLSAgICAgIEluIGNhc2UgeW91IHdhbnQgdG8gYWN0aXZhdGUgdGhlIG5ldyBDRkYgZW5naW5lIHVuY29uZGl0aW9uYWxseSwKLSAgICAgIGFwcGx5IHRoaXMgcGF0Y2g6Ci0KLS0tLSBzbmlwIC0tLQotZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2Zmb2Jqcy5jIGIvc3JjL2NmZi9jZmZvYmpzLmMKLWluZGV4IGViY2YxODkuLjNmMmNlNmIgMTAwNjQ0Ci0tLS0gYS9zcmMvY2ZmL2NmZm9ianMuYwotKysrIGIvc3JjL2NmZi9jZmZvYmpzLmMKLUBAIC0xMDU2LDcgKzEwNTYsNyBAQAotCi0KLSAgICAgLyogc2V0IGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzICovCi0tICAgIGRyaXZlci0+aGludGluZ19lbmdpbmUgICAgPSBGVF9DRkZfSElOVElOR19GUkVFVFlQRTsKLSsgICAgZHJpdmVyLT5oaW50aW5nX2VuZ2luZSAgICA9IEZUX0NGRl9ISU5USU5HX0FET0JFOwotICAgICBkcml2ZXItPm5vX3N0ZW1fZGFya2VuaW5nID0gRkFMU0U7Ci0KLSAgICAgcmV0dXJuIEZUX0Vycl9PazsKLS0tLSBzbmlwIC0tLQotCi0gICAgLSBUaGUgIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyAgaXMgbm8gIGxvbmdlciBzZXQgIGJ5Ci0gICAgICBkZWZhdWx0LiAgSW4gIHRoZSBuZXh0ICByZWxlYXNlLCB3ZSAgd2lsbCBjb21wbGV0ZWx5ICByZW1vdmUgdGhlCi0gICAgICBhc3NvY2lhdGVkIGNvZGUuICAgUGxlYXNlIHVwZGF0ZSB5b3VyICBwcm9ncmFtcyBpbiBjYXNlICB5b3UgYXJlCi0gICAgICBzdGlsbCB1c2luZyB0aGlzIG1hY3JvLgotCi0KLSAgSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gVGhlICAodG9wLWxldmVsKSAgYGNvbmZpZ3VyZScgIHNjcmlwdCAgIG5vdyAgcmVzcGVjdHMgIHRoZSAgTUFLRQotICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgIHRvIHNwZWNpZnkgYSBgbWFrZScgYmluYXJ5LiAgIEZvciBiYWNrd2FyZAotICAgICAgY29tcGF0aWJpbGl0eSwgR05VTUFLRSBzdGlsbCBvdmVycmlkZXMgTUFLRSwgdGhvdWdoLgotCi0gICAgLSBUaGUgYGZ0dmlldycgIGFuZCBgZnRkaWZmJyAgZGVtbyBwcm9ncmFtcyBoYXZlICBiZWVuIHJlZGVzaWduZWQsCi0gICAgICBzaG93aW5nICBtb3JlIG9wdGlvbnMgIHBlcm1hbmVudGx5ICBvbiB0aGUgIHNjcmVlbiwgYW1vbmcgIG90aGVyCi0gICAgICBtaW5vciBpbXByb3ZlbWVudHMuCi0KLSAgICAtIFVzaW5nIHRoZSBgSCcgIGtleSwgaXQgaXMgbm93IHBvc3NpYmxlIHRvICBzZWxlY3QgdGhlIENGRiBlbmdpbmUKLSAgICAgIGluIGJvdGggYGZ0dmlldycgYW5kIGBmdGRpZmYnLgotCi0gICAgLSBUaGUgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gYC1IJyBmb3IgYGZ0YmVuY2gnIHNlbGVjdHMgdGhlIEFkb2JlCi0gICAgICBDRkYgZW5naW5lLgotCi0gICAgLSBJdCBpcyAgbm93IHBvc3NpYmxlICB0byBkaXJlY3RseSBzZWxlY3QgIHRoZSBMQ0QgIHJlbmRlcmluZyBtb2RlCi0gICAgICB3aXRoIHRoZSBrZXlzIGBBJy1gRicgaW4gIGBmdHZpZXcnLiAgVGhlIGtleSBtYXBwaW5nIGZvciBjeWNsaW5nCi0gICAgICB0aHJvdWdoIExDRCBtb2RlcyAgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIGBLJyBhbmQgIGBMJyB0byBgaycgYW5kCi0gICAgICBgbCcsIGFuZCAgdG9nZ2xpbmcgY3VzdG9tIExDRCAgZmlsdGVyaW5nIGlzIG5vIGxvbmdlciAgbWFwcGVkIHRvCi0gICAgICBrZXkgYEYnIGJ1dCB0byBrZXkgYEwnLgotCi0gICAgLSBJbiBgZnRkaWZmJywgIGtleSBgeCcgdG9nZ2xlcyAgYmV0d2VlbiBsYXlvdXQgbW9kZXM6ICBFaXRoZXIgdXNlCi0gICAgICB0aGUgIGFkdmFuY2Ugd2lkdGggICh0aGlzIGlzICBuZXcgYW5kICBub3cgdGhlICBkZWZhdWx0KSBvciAgdGhlCi0gICAgICBib3VuZGluZyBib3ggaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIGxpbmUgYnJlYWtzLgotCi0gICAgLSBGb3IgYWxsIGRlbW8gIHRvb2xzLCB0aGUgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gIGAtdicgc2hvd3MgdGhlCi0gICAgICB2ZXJzaW9uLgotCi0gICAgLSBGb3IgdGhlIGRlbW8gdG9vbHMgd2l0aCBhIEdVSSwgdGhlIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyBgLXcnCi0gICAgICBhbmQgYC1oJyBzZWxlY3QgIHRoZSB3aWR0aCBhbmQgdGhlIGhlaWdodCBvZiAgdGhlIG91dHB1dCB3aW5kb3csCi0gICAgICByZXNwZWN0aXZlbHkuCi0KLSAgICAtIFRoZSBgdHRkZWJ1ZycgcHJvZ3JhbSB3YXMgYnJva2VuIGFuZCBoYXMgYmVlbiByZWFjdGl2YXRlZC4gIE5vdGUKLSAgICAgIHRoYXQgdGhpcyBwcm9ncmFtIGlzIG5vdCBjb21waWxlZCBieSBkZWZhdWx0LgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC4xMCBhbmQgMi40LjExCi0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBTb21lIHZ1bG5lcmFiaWxpdGllcyBpbiB0aGUgIEJERiBpbXBsZW1lbnRhdGlvbiBoYXZlIGJlZW4gZml4ZWQuCi0gICAgICBVc2VycyBvZiB0aGlzIGZvbnQgZm9ybWF0IHNob3VsZCB1cGdyYWRlLgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIFN1YnBpeGVsICBoaW50aW5nIHN1cHBvcnQgIGhhcyBiZWVuICBjb250cmlidXRlZCBieSAgSW5maW5hbGl0eSwKLSAgICAgIGJhc2VkIG9uIEdyZWcgSGl0Y2hjb2NrJ3Mgd2hpdGVwYXBlciBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L2NsZWFydHlwZS90cnVldHlwZWNsZWFydHlwZS5hc3B4Ci0KLSAgICAgIE9yaWdpbmFsbHksIGl0IHdhcyBhIHNlcGFyYXRlIHBhdGNoIGF2YWlsYWJsZSBmcm9tCi0KLSAgICAgICAgaHR0cDovL3d3dy5pbmZpbmFsaXR5Lm5ldC9ibG9nLwotCi0gICAgICBhbmQgd2hpY2ggaGFzIGJlZW4gaW50ZWdyYXRlZC4KLQotICAgICAgTm90ZSB0aGF0ICBDbGVhclR5cGUgc3VwcG9ydCBpcyBub3QgIGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQhICBJbgotICAgICAgcGFydGljdWxhciwgIGZ1bGwgc3VwcG9ydCAgZm9yIHRoZSAgb3B0aW9ucyBgY29tcGF0aWJsZV93aWR0aHMnLAotICAgICAgYHN5bW1ldHJpY2FsX3Ntb290aGluZywgIGFuZCAgYGJncicgICh2aWEgdGhlICBHRVRJTkZPICBieXRlY29kZQotICAgICAgaW5zdHJ1Y3Rpb24pIGlzIG1pc3NpbmcuCi0KLSAgICAgIEFjdGl2YXRpb24gb2YgIHN1YnBpeGVsIGhpbnRpbmcgIHN1cHBvcnQgY2FuIGJlICBjb250cm9sbGVkIHdpdGgKLSAgICAgIHRoZSBgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HJyBjb25maWd1cmF0aW9uIG9wdGlvbjsgaXQKLSAgICAgIGlzIHN3aXRjaGVkIG9mZiBieSBkZWZhdWx0LiAgVGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbDsKLSAgICAgIHdlIHdlbGNvbWUgdGVzdCByZXBvcnRzIQotCi0gICAgLSBTdXBwb3J0IGZvciBPcGVuVHlwZSBjb2xsZWN0aW9ucyAoT1RDKSBoYXMgYmVlbiBhZGRlZC4KLQotICAgIC0gUHVyZSBDRkYgZm9udHMgd2l0aGluIGFuIFNGTlQgd3JhcHBlciBhcmUgbm93IHN1cHBvcnRlZC4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBNaW5vciByZW5kZXJpbmcgaW1wcm92ZW1lbnRzIHRvIHRoZSBhdXRvLWhpbnRlci4KLQotICAgIC0gYEZUX0dseXBoU2xvdF9PYmxpcXVlJyBub3cgdXNlcyBhIHNoZWFyIGFuZ2xlIG9mIDEywrAuCi0KLSAgICAtIEV4cGVyaW1lbnRhbCBzdXBwb3J0ICB0byBoYW5kbGUgYHByb3BlcnR5IG1vZHVsZXMnLCAgZm9yIGV4YW1wbGUKLSAgICAgIHRvIGNvbnRyb2wgdGhlICBiZWhhdmlvdXIgb2YgdGhlIGF1dG8taGludGVyLiAgIFRoZSBBUEkgY29uc2lzdHMKLSAgICAgIG9mIHR3byBuZXcgZnVuY3Rpb25zLCBgRlRfUHJvcGVydHlfU2V0JyBhbmQgYEZUX1Byb3BlcnR5X0dldCcuCi0KLSAgICAgIFRoZSBjb2RlIGlzICBzdGlsbCBzdWJqZWN0IHRvIGNoYW5nZSBhbmQgc2hvdWxkICBub3QgYmUgdXNlZCBmb3IKLSAgICAgIHByb2R1Y3Rpb24uCi0KLSAgICAtIFRoZSBgZnRkaWZmJyBkZW1vIHByb2dyYW0gbm93IHN1cHBvcnRzIFVURi04IGVuY29kZWQgaW5wdXQgZmlsZXMKLSAgICAgIGZvciBvcHRpb24gYC1mJy4KLQotICAgIC0gVXNpbmcga2V5cyBgcicgYW5kIGBSJywgeW91IGNhbiBub3cgYWRqdXN0IHRoZSBzdHJva2VyIHJhZGl1cyBpbgotICAgICAgdGhlIGBmdHZpZXcnIGRlbW8gcHJvZ3JhbS4KLQotICAgIC0gT3RoZXIsIG1pbm9yIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi40LjkgYW5kIDIuNC4xMAotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gSW5jcmVtZW50YWwgZ2x5cGggbG9hZGluZyBhcyBuZWVkZWQgYnkgZ2hvc3RzY3JpcHQgd2FzIGJyb2tlbi4KLQotCi0gIElJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIEEgbmV3ICBmdW5jdGlvbiBgRlRfT3V0bGluZV9FbWJvbGRlblhZJywgIGNvbnRyaWJ1dGVkIGJ5ICBBbGV4ZWkKLSAgICAgIFBvZHRlbGV6aG5pa292LgotCi0gICAgLSBJbiB0aGUgYGZ0dmlldycgZGVtbyBwcm9ncmFtLCBrZXkgYGUnIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYHgnCi0gICAgICBhbmQgYHknIHRvICBlbWJvbGRlbiBpbiAgdGhlIGhvcml6b250YWwgYW5kICB2ZXJ0aWNhbCBkaXJlY3Rpb24sCi0gICAgICByZXNwZWN0aXZlbHkuCi0KLSAgICAtIFRoZSBnbHlwaCAgc3BhY2luZyBjb21wdXRhdGlvbiAgaW4gYEZUX0dseXBoU2xvdF9FbWJvbGRlbicgIChhbmQKLSAgICAgIHNpbWlsYXIgY29kZSBpbiBgZnR2aWV3JykgaGFzIGJlZW4gaW1wcm92ZWQuCi0KLSAgICAtIE1pbm9yICBpbXByb3ZlbWVudHMgdG8gIHRoZSBUcnVlVHlwZSAgYnl0ZWNvZGUgIGludGVycHJldGVyICBhbmQKLSAgICAgIGdseXBoIGxvYWRlciwgdGhlIGF1dG8taGludGVyLCBhbmQgdGhlIEIvVyByYXN0ZXJpemVyLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC44IGFuZCAyLjQuOQotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQW5vdGhlciByb3VuZCBvZiBmaXhlcyB0byBiZXR0ZXIgaGFuZGxlIGludmFsaWQgZm9udHMuICAgTWFueSBvZgotICAgICAgdGhlbSBhcmUgdnVsbmVyYWJpbGl0aWVzICAoc2VlIENWRS0yMDEyLTExMjYgdXAgdG8gQ1ZFLTIwMTItMTE0NAotICAgICAgYW5kIFNBNDgzMjApIHNvIGFsbCB1c2VycyBzaG91bGQgdXBncmFkZS4KLQotCi0gIElJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIFRoZSBgRU5DT0RJTkcgLTEgPG4+JyBmb3JtYXQgb2YgQkRGIGZvbnRzIGlzIG5vdyBzdXBwb3J0ZWQuCi0KLSAgICAtIEZvciBCREYgZm9udHMsICBzdXBwb3J0IGZvciB0aGUgd2hvbGUgVW5pY29kZSBlbmNvZGluZyByYW5nZSBoYXMKLSAgICAgIGJlZW4gYWRkZWQuCi0KLSAgICAtIEJldHRlciBUVEYgc3VwcG9ydCBmb3IgeF9wcGVtICE9IHlfcHBlbS4KLQotICAgIC0gYEZUX0dldF9BZHZhbmNlcycgc29tZXRpbWVzIHJldHVybmVkIGJvZ3VzIHZhbHVlcy4KLQotICAgIC0gVGhlICBkZW1vICBwcm9ncmFtcyAgbm8gIGxvbmdlciAgcmVjb2duaXplICBhbmQgIGhhbmRsZSAgZGVmYXVsdAotICAgICAgc3VmZml4ZXM7IHlvdSBub3cgaGF2ZSB0byBhbHdheXMgc3BlY2lmeSB0aGUgY29tcGxldGUgZm9udCBuYW1lLgotCi0gICAgLSBCZXR0ZXIgcmVuZGVyaW5nIGFuZCBMQ0QgbW9kZSBjeWNsaW5nIGFkZGVkIHRvIGBmdHZpZXcnLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC43IGFuZCAyLjQuOAotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gU29tZSB2dWxuZXJhYmlsaXRpZXMgaW4gaGFuZGxpbmcgQ0lELWtleWVkIFBvc3RTY3JpcHQgZm9udHMgaGF2ZQotICAgICAgYmVlbiBmaXhlZDsgc2VlIENWRS0yMDExLTM0MzkuCi0KLQotICBJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBDaHJpcyBMaWRkZWxsIGNvbnRyaWJ1dGVkIGEgbmV3IEFQSSwgYEZUX0dldF9QU19Gb250X1ZhbHVlJywgIHRvCi0gICAgICByZXRyaWV2ZSBtb3N0IG9mIHRoZSBkaWN0aW9uYXJ5IGtleXMgaW4gVHlwZSAxIGZvbnRzLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC42IGFuZCAyLjQuNwotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gU29tZSAgdnVsbmVyYWJpbGl0aWVzIGluIGhhbmRsaW5nIFR5cGUgMSBmb250cyAgaGF2ZSBiZWVuIGZpeGVkOwotICAgICAgc2VlIENWRS0yMDExLTMyNTYuCi0KLQotICBJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBGcmVlVHlwZSAgbm93IHByb3Blcmx5ICBoYW5kbGVzIFphcGZEaW5nYmF0cyAgZ2x5cGggbmFtZXMgIHdoaWxlCi0gICAgICBjb25zdHJ1Y3RpbmcgYSBVbmljb2RlIGNoYXJhY3RlciBtYXAgKGZvciBmb250cyB3aGljaCBkb24ndCBoYXZlCi0gICAgICBvbmUpLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC41IGFuZCAyLjQuNgotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gRm9yIFRydWVUeXBlIGJhc2VkIGZvbnRzLCB0aGUgYXNjZW5kZXIgYW5kIGRlc2NlbmRlciB2YWx1ZXMgd2VyZQotICAgICAgaW5jb3JyZWN0IHNvbWV0aW1lcyAgKG9mZiBieSBhIHBpeGVsIGlmIHRoZSBwcGVtIHZhbHVlIHdhcyBub3QgYQotICAgICAgbXVsdGlwbGUgb2YgNSkuICAgRGVwZW5kaW5nIG9uIHRoZSB1c2UgeW91IG1pZ2h0IG5vdyAgZXhwZXJpZW5jZQotICAgICAgYSBkaWZmZXJlbnQgIGxheW91dDsgdGhlICBjaGFuZ2Ugc2hvdWxkICByZXN1bHQgaW4gIGJldHRlciwgbW9yZQotICAgICAgY29uc2lzdGVudCBsaW5lIHNwYWNpbmcuCi0KLSAgICAtIEZpeCBDVkUtMjAxMS0wMjI2ICB3aGljaCBjYXVzZXMgYSAgdnVsbmVyYWJpbGl0eSB3aGlsZSAgaGFuZGxpbmcKLSAgICAgIFR5cGUgMSBmb250cy4KLQotICAgIC0gQkRGIGZvbnRzICBjb250YWluaW5nICBnbHlwaHMgd2l0aCBuZWdhdGl2ZSB2YWx1ZXMgIGZvciBFTkNPRElORwotICAgICAgd2VyZSAgaW5jb3JyZWN0bHkgIHJlamVjdGVkLiAgVGhpcyAgYnVnIGhhcyAgYmVlbiBpbnRyb2R1Y2VkICBpbgotICAgICAgRnJlZVR5cGUgdmVyc2lvbiAyLjIuMC4KLQotICAgIC0gRGF2aWQgQmV2YW4gY29udHJpYnV0ZWQgYSBtYWpvciByZXZpc2lvbiBvZiB0aGUgRnJlZVR5cGUgc3Ryb2tlcgotICAgICAgY29kZToKLQotICAgICAgLiBUaGUgYmVoYXZpb3VyIG9mIEZUX1NUUk9LRVJfTElORUpPSU5fQkVWRUwgaGFzIGJlZW4gY29ycmVjdGVkLgotCi0gICAgICAuIEEgbmV3ICBsaW5lIGpvaW4gc3R5bGUsICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVELCAgaGFzCi0gICAgICAgIGJlZW4gaW50cm9kdWNlZCB0byBzdXBwb3J0IFBvc3RTY3JpcHQgYW5kIFBERiBtaXRlciBqb2lucy4KLQotICAgICAgLiBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFICBoYXMgYmVlbiBpbnRyb2R1Y2VkICBhcyBhbgotICAgICAgICBhbGlhcyBmb3IgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUi4KLQotICAgICAgLiBWYXJpb3VzIHN0cm9raW5nIGdsaXRjaGVzIGhhcyBiZWVuIGZpeGVkLgotCi0KLSAgSUkuIE1JU0NFTExBTkVPVVMKLQotICAgICAgLSBTRk5UIGJpdG1hcCBmb250cyB3aGljaCBjb250YWluIGFuIG91dGxpbmUgZ2x5cGggZm9yIGAubm90ZGVmJwotICAgICAgICBvbmx5IG5vIGxvbmdlciBzZXQgdGhlIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSBmbGFnLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC40IGFuZCAyLjQuNQotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQSByZW5kZXJpbmcgcmVncmVzc2lvbiAgZm9yIHNlY29uZC1vcmRlciBCw6l6aWVyIGN1cnZlcyAgaGFzIGJlZW4KLSAgICAgIGZpeGVkLCBpbnRyb2R1Y2VkIGluIDIuNC4zLgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIElmIGF1dG9oaW50aW5nICBpcyBub3QgIGV4cGxpY2l0bHkgZGlzYWJsZWQsICBGcmVlVHlwZSBub3cgIHVzZXMKLSAgICAgIHRoZSBhdXRvaGludGVyIGlmICBhIFRydWVUeXBlIGJhc2VkIGZvbnQgZG9lc24ndCAgY29udGFpbiBuYXRpdmUKLSAgICAgIGhpbnRzLgotCi0gICAgLSBUaGUgbG9hZCBmbGFnIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIICBoYXMgYmVlbiBtYWRlCi0gICAgICByZWR1bmRhbnQgYW5kICBpcyBzaW1wbHkgaWdub3JlZDsgIHRoaXMgbWVhbnMgdGhhdCBGcmVlVHlwZSAgbm93Ci0gICAgICBpZ25vcmVzIHRoZSBnbG9iYWwgYWR2YW5jZSB3aWR0aCB2YWx1ZSBpbiBUcnVlVHlwZSBmb250cy4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBgRlRfU2ZudF9UYWJsZV9JbmZvJyBjYW4gbm93IHJldHVybiB0aGUgbnVtYmVyIG9mIFNGTlQgdGFibGVzIG9mCi0gICAgICBhIGZvbnQuCi0KLSAgICAtIFN1cHBvcnQgZm9yIFBDRiBmaWxlcyBjb21wcmVzc2VkIHdpdGggYnppcDIgaGFzIGJlZW4gY29udHJpYnV0ZWQKLSAgICAgIGJ5IEpvZWwgIEtsaW5naGVkLiAgVG8gIG1ha2UgdGhpcyAgd29yaywgdGhlICBPUyBtdXN0ICBwcm92aWRlIGEKLSAgICAgIGJ6aXAyIGxpYnJhcnkuCi0KLSAgICAtIEJyYWRsZXkgIEdyYWluZ2VyICBjb250cmlidXRlZCAgcHJvamVjdCAgYW5kICBzb2x1dGlvbiAgZmlsZXMgaW4KLSAgICAgIFZpc3VhbCBTdHVkaW8gMjAxMCBmb3JtYXQuCi0KLSAgICAtIEFnYWluIHNvbWUgZml4ZXMgdG8gYmV0dGVyIGhhbmRsZSBicm9rZW4gZm9udHMuCi0KLSAgICAtIFNvbWUgaW1wcm92ZW1lbnRzIHRvIHRoZSBCL1cgcmFzdGVyaXplci4KLQotICAgIC0gRml4ZXMgdG8gdGhlIGNhY2hlIG1vZHVsZSB0byBpbXByb3ZlIHJvYnVzdG5lc3MuCi0KLSAgICAtIEp1c3QgIEZpbGwgQnVncyBjb250cmlidXRlZCAoZXhwZXJpbWVudGFsKSBjb2RlIHRvIGNvbXB1dGUgIGJsdWUKLSAgICAgIHpvbmVzIGZvciBDSksgSWRlb2dyYXBocywgaW1wcm92aW5nIHRoZSBhbGlnbm1lbnQgb2YgIGhvcml6b250YWwKLSAgICAgIHN0ZW1zIGF0IHRoZSB0b3Agb3IgYm90dG9tIGVkZ2VzLgotCi0gICAgLSBUaGUgYGZ0Z3JpZCcgZGVtbyBwcm9ncmFtICBjYW4gbm93IGRpc3BsYXkgIGF1dG9oaW50ZXIgc2VnbWVudHMsCi0gICAgICB0byBiZSB0b2dnbGVkIG9uIGFuZCBvZmYgd2l0aCBrZXkgYHMnLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC4zIGFuZCAyLjQuNAotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gVVZTIHN1cHBvcnQgKFRydWVUeXBlL09wZW5UeXBlIGNtYXAgZm9ybWF0IDE0KSBzdXBwb3J0IGlzIGZpeGVkLgotICAgICAgVGhpcyByZWdyZXNzaW9uIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gdmVyc2lvbiAyLjQuMC4KLQotCi0gIElJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIERldGVjdCB0cmlja3kgZm9udHMgKGUuZy4gTWluZ0xpVSkgIGJ5IHRoZSBsZW5ndGhzIGFuZCBjaGVja3N1bXMKLSAgICAgIG9mIFR5cGU0Mi1wZXJzaXN0ZW50IHN1YnRhYmxlcyAoYGN2dCAnLCBgZnBnbScsIGFuZCBgcHJlcCcpIHdoZW4KLSAgICAgIGEgVHJ1ZVR5cGUgZm9udCB3aXRob3V0IGZhbWlseSBuYW1lIGlzIGdpdmVuLiAgVGhlIHByZXZpb3VzIGZpeCwKLSAgICAgIGludHJvZHVjZWQgaW4gMi40LjMsICB3YXMgdG9vIHJpZ29yb3VzLCAgY2F1c2luZyBtYW55ICBzdWJzZXR0ZWQKLSAgICAgIGZvbnRzIChtYWlubHkgIGZyb20gUERGIGZpbGVzKSBkaXNwbGF5ZWQgYmFkbHkgIGJlY2F1c2UgRnJlZVR5cGUKLSAgICAgIGZvcmNlZCAgcmVuZGVyaW5nIHdpdGggIHRoZSBUcnVlVHlwZSBieXRlY29kZSBlbmdpbmUgIGluc3RlYWQgb2YKLSAgICAgIHRoZSBhdXRvaGludGVyLgotCi0gICAgLSBCZXR0ZXIgc3VwcG9ydCBmb3IgNjRiaXQgcGxhdGZvcm1zLgotCi0gICAgLSBNb3JlIGZpeGVzIHRvIGltcHJvdmUgaGFuZGxpbmcgb2YgYnJva2VuIGZvbnRzLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC4yIGFuZCAyLjQuMwotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gRml4IHJlbmRlcmluZyBvZiBjZXJ0YWluIGN1YmljLCBTLXNoYXBlZCBhcmNzLiAgIFRoaXMgcmVncmVzc2lvbgotICAgICAgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDIuNC4wLgotCi0KLSAgSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gVG8gIGZpeCAgdGhlICBhYm92ZSAgbWVudGlvbmVkICByZW5kZXJpbmcgIGlzc3VlLCAgYSAgbmV3IHNwbGluZQotICAgICAgZmxhdHRlbmluZyBhbGdvcml0aG0gIGhhcyBiZWVuICBpbnRyb2R1Y2VkIHdoaWNoICBzcGVlZHMgdXAgYm90aAotICAgICAgY29uaWMgYW5kIGN1YmljIGFyY3MuCi0KLSAgICAtIEhhbmRsaW5nIG9mIGJyb2tlbiBmb250cyBoYXMgYmVlbiBmdXJ0aGVyIGltcHJvdmVkLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC4xIGFuZCAyLjQuMgotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQSBzdGFjayBvdmVyZmxvdyBpbiBDRkYgVHlwZTIgQ2hhclN0cmluZ3MgaW50ZXJwcmV0ZXIgaXMgZml4ZWQuCi0KLSAgICAtIEhhbmRsaW5nIFR5cGUgNDIgZm9udCBkZWFsbG9jYXRpb24gd2FzIGJyb2tlbjsgYWRkaXRpb25hbGx5LCB0aGUKLSAgICAgIGxpYnJhcnkgaXMgbm93IG1vcmUgcm9idXN0IGFnYWluc3QgbWFsZm9ybWVkIFR5cGUgNDIgZm9udHMuCi0KLQotICBJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBUd28gbmV3IGZ1bmN0aW9ucywgIGBGVF9SZWZlcmVuY2VfTGlicmFyeScgKGluIEZUX01PRFVMRV9IKSAgYW5kCi0gICAgICBgRlRfUmVmZXJlbmNlX0ZhY2UnICAoaW4gIEZUX0ZSRUVUWVBFX0gpLCAgaGF2ZSAgYmVlbiAgYWRkZWQgIHRvCi0gICAgICBzaW1wbGlmeSBsaWZlLWN5Y2xlIG1hbmFnZW1lbnQuICBBIGNvdW50ZXIgZ2V0cyBpbml0aWFsaXplZCB0byAxCi0gICAgICBhdCB0aGUgIHRpbWUgYW4gIEZUX0xpYnJhcnkgKG9yICBGVF9GYWNlKSBzdHJ1Y3R1cmUgIGlzIGNyZWF0ZWQuCi0gICAgICBUaGUgIHR3byAgbmV3ICAgZnVuY3Rpb25zICBpbmNyZW1lbnQgIHRoZSAgcmVzcGVjdGl2ZSAgIGNvdW50ZXIuCi0gICAgICBgRlRfRG9uZV9MaWJyYXJ5JyBhbmQgYEZUX0RvbmVfRmFjZScgdGhlbiBvbmx5IGRlc3Ryb3kgYSBsaWJyYXJ5Ci0gICAgICBvciBmYWNlIGlmIHRoZSBjb3VudGVyIGlzIDEsIG90aGVyd2lzZSB0aGV5IHNpbXBseSBkZWNyZW1lbnQgdGhlCi0gICAgICBjb3VudGVyLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuNC4wIGFuZCAyLjQuMQotCi0gIEkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIEEgc2VyaW91cyBidWcgaW4gdGhlICBDRkYgZm9udCBtb2R1bGUgcHJldmVudGVkICBkaXNwbGF5IG9mIG1hbnkKLSAgICAgIGdseXBocyBpbiBDRkYgZm9udHMgbGlrZSBgTWluaW9uUHJvLVJlZ3VsYXIub3RmJy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuMTIgYW5kIDIuNC4wCi0KLSAgSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gU2luY2UgTWF5ICAyMDEwLCBhbGwgIHBhdGVudHMgIHJlZ2FyZGluZyAgdGhlIFRydWVUeXBlICBieXRlY29kZQotICAgICAgaW50ZXJwcmV0ZXIgaGF2ZSBleHBpcmVkIHdvcmxkd2lkZS4gIENvbnNlcXVlbnRseSwgd2Ugbm93IGRlZmluZQotICAgICAgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiBieSAgZGVmYXVsdCAoYW5kICB1bmRlZmluZQotICAgICAgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcpLgotCi0gICAgLSBBIG5ldyBmdW5jdGlvbiBgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzJyBpcyBhdmFpbGFibGUgIHRvCi0gICAgICBhZGp1c3QgdGhlIGZpbHRlciB3ZWlnaHRzIHNldCBieSBgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXInLgotCi0KLSAgSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gVGhhbmtzIHRvIG1hbnkgcmVwb3J0cyBmcm9tIFJvYmVydCDFmndpxJlja2ksIEZyZWVUeXBlJ3Mgc3RhYmlsaXR5Ci0gICAgICBpbiBoYW5kbGluZyBicm9rZW4gb3IgZGFtYWdlZCBmb250cyBpcyBtdWNoIGltcHJvdmVkLgotCi0gICAgLSBTdXBwb3J0ICBmb3IgTENEICBmaWx0ZXIgIGNvbnRyb2wgaGFzICBiZWVuICBhZGRlZCB0byAgdGhlICBkZW1vCi0gICAgICBwcm9ncmFtcyBgZnRkaWZmJyBhbmQgYGZ0dmlldycuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi4zLjExIGFuZCAyLjMuMTIKLQotICBJLiBJTVBPUlRBTlQgQ0hBTkdFUwotCi0gICAgLSBGb3IgIGBGVF9PcGVuX0ZhY2UnLCAgbmV3ICBwYXJhbWV0ZXJzICBhcmUgIGF2YWlsYWJsZSAgdG8gaWdub3JlCi0gICAgICBwcmVmZXJyZWQgZmFtaWx5IG5hbWVzOiBGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9GQU1JTFkgYW5kCi0gICAgICBGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9TVUJGQU1JTFkuCi0KLQotICBJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBTdXBwb3J0ICBmb3IgIGluY3JlbWVudGFsICBmb250ICBsb2FkaW5nICAoY29udHJvbGxlZCAgd2l0aCAgdGhlCi0gICAgICBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMIG1hY3JvKSBpcyBub3cgYWN0aXZlIGJ5IGRlZmF1bHQuCi0KLSAgICAtIEJldHRlciBzdXBwb3J0IGZvciB2ZXJ0aWNhbCBtZXRyaWNzLgotCi0gICAgLSBWYXJpb3VzIG1pbm9yIGJ1ZyBmaXhlcy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuMTAgYW5kIDIuMy4xMQotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gVmVyc2lvbiAyLjMuMTAgYnJva2UgUENGIHN1cHBvcnQuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi4zLjEwIGFuZCAyLjMuOQotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gSWYgYWxsICBBU0NJSSBkaWdpdHMgaW4gYSAgZm9udCBoYXZlIHRoZSAgc2FtZSAodW5zY2FsZWQpIHdpZHRoLAotICAgICAgdGhlIGF1dG9oaW50ZXIgcmVzcGVjdHMgdGhpcyBhbmQgd29uJ3QgY2hhbmdlIGl0LgotCi0gICAgLSBUcnVlVHlwZSBmb250cyAgYXJlIG5vdyAgcmFzdGVyaXplZCBjb3JyZWN0bHkgIGlmIHRoZSBob3Jpem9udGFsCi0gICAgICBhbmQgdmVydGljYWwgcmVzb2x1dGlvbiBkaWZmZXIuCi0KLSAgICAtIFR5cGUgMSBmb250cyBhcmUgbm93IGhhbmRsZWQgd2l0aCBpbmNyZWFzZWQgcHJlY2lzaW9uIGludGVybmFsbHkKLSAgICAgIHRvIGF2b2lkIHNlcmlvdXMgcm91bmRpbmcgaXNzdWVzIGlmIG5vbi1pbnRlZ3JhbCBjb29yZGluYXRlcyBhcmUKLSAgICAgIGVuY291bnRlcmVkLgotCi0gICAgLSBIb3Jpem9udGFsbHkgIGNvbmRlbnNlZCBDRkYgIGZvbnRzICh1c2luZyB0aGUgZm9udCAgbWF0cml4KSB3ZXJlCi0gICAgICByZW5kZXJlZCAgaW5jb3JyZWN0bHkuICAgVGhpcyAgYnVnICBoYXMgIGJlZW4gIGludHJvZHVjZWQgIGFmdGVyCi0gICAgICByZWxlYXNlIDIuMy41LgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIFN1cHBvcnQgZm9yIHRoZSBTRk5UIGNtYXAgMTMgdGFibGUgZm9ybWF0IChhcyBkZWZpbmVkIGJ5IHRoZSBuZXcKLSAgICAgIE9wZW5UeXBlIDEuNiBzcGVjaWZpY2F0aW9uKSBoYXMgYmVlbiBhZGRlZC4KLQotICAgIC0gQi9XIHJhc3Rlcml6YXRpb24gIG9mIHdlbGwtaGludGVkIFRydWVUeXBlICBmb250cyBhdCBzbWFsbCBzaXplcwotICAgICAgaGFzIGJlZW4gZ3JlYXRseSBpbXByb3ZlZC4KLQotICAgIC0gQ2FsY3VsYXRpb24gIG9mICB2ZXJ0aWNhbCAgbWV0cmljcyBpbiAgT3BlblR5cGUgIGZvbnRzIGhhcyAgYmVlbgotICAgICAgaW1wcm92ZWQuCi0KLQotICBJSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gSXQgIGlzIG5vdyAgcG9zc2libGUgdG8gIGNoYW5nZSAgdGhlIGVtYm9sZGVuaW5nICBmYWN0b3IgaW4gIHRoZQotICAgICAgYGZ0dmlldycgZGVtbyBwcm9ncmFtIHdpdGgga2V5cyBgZScgYW5kIGBFJy4KLQotICAgIC0gSXQgaXMgIG5vdyBwb3NzaWJsZSAgdG8gY2hhbmdlIHRoZSAgc2xhbnQgdmFsdWUgaW4gIHRoZSBgZnR2aWV3JwotICAgICAgZGVtbyBwcm9ncmFtIHdpdGgga2V5cyBgcycgYW5kIGBTJy4KLQotICAgIC0gVGhlICA1LWxldmVscyAgZ3JheXNjYWxlICBtb2RlIG9mICB0aGUgYGZ0cmFzdGVyJyAgbW9kdWxlICh3aGljaAotICAgICAgRnJlZVR5cGUgZG9lc24ndCB1c2UgYnkgZGVmYXVsdCkgd2FzIGJyb2tlbiBzaW5jZSB2ZXJzaW9uIDIuMy4wLgotCi0gICAgLSBDb21waWxhdGlvbiBvZiB0aGUgIGBmdGdyYXlzJyBhbmQgYGZ0cmFzdGVyJyBtb2R1bGVzICB3YXMgYnJva2VuCi0gICAgICBpbiBzdGFuZC1hbG9uZSBtb2RlLgotCi0gICAgLSBWYXJpb3VzIGZpeGVzIGZvciBjb21waWxhdGlvbiBvbiA2NGJpdCBhbmQgMTZiaXQgYXJjaGl0ZWN0dXJlcy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuOSBhbmQgMi4zLjgKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIFZlcnkgdW5mb3J0dW5hdGVseSwgRnJlZVR5cGUgMi4zLjggY29udGFpbmVkIGEgY2hhbmdlIHRoYXQgYnJva2UKLSAgICAgIGl0cyAgb2ZmaWNpYWwgQUJJLiAgVGhlICBlbmQgcmVzdWx0ICBpcyAgdGhhdCBwcm9ncmFtcyAgY29tcGlsZWQKLSAgICAgIGFnYWluc3QgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnksIGJ1dCBkeW5hbWljYWxseSBsaW5rZWQKLSAgICAgIHRvICAyLjMuOCBjYW4gIGV4cGVyaWVuY2UgIG1lbW9yeSBjb3JydXB0aW9uICBpZiAgdGhleSBjYWxsICB0aGUKLSAgICAgIGBGVF9HZXRfUFNfRm9udF9JbmZvJyBmdW5jdGlvbi4KLQotICAgICAgV2UgcmVjb21tZW5kIGFsbCB1c2VycyB0byAgdXBncmFkZSB0byAyLjMuOSBhcyBzb29uIGFzIHBvc3NpYmxlLAotICAgICAgb3IgdG8gZG93bmdyYWRlIHRvIGEgcHJldmlvdXMgIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnkgaWYgdGhpcyBpcwotICAgICAgbm90IGFuIG9wdGlvbi4KLQotICAgICAgVGhlICBvcmlnaW4gb2YgdGhlICBidWcgaXMgIHRoYXQgYSAgbmV3IGZpZWxkICB3YXMgYWRkZWQgIHRvIHRoZQotICAgICAgcHVibGljbHkgIGRlZmluZWQgIGBQU19Gb250SW5mb1JlYycgIHN0cnVjdHVyZS4gICBVbmZvcnR1bmF0ZWx5LAotICAgICAgb2JqZWN0cyBvZiB0aGlzICB0eXBlIGNhbiBiZSBzdGFjayBvciAgaGVhcCBhbGxvY2F0ZWQgYnkgY2FsbGVycwotICAgICAgb2YgICBgRlRfR2V0X1BTX0ZvbnRfSW5mbycsICByZXN1bHRpbmcgICBpbiAgIGEgIG1lbW9yeSAgIGJ1ZmZlcgotICAgICAgb3ZlcndyaXRlIHdpdGggaXRzIGltcGxlbWVudGF0aW9uIGluIDIuMy44LgotCi0gICAgICBJZiAgeW91IHdhbnQgdG8gIGtub3cgd2hldGhlciAgeW91ciBjb2RlICBpcyB2dWxuZXJhYmxlICB0byB0aGlzCi0gICAgICBpc3N1ZSwgIHNpbXBseSAgc2VhcmNoICBmb3IgIHRoZSAgc3Vic3RyaW5ncyAgYFBTX0ZvbnRJbmZvJyAgYW5kCi0gICAgICBgUFNfRm9udF9JbmZvJyBpbiB5b3VyIHNvdXJjZSBjb2RlLiAgSWYgbm9uZSBpcyBmb3VuZCwgeW91ciBjb2RlCi0gICAgICBpcyBzYWZlIGFuZCBpcyBub3QgYWZmZWN0ZWQuCi0KLSAgICAgIFRoZSBGcmVlVHlwZSB0ZWFtIGFwb2xvZ2l6ZXMgZm9yIHRoZSBwcm9ibGVtLgotCi0gICAgLSBUaGUgUE9TSVggc3VwcG9ydCAgb2YgTWFjT1MgcmVzb3VyY2UtZm9yayBmb250cyAgKFN1aXRjYXNlIGZvbnRzCi0gICAgICBhbmQgTGFzZXJXcml0ZXIgVHlwZTEgUG9zdFNjcmlwdCBmb250cykgd2FzIGJyb2tlbiBpbiAyLjMuOC4gIElmCi0gICAgICBGcmVlVHlwZTIgaXMgYnVpbHQgd2l0aG91dCBDYXJib24gZnJhbWV3b3JrLCB0aGVzZSBmb250cyBhcmUgbm90Ci0gICAgICBoYW5kbGVkIGNvcnJlY3RseS4gIFZlcnNpb24gMi4zLjcgZGlkbid0IGhhdmUgdGhpcyBidWcuCi0KLSAgICAtIGBGVF9HZXRfQWR2YW5jZScgKGFuZCBgRlRfR2V0X0FkdmFuY2VzJykgcmV0dXJuZWQgYmFkIHZhbHVlcyBmb3IKLSAgICAgIGFsbW9zdCBhbGwgZm9udCBmb3JtYXRzIGV4Y2VwdCBUcnVlVHlwZSBmb250cy4KLQotICAgIC0gRml4IGEgYnVnICBpbiB0aGUgU0ZOVCAga2VybmluZyB0YWJsZSAgbG9hZGVyL3BhcnNlciB3aGljaCBjb3VsZAotICAgICAgY3Jhc2ggdGhlIGVuZ2luZSBpZiBjZXJ0YWluIG1hbGZvcm1lZCB0YWJsZXMgd2VyZSBlbmNvdW50ZXJlZC4KLQotICAgIC0gQ29tcG9zaXRlIFNGTlQgYml0bWFwcyBhcmUgbm93IGhhbmRsZWQgY29ycmVjdGx5LgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIFRoZSAgIG5ldyAgZnVuY3Rpb25zICAgYEZUX0dldF9DSURfSXNfSW50ZXJuYWxseV9DSURfa2V5ZWQnICBhbmQKLSAgICAgIGBGVF9HZXRfQ0lEX0Zyb21fR2x5cGhfSW5kZXgnICBjYW4gYmUgIHVzZWQgdG8gIGFjY2VzcyBDSUQta2V5ZWQKLSAgICAgIENGRiBmb250cyAgdmlhIENJRCAgdmFsdWVzLiAgVGhpcyBjb2RlICBoYXMgYmVlbiAgY29udHJpYnV0ZWQgYnkKLSAgICAgIE1pY2hhZWwgVG9mdGRhbC4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBgRlRfT3V0bGluZV9HZXRfSW5zaWRlQm9yZGVyJyAgcmV0dXJucyAgIEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUCi0gICAgICBmb3IgZW1wdHkgb3V0bGluZXMuICBUaGlzIHdhcyBpbmNvcnJlY3RseSBkb2N1bWVudGVkLgotCi0gICAgLSBUaGUgYGZ0dmlldycgZGVtbyBwcm9ncmFtIG5vdyBzdXBwb3J0cyBVVEYtOCBlbmNvZGVkIHN0cmluZ3MuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi4zLjggYW5kIDIuMy43Ci0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBDSUQta2V5ZWQgZm9udHMgaW4gYW4gU0ZOVCB3cmFwcGVyIHdlcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5LgotCi0gICAgLSBUaGUgc21vb3RoIHJlbmRlcmVyIHByb2R1Y2VkIHRydW5jYXRlZCBpbWFnZXMgKG9uIHRoZSByaWdodCkgZm9yCi0gICAgICBvdXRsaW5lIHBhcnRzIHdpdGggbmVnYXRpdmUgaG9yaXpvbnRhbCB2YWx1ZXMuICBNb3N0IGZvbnRzIGRvbid0Ci0gICAgICBjb250YWluIG91dGxpbmVzIGxlZnQgIHRvIHRoZSB5IGNvb3JkaW5hdGUgYXhpcywgYnV0ICB0aGUgZWZmZWN0Ci0gICAgICB3YXMgdmVyeSBub3RpY2VhYmxlIGZvciBvdXRsaW5lcyBwcm9jZXNzZWQgd2l0aCBGVF9HbHlwaF9TdHJva2UsCi0gICAgICB1c2luZyB0aGljayBzdHJva2VzLgotCi0gICAgLSBgRlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlJyAgcmV0dXJuZWQgYSAgd3JvbmcgIHZhbHVlIGlmICBib3RoCi0gICAgICBjb25maWd1cmF0aW9uICBtYWNyb3MgIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgYW5kCi0gICAgICBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyB3ZXJlIGRlZmluZWQuCi0KLSAgICAtIFRoZSAgYGZhY2VfaW5kZXgnICBmaWVsZCAgaW4gICB0aGUgIGBGVF9GYWNlJyAgc3RydWN0dXJlICB3YXNuJ3QKLSAgICAgIGluaXRpYWxpemVkIHByb3Blcmx5IGFmdGVyIGNhbGxpbmcgRlRfT3Blbl9GYWNlIGFuZCBmcmllbmRzIHdpdGgKLSAgICAgIGEgcG9zaXRpdmUgZmFjZSBpbmRleCBmb3IgQ0ZGcywgIFdpbkZOVHMsIGFuZCwgbW9zdCBpbXBvcnRhbnRseSwKLSAgICAgIGZvciBUcnVlVHlwZSBDb2xsZWN0aW9ucyAoVFRDcykuCi0KLQotICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gUnVkaW1lbnRhcnkgc3VwcG9ydCBmb3IgVHlwZSAxICBmb250cyBhbmQgQ0lELWtleWVkIFR5cGUgMSBmb250cwotICAgICAgaW4gYW4gU0ZOVCB3cmFwcGVyIGhhcyBiZWVuICBhZGRlZCAtLSBzdWNoIGZvbnRzIGFyZSB1c2VkIG9uIHRoZQotICAgICAgTWFjLiAgVGhlIGNvcmUgIFNGTlQgdGFibGVzIGBUWVAxJyBhbmQgYENJRCAnICBhcmUgcGFzc2VkIHRvIHRoZQotICAgICAgUFMgVHlwZSAxICBhbmQgQ0lELWtleWVkIFBTIGZvbnQgZHJpdmVyczsgIG90aGVyIHRhYmxlcyAoYEFMTVgnLAotICAgICAgYEJCT1gnLCBldGMuKSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCi0KLSAgICAtIEEgIG5ldyBpbnRlcmZhY2UgIHRvIGV4dHJhY3QgIGFkdmFuY2UgdmFsdWVzICBvZiBnbHlwaHMgIHdpdGhvdXQKLSAgICAgIGxvYWRpbmcgdGhlaXIgb3V0bGluZXMgaGFzIGJlZW4gYWRkZWQuICBUaGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQKLSAgICAgIGBGVF9HZXRfQWR2YW5jZScgYW5kIGBGVF9HZXRfQWR2YW5jZXMnOyB0aGV5IGFyZSBkZWZpbmVkIGluIGZpbGUKLSAgICAgIGBmdGFkdmFuYy5oJyAodG8gYmUgYWNjZXNzZWQgYXMgRlRfQURWQU5DRVNfSCkuCi0KLSAgICAtIEEgbmV3IGZ1bmN0aW9uIGBGVF9HZXRfRlNUeXBlX0ZsYWdzJyAoaW4gRlRfRlJFRVRZUEVfSCkgaGFzIGJlZW4KLSAgICAgIGNvbnRyaWJ1dGVkICBieSAgIERhdmlkICBCZXZhbiAgdG8gIGFjY2VzcyAgIHRoZSAgZW1iZWRkaW5nICBhbmQKLSAgICAgIHN1YnNldHRpbmcgcmVzdHJpY3Rpb24gaW5mb3JtYXRpb24gb2YgZm9udHMuCi0KLQotICBJSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gRlRfTXVsRml4IGlzIG5vdyBhbiBpbmxpbmVkIGZ1bmN0aW9uOyBieSBkZWZhdWx0LCBhc3NlbWJsZXIgY29kZQotICAgICAgaXMgcHJvdmlkZWQgZm9yIHg4NiBhbmQgQVJNLiAgU2VlIEZUX0NPTkZJR19PUFRJT05fSU5MSU5FX01VTEZJWAotICAgICAgYW5kIEZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSIChpbiBmdG9wdGlvbi5oKSBmb3IgbW9yZS4KLQotICAgIC0gVGhlIGhhbmRsaW5nIG9mIGB0cmlja3knIGZvbnRzICAodGhpcyBpcywgZm9udHMgd2hpY2ggZG9uJ3Qgd29yawotICAgICAgd2l0aCB0aGUgIGF1dG9oaW50ZXIsIG5lZWRpbmcgdGhlIGZvbnQgIGZvcm1hdCdzIGhpbnRpbmcgZW5naW5lKQotICAgICAgaGFzIGJlZW4gZ2VuZXJhbGl6ZWQgYW5kIGNoYW5nZWQgc2xpZ2h0bHk6Ci0KLSAgICAgIC4gQSBuZXcgIGZhY2UgZmxhZyAgRlRfRkFDRV9GTEFHX1RSSUNLWSBpbmRpY2F0ZXMgdGhhdCAgdGhlIGZvbnQKLSAgICAgICAgZm9ybWF0J3MgIGhpbnRpbmcgZW5naW5lIGlzICBuZWNlc3NhcnkgZm9yICBjb3JyZWN0IHJlbmRlcmluZy4KLSAgICAgICAgVGhlIG1hY3JvIEZUX0lTX1RSSUNLWSBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGlzIGZsYWcuCi0KLSAgICAgIC4gRlRfTE9BRF9OT19ISU5USU5HIGlzIG5vdyBpZ25vcmVkIGZvciB0cmlja3kgZm9udHMuICBUbyByZWFsbHkKLSAgICAgICAgZm9yY2UgIHJhdyAgbG9hZGluZyAgb2YgIHN1Y2ggZm9udHMgICh3aXRob3V0ICBoaW50aW5nKSwgIGJvdGgKLSAgICAgICAgRlRfTE9BRF9OT19ISU5USU5HICBhbmQgRlRfTE9BRF9OT19BVVRPSElOVCAgbXVzdCAgYmUgdXNlZCAgLS0KLSAgICAgICAgdGhpcyBpcyBzb21ldGhpbmcgd2hpY2ggeW91IHByb2JhYmx5IG5ldmVyIHdhbnQgdG8gZG8uCi0KLSAgICAgIC4gVHJpY2t5ICBUcnVlVHlwZSBmb250cyAgYWx3YXlzIHVzZSAgdGhlICBieXRlY29kZSBpbnRlcnByZXRlciwKLSAgICAgICAgZWl0aGVyIHRoZSBwYXRlbnRlZCBvciB1bnBhdGVudGVkIHZlcnNpb24uCi0KLSAgICAtIFRoZSAgZnVuY3Rpb24gIGBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCcgIGhhcyAgYmVlbiAgbW92ZWQgIGZyb20KLSAgICAgIEZUX1NZTlRIRVNJU19IIHRvIEZUX0JJVE1BUF9IOyBpdCAgaXMgbm93IHBhcnQgb2YgdGhlIGBvZmZpY2lhbCcKLSAgICAgIEFQSS4gICAoVGhlIGZ1bmN0aW9ucyAgaW4gIEZUX1NZTlRIRVNJU19IIGFyZSAgc3RpbGwgc3ViamVjdCAgdG8KLSAgICAgIGNoYW5nZSwgaG93ZXZlci4pCi0KLSAgICAtIEluIHRoZSAgYGZ0ZGlmZicgIGRlbW8gIHByb2dyYW0geW91ICBjYW4gbm93ICB0b2dnbGUgdGhlICB1c2Ugb2YKLSAgICAgIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIIHdpdGgga2V5IGBhJy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuNyBhbmQgMi4zLjYKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIElmIHRoZSBsaWJyYXJ5ICB3YXMgY29tcGlsZWQgb24gYW4gaTM4NiAgcGxhdGZvcm0gdXNpbmcgZ2NjLCBhbmQKLSAgICAgIGNvbXBpbGVyICBvcHRpb24gLU8zIHdhcyAgZ2l2ZW4sIGBGVF9NdWxGaXgnICBzb21ldGltZXMgcmV0dXJuZWQKLSAgICAgIGluY29ycmVjdCAgcmVzdWx0cyAgIHdoaWNoICBjb3VsZCAgaGF2ZSAgIGNhdXNlZCAgcHJvYmxlbXMgIHdpdGgKLSAgICAgIGBGVF9SZXF1ZXN0X01ldHJpY3MnICAgYW5kICBgRlRfU2VsZWN0X01ldHJpY3MnLCAgIHJldHVybmluZyAgYW4KLSAgICAgIGluY29ycmVjdCBkZXNjZW5kZXIgc2l6ZS4KLQotICAgIC0gUHVyZSBDRkZzIHdpdGhvdXQgIHN1YmZvbnRzIHdlcmUgc2NhbGVkIGluY29ycmVjdGx5ICBpZiB0aGUgZm9udAotICAgICAgbWF0cml4ICB3YXMgIG5vbi1zdGFuZGFyZC4gIFRoaXMgIGJ1ZyAgaGFzICBiZWVuICBpbnRyb2R1Y2VkICBpbgotICAgICAgdmVyc2lvbiAyLjMuNi4KLQotICAgIC0gVGhlICBgc3R5bGVfbmFtZScgIGZpZWxkICBpbiAgdGhlICBgRlRfRmFjZVJlYycgIHN0cnVjdHVyZSBvZnRlbgotICAgICAgY29udGFpbmVkICBhIHdyb25nICB2YWx1ZSBmb3IgIFR5cGUgMSAgZm9udHMuICBUaGlzIG1pc2JlaGF2aW91cgotICAgICAgaGFzIGJlZW4gIGludHJvZHVjZWQgIGluICB2ZXJzaW9uICAyLjMuNiAgd2hpbGUgIHRyeWluZyAgdG8gIGZpeAotICAgICAgYW5vdGhlciAgIHByb2JsZW0uICAgW05vdGUsICBob3dldmVyLCAgIHRoYXQgICB0aGlzICAgdmFsdWUgICBpcwotICAgICAgaW5mb3JtYXRpdmUgb25seSAgc2luY2UgIHRoZSAgdXNlZCAgYWxnb3JpdGhtIHRvICBleHRyYWN0ICBpdCBpcwotICAgICAgdmVyeSBzaW1wbGlzdGljLl0KLQotCi0gIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwotCi0gICAgLSBUd28gICAgICBuZXcgICAgICBtYWNyb3MsICAgICAgRlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUyAgICAgYW5kCi0gICAgICBGVF9PVVRMSU5FX0VYQ0xVREVfU1RVQlMsICBoYXZlIGJlZW4gaW50cm9kdWNlZC4gICBUb2dldGhlciB3aXRoCi0gICAgICBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUyAod2hpY2ggIHdhcyBpZ25vcmVkIHByZXZpb3VzbHkpIGl0IGlzCi0gICAgICBub3cgcG9zc2libGUgdG8gY29udHJvbCB0aGUgZHJvcG91dCBtb2RlICBvZiB0aGUgYHJhc3RlcicgbW9kdWxlCi0gICAgICAoZm9yIEImVyByYXN0ZXJpemF0aW9uKSwgICB1c2luZyAgdGhlICAgYGZsYWdzJyAgZmllbGQgICBpbiAgdGhlCi0gICAgICBgRlRfT3V0bGluZScgc3RydWN0dXJlLgotCi0gICAgLSBUaGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgbm93IHBhc3NlcyB0aGUgZHJvcG91dCBtb2RlIHRvCi0gICAgICB0aGUgQiZXIHJhc3Rlcml6ZXIuICBUaGlzIGdyZWF0bHkgaW5jcmVhc2VzIHRoZSBvdXRwdXQgZm9yIHNtYWxsCi0gICAgICBwcGVtIHZhbHVlcyBvZiBtYW55IGZvbnRzIGxpa2UgYHBhbGEudHRmJy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuNiBhbmQgMi4zLjUKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIEEgIGJ1bmNoIG9mICBwb3RlbnRpYWwgc2VjdXJpdHkgIHByb2JsZW1zIGhhdmUgIGJlZW4gZm91bmQuICBBbGwKLSAgICAgIHVzZXJzIHNob3VsZCB1cGRhdGUuCi0KLSAgICAtIE1pY3Jvc29mdCAgVW5pY29kZSAgY21hcHMgIGluICBUcnVlVHlwZSAgZm9udHMgIGFyZSAgbm93ICBhbHdheXMKLSAgICAgIHByZWZlcnJlZCBvdmVyIEFwcGxlIGNtYXBzLiAgVGhpcyBpcyBub3QgYSBidWcgcGVyIHNlLCBidXQgdGhlcmUKLSAgICAgIGV4aXN0IHNvbWUgYnVnZ3kgIGZvbnRzIGNyZWF0ZWQgZm9yIE1TIHdoaWNoICBoYXZlIGJyb2tlbiAgQXBwbGUKLSAgICAgIGNtYXBzLiAgVGhpcyBhZmZlY3RzICBvbmx5IHRoZSBhdXRvbWF0aWMgIHNlbGVjdGlvbiBvZiBGcmVlVHlwZTsKLSAgICAgIGl0J3MgYWx3YXlzIHBvc3NpYmxlIHRvIG1hbnVhbGx5IHNlbGVjdCBhbiBBcHBsZSBVbmljb2RlIGNtYXAgaWYKLSAgICAgIGRlc2lyZWQuCi0KLSAgICAtIE1hbnkgYnVnIGZpeGVzIHRvIHRoZSBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlci4KLQotICAgIC0gSW1wcm92ZWQgTWFjIHN1cHBvcnQuCi0KLSAgICAtIFN1YnNldHRlZCBDSUQta2V5ZWQgQ0ZGcyBhcmUgbm93IHN1cHBvcnRlZCBjb3JyZWN0bHkuCi0KLSAgICAtIENJRC1rZXllZCBDRkZzIHdpdGggc3ViZm9udHMgd2hpY2ggYXJlIHNjYWxlZCBpbiBhICBub24tc3RhbmRhcmQKLSAgICAgIHdheSBhcmUgbm93IGhhbmRsZWQgY29ycmVjdGx5LgotCi0gICAgLSBBIGNhbGwgdG8gRlRfT3Blbl9GYWNlIHdpdGggYGZhY2VfaW5kZXgnIDwgMCBjcmFzaGVkIEZyZWVUeXBlIGlmCi0gICAgICB0aGUgZm9udCB3YXMgYSBXaW5kb3dzIChiaXRtYXApIEZOVC9GT04uCi0KLQotICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gVGhlIG5ldyBmdW5jdGlvbiBgRlRfR2V0X0NJRF9SZWdpc3RyeV9PcmRlcmluZ19TdXBwbGVtZW50JyBnaXZlcwotICAgICAgYWNjZXNzIHRvICB0aG9zZSBmaWVsZHMgaW4gYSBDSUQta2V5ZWQgZm9udC4gIFRoZSBjb2RlICBoYXMgYmVlbgotICAgICAgY29udHJpYnV0ZWQgYnkgRGVyZWsgQ2xlZ2cuCi0KLSAgICAtIEdlb3JnZSBXaWxsaWFtcyAgY29udHJpYnV0ZWQgIGNvZGUgIHRvIHZhbGlkYXRlICB0aGUgbmV3ICBgTUFUSCcKLSAgICAgIE9wZW5UeXBlICB0YWJsZSAod2l0aGluICB0aGUgYG90dmFsaWQnICBtb2R1bGUpLiAgVGhlICBgZnR2YWxpZCcKLSAgICAgIGRlbW8gcHJvZ3JhbSBoYXMgYmVlbiBleHRlbmRlZCBhY2NvcmRpbmdseS4KLQotICAgIC0gQW4gQVBJIGZvciBjbWFwIDE0IHN1cHBvcnQgIChmb3IgVW5pY29kZSBWYXJpYW50IFNlbGVjdG9ycywgVVZTKQotICAgICAgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgR2VvcmdlIFdpbGxpYW1zLgotCi0gICAgLSBBIG5ldyBmYWNlIGZsYWcgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCBoYXMgYmVlbiBhZGRlZCwgIHRvZ2V0aGVyCi0gICAgICB3aXRoIGEgbWFjcm8gRlRfSVNfQ0lEX0tFWUVEIHdoaWNoIGV2YWx1YXRlcyB0byAxIGlmIHRoZSBmb250IGlzCi0gICAgICBDSUQta2V5ZWQuCi0KLQotICBJSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gQnVpbGQgc3VwcG9ydCBmb3Igc3ltYmlhbiBoYXMgYmVlbiBjb250cmlidXRlZC4KLQotICAgIC0gQmV0dGVyIFdHTDQgZ2x5cGggbmFtZSBzdXBwb3J0LCBjb250cmlidXRlZCBieSBTZXJnZXkgVG9sc3Rvdi4KLQotICAgIC0gRGVidWdnaW5nIG91dHB1dCBvZiB0aGUgIHZhcmlvdXMgRlRfVFJBQ0VYIG1hY3JvcyBpcyBub3cgc2VudCB0bwotICAgICAgc3RkZXJyLgotCi0gICAgLSBUaGUgYGZ0dmlldycgZGVtbyBwcm9ncmFtIG5vdyBwcm92aWRlcyBhcnRpZmljaWFsIHNsYW50aW5nIHRvby4KLQotICAgIC0gVGhlIGBmdHZhbGlkJyBkZW1vICBwcm9ncmFtIGhhcyBhIG5ldyAgb3B0aW9uIGAtZicgdG8gc2VsZWN0IHRoZQotICAgICAgZm9udCBpbmRleC4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuNSBhbmQgMi4zLjQKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIFNvbWUgc3ViZ2x5cGhzIGluIFRydWVUeXBlIGZvbnRzIHdlcmUgaGFuZGxlZCBpbmNvcnJlY3RseSBkdWUgdG8KLSAgICAgIGEgbWlzc2luZyBncmFwaGljcyBzdGF0ZSByZWluaXRpYWxpemF0aW9uLgotCi0gICAgLSBMYXJnZSAuWiBmaWxlcyAgKGFzIGRpc3RyaWJ1dGVkIHdpdGggc29tZSBYMTEgIHBhY2thZ2VzKSB3ZXJlbid0Ci0gICAgICBoYW5kbGVkIGNvcnJlY3RseSwgbWFraW5nIEZyZWVUeXBlIGluY3JlYXNlIHRoZSBoZWFwIHN0YWNrIGluIGFuCi0gICAgICBlbmRsZXNzIGxvb3AuCi0KLSAgICAtIEEgbGFyZ2UgIG51bWJlciBvZiAgYnVncyBoYXZlICBiZWVuIGZpeGVkICB0byBhdm9pZCAgY3Jhc2hlcyBhbmQKLSAgICAgIGVuZGxlc3MgbG9vcHMgd2l0aCBpbnZhbGlkIGZvbnRzLgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIFRoZSAgdHdvIG5ldyAgY2FjaGUgZnVuY3Rpb25zICBgRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyJyBhbmQKLSAgICAgIGBGVENfU0JpdF9DYWNoZV9Mb29rdXBTY2FsZXInIGhhdmUgYmVlbiBhZGRlZCB0byBhbGxvdyBsb29rdXAgb2YKLSAgICAgIGdseXBocyB1c2luZyBhbiAgYEZUQ19TY2FsZXInIG9iamVjdDsgIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8KLSAgICAgIHVzZSBmcmFjdGlvbmFsIHBpeGVsIHNpemVzIGluIHRoZSBjYWNoZS4gIFRoZSBkZW1vIHByb2dyYW1zIGhhdmUKLSAgICAgIGJlZW4gdXBkYXRlZCBhY2NvcmRpbmdseSB0byB1c2UgdGhpcyBmZWF0dXJlLgotCi0gICAgLSBBIG5ldyBBUEkgIGBGVF9HZXRfQ01hcF9Gb3JtYXQnIGhhcyBiZWVuIGFkZGVkIHRvICBnZXQgdGhlICBjbWFwCi0gICAgICBmb3JtYXQgIG9mIGEgIFRydWVUeXBlIGZvbnQuICAgVGhpcyAgaXMgdXNlZnVsICBpbiBoYW5kbGluZyAgUERGCi0gICAgICBmaWxlcy4gIFRoZSBjb2RlIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IERlcmVrIENsZWdnLgotCi0gICAgLSBUaGUgIGF1dG8taGludGVyICBub3cgIHByb2R1Y2VzICBiZXR0ZXIgIG91dHB1dCAgYnkgIGRlZmF1bHQgZm9yCi0gICAgICBub24tTGF0aW4gc2NyaXB0cyAgbGlrZSBJbmRpYy4gICBUaGlzIHdhcyBkb25lIGJ5ICB1c2luZyB0aGUgQ0pLCi0gICAgICBoaW50aW5nIG1vZHVsZSAgYXMgdGhlIGRlZmF1bHQgaW5zdGVhZCBvZiB0aGUgTGF0aW4gb25lLiAgVGhhbmtzCi0gICAgICB0byBSYWh1bCBCaGFsZXJhbyBmb3IgdGhpcyBzdWdnZXN0aW9uLgotCi0gICAgLSBBIG5ldyBBUEkgYEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMnICBoYXMgYmVlbiBhZGRlZCB0byBmaW5kCi0gICAgICBvdXQgIHdoZXRoZXIgIGEgIGdpdmVuICBUcnVlVHlwZSAgZm9udCAgdXNlcyAgcGF0ZW50ZWQgIGJ5dGVjb2RlCi0gICAgICBpbnN0cnVjdGlvbnMuICAgVGhlICBgZnQyZGVtb3MnIGJ1bmRsZSAgY29udGFpbnMgYSAgbmV3ICBwcm9ncmFtCi0gICAgICBjYWxsZWQgYGZ0cGF0Y2hrJyB3aGljaCBkZW1vbnN0cmF0ZXMgaXRzIHVzYWdlLgotCi0gICAgLSBBICBuZXcgIEFQSSAgYEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcnICBoYXMgIGJlZW4gIGFkZGVkIHRvCi0gICAgICBlbmFibGUgb3IgZGlzYWJsZSB0aGUgdW5wYXRlbnRlZCBoaW50ZXIuCi0KLSAgICAtIFN1cHBvcnQgZm9yIFdpbmRvd3MgRk9OIGZpbGVzIGluIFBFIGZvcm1hdCAgaGFzIGJlZW4gY29udHJpYnV0ZWQKLSAgICAgIGJ5IERtaXRyeSBUaW1vc2hrb3YuCi0KLQotICBJSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gVmluY2VudCBSaWNob21tZSBjb250cmlidXRlZCBWaXN1YWwgQysrIHByb2plY3QgZmlsZXMgZm9yIFBvY2tldAotICAgICAgUENzLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuMy40IGFuZCAyLjMuMwotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQSBzZXJpb3VzICBidWcgIGluICB0aGUgIGhhbmRsaW5nICBvZiBiaXRtYXAgIGZvbnRzIChhbmQgIGJpdG1hcAotICAgICAgc3RyaWtlcyBvZiBvdXRsaW5lIGZvbnRzKSBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIDIuMy4zLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuMy4zIGFuZCAyLjMuMgotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gUmVtb3ZlIGEgc2VyaW91cyByZWdyZXNzaW9uIGluIHRoZSBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlcgotICAgICAgdGhhdCB3YXMgaW50cm9kdWNlZCAgaW4gdmVyc2lvbiAyLjMuMi4gIE5vdGUgdGhhdCAgdGhpcyBkb2VzIG5vdAotICAgICAgZGlzYWJsZSAgdGhlICBpbXByb3ZlbWVudHMgIGludHJvZHVjZWQgIHRvICB0aGUgIGludGVycHJldGVyICBpbgotICAgICAgdmVyc2lvbiAyLjMuMiwgIG9ubHkgc29tZSBpbGwgIGNhc2VzIHRoYXQgb2NjdXJyZWQgIHdpdGggY2VydGFpbgotICAgICAgZm9udHMgKHRob3VnaCBhIGZldyBwb3B1bGFyIG9uZXMpLgotCi0gICAgLSBUaGUgYXV0by1oaW50ZXIgbm93ICBpZ25vcmVzIHNpbmdsZS1wb2ludCBjb250b3VycyBmb3IgY29tcHV0aW5nCi0gICAgICBibHVlIHpvbmVzLiAgIFRoaXMgYnVnICBjcmVhdGVkIGB3YXZ5JyBiYXNlbGluZXMgIHdoZW4gcmVuZGVyaW5nCi0gICAgICB0ZXh0ICB3aXRoICB2YXJpb3VzICBmb250cyAgdGhhdCAgdXNlIHRoZXNlICBjb250b3VycyAgdG8gIG1vZGVsCi0gICAgICBtYXJrLWF0dGFjaCBwb2ludHMgICh0aGVzZSBhcmUgcG9pbnRzIHRoYXQgIGFyZSBuZXZlciByYXN0ZXJpemVkCi0gICAgICBhbmQgYXJlIHBsYWNlZCBvdXRzaWRlIG9mIHRoZSBnbHlwaCdzIHJlYWwgb3V0bGluZSkuCi0KLSAgICAtIFRoZSBgcnNiX2RlbHRhJyBhbmQgYGxzYl9kZWx0YScgZ2x5cGggc2xvdCBmaWVsZHMgYXJlIG5vdyBzZXQgdG8KLSAgICAgIHplcm8gZm9yIG1vbm8tc3BhY2VkIGZvbnRzLiAgT3RoZXJ3aXNlIGNvZGUgdGhhdCB1c2VzIHRoZW0gd291bGQKLSAgICAgIGVzc2VudGlhbGx5IHJ1aW4gdGhlIGZpeGVkLWFkdmFuY2UgcHJvcGVydHkuCi0KLSAgICAtIEZpeCAgQ1ZFLTIwMDctMTM1MSB3aGljaCAgY2FuICBjYXVzZSBhbiAgaW50ZWdlciBvdmVyZmxvdyAgd2hpbGUKLSAgICAgIHBhcnNpbmcgIEJERiBmb250cywgIGxlYWRpbmcgdG8gIGEgcG90ZW50aWFsbHkgIGV4cGxvaXRhYmxlIGhlYXAKLSAgICAgIG92ZXJmbG93IGNvbmRpdGlvbi4KLQotCi0gIElJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIEZpeGVkIGNvbXBpbGF0aW9uIGlzc3VlcyBvbiBzb21lIDY0LWJpdCBwbGF0Zm9ybXMgKHNlZSBDaGFuZ2VMb2cKLSAgICAgIGZvciBkZXRhaWxzKS4KLQotICAgIC0gQSBuZXcgZGVtbyAgcHJvZ3JhbSBgZnRkaWZmJyBoYXMgYmVlbiBhZGRlZCAgdG8gY29tcGFyZSBUcnVlVHlwZQotICAgICAgaGludGluZywgRnJlZVR5cGUncyBhdXRvICBoaW50aW5nLCBhbmQgcmVuZGVyaW5nIHdpdGhvdXQgaGludGluZwotICAgICAgaW4gdGhyZWUgY29sdW1ucy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuMiBhbmQgMi4zLjEKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIEZyZWVUeXBlICByZXR1cm5lZCBpbmNvcnJlY3QgIGtlcm5pbmcgaW5mb3JtYXRpb24gIGZyb20gVHJ1ZVR5cGUKLSAgICAgIGZvbnRzIHdoZW4gdGhlIGJ5dGVjb2RlICBpbnRlcnByZXRlciB3YXMgZW5hYmxlZC4gIFRoaXMgaGFwcGVuZWQKLSAgICAgIGR1ZSB0byBhIHR5cG8gaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDIuMy4wLgotCi0gICAgLSBOZWdhdGl2ZSAga2VybmluZyAgdmFsdWVzICBmcm9tICAgUEZNICBmaWxlcyAgYXJlICBub3cgIHJlcG9ydGVkCi0gICAgICBjb3JyZWN0bHkgICh0aGV5IHdlcmUgcmVhZCAgYXMgMTYtYml0ICB1bnNpZ25lZCB2YWx1ZXMgIGZyb20gdGhlCi0gICAgICBmaWxlKS4KLQotICAgIC0gRml4ZWQgIGEgc21hbGwgIG1lbW9yeSBsZWFrICB3aGVuIGBGVF9Jbml0X0ZyZWVUeXBlJyAgZmFpbGVkIGZvcgotICAgICAgc29tZSByZWFzb24uCi0KLSAgICAtIFRoZSBQb3N0c2NyaXB0IGhpbnRlciBwbGFjZWQgYW5kIHNpemVkIHZlcnkgdGhpbiBhbmQgZ2hvc3Qgc3RlbXMKLSAgICAgIGluY29ycmVjdGx5LgotCi0gICAgLSBUaGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgIGludGVycHJldGVyIGhhcyBiZWVuIGZpeGVkIHRvICBnZXQgcmlkIG9mCi0gICAgICBtb3N0IG9mIHRoZSAgcmFyZSBkaWZmZXJlbmNlcyBzZWVuIGluIGNvbXBhcmlzb24gIHRvIHRoZSBXaW5kb3dzCi0gICAgICBmb250IGxvYWRlci4KLQotCi0gIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwotCi0gICAgLSBUaGUgYXV0by1oaW50ZXIgIG5vdyBiZXR0ZXIgZGVhbHMgIHdpdGggc2VyaWZzIGFuZCAgY29ybmVyIGNhc2VzCi0gICAgICAoZS5nLiwgIGdseXBoICc5JyAgaW4gQXJpYWwgIGF0IDlwdCwgIDk2ZHBpKS4gIEl0ICBhbHNvIGltcHJvdmVzCi0gICAgICBzcGFjaW5nICBhZGp1c3RtZW50cyBhbmQgZG9lc24ndCAgY2hhbmdlIHdpZHRocyAgZm9yIG5vbi1zcGFjaW5nCi0gICAgICBnbHlwaHMuCi0KLSAgICAtIE1hbnkgICBNYWMtc3BlY2lmaWMgICBmdW5jdGlvbnMgICBhcmUgIGRlcHJlY2F0ZWQgICAoYnV0ICAgc3RpbGwKLSAgICAgIGF2YWlsYWJsZSk7ICBtb2Rlcm4gcmVwbGFjZW1lbnRzICBoYXZlIGJlZW4gIHByb3ZpZGVkICBmb3IgdGhlbS4KLSAgICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBpbiBmaWxlIGBmdG1hYy5oJy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuMSBhbmQgMi4zLjAKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIFRoZSBUcnVlVHlwZSBpbnRlcnByZXRlciBzb21ldGltZXMgcmV0dXJuZWQgaW5jb3JyZWN0IGhvcml6b250YWwKLSAgICAgIG1ldHJpY3MgZHVlIHRvIGEgYnVnIGluIHRoZSBoYW5kbGluZyBvZiB0aGUgU0haIGluc3RydWN0aW9uLgotCi0gICAgLSBBIHR5cG8gIGluICBhICBzZWN1cml0eSAgY2hlY2sgIGludHJvZHVjZWQgIGFmdGVyICB2ZXJzaW9uIDIuMi4xCi0gICAgICBwcmV2ZW50ZWQgRnJlZVR5cGUgdG8gcmVuZGVyIHNvbWUgZ2x5cGhzIGluIENGRiBmb250cy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjMuMCBhbmQgMi4yLjEKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIFRoZSAgUENGIGZvbnQgIGxvYWRlciAgaXMgIG5vdyBtdWNoICBtb3JlICByb2J1c3Qgd2hpbGUgIGxvYWRpbmcKLSAgICAgIG1hbGZvcm1lZCBmb250IGZpbGVzLgotCi0gICAgLSBWYXJpb3VzIG1lbW9yeSBsZWFrcyBoYXZlIGJlZW4gZm91bmQgYW5kIGZpeGVkLgotCi0gICAgLSBUaGUgVHJ1ZVR5cGUgbmFtZSBsb2FkZXIgbm93IGRlYWxzIHByb3Blcmx5IHdpdGggc29tZSBmb250cyB0aGF0Ci0gICAgICBlbmNvZGUgdGhlaXIgIG5hbWVzIGluIFVURi0xNiAodGhlIHNwZWNpZmljYXRpb24gIHdhcyB2YWd1ZSwgYW5kCi0gICAgICB0aGUgY29kZSBpbmNvcnJlY3RseSBhc3N1bWVkIFVDUy00KS4KLQotICAgIC0gRml4ZWQgdGhlIFRydWVUeXBlIGJ5dGVjb2RlICBsb2FkZXIgdG8gZGVhbCBwcm9wZXJseSB3aXRoIHN1YnRsZQotICAgICAgbW9ub2Nocm9tZS9ncmF5ICBpc3N1ZXMgIHdoZW4gICBzY2FsaW5nICB0aGUgIENWVC4gICBTb21lICBmb250cwotICAgICAgZXhoaWJpdGVkIGJhZCByZW5kZXJpbmcgYXJ0aWZhY3RzIG90aGVyd2lzZS4KLQotICAgIC0gYEZUX0dseXBoU2xvdF9FbWJvbGRlbicgbm93ICBzdXBwb3J0cyB2ZXJ0aWNhbCBsYXlvdXRzIGNvcnJlY3RseQotICAgICAgKGl0IG1hbmdsZWQgdGhlIHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0KS4KLQotICAgIC0gRml4ZWQgYnl0ZSAgZW5kaWFuIGlzc3VlcyAgb2YgYGZ0bWFjLmMnIHRvICBzdXBwb3J0IE1hYyBPUyAgWCBvbgotICAgICAgaTM4Ni4KLQotICAgIC0gVGhlICBQRlIgIGZvbnQgbG9hZGVyICBubyAgbG9uZ2VyICBlcnJvbmVvdXNseSAgdGFncyBmb250ICBmaWxlcwotICAgICAgd2l0aG91dCBhbnkgb3V0bGluZXMgYXMgRlRfRkFDRV9GTEFHX1NDQUxBQkxFLgotCi0KLSAgSUkuIE5FVyBBUEkgRlVOQ1RJT05TCi0KLSAgICAtIGBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcicgYWxsb3dzIHlvdSAgdG8gc2VsZWN0IGEgc3BlY2lhbCBmaWx0ZXIKLSAgICAgIHRvIGJlICBhcHBsaWVkIHRvIHRoZSBiaXRtYXBzIGdlbmVyYXRlZCAgYnkgYEZUX1JlbmRlcl9HbHlwaCcgaWYKLSAgICAgIG9uZSBvZiB0aGUgRlRfUkVOREVSX01PREVfTENEIGFuZCBGVF9SRU5ERVJfTU9ERV9MQ0RfViBtb2RlcyBoYXMKLSAgICAgIGJlZW4gIHNlbGVjdGVkLiAgVGhpcyBmaWx0ZXIgIGlzIHVzZWQgIHRvIHJlZHVjZSAgY29sb3IgZnJpbmdlczsKLSAgICAgIHNldmVyYWwgIHNldHRpbmdzIGFyZSAgYXZhaWxhYmxlICB0aHJvdWdoIHRoZSAgRlRfTENEX0ZJTFRFUl9YWFgKLSAgICAgIGVudW1lcmF0aW9uLgotCi0gICAgICBJdHMgIGRlY2xhcmF0aW9uICAgYW5kICBkb2N1bWVudGF0aW9uICBjYW4gIGJlICAgZm91bmQgIGluICBmaWxlCi0gICAgICBgaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oJyAgICh0byAgYmUgICBhY2Nlc3NlZCAgIHdpdGggIG1hY3JvCi0gICAgICBGVF9MQ0RfRklMVEVSX0gpLgotCi0gICAgICAqSU1QT1JUQU5UKjogICAgIFRoaXMgICAgICBmdW5jdGlvbiAgICAgcmV0dXJucyAgICAgYW4gICAgIGVycm9yCi0gICAgICAoRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZSkgaW4gZGVmYXVsdCAgYnVpbGRzIG9mIHRoZSBsaWJyYXJ5Ci0gICAgICBmb3IgcGF0ZW50IHJlYXNvbnMuICBTZWUgYmVsb3cuCi0KLSAgICAtIGBGVF9HZXRfR2FzcCcgIGFsbG93cyB5b3UgIHRvIHF1ZXJ5ICB0aGUgZmxhZ3MgIG9mICB0aGUgVHJ1ZVR5cGUKLSAgICAgIGBnYXNwJyB0YWJsZSBmb3IgIGEgZ2l2ZW4gY2hhcmFjdGVyIHBpeGVsIHNpemUuICAgVGhpcyBpcyB1c2VmdWwKLSAgICAgIHRvIGR1cGxpY2F0ZSAgdGhlIHRleHQgcmVuZGVyaW5nICBvZiBNUyBXaW5kb3dzIHdoZW4gIHRoZSBuYXRpdmUKLSAgICAgIGJ5dGVjb2RlICBpbnRlcnByZXRlciBpcyAgZW5hYmxlZCAod2hpY2ggIGlzbid0IHRoZSAgZGVmYXVsdCBmb3IKLSAgICAgIG90aGVyIHBhdGVudCByZWFzb25zKS4KLQotICAgICAgSXRzICBkZWNsYXJhdGlvbiAgIGFuZCAgZG9jdW1lbnRhdGlvbiAgY2FuICBiZSAgIGZvdW5kICBpbiAgZmlsZQotICAgICAgYGluY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmgnICAgKHRvICAgYmUgICBhY2Nlc3NlZCAgIHdpdGggICBtYWNybwotICAgICAgRlRfR0FTUF9IKS4KLQotCi0gIElJSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gVGhlIGF1dG8taGludGVyIGhhcyBiZWVuIHR1bmVkIGEgbG90IHRvIGltcHJvdmUgaXRzIHJlc3VsdHMgd2l0aAotICAgICAgc2VyaWYgZm9udHMsIHJlc3VsdGluZyBpbiBtdWNoIGJldHRlciBmb250IHJlbmRlcmluZyBvZiBtYW55IHdlYgotICAgICAgcGFnZXMuCi0KLSAgICAtIFRoZSB1bnBhdGVudGVkICBoaW50ZXIgaXMgbm93IHBhcnQgIG9mIHRoZSBkZWZhdWx0ICBidWlsZCBvZiB0aGUKLSAgICAgIGxpYnJhcnk7IHdlICBoYXZlIGFkZGVkICBjb2RlIHRvIGF1dG9tYXRpY2FsbHkgIHN1cHBvcnQgYHRyaWNreScKLSAgICAgIGZvbnRzIHRoYXQgbmVlZCBpdC4KLQotICAgICAgVGhpcyBtZWFucyAgdGhhdCBGcmVlVHlwZSBzaG91bGQgYGp1c3Qgd29yaycgIHdpdGggY2VydGFpbiBBc2lhbgotICAgICAgZm9udHMsIGxpa2UgIE1pbmdMaVUsIHdoaWNoIGNhbm5vdCBwcm9wZXJseSBiZSAgbG9hZGVkIHdpdGhvdXQgYQotICAgICAgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIsICBidXQgd2hpY2ggZm9ydHVuYXRlbHkgIGRvIG5vdCB1c2UgIGFueSBvZgotICAgICAgdGhlIHBhdGVudGVkICBieXRlY29kZSBvcGNvZGVzLiAgV2UgZGV0ZWN0IHRoZXNlICBmb250cyBieSBuYW1lLAotICAgICAgc28gcGxlYXNlICByZXBvcnQgYW55IGZvbnQgZmlsZSAgdGhhdCBkb2Vzbid0IHNlZW0gIHRvIHdvcmsgd2l0aAotICAgICAgRnJlZVR5cGUsIGFuZCAgd2Ugc2hhbGwgZG8gd2hhdCB3ZSAgY2FuIHRvIHN1cHBvcnQgaXQgIGluIGEgbmV4dAotICAgICAgcmVsZWFzZS4KLQotICAgICAgTm90ZSAgdGhhdCAgdGhlIEFQSSAgaGFzbid0ICBjaGFuZ2VkLCAgc28gIHlvdSBjYW4gIHN0aWxsICBmb3JjZQotICAgICAgdW5wYXRlbnRlZCBoaW50aW5nIHdpdGggYSBzcGVjaWFsIHBhcmFtZXRlciB0byBgRlRfT3Blbl9GYWNlJyBhcwotICAgICAgd2VsbC4gIFRoaXMgIG1pZ2h0IGJlIHVzZWZ1bCBpbiAgc2FtZSBjYXNlczsgZm9yICBleGFtcGxlLCBhIFBERgotICAgICAgcmVhZGVyIG1pZ2h0IHByZXNlbnQgIGEgdXNlciBvcHRpb24gdG8gYWN0aXZhdGUgIGl0IHRvIGRlYWwgd2l0aAotICAgICAgY2VydGFpbiAgYHRyaWNreScgICBlbWJlZGRlZCAgZm9udHMgIHdoaWNoICAgY2Fubm90ICBiZSAgY2xlYXJseQotICAgICAgaWRlbnRpZmllZC4KLQotICAgICAgSWYgeW91IGFyZSAgYSBkZXZlbG9wZXIgZm9yIGVtYmVkZGVkIHN5c3RlbXMsICB5b3UgbWlnaHQgd2FudCB0bwotICAgICAgKmRpc2FibGUqICB0aGUgICBmZWF0dXJlICB0byAgc2F2ZSAgY29kZSAgIHNwYWNlICBieSAgdW5kZWZpbmluZwotICAgICAgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcgaW4gZmlsZSBgZnRvcHRpb24uaCcuCi0KLSAgICAtIExDRC1vcHRpbWl6ZWQgcmVuZGVyaW5nIGlzIG5vdyAgKmRpc2FibGVkKiBpbiBhbGwgZGVmYXVsdCBidWlsZHMKLSAgICAgIG9mICB0aGUgIGxpYnJhcnksICBtYWlubHkgICBkdWUgIHRvICBwYXRlbnQgIGlzc3Vlcy4gICBGb3IgIG1vcmUKLSAgICAgIGluZm9ybWF0aW9uIHNlZToKLQotICAgICAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLzIwMDYtMDkvbXNnMDAwNjQuaHRtbAotCi0gICAgICBBICBuZXcgIGNvbmZpZ3VyYXRpb24gbWFjcm8gIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HCi0gICAgICBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluICBgZnRvcHRpb24uaCc7IG1hbnVhbGx5IGRlZmluZSBpdCBpbiB0aGlzCi0gICAgICBmaWxlIGlmIHlvdSB3YW50IHRvIHJlLWVuYWJsZSB0aGUgZmVhdHVyZS4KLQotICAgICAgVGhlICBjaGFuZ2Ugb25seSAgYWZmZWN0cyB0aGUgIGltcGxlbWVudGF0aW9uLCBub3QgIHRoZSBGcmVlVHlwZQotICAgICAgQVBJLiAgVGhpcyBtZWFucyB0aGF0IGNsaWVudHMgZG9uJ3QgbmVlZCB0byBiZSBtb2RpZmllZCwgYmVjYXVzZQotICAgICAgdGhlIGxpYnJhcnkgc3RpbGwgZ2VuZXJhdGVzICBMQ0QgZGVjaW1hdGVkIGJpdG1hcHMsIGJ1dCB3aXRoIHRoZQotICAgICAgYWRkZWQgY29uc3RyYWludCB0aGF0IFI9Rz1CIG9uIGVhY2ggdHJpcGxldC4KLQotICAgICAgVGhlICBkaXNwbGF5ZWQgcmVzdWx0ICBzaG91bGQgIGJlIGVxdWFsICB0byBub3JtYWwgIGFudGktYWxpYXNlZAotICAgICAgcmVuZGVyaW5nLgotCi0gICAgICBBZGRpdGlvbmFsbHksICBpZiAgIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICBpcyAgbm90Ci0gICAgICBkZWZpbmVkLCB0aGUgbmV3ICBgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXInIGZ1bmN0aW9uIHJldHVybnMgdGhlCi0gICAgICBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlIGVycm9yIGNvZGUuCi0KLSAgICAtIFNvbWUgY29tcHV0YXRpb24gYnVncyBpbiAgdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIHdlcmUKLSAgICAgIGZvdW5kLCAgd2hpY2ggIGFsbG93IHVzICB0byAgZ2V0IHJpZCAgb2YgIHZlcnkgIHN1YnRsZSBhbmQgIHJhcmUKLSAgICAgIGRpZmZlcmVuY2VzIHdlIGhhZCBleHBlcmllbmNlZCB3aXRoIHRoZSBXaW5kb3dzIHJlbmRlcmVyLgotCi0gICAgLSBJdCBpcyBub3cgcG9zc2libGUgdG8gY3Jvc3MtY29tcGlsZSB0aGUgbGlicmFyeSBlYXNpbHkuICBTZWUgdGhlCi0gICAgICBmaWxlIGBkb2NzL0lOU1RBTEwuQ1JPU1MnIGZvciBkZXRhaWxzLgotCi0gICAgLSBUaGUgZmlsZSBgc3JjL2Jhc2UvZnRtYWMuYycgbm93IGNvbnRhaW5zIGNvZGUgZm9yIE1hYyBPUyBYIG9ubHk7Ci0gICAgICBpdHMgIGRlcHJlY2F0ZWQgZnVuY3Rpb24gIGBGVF9HZXRGaWxlX0Zyb21fTWFjX0ZvbnRfTmFtZScgYWx3YXlzCi0gICAgICByZXR1cm5zIGFuICBlcnJvciBldmVuIGlmIHRoZSBRdWlja0RyYXcgIGZyYW1ld29yayBpcyBhdmFpbGFibGUuCi0gICAgICBUaGUgcHJldmlvdXMgdmVyc2lvbiBoYXMgYmVlbiBtb3ZlZCB0byBgYnVpbGRzL21hYy9mdG1hYy5jJy4KLQotICAgICAgU2VsZWN0aW5nICBjb25maWd1cmUgb3B0aW9uIGAtLXdpdGgtcXVpY2tkcmF3LWNhcmJvbicgIG1ha2VzIHRoZQotICAgICAgYnVpbGQgcHJvY2VzcyB1c2UgdGhlIG9yaWdpbmFsIGBmdG1hYy5jJyBmaWxlIGluc3RlYWQgb2YgdGhlIE1hYwotICAgICAgT1MgWC1vbmx5IHZlcnNpb24uCi0KLQotICBJVi4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBWYXJpb3VzIHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgZm9vdHByaW50IG9wdGltaXphdGlvbnMgaGF2ZSBiZWVuCi0gICAgICBwZXJmb3JtZWQgb24gIHRoZSBUcnVlVHlwZSBhbmQgQ0ZGIGZvbnQgIGxvYWRlcnMsIHNvbWV0aW1lcyB3aXRoCi0gICAgICB2ZXJ5IGRyYXN0aWMgIGJlbmVmaXRzIChlLmcuLCB0aGUgIFRydWVUeXBlIGxvYWRlciBpcyAgbm93IGFib3V0Ci0gICAgICAyNSUgZmFzdGVyOyAgRnJlZVR5cGUgc2hvdWxkIHVzZSAgbGVzcyBoZWFwIG1lbW9yeSAgdW5kZXIgbmVhcmx5Ci0gICAgICBhbGwgY29uZGl0aW9ucykuCi0KLSAgICAtIFRoZSBhbnRpLWFsaWFzZWQgcmFzdGVyaXplciBoYXMgYmVlbiBvcHRpbWl6ZWQgYW5kIGlzIG5vdyAxNSUgdG8KLSAgICAgIDI1JSAgcGVyY2VudCAgZmFzdGVyIHRoYW4gIGluICBwcmV2aW91cyAgdmVyc2lvbnMsIGRlcGVuZGluZyAgb24KLSAgICAgIGNvbnRlbnQuCi0KLSAgICAtIFRoZSBUeXBlIDEgbG9hZGVyIGhhcyBiZWVuIGltcHJvdmVkOyBhcyBhbiBleGFtcGxlLCBpdCBub3cgc2tpcHMKLSAgICAgIHRvcC1sZXZlbCBkaWN0aW9uYXJpZXMgcHJvcGVybHkuCi0KLSAgICAtIEJldHRlciBzdXBwb3J0IGZvciBNYWMgIGZvbnRzIG9uIFBPU0lYIHN5c3RlbXMsIHBsdXMgY29tcGlsYXRpb24KLSAgICAgIGZpeGVzIGZvciBNYWMgT1MgWCBvbiBwcGM2NCB3aGVyZSBgZnRtYWMuYycgY2Fubm90IGJlIGJ1aWx0LgotCi0gICAgLSBDb25maWd1cmF0aW9uICB3aXRob3V0IGAtLXdpdGgtb2xkLW1hYy1mb250cycgIGRvZXMgIG5vdCBpbmNsdWRlCi0gICAgICBgZnRtYWMuYycgKHRoaXMgd2FzIHRoZSBiZWhhdmlvdXIgaW4gRnJlZVR5cGUgdmVyc2lvbiAyLjEuMTApLgotCi0gICAgLSBUaGUgVHJ1ZVR5cGVHWCB2YWxpZGF0b3IgKGd4dmFsaWQpIGNoZWNrcyB0aGUgb3JkZXIgb2YgZ2x5cGggSURzCi0gICAgICBpbiB0aGUga2VybiB0YWJsZS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjIuMSBhbmQgMi4yCi0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBWYXJpb3VzIGludGVnZXIgb3ZlcmZsb3dzIGhhdmUgYmVlbiBmaXhlZC4KLQotICAgIC0gUEZCIGZvbnRzIHdpdGggTWFjT1MgcmVzb3VyY2UgZm9yayB3ZXJlbid0ICBoYW5kbGVkIGNvcnJlY3RseSBvbgotICAgICAgbm9uLU1hY09TIHBsYXRmb3Jtcy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjIgYW5kIDIuMS4xMAotCi0obm90IHJlbGVhc2VkIG9mZmljaWFsbHkpCi0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBWZXJ0aWNhbCBtZXRyaWNzIGZvciBTRk5UIGZvbnRzIHdlcmUgaW5jb3JyZWN0IHNvbWV0aW1lcy4KLQotICAgIC0gVGhlIEZUX0hBU19LRVJOSU5HIG1hY3JvIGFsd2F5cyByZXR1cm5lZCAwLgotCi0gICAgLSBDRkYgT3BlblR5cGUgIGZvbnRzIGRpZG4ndCAgcmV0dXJuIGNvcnJlY3QgdmVydGljYWwgIG1ldHJpY3MgZm9yCi0gICAgICBnbHlwaHMgd2l0aCBvdXRsaW5lcy4KLQotICAgIC0gSWYgRnJlZVR5cGUgd2FzIGNvbXBpbGVkIHdpdGhvdXQgaGludGVycywgYWxsIGZvbnQgZm9ybWF0cyBiYXNlZAotICAgICAgb24gUFMgb3V0bGluZXMgd2VyZW4ndCBzY2FsZWQgY29ycmVjdGx5LgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIFZlcnNpb24gMi4yIG5vIGxvbmdlciBleHBvc2VzIGl0cyBpbnRlcm5hbHMsIHRoaXMgaXMsIHRoZSBoZWFkZXIKLSAgICAgIGZpbGVzICBsb2NhdGVkIGluICB0aGUgYGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwnICBkaXJlY3Rvcnkgb2YKLSAgICAgIHRoZSBzb3VyY2UgcGFja2FnZSBhcmUgbm90ICBjb3BpZWQgYW55bW9yZSBieSB0aGUgYG1ha2UgaW5zdGFsbCcKLSAgICAgIGNvbW1hbmQuICBDb25zZXF1ZW50bHksIGEgbnVtYmVyIG9mIHJvZ3VlIGNsaWVudHMgd2hpY2ggZGlyZWN0bHkKLSAgICAgIGFjY2VzcyAgRnJlZVR5cGUncyAgaW50ZXJuYWwgICBmdW5jdGlvbnMgIGFuZCAgc3RydWN0dXJlcyAgd29uJ3QKLSAgICAgIGNvbXBpbGUgd2l0aG91dCBtb2RpZmljYXRpb24uCi0KLSAgICAgIFdlIHByb3ZpZGUgIHBhdGNoZXMgZm9yICBtb3N0IG9mIHRob3NlICByb2d1ZSBjbGllbnRzLiAgIFNlZSB0aGUKLSAgICAgIGZvbGxvd2luZyBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uOgotCi0gICAgICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2ZyZWV0eXBlMi9wYXRjaGVzL3JvZ3VlLXBhdGNoZXMuaHRtbAotCi0gICAgICBOb3RlIHRoYXQsIGFzICBhIGNvbnZlbmllbmNlIHRvIG91ciBVbml4ICBkZXNrdG9wIHVzZXJzLCB2ZXJzaW9uCi0gICAgICAyLjIgaXMgKmJpbmFyeSogY29tcGF0aWJsZSB3aXRoIEZyZWVUeXBlIDIuMS43LCB3aGljaCBtZWFucyB0aGF0Ci0gICAgICBpbnN0YWxsaW5nIHRoaXMgIHJlbGVhc2Ugb24gIGFuIGV4aXN0aW5nIGRpc3RyaWJ1dGlvbiAgc2hhbGwgbm90Ci0gICAgICBicmVhayBhbnkgd29ya2luZyBkZXNrdG9wLgotCi0gICAgLSBGcmVlVHlwZSdzIGJ1aWxkICBtZWNoYW5pc20gaGFzIGJlZW4gcmVkZXNpZ25lZC4gICBXaXRoIEdOVSBtYWtlCi0gICAgICBpdCAgaXMgIG5vdyAgc3VmZmljaWVudCAgaW4gICBtb3N0ICBjYXNlcyAgdG8gIGVkaXQgIHR3byAgZmlsZXM6Ci0gICAgICBgbW9kdWxlcy5jZmcnLCAgdG8gIHNlbGVjdCAgIHRoZSAgbGlicmFyeSAgY29tcG9uZW50cywgIGFuZCAgdGhlCi0gICAgICBjb25maWd1cmF0aW9uICBmaWxlICBgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCcgKHdoaWNoCi0gICAgICBjYW4gYmUgY29waWVkIHRvIHRoZSBvYmplY3RzIGRpcmVjdG9yeSkuICBSZW1vdmluZyB1bnVzZWQgbW9kdWxlCi0gICAgICBkaXJlY3RvcmllcyAgIHRvICAgIHByZXZlbnQgICBpdHMgICBjb21waWxhdGlvbiAgICBhbmQgICBlZGl0aW5nCi0gICAgICBgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCcgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KLQotICAgIC0gVGhlICBMSUdIVCAgaGludGluZyBhbGdvcml0aG0gIHByb2R1Y2VzICBtb3JlIHBsZWFzYW50ICByZXN1bHRzLgotICAgICAgQWxzbywgdXNpbmcgdGhlICBGVF9MT0FEX1RBUkdFVF9MSUdIVCBmbGFncyB3aXRoaW4gRlRfTG9hZF9HbHlwaAotICAgICAgYWx3YXlzIGZvcmNlcyBhdXRvLWhpbnRpbmcsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24uICBUaGlzIGFsbG93cwotICAgICAgeW91IHRvIGV4cGVyaW1lbnQgd2l0aCBpdCAgZXZlbiBpZiB5b3UgaGF2ZSBlbmFibGVkIHRoZSBUcnVlVHlwZQotICAgICAgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaW4geW91ciBidWlsZC4KLQotICAgIC0gVGhlIGF1dG8gaGludGVyIG5vdyBlbXBsb3lzIGEgbmV3IGFsZ29yaXRobSBmb3IgQ0pLIGZvbnRzLCBiYXNlZAotICAgICAgb24gQWtpdG8gIEhpcmFpJ3MgcGF0Y2guICAgTm90ZSB0aGF0IHRoaXMgIG9ubHkgd29ya3MgIGZvciBmb250cwotICAgICAgd2l0aCBhIFVuaWNvZGUgY2hhcm1hcCBhdCB0aGUgbW9tZW50LgotCi0gICAgLSBUaGUgZm9sbG93aW5nIGNhbGxiYWNrIGZ1bmN0aW9uICB0eXBlcyBoYXZlIGNoYW5nZWQgc2xpZ2h0bHkgKGJ5Ci0gICAgICBhZGRpbmcgdGhlIGBjb25zdCcga2V5d29yZCB3aGVyZSBhcHByb3ByaWF0ZSk6Ci0KLSAgICAgICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jCi0gICAgICAgIEZUX091dGxpbmVfTGluZVRvRnVuYwotICAgICAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jCi0gICAgICAgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMKLSAgICAgICAgRlRfU3BhbkZ1bmMKLSAgICAgICAgRlRfUmFzdGVyX1JlbmRlckZ1bmMKLQotICAgICAgICBGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jCi0gICAgICAgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMKLSAgICAgICAgRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYwotCi0gICAgICBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFmZmVjdCBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQotICAgIC0gT24gTWFjT1MsICBuZXcgQVBJcyBoYXZlICBiZWVuIGFkZGVkIGFzIHJlcGxhY2VtZW50cyAgZm9yIGxlZ2FjeQotICAgICAgQVBJczogIGBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmJyAgZm9yICBgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMnLAotICAgICAgYW5kICAgICAgICAgICAgICBgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZScgICAgICAgICAgICAgIGZvcgotICAgICAgYEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZScuICBMZWdhY3kgQVBJcyBhcmUgc3RpbGwgYXZhaWxhYmxlLCBpZgotICAgICAgRnJlZVR5cGUgaXMgYnVpbHQgd2l0aG91dCBkaXNhYmxpbmcgdGhlbS4KLQotICAgIC0gQSBuZXcgIEFQSSBgRlRfU2VsZWN0X1NpemUnICBoYXMgYmVlbiBhZGRlZCAgdG8gc2VsZWN0ICBhIGJpdG1hcAotICAgICAgc3RyaWtlICBieSBpdHMgIGluZGV4LiAgIENvZGUgdXNpbmcgIG90aGVyICBmdW5jdGlvbnMgdG8gIHNlbGVjdAotICAgICAgYml0bWFwIHN0cmlrZXMgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uCi0KLSAgICAtIEEgIG5ldyBBUEkgIGBGVF9HZXRfU3ViR2x5cGhfSW5mbycgIGhhcyBiZWVuICBhZGRlZCB0byAgcmV0cmlldmUKLSAgICAgIHN1YmdseXBoIGRhdGEuICBUaGlzIGNhbiBiZSAgdXNlZCBieSByb2d1ZSBjbGllbnRzIHdoaWNoIHVzZWQgdG8KLSAgICAgIGFjY2VzcyB0aGUgaW50ZXJuYWwgaGVhZGVycyB0byBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YS4KLQotICAgIC0gSW4gMi4xLjEwLCB0aGUgYmVoYXZpb3VyIG9mIGBGVF9TZXRfUGl4ZWxfU2l6ZXMnIHdhcyBjaGFuZ2VkIGZvcgotICAgICAgQkRGL1BDRiBmb250cywgIGFuZCBvbmx5ICBmb3IgdGhlbS4gIFRoaXMgIGNhdXNlcyBpbmNvbnNpc3RlbmN5LgotICAgICAgSW4gdGhpcyByZWxlYXNlLCAgd2UgdW5kbyB0aGUgY2hhbmdlLiAgVGhlICBpbnRlbnQgb2YgdGhlIGNoYW5nZQotICAgICAgaW4gMi4xLjEwICBpcyB0byBhbGxvdyAgc2l6ZSBzZWxlY3Rpb24gdGhyb3VnaCAgcmVhbCBkaW1lbnNpb25zLAotICAgICAgd2hpY2ggY2FuIG5vdyBiZSBkb25lIHRocm91Z2ggYEZUX1JlcXVlc3RfU2l6ZScuCi0KLSAgICAtIFNvbWUgc2VjdXJpdHkgIGlzc3VlcyB3ZXJlIGRpc2NvdmVyZWQgIGFuZCBmaXhlZCBpbiB0aGUgIENGRiBhbmQKLSAgICAgIFR5cGUgIDEgbG9hZGVyLCBjYXVzaW5nICBjcmFzaGVzIG9mICBGcmVlVHlwZSBieSAgbWFsZm9ybWVkIGZvbnQKLSAgICAgIGZpbGVzLgotCi0KLSAgSUlJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIFRoZSBkb2N1bWVudGF0aW9uICBmb3IgRlRfTE9BRF9UQVJHRVRfWFhYIGFuZCBGVF9SRU5ERVJfTU9ERV9YWFgKLSAgICAgIHZhbHVlcyBub3cgYmV0dGVyIHJlZmxlY3RzIGl0cyB1c2FnZSBhbmQgZGlmZmVyZW5jZXM6IE9uZSBzZXQgaXMKLSAgICAgIHVzZWQgdG8gc3BlY2lmeSB0aGUgaGludGluZyBhbGdvcml0aG0sIHRoZSBvdGhlciB0byBzcGVjaWZ5ICB0aGUKLSAgICAgIHBpeGVsIHJlbmRlcmluZyBtb2RlLgotCi0gICAgLSBgRlRfTmV3X0ZhY2UnIGFuZCBgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMnIGluIGZ0bWFjLmMgaGF2ZSBiZWVuCi0gICAgICBjaGFuZ2VkIHRvIGNvdW50IHN1cHBvcnRlZCBzY2FsYWJsZSBmYWNlcyAoc2ZudCwgTFdGTikgb25seSwgYW5kCi0gICAgICB0byAgcmV0dXJuIHRoZSAgbnVtYmVyIG9mICBhdmFpbGFibGUgZmFjZXMgIHZpYSBmYWNlLT5udW1fZmFjZXMuCi0gICAgICBVbnN1cHBvcnRlZCBiaXRtYXAgZmFjZXMgKGZiaXQsIE5GTlQpIGFyZSBpZ25vcmVkLgotCi0gICAgLSBidWlsZHMvdW5peC9jb25maWd1cmUgIGhhcyBiZWVuICBpbXByb3ZlZCBmb3IgIE1hY09TIFguICAgSXQgbm93Ci0gICAgICBhdXRvbWF0aWNhbGx5IGNoZWNrcyBhdmFpbGFibGUgIGZ1bmN0aW9ucyBpbiBDYXJib24gbGlicmFyeSwgYW5kCi0gICAgICBwcmVwYXJlIHRvIHVzZSBuZXdlc3QgIGZ1bmN0aW9ucyBieSBkZWZhdWx0LiAgT3B0aW9ucyB0byBzcGVjaWZ5Ci0gICAgICB0aGUgIGRlcGVuZGVuY2llcyBvZiAgZWFjaCBDYXJib24gIEFQSXMgKEZTU3BlYywgIEZTUmVmLCBvbGQvbmV3Ci0gICAgICBRdWlja0RyYXcsIEFUUykgIGFyZSBhdmFpbGFibGUgdG9vLiAgQnkgbWFudWFsICBkaXNhYmxpbmcgb2YgYWxsCi0gICAgICBRdWlja0RyYXcgICBmdW5jdGlvbmFsaXR5LCAgRnJlZVR5cGUgICBjYW4gICBiZSAgYnVpbHQgICB3aXRob3V0Ci0gICAgICBgZGVwcmVjYXRlZCAgIGZ1bmN0aW9uJyAgIHdhcm5pbmdzICAgIG9uICAgTWFjT1MgICAxMC40LngsICAgYnV0Ci0gICAgICBGVF9HZXRGaWxlX01hY19OYW1lICBpbiAgZnRtYWMuYyAgdGhlbiAgaXMgY2hhbmdlZCAgdG8gIGEgIGR1bW15Ci0gICAgICBmdW5jdGlvbiwgYW5kIHJldHVybnMgYW4gYHVuaW1wbGVtZW50ZWQnIGVycm9yLiAgRm9yIGRldGFpbHMgc2VlCi0gICAgICBidWlsZHMvbWFjL1JFQURNRS4KLQotICAgIC0gU0ZOVCBjbWFwIGhhbmRsaW5nIGhhcyBiZWVuICBpbXByb3ZlZCwgbWFpbmx5IHRvIHJ1biBtdWNoIGZhc3RlcgotICAgICAgd2l0aCBDSksgZm9udHMuCi0KLSAgICAtIEEgICBuZXcgIGZ1bmN0aW9uICAgYEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSAgIChkZWNsYXJlZCAgaW4KLSAgICAgIGBGVF9NT0RVTEVfSCcpICBpcyAgcHJvdmlkZWQgIHRvICBkZXRlcm1pbmUgdGhlICBzdGF0dXMgIG9mICB0aGUKLSAgICAgIFRydWVUeXBlICAgYnl0ZWNvZGUgIGludGVycHJldGVyICAgY29tcGlsZWQgIGludG8gICB0aGUgIGxpYnJhcnkKLSAgICAgIChwYXRlbnRlZCwgdW5wYXRlbnRlZCwgdW5pbXBsZW1lbnRlZCkuCi0KLSAgICAtIFZlcnRpY2FsIG1ldHJpY3Mgb2YgZ2x5cGhzIGFyZSAgc3ludGhlc2l6ZWQgaWYgdGhlIGZvbnQgZG9lcyBub3QKLSAgICAgIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4gIFlvdSBjYW4gdGVsbCB3aGV0aGVyICB0aGUgbWV0cmljcyBhcmUKLSAgICAgIHN5bnRoZXNpemVkIG9yIG5vdCBieSBjaGVja2luZyB0aGUgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMIGZsYWcgb2YKLSAgICAgIHRoZSBmYWNlLgotCi0gICAgLSBUaGUgZGVtbyBwcm9ncmFtcyAgYGZ0dmlldycgYW5kICBgZnRzdHJpbmcnIGhhdmUgYmVlbiAgcmV3cml0dGVuCi0gICAgICBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LiAgIGBmdHZpZXcnIGhhcyBhIG5ldyBzd2l0Y2ggYC1wJyB0byB0ZXN0Ci0gICAgICBGVF9OZXdfTWVtb3J5X0ZhY2UgKGluc3RlYWQgb2YgRlRfTmV3X0ZhY2UpLgotCi0gICAgLSBGcmVlVHlwZSBub3cgaG9ub3VycyBiaXQgMSBpbiB0aGUgYGhlYWQnIHRhYmxlIG9mIFRydWVUeXBlIGZvbnRzCi0gICAgICAobWVhbmluZyBgbGVmdCBzaWRlYmVhcmluZyBwb2ludCBhdCB4PTAnKS4gIFRoaXMgaGVscHMgd2l0aCBzb21lCi0gICAgICBidWdneSBmb250cy4KLQotICAgIC0gUnVkaW1lbnRhcnkgc3VwcG9ydCBmb3IgQWRvYmUncyBuZXcgYFNJTkcgR2x5cGhsZXQnIGZvcm1hdC4gIFNlZQotCi0gICAgICAgIGh0dHA6Ly93d3cuYWRvYmUuY29tL3Byb2R1Y3RzL2luZGVzaWduL3NpbmdfZ2FpamkuaHRtbAotCi0gICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgIC0gVGhlIGBmdGR1bXAnICBwcm9ncmFtIGZyb20gdGhlIGBmdDJkZW1vcycgYnVuZGxlICBub3cgc2hvd3Mgc29tZQotICAgICAgaW5mb3JtYXRpb24gYWJvdXQgY2hhcm1hcHMuICBJdCAgYWxzbyBzdXBwb3J0cyBhIG5ldyBzd2l0Y2ggYC12JwotICAgICAgdG8gaW5jcmVhc2UgdmVyYm9zaXR5LgotCi0gICAgLSBCZXR0ZXIgQUZNIHN1cHBvcnQuICBUaGlzIGluY2x1ZGVzIHRyYWNrIGtlcm5pbmcgc3VwcG9ydC4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjEuMTAgYW5kIDIuMS45Ci0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBUaGUgc2l6ZSBjb21wYXJpc29uIGZvciBCREYgYW5kIFBDRiBmaWxlcyBjb3VsZCBmYWlsIHNvbWV0aW1lcy4KLQotICAgIC0gU29tZSAgQ0ZGIGZpbGVzICB3ZXJlIHN0aWxsIG5vdCAgbG9hZGVkICBjb3JyZWN0bHkuICAgUGF0Y2ggZnJvbQotICAgICAgRGVyZWsgTm9vbmJ1cmcuCi0KLSAgICAtIFRoZSBzdHJva2VyIHN0aWxsIGhhZCBzb21lIHNlcmlvdXMgYnVncy4KLQotICAgIC0gQm9yaXMgIExldG9jaGEgIGZpeGVkIGEgIGJ1ZyBpbiAgdGhlICBUcnVlVHlwZSBpbnRlcnByZXRlcjogIFRoZQotICAgICAgTlBVU0hXIGluc3RydWN0aW9uIHdhc24ndCBza2lwcGVkIGNvcnJlY3RseSBpbiBJRiBjbGF1c2VzLiAgU29tZQotICAgICAgZm9udHMgbGlrZSBgSGVsdmV0aWNhIDc1IEJvbGQnIGZhaWxlZC4KLQotICAgIC0gQW5vdGhlciAgc2VyaW91cyAgYnVnICBpbiAgaGFuZGxpbmcgIFRydWVUeXBlIGhpbnRzICBjYXVzZWQgbWFueQotICAgICAgZGlzdG9ydGlvbnMuICBJdCBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMi4xLjgsIGFuZCBpdCBpcwotICAgICAgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVwZ3JhZGUuCi0KLSAgICAtIEZyZWVUeXBlIGRpZG4ndCBwcm9wZXJseSBwYXJzZSBlbXB0eSBUeXBlIDEgZ2x5cGhzLgotCi0gICAgLSBBbiB1bmJvdW5kIGR5bmFtaWMgYnVmZmVyIGdyb3d0aCB3YXMgZml4ZWQgaW4gdGhlIFBGUiBsb2FkZXIuCi0KLSAgICAtIFNldmVyYWwgYnVncyBoYXZlIGJlZW4gZml4ZWQgaW4gdGhlIGNhY2hlIHN1Yi1zeXN0ZW0uCi0KLSAgICAtIEZyZWVUeXBlIGJlaGF2ZWQgaW5jb3JyZWN0bHkgd2hlbiByZXNpemluZyB0d28gZGlzdGluY3QgYnV0IHZlcnkKLSAgICAgIGNsb3NlIGNoYXJhY3RlciBwaXhlbCBzaXplcyB0aHJvdWdoIGBGVF9TZXRfQ2hhcl9TaXplJyAoU2F2YW5uYWgKLSAgICAgIGJ1ZyAjMTIyNjMpLgotCi0gICAgLSBUaGUgYXV0by1oaW50ZXIgZGlkbid0IHdvcmsgcHJvcGVybHkgZm9yIGZvbnRzIHdpdGhvdXQgYSBVbmljb2RlCi0gICAgICBjaGFybWFwIC0tIGl0IGV2ZW4gcmVmdXNlZCB0byBsb2FkIHRoZSBnbHlwaHMuCi0KLQotICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gTWFueSBmaXhlcyBoYXZlIGJlZW4gYXBwbGllZCB0byBkcmFzdGljYWxseSByZWR1Y2UgdGhlIGFtb3VudCBvZgotICAgICAgaGVhcCAgIG1lbW9yeSAgIHVzZWQgICBieSAgIEZyZWVUeXBlLCAgIGVzcGVjaWFsbHkgICB3aGVuICB1c2luZwotICAgICAgbWVtb3J5LW1hcHBlZCBmb250IGZpbGVzICAod2hpY2ggaXMgdGhlIGRlZmF1bHQgb24gVW5peCAgc3lzdGVtcwotICAgICAgd2hpY2ggc3VwcG9ydCB0aGVtKS4KLQotICAgIC0gVGhlIGF1dG8taGludGVyICBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGEgbmV3IG1vZHVsZSwgY2FsbGVkIHRoZQotICAgICAgYGF1dG8tZml0dGVyJy4gIEl0IGNvbnN1bWVzICBsZXNzIG1lbW9yeSAgdGhhbiBpdHMgIHByZWRlY2Vzc29yLAotICAgICAgYW5kIGl0IGlzICBwcmVwYXJlZCB0byBzdXBwb3J0IG5vbi1sYXRpbiBzY3JpcHRzICBiZXR0ZXIgaW4gbmV4dAotICAgICAgcmVsZWFzZXMuCi0KLSAgICAtIEdlb3JnZSBXaWxsaWFtcyAgY29udHJpYnV0ZWQgY29kZSB0byByZWFkICBrZXJuaW5nIGRhdGEgZnJvbSBQRk0KLSAgICAgIGZpbGVzLgotCi0gICAgLSBGcmVlVHlwZSAgIG5vdyAgIHVzZXMgICAgdGhlICAgVFRfTkFNRV9JRF9QUkVGRVJSRURfRkFNSUxZICAgYW5kCi0gICAgICBUVF9OQU1FX0lEX1BSRUZFUlJFRF9TVUJGQU1JTFkgICBzdHJpbmdzICAgKGlmICAgYXZhaWxhYmxlKSAgZm9yCi0gICAgICBzZXR0aW5nICBmYW1pbHkgIGFuZCAgc3R5bGUgaW4gU0ZOVCAgZm9udHMgIChwYXRjaCBmcm9tIEtvcm5mZWxkCi0gICAgICBFbGl5YWh1IFBldGVyKS4KLQotICAgIC0gQSAgbmV3ICBBUEkgYEZUX1NmbnRfVGFibGVfSW5mbycgIChpbiBGVF9UUlVFVFlQRV9UQUJMRVNfSCkgIGhhcwotICAgICAgYmVlbiBhZGRlZCB0byByZXRyaWV2ZSBuYW1lIGFuZCBzaXplIGluZm9ybWF0aW9uIG9mIFNGTlQgdGFibGVzLgotCi0gICAgLSBBIG5ldyBBUEkgYEZUX09wZW5UeXBlX1ZhbGlkYXRlJyAoaW4gRlRfT1BFTlRZUEVfVkFMSURBVEVfSCkgaGFzCi0gICAgICBiZWVuIGFkZGVkIHRvIHZhbGlkYXRlIE9wZW5UeXBlIHRhYmxlcyAgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsCi0gICAgICBKU1RGKS4gICBBZnRlciB2YWxpZGF0aW9uICBpdCBpcyAgbm8gbG9uZ2VyICBuZWNlc3NhcnkgdG8gIGNoZWNrCi0gICAgICBmb3IgZXJyb3JzIGluIHRob3NlIHRhYmxlcyB3aGlsZSBhY2Nlc3NpbmcgdGhlbS4KLQotICAgICAgTm90ZSB0aGF0ICB0aGlzIG1vZHVsZSBtaWdodCAgYmUgbW92ZWQgdG8gYW5vdGhlciBsaWJyYXJ5IGluIHRoZQotICAgICAgZnV0dXJlICB0byBhdm9pZCAgYSB0aWdodCAgZGVwZW5kZW5jeSBiZXR3ZWVuICBGcmVlVHlwZSBhbmQgIHRoZQotICAgICAgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4KLQotICAgIC0gQSBuZXcgQVBJIGluIEZUX0JJVE1BUF9IICAoYEZUX0JpdG1hcF9OZXcnLCBgRlRfQml0bWFwX0NvbnZlcnQnLAotICAgICAgYEZUX0JpdG1hcF9Db3B5JywgIGBGVF9CaXRtYXBfRW1ib2xkZW4nLCAgYEZUX0JpdG1hcF9Eb25lJykgIGhhcwotICAgICAgYmVlbiBhZGRlZC4gICBJdHMgIHVzZSBpcyAgdG8gY29udmVydCBhbiAgRlRfQml0bWFwIHN0cnVjdHVyZSBpbgotICAgICAgMWJwcCwgMmJwcCwgIDRicHAsIG9yIDhicHAgIGZvcm1hdCBpbnRvICBhbm90aGVyIDhicHAgRlRfQml0bWFwLAotICAgICAgcHJvYmFibHkgdXNpbmcgYSBkaWZmZXJlbnQgcGl0Y2gsIGFuZCB0byBmdXJ0aGVyIG1hbmlwdWxhdGUgaXQuCi0KLSAgICAtIEEgbmV3ICBBUEkgYEZUX091dGxpbmVfRW1ib2xkZW4nICAoaW4gRlRfT1VUTElORV9IKSBnaXZlcyAgZmluZXIKLSAgICAgIGNvbnRyb2wgaG93IG91dGxpbmVzIGFyZSBlbWJvbGRlbmVkLgotCi0gICAgLSBgRlRfR2x5cGhTbG90X0VtYm9sZGVuJyAoaW4gRlRfU1lOVEhFU0lTX0gpICBub3cgaGFuZGxlcyBiaXRtYXBzCi0gICAgICBhbHNvIChjb2RlIGNvbnRyaWJ1dGVkICBieSBDaGlhIEkgV3UpLiAgTm90ZSB0aGF0IHRoaXMgIGZ1bmN0aW9uCi0gICAgICBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIG1heSBiZSByZXBsYWNlZCB3aXRoIGEgYmV0dGVyIEFQSS4KLQotICAgIC0gVGhlIG1ldGhvZCAgaG93IEJERiBhbmQgUENGICBiaXRtYXAgZm9udHMgIGFyZSBhY2Nlc3NlZCBoYXMgYmVlbgotICAgICAgcmVmaW5lZC4gICBGb3JtZXJseSwgICBGVF9TZXRfUGl4ZWxfU2l6ZXMgIGFuZCAgRlRfU2V0X0NoYXJfU2l6ZQotICAgICAgd2VyZSAgc3lub255bXMgaW4gIEZyZWVUeXBlJ3MgIEJERiBhbmQgUENGIGludGVyZmFjZS4gIFRoaXMgIGhhcwotICAgICAgY2hhbmdlZCBub3cuICBGVF9TZXRfUGl4ZWxfU2l6ZXMgIHNob3VsZCBiZSAgdXNlZCB0byAgc2VsZWN0IHRoZQotICAgICAgYWN0dWFsICBmb250IGRpbWVuc2lvbnMgICh0aGUgYHN0cmlrZScsICB3aGljaCBpcyB0aGUgc3VtIG9mIHRoZQotICAgICAgYEZPTlRfQVNDRU5UJyAgICBhbmQgICAgYEZPTlRfREVTQ0VOVCcgICAgcHJvcGVydGllcyksICAgICB3aGlsZQotICAgICAgRlRfU2V0X0NoYXJfU2l6ZSAgc2VsZWN0cyAgdGhlICBgbm9taW5hbCcgc2l6ZSAgKHRoZSBgUElYRUxTSVpFJwotICAgICAgcHJvcGVydHkpLiAgSW4gYm90aCBmdW5jdGlvbnMsIHRoZSB3aWR0aCBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBUaGUgQkRGIGRyaXZlciAgbm8gbG9uZ2VyIGNvbnZlcnRzICBhbGwgcmV0dXJuZWQgYml0bWFwcyAgd2l0aCBhCi0gICAgICBkZXB0aCBvZiAyYnBwIG9yIDRicHAgdG8gYSBkZXB0aCBvZiA4YnBwLiAgVGhlIGRvY3VtZW50YXRpb24gaGFzCi0gICAgICBub3QgIG1lbnRpb25lZCAgdGhpcyAgZXhwbGljaXRseSwgIGJ1dCAgaW1wbGVtZW50b3JzICBtaWdodCBoYXZlCi0gICAgICByZWxpZWQgb24gdGhpcyBhZnRlciBsb29raW5nIGludG8gdGhlIHNvdXJjZSBmaWxlcy4KLQotICAgIC0gQSBuZXcgb3B0aW9uIGAtLWZ0dmVyc2lvbicgaGFzIGJlZW4gIGFkZGVkIHRvIGZyZWV0eXBlLWNvbmZpZyB0bwotICAgICAgcmV0dXJuIHRoZSBGcmVlVHlwZSB2ZXJzaW9uLgotCi0gICAgLSBUaGUgIG1lbW9yeSAgZGVidWdnZXIgIGhhcyAgYmVlbiAgdXBkYXRlZCAgIHRvICBkdW1wICBhbGxvY2F0aW9uCi0gICAgICBzdGF0aXN0aWNzIG9uICBhbGwgYWxsb2NhdGlvbiAgc291cmNlcyBpbiB0aGUgbGlicmFyeS4gICBUaGlzIGlzCi0gICAgICB1c2VmdWwgdG8gIHNwb3QgZ3JlZWR5ICBhbGxvY2F0aW9ucyB3aGVuICBsb2FkaW5nIGFuZCBwcm9jZXNzaW5nCi0gICAgICBmb250cy4KLQotICAgIC0gV2UgcmVtb3ZlZCBhIGh1Z2UgYXJyYXkgb2YgY29uc3RhbnQgcG9pbnRlcnMgdG8gY29uc3RhbnQgc3RyaW5ncwotICAgICAgaW4gdGhlIGBwc25hbWVzJyBtb2R1bGUuICAgVGhlIHByb2JsZW0gd2FzIHRoYXQgIGNvbXBpbGF0aW9ucyBpbgotICAgICAgUElDIG1vZGUgKGkuZS4sICB3aGVuIGdlbmVyYXRpbmcgYSAgVW5peCBzaGFyZWQgb2JqZWN0L2RsbCkgIHB1dAotICAgICAgdGhlIGFycmF5ICBpbnRvIHRoZSBub24tc2hhcmVkICB3cml0YWJsZSBzZWN0aW9uIG9mICB0aGUgbGlicmFyeQotICAgICAgc2luY2UgYWJzb2x1dGUgcG9pbnRlcnMgYXJlIG5vdCByZWxvY2F0YWJsZSBieSBuYXR1cmUuCi0KLSAgICAgIFRoaXMgcmVkdWNlcyB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uIGJ5IGFwcHJveGltYXRlbHkgMTZLQnl0ZSBwZXIKLSAgICAgIHByb2Nlc3MgbGlua2VkICB0byBGcmVlVHlwZS4gICBXZSBub3cgYWxzbyBzdG9yZSAgdGhlIGFycmF5IGluIGEKLSAgICAgIGNvbXByZXNzZWQgZm9ybSAoYXMgYSB0cmllKSB3aGljaCBzYXZlcyBhYm91dCAyMEtCeXRlIG9mIGNvZGUgYXMKLSAgICAgIHdlbGwuCi0KLSAgICAtIEtpcmlsbCAgU21lbGtvdiBwcm92aWRlZCAgcGF0Y2hlcyB0byBtYWtlICBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMKLSAgICAgIGNvbXBpbGUgc3RhbmQtYWxvbmUgYWdhaW4uCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi4xLjkgYW5kIDIuMS44Ci0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBUaGUgZnVuY3Rpb24gIGBGVF9HZXRfQ2hhck1hcF9JbmRleCcgd2FzIG9ubHkgZGVjbGFyZWQsICB3aXRob3V0Ci0gICAgICBhbnkgIHJlYWwgIGNvZGUuICAgRm9yICBjb25zaXN0ZW5jeSwgIGl0ICBoYXMgIGJlZW4gIHJlbmFtZWQgIHRvCi0gICAgICBgRlRfR2V0X0NoYXJtYXBfSW5kZXgnLiAgIChUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCAgdG8gaW1wbGVtZW50Ci0gICAgICBjbWFwIGNhY2hlcy4pCi0KLSAgICAtIGBGVF9PdXRsaW5lX0dldF9CQm94JyAgc29tZXRpbWVzIHJldHVybmVkICBpbmNvcnJlY3QgdmFsdWVzICBmb3IKLSAgICAgIGNvbmljIG91dGxpbmVzIChlLmcuLCBmb3IgVHJ1ZVR5cGUgZm9udHMpLgotCi0gICAgLSBIYW5kbGluZyBvZiBgYmhlZCcgdGFibGUgaGFzIGJlZW4gZml4ZWQuCi0KLSAgICAtIFRoZSBUcnVlVHlwZSBkcml2ZXIgd2l0aCBlbmFibGVkIGJ5dGUgY29kZSBpbnRlcnByZXRlciBzb21ldGltZXMKLSAgICAgIHJldHVybmVkIGFydGlmYWN0cyBkdWUgdG8gaW5jb3JyZWN0IHJvdW5kaW5nLiAgVGhpcyBidWcgaGFzIGJlZW4KLSAgICAgIGludHJvZHVjZWQgYWZ0ZXIgdmVyc2lvbiAyLjEuNC4KLQotICAgIC0gVGhlIEJERiBkcml2ZXIgZHJvcHBlZCB0aGUgbGFzdCBnbHlwaCBpbiB0aGUgZm9udC4KLQotICAgIC0gVGhlIEJERiBkcml2ZXIgbm93IHVzZXMgdGhlIERFRkFVTFRfQ0hBUiBwcm9wZXJ0eSAoaWYgYXZhaWxhYmxlKQotICAgICAgdG8gc2VsZWN0IGEgZ2x5cGggc2hhcGUgZm9yIHRoZSB1bmRlZmluZWQgZ2x5cGguCi0KLSAgICAtIFRoZSBzdHJva2VyIGZhaWxlZCBmb3IgY2xvc2VkIG91dGxpbmVzIGFuZCBzaW5nbGUgcG9pbnRzLgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIEdlb3JnZSAgV2lsbGlhbXMgICBjb250cmlidXRlZCAgY29kZSAgdG8gICBoYW5kbGUgIEFwcGxlJ3MgIGZvbnQKLSAgICAgIGRpc3RvcnRpb24gdGVjaG5vbG9neSBmb3VuZCBpbiBHWCBmb250cyAoYGF2YXInLCBgY3ZhcicsIGBmdmFyJywKLSAgICAgIGFuZCBgZ3ZhcicgdGFibGVzOyAgdGhlIE11bHRpcGxlIE1hc3RlcnMgIEFQSSBoYXMgYmVlbiAgc2xpZ2h0bHkKLSAgICAgIGV4dGVuZGVkIHRvIGNvcGUgd2l0aCB0aGUgbmV3IGZ1bmN0aW9uYWxpdHkpLgotCi0gICAgLSBUaGUgYEZUX0dseXBoU2xvdFJlYycgc3RydWN0dXJlIGhhcyBiZWVuIGV4dGVuZGVkOiAgVGhlIGVsZW1lbnRzCi0gICAgICBgbHNiX2RlbHRhJyBhbmQgIGByc2JfZGVsdGEnIGdpdmUgdGhlIGRpZmZlcmVuY2UgIGJldHdlZW4gaGludGVkCi0gICAgICBhbmQgIHVuaGludGVkICBsZWZ0IGFuZCByaWdodCAgc2lkZSBiZWFyaW5ncyAgaWYgYXV0b2hpbnRpbmcgIGlzCi0gICAgICBhY3RpdmUuICBVc2luZyB0aG9zZSB2YWx1ZXMgY2FuIGltcHJvdmUgdGhlIGludGVyLWxldHRlciBzcGFjaW5nCi0gICAgICBjb25zaWRlcmFibHkuICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mICBgRlRfR2x5cGhTbG90UmVjJyAgYW5kCi0gICAgICB0aGUgYGZ0c3RyaW5nJyBkZW1vIHByb2dyYW0gaG93IHRvIHVzZSBpdC4KLQotICAgIC0gTG9hZGluZyBUcnVlVHlwZSBhbmQgVHlwZSAxIGZvbnRzIGhhcyBiZWVuIG1hZGUgbXVjaCBmYXN0ZXIuCi0KLSAgICAtIFRoZSBzdHJva2VyIGlzICBubyBsb25nZXIgZXhwZXJpbWVudGFsIChidXQgdGhlICBjYWNoZSBzdWJzeXN0ZW0KLSAgICAgIHN0aWxsIGlzKS4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBBIG5ldyAgZG9jdW1lbnRhdGlvbiBmaWxlICBgZm9ybWF0cy50eHQnIGRlc2NyaWJlcyB2YXJpb3VzICBmb250Ci0gICAgICBmb3JtYXRzIHN1cHBvcnRlZCAoYW5kIG5vdCBzdXBwb3J0ZWQpIGJ5IEZyZWVUeXBlLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuMS44IGFuZCAyLjEuNwotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gVGhlIG5hdGl2ZSAgVHJ1ZVR5cGUgaGludGVyIGNvbnRhaW5lZCBzb21lICBidWdzIHdoaWNoIHByZXZlbnRlZAotICAgICAgc29tZSBmb250cyB0byBiZSByZW5kZXJlZCBjb3JyZWN0bHksIG1vc3Qgbm90YWJseSBMZWdlbmR1bS5vdGYuCi0KLSAgICAtIFRoZSBQb3N0U2NyaXB0IGhpbnRlciBub3cgcHJvZHVjZXMgaW1wcm92ZWQgcmVzdWx0cy4KLQotICAgIC0gVGhlICBsaW5lYXIgYWR2YW5jZSAgd2lkdGggIGFuZCBoZWlnaHQgIHZhbHVlcyB3ZXJlICBpbmNvcnJlY3RseQotICAgICAgcm91bmRlZCwgIG1ha2luZyAgdGhlbSB2aXJ0dWFsbHkgIHVudXNhYmxlICBpZiAgbm90IGxvYWRlZCAgd2l0aAotICAgICAgRlRfTE9BRF9MSU5FQVJfREVTSUdOLgotCi0gICAgLSBJbmRleGluZyBDSUQta2V5ZWQgQ0ZGIGZvbnRzIGlzICBub3cgd29ya2luZzogVGhlIGdseXBoIGluZGV4IGlzCi0gICAgICBjb3JyZWN0bHkgIHRyZWF0ZWQgYXMgYSAgQ0lELCBzaW1pbGFyICB0byBGcmVlVHlwZSdzICBDSUQgZHJpdmVyCi0gICAgICBtb2R1bGUuICBOb3RlIHRoYXQgQ0lEIENNYXAgc3VwcG9ydCBpcyBzdGlsbCBtaXNzaW5nLgotCi0gICAgLSBUaGUgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTIGZsYWcgIGlzIG5vdyAgc2V0IGNvcnJlY3RseSBmb3IgYWxsCi0gICAgICBmb250IGZvcm1hdHMuCi0KLSAgICAtIFNvbWUgc3Vic2V0dGVkIFR5cGUgMSAgZm9udHMgd2VyZW4ndCBwYXJzZWQgY29ycmVjdGx5LiAgVGhpcyBidWcKLSAgICAgIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gMi4xLjcuICBJbiBzdW1tYXJ5LCB0aGUgVHlwZSAxIHBhcnNlciBoYXMKLSAgICAgIGJlY29tZSBtb3JlIHJvYnVzdC4KLQotICAgIC0gTm9uLWRlY2ltYWwgbnVtYmVycyB3ZXJlbid0IHBhcnNlZCBjb3JyZWN0bHkgaW4gUFMgZm9udHMuCi0KLSAgICAtIFRoZSBXaW5GTlQgZHJpdmVyIG5vdyBjb3JyZWN0bHkgcmVwb3J0cyBGVF9FTkNPRElOR19OT05FIGZvciBhbGwKLSAgICAgIGJ1dCBvbmUgZW5jb2RpbmcuICBVc2UgIHRoZSBuZXcgRlRfV2luRk5UX0lEX1hYWCB2YWx1ZXMgdG9nZXRoZXIKLSAgICAgIHdpdGggYEZUX0dldF9XaW5GTlRfSGVhZGVyJyB0byBnZXQgdGhlIFdpbkZOVCBjaGFyc2V0IElELgotCi0gICAgLSBUaGUgZGVzY2VuZGVyIG1ldHJpY3MgKGZhY2UtPnNpemUtPm1ldHJpY3MuZGVzY2VuZGVyKSBmb3IgV2luRk5UCi0gICAgICBiaXRtYXAgZm9udHMgaGFkIHRoZSB3cm9uZyBzaWduLgotCi0gICAgLSBUaGUgKGVtdWxhdGVkKSBgc2VhYycgc3VwcG9ydCBmb3IgQ0ZGIGZvbnRzIHdhcyBicm9rZW4uCi0KLSAgICAtIFRoZSBgZmxleCcgb3BlcmF0b3IgZGlkbid0IHdvcmsgZm9yIENGRiBmb250cy4KLQotICAgIC0gUFMgZ2x5cGhzICB3aGljaCAgdXNlICB0aGUgICBgaGludG1hc2snICBvcGVyYXRvciAgaGF2ZW4ndCAgYmVlbgotICAgICAgcmVuZGVyZWQgY29ycmVjdGx5IGluIHNvbWUgY2FzZXMuCi0KLSAgICAtIE1ldHJpY3MgZm9yIEJERiBhbmQgUENGIGJpdG1hcCBmb250IGZvcm1hdHMgaGF2ZSBiZWVuIGZpeGVkLgotCi0gICAgLSBBdXRvaGludGluZyAgaXMgbm93ICBkaXNhYmxlZCBmb3IgIGdseXBocyAgd2hpY2ggIGFyZSB2ZXJ0aWNhbGx5Ci0gICAgICBkaXN0b3J0ZWQgIG9yIG1pcnJvcmVkICAodXNpbmcgYSAgdHJhbnNmb3JtYXRpb24gbWF0cml4KS4gICBUaGlzCi0gICAgICBmaXhlcyBhIGJ1ZyB3aGljaCBwcm9kdWNlZCB6ZXJvLWhlaWdodCBnbHlwaHMuCi0KLSAgICAtIFRoZSAgIGBmcmVldHlwZS1jb25maWcnICAgc2NyaXB0ICAgbm93ICBoYW5kbGVzICAgLS1wcmVmaXggICBhbmQKLSAgICAgIC0tZXhlYy1wcmVmaXggY29ycmVjdGx5OyBpdCBhbHNvICByZXR1cm5zIHRoZSBwcm9wZXIgLS1ycGF0aCAob3IKLSAgICAgIC1SKSB2YWx1ZSBpZiBGcmVlVHlwZSBoYXMgYmVlbiBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIEJvdGggIFBDRiAgYW5kIEJERiAgZHJpdmVycyAgbm93ICBoYW5kbGUgIHRoZSBTRVRXSURUSF9OQU1FICBhbmQKLSAgICAgIEFERF9TVFlMRV9OQU1FICAgIHByb3BlcnRpZXMuICAgICBWYWx1ZXMgICAgYXJlICAgYXBwZW5kZWQgICAgdG8KLSAgICAgIGZhY2UtPnN0eWxlX25hbWU7IGV4YW1wbGU6IGBCb2xkIFNlbWlDb25kZW5zZWQnLgotCi0gICAgLSBUaGUgUENGIGRyaXZlciBub3cgaGFuZGxlcyBiaXRtYXAgIGZvbnRzIGNvbXByZXNzZWQgd2l0aCB0aGUgTFpXCi0gICAgICBhbGdvcml0aG0gKGV4dGVuc2lvbiAucGNmLlosIGNvbXByZXNzZWQgd2l0aCBgY29tcHJlc3MnKS4KLQotICAgIC0gQSAgbmV3ICBBUEkgICBmdW5jdGlvbiAgYEZUX0dldF9DTWFwX0xhbmd1YWdlX0lEJyAgKGRlY2xhcmVkICBpbgotICAgICAgYHR0dGFibGVzLmgnKSAgaXMgIGF2YWlsYWJsZSAgdG8gICBnZXQgIHRoZSAgbGFuZ3VhZ2UgIElEICBvZiAgYQotICAgICAgVHJ1ZVR5cGUvU0ZOVCBjbWFwLgotCi0gICAgLSBUaGUgaGV4YWRlY2ltYWwgZm9ybWF0IG9mICBkYXRhIGFmdGVyIHRoZSBgU3RhcnREYXRhJyBjb21tYW5kIGluCi0gICAgICBDSUQta2V5ZWQgVHlwZSAxIGZvbnRzIGlzIG5vdyBzdXBwb3J0ZWQuICBXaGlsZSB0aGlzIGNhbid0IG9jY3VyCi0gICAgICBpbiAgZmlsZS1iYXNlZCAgIGZvbnRzLCAgaXQgIGNhbiAgIGhhcHBlbiAgaW4gIGRvY3VtZW50LWVtYmVkZGVkCi0gICAgICByZXNvdXJjZXMgb2YgUG9zdFNjcmlwdCBkb2N1bWVudHMuCi0KLSAgICAtIEVtYmVkZGVkIGJpdG1hcHMgaW4gU0ZOVC1iYXNlZCBDRkYgZm9udHMgYXJlIG5vdyBzdXBwb3J0ZWQuCi0KLSAgICAtIEEgc2ltcGxlICBBUEkgaXMgIG5vdyBhdmFpbGFibGUgIHRvIGNvbnRyb2wgIEZyZWVUeXBlJ3MgIHRyYWNpbmcKLSAgICAgIG1lY2hhbmlzbSBpZiBjb21waWxlZCAgd2l0aCBGVF9ERUJVR19MRVZFTF9UUkFDRS4gICBTZWUgdGhlIGZpbGUKLSAgICAgIGBmdGRlYnVnLmgnIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAtIFlBTUFUTyBNYXNhdGFrZSBjb250cmlidXRlZCBpbXByb3ZlZCAgaGFuZGxpbmcgb2YgTWFjT1MgcmVzb3VyY2UKLSAgICAgIGZvcmtzIG9uIG5vbi1NYWNPUyBwbGF0Zm9ybXMgKGZvciBleGFtcGxlLCBMaW51eCBjYW4gbW91bnQgTWFjT1MKLSAgICAgIGZpbGUgc3lzdGVtcykuCi0KLSAgICAtIFN1cHBvcnQgZm9yIE1hY09TIGhhcyBiZWVuIGltcHJvdmVkOyB0aGVyZSBpcyBub3cgYSBuZXcgZnVuY3Rpb24KLSAgICAgIGBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYycgIHNpbWlsYXIgdG8gYEZUX05ld19GYWNlJyAgZXhjZXB0IHRoYXQKLSAgICAgIGl0IGFjY2VwdHMgYW4gRlNTcGVjIGluc3RlYWQgb2YgYSBwYXRoLgotCi0gICAgLSBUaGUgY2FjaGUgc3ViLXN5c3RlbSBoYXMgYmVlbiByZXdyaXR0ZW4uCi0KLSAgICAgIC0gVGhlcmUgaXMgbm93IHN1cHBvcnQgZm9yIGRlaW5zdGFsbGF0aW9uIG9mIGZhY2VzLgotCi0gICAgICAtIEEgbmV3ICBBUEkgZnVuY3Rpb24gYEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCcgIGhhcyBiZWVuIGFkZGVkCi0gICAgICAgIHRvICBkZWxldGUgIGFsbCAgYGlkbGUnICBub2RlcyAgdGhhdCAgY29ycmVzcG9uZCAgdG8gIGEgIGdpdmVuCi0gICAgICAgIEZUQ19GYWNlSUQuICBBbGwgYGxvY2tlZCcgbm9kZXMgIChpLmUuLCB0aG9zZSB3aXRoIGEgcmVmZXJlbmNlCi0gICAgICAgIGNvdW50ID4gMCksIHdpbGwgYmUgbW9kaWZpZWQgdG8gcHJldmVudCB0aGVtIGZyb20gYXBwZWFyaW5nIGluCi0gICAgICAgIGZ1cnRoZXIgIGxvb2t1cHMgKHRoZXkgIHdpbGwgIGJlIGNsZWFuZWQgIG5vcm1hbGx5IHdoZW4gIHRoZWlyCi0gICAgICAgIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIDApLgotCi0gICAgICAtIFRoZXJlICBpcyAgbm93ICBzdXBwb3J0ICBmb3IgcG9pbnQgIHNjYWxpbmcgIChpLmUuLCAgcHJvdmlkaW5nCi0gICAgICAgIGNoYXJhY3RlciBzaXplcyBpbiBwb2ludHMgKyBkcGlzLCBpbnN0ZWFkIG9mIHBpeGVscykuCi0KLSAgICAgIC0gVGhyZWUgYWJzdHJhY3QgY2FjaGUgY2xhc3NlcyBhcmUgbm93IGF2YWlsYWJsZToKLQotICAgICAgICAgIEZUQ19HQ2FjaGU6ICBVc2VkIHRvIHN0b3JlICBvbmUgZ2x5cGggIGl0ZW0gcGVyICBjYWNoZSBub2RlLAotICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGFiaWxpdHkgdG8gZ3JvdXAgY29tbW9uIGF0dHJpYnV0ZXMgaW50bwotICAgICAgICAgICAgICAgICAgICAgIGBmYW1pbGllcycuICAgICAgVGhpcyAgICByZXBsYWNlcyAgICAgdGhlICAgIG9sZAotICAgICAgICAgICAgICAgICAgICAgIEZUQ19HbHlwaENhY2hlIGNsYXNzLgotCi0gICAgICAgICAgRlRDX0lDYWNoZTogVXNlZCB0byBzdG9yZSBvbmUgRlRfR2x5cGggcGVyIGNhY2hlIG5vZGUuICBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kcyAgRlRDX0dDYWNoZS4gIEZhbWlseSAgZGVmaW5pdGlvbiwgZmFtaWx5Ci0gICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbiwgYW5kICBnbHlwaCBsb2FkaW5nIGFyZSAgaG93ZXZlciBsZWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgdG8gc3ViLWNsYXNzZXMuCi0KLSAgICAgICAgICBGVENfU0NhY2hlOiBVc2VkIHRvICBzdG9yZSB1cCB0byAxNiBzbWFsbCAgYml0bWFwcyBwZXIgY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICBub2RlLiAgICBUaGlzICAgIGV4dGVuZHMgICBGVENfR0NhY2hlLiAgICBGYW1pbHkKLSAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBmYW1pbHkgIGNvbXBhcmlzb24gYW5kIGdseXBoIGxvYWRpbmcKLSAgICAgICAgICAgICAgICAgICAgICBhcmUgaG93ZXZlciBsZWZ0IHRvIHN1Yi1jbGFzc2VzLgotCi0gICAgICAtIFRoZSBmaWxlIGBzcmMvY2FjaGUvZnRjYmFzaWMuYycgaW1wbGVtZW50czoKLQotICAgICAgICAgIEZUQ19JbWFnZUNhY2hlOiBFeHRlbmRzICAgIEZUQ19JQ2FjaGU7ICAgaW1wbGVtZW50cyAgIGZhbWlseQotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucyBhbmQgZ2x5cGggbG9hZGluZyBzaW1pbGFyIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQgQVBJLgotCi0gICAgICAgICAgRlRDX1NCaXRDYWNoZTogRXh0ZW5kcyAgICBGVENfU0NhY2hlLCAgICBpbXBsZW1lbnRzICAgZmFtaWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgYW5kIGdseXBoICBsb2FkaW5nIHNpbWlsYXIgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgb2xkIEFQSQotCi0gICAgICAgIENsaWVudCAgYXBwbGljYXRpb25zICBzaG91bGQgIGJlICBhYmxlIHRvICBleHRlbmQgIEZUQ19HQ2FjaGUsCi0gICAgICAgIEZUQ19JQ2FjaGUsIG9yIEZUQ19TQ2FjaGUgbXVjaCBtb3JlIGVhc2lseSAoaS5lLiwgbGVzcyBjb2RlIHRvCi0gICAgICAgIHdyaXRlLCBhbmQgIGxlc3MgY2FsbGJhY2tzKS4gIEZvciBleGFtcGxlLCAgb25lIGNvdWxkIGVudmlzaW9uCi0gICAgICAgIGNhY2hlcyAgdGhhdCBhcmUgIGNhcGFibGUgb2YgIHN0b3JpbmcgIHRyYW5zZm9ybWVkIChvYmxpcXVlZCksCi0gICAgICAgIHN0cm9rZWQsICAgZW1ib2xkZW5lZCwgICBvciAgIGNvbG9yZWQgICBnbHlwaCAgIGltYWdlcy4gICAgVXNlCi0gICAgICAgIGBmdGNiYXNpYy5jJyBhcyBhbiBleGFtcGxlLgotCi0gICAgICAtIEFsbCBwdWJsaWMgIEFQSXMgYXJlIG5vdyAgaW4gYGluY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oJywgKHRvCi0gICAgICAgIGJlICAgIGFjY2Vzc2VkICAgYXMgICAgYEZUX0NBQ0hFX0gnKS4gICAgIFRoZSAgIGNvbnRlbnRzICAgIG9mCi0gICAgICAgIGBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlLycgaXMgb25seSAgbmVlZGVkIGJ5IGFwcGxpY2F0aW9ucyB0aGF0Ci0gICAgICAgIHdpc2ggdG8gaW1wbGVtZW50IHRoZWlyIG93biBjYWNoZXMuCi0KLSAgICAgIC0gVGhlcmUgd2VyZSBzb21lIG1ham9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0aHJvdWdoIHRoZSB1c2UKLSAgICAgICAgb2YgIHZhcmlvdXMgcHJvZ3JhbW1pbmcgIHRyaWNrcy4gICBDYWNoZSBoaXRzICBhcmUgIHVwIHRvICA3MCUKLSAgICAgICAgZmFzdGVyIHRoYW4gaW4gdGhlIG9sZCBjb2RlLgotCi0gICAgICAtIFRoZSAgRlRDX0NNYXBDYWNoZSBoYXMgIGJlZW4gc2ltcGxpZmllZC4gIENoYXJtYXBzIGNhbiBvbmx5IGJlCi0gICAgICAgIGFjY2Vzc2VkIGJ5ICBpbmRleCByaWdodCBub3cuICBUaGVyZSAgaXMgYWxzbyBhICBuZXcgQVBJIG5hbWVkCi0gICAgICAgIGBGVF9DaGFybWFwX0dldEluZGV4JyBmb3IgdGhpcyBwdXJwb3NlLgotCi0gICAgICAtIFRoZSAgZGVtbyBwcm9ncmFtcyAgaGF2ZSBiZWVuICB1cGRhdGVkIHRvICB0aGUgbmV3ICBjb2RlLiAgVGhlCi0gICAgICAgIHByZXZpb3VzIHZlcnNpb25zIHdpbGwgbm90IHdvcmsgd2l0aCB0aGUgY3VycmVudCBvbmUuCi0KLSAgICAgIC0gVXNpbmcgIGFuIGludmFsaWQgZmFjZSAgaW5kZXggaW4gRlRfT3Blbl9GYWNlIGFuZCBmcmllbmRzICBub3cKLSAgICAgICAgY2F1c2VzIGFuIGVycm9yIGV2ZW4gaWYgdGhlIGZvbnQgY29udGFpbnMgYSBzaW5nbGUgZmFjZSBvbmx5LgotCi0KLSAgSUlJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIFdvbGZnYW5nIERvbXLDtnNlIGNvbnRyaWJ1dGVkIHN1cHBvcnQgZmlsZXMgZm9yIGJ1aWxkaW5nIEZyZWVUeXBlCi0gICAgICBvbiB0aGUgQXRhcmkgdXNpbmcgdGhlIFB1cmVDIGNvbXBpbGVyLiAgTm90ZSB0aGF0IHRoZSBBdGFyaSBpcyBhCi0gICAgICAxNmJpdCBwbGF0Zm9ybS4KLQotICAgIC0gVml0YWxpeSBQYXN0ZXJuYWsgY29udHJpYnV0ZWQgcHJvamVjdCBmaWxlcyBmb3IgVlMuTkVUIDIwMDMuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi4xLjcgYW5kIDIuMS42Ci0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBVcGRhdGVkICB0byBuZXdlc3QgIGxpYnRvb2wgIHZlcnNpb24sIGZpeGluZyAgYnVpbGQgcHJvYmxlbXMgIG9uCi0gICAgICB2YXJpb3VzIHBsYXRmb3Jtcy4KLQotICAgIC0gT24gIFVuaXggIHBsYXRmb3JtcywgIGBtYWtlICBpbnN0YWxsJyBkaWRuJ3QgIGNvcHkgIHRoZSAgY29ycmVjdAotICAgICAgYGZ0Y29uZmlnLmgnIGZpbGUuCi0KLSAgTm90ZSB0aGF0IHZlcnNpb24gMi4xLjcgIGNvbnRhaW5zIHRoZSBzYW1lIGxpYnJhcnkgIEMgc291cmNlIGNvZGUgYXMKLSAgdmVyc2lvbiAyLjEuNi4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjEuNiBhbmQgMi4xLjUKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIFRoZSBQRlIgIGZvbnQgZHJpdmVyIGRpZG4ndCAgbG9hZCBrZXJuaW5nIHRhYmxlcyAgY29ycmVjdGx5LCBhbmQKLSAgICAgIHRoZSBmdW5jdGlvbnMgaW4gRlRfUEZSX0ggZGlkbid0IHdvcmsgYXQgYWxsLgotCi0gICAgLSBUeXBlIDEgZm9udCAgZmlsZXMgaW4gIGJpbmFyeSBmb3JtYXQgIChQRkIpIHdpdGggIGFuIGVuZC1vZi1maWxlCi0gICAgICBpbmRpY2F0b3Igd2VyZW4ndCBhY2NlcHRlZCBieSB0aGUgRnJlZVR5cGUgZW5naW5lLgotCi0gICAgLSBGb250cyB3aGljaCBjb250YWluIC9QYWludFR5cGUgIGFuZCAvU3Ryb2tlV2lkdGggbm8gbG9uZ2VyIGNhdXNlCi0gICAgICBhIHNlZ2ZhdWx0LiAgVGhpcyBidWcgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDIuMS41LgotCi0gICAgLSBGb250cyAgbG9hZGVkICB3aXRoICAgRlRfTE9BRF9SRU5ERVIgIG5vICBsb25nZXIgIGNhdXNlICBzdHJhbmdlCi0gICAgICByZXN1bHRzLiAgVGhpcyBidWcgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDIuMS41LgotCi0gICAgLSBTb21lICBXaW5kb3dzICAgKGJpdG1hcCkgIEZOVC9GT04gIGZpbGVzICAgY291bGRuJ3QgIGJlICBoYW5kbGVkCi0gICAgICBjb3JyZWN0bHkuCi0KLQotICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gVGhlIGludGVybmFsICBtb2R1bGUgQVBJICBoYXMgYmVlbiBoZWF2aWx5ICBjaGFuZ2VkIGluICBmYXZvciBvZgotICAgICAgbWFzc2l2ZSBzaW1wbGlmaWNhdGlvbnMgd2l0aGluIHRoZSBmb250IGVuZ2luZS4gIFRoaXMgYWxzbyBtZWFucwotICAgICAgdGhhdCBhdXRob3JzIG9mIHRoaXJkLXBhcnR5IG1vZHVsZXMgbXVzdCBhZGFwdCB0aGVpciBjb2RlIHRvIHRoZQotICAgICAgbmV3IHNjaGVtZS4KLQotICAgICAgTk9URTogIFRIRSBORVcgU0NIRU1FIElTIE5PVCBDT01QTEVURUQgWUVULiAgUExFQVNFIFdBSVQgVU5USUwgQQotICAgICAgRklOQUwgQU5OT1VOQ0VNRU5UIQotCi0gICAgLSBUaGUgUG9zdFNjcmlwdCAgcGFyc2VyIGhhcyBiZWVuIGVuaGFuY2VkIHRvICBoYW5kbGUgY29tbWVudHMgYW5kCi0gICAgICBzdHJpbmdzICAgY29ycmVjdGx5LiAgIEFkZGl0aW9uYWxseSwgICBtb3JlICBzeW50YXggICBmb3JtcyAgYXJlCi0gICAgICByZWNvZ25pemVkLgotCi0gICAgLSBBZGRlZCB0aGUgIG9wdGlvbmFsIHVucGF0ZW50ZWQgaGludGluZyBzeXN0ZW0gIGZvciBUcnVlVHlwZS4gIEl0Ci0gICAgICBhbGxvd3MgIHR5cGVmYWNlcyB3aGljaCAgbmVlZCBoaW50aW5nICB0byBwcm9kdWNlICBjb3JyZWN0IGdseXBoCi0gICAgICBmb3JtcyAoZS5nLiwgQ2hpbmVzZSB0eXBlZmFjZXMgIGZyb20gRHluYWxhYikgdG8gd29yayBhY2NlcHRhYmx5Ci0gICAgICB3aXRob3V0IGluZnJpbmdpbmcgQXBwbGUgcGF0ZW50cy4gICBUaGlzIHN5c3RlbSBpcyBjb21waWxlZCBvbmx5Ci0gICAgICBpZiAgVFRfQ09ORklHX09QVElPTl9DT01QSUxFX1VOUEFURU5URURfSElOVElORyAgaXMgIGRlZmluZWQgIGluCi0gICAgICBmdG9wdGlvbi5oIChhY3RpdmF0ZWQgYnkgZGVmYXVsdCkuCi0KLQotICBJSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gVGhlcmUgIGlzIG5vdyAgYSBndWFyZCAgaW4gdGhlICBwdWJsaWMgaGVhZGVyICBmaWxlcyAgdG8gcHJvdGVjdAotICAgICAgYWdhaW5zdCBpbmNsdXNpb24gb2YgZnJlZXR5cGUuaCBmcm9tIEZyZWVUeXBlIDEuCi0KLSAgICAtIERpcmVjdCBpbmNsdXNpb24gb2YgZnJlZXR5cGUuaCAgYW5kIG90aGVyIHB1YmxpYyBoZWFkZXIgZmlsZXMgbm8KLSAgICAgIGxvbmdlciB3b3Jrcy4gIFlvdSBoYXZlIHRvIHVzZSB0aGUgZG9jdW1lbnRlZCBzY2hlbWUKLQotICAgICAgICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSAgICAgICAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0gICAgICB0byBsb2FkIGZyZWV0eXBlLmggd2l0aCAgYSBzeW1ib2xpYyBuYW1lLiAgVGhpcyBwcm90ZWN0cyBhZ2FpbnN0Ci0gICAgICByZW5hbWluZyAgb2YgcHVibGljICBoZWFkZXIgIGZpbGVzICh3aGljaCAgc2hvdWxkbid0IGhhcHBlbiAgYnV0Ci0gICAgICBhY3R1YWxseSAgaGFzLCBhdm9pZGluZyB0d28gIHB1YmxpYyBoZWFkZXIgIGZpbGVzIHdpdGggIHRoZSBzYW1lCi0gICAgICBuYW1lKS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjEuNSBhbmQgMi4xLjQKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIFBhcnNpbmcgdGhlIC9DSURGb250TmFtZSBmaWVsZCAgbm93IHJlbW92ZXMgdGhlIGxlYWRpbmcgc2xhc2ggdG8KLSAgICAgIGJlIGluIHN5bmMgd2l0aCBvdGhlciBmb250IGRyaXZlcnMuCi0KLSAgICAtIGd6aXAgc3VwcG9ydCB3YXMgYnVnZ3kuICBTb21lIGZvbnRzIGNvdWxkIG5vdCBiZSByZWFkLgotCi0gICAgLSBGb250cyB3aGljaCAgaGF2ZSBuZXN0ZWQgc3ViZ2x5cGhzICBtb3JlIHRoYW4gb25lIGxldmVsICBkZWVwIG5vCi0gICAgICBsb25nZXIgY2F1c2UgYSBzZWdmYXVsdC4KLQotICAgIC0gQ3JlYXRpb24gb2Ygc3ludGhldGljICBjbWFwcyBmb3IgZm9udHMgaW4gQ0ZGICBmb3JtYXQgd2FzIGJyb2tlbgotICAgICAgcGFydGlhbGx5LgotCi0gICAgLSBOdW1lcmljICBmb250ICBkaWN0aW9uYXJ5IGVudHJpZXMgIGZvciAgc3ludGhldGljICBmb250cyBhcmUgIG5vCi0gICAgICBsb25nZXIgb3ZlcndyaXR0ZW4uCi0KLSAgICAtIFRoZSBmb250IG1hdHJpeCAgd2Fzbid0IGFwcGxpZWQgdG8gdGhlIGFkdmFuY2UgIHdpZHRoIGZvciBUeXBlMSwKLSAgICAgIENJRCwgYW5kICBDRkYgZm9udHMuICBUaGlzIGNhdXNlZCBwcm9ibGVtcyAgd2hlbiBsb2FkaW5nIGNlcnRhaW4KLSAgICAgIHN5bnRoZXRpYyBUeXBlIDEgZm9udHMgbGlrZSBgSGVsdmV0aWNhIE5hcnJvdycuCi0KLSAgICAtIFRoZSB0ZXN0ICBmb3IgdGhlIGNoYXJzZXQgcmVnaXN0cnkgIGluIEJERiBhbmQgUENGICBmb250cyBpcyBub3cKLSAgICAgIGNhc2UtaW5zZW5zaXRpdmUuCi0KLSAgICAtIEZUX1ZlY3Rvcl9Sb3RhdGUgIHNvbWV0aW1lcyAgcmV0dXJuZWQgICBzdHJhbmdlICB2YWx1ZXMgIGR1ZSAgdG8KLSAgICAgIHJvdW5kaW5nIGVycm9ycy4KLQotICAgIC0gVGhlICBQQ0YgIGRyaXZlciAgbm93ICByZXR1cm5zICB0aGUgIGNvcnJlY3QgIG51bWJlciAgb2YgIGdseXBocwotICAgICAgKGluY2x1ZGluZyBhbiBhcnRpZmljaWFsIGBub3RkZWYnIGdseXBoIGF0IGluZGV4IDApLgotCi0gICAgLSBGcmVlVHlwZSBub3cgIHN1cHBvcnRzIGJ1Z2d5IENNYXBzICB3aGljaCBhcmUgY29udGFpbmVkICBpbiBtYW55Ci0gICAgICBDSksgZm9udHMgZnJvbSBEeW5hbGFiLgotCi0gICAgLSBPcGVuaW5nICBhbiBpbnZhbGlkICBmb250ICBvbiBhICBNYWMgIGNhdXNlZCBhICBzZWdmYXVsdCBkdWUgIHRvCi0gICAgICBkb3VibGUtZnJlZWluZyBtZW1vcnkuCi0KLSAgICAtIEJERiAgZm9udHMgIHdpdGggIG1vcmUgICB0aGFuICAzMjc2OCAgZ2x5cGhzICB3ZXJlbid0ICBzdXBwb3J0ZWQKLSAgICAgIHByb3Blcmx5LgotCi0KLSAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCi0KLSAgICAtIEFjY2Vzc2luZyBiaXRtYXAgZm9udCBmb3JtYXRzIGhhcyBiZWVuIHN5bmNocm9uaXplZC4gIFRvIGRvIHRoYXQKLSAgICAgIHRoZSBGVF9CaXRtYXBfU2l6ZSAgc3RydWN0dXJlIGhhcyAgYmVlbiBleHRlbmRlZCB0byAgY29udGFpbiBuZXcKLSAgICAgIGZpZWxkcyBgc2l6ZScsIGB4X3BwZW0nLCBhbmQgYHlfcHBlbScuCi0KLSAgICAtIFRoZSBGTlQgZHJpdmVyIG5vdyByZXR1cm5zIG11bHRpcGxlIGZhY2VzLCBub3QgbXVsdGlwbGUgc3RyaWtlcy4KLQotICAgIC0gVGhlIGBwc25hbWVzJyAgbW9kdWxlIGhhcyBiZWVuICB1cGRhdGVkIHRvIHRoZSBBZG9iZSAgR2x5cGggTGlzdAotICAgICAgdmVyc2lvbiAyLjAuCi0KLSAgICAtIFRoZSBgcHNuYW1lcycgbW9kdWxlIG5vdyB1bmRlcnN0YW5kcyBgdVhYWFhbWFtYXV0nIGdseXBoIG5hbWVzLgotCi0gICAgLSBUaGUgYWxnb3JpdGhtIGZvciBndWVzc2luZyB0aGUgZm9udCBzdHlsZSBoYXMgYmVlbiBpbXByb3ZlZC4KLQotICAgIC0gRm9yIGZvbnRzIGluIFNGTlQgZm9ybWF0LCByb290LT5oZWlnaHQgaXMgbm8gbG9uZ2VyIGluY3JlYXNlZCBpZgotICAgICAgdGhlIGxpbmUgZ2FwICBpcyB6ZXJvLiAgVGhlcmUgZXhpc3QgZm9udHMgIChjb250YWluaW5nIGUuZy4gZm9ybQotICAgICAgZHJhd2luZyAgY2hhcmFjdGVycykgd2hpY2ggIGludGVudGlvbmFsbHkgaGF2ZSAgYSB6ZXJvICBsaW5lIGdhcAotICAgICAgdmFsdWUuCi0KLSAgICAtIGZ0X2dseXBoX2Jib3hfeHh4ICBmbGFncyAgIGFyZSAgbm93ICBkZXByZWNhdGVkICAgaW4gIGZhdm91ciAgb2YKLSAgICAgIEZUX0dMWVBIX0JCT1hfWFhYLgotCi0gICAgLSBmdF9tb2R1bGVfeHh4ICAgZmxhZ3MgICBhcmUgICBub3cgICBkZXByZWNhdGVkICBpbiAgIGZhdm91ciAgIG9mCi0gICAgICBGVF9NT0RVTEVfWFhYLgotCi0gICAgLSBGVF9FTkNPRElOR19NU197U0pJUyxHQjIzMTIsQklHNSxXQU5TVU5HLEpPSEFCfSAgICAgIGFyZSAgICAgbm93Ci0gICAgICBkZXByZWNhdGVkICAgICAgICAgICAgICAgaW4gICAgICAgICAgICAgICBmYXZvdXIgICAgICAgICAgICAgIG9mCi0gICAgICBGVF9FTkNPRElOR197U0pJUyxHQjIzMTIsQklHNSxXQU5TVU5HLEpPSEFCfSAgLS0gdGhvc2UgZW5jb2RpbmdzCi0gICAgICBhcmUgbm90IHNwZWNpZmljIHRvIE1pY3Jvc29mdC4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBUaGUgIGF1dG9oaW50ZXIgIGhhcyBiZWVuICBmdXJ0aGVyICBpbXByb3ZlZDsgIGZvciBleGFtcGxlLCAgYG0nCi0gICAgICBnbHlwaHMgbm93IHJldGFpbiBpdHMgdmVydGljYWwgc3ltbWV0cnkuCi0KLSAgICAtIFBhcnRpYWwgc3VwcG9ydCBvZiBNYWMgZm9udHMgb24gbm9uLU1hYyBwbGF0Zm9ybXMuCi0KLSAgICAtIGBtYWtlICAgcmVmZG9jJyAgIChhZnRlciAgIGZpcnN0ICAgYG1ha2UnKSAgIGJ1aWxkcyAgIHRoZSAgIEhUTUwKLSAgICAgIGRvY3VtZW50YXRpb24uICBZb3UgbmVlZCBQeXRob24gZm9yIHRoaXMuCi0KLSAgICAtIFRoZSBtYWtlIGJ1aWxkIHN5c3RlbSBzaG91bGQgIG5vdyB3b3JrIG1vcmUgcmVsaWFibHkgb24gRE9TLWxpa2UKLSAgICAgIHBsYXRmb3Jtcy4KLQotICAgIC0gU3VwcG9ydCBmb3IgIEVNWCBnY2MgIGFuZCBXYXRzb24gQy9DKysgIGNvbXBpbGVycyBvbiAgTVMtRE9TIGhhcwotICAgICAgYmVlbiBhZGRlZC4KLQotICAgIC0gQmV0dGVyIFZNUyBidWlsZCBzdXBwb3J0LgotCi0gICAgLSBTdXBwb3J0IGZvciB0aGUgcGtnLWNvbmZpZyAgcGFja2FnZSBieSBwcm92aWRpbmcgYSBgZnJlZXR5cGUucGMnCi0gICAgICBmaWxlLgotCi0gICAgLSBOZXcgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtb2xkLW1hYy1mb250cyBmb3IgRGFyd2luLgotCi0gICAgLSBTb21lIHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gIHJlbmFtZWQgKG1haW5seSB0byBmaXQgaW50byB0aGUgOC4zCi0gICAgICBuYW1pbmcgc2NoZW1lKS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjEuNCBhbmQgMi4xLjMKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIFVwZGF0ZWQgIHRvIG5ld2VzdCAgbGlidG9vbCAgdmVyc2lvbiwgZml4aW5nICBidWlsZCBwcm9ibGVtcyAgb24KLSAgICAgIHZhcmlvdXMgcGxhdGZvcm1zLgotCi0gICAgLSBBIGZpeCAgaW4gdGhlIEd6aXAgc3RyZWFtICByZWFkZXI6IEl0IGNvdWxkbid0ICByZWFkIGNlcnRhaW4gLmd6Ci0gICAgICBmaWxlcyBwcm9wZXJseSBkdWUgdG8gYSAgc21hbGwgdHlwby4gIEluIGNlcnRhaW4gY2FzZXMsIEZyZWVUeXBlCi0gICAgICBjb3VsZCAgYWxzbyBsb29wICBlbmRsZXNzbHkgIHdoZW4gdHJ5aW5nICB0byAgbG9hZCB0aW55ICBnemlwcGVkCi0gICAgICBmaWxlcy4KLQotICAgIC0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHRyaWVzICB0byB1c2UgdGhlIHN5c3RlbS13aWRlIHpsaWIgd2hlbgotICAgICAgaXQgIGZpbmRzIG9uZSAgKGluc3RlYWQgb2YgIHRoZSAgY29weSBmb3VuZCAgaW4gc3JjL2d6aXApLiAgIEFuZAotICAgICAgYGZyZWV0eXBlLWNvbmZpZycgaGFzICBiZWVuIHVwZGF0ZWQgdG8gcmV0dXJuICByZWxldmFudCBmbGFncyBpbgotICAgICAgdGhpcyBjYXNlIHdoZW4gaW52b2tlZCB3aXRoIGAtLWxpYnMnIChlLmcuIGAtbHpsaWInKS4KLQotICAgIC0gQ2VydGFpbiBmb250cyBjb3VsZG4ndCBiZSBsb2FkZWQgIGJ5IDIuMS4zIGJlY2F1c2UgdGhleSBsYWNrZWQgYQotICAgICAgVW5pY29kZSAgIGNoYXJtYXAgIChlLmcuICAgU1lNQk9MLlRURikuICAgIEZyZWVUeXBlICBlcnJvbmVvdXNseQotICAgICAgcmVqZWN0ZWQgdGhlbS4KLQotICAgIC0gVGhlIENGRiBsb2FkZXIgd2FzIG1vZGlmaWVkIHRvIGFjY2VwdCBmb250cyB3aGljaCBvbmx5IGNvbnRhaW4gYQotICAgICAgc3Vic2V0IG9mICB0aGVpciByZWZlcmVuY2UgY2hhcnNldC4gIFRoaXMgIHByZXZlbnRlZCB0aGUgY29ycmVjdAotICAgICAgdXNlIG9mIFBERi1lbWJlZGRlZCBmb250cy4KLQotICAgIC0gVGhlIGxvZ2ljIHRvIGRldGVjdCBVbmljb2RlIGNoYXJtYXBzIGhhcyBiZWVuIG1vZGlmaWVkLiAgVGhpcyBpcwotICAgICAgcmVxdWlyZWQgdG8gIHN1cHBvcnQgZm9udHMgd2hpY2ggaW5jbHVkZSBib3RoICAxNi1iaXQgYW5kIDMyLWJpdAotICAgICAgY2hhcm1hcHMgKGxpa2UgdmVyeSAgcmVjZW50IGFzaWFuIG9uZXMpIHVzaW5nIHRoZSAgbmV3IDEwIGFuZCAxMgotICAgICAgU0ZOVCBmb3JtYXRzLgotCi0gICAgLSBUaGUgVHJ1ZVR5cGUgIGxvYWRlciBub3cgbGltaXRzICB0aGUgZGVwdGggb2YgIGNvbXBvc2l0ZSBnbHlwaHMuCi0gICAgICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGJyb2tlbiBmb250cyB0byBicmVhayB0aGUgZW5naW5lIGJ5Ci0gICAgICBibG93aW5nIHRoZSBzdGFjayB3aXRoIHJlY3Vyc2l2ZSBnbHlwaCBkZWZpbml0aW9ucy4KLQotICAgIC0gVGhlIENNYXAgY2FjaGUgaXMgbm93ICBjYXBhYmxlIG9mIG1hbmFnaW5nIFVDUy00IGNoYXJhY3RlciBjb2RlcwotICAgICAgdGhhdCAgIGFyZSAgIG1hcHBlZCAgIHRocm91Z2ggICBleHRlbmRlZCAgY2hhcm1hcHMgICBpbiAgIHJlY2VudAotICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udHMuCi0KLSAgICAtIFRoZSAgIGNhY2hlICBzdWItc3lzdGVtICAgbm93ICBwcm9wZXJseSAgIG1hbmFnZXMgIG91dC1vZi1tZW1vcnkKLSAgICAgIGNvbmRpdGlvbnMgIGluc3RlYWQgb2YgIGJsaW5kbHkgIHJlcG9ydGluZyB0aGVtICB0byB0aGUgIGNhbGxlci4KLSAgICAgIFRoaXMgbWVhbnMgdGhhdCBpdCB3aWxsIHRyeSB0byBlbXB0eSB0aGUgY2FjaGUgYmVmb3JlIHJlc3RhcnRpbmcKLSAgICAgIGl0cyBhbGxvY2F0aW9ucyB0byBzZWUgaWYgdGhhdCBjYW4gaGVscC4KLQotICAgIC0gVGhlICBQRlIgZHJpdmVyICBkaWRuJ3QgcmV0dXJuICB0aGUgbGlzdCAgb2YgIGF2YWlsYWJsZSBlbWJlZGRlZAotICAgICAgYml0bWFwcyBwcm9wZXJseS4KLQotICAgIC0gVGhlcmUgd2FzICBhIG5hc3R5ICBtZW1vcnkgbGVhayB3aGVuICB1c2luZyBlbWJlZGRlZCAgYml0bWFwcyBpbgotICAgICAgY2VydGFpbiBmb250IGZvcm1hdHMuCi0KLQotICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKLQotICAgIC0gRGF2aWQgQ2hlc3RlciAgY29udHJpYnV0ZWQgc29tZSBlbmhhbmNlbWVudHMgIHRvIHRoZSBhdXRvLWhpbnRlcgotICAgICAgdGhhdCAgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSAgdGhlICBxdWFsaXR5IG9mICBpdHMgb3V0cHV0LiAgIFRoZQotICAgICAgUG9zdHNjcmlwdCBoaW50ZXIgd2FzIGFsc28gaW1wcm92ZWQgaW4gc2V2ZXJhbCB3YXlzLgotCi0gICAgLSBUaGUgRlRfUkVOREVSX01PREVfTElHSFQgcmVuZGVyIG1vZGUgd2FzIGltcGxlbWVudGVkLgotCi0gICAgLSBBIG5ldyAgQVBJIGZ1bmN0aW9uIGNhbGxlZCBgRlRfR2V0X0JERl9Qcm9wZXJ0eScgIGhhcyBiZWVuIGFkZGVkCi0gICAgICB0byBGVF9CREZfSCB0byAgcmV0cmlldmUgQkRGIHByb3BlcnRpZXMgZnJvbSBCREYgIF9hbmRfIFBDRiBmb250Ci0gICAgICBmaWxlcy4gICBUSElTICBJUyAgU1RJTEwgIEVYUEVSSU1FTlRBTCwgIHNpbmNlICBpdCAgaGFzbid0ICBiZWVuCi0gICAgICBwcm9wZXJseSB0ZXN0ZWQgeWV0LgotCi0gICAgLSBBIFdpbmRvd3MgRk5UIHNwZWNpZmljIEFQSSBoYXMgYmVlbiBhZGRlZCwgbW9zdGx5IHRvIGFjY2VzcyBmb250Ci0gICAgICBoZWFkZXJzLiAgVGhpcyBpcyB1c2VkIGJ5IFdpbmUuCi0KLSAgICAtIFRydWVUeXBlIHRhYmxlcyAgd2l0aG91dCBhbiBgaG10eCcgdGFibGUgYXJlICBub3cgdG9sZXJhdGVkIHdoZW4KLSAgICAgIGFuICBpbmNyZW1lbnRhbCBpbnRlcmZhY2UgIGlzICB1c2VkLiAgVGhpcyAgaGFwcGVucyBmb3IgIGNlcnRhaW4KLSAgICAgIFR5cGU0MiBmb250cyBwYXNzZWQgZnJvbSBHaG9zdHNjcmlwdCB0byBGcmVlVHlwZS4KLQotICAgIC0gVGhlIFBGUiBmb250IGRyaXZlciBpcyAgbm93IGNhcGFibGUgb2YgcmV0dXJuaW5nIHRoZSBmb250IGZhbWlseQotICAgICAgYW5kIHN0eWxlICBuYW1lcyB3aGVuICB0aGV5IGFyZSBhdmFpbGFibGUgIChpbnN0ZWFkIG9mICB0aGUgc29sZQotICAgICAgYEZvbnRJRCcpLiAgIFRoaXMgIGlzICBwZXJmb3JtZWQgIGJ5IHBhcnNpbmcgIGFuICAqdW5kb2N1bWVudGVkKgotICAgICAgcG9ydGlvbiBvZiB0aGUgZm9udCBmaWxlIQotCi0KLSAgSUlJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIFRoZSBwYXRoIHN0cm9rZXIgaW4gRlRfU1RST0tFUl9IIGhhcyBlbnRlcmVkIGJldGEgc3RhZ2UuICBJdCBub3cKLSAgICAgIHdvcmtzIHZlcnkgIHdlbGwsIGJ1dCAgaXRzIGludGVyZmFjZSBtaWdodCAgY2hhbmdlIGEgYml0ICBpbiB0aGUKLSAgICAgIGZ1dHVyZS4gIE1vcmUgb24gdGhpcyBpbiBsYXRlciByZWxlYXNlcy4KLQotICAgIC0gVGhlIGRvY3VtZW50YXRpb24gZm9yICBGVF9TaXplX01ldHJpY3MgZGlkbid0IGFwcGVhciBwcm9wZXJseSBpbgotICAgICAgdGhlIEFQSSByZWZlcmVuY2UuCi0KLSAgICAtIFRoZSBmaWxlIGRvY3MvVkVSU0lPTi5ETEwgaGFzIGJlZW4gdXBkYXRlZCB0byBleHBsYWluIHZlcnNpb25pbmcKLSAgICAgIHdpdGggRnJlZVR5cGUgIChpLmUuLCBjb21wYXJpbmcgcmVsZWFzZS9saWJ0b29sL3NvICBudW1iZXJzLCBhbmQKLSAgICAgIGhvdyB0byB1c2UgdGhlbSBpbiBhdXRvY29uZiBzY3JpcHRzKS4KLQotICAgIC0gVGhlICBpbnN0YWxsYXRpb24gIGRvY3VtZW50YXRpb24gIGhhcyBiZWVuICBzZXJpb3VzbHkgIHJldmFtcGVkLgotICAgICAgRXZlcnl0aGluZyBpcyBub3cgaW4gdGhlIGBkb2NzJyBkaXJlY3RvcnkuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DSEFOR0VTIEJFVFdFRU4gMi4xLjMgYW5kIDIuMS4yCi0KLSAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwotCi0gICAgLSBGVF9WZWN0b3JfVHJhbnNmb3JtICBoYWQgIGJlZW4gIGluY29ycmVjdGx5IG1vZGlmaWVkICBpbiAgMi4xLjIsCi0gICAgICByZXN1bHRpbmcgIGluICBpbmNvcnJlY3QgICB0cmFuc2Zvcm1hdGlvbnMgIGJlaW5nICBhcHBsaWVkICAoZm9yCi0gICAgICBleGFtcGxlLCByb3RhdGlvbnMgd2VyZSBwcm9jZXNzZWQgaW4gb3Bwb3NpdGUgYW5nbGVzKS4KLQotICAgIC0gVGhlIGZvcm1hdCAgOCBhbmQgMTIgVHJ1ZVR5cGUgY2hhcm1hcCAgZW51bWVyYXRpb24gcm91dGluZXMgaGF2ZQotICAgICAgYmVlbiBmaXhlZCAoRlRfR2V0X05leHRfQ2hhciByZXR1cm5lZCBpbnZhbGlkIHZhbHVlcykuCi0KLSAgICAtIFRoZSAgUEZSIGZvbnQgZHJpdmVyICByZXR1cm5lZCBpbmNvcnJlY3QgIGFkdmFuY2Ugd2lkdGhzICBpZiB0aGUKLSAgICAgIG91dGxpbmUgIGFuZCBtZXRyaWNzIHJlc29sdXRpb24gIGRlZmluZWQgaW4gIHRoZSBmb250ICBmaWxlIHdlcmUKLSAgICAgIGRpZmZlcmVudC4KLQotICAgIC0gRlRfR2x5cGhfVG9fQml0bWFwIG5vdyByZXR1cm5zICBzdWNjZXNzZnVsbHkgd2hlbiBjYWxsZWQgd2l0aCBhbgotICAgICAgRlRfQml0bWFwR2x5cGggYXJndW1lbnQgKGl0IHByZXZpb3VzbHkgcmV0dXJuZWQgYW4gZXJyb3IpLgotCi0gICAgLSBBIGJ1ZyAgaW4gdGhlIFR5cGUgMSAgbG9hZGVyIHRoYXQgcHJldmVudGVkICB2YWxpZCBmb250IGJvdW5kaW5nCi0gICAgICBib3hlcyB0byBiZSBsb2FkZWQgZnJvbSBtdWx0aXBsZSBtYXN0ZXIgZm9udHMuCi0KLSAgICAtIFRoZSBTRk5UICB2YWxpZGF0aW9uIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuLiAgIEZyZWVUeXBlIGNhbiBub3cKLSAgICAgIGxvYWQgYGJyb2tlbicgIGZvbnRzIHRoYXQgd2VyZSAgdXNhYmxlIG9uIFdpbmRvd3MsIGJ1dCAgbm90IHdpdGgKLSAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LgotCi0gICAgLSBUaGUgY29tcHV0YXRpb24gb2YgYmVhcmluZ3MgaW4gdGhlIEJERiBkcml2ZXIgaGFzIGJlZW4gZml4ZWQuCi0KLSAgICAtIFRoZSBQb3N0c2NyaXB0IGhpbnRlciBjcmFzaGVkIHdoZW4gdHJ5aW5nIHRvIGhpbnQgY2VydGFpbiBnbHlwaHMKLSAgICAgIChtb3JlIHByZWNpc2VseSwgIHdoZW4gdHJ5aW5nIHRvICBhcHBseSBoaW50cyB0byBhbiAgZW1wdHkgZ2x5cGgKLSAgICAgIG91dGxpbmUpLgotCi0gICAgLSBUaGUgIFRydWVUeXBlIGdseXBoICBsb2FkZXIgIG5vdyBzdXBwb3J0cyAgY29tcG9zaXRlcyBpbiAgYEFwcGxlCi0gICAgICBmb3JtYXQnICAodGhleSBkaWZmZXIgc2xpZ2h0bHkgIGZyb20gTWljcm9zb2Z0L09wZW5UeXBlICBvbmVzIGluCi0gICAgICB0aGUgd2F5IHRyYW5zZm9ybWF0aW9uIG9mZnNldHMgYXJlIGNvbXB1dGVkKS4KLQotICAgIC0gRnJlZVR5cGUgd2FzICB2ZXJ5IHNsb3cgYXQgb3BlbmluZyBjZXJ0YWluICBhc2lhbiBDSUQvQ0ZGIGZvbnRzLAotICAgICAgZHVlIHRvICBmaXhlZCBpbmNyZW1lbnQgIGluIGR5bmFtaWMgYXJyYXkgIHJlLWFsbG9jYXRpb25zLiAgVGhpcwotICAgICAgaGFzICBiZWVuIGNoYW5nZWQgIHRvICBleHBvbmVudGlhbCBiZWhhdmlvdXIgIHRvIGdldCAgYWNjZXB0YWJsZQotICAgICAgcGVyZm9ybWFuY2UuCi0KLQotCi0gIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwotCi0gICAgLSBUaGUgUENGIGRyaXZlciBub3cgc3VwcG9ydHMgZ3ppcC1jb21wcmVzc2VkIGZvbnQgZmlsZXMgbmF0aXZlbHkuCi0gICAgICBUaGlzIG1lYW5zIHRoYXQgIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlICBhbGwgdGhlc2UgYml0bWFwIGZvbnRzCi0gICAgICB0aGF0ICBjb21lIHdpdGggIFhGcmVlODYgd2l0aCAgRnJlZVR5cGUgKGFuZCAgbGliWGZ0L2xpYlhmdDIsIGJ5Ci0gICAgICBleHRlbnNpb24pLgotCi0gICAgLSBUaGUgIGF1dG9tYXRpYyBhbmQgIHBvc3RzY3JpcHQgaGludGVycyAgaGF2ZSBib3RoICBiZWVuIHVwZGF0ZWQuCi0gICAgICBUaGlzICByZXN1bHRzIGluICBhIHJlbGF0aXZlbHkgIGltcG9ydGFudCBpbmNyZWFzZSAgb2YgcmVuZGVyaW5nCi0gICAgICBxdWFsaXR5IHNpbmNlICBtYW55IG5hc3R5IGRlZmF1bHRzIGhhdmUgYmVlbiBzdXBwcmVzc2VkLiAgUGxlYXNlCi0gICAgICB2aXNpdCB0aGUgd2ViIHBhZ2U6Ci0KLSAgICAgICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvaGludGluZy9zbW9vdGgtaGludGluZy5odG1sCi0KLSAgICAgIGZvciBhZGRpdGlvbmFsIGRldGFpbHMgb24gdGhpcyB0b3BpYy4KLQotICAgIC0gVGhlIGBsb2FkX2ZsYWdzJyBwYXJhbWV0ZXIgb2YgYEZUX0xvYWRfR2x5cGgnIGlzIG5vdyBhbiBGVF9JbnQzMgotICAgICAgKGluc3RlYWQgIG9mIGp1c3QgIGJlaW5nICBhbiBGVF9JbnQpLiAgIFRoaXMgIGJyZWFrcyBzb3VyY2UgIGFuZAotICAgICAgYmluYXJ5ICBjb21wYXRpYmlsaXR5IGZvciAgMTZiaXQgc3lzdGVtcyAgb25seSwgIHdoaWxlIHJldGFpbmluZwotICAgICAgYm90aCBvZiB0aGVtIGZvciAzMiBhbmQgNjQgYml0IG9uZXMuCi0KLSAgICAgIFNvbWUgbmV3IGZsYWdzIGhhdmUgYmVlbiBhZGRlZCBjb25zZXF1ZW50bHk6Ci0KLSAgICAgICAgRlRfTE9BRF9OT19BVVRPSElOVCAgIDo6IERpc2FibGUgdGhlIHVzZSBvZiB0aGUgYXV0by1oaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidXQgbm90IG5hdGl2ZSBmb3JtYXQgaGludGVycykuCi0KLSAgICAgICAgRlRfTE9BRF9UQVJHRVRfTk9STUFMIDo6IEhpbnQgYW5kIHJlbmRlciBmb3Igbm9ybWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnRpLWFsaWFzZWQgZGlzcGxheXMuCi0KLSAgICAgICAgRlRfTE9BRF9UQVJHRVRfTU9OTyAgIDo6IEhpbnQgYW5kIHJlbmRlciBmb3IgMS1iaXQgZGlzcGxheXMuCi0KLSAgICAgICAgRlRfTE9BRF9UQVJHRVRfTENEICAgIDo6IEhpbnQgYW5kIHJlbmRlciBmb3IgaG9yaXpvbnRhbCBSR0Igb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJHUiBzdWItcGl4ZWwgZGlzcGxheXMgKGxpa2UgTENECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5zKS4gIFRISVMgSVMgU1RJTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVSSU1FTlRBTCEKLQotICAgICAgICBGVF9MT0FEX1RBUkdFVF9MQ0RfViAgOjogU2FtZSBhcyBGVF9MT0FEX1RBUkdFVF9MQ0QsIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgc3ViLXBpeGVsIGRpc3BsYXlzIChsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVkIExDRCBzY3JlZW5zKS4gIFRISVMgSVMgU1RJTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVSSU1FTlRBTCEKLQotICAgICAgRlRfTE9BRF9NT05PQ0hST01FICAgaXMgIHN0aWxsICAgc3VwcG9ydGVkLCAgYnV0ICAgb25seSAgYWZmZWN0cwotICAgICAgcmVuZGVyaW5nLCBub3QgdGhlIGhpbnRpbmcuCi0KLSAgICAgIE5vdGUgdGhhdCB0aGUgYGZ0dmlldycgIGRlbW8gcHJvZ3JhbSBhdmFpbGFibGUgaW4gdGhlIGBmdDJkZW1vcycKLSAgICAgIHBhY2thZ2UgIGhhcyBiZWVuICB1cGRhdGVkIHRvICBzdXBwb3J0IExDRC1vcHRpbWl6ZWQgIGRpc3BsYXkgb24KLSAgICAgIG5vbi1wYWxldHRlZCBkaXNwbGF5cyAodW5kZXIgV2luMzIgYW5kIFgxMSkuCi0KLSAgICAtIFRoZSAgUEZSICBkcml2ZXIgIG5vdyAgc3VwcG9ydHMgZW1iZWRkZWQgIGJpdG1hcHMgIChhbGwgIGZvcm1hdHMKLSAgICAgIHN1cHBvcnRlZCksIGFuZCByZXR1cm5zIGNvcnJlY3Qga2VybmluZyBtZXRyaWNzIGZvciBhbGwgZ2x5cGhzLgotCi0gICAgLSBUaGUgVHJ1ZVR5cGUgY2hhcm1hcCBsb2FkZXIgIG5vdyBzdXBwb3J0cyBjZXJ0YWluIGBicm9rZW4nIGZvbnRzCi0gICAgICB0aGF0IGxvYWQgdW5kZXIgV2luZG93cyB3aXRob3V0IHByb2JsZW1zLgotCi0gICAgLSBUaGUgY2FjaGUgQVBJIGhhcyBiZWVuIHNsaWdodGx5IG1vZGlmaWVkIChpdCdzIHN0aWxsIGEgYmV0YSEpOgotCi0gICAgICAgLSBUaGUgdHlwZSAgRlRDX0ltYWdlRGVzYyBoYXMgYmVlbiByZW1vdmVkOyBpdCAgaXMgbm93IHJlcGxhY2VkCi0gICAgICAgICBieSAgRlRDX0ltYWdlVHlwZVJlYy4gICBOb3RlIHRoYXQgIG9uZSAgb2YgIGl0cyAgZmllbGRzIGlzICBhCi0gICAgICAgICBgbG9hZF9mbGFnJyBwYXJhbWV0ZXIgZm9yIEZUX0xvYWRfR2x5cGguCi0KLSAgICAgICAtIFRoZSAgZmllbGQgIGBudW1fZ3JheXMnIG9mICBGVF9TQml0UmVjICBoYXMgIGJlZW4gY2hhbmdlZCAgdG8KLSAgICAgICAgIGBtYXhfZ3JheXMnICBpbiAgb3JkZXIgdG8gIGZpdCAgd2l0aGluICBhICBzaW5nbGUgYnl0ZS4gICBJdHMKLSAgICAgICAgIG1heGltdW0gdmFsdWUgaXMgdGh1cyAyNTUgKGluc3RlYWQgb2YgMjU2IGFzIHByZXZpb3VzbHkpLgotCi0KLSAgSUlJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIEFkZGVkIHN1cHBvcnQgIGZvciB0aGUgIERFU1RESVIgdmFyaWFibGUgZHVyaW5nICBgbWFrZSBpbnN0YWxsJy4KLSAgICAgIFRoaXMgc2ltcGxpZmllcyBwYWNrYWdpbmcgb2YgRnJlZVR5cGUuCi0KLSAgICAtIEluY2x1ZGVkIG1vZGlmaWVkICBjb3BpZXMgb2YgdGhlICBaTGliIHNvdXJjZXMgaW4gIGBzcmMvZ3ppcCcgaW4KLSAgICAgIG9yZGVyIHRvIHN1cHBvcnQgIGd6aXAtY29tcHJlc3NlZCBQQ0YgZm9udHMuICBXZSBkbyAgbm90IHVzZSB0aGUKLSAgICAgIHN5c3RlbS1wcm92aWRlZCAgemxpYiAgZm9yICBub3csICAgdGhvdWdoICB0aGlzICBpcyAgYSAgcHJvYmFibGUKLSAgICAgIGVuaGFuY2VtZW50IGZvciBmdXR1cmUgcmVsZWFzZXMuCi0KLSAgICAtIFRoZSBEb2NNYWtlciB0b29sIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIG9uLWxpbmUgQVBJIHJlZmVyZW5jZSBoYXMKLSAgICAgIGJlZW4gICBjb21wbGV0ZWx5ICAgIHJld3JpdHRlbi4gICAgSXQgICBpcyAgICBub3cgICBsb2NhdGVkICAgaW4KLSAgICAgIGBzcmMvdG9vbHMvZG9jbWFrZXIvZG9jbWFrZXIucHknLiAgRmVhdHVyZXM6Ci0KLSAgICAgICAgLSBiZXR0ZXIgY3Jvc3MtcmVmZXJlbmNlZCBvdXRwdXQKLSAgICAgICAgLSBtb3JlIHBvbGlzaGVkIG91dHB1dAotICAgICAgICAtIHVzZXMgUHl0aG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMgICh0aG91Z2ggaXQgZGlkbid0IHNwZWVkIHRoZQotICAgICAgICAgIHByb2dyYW0pCi0gICAgICAgIC0gbXVjaCAgbW9yZSAgbW9kdWxhciBzdHJ1Y3R1cmUsICB3aGljaCAgYWxsb3dzIGZvciAgZGlmZmVyZW50Ci0gICAgICAgICAgYGJhY2tlbmRzJyAgaW4gIG9yZGVyIHRvICBnZW5lcmF0ZSAgSFRNTCwgIFhNTCwgb3IgIHdoYXRldmVyCi0gICAgICAgICAgZm9ybWF0LgotCi0gICAgICBPbmUgY2FuIHJlZ2VuZXJhdGUgdGhlIEFQSSByZWZlcmVuY2UgYnkgY2FsbGluZzoKLQotICAgICAgICAgcHl0aG9uIHNyYy90b29scy9kb2NtYWtlci9kb2NtYWtlci5weSBcCi0gICAgICAgICAgICAgICAgLS1wcmVmaXg9ZnQyIFwKLSAgICAgICAgICAgICAgICAtLXRpdGxlPUZyZWVUeXBlLTIuMS4zIFwKLSAgICAgICAgICAgICAgICAtLW91dHB1dD08b3V0cHV0ZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIGluY2x1ZGUvZnJlZXR5cGUvKi5oIFwKLSAgICAgICAgICAgICAgICBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy8qLmggXAotICAgICAgICAgICAgICAgIGluY2x1ZGUvZnJlZXR5cGUvY2FjaGUvKi5oCi0KLSAgICAtIEEgbmV3LCBleHBlcmltZW50YWwsIHN1cHBvcnQgZm9yIGluY3JlbWVudGFsIGZvbnQgbG9hZGluZyAoaS5lLiwKLSAgICAgIGxvYWRpbmcgIG9mIGZvbnRzICB3aGVyZSB0aGUgIGdseXBocyBhcmUgIG5vdCBpbiAgdGhlICBmb250IGZpbGUKLSAgICAgIGl0c2VsZiwgYnV0IHByb3ZpZGVkIGJ5IGFuIGV4dGVybmFsIGNvbXBvbmVudCwgbGlrZSBhIFBvc3RzY3JpcHQKLSAgICAgIGludGVycHJldGVyKSBoYXMgYmVlbiBhZGRlZCBieSBHcmFoYW0gQXNoZXIuICBUaGlzIGlzIHN0aWxsIHdvcmsKLSAgICAgIGluIHByb2dyZXNzLCBob3dldmVyLgotCi0gICAgLSBBIG5ldywgIEVYUEVSSU1FTlRBTCwgcGF0aCBzdHJva2VyICBoYXMgYmVlbiBhZGRlZC4gICBJdCBkb2Vzbid0Ci0gICAgICBzdWZmZXIgIGZyb20gIHNldmVyZSAgcm91bmRpbmcgIGVycm9ycyAgYW5kICB0cmVhdCAgYmV6aWVyICBhcmNzCi0gICAgICBkaXJlY3RseS4gIFN0aWxsIHdvcmsgaW4gcHJvZ3Jlc3MgKGkuZS4gbm90IHBhcnQgb2YgdGhlIG9mZmljaWFsCi0gICAgICBBUEkpLiAgIFNlZSAgdGhlIGZpbGUgIDxmcmVldHlwZS9mdHN0cm9rZXIuaD4gIGZvciAgc29tZSBvZiAgdGhlCi0gICAgICBkZXRhaWxzLgotCi0gICAgLSBUaGUgbWFzc2l2ZSAgcmUtZm9ybWF0dGluZyBvZiBzb3VyY2VzIGFuZCAgaW50ZXJuYWwgcmUtZGVzaWduIGlzCi0gICAgICBzdGlsbCB1bmRlci13YXkuICBNYW55ICBpbnRlcm5hbCBmdW5jdGlvbnMsIGNvbnN0YW50cywgYW5kIHR5cGVzCi0gICAgICBoYXZlIGJlZW4gcmVuYW1lZC4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjEuMiBhbmQgMi4xLjEKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIE1hbnkgIGZvbnQgZHJpdmVycyBkaWRuJ3QgIHNlbGVjdCBhICBVbmljb2RlIGNoYXJtYXAgIGJ5IGRlZmF1bHQKLSAgICAgIHdoZW4gYSBuZXcgZmFjZSAgd2FzIG9wZW5lZCAod2l0aCB0aGUgRlRfQ09ORklHX09QVElPTl9VU0VfQ01BUFMKLSAgICAgIG9wdGlvbnMgZW5hYmxlZCksICBjYXVzaW5nIG1hbnkgYXBwbGljYXRpb25zICB0byBub3QgYmUgIGFibGUgdG8KLSAgICAgIGRpc3BsYXkgdGV4dCBjb3JyZWN0bHkgd2l0aCB0aGUgMi4xLnggcmVsZWFzZXMuCi0KLSAgICAtIFRoZSAgUEZSIGRyaXZlciBoYWQgIGEgYnVnICBpbiBpdHMgIGNvbXBvc2l0ZSBsb2FkaW5nICBjb2RlIHRoYXQKLSAgICAgIHByb2R1Y2VzIGluY29ycmVjdGx5IHBsYWNlZCBhY2NlbnRzIHdpdGggbWFueSBmb250cy4KLQotICAgIC0gVGhlIFR5cGU0MiBkcml2ZXIgY3Jhc2hlZCBzb21ldGltZXMgZHVlIHRvIGEgbmFzdHkgYnVnLgotCi0gICAgLSBUaGUgVHlwZSAxIGN1c3RvbSBlbmNvZGluZyAgY2hhcm1hcCBkaWRuJ3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlCi0gICAgICB0aGUgZmlyc3QgZ2x5cGggaW5kZXggd2Fzbid0IDAuCi0KLSAgICAtIEEgIHNlcmlvdXMgIHR5cG8gIGluICB0aGUgIFRydWVUeXBlICBjb21wb3NpdGUgIGxvYWRlciAgcHJvZHVjZWQKLSAgICAgIGluY29ycmVjdGx5IHBsYWNlZCAgZ2x5cGhzIGluIGZvbnRzICBsaWtlIGBXaW5nZGluZ3MnIGFuZCAgYSBmZXcKLSAgICAgIG90aGVycy4KLQotCi0gIElJLiBNSVNDRUxMQU5FT1VTCi0KLSAgICAtIFRoZSBXaW4zMiAgVmlzdWFsIEMrKyBwcm9qZWN0ICBmaWxlIGhhcyBiZWVuIHVwZGF0ZWQgIHRvIGluY2x1ZGUKLSAgICAgIHRoZSBQRlIgZHJpdmVyIGFzIHdlbGwuCi0KLSAgICAtIGBmcmVldHlwZS5tNCcgaXMgIG5vdyBpbnN0YWxsZWQgYnkgZGVmYXVsdCBieSAgYG1ha2UgaW5zdGFsbCcgb24KLSAgICAgIFVuaXggc3lzdGVtcy4KLQotICAgIC0gVGhlIGZ1bmN0aW9uICBGVF9HZXRfUFNfRm9udF9JbmZvIG5vdyB3b3JrcyB3aXRoICBDSUQgYW5kIFR5cGU0MgotICAgICAgZm9udHMgYXMgd2VsbC4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjEuMSBhbmQgMi4xLjAKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIFRoZSAgYHZlcnNpb25faW5mbycgIHJldHVybmVkICAgYnkgIGBmcmVldHlwZS1jb25maWcnICBpbiAgMi4xLjAKLSAgICAgIHJldHVybmVkIGFuIGludmFsaWQgdmFsdWUuICBJdCBub3cgcmV0dXJucyA5OjE6MyAoMi4wLjkgcmV0dXJuZWQKLSAgICAgIDk6MDozKS4KLQotICAgIC0gVmVyc2lvbiAyLjEuMCAgY291bGRuJ3QgYmUgbGlua2VkIGFnYWluc3QgIGFwcGxpY2F0aW9ucyBvbiBXaW4zMgotICAgICAgYW5kICBBbWlnYSBzeXN0ZW1zICBkdWUgIHRvICBhIG5ldyAgZGVidWcgIGZ1bmN0aW9uIHRoYXQgIHdhc24ndAotICAgICAgcHJvcGVybHkgICBwcm9wYWdhdGVkICB0byAgIHRoZSAgc3lzdGVtLXNwZWNpZmljICAgZGlyZWN0b3J5ICBpbgotICAgICAgYGJ1aWxkcycuCi0KLSAgICAtIFZhcmlvdXMgTWFjT1MgYW5kIE1hYyBPUyBYIHNwZWNpZmljIGZpeGVzLgotCi0gICAgLSBGaXhlZCAgYSBidWcgaW4gIHRoZSBUcnVlVHlwZSAgY2hhcm1hcCB2YWxpZGF0aW9uICByb3V0aW5lcyB0aGF0Ci0gICAgICBtYWRlIHZlcnNpb24gIDIuMS4wIHRvbyByZXN0cmljdGl2ZSAgLS0gbWFueSBwb3B1bGFyICBmb250cyBoYXZlCi0gICAgICBiZWVuIHJlamVjdGVkLgotCi0gICAgLSBUaGVyZSB3YXMgIHN0aWxsIGEgdmVyeSBzbWFsbCBkaWZmZXJlbmNlICBiZXR3ZWVuIHRoZSBtb25vY2hyb21lCi0gICAgICBnbHlwaCBiaXRtYXBzIHByb2R1Y2VkIGJ5IEZyZWVUeXBlIDEueCBhbmQgRnJlZVR5cGUgMi54IHdpdGggdGhlCi0gICAgICBieXRlY29kZSAgaW50ZXJwcmV0ZXIgZW5hYmxlZC4gICBUaGlzIHdhcyAgY2F1c2VkIGJ5ICBhbiBpbnZhbGlkCi0gICAgICBmbGFnIHNldHRpbmcgaW4gdGhlIFRydWVUeXBlIGdseXBoIGxvYWRlciwgbWFraW5nIHRoZSByYXN0ZXJpemVyCi0gICAgICBjaGFuZ2UgIGl0cyAgZHJvcC1vdXQgICBjb250cm9sICBtb2RlLiAgIE5vdyAgdGhlIHJlc3VsdHMgc2hvdWxkCi0gICAgICBfcmVhbGx5XyBiZSBjb21wbGV0ZWx5IGlkZW50aWNhbC4KLQotICAgIC0gVGhlIFRydWVUeXBlIG5hbWUgdGFibGUgbG9hZGVyIGhhcyBiZWVuIGltcHJvdmVkIHRvIHN1cHBvcnQgbWFueQotICAgICAgcG9wdWxhciAgdGhvdWdoIGJ1Z2d5IEFzaWFuICBmb250cy4gIEl0ICBub3cgaWdub3JlcyAgZW1wdHkgbmFtZQotICAgICAgZW50cmllcywgIGludmFsaWQgIHBvaW50ZXIgb2Zmc2V0cyAgYW5kICBhICBmZXcgb3RoZXIgIGluY29ycmVjdAotICAgICAgc3VidGxldGllcy4gIE1vcmVvdmVyLCAgbmFtZSBzdHJpbmdzICBhcmUgbm93IGxvYWRlZCAgb24gZGVtYW5kLAotICAgICAgd2hpY2ggcmVkdWNlcyB0aGUgbWVtb3J5IGxvYWQgIG9mIG1hbnkgZmFjZXMgKGUuZy4gdGhlIEFSSUFMLlRURgotICAgICAgZm9udCBmaWxlIGNvbnRhaW5zIGEgMTBrQnl0ZSBuYW1lIHRhYmxlIHdpdGggNzAgbmFtZXMpLgotCi0gICAgLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgUG9zdHNjcmlwdCBoaW50ZXIgdGhhdCBwcmV2ZW50ZWQgZmFtaWx5IGJsdWVzCi0gICAgICBzdWJzdGl0dXRpb24gdG8gaGFwcGVuIGNvcnJlY3RseS4KLQotCi0gIElJLiBORVcgRkVBVFVSRVMKLQotICAgIC0gVGhyZWUgbmV3IGZvbnQgZHJpdmVycyBpbiB0aGlzIHJlbGVhc2U6Ci0KLSAgICAgICogQSAgQkRGICBmb250IGRyaXZlciwgIGNvbnRyaWJ1dGVkICBieSAgRnJhbmNvIFphcHBhICBOYXJkZWxsaSwKLSAgICAgICAgaGVhdmlseSAgbW9kaWZpZWQgICBieSAgV2VybmVyICBMZW1iZXJnLiAgICBJdCAgYWxzbyAgc3VwcG9ydHMKLSAgICAgICAgYW50aS1hbGlhc2VkIGJpdG1hcHMgKHVzaW5nIGEgc2xpZ2h0bHkgZXh0ZW5kZWQgQkRGIGZvcm1hdCkuCi0KLSAgICAgICogQSBUeXBlNDIgIGZvbnQgZHJpdmVyLCBjb250cmlidXRlZCBieSBSb2JlcnRvICBBbGFtZWRhLiAgSXQgaXMKLSAgICAgICAgc3RpbGwgZXhwZXJpbWVudGFsIGJ1dCBzZWVtcyB0byB3b3JrIHJlbGF0aXZlbHkgd2VsbC4KLQotICAgICAgKiBBIFBGUiAgZm9udCBkcml2ZXIsIGNvbnRyaWJ1dGVkICBieSBEYXZpZCBUdXJuZXIgIGhpbXNlbGYuICBJdAotICAgICAgICBkb2Vzbid0ICBzdXBwb3J0IFBGUiAgaGludGluZyAtLSAgbm90ZSB0aGF0ICBCaXRTdHJlYW0gIGhhcyBhdAotICAgICAgICBsZWFzdCB0d28gcGF0ZW50cyBvbiB0aGlzIGZvcm1hdCEKLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBUaGUgIGNhY2hlICBzdWItc3lzdGVtIGhhcyAgYmVlbiAgb3B0aW1pemVkICBpbiBpbXBvcnRhbnQgIHdheXMuCi0gICAgICBDYWNoZSBoaXRzIGFyZSBub3cgc2lnbmlmaWNhbnRseSBmYXN0ZXIuICBGb3IgZXhhbXBsZSwgdXNpbmcgdGhlCi0gICAgICBDTWFwIGNhY2hlIGlzIGFib3V0ICB0d2ljZSBmYXN0ZXIgdGhhbiBjYWxsaW5nIEZUX0dldF9DaGFyX0luZGV4Ci0gICAgICBvbiBtb3N0IHBsYXRmb3Jtcy4gIFNpbWlsYXJseSwgdXNpbmcgYW4gU0JpdCBjYWNoZSBpcyBhYm91dCBmaXZlCi0gICAgICB0aW1lcyBmYXN0ZXIgIHRoYW4gbG9hZGluZyB0aGUgIGJpdG1hcHMgZnJvbSBhIGJpdG1hcCAgZmlsZSwgYW5kCi0gICAgICAzMDAgdG8gIDUwMCB0aW1lcyAgZmFzdGVyIHRoYW4gZ2VuZXJhdGluZyAgdGhlbSBmcm9tICBhIHNjYWxhYmxlCi0gICAgICBmb3JtYXQuCi0KLSAgICAgIE5vdGUgdGhhdCAgeW91IHNob3VsZCByZWNvbXBpbGUgIHlvdXIgc291cmNlcyBpZiB5b3UgIGRlc2lnbmVkIGEKLSAgICAgIGN1c3RvbSAgY2FjaGUgIGNsYXNzIGZvciAgdGhlICBGVDIgIENhY2hlICBzdWJzeXN0ZW0sIHNpbmNlICB0aGUKLSAgICAgIGNoYW5nZXMgcGVyZm9ybWVkIGFyZSBzb3VyY2UsIGJ1dCBub3QgYmluYXJ5LCBjb21wYXRpYmxlLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuMS4wIGFuZCAyLjAuOQotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gVGhlICBUcnVlVHlwZSBieXRlY29kZSAgaW50ZXJwcmV0ZXIgIGhhcyBiZWVuICBmaXhlZCB0byAgcHJvZHVjZQotICAgICAgX2V4YWN0bHlfIHRoZSBzYW1lIG91dHB1dCBhcyBGcmVlVHlwZSAxLnguICBQcmV2aW91cyBkaWZmZXJlbmNlcwotICAgICAgd2VyZSBkdWUgIHRvIHNsaWdodGx5IGRpc3RpbmN0ICBmaXhlZC1wb2ludCBjb21wdXRhdGlvbiByb3V0aW5lcwotICAgICAgdXNlZCB0byBwZXJmb3JtIGRvdCBwcm9kdWN0cyBhbmQgdmVjdG9yIGxlbmd0aCBtZWFzdXJlbWVudHMuCi0KLSAgICAgIEl0IHNlZW1zICB0aGF0IG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nICBpcyBfZXh0cmVtZWx5XyBzZW5zaXRpdmUKLSAgICAgIHRvICByb3VuZGluZyBlcnJvcnMuICBUaGUgIHJlcXVpcmVkIHZlY3RvciAgY29tcHV0YXRpb24gcm91dGluZXMKLSAgICAgIGhhdmUgYmVlbiBvcHRpbWl6ZWQgYW5kIHBsYWNlZCB3aXRoaW4gdGhlIGB0dGludGVycC5jJyBmaWxlLgotCi0gICAgLSBGaXhlZCB0aGUgcGFyc2luZyBvZiBhY2NlbGVyYXRvciB0YWJsZXMgaW4gdGhlIFBDRiBmb250IGRyaXZlci4KLQotICAgIC0gRml4ZWQgdGhlIFR5cGUxIGdseXBoIGxvYWRlciAgcm91dGluZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGZvbnQncwotICAgICAgbWF4aW11bSBhZHZhbmNlIHdpZHRoLgotCi0KLSAgSUkuIE5FVyBGRUFUVVJFUwotCi0gICAgLSBUaGUgYGNvbmZpZ3VyZScgc2NyaXB0IHVzZWQgb24gVW5peCBzeXN0ZW1zIGhhcyBiZWVuIG1vZGlmaWVkIHRvCi0gICAgICBjaGVjayAgdGhhdCAgR05VICBNYWtlICBpcyAgYmVpbmcgdXNlZCAgdG8gIGJ1aWxkICB0aGUgIGxpYnJhcnkuCi0gICAgICBPdGhlcndpc2UsICBpdCAgd2lsbCBkaXNwbGF5ICBhICBtZXNzYWdlICBwcm9wb3NpbmcgIHRvIHVzZSAgdGhlCi0gICAgICBHTlVNQUtFIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG5hbWUgaXQuCi0KLSAgICAgIFRoZSBVbml4LXNwZWNpZmljIGZpbGUgUkVBRE1FLlVOWCBoYXMgYmVlbiBtb2RpZmllZCBhY2NvcmRpbmdseS4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBUaGUgIEZyZWVUeXBlICBMaWNlbnNlIGluICBgZG9jcy9GVEwuVFhUJyAgaGFzICBiZWVuIHVwZGF0ZWQgIHRvCi0gICAgICBpbmNsdWRlICBhICBwcm9wb3NlZCBwcmVmZXJyZWQgIGRpc2NsYWltZXIuICAgSWYgIHlvdSBhcmUgIHVzaW5nCi0gICAgICBGcmVlVHlwZSBpbiB5b3VyIHByb2R1Y3RzLCB5b3UgYXJlIGVuY291cmFnZWQgKGJ1dCBub3QgbWFuZGF0ZWQpCi0gICAgICB0byB1c2UgdGhlIGZvbGxvd2luZyB0ZXh0IGluIHlvdXIgZG9jdW1lbnRhdGlvbjoKLQotICAgICAgIiIiCi0gICAgICAgIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGNvcHlyaWdodCDCqSAxOTk2LTIwMDIgVGhlCi0gICAgICAgIEZyZWVUeXBlIFByb2plY3QgKHd3dy5mcmVldHlwZS5vcmcpLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgICIiIgotCi0gICAgLSBUaGUgZGVmYXVsdCBzaXplIG9mIHRoZSByZW5kZXIgcG9vbCBoYXMgYmVlbiByZWR1Y2VkIHRvIDE2a0J5dGUuCi0gICAgICBUaGlzICBzaG91bGRuJ3QgcmVzdWx0ICBpbiBhbnkgIG5vdGljZWFibGUgIHBlcmZvcm1hbmNlIHBlbmFsdHksCi0gICAgICB1bmxlc3MgeW91IGFyZSAgdXNpbmcgdGhlIGVuZ2luZSBhcy1pcyB0byAgcmVuZGVyIHZlcnkgbGFyZ2UgYW5kCi0gICAgICBjb21wbGV4IGdseXBocy4KLQotICAgIC0gVGhlICBGcmVlVHlwZSAyICByZWRlc2lnbiBoYXMgIGJlZ3VuLiAgTW9yZSAgaW5mb3JtYXRpb24gIGNhbiBiZQotICAgICAgZm91bmQgYXQgdGhpcyBVUkw6Ci0KLSAgICAgICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvZnJlZXR5cGUyL3JlZGVzaWduLmh0bWwKLQotICAgICAgVGhlIGZvbGxvd2luZyAgaW50ZXJuYWwgY2hhbmdlcyAgaGF2ZSBiZWVuIHBlcmZvcm1lZCAgd2l0aGluIHRoZQotICAgICAgc291cmNlcyBvZiB0aGlzIHJlbGVhc2U6Ci0KLSAgICAgICAgLSBNYW55ICAgaW50ZXJuYWwgIHR5cGVzICAgaGF2ZSAgYmVlbiAgIHJlbmFtZWQgICB0byAgaW5jcmVhc2UKLSAgICAgICAgICBjb25zaXN0ZW5jeS4gICBUaGUgIGZvbGxvd2luZyAgc2hvdWxkICBiZSB0cnVlLCAgZXhjZXB0ICBmb3IKLSAgICAgICAgICBwdWJsaWMgdHlwZXM6Ci0KLSAgICAgICAgICAgICogQWxsIHN0cnVjdHVyZSAgdHlwZXMgaGF2ZSBhIG5hbWUgZW5kaW5nICBpbiBgUmVjJyAoc2hvcnQKLSAgICAgICAgICAgICAgZm9yIGByZWNvcmQnKS4KLQotICAgICAgICAgICAgKiBBICBwb2ludGVyLXRvLXN0cnVjdHVyZSB0eXBlICBoYXMgdGhlICBzYW1lIG5hbWUgIGFzIHRoZQotICAgICAgICAgICAgICBzdHJ1Y3R1cmUsIF93aXRob3V0XyB0aGUgYFJlYycgc3VmZml4LgotCi0gICAgICAgICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBGb29SZWNfCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLi4uCi0KLSAgICAgICAgICAgICAgICB9IEZvb1JlYywgKkZvbzsKLQotICAgICAgICAtIE1hbnkgICBpbnRlcm5hbCAgbWFjcm9zICBoYXZlICAgYmVlbiAgcmVuYW1lZCAgIHRvICBpbmNyZWFzZQotICAgICAgICAgIGNvbnNpc3RlbmN5LiAgVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgdHJ1ZToKLQotICAgICAgICAgICAgKiBBbGwgIG1hY3JvcyAgaGF2ZSBhICBuYW1lICBiZWdpbm5pbmcgIHdpdGggYEZUXycuICAgVGhpcwotICAgICAgICAgICAgICByZXF1aXJlZCBhIGZldyBjaGFuZ2VzIGxpa2UKLQotICAgICAgICAgICAgICAgIEFMTE9DICAgPT4gRlRfQUxMT0MKLSAgICAgICAgICAgICAgICBGUkVFICAgID0+IEZUX0ZSRUUKLSAgICAgICAgICAgICAgICBSRUFMTE9DID0+IEZUX1JFQUxMT0MKLQotICAgICAgICAgICAgKiBBbGwgIG1hY3JvcyBhcmUgY29tcGxldGVseSAgVVBQRVJDQVNFLiAgVGhpcyAgcmVxdWlyZWQgYQotICAgICAgICAgICAgICBmZXcgY2hhbmdlcyBsaWtlOgotCi0gICAgICAgICAgICAgICAgUkVBRF9TaG9ydCAgPT4gRlRfUkVBRF9TSE9SVAotICAgICAgICAgICAgICAgIE5FWFRfU2hvcnQgID0+IEZUX05FWFRfU0hPUlQKLSAgICAgICAgICAgICAgICBHRVRfVUxvbmdMRSA9PiBGVF9HRVRfVUxPTkdfTEUKLSAgICAgICAgICAgICAgICBNRU1fU2V0ICAgICA9PiBGVF9NRU1fU0VUCi0gICAgICAgICAgICAgICAgTUVNX0NvcHkgICAgPT4gRlRfTUVNX0NPUFkKLSAgICAgICAgICAgICAgICBldGMuCi0KLSAgICAgICAgICAgICogV2hlbmV2ZXIgICBwb3NzaWJsZSwgICBhbGwgICBtYWNybyAgbmFtZXMgICBmb2xsb3cgICB0aGUKLSAgICAgICAgICAgICAgRlRfPE9CSkVDVD5fPE1FVEhPRD4gcGF0dGVybi4gIEZvciBleGFtcGxlCi0KLSAgICAgICAgICAgICAgICBBQ0NFU1NfRnJhbWUgICA9PiBGVF9GUkFNRV9FTlRFUgotICAgICAgICAgICAgICAgIEZPUkdFVF9GcmFtZSAgID0+IEZUX0ZSQU1FX0VYSVQKLSAgICAgICAgICAgICAgICBFWFRSQUNUX0ZyYW1lICA9PiBGVF9GUkFNRV9FWFRSQUNUCi0gICAgICAgICAgICAgICAgUkVMRUFTRV9GcmFtZSAgPT4gRlRfRlJBTUVfUkVMRUFTRQotCi0gICAgICAgICAgICAgICAgRklMRV9Qb3MgICAgICAgPT4gRlRfU1RSRUFNX1BPUwotICAgICAgICAgICAgICAgIEZJTEVfU2VlayAgICAgID0+IEZUX1NUUkVBTV9TRUVLCi0gICAgICAgICAgICAgICAgRklMRV9SZWFkICAgICAgPT4gRlRfU1RSRUFNX1JFQUQKLSAgICAgICAgICAgICAgICBGSUxFX1JlYWRBdCAgICA9PiBGVF9TVFJFQU1fUkVBRF9BVAotICAgICAgICAgICAgICAgIFJFQURfRmllbGRzICAgID0+IEZUX1NUUkVBTV9SRUFEX0ZJRUxEUwotCi0gICAgICAgIC0gTWFueSAgaW50ZXJuYWwgZnVuY3Rpb25zICBoYXZlICBiZWVuIHJlbmFtZWQgIHRvIGZvbGxvdyAgdGhlCi0gICAgICAgICAgRlRfPE9iamVjdD5fPE1ldGhvZD4gcGF0dGVybi4gIEZvciBleGFtcGxlOgotCi0gICAgICAgICAgICBGVF9TZWVrX1N0cmVhbSAgICAgICA9PiBGVF9TdHJlYW1fU2VlawotICAgICAgICAgICAgRlRfUmVhZF9TdHJlYW1fQXQgICAgPT4gRlRfU3RyZWFtX1JlYWRBdAotICAgICAgICAgICAgRlRfRG9uZV9TdHJlYW0gICAgICAgPT4gRlRfU3RyZWFtX0Nsb3NlCi0gICAgICAgICAgICBGVF9OZXdfU3RyZWFtICAgICAgICA9PiBGVF9TdHJlYW1fT3BlbgotICAgICAgICAgICAgRlRfTmV3X01lbW9yeV9TdHJlYW0gPT4gRlRfU3RyZWFtX09wZW5NZW1vcnkKLSAgICAgICAgICAgIEZUX0V4dHJhY3RfRnJhbWUgICAgID0+IEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUKLQotICAgICAgICAgIE5vdGUgdGhhdCBtZXRob2QgbmFtZXMgZG8gbm90IGNvbnRhaW4gYF8nLgotCi0gICAgICAgIC0gVGhlIEZUX0FMTE9DX0FSUkFZICBhbmQgRlRfUkVBTExPQ19BUlJBWSBoYXZlICBiZWVuIHJlcGxhY2VkCi0gICAgICAgICAgd2l0aCAgRlRfTkVXX0FSUkFZIGFuZCAgRlRfUkVORVdfQVJSQVkgd2hpY2ggIGRvIG5vdCAgdGFrZSBhCi0gICAgICAgICAgdHlwZSAgYXMgdGhlICBmb3VydGggYXJndW1lbnQuICAgSW5zdGVhZCwgdGhlICBhcnJheSBlbGVtZW50Ci0gICAgICAgICAgdHlwZSAgc2l6ZSBpcyBjb21wdXRlZCAgYXV0b21hdGljYWxseSBmcm9tICB0aGUgdHlwZSAgb2YgdGhlCi0gICAgICAgICAgdGFyZ2V0IHBvaW50ZXIgdXNlZC4KLQotICAgICAgICAtIEEgIG5ldyBvYmplY3QgIGNsYXNzLCBGVF9DTWFwLCAgaGFzIGJlZW4gIGludHJvZHVjZWQuICBUaGVzZQotICAgICAgICAgIGludGVybmFsICBvYmplY3RzIGFyZSAgdXNlZCB0byAgbW9kZWwgY2hhcmFjdGVyICBtYXBzLiAgVGhpcwotICAgICAgICAgIGVhc2VzICB0aGUgc3VwcG9ydCAgb2YgYWRkaXRpb25hbCAgY2hhcm1hcCB0eXBlcyAgd2l0aGluIHRoZQotICAgICAgICAgIGVuZ2luZS4KLQotICAgICAgICAtIEEgbmV3ICBjb25maWd1cmF0aW9uIGZpbGUgbmFtZWQgYGZ0c3RkbGliLmgnICBoYXMgYmVlbiBhZGRlZAotICAgICAgICAgIHRvIGBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZycuICBJdCAgaXMgdXNlZCB0byBkZWZpbmUgYWxpYXNlcwotICAgICAgICAgIGZvciAgX2V2ZXJ5XyByb3V0aW5lICBvZiB0aGUgIElTTyAgQyBsaWJyYXJ5ICB0aGF0IHRoZSAgZm9udAotICAgICAgICAgIGVuZ2luZSAgIHVzZXMuICAgIEVhY2ggICAgYWxpYXNlcyAgIGhhcyAgIGEgICBgZnRfJyAgIHByZWZpeAotICAgICAgICAgIChlLmcuIGBmdF9zdHJsZW4nIGlzIGFuIGFsaWFzIGZvciBgc3RybGVuJykuCi0KLSAgICAgICAgICBUaGlzIGlzICB1c2VkIHRvICBlYXNlIHRoZSBwb3J0aW5nICBvZiBGcmVlVHlwZSAyICB0byBleG90aWMKLSAgICAgICAgICBydW50aW1lIGVudmlyb25tZW50cyB3aGVyZSB0aGUgSVNPIEMgTGlicmFyeSBpc24ndCBhdmFpbGFibGUKLSAgICAgICAgICAoZS5nLiAgWEZyZWU4NiBleHRlbnNpb24gbW9kdWxlcykuCi0KLSAgICAgIE1vcmUgZGV0YWlscyBhcmUgYXZhaWxhYmxlIGluIHRoZSBgQ2hhbmdlTG9nJyBmaWxlLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuMC45IGFuZCAyLjAuOAotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gQ2VydGFpbiBmb250cyBsaWtlIGBmb3hqdW1wLnR0ZicgY29udGFpbiBicm9rZW4gbmFtZSB0YWJsZXMgd2l0aAotICAgICAgaW52YWxpZCBlbnRyaWVzIGFuZCB3aWxkIG9mZnNldHMuICBUaGlzIGNhdXNlZCBGcmVlVHlwZSB0byBjcmFzaAotICAgICAgd2hlbiB0cnlpbmcgdG8gbG9hZCB0aGVtLgotCi0gICAgICBUaGUgIFNGTlQgYG5hbWUnICB0YWJsZSAgbG9hZGVyIGhhcyAgYmVlbiAgZml4ZWQgdG8gIGJlIGFibGUgIHRvCi0gICAgICBzdXBwb3J0IHRoZXNlIHN0cmFuZ2UgZm9udHMuCi0KLSAgICAgIE1vcmVvdmVyLCB0aGUgY29kZSAgaW4gY2hhcmdlIG9mIHByb2Nlc3NpbmcgdGhpcyAgdGFibGUgaGFzIGJlZW4KLSAgICAgIGNoYW5nZWQgIHRvIGFsd2F5cyBmYXZvdXIgIFdpbmRvd3MtZm9ybWF0dGVkIGVudHJpZXMgIG92ZXIgb3RoZXIKLSAgICAgIG9uZXMuICBIZW5jZSwgIGEgZm9udCB0aGF0IHdvcmtzICBvbiBXaW5kb3dzIGJ1dCBub3QgIG9uIHRoZSBNYWMKLSAgICAgIHdpbGwgIGxvYWQgY2xlYW5seSBpbiAgRnJlZVR5cGUgYW5kICByZXBvcnQgYWNjdXJhdGUgIHZhbHVlcyBmb3IKLSAgICAgIEZhbWlseSAmIFBvc3RTY3JpcHQgbmFtZXMuCi0KLSAgICAtIFRoZSBDSUQgZm9udCBkcml2ZXIgaGFzIGJlZW4gZml4ZWQuICBJdCB1bmZvcnR1bmF0ZWx5IHJldHVybmVkIGEKLSAgICAgIFBvc3RzY3JpcHQgICBGb250ICAgbmFtZSAgIHdpdGggICBhICAgbGVhZGluZyAgIHNsYXNoLCAgIGFzICAgaW4KLSAgICAgIGAvTXVuaHdhR290aGljLVJlZ3VsYXInLgotCi0gICAgLSBGcmVlVHlwZSAgMiBzaG91bGQgbm93ICBjb21waWxlIGZpbmUgIG9uIEFJWCAgNC4zLjMgYXMgIGEgc2hhcmVkCi0gICAgICBsaWJyYXJ5LgotCi0gICAgLSBBICBidWcgIGluIHRoZSAgUG9zdHNjcmlwdCAgaGludGVyICBoYXMgIGJlZW4gZm91bmQgIGFuZCAgZml4ZWQsCi0gICAgICByZW1vdmluZyB1bi1ldmVuIHN0ZW0gd2lkdGhzIGF0IHNtYWxsIHBpeGVsIHNpemVzIChsaWtlIDE0LTE3KS4KLQotICAgICAgVGhpcyAgaW1wcm92ZXMgdGhlICBxdWFsaXR5IG9mICBhIGNlcnRhaW4gIG51bWJlciAgb2YgUG9zdHNjcmlwdAotICAgICAgZm9udHMuCi0KLQotICBJSS4gTkVXIEZFQVRVUkVTCi0KLSAgICAtIEEgIG5ldyBmdW5jdGlvbiAgbmFtZWQgIGBGVF9MaWJyYXJ5X1ZlcnNpb24nIGhhcyAgYmVlbiBhZGRlZCAgdG8KLSAgICAgIHJldHVybiAgdGhlIGN1cnJlbnQgIGxpYnJhcnkncyBtYWpvciwgIG1pbm9yLCBhbmQgIHBhdGNoIHZlcnNpb24KLSAgICAgIG51bWJlcnMuICAgVGhpcyBpcyAgaW1wb3J0YW50IHNpbmNlICB0aGUgIG1hY3JvcyBGUkVFVFlQRV9NQUpPUiwKLSAgICAgIEZSRUVUWVBFX01JTk9SLCAgYW5kICBGUkVFVFlQRV9QQVRDSCAgY2Fubm90ICBiZSB1c2VkICB3aGVuICB0aGUKLSAgICAgIGxpYnJhcnkgaXMgZHluYW1pY2FsbHkgbGlua2VkIGJ5IGEgcHJvZ3JhbS4KLQotICAgIC0gVHdvICAgbmV3ICBBUElzICAgaGF2ZSAgYmVlbiAgIGFkZGVkOiAgIGBGVF9HZXRfRmlyc3RfQ2hhcicgIGFuZAotICAgICAgYEZUX0dldF9OZXh0X0NoYXInLgotCi0gICAgICBUb2dldGhlciwgIHRoZXNlIGNhbiAgYmUgdXNlZCAgdG8gaXRlcmF0ZSAgZWZmaWNpZW50bHkgIG92ZXIgdGhlCi0gICAgICBjdXJyZW50bHkgIHNlbGVjdGVkICBjaGFybWFwIG9mICBhICBnaXZlbiAgZmFjZS4gICBSZWFkIHRoZSAgQVBJCi0gICAgICByZWZlcmVuY2UgZm9yIG1vcmUgZGV0YWlscy4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBUaGUgRnJlZVR5cGUgc291cmNlcyBhcmUgIHVuZGVyIGhlYXZ5IGludGVybmFsIHJlLWZhY3RvcmluZy4gIEFzCi0gICAgICBhIGNvbnNlcXVlbmNlLCAgd2UgaGF2ZSBjcmVhdGVkICBhIGJyYW5jaCBuYW1lZCBgU1RBQkxFJyAgb24gdGhlCi0gICAgICBDVlMgdG8gaG9sZCBhbGwgZnV0dXJlIHJlbGVhc2VzL2ZpeGVzIGluIHRoZSAyLjAueCBmYW1pbHkuCi0KLSAgICAgIFRoZSAgSEVBRCAgYnJhbmNoICBub3cgIGNvbnRhaW5zICB0aGUgIHJlLWZhY3RvcmVkICBzb3VyY2VzICBhbmQKLSAgICAgIHNob3VsZG4ndCAgYmUgdXNlZCBmb3IgIHRlc3Rpbmcgb3IgIHBhY2thZ2luZyBuZXcgIHJlbGVhc2VzLiAgSW4KLSAgICAgIGNhc2UgeW91ICB3b3VsZCBsaWtlICB0byBhY2Nlc3MgdGhlICAyLjAuOSBzb3VyY2VzIGZyb20gIG91ciBDVlMKLSAgICAgIHJlcG9zaXRvcnksIHVzZSB0aGUgdGFnIGBWRVItMi0wLTknLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuMC44IGFuZCAyLjAuNwotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gVGhlcmUgd2FzICBhIHNtYWxsIGJ1dCAgbmFzdHkgYnVnIGluICBgZnJlZXR5cGUtY29uZmlnLmluJyB3aGljaAotICAgICAgY2F1c2VkIHRoZSBgZnJlZXR5cGUtY29uZmlnJyBzY3JpcHQgdG8gZmFpbCBvbiBVbml4LgotCi0gICAgICBUaGlzIGRpZG4ndCBwcmV2ZW50IHRoZSBpbnN0YWxsYXRpb24gIG9mIHRoZSBsaWJyYXJ5IG9yIGV2ZW4gaXRzCi0gICAgICBleGVjdXRpb24sIGJ1dCBjYXVzZWQgcHJvYmxlbXMgIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgbWFueSBVbml4Ci0gICAgICBwYWNrYWdlcyB0aGF0IGRlcGVuZCBvbiBpdC4KLQotICAgIC0gU29tZSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250cyBlbWJlZGRlZCBpbiBQREYgZG9jdW1lbnRzIGRvIG5vdAotICAgICAgaGF2ZSAgYSAgJ2NtYXAnLCAgJ3Bvc3QnICBhbmQgICduYW1lJyAgYXMgIGlzICByZXF1aXJlZCAgYnkgIHRoZQotICAgICAgc3BlY2lmaWNhdGlvbi4gIEZyZWVUeXBlIG5vIGxvbmdlciByZWZ1c2VzIHRvIGxvYWQgc3VjaCBmb250cy4KLQotICAgIC0gVmFyaW91cyBmaXhlcyB0byB0aGUgUENGIGZvbnQgZHJpdmVyLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuMC43IGFuZCAyLjAuNgotCi0gIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKLQotICAgIC0gRml4ZWQgIHR3byAgYnVncyBpbiAgdGhlICBUeXBlIDEgIGZvbnQgIGRyaXZlci4gICBUaGUgZmlyc3QgIG9uZQotICAgICAgcmVzdWx0ZWQgaW4gYSBtZW1vcnkgbGVhayBpbiBzdWJ0bGUgY2FzZXMuICBUaGUgb3RoZXIgb25lIGNhdXNlZAotICAgICAgRnJlZVR5cGUgdG8gY3Jhc2ggd2hlbiAgdHJ5aW5nIHRvIGxvYWQgYC5nc2YnIGZpbGVzIChHaG9zdHNjcmlwdAotICAgICAgc28tY2FsbGVkIFBvc3RzY3JpcHQgZm9udHMpLgotCi0gICAgICAoVGhpcyAgbWFkZSBfbWFueV8gIEtERSBhcHBsaWNhdGlvbnMgIGNyYXNoIG9uICBjZXJ0YWluIHN5c3RlbXMuCi0gICAgICAgRnJlZVR5cGUgX2lzXyBiZWNvbWluZyBhIGNyaXRpY2FsIHN5c3RlbSBjb21wb25lbnQgb24gTGludXggOi0pCi0KLSAgICAtIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIENGRiBmb250IGRyaXZlci4KLQotICAgIC0gRml4ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgUENGIGZvbnQgZHJpdmVyLgotCi0gICAgLSBGaXhlZCAgICAgICB0aGUgICAgICAgIFZpc3VhbCAgICAgICBDKysgICAgICAgcHJvamVjdCAgICAgICBmaWxlCi0gICAgICBgYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwJyBzaW5jZSAgaXQgZGlkbid0IGluY2x1ZGUgdGhlCi0gICAgICBQb3N0c2NyaXB0IGhpbnRlciBjb21wb25lbnQsIGNhdXNpbmcgZXJyb3JzIGF0IGJ1aWxkIHRpbWUuCi0KLSAgICAtIEZpeGVkIGEgIHNtYWxsIHJlbmRlcmluZyBidWcgIGluIHRoZSBhbnRpLWFsaWFzZWQgIHJlbmRlcmVyIHRoYXQKLSAgICAgIG9ubHkgIG9jY3VycmVkIHdoZW4gIHRyeWluZyB0byAgZHJhdyAgdGhpbiAobGVzcyAgdGhhbiAxICBwaXhlbCkKLSAgICAgIHN0cm9rZXMuCi0KLSAgICAtIEZpeGVkICBgYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmE0JyB3aGljaCAgaXMgdXNlZCAgdG8gIGdlbmVyYXRlIGEKLSAgICAgIHZhbGlkIGBmcmVldHlwZTIubTQnIGZvciB1c2Ugd2l0aCBhdXRvY29uZi4KLQotICAgIC0gRml4ZWQgdGhlIE9wZW5WTVMgTWFrZWZpbGVzLgotCi0KLSAgSUkuIE1JU0NFTExBTkVPVVMKLQotICAgIC0gQWRkZWQgIGBjb25maWd1cmUnICBhbmQgICBgaW5zdGFsbCcgIHNjcmlwdHMgIHRvICB0aGUgIHRvcC1sZXZlbAotICAgICAgZGlyZWN0b3J5LiAgQSBHTlUtc3R5bGUgaW5zdGFsbGF0aW9uIGlzIHRodXMgbm93IGVhc2lseSBwb3NzaWJsZQotICAgICAgd2l0aAotCi0gICAgICAgIC4vY29uZmlndXJlICA8b3B0aW9ucz4KLSAgICAgICAgbWFrZQotICAgICAgICBtYWtlIGluc3RhbGwKLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjAuNiBhbmQgMi4wLjUKLQotICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCi0KLSAgICAtIEl0IHdhc24ndCBwb3NzaWJsZSB0byBsb2FkIGVtYmVkZGVkIGJpdG1hcHMgd2hlbiB0aGUgYXV0by1oaW50ZXIKLSAgICAgIHdhcyB1c2VkLiAgVGhpcyBpcyBub3cgZml4ZWQuCi0KLSAgICAtIFRoZSBUcnVlVHlwZSAgZm9udCBkcml2ZXIgIGRpZG4ndCBsb2FkIHNvbWUgIGNvbXBvc2l0ZXMgcHJvcGVybHkKLSAgICAgICh0aGUgIHN1Yi1nbHlwaHMgIHdlcmUgIHNsaWdodGx5ICBzaGlmdGVkLCAgYW5kICB0aGlzICB3YXMgIG9ubHkKLSAgICAgIG5vdGljZWFibGUgd2hlbiB1c2luZyBtb25vY2hyb21lIHJlbmRlcmluZykuCi0KLSAgICAtIFZhcmlvdXMgIGZpeGVzICB0byB0aGUgIGF1dG8taGludGVyLiAgIFRoZXkgIG1lcmVseSBpbXByb3ZlICB0aGUKLSAgICAgIG91dHB1dCBvZiBzYW5zLXNlcmlmIGZvbnRzLiAgIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcHJvYmxlbXMKLSAgICAgIHdpdGggc2VyaWZlZCBmb250cyBhbmQgY29tcG9zaXRlcyAoYWNjZW50ZWQgY2hhcmFjdGVycykuCi0KLSAgICAtIEFsbCBzY2FsYWJsZSAgZm9udCBkcml2ZXJzIGVycm9uZW91c2x5ICByZXR1cm5lZCB1bi1maXR0ZWQgZ2x5cGgKLSAgICAgIGFkdmFuY2VzIHdoZW4gaGludGluZyB3YXMgIHJlcXVlc3RlZC4gIFRoaXMgY3JlYXRlZCBwcm9ibGVtcyBmb3IKLSAgICAgIGEgbnVtYmVyICBvZiBsYXlvdXQgYXBwbGljYXRpb25zLiAgVGhpcyAgaXMgYSB2ZXJ5ICBvbGQgYnVnIHRoYXQKLSAgICAgIGdvdCAgdW5kZXRlY3RlZCBtYWlubHkgIGJlY2F1c2UgbW9zdCAgdGVzdC9kZW1vICBwcm9ncmFtIHBlcmZvcm0KLSAgICAgIHJvdW5kaW5nIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSAodGhyb3VnaCB0aGUgY2FjaGUpLgotCi0gICAgLSBgRlRfR2x5cGhfVG9fQml0bWFwJyBkaWQgZXJyb25lb3VzbHkgIG1vZGlmeSB0aGUgc291cmNlIGdseXBoIGluCi0gICAgICBjZXJ0YWluIGNhc2VzLgotCi0gICAgLSBgZ2xuYW1lcy5weScgIHN0aWxsIGNvbnRhaW5lZCAgYSBidWcgIHRoYXQgbWFkZSAgRnJlZVR5cGUgcmV0dXJuCi0gICAgICBpbnZhbGlkIG5hbWVzIGZvciBjZXJ0YWluIGdseXBocy4KLQotICAgIC0gVGhlICBsaWJyYXJ5IGNyYXNoZWQgIHdoZW4gIGxvYWRpbmcgY2VydGFpbiAgVHlwZSAgMSBmb250cyAgbGlrZQotICAgICAgYHNhZG4ucGZiJyAgKGBTdGFsaW5ncmFkICBOb3JtYWwnKSwgICB3aGljaCAgYXBwZWFyICB0byAgY29udGFpbgotICAgICAgcGF0aGV0aWMgZm9udCBpbmZvIGRpY3Rpb25hcmllcy4KLQotICAgIC0gVGhlIFRydWVUeXBlIGdseXBoICBsb2FkZXIgaXMgbm93IG11Y2ggbW9yZSAgcGFyYW5vaWQgYW5kIGNoZWNrcwotICAgICAgZXZlcnl0aGluZyB3aGVuIGxvYWRpbmcgYSBnaXZlbiBnbHlwaCBpbWFnZS4gIFRoaXMgd2FzIG5lY2Vzc2FyeQotICAgICAgdG8gYXZvaWQgcHJvYmxlbXMgKGNyYXNoZXMgYW5kL29yIG1lbW9yeSBvdmVyd3JpdGVzKSB3aXRoIGJyb2tlbgotICAgICAgZm9udHMgdGhhdCBjYW1lIGZyb20gYSByZWFsbHkgYnVnZ3kgYXV0b21hdGljIGZvbnQgY29udmVydGVyLgotCi0KLSAgSUkuIElNUE9SVEFOVCBVUERBVEVTIEFORCBORVcgRkVBVFVSRVMKLQotICAgIC0gSW1wb3J0YW50IHVwZGF0ZXMgdG8gdGhlIE1hYy1zcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeS4KLQotICAgIC0gVGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBoYXMgIGJlZW4gY29tcGxldGVseSByZS1kZXNpZ25lZCwgYW5kIGl0cwotICAgICAgQVBJIGhhcyAgZXZvbHZlZCAodGhlICBvbGQgb25lIGlzICBzdGlsbCBzdXBwb3J0ZWQgIGZvciBiYWNrd2FyZAotICAgICAgY29tcGF0aWJpbGl0eSkuCi0KLSAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGZvciBpdCBpcyAgbm90IHlldCBjb21wbGV0ZWQsIHNvcnJ5LiAgRm9yIG5vdywKLSAgICAgIHlvdSBhcmUgZW5jb3VyYWdlZCB0byBjb250aW51ZSAgdXNpbmcgdGhlIG9sZCBBUEkuICBIb3dldmVyLCB0aGUKLSAgICAgIGZ0dmlldyAgZGVtbyBwcm9ncmFtIGluICB0aGUgZnQyZGVtb3MgIHBhY2thZ2UgaGFzICBhbHJlYWR5IGJlZW4KLSAgICAgIHVwZGF0ZWQgdG8gdXNlIHRoZSBuZXcgY2FjaGluZyBmdW5jdGlvbnMuCi0KLSAgICAtIEEgbmV3IGNoYXJtYXAgY2FjaGUgaXMgcHJvdmlkZWQgdG9vLiAgU2VlIGBGVENfQ01hcENhY2hlJy4gIFRoaXMKLSAgICAgIGlzIHVzZWZ1bCB0byBwZXJmb3JtICBjaGFyYWN0ZXIgY29kZSAtPiBnbHlwaCBpbmRleCB0cmFuc2xhdGlvbnMKLSAgICAgIHF1aWNrbHksIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGFuIG9wZW5lZCBGVF9GYWNlLgotCi0gICAgLSBBIE5FVyBQT1NUU0NSSVBUIEhJTlRFUiBtb2R1bGUgIGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgbmF0aXZlCi0gICAgICBoaW50cyBpbiAgdGhlIGZvbGxvd2luZyAgZm9ybWF0czogUG9zdFNjcmlwdCBUeXBlICAxLCBQb3N0U2NyaXB0Ci0gICAgICBDSUQsIGFuZCBDRkYvQ0VGLgotCi0gICAgICBQbGVhc2UgdGVzdCEgIE5vdGUgdGhhdCAgdGhlIGF1dG8taGludGVyIHByb2R1Y2VzIGJldHRlciByZXN1bHRzCi0gICAgICBmb3IgYSBudW1iZXIgb2YgIGJhZGx5LWhpbnRlZCBmb250cyAobW9zdGx5IGF1dG8tZ2VuZXJhdGVkIG9uZXMpCi0gICAgICB0aG91Z2guCi0KLSAgICAtIEEgbWVtb3J5IGRlYnVnZ2VyIGlzIG5vdyAgcGFydCBvZiB0aGUgc3RhbmRhcmQgRnJlZVR5cGUgc291cmNlcy4KLSAgICAgIFRvICAgICAgZW5hYmxlICAgICAgaXQsICAgICAgZGVmaW5lICAgICAgRlRfREVCVUdfTUVNT1JZICAgICAgaW4KLSAgICAgIDxmcmVldHlwZS9jb25maWcvZnRvcHRpb24uaD4sIGFuZCByZWNvbXBpbGUgdGhlIGxpYnJhcnkuCi0KLSAgICAgIEFkZGl0aW9uYWxseSwgZGVmaW5lICB0aGUgX2Vudmlyb25tZW50XyB2YXJpYWJsZSBGVF9ERUJVR19NRU1PUlkKLSAgICAgIGFuZCBydW4gYW55IHByb2dyYW0gdXNpbmcgRnJlZVR5cGUuICBXaGVuIHRoZSBsaWJyYXJ5IGlzIGV4aXRlZCwKLSAgICAgIGEgIHN1bW1hcnkgIG9mIG1lbW9yeSAgZm9vdHByaW50cyAgYW5kICBwb3NzaWJsZSAgbGVha3Mgd2lsbCAgYmUKLSAgICAgIGRpc3BsYXllZC4KLQotICAgICAgVGhpcyB3b3JrcyB0cmFuc3BhcmVudGx5IHdpdGggIF9hbnlfIHByb2dyYW0gdGhhdCB1c2VzIEZyZWVUeXBlLgotICAgICAgSG93ZXZlciwgeW91ICB3aWxsIG5lZWQgYSBsb3QgIG9mIG1lbW9yeSB0byAgdXNlIHRoaXMgKGFsbG9jYXRlZAotICAgICAgYmxvY2tzIGFyZSBuZXZlciAgcmVsZWFzZWQgdG8gdGhlIGhlYXAgdG8gIGRldGVjdCBkb3VibGUgZGVsZXRlcwotICAgICAgZWFzaWx5KS4KLQotCi0gIElJSS4gTUlTQ0VMTEFORU9VUwotCi0gICAgLSBXZSAgYXJlICBhd2FyZSAgb2YgIHN1YnRsZSAgZGlmZmVyZW5jZXMgYmV0d2VlbiAgdGhlICBvdXRwdXQgIG9mCi0gICAgICBGcmVlVHlwZSAgdmVyc2lvbnMgICAxICBhbmQgIDIgIHdoZW4gIGl0ICAgY29tZXMgIHRvICBtb25vY2hyb21lCi0gICAgICBUcnVlVHlwZS1oaW50ZWQgZ2x5cGhzLiAgIFRoZXNlIGFyZSAgbW9zdCBwcm9iYWJseSBkdWUgIHRvIHNtYWxsCi0gICAgICBkaWZmZXJlbmNlcyBpbiB0aGUgbW9ub2Nocm9tZSByYXN0ZXJpemVycyBhbmQgd2lsbCBiZSB3b3JrZWQgb3V0Ci0gICAgICBpbiBhbiB1cGNvbWluZyByZWxlYXNlLgotCi0gICAgLSBXZSBoYXZlIGRlY2lkZWQgdG8gZm9yayB0aGUgc291cmNlcyBpbiBhIGBzdGFibGUnIGJyYW5jaCwgYW5kIGFuCi0gICAgICBgdW5zdGFibGUnIG9uZSwgc2luY2UgRnJlZVR5cGUgIGlzIGJlY29taW5nIGEgY3JpdGljYWwgY29tcG9uZW50Ci0gICAgICBvZiBtYW55IFVuaXggc3lzdGVtcy4KLQotICAgICAgVGhlIG5leHQgIGJ1Zy1maXggcmVsZWFzZXMgb2YgIHRoZSBsaWJyYXJ5IHdpbGwgYmUgIG5hbWVkIDIuMC43LAotICAgICAgMi4wLjgsIGV0Yy4sICB3aGlsZSB0aGUgYDIuMScgIGJyYW5jaCB3aWxsIGNvbnRhaW4gYSAgdmVyc2lvbiBvZgotICAgICAgdGhlIHNvdXJjZXMgd2hlcmUgd2Ugd2lsbCBzdGFydCBtYWpvciByZXdvcmtpbmcgb2YgdGhlIGxpYnJhcnkncwotICAgICAgaW50ZXJuYWxzLCBpbiBvcmRlciB0byBwcm9kdWNlIEZyZWVUeXBlIDIuMi4wIChvciBldmVuIDMuMCkgaW4gYQotICAgICAgbW9yZSBkaXN0YW50IGZ1dHVyZS4KLQotICAgICAgV2UgIGFsc28gaG9wZSAgdGhhdCB0aGlzICBzY2hlbWUgd2lsbCAgYWxsb3cgbXVjaCAgbW9yZSBmcmVxdWVudAotICAgICAgcmVsZWFzZXMgdGhhbiBpbiB0aGUgcGFzdC4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjAuNSBhbmQgMi4wLjQKLQotICBOT1RFIFRIQVQgMi4wLjUgRE9FUyBOT1QgQ09OVEFJTiBUSEUgUE9TVFNDUklQVCBISU5URVIuICBUSElTIE1PRFVMRQotICBXSUxMIEJFIFBBUlQgT0YgVEhFIE5FWFQgUkVMRUFTRSAoRUlUSEVSIDIuMC42IG9yIDIuMSkKLQotICAtIEZpeGVkIGEgYnVnIHRoYXQgbWFkZSAgY2VydGFpbiBnbHlwaHMsIGxpa2UgYENhY3V0ZScsIGBjYWN1dGUnIGFuZAotICAgIGBsc2xhc2gnICB1bmF2YWlsYWJsZSBmcm9tIFVuaWNvZGUgIGNoYXJtYXBzIG9mICBQb3N0c2NyaXB0IGZvbnRzLgotICAgIFRoaXMgcHJldmVudGVkIHRoZSBjb3JyZWN0IGRpc3BsYXkgb2YgUG9saXNoIHRleHQsIGZvciBleGFtcGxlLgotCi0gIC0gVGhlIGtlcm5pbmcgdGFibGUgb2YgVHlwZSAxIGZvbnRzIHdhcyBsb2FkZWQgYnkgRnJlZVR5cGUsIHdoZW4gaXRzCi0gICAgQUZNICAgIGZpbGUgICAgd2FzICAgIGF0dGFjaGVkICAgIHRvICAgIGl0cyAgICBmYWNlLCAgICBidXQgICAgdGhlCi0gICAgRlRfRkFDRV9GTEFHX0hBU19LRVJOSU5HICAgYml0ICBmbGFncyAgIHdhcyAgbm90ICAgc2V0ICBjb3JyZWN0bHksCi0gICAgcHJldmVudGluZyBGVF9HZXRfS2VybmluZyB0byByZXR1cm4gbWVhbmluZ2Z1bCB2YWx1ZXMuCi0KLSAgLSBJbXByb3ZlZCAgU0ZOVCAoVHJ1ZVR5cGUgICYgT3BlblR5cGUpICBjaGFybWFwICBzdXBwb3J0LiAgU2xpZ2h0bHkKLSAgICBiZXR0ZXIgcGVyZm9ybWFuY2UsIGFzIHdlbGwgYXMgc3VwcG9ydCBmb3IgdGhlIG5ldyBmb3JtYXRzIGRlZmluZWQKLSAgICBieSB0aGUgT3BlblR5cGUgMS4zIHNwZWNpZmljYXRpb24gKDgsIDEwLCBhbmQgMTIpCi0KLSAgLSBGaXhlZCBhICBzZXJpb3VzIHR5cG8gaW4gYHNyYy9iYXNlL2Z0Y2FsYy5jJyAgd2hpY2ggY2F1c2VkIGludmFsaWQKLSAgICBjb21wdXRhdGlvbnMgaW4gY2VydGFpbiByYXJlIGNhc2VzLCBwcm9kdWNpbmcgdWdseSBhcnRlZmFjdHMuCi0KLSAgLSBUaGUgIHNpemUgIG9mIHRoZSAgRU0gIHNxdWFyZSBpcyAgY29tcHV0ZWQgIHdpdGggIGEgbW9yZSAgYWNjdXJhdGUKLSAgICBhbGdvcml0aG0gZm9yIFBvc3RzY3JpcHQgZm9udHMuICAgVGhlIG9sZCBvbmUgY2F1c2VkIHNsaWdodCBlcnJvcnMKLSAgICB3aXRoIGVtYmVkZGVkIGZvbnRzIGZvdW5kIGluIFBERiBkb2N1bWVudHMuCi0KLSAgLSBGaXhlZCAgYSAgYnVnIGluICB0aGUgIGNhY2hlICBtYW5hZ2VyICB0aGF0IHByZXZlbnRlZCAgbm9ybWFsICBMUlUKLSAgICBiZWhhdmlvdXIgIHdpdGhpbiB0aGUgY2FjaGUgIG1hbmFnZXIsIGNhdXNpbmcgIHVubmVjZXNzYXJ5IHJlbG9hZHMKLSAgICAoZm9yIEZUX0ZhY2UgYW5kIEZUX1NpemUgb2JqZWN0cyBvbmx5KS4KLQotICAtIEFkZGVkICBhIG5ldyAgZnVuY3Rpb24gbmFtZWQgIGBGVF9HZXRfTmFtZV9JbmRleCcgdG8gIHJldHJpZXZlIHRoZQotICAgIGdseXBoIGluZGV4IG9mIGEgZ2l2ZW4gZ2x5cGggbmFtZSwgd2hlbiBmb3VuZCBpbiBhIGZhY2UuCi0KLSAgLSBBZGRlZCAgYSBuZXcgZnVuY3Rpb24gIG5hbWVkIGBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lJyAgdG8gcmV0cmlldmUKLSAgICB0aGUgYHVuaXF1ZScgUG9zdHNjcmlwdCBmb250IG5hbWUgb2YgYSBnaXZlbiBmYWNlLgotCi0gIC0gQWRkZWQgICBhICAgbmV3ICAgcHVibGljICAgaGVhZGVyICBzaXplICAgbmFtZWQgICBGVF9TSVpFU19IICAgKG9yCi0gICAgPGZyZWV0eXBlL2Z0c2l6ZXMuaD4pIHByb3ZpZGluZyAgbmV3IEZUX1NpemUtbWFuYWdlbWVudCBmdW5jdGlvbnM6Ci0gICAgRlRfTmV3X1NpemUsIEZUX0FjdGl2YXRlX1NpemUsIEZUX0RvbmVfU2l6ZS4KLQotICAtIEZpeGVkIGEgIHJlYWxsb2NhdGlvbiBidWcgdGhhdCAgZ2VuZXJhdGVkIGEgZGFuZ2xpbmcgIHBvaW50ZXIgKGFuZAotICAgIHBvc3NpYmx5ICAgIG1lbW9yeSAgICBsZWFrcykgICAgd2l0aCAgICBQb3N0c2NyaXB0ICAgIGZvbnRzICAgIChpbgotICAgIHNyYy9wc2F1eC9wc29ianMuYykuCi0KLSAgLSBNYW55IGZpeGVzIGZvciAxNi1iaXQgY29ycmVjdG5lc3MuCi0KLSAgLSBSZW1vdmVkIG1hbnkgcGVkYW50aWMgY29tcGlsZXIgd2FybmluZ3MgZnJvbSB0aGUgc291cmNlcy4KLQotICAtIEFkZGVkIGFuIEFtaWdhIGJ1aWxkIGRpcmVjdG9yeSBpbiBgYnVpbGRzL2FtaWdhJy4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjAuNCBhbmQgMi4wLjMKLQotICAtIEZpeGVkIGEgcmF0aGVyIGFubm95aW5nIGJ1ZyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIDIuMC4zLiAgTmFtZWx5LAotICAgIHRoZSBmb250ICB0cmFuc2Zvcm1hdGlvbiBzZXQgdGhyb3VnaCAgRlRfU2V0X1RyYW5zZm9ybSB3YXMgYXBwbGllZAotICAgIHR3aWNlIHRvIGF1dG8taGludGVkIGdseXBocywgcmVzdWx0aW5nIGluIGluY29ycmVjdGx5IHJvdGF0ZWQgdGV4dAotICAgIG91dHB1dC4KLQotICAtIEZpeGVkIF9tYW55XyAgY29tcGlsZXIgd2FybmluZ3MuICAgRlQyIHNob3VsZCBub3cgIGNvbXBpbGUgY2xlYW5seQotICAgIHdpdGggVmlzdWFsICBDKysncyBtb3N0IHBlZGFudGljIHdhcm5pbmcgbGV2ZWwgICgvVzQpLiAgSXQgYWxyZWFkeQotICAgIGNvbXBpbGVkIGZpbmUgd2l0aCBHQ0MgYW5kIGEgZmV3IG90aGVyIGNvbXBpbGVycy4KLQotICAtIEZpeGVkIGEgYnVnICB0aGF0IHByZXZlbnRlZCB0aGUgbGluZWFyIGFkdmFuY2UgIHdpZHRoIG9mIGNvbXBvc2l0ZQotICAgIFRydWVUeXBlIGdseXBocyB0byBiZSBjb3JyZWN0bHkgcmV0dXJuZWQuCi0KLSAgLSBGaXhlZCAgICB0aGUgICAgVmlzdWFsICAgIEMrKyAgICBwcm9qZWN0ICAgIGZpbGVzICAgIGxvY2F0ZWQgICAgaW4KLSAgICBgYnVpbGRzL3dpbjMyL3Zpc3VhbGMnIChwcmV2aW91cyB2ZXJzaW9ucyAgdXNlZCBvbGRlciBuYW1lcyBvZiB0aGUKLSAgICBsaWJyYXJ5KS4KLQotICAtIE1hbnkgIDMyLWJpdCBjb25zdGFudHMgIGhhdmUgYW4gIGBMJyBhcHBlbmRlZCAgdG8gdGhlaXIgIHZhbHVlLCBpbgotICAgIG9yZGVyIHRvIGltcHJvdmUgdGhlIDE2LWJpdG5lc3MgIG9mIHRoZSBjb2RlLiAgU29tZW9uZSBpcyBhY3R1YWxseQotICAgIHRyeWluZyB0byB1c2UgRlQyIG9uIGFuIEF0YXJpIFNUIG1hY2hpbmUhCi0KLSAgLSBVcGRhdGVkICB0aGUgIGBidWlsZHMvZGV0ZWN0Lm1rJyBmaWxlICBpbiAgb3JkZXIgdG8gIGF1dG9tYXRpY2FsbHkKLSAgICBidWlsZCBGVDIgIG9uIEFJWCBzeXN0ZW1zLiAgIEFJWCB1c2VzIGAvdXNyL3NiaW4vaW5pdCcgIGluc3RlYWQgb2YKLSAgICBgL3NiaW4vaW5pdCcgYW5kIHdhc24ndCBwcmV2aW91c2x5ICBkZXRlY3RlZCBhcyBhIFVuaXggcGxhdGZvcm0gYnkKLSAgICB0aGUgRnJlZVR5cGUgYnVpbGQgc3lzdGVtLgotCi0gIC0gVXBkYXRlZCAgdGhlICBVbml4LXNwZWNpZmljICBwb3J0aW9ucyAgb2YgdGhlICBidWlsZCAgc3lzdGVtICAobmV3Ci0gICAgbGlidG9vbCB2ZXJzaW9uLCBldGMuKS4KLQotICAtIFRoZSAgU0ZOVCBrZXJuaW5nICBsb2FkZXIgbm93ICBlbnN1cmVzICB0aGF0IHRoZSAgdGFibGUgaXMgIHNvcnRlZAotICAgIChzaW5jZSBzb21lIHByb2JsZW0gZm9udHMgZG8gbm90IG1lZXQgdGhpcyByZXF1aXJlbWVudCkuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIDIuMC4zIGFuZCAyLjAuMgotCi0gIEkuIENIQU5HRVMgVE8gVEhFIE1PRFVMRVMgLyBGT05UIERSSVZFUlMKLQotICAgIC0gVEhFICBBVVRPLUhJTlRFUiBIQVMgIEJFRU4gU0xJR0hUTFkgIElNUFJPVkVELCBpbiAgb3JkZXIgIHRvIGZpeAotICAgICAgc2V2ZXJhbCBhbm5veWluZyBhcnRlZmFjdHMsIG1haW5seToKLQotICAgICAgICAtIEJsdWUgIHpvbmUgYWxpZ25tZW50ICBvZiAgaG9yaXpvbnRhbCBzdGVtcyAgd2Fzbid0IHBlcmZvcm1lZAotICAgICAgICAgIGNvcnJlY3RseSwgcmVzdWx0aW5nIGluIGFydGVmYWN0cyAgbGlrZSB0aGUgYGQnIGJlaW5nIHBsYWNlZAotICAgICAgICAgIG9uZSBwaXhlbCBiZWxvdyB0aGUgYGInIGluIHNvbWUgZm9udHMgbGlrZSBUaW1lIE5ldyBSb21hbi4KLQotICAgICAgICAtIE92ZXJzaG9vdCB0aHJlc2hvbGRpbmcgIHdhc24ndCBwZXJmb3JtZWQgY29ycmVjdGx5LCBjcmVhdGluZwotICAgICAgICAgIHVucGxlYXNhbnQgYXJ0ZWZhY3RzIGF0IGxhcmdlIGNoYXJhY3RlciBwaXhlbCBzaXplcy4KLQotICAgICAgICAtIENvbXBvc2l0ZSBnbHlwaCBsb2FkaW5nIGhhcyAgYmVlbiBzaW1wbGlmaWVkLiAgVGhpcyBnZXRzIHJpZAotICAgICAgICAgIG9mICB2YXJpb3VzIGFydGVmYWN0cyAgd2hlcmUgdGhlICBjb21wb25lbnRzIG9mICBhIGNvbXBvc2l0ZQotICAgICAgICAgIGdseXBocyB3ZXJlIG5vdCBjb3JyZWN0bHkgc3BhY2VkLgotCi0gICAgICBUaGVzZSBhcmUgIHRoZSBsYXN0IGNoYW5nZXMgdG8gdGhlICBjdXJyZW50IGF1dG8taGludGluZyBtb2R1bGUuCi0gICAgICBBIG5ldyAgaGludGluZyBzdWItc3lzdGVtIGlzIGN1cnJlbnRseSAgaW4gdGhlIHdvcmsgIGluIG9yZGVyIHRvCi0gICAgICBzdXBwb3J0IG5hdGl2ZSBoaW50cyAgaW4gVHlwZSAxIC8gQ0ZGIC8gIE9wZW5UeXBlIGZvbnRzLCBhcyB3ZWxsCi0gICAgICBhcyBnbG9iYWxseSBpbXByb3ZlIHJlbmRlcmluZy4KLQotICAgIC0gVGhlICBQQ0YgIGRyaXZlciBoYXMgIGJlZW4gIGZpeGVkLiAgIEl0ICByZXBvcnRlZCBpbnZhbGlkICBnbHlwaAotICAgICAgZGltZW5zaW9ucyBmb3IgdGhlIGZvbnRzIGF2YWlsYWJsZSBvbiBTb2xhcmlzLgotCi0gICAgLSBUaGUgVHlwZSAgMSwgQ0lEIGFuZCBDRkYgIGRyaXZlcnMgaGF2ZSBiZWVuIG1vZGlmaWVkICB0byBmaXggdGhlCi0gICAgICBjb21wdXRhdGlvbiBvZiB0aGUgRU0gc2l6ZS4KLQotICAgIC0gVGhlIFR5cGUgMSAgZHJpdmVyIGhhcyBiZWVuIGZpeGVkIHRvIGF2b2lkICBhIGRhbmdlcm91cyBidWcgdGhhdAotICAgICAgY3Jhc2hlZCB0aGUgbGlicmFyeSB3aXRoIG5vbi1jb25mb3JtaW5nIGZvbnRzIChpLmUuIG9uZXMgdGhhdCBkbwotICAgICAgbm90IHBsYWNlIHRoZSAubm90ZGVmIGdseXBoIGF0IHBvc2l0aW9uIDApLgotCi0gICAgLSBUaGUgVHJ1ZVR5cGUgIGRyaXZlciBoYWQgYSAgcmF0aGVyIHN1YnRsZSBidWcgIChkYW5nbGluZyBwb2ludGVyCi0gICAgICB3aGVuIGxvYWRpbmcgIGNvbXBvc2l0ZSBnbHlwaHMpIHRoYXQgY291bGQgY3Jhc2ggIHRoZSBsaWJyYXJ5IGluCi0gICAgICByYXJlIG9jY2FzaW9ucyEKLQotCi0gIElJLiBISUdILUxFVkVMIEFQSSBDSEFOR0VTCi0KLSAgICAtIFRoZSBlcnJvciAgY29kZSBlbnVtZXJhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuICBjaGFuZ2VkLiAgQW4gZXJyb3IKLSAgICAgIHZhbHVlICBpcyBkZWNvbXBvc2VkICBpbiAgYSAgZ2VuZXJpYyBlcnJvciAgY29kZSwgIGFuZCBhICBtb2R1bGUKLSAgICAgIG51bWJlci4gIHNlZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4gZm9yIGRldGFpbHMuCi0KLSAgICAtIEEgICBuZXcgIHB1YmxpYyAgIGhlYWRlciAgIGZpbGUgIGhhcyAgIGJlZW4gIGludHJvZHVjZWQsICAgbmFtZWQKLSAgICAgIEZUX1RSSUdPTk9NRVRSWV9IICAgIChpbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmgpLCAgICBwcm92aWRpbmcKLSAgICAgIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIHRvICBjb21wdXRlIHNpbmVzLCBjb3NpbmVzLCBhcmN0YW5nZW50cywKLSAgICAgIGV0Yy4gd2l0aCAxNi4xNiBmaXhlZCBwcmVjaXNpb24uICBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KLSAgICAgIHRoZSBDT1JESUMgIGFsZ29yaXRobSBhbmQgaXMgdmVyeSBmYXN0ICB3aGlsZSBiZWluZyBzdWZmaWNpZW50bHkKLSAgICAgIGFjY3VyYXRlLgotCi0KLSAgSUlJLiBJTlRFUk5BTFMKLQotICAgIC0gQWRkZWQgIEJlT1Mtc3BlY2lmaWMgZmlsZXMgIGluIHRoZSAgb2xkIGJ1aWxkICBzdWItc3lzdGVtLiAgTm90ZQotICAgICAgdGhhdCBubyBjaGFuZ2VzIHdlcmUgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIEphbS4KLQotICAgIC0gVGhlICBjb25maWd1cmF0aW9uICBpcyBub3cgIGNhcGFibGUgIG9mIGF1dG9tYXRpY2FsbHkgIGRldGVjdGluZwotICAgICAgNjQtYml0IGludGVnZXJzICBvbiBhIHNldCAgb2YgcHJlZGVmaW5lZCBjb21waWxlcnMgIChHQ0MsIFZpc3VhbAotICAgICAgQysrLCBCb3JsYW5kIEMrKykgYW5kIHdpbGwgdXNlIHRoZW0gYnkgZGVmYXVsdC4gIFRoaXMgcHJvdmlkZXMgYQotICAgICAgc21hbGwgcGVyZm9ybWFuY2UgYm9vc3QuCi0KLSAgICAtIEEgIHNtYWxsIG1lbW9yeSBsZWFrICB0aGF0IGhhcHBlbmVkICB3aGVuIG9wZW5pbmcgIDAtc2l6ZWQgZmlsZXMKLSAgICAgIChkdWghKSAgaGF2ZSBiZWVuIGZpeGVkLgotCi0gICAgLSBGaXhlZCBiZXppZXIgIHN0YWNrIGRlcHRoICBidWcgaW4gdGhlICByb3V0aW5lcyBwcm92aWRlZCAgYnkgdGhlCi0gICAgICBGVF9CQk9YX0ggIGhlYWRlciAgIGZpbGUuICAgQWxzbyAgZml4ZWQgIHNpbWlsYXIgICBidWdzICBpbiAgdGhlCi0gICAgICByYXN0ZXJpemVycy4KLQotICAgIC0gVGhlIG91dGxpbmUgYm91bmRpbmcgIGJveCBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiAgdG8gdXNlIGRpcmVjdAotICAgICAgY29tcHV0YXRpb25zLCAgaW5zdGVhZCBvZiAgYmV6aWVyIHN1Yi1kaXZpc2lvbiwgIHRvICBjb21wdXRlIHRoZQotICAgICAgZXhhY3QgYm91bmRpbmcgYm94IG9mIGdseXBocy4gICBUaGlzIGlzIHNsaWdodGx5IHNsb3dlciBidXQgbW9yZQotICAgICAgYWNjdXJhdGUuCi0KLSAgICAtIFRoZSBidWlsZCBzeXN0ZW0gaGFzIGJlZW4gIGltcHJvdmVkIGFuZCBmaXhlZCwgbWFpbmx5IHRvIHN1cHBvcnQKLSAgICAgIGBtYWtlJyAgb24gV2luZG93cyAgMjAwMCAgY29ycmVjdGx5LCBhdm9pZCAgcHJvYmxlbXMgd2l0aCAgYG1ha2UKLSAgICAgIGRpc3RjbGVhbicgb24gbm9uIFVuaXggc3lzdGVtcywgZXRjLgotCi0gICAgLSBIZXhhZGVjaW1hbCAgY29uc3RhbnRzICBoYXZlIGJlZW4gIHN1ZmZpeGVkICB3aXRoICBgVScgdG8gIGF2b2lkCi0gICAgICBwcm9ibGVtcyB3aXRoIGNlcnRhaW4gY29tcGlsZXJzIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCi0KLSAgICAtIEEgbmV3IGRpcmVjdG9yeSBuYW1lZCBgc3JjL3Rvb2xzJyBoYXMgYmVlbiBjcmVhdGVkLiAgSXQgY29udGFpbnMKLSAgICAgIFB5dGhvbiBzY3JpcHRzIGFuZCBzaW1wbGUgdW5pdCB0ZXN0IHByb2dyYW1zIHVzZWQgdG8gZGV2ZWxvcCB0aGUKLSAgICAgIGxpYnJhcnkuCi0KLSAgICAtIFRoZSBEb2NNYWtlciB0b29sIGhhcyBiZWVuICBtb3ZlZCBmcm9tIGBkb2NzJyB0byBgc3JjL3Rvb2xzJyBhbmQKLSAgICAgIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nOgotCi0gICAgICAgICAtIE5vdyBhY2NlcHRzIHRoZSBgLS10aXRsZT1YWFhYJyBvciBgLXQgWFhYWCcgb3B0aW9uIGZyb20gdGhlCi0gICAgICAgICAgIGNvbW1hbmQgbGluZSB0byBzZXQgdGhlIHByb2plY3QncyBuYW1lIGluIHRoZSBnZW5lcmF0ZWQgQVBJCi0gICAgICAgICAgIHJlZmVyZW5jZS4KLQotICAgICAgICAgLSBOb3cgYWNjZXB0cyB0aGUgYC0tb3V0cHV0PURJUicgIG9yIGAtbyBESVInIG9wdGlvbiBmcm9tIHRoZQotICAgICAgICAgICBjb21tYW5kIGxpbmUgdG8gc2V0ICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgYWxsIGdlbmVyYXRlZAotICAgICAgICAgICBIVE1MIGZpbGVzLgotCi0gICAgICAgICAtIE5vdyBhY2NlcHRzIHRoZSBgLS1wcmVmaXg9WFhYWCcgb3IgYC1wIFhYWCcgb3B0aW9uIGZyb20gdGhlCi0gICAgICAgICAgIGNvbW1hbmQgIGxpbmUgIHRvICBzZXQgIHRoZSAgZmlsZSBwcmVmaXggIHRvICB1c2UgIGZvciAgYWxsCi0gICAgICAgICAgIGdlbmVyYXRlZCBIVE1MIGZpbGVzLgotCi0gICAgICAgICAtIE5vdyBnZW5lcmF0ZXMgdGhlIGN1cnJlbnQgIHRpbWUvZGF0YSBvbiBlYWNoIGdlbmVyYXRlZCBwYWdlCi0gICAgICAgICAgIGluIG9yZGVyIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmVyc2lvbnMuCi0KLSAgICAgIERvY01ha2VyICBjYW4gYmUgIHVzZWQgd2l0aCAgb3RoZXIgIHByb2plY3RzIG5vdywgIG5vdCBvbmx5ICBGVDIKLSAgICAgIChlLmcuIE1MaWIsIEZUTGF5b3V0LCBldGMuKS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjAuMiBhbmQgMi4wLjEKLQotICBJLiBDSEFOR0VTIFRPIFRIRSBNT0RVTEVTIC8gRk9OVCBEUklWRVJTCi0KLSAgICAtIFRIRSBUUlVFVFlQRSBCWVRFQ09ERSBJTlRFUlBSRVRFUiBJUyBOT1cgVFVSTkVEIE9GRiwgaW4gb3JkZXIgdG8KLSAgICAgIGF2b2lkIGxlZ2FsIHByb2JsZW1zICB3aXRoIHRoZSBBcHBsZSBwYXRlbnRzLiAgSXQgIHNlZW1zIHRoYXQgd2UKLSAgICAgIG1pc3Rha2VubHkgIHR1cm5lZCB0aGlzIG9wdGlvbiAgb24gaW4gIHByZXZpb3VzIHJlbGVhc2VzICBvZiB0aGUKLSAgICAgIGJ1aWxkLgotCi0gICAgICBOb3RlIHRoYXQgaWYgIHlvdSB3YW50IHRvIHVzZSB0aGUgIGJ5dGVjb2RlIGludGVycHJldGVyIGluIG9yZGVyCi0gICAgICB0byBnZXQgaGlnaC1xdWFsaXR5IFRydWVUeXBlICByZW5kZXJpbmcsIHlvdSB3aWxsIG5lZWQgdG8gdG9nZ2xlCi0gICAgICBieSAgICAgICAgaGFuZCAgICAgICAgdGhlICAgICAgICBkZWZpbml0aW9uICAgICAgICBvZiAgICAgICAgdGhlCi0gICAgICBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSICAgbWFjcm8gICAgaW4gICB0aGUgICBmaWxlCi0gICAgICBgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCcuCi0KLSAgICAtIFRoZSBDRkYgZHJpdmVyIGhhcyBiZWVuIGltcHJvdmVkIGJ5IFRvbSBLYWN2aW5za3kgYW5kIFNhbmRlciB2YW4KLSAgICAgIGRlciBXYWw6Ci0KLSAgICAgICogU3VwcG9ydCBmb3IgYHNlYWMnIGVtdWxhdGlvbi4KLSAgICAgICogU3VwcG9ydCBmb3IgYGRvdHNlY3Rpb24nLgotICAgICAgKiBTdXBwb3J0IGZvciByZXRyaWV2aW5nIGdseXBoIG5hbWVzIHRocm91Z2gKLSAgICAgICAgYEZUX0dldF9HbHlwaF9OYW1lJy4KLQotICAgICAgVGhlIGZpcnN0IHR3byBpdGVtcyBhcmUgbmVjZXNzYXJ5IHRvIGNvcnJlY3RseSBhIGxhcmdlIG51bWJlciBvZgotICAgICAgVHlwZSAxIGZvbnRzIGNvbnZlcnRlZCB0byB0aGUgQ0ZGIGZvcm1hdHMgYnkgQWRvYmUgQWNyb2JhdC4KLQotICAgIC0gVGhlIFR5cGUgMSBkcml2ZXIgd2FzIGFsc28gaW1wcm92ZWQgYnkgVG9tICYgb3RoZXJzOgotCi0gICAgICAqIEJldHRlciBFTSBzaXplIGNvbXB1dGF0aW9uLgotICAgICAgKiBCZXR0ZXIgc3VwcG9ydCBmb3Igc3ludGhldGljICh0cmFuc2Zvcm1lZCkgZm9udHMuCi0gICAgICAqIFRoZSAgVHlwZSAxICBkcml2ZXIgcmV0dXJucyAgdGhlIGNoYXJzdHJpbmdzICBjb3JyZXNwb25kaW5nIHRvCi0gICAgICAgIGVhY2ggZ2x5cGggaW4gdGhlICBgZ2x5cGgtPmNvbnRyb2xfZGF0YScgZmllbGQgYWZ0ZXIgYSBjYWxsIHRvCi0gICAgICAgIGBGVF9Mb2FkX0dseXBoJyAodGhhbmtzIEhhIFNoYW8pLgotCi0gICAgLSBWYXJpb3VzIG90aGVyIGJ1Z2ZpeGVzLCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoKLQotICAgICAgKiBGaXhlZCBhIG5hc3R5IG1lbW9yeSBsZWFrIGluIHRoZSBUeXBlIDEgZHJpdmVyLgotICAgICAgKiBUaGUgYXV0b2hpbnRlciAgYW5kIHRoZSBwY2YgIGRyaXZlciB1c2VkIHN0YXRpYyAgd3JpdGFibGUgZGF0YQotICAgICAgICB3aGVuIHRoZXkgc2hvdWxkbid0LgotICAgICAgKiBNYW55IGNhc3RzIHdlcmUgYWRkZWQgdG8gIG1ha2UgdGhlIGNvZGUgbW9yZSA2NC1iaXRzIHNhZmUuICBJdAotICAgICAgICBhbHNvIG5vdyBjb21waWxlcyBvbiBXaW5kb3dzIFhQIDY0LWJpdHMgd2l0aG91dCB3YXJuaW5ncy4KLSAgICAgICogU29tZSBpbmNvcnJlY3Qgd3JpdGFibGUgc3RhdGljcyB3ZXJlIHJlbW92ZWQgaW4gdGhlIGBhdXRvaGludCcKLSAgICAgICAgYW5kIGBwY2YnIGRyaXZlcnMuICBGcmVlVHlwZSAyIG5vdyBjb21waWxlcyBvbiBFcG9jIGFnYWluLgotCi0KLSAgSUkuIENIQU5HRVMgVE8gVEhFIEhJR0gtTEVWRUwgQVBJCi0KLSAgICAtIFRoZSBsaWJyYXJ5IGhlYWRlciBmaWxlcyBpbmNsdXNpb24gc2NoZW1lIGhhcyBiZWVuIGNoYW5nZWQuICBUaGUKLSAgICAgIG9sZCBzY2hlbWUgbG9va2VkIGxpa2U6Ci0KLSAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+Ci0gICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdGdseXBoLmg+Ci0gICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0gICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9jYWNoZS9mdGltYWdlLmg+Ci0KLSAgICAgIE5vdyB5b3Ugc2hvdWxkIHVzZToKLQotICAgICAgICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSAgICAgICAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotICAgICAgICAjaW5jbHVkZSBGVF9HTFlQSF9ICi0gICAgICAgICNpbmNsdWRlIEZUX0NBQ0hFX0gKLSAgICAgICAgI2luY2x1ZGUgRlRfQ0FDSEVfSU1BR0VfSAotCi0gICAgICBOT1RFIFRIQVQgIFRIRSBPTEQgIElOQ0xVU0lPTiBTQ0hFTUUgV0lMTCAgU1RJTEwgV09SSyAgV0lUSCBUSElTCi0gICAgICBSRUxFQVNFLiAgSE9XRVZFUiwgV0UgIERPIE5PVCBHVUFSQU5URUUgVEhBVCBUSElTICBXSUxMIFNUSUxMIEJFCi0gICAgICBUUlVFIElOIFRIRSBORVhUIE9ORSAoQS5LLkEuIEZSRUVUWVBFIDIuMSkuCi0KLSAgICAgIFRoZSAgZmlsZSA8ZnQyYnVpbGQuaD4gIGlzIHVzZWQgIHRvIGRlZmluZSAgdGhlICBoZWFkZXIgZmlsZW5hbWUKLSAgICAgIG1hY3Jvcy4gIFRoZSBjb21wbGV0ZSBhbmQgIGNvbW1lbnRlZCBsaXN0IG9mIG1hY3JvcyBpcyBhdmFpbGFibGUKLSAgICAgIGluIHRoZSBBUEkgcmVmZXJlbmNlIHVuZGVyIHRoZSBzZWN0aW9uIG5hbWUgYEhlYWRlciBGaWxlIE1hY3JvcycKLSAgICAgIGluIENoYXB0ZXIgSS4KLQotICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBzZWN0aW9uIEkgb2YgdGhlIGZvbGxvd2luZyBkb2N1bWVudDoKLQotICAgICAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy8KLSAgICAgICAgICBmcmVldHlwZTIvZG9jcy90dXRvcmlhbC9zdGVwMS5odG1sCi0KLSAgICAgIG9yCi0KLSAgICAgICAgaHR0cDovL2ZyZWV0eXBlLnNvdXJjZWZvcmdlLm5ldC8KLSAgICAgICAgICBmcmVldHlwZTIvZG9jcy90dXRvcmlhbC9zdGVwMS5odG1sCi0KLSAgICAtIE1hbnksIG1hbnkgY29tbWVudHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBwdWJsaWMgc291cmNlIGZpbGUgaW4KLSAgICAgIG9yZGVyIHRvICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlICB0aGUgQVBJIFJlZmVyZW5jZSAgdGhyb3VnaCB0aGUKLSAgICAgIGBkb2NtYWtlci5weScgUHl0aG9uIHNjcmlwdC4KLQotICAgICAgVGhlIGxhdHRlciBoYXMgYmVlbiB1cGRhdGVkICB0byBzdXBwb3J0IHRoZSBncm91cGluZyBvZiBzZWN0aW9ucwotICAgICAgaW4gY2hhcHRlcnMgYW5kIGJldHRlciBpbmRleCBzb3J0LiAgU2VlOgotCi0gICAgICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2ZyZWV0eXBlMi9kb2NzL3JlZmVyZW5jZS9mdDItdG9jLmh0bWwKLQotCi0gIElJSS4gQ0hBTkdFUyBUTyBUSEUgQlVJTEQgUFJPQ0VTUwotCi0gICAgLSBJZiB5b3UgIGFyZSBub3QgIGJ1aWxkaW5nIEZyZWVUeXBlIDIgIHdpdGggaXRzIG93biAgYnVpbGQgc3lzdGVtCi0gICAgICAoYnV0IHdpdGggeW91ciBvd24gTWFrZWZpbGVzIG9yIHByb2plY3QgZmlsZXMpLCB5b3Ugd2lsbCBuZWVkIHRvCi0gICAgICBiZSAgYXdhcmUgdGhhdCAgdGhlICBidWlsZCAgcHJvY2VzcyBoYXMgIGNoYW5nZWQgIGEgbGl0dGxlICBiaXQuCi0KLSAgICAgIFlvdSBkb24ndCAgbmVlZCB0byBwdXQgdGhlICBgc3JjJyBkaXJlY3RvcnkgaW4gIHRoZSBpbmNsdWRlIHBhdGgKLSAgICAgIHdoZW4gIGNvbXBpbGluZyAgYW55IEZUMiAgY29tcG9uZW50LiAgIEluc3RlYWQsICBzaW1wbHkgcHV0ICB0aGUKLSAgICAgIGNvbXBvbmVudCdzIGRpcmVjdG9yeSBpbiB0aGUgY3VycmVudCBpbmNsdWRlIHBhdGguCi0KLSAgICAgIFNvLCBpZiB5b3Ugd2VyZSBkb2luZyBzb21ldGhpbmcgbGlrZToKLQotICAgICAgICBjYyAtYyAtSWluY2x1ZGUgLUlzcmMgc3JjL2Jhc2UvZnRiYXNlLmMKLQotICAgICAgY2hhbmdlIHRoZSBsaW5lIHRvOgotCi0gICAgICAgIGNjIC1jIC1JaW5jbHVkZSAtSXNyYy9iYXNlIHNyYy9iYXNlL2Z0YmFzZS5jCi0KLSAgICAgIElmIHlvdSB3ZXJlIGRvaW5nIHNvbWV0aGluZyBsaWtlOgotCi0gICAgICAgIGNkIHNyYy9iYXNlCi0gICAgICAgIGNjIC1jIC1JLi4vLi4vaW5jbHVkZSAtSS4uIGZ0YmFzZS5jCi0KLSAgICAgIGNoYW5nZSBpdCB0bzoKLQotICAgICAgICBjZCBzcmMvYmFzZQotICAgICAgICBjYyAtYyAtSS4uLy4uL2luY2x1ZGUgZnRiYXNlLmMKLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNIQU5HRVMgQkVUV0VFTiAyLjAuMSBhbmQgMi4wCi0KLSAgMi4wLjEgaW50cm9kdWNlcyBhIGZldyBjaGFuZ2VzOgotCi0gICAgLSBGaXhlZCBtYW55IGJ1Z3MgcmVsYXRlZCB0byAgdGhlIHN1cHBvcnQgb2YgQ0ZGIC8gT3BlblR5cGUgZm9udHMuCi0gICAgICBUaGVzZSAgZm9ybWF0cyBhcmUgIG5vdyBtdWNoICBiZXR0ZXIgc3VwcG9ydGVkICB0aG91Z2ggIHRoZXJlIGlzCi0gICAgICBzdGlsbCB3b3JrIHBsYW5uZWQgdG8gIGRlYWwgd2l0aCBjaGFyc2V0IHRhYmxlcyBhbmQgUERGLWVtYmVkZGVkCi0gICAgICBDRkYgZmlsZXMgdGhhdCB1c2UgdGhlIG9sZCBgc2VhYycgY29tbWFuZC4KLQotICAgIC0gVGhlICBsaWJyYXJ5IGNvdWxkIG5vdCAgYmUgY29tcGlsZWQgIGluIGRlYnVnICBtb2RlIHdpdGggIGEgdmVyeQotICAgICAgc21hbGwgIG51bWJlciAgIG9mICBDICBjb21waWxlcnMgICB3aG9zZSAgcHJlLXByb2Nlc3NvcnMgIGRpZG4ndAotICAgICAgaW1wbGVtZW50IHRoZSBgIyMnICBkaXJlY3RpdmUgY29ycmVjdGx5IChpLmUuIHBlciBzZSAgdGhlIEFOU0kgQwotICAgICAgc3BlY2lmaWNhdGlvbiEpICBBbiBlbGVnYW50IGZpeCB3YXMgZm91bmQuCi0KLSAgICAtIEFkZGVkICBzdXBwb3J0IGZvciAgdGhlICBmcmVlIEJvcmxhbmQgIGNvbW1hbmQtbGluZSBDKysgIEJ1aWxkZXIKLSAgICAgIGNvbXBpbGVyLiAgIFVzZSBgbWFrZSAgc2V0dXAgYmNjMzInLiAgIEFsc28gZml4ZWQgIGEgIGZldyBzb3VyY2UKLSAgICAgIGxpbmVzIHRoYXQgZ2VuZXJhdGVkIG5ldyB3YXJuaW5ncyB3aXRoIEJDQzMyLgotCi0gICAgLSBGaXhlZCBhIGJ1ZyBpbiBGVF9PdXRsaW5lX0dldF9CQm94IHdoZW4gY29tcHV0aW5nIHRoZSBleHRyZW1hIG9mCi0gICAgICBhIGNvbmljIEJlemllciBhcmMuCi0KLSAgICAtIFVwZGF0ZWQgdGhlIElOU1RBTEwgZmlsZSB0byBhZGQgSURFIGNvbXBpbGF0aW9uLgotCi0gICAgLSBPdGhlciAgbWlub3IgYnVnICBmaXhlcywgIGZyb20gIGludmFsaWQgVHlwZSAgMSAgc3R5bGUgZmxhZ3MgIHRvCi0gICAgICBjb3JyZWN0ICAgc3VwcG9ydCAgIG9mICBzeW50aGV0aWMgICAob2JsaXF1ZWQpICAgZm9udHMgIGluICAgdGhlCi0gICAgICBhdXRvLWhpbnRlciwgYmV0dGVyIHN1cHBvcnQgZm9yIGVtYmVkZGVkIGJpdG1hcHMgaW4gYSBTRk5UIGZvbnQuCi0KLSAgICAtIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBgZnJlZXR5cGUtY29uZmlnJy4KLQotICBGaW5hbGx5LCB0aGUgYHN0YW5kYXJkJyBzY2hlbWUgZm9yIGluY2x1ZGluZyBGcmVlVHlwZSBoZWFkZXJzIGlzIG5vdwotICBncmFkdWFsbHkgY2hhbmdpbmcsICBidXQgdGhpcyB3aWxsICBiZSBleHBsYWluZWQgaW4gYSAgbGF0ZXIgcmVsZWFzZQotICAocHJvYmFibHkgMi4wLjIpLgotCi0gIEFuZCB2ZXJ5ICBzcGVjaWFsIHRoYW5rcyB0byBUb20gS2Fjdmluc2t5ICBhbmQgWUFNQU5PLVVDSEkgSGlkZXRvc2hpCi0gIGZvciB0aGVpciBjb250cmlidXRpb25zIQotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ0hBTkdFUyBCRVRXRUVOIGJldGE4IGFuZCAyLjAKLQotICAtIENoYW5nZWQgIHRoZSBkZWZhdWx0ICBpbnN0YWxsYXRpb24gIHBhdGggZm9yICBwdWJsaWMgaGVhZGVycyAgZnJvbQotICAgIGBpbmNsdWRlL2ZyZWV0eXBlJyB0byBgaW5jbHVkZS9mcmVldHlwZTInLgotCi0gICAgQWxzbyBhZGRlZCBhIG5ldyBgZnJlZXR5cGUtY29uZmlnJyB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0gICAgYW5kIGluc3RhbGxlZCAgb24gVW5peCBhbmQgIEN5Z3dpbiBzeXN0ZW1zLiAgVGhlIHNjcmlwdCAgaXRzZWxmIGlzCi0gICAgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCAgaW5zdGFsbCBwYXRoLCBDIGNvbXBpbGF0aW9uIGZsYWdzIGFzCi0gICAgd2VsbCBhcyBsaW5rZXIgZmxhZ3MuCi0KLSAgLSBGaXhlZCBzZXZlcmFsIHNtYWxsIGJ1Z3M6Ci0KLSAgICAqIEluY29ycmVjdCBtYXggYWR2YW5jZSB3aWR0aCBmb3IgZml4ZWQtcGl0Y2ggVHlwZSAxIGZvbnRzLgotICAgICogSW5jb3JyZWN0IGdseXBoIG5hbWVzIGZvciBjZXJ0YWluIFRydWVUeXBlIGZvbnRzLgotICAgICogVGhlICBnbHlwaCBhZHZhbmNlICB3YXMgbm90ICBjb3BpZWQgd2hlbiAgRlRfR2x5cGhfVG9fQml0bWFwIHdhcwotICAgICAgY2FsbGVkLgotICAgICogVGhlICBsaW5lYXJIb3JpQWR2YW5jZSAgYW5kICBsaW5lYXJWZXJ0QWR2YW5jZSAgZmllbGRzICB3ZXJlIG5vdAotICAgICAgY29ycmVjdGx5IHJldHVybmVkIGZvciBnbHlwaHMgcHJvY2Vzc2VkIGJ5IHRoZSBhdXRvLWhpbnRlci4KLSAgICAqIGB0eXBlMXonICByZW5hbWVkIGJhY2sgdG8gIGB0eXBlMSc7IHRoZSAgb2xkIGB0eXBlMScgIG1vZHVsZSBoYXMKLSAgICAgIGJlZW4gcmVtb3ZlZC4KLQotICAtIFJldmFtcGVkIHRoZSAgYnVpbGQgc3lzdGVtICB0byBtYWtlIGl0ICBhIGxvdCBtb3JlICBnZW5lcmljLiAgVGhpcwotICAgIHdpbGwgIGFsbG93IHVzICB0byAgcmUtdXNlICBuZWFybHkgdW4tbW9kaWZpZWQgIGluICBsb3RzIG9mICBvdGhlcgotICAgIHByb2plY3RzIChpbmNsdWRpbmcgRnJlZVR5cGUgTGF5b3V0KS4KLQotICAtIENoYW5nZWQgYGNpZCcgdG8gdXNlIGBwc2F1eCcgdG9vLgotCi0gIC0gQWRkZWQgdGhlICBjYWNoZSBzdWItc3lzdGVtLiAgU2VlIDxmcmVldHlwZS9mdGNhY2hlLmg+ICBhcyB3ZWxsIGFzCi0gICAgdGhlIHNvdXJjZXMgIGluIGBzcmMvY2FjaGUnLiAgTm90ZSAgdGhhdCBpdCBjb21waWxlcyBidXQgIGlzIHN0aWxsCi0gICAgdW50ZXN0ZWQgZm9yIG5vdy4KLQotICAtIFVwZGF0ZWQgYGRvY3MvZG9jbWFrZXIucHknLCBhIGRyYWZ0ICBBUEkgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2Z0MmFwaS5odG1sLgotCi0gIC0gQ2hhbmdlZCBgdHlwZTEnIHRvIHVzZSBgcHNhdXgnLgotCi0gIC0gQ3JlYXRlZCBhICBuZXcgbW9kdWxlIG5hbWVkICBgcHNhdXgnIHRvIGhvbGQgIHRoZSBUeXBlIDEgJiAgVHlwZSAyCi0gICAgcGFyc2luZyByb3V0aW5lcy4gIEl0IHNob3VsZCBiZSAgdXNlZCBieSBgdHlwZTEnLCBgY2lkJywgYW5kIGBjZmYnCi0gICAgaW4gdGhlIGZ1dHVyZS4KLQotICAtIEZpeGVkIGFuIGltcG9ydGFudCBidWcgaW4gYEZUX0dseXBoX0dldF9DQm94Jy4KLQotICAtIEZpeGVkICBzb21lIGNvbXBpbGVyICB3YXJuaW5ncyAgdGhhdCBoYXBwZW5lZCAgc2luY2UgdGhlICBUcnVlVHlwZQotICAgIGJ5dGVjb2RlIGRlY29kZXIgd2FzIGRlYWN0aXZhdGVkIGJ5IGRlZmF1bHQuCi0KLSAgLSBGaXhlZCB0d28gbWVtb3J5IGxlYWtzOgotCi0gICAgKiBUaGUgICAgbWVtb3J5ICAgbWFuYWdlciAgICgxNiAgICBieXRlcykgICBpc24ndCAgICByZWxlYXNlZCAgIGluCi0gICAgICBGVF9Eb25lX0ZyZWVUeXBlIQotICAgICogVXNpbmcgY3VzdG9tIGlucHV0IHN0cmVhbXMsIHRoZSAgY29weSBvZiB0aGUgb3JpZ2luYWwgc3RyZWFtIHdhcwotICAgICAgbmV2ZXIgcmVsZWFzZWQuCi0KLSAgLSBGaXhlZCB0aGUgIGF1dG8taGludGVyIGJ5IHBlcmZvcm1pbmcgYXV0b21hdGljICBjb21wdXRhdGlvbiBvZiB0aGUKLSAgICBgZmlsbGluZyBkaXJlY3Rpb24nIG9mIGVhY2ggZ2x5cGguICAgVGhpcyBpcyBkb25lIHRocm91Z2ggYSBzaW1wbGUKLSAgICBhbmQgIGZhc3QgYXBwcm94aW1hdGlvbiwgYW5kICBzZWVtcyB0byAgd29yayAocHJvYmxlbXMgIHNwb3R0ZWQgYnkKLSAgICBXZXJuZXIgdGhvdWdoKS4gIFRoZSBBcnBoaWMgZm9udHMgYXJlIGEgbG90IG5pY2VyIHRob3VnaCB0aGVyZSBhcmUKLSAgICBzdGlsbCBhIGxvdCBvZiB0aGluZ3MgdG8gZG8gdG8gaGFuZGxlIEFzaWFuIGZvbnRzIGNvcnJlY3RseS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUJFVEEtOCAoUkVMRUFTRSBDQU5ESURBVEUpIENIQU5HRVMKLQotICAtIERlYWN0aXZhdGVkIHRoZSBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBieSBkZWZhdWx0LgotCi0gIC0gRGVhY3RpdmF0ZWQgdGhlIGBzcmMvdHlwZTEnIGZvbnQgZHJpdmVyLiAgTm93IGBzcmMvdHlwZTF6JyBpcyB1c2VkCi0gICAgYnkgZGVmYXVsdC4KLQotICAtIFVwZGF0ZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gIFdlIG5vdyBjb21waWxlIHRoZSBsaWJyYXJ5IGNvcnJlY3RseQotICAgIHVuZGVyICBVbml4ICBzeXN0ZW0gIHRocm91Z2ggIGBjb25maWd1cmUnIHdoaWNoICBpcyAgYXV0b21hdGljYWxseQotICAgIGNhbGxlZCBvbiB0aGUgZmlyc3QgYG1ha2UnIGludm9jYXRpb24uCi0KLSAgLSBBZGRlZCB0aGUgYXV0by1oaW50aW5nIG1vZHVsZSEgIEZpeGluZyBzb21lIGJ1Z3MgaGVyZSBhbmQgdGhlcmUuCi0KLSAgLSBGb3VuZCBzb21lIGJ1Z3MgaW4gdGhlICBjb21wb3NpdGUgbG9hZGVyIChzZWFjKSBvZiB0aGUgVHlwZTEtYmFzZWQKLSAgICBmb250IGRyaXZlcnMuCi0KLSAgLSBSZW5hbWVkIHRoZSBkaXJlY3RvcnkgYGZyZWV0eXBlMi9jb25maWcnIHRvIGBmcmVldHlwZTIvYnVpbGRzJyBhbmQKLSAgICB1cGRhdGVkIGFsbCByZWxldmFudCBmaWxlcy4KLQotICAtIEZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGB0eXBlMScgZHJpdmVyLgotCi0gIC0gSW5jb3Jwb3JhdGVkIFRvbSdzIHBhdGNoZXMgdG8gIHN1cHBvcnQgZmxleCBvcGVyYXRvcnMgY29ycmVjdGx5IGluCi0gICAgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgTm93IGFsbCBJIG5lZWQgaXMgdG8gc3VwcG9ydCBwdXJlIENGRiBhbmQgQ0VGCi0gICAgZm9udHMgdG8gYmUgZG9uZSB3aXRoIHRoaXMgZHJpdmVyIDotKQotCi0gIC0gQWRkZWQgdGhlICBXaW5kb3dzIEZOVC9GT04gZHJpdmVyIGluIGBzcmMvd2luZm9udHMnLiAgIEZvciBub3csIGl0Ci0gICAgYWx3YXlzICBgc2ltdWxhdGVzJyAgIGEgIFVuaWNvZGUgIGNoYXJtYXAsICBzbyAgIGl0ICBzaG91bGRuJ3QgIGJlCi0gICAgY29uc2lkZXJlZCBjb21wbGV0ZWQgcmlnaHQgbm93LgotCi0gICAgSXQgIGlzIHRoZXJlICB0byBiZSAgbW9yZSBhICBwcm9vZiBvZiAgY29uY2VwdCB0aGFuICBhbnl0aGluZyBlbHNlCi0gICAgYW55d2F5LiAgVGhlIGRyaXZlciBpcyBhIHNpbmdsZSAgQyBzb3VyY2UgZmlsZSwgdGhhdCBjb21waWxlcyB0byAzCi0gICAgS2Igb2YgY29kZS4KLQotICAgIEknbSAgc3RpbGwgd29ya2luZyBvbiAgdGhlIFBDRi9CREYgIGRyaXZlcnMsIGJ1dCAgSSdtIHRvbyAgbGF6eSB0bwotICAgIGZpbmlzaCB0aGVtIG5vdy4KLQotICAtIENIQU5HRVMgVE8gVEhFIEhJR0gtTEVWRUwgQVBJCi0KLSAgICAqIEZUX0dldF9LZXJuaW5nIGhhcyBhIG5ldyBwYXJhbWV0ZXIgdGhhdCBhbGxvd3MgeW91IHRvIHNlbGVjdCB0aGUKLSAgICAgIGNvb3JkaW5hdGVzIG9mIHRoZSBrZXJuaW5nICB2ZWN0b3IgKGZvbnQgdW5pdHMsIHNjYWxlZCwgc2NhbGVkICsKLSAgICAgIGdyaWQtZml0dGVkKS4KLSAgICAqIFRoZSAgb3V0bGluZSBmdW5jdGlvbnMgYXJlICBub3cgaW4gPGZyZWV0eXBlL2Z0b3V0bG4uaD4gIGFuZCBub3QKLSAgICAgIHBhcnQgb2YgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+IGFueW1vcmUuCi0gICAgKiA8ZnJlZXR5cGUvZnRtb2R1bGUuaD4gICAgbm93ICAgICBjb250YWlucyAgICBkZWNsYXJhdGlvbnMgICAgZm9yCi0gICAgICAgRlRfTmV3X0xpYnJhcnksIEZUX0RvbmVfTGlicmFyeSwgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcy4KLSAgICAqIFRoZSBzby1jYWxsZWQgY29udmVuaWVuY2UgIGZ1bmN0aW9ucyBoYXZlIG1vdmVkIGZyb20gYGZ0b3V0bG4uYycKLSAgICAgIHRvICBgZnRnbHlwaC5jJywgIGFuZCAgYXJlICB0aHVzIGF2YWlsYWJsZSAgd2l0aCAgdGhpcyAgb3B0aW9uYWwKLSAgICAgIGNvbXBvbmVudCAgICBvZiAgIHRoZSAgIGxpYnJhcnkuICAgICBUaGV5ICAgYXJlICAgIGRlY2xhcmVkICAgaW4KLSAgICAgIDxmcmVldHlwZS9mdGdseXBoLmg+IG5vdy4KLSAgICAqIEFudGktYWxpYXNlZCAgcmVuZGVyaW5nIGlzIG5vdyAgdGhlIGRlZmF1bHQgIGZvciBGVF9SZW5kZXJfR2x5cGgKLSAgICAgIChpLmUuIGNvcnJlc3BvbmRzIHRvIHJlbmRlcl9tb2RlID09IDAgPT0gZnRfcmVuZGVyX21vZGVfbm9ybWFsKS4KLSAgICAgIFRvIGdlbmVyYXRlIGEgbW9ub2Nocm9tZSBiaXRtYXAsIHVzZSBmdF9yZW5kZXJfbW9kZV9tb25vLCBvciB0aGUKLSAgICAgIEZUX0xPQURfTU9OT0NIUk9NRSAgICAgZmxhZyAgICBpbiAgICBGVF9Mb2FkX0dseXBoL0ZUX0xvYWRfQ2hhci4KLSAgICAgIEZUX0xPQURfQU5USV9BTElBUyBpcyBzdGlsbCBkZWZpbmVkLCBidXQgdmFsdWVzIHRvIDAuCi0gICAgKiA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4gIG5vdyBpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRjb25maWcuaD4sCi0gICAgICBzb2x2aW5nIGEgZmV3IGhlYWRhY2hlcyA6LSkKLSAgICAqIFRoZSB0eXBlIEZUX0dseXBoU2xvdFJlYyBoYXMgbm93IGEgYGxpYnJhcnknIGZpZWxkLgotCi0gIC0gQ0hBTkdFUyBUTyBUSEUgYGZ0Z2x5cGguaCcgQVBJCi0KLSAgICBUaGlzIEFQSSBoYXMgIGJlZW4gc2V2ZXJlbHkgbW9kaWZpZWQgaW4gb3JkZXIgIHRvIG1ha2UgaXQgc2ltcGxlciwKLSAgICBjbGVhcmVyLCBhbmQgbW9yZSAgZWZmaWNpZW50LiAgSXQgY2VydGFpbmx5IG5vdyBsb29rcyAgbGlrZSBhIHJlYWwKLSAgICBgZ2x5cGggZmFjdG9yeScgIG9iamVjdCwgYW5kIGFsbG93cyBjbGllbnQgIGFwcGxpY2F0aW9ucyB0byBtYW5hZ2UKLSAgICAoaS5lLiAgdHJhbnNmb3JtLCAgYmJveCAgYW5kICByZW5kZXIpIGdseXBoICBpbWFnZXMgIHdpdGhvdXQgIGV2ZXIKLSAgICBrbm93aW5nIHRoZWlyIG9yaWdpbmFsIGZvcm1hdC4KLQotICAtIEFkZGVkICBzdXBwb3J0ICBmb3IgQ0lELWtleWVkICBmb250cyAgdG8gIHRoZSAgQ0ZGIGRyaXZlci4gICBNYXliZQotICAgIHN1cHBvcnQgZm9yIHB1cmUgQ0ZGICsgQ0VGIGZvbnRzIHNob3VsZCBjb21lIGluPwotCi0gIC0gQ2xlYW5lZCB1cCAgc291cmNlIGNvZGUgaW4gb3JkZXIgIHRvIGF2b2lkIHR3byAgZnVuY3Rpb25zIHdpdGggdGhlCi0gICAgc2FtZSBuYW1lLiAgQWxzbyAgY2hhbmdlZCB0aGUgbmFtZXMgb2YgdGhlICBmaWxlcyBpbiBgdHlwZTF6JyBmcm9tCi0gICAgYHQxWFhYWCcgdG8gYHoxWFhYWCcgaW4gb3JkZXIgdG8gYXZvaWQgYW55IGNvbmZsaWN0cy4KLQotICAgIGBtYWtlIG11bHRpJyBub3cgd29ya3Mgd2VsbCA6LSkKLQotICAgIEFsc28gcmVtb3ZlZCB0aGUgdXNlIG9mIGBjaWRhZm0nIGZvciBub3csIGV2ZW4gaWYgdGhlIHNvdXJjZSBmaWxlcwotICAgIGFyZSAgc3RpbGwgdGhlcmUuICBUaGlzICBmdW5jdGlvbmFsaXR5IHdpbGwgIGNlcnRhaW5seSAgZ28gaW50byAgYQotICAgIHNwZWNpZmljIG1vZHVsZS4KLQotICAtIEFEREVEIFNVUFBPUlQgRk9SIFRIRSBBVVRPLUhJTlRFUgotCi0gICAgSXQgIHdvcmtzIDotKSBJICBoYXZlIGEgIGRlbW8gcHJvZ3JhbSAgd2hpY2ggc2ltcGx5ICBpcyBhICBjb3B5IG9mCi0gICAgYGZ0dmlldycgICAgICAgdGhhdCAgICAgIGRvZXMgICAgICAgYSAgICAgIGBGVF9BZGRfTW9kdWxlKGxpYnJhcnksCi0gICAgJmF1dG9oaW50ZXJfbW9kdWxlX2NsYXNzKScgYWZ0ZXIgIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24sIGFuZCBUeXBlCi0gICAgMSAmIE9wZW5UeXBlL0NGRiBmb250cyBhcmUgbm93IGhpbnRlZC4KLQotICAgIENJRCAgZm9udHMgYXJlICBub3QgaGludGVkLCAgYXMgdGhleSAgaW5jbHVkZSBubyAgY2hhcm1hcCAgYW5kIHRoZQotICAgIGF1dG8taGludGVyIGRvZXNuJ3QgaW5jbHVkZSAgYGdlbmVyaWMnIGdsb2JhbCBtZXRyaWNzIGNvbXB1dGF0aW9ucwotICAgIHlldC4KLQotICAgIE5vdywgSSBuZWVkIHRvIHJlbGVhc2UgdGhpcyB0aGluZyB0byB0aGUgRnJlZVR5cGUgMiBzb3VyY2UuCi0KLSAgLSBDSEFOR0VTIFRPIFRIRSBSRU5ERVJFUiBNT0RVTEVTCi0KLSAgICBUaGUgIG1vbm9jaHJvbWUgIGFuZCBzbW9vdGggIHJlbmRlcmVycyAgYXJlICBub3cgIGluIHR3byAgZGlzdGluY3QKLSAgICBkaXJlY3RvcmllcywgbmFtZWx5IGBzcmMvcmFzdGVyMScgYW5kIGBzcmMvc21vb3RoJy4gIE5vdGUgdGhhdCB0aGUKLSAgICBvbGQgYHNyYy9yZW5kZXJlcicgaXMgbm93IGdvbmUuCi0KLSAgICBJIGRpdGNoZWQgIHRoZSA1LWdyYXktbGV2ZWxzIHJlbmRlcmVycy4gIEJhc2ljYWxseSwgIGl0IGludm9sdmVkIGEKLSAgICBzaW1wbGUgI2RlZmluZSB0b2dnbGUgaW4gJ3NyYy9yYXN0ZXIxL2Z0cmFzdGVyLmMnLgotCi0gICAgRlRfUmVuZGVyX0dseXBoLCAgRlRfT3V0bGluZV9SZW5kZXIgICYgIEZUX091dGxpbmVfR2V0X0JpdG1hcCAgbm93Ci0gICAgc2VsZWN0IHRoZSBiZXN0IHJlbmRlcmVyICBhdmFpbGFibGUsIGRlcGVuZGluZyBvbiByZW5kZXIgbW9kZS4gIElmCi0gICAgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIGEgIGdpdmVuIGdseXBoIGltYWdlIGZvcm1hdCBpc24ndCBjYXBhYmxlCi0gICAgb2Ygc3VwcG9ydGluZyAgdGhlIHJlbmRlciBtb2RlLCBhbm90aGVyICBvbmUgd2lsbCBiZSAgZm91bmQgaW4gdGhlCi0gICAgbGlicmFyeSdzIGxpc3QuICAgVGhpcyBtZWFucyB0aGF0IGNsaWVudCBhcHBsaWNhdGlvbnMgIGRvIG5vdCBuZWVkCi0gICAgdG8gIHN3aXRjaCBvciAgc2V0ICB0aGUgIHJlbmRlcmVycyB0aGVtc2VsdmVzICAoYXMgIGluIHRoZSAgbGF0ZXN0Ci0gICAgY2hhbmdlKSwgdGhleSdsbCBnZXQgd2hhdCB0aGV5IHdhbnQgYXV0b21hdGljYWxseS4gIEF0IGxhc3QuCi0KLSAgICBDaGFuZ2VkIHRoZSBkZW1vIHByb2dyYW1zIGFjY29yZGluZ2x5LgotCi0gIC0gTUFKT1IgSU5URVJOQUwgUkVERVNJR046Ci0KLSAgICBBIGxvdCBvZiBpbnRlcm5hbCBtb2RpZmljYXRpb25zICBoYXZlIGJlZW4gcGVyZm9ybWVkIGxhdGVseSBvbiB0aGUKLSAgICBzb3VyY2UgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgZm9sbG93aW5nIGVuaGFuY2VtZW50czoKLQotICAgICogTW9yZSBnZW5lcmljIG1vZHVsZSBzdXBwb3J0OgotCi0gICAgICBUaGUgRlRfTW9kdWxlICB0eXBlIGlzICBub3cgZGVmaW5lZCB0byAgcmVwcmVzZW50IGEgaGFuZGxlICB0byBhCi0gICAgICBnaXZlbiAgbW9kdWxlLiAgIFRoZSAgZmlsZSAgPGZyZWV0eXBlL2Z0bW9kdWxlLmg+ICBjb250YWlucyAgdGhlCi0gICAgICBGVF9Nb2R1bGVfQ2xhc3MgZGVmaW5pdGlvbiwgYXMgd2VsbCBhcyB0aGUgbW9kdWxlLWxvYWRpbmcgcHVibGljCi0gICAgICBBUEkuCi0KLSAgICAgIFRoZSAgRlRfRHJpdmVyIHR5cGUgIGlzIHN0aWxsICBkZWZpbmVkLCBhbmQgIHN0aWxsICByZXByZXNlbnRzIGEKLSAgICAgIHBvaW50ZXIgdG8gIGEgZm9udCBkcml2ZXIuICBOb3RlIHRoYXQgIEZUX0FkZF9Ecml2ZXIgaXMgcmVwbGFjZWQKLSAgICAgIGJ5IEZUX0FkZF9Nb2R1bGUsIEZUX0dldF9Ecml2ZXIgYnkgRlRfR2V0X01vZHVsZSwgZXRjLgotCi0gICAgKiBTdXBwb3J0IGZvciBnZW5lcmljIGdseXBoIGltYWdlIHR5cGVzOgotCi0gICAgICBUaGUgRlRfUmVuZGVyZXIgIHR5cGUgaXMgYSBwb2ludGVyICB0byBhIG1vZHVsZSAgdXNlZCB0byBwZXJmb3JtCi0gICAgICB2YXJpb3VzIG9wZXJhdGlvbnMgb24gZ2x5cGggaW1hZ2UuCi0KLSAgICAgIEVhY2ggcmVuZGVyZXIgaXMgIGNhcGFibGUgb2YgaGFuZGxpbmcgaW1hZ2VzIGluICBhIHNpbmdsZSBmb3JtYXQKLSAgICAgIChlLmcuIGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lKS4gIEl0cyBmdW5jdGlvbnMgYXJlIHVzZWQgdG86Ci0KLSAgICAgIC0gdHJhbnNmb3JtIGFuIGdseXBoIGltYWdlCi0gICAgICAtIHJlbmRlciBhIGdseXBoIGltYWdlIGludG8gYSBiaXRtYXAKLSAgICAgIC0gcmV0dXJuIHRoZSBjb250cm9sIGJveCAoZGltZW5zaW9ucykgb2YgYSBnaXZlbiBnbHlwaCBpbWFnZQotCi0gICAgICBUaGUgc2NhbiBjb252ZXJ0ZXJzIGBmdHJhc3Rlci5jJyBhbmQgYGZ0Z3JheXMuYycgaGF2ZSBiZWVuIG1vdmVkCi0gICAgICB0byB0aGUgbmV3IGRpcmVjdG9yeSBgc3JjL3JlbmRlcmVyJywgYW5kIGFyZSB1c2VkIHRvIHByb3ZpZGUgdHdvCi0gICAgICBkZWZhdWx0IHJlbmRlcmVyIG1vZHVsZXMuCi0KLSAgICAgIE9uZSBjb3JyZXNwb25kcyAgdG8gdGhlIGBzdGFuZGFyZCcgc2Nhbi1jb252ZXJ0ZXIsICB0aGUgb3RoZXIgdG8KLSAgICAgIHRoZSBgc21vb3RoJyBvbmUuCi0KLSAgICAgIGhlICBjdXJyZW50ICByZW5kZXJlciAgY2FuICBiZSAgc2V0ICB0aHJvdWdoICB0aGUgIG5ldyAgZnVuY3Rpb24KLSAgICAgIEZUX1NldF9SZW5kZXJlci4KLQotICAgICAgVGhlIG9sZCByYXN0ZXItcmVsYXRlZCBmdW5jdGlvbiBGVF9TZXRfUmFzdGVyLCBGVF9HZXRfUmFzdGVyIGFuZAotICAgICAgRlRfU2V0X1Jhc3Rlcl9Nb2RlIGhhdmUgbm93IGRpc2FwcGVhcmVkLCBpbiBmYXZvciBvZiB0aGUgbmV3OgotCi0gICAgICAgIEZUX0dldF9SZW5kZXJlcgotICAgICAgICBGVF9TZXRfUmVuZGVyZXIKLQotICAgICAgU2VlIHRoZSBmaWxlIDxmcmVldHlwZS9mdHJlbmRlci5oPiBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBUaGVzZSAgY2hhbmdlcyAgd2VyZSAgbmVjZXNzYXJ5ICB0byBwcm9wZXJseSAgc3VwcG9ydCAgZGlmZmVyZW50Ci0gICAgICBzY2FsYWJsZSBmb3JtYXRzIGluIHRoZSBmdXR1cmUsIGxpa2UgYmktY29sb3IgZ2x5cGhzLCBldGMuCi0KLSAgICAqIEdseXBoIGxvYWRlciBvYmplY3Q6Ci0KLSAgICAgIEEgIG5ldyAgaW50ZXJuYWwgIG9iamVjdCwgIGNhbGxlZCAgYSAgJ2dseXBoICBsb2FkZXInICBoYXMgIGJlZW4KLSAgICAgIGludHJvZHVjZWQgaW4gdGhlIGJhc2UgbGF5ZXIuICBJdCBpcyB1c2VkIGJ5IGFsbCBzY2FsYWJsZSBmb3JtYXQKLSAgICAgIGZvbnQgZHJpdmVycyB0byBsb2FkIGdseXBocyBhbmQgY29tcG9zaXRlcy4KLQotICAgICAgVGhpcyBvYmplY3QgIGhhcyBiZWVuICBjcmVhdGVkIHRvIHJlZHVjZSAgdGhlIGNvZGUgc2l6ZSAgb2YgZWFjaAotICAgICAgZHJpdmVyLCAgYXMgIGVhY2ggIG9uZSAgb2YgIHRoZW0gIGJhc2ljYWxseSAgcmUtaW1wbGVtZW50ZWQgIGl0cwotICAgICAgZnVuY3Rpb25hbGl0eS4KLQotICAgICAgU2VlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4gYW5kIHRoZSBGVF9HbHlwaExvYWRlciB0eXBlIGZvcgotICAgICAgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICogRlRfR2x5cGhTbG90IGhhcyBuZXcgZmllbGRzOgotCi0gICAgICBJbiAgb3JkZXIgICB0byAgc3VwcG9ydCAgZXh0ZW5kZWQgIGZlYXR1cmVzICAgKHNlZSAgYmVsb3cpLCAgdGhlCi0gICAgICBGVF9HbHlwaFNsb3Qgc3RydWN0dXJlIGhhcyBhIGZldyBuZXcgZmllbGRzOgotCi0gICAgICBsaW5lYXJIb3JpQWR2YW5jZToKLQotICAgICAgICBUaGlzICBmaWVsZCAgZ2l2ZXMgIHRoZSAgIGxpbmVhcmx5ICBzY2FsZWQgIChpLmUuICBzY2FsZWQgIGJ1dAotICAgICAgICB1bmhpbnRlZCkgYWR2YW5jZSAgd2lkdGggZm9yIHRoZSAgZ2x5cGgsIGV4cHJlc3NlZCBhcyAgYSAxNi4xNgotICAgICAgICBmaXhlZCBwaXhlbCB2YWx1ZS4gIFRoaXMgaXMgdXNlZnVsIHRvIHBlcmZvcm0gV1lTSVdZRyB0ZXh0LgotCi0gICAgICBsaW5lYXJWZXJ0QWR2YW5jZToKLSAgICAgICAgVGhpcyBmaWVsZCAgZ2l2ZXMgdGhlIGxpbmVhcmx5ICBzY2FsZWQgYWR2YW5jZSBoZWlnaHQgIGZvciB0aGUKLSAgICAgICAgZ2x5cGggIChyZWxldmFudCBpbiAgdmVydGljYWwgIGdseXBoIGxheW91dHMgIG9ubHkpLiAgVGhpcyAgaXMKLSAgICAgICAgdXNlZnVsIHRvIHBlcmZvcm0gV1lTSVdZRyB0ZXh0LgotCi0gICAgICAgIE5vdGUgdGhhdCAgdGhlIHR3byBhYm92ZSBmaWVsZCByZXBsYWNlICB0aGUgcmVtb3ZlZCBgbWV0cmljczInCi0gICAgICAgIGZpZWxkIGluIHRoZSBnbHlwaCBzbG90LgotCi0gICAgICBhZHZhbmNlOgotICAgICAgICBUaGlzIGZpZWxkIGlzIGEgdmVjdG9yICB0aGF0IGdpdmVzIHRoZSB0cmFuc2Zvcm1lZCBhZHZhbmNlIGZvcgotICAgICAgICB0aGUgZ2x5cGguICAgQnkgZGVmYXVsdCwgaXQgY29ycmVzcG9uZHMgdG8gIHRoZSBhZHZhbmNlIHdpZHRoLAotICAgICAgICB1bmxlc3MgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICB3YXMgIHNwZWNpZmllZCAgd2hlbiAgY2FsbGluZwotICAgICAgICBGVF9Mb2FkX0dseXBoIG9yIEZUX0xvYWRfQ2hhci4KLQotICAgICAgYml0bWFwX2xlZnQ6Ci0gICAgICAgIFRoaXMgIGZpZWxkIGdpdmVzICB0aGUgIGRpc3RhbmNlIGluICBpbnRlZ2VyICBwaXhlbHMgZnJvbSAgdGhlCi0gICAgICAgIGN1cnJlbnQgcGVuIHBvc2l0aW9uICB0byB0aGUgbGVmdC1tb3N0IHBpeGVsIG9mICBhIGdseXBoIGltYWdlCi0gICAgICAgIElGIElUIElTICBBIEJJVE1BUC4gIEl0IGlzIG9ubHkgdmFsaWQgIHdoZW4gdGhlIGBmb3JtYXQnIGZpZWxkCi0gICAgICAgIGlzIHNldCB0byBgZnRfZ2x5cGhfZm9ybWF0X2JpdG1hcCcsIGZvciBleGFtcGxlLCBhZnRlciBjYWxsaW5nCi0gICAgICAgIHRoZSBuZXcgZnVuY3Rpb24gRlRfUmVuZGVyX0dseXBoLgotCi0gICAgICBiaXRtYXBfdG9wOgotICAgICAgICBUaGlzICBmaWVsZCBnaXZlcyAgdGhlICBkaXN0YW5jZSBpbiAgaW50ZWdlciAgcGl4ZWxzIGZyb20gIHRoZQotICAgICAgICBjdXJyZW50IHBlbiBwb3NpdGlvbiAobG9jYXRlZCBvbiB0aGUgYmFzZWxpbmUpIHRvIHRoZSB0b3AtbW9zdAotICAgICAgICBwaXhlbCBvZiB0aGUgIGdseXBoIGltYWdlIElGIElUIElTICBBIEJJVE1BUC4gIFBvc2l0aXZlIHZhbHVlcwotICAgICAgICBjb3JyZXNwb25kIHRvIHVwd2FyZHMgWS4KLQotICAgICAgbG9hZGVyOgotICAgICAgICBUaGlzICBpcyBhICBuZXcgIHByaXZhdGUgIGZpZWxkIGZvciAgdGhlICBnbHlwaCBzbG90LiAgIENsaWVudAotICAgICAgICBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCB0b3VjaCBpdC4KLQotCi0gICAgKiBTdXBwb3J0IGZvciB0cmFuc2Zvcm1zIGFuZCBkaXJlY3QgcmVuZGVyaW5nIGluIEZUX0xvYWRfR2x5cGg6Ci0KLSAgICAgIE1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgZm91bmQgaW4gPGZyZWV0eXBlL2Z0Z2x5cGguaD4gaGFzIGJlZW4KLSAgICAgIG1vdmVkIHRvIHRoZSBjb3JlIGxpYnJhcnkuICBIZW5jZSwgdGhlIGZvbGxvd2luZzoKLQotICAgICAgLSBBICAgdHJhbnNmb3JtICAgY2FuICAgYmUgICBzcGVjaWZpZWQgIGZvciAgIGEgICBmYWNlICAgdGhyb3VnaAotICAgICAgICBGVF9TZXRfVHJhbnNmb3JtLiAgdGhpcyB0cmFuc2Zvcm0gIGlzIGFwcGxpZWQgYnkgRlRfTG9hZF9HbHlwaAotICAgICAgICB0byAgc2NhbGFibGUgZ2x5cGggIGltYWdlcyAoaS5lLiAgTk9UIFRPICBCSVRNQVBTKSAgYmVmb3JlIHRoZQotICAgICAgICBmdW5jdGlvbiByZXR1cm5zLCB1bmxlc3MgdGhlIGJpdCBmbGFnIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STQotICAgICAgICB3YXMgc2V0IGluIHRoZSBsb2FkIGZsYWdzLgotCi0gICAgICAtIE9uY2UgIGEgIGdseXBoIGltYWdlICBoYXMgIGJlZW4gIGxvYWRlZCwgIGl0IGNhbiAgYmUgIGRpcmVjdGx5Ci0gICAgICAgIGNvbnZlcnRlZCAgdG8gIGEgIGJpdG1hcCAgYnkgIHVzaW5nICB0aGUgIG5ldyAgRlRfUmVuZGVyX0dseXBoCi0gICAgICAgIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHRoaXMgIGZ1bmN0aW9uIHRha2VzIHRoZSBnbHlwaCBpbWFnZSBmcm9tCi0gICAgICAgIHRoZSBnbHlwaCBzbG90LCAgYW5kIGNvbnZlcnRzIGl0IHRvIGEgIGJpdG1hcCB3aG9zZSBwcm9wZXJ0aWVzCi0gICAgICAgIGFyZSByZXR1cm5lZCAgaW4gYGZhY2UuZ2x5cGguYml0bWFwJywgYGZhY2UuZ2x5cGguYml0bWFwX2xlZnQnCi0gICAgICAgIGFuZCBgZmFjZS5nbHlwaC5iaXRtYXBfdG9wJy4gIFRoZSAgb3JpZ2luYWwgbmF0aXZlIGltYWdlIG1pZ2h0Ci0gICAgICAgIGJlIGxvc3QgYWZ0ZXIgdGhlIGNvbnZlcnNpb24uCi0KLSAgICAgIC0gV2hlbiB1c2luZyB0aGUgbmV3ICBiaXQgZmxhZyBGVF9MT0FEX1JFTkRFUiwgdGhlIEZUX0xvYWRfR2x5cGgKLSAgICAgICAgYW5kICAgRlRfTG9hZF9DaGFyICAgZnVuY3Rpb25zICAgd2lsbCAgIGNhbGwgICBGVF9SZW5kZXJfR2x5cGgKLSAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIG5lZWRlZC4KLQotICAtIFJlZm9ybWF0dGVkIGFsbCAgbW9kdWxlcyBzb3VyY2UgIGNvZGUgaW4gb3JkZXIgIHRvIGdldCByaWQgIG9mIHRoZQotICAgIGJhc2ljIGRhdGEgdHlwZXMgcmVkZWZpbml0aW9ucyAoaS5lLiBgVFRfSW50JyBpbnN0ZWFkIG9mIGBGVF9JbnQnLAotICAgIGBUMV9GaXhlZCcgIGluc3RlYWQgIG9mICBgRlRfRml4ZWQnKS4gIEhlbmNlICB0aGUgIGZvcm1hdC1zcGVjaWZpYwotICAgIHByZWZpeGVzIGxpa2UgIGBUVF8nLCBgVDFfJywgIGBUMl8nIGFuZCBgQ0lEXycgIGFyZSBvbmx5ICB1c2VkIGZvcgotICAgIHJlbGV2YW50IHN0cnVjdHVyZXMuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1PTEQgQ0hBTkdFUyBGT1IgQkVUQSA3Ci0KLSAgLSBidWctZml4ZWQgdGhlICBPcGVuVHlwZS9DRkYgcGFyc2VyLiAgSXQgIG5vdyBsb2FkcyBhbmQgZGlzcGxheXMgbXkKLSAgICB0d28gIGZvbnRzIG5pY2VseSwgIGJ1dCBJJ20gIHByZXR0eSBjZXJ0YWluICB0aGF0IG1vcmUgIHRlc3RpbmcgaXMKLSAgICBuZWVkZWQgOi0pCi0KLSAgLSBmaXhlZCB0aGUgY3J1bW15IFR5cGUgMSBoaW50ZXIsIGl0IG5vdyBoYW5kbGVzIGFjY2VudGVkIGNoYXJhY3RlcnMKLSAgICBjb3JyZWN0bHkgKHdlbGwsIHRoZSBhY2NlbnQgaXMgIG5vdCBhbHdheXMgd2VsbCBwbGFjZWQsIGJ1dCB0aGF0J3MKLSAgICBhbm90aGVyIHByb2JsZW0uLikKLQotICAtIGFkZGVkIHRoZSBDSUQta2V5ZWQgVHlwZSAxIGRyaXZlciBpbiBgc3JjL2NpZCcuICBXb3JrcyBwcmV0dHkgd2VsbAotICAgIGZvciBvbmx5IDEzIEtiIG9mIGNvZGUgIDstKSBEb2Vzbid0IHJlYWQgQUZNIGZpbGVzIHRob3VnaCwgbm9yIHRoZQotICAgIHJlYWxseSB1c2VmdWwgQ01BUCBmaWxlcy4uCi0KLSAgLSBmaXhlZCAgdHdvICBidWdzICBpbiAgdGhlICBzbW9vdGggIHJlbmRlcmVyICAoc3JjL2Jhc2UvZnRncmF5cy5jKS4KLSAgICBUaGFua3MgdG8gQm9yaXMgTGV0b2NoYSBmb3Igc3BvdHRpbmcgdGhlbSBhbmQgcHJvdmlkaW5nIGEgZml4LgotCi0gIC0gZml4ZWQgcG90ZW50aWFsIGBkaXZpZGUgYnkgemVybycgYnVncyBpbiBmdGNhbGMuYy4KLQotICAtIGFkZGVkIHNvdXJjZSAgY29kZSBmb3IgIHRoZSBPcGVuVHlwZS9DRkYgZHJpdmVyICAoc3RpbGwgaW5jb21wbGV0ZQotICAgIHRob3VnaC4uKQotCi0gIC0gbW9kaWZpZWQgdGhlICBTRk5UIGRyaXZlciBzbGlnaHRseSAgdG8gcGVyZm9ybSBtb3JlICByb2J1c3QgaGVhZGVyCi0gICAgY2hlY2tzICBpbiBUVF9Mb2FkX1NGTlRfSGVhZGVyLiAgVGhpcyBwcmV2ZW50cyBjZXJ0YWluICBmb250IGZpbGVzCi0gICAgKGUuZy4gIHNvbWUgIFR5cGUgIDEgIE11bHRpcGxlICBNYXN0ZXJzKSAgZnJvbSAgYmVpbmcgIGluY29ycmVjdGx5Ci0gICAgYHJlY29nbml6ZWQnIGFzIFRydWVUeXBlIGZvbnQgZmlsZXMuLgotCi0gIC0gbW92ZWQgYSBsb3Qgb2Ygc3R1ZmYgZnJvbSAgdGhlIFRydWVUeXBlIGRyaXZlciB0byB0aGUgU0ZOVCBtb2R1bGUsCi0gICAgdGhpcyAgIGFsbG93cyAgIGdyZWF0ZXIgICBjb2RlICAgcmUtdXNlICAgYmV0d2VlbiAgIGZvbnQgICBkcml2ZXJzCi0gICAgKGUuZy4gVHJ1ZVR5cGUsIE9wZW5UeXBlLCBDb21wYWN0LVRydWVUeXBlLCBldGMuLikKLQotICAtIGFkZGVkIGEgdGlueSBzZWdtZW50IGNhY2hlIHRvIHRoZSBTRk5UIENoYXJtYXAgNCBkZWNvZGVyLCBpbiBvcmRlcgotICAgIHRvIG1pbmltYWxseSBzcGVlZCBpdCB1cC4uCi0KLSAgLSBhZGRlZCAgc3VwcG9ydCBmb3IgIE11bHRpcGxlIE1hc3RlciAgZm9udHMgaW4gIGB0eXBlMXonLiAgVGhlcmUgaXMKLSAgICBhbHNvIGEgbmV3IGZpbGUgbmFtZWQgPGZyZWV0eXBlL2Z0bW0uaD4gd2hpY2ggZGVmaW5lcyBmdW5jdGlvbnMgdG8KLSAgICBtYW5hZ2UgdGhlbSBmcm9tIGNsaWVudCBhcHBsaWNhdGlvbnMuCi0KLSAgICBUaGUgbmV3IGZpbGUgYHNyYy9iYXNlL2Z0bW0uYycgaXMgYWxzbyBvcHRpb25hbCB0byB0aGUgZW5naW5lLi4KLQotICAtIHZhcmlvdXMgIGZvcm1hdHRpbmcgY2hhbmdlcyAoZS5nLiAgRVhQT1JUX0RFRiAtPiAgRlRfRVhQT1JUX0RFRikgKwotICAgIHNtYWxsIGJ1ZyBmaXhlcyBpbiBGVF9Mb2FkX0dseXBoLCB0aGUgYHR5cGUxJyBkcml2ZXIsIGV0Yy4uCi0KLSAgLSBhIG1pbm9yIGZpeCB0byB0aGUgVHlwZSAxIGRyaXZlciB0byBsZXQgdGhlbSBhcHBseSB0aGUgZm9udCBtYXRyaXgKLSAgICBjb3JyZWN0bHkgKHVzZWQgZm9yIG1hbnkgb2JsaXF1ZSBmb250cy4uKQotCi0gIC0gc29tZSBmaXhlcyBmb3IgNjQtYml0IHN5c3RlbXMgKG1haW5seSBjaGFuZ2luZyBzb21lIEZUX1RSQUNFIGNhbGxzCi0gICAgdG8gdXNlICVwIGluc3RlYWQgb2YgJWx4KS4gIFRoYW5rcyB0byBLYXJsIFJvYmlsbGFyZC4KLQotICAtIGZpeGVkICBzb21lIGJ1Z3MgIGluICB0aGUgc2JpdCAgbG9hZGVyIChzcmMvYmFzZS9zZm50L3R0c2JpdC5jKSAgKwotICAgIGFkZGVkICBhIG5ldyBmbGFnLCAgRlRfTE9BRF9DUk9QX0JJVE1BUCB0byAgcXVlcnkgdGhhdCAgYml0bWFwcyBiZQotICAgIGNyb3BwZWQgd2hlbiAgbG9hZGVkIGZyb20gYSBmaWxlICAobWF5YmUgSSBzaG91bGQgIG1vdmUgdGhlIGJpdG1hcAotICAgIGNyb3BwZXIgdG8gdGhlIGJhc2UgbGF5ZXIgPz8pLgotCi0gIC0gY2hhbmdlZCB0aGUgZGVmYXVsdCAgbnVtYmVyIG9mIGdyYXkgbGV2ZWxzIG9mICB0aGUgc21vb3RoIHJlbmRlcmVyCi0gICAgdG8gMjU2ICAoaW5zdGVhZCBvZiAgdGhlIHByZXZpb3VzIDEyOCkuICBPZiBjb3Vyc2UsIHRoZSAgaHVtYW4gZXllCi0gICAgY2FuJ3Qgc2VlIGFueSBkaWZmZXJlbmNlIDstKQotCi0gIC0gcmVtb3ZlZCBUVF9NQVhfU1VCR0xZUEhTLCAgdGhlcmUgaXMgbm8gc3RhdGljIGxpbWl0ICBvbiB0aGUgbnVtYmVyCi0gICAgb2Ygc3ViZ2x5cGhzIGluIGEgVHJ1ZVR5cGUgZm9udCBub3cuLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotT0xEIENIQU5HRVMgMTYgTWF5IDIwMDAKLQotICAtIHRhZ2dlZCBgQkVUQS02JyAgaW4gdGhlICBDVlMgdHJlZS4gIFRoaXMgb25lIGlzIGEgIHNlcmlvdXMgcmVsZWFzZQotICAgIGNhbmRpZGF0ZSBldmVuIHRob3VnaCBpdCBkb2Vzbid0IGluY29ycG9yYXRlIHRoZSBhdXRvLWhpbnRlciB5ZXQuLgotCi0gIC0gdmFyaW91cyBvYnNvbGV0ZSBmaWxlcyB3ZXJlIHJlbW92ZWQsIGFuZCBjb3B5cmlnaHQgaGVhZGVyIHVwZGF0ZWQKLQotICAtIGZpbmFsbHkgIHVwZGF0ZWQgIHRoZSAgc3RhbmRhcmQgICByYXN0ZXIgIHRvICBmaXggIHRoZSAgbW9ub2Nocm9tZQotICAgIHJlbmRlcmluZyBidWcgKyByZS1lbmFibGUgIHN1cHBvcnQgZm9yIDUtZ3JheSBsZXZlbHMgYW50aS1hbGlhc2luZwotICAgIChzdWNrLCBzdWNrLi4pCi0KLSAgLSBjcmVhdGVkIG5ldyBoZWFkZXIgZmlsZXMsIGFuZCBtb2RpZmllZCBzb3VyY2VzIGFjY29yZGluZ2x5OgotCi0gICAgIDxmcmVldHlwZS9mdHR5cGVzLmg+Ci0gICAgICAgLSBzaW1wbGUgRnJlZVR5cGUgdHlwZXMsIHdpdGhvdXQgdGhlIEFQSQotICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KLSAgICAgICAtIGRlZmluaXRpb24gb2YgbWVtb3J5LW1hbmFnZW1lbnQgbWFjcm9zCi0KLSAgLSBhZGRlZCAgIHRoZSAgIGBEU0lHJyAgIChPcGVuVHlwZSAgIERpZ2l0YWwgICBTaWduYXR1cmUpICAgdGFnICAgdG8KLSAgICA8ZnJlZXR5cGUvdHR0YWdzLmg+Ci0KLSAgLSBsaWdodCB1cGRhdGUvY2xlYW5pbmcgb2YgdGhlIGJ1aWxkIHN5c3RlbSArIGNoYW5nZXMgdG8gdGhlIHNvdXJjZXMKLSAgICBpbiAgb3JkZXIgIHRvICBnZXQgIHJpZCAgb2YgX2FsbF8gIGNvbXBpbGVyICB3YXJuaW5ncyAgd2l0aCAgdGhyZWUKLSAgICBjb21waWxlcnMsIGkuZToKLQotICAgIGdjYyB3aXRoIGAtYW5zaSAtcGVkYW50aWMgLVdhbGwgLVcnLCBWaXN1YWwgQysrIHdpdGggYC9XMyAvV1gnIGFuZAotICAgIExDQwotCi0gICAgSU1QT1JUQU5UIE5PVEUgRk9SIFdJTjMyLUxDQyBVU0VSUzoKLSAgICB8Ci0gICAgfCAgSXQgc2VlbXMgdGhlIEMgcHJlLXByb2Nlc3NvciAgdGhhdCBjb21lcyB3aXRoIExDQyBpcyBicm9rZW4sIGl0Ci0gICAgfCAgZG9lc24ndCAgcmVjb2duaXplICB0aGUgIEFOU0kgIHN0YW5kYXJkICBkaXJlY3RpdmVzICAjICBhbmQgICMjCi0gICAgfCAgY29ycmVjdGx5ICAgd2hlbiAgb25lICBvZiAgIHRoZSAgYXJndW1lbnQgIGlzICBhICBtYWNyby4gIEFsc28sCi0gICAgfCAgc29tZXRoaW5nIGxpa2U6Ci0gICAgfAotICAgIHwgICAgICNkZWZpbmUgRih4KSAgcHJpbnQjI3gKLSAgICB8Ci0gICAgfCAgICAgRigoImhlbGxvIikpCi0gICAgfAotICAgIHwgIHdpbGwgZ2V0IGluY29ycmVjdGx5IHRyYW5zbGF0ZWQgdG86Ci0gICAgfAotICAgIHwgICAgIHByaW50ICJoZWxsbyIpCi0gICAgfAotICAgIHwgIGJ5IGl0cyBwcmUtcHJvY2Vzc29yLiAgRm9yIHRoaXMgcmVhc29uLCB5b3Ugc2ltcGx5IGNhbm5vdCBidWlsZAotICAgIHwgIEZyZWVUeXBlIDIgaW4gZGVidWcgbW9kZSB3aXRoIHRoaXMgY29tcGlsZXIuLgotCi0gIC0geWV0ICBhbm90aGVyIG1hc3NpdmUgZ3J1bnQgd29yay4gIEkndmUgIGNoYW5nZWQgdGhlICBkZWZpbml0aW9uIG9mCi0gICAgdGhlIEVYUE9SVF9ERUYsICBFWFBPUlRfRlVOQywgQkFTRV9ERUYgJiAgQkFTRV9GVU5DIG1hY3Jvcy4gIFRoZXNlCi0gICAgbm93IHRha2UgYW4gYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSB0eXBlLgotCi0gICAgVGhpcyAgaXMgbmVjZXNzYXJ5IHRvICBjb21waWxlIEZyZWVUeXBlICBhcyBhICBETEwgb24gIFdpbmRvd3MgYW5kCi0gICAgT1MvMi4gIERlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIgdXNlZCwgYSBjb21waWxlci1zcGVjaWZpYyBrZXl3b3JkCi0gICAgbGlrZSAgX19leHBvcnQgb3IgX19zeXN0ZW0gIG11c3QgYmUgIHBsYWNlZCBiZWZvcmUgIChWaXN1YWxDKyspIG9yCi0gICAgYWZ0ZXIgKEJvcmxhbmRDKyspIHRoZSB0eXBlLi4KLQotICAgIE9mIGNvdXJzZSwgdGhpcyBuZWVkZWQgYSBsb3Qgb2YgY2hhbmdlcyB0aHJvdWdob3V0IHRoZSBzb3VyY2UgY29kZQotICAgIHRvIG1ha2UgaXQgY29tcGlsZSBhZ2Fpbi4uLiAgQWxsIGNsZWFuZWQgdXAgbm93LCBhcHBhcmVudGx5Li4KLQotICAgIE5vdGUgYWxzbyAgdGhhdCB0aGVyZSBpcyBhICBuZXcgRVhQT1JUX1ZBUiBtYWNybyAgZGVmaW5lZCB0byBhbGxvdwotICAgIHRoZSAgIF9kZWNsYXJhdGlvbl8gICAgb2YgICBhbiAgIGV4cG9ydGFibGUgICAgcHVibGljICAgKGNvbnN0YW50KQotICAgIHZhcmlhYmxlLiAgVGhpcyAgaXMgIHRoZSAgIGNhc2UgIG9mICB0aGUgIHJhc3RlciAgaW50ZXJmYWNlcyAgKHNlZQotICAgIGZ0cmFzdGVyLmggYW5kIGZ0Z3JheXMuaCksIGFzIHdlbGwgYXMgZWFjaCBtb2R1bGUncyBpbnRlcmZhY2UgKHNlZQotICAgIHNmZHJpdmVyLmgsIHBzZHJpdmVyLmgsIGV0Yy4uKQotCi0gIC0gbmV3IGZlYXR1cmU6IGl0ICBpcyBub3cgcG9zc2libGUgdG8gcGFzcyAgZXh0cmEgcGFyYW1ldGVycyB0byBmb250Ci0gICAgICAgICAgICAgICAgIGRyaXZlcnMgIHdoZW4gY3JlYXRpbmcgIGEgbmV3ICBmYWNlIG9iamVjdC4gIEZvciBub3csCi0gICAgICAgICAgICAgICAgIHRoaXMgY2FwYWJpbGl0eSBpcyB1bnVzZWQuICBJdCBjb3VsZCBob3dldmVyIHByb3ZlIHRvCi0gICAgICAgICAgICAgICAgIGJlIHVzZWZ1bCBpbiBhIG5lYXIgZnV0dXJlLi4KLQotICAgICAgdGhlIEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUgd2FzICBjaGFuZ2VzLCBhcyB3ZWxsIGFzIHRoZSBpbnRlcm5hbAotICAgICAgZHJpdmVyIGludGVyZmFjZSAgKHRoZSBzcGVjaWZpYyBgaW5pdF9mYWNlJyAgbW9kdWxlIGZ1bmN0aW9uIGhhcwotICAgICAgbm93IGEgZGlmZmVyZW50IHNpZ25hdHVyZSkuCi0KLSAgLSB1cGRhdGVkIHRoZSB0dXRvcmlhbCAobm90IGZpbmlzaGVkIHRob3VnaCkuCi0KLSAgLSB1cGRhdGVkIHRoZSB0b3AtbGV2ZWwgQlVJTEQgIGRvY3VtZW50Ci0KLSAgLSBmaXhlZCAgYSAgcG90ZW50aWFsIG1lbW9yeSAgbGVhayAgdGhhdCAgY291bGQgIG9jY3VyIHdoZW4gIGxvYWRpbmcKLSAgICBlbWJlZGRlZCBiaXRtYXBzLgotCi0gIC0gYWRkZWQgICAgIHRoZSAgICAgZGVjbGFyYXRpb24gICAgIG9mICAgICBGVF9OZXdfTWVtb3J5X0ZhY2UgICAgIGluCi0gICAgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+LCBhcyAgaXQgd2FzICBtaXNzaW5nIGZyb20gdGhlICBwdWJsaWMgaGVhZGVyCi0gICAgKHRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgYWxyZWFkeSBpbiBgZnRvYmpzLmMnKS4KLQotICAtIHRoZSBmaWxlIDxmcmVldHlwZS9mdGVycm9ycy5oPiBoYXMgYmVlbiBzZXJpb3VzbHkgdXBkYXRlZCBpbiBvcmRlcgotICAgIHRvIGFsbG93ICB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gIG9mIGVycm9yIG1lc3NhZ2UgdGFibGVzLiAgIFNlZQotICAgIHRoZSBjb21tZW50cyB3aXRoaW4gaXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgLSBtYWpvciBkaXJlY3RvcnkgIGhpZXJhcmNoeSByZS1vcmdhbmlzYXRpb24uICBUaGlzIHdhcyBkb25lIGZvciB0d28KLSAgICB0aGluZ3M6Ci0KLSAgICAgICogZmlyc3QsICB0byBlYXNlICB0aGUgYG1hbnVhbCcgIGNvbXBpbGF0aW9uIG9mICB0aGUgIGxpYnJhcnkgYnkKLSAgICAgICAgcmVxdWlyaW5nIGF0IGxvdCBsZXNzIGluY2x1ZGUgcGF0aHMgOi0pCi0KLSAgICAgICogc2Vjb25kLCAgdG8gIGFsbG93ICBleHRlcm5hbCAgcHJvZ3JhbXMgdG8gIGVmZmVjdGl2ZWx5ICBhY2Nlc3MKLSAgICAgICAgaW50ZXJuYWwgIGRhdGEgIGZpZWxkcy4gIEZvciBleGFtcGxlLCAgdGhpcyAgY2FuIGJlICBleHRyZW1lbHkKLSAgICAgICAgdXNlZnVsIGlmICBzb21lb25lIHdhbnRzICB0byB3cml0ZSBhICBmb250IHByb2R1Y2VyIG9yICBhIGZvbnQKLSAgICAgICAgbWFuYWdlciBvbiB0b3Agb2YgRnJlZVR5cGUuCi0KLSAgICBCYXNpY2FsbHksIHlvdSAgc2hvdWxkIG5vdyB1c2UgIHRoZSAnZnJlZXR5cGUvJyBwcmVmaXggIGZvciBoZWFkZXIKLSAgICBpbmNsdXNpb24sIGFzIGluOgotCi0gICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgotICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnRnbHlwaC5oPgotCi0gICAgU29tZSBuZXcgaW5jbHVkZSBzdWItZGlyZWN0b3JpZXMgYXJlIGF2YWlsYWJsZToKLQotICAgICBhLiB0aGUgIGBmcmVldHlwZS9jb25maWcnIGRpcmVjdG9yeSwgIGNvbnRhaW5zIHR3byBmaWxlcyAgdXNlZCB0bwotICAgICAgICBjb25maWd1cmUgIHRoZSAgYnVpbGQgIG9mICB0aGUgIGxpYnJhcnkuICBDbGllbnQgIGFwcGxpY2F0aW9ucwotICAgICAgICBzaG91bGQgIG5vdCBuZWVkICB0byBsb29rICBhdCB0aGVzZSAgbm9ybWFsbHksIGJ1dCB0aGV5IGNhbiBpZgotICAgICAgICB0aGV5IHdhbnQuCi0KLSAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oPgotICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg+Ci0KLSAgICAgYi4gdGhlIGBmcmVldHlwZS9pbnRlcm5hbCcgIGRpcmVjdG9yeSwgY29udGFpbnMgaGVhZGVyIGZpbGVzIHRoYXQKLSAgICAgICAgZGVzY3JpYmVzIGxpYnJhcnkgIGludGVybmFscy4gIFRoZXNlIGFyZSB0aGUgaGVhZGVyIGZpbGVzIHRoYXQKLSAgICAgICAgd2VyZSAgcHJldmlvdXNseSAgZm91bmQgIGluICB0aGUgYHNyYy9iYXNlJyAgYW5kICBgc3JjL3NoYXJlZCcKLSAgICAgICAgZGlyZWN0b3JpZXMuCi0KLQotICAgIEFzICB1c3VhbCwgdGhlIGJ1aWxkICBzeXN0ZW0gYW5kICB0aGUgZGVtb3MgIGhhdmUgYmVlbiAgdXBkYXRlZCB0bwotICAgIHJlZmxlY3QgdGhlIGNoYW5nZS4uCi0KLSAgICBIZXJlJ3MgYSBsYXlvdXQgb2YgdGhlIG5ldyBkaXJlY3RvcnkgaGllcmFyY2h5OgotCi0gICAgVE9QX0RJUgotICAgICAgaW5jbHVkZS8KLSAgICAgICAgIGZyZWV0eXBlLwotICAgICAgICAgICAgZnJlZXR5cGUuaAotICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICBjb25maWcvCi0gICAgICAgICAgICAgIGZ0b3B0aW9uLmgKLSAgICAgICAgICAgICAgZnRjb25maWcuaAotICAgICAgICAgICAgICBmdG1vZHVsZS5oCi0KLSAgICAgICAgICAgIGludGVybmFsLwotICAgICAgICAgICAgICBmdG9ianMuaAotICAgICAgICAgICAgICBmdHN0cmVhbS5oCi0gICAgICAgICAgICAgIGZ0Y2FsYy5oCi0gICAgICAgICAgICAgIC4uLgotCi0gICAgICBzcmMvCi0gICAgICAgICBiYXNlLwotICAgICAgICAgICAgLi4uCi0KLSAgICAgICAgIHNmbnQvCi0gICAgICAgICBwc25hbWVzLwotICAgICAgICAgdHJ1ZXR5cGUvCi0gICAgICAgICB0eXBlMS8KLSAgICAgICAgIHR5cGUxei8KLQotCi0gICAgQ29tcGlsaW5nIGEgbW9kdWxlIGlzIG5vdyAgbXVjaCBlYXNpZXIsIGZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCi0gICAgc2hvdWxkIHdvcmsgd2hlbiBpbiB0aGUgVE9QX0RJUiBkaXJlY3Rvcnkgb24gYW4gQU5TSSBidWlsZDoKLQotICAgICAgIGdjYyAtYyAtSS4vaW5jbHVkZSAtSS4vc3JjL2Jhc2Ugc3JjL2Jhc2UvZnRiYXNlLmMKLSAgICAgICBnY2MgLWMgLUkuL2luY2x1ZGUgLUkuL3NyYy9zZm50IHNyYy9zZm50L3NmbnQuYwotICAgICAgIGV0Yy4uCi0KLSAgICAob2YgY291cnNlLCB1c2luZyAtSWNvbmZpZy88c3lzdGVtPiBpZiB5b3UgcHJvdmlkZSBzeXN0ZW0tc3BlY2lmaWMKLSAgICAgY29uZmlndXJhdGlvbiBmaWxlcykuCi0KLSAgLSB1cGRhdGVkIHRoZSBzdHJ1Y3R1cmUgb2YgRlRfT3V0bGluZV9GdW5jcyBpbiBvcmRlciB0byBhbGxvdyBkaXJlY3QKLSAgICBjb29yZGluYXRlIHNjYWxpbmcgd2l0aGluICB0aGUgb3V0bGluZSBkZWNvbXBvc2l0aW9uIHJvdXRpbmUgKHRoaXMKLSAgICBpcyAgaW1wb3J0YW50IGZvciB2aXJ0dWFsICBgb24nIHBvaW50cyAgd2l0aCBUcnVlVHlwZSAgb3V0bGluZXMpICsKLSAgICB1cGRhdGVzIHRvIHRoZSByYXN0ZXJzIHRvIHN1cHBvcnQgdGhpcy4uCi0KLSAgLSB1cGRhdGVkICB0aGUgT1MvMiAgdGFibGUgIGxvYWRpbmcgY29kZSAgaW4gYHNyYy9zZm50L3R0bG9hZC5jJyAgaW4KLSAgICBvcmRlciB0byBzdXBwb3J0IHZlcnNpb24gMiBvZiB0aGUgdGFibGUgKHNlZSBPcGVuVHlwZSAxLjIgc3BlYykKLQotICAtIGNyZWF0ZWQgIGBpbmNsdWRlL3R0dGFibGVzLmgnICBhbmQgIGBpbmNsdWRlL3QxdGFibGVzLmgnIHRvICBhbGxvdwotICAgIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gYWNjZXNzIHNvbWUgb2YgIHRoZSBTRk5UIGFuZCBUMSB0YWJsZXMgb2YgYQotICAgIGZhY2UgIHdpdGggIGEgIHByb2NlZHVyYWwgIGludGVyZmFjZSAoc2VlICBgRlRfR2V0X1NmbnRfVGFibGUnKSAgKwotICAgIHVwZGF0ZXMgdG8gaW50ZXJuYWwgc291cmNlIGZpbGVzIHRvIHJlZmxlY3QgdGhlIGNoYW5nZS4uCi0KLSAgLSBzb21lICBjbGVhbnVwcyBpbiAgdGhlIHNvdXJjZSAgY29kZSB0byAgZ2V0IHJpZCAgb2YgIHdhcm5pbmdzIHdoZW4KLSAgICBjb21waWxpbmcgd2l0aCB0aGUgYC1XYWxsIC1XIC1hbnNpIC1wZWRhbnRpYycgb3B0aW9ucyBpbiBnY2MuCi0KLSAgLSBkZWJ1Z2dlZCBhbmQgbW92ZWQgdGhlIHNtb290aCByZW5kZXJlciB0byBgc3JjL2Jhc2UvZnRncmF5cy5jJyBhbmQKLSAgICBpdHMgaGVhZGVyIHRvIGBpbmNsdWRlL2Z0Z3JheXMuaCcKLQotICAtIHVwZGF0ZWQgVFRfTUFYX1NVQkdMWVBIUyAgdG8gOTYgYXMgc29tZSBDSksgIGZvbnRzIGhhdmUgY29tcG9zaXRlcwotICAgIHdpdGggdXAgdG8gODAgc3ViLWdseXBocyAhISBUaGFua3MgdG8gV2VybmVyCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1PTEQgQ0hBTkdFUyAtIDE0LWFwci0yMDAwCi0KLSAgLSBmaXhlZCAgYSBidWcgIGluICB0aGUgIFRydWVUeXBlIGdseXBoICBsb2FkZXIgIHRoYXQgcHJldmVudGVkICB0aGUKLSAgICBjb3JyZWN0IGxvYWRpbmcgb2Ygc29tZSBDSksgZ2x5cGhzIGluIG1pbmdsaS50dGYKLQotICAtIGltcHJvdmVkIHRoZSBzdGFuZGFyZCBUeXBlIDEgaGludGVyIGluIGBzcmMvdHlwZTEnCi0KLSAgLSBmaXhlZCB0d28gYnVncyAgaW4gdGhlIGV4cGVyaW1lbnRhbCBUeXBlIDEgIGRyaXZlciBpbiBgc3JjL3R5cGUxeicKLSAgICB0byBoYW5kbGUgdGhlIG5ldyBYRnJlZTg2IDQuMCBmb250cyAoYW5kIGEgZmV3IG90aGVyIG9uZXMuLikKLQotICAtIHRoZSBzbW9vdGggIHJlbmRlcmVyIGlzIG5vdyAgY29tcGxldGUgYW5kIHN1cHBvcnRzICBzdWItYmFuZGluZyB0bwotICAgIHJlbmRlciBsYXJnZSBnbHlwaHMgIGF0IGhpZ2ggc3BlZWQuICBIb3dldmVyLCBpdCBpcyBzdGlsbCAgbG9jYXRlZAotICAgIGluIGBkZW1vcy9zcmMvZnRncmF5cy5jJyBhbmQgc2hvdWxkIG1vdmUgdG8gdGhlICBsaWJyYXJ5IGl0c2VsZiBpbgotICAgIHRoZSBuZXh0ICBiZXRhLiAgTk9URTogVGhlICBzbW9vdGggIHJlbmRlcmVyICBkb2Vzbid0ICBjb21waWxlICBpbgotICAgIHN0YW5kLWFsb25lIG1vZGUgYW55bW9yZSwgYnV0IHRoaXMgc2hvdWxkIGJlIGZpeGVkIFJTTi4uCi0KLSAgLSBpbnRyb2R1Y2VkIGNvbnZlbmllbmNlICBmdW5jdGlvbnMgdG8gIG1vcmUgZWFzaWx5IGRlYWwgIHdpdGggZ2x5cGgKLSAgICBpbWFnZXMsIHNlZSAgYGluY2x1ZGUvZnRnbHlwaC5oJyBmb3IgbW9yZSBkZXRhaWxzLCBhcyAgd2VsbCBhcyB0aGUKLSAgICBuZXcgIGRlbW8gcHJvZ3JhbSAgbmFtZWQgYGRlbW9zL3NyYy9mdHN0cmluZy5jJyAgdGhhdCBkZW1vbnN0cmF0ZXMKLSAgICBpdHMgdXNlCi0KLSAgLSBpbXBsZW1lbnRlZCAgRlRfTE9BRF9OT19SRUNVUlNFIGluICBib3RoIHRoZSAgVHJ1ZVR5cGUgYW5kICBUeXBlIDEKLSAgICBkcml2ZXJzICAodGhpcyAgaXMgcmVxdWlyZWQgIGJ5ICB0aGUgIGF1dG8taGludGVyICB0byBpbXByb3ZlICBpdHMKLSAgICByZXN1bHRzKS4KLQotICAtIGNoYW5nZWQgICB0aGUgIHJhc3RlciAgIGludGVyZmFjZSwgIGluICAgb3JkZXIgIHRvICAgYWxsb3cgIGNsaWVudAotICAgIGFwcGxpY2F0aW9ucyAgdG8gICBwcm92aWRlICB0aGVpciAgIG93biAgc3Bhbi1kcmF3aW5nICAgY2FsbGJhY2tzLgotICAgIEhvd2V2ZXIsICAgb25seSAgIHRoZSAgIHNtb290aCAgIHJlbmRlcmVyICAgc3VwcG9ydHMgICB0aGlzLiAgIFNlZQotICAgIGBGVF9SYXN0ZXJfUGFyYW1zJyBpbiB0aGUgZmlsZSBgaW5jbHVkZS9mdGltYWdlLmgnLgotCi0gIC0gZml4ZWQgIGEgc21hbGwgYnVnICBpbiBGVF9NdWxGaXggIHRoYXQgY2F1c2VkICBpbmNvcnJlY3QgdHJhbnNmb3JtCi0gICAgY29tcHV0YXRpb24hCi0KLSAgLSBOb3RlOiBUaGUgdHV0b3JpYWwgaXMgb3V0LW9mLWRhdGUuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1PTEQgQ0hBTkdFUyAtIDEyLW1hci0yMDAwCi0KLSAgLSBjaGFuZ2VkICB0aGUgIGxheW91dCAgb2YgIGNvbmZpZ3VyYXRpb24gIGZpbGVzICA6ICBub3csICBhbGwgIEFOU0kKLSAgICBjb25maWd1cmF0aW9uICAgICAgICAgZmlsZXMgICAgICAgICBhcmUgICAgICAgICBsb2NhdGVkICAgICAgICAgaW4KLSAgICBgZnJlZXR5cGUyL2NvbmZpZycuICBTeXN0ZW0tc3BlY2lmaWMgb3Zlci1yaWRlcyAgY2FuIGJlICBwbGFjZWQgaW4KLSAgICBgZnJlZXR5cGUyL2NvbmZpZy88c3lzdGVtPicuCi0KLSAgLSBtb3ZlZCBhbGwgY29uZmlndXJhdGlvbiBtYWNyb3MgdG8gYGNvbmZpZy9mdG9wdGlvbi5oJwotCi0gIC0gaW1wcm92ZW1lbnRzIGluIHRoZSBUeXBlIDEgZHJpdmVyIHdpdGggQUZNIHN1cHBvcnQKLQotICAtIGNoYW5nZWQgdGhlIGZpZWxkcyAgaW4gdGhlIEZUX091dGxpbmUgc3RydWN0dXJlIDogIHRoZSBvbGQgYGZsYWdzJwotICAgIGFycmF5IGlzIHJlLW5hbWVkIGB0YWdzJywgd2hpbGUgYWxsIGFuY2llbnQgZmxhZ3MgYXJlIGVuY29kZWQgaW50bwotICAgIGEgc2luZ2xlIHVuc2lnbmVkIGludCBuYW1lZCBgZmxhZ3MnLgotCi0gIC0gaW50cm9kdWNlZCAgICAgbmV3ICAgICAgZmxhZ3MgICAgIGluICAgICBGVF9PdXRsaW5lLmZsYWdzICAgICAoc2VlCi0gICAgZnRfb3V0bGluZV8uLi4uIGVudW1zIGluIGBmdGltYWdlLmgnKS4KLQotICAtIGNoYW5nZWQgb3V0bGluZSBmdW5jdGlvbnMgdG8gYEZUX091dGxpbmVfPGFjdGlvbj4nIHN5bnRheAotCi0gIC0gYWRkZWQgYSBzbW9vdGggYW50aS1hbGlhcyByZW5kZXJlciB0byB0aGUgZGVtb25zdHJhdGlvbiBwcm9ncmFtcwotCi0gIC0gYWRkZWQgTWFjIGdyYXBoaWNzIGRyaXZlciAodGhhbmtzIEp1c3QpCi0KLSAgLSBGVF9PcGVuX0ZhY2UgIGNoYW5nZWQgIGluICBvcmRlciAgIHRvICByZWNlaXZlZCAgYSAgcG9pbnRlciAgdG8gIGEKLSAgICBGVF9PcGVuX0FyZ3MgZGVzY3JpcHRvci4uCi0KLSAgLSB2YXJpb3VzICBjbGVhbnVwcywgIGEgIGZldyAgbW9yZSBBUEkgIGZ1bmN0aW9ucyAgaW1wbGVtZW50ZWQgIChzZWUKLSAgICBGVF9BdHRhY2hfRmlsZSkKLQotICAtIHVwZGF0ZWQgc29tZSBkb2NzCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1PTEQgQ0hBTkdFUyAtIDIyLWZlYi0yMDAwCi0KLSAgLSBpbnRyb2R1Y2VkIHRoZSBgcHNuYW1lcycgbW9kdWxlLiAgSXQgaXMgdXNlZCB0bzoKLQotICAgICAgbyBjb252ZXJ0ICBhIFBvc3RzY3JpcHQgZ2x5cGggIG5hbWUgaW50byB0aGUgIGVxdWl2YWxlbnQgVW5pY29kZQotICAgICAgICBjaGFyYWN0ZXIgY29kZSAodXNlZCBieSB0aGUgIFR5cGUgMSBkcml2ZXIocykgdG8gc3ludGhlc2l6ZSBvbgotICAgICAgICB0aGUgZmx5IGEgVW5pY29kZSBjaGFybWFwKS4KLQotICAgICAgbyBwcm92aWRlIGFuICBpbnRlcmZhY2UgdG8gcmV0cmlldmUgdGhlIFBvc3RzY3JpcHQgIG5hbWVzIG9mIHRoZQotICAgICAgICBNYWNpbnRvc2gsICBBZG9iZSAgU3RhbmRhcmQgJiAgQWRvYmUgIEV4cGVydCBjaGFyYWN0ZXIgIGNvZGVzLgotICAgICAgICAodGhlIE1hY2ludG9zaCAgbmFtZXMgYXJlICB1c2VkIGJ5IHRoZSAgU0ZOVC1tb2R1bGUgcG9zdHNjcmlwdAotICAgICAgICBuYW1lcyBzdXBwb3J0IHJvdXRpbmVzLCB3aGlsZSB0aGUgb3RoZXIgdHdvIHRhYmxlcyBhcmUgdXNlZCBieQotICAgICAgICB0aGUgVHlwZSAxIGRyaXZlcihzKSkuCi0KLSAgLSBpbnRyb2R1Y2VkIHRoZSBgdHlwZTF6JyBhbHRlcm5hdGUgVHlwZSAxIGRyaXZlci4gIFRoaXMgaXMgYSAoc3RpbGwKLSAgICBleHBlcmltZW50YWwpIGRyaXZlciAgZm9yIHRoZSBUeXBlICAxIGZvcm1hdCB0aGF0ICB3aWxsIHVsdGltYXRlbHkKLSAgICByZXBsYWNlIHRoZSBvbmUgIGluIGBzcmMvdHlwZTEnLiAgSXQgdXNlcyBwYXR0ZXJuIG1hdGNoaW5nIHRvIGxvYWQKLSAgICBkYXRhIGZyb20gdGhlIGZvbnQsIGluc3RlYWQgb2YgYSBmaW5pdGUgIHN0YXRlIGFuYWx5emVyLiAgSXQgd29ya3MKLSAgICBtdWNoIGJldHRlciB0aGFuIHRoZSBgb2xkJyBkcml2ZXIgd2l0aCBgYnJva2VuJyBmb250cy4gIEl0IGlzIGFsc28KLSAgICBtdWNoIHNtYWxsZXIgKHVuZGVyIDE1IEtiKS4KLQotICAtIHRoZSAgVHlwZSAxICBkcml2ZXJzIChib3RoICBpbiBgc3JjL3R5cGUxJyAgYW5kICBgc3JjL3R5cGUxeicpIGFyZQotICAgIG5lYXJseSAgY29tcGxldGUuICBUaGV5ICBib3RoICBwcm92aWRlIGF1dG9tYXRpYyAgVW5pY29kZSAgY2hhcm1hcAotICAgIHN5bnRoZXNpcyB0aHJvdWdoICB0aGUgYHBzbmFtZXMnIG1vZHVsZS4gIE5vIHJlLWVuY29kaW5nIHZlY3RvciBpcwotICAgIG5lZWRlZC4gIChub3RlICB0aGF0IHRoZXkgIHN0aWxsICBsZWFrICBtZW1vcnkgIGR1ZSB0byAgc29tZSAgY29kZQotICAgIG1pc3NpbmcsIGFuZCBJJ20gZ2V0dGluZyBsYXp5KS4KLQotICAgIFRyaXZpYWwgQUZNIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgdG8gcmVhZCBrZXJuaW5nIGluZm9ybWF0aW9uIGJ1dAotICAgIHdhc24ndCBleGFjdGx5IHRlc3RlZCBhcyBpdCBzaG91bGQgOy0pCi0KLSAgLSBUaGUgVHJ1ZVR5cGUgIGdseXBoIGxvYWRlciBoYXMgIGJlZW4gc2VyaW91c2x5IHJld3JpdHRlbiAgKHNlZSB0aGUKLSAgICBmaWxlICBgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYycuICBJdCBpcyBub3cgIG11Y2gsIG11Y2ggIHNpbXBsZXIgYXMKLSAgICB3ZWxsIGFzICBlYXNpZXIgdG8gcmVhZCwgIG1haW50YWluIGFuZCB1bmRlcnN0YW5kICA6LSkgUHJlbGltaW5hcnkKLSAgICB2ZXJzaW9ucyBpbnRyb2R1Y2VkIGEgIG1lbW9yeSBsZWFrIHRoYXQgaGFzIGJlZW4gIHJlcG9ydGVkIGJ5IEphY2sKLSAgICBEYXZpcywgYW5kIGlzIG5vdyBmaXhlZC4uCi0KLSAgLSBpbnRyb2R1Y2VkICB0aGUgbmV3ICBgZnRfZ2x5cGhfZm9ybWF0X3Bsb3R0ZXInLCB1c2VkICB0byByZXByZXNlbnQKLSAgICBzdHJva2VkIG91dGxpbmVzICBsaWtlIFdpbmRvd3MgYFZlY3RvcicgZm9udHMsIGFuZCAgY2VydGFpbiBUeXBlIDEKLSAgICBmb250cyAgbGlrZSBgSGVyc2hleScuICBUaGUgY29ycmVzcG9uZGluZyAgcmFzdGVyIHdpbGwgIGJlIHdyaXR0ZW4KLSAgICBzb29uLgotCi0gIC0gRlRfTmV3X01lbW9yeV9GYWNlICBpcyAgZ29uZS4gIExpa2V3aXNlLCAgRlRfT3Blbl9GYWNlIGhhcyAgYSAgbmV3Ci0gICAgaW50ZXJmYWNlIHRoYXQgdXNlcyBhIHN0cnVjdHVyZSAgdG8gZGVzY3JpYmUgdGhlIGlucHV0IHN0cmVhbSwgdGhlCi0gICAgZHJpdmVyIChpZiByZXF1aXJlZCksIGV0Yy4uCi0KLQotVE9ETwotCi0gIC0gV3JpdGUgRlRfR2V0X0dseXBoX0JpdG1hcCBhbmQgRlRfTG9hZF9HbHlwaF9CaXRtYXAKLQotICAtIEFkZCBhIGZ1bmN0aW9uIGxpa2UgRlRfTG9hZF9DaGFyYWN0ZXIoZmFjZSwgY2hhcl9jb2RlLCBsb2FkX2ZsYWdzKQotICAgIHRoYXQgIHdvdWxkICAgcmVhbGx5ICBlbWJlZCAgYSAgY2FsbCAgIHRvICBGVF9HZXRfQ2hhcl9JbmRleCAgdGhlbgotICAgIEZUX0xvYWRfR2x5cGggdG8gZWFzZSBkZXZlbG9wZXIncyB3b3JrLgotCi0gIC0gVXBkYXRlIHRoZSB0dXRvcmlhbCEKLQotICAtIGNvbnNpZGVyIGFkZGluZyAgc3VwcG9ydCBmb3IgTXVsdGlwbGUgIE1hc3RlciBmb250cyBpbiB0aGUgIFR5cGUgMQotICAgIGRyaXZlcnMuCi0KLSAgLSBUZXN0IHRoZSBBRk0gcm91dGluZXMgb2YgdGhlICBUeXBlIDEgZHJpdmVycyB0byBjaGVjayB0aGF0IGtlcm5pbmcKLSAgICBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBjb3JyZWN0bHkuCi0KLSAgLSB3cml0ZSBhIGRlY2VudCBhdXRvLWdyaWRkaW5nIGNvbXBvbmVudCAgISEgV2UgbmVlZCB0aGlzIHRvIHJlbGVhc2UKLSAgICBGcmVlVHlwZSAyLjAgZ29sZCAhCi0KLQotbGVzcyB1cmdlbnQgbmVlZHM6Ci0KLSAgLSBhZGQgYSBDRkYvVHlwZTIgZHJpdmVyCi0gIC0gYWRkIGEgQkRGIGRyaXZlcgotICAtIGFkZCBhIEZOVC9QQ0YvSEJGIGRyaXZlcgotICAtIGFkZCBhIFNwZWVkbyBkcml2ZXIgZnJvbSB0aGUgWDExIHNvdXJjZXMKLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLU9MREVSIENIQU5HRVMgLSAyNy1qYW4tMjAwMAotCi0gIC0gdXBkYXRlZCB0aGUgIGBzZm50JyBtb2R1bGUgIGludGVyZmFjZSB0byBhbGxvdyAgc2V2ZXJhbCBTRk5ULWJhc2VkCi0gICAgZHJpdmVycyB0byBjby1leGlzdCBwZWFjZWZ1bGx5Ci0KLSAgLSB1cGRhdGVkICB0aGUgYFQxX0ZhY2UnICB0eXBlICB0byBiZXR0ZXIgIHNlcGFyYXRlIFBvc3RzY3JpcHQgIGZvbnQKLSAgICBjb250ZW50ICBmcm9tIHRoZSAgcmVzdCBvZiAgdGhlIEZUX0ZhY2UgIHN0cnVjdHVyZS4gIE1pZ2h0IGJlIHVzZWQKLSAgICBsYXRlciBieSB0aGUgQ0ZGL1R5cGUyIGRyaXZlci4uCi0KLSAgLSBhZGRlZCBhbiBleHBlcmltZW50YWwgcmVwbGFjZW1lbnQgVHlwZSAxIGRyaXZlciBmZWF0dXJpbmcgYWR2YW5jZWQKLSAgICAoYW5kIHNwZWVkeSkgcGF0dGVybiBtYXRjaGluZyB0byByZXRyaWV2ZSB0aGUgZGF0YSBmcm9tIHBvc3RzY3JpcHQKLSAgICBmb250cy4KLQotICAtIHZlcnkgbWlub3IgIGNoYW5nZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uICBvZiBGVF9TZXRfQ2hhcl9TaXplIGFuZAotICAgIEZUX1NldF9QaXhlbF9TaXplcyAodGhleSBub3cgaW1wbGVtZW50IGRlZmF1bHQgdG8gbGlnaHRlbiB0aGUgZm9udAotICAgIGRyaXZlcidzIGNvZGUpLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotT0xEIE1FU1NBR0UKLQotVGhpcyBmaWxlIHN1bW1hcml6ZXMgdGhlIGNoYW5nZXMgIHRoYXQgb2NjdXJyZWQgIHNpbmNlIHRoZSBsYXN0IGBiZXRhJwotb2YgRnJlZVR5cGUgMi4gQmVjYXVzZSB0aGUgbGlzdCBpcyBpbXBvcnRhbnQsIGl0IGhhcyBiZWVuIGRpdmlkZWQgaW50bwotc2VwYXJhdGUgc2VjdGlvbnM6Ci0KLVRhYmxlIE9mIENvbnRlbnRzOgotCi0gICAgSSAgIEhpZ2gtTGV2ZWwgSW50ZXJmYWNlIChlYXNpZXIgISkKLSAgIElJICAgRGlyZWN0b3J5IFN0cnVjdHVyZQotICBJSUkgICBHbHlwaCBJbWFnZSBGb3JtYXRzCi0gICBJViAgIEJ1aWxkIFN5c3RlbQotICAgIFYgICBQb3J0YWJpbGl0eQotICAgVkkgICBGb250IERyaXZlcnMKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhpZ2gtTGV2ZWwgSW50ZXJmYWNlOgotCi0gIFRoZSBoaWdoLWxldmVsIEFQSSBoYXMgYmVlbiBjb25zaWRlcmFibHkgc2ltcGxpZmllZC4gIEhlcmUgaXMgaG93OgotCi0gICAgLSByZXNvdXJjZSBvYmplY3RzIGhhdmUgZGlzYXBwZWFyZWQuICB0aGlzIG1lYW5zIHRoYXQgZmFjZSBvYmplY3RzCi0gICAgICBjYW4gbm93IGJlIGNyZWF0ZWQgd2l0aCAgYSBzaW5nbGUgZnVuY3Rpb24gY2FsbCAoc2VlIEZUX05ld19GYWNlCi0gICAgICBhbmQgRlRfT3Blbl9GYWNlKQotCi0gICAgLSB3aGVuIGNhbGxpbmcgIGVpdGhlciBGVF9OZXdfRmFjZSAgJiBGVF9PcGVuX0ZhY2UsIGEgIHNpemUgb2JqZWN0Ci0gICAgICBhbmQgYSBnbHlwaCBzbG90IG9iamVjdCAgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgdGhlIGZhY2UsCi0gICAgICBhbmQgY2FuICBiZSBhY2Nlc3NlZCAgdGhyb3VnaCBgZmFjZS0+Z2x5cGgnIGFuZCAgYGZhY2UtPnNpemUnIGlmCi0gICAgICBvbmUgcmVhbGx5ICBuZWVkcyB0by4gICBJbiBtb3N0IGNhc2VzLCAgdGhlcmUncyBubyBuZWVkICB0byBjYWxsCi0gICAgICBGVF9OZXdfU2l6ZSBvciBGVF9OZXdfR2x5cGguCi0KLSAgICAtIHNpbWlsYXJseSwgIEZUX0xvYWRfR2x5cGggIG5vdyAgb25seSAgdGFrZXMgIGEgIGBmYWNlJyAgYXJndW1lbnQKLSAgICAgIChpbnN0ZWFkICBvZiBhICBnbHlwaCAgc2xvdCAgYW5kIGEgIHNpemUpLiAgQWxzbywgIGl0cyAgYHJlc3VsdCcKLSAgICAgIHBhcmFtZXRlciBpcyAgZ29uZSwgYXMgdGhlIGdseXBoICBpbWFnZSB0eXBlIGlzICByZXR1cm5lZCBpbiB0aGUKLSAgICAgIGZpZWxkIGBmYWNlLT5nbHlwaC5mb3JtYXQnCi0KLSAgICAtIHRoZSBsaXN0ICBvZiBhdmFpbGFibGUgIGNoYXJtYXBzIGlzIGRpcmVjdGx5ICBhY2Nlc3NpYmxlIHRocm91Z2gKLSAgICAgIGBmYWNlLT5jaGFybWFwcycsIGNvdW50aW5nIGBmYWNlLT5udW1fY2hhcm1hcHMnICBlbGVtZW50cy4gIEVhY2gKLSAgICAgIGNoYXJtYXAgIGhhcyBhbiAgJ2VuY29kaW5nJyAgZmllbGQgd2hpY2ggIHNwZWNpZmllcyB3aGljaCAga25vd24KLSAgICAgIGVuY29kaW5nIGl0IGRlYWxzIHdpdGguICBWYWxpZCB2YWx1ZXMgYXJlLCBmb3IgZXhhbXBsZToKLQotICAgICAgICAgIGZ0X2VuY29kaW5nX3VuaWNvZGUgICAgICAoZm9yIEFTQ0lJLCBMYXRpbi0xIGFuZCBVbmljb2RlKQotICAgICAgICAgIGZ0X2VuY29kaW5nX2FwcGxlX3JvbWFuCi0gICAgICAgICAgZnRfZW5jb2Rpbmdfc2ppcwotICAgICAgICAgIGZ0X2VuY29kaW5nX2Fkb2JlX3N0YW5kYXJkCi0gICAgICAgICAgZnRfZW5jb2RpbmdfYWRvYmVfZXhwZXJ0Ci0KLSAgICAgIG90aGVyICB2YWx1ZXMgbWF5ICBiZSBhZGRlZCAgaW4gdGhlICBmdXR1cmUuICBFYWNoIGNoYXJtYXAgc3RpbGwKLSAgICAgIGhvbGRzICBpdHMgYHBsYXRmb3JtX2lkJyAgYW5kIGBlbmNvZGluZ19pZCcgIHZhbHVlcyBpbiAgY2FzZSB0aGUKLSAgICAgIGVuY29kaW5nIGlzIHRvbyBleG90aWMgZm9yIHRoZSBjdXJyZW50IGxpYnJhcnkKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURpcmVjdG9yeSBTdHJ1Y3R1cmU6Ci0KLSAgU2hvdWxkIHNlZW0gb2J2aW91cyB0byBtb3N0IG9mIHlvdToKLQotICAgICBmcmVldHlwZS8KLSAgICAgICAgIGNvbmZpZy8gICAgICAgIC0tIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlcwotICAgICAgICAgICAgYW5zaS8KLSAgICAgICAgICAgIHVuaXgvICAgICAgIC0tIHBsYXRmb3JtLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZXMKLSAgICAgICAgICAgIHdpbjMyLwotICAgICAgICAgICAgb3MyLwotICAgICAgICAgICAgbXNkb3MvCi0KLSAgICAgICAgIGluY2x1ZGUvICAgICAgIC0tIHB1YmxpYyBoZWFkZXIgIGZpbGVzLCB0aG9zZSB0byAgYmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5IGJ5IGNsaWVudCBhcHBzCi0KLSAgICAgICAgIHNyYy8gICAgICAgICAgIC0tIHNvdXJjZXMgb2YgdGhlIGxpYnJhcnkKLSAgICAgICAgICAgYmFzZS8gICAgICAgIC0tIHRoZSBiYXNlIGxheWVyCi0gICAgICAgICAgIHNmbnQvICAgICAgICAtLSB0aGUgc2ZudCBgZHJpdmVyJyAgKHNlZSB0aGUgZHJpdmVycyBzZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdykKLSAgICAgICAgICAgdHJ1ZXR5cGUvICAgIC0tIHRoZSB0cnVldHlwZSBkcml2ZXIKLSAgICAgICAgICAgdHlwZTEvICAgICAgIC0tIHRoZSB0eXBlMSBkcml2ZXIKLSAgICAgICAgICAgc2hhcmVkLyAgICAgIC0tIHNvbWUgaGVhZGVyIGZpbGVzIHNoYXJlZCBiZXR3ZWVuIGRyaXZlcnMKLQotICAgICAgICAgZGVtb3MvICAgICAgICAgLS0gZGVtb3MvdG9vbHMKLQotICAgICAgICAgZG9jcy8gICAgICAgICAgLS0gZG9jdW1lbnRhdGlvbiAoYSBiaXQgZW1wdHkgZm9yIG5vdykKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUdseXBoIEltYWdlIEZvcm1hdHM6Ci0KLSAgRHJpdmVycyBhcmUgbm93IGFibGUgdG8gIHJlZ2lzdGVyIG5ldyBnbHlwaCBpbWFnZSBmb3JtYXRzIHdpdGhpbiB0aGUKLSAgbGlicmFyeS4gIEZvciAgbm93LCB0aGUgIGJhc2UgbGF5ZXIgc3VwcG9ydHMgIG9mIGNvdXJzZSAgYml0bWFwcyBhbmQKLSAgdmVjdG9yICBvdXRsaW5lcywgYnV0ICBvbmUgIGNvdWxkIGltYWdpbmUgIHNvbWV0aGluZyBkaWZmZXJlbnQgIGxpa2UKLSAgY29sb3JlZCBiaXRtYXBzLCBiaS1jb2xvciB2ZWN0b3JzIG9yIHdoYXRldmVyIGVsc2UgKE1ldGFmb250cyBhbnlvbmUKLSAgPz8pLgotCi0gIFNlZSAgdGhlICAgZmlsZSAgYGluY2x1ZGUvZnRpbWFnZS5oJy4gICBOb3RlICBhbHNvICB0aGF0ICAgdGhlICB0eXBlCi0gIEZUX1Jhc3Rlcl9NYXAgIGlzIGdvbmUsICBhbmQgIGlzIG5vdyAgcmVwbGFjZWQgIGJ5IEZUX0JpdG1hcCwgIHdoaWNoCi0gIHNob3VsZCBlbmNvbXBhc3MgYWxsIGtub3duIGJpdG1hcCB0eXBlcy4KLQotICBFYWNoIG5ldyAgaW1hZ2UgZm9ybWF0ICBtdXN0IHByb3ZpZGUgYXQgIGxlYXN0IG9uZSBgcmFzdGVyJywgIGkuZS4gYQotICBtb2R1bGUgY2FwYWJsZSBvZiAgdHJhbnNmb3JtaW5nIHRoZSBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwLiAgSXQncwotICBhbHNvIHBvc3NpYmxlICB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgIHJhc3RlciB1c2VkIGZvciAgYSBnaXZlbiBnbHlwaAotICBpbWFnZSBmb3JtYXQuCi0KLSAgVGhlIGRlZmF1bHQgb3V0bGluZSAgc2Nhbi1jb252ZXJ0ZXIgbm93IHVzZXMgMTI4IGxldmVscyAgb2YgZ3JheXMgYnkKLSAgZGVmYXVsdCwgIHdoaWNoIHRlbmRzICB0byBzbW9vdGggIG1hbnkgIHRoaW5ncy4gIE5vdGUgdGhhdCB0aGUgIGRlbW8KLSAgcHJvZ3JhbXMgaGF2ZSBiZWVuIHVwZGF0ZWQgc2lnbmlmaWNhbnRseSBpbiBvcmRlciB0byBkaXNwbGF5IHRoZXNlLi4KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUJ1aWxkIHN5c3RlbToKLQotICBZb3Ugc3RpbGwgbmVlZCAgR05VIE1ha2UgdG8gYnVpbGQgdGhlIGxpYnJhcnkuICBUaGUgYnVpbGQgc3lzdGVtIGhhcwotICBiZWVuIHZlcnkgc2VyaW91c2x5IHJlLXZhbXBlZCBpbiBvcmRlciB0byBwcm92aWRlIHRoaW5ncyBsaWtlIDoKLQotICAgLSBhdXRvbWF0aWMgaG9zdCBwbGF0Zm9ybSAgZGV0ZWN0aW9uIChyZXZlcnRpbmcgdG8gJ2NvbmZpZy9hbnNpJyBpZgotICAgICBpdCBpcyBub3QgZGV0ZWN0ZWQsIHdpdGggcHNldWRvLXN0YW5kYXJkIGNvbXBpbGF0aW9uIGZsYWdzKQotCi0gICAtIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgZnJvbSB0aGUgTWFrZWZpbGVzIHdpdGggdmVyeSBkaWZmZXJlbnQgYW5kCi0gICAgIGV4b3RpYyBjb21waWxlcnMuICBOb3RlIHRoYXQgbGlua2luZyB0aGUgbGlicmFyeSBjYW4gYmUgZGlmZmljdWx0Ci0gICAgIGZvciBzb21lIHBsYXRmb3Jtcy4KLQotICAgICBGb3IgZXhhbXBsZSwgdGhlIGZpbGUgYGNvbmZpZy93aW4zMi9sY2NsaWIuYmF0JyBpcyBpbnZva2VkIGJ5IHRoZQotICAgICBidWlsZCBzeXN0ZW0gdG8gY3JlYXRlIHRoZSBgLmxpYicgZmlsZSB3aXRoIExDQy1XaW4zMiBiZWNhdXNlIGl0cwotICAgICBsaWJyYXJpYW4gIGhhcyB0b28gIG1hbnkgZmxhd3MgIHRvIGJlICBpbnZva2VkIGRpcmVjdGx5ICBmcm9tIHRoZQotICAgICBNYWtlZmlsZS4KLQotICBIZXJlJ3MgaG93IGl0IHdvcmtzOgotCi0gIC0gdGhlIGZpcnN0IHRpbWUgeW91IHR5cGUgYG1ha2UnLCAgdGhlIGJ1aWxkIHN5c3RlbSBydW5zIGEgc2VyaWVzIG9mCi0gICAgc3ViLW1ha2VmaWxlcyAgaW4gb3JkZXIgIHRvIGRldGVjdCAgeW91ciBob3N0ICBwbGF0Zm9ybS4gIEl0ICB0aGVuCi0gICAgZHVtcHMgd2hhdCBpdCBmb3VuZCwgYW5kIGNyZWF0ZXMgYSBmaWxlIGNhbGxlZCBgY29uZmlnLm1rJyBpbiAgdGhlCi0gICAgY3VycmVudCAgZGlyZWN0b3J5LiAgVGhpcyBpcyBhICBzdWItTWFrZWZpbGUgdXNlZCAgdG8gIGRlZmluZSBtYW55Ci0gICAgaW1wb3J0YW50IE1ha2UgdmFyaWFibGVzIHVzZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkuCi0KLSAgLSB0aGUgc2Vjb25kIHRpbWUsIHRoZSBidWlsZCBzeXN0ZW0gZGV0ZWN0cyB0aGUgYGNvbmZpZy5taycgdGhlbiB1c2UKLSAgICBpdCAgdG8gIGJ1aWxkIHRoZSAgbGlicmFyeS4gIEFsbCBvYmplY3QgIGZpbGVzICBnbyAgaW50byAnb2JqJyAgYnkKLSAgICBkZWZhdWx0LCAgYXMgd2VsbCAgYXMgdGhlICBsaWJyYXJ5IGZpbGUsICBidXQgdGhpcyAgY2FuICBlYXNpbHkgYmUKLSAgICBjaGFuZ2VkLgotCi0gIE5vdGUgdGhhdCAgeW91IGNhbiBydW4gYG1ha2UgIHNldHVwJyB0byBmb3JjZSAgYW5vdGhlciBob3N0IHBsYXRmb3JtCi0gIGRldGVjdGlvbiAgZXZlbiAgIGlmICBhICBgY29uZmlnLm1rJyAgaXMgIHByZXNlbnQgICBpbiAgdGhlICBjdXJyZW50Ci0gIGRpcmVjdG9yeS4gIEFub3RoZXIgc29sdXRpb24gIGlzICBzaW1wbHkgdG8gIGRlbGV0ZSAgdGhlIGZpbGUsICB0aGVuCi0gIHJlLXJ1biBtYWtlLgotCi0gIEZpbmFsbHksIHRoZSAgZGVmYXVsdCBjb21waWxlciAgZm9yIGFsbCBwbGF0Zm9ybXMgIGlzIGdjYyAgKGZvciBub3csCi0gIHRoaXMgd2lsbCBob3BlZnVsbHkgY2hhbmdlZCBpbiB0aGUgZnV0dXJlKS4gIFlvdSBjYW4gaG93ZXZlciBzcGVjaWZ5Ci0gIGEgZGlmZmVyZW50ICBjb21waWxlciBieSBzcGVjaWZ5aW5nICBpdCBhZnRlciB0aGUgJ3NldHVwJyAgdGFyZ2V0IGFzCi0gIGluOgotCi0gICAgICBnbnVtYWtlIHNldHVwIGxjYyAgICAgICAgIG9uIFdpbjMyIHRvIHVzZSB0aGUgTENDIGNvbXBpbGVyCi0gICAgICBnbnVtYWtlIHNldHVwIHZpc3VhbGMgICAgIG9uIFdpbjMyIHRvIHVzZSBWaXN1YWwgQysrCi0KLSAgU2VlICB0aGUgZmlsZSAgYGNvbmZpZy88c3lzdGVtPi9kZXRlY3QubWsnIGZvciAgYSBsaXN0ICBvZiBzdXBwb3J0ZWQKLSAgY29tcGlsZXJzIGZvciB5b3VyIHBsYXRmb3Jtcy4KLQotICBJdCBzaG91bGQgYmUgcmVsYXRpdmVseSBlYXN5ICB0byB3cml0ZSBuZXcgZGV0ZWN0aW9uIHJ1bGVzIGZpbGVzIGFuZAotICBjb25maWcubWsuLgotCi0gIEZpbmFsbHksIHRvICBidWlsZCB0aGUgZGVtbyBwcm9ncmFtcywgIGdvIHRvIGBkZW1vcycgIGFuZCBsYXVuY2ggR05VCi0gIE1ha2UsIGl0IHdpbGwgdXNlIHRoZSBgY29uZmlnLm1rJyAgaW4gdGhlIHRvcCBkaXJlY3RvcnkgdG8gYnVpbGQgdGhlCi0gIHRlc3QgcHJvZ3JhbXMuLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUG9ydGFiaWxpdHk6Ci0KLSAgSW4gIHRoZSAgcHJldmlvdXMgIGJldGEsICBhICBzaW5nbGUgRlRfU3lzdGVtICBvYmplY3QgIHdhcyAgdXNlZCAgdG8KLSAgZW5jb21wYXNzICBhbGwgIGxvdy1sZXZlbCAgb3BlcmF0aW9ucyBsaWtlICB0aHJlYWQgIHN5bmNocm9uaXNhdGlvbiwKLSAgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGkvbyBhY2Nlc3MuICBUaGlzIGhhcyBiZWVuIGdyZWF0bHkgc2ltcGxpZmllZDoKLQotICAgIC0gdGhyZWFkIHN5bmNocm9uaXNhdGlvbiAgaGFzIGJlZW4gZHJvcHBlZCwgZm9yICB0aGUgc2ltcGxlIHJlYXNvbgotICAgICAgdGhhdCB0aGUgbGlicmFyeSAgaXMgYWxyZWFkeSByZS1lbnRyYW50LCBhbmQgdGhhdCAgaWYgeW91IHJlYWxseQotICAgICAgbmVlZCAgdHdvICB0aHJlYWRzIGFjY2Vzc2luZyAgdGhlICBzYW1lICBGVF9MaWJyYXJ5LCB5b3UgIHNob3VsZAotICAgICAgcmVhbGx5IHN5bmNocm9uaXplIGFjY2VzcyB0byBpdCB5b3Vyc2VsZiB3aXRoIGEgc2ltcGxlIG11dGV4LgotCi0gICAgLSBtZW1vcnkgIG1hbmFnZW1lbnQgaXMgIHBlcmZvcm1lZCAgdGhyb3VnaCBhICB2ZXJ5IHNpbXBsZSAgb2JqZWN0Ci0gICAgICBjYWxsZWQgYEZUX01lbW9yeScsICB3aGljaCByZWFsbHkgaXMgYSB0YWJsZSAgY29udGFpbmluZyBhIHRhYmxlCi0gICAgICBvZiBwb2ludGVycyB0byAgZnVuY3Rpb25zIGxpa2UgbWFsbG9jLCByZWFsbG9jIGFuZCAgZnJlZSBhcyB3ZWxsCi0gICAgICBhcyBzb21lIHVzZXIgZGF0YSAoY2xvc3VyZSkuCi0KLSAgICAtIHJlc291cmNlcyBoYXZlIGRpc2FwcGVhcmVkICh0aGV5IGNyZWF0ZWQgbW9yZSBwcm9ibGVtcyB0aGFuIHRoZXkKLSAgICAgIHNvbHZlZCksIGFuZCAgaS9vIG1hbmFnZW1lbnQgaGF2ZSAgYmVlbiBzaW1wbGlmaWVkIGdyZWF0bHkgIGFzIGEKLSAgICAgIHJlc3VsdC4gIFN0cmVhbXMgYXJlICBkZWZpbmVkIHRocm91Z2ggIEZUX1N0cmVhbSBvYmplY3RzLCAgd2hpY2gKLSAgICAgIGNhbiBiZSBlaXRoZXIgbWVtb3J5LWJhc2VkIG9yIGRpc2stYmFzZWQuCi0KLSAgICAgIE5vdGUgdGhhdCAgZWFjaCBmYWNlICBoYXMgaXRzIG93biAgc3RyZWFtLCB3aGljaCBpcyAgY2xvc2VkIG9ubHkKLSAgICAgIHdoZW4gIHRoZSAgZmFjZSBvYmplY3QgIGlzICBkZXN0cm95ZWQuICBIZW5jZSwgIGEgZnVuY3Rpb24gIGxpa2UKLSAgICAgIFRUX0ZsdXNoX0ZhY2UgaW4gMS54IGNhbm5vdCBiZSBkaXJlY3RseSAgc3VwcG9ydGVkLiAgSG93ZXZlciwgaWYKLSAgICAgIHlvdSByZWFsbHkgbmVlZCBzb21ldGhpbmcgbGlrZSAgdGhpcywgeW91IGNhbiBlYXNpbHkgdGFpbG9yIHlvdXIKLSAgICAgIG93biBzdHJlYW1zICB0byBhY2hpZXZlIHRoZSBzYW1lICBmZWF0dXJlIGF0IGEgIGxvd2VyIGxldmVsIChhbmQKLSAgICAgIHVzZSBGVF9PcGVuX0ZhY2UgaW5zdGVhZCBvZiBGVF9OZXdfRmFjZSB0byBjcmVhdGUgdGhlIGZhY2UpLgotCi0gIFNlZSB0aGUgZmlsZSAgYGluY2x1ZGUvZnRzeXN0ZW0uaCcgZm9yIG1vcmUgZGV0YWlscywgYXMgIHdlbGwgYXMgdGhlCi0gIGltcGxlbWVudGF0aW9ucyBmb3VuZCBpbiBgY29uZmlnL3VuaXgnIGFuZCBgY29uZmlnL2Fuc2knLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRm9udCBEcml2ZXJzOgotCi0gIFRoZSAgRm9udCBEcml2ZXIgIGludGVyZmFjZSBoYXMgIGJlZW4gbW9kaWZpZWQgIGluIG9yZGVyICB0byBzdXBwb3J0Ci0gIGV4dGVuc2lvbnMgJiB2ZXJzaW9uaW5nLgotCi0KLSAgVGhlICBsaXN0IG9mICB0aGUgZm9udCAgZHJpdmVycyB0aGF0ICBhcmUgc3RhdGljYWxseSAgbGlua2VkICB0byB0aGUKLSAgbGlicmFyeSBhdCBjb21waWxlIHRpbWUgaXMgIG1hbmFnZWQgdGhyb3VnaCBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKLSAgY2FsbGVkIGBjb25maWcvPHBsYXRmb3JtPi9mdG1vZHVsZS5oJy4KLQotICBUaGlzICBmaWxlIGlzICBhdXRvZ2VuZXJhdGVkICB3aGVuICBpbnZva2luZyAgYG1ha2UgbW9kdWxlcycuICAgVGhpcwotICB0YXJnZXQgIHdpbGwgIHBhcnNlICBhbGwgIHN1Yi1kaXJlY3RvcmllcyAgb2YgICdzcmMnLCBsb29raW5nICBmb3IgYQotICBgbW9kdWxlLm1rJyBydWxlcyAgZmlsZSwgdXNlZCAgdG8gZGVzY3JpYmUgIHRoZSBkcml2ZXIgdG8gIHRoZSBidWlsZAotICBzeXN0ZW0uCi0KLSAgSGVuY2UsIG9uZSAgc2hvdWxkIGNhbGwgIGBtYWtlIG1vZHVsZXMnIGVhY2ggIHRpbWUgYSBmb250ICBkcml2ZXIgaXMKLSAgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBgc3JjJyBkaXJlY3RvcnkuCi0KLSAgRmluYWxseSwgdGhpcyAgdmVyc2lvbiAgcHJvdmlkZXMgIGEgYHBzZXVkby1kcml2ZXInICBpbiAgYHNyYy9zZm50Jy4KLSAgVGhpcyAgZHJpdmVyICBkb2Vzbid0ICBzdXBwb3J0ICBmb250ICBmaWxlcyAgZGlyZWN0bHksIGJ1dCAgcHJvdmlkZXMKLSAgc2VydmljZXMgdXNlZCBieSBhbGwgVHJ1ZVR5cGUtbGlrZSBmb250IGRyaXZlcnMuICBIZW5jZSwgaXRzIGNvZGUgaXMKLSAgc2hhcmVkIGJldHdlZW4gIHRoZSBUcnVlVHlwZSAmIE9wZW5UeXBlICBmb250IGZvcm1hdHMsICBhbmQgcG9zc2libHkKLSAgbW9yZSBmb3JtYXRzIHRvIGNvbWUgaWYgd2UncmUgbHVja3kuLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRXh0ZW5zaW9ucyBzdXBwb3J0OgotCi0gIFRoZSBleHRlbnNpb25zIHN1cHBvcnQgaXMgaW5zcGlyZWQgYnkgdGhlIG9uZSBmb3VuZCBpbiAxLnguCi0KLSAgTm93LCBlYWNoIGZvbnQgZHJpdmVyIGhhcyAgaXRzIG93biBgZXh0ZW5zaW9uIHJlZ2lzdHJ5Jywgd2hpY2ggbGlzdHMKLSAgd2hpY2ggZXh0ZW5zaW9ucyAgYXJlIGF2YWlsYWJsZSAgZm9yIHRoZSBmb250ICBmYWNlcyBtYW5hZ2VkICBieSB0aGUKLSAgZHJpdmVyLgotCi0gIEV4dGVuc2lvbiBpZHMgYXJlICBub3cgc3RyaW5ncywgcmF0aGVyIHRoYW4gNC1ieXRlICB0YWdzLCBhcyB0aGlzIGlzCi0gIHVzdWFsbHkgbW9yZSByZWFkYWJsZS4KLQotICBFYWNoIGV4dGVuc2lvbiBoYXM6Ci0gICAgLSBzb21lIGRhdGEsIGFzc29jaWF0ZWQgdG8gZWFjaCBmYWNlIG9iamVjdAotICAgIC0gYW4gaW50ZXJmYWNlICh0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycykKLQotICBBbiBleHRlbnNpb24gIHRoYXQgaXMgZm9ybWF0LXNwZWNpZmljIHNob3VsZCAgc2ltcGx5IHJlZ2lzdGVyIGl0c2VsZgotICB0byB0aGUgY29ycmVjdCBmb250IGRyaXZlci4gIEhlcmUgaXMgc29tZSBleGFtcGxlIGNvZGU6Ci0KLSAgIC8vIFJlZ2lzdGVyaW5nIGFuIGV4dGVuc2lvbnMKLSAgIC8vCi0gICBGVF9FcnJvciAgRlRfSW5pdF9YWFhYX0V4dGVuc2lvbiggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gICB7Ci0gICAgIEZUX0RyaXZlckludGVyZmFjZSogIHR0X2RyaXZlcjsKLQotICAgICBkcml2ZXIgPSBGVF9HZXRfRHJpdmVyKCBsaWJyYXJ5LCAidHJ1ZXR5cGUiICk7Ci0gICAgIGlmICghZHJpdmVyKSByZXR1cm4gRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLQotICAgICByZXR1cm4gRlRfUmVnaXN0ZXJfRXh0ZW5zaW9uKCBkcml2ZXIsICZleHRlbnNpb25fY2xhc3MgKTsKLSAgIH0KLQotCi0gICAvLyBJbXBsZW1lbnRpbmcgdGhlIGV4dGVuc2lvbnMKLSAgIC8vCi0gICBGVF9FcnJvciAgRlRfUHJvY2VlZF9FeHRlbnNpb25fWFhYKCBGVF9GYWNlICBmYWNlICkKLSAgIHsKLSAgICAgRlRfWFhYX0V4dGVuc2lvbiAgICAgICAgICAgIGV4dDsKLSAgICAgRlRfWFhYX0V4dGVuc2lvbl9JbnRlcmZhY2UgIGV4dF9pbnRlcmZhY2U7Ci0KLSAgICAgZXh0ID0gRlRfR2V0X0V4dGVuc2lvbiggZmFjZSwgImV4dGVuc2lvbmlkIiwgJmV4dF9pbnRlcmZhY2UgKTsKLSAgICAgaWYgKCFleHQpIHJldHVybiBlcnJvcjsKLQotICAgICByZXR1cm4gZXh0X2ludGVyZmFjZS0+ZG9faXQoZXh0KTsKLSAgIH0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHlyaWdodCAyMDAwLTIwMTcgYnkKLURhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLQotVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mIHRoZSAgRnJlZVR5cGUgIHByb2plY3QsIGFuZCBtYXkgIG9ubHkgYmUgIHVzZWQsCi1tb2RpZmllZCwgIGFuZCAgZGlzdHJpYnV0ZWQgIHVuZGVyICB0aGUgIHRlcm1zIG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QKLWxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcwotZmlsZSB5b3UgIGluZGljYXRlIHRoYXQgIHlvdSBoYXZlICByZWFkIHRoZSAgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCAgYW5kCi1hY2NlcHQgaXQgZnVsbHkuCi0KLQotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotY29kaW5nOiB1dGYtOAotRW5kOgotCi0tLS0gZW5kIG9mIENIQU5HRVMgLS0tCmRpZmYgLS1naXQgYS9kb2NzL0NNQUtFIGIvZG9jcy9DTUFLRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyMzdhZS4uMDAwMDAwMAotLS0gYS9kb2NzL0NNQUtFCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1TdXBwb3J0IGZvciBhIGNtYWtlIGJ1aWxkIGhhcyBiZWVuIGNvbnRyaWJ1dGVkLiAgU2VlIHRoZSByZW1hcmtzIGluIHRoZQotdG9wLWxldmVsIGBDTWFrZUxpc3RzLnR4dCcgZmlsZSBmb3IgbW9yZS4KZGlmZiAtLWdpdCBhL2RvY3MvQ1VTVE9NSVpFIGIvZG9jcy9DVVNUT01JWkUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMTU4N2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9DVVNUT01JWkUKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotSG93IHRvIGN1c3RvbWl6ZSB0aGUgY29tcGlsYXRpb24gb2YgdGhlIGxpYnJhcnkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgRnJlZVR5cGUgIGlzIGhpZ2hseSAgY3VzdG9taXphYmxlICB0byBmaXQgIHZhcmlvdXMgIG5lZWRzLCBhbmQgIHRoaXMKLSAgZG9jdW1lbnQgIGRlc2NyaWJlcyAgaG93ICBpdCAgaXMgIHBvc3NpYmxlICB0byAgc2VsZWN0ICBvcHRpb25zICBhbmQKLSAgY29tcG9uZW50cyBhdCBjb21waWxhdGlvbiB0aW1lLgotCi0KLUkuIENvbmZpZ3VyYXRpb24gbWFjcm9zCi0KLSAgVGhlICBmaWxlIGBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oJyAgY29udGFpbnMgYSAgbGlzdCAgb2YKLSAgY29tbWVudGVkIGNvbmZpZ3VyYXRpb24gbWFjcm9zIHRoYXQgY2FuICBiZSB0b2dnbGVkIGJ5IGRldmVsb3BlcnMgdG8KLSAgaW5kaWNhdGUgd2hpY2ggZmVhdHVyZXMgc2hvdWxkIGJlIGFjdGl2ZSB3aGlsZSBidWlsZGluZyB0aGUgbGlicmFyeS4KLQotICBUaGVzZSAgb3B0aW9ucyByYW5nZSAgZnJvbSBkZWJ1ZyAgbGV2ZWwgdG8gIGF2YWlsYWJpbGl0eSAgb2YgY2VydGFpbgotICBmZWF0dXJlcywgICBsaWtlICBuYXRpdmUgICBUcnVlVHlwZSAgaGludGluZyAgIHRocm91Z2ggICBhICBieXRlY29kZQotICBpbnRlcnByZXRlci4KLQotICBXZSAgaW52aXRlIHlvdSAgdG8gcmVhZCAgdGhpcyBmaWxlICBmb3IgbW9yZSAgaW5mb3JtYXRpb24uICAgWW91IGNhbgotICBjaGFuZ2UgdGhlICBmaWxlJ3MgY29udGVudCB0byBzdWl0ICB5b3VyIG5lZWRzLCBvciAgb3ZlcnJpZGUgaXQgd2l0aAotICBvbmUgb2YgdGhlIHRlY2huaXF1ZXMgZGVzY3JpYmVkIGJlbG93LgotCi0KLUlJLiBNb2R1bGVzIGxpc3QKLQotICBJZiB5b3UgIHVzZSBHTlUgbWFrZSAgcGxlYXNlIGVkaXQgdGhlIHRvcC1sZXZlbCAgZmlsZSBgbW9kdWxlcy5jZmcnLgotICBJdCBjb250YWlucyBhICBsaXN0IG9mIGF2YWlsYWJsZSBGcmVlVHlwZSBtb2R1bGVzICBhbmQgZXh0ZW5zaW9ucyB0bwotICBiZSBjb21waWxlZC4gIENoYW5nZSBpdCB0byBzdWl0IHlvdXIgb3duIHByZWZlcmVuY2VzLiAgQmUgYXdhcmUgdGhhdAotICBjZXJ0YWluIG1vZHVsZXMgIGRlcGVuZCBvbiAgb3RoZXJzLCBhcyBkZXNjcmliZWQgIGluIHRoZSAgZmlsZS4gIEdOVQotICBtYWtlICB1c2VzIGBtb2R1bGVzLmNmZycgIHRvICBnZW5lcmF0ZSBgZnRtb2R1bGUuaCcgIChpbiB0aGUgIG9iamVjdAotICBkaXJlY3RvcnkpLgotCi0gIElmIHlvdSBidWlsZCBGcmVlVHlwZSBpbiBhIGRpcmVjdG9yeSBzZXBhcmF0ZSBmcm9tIHRoZSBzb3VyY2UgZmlsZXMsCi0gIHB1dCB5b3VyICBjdXN0b21pemVkIGBtb2R1bGVzLmNmZycgaW4gIHRoYXQgZGlyZWN0b3J5OyB0aGF0ICB3YXkgeW91Ci0gIGNhbiBrZWVwIHRoZSBzb3VyY2UgZmlsZXMgYGNsZWFuJy4KLQotICBJZiAgeW91IGRvbid0ICB1c2UgIEdOVSBtYWtlICB5b3UgIGhhdmUgdG8gIG1hbnVhbGx5ICBlZGl0IHRoZSAgZmlsZQotICBgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCcgKHdoaWNoICBpcyAqbm90KiB1c2VkICB3aXRoICBpZgotICBjb21waWxlZCB3aXRoIEdOVSBtYWtlKSB0byBhZGQgIG9yIHJlbW92ZSB0aGUgZHJpdmVycyBhbmQgY29tcG9uZW50cwotICB5b3Ugd2FudCAgdG8gY29tcGlsZSBpbnRvICB0aGUgbGlicmFyeS4gIFNlZSBgSU5TVEFMTC5BTlknICBmb3IgbW9yZQotICBpbmZvcm1hdGlvbi4KLQotCi1JSUkuIFN5c3RlbSBpbnRlcmZhY2UKLQotICBGcmVlVHlwZSdzICBkZWZhdWx0IGludGVyZmFjZSB0byAgdGhlIHN5c3RlbSAgKGkuZS4sIHRoZSAgcGFydHMgdGhhdAotICBkZWFsICB3aXRoICBtZW1vcnkgIG1hbmFnZW1lbnQgICBhbmQgIGkvbyAgc3RyZWFtcykgIGlzICBsb2NhdGVkICBpbgotICBgc3JjL2Jhc2UvZnRzeXN0ZW0uYycuCi0KLSAgVGhlIGN1cnJlbnQgIGltcGxlbWVudGF0aW9uIHVzZXMgc3RhbmRhcmQgQyBsaWJyYXJ5ICBjYWxscyB0byBtYW5hZ2UKLSAgbWVtb3J5ICBhbmQgdG8gcmVhZCAgZm9udCBmaWxlcy4gICBJdCBpcyAgaG93ZXZlciBwb3NzaWJsZSAgdG8gd3JpdGUKLSAgY3VzdG9tIGltcGxlbWVudGF0aW9ucyB0byBzdWl0IHNwZWNpZmljIHN5c3RlbXMuCi0KLSAgVG8gIHRlbGwgdGhlICBHTlUgTWFrZS1iYXNlZCAgYnVpbGQgc3lzdGVtICB0byB1c2UgIGEgIGN1c3RvbSBzeXN0ZW0KLSAgaW50ZXJmYWNlLCB5b3UgaGF2ZSB0byAgZGVmaW5lIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBGVFNZU19TUkMgdG8KLSAgcG9pbnQgdG8gdGhlIHJlbGV2YW50IGltcGxlbWVudGF0aW9uOgotCi0gICAgb24gVW5peDoKLQotICAgICAgLi9jb25maWd1cmUgPHlvdXIgb3B0aW9ucz4KLSAgICAgIGV4cG9ydCBGVFNZU19TUkM9Zm9vL215X2Z0c3lzdGVtLmMKLSAgICAgIG1ha2UKLSAgICAgIG1ha2UgaW5zdGFsbAotCi0gICAgb24gV2luZG93czoKLQotICAgICAgbWFrZSBzZXR1cCA8Y29tcGlsZXI+Ci0gICAgICBzZXQgRlRTWVNfU1JDPWZvby9teV9mdHN5c3RlbS5jCi0gICAgICBtYWtlCi0KLQotSVYuIE92ZXJyaWRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFuZCBtb2R1bGUgaGVhZGVycwotCi0gIEl0ICBpcyBwb3NzaWJsZSAgdG8gb3ZlcnJpZGUgIHRoZSBkZWZhdWx0ICBjb25maWd1cmF0aW9uICBhbmQgbW9kdWxlCi0gIGhlYWRlcnMgd2l0aG91dCAgY2hhbmdpbmcgdGhlIG9yaWdpbmFsIGZpbGVzLiAgVGhlcmUgIGFyZSB0aHJlZSB3YXlzCi0gIHRvIGRvIHRoYXQ6Ci0KLQotICAxLiBXaXRoIEdOVSBtYWtlCi0KLSAgICBbVGhpcyBpcyBhY3R1YWxseSBhIGNvbWJpbmF0aW9uIG9mIG1ldGhvZCAyIGFuZCAzLl0KLQotICAgIEp1c3QgcHV0IHlvdXIgY3VzdG9tIGBmdG9wdGlvbi5oJyAgZmlsZSBpbnRvIHRoZSBvYmplY3RzIGRpcmVjdG9yeQotICAgIChub3JtYWxseSBgPHRvcGRpcj4vb2JqcycgaWYgeW91IGJ1aWxkICBpbiB0aGUgc291cmNlIHRyZWUsIG9yIHRoZQotICAgIGRpcmVjdG9yeSB3aGVyZSAgeW91IGludm9rZSBjb25maWd1cmUgIGlmIHlvdSBidWlsZCBpbiAgYSBzZXBhcmF0ZQotICAgIGRpcmVjdG9yeSksIHdoaWNoIEdOVSBtYWtlIHByZWZlcnMgb3ZlciB0aGUgc3RhbmRhcmQgbG9jYXRpb24uICBObwotICAgIGFjdGlvbiAgaXMgIG5lZWRlZCAgZm9yICAgYGZ0bW9kdWxlLmgnICBiZWNhdXNlICBpdCAgaXMgIGdlbmVyYXRlZAotICAgIGF1dG9tYXRpY2FsbHkgaW4gdGhlIG9iamVjdHMgZGlyZWN0b3J5LgotCi0gIDIuIFVzaW5nIHRoZSBDIGluY2x1ZGUgcGF0aAotCi0gICAgVXNlIHRoZSAgQyBpbmNsdWRlIHBhdGggIHRvIGVuc3VyZSB0aGF0ICB5b3VyIG93biB2ZXJzaW9ucyAgb2YgdGhlCi0gICAgZmlsZXMgYXJlIHVzZWQgYXQgY29tcGlsZSB0aW1lIHdoZW4gdGhlIGxpbmVzCi0KLSAgICAgICNpbmNsdWRlIEZUX0NPTkZJR19PUFRJT05TX0gKLSAgICAgICNpbmNsdWRlIEZUX0NPTkZJR19NT0RVTEVTX0gKLQotICAgIGFyZSAgICAgIGNvbXBpbGVkLiAgICAgICBUaGVpciAgICAgIGRlZmF1bHQgICAgICB2YWx1ZXMgICAgICBiZWluZwotICAgIDxmcmVldHlwZS9jb25maWcvZnRvcHRpb24uaD4gYW5kIDxmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaD4sIHlvdQotICAgIGNhbiBkbyBzb21ldGhpbmcgbGlrZToKLQotICAgICAgY3VzdG9tLwotICAgICAgICBjb25maWcvCi0gICAgICAgICAgZnRvcHRpb24uaCAgICAgID0+IGN1c3RvbSBvcHRpb25zIGhlYWRlcgotICAgICAgICAgIGZ0bW9kdWxlLmggICAgICA9PiBjdXN0b20gbW9kdWxlcyBsaXN0Ci0KLSAgICAgIGluY2x1ZGUvICAgICAgICAgICAgPT4gbm9ybWFsIEZyZWVUeXBlIDIgaW5jbHVkZQotICAgICAgICAuLi4KLQotICAgIHRoZW4gY2hhbmdlIHRoZSBDIGluY2x1ZGUgcGF0aCB0byBhbHdheXMgZ2l2ZSB0aGUgcGF0aCB0byBgY3VzdG9tJwotICAgIGJlZm9yZSB0aGUgRnJlZVR5cGUgMiBgaW5jbHVkZScuCi0KLQotICAzLiBSZWRlZmluaW5nIEZUX0NPTkZJR19PUFRJT05TX0ggYW5kIEZUX0NPTkZJR19NT0RVTEVTX0gKLQotICAgIEFub3RoZXIgd2F5IHRvIGRvIHRoZSBzYW1lIHRoaW5nIGlzIHRvIHJlZGVmaW5lIHRoZSBtYWNyb3MgdXNlZCB0bwotICAgIG5hbWUgIHRoZSBjb25maWd1cmF0aW9uICBoZWFkZXJzLiAgVG8gIGRvICBzbywgeW91ICBuZWVkIGEgIGN1c3RvbQotICAgIGBmdDJidWlsZC5oJyB3aG9zZSBjb250ZW50IGNhbiBiZSBhcyBzaW1wbGUgYXM6Ci0KLSAgICAgICNpZm5kZWYgRlQyX0JVSUxEX01ZX1BMQVRGT1JNX0hfCi0gICAgICAjZGVmaW5lIEZUMl9CVUlMRF9NWV9QTEFURk9STV9IXwotCi0gICAgICAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggIDxjdXN0b20vbXktZnRvcHRpb24uaD4KLSAgICAgICNkZWZpbmUgRlRfQ09ORklHX01PRFVMRVNfSCAgPGN1c3RvbS9teS1mdG1vZHVsZS5oPgotCi0gICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmg+Ci0KLSAgICAgICNlbmRpZiAvKiBGVDJfQlVJTERfTVlfUExBVEZPUk1fSF8gKi8KLQotICAgIFBsYWNlIHRob3NlIGZpbGVzIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LCBlLmcuLAotCi0gICAgICBjdXN0b20vCi0gICAgICAgIGZ0MmJ1aWxkLmggICAgICAgICAgID0+IGN1c3RvbSB2ZXJzaW9uIGRlc2NyaWJlZCBhYm92ZQotICAgICAgICBteS1mdG9wdGlvbi5oICAgICAgICA9PiBjdXN0b20gb3B0aW9ucyBoZWFkZXIKLSAgICAgICAgbXktZnRtb2R1bGUuaCAgICAgICAgPT4gY3VzdG9tIG1vZHVsZXMgbGlzdCBoZWFkZXIKLQotICAgIGFuZCBjaGFuZ2UgIHRoZSBDIGluY2x1ZGUgcGF0aCAgdG8gZW5zdXJlIHRoYXQgIGBjdXN0b20nIGlzIGFsd2F5cwotICAgIHBsYWNlZCBiZWZvcmUgdGhlIEZUMiBgaW5jbHVkZScgZHVyaW5nIGNvbXBpbGF0aW9uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHlyaWdodCAyMDAzLTIwMTcgYnkKLURhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLQotVGhpcyAgZmlsZSBpcyAgcGFydCBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSBvbmx5ICBiZSB1c2VkLAotbW9kaWZpZWQsICBhbmQgZGlzdHJpYnV0ZWQgIHVuZGVyIHRoZSAgdGVybXMgb2YgIHRoZSAgRnJlZVR5cGUgcHJvamVjdAotbGljZW5zZSwgIExJQ0VOU0UuVFhULiAgQnkgIGNvbnRpbnVpbmcgdG8gIHVzZSwgbW9kaWZ5LCAgb3IgZGlzdHJpYnV0ZQotdGhpcyBmaWxlIHlvdSAgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkICB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZAotYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotCi0tLS0gZW5kIG9mIENVU1RPTUlaRSAtLS0KZGlmZiAtLWdpdCBhL2RvY3MvREVCVUcgYi9kb2NzL0RFQlVHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWU5MzkwLi4wMDAwMDAwCi0tLSBhL2RvY3MvREVCVUcKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotRGVidWdnaW5nIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JLiBDb25maWd1cmF0aW9uIG1hY3JvcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlcmUgYXJlICBzZXZlcmFsIHdheXMgdG8gZW5hYmxlICBkZWJ1Z2dpbmcgZmVhdHVyZXMgaW4gYSAgRnJlZVR5cGUgMgotYnVpbGRzLiAgVGhpcyBpcyAgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBkZWZpbml0aW9uICBvZiBzcGVjaWFsIG1hY3JvcwotbG9jYXRlZCBpbiB0aGUgZmlsZSBgZnRvcHRpb24uaCcuICBUaGUgbWFjcm9zIGFyZToKLQotCi0gIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0KLSAgICAjZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGUgRlRfRVJST1IgbWFjcm8gY2FsbHMKLSAgICB0byBwcmludCBlcnJvciAgbWVzc2FnZXMgZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLiAgIFRoaXMgd2lsbCBub3QKLSAgICBzdG9wICB0aGUgIHByb2dyYW0uICBWZXJ5ICB1c2VmdWwgIHRvICBzcG90IGludmFsaWQgIGZvbnRzICBkdXJpbmcKLSAgICBkZXZlbG9wbWVudCBhbmQgdG8gY29kZSB3b3JrYXJvdW5kcyBmb3IgdGhlbS4KLQotICBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gICAgI2RlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgYm90aCBtYWNyb3MgRlRfRVJST1IgYW5kCi0gICAgRlRfVFJBQ0UuICBUaGlzICBhbHNvIGluY2x1ZGVzIHRoZSB2YXJpYW50cyAgRlRfVFJBQ0UwLCBGVF9UUkFDRTEsCi0gICAgRlRfVFJBQ0UyLCAuLi4sIEZUX1RSQUNFNy4KLQotICAgIFRoZSAgdHJhY2UgbWFjcm9zICBhcmUgdXNlZCAgdG8gIHNlbmQgZGVidWdnaW5nICBtZXNzYWdlcyB3aGVuICBhbgotICAgIGFwcHJvcHJpYXRlICBgZGVidWcgbGV2ZWwnICBpcyBjb25maWd1cmVkICBhdCBydW50aW1lICB0aHJvdWdoIHRoZQotICAgIEZUMl9ERUJVRyBlbnZpcm9ubWVudCB2YXJpYWJsZSAobW9yZSBvbiB0aGlzIGxhdGVyKS4KLQotICBGVF9ERUJVR19NRU1PUlkKLQotICAgIElmIHRoaXMgIG1hY3JvIGlzICNkZWZpbmVkLCB0aGUgIEZyZWVUeXBlIGVuZ2luZSBpcyBsaW5rZWQgIHdpdGggYQotICAgIHNtYWxsICBidXQgIGVmZmVjdGl2ZSBkZWJ1Z2dpbmcgIG1lbW9yeSAgbWFuYWdlciAgdGhhdCB0cmFja3MgIGFsbAotICAgIGFsbG9jYXRpb25zIGFuZCBmcmVlcyB0aGF0IGFyZSBwZXJmb3JtZWQgd2l0aGluIHRoZSBmb250IGVuZ2luZS4KLQotICAgIFdoZW4gIHRoZSAgRlQyX0RFQlVHX01FTU9SWSAgZW52aXJvbm1lbnQgdmFyaWFibGUgIGlzICBkZWZpbmVkICBhdAotICAgIHJ1bnRpbWUsIGEgIGNhbGwgdG8gRlRfRG9uZV9GcmVlVHlwZSB3aWxsICBkdW1wIG1lbW9yeSBzdGF0aXN0aWNzLAotICAgIGluY2x1ZGluZyAgdGhlICBsaXN0ICBvZiAgbGVha2VkIG1lbW9yeSAgYmxvY2tzICB3aXRoICB0aGUgIHNvdXJjZQotICAgIGxvY2F0aW9ucyB3aGVyZSAgdGhlc2Ugd2VyZSBhbGxvY2F0ZWQuICAgSXQgaXMgYWx3YXlzIGEgIHZlcnkgZ29vZAotICAgIGlkZWEgdG8gZGVmaW5lIHRoaXMgaW4gIGRldmVsb3BtZW50IGJ1aWxkcy4gIFRoaXMgd29ya3Mgd2l0aCBfYW55XwotICAgIHByb2dyYW0gbGlua2VkIHRvIEZyZWVUeXBlLCBidXQgcmVxdWlyZXMgYSBiaWcgZGVhbCBvZiBtZW1vcnkgKHRoZQotICAgIGRlYnVnZ2luZyBtZW1vcnkgIG1hbmFnZXIgbmV2ZXIgIGZyZWVzIHRoZSBibG9ja3MgIHRvIHRoZSAgaGVhcCBpbgotICAgIG9yZGVyIHRvIGRldGVjdCBkb3VibGUgZnJlZXMpLgotCi0gICAgV2hlbiAgRlQyX0RFQlVHX01FTU9SWSBpc24ndCAgZGVmaW5lZCAgYXQgIHJ1bnRpbWUsIHRoZSAgZGVidWdnaW5nCi0gICAgbWVtb3J5IG1hbmFnZXIgaXMgaWdub3JlZCwgYW5kIHBlcmZvcm1hbmNlIGlzIHVuYWZmZWN0ZWQuCi0KLQotSUkuIERlYnVnZ2luZyBtYWNyb3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNldmVyYWwgIG1hY3JvcyAgY2FuIGJlICB1c2VkICB3aXRoaW4gIHRoZSAgRnJlZVR5cGUgc291cmNlcyAgdG8gIGhlbHAKLWRlYnVnZ2luZyBpdHMgY29kZToKLQotCi0gIDEuIEZUX0VSUk9SKCggLi4uICkpCi0KLSAgICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gc2VuZCBkZWJ1ZyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIHJlbGF0aXZlbHkKLSAgICBzZXJpb3VzIGVycm9ycyAgKGxpa2UgYnJva2VuICBmb250IGZpbGVzKSwgYnV0ICB3aWxsIG5vdCAgc3RvcCB0aGUKLSAgICBleGVjdXRpb24gb2YgdGhlIHJ1bm5pbmcgcHJvZ3JhbS4gICBJdHMgY29kZSBpcyBjb21waWxlZCBvbmx5IHdoZW4KLSAgICBlaXRoZXIgRlRfREVCVUdfTEVWRUxfRVJST1Igb3IgRlRfREVCVUdfTEVWRUxfVFJBQ0UgYXJlIGRlZmluZWQgaW4KLSAgICBgZnRvcHRpb24uaCcuCi0KLSAgICBOb3RlIHRoYXQgeW91IGhhdmUgdG8gdXNlIGEgcHJpbnRmLWxpa2Ugc2lnbmF0dXJlLCBidXQgd2l0aCBkb3VibGUKLSAgICBwYXJlbnRoZXNlcywgbGlrZSBpbgotCi0gICAgICBGVF9FUlJPUigoICJ5b3VyICVzIGlzIG5vdCAlc1xuIiwgImZvbyIsICJiYXIiICkpOwotCi0KLSAgMi4gRlRfQVNTRVJUKCBjb25kaXRpb24gKQotCi0gICAgVGhpcyBtYWNybyBpcyB1c2VkIHRvIGNoZWNrICBzdHJvbmcgYXNzZXJ0aW9ucyBhdCBydW50aW1lLiAgSWYgaXRzCi0gICAgY29uZGl0aW9uIGlzbid0IFRSVUUsIHRoZSBwcm9ncmFtIHdpbGwgYWJvcnQgd2l0aCBhIHBhbmljIG1lc3NhZ2UuCi0gICAgSXRzICBjb2RlICAgaXMgIGNvbXBpbGVkICAgd2hlbiAgZWl0aGVyICAgRlRfREVCVUdfTEVWRUxfRVJST1IgIG9yCi0gICAgRlRfREVCVUdfTEVWRUxfVFJBQ0UgICBhcmUgIGRlZmluZWQuICAgIFlvdSAgIGRvbid0ICBuZWVkICAgZG91YmxlCi0gICAgcGFyZW50aGVzZXMgaGVyZS4gIEZvciBleGFtcGxlCi0KLSAgICAgIEZUX0FTU0VSVCggcHRyICE9IE5VTEwgKTsKLQotCi0gIDMuIEZUX1RSQUNFKCBsZXZlbCwgKG1lc3NhZ2UuLi4pICkKLQotICAgIFRoZSAgRlRfVFJBQ0UgIG1hY3JvIGlzICB1c2VkICB0byAgc2VuZCBnZW5lcmFsLXB1cnBvc2UgIGRlYnVnZ2luZwotICAgIG1lc3NhZ2VzIGR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbi4gICBUaGlzIG1hY3JvIHVzZXMgYW4gKmltcGxpY2l0KgotICAgIG1hY3JvICBuYW1lZCAgRlRfQ09NUE9ORU5UICB1c2VkICB0byAgbmFtZSAgdGhlICBjdXJyZW50ICBGcmVlVHlwZQotICAgIGNvbXBvbmVudCBiZWluZyBydW4uCi0KLSAgICBUaGUgZGV2ZWxvcGVyICBzaG91bGQgYWx3YXlzICBkZWZpbmUgRlRfQ09NUE9ORU5UICBhcyBhcHByb3ByaWF0ZSwKLSAgICBmb3IgZXhhbXBsZSBhcyBpbgotCi0gICAgICAjdW5kZWYgIEZUX0NPTVBPTkVOVAotICAgICAgI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCi0KLSAgICBUaGUgIHZhbHVlICBvZiB0aGUgIEZUX0NPTVBPTkVOVCAgbWFjcm8gIGlzIGFuICBlbnVtZXJhdGlvbiAgbmFtZWQKLSAgICBgdHJhY2VfWFhYWCcgd2hlcmUgYFhYWFgnIGlzIG9uZSBvZiB0aGUgY29tcG9uZW50IG5hbWVzIGRlZmluZWQgaW4KLSAgICB0aGUgaW50ZXJuYWwgIGZpbGUgYGludGVybmFsL2Z0dHJhY2UuaCcuICAgSWYgeW91ICBtb2RpZnkgRnJlZVR5cGUKLSAgICBzb3VyY2UgYW5kIGluc2VydCBuZXcgYHRyYWNlX1hYWFgnICBtYWNybywgeW91IG11c3QgcmVnaXN0ZXIgaXQgaW4KLSAgICBgZnR0cmFjZS5oJy4gSWYgIHlvdSBpbnNlcnQgb3IgIHJlbW92ZSBtYW55IHRyYWNlIG1hY3JvcywgIHlvdSBjYW4KLSAgICBjaGVjayAgIHRoZSAgICB1bmRlZmluZWQgICBvciAgIHRoZSAgIHVudXNlZCAgICB0cmFjZSAgIG1hY3JvICAgYnkKLSAgICBgc3JjL3Rvb2xzL2Noa3RyY21wLnB5Jy4KLQotICAgIEVhY2ggc3VjaCBjb21wb25lbnQgaXMgYXNzaWduZWQgYSBgZGVidWcgbGV2ZWwnLCByYW5naW5nIGZyb20gMCB0bwotICAgIDcsICB0aHJvdWdoICAgdGhlICB1c2UgIG9mICB0aGUgICBGVDJfREVCVUcgIGVudmlyb25tZW50ICB2YXJpYWJsZQotICAgIChkZXNjcmliZWQgYmVsb3cpIHdoZW4gYSBwcm9ncmFtIGxpbmtlZCB3aXRoIEZyZWVUeXBlIHN0YXJ0cy4KLQotICAgIFdoZW4gRlRfVFJBQ0UgaXMgIGNhbGxlZCwgaXRzIGxldmVsIGlzIGNvbXBhcmVkIHRvICB0aGUgb25lIG9mIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50LiAgTWVzc2FnZXMgd2l0aCB0cmFjZSBsZXZlbHMgKmhpZ2hlciogdGhhbgotICAgIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBvbmVudCBsZXZlbCBhcmUgZmlsdGVyZWQgYW5kIG5ldmVyIHByaW50ZWQuCi0KLSAgICBUaGlzIG1lYW5zICB0aGF0IHRyYWNlIG1lc3NhZ2VzICB3aXRoIGxldmVsIDAgYXJlICBhbHdheXMgcHJpbnRlZCwKLSAgICB0aG9zZSB3aXRoICBsZXZlbCAyIGFyZSBvbmx5ICBwcmludGVkIHdoZW4gdGhlIGNvbXBvbmVudCAgbGV2ZWwgaXMKLSAgICAqYXQgbGVhc3QqIDIuCi0KLSAgICBUaGUgIHNlY29uZCBwYXJhbWV0ZXIgIHRvICBGVF9UUkFDRSBtdXN0ICBjb250YWluIHBhcmVudGhlc2VzICBhbmQKLSAgICBjb3JyZXNwb25kIHRvIGEgcHJpbnRmLWxpa2UgY2FsbCwgYXMgaW4KLQotICAgICAgRlRfVFJBQ0UoIDIsICggInlvdXIgJXMgaXMgbm90ICVzXG4iLCAiZm9vIiwgImJhciIgKSApCi0KLSAgICBUaGUgICBzaG9ydGN1dCAgbWFjcm9zICAgRlRfVFJBQ0UwLCAgRlRfVFJBQ0UxLCAgIEZUX1RSQUNFMiwgIC4uLiwKLSAgICBGVF9UUkFDRTcgY2FuICBiZSB1c2VkIHdpdGggIGNvbnN0YW50IGxldmVsIGluZGljZXMsIGFuZCAgYXJlIG11Y2gKLSAgICBjbGVhbmVyIHRvIHVzZSwgYXMgaW4KLQotICAgICAgRlRfVFJBQ0UyKCggInlvdXIgJXMgaXMgbm90ICVzXG4iLCAiZm9vIiwgImJhciIgKSk7Ci0KLQotSUlJLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSAgZm9sbG93aW5nICBlbnZpcm9ubWVudCAgdmFyaWFibGVzIGNvbnRyb2wgIGRlYnVnZ2luZyAgb3V0cHV0ICBhbmQKLWJlaGF2aW91ciBvZiBGcmVlVHlwZSBhdCBydW50aW1lLgotCi0KLSAgRlQyX0RFQlVHCi0KLSAgICBUaGlzICB2YXJpYWJsZSAgIGlzICBvbmx5ICB1c2VkICAgd2hlbiAgRnJlZVR5cGUgIGlzICAgYnVpbHQgIHdpdGgKLSAgICBGVF9ERUJVR19MRVZFTF9UUkFDRSAgZGVmaW5lZC4gIEl0ICBjb250YWlucyBhICBsaXN0IG9mICBjb21wb25lbnQKLSAgICBsZXZlbCBkZWZpbml0aW9ucywgZm9sbG93aW5nIHRoaXMgZm9ybWF0OgotCi0gICAgICBjb21wb25lbnQxOmxldmVsMSBjb21wb25lbnQyOmxldmVsMiBjb21wb25lbnQzOmxldmVsMyAuLi4KLQotICAgIHdoZXJlIGBjb21wb25lbnRYJyBpcyB0aGUgbmFtZSAgb2YgYSB0cmFjaW5nIGNvbXBvbmVudCwgYXMgZGVmaW5lZAotICAgIGluIGBmdHRyYWNlLmgnLCBidXQgd2l0aG91dCB0aGUgIGB0cmFjZV8nIHByZWZpeC4gIGBsZXZlbFgnIGlzIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgbGV2ZWwgdG8gdXNlIGF0IHJ1bnRpbWUuCi0KLSAgICBgYW55JyAgaXMgYSAgc3BlY2lhbCBjb21wb25lbnQgIG5hbWUgdGhhdCAgd2lsbCBiZSAgaW50ZXJwcmV0ZWQgYXMKLSAgICBgYW55L2FsbCBjb21wb25lbnRzJy4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zCi0KLSAgICAgIHNldCBGVDJfREVCVUc9YW55OjIgbWVtb3J5OjUgaW86NCAgICAgICAgKG9uIFdpbmRvd3MpCi0gICAgICBleHBvcnQgRlQyX0RFQlVHPSJhbnk6MiBtZW1vcnk6NSBpbzo0IiAgIChvbiBMaW51eCB3aXRoIGJhc2gpCi0KLSAgICBib3RoIHN0aXB1bGF0ZSB0aGF0IGFsbCBjb21wb25lbnRzIHNob3VsZCBoYXZlIGxldmVsIDIsIGV4Y2VwdCBmb3IKLSAgICB0aGUgbWVtb3J5IGFuZCAgaW8gY29tcG9uZW50cyB3aGljaCB3aWxsIGJlIHNldCAgdG8gdHJhY2UgbGV2ZWxzIDUKLSAgICBhbmQgNCwgcmVzcGVjdGl2ZWx5LgotCi0KLSAgRlQyX0RFQlVHX01FTU9SWQotCi0gICAgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgIHdoZW4gZGVmaW5lZCwgdGVsbHMgRnJlZVR5cGUgIHRvIHVzZSBhCi0gICAgZGVidWdnaW5nIG1lbW9yeSBtYW5hZ2VyIHRoYXQgd2lsbCAgdHJhY2sgbGVha2luZyBtZW1vcnkgYmxvY2tzIGFzCi0gICAgd2VsbCBhcyBvdGhlciBjb21tb24gZXJyb3JzIGxpa2UgZG91YmxlIGZyZWVzLiAgSXQgaXMgYWxzbyBjYXBhYmxlCi0gICAgb2YgIHJlcG9ydGluZyBfd2hlcmVfICB0aGUgIGxlYWtpbmcgYmxvY2tzICB3ZXJlIGFsbG9jYXRlZCwgIHdoaWNoCi0gICAgY29uc2lkZXJhYmx5ICBzYXZlcyAgdGltZSAgd2hlbiAgZGVidWdnaW5nIG5ldyAgYWRkaXRpb25zICB0byAgdGhlCi0gICAgbGlicmFyeS4KLQotICAgIFRoaXMgIGNvZGUgIGlzIG9ubHkgIGNvbXBpbGVkICB3aGVuICBGcmVlVHlwZSAgaXMgYnVpbHQgIHdpdGggIHRoZQotICAgIEZUX0RFQlVHX01FTU9SWSBtYWNybyAjZGVmaW5lZCBpbiAgYGZ0b3B0aW9uLmgnIHRob3VnaCwgaXQgd2lsbCBiZQotICAgIGlnbm9yZWQgaW4gb3RoZXIgYnVpbGRzLgotCi0KLSAgRlQyX0FMTE9DX1RPVEFMX01BWAotCi0gICAgVGhpcyB2YXJpYWJsZSBpcyAgaWdub3JlZCBpZiBGVDJfREVCVUdfTUVNT1JZIGlzICBub3QgZGVmaW5lZC4gIEl0Ci0gICAgYWxsb3dzICB5b3UgIHRvICBzcGVjaWZ5ICBhICBtYXhpbXVtICBoZWFwICBzaXplICBmb3IgIGFsbCAgbWVtb3J5Ci0gICAgYWxsb2NhdGlvbnMgcGVyZm9ybWVkICBieSBGcmVlVHlwZS4gIFRoaXMgIGlzIHZlcnkgdXNlZnVsICB0byB0ZXN0Ci0gICAgdGhlIHJvYnVzdG5lc3MgIG9mIHRoZSAgZm9udCBlbmdpbmUgIGFuZCBwcm9ncmFtcyAgdGhhdCB1c2UgIGl0IGluCi0gICAgdGlnaHQgbWVtb3J5IGNvbmRpdGlvbnMuCi0KLSAgICBJZiBpdCBpcyB1bmRlZmluZWQsIG9yIGlmIGl0cyB2YWx1ZSBpcyBub3Qgc3RyaWN0bHkgcG9zaXRpdmUsIHRoZW4KLSAgICBubyBhbGxvY2F0aW9uIGJvdW5kcyBhcmUgY2hlY2tlZCBhdCBydW50aW1lLgotCi0KLSAgRlQyX0FMTE9DX0NPVU5UX01BWAotCi0gICAgVGhpcyB2YXJpYWJsZSBpcyAgaWdub3JlZCBpZiBGVDJfREVCVUdfTUVNT1JZIGlzICBub3QgZGVmaW5lZC4gIEl0Ci0gICAgYWxsb3dzICB5b3UgdG8gIHNwZWNpZnkgIGEgbWF4aW11bSAgbnVtYmVyICBvZiBtZW1vcnkgIGFsbG9jYXRpb25zCi0gICAgcGVyZm9ybWVkICAgIGJ5ICAgIEZyZWVUeXBlICAgIGJlZm9yZSAgICByZXR1cm5pbmcgICAgdGhlICAgIGVycm9yCi0gICAgRlRfRXJyX091dF9PZl9NZW1vcnkuICBUaGlzICBpcyB1c2VmdWwgIGZvciBkZWJ1Z2dpbmcgIGFuZCB0ZXN0aW5nCi0gICAgdGhlIGVuZ2luZSdzIHJvYnVzdG5lc3MuCi0KLSAgICBJZiBpdCBpcyB1bmRlZmluZWQsIG9yIGlmIGl0cyB2YWx1ZSBpcyBub3Qgc3RyaWN0bHkgcG9zaXRpdmUsIHRoZW4KLSAgICBubyBhbGxvY2F0aW9uIGJvdW5kcyBhcmUgY2hlY2tlZCBhdCBydW50aW1lLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDItMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzICBmaWxlIGlzICBwYXJ0ICBvZiB0aGUgIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSAgb25seSBiZSAgdXNlZCwKLW1vZGlmaWVkLCAgYW5kICBkaXN0cmlidXRlZCB1bmRlciAgdGhlICB0ZXJtcyAgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdAotbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nICB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzCi1maWxlICB5b3UgaW5kaWNhdGUgdGhhdCAgeW91IGhhdmUgIHJlYWQgdGhlICBsaWNlbnNlIGFuZCAgdW5kZXJzdGFuZCBhbmQKLWFjY2VwdCBpdCBmdWxseS4KLQotCi0tLS0gZW5kIG9mIERFQlVHIC0tLQpkaWZmIC0tZ2l0IGEvZG9jcy9GVEwuVFhUIGIvZG9jcy9GVEwuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzNhYjA2Li4wMDAwMDAwCi0tLSBhL2RvY3MvRlRMLlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgIFRoZSBGcmVlVHlwZSBQcm9qZWN0IExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwNi1KYW4tMjcKLQotICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgMTk5Ni0yMDAyLCAyMDA2IGJ5Ci0gICAgICAgICAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnCi0KLQotCi1JbnRyb2R1Y3Rpb24KLT09PT09PT09PT09PQotCi0gIFRoZSBGcmVlVHlwZSAgUHJvamVjdCBpcyBkaXN0cmlidXRlZCBpbiAgc2V2ZXJhbCBhcmNoaXZlIHBhY2thZ2VzOwotICBzb21lIG9mIHRoZW0gbWF5IGNvbnRhaW4sIGluIGFkZGl0aW9uIHRvIHRoZSBGcmVlVHlwZSBmb250IGVuZ2luZSwKLSAgdmFyaW91cyB0b29scyBhbmQgIGNvbnRyaWJ1dGlvbnMgd2hpY2ggcmVseSBvbiwgb3IgIHJlbGF0ZSB0bywgdGhlCi0gIEZyZWVUeXBlIFByb2plY3QuCi0KLSAgVGhpcyAgbGljZW5zZSBhcHBsaWVzICB0byBhbGwgIGZpbGVzIGZvdW5kICBpbiBzdWNoICBwYWNrYWdlcywgYW5kCi0gIHdoaWNoIGRvIG5vdCAgZmFsbCB1bmRlciB0aGVpciBvd24gZXhwbGljaXQgIGxpY2Vuc2UuICBUaGUgbGljZW5zZQotICBhZmZlY3RzICB0aHVzICB0aGUgIEZyZWVUeXBlICAgZm9udCAgZW5naW5lLCAgdGhlICB0ZXN0ICBwcm9ncmFtcywKLSAgZG9jdW1lbnRhdGlvbiBhbmQgbWFrZWZpbGVzLCBhdCB0aGUgdmVyeSBsZWFzdC4KLQotICBUaGlzICBsaWNlbnNlICAgd2FzICBpbnNwaXJlZCAgYnkgIHRoZSAgQlNELCAgIEFydGlzdGljLCAgYW5kICBJSkcKLSAgKEluZGVwZW5kZW50IEpQRUcgIEdyb3VwKSBsaWNlbnNlcywgd2hpY2ggIGFsbCBlbmNvdXJhZ2UgaW5jbHVzaW9uCi0gIGFuZCAgdXNlIG9mICBmcmVlICBzb2Z0d2FyZSBpbiAgY29tbWVyY2lhbCAgYW5kIGZyZWV3YXJlICBwcm9kdWN0cwotICBhbGlrZS4gIEFzIGEgY29uc2VxdWVuY2UsIGl0cyBtYWluIHBvaW50cyBhcmUgdGhhdDoKLQotICAgIG8gV2UgZG9uJ3QgcHJvbWlzZSB0aGF0IHRoaXMgc29mdHdhcmUgd29ya3MuIEhvd2V2ZXIsIHdlIHdpbGwgYmUKLSAgICAgIGludGVyZXN0ZWQgaW4gYW55IGtpbmQgb2YgYnVnIHJlcG9ydHMuIChgYXMgaXMnIGRpc3RyaWJ1dGlvbikKLQotICAgIG8gWW91IGNhbiAgdXNlIHRoaXMgc29mdHdhcmUgZm9yIHdoYXRldmVyIHlvdSAgd2FudCwgaW4gcGFydHMgb3IKLSAgICAgIGZ1bGwgZm9ybSwgd2l0aG91dCBoYXZpbmcgdG8gcGF5IHVzLiAoYHJveWFsdHktZnJlZScgdXNhZ2UpCi0KLSAgICBvIFlvdSBtYXkgbm90IHByZXRlbmQgdGhhdCAgeW91IHdyb3RlIHRoaXMgc29mdHdhcmUuICBJZiB5b3UgdXNlCi0gICAgICBpdCwgb3IgIG9ubHkgcGFydHMgb2YgaXQsICBpbiBhIHByb2dyYW0sICB5b3UgbXVzdCBhY2tub3dsZWRnZQotICAgICAgc29tZXdoZXJlICBpbiAgeW91ciAgZG9jdW1lbnRhdGlvbiAgdGhhdCAgeW91ICBoYXZlICB1c2VkICB0aGUKLSAgICAgIEZyZWVUeXBlIGNvZGUuIChgY3JlZGl0cycpCi0KLSAgV2UgIHNwZWNpZmljYWxseSAgcGVybWl0ICBhbmQgIGVuY291cmFnZSAgdGhlICBpbmNsdXNpb24gIG9mICB0aGlzCi0gIHNvZnR3YXJlLCB3aXRoICBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsICBpbiBjb21tZXJjaWFsIHByb2R1Y3RzLgotICBXZSAgZGlzY2xhaW0gIGFsbCB3YXJyYW50aWVzICBjb3ZlcmluZyAgVGhlICBGcmVlVHlwZSBQcm9qZWN0ICBhbmQKLSAgYXNzdW1lIG5vIGxpYWJpbGl0eSByZWxhdGVkIHRvIFRoZSBGcmVlVHlwZSBQcm9qZWN0LgotCi0KLSAgRmluYWxseSwgIG1hbnkgIHBlb3BsZSAgYXNrZWQgIHVzICBmb3IgIGEgIHByZWZlcnJlZCAgZm9ybSAgZm9yICBhCi0gIGNyZWRpdC9kaXNjbGFpbWVyIHRvIHVzZSBpbiBjb21wbGlhbmNlIHdpdGggdGhpcyBsaWNlbnNlLiAgV2UgdGh1cwotICBlbmNvdXJhZ2UgeW91IHRvIHVzZSB0aGUgZm9sbG93aW5nIHRleHQ6Ci0KLSAgICIiIgotICAgIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGNvcHlyaWdodCDCqSA8eWVhcj4gVGhlIEZyZWVUeXBlCi0gICAgUHJvamVjdCAod3d3LmZyZWV0eXBlLm9yZykuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgIiIiCi0KLSAgUGxlYXNlIHJlcGxhY2UgPHllYXI+IHdpdGggdGhlIHZhbHVlIGZyb20gdGhlIEZyZWVUeXBlIHZlcnNpb24geW91Ci0gIGFjdHVhbGx5IHVzZS4KLQotCi1MZWdhbCBUZXJtcwotPT09PT09PT09PT0KLQotMC4gRGVmaW5pdGlvbnMKLS0tLS0tLS0tLS0tLS0tCi0KLSAgVGhyb3VnaG91dCB0aGlzIGxpY2Vuc2UsICB0aGUgdGVybXMgYHBhY2thZ2UnLCBgRnJlZVR5cGUgUHJvamVjdCcsCi0gIGFuZCAgYEZyZWVUeXBlICBhcmNoaXZlJyByZWZlciAgdG8gIHRoZSAgc2V0ICBvZiBmaWxlcyAgb3JpZ2luYWxseQotICBkaXN0cmlidXRlZCAgYnkgdGhlICBhdXRob3JzICAoRGF2aWQgVHVybmVyLCAgUm9iZXJ0IFdpbGhlbG0sICBhbmQKLSAgV2VybmVyIExlbWJlcmcpIGFzIHRoZSBgRnJlZVR5cGUgUHJvamVjdCcsIGJlIHRoZXkgbmFtZWQgYXMgYWxwaGEsCi0gIGJldGEgb3IgZmluYWwgcmVsZWFzZS4KLQotICBgWW91JyByZWZlcnMgdG8gIHRoZSBsaWNlbnNlZSwgb3IgcGVyc29uIHVzaW5nICB0aGUgcHJvamVjdCwgd2hlcmUKLSAgYHVzaW5nJyBpcyBhIGdlbmVyaWMgdGVybSBpbmNsdWRpbmcgY29tcGlsaW5nIHRoZSBwcm9qZWN0J3Mgc291cmNlCi0gIGNvZGUgYXMgIHdlbGwgYXMgbGlua2luZyBpdCAgdG8gZm9ybSBhICBgcHJvZ3JhbScgb3IgYGV4ZWN1dGFibGUnLgotICBUaGlzICBwcm9ncmFtIGlzICByZWZlcnJlZCB0byAgYXMgIGBhIHByb2dyYW0gIHVzaW5nIHRoZSAgRnJlZVR5cGUKLSAgZW5naW5lJy4KLQotICBUaGlzICBsaWNlbnNlIGFwcGxpZXMgIHRvIGFsbCAgZmlsZXMgZGlzdHJpYnV0ZWQgIGluICB0aGUgb3JpZ2luYWwKLSAgRnJlZVR5cGUgIFByb2plY3QsICAgaW5jbHVkaW5nICBhbGwgIHNvdXJjZSAgIGNvZGUsICBiaW5hcmllcyAgYW5kCi0gIGRvY3VtZW50YXRpb24sICB1bmxlc3MgIG90aGVyd2lzZSAgc3RhdGVkICAgaW4gIHRoZSAgZmlsZSAgaW4gIGl0cwotICBvcmlnaW5hbCwgdW5tb2RpZmllZCBmb3JtIGFzICBkaXN0cmlidXRlZCBpbiB0aGUgb3JpZ2luYWwgYXJjaGl2ZS4KLSAgSWYgeW91IGFyZSAgdW5zdXJlIHdoZXRoZXIgb3Igbm90IGEgcGFydGljdWxhciAgZmlsZSBpcyBjb3ZlcmVkIGJ5Ci0gIHRoaXMgbGljZW5zZSwgeW91IG11c3QgY29udGFjdCB1cyB0byB2ZXJpZnkgdGhpcy4KLQotICBUaGUgRnJlZVR5cGUgIFByb2plY3QgaXMgY29weXJpZ2h0IChDKSAxOTk2LTIwMDAgIGJ5IERhdmlkIFR1cm5lciwKLSAgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQgZXhjZXB0IGFzCi0gIHNwZWNpZmllZCBiZWxvdy4KLQotMS4gTm8gV2FycmFudHkKLS0tLS0tLS0tLS0tLS0tCi0KLSAgVEhFIEZSRUVUWVBFIFBST0pFQ1QgIElTIFBST1ZJREVEIGBBUyBJUycgV0lUSE9VVCAgV0FSUkFOVFkgT0YgQU5ZCi0gIEtJTkQsIEVJVEhFUiAgRVhQUkVTUyBPUiBJTVBMSUVELCAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEIFRPLAotICBXQVJSQU5USUVTICBPRiAgTUVSQ0hBTlRBQklMSVRZICAgQU5EICBGSVRORVNTICBGT1IgIEEgIFBBUlRJQ1VMQVIKLSAgUFVSUE9TRS4gIElOIE5PIEVWRU5UIFdJTEwgQU5ZIE9GIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCi0gIEJFIExJQUJMRSAgRk9SIEFOWSBEQU1BR0VTIENBVVNFRCAgQlkgVEhFIFVTRSBPUiAgVEhFIElOQUJJTElUWSBUTwotICBVU0UsIE9GIFRIRSBGUkVFVFlQRSBQUk9KRUNULgotCi0yLiBSZWRpc3RyaWJ1dGlvbgotLS0tLS0tLS0tLS0tLS0tLS0KLQotICBUaGlzICBsaWNlbnNlICBncmFudHMgIGEgIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlLCAgcGVycGV0dWFsICBhbmQKLSAgaXJyZXZvY2FibGUgcmlnaHQgIGFuZCBsaWNlbnNlIHRvIHVzZSwgIGV4ZWN1dGUsIHBlcmZvcm0sIGNvbXBpbGUsCi0gIGRpc3BsYXksICBjb3B5LCAgIGNyZWF0ZSAgZGVyaXZhdGl2ZSAgd29ya3MgICBvZiwgIGRpc3RyaWJ1dGUgIGFuZAotICBzdWJsaWNlbnNlIHRoZSAgRnJlZVR5cGUgUHJvamVjdCAoaW4gIGJvdGggc291cmNlIGFuZCAgb2JqZWN0IGNvZGUKLSAgZm9ybXMpICBhbmQgIGRlcml2YXRpdmUgd29ya3MgIHRoZXJlb2YgIGZvciAgYW55ICBwdXJwb3NlOyBhbmQgIHRvCi0gIGF1dGhvcml6ZSBvdGhlcnMgIHRvIGV4ZXJjaXNlICBzb21lIG9yIGFsbCAgb2YgdGhlICByaWdodHMgZ3JhbnRlZAotICBoZXJlaW4sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgbyBSZWRpc3RyaWJ1dGlvbiBvZiAgc291cmNlIGNvZGUgIG11c3QgcmV0YWluIHRoaXMgIGxpY2Vuc2UgZmlsZQotICAgICAgKGBGVEwuVFhUJykgdW5hbHRlcmVkOyBhbnkgIGFkZGl0aW9ucywgZGVsZXRpb25zIG9yIGNoYW5nZXMgdG8KLSAgICAgIHRoZSBvcmlnaW5hbCAgZmlsZXMgbXVzdCBiZSBjbGVhcmx5ICBpbmRpY2F0ZWQgaW4gYWNjb21wYW55aW5nCi0gICAgICBkb2N1bWVudGF0aW9uLiAgIFRoZSAgY29weXJpZ2h0ICAgbm90aWNlcyAgb2YgIHRoZSAgdW5hbHRlcmVkLAotICAgICAgb3JpZ2luYWwgIGZpbGVzIG11c3QgIGJlICBwcmVzZXJ2ZWQgaW4gIGFsbCAgY29waWVzIG9mICBzb3VyY2UKLSAgICAgIGZpbGVzLgotCi0gICAgbyBSZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHByb3ZpZGUgYSAgZGlzY2xhaW1lciAgdGhhdAotICAgICAgc3RhdGVzICB0aGF0ICB0aGUgc29mdHdhcmUgaXMgYmFzZWQgaW4gcGFydCBvZiB0aGUgd29yayBvZiB0aGUKLSAgICAgIEZyZWVUeXBlIFRlYW0sICBpbiAgdGhlICBkaXN0cmlidXRpb24gIGRvY3VtZW50YXRpb24uICBXZSBhbHNvCi0gICAgICBlbmNvdXJhZ2UgeW91IHRvIHB1dCBhbiBVUkwgdG8gdGhlIEZyZWVUeXBlIHdlYiBwYWdlICBpbiAgeW91cgotICAgICAgZG9jdW1lbnRhdGlvbiwgdGhvdWdoIHRoaXMgaXNuJ3QgbWFuZGF0b3J5LgotCi0gIFRoZXNlIGNvbmRpdGlvbnMgIGFwcGx5IHRvIGFueSAgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yICBiYXNlZCBvbgotICB0aGUgRnJlZVR5cGUgUHJvamVjdCwgIG5vdCBqdXN0IHRoZSB1bm1vZGlmaWVkIGZpbGVzLiAgIElmIHlvdSB1c2UKLSAgb3VyIHdvcmssIHlvdSAgbXVzdCBhY2tub3dsZWRnZSB1cy4gIEhvd2V2ZXIsIG5vICBmZWUgbmVlZCBiZSBwYWlkCi0gIHRvIHVzLgotCi0zLiBBZHZlcnRpc2luZwotLS0tLS0tLS0tLS0tLS0KLQotICBOZWl0aGVyIHRoZSAgRnJlZVR5cGUgYXV0aG9ycyBhbmQgIGNvbnRyaWJ1dG9ycyBub3IgeW91ICBzaGFsbCB1c2UKLSAgdGhlIG5hbWUgb2YgdGhlICBvdGhlciBmb3IgY29tbWVyY2lhbCwgYWR2ZXJ0aXNpbmcsIG9yIHByb21vdGlvbmFsCi0gIHB1cnBvc2VzIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0gIFdlIHN1Z2dlc3QsICBidXQgZG8gbm90IHJlcXVpcmUsIHRoYXQgIHlvdSB1c2Ugb25lIG9yICBtb3JlIG9mIHRoZQotICBmb2xsb3dpbmcgcGhyYXNlcyB0byByZWZlciAgdG8gdGhpcyBzb2Z0d2FyZSBpbiB5b3VyIGRvY3VtZW50YXRpb24KLSAgb3IgYWR2ZXJ0aXNpbmcgIG1hdGVyaWFsczogYEZyZWVUeXBlIFByb2plY3QnLCAgYEZyZWVUeXBlIEVuZ2luZScsCi0gIGBGcmVlVHlwZSBsaWJyYXJ5Jywgb3IgYEZyZWVUeXBlIERpc3RyaWJ1dGlvbicuCi0KLSAgQXMgIHlvdSBoYXZlICBub3Qgc2lnbmVkICB0aGlzIGxpY2Vuc2UsICB5b3UgYXJlICBub3QgIHJlcXVpcmVkIHRvCi0gIGFjY2VwdCAgaXQuICAgSG93ZXZlciwgIGFzICB0aGUgRnJlZVR5cGUgIFByb2plY3QgIGlzICBjb3B5cmlnaHRlZAotICBtYXRlcmlhbCwgb25seSAgdGhpcyBsaWNlbnNlLCBvciAgYW5vdGhlciBvbmUgY29udHJhY3RlZCAgd2l0aCB0aGUKLSAgYXV0aG9ycywgZ3JhbnRzIHlvdSAgdGhlIHJpZ2h0IHRvIHVzZSwgZGlzdHJpYnV0ZSwgIGFuZCBtb2RpZnkgaXQuCi0gIFRoZXJlZm9yZSwgIGJ5ICB1c2luZywgIGRpc3RyaWJ1dGluZywgIG9yIG1vZGlmeWluZyAgdGhlICBGcmVlVHlwZQotICBQcm9qZWN0LCB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGFsbCB0aGUgdGVybXMKLSAgb2YgdGhpcyBsaWNlbnNlLgotCi00LiBDb250YWN0cwotLS0tLS0tLS0tLS0KLQotICBUaGVyZSBhcmUgdHdvIG1haWxpbmcgbGlzdHMgcmVsYXRlZCB0byBGcmVlVHlwZToKLQotICAgIG8gZnJlZXR5cGVAbm9uZ251Lm9yZwotCi0gICAgICBEaXNjdXNzZXMgZ2VuZXJhbCB1c2UgYW5kIGFwcGxpY2F0aW9ucyBvZiBGcmVlVHlwZSwgYXMgd2VsbCBhcwotICAgICAgZnV0dXJlIGFuZCAgd2FudGVkIGFkZGl0aW9ucyB0byB0aGUgIGxpYnJhcnkgYW5kIGRpc3RyaWJ1dGlvbi4KLSAgICAgIElmICB5b3UgYXJlIGxvb2tpbmcgIGZvciBzdXBwb3J0LCAgc3RhcnQgaW4gIHRoaXMgbGlzdCAgaWYgeW91Ci0gICAgICBoYXZlbid0IGZvdW5kIGFueXRoaW5nIHRvIGhlbHAgeW91IGluIHRoZSBkb2N1bWVudGF0aW9uLgotCi0gICAgbyBmcmVldHlwZS1kZXZlbEBub25nbnUub3JnCi0KLSAgICAgIERpc2N1c3NlcyBidWdzLCAgYXMgd2VsbCAgYXMgZW5naW5lIGludGVybmFscywgIGRlc2lnbiBpc3N1ZXMsCi0gICAgICBzcGVjaWZpYyBsaWNlbnNlcywgcG9ydGluZywgZXRjLgotCi0gIE91ciBob21lIHBhZ2UgY2FuIGJlIGZvdW5kIGF0Ci0KLSAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZwotCi0KLS0tLSBlbmQgb2YgRlRMLlRYVCAtLS0KZGlmZiAtLWdpdCBhL2RvY3MvR1BMdjIuVFhUIGIvZG9jcy9HUEx2Mi5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmU3YjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9HUEx2Mi5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciAgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RvY3MvSU5TVEFMTCBiL2RvY3MvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlYzBkOC4uMDAwMDAwMAotLS0gYS9kb2NzL0lOU1RBTEwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0KLVRoZXJlIGFyZSAgc2V2ZXJhbCB3YXlzICB0byBidWlsZCB0aGUgIEZyZWVUeXBlIGxpYnJhcnksICBkZXBlbmRpbmcgb24KLXlvdXIgc3lzdGVtIGFuZCB0aGUgbGV2ZWwgb2YgIGN1c3RvbWl6YXRpb24geW91IG5lZWQuICBIZXJlIGlzIGEgc2hvcnQKLW92ZXJ2aWV3IG9mIHRoZSBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZToKLQotCi1JLiBOb3JtYWwgaW5zdGFsbGF0aW9uIGFuZCB1cGdyYWRlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAxLiBVbml4IFN5c3RlbXMgKGluY2x1ZGluZyBNYWMgT1MgWCwgQ3lnd2luLCBhbmQgTVN5cyBvbiBXaW5kb3dzKQotCi0gICAgUGxlYXNlIHJlYWQgYElOU1RBTEwuVU5JWCcgdG8gaW5zdGFsbCBvciB1cGdyYWRlIEZyZWVUeXBlICAyIG9uICBhCi0gICAgVW5peCBzeXN0ZW0uICAgTm90ZSAgdGhhdCAgeW91ICAqbmVlZCogIEdOVSAgTWFrZSAgIGZvciAgYXV0b21hdGljCi0gICAgY29tcGlsYXRpb24sICBzaW5jZSBvdGhlciBtYWtlIHRvb2xzIHdvbid0IHdvcmsgKHRoaXMgaW5jbHVkZXMgQlNECi0gICAgTWFrZSkuCi0KLSAgICBHTlUgTWFrZSBWRVJTSU9OIDMuODAgT1IgTkVXRVIgSVMgTkVFREVEIQotCi0gICAgW0ZvciBgY21ha2UnIHNlZSBiZWxvdy5dCi0KLQotICAyLiBPbiBWTVMgd2l0aCB0aGUgYG1tcycgYnVpbGQgdG9vbAotCi0gICAgU2VlIGBJTlNUQUxMLlZNUycgZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgb24gdGhpcyBwbGF0Zm9ybS4KLQotCi0gIDMuIE90aGVyIHN5c3RlbXMgdXNpbmcgR05VIE1ha2UKLQotICAgIE9uIG5vbi1Vbml4IHBsYXRmb3JtcywgIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkICB0aGUgbGlicmFyeSB1c2luZwotICAgIEdOVSBNYWtlICB1dGlsaXR5LiAgTm90ZSB0aGF0ICAqTk8gT1RIRVIgTUFLRSBUT09MICBXSUxMIFdPUksqWzFdIQotICAgIFRoaXMgIG1ldGhvZHMgc3VwcG9ydHMgIHNldmVyYWwgIGNvbXBpbGVycyBvbiAgV2luZG93cywgT1MvMiwgIGFuZAotICAgIEJlT1MsIGluY2x1ZGluZyBNaW5HVywgVmlzdWFsIEMrKywgQm9ybGFuZCBDKyssIGFuZCBtb3JlLgotCi0gICAgSW5zdHJ1Y3Rpb25zIGFyZSBwcm92aWRlZCBpbiB0aGUgZmlsZSBgSU5TVEFMTC5HTlUnLgotCi0KLSAgNC4gV2l0aCBhbiBJREUgUHJvamVjdCBGaWxlIChlLmcuLCBmb3IgVmlzdWFsIFN0dWRpbyBvciBDb2RlV2FycmlvcikKLQotICAgIFdlIHByb3ZpZGUgYSAgc21hbGwgbnVtYmVyIG9mIGBwcm9qZWN0IGZpbGVzJyAgZm9yIHZhcmlvdXMgSURFcyB0bwotICAgIGF1dG9tYXRpY2FsbHkgYnVpbGQgIHRoZSBsaWJyYXJ5IGFzICB3ZWxsLiAgTm90ZSB0aGF0ICB0aGVzZSBmaWxlcwotICAgIGFyZSAgbm90IHN1cHBvcnRlZCAgYW5kIG9ubHkgIHNwb3JhZGljYWxseSBtYWludGFpbmVkICBieSBGcmVlVHlwZQotICAgIGRldmVsb3BlcnMsIHNvIGRvbid0IGV4cGVjdCB0aGVtIHRvIHdvcmsgaW4gZWFjaCByZWxlYXNlLgotCi0gICAgVG8gZmluZCB0aGVtLCBoYXZlIGEgIGxvb2sgYXQgdGhlIGNvbnRlbnQgb2YgdGhlIGBidWlsZHMvPHN5c3RlbT4nCi0gICAgZGlyZWN0b3J5LCB3aGVyZSA8c3lzdGVtPiBzdGFuZHMgZm9yIHlvdXIgT1Mgb3IgZW52aXJvbm1lbnQuCi0KLQotICA1LiBVc2luZyBjbWFrZQotCi0gICAgU2VlIHRoZSB0b3AtbGV2ZWwgYENNYWtlTGlzdHMudHh0JyBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0KLSAgNi4gRnJvbSB5b3Ugb3duIElERSwgb3Igb3duIE1ha2VmaWxlcwotCi0gICAgSWYgIHlvdSAgd2FudCAgdG8gIGNyZWF0ZSAgIHlvdXIgIG93biAgcHJvamVjdCAgZmlsZSwgIGZvbGxvdyAgdGhlCi0gICAgaW5zdHJ1Y3Rpb25zICAgZ2l2ZW4gIGluICB0aGUgICBgSU5TVEFMTC5BTlknICBkb2N1bWVudCAgIG9mICB0aGlzCi0gICAgZGlyZWN0b3J5LgotCi0KLUlJLiBDdXN0b20gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIEN1c3RvbWl6aW5nIHRoZSBjb21waWxhdGlvbiAgb2YgRnJlZVR5cGUgaXMgZWFzeSwgYW5kICBhbGxvd3MgeW91IHRvCi0gIHNlbGVjdCBvbmx5IHRoZSBjb21wb25lbnRzIG9mICB0aGUgZm9udCBlbmdpbmUgdGhhdCB5b3UgcmVhbGx5IG5lZWQuCi0gIEZvciBtb3JlIGRldGFpbHMgcmVhZCB0aGUgZmlsZSBgQ1VTVE9NSVpFJy4KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVsxXSBtYWtlKyssIGEgbWFrZSB0b29sIHdyaXR0ZW4gaW4gUGVybCwgaGFzIHN1ZmZpY2llbnQgc3VwcG9ydCBvZiBHTlUKLSAgICBtYWtlIGV4dGVuc2lvbnMgdG8gYnVpbGQgRnJlZVR5cGUuICBTZWUKLQotICAgICAgaHR0cDovL21ha2VwcC5zb3VyY2Vmb3JnZS5uZXQKLQotICAgIGZvciBtb3JlIGluZm9ybWF0aW9uOyB5b3UgbmVlZCB2ZXJzaW9uIDEuMTkgb3IgbmV3ZXIsIGFuZCB5b3UgbXVzdAotICAgIHBhc3Mgb3B0aW9uIGAtLW5vcmMtc3Vic3RpdHV0aW9uJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAwMC0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgIGZpbGUgaXMgIHBhcnQgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdCwgYW5kICBtYXkgb25seSAgYmUgdXNlZCwKLW1vZGlmaWVkLCAgYW5kIGRpc3RyaWJ1dGVkICB1bmRlciB0aGUgIHRlcm1zIG9mICB0aGUgIEZyZWVUeXBlIHByb2plY3QKLWxpY2Vuc2UsICBMSUNFTlNFLlRYVC4gIEJ5ICBjb250aW51aW5nIHRvICB1c2UsIG1vZGlmeSwgIG9yIGRpc3RyaWJ1dGUKLXRoaXMgZmlsZSB5b3UgIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCAgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQKLWFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLQotLS0tIGVuZCBvZiBJTlNUQUxMIC0tLQpkaWZmIC0tZ2l0IGEvZG9jcy9JTlNUQUxMLkFOWSBiL2RvY3MvSU5TVEFMTC5BTlkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjk1NzguLjAwMDAwMDAKLS0tIGEvZG9jcy9JTlNUQUxMLkFOWQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi1JbnN0cnVjdGlvbnMgb24gaG93IHRvIGJ1aWxkIEZyZWVUeXBlIHdpdGggeW91ciBvd24gYnVpbGQgdG9vbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU2VlICB0aGUgIGZpbGUgYENVU1RPTUlaRScgIHRvICBsZWFybiAgaG93ICB0byBjdXN0b21pemUgIEZyZWVUeXBlICB0bwotc3BlY2lmaWMgZW52aXJvbm1lbnRzLgotCi0KLUkuIFN0YW5kYXJkIHByb2NlZHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgKiBESVNBQkxFIFBSRS1DT01QSUxFRCAgSEVBREVSUyEgIFRoaXMgaXMgdmVyeSAgaW1wb3J0YW50IGZvciBWaXN1YWwKLSAgICBDKyssIGJlY2F1c2UgRnJlZVR5cGUgdXNlcyBsaW5lcyBsaWtlOgotCi0gICAgICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSAgICB3aGljaCBhcmUgbm90IGNvcnJlY3RseSBzdXBwb3J0ZWQgYnkgdGhpcyBjb21waWxlciB3aGlsZSBiZWluZyBJU08KLSAgICBDIGNvbXBsaWFudCEKLQotICAqIFlvdSBuZWVkIHRvIGFkZCB0aGUgZGlyZWN0b3J5IGBpbmNsdWRlJyB0byB5b3VyICBpbmNsdWRlIHBhdGggd2hlbgotICAgIGNvbXBpbGluZyB0aGUgbGlicmFyeS4KLQotICAqIEZyZWVUeXBlIDIgaXMgbWFkZSBvZiAgc2V2ZXJhbCBjb21wb25lbnRzOyBlYWNoIG9mIHRoZW0gaXMgbG9jYXRlZAotICAgIGluICAgIGEgICBzdWJkaXJlY3RvcnkgICAgb2YgICBgZnJlZXR5cGUyL3NyYycuICAgICBGb3IgICBleGFtcGxlLAotICAgIGBmcmVldHlwZTIvc3JjL3RydWV0eXBlLycgY29udGFpbnMgdGhlIFRydWVUeXBlIGZvbnQgZHJpdmVyLgotCi0gICogRE8gTk9UIENPTVBJTEUgQUxMIEMgRklMRVMhICBSYXRoZXIsIGNvbXBpbGUgdGhlIGZvbGxvd2luZyBvbmVzLgotCi0gICAgLS0gYmFzZSBjb21wb25lbnRzIChyZXF1aXJlZCkKLQotICAgICAgc3JjL2Jhc2UvZnRzeXN0ZW0uYwotICAgICAgc3JjL2Jhc2UvZnRpbml0LmMKLSAgICAgIHNyYy9iYXNlL2Z0ZGVidWcuYwotCi0gICAgICBzcmMvYmFzZS9mdGJhc2UuYwotCi0gICAgICBzcmMvYmFzZS9mdGJib3guYyAgICAgICAtLSByZWNvbW1lbmRlZCwgc2VlIDxmdGJib3guaD4KLSAgICAgIHNyYy9iYXNlL2Z0Z2x5cGguYyAgICAgIC0tIHJlY29tbWVuZGVkLCBzZWUgPGZ0Z2x5cGguaD4KLQotICAgICAgc3JjL2Jhc2UvZnRiZGYuYyAgICAgICAgLS0gb3B0aW9uYWwsIHNlZSA8ZnRiZGYuaD4KLSAgICAgIHNyYy9iYXNlL2Z0Yml0bWFwLmMgICAgIC0tIG9wdGlvbmFsLCBzZWUgPGZ0Yml0bWFwLmg+Ci0gICAgICBzcmMvYmFzZS9mdGNpZC5jICAgICAgICAtLSBvcHRpb25hbCwgc2VlIDxmdGNpZC5oPgotICAgICAgc3JjL2Jhc2UvZnRmbnRmbXQuYyAgICAgLS0gb3B0aW9uYWwsIHNlZSA8ZnRmbnRmbXQuaD4KLSAgICAgIHNyYy9iYXNlL2Z0ZnN0eXBlLmMgICAgIC0tIG9wdGlvbmFsCi0gICAgICBzcmMvYmFzZS9mdGdhc3AuYyAgICAgICAtLSBvcHRpb25hbCwgc2VlIDxmdGdhc3AuaD4KLSAgICAgIHNyYy9iYXNlL2Z0Z3h2YWwuYyAgICAgIC0tIG9wdGlvbmFsLCBzZWUgPGZ0Z3h2YWwuaD4KLSAgICAgIHNyYy9iYXNlL2Z0bGNkZmlsLmMgICAgIC0tIG9wdGlvbmFsLCBzZWUgPGZ0bGNkZmlsLmg+Ci0gICAgICBzcmMvYmFzZS9mdG1tLmMgICAgICAgICAtLSBvcHRpb25hbCwgc2VlIDxmdG1tLmg+Ci0gICAgICBzcmMvYmFzZS9mdG90dmFsLmMgICAgICAtLSBvcHRpb25hbCwgc2VlIDxmdG90dmFsLmg+Ci0gICAgICBzcmMvYmFzZS9mdHBhdGVudC5jICAgICAtLSBvcHRpb25hbAotICAgICAgc3JjL2Jhc2UvZnRwZnIuYyAgICAgICAgLS0gb3B0aW9uYWwsIHNlZSA8ZnRwZnIuaD4KLSAgICAgIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgICAgIC0tIG9wdGlvbmFsLCBzZWUgPGZ0c3Ryb2tlLmg+Ci0gICAgICBzcmMvYmFzZS9mdHN5bnRoLmMgICAgICAtLSBvcHRpb25hbCwgc2VlIDxmdHN5bnRoLmg+Ci0gICAgICBzcmMvYmFzZS9mdHR5cGUxLmMgICAgICAtLSBvcHRpb25hbCwgc2VlIDx0MXRhYmxlcy5oPgotICAgICAgc3JjL2Jhc2UvZnR3aW5mbnQuYyAgICAgLS0gb3B0aW9uYWwsIHNlZSA8ZnR3aW5mbnQuaD4KLQotICAgICAgc3JjL2Jhc2UvZnRtYWMuYyAgICAgICAgLS0gb25seSBvbiB0aGUgTWFjaW50b3NoCi0KLSAgICAtLSBmb250IGRyaXZlcnMgKG9wdGlvbmFsOyBhdCBsZWFzdCBvbmUgaXMgbmVlZGVkKQotCi0gICAgICBzcmMvYmRmL2JkZi5jICAgICAgICAgICAtLSBCREYgZm9udCBkcml2ZXIKLSAgICAgIHNyYy9jZmYvY2ZmLmMgICAgICAgICAgIC0tIENGRi9PcGVuVHlwZSBmb250IGRyaXZlcgotICAgICAgc3JjL2NpZC90eXBlMWNpZC5jICAgICAgLS0gVHlwZSAxIENJRC1rZXllZCBmb250IGRyaXZlcgotICAgICAgc3JjL3BjZi9wY2YuYyAgICAgICAgICAgLS0gUENGIGZvbnQgZHJpdmVyCi0gICAgICBzcmMvcGZyL3Bmci5jICAgICAgICAgICAtLSBQRlIvVHJ1ZURvYyBmb250IGRyaXZlcgotICAgICAgc3JjL3NmbnQvc2ZudC5jICAgICAgICAgLS0gU0ZOVCBmaWxlcyBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHJ1ZVR5cGUgJiBPcGVuVHlwZSkKLSAgICAgIHNyYy90cnVldHlwZS90cnVldHlwZS5jIC0tIFRydWVUeXBlIGZvbnQgZHJpdmVyCi0gICAgICBzcmMvdHlwZTEvdHlwZTEuYyAgICAgICAtLSBUeXBlIDEgZm9udCBkcml2ZXIKLSAgICAgIHNyYy90eXBlNDIvdHlwZTQyLmMgICAgIC0tIFR5cGUgNDIgZm9udCBkcml2ZXIKLSAgICAgIHNyYy93aW5mb250cy93aW5mbnQuYyAgIC0tIFdpbmRvd3MgRk9OVCAvIEZOVCBmb250IGRyaXZlcgotCi0gICAgLS0gcmFzdGVyaXplcnMgKG9wdGlvbmFsOyBhdCBsZWFzdCBvbmUgaXMgbmVlZGVkIGZvciB2ZWN0b3IKLSAgICAgICBmb3JtYXRzKQotCi0gICAgICBzcmMvcmFzdGVyL3Jhc3Rlci5jICAgICAtLSBtb25vY2hyb21lIHJhc3Rlcml6ZXIKLSAgICAgIHNyYy9zbW9vdGgvc21vb3RoLmMgICAgIC0tIGFudGktYWxpYXNpbmcgcmFzdGVyaXplcgotCi0gICAgLS0gYXV4aWxpYXJ5IG1vZHVsZXMgKG9wdGlvbmFsKQotCi0gICAgICBzcmMvYXV0b2ZpdC9hdXRvZml0LmMgICAtLSBhdXRvIGhpbnRpbmcgbW9kdWxlCi0gICAgICBzcmMvY2FjaGUvZnRjYWNoZS5jICAgICAtLSBjYWNoZSBzdWItc3lzdGVtIChpbiBiZXRhKQotICAgICAgc3JjL2d6aXAvZnRnemlwLmMgICAgICAgLS0gc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBmb250cyAoLmd6KQotICAgICAgc3JjL2x6dy9mdGx6dy5jICAgICAgICAgLS0gc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBmb250cyAoLlopCi0gICAgICBzcmMvYnppcDIvZnRiemlwMi5jICAgICAtLSBzdXBwb3J0IGZvciBjb21wcmVzc2VkIGZvbnRzICguYnoyKQotICAgICAgc3JjL2d4dmFsaWQvZ3h2YWxpZC5jICAgLS0gVHJ1ZVR5cGVHWC9BQVQgdGFibGUgdmFsaWRhdGlvbgotICAgICAgc3JjL290dmFsaWQvb3R2YWxpZC5jICAgLS0gT3BlblR5cGUgdGFibGUgdmFsaWRhdGlvbgotICAgICAgc3JjL3BzYXV4L3BzYXV4LmMgICAgICAgLS0gUG9zdFNjcmlwdCBUeXBlIDEgcGFyc2luZwotICAgICAgc3JjL3BzaGludGVyL3BzaGludGVyLmMgLS0gUFMgaGludGluZyBtb2R1bGUKLSAgICAgIHNyYy9wc25hbWVzL3BzbmFtZXMuYyAgIC0tIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMgc3VwcG9ydAotCi0KLSAgICBOb3RlczoKLQotICAgICAgYGZ0Y2FjaGUuYycgIG5lZWRzIGBmdGdseXBoLmMnCi0gICAgICBgZnRmc3R5cGUuYycgbmVlZHMgYGZ0dHlwZTEuYycKLSAgICAgIGBmdGdseXBoLmMnICBuZWVkcyBgZnRiaXRtYXAuYycKLSAgICAgIGBmdHN0cm9rZS5jJyBuZWVkcyBgZnRnbHlwaC5jJwotICAgICAgYGZ0c3ludGguYycgIG5lZWRzIGBmdGJpdG1hcC5jJwotCi0gICAgICBgY2ZmLmMnICAgICAgbmVlZHMgYHNmbnQuYycsIGBwc2hpbnRlci5jJywgYW5kIGBwc25hbWVzLmMnCi0gICAgICBgdHJ1ZXR5cGUuYycgbmVlZHMgYHNmbnQuYycgYW5kIGBwc25hbWVzLmMnCi0gICAgICBgdHlwZTEuYycgICAgbmVlZHMgYHBzYXV4LmMnIGBwc2hpbnRlci5jJywgYW5kIGBwc25hbWVzLmMnCi0gICAgICBgdHlwZTFjaWQuYycgbmVlZHMgYHBzYXV4LmMnLCBgcHNoaW50ZXIuYycsIGFuZCBgcHNuYW1lcy5jJwotICAgICAgYHR5cGU0Mi5jJyAgIG5lZWRzIGB0cnVldHlwZS5jJwotCi0gICAgICBQbGVhc2UgY29uc3VsdCB0aGUgY2VudHJhbCAgYGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgnCi0gICAgICBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGRldGFpbHMgb24gYWRkaXRpb25hbCBsaWJyYXJpZXMgbmVjZXNzYXJ5Ci0gICAgICBmb3Igc29tZSBvcHRpb25hbCBmZWF0dXJlcy4KLQotCi0gIFJlYWQgdGhlIGZpbGUgYENVU1RPTUlaRScgaW4gY2FzZSAgeW91IHdhbnQgdG8gY29tcGlsZSBvbmx5IGEgc3Vic2V0Ci0gIG9mICB0aGUgIGRyaXZlcnMsICByZW5kZXJlcnMsICAgYW5kICBvcHRpb25hbCAgbW9kdWxlczsgIGEgIGRldGFpbGVkCi0gIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzIGJhc2UgIGV4dGVuc2lvbiBpcyBnaXZlbiBpbiB0aGUgdG9wLWxldmVsCi0gIGZpbGUgYG1vZHVsZXMuY2ZnJy4KLQotICBZb3UgYXJlIGRvbmUuICBJbiBjYXNlIG9mIHByb2JsZW1zLCBzZWUgdGhlIGFyY2hpdmVzIG9mIHRoZSBGcmVlVHlwZQotICBkZXZlbG9wbWVudCBtYWlsaW5nIGxpc3QuCi0KLQotSUkuIFN1cHBvcnQgZm9yIGZsYXQtZGlyZWN0b3J5IGNvbXBpbGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBJdCBpcyAgcG9zc2libGUgdG8gIHB1dCBhbGwgIEZyZWVUeXBlIDIgc291cmNlICBmaWxlcyBpbnRvICBhIHNpbmdsZQotICBkaXJlY3RvcnksIHdpdGggdGhlICpleGNlcHRpb24qIG9mIHRoZSBgaW5jbHVkZScgaGllcmFyY2h5LgotCi0gIDEuIENvcHkgYWxsIGZpbGVzIGluIGN1cnJlbnQgZGlyZWN0b3J5Ci0KLSAgICAgIGNwIGZyZWV0eXBlMi9zcmMvYmFzZS8qLltoY10gLgotICAgICAgY3AgZnJlZXR5cGUyL3NyYy9yYXN0ZXIxLyouW2hjXSAuCi0gICAgICBjcCBmcmVldHlwZTIvc3JjL3Ntb290aC8qLltoY10gLgotICAgICAgZXRjLgotCi0gIDIuIENvbXBpbGUgc291cmNlcwotCi0gICAgICBjYyAtYyAtSWluY2x1ZGUgLURGVDJfQlVJTERfTElCUkFSWSBmdHN5c3RlbS5jCi0gICAgICBjYyAtYyAtSWluY2x1ZGUgLURGVDJfQlVJTERfTElCUkFSWSBmdGluaXQuYwotICAgICAgY2MgLWMgLUlpbmNsdWRlIC1ERlQyX0JVSUxEX0xJQlJBUlkgZnRkZWJ1Zy5jCi0gICAgICBjYyAtYyAtSWluY2x1ZGUgLURGVDJfQlVJTERfTElCUkFSWSBmdGJhc2UuYwotICAgICAgZXRjLgotCi0gICAgWW91IGRvbid0ICBuZWVkIHRvIGRlZmluZSAgdGhlIEZUX0ZMQVRfQ09NUElMQVRJT04gbWFjcm8gIChhcyB0aGlzCi0gICAgd2FzIHJlcXVpcmVkIGluIHByZXZpb3VzIHJlbGVhc2VzIG9mIEZyZWVUeXBlIDIpLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHlyaWdodCAyMDAzLTIwMTcgYnkKLURhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLQotVGhpcyAgZmlsZSBpcyAgcGFydCBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSBvbmx5ICBiZSB1c2VkLAotbW9kaWZpZWQsICBhbmQgZGlzdHJpYnV0ZWQgIHVuZGVyIHRoZSAgdGVybXMgb2YgIHRoZSAgRnJlZVR5cGUgcHJvamVjdAotbGljZW5zZSwgIExJQ0VOU0UuVFhULiAgQnkgIGNvbnRpbnVpbmcgdG8gIHVzZSwgbW9kaWZ5LCAgb3IgZGlzdHJpYnV0ZQotdGhpcyBmaWxlIHlvdSAgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkICB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZAotYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotCi0tLS0gZW5kIG9mIElOU1RBTEwuQU5ZIC0tLQpkaWZmIC0tZ2l0IGEvZG9jcy9JTlNUQUxMLkNST1NTIGIvZG9jcy9JTlNUQUxMLkNST1NTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgzN2FlLi4wMDAwMDAwCi0tLSBhL2RvY3MvSU5TVEFMTC5DUk9TUworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi1UaGlzIGRvY3VtZW50IGNvbnRhaW5zIGluc3RydWN0aW9ucyBvbiBob3cgdG8gY3Jvc3MtYnVpbGQgdGhlIEZyZWVUeXBlCi1saWJyYXJ5IG9uIFVuaXggc3lzdGVtcywgZm9yIGV4YW1wbGUsIGJ1aWxkaW5nIGJpbmFyaWVzIGZvciBMaW51eC9NSVBTCi1vbiAgRnJlZUJTRC9pMzg2LiAgQmVmb3JlICByZWFkaW5nIHRoaXMgIGRvY3VtZW50LCBwbGVhc2UgIGNvbnN1bHQgdGhlCi1maWxlICBgSU5TVEFMTC5VTklYJyBmb3IgIHJlcXVpcmVkIHRvb2xzICBhbmQgdGhlICBiYXNpYyBzZWxmLWJ1aWxkaW5nCi1wcm9jZWR1cmUuCi0KLQotICAxLiBSZXF1aXJlZCBUb29scwotICAtLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRm9yIHNlbGYtYnVpbGRpbmcgdGhlIEZyZWVUeXBlIGxpYnJhcnkgIG9uIGEgVW5peCBzeXN0ZW0sIEdOVSBNYWtlCi0gICAgMy44MCBvciBuZXdlciAgaXMgcmVxdWlyZWQuICBgSU5TVEFMTC5VTklYJyBjb250YWlucyAgaGludHMgaG93IHRvCi0gICAgY2hlY2sgdGhlIGluc3RhbGxlZCBgbWFrZScuCi0KLSAgICBUaGUgR05VIEMgIGNvbXBpbGVyIHRvIGNyb3NzLWJ1aWxkIHRoZSB0YXJnZXQgIHN5c3RlbSBpcyByZXF1aXJlZC4KLSAgICBDdXJyZW50bHksIHVzaW5nIGEgbm9uLUdOVSBjcm9zcyAgY29tcGlsZXIgaXMgdW50ZXN0ZWQuICBUaGUgY3Jvc3MKLSAgICBjb21waWxlciBpcyAgZXhwZWN0ZWQgdG8gYmUgIGluc3RhbGxlZCB3aXRoIGEgc3lzdGVtICBwcmVmaXguICBGb3IKLSAgICBleGFtcGxlLCBpZiAgeW91ciBidWlsZGluZyBzeXN0ZW0gIGlzIEZyZWVCU0QvaTM4NiBhbmQgIHRoZSB0YXJnZXQKLSAgICBzeXN0ZW0gaXMgTGludXgvTUlQUywgdGhlIGNyb3NzICBjb21waWxlciBzaG91bGQgYmUgaW5zdGFsbGVkIHdpdGgKLSAgICB0aGUgbmFtZSBgbWlwcy1pcDIyLWxpbnV4ZWxmLWdjYycuCi0KLSAgICBBIEMgIGNvbXBpbGVyIGZvciBhIHNlbGYtYnVpbGQgIGlzIHJlcXVpcmVkIGFsc28sIHRvICBidWlsZCBhIHRvb2wKLSAgICAoYGFwaW5hbWVzJykgdGhhdCBpcyBleGVjdXRlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2NlZHVyZS4gIE5vbi1HTlUKLSAgICBzZWxmIGNvbXBpbGVycyBhcmUgYWNjZXB0YWJsZSwgYnV0IHN1Y2ggYSBzZXR1cCBpcyB1bnRlc3RlZC4KLQotCi0gIDIuIENvbmZpZ3VyYXRpb24KLSAgLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgMi4xLiBCdWlsZGluZyBhbmQgdGFyZ2V0IHN5c3RlbQotCi0gICAgICBUbyBjb25maWd1cmUgIGEgY3Jvc3MtYnVpbGQsICB0aGUgb3B0aW9ucyAgYC0taG9zdD08c3lzdGVtPicgYW5kCi0gICAgICBgLS1idWlsZD08c3lzdGVtPicgIG11c3QgYmUgIHBhc3NlZCB0byAgdGhlIGBjb25maWd1cmUnICBzY3JpcHQuCi0gICAgICBGb3IgZXhhbXBsZSwgaWYgeW91ciBidWlsZCBzeXN0ZW0gaXMgRnJlZUJTRC9pMzg2IGFuZCB0aGUgdGFyZ2V0Ci0gICAgICBzeXN0ZW0gaXMgTGludXgvTUlQUywgc2F5Ci0KLSAgICAgICAgLi9jb25maWd1cmUgXAotICAgICAgICAgIC0tYnVpbGQ9aTM4Ni11bmtub3duLWZyZWVic2QgXAotICAgICAgICAgIC0taG9zdD1taXBzLWlwMjItbGludXhlbGYgXAotICAgICAgICAgIFtvdGhlciBvcHRpb25zXQotCi0gICAgICBJdCBzaG91bGQgIGJlIG5vdGVkIHRoYXQgYC0taG9zdD08c3lzdGVtPicgIHNwZWNpZmllcyB0aGUgc3lzdGVtCi0gICAgICB3aGVyZSB0aGUgYnVpbHQgYmluYXJpZXMgd2lsbCAgYmUgZXhlY3V0ZWQsIG5vdCB0aGUgc3lzdGVtIHdoZXJlCi0gICAgICB0aGUgYnVpbGQgYWN0dWFsbHkgaGFwcGVucy4gICBPbGRlciB2ZXJzaW9ucyBvZiBHTlUgYXV0b2NvbmYgdXNlCi0gICAgICB0aGUgb3B0aW9uICBwYWlyIGAtLWhvc3Q9JyBhbmQgYC0tdGFyZ2V0PScuICBUaGlzICBpcyBicm9rZW4gYW5kCi0gICAgICBkb2Vzbid0IHdvcmsuICBTaW1pbGFybHksIGFuIGV4cGxpY2l0IENDIHNwZWNpZmljYXRpb24gbGlrZQotCi0gICAgICAgIGVudiBDQz1taXBzLWlwMjItbGludXgtZ2NjIC4vY29uZmlndXJlICAgICAgICAgICAgICAgICAjIEJBRAotCi0gICAgICBvcgotCi0gICAgICAgIGVudiBDQz0vdXNyL2xvY2FsL21pcHMtaXAyMi1saW51eC9iaW4vZ2NjIC4vY29uZmlndXJlICAjIEJBRAotCi0gICAgICBkb2Vzbid0ICAgd29yayAgZWl0aGVyOyAgc3VjaCAgIGEgIGNvbmZpZ3VyYXRpb24gICBjb25mdXNlcyAgdGhlCi0gICAgICBgY29uZmlndXJlJyBzY3JpcHQgd2hpbGUgIHRyeWluZyB0byBmaW5kIHRoZSBjcm9zcyAgYW5kIG5hdGl2ZSBDCi0gICAgICBjb21waWxlcnMuCi0KLQotICAgIDIuMi4gVGhlIHByZWZpeCB0byBpbnN0YWxsIEZyZWVUeXBlMgotCi0gICAgICBTZXR0aW5nIGAtLXByZWZpeD08cHJlZml4PicgIHByb3Blcmx5IGlzIGltcG9ydGFudC4gICBUaGUgcHJlZml4Ci0gICAgICB0byAgaW5zdGFsbCAgRnJlZVR5cGUyICBpcyB3cml0dGVuICBpbnRvICB0aGUgIGBmcmVldHlwZS1jb25maWcnCi0gICAgICBzY3JpcHQgYW5kIGBmcmVldHlwZTIucGMnIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotICAgICAgSWYgIHRoZSBidWlsdCAgRnJlZVR5cGUgIDIgbGlicmFyeSAgaXMgIHVzZWQgYXMgIGEgIHBhcnQgb2YgIHRoZQotICAgICAgY3Jvc3MtYnVpbGRpbmcgc3lzdGVtLCAgdGhlIHByZWZpeCAgaXMgZXhwZWN0ZWQgdG8gIGJlIGRpZmZlcmVudAotICAgICAgZnJvbSAgdGhlIHNlbGYtYnVpbGRpbmcgIHN5c3RlbS4gIEZvciAgZXhhbXBsZSwgYSAgY29uZmlndXJhdGlvbgotICAgICAgd2l0aCAgIGAtLXByZWZpeD0vdXNyL2xvY2FsJyAgIGluc3RhbGxzICAgIGJpbmFyaWVzICAgaW50byAgIHRoZQotICAgICAgc3lzdGVtLXdpZGUgYC91c3IvbG9jYWwnIGRpcmVjdG9yeSwgd2hpY2ggdGhlbiBjYW4ndCBiZSBleGVjdXRlZAotICAgICAgZHVlICB0byB0aGUgIGluY29ycmVjdCBhcmNoaXRlY3R1cmUuICAgVGhpcyBjYXVzZXMgIGNvbmZ1c2lvbiBpbgotICAgICAgY29uZmlndXJhdGlvbiBvZiBhbGwgYXBwbGljYXRpb25zICB0aGF0IHVzZSBGcmVlVHlwZTIuICBJbnN0ZWFkLAotICAgICAgdXNlIGEgcHJlZml4ICB0byBpbnN0YWxsIHRoZSBjcm9zcy1idWlsZCBpbnRvICBhIHNlcGFyYXRlIHN5c3RlbQotICAgICAgdHJlZSwgZm9yIGV4YW1wbGUsIGAtLXByZWZpeD0vdXNyL2xvY2FsL21pcHMtaXAyMi1saW51eC8nLgotCi0gICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGJ1aWx0ICBGcmVlVHlwZSAyIGxpYnJhcnkgaXMgdXNlZCBhcyBhCi0gICAgICBwYXJ0IG9mIHRoZSB0YXJnZXQgc3lzdGVtLCAgdGhlIHByZWZpeCB0byBpbnN0YWxsIHNob3VsZCByZWZsZWN0Ci0gICAgICB0aGUgZmlsZSBzeXN0ZW0gc3RydWN0dXJlIG9mIHRoZSB0YXJnZXQgc3lzdGVtLgotCi0KLSAgICAyLjMuIExpYnJhcnkgZGVwZW5kZW5jaWVzCi0KLSAgICAgIEZyZWVUeXBlIG5vcm1hbGx5IGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIGxpa2UgYGxpYnBuZycgb3IKLSAgICAgIGBsaWJoYXJmYnV6eicuICAgVGhlICBlYXNpZXN0IGNhc2UgIGlzICB0byAgZGVhY3RpdmF0ZSBhbGwgIHN1Y2gKLSAgICAgIGRlcGVuZGVuY2llcyAgdXNpbmcgdGhlICBgLS13aXRob3V0LVhYWCcgY29uZmlndXJhdGlvbiAgb3B0aW9ucy4KLSAgICAgIEhvd2V2ZXIsIGlmIHlvdSAgd2FudCB0byB1c2UgdGhvc2UgbGlicmFyaWVzLCAgeW91IHNob3VsZCBlbnN1cmUKLSAgICAgIHRoYXQgIHRoZXkgIGFyZSBhdmFpbGFibGUgIGJvdGggIG9uICB0aGUgIHRhcmdldCBzeXN0ZW0gIGFuZCAgYXMKLSAgICAgIChjcm9zcy1jb21waWxlZCkgbGlicmFyaWVzIG9uIHRoZSBidWlsZCBzeXN0ZW0uCi0KLSAgICAgIEZyZWVUeXBlIHVzZXMgIGBwa2ctY29uZmlnJyB0byBmaW5kICBtb3N0IG9mIHRoZSAgbGlicmFyaWVzOyB0aGUKLSAgICAgIG90aGVyIGxpYnJhcmllcyBpdCBsaW5rcyB0byAgYXJlIGV4cGVjdGVkIGluIHRoZSBzdGFuZGFyZCBzeXN0ZW0KLSAgICAgIGRpcmVjdG9yaWVzLiAgIFNpbmNlIHRoZSAgZGVmYXVsdCBwa2ctY29uZmlnJ3MgIG1ldGEtaW5mb3JtYXRpb24KLSAgICAgIGZpbGVzIChsaWtlIGBoYXJmYnV6ei5wYycpIG9mIHRoZSBidWlsZCBwbGF0Zm9ybSBkb24ndCB3b3JrLCB1c2UKLSAgICAgIG9uZSBvZiB0aGUgdHdvIHBvc3NpYmxlIHNvbHV0aW9ucyBiZWxvdy4KLQotICAgICAgICBvIFVzZSBwa2ctY29uZmlnJ3MgbWV0YS1pbmZvcm1hdGlvbiBmaWxlcyB0aGF0IGFyZSBhZGp1c3RlZCB0bwotICAgICAgICAgIGNyb3NzLWNvbXBpbGUgIGFuZCAgY3Jvc3MtbGluayAgd2l0aCB0aGUgIHRhcmdldCAgcGxhdGZvcm0ncwotICAgICAgICAgIGxpYnJhcmllcy4gIE1ha2Ugc3VyZSB0aG9zZSBmaWxlcyBhcmUgZm91bmQgYmVmb3JlIHRoZSBidWlsZAotICAgICAgICAgIHN5c3RlbSdzIGRlZmF1bHQgZmlsZXMuICBFeGFtcGxlOgotCi0gICAgICAgICAgICAuL2NvbmZpZ3VyZSBcCi0gICAgICAgICAgICAgIC0tYnVpbGQ9aTM4Ni11bmtub3duLWZyZWVic2QgXAotICAgICAgICAgICAgICAtLWhvc3Q9bWlwcy1pcDIyLWxpbnV4ZWxmIFwKLSAgICAgICAgICAgICAgUEtHX0NPTkZJR19MSUJESVI9Ii91c3IvbG9jYWwvbWlwcy1pcDIyLWxpbnV4L2xpYi9wa2djb25maWciIFwKLSAgICAgICAgICAgICAgW290aGVyIG9wdGlvbnNdCi0KLSAgICAgICAgICBTZWUgdGhlIG1hbnBhZ2Ugb2YgYHBrZy1jb25maWcnIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgICAgbyBTZXQgdmFyaWFibGVzIGxpa2UgTElCUE5HX0xJQlMgIGFzIGFkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUKLSAgICAgICAgICBgY29uZmlndXJlJyBzY3JpcHQsIG92ZXJyaWRpbmcgdGhlIHZhbHVlcyBgcGtnLWNvbmZpZycgd291bGQKLSAgICAgICAgICBwcm92aWRlLiAgYGNvbmZpZ3VyZSAtLWhlbHAnIHNob3dzIHRoZSBhdmFpbGFibGUgZW52aXJvbm1lbnQKLSAgICAgICAgICB2YXJpYWJsZXMuICBFeGFtcGxlOgotCi0gICAgICAgICAgICAuL2NvbmZpZ3VyZSBcCi0gICAgICAgICAgICAgIC0tYnVpbGQ9aTM4Ni11bmtub3duLWZyZWVic2QgXAotICAgICAgICAgICAgICAtLWhvc3Q9bWlwcy1pcDIyLWxpbnV4ZWxmIFwKLSAgICAgICAgICAgICAgTElCUE5HX0NGTEFHUz0iLUkvdXNyL2xvY2FsL21pcHMtaXAyMi1saW51eC9pbmNsdWRlIiBcCi0gICAgICAgICAgICAgIExJQlBOR19MSUJTPSItTC91c3IvbG9jYWwvbWlwcy1pcDIyLWxpbnV4L2xpYiAtbHBuZzEyIiBcCi0gICAgICAgICAgICAgIFtvdGhlciBvcHRpb25zXQotCi0KLSAgMy4gQnVpbGRpbmcgY29tbWFuZAotICAtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBJZiAgdGhlICBjb25maWd1cmF0aW9uICBmaW5pc2hlcyBzdWNjZXNzZnVsbHksICBpbnZva2luZyAgR05VIG1ha2UKLSAgICBidWlsZHMgRnJlZVR5cGUyLiAgSnVzdCBzYXkKLQotICAgICAgbWFrZQotCi0gICAgb3IKLQotICAgICAgZ21ha2UKLQotICAgIGRlcGVuZGluZyBvbiB0aGUgbmFtZSB0aGUgR05VIG1ha2UgYmluYXJ5IGFjdHVhbGx5IGhhcy4KLQotCi0gIDQuIEluc3RhbGxhdGlvbgotICAtLS0tLS0tLS0tLS0tLS0KLQotICAgIFNheWluZwotCi0gICAgICBtYWtlIGluc3RhbGwKLQotICAgIGFzIHVzdWFsIHRvIGluc3RhbGwgRnJlZVR5cGUyIGludG8gdGhlIGRpcmVjdG9yeSB0cmVlIHNwZWNpZmllZCBieQotICAgIHRoZSBhcmd1bWVudCBvZiB0aGUgYC0tcHJlZml4JyBvcHRpb24uCi0KLSAgICBBcyBub3RlZCBpbiBzZWN0aW9uIDIuMiwgIEZyZWVUeXBlMiAgaXMgc29tZXRpbWVzIGNvbmZpZ3VyZWQgdG8gYmUKLSAgICBpbnN0YWxsZWQgIGludG8gdGhlICBzeXN0ZW0gZGlyZWN0b3J5ICBvZiB0aGUgIHRhcmdldCAgc3lzdGVtLCBhbmQKLSAgICBzaG91bGQgIG5vdCBiZSBpbnN0YWxsZWQgIGluIHRoZSAgY3Jvc3MtYnVpbGRpbmcgc3lzdGVtLiAgIEluIHN1Y2gKLSAgICBjYXNlcywgdGhlICBtYWtlIHZhcmlhYmxlIGBERVNURElSJyAgaXMgdXNlZnVsIHRvIGNoYW5nZSAgdGhlIHJvb3QKLSAgICBkaXJlY3RvcnkgaW4gdGhlIGluc3RhbGxhdGlvbi4gIEZvciBleGFtcGxlLCBhZnRlcgotCi0gICAgICBtYWtlIERFU1RESVI9L21udC90YXJnZXRfc3lzdGVtX3Jvb3QvIGluc3RhbGwKLQotICAgIHRoZSBidWlsdCBGcmVlVHlwZTIgbGlicmFyeSBmaWxlcyBhcmUgaW5zdGFsbGVkIGludG8gdGhlIGRpcmVjdG9yeQotICAgIGAvbW50L3RhcmdldF9zeXN0ZW1fcm9vdC88cHJlZml4X2luX2NvbmZpZ3VyZT4vbGliJy4KLQotCi0gIDUuIFRPRE8KLSAgLS0tLS0tLQotCi0gICAgQ3Jvc3MgYnVpbGRpbmcgYmV0d2VlbiBDeWd3aW4gKG9yIE1TeXMpIGFuZCBVbml4IG11c3QgYmUgdGVzdGVkLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDYtMjAxNyBieQotc3V6dWtpIHRvc2hpeWEsIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLQotCi1UaGlzICBmaWxlIGlzICBwYXJ0IG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5IG9ubHkgIGJlIHVzZWQsCi1tb2RpZmllZCwgIGFuZCBkaXN0cmlidXRlZCAgdW5kZXIgdGhlICB0ZXJtcyBvZiAgdGhlICBGcmVlVHlwZSBwcm9qZWN0Ci1saWNlbnNlLCAgTElDRU5TRS5UWFQuICBCeSAgY29udGludWluZyB0byAgdXNlLCBtb2RpZnksICBvciBkaXN0cmlidXRlCi10aGlzIGZpbGUgeW91ICBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kCi1hbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLS0tLSBlbmQgb2YgSU5TVEFMTC5DUk9TUyAtLS0KZGlmZiAtLWdpdCBhL2RvY3MvSU5TVEFMTC5HTlUgYi9kb2NzL0lOU1RBTEwuR05VCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWI1M2Q4Li4wMDAwMDAwCi0tLSBhL2RvY3MvSU5TVEFMTC5HTlUKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotVGhpcyBkb2N1bWVudCBjb250YWlucyBpbnN0cnVjdGlvbnMgaG93ICB0byBidWlsZCB0aGUgRnJlZVR5cGUgbGlicmFyeQotb24gbm9uLVVuaXggc3lzdGVtcyB3aXRoICB0aGUgaGVscCBvZiBHTlUgTWFrZS4gIE5vdGUgIHRoYXQgaWYgeW91IGFyZQotcnVubmluZyAgQ3lnd2luICBvciAgTWluR1cvTVNZUyAgaW4gV2luZG93cywgIHlvdSAgc2hvdWxkICBmb2xsb3cgIHRoZQotaW5zdHJ1Y3Rpb25zIGluIHRoZSBmaWxlIGBJTlNUQUxMLlVOSVgnIGluc3RlYWQuCi0KLQotICBGcmVlVHlwZSAyIGluY2x1ZGVzIGEgcG93ZXJmdWwgYW5kIGZsZXhpYmxlIGJ1aWxkIHN5c3RlbSB0aGF0IGFsbG93cwotICB5b3UgdG8gIGVhc2lseSBjb21waWxlIGl0IG9uICBhIGdyZWF0IHZhcmlldHkgb2YgIHBsYXRmb3JtcyBmcm9tIHRoZQotICBjb21tYW5kIGxpbmUuICBUbyBkbyBzbywganVzdCBmb2xsb3cgdGhlc2Ugc2ltcGxlIGluc3RydWN0aW9ucy4KLQotICAxLiBJbnN0YWxsIEdOVSBNYWtlCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEJlY2F1c2UgIEdOVSBNYWtlICBpcyAgdGhlICBvbmx5IE1ha2UgIHRvb2wgIHN1cHBvcnRlZCB0byAgY29tcGlsZQotICAgIEZyZWVUeXBlIDIsIHlvdSBzaG91bGQgaW5zdGFsbCBpdCBvbiB5b3VyIG1hY2hpbmUuCi0KLSAgICBUaGUgRnJlZVR5cGUgMiBidWlsZCBzeXN0ZW0gcmVsaWVzIG9uIG1hbnkgZmVhdHVyZXMgc3BlY2lhbCB0byBHTlUKLSAgICBNYWtlLgotCi0gICAgTkVBUkxZIEFMTCBPVEhFUiBNQUtFIFRPT0xTICBGQUlMLCBJTkNMVURJTkcgYEJTRCBNQUtFJywgU08gUkVBTExZCi0gICAgSU5TVEFMTCBBIFJFQ0VOVCBWRVJTSU9OIE9GIEdOVSBNQUtFIE9OIFlPVVIgU1lTVEVNIQotCi0gICAgTm90ZSB0aGF0ICBtYWtlKyssIGEgIG1ha2UgdG9vbCB3cml0dGVuICBpbiBQZXJsLCAgc3VwcG9ydHMgZW5vdWdoCi0gICAgZmVhdHVyZXMgb2YgR05VIG1ha2UgdG8gY29tcGlsZSBGcmVlVHlwZS4gIFNlZQotCi0gICAgICBodHRwOi8vbWFrZXBwLnNvdXJjZWZvcmdlLm5ldAotCi0gICAgZm9yIG1vcmUgaW5mb3JtYXRpb247IHlvdSBuZWVkIHZlcnNpb24gMS4xOSBvciBuZXdlciwgYW5kIHlvdSBtdXN0Ci0gICAgcGFzcyBvcHRpb24gYC0tbm9yYy1zdWJzdGl0dXRpb24nLgotCi0gICAgTWFrZSBzdXJlIHRoYXQgeW91IGFyZSBpbnZva2luZyBHTlUgTWFrZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGJ5Ci0gICAgdHlwaW5nIHNvbWV0aGluZyBsaWtlOgotCi0gICAgICBtYWtlIC12Ci0KLSAgICB0byBkaXNwbGF5IGl0cyB2ZXJzaW9uIG51bWJlci4KLQotICAgIFZFUlNJT04gMy44MCBPUiBORVdFUiBJUyBORUVERUQhCi0KLQotICAyLiBJbnZva2UgYG1ha2UnCi0gIC0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEdvIHRvICB0aGUgcm9vdCAgZGlyZWN0b3J5IG9mIEZyZWVUeXBlICAyLCB0aGVuIHNpbXBseSAgaW52b2tlIEdOVQotICAgIE1ha2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgIFRoaXMgd2lsbCBsYXVuY2ggdGhlIEZyZWVUeXBlIDIgaG9zdAotICAgIHBsYXRmb3JtICBkZXRlY3Rpb24gcm91dGluZXMuICAgQSBzdW1tYXJ5ICB3aWxsIGJlICBkaXNwbGF5ZWQsIGZvcgotICAgIGV4YW1wbGUsIG9uIFdpbjMyLgotCi0KLSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICBGcmVlVHlwZSBidWlsZCBzeXN0ZW0gLS0gYXV0b21hdGljIHN5c3RlbSBkZXRlY3Rpb24KLQotICAgICAgVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgdXNlZDoKLQotICAgICAgICBwbGF0Zm9ybSAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3MKLSAgICAgICAgY29tcGlsZXIgICAgICAgICAgICAgICAgICAgICBnY2MKLSAgICAgICAgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgICAgICAuXGJ1aWxkc1x3aW5kb3dzCi0gICAgICAgIGNvbmZpZ3VyYXRpb24gcnVsZXMgICAgICAgICAgLlxidWlsZHNcd2luZG93c1x3MzItZ2NjLm1rCi0KLSAgICAgIElmIHRoaXMgZG9lcyBub3QgY29ycmVzcG9uZCB0byB5b3VyIHN5c3RlbSBvciBzZXR0aW5ncyBwbGVhc2UKLSAgICAgIHJlbW92ZSB0aGUgZmlsZSAnY29uZmlnLm1rJyBmcm9tIHRoaXMgZGlyZWN0b3J5IHRoZW4gcmVhZCB0aGUKLSAgICAgIElOU1RBTEwgZmlsZSBmb3IgaGVscC4KLQotICAgICAgT3RoZXJ3aXNlLCBzaW1wbHkgdHlwZSAnbWFrZScgYWdhaW4gdG8gYnVpbGQgdGhlIGxpYnJhcnkKLSAgICAgIG9yICdtYWtlIHJlZmRvYycgdG8gYnVpbGQgdGhlIEFQSSByZWZlcmVuY2UgKHRoZSBsYXR0ZXIgbmVlZHMKLSAgICAgIHB5dGhvbikuCi0gICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotICAgIElmIHRoZSBkZXRlY3RlZCBzZXR0aW5ncyBjb3JyZXNwb25kIHRvIHlvdXIgcGxhdGZvcm0gYW5kIGNvbXBpbGVyLAotICAgIHNraXAgdG8gc3RlcCA1LiAgTm90ZSB0aGF0IGlmIHlvdXIgcGxhdGZvcm0gaXMgY29tcGxldGVseSBhbGllbiB0bwotICAgIHRoZSBidWlsZCBzeXN0ZW0sIHRoZSBkZXRlY3RlZCBwbGF0Zm9ybSB3aWxsIGJlIGBhbnNpJy4KLQotCi0gIDMuIENvbmZpZ3VyZSB0aGUgYnVpbGQgc3lzdGVtIGZvciBhIGRpZmZlcmVudCBjb21waWxlcgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIElmIHRoZSBidWlsZCBzeXN0ZW0gY29ycmVjdGx5IGRldGVjdGVkIHlvdXIgcGxhdGZvcm0sIGJ1dCB5b3Ugd2FudAotICAgIHRvIHVzZSBhIGRpZmZlcmVudCBjb21waWxlciAgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGUgc3VtbWFyeQotICAgIChmb3IgbW9zdCBwbGF0Zm9ybXMsIGdjYyBpcyB0aGUgZGVmYXVsdCBjb21waWxlciksIGludm9rZSBHTlUgTWFrZQotICAgIHdpdGgKLQotICAgICAgbWFrZSBzZXR1cCA8Y29tcGlsZXI+Ci0KLSAgICBFeGFtcGxlczoKLQotICAgICAgdG8gdXNlIFZpc3VhbCBDKysgb24gV2luMzIsIHR5cGU6ICBgbWFrZSBzZXR1cCB2aXN1YWxjJwotICAgICAgdG8gdXNlIEJvcmxhbmQgQysrIG9uIFdpbjMyLCB0eXBlICBgbWFrZSBzZXR1cCBiY2MzMicKLSAgICAgIHRvIHVzZSBXYXRjb20gQysrIG9uIFdpbjMyLCB0eXBlICAgYG1ha2Ugc2V0dXAgd2F0Y29tJwotICAgICAgdG8gdXNlIEludGVsIEMrKyBvbiBXaW4zMiwgdHlwZSAgICBgbWFrZSBzZXR1cCBpbnRlbGMnCi0gICAgICB0byB1c2UgTENDLVdpbjMyIG9uIFdpbjMyLCB0eXBlOiAgIGBtYWtlIHNldHVwIGxjYycKLSAgICAgIHRvIHVzZSBXYXRjb20gQysrIG9uIE9TLzIsIHR5cGUgICAgYG1ha2Ugc2V0dXAgd2F0Y29tJwotICAgICAgdG8gdXNlIFZpc3VhbEFnZSBDKysgb24gT1MvMiwgdHlwZSBgbWFrZSBzZXR1cCB2aXN1YWxhZ2UnCi0KLSAgICBUaGUgIDxjb21waWxlcj4gbmFtZSB0byAgdXNlIGlzICBwbGF0Zm9ybS1kZXBlbmRlbnQuICBUaGUgIGxpc3Qgb2YKLSAgICBhdmFpbGFibGUgIGNvbXBpbGVycyBmb3IgIHlvdXIgIHN5c3RlbSBpcyAgYXZhaWxhYmxlICBpbiB0aGUgIGZpbGUKLSAgICBgYnVpbGRzLzxzeXN0ZW0+L2RldGVjdC5taycuCi0KLSAgICBJZiB5b3UgIGFyZSBzYXRpc2ZpZWQgIGJ5IHRoZSBuZXcgIGNvbmZpZ3VyYXRpb24gc3VtbWFyeSwgIHNraXAgdG8KLSAgICBzdGVwIDUuCi0KLQotICA0LiBDb25maWd1cmUgdGhlIGJ1aWxkIHN5c3RlbSBmb3IgYW4gdW5rbm93biBwbGF0Zm9ybS9jb21waWxlcgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGhlIGF1dG8tZGV0ZWN0aW9uL3NldHVwICBwaGFzZSBvZiB0aGUgYnVpbGQgc3lzdGVtICBjb3BpZXMgYSBmaWxlCi0gICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVuZGVyIHRoZSBuYW1lIGBjb25maWcubWsnLgotCi0gICAgRm9yICAgIGV4YW1wbGUsICAgIG9uICAgIE9TLzIrZ2NjLCAgICBpdCAgIHdvdWxkICAgIHNpbXBseSAgICBjb3B5Ci0gICAgYGJ1aWxkcy9vczIvb3MyLWdjYy5taycgdG8gYC4vY29uZmlnLm1rJy4KLQotICAgIElmIGZvciAgc29tZSByZWFzb24geW91ciAgcGxhdGZvcm0gaXNuJ3QgY29ycmVjdGx5ICBkZXRlY3RlZCwgY29weQotICAgIG1hbnVhbGx5IHRoZSBjb25maWd1cmF0aW9uIHN1Yi1tYWtlZmlsZSB0byBgLi9jb25maWcubWsnIGFuZCBnbyB0bwotICAgIHN0ZXAgNS4KLQotICAgIE5vdGUgIHRoYXQgIHRoaXMgZmlsZSAgaXMgIGEgIHN1Yi1NYWtlZmlsZSAgdXNlZCB0byAgc3BlY2lmeSAgTWFrZQotICAgIHZhcmlhYmxlcyAgZm9yIGNvbXBpbGVyICBhbmQgbGlua2VyICBpbnZvY2F0aW9uIGR1cmluZyAgdGhlIGJ1aWxkLgotICAgIFlvdSBjYW4gIGVhc2lseSBjcmVhdGUgeW91ciBvd24gIHZlcnNpb24gZnJvbSBvbmUgIG9mIHRoZSBleGlzdGluZwotICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMsICB0aGVuIGNvcHkgaXQgdG8gdGhlICBjdXJyZW50IGRpcmVjdG9yeSB1bmRlcgotICAgIHRoZSBuYW1lIGAuL2NvbmZpZy5taycuCi0KLQotICA1LiBCdWlsZCB0aGUgbGlicmFyeQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGhlIGF1dG8tZGV0ZWN0aW9uL3NldHVwICBwaGFzZSBzaG91bGQgaGF2ZSAgY29waWVkIGEgZmlsZSAgaW4gdGhlCi0gICAgY3VycmVudCAgZGlyZWN0b3J5LCAgY2FsbGVkICBgLi9jb25maWcubWsnLiAgIFRoaXMgIGZpbGUgIGNvbnRhaW5zCi0gICAgZGVmaW5pdGlvbnMgb2YgdmFyaW91cyBNYWtlICB2YXJpYWJsZXMgdXNlZCB0byBpbnZva2UgdGhlIGNvbXBpbGVyCi0gICAgYW5kIGxpbmtlciBkdXJpbmcgdGhlIGJ1aWxkLiAgW0l0IGhhcyBhbHNvIGdlbmVyYXRlZCBhIGZpbGUgY2FsbGVkCi0gICAgYGZ0bW9kdWxlLmgnICAgaW4gIHRoZSAgb2JqZWN0cyAgIGRpcmVjdG9yeSAgKHdoaWNoICAgaXMgIG5vcm1hbGx5Ci0gICAgYDx0b3BsZXZlbD4vb2Jqcy8nKTsgIHBsZWFzZSByZWFkICB0aGUgIGZpbGUgYGRvY3MvQ1VTVE9NSVpFJyAgZm9yCi0gICAgY3VzdG9taXphdGlvbiBvZiBGcmVlVHlwZS5dCi0KLSAgICBUbyAgbGF1bmNoICB0aGUgYnVpbGQsICBzaW1wbHkgIGludm9rZSAgR05VICBNYWtlIGFnYWluOiAgVGhlICB0b3AKLSAgICBNYWtlZmlsZSB3aWxsIGRldGVjdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBydW4gdGhlIGJ1aWxkIHdpdGgKLSAgICBpdC4KLQotCi0gIEZpbmFsIG5vdGUKLQotICAgIFRoZSBhYm92ZSBpbnN0cnVjdGlvbnMgYnVpbGQgYSAgX3N0YXRpY2FsbHlfIGxpbmtlZCBsaWJyYXJ5IG9mIHRoZQotICAgIGZvbnQgZW5naW5lIGluIHRoZSBgb2JqcycgZGlyZWN0b3J5LiAgIE9uIFdpbmRvd3MsIHlvdSBjYW4gYnVpbGQgYQotICAgIERMTCAgZWl0aGVyICB3aXRoICBNaW5HVyAgKHdpdGhpbiBhbiAgTVNZUyAgc2hlbGwsICBmb2xsb3dpbmcgIHRoZQotICAgIGluc3RydWN0aW9ucyBpbiBgSU5TVEFMTC5VTklYJyksIG9yIHlvdSAgdXNlIG9uZSBvZiB0aGUgVmlzdWFsIEMrKwotICAgIHByb2plY3QgZmlsZXM7IHNlZSAgdGhlICBzdWJkaXJlY3RvcmllcyAgb2YgYGJ1aWxkcy93aW5kb3dzJy4gIEZvcgotICAgIGV2ZXJ5dGhpbmcgZWxzZSwgIHlvdSBhcmUgb24gIHlvdXIgb3duLCAgYW5kIHlvdSBtaWdodCAgZm9sbG93IHRoZQotICAgIGluc3RydWN0aW9ucyBpbiBgSU5TVEFMTC5BTlknIHRvIGNyZWF0ZSB5b3VyIG93biBNYWtlZmlsZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDMtMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzICBmaWxlIGlzICBwYXJ0IG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5IG9ubHkgIGJlIHVzZWQsCi1tb2RpZmllZCwgIGFuZCBkaXN0cmlidXRlZCAgdW5kZXIgdGhlICB0ZXJtcyBvZiAgdGhlICBGcmVlVHlwZSBwcm9qZWN0Ci1saWNlbnNlLCAgTElDRU5TRS5UWFQuICBCeSAgY29udGludWluZyB0byAgdXNlLCBtb2RpZnksICBvciBkaXN0cmlidXRlCi10aGlzIGZpbGUgeW91ICBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kCi1hbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLS0tLSBlbmQgb2YgSU5TVEFMTC5HTlUgLS0tCmRpZmYgLS1naXQgYS9kb2NzL0lOU1RBTEwuTUFDIGIvZG9jcy9JTlNUQUxMLk1BQwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4N2UyNC4uMDAwMDAwMAotLS0gYS9kb2NzL0lOU1RBTEwuTUFDCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotUGxlYXNlIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluICBJTlNUQUxMLlVOSVggdG8gaW5zdGFsbCBGcmVlVHlwZSBvbgotTWFjIE9TIFguCi0KLUN1cnJlbnRseSAgRnJlZVR5cGUyIGZ1bmN0aW9ucyAgYmFzZWQgb24gIHNvbWUgZGVwcmVjYXRlZCAgQ2FyYm9uIEFQSXMKLXJldHVybiAgYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGFsd2F5cywgIGV2ZW4gIGlmIEZyZWVUeXBlMiAgaXMKLWNvbmZpZ3VyZWQgYW5kICBidWlsdCBvbiAgdGhlIHN5c3RlbSB0aGF0ICBkZXByZWNhdGVkIENhcmJvbiAgQVBJcyBhcmUKLWF2YWlsYWJsZS4gICBUbyAgZW5hYmxlICBkZXByZWNhdGVkICBGcmVlVHlwZTIgIGZ1bmN0aW9ucyAgYXMgIGZhciAgYXMKLXBvc3NpYmxlLCByZXBsYWNlIGBzcmMvYmFzZS9mdG1hYy5jJyBieSBgYnVpbGRzL21hYy9mdG1hYy5jJy4KLQotU3RhcnRpbmcgd2l0aCAgTWFjIE9TIFggIDEwLjUsIGdjYyAgZGVmYXVsdHMgdGhlIGRlcGxveW1lbnQgIHRhcmdldCB0bwotMTAuNS4gIEluIHByZXZpb3VzICB2ZXJzaW9ucyBvZiBNYWMgT1MgWCwgdGhpcyAgZGVmYXVsdGVkIHRvIDEwLjEuICBJZgoteW91IHdhbnQgeW91ciBidWlsdCBiaW5hcmllcyB0byBydW4gb25seSBvbiAxMC41LCB0aGlzIGNoYW5nZSBkb2VzIG5vdAotY29uY2VybiB5b3UuICBJZiAgeW91IHdhbnQgdGhlbSB0byAgYWxzbyBydW4gb24gb2xkZXIgIHZlcnNpb25zIG9mIE1hYwotT1MgIFgsICAgdGhlbiAgeW91ICAgbXVzdCAgZWl0aGVyICBzZXQgICB0aGUgIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVAotZW52aXJvbm1lbnQgIHZhcmlhYmxlICBvciAgcGFzcyBgLW1tYWNvc3gtdmVyc2lvbi1taW4nICB0byAgZ2NjLiAgIFlvdQotc2hvdWxkIHNwZWNpZnkgdGhlIG9sZGVzdCAgdmVyc2lvbiBvZiBNYWMgT1MgeW91IHdhbnQgIHRoZSBjb2RlIHRvIHJ1bgotb24uICBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBCb3VybmUgc2hlbGw6Ci0KLSAgZXhwb3J0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD0xMC4yCi0KLW9yLCBpZiB5b3UgdXNlIEMgc2hlbGw6Ci0KLSAgc2V0ZW52IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCAxMC4yCi0KLUFsdGVybmF0aXZlbHksIHlvdSBjb3VsZCBwYXNzIGAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC4yJyB0byBnY2MuCi0KLUhlcmUgdGhlIG51bWJlciAxMC4yIGlzIHRoZSBsb3dlc3QgdmVyc2lvbiB0aGF0IHRoZSBidWlsdCBiaW5hcmllcyBjYW4KLXJ1biBvbi4gIEluIHRoZSAgYWJvdmUgY2FzZXMsIHRoZSBidWlsdCBiaW5hcmllcyB3aWxsIHJ1biAgb24gTWFjIE9TIFgKLTEwLjIgYW5kIGxhdGVyLCBidXQgX25vdF8gZWFybGllci4gIElmIHlvdSB3YW50IHRvIHJ1biBvbiBlYXJsaWVyLCB5b3UKLWhhdmUgdG8gc2V0IGxvd2VyIHZlcnNpb24sIGUuZy4sIDEwLjAuCi0KLUZvciBjbGFzc2ljIE1hYyBPUyAoTWFjIE9TIDcsIDgsIDkpIHBsZWFzZSByZWZlciB0byBidWlsZHMvbWFjL1JFQURNRS4KZGlmZiAtLWdpdCBhL2RvY3MvSU5TVEFMTC5VTklYIGIvZG9jcy9JTlNUQUxMLlVOSVgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjIwZGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9JTlNUQUxMLlVOSVgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotVGhpcyAgZG9jdW1lbnQgY29udGFpbnMgIGluc3RydWN0aW9ucyAgb24gaG93ICB0byAgYnVpbGQgdGhlICBGcmVlVHlwZQotbGlicmFyeSBvbiBVbml4ICBzeXN0ZW1zLiAgVGhpcyBhbHNvIHdvcmtzIGZvciAgZW11bGF0aW9ucyBsaWtlIEN5Z3dpbgotb3IgTVN5cyBvbiBXaW4zMjoKLQotCi0gIDEuIEVuc3VyZSB0aGF0IHlvdSBhcmUgdXNpbmcgR05VIE1ha2UKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGhlIEZyZWVUeXBlIGJ1aWxkIHN5c3RlbSAgX2V4Y2x1c2l2ZWx5XyB3b3JrcyB3aXRoIEdOVSBNYWtlLiAgWW91Ci0gICAgd2lsbCAgbm90IGJlICBhYmxlIHRvICBjb21waWxlIHRoZSAgbGlicmFyeSB3aXRoICB0aGUgaW5zdHJ1Y3Rpb25zCi0gICAgYmVsb3cgdXNpbmcgYW55IG90aGVyIGFsdGVybmF0aXZlIChpbmNsdWRpbmcgQlNEIE1ha2UpLgotCi0gICAgQ2hlY2sgdGhhdCB5b3UgaGF2ZSBHTlUgbWFrZSBieSBydW5uaW5nIHRoZSBjb21tYW5kOgotCi0gICAgICAgbWFrZSAtdgotCi0gICAgVGhpcyBzaG91bGQgZHVtcCBzb21lIHRleHQgdGhhdCBiZWdpbnMgd2l0aDoKLQotICAgICAgIEdOVSBNYWtlICA8dmVyc2lvbiBudW1iZXI+Ci0gICAgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEluYy4KLQotICAgIE5vdGUgdGhhdCB2ZXJzaW9uICAzLjgwIG9yIGhpZ2hlciBpcyAqcmVxdWlyZWQqIG9yIHRoZSAgYnVpbGQgd2lsbAotICAgIGZhaWwuCi0KLSAgICBJdCBpcyBhbHNvIGZpbmUgdG8gaGF2ZSBHTlUgTWFrZSB1bmRlciBhbm90aGVyIG5hbWUgKGUuZy4gJ2dtYWtlJykKLSAgICBpZiB5b3UgdXNlIHRoZSBNQUtFIHZhcmlhYmxlIGFzIGRlc2NyaWJlZCBiZWxvdy4KLQotICAgIEFzICBhICBzcGVjaWFsIGV4Y2VwdGlvbiwgICdtYWtlcHAnICBjYW4gIGFsc28gIGJlIHVzZWQgIHRvICBidWlsZAotICAgIEZyZWVUeXBlIDIuICBTZWUgdGhlIGZpbGUgZG9jcy9NQUtFUFAgZm9yIGRldGFpbHMuCi0KLSAgICBGb3IgYnVpbGRzICB3aXRoIGBjbWFrZScgcGxlYXNlIGNoZWNrIGZpbGUgYENNYWtlTGlzdHMudHh0JzsgIHRoaXMKLSAgICBpcyBhIGNvbnRyaWJ1dGVkIGZpbGUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSB0aGUgRnJlZVR5cGUgdGVhbS4KLQotCi0gIDIuIFJlZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaWYgbmVlZGVkCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUaGlzIG9ubHkgYXBwbGllcyBpZiB5b3UgIGFyZSBidWlsZGluZyBhIGdpdCBzbmFwc2hvdCBvciBjaGVja291dCwKLSAgICAqbm90KiBpZiB5b3UgZ3JhYmJlZCB0aGUgc291cmNlcyBvZiBhbiBvZmZpY2lhbCByZWxlYXNlLgotCi0gICAgWW91ICBuZWVkICB0byBpbnZva2UgIHRoZSAgYGF1dG9nZW4uc2gnICBzY3JpcHQgIGluIHRoZSAgdG9wLWxldmVsCi0gICAgZGlyZWN0b3J5ICBpbiBvcmRlciAgdG8gIGNyZWF0ZSB0aGUgIGBjb25maWd1cmUnICBzY3JpcHQgZm9yICB5b3VyCi0gICAgcGxhdGZvcm0uICBOb3JtYWxseSwgdGhpcyBzaW1wbHkgbWVhbnMgdHlwaW5nOgotCi0gICAgICBzaCBhdXRvZ2VuLnNoCi0KLSAgICBJbiBjYXNlIG9mIHByb2JsZW1zLCB5b3UgIG1heSBuZWVkIHRvIGluc3RhbGwgb3IgdXBncmFkZSBBdXRvbWFrZSwKLSAgICBBdXRvY29uZiBvciAgTGlidG9vbC4gIFNlZSAgUkVBRE1FLmdpdCBpbiB0aGUgIHRvcC1sZXZlbCBkaXJlY3RvcnkKLSAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCi0gIDMuIEJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBsaWJyYXJ5Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUaGUgZm9sbG93aW5nICBzaG91bGQgd29yayAgb24gYWxsIFVuaXggIHN5c3RlbXMgd2hlcmUgIHRoZSBgbWFrZScKLSAgICBjb21tYW5kIGludm9rZXMgR05VIE1ha2U6Ci0KLSAgICAgIC4vY29uZmlndXJlIFtvcHRpb25zXQotICAgICAgbWFrZQotICAgICAgbWFrZSBpbnN0YWxsICAgICAgICAgICAoYXMgcm9vdCkKLQotICAgIFRoZSBkZWZhdWx0IGluc3RhbGxhdGlvbiBwYXRoICBpcyBgL3Vzci9sb2NhbCcuICBJdCBjYW4gYmUgY2hhbmdlZAotICAgIHdpdGggdGhlIGAtLXByZWZpeD08cGF0aD4nIG9wdGlvbi4gIEV4YW1wbGU6Ci0KLSAgICAgIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKLQotICAgIFdoZW4gdXNpbmcgIGEgZGlmZmVyZW50IGNvbW1hbmQgIHRvIGludm9rZSBHTlUgTWFrZSwgIHVzZSB0aGUgTUFLRQotICAgIHZhcmlhYmxlLiAgRm9yIGV4YW1wbGUsICBpZiBgZ21ha2UnIGlzIHRoZSBjb21tYW5kICB0byB1c2Ugb24geW91cgotICAgIHN5c3RlbSwgZG8gc29tZXRoaW5nIGxpa2U6Ci0KLSAgICAgICBNQUtFPWdtYWtlIC4vY29uZmlndXJlIFtvcHRpb25zXQotICAgICAgIGdtYWtlCi0gICAgICAgZ21ha2UgaW5zdGFsbCAgICAgICAgICAgIChhcyByb290KQotCi0gICAgSWYgIHRoaXMgc3RpbGwgZG9lc24ndCAgd29yaywgdGhlcmUgIG11c3QgYmUgIGEgcHJvYmxlbSAgd2l0aCB5b3VyCi0gICAgc3lzdGVtIChlLmcuLCB5b3UgYXJlIHVzaW5nIGEgdmVyeSBvbGQgdmVyc2lvbiBvZiBHTlUgTWFrZSkuCi0KLSAgICBJdCAgaXMgcG9zc2libGUgIHRvICBjb21waWxlIEZyZWVUeXBlICBpbiAgYSBkaWZmZXJlbnQgIGRpcmVjdG9yeS4KLSAgICBBc3N1bWluZyB0aGUgRnJlZVR5cGUgc291cmNlICBmaWxlcyBpbiBkaXJlY3RvcnkgYC9zcmMvZnJlZXR5cGUnIGEKLSAgICBjb21waWxhdGlvbiBpbiBkaXJlY3RvcnkgYGZvbycgd29ya3MgYXMgZm9sbG93czoKLQotICAgICAgY2QgZm9vCi0gICAgICAvc3JjL2ZyZWV0eXBlL2NvbmZpZ3VyZSBbb3B0aW9uc10KLSAgICAgIG1ha2UKLSAgICAgIG1ha2UgaW5zdGFsbAotCi0KLSAgMy4xIEludGVyZGVwZW5kZW5jeSB3aXRoIEhhcmZCdXp6Ci0gIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotCi0gICAgTm90ZSB0aGF0IHRoZXJlICBpcyBhIGNoaWNrZW4tYW5kLWVnZyBwcm9ibGVtICBjdXJyZW50bHkgc2luY2UgdGhlCi0gICAgSGFyZkJ1enogbGlicmFyeSAgKHVzZWQgYnkgdGhlICBhdXRvLWhpbnRlciB0byBpbXByb3ZlICBzdXBwb3J0IG9mCi0gICAgT3BlblR5cGUgIGZvbnRzKSAgZGVwZW5kcyBvbiAgRnJlZVR5cGUsICB3aGljaCAgY2FuIGJlICBzb2x2ZWQgIGFzCi0gICAgZm9sbG93cyBpbiBjYXNlIEhhcmZCdXp6IGlzIG5vdCB5ZXQgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLgotCi0gICAgMS4gQ2FsbCAgICBGcmVlVHlwZSdzICAgICBgY29uZmlndXJlJyAgICBzY3JpcHQgICAgIHdpdGggICAgb3B0aW9uCi0gICAgICAgYC0td2l0aG91dC1oYXJmYnV6eicsIHRoZW4gY29tcGlsZSBhbmQgaW5zdGFsbCBGcmVlVHlwZS4KLQotICAgIDIuIENvbXBpbGUgYW5kIGluc3RhbGwgSGFyZkJ1enouCi0KLSAgICAzLiBDYWxsICAgIEZyZWVUeXBlJ3MgICAgYGNvbmZpZ3VyZScgICBzY3JpcHQgICAgd2l0aG91dCAgICBvcHRpb24KLSAgICAgICBgLS13aXRob3V0LWhhcmZidXp6JyAoYWZ0ZXIgIGV4ZWN1dGluZyBgbWFrZSAgZGlzdGNsZWFuJyksIHRoZW4KLSAgICAgICBjb21waWxlIGFuZCBpbnN0YWxsIEZyZWVUeXBlIGFnYWluLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDMtMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzICBmaWxlIGlzICBwYXJ0IG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5IG9ubHkgIGJlIHVzZWQsCi1tb2RpZmllZCwgIGFuZCBkaXN0cmlidXRlZCAgdW5kZXIgdGhlICB0ZXJtcyBvZiAgdGhlICBGcmVlVHlwZSBwcm9qZWN0Ci1saWNlbnNlLCAgTElDRU5TRS5UWFQuICBCeSAgY29udGludWluZyB0byAgdXNlLCBtb2RpZnksICBvciBkaXN0cmlidXRlCi10aGlzIGZpbGUgeW91ICBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kCi1hbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLS0tLSBlbmQgb2YgSU5TVEFMTC5VTklYIC0tLQpkaWZmIC0tZ2l0IGEvZG9jcy9JTlNUQUxMLlZNUyBiL2RvY3MvSU5TVEFMTC5WTVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTE3NGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9JTlNUQUxMLlZNUworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLUhvdyB0byBidWlsZCB0aGUgZnJlZXR5cGUyIGxpYnJhcnkgb24gVk1TCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JdCBpcyBhY3R1YWxseSB2ZXJ5ICBzdHJhaWdodGZvcndhcmQgdG8gaW5zdGFsbCB0aGUgRnJlZXR5cGUyIGxpYnJhcnkuCi1KdXN0ICBleGVjdXRlIHZtc19tYWtlLmNvbSBmcm9tICB0aGUgdG9wbGV2ZWwgIGRpcmVjdG9yeSB0byAgYnVpbGQgdGhlCi1saWJyYXJ5LiAgVGhpcyBwcm9jZWR1cmUgY3VycmVudGx5IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgotCi1ERUJVRwotICBCdWlsZCB0aGUgbGlicmFyeSB3aXRoIGRlYnVnIGluZm9ybWF0aW9uIGFuZCB3aXRob3V0IG9wdGltaXphdGlvbi4KLQotbG9wdHM9PHZhbHVlPgotICBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGxpbmsgY29tbWFuZCBlLmcuIGxvcHRzPS90cmFjZWJhY2sKLQotY2NvcHQ9PHZhbHVlPgotICBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIEMgY29tcGlsZXIgZS5nLiBjY29wdD0vZmxvYXQ9aWVlZQotCi1JbiBjYXNlIHlvdSBkaWQgZG93bmxvYWQgdGhlIGRlbW9zLCBwbGFjZSB0aGVtIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5Ci1zaGFyaW5nIHRoZSBzYW1lIHRvcGxldmVsIGFzIHRoZSBkaXJlY3Rvcnkgb2YgRnJlZXR5cGUyIGFuZCBmb2xsb3cgdGhlCi1zYW1lICBpbnN0cnVjdGlvbnMgYXMgIGFib3ZlICBmb3IgIHRoZSBkZW1vcyAgZnJvbSAgdGhlcmUuICBUaGUgIGJ1aWxkCi1wcm9jZXNzIHJlbGllcyBvbiB0aGlzIHRvIGZpZ3VyZSB0aGUgbG9jYXRpb24gb2YgdGhlIEZyZWV0eXBlMiBpbmNsdWRlCi1maWxlcy4KLQotCi1UbyByZWJ1aWxkICB0aGUgIHNvdXJjZXMgaXQgaXMgbmVjZXNzYXJ5IHRvICBoYXZlIE1NUy9NTUsgaW5zdGFsbGVkIG9uCi10aGUgc3lzdGVtLgotCi1UaGUgbGlicmFyeSBpcyBhdmFpbGFibGUgaW4gdGhlIGRpcmVjdG9yeQotCi0gIFsuTElCXQotCi1UbyAgY29tcGlsZSBhcHBsaWNhdGlvbnMgIHVzaW5nICBGcmVlVHlwZSAgMiB5b3UgIGhhdmUgIHRvIGRlZmluZSAgdGhlCi1sb2dpY2FsIEZSRUVUWVBFIHBvaW50aW5nIHRvIHRoZSBkaXJlY3RvcnkKLQotICBbLklOQ0xVREUuRlJFRVRZUEVdCi0KLWkuZS4sIGlmICB0aGUgZGlyZWN0b3J5IGluIHdoaWNoICB0aGlzIElOU1RBTEwuVk1TIGZpbGUgIGlzIGxvY2F0ZWQgaXMKLSRkaXNrOltmcmVldHlwZV0gdGhlbiBkZWZpbmUgdGhlIGxvZ2ljYWwgd2l0aAotCi0gIGRlZmluZSBmcmVldHlwZSAkZGlzazpbZnJlZXR5cGUuaW5jbHVkZS5mcmVldHlwZV0KLQotVGhpcyB2ZXJzaW9uIGhhcyAgYmVlbiB0ZXN0ZWQgd2l0aCBDb21wYXEgQyAgVjYuMi0wMDYgb24gT3BlblZNUyBBbHBoYQotVjcuMi0xLgotCi0KLSAgQW55IHByb2JsZW1zIGNhbiBiZSByZXBvcnRlZCB0bwotCi0gICAgSm91ayBKYW5zZW4gPGpvdWtqQGhyZW0uc3RtLnR1ZGVsZnQubmw+IG9yCi0gICAgTWFydGluIFAuSi4gWmluc2VyIDx6aW5zZXJAemluc2VyLm5vLWlwLmluZm8+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAwMC0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiB0aGUgIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgbWF5ICBvbmx5IGJlICB1c2VkLAotbW9kaWZpZWQsICBhbmQgIGRpc3RyaWJ1dGVkICB1bmRlciAgdGhlICB0ZXJtcyBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0Ci1saWNlbnNlLCBMSUNFTlNFLlRYVC4gICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMKLWZpbGUgeW91ICBpbmRpY2F0ZSB0aGF0ICB5b3UgaGF2ZSAgcmVhZCB0aGUgIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgIGFuZAotYWNjZXB0IGl0IGZ1bGx5LgotCi0KLS0tLSBlbmQgb2YgSU5TVEFMTC5WTVMgLS0tCmRpZmYgLS1naXQgYS9kb2NzL0xJQ0VOU0UuVFhUIGIvZG9jcy9MSUNFTlNFLlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1YTFjNS4uMDAwMDAwMAotLS0gYS9kb2NzL0xJQ0VOU0UuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotCi1UaGUgIEZyZWVUeXBlIDIgIGZvbnQgIGVuZ2luZSBpcyAgY29weXJpZ2h0ZWQgIHdvcmsgYW5kICBjYW5ub3QgYmUgIHVzZWQKLWxlZ2FsbHkgIHdpdGhvdXQgYSAgc29mdHdhcmUgbGljZW5zZS4gICBJbiAgb3JkZXIgdG8gIG1ha2UgdGhpcyAgcHJvamVjdAotdXNhYmxlICB0byBhIHZhc3QgIG1ham9yaXR5IG9mICBkZXZlbG9wZXJzLCB3ZSAgZGlzdHJpYnV0ZSBpdCAgdW5kZXIgdHdvCi1tdXR1YWxseSBleGNsdXNpdmUgb3Blbi1zb3VyY2UgbGljZW5zZXMuCi0KLVRoaXMgbWVhbnMgIHRoYXQgKnlvdSogbXVzdCBjaG9vc2UgICpvbmUqIG9mIHRoZSAgdHdvIGxpY2Vuc2VzIGRlc2NyaWJlZAotYmVsb3csIHRoZW4gb2JleSAgYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGVuICB1c2luZyBGcmVlVHlwZSAyIGluCi1hbnkgb2YgeW91ciBwcm9qZWN0cyBvciBwcm9kdWN0cy4KLQotICAtIFRoZSBGcmVlVHlwZSBMaWNlbnNlLCBmb3VuZCBpbiAgdGhlIGZpbGUgYEZUTC5UWFQnLCB3aGljaCBpcyBzaW1pbGFyCi0gICAgdG8gdGhlIG9yaWdpbmFsIEJTRCBsaWNlbnNlICp3aXRoKiBhbiBhZHZlcnRpc2luZyBjbGF1c2UgdGhhdCBmb3JjZXMKLSAgICB5b3UgIHRvICBleHBsaWNpdGx5IGNpdGUgIHRoZSAgRnJlZVR5cGUgIHByb2plY3QgIGluIHlvdXIgIHByb2R1Y3QncwotICAgIGRvY3VtZW50YXRpb24uICBBbGwgIGRldGFpbHMgYXJlIGluIHRoZSBsaWNlbnNlICBmaWxlLiAgVGhpcyBsaWNlbnNlCi0gICAgaXMgIHN1aXRlZCAgdG8gcHJvZHVjdHMgIHdoaWNoICBkb24ndCAgdXNlICB0aGUgR05VICBHZW5lcmFsICBQdWJsaWMKLSAgICBMaWNlbnNlLgotCi0gICAgTm90ZSB0aGF0ICB0aGlzIGxpY2Vuc2UgIGlzICBjb21wYXRpYmxlICB0byB0aGUgIEdOVSBHZW5lcmFsICBQdWJsaWMKLSAgICBMaWNlbnNlIHZlcnNpb24gMywgYnV0IG5vdCB2ZXJzaW9uIDIuCi0KLSAgLSBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBmb3VuZCBpbiAgYEdQTHYyLlRYVCcgKGFueQotICAgIGxhdGVyIHZlcnNpb24gY2FuIGJlIHVzZWQgIGFsc28pLCBmb3IgcHJvZ3JhbXMgd2hpY2ggYWxyZWFkeSB1c2UgdGhlCi0gICAgR1BMLiAgTm90ZSAgdGhhdCB0aGUgIEZUTCBpcyAgaW5jb21wYXRpYmxlICB3aXRoICBHUEx2MiBkdWUgIHRvICBpdHMKLSAgICBhZHZlcnRpc2VtZW50IGNsYXVzZS4KLQotVGhlIGNvbnRyaWJ1dGVkIEJERiBhbmQgUENGIGRyaXZlcnMgIGNvbWUgd2l0aCBhIGxpY2Vuc2Ugc2ltaWxhciB0byB0aGF0Ci1vZiB0aGUgWCBXaW5kb3cgU3lzdGVtLiAgSXQgaXMgY29tcGF0aWJsZSB0byB0aGUgYWJvdmUgdHdvIGxpY2Vuc2VzIChzZWUKLWZpbGUgc3JjL2JkZi9SRUFETUUgYW5kICBzcmMvcGNmL1JFQURNRSkuICBUaGUgc2FtZSBob2xkcyAgZm9yIHRoZSBmaWxlcwotYGZ0aGFzaC5jJyBhbmQgIGBmdGhhc2guaCc7IHRoZWlyICBjb2RlIHdhcyAgcGFydCBvZiAgdGhlIEJERiAgZHJpdmVyIGluCi1lYXJsaWVyIEZyZWVUeXBlIHZlcnNpb25zLgotCi1UaGUgZ3ppcCBtb2R1bGUgdXNlcyB0aGUgemxpYiBsaWNlbnNlIChzZWUgc3JjL2d6aXAvemxpYi5oKSB3aGljaCB0b28gaXMKLWNvbXBhdGlibGUgdG8gdGhlIGFib3ZlIHR3byBsaWNlbnNlcy4KLQotVGhlIE1ENSBjaGVja3N1bSBzdXBwb3J0IChvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBpbiBkZXZlbG9wbWVudCBidWlsZHMpCi1pcyBpbiB0aGUgcHVibGljIGRvbWFpbi4KLQotCi0tLS0gZW5kIG9mIExJQ0VOU0UuVFhUIC0tLQpkaWZmIC0tZ2l0IGEvZG9jcy9NQUtFUFAgYi9kb2NzL01BS0VQUApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlYWY1NS4uMDAwMDAwMAotLS0gYS9kb2NzL01BS0VQUAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQXMgYSBzcGVjaWFsICBleGNlcHRpb24sIEZyZWVUeXBlIGNhbiBhbHNvIGJlICBidWlsdCB3aXRoIHRoZSAnbWFrZXBwJwotYnVpbGQgdG9vbCwgYXZhaWxhYmxlIGZyb20gaHR0cDovL21ha2VwcC5zb3VyY2Vmb3JnZS5uZXQuCi0KLU5vdGUsIGhvd2V2ZXIuIHRoYXQgIHlvdSB3aWxsIG5lZWQgYXQgbGVhc3QgdmVyc2lvbiAgMS4xOSBhbmQgcGFzcyB0aGUKLW9wdGlvbiAtLW5vcmMtc3Vic3RpdHV0aW9uIHRvIGhhdmUgaXQgd29yayBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS9kb2NzL1BST0JMRU1TIGIvZG9jcy9QUk9CTEVNUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiZGMzNS4uMDAwMDAwMAotLS0gYS9kb2NzL1BST0JMRU1TCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotVGhpcyAgZmlsZSBkZXNjcmliZXMgdmFyaW91cyAgcHJvYmxlbXMgdGhhdCAgaGF2ZSBiZWVuICBlbmNvdW50ZXJlZCBpbgotY29tcGlsaW5nLCAgaW5zdGFsbGluZyAgYW5kICAgcnVubmluZyAgRnJlZVR5cGUgIDIuICAgU3VnZ2VzdGlvbnMgIGZvcgotYWRkaXRpb25zIG9yIG90aGVyIGltcHJvdmVtZW50cyB0byB0aGlzIGZpbGUgYXJlIHdlbGNvbWUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUnVubmluZyBQcm9ibGVtcwotPT09PT09PT09PT09PT09PQotCi0KLSogU29tZSBUeXBlIDEsIE11bHRpcGxlIE1hc3RlcnMsIGFuZCBDSUQta2V5ZWQgUG9zdFNjcmlwdCBmb250cyBhcmVuJ3QKLSAgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLS0tLS0tCi0KLU9mIGNvdXJzZSwgIHRoZXJlIG1pZ2h0IGJlICBidWdzIGluIEZyZWVUeXBlLCAgYnV0IHNvbWUgZm9udHMgYmFzZWQgb24KLXRoZSAgUG9zdFNjcmlwdCAgZm9ybWF0IGNhbid0ICBiZSBoYW5kbGVkIGluZGVlZC4gIFRoZSByZWFzb24gIGlzIHRoYXQKLUZyZWVUeXBlICBkb2Vzbid0IGNvbnRhaW4gYSBmdWxsICBQb3N0U2NyaXB0ICBpbnRlcnByZXRlciAgYnV0IGFwcGxpZXMKLXBhdHRlcm4gbWF0Y2hpbmcgaW5zdGVhZC4gIEluIGNhc2UgYSBmb250IGRvZXNuJ3QgZm9sbG93IHRoZSAgc3RhbmRhcmQKLXN0cnVjdHVyZSBvZiB0aGUgZ2l2ZW4gZm9udCBmb3JtYXQsIEZyZWVUeXBlIGZhaWxzLiAgQSB0eXBpY2FsIGV4YW1wbGUKLWlzIEFkb2JlJ3MgYE9wdGltYScgIGZvbnQgZmFtaWx5IHdoaWNoICBjb250YWlucyBleHRyYSBjb2RlICB0byBzd2l0Y2gKLWJldHdlZW4gbG93IGFuZCBoaWdoIHJlc29sdXRpb24gdmVyc2lvbnMgb2YgdGhlIGdseXBocy4KLQotSXQgbWlnaHQgYmUgIHBvc3NpYmxlIHRvIHBhdGNoICBGcmVlVHlwZSBpbiAgc29tZSBzaXR1YXRpb25zLCAgdGhvdWdoLgotUGxlYXNlIHJlcG9ydCBmYWlsaW5nIGZvbnRzIHNvIHRoYXQgd2UgaW52ZXN0aWdhdGUgdGhlIHByb2JsZW0gYW5kIHNldAotdXAgYSBsaXN0IG9mIHN1Y2ggcHJvYmxlbWF0aWMgZm9udHMuCi0KLQotKiBXaHkgZG8gaWRlbnRpY2FsIEZyZWVUeXBlICB2ZXJzaW9ucyByZW5kZXIgZGlmZmVyZW50bHkgIG9uIGRpZmZlcmVudAotICBwbGF0Zm9ybXM/Ci0KLS0tLS0tCi0KLURpZmZlcmVudCBkaXN0cmlidXRpb25zIGNvbXBpbGUgRnJlZVR5cGUgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy4gICBUaGUKLWRldmVsb3BlciAgdmVyc2lvbiBvZiAgYSAgZGlzdHJpYnV0aW9uJ3MgIEZyZWVUeXBlICBwYWNrYWdlLCAgd2hpY2ggaXMKLW5lZWRlZCB0byBjb21waWxlICB5b3VyIHByb2dyYW0gIGFnYWluc3QgRnJlZVR5cGUsICBpbmNsdWRlcyB0aGUgIGZpbGUKLWZ0b3B0aW9uLmguICBDb21wYXJlICBlYWNoIHBsYXRmb3JtJ3MgIGNvcHkgb2YgZnRvcHRpb24uaCB0byAgZmluZCB0aGUKLWRpZmZlcmVuY2VzLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1Db21waWxhdGlvbiBQcm9ibGVtcwotPT09PT09PT09PT09PT09PT09PT0KLQotCi0qIEkgZ2V0IGFuIGBpbnRlcm5hbCBjb21waWxhdGlvbiBlcnJvcicgKElDRSkgd2hpbGUgY29tcGlsaW5nIEZyZWVUeXBlCi0gIDIuMi4xIHdpdGggSW50ZWwgQysrLgotCi0gIFRoaXMgaGFzIGJlZW4gcmVwb3J0ZWQgZm9yIHRoZSBmb2xsb3dpbmcgY29tcGlsZXIgdmVyc2lvbjoKLQotICAgIEludGVsKFIpIEMrKyBDb21waWxlciBmb3IgMzItYml0IGFwcGxpY2F0aW9ucywKLSAgICAgIFZlcnNpb24gOS4wIEJ1aWxkIDIwMDUwNDMwWiBQYWNrYWdlIElEOiBXX0NDX1BfOS4wLjAxOQotCi0tLS0tLQotCi1UaGUgYmVzdCBzb2x1dGlvbiBpcyB0byB1cGRhdGUgdGhlIGNvbXBpbGVyIHRvIHZlcnNpb24KLQotICBJbnRlbChSKSBDKysgQ29tcGlsZXIgZm9yIDMyLWJpdCBhcHBsaWNhdGlvbnMsCi0gICAgVmVyc2lvbiA5LjEgQnVpbGQgMjAwNjAzMjNaIFBhY2thZ2UgSUQ6IFdfQ0NfUF85LjEuMDIyCi0KLW9yIG5ld2VyLiAgSWYgdGhpcyBpc24ndCBmZWFzaWJsZSwgYXBwbHkgdGhlIGZvbGxvd2luZyBwYXRjaC4KLQotCi0tLS0gc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMgMjAgTWFyIDIwMDYgMTI6MTA6MjQgLTAwMDAgMS4yMAotKysrIHNyYy9jYWNoZS9mdGNiYXNpYy5jLnBhdGNoZWQgMTUgTWF5IDIwMDYgMDI6NTE6MDIgLTAwMDAKLUBAIC0yNTIsNyArMjUyLDcgQEAKLSAgICovCi0KLSAgIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotLSAgY29uc3QgRlRDX0lGYW1pbHlDbGFzc1JlYyAgZnRjX2Jhc2ljX2ltYWdlX2ZhbWlseV9jbGFzcyA9Ci0rICBGVENfSUZhbWlseUNsYXNzUmVjICBmdGNfYmFzaWNfaW1hZ2VfZmFtaWx5X2NsYXNzID0KLSAgIHsKLSAgICAgewotICAgICAgIHNpemVvZiAoIEZUQ19CYXNpY0ZhbWlseVJlYyApLAotQEAgLTI2Niw3ICsyNjYsNyBAQAotCi0KLSAgIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotLSAgY29uc3QgRlRDX0dDYWNoZUNsYXNzUmVjICBmdGNfYmFzaWNfaW1hZ2VfY2FjaGVfY2xhc3MgPQotKyAgRlRDX0dDYWNoZUNsYXNzUmVjICBmdGNfYmFzaWNfaW1hZ2VfY2FjaGVfY2xhc3MgPQotICAgewotICAgICB7Ci0gICAgICAgZnRjX2lub2RlX25ldywKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLSBlbmQgb2YgUFJPQkxFTVMgLS0tCmRpZmYgLS1naXQgYS9kb2NzL1RPRE8gYi9kb2NzL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzA0YjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotSGVyZSBpcyBhIGxpc3Qgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGFkZHJlc3NlZCBpbiBGcmVlVHlwZSAyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKiBJbXBsZW1lbnQgc3RlbTMvY291bnRlciBoaW50cyBwcm9wZXJseSBpbiB0aGUgUG9zdHNjcmlwdCBoaW50ZXIuCi0KLSogQWRkIENJRENNYXAgc3VwcG9ydCB0byB0aGUgQ0lEIGRyaXZlci4KLQotKiBBZGQgdHJhY2sga2VybmluZyBzdXBwb3J0IHRvIHRoZSBQRlIgZHJpdmVyLgotCi0qIEFkZCBrZXJuaW5nIChBRk0gZmlsZSkgc3VwcG9ydCB0byB0aGUgQ0lEIGRyaXZlci4KLQotCi1IZXJlIGlzIGEgbGlzdCBvZiBidWdzIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU90aGVyIGJ1Z3MgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYXQgdGhlIHNhdmFubmFoIGJ1Z3ppbGxhIG9mIEZyZWVUeXBlLgotCi0qIENJRCBkcml2ZXI6Ci0gICAgSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgQ0lEIGZvbnQgaGFzIGEgdG9wLWxldmVsIGZvbnQgbWF0cml4IGFsc28KLSAgICAoc2VlIFBMUk0sIDUuMTEuMywgVHlwZSAwIENJREZvbnRzKS4gIFNpbmNlIENJRF9GYWNlSW5mb1JlYyBsYWNrcwotICAgIGEgZm9udF9tYXRyaXggZW50cnkgd2UgaGF2ZSB0byBkaXJlY3RseSBhcHBseSBpdCB0byBhbGwgc3ViZm9udAotICAgIG1hdHJpY2VzLgotCi0qIENJRCBkcml2ZXI6Ci0gICAgVXNlIHRvcC1sZXZlbCBmb250IG1hdHJpeCBlbnRyeSBmb3Igc2V0dGluZyB0aGUgdXBlbSB2YWx1ZSwgbm90IHRoZQotICAgIGVudHJpZXMgaW4gdGhlIEZEYXJyYXkuICBJZiBhYnNlbnQsIHVzZSAxMDAwLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDEtMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzICBmaWxlICBpcyAgcGFydCAgb2YgdGhlICBGcmVlVHlwZSAgcHJvamVjdCwgYW5kIG1heSAgb25seSBiZSAgdXNlZCwKLW1vZGlmaWVkLCAgYW5kICBkaXN0cmlidXRlZCAgdW5kZXIgIHRoZSAgdGVybXMgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdAotbGljZW5zZSwgTElDRU5TRS5UWFQuICAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzCi1maWxlIHlvdSAgaW5kaWNhdGUgdGhhdCAgeW91IGhhdmUgIHJlYWQgdGhlICBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kICBhbmQKLWFjY2VwdCBpdCBmdWxseS4KLQotCi0tLS0gZW5kIG9mIFRPRE8gLS0tCmRpZmYgLS1naXQgYS9kb2NzL1ZFUlNJT05TLlRYVCBiL2RvY3MvVkVSU0lPTlMuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTE2ZDM0Li4wMDAwMDAwCi0tLSBhL2RvY3MvVkVSU0lPTlMuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLUR1ZSAgdG8gb3VyICB1c2Ugb2YgIGBsaWJ0b29sJyB0byAgZ2VuZXJhdGUgYW5kICBpbnN0YWxsIHRoZSAgRnJlZVR5cGUgMgotbGlicmFyaWVzIG9uICBVbml4IHN5c3RlbXMsIGFzICB3ZWxsIGFzICBvdGhlciBoaXN0b3JpY2FsIGV2ZW50cywgIGl0IGlzCi1nZW5lcmFsbHkgdmVyeSAgZGlmZmljdWx0IHRvICBrbm93IHByZWNpc2VseSB3aGljaCAgcmVsZWFzZSBvZiAgdGhlIGZvbnQKLWVuZ2luZSBpcyBpbnN0YWxsZWQgb24gYSBnaXZlbiBzeXN0ZW0uCi0KLVRoaXMgZmlsZSB0cmllcyAgdG8gZXhwbGFpbiB3aHkgYW5kIHRvIGRvY3VtZW50ICB3YXlzIHRvIHByb3Blcmx5IGRldGVjdAotRnJlZVR5cGUgb24gVW5peC4KLQotCi0xLiBWZXJzaW9uIGFuZCBSZWxlYXNlIG51bWJlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Gb3IgZWFjaCBuZXcgIHB1YmxpYyByZWxlYXNlIG9mIEZyZWVUeXBlIDIsIHRoZXJlICBhcmUgZ2VuZXJhbGx5ICp0aHJlZSoKLWRpc3RpbmN0IGB2ZXJzaW9uJyBudW1iZXJzIHRvIGNvbnNpZGVyOgotCi0gICogVGhlIG9mZmljaWFsIEZyZWVUeXBlIDIgcmVsZWFzZSBudW1iZXIsIGxpa2UgMi4zLjEgb3IgMi40LjEwLgotCi0gICogVGhlIGxpYnRvb2wgKGFuZCAgVW5peCkgc3BlY2lmaWMgdmVyc2lvbiBudW1iZXIsICBsaWtlIDEzLjAuNy4gIFRoaXMKLSAgICBpcyB3aGF0IGBmcmVldHlwZS1jb25maWcgLS12ZXJzaW9uJyByZXR1cm5zLgotCi0gICogVGhlIHBsYXRmb3JtLXNwZWNpZmljICBzaGFyZWQgb2JqZWN0ICBudW1iZXIsIHVzZWQgZm9yICBleGFtcGxlIHdoZW4KLSAgICB0aGUgbGlicmFyeSBpcyBpbnN0YWxsZWQgYXMgYC91c3IvbGliL2xpYmZyZWV0eXBlLnNvLjYuNy4xJy4KLQotVGhlIHBsYXRmb3JtLXNwZWNpZmljICBudW1iZXIgaXMsIHVuc3VycHJpc2luZ2x5LCAgcGxhdGZvcm0tc3BlY2lmaWMgYW5kCi12YXJpZXMgIHdpdGggdGhlICBvcGVyYXRpbmcgc3lzdGVtICB5b3UgYXJlICB1c2luZyAoc2V2ZXJhbCAgdmFyaWFudHMgb2YKLUxpbnV4LCBGcmVlQlNELCAgU29sYXJpcywgZXRjLikuICBZb3UgIHNob3VsZCB0aHVzIF9uZXZlcl8gdXNlICBpdCwgZXZlbgotZm9yIHNpbXBsZSB0ZXN0cy4KLQotVGhlIGxpYnRvb2wtc3BlY2lmaWMgIG51bWJlciBkb2VzICBub3QgZXF1YWwgdGhlICByZWxlYXNlIG51bWJlciAgYnV0IGlzCi10aWVkIHRvIGl0LgotCi1UaGUgcmVsZWFzZSBudW1iZXIgaXMgYXZhaWxhYmxlICBhdCAqY29tcGlsZSogdGltZSB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKLW1hY3JvcyBkZWZpbmVkIGluIEZUX0ZSRUVUWVBFX0g6Ci0KLSAgLSBGUkVFVFlQRV9NQUpPUjogbWFqb3IgcmVsZWFzZSBudW1iZXIKLSAgLSBGUkVFVFlQRV9NSU5PUjogbWlub3IgcmVsZWFzZSBudW1iZXIKLSAgLSBGUkVFVFlQRV9QQVRDSDogcGF0Y2ggcmVsZWFzZSBudW1iZXIKLQotU2VlIGJlbG93IGZvciBhIHNtYWxsIGF1dG9jb25mIGZyYWdtZW50LgotCi1UaGUgIHJlbGVhc2UgIG51bWJlciAgIGlzICBhbHNvICBhdmFpbGFibGUgIGF0ICAgKnJ1bnRpbWUqICB0aHJvdWdoICB0aGUKLWBGVF9MaWJyYXJ5X1ZlcnNpb24nIEFQSS4KLQotCi0yLiBIaXN0b3J5Ci0tLS0tLS0tLS0tCi0KLVRoZSAgZm9sbG93aW5nICAgdGFibGUgIGdpdmVzLCAgZm9yICAgYWxsICByZWxlYXNlcyAgc2luY2UgICAyLjQuMCwgIHRoZQotY29ycmVzcG9uZGluZyBsaWJ0b29sIG51bWJlciwgYXMgd2VsbCAgYXMgdGhlIHNoYXJlZCBvYmplY3QgbnVtYmVyIGZvdW5kCi1vbiBfbW9zdF8gc3lzdGVtcywgYnV0IG5vdCBhbGwgb2YgdGhlbToKLQotCi0gICAgcmVsZWFzZSAgICAgbGlidG9vbCAgICAgc28KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAyLjguMCAgICAgIDIwLjAuMTQgICA2LjE0LjAKLSAgICAgMi43LjEgICAgICAxOS4wLjEzICAgNi4xMy4wCi0gICAgIDIuNy4wICAgICAgMTguNi4xMiAgIDYuMTIuNgotICAgICAyLjYuNSAgICAgIDE4LjUuMTIgICA2LjEyLjUKLSAgICAgMi42LjQgICAgICAxOC40LjEyICAgNi4xMi40Ci0gICAgIDIuNi4zICAgICAgMTguMy4xMiAgIDYuMTIuMwotICAgICAyLjYuMiAgICAgIDE4LjIuMTIgICA2LjEyLjIKLSAgICAgMi42LjEgICAgICAxOC4xLjEyICAgNi4xMi4xCi0gICAgIDIuNi4wICAgICAgMTguMC4xMiAgIDYuMTIuMAotICAgICAyLjUuNSAgICAgIDE3LjQuMTEgICA2LjExLjQKLSAgICAgMi41LjQgICAgICAxNy4zLjExICAgNi4xMS4zCi0gICAgIDIuNS4zICAgICAgMTcuMi4xMSAgIDYuMTEuMgotICAgICAyLjUuMiAgICAgIDE3LjEuMTEgICA2LjExLjEKLSAgICAgMi41LjEgICAgICAxNy4wLjExICAgNi4xMS4wCi0gICAgIDIuNS4wICAgICAgMTYuMi4xMCAgIDYuMTAuMgotICAgICAyLjQuMTIgICAgIDE2LjEuMTAgICA2LjEwLjEKLSAgICAgMi40LjExICAgICAxNi4wLjEwICAgNi4xMC4wCi0gICAgIDIuNC4xMCAgICAgMTUuMC45ICAgIDYuOS4wCi0gICAgIDIuNC45ICAgICAgMTQuMS44ICAgIDYuOC4xCi0gICAgIDIuNC44ICAgICAgMTQuMC44ICAgIDYuOC4wCi0gICAgIDIuNC43ICAgICAgMTMuMi43ICAgIDYuNy4yCi0gICAgIDIuNC42ICAgICAgMTMuMS43ICAgIDYuNy4xCi0gICAgIDIuNC41ICAgICAgMTMuMC43ICAgIDYuNy4wCi0gICAgIDIuNC40ICAgICAgMTIuMi42ICAgIDYuNi4yCi0gICAgIDIuNC4zICAgICAgMTIuMS42ICAgIDYuNi4xCi0gICAgIDIuNC4yICAgICAgMTIuMC42ICAgIDYuNi4wCi0gICAgIDIuNC4xICAgICAgMTEuMS41ICAgIDYuNS4xCi0gICAgIDIuNC4wICAgICAgMTEuMC41ICAgIDYuNS4wCi0KLQotMy4gQXV0b2NvbmYgQ29kZSBGcmFnbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MYXJzIENsYXVzZW4gY29udHJpYnV0ZWQgdGhlIGZvbGxvd2luZyBhdXRvY29uZiBmcmFnbWVudCB0byBkZXRlY3Qgd2hpY2gKLXZlcnNpb24gb2YgIEZyZWVUeXBlIGlzICBpbnN0YWxsZWQgb24gIGEgc3lzdGVtLiAgVGhpcyAgb25lIHRlc3RzICBmb3IgYQotdmVyc2lvbiB0aGF0ICBpcyBhdCBsZWFzdCAyLjAuOTsgIHlvdSBzaG91bGQgY2hhbmdlIGl0ICB0byBjaGVjayBhZ2FpbnN0Ci1vdGhlciByZWxlYXNlIG51bWJlcnMuCi0KLQotICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgRnJlZVR5cGUgdmVyc2lvbiBpcyAyLjAuOSBvciBoaWdoZXJdKQotICBvbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLSAgQ1BQRkxBR1M9YGZyZWV0eXBlLWNvbmZpZyAtLWNmbGFnc2AKLSAgQUNfVFJZX0NQUChbCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2lmIChGUkVFVFlQRV9NQUpPUioxMDAwICsgRlJFRVRZUEVfTUlOT1IpKjEwMDAgKyBGUkVFVFlQRV9QQVRDSCA8IDIwMDAwMDkKLSNlcnJvciBGcmVldHlwZSB2ZXJzaW9uIHRvbyBsb3cuCi0jZW5kaWYKLSAgXSwKLSAgW0FDX01TR19SRVNVTFQoeWVzKQotICAgRlJFRVRZUEVfTElCUz1gZnJlZXR5cGUtY29uZmlnIC0tbGlic2AKLSAgIEFDX1NVQlNUKEZSRUVUWVBFX0xJQlMpCi0gICBBQ19ERUZJTkUoSEFWRV9GUkVFVFlQRSwxLFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEZyZWVUeXBlMiBsaWJyYXJ5XSkKLSAgIENQUEZMQUdTPSIkb2xkX0NQUEZMQUdTIl0sCi0gIFtBQ19NU0dfRVJST1IoW05lZWQgRnJlZVR5cGUgbGlicmFyeSB2ZXJzaW9uIDIuMC45IG9yIGhpZ2hlcl0pXSkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHlyaWdodCAyMDAyLTIwMTcgYnkKLURhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLQotVGhpcyAgZmlsZSBpcyAgcGFydCAgb2YgdGhlICBGcmVlVHlwZSAgcHJvamVjdCwgYW5kICBtYXkgIG9ubHkgYmUgIHVzZWQsCi1tb2RpZmllZCwgIGFuZCAgZGlzdHJpYnV0ZWQgdW5kZXIgIHRoZSAgdGVybXMgIG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QKLWxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyAgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcwotZmlsZSAgeW91IGluZGljYXRlIHRoYXQgIHlvdSBoYXZlICByZWFkIHRoZSAgbGljZW5zZSBhbmQgIHVuZGVyc3RhbmQgYW5kCi1hY2NlcHQgaXQgZnVsbHkuCi0KLQotLS0tIGVuZCBvZiBWRVJTSU9OUy5UWFQgLS0tCmRpZmYgLS1naXQgYS9kb2NzL2Zvcm1hdHMudHh0IGIvZG9jcy9mb3JtYXRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0OTRmMC4uMDAwMDAwMAotLS0gYS9kb2NzL2Zvcm1hdHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLVRoaXMgIGZpbGUgY29udGFpbnMgIGEgbGlzdCAgb2YgdmFyaW91cyAgZm9udCBmb3JtYXRzLiAgIEl0IGdpdmVzICB0aGUKLXJlZmVyZW5jZSBkb2N1bWVudCBhbmQgd2hldGhlciBpdCBpcyBzdXBwb3J0ZWQgaW4gRnJlZVR5cGUgMi4KLQotVGFibGUgZmllbGRzCi0tLS0tLS0tLS0tLS0KLQotICB3cmFwcGVyIGZvcm1hdAotICAgIFRoZSBmb3JtYXQgdXNlZCB0byByZXByZXNlbnQgdGhlIGZvbnQgZGF0YS4gIEluIHRoZSB0YWJsZSBiZWxvdyBpdAotICAgIGlzICB1c2VkIG9ubHkgIGlmIHRoZSAgZm9udCBmb3JtYXQgIGRpZmZlcnMuICBQb3NzaWJsZSAgdmFsdWVzIGFyZQotCi0gICAgICBTRk5UICBiaW5hcnkKLSAgICAgIFBGQiAgIGJpbmFyeQotICAgICAgUFMgICAgYSB0ZXh0IGhlYWRlciwgZm9sbG93ZWQgYnkgIGJpbmFyeSBvciB0ZXh0IGRhdGEKLSAgICAgIExaVyAgIGNvbXByZXNzZWQgd2l0aCAgZWl0aGVyIGBnemlwJyBvciBgY29tcHJlc3MnCi0gICAgICBCWjIgICBjb21wcmVzc2VkIHdpdGggYGJ6aXAyJy4KLQotICBmb250IGZvcm1hdAotICAgIEhvdyB0aGUgZm9udCBpcyB0byBiZSBhY2Nlc3NlZCwgcG9zc2libHkgYWZ0ZXIgY29udmVydGluZyB0aGUgZmlsZQotICAgIHR5cGUgYW5kIHdyYXBwZXIgIGZvcm1hdCBpbnRvIGEgZ2VuZXJpYyBmb3JtLiAgIEJpdG1hcCBmb3JtYXRzIGFyZQotICAgIGBCREYnLCAgYFBDRicsIGFuZCAgb25lIGZvcm0gIG9mIGBXSU5GTlQnOyAgYWxsIG90aGVycyAgYXJlIHZlY3RvcgotICAgIGZvcm1hdHMuICAgYFBTJyBpbmRpY2F0ZXMgIHRoaXJkLW9yZGVyLCAgYFRUJyBzZWNvbmQtb3JkZXIgIELDqXppZXIKLSAgICBjdXJ2ZXMuCi0KLSAgZm9udCB0eXBlCi0gICAgU3ViLWZvcm1hdHMgb2YgdGhlICBmb250IGZvcm1hdC4gIGBTQklUJyBhbmQgIGBNQUNTQklUJyBhcmUgYml0bWFwCi0gICAgZm9ybWF0cywgIGBNTScgYW5kICBgVkFSJyBzdXBwb3J0ICBvcHRpY2FsIGF4ZXMuICAgYENGRjInIHN1cHBvcnRzCi0gICAgb3B0aWNhbCBheGVzIGFsc28uCi0KLSAgZ2x5cGggYWNjZXNzCi0gICAgSWYgIG5vdCBzcGVjaWZpZWQsICB0aGUgZ2x5cGggIGFjY2VzcyAgaXMgYHN0YW5kYXJkJyAgdG8gdGhlICBmb250Ci0gICAgZm9ybWF0LiAgIFZhbHVlcyBhcmUgIGBDSUQnIGZvciAgQ0lELWtleWVkIGZvbnRzLCAgYFNZTlRIRVRJQycgZm9yCi0gICAgZm9udHMgdGhhdCAgYXJlIG1vZGlmaWVkICB2ZXJzaW9ucyBvZiAgb3RoZXIgZm9udHMgIGJ5IG1lYW5zICBvZiBhCi0gICAgdHJhbnNmb3JtYXRpb24gbWF0cml4LCBhbmQgIGBUWVBFXzAnIGZvciBQUyBmb250cyB3aGljaCAgYXJlIHRvIGJlCi0gICAgYWNjZXNzZWQgaW4gYSB0cmVlLWxpa2Ugc3RydWN0dXJlLgotCi0gIEZyZWVUeXBlIGRyaXZlcgotICAgIFRoZSBtb2R1bGUgaW4gdGhlIEZyZWVUeXBlIGxpYnJhcnkgd2hpY2ggaGFuZGxlcyB0aGUgc3BlY2lmaWMgZm9udAotICAgIGZvcm1hdC4gIEEgbWlzc2luZyAgZW50cnkgbWVhbnMgdGhhdCBGcmVlVHlwZSAgZG9lc24ndCBzdXBwb3J0IHRoZQotICAgIGZvbnQgZm9ybWF0ICh5ZXQpLgotCi0KLU5vdGVzCi0tLS0tLQotCi0gIFRoZSAgU0ZOVCAgY29udGFpbmVyICBmb3JtYXQgYWxzbyAgcHJvdmlkZXMgIGBjb2xsZWN0aW9ucycgICh1c3VhbGx5Ci0gIGhhdmluZyB0aGUgZmlsZSBleHRlbnNpb24gYC50dGMnICBvciBgLm90YycpLiAgQSBjb2xsZWN0aW9uIGNvbnRhaW5zCi0gIG11bHRpcGxlIGZvbnQgZmFjZXMgdGhhdCBzaGFyZSBzb21lIHRhYmxlcyB0byBhdm9pZCByZWR1bmRhbmN5LCB0aHVzCi0gIHJlZHVjaW5nIHRoZSBmaWxlICBzaXplLiAgSW4gRnJlZVR5cGUsIGVsZW1lbnRzIG9mICBhIGNvbGxlY3Rpb24gY2FuCi0gIGJlIGFjY2Vzc2VkIHdpdGggYSBwcm9wZXIgZmFjZSBpbmRleC4KLQotICBCb3RoICB0aGUgR1ggIGFuZCB0aGUgIE9wZW5UeXBlIDEuOCAgdmFyaWF0aW9uIGZvbnRzICBwcm92aWRlIGBuYW1lZAotICBpbnN0YW5jZXMnLiAgRnJlZVR5cGUgIG1hcHMgdGhlbSB0byAgZmFjZSBpbmRpY2VzICh0aGV5IGNhbiAgYWxzbyBiZQotICBhY2Nlc3NlZCB3aXRoIHRoZSBzdGFuZGFyZCBNTSBpbnRlcmZhY2UpLgotCi0gIE90aGVyICBmb250ICBmb3JtYXRzICAobm90ICB1c2luZyB0aGUgIFNGTlQgIHdyYXBwZXIpICBhbHNvICBwcm92aWRlCi0gIG11bHRpcGxlIGZhY2VzICB3aXRoaW4gb25lICBmaWxlOyB0aGV5IGFyZSAgbWFya2VkIHdpdGggIGFuIGFzdGVyaXNrCi0gIChgKicpIGluIHRoZSB0YWJsZSBiZWxvdy4KLQotICBGcmVlVHlwZSBjYW4gIGJlIGNvbmZpZ3VyZWQgdG8gIHN1cHBvcnQgTWFjICBmaWxlcyAob24gb2xkZXIgIE1hYyBPUwotICB2ZXJzaW9ucywgYSBgZmlsZScgaXMgc3RvcmVkIGFzIGEgZGF0YSBhbmQgYSByZXNvdXJjZSBmb3JrLCB0aGlzIGlzLAotICB3aXRoaW4gdHdvICBzZXBhcmF0ZSBkYXRhIGNodW5rcykuICBJZiAgYSBmaWxlIGNhbid0IGJlICBvcGVuZWQgYXMgYQotICBmb250LCBGcmVlVHlwZSB0aGVuIGNoZWNrcyB3aGV0aGVyIGl0ICBpcyBhIHJlc291cmNlIGZvcmssIHRyeWluZyB0bwotICBleHRyYWN0ICB0aGUgY29udGFpbmVkICBmb250IGRhdGEgIGZyb20gIGVpdGhlciBhICBgUE9TVCcgb3IgIGBzZm50JwotICByZXNvdXJjZS4KLQotCi1QbGVhc2UgIHNlbmQgYWRkaXRpb25zICBhbmQvb3IgIGNvcnJlY3Rpb25zIHRvICB3bEBnbnUub3JnICBvciB0byAgdGhlCi1GcmVlVHlwZSAgIGRldmVsb3BlcidzICAgbGlzdCAgICBhdCAgIGZyZWV0eXBlLWRldmVsQG5vbmdudS5vcmcgICAoZm9yCi1zdWJzY3JpYmVycyBvbmx5KS4gICBJZiB5b3UgY2FuICBwcm92aWRlIGEgIGZvbnQgZXhhbXBsZSBmb3IgIGEgZm9ybWF0Ci13aGljaCBpc24ndCBzdXBwb3J0ZWQgeWV0IHBsZWFzZSBzZW5kIGEgbWFpbCB0b28uCi0KLQotICB3cmFwcGVyIGZvbnQgICAgZm9udCAgICBnbHlwaCAgICAgIEZyZWVUeXBlIHJlZmVyZW5jZQotICBmb3JtYXQgIGZvcm1hdCAgdHlwZSAgICBhY2Nlc3MgICAgIGRyaXZlciAgIGRvY3VtZW50cwotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLS0tICAgICBCREYgICAgIC0tLSAgICAgLS0tICAgICAgICBiZGYgICAgICA1MDA1LkJERl9TcGVjLnBkZiwgWDExCi0KLQotICBTRk5UICAgIFBTICAgICAgVFlQRV8xICAtLS0gICAgICAgIHR5cGUxICAgIFR5cGUgMSBHWCBGb250IEZvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgdGhlIE1hYykgWzNdCi0gIFNGTlQgICAgUFMgICAgICBUWVBFXzEgIENJRCAgICAgICAgY2lkICAgICAgNTE4MC5zZm50LnBkZiAoZm9yIHRoZSBNYWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzNdCi0gIFNGTlQgICAgUFMgICAgICBDRkYgICAgIC0tLSAgICAgICAgY2ZmICAgICAgT1Qgc3BlYywgNTE3Ni5DRkYucGRmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGBPVFRPJyBmb3JtYXQpCi0gIFNGTlQgICAgUFMgICAgICBDRkYgICAgIENJRCAgICAgICAgY2ZmICAgICAgT1Qgc3BlYywgNTE3Ni5DRkYucGRmCi0gIFNGTlQgICAgUFMgICAgICBDRkYgICAgIFNZTlRIRVRJQyAgLS0tICAgICAgT1Qgc3BlYywgNTE3Ni5DRkYucGRmCi0gIFNGTlQgICAgUFMgICAgICBDRkYyICAgIC0tLSAgICAgICAgY2ZmICAgICAgT1Qgc3BlYyAxLjgKLQotICBTRk5UICAgIFRUICAgICAgU0JJVCAgICAtLS0gICAgICAgIHNmbnQgICAgIFhGcmVlODYgKGJpdG1hcHMgb25seTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGBoZWFkJyB0YWJsZSkKLSAgU0ZOVCAgICBUVCAgICAgIE1BQ1NCSVQgLS0tICAgICAgICBzZm50ICAgICBPVCBzcGVjIChmb3IgdGhlIE1hYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBzIG9ubHk7IGBiaGVkJyB0YWJsZSkKLSAgU0ZOVCAgICBUVCAgICAgIC0tLSAgICAgLS0tICAgICAgICB0cnVldHlwZSBPVCBzcGVjIChgbm9ybWFsJyBUVCBmb250KQotICBTRk5UICAgIFRUICAgICAgVkFSICAgICAtLS0gICAgICAgIHRydWV0eXBlIEdYIHNwZWMgKGA/dmFyJyB0YWJsZXMpCi0gIFNGTlQgICAgVFQgICAgICBWQVIgICAgIC0tLSAgICAgICAgdHJ1ZXR5cGUgT1Qgc3BlYyAxLjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYD92YXInICsgYD9WQVInIHRhYmxlcykKLQotCi0gIC0tLSAgICAgUFMgICAgICBUWVBFXzEgIC0tLSAgICAgICAgdHlwZTEgICAgVDFfU1BFQy5wZGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUEZBLCBUeXBlIDEgZm9udCByZXNvdXJjZSkKLSAgUEZCICAgICBQUyAgICAgIFRZUEVfMSAgLS0tICAgICAgICB0eXBlMSAgICBUMV9TUEVDLnBkZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDQwLkRvd25sb2FkX0ZvbnRzLnBkZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChgbm9ybWFsJyBUeXBlIDEgZm9udCkKLSAgLS0tICAgICBQUyAgICAgIFRZUEVfMSAgQ0lEICAgICAgICBjaWQgICAgICBQTFJNLnBkZiAoQ0lEIEZvbnQgVHlwZSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgOSBmb250KQotICAtLS0gICAgIFBTICAgICAgTU0gICAgICAtLS0gICAgICAgIHR5cGUxICAgIDUwMTUuVHlwZTFfU3VwcC5wZGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTXVsdGlwbGUgTWFzdGVycykKLSAgLS0tICAgICBQUyAgICAgIENGRiAgICAgLS0tICAgICAgICBjZmYgICAgICA1MTc2LkNGRi5wZGYgKGBwdXJlJyBDRkYpCi0gIC0tLSAgICAgUFMqICAgICBDRkYgICAgIENJRCAgICAgICAgY2ZmICAgICAgNTE3Ni5DRkYucGRmIChgcHVyZScgQ0ZGKQotICAtLS0gICAgIFBTICAgICAgQ0ZGICAgICBTWU5USEVUSUMgIC0tLSAgICAgIDUxNzYuQ0ZGLnBkZiAoYHB1cmUnIENGRikKLSAgLS0tICAgICBQUyAgICAgIENGRi9NTSAgLS0tICAgICAgICBjZmYgICAgICBvbGQgNTE2Ny5DRkYucGRmIChgcHVyZScgQ0ZGKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFszXQotICAtLS0gICAgIFBTKiAgICAgQ0ZGL01NICBDSUQgICAgICAgIGNmZiAgICAgIG9sZCA1MTY3LkNGRi5wZGYgKGBwdXJlJyBDRkYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzNdCi0gIC0tLSAgICAgUFMgICAgICBDRkYvTU0gIFNZTlRIRVRJQyAgLS0tICAgICAgb2xkIDUxNjcuQ0ZGLnBkZiAoYHB1cmUnIENGRikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbM10KLSAgUFMgICAgICBQUyAgICAgIENGRiAgICAgLS0tICAgICAgICAtLS0gICAgICBQTFJNLnBkZiAoVHlwZSAyKSBbMV0KLSAgUFMgICAgICBQUyogICAgIENGRiAgICAgQ0lEICAgICAgICAtLS0gICAgICBQTFJNLnBkZiAoVHlwZSAyKSBbMV0KLSAgUFMgICAgICBQUyAgICAgIENGRiAgICAgU1lOVEhFVElDICAtLS0gICAgICBQTFJNLnBkZiAoVHlwZSAyKSBbMV0KLSAgUFMgICAgICBQUyAgICAgIENGRi9NTSAgLS0tICAgICAgICAtLS0gICAgICBQTFJNLnBkZiAoVHlwZSAyKSBbMV0KLSAgUFMgICAgICBQUyogICAgIENGRi9NTSAgQ0lEICAgICAgICAtLS0gICAgICBQTFJNLnBkZiAoVHlwZSAyKSBbMV0KLSAgUFMgICAgICBQUyAgICAgIENGRi9NTSAgU1lOVEhFVElDICAtLS0gICAgICBQTFJNLnBkZiAoVHlwZSAyKSBbMV0KLSAgLS0tICAgICBQUyAgICAgIC0tLSAgICAgVFlQRV8wICAgICAtLS0gICAgICBQTFJNLnBkZgotICAtLS0gICAgIFBTICAgICAgVFlQRV8zICAtLS0gICAgICAgIC0tLSAgICAgIFBMUk0ucGRmIChuZXZlciBzdXBwb3J0ZWQpCi0gIC0tLSAgICAgUFMgICAgICBUWVBFXzMgIENJRCAgICAgICAgLS0tICAgICAgUExSTS5wZGYgKENJRCBGb250IFR5cGUgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDEwIGZvbnQ7IG5ldmVyIHN1cHBvcnRlZCkKLSAgUFMgICAgICBQUyAgICAgIFRZUEVfMTQgLS0tICAgICAgICAtLS0gICAgICBQTFJNLnBkZiAoQ2hhbWVsZW9uIGZvbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAxNCBmb250OyBuZXZlciBzdXBwb3J0ZWQ/KQotICAtLS0gICAgIFBTICAgICAgVFlQRV8zMiBDSUQgICAgICAgIC0tLSAgICAgIFBMUk0ucGRmIChDSUQgRm9udCBUeXBlIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAzMiBmb250OyBuZXZlciBzdXBwb3J0ZWQ/KQotICBQUyAgICAgIFRUICAgICAgLS0tICAgICAtLS0gICAgICAgIHR5cGU0MiAgIDUwMTIuVHlwZTQyX1NwZWMucGRmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFR5cGUgNDIgZm9udCkKLSAgUFMgICAgICBUVCAgICAgIC0tLSAgICAgQ0lEICAgICAgICAtLS0gICAgICBQTFJNLnBkZiAoQ0lEIEZvbnQgVHlwZSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgMTEgZm9udCkKLQotCi0gID8gICAgICAgPyAgICAgICBDRUYgICAgID8gICAgICAgICAgY2ZmICAgICAgPwotCi0KLSAgLS0tICAgICBQQ0YgICAgIC0tLSAgICAgLS0tICAgICAgICBwY2YgICAgICBYMTEgWzRdCi0gIExaVyAgICAgUENGICAgICAtLS0gICAgIC0tLSAgICAgICAgcGNmICAgICAgWDExIFs0XQotICBCWjIgICAgIFBDRiAgICAgLS0tICAgICAtLS0gICAgICAgIHBjZiAgICAgIFgxMSBbNF0KLQotCi0gIC0tLSAgICAgUEZSKiAgICBQRlIwICAgIC0tLSAgICAgICAgcGZyICAgICAgWzJdCi0gIC0tLSAgICAgUEZSICAgICBQRlIxICAgIC0tLSAgICAgICAgLS0tICAgICAgKHVuZG9jdW1lbnRlZCwgcHJvcHJpZXRhcnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmFibHkgbmV2ZXIgc3VwcG9ydGVkKQotCi0KLSAgLS0tICAgICBXSU5GTlQqIC0tLSAgICAgLS0tICAgICAgICB3aW5mb250cyBXaW5kb3dzIGRldmVsb3BlcidzIG5vdGVzIFs1XQotICAtLS0gICAgIFdJTkZOVCAgVkVDVE9SICAtLS0gICAgICAgIC0tLSAgICAgIFdpbmRvd3MgZGV2ZWxvcGVyJ3Mgbm90ZXMgWzVdCi0KLQotWzFdIFN1cHBvcnQgc2hvdWxkICBiZSByYXRoZXIgc2ltcGxlIHNpbmNlIHRoaXMgaXMgIGlkZW50aWNhbCB0byBgQ0ZGJwotICAgIGJ1dCBpbiBhIFBTIHdyYXBwZXIuCi0KLVsyXSBPZmZpY2lhbCBQRlIgc3BlY2lmaWNhdGlvbjoKLQotICAgICAgaHR0cDovL3d3dy5iaXRzdHJlYW0uY29tL2NhdGVnb3JpZXMvZGV2ZWxvcGVyL3RydWVkb2MvcGZyc3BlYy5odG1sCi0gICAgICBodHRwOi8vd3d3LmJpdHN0cmVhbS5jb20vY2F0ZWdvcmllcy9kZXZlbG9wZXIvdHJ1ZWRvYy9wZnJzcGVjMS4yLnBkZgotCi0gICAgVGhlIHN5bnRheCAgb2YgdGhlICBhdXhpbGlhcnkgZGF0YSAgaXMgbm90ICBkZWZpbmVkIHRoZXJlLCAgYnV0IGlzCi0gICAgcGFydGlhbGx5IGRlZmluZWQgaW4gTUhQIDEuMC4zIChhbHNvIGNhbGxlZCBFVFNJIFRTIDEwMTgxMiBWMS4zLjEpCi0gICAgc2VjdGlvbiA3LjQuCi0KLSAgICAgIGh0dHA6Ly93d3cuZXRzaS5vcmcvCi0gICAgICBodHRwOi8vd2ViYXBwLmV0c2kub3JnL3dvcmtwcm9ncmFtL1JlcG9ydF9Xb3JrSXRlbS5hc3A/V0tJX0lEPTE4Nzk5Ci0KLSAgICAoZnJlZSByZWdpc3RyYXRpb24gcmVxdWlyZWQpLgotCi1bM10gU3VwcG9ydCAgaXMgcnVkaW1lbnRhcnkgIGN1cnJlbnRseTsgc29tZSAgdGFibGVzIG9yICBkYXRhIGFyZSAgbm90Ci0gICAgbG9hZGVkIHlldC4KLQotWzRdIFNlZQotCi0gICAgICBUSEUgWCBXSU5ET1cgU1lTVEVNIFNFUlZFUjogWCBWRVJTSU9OIDExLCBSRUxFQVNFIDUKLSAgICAgIEVsaWFzIElzcmFlbCwgRXJpayBGb3J0dW5lLCBEaWdpdGFsIFByZXNzLCAxOTkyCi0gICAgICBJU0JOIDEtNTU1NTgtMDk2LTMKLQotICAgIGZvciBhIHNwZWNpZmljYXRpb24gZ2l2ZW4gaW4gQXBwZW5kaXggRCBvbiBwZ3MuIDQzNi00NTAuICBIb3dldmVyLAotICAgIHRoaXMgaW5mb3JtYXRpb24gbWlnaHQgYmUgb3V0ICBvZiBkYXRlOyB1bmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubwotICAgIFBDRiBzcGVjaWZpY2F0aW9uIGF2YWlsYWJsZSBvbmxpbmUsIGFuZCB0aGlzIGJvb2sgaXMgb3V0IG9mIHByaW50LgotICAgIEdlb3JnZSBXaWxsaWFtcyBkZWR1Y2VkICB0aGUgZm9udCBmb3JtYXQgZnJvbSB0aGUgIFgxMSBzb3VyY2VzIGFuZAotICAgIGRvY3VtZW50ZWQgaXQgZm9yIGhpcyBGb250Rm9yZ2UgZm9udCBlZGl0b3I6Ci0KLSAgICAgIGh0dHA6Ly9mb250Zm9yZ2UuZ2l0aHViLmlvL3BjZi1mb3JtYXQuaHRtbAotCi1bNV0gVGhpcyBpcyBmcm9tIE1TIFdpbmRvd3MgMzsgc2VlIE1pY3Jvc29mdCdzIEtub3dsZWRnZSBCYXNlIGFydGljbGUgYXQKLQotICAgICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi82NTEyMwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDQtMjAxNyBieQotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzICBmaWxlIGlzICBwYXJ0ICBvZiB0aGUgIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSAgb25seSBiZSAgdXNlZCwKLW1vZGlmaWVkLCAgYW5kICBkaXN0cmlidXRlZCB1bmRlciAgdGhlICB0ZXJtcyAgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdAotbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nICB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzCi1maWxlICB5b3UgaW5kaWNhdGUgdGhhdCAgeW91IGhhdmUgIHJlYWQgdGhlICBsaWNlbnNlIGFuZCAgdW5kZXJzdGFuZCBhbmQKLWFjY2VwdCBpdCBmdWxseS4KLQotCi0tLS0gZW5kIG9mIGZvcm1hdHMudHh0IC0tLQotCi1Mb2NhbCBWYXJpYWJsZXM6Ci1jb2Rpbmc6IHV0Zi04Ci1FbmQ6CmRpZmYgLS1naXQgYS9kb2NzL2ZyZWV0eXBlLWNvbmZpZy4xIGIvZG9jcy9mcmVldHlwZS1jb25maWcuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhYTFiOS4uMDAwMDAwMAotLS0gYS9kb2NzL2ZyZWV0eXBlLWNvbmZpZy4xCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS5USCBGUkVFVFlQRS1DT05GSUcgMSAiTWF5IDIwMTciICJGcmVlVHlwZSAyLjgiCi0uCi0uCi0uU0ggTkFNRQotLgotZnJlZXR5cGUtY29uZmlnIFwtIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGxpYmZyZWV0eXBlIGluc3RhbGxhdGlvbgotLgotLgotLlNIIFNZTk9QU0lTCi0uCi0uQiBmcmVldHlwZS1jb25maWcKLS5SSSBbIG9wdGlvbnMgXQotLgotLgotLlNIIERFU0NSSVBUSU9OCi0uCi0uQiBmcmVldHlwZS1jb25maWcKLXJldHVybnMgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBjb21waWxpbmcgYW5kIGxpbmtpbmcgcHJvZ3JhbXMgd2l0aCB0aGUKLUZyZWVUeXBlIGxpYnJhcnksIHN1Y2ggYXMgbGlua2VyIGZsYWdzIGFuZCBjb21waWxhdGlvbiBwYXJhbWV0ZXJzLgotLgotQWx0ZXJuYXRpdmVseSwgaXQgY2FuIGJlIHVzZWQgdG8gcXVlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1GcmVlVHlwZSBsaWJyYXJ5IHZlcnNpb24gaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0sIHN1Y2ggYXMgdGhlCi1pbnN0YWxsYXRpb24gKGRpcmVjdG9yeSBwYXRoKSBwcmVmaXggb3IgdGhlIEZyZWVUeXBlIHZlcnNpb24gbnVtYmVyLgotLgotLlBQCi1JZgotLkJSIHBrZy1jb25maWcgKDEpCi1pcyBmb3VuZCBpbiB0aGUgcGF0aCwKLS5CIGZyZWV0eXBlLWNvbmZpZwotYWN0cyBhcyBhIHdyYXBwZXIgZm9yCi0uQlIgcGtnLWNvbmZpZyAuCi0uCi0uUFAKLVRoaXMgcHJvZ3JhbSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwYWNrYWdlLgotLgotLgotLlNIIE9QVElPTlMKLS4KLVRoZXJlIGFyZSB0d28gdHlwZXMgb2Ygb3B0aW9uczogb3V0cHV0L2Rpc3BsYXkgc2VsZWN0aW9uIG9wdGlvbnMsIGFuZAotcGF0aCBvdmVycmlkZSBvcHRpb25zLgotLgotLgotLlNTIE91dHB1dCBzZWxlY3Rpb24gb3B0aW9ucwotLgotT25seSBvbmUgb2YgdGhlIG91dHB1dCBzZWxlY3Rpb24gb3B0aW9ucyBzaG91bGQgYmUgZ2l2ZW4gYXQgZWFjaCBwcm9ncmFtCi1pbnZvY2F0aW9uLgotLgotLlRQCi0uQiBcLVwtcHJlZml4Ci1SZXR1cm4gdGhlIHByZWZpeCB2YWx1ZSBvZiB0aGUgaW5zdGFsbGVkIEZyZWVUeXBlIGxpYnJhcnkgKHRoZSBkZWZhdWx0Ci1wcmVmaXggd2lsbCBiZSBgL3VzcicgaW4gbW9zdCBjYXNlcyBmb3IgZGlzdHJpYnV0aW9uLWluc3RhbGxlZAotcGFja2FnZXMpLgotLgotLlRQCi0uQiBcLVwtZXhlYy1wcmVmaXgKLVJldHVybiB0aGUgZXhlY3V0YWJsZSBwcmVmaXggdmFsdWUgb2YgdGhlIGluc3RhbGxlZCBGcmVlVHlwZSBsaWJyYXJ5Ci0od2lsbCBvZnRlbiBiZSB0aGUgc2FtZSBhcyB0aGUgcHJlZml4IHZhbHVlKS4KLS4KLS5UUAotLkIgXC1cLWZ0dmVyc2lvbgotUmV0dXJuIHRoZSBGcmVlVHlwZSB2ZXJzaW9uIG51bWJlciwgZGlyZWN0bHkgZGVyaXZlZCBmcm9tIGZpbGUKLWBmcmVldHlwZS5oJy4KLS4KLS5UUAotLkIgXC1cLXZlcnNpb24KLVJldHVybiB0aGUgYGxpYnRvb2wgdmVyc2lvbicgb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkuCi0uCi0uVFAKLS5CIFwtXC1saWJ0b29sCi1SZXR1cm4gdGhlIGxpYnJhcnkgbmFtZSBmb3IgbGlua2luZyB3aXRoIGxpYnRvb2wuCi0uCi0uVFAKLS5CIFwtXC1saWJzCi1SZXR1cm4gY29tcGlsZXIgZmxhZ3MgZm9yIGxpbmtpbmcgd2l0aCB0aGUgaW5zdGFsbGVkIEZyZWVUeXBlIGxpYnJhcnkuCi0uCi0uVFAKLS5CIFwtXC1jZmxhZ3MKLVJldHVybiBjb21waWxlciBmbGFncyBmb3IgY29tcGlsaW5nIGFnYWluc3QgdGhlIGluc3RhbGxlZCBGcmVlVHlwZSBsaWJyYXJ5LgotLgotLlRQCi0uQiBcLVwtc3RhdGljCi1NYWtlIGNvbW1hbmQgbGluZSBvcHRpb25zIGRpc3BsYXkgZmxhZ3MgZm9yIHN0YXRpYyBsaW5raW5nLgotLgotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBoZWxwIGFuZCBleGl0LgotLgotLgotLlNTIFBhdGggb3ZlcnJpZGUgb3B0aW9ucwotLgotVGhlc2UgYWZmZWN0IGFueSBzZWxlY3RlZCBvdXRwdXQgb3B0aW9uLCBleGNlcHQgdGhlIGxpYnRvb2wgdmVyc2lvbgotcmV0dXJuZWQgYnkKLS5CUiBcLVwtdmVyc2lvbiAuCi0uCi0uVFAKLS5CSSBcLVwtcHJlZml4PSBQUkVGSVgKLU92ZXJyaWRlCi0uQiBcLVwtcHJlZml4Ci12YWx1ZSB3aXRoCi0uSVIgUFJFRklYIC4KLS4KLVRoaXMgYWxzbyBzZXRzCi0uQkkgXC1cLWV4ZWMtcHJlZml4PSBQUkVGSVgKLWlmIG9wdGlvbgotLkIgXC1cLWV4ZWMtcHJlZml4Ci1pcyBub3QgZXhwbGljaXRseSBnaXZlbi4KLS4KLS5UUAotLkJJIFwtXC1leGVjLXByZWZpeD0gRVBSRUZJWAotT3ZlcnJpZGUKLS5CIFwtXC1leGVjLXByZWZpeAotdmFsdWUgd2l0aAotLklSIEVQUkVGSVggLgotLgotLgotLlNIIEJVR1MKLUluIGNhc2UgdGhlIGxpYnJhcmllcyBGcmVlVHlwZSBsaW5rcyB0byBhcmUgbG9jYXRlZCBpbiBub24tc3RhbmRhcmQKLWRpcmVjdG9yaWVzLCBhbmQKLS5CUiBwa2ctY29uZmlnICgxKQotaXMgbm90IGF2YWlsYWJsZSwgdGhlIG91dHB1dCBmcm9tIG9wdGlvbgotLkIgXC1cLWxpYnMKLW1pZ2h0IGJlIGluY29tcGxldGUuCi0uCi1JdCBpcyB0aHVzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUKLS5CUiBwa2ctY29uZmlnICgxKQotaW50ZXJmYWNlIGluc3RlYWQsIHdoaWNoIGlzIGFibGUgdG8gY29ycmVjdGx5IHJlc29sdmUgYWxsIGRlcGVuZGVuY2llcy4KLS4KLS5QUAotU2V0dGluZwotLkIgXC1cLWV4ZWMtcHJlZml4Ci0oZWl0aGVyIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSkgbWlnaHQgcmV0dXJuIGluY29ycmVjdCByZXN1bHRzIGlmCi1jb21iaW5lZCB3aXRoIG9wdGlvbgotLkJSIFwtXC1zdGF0aWMgLgotLgotVGhlIHNhbWUgcHJvYmxlbSBjYW4gb2NjdXIgaWYgeW91IHNldCB0aGUKLS5CIFNZU1JPT1QKLWVudmlyb25tZW50IHZhcmlhYmxlLgotLgotLgotLlNIIEFVVEhPUgotLgotVGhpcyBtYW51YWwgcGFnZSB3YXMgY29udHJpYnV0ZWQgYnkgTmlzIE1hcnRlbnNlbiA8bmlzLm1hcnRlbnNlbkB3ZWIuZGU+LAotd2l0aCBmdXJ0aGVyIHJlZmluZW1lbnRzIGZyb20gdGhlIEZyZWVUeXBlIHRlYW0uCi0uCi0uCi0uXCIgZW9mCmRpZmYgLS1naXQgYS9kb2NzL3Jhc3Rlci50eHQgYi9kb2NzL3Jhc3Rlci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2ZkMDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9yYXN0ZXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjM1ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgIEhvdyBGcmVlVHlwZSdzIHJhc3Rlcml6ZXIgd29yawotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IERhdmlkIFR1cm5lcgotCi0gICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2VkIDIwMDctRmViLTAxCi0KLQotVGhpcyBmaWxlICBpcyBhbiAgYXR0ZW1wdCB0byBleHBsYWluICB0aGUgaW50ZXJuYWxzIG9mICB0aGUgRnJlZVR5cGUKLXJhc3Rlcml6ZXIuICBUaGUgIHJhc3Rlcml6ZXIgaXMgb2YgIHF1aXRlIGdlbmVyYWwgcHVycG9zZSAgYW5kIGNvdWxkCi1lYXNpbHkgYmUgaW50ZWdyYXRlZCBpbnRvIG90aGVyIHByb2dyYW1zLgotCi0KLSAgSS4gSW50cm9kdWN0aW9uCi0KLSBJSS4gUmVuZGVyaW5nIFRlY2hub2xvZ3kKLSAgICAgMS4gUmVxdWlyZW1lbnRzCi0gICAgIDIuIFByb2ZpbGVzIGFuZCBTcGFucwotICAgICAgICBhLiBTd2VlcGluZyB0aGUgU2hhcGUKLSAgICAgICAgYi4gRGVjb21wb3NpbmcgT3V0bGluZXMgaW50byBQcm9maWxlcwotICAgICAgICBjLiBUaGUgUmVuZGVyIFBvb2wKLSAgICAgICAgZC4gQ29tcHV0aW5nIFByb2ZpbGVzIEV4dGVudHMKLSAgICAgICAgZS4gQ29tcHV0aW5nIFByb2ZpbGVzIENvb3JkaW5hdGVzCi0gICAgICAgIGYuIFN3ZWVwaW5nIGFuZCBTb3J0aW5nIHRoZSBTcGFucwotCi0KLUkuIEludHJvZHVjdGlvbgotPT09PT09PT09PT09PT09Ci0KLSAgQSAgcmFzdGVyaXplciBpcyAgYSBsaWJyYXJ5ICBpbiBjaGFyZ2UgIG9mIGNvbnZlcnRpbmcgIGEgdmVjdG9yaWFsCi0gIHJlcHJlc2VudGF0aW9uIG9mIGEgc2hhcGUgIGludG8gYSBiaXRtYXAuICBUaGUgRnJlZVR5cGUgcmFzdGVyaXplcgotICBoYXMgIGJlZW4gIG9yaWdpbmFsbHkgZGV2ZWxvcGVkICB0byAgcmVuZGVyICB0aGUgIGdseXBocyBmb3VuZCAgaW4KLSAgVHJ1ZVR5cGUgIGZpbGVzLCBtYWRlICB1cCAgb2Ygc2VnbWVudHMgIGFuZCBzZWNvbmQtb3JkZXIgIELDqXppZXJzLgotICBNZWFud2hpbGUgaXQgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gcmVuZGVyIHRoaXJkLW9yZGVyIELDqXppZXIgY3VydmVzCi0gIGFsc28uICAgVGhpcyAgZG9jdW1lbnQgIGlzICAgYW4gIGV4cGxhbmF0aW9uICBvZiAgaXRzICBkZXNpZ24gIGFuZAotICBpbXBsZW1lbnRhdGlvbi4KLQotICBXaGlsZSAgdGhlc2UgZXhwbGFuYXRpb25zIHN0YXJ0ICBmcm9tIHRoZSAgYmFzaWNzLCBhICBrbm93bGVkZ2Ugb2YKLSAgY29tbW9uIHJhc3Rlcml6YXRpb24gdGVjaG5pcXVlcyBpcyBhc3N1bWVkLgotCi0KLUlJLiBSZW5kZXJpbmcgVGVjaG5vbG9neQotPT09PT09PT09PT09PT09PT09PT09PT09Ci0KLTEuIFJlcXVpcmVtZW50cwotLS0tLS0tLS0tLS0tLS0tCi0KLSAgV2UgIGFzc3VtZSB0aGF0ICBhbGwgc2NhbGluZywgIHJvdGF0aW5nLCBoaW50aW5nLCAgZXRjLiwgIGhhcyBiZWVuCi0gIGFscmVhZHkgZG9uZS4gIFRoZSBnbHlwaCBpcyB0aHVzICBkZXNjcmliZWQgYnkgYSBsaXN0IG9mIHBvaW50cyBpbgotICB0aGUgZGV2aWNlIHNwYWNlLgotCi0gIC0gQWxsIHBvaW50IGNvb3JkaW5hdGVzICBhcmUgaW4gdGhlIDI2LjYgZml4ZWQgIGZsb2F0IGZvcm1hdC4gIFRoZQotICAgIHVzZWQgb3JpZW50YXRpb24gaXM6Ci0KLQotICAgICAgIF4geQotICAgICAgIHwgICAgICAgICByZWZlcmVuY2Ugb3JpZW50YXRpb24KLSAgICAgICB8Ci0gICAgICAgKi0tLS0+IHgKLSAgICAgIDAKLQotCi0gICAgYDI2LjYnIG1lYW5zICB0aGF0IDI2IGJpdHMgIGFyZSB1c2VkIGZvciAgdGhlIGludGVnZXIgcGFydCAgb2YgYQotICAgIHZhbHVlICAgYW5kICA2ICAgYml0cyAgYXJlICAgdXNlZCAgZm9yICAgdGhlICAgZnJhY3Rpb25hbCAgcGFydC4KLSAgICBDb25zZXF1ZW50bHksIHRoZSBgZGlzdGFuY2UnICBiZXR3ZWVuIHR3byBuZWlnaGJvdXJpbmcgcGl4ZWxzIGlzCi0gICAgNjQgYHVuaXRzJyAoMSB1bml0ID0gMS82NHRoIG9mIGEgcGl4ZWwpLgotCi0gICAgTm90ZSAgdGhhdCwgZm9yICB0aGUgcmFzdGVyaXplciwgIHBpeGVsIGNlbnRlcnMgIGFyZSAgbG9jYXRlZCBhdAotICAgIGludGVnZXIgICBjb29yZGluYXRlcy4gICBUaGUgICBUcnVlVHlwZSAgIGJ5dGVjb2RlICBpbnRlcnByZXRlciwKLSAgICBob3dldmVyLCBhc3N1bWVzIHRoYXQgIHRoZSBsb3dlciBsZWZ0IGVkZ2Ugb2YgIGEgcGl4ZWwgKHdoaWNoIGlzCi0gICAgdGFrZW4gIHRvIGJlICBhIHNxdWFyZSAgd2l0aCAgYSBsZW5ndGggIG9mIDEgIHVuaXQpIGhhcyAgaW50ZWdlcgotICAgIGNvb3JkaW5hdGVzLgotCi0KLSAgICAgICAgXiB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4geQotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICB8ICAgICAgICAgICAgKDEsMSkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICgwLjUsMC41KQotICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tKy0tLS0tKwotICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgICAgfAotICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgICAgfAotICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgby0tLS0tKy0tLS0tPiB4Ci0gICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgKDAsMCkgICB8Ci0gICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8Ci0gICAgICAgIG8tLS0tLS0tLS0tLSstLS0tLT4geCAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCi0gICAgICAoMCwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjUsLTAuNSkKLQotICAgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgICAgICAgICAgRnJlZVR5cGUgcmFzdGVyaXplcgotCi0KLSAgICBBIHBpeGVsIGxpbmUgaW4gdGhlIHRhcmdldCBiaXRtYXAgaXMgY2FsbGVkIGEgYHNjYW5saW5lJy4KLQotICAtIEEgIGdseXBoICBpcyAgdXN1YWxseSAgbWFkZSAgb2Ygc2V2ZXJhbCAgY29udG91cnMsICBhbHNvICBjYWxsZWQKLSAgICBgb3V0bGluZXMnLiAgQSBjb250b3VyIGlzIHNpbXBseSBhIGNsb3NlZCBjdXJ2ZSB0aGF0IGRlbGltaXRzIGFuCi0gICAgb3V0ZXIgb3IgaW5uZXIgcmVnaW9uIG9mIHRoZSBnbHlwaC4gIEl0IGlzIGRlc2NyaWJlZCBieSBhIHNlcmllcwotICAgIG9mIHN1Y2Nlc3NpdmUgcG9pbnRzIG9mIHRoZSBwb2ludHMgdGFibGUuCi0KLSAgICBFYWNoIHBvaW50ICBvZiB0aGUgZ2x5cGggIGhhcyBhbiBhc3NvY2lhdGVkIGZsYWcgIHRoYXQgaW5kaWNhdGVzCi0gICAgd2hldGhlciAgaXQgaXMgIGBvbicgb3IgIGBvZmYnIHRoZSAgY3VydmUuICBUd28gIHN1Y2Nlc3NpdmUgYG9uJwotICAgIHBvaW50cyBpbmRpY2F0ZSBhIGxpbmUgc2VnbWVudCBqb2luaW5nIHRoZSB0d28gcG9pbnRzLgotCi0gICAgT25lIGBvZmYnIHBvaW50IGFtaWRzdCB0d28gYG9uJyBwb2ludHMgaW5kaWNhdGVzIGEgc2Vjb25kLWRlZ3JlZQotICAgIChjb25pYykgIELDqXppZXIgcGFyYW1ldHJpYyAgYXJjLCBkZWZpbmVkICBieSB0aGVzZSAgdGhyZWUgcG9pbnRzCi0gICAgKHRoZSBgb2ZmJyBwb2ludCBiZWluZyB0aGUgIGNvbnRyb2wgcG9pbnQsIGFuZCB0aGUgYG9uJyBvbmVzIHRoZQotICAgIHN0YXJ0IGFuZCBlbmQgcG9pbnRzKS4gIFNpbWlsYXJseSwgYSB0aGlyZC1kZWdyZWUgKGN1YmljKSBCw6l6aWVyCi0gICAgY3VydmUgIGlzIGRlc2NyaWJlZCAgYnkgZm91ciAgcG9pbnRzICh0d28gIGBvZmYnICBjb250cm9sIHBvaW50cwotICAgIGJldHdlZW4gdHdvIGBvbicgcG9pbnRzKS4KLQotICAgIEZpbmFsbHksICBmb3IgIHNlY29uZC1vcmRlciBjdXJ2ZXMgIG9ubHksICB0d28gc3VjY2Vzc2l2ZSAgYG9mZicKLSAgICBwb2ludHMgIGZvcmNlcyB0aGUgIHJhc3Rlcml6ZXIgdG8gIGNyZWF0ZSwgZHVyaW5nICByZW5kZXJpbmcsIGFuCi0gICAgYG9uJyAgcG9pbnQgYW1pZHN0IHRoZW0sICBhdCB0aGVpciAgZXhhY3QgbWlkZGxlLiAgIFRoaXMgZ3JlYXRseQotICAgIGZhY2lsaXRhdGVzIHRoZSAgZGVmaW5pdGlvbiBvZiAgc3VjY2Vzc2l2ZSBCw6l6aWVyIGFyY3MuCi0KLSAgVGhlIHBhcmFtZXRyaWMgZm9ybSBvZiBhIHNlY29uZC1vcmRlciBCw6l6aWVyIGN1cnZlIGlzOgotCi0gICAgICBQKHQpID0gKDEtdCleMipQMSArIDIqdCooMS10KSpQMiArIHReMipQMwotCi0gICAgICAoUDEgYW5kIFAzIGFyZSB0aGUgZW5kIHBvaW50cywgUDIgdGhlIGNvbnRyb2wgcG9pbnQuKQotCi0gIFRoZSBwYXJhbWV0cmljIGZvcm0gb2YgYSB0aGlyZC1vcmRlciBCw6l6aWVyIGN1cnZlIGlzOgotCi0gICAgICBQKHQpID0gKDEtdCleMypQMSArIDMqdCooMS10KV4yKlAyICsgMyp0XjIqKDEtdCkqUDMgKyB0XjMqUDQKLQotICAgICAgKFAxIGFuZCBQNCBhcmUgdGhlIGVuZCBwb2ludHMsIFAyIGFuZCBQMyB0aGUgY29udHJvbCBwb2ludHMuKQotCi0gIEZvciBib3RoIGZvcm11bGFlLCB0IGlzIGEgcmVhbCBudW1iZXIgaW4gdGhlIHJhbmdlIFswLi4xXS4KLQotICBOb3RlICB0aGF0IHRoZSByYXN0ZXJpemVyICBkb2VzIG5vdCAgdXNlIHRoZXNlICBmb3JtdWxhZSBkaXJlY3RseS4KLSAgVGhleSBleGhpYml0LCAgaG93ZXZlciwgb25lIHZlcnkgIHVzZWZ1bCBwcm9wZXJ0eSBvZiAgQsOpemllciBhcmNzOgotICBFYWNoICBwb2ludCBvZiAgdGhlIGN1cnZlICBpcyBhICB3ZWlnaHRlZCBhdmVyYWdlICBvZiAgdGhlIGNvbnRyb2wKLSAgcG9pbnRzLgotCi0gIEFzIGFsbCB3ZWlnaHRzICBhcmUgcG9zaXRpdmUgYW5kIGFsd2F5cyBzdW0gdXAgIHRvIDEsIHdoYXRldmVyIHRoZQotICB2YWx1ZSAgb2YgdCwgIGVhY2ggYXJjICBwb2ludCBsaWVzICB3aXRoaW4gdGhlICB0cmlhbmdsZSAocG9seWdvbikKLSAgZGVmaW5lZCBieSB0aGUgYXJjJ3MgdGhyZWUgKGZvdXIpIGNvbnRyb2wgcG9pbnRzLgotCi0gIEluICB0aGUgZm9sbG93aW5nLCAgb25seSBzZWNvbmQtb3JkZXIgIGN1cnZlcyBhcmUgIGRpc2N1c3NlZCBzaW5jZQotICByYXN0ZXJpemF0aW9uIG9mIHRoaXJkLW9yZGVyIGN1cnZlcyBpcyBjb21wbGV0ZWx5IGlkZW50aWNhbC4KLQotICBIZXJlIHNvbWUgc2FtcGxlcyBmb3Igc2Vjb25kLW9yZGVyIGN1cnZlcy4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICMgb24gY3VydmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZmYgY3VydmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfXy0tLV9fCi0gICAgICAgICMtX18gICAgICAgICAgICAgICAgICAgICAgXy0tICAgICAgIC1fCi0gICAgICAgICAgICAtLV9fICAgICAgICAgICAgICAgIF8tICAgICAgICAgICAgLQotICAgICAgICAgICAgICAgIC0tX18gICAgICAgICAgICMgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIC0tX18gICAgICAgICAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgICAgICAgICAtIwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdvIGBvbicgcG9pbnRzCi0gICAgICAgICBUd28gYG9uJyBwb2ludHMgICAgICAgYW5kIG9uZSBgb2ZmJyBwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdGhlbQotCi0gICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAjICAgICAgICAgICAgX18gICAgICBUd28gYG9uJyBwb2ludHMgd2l0aCB0d28gYG9mZicKLSAgICAgICAgIFwgICAgICAgICAgLSAgLSAgICAgcG9pbnRzIGJldHdlZW4gdGhlbS4gVGhlIHBvaW50Ci0gICAgICAgICAgXCAgICAgICAgLyAgICBcICAgIG1hcmtlZCBgMCcgaXMgdGhlIG1pZGRsZSBvZiB0aGUKLSAgICAgICAgICAgLSAgICAgIDAgICAgICBcICAgYG9mZicgcG9pbnRzLCBhbmQgaXMgYSBgdmlydHVhbAotICAgICAgICAgICAgLV8gIF8tICAgICAgICMgICBvbicgcG9pbnQgd2hlcmUgdGhlIGN1cnZlIHBhc3Nlcy4KLSAgICAgICAgICAgICAgLS0gICAgICAgICAgICAgSXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBwb2ludAotICAgICAgICAgICAgICAqICAgICAgICAgICAgICBsaXN0LgotCi0KLTIuIFByb2ZpbGVzIGFuZCBTcGFucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgVGhlIGZvbGxvd2luZyBpcyBhIGJhc2ljIGV4cGxhbmF0aW9uIG9mIHRoZSBfa2luZF8gb2YgY29tcHV0YXRpb25zCi0gIG1hZGUgIGJ5ICB0aGUgICByYXN0ZXJpemVyICB0byAgYnVpbGQgIGEgIGJpdG1hcCAgIGZyb20gIGEgIHZlY3RvcgotICByZXByZXNlbnRhdGlvbi4gIE5vdGUgIHRoYXQgdGhlIGFjdHVhbCAgaW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkKLSAgZGlmZmVyZW50LCBkdWUgdG8gcGVyZm9ybWFuY2UgdHVuaW5nIGFuZCBvdGhlciBmYWN0b3JzLgotCi0gIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgaWRlYXMgcmVtYWluICBpbiB0aGUgc2FtZSBjYXRlZ29yeSwgYW5kIGFyZQotICBtb3JlIGNvbnZlbmllbnQgdG8gdW5kZXJzdGFuZC4KLQotCi0gIGEuIFN3ZWVwaW5nIHRoZSBTaGFwZQotCi0gICAgVGhlIGJlc3Qgd2F5IHRvIGZpbGwgYSBzaGFwZSBpcyB0byBkZWNvbXBvc2UgaXQgaW50byBhIG51bWJlciBvZgotICAgIHNpbXBsZSAgaG9yaXpvbnRhbCBzZWdtZW50cywgIHRoZW4gdHVybiAgdGhlbSBvbiAgaW4gIHRoZSB0YXJnZXQKLSAgICBiaXRtYXAuICBUaGVzZSBzZWdtZW50cyBhcmUgY2FsbGVkIGBzcGFucycuCi0KLSAgICAgICAgICAgICAgICBfXy0tLV9fCi0gICAgICAgICAgICAgXy0tICAgICAgIC1fCi0gICAgICAgICAgIF8tICAgICAgICAgICAgLQotICAgICAgICAgIC0gICAgICAgICAgICAgICBcCi0gICAgICAgICAvICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC8gICAgICAgICAgICAgICAgICAgXAotICAgICAgIHwgICAgICAgICAgICAgICAgICAgICBcCi0KLSAgICAgICAgICAgICAgICBfXy0tLV9fICAgICAgICAgRXhhbXBsZTogZmlsbGluZyBhIHNoYXBlCi0gICAgICAgICAgICAgXy0tLS0tLS0tLS1fICAgICAgICAgICAgICAgIHdpdGggc3BhbnMuCi0gICAgICAgICAgIF8tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS1cCi0gICAgICAgICAvLS0tLS0tLS0tLS0tLS0tLS1cICAgIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgZnJvbSB0aGUgdG9wCi0gICAgICAgIC8gICAgICAgICAgICAgICAgICAgXCAgIHRvIHRoZSBib3R0b20gb2YgdGhlIHNoYXBlLCBpbiBhCi0gICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIFwgIG1vdmVtZW50IGNhbGxlZCBhIGBzd2VlcCcuCi0gICAgICAgICAgICAgICAgICAgVgotCi0gICAgICAgICAgICAgICAgX18tLS1fXwotICAgICAgICAgICAgIF8tLS0tLS0tLS0tXwotICAgICAgICAgICBfLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tXAotICAgICAgICAgLy0tLS0tLS0tLS0tLS0tLS0tXAotICAgICAgICAvLS0tLS0tLS0tLS0tLS0tLS0tLVwKLSAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tXAotCi0KLSAgICBJbiAgb3JkZXIgIHRvIGRyYXcgIGEgIHNwYW4sICB0aGUgIHJhc3Rlcml6ZXIgbXVzdCAgY29tcHV0ZSAgaXRzCi0gICAgY29vcmRpbmF0ZXMsIHdoaWNoICBhcmUgc2ltcGx5IHRoZSB4IGNvb3JkaW5hdGVzICBvZiB0aGUgc2hhcGUncwotICAgIGNvbnRvdXJzLCB0YWtlbiBvbiB0aGUgeSBzY2FubGluZXMuCi0KLQotICAgICAgICAgICAgICAgICAgIC8tLS0vICAgIHwtLS18ICAgTm90ZSB0aGF0IHRoZXJlIGFyZSB1c3VhbGx5Ci0gICAgICAgICAgICAgICAgICAvLS0tLyAgICAgfC0tLXwgICBzZXZlcmFsIHNwYW5zIHBlciBzY2FubGluZS4KLSAgICAgICAgfCAgICAgICAgLy0tLS8gICAgICB8LS0tfAotICAgICAgICB8ICAgICAgIC8tLS0vX19fX19fX3wtLS18ICAgV2hlbiByZW5kZXJpbmcgdGhpcyBzaGFwZSB0byB0aGUKLSAgICAgICAgViAgICAgIC8tLS0tLS0tLS0tLS0tLS0tfCAgIGN1cnJlbnQgc2NhbmxpbmUgeSwgd2UgbXVzdAotICAgICAgICAgICAgICAvLS0tLS0tLS0tLS0tLS0tLS18ICAgY29tcHV0ZSB0aGUgeCB2YWx1ZXMgb2YgdGhlCi0gICAgICAgICAgIGEgLy0tLS18ICAgICAgICAgfC0tLXwgICBwb2ludHMgYSwgYiwgYywgYW5kIGQuCi0gICAgICAtIC0gLSAqICAgICAqIC0gLSAtIC0gKiAgICogLSAtIHkgLQotICAgICAgICAgICAvICAgICAvIGIgICAgICAgY3wgICB8ZAotCi0KLSAgICAgICAgICAgICAgICAgICAvLS0tLyAgICB8LS0tfAotICAgICAgICAgICAgICAgICAgLy0tLS8gICAgIHwtLS18ICBBbmQgdGhlbiB0dXJuIG9uIHRoZSBzcGFucyBhLWIKLSAgICAgICAgICAgICAgICAgLy0tLS8gICAgICB8LS0tfCAgYW5kIGMtZC4KLSAgICAgICAgICAgICAgICAvLS0tL19fX19fX198LS0tfAotICAgICAgICAgICAgICAgLy0tLS0tLS0tLS0tLS0tLS18Ci0gICAgICAgICAgICAgIC8tLS0tLS0tLS0tLS0tLS0tLXwKLSAgICAgICAgICAgYSAvLS0tLXwgICAgICAgICB8LS0tfAotICAgICAgLSAtIC0gIyMjIyMjIyAtIC0gLSAtICMjIyMjIC0gLSB5IC0KLSAgICAgICAgICAgLyAgICAgLyBiICAgICAgIGN8ICAgfGQKLQotCi0gIGIuIERlY29tcG9zaW5nIE91dGxpbmVzIGludG8gUHJvZmlsZXMKLQotICAgIEZvciAgZWFjaCAgc2NhbmxpbmUgZHVyaW5nICB0aGUgIHN3ZWVwLCAgd2UgIG5lZWQgdGhlICBmb2xsb3dpbmcKLSAgICBpbmZvcm1hdGlvbjoKLQotICAgIG8gVGhlICBudW1iZXIgb2YgIHNwYW5zIG9uICB0aGUgY3VycmVudCAgc2NhbmxpbmUsIGdpdmVuICBieSB0aGUKLSAgICAgIG51bWJlciBvZiAgc2hhcGUgcG9pbnRzICBpbnRlcnNlY3RpbmcgdGhlIHNjYW5saW5lICAodGhlc2UgYXJlCi0gICAgICB0aGUgcG9pbnRzIGEsIGIsIGMsIGFuZCBkIGluIHRoZSBhYm92ZSBleGFtcGxlKS4KLQotICAgIG8gVGhlIHggY29vcmRpbmF0ZXMgb2YgdGhlc2UgcG9pbnRzLgotCi0gICAgeCBjb29yZGluYXRlcyBhcmUgIGNvbXB1dGVkIGJlZm9yZSB0aGUgc3dlZXAsIGluICBhIHBoYXNlIGNhbGxlZAotICAgIGBkZWNvbXBvc2l0aW9uJyB3aGljaCBjb252ZXJ0cyB0aGUgZ2x5cGggaW50byAqcHJvZmlsZXMqLgotCi0gICAgUHV0IGl0IHNpbXBseSwgYSBgcHJvZmlsZScgIGlzIGEgY29udG91cidzIHBvcnRpb24gdGhhdCBjYW4gb25seQotICAgIGJlIGVpdGhlciBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZywgIGkuZS4sIGl0IGlzIG1vbm90b25pYyBpbiB0aGUKLSAgICB2ZXJ0aWNhbCBkaXJlY3Rpb24gKHdlIGFsc28gc2F5ICB5LW1vbm90b25pYykuICBUaGVyZSBpcyBubyBzdWNoCi0gICAgdGhpbmcgYXMgYSBob3Jpem9udGFsIHByb2ZpbGUsIGFzIHdlIHNoYWxsIHNlZS4KLQotICAgIEhlcmUgYXJlIGEgZmV3IGV4YW1wbGVzOgotCi0KLSAgICAgIHRoaXMgc3F1YXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgMgotICAgICAgICAgLS0tLT4tLS0tICAgICBpcyBtYWRlIG9mIHR3bwotICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwKLSAgICAgICAgfCAgICAgICAgIHwgICAgICAgcHJvZmlsZXMgICAgICAgIHwgICAgICAgICB8Ci0gICAgICAgIF4gICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICBeICAgICsgICAgdgotICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwKLSAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8Ci0gICAgICAgICAtLS0tPC0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCAgICAgICAgZG93bgotCi0KLSAgICAgIHRoaXMgdHJpYW5nbGUKLQotICAgICAgICAgICAgIFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgIDIKLQotICAgICAgICAgICAgIHxcICAgICAgICBpcyBtYWRlIG9mIHR3byAgICAgICB8ICAgICAgICAgXAotICAgICAgICAgIF4gIHwgXCAgXCAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIFwKLSAgICAgICAgICB8IHwgICBcICBcICAgICAgcHJvZmlsZXMgICAgICAgICB8ICAgICAgICAgICAgXCAgICAgIHwKLSAgICAgICAgIHwgIHwgICAgXCAgdiAgICAgICAgICAgICAgICAgIF4gICB8ICAgICAgICAgICAgIFwgICAgIHwKLSAgICAgICAgICAgfCAgICAgIFwgICAgICAgICAgICAgICAgICAgIHwgIHwgICAgICAgICArICAgICBcICAgIHYKLSAgICAgICAgICAgfCAgICAgICBcICAgICAgICAgICAgICAgICAgIHwgIHwgICAgICAgICAgICAgICAgXAotICAgICAgICBQMSAtLS1fX18gICBcICAgICAgICAgICAgICAgICAgICAgLS0tX19fICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAtLS1fXCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tXyAgICAgICAgIFwKLSAgICAgICAgICAgICA8LS1fXyAgICAgUDMgICAgICAgICAgICAgICAgICAgdXAgICAgICAgICAgIGRvd24KLQotCi0KLSAgICAgIEEgbW9yZSBnZW5lcmFsIGNvbnRvdXIgY2FuIGJlIG1hZGUgb2YgbW9yZSB0aGFuIHR3byBwcm9maWxlczoKLQotICAgICAgICAgICAgICBfXyAgICAgXgotICAgICAgICAgICAgIC8gIHwgICAvICBfX18gICAgICAgICAgLyAgICB8Ci0gICAgICAgICAgICAvICAgfCAgICAgLyAgIHwgICAgICAgIC8gICAgIHwgICAgICAgLyAgICAgfAotICAgICAgICAgICB8ICAgIHwgICAgLyAgIC8gICAgPT4gIHwgICAgICB2ICAgICAgLyAgICAgLwotICAgICAgICAgICB8ICAgIHwgICB8ICAgfCAgICAgICAgIHwgICAgICB8ICAgICBeICAgICB8Ci0gICAgICAgIF4gIHwgICAgfF9fX3wgICB8ICB8ICAgICAgXiAgICsgIHwgICsgIHwgICsgIHYKLSAgICAgICAgfCAgfCAgICAgICAgICAgfCAgIHYgICAgICB8ICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgdXAgICAgfAotICAgICAgICAgICB8X19fX19fX19fX198ICAgICAgICAgIHwgICAgZG93biAgICAgICAgIHwKLQotICAgICAgICAgICAgICAgIDwtLSAgICAgICAgICAgICAgIHVwICAgICAgICAgICAgICBkb3duCi0KLQotICAgIFN1Y2Nlc3NpdmUgIHByb2ZpbGVzIGFyZSAgYWx3YXlzIGpvaW5lZCAgYnkgIGhvcml6b250YWwgc2VnbWVudHMKLSAgICB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgcHJvZmlsZXMgdGhlbXNlbHZlcy4KLQotICAgIEZvciAgdGhlICByYXN0ZXJpemVyLCAgYSAgcHJvZmlsZSAgaXMgIHNpbXBseSAgYW4gICphcnJheSogIHRoYXQKLSAgICBhc3NvY2lhdGVzICBvbmUgIGhvcml6b250YWwgKnBpeGVsKiAgY29vcmRpbmF0ZSAgdG8gZWFjaCAgYml0bWFwCi0gICAgKnNjYW5saW5lKiAgY3Jvc3NlZCAgYnkgIHRoZSAgY29udG91cidzIHNlY3Rpb24gIGNvbnRhaW5pbmcgIHRoZQotICAgIHByb2ZpbGUuICBOb3RlIHRoYXQgcHJvZmlsZXMgYXJlICpvcmllbnRlZCogdXAgb3IgZG93biBhbG9uZyB0aGUKLSAgICBnbHlwaCdzIG9yaWdpbmFsIGZsb3cgb3JpZW50YXRpb24uCi0KLSAgICBJbiBvdGhlciBncmFwaGljcyBsaWJyYXJpZXMsIHByb2ZpbGVzIGFyZSBhbHNvIGNhbGxlZCBgZWRnZXMnIG9yCi0gICAgYGVkZ2VsaXN0cycuCi0KLQotICBjLiBUaGUgUmVuZGVyIFBvb2wKLQotICAgIEZyZWVUeXBlICBoYXMgYmVlbiBkZXNpZ25lZCAgdG8gYmUgIGFibGUgdG8gIHJ1biB3ZWxsICBvbiBfdmVyeV8KLSAgICBsaWdodCBzeXN0ZW1zLCBpbmNsdWRpbmcgZW1iZWRkZWQgc3lzdGVtcyB3aXRoIHZlcnkgZmV3IG1lbW9yeS4KLQotICAgIEEgcmVuZGVyIHBvb2wgIHdpbGwgYmUgYWxsb2NhdGVkIG9uY2U7IHRoZSAgcmFzdGVyaXplciB1c2VzIHRoaXMKLSAgICBwb29sIGZvciBhbGwgIGl0cyBuZWVkcyBieSBtYW5hZ2luZyB0aGlzICBtZW1vcnkgZGlyZWN0bHkgaW4gaXQuCi0gICAgVGhlICBhbGdvcml0aG1zIHRoYXQgYXJlICB1c2VkIGZvciAgcHJvZmlsZSBjb21wdXRhdGlvbiAgbWFrZSBpdAotICAgIHBvc3NpYmxlIHRvIHVzZSAgdGhlIHBvb2wgYXMgYSBzaW1wbGUgIGdyb3dpbmcgaGVhcC4gIFRoaXMgbWVhbnMKLSAgICB0aGF0IHRoaXMgIG1lbW9yeSBtYW5hZ2VtZW50IGlzICBhY3R1YWxseSBxdWl0ZSBlYXN5ICBhbmQgZmFzdGVyCi0gICAgdGhhbiBhbnkga2luZCBvZiBtYWxsb2MoKS9mcmVlKCkgY29tYmluYXRpb24uCi0KLSAgICBNb3Jlb3ZlciwgIHdlJ2xsIHNlZSAgbGF0ZXIgdGhhdCAgdGhlIHJhc3Rlcml6ZXIgIGlzICBhYmxlLCB3aGVuCi0gICAgZGVhbGluZyB3aXRoIHByb2ZpbGVzIHRvbyBsYXJnZSAgYW5kIG51bWVyb3VzIHRvIGxpZSBhbGwgYXQgb25jZQotICAgIGluICB0aGUgcmVuZGVyICBwb29sLCB0byAgaW1tZWRpYXRlbHkgZGVjb21wb3NlICByZWN1cnNpdmVseSB0aGUKLSAgICByZW5kZXJpbmcgcHJvY2VzcyAgaW50byBpbmRlcGVuZGVudCBzdWItdGFza3MsICBlYWNoIHRha2luZyBsZXNzCi0gICAgbWVtb3J5IHRvIGJlIHBlcmZvcm1lZCAoc2VlIGBzdWItYmFuZGluZycgYmVsb3cpLgotCi0gICAgVGhlICByZW5kZXIgcG9vbCBkb2Vzbid0ICBuZWVkIHRvICBiZSBsYXJnZS4gICBBIDRLQnl0ZSAgcG9vbCBpcwotICAgIGVub3VnaCBmb3IgbmVhcmx5IGFsbCByZW5kaXRpb25zLCB0aG91Z2ggbmVhcmx5IDEwMCUgc2xvd2VyIHRoYW4KLSAgICBhIG1vcmUgY29tZm9ydGFibGUgMTZLQnl0ZSBvciAzMktCeXRlIHBvb2wgKHRoYXQgd2FzIHRlc3RlZCB3aXRoCi0gICAgY29tcGxleCBnbHlwaHMgYXQgc2l6ZXMgb3ZlciA1MDAgcGl4ZWxzKS4KLQotCi0gIGQuIENvbXB1dGluZyBQcm9maWxlcyBFeHRlbnRzCi0KLSAgICBSZW1lbWJlciB0aGF0IGEgcHJvZmlsZSBpcyBhbiBhcnJheSwgYXNzb2NpYXRpbmcgYSBfc2NhbmxpbmVfIHRvCi0gICAgdGhlIHggcGl4ZWwgY29vcmRpbmF0ZSBvZiBpdHMgaW50ZXJzZWN0aW9uIHdpdGggYSBjb250b3VyLgotCi0gICAgVGhvdWdoIGl0J3Mgbm90IGV4YWN0bHkgaG93IHRoZSBGcmVlVHlwZSByYXN0ZXJpemVyIHdvcmtzLCBpdCBpcwotICAgIGNvbnZlbmllbnQgIHRvIHRoaW5rICB0aGF0ICB3ZSBuZWVkICBhICBwcm9maWxlJ3MgaGVpZ2h0ICBiZWZvcmUKLSAgICBhbGxvY2F0aW5nIGl0IGluIHRoZSBwb29sIGFuZCBjb21wdXRpbmcgaXRzIGNvb3JkaW5hdGVzLgotCi0gICAgVGhlIHByb2ZpbGUncyBoZWlnaHQgIGlzIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzICBjcm9zc2VkIGJ5IHRoZQotICAgIHktbW9ub3RvbmljIHNlY3Rpb24gb2YgYSBjb250b3VyLiAgV2UgdGh1cyBuZWVkIHRvIGNvbXB1dGUgdGhlc2UKLSAgICBzZWN0aW9ucyBmcm9tICB0aGUgdmVjdG9yaWFsIGRlc2NyaXB0aW9uLiAgSW4gb3JkZXIgIHRvIGRvIHRoYXQsCi0gICAgd2UgYXJlICBvYmxpZ2VkIHRvIGNvbXB1dGUgYWxsICAobG9jYWwgYW5kIGdsb2JhbCkgIHkgZXh0cmVtYSBvZgotICAgIHRoZSBnbHlwaCAobWluaW1hIGFuZCBtYXhpbWEpLgotCi0KLSAgICAgICAgICAgUDIgICAgICAgICAgICAgRm9yIGluc3RhbmNlLCB0aGlzIHRyaWFuZ2xlIGhhcyBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHR3byB5LWV4dHJlbWEsIHdoaWNoIGFyZSBzaW1wbHkKLSAgICAgICAgICAgfFwKLSAgICAgICAgICAgfCBcICAgICAgICAgICAgICAgUDIueSAgYXMgYSB2ZXJ0aWNhbCBtYXhpbXVtCi0gICAgICAgICAgfCAgIFwgICAgICAgICAgICAgIFAzLnkgIGFzIGEgdmVydGljYWwgbWluaW11bQotICAgICAgICAgIHwgICAgXAotICAgICAgICAgfCAgICAgIFwgICAgICAgICAgICBQMS55IGlzIG5vdCBhIHZlcnRpY2FsIGV4dHJlbXVtICh0aG91Z2gKLSAgICAgICAgIHwgICAgICAgXCAgICAgICAgICAgaXQgaXMgYSBob3Jpem9udGFsIG1pbmltdW0sIHdoaWNoIHdlCi0gICAgICBQMSAtLS1fX18gICBcICAgICAgICAgIGRvbid0IG5lZWQpLgotICAgICAgICAgICAgICAgLS0tX1wKLSAgICAgICAgICAgICAgICAgICAgIFAzCi0KLQotICAgIE5vdGUgIHRoYXQgdGhlICBleHRyZW1hIGFyZSAgZXhwcmVzc2VkICBpbiBwaXhlbCAgdW5pdHMsIG5vdCAgaW4KLSAgICBzY2FubGluZXMuICAgVGhlIHRyaWFuZ2xlJ3MgIGhlaWdodCAgaXMgY2VydGFpbmx5ICAoUDMueS1QMi55KzEpCi0gICAgcGl4ZWwgIHVuaXRzLCAgIGJ1dCAgaXRzICBwcm9maWxlcycgIGhlaWdodHMgICBhcmUgIGNvbXB1dGVkICBpbgotICAgIHNjYW5saW5lcy4gIFRoZSBleGFjdCBjb252ZXJzaW9uIGlzIHNpbXBsZToKLQotICAgICAgLSBtaW4gc2NhbmxpbmUgPSBGTE9PUiAgKCBtaW4geSApCi0gICAgICAtIG1heCBzY2FubGluZSA9IENFSUxJTkcoIG1heCB5ICkKLQotICAgIEEgcHJvYmxlbSAgYXJpc2VzIHdpdGggQsOpemllciAgQXJjcy4gIFdoaWxlIGEgc2VnbWVudCAgaXMgYWx3YXlzCi0gICAgbmVjZXNzYXJpbHkgeS1tb25vdG9uaWMgKGkuZS4sICBmbGF0LCBhc2NlbmRpbmcsIG9yIGRlc2NlbmRpbmcpLAotICAgIHdoaWNoIG1ha2VzIGV4dHJlbWEgY29tcHV0YXRpb25zIGVhc3ksICB0aGUgYXNjZW50IG9mIGFuIGFyYyBjYW4KLSAgICB2YXJ5IGJldHdlZW4gaXRzIGNvbnRyb2wgcG9pbnRzLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgUDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9uIGN1cnZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mZiBjdXJ2ZQotICAgICAgICAgICAgICAgICAgIF9fLXgtLV8KLSAgICAgICAgICAgICAgICBfLS0gICAgICAgLV8KLSAgICAgICAgICBQMSAgXy0gICAgICAgICAgICAtICAgICAgICAgIEEgbm9uIHktbW9ub3RvbmljIELDqXppZXIgYXJjLgotICAgICAgICAgICAgICMgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICBUaGUgYXJjIGdvZXMgZnJvbSBQMSB0byBQMy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgIFAzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0KLQotICAgIFdlIGZpcnN0ICBuZWVkIHRvIGJlICBhYmxlIHRvIGVhc2lseSBkZXRlY3QgIG5vbi1tb25vdG9uaWMgYXJjcywKLSAgICBhY2NvcmRpbmcgdG8gIHRoZWlyIGNvbnRyb2wgcG9pbnRzLiAgSSB3aWxsICBzdGF0ZSBoZXJlLCB3aXRob3V0Ci0gICAgcHJvb2YsIHRoYXQgdGhlIG1vbm90b255IGNvbmRpdGlvbiBjYW4gYmUgZXhwcmVzc2VkIGFzOgotCi0gICAgICBQMS55IDw9IFAyLnkgPD0gUDMueSAgIGZvciBhbiBldmVyLWFzY2VuZGluZyBhcmMKLQotICAgICAgUDEueSA+PSBQMi55ID49IFAzLnkgICBmb3IgYW4gZXZlci1kZXNjZW5kaW5nIGFyYwotCi0gICAgd2l0aCB0aGUgc3BlY2lhbCBjYXNlIG9mCi0KLSAgICAgIFAxLnkgPSBQMi55ID0gUDMueSAgICAgd2hlcmUgdGhlIGFyYyBpcyBzYWlkIHRvIGJlIGBmbGF0Jy4KLQotICAgIEFzICB5b3UgY2FuICBzZWUsIHRoZXNlICBjb25kaXRpb25zIGNhbiAgYmUgdmVyeSAgZWFzaWx5IHRlc3RlZC4KLSAgICBUaGV5IGFyZSwgaG93ZXZlciwgZXh0cmVtZWx5IGltcG9ydGFudCwgYXMgYW55IGFyYyB0aGF0IGRvZXMgbm90Ci0gICAgc2F0aXNmeSB0aGVtIG5lY2Vzc2FyaWx5IGNvbnRhaW5zIGFuIGV4dHJlbXVtLgotCi0gICAgTm90ZSAgYWxzbyB0aGF0ICBhIG1vbm90b25pYyAgYXJjIGNhbiAgY29udGFpbiBhbiAgZXh0cmVtdW0gdG9vLAotICAgIHdoaWNoIGlzIHRoZW4gb25lIG9mIGl0cyBgb24nIHBvaW50czoKLQotCi0gICAgICAgIFAxICAgICAgICAgICBQMgotICAgICAgICAgICMtLS1fXyAgICogICAgICAgICBQMVAyUDMgaXMgZXZlci1kZXNjZW5kaW5nLCBidXQgUDEKLSAgICAgICAgICAgICAgICAtXyAgICAgICAgICAgaXMgYW4geS1leHRyZW11bS4KLSAgICAgICAgICAgICAgICAgIC0KLSAgICAgICAgICAgLS0tXyAgICBcCi0gICAgICAgICAgICAgICAtPiAgIFwKLSAgICAgICAgICAgICAgICAgICAgIFwgIFAzCi0gICAgICAgICAgICAgICAgICAgICAgIwotCi0KLSAgICBMZXQncyBnbyBiYWNrIHRvIG91ciBwcmV2aW91cyBleGFtcGxlOgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgUDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9uIGN1cnZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mZiBjdXJ2ZQotICAgICAgICAgICAgICAgICAgIF9fLXgtLV8KLSAgICAgICAgICAgICAgICBfLS0gICAgICAgLV8KLSAgICAgICAgICBQMSAgXy0gICAgICAgICAgICAtICAgICAgICAgIEEgbm9uLXktbW9ub3RvbmljIELDqXppZXIgYXJjLgotICAgICAgICAgICAgICMgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICBIZXJlIHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICAgICAgICAgICBQMi55ID49IFAxLnkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgUDMgICAgICAgICBQMi55ID49IFAzLnkgICAgICAoISkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLQotCi0gICAgV2UgbmVlZCB0byAgY29tcHV0ZSB0aGUgdmVydGljYWwgbWF4aW11bSBvZiB0aGlzICBhcmMgdG8gYmUgYWJsZQotICAgIHRvIGNvbXB1dGUgYSBwcm9maWxlJ3MgaGVpZ2h0ICh0aGUgcG9pbnQgbWFya2VkIGJ5IGFuIGB4JykuICBUaGUKLSAgICBhcmMncyBlcXVhdGlvbiBpbmRpY2F0ZXMgdGhhdCAgYSBkaXJlY3QgY29tcHV0YXRpb24gaXMgcG9zc2libGUsCi0gICAgYnV0ICB3ZSByZWx5ICBvbiBhICBkaWZmZXJlbnQgdGVjaG5pcXVlLCAgd2hpY2ggdXNlICB3aWxsIGJlY29tZQotICAgIGFwcGFyZW50IHNvb24uCi0KLSAgICBCw6l6aWVyICBhcmNzIGhhdmUgIHRoZSAgc3BlY2lhbCBwcm9wZXJ0eSAgb2YgIGJlaW5nIHZlcnkgIGVhc2lseQotICAgIGRlY29tcG9zZWQgaW50byB0d28gc3ViLWFyY3MsICB3aGljaCBhcmUgdGhlbXNlbHZlcyBCw6l6aWVyIGFyY3MuCi0gICAgTW9yZW92ZXIsIGl0IGlzIGVhc3kgdG8gcHJvdmUgdGhhdCB0aGVyZSBpcyBhdCBtb3N0IG9uZSB2ZXJ0aWNhbAotICAgIGV4dHJlbXVtIG9uICBlYWNoIELDqXppZXIgYXJjIChmb3IgIHNlY29uZC1kZWdyZWUgY3VydmVzOyBzaW1pbGFyCi0gICAgY29uZGl0aW9ucyBjYW4gYmUgZm91bmQgZm9yIHRoaXJkLW9yZGVyIGFyY3MpLgotCi0gICAgRm9yIGluc3RhbmNlLCAgdGhlIGZvbGxvd2luZyBhcmMgIFAxUDJQMyBjYW4gYmUgIGRlY29tcG9zZWQgaW50bwotICAgIHR3byBzdWItYXJjcyBRMVEyUTMgYW5kIFIxUjJSMzoKLQotCi0gICAgICAgICAgICAgICAgICAgIFAyCi0gICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbiAgY3VydmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2ZmIGN1cnZlCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgQsOpemllciBhcmMgUDFQMlAzLgotICAgICAgICAgICAgICAgIF9fLS0tX18KLSAgICAgICAgICAgICBfLS0gICAgICAgLS1fCi0gICAgICAgICAgIF8tICAgICAgICAgICAgIC1fCi0gICAgICAgICAgLSAgICAgICAgICAgICAgICAgLQotICAgICAgICAgLyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC8gICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIwotICAgICBQMSAgICAgICAgICAgICAgICAgICAgICAgICBQMwotCi0KLQotICAgICAgICAgICAgICAgICAgICBQMgotICAgICAgICAgICAgICAgICAgICoKLQotCi0KLSAgICAgICAgICAgICAgICAgICBRMyAgICAgICAgICAgICAgICAgRGVjb21wb3NlZCBpbnRvIHR3byBzdWJhcmNzCi0gICAgICAgICAgUTIgICAgICAgICAgICAgICAgUjIgICAgICAgIFExUTJRMyBhbmQgUjFSMlIzCi0gICAgICAgICAgICAqICAgX18tIy1fXyAgICoKLSAgICAgICAgICAgICBfLS0gICAgICAgLS1fCi0gICAgICAgICAgIF8tICAgICAgIFIxICAgIC1fICAgICAgICAgIFExID0gUDEgICAgICAgICBSMyA9IFAzCi0gICAgICAgICAgLSAgICAgICAgICAgICAgICAgLSAgICAgICAgIFEyID0gKFAxK1AyKS8yICBSMiA9IChQMitQMykvMgotICAgICAgICAgLyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC8gICAgICAgICAgICAgICAgICAgICBcICAgICAgICAgICAgUTMgPSBSMSA9IChRMitSMikvMgotICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICMKLSAgICAgUTEgICAgICAgICAgICAgICAgICAgICAgICAgUjMgICAgTm90ZSB0aGF0IFEyLCBSMiwgYW5kIFEzPVIxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBvbiBhIHNpbmdsZSBsaW5lIHdoaWNoIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbmdlbnQgdG8gdGhlIGN1cnZlLgotCi0KLSAgICBXZSBoYXZlIHRoZW4gZGVjb21wb3NlZCAgYSBub24teS1tb25vdG9uaWMgQsOpemllciBjdXJ2ZSBpbnRvIHR3bwotICAgIHNtYWxsZXIgc3ViLWFyY3MuICBOb3RlIHRoYXQgaW4gdGhlIGFib3ZlIGRyYXdpbmcsIGJvdGggc3ViLWFyY3MKLSAgICBhcmUgbW9ub3RvbmljLCBhbmQgdGhhdCB0aGUgZXh0cmVtdW0gaXMgdGhlbiBRMz1SMS4gIEhvd2V2ZXIsIGluCi0gICAgYSAgbW9yZSBnZW5lcmFsICBjYXNlLCAgb25seSAgb25lIHN1Yi1hcmMgIGlzICBndWFyYW50ZWVkIHRvICBiZQotICAgIG1vbm90b25pYy4gIEdldHRpbmcgYmFjayB0byBvdXIgZm9ybWVyIGV4YW1wbGU6Ci0KLQotICAgICAgICAgICAgICAgICAgICBRMgotICAgICAgICAgICAgICAgICAgICoKLQotICAgICAgICAgICAgICAgICAgIF9fLXgtLV8gUjEKLSAgICAgICAgICAgICAgICBfLS0gICAgICAgI18KLSAgICAgICAgICBRMSAgXy0gICAgICAgIFEzICAtICAgUjIKLSAgICAgICAgICAgICAjICAgICAgICAgICAgICAgXCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICBSMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotCi0KLSAgICBIZXJlLCB3ZSBzZWUgdGhhdCwgIHRob3VnaCBRMVEyUTMgaXMgc3RpbGwgbm9uLW1vbm90b25pYywgUjFSMlIzCi0gICAgaXMgZXZlciAgZGVzY2VuZGluZzogV2UgIHRodXMga25vdyB0aGF0ICBpdCBkb2Vzbid0ICBjb250YWluIHRoZQotICAgIGV4dHJlbXVtLiAgV2UgY2FuIHRoZW4gcmUtc3ViZGl2aWRlIFExUTJRMyBpbnRvIHR3byBzdWItYXJjcyBhbmQKLSAgICBnbyAgb24gcmVjdXJzaXZlbHksICBzdG9wcGluZyAgd2hlbiB3ZSAgZW5jb3VudGVyIHR3byAgbW9ub3RvbmljCi0gICAgc3ViYXJjcywgb3Igd2hlbiB0aGUgc3ViYXJjcyBiZWNvbWUgc2ltcGx5IHRvbyBzbWFsbC4KLQotICAgIFdlICB3aWxsIGZpbmFsbHkgIGZpbmQgIHRoZSB2ZXJ0aWNhbCAgZXh0cmVtdW0uICAgTm90ZSB0aGF0ICB0aGUKLSAgICBpdGVyYXRpdmUgcHJvY2VzcyBvZiBmaW5kaW5nIGFuIGV4dHJlbXVtIGlzIGNhbGxlZCBgZmxhdHRlbmluZycuCi0KLQotICBlLiBDb21wdXRpbmcgUHJvZmlsZXMgQ29vcmRpbmF0ZXMKLQotICAgIE9uY2Ugd2UgaGF2ZSB0aGUgaGVpZ2h0IG9mIGVhY2ggcHJvZmlsZSwgd2UgYXJlIGFibGUgdG8gYWxsb2NhdGUKLSAgICBpdCBpbiB0aGUgcmVuZGVyIHBvb2wuICAgVGhlIG5leHQgdGFzayBpcyB0byBjb21wdXRlIGNvb3JkaW5hdGVzCi0gICAgZm9yIGVhY2ggc2NhbmxpbmUuCi0KLSAgICBJbiAgdGhlIGNhc2UgIG9mIHNlZ21lbnRzLCAgdGhlIGNvbXB1dGF0aW9uICBpcyBzdHJhaWdodGZvcndhcmQsCi0gICAgdXNpbmcgIHRoZSAgRXVjbGlkZWFuICAgYWxnb3JpdGhtICAoYWxzbyAga25vd24gIGFzICBCcmVzZW5oYW0pLgotICAgIEhvd2V2ZXIsIGZvciBCw6l6aWVyIGFyY3MsIHRoZSBqb2IgaXMgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZC4KLQotICAgIFdlIGFzc3VtZSAgdGhhdCBhbGwgQsOpemllcnMgdGhhdCAgYXJlIHBhcnQgb2YgYSAgcHJvZmlsZSBhcmUgdGhlCi0gICAgcmVzdWx0IG9mICBmbGF0dGVuaW5nIHRoZSBjdXJ2ZSwgIHdoaWNoIG1lYW5zIHRoYXQgdGhleSAgYXJlIGFsbAotICAgIHktbW9ub3RvbmljIChhc2NlbmRpbmcgIG9yIGRlc2NlbmRpbmcsIGFuZCBuZXZlciAgZmxhdCkuICBXZSBub3cKLSAgICBoYXZlICB0byBjb21wdXRlIHRoZSAgaW50ZXJzZWN0aW9ucyBvZiAgYXJjcyB3aXRoICB0aGUgcHJvZmlsZSdzCi0gICAgc2NhbmxpbmVzLiAgT25lICB3YXkgaXMgIHRvIHVzZSBhICBzaW1pbGFyIHNjaGVtZSAgdG8gZmxhdHRlbmluZwotICAgIGNhbGxlZCBgc3RlcHBpbmcnLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpZGVyIHRoaXMgYXJjLCBnb2luZyBmcm9tIFAxIHRvCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICBQMy4gIFN1cHBvc2UgdGhhdCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlIGl0cyBpbnRlcnNlY3Rpb25zIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3biBzY2FubGluZXMuICBBcyBhbHJlYWR5Ci0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICBtZW50aW9uZWQgdGhpcyBjYW4gYmUgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHksIGJ1dCB0aGUgaW52b2x2ZWQKLSAgICAgICAgICAqIFAyICAgICAgICAgXy0tLSMgUDMgIGFsZ29yaXRobSBpcyBmYXIgdG9vIHNsb3cuCi0gICAgICAtLS0tLS0tLS0tLS0tIF8tLSAgLS0KLSAgICAgICAgICAgICAgICAgIF8tCi0gICAgICAgICAgICAgICAgXy8gICAgICAgICAgICAgICBJbnN0ZWFkLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0bwotICAgICAgLS0tLS0tLS0tLy0tLS0tLS0tLS0tICAgICAgdXNlIHRoZSBkZWNvbXBvc2l0aW9uIHByb3BlcnR5IGluCi0gICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICB0aGUgc2FtZSByZWN1cnNpdmUgd2F5LCBpLmUuLAotICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgc3ViZGl2aWRlIHRoZSBhcmMgaW50byBzdWJhcmNzCi0gICAgICAtLS0tLS18LS0tLS0tLS0tLS0tLS0gICAgICB1bnRpbCB0aGVzZSBnZXQgdG9vIHNtYWxsIHRvIGNyb3NzCi0gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBtb3JlIHRoYW4gb25lIHNjYW5saW5lIQotICAgICAgICAgICB8Ci0gICAgICAtLS0tLXwtLS0tLS0tLS0tLS0tLS0gICAgICBUaGlzIGlzIHZlcnkgZWFzaWx5IGRvbmUgdXNpbmcgYQotICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyaXplci1tYW5hZ2VkIHN0YWNrIG9mCi0gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBzdWJhcmNzLgotICAgICAgICAgICMgUDEKLQotCi0gIGYuIFN3ZWVwaW5nIGFuZCBTb3J0aW5nIHRoZSBTcGFucwotCi0gICAgT25jZSBhbGwgb3VyIHByb2ZpbGVzIGhhdmUgIGJlZW4gY29tcHV0ZWQsIHdlIGJlZ2luIHRoZSBzd2VlcCB0bwotICAgIGJ1aWxkIChhbmQgZmlsbCkgdGhlIHNwYW5zLgotCi0gICAgQXMgYm90aCB0aGUgIFRydWVUeXBlIGFuZCBUeXBlIDEgc3BlY2lmaWNhdGlvbnMgIHVzZSB0aGUgd2luZGluZwotICAgIGZpbGwgIHJ1bGUgKGJ1dCAgd2l0aCBvcHBvc2l0ZSAgZGlyZWN0aW9ucyksIHdlICBwbGFjZSwgIG9uIGVhY2gKLSAgICBzY2FubGluZSwgdGhlIHByZXNlbnQgcHJvZmlsZXMgaW4gdHdvIHNlcGFyYXRlIGxpc3RzLgotCi0gICAgT25lICBsaXN0LCAgY2FsbGVkICB0aGUgIGBsZWZ0JyAgb25lLCAgb25seSAgY29udGFpbnMgIGFzY2VuZGluZwotICAgIHByb2ZpbGVzLCB3aGlsZSAgdGhlIG90aGVyIGByaWdodCcgbGlzdCAgY29udGFpbnMgdGhlIGRlc2NlbmRpbmcKLSAgICBwcm9maWxlcy4KLQotICAgIEFzICBlYWNoIGdseXBoICBpcyBtYWRlICBvZiAgY2xvc2VkIGN1cnZlcywgIGEgc2ltcGxlICBnZW9tZXRyaWMKLSAgICBwcm9wZXJ0eSBlbnN1cmVzIHRoYXQgIHRoZSB0d28gbGlzdHMgY29udGFpbiB0aGUgIHNhbWUgbnVtYmVyIG9mCi0gICAgZWxlbWVudHMuCi0KLSAgICBDcmVhdGluZyBzcGFucyBpcyB0aHVzIHN0cmFpZ2h0Zm9yd2FyZDoKLQotICAgIDEuIFdlIHNvcnQgZWFjaCBsaXN0IGluIGluY3JlYXNpbmcgaG9yaXpvbnRhbCBvcmRlci4KLQotICAgIDIuIFdlIHBhaXIgIGVhY2ggdmFsdWUgb2YgIHRoZSBsZWZ0IGxpc3Qgd2l0aCAgaXRzIGNvcnJlc3BvbmRpbmcKLSAgICAgICB2YWx1ZSBpbiB0aGUgcmlnaHQgbGlzdC4KLQotCi0gICAgICAgICAgICAgICAgICAgLyAgICAgLyAgfCAgIHwgICAgICAgICAgRm9yIGV4YW1wbGUsIHdlIGhhdmUgaGVyZQotICAgICAgICAgICAgICAgICAgLyAgICAgLyAgIHwgICB8ICAgICAgICAgIGZvdXIgcHJvZmlsZXMuICBUd28gb2YKLSAgICAgICAgICAgICAgICA+LyAgICAgLyAgICB8ICAgfCAgfCAgICAgICB0aGVtIGFyZSBhc2NlbmRpbmcgKDEgJgotICAgICAgICAgICAgICAxLy8gICAgIC8gICBeIHwgICB8ICB8IDIgICAgIDMpLCB3aGlsZSB0aGUgdHdvIG90aGVycwotICAgICAgICAgICAgICAvLyAgICAgLy8gIDN8IHwgICB8ICB2ICAgICAgIGFyZSBkZXNjZW5kaW5nICgyICYgNCkuCi0gICAgICAgICAgICAgIC8gICAgIC8vNCAgIHwgfCAgIHwgICAgICAgICAgT24gdGhlIGdpdmVuIHNjYW5saW5lLAotICAgICAgICAgICBhIC8gICAgIC88ICAgICAgIHwgICB8ICAgICAgICAgIHRoZSBsZWZ0IGxpc3QgaXMgKDEsMyksCi0gICAgICAtIC0gLSAqLS0tLS0qIC0gLSAtIC0gKi0tLSogLSAtIHkgLSAgYW5kIHRoZSByaWdodCBvbmUgaXMKLSAgICAgICAgICAgLyAgICAgLyBiICAgICAgIGN8ICAgfGQgICAgICAgICAoNCwyKSAoc29ydGVkKS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgdGhlbiB0d28gc3BhbnMsIGpvaW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSB0byA0IChpLmUuIGEtYikgYW5kIDMgdG8gMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBjLWQpIQotCi0KLSAgICBTb3J0aW5nIGRvZXNuJ3QgbmVjZXNzYXJpbHkgIHRha2UgbXVjaCB0aW1lLCBhcyBpbiAgOTkgY2FzZXMgb3V0Ci0gICAgb2YgMTAwLCB0aGUgbGlzdHMnIG9yZGVyIGlzICBrZXB0IGZyb20gb25lIHNjYW5saW5lIHRvIHRoZSBuZXh0LgotICAgIFdlIGNhbiAgdGh1cyBpbXBsZW1lbnQgaXQgIHdpdGggdHdvIHNpbXBsZSAgc2luZ2x5LWxpbmtlZCBsaXN0cywKLSAgICBzb3J0ZWQgYnkgYSBjbGFzc2ljIGJ1YmJsZS1zb3J0LCB3aGljaCB0YWtlcyBhIG1pbmltdW0gYW1vdW50IG9mCi0gICAgdGltZSB3aGVuIHRoZSBsaXN0cyBhcmUgYWxyZWFkeSBzb3J0ZWQuCi0KLSAgICBBICBwcmV2aW91cyAgdmVyc2lvbiAgb2YgIHRoZSAgcmFzdGVyaXplciAgdXNlZCAgbW9yZSAgZWxhYm9yYXRlCi0gICAgc3RydWN0dXJlcywgbGlrZSBhcnJheXMgdG8gIHBlcmZvcm0gYGZhc3Rlcicgc29ydGluZy4gIEl0IHR1cm5lZAotICAgIG91dCB0aGF0ICB0aGlzIG9sZCBzY2hlbWUgaXMgIG5vdCBmYXN0ZXIgdGhhbiAgdGhlIG9uZSBkZXNjcmliZWQKLSAgICBhYm92ZS4KLQotICAgIE9uY2UgdGhlIHNwYW5zICBoYXZlIGJlZW4gYGNyZWF0ZWQnLCB3ZSBjYW4gIHNpbXBseSBkcmF3IHRoZW0gaW4KLSAgICB0aGUgdGFyZ2V0IGJpdG1hcC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHlyaWdodCAyMDAzLTIwMTcgYnkKLURhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLQotVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mIHRoZSAgRnJlZVR5cGUgIHByb2plY3QsIGFuZCBtYXkgIG9ubHkgYmUgIHVzZWQsCi1tb2RpZmllZCwgIGFuZCAgZGlzdHJpYnV0ZWQgIHVuZGVyICB0aGUgIHRlcm1zIG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QKLWxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcwotZmlsZSB5b3UgIGluZGljYXRlIHRoYXQgIHlvdSBoYXZlICByZWFkIHRoZSAgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCAgYW5kCi1hY2NlcHQgaXQgZnVsbHkuCi0KLQotLS0tIGVuZCBvZiByYXN0ZXIudHh0IC0tLQotCi1Mb2NhbCBWYXJpYWJsZXM6Ci1jb2Rpbmc6IHV0Zi04Ci1FbmQ6CmRpZmYgLS1naXQgYS9kb2NzL3JlZmVyZW5jZS8uZ2l0aWdub3JlIGIvZG9jcy9yZWZlcmVuY2UvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOWZjNy4uMDAwMDAwMAotLS0gYS9kb2NzL3JlZmVyZW5jZS8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotKi5odG1sCmRpZmYgLS1naXQgYS9kb2NzL3JlZmVyZW5jZS9SRUFETUUgYi9kb2NzL3JlZmVyZW5jZS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjA0ZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9yZWZlcmVuY2UvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1BZnRlciBzYXlpbmcgYG1ha2UgcmVmZG9jJyB0aGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgRnJlZVR5cGUgQVBJCi1yZWZlcmVuY2UuICBZb3UgbmVlZCBweXRob24gdG8gbWFrZSB0aGlzIHRhcmdldC4KLQotVGhpcyBhbHNvIHdvcmtzIHdpdGggSmFtOiBKdXN0IHR5cGUgYGphbSByZWZkb2MnIGluIHRoZSBtYWluIGRpcmVjdG9yeS4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9yZWxlYXNlIGIvZG9jcy9yZWxlYXNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdiMDY3Li4wMDAwMDAwCi0tLSBhL2RvY3MvcmVsZWFzZQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi1Ib3cgdG8gcHJlcGFyZSBhIG5ldyByZWxlYXNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS4gaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oOiAgVXBkYXRlIEZSRUVUWVBFX01BSk9SLCBGUkVFVFlQRV9NSU5PUiwKLSAgYW5kIEZSRUVUWVBFX1BBVENILgotCi0uIFVwZGF0ZSB2ZXJzaW9uIG51bWJlcnMgaW4gYWxsIGZpbGVzIHdoZXJlIG5lY2Vzc2FyeSAoZm9yIGV4YW1wbGUsIGRvCi0gIGEgZ3JlcCBmb3IgYm90aCBgMi4zLjEnIGFuZCBgMjMxJyBmb3IgcmVsZWFzZSAyLjMuMSkuCi0KLS4gYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogVXBkYXRlIGB2ZXJzaW9uX2luZm8nLgotCi0uIGRvY3MvQ0hBTkdFUzogRG9jdW1lbnQgZGlmZmVyZW5jZXMgdG8gbGFzdCByZWxlYXNlLgotCi0uIFJFQURNRTogVXBkYXRlLgotCi0uIGRvY3MvVkVSU0lPTlMuVFhUOiBEb2N1bWVudCBjaGFuZ2VkIGB2ZXJzaW9uX2luZm8nLgotCi0uIENoYW5nZUxvZzogICBBbm5vdW5jZSAgbmV3ICByZWxlYXNlICAgKGJvdGggIGluICB0aGUgIGZyZWV0eXBlMiAgYW5kCi0gIGZyZWV0eXBlMi1kZW1vcyBtb2R1bGVzKS4KLQotLiBDbG9uZSB0aGUgZ2l0IGFyY2hpdmUgdG8gYW5vdGhlciBkaXJlY3Rvcnkgd2l0aAotCi0gICAgZ2l0IGNsb25lIC1sIC1zIC4gLi4vZnJlZXR5cGUyLnRlc3QKLQotICBvciBzb21ldGhpbmcgbGlrZSB0aGlzIGFuZCBydW4KLQotICAgIG1ha2UgZGlzdGNsZWFuOyBtYWtlIGRldmVsOyBtYWtlCi0gICAgbWFrZSBkaXN0Y2xlYW47IG1ha2UgZGV2ZWw7IG1ha2UgbXVsdGkKLSAgICBtYWtlIGRpc3RjbGVhbjsgbWFrZSBkZXZlbCBDQz1nKys7IG1ha2UgQ0M9ZysrCi0gICAgbWFrZSBkaXN0Y2xlYW47IG1ha2UgZGV2ZWwgQ0M9ZysrOyBtYWtlIG11bHRpIENDPWcrKwotCi0gICAgc2ggYXV0b2dlbi5zaAotICAgIG1ha2UgZGlzdGNsZWFuOyAuL2NvbmZpZ3VyZTsgbWFrZQotICAgIG1ha2UgZGlzdGNsZWFuOyAuL2NvbmZpZ3VyZSBDQz1nKys7IG1ha2UKLQotICBpbiB0aGUgY2xvbmVkIHJlcG9zaXRvcnkgdG8gdGVzdCBjb21waWxhdGlvbiB3aXRoIGJvdGggZ2NjIGFuZCBnKysuCi0KLS4gVGVzdCBDKysgY29tcGlsYXRpb24gIGZvciBmcmVldHlwZTItZGVtb3MgdG9vICAodXNpbmcgYGdpdCBjbG9uZScgYXMKLSAgYWJvdmUpLgotCi0uIFJ1biAgc3JjL3Rvb2xzL2Noa3RyY21wLnB5ICBhbmQgY2hlY2sgIHRoYXQgdGhlcmUgIGFyZSBubyAgdW5kZWZpbmVkCi0gIHRyYWNlX1hYWFggbWFjcm9zLgotCi0uIEFmdGVyIHB1c2hpbmcgdGhlIG5ldyByZWxlYXNlLCAgdGFnIHRoZSBnaXQgcmVwb3NpdG9yaWVzIChmcmVldHlwZTIsCi0gIGZyZWV0eXBlMi1kZW1vcykgd2l0aAotCi0gICAgZ2l0IHRhZyBWRVItPHZlcnNpb24+IC1tICIiIC11IDxjb21taXR0ZXI+Ci0KLSAgYW5kIHB1c2ggdGhlIHRhZ3Mgd2l0aAotCi0gICAgZ2l0IHB1c2ggLS10YWdzCi0KLS4gQ2hlY2sgd2l0aAotCi0gICAgZ2l0IGNsZWFuIC1uZHgKLQotICB0aGF0IHRoZSBnaXQgZGlyZWN0b3J5IGlzIHJlYWxseSBjbGVhbiAgKGFuZCByZW1vdmUgZXh0cmFuZW91cyBmaWxlcwotICBpZiBuZWNlc3NhcnkpLgotCi0uIFNheSBgbWFrZSAgZGlzdCcgaW4gYm90aCB0aGUgIGZyZWV0eXBlMiBhbmQgZnJlZXR5cGUyLWRlbW9zICBtb2R1bGVzCi0gIHRvIGdlbmVyYXRlIHRoZSAudGFyLmd6LCAudGFyLmJ6MiwgYW5kIC56aXAgZmlsZXMuCi0KLS4gQ3JlYXRlICAgICB0aGUgICAgIGRvYyAgICBidW5kbGVzICAgIChmcmVldHlwZS1kb2MtPHZlcnNpb24+LnRhci5neiwKLSAgZnJlZXR5cGUtZG9jLTx2ZXJzaW9uPi50YXIuYnoyLCAgICBmdGRvYzx2ZXJzaW9uPi56aXApLiAgICBUaGlzICAgaXMKLSAgZXZlcnl0aGluZyBpbgotCi0gICAgPGZyZWV0eXBlLXdlYiBnaXQgcmVwb3NpdG9yeT4vZnJlZXR5cGUyL2RvY3MKLQotICBleGNlcHQgdGhlIGByZWZlcmVuY2UnIHN1YmRpcmVjdG9yeS4gICBEbyAqbm90KiB1c2Ugb3B0aW9uIGAtbCcgZnJvbQotICB6aXAhCi0KLS4gUnVuIHRoZSBmb2xsb3dpbmcgc2NyaXB0ICh3aXRoIHVwZGF0ZWQgYCRWRVJTSU9OJywgYCRTQVZBTk5BSF9VU0VSJywKLSAgYW5kICRTT1VSQ0VGT1JHRV9VU0VSICB2YXJpYWJsZXMpIHRvIHNpZ24gYW5kIHVwbG9hZCB0aGUgIGJ1bmRsZXMgdG8KLSAgYm90aCBTYXZhbm5haCBhbmQgU291cmNlRm9yZ2UuICBUaGUgc2lnbmluZyBjb2RlIGhhcyBiZWVuIHRha2VuIGZyb20KLSAgdGhlIGBnbnVwbG9hZCcgc2NyaXB0IChwYXJ0IG9mIHRoZSBhdXRvbWFrZSBidW5kbGUpLgotCi0gICAgIyEvYmluL3NoCi0KLSAgICBWRVJTSU9OPTIuNS4xCi0gICAgU0FWQU5OQUhfVVNFUj13bAotICAgIFNPVVJDRUZPUkdFX1VTRVI9d2xlbWIKLQotICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0gICAgR1BHPScvdXNyL2Jpbi9ncGcgLS1iYXRjaCAtLW5vLXR0eScKLQotICAgIHZlcnNpb249YGVjaG8gJFZFUlNJT04gfCBzZWQgInMvXFwuLy9nImAKLQotICAgIEZSRUVUWVBFX1BBQ0tBR0VTPSJmcmVldHlwZS0kVkVSU0lPTi50YXIuZ3ogXAotICAgICAgICAgICAgICAgICAgICAgICBmcmVldHlwZS0kVkVSU0lPTi50YXIuYnoyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgZnQkdmVyc2lvbi56aXAiCi0gICAgRlQyREVNT1NfUEFDS0FHRVM9ImZ0MmRlbW9zLSRWRVJTSU9OLnRhci5neiBcCi0gICAgICAgICAgICAgICAgICAgICAgIGZ0MmRlbW9zLSRWRVJTSU9OLnRhci5iejIgXAotICAgICAgICAgICAgICAgICAgICAgICBmdGRtbyR2ZXJzaW9uLnppcCIKLSAgICBGVERPQ19QQUNLQUdFUz0iZnJlZXR5cGUtZG9jLSRWRVJTSU9OLnRhci5neiBcCi0gICAgICAgICAgICAgICAgICAgIGZyZWV0eXBlLWRvYy0kVkVSU0lPTi50YXIuYnoyIFwKLSAgICAgICAgICAgICAgICAgICAgZnRkb2MkdmVyc2lvbi56aXAiCi0KLSAgICBQQUNLQUdFX0xJU1Q9IiRGUkVFVFlQRV9QQUNLQUdFUyBcCi0gICAgICAgICAgICAgICAgICAkRlQyREVNT1NfUEFDS0FHRVMgXAotICAgICAgICAgICAgICAgICAgJEZURE9DX1BBQ0tBR0VTIgotCi0gICAgc2V0IC1lCi0gICAgdW5zZXQgcGFzc3BocmFzZQotCi0gICAgUEFUSD0vZW1wdHkgZWNobyAtbiAiRW50ZXIgR1BHIHBhc3NwaHJhc2U6ICIKLSAgICBzdHR5IC1lY2hvCi0gICAgcmVhZCAtciBwYXNzcGhyYXNlCi0gICAgc3R0eSBlY2hvCi0gICAgZWNobwotCi0gICAgZm9yIGYgaW4gJFBBQ0tBR0VfTElTVDsgZG8KLSAgICAgIGlmIHRlc3QgISAtZiAkZjsgdGhlbgotICAgICAgICBlY2hvICIkMDogQ2Fubm90IGZpbmQgXGAkZiciIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBlbHNlCi0gICAgICAgIDoKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgZm9yIGYgaW4gJFBBQ0tBR0VfTElTVDsgZG8KLSAgICAgIGVjaG8gIlNpZ25pbmcgJGYuLi4iCi0gICAgICBybSAtZiAkZi5zaWcKLSAgICAgIGVjaG8gJHBhc3NwaHJhc2UgfCAkR1BHIC0tcGFzc3BocmFzZS1mZCAwIC1iYSAtbyAkZi5zaWcgJGYKLSAgICBkb25lCi0KLSAgICBGUkVFVFlQRV9TSUdOQVRVUkVTPQotICAgIGZvciBpIGluICRGUkVFVFlQRV9QQUNLQUdFUzsgZG8KLSAgICAgIEZSRUVUWVBFX1NJR05BVFVSRVM9IiRGUkVFVFlQRV9TSUdOQVRVUkVTICRpLnNpZyIKLSAgICBkb25lCi0KLSAgICBGVDJERU1PU19TSUdOQVRVUkVTPQotICAgIGZvciBpIGluICRGVDJERU1PU19QQUNLQUdFUzsgZG8KLSAgICAgIEZUMkRFTU9TX1NJR05BVFVSRVM9IiRGVDJERU1PU19TSUdOQVRVUkVTICRpLnNpZyIKLSAgICBkb25lCi0KLSAgICBGVERPQ19TSUdOQVRVUkVTPQotICAgIGZvciBpIGluICRGVERPQ19QQUNLQUdFUzsgZG8KLSAgICAgIEZURE9DX1NJR05BVFVSRVM9IiRGVERPQ19TSUdOQVRVUkVTICRpLnNpZyIKLSAgICBkb25lCi0KLSAgICBTSUdOQVRVUkVfTElTVD0iJEZSRUVUWVBFX1NJR05BVFVSRVMgXAotICAgICAgICAgICAgICAgICAgICAkRlQyREVNT1NfU0lHTkFUVVJFUyBcCi0gICAgICAgICAgICAgICAgICAgICRGVERPQ19TSUdOQVRVUkVTIgotCi0gICAgc2NwICRQQUNLQUdFX0xJU1QgJFNJR05BVFVSRV9MSVNUIFwKLSAgICAgICRTQVZBTk5BSF9VU0VSQGRsLnN2Lm5vbmdudS5vcmc6L3JlbGVhc2VzL2ZyZWV0eXBlLwotCi0gICAgcnN5bmMgLWF2UCAtZSBzc2ggJEZSRUVUWVBFX1BBQ0tBR0VTICRGUkVFVFlQRV9TSUdOQVRVUkVTIFwKLSAgICAgICRTT1VSQ0VGT1JHRV9VU0VSLGZyZWV0eXBlQGZycy5zZi5uZXQ6L2hvbWUvZnJzL3Byb2plY3QvZi9mci9mcmVldHlwZS9mcmVldHlwZTIvJFZFUlNJT04vCi0gICAgcnN5bmMgLWF2UCAtZSBzc2ggJEZUMkRFTU9TX1BBQ0tBR0VTICRGVDJERU1PU19TSUdOQVRVUkVTIFwKLSAgICAgICRTT1VSQ0VGT1JHRV9VU0VSLGZyZWV0eXBlQGZycy5zZi5uZXQ6L2hvbWUvZnJzL3Byb2plY3QvZi9mci9mcmVldHlwZS9mcmVldHlwZS1kZW1vcy8kVkVSU0lPTi8KLSAgICByc3luYyAtYXZQIC1lIHNzaCAkRlRET0NfUEFDS0FHRVMgJEZURE9DX1NJR05BVFVSRVMgXAotICAgICAgJFNPVVJDRUZPUkdFX1VTRVIsZnJlZXR5cGVAZnJzLnNmLm5ldDovaG9tZS9mcnMvcHJvamVjdC9mL2ZyL2ZyZWV0eXBlL2ZyZWV0eXBlLWRvY3MvJFZFUlNJT04vCi0KLSAgICAjIEVPRgotCi0uIFByZXBhcmUgYSAgUkVBRE1FIGZvciBTb3VyY2VGb3JnZSAgYW5kIHVwbG9hZCBpdCAgd2l0aCB0aGUgZm9sbG93aW5nCi0gIHNjcmlwdCAod2l0aCB1cGRhdGVkIGAkVkVSU0lPTicgYW5kICRTT1VSQ0VGT1JHRV9VU0VSIHZhcmlhYmxlcykuCi0KLSAgICAjIS9iaW4vc2gKLQotICAgIFZFUlNJT049Mi41LjEKLSAgICBTT1VSQ0VGT1JHRV9VU0VSPXdsZW1iCi0KLSAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotICAgIHJzeW5jIC1hdlAgLWUgc3NoIFJFQURNRSBcCi0gICAgICAkU09VUkNFRk9SR0VfVVNFUixmcmVldHlwZUBmcnMuc2YubmV0Oi9ob21lL2Zycy9wcm9qZWN0L2YvZnIvZnJlZXR5cGUvZnJlZXR5cGUyLyRWRVJTSU9OLwotCi0gICAgIyBFT0YKLQotLiBPbiAgIFNvdXJjZUZvcmdlLCAgIHRhZyAgIHRoZSAgICBqdXN0ICAgdXBsb2FkZWQgICBgZnRYWFguemlwJyAgIGFuZAotICBgZnJlZXR5cGUtWFhYLnRhci5iejInICBmaWxlcyBhcyB0aGUgIGRlZmF1bHQgZmlsZXMgdG8gIGRvd25sb2FkIGZvcgotICBgV2luZG93cycgYW5kIGBPdGhlcnMnLCByZXNwZWN0aXZlbHkuCi0KLS4gQ29weSB0aGUgcmVmZXJlbmNlIGZpbGVzIChnZW5lcmF0ZWQgYnkgYG1ha2UgZGlzdCcpIHRvCi0KLSAgICA8ZnJlZXR5cGUtd2ViIGdpdCByZXBvc2l0b3J5Pi9mcmVldHlwZTIvZG9jcy9yZWZlcmVuY2UKLQotLiBVcGRhdGUgdGhlIGBmcmVldHlwZS13ZWInIHJlcG9zaXRvcnkuICBgZ2l0IHB1c2gnIHRoZW4gYXV0b21hdGljYWxseQotICB0cmlnZ2VycyBhbiB1cGRhdGUgIG9mIHRoZSBwdWJsaWMgd2ViIHBhZ2VzICB3aXRoaW4gdGVuIG1pbnV0ZXMsIGR1ZQotICB0byBhIGNyb24gc2NyaXB0IChvbiB3bEBmcmVlZGVza3RvcC5vcmcpIHRoYXQgcnN5bmNzIHdpdGgKLQotICAgIGZyZWVkZXNrdG9wLm9yZzovL3Nydi9mcmVldHlwZS5mcmVlZGVza3RvcC5vcmcvd3d3Ci0KLS4gQW5ub3VuY2UgbmV3IHJlbGVhc2Ugb24gZnJlZXR5cGUtYW5ub3VuY2VAbm9uZ251Lm9yZyBhbmQgdG8gcmVsZXZhbnQKLSAgbmV3c2dyb3Vwcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAwMy0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgIGZpbGUgaXMgIHBhcnQgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdCwgYW5kICBtYXkgb25seSAgYmUgdXNlZCwKLW1vZGlmaWVkLCAgYW5kIGRpc3RyaWJ1dGVkICB1bmRlciB0aGUgIHRlcm1zIG9mICB0aGUgIEZyZWVUeXBlIHByb2plY3QKLWxpY2Vuc2UsICBMSUNFTlNFLlRYVC4gIEJ5ICBjb250aW51aW5nIHRvICB1c2UsIG1vZGlmeSwgIG9yIGRpc3RyaWJ1dGUKLXRoaXMgZmlsZSB5b3UgIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCAgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQKLWFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLQotLS0tIGVuZCBvZiByZWxlYXNlIC0tLQpkaWZmIC0tZ2l0IGEvZ2x5cGh0ZXN0L2dlbmVyYXRlLW9sZC1oYXNoZXMuYyBiL2dlbmVyYXRlLW9sZC1oYXNoZXMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ2x5cGh0ZXN0L2dlbmVyYXRlLW9sZC1oYXNoZXMuYwpyZW5hbWUgdG8gZ2VuZXJhdGUtb2xkLWhhc2hlcy5jCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5YWViZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y29uZmlnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBTlNJLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgYSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMgdGhhdCBhcmUgdXNlZCAqLwotICAvKiBieSB0aGUgcmVzdCBvZiB0aGUgZW5naW5lLiAgTW9zdCBvZiB0aGUgbWFjcm9zIGhlcmUgYXJlIGF1dG9tYXRpY2FsbHkgKi8KLSAgLyogZGV0ZXJtaW5lZCBhdCBjb21waWxlIHRpbWUsIGFuZCB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNoYW5nZSBpdCB0byAgICovCi0gIC8qIHBvcnQgRnJlZVR5cGUsIGV4Y2VwdCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSBub24tQU5TSSAgICAgICAgICAqLwotICAvKiBjb21waWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgaG93ZXZlciB0aGF0IGlmIHNvbWUgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkLCB3ZSAgICAgICAqLwotICAvKiBhZHZpc2UgeW91IHRvIHBsYWNlIGEgbW9kaWZpZWQgY29weSBpbiB5b3VyIGJ1aWxkIGRpcmVjdG9yeS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBidWlsZCBkaXJlY3RvcnkgaXMgdXN1YWxseSBgYnVpbGRzLzxzeXN0ZW0+JywgYW5kIGNvbnRhaW5zICAgICAgICAqLwotICAvKiBzeXN0ZW0tc3BlY2lmaWMgZmlsZXMgdGhhdCBhcmUgYWx3YXlzIGluY2x1ZGVkIGZpcnN0IHdoZW4gYnVpbGRpbmcgICAgKi8KLSAgLyogdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIEFOU0kgdmVyc2lvbiBzaG91bGQgc3RheSBpbiBgaW5jbHVkZS9jb25maWcvJy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEZUQ09ORklHX0hfCi0jZGVmaW5lIEZUQ09ORklHX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX09QVElPTlNfSAotI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIFBMQVRGT1JNLVNQRUNJRklDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIG1hY3JvcyBjYW4gYmUgdG9nZ2xlZCB0byBzdWl0IGEgc3BlY2lmaWMgc3lzdGVtLiAgVGhlIGN1cnJlbnQgICAqLwotICAvKiBvbmVzIGFyZSBkZWZhdWx0cyB1c2VkIHRvIGNvbXBpbGUgRnJlZVR5cGUgaW4gYW4gQU5TSSBDIGVudmlyb25tZW50ICAgKi8KLSAgLyogKDE2Yml0IGNvbXBpbGVycyBhcmUgYWxzbyBzdXBwb3J0ZWQpLiAgQ29weSB0aGlzIGZpbGUgdG8geW91ciBvd24gICAgICovCi0gIC8qIGBidWlsZHMvPHN5c3RlbT4nIGRpcmVjdG9yeSwgYW5kIGVkaXQgaXQgdG8gcG9ydCB0aGUgZW5naW5lLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBUaGVyZSBhcmUgc3lzdGVtcyAobGlrZSB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgJ0M1NHgpIHdoZXJlIGEgYGNoYXInICovCi0gIC8qIGhhcyAxNiBiaXRzLiAgQU5TSSBDIHNheXMgdGhhdCBzaXplb2YoY2hhcikgaXMgYWx3YXlzIDEuICBTaW5jZSBhbiAgKi8KLSAgLyogYGludCcgaGFzIDE2IGJpdHMgYWxzbyBmb3IgdGhpcyBzeXN0ZW0sIHNpemVvZihpbnQpIGdpdmVzIDEgd2hpY2ggICAqLwotICAvKiBpcyBwcm9iYWJseSB1bmV4cGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYENIQVJfQklUJyAoZGVmaW5lZCBpbiBsaW1pdHMuaCkgZ2l2ZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgICAgICAqLwotICAvKiBgY2hhcicgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZm5kZWYgRlRfQ0hBUl9CSVQKLSNkZWZpbmUgRlRfQ0hBUl9CSVQgIENIQVJfQklUCi0jZW5kaWYKLQotCi0gIC8qIFRoZSBzaXplIG9mIGFuIGBpbnQnIHR5cGUuICAqLwotI2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDE2IC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDMyIC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiBGVF9VSU5UX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfSU5UICAoNjQgLyBGVF9DSEFSX0JJVCkKLSNlbHNlCi0jZXJyb3IgIlVuc3VwcG9ydGVkIHNpemUgb2YgYGludCcgdHlwZSEiCi0jZW5kaWYKLQotICAvKiBUaGUgc2l6ZSBvZiBhIGBsb25nJyB0eXBlLiAgQSBmaXZlLWJ5dGUgYGxvbmcnIChhcyB1c2VkIGUuZy4gb24gdGhlICovCi0gIC8qIERNNjQyKSBpcyByZWNvZ25pemVkIGJ1dCBhdm9pZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoMzIgLyBGVF9DSEFSX0JJVCkKLSNlbGlmIEZUX1VMT05HX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICgzMiAvIEZUX0NIQVJfQklUKQotI2VsaWYgRlRfVUxPTkdfTUFYID4gMHhGRkZGRkZGRlVMICYmIEZUX1VMT05HX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKDY0IC8gRlRfQ0hBUl9CSVQpCi0jZWxzZQotI2Vycm9yICJVbnN1cHBvcnRlZCBzaXplIG9mIGBsb25nJyB0eXBlISIKLSNlbmRpZgotCi0KLSAgLyogRlRfVU5VU0VEIGlzIGEgbWFjcm8gdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gcGFyYW1ldGVyIGlzIG5vdCAgKi8KLSAgLyogdXNlZCAtLSB0aGlzIGlzIG9ubHkgdXNlZCB0byBnZXQgcmlkIG9mIHVucGxlYXNhbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KLSNpZm5kZWYgRlRfVU5VU0VECi0jZGVmaW5lIEZUX1VOVVNFRCggYXJnICkgICggKGFyZykgPSAoYXJnKSApCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBBVVRPTUFUSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBtYWNyb3MgYXJlIGNvbXB1dGVkIGZyb20gdGhlIG9uZXMgZGVmaW5lZCBhYm92ZS4gIERvbid0IHRvdWNoICAgKi8KLSAgLyogdGhlaXIgZGVmaW5pdGlvbiwgdW5sZXNzIHlvdSBrbm93IHByZWNpc2VseSB3aGF0IHlvdSBhcmUgZG9pbmcuICBObyAgICovCi0gIC8qIHBvcnRlciBzaG91bGQgbmVlZCB0byBtZXNzIHdpdGggdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1hYyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIGlzIHRoZSBvbmx5IG5lY2Vzc2FyeSBjaGFuZ2UsIHNvIGl0IGlzIGRlZmluZWQgaGVyZSBpbnN0ZWFkICAgICovCi0gIC8qICAgcHJvdmlkaW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKCBfX0FQUExFX18gKSB8fCAoIGRlZmluZWQoIF9fTVdFUktTX18gKSAmJiBkZWZpbmVkKCBtYWNpbnRvc2ggKSApCi0gIC8qIG5vIENhcmJvbiBmcmFtZXdvcmtzIGZvciA2NGJpdCAxMC40LnggKi8KLSAgLyogQXZhaWxhYmlsaXR5TWFjcm9zLmggaXMgYXZhaWxhYmxlIHNpbmNlIE1hYyBPUyBYIDEwLjIsICAgICAgICAqLwotICAvKiBzbyBndWVzcyB0aGUgc3lzdGVtIHZlcnNpb24gYnkgbWF4aW11bSBlcnJubyBiZWZvcmUgaW5jbHVzaW9uICovCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZmRlZiBFQ0FOQ0VMRUQgLyogZGVmaW5lZCBzaW5jZSAxMC4yICovCi0jaW5jbHVkZSAiQXZhaWxhYmlsaXR5TWFjcm9zLmgiCi0jZW5kaWYKLSNpZiBkZWZpbmVkKCBfX0xQNjRfXyApICYmIFwKLSAgICAoIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDw9IE1BQ19PU19YX1ZFUlNJT05fMTBfNCApCi0jdW5kZWYgRlRfTUFDSU5UT1NICi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZCggX19TQ19fICkgfHwgZGVmaW5lZCggX19NUkNfXyApCi0gIC8qIENsYXNzaWMgTWFjT1MgY29tcGlsZXJzICovCi0jaW5jbHVkZSAiQ29uZGl0aW9uYWxNYWNyb3MuaCIKLSNpZiBUQVJHRVRfT1NfTUFDCi0jZGVmaW5lIEZUX01BQ0lOVE9TSCAxCi0jZW5kaWYKLQotI2VuZGlmCi0KLQotICAvKiBGaXggY29tcGlsZXIgd2FybmluZyB3aXRoIHNnaSBjb21waWxlciAqLwotI2lmIGRlZmluZWQoIF9fc2dpICkgJiYgIWRlZmluZWQoIF9fR05VQ19fICkKLSNpZiBkZWZpbmVkKCBfQ09NUElMRVJfVkVSU0lPTiApICYmICggX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzMwICkKLSNwcmFnbWEgc2V0IHdvZmYgMzUwNQotI2VuZGlmCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMTZiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9JbnQxNjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAxNmJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRlRfVUludDE2OwotCi0gIC8qICovCi0KLQotICAvKiB0aGlzICNpZiAwIC4uLiAjZW5kaWYgY2xhdXNlIGlzIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzICovCi0jaWYgMAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAzMmJpdCBzaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIFhYWCAgRlRfSW50MzI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAzMmJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgWFhYICBGVF9VSW50MzI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSA2NGJpdCBzaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gIE9ubHkgZGVmaW5lZCBpZiB0aGVyZSBpcyByZWFsIDY0Yml0IHN1cHBvcnQ7ICAgKi8KLSAgLyogICAgb3RoZXJ3aXNlLCBpdCBnZXRzIGVtdWxhdGVkIHdpdGggYSBzdHJ1Y3R1cmUgKGlmIG5lY2Vzc2FyeSkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBYWFggIEZUX0ludDY0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgNjRiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICBPbmx5IGRlZmluZWQgaWYgdGhlcmUgaXMgcmVhbCA2NGJpdCBzdXBwb3J0OyAgICovCi0gIC8qICAgIG90aGVyd2lzZSwgaXQgZ2V0cyBlbXVsYXRlZCB3aXRoIGEgc3RydWN0dXJlIChpZiBuZWNlc3NhcnkpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBYWFggIEZUX1VJbnQ2NDsKLQotICAvKiAqLwotCi0jZW5kaWYKLQotI2lmIEZUX1NJWkVPRl9JTlQgPT0gKDMyIC8gRlRfQ0hBUl9CSVQpCi0KLSAgdHlwZWRlZiBzaWduZWQgaW50ICAgICAgRlRfSW50MzI7Ci0gIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgIEZUX1VJbnQzMjsKLQotI2VsaWYgRlRfU0laRU9GX0xPTkcgPT0gKDMyIC8gRlRfQ0hBUl9CSVQpCi0KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgRlRfSW50MzI7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIEZUX1VJbnQzMjsKLQotI2Vsc2UKLSNlcnJvciAibm8gMzJiaXQgdHlwZSBmb3VuZCAtLSBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGVzIgotI2VuZGlmCi0KLQotICAvKiBsb29rIHVwIGFuIGludGVnZXIgdHlwZSB0aGF0IGlzIGF0IGxlYXN0IDMyIGJpdHMgKi8KLSNpZiBGVF9TSVpFT0ZfSU5UID49ICgzMiAvIEZUX0NIQVJfQklUKQotCi0gIHR5cGVkZWYgaW50ICAgICAgICAgICAgRlRfRmFzdDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICBGVF9VRmFzdDsKLQotI2VsaWYgRlRfU0laRU9GX0xPTkcgPj0gKDMyIC8gRlRfQ0hBUl9CSVQpCi0KLSAgdHlwZWRlZiBsb25nICAgICAgICAgICBGVF9GYXN0OwotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIEZUX1VGYXN0OwotCi0jZW5kaWYKLQotCi0gIC8qIGRldGVybWluZSB3aGV0aGVyIHdlIGhhdmUgYSA2NC1iaXQgaW50IHR5cGUgZm9yIHBsYXRmb3JtcyB3aXRob3V0ICovCi0gIC8qIEF1dG9jb25mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgRlRfU0laRU9GX0xPTkcgPT0gKDY0IC8gRlRfQ0hBUl9CSVQpCi0KLSAgLyogRlRfTE9ORzY0IG11c3QgYmUgZGVmaW5lZCBpZiBhIDY0LWJpdCB0eXBlIGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nCi0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSA2NC1iaXQgZGF0YSB0eXBlIG1heSBjcmVhdGUgY29tcGlsYXRpb24gcHJvYmxlbXMgaWYgeW91IGNvbXBpbGUgICAgICovCi0gIC8qIGluIHN0cmljdCBBTlNJIG1vZGUuICBUbyBhdm9pZCB0aGVtLCB3ZSBkaXNhYmxlIG90aGVyIDY0LWJpdCBkYXRhICAgICAqLwotICAvKiB0eXBlcyBpZiBfX1NURENfXyBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGlnbm9yZSB0aGlzIHJ1bGUgICAgICAgKi8KLSAgLyogYnkgZGVmaW5pbmcgdGhlIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgY29uZmlndXJhdGlvbiBtYWNyby4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VsaWYgIWRlZmluZWQoIF9fU1REQ19fICkgfHwgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCApCi0KLSNpZiBkZWZpbmVkKCBfX1NURENfVkVSU0lPTl9fICkgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCi0KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VsaWYgZGVmaW5lZCggX01TQ19WRVIgKSAmJiBfTVNDX1ZFUiA+PSA5MDAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0KLSAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgX19pbnQ2NCB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIF9faW50NjQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fQk9STEFORENfXyApICAvKiBCb3JsYW5kIEMrKyAqLwotCi0gIC8qIFhYWFg6IFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgdmFsdWUgb2YgX19CT1JMQU5EQ19fIGluIG9yZGVyICovCi0gIC8qICAgICAgIHRvIHRlc3QgdGhlIGNvbXBpbGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgX19pbnQ2NCB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIF9faW50NjQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fV0FUQ09NQ19fICkgICAvKiBXYXRjb20gQysrICovCi0KLSAgLyogV2F0Y29tIGRvZXNuJ3QgcHJvdmlkZSA2NC1iaXQgZGF0YSB0eXBlcyAqLwotCi0jZWxpZiBkZWZpbmVkKCBfX01XRVJLU19fICkgICAgLyogTWV0cm93ZXJrcyBDb2RlV2FycmlvciAqLwotCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSNlbGlmIGRlZmluZWQoIF9fR05VQ19fICkKLQotICAvKiBHQ0MgcHJvdmlkZXMgdGhlIGBsb25nIGxvbmcnIHR5cGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VuZGlmIC8qIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCAqLwotCi0jZW5kaWYgLyogRlRfU0laRU9GX0xPTkcgPT0gKDY0IC8gRlRfQ0hBUl9CSVQpICovCi0KLSNpZmRlZiBGVF9MT05HNjQKLSAgdHlwZWRlZiBGVF9JTlQ2NCAgIEZUX0ludDY0OwotICB0eXBlZGVmIEZUX1VJTlQ2NCAgRlRfVUludDY0OwotI2VuZGlmCi0KLQotI2lmZGVmIF9XSU42NAotICAvKiBvbmx5IDY0Yml0IFdpbmRvd3MgdXNlcyB0aGUgTExQNjQgZGF0YSBtb2RlbCwgaS5lLiwgKi8KLSAgLyogMzJiaXQgaW50ZWdlcnMsIDY0Yml0IHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VJTlRfVE9fUE9JTlRFUiggeCApICh2b2lkKikodW5zaWduZWQgX19pbnQ2NCkoeCkKLSNlbHNlCi0jZGVmaW5lIEZUX1VJTlRfVE9fUE9JTlRFUiggeCApICh2b2lkKikodW5zaWduZWQgbG9uZykoeCkKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfQkVHSU5fU1RNTlQgIGRvIHsKLSNkZWZpbmUgRlRfRU5EX1NUTU5UICAgIH0gd2hpbGUgKCAwICkKLSNkZWZpbmUgRlRfRFVNTVlfU1RNTlQgIEZUX0JFR0lOX1NUTU5UIEZUX0VORF9TVE1OVAotCi0KLSAgLyogdHlwZW9mIGNvbmRpdGlvbiB0YWtlbiBmcm9tIGdudWxpYidzIGBpbnRwcm9wcy5oJyBoZWFkZXIgZmlsZSAqLwotI2lmICggKCBkZWZpbmVkKCBfX0dOVUNfXyApICYmIF9fR05VQ19fID49IDIgKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAotICAgICAgKCBkZWZpbmVkKCBfX0lCTUNfXyApICYmIF9fSUJNQ19fID49IDEyMTAgJiYgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkZWZpbmVkKCBfX0lCTV9fVFlQRU9GX18gKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAotICAgICAgKCBkZWZpbmVkKCBfX1NVTlBST19DICkgJiYgX19TVU5QUk9fQyA+PSAweDUxMTAgJiYgIV9fU1REQ19fICkgKQotI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgKCBfX3R5cGVvZl9fICggdHlwZSApICkKLSNlbHNlCi0jZGVmaW5lIEZUX1RZUEVPRiggdHlwZSApICAvKiBlbXB0eSAqLwotI2VuZGlmCi0KLQotI2lmZGVmIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgc3RhdGljICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICBzdGF0aWMgIHgKLQotI2Vsc2UKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0xPQ0FMKCB4ICkgICAgICBleHRlcm4gIkMiICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgZXh0ZXJuICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QgKi8KLQotI2RlZmluZSBGVF9MT0NBTF9BUlJBWSggeCApICAgICAgZXh0ZXJuIGNvbnN0ICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0FSUkFZX0RFRiggeCApICBjb25zdCAgeAotCi0KLSNpZm5kZWYgRlRfQkFTRQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkFTRSggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9CQVNFKCB4ICkgIGV4dGVybiAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfQkFTRSAqLwotCi0KLSNpZm5kZWYgRlRfQkFTRV9ERUYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0JBU0VfREVGKCB4ICkgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0JBU0VfREVGKCB4ICkgIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0JBU0VfREVGICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlQKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVCggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlQgKi8KLQotCi0jaWZuZGVmIEZUX0VYUE9SVF9ERUYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUX0RFRiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0VYUE9SVF9ERUYgKi8KLQotCi0jaWZuZGVmIEZUX0VYUE9SVF9WQVIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUX1ZBUiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0VYUE9SVF9WQVIgKi8KLQotICAvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgbmVlZGVkIHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhICAgKi8KLSAgLyogQysrIGNvbXBpbGVyIGFuZCB3aXRoIDE2Yml0IGNvbXBpbGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIFRoaXMgaXMgc3BlY2lhbC4gIFdpdGhpbiBDKyssIHlvdSBtdXN0IHNwZWNpZnkgYGV4dGVybiAiQyInIGZvciAqLwotICAvKiBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgdmlhIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgeW91IGFsc28gICAgKi8KLSAgLyogbXVzdCBkbyB0aGF0IGZvciBzdHJ1Y3R1cmVzIHdoaWNoIGNvbnRhaW4gZnVuY3Rpb24gcG9pbnRlcnMgdG8gICovCi0gIC8qIGFzc3VyZSBDIGxpbmthZ2UgLS0gaXQncyBub3QgcG9zc2libGUgdG8gaGF2ZSAobG9jYWwpIGFub255bW91cyAqLwotICAvKiBmdW5jdGlvbnMgd2hpY2ggYXJlIGFjY2Vzc2VkIGJ5IChnbG9iYWwpIGZ1bmN0aW9uIHBvaW50ZXJzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX0NBTExCQUNLX1RBQkxFIGlzIHVzZWQgdG8gX2RlY2xhcmVfIGEgY29uc3RhbnQgdmFyaWFibGUgdGhhdCAqLwotICAvKiBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX0NBTExCQUNLX1RBQkxFX0RFRiBpcyB1c2VkIHRvIF9kZWZpbmVfIGEgY29uc3RhbnQgdmFyaWFibGUgICAqLwotICAvKiB0aGF0IGNvbnRhaW5zIHBvaW50ZXJzIHRvIGNhbGxiYWNrIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIDE2Yml0IGNvbXBpbGVycyBoYXZlIHRvIHJlZGVmaW5lIHRoZXNlIG1hY3JvcyB0byBpbnNlcnQgICAgKi8KLSAgLyogdGhlIGluZmFtb3VzIGBfY2RlY2wnIG9yIGBfX2Zhc3RjYWxsJyBkZWNsYXJhdGlvbnMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DQUxMQkFDS19ERUYKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9DQUxMQkFDS19ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIHN0YXRpYyAgeAotI2VuZGlmCi0jZW5kaWYgLyogRlRfQ0FMTEJBQ0tfREVGICovCi0KLSNpZm5kZWYgRlRfQ0FMTEJBQ0tfVEFCTEUKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRSAgICAgIGV4dGVybiAiQyIKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICBleHRlcm4gIkMiCi0jZWxzZQotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRSAgICAgIGV4dGVybgotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRV9ERUYgIC8qIG5vdGhpbmcgKi8KLSNlbmRpZgotI2VuZGlmIC8qIEZUX0NBTExCQUNLX1RBQkxFICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBGVENPTkZJR19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTFhZjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGhlYWRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQnVpbGQgbWFjcm9zIG9mIHRoZSBGcmVlVHlwZSAyIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEZUSEVBREVSX0hfCi0jZGVmaW5lIEZUSEVBREVSX0hfCi0KLQotICAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CRUdJTl9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gd2l0aCBARlRfRU5EX0hFQURFUiBpbiBoZWFkZXIgICAgKi8KLSAgLyogICAgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyB3aXRoaW4gYXJlIHByb3Blcmx5ICAgICAgICAgICovCi0gIC8qICAgIGVuY2Fwc3VsYXRlZCBpbiBhbiBgZXh0ZXJuICJDIiB7IC4uIH0nIGJsb2NrIHdoZW4gaW5jbHVkZWQgZnJvbSBhICAqLwotICAvKiAgICBDKysgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkVHSU5fSEVBREVSICBleHRlcm4gIkMiIHsKLSNlbHNlCi0jZGVmaW5lIEZUX0JFR0lOX0hFQURFUiAgLyogbm90aGluZyAqLwotI2VuZGlmCi0KLQotICAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkRfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gd2l0aCBARlRfQkVHSU5fSEVBREVSIGluIGhlYWRlciAgKi8KLSAgLyogICAgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyB3aXRoaW4gYXJlIHByb3Blcmx5ICAgICAgICAgICovCi0gIC8qICAgIGVuY2Fwc3VsYXRlZCBpbiBhbiBgZXh0ZXJuICJDIiB7IC4uIH0nIGJsb2NrIHdoZW4gaW5jbHVkZWQgZnJvbSBhICAqLwotICAvKiAgICBDKysgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfRU5EX0hFQURFUiAgfQotI2Vsc2UKLSNkZWZpbmUgRlRfRU5EX0hFQURFUiAgLyogbm90aGluZyAqLwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsaWFzZXMgZm9yIHRoZSBGcmVlVHlwZSAyIHB1YmxpYyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVhZGVyX2ZpbGVfbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVhZGVyIEZpbGUgTWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFjcm8gZGVmaW5pdGlvbnMgdXNlZCB0byAjaW5jbHVkZSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlZmluZWQgdG8gdGhlIG5hbWUgb2Ygc3BlY2lmaWMgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlfjIgaGVhZGVyIGZpbGVzLiAgVGhleSBjYW4gYmUgdXNlZCBkaXJlY3RseSBpbiAjaW5jbHVkZSAgICAqLwotICAvKiAgICBzdGF0ZW1lbnRzIGFzIGluOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgRlRfR0xZUEhfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2h5IHdlIGFyZSBub3cgdXNpbmcgbWFjcm9zIHRvIG5hbWUgICAgICAqLwotICAvKiAgICBwdWJsaWMgaGVhZGVyIGZpbGVzLiAgVGhlIGZpcnN0IG9uZSBpcyB0aGF0IHN1Y2ggbWFjcm9zIGFyZSBub3QgICAgKi8KLSAgLyogICAgbGltaXRlZCB0byB0aGUgaW5mYW1vdXMgOC4zfm5hbWluZyBydWxlIHJlcXVpcmVkIGJ5IERPUyAoYW5kICAgICAgICovCi0gIC8qICAgIGBGVF9NVUxUSVBMRV9NQVNURVJTX0gnIGlzIGEgbG90IG1vcmUgbWVhbmluZ2Z1bCB0aGFuIGBmdG1tLmgnKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNlY29uZCByZWFzb24gaXMgdGhhdCBpdCBhbGxvd3MgZm9yIG1vcmUgZmxleGliaWxpdHkgaW4gdGhlICAgICovCi0gIC8qICAgIHdheSBGcmVlVHlwZX4yIGlzIGluc3RhbGxlZCBvbiBhIGdpdmVuIHN5c3RlbS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBjb25maWd1cmF0aW9uIGZpbGVzICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NPTkZJR19DT05GSUdfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgRnJlZVR5cGV+MiBjb25maWd1cmF0aW9uIGRhdGEuCi0gICAqCi0gICAqLwotI2lmbmRlZiBGVF9DT05GSUdfQ09ORklHX0gKLSNkZWZpbmUgRlRfQ09ORklHX0NPTkZJR19IICA8ZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg+Ci0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKLSAgICogICBGcmVlVHlwZX4yIGludGVyZmFjZSB0byB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucy4KLSAgICoKLSAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLSNkZWZpbmUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSCAgPGZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oPgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ09ORklHX09QVElPTlNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgRnJlZVR5cGV+MiBwcm9qZWN0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KLSAgICoKLSAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05TX0gKLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTlNfSCAgPGZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oPgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ09ORklHX01PRFVMRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGxpc3Qgb2YgRnJlZVR5cGV+MiBtb2R1bGVzIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIHRvIG5ldyBsaWJyYXJ5Ci0gICAqICAgaW5zdGFuY2VzIGluIEBGVF9Jbml0X0ZyZWVUeXBlLgotICAgKgotICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX01PRFVMRVNfSAotI2RlZmluZSBGVF9DT05GSUdfTU9EVUxFU19IICA8ZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmg+Ci0jZW5kaWYKLQotICAvKiAqLwotCi0gIC8qIHB1YmxpYyBoZWFkZXJzICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0ZSRUVUWVBFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBiYXNlIEZyZWVUeXBlfjIgQVBJLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfRlJFRVRZUEVfSCAgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRVJST1JTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBsaXN0IG9mIEZyZWVUeXBlfjIgZXJyb3IgY29kZXMgKGFuZCBtZXNzYWdlcykuCi0gICAqCi0gICAqICAgSXQgaXMgaW5jbHVkZWQgYnkgQEZUX0ZSRUVUWVBFX0guCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9FUlJPUlNfSCAgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTU9EVUxFX0VSUk9SU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgbGlzdCBvZiBGcmVlVHlwZX4yIG1vZHVsZSBlcnJvciBvZmZzZXRzIChhbmQgbWVzc2FnZXMpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX0VSUk9SU19IICA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TWVNURU1fSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgaW50ZXJmYWNlIHRvIGxvdy1sZXZlbCBvcGVyYXRpb25zIChpLmUuLCBtZW1vcnkgbWFuYWdlbWVudAotICAgKiAgIGFuZCBzdHJlYW0gaS9vKS4KLSAgICoKLSAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1NZU1RFTV9IICA8ZnJlZXR5cGUvZnRzeXN0ZW0uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JTUFHRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdHlwZQotICAgKiAgIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gZ2x5cGggaW1hZ2VzIChpLmUuLCBiaXRtYXBzLCBvdXRsaW5lcywKLSAgICogICBzY2FuLWNvbnZlcnRlciBwYXJhbWV0ZXJzKS4KLSAgICoKLSAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0lNQUdFX0ggIDxmcmVldHlwZS9mdGltYWdlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFlQRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGJhc2ljIGRhdGEgdHlwZXMgZGVmaW5lZCBieSBGcmVlVHlwZX4yLgotICAgKgotICAgKiAgIEl0IGlzIGluY2x1ZGVkIGJ5IEBGVF9GUkVFVFlQRV9ILgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFlQRVNfSCAgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MSVNUX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBsaXN0IG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqICAgKE1vc3QgYXBwbGljYXRpb25zIHdpbGwgbmV2ZXIgbmVlZCB0byBpbmNsdWRlIHRoaXMgZmlsZS4pCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9MSVNUX0ggIDxmcmVldHlwZS9mdGxpc3QuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9PVVRMSU5FX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBzY2FsYWJsZSBvdXRsaW5lIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9PVVRMSU5FX0ggIDxmcmVldHlwZS9mdG91dGxuLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfU0laRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSB3aGljaCBtYW5hZ2VzIG11bHRpcGxlIEBGVF9TaXplIG9iamVjdHMgcGVyIGZhY2UuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9TSVpFU19IICA8ZnJlZXR5cGUvZnRzaXplcy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX01PRFVMRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgbW9kdWxlIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9NT0RVTEVfSCAgPGZyZWV0eXBlL2Z0bW9kYXBpLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfUkVOREVSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICByZW5kZXJlciBtb2R1bGUgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1JFTkRFUl9IICA8ZnJlZXR5cGUvZnRyZW5kZXIuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9BVVRPSElOVEVSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZwotICAgKiAgIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRoZSBhdXRvLWhpbnRpbmcgbW9kdWxlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQVVUT0hJTlRFUl9IICA8ZnJlZXR5cGUvZnRhdXRvaC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NGRl9EUklWRVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgc3RydWN0dXJlcyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gdGhlIENGRiBkcml2ZXIgbW9kdWxlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0ZGX0RSSVZFUl9IICA8ZnJlZXR5cGUvZnRjZmZkcnYuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UUlVFVFlQRV9EUklWRVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgc3RydWN0dXJlcyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gdGhlIFRydWVUeXBlIGRyaXZlciBtb2R1bGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9UUlVFVFlQRV9EUklWRVJfSCAgPGZyZWV0eXBlL2Z0dHRkcnYuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9QQ0ZfRFJJVkVSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZwotICAgKiAgIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRoZSBQQ0YgZHJpdmVyIG1vZHVsZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1BDRl9EUklWRVJfSCAgPGZyZWV0eXBlL2Z0cGNmZHJ2Lmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFlQRTFfVEFCTEVTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICB0eXBlcyBhbmQgQVBJIHNwZWNpZmljIHRvIHRoZSBUeXBlfjEgZm9ybWF0LgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFlQRTFfVEFCTEVTX0ggIDxmcmVldHlwZS90MXRhYmxlcy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1RSVUVUWVBFX0lEU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZW51bWVyYXRpb24gdmFsdWVzIHdoaWNoIGlkZW50aWZ5IG5hbWUgc3RyaW5ncywgbGFuZ3VhZ2VzLCBlbmNvZGluZ3MsCi0gICAqICAgZXRjLiAgVGhpcyBmaWxlIHJlYWxseSBjb250YWlucyBhIF9sYXJnZV8gc2V0IG9mIGNvbnN0YW50IG1hY3JvCi0gICAqICAgZGVmaW5pdGlvbnMsIHRha2VuIGZyb20gdGhlIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBzcGVjaWZpY2F0aW9ucy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1RSVUVUWVBFX0lEU19IICA8ZnJlZXR5cGUvdHRuYW1laWQuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UUlVFVFlQRV9UQUJMRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIHR5cGVzIGFuZCBBUEkgc3BlY2lmaWMgdG8gdGhlIFRydWVUeXBlIChhcyB3ZWxsIGFzIE9wZW5UeXBlKSBmb3JtYXQuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9UUlVFVFlQRV9UQUJMRVNfSCAgPGZyZWV0eXBlL3R0dGFibGVzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFJVRVRZUEVfVEFHU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgVHJ1ZVR5cGUgZm91ci1ieXRlIGB0YWdzJyB3aGljaCBpZGVudGlmeSBibG9ja3MgaW4KLSAgICogICBTRk5ULWJhc2VkIGZvbnQgZm9ybWF0cyAoaS5lLiwgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlKS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1RSVUVUWVBFX1RBR1NfSCAgPGZyZWV0eXBlL3R0dGFncy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0JERl9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIGFjY2Vzc2VzIEJERi1zcGVjaWZpYyBzdHJpbmdzIGZyb20gYQotICAgKiAgIGZhY2UuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9CREZfSCAgPGZyZWV0eXBlL2Z0YmRmLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ0lEX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggYWNjZXNzIENJRCBmb250IGluZm9ybWF0aW9uIGZyb20gYQotICAgKiAgIGZhY2UuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DSURfSCAgPGZyZWV0eXBlL2Z0Y2lkLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfR1pJUF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIHN1cHBvcnRzIGd6aXAtY29tcHJlc3NlZCBmaWxlcy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0daSVBfSCAgPGZyZWV0eXBlL2Z0Z3ppcC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0xaV19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIHN1cHBvcnRzIExaVy1jb21wcmVzc2VkIGZpbGVzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTFpXX0ggIDxmcmVldHlwZS9mdGx6dy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0JaSVAyX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggc3VwcG9ydHMgYnppcDItY29tcHJlc3NlZCBmaWxlcy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0JaSVAyX0ggIDxmcmVldHlwZS9mdGJ6aXAyLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfV0lORk9OVFNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBXaW5kb3dzIEZOVCBmaWxlcy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1dJTkZPTlRTX0ggICA8ZnJlZXR5cGUvZnR3aW5mbnQuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9HTFlQSF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgQVBJIG9mIHRoZSBvcHRpb25hbCBnbHlwaCBtYW5hZ2VtZW50IGNvbXBvbmVudC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0dMWVBIX0ggIDxmcmVldHlwZS9mdGdseXBoLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQklUTUFQX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBBUEkgb2YgdGhlIG9wdGlvbmFsIGJpdG1hcCBjb252ZXJzaW9uIGNvbXBvbmVudC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0JJVE1BUF9IICA8ZnJlZXR5cGUvZnRiaXRtYXAuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9CQk9YX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBBUEkgb2YgdGhlIG9wdGlvbmFsIGV4YWN0IGJvdW5kaW5nIGJveCBjb21wdXRhdGlvbiByb3V0aW5lcy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0JCT1hfSCAgPGZyZWV0eXBlL2Z0YmJveC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NBQ0hFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBBUEkgb2YgdGhlIG9wdGlvbmFsIEZyZWVUeXBlfjIgY2FjaGUgc3ViLXN5c3RlbS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0NBQ0hFX0ggIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ0FDSEVfSU1BR0VfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGBnbHlwaCBpbWFnZScgQVBJIG9mIHRoZSBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0uCi0gICAqCi0gICAqICAgSXQgaXMgdXNlZCB0byBkZWZpbmUgYSBjYWNoZSBmb3IgQEZUX0dseXBoIGVsZW1lbnRzLiAgWW91IGNhbiBhbHNvCi0gICAqICAgdXNlIHRoZSBBUEkgZGVmaW5lZCBpbiBARlRfQ0FDSEVfU01BTExfQklUTUFQU19IIGlmIHlvdSBvbmx5IG5lZWQgdG8KLSAgICogICBzdG9yZSBzbWFsbCBnbHlwaCBiaXRtYXBzLCBhcyBpdCB3aWxsIHVzZSBsZXNzIG1lbW9yeS4KLSAgICoKLSAgICogICBUaGlzIG1hY3JvIGlzIGRlcHJlY2F0ZWQuICBTaW1wbHkgaW5jbHVkZSBARlRfQ0FDSEVfSCB0byBoYXZlIGFsbAotICAgKiAgIGdseXBoIGltYWdlLXJlbGF0ZWQgY2FjaGUgZGVjbGFyYXRpb25zLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0FDSEVfSU1BR0VfSCAgRlRfQ0FDSEVfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NBQ0hFX1NNQUxMX0JJVE1BUFNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGBzbWFsbCBiaXRtYXBzJyBBUEkgb2YgdGhlIEZyZWVUeXBlfjIgY2FjaGUgc3ViLXN5c3RlbS4KLSAgICoKLSAgICogICBJdCBpcyB1c2VkIHRvIGRlZmluZSBhIGNhY2hlIGZvciBzbWFsbCBnbHlwaCBiaXRtYXBzIGluIGEgcmVsYXRpdmVseQotICAgKiAgIG1lbW9yeS1lZmZpY2llbnQgd2F5LiAgWW91IGNhbiBhbHNvIHVzZSB0aGUgQVBJIGRlZmluZWQgaW4KLSAgICogICBARlRfQ0FDSEVfSU1BR0VfSCBpZiB5b3Ugd2FudCB0byBjYWNoZSBhcmJpdHJhcnkgZ2x5cGggaW1hZ2VzLAotICAgKiAgIGluY2x1ZGluZyBzY2FsYWJsZSBvdXRsaW5lcy4KLSAgICoKLSAgICogICBUaGlzIG1hY3JvIGlzIGRlcHJlY2F0ZWQuICBTaW1wbHkgaW5jbHVkZSBARlRfQ0FDSEVfSCB0byBoYXZlIGFsbAotICAgKiAgIHNtYWxsIGJpdG1hcHMtcmVsYXRlZCBjYWNoZSBkZWNsYXJhdGlvbnMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DQUNIRV9TTUFMTF9CSVRNQVBTX0ggIEZUX0NBQ0hFX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DQUNIRV9DSEFSTUFQX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBgY2hhcm1hcCcgQVBJIG9mIHRoZSBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0uCi0gICAqCi0gICAqICAgVGhpcyBtYWNybyBpcyBkZXByZWNhdGVkLiAgU2ltcGx5IGluY2x1ZGUgQEZUX0NBQ0hFX0ggdG8gaGF2ZSBhbGwKLSAgICogICBjaGFybWFwLWJhc2VkIGNhY2hlIGRlY2xhcmF0aW9ucy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0NBQ0hFX0NIQVJNQVBfSCAgRlRfQ0FDSEVfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX01BQ19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgTWFjaW50b3NoLXNwZWNpZmljIEZyZWVUeXBlfjIgQVBJLiAgVGhlIGxhdHRlciBpcyB1c2VkIHRvIGFjY2VzcwotICAgKiAgIGZvbnRzIGVtYmVkZGVkIGluIHJlc291cmNlIGZvcmtzLgotICAgKgotICAgKiAgIFRoaXMgaGVhZGVyIGZpbGUgbXVzdCBiZSBleHBsaWNpdGx5IGluY2x1ZGVkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMKLSAgICogICBjb21waWxlZCBvbiB0aGUgTWFjIChub3RlIHRoYXQgdGhlIGJhc2UgQVBJIHN0aWxsIHdvcmtzIHRob3VnaCkuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9NQUNfSCAgPGZyZWV0eXBlL2Z0bWFjLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgb3B0aW9uYWwgbXVsdGlwbGUtbWFzdGVycyBtYW5hZ2VtZW50IEFQSSBvZiBGcmVlVHlwZX4yLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTVVMVElQTEVfTUFTVEVSU19IICA8ZnJlZXR5cGUvZnRtbS5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1NGTlRfTkFNRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIG9wdGlvbmFsIEZyZWVUeXBlfjIgQVBJIHdoaWNoIGFjY2Vzc2VzIGVtYmVkZGVkIGBuYW1lJyBzdHJpbmdzIGluCi0gICAqICAgU0ZOVC1iYXNlZCBmb250IGZvcm1hdHMgKGkuZS4sIFRydWVUeXBlIGFuZCBPcGVuVHlwZSkuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9TRk5UX05BTUVTX0ggIDxmcmVldHlwZS9mdHNuYW1lcy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX09QRU5UWVBFX1ZBTElEQVRFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBvcHRpb25hbCBGcmVlVHlwZX4yIEFQSSB3aGljaCB2YWxpZGF0ZXMgT3BlblR5cGUgdGFibGVzIChCQVNFLCBHREVGLAotICAgKiAgIEdQT1MsIEdTVUIsIEpTVEYpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfT1BFTlRZUEVfVkFMSURBVEVfSCAgPGZyZWV0eXBlL2Z0b3R2YWwuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9HWF9WQUxJREFURV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgb3B0aW9uYWwgRnJlZVR5cGV+MiBBUEkgd2hpY2ggdmFsaWRhdGVzIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoZmVhdCwKLSAgICogICBtb3J0LCBtb3J4LCBic2xuLCBqdXN0LCBrZXJuLCBvcGJkLCB0cmFrLCBwcm9wKS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0dYX1ZBTElEQVRFX0ggIDxmcmVldHlwZS9mdGd4dmFsLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfUEZSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBhY2Nlc3NlcyBQRlItc3BlY2lmaWMgZGF0YS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1BGUl9IICA8ZnJlZXR5cGUvZnRwZnIuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TVFJPS0VSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwcm92aWRlcyBmdW5jdGlvbnMgdG8gc3Ryb2tlIG91dGxpbmUgcGF0aHMuCi0gICAqLwotI2RlZmluZSBGVF9TVFJPS0VSX0ggIDxmcmVldHlwZS9mdHN0cm9rZS5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1NZTlRIRVNJU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcGVyZm9ybXMgYXJ0aWZpY2lhbCBvYmxpcXVpbmcgYW5kIGVtYm9sZGVuaW5nLgotICAgKi8KLSNkZWZpbmUgRlRfU1lOVEhFU0lTX0ggIDxmcmVldHlwZS9mdHN5bnRoLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRk9OVF9GT1JNQVRTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwcm92aWRlcyBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gZm9udCBmb3JtYXRzLgotICAgKi8KLSNkZWZpbmUgRlRfRk9OVF9GT1JNQVRTX0ggIDxmcmVldHlwZS9mdGZudGZtdC5oPgotCi0gIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgRlRfWEZSRUU4Nl9IICBGVF9GT05UX0ZPUk1BVFNfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1RSSUdPTk9NRVRSWV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcGVyZm9ybXMgdHJpZ29ub21ldHJpYyBjb21wdXRhdGlvbnMgKGUuZy4sCi0gICAqICAgY29zaW5lcyBhbmQgYXJjIHRhbmdlbnRzKS4KLSAgICovCi0jZGVmaW5lIEZUX1RSSUdPTk9NRVRSWV9IICA8ZnJlZXR5cGUvZnR0cmlnb24uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MQ0RfRklMVEVSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyBjb2xvciBmaWx0ZXJpbmcgZm9yIHN1YnBpeGVsIHJlbmRlcmluZy4KLSAgICovCi0jZGVmaW5lIEZUX0xDRF9GSUxURVJfSCAgPGZyZWV0eXBlL2Z0bGNkZmlsLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVU5QQVRFTlRFRF9ISU5USU5HX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIERlcHJlY2F0ZWQuCi0gICAqLwotI2RlZmluZSBGVF9VTlBBVEVOVEVEX0hJTlRJTkdfSCAgPGZyZWV0eXBlL3R0dW5wYXQuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JTkNSRU1FTlRBTF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcGVyZm9ybXMgaW5jcmVtZW50YWwgZ2x5cGggbG9hZGluZy4KLSAgICovCi0jZGVmaW5lIEZUX0lOQ1JFTUVOVEFMX0ggIDxmcmVldHlwZS9mdGluY3JlbS5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0dBU1BfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHJldHVybnMgZW50cmllcyBmcm9tIHRoZSBUcnVlVHlwZSBHQVNQIHRhYmxlLgotICAgKi8KLSNkZWZpbmUgRlRfR0FTUF9IICA8ZnJlZXR5cGUvZnRnYXNwLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQURWQU5DRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHJldHVybnMgaW5kaXZpZHVhbCBhbmQgcmFuZ2VkIGdseXBoIGFkdmFuY2VzLgotICAgKi8KLSNkZWZpbmUgRlRfQURWQU5DRVNfSCAgPGZyZWV0eXBlL2Z0YWR2YW5jLmg+Ci0KLQotICAvKiAqLwotCi0jZGVmaW5lIEZUX0VSUk9SX0RFRklOSVRJT05TX0ggIDxmcmVldHlwZS9mdGVycmRlZi5oPgotCi0KLSAgLyogVGhlIGludGVybmFscyBvZiB0aGUgY2FjaGUgc3ViLXN5c3RlbSBhcmUgbm8gbG9uZ2VyIGV4cG9zZWQuICBXZSAqLwotICAvKiBkZWZhdWx0IHRvIEZUX0NBQ0hFX0ggYXQgdGhlIG1vbWVudCBqdXN0IGluIGNhc2UsIGJ1dCB3ZSBrbm93IG9mICovCi0gIC8qIG5vIHJvZ3VlIGNsaWVudCB0aGF0IHVzZXMgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DQUNIRV9NQU5BR0VSX0ggICAgICAgICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0jZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX01SVV9IICAgICAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLSNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfTUFOQUdFUl9IICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgotI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9DQUNIRV9IICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0jZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX0dMWVBIX0ggICAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLSNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfSU1BR0VfSCAgICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgotI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9TQklUU19IICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0KLQotI2RlZmluZSBGVF9JTkNSRU1FTlRBTF9IICAgICAgICAgIDxmcmVldHlwZS9mdGluY3JlbS5oPgotCi0jZGVmaW5lIEZUX1RSVUVUWVBFX1VOUEFURU5URURfSCAgPGZyZWV0eXBlL3R0dW5wYXQuaD4KLQotCi0gIC8qCi0gICAqIEluY2x1ZGUgaW50ZXJuYWwgaGVhZGVycyBkZWZpbml0aW9ucyBmcm9tIDxpbnRlcm5hbC8uLi4+Ci0gICAqIG9ubHkgd2hlbiBidWlsZGluZyB0aGUgbGlicmFyeS4KLSAgICovCi0jaWZkZWYgRlQyX0JVSUxEX0xJQlJBUlkKLSNkZWZpbmUgIEZUX0lOVEVSTkFMX0lOVEVSTkFMX0ggIDxmcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfSU5URVJOQUxfSAotI2VuZGlmIC8qIEZUMl9CVUlMRF9MSUJSQVJZICovCi0KLQotI2VuZGlmIC8qIEZUSEVBREVSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkMjcxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgcmVnaXN0ZXJzIHRoZSBGcmVlVHlwZSBtb2R1bGVzIGNvbXBpbGVkIGludG8gdGhlIGxpYnJhcnkuCi0gKgotICogIElmIHlvdSB1c2UgR05VIG1ha2UsIHRoaXMgZmlsZSBJUyBOT1QgVVNFRCEgIEluc3RlYWQsIGl0IGlzIGNyZWF0ZWQgaW4KLSAqICB0aGUgb2JqZWN0cyBkaXJlY3RvcnkgKG5vcm1hbGx5IGA8dG9wZGlyPi9vYmpzLycpIGJhc2VkIG9uIGluZm9ybWF0aW9uCi0gKiAgZnJvbSBgPHRvcGRpcj4vbW9kdWxlcy5jZmcnLgotICoKLSAqICBQbGVhc2UgcmVhZCBgZG9jcy9JTlNUQUxMLkFOWScgYW5kIGBkb2NzL0NVU1RPTUlaRScgaG93IHRvIGNvbXBpbGUKLSAqICBGcmVlVHlwZSB3aXRob3V0IEdOVSBtYWtlLgotICoKLSAqLwotCi1GVF9VU0VfTU9EVUxFKCBGVF9Nb2R1bGVfQ2xhc3MsIGF1dG9maXRfbW9kdWxlX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgdHRfZHJpdmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgdDFfZHJpdmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgY2ZmX2RyaXZlcl9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHQxY2lkX2RyaXZlcl9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHBmcl9kcml2ZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0NDJfZHJpdmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgd2luZm50X2RyaXZlcl9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHBjZl9kcml2ZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBwc2F1eF9tb2R1bGVfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBwc25hbWVzX21vZHVsZV9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9Nb2R1bGVfQ2xhc3MsIHBzaGludGVyX21vZHVsZV9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9Nb2R1bGVfQ2xhc3MsIHNmbnRfbW9kdWxlX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgYmRmX2RyaXZlcl9jbGFzcyApCi0KLS8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZjZlOGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDk5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG9wdGlvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVXNlci1zZWxlY3RhYmxlIGNvbmZpZ3VyYXRpb24gbWFjcm9zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRPUFRJT05fSF8KLSNkZWZpbmUgRlRPUFRJT05fSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBVU0VSLVNFTEVDVEFCTEUgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbWFjcm8gZGVmaW5pdGlvbnMgZm9yICAgICovCi0gIC8qIGEgc3RhbmRhcmQgYnVpbGQgb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byAgICAqLwotICAvKiB1c2UgdGhpcyBmaWxlIHRvIGJ1aWxkIHByb2plY3Qtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnk6ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFlvdSBjYW4gbW9kaWZ5IHRoaXMgZmlsZSBieSBoYW5kLCBidXQgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQgaW4gICAqLwotICAvKiAgICBjYXNlcyB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSBmcm9tIGEgc2luZ2xlIHNvdXJjZSBkaXJlY3RvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBZb3UgY2FuIHB1dCBhIGNvcHkgb2YgdGhpcyBmaWxlIGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LCBtb3JlICAgICAgKi8KLSAgLyogICAgcHJlY2lzZWx5IGluIGAkQlVJTEQvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgnLCB3aGVyZSBgJEJVSUxEJyAgICovCi0gIC8qICAgIGlzIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IHRoYXQgaXMgaW5jbHVkZWQgX2JlZm9yZV8gdGhlIEZyZWVUeXBlICAqLwotICAvKiAgICBpbmNsdWRlIHBhdGggZHVyaW5nIGNvbXBpbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZhdWx0IEZyZWVUeXBlIE1ha2VmaWxlcyBhbmQgSmFtZmlsZXMgdXNlIHRoZSBidWlsZCAgICAgICAgICAqLwotICAvKiAgICBkaXJlY3RvcnkgYGJ1aWxkcy88c3lzdGVtPicgYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4gZWFzaWx5IGNoYW5nZSAgKi8KLSAgLyogICAgdGhhdCBmb3IgeW91ciBvd24gcHJvamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBDb3B5IHRoZSBmaWxlIDxmdDJidWlsZC5oPiB0byBgJEJVSUxEL2Z0MmJ1aWxkLmgnIGFuZCBtb2RpZnkgaXQgICAgKi8KLSAgLyogICAgc2xpZ2h0bHkgdG8gcHJlLWRlZmluZSB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTlNfSCB1c2VkIHRvICAgICAgICovCi0gIC8qICAgIGxvY2F0ZSB0aGlzIGZpbGUgZHVyaW5nIHRoZSBidWlsZC4gIEZvciBleGFtcGxlLCAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggIDxteWZ0b3B0aW9ucy5oPiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lsbCB1c2UgYCRCVUlMRC9teWZ0b3B0aW9ucy5oJyBpbnN0ZWFkIG9mIHRoaXMgZmlsZSBmb3IgbWFjcm8gICAgICovCi0gIC8qICAgIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzaW1pbGFybHkgcHJlLWRlZmluZSB0aGUgbWFjcm8gICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NPTkZJR19NT0RVTEVTX0ggdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgbGlzdGluZyBvZiB0aGUgbW9kdWxlcyAqLwotICAvKiAgICB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCB0byB0aGUgbGlicmFyeSBhdCBjb21waWxlIHRpbWUuICBCeSAgICAgKi8KLSAgLyogICAgZGVmYXVsdCwgdGhpcyBmaWxlIGlzIDxmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaD4uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBoaWdobHkgcmVjb21tZW5kIHVzaW5nIHRoZSB0aGlyZCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogRyBFIE4gRSBSIEEgTCAgIEYgUiBFIEUgVCBZIFAgRSAgIDIgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHlvdSBlbmFibGUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiwgRnJlZVR5cGUgcmVjb2duaXplcyBhbiAgICAgICAqLwotICAvKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYWxsZWQgYEZSRUVUWVBFX1BST1BFUlRJRVMnLCB3aGljaCBjYW4gYmUgdXNlZCAgKi8KLSAgLyogdG8gY29udHJvbCB0aGUgdmFyaW91cyBmb250IGRyaXZlcnMgYW5kIG1vZHVsZXMuICBUaGUgY29udHJvbGxhYmxlICAgICovCi0gIC8qIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBpbiB0aGUgc2VjdGlvbiBgQ29udHJvbGxpbmcgRnJlZVR5cGUgTW9kdWxlcycgICAqLwotICAvKiBpbiB0aGUgcmVmZXJlbmNlJ3MgdGFibGUgb2YgY29udGVudHM7IGN1cnJlbnRseSB0aGVyZSBhcmUgcHJvcGVydGllcyAgKi8KLSAgLyogZm9yIHRoZSBhdXRvLWhpbnRlciAoZmlsZSBgZnRhdXRvaC5oJyksIENGRiAoZmlsZSBgZnRjZmZkcnYuaCcpLCAgICAgICovCi0gIC8qIFRydWVUeXBlIChmaWxlIGBmdHR0ZHJ2LmgnKSwgYW5kIFBDRiAoZmlsZSBgZnRwY2ZkcnYuaCcpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYEZSRUVUWVBFX1BST1BFUlRJRVMnIGhhcyB0aGUgZm9sbG93aW5nIHN5bnRheCBmb3JtIChicm9rZW4gaGVyZSBpbnRvICovCi0gIC8qIG11bHRpcGxlIGxpbmVzIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICA8b3B0aW9uYWwgd2hpdGVzcGFjZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgPG1vZHVsZS1uYW1lMT4gJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDxwcm9wZXJ0eS1uYW1lMT4gJz0nIDxwcm9wZXJ0eS12YWx1ZTE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICA8d2hpdGVzcGFjZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgPG1vZHVsZS1uYW1lMj4gJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDxwcm9wZXJ0eS1uYW1lMj4gJz0nIDxwcm9wZXJ0eS12YWx1ZTI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlJFRVRZUEVfUFJPUEVSVElFUz10cnVldHlwZTppbnRlcnByZXRlci12ZXJzaW9uPTM1IFwgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgY2ZmOm5vLXN0ZW0tZGFya2VuaW5nPTEgXCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGF1dG9maXR0ZXI6d2FycGluZz0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3YW50IHRvIGFjdGl2YXRlIHN1Yi1waXhlbCByZW5kZXJpbmcgICovCi0gIC8qIChhLmsuYS4gTENEIHJlbmRlcmluZywgb3IgQ2xlYXJUeXBlKSBpbiB0aGlzIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBjb3ZlcmVkIGJ5IHNldmVyYWwgTWljcm9zb2Z0IHBhdGVudHMgICAgICAgICovCi0gIC8qIGFuZCBzaG91bGQgbm90IGJlIGFjdGl2YXRlZCBpbiBhbnkgZGVmYXVsdCBidWlsZCBvZiB0aGUgbGlicmFyeS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtYWNybyBoYXMgbm8gaW1wYWN0IG9uIHRoZSBGcmVlVHlwZSBBUEksIG9ubHkgb24gaXRzICAgICAgICAgICAgICovCi0gIC8qIF9pbXBsZW1lbnRhdGlvbl8uICBGb3IgZXhhbXBsZSwgdXNpbmcgRlRfUkVOREVSX01PREVfTENEIHdoZW4gY2FsbGluZyAqLwotICAvKiBGVF9SZW5kZXJfR2x5cGggc3RpbGwgZ2VuZXJhdGVzIGEgYml0bWFwIHRoYXQgaXMgMyB0aW1lcyB3aWRlciB0aGFuICAgKi8KLSAgLyogdGhlIG9yaWdpbmFsIHNpemUgaW4gY2FzZSB0aGlzIG1hY3JvIGlzbid0IGRlZmluZWQ7IGhvd2V2ZXIsIGVhY2ggICAgICovCi0gIC8qIHRyaXBsZXQgb2Ygc3VicGl4ZWxzIGhhcyBSPUc9Qi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyBkb25lIHRvIGFsbG93IEZyZWVUeXBlIGNsaWVudHMgdG8gcnVuIHVubW9kaWZpZWQsIGZvcmNpbmcgICAgICovCi0gIC8qIHRoZW0gdG8gZGlzcGxheSBub3JtYWwgZ3JheS1sZXZlbCBhbnRpLWFsaWFzZWQgZ2x5cGhzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWFueSBjb21waWxlcnMgcHJvdmlkZSBhIG5vbi1BTlNJIDY0LWJpdCBkYXRhIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCAgICovCi0gIC8qIGJ5IEZyZWVUeXBlIHRvIHNwZWVkIHVwIHNvbWUgY29tcHV0YXRpb25zLiAgSG93ZXZlciwgdGhpcyB3aWxsIGNyZWF0ZSAqLwotICAvKiBzb21lIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGluIHN0cmljdCBBTlNJIG1vZGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciB0aGlzIHJlYXNvbiwgdGhlIHVzZSBvZiA2NC1iaXQgaW50ZWdlcnMgaXMgbm9ybWFsbHkgZGlzYWJsZWQgd2hlbiAqLwotICAvKiB0aGUgX19TVERDX18gbWFjcm8gaXMgZGVmaW5lZC4gIFlvdSBjYW4gaG93ZXZlciBkaXNhYmxlIHRoaXMgYnkgICAgICAgKi8KLSAgLyogZGVmaW5pbmcgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgaGVyZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3IgbW9zdCBjb21waWxlcnMsIHRoaXMgd2lsbCBvbmx5IGNyZWF0ZSBjb21waWxhdGlvbiB3YXJuaW5ncyB3aGVuICAgKi8KLSAgLyogYnVpbGRpbmcgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPYk5vdGU6IFRoZSBjb21waWxlci1zcGVjaWZpYyA2NC1iaXQgaW50ZWdlcnMgYXJlIGRldGVjdGVkIGluIHRoZSAgICAgKi8KLSAgLyogICAgICAgICBmaWxlIGBmdGNvbmZpZy5oJyBlaXRoZXIgc3RhdGljYWxseSBvciB0aHJvdWdoIHRoZSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgYGNvbmZpZ3VyZScgc2NyaXB0IG9uIHN1cHBvcnRlZCBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgZG8gbm90IHRyeSB0byB1c2UgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgICAqLwotICAvKiBwZXJmb3JtYW5jZS1jcml0aWNhbCBmdW5jdGlvbnMgKGUuZy4gRlRfTXVsRml4KS4gIFlvdSBzaG91bGQgb25seSBkbyAgKi8KLSAgLyogdGhhdCB0byB2ZXJpZnkgdGhhdCB0aGUgYXNzZW1ibGVyIGZ1bmN0aW9uIHdvcmtzIHByb3Blcmx5LCBvciB0byAgICAgICovCi0gIC8qIGV4ZWN1dGUgYmVuY2htYXJrIHRlc3RzIG9mIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucy4gICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIHRyeSB0byB1c2UgYW4gaW5saW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiAgKi8KLSAgLyogdGhlIGBGVF9NdWxGaXgnIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGBob3RzcG90JyB3aGVuIGxvYWRpbmcgYW5kICAgICAgICovCi0gIC8qIGhpbnRpbmcgZ2x5cGhzLCBhbmQgd2hpY2ggc2hvdWxkIGJlIGV4ZWN1dGVkIGFzIGZhc3QgYXMgcG9zc2libGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IGlmIHlvdXIgY29tcGlsZXIgb3IgQ1BVIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgd2lsbCBkZWZhdWx0ICovCi0gIC8qIHRvIHRoZSBzdGFuZGFyZCBhbmQgcG9ydGFibGUgaW1wbGVtZW50YXRpb24gZm91bmQgaW4gYGZ0Y2FsYy5jJy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9JTkxJTkVfTVVMRklYCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIExaVy1jb21wcmVzc2VkIGZpbGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCi0gIC8qICAgYGNvbXByZXNzJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgICAqLwotICAvKiAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgWDExIGRpc3RyaWJ1dGlvbnMuICBUaGUgaW1wbGVtZW50YXRpb24gKi8KLSAgLyogICB1c2VzIE5ldEJTRCdzIGB6b3BlbicgdG8gcGFydGlhbGx5IHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAgICovCi0gIC8qICAgKHNlZSBzcmMvbHp3L2Z0Z3ppcC5jKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9MWlcKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR3ppcC1jb21wcmVzc2VkIGZpbGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KLSAgLyogICBgZ3ppcCcgcHJvZ3JhbS4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gcGFyc2UgbWFueSBvZiB0aGUgUENGIGZpbGVzICovCi0gIC8qICAgdGhhdCBjb21lIHdpdGggWEZyZWU4Ni4gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGB6bGliJyB0byAgICAgICAgICAqLwotICAvKiAgIHBhcnRpYWxseSB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgKHNlZSBzcmMvZ3ppcC9mdGd6aXAuYykuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgU2VlIGFsc28gICAqLwotICAvKiAgIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWkxpYiBsaWJyYXJ5IHNlbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gaXMgb25seSB1c2VkIHdoZW4gRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQiBpcyBkZWZpbmVkLiAgKi8KLSAgLyogICBJdCBhbGxvd3MgRnJlZVR5cGUncyBgZnRnemlwJyBjb21wb25lbnQgdG8gbGluayB0byB0aGUgc3lzdGVtJ3MgICAgICovCi0gIC8qICAgaW5zdGFsbGF0aW9uIG9mIHRoZSBaTGliIGxpYnJhcnkuICBUaGlzIGlzIHVzZWZ1bCBvbiBzeXN0ZW1zIGxpa2UgICAqLwotICAvKiAgIFVuaXggb3IgVk1TIHdoZXJlIGl0IGdlbmVyYWxseSBpcyBhbHJlYWR5IGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgeW91IGxldCBpdCB1bmRlZmluZWQsIHRoZSBjb21wb25lbnQgd2lsbCB1c2UgaXRzIG93biBjb3B5ICAgICAgICAqLwotICAvKiAgIG9mIHRoZSB6bGliIHNvdXJjZXMgaW5zdGVhZC4gIFRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZCB0byBiZSAgICAgICAgKi8KLSAgLyogICBpbmNsdWRlZCBkaXJlY3RseSB3aXRoaW4gdGhlIGNvbXBvbmVudCBhbmQgKm5vdCogZXhwb3J0IGV4dGVybmFsICAgICovCi0gIC8qICAgZnVuY3Rpb24gbmFtZXMuICBUaGlzIGFsbG93cyB5b3UgdG8gbGluayBhbnkgcHJvZ3JhbSB3aXRoIEZyZWVUeXBlICAqLwotICAvKiAgIF9hbmRfIFpMaWIgd2l0aG91dCBsaW5raW5nIGNvbmZsaWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGlzIG1hY3JvIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgICAqLwotICAvKiAgIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnppcDItY29tcHJlc3NlZCBmaWxlIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KLSAgLyogICBgYnppcDInIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiAgICAgICovCi0gIC8qICAgZmlsZXMgdGhhdCBjb21lIHdpdGggWEZyZWU4Ni4gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGBsaWJiejInIHRvICAqLwotICAvKiAgIHBhcnRpYWxseSB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgKHNlZSBzcmMvYnppcDIvZnRiemlwMi5jKS4gKi8KLSAgLyogICBDb250cmFyeSB0byBnemlwLCBiemlwMiBjdXJyZW50bHkgaXMgbm90IGluY2x1ZGVkIGFuZCBuZWVkIHRvIHVzZSAgICovCi0gIC8qICAgdGhlIHN5c3RlbSBhdmFpbGFibGUgYnppcDIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIGZpbGUgc3RyZWFtIGZ1bmN0aW9ucyBhbmQgdHlwZXMsIEZJTEUsICAgKi8KLSAgLyogZm9wZW4oKSBldGMuICBFbmFibGVzIHRoZSB1c2Ugb2Ygc21hbGxlciBzeXN0ZW0gbGlicmFyaWVzIG9uIGVtYmVkZGVkICovCi0gIC8qIHN5c3RlbXMgdGhhdCBoYXZlIG11bHRpcGxlIHN5c3RlbSBsaWJyYXJpZXMsIHNvbWUgd2l0aCBvciB3aXRob3V0ICAgICAqLwotICAvKiBmaWxlIHN0cmVhbSBzdXBwb3J0LCBpbiB0aGUgY2FzZXMgd2hlcmUgZmlsZSBzdHJlYW0gc3VwcG9ydCBpcyBub3QgICAgKi8KLSAgLyogbmVjZXNzYXJ5IHN1Y2ggYXMgbWVtb3J5IGxvYWRpbmcgb2YgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0RJU0FCTEVfU1RSRUFNX1NVUFBPUlQgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUE5HIGJpdG1hcCBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGxvYWRpbmcgY29sb3IgYml0bWFwIGdseXBocyBpbiB0aGUgUE5HIGZvcm1hdC4gKi8KLSAgLyogICBUaGlzIHJlcXVpcmVzIGhlbHAgZnJvbSB0aGUgZXh0ZXJuYWwgbGlicG5nIGxpYnJhcnkuICBVbmNvbXByZXNzZWQgICovCi0gIC8qICAgY29sb3IgYml0bWFwcyBkbyBub3QgbmVlZCBhbnkgZXh0ZXJuYWwgbGlicmFyaWVzIGFuZCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgIHN1cHBvcnRlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfUE5HICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhhcmZCdXp6IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSB1c2VzIHRoZSBIYXJmQnV6eiBsaWJyYXJ5IHRvIGltcHJvdmUgYXV0by1oaW50aW5nIG9mICAgICAgICovCi0gIC8qICAgT3BlblR5cGUgZm9udHMuICBJZiBhdmFpbGFibGUsIG1hbnkgZ2x5cGhzIG5vdCBkaXJlY3RseSBhZGRyZXNzYWJsZSAqLwotICAvKiAgIGJ5IGEgZm9udCdzIGNoYXJhY3RlciBtYXAgd2lsbCBiZSBoaW50ZWQgYWxzby4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlogKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRExMIGV4cG9ydCBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdoZW4gY29tcGlsaW5nIEZyZWVUeXBlIGFzIGEgRExMLCBzb21lIHN5c3RlbXMvY29tcGlsZXJzIG5lZWQgYSAgICAgKi8KLSAgLyogICBzcGVjaWFsIGtleXdvcmQgaW4gZnJvbnQgT1IgYWZ0ZXIgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uICAgICAgICovCi0gIC8qICAgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUd28gbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUgdG8gZGVmaW5lICAgICAgICovCi0gIC8qICAgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnM6IEZUX0VYUE9SVCBhbmQgRlRfRVhQT1JUX0RFRi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VYUE9SVCggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGFzIGluICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfRVhQT1JUKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVhQT1JUX0RFRiggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uLCBhcyBpbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSogIGFsaWJyYXJ5ICkgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IGNhbiBwcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIEZUX0VYUE9SVCBhbmQgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VYUE9SVF9ERUYgaGVyZSBpZiB5b3Ugd2FudC4gIElmIHlvdSBsZWF2ZSB0aGVtIHVuZGVmaW5lZCwgdGhleSAgKi8KLSAgLyogICB3aWxsIGJlIGxhdGVyIGF1dG9tYXRpY2FsbHkgZGVmaW5lZCBhcyBgZXh0ZXJuIHJldHVybl90eXBlJyB0byAgICAgICovCi0gIC8qICAgYWxsb3cgbm9ybWFsIGNvbXBpbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICovCi0gIC8qICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfRVhQT1JUKHgpICAgICAgZXh0ZXJuIHggKi8KLS8qICNkZWZpbmUgRlRfRVhQT1JUX0RFRih4KSAgeCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHbHlwaCBQb3N0c2NyaXB0IE5hbWVzIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBjb21waWxlZCB3aXRoIHRoZSBgcHNuYW1lcycgbW9kdWxlLiAgVGhpcyAqLwotICAvKiAgIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoIG5hbWUgc3RyaW5nIGludG8gYSAgICAgICAgKi8KLSAgLyogICBVbmljb2RlIHZhbHVlLCBvciByZXR1cm4gYSBNYWNpbnRvc2ggc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3IgdGhlICAgICovCi0gIC8qICAgdXNlIHdpdGggdGhlIFRydWVUeXBlIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBVbmRlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSBkbyBub3Qgd2FudCBgcHNuYW1lcycgY29tcGlsZWQgaW4geW91ciAgICovCi0gIC8qICAgYnVpbGQgb2YgRnJlZVR5cGUuICBUaGlzIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6ICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIFRoZSBUcnVlVHlwZSBkcml2ZXIgd2lsbCBwcm92aWRlIGl0cyBvd24gc2V0IG9mIGdseXBoIG5hbWVzLCAgICAgICovCi0gIC8qICAgICBpZiB5b3UgYnVpbGQgaXQgdG8gc3VwcG9ydCBwb3N0c2NyaXB0IG5hbWVzIGluIHRoZSBUcnVlVHlwZSAgICAgICAqLwotICAvKiAgICAgYHBvc3QnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlICAgICAgICAqLwotICAvKiAgICAgY2hhcm1hcCBvdXQgb2YgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IHdvdWxkIG5vcm1hbGx5IHVuZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuIGJ1aWxkaW5nICAqLwotICAvKiAgIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIFR5cGUgMSBvciBDRkYgZHJpdmVyLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3N0c2NyaXB0IE5hbWVzIHRvIFVuaWNvZGUgVmFsdWVzIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBidWlsdCB3aXRoIHRoZSBgUFNOYW1lcycgbW9kdWxlIGNvbXBpbGVkICAqLwotICAvKiAgIGluLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgbW9kdWxlIGlzIHVzZWQgdG8gY29udmVydCBhIGdseXBoIG5hbWUgKi8KLSAgLyogICBpbnRvIGEgVW5pY29kZSB2YWx1ZS4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gb3JkZXIgdG8gICAgICAgICovCi0gIC8qICAgc3ludGhlc2l6ZSBvbiB0aGUgZmx5IGEgVW5pY29kZSBjaGFybWFwIGZyb20gdGhlIENGRi9UeXBlIDEgZHJpdmVyICAqLwotICAvKiAgIHRocm91Z2ggYSBiaWcgdGFibGUgbmFtZWQgdGhlIGBBZG9iZSBHbHlwaCBMaXN0JyAoQUdMKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgdGhlIEFkb2JlIEdseXBoIExpc3QgICAgICAgICAqLwotICAvKiAgIGNvbXBpbGVkIGluIHlvdXIgYFBTTmFtZXMnIG1vZHVsZS4gIFRoZSBUeXBlIDEgZHJpdmVyIHdpbGwgbm90IGJlICAgKi8KLSAgLyogICBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlICovCi0gIC8qICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN1cHBvcnQgZm9yIE1hYyBmb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBvdXRsaW5lIGZvbnRzIGluIE1hYyAgICAgICovCi0gIC8qICAgZm9ybWF0IChtYWMgZGZvbnQsIG1hYyByZXNvdXJjZSwgbWFjYmluYXJ5IGNvbnRhaW5pbmcgYSBtYWMgICAgICAgICAqLwotICAvKiAgIHJlc291cmNlKSBvbiBub24tTWFjIHBsYXRmb3Jtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IHRoZSBgRk9ORCcgcmVzb3VyY2UgaXNuJ3QgY2hlY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR3Vlc3NpbmcgbWV0aG9kcyB0byBhY2Nlc3MgZW1iZWRkZWQgcmVzb3VyY2UgZm9ya3MgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVuYWJsZSBleHRyYSBNYWMgZm9udHMgc3VwcG9ydCBvbiBub24tTWFjIHBsYXRmb3JtcyAoZS5nLiAgICAgICAgICAgKi8KLSAgLyogICBHTlUvTGludXgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFJlc291cmNlIGZvcmtzIHdoaWNoIGluY2x1ZGUgZm9udHMgZGF0YSBhcmUgc3RvcmVkIHNvbWV0aW1lcyBpbiAgICAgKi8KLSAgLyogICBsb2NhdGlvbnMgd2hpY2ggdXNlcnMgb3IgZGV2ZWxvcGVycyBkb24ndCBleHBlY3RlZC4gIEluIHNvbWUgY2FzZXMsICovCi0gIC8qICAgcmVzb3VyY2UgZm9ya3Mgc3RhcnQgd2l0aCBzb21lIG9mZnNldCBmcm9tIHRoZSBoZWFkIG9mIGEgZmlsZS4gIEluICAqLwotICAvKiAgIG90aGVyIGNhc2VzLCB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgc3RvcmVkIGluIGZpbGUgZGlmZmVyZW50ICAgKi8KLSAgLyogICBmcm9tIHdoYXQgdGhlIHVzZXIgc3BlY2lmaWVzLiAgSWYgdGhpcyBvcHRpb24gaXMgYWN0aXZhdGVkLCAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciBzdWNoIG9mZnNldHMgb3IgZGlmZmVyZW50IGZpbGUgICAgICAqLwotICAvKiAgIG5hbWVzIG11c3QgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IG5vcm1hbCwgZGlyZWN0IGFjY2VzcyBvZiByZXNvdXJjZSBmb3JrcyBpcyBjb250cm9sbGVkIHZpYSAqLwotICAvKiAgIHRoZSBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUyBvcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbG93IHRoZSB1c2Ugb2YgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlIHRvIGxvYWQgdHlwZWZhY2VzIHRoYXQgICAgICAqLwotICAvKiBjb250YWluIG5vIGdseXBoIGRhdGEsIGJ1dCBzdXBwbHkgaXQgdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyByZXF1aXJlZCBieSBjbGllbnRzIHN1cHBvcnRpbmcgZG9jdW1lbnQgZm9ybWF0cyB3aGljaCAgICAgICAgICovCi0gIC8qIHN1cHBseSBmb250IGRhdGEgaW5jcmVtZW50YWxseSBhcyB0aGUgZG9jdW1lbnQgaXMgcGFyc2VkLCBzdWNoICAgICAgICAqLwotICAvKiBhcyB0aGUgR2hvc3RzY3JpcHQgaW50ZXJwcmV0ZXIgZm9yIHRoZSBQb3N0U2NyaXB0IGxhbmd1YWdlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfUkVOREVSX1BPT0xfU0laRSAgMTYzODRMCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX01BWF9NT0RVTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbW9kdWxlcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGluIGEgc2luZ2xlICAgICovCi0gIC8qICAgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAzMiBpcyB0aGUgZGVmYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfTUFYX01PRFVMRVMgIDMyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlYnVnIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBjYW4gYmUgY29tcGlsZWQgaW4gZGVidWcgb3IgdHJhY2UgbW9kZS4gIEluIGRlYnVnIG1vZGUsICAgICovCi0gIC8qICAgZXJyb3JzIGFyZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBgZnRkZWJ1ZycgY29tcG9uZW50LiAgSW4gdHJhY2UgICAgICAqLwotICAvKiAgIG1vZGUsIGFkZGl0aW9uYWwgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcgICAgKi8KLSAgLyogICBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUiB0byBidWlsZCB0aGUgbGlicmFyeSBpbiBkZWJ1ZyBtb2RlLiAgICAgKi8KLSAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfVFJBQ0UgdG8gYnVpbGQgaXQgaW4gdHJhY2UgbW9kZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvbid0IGRlZmluZSBhbnkgb2YgdGhlc2UgbWFjcm9zIHRvIGNvbXBpbGUgaW4gYHJlbGVhc2UnIG1vZGUhICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCi0vKiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEF1dG9maXR0ZXIgZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiBGVF9ERUJVR19BVVRPRklUIGlzIGRlZmluZWQsIEZyZWVUeXBlIHByb3ZpZGVzIHNvbWUgbWVhbnMgdG8gICAgICovCi0gIC8qICAgY29udHJvbCB0aGUgYXV0b2ZpdHRlciBiZWhhdmlvdXIgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aXRoIGdsb2JhbCAqLwotICAvKiAgIGJvb2xlYW4gdmFyaWFibGVzIChjb25zZXF1ZW50bHksIHlvdSBzaG91bGQgKm5ldmVyKiBlbmFibGUgdGhpcyAgICAgKi8KLSAgLyogICB3aGlsZSBjb21waWxpbmcgaW4gYHJlbGVhc2UnIG1vZGUpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2Rpc2FibGVfaG9yel9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgZHVtcHMgb2YgdmFyaW91cyAgICAgICovCi0gIC8qICAgaW50ZXJuYWwgYXV0b2ZpdCBzdHJ1Y3R1cmVzIHRvIHN0ZG91dCAodXNpbmcgYHByaW50ZicpOiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2dldF9udW1fc2VnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19nZXRfc2VnbWVudF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBcyBhbiBhcmd1bWVudCwgdGhleSB1c2UgYW5vdGhlciBnbG9iYWwgdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBgZnRncmlkJyBkZW1vIHByb2dyYW0gdG8gc2VlIGhvdyB0aG9zZSAgICAqLwotICAvKiAgIHZhcmlhYmxlcyBhbmQgbWFjcm9zIHNob3VsZCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0RFQlVHX0FVVE9GSVQgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWVtb3J5IERlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBjb21lcyB3aXRoIGFuIGludGVncmF0ZWQgbWVtb3J5IGRlYnVnZ2VyIHRoYXQgaXMgICAgICAgKi8KLSAgLyogICBjYXBhYmxlIG9mIGRldGVjdGluZyBzaW1wbGUgZXJyb3JzIGxpa2UgbWVtb3J5IGxlYWtzIG9yIGRvdWJsZSAgICAgICovCi0gIC8qICAgZGVsZXRlcy4gIFRvIGNvbXBpbGUgaXQgd2l0aGluIHlvdXIgYnVpbGQgb2YgdGhlIGxpYnJhcnksIHlvdSAgICAgICAqLwotICAvKiAgIHNob3VsZCBkZWZpbmUgRlRfREVCVUdfTUVNT1JZIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgZGVidWdnZXIgaXMgb25seSBhY3RpdmF0ZWQgYXQgcnVudGltZSB3aGVuICAgICAqLwotICAvKiAgIHdoZW4gdGhlIF9lbnZpcm9ubWVudF8gdmFyaWFibGUgYEZUMl9ERUJVR19NRU1PUlknIGlzIGRlZmluZWQgYWxzbyEgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGlzIG1hY3JvIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgICAqLwotICAvKiAgIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0RFQlVHX01FTU9SWSAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNb2R1bGUgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgdGhlIGhpZ2hlciBieXRlICAqLwotICAvKiAgIG9mIGFuIGVycm9yIGNvZGUgZ2l2ZXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZXJyb3IgaGFzIG9jY3VycmVkLCAgKi8KLSAgLyogICB3aGlsZSB0aGUgbG93ZXIgYnl0ZSBpcyB0aGUgcmVhbCBlcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNldHRpbmcgdGhpcyBtYWNybyBtYWtlcyBzZW5zZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHNpbmNlICAgKi8KLSAgLyogICBpdCB3b3VsZCBicmVhayBzb3VyY2UgY29tcGF0aWJpbGl0eSBvZiBjZXJ0YWluIHByb2dyYW1zIHRoYXQgdXNlICAgICovCi0gIC8qICAgRnJlZVR5cGUgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBmdG1vZGVyci5oIGFuZCBmdGVycm9ycy5oLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIElmIHRoaXMgbWFjcm8gaXMgc2V0ICh3aGljaCBpcyBfbm90XyB0aGUgZGVmYXVsdCksIEZyZWVUeXBlMiB3aWxsICAgKi8KLSAgLyogICBhdm9pZCBjcmVhdGluZyBjb25zdGFudHMgdGhhdCByZXF1aXJlIGFkZHJlc3MgZml4dXBzLiAgSW5zdGVhZCB0aGUgICovCi0gIC8qICAgY29uc3RhbnRzIHdpbGwgYmUgbW92ZWQgaW50byBhIHN0cnVjdCBhbmQgYWRkaXRpb25hbCBpbnRpYWxpemF0aW9uICAqLwotICAvKiAgIGNvZGUgd2lsbCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU2V0dGluZyB0aGlzIG1hY3JvIGlzIG5lZWRlZCBmb3Igc3lzdGVtcyB0aGF0IHByb2hpYml0IGFkZHJlc3MgICAgICAqLwotICAvKiAgIGZpeHVwcywgc3VjaCBhcyBCUkVXLiAgW05vdGUgdGhhdCBzdGFuZGFyZCBjb21waWxlcnMgbGlrZSBnY2Mgb3IgICAgKi8KLSAgLyogICBjbGFuZyBoYW5kbGUgUElDIGdlbmVyYXRpb24gYXV0b21hdGljYWxseTsgeW91IGRvbid0IGhhdmUgdG8gc2V0ICAgICovCi0gIC8qICAgRlRfQ09ORklHX09QVElPTl9QSUMsIHdoaWNoIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciB2ZXJ5IHNwZWNpYWwgICAgICAqLwotICAvKiAgIGNvbXBpbGVycy5dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsICAgICAqLwotICAvKiAgIG1vZHVsZXMgKHNlZSBgbW9kdWxlcy5jZmcnIGZvciBhIGNvbXBsZXRlIGxpc3QpLiAgRm9yIGJ1aWxkaW5nIHdpdGggKi8KLSAgLyogICBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LCBkbyB0aGUgZm9sbG93aW5nLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgMC4gQ2xvbmUgdGhlIHJlcG9zaXRvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIDEuIERlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BJQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAyLiBSZW1vdmUgYWxsIHN1YmRpcmVjdG9yaWVzIGluIGBzcmMnIHRoYXQgZG9uJ3QgaGF2ZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIDMuIENvbW1lbnQgb3V0IHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZXMgaW4gYG1vZHVsZXMuY2ZnJy4gICAgICAgICovCi0gIC8qICAgICA0LiBDb21waWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICBTIEYgTiBUICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgICAgICAgKi8KLSAgLyogZW1iZWRkZWQgYml0bWFwcyBpbiBhbGwgZm9ybWF0cyB1c2luZyB0aGUgU0ZOVCBtb2R1bGUgKG5hbWVseSAgICAgICAgICovCi0gIC8qIFRydWVUeXBlICYgT3BlblR5cGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byAgICAqLwotICAvKiBsb2FkIGFuZCBlbnVtZXJhdGUgdGhlIGdseXBoIFBvc3RzY3JpcHQgbmFtZXMgaW4gYSBUcnVlVHlwZSBvciAgICAgICAgKi8KLSAgLyogT3BlblR5cGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgd2hlbiB5b3UgZG8gbm90IGNvbXBpbGUgdGhlIGBQU05hbWVzJyBtb2R1bGUgYnkgdW5kZWZpbmluZyAgKi8KLSAgLyogdGhlIGFib3ZlIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUywgdGhlIGBzZm50JyBtb2R1bGUgd2lsbCAgICovCi0gIC8qIGNvbnRhaW4gYWRkaXRpb25hbCBjb2RlIHVzZWQgdG8gcmVhZCB0aGUgUFMgTmFtZXMgdGFibGUgZnJvbSBhIGZvbnQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKEJ5IGRlZmF1bHQsIHRoZSBtb2R1bGUgdXNlcyBgUFNOYW1lcycgdG8gZXh0cmFjdCBnbHlwaCBuYW1lcy4pICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUyBpZiB5b3VyIGFwcGxpY2F0aW9ucyBuZWVkIHRvICAgICAgICovCi0gIC8qIGFjY2VzcyB0aGUgaW50ZXJuYWwgbmFtZSB0YWJsZSBpbiBhIFNGTlQtYmFzZWQgZm9ybWF0IGxpa2UgVHJ1ZVR5cGUgICAqLwotICAvKiBvciBPcGVuVHlwZS4gIFRoZSBuYW1lIHRhYmxlIGNvbnRhaW5zIHZhcmlvdXMgc3RyaW5ncyB1c2VkIHRvICAgICAgICAgKi8KLSAgLyogZGVzY3JpYmUgdGhlIGZvbnQsIGxpa2UgZmFtaWx5IG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLiAgSXQgICAgICovCi0gIC8qIGRvZXMgbm90IGNvbnRhaW4gYW55IGdseXBoIG5hbWUgdGhvdWdoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWNjZXNzaW5nIFNGTlQgbmFtZXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gICAgICAgICovCi0gIC8qIGBmdHNuYW1lcy5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRydWVUeXBlIENNYXAgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBIZXJlIHlvdSBjYW4gZmluZS10dW5lIHdoaWNoIFRydWVUeXBlIENNYXAgdGFibGUgZm9ybWF0IHNoYWxsIGJlICAgICovCi0gIC8qICAgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMAotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMgotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNAotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNgotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfOAotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTAKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEyCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMwotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgIFQgUiBVIEUgVCBZIFAgRSAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgaWYgeW91IHdhbnQgdG8gY29tcGlsZSAgICovCi0gIC8qIGEgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaW4gdGhlIFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnkgdW5kZWZpbmluZyB0aGlzLCB5b3Ugd2lsbCBvbmx5IGNvbXBpbGUgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIGxvYWQgICovCi0gIC8qIFRydWVUeXBlIGdseXBocyB3aXRob3V0IGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSwgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCAgICAgICAgICovCi0gIC8qICAgZGVmaW5lIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgICAgICAgKi8KLSAgLyogc3VicGl4ZWwgaGludGluZyBzdXBwb3J0IGludG8gdGhlIFRydWVUeXBlIGRyaXZlci4gIFRoaXMgbW9kaWZpZXMgdGhlICovCi0gIC8qIFRydWVUeXBlIGhpbnRpbmcgbWVjaGFuaXNtIHdoZW4gYW55dGhpbmcgYnV0IEZUX1JFTkRFUl9NT0RFX01PTk8gaXMgICAqLwotICAvKiByZXF1ZXN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluIHBhcnRpY3VsYXIsIGl0IG1vZGlmaWVzIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciB0byBpbnRlcnByZXQgKG9yICAqLwotICAvKiBub3QpIGluc3RydWN0aW9ucyBpbiBhIGNlcnRhaW4gd2F5IHNvIHRoYXQgYWxsIFRydWVUeXBlIGZvbnRzIGxvb2sgICAgKi8KLSAgLyogbGlrZSB0aGV5IGRvIGluIGEgV2luZG93cyBDbGVhclR5cGUgKERpcmVjdFdyaXRlKSBlbnZpcm9ubWVudC4gIFNlZSAgICovCi0gIC8qIFsxXSBmb3IgYSB0ZWNobmljYWwgb3ZlcnZpZXcgb24gd2hhdCB0aGlzIG1lYW5zLiAgU2VlIGB0dGludGVycC5oJyAgICAqLwotICAvKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBMRUFOIG9wdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVmFsdWUgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgdmFsdWUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgSW5maW5hbGl0eScgbW9uaWtlciwgICAgICAgICAgICAqLwotICAvKiAgICBjb250cmlidXRlZCBieSBhbiBpbmRpdmlkdWFsIG5pY2tuYW1lZCBJbmZpbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgKi8KLSAgLyogICAgbWFraW5nIFRydWVUeXBlIGZvbnRzIHJlbmRlciBiZXR0ZXIgdGhhbiBvbiBXaW5kb3dzLiAgQSBoaWdoICAgICAgICovCi0gIC8qICAgIGFtb3VudCBvZiBjb25maWd1cmFiaWxpdHkgYW5kIGZsZXhpYmlsaXR5LCBkb3duIHRvIHJ1bGVzIGZvciAgICAgICAqLwotICAvKiAgICBzaW5nbGUgZ2x5cGhzIGluIGZvbnRzLCBidXQgYWxzbyB2ZXJ5IHNsb3cuICBJdHMgZXhwZXJpbWVudGFsIGFuZCAgKi8KLSAgLyogICAgc2xvdyBuYXR1cmUgYW5kIHRoZSBvcmlnaW5hbCBkZXZlbG9wZXIgbG9zaW5nIGludGVyZXN0IG1lYW50IHRoYXQgICovCi0gIC8qICAgIHRoaXMgb3B0aW9uIHdhcyBuZXZlciBlbmFibGVkIGluIGRlZmF1bHQgYnVpbGRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJwcmV0ZXIgdmVyc2lvbiBpcyB2MzguICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBWYWx1ZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG5ldyBkZWZhdWx0IG1vZGUgZm9yIHRoZSBUcnVlVHlwZSBkcml2ZXIuICBUaGUgSW5maW5hbGl0eSBjb2RlICovCi0gIC8qICAgIGJhc2Ugd2FzIHN0cmlwcGVkIHRvIHRoZSBiYXJlIG1pbmltdW0gYW5kIGFsbCBjb25maWd1cmFiaWxpdHkgICAgICAqLwotICAvKiAgICByZW1vdmVkIGluIHRoZSBuYW1lIG9mIHNwZWVkIGFuZCBzaW1wbGljaXR5LiAgVGhlIGNvbmZpZ3VyYWJpbGl0eSAgKi8KLSAgLyogICAgd2FzIG1haW5seSBhaW1lZCBhdCBsZWdhY3kgZm9udHMgbGlrZSBBcmlhbCwgVGltZXMgTmV3IFJvbWFuLCBvciAgICovCi0gIC8qICAgIENvdXJpZXIuICBMZWdhY3kgZm9udHMgYXJlIGZvbnRzIHRoYXQgbW9kaWZ5IHZlcnRpY2FsIHN0ZW1zIHRvICAgICAqLwotICAvKiAgICBhY2hpZXZlIGNsZWFuIGJsYWNrLWFuZC13aGl0ZSBiaXRtYXBzLiAgVGhlIG5ldyBtb2RlIGZvY3VzZXMgb24gICAgKi8KLSAgLyogICAgYXBwbHlpbmcgYSBtaW5pbWFsIHNldCBvZiBydWxlcyB0byBhbGwgZm9udHMgaW5kaXNjcmltaW5hdGVseSBzbyAgICovCi0gIC8qICAgIHRoYXQgbW9kZXJuIGFuZCB3ZWIgZm9udHMgcmVuZGVyIHdlbGwgd2hpbGUgbGVnYWN5IGZvbnRzIHJlbmRlciAgICAqLwotICAvKiAgICBva2F5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjb3JyZXNwb25kaW5nIGludGVycHJldGVyIHZlcnNpb24gaXMgdjQwLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVmFsdWUgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXBpbGUgYm90aCwgbWFraW5nIGJvdGggdjM4IGFuZCB2NDAgYXZhaWxhYmxlICh0aGUgbGF0dGVyIGlzIHRoZSAqLwotICAvKiAgICBkZWZhdWx0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJ5IHVuZGVmaW5pbmcgdGhlc2UsIHlvdSBnZXQgcmVuZGVyaW5nIGJlaGF2aW9yIGxpa2Ugb24gV2luZG93cyAgICAgICAqLwotICAvKiB3aXRob3V0IENsZWFyVHlwZSwgaS5lLiwgV2luZG93cyBYUCB3aXRob3V0IENsZWFyVHlwZSBlbmFibGVkIGFuZCAgICAgKi8KLSAgLyogV2luOXggKGludGVycHJldGVyIHZlcnNpb24gdjM1KS4gIE9yIG5vdCwgZGVwZW5kaW5nIG9uIGhvdyBtdWNoICAgICAgICovCi0gIC8qIGhpbnRpbmcgYmxvb2QgYW5kIHRlc3RpbmcgdGVhcnMgdGhlIGZvbnQgZGVzaWduZXIgcHV0IGludG8gYSBnaXZlbiAgICAqLwotICAvKiBmb250LiAgSWYgeW91IGRlZmluZSBvbmUgb3IgYm90aCBzdWJwaXhlbCBoaW50aW5nIG9wdGlvbnMsIHlvdSBjYW4gICAgKi8KLSAgLyogc3dpdGNoIGJldHdlZW4gYmV0d2VlbiB2MzUgYW5kIHRoZSBvbmVzIHlvdSBkZWZpbmUgKHVzaW5nICAgICAgICAgICAgICovCi0gIC8qIGBGVF9Qcm9wZXJ0eV9TZXQnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBvcHRpb24gcmVxdWlyZXMgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiB0byBiZSAgICAgICovCi0gIC8qIGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWzFdIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L2NsZWFydHlwZS90cnVldHlwZWNsZWFydHlwZS5hc3B4ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgIDEgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgIDIKLS8qICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICAoIDEgfCAyICkgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQ09NUE9ORU5UX09GRlNFVF9TQ0FMRUQgdG8gY29tcGlsZSB0aGUgICAgICAgICovCi0gIC8qIFRydWVUeXBlIGdseXBoIGxvYWRlciB0byB1c2UgQXBwbGUncyBkZWZpbml0aW9uIG9mIGhvdyB0byBoYW5kbGUgICAgICAqLwotICAvKiBjb21wb25lbnQgb2Zmc2V0cyBpbiBjb21wb3NpdGUgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFwcGxlIGFuZCBNUyBkaXNhZ3JlZSBvbiB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBjb21wb25lbnQgb2Zmc2V0cyAgICAqLwotICAvKiBpbiBjb21wb3NpdGVzLiAgQXBwbGUgc2F5cyB0aGF0IHRoZXkgc2hvdWxkIGJlIHNjYWxlZCBieSB0aGUgc2NhbGluZyAgKi8KLSAgLyogZmFjdG9ycyBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IChyb3VnaGx5LCBpdCdzIG1vcmUgY29tcGxleCkgICAgICovCi0gIC8qIHdoaWxlIE1TIHNheXMgdGhleSBzaG91bGQgbm90LiAgT3BlblR5cGUgZGVmaW5lcyB0d28gYml0cyBpbiB0aGUgICAgICAqLwotICAvKiBjb21wb3NpdGUgZmxhZ3MgYXJyYXkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGlzYW1iaWd1YXRlLCBidXQgb2xkICAgICAgKi8KLSAgLyogZm9udHMgd2lsbCBub3QgaGF2ZSB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9nbHlmLmh0bSAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2Z2x5Zi5odG1sICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIFRUX0NPTkZJR19PUFRJT05fQ09NUE9ORU5UX09GRlNFVF9TQ0FMRUQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSAgICAgICAgICovCi0gIC8qIHN1cHBvcnQgZm9yIEFwcGxlJ3MgZGlzdG9ydGFibGUgZm9udCB0ZWNobm9sb2d5IChmdmFyLCBndmFyLCBjdmFyLCAgICAqLwotICAvKiBhbmQgYXZhciB0YWJsZXMpLiAgVGhpcyBoYXMgbWFueSBzaW1pbGFyaXRpZXMgdG8gVHlwZSAxIE11bHRpcGxlICAgICAgKi8KLSAgLyogTWFzdGVycyBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JERiBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yICAgICAgICAqLwotICAvKiBhbiBlbWJlZGRlZCBgQkRGICcgdGFibGUgd2l0aGluIFNGTlQtYmFzZWQgYml0bWFwIGZvcm1hdHMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQkRGCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wdGlvbiBUVF9DT05GSUdfT1BUSU9OX01BWF9SVU5OQUJMRV9PUENPREVTIGNvbnRyb2xzIHRoZSBtYXhpbXVtICAgICAqLwotICAvKiBudW1iZXIgb2YgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkIGZvciBhIHNpbmdsZSBydW4gb2YgdGhlICAgICAgKi8KLSAgLyogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIsIG5lZWRlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLiAgWW91IGRvbid0ICAgICovCi0gIC8qIHdhbnQgdG8gY2hhbmdlIHRoaXMgZXhjZXB0IGZvciB2ZXJ5IHNwZWNpYWwgc2l0dWF0aW9ucyAoZS5nLiwgbWFraW5nICAqLwotICAvKiBhIGxpYnJhcnkgZnV6emVyIHNwZW5kIGxlc3MgdGltZSB0byBoYW5kbGUgYnJva2VuIGZvbnRzKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIG5vdCBleHBlY3RlZCB0aGF0IHRoaXMgdmFsdWUgaXMgZXZlciBtb2RpZmllZCBieSBhIGNvbmZpZ3VyaW5nICAqLwotICAvKiBzY3JpcHQ7IGluc3RlYWQsIGl0IGdldHMgc3Vycm91bmRlZCB3aXRoICNpZm5kZWYgLi4uICNlbmRpZiBzbyB0aGF0ICAgKi8KLSAgLyogdGhlIHZhbHVlIGNhbiBiZSBzZXQgYXMgYSBwcmVwcm9jZXNzb3Igb3B0aW9uIG9uIHRoZSBjb21waWxlcidzICAgICAgICovCi0gIC8qIGNvbW1hbmQgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX01BWF9SVU5OQUJMRV9PUENPREVTICAxMDAwMDAwTAotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgIFQgWSBQIEUgMSAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX0RJQ1RfREVQVEggaXMgdGhlIG1heGltdW0gZGVwdGggb2YgbmVzdCBkaWN0aW9uYXJpZXMgYW5kICAgICAgICovCi0gIC8qIGFycmF5cyBpbiB0aGUgVHlwZSAxIHN0cmVhbSAoc2VlIHQxbG9hZC5jKS4gIEEgbWluaW11bSBvZiA0IGlzICAgICAgICAqLwotICAvKiByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9ESUNUX0RFUFRIICA1Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUgICAqLwotICAvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9TVUJSU19DQUxMUyAgMTYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX0NIQVJTVFJJTkdfT1BFUkFORFMgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEgICAgICovCi0gIC8qIG1pbmltdW0gb2YgMTYgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIENoaW5lc2UgZm9udCBNaW5nVGlFRy1NZWRpdW0gKENOUyAxMTY0MyBjaGFyYWN0ZXIgc2V0KSBuZWVkcyAyNTYuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDI1NgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gb2YgYHQxYWZtJywgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgVHlwZSAxIEFGTSAgICAgICovCi0gIC8qIGZpbGVzIGludG8gYW4gZXhpc3RpbmcgZmFjZS4gIE5vdGUgdGhhdCBpZiBzZXQsIHRoZSBUMSBkcml2ZXIgd2lsbCBiZSAqLwotICAvKiB1bmFibGUgdG8gcHJvZHVjZSBrZXJuaW5nIGRpc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IHRoZSAgICAgICAgICAgICovCi0gIC8qIGNvbXBpbGF0aW9uIG9mIHRoZSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnQgc3VwcG9ydCBpbiB0aGUgVHlwZSAxICAgICAgICAqLwotICAvKiBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgIEMgRiBGICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXNpbmcgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl97WCxZfXsxLDIsMyw0fSBpdCBpcyAgICAgICovCi0gIC8qIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGZvdXIgY29udHJvbCBwb2ludHMgdGhhdCAqLwotICAvKiBkZWZpbmUgdGhlIHN0ZW0gZGFya2VuaW5nIGJlaGF2aW91ciBvZiB0aGUgKG5ldykgQ0ZGIGVuZ2luZS4gIEZvciAgICAgKi8KLSAgLyogbW9yZSBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkgb2YgdGhlIGNmZiBkcml2ZXIgbW9kdWxlIChmaWxlICAgICAgICAqLwotICAvKiBgZnRjZmZkcnYuaCcpLCB3aGljaCBhbGxvd3MgdGhlIGNvbnRyb2wgYXQgcnVuLXRpbWUuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERvICpub3QqIHVuZGVmaW5lIHRoZXNlIG1hY3JvcyEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMSAgIDUwMAotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kxICAgNDAwCi0KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiAgMTAwMAotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyICAgMjc1Ci0KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyAgMTY2NwotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kzICAgMjc1Ci0KLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNCAgMjMzMwotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1k0ICAgICAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgY29udHJvbHMgd2hldGhlciB0aGUgcHJlLUFkb2JlIENGRiAgICAgICAqLwotICAvKiBlbmdpbmUgZ2V0cyBjb21waWxlZCBpbnRvIEZyZWVUeXBlLiAgSWYgZGVmaW5lZCwgaXQgaXMgcG9zc2libGUgdG8gICAgKi8KLSAgLyogc3dpdGNoIGJldHdlZW4gdGhlIHR3byBlbmdpbmVzIHVzaW5nIHRoZSBgaGludGluZy1lbmdpbmUnIHByb3BlcnR5IG9mICovCi0gIC8qIHRoZSBjZmYgZHJpdmVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICBQIEMgRiAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSBtYW55IFBDRiBmb250cyBqdXN0IGNhbGxlZCBgRml4ZWQnIHdoaWNoIGxvb2sgY29tcGxldGVseSAgICAqLwotICAvKiBkaWZmZXJlbnQsIGFuZCB3aGljaCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBlYWNoIG90aGVyLiAgV2hlbiAgICAgICAgKi8KLSAgLyogc2VsZWN0aW5nIGBGaXhlZCcgaW4gS0RFIG9yIEdub21lIG9uZSBnZXRzIHJlc3VsdHMgdGhhdCBhcHBlYXIgcmF0aGVyICovCi0gIC8qIHJhbmRvbSwgdGhlIHN0eWxlIGNoYW5nZXMgb2Z0ZW4gaWYgb25lIGNoYW5nZXMgdGhlIHNpemUgYW5kIG9uZSAgICAgICAqLwotICAvKiBjYW5ub3Qgc2VsZWN0IHNvbWUgZm9udHMgYXQgYWxsLiAgVGhpcyBvcHRpb24gbWFrZXMgdGhlIFBDRiBtb2R1bGUgICAgKi8KLSAgLyogcHJlcGVuZCB0aGUgZm91bmRyeSBuYW1lIChwbHVzIGEgc3BhY2UpIHRvIHRoZSBmYW1pbHkgbmFtZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBhbHNvIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBgd2lkZScgY2hhcmFjdGVyczsgYWxsIHB1dCB0b2dldGhlciwgd2UgKi8KLSAgLyogZ2V0IGZhbWlseSBuYW1lcyBsaWtlIGBTb255IEZpeGVkJyBvciBgTWlzYyBGaXhlZCBXaWRlJy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsIGl0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlICAgICAgICAgICAgKi8KLSAgLyogYG5vLWxvbmctZmFtaWx5LW5hbWVzJyBwcm9wZXJ0eSBvZiB0aGUgcGNmIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgQSBVIFQgTyBGIEkgVCAgIE0gTyBEIFUgTCBFICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENvbXBpbGUgYXV0b2ZpdCBtb2R1bGUgd2l0aCBDSksgKENoaW5lc2UsIEphcGFuZXNlLCBLb3JlYW4pIHNjcmlwdCAgICAqLwotICAvKiBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fQ0pLCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggZmFsbGJhY2sgSW5kaWMgc2NyaXB0IHN1cHBvcnQsIGNvdmVyaW5nICAgKi8KLSAgLyogc29tZSBzY3JpcHRzIHRoYXQgdGhlIGBsYXRpbicgc3VibW9kdWxlIG9mIHRoZSBhdXRvZml0IG1vZHVsZSBkb2Vzbid0ICovCi0gIC8qICh5ZXQpIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9JTkRJQwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcGlsZSBhdXRvZml0IG1vZHVsZSB3aXRoIHdhcnAgaGludGluZy4gIFRoZSBpZGVhIG9mIHRoZSB3YXJwaW5nICAgICovCi0gIC8qIGNvZGUgaXMgdG8gc2xpZ2h0bHkgc2NhbGUgYW5kIHNoaWZ0IGEgZ2x5cGggd2l0aGluIGEgc2luZ2xlIGRpbWVuc2lvbiAqLwotICAvKiBzbyB0aGF0IGFzIG11Y2ggb2YgaXRzIHNlZ21lbnRzIGFyZSBhbGlnbmVkIChtb3JlIG9yIGxlc3MpIG9uIHRoZSAgICAgKi8KLSAgLyogZ3JpZC4gIFRvIGZpbmQgb3V0IHRoZSBvcHRpbWFsIHNjYWxpbmcgYW5kIHNoaWZ0aW5nIHZhbHVlLCB2YXJpb3VzICAgICovCi0gIC8qIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBleHBlcmltZW50YWwgb3B0aW9uIGlzIGFjdGl2ZSBvbmx5IGlmIHRoZSByZW5kZXJpbmcgbW9kZSBpcyAgICAgICovCi0gIC8qIEZUX1JFTkRFUl9NT0RFX0xJR0hUOyB5b3UgY2FuIHN3aXRjaCB3YXJwaW5nIG9uIGFuZCBvZmYgd2l0aCB0aGUgICAgICAqLwotICAvKiBgd2FycGluZycgcHJvcGVydHkgb2YgdGhlIGF1dG8taGludGVyIChzZWUgZmlsZSBgZnRhdXRvaC5oJyBmb3IgbW9yZSAgKi8KLSAgLyogaW5mb3JtYXRpb247IGJ5IGRlZmF1bHQgaXQgaXMgc3dpdGNoZWQgb2ZmKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVzZSBUcnVlVHlwZS1saWtlIHNpemUgbWV0cmljcyBmb3IgYGxpZ2h0JyBhdXRvLWhpbnRpbmcuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gYXZvaWQgdGhpcyBvcHRpb24sIHdoaWNoIGV4aXN0cyBvbmx5IHRvICovCi0gIC8qIGhlbHAgc29tZSBsZWdhY3kgYXBwbGljYXRpb25zIHJldGFpbiBpdHMgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3VyICAgICAqLwotICAvKiB3aXRoIHJlc3BlY3QgdG8gYXV0by1oaW50ZWQgVHJ1ZVR5cGUgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSB2ZXJ5IHJlYXNvbiB0aGlzIG9wdGlvbiBleGlzdHMgYXQgYWxsIGFyZSBHTlUvTGludXggZGlzdHJpYnV0aW9ucyAqLwotICAvKiBsaWtlIEZlZG9yYSB0aGF0IGRpZCBub3QgdW4tcGF0Y2ggdGhlIGZvbGxvd2luZyBjaGFuZ2UgKHdoaWNoIHdhcyAgICAgKi8KLSAgLyogcHJlc2VudCBpbiBGcmVlVHlwZSBiZXR3ZWVuIHZlcnNpb25zIDIuNC42IGFuZCAyLjcuMSwgaW5jbHVzaXZlKS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDIwMTEtMDctMTYgIFN0ZXZlbiBDaHUgIDxzdGV2ZW4uZi5jaHVAZ21haWwuY29tPiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBbdHJ1ZXR5cGVdIEZpeCBtZXRyaWNzIG9uIHNpemUgcmVxdWVzdCBmb3Igc2NhbGFibGUgZm9udHMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBwcm9ibGVtYXRpYyBjb21taXQgaXMgbm93IHJldmVydGVkIChtb3JlIG9yIGxlc3MpLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX1RUX1NJWkVfTUVUUklDUyAqLwotCi0gIC8qICovCi0KLQotICAvKgotICAgKiBUaGlzIG1hY3JvIGlzIG9ic29sZXRlLiAgU3VwcG9ydCBoYXMgYmVlbiByZW1vdmVkIGluIEZyZWVUeXBlCi0gICAqIHZlcnNpb24gMi41LgotICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTICovCi0KLQotICAvKgotICAgKiBUaGlzIG1hY3JvIGlzIGRlZmluZWQgaWYgbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgaXMgcmVxdWVzdGVkIGJ5IHRoZQotICAgKiBkZWZpbml0aW9ucyBhYm92ZS4KLSAgICovCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUgotI2RlZmluZSAgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSNpZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgJiAxCi0jZGVmaW5lICBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotI2VuZGlmCi0KLSNpZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgJiAyCi0jZGVmaW5lICBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0KLSAgLyoKLSAgICogQ2hlY2sgQ0ZGIGRhcmtlbmluZyBwYXJhbWV0ZXJzLiAgVGhlIGNoZWNrcyBhcmUgdGhlIHNhbWUgYXMgaW4gZnVuY3Rpb24KLSAgICogYGNmZl9wcm9wZXJ0eV9zZXQnIGluIGZpbGUgYGNmZmRyaXZyLmMnLgotICAgKi8KLSNpZiBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxIDwgMCAgIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gyIDwgMCAgIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gzIDwgMCAgIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1g0IDwgMCAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kxIDwgMCAgIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyIDwgMCAgIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kzIDwgMCAgIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1k0IDwgMCAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxID4gICAgICAgIFwKLSAgICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgICAgIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gyID4gICAgICAgIFwKLSAgICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgICAgIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gzID4gICAgICAgIFwKLSAgICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDQgICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kxID4gNTAwIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyID4gNTAwIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kzID4gNTAwIHx8IFwKLSAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1k0ID4gNTAwCi0jZXJyb3IgIkludmFsaWQgQ0ZGIGRhcmtlbmluZyBwYXJhbWV0ZXJzISIKLSNlbmRpZgotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIEZUT1BUSU9OX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhNDg0NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3RkbGliLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBTlNJLXNwZWNpZmljIGxpYnJhcnkgYW5kIGhlYWRlciBjb25maWd1cmF0aW9uIGZpbGUgKHNwZWNpZmljYXRpb24gICAqLwotLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBncm91cCBhbGwgI2luY2x1ZGVzIHRvIHRoZSBBTlNJIEMgbGlicmFyeSB0aGF0ICAgKi8KLSAgLyogRnJlZVR5cGUgbm9ybWFsbHkgcmVxdWlyZXMuICBJdCBhbHNvIGRlZmluZXMgbWFjcm9zIHRvIHJlbmFtZSB0aGUgICAgICovCi0gIC8qIHN0YW5kYXJkIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTG9hZCBhIGZpbGUgd2hpY2ggZGVmaW5lcyBGVFNURExJQl9IXyBiZWZvcmUgdGhpcyBvbmUgdG8gb3ZlcnJpZGUgaXQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUU1RETElCX0hfCi0jZGVmaW5lIEZUU1RETElCX0hfCi0KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jZGVmaW5lIGZ0X3B0cmRpZmZfdCAgcHRyZGlmZl90Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciBsaW1pdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVUlOVF9NQVggYW5kIFVMT05HX01BWCBhcmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgdGhlIHNpemUgICovCi0gIC8qIG9mIGBpbnQnIGFuZCBgbG9uZycgaW4gYnl0ZXMgYXQgY29tcGlsZS10aW1lLiAgU28gZmFyLCB0aGlzIHdvcmtzICAqLwotICAvKiBmb3IgYWxsIHBsYXRmb3JtcyB0aGUgbGlicmFyeSBoYXMgYmVlbiB0ZXN0ZWQgb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBvbiB0aGUgZXh0cmVtZWx5IHJhcmUgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHByb3ZpZGUgICAgICAqLwotICAvKiBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlIF9leGFjdGx5XyAxNiBhbmQgMzIgYml0cyB3aWRlIChlLmcuIHNvbWUgICAgKi8KLSAgLyogb2xkIENyYXlzIHdoZXJlIGBpbnQnIGlzIDM2IGJpdHMpLCB3ZSBkbyBub3QgbWFrZSBhbnkgZ3VhcmFudGVlICAgICovCi0gIC8qIGFib3V0IHRoZSBjb3JyZWN0IGJlaGF2aW91ciBvZiBGVDIgd2l0aCBhbGwgZm9udHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW4gdGhlc2UgY2FzZSwgYGZ0Y29uZmlnLmgnIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUgYW55d2F5IHdpdGggYSAgICovCi0gIC8qIG1lc3NhZ2UgbGlrZSBgY291bGRuJ3QgZmluZCAzMi1iaXQgdHlwZScgb3Igc29tZXRoaW5nIHNpbWlsYXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jZGVmaW5lIEZUX0NIQVJfQklUICAgIENIQVJfQklUCi0jZGVmaW5lIEZUX1VTSE9SVF9NQVggIFVTSFJUX01BWAotI2RlZmluZSBGVF9JTlRfTUFYICAgICBJTlRfTUFYCi0jZGVmaW5lIEZUX0lOVF9NSU4gICAgIElOVF9NSU4KLSNkZWZpbmUgRlRfVUlOVF9NQVggICAgVUlOVF9NQVgKLSNkZWZpbmUgRlRfTE9OR19NSU4gICAgTE9OR19NSU4KLSNkZWZpbmUgRlRfTE9OR19NQVggICAgTE9OR19NQVgKLSNkZWZpbmUgRlRfVUxPTkdfTUFYICAgVUxPTkdfTUFYCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgYW5kIHN0cmluZyBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIGZ0X21lbWNociAgIG1lbWNocgotI2RlZmluZSBmdF9tZW1jbXAgICBtZW1jbXAKLSNkZWZpbmUgZnRfbWVtY3B5ICAgbWVtY3B5Ci0jZGVmaW5lIGZ0X21lbW1vdmUgIG1lbW1vdmUKLSNkZWZpbmUgZnRfbWVtc2V0ICAgbWVtc2V0Ci0jZGVmaW5lIGZ0X3N0cmNhdCAgIHN0cmNhdAotI2RlZmluZSBmdF9zdHJjbXAgICBzdHJjbXAKLSNkZWZpbmUgZnRfc3RyY3B5ICAgc3RyY3B5Ci0jZGVmaW5lIGZ0X3N0cmxlbiAgIHN0cmxlbgotI2RlZmluZSBmdF9zdHJuY21wICBzdHJuY21wCi0jZGVmaW5lIGZ0X3N0cm5jcHkgIHN0cm5jcHkKLSNkZWZpbmUgZnRfc3RycmNociAgc3RycmNocgotI2RlZmluZSBmdF9zdHJzdHIgICBzdHJzdHIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBGVF9GSUxFICAgICBGSUxFCi0jZGVmaW5lIGZ0X2ZjbG9zZSAgIGZjbG9zZQotI2RlZmluZSBmdF9mb3BlbiAgICBmb3BlbgotI2RlZmluZSBmdF9mcmVhZCAgICBmcmVhZAotI2RlZmluZSBmdF9mc2VlayAgICBmc2VlawotI2RlZmluZSBmdF9mdGVsbCAgICBmdGVsbAotI2RlZmluZSBmdF9zcHJpbnRmICBzcHJpbnRmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZGVmaW5lIGZ0X3Fzb3J0ICBxc29ydAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgZnRfc2NhbGxvYyAgIGNhbGxvYwotI2RlZmluZSBmdF9zZnJlZSAgICAgZnJlZQotI2RlZmluZSBmdF9zbWFsbG9jICAgbWFsbG9jCi0jZGVmaW5lIGZ0X3NyZWFsbG9jICByZWFsbG9jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBmdF9zdHJ0b2wgIHN0cnRvbAotI2RlZmluZSBmdF9nZXRlbnYgIGdldGVudgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2RlZmluZSBmdF9qbXBfYnVmICAgICBqbXBfYnVmICAvKiBub3RlOiB0aGlzIGNhbm5vdCBiZSBhIHR5cGVkZWYgc2luY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgam1wX2J1ZiBpcyBkZWZpbmVkIGFzIGEgbWFjcm8gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgIG9uIGNlcnRhaW4gcGxhdGZvcm1zICAgICAgICAgICAqLwotCi0jZGVmaW5lIGZ0X2xvbmdqbXAgICAgIGxvbmdqbXAKLSNkZWZpbmUgZnRfc2V0am1wKCBiICkgc2V0am1wKCAqKGZ0X2ptcF9idWYqKSAmKGIpICkgLyogc2FtZSB0aGluZyBoZXJlICovCi0KLQotICAvKiB0aGUgZm9sbG93aW5nIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpLmUuLCBpZiAqLwotICAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiBvciBGVF9ERUJVR19MRVZFTF9UUkFDRSBhcmUgZGVmaW5lZCAgICAqLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLQotI2VuZGlmIC8qIEZUU1RETElCX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTlkMDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmcmVldHlwZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgaGlnaC1sZXZlbCBBUEkgYW5kIGNvbW1vbiB0eXBlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlJFRVRZUEVfSF8KLSNkZWZpbmUgRlJFRVRZUEVfSF8KLQotCi0jaWZuZGVmIEZUX0ZSRUVUWVBFX0gKLSNlcnJvciAiYGZ0MmJ1aWxkLmgnIGhhc24ndCBiZWVuIGluY2x1ZGVkIHlldCEiCi0jZXJyb3IgIlBsZWFzZSBhbHdheXMgdXNlIG1hY3JvcyB0byBpbmNsdWRlIEZyZWVUeXBlIGhlYWRlciBmaWxlcy4iCi0jZXJyb3IgIkV4YW1wbGU6IgotI2Vycm9yICIgICNpbmNsdWRlIDxmdDJidWlsZC5oPiIKLSNlcnJvciAiICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9IIgotI2VuZGlmCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlYWRlcl9pbmNsdXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlJ3MgaGVhZGVyIGluY2x1c2lvbiBzY2hlbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyBjbGllbnQgYXBwbGljYXRpb25zIHNob3VsZCBpbmNsdWRlIEZyZWVUeXBlIGhlYWRlciBmaWxlcy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlIChhbmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucyksICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSB1c2VzIGEgdmVyeSBzcGVjaWFsIGluY2x1c2lvbiBzY2hlbWUgdG8gbG9hZCBoZWFkZXIgICAgICAgKi8KLSAgLyogICAgZmlsZXMsIGZvciBleGFtcGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSBGVF9PVVRMSU5FX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBjb21waWxlciBhbmQgaXRzIHByZXByb2Nlc3NvciBvbmx5IG5lZWRzIGFuIGluY2x1ZGUgcGF0aCB0byBmaW5kICovCi0gIC8qICAgIHRoZSBmaWxlIGBmdDJidWlsZC5oJzsgdGhlIGV4YWN0IGxvY2F0aW9ucyBhbmQgbmFtZXMgb2YgdGhlIG90aGVyICAqLwotICAvKiAgICBGcmVlVHlwZSBoZWFkZXIgZmlsZXMgYXJlIGhpZGRlbiBieSBwcmVwcm9jZXNzb3IgbWFjcm8gbmFtZXMsICAgICAgKi8KLSAgLyogICAgbG9hZGVkIGJ5IGBmdDJidWlsZC5oJy4gIFRoZSBBUEkgZG9jdW1lbnRhdGlvbiBhbHdheXMgZ2l2ZXMgdGhlICAgICovCi0gIC8qICAgIGhlYWRlciBtYWNybyBuYW1lIG5lZWRlZCBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyX2FsbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VyIGFsbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIb3cgY2xpZW50IGFwcGxpY2F0aW9ucyBzaG91bGQgYWxsb2NhdGUgRnJlZVR5cGUgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBhc3N1bWVzIHRoYXQgc3RydWN0dXJlcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgYW5kIHBhc3NlZCAgKi8KLSAgLyogICAgYXMgYXJndW1lbnRzIGFyZSB6ZXJvZWQgb3V0IGV4Y2VwdCBmb3IgdGhlIGFjdHVhbCBkYXRhLiAgSW4gb3RoZXIgICovCi0gIC8qICAgIHdvcmRzLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGNhbGxvYycgKG9yIHZhcmlhbnRzIG9mIGl0KSAgICAgICAqLwotICAvKiAgICBpbnN0ZWFkIG9mIGBtYWxsb2MnIGZvciBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEIgQSBTIEkgQyAgIFQgWSBQIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2VfaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJhc2UgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZX4yIGJhc2UgZm9udCBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgaW1wb3J0YW50IHB1YmxpYyBoaWdoLWxldmVsIEFQSSAgICAqLwotICAvKiAgICBmdW5jdGlvbnMgb2YgRnJlZVR5cGV+Mi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhck1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1NGTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfVFJJQ0tZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0tFUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19ISU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0hPUklaT05UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19WRVJUSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfS0VSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0ZJWEVEX1NJWkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19HTFlQSF9OQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JU19TRk5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSVNfU0NBTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lTX0ZJWEVEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JU19DSURfS0VZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSVNfVFJJQ0tZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVFlMRV9GTEFHX0JPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19JVEFMSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFNsb3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N1YkdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlZmVyZW5jZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTWVtb3J5X0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9Qcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5fRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuX0FyZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9GaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdHRhY2hfU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFyX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfUGl4ZWxfU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVxdWVzdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NlbGVjdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfRmlyc3RfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X05leHRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9OYW1lX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb2FkX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1NUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9QQVRITkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1JFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9NT05PQ0hST01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTElORUFSX0RFU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9OT19ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fQklUTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX0FVVE9ISU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX1JFQ1VSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9QRURBTlRJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfTElHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9MQ0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfTENEX1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcl9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0tlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tlcm5pbmdfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfVHJhY2tfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0dseXBoX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9Qb3N0c2NyaXB0X05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhck1hcFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NlbGVjdF9DaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfQ2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NoYXJtYXBfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfRlNUeXBlX0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1N1YkdseXBoX0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nsb3RfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVUJHTFlQSF9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfRkFTVF9HTFlQSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgdGhlIG1ldHJpY3Mgb2YgYSBzaW5nbGUgZ2x5cGguICBUaGUgdmFsdWVzICAgICovCi0gIC8qICAgIGFyZSBleHByZXNzZWQgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVsIGZvcm1hdDsgaWYgdGhlIGZsYWcgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSBoYXMgYmVlbiB1c2VkIHdoaWxlIGxvYWRpbmcgdGhlIGdseXBoLCB2YWx1ZXMgICAgKi8KLSAgLyogICAgYXJlIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoJ3Mgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoJ3MgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUJlYXJpbmdYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgTGVmdCBzaWRlIGJlYXJpbmcgZm9yIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUJlYXJpbmdZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVG9wIHNpZGUgYmVhcmluZyBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUFkdmFuY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQWR2YW5jZSB3aWR0aCBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEJlYXJpbmdYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgTGVmdCBzaWRlIGJlYXJpbmcgZm9yIHZlcnRpY2FsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEJlYXJpbmdZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVG9wIHNpZGUgYmVhcmluZyBmb3IgdmVydGljYWwgbGF5b3V0LiAgTGFyZ2VyIHBvc2l0aXZlIHZhbHVlcyAgICAqLwotICAvKiAgICAgIG1lYW4gZnVydGhlciBiZWxvdyB0aGUgdmVydGljYWwgZ2x5cGggb3JpZ2luLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRBZHZhbmNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFkdmFuY2UgaGVpZ2h0IGZvciB2ZXJ0aWNhbCBsYXlvdXQuICBQb3NpdGl2ZSB2YWx1ZXMgbWVhbiB0aGUgICAgKi8KLSAgLyogICAgICBnbHlwaCBoYXMgYSBwb3NpdGl2ZSBhZHZhbmNlIGRvd253YXJkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgbm90IGRpc2FibGVkIHdpdGggQEZUX0xPQURfTk9fSElOVElORywgdGhlIHZhbHVlcyByZXByZXNlbnQgICAgICovCi0gIC8qICAgIGRpbWVuc2lvbnMgb2YgdGhlIGhpbnRlZCBnbHlwaCAoaW4gY2FzZSBoaW50aW5nIGlzIGFwcGxpY2FibGUpLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3Ryb2tpbmcgYSBnbHlwaCB3aXRoIGFuIG91dHNpZGUgYm9yZGVyIGRvZXMgbm90IGluY3JlYXNlICAgICAgICAgICovCi0gIC8qICAgIGBob3JpQWR2YW5jZScgb3IgYHZlcnRBZHZhbmNlJzsgeW91IGhhdmUgdG8gbWFudWFsbHkgYWRqdXN0IHRoZXNlICAqLwotICAvKiAgICB2YWx1ZXMgdG8gYWNjb3VudCBmb3IgdGhlIGFkZGVkIHdpZHRoIGFuZCBoZWlnaHQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGRvZXNuJ3QgdXNlIHRoZSBgVk9SRycgdGFibGUgZGF0YSBmb3IgQ0ZGIGZvbnRzIGJlY2F1c2UgICAqLwotICAvKiAgICBpdCBkb2Vzbid0IGhhdmUgYW4gaW50ZXJmYWNlIHRvIHF1aWNrbHkgcmV0cmlldmUgdGhlIGdseXBoIGhlaWdodC4gKi8KLSAgLyogICAgVGhlIHl+Y29vcmRpbmF0ZSBvZiB0aGUgdmVydGljYWwgb3JpZ2luIGNhbiBiZSBzaW1wbHkgY29tcHV0ZWQgYXMgICovCi0gIC8qICAgIGB2ZXJ0QmVhcmluZ1kgKyBoZWlnaHQnIGFmdGVyIGxvYWRpbmcgYSBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoX01ldHJpY3NfCi0gIHsKLSAgICBGVF9Qb3MgIHdpZHRoOwotICAgIEZUX1BvcyAgaGVpZ2h0OwotCi0gICAgRlRfUG9zICBob3JpQmVhcmluZ1g7Ci0gICAgRlRfUG9zICBob3JpQmVhcmluZ1k7Ci0gICAgRlRfUG9zICBob3JpQWR2YW5jZTsKLQotICAgIEZUX1BvcyAgdmVydEJlYXJpbmdYOwotICAgIEZUX1BvcyAgdmVydEJlYXJpbmdZOwotICAgIEZUX1BvcyAgdmVydEFkdmFuY2U7Ci0KLSAgfSBGVF9HbHlwaF9NZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgbW9kZWxzIHRoZSBtZXRyaWNzIG9mIGEgYml0bWFwIHN0cmlrZSAoaS5lLiwgYSBzZXQgICovCi0gIC8qICAgIG9mIGdseXBocyBmb3IgYSBnaXZlbiBwb2ludCBzaXplIGFuZCByZXNvbHV0aW9uKSBpbiBhIGJpdG1hcCBmb250LiAqLwotICAvKiAgICBJdCBpcyB1c2VkIGZvciB0aGUgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgQEZUX0ZhY2UuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgOjogVGhlIHZlcnRpY2FsIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdHdvICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGNvbnNlY3V0aXZlIGJhc2VsaW5lcy4gIEl0IGlzIGFsd2F5cyBwb3NpdGl2ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgOjogVGhlIGF2ZXJhZ2Ugd2lkdGgsIGluIHBpeGVscywgb2YgYWxsIGdseXBocyBpbiB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgOjogVGhlIG5vbWluYWwgc2l6ZSBvZiB0aGUgc3RyaWtlIGluIDI2LjYgZnJhY3Rpb25hbCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHBvaW50cy4gIFRoaXMgZmllbGQgaXMgbm90IHZlcnkgdXNlZnVsLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3BwZW0gOjogVGhlIGhvcml6b250YWwgcHBlbSAobm9taW5hbCB3aWR0aCkgaW4gMjYuNiBmcmFjdGlvbmFsICAgKi8KLSAgLyogICAgICAgICAgICAgIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW0gOjogVGhlIHZlcnRpY2FsIHBwZW0gKG5vbWluYWwgaGVpZ2h0KSBpbiAyNi42IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgICAgICAgICAgIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93cyBGTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG5vbWluYWwgc2l6ZSBnaXZlbiBpbiBhIEZOVCBmb250IGlzIG5vdCByZWxpYWJsZS4gIElmIHRoZSAgICAqLwotICAvKiAgICAgIGRyaXZlciBmaW5kcyBpdCBpbmNvcnJlY3QsIGl0IHNldHMgYHNpemUnIHRvIHNvbWUgY2FsY3VsYXRlZCAgICAgKi8KLSAgLyogICAgICB2YWx1ZXMsIGFuZCBgeF9wcGVtJyBhbmQgYHlfcHBlbScgdG8gdGhlIHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQgICovCi0gIC8qICAgICAgZ2l2ZW4gaW4gdGhlIGZvbnQsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgZW1iZWRkZWQgYml0bWFwczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYHNpemUnLCBgd2lkdGgnLCBhbmQgYGhlaWdodCcgdmFsdWVzIGFyZSBub3QgY29udGFpbmVkIGluIHRoZSAgICAqLwotICAvKiAgICAgIGJpdG1hcCBzdHJpa2UgaXRzZWxmLiAgVGhleSBhcmUgY29tcHV0ZWQgZnJvbSB0aGUgZ2xvYmFsIGZvbnQgICAgKi8KLSAgLyogICAgICBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQml0bWFwX1NpemVfCi0gIHsKLSAgICBGVF9TaG9ydCAgaGVpZ2h0OwotICAgIEZUX1Nob3J0ICB3aWR0aDsKLQotICAgIEZUX1BvcyAgICBzaXplOwotCi0gICAgRlRfUG9zICAgIHhfcHBlbTsKLSAgICBGVF9Qb3MgICAgeV9wcGVtOwotCi0gIH0gRlRfQml0bWFwX1NpemU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIE8gQiBKIEUgQyBUICAgQyBMIEEgUyBTIEUgUyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICBFYWNoIGBsaWJyYXJ5JyBpcyAgICAgICAgKi8KLSAgLyogICAgY29tcGxldGVseSBpbmRlcGVuZGVudCBmcm9tIHRoZSBvdGhlcnM7IGl0IGlzIHRoZSBgcm9vdCcgb2YgYSBzZXQgICovCi0gIC8qICAgIG9mIG9iamVjdHMgbGlrZSBmb250cywgZmFjZXMsIHNpemVzLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgYWxzbyBlbWJlZHMgYSBtZW1vcnkgbWFuYWdlciAoc2VlIEBGVF9NZW1vcnkpLCBhcyB3ZWxsIGFzIGEgICAgICovCi0gIC8qICAgIHNjYW4tbGluZSBjb252ZXJ0ZXIgb2JqZWN0IChzZWUgQEZUX1Jhc3RlcikuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIGl0IGlzIGVhc2llc3QgdG8gdXNlIG9uZSAgICAgICAgICAgICovCi0gIC8qICAgIGBGVF9MaWJyYXJ5JyBvYmplY3QgcGVyIHRocmVhZC4gIEluIGNhc2UgdGhpcyBpcyB0b28gY3VtYmVyc29tZSwgICAqLwotICAvKiAgICBhIHNpbmdsZSBgRlRfTGlicmFyeScgb2JqZWN0IGFjcm9zcyB0aHJlYWRzIGlzIHBvc3NpYmxlIGFsc28gICAgICAgKi8KLSAgLyogICAgKHNpbmNlIEZyZWVUeXBlIHZlcnNpb24gMi41LjYpLCBhcyBsb25nIGFzIGEgbXV0ZXggbG9jayBpcyB1c2VkICAgICovCi0gIC8qICAgIGFyb3VuZCBARlRfTmV3X0ZhY2UgYW5kIEBGVF9Eb25lX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpYnJhcnkgb2JqZWN0cyBhcmUgbm9ybWFsbHkgY3JlYXRlZCBieSBARlRfSW5pdF9GcmVlVHlwZSwgYW5kICAgICAqLwotICAvKiAgICBkZXN0cm95ZWQgd2l0aCBARlRfRG9uZV9GcmVlVHlwZS4gIElmIHlvdSBuZWVkIHJlZmVyZW5jZS1jb3VudGluZyAgKi8KLSAgLyogICAgKGNmLiBARlRfUmVmZXJlbmNlX0xpYnJhcnkpLCB1c2UgQEZUX05ld19MaWJyYXJ5IGFuZCAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Eb25lX0xpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlicmFyeVJlY18gICpGVF9MaWJyYXJ5OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIG1vZHVsZSBvYmplY3QuICBBIG1vZHVsZSBjYW4gYmUgYSAgICAgKi8KLSAgLyogICAgZm9udCBkcml2ZXIsIGEgcmVuZGVyZXIsIG9yIGFueXRoaW5nIGVsc2UgdGhhdCBwcm92aWRlcyBzZXJ2aWNlcyAgICovCi0gIC8qICAgIHRvIHRoZSBmb3JtZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTW9kdWxlUmVjXyogIEZUX01vZHVsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gRnJlZVR5cGUgZm9udCBkcml2ZXIgb2JqZWN0LiAgQSBmb250IGRyaXZlciAgICAqLwotICAvKiAgICBpcyBhIG1vZHVsZSBjYXBhYmxlIG9mIGNyZWF0aW5nIGZhY2VzIGZyb20gZm9udCBmaWxlcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0RyaXZlclJlY18qICBGVF9Ecml2ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIHJlbmRlcmVyLiAgQSByZW5kZXJlciBpcyBhIG1vZHVsZSBpbiAgKi8KLSAgLyogICAgY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCdzIG91dGxpbmUgaW1hZ2UgdG8gYSBiaXRtYXAuICBJdCAgICAgICovCi0gIC8qICAgIHN1cHBvcnRzIGEgc2luZ2xlIGdseXBoIGltYWdlIGZvcm1hdCwgYW5kIG9uZSBvciBtb3JlIHRhcmdldCAgICAgICAqLwotICAvKiAgICBzdXJmYWNlIGRlcHRocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1JlbmRlcmVyUmVjXyogIEZUX1JlbmRlcmVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIHR5cG9ncmFwaGljIGZhY2Ugb2JqZWN0LiAgQSBmYWNlIG9iamVjdCBtb2RlbHMgYSAgICAgKi8KLSAgLyogICAgZ2l2ZW4gdHlwZWZhY2UsIGluIGEgZ2l2ZW4gc3R5bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmYWNlIG9iamVjdCBhbHNvIG93bnMgYSBzaW5nbGUgQEZUX0dseXBoU2xvdCBvYmplY3QsIGFzIHdlbGwgICAgICovCi0gIC8qICAgIGFzIG9uZSBvciBtb3JlIEBGVF9TaXplIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9OZXdfRmFjZSBvciBARlRfT3Blbl9GYWNlIHRvIGNyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tICovCi0gIC8qICAgIGEgZ2l2ZW4gZmlsZXBhdGggb3IgYSBjdXN0b20gaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9Eb25lX0ZhY2UgdG8gZGVzdHJveSBpdCAoYWxvbmcgd2l0aCBpdHMgc2xvdCBhbmQgc2l6ZXMpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBgRlRfRmFjZScgb2JqZWN0IGNhbiBvbmx5IGJlIHNhZmVseSB1c2VkIGZyb20gb25lIHRocmVhZCBhdCBhICAgKi8KLSAgLyogICAgdGltZS4gIFNpbWlsYXJseSwgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIGBGVF9GYWNlJyB3aXRoIHRoZSAgICovCi0gIC8qICAgIHNhbWUgQEZUX0xpYnJhcnkgb2JqZWN0IGNhbiBvbmx5IGJlIGRvbmUgZnJvbSBvbmUgdGhyZWFkIGF0IGEgICAgICAqLwotICAvKiAgICB0aW1lLiAgT24gdGhlIG90aGVyIGhhbmQsIGZ1bmN0aW9ucyBsaWtlIEBGVF9Mb2FkX0dseXBoIGFuZCBpdHMgICAgKi8KLSAgLyogICAgc2libGluZ3MgYXJlIHRocmVhZC1zYWZlIGFuZCBkbyBub3QgbmVlZCB0aGUgbG9jayB0byBiZSBoZWxkIGFzICAgICovCi0gIC8qICAgIGxvbmcgYXMgdGhlIHNhbWUgYEZUX0ZhY2UnIG9iamVjdCBpcyBub3QgdXNlZCBmcm9tIG11bHRpcGxlICAgICAgICAqLwotICAvKiAgICB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBbHNvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgQEZUX0ZhY2VSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuIGZhY2UgKi8KLSAgLyogICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9GYWNlUmVjXyogIEZUX0ZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBvYmplY3QgdGhhdCBtb2RlbHMgYSBmYWNlIHNjYWxlZCB0byBhIGdpdmVuICAgICAgICAgKi8KLSAgLyogICAgY2hhcmFjdGVyIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gQEZUX0ZhY2UgaGFzIG9uZSBfYWN0aXZlXyBARlRfU2l6ZSBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5ICAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBsaWtlIEBGVF9Mb2FkX0dseXBoIHRvIGRldGVybWluZSB0aGUgc2NhbGluZyAgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1hdGlvbiB0aGF0IGluIHR1cm4gaXMgdXNlZCB0byBsb2FkIGFuZCBoaW50IGdseXBocyBhbmQgICAgKi8KLSAgLyogICAgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHVzZSBARlRfU2V0X0NoYXJfU2l6ZSwgQEZUX1NldF9QaXhlbF9TaXplcywgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1JlcXVlc3RfU2l6ZSBvciBldmVuIEBGVF9TZWxlY3RfU2l6ZSB0byBjaGFuZ2UgdGhlIGNvbnRlbnQgICAgICovCi0gIC8qICAgIChpLmUuLCB0aGUgc2NhbGluZyB2YWx1ZXMpIG9mIHRoZSBhY3RpdmUgQEZUX1NpemUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiB1c2UgQEZUX05ld19TaXplIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNpemUgb2JqZWN0cyBmb3IgYSAgICovCi0gIC8qICAgIGdpdmVuIEBGVF9GYWNlLCBidXQgdGhleSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyB1bnRpbCAgICAqLwotICAvKiAgICB5b3UgYWN0aXZhdGUgaXQgdGhyb3VnaCBARlRfQWN0aXZhdGVfU2l6ZS4gIE9ubHkgb25lIHNpemUgY2FuIGJlICAgKi8KLSAgLyogICAgYWN0aXZhdGVkIGF0IGFueSBnaXZlbiB0aW1lIHBlciBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9TaXplUmVjIGZvciB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBmaWVsZHMgb2YgYSBnaXZlbiBzaXplICovCi0gIC8qICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2l6ZVJlY18qICBGVF9TaXplOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBgZ2x5cGggc2xvdCcuICBBIHNsb3QgaXMgYSBjb250YWluZXIgdGhhdCBjYW4gICovCi0gIC8qICAgIGhvbGQgYW55IG9mIHRoZSBnbHlwaHMgY29udGFpbmVkIGluIGl0cyBwYXJlbnQgZmFjZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gb3RoZXIgd29yZHMsIGVhY2ggdGltZSB5b3UgY2FsbCBARlRfTG9hZF9HbHlwaCBvciAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0NoYXIsIHRoZSBzbG90J3MgY29udGVudCBpcyBlcmFzZWQgYnkgdGhlIG5ldyBnbHlwaCBkYXRhLCAqLwotICAvKiAgICBpLmUuLCB0aGUgZ2x5cGgncyBtZXRyaWNzLCBpdHMgaW1hZ2UgKGJpdG1hcCBvciBvdXRsaW5lKSwgYW5kICAgICAgKi8KLSAgLyogICAgb3RoZXIgY29udHJvbCBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9HbHlwaFNsb3RSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGdseXBoIGZpZWxkcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaFNsb3RSZWNfKiAgRlRfR2x5cGhTbG90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhck1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBjaGFyYWN0ZXIgbWFwICh1c3VhbGx5IGFiYnJldmlhdGVkIHRvIGBjaGFybWFwJykuICBBICovCi0gIC8qICAgIGNoYXJtYXAgaXMgdXNlZCB0byB0cmFuc2xhdGUgY2hhcmFjdGVyIGNvZGVzIGluIGEgZ2l2ZW4gZW5jb2RpbmcgICAqLwotICAvKiAgICBpbnRvIGdseXBoIGluZGV4ZXMgZm9yIGl0cyBwYXJlbnQncyBmYWNlLiAgU29tZSBmb250IGZvcm1hdHMgbWF5ICAgKi8KLSAgLyogICAgcHJvdmlkZSBzZXZlcmFsIGNoYXJtYXBzIHBlciBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFYWNoIGZhY2Ugb2JqZWN0IG93bnMgemVybyBvciBtb3JlIGNoYXJtYXBzLCBidXQgb25seSBvbmUgb2YgdGhlbSAgKi8KLSAgLyogICAgY2FuIGJlIGBhY3RpdmUnLCBwcm92aWRpbmcgdGhlIGRhdGEgdXNlZCBieSBARlRfR2V0X0NoYXJfSW5kZXggb3IgICovCi0gIC8qICAgIEBGVF9Mb2FkX0NoYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNoYXJtYXBzIGluIGEgZmFjZSBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgICovCi0gIC8qICAgIGBmYWNlLT5udW1fY2hhcm1hcHMnIGFuZCBgZmFjZS0+Y2hhcm1hcHMnIGZpZWxkcyBvZiBARlRfRmFjZVJlYy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGN1cnJlbnRseSBhY3RpdmUgY2hhcm1hcCBpcyBhdmFpbGFibGUgYXMgYGZhY2UtPmNoYXJtYXAnLiAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgY2FsbCBARlRfU2V0X0NoYXJtYXAgdG8gY2hhbmdlIGl0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gYSBuZXcgZmFjZSBpcyBjcmVhdGVkIChlaXRoZXIgdGhyb3VnaCBARlRfTmV3X0ZhY2Ugb3IgICAgICAgICAqLwotICAvKiAgICBARlRfT3Blbl9GYWNlKSwgdGhlIGxpYnJhcnkgbG9va3MgZm9yIGEgVW5pY29kZSBjaGFybWFwIHdpdGhpbiAgICAgKi8KLSAgLyogICAgdGhlIGxpc3QgYW5kIGF1dG9tYXRpY2FsbHkgYWN0aXZhdGVzIGl0LiAgSWYgdGhlcmUgaXMgbm8gVW5pY29kZSAgICovCi0gIC8qICAgIGNoYXJtYXAsIEZyZWVUeXBlIGRvZXNuJ3Qgc2V0IGFuIGBhY3RpdmUnIGNoYXJtYXAuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFsc28+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBARlRfQ2hhck1hcFJlYyBmb3IgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgZ2l2ZW4gICAqLwotICAvKiAgICBjaGFyYWN0ZXIgbWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0NoYXJNYXBSZWNfKiAgRlRfQ2hhck1hcDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ19UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ci1sZXR0ZXIgdGFncyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcuICBJdCBpcyAqLwotICAvKiAgICB1c2VkIHRvIGRlZmluZSBgZW5jb2RpbmcnIGlkZW50aWZpZXJzIChzZWUgQEZUX0VuY29kaW5nKS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSBtYW55IDE2LWJpdCBjb21waWxlcnMgZG9uJ3QgbGlrZSAzMi1iaXQgZW51bWVyYXRpb25zLCB5b3UgICAgKi8KLSAgLyogICAgc2hvdWxkIHJlZGVmaW5lIHRoaXMgbWFjcm8gaW4gY2FzZSBvZiBwcm9ibGVtcyB0byBzb21ldGhpbmcgbGlrZSAgICovCi0gIC8qICAgIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2RlZmluZSBGVF9FTkNfVEFHKCB2YWx1ZSwgYSwgYiwgYywgZCApICB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvIGdldCBhIHNpbXBsZSBlbnVtZXJhdGlvbiB3aXRob3V0IGFzc2lnbmluZyBzcGVjaWFsIG51bWJlcnMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmbmRlZiBGVF9FTkNfVEFHCi0jZGVmaW5lIEZUX0VOQ19UQUcoIHZhbHVlLCBhLCBiLCBjLCBkICkgICAgICAgICBcCi0gICAgICAgICAgdmFsdWUgPSAoICggKEZUX1VJbnQzMikoYSkgPDwgMjQgKSB8ICBcCi0gICAgICAgICAgICAgICAgICAgICggKEZUX1VJbnQzMikoYikgPDwgMTYgKSB8ICBcCi0gICAgICAgICAgICAgICAgICAgICggKEZUX1VJbnQzMikoYykgPDwgIDggKSB8ICBcCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMikoZCkgICAgICAgICApCi0KLSNlbmRpZiAvKiBGVF9FTkNfVEFHICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0byBzcGVjaWZ5IGNoYXJhY3RlciBzZXRzIHN1cHBvcnRlZCBieSBjaGFybWFwcy4gICAgKi8KLSAgLyogICAgVXNlZCBpbiB0aGUgQEZUX1NlbGVjdF9DaGFybWFwIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzcGl0ZSB0aGUgbmFtZSwgdGhpcyBlbnVtZXJhdGlvbiBsaXN0cyBzcGVjaWZpYyBjaGFyYWN0ZXIgICAgICAgICovCi0gIC8qICAgIHJlcGVydG9yaWVzIChpLmUuLCBjaGFyc2V0cyksIGFuZCBub3QgdGV4dCBlbmNvZGluZyBtZXRob2RzIChlLmcuLCAqLwotICAvKiAgICBVVEYtOCwgVVRGLTE2LCBldGMuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE90aGVyIGVuY29kaW5ncyBtaWdodCBiZSBkZWZpbmVkIGluIHRoZSBmdXR1cmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBlbmNvZGluZyB2YWx1ZX4wIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1VOSUNPREUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBVbmljb2RlIGNoYXJhY3RlciBzZXQuICBUaGlzIHZhbHVlIGNvdmVycyBhbGwgdmVyc2lvbnMgb2YgICAgKi8KLSAgLyogICAgICB0aGUgVW5pY29kZSByZXBlcnRvaXJlLCBpbmNsdWRpbmcgQVNDSUkgYW5kIExhdGluLTEuICBNb3N0IGZvbnRzICovCi0gIC8qICAgICAgaW5jbHVkZSBhIFVuaWNvZGUgY2hhcm1hcCwgYnV0IG5vdCBhbGwgb2YgdGhlbS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYWNjZXNzIFVuaWNvZGUgdmFsdWUgVSsxRjAyOCAoYW5kICAgICovCi0gIC8qICAgICAgdGhlIGZvbnQgY29udGFpbnMgaXQpLCB1c2UgdmFsdWUgMHgxRjAyOCBhcyB0aGUgaW5wdXQgdmFsdWUgZm9yICAqLwotICAvKiAgICAgIEBGVF9HZXRfQ2hhcl9JbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX01TX1NZTUJPTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIE1pY3Jvc29mdCBTeW1ib2wgZW5jb2RpbmcsIHVzZWQgdG8gZW5jb2RlIG1hdGhlbWF0aWNhbCBzeW1ib2xzICAgKi8KLSAgLyogICAgICBhbmQgd2luZ2RpbmdzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9yZWNvbS5odG0nLCAgICAgICAgICAqLwotICAvKiAgICAgIGBodHRwOi8vd3d3Lmtvc3Rpcy5uZXQvY2hhcnNldHMvc3ltYm9sLmh0bScsIGFuZCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBgaHR0cDovL3d3dy5rb3N0aXMubmV0L2NoYXJzZXRzL3dpbmdkaW5nLmh0bScuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgZW5jb2RpbmcgdXNlcyBjaGFyYWN0ZXIgY29kZXMgZnJvbSB0aGUgUFVBIChQcml2YXRlIFVuaWNvZGUgKi8KLSAgLyogICAgICBBcmVhKSBpbiB0aGUgcmFuZ2UgVStGMDIwLVUrRjBGRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19TSklTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTaGlmdCBKSVMgZW5jb2RpbmcgZm9yIEphcGFuZXNlLiAgTW9yZSBpbmZvIGF0ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2hpZnRfSklTJy4gIFNlZSBub3RlIG9uICAgICAgICAgICAqLwotICAvKiAgICAgIG11bHRpLWJ5dGUgZW5jb2RpbmdzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1BSQyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIGVuY29kaW5nIHN5c3RlbXMgbWFpbmx5IGZvciBTaW1wbGlmaWVkIENoaW5lc2UgYXMgKi8KLSAgLyogICAgICB1c2VkIGluIFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hIChQUkMpLiAgVGhlIGVuY29kaW5nIGxheW91dCAgICovCi0gIC8qICAgICAgaXMgYmFzZWQgb24gR0J+MjMxMiBhbmQgaXRzIHN1cGVyc2V0cyBHQksgYW5kIEdCfjE4MDMwLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQklHNSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gYW4gZW5jb2Rpbmcgc3lzdGVtIGZvciBUcmFkaXRpb25hbCBDaGluZXNlIGFzICAgICAqLwotICAvKiAgICAgIHVzZWQgaW4gVGFpd2FuIGFuZCBIb25nIEtvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1dBTlNVTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIHRoZSBLb3JlYW4gZW5jb2Rpbmcgc3lzdGVtIGtub3duIGFzIEV4dGVuZGVkICAgICAgKi8KLSAgLyogICAgICBXYW5zdW5nIChNUyBXaW5kb3dzIGNvZGUgcGFnZSA5NDkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XaW5kb3dzQmVzdEZpdC9iZXN0Zml0OTQ5LnR4dCcuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19KT0hBQiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgS29yZWFuIHN0YW5kYXJkIGNoYXJhY3RlciBzZXQgKEtTfkMgNTYwMS0xOTkyKSwgd2hpY2ggICAgICAgICovCi0gIC8qICAgICAgY29ycmVzcG9uZHMgdG8gTVMgV2luZG93cyBjb2RlIHBhZ2UgMTM2MS4gIFRoaXMgY2hhcmFjdGVyIHNldCAgICAqLwotICAvKiAgICAgIGluY2x1ZGVzIGFsbCBwb3NzaWJsZSBIYW5ndWwgY2hhcmFjdGVyIGNvbWJpbmF0aW9ucy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIGEgTGF0aW4tMSBlbmNvZGluZyBhcyBkZWZpbmVkIGluIGEgVHlwZX4xICAgICAgICAgKi8KLSAgLyogICAgICBQb3N0U2NyaXB0IGZvbnQuICBJdCBpcyBsaW1pdGVkIHRvIDI1NiBjaGFyYWN0ZXIgY29kZXMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBZG9iZSBTdGFuZGFyZCBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZX4xLCBDRkYsIGFuZCAgICAgICAgICAgICovCi0gIC8qICAgICAgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQWRvYmUgRXhwZXJ0IGVuY29kaW5nLCBhcyBmb3VuZCBpbiBUeXBlfjEsIENGRiwgYW5kIE9wZW5UeXBlL0NGRiAqLwotICAvKiAgICAgIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIGEgY3VzdG9tIGVuY29kaW5nLCBhcyBmb3VuZCBpbiBUeXBlfjEsIENGRiwgYW5kICAgKi8KLSAgLyogICAgICBPcGVuVHlwZS9DRkYgZm9udHMuICBJdCBpcyBsaW1pdGVkIHRvIDI1NiBjaGFyYWN0ZXIgY29kZXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBcHBsZSByb21hbiBlbmNvZGluZy4gIE1hbnkgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGZvbnRzIGNvbnRhaW4gICovCi0gIC8qICAgICAgYSBjaGFybWFwIGZvciB0aGlzIDgtYml0IGVuY29kaW5nLCBzaW5jZSBvbGRlciB2ZXJzaW9ucyBvZiBNYWMgICAqLwotICAvKiAgICAgIE9TIGFyZSBhYmxlIHRvIHVzZSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX09MRF9MQVRJTl8yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgdmFsdWUgaXMgZGVwcmVjYXRlZCBhbmQgd2FzIG5laXRoZXIgdXNlZCBub3IgcmVwb3J0ZWQgYnkgICAgKi8KLSAgLyogICAgICBGcmVlVHlwZS4gIERvbid0IHVzZSBvciB0ZXN0IGZvciBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19TSklTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX1NKSVMuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19HQjIzMTIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX1BSQy4gIERlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19CSUc1IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX0JJRzUuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19XQU5TVU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX1dBTlNVTkcuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19KT0hBQiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX0pPSEFCLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgYXV0b21hdGljYWxseSBzeW50aGVzaXplcyBhIFVuaWNvZGUgY2hhcm1hcCAgICovCi0gIC8qICAgIGZvciBQb3N0U2NyaXB0IGZvbnRzLCB1c2luZyB0aGVpciBnbHlwaCBuYW1lIGRpY3Rpb25hcmllcy4gICAgICAgICAqLwotICAvKiAgICBIb3dldmVyLCBpdCBhbHNvIHJlcG9ydHMgdGhlIGVuY29kaW5ncyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlICAgKi8KLSAgLyogICAgZm9udCBmaWxlLCBmb3IgdGhlIGNhc2VzIHdoZW4gdGhleSBhcmUgbmVlZGVkLCB3aXRoIHRoZSBBZG9iZSAgICAgICovCi0gIC8qICAgIHZhbHVlcyBhcyB3ZWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTk9ORSBpcyBzZXQgYnkgdGhlIEJERiBhbmQgUENGIGRyaXZlcnMgaWYgdGhlIGNoYXJtYXAgICovCi0gIC8qICAgIGlzIG5laXRoZXIgVW5pY29kZSBub3IgSVNPLTg4NTktMSAob3RoZXJ3aXNlIGl0IGlzIHNldCB0byAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19VTklDT0RFKS4gIFVzZSBARlRfR2V0X0JERl9DaGFyc2V0X0lEIHRvIGZpbmQgb3V0ICAgICAgKi8KLSAgLyogICAgd2hpY2ggZW5jb2RpbmcgaXMgcmVhbGx5IHByZXNlbnQuICBJZiwgZm9yIGV4YW1wbGUsIHRoZSAgICAgICAgICAgICovCi0gIC8qICAgIGBjc19yZWdpc3RyeScgZmllbGQgaXMgYEtPSTgnIGFuZCB0aGUgYGNzX2VuY29kaW5nJyBmaWVsZCBpcyBgUicsICAqLwotICAvKiAgICB0aGUgZm9udCBpcyBlbmNvZGVkIGluIEtPSTgtUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX05PTkUgaXMgYWx3YXlzIHNldCAod2l0aCBhIHNpbmdsZSBleGNlcHRpb24pIGJ5IHRoZSAgICAqLwotICAvKiAgICB3aW5mb250cyBkcml2ZXIuICBVc2UgQEZUX0dldF9XaW5GTlRfSGVhZGVyIGFuZCBleGFtaW5lIHRoZSAgICAgICAgKi8KLSAgLyogICAgYGNoYXJzZXQnIGZpZWxkIG9mIHRoZSBARlRfV2luRk5UX0hlYWRlclJlYyBzdHJ1Y3R1cmUgdG8gZmluZCBvdXQgICovCi0gIC8qICAgIHdoaWNoIGVuY29kaW5nIGlzIHJlYWxseSBwcmVzZW50LiAgRm9yIGV4YW1wbGUsICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfV2luRk5UX0lEX0NQMTI1MSAoMjA0KSBtZWFucyBXaW5kb3dzIGNvZGUgcGFnZSAxMjUxIChmb3IgICAgICAgKi8KLSAgLyogICAgUnVzc2lhbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19OT05FIGlzIHNldCBpZiBgcGxhdGZvcm1faWQnIGlzIEBUVF9QTEFURk9STV9NQUNJTlRPU0ggKi8KLSAgLyogICAgYW5kIGBlbmNvZGluZ19pZCcgaXMgbm90IGBUVF9NQUNfSURfUk9NQU4nIChvdGhlcndpc2UgaXQgaXMgc2V0IHRvICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYHBsYXRmb3JtX2lkJyBpcyBAVFRfUExBVEZPUk1fTUFDSU5UT1NILCB1c2UgdGhlIGZ1bmN0aW9uICAgICAgICovCi0gIC8qICAgIEBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCB0byBxdWVyeSB0aGUgTWFjIGxhbmd1YWdlIElEIHRoYXQgbWF5ICAgICAqLwotICAvKiAgICBiZSBuZWVkZWQgdG8gYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBBcHBsZSBlbmNvZGluZyB2YXJpYW50cy4gIFNlZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9BUFBMRS9SZWFkbWUudHh0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gZ2V0IGFuIGlkZWEgaG93IHRvIGRvIHRoYXQuICBCYXNpY2FsbHksIGlmIHRoZSBsYW5ndWFnZSBJRCAgICAgICovCi0gIC8qICAgIGlzfjAsIGRvbid0IHVzZSBpdCwgb3RoZXJ3aXNlIHN1YnRyYWN0IDEgZnJvbSB0aGUgbGFuZ3VhZ2UgSUQuICAgICAqLwotICAvKiAgICBUaGVuIGV4YW1pbmUgYGVuY29kaW5nX2lkJy4gIElmLCBmb3IgZXhhbXBsZSwgYGVuY29kaW5nX2lkJyBpcyAgICAgKi8KLSAgLyogICAgYFRUX01BQ19JRF9ST01BTicgYW5kIHRoZSBsYW5ndWFnZSBJRCAobWludXN+MSkgaXMgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBUVF9NQUNfTEFOR0lEX0dSRUVLJywgaXQgaXMgdGhlIEdyZWVrIGVuY29kaW5nLCBub3QgUm9tYW4uICAgICAgICAqLwotICAvKiAgICBgVFRfTUFDX0lEX0FSQUJJQycgd2l0aCBgVFRfTUFDX0xBTkdJRF9GQVJTSScgbWVhbnMgdGhlIEZhcnNpICAgICAgKi8KLSAgLyogICAgdmFyaWFudCB0aGUgQXJhYmljIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX0VuY29kaW5nXwotICB7Ci0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfTk9ORSwgMCwgMCwgMCwgMCApLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfTVNfU1lNQk9MLCAncycsICd5JywgJ20nLCAnYicgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19VTklDT0RFLCAgICd1JywgJ24nLCAnaScsICdjJyApLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfU0pJUywgICAgJ3MnLCAnaicsICdpJywgJ3MnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfUFJDLCAgICAgJ2cnLCAnYicsICcgJywgJyAnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQklHNSwgICAgJ2InLCAnaScsICdnJywgJzUnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfV0FOU1VORywgJ3cnLCAnYScsICduJywgJ3MnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfSk9IQUIsICAgJ2onLCAnbycsICdoJywgJ2EnICksCi0KLSAgICAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotICAgIEZUX0VOQ09ESU5HX0dCMjMxMiAgICAgPSBGVF9FTkNPRElOR19QUkMsCi0gICAgRlRfRU5DT0RJTkdfTVNfU0pJUyAgICA9IEZUX0VOQ09ESU5HX1NKSVMsCi0gICAgRlRfRU5DT0RJTkdfTVNfR0IyMzEyICA9IEZUX0VOQ09ESU5HX1BSQywKLSAgICBGVF9FTkNPRElOR19NU19CSUc1ICAgID0gRlRfRU5DT0RJTkdfQklHNSwKLSAgICBGVF9FTkNPRElOR19NU19XQU5TVU5HID0gRlRfRU5DT0RJTkdfV0FOU1VORywKLSAgICBGVF9FTkNPRElOR19NU19KT0hBQiAgID0gRlRfRU5DT0RJTkdfSk9IQUIsCi0KLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRCwgJ0EnLCAnRCcsICdPJywgJ0InICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJULCAgICdBJywgJ0QnLCAnQicsICdFJyApLAotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTSwgICAnQScsICdEJywgJ0InLCAnQycgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BRE9CRV9MQVRJTl8xLCAgJ2wnLCAnYScsICd0JywgJzEnICksCi0KLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19PTERfTEFUSU5fMiwgJ2wnLCAnYScsICd0JywgJzInICksCi0KLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgJ2EnLCAncicsICdtJywgJ24nICkKLQotICB9IEZUX0VuY29kaW5nOwotCi0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX0VuY29kaW5nJyAqLwotICAvKiB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X2VuY29kaW5nX25vbmUgICAgICAgICAgICBGVF9FTkNPRElOR19OT05FCi0jZGVmaW5lIGZ0X2VuY29kaW5nX3VuaWNvZGUgICAgICAgICBGVF9FTkNPRElOR19VTklDT0RFCi0jZGVmaW5lIGZ0X2VuY29kaW5nX3N5bWJvbCAgICAgICAgICBGVF9FTkNPRElOR19NU19TWU1CT0wKLSNkZWZpbmUgZnRfZW5jb2RpbmdfbGF0aW5fMSAgICAgICAgIEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzEKLSNkZWZpbmUgZnRfZW5jb2RpbmdfbGF0aW5fMiAgICAgICAgIEZUX0VOQ09ESU5HX09MRF9MQVRJTl8yCi0jZGVmaW5lIGZ0X2VuY29kaW5nX3NqaXMgICAgICAgICAgICBGVF9FTkNPRElOR19TSklTCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2diMjMxMiAgICAgICAgICBGVF9FTkNPRElOR19QUkMKLSNkZWZpbmUgZnRfZW5jb2RpbmdfYmlnNSAgICAgICAgICAgIEZUX0VOQ09ESU5HX0JJRzUKLSNkZWZpbmUgZnRfZW5jb2Rpbmdfd2Fuc3VuZyAgICAgICAgIEZUX0VOQ09ESU5HX1dBTlNVTkcKLSNkZWZpbmUgZnRfZW5jb2Rpbmdfam9oYWIgICAgICAgICAgIEZUX0VOQ09ESU5HX0pPSEFCCi0KLSNkZWZpbmUgZnRfZW5jb2RpbmdfYWRvYmVfc3RhbmRhcmQgIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJECi0jZGVmaW5lIGZ0X2VuY29kaW5nX2Fkb2JlX2V4cGVydCAgICBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQKLSNkZWZpbmUgZnRfZW5jb2RpbmdfYWRvYmVfY3VzdG9tICAgIEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTQotI2RlZmluZSBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiAgICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NoYXJNYXBSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBiYXNlIGNoYXJtYXAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW5jb2RpbmcgICAgOjogQW4gQEZUX0VuY29kaW5nIHRhZyBpZGVudGlmeWluZyB0aGUgY2hhcm1hcC4gIFVzZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoaXMgd2l0aCBARlRfU2VsZWN0X0NoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGxhdGZvcm1faWQgOjogQW4gSUQgbnVtYmVyIGRlc2NyaWJpbmcgdGhlIHBsYXRmb3JtIGZvciB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBlbmNvZGluZyBJRC4gIFRoaXMgY29tZXMgZGlyZWN0bHkgZnJvbSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBhbmQgZ2V0cyBlbXVsYXRlZCBmb3IgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgb3RoZXIgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZ19pZCA6OiBBIHBsYXRmb3JtIHNwZWNpZmljIGVuY29kaW5nIG51bWJlci4gIFRoaXMgYWxzbyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY29tZXMgZnJvbSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBhbmQgZ2V0cyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGVtdWxhdGVkIHNpbWlsYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0NoYXJNYXBSZWNfCi0gIHsKLSAgICBGVF9GYWNlICAgICAgZmFjZTsKLSAgICBGVF9FbmNvZGluZyAgZW5jb2Rpbmc7Ci0gICAgRlRfVVNob3J0ICAgIHBsYXRmb3JtX2lkOwotICAgIEZUX1VTaG9ydCAgICBlbmNvZGluZ19pZDsKLQotICB9IEZUX0NoYXJNYXBSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgQiBBIFMgRSAgIE8gQiBKIEUgQyBUICAgQyBMIEEgUyBTIEUgUyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX0ZhY2VfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSB0aGF0IG1vZGVscyAqLwotICAvKiAgICB0aGUgcHJpdmF0ZSBkYXRhIG9mIGEgZ2l2ZW4gQEZUX0ZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIG1pZ2h0IGNoYW5nZSBiZXR3ZWVuIHJlbGVhc2VzIG9mIEZyZWVUeXBlfjIgYW5kIGlzICAqLwotICAvKiAgICBub3QgZ2VuZXJhbGx5IGF2YWlsYWJsZSB0byBjbGllbnQgYXBwbGljYXRpb25zLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0ZhY2VfSW50ZXJuYWxSZWNfKiAgRlRfRmFjZV9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3QgZmFjZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIGZhY2Ugb2JqZWN0IG1vZGVscyBhICAgICAgICAqLwotICAvKiAgICB0eXBlZmFjZSBpbiBhIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZmFjZXMgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZmFjZXMgaW4gdGhlIGZvbnQgZmlsZS4gIFNvbWUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZvcm1hdHMgY2FuIGhhdmUgbXVsdGlwbGUgZmFjZXMgaW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCAgICAgICAgICA6OiBUaGlzIGZpZWxkIGhvbGRzIHR3byBkaWZmZXJlbnQgdmFsdWVzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0cyAwLTE1IGFyZSB0aGUgaW5kZXggb2YgdGhlIGZhY2UgaW4gdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZSAoc3RhcnRpbmcgd2l0aCB2YWx1ZX4wKS4gIFRoZXkgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc2V0IHRvfjAgaWYgdGhlcmUgaXMgb25seSBvbmUgZmFjZSBpbiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzIDE2LTMwIGFyZSByZWxldmFudCB0byBHWCBhbmQgT3BlblR5cGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9uIGZvbnRzIG9ubHksIGhvbGRpbmcgdGhlIG5hbWVkICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGluZGV4IGZvciB0aGUgY3VycmVudCBmYWNlIGluZGV4ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnRpbmcgd2l0aCB2YWx1ZX4xOyB2YWx1ZX4wIGluZGljYXRlcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBhY2Nlc3Mgd2l0aG91dCBhIG5hbWVkIGluc3RhbmNlKS4gIEZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi12YXJpYXRpb24gZm9udHMsIGJpdHMgMTYtMzAgYXJlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVkLiAgSWYgd2UgaGF2ZSB0aGUgdGhpcmQgbmFtZWQgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Ugb2YgZmFjZX40LCBzYXksIGBmYWNlX2luZGV4JyBpcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byAweDAwMDMwMDA0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDMxIGlzIGFsd2F5cyB6ZXJvICh0aGlzIGlzLCAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmYWNlX2luZGV4JyBpcyBhbHdheXMgYSBwb3NpdGl2ZSB2YWx1ZSkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfZmxhZ3MgICAgICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHRoYXQgZ2l2ZSBpbXBvcnRhbnQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWNlOyBzZWUgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfRkFDRV9GTEFHX1hYWCBmb3IgdGhlIGRldGFpbHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHlsZV9mbGFncyAgICAgICAgIDo6IFRoZSBsb3dlciAxNn5iaXRzIGNvbnRhaW4gYSBzZXQgb2YgYml0ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyBpbmRpY2F0aW5nIHRoZSBzdHlsZSBvZiB0aGUgZmFjZTsgc2VlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1NUWUxFX0ZMQUdfWFhYIGZvciB0aGUgZGV0YWlscy4gIEJpdHMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LTMwIGhvbGQgdGhlIG51bWJlciBvZiBuYW1lZCBpbnN0YW5jZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGZhY2UgaWYgd2UgaGF2ZSBhICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ggb3IgT3BlblR5cGUgdmFyaWF0aW9uIChzdWIpZm9udC4gIEJpdCAzMSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFsd2F5cyB6ZXJvICh0aGlzIGlzLCBgc3R5bGVfZmxhZ3MnIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgYSBwb3NpdGl2ZSB2YWx1ZSkuICBOb3RlIHRoYXQgYSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9uIGZvbnQgaGFzIGFsd2F5cyBhdCBsZWFzdCBvbmUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkIGluc3RhbmNlLCBuYW1lbHkgdGhlIGRlZmF1bHQgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmYWNlLiAgSWYgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlIGlzIHNjYWxhYmxlIGFuZCBoYXMgc2JpdHMgKHNlZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYG51bV9maXhlZF9zaXplcycpLCBpdCBpcyBzZXQgdG8gdGhlIG51bWJlciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG91dGxpbmUgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIENJRC1rZXllZCBmb250cyAobm90IGluIGFuIFNGTlQgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIpIHRoaXMgdmFsdWUgZ2l2ZXMgdGhlIGhpZ2hlc3QgQ0lEICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYW1pbHlfbmFtZSAgICAgICAgIDo6IFRoZSBmYWNlJ3MgZmFtaWx5IG5hbWUuICBUaGlzIGlzIGFuIEFTQ0lJICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIHVzdWFsbHkgaW4gRW5nbGlzaCwgdGhhdCBkZXNjcmliZXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGVmYWNlJ3MgZmFtaWx5IChsaWtlIGBUaW1lcyBOZXcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbWFuJywgYEJvZG9uaScsIGBHYXJhbW9uZCcsIGV0YykuICBUaGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIGxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciB1c2VkIHRvIGxpc3QgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHMuICBTb21lIGZvcm1hdHMgKFRydWVUeXBlICYgT3BlblR5cGUpICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGUgbG9jYWxpemVkIGFuZCBVbmljb2RlIHZlcnNpb25zIG9mICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0cmluZy4gIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IHNwZWNpZmljIGludGVyZmFjZSB0byBhY2Nlc3MgdGhlbS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBOVUxMIChlLmcuLCBpbiBmb250cyBlbWJlZGRlZCBpbiBhICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBQREYgZmlsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGNhc2UgdGhlIGZvbnQgZG9lc24ndCBwcm92aWRlIGEgc3BlY2lmaWMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgbmFtZSBlbnRyeSwgRnJlZVR5cGUgdHJpZXMgdG8gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGhlc2l6ZSBvbmUsIGRlcml2aW5nIGl0IGZyb20gb3RoZXIgbmFtZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0eWxlX25hbWUgICAgICAgICAgOjogVGhlIGZhY2UncyBzdHlsZSBuYW1lLiAgVGhpcyBpcyBhbiBBU0NJSSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgdXN1YWxseSBpbiBFbmdsaXNoLCB0aGF0IGRlc2NyaWJlcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHlwZWZhY2UncyBzdHlsZSAobGlrZSBgSXRhbGljJywgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJvbGQnLCBgQ29uZGVuc2VkJywgZXRjKS4gIE5vdCBhbGwgZm9udCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMgcHJvdmlkZSBhIHN0eWxlIG5hbWUsIHNvIHRoaXMgZmllbGQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvcHRpb25hbCwgYW5kIGNhbiBiZSBzZXQgdG8gTlVMTC4gIEFzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGBmYW1pbHlfbmFtZScsIHNvbWUgZm9ybWF0cyBwcm92aWRlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsaXplZCBhbmQgVW5pY29kZSB2ZXJzaW9ucyBvZiB0aGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuICBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUgZm9ybWF0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGVtLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2ZpeGVkX3NpemVzICAgICA6OiBUaGUgbnVtYmVyIG9mIGJpdG1hcCBzdHJpa2VzIGluIHRoZSBmYWNlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbiBpZiB0aGUgZmFjZSBpcyBzY2FsYWJsZSwgdGhlcmUgbWlnaHQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIGJlIGJpdG1hcCBzdHJpa2VzLCB3aGljaCBhcmUgY2FsbGVkICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgc2JpdHMnIGluIHRoYXQgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhdmFpbGFibGVfc2l6ZXMgICAgIDo6IEFuIGFycmF5IG9mIEBGVF9CaXRtYXBfU2l6ZSBmb3IgYWxsIGJpdG1hcCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpa2VzIGluIHRoZSBmYWNlLiAgSXQgaXMgc2V0IHRvIE5VTEwgaWYgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gYml0bWFwIHN0cmlrZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgRnJlZVR5cGUgdHJpZXMgdG8gc2FuaXRpemUgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlIGRhdGEgc2luY2UgdGhleSBhcmUgc29tZXRpbWVzIHNsb3BweSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGluY29ycmVjdCwgYnV0IHRoaXMgY2FuIGVhc2lseSBmYWlsLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jaGFybWFwcyAgICAgICAgOjogVGhlIG51bWJlciBvZiBjaGFybWFwcyBpbiB0aGUgZmFjZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcHMgICAgICAgICAgICA6OiBBbiBhcnJheSBvZiB0aGUgY2hhcm1hcHMgb2YgdGhlIGZhY2UuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZW5lcmljICAgICAgICAgICAgIDo6IEEgZmllbGQgcmVzZXJ2ZWQgZm9yIGNsaWVudCB1c2VzLiAgU2VlIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR2VuZXJpYyB0eXBlIGRlc2NyaXB0aW9uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYm94ICAgICAgICAgICAgICAgIDo6IFRoZSBmb250IGJvdW5kaW5nIGJveC4gIENvb3JkaW5hdGVzIGFyZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cyAoc2VlICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYHVuaXRzX3Blcl9FTScpLiAgVGhlIGJveCBpcyBsYXJnZSBlbm91Z2ggICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvbnRhaW4gYW55IGdseXBoIGZyb20gdGhlIGZvbnQuICBUaHVzLCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYmJveC55TWF4JyBjYW4gYmUgc2VlbiBhcyB0aGUgYG1heGltdW0gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjZW5kZXInLCBhbmQgYGJib3gueU1pbicgYXMgdGhlIGBtaW5pbXVtICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRlcicuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgYm91bmRpbmcgYm94IG1pZ2h0IGJlIG9mZiBieSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAoYXQgbGVhc3QpIG9uZSBwaXhlbCBmb3IgaGludGVkIGZvbnRzLiAgU2VlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1NpemVfTWV0cmljcyBmb3IgZnVydGhlciBkaXNjdXNzaW9uLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdW5pdHNfcGVyX0VNICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGZvbnQgdW5pdHMgcGVyIEVNIHNxdWFyZSBmb3IgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmYWNlLiAgVGhpcyBpcyB0eXBpY2FsbHkgMjA0OCBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGZvbnRzLCBhbmQgMTAwMCBmb3IgVHlwZX4xIGZvbnRzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc2NlbmRlciAgICAgICAgICAgIDo6IFRoZSB0eXBvZ3JhcGhpYyBhc2NlbmRlciBvZiB0aGUgZmFjZSwgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gIEZvciBmb250IGZvcm1hdHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGhhdmluZyB0aGlzIGluZm9ybWF0aW9uLCBpdCBpcyBzZXQgdG8gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBiYm94LnlNYXgnLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZXNjZW5kZXIgICAgICAgICAgIDo6IFRoZSB0eXBvZ3JhcGhpYyBkZXNjZW5kZXIgb2YgdGhlIGZhY2UsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gIEZvciBmb250IGZvcm1hdHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGhhdmluZyB0aGlzIGluZm9ybWF0aW9uLCBpdCBpcyBzZXQgdG8gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBiYm94LnlNaW4nLiAgTm90ZSB0aGF0IHRoaXMgZmllbGQgaXMgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBmb3IgdmFsdWVzIGJlbG93IHRoZSBiYXNlbGluZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICAgICAgICAgICAgICA6OiBUaGlzIHZhbHVlIGlzIHRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgYmFzZWxpbmVzLCAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzLiAgSXQgaXMgYWx3YXlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZS4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0aGUgZ2xvYmFsIGdseXBoIGhlaWdodCwgdXNlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFzY2VuZGVyIC0gZGVzY2VuZGVyJy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2FkdmFuY2Vfd2lkdGggICA6OiBUaGUgbWF4aW11bSBhZHZhbmNlIHdpZHRoLCBpbiBmb250IHVuaXRzLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCBnbHlwaHMgaW4gdGhpcyBmYWNlLiAgVGhpcyBjYW4gYmUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gbWFrZSB3b3JkIHdyYXBwaW5nIGNvbXB1dGF0aW9ucyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0ZXIuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2FkdmFuY2VfaGVpZ2h0ICA6OiBUaGUgbWF4aW11bSBhZHZhbmNlIGhlaWdodCwgaW4gZm9udCB1bml0cywgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCBnbHlwaHMgaW4gdGhpcyBmYWNlLiAgVGhpcyBpcyBvbmx5ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW50IGZvciB2ZXJ0aWNhbCBsYXlvdXRzLCBhbmQgaXMgc2V0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgaGVpZ2h0JyBmb3IgZm9udHMgdGhhdCBkbyBub3QgcHJvdmlkZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgbWV0cmljcy4gIE9ubHkgcmVsZXZhbnQgZm9yICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVuZGVybGluZV9wb3NpdGlvbiAgOjogVGhlIHBvc2l0aW9uLCBpbiBmb250IHVuaXRzLCBvZiB0aGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSBsaW5lIGZvciB0aGlzIGZhY2UuICBJdCBpcyB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgb2YgdGhlIHVuZGVybGluaW5nIHN0ZW0uICBPbmx5ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdW5kZXJsaW5lX3RoaWNrbmVzcyA6OiBUaGUgdGhpY2tuZXNzLCBpbiBmb250IHVuaXRzLCBvZiB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lIGZvciB0aGlzIGZhY2UuICBPbmx5IHJlbGV2YW50IGZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgICAgICAgICAgICAgOjogVGhlIGZhY2UncyBhc3NvY2lhdGVkIGdseXBoIHNsb3QocykuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgICAgICAgICAgICA6OiBUaGUgY3VycmVudCBhY3RpdmUgc2l6ZSBmb3IgdGhpcyBmYWNlLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFybWFwICAgICAgICAgICAgIDo6IFRoZSBjdXJyZW50IGFjdGl2ZSBjaGFybWFwIGZvciB0aGlzIGZhY2UuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaWVsZHMgbWF5IGJlIGNoYW5nZWQgYWZ0ZXIgYSBjYWxsIHRvIEBGVF9BdHRhY2hfRmlsZSBvciAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0F0dGFjaF9TdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgKi8KLSAgLyogICAgY2FuIGNoYW5nZSBhZnRlciBhIGNhbGwgdG8gQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIChhbmQgICAgICovCi0gIC8qICAgIGZyaWVuZHMpIGlmIHRoZSBmb250IGNvbnRhaW5zIGFuIGBNVkFSJyB0YWJsZTogYGFzY2VuZGVyJywgICAgICAgICAqLwotICAvKiAgICBgZGVzY2VuZGVyJywgYGhlaWdodCcsIGB1bmRlcmxpbmVfcG9zaXRpb24nLCBhbmQgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYHVuZGVybGluZV90aGlja25lc3MnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfRmFjZVJlY18KLSAgewotICAgIEZUX0xvbmcgICAgICAgICAgIG51bV9mYWNlczsKLSAgICBGVF9Mb25nICAgICAgICAgICBmYWNlX2luZGV4OwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgZmFjZV9mbGFnczsKLSAgICBGVF9Mb25nICAgICAgICAgICBzdHlsZV9mbGFnczsKLQotICAgIEZUX0xvbmcgICAgICAgICAgIG51bV9nbHlwaHM7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgICBmYW1pbHlfbmFtZTsKLSAgICBGVF9TdHJpbmcqICAgICAgICBzdHlsZV9uYW1lOwotCi0gICAgRlRfSW50ICAgICAgICAgICAgbnVtX2ZpeGVkX3NpemVzOwotICAgIEZUX0JpdG1hcF9TaXplKiAgIGF2YWlsYWJsZV9zaXplczsKLQotICAgIEZUX0ludCAgICAgICAgICAgIG51bV9jaGFybWFwczsKLSAgICBGVF9DaGFyTWFwKiAgICAgICBjaGFybWFwczsKLQotICAgIEZUX0dlbmVyaWMgICAgICAgIGdlbmVyaWM7Ci0KLSAgICAvKiMgVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIChkb3duIHRvIGB1bmRlcmxpbmVfdGhpY2tuZXNzJykgKi8KLSAgICAvKiMgYXJlIG9ubHkgcmVsZXZhbnQgdG8gc2NhbGFibGUgb3V0bGluZXM7IGNmLiBARlRfQml0bWFwX1NpemUgICAgKi8KLSAgICAvKiMgZm9yIGJpdG1hcCBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9CQm94ICAgICAgICAgICBiYm94OwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgdW5pdHNfcGVyX0VNOwotICAgIEZUX1Nob3J0ICAgICAgICAgIGFzY2VuZGVyOwotICAgIEZUX1Nob3J0ICAgICAgICAgIGRlc2NlbmRlcjsKLSAgICBGVF9TaG9ydCAgICAgICAgICBoZWlnaHQ7Ci0KLSAgICBGVF9TaG9ydCAgICAgICAgICBtYXhfYWR2YW5jZV93aWR0aDsKLSAgICBGVF9TaG9ydCAgICAgICAgICBtYXhfYWR2YW5jZV9oZWlnaHQ7Ci0KLSAgICBGVF9TaG9ydCAgICAgICAgICB1bmRlcmxpbmVfcG9zaXRpb247Ci0gICAgRlRfU2hvcnQgICAgICAgICAgdW5kZXJsaW5lX3RoaWNrbmVzczsKLQotICAgIEZUX0dseXBoU2xvdCAgICAgIGdseXBoOwotICAgIEZUX1NpemUgICAgICAgICAgIHNpemU7Ci0gICAgRlRfQ2hhck1hcCAgICAgICAgY2hhcm1hcDsKLQotICAgIC8qQHByaXZhdGUgYmVnaW4gKi8KLQotICAgIEZUX0RyaXZlciAgICAgICAgIGRyaXZlcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnk7Ci0gICAgRlRfU3RyZWFtICAgICAgICAgc3RyZWFtOwotCi0gICAgRlRfTGlzdFJlYyAgICAgICAgc2l6ZXNfbGlzdDsKLQotICAgIEZUX0dlbmVyaWMgICAgICAgIGF1dG9oaW50OyAgIC8qIGZhY2Utc3BlY2lmaWMgYXV0by1oaW50ZXIgZGF0YSAqLwotICAgIHZvaWQqICAgICAgICAgICAgIGV4dGVuc2lvbnM7IC8qIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfRmFjZV9JbnRlcm5hbCAgaW50ZXJuYWw7Ci0KLSAgICAvKkBwcml2YXRlIGVuZCAqLwotCi0gIH0gRlRfRmFjZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgYGZhY2VfZmxhZ3MnIGZpZWxkIG9mIHRoZSAgICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZVJlYyBzdHJ1Y3R1cmUuICBUaGV5IGluZm9ybSBjbGllbnQgYXBwbGljYXRpb25zIG9mICAgICAgICAgKi8KLSAgLyogICAgcHJvcGVydGllcyBvZiB0aGUgY29ycmVzcG9uZGluZyBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1NDQUxBQkxFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZhY2UgY29udGFpbnMgb3V0bGluZSBnbHlwaHMuICBOb3RlIHRoYXQgYSBmYWNlIGNhbiBjb250YWluICAqLwotICAvKiAgICAgIGJpdG1hcCBzdHJpa2VzIGFsc28sIGkuZS4sIGEgZmFjZSBjYW4gaGF2ZSBib3RoIHRoaXMgZmxhZyBhbmQgICAgKi8KLSAgLyogICAgICBARlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBjb250YWlucyBiaXRtYXAgc3RyaWtlcy4gIFNlZSBhbHNvIHRoZSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYG51bV9maXhlZF9zaXplcycgYW5kIGBhdmFpbGFibGVfc2l6ZXMnIGZpZWxkcyBvZiBARlRfRmFjZVJlYy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZhY2UgY29udGFpbnMgZml4ZWQtd2lkdGggY2hhcmFjdGVycyAobGlrZSBDb3VyaWVyLCBMdWNpZGEsICAqLwotICAvKiAgICAgIE1vbm9UeXBlLCBldGMuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19TRk5UIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIHVzZXMgdGhlIFNGTlQgc3RvcmFnZSBzY2hlbWUuICBGb3Igbm93LCB0aGlzIG1lYW5zICAgICAgKi8KLSAgLyogICAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBjb250YWlucyBob3Jpem9udGFsIGdseXBoIG1ldHJpY3MuICBUaGlzIHNob3VsZCBiZSBzZXQgICovCi0gIC8qICAgICAgZm9yIGFsbCBjb21tb24gZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZhY2UgY29udGFpbnMgdmVydGljYWwgZ2x5cGggbWV0cmljcy4gIFRoaXMgaXMgb25seSAgICAgICAgICAqLwotICAvKiAgICAgIGF2YWlsYWJsZSBpbiBzb21lIGZvcm1hdHMsIG5vdCBhbGwgb2YgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19LRVJOSU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIGNvbnRhaW5zIGtlcm5pbmcgaW5mb3JtYXRpb24uICBJZiBzZXQsIHRoZSBrZXJuaW5nICAgICAgKi8KLSAgLyogICAgICBkaXN0YW5jZSBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBARlRfR2V0X0tlcm5pbmcuICAgICovCi0gIC8qICAgICAgT3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIHRoZSB2ZWN0b3IgKDAsMCkuICBOb3RlICAgICAqLwotICAvKiAgICAgIHRoYXQgRnJlZVR5cGUgZG9lc24ndCBoYW5kbGUga2VybmluZyBkYXRhIGZyb20gdGhlIFNGTlQgYEdQT1MnICAgKi8KLSAgLyogICAgICB0YWJsZSAoYXMgcHJlc2VudCBpbiBtYW55IE9wZW5UeXBlIGZvbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUSElTIEZMQUcgSVMgREVQUkVDQVRFRC4gIERPIE5PVCBVU0UgT1IgVEVTVCBJVC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBjb250YWlucyBtdWx0aXBsZSBtYXN0ZXJzIGFuZCBpcyBjYXBhYmxlIG9mICAgICAgICAgICAgICovCi0gIC8qICAgICAgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHRoZW0uICBTdXBwb3J0ZWQgZm9ybWF0cyBhcmUgQWRvYmUgTU0sICAgICAqLwotICAvKiAgICAgIFRydWVUeXBlIEdYLCBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2VlIHRoZSBtdWx0aXBsZS1tYXN0ZXJzIHNwZWNpZmljIEFQSSBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZhY2UgY29udGFpbnMgZ2x5cGggbmFtZXMsIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgICAgICAqLwotICAvKiAgICAgIEBGVF9HZXRfR2x5cGhfTmFtZS4gIE5vdGUgdGhhdCBzb21lIFRydWVUeXBlIGZvbnRzIGNvbnRhaW4gICAgICAgKi8KLSAgLyogICAgICBicm9rZW4gZ2x5cGggbmFtZSB0YWJsZXMuICBVc2UgdGhlIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0hhc19QU19HbHlwaF9OYW1lcyB3aGVuIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVXNlZCBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIHRvIGluZGljYXRlIHRoYXQgYSBmYWNlJ3Mgc3RyZWFtIHdhcyAqLwotICAvKiAgICAgIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYXBwbGljYXRpb24gYW5kIHNob3VsZCBub3QgYmUgZGVzdHJveWVkICAgKi8KLSAgLyogICAgICB3aGVuIEBGVF9Eb25lX0ZhY2UgaXMgY2FsbGVkLiAgRG9uJ3QgcmVhZCBvciB0ZXN0IHRoaXMgZmxhZy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfSElOVEVSIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZm9udCBkcml2ZXIgaGFzIGEgaGludGluZyBtYWNoaW5lIG9mIGl0cyBvd24uICBGb3IgZXhhbXBsZSwgICovCi0gIC8qICAgICAgd2l0aCBUcnVlVHlwZSBmb250cywgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIGRhdGEgZnJvbSB0aGUgU0ZOVCAgICAqLwotICAvKiAgICAgIGBnYXNwJyB0YWJsZSBvbmx5IGlmIHRoZSBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyBlbmdpbmUgKHdpdGggICAgKi8KLSAgLyogICAgICB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIpIGlzIGF2YWlsYWJsZSBhbmQgYWN0aXZlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBpcyBDSUQta2V5ZWQuICBJbiB0aGF0IGNhc2UsIHRoZSBmYWNlIGlzIG5vdCBhY2Nlc3NlZCAgICovCi0gIC8qICAgICAgYnkgZ2x5cGggaW5kaWNlcyBidXQgYnkgQ0lEIHZhbHVlcy4gIEZvciBzdWJzZXR0ZWQgQ0lELWtleWVkICAgICAqLwotICAvKiAgICAgIGZvbnRzIHRoaXMgaGFzIHRoZSBjb25zZXF1ZW5jZSB0aGF0IG5vdCBhbGwgaW5kZXggdmFsdWVzIGFyZSBhICAgKi8KLSAgLyogICAgICB2YWxpZCBhcmd1bWVudCB0byBARlRfTG9hZF9HbHlwaC4gIE9ubHkgdGhlIENJRCB2YWx1ZXMgZm9yIHdoaWNoICovCi0gIC8qICAgICAgY29ycmVzcG9uZGluZyBnbHlwaHMgaW4gdGhlIHN1YnNldHRlZCBmb250IGV4aXN0IG1ha2UgICAgICAgICAgICAqLwotICAvKiAgICAgIGBGVF9Mb2FkX0dseXBoJyByZXR1cm4gc3VjY2Vzc2Z1bGx5OyBpbiBhbGwgb3RoZXIgY2FzZXMgeW91IGdldCAgKi8KLSAgLyogICAgICBhbiBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIE5vdGUgdGhhdCBDSUQta2V5ZWQgZm9udHMgdGhhdCBhcmUgaW4gYW4gU0ZOVCB3cmFwcGVyICh0aGlzIGlzLCAgKi8KLSAgLyogICAgICBhbGwgT3BlblR5cGUvQ0ZGIGZvbnRzKSBkb24ndCBoYXZlIHRoaXMgZmxhZyBzZXQgc2luY2UgdGhlICAgICAgICovCi0gIC8qICAgICAgZ2x5cGhzIGFyZSBhY2Nlc3NlZCBpbiB0aGUgbm9ybWFsIHdheSAodXNpbmcgY29udGlndW91cyAgICAgICAgICAqLwotICAvKiAgICAgIGluZGljZXMpOyB0aGUgYENJRC1uZXNzJyBpc24ndCB2aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19UUklDS1kgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIGlzIGB0cmlja3knLCB0aGlzIGlzLCBpdCBhbHdheXMgbmVlZHMgdGhlIGZvbnQgZm9ybWF0J3MgKi8KLSAgLyogICAgICBuYXRpdmUgaGludGluZyBlbmdpbmUgdG8gZ2V0IGEgcmVhc29uYWJsZSByZXN1bHQuICBBIHR5cGljYWwgICAgICovCi0gIC8qICAgICAgZXhhbXBsZSBpcyB0aGUgb2xkIENoaW5lc2UgZm9udCBgbWluZ2xpLnR0ZicgKGJ1dCBub3QgICAgICAgICAgICAqLwotICAvKiAgICAgIGBtaW5nbGl1LnR0YycpIHRoYXQgdXNlcyBUcnVlVHlwZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgdG8gbW92ZSAgKi8KLSAgLyogICAgICBhbmQgc2NhbGUgYWxsIG9mIGl0cyBzdWJnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhdXRvLWhpbnQgc3VjaCBmb250cyB1c2luZyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfTE9BRF9GT1JDRV9BVVRPSElOVDsgaXQgd2lsbCBhbHNvIGlnbm9yZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0xPQURfTk9fSElOVElORy4gIFlvdSBoYXZlIHRvIHNldCBib3RoIEBGVF9MT0FEX05PX0hJTlRJTkcgICAqLwotICAvKiAgICAgIGFuZCBARlRfTE9BRF9OT19BVVRPSElOVCB0byByZWFsbHkgZGlzYWJsZSBoaW50aW5nOyBob3dldmVyLCB5b3UgKi8KLSAgLyogICAgICBwcm9iYWJseSBuZXZlciB3YW50IHRoaXMgZXhjZXB0IGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEN1cnJlbnRseSwgdGhlcmUgYXJlIGFib3V0IGEgZG96ZW4gVHJ1ZVR5cGUgZm9udHMgaW4gdGhlIGxpc3Qgb2YgKi8KLSAgLyogICAgICB0cmlja3kgZm9udHM7IHRoZXkgYXJlIGhhcmQtY29kZWQgaW4gZmlsZSBgdHRvYmpzLmMnLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfQ09MT1IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBoYXMgY29sb3IgZ2x5cGggdGFibGVzLiAgVG8gYWNjZXNzIGNvbG9yIGdseXBocyB1c2UgICAgICovCi0gIC8qICAgICAgQEZUX0xPQURfQ09MT1IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgICAgICAgICggMUwgPDwgIDAgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgICAgICAgKCAxTCA8PCAgMSApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCAgICAgICAoIDFMIDw8ICAyICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX1NGTlQgICAgICAgICAgICAgICggMUwgPDwgIDMgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCAgICAgICAgKCAxTCA8PCAgNCApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCAgICAgICAgICAoIDFMIDw8ICA1ICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0tFUk5JTkcgICAgICAgICAgICggMUwgPDwgIDYgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFMgICAgICAgKCAxTCA8PCAgNyApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTICAoIDFMIDw8ICA4ICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTICAgICAgICggMUwgPDwgIDkgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNICAgKCAxTCA8PCAxMCApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19ISU5URVIgICAgICAgICAgICAoIDFMIDw8IDExICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCAgICAgICAgICggMUwgPDwgMTIgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfVFJJQ0tZICAgICAgICAgICAgKCAxTCA8PCAxMyApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19DT0xPUiAgICAgICAgICAgICAoIDFMIDw8IDE0ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfSE9SSVpPTlRBTCggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMKLSAgICogICBob3Jpem9udGFsIG1ldHJpY3MgKHRoaXMgaXMgdHJ1ZSBmb3IgYWxsIGZvbnQgZm9ybWF0cyB0aG91Z2gpLgotICAgKgotICAgKiBAYWxzbzoKLSAgICogICBARlRfSEFTX1ZFUlRJQ0FMIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGZvciB2ZXJ0aWNhbCBtZXRyaWNzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX0hPUklaT05UQUwoIGZhY2UgKSBcCi0gICAgICAgICAgKCAoZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX1ZFUlRJQ0FMKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyByZWFsCi0gICAqICAgdmVydGljYWwgbWV0cmljcyAoYW5kIG5vdCBvbmx5IHN5bnRoZXNpemVkIG9uZXMpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX1ZFUlRJQ0FMKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfS0VSTklORyggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMga2VybmluZwotICAgKiAgIGRhdGEgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCBARlRfR2V0X0tlcm5pbmcuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfS0VSTklORyggZmFjZSApIFwKLSAgICAgICAgICAoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19LRVJOSU5HICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JU19TQ0FMQUJMRSggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBzY2FsYWJsZQotICAgKiAgIGZvbnQgZmFjZSAodHJ1ZSBmb3IgVHJ1ZVR5cGUsIFR5cGV+MSwgVHlwZX40MiwgQ0lELCBPcGVuVHlwZS9DRkYsCi0gICAqICAgYW5kIFBGUiBmb250IGZvcm1hdHMpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSVNfU0NBTEFCTEUoIGZhY2UgKSBcCi0gICAgICAgICAgKCAoZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0lTX1NGTlQoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGEgZm9udAotICAgKiAgIHdob3NlIGZvcm1hdCBpcyBiYXNlZCBvbiB0aGUgU0ZOVCBzdG9yYWdlIHNjaGVtZS4gIFRoaXMgdXN1YWxseQotICAgKiAgIG1lYW5zOiBUcnVlVHlwZSBmb250cywgT3BlblR5cGUgZm9udHMsIGFzIHdlbGwgYXMgU0ZOVC1iYXNlZCBlbWJlZGRlZAotICAgKiAgIGJpdG1hcCBmb250cy4KLSAgICoKLSAgICogICBJZiB0aGlzIG1hY3JvIGlzIHRydWUsIGFsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBARlRfU0ZOVF9OQU1FU19IIGFuZAotICAgKiAgIEBGVF9UUlVFVFlQRV9UQUJMRVNfSCBhcmUgYXZhaWxhYmxlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSVNfU0ZOVCggZmFjZSApIFwKLSAgICAgICAgICAoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JU19GSVhFRF9XSURUSCggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBmb250IGZhY2UKLSAgICogICB0aGF0IGNvbnRhaW5zIGZpeGVkLXdpZHRoIChvciBgbW9ub3NwYWNlJywgYGZpeGVkLXBpdGNoJywgZXRjLikKLSAgICogICBnbHlwaHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9JU19GSVhFRF9XSURUSCggZmFjZSApIFwKLSAgICAgICAgICAoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBzb21lCi0gICAqICAgZW1iZWRkZWQgYml0bWFwcy4gIFNlZSB0aGUgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgdGhlCi0gICAqICAgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfRkFTVF9HTFlQSFMoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgRGVwcmVjYXRlZC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19GQVNUX0dMWVBIUyggZmFjZSApICAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0dMWVBIX05BTUVTKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBzb21lIGdseXBoCi0gICAqICAgbmFtZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCBARlRfR2V0X0dseXBoX05hbWUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfR0xZUEhfTkFNRVMoIGZhY2UgKSBcCi0gICAgICAgICAgKCAoZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBzb21lCi0gICAqICAgbXVsdGlwbGUgbWFzdGVycy4gIFRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgQEZUX01VTFRJUExFX01BU1RFUlNfSAotICAgKiAgIGFyZSB0aGVuIGF2YWlsYWJsZSB0byBjaG9vc2UgdGhlIGV4YWN0IGRlc2lnbiB5b3Ugd2FudC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0lTX05BTUVEX0lOU1RBTkNFKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBpcyBhIG5hbWVkIGluc3RhbmNlCi0gICAqICAgb2YgYSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24gZm9udC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0lTX05BTUVEX0lOU1RBTkNFKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2luZGV4ICYgMHg3RkZGMDAwMEwgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0lTX0NJRF9LRVlFRCggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBDSUQta2V5ZWQKLSAgICogICBmb250LiAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIEBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEIGZvciBtb3JlCi0gICAqICAgZGV0YWlscy4KLSAgICoKLSAgICogICBJZiB0aGlzIG1hY3JvIGlzIHRydWUsIGFsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBARlRfQ0lEX0ggYXJlCi0gICAqICAgYXZhaWxhYmxlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSVNfQ0lEX0tFWUVEKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfVFJJQ0tZKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIHJlcHJlc2VudHMgYSBgdHJpY2t5JyBmb250LgotICAgKiAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiBARlRfRkFDRV9GTEFHX1RSSUNLWSBmb3IgbW9yZSBkZXRhaWxzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSVNfVFJJQ0tZKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1RSSUNLWSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0NPTE9SKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucwotICAgKiAgIHRhYmxlcyBmb3IgY29sb3IgZ2x5cGhzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX0NPTE9SKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0NPTE9SICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPENvbnN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQgZmxhZ3MgdG8gaW5kaWNhdGUgdGhlIHN0eWxlIG9mIGEgZ2l2ZW4gZmFjZS4gIFRoZXNlICAqLwotICAvKiAgICBhcmUgdXNlZCBpbiB0aGUgYHN0eWxlX2ZsYWdzJyBmaWVsZCBvZiBARlRfRmFjZVJlYy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVFlMRV9GTEFHX0lUQUxJQyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBzdHlsZSBpcyBpdGFsaWMgb3Igb2JsaXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVFlMRV9GTEFHX0JPTEQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBpcyBib2xkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0eWxlIGluZm9ybWF0aW9uIGFzIHByb3ZpZGVkIGJ5IEZyZWVUeXBlIGlzIHZlcnkgYmFzaWMuICBNb3JlICovCi0gIC8qICAgIGRldGFpbHMgYXJlIGJleW9uZCB0aGUgc2NvcGUgYW5kIHNob3VsZCBiZSBkb25lIG9uIGEgaGlnaGVyIGxldmVsICAqLwotICAvKiAgICAoZm9yIGV4YW1wbGUsIGJ5IGFuYWx5emluZyB2YXJpb3VzIGZpZWxkcyBvZiB0aGUgYE9TLzInIHRhYmxlIGluICAgKi8KLSAgLyogICAgU0ZOVCBiYXNlZCBmb250cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9TVFlMRV9GTEFHX0lUQUxJQyAgKCAxIDw8IDAgKQotI2RlZmluZSBGVF9TVFlMRV9GTEFHX0JPTEQgICAgKCAxIDw8IDEgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gb3BhcXVlIGhhbmRsZSB0byBhbiBgRlRfU2l6ZV9JbnRlcm5hbFJlYycgc3RydWN0dXJlLCB1c2VkIHRvICAgICovCi0gIC8qICAgIG1vZGVsIHByaXZhdGUgZGF0YSBvZiBhIGdpdmVuIEBGVF9TaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2l6ZV9JbnRlcm5hbFJlY18qICBGVF9TaXplX0ludGVybmFsOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNpemUgbWV0cmljcyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIG1ldHJpY3Mgb2YgYSBzaXplIG9iamVjdC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9wcGVtICAgICAgIDo6IFRoZSB3aWR0aCBvZiB0aGUgc2NhbGVkIEVNIHNxdWFyZSBpbiBwaXhlbHMsIGhlbmNlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0aGUgdGVybSBgcHBlbScgKHBpeGVscyBwZXIgRU0pLiAgSXQgaXMgYWxzbyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcmVmZXJyZWQgdG8gYXMgYG5vbWluYWwgd2lkdGgnLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfcHBlbSAgICAgICA6OiBUaGUgaGVpZ2h0IG9mIHRoZSBzY2FsZWQgRU0gc3F1YXJlIGluIHBpeGVscywgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgaGVuY2UgdGhlIHRlcm0gYHBwZW0nIChwaXhlbHMgcGVyIEVNKS4gIEl0IGlzIGFsc28gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHJlZmVycmVkIHRvIGFzIGBub21pbmFsIGhlaWdodCcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3NjYWxlICAgICAgOjogQSAxNi4xNiBmcmFjdGlvbmFsIHNjYWxpbmcgdmFsdWUgdG8gY29udmVydCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgbWV0cmljcyBmcm9tIGZvbnQgdW5pdHMgdG8gMjYuNiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVscy4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZm9udCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfc2NhbGUgICAgICA6OiBBIDE2LjE2IGZyYWN0aW9uYWwgc2NhbGluZyB2YWx1ZSB0byBjb252ZXJ0ICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgbWV0cmljcyBmcm9tIGZvbnQgdW5pdHMgdG8gMjYuNiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmb250IGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNjZW5kZXIgICAgIDo6IFRoZSBhc2NlbmRlciBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLCByb3VuZGVkIHVwICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0byBhbiBpbnRlZ2VyIHZhbHVlLiAgU2VlIEBGVF9GYWNlUmVjIGZvciB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc2NlbmRlciAgICA6OiBUaGUgZGVzY2VuZGVyIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMsIHJvdW5kZWQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZG93biB0byBhbiBpbnRlZ2VyIHZhbHVlLiAgU2VlIEBGVF9GYWNlUmVjIGZvciB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgICAgOjogVGhlIGhlaWdodCBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLCByb3VuZGVkIHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdmFsdWUuICBTZWUgQEZUX0ZhY2VSZWMgZm9yIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2FkdmFuY2UgIDo6IFRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggaW4gMjYuNiBmcmFjdGlvbmFsICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBwaXhlbHMsIHJvdW5kZWQgdG8gYW4gaW50ZWdlciB2YWx1ZS4gIFNlZSAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc2NhbGluZyB2YWx1ZXMsIGlmIHJlbGV2YW50LCBhcmUgZGV0ZXJtaW5lZCBmaXJzdCBkdXJpbmcgYSAgICAgKi8KLSAgLyogICAgc2l6ZSBjaGFuZ2luZyBvcGVyYXRpb24uICBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgdGhlbiBzZXQgYnkgdGhlICovCi0gIC8qICAgIGRyaXZlci4gIEZvciBzY2FsYWJsZSBmb3JtYXRzLCB0aGV5IGFyZSB1c3VhbGx5IHNldCB0byBzY2FsZWQgICAgICAqLwotICAvKiAgICB2YWx1ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIEBGVF9GYWNlUmVjLiAgU29tZSB2YWx1ZXMgICAgKi8KLSAgLyogICAgbGlrZSBhc2NlbmRlciBvciBkZXNjZW5kZXIgYXJlIHJvdW5kZWQgZm9yIGhpc3RvcmljYWwgcmVhc29uczsgICAgICovCi0gIC8qICAgIG1vcmUgcHJlY2lzZSB2YWx1ZXMgKGZvciBvdXRsaW5lIGZvbnRzKSBjYW4gYmUgZGVyaXZlZCBieSBzY2FsaW5nICAqLwotICAvKiAgICB0aGUgY29ycmVzcG9uZGluZyBARlRfRmFjZVJlYyB2YWx1ZXMgbWFudWFsbHkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBkdWUgdG8gZ2x5cGggaGludGluZyBhbmQgdGhlIHNlbGVjdGVkIHJlbmRlcmluZyBtb2RlICAgICAqLwotICAvKiAgICB0aGVzZSB2YWx1ZXMgYXJlIHVzdWFsbHkgbm90IGV4YWN0OyBjb25zZXF1ZW50bHksIHRoZXkgbXVzdCBiZSAgICAgKi8KLSAgLyogICAgdHJlYXRlZCBhcyB1bnJlbGlhYmxlIHdpdGggYW4gZXJyb3IgbWFyZ2luIG9mIGF0IGxlYXN0IG9uZSBwaXhlbCEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmRlZWQsIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlIGV4YWN0IG1ldHJpY3MgaXMgdG8gcmVuZGVyIF9hbGxfICAgKi8KLSAgLyogICAgZ2x5cGhzLiAgQXMgdGhpcyB3b3VsZCBiZSBhIGRlZmluaXRlIHBlcmZvcm1hbmNlIGhpdCwgaXQgaXMgdXAgdG8gICovCi0gIC8qICAgIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBzdWNoIGNvbXB1dGF0aW9ucy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBGVF9TaXplX01ldHJpY3MnIHN0cnVjdHVyZSBpcyB2YWxpZCBmb3IgYml0bWFwIGZvbnRzIGFsc28uICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9NZXRyaWNzXwotICB7Ci0gICAgRlRfVVNob3J0ICB4X3BwZW07ICAgICAgLyogaG9yaXpvbnRhbCBwaXhlbHMgcGVyIEVNICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VU2hvcnQgIHlfcHBlbTsgICAgICAvKiB2ZXJ0aWNhbCBwaXhlbHMgcGVyIEVNICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfRml4ZWQgICB4X3NjYWxlOyAgICAgLyogc2NhbGluZyB2YWx1ZXMgdXNlZCB0byBjb252ZXJ0IGZvbnQgICAgKi8KLSAgICBGVF9GaXhlZCAgIHlfc2NhbGU7ICAgICAvKiB1bml0cyB0byAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzICAgICAgICAqLwotCi0gICAgRlRfUG9zICAgICBhc2NlbmRlcjsgICAgLyogYXNjZW5kZXIgaW4gMjYuNiBmcmFjLiBwaXhlbHMgICAgICAgICAgKi8KLSAgICBGVF9Qb3MgICAgIGRlc2NlbmRlcjsgICAvKiBkZXNjZW5kZXIgaW4gMjYuNiBmcmFjLiBwaXhlbHMgICAgICAgICAqLwotICAgIEZUX1BvcyAgICAgaGVpZ2h0OyAgICAgIC8qIHRleHQgaGVpZ2h0IGluIDI2LjYgZnJhYy4gcGl4ZWxzICAgICAgICovCi0gICAgRlRfUG9zICAgICBtYXhfYWR2YW5jZTsgLyogbWF4IGhvcml6b250YWwgYWR2YW5jZSwgaW4gMjYuNiBwaXhlbHMgKi8KLQotICB9IEZUX1NpemVfTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3Qgc2l6ZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIHNpemUgb2JqZWN0IG1vZGVscyBhIGZhY2UgICAqLwotICAvKiAgICBvYmplY3QgYXQgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IEhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdlbmVyaWMgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlIGxpYnJhcnkgb3IgICAqLwotICAvKiAgICAgICAgICAgICAgIGFueSBvZiBpdHMgZHJpdmVycy4gIEl0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgdG8gbGluayB0aGVpciBvd24gZGF0YSB0byBlYWNoIHNpemUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljcyA6OiBNZXRyaWNzIGZvciB0aGlzIHNpemUgb2JqZWN0LiAgVGhpcyBmaWVsZCBpcyByZWFkLW9ubHkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZVJlY18KLSAgewotICAgIEZUX0ZhY2UgICAgICAgICAgIGZhY2U7ICAgICAgLyogcGFyZW50IGZhY2Ugb2JqZWN0ICAgICAgICAgICAgICAqLwotICAgIEZUX0dlbmVyaWMgICAgICAgIGdlbmVyaWM7ICAgLyogZ2VuZXJpYyBwb2ludGVyIGZvciBjbGllbnQgdXNlcyAqLwotICAgIEZUX1NpemVfTWV0cmljcyAgIG1ldHJpY3M7ICAgLyogc2l6ZSBtZXRyaWNzICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1NpemVfSW50ZXJuYWwgIGludGVybmFsOwotCi0gIH0gRlRfU2l6ZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N1YkdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdWJnbHlwaCBzdHJ1Y3R1cmUgaXMgYW4gaW50ZXJuYWwgb2JqZWN0IHVzZWQgdG8gZGVzY3JpYmUgICAgICAqLwotICAvKiAgICBzdWJnbHlwaHMgKGZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBjb21wb3NpdGVzKS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3ViZ2x5cGggaW1wbGVtZW50YXRpb24gaXMgbm90IHBhcnQgb2YgdGhlIGhpZ2gtbGV2ZWwgQVBJLCAgICAgKi8KLSAgLyogICAgaGVuY2UgdGhlIGZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIGhvd2V2ZXIgcmV0cmlldmUgc3ViZ2x5cGggaW5mb3JtYXRpb24gd2l0aCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9TdWJHbHlwaF9JbmZvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9TdWJHbHlwaFJlY18qICBGVF9TdWJHbHlwaDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nsb3RfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX1Nsb3RfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSwgdXNlZCB0byAgICAqLwotICAvKiAgICBtb2RlbCBwcml2YXRlIGRhdGEgb2YgYSBnaXZlbiBARlRfR2x5cGhTbG90IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1Nsb3RfSW50ZXJuYWxSZWNfKiAgRlRfU2xvdF9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3QgZ2x5cGggc2xvdCBjbGFzcyBzdHJ1Y3R1cmUuICBBIGdseXBoIHNsb3QgaXMgYSAgICAgICAqLwotICAvKiAgICBjb250YWluZXIgd2hlcmUgaW5kaXZpZHVhbCBnbHlwaHMgY2FuIGJlIGxvYWRlZCwgYmUgdGhleSBpbiAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSBvciBiaXRtYXAgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2xvdCBiZWxvbmdzIHRvLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXh0ICAgICAgICAgICAgICA6OiBJbiBzb21lIGNhc2VzIChsaWtlIHNvbWUgZm9udCB0b29scyksIHNldmVyYWwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggc2xvdHMgcGVyIGZhY2Ugb2JqZWN0IGNhbiBiZSBhIGdvb2QgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLiAgQXMgdGhpcyBpcyByYXJlLCB0aGUgZ2x5cGggc2xvdHMgYXJlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZWQgdGhyb3VnaCBhIGRpcmVjdCwgc2luZ2xlLWxpbmtlZCBsaXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgaXRzIGBuZXh0JyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZW5lcmljICAgICAgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdW51c2VkIGJ5IHRoZSBGcmVlVHlwZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBvciBhbnkgb2YgaXRzIGRyaXZlcnMuICBJdCBjYW4gYmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBsaW5rIHRoZWlyIG93biAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHRvIGVhY2ggZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3MgICAgICAgICAgIDo6IFRoZSBtZXRyaWNzIG9mIHRoZSBsYXN0IGxvYWRlZCBnbHlwaCBpbiB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LiAgVGhlIHJldHVybmVkIHZhbHVlcyBkZXBlbmQgb24gdGhlIGxhc3QgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCBmbGFncyAoc2VlIHRoZSBARlRfTG9hZF9HbHlwaCBBUEkgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKSBhbmQgY2FuIGJlIGV4cHJlc3NlZCBlaXRoZXIgaW4gMjYuNiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVscyBvciBmb250IHVuaXRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBldmVuIHdoZW4gdGhlIGdseXBoIGltYWdlIGlzICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCwgdGhlIG1ldHJpY3MgYXJlIG5vdC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpbmVhckhvcmlBZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9mIHRoZSB1bmhpbnRlZCBnbHlwaC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBJdHMgdmFsdWUgaXMgZXhwcmVzc2VkIGluIDE2LjE2IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLCB1bmxlc3MgQEZUX0xPQURfTElORUFSX0RFU0lHTiBpcyBzZXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbG9hZGluZyB0aGUgZ2x5cGguICBUaGlzIGZpZWxkIGNhbiBiZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbnQgdG8gcGVyZm9ybSBjb3JyZWN0IFdZU0lXWUcgbGF5b3V0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgT25seSByZWxldmFudCBmb3Igb3V0bGluZSBnbHlwaHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaW5lYXJWZXJ0QWR2YW5jZSA6OiBUaGUgYWR2YW5jZSBoZWlnaHQgb2YgdGhlIHVuaGludGVkIGdseXBoLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSXRzIHZhbHVlIGlzIGV4cHJlc3NlZCBpbiAxNi4xNiBmcmFjdGlvbmFsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscywgdW5sZXNzIEBGVF9MT0FEX0xJTkVBUl9ERVNJR04gaXMgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGxvYWRpbmcgdGhlIGdseXBoLiAgVGhpcyBmaWVsZCBjYW4gYmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50IHRvIHBlcmZvcm0gY29ycmVjdCBXWVNJV1lHIGxheW91dC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIG91dGxpbmUgZ2x5cGhzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSAgICAgICAgICAgOjogVGhpcyBzaG9ydGhhbmQgaXMsIGRlcGVuZGluZyBvbiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0sIHRoZSB0cmFuc2Zvcm1lZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAoaGludGVkKSBhZHZhbmNlIHdpZHRoIGZvciB0aGUgZ2x5cGgsIGluIDI2LjYgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25hbCBwaXhlbCBmb3JtYXQuICBBcyBzcGVjaWZpZWQgd2l0aCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCwgaXQgdXNlcyBlaXRoZXIgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBgaG9yaUFkdmFuY2UnIG9yIHRoZSBgdmVydEFkdmFuY2UnIHZhbHVlIG9mICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYG1ldHJpY3MnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXQgICAgICAgICAgICA6OiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgZm9ybWF0IG9mIHRoZSBpbWFnZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIHRoZSBnbHlwaCBzbG90LiAgVHlwaWNhbGx5ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLCAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX09VVExJTkUsIG9yICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUsIGJ1dCBvdGhlciB2YWx1ZXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwb3NzaWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0bWFwICAgICAgICAgICAgOjogVGhpcyBmaWVsZCBpcyB1c2VkIGFzIGEgYml0bWFwIGRlc2NyaXB0b3IgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHNsb3QgZm9ybWF0IGlzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX0JJVE1BUC4gIE5vdGUgdGhhdCB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBhbmQgY29udGVudCBvZiB0aGUgYml0bWFwIGJ1ZmZlciBjYW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSBiZXR3ZWVuIGNhbGxzIG9mIEBGVF9Mb2FkX0dseXBoIGFuZCBhICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmZXcgb3RoZXIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcF9sZWZ0ICAgICAgIDo6IFRoZSBiaXRtYXAncyBsZWZ0IGJlYXJpbmcgZXhwcmVzc2VkIGluICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIHBpeGVscy4gIE9ubHkgdmFsaWQgaWYgdGhlIGZvcm1hdCBpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAsIHRoaXMgaXMsIGlmIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHNsb3QgY29udGFpbnMgYSBiaXRtYXAuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0bWFwX3RvcCAgICAgICAgOjogVGhlIGJpdG1hcCdzIHRvcCBiZWFyaW5nIGV4cHJlc3NlZCBpbiBpbnRlZ2VyICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscy4gIFRoaXMgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZSB0byB0aGUgdG9wLW1vc3QgZ2x5cGggc2NhbmxpbmUsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdXB3YXJkcyB5fmNvb3JkaW5hdGVzIGJlaW5nICpwb3NpdGl2ZSouICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lICAgICAgICAgICA6OiBUaGUgb3V0bGluZSBkZXNjcmlwdG9yIGZvciB0aGUgY3VycmVudCBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaWYgaXRzIGZvcm1hdCBpcyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfT1VUTElORS4gIE9uY2UgYSBnbHlwaCBpcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQsIGBvdXRsaW5lJyBjYW4gYmUgdHJhbnNmb3JtZWQsICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZGlzdG9ydGVkLCBlbWJvbGRlbmVkLCBldGMuICBIb3dldmVyLCBpdCBtdXN0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSBmcmVlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3N1YmdseXBocyAgICAgOjogVGhlIG51bWJlciBvZiBzdWJnbHlwaHMgaW4gYSBjb21wb3NpdGUgZ2x5cGguICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGNvbXBvc2l0ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBmb3JtYXQgdGhhdCBzaG91bGQgbm9ybWFsbHkgb25seSBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkIHdpdGggdGhlIEBGVF9MT0FEX05PX1JFQ1VSU0UgZmxhZy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdWJnbHlwaHMgICAgICAgICA6OiBBbiBhcnJheSBvZiBzdWJnbHlwaCBkZXNjcmlwdG9ycyBmb3IgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIGdseXBocy4gIFRoZXJlIGFyZSBgbnVtX3N1YmdseXBocycgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZXJlLiAgQ3VycmVudGx5IGludGVybmFsIHRvICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2xfZGF0YSAgICAgIDo6IENlcnRhaW4gZm9udCBkcml2ZXJzIGNhbiBhbHNvIHJldHVybiB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGRhdGEgZm9yIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgKGUuZy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgYnl0ZWNvZGUsIFR5cGV+MSBjaGFyc3RyaW5ncywgZXRjLikuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgYSBwb2ludGVyIHRvIHN1Y2ggZGF0YTsgaXQgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgaW50ZXJuYWwgdG8gRnJlZVR5cGUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2xfbGVuICAgICAgIDo6IFRoaXMgaXMgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY29udHJvbCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLiAgQ3VycmVudGx5IGludGVybmFsIHRvIEZyZWVUeXBlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG90aGVyICAgICAgICAgICAgIDo6IFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbHNiX2RlbHRhICAgICAgICAgOjogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBoaW50ZWQgYW5kIHVuaGludGVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgc2lkZSBiZWFyaW5nIHdoaWxlIGF1dG8taGludGluZyBpcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuICBaZXJvIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJzYl9kZWx0YSAgICAgICAgIDo6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaGludGVkIGFuZCB1bmhpbnRlZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBzaWRlIGJlYXJpbmcgd2hpbGUgYXV0by1oaW50aW5nIGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLiAgWmVybyBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgQEZUX0xvYWRfR2x5cGggaXMgY2FsbGVkIHdpdGggZGVmYXVsdCBmbGFncyAoc2VlICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9MT0FEX0RFRkFVTFQpIHRoZSBnbHlwaCBpbWFnZSBpcyBsb2FkZWQgaW4gdGhlIGdseXBoIHNsb3QgaW4gICAqLwotICAvKiAgICBpdHMgbmF0aXZlIGZvcm1hdCAoZS5nLiwgYW4gb3V0bGluZSBnbHlwaCBmb3IgVHJ1ZVR5cGUgYW5kIFR5cGV+MSAgKi8KLSAgLyogICAgZm9ybWF0cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGltYWdlIGNhbiBsYXRlciBiZSBjb252ZXJ0ZWQgaW50byBhIGJpdG1hcCBieSBjYWxsaW5nICAgICAgICAgKi8KLSAgLyogICAgQEZUX1JlbmRlcl9HbHlwaC4gIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yICovCi0gIC8qICAgIHRoZSBuYXRpdmUgaW1hZ2UncyBmb3JtYXQsIHRoZW4gaW52b2tlcyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlbmRlcmVyIGlzIGluIGNoYXJnZSBvZiB0cmFuc2Zvcm1pbmcgdGhlIG5hdGl2ZSBpbWFnZSB0aHJvdWdoICovCi0gIC8qICAgIHRoZSBzbG90J3MgZmFjZSB0cmFuc2Zvcm1hdGlvbiBmaWVsZHMsIHRoZW4gY29udmVydGluZyBpdCBpbnRvIGEgICAqLwotICAvKiAgICBiaXRtYXAgdGhhdCBpcyByZXR1cm5lZCBpbiBgc2xvdC0+Yml0bWFwJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBgc2xvdC0+Yml0bWFwX2xlZnQnIGFuZCBgc2xvdC0+Yml0bWFwX3RvcCcgYXJlIGFsc28gdXNlZCAqLwotICAvKiAgICB0byBzcGVjaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgYml0bWFwIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBlbiAgKi8KLSAgLyogICAgcG9zaXRpb24gKGUuZy4sIGNvb3JkaW5hdGVzICgwLDApIG9uIHRoZSBiYXNlbGluZSkuICBPZiBjb3Vyc2UsICAgICovCi0gIC8qICAgIGBzbG90LT5mb3JtYXQnIGlzIGFsc28gY2hhbmdlZCB0byBARlRfR0xZUEhfRk9STUFUX0JJVE1BUC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBpcyBhIHNtYWxsIHBzZXVkbyBjb2RlIGZyYWdtZW50IHRoYXQgc2hvd3MgaG93IHRvIHVzZSAgICAgICAgICovCi0gIC8qICAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJyB0byBkbyBmcmFjdGlvbmFsIHBvc2l0aW9uaW5nIG9mICAgICAgICAqLwotICAvKiAgICBnbHlwaHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCAgICAgPSBmYWNlLT5nbHlwaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Qb3MgICAgICAgIG9yaWdpbl94ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBmb3IgYWxsIGdseXBocyBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICA8bG9hZCBnbHlwaCB3aXRoIGBGVF9Mb2FkX0dseXBoJz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBzbG90LT5vdXRsaW5lLCBvcmlnaW5feCAmIDYzLCAwICk7ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPHNhdmUgZ2x5cGggaW1hZ2UsIG9yIHJlbmRlciBnbHlwaCwgb3IgLi4uPiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICA8Y29tcHV0ZSBrZXJuIGJldHdlZW4gY3VycmVudCBhbmQgbmV4dCBnbHlwaCAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIGFuZCBhZGQgaXQgdG8gYG9yaWdpbl94Jz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBvcmlnaW5feCArPSBzbG90LT5hZHZhbmNlLng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgb3JpZ2luX3ggKz0gc2xvdC0+cnNiX2RlbHRhIC0gc2xvdC0+bHNiX3JlbHRhOyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBlbmRmb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBpcyBhbm90aGVyIHNtYWxsIHBzZXVkbyBjb2RlIGZyYWdtZW50IHRoYXQgc2hvd3MgaG93IHRvIHVzZSAgICovCi0gIC8qICAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJyB0byBpbXByb3ZlIGludGVnZXIgcG9zaXRpb25pbmcgb2YgICAgICAqLwotICAvKiAgICBnbHlwaHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCAgICAgICAgICAgPSBmYWNlLT5nbHlwaDsgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Qb3MgICAgICAgIG9yaWdpbl94ICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfUG9zICAgICAgICBwcmV2X3JzYl9kZWx0YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9yIGFsbCBnbHlwaHMgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPGNvbXB1dGUga2VybiBiZXR3ZWVuIGN1cnJlbnQgYW5kIHByZXZpb3VzIGdseXBoICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBhbmQgYWRkIGl0IHRvIGBvcmlnaW5feCc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPGxvYWQgZ2x5cGggd2l0aCBgRlRfTG9hZF9HbHlwaCc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIHByZXZfcnNiX2RlbHRhIC0gc2xvdC0+bHNiX2RlbHRhID49IDMyICkgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBvcmlnaW5feCAtPSA2NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVsc2UgaWYgKCBwcmV2X3JzYl9kZWx0YSAtIHNsb3QtPmxzYl9kZWx0YSA8IC0zMiApICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIG9yaWdpbl94ICs9IDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIHByZXZfcnNiX2RlbHRhID0gc2xvdC0+cnNiX2RlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPHNhdmUgZ2x5cGggaW1hZ2UsIG9yIHJlbmRlciBnbHlwaCwgb3IgLi4uPiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBvcmlnaW5feCArPSBzbG90LT5hZHZhbmNlLng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGVuZGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgdXNlIHN0cm9uZyBhdXRvLWhpbnRpbmcsIHlvdSAqbXVzdCogYXBwbHkgdGhlc2UgZGVsdGEgICAgICAgKi8KLSAgLyogICAgdmFsdWVzISAgT3RoZXJ3aXNlIHlvdSB3aWxsIGV4cGVyaWVuY2UgZmFyIHRvbyBsYXJnZSBpbnRlci1nbHlwaCAgICovCi0gIC8qICAgIHNwYWNpbmcgYXQgc21hbGwgcmVuZGVyaW5nIHNpemVzIGluIG1vc3QgY2FzZXMuICBOb3RlIHRoYXQgaXQgICAgICAqLwotICAvKiAgICBkb2Vzbid0IGhhcm0gdG8gdXNlIHRoZSBhYm92ZSBjb2RlIGZvciBvdGhlciBoaW50aW5nIG1vZGVzIGFsc28sICAgKi8KLSAgLyogICAgc2luY2UgdGhlIGRlbHRhIHZhbHVlcyBhcmUgemVybyB0aGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhTbG90UmVjXwotICB7Ci0gICAgRlRfTGlicmFyeSAgICAgICAgbGlicmFyeTsKLSAgICBGVF9GYWNlICAgICAgICAgICBmYWNlOwotICAgIEZUX0dseXBoU2xvdCAgICAgIG5leHQ7Ci0gICAgRlRfVUludCAgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgIC8qIHJldGFpbmVkIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSAqLwotICAgIEZUX0dlbmVyaWMgICAgICAgIGdlbmVyaWM7Ci0KLSAgICBGVF9HbHlwaF9NZXRyaWNzICBtZXRyaWNzOwotICAgIEZUX0ZpeGVkICAgICAgICAgIGxpbmVhckhvcmlBZHZhbmNlOwotICAgIEZUX0ZpeGVkICAgICAgICAgIGxpbmVhclZlcnRBZHZhbmNlOwotICAgIEZUX1ZlY3RvciAgICAgICAgIGFkdmFuY2U7Ci0KLSAgICBGVF9HbHlwaF9Gb3JtYXQgICBmb3JtYXQ7Ci0KLSAgICBGVF9CaXRtYXAgICAgICAgICBiaXRtYXA7Ci0gICAgRlRfSW50ICAgICAgICAgICAgYml0bWFwX2xlZnQ7Ci0gICAgRlRfSW50ICAgICAgICAgICAgYml0bWFwX3RvcDsKLQotICAgIEZUX091dGxpbmUgICAgICAgIG91dGxpbmU7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICBudW1fc3ViZ2x5cGhzOwotICAgIEZUX1N1YkdseXBoICAgICAgIHN1YmdseXBoczsKLQotICAgIHZvaWQqICAgICAgICAgICAgIGNvbnRyb2xfZGF0YTsKLSAgICBsb25nICAgICAgICAgICAgICBjb250cm9sX2xlbjsKLQotICAgIEZUX1BvcyAgICAgICAgICAgIGxzYl9kZWx0YTsKLSAgICBGVF9Qb3MgICAgICAgICAgICByc2JfZGVsdGE7Ci0KLSAgICB2b2lkKiAgICAgICAgICAgICBvdGhlcjsKLQotICAgIEZUX1Nsb3RfSW50ZXJuYWwgIGludGVybmFsOwotCi0gIH0gRlRfR2x5cGhTbG90UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgbmV3IEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgVGhlIHNldCBvZiBtb2R1bGVzICAgICAgKi8KLSAgLyogICAgdGhhdCBhcmUgcmVnaXN0ZXJlZCBieSB0aGlzIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYXQgYnVpbGQgdGltZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBuZXcgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gY2FzZSB5b3Ugd2FudCB0byBwcm92aWRlIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0aW5nIHJvdXRpbmVzLCAgICovCi0gIC8qICAgIHVzZSBARlRfTmV3X0xpYnJhcnkgaW5zdGVhZCwgZm9sbG93ZWQgYnkgYSBjYWxsIHRvICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfQWRkX0RlZmF1bHRfTW9kdWxlcyAob3IgYSBzZXJpZXMgb2YgY2FsbHMgdG8gQEZUX0FkZF9Nb2R1bGUpICAgKi8KLSAgLyogICAgYW5kIEBGVF9TZXRfRGVmYXVsdF9Qcm9wZXJ0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQEZUX0xpYnJhcnkgYW5kIEBGVF9GYWNlIGZvciAgICAgICAgICAgICAgKi8KLSAgLyogICAgbXVsdGktdGhyZWFkaW5nIGlzc3Vlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgbmVlZCByZWZlcmVuY2UtY291bnRpbmcgKGNmLiBARlRfUmVmZXJlbmNlX0xpYnJhcnkpLCB1c2UgICAgKi8KLSAgLyogICAgQEZUX05ld19MaWJyYXJ5IGFuZCBARlRfRG9uZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBjb21waWxhdGlvbiBvcHRpb24gRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTIGlzICAgKi8KLSAgLyogICAgc2V0LCB0aGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFUycgZW52aXJvbm1lbnQgICAgICovCi0gIC8qICAgIHZhcmlhYmxlIHRvIGNvbnRyb2wgZHJpdmVyIHByb3BlcnRpZXMuICBTZWUgc2VjdGlvbnMgQGF1dG9faGludGVyLCAqLwotICAvKiAgICBAY2ZmX2RyaXZlciwgQHBjZl9kcml2ZXIsIGFuZCBAdHRfZHJpdmVyIGZvciBtb3JlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5ICAqYWxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3kgYSBnaXZlbiBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiwgICAqLwotICAvKiAgICBpbmNsdWRpbmcgcmVzb3VyY2VzLCBkcml2ZXJzLCBmYWNlcywgc2l6ZXMsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Eb25lX0ZyZWVUeXBlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0IGZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGhpbiB0aGUgYGZsYWdzJyBmaWVsZCBvZiB0aGUgKi8KLSAgLyogICAgQEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9NRU1PUlkgICA6OiBUaGlzIGlzIGEgbWVtb3J5LWJhc2VkIHN0cmVhbS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1NUUkVBTSAgIDo6IENvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBgc3RyZWFtJyBmaWVsZC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fUEFUSE5BTUUgOjogQ3JlYXRlIGEgbmV3IGlucHV0IHN0cmVhbSBmcm9tIGEgQ35wYXRoICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fRFJJVkVSICAgOjogVXNlIHRoZSBgZHJpdmVyJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9QQVJBTVMgICA6OiBVc2UgdGhlIGBudW1fcGFyYW1zJyBhbmQgYHBhcmFtcycgZmllbGRzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBGVF9PUEVOX01FTU9SWScsIGBGVF9PUEVOX1NUUkVBTScsIGFuZCBgRlRfT1BFTl9QQVRITkFNRScgICAgICovCi0gIC8qICAgIGZsYWdzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfT1BFTl9NRU1PUlkgICAgMHgxCi0jZGVmaW5lIEZUX09QRU5fU1RSRUFNICAgIDB4MgotI2RlZmluZSBGVF9PUEVOX1BBVEhOQU1FICAweDQKLSNkZWZpbmUgRlRfT1BFTl9EUklWRVIgICAgMHg4Ci0jZGVmaW5lIEZUX09QRU5fUEFSQU1TICAgIDB4MTAKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGBGVF9PUEVOX1hYWCcgKi8KLSAgLyogdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9vcGVuX21lbW9yeSAgICBGVF9PUEVOX01FTU9SWQotI2RlZmluZSBmdF9vcGVuX3N0cmVhbSAgICBGVF9PUEVOX1NUUkVBTQotI2RlZmluZSBmdF9vcGVuX3BhdGhuYW1lICBGVF9PUEVOX1BBVEhOQU1FCi0jZGVmaW5lIGZ0X29wZW5fZHJpdmVyICAgIEZUX09QRU5fRFJJVkVSCi0jZGVmaW5lIGZ0X29wZW5fcGFyYW1zICAgIEZUX09QRU5fUEFSQU1TCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdG8gcGFzcyBtb3JlIG9yIGxlc3MgZ2VuZXJpYyBwYXJhbWV0ZXJzIHRvICAgICAgKi8KLSAgLyogICAgQEZUX09wZW5fRmFjZSBhbmQgQEZUX0ZhY2VfUHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICA6OiBBIGZvdXItYnl0ZSBpZGVudGlmaWNhdGlvbiB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhIDo6IEEgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgSUQgYW5kIGZ1bmN0aW9uIG9mIHBhcmFtZXRlcnMgYXJlIGRyaXZlci1zcGVjaWZpYy4gIFNlZSB0aGUgICAgKi8KLSAgLyogICAgdmFyaW91cyBGVF9QQVJBTV9UQUdfWFhYIGZsYWdzIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfUGFyYW1ldGVyXwotICB7Ci0gICAgRlRfVUxvbmcgICAgdGFnOwotICAgIEZUX1BvaW50ZXIgIGRhdGE7Ci0KLSAgfSBGVF9QYXJhbWV0ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuX0FyZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBpbmRpY2F0ZSBob3cgdG8gb3BlbiBhIG5ldyBmb250IGZpbGUgb3Igc3RyZWFtLiAgQSAgKi8KLSAgLyogICAgcG9pbnRlciB0byBzdWNoIGEgc3RydWN0dXJlIGNhbiBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIGZvciB0aGUgICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBARlRfT3Blbl9GYWNlIGFuZCBARlRfQXR0YWNoX1N0cmVhbS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIGhvdyB0byB1c2UgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeV9iYXNlIDo6IFRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWxlIGluIG1lbW9yeS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5X3NpemUgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgaW4gbWVtb3J5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRobmFtZSAgICA6OiBBIHBvaW50ZXIgdG8gYW4gOC1iaXQgZmlsZSBwYXRobmFtZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZHJpdmVyICAgICAgOjogVGhpcyBmaWVsZCBpcyBleGNsdXNpdmVseSB1c2VkIGJ5IEBGVF9PcGVuX0ZhY2U7ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGl0IHNpbXBseSBzcGVjaWZpZXMgdGhlIGZvbnQgZHJpdmVyIHRvIHVzZSBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvcGVuaW5nIHRoZSBmYWNlLiAgSWYgc2V0IHRvIE5VTEwsIEZyZWVUeXBlIHRyaWVzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdG8gbG9hZCB0aGUgZmFjZSB3aXRoIGVhY2ggb25lIG9mIHRoZSBkcml2ZXJzIGluICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGl0cyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3BhcmFtcyAgOjogVGhlIG51bWJlciBvZiBleHRyYSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJhbXMgICAgICA6OiBFeHRyYSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgZm9udCBkcml2ZXIgd2hlbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgb3BlbmluZyBhIG5ldyBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSB0eXBlIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRlbnRzIG9mIGBmbGFncycgdGhhdCAgICAgICovCi0gIC8qICAgIGFyZSB0ZXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieSBARlRfT3Blbl9GYWNlOiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIEBGVF9PUEVOX01FTU9SWSBiaXQgaXMgc2V0LCBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSBmaWxlIG9mIGBtZW1vcnlfc2l6ZScgYnl0ZXMsIGxvY2F0ZWQgYXQgYG1lbW9yeV9hZGRyZXNzJy4gICAqLwotICAvKiAgICBUaGUgZGF0YSBhcmUgbm90IGNvcGllZCwgYW5kIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yICAgICAgICAgKi8KLSAgLyogICAgcmVsZWFzaW5nIGFuZCBkZXN0cm95aW5nIHRoZW0gX2FmdGVyXyB0aGUgY29ycmVzcG9uZGluZyBjYWxsIHRvICAgICovCi0gIC8qICAgIEBGVF9Eb25lX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3RoZXJ3aXNlLCBpZiB0aGUgQEZUX09QRU5fU1RSRUFNIGJpdCBpcyBzZXQsIGFzc3VtZSB0aGF0IGEgICAgICAgICovCi0gIC8qICAgIGN1c3RvbSBpbnB1dCBzdHJlYW0gYHN0cmVhbScgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3RoZXJ3aXNlLCBpZiB0aGUgQEZUX09QRU5fUEFUSE5BTUUgYml0IGlzIHNldCwgYXNzdW1lIHRoYXQgdGhpcyAgICovCi0gIC8qICAgIGlzIGEgbm9ybWFsIGZpbGUgYW5kIHVzZSBgcGF0aG5hbWUnIHRvIG9wZW4gaXQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIEBGVF9PUEVOX0RSSVZFUiBiaXQgaXMgc2V0LCBARlRfT3Blbl9GYWNlIG9ubHkgdHJpZXMgdG8gICAgICovCi0gIC8qICAgIG9wZW4gdGhlIGZpbGUgd2l0aCB0aGUgZHJpdmVyIHdob3NlIGhhbmRsZXIgaXMgaW4gYGRyaXZlcicuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIEBGVF9PUEVOX1BBUkFNUyBiaXQgaXMgc2V0LCB0aGUgcGFyYW1ldGVycyBnaXZlbiBieSAgICAgICAgICovCi0gIC8qICAgIGBudW1fcGFyYW1zJyBhbmQgYHBhcmFtcycgaXMgdXNlZC4gIFRoZXkgYXJlIGlnbm9yZWQgb3RoZXJ3aXNlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWRlYWxseSwgYm90aCB0aGUgYHBhdGhuYW1lJyBhbmQgYHBhcmFtcycgZmllbGRzIHNob3VsZCBiZSB0YWdnZWQgICovCi0gIC8qICAgIGFzIGBjb25zdCc7IHRoaXMgaXMgbWlzc2luZyBmb3IgQVBJIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBJbiAgICAqLwotICAvKiAgICBvdGhlciB3b3JkcywgYXBwbGljYXRpb25zIHNob3VsZCB0cmVhdCB0aGVtIGFzIHJlYWQtb25seS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9PcGVuX0FyZ3NfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgZmxhZ3M7Ci0gICAgY29uc3QgRlRfQnl0ZSogIG1lbW9yeV9iYXNlOwotICAgIEZUX0xvbmcgICAgICAgICBtZW1vcnlfc2l6ZTsKLSAgICBGVF9TdHJpbmcqICAgICAgcGF0aG5hbWU7Ci0gICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbTsKLSAgICBGVF9Nb2R1bGUgICAgICAgZHJpdmVyOwotICAgIEZUX0ludCAgICAgICAgICBudW1fcGFyYW1zOwotICAgIEZUX1BhcmFtZXRlciogICBwYXJhbXM7Ci0KLSAgfSBGVF9PcGVuX0FyZ3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDYWxsIEBGVF9PcGVuX0ZhY2UgdG8gb3BlbiBhIGZvbnQgYnkgaXRzIHBhdGhuYW1lLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRobmFtZSAgIDo6IEEgcGF0aCB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogU2VlIEBGVF9PcGVuX0ZhY2UgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgSWYgYGZhY2VfaW5kZXgnIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybywgaXQgbXVzdCBiZSBub24tTlVMTC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9Eb25lX0ZhY2UgdG8gZGVzdHJveSB0aGUgY3JlYXRlZCBARlRfRmFjZSBvYmplY3QgKGFsb25nICAgICovCi0gIC8qICAgIHdpdGggaXRzIHNsb3QgYW5kIHNpemVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUsCi0gICAgICAgICAgICAgICBGVF9Mb25nICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X01lbW9yeV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2FsbCBARlRfT3Blbl9GYWNlIHRvIG9wZW4gYSBmb250IHRoYXQgaGFzIGJlZW4gbG9hZGVkIGludG8gICAgICAgICovCi0gIC8qICAgIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbGVfYmFzZSAgOjogQSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZvbnQgZGF0YS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmlsZV9zaXplICA6OiBUaGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGNodW5rIHVzZWQgYnkgdGhlIGZvbnQgZGF0YS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFNlZSBARlRfT3Blbl9GYWNlIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gIElmIGBmYWNlX2luZGV4JyBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIGl0IG11c3QgYmUgbm9uLU5VTEwuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBtdXN0IG5vdCBkZWFsbG9jYXRlIHRoZSBtZW1vcnkgYmVmb3JlIGNhbGxpbmcgQEZUX0RvbmVfRmFjZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19NZW1vcnlfRmFjZSggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGZpbGVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgZmlsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICphZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3Blbl9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGRlc2NyaWJlZCBieSAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9PcGVuX0FyZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFyZ3MgICAgICAgOjogQSBwb2ludGVyIHRvIGFuIGBGVF9PcGVuX0FyZ3MnIHN0cnVjdHVyZSB0aGF0IG11c3QgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCBieSB0aGUgY2FsbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhpcyBmaWVsZCBob2xkcyB0d28gZGlmZmVyZW50IHZhbHVlcy4gIEJpdHMgMC0xNSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFyZSB0aGUgaW5kZXggb2YgdGhlIGZhY2UgaW4gdGhlIGZvbnQgZmlsZSAoc3RhcnRpbmcgKi8KLSAgLyogICAgICAgICAgICAgICAgICB3aXRoIHZhbHVlfjApLiAgU2V0IGl0IHRvfjAgaWYgdGhlcmUgaXMgb25seSBvbmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmFjZSBpbiB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBCaXRzIDE2LTMwIGFyZSByZWxldmFudCB0byBHWCBhbmQgT3BlblR5cGUgdmFyaWF0aW9uICovCi0gIC8qICAgICAgICAgICAgICAgICAgZm9udHMgb25seSwgc3BlY2lmeWluZyB0aGUgbmFtZWQgaW5zdGFuY2UgaW5kZXggZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGZhY2UgaW5kZXggKHN0YXJ0aW5nIHdpdGggdmFsdWV+MTsgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZX4wIG1ha2VzIEZyZWVUeXBlIGlnbm9yZSBuYW1lZCBpbnN0YW5jZXMpLiAgRm9yICovCi0gIC8qICAgICAgICAgICAgICAgICAgbm9uLXZhcmlhdGlvbiBmb250cywgYml0cyAxNi0zMCBhcmUgaWdub3JlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEFzc3VtaW5nIHRoYXQgeW91IHdhbnQgdG8gYWNjZXNzIHRoZSB0aGlyZCBuYW1lZCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpbnN0YW5jZSBpbiBmYWNlfjQsIGBmYWNlX2luZGV4JyBzaG91bGQgYmUgc2V0IHRvICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwNC4gIElmIHlvdSB3YW50IHRvIGFjY2VzcyBmYWNlfjQgd2l0aG91dCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhcmlhdGlvbiBoYW5kbGluZywgc2ltcGx5IHNldCBgZmFjZV9pbmRleCcgdG8gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZX40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBGVF9PcGVuX0ZhY2UnIGFuZCBpdHMgc2libGluZ3MgY2FuIGJlIHVzZWQgdG8gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBxdWlja2x5IGNoZWNrIHdoZXRoZXIgdGhlIGZvbnQgZm9ybWF0IG9mIGEgZ2l2ZW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZm9udCByZXNvdXJjZSBpcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGUuICBJbiBnZW5lcmFsLCAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlmIHRoZSBgZmFjZV9pbmRleCcgYXJndW1lbnQgaXMgbmVnYXRpdmUsIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBpc34wIGlmIHRoZSBmb250IGZvcm1hdCBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgcmVjb2duaXplZCwgb3Igbm9uLXplcm8gb3RoZXJ3aXNlLiAgVGhlIGZ1bmN0aW9uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFsbG9jYXRlcyBhIG1vcmUgb3IgbGVzcyBlbXB0eSBmYWNlIGhhbmRsZSBpbiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgKmFmYWNlJyAoaWYgYGFmYWNlJyBpc24ndCBOVUxMKTsgdGhlIG9ubHkgdHdvICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdXNlZnVsIGZpZWxkcyBpbiB0aGlzIHNwZWNpYWwgY2FzZSBhcmUgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBmYWNlLT5udW1fZmFjZXMnIGFuZCBgZmFjZS0+c3R5bGVfZmxhZ3MnLiAgRm9yIGFueSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBvZiBgZmFjZV9pbmRleCcsIGBmYWNlLT5udW1fZmFjZXMnICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ2l2ZXMgdGhlIG51bWJlciBvZiBmYWNlcyB3aXRoaW4gdGhlIGZvbnQgZmlsZS4gIEZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBuZWdhdGl2ZSB2YWx1ZSBgLShOKzEpJyAod2l0aCBgTicgYSBub24tbmVnYXRpdmUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAxNi1iaXQgdmFsdWUpLCBiaXRzIDE2LTMwIGluIGBmYWNlLT5zdHlsZV9mbGFncycgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ2l2ZSB0aGUgbnVtYmVyIG9mIG5hbWVkIGluc3RhbmNlcyBpbiBmYWNlIGBOJyBpZiB3ZSAqLwotICAvKiAgICAgICAgICAgICAgICAgIGhhdmUgYSB2YXJpYXRpb24gZm9udCAob3IgemVybyBvdGhlcndpc2UpLiAgQWZ0ZXIgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBleGFtaW5hdGlvbiwgdGhlIHJldHVybmVkIEBGVF9GYWNlIHN0cnVjdHVyZSBzaG91bGQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYmUgZGVhbGxvY2F0ZWQgd2l0aCBhIGNhbGwgdG8gQEZUX0RvbmVfRmFjZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICBJZiBgZmFjZV9pbmRleCcgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdCBtdXN0IGJlIG5vbi1OVUxMLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVbmxpa2UgRnJlZVR5cGUgMS54LCB0aGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGdseXBoICAgKi8KLSAgLyogICAgc2xvdCBmb3IgdGhlIGZhY2Ugb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHRocm91Z2ggICAgICovCi0gIC8qICAgIGBmYWNlLT5nbHlwaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBuZXcgZmFjZSBvYmplY3QgY3JlYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gYWxzbyBvd25zIGEgICAgICAgICovCi0gIC8qICAgIGRlZmF1bHQgQEZUX1NpemUgb2JqZWN0LCBhY2Nlc3NpYmxlIGFzIGBmYWNlLT5zaXplJy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25lIEBGVF9MaWJyYXJ5IGluc3RhbmNlIGNhbiBoYXZlIG11bHRpcGxlIGZhY2Ugb2JqZWN0cywgdGhpcyBpcywgICovCi0gIC8qICAgIEBGVF9PcGVuX0ZhY2UgYW5kIGl0cyBzaWJsaW5ncyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHVzaW5nICAqLwotICAvKiAgICB0aGUgc2FtZSBgbGlicmFyeScgYXJndW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiByZWZlcmVuY2UgY291bnRlcnMgaW4gdGhlIGRlc2NyaXB0aW9uIG9mICAgICAqLwotICAvKiAgICBARlRfUmVmZXJlbmNlX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGxvb3Agb3ZlciBhbGwgZmFjZXMsIHVzZSBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBzbmlwcGV0ICAqLwotICAvKiAgICAob21pdHRpbmcgdGhlIGVycm9yIGhhbmRsaW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9GYWNlICBmYWNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgaSwgbnVtX2ZhY2VzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksIGFyZ3MsIC0xLCAmZmFjZSApOyAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGlmICggZXJyb3IgKSB7IC4uLiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgbnVtX2ZhY2VzID0gZmFjZS0+bnVtX2ZhY2VzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fZmFjZXM7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgYXJncywgaSwgJmZhY2UgKTsgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBsb29wIG92ZXIgYWxsIHZhbGlkIHZhbHVlcyBmb3IgYGZhY2VfaW5kZXgnLCB1c2Ugc29tZXRoaW5nICAgICAgKi8KLSAgLyogICAgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIHNuaXBwZXQsIGFnYWluIHdpdGhvdXQgZXJyb3IgaGFuZGxpbmcuICAgICovCi0gIC8qICAgIFRoZSBjb2RlIGFjY2Vzc2VzIGFsbCBmYWNlcyBpbW1lZGlhdGVseSAodGh1cyBvbmx5IGEgc2luZ2xlIGNhbGwgICAqLwotICAvKiAgICBvZiBgRlRfT3Blbl9GYWNlJyB3aXRoaW4gdGhlIGRvLWxvb3ApLCB3aXRoIGFuZCB3aXRob3V0IG5hbWVkICAgICAgKi8KLSAgLyogICAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfRmFjZSAgZmFjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Mb25nICBudW1fZmFjZXMgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgbnVtX2luc3RhbmNlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Mb25nICBmYWNlX2lkeCAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgaW5zdGFuY2VfaWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0xvbmcgIGlkID0gKCBpbnN0YW5jZV9pZHggPDwgMTYgKSArIGZhY2VfaWR4OyAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCBhcmdzLCBpZCwgJmZhY2UgKTsgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIG51bV9mYWNlcyAgICAgPSBmYWNlLT5udW1fZmFjZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBudW1faW5zdGFuY2VzID0gZmFjZS0+c3R5bGVfZmxhZ3MgPj4gMTY7ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIGluc3RhbmNlX2lkeCA8IG51bV9pbnN0YW5jZXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBpbnN0YW5jZV9pZHgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBmYWNlX2lkeCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgaW5zdGFuY2VfaWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB9IHdoaWxlICggZmFjZV9pZHggPCBudW1fZmFjZXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX09wZW5fRmFjZSggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICBjb25zdCBGVF9PcGVuX0FyZ3MqICBhcmdzLAotICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAqYWZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9GaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENhbGwgQEZUX0F0dGFjaF9TdHJlYW0gdG8gYXR0YWNoIGEgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbGVwYXRobmFtZSA6OiBUaGUgcGF0aG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0F0dGFjaF9GaWxlKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBBdHRhY2gnIGRhdGEgdG8gYSBmYWNlIG9iamVjdC4gIE5vcm1hbGx5LCB0aGlzIGlzIHVzZWQgdG8gcmVhZCAgICAqLwotICAvKiAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZmFjZSBvYmplY3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiAgKi8KLSAgLyogICAgYXR0YWNoIGFuIEFGTSBmaWxlIHRoYXQgY29tZXMgd2l0aCBhIFR5cGV+MSBmb250IHRvIGdldCB0aGUgICAgICAgICovCi0gIC8qICAgIGtlcm5pbmcgdmFsdWVzIGFuZCBvdGhlciBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtZXRlcnMgOjogQSBwb2ludGVyIHRvIEBGVF9PcGVuX0FyZ3MgdGhhdCBtdXN0IGJlIGZpbGxlZCBieSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVhbmluZyBvZiB0aGUgYGF0dGFjaCcgKGkuZS4sIHdoYXQgcmVhbGx5IGhhcHBlbnMgd2hlbiB0aGUgICAgKi8KLSAgLyogICAgbmV3IGZpbGUgaXMgcmVhZCkgaXMgbm90IGZpeGVkIGJ5IEZyZWVUeXBlIGl0c2VsZi4gIEl0IHJlYWxseSAgICAgICovCi0gIC8qICAgIGRlcGVuZHMgb24gdGhlIGZvbnQgZm9ybWF0IChhbmQgdGh1cyB0aGUgZm9udCBkcml2ZXIpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8ga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nICAgICAgICovCi0gIC8qICAgIHdoZW4gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gIE1vc3QgZHJpdmVycyBzaW1wbHkgZG8gbm90IGltcGxlbWVudCAqLwotICAvKiAgICBmaWxlIG9yIHN0cmVhbSBhdHRhY2htZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9BdHRhY2hfU3RyZWFtKCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9PcGVuX0FyZ3MqICBwYXJhbWV0ZXJzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZWZlcmVuY2VfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNvdW50ZXIgZ2V0cyBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSAgKi8KLSAgLyogICAgaXMgY3JlYXRlZC4gIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgY291bnRlci4gIEBGVF9Eb25lX0ZhY2UgICovCi0gIC8qICAgIHRoZW4gb25seSBkZXN0cm95cyBhIGZhY2UgaWYgdGhlIGNvdW50ZXIgaXN+MSwgb3RoZXJ3aXNlIGl0IHNpbXBseSAqLwotICAvKiAgICBkZWNyZW1lbnRzIHRoZSBjb3VudGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaGVscHMgaW4gbWFuYWdpbmcgbGlmZS1jeWNsZXMgb2Ygc3RydWN0dXJlcyB0aGF0ICAgICAqLwotICAvKiAgICByZWZlcmVuY2UgQEZUX0ZhY2Ugb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjQuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9SZWZlcmVuY2VfRmFjZSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZCBhIGdpdmVuIGZhY2Ugb2JqZWN0LCBhcyB3ZWxsIGFzIGFsbCBvZiBpdHMgY2hpbGQgc2xvdHMgYW5kICovCi0gIC8qICAgIHNpemVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiByZWZlcmVuY2UgY291bnRlcnMgaW4gdGhlIGRlc2NyaXB0aW9uIG9mICAgICAqLwotICAvKiAgICBARlRfUmVmZXJlbmNlX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Eb25lX0ZhY2UoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NlbGVjdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlbGVjdCBhIGJpdG1hcCBzdHJpa2UuICBUbyBiZSBtb3JlIHByZWNpc2UsIHRoaXMgZnVuY3Rpb24gc2V0cyAgICAqLwotICAvKiAgICB0aGUgc2NhbGluZyBmYWN0b3JzIG9mIHRoZSBhY3RpdmUgQEZUX1NpemUgb2JqZWN0IGluIGEgZmFjZSBzbyAgICAgKi8KLSAgLyogICAgdGhhdCBiaXRtYXBzIGZyb20gdGhpcyBwYXJ0aWN1bGFyIHN0cmlrZSBhcmUgdGFrZW4gYnkgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0dseXBoIGFuZCBmcmllbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGJpdG1hcCBzdHJpa2UgaW4gdGhlICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYml0bWFwcyBlbWJlZGRlZCBpbiBvdXRsaW5lIGZvbnRzIGl0IGlzIGNvbW1vbiB0aGF0IG9ubHkgYSAgICAgKi8KLSAgLyogICAgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgZ2x5cGhzIGF0IGEgZ2l2ZW4gcHBlbSB2YWx1ZSBpcyBhdmFpbGFibGUuICovCi0gIC8qICAgIEZyZWVUeXBlIHNpbGVudGx5IHVzZXMgb3V0bGluZXMgaWYgdGhlcmUgaXMgbm8gYml0bWFwIGZvciBhIGdpdmVuICAqLwotICAvKiAgICBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBHWCBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLCBhIGJpdG1hcCBzdHJpa2UgbWFrZXMgc2Vuc2UgICAqLwotICAvKiAgICBvbmx5IGlmIHRoZSBkZWZhdWx0IGluc3RhbmNlIGlzIGFjdGl2ZSAodGhpcyBpcywgbm8gZ2x5cGggICAgICAgICAgKi8KLSAgLyogICAgdmFyaWF0aW9uIHRha2VzIHBsYWNlKTsgb3RoZXJ3aXNlLCBGcmVlVHlwZSBzaW1wbHkgaWdub3JlcyBiaXRtYXAgICovCi0gIC8qICAgIHN0cmlrZXMuICBUaGUgc2FtZSBpcyB0cnVlIGZvciBhbGwgbmFtZWQgaW5zdGFuY2VzIHRoYXQgYXJlICAgICAgICAqLwotICAvKiAgICBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9TaXplKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgc3RyaWtlX2luZGV4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgbGlzdHMgdGhlIHN1cHBvcnRlZCBzaXplIHJlcXVlc3QgdHlwZXMsICAgKi8KLSAgLyogICAgaS5lLiwgd2hhdCBpbnB1dCBzaXplIChpbiBmb250IHVuaXRzKSBtYXBzIHRvIHRoZSByZXF1ZXN0ZWQgb3V0cHV0ICovCi0gIC8qICAgIHNpemUgKGluIHBpeGVscywgYXMgY29tcHV0ZWQgZnJvbSB0aGUgYXJndW1lbnRzIG9mICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfU2l6ZV9SZXF1ZXN0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbm9taW5hbCBzaXplLiAgVGhlIGB1bml0c19wZXJfRU0nIGZpZWxkIG9mIEBGVF9GYWNlUmVjIGlzICAgICovCi0gIC8qICAgICAgdXNlZCB0byBkZXRlcm1pbmUgYm90aCBzY2FsaW5nIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBzY2FsaW5nIGZvdW5kIGluIG1vc3QgYXBwbGljYXRpb25zLiAgSW4gICAgICovCi0gIC8qICAgICAgcGFydGljdWxhciwgdXNlIHRoaXMgc2l6ZSByZXF1ZXN0IHR5cGUgZm9yIFRydWVUeXBlIGZvbnRzIGlmICAgICAqLwotICAvKiAgICAgIHRoZXkgcHJvdmlkZSBvcHRpY2FsIHNjYWxpbmcgb3Igc29tZXRoaW5nIHNpbWlsYXIuICBOb3RlLCAgICAgICAgKi8KLSAgLyogICAgICBob3dldmVyLCB0aGF0IGB1bml0c19wZXJfRU0nIGlzIGEgcmF0aGVyIGFic3RyYWN0IHZhbHVlIHdoaWNoICAgICovCi0gIC8qICAgICAgYmVhcnMgbm8gcmVsYXRpb24gdG8gdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBnbHlwaHMgaW4gYSBmb250LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfUkVBTF9ESU0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHJlYWwgZGltZW5zaW9uLiAgVGhlIHN1bSBvZiB0aGUgYGFzY2VuZGVyJyBhbmQgKG1pbnVzIG9mKSAgICAqLwotICAvKiAgICAgIHRoZSBgZGVzY2VuZGVyJyBmaWVsZHMgb2YgQEZUX0ZhY2VSZWMgaXMgdXNlZCB0byBkZXRlcm1pbmUgYm90aCAgKi8KLSAgLyogICAgICBzY2FsaW5nIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9CQk9YIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZm9udCBib3VuZGluZyBib3guICBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYGJib3gnIGZpZWxkICovCi0gIC8qICAgICAgb2YgQEZUX0ZhY2VSZWMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAqLwotICAvKiAgICAgIHNjYWxpbmcgdmFsdWUsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX0NFTEwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBgbWF4X2FkdmFuY2Vfd2lkdGgnIGZpZWxkIG9mIEBGVF9GYWNlUmVjIGlzIHVzZWQgdG8gICAgICAgICAgKi8KLSAgLyogICAgICBkZXRlcm1pbmUgdGhlIGhvcml6b250YWwgc2NhbGluZyB2YWx1ZTsgdGhlIHZlcnRpY2FsIHNjYWxpbmcgICAgICovCi0gIC8qICAgICAgdmFsdWUgaXMgZGV0ZXJtaW5lZCB0aGUgc2FtZSB3YXkgYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTSBkb2VzLiAgRmluYWxseSwgYm90aCBzY2FsaW5nICAgICAgKi8KLSAgLyogICAgICB2YWx1ZXMgYXJlIHNldCB0byB0aGUgc21hbGxlciBvbmUuICBUaGlzIHR5cGUgaXMgdXNlZnVsIGlmIHlvdSAgICovCi0gIC8qICAgICAgd2FudCB0byBzcGVjaWZ5IHRoZSBmb250IHNpemUgZm9yLCBzYXksIGEgd2luZG93IG9mIGEgZ2l2ZW4gICAgICAqLwotICAvKiAgICAgIGRpbWVuc2lvbiBhbmQgODB4MjQgY2VsbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1NDQUxFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNwZWNpZnkgdGhlIHNjYWxpbmcgdmFsdWVzIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWJvdmUgZGVzY3JpcHRpb25zIG9ubHkgYXBwbHkgdG8gc2NhbGFibGUgZm9ybWF0cy4gIEZvciBiaXRtYXAgKi8KLSAgLyogICAgZm9ybWF0cywgdGhlIGJlaGF2aW91ciBpcyB1cCB0byB0aGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIG5vdGUgc2VjdGlvbiBvZiBARlRfU2l6ZV9NZXRyaWNzIGlmIHlvdSB3b25kZXIgaG93IHNpemUgICAgKi8KLSAgLyogICAgcmVxdWVzdGluZyByZWxhdGVzIHRvIHNjYWxpbmcgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1NpemVfUmVxdWVzdF9UeXBlXwotICB7Ci0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTCwKLSAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTSwKLSAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9CQk9YLAotICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX0NFTEwsCi0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfU0NBTEVTLAotCi0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTUFYCi0KLSAgfSBGVF9TaXplX1JlcXVlc3RfVHlwZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgc2l6ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR5cGUgICAgICAgICAgIDo6IFNlZSBARlRfU2l6ZV9SZXF1ZXN0X1R5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgICAgICAgOjogVGhlIGRlc2lyZWQgd2lkdGgsIGdpdmVuIGFzIGEgMjYuNiBmcmFjdGlvbmFsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIHBvaW50IHZhbHVlICh3aXRoIDcycHQgPSAxaW4pLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICAgICAgICAgOjogVGhlIGRlc2lyZWQgaGVpZ2h0LCBnaXZlbiBhcyBhIDI2LjYgZnJhY3Rpb25hbCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIHBvaW50IHZhbHVlICh3aXRoIDcycHQgPSAxaW4pLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaVJlc29sdXRpb24gOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiAoZHBpLCBpLmUuLCBwaXhlbHMgcGVyICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGluY2gpLiAgSWYgc2V0IHRvIHplcm8sIGB3aWR0aCcgaXMgdHJlYXRlZCBhcyBhICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAyNi42IGZyYWN0aW9uYWwgKnBpeGVsKiB2YWx1ZSwgd2hpY2ggZ2V0cyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxseSByb3VuZGVkIHRvIGFuIGludGVnZXIuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0UmVzb2x1dGlvbiA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbiAoZHBpLCBpLmUuLCBwaXhlbHMgcGVyICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgaW5jaCkuICBJZiBzZXQgdG8gemVybywgYGhlaWdodCcgaXMgdHJlYXRlZCBhcyBhICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIDI2LjYgZnJhY3Rpb25hbCAqcGl4ZWwqIHZhbHVlLCB3aGljaCBnZXRzICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbGx5IHJvdW5kZWQgdG8gYW4gaW50ZWdlci4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgd2lkdGgnIGlzIHplcm8sIHRoZSBob3Jpem9udGFsIHNjYWxpbmcgdmFsdWUgaXMgc2V0IGVxdWFsICAgICAgKi8KLSAgLyogICAgdG8gdGhlIHZlcnRpY2FsIHNjYWxpbmcgdmFsdWUsIGFuZCB2aWNlIHZlcnNhLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgdHlwZScgaXMgRlRfU0laRV9SRVFVRVNUX1RZUEVfU0NBTEVTLCBgd2lkdGgnIGFuZCBgaGVpZ2h0JyBhcmUgKi8KLSAgLyogICAgaW50ZXJwcmV0ZWQgZGlyZWN0bHkgYXMgMTYuMTYgZnJhY3Rpb25hbCBzY2FsaW5nIHZhbHVlcywgd2l0aG91dCAgICovCi0gIC8qICAgIGFueSBmdXJ0aGVyIG1vZGlmaWNhdGlvbiwgYW5kIGJvdGggYGhvcmlSZXNvbHV0aW9uJyBhbmQgICAgICAgICAgICAqLwotICAvKiAgICBgdmVydFJlc29sdXRpb24nIGFyZSBpZ25vcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TaXplX1JlcXVlc3RSZWNfCi0gIHsKLSAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgdHlwZTsKLSAgICBGVF9Mb25nICAgICAgICAgICAgICAgd2lkdGg7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgIGhlaWdodDsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgaG9yaVJlc29sdXRpb247Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgIHZlcnRSZXNvbHV0aW9uOwotCi0gIH0gRlRfU2l6ZV9SZXF1ZXN0UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBzaXplIHJlcXVlc3Qgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9TaXplX1JlcXVlc3RSZWNfICAqRlRfU2l6ZV9SZXF1ZXN0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVxdWVzdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVzaXplIHRoZSBzY2FsZSBvZiB0aGUgYWN0aXZlIEBGVF9TaXplIG9iamVjdCBpbiBhIGZhY2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVxICA6OiBBIHBvaW50ZXIgdG8gYSBARlRfU2l6ZV9SZXF1ZXN0UmVjLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWx0aG91Z2ggZHJpdmVycyBtYXkgc2VsZWN0IHRoZSBiaXRtYXAgc3RyaWtlIG1hdGNoaW5nIHRoZSAgICAgICAgICovCi0gIC8qICAgIHJlcXVlc3QsIHlvdSBzaG91bGQgbm90IHJlbHkgb24gdGhpcyBpZiB5b3UgaW50ZW5kIHRvIHNlbGVjdCBhICAgICAqLwotICAvKiAgICBwYXJ0aWN1bGFyIGJpdG1hcCBzdHJpa2UuICBVc2UgQEZUX1NlbGVjdF9TaXplIGluc3RlYWQgaW4gdGhhdCAgICAgKi8KLSAgLyogICAgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHNpemUgYW5kIHRoZSByZXN1bHRpbmcgZ2x5cGggICAgKi8KLSAgLyogICAgc2l6ZSBpcyBkZXBlbmRlbnQgZW50aXJlbHkgb24gaG93IHRoZSBzaXplIGlzIGRlZmluZWQgaW4gdGhlICAgICAgICovCi0gIC8qICAgIHNvdXJjZSBmYWNlLiAgVGhlIGZvbnQgZGVzaWduZXIgY2hvb3NlcyB0aGUgZmluYWwgc2l6ZSBvZiBlYWNoICAgICAqLwotICAvKiAgICBnbHlwaCByZWxhdGl2ZSB0byB0aGlzIHNpemUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byAgICAgICAgKi8KLSAgLyogICAgYGh0dHBzOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvZG9jcy9nbHlwaHMvZ2x5cGhzLTIuaHRtbCcuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb250cmFyeSB0byBARlRfU2V0X0NoYXJfU2l6ZSwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgc3BlY2lhbCAgKi8KLSAgLyogICAgY29kZSB0byBub3JtYWxpemUgemVyby12YWx1ZWQgd2lkdGhzLCBoZWlnaHRzLCBvciByZXNvbHV0aW9ucyAgICAgICovCi0gIC8qICAgICh3aGljaCBsZWFkIHRvIGVycm9ycyBpbiBtb3N0IGNhc2VzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaWYgeW91IGFyZSB1c2luZyB0aGUgRnJlZVR5cGUgY2FjaGUgQVBJLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfUmVxdWVzdF9TaXplKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFyX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENhbGwgQEZUX1JlcXVlc3RfU2l6ZSB0byByZXF1ZXN0IHRoZSBub21pbmFsIHNpemUgKGluIHBvaW50cykuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJfd2lkdGggICAgICA6OiBUaGUgbm9taW5hbCB3aWR0aCwgaW4gMjYuNiBmcmFjdGlvbmFsIHBvaW50cy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9oZWlnaHQgICAgIDo6IFRoZSBub21pbmFsIGhlaWdodCwgaW4gMjYuNiBmcmFjdGlvbmFsIHBvaW50cy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3J6X3Jlc29sdXRpb24gOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRfcmVzb2x1dGlvbiA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoaWxlIHRoaXMgZnVuY3Rpb24gYWxsb3dzIGZyYWN0aW9uYWwgcG9pbnRzIGFzIGlucHV0IHZhbHVlcywgdGhlICAqLwotICAvKiAgICByZXN1bHRpbmcgcHBlbSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHJlc29sdXRpb24gaXMgYWx3YXlzIHJvdW5kZWQgdG8gKi8KLSAgLyogICAgdGhlIG5lYXJlc3QgaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBlaXRoZXIgdGhlIGNoYXJhY3RlciB3aWR0aCBvciBoZWlnaHQgaXMgemVybywgaXQgaXMgc2V0IGVxdWFsICAgKi8KLSAgLyogICAgdG8gdGhlIG90aGVyIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBlaXRoZXIgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgcmVzb2x1dGlvbiBpcyB6ZXJvLCBpdCBpcyBzZXQgKi8KLSAgLyogICAgZXF1YWwgdG8gdGhlIG90aGVyIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNoYXJhY3RlciB3aWR0aCBvciBoZWlnaHQgc21hbGxlciB0aGFuIDFwdCBpcyBzZXQgdG8gMXB0OyBpZiAgICAgKi8KLSAgLyogICAgYm90aCByZXNvbHV0aW9uIHZhbHVlcyBhcmUgemVybywgdGhleSBhcmUgc2V0IHRvIDcyZHBpLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBGcmVlVHlwZSBjYWNoZSBBUEkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZXRfQ2hhcl9TaXplKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaG9yel9yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICB2ZXJ0X3Jlc29sdXRpb24gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9QaXhlbF9TaXplcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENhbGwgQEZUX1JlcXVlc3RfU2l6ZSB0byByZXF1ZXN0IHRoZSBub21pbmFsIHNpemUgKGluIHBpeGVscykuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBpeGVsX3dpZHRoICA6OiBUaGUgbm9taW5hbCB3aWR0aCwgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl4ZWxfaGVpZ2h0IDo6IFRoZSBub21pbmFsIGhlaWdodCwgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCBub3QgcmVseSBvbiB0aGUgcmVzdWx0aW5nIGdseXBocyBtYXRjaGluZyBvciBiZWluZyAgICAgICovCi0gIC8qICAgIGNvbnN0cmFpbmVkIHRvIHRoaXMgcGl4ZWwgc2l6ZS4gIFJlZmVyIHRvIEBGVF9SZXF1ZXN0X1NpemUgdG8gICAgICAqLwotICAvKiAgICB1bmRlcnN0YW5kIGhvdyByZXF1ZXN0ZWQgc2l6ZXMgcmVsYXRlIHRvIGFjdHVhbCBzaXplcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9QaXhlbF9TaXplcyggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF9oZWlnaHQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgYSBnbHlwaCBpbnRvIHRoZSBnbHlwaCBzbG90IG9mIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3Qgd2hlcmUgdGhlIGdseXBoICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBpcyBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICBGb3IgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgQ0lELWtleWVkIGZvbnRzIChlaXRoZXIgaW4gUFMgb3IgaW4gQ0ZGIGZvcm1hdCkgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoaXMgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBDSUQgdmFsdWUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogQSBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBsb2FkIGZvciB0aGlzIGdseXBoLiAgVGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sIHdoZXRoZXIgdGhlIG91dGxpbmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNjYWxlZCwgd2hldGhlciB0byBsb2FkIGJpdG1hcHMgb3Igbm90LCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsb2FkZWQgZ2x5cGggbWF5IGJlIHRyYW5zZm9ybWVkLiAgU2VlIEBGVF9TZXRfVHJhbnNmb3JtIGZvciAgICAqLwotICAvKiAgICB0aGUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBzdWJzZXR0ZWQgQ0lELWtleWVkIGZvbnRzLCBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGlzICAgICAgICAqLwotICAvKiAgICByZXR1cm5lZCBmb3IgaW52YWxpZCBDSUQgdmFsdWVzICh0aGlzIGlzLCBmb3IgQ0lEIHZhbHVlcyB0aGF0ICAgICAgKi8KLSAgLyogICAgZG9uJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZ2x5cGggaW4gdGhlIGZvbnQpLiAgU2VlIHRoZSBkaXNjdXNzaW9uICovCi0gIC8qICAgIG9mIHRoZSBARlRfRkFDRV9GTEFHX0NJRF9LRVlFRCBmbGFnIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgeW91IHJlY2VpdmUgYEZUX0Vycl9HbHlwaF9Ub29fQmlnJywgdHJ5IGdldHRpbmcgdGhlIGdseXBoICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgYXQgRU0gc2l6ZSwgdGhlbiBzY2FsZSBpdCBtYW51YWxseSBhbmQgZmlsbCBpdCBhcyBhICAgICAgICAqLwotICAvKiAgICBncmFwaGljcyBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Mb2FkX0dseXBoKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhIGdseXBoIGludG8gdGhlIGdseXBoIHNsb3Qgb2YgYSBmYWNlIG9iamVjdCwgYWNjZXNzZWQgYnkgaXRzICovCi0gIC8qICAgIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBpcyBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX2NvZGUgICA6OiBUaGUgZ2x5cGgncyBjaGFyYWN0ZXIgY29kZSwgYWNjb3JkaW5nIHRvIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY3VycmVudCBjaGFybWFwIHVzZWQgaW4gdGhlIGZhY2UuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgQEZUX0xPQURfWFhYIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgQEZUX0dldF9DaGFyX0luZGV4IGFuZCBARlRfTG9hZF9HbHlwaC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYW55IGZvbnRzIGNvbnRhaW4gZ2x5cGhzIHRoYXQgY2FuJ3QgYmUgbG9hZGVkIGJ5IHRoaXMgZnVuY3Rpb24gICAgKi8KLSAgLyogICAgc2luY2UgaXRzIGdseXBoIGluZGljZXMgYXJlIG5vdCBsaXN0ZWQgaW4gYW55IG9mIHRoZSBmb250J3MgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0xvYWRfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfTE9BRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiBiaXQgZmllbGQgY29uc3RhbnRzIGZvciBARlRfTG9hZF9HbHlwaCB0byBpbmRpY2F0ZSB3aGF0Ci0gICAqICAga2luZCBvZiBvcGVyYXRpb25zIHRvIHBlcmZvcm0gZHVyaW5nIGdseXBoIGxvYWRpbmcuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfTE9BRF9ERUZBVUxUIDo6Ci0gICAqICAgICBDb3JyZXNwb25kaW5nIHRvfjAsIHRoaXMgdmFsdWUgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBnbHlwaCBsb2FkCi0gICAqICAgICBvcGVyYXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKLSAgICoKLSAgICogICAgIDEuIEZyZWVUeXBlIGxvb2tzIGZvciBhIGJpdG1hcCBmb3IgdGhlIGdseXBoIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAqICAgICAgICBmYWNlJ3MgY3VycmVudCBzaXplLiAgSWYgb25lIGlzIGZvdW5kLCB0aGUgZnVuY3Rpb24gcmV0dXJucy4KLSAgICogICAgICAgIFRoZSBiaXRtYXAgZGF0YSBjYW4gYmUgYWNjZXNzZWQgZnJvbSB0aGUgZ2x5cGggc2xvdCAoc2VlIG5vdGUKLSAgICogICAgICAgIGJlbG93KS4KLSAgICoKLSAgICogICAgIDIuIElmIG5vIGVtYmVkZGVkIGJpdG1hcCBpcyBzZWFyY2hlZCBmb3Igb3IgZm91bmQsIEZyZWVUeXBlIGxvb2tzCi0gICAqICAgICAgICBmb3IgYSBzY2FsYWJsZSBvdXRsaW5lLiAgSWYgb25lIGlzIGZvdW5kLCBpdCBpcyBsb2FkZWQgZnJvbQotICAgKiAgICAgICAgdGhlIGZvbnQgZmlsZSwgc2NhbGVkIHRvIGRldmljZSBwaXhlbHMsIHRoZW4gYGhpbnRlZCcgdG8gdGhlCi0gICAqICAgICAgICBwaXhlbCBncmlkIGluIG9yZGVyIHRvIG9wdGltaXplIGl0LiAgVGhlIG91dGxpbmUgZGF0YSBjYW4gYmUKLSAgICogICAgICAgIGFjY2Vzc2VkIGZyb20gdGhlIGdseXBoIHNsb3QgKHNlZSBub3RlIGJlbG93KS4KLSAgICoKLSAgICogICAgIE5vdGUgdGhhdCBieSBkZWZhdWx0IHRoZSBnbHlwaCBsb2FkZXIgZG9lc24ndCByZW5kZXIgb3V0bGluZXMgaW50bwotICAgKiAgICAgYml0bWFwcy4gIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHVzZWQgdG8gbW9kaWZ5IHRoaXMgZGVmYXVsdAotICAgKiAgICAgYmVoYXZpb3VyIHRvIG1vcmUgc3BlY2lmaWMgYW5kIHVzZWZ1bCBjYXNlcy4KLSAgICoKLSAgICogICBGVF9MT0FEX05PX1NDQUxFIDo6Ci0gICAqICAgICBEb24ndCBzY2FsZSB0aGUgbG9hZGVkIG91dGxpbmUgZ2x5cGggYnV0IGtlZXAgaXQgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogICAgIFRoaXMgZmxhZyBpbXBsaWVzIEBGVF9MT0FEX05PX0hJTlRJTkcgYW5kIEBGVF9MT0FEX05PX0JJVE1BUCwgYW5kCi0gICAqICAgICB1bnNldHMgQEZUX0xPQURfUkVOREVSLgotICAgKgotICAgKiAgICAgSWYgdGhlIGZvbnQgaXMgYHRyaWNreScgKHNlZSBARlRfRkFDRV9GTEFHX1RSSUNLWSBmb3IgbW9yZSksIHVzaW5nCi0gICAqICAgICBGVF9MT0FEX05PX1NDQUxFIHVzdWFsbHkgeWllbGRzIG1lYW5pbmdsZXNzIG91dGxpbmVzIGJlY2F1c2UgdGhlCi0gICAqICAgICBzdWJnbHlwaHMgbXVzdCBiZSBzY2FsZWQgYW5kIHBvc2l0aW9uZWQgd2l0aCBoaW50aW5nIGluc3RydWN0aW9ucy4KLSAgICogICAgIFRoaXMgY2FuIGJlIHNvbHZlZCBieSBsb2FkaW5nIHRoZSBmb250IHdpdGhvdXQgRlRfTE9BRF9OT19TQ0FMRSBhbmQKLSAgICogICAgIHNldHRpbmcgdGhlIGNoYXJhY3RlciBzaXplIHRvIGBmb250LT51bml0c19wZXJfRU0nLgotICAgKgotICAgKiAgIEZUX0xPQURfTk9fSElOVElORyA6OgotICAgKiAgICAgRGlzYWJsZSBoaW50aW5nLiAgVGhpcyBnZW5lcmFsbHkgZ2VuZXJhdGVzIGBibHVycmllcicgYml0bWFwIGdseXBocwotICAgKiAgICAgd2hlbiB0aGUgZ2x5cGggYXJlIHJlbmRlcmVkIGluIGFueSBvZiB0aGUgYW50aS1hbGlhc2VkIG1vZGVzLiAgU2VlCi0gICAqICAgICBhbHNvIHRoZSBub3RlIGJlbG93LgotICAgKgotICAgKiAgICAgVGhpcyBmbGFnIGlzIGltcGxpZWQgYnkgQEZUX0xPQURfTk9fU0NBTEUuCi0gICAqCi0gICAqICAgRlRfTE9BRF9SRU5ERVIgOjoKLSAgICogICAgIENhbGwgQEZUX1JlbmRlcl9HbHlwaCBhZnRlciB0aGUgZ2x5cGggaXMgbG9hZGVkLiAgQnkgZGVmYXVsdCwgdGhlCi0gICAqICAgICBnbHlwaCBpcyByZW5kZXJlZCBpbiBARlRfUkVOREVSX01PREVfTk9STUFMIG1vZGUuICBUaGlzIGNhbiBiZQotICAgKiAgICAgb3ZlcnJpZGRlbiBieSBARlRfTE9BRF9UQVJHRVRfWFhYIG9yIEBGVF9MT0FEX01PTk9DSFJPTUUuCi0gICAqCi0gICAqICAgICBUaGlzIGZsYWcgaXMgdW5zZXQgYnkgQEZUX0xPQURfTk9fU0NBTEUuCi0gICAqCi0gICAqICAgRlRfTE9BRF9OT19CSVRNQVAgOjoKLSAgICogICAgIElnbm9yZSBiaXRtYXAgc3RyaWtlcyB3aGVuIGxvYWRpbmcuICBCaXRtYXAtb25seSBmb250cyBpZ25vcmUgdGhpcwotICAgKiAgICAgZmxhZy4KLSAgICoKLSAgICogICAgIEBGVF9MT0FEX05PX1NDQUxFIGFsd2F5cyBzZXRzIHRoaXMgZmxhZy4KLSAgICoKLSAgICogICBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCA6OgotICAgKiAgICAgTG9hZCB0aGUgZ2x5cGggZm9yIHZlcnRpY2FsIHRleHQgbGF5b3V0LiAgSW4gcGFydGljdWxhciwgdGhlCi0gICAqICAgICBgYWR2YW5jZScgdmFsdWUgaW4gdGhlIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlIGlzIHNldCB0byB0aGUKLSAgICogICAgIGB2ZXJ0QWR2YW5jZScgdmFsdWUgb2YgdGhlIGBtZXRyaWNzJyBmaWVsZC4KLSAgICoKLSAgICogICAgIEluIGNhc2UgQEZUX0hBU19WRVJUSUNBTCBkb2Vzbid0IHJldHVybiB0cnVlLCB5b3Ugc2hvdWxkbid0IHVzZQotICAgKiAgICAgdGhpcyBmbGFnIGN1cnJlbnRseS4gIFJlYXNvbiBpcyB0aGF0IGluIHRoaXMgY2FzZSB2ZXJ0aWNhbCBtZXRyaWNzCi0gICAqICAgICBnZXQgc3ludGhlc2l6ZWQsIGFuZCB0aG9zZSB2YWx1ZXMgYXJlIG5vdCBhbHdheXMgY29uc2lzdGVudCBhY3Jvc3MKLSAgICogICAgIHZhcmlvdXMgZm9udCBmb3JtYXRzLgotICAgKgotICAgKiAgIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgOjoKLSAgICogICAgIFByZWZlciB0aGUgYXV0by1oaW50ZXIgb3ZlciB0aGUgZm9udCdzIG5hdGl2ZSBoaW50ZXIuICBTZWUgYWxzbwotICAgKiAgICAgdGhlIG5vdGUgYmVsb3cuCi0gICAqCi0gICAqICAgRlRfTE9BRF9QRURBTlRJQyA6OgotICAgKiAgICAgTWFrZSB0aGUgZm9udCBkcml2ZXIgcGVyZm9ybSBwZWRhbnRpYyB2ZXJpZmljYXRpb25zIGR1cmluZyBnbHlwaAotICAgKiAgICAgbG9hZGluZy4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gZGV0ZWN0IGJyb2tlbiBnbHlwaHMgaW4gZm9udHMuCi0gICAqICAgICBCeSBkZWZhdWx0LCBGcmVlVHlwZSB0cmllcyB0byBoYW5kbGUgYnJva2VuIGZvbnRzIGFsc28uCi0gICAqCi0gICAqICAgICBJbiBwYXJ0aWN1bGFyLCBlcnJvcnMgZnJvbSB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgZW5naW5lIGFyZSBub3QKLSAgICogICAgIHBhc3NlZCB0byB0aGUgYXBwbGljYXRpb24gaWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQ7IHRoaXMgbWlnaHQKLSAgICogICAgIHJlc3VsdCBpbiBwYXJ0aWFsbHkgaGludGVkIG9yIGRpc3RvcnRlZCBnbHlwaHMgaW4gY2FzZSBhIGdseXBoJ3MKLSAgICogICAgIGJ5dGVjb2RlIGlzIGJ1Z2d5LgotICAgKgotICAgKiAgIEZUX0xPQURfTk9fUkVDVVJTRSA6OgotICAgKiAgICAgRG9uJ3QgbG9hZCBjb21wb3NpdGUgZ2x5cGhzIHJlY3Vyc2l2ZWx5LiAgSW5zdGVhZCwgdGhlIGZvbnQKLSAgICogICAgIGRyaXZlciBzaG91bGQgc2V0IHRoZSBgbnVtX3N1YmdseXBoJyBhbmQgYHN1YmdseXBocycgdmFsdWVzIG9mCi0gICAqICAgICB0aGUgZ2x5cGggc2xvdCBhY2NvcmRpbmdseSwgYW5kIHNldCBgZ2x5cGgtPmZvcm1hdCcgdG8KLSAgICogICAgIEBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFLiAgVGhlIGRlc2NyaXB0aW9uIG9mIHN1YmdseXBocyBjYW4KLSAgICogICAgIHRoZW4gYmUgYWNjZXNzZWQgd2l0aCBARlRfR2V0X1N1YkdseXBoX0luZm8uCi0gICAqCi0gICAqICAgICBUaGlzIGZsYWcgaW1wbGllcyBARlRfTE9BRF9OT19TQ0FMRSBhbmQgQEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STS4KLSAgICoKLSAgICogICBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0gOjoKLSAgICogICAgIElnbm9yZSB0aGUgdHJhbnNmb3JtIG1hdHJpeCBzZXQgYnkgQEZUX1NldF9UcmFuc2Zvcm0uCi0gICAqCi0gICAqICAgRlRfTE9BRF9NT05PQ0hST01FIDo6Ci0gICAqICAgICBUaGlzIGZsYWcgaXMgdXNlZCB3aXRoIEBGVF9MT0FEX1JFTkRFUiB0byBpbmRpY2F0ZSB0aGF0IHlvdSB3YW50IHRvCi0gICAqICAgICByZW5kZXIgYW4gb3V0bGluZSBnbHlwaCB0byBhIDEtYml0IG1vbm9jaHJvbWUgYml0bWFwIGdseXBoLCB3aXRoCi0gICAqICAgICA4fnBpeGVscyBwYWNrZWQgaW50byBlYWNoIGJ5dGUgb2YgdGhlIGJpdG1hcCBkYXRhLgotICAgKgotICAgKiAgICAgTm90ZSB0aGF0IHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaGludGluZyBhbGdvcml0aG0gdXNlZC4gIFlvdQotICAgKiAgICAgc2hvdWxkIHJhdGhlciB1c2UgQEZUX0xPQURfVEFSR0VUX01PTk8gc28gdGhhdCB0aGUKLSAgICogICAgIG1vbm9jaHJvbWUtb3B0aW1pemVkIGhpbnRpbmcgYWxnb3JpdGhtIGlzIHVzZWQuCi0gICAqCi0gICAqICAgRlRfTE9BRF9MSU5FQVJfREVTSUdOIDo6Ci0gICAqICAgICBLZWVwICBgbGluZWFySG9yaUFkdmFuY2UnIGFuZCBgbGluZWFyVmVydEFkdmFuY2UnIGZpZWxkcyBvZgotICAgKiAgICAgQEZUX0dseXBoU2xvdFJlYyBpbiBmb250IHVuaXRzLiAgU2VlIEBGVF9HbHlwaFNsb3RSZWMgZm9yCi0gICAqICAgICBkZXRhaWxzLgotICAgKgotICAgKiAgIEZUX0xPQURfTk9fQVVUT0hJTlQgOjoKLSAgICogICAgIERpc2FibGUgdGhlIGF1dG8taGludGVyLiAgU2VlIGFsc28gdGhlIG5vdGUgYmVsb3cuCi0gICAqCi0gICAqICAgRlRfTE9BRF9DT0xPUiA6OgotICAgKiAgICAgTG9hZCBlbWJlZGRlZCBjb2xvciBiaXRtYXAgaW1hZ2VzLiAgVGhlIHJlc3VsdGluZyBjb2xvciBiaXRtYXBzLAotICAgKiAgICAgaWYgYXZhaWxhYmxlLCB3aWxsIGhhdmUgdGhlIEBGVF9QSVhFTF9NT0RFX0JHUkEgZm9ybWF0LiAgSWYgdGhlCi0gICAqICAgICBmbGFnIGlzIG5vdCBzZXQgYW5kIGNvbG9yIGJpdG1hcHMgYXJlIGZvdW5kLCB0aGV5IGFyZSBjb252ZXJ0ZWQKLSAgICogICAgIHRvIDI1Ni1sZXZlbCBncmF5IGJpdG1hcHMgdHJhbnNwYXJlbnRseSwgdXNpbmcgdGhlCi0gICAqICAgICBARlRfUElYRUxfTU9ERV9HUkFZIGZvcm1hdC4KLSAgICoKLSAgICogICBGVF9MT0FEX0NPTVBVVEVfTUVUUklDUyA6OgotICAgKiAgICAgQ29tcHV0ZSBnbHlwaCBtZXRyaWNzIGZyb20gdGhlIGdseXBoIGRhdGEsIHdpdGhvdXQgdGhlIHVzZSBvZgotICAgKiAgICAgYnVuZGxlZCBtZXRyaWNzIHRhYmxlcyAoZm9yIGV4YW1wbGUsIHRoZSBgaGRteCcgdGFibGUgaW4gVHJ1ZVR5cGUKLSAgICogICAgIGZvbnRzKS4gIFRoaXMgZmxhZyBpcyBtYWlubHkgdXNlZCBieSBmb250IHZhbGlkYXRpbmcgb3IgZm9udAotICAgKiAgICAgZWRpdGluZyBhcHBsaWNhdGlvbnMsIHdoaWNoIG5lZWQgdG8gaWdub3JlLCB2ZXJpZnksIG9yIGVkaXQgdGhvc2UKLSAgICogICAgIHRhYmxlcy4KLSAgICoKLSAgICogICAgIEN1cnJlbnRseSwgdGhpcyBmbGFnIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIFRydWVUeXBlIGZvbnRzLgotICAgKgotICAgKiAgIEZUX0xPQURfQklUTUFQX01FVFJJQ1NfT05MWSA6OgotICAgKiAgICAgUmVxdWVzdCBsb2FkaW5nIG9mIHRoZSBtZXRyaWNzIGFuZCBiaXRtYXAgaW1hZ2UgaW5mb3JtYXRpb24gb2YgYQotICAgKiAgICAgKHBvc3NpYmx5IGVtYmVkZGVkKSBiaXRtYXAgZ2x5cGggd2l0aG91dCBhbGxvY2F0aW5nIG9yIGNvcHlpbmcKLSAgICogICAgIHRoZSBiaXRtYXAgaW1hZ2UgZGF0YSBpdHNlbGYuICBObyBlZmZlY3QgaWYgdGhlIHRhcmdldCBnbHlwaCBpcwotICAgKiAgICAgbm90IGEgYml0bWFwIGltYWdlLgotICAgKgotICAgKiAgICAgVGhpcyBmbGFnIHVuc2V0cyBARlRfTE9BRF9SRU5ERVIuCi0gICAqCi0gICAqICAgRlRfTE9BRF9DUk9QX0JJVE1BUCA6OgotICAgKiAgICAgSWdub3JlZC4gIERlcHJlY2F0ZWQuCi0gICAqCi0gICAqICAgRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggOjoKLSAgICogICAgIElnbm9yZWQuICBEZXByZWNhdGVkLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBCeSBkZWZhdWx0LCBoaW50aW5nIGlzIGVuYWJsZWQgYW5kIHRoZSBmb250J3MgbmF0aXZlIGhpbnRlciAoc2VlCi0gICAqICAgQEZUX0ZBQ0VfRkxBR19ISU5URVIpIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBhdXRvLWhpbnRlci4gIFlvdSBjYW4KLSAgICogICBkaXNhYmxlIGhpbnRpbmcgYnkgc2V0dGluZyBARlRfTE9BRF9OT19ISU5USU5HIG9yIGNoYW5nZSB0aGUKLSAgICogICBwcmVjZWRlbmNlIGJ5IHNldHRpbmcgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQuICBZb3UgY2FuIGFsc28gc2V0Ci0gICAqICAgQEZUX0xPQURfTk9fQVVUT0hJTlQgaW4gY2FzZSB5b3UgZG9uJ3Qgd2FudCB0aGUgYXV0by1oaW50ZXIgdG8gYmUKLSAgICogICB1c2VkIGF0IGFsbC4KLSAgICoKLSAgICogICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBGVF9GQUNFX0ZMQUdfVFJJQ0tZIGZvciBhIHNwZWNpYWwgZXhjZXB0aW9uCi0gICAqICAgKGFmZmVjdGluZyBvbmx5IGEgaGFuZGZ1bCBvZiBBc2lhbiBmb250cykuCi0gICAqCi0gICAqICAgQmVzaWRlcyBkZWNpZGluZyB3aGljaCBoaW50ZXIgdG8gdXNlLCB5b3UgY2FuIGFsc28gZGVjaWRlIHdoaWNoCi0gICAqICAgaGludGluZyBhbGdvcml0aG0gdG8gdXNlLiAgU2VlIEBGVF9MT0FEX1RBUkdFVF9YWFggZm9yIGRldGFpbHMuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IHRoZSBhdXRvLWhpbnRlciBuZWVkcyBhIHZhbGlkIFVuaWNvZGUgY21hcCAoZWl0aGVyIGEgbmF0aXZlCi0gICAqICAgb25lIG9yIHN5bnRoZXNpemVkIGJ5IEZyZWVUeXBlKSBmb3IgcHJvZHVjaW5nIGNvcnJlY3QgcmVzdWx0cy4gIElmIGEKLSAgICogICBmb250IHByb3ZpZGVzIGFuIGluY29ycmVjdCBtYXBwaW5nIChmb3IgZXhhbXBsZSwgYXNzaWduaW5nIHRoZQotICAgKiAgIGNoYXJhY3RlciBjb2RlIFUrMDA1QSwgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiwgdG8gYSBnbHlwaCBkZXBpY3RpbmcgYQotICAgKiAgIG1hdGhlbWF0aWNhbCBpbnRlZ3JhbCBzaWduKSwgdGhlIGF1dG8taGludGVyIG1pZ2h0IHByb2R1Y2UgdXNlbGVzcwotICAgKiAgIHJlc3VsdHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9MT0FEX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIEZUX0xPQURfTk9fU0NBTEUgICAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDAgKQotI2RlZmluZSBGVF9MT0FEX05PX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAxICkKLSNkZWZpbmUgRlRfTE9BRF9SRU5ERVIgICAgICAgICAgICAgICAgICAgICAgICggMUwgPDwgMiApCi0jZGVmaW5lIEZUX0xPQURfTk9fQklUTUFQICAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDMgKQotI2RlZmluZSBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCAgICAgICAgICAgICAgKCAxTCA8PCA0ICkKLSNkZWZpbmUgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCAgICAgICAgICAgICAgICggMUwgPDwgNSApCi0jZGVmaW5lIEZUX0xPQURfQ1JPUF9CSVRNQVAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDYgKQotI2RlZmluZSBGVF9MT0FEX1BFREFOVElDICAgICAgICAgICAgICAgICAgICAgKCAxTCA8PCA3ICkKLSNkZWZpbmUgRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggICggMUwgPDwgOSApCi0jZGVmaW5lIEZUX0xPQURfTk9fUkVDVVJTRSAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDEwICkKLSNkZWZpbmUgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNICAgICAgICAgICAgICggMUwgPDwgMTEgKQotI2RlZmluZSBGVF9MT0FEX01PTk9DSFJPTUUgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAxMiApCi0jZGVmaW5lIEZUX0xPQURfTElORUFSX0RFU0lHTiAgICAgICAgICAgICAgICAoIDFMIDw8IDEzICkKLSNkZWZpbmUgRlRfTE9BRF9OT19BVVRPSElOVCAgICAgICAgICAgICAgICAgICggMUwgPDwgMTUgKQotICAvKiBCaXRzIDE2LTE5IGFyZSB1c2VkIGJ5IGBGVF9MT0FEX1RBUkdFVF8nICovCi0jZGVmaW5lIEZUX0xPQURfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDIwICkKLSNkZWZpbmUgRlRfTE9BRF9DT01QVVRFX01FVFJJQ1MgICAgICAgICAgICAgICggMUwgPDwgMjEgKQotI2RlZmluZSBGVF9MT0FEX0JJVE1BUF9NRVRSSUNTX09OTFkgICAgICAgICAgKCAxTCA8PCAyMiApCi0KLSAgLyogKi8KLQotICAvKiB1c2VkIGludGVybmFsbHkgb25seSBieSBjZXJ0YWluIGZvbnQgZHJpdmVycyAqLwotI2RlZmluZSBGVF9MT0FEX0FEVkFOQ0VfT05MWSAgICAgICAgICAgICAgICAgKCAxTCA8PCA4ICkKLSNkZWZpbmUgRlRfTE9BRF9TQklUU19PTkxZICAgICAgICAgICAgICAgICAgICggMUwgPDwgMTQgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX0xPQURfVEFSR0VUX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbHVlcyB0byBzZWxlY3QgYSBzcGVjaWZpYyBoaW50aW5nIGFsZ29yaXRobSBmb3IgdGhlCi0gICAqICAgaGludGVyLiAgWW91IHNob3VsZCBPUiBvbmUgb2YgdGhlc2UgdmFsdWVzIHRvIHlvdXIgYGxvYWRfZmxhZ3MnCi0gICAqICAgd2hlbiBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCBhIGZvbnQncyBuYXRpdmUgaGludGVycyBtYXkgaWdub3JlIHRoZSBoaW50aW5nIGFsZ29yaXRobQotICAgKiAgIHlvdSBoYXZlIHNwZWNpZmllZCAoZS5nLiwgdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyKS4gIFlvdQotICAgKiAgIGNhbiBzZXQgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgdG8gZW5zdXJlIHRoYXQgdGhlIGF1dG8taGludGVyIGlzCi0gICAqICAgdXNlZC4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgOjoKLSAgICogICAgIFRoZSBkZWZhdWx0IGhpbnRpbmcgYWxnb3JpdGhtLCBvcHRpbWl6ZWQgZm9yIHN0YW5kYXJkIGdyYXktbGV2ZWwKLSAgICogICAgIHJlbmRlcmluZy4gIEZvciBtb25vY2hyb21lIG91dHB1dCwgdXNlIEBGVF9MT0FEX1RBUkdFVF9NT05PCi0gICAqICAgICBpbnN0ZWFkLgotICAgKgotICAgKiAgIEZUX0xPQURfVEFSR0VUX0xJR0hUIDo6Ci0gICAqICAgICBBIGxpZ2h0ZXIgaGludGluZyBhbGdvcml0aG0gZm9yIGdyYXktbGV2ZWwgbW9kZXMuICBNYW55IGdlbmVyYXRlZAotICAgKiAgICAgZ2x5cGhzIGFyZSBmdXp6aWVyIGJ1dCBiZXR0ZXIgcmVzZW1ibGUgdGhlaXIgb3JpZ2luYWwgc2hhcGUuICBUaGlzCi0gICAqICAgICBpcyBhY2hpZXZlZCBieSBzbmFwcGluZyBnbHlwaHMgdG8gdGhlIHBpeGVsIGdyaWQgb25seSB2ZXJ0aWNhbGx5Ci0gICAqICAgICAoWS1heGlzKSwgYXMgaXMgZG9uZSBieSBGcmVlVHlwZSdzIG5ldyBDRkYgZW5naW5lIG9yIE1pY3Jvc29mdCdzCi0gICAqICAgICBDbGVhclR5cGUgZm9udCByZW5kZXJlci4gIFRoaXMgcHJlc2VydmVzIGludGVyLWdseXBoIHNwYWNpbmcgaW4KLSAgICogICAgIGhvcml6b250YWwgdGV4dC4gIFRoZSBzbmFwcGluZyBpcyBkb25lIGVpdGhlciBieSB0aGUgbmF0aXZlIGZvbnQKLSAgICogICAgIGRyaXZlciwgaWYgdGhlIGRyaXZlciBpdHNlbGYgYW5kIHRoZSBmb250IHN1cHBvcnQgaXQsIG9yIGJ5IHRoZQotICAgKiAgICAgYXV0by1oaW50ZXIuCi0gICAqCi0gICAqICAgICBBZHZhbmNlIHdpZHRocyBhcmUgcm91bmRlZCB0byBpbnRlZ2VyIHZhbHVlczsgaG93ZXZlciwgdXNpbmcgdGhlCi0gICAqICAgICBgbHNiX2RlbHRhJyBhbmQgYHJzYl9kZWx0YScgZmllbGRzIG9mIEBGVF9HbHlwaFNsb3RSZWMsIGl0IGlzCi0gICAqICAgICBwb3NzaWJsZSB0byBnZXQgZnJhY3Rpb25hbCBhZHZhbmNlIHdpZHRocyBmb3Igc3ViLXBpeGVsIHBvc2l0aW9uaW5nCi0gICAqICAgICAod2hpY2ggaXMgcmVjb21tZW5kZWQgdG8gdXNlKS4KLSAgICoKLSAgICogICAgIElmIGNvbmZpZ3VyYXRpb24gb3B0aW9uIEFGX0NPTkZJR19PUFRJT05fVFRfU0laRV9NRVRSSUNTIGlzIGFjdGl2ZSwKLSAgICogICAgIFRydWVUeXBlLWxpa2UgbWV0cmljcyBhcmUgdXNlZCB0byBtYWtlIHRoaXMgbW9kZSBiZWhhdmUgc2ltaWxhcmx5Ci0gICAqICAgICBhcyBpbiB1bnBhdGNoZWQgRnJlZVR5cGUgdmVyc2lvbnMgYmV0d2VlbiAyLjQuNiBhbmQgMi43LjEKLSAgICogICAgIChpbmNsdXNpdmUpLgotICAgKgotICAgKiAgIEZUX0xPQURfVEFSR0VUX01PTk8gOjoKLSAgICogICAgIFN0cm9uZyBoaW50aW5nIGFsZ29yaXRobSB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIG1vbm9jaHJvbWUKLSAgICogICAgIG91dHB1dC4gIFRoZSByZXN1bHQgaXMgcHJvYmFibHkgdW5wbGVhc2FudCBpZiB0aGUgZ2x5cGggaXMgcmVuZGVyZWQKLSAgICogICAgIGluIG5vbi1tb25vY2hyb21lIG1vZGVzLgotICAgKgotICAgKiAgIEZUX0xPQURfVEFSR0VUX0xDRCA6OgotICAgKiAgICAgQSB2YXJpYW50IG9mIEBGVF9MT0FEX1RBUkdFVF9MSUdIVCBvcHRpbWl6ZWQgZm9yIGhvcml6b250YWxseQotICAgKiAgICAgZGVjaW1hdGVkIExDRCBkaXNwbGF5cy4KLSAgICoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9MQ0RfViA6OgotICAgKiAgICAgQSB2YXJpYW50IG9mIEBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgb3B0aW1pemVkIGZvciB2ZXJ0aWNhbGx5Ci0gICAqICAgICBkZWNpbWF0ZWQgTENEIGRpc3BsYXlzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIHVzZSBvbmx5IF9vbmVfIG9mIHRoZSBGVF9MT0FEX1RBUkdFVF9YWFggdmFsdWVzIGluIHlvdXIKLSAgICogICBgbG9hZF9mbGFncycuICBUaGV5IGNhbid0IGJlIE9SZWQuCi0gICAqCi0gICAqICAgSWYgQEZUX0xPQURfUkVOREVSIGlzIGFsc28gc2V0LCB0aGUgZ2x5cGggaXMgcmVuZGVyZWQgaW4gdGhlCi0gICAqICAgY29ycmVzcG9uZGluZyBtb2RlIChpLmUuLCB0aGUgbW9kZSB0aGF0IG1hdGNoZXMgdGhlIHVzZWQgYWxnb3JpdGhtCi0gICAqICAgYmVzdCkuICBBbiBleGNlcHRpb24gaXMgRlRfTE9BRF9UQVJHRVRfTU9OTyBzaW5jZSBpdCBpbXBsaWVzCi0gICAqICAgQEZUX0xPQURfTU9OT0NIUk9NRS4KLSAgICoKLSAgICogICBZb3UgY2FuIHVzZSBhIGhpbnRpbmcgYWxnb3JpdGhtIHRoYXQgZG9lc24ndCBjb3JyZXNwb25kIHRvIHRoZSBzYW1lCi0gICAqICAgcmVuZGVyaW5nIG1vZGUuICBBcyBhbiBleGFtcGxlLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIGBsaWdodCcKLSAgICogICBoaW50aW5nIGFsZ29yaXRobSBhbmQgaGF2ZSB0aGUgcmVzdWx0cyByZW5kZXJlZCBpbiBob3Jpem9udGFsIExDRAotICAgKiAgIHBpeGVsIG1vZGUsIHdpdGggY29kZSBsaWtlCi0gICAqCi0gICAqICAgICB7Ci0gICAqICAgICAgIEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LAotICAgKiAgICAgICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzIHwgRlRfTE9BRF9UQVJHRVRfTElHSFQgKTsKLSAgICoKLSAgICogICAgICAgRlRfUmVuZGVyX0dseXBoKCBmYWNlLT5nbHlwaCwgRlRfUkVOREVSX01PREVfTENEICk7Ci0gICAqICAgICB9Ci0gICAqCi0gICAqICAgSW4gZ2VuZXJhbCwgeW91IHNob3VsZCBzdGljayB3aXRoIG9uZSByZW5kZXJpbmcgbW9kZS4gIEZvciBleGFtcGxlLAotICAgKiAgIHN3aXRjaGluZyBiZXR3ZWVuIEBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgYW5kIEBGVF9MT0FEX1RBUkdFVF9NT05PCi0gICAqICAgZW5mb3JjZXMgYSBsb3Qgb2YgcmVjb21wdXRhdGlvbiBmb3IgVHJ1ZVR5cGUgZm9udHMsIHdoaWNoIGlzIHNsb3cuCi0gICAqICAgQW5vdGhlciByZWFzb24gaXMgY2FjaGluZzogU2VsZWN0aW5nIGEgZGlmZmVyZW50IG1vZGUgdXN1YWxseSBjYXVzZXMKLSAgICogICBjaGFuZ2VzIGluIGJvdGggdGhlIG91dGxpbmVzIGFuZCB0aGUgcmFzdGVyaXplZCBiaXRtYXBzOyBpdCBpcyB0aHVzCi0gICAqICAgbmVjZXNzYXJ5IHRvIGVtcHR5IHRoZSBjYWNoZSBhZnRlciBhIG1vZGUgc3dpdGNoIHRvIGF2b2lkIGZhbHNlIGhpdHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF8oIHggKSAgICggKEZUX0ludDMyKSggKHgpICYgMTUgKSA8PCAxNiApCi0KLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTk9STUFMICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX05PUk1BTCApCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xJR0hUICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MSUdIVCAgKQotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9NT05PICAgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTU9OTyAgICkKLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTENEICAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX0xDRCAgICApCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xDRF9WICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MQ0RfViAgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9NT0RFCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIEBGVF9SZW5kZXJfTW9kZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAgICogICBARlRfTE9BRF9UQVJHRVRfWFhYIHZhbHVlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTU9ERSggeCApICAoIChGVF9SZW5kZXJfTW9kZSkoICggKHgpID4+IDE2ICkgJiAxNSApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCB0aGUgdHJhbnNmb3JtYXRpb24gdGhhdCBpcyBhcHBsaWVkIHRvIGdseXBoIGltYWdlcyB3aGVuIHRoZXkgICAqLwotICAvKiAgICBhcmUgbG9hZGVkIGludG8gYSBnbHlwaCBzbG90IHRocm91Z2ggQEZUX0xvYWRfR2x5cGguICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggOjogQSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbidzIDJ4MiBtYXRyaXguICBVc2UgTlVMTCAgKi8KLSAgLyogICAgICAgICAgICAgIGZvciB0aGUgaWRlbnRpdHkgbWF0cml4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRyYW5zbGF0aW9uIHZlY3Rvci4gIFVzZSBOVUxMIGZvciB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgbnVsbCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdHJhbnNmb3JtYXRpb24gaXMgb25seSBhcHBsaWVkIHRvIHNjYWxhYmxlIGltYWdlIGZvcm1hdHMgYWZ0ZXIgKi8KLSAgLyogICAgdGhlIGdseXBoIGhhcyBiZWVuIGxvYWRlZC4gIEl0IG1lYW5zIHRoYXQgaGludGluZyBpcyB1bmFsdGVyZWQgYnkgICovCi0gIC8qICAgIHRoZSB0cmFuc2Zvcm1hdGlvbiBhbmQgaXMgcGVyZm9ybWVkIG9uIHRoZSBjaGFyYWN0ZXIgc2l6ZSBnaXZlbiBpbiAqLwotICAvKiAgICB0aGUgbGFzdCBjYWxsIHRvIEBGVF9TZXRfQ2hhcl9TaXplIG9yIEBGVF9TZXRfUGl4ZWxfU2l6ZXMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aGlzIGFsc28gdHJhbnNmb3JtcyB0aGUgYGZhY2UuZ2x5cGguYWR2YW5jZScgZmllbGQsIGJ1dCAqLwotICAvKiAgICAqbm90KiB0aGUgdmFsdWVzIGluIGBmYWNlLmdseXBoLm1ldHJpY3MnLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1NldF9UcmFuc2Zvcm0oIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgZGVsdGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlciBtb2RlcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGV+Mi4gIEVhY2ggbW9kZSBjb3JyZXNwb25kcyB0byBhICAqLwotICAvKiAgICBzcGVjaWZpYyB0eXBlIG9mIHNjYW5saW5lIGNvbnZlcnNpb24gcGVyZm9ybWVkIG9uIHRoZSBvdXRsaW5lLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBiaXRtYXAgZm9udHMgYW5kIGVtYmVkZGVkIGJpdG1hcHMgdGhlIGBiaXRtYXAtPnBpeGVsX21vZGUnICAgICAqLwotICAvKiAgICBmaWVsZCBpbiB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIGZvcm1hdCBvZiB0aGUgICAgKi8KLSAgLyogICAgcmV0dXJuZWQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbGwgbW9kZXMgZXhjZXB0IEBGVF9SRU5ERVJfTU9ERV9NT05PIHVzZSAyNTYgbGV2ZWxzIG9mIG9wYWNpdHksICAgKi8KLSAgLyogICAgaW5kaWNhdGluZyBwaXhlbCBjb3ZlcmFnZS4gIFVzZSBsaW5lYXIgYWxwaGEgYmxlbmRpbmcgYW5kIGdhbW1hICAgICovCi0gIC8qICAgIGNvcnJlY3Rpb24gdG8gY29ycmVjdGx5IHJlbmRlciBub24tbW9ub2Nocm9tZSBnbHlwaCBiaXRtYXBzIG9udG8gYSAqLwotICAvKiAgICBzdXJmYWNlOyBzZWUgQEZUX1JlbmRlcl9HbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBEZWZhdWx0IHJlbmRlciBtb2RlOyBpdCBjb3JyZXNwb25kcyB0byA4LWJpdCBhbnRpLWFsaWFzZWQgICAgICAgICovCi0gIC8qICAgICAgYml0bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTElHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIEBGVF9SRU5ERVJfTU9ERV9OT1JNQUwuICBJdCBpcyBvbmx5ICAgICAgICAqLwotICAvKiAgICAgIGRlZmluZWQgYXMgYSBzZXBhcmF0ZSB2YWx1ZSBiZWNhdXNlIHJlbmRlciBtb2RlcyBhcmUgYWxzbyB1c2VkICAgKi8KLSAgLyogICAgICBpbmRpcmVjdGx5IHRvIGRlZmluZSBoaW50aW5nIGFsZ29yaXRobSBzZWxlY3RvcnMuICBTZWUgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0xPQURfVEFSR0VUX1hYWCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTU9OTyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIDEtYml0IGJpdG1hcHMgKHdpdGggMn5sZXZlbHMgb2YgICAgICAgICAqLwotICAvKiAgICAgIG9wYWNpdHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xDRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byBob3Jpem9udGFsIFJHQiBhbmQgQkdSIHN1Yi1waXhlbCAgICAgICAgKi8KLSAgLyogICAgICBkaXNwbGF5cyBsaWtlIExDRCBzY3JlZW5zLiAgSXQgcHJvZHVjZXMgOC1iaXQgYml0bWFwcyB0aGF0IGFyZSAgICovCi0gIC8qICAgICAgM350aW1lcyB0aGUgd2lkdGggb2YgdGhlIG9yaWdpbmFsIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzLCBhbmQgICAqLwotICAvKiAgICAgIHdoaWNoIHVzZSB0aGUgQEZUX1BJWEVMX01PREVfTENEIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xDRF9WIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byB2ZXJ0aWNhbCBSR0IgYW5kIEJHUiBzdWItcGl4ZWwgZGlzcGxheXMgKi8KLSAgLyogICAgICAobGlrZSBQREEgc2NyZWVucywgcm90YXRlZCBMQ0QgZGlzcGxheXMsIGV0Yy4pLiAgSXQgcHJvZHVjZXMgICAgICovCi0gIC8qICAgICAgOC1iaXQgYml0bWFwcyB0aGF0IGFyZSAzfnRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIG9yaWdpbmFsICAgICAgICAqLwotICAvKiAgICAgIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzIGFuZCB1c2UgdGhlIEBGVF9QSVhFTF9NT0RFX0xDRF9WIG1vZGUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgTENELW9wdGltaXplZCBnbHlwaCBiaXRtYXBzIHByb2R1Y2VkIGJ5IGBGVF9SZW5kZXJfR2x5cGgnIGNhbiAgKi8KLSAgLyogICAgYmUgZmlsdGVyZWQgdG8gcmVkdWNlIGNvbG9yLWZyaW5nZXMgYnkgdXNpbmcgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciAobm90IGFjdGl2ZSBpbiB0aGUgZGVmYXVsdCBidWlsZHMpLiAgSXQgICAqLwotICAvKiAgICBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGVpdGhlciBjYWxsIGBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcicgKGlmICAgKi8KLSAgLyogICAgYXZhaWxhYmxlKSBvciBkbyB0aGUgZmlsdGVyaW5nIGl0c2VsZi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc2VsZWN0ZWQgcmVuZGVyIG1vZGUgb25seSBhZmZlY3RzIHZlY3RvciBnbHlwaHMgb2YgYSBmb250LiAgICAgKi8KLSAgLyogICAgRW1iZWRkZWQgYml0bWFwcyBvZnRlbiBoYXZlIGEgZGlmZmVyZW50IHBpeGVsIG1vZGUgbGlrZSAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9QSVhFTF9NT0RFX01PTk8uICBZb3UgY2FuIHVzZSBARlRfQml0bWFwX0NvbnZlcnQgdG8gdHJhbnNmb3JtICAqLwotICAvKiAgICB0aGVtIGludG8gOC1iaXQgcGl4bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfUmVuZGVyX01vZGVfCi0gIHsKLSAgICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgPSAwLAotICAgIEZUX1JFTkRFUl9NT0RFX0xJR0hULAotICAgIEZUX1JFTkRFUl9NT0RFX01PTk8sCi0gICAgRlRfUkVOREVSX01PREVfTENELAotICAgIEZUX1JFTkRFUl9NT0RFX0xDRF9WLAotCi0gICAgRlRfUkVOREVSX01PREVfTUFYCi0KLSAgfSBGVF9SZW5kZXJfTW9kZTsKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9SZW5kZXJfTW9kZScgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X3JlbmRlcl9tb2RlX25vcm1hbCAgRlRfUkVOREVSX01PREVfTk9STUFMCi0jZGVmaW5lIGZ0X3JlbmRlcl9tb2RlX21vbm8gICAgRlRfUkVOREVSX01PREVfTU9OTwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29udmVydCBhIGdpdmVuIGdseXBoIGltYWdlIHRvIGEgYml0bWFwLiAgSXQgZG9lcyBzbyBieSBpbnNwZWN0aW5nICovCi0gIC8qICAgIHRoZSBnbHlwaCBpbWFnZSBmb3JtYXQsIGZpbmRpbmcgdGhlIHJlbGV2YW50IHJlbmRlcmVyLCBhbmQgICAgICAgICAqLwotICAvKiAgICBpbnZva2luZyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgZ2x5cGggc2xvdCBjb250YWluaW5nIHRoZSBpbWFnZSB0byAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY29udmVydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyX21vZGUgOjogVGhlIHJlbmRlciBtb2RlIHVzZWQgdG8gcmVuZGVyIHRoZSBnbHlwaCBpbWFnZSBpbnRvICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGEgYml0bWFwLiAgU2VlIEBGVF9SZW5kZXJfTW9kZSBmb3IgYSBsaXN0IG9mICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgbWVhbmluZ2Z1bCByZXN1bHRzLCBmb250IHNjYWxpbmcgdmFsdWVzIG11c3QgYmUgc2V0IHdpdGggICAgKi8KLSAgLyogICAgZnVuY3Rpb25zIGxpa2UgQEZUX1NldF9DaGFyX1NpemUgYmVmb3JlIGNhbGxpbmcgYEZUX1JlbmRlcl9HbHlwaCcuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZyZWVUeXBlIG91dHB1dHMgYSBiaXRtYXAgb2YgYSBnbHlwaCwgaXQgcmVhbGx5IG91dHB1dHMgYW4gICAgKi8KLSAgLyogICAgYWxwaGEgY292ZXJhZ2UgbWFwLiAgSWYgYSBwaXhlbCBpcyBjb21wbGV0ZWx5IGNvdmVyZWQgYnkgYSAgICAgICAgICovCi0gIC8qICAgIGZpbGxlZC1pbiBvdXRsaW5lLCB0aGUgYml0bWFwIGNvbnRhaW5zIDB4RkYgYXQgdGhhdCBwaXhlbCwgbWVhbmluZyAqLwotICAvKiAgICB0aGF0IDB4RkYvMHhGRiBmcmFjdGlvbiBvZiB0aGF0IHBpeGVsIGlzIGNvdmVyZWQsIG1lYW5pbmcgdGhlICAgICAgKi8KLSAgLyogICAgcGl4ZWwgaXMgMTAwJSBibGFjayAob3IgMCUgYnJpZ2h0KS4gIElmIGEgcGl4ZWwgaXMgb25seSA1MCUgICAgICAgICovCi0gIC8qICAgIGNvdmVyZWQgKHZhbHVlIDB4ODApLCB0aGUgcGl4ZWwgaXMgbWFkZSA1MCUgYmxhY2sgKDUwJSBicmlnaHQgb3IgYSAqLwotICAvKiAgICBtaWRkbGUgc2hhZGUgb2YgZ3JleSkuICAwJSBjb3ZlcmVkIG1lYW5zIDAlIGJsYWNrICgxMDAlIGJyaWdodCBvciAgKi8KLSAgLyogICAgd2hpdGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbiBoaWdoLURQSSBzY3JlZW5zIGxpa2Ugb24gc21hcnRwaG9uZXMgYW5kIHRhYmxldHMsIHRoZSBwaXhlbHMgICAgKi8KLSAgLyogICAgYXJlIHNvIHNtYWxsIHRoYXQgdGhlaXIgY2hhbmNlIG9mIGJlaW5nIGNvbXBsZXRlbHkgY292ZXJlZCBhbmQgICAgICovCi0gIC8qICAgIHRoZXJlZm9yZSBjb21wbGV0ZWx5IGJsYWNrIGFyZSBmYWlybHkgZ29vZC4gIE9uIHRoZSBsb3ctRFBJICAgICAgICAqLwotICAvKiAgICBzY3JlZW5zLCBob3dldmVyLCB0aGUgc2l0dWF0aW9uIGlzIGRpZmZlcmVudC4gIFRoZSBwaXhlbHMgYXJlIHRvbyAgKi8KLSAgLyogICAgbGFyZ2UgZm9yIG1vc3Qgb2YgdGhlIGRldGFpbHMgb2YgYSBnbHlwaCBhbmQgc2hhZGVzIG9mIGdyYXkgYXJlICAgICovCi0gIC8qICAgIHRoZSBub3JtIHJhdGhlciB0aGFuIHRoZSBleGNlcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyByZWxldmFudCBiZWNhdXNlIGFsbCBvdXIgc2NyZWVucyBoYXZlIGEgc2Vjb25kIHByb2JsZW06ICAgICovCi0gIC8qICAgIHRoZXkgYXJlIG5vdCBsaW5lYXIuICAxfit+MSBpcyBub3R+Mi4gIFR3aWNlIHRoZSB2YWx1ZSBkb2VzIG5vdCAgICAqLwotICAvKiAgICByZXN1bHQgaW4gdHdpY2UgdGhlIGJyaWdodG5lc3MuICBXaGVuIGEgcGl4ZWwgaXMgb25seSA1MCUgY292ZXJlZCwgKi8KLSAgLyogICAgdGhlIGNvdmVyYWdlIG1hcCBzYXlzIDUwJSBibGFjaywgYW5kIHRoaXMgdHJhbnNsYXRlcyB0byBhIHBpeGVsICAgICovCi0gIC8qICAgIHZhbHVlIG9mIDEyOCB3aGVuIHlvdSB1c2UgOH5iaXRzIHBlciBjaGFubmVsICgwLTI1NSkuICBIb3dldmVyLCAgICAqLwotICAvKiAgICB0aGlzIGRvZXMgbm90IHRyYW5zbGF0ZSB0byA1MCUgYnJpZ2h0bmVzcyBmb3IgdGhhdCBwaXhlbCBvbiBvdXIgICAgKi8KLSAgLyogICAgc1JHQiBhbmQgZ2FtbWF+Mi4yIHNjcmVlbnMuICBEdWUgdG8gdGhlaXIgbm9uLWxpbmVhcml0eSwgdGhleSAgICAgICovCi0gIC8qICAgIGR3ZWxsIGxvbmdlciBpbiB0aGUgZGFya3MgYW5kIG9ubHkgYSBwaXhlbCB2YWx1ZSBvZiBhYm91dCAxODYgICAgICAqLwotICAvKiAgICByZXN1bHRzIGluIDUwJSBicmlnaHRuZXNzIC0tIDEyOCBlbmRzIHVwIHRvbyBkYXJrIG9uIGJvdGggYnJpZ2h0ICAgKi8KLSAgLyogICAgYW5kIGRhcmsgYmFja2dyb3VuZHMuICBUaGUgbmV0IHJlc3VsdCBpcyB0aGF0IGRhcmsgdGV4dCBsb29rcyAgICAgICovCi0gIC8qICAgIGJ1cm50LW91dCwgcGl4ZWx5IGFuZCBibG90Y2h5IG9uIGJyaWdodCBiYWNrZ3JvdW5kLCBicmlnaHQgdGV4dCAgICAqLwotICAvKiAgICB0b28gZnJhaWwgb24gZGFyayBiYWNrZ3JvdW5kcywgYW5kIGNvbG9yZWQgdGV4dCBvbiBjb2xvcmVkICAgICAgICAgKi8KLSAgLyogICAgYmFja2dyb3VuZCAoZm9yIGV4YW1wbGUsIHJlZCBvbiBncmVlbikgc2VlbXMgdG8gaGF2ZSBkYXJrIGhhbG9zIG9yICovCi0gIC8qICAgIGBkaXJ0JyBhcm91bmQgaXQuICBUaGUgc2l0dWF0aW9uIGlzIGVzcGVjaWFsbHkgdWdseSBmb3IgZGlhZ29uYWwgICAqLwotICAvKiAgICBzdGVtcyBsaWtlIGluIGB3JyBnbHlwaCBzaGFwZXMgd2hlcmUgdGhlIHF1YWxpdHkgb2YgRnJlZVR5cGUncyAgICAgKi8KLSAgLyogICAgYW50aS1hbGlhc2luZyBkZXBlbmRzIG9uIHRoZSBjb3JyZWN0IGRpc3BsYXkgb2YgZ3JheXMuICBPbiAgICAgICAgICovCi0gIC8qICAgIGhpZ2gtRFBJIHNjcmVlbnMgd2hlcmUgc21hbGxlciwgZnVsbHkgYmxhY2sgcGl4ZWxzIHJlaWduIHN1cHJlbWUsICAqLwotICAvKiAgICB0aGlzIGRvZXNuJ3QgbWF0dGVyLCBidXQgb24gb3VyIGxvdy1EUEkgc2NyZWVucyB3aXRoIGFsbCB0aGUgZ3JheSAgKi8KLSAgLyogICAgc2hhZGVzLCBpdCBkb2VzLiAgMCUgYW5kIDEwMCUgYnJpZ2h0bmVzcyBhcmUgdGhlIHNhbWUgdGhpbmdzIGluICAgICovCi0gIC8qICAgIGxpbmVhciBhbmQgbm9uLWxpbmVhciBzcGFjZSwganVzdCBhbGwgdGhlIHNoYWRlcyBpbi1iZXR3ZWVuICAgICAgICAqLwotICAvKiAgICBhcmVuJ3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBibGVuZGluZyBmdW5jdGlvbiBmb3IgcGxhY2luZyB0ZXh0IG92ZXIgYSBiYWNrZ3JvdW5kIGlzICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZHN0ID0gYWxwaGEgKiBzcmMgKyAoMSAtIGFscGhhKSAqIGRzdCAgICAsICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdoaWNoIGlzIGtub3duIGFzIHRoZSBPVkVSIG9wZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gY29ycmVjdGx5IGNvbXBvc2l0ZSBhbiBhbnRpYWxpYXNlZCBwaXhlbCBvZiBhIGdseXBoIG9udG8gYSAgICAgICovCi0gIC8qICAgIHN1cmZhY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMS4gdGFrZSB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgKGUuZy4sIGluIHNSR0Igc3BhY2UpICovCi0gIC8qICAgICAgIGFuZCBhcHBseSBnYW1tYSB0byBnZXQgdGhlbSBpbiBhIGxpbmVhciBzcGFjZSwgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4gdXNlIE9WRVIgdG8gYmxlbmQgdGhlIHR3byBsaW5lYXIgY29sb3JzIHVzaW5nIHRoZSBnbHlwaCBwaXhlbCAgICovCi0gIC8qICAgICAgIGFzIHRoZSBhbHBoYSB2YWx1ZSAocmVtZW1iZXIsIHRoZSBnbHlwaCBiaXRtYXAgaXMgYW4gYWxwaGEgICAgICAqLwotICAvKiAgICAgICBjb3ZlcmFnZSBiaXRtYXApLCBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDMuIGFwcGx5IGludmVyc2UgZ2FtbWEgdG8gdGhlIGJsZW5kZWQgcGl4ZWwgYW5kIHdyaXRlIGl0IGJhY2sgdG8gICAqLwotICAvKiAgICAgICB0aGUgaW1hZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEludGVybmFsIHRlc3RpbmcgYXQgQWRvYmUgZm91bmQgdGhhdCBhIHRhcmdldCBpbnZlcnNlIGdhbW1hIG9mfjEuOCAqLwotICAvKiAgICBmb3Igc3RlcH4zIGdpdmVzIGdvb2QgcmVzdWx0cyBhY3Jvc3MgYSB3aWRlIHJhbmdlIG9mIGRpc3BsYXlzIHdpdGggKi8KLSAgLyogICAgYW4gc1JHQiBnYW1tYSBjdXJ2ZSBvciBhIHNpbWlsYXIgb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHByb2Nlc3MgY2FuIGNvc3QgcGVyZm9ybWFuY2UuICBUaGVyZSBpcyBhbiBhcHByb3hpbWF0aW9uIHRoYXQgKi8KLSAgLyogICAgZG9lcyBub3QgbmVlZCB0byBrbm93IGFib3V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yOyBzZWUgICAgICAgICAgICAgICovCi0gIC8qICAgIGh0dHBzOi8vYmVsLmZpL2FsYW5raWxhL2xjZC8gYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBodHRwczovL2JlbC5maS9hbGFua2lsYS9sY2QvYWxwY29yLmh0bWwgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICpBVFRFTlRJT04qOiBMaW5lYXIgYmxlbmRpbmcgaXMgZXZlbiBtb3JlIGltcG9ydGFudCB3aGVuIGRlYWxpbmcgICAqLwotICAvKiAgICB3aXRoIHN1YnBpeGVsLXJlbmRlcmVkIGdseXBocyB0byBwcmV2ZW50IGNvbG9yLWZyaW5naW5nISAgQSAgICAgICAgKi8KLSAgLyogICAgc3VicGl4ZWwtcmVuZGVyZWQgZ2x5cGggbXVzdCBmaXJzdCBiZSBmaWx0ZXJlZCB3aXRoIGEgZmlsdGVyIHRoYXQgICovCi0gIC8qICAgIGdpdmVzIGVxdWFsIHdlaWdodCB0byB0aGUgdGhyZWUgY29sb3IgcHJpbWFyaWVzIGFuZCBkb2VzIG5vdCAgICAgICAqLwotICAvKiAgICBleGNlZWQgYSBzdW0gb2YgMHgxMDAsIHNlZSBzZWN0aW9uIEBsY2RfZmlsdGVyaW5nLiAgVGhlbiB0aGUgICAgICAgKi8KLSAgLyogICAgb25seSBkaWZmZXJlbmNlIHRvIGdyYXkgbGluZWFyIGJsZW5kaW5nIGlzIHRoYXQgc3VicGl4ZWwtcmVuZGVyZWQgICovCi0gIC8qICAgIGxpbmVhciBibGVuZGluZyBpcyBkb25lIDN+dGltZXMgcGVyIHBpeGVsOiByZWQgZm9yZWdyb3VuZCBzdWJwaXhlbCAqLwotICAvKiAgICB0byByZWQgYmFja2dyb3VuZCBzdWJwaXhlbCBhbmQgc28gb24gZm9yIGdyZWVuIGFuZCBibHVlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9SZW5kZXJfR2x5cGgoIEZUX0dseXBoU2xvdCAgICBzbG90LAotICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS2VybmluZ19Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdG8gc3BlY2lmeSB0aGUgZm9ybWF0IG9mIGtlcm5pbmcgdmFsdWVzIHJldHVybmVkIGJ5ICovCi0gIC8qICAgIEBGVF9HZXRfS2VybmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tFUk5JTkdfREVGQVVMVCAgOjogUmV0dXJuIGdyaWQtZml0dGVkIGtlcm5pbmcgZGlzdGFuY2VzIGluICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tFUk5JTkdfVU5GSVRURUQgOjogUmV0dXJuIHVuLWdyaWQtZml0dGVkIGtlcm5pbmcgZGlzdGFuY2VzIGluICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tFUk5JTkdfVU5TQ0FMRUQgOjogUmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBpbiBvcmlnaW5hbCBmb250ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9LRVJOSU5HX0RFRkFVTFQgcmV0dXJucyBmdWxsIHBpeGVsIHZhbHVlczsgaXQgYWxzbyBtYWtlcyAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgaGV1cmlzdGljYWxseSBzY2FsZSBkb3duIGtlcm5pbmcgZGlzdGFuY2VzIGF0IHNtYWxsIHBwZW0gICovCi0gIC8qICAgIHZhbHVlcyBzbyB0aGF0IHRoZXkgZG9uJ3QgYmVjb21lIHRvbyBiaWcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQm90aCBGVF9LRVJOSU5HX0RFRkFVTFQgYW5kIEZUX0tFUk5JTkdfVU5GSVRURUQgdXNlIHRoZSBjdXJyZW50ICAgICovCi0gIC8qICAgIGhvcml6b250YWwgc2NhbGluZyBmYWN0b3IgKGFzIHNldCBlLmcuIHdpdGggQEZUX1NldF9DaGFyX1NpemUpIHRvICAqLwotICAvKiAgICBjb252ZXJ0IGZvbnQgdW5pdHMgdG8gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfS2VybmluZ19Nb2RlXwotICB7Ci0gICAgRlRfS0VSTklOR19ERUZBVUxUID0gMCwKLSAgICBGVF9LRVJOSU5HX1VORklUVEVELAotICAgIEZUX0tFUk5JTkdfVU5TQ0FMRUQKLQotICB9IEZUX0tlcm5pbmdfTW9kZTsKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9LZXJuaW5nX01vZGUnIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X2tlcm5pbmdfZGVmYXVsdCAgIEZUX0tFUk5JTkdfREVGQVVMVAotI2RlZmluZSBmdF9rZXJuaW5nX3VuZml0dGVkICBGVF9LRVJOSU5HX1VORklUVEVECi0jZGVmaW5lIGZ0X2tlcm5pbmdfdW5zY2FsZWQgIEZUX0tFUk5JTkdfVU5TQ0FMRUQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gZ2x5cGhzIG9mIHRoZSBzYW1lIGZhY2UuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVmdF9nbHlwaCAgOjogVGhlIGluZGV4IG9mIHRoZSBsZWZ0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByaWdodF9nbHlwaCA6OiBUaGUgaW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGtlcm5fbW9kZSAgIDo6IFNlZSBARlRfS2VybmluZ19Nb2RlIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBEZXRlcm1pbmVzIHRoZSBzY2FsZSBhbmQgZGltZW5zaW9uIG9mIHRoZSByZXR1cm5lZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAga2VybmluZyB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWtlcm5pbmcgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBlaXRoZXIgaW4gZm9udCB1bml0cywgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzICgyNi42IGZvcm1hdCksIG9yIHBpeGVscyBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLCBhbmQgaW4gcGl4ZWxzIGZvciBmaXhlZC1zaXplcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBob3Jpem9udGFsIGxheW91dHMgKGxlZnQtdG8tcmlnaHQgJiByaWdodC10by1sZWZ0KSBhcmUgICAgICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZC4gIE90aGVyIGxheW91dHMsIG9yIG1vcmUgc29waGlzdGljYXRlZCAgICAqLwotICAvKiAgICBrZXJuaW5ncywgYXJlIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcyBBUEkgZnVuY3Rpb24gLS0gdGhleSBjYW4gYmUgKi8KLSAgLyogICAgaW1wbGVtZW50ZWQgdGhyb3VnaCBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBLZXJuaW5nIGZvciBPcGVuVHlwZSBmb250cyBpbXBsZW1lbnRlZCBpbiBhIGBHUE9TJyB0YWJsZSBpcyBub3QgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkOyB1c2UgQEZUX0hBU19LRVJOSU5HIHRvIGZpbmQgb3V0IHdoZXRoZXIgYSBmb250IGhhcyBkYXRhICovCi0gIC8qICAgIHRoYXQgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGBGVF9HZXRfS2VybmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9LZXJuaW5nKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAga2Vybl9tb2RlLAotICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAqYWtlcm5pbmcgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9UcmFja19LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgdHJhY2sga2VybmluZyBmb3IgYSBnaXZlbiBmYWNlIG9iamVjdCBhdCBhIGdpdmVuIHNpemUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRfc2l6ZSA6OiBUaGUgcG9pbnQgc2l6ZSBpbiAxNi4xNiBmcmFjdGlvbmFsIHBvaW50cy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWdyZWUgICAgIDo6IFRoZSBkZWdyZWUgb2YgdGlnaHRuZXNzLiAgSW5jcmVhc2luZ2x5IG5lZ2F0aXZlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMgcmVwcmVzZW50IHRpZ2h0ZXIgdHJhY2sga2VybmluZywgd2hpbGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5jcmVhc2luZ2x5IHBvc2l0aXZlIHZhbHVlcyByZXByZXNlbnQgbG9vc2VyIHRyYWNrICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGtlcm5pbmcuICBWYWx1ZSB6ZXJvIG1lYW5zIG5vIHRyYWNrIGtlcm5pbmcuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBha2VybmluZyAgIDo6IFRoZSBrZXJuaW5nIGluIDE2LjE2IGZyYWN0aW9uYWwgcG9pbnRzLCB0byBiZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1bmlmb3JtbHkgYXBwbGllZCBiZXR3ZWVuIGFsbCBnbHlwaHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3VycmVudGx5LCBvbmx5IHRoZSBUeXBlfjEgZm9udCBkcml2ZXIgc3VwcG9ydHMgdHJhY2sga2VybmluZywgICAgICovCi0gIC8qICAgIHVzaW5nIGRhdGEgZnJvbSBBRk0gZmlsZXMgKGlmIGF0dGFjaGVkIHdpdGggQEZUX0F0dGFjaF9GaWxlIG9yICAgICAqLwotICAvKiAgICBARlRfQXR0YWNoX1N0cmVhbSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdmVyeSBmZXcgQUZNIGZpbGVzIGNvbWUgd2l0aCB0cmFjayBrZXJuaW5nIGRhdGE7IHBsZWFzZSByZWZlciAqLwotICAvKiAgICB0byBBZG9iZSdzIEFGTSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfVHJhY2tfS2VybmluZyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICBwb2ludF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGFrZXJuaW5nICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfR2x5cGhfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgQVNDSUkgbmFtZSBvZiBhIGdpdmVuIGdseXBoIGluIGEgZmFjZS4gIFRoaXMgb25seSAgICAgKi8KLSAgLyogICAgd29ya3MgZm9yIHRob3NlIGZhY2VzIHdoZXJlIEBGVF9IQVNfR0xZUEhfTkFNRVMoZmFjZSkgcmV0dXJuc34xLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlcl9tYXggIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmZXIgICAgICA6OiBBIHBvaW50ZXIgdG8gYSB0YXJnZXQgYnVmZmVyIHdoZXJlIHRoZSBuYW1lIGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY29waWVkIHRvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIGZhY2UgZG9lc24ndCBwcm92aWRlIGdseXBoIG5hbWVzIG9yIGlmICovCi0gIC8qICAgIHRoZSBnbHlwaCBpbmRleCBpcyBpbnZhbGlkLiAgSW4gYWxsIGNhc2VzIG9mIGZhaWx1cmUsIHRoZSBmaXJzdCAgICAqLwotICAvKiAgICBieXRlIG9mIGBidWZmZXInIGlzIHNldCB0b34wIHRvIGluZGljYXRlIGFuIGVtcHR5IG5hbWUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBuYW1lIGlzIHRydW5jYXRlZCB0byBmaXQgd2l0aGluIHRoZSBidWZmZXIgaWYgaXQgaXMgdG9vICAqLwotICAvKiAgICBsb25nLiAgVGhlIHJldHVybmVkIHN0cmluZyBpcyBhbHdheXMgemVyby10ZXJtaW5hdGVkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlIGF3YXJlIHRoYXQgRnJlZVR5cGUgcmVvcmRlcnMgZ2x5cGggaW5kaWNlcyBpbnRlcm5hbGx5IHNvIHRoYXQgICAqLwotICAvKiAgICBnbHlwaCBpbmRleH4wIGFsd2F5cyBjb3JyZXNwb25kcyB0byB0aGUgYG1pc3NpbmcgZ2x5cGgnIChjYWxsZWQgICAgKi8KLSAgLyogICAgYC5ub3RkZWYnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBjb25maWcgbWFjcm8gICAgICAgICAgKi8KLSAgLyogICAgYEZUX0NPTkZJR19PUFRJT05fTk9fR0xZUEhfTkFNRVMnIGlzIG5vdCBkZWZpbmVkIGluIGBmdG9wdGlvbi5oJy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0dseXBoX05hbWUoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9Qb3N0c2NyaXB0X05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBBU0NJSSBQb3N0U2NyaXB0IG5hbWUgb2YgYSBnaXZlbiBmYWNlLCBpZiBhdmFpbGFibGUuICAqLwotICAvKiAgICBUaGlzIG9ubHkgd29ya3Mgd2l0aCBQb3N0U2NyaXB0LCBUcnVlVHlwZSwgYW5kIE9wZW5UeXBlIGZvbnRzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHBvaW50ZXIgdG8gdGhlIGZhY2UncyBQb3N0U2NyaXB0IG5hbWUuICBOVUxMIGlmIHVuYXZhaWxhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyBvd25lZCBieSB0aGUgZmFjZSBhbmQgaXMgZGVzdHJveWVkIHdpdGggICAgKi8KLSAgLyogICAgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgdmFyaWF0aW9uIGZvbnRzLCB0aGlzIHN0cmluZyBjaGFuZ2VzIGlmIHlvdSBzZWxlY3QgYSBkaWZmZXJlbnQgKi8KLSAgLyogICAgaW5zdGFuY2UsIGFuZCB5b3UgaGF2ZSB0byBjYWxsIGBGVF9HZXRfUG9zdFNjcmlwdF9OYW1lJyBhZ2FpbiB0byAgICovCi0gIC8qICAgIHJldHJpZXZlIGl0LiAgRnJlZVR5cGUgZm9sbG93cyBBZG9iZSBUZWNoTm90ZSAjNTkwMiwgYEdlbmVyYXRpbmcgICAqLwotICAvKiAgICBQb3N0U2NyaXB0IE5hbWVzIGZvciBGb250cyBVc2luZyBPcGVuVHlwZSBGb250IFZhcmlhdGlvbnMnLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaHR0cDovL3d3d2ltYWdlcy5hZG9iZS5jb20vY29udGVudC9kYW0vQWRvYmUvZW4vZGV2bmV0L2ZvbnQvcGRmcy81OTAyLkFkb2JlUFNOYW1lR2VuZXJhdGlvbi5odG1sICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIGNvbnN0IGNoYXIqICkKLSAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2VsZWN0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VsZWN0IGEgZ2l2ZW4gY2hhcm1hcCBieSBpdHMgZW5jb2RpbmcgdGFnIChhcyBsaXN0ZWQgaW4gICAgICAgICAgICovCi0gIC8qICAgIGBmcmVldHlwZS5oJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVuY29kaW5nIDo6IEEgaGFuZGxlIHRvIHRoZSBzZWxlY3RlZCBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiBubyBjaGFybWFwIGluIHRoZSBmYWNlICAgICAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kcyB0byB0aGUgZW5jb2RpbmcgcXVlcmllZCBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlY2F1c2UgbWFueSBmb250cyBjb250YWluIG1vcmUgdGhhbiBhIHNpbmdsZSBjbWFwIGZvciBVbmljb2RlICAgICAqLwotICAvKiAgICBlbmNvZGluZywgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBzcGVjaWFsIGNvZGUgdG8gc2VsZWN0IHRoZSBvbmUgICAgKi8KLSAgLyogICAgdGhhdCBjb3ZlcnMgVW5pY29kZSBiZXN0IChgYmVzdCcgaW4gdGhlIHNlbnNlIHRoYXQgYSBVQ1MtNCBjbWFwIGlzICovCi0gIC8qICAgIHByZWZlcnJlZCB0byBhIFVDUy0yIGNtYXApLiAgSXQgaXMgdGh1cyBwcmVmZXJhYmxlIHRvICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfU2V0X0NoYXJtYXAgaW4gdGhpcyBjYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZWxlY3RfQ2hhcm1hcCggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9FbmNvZGluZyAgZW5jb2RpbmcgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlbGVjdCBhIGdpdmVuIGNoYXJtYXAgZm9yIGNoYXJhY3RlciBjb2RlIHRvIGdseXBoIGluZGV4IG1hcHBpbmcuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgOjogQSBoYW5kbGUgdG8gdGhlIHNlbGVjdGVkIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgY2hhcm1hcCBpcyBub3QgcGFydCBvZiAgICAgICAqLwotICAvKiAgICB0aGUgZmFjZSAoaS5lLiwgaWYgaXQgaXMgbm90IGxpc3RlZCBpbiB0aGUgYGZhY2UtPmNoYXJtYXBzJyAgICAgICAgKi8KLSAgLyogICAgdGFibGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBhbHNvIGZhaWxzIGlmIGFuIE9wZW5UeXBlIHR5cGV+MTQgY2hhcm1hcCBpcyBzZWxlY3RlZCAod2hpY2ggICAgKi8KLSAgLyogICAgZG9lc24ndCBtYXAgY2hhcmFjdGVyIGNvZGVzIHRvIGdseXBoIGluZGljZXMgYXQgYWxsKS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X0NoYXJtYXAoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9DaGFyTWFwICBjaGFybWFwICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfR2V0X0NoYXJtYXBfSW5kZXgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHJpZXZlIGluZGV4IG9mIGEgZ2l2ZW4gY2hhcm1hcC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGNoYXJtYXAgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIGEgY2hhcm1hcC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgaW5kZXggaW50byB0aGUgYXJyYXkgb2YgY2hhcmFjdGVyIG1hcHMgd2l0aGluIHRoZSBmYWNlIHRvIHdoaWNoCi0gICAqICAgYGNoYXJtYXAnIGJlbG9uZ3MuICBJZiBhbiBlcnJvciBvY2N1cnMsIC0xIGlzIHJldHVybmVkLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9JbnQgKQotICBGVF9HZXRfQ2hhcm1hcF9JbmRleCggRlRfQ2hhck1hcCAgY2hhcm1hcCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NoYXJfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSBnbHlwaCBpbmRleCBvZiBhIGdpdmVuIGNoYXJhY3RlciBjb2RlLiAgVGhpcyBmdW5jdGlvbiAgICovCi0gIC8qICAgIHVzZXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjaGFybWFwIHRvIGRvIHRoZSBtYXBwaW5nLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcmNvZGUgOjogVGhlIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMH5tZWFucyBgdW5kZWZpbmVkIGNoYXJhY3RlciBjb2RlJy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgeW91IHVzZSBGcmVlVHlwZSB0byBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZiBmb250IGZpbGVzICAgICAgICovCi0gIC8qICAgIGRpcmVjdGx5LCBiZSBhd2FyZSB0aGF0IHRoZSBnbHlwaCBpbmRleCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uICAqLwotICAvKiAgICBkb2Vzbid0IGFsd2F5cyBjb3JyZXNwb25kIHRvIHRoZSBpbnRlcm5hbCBpbmRpY2VzIHVzZWQgd2l0aGluIHRoZSAgKi8KLSAgLyogICAgZmlsZS4gIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB2YWx1ZX4wIGFsd2F5cyBjb3JyZXNwb25kcyB0byAgICovCi0gIC8qICAgIHRoZSBgbWlzc2luZyBnbHlwaCcuICBJZiB0aGUgZmlyc3QgZ2x5cGggaXMgbm90IG5hbWVkIGAubm90ZGVmJywgICAqLwotICAvKiAgICB0aGVuIGZvciBUeXBlfjEgYW5kIFR5cGV+NDIgZm9udHMsIGAubm90ZGVmJyB3aWxsIGJlIG1vdmVkIGludG8gICAgKi8KLSAgLyogICAgdGhlIGdseXBoIElEfjAgcG9zaXRpb24sIGFuZCB3aGF0ZXZlciB3YXMgdGhlcmUgd2lsbCBiZSBtb3ZlZCB0byAgICovCi0gIC8qICAgIHRoZSBwb3NpdGlvbiBgLm5vdGRlZicgaGFkLiAgRm9yIFR5cGV+MSBmb250cywgaWYgdGhlcmUgaXMgbm8gICAgICAqLwotICAvKiAgICBgLm5vdGRlZicgZ2x5cGggYXQgYWxsLCB0aGVuIG9uZSB3aWxsIGJlIGNyZWF0ZWQgYXQgaW5kZXh+MCBhbmQgICAgKi8KLSAgLyogICAgd2hhdGV2ZXIgd2FzIHRoZXJlIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGxhc3QgaW5kZXggLS0gVHlwZX40MiAgICAgICovCi0gIC8qICAgIGZvbnRzIGFyZSBjb25zaWRlcmVkIGludmFsaWQgdW5kZXIgdGhpcyBjb25kaXRpb24uICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50ICkKLSAgRlRfR2V0X0NoYXJfSW5kZXgoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfRmlyc3RfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIGZpcnN0IGNoYXJhY3RlciBjb2RlIGluIHRoZSBjdXJyZW50IGNoYXJtYXAgb2YgYSBnaXZlbiAgKi8KLSAgLyogICAgZmFjZSwgdG9nZXRoZXIgd2l0aCBpdHMgY29ycmVzcG9uZGluZyBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdpbmRleCA6OiBHbHlwaCBpbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgY29kZS4gIDB+aWYgY2hhcm1hcCBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgZW1wdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjaGFybWFwJ3MgZmlyc3QgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gdG9nZXRoZXIgd2l0aCBARlRfR2V0X05leHRfQ2hhciB0byAgICAqLwotICAvKiAgICBwYXJzZSBhbGwgY2hhcmFjdGVyIGNvZGVzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIGNoYXJtYXAuICBUaGUgY29kZSAgKi8KLSAgLyogICAgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9VTG9uZyAgY2hhcmNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfVUludCAgIGdpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgY2hhcmNvZGUgPSBGVF9HZXRfRmlyc3RfQ2hhciggZmFjZSwgJmdpbmRleCApOyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHdoaWxlICggZ2luZGV4ICE9IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gZG8gc29tZXRoaW5nIHdpdGggKGNoYXJjb2RlLGdpbmRleCkgcGFpciAuLi4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGNoYXJjb2RlID0gRlRfR2V0X05leHRfQ2hhciggZmFjZSwgY2hhcmNvZGUsICZnaW5kZXggKTsgICAgICAgICovCi0gIC8qICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlIGF3YXJlIHRoYXQgY2hhcmFjdGVyIGNvZGVzIGNhbiBoYXZlIHZhbHVlcyB1cCB0byAweEZGRkZGRkZGOyAgICAqLwotICAvKiAgICB0aGlzIG1pZ2h0IGhhcHBlbiBmb3Igbm9uLVVuaWNvZGUgb3IgbWFsZm9ybWVkIGNtYXBzLiAgSG93ZXZlciwgICAgKi8KLSAgLyogICAgZXZlbiB3aXRoIHJlZ3VsYXIgVW5pY29kZSBlbmNvZGluZywgc28tY2FsbGVkIGBsYXN0IHJlc29ydCBmb250cycgICovCi0gIC8qICAgICh1c2luZyBTRk5UIGNtYXAgZm9ybWF0IDEzLCBzZWUgZnVuY3Rpb24gQEZUX0dldF9DTWFwX0Zvcm1hdCkgICAgICAqLwotICAvKiAgICBub3JtYWxseSBoYXZlIGVudHJpZXMgZm9yIGFsbCBVbmljb2RlIGNoYXJhY3RlcnMgdXAgdG8gMHgxRkZGRkYsICAgKi8KLSAgLyogICAgd2hpY2ggY2FuIGNhdXNlICphIGxvdCogb2YgaXRlcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgYCphZ2luZGV4JyBpcyBzZXQgdG9+MCBpZiB0aGUgY2hhcm1hcCBpcyBlbXB0eS4gIFRoZSAgICAgKi8KLSAgLyogICAgcmVzdWx0IGl0c2VsZiBjYW4gYmV+MCBpbiB0d28gY2FzZXM6IGlmIHRoZSBjaGFybWFwIGlzIGVtcHR5IG9yICAgICovCi0gIC8qICAgIGlmIHRoZSB2YWx1ZX4wIGlzIHRoZSBmaXJzdCB2YWxpZCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VTG9uZyApCi0gIEZUX0dldF9GaXJzdF9DaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICphZ2luZGV4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTmV4dF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGN1cnJlbnQgY2hhcm1hcCBvZiBhIGdpdmVuICAgKi8KLSAgLyogICAgZmFjZSBmb2xsb3dpbmcgdGhlIHZhbHVlIGBjaGFyX2NvZGUnLCBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qICAgIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9jb2RlIDo6IFRoZSBzdGFydGluZyBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdpbmRleCAgIDo6IEdseXBoIGluZGV4IG9mIG5leHQgY2hhcmFjdGVyIGNvZGUuICAwfmlmIGNoYXJtYXAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBpcyBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjaGFybWFwJ3MgbmV4dCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBARlRfR2V0X0ZpcnN0X0NoYXIgdG8gd2FsayAgICAgICAqLwotICAvKiAgICBvdmVyIGFsbCBjaGFyYWN0ZXIgY29kZXMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gY2hhcm1hcC4gIFNlZSB0aGUgICAgKi8KLSAgLyogICAgbm90ZSBmb3IgdGhhdCBmdW5jdGlvbiBmb3IgYSBzaW1wbGUgY29kZSBleGFtcGxlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgYCphZ2luZGV4JyBpcyBzZXQgdG9+MCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGNvZGVzIGluICAgKi8KLSAgLyogICAgdGhlIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VMb25nICkKLSAgRlRfR2V0X05leHRfQ2hhciggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphZ2luZGV4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfRmFjZV9Qcm9wZXJ0aWVzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBTZXQgb3Igb3ZlcnJpZGUgY2VydGFpbiAobGlicmFyeSBvciBtb2R1bGUtd2lkZSkgcHJvcGVydGllcyBvbiBhCi0gICAqICAgZmFjZS1ieS1mYWNlIGJhc2lzLiAgVXNlZnVsIGZvciBmaW5lci1ncmFpbmVkIGNvbnRyb2wgYW5kIGF2b2lkaW5nCi0gICAqICAgbG9ja3Mgb24gc2hhcmVkIHN0cnVjdHVyZXMgKHRocmVhZHMgY2FuIG1vZGlmeSB0aGVpciBvd24gZmFjZXMgYXMKLSAgICogICB0aGV5IHNlZSBmaXQpLgotICAgKgotICAgKiAgIENvbnRyYXJ5IHRvIEBGVF9Qcm9wZXJ0eV9TZXQsIHRoaXMgZnVuY3Rpb24gdXNlcyBARlRfUGFyYW1ldGVyIHNvCi0gICAqICAgdGhhdCB5b3UgY2FuIHBhc3MgbXVsdGlwbGUgcHJvcGVydGllcyB0byB0aGUgdGFyZ2V0IGZhY2UgaW4gb25lIGNhbGwuCi0gICAqICAgTm90ZSB0aGF0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGF2YWlsYWJsZSBwcm9wZXJ0aWVzIGNhbiBiZQotICAgKiAgIGNvbnRyb2xsZWQuCi0gICAqCi0gICAqICAgKiBTdGVtIGRhcmtlbmluZyAoQEZUX1BBUkFNX1RBR19TVEVNX0RBUktFTklORywgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICAgIHByb3BlcnR5IGBuby1zdGVtLWRhcmtlbmluZycgcHJvdmlkZWQgYnkgdGhlIGBhdXRvZml0JyBhbmQgYGNmZicKLSAgICogICAgIG1vZHVsZXM7IHNlZSBAbm8tc3RlbS1kYXJrZW5pbmdbYXV0b2ZpdF0gYW5kCi0gICAqICAgICBAbm8tc3RlbS1kYXJrZW5pbmdbY2ZmXSkuCi0gICAqCi0gICAqICAgKiBMQ0QgZmlsdGVyIHdlaWdodHMgKEBGVF9QQVJBTV9UQUdfTENEX0ZJTFRFUl9XRUlHSFRTLCBjb3JyZXNwb25kaW5nCi0gICAqICAgICB0byBmdW5jdGlvbiBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzKS4KLSAgICoKLSAgICogICAqIFNlZWQgdmFsdWUgZm9yIHRoZSBDRkYgYHJhbmRvbScgb3BlcmF0b3IKLSAgICogICAgIChARlRfUEFSQU1fVEFHX1JBTkRPTV9TRUVELCBjb3JyZXNwb25kaW5nIHRvIHRoZSBgcmFuZG9tLXNlZWQnCi0gICAqICAgICBwcm9wZXJ0eSBwcm92aWRlZCBieSB0aGUgYGNmZicgbW9kdWxlOyBzZWUgQHJhbmRvbS1zZWVkKS4KLSAgICoKLSAgICogICBQYXNzIE5VTEwgYXMgYGRhdGEnIGluIEBGVF9QYXJhbWV0ZXIgZm9yIGEgZ2l2ZW4gdGFnIHRvIHJlc2V0IHRoZQotICAgKiAgIG9wdGlvbiBhbmQgdXNlIHRoZSBsaWJyYXJ5IG9yIG1vZHVsZSBkZWZhdWx0IGFnYWluLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KLSAgICoKLSAgICogICBudW1fcHJvcGVydGllcyA6OgotICAgKiAgICAgVGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRoYXQgZm9sbG93LgotICAgKgotICAgKiAgIHByb3BlcnRpZXMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIGFuIEBGVF9QYXJhbWV0ZXIgYXJyYXkgd2l0aCBgbnVtX3Byb3BlcnRpZXMnIGVsZW1lbnRzLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEhlcmUgYW4gZXhhbXBsZSB0aGF0IHNldHMgdGhyZWUgcHJvcGVydGllcy4gIFlvdSBtdXN0IGRlZmluZQotICAgKiAgIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HIHRvIG1ha2UgdGhlIExDRCBmaWx0ZXIgZXhhbXBsZXMKLSAgICogICB3b3JrLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX1BhcmFtZXRlciAgICAgICAgIHByb3BlcnR5MTsKLSAgICogICAgIEZUX0Jvb2wgICAgICAgICAgICAgIGRhcmtlbl9zdGVtcyA9IDE7Ci0gICAqCi0gICAqICAgICBGVF9QYXJhbWV0ZXIgICAgICAgICBwcm9wZXJ0eTI7Ci0gICAqICAgICBGVF9MY2RGaXZlVGFwRmlsdGVyICBjdXN0b21fd2VpZ2h0ID0KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDExLCAweDQ0LCAweDU2LCAweDQ0LCAweDExIH07Ci0gICAqCi0gICAqICAgICBGVF9QYXJhbWV0ZXIgICAgICAgICBwcm9wZXJ0eTM7Ci0gICAqICAgICBGVF9JbnQzMiAgICAgICAgICAgICByYW5kb21fc2VlZCA9IDMxNDE1OTI2NTsKLSAgICoKLSAgICogICAgIEZUX1BhcmFtZXRlciAgICAgICAgIHByb3BlcnRpZXNbM10gPSB7IHByb3BlcnR5MSwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5MiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5MyB9OwotICAgKgotICAgKgotICAgKiAgICAgcHJvcGVydHkxLnRhZyAgPSBGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkc7Ci0gICAqICAgICBwcm9wZXJ0eTEuZGF0YSA9ICZkYXJrZW5fc3RlbXM7Ci0gICAqCi0gICAqICAgICBwcm9wZXJ0eTIudGFnICA9IEZUX1BBUkFNX1RBR19MQ0RfRklMVEVSX1dFSUdIVFM7Ci0gICAqICAgICBwcm9wZXJ0eTIuZGF0YSA9IGN1c3RvbV93ZWlnaHQ7Ci0gICAqCi0gICAqICAgICBwcm9wZXJ0eTMudGFnICA9IEZUX1BBUkFNX1RBR19SQU5ET01fU0VFRDsKLSAgICogICAgIHByb3BlcnR5My5kYXRhID0gJnJhbmRvbV9zZWVkOwotICAgKgotICAgKiAgICAgRlRfRmFjZV9Qcm9wZXJ0aWVzKCBmYWNlLCAzLCBwcm9wZXJ0aWVzICk7Ci0gICAqICAgfQotICAgKgotICAgKiAgIFRoZSBuZXh0IGV4YW1wbGUgcmVzZXRzIGEgc2luZ2xlIHByb3BlcnR5IHRvIGl0cyBkZWZhdWx0IHZhbHVlLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX1BhcmFtZXRlciAgcHJvcGVydHk7Ci0gICAqCi0gICAqCi0gICAqICAgICBwcm9wZXJ0eS50YWcgID0gRlRfUEFSQU1fVEFHX0xDRF9GSUxURVJfV0VJR0hUUzsKLSAgICogICAgIHByb3BlcnR5LmRhdGEgPSBOVUxMOwotICAgKgotICAgKiAgICAgRlRfRmFjZV9Qcm9wZXJ0aWVzKCBmYWNlLCAxLCAmcHJvcGVydHkgKTsKLSAgICogICB9Ci0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfRmFjZV9Qcm9wZXJ0aWVzKCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHByb3BlcnRpZXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9OYW1lX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBnbHlwaCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfbmFtZSA6OiBUaGUgZ2x5cGggbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMH5tZWFucyBgdW5kZWZpbmVkIGNoYXJhY3RlciBjb2RlJy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQgKQotICBGVF9HZXRfTmFtZV9JbmRleCggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyBkZXNjcmliaW5nIHN1YmdseXBocy4gIFBsZWFzZSByZWZlciB0byB0aGUKLSAgICogICBgZ2x5ZicgdGFibGUgZGVzY3JpcHRpb24gaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gZm9yIHRoZQotICAgKiAgIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgZmxhZ3MgKHdoaWNoIGdldCBzeW50aGVzaXplZCBmb3IKLSAgICogICBub24tT3BlblR5cGUgc3ViZ2x5cGhzKS4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1dPUkRTIDo6Ci0gICAqICAgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVMgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1JPVU5EX1hZX1RPX0dSSUQgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1NDQUxFIDo6Ci0gICAqICAgRlRfU1VCR0xZUEhfRkxBR19YWV9TQ0FMRSA6OgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfMlgyIDo6Ci0gICAqICAgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUyA6OgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9XT1JEUyAgICAgICAgICAxCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTICAgICAgMgotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1JPVU5EX1hZX1RPX0dSSUQgICAgICAgIDQKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19TQ0FMRSAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfWFlfU0NBTEUgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHXzJYMiAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUyAgICAgIDB4MjAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuYzoKLSAgICogICBGVF9HZXRfU3ViR2x5cGhfSW5mbwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0cmlldmUgYSBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIHN1YmdseXBoLiAgT25seSB1c2UgaXQgaWYKLSAgICogICBgZ2x5cGgtPmZvcm1hdCcgaXMgQEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEU7IGFuIGVycm9yIGlzCi0gICAqICAgcmV0dXJuZWQgb3RoZXJ3aXNlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZ2x5cGggOjoKLSAgICogICAgIFRoZSBzb3VyY2UgZ2x5cGggc2xvdC4KLSAgICoKLSAgICogICBzdWJfaW5kZXggOjoKLSAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgc3ViZ2x5cGguICBNdXN0IGJlIGxlc3MgdGhhbgotICAgKiAgICAgYGdseXBoLT5udW1fc3ViZ2x5cGhzJy4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBwX2luZGV4IDo6Ci0gICAqICAgICBUaGUgZ2x5cGggaW5kZXggb2YgdGhlIHN1YmdseXBoLgotICAgKgotICAgKiAgIHBfZmxhZ3MgOjoKLSAgICogICAgIFRoZSBzdWJnbHlwaCBmbGFncywgc2VlIEBGVF9TVUJHTFlQSF9GTEFHX1hYWC4KLSAgICoKLSAgICogICBwX2FyZzEgOjoKLSAgICogICAgIFRoZSBzdWJnbHlwaCdzIGZpcnN0IGFyZ3VtZW50IChpZiBhbnkpLgotICAgKgotICAgKiAgIHBfYXJnMiA6OgotICAgKiAgICAgVGhlIHN1YmdseXBoJ3Mgc2Vjb25kIGFyZ3VtZW50IChpZiBhbnkpLgotICAgKgotICAgKiAgIHBfdHJhbnNmb3JtIDo6Ci0gICAqICAgICBUaGUgc3ViZ2x5cGggdHJhbnNmb3JtYXRpb24gKGlmIGFueSkuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIHZhbHVlcyBvZiBgKnBfYXJnMScsIGAqcF9hcmcyJywgYW5kIGAqcF90cmFuc2Zvcm0nIG11c3QgYmUKLSAgICogICBpbnRlcnByZXRlZCBkZXBlbmRpbmcgb24gdGhlIGZsYWdzIHJldHVybmVkIGluIGAqcF9mbGFncycuICBTZWUgdGhlCi0gICAqICAgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfU3ViR2x5cGhfSW5mbyggRlRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgc3ViX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpwX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICpwX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpwX2FyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCAgICAqcF90cmFuc2Zvcm0gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgYGZzVHlwZScgZmllbGQgb2YgdGhlIE9TLzIgdGFibGUgICAqLwotICAvKiAgICBpbiBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQgYW5kIHRoZSBgRlNUeXBlJyBlbnRyeSBpbiBhICAgICAgICAgKi8KLSAgLyogICAgUG9zdFNjcmlwdCBmb250LiAgVGhlc2UgYml0IGZsYWdzIGFyZSByZXR1cm5lZCBieSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9HZXRfRlNUeXBlX0ZsYWdzOyB0aGV5IGluZm9ybSBjbGllbnQgYXBwbGljYXRpb25zIG9mIGVtYmVkZGluZyAqLwotICAvKiAgICBhbmQgc3Vic2V0dGluZyByZXN0cmljdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgZm9udC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBodHRwOi8vd3d3LmFkb2JlLmNvbS9jb250ZW50L2RhbS9BZG9iZS9lbi9kZXZuZXQvYWNyb2JhdC9wZGZzL0ZvbnRQb2xpY2llcy5wZGYgKi8KLSAgLyogICAgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX0lOU1RBTExBQkxFX0VNQkVERElORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRm9udHMgd2l0aCBubyBmc1R5cGUgYml0IHNldCBtYXkgYmUgZW1iZWRkZWQgYW5kIHBlcm1hbmVudGx5ICAgICAqLwotICAvKiAgICAgIGluc3RhbGxlZCBvbiB0aGUgcmVtb3RlIHN5c3RlbSBieSBhbiBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9SRVNUUklDVEVEX0xJQ0VOU0VfRU1CRURESU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZvbnRzIHRoYXQgaGF2ZSBvbmx5IHRoaXMgYml0IHNldCBtdXN0IG5vdCBiZSBtb2RpZmllZCwgZW1iZWRkZWQgKi8KLSAgLyogICAgICBvciBleGNoYW5nZWQgaW4gYW55IG1hbm5lciB3aXRob3V0IGZpcnN0IG9idGFpbmluZyBwZXJtaXNzaW9uIG9mICovCi0gIC8qICAgICAgdGhlIGZvbnQgc29mdHdhcmUgY29weXJpZ2h0IG93bmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX1BSRVZJRVdfQU5EX1BSSU5UX0VNQkVERElORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZvbnQgbWF5IGJlIGVtYmVkZGVkIGFuZCB0ZW1wb3JhcmlseSBsb2FkZWQgb24gdGhlIHJlbW90ZSAgICAqLwotICAvKiAgICAgIHN5c3RlbS4gIERvY3VtZW50cyBjb250YWluaW5nIFByZXZpZXcgJiBQcmludCBmb250cyBtdXN0IGJlICAgICAgKi8KLSAgLyogICAgICBvcGVuZWQgYHJlYWQtb25seSc7IG5vIGVkaXRzIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfRURJVEFCTEVfRU1CRURESU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZm9udCBtYXkgYmUgZW1iZWRkZWQgYnV0IG11c3Qgb25seSBiZSBpbnN0YWxsZWQgdGVtcG9yYXJpbHkgICovCi0gIC8qICAgICAgb24gb3RoZXIgc3lzdGVtcy4gIEluIGNvbnRyYXN0IHRvIFByZXZpZXcgJiBQcmludCBmb250cywgICAgICAgICAqLwotICAvKiAgICAgIGRvY3VtZW50cyBjb250YWluaW5nIGVkaXRhYmxlIGZvbnRzIG1heSBiZSBvcGVuZWQgZm9yIHJlYWRpbmcsICAgKi8KLSAgLyogICAgICBlZGl0aW5nIGlzIHBlcm1pdHRlZCwgYW5kIGNoYW5nZXMgbWF5IGJlIHNhdmVkLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfTk9fU1VCU0VUVElORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZm9udCBtYXkgbm90IGJlIHN1YnNldHRlZCBwcmlvciB0byBlbWJlZGRpbmcuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfQklUTUFQX0VNQkVERElOR19PTkxZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBPbmx5IGJpdG1hcHMgY29udGFpbmVkIGluIHRoZSBmb250IG1heSBiZSBlbWJlZGRlZDsgbm8gb3V0bGluZSAgICovCi0gIC8qICAgICAgZGF0YSBtYXkgYmUgZW1iZWRkZWQuICBJZiB0aGVyZSBhcmUgbm8gYml0bWFwcyBhdmFpbGFibGUgaW4gdGhlICAqLwotICAvKiAgICAgIGZvbnQsIHRoZW4gdGhlIGZvbnQgaXMgdW5lbWJlZGRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmxhZ3MgYXJlIE9SZWQgdG9nZXRoZXIsIHRodXMgbW9yZSB0aGFuIGEgc2luZ2xlIHZhbHVlIGNhbiBiZSAgKi8KLSAgLyogICAgcmV0dXJuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGlsZSB0aGUgYGZzVHlwZScgZmxhZ3MgY2FuIGluZGljYXRlIHRoYXQgYSBmb250IG1heSBiZSBlbWJlZGRlZCwgKi8KLSAgLyogICAgYSBsaWNlbnNlIHdpdGggdGhlIGZvbnQgdmVuZG9yIG1heSBiZSBzZXBhcmF0ZWx5IHJlcXVpcmVkIHRvIHVzZSAgICovCi0gIC8qICAgIHRoZSBmb250IGluIHRoaXMgd2F5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfRlNUWVBFX0lOU1RBTExBQkxFX0VNQkVERElORyAgICAgICAgIDB4MDAwMAotI2RlZmluZSBGVF9GU1RZUEVfUkVTVFJJQ1RFRF9MSUNFTlNFX0VNQkVERElORyAgMHgwMDAyCi0jZGVmaW5lIEZUX0ZTVFlQRV9QUkVWSUVXX0FORF9QUklOVF9FTUJFRERJTkcgICAweDAwMDQKLSNkZWZpbmUgRlRfRlNUWVBFX0VESVRBQkxFX0VNQkVERElORyAgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBGVF9GU1RZUEVfTk9fU1VCU0VUVElORyAgICAgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIEZUX0ZTVFlQRV9CSVRNQVBfRU1CRURESU5HX09OTFkgICAgICAgICAweDAyMDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9GU1R5cGVfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgYGZzVHlwZScgZmxhZ3MgZm9yIGEgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgZnNUeXBlJyBmbGFncywgc2VlIEBGVF9GU1RZUEVfWFhYLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGRpcmVjdGx5IHJlYWRpbmcgdGhlIGBmc190eXBlJyBmaWVsZCAqLwotICAvKiAgICBpbiB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSwgd2hpY2ggaXMgb25seSBndWFyYW50ZWVkIHRvICAgICAgKi8KLSAgLyogICAgcmV0dXJuIHRoZSBjb3JyZWN0IHJlc3VsdHMgZm9yIFR5cGV+MSBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VTaG9ydCApCi0gIEZUX0dldF9GU1R5cGVfRmxhZ3MoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX3ZhcmlhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVuaWNvZGUgVmFyaWF0aW9uIFNlcXVlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZX4yIGludGVyZmFjZSB0byBVbmljb2RlIFZhcmlhdGlvbiBTZXF1ZW5jZXMgKFVWUyksICAgICAqLwotICAvKiAgICB1c2luZyB0aGUgU0ZOVCBjbWFwIGZvcm1hdH4xNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYW55IGNoYXJhY3RlcnMsIGVzcGVjaWFsbHkgZm9yIENKSyBzY3JpcHRzLCBoYXZlIHZhcmlhbnQgZm9ybXMuICAgKi8KLSAgLyogICAgVGhleSBhcmUgYSBzb3J0IG9mIGdyZXkgYXJlYSBzb21ld2hlcmUgYmV0d2VlbiBiZWluZyB0b3RhbGx5ICAgICAgICovCi0gIC8qICAgIGlycmVsZXZhbnQgYW5kIHNlbWFudGljYWxseSBkaXN0aW5jdDsgZm9yIHRoaXMgcmVhc29uLCB0aGUgVW5pY29kZSAqLwotICAvKiAgICBjb25zb3J0aXVtIGRlY2lkZWQgdG8gaW50cm9kdWNlIFZhcmlhdGlvbiBTZXF1ZW5jZXMgKFZTKSwgICAgICAgICAgKi8KLSAgLyogICAgY29uc2lzdGluZyBvZiBhIFVuaWNvZGUgYmFzZSBjaGFyYWN0ZXIgYW5kIGEgdmFyaWF0aW9uIHNlbGVjdG9yICAgICovCi0gIC8qICAgIGluc3RlYWQgb2YgZnVydGhlciBleHRlbmRpbmcgdGhlIGFscmVhZHkgaHVnZSBudW1iZXIgb2YgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVuaWNvZGUgbWFpbnRhaW5zIHR3byBkaWZmZXJlbnQgc2V0cywgbmFtZWx5IGBTdGFuZGFyZGl6ZWQgICAgICAgICAqLwotICAvKiAgICBWYXJpYXRpb24gU2VxdWVuY2VzJyBhbmQgcmVnaXN0ZXJlZCBgSWRlb2dyYXBoaWMgVmFyaWF0aW9uICAgICAgICAgKi8KLSAgLyogICAgU2VxdWVuY2VzJyAoSVZTKSwgY29sbGVjdGVkIGluIHRoZSBgSWRlb2dyYXBoaWMgVmFyaWF0aW9uICAgICAgICAgICovCi0gIC8qICAgIERhdGFiYXNlJyAoSVZEKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL1N0YW5kYXJkaXplZFZhcmlhbnRzLnR4dCAqLwotICAvKiAgICAgIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMzcvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBodHRwOi8vdW5pY29kZS5vcmcvaXZkLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBkYXRlIChKYW51YXJ5IDIwMTcpLCB0aGUgY2hhcmFjdGVyIHdpdGggdGhlIG1vc3QgaWRlb2dyYXBoaWMgICAgKi8KLSAgLyogICAgdmFyaWF0aW9ucyBpcyBVKzkwODksIGhhdmluZyAzMiBzdWNoIElWUy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaHJlZSBNb25nb2xpYW4gVmFyaWF0aW9uIFNlbGVjdG9ycyBoYXZlIHRoZSB2YWx1ZXMgVSsxODBCLVUrMTgwRDsgKi8KLSAgLyogICAgMjU2IGdlbmVyaWMgVmFyaWF0aW9uIFNlbGVjdG9ycyBhcmUgZW5jb2RlZCBpbiB0aGUgcmFuZ2VzICAgICAgICAgICovCi0gIC8qICAgIFUrRkUwMC1VK0ZFMEYgYW5kIFUrRTAxMDAtVStFMDFFRi4gIElWUyBjdXJyZW50bHkgdXNlIFZhcmlhdGlvbiAgICAqLwotICAvKiAgICBTZWxlY3RvcnMgZnJvbSB0aGUgcmFuZ2UgVStFMDEwMC1VK0UwMUVGIG9ubHkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgVlMgY29uc2lzdHMgb2YgdGhlIGJhc2UgY2hhcmFjdGVyIHZhbHVlIGZvbGxvd2VkIGJ5IGEgc2luZ2xlICAgICAqLwotICAvKiAgICBWYXJpYXRpb24gU2VsZWN0b3IuICBGb3IgZXhhbXBsZSwgdG8gZ2V0IHRoZSBmaXJzdCB2YXJpYXRpb24gb2YgICAgKi8KLSAgLyogICAgVSs5MDg5LCB5b3UgaGF2ZSB0byB3cml0ZSB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGBVKzkwODkgVStFMDEwMCcuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZG9iZSBhbmQgTVMgZGVjaWRlZCB0byBzdXBwb3J0IGJvdGggc3RhbmRhcmRpemVkIGFuZCBpZGVvZ3JhcGhpYyAgKi8KLSAgLyogICAgVlMgd2l0aCBhIG5ldyBjbWFwIHN1YnRhYmxlIChmb3JtYXR+MTQpLiAgSXQgaXMgYW4gb2RkIHN1YnRhYmxlICAgICovCi0gIC8qICAgIGJlY2F1c2UgaXQgaXMgbm90IGEgbWFwcGluZyBvZiBpbnB1dCBjb2RlIHBvaW50cyB0byBnbHlwaHMsIGJ1dCAgICAqLwotICAvKiAgICBjb250YWlucyBsaXN0cyBvZiBhbGwgdmFyaWF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmFyaWF0aW9uIG1heSBiZSBlaXRoZXIgYGRlZmF1bHQnIG9yIGBub24tZGVmYXVsdCcgZm9yIGEgZ2l2ZW4gICAqLwotICAvKiAgICBmb250LiAgQSBkZWZhdWx0IHZhcmlhdGlvbiBpcyB0aGUgb25lIHlvdSB3aWxsIGdldCBmb3IgdGhhdCBjb2RlICAgKi8KLSAgLyogICAgcG9pbnQgaWYgeW91IGxvb2sgaXQgdXAgaW4gdGhlIHN0YW5kYXJkIFVuaWNvZGUgY21hcC4gIEEgICAgICAgICAgICovCi0gIC8qICAgIG5vbi1kZWZhdWx0IHZhcmlhdGlvbiBpcyBhIGRpZmZlcmVudCBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0dldENoYXJWYXJpYW50SW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIGdseXBoIGluZGV4IG9mIGEgZ2l2ZW4gY2hhcmFjdGVyIGNvZGUgYXMgbW9kaWZpZWQgYnkgICAgKi8KLSAgLyogICAgdGhlIHZhcmlhdGlvbiBzZWxlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcmNvZGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGNoYXJhY3RlciBjb2RlIHBvaW50IGluIFVuaWNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmFyaWFudFNlbGVjdG9yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIFVuaWNvZGUgY29kZSBwb2ludCBvZiB0aGUgdmFyaWF0aW9uIHNlbGVjdG9yLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBpbmRleC4gIDB+bWVhbnMgZWl0aGVyIGB1bmRlZmluZWQgY2hhcmFjdGVyIGNvZGUnLCBvciAgICAqLwotICAvKiAgICBgdW5kZWZpbmVkIHNlbGVjdG9yIGNvZGUnLCBvciBgbm8gdmFyaWF0aW9uIHNlbGVjdG9yIGNtYXAgICAgICAgICAgKi8KLSAgLyogICAgc3VidGFibGUnLCBvciBgY3VycmVudCBDaGFyTWFwIGlzIG5vdCBVbmljb2RlJy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgeW91IHVzZSBGcmVlVHlwZSB0byBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZiBmb250IGZpbGVzICAgICAgICovCi0gIC8qICAgIGRpcmVjdGx5LCBiZSBhd2FyZSB0aGF0IHRoZSBnbHlwaCBpbmRleCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uICAqLwotICAvKiAgICBkb2Vzbid0IGFsd2F5cyBjb3JyZXNwb25kIHRvIHRoZSBpbnRlcm5hbCBpbmRpY2VzIHVzZWQgd2l0aGluICAgICAgKi8KLSAgLyogICAgdGhlIGZpbGUuICBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgdmFsdWV+MCBhbHdheXMgY29ycmVzcG9uZHMgICovCi0gIC8qICAgIHRvIHRoZSBgbWlzc2luZyBnbHlwaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYSkgdGhlIGZvbnQgaGFzIGEgdmFyaWF0aW9uIHNlbGVjdG9yIGNtYXAgc3ViIHRhYmxlLCAgICAgICAgICAgICAqLwotICAvKiAgICBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBiKSB0aGUgY3VycmVudCBjaGFybWFwIGhhcyBhIFVuaWNvZGUgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQgKQotICBGVF9GYWNlX0dldENoYXJWYXJpYW50SW5kZXgoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB3aGV0aGVyIHRoaXMgdmFyaWF0aW9uIG9mIHRoaXMgVW5pY29kZSBjaGFyYWN0ZXIgaXMgdGhlIG9uZSAgKi8KLSAgLyogICAgdG8gYmUgZm91bmQgaW4gdGhlIGBjbWFwJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcmNvZGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGNoYXJhY3RlciBjb2RlcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmFyaWFudFNlbGVjdG9yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIFVuaWNvZGUgY29kZXBvaW50IG9mIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDF+aWYgZm91bmQgaW4gdGhlIHN0YW5kYXJkIChVbmljb2RlKSBjbWFwLCAwfmlmIGZvdW5kIGluIHRoZSAgICAgICAqLwotICAvKiAgICB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCwgb3IgLTEgaWYgaXQgaXMgbm90IGEgdmFyaWF0aW9uLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgZm9udCBoYXMgYSB2YXJpYXRpb24gICAgICAgKi8KLSAgLyogICAgc2VsZWN0b3IgY21hcCBzdWJ0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0ludCApCi0gIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0VmFyaWFudFNlbGVjdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIFVuaWNvZGUgdmFyaWF0aW9uIHNlbGVjdG9ycyBmb3VuZCAqLwotICAvKiAgICBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNlbGVjdG9yIGNvZGUgcG9pbnRzLCBvciBOVUxMIGlmIHRoZXJlIGlzICovCi0gIC8qICAgIG5vIHZhbGlkIHZhcmlhdGlvbiBzZWxlY3RvciBjbWFwIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzfjA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZSBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCAgICAgKi8KLSAgLyogICAgY2FsbCB0byBhIEZyZWVUeXBlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQzMiogKQotICBGVF9GYWNlX0dldFZhcmlhbnRTZWxlY3RvcnMoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0VmFyaWFudHNPZkNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIFVuaWNvZGUgdmFyaWF0aW9uIHNlbGVjdG9ycyBmb3VuZCAqLwotICAvKiAgICBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY2hhcmFjdGVyIGNvZGVwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZhcmlhdGlvbiBzZWxlY3RvciBjb2RlIHBvaW50cyB0aGF0IGFyZSAgICovCi0gIC8qICAgIGFjdGl2ZSBmb3IgdGhlIGdpdmVuIGNoYXJhY3Rlciwgb3IgTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBsaXN0ICAqLwotICAvKiAgICBpcyBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpc34wOyB0aGUgYXJyYXkgaXMgb3duZWQgYnkgdGhlICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2Ugb2JqZWN0IGJ1dCBjYW4gYmUgb3ZlcndyaXR0ZW4gb3IgcmVsZWFzZWQgb24gdGhlIG5leHQgICAgICovCi0gIC8qICAgIGNhbGwgdG8gYSBGcmVlVHlwZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50MzIqICkKLSAgRlRfRmFjZV9HZXRWYXJpYW50c09mQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9HZXRDaGFyc09mVmFyaWFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgVW5pY29kZSBjaGFyYWN0ZXIgY29kZXMgZm91bmQgZm9yICovCi0gIC8qICAgIHRoZSBzcGVjaWZpZWQgdmFyaWF0aW9uIHNlbGVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhcmlhbnRTZWxlY3RvciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB2YXJpYXRpb24gc2VsZWN0b3IgY29kZSBwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYWxsIHRoZSBjb2RlIHBvaW50cyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgdGhpcyBzZWxlY3RvciAgKi8KLSAgLyogICAgKGJvdGggZGVmYXVsdCBhbmQgbm9uLWRlZmF1bHQgY29kZXMgYXJlIHJldHVybmVkKSBvciBOVUxMIGlmIHRoZXJlICovCi0gIC8qICAgIGlzIG5vIHZhbGlkIGNtYXAgb3IgdGhlIHZhcmlhdGlvbiBzZWxlY3RvciBpcyBpbnZhbGlkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzfjA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZSBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCAgICAgKi8KLSAgLyogICAgY2FsbCB0byBhIEZyZWVUeXBlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQzMiogKQotICBGVF9GYWNlX0dldENoYXJzT2ZWYXJpYW50KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3J1bmNoaW5nIGZpeGVkIG51bWJlcnMgYW5kIHZlY3RvcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHZhcmlvdXMgZnVuY3Rpb25zIHVzZWQgdG8gcGVyZm9ybSAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXB1dGF0aW9ucyBvbiAxNi4xNiBmaXhlZC1mbG9hdCBudW1iZXJzIG9yIDJkIHZlY3RvcnMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bERpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRGl2Rml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JvdW5kRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DZWlsRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmxvb3JGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXhfTXVsdGlwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4X0ludmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bERpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgYChhKmIpL2MnIHdpdGggbWF4aW11bSBhY2N1cmFjeSwgdXNpbmcgYSA2NC1iaXQgICAgICAgICAgICAqLwotICAvKiAgICBpbnRlcm1lZGlhdGUgaW50ZWdlciB3aGVuZXZlciBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLwotICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYyA6OiBUaGUgZGl2aXNvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvYycuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIHRyYXBzIHdoZW4gdHJ5aW5nIHRvICovCi0gIC8qICAgIGRpdmlkZSBieSB6ZXJvOyBpdCBzaW1wbHkgcmV0dXJucyBgTWF4SW50JyBvciBgTWluSW50JyBkZXBlbmRpbmcgICAqLwotICAvKiAgICBvbiB0aGUgc2lnbnMgb2YgYGEnIGFuZCBgYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX011bERpdiggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgIEZUX0xvbmcgIGMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgYChhKmIpLzB4MTAwMDAnIHdpdGggbWF4aW11bSBhY2N1cmFjeS4gIEl0cyBtYWluIHVzZSBpcyB0byAqLwotICAvKiAgICBtdWx0aXBseSBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQtcG9pbnQgZmFjdG9yLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUgd2hlbmV2ZXIgICAgICAqLwotICAvKiAgICAgICAgIHBvc3NpYmxlIChzZWUgbm90ZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSpiKS8weDEwMDAwJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIG9wdGltaXplZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGFic29sdXRlICAgKi8KLSAgLyogICAgdmFsdWUgb2YgYGEnIGlzIGxlc3MgdGhhbiAyMDQ4LCBhbmQgYGInIGlzIGEgMTYuMTYgc2NhbGluZyBmYWN0b3IuICovCi0gIC8qICAgIEFzIHRoaXMgaGFwcGVucyBtYWlubHkgd2hlbiBzY2FsaW5nIGZyb20gbm90aW9uYWwgdW5pdHMgdG8gICAgICAgICAqLwotICAvKiAgICBmcmFjdGlvbmFsIHBpeGVscyBpbiBGcmVlVHlwZSwgaXQgcmVzdWx0ZWQgaW4gbm90aWNlYWJsZSBzcGVlZCAgICAgKi8KLSAgLyogICAgaW1wcm92ZW1lbnRzIGJldHdlZW4gdmVyc2lvbnMgMi54IGFuZCAxLnguICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcyBhIGNvbmNsdXNpb24sIGFsd2F5cyB0cnkgdG8gcGxhY2UgYSAxNi4xNiBmYWN0b3IgYXMgdGhlICAgICAgICAgKi8KLSAgLyogICAgX3NlY29uZF8gYXJndW1lbnQgb2YgdGhpcyBmdW5jdGlvbjsgdGhpcyBjYW4gbWFrZSBhIGdyZWF0ICAgICAgICAgICovCi0gIC8qICAgIGRpZmZlcmVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Mb25nICkKLSAgRlRfTXVsRml4KCBGVF9Mb25nICBhLAotICAgICAgICAgICAgIEZUX0xvbmcgIGIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RpdkZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgYChhKjB4MTAwMDApL2InIHdpdGggbWF4aW11bSBhY2N1cmFjeS4gIEl0cyBtYWluIHVzZSBpcyB0byAqLwotICAvKiAgICBkaXZpZGUgYSBnaXZlbiB2YWx1ZSBieSBhIDE2LjE2IGZpeGVkLXBvaW50IGZhY3Rvci4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1lcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIGRlbm9taW5hdG9yLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKjB4MTAwMDApL2InLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Mb25nICkKLSAgRlRfRGl2Rml4KCBGVF9Mb25nICBhLAotICAgICAgICAgICAgIEZUX0xvbmcgIGIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JvdW5kRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kIGEgMTYuMTYgZml4ZWQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIG51bWJlciB0byBiZSByb3VuZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBhJyByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IDE2LjE2IGZpeGVkIGludGVnZXIsIGhhbGZ3YXkgY2FzZXMgYXdheSAqLwotICAvKiAgICBmcm9tIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyB3cmFwLWFyb3VuZCBhcml0aG1ldGljLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9Sb3VuZEZpeCggRlRfRml4ZWQgIGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NlaWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIHNtYWxsZXN0IGZvbGxvd2luZyBpbnRlZ2VyIG9mIGEgMTYuMTYgZml4ZWQgbnVtYmVyLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIG51bWJlciBmb3Igd2hpY2ggdGhlIGNlaWxpbmcgZnVuY3Rpb24gaXMgdG8gYmUgY29tcHV0ZWQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBhJyByb3VuZGVkIHRvd2FyZHMgcGx1cyBpbmZpbml0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmdW5jdGlvbiB1c2VzIHdyYXAtYXJvdW5kIGFyaXRobWV0aWMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCi0gIEZUX0NlaWxGaXgoIEZUX0ZpeGVkICBhICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GbG9vckZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSBsYXJnZXN0IHByZXZpb3VzIGludGVnZXIgb2YgYSAxNi4xNiBmaXhlZCBudW1iZXIuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1iZXIgZm9yIHdoaWNoIHRoZSBmbG9vciBmdW5jdGlvbiBpcyB0byBiZSBjb21wdXRlZC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgYScgcm91bmRlZCB0b3dhcmRzIG1pbnVzIGluZmluaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9GbG9vckZpeCggRlRfRml4ZWQgIGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRyYW5zZm9ybSBhIHNpbmdsZSB2ZWN0b3IgdGhyb3VnaCBhIDJ4MiBtYXRyaXguICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlY3RvciA6OiBUaGUgdGFyZ2V0IHZlY3RvciB0byB0cmFuc2Zvcm0uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hdHJpeCA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSAyeDIgbWF0cml4LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIGVpdGhlciBgdmVjdG9yJyBvciBgbWF0cml4JyBpcyBpbnZhbGlkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVmVjdG9yX1RyYW5zZm9ybSggRlRfVmVjdG9yKiAgICAgICAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIFZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZ1bmN0aW9ucyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gRnJlZVR5cGUgdmVyc2lvbnMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aG9zZSBmdW5jdGlvbnMgYW5kIG1hY3JvcyBhcmUgb2YgbGltaXRlZCB1c2UgYmVjYXVzZSAgICAqLwotICAvKiAgICBldmVuIGEgbmV3IHJlbGVhc2Ugb2YgRnJlZVR5cGUgd2l0aCBvbmx5IGRvY3VtZW50YXRpb24gY2hhbmdlcyAgICAgKi8KLSAgLyogICAgaW5jcmVhc2VzIHRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlicmFyeV9WZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGUkVFVFlQRV9NQUpPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlJFRVRZUEVfTUlOT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZSRUVUWVBFX1BBVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlJFRVRZUEVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZSRUVUWVBFX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlc2UgdGhyZWUgbWFjcm9zIGlkZW50aWZ5IHRoZSBGcmVlVHlwZSBzb3VyY2UgY29kZSB2ZXJzaW9uLgotICAgKiAgIFVzZSBARlRfTGlicmFyeV9WZXJzaW9uIHRvIGFjY2VzcyB0aGVtIGF0IHJ1bnRpbWUuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlJFRVRZUEVfTUFKT1IgOjogVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLgotICAgKiAgIEZSRUVUWVBFX01JTk9SIDo6IFRoZSBtaW5vciB2ZXJzaW9uIG51bWJlci4KLSAgICogICBGUkVFVFlQRV9QQVRDSCA6OiBUaGUgcGF0Y2ggbGV2ZWwuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSB2ZXJzaW9uIG51bWJlciBvZiBGcmVlVHlwZSBpZiBidWlsdCBhcyBhIGR5bmFtaWMgbGluayBsaWJyYXJ5Ci0gICAqICAgd2l0aCB0aGUgYGxpYnRvb2wnIHBhY2thZ2UgaXMgX25vdF8gY29udHJvbGxlZCBieSB0aGVzZSB0aHJlZQotICAgKiAgIG1hY3Jvcy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZSRUVUWVBFX01BSk9SICAyCi0jZGVmaW5lIEZSRUVUWVBFX01JTk9SICA4Ci0jZGVmaW5lIEZSRUVUWVBFX1BBVENIICAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5X1ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkgYmVpbmcgdXNlZC4gIFRoaXMgaXMgICAgKi8KLSAgLyogICAgdXNlZnVsIHdoZW4gZHluYW1pY2FsbHkgbGlua2luZyB0byB0aGUgbGlicmFyeSwgc2luY2Ugb25lIGNhbm5vdCAgICovCi0gIC8qICAgIHVzZSB0aGUgbWFjcm9zIEBGUkVFVFlQRV9NQUpPUiwgQEZSRUVUWVBFX01JTk9SLCBhbmQgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlJFRVRZUEVfUEFUQ0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgc291cmNlIGxpYnJhcnkgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFqb3IgIDo6IFRoZSBtYWpvciB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtaW5vciAgOjogVGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXBhdGNoICA6OiBUaGUgcGF0Y2ggdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGBsaWJyYXJ5JyBhcmd1bWVudCBpcyBiZWNhdXNlICovCi0gIC8qICAgIGNlcnRhaW4gcHJvZ3JhbXMgaW1wbGVtZW50IGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gaW4gYSBjdXN0b20gd2F5ICAqLwotICAvKiAgICB0aGF0IGRvZXNuJ3QgdXNlIEBGVF9Jbml0X0ZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIHN1Y2ggY2FzZXMsIHRoZSBsaWJyYXJ5IHZlcnNpb24gbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBiZWZvcmUgICAqLwotICAvKiAgICB0aGUgbGlicmFyeSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpYnJhcnlfVmVyc2lvbiggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgKmFtYWpvciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYW1pbm9yLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphcGF0Y2ggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlcHJlY2F0ZWQsIGRvZXMgbm90aGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBmYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsd2F5cyByZXR1cm5zIGZhbHNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIE1heSAyMDEwLCBUcnVlVHlwZSBoaW50aW5nIGlzIG5vIGxvbmdlciBwYXRlbnRlZC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Cb29sICkKLSAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVwcmVjYXRlZCwgZG9lcyBub3RoaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgOjogQSBmYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YWx1ZSA6OiBOZXcgYm9vbGVhbiBzZXR0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbHdheXMgcmV0dXJucyBmYWxzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSBNYXkgMjAxMCwgVHJ1ZVR5cGUgaGludGluZyBpcyBubyBsb25nZXIgcGF0ZW50ZWQuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfQm9vbCApCi0gIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHZhbHVlICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGUkVFVFlQRV9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWE5NmUwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRhZHZhbmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGFkdmFuYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUXVpY2sgY29tcHV0YXRpb24gb2YgYWR2YW5jZSB3aWR0aHMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDgtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRBRFZBTkNfSF8KLSNkZWZpbmUgRlRBRFZBTkNfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgcXVpY2tfYWR2YW5jZQotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgUXVpY2sgcmV0cmlldmFsIG9mIGFkdmFuY2UgdmFsdWVzCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICBSZXRyaWV2ZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBhZHZhbmNlIHZhbHVlcyB3aXRob3V0IHByb2Nlc3NpbmcKLSAgICogICBnbHlwaCBvdXRsaW5lcywgaWYgcG9zc2libGUuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZnVuY3Rpb25zIHRvIHF1aWNrbHkgZXh0cmFjdCBhZHZhbmNlIHZhbHVlcwotICAgKiAgIHdpdGhvdXQgaGFuZGxpbmcgZ2x5cGggb3V0bGluZXMsIGlmIHBvc3NpYmxlLgotICAgKgotICAgKiBAb3JkZXI6Ci0gICAqICAgRlRfR2V0X0FkdmFuY2UKLSAgICogICBGVF9HZXRfQWR2YW5jZXMKLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGJpdC1mbGFnIHRvIGJlIE9SLWVkIHdpdGggdGhlIGBmbGFncycgcGFyYW1ldGVyIG9mIHRoZSAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9BZHZhbmNlIGFuZCBARlRfR2V0X0FkdmFuY2VzIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHlvdSB3YW50IHRoZXNlIGZ1bmN0aW9ucyB0byBmYWlsIGlmIHRoZSAgKi8KLSAgLyogICAgY29ycmVzcG9uZGluZyBoaW50aW5nIG1vZGUgb3IgZm9udCBkcml2ZXIgZG9lc24ndCBhbGxvdyBmb3IgdmVyeSAgICovCi0gIC8qICAgIHF1aWNrIGFkdmFuY2UgY29tcHV0YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHlwaWNhbGx5LCBnbHlwaHMgdGhhdCBhcmUgZWl0aGVyIHVuc2NhbGVkLCB1bmhpbnRlZCwgYml0bWFwcGVkLCAgICovCi0gIC8qICAgIG9yIGxpZ2h0LWhpbnRlZCBjYW4gaGF2ZSB0aGVpciBhZHZhbmNlIHdpZHRoIGNvbXB1dGVkIHZlcnkgICAgICAgICAqLwotICAvKiAgICBxdWlja2x5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1hbCBhbmQgYnl0ZWNvZGUgaGludGVkIG1vZGVzIHRoYXQgcmVxdWlyZSBsb2FkaW5nLCBzY2FsaW5nLCAgICAqLwotICAvKiAgICBhbmQgaGludGluZyBvZiB0aGUgZ2x5cGggb3V0bGluZSwgYXJlIGV4dHJlbWVseSBzbG93IGJ5ICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGFyaXNvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZICAweDIwMDAwMDAwTAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0FkdmFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIGFkdmFuY2UgdmFsdWUgb2YgYSBnaXZlbiBnbHlwaCBvdXRsaW5lIGluIGFuICAgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIHNvdXJjZSBARlRfRmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBzaW1pbGFyIHRvIHRob3NlIHVzZWQgd2hlbiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLCB1c2VkIHRvIGRldGVybWluZSB3aGF0IGtpbmQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgb2YgYWR2YW5jZXMgeW91IG5lZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFkdmFuY2UgOjogVGhlIGFkdmFuY2UgdmFsdWUuICBJZiBzY2FsaW5nIGlzIHBlcmZvcm1lZCAoYmFzZWQgb24gICovCi0gIC8qICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiBgbG9hZF9mbGFncycpLCB0aGUgYWR2YW5jZSB2YWx1ZSBpcyBpbiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAxNi4xNiBmb3JtYXQuICBPdGhlcndpc2UsIGl0IGlzIGluIGZvbnQgdW5pdHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmIEBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCBpcyBzZXQsIHRoaXMgaXMgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBhZHZhbmNlIGNvcnJlc3BvbmRpbmcgdG8gYSB2ZXJ0aWNhbCBsYXlvdXQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBpdCBpcyB0aGUgaG9yaXpvbnRhbCBhZHZhbmNlIGluIGEgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gbWF5IGZhaWwgaWYgeW91IHVzZSBARlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSBhbmQgICAqLwotICAvKiAgICBpZiB0aGUgY29ycmVzcG9uZGluZyBmb250IGJhY2tlbmQgZG9lc24ndCBoYXZlIGEgcXVpY2sgd2F5IHRvICAgICAgKi8KLSAgLyogICAgcmV0cmlldmUgdGhlIGFkdmFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNjYWxlZCBhZHZhbmNlIGlzIHJldHVybmVkIGluIDE2LjE2IGZvcm1hdCBidXQgaXNuJ3QgdHJhbnNmb3JtZWQgKi8KLSAgLyogICAgYnkgdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBzcGVjaWZpZWQgYnkgQEZUX1NldF9UcmFuc2Zvcm0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0FkdmFuY2UoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICpwYWR2YW5jZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0FkdmFuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIGFkdmFuY2UgdmFsdWVzIG9mIHNldmVyYWwgZ2x5cGggb3V0bGluZXMgaW4gYW4gICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IFRoZSBzb3VyY2UgQEZUX0ZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RhcnQgICAgICAgOjogVGhlIGZpcnN0IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGFkdmFuY2UgdmFsdWVzIHlvdSB3YW50IHRvIHJldHJpZXZlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBzaW1pbGFyIHRvIHRob3NlIHVzZWQgd2hlbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB2YWx1ZXMuICBUaGlzIGFycmF5LCB0byBiZSBwcm92aWRlZCBieSB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgY2FsbGVyLCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgYGNvdW50JyBlbGVtZW50cy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiBzY2FsaW5nIGlzIHBlcmZvcm1lZCAoYmFzZWQgb24gdGhlIHZhbHVlIG9mICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgYGxvYWRfZmxhZ3MnKSwgdGhlIGFkdmFuY2UgdmFsdWVzIGFyZSBpbiAxNi4xNiBmb3JtYXQuICovCi0gIC8qICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhleSBhcmUgaW4gZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgQEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIGlzIHNldCwgdGhlc2UgYXJlIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIHZlcnRpY2FsIGFkdmFuY2VzIGNvcnJlc3BvbmRpbmcgdG8gYSB2ZXJ0aWNhbCBsYXlvdXQuICAqLwotICAvKiAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIHRoZSBob3Jpem9udGFsIGFkdmFuY2VzIGluIGEgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgZmFpbCBpZiB5b3UgdXNlIEBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZIGFuZCAgICovCi0gIC8qICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZvbnQgYmFja2VuZCBkb2Vzbid0IGhhdmUgYSBxdWljayB3YXkgdG8gICAgICAqLwotICAvKiAgICByZXRyaWV2ZSB0aGUgYWR2YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNjYWxlZCBhZHZhbmNlcyBhcmUgcmV0dXJuZWQgaW4gMTYuMTYgZm9ybWF0IGJ1dCBhcmVuJ3QgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1lZCBieSB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIHNwZWNpZmllZCBieSAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1NldF9UcmFuc2Zvcm0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0FkdmFuY2VzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKnBhZHZhbmNlcyApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRBRFZBTkNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRhdXRvaC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGF1dG9oLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDU0MGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGF1dG9oLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRhdXRvaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIGF1dG8taGludGVyIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUQVVUT0hfSF8KLSNkZWZpbmUgRlRBVVRPSF9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgYXV0b19oaW50ZXIKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIFRoZSBhdXRvLWhpbnRlcgotICAgKgotICAgKiBAYWJzdHJhY3Q6Ci0gICAqICAgQ29udHJvbGxpbmcgdGhlIGF1dG8taGludGluZyBtb2R1bGUuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBXaGlsZSBGcmVlVHlwZSdzIGF1dG8taGludGVyIGRvZXNuJ3QgZXhwb3NlIEFQSSBmdW5jdGlvbnMgYnkgaXRzZWxmLAotICAgKiAgIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW91ciB3aXRoIEBGVF9Qcm9wZXJ0eV9TZXQgYW5kCi0gICAqICAgQEZUX1Byb3BlcnR5X0dldC4gIFRoZSBmb2xsb3dpbmcgbGlzdHMgdGhlIGF2YWlsYWJsZSBwcm9wZXJ0aWVzCi0gICAqICAgdG9nZXRoZXIgd2l0aCB0aGUgbmVjZXNzYXJ5IG1hY3JvcyBhbmQgc3RydWN0dXJlcy4KLSAgICoKLSAgICogICBOb3RlIHRoYXQgdGhlIGF1dG8taGludGVyJ3MgbW9kdWxlIG5hbWUgaXMgYGF1dG9maXR0ZXInIGZvcgotICAgKiAgIGhpc3RvcmljYWwgcmVhc29ucy4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGdseXBoLXRvLXNjcmlwdC1tYXAKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICpFeHBlcmltZW50YWwqICpvbmx5KgotICAgKgotICAgKiAgIFRoZSBhdXRvLWhpbnRlciBwcm92aWRlcyB2YXJpb3VzIHNjcmlwdCBtb2R1bGVzIHRvIGhpbnQgZ2x5cGhzLgotICAgKiAgIEV4YW1wbGVzIG9mIHN1cHBvcnRlZCBzY3JpcHRzIGFyZSBMYXRpbiBvciBDSksuICBCZWZvcmUgYSBnbHlwaCBpcwotICAgKiAgIGF1dG8taGludGVkLCB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgbWFwIG9mIHRoZSBmb250IGdldHMgZXhhbWluZWQsIGFuZAotICAgKiAgIHRoZSBzY3JpcHQgaXMgdGhlbiBkZXRlcm1pbmVkIGJhc2VkIG9uIFVuaWNvZGUgY2hhcmFjdGVyIHJhbmdlcywgc2VlCi0gICAqICAgYmVsb3cuCi0gICAqCi0gICAqICAgT3BlblR5cGUgZm9udHMsIGhvd2V2ZXIsIG9mdGVuIHByb3ZpZGUgbXVjaCBtb3JlIGdseXBocyB0aGFuCi0gICAqICAgY2hhcmFjdGVyIGNvZGVzIChzbWFsbCBjYXBzLCBzdXBlcnNjcmlwdHMsIGxpZ2F0dXJlcywgc3dhc2hlcywgZXRjLiksCi0gICAqICAgdG8gYmUgY29udHJvbGxlZCBieSBzby1jYWxsZWQgYGZlYXR1cmVzJy4gIEhhbmRsaW5nIE9wZW5UeXBlIGZlYXR1cmVzCi0gICAqICAgY2FuIGJlIHF1aXRlIGNvbXBsaWNhdGVkIGFuZCB0aHVzIG5lZWRzIGEgc2VwYXJhdGUgbGlicmFyeSBvbiB0b3Agb2YKLSAgICogICBGcmVlVHlwZS4KLSAgICoKLSAgICogICBUaGUgbWFwcGluZyBiZXR3ZWVuIGdseXBoIGluZGljZXMgYW5kIHNjcmlwdHMgKGluIHRoZSBhdXRvLWhpbnRlcgotICAgKiAgIHNlbnNlLCBzZWUgdGhlIEBGVF9BVVRPSElOVEVSX1NDUklQVF9YWFggdmFsdWVzKSBpcyBzdG9yZWQgYXMgYW4KLSAgICogICBhcnJheSB3aXRoIGBudW1fZ2x5cGhzJyBlbGVtZW50cywgYXMgZm91bmQgaW4gdGhlIGZvbnQncyBARlRfRmFjZQotICAgKiAgIHN0cnVjdHVyZS4gIFRoZSBgZ2x5cGgtdG8tc2NyaXB0LW1hcCcgcHJvcGVydHkgcmV0dXJucyBhIHBvaW50ZXIgdG8KLSAgICogICB0aGlzIGFycmF5LCB3aGljaCBjYW4gYmUgbW9kaWZpZWQgYXMgbmVlZGVkLiAgTm90ZSB0aGF0IHRoZQotICAgKiAgIG1vZGlmaWNhdGlvbiBzaG91bGQgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgZ2x5cGggZ2V0cyBwcm9jZXNzZWQgYnkKLSAgICogICB0aGUgYXV0by1oaW50ZXIgc28gdGhhdCB0aGUgZ2xvYmFsIGFuYWx5c2lzIG9mIHRoZSBmb250IHNoYXBlcwotICAgKiAgIGFjdHVhbGx5IHVzZXMgdGhlIG1vZGlmaWVkIG1hcHBpbmcuCi0gICAqCi0gICAqICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBhY2Nlc3MgaXQgKG9taXR0aW5nCi0gICAqICAgdGhlIGVycm9yIGhhbmRsaW5nKS4KLSAgICoKLSAgICogICB7Ci0gICAqICAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgIGZhY2U7Ci0gICAqICAgICBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXAgIHByb3A7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKiAgICAgRlRfTmV3X0ZhY2UoIGxpYnJhcnksICJmb28udHRmIiwgMCwgJmZhY2UgKTsKLSAgICoKLSAgICogICAgIHByb3AuZmFjZSA9IGZhY2U7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9HZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdseXBoLXRvLXNjcmlwdC1tYXAiLCAmcHJvcCApOwotICAgKgotICAgKiAgICAgLy8gYWRqdXN0IGBwcm9wLm1hcCcgYXMgbmVlZGVkIHJpZ2h0IGhlcmUKLSAgICoKLSAgICogICAgIEZUX0xvYWRfR2x5cGgoIGZhY2UsIC4uLiwgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCApOwotICAgKiAgIH0KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKLSAgICoKLSAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgZm9yIHRoZSBAZ2x5cGgtdG8tc2NyaXB0LW1hcCBwcm9wZXJ0eSB0bwotICAgKiAgIHNwZWNpZnkgdGhlIHNjcmlwdCBzdWJtb2R1bGUgdGhlIGF1dG8taGludGVyIHNob3VsZCB1c2UgZm9yIGhpbnRpbmcgYQotICAgKiAgIHBhcnRpY3VsYXIgZ2x5cGguCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTk9ORSA6OgotICAgKiAgICAgRG9uJ3QgYXV0by1oaW50IHRoaXMgZ2x5cGguCi0gICAqCi0gICAqICAgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTEFUSU4gOjoKLSAgICogICAgIEFwcGx5IHRoZSBsYXRpbiBhdXRvLWhpbnRlci4gIEZvciB0aGUgYXV0by1oaW50ZXIsIGBsYXRpbicgaXMgYQotICAgKiAgICAgdmVyeSBicm9hZCB0ZXJtLCBpbmNsdWRpbmcgQ3lyaWxsaWMgYW5kIEdyZWVrIGFsc28gc2luY2UgY2hhcmFjdGVycwotICAgKiAgICAgZnJvbSB0aG9zZSBzY3JpcHRzIHNoYXJlIHRoZSBzYW1lIGRlc2lnbiBjb25zdHJhaW50cy4KLSAgICoKLSAgICogICAgIEJ5IGRlZmF1bHQsIGNoYXJhY3RlcnMgZnJvbSB0aGUgZm9sbG93aW5nIFVuaWNvZGUgcmFuZ2VzIGFyZQotICAgKiAgICAgYXNzaWduZWQgdG8gdGhpcyBzdWJtb2R1bGUuCi0gICAqCi0gICAqICAgICB7Ci0gICAqICAgICAgIFUrMDAyMCAtIFUrMDA3RiAgLy8gQmFzaWMgTGF0aW4gKG5vIGNvbnRyb2wgY2hhcmFjdGVycykKLSAgICogICAgICAgVSswMEEwIC0gVSswMEZGICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgKG5vIGNvbnRyb2wgY2hhcmFjdGVycykKLSAgICogICAgICAgVSswMTAwIC0gVSswMTdGICAvLyBMYXRpbiBFeHRlbmRlZC1BCi0gICAqICAgICAgIFUrMDE4MCAtIFUrMDI0RiAgLy8gTGF0aW4gRXh0ZW5kZWQtQgotICAgKiAgICAgICBVKzAyNTAgLSBVKzAyQUYgIC8vIElQQSBFeHRlbnNpb25zCi0gICAqICAgICAgIFUrMDJCMCAtIFUrMDJGRiAgLy8gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzCi0gICAqICAgICAgIFUrMDMwMCAtIFUrMDM2RiAgLy8gQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzCi0gICAqICAgICAgIFUrMDM3MCAtIFUrMDNGRiAgLy8gR3JlZWsgYW5kIENvcHRpYwotICAgKiAgICAgICBVKzA0MDAgLSBVKzA0RkYgIC8vIEN5cmlsbGljCi0gICAqICAgICAgIFUrMDUwMCAtIFUrMDUyRiAgLy8gQ3lyaWxsaWMgU3VwcGxlbWVudAotICAgKiAgICAgICBVKzFEMDAgLSBVKzFEN0YgIC8vIFBob25ldGljIEV4dGVuc2lvbnMKLSAgICogICAgICAgVSsxRDgwIC0gVSsxREJGICAvLyBQaG9uZXRpYyBFeHRlbnNpb25zIFN1cHBsZW1lbnQKLSAgICogICAgICAgVSsxREMwIC0gVSsxREZGICAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgU3VwcGxlbWVudAotICAgKiAgICAgICBVKzFFMDAgLSBVKzFFRkYgIC8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwKLSAgICogICAgICAgVSsxRjAwIC0gVSsxRkZGICAvLyBHcmVlayBFeHRlbmRlZAotICAgKiAgICAgICBVKzIwMDAgLSBVKzIwNkYgIC8vIEdlbmVyYWwgUHVuY3R1YXRpb24KLSAgICogICAgICAgVSsyMDcwIC0gVSsyMDlGICAvLyBTdXBlcnNjcmlwdHMgYW5kIFN1YnNjcmlwdHMKLSAgICogICAgICAgVSsyMEEwIC0gVSsyMENGICAvLyBDdXJyZW5jeSBTeW1ib2xzCi0gICAqICAgICAgIFUrMjE1MCAtIFUrMjE4RiAgLy8gTnVtYmVyIEZvcm1zCi0gICAqICAgICAgIFUrMjQ2MCAtIFUrMjRGRiAgLy8gRW5jbG9zZWQgQWxwaGFudW1lcmljcwotICAgKiAgICAgICBVKzJDNjAgLSBVKzJDN0YgIC8vIExhdGluIEV4dGVuZGVkLUMKLSAgICogICAgICAgVSsyREUwIC0gVSsyREZGICAvLyBDeXJpbGxpYyBFeHRlbmRlZC1BCi0gICAqICAgICAgIFUrMkUwMCAtIFUrMkU3RiAgLy8gU3VwcGxlbWVudGFsIFB1bmN0dWF0aW9uCi0gICAqICAgICAgIFUrQTY0MCAtIFUrQTY5RiAgLy8gQ3lyaWxsaWMgRXh0ZW5kZWQtQgotICAgKiAgICAgICBVK0E3MjAgLSBVK0E3RkYgIC8vIExhdGluIEV4dGVuZGVkLUQKLSAgICogICAgICAgVStGQjAwIC0gVStGQjA2ICAvLyBBbHBoYWIuIFByZXNlbnQuIEZvcm1zIChMYXRpbiBMaWdhdHVyZXMpCi0gICAqICAgICAgVSsxRDQwMCAtIFUrMUQ3RkYgLy8gTWF0aGVtYXRpY2FsIEFscGhhbnVtZXJpYyBTeW1ib2xzCi0gICAqICAgICAgVSsxRjEwMCAtIFUrMUYxRkYgLy8gRW5jbG9zZWQgQWxwaGFudW1lcmljIFN1cHBsZW1lbnQKLSAgICogICAgIH0KLSAgICoKLSAgICogICBGVF9BVVRPSElOVEVSX1NDUklQVF9DSksgOjoKLSAgICogICAgIEFwcGx5IHRoZSBDSksgYXV0by1oaW50ZXIsIGNvdmVyaW5nIENoaW5lc2UsIEphcGFuZXNlLCBLb3JlYW4sIG9sZAotICAgKiAgICAgVmlldG5hbWVzZSwgYW5kIHNvbWUgb3RoZXIgc2NyaXB0cy4KLSAgICoKLSAgICogICAgIEJ5IGRlZmF1bHQsIGNoYXJhY3RlcnMgZnJvbSB0aGUgZm9sbG93aW5nIFVuaWNvZGUgcmFuZ2VzIGFyZQotICAgKiAgICAgYXNzaWduZWQgdG8gdGhpcyBzdWJtb2R1bGUuCi0gICAqCi0gICAqICAgICB7Ci0gICAqICAgICAgIFUrMTEwMCAtIFUrMTFGRiAgLy8gSGFuZ3VsIEphbW8KLSAgICogICAgICAgVSsyRTgwIC0gVSsyRUZGICAvLyBDSksgUmFkaWNhbHMgU3VwcGxlbWVudAotICAgKiAgICAgICBVKzJGMDAgLSBVKzJGREYgIC8vIEthbmd4aSBSYWRpY2FscwotICAgKiAgICAgICBVKzJGRjAgLSBVKzJGRkYgIC8vIElkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnMKLSAgICogICAgICAgVSszMDAwIC0gVSszMDNGICAvLyBDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24KLSAgICogICAgICAgVSszMDQwIC0gVSszMDlGICAvLyBIaXJhZ2FuYQotICAgKiAgICAgICBVKzMwQTAgLSBVKzMwRkYgIC8vIEthdGFrYW5hCi0gICAqICAgICAgIFUrMzEwMCAtIFUrMzEyRiAgLy8gQm9wb21vZm8KLSAgICogICAgICAgVSszMTMwIC0gVSszMThGICAvLyBIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vCi0gICAqICAgICAgIFUrMzE5MCAtIFUrMzE5RiAgLy8gS2FuYnVuCi0gICAqICAgICAgIFUrMzFBMCAtIFUrMzFCRiAgLy8gQm9wb21vZm8gRXh0ZW5kZWQKLSAgICogICAgICAgVSszMUMwIC0gVSszMUVGICAvLyBDSksgU3Ryb2tlcwotICAgKiAgICAgICBVKzMxRjAgLSBVKzMxRkYgIC8vIEthdGFrYW5hIFBob25ldGljIEV4dGVuc2lvbnMKLSAgICogICAgICAgVSszMjAwIC0gVSszMkZGICAvLyBFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzCi0gICAqICAgICAgIFUrMzMwMCAtIFUrMzNGRiAgLy8gQ0pLIENvbXBhdGliaWxpdHkKLSAgICogICAgICAgVSszNDAwIC0gVSs0REJGICAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBCi0gICAqICAgICAgIFUrNERDMCAtIFUrNERGRiAgLy8gWWlqaW5nIEhleGFncmFtIFN5bWJvbHMKLSAgICogICAgICAgVSs0RTAwIC0gVSs5RkZGICAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzCi0gICAqICAgICAgIFUrQTk2MCAtIFUrQTk3RiAgLy8gSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQQotICAgKiAgICAgICBVK0FDMDAgLSBVK0Q3QUYgIC8vIEhhbmd1bCBTeWxsYWJsZXMKLSAgICogICAgICAgVStEN0IwIC0gVStEN0ZGICAvLyBIYW5ndWwgSmFtbyBFeHRlbmRlZC1CCi0gICAqICAgICAgIFUrRjkwMCAtIFUrRkFGRiAgLy8gQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocwotICAgKiAgICAgICBVK0ZFMTAgLSBVK0ZFMUYgIC8vIFZlcnRpY2FsIGZvcm1zCi0gICAqICAgICAgIFUrRkUzMCAtIFUrRkU0RiAgLy8gQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMKLSAgICogICAgICAgVStGRjAwIC0gVStGRkVGICAvLyBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcwotICAgKiAgICAgIFUrMUIwMDAgLSBVKzFCMEZGIC8vIEthbmEgU3VwcGxlbWVudAotICAgKiAgICAgIFUrMUQzMDAgLSBVKzFEMzVGIC8vIFRhaSBYdWFuIEhpbmcgU3ltYm9scwotICAgKiAgICAgIFUrMUYyMDAgLSBVKzFGMkZGIC8vIEVuY2xvc2VkIElkZW9ncmFwaGljIFN1cHBsZW1lbnQKLSAgICogICAgICBVKzIwMDAwIC0gVSsyQTZERiAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBCCi0gICAqICAgICAgVSsyQTcwMCAtIFUrMkI3M0YgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQwotICAgKiAgICAgIFUrMkI3NDAgLSBVKzJCODFGIC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEQKLSAgICogICAgICBVKzJGODAwIC0gVSsyRkExRiAvLyBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzIFN1cHBsZW1lbnQKLSAgICogICAgIH0KLSAgICoKLSAgICogICBGVF9BVVRPSElOVEVSX1NDUklQVF9JTkRJQyA6OgotICAgKiAgICAgQXBwbHkgdGhlIGluZGljIGF1dG8taGludGVyLCBjb3ZlcmluZyBhbGwgbWFqb3Igc2NyaXB0cyBmcm9tIHRoZQotICAgKiAgICAgSW5kaWFuIHN1Yi1jb250aW5lbnQgYW5kIHNvbWUgb3RoZXIgcmVsYXRlZCBzY3JpcHRzIGxpa2UgVGhhaSwgTGFvLAotICAgKiAgICAgb3IgVGliZXRhbi4KLSAgICoKLSAgICogICAgIEJ5IGRlZmF1bHQsIGNoYXJhY3RlcnMgZnJvbSB0aGUgZm9sbG93aW5nIFVuaWNvZGUgcmFuZ2VzIGFyZQotICAgKiAgICAgYXNzaWduZWQgdG8gdGhpcyBzdWJtb2R1bGUuCi0gICAqCi0gICAqICAgICB7Ci0gICAqICAgICAgIFUrMDkwMCAtIFUrMERGRiAgLy8gSW5kaWMgUmFuZ2UKLSAgICogICAgICAgVSswRjAwIC0gVSswRkZGICAvLyBUaWJldGFuCi0gICAqICAgICAgIFUrMTkwMCAtIFUrMTk0RiAgLy8gTGltYnUKLSAgICogICAgICAgVSsxQjgwIC0gVSsxQkJGICAvLyBTdW5kYW5lc2UKLSAgICogICAgICAgVStBODAwIC0gVStBODJGICAvLyBTeWxvdGkgTmFncmkKLSAgICogICAgICAgVStBQkMwIC0gVStBQkZGICAvLyBNZWV0ZWkgTWF5ZWsKLSAgICogICAgICBVKzExODAwIC0gVSsxMThERiAvLyBTaGFyYWRhCi0gICAqICAgICB9Ci0gICAqCi0gICAqICAgICBOb3RlIHRoYXQgY3VycmVudGx5IEluZGljIHN1cHBvcnQgaXMgcnVkaW1lbnRhcnkgb25seSwgbWlzc2luZyBibHVlCi0gICAqICAgICB6b25lIHN1cHBvcnQuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9BVVRPSElOVEVSX1NDUklQVF9OT05FICAgMAotI2RlZmluZSBGVF9BVVRPSElOVEVSX1NDUklQVF9MQVRJTiAgMQotI2RlZmluZSBGVF9BVVRPSElOVEVSX1NDUklQVF9DSksgICAgMgotI2RlZmluZSBGVF9BVVRPSElOVEVSX1NDUklQVF9JTkRJQyAgMwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfUHJvcF9HbHlwaFRvU2NyaXB0TWFwCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKLSAgICoKLSAgICogICBUaGUgZGF0YSBleGNoYW5nZSBzdHJ1Y3R1cmUgZm9yIHRoZSBAZ2x5cGgtdG8tc2NyaXB0LW1hcCBwcm9wZXJ0eS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXBfCi0gIHsKLSAgICBGVF9GYWNlICAgICBmYWNlOwotICAgIEZUX1VTaG9ydCogIG1hcDsKLQotICB9IEZUX1Byb3BfR2x5cGhUb1NjcmlwdE1hcDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgZmFsbGJhY2stc2NyaXB0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKLSAgICoKLSAgICogICBJZiBubyBhdXRvLWhpbnRlciBzY3JpcHQgbW9kdWxlIGNhbiBiZSBhc3NpZ25lZCB0byBhIGdseXBoLCBhCi0gICAqICAgZmFsbGJhY2sgc2NyaXB0IGdldHMgYXNzaWduZWQgdG8gaXQgKHNlZSBhbHNvIHRoZQotICAgKiAgIEBnbHlwaC10by1zY3JpcHQtbWFwIHByb3BlcnR5KS4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMKLSAgICogICBARlRfQVVUT0hJTlRFUl9TQ1JJUFRfQ0pLLiAgVXNpbmcgdGhlIGBmYWxsYmFjay1zY3JpcHQnIHByb3BlcnR5LAotICAgKiAgIHRoaXMgZmFsbGJhY2sgdmFsdWUgY2FuIGJlIGNoYW5nZWQuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX1VJbnQgICAgIGZhbGxiYWNrX3NjcmlwdCA9IEZUX0FVVE9ISU5URVJfU0NSSVBUX05PTkU7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiYXV0b2ZpdHRlciIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWxsYmFjay1zY3JpcHQiLCAmZmFsbGJhY2tfc2NyaXB0ICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIEl0J3MgaW1wb3J0YW50IHRvIHVzZSB0aGUgcmlnaHQgdGltaW5nIGZvciBjaGFuZ2luZyB0aGlzIHZhbHVlOiBUaGUKLSAgICogICBjcmVhdGlvbiBvZiB0aGUgZ2x5cGgtdG8tc2NyaXB0IG1hcCB0aGF0IGV2ZW50dWFsbHkgdXNlcyB0aGUKLSAgICogICBmYWxsYmFjayBzY3JpcHQgdmFsdWUgZ2V0cyB0cmlnZ2VyZWQgZWl0aGVyIGJ5IHNldHRpbmcgb3IgcmVhZGluZyBhCi0gICAqICAgZmFjZS1zcGVjaWZpYyBwcm9wZXJ0eSBsaWtlIEBnbHlwaC10by1zY3JpcHQtbWFwLCBvciBieSBhdXRvLWhpbnRpbmcKLSAgICogICBhbnkgZ2x5cGggZnJvbSB0aGF0IGZhY2UuICBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQKLSAgICogICBhbiBARlRfRmFjZSBzdHJ1Y3R1cmUgYnV0IG5vdCBsb2FkZWQgYW55IGdseXBoICh1c2luZyB0aGUKLSAgICogICBhdXRvLWhpbnRlciksIGEgY2hhbmdlIG9mIHRoZSBmYWxsYmFjayBzY3JpcHQgd2lsbCBhZmZlY3QgdGhpcyBmYWNlLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgZGVmYXVsdC1zY3JpcHQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICpFeHBlcmltZW50YWwqICpvbmx5KgotICAgKgotICAgKiAgIElmIEZyZWVUeXBlIGdldHMgY29tcGlsZWQgd2l0aCBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWiB0byBtYWtlCi0gICAqICAgdGhlIEhhcmZCdXp6IGxpYnJhcnkgYWNjZXNzIE9wZW5UeXBlIGZlYXR1cmVzIGZvciBnZXR0aW5nIGJldHRlcgotICAgKiAgIGdseXBoIGNvdmVyYWdlcywgdGhpcyBwcm9wZXJ0eSBzZXRzIHRoZSAoYXV0by1maXR0ZXIpIHNjcmlwdCB0byBiZQotICAgKiAgIHVzZWQgZm9yIHRoZSBkZWZhdWx0IChPcGVuVHlwZSkgc2NyaXB0IGRhdGEgb2YgYSBmb250J3MgR1NVQiB0YWJsZS4KLSAgICogICBGZWF0dXJlcyBmb3IgdGhlIGRlZmF1bHQgc2NyaXB0IGFyZSBpbnRlbmRlZCBmb3IgYWxsIHNjcmlwdHMgbm90Ci0gICAqICAgZXhwbGljaXRseSBoYW5kbGVkIGluIEdTVUI7IGFuIGV4YW1wbGUgaXMgYSBgZGxpZycgZmVhdHVyZSwKLSAgICogICBjb250YWluaW5nIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgY2hhcmFjdGVycyBgVCcsIGBFJywgYW5kIGBMJyB0bwotICAgKiAgIGZvcm0gYSBgVEVMJyBsaWdhdHVyZS4KLSAgICoKLSAgICogICBCeSBkZWZhdWx0LCB0aGlzIGlzIEBGVF9BVVRPSElOVEVSX1NDUklQVF9MQVRJTi4gIFVzaW5nIHRoZQotICAgKiAgIGBkZWZhdWx0LXNjcmlwdCcgcHJvcGVydHksIHRoaXMgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgY2hhbmdlZC4KLSAgICoKLSAgICogICB7Ci0gICAqICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICAgKiAgICAgRlRfVUludCAgICAgZGVmYXVsdF9zY3JpcHQgPSBGVF9BVVRPSElOVEVSX1NDUklQVF9OT05FOwotICAgKgotICAgKgotICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdC1zY3JpcHQiLCAmZGVmYXVsdF9zY3JpcHQgKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqICAgSXQncyBpbXBvcnRhbnQgdG8gdXNlIHRoZSByaWdodCB0aW1pbmcgZm9yIGNoYW5naW5nIHRoaXMgdmFsdWU6IFRoZQotICAgKiAgIGNyZWF0aW9uIG9mIHRoZSBnbHlwaC10by1zY3JpcHQgbWFwIHRoYXQgZXZlbnR1YWxseSB1c2VzIHRoZQotICAgKiAgIGRlZmF1bHQgc2NyaXB0IHZhbHVlIGdldHMgdHJpZ2dlcmVkIGVpdGhlciBieSBzZXR0aW5nIG9yIHJlYWRpbmcgYQotICAgKiAgIGZhY2Utc3BlY2lmaWMgcHJvcGVydHkgbGlrZSBAZ2x5cGgtdG8tc2NyaXB0LW1hcCwgb3IgYnkgYXV0by1oaW50aW5nCi0gICAqICAgYW55IGdseXBoIGZyb20gdGhhdCBmYWNlLiAgSW4gcGFydGljdWxhciwgaWYgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkCi0gICAqICAgYW4gQEZUX0ZhY2Ugc3RydWN0dXJlIGJ1dCBub3QgbG9hZGVkIGFueSBnbHlwaCAodXNpbmcgdGhlCi0gICAqICAgYXV0by1oaW50ZXIpLCBhIGNoYW5nZSBvZiB0aGUgZGVmYXVsdCBzY3JpcHQgd2lsbCBhZmZlY3QgdGhpcyBmYWNlLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgaW5jcmVhc2UteC1oZWlnaHQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEZvciBwcGVtIHZhbHVlcyBpbiB0aGUgcmFuZ2UgNn48PSBwcGVtIDw9IGBpbmNyZWFzZS14LWhlaWdodCcsIHJvdW5kCi0gICAqICAgdXAgdGhlIGZvbnQncyB4fmhlaWdodCBtdWNoIG1vcmUgb2Z0ZW4gdGhhbiBub3JtYWxseS4gIElmIHRoZSB2YWx1ZQotICAgKiAgIGlzIHNldCB0b34wLCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgdGhpcyBmZWF0dXJlIGlzIHN3aXRjaGVkIG9mZi4gIFVzZQotICAgKiAgIHRoaXMgcHJvcGVydHkgdG8gaW1wcm92ZSB0aGUgbGVnaWJpbGl0eSBvZiBzbWFsbCBmb250IHNpemVzIGlmCi0gICAqICAgbmVjZXNzYXJ5LgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICBsaWJyYXJ5OwotICAgKiAgICAgRlRfRmFjZSAgICAgICAgICAgICAgICAgIGZhY2U7Ci0gICAqICAgICBGVF9Qcm9wX0luY3JlYXNlWEhlaWdodCAgcHJvcDsKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqICAgICBGVF9OZXdfRmFjZSggbGlicmFyeSwgImZvby50dGYiLCAwLCAmZmFjZSApOwotICAgKiAgICAgRlRfU2V0X0NoYXJfU2l6ZSggZmFjZSwgMTAgKiA2NCwgMCwgNzIsIDAgKTsKLSAgICoKLSAgICogICAgIHByb3AuZmFjZSAgPSBmYWNlOwotICAgKiAgICAgcHJvcC5saW1pdCA9IDE0OwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiYXV0b2ZpdHRlciIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZS14LWhlaWdodCIsICZwcm9wICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIFNldCB0aGlzIHZhbHVlIHJpZ2h0IGFmdGVyIGNhbGxpbmcgQEZUX1NldF9DaGFyX1NpemUsIGJ1dCBiZWZvcmUKLSAgICogICBsb2FkaW5nIGFueSBnbHlwaCAodXNpbmcgdGhlIGF1dG8taGludGVyKS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVF9Qcm9wX0luY3JlYXNlWEhlaWdodAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIGRhdGEgZXhjaGFuZ2Ugc3RydWN0dXJlIGZvciB0aGUgQGluY3JlYXNlLXgtaGVpZ2h0IHByb3BlcnR5LgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Byb3BfSW5jcmVhc2VYSGVpZ2h0XwotICB7Ci0gICAgRlRfRmFjZSAgZmFjZTsKLSAgICBGVF9VSW50ICBsaW1pdDsKLQotICB9IEZUX1Byb3BfSW5jcmVhc2VYSGVpZ2h0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICB3YXJwaW5nCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKLSAgICoKLSAgICogICBJZiBGcmVlVHlwZSBnZXRzIGNvbXBpbGVkIHdpdGggb3B0aW9uIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUiB0bwotICAgKiAgIGFjdGl2YXRlIHRoZSB3YXJwIGhpbnRpbmcgY29kZSBpbiB0aGUgYXV0by1oaW50ZXIsIHRoaXMgcHJvcGVydHkKLSAgICogICBzd2l0Y2hlcyB3YXJwaW5nIG9uIGFuZCBvZmYuCi0gICAqCi0gICAqICAgV2FycGluZyBvbmx5IHdvcmtzIGluIGBsaWdodCcgYXV0by1oaW50aW5nIG1vZGUuICBUaGUgaWRlYSBvZiB0aGUKLSAgICogICBjb2RlIGlzIHRvIHNsaWdodGx5IHNjYWxlIGFuZCBzaGlmdCBhIGdseXBoIGFsb25nIHRoZSBub24taGludGVkCi0gICAqICAgZGltZW5zaW9uICh3aGljaCBpcyB1c3VhbGx5IHRoZSBob3Jpem9udGFsIGF4aXMpIHNvIHRoYXQgYXMgbXVjaCBvZgotICAgKiAgIGl0cyBzZWdtZW50cyBhcmUgYWxpZ25lZCAobW9yZSBvciBsZXNzKSB0byB0aGUgZ3JpZC4gIFRvIGZpbmQgb3V0IGEKLSAgICogICBnbHlwaCdzIG9wdGltYWwgc2NhbGluZyBhbmQgc2hpZnRpbmcgdmFsdWUsIHZhcmlvdXMgcGFyYW1ldGVyCi0gICAqICAgY29tYmluYXRpb25zIGFyZSB0cmllZCBhbmQgc2NvcmVkLgotICAgKgotICAgKiAgIEJ5IGRlZmF1bHQsIHdhcnBpbmcgaXMgb2ZmLiAgVGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IHRvIHN3aXRjaCBvbgotICAgKiAgIHdhcnBpbmcgKG9taXR0aW5nIHRoZSBlcnJvciBoYW5kbGluZykuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX0Jvb2wgICAgIHdhcnBpbmcgPSAxOwotICAgKgotICAgKgotICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FycGluZyIsICZ3YXJwaW5nICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudAotICAgKiAgIHZhcmlhYmxlICh1c2luZyB2YWx1ZXMgMSBhbmQgMCBmb3IgYG9uJyBhbmQgYG9mZicsIHJlc3BlY3RpdmVseSkuCi0gICAqCi0gICAqICAgVGhlIHdhcnBpbmcgY29kZSBjYW4gYWxzbyBjaGFuZ2UgYWR2YW5jZSB3aWR0aHMuICBIYXZlIGEgbG9vayBhdCB0aGUKLSAgICogICBgbHNiX2RlbHRhJyBhbmQgYHJzYl9kZWx0YScgZmllbGRzIGluIHRoZSBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZQotICAgKiAgIGZvciBkZXRhaWxzIG9uIGltcHJvdmluZyBpbnRlci1nbHlwaCBkaXN0YW5jZXMgd2hpbGUgcmVuZGVyaW5nLgotICAgKgotICAgKiAgIFNpbmNlIHdhcnBpbmcgaXMgYSBnbG9iYWwgcHJvcGVydHkgb2YgdGhlIGF1dG8taGludGVyIGl0IGlzIGJlc3QgdG8KLSAgICogICBjaGFuZ2UgaXRzIHZhbHVlIGJlZm9yZSByZW5kZXJpbmcgYW55IGZhY2UuICBPdGhlcndpc2UsIHlvdSBzaG91bGQKLSAgICogICByZWxvYWQgYWxsIGZhY2VzIHRoYXQgZ2V0IGF1dG8taGludGVkIGluIGBsaWdodCcgaGludGluZyBtb2RlLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgbm8tc3RlbS1kYXJrZW5pbmdbYXV0b2ZpdF0KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICpFeHBlcmltZW50YWwqICpvbmx5KiwgKnJlcXVpcmVzKiAqbGluZWFyKiAqYWxwaGEqICpibGVuZGluZyogKmFuZCoKLSAgICogICAqZ2FtbWEqICpjb3JyZWN0aW9uKgotICAgKgotICAgKiAgIFN0ZW0gZGFya2VuaW5nIGVtYm9sZGVucyBnbHlwaHMgYXQgc21hbGxlciBzaXplcyB0byBtYWtlIHRoZW0gbW9yZQotICAgKiAgIHJlYWRhYmxlIG9uIGNvbW1vbiBsb3ctRFBJIHNjcmVlbnMgd2hlbiB1c2luZyBsaW5lYXIgYWxwaGEgYmxlbmRpbmcKLSAgICogICBhbmQgZ2FtbWEgY29ycmVjdGlvbiwgc2VlIEBGVF9SZW5kZXJfR2x5cGguICBXaGVuIG5vdCB1c2luZyBsaW5lYXIKLSAgICogICBhbHBoYSBibGVuZGluZyBhbmQgZ2FtbWEgY29ycmVjdGlvbiwgZ2x5cGhzIHdpbGwgYXBwZWFyIGhlYXZ5IGFuZAotICAgKiAgIGZ1enp5IQotICAgKgotICAgKiAgIEdhbW1hIGNvcnJlY3Rpb24gZXNzZW50aWFsbHkgbGlnaHRlbnMgZm9udHMgc2luY2Ugc2hhZGVzIG9mIGdyZXkgYXJlCi0gICAqICAgc2hpZnRlZCB0byBoaWdoZXIgcGl4ZWwgdmFsdWVzICg9fmhpZ2hlciBicmlnaHRuZXNzKSB0byBtYXRjaCB0aGUKLSAgICogICBvcmlnaW5hbCBpbnRlbnRpb24gdG8gdGhlIHJlYWxpdHkgb2Ygb3VyIHNjcmVlbnMuICBUaGUgc2lkZS1lZmZlY3QgaXMKLSAgICogICB0aGF0IGdseXBocyBgdGhpbiBvdXQnLiAgTWFjIE9TflggYW5kIEFkb2JlJ3MgcHJvcHJpZXRhcnkgZm9udAotICAgKiAgIHJlbmRlcmluZyBsaWJyYXJ5IGltcGxlbWVudCBhIGNvdW50ZXItbWVhc3VyZTogc3RlbSBkYXJrZW5pbmcgYXQKLSAgICogICBzbWFsbGVyIHNpemVzIHdoZXJlIHNoYWRlcyBvZiBncmF5IGRvbWluYXRlLiAgQnkgZW1ib2xkZW5pbmcgYSBnbHlwaAotICAgKiAgIHNsaWdodGx5IGluIHJlbGF0aW9uIHRvIGl0cyBwaXhlbCBzaXplLCBpbmRpdmlkdWFsIHBpeGVscyBnZXQgaGlnaGVyCi0gICAqICAgY292ZXJhZ2Ugb2YgZmlsbGVkLWluIG91dGxpbmVzIGFuZCBhcmUgdGhlcmVmb3JlIGBibGFja2VyJy4gIFRoaXMKLSAgICogICBjb3VudGVyYWN0cyB0aGUgYHRoaW5uaW5nIG91dCcgb2YgZ2x5cGhzLCBtYWtpbmcgdGV4dCByZW1haW4gcmVhZGFibGUKLSAgICogICBhdCBzbWFsbGVyIHNpemVzLiAgQWxsIGdseXBocyB0aGF0IHBhc3MgdGhyb3VnaCB0aGUgYXV0by1oaW50ZXIgd2lsbAotICAgKiAgIGJlIGVtYm9sZGVuZWQgdW5sZXNzIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIFRSVUUuCi0gICAqCi0gICAqICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQ0ZGIGRyaXZlciBmb3IgYWxnb3JpdGhtaWMgZGV0YWlscy4gIFRvdGFsCi0gICAqICAgY29uc2lzdGVuY3kgd2l0aCB0aGUgQ0ZGIGRyaXZlciBpcyBjdXJyZW50bHkgbm90IGFjaGlldmVkIGJlY2F1c2UgdGhlCi0gICAqICAgZW1ib2xkZW5pbmcgbWV0aG9kIGRpZmZlcnMgYW5kIGdseXBocyBtdXN0IGJlIHNjYWxlZCBkb3duIG9uIHRoZQotICAgKiAgIFktYXhpcyB0byBrZWVwIG91dGxpbmUgcG9pbnRzIGluc2lkZSB0aGVpciBwcmVjb21wdXRlZCBibHVlIHpvbmVzLgotICAgKiAgIFRoZSBzbWFsbGVyIHRoZSBzaXplIChlc3BlY2lhbGx5IDlwcGVtIGFuZCBkb3duKSwgdGhlIGhpZ2hlciB0aGUgbG9zcwotICAgKiAgIG9mIGVtYm9sZGVuaW5nIHZlcnN1cyB0aGUgQ0ZGIGRyaXZlci4KLSAgICoKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdmlhIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFUycgZW52aXJvbm1lbnQKLSAgICogICB2YXJpYWJsZSBzaW1pbGFyIHRvIHRoZSBDRkYgZHJpdmVyLiAgSXQgY2FuIGFsc28gYmUgc2V0IHBlciBmYWNlCi0gICAqICAgdXNpbmcgQEZUX0ZhY2VfUHJvcGVydGllcyB3aXRoIEBGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkcuCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBjb25zdGFudDoKLSAgICogICBGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkcKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFuIEBGVF9QYXJhbWV0ZXIgdGFnIHRvIGJlIHVzZWQgd2l0aCBARlRfRmFjZV9Qcm9wZXJ0aWVzLiAgVGhlCi0gICAqICAgY29ycmVzcG9uZGluZyBCb29sZWFuIGFyZ3VtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRvIGFwcGx5IHN0ZW0KLSAgICogICBkYXJrZW5pbmcsIG92ZXJyaWRpbmcgdGhlIGdsb2JhbCBkZWZhdWx0IHZhbHVlcyBvciB0aGUgdmFsdWVzIHNldCB1cAotICAgKiAgIHdpdGggQEZUX1Byb3BlcnR5X1NldCAoc2VlIEBuby1zdGVtLWRhcmtlbmluZ1thdXRvZml0XSBhbmQKLSAgICogICBAbm8tc3RlbS1kYXJrZW5pbmdbY2ZmXSkuCi0gICAqCi0gICAqICAgVGhpcyBpcyBhIHBhc3NpdmUgc2V0dGluZyB0aGF0IG9ubHkgdGFrZXMgZWZmZWN0IGlmIHRoZSBmb250IGRyaXZlcgotICAgKiAgIG9yIGF1dG9oaW50ZXIgaG9ub3JzIGl0LCB3aGljaCB0aGUgQ0ZGIGRyaXZlciBhbHdheXMgZG9lcywgYnV0IHRoZQotICAgKiAgIGF1dG9oaW50ZXIgb25seSBpbiBgbGlnaHQnIGhpbnRpbmcgbW9kZSAoYXMgb2YgdmVyc2lvbiAyLjcuMCkuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkcgXAotICAgICAgICAgIEZUX01BS0VfVEFHKCAnZCcsICdhJywgJ3InLCAnaycgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICBkYXJrZW5pbmctcGFyYW1ldGVyc1thdXRvZml0XQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCi0gICAqCi0gICAqICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQ0ZGIGRyaXZlciBmb3IgZGV0YWlscy4gIFRoaXMKLSAgICogICBpbXBsZW1lbnRhdGlvbiBhcHByb3ByaWF0ZXMgdGhlCi0gICAqICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl8qICNkZWZpbmVzIGZvciBjb25zaXN0ZW5jeS4KLSAgICogICBOb3RlIHRoZSBkaWZmZXJlbmNlcyBkZXNjcmliZWQgaW4gQG5vLXN0ZW0tZGFya2VuaW5nW2F1dG9maXRdLgotICAgKgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudAotICAgKiAgIHZhcmlhYmxlIHNpbWlsYXIgdG8gdGhlIENGRiBkcml2ZXIuCi0gICAqLwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVEFVVE9IX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmJveC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGJib3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzYmRjMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmJveC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmJveC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBleGFjdCBiYm94IGNvbXB1dGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGhhcyBhIF9zaW5nbGVfIHJvbGU6IHRvIGNvbXB1dGUgZXhhY3Qgb3V0bGluZSBib3VuZGluZyAqLwotICAvKiBib3hlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIHNlcGFyYXRlZCBmcm9tIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgZm9yIHZhcmlvdXMgdGVjaG5pY2FsICAgICAqLwotICAvKiByZWFzb25zLiAgSXQgbWF5IHdlbGwgYmUgaW50ZWdyYXRlZCBpbiBgZnRvdXRsbicgbGF0ZXIuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRCQk9YX0hfCi0jZGVmaW5lIEZUQkJPWF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSBleGFjdCBib3VuZGluZyBib3ggb2YgYW4gb3V0bGluZS4gIFRoaXMgaXMgc2xvd2VyICAgICAgKi8KLSAgLyogICAgdGhhbiBjb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94LiAgSG93ZXZlciwgaXQgdXNlcyBhbiBhZHZhbmNlZCAgICAgICovCi0gIC8qICAgIGFsZ29yaXRobSB0aGF0IHJldHVybnMgX3ZlcnlfIHF1aWNrbHkgd2hlbiB0aGUgdHdvIGJveGVzICAgICAgICAgICAqLwotICAvKiAgICBjb2luY2lkZS4gIE90aGVyd2lzZSwgdGhlIG91dGxpbmUgQsOpemllciBhcmNzIGFyZSB0cmF2ZXJzZWQgdG8gICAgICovCi0gIC8qICAgIGV4dHJhY3QgdGhlaXIgZXh0cmVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFiYm94ICAgOjogVGhlIG91dGxpbmUncyBleGFjdCBib3VuZGluZyBib3guICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBmb250IGlzIHRyaWNreSBhbmQgdGhlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCB3aXRoICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSwgdGhlIHJlc3VsdGluZyBCQm94IGlzIG1lYW5pbmdsZXNzLiAgVG8gZ2V0ICAgICAgKi8KLSAgLyogICAgcmVhc29uYWJsZSB2YWx1ZXMgZm9yIHRoZSBCQm94IGl0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBnbHlwaCAgICovCi0gIC8qICAgIGF0IGEgbGFyZ2UgcHBlbSB2YWx1ZSAoc28gdGhhdCB0aGUgaGludGluZyBpbnN0cnVjdGlvbnMgY2FuICAgICAgICAqLwotICAvKiAgICBwcm9wZXJseSBzaGlmdCBhbmQgc2NhbGUgdGhlIHN1YmdseXBocyksIHRoZW4gZXh0cmFjdGluZyB0aGUgQkJveCwgKi8KLSAgLyogICAgd2hpY2ggY2FuIGJlIGV2ZW50dWFsbHkgY29udmVydGVkIGJhY2sgdG8gZm9udCB1bml0cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9HZXRfQkJveCggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICAgICphYmJveCApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRCQk9YX0hfICovCi0KLQotLyogRU5EICovCi0KLQotLyogTG9jYWwgVmFyaWFibGVzOiAqLwotLyogY29kaW5nOiB1dGYtOCAgICAqLwotLyogRW5kOiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDMxMDZiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRiZGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQkRGLXNwZWNpZmljIHN0cmluZ3MgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRCREZfSF8KLSNkZWZpbmUgRlRCREZfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmRmX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkRGIGFuZCBQQ0YgRmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkRGIGFuZCBQQ0Ygc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gQkRGICovCi0gIC8qICAgIGFuZCBQQ0YgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICAgQkRGX1Byb3BlcnR5VHlwZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIEEgbGlzdCBvZiBCREYgcHJvcGVydHkgdHlwZXMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgIEJERl9QUk9QRVJUWV9UWVBFX05PTkUgOjoKLSAgICogICAgICBWYWx1ZX4wIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBtaXNzaW5nIHByb3BlcnR5LgotICAgKgotICAgKiAgICBCREZfUFJPUEVSVFlfVFlQRV9BVE9NIDo6Ci0gICAqICAgICAgUHJvcGVydHkgaXMgYSBzdHJpbmcgYXRvbS4KLSAgICoKLSAgICogICAgQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUiA6OgotICAgKiAgICAgIFByb3BlcnR5IGlzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLgotICAgKgotICAgKiAgICBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCA6OgotICAgKiAgICAgIFByb3BlcnR5IGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEJERl9Qcm9wZXJ0eVR5cGVfCi0gIHsKLSAgICBCREZfUFJPUEVSVFlfVFlQRV9OT05FICAgICA9IDAsCi0gICAgQkRGX1BST1BFUlRZX1RZUEVfQVRPTSAgICAgPSAxLAotICAgIEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVIgID0gMiwKLSAgICBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCA9IDMKLQotICB9IEJERl9Qcm9wZXJ0eVR5cGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICAgQkRGX1Byb3BlcnR5Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgQSBoYW5kbGUgdG8gYSBAQkRGX1Byb3BlcnR5UmVjIHN0cnVjdHVyZSB0byBtb2RlbCBhIGdpdmVuCi0gICAqICAgIEJERi9QQ0YgcHJvcGVydHkuCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBCREZfUHJvcGVydHlSZWNfKiAgQkRGX1Byb3BlcnR5OwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQHN0cnVjdDoKLSAgKiAgICBCREZfUHJvcGVydHlSZWMKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBUaGlzIHN0cnVjdHVyZSBtb2RlbHMgYSBnaXZlbiBCREYvUENGIHByb3BlcnR5LgotICAqCi0gICogQGZpZWxkczoKLSAgKiAgICB0eXBlIDo6Ci0gICogICAgICBUaGUgcHJvcGVydHkgdHlwZS4KLSAgKgotICAqICAgIHUuYXRvbSA6OgotICAqICAgICAgVGhlIGF0b20gc3RyaW5nLCBpZiB0eXBlIGlzIEBCREZfUFJPUEVSVFlfVFlQRV9BVE9NLiAgTWF5IGJlCi0gICogICAgICBOVUxMLCBpbmRpY2F0aW5nIGFuIGVtcHR5IHN0cmluZy4KLSAgKgotICAqICAgIHUuaW50ZWdlciA6OgotICAqICAgICAgQSBzaWduZWQgaW50ZWdlciwgaWYgdHlwZSBpcyBAQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUi4KLSAgKgotICAqICAgIHUuY2FyZGluYWwgOjoKLSAgKiAgICAgIEFuIHVuc2lnbmVkIGludGVnZXIsIGlmIHR5cGUgaXMgQEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMLgotICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQkRGX1Byb3BlcnR5UmVjXwotICB7Ci0gICAgQkRGX1Byb3BlcnR5VHlwZSAgdHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICBjb25zdCBjaGFyKiAgICAgYXRvbTsKLSAgICAgIEZUX0ludDMyICAgICAgICBpbnRlZ2VyOwotICAgICAgRlRfVUludDMyICAgICAgIGNhcmRpbmFsOwotCi0gICAgfSB1OwotCi0gIH0gQkRGX1Byb3BlcnR5UmVjOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0dldF9CREZfQ2hhcnNldF9JRAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFJldHJpZXZlIGEgQkRGIGZvbnQgY2hhcmFjdGVyIHNldCBpZGVudGl0eSwgYWNjb3JkaW5nIHRvCi0gICogICAgdGhlIEJERiBzcGVjaWZpY2F0aW9uLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYWNoYXJzZXRfZW5jb2RpbmcgOjoKLSAgKiAgICAgICBDaGFyc2V0IGVuY29kaW5nLCBhcyBhIEN+c3RyaW5nLCBvd25lZCBieSB0aGUgZmFjZS4KLSAgKgotICAqICAgIGFjaGFyc2V0X3JlZ2lzdHJ5IDo6Ci0gICogICAgICAgQ2hhcnNldCByZWdpc3RyeSwgYXMgYSBDfnN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQkRGIGZhY2VzLCByZXR1cm5pbmcgYW4gZXJyb3Igb3RoZXJ3aXNlLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0JERl9DaGFyc2V0X0lEKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X3JlZ2lzdHJ5ICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfR2V0X0JERl9Qcm9wZXJ0eQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFJldHJpZXZlIGEgQkRGIHByb3BlcnR5IGZyb20gYSBCREYgb3IgUENGIGZvbnQgZmlsZS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgbmFtZSA6OiBUaGUgcHJvcGVydHkgbmFtZS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYXByb3BlcnR5IDo6IFRoZSBwcm9wZXJ0eS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggQkRGIF9hbmRfIFBDRiBmb250cy4gIEl0IHJldHVybnMgYW4gZXJyb3IKLSAgKiAgIG90aGVyd2lzZS4gIEl0IGFsc28gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGluIHRoZQotICAqICAgZm9udC4KLSAgKgotICAqICAgQSBgcHJvcGVydHknIGlzIGEgZWl0aGVyIGtleS12YWx1ZSBwYWlyIHdpdGhpbiB0aGUgU1RBUlRQUk9QRVJUSUVTCi0gICogICAuLi4gRU5EUFJPUEVSVElFUyBibG9jayBvZiBhIEJERiBmb250IG9yIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUKLSAgKiAgIGBpbmZvLT5wcm9wcycgYXJyYXkgd2l0aGluIGEgYEZvbnRSZWMnIHN0cnVjdHVyZSBvZiBhIFBDRiBmb250LgotICAqCi0gICogICBJbnRlZ2VyIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBzdG9yZWQgYXMgYHNpZ25lZCcgd2l0aGluIFBDRiBmb250czsKLSAgKiAgIGNvbnNlcXVlbnRseSwgQEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMIGlzIGEgcG9zc2libGUgcmV0dXJuIHZhbHVlCi0gICogICBmb3IgQkRGIGZvbnRzIG9ubHkuCi0gICoKLSAgKiAgIEluIGNhc2Ugb2YgZXJyb3IsIGBhcHJvcGVydHktPnR5cGUnIGlzIGFsd2F5cyBzZXQgdG8KLSAgKiAgIEBCREZfUFJPUEVSVFlfVFlQRV9OT05FLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0JERl9Qcm9wZXJ0eSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgICAgcHJvcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCREZfUHJvcGVydHlSZWMgICphcHJvcGVydHkgKTsKLQotICAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVEJERl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGIyNDAyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJpdG1hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGJpdG1hcHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRCSVRNQVBfSF8KLSNkZWZpbmUgRlRCSVRNQVBfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXBfaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCaXRtYXAgSGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIYW5kbGluZyBGVF9CaXRtYXAgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBARlRfQml0bWFwIG9iamVjdHMuICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IG5vbmUgb2YgdGhlIGZ1bmN0aW9ucyBjaGFuZ2VzIHRoZSBiaXRtYXAncyBgZmxvdycgKGFzICAgICovCi0gIC8qICAgIGluZGljYXRlZCBieSB0aGUgc2lnbiBvZiB0aGUgYHBpdGNoJyBmaWVsZCBpbiBgRlRfQml0bWFwJykuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgcG9pbnRlciB0byBhbiBARlRfQml0bWFwIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYml0bWFwIDo6IEEgcG9pbnRlciB0byB0aGUgYml0bWFwIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRlcHJlY2F0ZWQgbmFtZSBmb3IgdGhlIHNhbWUgZnVuY3Rpb24gaXMgYEZUX0JpdG1hcF9OZXcnLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0JpdG1hcF9Jbml0KCBGVF9CaXRtYXAgICphYml0bWFwICk7Ci0KLQotICAvKiBkZXByZWNhdGVkICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0JpdG1hcF9OZXcoIEZUX0JpdG1hcCAgKmFiaXRtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvcHkgYSBiaXRtYXAgaW50byBhbm90aGVyIG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0ICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0NvcHkoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICp0YXJnZXQpOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX0VtYm9sZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW1ib2xkZW4gYSBiaXRtYXAuICBUaGUgbmV3IGJpdG1hcCB3aWxsIGJlIGFib3V0IGB4U3RyZW5ndGgnICAgICAgICovCi0gIC8qICAgIHBpeGVscyB3aWRlciBhbmQgYHlTdHJlbmd0aCcgcGl4ZWxzIGhpZ2hlci4gIFRoZSBsZWZ0IGFuZCBib3R0b20gICAqLwotICAvKiAgICBib3JkZXJzIGFyZSBrZXB0IHVuY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhTdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkIGhvcml6b250YWxseS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlTdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkIHZlcnRpY2FsbHkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZXN0cmljdHMgYHhTdHJlbmd0aCcgdG8gYmUgbGVzcyB0aGFuICAgKi8KLSAgLyogICAgb3IgZXF1YWwgdG9+OCBpZiBiaXRtYXAgaXMgb2YgcGl4ZWxfbW9kZSBARlRfUElYRUxfTU9ERV9NT05PLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3Ugd2FudCB0byBlbWJvbGRlbiB0aGUgYml0bWFwIG93bmVkIGJ5IGEgQEZUX0dseXBoU2xvdFJlYywgICAgKi8KLSAgLyogICAgeW91IHNob3VsZCBjYWxsIEBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCBvbiB0aGUgc2xvdCBmaXJzdC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCaXRtYXBzIGluIEBGVF9QSVhFTF9NT0RFX0dSQVkyIGFuZCBARlRfUElYRUxfTU9ERV9HUkFZQCBmb3JtYXQgICAgKi8KLSAgLyogICAgYXJlIGNvbnZlcnRlZCB0byBARlRfUElYRUxfTU9ERV9HUkFZIGZvcm1hdCAoaS5lLiwgOGJwcCkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0VtYm9sZGVuKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4U3RyZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeVN0cmVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfQ29udmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0IGEgYml0bWFwIG9iamVjdCB3aXRoIGRlcHRoIDFicHAsIDJicHAsIDRicHAsIDhicHAgb3IgMzJicHAgKi8KLSAgLyogICAgdG8gYSBiaXRtYXAgb2JqZWN0IHdpdGggZGVwdGggOGJwcCwgbWFraW5nIHRoZSBudW1iZXIgb2YgdXNlZCAgICAgICovCi0gIC8qICAgIGJ5dGVzIGxpbmUgKGEuay5hLiB0aGUgYHBpdGNoJykgYSBtdWx0aXBsZSBvZiBgYWxpZ25tZW50Jy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlICAgIDo6IFRoZSBzb3VyY2UgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbGlnbm1lbnQgOjogVGhlIHBpdGNoIG9mIHRoZSBiaXRtYXAgaXMgYSBtdWx0aXBsZSBvZiB0aGlzICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gIENvbW1vbiB2YWx1ZXMgYXJlIDEsIDIsIG9yIDQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0ICAgIDo6IFRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgaXMgcG9zc2libGUgdG8gY2FsbCBARlRfQml0bWFwX0NvbnZlcnQgbXVsdGlwbGUgdGltZXMgd2l0aG91dCAgICovCi0gIC8qICAgIGNhbGxpbmcgQEZUX0JpdG1hcF9Eb25lICh0aGUgbWVtb3J5IGlzIHNpbXBseSByZWFsbG9jYXRlZCkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9CaXRtYXBfRG9uZSB0byBmaW5hbGx5IHJlbW92ZSB0aGUgYml0bWFwIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYGxpYnJhcnknIGFyZ3VtZW50IGlzIHRha2VuIHRvIGhhdmUgYWNjZXNzIHRvIEZyZWVUeXBlJ3MgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0NvbnZlcnQoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICp0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgICBhbGlnbm1lbnQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdF9Pd25fQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1ha2Ugc3VyZSB0aGF0IGEgZ2x5cGggc2xvdCBvd25zIGBzbG90LT5iaXRtYXAnLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgOjogVGhlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfQml0bWFwX0VtYm9sZGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGEgYml0bWFwIG9iamVjdCBpbml0aWFsaXplZCB3aXRoIEBGVF9CaXRtYXBfSW5pdC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcCAgOjogVGhlIGJpdG1hcCBvYmplY3QgdG8gYmUgZnJlZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbGlicmFyeScgYXJndW1lbnQgaXMgdGFrZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gRnJlZVR5cGUncyAgICAgICAqLwotICAvKiAgICBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfRG9uZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgKmJpdG1hcCApOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVEJJVE1BUF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGJ6aXAyLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0N2E3OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJ6aXAyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQnppcDItY29tcHJlc3NlZCBzdHJlYW0gc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEpvZWwgS2xpbmdoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRCWklQMl9IXwotI2RlZmluZSBGVEJaSVAyX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiemlwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCWklQMiBTdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2luZyBiemlwMi1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIEJ6aXAyLXNwZWNpZmljIGZ1bmN0aW9ucy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9TdHJlYW1fT3BlbkJ6aXAyCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBiemlwMi1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICBUaGlzIGlzCi0gICogICBtYWlubHkgdXNlZCB0byBzdXBwb3J0IHRoZSBjb21wcmVzc2VkIGAqLnBjZi5iejInIGZvbnRzIHRoYXQgY29tZQotICAqICAgd2l0aCBYRnJlZTg2LgotICAqCi0gICogQGlucHV0OgotICAqICAgc3RyZWFtIDo6Ci0gICogICAgIFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KLSAgKgotICAqICAgc291cmNlIDo6Ci0gICogICAgIFRoZSBzb3VyY2Ugc3RyZWFtLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAgKgotICAqICAgQ2FsbGluZyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIG5ldyBzdHJlYW0gd2lsbAotICAqICAgKm5vdCogY2FsbCBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgc291cmNlIHN0cmVhbS4gIE5vbmUgb2YgdGhlIHN0cmVhbQotICAqICAgb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgotICAqCi0gICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgotICAqICAgcHJvY2VzcyBlYWNoIHRpbWUgc2Vla2luZyBiYWNrd2FyZHMgaXMgbmVlZGVkIHdpdGhpbiB0aGUgc3RyZWFtLgotICAqCi0gICogICBJbiBjZXJ0YWluIGJ1aWxkcyBvZiB0aGUgbGlicmFyeSwgYnppcDIgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKLSAgKiAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aGVuIGNhbGxpbmcgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UuCi0gICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3Ci0gICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbQotICAqICAgZnJvbSBpdCBhbmQgcmUtb3BlbiB0aGUgZmFjZSB3aXRoIGl0LgotICAqCi0gICogICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHlvdXIgYnVpbGQKLSAgKiAgIG9mIEZyZWVUeXBlIHdhcyBub3QgY29tcGlsZWQgd2l0aCBiemlwMiBzdXBwb3J0LgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5CemlwMiggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc291cmNlICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVEJaSVAyX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmYzY2NmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNhY2hlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQ2FjaGUgc3Vic3lzdGVtIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRDQUNIRV9IXwotI2RlZmluZSBGVENBQ0hFX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9HTFlQSF9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiA8U2VjdGlvbj4KLSAgICogICAgY2FjaGVfc3Vic3lzdGVtCi0gICAqCi0gICAqIDxUaXRsZT4KLSAgICogICAgQ2FjaGUgU3ViLVN5c3RlbQotICAgKgotICAgKiA8QWJzdHJhY3Q+Ci0gICAqICAgIEhvdyB0byBjYWNoZSBmYWNlLCBzaXplLCBhbmQgZ2x5cGggZGF0YSB3aXRoIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqIDxEZXNjcmlwdGlvbj4KLSAgICogICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0sIHdoaWNoIGlzIHVzZWQKLSAgICogICB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnRseSBvcGVuZWQgQEZUX0ZhY2UgYW5kIEBGVF9TaXplCi0gICAqICAgb2JqZWN0cywgYXMgd2VsbCBhcyBjYWNoaW5nIGluZm9ybWF0aW9uIGxpa2UgY2hhcmFjdGVyIG1hcHMgYW5kIGdseXBoCi0gICAqICAgaW1hZ2VzIHdoaWxlIGxpbWl0aW5nIHRoZWlyIG1heGltdW0gbWVtb3J5IHVzYWdlLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCBhbGwgdHlwZXMgYW5kIGZ1bmN0aW9ucyBiZWdpbiB3aXRoIHRoZSBgRlRDXycgcHJlZml4LgotICAgKgotICAgKiAgIFRoZSBjYWNoZSBpcyBoaWdobHkgcG9ydGFibGUgYW5kIHRodXMgZG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZQotICAgKiAgIGZvbnRzIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbSwgb3IgaG93IHRvIGFjY2VzcyB0aGVtLiAgVGhpcyBpbXBsaWVzCi0gICAqICAgdGhlIGZvbGxvd2luZyBzY2hlbWU6Ci0gICAqCi0gICAqICAgRmlyc3QsIGF2YWlsYWJsZSBvciBpbnN0YWxsZWQgZm9udCBmYWNlcyBhcmUgdW5pcXVlbHkgaWRlbnRpZmllZCBieQotICAgKiAgIEBGVENfRmFjZUlEIHZhbHVlcywgcHJvdmlkZWQgdG8gdGhlIGNhY2hlIGJ5IHRoZSBjbGllbnQuICBOb3RlIHRoYXQKLSAgICogICB0aGUgY2FjaGUgb25seSBzdG9yZXMgYW5kIGNvbXBhcmVzIHRoZXNlIHZhbHVlcywgYW5kIGRvZXNuJ3QgdHJ5IHRvCi0gICAqICAgaW50ZXJwcmV0IHRoZW0gaW4gYW55IHdheS4KLSAgICoKLSAgICogICBTZWNvbmQsIHRoZSBjYWNoZSBjYWxscywgb25seSB3aGVuIG5lZWRlZCwgYSBjbGllbnQtcHJvdmlkZWQgZnVuY3Rpb24KLSAgICogICB0byBjb252ZXJ0IGFuIEBGVENfRmFjZUlEIGludG8gYSBuZXcgQEZUX0ZhY2Ugb2JqZWN0LiAgVGhlIGxhdHRlciBpcwotICAgKiAgIHRoZW4gY29tcGxldGVseSBtYW5hZ2VkIGJ5IHRoZSBjYWNoZSwgaW5jbHVkaW5nIGl0cyB0ZXJtaW5hdGlvbgotICAgKiAgIHRocm91Z2ggQEZUX0RvbmVfRmFjZS4gIFRvIG1vbml0b3IgdGVybWluYXRpb24gb2YgZmFjZSBvYmplY3RzLCB0aGUKLSAgICogICBmaW5hbGl6ZXIgY2FsbGJhY2sgaW4gdGhlIGBnZW5lcmljJyBmaWVsZCBvZiB0aGUgQEZUX0ZhY2Ugb2JqZWN0IGNhbgotICAgKiAgIGJlIHVzZWQsIHdoaWNoIG1pZ2h0IGFsc28gYmUgdXNlZCB0byBzdG9yZSB0aGUgQEZUQ19GYWNlSUQgb2YgdGhlCi0gICAqICAgZmFjZS4KLSAgICoKLSAgICogICBDbGllbnRzIGFyZSBmcmVlIHRvIG1hcCBmYWNlIElEcyB0byBhbnl0aGluZyBlbHNlLiAgVGhlIG1vc3Qgc2ltcGxlCi0gICAqICAgdXNhZ2UgaXMgdG8gYXNzb2NpYXRlIHRoZW0gdG8gYSAocGF0aG5hbWUsZmFjZV9pbmRleCkgcGFpciB0aGF0IGlzCi0gICAqICAgdXNlZCB0byBjYWxsIEBGVF9OZXdfRmFjZS4gIEhvd2V2ZXIsIG1vcmUgY29tcGxleCBzY2hlbWVzIGFyZSBhbHNvCi0gICAqICAgcG9zc2libGUuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IGZvciB0aGUgY2FjaGUgdG8gd29yayBjb3JyZWN0bHksIHRoZSBmYWNlIElEIHZhbHVlcyBtdXN0IGJlCi0gICAqICAgKnBlcnNpc3RlbnQqLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjb250ZW50cyB0aGV5IHBvaW50IHRvIHNob3VsZCBub3QKLSAgICogICBjaGFuZ2UgYXQgcnVudGltZSwgb3IgdGhhdCB0aGVpciB2YWx1ZSBzaG91bGQgbm90IGJlY29tZSBpbnZhbGlkLgotICAgKgotICAgKiAgIElmIHRoaXMgaXMgdW5hdm9pZGFibGUgKGUuZy4sIHdoZW4gYSBmb250IGlzIHVuaW5zdGFsbGVkIGF0IHJ1bnRpbWUpLAotICAgKiAgIHlvdSBzaG91bGQgY2FsbCBARlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlEIGFzIHNvb24gYXMgcG9zc2libGUsIHRvIGxldAotICAgKiAgIHRoZSBjYWNoZSBnZXQgcmlkIG9mIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvbGQgQEZUQ19GYWNlSUQgaXQgbWF5Ci0gICAqICAga2VlcCBpbnRlcm5hbGx5LiAgRmFpbHVyZSB0byBkbyBzbyB3aWxsIGxlYWQgdG8gaW5jb3JyZWN0IGJlaGF2aW91cgotICAgKiAgIG9yIGV2ZW4gY3Jhc2hlcy4KLSAgICoKLSAgICogICBUbyB1c2UgdGhlIGNhY2hlLCBzdGFydCB3aXRoIGNhbGxpbmcgQEZUQ19NYW5hZ2VyX05ldyB0byBjcmVhdGUgYSBuZXcKLSAgICogICBARlRDX01hbmFnZXIgb2JqZWN0LCB3aGljaCBtb2RlbHMgYSBzaW5nbGUgY2FjaGUgaW5zdGFuY2UuICBZb3UgY2FuCi0gICAqICAgdGhlbiBsb29rIHVwIEBGVF9GYWNlIGFuZCBARlRfU2l6ZSBvYmplY3RzIHdpdGgKLSAgICogICBARlRDX01hbmFnZXJfTG9va3VwRmFjZSBhbmQgQEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUsIHJlc3BlY3RpdmVseS4KLSAgICoKLSAgICogICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGNoYXJtYXAgY2FjaGluZywgY2FsbCBARlRDX0NNYXBDYWNoZV9OZXcsIHRoZW4KLSAgICogICBsYXRlciB1c2UgQEZUQ19DTWFwQ2FjaGVfTG9va3VwIHRvIHBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YKLSAgICogICBARlRfR2V0X0NoYXJfSW5kZXgsIG9ubHkgbXVjaCBmYXN0ZXIuCi0gICAqCi0gICAqICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBARlRfR2x5cGggY2FjaGluZywgY2FsbCBARlRDX0ltYWdlQ2FjaGUsIHRoZW4KLSAgICogICBsYXRlciB1c2UgQEZUQ19JbWFnZUNhY2hlX0xvb2t1cCB0byByZXRyaWV2ZSB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgIEBGVF9HbHlwaCBvYmplY3RzIGZyb20gdGhlIGNhY2hlLgotICAgKgotICAgKiAgIElmIHlvdSBuZWVkIGxvdHMgb2Ygc21hbGwgYml0bWFwcywgaXQgaXMgbXVjaCBtb3JlIG1lbW9yeSBlZmZpY2llbnQKLSAgICogICB0byBjYWxsIEBGVENfU0JpdENhY2hlX05ldyBmb2xsb3dlZCBieSBARlRDX1NCaXRDYWNoZV9Mb29rdXAuICBUaGlzCi0gICAqICAgcmV0dXJucyBARlRDX1NCaXRSZWMgc3RydWN0dXJlcywgd2hpY2ggYXJlIHVzZWQgdG8gc3RvcmUgc21hbGwKLSAgICogICBiaXRtYXBzIGRpcmVjdGx5LiAgKEEgc21hbGwgYml0bWFwIGlzIG9uZSB3aG9zZSBtZXRyaWNzIGFuZAotICAgKiAgIGRpbWVuc2lvbnMgYWxsIGZpdCBpbnRvIDgtYml0IGludGVnZXJzKS4KLSAgICoKLSAgICogICBXZSBob3BlIHRvIGFsc28gcHJvdmlkZSBhIGtlcm5pbmcgY2FjaGUgaW4gdGhlIG5lYXIgZnV0dXJlLgotICAgKgotICAgKgotICAgKiA8T3JkZXI+Ci0gICAqICAgRlRDX01hbmFnZXIKLSAgICogICBGVENfRmFjZUlECi0gICAqICAgRlRDX0ZhY2VfUmVxdWVzdGVyCi0gICAqCi0gICAqICAgRlRDX01hbmFnZXJfTmV3Ci0gICAqICAgRlRDX01hbmFnZXJfUmVzZXQKLSAgICogICBGVENfTWFuYWdlcl9Eb25lCi0gICAqICAgRlRDX01hbmFnZXJfTG9va3VwRmFjZQotICAgKiAgIEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUKLSAgICogICBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQKLSAgICoKLSAgICogICBGVENfTm9kZQotICAgKiAgIEZUQ19Ob2RlX1VucmVmCi0gICAqCi0gICAqICAgRlRDX0ltYWdlQ2FjaGUKLSAgICogICBGVENfSW1hZ2VDYWNoZV9OZXcKLSAgICogICBGVENfSW1hZ2VDYWNoZV9Mb29rdXAKLSAgICoKLSAgICogICBGVENfU0JpdAotICAgKiAgIEZUQ19TQml0Q2FjaGUKLSAgICogICBGVENfU0JpdENhY2hlX05ldwotICAgKiAgIEZUQ19TQml0Q2FjaGVfTG9va3VwCi0gICAqCi0gICAqICAgRlRDX0NNYXBDYWNoZQotICAgKiAgIEZUQ19DTWFwQ2FjaGVfTmV3Ci0gICAqICAgRlRDX0NNYXBDYWNoZV9Mb29rdXAKLSAgICoKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBCQVNJQyBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6IEZUQ19GYWNlSUQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFuIG9wYXF1ZSBwb2ludGVyIHR5cGUgdGhhdCBpcyB1c2VkIHRvIGlkZW50aXR5IGZhY2Ugb2JqZWN0cy4gIFRoZQotICAgKiAgIGNvbnRlbnRzIG9mIHN1Y2ggb2JqZWN0cyBpcyBhcHBsaWNhdGlvbi1kZXBlbmRlbnQuCi0gICAqCi0gICAqICAgVGhlc2UgcG9pbnRlcnMgYXJlIHR5cGljYWxseSB1c2VkIHRvIHBvaW50IHRvIGEgdXNlci1kZWZpbmVkCi0gICAqICAgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBmb250IGZpbGUgcGF0aCwgYW5kIGZhY2UgaW5kZXguCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIE5ldmVyIHVzZSBOVUxMIGFzIGEgdmFsaWQgQEZUQ19GYWNlSUQuCi0gICAqCi0gICAqICAgRmFjZSBJRHMgYXJlIHBhc3NlZCBieSB0aGUgY2xpZW50IHRvIHRoZSBjYWNoZSBtYW5hZ2VyIHRoYXQgY2FsbHMsCi0gICAqICAgd2hlbiBuZWVkZWQsIHRoZSBARlRDX0ZhY2VfUmVxdWVzdGVyIHRvIHRyYW5zbGF0ZSB0aGVtIGludG8gbmV3Ci0gICAqICAgQEZUX0ZhY2Ugb2JqZWN0cy4KLSAgICoKLSAgICogICBJZiB0aGUgY29udGVudCBvZiBhIGdpdmVuIGZhY2UgSUQgY2hhbmdlcyBhdCBydW50aW1lLCBvciBpZiB0aGUgdmFsdWUKLSAgICogICBiZWNvbWVzIGludmFsaWQgKGUuZy4sIHdoZW4gdW5pbnN0YWxsaW5nIGEgZm9udCksIHlvdSBzaG91bGQKLSAgICogICBpbW1lZGlhdGVseSBjYWxsIEBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQgYmVmb3JlIGFueSBvdGhlciBjYWNoZQotICAgKiAgIGZ1bmN0aW9uLgotICAgKgotICAgKiAgIEZhaWx1cmUgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gaW5jb3JyZWN0IGJlaGF2aW91ciBvciBldmVuCi0gICAqICAgbWVtb3J5IGxlYWtzIGFuZCBjcmFzaGVzLgotICAgKi8KLSAgdHlwZWRlZiBGVF9Qb2ludGVyICBGVENfRmFjZUlEOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRDX0ZhY2VfUmVxdWVzdGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMuICBJdCBpcyB1c2VkIGJ5Ci0gICAqICAgdGhlIGNhY2hlIG1hbmFnZXIgdG8gdHJhbnNsYXRlIGEgZ2l2ZW4gQEZUQ19GYWNlSUQgaW50byBhIG5ldyB2YWxpZAotICAgKiAgIEBGVF9GYWNlIG9iamVjdCwgb24gZGVtYW5kLgotICAgKgotICAgKiA8SW5wdXQ+Ci0gICAqICAgZmFjZV9pZCA6OgotICAgKiAgICAgVGhlIGZhY2UgSUQgdG8gcmVzb2x2ZS4KLSAgICoKLSAgICogICBsaWJyYXJ5IDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LgotICAgKgotICAgKiAgIHJlcV9kYXRhIDo6Ci0gICAqICAgICBBcHBsaWNhdGlvbi1wcm92aWRlZCByZXF1ZXN0IGRhdGEgKHNlZSBub3RlIGJlbG93KS4KLSAgICoKLSAgICogPE91dHB1dD4KLSAgICogICBhZmFjZSA6OgotICAgKiAgICAgQSBuZXcgQEZUX0ZhY2UgaGFuZGxlLgotICAgKgotICAgKiA8UmV0dXJuPgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIDxOb3RlPgotICAgKiAgIFRoZSB0aGlyZCBwYXJhbWV0ZXIgYHJlcV9kYXRhJyBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBieSB0aGUKLSAgICogICBjbGllbnQgd2hlbiBARlRDX01hbmFnZXJfTmV3IGlzIGNhbGxlZC4KLSAgICoKLSAgICogICBUaGUgZmFjZSByZXF1ZXN0ZXIgc2hvdWxkIG5vdCBwZXJmb3JtIGZ1bm55IHRoaW5ncyBvbiB0aGUgcmV0dXJuZWQKLSAgICogICBmYWNlIG9iamVjdCwgbGlrZSBjcmVhdGluZyBhIG5ldyBARlRfU2l6ZSBmb3IgaXQsIG9yIHNldHRpbmcgYQotICAgKiAgIHRyYW5zZm9ybWF0aW9uIHRocm91Z2ggQEZUX1NldF9UcmFuc2Zvcm0hCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRDX0ZhY2VfUmVxdWVzdGVyKSggRlRDX0ZhY2VJRCAgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIHJlcV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgIGFmYWNlICk7Ci0KLSAgLyogKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgTUFOQUdFUiBPQkpFQ1QgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG9iamVjdCBjb3JyZXNwb25kcyB0byBvbmUgaW5zdGFuY2Ugb2YgdGhlIGNhY2hlLXN1YnN5c3RlbS4gICAgKi8KLSAgLyogICAgSXQgaXMgdXNlZCB0byBjYWNoZSBvbmUgb3IgbW9yZSBARlRfRmFjZSBvYmplY3RzLCBhbG9uZyB3aXRoICAgICAgICovCi0gIC8qICAgIGNvcnJlc3BvbmRpbmcgQEZUX1NpemUgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1hbmFnZXIgaW50ZW50aW9uYWxseSBsaW1pdHMgdGhlIHRvdGFsIG51bWJlciBvZiBvcGVuZWQgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlIGFuZCBARlRfU2l6ZSBvYmplY3RzIHRvIGNvbnRyb2wgbWVtb3J5IHVzYWdlLiAgU2VlIHRoZSAgICAqLwotICAvKiAgICBgbWF4X2ZhY2VzJyBhbmQgYG1heF9zaXplcycgcGFyYW1ldGVycyBvZiBARlRDX01hbmFnZXJfTmV3LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtYW5hZ2VyIGlzIGFsc28gdXNlZCB0byBjYWNoZSBgbm9kZXMnIG9mIHZhcmlvdXMgdHlwZXMgd2hpbGUgICAqLwotICAvKiAgICBsaW1pdGluZyB0aGVpciB0b3RhbCBtZW1vcnkgdXNhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsbCBsaW1pdGF0aW9ucyBhcmUgZW5mb3JjZWQgYnkga2VlcGluZyBsaXN0cyBvZiBtYW5hZ2VkIG9iamVjdHMgICAqLwotICAvKiAgICBpbiBtb3N0LXJlY2VudGx5LXVzZWQgb3JkZXIsIGFuZCBmbHVzaGluZyBvbGQgbm9kZXMgdG8gbWFrZSByb29tICAgKi8KLSAgLyogICAgZm9yIG5ldyBvbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfTWFuYWdlclJlY18qICBGVENfTWFuYWdlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19Ob2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYSBjYWNoZSBub2RlIG9iamVjdC4gIEVhY2ggY2FjaGUgbm9kZSBpcyAgICAgICAqLwotICAvKiAgICByZWZlcmVuY2UtY291bnRlZC4gIEEgbm9kZSB3aXRoIGEgY291bnQgb2Z+MCBtaWdodCBiZSBmbHVzaGVkICAgICAgKi8KLSAgLyogICAgb3V0IG9mIGEgZnVsbCBjYWNoZSB3aGVuZXZlciBhIGxvb2t1cCByZXF1ZXN0IGlzIHBlcmZvcm1lZC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgbG9vayB1cCBub2RlcywgeW91IGhhdmUgdGhlIGFiaWxpdHkgdG8gYGFjcXVpcmUnIHRoZW0sICAgICAgKi8KLSAgLyogICAgaS5lLiwgdG8gaW5jcmVtZW50IHRoZWlyIHJlZmVyZW5jZSBjb3VudC4gIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSAgICovCi0gIC8qICAgIG5vZGUgZnJvbSBiZWluZyBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgdW50aWwgeW91IGV4cGxpY2l0bHkgICAgICAqLwotICAvKiAgICBgcmVsZWFzZScgaXQgKHNlZSBARlRDX05vZGVfVW5yZWYpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBhbHNvIEBGVENfU0JpdENhY2hlX0xvb2t1cCBhbmQgQEZUQ19JbWFnZUNhY2hlX0xvb2t1cC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX05vZGVSZWNfKiAgRlRDX05vZGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgOjogVGhlIHBhcmVudCBGcmVlVHlwZSBsaWJyYXJ5IGhhbmRsZSB0byB1c2UuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9mYWNlcyA6OiBNYXhpbXVtIG51bWJlciBvZiBvcGVuZWQgQEZUX0ZhY2Ugb2JqZWN0cyBtYW5hZ2VkIGJ5ICAqLwotICAvKiAgICAgICAgICAgICAgICAgdGhpcyBjYWNoZSBpbnN0YW5jZS4gIFVzZX4wIGZvciBkZWZhdWx0cy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9zaXplcyA6OiBNYXhpbXVtIG51bWJlciBvZiBvcGVuZWQgQEZUX1NpemUgb2JqZWN0cyBtYW5hZ2VkIGJ5ICAqLwotICAvKiAgICAgICAgICAgICAgICAgdGhpcyBjYWNoZSBpbnN0YW5jZS4gIFVzZX4wIGZvciBkZWZhdWx0cy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9ieXRlcyA6OiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB1c2UgZm9yIGNhY2hlZCBkYXRhIG5vZGVzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgVXNlfjAgZm9yIGRlZmF1bHRzLiAgTm90ZSB0aGF0IHRoaXMgdmFsdWUgZG9lcyBub3QgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGFjY291bnQgZm9yIG1hbmFnZWQgQEZUX0ZhY2UgYW5kIEBGVF9TaXplIG9iamVjdHMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZXF1ZXN0ZXIgOjogQW4gYXBwbGljYXRpb24tcHJvdmlkZWQgY2FsbGJhY2sgdXNlZCB0byB0cmFuc2xhdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGZhY2UgSURzIGludG8gcmVhbCBARlRfRmFjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZXFfZGF0YSAgOjogQSBnZW5lcmljIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHJlcXVlc3RlciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQgKHNlZSBARlRDX0ZhY2VfUmVxdWVzdGVyKS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1hbmFnZXIgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IG1hbmFnZXIgb2JqZWN0LiAgMH5pbiBjYXNlIG9mICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19NYW5hZ2VyX05ldyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgbWF4X2ZhY2VzLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgbWF4X3NpemVzLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgbWF4X2J5dGVzLAotICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlX1JlcXVlc3RlciAgcmVxdWVzdGVyLAotICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgICAgICAgcmVxX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgICAgICAgICphbWFuYWdlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW1wdHkgYSBnaXZlbiBjYWNoZSBtYW5hZ2VyLiAgVGhpcyBzaW1wbHkgZ2V0cyByaWQgb2YgYWxsIHRoZSAgICAgICovCi0gIC8qICAgIGN1cnJlbnRseSBjYWNoZWQgQEZUX0ZhY2UgYW5kIEBGVF9TaXplIG9iamVjdHMgd2l0aGluIHRoZSBtYW5hZ2VyLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRDX01hbmFnZXJfUmVzZXQoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGEgZ2l2ZW4gbWFuYWdlciBhZnRlciBlbXB0eWluZyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgY2FjaGUgbWFuYWdlciBvYmplY3QuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUQ19NYW5hZ2VyX0RvbmUoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9Mb29rdXBGYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgQEZUX0ZhY2Ugb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBmYWNlIElEICAgKi8KLSAgLyogICAgdGhyb3VnaCBhIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2lkIDo6IFRoZSBJRCBvZiB0aGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmV0dXJuZWQgQEZUX0ZhY2Ugb2JqZWN0IGlzIGFsd2F5cyBvd25lZCBieSB0aGUgbWFuYWdlci4gIFlvdSAgKi8KLSAgLyogICAgc2hvdWxkIG5ldmVyIHRyeSB0byBkaXNjYXJkIGl0IHlvdXJzZWxmLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgQEZUX0ZhY2Ugb2JqZWN0IGRvZXNuJ3QgbmVjZXNzYXJpbHkgaGF2ZSBhIGN1cnJlbnQgc2l6ZSBvYmplY3QgKi8KLSAgLyogICAgKGkuZS4sIGZhY2UtPnNpemUgY2FuIGJlfjApLiAgSWYgeW91IG5lZWQgYSBzcGVjaWZpYyBgZm9udCBzaXplJywgICovCi0gIC8qICAgIHVzZSBARlRDX01hbmFnZXJfTG9va3VwU2l6ZSBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTmV2ZXIgY2hhbmdlIHRoZSBmYWNlJ3MgdHJhbnNmb3JtYXRpb24gbWF0cml4IChpLmUuLCBuZXZlciBjYWxsICAgICovCi0gIC8qICAgIHRoZSBARlRfU2V0X1RyYW5zZm9ybSBmdW5jdGlvbikgb24gYSByZXR1cm5lZCBmYWNlISAgSWYgeW91IG5lZWQgICAqLwotICAvKiAgICB0byB0cmFuc2Zvcm0gZ2x5cGhzLCBkbyBpdCB5b3Vyc2VsZiBhZnRlciBnbHlwaCBsb2FkaW5nLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4geW91IHBlcmZvcm0gYSBsb29rdXAsIG91dC1vZi1tZW1vcnkgZXJyb3JzIGFyZSBkZXRlY3RlZCAgICAgICAqLwotICAvKiAgICBfd2l0aGluXyB0aGUgbG9va3VwIGFuZCBmb3JjZSBpbmNyZW1lbnRhbCBmbHVzaGVzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgdW50aWwgZW5vdWdoIG1lbW9yeSBpcyByZWxlYXNlZCBmb3IgdGhlIGxvb2t1cCB0byBzdWNjZWVkLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBhIGxvb2t1cCBmYWlscyB3aXRoIGBGVF9FcnJfT3V0X09mX01lbW9yeScgdGhlIGNhY2hlIGhhcyAgICAgICAgKi8KLSAgLyogICAgYWxyZWFkeSBiZWVuIGNvbXBsZXRlbHkgZmx1c2hlZCwgYW5kIHN0aWxsIG5vIG1lbW9yeSB3YXMgYXZhaWxhYmxlICovCi0gIC8qICAgIGZvciB0aGUgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfRmFjZUlEICAgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgKmFmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU2NhbGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgZ2l2ZW4gY2hhcmFjdGVyIHNpemUgaW4gZWl0aGVyICAgICAgKi8KLSAgLyogICAgcGl4ZWxzIG9yIHBvaW50cyB0byB0aGUgY2FjaGUgbWFuYWdlci4gIFNlZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVENfTWFuYWdlcl9Mb29rdXBTaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaWQgOjogVGhlIHNvdXJjZSBmYWNlIElELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICA6OiBUaGUgY2hhcmFjdGVyIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgIDo6IFRoZSBjaGFyYWN0ZXIgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBpeGVsICAgOjogQSBCb29sZWFuLiAgSWYgMSwgdGhlIGB3aWR0aCcgYW5kIGBoZWlnaHQnIGZpZWxkcyBhcmUgICAqLwotICAvKiAgICAgICAgICAgICAgIGludGVycHJldGVkIGFzIGludGVnZXIgcGl4ZWwgY2hhcmFjdGVyIHNpemVzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIGV4cHJlc3NlZCBhcyAxLzY0dGggb2YgcG9pbnRzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3JlcyAgIDo6IE9ubHkgdXNlZCB3aGVuIGBwaXhlbCcgaXMgdmFsdWV+MCB0byBpbmRpY2F0ZSB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gZHBpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3JlcyAgIDo6IE9ubHkgdXNlZCB3aGVuIGBwaXhlbCcgaXMgdmFsdWV+MCB0byBpbmRpY2F0ZSB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB0eXBlIGlzIG1haW5seSB1c2VkIHRvIHJldHJpZXZlIEBGVF9TaXplIG9iamVjdHMgdGhyb3VnaCB0aGUgICovCi0gIC8qICAgIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19TY2FsZXJSZWNfCi0gIHsKLSAgICBGVENfRmFjZUlEICBmYWNlX2lkOwotICAgIEZUX1VJbnQgICAgIHdpZHRoOwotICAgIEZUX1VJbnQgICAgIGhlaWdodDsKLSAgICBGVF9JbnQgICAgICBwaXhlbDsKLSAgICBGVF9VSW50ICAgICB4X3JlczsKLSAgICBGVF9VSW50ICAgICB5X3JlczsKLQotICB9IEZUQ19TY2FsZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBARlRDX1NjYWxlclJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19TY2FsZXJSZWNfKiAgRlRDX1NjYWxlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBARlRfU2l6ZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuICAgICAgICAgICAqLwotICAvKiAgICBARlRDX1NjYWxlclJlYyBwb2ludGVyIHRocm91Z2ggYSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNjYWxlciAgOjogQSBzY2FsZXIgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzaXplICAgOjogQSBoYW5kbGUgdG8gdGhlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBARlRfU2l6ZSBvYmplY3QgaXMgYWx3YXlzIG93bmVkIGJ5IHRoZSBtYW5hZ2VyLiAgWW91ICAqLwotICAvKiAgICBzaG91bGQgbmV2ZXIgdHJ5IHRvIGRpc2NhcmQgaXQgYnkgeW91cnNlbGYuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBjYW4gYWNjZXNzIHRoZSBwYXJlbnQgQEZUX0ZhY2Ugb2JqZWN0IHNpbXBseSBhcyBgc2l6ZS0+ZmFjZScgICAqLwotICAvKiAgICBpZiB5b3UgbmVlZCBpdC4gIE5vdGUgdGhhdCB0aGlzIG9iamVjdCBpcyBhbHNvIG93bmVkIGJ5IHRoZSAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiB5b3UgcGVyZm9ybSBhIGxvb2t1cCwgb3V0LW9mLW1lbW9yeSBlcnJvcnMgYXJlIGRldGVjdGVkICAgICAgICovCi0gIC8qICAgIF93aXRoaW5fIHRoZSBsb29rdXAgYW5kIGZvcmNlIGluY3JlbWVudGFsIGZsdXNoZXMgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICB1bnRpbCBlbm91Z2ggbWVtb3J5IGlzIHJlbGVhc2VkIGZvciB0aGUgbG9va3VwIHRvIHN1Y2NlZWQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGEgbG9va3VwIGZhaWxzIHdpdGggYEZUX0Vycl9PdXRfT2ZfTWVtb3J5JyB0aGUgY2FjaGUgaGFzICAgICAgICAqLwotICAvKiAgICBhbHJlYWR5IGJlZW4gY29tcGxldGVseSBmbHVzaGVkLCBhbmQgc3RpbGwgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSAgKi8KLSAgLyogICAgZm9yIHRoZSBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX01hbmFnZXJfTG9va3VwU2l6ZSggRlRDX01hbmFnZXIgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TY2FsZXIgICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICphc2l6ZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX05vZGVfVW5yZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVjcmVtZW50IGEgY2FjaGUgbm9kZSdzIGludGVybmFsIHJlZmVyZW5jZSBjb3VudC4gIFdoZW4gdGhlIGNvdW50ICovCi0gIC8qICAgIHJlYWNoZXMgMCwgaXQgaXMgbm90IGRlc3Ryb3llZCBidXQgYmVjb21lcyBlbGlnaWJsZSBmb3Igc3Vic2VxdWVudCAqLwotICAvKiAgICBjYWNoZSBmbHVzaGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlICAgIDo6IFRoZSBjYWNoZSBub2RlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogVGhlIGNhY2hlIG1hbmFnZXIgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRDX05vZGVfVW5yZWYoIEZUQ19Ob2RlICAgICBub2RlLAotICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgIG1hbmFnZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgc3BlY2lhbCBmdW5jdGlvbiB1c2VkIHRvIGluZGljYXRlIHRvIHRoZSBjYWNoZSBtYW5hZ2VyIHRoYXQKLSAgICogICBhIGdpdmVuIEBGVENfRmFjZUlEIGlzIG5vIGxvbmdlciB2YWxpZCwgZWl0aGVyIGJlY2F1c2UgaXRzCi0gICAqICAgY29udGVudCBjaGFuZ2VkLCBvciBiZWNhdXNlIGl0IHdhcyBkZWFsbG9jYXRlZCBvciB1bmluc3RhbGxlZC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG1hbmFnZXIgOjoKLSAgICogICAgIFRoZSBjYWNoZSBtYW5hZ2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBmYWNlX2lkIDo6Ci0gICAqICAgICBUaGUgQEZUQ19GYWNlSUQgdG8gYmUgcmVtb3ZlZC4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIGFsbCBub2RlcyBmcm9tIHRoZSBjYWNoZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMKLSAgICogICBgZmFjZV9pZCcsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBub2RlcyB3aXRoIGEgbm9uLW51bGwgcmVmZXJlbmNlCi0gICAqICAgY291bnQuCi0gICAqCi0gICAqICAgU3VjaCBub2RlcyBhcmUgaG93ZXZlciBtb2RpZmllZCBpbnRlcm5hbGx5IHNvIGFzIHRvIG5ldmVyIGFwcGVhcgotICAgKiAgIGluIGxhdGVyIGxvb2t1cHMgd2l0aCB0aGUgc2FtZSBgZmFjZV9pZCcgdmFsdWUsIGFuZCB0byBiZSBpbW1lZGlhdGVseQotICAgKiAgIGRlc3Ryb3llZCB3aGVuIHJlbGVhc2VkIGJ5IGFsbCB0aGVpciB1c2Vycy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCggRlRDX01hbmFnZXIgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgIGZhY2VfaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlX3N1YnN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRDX0NNYXBDYWNoZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQW4gb3BhcXVlIGhhbmRsZSB1c2VkIHRvIG1vZGVsIGEgY2hhcm1hcCBjYWNoZS4gIFRoaXMgY2FjaGUgaXMgdG8KLSAgICogICBob2xkIGNoYXJhY3RlciBjb2RlcyAtPiBnbHlwaCBpbmRpY2VzIG1hcHBpbmdzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX0NNYXBDYWNoZVJlY18qICBGVENfQ01hcENhY2hlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUQ19DTWFwQ2FjaGVfTmV3Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDcmVhdGUgYSBuZXcgY2hhcm1hcCBjYWNoZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG1hbmFnZXIgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBjYWNoZSBtYW5hZ2VyLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFjYWNoZSA6OgotICAgKiAgICAgQSBuZXcgY2FjaGUgaGFuZGxlLiAgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIExpa2UgYWxsIG90aGVyIGNhY2hlcywgdGhpcyBvbmUgd2lsbCBiZSBkZXN0cm95ZWQgd2l0aCB0aGUgY2FjaGUKLSAgICogICBtYW5hZ2VyLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19DTWFwQ2FjaGVfTmV3KCBGVENfTWFuYWdlciAgICAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUQ19DTWFwQ2FjaGUgICphY2FjaGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUQ19DTWFwQ2FjaGVfTG9va3VwCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUcmFuc2xhdGUgYSBjaGFyYWN0ZXIgY29kZSBpbnRvIGEgZ2x5cGggaW5kZXgsIHVzaW5nIHRoZSBjaGFybWFwCi0gICAqICAgY2FjaGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBjYWNoZSA6OgotICAgKiAgICAgQSBjaGFybWFwIGNhY2hlIGhhbmRsZS4KLSAgICoKLSAgICogICBmYWNlX2lkIDo6Ci0gICAqICAgICBUaGUgc291cmNlIGZhY2UgSUQuCi0gICAqCi0gICAqICAgY21hcF9pbmRleCA6OgotICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGFybWFwIGluIHRoZSBzb3VyY2UgZmFjZS4gIEFueSBuZWdhdGl2ZSB2YWx1ZQotICAgKiAgICAgbWVhbnMgdG8gdXNlIHRoZSBjYWNoZSBARlRfRmFjZSdzIGRlZmF1bHQgY2hhcm1hcC4KLSAgICoKLSAgICogICBjaGFyX2NvZGUgOjoKLSAgICogICAgIFRoZSBjaGFyYWN0ZXIgY29kZSAoaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2hhcm1hcCkuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEdseXBoIGluZGV4LiAgMH5tZWFucyBgbm8gZ2x5cGgnLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50ICkKLSAgRlRDX0NNYXBDYWNoZV9Mb29rdXAoIEZUQ19DTWFwQ2FjaGUgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgICAgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGNtYXBfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgICBjaGFyX2NvZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlX3N1YnN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBJTUFHRSBDQUNIRSBPQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVENfSW1hZ2VUeXBlUmVjCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSB0eXBlIG9mIGltYWdlcyBpbiBhIGdseXBoIGNhY2hlLgotICAgKgotICAgKiBAZmllbGRzOgotICAgKiAgIGZhY2VfaWQgOjoKLSAgICogICAgIFRoZSBmYWNlIElELgotICAgKgotICAgKiAgIHdpZHRoIDo6Ci0gICAqICAgICBUaGUgd2lkdGggaW4gcGl4ZWxzLgotICAgKgotICAgKiAgIGhlaWdodCA6OgotICAgKiAgICAgVGhlIGhlaWdodCBpbiBwaXhlbHMuCi0gICAqCi0gICAqICAgZmxhZ3MgOjoKLSAgICogICAgIFRoZSBsb2FkIGZsYWdzLCBhcyBpbiBARlRfTG9hZF9HbHlwaC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVENfSW1hZ2VUeXBlUmVjXwotICB7Ci0gICAgRlRDX0ZhY2VJRCAgZmFjZV9pZDsKLSAgICBGVF9VSW50ICAgICB3aWR0aDsKLSAgICBGVF9VSW50ICAgICBoZWlnaHQ7Ci0gICAgRlRfSW50MzIgICAgZmxhZ3M7Ci0KLSAgfSBGVENfSW1hZ2VUeXBlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRDX0ltYWdlVHlwZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBoYW5kbGUgdG8gYW4gQEZUQ19JbWFnZVR5cGVSZWMgc3RydWN0dXJlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX0ltYWdlVHlwZVJlY18qICBGVENfSW1hZ2VUeXBlOwotCi0KLSAgLyogKi8KLQotCi0jZGVmaW5lIEZUQ19JTUFHRV9UWVBFX0NPTVBBUkUoIGQxLCBkMiApICAgICAgXAotICAgICAgICAgICggKGQxKS0+ZmFjZV9pZCA9PSAoZDIpLT5mYWNlX2lkICYmIFwKLSAgICAgICAgICAgIChkMSktPndpZHRoICAgPT0gKGQyKS0+d2lkdGggICAmJiBcCi0gICAgICAgICAgICAoZDEpLT5mbGFncyAgID09IChkMiktPmZsYWdzICAgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX0ltYWdlQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnbHlwaCBpbWFnZSBjYWNoZSBvYmplY3QuICBUaGV5IGFyZSBkZXNpZ25lZCB0byAgICAgICovCi0gIC8qICAgIGhvbGQgbWFueSBkaXN0aW5jdCBnbHlwaCBpbWFnZXMgd2hpbGUgbm90IGV4Y2VlZGluZyBhIGNlcnRhaW4gICAgICAqLwotICAvKiAgICBtZW1vcnkgdGhyZXNob2xkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19JbWFnZUNhY2hlUmVjXyogIEZUQ19JbWFnZUNhY2hlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX0ltYWdlQ2FjaGVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBUaGUgcGFyZW50IG1hbmFnZXIgZm9yIHRoZSBpbWFnZSBjYWNoZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IGdseXBoIGltYWdlIGNhY2hlIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX0ltYWdlQ2FjaGVfTmV3KCBGVENfTWFuYWdlciAgICAgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRDX0ltYWdlQ2FjaGUgICphY2FjaGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19JbWFnZUNhY2hlX0xvb2t1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgZnJvbSBhIGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHlwZSAgIDo6IEEgcG9pbnRlciB0byBhIGdseXBoIGltYWdlIHR5cGUgZGVzY3JpcHRvci4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggOjogVGhlIGdseXBoIGluZGV4IHRvIHJldHJpZXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGggOjogVGhlIGNvcnJlc3BvbmRpbmcgQEZUX0dseXBoIG9iamVjdC4gIDB+aW4gY2FzZSBvZiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGZhaWx1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbm9kZSAgOjogVXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2FjaGUgICAgKi8KLSAgLyogICAgICAgICAgICAgIG5vZGUgYWZ0ZXIgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQgKHNlZSBub3RlICAgICovCi0gIC8qICAgICAgICAgICAgICBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBnbHlwaCBpcyBvd25lZCBhbmQgbWFuYWdlZCBieSB0aGUgZ2x5cGggaW1hZ2UgY2FjaGUuICAqLwotICAvKiAgICBOZXZlciB0cnkgdG8gdHJhbnNmb3JtIG9yIGRpc2NhcmQgaXQgbWFudWFsbHkhICBZb3UgY2FuIGhvd2V2ZXIgICAgKi8KLSAgLyogICAgY3JlYXRlIGEgY29weSB3aXRoIEBGVF9HbHlwaF9Db3B5IGFuZCBtb2RpZnkgdGhlIG5ldyBvbmUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBnbHlwaCBpbWFnZSwgYWZ0ZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlICAgICovCi0gIC8qICAgIGNvdW50LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG5vZGUgKGFzIHdlbGwgYXMgdGhlIEBGVF9HbHlwaCkgd2lsbCAqLwotICAvKiAgICBhbHdheXMgYmUga2VwdCBpbiB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvICAgICAgKi8KLSAgLyogICAgYHJlbGVhc2UnIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIE5VTEwsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucyAgKi8KLSAgLyogICAgdGhhdCB0aGUgQEZUX0dseXBoIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCAgICovCi0gIC8qICAgIGNhbGwgdG8gb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0ICAqLwotICAvKiAgICBpcyBwZXJzaXN0ZW50ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfSW1hZ2VDYWNoZV9Mb29rdXAoIEZUQ19JbWFnZUNhY2hlICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVENfSW1hZ2VUeXBlICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoICAgICAgICphZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAgKmFub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfSW1hZ2VDYWNoZV9Mb29rdXBTY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZhcmlhbnQgb2YgQEZUQ19JbWFnZUNhY2hlX0xvb2t1cCB0aGF0IHVzZXMgYW4gQEZUQ19TY2FsZXJSZWMgICAgKi8KLSAgLyogICAgdG8gc3BlY2lmeSB0aGUgZmFjZSBJRCBhbmQgaXRzIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzY2FsZXIgICAgIDo6IEEgcG9pbnRlciB0byBhIHNjYWxlciBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogVGhlIGNvcnJlc3BvbmRpbmcgbG9hZCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgICA6OiBUaGUgZ2x5cGggaW5kZXggdG8gcmV0cmlldmUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdseXBoICAgICA6OiBUaGUgY29ycmVzcG9uZGluZyBARlRfR2x5cGggb2JqZWN0LiAgMH5pbiBjYXNlIG9mICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmFpbHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5vZGUgICAgICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY2FjaGUgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIChzZWUgbm90ZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmV0dXJuZWQgZ2x5cGggaXMgb3duZWQgYW5kIG1hbmFnZWQgYnkgdGhlIGdseXBoIGltYWdlIGNhY2hlLiAgKi8KLSAgLyogICAgTmV2ZXIgdHJ5IHRvIHRyYW5zZm9ybSBvciBkaXNjYXJkIGl0IG1hbnVhbGx5ISAgWW91IGNhbiBob3dldmVyICAgICovCi0gIC8qICAgIGNyZWF0ZSBhIGNvcHkgd2l0aCBARlRfR2x5cGhfQ29weSBhbmQgbW9kaWZ5IHRoZSBuZXcgb25lLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBfbm90XyBOVUxMLCBpdCByZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIG5vZGUgY29udGFpbmluZyB0aGUgZ2x5cGggaW1hZ2UsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSAgICAqLwotICAvKiAgICBjb3VudC4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBARlRfR2x5cGgpIHdpbGwgKi8KLSAgLyogICAgYWx3YXlzIGJlIGtlcHQgaW4gdGhlIGNhY2hlIHVudGlsIHlvdSBjYWxsIEBGVENfTm9kZV9VbnJlZiB0byAgICAgICovCi0gIC8qICAgIGByZWxlYXNlJyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBOVUxMLCB0aGUgY2FjaGUgbm9kZSBpcyBsZWZ0IHVuY2hhbmdlZCwgd2hpY2ggbWVhbnMgICovCi0gIC8qICAgIHRoYXQgdGhlIEBGVF9HbHlwaCBjb3VsZCBiZSBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgb24gdGhlIG5leHQgICAqLwotICAvKiAgICBjYWxsIHRvIG9uZSBvZiB0aGUgY2FjaGluZyBzdWItc3lzdGVtIEFQSXMuICBEb24ndCBhc3N1bWUgdGhhdCBpdCAgKi8KLSAgLyogICAgaXMgcGVyc2lzdGVudCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDYWxscyB0byBARlRfU2V0X0NoYXJfU2l6ZSBhbmQgZnJpZW5kcyBoYXZlIG5vIGVmZmVjdCBvbiBjYWNoZWQgICAgKi8KLSAgLyogICAgZ2x5cGhzOyB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSSBpbnN0ZWFkLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyKCBGVENfSW1hZ2VDYWNoZSAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NjYWxlciAgICAgIHNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoICAgICAgICphZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAgKmFub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yLiAgU2VlIHRoZSBARlRDX1NCaXRSZWMgICAgICAgKi8KLSAgLyogICAgc3RydWN0dXJlIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfU0JpdFJlY18qICBGVENfU0JpdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBjb21wYWN0IHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgc21hbGwgZ2x5cGggYml0bWFwLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgICA6OiBUaGUgYml0bWFwIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICAgIDo6IFRoZSBiaXRtYXAgaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0ICAgICAgOjogVGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgcGVuIHBvc2l0aW9uIHRvIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGxlZnQgYml0bWFwIGJvcmRlciAoYS5rLmEuIGBsZWZ0IHNpZGUgYmVhcmluZycsIG9yICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBgbHNiJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG9wICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBmcm9tIHRoZSBwZW4gcG9zaXRpb24gKG9uIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICBiYXNlbGluZSkgdG8gdGhlIHVwcGVyIGJpdG1hcCBib3JkZXIgKGEuay5hLiBgdG9wICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgc2lkZSBiZWFyaW5nJykuICBUaGUgZGlzdGFuY2UgaXMgcG9zaXRpdmUgZm9yIHVwd2FyZHMgKi8KLSAgLyogICAgICAgICAgICAgICAgIHl+Y29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXQgICAgOjogVGhlIGZvcm1hdCBvZiB0aGUgZ2x5cGggYml0bWFwIChtb25vY2hyb21lIG9yIGdyYXkpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9ncmF5cyA6OiBNYXhpbXVtIGdyYXkgbGV2ZWwgdmFsdWUgKGluIHRoZSByYW5nZSAxIHRvfjI1NSkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl0Y2ggICAgIDo6IFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGJpdG1hcCBsaW5lLiAgTWF5IGJlIHBvc2l0aXZlICovCi0gIC8qICAgICAgICAgICAgICAgICBvciBuZWdhdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeGFkdmFuY2UgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2Ugd2lkdGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5YWR2YW5jZSAgOjogVGhlIHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19TQml0UmVjXwotICB7Ci0gICAgRlRfQnl0ZSAgIHdpZHRoOwotICAgIEZUX0J5dGUgICBoZWlnaHQ7Ci0gICAgRlRfQ2hhciAgIGxlZnQ7Ci0gICAgRlRfQ2hhciAgIHRvcDsKLQotICAgIEZUX0J5dGUgICBmb3JtYXQ7Ci0gICAgRlRfQnl0ZSAgIG1heF9ncmF5czsKLSAgICBGVF9TaG9ydCAgcGl0Y2g7Ci0gICAgRlRfQ2hhciAgIHhhZHZhbmNlOwotICAgIEZUX0NoYXIgICB5YWR2YW5jZTsKLQotICAgIEZUX0J5dGUqICBidWZmZXI7Ci0KLSAgfSBGVENfU0JpdFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0Q2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgc21hbGwgYml0bWFwIGNhY2hlLiAgVGhlc2UgYXJlIHNwZWNpYWwgY2FjaGUgb2JqZWN0cyAqLwotICAvKiAgICB1c2VkIHRvIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMgKGFuZCBhbnRpLWFsaWFzZWQgcGl4bWFwcykgaW4gYSAgKi8KLSAgLyogICAgbXVjaCBtb3JlIGVmZmljaWVudCB3YXkgdGhhbiB0aGUgdHJhZGl0aW9uYWwgZ2x5cGggaW1hZ2UgY2FjaGUgICAgICovCi0gIC8qICAgIGltcGxlbWVudGVkIGJ5IEBGVENfSW1hZ2VDYWNoZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX1NCaXRDYWNoZVJlY18qICBGVENfU0JpdENhY2hlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRDYWNoZV9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGNhY2hlIHRvIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHNiaXQgY2FjaGUuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX1NCaXRDYWNoZV9OZXcoIEZUQ19NYW5hZ2VyICAgICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRDX1NCaXRDYWNoZSAgKmFjYWNoZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRDYWNoZV9Mb29rdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9vayB1cCBhIGdpdmVuIHNtYWxsIGdseXBoIGJpdG1hcCBpbiBhIGdpdmVuIHNiaXQgY2FjaGUgYW5kICAgICAgICovCi0gIC8qICAgIGBsb2NrJyBpdCB0byBwcmV2ZW50IGl0cyBmbHVzaGluZyBmcm9tIHRoZSBjYWNoZSB1bnRpbCBuZWVkZWQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIHNiaXQgY2FjaGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHlwZSAgIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggaW1hZ2UgdHlwZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0ICAgOjogQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAoc2VlIG5vdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yIGFuZCBpdHMgYml0IGJ1ZmZlciBhcmUgb3duZWQgYnkgdGhlICAgICovCi0gIC8qICAgIGNhY2hlIGFuZCBzaG91bGQgbmV2ZXIgYmUgZnJlZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhleSBtaWdodCAgICAqLwotICAvKiAgICBhcyB3ZWxsIGRpc2FwcGVhciBmcm9tIG1lbW9yeSBvbiB0aGUgbmV4dCBjYWNoZSBsb29rdXAsIHNvIGRvbid0ICAgKi8KLSAgLyogICAgdHJlYXQgdGhlbSBhcyBwZXJzaXN0ZW50IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVzY3JpcHRvcidzIGBidWZmZXInIGZpZWxkIGlzIHNldCB0b34wIHRvIGluZGljYXRlIGEgbWlzc2luZyAgKi8KLSAgLyogICAgZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBiaXRtYXAsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4gICovCi0gIC8qICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBpbWFnZSkgd2lsbCBhbHdheXMgYmUgICAqLwotICAvKiAgICBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gYHJlbGVhc2UnIGl0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBiaXRtYXAgY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19TQml0Q2FjaGVfTG9va3VwKCBGVENfU0JpdENhY2hlICAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ltYWdlVHlwZSAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfU0JpdCAgICAgICAgKnNiaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICAgKmFub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZhcmlhbnQgb2YgQEZUQ19TQml0Q2FjaGVfTG9va3VwIHRoYXQgdXNlcyBhbiBARlRDX1NjYWxlclJlYyAgICAgKi8KLSAgLyogICAgdG8gc3BlY2lmeSB0aGUgZmFjZSBJRCBhbmQgaXRzIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIHNiaXQgY2FjaGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzY2FsZXIgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgc2NhbGVyIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogVGhlIGNvcnJlc3BvbmRpbmcgbG9hZCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2JpdCAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbm9kZSAgICAgIDo6IFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYWNoZSBub2RlIGFmdGVyIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgKHNlZSBub3RlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvciBhbmQgaXRzIGJpdCBidWZmZXIgYXJlIG93bmVkIGJ5IHRoZSAgICAqLwotICAvKiAgICBjYWNoZSBhbmQgc2hvdWxkIG5ldmVyIGJlIGZyZWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZXkgbWlnaHQgICAgKi8KLSAgLyogICAgYXMgd2VsbCBkaXNhcHBlYXIgZnJvbSBtZW1vcnkgb24gdGhlIG5leHQgY2FjaGUgbG9va3VwLCBzbyBkb24ndCAgICovCi0gIC8qICAgIHRyZWF0IHRoZW0gYXMgcGVyc2lzdGVudCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRlc2NyaXB0b3IncyBgYnVmZmVyJyBmaWVsZCBpcyBzZXQgdG9+MCB0byBpbmRpY2F0ZSBhIG1pc3NpbmcgICovCi0gIC8qICAgIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBfbm90XyBOVUxMLCBpdCByZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIG5vZGUgY29udGFpbmluZyB0aGUgYml0bWFwLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuICAqLwotICAvKiAgICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgaW1hZ2UpIHdpbGwgYWx3YXlzIGJlICAgKi8KLSAgLyogICAga2VwdCBpbiB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvIGByZWxlYXNlJyBpdC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIE5VTEwsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucyAgKi8KLSAgLyogICAgdGhhdCB0aGUgYml0bWFwIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCAgICAgICovCi0gIC8qICAgIGNhbGwgdG8gb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0ICAqLwotICAvKiAgICBpcyBwZXJzaXN0ZW50ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlciggRlRDX1NCaXRDYWNoZSAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NCaXQgICAgICAqc2JpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgKmFub2RlICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVENBQ0hFX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2ZmZHJ2LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2ZmZHJ2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3N2I2ZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGNmZmRydi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2ZmZHJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBDRkYgZHJpdmVyIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVENGRkRSVl9IXwotI2RlZmluZSBGVENGRkRSVl9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgY2ZmX2RyaXZlcgotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgVGhlIENGRiBkcml2ZXIKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIENvbnRyb2xsaW5nIHRoZSBDRkYgZHJpdmVyIG1vZHVsZS4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFdoaWxlIEZyZWVUeXBlJ3MgQ0ZGIGRyaXZlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5IGl0c2VsZiwKLSAgICogICBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0IGFuZAotICAgKiAgIEBGVF9Qcm9wZXJ0eV9HZXQuICBUaGUgbGlzdCBiZWxvdyBnaXZlcyB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXMKLSAgICogICB0b2dldGhlciB3aXRoIHRoZSBuZWNlc3NhcnkgbWFjcm9zIGFuZCBzdHJ1Y3R1cmVzLgotICAgKgotICAgKiAgIFRoZSBDRkYgZHJpdmVyJ3MgbW9kdWxlIG5hbWUgaXMgYGNmZicuCi0gICAqCi0gICAqICAgKkhpbnRpbmcqICphbmQqICphbnRpYWxpYXNpbmcqICpwcmluY2lwbGVzKiAqb2YqICp0aGUqICpuZXcqICplbmdpbmUqCi0gICAqCi0gICAqICAgVGhlIHJhc3Rlcml6ZXIgaXMgcG9zaXRpb25pbmcgaG9yaXpvbnRhbCBmZWF0dXJlcyAoZS5nLiwgYXNjZW5kZXIKLSAgICogICBoZWlnaHQgJiB4LWhlaWdodCwgb3IgY3Jvc3NiYXJzKSBvbiB0aGUgcGl4ZWwgZ3JpZCBhbmQgbWluaW1pemluZyB0aGUKLSAgICogICBhbW91bnQgb2YgYW50aWFsaWFzaW5nIGFwcGxpZWQgdG8gdGhlbSwgd2hpbGUgcGxhY2luZyB2ZXJ0aWNhbAotICAgKiAgIGZlYXR1cmVzICh2ZXJ0aWNhbCBzdGVtcykgb24gdGhlIHBpeGVsIGdyaWQgd2l0aG91dCBoaW50aW5nLCB0aHVzCi0gICAqICAgcmVwcmVzZW50aW5nIHRoZSBzdGVtIHBvc2l0aW9uIGFuZCB3ZWlnaHQgYWNjdXJhdGVseS4gIFNvbWV0aW1lcyB0aGUKLSAgICogICB2ZXJ0aWNhbCBzdGVtcyBtYXkgYmUgb25seSBwYXJ0aWFsbHkgYmxhY2suICBJbiB0aGlzIGNvbnRleHQsCi0gICAqICAgYGFudGlhbGlhc2luZycgbWVhbnMgdGhhdCBzdGVtcyBhcmUgbm90IHBvc2l0aW9uZWQgZXhhY3RseSBvbiBwaXhlbAotICAgKiAgIGJvcmRlcnMsIGNhdXNpbmcgYSBmdXp6eSBhcHBlYXJhbmNlLgotICAgKgotICAgKiAgIFRoZXJlIGFyZSB0d28gcHJpbmNpcGxlcyBiZWhpbmQgdGhpcyBhcHByb2FjaC4KLSAgICoKLSAgICogICAxKSBObyBoaW50aW5nIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbjogVW5saWtlIGBzdXBlcmhpbnRlZCcKLSAgICogICBUcnVlVHlwZSwgd2hpY2ggY2hhbmdlcyBnbHlwaCB3aWR0aHMgdG8gYWNjb21tb2RhdGUgcmVndWxhcgotICAgKiAgIGludGVyLWdseXBoIHNwYWNpbmcsIEFkb2JlJ3MgYXBwcm9hY2ggaXMgYGZhaXRoZnVsIHRvIHRoZSBkZXNpZ24nIGluCi0gICAqICAgcmVwcmVzZW50aW5nIGJvdGggdGhlIGdseXBoIHdpZHRoIGFuZCB0aGUgaW50ZXItZ2x5cGggc3BhY2luZwotICAgKiAgIGRlc2lnbmVkIGZvciB0aGUgZm9udC4gIFRoaXMgbWFrZXMgdGhlIHNjcmVlbiBkaXNwbGF5IGFzIGNsb3NlIGFzIGl0Ci0gICAqICAgY2FuIGJlIHRvIHRoZSByZXN1bHQgb25lIHdvdWxkIGdldCB3aXRoIGluZmluaXRlIHJlc29sdXRpb24sIHdoaWxlCi0gICAqICAgcHJlc2VydmluZyB3aGF0IGlzIGNvbnNpZGVyZWQgdGhlIGtleSBjaGFyYWN0ZXJpc3RpY3Mgb2YgZWFjaCBnbHlwaC4KLSAgICogICBOb3RlIHRoYXQgdGhlIGRpc3RhbmNlcyBiZXR3ZWVuIHVuaGludGVkIGFuZCBncmlkLWZpdHRlZCBwb3NpdGlvbnMgYXQKLSAgICogICBzbWFsbCBzaXplcyBhcmUgY29tcGFyYWJsZSB0byBrZXJuaW5nIHZhbHVlcyBhbmQgdGh1cyB3b3VsZCBiZQotICAgKiAgIG5vdGljZWFibGUgKGFuZCBkaXN0cmFjdGluZykgd2hpbGUgcmVhZGluZyBpZiBoaW50aW5nIHdlcmUgYXBwbGllZC4KLSAgICoKLSAgICogICBPbmUgb2YgdGhlIHJlYXNvbnMgdG8gbm90IGhpbnQgaG9yaXpvbnRhbGx5IGlzIGFudGlhbGlhc2luZyBmb3IgTENECi0gICAqICAgc2NyZWVuczogVGhlIHBpeGVsIGdlb21ldHJ5IG9mIG1vZGVybiBkaXNwbGF5cyBzdXBwbGllcyB0aHJlZQotICAgKiAgIHZlcnRpY2FsIHN1Yi1waXhlbHMgYXMgdGhlIGV5ZSBtb3ZlcyBob3Jpem9udGFsbHkgYWNyb3NzIGVhY2ggdmlzaWJsZQotICAgKiAgIHBpeGVsLiAgT24gZGV2aWNlcyB3aGVyZSB3ZSBjYW4gYmUgY2VydGFpbiB0aGlzIGNoYXJhY3RlcmlzdGljIGlzCi0gICAqICAgcHJlc2VudCBhIHJhc3Rlcml6ZXIgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzdWItcGl4ZWxzIHRvIGFkZAotICAgKiAgIGluY3JlbWVudHMgb2Ygd2VpZ2h0LiAgSW4gV2VzdGVybiB3cml0aW5nIHN5c3RlbXMgdGhpcyB0dXJucyBvdXQgdG8KLSAgICogICBiZSB0aGUgbW9yZSBjcml0aWNhbCBkaXJlY3Rpb24gYW55d2F5OyB0aGUgd2VpZ2h0cyBhbmQgc3BhY2luZyBvZgotICAgKiAgIHZlcnRpY2FsIHN0ZW1zIChzZWUgYWJvdmUpIGFyZSBjZW50cmFsIHRvIEFybWVuaWFuLCBDeXJpbGxpYywgR3JlZWssCi0gICAqICAgYW5kIExhdGluIHR5cGUgZGVzaWducy4gIEV2ZW4gd2hlbiB0aGUgcmFzdGVyaXplciB1c2VzIGdyZXlzY2FsZQotICAgKiAgIGFudGlhbGlhc2luZyBpbnN0ZWFkIG9mIGNvbG9yIChhIG5lY2Vzc2FyeSBjb21wcm9taXNlIHdoZW4gb25lCi0gICAqICAgZG9lc24ndCBrbm93IHRoZSBzY3JlZW4gY2hhcmFjdGVyaXN0aWNzKSwgdGhlIHVuaGludGVkIHZlcnRpY2FsCi0gICAqICAgZmVhdHVyZXMgcHJlc2VydmUgdGhlIGRlc2lnbidzIHdlaWdodCBhbmQgc3BhY2luZyBtdWNoIGJldHRlciB0aGFuCi0gICAqICAgYWxpYXNlZCB0eXBlIHdvdWxkLgotICAgKgotICAgKiAgIDIpIEFsaWdubWVudCBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uOiBXZWlnaHRzIGFuZCBzcGFjaW5nIGFsb25nIHRoZQotICAgKiAgIHl+YXhpcyBhcmUgbGVzcyBjcml0aWNhbDsgd2hhdCBpcyBtdWNoIG1vcmUgaW1wb3J0YW50IGlzIHRoZSB2aXN1YWwKLSAgICogICBhbGlnbm1lbnQgb2YgcmVsYXRlZCBmZWF0dXJlcyAobGlrZSBjYXAtaGVpZ2h0IGFuZCB4LWhlaWdodCkuICBUaGUKLSAgICogICBzZW5zZSBvZiBhbGlnbm1lbnQgZm9yIHRoZXNlIGlzIGVuaGFuY2VkIGJ5IHRoZSBzaGFycG5lc3Mgb2YgZ3JpZC1maXQKLSAgICogICBlZGdlcywgd2hpbGUgdGhlIGNydWRlciB2ZXJ0aWNhbCByZXNvbHV0aW9uIChmdWxsIHBpeGVscyBpbnN0ZWFkIG9mCi0gICAqICAgMS8zIHBpeGVscykgaXMgbGVzcyBvZiBhIHByb2JsZW0uCi0gICAqCi0gICAqICAgT24gdGhlIHRlY2huaWNhbCBzaWRlLCBob3Jpem9udGFsIGFsaWdubWVudCB6b25lcyBmb3IgYXNjZW5kZXIsCi0gICAqICAgeC1oZWlnaHQsIGFuZCBvdGhlciBpbXBvcnRhbnQgaGVpZ2h0IHZhbHVlcyAodHJhZGl0aW9uYWxseSBjYWxsZWQKLSAgICogICBgYmx1ZSB6b25lcycpIGFzIGRlZmluZWQgaW4gdGhlIGZvbnQgYXJlIHBvc2l0aW9uZWQgaW5kZXBlbmRlbnRseSwKLSAgICogICBlYWNoIGJlaW5nIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgcGl4ZWwgZWRnZSwgdGFraW5nIGNhcmUgb2YKLSAgICogICBvdmVyc2hvb3Qgc3VwcHJlc3Npb24gYXQgc21hbGwgc2l6ZXMsIHN0ZW0gZGFya2VuaW5nLCBhbmQgc2NhbGluZy4KLSAgICoKLSAgICogICBIc3RlbXMgKHRoaXMgaXMsIGhpbnQgdmFsdWVzIGRlZmluZWQgaW4gdGhlIGZvbnQgdG8gaGVscCBhbGlnbgotICAgKiAgIGhvcml6b250YWwgZmVhdHVyZXMpIHRoYXQgZmFsbCB3aXRoaW4gYSBibHVlIHpvbmUgYXJlIHNhaWQgdG8gYmUKLSAgICogICBgY2FwdHVyZWQnIGFuZCBhcmUgYWxpZ25lZCB0byB0aGF0IHpvbmUuICBVbmNhcHR1cmVkIHN0ZW1zIGFyZSBtb3ZlZAotICAgKiAgIGluIG9uZSBvZiBmb3VyIHdheXMsIHRvcCBlZGdlIHVwIG9yIGRvd24sIGJvdHRvbSBlZGdlIHVwIG9yIGRvd24uCi0gICAqICAgVW5sZXNzIHRoZXJlIGFyZSBjb25mbGljdGluZyBoc3RlbXMsIHRoZSBzbWFsbGVzdCBtb3ZlbWVudCBpcyB0YWtlbgotICAgKiAgIHRvIG1pbmltaXplIGRpc3RvcnRpb24uCi0gICAqCi0gICAqIEBvcmRlcjoKLSAgICogICBoaW50aW5nLWVuZ2luZVtjZmZdCi0gICAqICAgbm8tc3RlbS1kYXJrZW5pbmdbY2ZmXQotICAgKiAgIGRhcmtlbmluZy1wYXJhbWV0ZXJzW2NmZl0KLSAgICogICByYW5kb20tc2VlZAotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgaGludGluZy1lbmdpbmVbY2ZmXQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhhbmtzIHRvIEFkb2JlLCB3aGljaCBjb250cmlidXRlZCBhIG5ldyBoaW50aW5nIChhbmQgcGFyc2luZykKLSAgICogICBlbmdpbmUsIGFuIGFwcGxpY2F0aW9uIGNhbiBzZWxlY3QgYmV0d2VlbiBgZnJlZXR5cGUnIGFuZCBgYWRvYmUnIGlmCi0gICAqICAgY29tcGlsZWQgd2l0aCBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FLiAgSWYgdGhpcyBjb25maWd1cmF0aW9uCi0gICAqICAgbWFjcm8gaXNuJ3QgZGVmaW5lZCwgYGhpbnRpbmctZW5naW5lJyBkb2VzIG5vdGhpbmcuCi0gICAqCi0gICAqICAgVGhlIGRlZmF1bHQgZW5naW5lIGlzIGBmcmVldHlwZScgaWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSBpcwotICAgKiAgIGRlZmluZWQsIGFuZCBgYWRvYmUnIG90aGVyd2lzZS4KLSAgICoKLSAgICogICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHNlbGVjdCBBZG9iZSdzIGhpbnRpbmcKLSAgICogICBlbmdpbmUgKG9taXR0aW5nIHRoZSBlcnJvciBoYW5kbGluZykuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX1VJbnQgICAgIGhpbnRpbmdfZW5naW5lID0gRlRfQ0ZGX0hJTlRJTkdfQURPQkU7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiY2ZmIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpbnRpbmctZW5naW5lIiwgJmhpbnRpbmdfZW5naW5lICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudAotICAgKiAgIHZhcmlhYmxlICh1c2luZyB2YWx1ZXMgYGFkb2JlJyBvciBgZnJlZXR5cGUnKS4KLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfQ0ZGX0hJTlRJTkdfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgZm9yIHRoZSBAaGludGluZy1lbmdpbmVbY2ZmXSBwcm9wZXJ0eSB0bwotICAgKiAgIHNlbGVjdCB0aGUgaGludGluZyBlbmdpbmUgZm9yIENGRiBmb250cy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9DRkZfSElOVElOR19GUkVFVFlQRSA6OgotICAgKiAgICAgVXNlIHRoZSBvbGQgRnJlZVR5cGUgaGludGluZyBlbmdpbmUuCi0gICAqCi0gICAqICAgRlRfQ0ZGX0hJTlRJTkdfQURPQkUgOjoKLSAgICogICAgIFVzZSB0aGUgaGludGluZyBlbmdpbmUgY29udHJpYnV0ZWQgYnkgQWRvYmUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DRkZfSElOVElOR19GUkVFVFlQRSAgMAotI2RlZmluZSBGVF9DRkZfSElOVElOR19BRE9CRSAgICAgMQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICBuby1zdGVtLWRhcmtlbmluZ1tjZmZdCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBCeSBkZWZhdWx0LCB0aGUgQWRvYmUgQ0ZGIGVuZ2luZSBkYXJrZW5zIHN0ZW1zIGF0IHNtYWxsZXIgc2l6ZXMsCi0gICAqICAgcmVnYXJkbGVzcyBvZiBoaW50aW5nLCB0byBlbmhhbmNlIGNvbnRyYXN0LiAgVGhpcyBmZWF0dXJlIHJlcXVpcmVzCi0gICAqICAgYSByZW5kZXJpbmcgc3lzdGVtIHdpdGggcHJvcGVyIGdhbW1hIGNvcnJlY3Rpb24uICBTZXR0aW5nIHRoaXMKLSAgICogICBwcm9wZXJ0eSwgc3RlbSBkYXJrZW5pbmcgZ2V0cyBzd2l0Y2hlZCBvZmYuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IHN0ZW0gZGFya2VuaW5nIGlzIG5ldmVyIGFwcGxpZWQgaWYgQEZUX0xPQURfTk9fU0NBTEUgaXMgc2V0LgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9Cb29sICAgICBub19zdGVtX2RhcmtlbmluZyA9IFRSVUU7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiY2ZmIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vLXN0ZW0tZGFya2VuaW5nIiwgJm5vX3N0ZW1fZGFya2VuaW5nICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudAotICAgKiAgIHZhcmlhYmxlICh1c2luZyB2YWx1ZXMgMSBhbmQgMCBmb3IgYG9uJyBhbmQgYG9mZicsIHJlc3BlY3RpdmVseSkuCi0gICAqICAgSXQgY2FuIGFsc28gYmUgc2V0IHBlciBmYWNlIHVzaW5nIEBGVF9GYWNlX1Byb3BlcnRpZXMgd2l0aAotICAgKiAgIEBGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkcuCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICBkYXJrZW5pbmctcGFyYW1ldGVyc1tjZmZdCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBCeSBkZWZhdWx0LCB0aGUgQWRvYmUgQ0ZGIGVuZ2luZSBkYXJrZW5zIHN0ZW1zIGFzIGZvbGxvd3MgKGlmIHRoZQotICAgKiAgIGBuby1zdGVtLWRhcmtlbmluZycgcHJvcGVydHkgaXNuJ3Qgc2V0KToKLSAgICoKLSAgICogICB7Ci0gICAqICAgICBzdGVtIHdpZHRoIDw9IDAuNXB4OiAgIGRhcmtlbmluZyBhbW91bnQgPSAwLjRweAotICAgKiAgICAgc3RlbSB3aWR0aCAgPSAxcHg6ICAgICBkYXJrZW5pbmcgYW1vdW50ID0gMC4yNzVweAotICAgKiAgICAgc3RlbSB3aWR0aCAgPSAxLjY2N3B4OiBkYXJrZW5pbmcgYW1vdW50ID0gMC4yNzVweAotICAgKiAgICAgc3RlbSB3aWR0aCA+PSAyLjMzM3B4OiBkYXJrZW5pbmcgYW1vdW50ID0gMHB4Ci0gICAqICAgfQotICAgKgotICAgKiAgIGFuZCBwaWVjZXdpc2UgbGluZWFyIGluLWJldHdlZW4uICBBdCBjb25maWd1cmF0aW9uIHRpbWUsIHRoZXNlIGZvdXIKLSAgICogICBjb250cm9sIHBvaW50cyBjYW4gYmUgc2V0IHdpdGggdGhlIG1hY3JvCi0gICAqICAgYENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJTJy4gIEF0IHJ1bnRpbWUsIHRoZSBjb250cm9sCi0gICAqICAgcG9pbnRzIGNhbiBiZSBjaGFuZ2VkIHVzaW5nIHRoZSBgZGFya2VuaW5nLXBhcmFtZXRlcnMnIHByb3BlcnR5LCBhcwotICAgKiAgIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX0ludCAgICAgIGRhcmtlbl9wYXJhbXNbOF0gPSB7ICA1MDAsIDMwMCwgICAvLyB4MSwgeTEKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAsIDIwMCwgICAvLyB4MiwgeTIKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAsIDEwMCwgICAvLyB4MywgeTMKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAsICAgMCB9OyAvLyB4NCwgeTQKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJjZmYiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFya2VuaW5nLXBhcmFtZXRlcnMiLCBkYXJrZW5fcGFyYW1zICk7Ci0gICAqICAgfQotICAgKgotICAgKiAgIFRoZSB4fnZhbHVlcyBnaXZlIHRoZSBzdGVtIHdpZHRoLCBhbmQgdGhlIHl+dmFsdWVzIHRoZSBkYXJrZW5pbmcKLSAgICogICBhbW91bnQuICBUaGUgdW5pdCBpcyAxMDAwdGggb2YgcGl4ZWxzLiAgQWxsIGNvb3JkaW5hdGUgdmFsdWVzIG11c3QgYmUKLSAgICogICBwb3NpdGl2ZTsgdGhlIHh+dmFsdWVzIG11c3QgYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nOyB0aGUKLSAgICogICB5fnZhbHVlcyBtdXN0IGJlIG1vbm90b25pY2FsbHkgZGVjcmVhc2luZyBhbmQgc21hbGxlciB0aGFuIG9yCi0gICAqICAgZXF1YWwgdG8gNTAwIChjb3JyZXNwb25kaW5nIHRvIGhhbGYgYSBwaXhlbCk7IHRoZSBzbG9wZSBvZiBlYWNoCi0gICAqICAgbGluZWFyIHBpZWNlIG11c3QgYmUgc2hhbGxvd2VyIHRoYW4gLTEgKGUuZy4sIC0uNCkuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgc2V0IHZpYSB0aGUgYEZSRUVUWVBFX1BST1BFUlRJRVMnIGVudmlyb25tZW50Ci0gICAqICAgdmFyaWFibGUsIHVzaW5nIGVpZ2h0IGNvbW1hLXNlcGFyYXRlZCBpbnRlZ2VycyB3aXRob3V0IHNwYWNlcy4gIEhlcmUKLSAgICogICB0aGUgYWJvdmUgZXhhbXBsZSwgdXNpbmcgYFwnIHRvIGJyZWFrIHRoZSBsaW5lIGZvciByZWFkYWJpbGl0eS4KLSAgICoKLSAgICogICB7Ci0gICAqICAgICBGUkVFVFlQRV9QUk9QRVJUSUVTPVwKLSAgICogICAgIGNmZjpkYXJrZW5pbmctcGFyYW1ldGVycz01MDAsMzAwLDEwMDAsMjAwLDE1MDAsMTAwLDIwMDAsMAotICAgKiAgIH0KLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIHJhbmRvbS1zZWVkCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBCeSBkZWZhdWx0LCB0aGUgc2VlZCB2YWx1ZSBmb3IgdGhlIENGRiBgcmFuZG9tJyBvcGVyYXRvciBpcyBzZXQgdG8gYQotICAgKiAgIHJhbmRvbSB2YWx1ZS4gIEhvd2V2ZXIsIG1haW5seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpdCBpcyBvZnRlbgotICAgKiAgIG5lY2Vzc2FyeSB0byB1c2UgYSBrbm93biB2YWx1ZSBhcyBhIHNlZWQgc28gdGhhdCB0aGUgcHNldWRvLXJhbmRvbQotICAgKiAgIG51bWJlciBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5IGByYW5kb20nIGFyZSByZXBlYXRhYmxlLgotICAgKgotICAgKiAgIFRoZSBgcmFuZG9tLXNlZWQnIHByb3BlcnR5IGRvZXMgdGhhdC4gIEl0cyBhcmd1bWVudCBpcyBhIHNpZ25lZCAzMmJpdAotICAgKiAgIGludGVnZXI7IGlmIHRoZSB2YWx1ZSBpcyB6ZXJvIG9yIG5lZ2F0aXZlLCB0aGUgc2VlZCBnaXZlbiBieSB0aGUKLSAgICogICBgaW50aXRpYWxSYW5kb21TZWVkJyBwcml2YXRlIERJQ1Qgb3BlcmF0b3IgaW4gYSBDRkYgZmlsZSBnZXRzIHVzZWQKLSAgICogICAob3IgYSBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIG5vIHN1Y2ggb3BlcmF0b3IpLiAgSWYgdGhlIHZhbHVlIGlzCi0gICAqICAgcG9zaXRpdmUsIHVzZSBpdCBpbnN0ZWFkIG9mIGBpbml0aWFsUmFuZG9tU2VlZCcsIHdoaWNoIGlzCi0gICAqICAgY29uc2VxdWVudGx5IGlnbm9yZWQuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudAotICAgKiAgIHZhcmlhYmxlLiAgSXQgY2FuIGFsc28gYmUgc2V0IHBlciBmYWNlIHVzaW5nIEBGVF9GYWNlX1Byb3BlcnRpZXMgd2l0aAotICAgKiAgIEBGVF9QQVJBTV9UQUdfUkFORE9NX1NFRUQuCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBjb25zdGFudDoKLSAgICogICBGVF9QQVJBTV9UQUdfUkFORE9NX1NFRUQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFuIEBGVF9QYXJhbWV0ZXIgdGFnIHRvIGJlIHVzZWQgd2l0aCBARlRfRmFjZV9Qcm9wZXJ0aWVzLiAgVGhlCi0gICAqICAgY29ycmVzcG9uZGluZyAzMmJpdCBzaWduZWQgaW50ZWdlciBhcmd1bWVudCBvdmVycmlkZXMgdGhlIENGRgotICAgKiAgIG1vZHVsZSdzIHJhbmRvbSBzZWVkIHZhbHVlIHdpdGggYSBmYWNlLXNwZWNpZmljIG9uZTsgc2VlCi0gICAqICAgQHJhbmRvbS1zZWVkLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfUEFSQU1fVEFHX1JBTkRPTV9TRUVEIFwKLSAgICAgICAgICBGVF9NQUtFX1RBRyggJ3MnLCAnZScsICdlJywgJ2QnICkKLQotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBGVENGRkRSVl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGNoYXB0ZXJzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhMTIxYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEZyZWVUeXBlIHJlZmVyZW5jZS4gICAgICAgICAgICAgICovCi0vKiBJdCBpcyB1c2VkIGJ5IHRoZSBweXRob24gc2NyaXB0IHRoYXQgZ2VuZXJhdGVzIHRoZSBIVE1MIGZpbGVzLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZ2VuZXJhbF9yZW1hcmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgR2VuZXJhbCBSZW1hcmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgaGVhZGVyX2luY2x1c2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHVzZXJfYWxsb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxDaGFwdGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBjb3JlX2FwaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDb3JlIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxTZWN0aW9ucz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJhc2VfaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBnbHlwaF92YXJpYW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZ2x5cGhfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIG1hY19zcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBzaXplc19tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgaGVhZGVyX2ZpbGVfbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPENoYXB0ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGZvcm1hdF9zcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZvcm1hdC1TcGVjaWZpYyBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPFNlY3Rpb25zPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIG11bHRpcGxlX21hc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICB0cnVldHlwZV90YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgdHlwZTFfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHNmbnRfbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBiZGZfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgY2lkX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBmcl9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICB3aW5mbnRfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZm9udF9mb3JtYXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGdhc3BfdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxDaGFwdGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBtb2R1bGVfc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDb250cm9sbGluZyBGcmVlVHlwZSBNb2R1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxTZWN0aW9ucz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBhdXRvX2hpbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgY2ZmX2RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHR0X2RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBwY2ZfZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgY2FjaGVfc3Vic3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ2FjaGUgU3ViLVN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgY2FjaGVfc3Vic3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPENoYXB0ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHN1cHBvcnRfYXBpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFN1cHBvcnQgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPFNlY3Rpb25zPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGNvbXB1dGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBsaXN0X3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgb3V0bGluZV9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHF1aWNrX2FkdmFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBiaXRtYXBfaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgcmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGdseXBoX3N0cm9rZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBzeXN0ZW1faW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbW9kdWxlX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBsencgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYnppcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGxjZF9maWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZXJyb3JfY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRXJyb3IgQ29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZXJyb3JfZW51bWVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGVycm9yX2NvZGVfdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkY2JlZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjaWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIENJRCBmb250IGluZm9ybWF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEZXJlZyBDbGVnZyBhbmQgTWljaGFlbCBUb2Z0ZGFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUQ0lEX0hfCi0jZGVmaW5lIEZUQ0lEX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRCBGb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRC1rZXllZCBmb250IHNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgQ0lELWtleWVkIGZvbnQgc3BlY2lmaWMgICAqLwotICAvKiAgICBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9HZXRfQ0lEX1JlZ2lzdHJ5X09yZGVyaW5nX1N1cHBsZW1lbnQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgUmVnaXN0cnkvT3JkZXJpbmcvU3VwcGxlbWVudCB0cmlwbGUgKGFsc28ga25vd24gYXMgdGhlCi0gICAqICAgICJSL08vUyIpIGZyb20gYSBDSUQta2V5ZWQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgICByZWdpc3RyeSA6OgotICAgKiAgICAgICBUaGUgcmVnaXN0cnksIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAgKgotICAgKiAgICBvcmRlcmluZyA6OgotICAgKiAgICAgICBUaGUgb3JkZXJpbmcsIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAgKgotICAgKiAgICBzdXBwbGVtZW50IDo6Ci0gICAqICAgICAgIFRoZSBzdXBwbGVtZW50LgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgICogICAgb3RoZXJ3aXNlLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgIDIuMy42Ci0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0NJRF9SZWdpc3RyeV9PcmRlcmluZ19TdXBwbGVtZW50KCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKm9yZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqc3VwcGxlbWVudCk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9DSURfSXNfSW50ZXJuYWxseV9DSURfS2V5ZWQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGUgaW5wdXQgZmFjZSwgQ0lEIGtleWVkIG9yIG5vdC4gIEluCi0gICAqICAgIGNvbnRyYXN0IHRvIHRoZSBARlRfSVNfQ0lEX0tFWUVEIG1hY3JvIHRoaXMgZnVuY3Rpb24gcmV0dXJucwotICAgKiAgICBzdWNjZXNzZnVsbHkgYWxzbyBmb3IgQ0lELWtleWVkIGZvbnRzIGluIGFuIFNGTlQgd3JhcHBlci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgICBpc19jaWQgOjoKLSAgICogICAgICAgVGhlIHR5cGUgb2YgdGhlIGZhY2UgYXMgYW4gQEZUX0Jvb2wuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBDSUQgZmFjZXMgYW5kIE9wZW5UeXBlIGZvbnRzLAotICAgKiAgICByZXR1cm5pbmcgYW4gZXJyb3Igb3RoZXJ3aXNlLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgIDIuMy45Ci0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0NJRF9Jc19JbnRlcm5hbGx5X0NJRF9LZXllZCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICppc19jaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X0NJRF9Gcm9tX0dseXBoX0luZGV4Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgUmV0cmlldmUgdGhlIENJRCBvZiB0aGUgaW5wdXQgZ2x5cGggaW5kZXguCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgICoKLSAgICogICAgZ2x5cGhfaW5kZXggOjoKLSAgICogICAgICAgVGhlIGlucHV0IGdseXBoIGluZGV4LgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgICBjaWQgOjoKLSAgICogICAgICAgVGhlIENJRCBhcyBhbiBARlRfVUludC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIENJRCBmYWNlcyBhbmQgT3BlblR5cGUgZm9udHMsCi0gICAqICAgIHJldHVybmluZyBhbiBlcnJvciBvdGhlcndpc2UuCi0gICAqCi0gICAqIEBzaW5jZToKLSAgICogICAgMi4zLjkKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfQ0lEX0Zyb21fR2x5cGhfSW5kZXgoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqY2lkICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVENJRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJiYWM4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGVycmRlZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBlcnJvcl9jb2RlX3ZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFcnJvciBDb2RlIFZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBbGwgcG9zc2libGUgZXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgRnJlZVR5cGUgZnVuY3Rpb25zLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgbGlzdCBiZWxvdyBpcyB0YWtlbiB2ZXJiYXRpbSBmcm9tIHRoZSBmaWxlIGBmdGVycmRlZi5oJyAgICAgICAgICovCi0gIC8qICAgKGxvYWRlZCBhdXRvbWF0aWNhbGx5IGJ5IGluY2x1ZGluZyBgRlRfRlJFRVRZUEVfSCcpLiAgVGhlIGZpcnN0ICAgICAqLwotICAvKiAgIGFyZ3VtZW50IG9mIHRoZSBgRlRfRVJST1JfREVGXycgbWFjcm8gaXMgdGhlIGVycm9yIGxhYmVsOyBieSAgICAgICAgKi8KLSAgLyogICBkZWZhdWx0LCB0aGUgcHJlZml4IGBGVF9FcnJfJyBnZXRzIGFkZGVkIHNvIHRoYXQgeW91IGdldCBlcnJvciAgICAgICovCi0gIC8qICAgbmFtZXMgbGlrZSBgRlRfRXJyX0Nhbm5vdF9PcGVuX1Jlc291cmNlJy4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgICAqLwotICAvKiAgIHRoZSBlcnJvciBjb2RlLCBhbmQgdGhlIGxhc3QgYXJndW1lbnQgYW4gZXJyb3Igc3RyaW5nLCB3aGljaCBpcyBub3QgKi8KLSAgLyogICB1c2VkIGJ5IEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIHlvdSBzaG91bGQgKm9ubHkqIHVzZSBlcnJvciBuYW1lcyBhbmQgICAgICAgKi8KLSAgLyogICAqbmV2ZXIqIGl0cyBudW1lcmljIHZhbHVlcyEgIFRoZSBsYXR0ZXIgbWlnaHQgKGFuZCBhY3R1YWxseSBkbykgICAgICovCi0gIC8qICAgY2hhbmdlIGluIGZvcnRoY29taW5nIEZyZWVUeXBlIHZlcnNpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBNYWNybyBgRlRfTk9FUlJPUkRFRl8nIGRlZmluZXMgYEZUX0Vycl9PaycsIHdoaWNoIGlzIGFsd2F5cyB6ZXJvLiAgICovCi0gIC8qICAgU2VlIHRoZSBgRXJyb3IgRW51bWVyYXRpb25zJyBzdWJzZWN0aW9uIGhvdyB0byBhdXRvbWF0aWNhbGx5ICAgICAgICAqLwotICAvKiAgIGdlbmVyYXRlIGEgbGlzdCBvZiBlcnJvciBzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRXJyX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBnZW5lcmljIGVycm9ycyAqLwotCi0gIEZUX05PRVJST1JERUZfKCBPaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICJubyBlcnJvciIgKQotCi0gIEZUX0VSUk9SREVGXyggQ2Fubm90X09wZW5fUmVzb3VyY2UsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwKLSAgICAgICAgICAgICAgICAiY2Fubm90IG9wZW4gcmVzb3VyY2UiICkKLSAgRlRfRVJST1JERUZfKCBVbmtub3duX0ZpbGVfRm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICJ1bmtub3duIGZpbGUgZm9ybWF0IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9GaWxlX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMywKLSAgICAgICAgICAgICAgICAiYnJva2VuIGZpbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIEZyZWVUeXBlIHZlcnNpb24iICkKLSAgRlRfRVJST1JERUZfKCBMb3dlcl9Nb2R1bGVfVmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAweDA1LAotICAgICAgICAgICAgICAgICJtb2R1bGUgdmVyc2lvbiBpcyB0b28gbG93IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9Bcmd1bWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBhcmd1bWVudCIgKQotICBGVF9FUlJPUkRFRl8oIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDcsCi0gICAgICAgICAgICAgICAgInVuaW1wbGVtZW50ZWQgZmVhdHVyZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfVGFibGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgsCi0gICAgICAgICAgICAgICAgImJyb2tlbiB0YWJsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfT2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksCi0gICAgICAgICAgICAgICAgImJyb2tlbiBvZmZzZXQgd2l0aGluIHRhYmxlIiApCi0gIEZUX0VSUk9SREVGXyggQXJyYXlfVG9vX0xhcmdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwKLSAgICAgICAgICAgICAgICAiYXJyYXkgYWxsb2NhdGlvbiBzaXplIHRvbyBsYXJnZSIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfTW9kdWxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIsCi0gICAgICAgICAgICAgICAgIm1pc3NpbmcgbW9kdWxlIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19Qcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQywKLSAgICAgICAgICAgICAgICAibWlzc2luZyBwcm9wZXJ0eSIgKQotCi0gIC8qIGdseXBoL2NoYXJhY3RlciBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfR2x5cGhfSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsCi0gICAgICAgICAgICAgICAgImludmFsaWQgZ2x5cGggaW5kZXgiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0NoYXJhY3Rlcl9Db2RlLCAgICAgICAgICAgICAgICAgICAgICAweDExLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNoYXJhY3RlciBjb2RlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9HbHlwaF9Gb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwKLSAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZ2x5cGggaW1hZ2UgZm9ybWF0IiApCi0gIEZUX0VSUk9SREVGXyggQ2Fubm90X1JlbmRlcl9HbHlwaCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMywKLSAgICAgICAgICAgICAgICAiY2Fubm90IHJlbmRlciB0aGlzIGdseXBoIGZvcm1hdCIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfT3V0bGluZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsCi0gICAgICAgICAgICAgICAgImludmFsaWQgb3V0bGluZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ29tcG9zaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUsCi0gICAgICAgICAgICAgICAgImludmFsaWQgY29tcG9zaXRlIGdseXBoIiApCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfSGludHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNiwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgaGludHMiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1BpeGVsX1NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAweDE3LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHBpeGVsIHNpemUiICkKLQotICAvKiBoYW5kbGUgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIG9iamVjdCBoYW5kbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAweDIxLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpYnJhcnkgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9Ecml2ZXJfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgMHgyMiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBtb2R1bGUgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9GYWNlX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMywKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBmYWNlIGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU2l6ZV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjQsCi0gICAgICAgICAgICAgICAgImludmFsaWQgc2l6ZSBoYW5kbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1Nsb3RfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgICAweDI1LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGdseXBoIHNsb3QgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DaGFyTWFwX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgMHgyNiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBjaGFybWFwIGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ2FjaGVfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjcsCi0gICAgICAgICAgICAgICAgImludmFsaWQgY2FjaGUgbWFuYWdlciBoYW5kbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1N0cmVhbV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAweDI4LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBoYW5kbGUiICkKLQotICAvKiBkcml2ZXIgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9Ecml2ZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwLAotICAgICAgICAgICAgICAgICJ0b28gbWFueSBtb2R1bGVzIiApCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfRXh0ZW5zaW9ucywgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMSwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgZXh0ZW5zaW9ucyIgKQotCi0gIC8qIG1lbW9yeSBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIE91dF9PZl9NZW1vcnksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAsCi0gICAgICAgICAgICAgICAgIm91dCBvZiBtZW1vcnkiICkKLSAgRlRfRVJST1JERUZfKCBVbmxpc3RlZF9PYmplY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxLAotICAgICAgICAgICAgICAgICJ1bmxpc3RlZCBvYmplY3QiICkKLQotICAvKiBzdHJlYW0gZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBDYW5ub3RfT3Blbl9TdHJlYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAweDUxLAotICAgICAgICAgICAgICAgICJjYW5ub3Qgb3BlbiBzdHJlYW0iICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1N0cmVhbV9TZWVrLCAgICAgICAgICAgICAgICAgICAgICAgICAweDUyLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBzZWVrIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fU2tpcCwgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MywKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJlYW0gc2tpcCIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU3RyZWFtX1JlYWQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTQsCi0gICAgICAgICAgICAgICAgImludmFsaWQgc3RyZWFtIHJlYWQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24sICAgICAgICAgICAgICAgICAgICAweDU1LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBvcGVyYXRpb24iICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0ZyYW1lX09wZXJhdGlvbiwgICAgICAgICAgICAgICAgICAgICAweDU2LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGZyYW1lIG9wZXJhdGlvbiIgKQotICBGVF9FUlJPUkRFRl8oIE5lc3RlZF9GcmFtZV9BY2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTcsCi0gICAgICAgICAgICAgICAgIm5lc3RlZCBmcmFtZSBhY2Nlc3MiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0ZyYW1lX1JlYWQsICAgICAgICAgICAgICAgICAgICAgICAgICAweDU4LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGZyYW1lIHJlYWQiICkKLQotICAvKiByYXN0ZXIgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfVW5pbml0aWFsaXplZCwgICAgICAgICAgICAgICAgICAgICAgICAweDYwLAotICAgICAgICAgICAgICAgICJyYXN0ZXIgdW5pbml0aWFsaXplZCIgKQotICBGVF9FUlJPUkRFRl8oIFJhc3Rlcl9Db3JydXB0ZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjEsCi0gICAgICAgICAgICAgICAgInJhc3RlciBjb3JydXB0ZWQiICkKLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfT3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYyLAotICAgICAgICAgICAgICAgICJyYXN0ZXIgb3ZlcmZsb3ciICkKLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfTmVnYXRpdmVfSGVpZ2h0LCAgICAgICAgICAgICAgICAgICAgICAweDYzLAotICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBoZWlnaHQgd2hpbGUgcmFzdGVyaW5nIiApCi0KLSAgLyogY2FjaGUgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9DYWNoZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwLAotICAgICAgICAgICAgICAgICJ0b28gbWFueSByZWdpc3RlcmVkIGNhY2hlcyIgKQotCi0gIC8qIFRydWVUeXBlIGFuZCBTRk5UIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9PcGNvZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBvcGNvZGUiICkKLSAgRlRfRVJST1JERUZfKCBUb29fRmV3X0FyZ3VtZW50cywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxLAotICAgICAgICAgICAgICAgICJ0b28gZmV3IGFyZ3VtZW50cyIgKQotICBGVF9FUlJPUkRFRl8oIFN0YWNrX092ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIsCi0gICAgICAgICAgICAgICAgInN0YWNrIG92ZXJmbG93IiApCi0gIEZUX0VSUk9SREVGXyggQ29kZV9PdmVyZmxvdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MywKLSAgICAgICAgICAgICAgICAiY29kZSBvdmVyZmxvdyIgKQotICBGVF9FUlJPUkRFRl8oIEJhZF9Bcmd1bWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODQsCi0gICAgICAgICAgICAgICAgImJhZCBhcmd1bWVudCIgKQotICBGVF9FUlJPUkRFRl8oIERpdmlkZV9CeV9aZXJvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUsCi0gICAgICAgICAgICAgICAgImRpdmlzaW9uIGJ5IHplcm8iICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1JlZmVyZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlZmVyZW5jZSIgKQotICBGVF9FUlJPUkRFRl8oIERlYnVnX09wQ29kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODcsCi0gICAgICAgICAgICAgICAgImZvdW5kIGRlYnVnIG9wY29kZSIgKQotICBGVF9FUlJPUkRFRl8oIEVOREZfSW5fRXhlY19TdHJlYW0sICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgsCi0gICAgICAgICAgICAgICAgImZvdW5kIEVOREYgb3Bjb2RlIGluIGV4ZWN1dGlvbiBzdHJlYW0iICkKLSAgRlRfRVJST1JERUZfKCBOZXN0ZWRfREVGUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg5LAotICAgICAgICAgICAgICAgICJuZXN0ZWQgREVGUyIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ29kZVJhbmdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEEsCi0gICAgICAgICAgICAgICAgImludmFsaWQgY29kZSByYW5nZSIgKQotICBGVF9FUlJPUkRFRl8oIEV4ZWN1dGlvbl9Ub29fTG9uZywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEIsCi0gICAgICAgICAgICAgICAgImV4ZWN1dGlvbiBjb250ZXh0IHRvbyBsb25nIiApCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfRnVuY3Rpb25fRGVmcywgICAgICAgICAgICAgICAgICAgICAgMHg4QywKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMiICkKLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9JbnN0cnVjdGlvbl9EZWZzLCAgICAgICAgICAgICAgICAgICAweDhELAotICAgICAgICAgICAgICAgICJ0b28gbWFueSBpbnN0cnVjdGlvbiBkZWZpbml0aW9ucyIgKQotICBGVF9FUlJPUkRFRl8oIFRhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEUsCi0gICAgICAgICAgICAgICAgIlNGTlQgZm9udCB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggSG9yaXpfSGVhZGVyX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgMHg4RiwKLSAgICAgICAgICAgICAgICAiaG9yaXpvbnRhbCBoZWFkZXIgKGhoZWEpIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBMb2NhdGlvbnNfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkwLAotICAgICAgICAgICAgICAgICJsb2NhdGlvbnMgKGxvY2EpIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBOYW1lX1RhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxLAotICAgICAgICAgICAgICAgICJuYW1lIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBDTWFwX1RhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDkyLAotICAgICAgICAgICAgICAgICJjaGFyYWN0ZXIgbWFwIChjbWFwKSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggSG10eF9UYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MywKLSAgICAgICAgICAgICAgICAiaG9yaXpvbnRhbCBtZXRyaWNzIChobXR4KSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggUG9zdF9UYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5NCwKLSAgICAgICAgICAgICAgICAiUG9zdFNjcmlwdCAocG9zdCkgdGFibGUgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfSG9yaXpfTWV0cmljcywgICAgICAgICAgICAgICAgICAgICAgIDB4OTUsCi0gICAgICAgICAgICAgICAgImludmFsaWQgaG9yaXpvbnRhbCBtZXRyaWNzIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DaGFyTWFwX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgMHg5NiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBjaGFyYWN0ZXIgbWFwIChjbWFwKSBmb3JtYXQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1BQZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk3LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHBwZW0gdmFsdWUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1ZlcnRfTWV0cmljcywgICAgICAgICAgICAgICAgICAgICAgICAweDk4LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHZlcnRpY2FsIG1ldHJpY3MiICkKLSAgRlRfRVJST1JERUZfKCBDb3VsZF9Ob3RfRmluZF9Db250ZXh0LCAgICAgICAgICAgICAgICAgICAgICAweDk5LAotICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZmluZCBjb250ZXh0IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9Qb3N0X1RhYmxlX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgMHg5QSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBQb3N0U2NyaXB0IChwb3N0KSB0YWJsZSBmb3JtYXQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1Bvc3RfVGFibGUsICAgICAgICAgICAgICAgICAgICAgICAgICAweDlCLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIFBvc3RTY3JpcHQgKHBvc3QpIHRhYmxlIiApCi0gIEZUX0VSUk9SREVGXyggREVGX0luX0dseWZfQnl0ZWNvZGUsICAgICAgICAgICAgICAgICAgICAgICAgMHg5QywKLSAgICAgICAgICAgICAgICAiZm91bmQgRkRFRiBvciBJREVGIG9wY29kZSBpbiBnbHlmIGJ5dGVjb2RlIiApCi0KLSAgLyogQ0ZGLCBDSUQsIGFuZCBUeXBlIDEgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBTeW50YXhfRXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEEwLAotICAgICAgICAgICAgICAgICJvcGNvZGUgc3ludGF4IGVycm9yIiApCi0gIEZUX0VSUk9SREVGXyggU3RhY2tfVW5kZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMSwKLSAgICAgICAgICAgICAgICAiYXJndW1lbnQgc3RhY2sgdW5kZXJmbG93IiApCi0gIEZUX0VSUk9SREVGXyggSWdub3JlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMiwKLSAgICAgICAgICAgICAgICAiaWdub3JlIiApCi0gIEZUX0VSUk9SREVGXyggTm9fVW5pY29kZV9HbHlwaF9OYW1lLCAgICAgICAgICAgICAgICAgICAgICAgMHhBMywKLSAgICAgICAgICAgICAgICAibm8gVW5pY29kZSBnbHlwaCBuYW1lIGZvdW5kIiApCi0gIEZUX0VSUk9SREVGXyggR2x5cGhfVG9vX0JpZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBNCwKLSAgICAgICAgICAgICAgICAiZ2x5cGggdG9vIGJpZyBmb3IgaGludGluZyIgKQotCi0gIC8qIEJERiBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfU3RhcnRmb250X0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgIDB4QjAsCi0gICAgICAgICAgICAgICAgImBTVEFSVEZPTlQnIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0ZvbnRfRmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAweEIxLAotICAgICAgICAgICAgICAgICJgRk9OVCcgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfU2l6ZV9GaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjIsCi0gICAgICAgICAgICAgICAgImBTSVpFJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19Gb250Ym91bmRpbmdib3hfRmllbGQsICAgICAgICAgICAgICAgMHhCMywKLSAgICAgICAgICAgICAgICAiYEZPTlRCT1VORElOR0JPWCcgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfQ2hhcnNfRmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjQsCi0gICAgICAgICAgICAgICAgImBDSEFSUycgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfU3RhcnRjaGFyX0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgIDB4QjUsCi0gICAgICAgICAgICAgICAgImBTVEFSVENIQVInIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0VuY29kaW5nX0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAweEI2LAotICAgICAgICAgICAgICAgICJgRU5DT0RJTkcnIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0JieF9GaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI3LAotICAgICAgICAgICAgICAgICJgQkJYJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggQmJ4X1Rvb19CaWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOCwKLSAgICAgICAgICAgICAgICAiYEJCWCcgdG9vIGJpZyIgKQotICBGVF9FUlJPUkRFRl8oIENvcnJ1cHRlZF9Gb250X0hlYWRlciwgICAgICAgICAgICAgICAgICAgICAgIDB4QjksCi0gICAgICAgICAgICAgICAgIkZvbnQgaGVhZGVyIGNvcnJ1cHRlZCBvciBtaXNzaW5nIGZpZWxkcyIgKQotICBGVF9FUlJPUkRFRl8oIENvcnJ1cHRlZF9Gb250X0dseXBocywgICAgICAgICAgICAgICAgICAgICAgIDB4QkEsCi0gICAgICAgICAgICAgICAgIkZvbnQgZ2x5cGhzIGNvcnJ1cHRlZCBvciBtaXNzaW5nIGZpZWxkcyIgKQotCi0gIC8qICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzY5ZmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGVycm9yX2VudW1lcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIEVudW1lcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEhvdyB0byBoYW5kbGUgZXJyb3JzIGFuZCBlcnJvciBzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBoZWFkZXIgZmlsZSBgZnRlcnJvcnMuaCcgKHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgICAgKi8KLSAgLyogICBgZnJlZXR5cGUuaCcgZGVmaW5lcyB0aGUgaGFuZGxpbmcgb2YgRnJlZVR5cGUncyBlbnVtZXJhdGlvbiAgICAgICAgICovCi0gIC8qICAgY29uc3RhbnRzLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBnZW5lcmF0ZSBlcnJvciBtZXNzYWdlIHN0cmluZ3MgICAqLwotICAvKiAgIHdpdGggYSBzbWFsbCBtYWNybyB0cmljayBleHBsYWluZWQgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgKkVycm9yKiAqRm9ybWF0cyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGNhbiBiZSAgICovCi0gIC8qICAgZGVmaW5lZCBpbiBgZnRvcHRpb24uaCcgaW4gb3JkZXIgdG8gbWFrZSB0aGUgaGlnaGVyIGJ5dGUgaW5kaWNhdGUgICAqLwotICAvKiAgIHRoZSBtb2R1bGUgd2hlcmUgdGhlIGVycm9yIGhhcyBoYXBwZW5lZCAodGhpcyBpcyBub3QgY29tcGF0aWJsZSAgICAgKi8KLSAgLyogICB3aXRoIHN0YW5kYXJkIGJ1aWxkcyBvZiBGcmVlVHlwZSZuYnNwOzIsIGhvd2V2ZXIpLiAgU2VlIHRoZSBmaWxlICAgICovCi0gIC8qICAgYGZ0bW9kZXJyLmgnIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAqRXJyb3IqICpNZXNzYWdlKiAqU3RyaW5ncyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIGRlZmluaXRpb25zIGFyZSBzZXQgdXAgd2l0aCBzcGVjaWFsIG1hY3JvcyB0aGF0IGFsbG93IGNsaWVudCAgKi8KLSAgLyogICBhcHBsaWNhdGlvbnMgdG8gYnVpbGQgYSB0YWJsZSBvZiBlcnJvciBtZXNzYWdlIHN0cmluZ3MuICBUaGUgICAgICAgICovCi0gIC8qICAgc3RyaW5ncyBhcmUgbm90IGluY2x1ZGVkIGluIGEgbm9ybWFsIGJ1aWxkIG9mIEZyZWVUeXBlJm5ic3A7MiB0byAgICAqLwotICAvKiAgIHNhdmUgc3BhY2UgKG1vc3QgY2xpZW50IGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlIHRoZW0pLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVG8gZG8gc28sIHlvdSBoYXZlIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nICAqLwotICAvKiAgIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvIGRlZmluZSB0aGUgc3RhcnQgb2YgICAgKi8KLSAgLyogICB0aGUgZXJyb3IgbGlzdC4gIEl0IGlzIGZvbGxvd2VkIGJ5IHNldmVyYWwgRlRfRVJST1JfREVGIGNhbGxzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VSUk9SX0RFRiggZSwgdiwgcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIG1hY3JvIGlzIGNhbGxlZCB0byBkZWZpbmUgb25lIHNpbmdsZSBlcnJvci4gIGBlJyBpcyB0aGUgZXJyb3IgICovCi0gIC8qICAgY29kZSBpZGVudGlmaWVyIChlLmcuLCBgSW52YWxpZF9Bcmd1bWVudCcpLCBgdicgaXMgdGhlIGVycm9yJ3MgICAgICAqLwotICAvKiAgIG51bWVyaWNhbCB2YWx1ZSwgYW5kIGBzJyBpcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBzdHJpbmcuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gZW5kcyB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWRkaXRpb25hbGx5LCB5b3UgaGF2ZSB0byB1bmRlZmluZSBgRlRFUlJPUlNfSF8nIGJlZm9yZSAjaW5jbHVkaW5nICAqLwotICAvKiAgIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjdW5kZWYgRlRFUlJPUlNfSF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgI2RlZmluZSBGVF9FUlJPUkRFRiggZSwgdiwgcyApICB7IGUsIHMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNkZWZpbmUgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjZGVmaW5lIEZUX0VSUk9SX0VORF9MSVNUICAgICAgIHsgMCwgTlVMTCB9IH07ICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNvbnN0IHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpbnQgICAgICAgICAgZXJyX2NvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgY29uc3QgY2hhciogIGVycl9tc2c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB9IGZ0X2Vycm9yc1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNpbmNsdWRlIEZUX0VSUk9SU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgYEZUX0Vycl9PaycgaXMgX25vdF8gZGVmaW5lZCB3aXRoIGBGVF9FUlJPUkRFRicgYnV0IHdpdGggICovCi0gIC8qICAgYEZUX05PRVJST1JERUYnOyBpdCBpcyBhbHdheXMgemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogKi8KLQotICAvKiBJbiBwcmV2aW91cyBGcmVlVHlwZSB2ZXJzaW9ucyB3ZSB1c2VkIGBfX0ZURVJST1JTX0hfXycuICBIb3dldmVyLCAqLwotICAvKiB1c2luZyB0d28gc3VjY2Vzc2l2ZSB1bmRlcnNjb3JlcyBpbiBhIG5vbi1zeXN0ZW0gc3ltYm9sIG5hbWUgICAgICAqLwotICAvKiB2aW9sYXRlcyB0aGUgQyAoYW5kIEMrKykgc3RhbmRhcmQsIHNvIGl0IHdhcyBjaGFuZ2VkIHRvIHRoZSAgICAgICAqLwotICAvKiBjdXJyZW50IGZvcm0uICBJbiBzcGl0ZSBvZiB0aGlzLCB3ZSBoYXZlIHRvIG1ha2UgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICN1bmRlZmluZSBfX0ZURVJST1JTX0hfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiB3b3JrIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmICEoIGRlZmluZWQoIEZURVJST1JTX0hfICkgJiYgZGVmaW5lZCAoIF9fRlRFUlJPUlNfSF9fICkgKQotI2RlZmluZSBGVEVSUk9SU19IXwotI2RlZmluZSBfX0ZURVJST1JTX0hfXwotCi0KLSAgLyogaW5jbHVkZSBtb2R1bGUgYmFzZSBlcnJvciBjb2RlcyAqLwotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNFVFVQIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX05FRURfRVhURVJOX0MKLQotCi0gIC8qIEZUX0VSUl9QUkVGSVggaXMgdXNlZCBhcyBhIHByZWZpeCBmb3IgZXJyb3IgaWRlbnRpZmllcnMuICovCi0gIC8qIEJ5IGRlZmF1bHQsIHdlIHVzZSBgRlRfRXJyXycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgRlRfRXJyXwotI2VuZGlmCi0KLQotICAvKiBGVF9FUlJfQkFTRSBpcyB1c2VkIGFzIHRoZSBiYXNlIGZvciBtb2R1bGUtc3BlY2lmaWMgZXJyb3JzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKLQotI2lmbmRlZiBGVF9FUlJfQkFTRQotI2RlZmluZSBGVF9FUlJfQkFTRSAgRlRfTW9kX0Vycl9CYXNlCi0jZW5kaWYKLQotI2Vsc2UKLQotI3VuZGVmIEZUX0VSUl9CQVNFCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAwCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTICovCi0KLQotICAvKiBJZiBGVF9FUlJPUkRFRiBpcyBub3QgZGVmaW5lZCwgd2UgbmVlZCB0byBkZWZpbmUgYSBzaW1wbGUgKi8KLSAgLyogZW51bWVyYXRpb24gdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FUlJPUkRFRgotCi0jZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgIGUgPSB2LAotI2RlZmluZSBGVF9FUlJPUl9TVEFSVF9MSVNUICAgICBlbnVtIHsKLSNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgTWF4ICkgfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX05FRURfRVhURVJOX0MKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FUlJPUkRFRiAqLwotCi0KLSAgLyogdGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSBhbiBlcnJvciAqLwotI2RlZmluZSBGVF9FUlJPUkRFRl8oIGUsIHYsIHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9FUlJPUkRFRiggRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApLCB2ICsgRlRfRVJSX0JBU0UsIHMgKQotCi0gIC8qIHRoaXMgaXMgb25seSB1c2VkIGZvciA8bW9kdWxlPl9FcnJfT2ssIHdoaWNoIG11c3QgYmUgMCEgKi8KLSNkZWZpbmUgRlRfTk9FUlJPUkRFRl8oIGUsIHYsIHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VSUk9SREVGKCBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICksIHYsIHMgKQotCi0KLSNpZmRlZiBGVF9FUlJPUl9TVEFSVF9MSVNUCi0gIEZUX0VSUk9SX1NUQVJUX0xJU1QKLSNlbmRpZgotCi0KLSAgLyogbm93IGluY2x1ZGUgdGhlIGVycm9yIGNvZGVzICovCi0jaW5jbHVkZSBGVF9FUlJPUl9ERUZJTklUSU9OU19ICi0KLQotI2lmZGVmIEZUX0VSUk9SX0VORF9MSVNUCi0gIEZUX0VSUk9SX0VORF9MSVNUCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBTSU1QTEUgQ0xFQU5VUCAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfTkVFRF9FWFRFUk5fQwotICB9Ci0jZW5kaWYKLQotI3VuZGVmIEZUX0VSUk9SX1NUQVJUX0xJU1QKLSN1bmRlZiBGVF9FUlJPUl9FTkRfTElTVAotCi0jdW5kZWYgRlRfRVJST1JERUYKLSN1bmRlZiBGVF9FUlJPUkRFRl8KLSN1bmRlZiBGVF9OT0VSUk9SREVGXwotCi0jdW5kZWYgRlRfTkVFRF9FWFRFUk5fQwotI3VuZGVmIEZUX0VSUl9CQVNFCi0KLSAgLyogRlRfRVJSX1BSRUZJWCBpcyBuZWVkZWQgaW50ZXJuYWxseSAqLwotI2lmbmRlZiBGVDJfQlVJTERfTElCUkFSWQotI3VuZGVmIEZUX0VSUl9QUkVGSVgKLSNlbmRpZgotCi0jZW5kaWYgLyogIShGVEVSUk9SU19IXyAmJiBfX0ZURVJST1JTX0hfXykgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3NzU4My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Zm50Zm10LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGZudGZtdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBmdW5jdGlvbnMgZm9yIGZvbnQgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRGTlRGTVRfSF8KLSNkZWZpbmUgRlRGTlRGTVRfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb250X2Zvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGb250IEZvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBHZXR0aW5nIHRoZSBmb250IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgc2luZ2xlIGZ1bmN0aW9uIGluIHRoaXMgc2VjdGlvbiBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGZvbnQgICAgICovCi0gIC8qICAgZm9ybWF0LiAgTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IG5lZWRlZCBub3JtYWxseTsgICAgICAgICAqLwotICAvKiAgIGhvd2V2ZXIsIHRoZXJlIGFyZSBzcGVjaWFsIGNhc2VzIChsaWtlIGluIFBERiBkZXZpY2VzKSB3aGVyZSBpdCBpcyAgKi8KLSAgLyogICBpbXBvcnRhbnQgdG8gZGlmZmVyZW50aWF0ZSwgaW4gc3BpdGUgb2YgRnJlZVR5cGUncyB1bmlmb3JtIEFQSS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfR2V0X0ZvbnRfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGZvcm1hdCBvZiBhIGdpdmVuIGZhY2UuICBQb3NzaWJsZSAgICAqLwotICAvKiAgIHZhbHVlcyBhcmUgYFRydWVUeXBlJywgYFR5cGV+MScsIGBCREYnLCBgUENGJywgYFR5cGV+NDInLCAgICAgICAgICAgKi8KLSAgLyogICBgQ0lEflR5cGV+MScsIGBDRkYnLCBgUEZSJywgYW5kIGBXaW5kb3dzfkZOVCcuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSByZXR1cm4gdmFsdWUgaXMgc3VpdGFibGUgdG8gYmUgdXNlZCBhcyBhbiBYMTEgRk9OVF9QUk9QRVJUWS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIElucHV0IGZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGb250IGZvcm1hdCBzdHJpbmcuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBIGRlcHJlY2F0ZWQgbmFtZSBmb3IgdGhlIHNhbWUgZnVuY3Rpb24gaXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgYEZUX0dldF9YMTFfRm9udF9Gb3JtYXQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBjb25zdCBjaGFyKiApCi0gIEZUX0dldF9Gb250X0Zvcm1hdCggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyogZGVwcmVjYXRlZCAqLwotICBGVF9FWFBPUlQoIGNvbnN0IGNoYXIqICkKLSAgRlRfR2V0X1gxMV9Gb250X0Zvcm1hdCggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVEZOVEZNVF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMThkNjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdhc3AuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgYGdhc3AnIHRhYmxlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRHQVNQX0hfCi0jZGVmaW5lIEZUR0FTUF9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgIGdhc3BfdGFibGUKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIEdhc3AgVGFibGUKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIFJldHJpZXZpbmcgVHJ1ZVR5cGUgYGdhc3AnIHRhYmxlIGVudHJpZXMuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgZnVuY3Rpb24gQEZUX0dldF9HYXNwIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUKLSAgICogICBmb250IGZvciBzcGVjaWZpYyBlbnRyaWVzIGluIGl0cyBgZ2FzcCcgdGFibGUsIGlmIGFueS4gIFRoaXMgaXMKLSAgICogICBtYWlubHkgdXNlZnVsIHdoZW4gaW1wbGVtZW50aW5nIG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIHdpdGggdGhlCi0gICAqICAgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gZHVwbGljYXRlIHRoZSBXaW5kb3dzIHRleHQgcmVuZGVyaW5nIHJlc3VsdHMuCi0gICAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX0dBU1BfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsdWVzIGFuZC9vciBiaXQtZmxhZ3MgcmV0dXJuZWQgYnkgdGhlIEBGVF9HZXRfR2FzcAotICAgKiAgIGZ1bmN0aW9uLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX0dBU1BfTk9fVEFCTEUgOjoKLSAgICogICAgIFRoaXMgc3BlY2lhbCB2YWx1ZSBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIEdBU1AgdGFibGUgaW4gdGhpcyBmYWNlLgotICAgKiAgICAgSXQgaXMgdXAgdG8gdGhlIGNsaWVudCB0byBkZWNpZGUgd2hhdCB0byBkby4KLSAgICoKLSAgICogICBGVF9HQVNQX0RPX0dSSURGSVQgOjoKLSAgICogICAgIEdyaWQtZml0dGluZyBhbmQgaGludGluZyBzaG91bGQgYmUgcGVyZm9ybWVkIGF0IHRoZSBzcGVjaWZpZWQgcHBlbS4KLSAgICogICAgIFRoaXMgKnJlYWxseSogbWVhbnMgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24uICBJZiB0aGlzIGJpdAotICAgKiAgICAgaXMgbm90IHNldCwgbm8gaGludGluZyBnZXRzIGFwcGxpZWQuCi0gICAqCi0gICAqICAgRlRfR0FTUF9ET19HUkFZIDo6Ci0gICAqICAgICBBbnRpLWFsaWFzZWQgcmVuZGVyaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQgYXQgdGhlIHNwZWNpZmllZCBwcGVtLgotICAgKiAgICAgSWYgbm90IHNldCwgZG8gbW9ub2Nocm9tZSByZW5kZXJpbmcuCi0gICAqCi0gICAqICAgRlRfR0FTUF9TWU1NRVRSSUNfU01PT1RISU5HIDo6Ci0gICAqICAgICBJZiBzZXQsIHNtb290aGluZyBhbG9uZyBtdWx0aXBsZSBheGVzIG11c3QgYmUgdXNlZCB3aXRoIENsZWFyVHlwZS4KLSAgICoKLSAgICogICBGVF9HQVNQX1NZTU1FVFJJQ19HUklERklUIDo6Ci0gICAqICAgICBHcmlkLWZpdHRpbmcgbXVzdCBiZSB1c2VkIHdpdGggQ2xlYXJUeXBlJ3Mgc3ltbWV0cmljIHNtb290aGluZy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIGJpdC1mbGFncyBgRlRfR0FTUF9ET19HUklERklUJyBhbmQgYEZUX0dBU1BfRE9fR1JBWScgYXJlIHRvIGJlCi0gICAqICAgdXNlZCBmb3Igc3RhbmRhcmQgZm9udCByYXN0ZXJpemF0aW9uIG9ubHkuICBJbmRlcGVuZGVudGx5IG9mIHRoYXQsCi0gICAqICAgYEZUX0dBU1BfU1lNTUVUUklDX1NNT09USElORycgYW5kIGBGVF9HQVNQX1NZTU1FVFJJQ19HUklERklUJyBhcmUgdG8KLSAgICogICBiZSB1c2VkIGlmIENsZWFyVHlwZSBpcyBlbmFibGVkIChhbmQgYEZUX0dBU1BfRE9fR1JJREZJVCcgYW5kCi0gICAqICAgYEZUX0dBU1BfRE9fR1JBWScgYXJlIGNvbnNlcXVlbnRseSBpZ25vcmVkKS4KLSAgICoKLSAgICogICBgQ2xlYXJUeXBlJyBpcyBNaWNyb3NvZnQncyBpbXBsZW1lbnRhdGlvbiBvZiBMQ0QgcmVuZGVyaW5nLCBwYXJ0bHkKLSAgICogICBwcm90ZWN0ZWQgYnkgcGF0ZW50cy4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgIDIuMy4wCi0gICAqLwotI2RlZmluZSBGVF9HQVNQX05PX1RBQkxFICAgICAgICAgICAgICAgLTEKLSNkZWZpbmUgRlRfR0FTUF9ET19HUklERklUICAgICAgICAgICAweDAxCi0jZGVmaW5lIEZUX0dBU1BfRE9fR1JBWSAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBGVF9HQVNQX1NZTU1FVFJJQ19HUklERklUICAgIDB4MDQKLSNkZWZpbmUgRlRfR0FTUF9TWU1NRVRSSUNfU01PT1RISU5HICAweDA4Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuYzoKLSAgICogICBGVF9HZXRfR2FzcAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgRm9yIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udCBmaWxlLCByZXR1cm4gdGhlIHJhc3Rlcml6ZXIgYmVoYXZpb3VyCi0gICAqICAgZmxhZ3MgZnJvbSB0aGUgZm9udCdzIGBnYXNwJyB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAgICogICBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGZhY2UgOjogVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogICBwcGVtIDo6IFRoZSB2ZXJ0aWNhbCBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBCaXQgZmxhZ3MgKHNlZSBARlRfR0FTUF9YWFgpLCBvciBARlRfR0FTUF9OT19UQUJMRSBpZiB0aGVyZSBpcyBubwotICAgKiAgIGBnYXNwJyB0YWJsZSBpbiB0aGUgZmFjZS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBNTSBmdW5jdGlvbmFsaXR5IG9mIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cwotICAgKiAgIChpLmUuLCB1c2luZyBARlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMgYW5kIGZyaWVuZHMpLCBjYWxsIHRoaXMKLSAgICogICBmdW5jdGlvbiAqYWZ0ZXIqIHNldHRpbmcgYW4gaW5zdGFuY2Ugc2luY2UgdGhlIHJldHVybiB2YWx1ZXMgY2FuCi0gICAqICAgY2hhbmdlLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgMi4zLjAKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfSW50ICkKLSAgRlRfR2V0X0dhc3AoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICBGVF9VSW50ICBwcGVtICk7Ci0KLSAgLyogKi8KLQotCi0jZW5kaWYgLyogRlRHQVNQX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRnbHlwaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjFhMmM4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRnbHlwaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z2x5cGguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGdseXBocyAoc3BlY2lmaWNhdGlvbikuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBzZXZlcmFsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyAgICAqLwotICAvKiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gZWFzaWx5IHJldHJpZXZlIGdseXBoICAgICAgKi8KLSAgLyogYml0bWFwcyBhbmQgb3V0bGluZXMgZnJvbSBhIGdpdmVuIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIG9wdGlvbmFsIGlmIHlvdSBhcmUgd3JpdGluZyBhIGZvbnQgc2VydmVyICAgKi8KLSAgLyogb3IgdGV4dCBsYXlvdXQgZW5naW5lIG9uIHRvcCBvZiBGcmVlVHlwZS4gIEhvd2V2ZXIsIHRoZXkgYXJlIHByZXR0eSAgICovCi0gIC8qIGhhbmR5IGZvciBtYW55IG90aGVyIHNpbXBsZSB1c2VzIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVEdMWVBIX0hfCi0jZGVmaW5lIEZUR0xZUEhfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHbHlwaCBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZW5lcmljIGludGVyZmFjZSB0byBtYW5hZ2UgaW5kaXZpZHVhbCBnbHlwaCBkYXRhLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGVmaW5pdGlvbnMgdXNlZCB0byBtYW5hZ2UgZ2x5cGggZGF0YSAgICAgICAgKi8KLSAgLyogICAgdGhyb3VnaCBnZW5lcmljIEZUX0dseXBoIG9iamVjdHMuICBFYWNoIG9mIHRoZW0gY2FuIGNvbnRhaW4gYSAgICAgICovCi0gIC8qICAgIGJpdG1hcCwgYSB2ZWN0b3Igb3V0bGluZSwgb3IgZXZlbiBpbWFnZXMgaW4gb3RoZXIgZm9ybWF0cy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGEgcHJpdmF0ZSB0eXBlICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0dseXBoX0NsYXNzXyAgRlRfR2x5cGhfQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgZ2VuZXJpYyBnbHlwaCBpbWFnZXMuICBJdCBpcyBhICAgKi8KLSAgLyogICAgcG9pbnRlciB0byB0aGUgQEZUX0dseXBoUmVjIHN0cnVjdHVyZSBhbmQgY2FuIGNvbnRhaW4gYSBnbHlwaCAgICAgICovCi0gIC8qICAgIGJpdG1hcCBvciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdseXBoIG9iamVjdHMgYXJlIG5vdCBvd25lZCBieSB0aGUgbGlicmFyeS4gIFlvdSBtdXN0IHRodXMgcmVsZWFzZSAqLwotICAvKiAgICB0aGVtIG1hbnVhbGx5ICh0aHJvdWdoIEBGVF9Eb25lX0dseXBoKSBfYmVmb3JlXyBjYWxsaW5nICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0RvbmVfRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaFJlY18qICBGVF9HbHlwaDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByb290IGdseXBoIHN0cnVjdHVyZSBjb250YWlucyBhIGdpdmVuIGdseXBoIGltYWdlIHBsdXMgaXRzICAgICAqLwotICAvKiAgICBhZHZhbmNlIHdpZHRoIGluIDE2LjE2IGZpeGVkLXBvaW50IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCdzIGNsYXNzLiAgUHJpdmF0ZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIHRoZSBnbHlwaCdzIGltYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlIDo6IEEgMTYuMTYgdmVjdG9yIHRoYXQgZ2l2ZXMgdGhlIGdseXBoJ3MgYWR2YW5jZSB3aWR0aC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaFJlY18KLSAgewotICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgbGlicmFyeTsKLSAgICBjb25zdCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6OwotICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgZm9ybWF0OwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgYWR2YW5jZTsKLQotICB9IEZUX0dseXBoUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgYSBiaXRtYXAgZ2x5cGggaW1hZ2UuICBUaGlzIGlzICovCi0gIC8qICAgIGEgc3ViLWNsYXNzIG9mIEBGVF9HbHlwaCwgYW5kIGEgcG9pbnRlciB0byBARlRfQml0bWFwR2x5cGhSZWMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfQml0bWFwR2x5cGhSZWNfKiAgRlRfQml0bWFwR2x5cGg7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBHbHlwaFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGZvciBiaXRtYXAgZ2x5cGggaW1hZ2VzLiAgVGhpcyByZWFsbHkgaXMgYSAgICAgICAgKi8KLSAgLyogICAgYHN1Yi1jbGFzcycgb2YgQEZUX0dseXBoUmVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgIDo6IFRoZSByb290IEBGVF9HbHlwaCBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0ICAgOjogVGhlIGxlZnQtc2lkZSBiZWFyaW5nLCBpLmUuLCB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGZyb20gdGhlIGN1cnJlbnQgcGVuIHBvc2l0aW9uIHRvIHRoZSBsZWZ0IGJvcmRlciBvZiB0aGUgICovCi0gIC8qICAgICAgICAgICAgICBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG9wICAgIDo6IFRoZSB0b3Atc2lkZSBiZWFyaW5nLCBpLmUuLCB0aGUgdmVydGljYWwgZGlzdGFuY2UgZnJvbSAgICovCi0gIC8qICAgICAgICAgICAgICB0aGUgY3VycmVudCBwZW4gcG9zaXRpb24gdG8gdGhlIHRvcCBib3JkZXIgb2YgdGhlIGdseXBoICAqLwotICAvKiAgICAgICAgICAgICAgYml0bWFwLiAgVGhpcyBkaXN0YW5jZSBpcyBwb3NpdGl2ZSBmb3IgdXB3YXJkc355ISAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcCA6OiBBIGRlc2NyaXB0b3IgZm9yIHRoZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBjYW4gdHlwZWNhc3QgYW4gQEZUX0dseXBoIHRvIEBGVF9CaXRtYXBHbHlwaCBpZiB5b3UgaGF2ZSAgICAgICAqLwotICAvKiAgICBgZ2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQJy4gIFRoaXMgbGV0cyB5b3UgYWNjZXNzICAgKi8KLSAgLyogICAgdGhlIGJpdG1hcCdzIGNvbnRlbnRzIGVhc2lseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY29ycmVzcG9uZGluZyBwaXhlbCBidWZmZXIgaXMgYWx3YXlzIG93bmVkIGJ5IEBGVF9CaXRtYXBHbHlwaCAgKi8KLSAgLyogICAgYW5kIGlzIHRodXMgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHdpdGggaXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQml0bWFwR2x5cGhSZWNfCi0gIHsKLSAgICBGVF9HbHlwaFJlYyAgcm9vdDsKLSAgICBGVF9JbnQgICAgICAgbGVmdDsKLSAgICBGVF9JbnQgICAgICAgdG9wOwotICAgIEZUX0JpdG1hcCAgICBiaXRtYXA7Ci0KLSAgfSBGVF9CaXRtYXBHbHlwaFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVHbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGFuIG91dGxpbmUgZ2x5cGggaW1hZ2UuICBUaGlzICAqLwotICAvKiAgICBpcyBhIHN1Yi1jbGFzcyBvZiBARlRfR2x5cGgsIGFuZCBhIHBvaW50ZXIgdG8gQEZUX091dGxpbmVHbHlwaFJlYy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX091dGxpbmVHbHlwaFJlY18qICBGVF9PdXRsaW5lR2x5cGg7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lR2x5cGhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGZvciBvdXRsaW5lICh2ZWN0b3JpYWwpIGdseXBoIGltYWdlcy4gIFRoaXMgICAgICAgKi8KLSAgLyogICAgcmVhbGx5IGlzIGEgYHN1Yi1jbGFzcycgb2YgQEZUX0dseXBoUmVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICA6OiBUaGUgcm9vdCBARlRfR2x5cGggZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgZGVzY3JpcHRvciBmb3IgdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHR5cGVjYXN0IGFuIEBGVF9HbHlwaCB0byBARlRfT3V0bGluZUdseXBoIGlmIHlvdSBoYXZlICAgICAgKi8KLSAgLyogICAgYGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUnLiAgVGhpcyBsZXRzIHlvdSBhY2Nlc3MgICovCi0gIC8qICAgIHRoZSBvdXRsaW5lJ3MgY29udGVudCBlYXNpbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXMgdGhlIG91dGxpbmUgaXMgZXh0cmFjdGVkIGZyb20gYSBnbHlwaCBzbG90LCBpdHMgY29vcmRpbmF0ZXMgYXJlICovCi0gIC8qICAgIGV4cHJlc3NlZCBub3JtYWxseSBpbiAyNi42IHBpeGVscywgdW5sZXNzIHRoZSBmbGFnICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSB3YXMgdXNlZCBpbiBARlRfTG9hZF9HbHlwaCgpIG9yIEBGVF9Mb2FkX0NoYXIoKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBvdXRsaW5lJ3MgdGFibGVzIGFyZSBhbHdheXMgb3duZWQgYnkgdGhlIG9iamVjdCBhbmQgYXJlICAgICAgICAqLwotICAvKiAgICBkZXN0cm95ZWQgd2l0aCBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9PdXRsaW5lR2x5cGhSZWNfCi0gIHsKLSAgICBGVF9HbHlwaFJlYyAgcm9vdDsKLSAgICBGVF9PdXRsaW5lICAgb3V0bGluZTsKLQotICB9IEZUX091dGxpbmVHbHlwaFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBleHRyYWN0IGEgZ2x5cGggaW1hZ2UgZnJvbSBhIHNsb3QuICBOb3RlIHRoYXQgICAqLwotICAvKiAgICB0aGUgY3JlYXRlZCBARlRfR2x5cGggb2JqZWN0IG11c3QgYmUgcmVsZWFzZWQgd2l0aCBARlRfRG9uZV9HbHlwaC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGggOjogQSBoYW5kbGUgdG8gdGhlIGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCZWNhdXNlIGAqYWdseXBoLT5hZHZhbmNlLngnIGFuZCAnKmFnbHlwaC0+YWR2YW5jZS55JyBhcmUgMTYuMTYgICAgKi8KLSAgLyogICAgZml4ZWQtcG9pbnQgbnVtYmVycywgYHNsb3QtPmFkdmFuY2UueCcgYW5kIGBzbG90LT5hZHZhbmNlLnknICAgICAgICovCi0gIC8qICAgICh3aGljaCBhcmUgaW4gMjYuNiBmaXhlZC1wb2ludCBmb3JtYXQpIG11c3QgYmUgaW4gdGhlIHJhbmdlICAgICAgICAqLwotICAvKiAgICBdLTMyNzY4OzMyNzY4Wy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfR2x5cGgoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgKmFnbHlwaCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGNvcHkgYSBnbHlwaCBpbWFnZS4gIE5vdGUgdGhhdCB0aGUgY3JlYXRlZCAgICAgICovCi0gIC8qICAgIEBGVF9HbHlwaCBvYmplY3QgbXVzdCBiZSByZWxlYXNlZCB3aXRoIEBGVF9Eb25lX0dseXBoLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNvdXJjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhcmdldCA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGdseXBoIG9iamVjdC4gIDB+aW4gY2FzZSBvZiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9Db3B5KCBGVF9HbHlwaCAgIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgRlRfR2x5cGggICp0YXJnZXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRyYW5zZm9ybSBhIGdseXBoIGltYWdlIGlmIGl0cyBmb3JtYXQgaXMgc2NhbGFibGUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hdHJpeCA6OiBBIHBvaW50ZXIgdG8gYSAyeDIgbWF0cml4IHRvIGFwcGx5LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGEgIDo6IEEgcG9pbnRlciB0byBhIDJkIHZlY3RvciB0byBhcHBseS4gIENvb3JkaW5hdGVzIGFyZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICBleHByZXNzZWQgaW4gMS82NHRoIG9mIGEgcGl4ZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUgKGlmIG5vdCAwLCB0aGUgZ2x5cGggZm9ybWF0IGlzIG5vdCBzY2FsYWJsZSkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSAyeDIgdHJhbnNmb3JtYXRpb24gbWF0cml4IGlzIGFsc28gYXBwbGllZCB0byB0aGUgZ2x5cGgncyAgICAgICAqLwotICAvKiAgICBhZHZhbmNlIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9UcmFuc2Zvcm0oIEZUX0dseXBoICAgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBkZWx0YSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfQkJveF9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1vZGUgaG93IHRoZSB2YWx1ZXMgb2YgQEZUX0dseXBoX0dldF9DQm94IGFyZSByZXR1cm5lZC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfQkJPWF9VTlNDQUxFRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgUmV0dXJuIHVuc2NhbGVkIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgUmV0dXJuIHVuZml0dGVkIDI2LjYgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfQkJPWF9HUklERklUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgUmV0dXJuIGdyaWQtZml0dGVkIDI2LjYgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfQkJPWF9UUlVOQ0FURSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgUmV0dXJuIGNvb3JkaW5hdGVzIGluIGludGVnZXIgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfQkJPWF9QSVhFTFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgUmV0dXJuIGdyaWQtZml0dGVkIHBpeGVsIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9HbHlwaF9CQm94X01vZGVfCi0gIHsKLSAgICBGVF9HTFlQSF9CQk9YX1VOU0NBTEVEICA9IDAsCi0gICAgRlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMgPSAwLAotICAgIEZUX0dMWVBIX0JCT1hfR1JJREZJVCAgID0gMSwKLSAgICBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFICA9IDIsCi0gICAgRlRfR0xZUEhfQkJPWF9QSVhFTFMgICAgPSAzCi0KLSAgfSBGVF9HbHlwaF9CQm94X01vZGU7Ci0KLQotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyAqLwotICAvKiBgRlRfR2x5cGhfQkJveF9Nb2RlJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9nbHlwaF9iYm94X3Vuc2NhbGVkICAgRlRfR0xZUEhfQkJPWF9VTlNDQUxFRAotI2RlZmluZSBmdF9nbHlwaF9iYm94X3N1YnBpeGVscyAgRlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMKLSNkZWZpbmUgZnRfZ2x5cGhfYmJveF9ncmlkZml0ICAgIEZUX0dMWVBIX0JCT1hfR1JJREZJVAotI2RlZmluZSBmdF9nbHlwaF9iYm94X3RydW5jYXRlICAgRlRfR0xZUEhfQkJPWF9UUlVOQ0FURQotI2RlZmluZSBmdF9nbHlwaF9iYm94X3BpeGVscyAgICAgRlRfR0xZUEhfQkJPWF9QSVhFTFMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIGdseXBoJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwgdGhlICAqLwotICAvKiAgICBvdXRsaW5lJ3MgcG9pbnRzLCBpbmNsdWRpbmcgQsOpemllciBjb250cm9sIHBvaW50cy4gIFRob3VnaCBpdCAgICAgICovCi0gIC8qICAgIGNvaW5jaWRlcyB3aXRoIHRoZSBleGFjdCBib3VuZGluZyBib3ggZm9yIG1vc3QgZ2x5cGhzLCBpdCBjYW4gYmUgICAqLwotICAvKiAgICBzbGlnaHRseSBsYXJnZXIgaW4gc29tZSBzaXR1YXRpb25zIChsaWtlIHdoZW4gcm90YXRpbmcgYW4gb3V0bGluZSAgKi8KLSAgLyogICAgdGhhdCBjb250YWlucyBCw6l6aWVyIG91dHNpZGUgYXJjcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0aW5nIHRoZSBjb250cm9sIGJveCBpcyB2ZXJ5IGZhc3QsIHdoaWxlIGdldHRpbmcgdGhlIGJvdW5kaW5nICovCi0gIC8qICAgIGJveCBjYW4gdGFrZSBtdWNoIG1vcmUgdGltZSBhcyBpdCBuZWVkcyB0byB3YWxrIG92ZXIgYWxsIHNlZ21lbnRzICAqLwotICAvKiAgICBhbmQgYXJjcyBpbiB0aGUgb3V0bGluZS4gIFRvIGdldCB0aGUgbGF0dGVyLCB5b3UgY2FuIHVzZSB0aGUgICAgICAgKi8KLSAgLyogICAgYGZ0YmJveCcgY29tcG9uZW50LCB3aGljaCBpcyBkZWRpY2F0ZWQgdG8gdGhpcyBzaW5nbGUgdGFzay4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2RlICA6OiBUaGUgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm5lZCAgICAgKi8KLSAgLyogICAgICAgICAgICAgYm91bmRpbmcgYm94IHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNib3ggOjogVGhlIGdseXBoIGNvb3JkaW5hdGUgYm91bmRpbmcgYm94LiAgQ29vcmRpbmF0ZXMgYXJlICAgICAgICovCi0gIC8qICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiAxLzY0dGggb2YgcGl4ZWxzIGlmIGl0IGlzIGdyaWQtZml0dGVkLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvb3JkaW5hdGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgZ2x5cGggb3JpZ2luLCB1c2luZyB0aGUgeX51cHdhcmRzICAqLwotICAvKiAgICBjb252ZW50aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQgd2l0aCBARlRfTE9BRF9OT19TQ0FMRSwgYGJib3hfbW9kZScgICAqLwotICAvKiAgICBtdXN0IGJlIHNldCB0byBARlRfR0xZUEhfQkJPWF9VTlNDQUxFRCB0byBnZXQgdW5zY2FsZWQgZm9udCAgICAgICAgKi8KLSAgLyogICAgdW5pdHMgaW4gMjYuNiBwaXhlbCBmb3JtYXQuICBUaGUgdmFsdWUgQEZUX0dMWVBIX0JCT1hfU1VCUElYRUxTICAgICovCi0gIC8qICAgIGlzIGFub3RoZXIgbmFtZSBmb3IgdGhpcyBjb25zdGFudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIGZvbnQgaXMgdHJpY2t5IGFuZCB0aGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkIHdpdGggICAgICAgICAgICovCi0gIC8qICAgIEBGVF9MT0FEX05PX1NDQUxFLCB0aGUgcmVzdWx0aW5nIENCb3ggaXMgbWVhbmluZ2xlc3MuICBUbyBnZXQgICAgICAqLwotICAvKiAgICByZWFzb25hYmxlIHZhbHVlcyBmb3IgdGhlIENCb3ggaXQgaXMgbmVjZXNzYXJ5IHRvIGxvYWQgdGhlIGdseXBoICAgKi8KLSAgLyogICAgYXQgYSBsYXJnZSBwcGVtIHZhbHVlIChzbyB0aGF0IHRoZSBoaW50aW5nIGluc3RydWN0aW9ucyBjYW4gICAgICAgICovCi0gIC8qICAgIHByb3Blcmx5IHNoaWZ0IGFuZCBzY2FsZSB0aGUgc3ViZ2x5cGhzKSwgdGhlbiBleHRyYWN0aW5nIHRoZSBDQm94LCAqLwotICAvKiAgICB3aGljaCBjYW4gYmUgZXZlbnR1YWxseSBjb252ZXJ0ZWQgYmFjayB0byBmb250IHVuaXRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aGUgbWF4aW11bSBjb29yZGluYXRlcyBhcmUgZXhjbHVzaXZlLCB3aGljaCBtZWFucyB0aGF0ICAqLwotICAvKiAgICBvbmUgY2FuIGNvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGdseXBoIGltYWdlIChiZSBpdCBpbiAgKi8KLSAgLyogICAgaW50ZWdlciBvciAyNi42IHBpeGVscykgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB3aWR0aCAgPSBiYm94LnhNYXggLSBiYm94LnhNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaGVpZ2h0ID0gYmJveC55TWF4IC0gYmJveC55TWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgYWxzbyB0aGF0IGZvciAyNi42IGNvb3JkaW5hdGVzLCBpZiBgYmJveF9tb2RlJyBpcyBzZXQgdG8gICAgICAqLwotICAvKiAgICBARlRfR0xZUEhfQkJPWF9HUklERklULCB0aGUgY29vcmRpbmF0ZXMgd2lsbCBhbHNvIGJlIGdyaWQtZml0dGVkLCAgKi8KLSAgLyogICAgd2hpY2ggY29ycmVzcG9uZHMgdG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBiYm94LnhNaW4gPSBGTE9PUihiYm94LnhNaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYmJveC55TWluID0gRkxPT1IoYmJveC55TWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJib3gueE1heCA9IENFSUxJTkcoYmJveC54TWF4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBiYm94LnlNYXggPSBDRUlMSU5HKGJib3gueU1heCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gZ2V0IHRoZSBiYm94IGluIHBpeGVsIGNvb3JkaW5hdGVzLCBzZXQgYGJib3hfbW9kZScgdG8gICAgICAgICAgICovCi0gIC8qICAgIEBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gZ2V0IHRoZSBiYm94IGluIGdyaWQtZml0dGVkIHBpeGVsIGNvb3JkaW5hdGVzLCBzZXQgYGJib3hfbW9kZScgICovCi0gIC8qICAgIHRvIEBGVF9HTFlQSF9CQk9YX1BJWEVMUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfR2x5cGhfR2V0X0NCb3goIEZUX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBiYm94X21vZGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAqYWNib3ggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX1RvX0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbnZlcnQgYSBnaXZlbiBnbHlwaCBvYmplY3QgdG8gYSBiaXRtYXAgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRoZV9nbHlwaCAgIDo6IEEgcG9pbnRlciB0byBhIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGdseXBoLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlbmRlcl9tb2RlIDo6IEFuIGVudW1lcmF0aW9uIHRoYXQgZGVzY3JpYmVzIGhvdyB0aGUgZGF0YSBpcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICByZW5kZXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9yaWdpbiAgICAgIDo6IEEgcG9pbnRlciB0byBhIHZlY3RvciB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgZ2x5cGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBpbWFnZSBiZWZvcmUgcmVuZGVyaW5nLiAgQ2FuIGJlfjAgKGlmIG5vICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24pLiAgVGhlIG9yaWdpbiBpcyBleHByZXNzZWQgaW4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIDI2LjYgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVzdHJveSAgICAgOjogQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG9yaWdpbmFsIGdseXBoICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGltYWdlIHNob3VsZCBiZSBkZXN0cm95ZWQgYnkgdGhpcyBmdW5jdGlvbi4gIEl0IGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBuZXZlciBkZXN0cm95ZWQgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBpZiB0aGUgZ2x5cGggZm9ybWF0IGlzbid0IHNjYWxhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBpbWFnZSBpcyB0cmFuc2xhdGVkIHdpdGggdGhlIGBvcmlnaW4nIHZlY3RvciBiZWZvcmUgICAgICAqLwotICAvKiAgICByZW5kZXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIEBGVF9HbHlwaCBoYW5kbGUsIHRoYXQgd2lsbCAqLwotICAvKiAgICBiZSBfcmVwbGFjZWRfIGJ5IHRoaXMgZnVuY3Rpb24gKHdpdGggbmV3bHkgYWxsb2NhdGVkIGRhdGEpLiAgICAgICAgKi8KLSAgLyogICAgVHlwaWNhbGx5LCB5b3Ugd291bGQgdXNlIChvbWl0dGluZyBlcnJvciBoYW5kbGluZyk6ICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9HbHlwaCAgICAgICAgZ2x5cGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfQml0bWFwR2x5cGggIGdseXBoX2JpdG1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gbG9hZCBnbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVycm9yID0gRlRfTG9hZF9DaGFyKCBmYWNlLCBnbHlwaF9pbmRleCwgRlRfTE9BRF9ERUZBVUxUICk7ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gZXh0cmFjdCBnbHlwaCBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVycm9yID0gRlRfR2V0X0dseXBoKCBmYWNlLT5nbHlwaCwgJmdseXBoICk7ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gY29udmVydCB0byBhIGJpdG1hcCAoZGVmYXVsdCByZW5kZXIgbW9kZSArIGRlc3Ryb3lpbmcgb2xkKSAgKi8KLSAgLyogICAgICAgIGlmICggZ2x5cGgtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICkgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBlcnJvciA9IEZUX0dseXBoX1RvX0JpdG1hcCggJmdseXBoLCBGVF9SRU5ERVJfTU9ERV9OT1JNQUwsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIGlmICggZXJyb3IgKSAvLyBgZ2x5cGgnIHVuY2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gYWNjZXNzIGJpdG1hcCBjb250ZW50IGJ5IHR5cGVjYXN0aW5nICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGdseXBoX2JpdG1hcCA9IChGVF9CaXRtYXBHbHlwaClnbHlwaDsgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gZG8gZnVubnkgc3R1ZmYgd2l0aCBpdCwgbGlrZSBibGl0dGluZy9kcmF3aW5nICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gZGlzY2FyZCBnbHlwaCBpbWFnZSAoYml0bWFwIG9yIG5vdCkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhlcmUgYW5vdGhlciBleGFtcGxlLCBhZ2FpbiB3aXRob3V0IGVycm9yIGhhbmRsaW5nOiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfR2x5cGggIGdseXBoc1tNQVhfR0xZUEhTXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBmb3IgKCBpZHggPSAwOyBpIDwgTUFYX0dMWVBIUzsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIGZhY2UsIGlkeCwgRlRfTE9BRF9ERUZBVUxUICkgfHwgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBGVF9HZXRfR2x5cGggKCBmYWNlLT5nbHlwaCwgJmdseXBoW2lkeF0gKTsgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBmb3IgKCBpZHggPSAwOyBpIDwgTUFYX0dMWVBIUzsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgRlRfR2x5cGggIGJpdG1hcCA9IGdseXBoc1tpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAvLyBhZnRlciB0aGlzIGNhbGwsIGBiaXRtYXAnIG5vIGxvbmdlciBwb2ludHMgaW50byAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgLy8gdGhlIGBnbHlwaHMnIGFycmF5IChhbmQgdGhlIG9sZCB2YWx1ZSBpc24ndCBkZXN0cm95ZWQpICAgICovCi0gIC8qICAgICAgICAgIEZUX0dseXBoX1RvX0JpdG1hcCggJmJpdG1hcCwgRlRfUkVOREVSX01PREVfTU9OTywgMCwgMCApOyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBGVF9Eb25lX0dseXBoKCBiaXRtYXAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBmb3IgKCBpZHggPSAwOyBpIDwgTUFYX0dMWVBIUzsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBGVF9Eb25lX0dseXBoKCBnbHlwaHNbaWR4XSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhfVG9fQml0bWFwKCBGVF9HbHlwaCogICAgICAgdGhlX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZXN0cm95ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGEgZ2l2ZW4gZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0RvbmVfR2x5cGgoIEZUX0dseXBoICBnbHlwaCApOwotCi0gIC8qICovCi0KLQotICAvKiBvdGhlciBoZWxwZnVsIGZ1bmN0aW9ucyAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXB1dGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXhfTXVsdGlwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQZXJmb3JtIHRoZSBtYXRyaXggb3BlcmF0aW9uIGBiID0gYSpiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IEEgcG9pbnRlciB0byBtYXRyaXggYGEnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiIDo6IEEgcG9pbnRlciB0byBtYXRyaXggYGInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBlaXRoZXIgYGEnIG9yIGBiJyBpcyB6ZXJvLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIHRoZSBmdW5jdGlvbiB1c2VzIHdyYXAtYXJvdW5kIGFyaXRobWV0aWMsIHJlc3VsdHMgYmVjb21lICAgICAqLwotICAvKiAgICBtZWFuaW5nbGVzcyBpZiB0aGUgYXJndW1lbnRzIGFyZSB2ZXJ5IGxhcmdlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX01hdHJpeF9NdWx0aXBseSggY29uc3QgRlRfTWF0cml4KiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICAgICAgICBiICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXhfSW52ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbnZlcnQgYSAyeDIgbWF0cml4LiAgUmV0dXJuIGFuIGVycm9yIGlmIGl0IGNhbid0IGJlIGludmVydGVkLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgbWF0cml4LiAgUmVtYWlucyB1bnRvdWNoZWQgaW4gICAgKi8KLSAgLyogICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTWF0cml4X0ludmVydCggRlRfTWF0cml4KiAgbWF0cml4ICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVEdMWVBIX0hfICovCi0KLQotLyogRU5EICovCi0KLQotLyogTG9jYWwgVmFyaWFibGVzOiAqLwotLyogY29kaW5nOiB1dGYtOCAgICAqLwotLyogRW5kOiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGd4dmFsLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzOWM3MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGd4dmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoc3BlY2lmaWNhdGlvbikuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkaGF0IEsuSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUR1hWQUxfSF8KLSNkZWZpbmUgRlRHWFZBTF9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBneF92YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZUdYL0FBVCBWYWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBBUEkgdG8gdmFsaWRhdGUgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9ucyB0byB2YWxpZGF0ZSAgICAgKi8KLSAgLyogICAgc29tZSBUcnVlVHlwZUdYIHRhYmxlcyAoZmVhdCwgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2Vybiwgb3BiZCwgICovCi0gIC8qICAgIHRyYWssIHByb3AsIGxjYXIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RydWVUeXBlR1hfVmFsaWRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9UcnVlVHlwZUdYX0ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DbGFzc2ljS2Vybl9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZBTElEQVRFX0dYX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WQUxJREFURV9HWFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVkFMSURBVEVfQ0tFUk5YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXYXJuaW5nOiBVc2UgRlRfVkFMSURBVEVfWFhYIHRvIHZhbGlkYXRlIGEgdGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgRm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBmb3IgZ3h2YWxpZCBkZXZlbG9wZXJzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRlRfVkFMSURBVEVfZmVhdF9JTkRFWCAgICAgMAotI2RlZmluZSBGVF9WQUxJREFURV9tb3J0X0lOREVYICAgICAxCi0jZGVmaW5lIEZUX1ZBTElEQVRFX21vcnhfSU5ERVggICAgIDIKLSNkZWZpbmUgRlRfVkFMSURBVEVfYnNsbl9JTkRFWCAgICAgMwotI2RlZmluZSBGVF9WQUxJREFURV9qdXN0X0lOREVYICAgICA0Ci0jZGVmaW5lIEZUX1ZBTElEQVRFX2tlcm5fSU5ERVggICAgIDUKLSNkZWZpbmUgRlRfVkFMSURBVEVfb3BiZF9JTkRFWCAgICAgNgotI2RlZmluZSBGVF9WQUxJREFURV90cmFrX0lOREVYICAgICA3Ci0jZGVmaW5lIEZUX1ZBTElEQVRFX3Byb3BfSU5ERVggICAgIDgKLSNkZWZpbmUgRlRfVkFMSURBVEVfbGNhcl9JTkRFWCAgICAgOQotI2RlZmluZSBGVF9WQUxJREFURV9HWF9MQVNUX0lOREVYICBGVF9WQUxJREFURV9sY2FyX0lOREVYCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVkFMSURBVEVfR1hfTEVOR1RICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgbnVtYmVyIG9mIHRhYmxlcyBjaGVja2VkIGluIHRoaXMgbW9kdWxlLiAgVXNlIGl0IGFzIGEgcGFyYW1ldGVyCi0gICAqICAgZm9yIHRoZSBgdGFibGUtbGVuZ3RoJyBhcmd1bWVudCBvZiBmdW5jdGlvbiBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZS4KLSAgICovCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dYX0xFTkdUSCAgICAgKEZUX1ZBTElEQVRFX0dYX0xBU1RfSU5ERVggKyAxKQotCi0gIC8qICovCi0KLSAgLyogVXAgdG8gMHgxMDAwIGlzIHVzZWQgYnkgb3R2YWxpZC4KLSAgICAgT3gyeHh4IGlzIHJlc2VydmVkIGZvciBmZWF0dXJlIE9UIGV4dGVuc2lvbi4gKi8KLSNkZWZpbmUgRlRfVkFMSURBVEVfR1hfU1RBUlQgMHg0MDAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCB0YWcgKSAgICAgICAgICAgICAgICAgIFwKLSAgKCBGVF9WQUxJREFURV9HWF9TVEFSVCA8PCBGVF9WQUxJREFURV8jI3RhZyMjX0lOREVYICkKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBlbnVtOgotICAqICAgIEZUX1ZBTElEQVRFX0dYWFhYCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlZCB3aXRoIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlIHRvCi0gICogICAgaW5kaWNhdGUgd2hpY2ggVHJ1ZVR5cGVHWC9BQVQgVHlwZSB0YWJsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZC4KLSAgKgotICAqIEB2YWx1ZXM6Ci0gICogICAgRlRfVkFMSURBVEVfZmVhdCA6OgotICAqICAgICAgVmFsaWRhdGUgYGZlYXQnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfbW9ydCA6OgotICAqICAgICAgVmFsaWRhdGUgYG1vcnQnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfbW9yeCA6OgotICAqICAgICAgVmFsaWRhdGUgYG1vcngnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfYnNsbiA6OgotICAqICAgICAgVmFsaWRhdGUgYGJzbG4nIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfanVzdCA6OgotICAqICAgICAgVmFsaWRhdGUgYGp1c3QnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfa2VybiA6OgotICAqICAgICAgVmFsaWRhdGUgYGtlcm4nIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfb3BiZCA6OgotICAqICAgICAgVmFsaWRhdGUgYG9wYmQnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfdHJhayA6OgotICAqICAgICAgVmFsaWRhdGUgYHRyYWsnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfcHJvcCA6OgotICAqICAgICAgVmFsaWRhdGUgYHByb3AnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfbGNhciA6OgotICAqICAgICAgVmFsaWRhdGUgYGxjYXInIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfR1ggOjoKLSAgKiAgICAgIFZhbGlkYXRlIGFsbCBUcnVlVHlwZUdYIHRhYmxlcyAoZmVhdCwgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2VybiwKLSAgKiAgICAgIG9wYmQsIHRyYWssIHByb3AgYW5kIGxjYXIpLgotICAqCi0gICovCi0KLSNkZWZpbmUgRlRfVkFMSURBVEVfZmVhdCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGZlYXQgKQotI2RlZmluZSBGVF9WQUxJREFURV9tb3J0ICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggbW9ydCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX21vcnggIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBtb3J4ICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfYnNsbiAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGJzbG4gKQotI2RlZmluZSBGVF9WQUxJREFURV9qdXN0ICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCgganVzdCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2tlcm4gIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBrZXJuICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfb3BiZCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIG9wYmQgKQotI2RlZmluZSBGVF9WQUxJREFURV90cmFrICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggdHJhayApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX3Byb3AgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBwcm9wICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfbGNhciAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGxjYXIgKQotCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dYICAoIEZUX1ZBTElEQVRFX2ZlYXQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX21vcnQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX21vcnggfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX2JzbG4gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX2p1c3QgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX2tlcm4gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX29wYmQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX3RyYWsgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX3Byb3AgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX2xjYXIgKQotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX1RydWVUeXBlR1hfVmFsaWRhdGUKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBWYWxpZGF0ZSB2YXJpb3VzIFRydWVUeXBlR1ggdGFibGVzIHRvIGFzc3VyZSB0aGF0IGFsbCBvZmZzZXRzIGFuZAotICAqICAgIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHRoYXQKLSAgKiAgICBhY3R1YWxseSBkb2VzIHRoZSB0ZXh0IGxheW91dCBjYW4gYWNjZXNzIHRob3NlIHRhYmxlcyB3aXRob3V0Ci0gICogICAgZXJyb3IgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgotICAqICAgICAgIEEgYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZSB0YWJsZXMgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCi0gICogICAgICAgQEZUX1ZBTElEQVRFX0dYWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0gICoKLSAgKiAgICB0YWJsZV9sZW5ndGggOjoKLSAgKiAgICAgICBUaGUgc2l6ZSBvZiB0aGUgYHRhYmxlcycgYXJyYXkuICBOb3JtYWxseSwgQEZUX1ZBTElEQVRFX0dYX0xFTkdUSAotICAqICAgICAgIHNob3VsZCBiZSBwYXNzZWQuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIHRhYmxlcyA6OgotICAqICAgICAgIFRoZSBhcnJheSB3aGVyZSBhbGwgdmFsaWRhdGVkIHNmbnQgdGFibGVzIGFyZSBzdG9yZWQuCi0gICogICAgICAgVGhlIGFycmF5IGl0c2VsZiBtdXN0IGJlIGFsbG9jYXRlZCBieSBhIGNsaWVudC4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBUcnVlVHlwZUdYIGZvbnRzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgKiAgIG90aGVyd2lzZS4KLSAgKgotICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMgcG9pbnRlZCB0byBieQotICAqICAgZWFjaCBgdGFibGVzJyBlbGVtZW50LCBieSBjYWxsaW5nIEBGVF9UcnVlVHlwZUdYX0ZyZWUuICBBIE5VTEwgdmFsdWUKLSAgKiAgIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIgZG9lc24ndCBleGlzdCBpbiB0aGUgZm9udCwgdGhlCi0gICogICBhcHBsaWNhdGlvbiBoYXNuJ3QgYXNrZWQgZm9yIHZhbGlkYXRpb24sIG9yIHRoZSB2YWxpZGF0b3IgZG9lc24ndCBoYXZlCi0gICogICB0aGUgYWJpbGl0eSB0byB2YWxpZGF0ZSB0aGUgc2ZudCB0YWJsZS4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1RydWVUeXBlR1hfVmFsaWRhdGUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgdmFsaWRhdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlc1tGVF9WQUxJREFURV9HWF9MRU5HVEhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgdGFibGVfbGVuZ3RoICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfVHJ1ZVR5cGVHWF9GcmVlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBUcnVlVHlwZUdYIHZhbGlkYXRvci4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB0YWJsZSA6OgotICAqICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0gICogICAgICAgQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIGZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkKLSAgKiAgIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlIG9ubHkuCi0gICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1RydWVUeXBlR1hfRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZW51bToKLSAgKiAgICBGVF9WQUxJREFURV9DS0VSTlhYWAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUKLSAgKiAgICB0byBpbmRpY2F0ZSB0aGUgY2xhc3NpYyBrZXJuIGRpYWxlY3Qgb3IgZGlhbGVjdHMuICBJZiB0aGUgc2VsZWN0ZWQKLSAgKiAgICB0eXBlIGRvZXNuJ3QgZml0LCBARlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUgcmVnYXJkcyB0aGUgdGFibGUgYXMKLSAgKiAgICBpbnZhbGlkLgotICAqCi0gICogQHZhbHVlczoKLSAgKiAgICBGVF9WQUxJREFURV9NUyA6OgotICAqICAgICAgSGFuZGxlIHRoZSBga2VybicgdGFibGUgYXMgYSBjbGFzc2ljIE1pY3Jvc29mdCBrZXJuIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfQVBQTEUgOjoKLSAgKiAgICAgIEhhbmRsZSB0aGUgYGtlcm4nIHRhYmxlIGFzIGEgY2xhc3NpYyBBcHBsZSBrZXJuIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfQ0tFUk4gOjoKLSAgKiAgICAgIEhhbmRsZSB0aGUgYGtlcm4nIGFzIGVpdGhlciBjbGFzc2ljIEFwcGxlIG9yIE1pY3Jvc29mdCBrZXJuIHRhYmxlLgotICAqLwotI2RlZmluZSBGVF9WQUxJREFURV9NUyAgICAgKCBGVF9WQUxJREFURV9HWF9TVEFSVCA8PCAwICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfQVBQTEUgICggRlRfVkFMSURBVEVfR1hfU1RBUlQgPDwgMSApCi0KLSNkZWZpbmUgRlRfVkFMSURBVEVfQ0tFUk4gICggRlRfVkFMSURBVEVfTVMgfCBGVF9WQUxJREFURV9BUFBMRSApCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBWYWxpZGF0ZSBjbGFzc2ljICgxNi1iaXQgZm9ybWF0KSBrZXJuIHRhYmxlIHRvIGFzc3VyZSB0aGF0IHRoZSBvZmZzZXRzCi0gICogICAgYW5kIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHRoYXQKLSAgKiAgICBhY3R1YWxseSBkb2VzIHRoZSB0ZXh0IGxheW91dCBjYW4gYWNjZXNzIHRob3NlIHRhYmxlcyB3aXRob3V0IGVycm9yCi0gICogICAgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCi0gICoKLSAgKiAgICBUaGUgYGtlcm4nIHRhYmxlIHZhbGlkYXRvciBpbiBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSBkZWFscyB3aXRoIGJvdGgKLSAgKiAgICB0aGUgbmV3IDMyLWJpdCBmb3JtYXQgYW5kIHRoZSBjbGFzc2ljIDE2LWJpdCBmb3JtYXQsIHdoaWxlCi0gICogICAgRlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUgb25seSBzdXBwb3J0cyB0aGUgY2xhc3NpYyAxNi1iaXQgZm9ybWF0LgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIHZhbGlkYXRpb25fZmxhZ3MgOjoKLSAgKiAgICAgICBBIGJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUgZGlhbGVjdCB0byBiZSB2YWxpZGF0ZWQuICBTZWUKLSAgKiAgICAgICBARlRfVkFMSURBVEVfQ0tFUk5YWFggZm9yIHBvc3NpYmxlIHZhbHVlcy4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgY2tlcm5fdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGtlcm4gdGFibGUuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMgcG9pbnRlZCB0byBieQotICAqICAgYGNrZXJuX3RhYmxlJywgYnkgY2FsbGluZyBARlRfQ2xhc3NpY0tlcm5fRnJlZS4gIEEgTlVMTCB2YWx1ZQotICAqICAgaW5kaWNhdGVzIHRoYXQgdGhlIHRhYmxlIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICB2YWxpZGF0aW9uX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICpja2Vybl90YWJsZSApOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0NsYXNzaWNLZXJuX0ZyZWUKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBGcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5IGNsYXNzaWMgS2VybiB2YWxpZGF0b3IuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdGFibGUgOjoKLSAgKiAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgaXMgYWxsb2NhdGVkIGJ5Ci0gICogICAgICAgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0gICogICBARlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUgb25seS4KLSAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfQ2xhc3NpY0tlcm5fRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRHWFZBTF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGd6aXAuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRnemlwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWNlYWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGd6aXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGd6aXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgR3ppcC1jb21wcmVzc2VkIHN0cmVhbSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRHWklQX0hfCi0jZGVmaW5lIEZUR1pJUF9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ3ppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1pJUCBTdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNpbmcgZ3ppcC1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBHemlwLXNwZWNpZmljIGZ1bmN0aW9ucy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgRlRfU3RyZWFtX09wZW5HemlwCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMKLSAgKiAgIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLmd6JyBmb250cyB0aGF0IGNvbWUKLSAgKiAgIHdpdGggWEZyZWU4Ni4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgIHN0cmVhbSA6OgotICAqICAgICBUaGUgdGFyZ2V0IGVtYmVkZGluZyBzdHJlYW0uCi0gICoKLSAgKiAgIHNvdXJjZSA6OgotICAqICAgICBUaGUgc291cmNlIHN0cmVhbS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGUgc291cmNlIHN0cmVhbSBtdXN0IGJlIG9wZW5lZCBfYmVmb3JlXyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gICoKLSAgKiAgIENhbGxpbmcgdGhlIGludGVybmFsIGZ1bmN0aW9uIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBuZXcgc3RyZWFtIHdpbGwKLSAgKiAgICpub3QqIGNhbGwgYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIHNvdXJjZSBzdHJlYW0uICBOb25lIG9mIHRoZSBzdHJlYW0KLSAgKiAgIG9iamVjdHMgd2lsbCBiZSByZWxlYXNlZCB0byB0aGUgaGVhcC4KLSAgKgotICAqICAgVGhlIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGJhc2ljIGFuZCByZXNldHMgdGhlIGRlY29tcHJlc3Npb24KLSAgKiAgIHByb2Nlc3MgZWFjaCB0aW1lIHNlZWtpbmcgYmFja3dhcmRzIGlzIG5lZWRlZCB3aXRoaW4gdGhlIHN0cmVhbS4KLSAgKgotICAqICAgSW4gY2VydGFpbiBidWlsZHMgb2YgdGhlIGxpYnJhcnksIGd6aXAgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKLSAgKiAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aGVuIGNhbGxpbmcgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UuCi0gICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3Ci0gICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBnemlwcGVkIHN0cmVhbSBmcm9tCi0gICogICBpdCBhbmQgcmUtb3BlbiB0aGUgZmFjZSB3aXRoIGl0LgotICAqCi0gICogICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHlvdXIgYnVpbGQKLSAgKiAgIG9mIEZyZWVUeXBlIHdhcyBub3QgY29tcGlsZWQgd2l0aCB6bGliIHN1cHBvcnQuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3Blbkd6aXAoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc291cmNlICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgIEZUX0d6aXBfVW5jb21wcmVzcwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgRGVjb21wcmVzcyBhIHppcHBlZCBpbnB1dCBidWZmZXIgaW50byBhbiBvdXRwdXQgYnVmZmVyLiAgVGhpcyBmdW5jdGlvbgotICAqICAgaXMgbW9kZWxlZCBhZnRlciB6bGliJ3MgYHVuY29tcHJlc3MnIGZ1bmN0aW9uLgotICAqCi0gICogQGlucHV0OgotICAqICAgbWVtb3J5IDo6Ci0gICogICAgIEEgRnJlZVR5cGUgbWVtb3J5IGhhbmRsZS4KLSAgKgotICAqICAgaW5wdXQgOjoKLSAgKiAgICAgVGhlIGlucHV0IGJ1ZmZlci4KLSAgKgotICAqICAgaW5wdXRfbGVuIDo6Ci0gICogICAgIFRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlci4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICBvdXRwdXQ6OgotICAqICAgICBUaGUgb3V0cHV0IGJ1ZmZlci4KLSAgKgotICAqIEBpbm91dDoKLSAgKiAgIG91dHB1dF9sZW4gOjoKLSAgKiAgICAgQmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCB0aGlzIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBvdXRwdXQKLSAgKiAgICAgYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUgdW5jb21wcmVzc2VkCi0gICogICAgIGRhdGEgKHNvIHRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGJlIGtub3duIGluCi0gICogICAgIGFkdmFuY2UpLiAgQWZ0ZXIgY2FsbGluZyB0aGUgZnVuY3Rpb24sIGBvdXRwdXRfbGVuJyBpcyB0aGUgc2l6ZSBvZgotICAqICAgICB0aGUgdXNlZCBkYXRhIGluIGBvdXRwdXQnLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAotICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIHpsaWIgc3VwcG9ydC4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0d6aXBfVW5jb21wcmVzcyggRlRfTWVtb3J5ICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICBvdXRwdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaW5wdXRfbGVuICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVEdaSVBfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzg5ZTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aW1hZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBnbHlwaCBpbWFnZSBmb3JtYXRzIGFuZCBkZWZhdWx0IHJhc3RlciBpbnRlcmZhY2UgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZTogQSBgcmFzdGVyJyBpcyBzaW1wbHkgYSBzY2FuLWxpbmUgY29udmVydGVyLCB1c2VkIHRvIHJlbmRlciAgICAgICovCi0gIC8qICAgICAgIEZUX091dGxpbmVzIGludG8gRlRfQml0bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVElNQUdFX0hfCi0jZGVmaW5lIEZUSU1BR0VfSF8KLQotCi0gIC8qIFNUQU5EQUxPTkVfIGlzIGZyb20gZnRncmF5cy5jICovCi0jaWZuZGVmIFNUQU5EQUxPTkVfCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSB0eXBlIEZUX1BvcyBpcyB1c2VkIHRvIHN0b3JlIHZlY3RvcmlhbCBjb29yZGluYXRlcy4gIERlcGVuZGluZyAqLwotICAvKiAgICBvbiB0aGUgY29udGV4dCwgdGhlc2UgY2FuIHJlcHJlc2VudCBkaXN0YW5jZXMgaW4gaW50ZWdlciBmb250ICAgICAgKi8KLSAgLyogICAgdW5pdHMsIG9yIDE2LjE2LCBvciAyNi42IGZpeGVkLXBvaW50IHBpeGVsIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBsb25nICBGVF9Qb3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJEIHZlY3RvcjsgY29vcmRpbmF0ZXMgYXJlIG9mICAgKi8KLSAgLyogICAgdGhlIEZUX1BvcyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeCA6OiBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkgOjogVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1ZlY3Rvcl8KLSAgewotICAgIEZUX1BvcyAgeDsKLSAgICBGVF9Qb3MgIHk7Ci0KLSAgfSBGVF9WZWN0b3I7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYW4gb3V0bGluZSdzIGJvdW5kaW5nIGJveCwgaS5lLiwgdGhlICAgICAgKi8KLSAgLyogICAgY29vcmRpbmF0ZXMgb2YgaXRzIGV4dHJlbWEgaW4gdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICAgICAgICAgICovCi0gIC8qICAgIGRpcmVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhNaW4gOjogVGhlIGhvcml6b250YWwgbWluaW11bSAobGVmdC1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeU1pbiA6OiBUaGUgdmVydGljYWwgbWluaW11bSAoYm90dG9tLW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4TWF4IDo6IFRoZSBob3Jpem9udGFsIG1heGltdW0gKHJpZ2h0LW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlNYXggOjogVGhlIHZlcnRpY2FsIG1heGltdW0gKHRvcC1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBib3VuZGluZyBib3ggaXMgc3BlY2lmaWVkIHdpdGggdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBsb3dlciAgICAqLwotICAvKiAgICBsZWZ0IGFuZCB0aGUgdXBwZXIgcmlnaHQgY29ybmVyLiAgSW4gUG9zdFNjcmlwdCwgdGhvc2UgdmFsdWVzIGFyZSAgKi8KLSAgLyogICAgb2Z0ZW4gY2FsbGVkIChsbHgsbGx5KSBhbmQgKHVyeCx1cnkpLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgeU1pbicgaXMgbmVnYXRpdmUsIHRoaXMgdmFsdWUgZ2l2ZXMgdGhlIGdseXBoJ3MgZGVzY2VuZGVyLiAgICAgKi8KLSAgLyogICAgT3RoZXJ3aXNlLCB0aGUgZ2x5cGggZG9lc24ndCBkZXNjZW5kIGJlbG93IHRoZSBiYXNlbGluZS4gICAgICAgICAgICovCi0gIC8qICAgIFNpbWlsYXJseSwgaWYgYHltYXgnIGlzIHBvc2l0aXZlLCB0aGlzIHZhbHVlIGdpdmVzIHRoZSBnbHlwaCdzICAgICAqLwotICAvKiAgICBhc2NlbmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGB4TWluJyBnaXZlcyB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSBmcm9tIHRoZSBnbHlwaCdzIG9yaWdpbiB0byAgICAqLwotICAvKiAgICB0aGUgbGVmdCBlZGdlIG9mIHRoZSBnbHlwaCdzIGJvdW5kaW5nIGJveC4gIElmIGB4TWluJyBpcyBuZWdhdGl2ZSwgKi8KLSAgLyogICAgdGhlIGdseXBoIGV4dGVuZHMgdG8gdGhlIGxlZnQgb2YgdGhlIG9yaWdpbi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQkJveF8KLSAgewotICAgIEZUX1BvcyAgeE1pbiwgeU1pbjsKLSAgICBGVF9Qb3MgIHhNYXgsIHlNYXg7Ci0KLSAgfSBGVF9CQm94OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGl4ZWxfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgcGl4ZWxzIGluIGEgICAgICovCi0gIC8qICAgIGdpdmVuIGJpdG1hcC4gIE5vdGUgdGhhdCBhZGRpdGlvbmFsIGZvcm1hdHMgbWF5IGJlIGFkZGVkIGluIHRoZSAgICAqLwotICAvKiAgICBmdXR1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBWYWx1ZX4wIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX01PTk8gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIG1vbm9jaHJvbWUgYml0bWFwLCB1c2luZyAxfmJpdCBwZXIgcGl4ZWwuICBOb3RlIHRoYXQgcGl4ZWxzICAgICovCi0gIC8qICAgICAgYXJlIHN0b3JlZCBpbiBtb3N0LXNpZ25pZmljYW50IG9yZGVyIChNU0IpLCB3aGljaCBtZWFucyB0aGF0ICAgICAqLwotICAvKiAgICAgIHRoZSBsZWZ0LW1vc3QgcGl4ZWwgaW4gYSBieXRlIGhhcyB2YWx1ZSAxMjguICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfR1JBWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIDgtYml0IGJpdG1hcCwgZ2VuZXJhbGx5IHVzZWQgdG8gcmVwcmVzZW50IGFudGktYWxpYXNlZCBnbHlwaCAgKi8KLSAgLyogICAgICBpbWFnZXMuICBFYWNoIHBpeGVsIGlzIHN0b3JlZCBpbiBvbmUgYnl0ZS4gIE5vdGUgdGhhdCB0aGUgbnVtYmVyICovCi0gIC8qICAgICAgb2YgYGdyYXknIGxldmVscyBpcyBzdG9yZWQgaW4gdGhlIGBudW1fZ3JheXMnIGZpZWxkIG9mIHRoZSAgICAgICAqLwotICAvKiAgICAgIEBGVF9CaXRtYXAgc3RydWN0dXJlIChpdCBnZW5lcmFsbHkgaXMgMjU2KS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfR1JBWTIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgMi1iaXQgcGVyIHBpeGVsIGJpdG1hcCwgdXNlZCB0byByZXByZXNlbnQgZW1iZWRkZWQgICAgICAgICAgICAgKi8KLSAgLyogICAgICBhbnRpLWFsaWFzZWQgYml0bWFwcyBpbiBmb250IGZpbGVzIGFjY29yZGluZyB0byB0aGUgT3BlblR5cGUgICAgICovCi0gIC8qICAgICAgc3BlY2lmaWNhdGlvbi4gIFdlIGhhdmVuJ3QgZm91bmQgYSBzaW5nbGUgZm9udCB1c2luZyB0aGlzICAgICAgICAqLwotICAvKiAgICAgIGZvcm1hdCwgaG93ZXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfR1JBWTQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgNC1iaXQgcGVyIHBpeGVsIGJpdG1hcCwgcmVwcmVzZW50aW5nIGVtYmVkZGVkIGFudGktYWxpYXNlZCAgICAgKi8KLSAgLyogICAgICBiaXRtYXBzIGluIGZvbnQgZmlsZXMgYWNjb3JkaW5nIHRvIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgICovCi0gIC8qICAgICAgV2UgaGF2ZW4ndCBmb3VuZCBhIHNpbmdsZSBmb250IHVzaW5nIHRoaXMgZm9ybWF0LCBob3dldmVyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9MQ0QgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gOC1iaXQgYml0bWFwLCByZXByZXNlbnRpbmcgUkdCIG9yIEJHUiBkZWNpbWF0ZWQgZ2x5cGggaW1hZ2VzICAqLwotICAvKiAgICAgIHVzZWQgZm9yIGRpc3BsYXkgb24gTENEIGRpc3BsYXlzOyB0aGUgYml0bWFwIGlzIHRocmVlIHRpbWVzICAgICAgKi8KLSAgLyogICAgICB3aWRlciB0aGFuIHRoZSBvcmlnaW5hbCBnbHlwaCBpbWFnZS4gIFNlZSBhbHNvICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX1JFTkRFUl9NT0RFX0xDRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9MQ0RfViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gOC1iaXQgYml0bWFwLCByZXByZXNlbnRpbmcgUkdCIG9yIEJHUiBkZWNpbWF0ZWQgZ2x5cGggaW1hZ2VzICAqLwotICAvKiAgICAgIHVzZWQgZm9yIGRpc3BsYXkgb24gcm90YXRlZCBMQ0QgZGlzcGxheXM7IHRoZSBiaXRtYXAgaXMgdGhyZWUgICAgKi8KLSAgLyogICAgICB0aW1lcyB0YWxsZXIgdGhhbiB0aGUgb3JpZ2luYWwgZ2x5cGggaW1hZ2UuICBTZWUgYWxzbyAgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX1JFTkRFUl9NT0RFX0xDRF9WLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9CR1JBIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gaW1hZ2Ugd2l0aCBmb3VyIDgtYml0IGNoYW5uZWxzIHBlciBwaXhlbCwgcmVwcmVzZW50aW5nIGEgICAgICAqLwotICAvKiAgICAgIGNvbG9yIGltYWdlIChzdWNoIGFzIGVtb3RpY29ucykgd2l0aCBhbHBoYSBjaGFubmVsLiAgRm9yIGVhY2ggICAgKi8KLSAgLyogICAgICBwaXhlbCwgdGhlIGZvcm1hdCBpcyBCR1JBLCB3aGljaCBtZWFucywgdGhlIGJsdWUgY2hhbm5lbCBjb21lcyAgICovCi0gIC8qICAgICAgZmlyc3QgaW4gbWVtb3J5LiAgVGhlIGNvbG9yIGNoYW5uZWxzIGFyZSBwcmUtbXVsdGlwbGllZCBhbmQgaW4gICAqLwotICAvKiAgICAgIHRoZSBzUkdCIGNvbG9yc3BhY2UuICBGb3IgZXhhbXBsZSwgZnVsbCByZWQgYXQgaGFsZi10cmFuc2x1Y2VudCAgKi8KLSAgLyogICAgICBvcGFjaXR5IHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgYDAwLDAwLDgwLDgwJywgbm90IGAwMCwwMCxGRiw4MCcuICovCi0gIC8qICAgICAgU2VlIGFsc28gQEZUX0xPQURfQ09MT1IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9QaXhlbF9Nb2RlXwotICB7Ci0gICAgRlRfUElYRUxfTU9ERV9OT05FID0gMCwKLSAgICBGVF9QSVhFTF9NT0RFX01PTk8sCi0gICAgRlRfUElYRUxfTU9ERV9HUkFZLAotICAgIEZUX1BJWEVMX01PREVfR1JBWTIsCi0gICAgRlRfUElYRUxfTU9ERV9HUkFZNCwKLSAgICBGVF9QSVhFTF9NT0RFX0xDRCwKLSAgICBGVF9QSVhFTF9NT0RFX0xDRF9WLAotICAgIEZUX1BJWEVMX01PREVfQkdSQSwKLQotICAgIEZUX1BJWEVMX01PREVfTUFYICAgICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gRlRfUGl4ZWxfTW9kZTsKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGBGVF9QaXhlbF9Nb2RlJyAqLwotICAvKiB2YWx1ZXMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfcGl4ZWxfbW9kZV9ub25lICAgRlRfUElYRUxfTU9ERV9OT05FCi0jZGVmaW5lIGZ0X3BpeGVsX21vZGVfbW9ubyAgIEZUX1BJWEVMX01PREVfTU9OTwotI2RlZmluZSBmdF9waXhlbF9tb2RlX2dyYXlzICBGVF9QSVhFTF9NT0RFX0dSQVkKLSNkZWZpbmUgZnRfcGl4ZWxfbW9kZV9wYWwyICAgRlRfUElYRUxfTU9ERV9HUkFZMgotI2RlZmluZSBmdF9waXhlbF9tb2RlX3BhbDQgICBGVF9QSVhFTF9NT0RFX0dSQVk0Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgYml0bWFwIG9yIHBpeG1hcCB0byB0aGUgcmFzdGVyLiAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHdlIG5vdyBtYW5hZ2UgcGl4bWFwcyBvZiB2YXJpb3VzIGRlcHRocyB0aHJvdWdoIHRoZSAgICAgICovCi0gIC8qICAgIGBwaXhlbF9tb2RlJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvd3MgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGJpdG1hcCByb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgICAgIDo6IFRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGJpdG1hcCByb3cuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXRjaCAgICAgICAgOjogVGhlIHBpdGNoJ3MgYWJzb2x1dGUgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRha2VuIGJ5IG9uZSBiaXRtYXAgcm93LCBpbmNsdWRpbmcgcGFkZGluZy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBIb3dldmVyLCB0aGUgcGl0Y2ggaXMgcG9zaXRpdmUgd2hlbiB0aGUgYml0bWFwIGhhcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgYSBgZG93bicgZmxvdywgYW5kIG5lZ2F0aXZlIHdoZW4gaXQgaGFzIGFuIGB1cCcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZsb3cuICBJbiBhbGwgY2FzZXMsIHRoZSBwaXRjaCBpcyBhbiBvZmZzZXQgdG8gYWRkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0byBhIGJpdG1hcCBwb2ludGVyIGluIG9yZGVyIHRvIGdvIGRvd24gb25lIHJvdy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBgcGFkZGluZycgbWVhbnMgdGhlIGFsaWdubWVudCBvZiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBiaXRtYXAgdG8gYSBieXRlIGJvcmRlciwgYW5kIEZyZWVUeXBlIGZ1bmN0aW9ucyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgbm9ybWFsbHkgYWxpZ24gdG8gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGludGVnZXIgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBCL1cgcmFzdGVyaXplciwgYHBpdGNoJyBpcyBhbHdheXMgYW4gZXZlbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgVG8gY2hhbmdlIHRoZSBwaXRjaCBvZiBhIGJpdG1hcCAoc2F5LCB0byBtYWtlIGl0IGEgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIDQpLCB1c2UgQEZUX0JpdG1hcF9Db252ZXJ0LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgbWlnaHQgdXNlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgcmVuZGVyIHRvIHRoZSBhcHBsaWNhdGlvbidzIHN1cmZhY2U7IHNlZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGBleGFtcGxlMi5jcHAnIGluIHRoZSB0dXRvcmlhbCBmb3IgYSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBkZW1vbnN0cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgYml0bWFwIGJ1ZmZlci4gIFRoaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgYWxpZ25lZCBvbiAzMi1iaXQgYm91bmRhcmllcyBpbiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgbW9zdCBjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9ncmF5cyAgICA6OiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aXRoICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX1BJWEVMX01PREVfR1JBWTsgaXQgZ2l2ZXMgdGhlIG51bWJlciBvZiBncmF5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGxldmVscyB1c2VkIGluIHRoZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXhlbF9tb2RlICAgOjogVGhlIHBpeGVsIG1vZGUsIGkuZS4sIGhvdyBwaXhlbCBiaXRzIGFyZSBzdG9yZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIFNlZSBARlRfUGl4ZWxfTW9kZSBmb3IgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYWxldHRlX21vZGUgOjogVGhpcyBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgcGFsZXR0ZWQgcGl4ZWwgbW9kZXM7ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGl0IGluZGljYXRlcyBob3cgdGhlIHBhbGV0dGUgaXMgc3RvcmVkLiAgTm90ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB1c2VkIGN1cnJlbnRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFsZXR0ZSAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgYml0bWFwIHBhbGV0dGU7IHRoaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgcGFsZXR0ZWQgcGl4ZWwgbW9kZXMuICBOb3QgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdXNlZCBjdXJyZW50bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBfCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgICAgcm93czsKLSAgICB1bnNpZ25lZCBpbnQgICAgd2lkdGg7Ci0gICAgaW50ICAgICAgICAgICAgIHBpdGNoOwotICAgIHVuc2lnbmVkIGNoYXIqICBidWZmZXI7Ci0gICAgdW5zaWduZWQgc2hvcnQgIG51bV9ncmF5czsKLSAgICB1bnNpZ25lZCBjaGFyICAgcGl4ZWxfbW9kZTsKLSAgICB1bnNpZ25lZCBjaGFyICAgcGFsZXR0ZV9tb2RlOwotICAgIHZvaWQqICAgICAgICAgICBwYWxldHRlOwotCi0gIH0gRlRfQml0bWFwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZV9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgYW4gb3V0bGluZSB0byB0aGUgc2Nhbi1saW5lICAgICAqLwotICAvKiAgICBjb252ZXJ0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuX2NvbnRvdXJzIDo6IFRoZSBudW1iZXIgb2YgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5fcG9pbnRzICAgOjogVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRzICAgICA6OiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYG5fcG9pbnRzJyBARlRfVmVjdG9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZWxlbWVudHMsIGdpdmluZyB0aGUgb3V0bGluZSdzIHBvaW50IGNvb3JkaW5hdGVzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFncyAgICAgICA6OiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYG5fcG9pbnRzJyBjaGFycywgZ2l2aW5nICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZWFjaCBvdXRsaW5lIHBvaW50J3MgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJZiBiaXR+MCBpcyB1bnNldCwgdGhlIHBvaW50IGlzIGBvZmYnIHRoZSBjdXJ2ZSwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaS5lLiwgYSBCw6l6aWVyIGNvbnRyb2wgcG9pbnQsIHdoaWxlIGl0IGlzIGBvbicgaWYgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEJpdH4xIGlzIG1lYW5pbmdmdWwgZm9yIGBvZmYnIHBvaW50cyBvbmx5LiAgSWYgc2V0LCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpdCBpbmRpY2F0ZXMgYSB0aGlyZC1vcmRlciBCw6l6aWVyIGFyYyBjb250cm9sIHBvaW50OyAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFuZCBhIHNlY29uZC1vcmRlciBjb250cm9sIHBvaW50IGlmIHVuc2V0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgSWYgYml0fjIgaXMgc2V0LCBiaXRzIDUtNyBjb250YWluIHRoZSBkcm9wLW91dCBtb2RlICAqLwotICAvKiAgICAgICAgICAgICAgICAgIChhcyBkZWZpbmVkIGluIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uOyB0aGUgdmFsdWUgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgdG8gdGhlIFNDQU5NT0RFICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBCaXRzIDMgYW5kfjQgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCBwdXJwb3Nlcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250b3VycyAgIDo6IEFuIGFycmF5IG9mIGBuX2NvbnRvdXJzJyBzaG9ydHMsIGdpdmluZyB0aGUgZW5kICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBwb2ludCBvZiBlYWNoIGNvbnRvdXIgd2l0aGluIHRoZSBvdXRsaW5lLiAgRm9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZXhhbXBsZSwgdGhlIGZpcnN0IGNvbnRvdXIgaXMgZGVmaW5lZCBieSB0aGUgcG9pbnRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGAwJyB0byBgY29udG91cnNbMF0nLCB0aGUgc2Vjb25kIG9uZSBpcyBkZWZpbmVkIGJ5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB0aGUgcG9pbnRzIGBjb250b3Vyc1swXSsxJyB0byBgY29udG91cnNbMV0nLCBldGMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGFncyAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyB1c2VkIHRvIGNoYXJhY3Rlcml6ZSB0aGUgb3V0bGluZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBhbmQgZ2l2ZSBoaW50cyB0byB0aGUgc2Nhbi1jb252ZXJ0ZXIgYW5kIGhpbnRlciBvbiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaG93IHRvIGNvbnZlcnQvZ3JpZC1maXQgaXQuICBTZWUgQEZUX09VVExJTkVfWFhYLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBCL1cgcmFzdGVyaXplciBvbmx5IGNoZWNrcyBiaXR+MiBpbiB0aGUgYHRhZ3MnIGFycmF5IGZvciB0aGUgICAqLwotICAvKiAgICBmaXJzdCBwb2ludCBvZiBlYWNoIGNvbnRvdXIuICBUaGUgZHJvcC1vdXQgbW9kZSBhcyBnaXZlbiB3aXRoICAgICAgKi8KLSAgLyogICAgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTLCBARlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUywgYW5kICAgICAgICovCi0gIC8qICAgIEBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgaW4gYGZsYWdzJyBpcyB0aGVuIG92ZXJyaWRkZW4uICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX091dGxpbmVfCi0gIHsKLSAgICBzaG9ydCAgICAgICBuX2NvbnRvdXJzOyAgICAgIC8qIG51bWJlciBvZiBjb250b3VycyBpbiBnbHlwaCAgICAgICAgKi8KLSAgICBzaG9ydCAgICAgICBuX3BvaW50czsgICAgICAgIC8qIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGdseXBoICAgICAgKi8KLQotICAgIEZUX1ZlY3RvciogIHBvaW50czsgICAgICAgICAgLyogdGhlIG91dGxpbmUncyBwb2ludHMgICAgICAgICAgICAgICAqLwotICAgIGNoYXIqICAgICAgIHRhZ3M7ICAgICAgICAgICAgLyogdGhlIHBvaW50cyBmbGFncyAgICAgICAgICAgICAgICAgICAqLwotICAgIHNob3J0KiAgICAgIGNvbnRvdXJzOyAgICAgICAgLyogdGhlIGNvbnRvdXIgZW5kIHBvaW50cyAgICAgICAgICAgICAqLwotCi0gICAgaW50ICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAvKiBvdXRsaW5lIG1hc2tzICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgfSBGVF9PdXRsaW5lOwotCi0gIC8qICovCi0KLSAgLyogRm9sbG93aW5nIGxpbWl0cyBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCAqLwotICAvKiBGVF9PdXRsaW5lLntuX2NvbnRvdXJzLG5fcG9pbnRzfSAgICAgICAgICovCi0jZGVmaW5lIEZUX09VVExJTkVfQ09OVE9VUlNfTUFYICBTSFJUX01BWAotI2RlZmluZSBGVF9PVVRMSU5FX1BPSU5UU19NQVggICAgU0hSVF9NQVgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZSBmb3IgdGhlIGZsYWdzIGluIGFuIG91dGxpbmUncyAgICAqLwotICAvKiAgICBgZmxhZ3MnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBWYWx1ZX4wIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX09XTkVSIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJZiBzZXQsIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgb3V0bGluZSdzIGZpZWxkIGFycmF5cyAgICAgICovCi0gIC8qICAgICAgKGkuZS4sIGBwb2ludHMnLCBgZmxhZ3MnLCBhbmQgYGNvbnRvdXJzJykgYXJlIGBvd25lZCcgYnkgdGhlICAgICAqLwotICAvKiAgICAgIG91dGxpbmUgb2JqZWN0LCBhbmQgc2hvdWxkIHRodXMgYmUgZnJlZWQgd2hlbiBpdCBpcyBkZXN0cm95ZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfRVZFTl9PRERfRklMTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEJ5IGRlZmF1bHQsIG91dGxpbmVzIGFyZSBmaWxsZWQgdXNpbmcgdGhlIG5vbi16ZXJvIHdpbmRpbmcgcnVsZS4gKi8KLSAgLyogICAgICBJZiBzZXQgdG8gMSwgdGhlIG91dGxpbmUgd2lsbCBiZSBmaWxsZWQgdXNpbmcgdGhlIGV2ZW4tb2RkIGZpbGwgICovCi0gIC8qICAgICAgcnVsZSAob25seSB3b3JrcyB3aXRoIHRoZSBzbW9vdGggcmFzdGVyaXplcikuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQnkgZGVmYXVsdCwgb3V0c2lkZSBjb250b3VycyBvZiBhbiBvdXRsaW5lIGFyZSBvcmllbnRlZCBpbiAgICAgICAqLwotICAvKiAgICAgIGNsb2NrLXdpc2UgZGlyZWN0aW9uLCBhcyBkZWZpbmVkIGluIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgLyogICAgICBUaGlzIGZsYWcgaXMgc2V0IGlmIHRoZSBvdXRsaW5lIHVzZXMgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiAgICAgICovCi0gIC8qICAgICAgKHR5cGljYWxseSBmb3IgVHlwZX4xIGZvbnRzKS4gIFRoaXMgZmxhZyBpcyBpZ25vcmVkIGJ5IHRoZSBzY2FuICAqLwotICAvKiAgICAgIGNvbnZlcnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEJ5IGRlZmF1bHQsIHRoZSBzY2FuIGNvbnZlcnRlciB3aWxsIHRyeSB0byBkZXRlY3QgZHJvcC1vdXRzIGluICAgKi8KLSAgLyogICAgICBhbiBvdXRsaW5lIGFuZCBjb3JyZWN0IHRoZSBnbHlwaCBiaXRtYXAgdG8gZW5zdXJlIGNvbnNpc3RlbnQgICAgICovCi0gIC8qICAgICAgc2hhcGUgY29udGludWl0eS4gIElmIHNldCwgdGhpcyBmbGFnIGhpbnRzIHRoZSBzY2FuLWxpbmUgICAgICAgICAqLwotICAvKiAgICAgIGNvbnZlcnRlciB0byBpZ25vcmUgc3VjaCBjYXNlcy4gIFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNlbGVjdCBzbWFydCBkcm9wb3V0IGNvbnRyb2wuICBJZiB1bnNldCwgdXNlIHNpbXBsZSBkcm9wb3V0ICAgICAgKi8KLSAgLyogICAgICBjb250cm9sLiAgSWdub3JlZCBpZiBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgaXMgc2V0LiAgU2VlICAgICovCi0gIC8qICAgICAgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9JTkNMVURFX1NUVUJTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgc2V0LCB0dXJuIHBpeGVscyBvbiBmb3IgYHN0dWJzJywgb3RoZXJ3aXNlIGV4Y2x1ZGUgdGhlbS4gICAgICAqLwotICAvKiAgICAgIElnbm9yZWQgaWYgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTIGlzIHNldC4gIFNlZSBiZWxvdyBmb3IgICAgKi8KLSAgLyogICAgICBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgc2hvdWxkIHRyeSB0byAgICovCi0gIC8qICAgICAgY29udmVydCB0aGlzIG91dGxpbmUgdG8gYml0bWFwcyB3aXRoIHRoZSBoaWdoZXN0IHBvc3NpYmxlICAgICAgICAqLwotICAvKiAgICAgIHF1YWxpdHkuICBJdCBpcyB0eXBpY2FsbHkgc2V0IGZvciBzbWFsbCBjaGFyYWN0ZXIgc2l6ZXMuICBOb3RlICAgKi8KLSAgLyogICAgICB0aGF0IHRoaXMgaXMgb25seSBhIGhpbnQgdGhhdCBtaWdodCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSAgICovCi0gIC8qICAgICAgZ2l2ZW4gc2Nhbi1jb252ZXJ0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9TSU5HTEVfUEFTUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBmbGFnIGlzIHNldCB0byBmb3JjZSBhIGdpdmVuIHNjYW4tY29udmVydGVyIHRvIG9ubHkgdXNlIGEgICAqLwotICAvKiAgICAgIHNpbmdsZSBwYXNzIG92ZXIgdGhlIG91dGxpbmUgdG8gcmVuZGVyIGEgYml0bWFwIGdseXBoIGltYWdlLiAgICAgKi8KLSAgLyogICAgICBOb3JtYWxseSwgaXQgaXMgc2V0IGZvciB2ZXJ5IGxhcmdlIGNoYXJhY3RlciBzaXplcy4gIEl0IGlzIG9ubHkgICovCi0gIC8qICAgICAgYSBoaW50IHRoYXQgbWlnaHQgYmUgY29tcGxldGVseSBpZ25vcmVkIGJ5IGEgZ2l2ZW4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHNjYW4tY29udmVydGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmxhZ3MgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTLCBARlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUywgKi8KLSAgLyogICAgYW5kIEBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgYXJlIGlnbm9yZWQgYnkgdGhlIHNtb290aCAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcml6ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlcmUgZXhpc3RzIGEgc2Vjb25kIG1lY2hhbmlzbSB0byBwYXNzIHRoZSBkcm9wLW91dCBtb2RlIHRvIHRoZSAgICovCi0gIC8qICAgIEIvVyByYXN0ZXJpemVyOyBzZWUgdGhlIGB0YWdzJyBmaWVsZCBpbiBARlRfT3V0bGluZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYFNDQU5UWVBFJyBpbnN0cnVjdGlvbiBpbiAgICovCi0gIC8qICAgIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uIChpbiBmaWxlIGB0dGluc3QxLmRvYycpIGhvdyBzaW1wbGUgICAgICAqLwotICAvKiAgICBkcm9wLW91dHMsIHNtYXJ0IGRyb3Atb3V0cywgYW5kIHN0dWJzIGFyZSBkZWZpbmVkLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX09VVExJTkVfTk9ORSAgICAgICAgICAgICAweDAKLSNkZWZpbmUgRlRfT1VUTElORV9PV05FUiAgICAgICAgICAgIDB4MQotI2RlZmluZSBGVF9PVVRMSU5FX0VWRU5fT0REX0ZJTEwgICAgMHgyCi0jZGVmaW5lIEZUX09VVExJTkVfUkVWRVJTRV9GSUxMICAgICAweDQKLSNkZWZpbmUgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgIDB4OAotI2RlZmluZSBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTICAgMHgxMAotI2RlZmluZSBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgICAgMHgyMAotCi0jZGVmaW5lIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gICAweDEwMAotI2RlZmluZSBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTICAgICAgMHgyMDAKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9PVVRMSU5FX1hYWCcgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X291dGxpbmVfbm9uZSAgICAgICAgICAgICBGVF9PVVRMSU5FX05PTkUKLSNkZWZpbmUgZnRfb3V0bGluZV9vd25lciAgICAgICAgICAgIEZUX09VVExJTkVfT1dORVIKLSNkZWZpbmUgZnRfb3V0bGluZV9ldmVuX29kZF9maWxsICAgIEZUX09VVExJTkVfRVZFTl9PRERfRklMTAotI2RlZmluZSBmdF9vdXRsaW5lX3JldmVyc2VfZmlsbCAgICAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwKLSNkZWZpbmUgZnRfb3V0bGluZV9pZ25vcmVfZHJvcG91dHMgIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTCi0jZGVmaW5lIGZ0X291dGxpbmVfaGlnaF9wcmVjaXNpb24gICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OCi0jZGVmaW5lIGZ0X291dGxpbmVfc2luZ2xlX3Bhc3MgICAgICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTCi0KLSAgLyogKi8KLQotI2RlZmluZSBGVF9DVVJWRV9UQUcoIGZsYWcgKSAgKCBmbGFnICYgMyApCi0KLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX09OICAgICAgICAgICAgMQotI2RlZmluZSBGVF9DVVJWRV9UQUdfQ09OSUMgICAgICAgICAwCi0jZGVmaW5lIEZUX0NVUlZFX1RBR19DVUJJQyAgICAgICAgIDIKLQotI2RlZmluZSBGVF9DVVJWRV9UQUdfSEFTX1NDQU5NT0RFICA0Ci0KLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX1RPVUNIX1ggICAgICAgOCAgLyogcmVzZXJ2ZWQgZm9yIHRoZSBUcnVlVHlwZSBoaW50ZXIgKi8KLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgICAgICAxNiAgLyogcmVzZXJ2ZWQgZm9yIHRoZSBUcnVlVHlwZSBoaW50ZXIgKi8KLQotI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfQk9USCAgICAoIEZUX0NVUlZFX1RBR19UT1VDSF9YIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkKLQotI2RlZmluZSBGVF9DdXJ2ZV9UYWdfT24gICAgICAgRlRfQ1VSVkVfVEFHX09OCi0jZGVmaW5lIEZUX0N1cnZlX1RhZ19Db25pYyAgICBGVF9DVVJWRV9UQUdfQ09OSUMKLSNkZWZpbmUgRlRfQ3VydmVfVGFnX0N1YmljICAgIEZUX0NVUlZFX1RBR19DVUJJQwotI2RlZmluZSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWCAgRlRfQ1VSVkVfVEFHX1RPVUNIX1gKLSNkZWZpbmUgRlRfQ3VydmVfVGFnX1RvdWNoX1kgIEZUX0NVUlZFX1RBR19UT1VDSF9ZCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX01vdmVUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgbW92ZSAgKi8KLSAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcvZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGBtb3ZlIHRvJyBpcyBlbWl0dGVkIHRvIHN0YXJ0IGEgbmV3IGNvbnRvdXIgaW4gYW4gb3V0bGluZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHBvaW50IG9mIHRoZSBgbW92ZSB0bycuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyIG9mIHRoZSAqLwotICAvKiAgICAgICAgICAgIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfT3V0bGluZV9Nb3ZlVG9GdW5jKSggY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOwotCi0jZGVmaW5lIEZUX091dGxpbmVfTW92ZVRvX0Z1bmMgIEZUX091dGxpbmVfTW92ZVRvRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9MaW5lVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgYGxpbmUgICovCi0gIC8qICAgIHRvJyBmdW5jdGlvbiBkdXJpbmcgb3V0bGluZSB3YWxraW5nL2RlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBgbGluZSB0bycgaXMgZW1pdHRlZCB0byBpbmRpY2F0ZSBhIHNlZ21lbnQgaW4gdGhlIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBwb2ludCBvZiB0aGUgYGxpbmUgdG8nLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiB0aGUgKi8KLSAgLyogICAgICAgICAgICBkZWNvbXBvc2l0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX091dGxpbmVfTGluZVRvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHVzZXIgKTsKLQotI2RlZmluZSBGVF9PdXRsaW5lX0xpbmVUb19GdW5jICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBjb25pYyAqLwotICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZyBvciBkZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYGNvbmljIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgc2Vjb25kLW9yZGVyIELDqXppZXIgYXJjIGluICAgKi8KLSAgLyogICAgdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbCA6OiBBbiBpbnRlcm1lZGlhdGUgY29udHJvbCBwb2ludCBiZXR3ZWVuIHRoZSBsYXN0IHBvc2l0aW9uICovCi0gIC8qICAgICAgICAgICAgICAgYW5kIHRoZSBuZXcgdGFyZ2V0IGluIGB0bycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBlbmQgcG9pbnQgb2YgdGhlIGNvbmljIGFyYy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiAgKi8KLSAgLyogICAgICAgICAgICAgICB0aGUgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX091dGxpbmVfQ29uaWNUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOwotCi0jZGVmaW5lIEZUX091dGxpbmVfQ29uaWNUb19GdW5jICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0N1YmljVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgY3ViaWMgKi8KLSAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcgb3IgZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGBjdWJpYyB0bycgaXMgZW1pdHRlZCB0byBpbmRpY2F0ZSBhIHRoaXJkLW9yZGVyIELDqXppZXIgYXJjLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbDEgOjogQSBwb2ludGVyIHRvIHRoZSBmaXJzdCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbDIgOjogQSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgQsOpemllciBjb250cm9sIHBvaW50LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZW5kIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgdGhlIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX091dGxpbmVfQ3ViaWNUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7Ci0KLSNkZWZpbmUgRlRfT3V0bGluZV9DdWJpY1RvX0Z1bmMgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRnVuY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIGhvbGQgdmFyaW91cyBmdW5jdGlvbiBwb2ludGVycyB1c2VkIGR1cmluZyBvdXRsaW5lICAqLwotICAvKiAgICBkZWNvbXBvc2l0aW9uIGluIG9yZGVyIHRvIGVtaXQgc2VnbWVudHMsIGNvbmljLCBhbmQgY3ViaWMgQsOpemllcnMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW92ZV90byAgOjogVGhlIGBtb3ZlIHRvJyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaW5lX3RvICA6OiBUaGUgc2VnbWVudCBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbmljX3RvIDo6IFRoZSBzZWNvbmQtb3JkZXIgQsOpemllciBhcmMgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1YmljX3RvIDo6IFRoZSB0aGlyZC1vcmRlciBCw6l6aWVyIGFyYyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNoaWZ0ICAgIDo6IFRoZSBzaGlmdCB0aGF0IGlzIGFwcGxpZWQgdG8gY29vcmRpbmF0ZXMgYmVmb3JlIHRoZXkgICAqLwotICAvKiAgICAgICAgICAgICAgICBhcmUgc2VudCB0byB0aGUgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhICAgIDo6IFRoZSBkZWx0YSB0aGF0IGlzIGFwcGxpZWQgdG8gY29vcmRpbmF0ZXMgYmVmb3JlIHRoZXkgICAqLwotICAvKiAgICAgICAgICAgICAgICBhcmUgc2VudCB0byB0aGUgZW1pdHRlciwgYnV0IGFmdGVyIHRoZSBzaGlmdC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgc2VudCB0byB0aGUgZW1pdHRlcnMgYXJlIHRoZSB0cmFuc2Zvcm1lZCAgICAgKi8KLSAgLyogICAgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZXMgKHRoaXMgaXMgaW1wb3J0YW50IGZvciBoaWdoICAgICovCi0gIC8qICAgIGFjY3VyYWN5IGR1cmluZyBzY2FuLWNvbnZlcnNpb24pLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGlzIHNpbXBsZTogICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeCcgPSAoeCA8PCBzaGlmdCkgLSBkZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHknID0gKHkgPDwgc2hpZnQpIC0gZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXQgdGhlIHZhbHVlcyBvZiBgc2hpZnQnIGFuZCBgZGVsdGEnIHRvfjAgdG8gZ2V0IHRoZSBvcmlnaW5hbCAgICAgKi8KLSAgLyogICAgcG9pbnQgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZV9GdW5jc18KLSAgewotICAgIEZUX091dGxpbmVfTW92ZVRvRnVuYyAgIG1vdmVfdG87Ci0gICAgRlRfT3V0bGluZV9MaW5lVG9GdW5jICAgbGluZV90bzsKLSAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jICBjb25pY190bzsKLSAgICBGVF9PdXRsaW5lX0N1YmljVG9GdW5jICBjdWJpY190bzsKLQotICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OwotICAgIEZUX1BvcyAgICAgICAgICAgICAgICAgIGRlbHRhOwotCi0gIH0gRlRfT3V0bGluZV9GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JTUFHRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGNvbnZlcnRzIGZvdXItbGV0dGVyIHRhZ3MgdG8gYW4gdW5zaWduZWQgbG9uZyB0eXBlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSBtYW55IDE2LWJpdCBjb21waWxlcnMgZG9uJ3QgbGlrZSAzMi1iaXQgZW51bWVyYXRpb25zLCB5b3UgICAgKi8KLSAgLyogICAgc2hvdWxkIHJlZGVmaW5lIHRoaXMgbWFjcm8gaW4gY2FzZSBvZiBwcm9ibGVtcyB0byBzb21ldGhpbmcgbGlrZSAgICovCi0gIC8qICAgIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2RlZmluZSBGVF9JTUFHRV9UQUcoIHZhbHVlLCBfeDEsIF94MiwgX3gzLCBfeDQgKSAgdmFsdWUgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvIGdldCBhIHNpbXBsZSBlbnVtZXJhdGlvbiB3aXRob3V0IGFzc2lnbmluZyBzcGVjaWFsIG51bWJlcnMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfSU1BR0VfVEFHCi0jZGVmaW5lIEZUX0lNQUdFX1RBRyggdmFsdWUsIF94MSwgX3gyLCBfeDMsIF94NCApICBcCi0gICAgICAgICAgdmFsdWUgPSAoICggKHVuc2lnbmVkIGxvbmcpX3gxIDw8IDI0ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpX3gyIDw8IDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpX3gzIDw8IDggICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpX3g0ICAgICAgICAgKQotI2VuZGlmIC8qIEZUX0lNQUdFX1RBRyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgYSBnaXZlbiBnbHlwaCAgICovCi0gIC8qICAgIGltYWdlLiAgTm90ZSB0aGF0IHRoaXMgdmVyc2lvbiBvZiBGcmVlVHlwZSBvbmx5IHN1cHBvcnRzIHR3byBpbWFnZSAqLwotICAvKiAgICBmb3JtYXRzLCBldmVuIHRob3VnaCBmdXR1cmUgZm9udCBkcml2ZXJzIHdpbGwgYmUgYWJsZSB0byByZWdpc3RlciAgKi8KLSAgLyogICAgdGhlaXIgb3duIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfRk9STUFUX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHZhbHVlfjAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoIGltYWdlIGlzIGEgY29tcG9zaXRlIG9mIHNldmVyYWwgb3RoZXIgaW1hZ2VzLiAgVGhpcyAgICAqLwotICAvKiAgICAgIGZvcm1hdCBpcyBfb25seV8gdXNlZCB3aXRoIEBGVF9MT0FEX05PX1JFQ1VSU0UsIGFuZCBpcyB1c2VkIHRvICAgKi8KLSAgLyogICAgICByZXBvcnQgY29tcG91bmQgZ2x5cGhzIChsaWtlIGFjY2VudGVkIGNoYXJhY3RlcnMpLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfQklUTUFQIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSBiaXRtYXAsIGFuZCBjYW4gYmUgZGVzY3JpYmVkIGFzIGFuICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0JpdG1hcC4gIFlvdSBnZW5lcmFsbHkgbmVlZCB0byBhY2Nlc3MgdGhlIGBiaXRtYXAnIGZpZWxkIG9mICAqLwotICAvKiAgICAgIHRoZSBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSB0byByZWFkIGl0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIHZlY3RvcmlhbCBvdXRsaW5lIG1hZGUgb2YgbGluZSBzZWdtZW50cyAgICAgKi8KLSAgLyogICAgICBhbmQgQsOpemllciBhcmNzOyBpdCBjYW4gYmUgZGVzY3JpYmVkIGFzIGFuIEBGVF9PdXRsaW5lOyB5b3UgICAgICAqLwotICAvKiAgICAgIGdlbmVyYWxseSB3YW50IHRvIGFjY2VzcyB0aGUgYG91dGxpbmUnIGZpZWxkIG9mIHRoZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSB0byByZWFkIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfUExPVFRFUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSB2ZWN0b3JpYWwgcGF0aCB3aXRoIG5vIGluc2lkZSBhbmQgb3V0c2lkZSAgICovCi0gIC8qICAgICAgY29udG91cnMuICBTb21lIFR5cGV+MSBmb250cywgbGlrZSB0aG9zZSBpbiB0aGUgSGVyc2hleSBmYW1pbHksICAqLwotICAvKiAgICAgIGNvbnRhaW4gZ2x5cGhzIGluIHRoaXMgZm9ybWF0LiAgVGhlc2UgYXJlIGRlc2NyaWJlZCBhcyAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfT3V0bGluZSwgYnV0IEZyZWVUeXBlIGlzbid0IGN1cnJlbnRseSBjYXBhYmxlIG9mIHJlbmRlcmluZyAgICovCi0gIC8qICAgICAgdGhlbSBjb3JyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9HbHlwaF9Gb3JtYXRfCi0gIHsKLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9OT05FLCAwLCAwLCAwLCAwICksCi0KLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUsICdjJywgJ28nLCAnbScsICdwJyApLAotICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX0JJVE1BUCwgICAgJ2InLCAnaScsICd0JywgJ3MnICksCi0gICAgRlRfSU1BR0VfVEFHKCBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwgICAnbycsICd1JywgJ3QnLCAnbCcgKSwKLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9QTE9UVEVSLCAgICdwJywgJ2wnLCAnbycsICd0JyApCi0KLSAgfSBGVF9HbHlwaF9Gb3JtYXQ7Ci0KLQotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyAqLwotICAvKiBgRlRfR2x5cGhfRm9ybWF0JyB2YWx1ZXMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfbm9uZSAgICAgICBGVF9HTFlQSF9GT1JNQVRfTk9ORQotI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfY29tcG9zaXRlICBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFCi0jZGVmaW5lIGZ0X2dseXBoX2Zvcm1hdF9iaXRtYXAgICAgIEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAKLSNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmUgICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUKLSNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X3Bsb3R0ZXIgICAgRlRfR0xZUEhfRk9STUFUX1BMT1RURVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICBSIEEgUyBUIEUgUiAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgcmFzdGVyIGlzIGEgc2NhbiBjb252ZXJ0ZXIsIGluIGNoYXJnZSBvZiByZW5kZXJpbmcgYW4gb3V0bGluZSBpbnRvICAqLwotICAvKiBhIGJpdG1hcC4gIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgcHVibGljIEFQSSBmb3IgcmFzdGVycy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBpbiBGcmVlVHlwZSAyLCBhbGwgcmFzdGVycyBhcmUgbm93IGVuY2Fwc3VsYXRlZCB3aXRoaW4gICAgICAqLwotICAvKiBzcGVjaWZpYyBtb2R1bGVzIGNhbGxlZCBgcmVuZGVyZXJzJy4gIFNlZSBgZnRyZW5kZXIuaCcgZm9yIG1vcmUgICAgICAgKi8KLSAgLyogZGV0YWlscyBvbiByZW5kZXJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNjYW5saW5lIENvbnZlcnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyB2ZWN0b3JpYWwgb3V0bGluZXMgYXJlIGNvbnZlcnRlZCBpbnRvIGJpdG1hcHMgYW5kIHBpeG1hcHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0ZWNobmljYWwgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TcGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfTmV3RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0RvbmVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1JlbmRlckZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIChwb2ludGVyKSB0byBhIHJhc3RlciBvYmplY3QuICBFYWNoIG9iamVjdCBjYW4gYmUgKi8KLSAgLyogICAgdXNlZCBpbmRlcGVuZGVudGx5IHRvIGNvbnZlcnQgYW4gb3V0bGluZSBpbnRvIGEgYml0bWFwIG9yIHBpeG1hcC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9SYXN0ZXJSZWNfKiAgRlRfUmFzdGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3BhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIHNpbmdsZSBzcGFuIG9mIGdyYXkgcGl4ZWxzIHdoZW4gICAgICAgICovCi0gIC8qICAgIHJlbmRlcmluZyBhbiBhbnRpLWFsaWFzZWQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggICAgICAgIDo6IFRoZSBzcGFuJ3MgaG9yaXpvbnRhbCBzdGFydCBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuICAgICAgOjogVGhlIHNwYW4ncyBsZW5ndGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3ZlcmFnZSA6OiBUaGUgc3BhbiBjb2xvci9jb3ZlcmFnZSwgcmFuZ2luZyBmcm9tIDAgKGJhY2tncm91bmQpICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdG8gMjU1IChmb3JlZ3JvdW5kKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgc3BhbiBkcmF3aW5nIGNhbGxiYWNrIHR5cGUgbmFtZWQgICAgICovCi0gIC8qICAgIEBGVF9TcGFuRnVuYyB0aGF0IHRha2VzIHRoZSB5fmNvb3JkaW5hdGUgb2YgdGhlIHNwYW4gYXMgYSAgICAgICAgICAqLwotICAvKiAgICBwYXJhbWV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjb3ZlcmFnZSB2YWx1ZSBpcyBhbHdheXMgYmV0d2VlbiAwIGFuZCAyNTUuICBJZiB5b3Ugd2FudCBsZXNzICAqLwotICAvKiAgICBncmF5IHZhbHVlcywgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGhhcyB0byByZWR1Y2UgdGhlbS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TcGFuXwotICB7Ci0gICAgc2hvcnQgICAgICAgICAgIHg7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGxlbjsKLSAgICB1bnNpZ25lZCBjaGFyICAgY292ZXJhZ2U7Ci0KLSAgfSBGVF9TcGFuOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIGFzIGEgY2FsbC1iYWNrIGJ5IHRoZSBhbnRpLWFsaWFzZWQgcmVuZGVyZXIgaW4gICAgICovCi0gIC8qICAgIG9yZGVyIHRvIGxldCBjbGllbnQgYXBwbGljYXRpb25zIGRyYXcgdGhlbXNlbHZlcyB0aGUgZ3JheSBwaXhlbCAgICAqLwotICAvKiAgICBzcGFucyBvbiBlYWNoIHNjYW4gbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5ICAgICA6OiBUaGUgc2NhbmxpbmUncyB5fmNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50IDo6IFRoZSBudW1iZXIgb2Ygc3BhbnMgdG8gZHJhdyBvbiB0aGlzIHNjYW5saW5lLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BhbnMgOjogQSB0YWJsZSBvZiBgY291bnQnIHNwYW5zIHRvIGRyYXcgb24gdGhlIHNjYW5saW5lLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICA6OiBVc2VyLXN1cHBsaWVkIGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNhbGxiYWNrIGFsbG93cyBjbGllbnQgYXBwbGljYXRpb25zIHRvIGRpcmVjdGx5IHJlbmRlciB0aGUgICAgKi8KLSAgLyogICAgZ3JheSBzcGFucyBvZiB0aGUgYW50aS1hbGlhc2VkIGJpdG1hcCB0byBhbnkga2luZCBvZiBzdXJmYWNlcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFudGktYWxpYXNlZCBvdXRsaW5lcyBkaXJlY3RseSB0byBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gYmFja2dyb3VuZCBiaXRtYXAsIGFuZCBldmVuIHBlcmZvcm0gdHJhbnNsdWNlbmN5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9TcGFuRnVuYykoIGludCAgICAgICAgICAgICB5LAotICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3BhbiogIHNwYW5zLAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgIHVzZXIgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfU3Bhbl9GdW5jICBGVF9TcGFuRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0JpdFRlc3RfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVwcmVjYXRlZCwgdW5pbXBsZW1lbnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMpKCBpbnQgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfQml0U2V0X0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXByZWNhdGVkLCB1bmltcGxlbWVudGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1Jhc3Rlcl9CaXRTZXRfRnVuYykoIGludCAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0IGZsYWcgY29uc3RhbnRzIGFzIHVzZWQgaW4gdGhlIGBmbGFncycgZmllbGQgb2YgYSAgICAgKi8KLSAgLyogICAgQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVCA6OiBUaGlzIHZhbHVlIGlzIDAuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19BQSAgICAgIDo6IFRoaXMgZmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhhdCBhbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnRpLWFsaWFzZWQgZ2x5cGggaW1hZ2Ugc2hvdWxkIGJlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm9jaHJvbWUgKDEtYml0KS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCAgOjogVGhpcyBmbGFnIGlzIHNldCB0byBpbmRpY2F0ZSBkaXJlY3QgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZy4gIEluIHRoaXMgbW9kZSwgY2xpZW50ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgbXVzdCBwcm92aWRlIHRoZWlyIG93biBzcGFuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suICBUaGlzIGxldHMgdGhlbSBkaXJlY3RseSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcgb3IgY29tcG9zZSBvdmVyIGFuIGV4aXN0aW5nIGJpdG1hcC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGUgdGFyZ2V0ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4bWFwJ3MgYnVmZmVyIF9tdXN0XyBiZSB6ZXJvZWQgYmVmb3JlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0IHJlbmRlcmluZyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFudGktYWxpYXNlZCBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9GTEFHX0NMSVAgICAgOjogVGhpcyBmbGFnIGlzIG9ubHkgdXNlZCBpbiBkaXJlY3QgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZyBtb2RlLiAgSWYgc2V0LCB0aGUgb3V0cHV0IHdpbGwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjbGlwcGVkIHRvIGEgYm94IHNwZWNpZmllZCBpbiB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNsaXBfYm94JyBmaWVsZCBvZiB0aGUgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoZSBnbHlwaCBiaXRtYXAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNsaXBwZWQgdG8gdGhlIHRhcmdldCBwaXhtYXAsIGV4Y2VwdCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBkaXJlY3QgcmVuZGVyaW5nIG1vZGUgd2hlcmUgYWxsIHNwYW5zICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGdlbmVyYXRlZCBpZiBubyBjbGlwcGluZyBib3ggaXMgc2V0LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVCAgMHgwCi0jZGVmaW5lIEZUX1JBU1RFUl9GTEFHX0FBICAgICAgIDB4MQotI2RlZmluZSBGVF9SQVNURVJfRkxBR19ESVJFQ1QgICAweDIKLSNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfQ0xJUCAgICAgMHg0Ci0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX1JBU1RFUl9GTEFHX1hYWCcgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfZGVmYXVsdCAgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVAotI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19hYSAgICAgICBGVF9SQVNURVJfRkxBR19BQQotI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19kaXJlY3QgICBGVF9SQVNURVJfRkxBR19ESVJFQ1QKLSNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfY2xpcCAgICAgRlRfUkFTVEVSX0ZMQUdfQ0xJUAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1BhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYXJndW1lbnRzIHVzZWQgYnkgYSByYXN0ZXIncyByZW5kZXIgICAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhcmdldCAgICAgIDo6IFRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgKGUuZy4sIGFuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBGVF9PdXRsaW5lKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxhZ3MgICAgICAgOjogVGhlIHJlbmRlcmluZyBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBncmF5X3NwYW5zICA6OiBUaGUgZ3JheSBzcGFuIGRyYXdpbmcgY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsYWNrX3NwYW5zIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0X3Rlc3QgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRfc2V0ICAgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgIDo6IFVzZXItc3VwcGxpZWQgZGF0YSB0aGF0IGlzIHBhc3NlZCB0byBlYWNoIGRyYXdpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsaXBfYm94ICAgIDo6IEFuIG9wdGlvbmFsIGNsaXBwaW5nIGJveC4gIEl0IGlzIG9ubHkgdXNlZCBpbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBkaXJlY3QgcmVuZGVyaW5nIG1vZGUuICBOb3RlIHRoYXQgY29vcmRpbmF0ZXMgaGVyZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBfaW50ZWdlcl8gcGl4ZWxzIChhbmQgbm90IGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgIDI2LjYgZml4ZWQtcG9pbnQgdW5pdHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGFudGktYWxpYXNlZCBnbHlwaCBiaXRtYXAgaXMgZHJhd24gaWYgdGhlIEBGVF9SQVNURVJfRkxBR19BQSAgICAqLwotICAvKiAgICBiaXQgZmxhZyBpcyBzZXQgaW4gdGhlIGBmbGFncycgZmllbGQsIG90aGVyd2lzZSBhIG1vbm9jaHJvbWUgICAgICAgKi8KLSAgLyogICAgYml0bWFwIGlzIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBiaXQgZmxhZyBpcyBzZXQgaW4gYGZsYWdzJywgdGhlICAgICAgKi8KLSAgLyogICAgcmFzdGVyIHdpbGwgY2FsbCB0aGUgYGdyYXlfc3BhbnMnIGNhbGxiYWNrIHRvIGRyYXcgZ3JheSBwaXhlbCAgICAgICovCi0gIC8qICAgIHNwYW5zLiAgVGhpcyBhbGxvd3MgZGlyZWN0IGNvbXBvc2l0aW9uIG92ZXIgYSBwcmUtZXhpc3RpbmcgYml0bWFwICAqLwotICAvKiAgICB0aHJvdWdoIHVzZXItcHJvdmlkZWQgY2FsbGJhY2tzIHRvIHBlcmZvcm0gdGhlIHNwYW4gZHJhd2luZyBhbmQgICAgKi8KLSAgLyogICAgY29tcG9zaXRpb24uICAgIE5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1vbm9jaHJvbWUgcmFzdGVyaXplci4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfUmFzdGVyX1BhcmFtc18KLSAgewotICAgIGNvbnN0IEZUX0JpdG1hcCogICAgICAgIHRhcmdldDsKLSAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICBzb3VyY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgZ3JheV9zcGFuczsKLSAgICBGVF9TcGFuRnVuYyAgICAgICAgICAgICBibGFja19zcGFuczsgIC8qIHVudXNlZCAqLwotICAgIEZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMgIGJpdF90ZXN0OyAgICAgLyogdW51c2VkICovCi0gICAgRlRfUmFzdGVyX0JpdFNldF9GdW5jICAgYml0X3NldDsgICAgICAvKiB1bnVzZWQgKi8KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICB1c2VyOwotICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgIGNsaXBfYm94OwotCi0gIH0gRlRfUmFzdGVyX1BhcmFtczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9OZXdGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSBuZXcgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbWVtb3J5JyBwYXJhbWV0ZXIgaXMgYSB0eXBlbGVzcyBwb2ludGVyIGluIG9yZGVyIHRvIGF2b2lkICAgICAqLwotICAvKiAgICB1bi13YW50ZWQgZGVwZW5kZW5jaWVzIG9uIHRoZSByZXN0IG9mIHRoZSBGcmVlVHlwZSBjb2RlLiAgSW4gICAgICAgKi8KLSAgLyogICAgcHJhY3RpY2UsIGl0IGlzIGFuIEBGVF9NZW1vcnkgb2JqZWN0LCBpLmUuLCBhIGhhbmRsZSB0byB0aGUgICAgICAgICovCi0gIC8qICAgIHN0YW5kYXJkIEZyZWVUeXBlIG1lbW9yeSBhbGxvY2F0b3IuICBIb3dldmVyLCB0aGlzIGZpZWxkIGNhbiBiZSAgICAqLwotICAvKiAgICBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSBnaXZlbiByYXN0ZXIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfUmFzdGVyX05ld0Z1bmMpKCB2b2lkKiAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXIqICByYXN0ZXIgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfTmV3X0Z1bmMgIEZUX1Jhc3Rlcl9OZXdGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfRG9uZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSBhIGdpdmVuIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1Jhc3Rlcl9Eb25lRnVuYykoIEZUX1Jhc3RlciAgcmFzdGVyICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX0RvbmVfRnVuYyAgRlRfUmFzdGVyX0RvbmVGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfUmVzZXRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSB1c2VkIHRvIHByb3ZpZGUgYW4gYXJlYSBvZiBtZW1vcnkgY2FsbGVkIHRoZSBgcmVuZGVyICAgICAgKi8KLSAgLyogICAgcG9vbCcgYXZhaWxhYmxlIHRvIGFsbCByZWdpc3RlcmVkIHJhc3Rlcml6ZXJzLiAgVGhpcyB3YXMgbm90ICAgICAgICovCi0gIC8qICAgIHRocmVhZCBzYWZlLCBob3dldmVyLCBhbmQgbm93IEZyZWVUeXBlIG5ldmVyIGFsbG9jYXRlcyB0aGlzIHBvb2wuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYSBuZXcgcmFzdGVyIG9iamVjdCBpcyBjcmVhdGVkLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb29sX2Jhc2UgOjogUHJldmlvdXNseSwgdGhlIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSByZW5kZXIgcG9vbC4gKi8KLSAgLyogICAgICAgICAgICAgICAgIFNldCB0aGlzIHRvIE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb29sX3NpemUgOjogUHJldmlvdXNseSwgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIFNldCB0aGlzIHRvIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmFzdGVyaXplcnMgc2hvdWxkIHJlbHkgb24gZHluYW1pYyBvciBzdGFjayBhbGxvY2F0aW9uIGlmIHRoZXkgICAgICovCi0gIC8qICAgIHdhbnQgdG8gKGEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgYWxsb2NhdG9yIGlzIHBhc3NlZCB0byB0aGUgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJpemVyIGNvbnN0cnVjdG9yKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1Jhc3Rlcl9SZXNldEZ1bmMpKCBGVF9SYXN0ZXIgICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgcG9vbF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgcG9vbF9zaXplICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX1Jlc2V0X0Z1bmMgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9TZXRNb2RlRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgYSBnZW5lcmljIGZhY2lsaXR5IHRvIGNoYW5nZSBtb2RlcyBvciBhdHRyaWJ1dGVzICAqLwotICAvKiAgICBpbiBhIGdpdmVuIHJhc3Rlci4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgb3IgICAgKi8KLSAgLyogICAgc2ltcGx5IHRvIGFsbG93IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGBmZWF0dXJlcycgaW4gYSBnaXZlbiAgICAgICovCi0gIC8qICAgIHJhc3RlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kZSAgIDo6IEEgNC1ieXRlIHRhZyB1c2VkIHRvIG5hbWUgdGhlIG1vZGUgb3IgcHJvcGVydHkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcmdzICAgOjogQSBwb2ludGVyIHRvIHRoZSBuZXcgbW9kZS9wcm9wZXJ0eSB0byB1c2UuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfUmFzdGVyX1NldE1vZGVGdW5jKSggRlRfUmFzdGVyICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgYXJncyApOwotCi0jZGVmaW5lIEZUX1Jhc3Rlcl9TZXRfTW9kZV9GdW5jICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEludm9rZSBhIGdpdmVuIHJhc3RlciB0byBzY2FuLWNvbnZlcnQgYSBnaXZlbiBnbHlwaCBpbWFnZSBpbnRvIGEgICAqLwotICAvKiAgICB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyA6OiBBIHBvaW50ZXIgdG8gYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gICAgICAqLwotICAvKiAgICAgICAgICAgICAgc3RvcmUgdGhlIHJlbmRlcmluZyBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoZSBzb3VyY2UgaW1hZ2UgZGVwZW5kcyBvbiB0aGUgcmFzdGVyJ3MgZ2x5cGggKi8KLSAgLyogICAgZm9ybWF0IGRlZmluZWQgaW4gaXRzIEBGVF9SYXN0ZXJfRnVuY3Mgc3RydWN0dXJlLiAgSXQgY2FuIGJlIGFuICAgICovCi0gIC8qICAgIEBGVF9PdXRsaW5lIG9yIGFueXRoaW5nIGVsc2UgaW4gb3JkZXIgdG8gc3VwcG9ydCBhIGxhcmdlIGFycmF5IG9mICAqLwotICAvKiAgICBnbHlwaCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgYWxzbyB0aGF0IHRoZSByZW5kZXIgZnVuY3Rpb24gY2FuIGZhaWwgYW5kIHJldHVybiBhICAgICAgICAgICAqLwotICAvKiAgICBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgZXJyb3IgY29kZSBpZiB0aGUgcmFzdGVyIHVzZWQgZG9lcyAgKi8KLSAgLyogICAgbm90IHN1cHBvcnQgZGlyZWN0IGNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBYWFg6IEZvciBub3csIHRoZSBzdGFuZGFyZCByYXN0ZXIgZG9lc24ndCBzdXBwb3J0IGRpcmVjdCAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBjb21wb3NpdGlvbiBidXQgdGhpcyBzaG91bGQgY2hhbmdlIGZvciB0aGUgZmluYWwgcmVsZWFzZSAoc2VlICovCi0gIC8qICAgICAgICAgdGhlIGZpbGVzIGBkZW1vcy9zcmMvZnRncmF5cy5jJyBhbmQgYGRlbW9zL3NyYy9mdGdyYXlzMi5jJyAgICAqLwotICAvKiAgICAgICAgIGZvciBleGFtcGxlcyBvZiBkaXN0aW5jdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IGRpcmVjdCAgKi8KLSAgLyogICAgICAgICBjb21wb3NpdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX1Jhc3Rlcl9SZW5kZXJGdW5jKSggRlRfUmFzdGVyICAgICAgICAgICAgICAgIHJhc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfRnVuY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiByYXN0ZXIgY2xhc3MgdG8gdGhlIGxpYnJhcnkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9mb3JtYXQgIDo6IFRoZSBzdXBwb3J0ZWQgZ2x5cGggZm9ybWF0IGZvciB0aGlzIHJhc3Rlci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9uZXcgICAgOjogVGhlIHJhc3RlciBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyX3Jlc2V0ICA6OiBVc2VkIHRvIHJlc2V0IHRoZSByZW5kZXIgcG9vbCB3aXRoaW4gdGhlIHJhc3Rlci4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcmVuZGVyIDo6IEEgZnVuY3Rpb24gdG8gcmVuZGVyIGEgZ2x5cGggaW50byBhIGdpdmVuIGJpdG1hcC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9kb25lICAgOjogVGhlIHJhc3RlciBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Jhc3Rlcl9GdW5jc18KLSAgewotICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgZ2x5cGhfZm9ybWF0OwotCi0gICAgRlRfUmFzdGVyX05ld0Z1bmMgICAgICByYXN0ZXJfbmV3OwotICAgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMgICAgcmFzdGVyX3Jlc2V0OwotICAgIEZUX1Jhc3Rlcl9TZXRNb2RlRnVuYyAgcmFzdGVyX3NldF9tb2RlOwotICAgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jICAgcmFzdGVyX3JlbmRlcjsKLSAgICBGVF9SYXN0ZXJfRG9uZUZ1bmMgICAgIHJhc3Rlcl9kb25lOwotCi0gIH0gRlRfUmFzdGVyX0Z1bmNzOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRJTUFHRV9IXyAqLwotCi0KLS8qIEVORCAqLwotCi0KLS8qIExvY2FsIFZhcmlhYmxlczogKi8KLS8qIGNvZGluZzogdXRmLTggICAgKi8KLS8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhZTJiYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRpbmNyZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGluY3JlbWVudGFsIGxvYWRpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUSU5DUkVNX0hfCi0jZGVmaW5lIEZUSU5DUkVNX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgICBpbmNyZW1lbnRhbAotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgIEluY3JlbWVudGFsIExvYWRpbmcKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgICBDdXN0b20gR2x5cGggTG9hZGluZy4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGZ1bmN0aW9ucyB1c2VkIHRvIHBlcmZvcm0gc28tY2FsbGVkCi0gICAqICAgYGluY3JlbWVudGFsJyBnbHlwaCBsb2FkaW5nLiAgVGhpcyBpcyBhIG1vZGUgd2hlcmUgYWxsIGdseXBocyBsb2FkZWQKLSAgICogICBmcm9tIGEgZ2l2ZW4gQEZUX0ZhY2UgYXJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYXBwbGljYXRpb24uCi0gICAqCi0gICAqICAgQXBhcnQgZnJvbSB0aGF0LCBhbGwgb3RoZXIgdGFibGVzIGFyZSBsb2FkZWQgbm9ybWFsbHkgZnJvbSB0aGUgZm9udAotICAgKiAgIGZpbGUuICBUaGlzIG1vZGUgaXMgdXNlZnVsIHdoZW4gRnJlZVR5cGUgaXMgdXNlZCB3aXRoaW4gYW5vdGhlcgotICAgKiAgIGVuZ2luZSwgZS5nLiwgYSBQb3N0U2NyaXB0IEltYWdpbmcgUHJvY2Vzc29yLgotICAgKgotICAgKiAgIFRvIGVuYWJsZSB0aGlzIG1vZGUsIHlvdSBtdXN0IHVzZSBARlRfT3Blbl9GYWNlLCBwYXNzaW5nIGFuCi0gICAqICAgQEZUX1BhcmFtZXRlciB3aXRoIHRoZSBARlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMIHRhZyBhbmQgYW4KLSAgICogICBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlIHZhbHVlLiAgU2VlIHRoZSBjb21tZW50cyBmb3IKLSAgICogICBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjIGZvciBhbiBleGFtcGxlLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfSW5jcmVtZW50YWwKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFuIG9wYXF1ZSB0eXBlIGRlc2NyaWJpbmcgYSB1c2VyLXByb3ZpZGVkIG9iamVjdCB1c2VkIHRvIGltcGxlbWVudAotICAgKiAgIGBpbmNyZW1lbnRhbCcgZ2x5cGggbG9hZGluZyB3aXRoaW4gRnJlZVR5cGUuICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAotICAgKiAgIGVtYmVkZGVkIGZvbnRzIGluIGNlcnRhaW4gZW52aXJvbm1lbnRzIChlLmcuLCBQb3N0U2NyaXB0IGludGVycHJldGVycyksCi0gICAqICAgd2hlcmUgdGhlIGdseXBoIGRhdGEgaXNuJ3QgaW4gdGhlIGZvbnQgZmlsZSwgb3IgbXVzdCBiZSBvdmVycmlkZGVuIGJ5Ci0gICAqICAgZGlmZmVyZW50IHZhbHVlcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSXQgaXMgdXAgdG8gY2xpZW50IGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgYW5kIGltcGxlbWVudCBARlRfSW5jcmVtZW50YWwKLSAgICogICBvYmplY3RzLCBhcyBsb25nIGFzIHRoZXkgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBtZXRob2RzCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMsIEBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYwotICAgKiAgIGFuZCBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYy4KLSAgICoKLSAgICogICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMgdG8gdW5kZXJzdGFuZCBob3cKLSAgICogICB0byB1c2UgaW5jcmVtZW50YWwgb2JqZWN0cyB3aXRoIEZyZWVUeXBlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfSW5jcmVtZW50YWxSZWNfKiAgRlRfSW5jcmVtZW50YWw7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzbWFsbCBzdHJ1Y3R1cmUgdXNlZCB0byBjb250YWluIHRoZSBiYXNpYyBnbHlwaCBtZXRyaWNzIHJldHVybmVkCi0gICAqICAgYnkgdGhlIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jIG1ldGhvZC4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBiZWFyaW5nX3ggOjoKLSAgICogICAgIExlZnQgYmVhcmluZywgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogICBiZWFyaW5nX3kgOjoKLSAgICogICAgIFRvcCBiZWFyaW5nLCBpbiBmb250IHVuaXRzLgotICAgKgotICAgKiAgIGFkdmFuY2UgOjoKLSAgICogICAgIEhvcml6b250YWwgY29tcG9uZW50IG9mIGdseXBoIGFkdmFuY2UsIGluIGZvbnQgdW5pdHMuCi0gICAqCi0gICAqICAgYWR2YW5jZV92IDo6Ci0gICAqICAgICBWZXJ0aWNhbCBjb21wb25lbnQgb2YgZ2x5cGggYWR2YW5jZSwgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlc2UgY29ycmVzcG9uZCB0byBob3Jpem9udGFsIG9yIHZlcnRpY2FsIG1ldHJpY3MgZGVwZW5kaW5nIG9uIHRoZQotICAgKiAgIHZhbHVlIG9mIHRoZSBgdmVydGljYWwnIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbgotICAgKiAgIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWNfCi0gIHsKLSAgICBGVF9Mb25nICBiZWFyaW5nX3g7Ci0gICAgRlRfTG9uZyAgYmVhcmluZ195OwotICAgIEZUX0xvbmcgIGFkdmFuY2U7Ci0gICAgRlRfTG9uZyAgYWR2YW5jZV92OyAgICAgLyogc2luY2UgMi4zLjEyICovCi0KLSAgfSBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX0luY3JlbWVudGFsX01ldHJpY3MKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgaGFuZGxlIHRvIGFuIEBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjIHN0cnVjdHVyZS4KLSAgICoKLSAgICovCi0gICB0eXBlZGVmIHN0cnVjdCBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjXyogIEZUX0luY3JlbWVudGFsX01ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgZnVuY3Rpb24gY2FsbGVkIGJ5IEZyZWVUeXBlIHRvIGFjY2VzcyBhIGdpdmVuIGdseXBoJ3MgZGF0YSBieXRlcwotICAgKiAgIGR1cmluZyBARlRfTG9hZF9HbHlwaCBvciBARlRfTG9hZF9DaGFyIGlmIGluY3JlbWVudGFsIGxvYWRpbmcgaXMKLSAgICogICBlbmFibGVkLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGUgZm9ybWF0IG9mIHRoZSBnbHlwaCdzIGRhdGEgYnl0ZXMgZGVwZW5kcyBvbiB0aGUgZm9udAotICAgKiAgIGZpbGUgZm9ybWF0LiAgRm9yIFRydWVUeXBlLCBpdCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHJhdyBieXRlcyB3aXRoaW4KLSAgICogICB0aGUgYGdseWYnIHRhYmxlLiAgRm9yIFBvc3RTY3JpcHQgZm9ybWF0cywgaXQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZQotICAgKiAgICp1bmVuY3J5cHRlZCogY2hhcnN0cmluZyBieXRlcywgd2l0aG91dCBhbnkgYGxlbklWJyBoZWFkZXIuICBJdCBpcwotICAgKiAgIHVuZGVmaW5lZCBmb3IgYW55IG90aGVyIGZvcm1hdC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGluY3JlbWVudGFsIDo6Ci0gICAqICAgICBIYW5kbGUgdG8gYW4gb3BhcXVlIEBGVF9JbmNyZW1lbnRhbCBoYW5kbGUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudAotICAgKiAgICAgYXBwbGljYXRpb24uCi0gICAqCi0gICAqICAgZ2x5cGhfaW5kZXggOjoKLSAgICogICAgIEluZGV4IG9mIHJlbGV2YW50IGdseXBoLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFkYXRhIDo6Ci0gICAqICAgICBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSByZXR1cm5lZCBnbHlwaCBkYXRhIGJ5dGVzICh3aGljaCB3aWxsIGJlCi0gICAqICAgICBhY2Nlc3NlZCBhcyBhIHJlYWQtb25seSBieXRlIGJsb2NrKS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHRoZSBtZXRob2QKLSAgICogICBARlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgdG8gcmVsZWFzZQotICAgKiAgIHRoZSBkYXRhIGJ5dGVzLgotICAgKgotICAgKiAgIE5lc3RlZCBjYWxscyB0byBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYyBjYW4gaGFwcGVuIGZvcgotICAgKiAgIGNvbXBvdW5kIGdseXBocy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jKSggRlRfSW5jcmVtZW50YWwgIGluY3JlbWVudGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RhdGEqICAgICAgICBhZGF0YSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlbGVhc2UgdGhlIGdseXBoIGRhdGEgYnl0ZXMgcmV0dXJuZWQgYnkgYQotICAgKiAgIHN1Y2Nlc3NmdWwgY2FsbCB0byBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGluY3JlbWVudGFsIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byBhbiBvcGFxdWUgQEZUX0luY3JlbWVudGFsIGhhbmRsZSBwcm92aWRlZCBieSB0aGUgY2xpZW50Ci0gICAqICAgICBhcHBsaWNhdGlvbi4KLSAgICoKLSAgICogICBkYXRhIDo6Ci0gICAqICAgICBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBnbHlwaCBkYXRhIGJ5dGVzICh3aGljaCB3aWxsIGJlIGFjY2Vzc2VkCi0gICAqICAgICBhcyBhIHJlYWQtb25seSBieXRlIGJsb2NrKS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0luY3JlbWVudGFsX0ZyZWVHbHlwaERhdGFGdW5jKSggRlRfSW5jcmVtZW50YWwgIGluY3JlbWVudGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGF0YSogICAgICAgIGRhdGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJldHJpZXZlIHRoZSBiYXNpYyBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggaW5kZXgKLSAgICogICBiZWZvcmUgYWNjZXNzaW5nIGl0cyBkYXRhLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwgaW4gY2VydGFpbgotICAgKiAgIGZvcm1hdHMgbGlrZSBUcnVlVHlwZSwgdGhlIG1ldHJpY3MgYXJlIHN0b3JlZCBpbiBhIGRpZmZlcmVudCBwbGFjZSBmcm9tCi0gICAqICAgdGhlIGdseXBoIGltYWdlcyBwcm9wZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBpbmNyZW1lbnRhbCA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gYW4gb3BhcXVlIEBGVF9JbmNyZW1lbnRhbCBoYW5kbGUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudAotICAgKiAgICAgYXBwbGljYXRpb24uCi0gICAqCi0gICAqICAgZ2x5cGhfaW5kZXggOjoKLSAgICogICAgIEluZGV4IG9mIHJlbGV2YW50IGdseXBoLgotICAgKgotICAgKiAgIHZlcnRpY2FsIDo6Ci0gICAqICAgICBJZiB0cnVlLCByZXR1cm4gdmVydGljYWwgbWV0cmljcy4KLSAgICoKLSAgICogICBhbWV0cmljcyA6OgotICAgKiAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0LgotICAgKiAgICAgVGhlIG9yaWdpbmFsIGdseXBoIG1ldHJpY3MsIGlmIGFueSwgaW4gZm9udCB1bml0cy4gIElmIG1ldHJpY3MgYXJlCi0gICAqICAgICBub3QgYXZhaWxhYmxlIGFsbCB0aGUgdmFsdWVzIG11c3QgYmUgc2V0IHRvIHplcm8uCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYW1ldHJpY3MgOjoKLSAgICogICAgIFRoZSByZXBsYWNlbWVudCBnbHlwaCBtZXRyaWNzIGluIGZvbnQgdW5pdHMuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYykKLSAgICAgICAgICAgICAgICAgICAgICAoIEZUX0luY3JlbWVudGFsICAgICAgICAgICAgICBpbmNyZW1lbnRhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWMgICphbWV0cmljcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfRnVuY3NSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgZm9udHMgdGhhdCBsb2FkIGRhdGEKLSAgICogICBpbmNyZW1lbnRhbGx5LiAgVXNlZCBpbiBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjLgotICAgKgotICAgKiBAZmllbGRzOgotICAgKiAgIGdldF9nbHlwaF9kYXRhIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gZ2V0IGdseXBoIGRhdGEuICBNdXN0IG5vdCBiZSBudWxsLgotICAgKgotICAgKiAgIGZyZWVfZ2x5cGhfZGF0YSA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHJlbGVhc2UgZ2x5cGggZGF0YS4gIE11c3Qgbm90IGJlIG51bGwuCi0gICAqCi0gICAqICAgZ2V0X2dseXBoX21ldHJpY3MgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBnZXQgZ2x5cGggbWV0cmljcy4gIE1heSBiZSBudWxsIGlmIHRoZSBmb250IGRvZXMKLSAgICogICAgIG5vdCBwcm92aWRlIG92ZXJyaWRpbmcgZ2x5cGggbWV0cmljcy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9JbmNyZW1lbnRhbF9GdW5jc1JlY18KLSAgewotICAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMgICAgIGdldF9nbHlwaF9kYXRhOwotICAgIEZUX0luY3JlbWVudGFsX0ZyZWVHbHlwaERhdGFGdW5jICAgIGZyZWVfZ2x5cGhfZGF0YTsKLSAgICBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jICBnZXRfZ2x5cGhfbWV0cmljczsKLQotICB9IEZUX0luY3JlbWVudGFsX0Z1bmNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCB3aXRoIEBGVF9PcGVuX0ZhY2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXNlcgotICAgKiAgIHdhbnRzIHRvIHN1cHBvcnQgaW5jcmVtZW50YWwgZ2x5cGggbG9hZGluZy4gIFlvdSBzaG91bGQgdXNlIGl0IHdpdGgKLSAgICogICBARlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLSAgICoKLSAgICogICAgIHsKLSAgICogICAgICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjICBpbmNfaW50OwotICAgKiAgICAgICBGVF9QYXJhbWV0ZXIgICAgICAgICAgICAgICAgIHBhcmFtZXRlcjsKLSAgICogICAgICAgRlRfT3Blbl9BcmdzICAgICAgICAgICAgICAgICBvcGVuX2FyZ3M7Ci0gICAqCi0gICAqCi0gICAqICAgICAgIC8vIHNldCB1cCBpbmNyZW1lbnRhbCBkZXNjcmlwdG9yCi0gICAqICAgICAgIGluY19pbnQuZnVuY3MgID0gbXlfZnVuY3M7Ci0gICAqICAgICAgIGluY19pbnQub2JqZWN0ID0gbXlfb2JqZWN0OwotICAgKgotICAgKiAgICAgICAvLyBzZXQgdXAgb3B0aW9uYWwgcGFyYW1ldGVyCi0gICAqICAgICAgIHBhcmFtZXRlci50YWcgID0gRlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMOwotICAgKiAgICAgICBwYXJhbWV0ZXIuZGF0YSA9ICZpbmNfaW50OwotICAgKgotICAgKiAgICAgICAvLyBzZXQgdXAgRlRfT3Blbl9BcmdzIHN0cnVjdHVyZQotICAgKiAgICAgICBvcGVuX2FyZ3MuZmxhZ3MgICAgICA9IEZUX09QRU5fUEFUSE5BTUUgfCBGVF9PUEVOX1BBUkFNUzsKLSAgICogICAgICAgb3Blbl9hcmdzLnBhdGhuYW1lICAgPSBteV9mb250X3BhdGhuYW1lOwotICAgKiAgICAgICBvcGVuX2FyZ3MubnVtX3BhcmFtcyA9IDE7Ci0gICAqICAgICAgIG9wZW5fYXJncy5wYXJhbXMgICAgID0gJnBhcmFtZXRlcjsgLy8gd2UgdXNlIG9uZSBvcHRpb25hbCBhcmd1bWVudAotICAgKgotICAgKiAgICAgICAvLyBvcGVuIHRoZSBmb250Ci0gICAqICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmb3Blbl9hcmdzLCBpbmRleCwgJmZhY2UgKTsKLSAgICogICAgICAgLi4uCi0gICAqICAgICB9Ci0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjXwotICB7Ci0gICAgY29uc3QgRlRfSW5jcmVtZW50YWxfRnVuY3NSZWMqICBmdW5jczsKLSAgICBGVF9JbmNyZW1lbnRhbCAgICAgICAgICAgICAgICAgIG9iamVjdDsKLQotICB9IEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHBvaW50ZXIgdG8gYW4gQEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyogICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBjb25zdGFudDoKLSAgICogICBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlcyB0byBpbmRpY2F0ZQotICAgKiAgIGFuIGluY3JlbWVudGFsIGxvYWRpbmcgb2JqZWN0IHRvIGJlIHVzZWQgYnkgRnJlZVR5cGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwgIEZUX01BS0VfVEFHKCAnaScsICduJywgJ2MnLCAncicgKQotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRJTkNSRU1fSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYmQ5MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRsY2RmaWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY29sb3IgZmlsdGVyaW5nIG9mIHN1YnBpeGVsIGJpdG1hcCBnbHlwaHMgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVExDREZJTF9IXwotI2RlZmluZSBGVExDREZJTF9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICBsY2RfZmlsdGVyaW5nCi0gICAqCi0gICAqIEB0aXRsZToKLSAgICogICBMQ0QgRmlsdGVyaW5nCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICBSZWR1Y2UgY29sb3IgZnJpbmdlcyBvZiBzdWJwaXhlbC1yZW5kZXJlZCBiaXRtYXBzLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgU3VicGl4ZWwgcmVuZGVyaW5nIGV4cGxvaXRzIHRoZSBjb2xvci1zdHJpcGVkIHN0cnVjdHVyZSBvZiBMQ0QKLSAgICogICBwaXhlbHMsIGluY3JlYXNpbmcgdGhlIGF2YWlsYWJsZSByZXNvbHV0aW9uIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlCi0gICAqICAgc3RyaXBlICh1c3VhbGx5IGhvcml6b250YWwgUkdCKSBieSBhIGZhY3RvciBvZn4zLiAgU2luY2UgdGhlc2UKLSAgICogICBzdWJwaXhlbHMgYXJlIGNvbG9yIHBpeGVscywgdXNpbmcgdGhlbSB1bmZpbHRlcmVkIGNyZWF0ZXMgc2V2ZXJlCi0gICAqICAgY29sb3IgZnJpbmdlcy4gIFVzZSB0aGUgQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyIEFQSSB0byBzcGVjaWZ5IGEKLSAgICogICBsb3ctcGFzcyBmaWx0ZXIsIHdoaWNoIGlzIHRoZW4gYXBwbGllZCB0byBzdWJwaXhlbC1yZW5kZXJlZCBiaXRtYXBzCi0gICAqICAgZ2VuZXJhdGVkIHRocm91Z2ggQEZUX1JlbmRlcl9HbHlwaC4gIFRoZSBmaWx0ZXIgc2FjcmlmaWNlcyBzb21lIG9mCi0gICAqICAgdGhlIGhpZ2hlciByZXNvbHV0aW9uIHRvIHJlZHVjZSBjb2xvciBmcmluZ2VzLCBtYWtpbmcgdGhlIGdseXBoIGltYWdlCi0gICAqICAgc2xpZ2h0bHkgYmx1cnJpZXIuICBQb3NpdGlvbmFsIGltcHJvdmVtZW50cyB3aWxsIHJlbWFpbi4KLSAgICoKLSAgICogICBOb3RlIHRoYXQgbm8gZmlsdGVyIGlzIGFjdGl2ZSBieSBkZWZhdWx0LCBhbmQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzCi0gICAqICAgKm5vdCogaW1wbGVtZW50ZWQgaW4gZGVmYXVsdCBidWlsZHMgb2YgdGhlIGxpYnJhcnkuICBZb3UgbmVlZCB0bwotICAgKiAgICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgaW4geW91ciBgZnRvcHRpb24uaCcgZmlsZQotICAgKiAgIGluIG9yZGVyIHRvIGFjdGl2YXRlIGl0IGFuZCBleHBsaWNpdGx5IGNhbGwgQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyCi0gICAqICAgdG8gZW5hYmxlIGl0LgotICAgKgotICAgKiAgIEEgZmlsdGVyIHNob3VsZCBoYXZlIHR3byBwcm9wZXJ0aWVzOgotICAgKgotICAgKiAgIDEpIEl0IHNob3VsZCBiZSBub3JtYWxpemVkLCBtZWFuaW5nIHRoZSBzdW0gb2YgdGhlIDV+Y29tcG9uZW50cwotICAgKiAgICAgIHNob3VsZCBiZSAyNTYgKDB4MTAwKS4gIEl0IGlzIHBvc3NpYmxlIHRvIGdvIGFib3ZlIG9yIHVuZGVyIHRoaXMKLSAgICogICAgICB0YXJnZXQgc3VtLCBob3dldmVyOiBnb2luZyB1bmRlciBtZWFucyB0b3NzaW5nIG91dCBjb250cmFzdCwgZ29pbmcKLSAgICogICAgICBvdmVyIG1lYW5zIGludm9raW5nIGNsYW1waW5nIGFuZCB0aGVyZWJ5IG5vbi1saW5lYXJpdGllcyB0aGF0Ci0gICAqICAgICAgaW5jcmVhc2UgY29udHJhc3Qgc29tZXdoYXQgYXQgdGhlIGV4cGVuc2Ugb2YgZ3JlYXRlciBkaXN0b3J0aW9uCi0gICAqICAgICAgYW5kIGNvbG9yLWZyaW5naW5nLiAgQ29udHJhc3QgaXMgYmV0dGVyIGVuaGFuY2VkIHRocm91Z2ggc3RlbQotICAgKiAgICAgIGRhcmtlbmluZy4KLSAgICoKLSAgICogICAyKSBJdCBzaG91bGQgYmUgY29sb3ItYmFsYW5jZWQsIG1lYW5pbmcgYSBmaWx0ZXIgYHt+YSwgYiwgYywgYiwgYX59JwotICAgKiAgICAgIHdoZXJlIGF+KyBifj1+Yy4gIEl0IGRpc3RyaWJ1dGVzIHRoZSBjb21wdXRlZCBjb3ZlcmFnZSBmb3Igb25lCi0gICAqICAgICAgc3VicGl4ZWwgdG8gYWxsIHN1YnBpeGVscyBlcXVhbGx5LCBzYWNyaWZpY2luZyBzb21lIHdvbiByZXNvbHV0aW9uCi0gICAqICAgICAgYnV0IGRyYXN0aWNhbGx5IHJlZHVjaW5nIGNvbG9yLWZyaW5naW5nLiAgUG9zaXRpb25pbmcgaW1wcm92ZW1lbnRzCi0gICAqICAgICAgcmVtYWluISAgTm90ZSB0aGF0IGNvbG9yLWZyaW5naW5nIGNhbiBvbmx5IHJlYWxseSBiZSBtaW5pbWl6ZWQKLSAgICogICAgICB3aGVuIHVzaW5nIGEgY29sb3ItYmFsYW5jZWQgZmlsdGVyIGFuZCBhbHBoYS1ibGVuZGluZyB0aGUgZ2x5cGgKLSAgICogICAgICBvbnRvIGEgc3VyZmFjZSBpbiBsaW5lYXIgc3BhY2U7IHNlZSBARlRfUmVuZGVyX0dseXBoLgotICAgKgotICAgKiAgIFJlZ2FyZGluZyB0aGUgZm9ybSwgYSBmaWx0ZXIgY2FuIGJlIGEgYGJveHknIGZpbHRlciBvciBhIGBiZXZlbGVkJwotICAgKiAgIGZpbHRlci4gIEJveHkgZmlsdGVycyBhcmUgc2hhcnBlciBidXQgYXJlIGxlc3MgZm9yZ2l2aW5nIG9mIG5vbi1pZGVhbAotICAgKiAgIGdhbW1hIGN1cnZlcyBvZiBhIHNjcmVlbiAodmlld2luZyBhbmdsZXMhKSwgYmV2ZWxlZCBmaWx0ZXJzIGFyZQotICAgKiAgIGZ1enppZXIgYnV0IG1vcmUgdG9sZXJhbnQuCi0gICAqCi0gICAqICAgRXhhbXBsZXM6Ci0gICAqCi0gICAqICAgLSBbMHgxMCAweDQwIDB4NzAgMHg0MCAweDEwXSBpcyBiZXZlbGVkIGFuZCBuZWl0aGVyIGJhbGFuY2VkIG5vcgotICAgKiAgICAgbm9ybWFsaXplZC4KLSAgICoKLSAgICogICAtIFsweDFBIDB4MzMgMHg0RCAweDMzIDB4MUFdIGlzIGJldmVsZWQgYW5kIGJhbGFuY2VkIGJ1dCBub3QKLSAgICogICAgIG5vcm1hbGl6ZWQuCi0gICAqCi0gICAqICAgLSBbMHgxOSAweDMzIDB4NjYgMHg0YyAweDE5XSBpcyBiZXZlbGVkIGFuZCBub3JtYWxpemVkIGJ1dCBub3QKLSAgICogICAgIGJhbGFuY2VkLgotICAgKgotICAgKiAgIC0gWzB4MDAgMHg0YyAweDY2IDB4NGMgMHgwMF0gaXMgYm94aWx5IGJldmVsZWQgYW5kIG5vcm1hbGl6ZWQgYnV0IG5vdAotICAgKiAgICAgYmFsYW5jZWQuCi0gICAqCi0gICAqICAgLSBbMHgwMCAweDU1IDB4NTYgMHg1NSAweDAwXSBpcyBib3h5LCBub3JtYWxpemVkLCBhbmQgYWxtb3N0Ci0gICAqICAgICBiYWxhbmNlZC4KLSAgICoKLSAgICogICAtIFsweDA4IDB4NEQgMHg1NiAweDREIDB4MDhdIGlzIGJldmVsZWQsIG5vcm1hbGl6ZWQgYW5kLCBhbG1vc3QKLSAgICogICAgIGJhbGFuY2VkLgotICAgKgotICAgKiAgIFRoZSBmaWx0ZXIgYWZmZWN0cyBnbHlwaCBiaXRtYXBzIHJlbmRlcmVkIHRocm91Z2ggQEZUX1JlbmRlcl9HbHlwaCwKLSAgICogICBARlRfTG9hZF9HbHlwaCwgYW5kIEBGVF9Mb2FkX0NoYXIuICBJdCBkb2VzIF9ub3RfIGFmZmVjdCB0aGUgb3V0cHV0Ci0gICAqICAgb2YgQEZUX091dGxpbmVfUmVuZGVyIGFuZCBARlRfT3V0bGluZV9HZXRfQml0bWFwLgotICAgKgotICAgKiAgIElmIHRoaXMgZmVhdHVyZSBpcyBhY3RpdmF0ZWQsIHRoZSBkaW1lbnNpb25zIG9mIExDRCBnbHlwaCBiaXRtYXBzIGFyZQotICAgKiAgIGVpdGhlciB3aWRlciBvciB0YWxsZXIgdGhhbiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgIG91dGxpbmUgd2l0aCByZWdhcmQgdG8gdGhlIHBpeGVsIGdyaWQuICBGb3IgZXhhbXBsZSwgZm9yCi0gICAqICAgQEZUX1JFTkRFUl9NT0RFX0xDRCwgdGhlIGZpbHRlciBhZGRzIDN+c3VicGl4ZWxzIHRvIHRoZSBsZWZ0LCBhbmQKLSAgICogICAzfnN1YnBpeGVscyB0byB0aGUgcmlnaHQuICBUaGUgYml0bWFwIG9mZnNldCB2YWx1ZXMgYXJlIGFkanVzdGVkCi0gICAqICAgYWNjb3JkaW5nbHksIHNvIGNsaWVudHMgc2hvdWxkbid0IG5lZWQgdG8gbW9kaWZ5IHRoZWlyIGxheW91dCBhbmQKLSAgICogICBnbHlwaCBwb3NpdGlvbmluZyBjb2RlIHdoZW4gZW5hYmxpbmcgdGhlIGZpbHRlci4KLSAgICoKLSAgICogICBJdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IGxpbmVhciBhbHBoYSBibGVuZGluZyBhbmQgZ2FtbWEKLSAgICogICBjb3JyZWN0aW9uIGlzIGNyaXRpY2FsIGZvciBjb3JyZWN0bHkgcmVuZGVyaW5nIGdseXBocyBvbnRvIHN1cmZhY2VzCi0gICAqICAgd2l0aG91dCBhcnRpZmFjdHMgYW5kIGV2ZW4gbW9yZSBjcml0aWNhbCB3aGVuIHN1YnBpeGVsIHJlbmRlcmluZyBpcwotICAgKiAgIGludm9sdmVkLgotICAgKgotICAgKiAgIEVhY2ggb2YgdGhlIDN+YWxwaGEgdmFsdWVzIChzdWJwaXhlbHMpIGlzIGluZGVwZW5kZW50bHkgdXNlZCB0byBibGVuZAotICAgKiAgIG9uZSBjb2xvciBjaGFubmVsLiAgVGhhdCBpcywgcmVkIGFscGhhIGJsZW5kcyB0aGUgcmVkIGNoYW5uZWwgb2YgdGhlCi0gICAqICAgdGV4dCBjb2xvciB3aXRoIHRoZSByZWQgY2hhbm5lbCBvZiB0aGUgYmFja2dyb3VuZCBwaXhlbC4gIFRoZQotICAgKiAgIGRpc3RyaWJ1dGlvbiBvZiBkZW5zaXR5IHZhbHVlcyBieSB0aGUgY29sb3ItYmFsYW5jZWQgZmlsdGVyIGFzc3VtZXMKLSAgICogICBhbHBoYSBibGVuZGluZyBpcyBkb25lIGluIGxpbmVhciBzcGFjZTsgb25seSB0aGVuIGNvbG9yIGFydGlmYWN0cwotICAgKiAgIGNhbmNlbCBvdXQuCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfTGNkRmlsdGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsdWVzIHRvIGlkZW50aWZ5IHZhcmlvdXMgdHlwZXMgb2YgTENEIGZpbHRlcnMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfTENEX0ZJTFRFUl9OT05FIDo6Ci0gICAqICAgICBEbyBub3QgcGVyZm9ybSBmaWx0ZXJpbmcuICBXaGVuIHVzZWQgd2l0aCBzdWJwaXhlbCByZW5kZXJpbmcsIHRoaXMKLSAgICogICAgIHJlc3VsdHMgaW4gc29tZXRpbWVzIHNldmVyZSBjb2xvciBmcmluZ2VzLgotICAgKgotICAgKiAgIEZUX0xDRF9GSUxURVJfREVGQVVMVCA6OgotICAgKiAgICAgVGhlIGRlZmF1bHQgZmlsdGVyIHJlZHVjZXMgY29sb3IgZnJpbmdlcyBjb25zaWRlcmFibHksIGF0IHRoZSBjb3N0Ci0gICAqICAgICBvZiBhIHNsaWdodCBibHVycmluZXNzIGluIHRoZSBvdXRwdXQuCi0gICAqCi0gICAqICAgICBJdCBpcyBhIGJldmVsZWQsIG5vcm1hbGl6ZWQsIGFuZCBjb2xvci1iYWxhbmNlZCBmaXZlLXRhcCBmaWx0ZXIKLSAgICogICAgIHRoYXQgaXMgbW9yZSBmb3JnaXZpbmcgdG8gc2NyZWVucyB3aXRoIG5vbi1pZGVhbCBnYW1tYSBjdXJ2ZXMgYW5kCi0gICAqICAgICB2aWV3aW5nIGFuZ2xlcy4gIE5vdGUgdGhhdCB3aGlsZSBjb2xvci1mcmluZ2luZyBpcyByZWR1Y2VkLCBpdCBjYW4KLSAgICogICAgIG9ubHkgYmUgbWluaW1pemVkIGJ5IHVzaW5nIGxpbmVhciBhbHBoYSBibGVuZGluZyBhbmQgZ2FtbWEKLSAgICogICAgIGNvcnJlY3Rpb24gdG8gcmVuZGVyIGdseXBocyBvbnRvIHN1cmZhY2VzLiAgVGhlIGRlZmF1bHQgZmlsdGVyCi0gICAqICAgICB3ZWlnaHRzIGFyZSBbMHgwOCAweDREIDB4NTYgMHg0RCAweDA4XS4KLSAgICoKLSAgICogICBGVF9MQ0RfRklMVEVSX0xJR0hUIDo6Ci0gICAqICAgICBUaGUgbGlnaHQgZmlsdGVyIGlzIGEgdmFyaWFudCB0aGF0IGlzIHNoYXJwZXIgYXQgdGhlIGNvc3Qgb2YKLSAgICogICAgIHNsaWdodGx5IG1vcmUgY29sb3IgZnJpbmdlcyB0aGFuIHRoZSBkZWZhdWx0IG9uZS4KLSAgICoKLSAgICogICAgIEl0IGlzIGEgYm94eSwgbm9ybWFsaXplZCwgYW5kIGNvbG9yLWJhbGFuY2VkIHRocmVlLXRhcCBmaWx0ZXIgdGhhdAotICAgKiAgICAgaXMgbGVzcyBmb3JnaXZpbmcgdG8gc2NyZWVucyB3aXRoIG5vbi1pZGVhbCBnYW1tYSBjdXJ2ZXMgYW5kCi0gICAqICAgICB2aWV3aW5nIGFuZ2xlcy4gIFRoaXMgZmlsdGVyIHdvcmtzIGJlc3Qgd2hlbiB0aGUgcmVuZGVyaW5nIHN5c3RlbQotICAgKiAgICAgdXNlcyBsaW5lYXIgYWxwaGEgYmxlbmRpbmcgYW5kIGdhbW1hIGNvcnJlY3Rpb24gdG8gcmVuZGVyIGdseXBocwotICAgKiAgICAgb250byBzdXJmYWNlcy4gIFRoZSBsaWdodCBmaWx0ZXIgd2VpZ2h0cyBhcmUKLSAgICogICAgIFsweDAwIDB4NTUgMHg1NiAweDU1IDB4MDBdLgotICAgKgotICAgKiAgIEZUX0xDRF9GSUxURVJfTEVHQUNZIDo6Ci0gICAqICAgICBUaGlzIGZpbHRlciBjb3JyZXNwb25kcyB0byB0aGUgb3JpZ2luYWwgbGliWGZ0IGNvbG9yIGZpbHRlci4gIEl0Ci0gICAqICAgICBwcm92aWRlcyBoaWdoIGNvbnRyYXN0IG91dHB1dCBidXQgY2FuIGV4aGliaXQgcmVhbGx5IGJhZCBjb2xvcgotICAgKiAgICAgZnJpbmdlcyBpZiBnbHlwaHMgYXJlIG5vdCBleHRyZW1lbHkgd2VsbCBoaW50ZWQgdG8gdGhlIHBpeGVsIGdyaWQuCi0gICAqICAgICBJbiBvdGhlciB3b3JkcywgaXQgb25seSB3b3JrcyB3ZWxsIGlmIHRoZSBUcnVlVHlwZSBieXRlY29kZQotICAgKiAgICAgaW50ZXJwcmV0ZXIgaXMgZW5hYmxlZCAqYW5kKiBoaWdoLXF1YWxpdHkgaGludGVkIGZvbnRzIGFyZSB1c2VkLgotICAgKgotICAgKiAgICAgVGhpcyBmaWx0ZXIgaXMgb25seSBwcm92aWRlZCBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcywgYW5kIG1pZ2h0IGJlCi0gICAqICAgICBkaXNhYmxlZCBvciBzdGF5IHVuc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuCi0gICAqCi0gICAqICAgRlRfTENEX0ZJTFRFUl9MRUdBQ1kxIDo6Ci0gICAqICAgICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgRm9udENvbmZpZyBsaWJyYXJ5IHJldHVybnMgYSBkaWZmZXJlbnQKLSAgICogICAgIGVudW1lcmF0aW9uIHZhbHVlIGZvciBsZWdhY3kgTENEIGZpbHRlcmluZy4gIFRvIG1ha2UgY29kZSB3b3JrIHRoYXQKLSAgICogICAgIChpbmNvcnJlY3RseSkgZm9yd2FyZHMgRm9udENvbmZpZydzIGVudW1lcmF0aW9uIHZhbHVlIHRvCi0gICAqICAgICBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIgd2l0aG91dCBwcm9wZXIgbWFwcGluZywgaXQgaXMgdGh1cyBlYXNpZXN0Ci0gICAqICAgICB0byBoYXZlIGFub3RoZXIgZW51bWVyYXRpb24gdmFsdWUsIHdoaWNoIGlzIGNvbXBsZXRlbHkgZXF1YWwgdG8KLSAgICogICAgIGBGVF9MQ0RfRklMVEVSX0xFR0FDWScuCi0gICAqCi0gICAqIEBzaW5jZToKLSAgICogICAyLjMuMCAoYEZUX0xDRF9GSUxURVJfTEVHQUNZMScgc2luY2UgMi42LjIpCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEZUX0xjZEZpbHRlcl8KLSAgewotICAgIEZUX0xDRF9GSUxURVJfTk9ORSAgICA9IDAsCi0gICAgRlRfTENEX0ZJTFRFUl9ERUZBVUxUID0gMSwKLSAgICBGVF9MQ0RfRklMVEVSX0xJR0hUICAgPSAyLAotICAgIEZUX0xDRF9GSUxURVJfTEVHQUNZMSA9IDMsCi0gICAgRlRfTENEX0ZJTFRFUl9MRUdBQ1kgID0gMTYsCi0KLSAgICBGVF9MQ0RfRklMVEVSX01BWCAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLQotICB9IEZUX0xjZEZpbHRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuYzoKLSAgICogICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFwcGx5IGNvbG9yIGZpbHRlcmluZyB0byBMQ0QgZGVjaW1hdGVkCi0gICAqICAgYml0bWFwcywgbGlrZSB0aGUgb25lcyB1c2VkIHdoZW4gY2FsbGluZyBARlRfUmVuZGVyX0dseXBoIHdpdGgKLSAgICogICBARlRfUkVOREVSX01PREVfTENEIG9yIEBGVF9SRU5ERVJfTU9ERV9MQ0RfVi4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGxpYnJhcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeSBpbnN0YW5jZS4KLSAgICoKLSAgICogICBmaWx0ZXIgOjoKLSAgICogICAgIFRoZSBmaWx0ZXIgdHlwZS4KLSAgICoKLSAgICogICAgIFlvdSBjYW4gdXNlIEBGVF9MQ0RfRklMVEVSX05PTkUgaGVyZSB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZSwgb3IKLSAgICogICAgIEBGVF9MQ0RfRklMVEVSX0RFRkFVTFQgdG8gdXNlIGEgZGVmYXVsdCBmaWx0ZXIgdGhhdCBzaG91bGQgd29yawotICAgKiAgICAgd2VsbCBvbiBtb3N0IExDRCBzY3JlZW5zLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgZmVhdHVyZSBpcyBhbHdheXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIENsaWVudHMgbXVzdCBtYWtlIGFuCi0gICAqICAgZXhwbGljaXQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHdpdGggYSBgZmlsdGVyJyB2YWx1ZSBvdGhlciB0aGFuCi0gICAqICAgQEZUX0xDRF9GSUxURVJfTk9ORSBpbiBvcmRlciB0byBlbmFibGUgaXQuCi0gICAqCi0gICAqICAgRHVlIHRvICpQQVRFTlRTKiBjb3ZlcmluZyBzdWJwaXhlbCByZW5kZXJpbmcsIHRoaXMgZnVuY3Rpb24gZG9lc24ndAotICAgKiAgIGRvIGFueXRoaW5nIGV4Y2VwdCByZXR1cm5pbmcgYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHRoZQotICAgKiAgIGNvbmZpZ3VyYXRpb24gbWFjcm8gRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgaXMgbm90Ci0gICAqICAgZGVmaW5lZCBpbiB5b3VyIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byBhbGwKLSAgICogICBkZWZhdWx0IGJ1aWxkcyBvZiBGcmVlVHlwZS4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgIDIuMy4wCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xjZEZpbHRlciAgZmlsdGVyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmM6Ci0gICAqICAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBMQ0QgZmlsdGVyIHdpdGggY3VzdG9tIHdlaWdodHMsCi0gICAqICAgaW5zdGVhZCBvZiB1c2luZyBwcmVzZXRzIGluIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGxpYnJhcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeSBpbnN0YW5jZS4KLSAgICoKLSAgICogICB3ZWlnaHRzIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gYW4gYXJyYXk7IHRoZSBmdW5jdGlvbiBjb3BpZXMgdGhlIGZpcnN0IGZpdmUgYnl0ZXMgYW5kCi0gICAqICAgICB1c2VzIHRoZW0gdG8gc3BlY2lmeSB0aGUgZmlsdGVyIHdlaWdodHMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgRHVlIHRvICpQQVRFTlRTKiBjb3ZlcmluZyBzdWJwaXhlbCByZW5kZXJpbmcsIHRoaXMgZnVuY3Rpb24gZG9lc24ndAotICAgKiAgIGRvIGFueXRoaW5nIGV4Y2VwdCByZXR1cm5pbmcgYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHRoZQotICAgKiAgIGNvbmZpZ3VyYXRpb24gbWFjcm8gRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgaXMgbm90Ci0gICAqICAgZGVmaW5lZCBpbiB5b3VyIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byBhbGwKLSAgICogICBkZWZhdWx0IGJ1aWxkcyBvZiBGcmVlVHlwZS4KLSAgICoKLSAgICogICBMQ0QgZmlsdGVyIHdlaWdodHMgY2FuIGFsc28gYmUgc2V0IHBlciBmYWNlIHVzaW5nIEBGVF9GYWNlX1Byb3BlcnRpZXMKLSAgICogICB3aXRoIEBGVF9QQVJBTV9UQUdfTENEX0ZJTFRFUl9XRUlHSFRTLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgMi40LjAKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcldlaWdodHMoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICp3ZWlnaHRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGNvbnN0YW50OgotICAgKiAgIEZUX1BBUkFNX1RBR19MQ0RfRklMVEVSX1dFSUdIVFMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFuIEBGVF9QYXJhbWV0ZXIgdGFnIHRvIGJlIHVzZWQgd2l0aCBARlRfRmFjZV9Qcm9wZXJ0aWVzLiAgVGhlCi0gICAqICAgY29ycmVzcG9uZGluZyBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGZpdmUgTENEIGZpbHRlciB3ZWlnaHRzIGZvciBhCi0gICAqICAgZ2l2ZW4gZmFjZSAoaWYgdXNpbmcgQEZUX0xPQURfVEFSR0VUX0xDRCwgZm9yIGV4YW1wbGUpLCBvdmVycmlkaW5nCi0gICAqICAgdGhlIGdsb2JhbCBkZWZhdWx0IHZhbHVlcyBvciB0aGUgdmFsdWVzIHNldCB1cCB3aXRoCi0gICAqICAgQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1BBUkFNX1RBR19MQ0RfRklMVEVSX1dFSUdIVFMgXAotICAgICAgICAgIEZUX01BS0VfVEFHKCAnbCcsICdjJywgJ2QnLCAnZicgKQotCi0KLSAgLyoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfTGNkRml2ZVRhcEZpbHRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSB0eXBlZGVmIGZvciBwYXNzaW5nIHRoZSBmaXZlIExDRCBmaWx0ZXIgd2VpZ2h0cyB0bwotICAgKiAgIEBGVF9GYWNlX1Byb3BlcnRpZXMgd2l0aGluIGFuIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTENEX0ZJTFRFUl9GSVZFX1RBUFMgIDUKLQotICB0eXBlZGVmIEZUX0J5dGUgIEZUX0xjZEZpdmVUYXBGaWx0ZXJbRlRfTENEX0ZJTFRFUl9GSVZFX1RBUFNdOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVExDREZJTF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGxpc3QuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRsaXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDljYjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGxpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGxpc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgR2VuZXJpYyBsaXN0IHN1cHBvcnQgZm9yIEZyZWVUeXBlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHJlbGF0aXZlIHRvIGxpc3QgcHJvY2Vzc2luZy4gIEl0cyAgICAgKi8KLSAgLyogIGRhdGEgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiBgZnJlZXR5cGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUTElTVF9IXwotI2RlZmluZSBGVExJU1RfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0X3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaXN0IFByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW1wbGUgbWFuYWdlbWVudCBvZiBsaXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdmFyaW91cyBkZWZpbml0aW9ucyByZWxhdGVkIHRvIGxpc3QgICAgICAgICAgKi8KLSAgLyogICAgcHJvY2Vzc2luZyB1c2luZyBkb3VibHktbGlua2VkIG5vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3ROb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdE5vZGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9JbnNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X1JlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSXRlcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9GaW5hbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0ZpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5kIHRoZSBsaXN0IG5vZGUgZm9yIGEgZ2l2ZW4gbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGlzdCBub2RlLiAgTlVMTCBpZiBpdCB3YXNuJ3QgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0xpc3ROb2RlICkKLSAgRlRfTGlzdF9GaW5kKCBGVF9MaXN0ICBsaXN0LAotICAgICAgICAgICAgICAgIHZvaWQqICAgIGRhdGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfQWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFwcGVuZCBhbiBlbGVtZW50IHRvIHRoZSBlbmQgb2YgYSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIGFwcGVuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpc3RfQWRkKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0luc2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbnNlcnQgYW4gZWxlbWVudCBhdCB0aGUgaGVhZCBvZiBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byBpbnNlcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9MaXN0X0luc2VydCggRlRfTGlzdCAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVtb3ZlIGEgbm9kZSBmcm9tIGEgbGlzdC4gIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayB3aGV0aGVyICAgICovCi0gIC8qICAgIHRoZSBub2RlIGlzIGluIHRoZSBsaXN0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gcmVtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTGlzdF9SZW1vdmUoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfVXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vdmUgYSBub2RlIHRvIHRoZSBoZWFkL3RvcCBvZiBhIGxpc3QuICBVc2VkIHRvIG1haW50YWluIExSVSAgICAgICAqLwotICAvKiAgICBsaXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byBtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9MaXN0X1VwKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEZUX0xpc3QgaXRlcmF0b3IgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGEgbGlzdCBwYXJzZSAgICAqLwotICAvKiAgICBieSBARlRfTGlzdF9JdGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBjdXJyZW50IGl0ZXJhdGlvbiBsaXN0IG5vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBARlRfTGlzdF9JdGVyYXRlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZSBpdGVyYXRpb24ncyBzdGF0ZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9MaXN0X0l0ZXJhdG9yKSggRlRfTGlzdE5vZGUgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0l0ZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQYXJzZSBhIGxpc3QgYW5kIGNhbGxzIGEgZ2l2ZW4gaXRlcmF0b3IgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LiAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHBhcnNpbmcgaXMgc3RvcHBlZCBhcyBzb29uIGFzIG9uZSBvZiB0aGUgaXRlcmF0b3IgY2FsbHMgICovCi0gIC8qICAgIHJldHVybnMgYSBub24temVybyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpdGVyYXRvciA6OiBBbiBpdGVyYXRvciBmdW5jdGlvbiwgY2FsbGVkIG9uIGVhY2ggbm9kZSBvZiB0aGUgbGlzdC4gKi8KLSAgLyogICAgdXNlciAgICAgOjogQSB1c2VyLXN1cHBsaWVkIGZpZWxkIHRoYXQgaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHRoZSBpdGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgKGEgRnJlZVR5cGUgZXJyb3IgY29kZSkgb2YgdGhlIGxhc3QgaXRlcmF0b3IgY2FsbC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0xpc3RfSXRlcmF0ZSggRlRfTGlzdCAgICAgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICBGVF9MaXN0X0l0ZXJhdG9yICBpdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0Rlc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBARlRfTGlzdCBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0ICAgICAgICAgKi8KLSAgLyogICAgZmluYWxpemF0aW9uIGJ5IEBGVF9MaXN0X0ZpbmFsaXplIHRvIGRlc3Ryb3kgYWxsIGVsZW1lbnRzIGluIGEgICAgICovCi0gIC8qICAgIGdpdmVuIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN5c3RlbSA6OiBUaGUgY3VycmVudCBzeXN0ZW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSAgIDo6IFRoZSBjdXJyZW50IG9iamVjdCB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBARlRfTGlzdF9JdGVyYXRlLiAgSXQgY2FuICAgKi8KLSAgLyogICAgICAgICAgICAgIGJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlIGl0ZXJhdGlvbidzIHN0YXRlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9MaXN0X0Rlc3RydWN0b3IpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0ZpbmFsaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGFsbCBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcyB3ZWxsIGFzIHRoZSBsaXN0IGl0c2VsZi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc3Ryb3kgOjogQSBsaXN0IGRlc3RydWN0b3IgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50ICAqLwotICAvKiAgICAgICAgICAgICAgIG9mIHRoZSBsaXN0LiAgU2V0IHRoaXMgdG8gTlVMTCBpZiBub3QgbmVlZGVkLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgOjogVGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdCB0aGF0IGhhbmRsZXMgZGVhbGxvY2F0aW9uLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICA6OiBBIHVzZXItc3VwcGxpZWQgZmllbGQgdGhhdCBpcyBwYXNzZWQgYXMgdGhlIGxhc3QgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gdGhlIGRlc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IGFsbCBub2RlcyBhZGRlZCBieSBARlRfTGlzdF9BZGQgb3IgICAgICAqLwotICAvKiAgICBARlRfTGlzdF9JbnNlcnQgaGF2ZSBiZWVuIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpc3RfRmluYWxpemUoIEZUX0xpc3QgICAgICAgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgRlRfTGlzdF9EZXN0cnVjdG9yICBkZXN0cm95LAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICB1c2VyICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVExJU1RfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyYzk1ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bHp3LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGx6dy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTFpXLWNvbXByZXNzZWQgc3RyZWFtIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRMWldfSF8KLSNkZWZpbmUgRlRMWldfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGx6dyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExaVyBTdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzaW5nIExaVy1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgTFpXLXNwZWNpZmljIGZ1bmN0aW9ucy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9TdHJlYW1fT3BlbkxaVwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgT3BlbiBhIG5ldyBzdHJlYW0gdG8gcGFyc2UgTFpXLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMKLSAgKiAgIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLlonIGZvbnRzIHRoYXQgY29tZQotICAqICAgd2l0aCBYRnJlZTg2LgotICAqCi0gICogQGlucHV0OgotICAqICAgc3RyZWFtIDo6IFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KLSAgKgotICAqICAgc291cmNlIDo6IFRoZSBzb3VyY2Ugc3RyZWFtLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAgKgotICAqICAgQ2FsbGluZyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIG5ldyBzdHJlYW0gd2lsbAotICAqICAgKm5vdCogY2FsbCBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgc291cmNlIHN0cmVhbS4gIE5vbmUgb2YgdGhlIHN0cmVhbQotICAqICAgb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgotICAqCi0gICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgotICAqICAgcHJvY2VzcyBlYWNoIHRpbWUgc2Vla2luZyBiYWNrd2FyZHMgaXMgbmVlZGVkIHdpdGhpbiB0aGUgc3RyZWFtCi0gICoKLSAgKiAgIEluIGNlcnRhaW4gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LCBMWlcgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKLSAgKiAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aGVuIGNhbGxpbmcgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UuCi0gICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3Ci0gICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBMWlcgc3RyZWFtIGZyb20gaXQKLSAgKiAgIGFuZCByZS1vcGVuIHRoZSBmYWNlIHdpdGggaXQuCi0gICoKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAotICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIExaVyBzdXBwb3J0LgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5MWlcoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzb3VyY2UgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUTFpXX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bWFjLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTdjNmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bWFjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZGRpdGlvbmFsIE1hYy1zcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSnVzdCB2YW4gUm9zc3VtLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFOiBJbmNsdWRlIHRoaXMgZmlsZSBhZnRlciBGVF9GUkVFVFlQRV9IIGFuZCBhZnRlciBhbnkgICAgICAgICAgICAgICAqLwotLyogICAgICAgTWFjLXNwZWNpZmljIGhlYWRlcnMgKGJlY2F1c2UgdGhpcyBoZWFkZXIgdXNlcyBNYWMgdHlwZXMgc3VjaCBhcyAgKi8KLS8qICAgICAgIEhhbmRsZSwgRlNTcGVjLCBGU1JlZiwgZXRjLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUTUFDX0hfCi0jZGVmaW5lIEZUTUFDX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotLyogZ2NjLTMuNC4xIGFuZCBsYXRlciBjYW4gd2FybiBhYm91dCBmdW5jdGlvbnMgdGFnZ2VkIGFzIGRlcHJlY2F0ZWQgKi8KLSNpZm5kZWYgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEUKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAotICAgICgoX19HTlVDX18gPj0gNCkgfHwgKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMSkpKQotI2RlZmluZSBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURSAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCi0jZWxzZQotI2RlZmluZSBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURQotI2VuZGlmCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hY19zcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1hYyBTcGVjaWZpYyBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgYXZhaWxhYmxlIG9uIHRoZSBNYWNpbnRvc2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIEZyZWVUeXBlIGlzICAgICAgICAqLwotICAvKiAgICBjb21waWxlZCBvbiBhIE1hY2ludG9zaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBGT05EIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9uZCAgICAgICA6OiBBIEZPTkQgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IE9ubHkgc3VwcG9ydGVkIGZvciB0aGUgLTEgYHNhbml0eSBjaGVjaycgc3BlY2lhbCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgQEZUX0ZhY2Ugb2JqZWN0cyBmcm9tIGZvbnRzICAgICovCi0gIC8qICAgIHRoYXQgYXJlIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtIGFzIGZvbGxvd3MuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9uZCA9IEdldFJlc291cmNlKCAnRk9ORCcsIGZvbnROYW1lICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGVycm9yID0gRlRfTmV3X0ZhY2VfRnJvbV9GT05EKCBsaWJyYXJ5LCBmb25kLCAwLCAmZmFjZSApOyAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GT05EKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSAgICAgIGZvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICphZmFjZSApCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGFuIEZTU3BlYyBmb3IgdGhlIGRpc2sgZmlsZSBjb250YWluaW5nIHRoZSBuYW1lZCBmb250LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udE5hbWUgICA6OiBNYWMgT1MgbmFtZSBvZiB0aGUgZm9udCAoZS5nLiwgVGltZXMgTmV3IFJvbWFuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQm9sZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhTcGVjICAgOjogRlNTcGVjIHRvIHRoZSBmaWxlLiAgRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogSW5kZXggb2YgdGhlIGZhY2UuICBGb3IgcGFzc2luZyB0byAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUoIGNvbnN0IGNoYXIqICBmb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWMqICAgICAgcGF0aFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldEZpbGVfRnJvbV9NYWNfQVRTX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhbiBGU1NwZWMgZm9yIHRoZSBkaXNrIGZpbGUgY29udGFpbmluZyB0aGUgbmFtZWQgZm9udC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnROYW1lICAgOjogTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgaW4gQVRTIGZyYW1ld29yay4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhTcGVjICAgOjogRlNTcGVjIHRvIHRoZSBmaWxlLiBGb3IgcGFzc2luZyB0byAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogSW5kZXggb2YgdGhlIGZhY2UuIEZvciBwYXNzaW5nIHRvICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRGaWxlUGF0aF9Gcm9tX01hY19BVFNfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSBwYXRobmFtZSBvZiB0aGUgZGlzayBmaWxlIGFuZCBmYWNlIGluZGV4IGZvciBnaXZlbiBmb250ICAgKi8KLSAgLyogICAgbmFtZSB0aGF0IGlzIGhhbmRsZWQgYnkgQVRTIGZyYW1ld29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udE5hbWUgICAgOjogTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgaW4gQVRTIGZyYW1ld29yay4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGF0aCAgICAgICAgOjogQnVmZmVyIHRvIHN0b3JlIHBhdGhuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIHBhc3NpbmcgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRvIEBGVF9OZXdfRmFjZS4gIFRoZSBjbGllbnQgbXVzdCBhbGxvY2F0ZSB0aGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBhdGhTaXplIDo6IExlbmd0aHMgb2YgdGhlIGJ1ZmZlciBgcGF0aCcgdGhhdCBjbGllbnQgYWxsb2NhdGVkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCAgOjogSW5kZXggb2YgdGhlIGZhY2UuICBGb3IgcGFzc2luZyB0byBARlRfTmV3X0ZhY2UuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0RmlsZVBhdGhfRnJvbV9NYWNfQVRTX05hbWUoIGNvbnN0IGNoYXIqICBmb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQ4KiAgICAgICBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgIG1heFBhdGhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBhbmQgdHlwZWZhY2UgaW5kZXggICovCi0gIC8qICAgIHVzaW5nIGFuIEZTU3BlYyB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwZWMgICAgICAgOjogRlNTcGVjIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2l0aGluIHRoZSByZXNvdXJjZS4gIFRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmlyc3QgZmFjZSBoYXMgaW5kZXh+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjIGlzIGlkZW50aWNhbCB0byBARlRfTmV3X0ZhY2UgZXhjZXB0ICAgICAgICovCi0gIC8qICAgIGl0IGFjY2VwdHMgYW4gRlNTcGVjIGluc3RlYWQgb2YgYSBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNTcGVjICAqc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICphZmFjZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGFuZCB0eXBlZmFjZSBpbmRleCAgKi8KLSAgLyogICAgdXNpbmcgYW4gRlNSZWYgdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BlYyAgICAgICA6OiBGU1JlZiB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZmFjZSB3aXRoaW4gdGhlIHJlc291cmNlLiAgVGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmaXJzdCBmYWNlIGhhcyBpbmRleH4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiBpcyBpZGVudGljYWwgdG8gQEZUX05ld19GYWNlIGV4Y2VwdCAgICAgICAgKi8KLSAgLyogICAgaXQgYWNjZXB0cyBhbiBGU1JlZiBpbnN0ZWFkIG9mIGEgcGF0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU1JlZiAgKnJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgKmFmYWNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBGVE1BQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG1tLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxYjgwZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgTXVsdGlwbGUgTWFzdGVyIGZvbnQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRNTV9IXwotI2RlZmluZSBGVE1NX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbXVsdGlwbGVfbWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTXVsdGlwbGUgTWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSG93IHRvIG1hbmFnZSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhbmQgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG1hbmFnZSBNdWx0aXBsZSAgICAgICovCi0gIC8qICAgIE1hc3RlciBmb250cywgaS5lLiwgdGhlIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBkZXNpZ24gaW5zdGFuY2VzIGJ5ICAqLwotICAvKiAgICBzZXR0aW5nIGRlc2lnbiBheGlzIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlc2lkZXMgQWRvYmUgTU0gZm9udHMsIHRoZSBpbnRlcmZhY2Ugc3VwcG9ydHMgQXBwbGUncyBUcnVlVHlwZSBHWCAqLwotICAvKiAgICBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLiAgU29tZSBvZiB0aGUgcm91dGluZXMgb25seSB3b3JrIHdpdGggKi8KLSAgLyogICAgQWRvYmUgTU0gZm9udHMsIG90aGVycyB3aWxsIHdvcmsgd2l0aCBhbGwgdGhyZWUgdHlwZXMuICBUaGV5IGFyZSAgICovCi0gIC8qICAgIHNpbWlsYXIgZW5vdWdoIHRoYXQgYSBjb25zaXN0ZW50IGludGVyZmFjZSBtYWtlcyBzZW5zZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NTV9BeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIGdpdmVuIGF4aXMgaW4gZGVzaWduIHNwYWNlIGZvciBNdWx0aXBsZSAgICAgKi8KLSAgLyogICAgTWFzdGVycyBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24gKi8KLSAgLyogICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZSAgICA6OiBUaGUgYXhpcydzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5pbXVtIDo6IFRoZSBheGlzJ3MgbWluaW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heGltdW0gOjogVGhlIGF4aXMncyBtYXhpbXVtIGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01NX0F4aXNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICBuYW1lOwotICAgIEZUX0xvbmcgICAgIG1pbmltdW07Ci0gICAgRlRfTG9uZyAgICAgbWF4aW11bTsKLQotICB9IEZUX01NX0F4aXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWx0aV9NYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCB0aGUgYXhlcyBhbmQgc3BhY2Ugb2YgYSBNdWx0aXBsZSBNYXN0ZXJzICAgICAgKi8KLSAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24gKi8KLSAgLyogICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2F4aXMgICAgOjogTnVtYmVyIG9mIGF4ZXMuICBDYW5ub3QgZXhjZWVkfjQuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZGVzaWducyA6OiBOdW1iZXIgb2YgZGVzaWduczsgc2hvdWxkIGJlIG5vcm1hbGx5IDJebnVtX2F4aXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZXZlbiB0aG91Z2ggdGhlIFR5cGV+MSBzcGVjaWZpY2F0aW9uIHN0cmFuZ2VseSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGFsbG93cyBmb3IgaW50ZXJtZWRpYXRlIGRlc2lnbnMgdG8gYmUgcHJlc2VudC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBjYW5ub3QgZXhjZWVkfjE2LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF4aXMgICAgICAgIDo6IEEgdGFibGUgb2YgYXhpcyBkZXNjcmlwdG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX011bHRpX01hc3Rlcl8KLSAgewotICAgIEZUX1VJbnQgICAgIG51bV9heGlzOwotICAgIEZUX1VJbnQgICAgIG51bV9kZXNpZ25zOwotICAgIEZUX01NX0F4aXMgIGF4aXNbVDFfTUFYX01NX0FYSVNdOwotCi0gIH0gRlRfTXVsdGlfTWFzdGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmFyX0F4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBnaXZlbiBheGlzIGluIGRlc2lnbiBzcGFjZSBmb3IgTXVsdGlwbGUgICAgICovCi0gIC8qICAgIE1hc3RlcnMsIFRydWVUeXBlIEdYLCBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWUgICAgOjogVGhlIGF4aXMncyBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIE5vdCBhbHdheXMgbWVhbmluZ2Z1bCBmb3IgVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICB2YXJpYXRpb24gZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5pbXVtIDo6IFRoZSBheGlzJ3MgbWluaW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlZiAgICAgOjogVGhlIGF4aXMncyBkZWZhdWx0IGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIEZyZWVUeXBlIGNvbXB1dGVzIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZXMgZm9yIEFkb2JlICAgKi8KLSAgLyogICAgICAgICAgICAgICBNTSBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhpbXVtIDo6IFRoZSBheGlzJ3MgbWF4aW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgICAgOjogVGhlIGF4aXMncyB0YWcgKHRoZSBlcXVpdmFsZW50IHRvIGBuYW1lJyBmb3IgVHJ1ZVR5cGUgICAqLwotICAvKiAgICAgICAgICAgICAgIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMpLiAgRnJlZVR5cGUgcHJvdmlkZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlcyBmb3IgQWRvYmUgTU0gZm9udHMgaWYgcG9zc2libGUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpZCAgIDo6IFRoZSBheGlzIG5hbWUgZW50cnkgaW4gdGhlIGZvbnQncyBgbmFtZScgdGFibGUuICBUaGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICBpcyBhbm90aGVyIChhbmQgb2Z0ZW4gYmV0dGVyKSB2ZXJzaW9uIG9mIHRoZSBgbmFtZScgICAgICovCi0gIC8qICAgICAgICAgICAgICAgZmllbGQgZm9yIFRydWVUeXBlIEdYIG9yIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cy4gIE5vdCAqLwotICAvKiAgICAgICAgICAgICAgIG1lYW5pbmdmdWwgZm9yIEFkb2JlIE1NIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmllbGRzIGBtaW5pbXVtJywgYGRlZicsIGFuZCBgbWF4aW11bScgYXJlIDE2LjE2IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgdmFsdWVzIGZvciBUcnVlVHlwZSBHWCBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLiAgRm9yIEFkb2JlIE1NICovCi0gIC8qICAgIGZvbnRzLCB0aGUgdmFsdWVzIGFyZSBpbnRlZ2Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Zhcl9BeGlzXwotICB7Ci0gICAgRlRfU3RyaW5nKiAgbmFtZTsKLQotICAgIEZUX0ZpeGVkICAgIG1pbmltdW07Ci0gICAgRlRfRml4ZWQgICAgZGVmOwotICAgIEZUX0ZpeGVkICAgIG1heGltdW07Ci0KLSAgICBGVF9VTG9uZyAgICB0YWc7Ci0gICAgRlRfVUludCAgICAgc3RyaWQ7Ci0KLSAgfSBGVF9WYXJfQXhpczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Zhcl9OYW1lZF9TdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgbmFtZWQgaW5zdGFuY2UgaW4gYSBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSAqLwotICAvKiAgICB2YXJpYXRpb24gZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNhbid0IGJlIHVzZWQgZm9yIEFkb2JlIE1NIGZvbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyA6OiBUaGUgZGVzaWduIGNvb3JkaW5hdGVzIGZvciB0aGlzIGluc3RhbmNlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgVGhpcyBpcyBhbiBhcnJheSB3aXRoIG9uZSBlbnRyeSBmb3IgZWFjaCBheGlzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlkICA6OiBUaGUgZW50cnkgaW4gYG5hbWUnIHRhYmxlIGlkZW50aWZ5aW5nIHRoaXMgaW5zdGFuY2UuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHNpZCAgIDo6IFRoZSBlbnRyeSBpbiBgbmFtZScgdGFibGUgaWRlbnRpZnlpbmcgYSBQb3N0U2NyaXB0IG5hbWUgICovCi0gIC8qICAgICAgICAgICAgICBmb3IgdGhpcyBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Zhcl9OYW1lZF9TdHlsZV8KLSAgewotICAgIEZUX0ZpeGVkKiAgY29vcmRzOwotICAgIEZUX1VJbnQgICAgc3RyaWQ7Ci0gICAgRlRfVUludCAgICBwc2lkOyAgIC8qIHNpbmNlIDIuNy4xICovCi0KLSAgfSBGVF9WYXJfTmFtZWRfU3R5bGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NTV9WYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCB0aGUgYXhlcyBhbmQgc3BhY2Ugb2YgYSBBZG9iZSBNTSwgVHJ1ZVR5cGUgICAgKi8KLSAgLyogICAgR1gsIG9yIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTb21lIGZpZWxkcyBhcmUgc3BlY2lmaWMgdG8gb25lIGZvcm1hdCBhbmQgbm90IHRvIHRoZSBvdGhlcnMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fYXhpcyAgICAgICAgOjogVGhlIG51bWJlciBvZiBheGVzLiAgVGhlIG1heGltdW0gdmFsdWUgaXN+NCBmb3IgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEFkb2JlIE1NIGZvbnRzOyBubyBsaW1pdCBpbiBUcnVlVHlwZSBHWCBvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Rlc2lnbnMgICAgIDo6IFRoZSBudW1iZXIgb2YgZGVzaWduczsgc2hvdWxkIGJlIG5vcm1hbGx5ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAyXm51bV9heGlzIGZvciBBZG9iZSBNTSBmb250cy4gIE5vdCBtZWFuaW5nZnVsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgZm9yIFRydWVUeXBlIEdYIG9yIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICh3aGVyZSBldmVyeSBnbHlwaCBjb3VsZCBoYXZlIGEgZGlmZmVyZW50ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZGVzaWducykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX25hbWVkc3R5bGVzIDo6IFRoZSBudW1iZXIgb2YgbmFtZWQgc3R5bGVzOyBhIGBuYW1lZCBzdHlsZScgaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhIHR1cGxlIG9mIGRlc2lnbiBjb29yZGluYXRlcyB0aGF0IGhhcyBhIHN0cmluZyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgSUQgKGluIHRoZSBgbmFtZScgdGFibGUpIGFzc29jaWF0ZWQgd2l0aCBpdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb250IGNhbiB0ZWxsIHRoZSB1c2VyIHRoYXQsIGZvciBleGFtcGxlLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBbV2VpZ2h0PTEuNSxXaWR0aD0xLjFdIGlzIGBCb2xkJy4gIEFub3RoZXIgbmFtZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGBuYW1lZCBzdHlsZScgaXMgYG5hbWVkIGluc3RhbmNlJy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBGb3IgQWRvYmUgTXVsdGlwbGUgTWFzdGVycyBmb250cywgdGhpcyB2YWx1ZSBpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIHplcm8gYmVjYXVzZSB0aGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIG5hbWVkIHN0eWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBheGlzICAgICAgICAgICAgOjogQW4gYXhpcyBkZXNjcmlwdG9yIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBjb250YWluIHNsaWdodGx5IG1vcmUgZGF0YSB0aGFuIEFkb2JlIE1NIGZvbnRzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5IG1hbmFnZW1lbnQgb2YgdGhpcyBwb2ludGVyIGlzIGRvbmUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsbHkgYnkgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lZHN0eWxlICAgICAgOjogQSBuYW1lZCBzdHlsZSAoaW5zdGFuY2UpIHRhYmxlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIE9ubHkgbWVhbmluZ2Z1bCBmb3IgVHJ1ZVR5cGUgR1ggYW5kIE9wZW5UeXBlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICB2YXJpYXRpb24gZm9udHMuICBNZW1vcnkgbWFuYWdlbWVudCBvZiB0aGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBpcyBkb25lIGludGVybmFsbHkgYnkgRnJlZVR5cGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NTV9WYXJfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICBudW1fYXhpczsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICBudW1fZGVzaWduczsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICBudW1fbmFtZWRzdHlsZXM7Ci0gICAgRlRfVmFyX0F4aXMqICAgICAgICAgYXhpczsKLSAgICBGVF9WYXJfTmFtZWRfU3R5bGUqICBuYW1lZHN0eWxlOwotCi0gIH0gRlRfTU1fVmFyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X011bHRpX01hc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgYSB2YXJpYXRpb24gZGVzY3JpcHRvciBvZiBhIGdpdmVuIEFkb2JlIE1NIGZvbnQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbid0IGJlIHVzZWQgd2l0aCBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24gKi8KLSAgLyogICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1hc3RlciA6OiBUaGUgTXVsdGlwbGUgTWFzdGVycyBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X011bHRpX01hc3RlciggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsdGlfTWFzdGVyICAqYW1hc3RlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01NX1ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgYSB2YXJpYXRpb24gZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBmb250LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYWxsIHN1cHBvcnRlZCB2YXJpYXRpb24gZm9ybWF0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFzdGVyIDo6IFRoZSB2YXJpYXRpb24gZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBBbGxvY2F0ZXMgYSBkYXRhIHN0cnVjdHVyZSwgd2hpY2ggdGhlIHVzZXIgbXVzdCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgZGVhbGxvY2F0ZSB3aXRoIGBmcmVlJyBhZnRlciB1c2UuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9NTV9WYXIoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqYW1hc3RlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIEFkb2JlIE1NIGZvbnRzLCBjaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduIHRocm91Z2ggICAgICovCi0gIC8qICAgIGRlc2lnbiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4ndCBiZSB1c2VkIHdpdGggVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUgdmFyaWF0aW9uICovCi0gIC8qICAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGVzaWduIGNvb3JkaW5hdGVzLiAgSWYgaXQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgaWdub3JlIHRoZSBleGNlc3MgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMuICBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduIHRocm91Z2ggZGVzaWduIGNvb3JkaW5hdGVzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBhbGwgc3VwcG9ydGVkIHZhcmlhdGlvbiBmb3JtYXRzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGVzaWduIGNvb3JkaW5hdGVzLiAgSWYgaXQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgaWdub3JlIHRoZSBleGNlc3MgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMuICBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGRlc2lnbiBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGludGVycG9sYXRlZCAgKi8KLSAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYWxsIHN1cHBvcnRlZCB2YXJpYXRpb24gZm9ybWF0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgdG8gcmV0cmlldmUuICBJZiBpdCAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgc2V0IHRoZSBleGNlc3MgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMgdG9+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBUaGUgZGVzaWduIGNvb3JkaW5hdGVzIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduIHRocm91Z2ggbm9ybWFsaXplZCBibGVuZCAgICAgICAgKi8KLSAgLyogICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYWxsIHN1cHBvcnRlZCB2YXJpYXRpb24gZm9ybWF0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2lnbiBjb29yZGluYXRlcy4gIElmIGl0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIGlnbm9yZSB0aGUgZXhjZXNzICovCi0gIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzLiAgSWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHJlbWFpbmluZyBheGVzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyAgICAgOjogVGhlIGRlc2lnbiBjb29yZGluYXRlcyBhcnJheSAoZWFjaCBlbGVtZW50IG11c3QgYmUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGJldHdlZW4gMCBhbmQgMS4wIGZvciBBZG9iZSBNTSBmb250cywgYW5kIGJldHdlZW4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAtMS4wIGFuZCAxLjAgZm9yIFRydWVUeXBlIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24gICovCi0gIC8qICAgICAgICAgICAgICAgICAgZm9udHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBub3JtYWxpemVkIGJsZW5kIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgICAgICovCi0gIC8qICAgIGludGVycG9sYXRlZCBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIGFsbCBzdXBwb3J0ZWQgdmFyaWF0aW9uIGZvcm1hdHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2Ygbm9ybWFsaXplZCBibGVuZCBjb29yZGluYXRlcyB0byAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICByZXRyaWV2ZS4gIElmIGl0IGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgICovCi0gIC8qICAgICAgICAgICAgICAgICAgc2V0IHRoZSBleGNlc3MgdmFsdWVzIHRvfjAuNSBmb3IgQWRvYmUgTU0gZm9udHMsIGFuZCAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRvfjAgZm9yIFRydWVUeXBlIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IFRoZSBub3JtYWxpemVkIGJsZW5kIGNvb3JkaW5hdGVzIGFycmF5LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgYW5vdGhlciBuYW1lIG9mIEBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBhbm90aGVyIG5hbWUgb2YgQEZUX0dldF9NTV9CbGVuZF9Db29yZGluYXRlcy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVE1NX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNDdhYWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bW9kYXBpLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVE1PREFQSV9IXwotI2RlZmluZSBGVE1PREFQSV9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vZHVsZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyB0byBhZGQsIHVwZ3JhZGUsIHJlbW92ZSwgYW5kIGNvbnRyb2wgbW9kdWxlcyBmcm9tIEZyZWVUeXBlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBtYW5hZ2UgbW9kdWxlcyB3aXRoaW4gRnJlZVR5cGUuICAqLwotICAvKiAgICBNb2R1bGVzIGNhbiBiZSBhZGRlZCwgdXBncmFkZWQsIGFuZCByZW1vdmVkIGF0IHJ1bnRpbWUuICAgICAgICAgICAgKi8KLSAgLyogICAgQWRkaXRpb25hbGx5LCBzb21lIG1vZHVsZSBwcm9wZXJ0aWVzIGNhbiBiZSBjb250cm9sbGVkIGFsc28uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIZXJlIGlzIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGBtb2R1bGVfbmFtZScgZmllbGQgaW4gICAgKi8KLSAgLyogICAgdGhlIEBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBhdXRvZml0dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYmRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGNmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBneHZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgb3R2YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHBjZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBwZnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgcHNhdXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHBzaGludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBwc25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgcmFzdGVyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHNmbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBzbW9vdGgsIHNtb290aC1sY2QsIHNtb290aC1sY2R2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgdHJ1ZXR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHR5cGUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB0eXBlNDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgdDFjaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHdpbmZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgdGhlIEZyZWVUeXBlIENhY2hlIHN1Yi1zeXN0ZW0gaXMgbm90IGEgRnJlZVR5cGUgbW9kdWxlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0NvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0NsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbW92ZV9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Byb3BlcnR5X1NldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qcm9wZXJ0eV9HZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0RlZmF1bHRfUHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlZmVyZW5jZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcmVyX0NsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0RlYnVnX0hvb2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIG1vZHVsZSBiaXQgZmxhZ3MgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICAgICAgMSAgLyogdGhpcyBtb2R1bGUgaXMgYSBmb250IGRyaXZlciAgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX1JFTkRFUkVSICAgICAgICAgICAgMiAgLyogdGhpcyBtb2R1bGUgaXMgYSByZW5kZXJlciAgICAgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX0hJTlRFUiAgICAgICAgICAgICAgNCAgLyogdGhpcyBtb2R1bGUgaXMgYSBnbHlwaCBoaW50ZXIgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX1NUWUxFUiAgICAgICAgICAgICAgOCAgLyogdGhpcyBtb2R1bGUgaXMgYSBzdHlsZXIgICAgICAgKi8KLQotI2RlZmluZSBGVF9NT0RVTEVfRFJJVkVSX1NDQUxBQkxFICAgICAgMHgxMDAgIC8qIHRoZSBkcml2ZXIgc3VwcG9ydHMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxhYmxlIGZvbnRzICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NT0RVTEVfRFJJVkVSX05PX09VVExJTkVTICAgMHgyMDAgIC8qIHRoZSBkcml2ZXIgZG9lcyBub3QgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgdmVjdG9yIG91dGxpbmVzICAqLwotI2RlZmluZSBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIgICAgMHg0MDAgIC8qIHRoZSBkcml2ZXIgcHJvdmlkZXMgaXRzICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG93biBoaW50ZXIgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NT0RVTEVfRFJJVkVSX0hJTlRTX0xJR0hUTFkgMHg4MDAgIC8qIHRoZSBkcml2ZXIncyBoaW50ZXIgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2R1Y2VzIExJR0hUIGhpbnRzICAgICAqLwotCi0KLSAgLyogZGVwcmVjYXRlZCB2YWx1ZXMgKi8KLSNkZWZpbmUgZnRfbW9kdWxlX2ZvbnRfZHJpdmVyICAgICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSCi0jZGVmaW5lIGZ0X21vZHVsZV9yZW5kZXJlciAgICAgICAgICAgIEZUX01PRFVMRV9SRU5ERVJFUgotI2RlZmluZSBmdF9tb2R1bGVfaGludGVyICAgICAgICAgICAgICBGVF9NT0RVTEVfSElOVEVSCi0jZGVmaW5lIGZ0X21vZHVsZV9zdHlsZXIgICAgICAgICAgICAgIEZUX01PRFVMRV9TVFlMRVIKLQotI2RlZmluZSBmdF9tb2R1bGVfZHJpdmVyX3NjYWxhYmxlICAgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUKLSNkZWZpbmUgZnRfbW9kdWxlX2RyaXZlcl9ub19vdXRsaW5lcyAgICBGVF9NT0RVTEVfRFJJVkVSX05PX09VVExJTkVTCi0jZGVmaW5lIGZ0X21vZHVsZV9kcml2ZXJfaGFzX2hpbnRlciAgICAgRlRfTU9EVUxFX0RSSVZFUl9IQVNfSElOVEVSCi0jZGVmaW5lIGZ0X21vZHVsZV9kcml2ZXJfaGludHNfbGlnaHRseSAgRlRfTU9EVUxFX0RSSVZFUl9ISU5UU19MSUdIVExZCi0KLQotICB0eXBlZGVmIEZUX1BvaW50ZXIgIEZUX01vZHVsZV9JbnRlcmZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSAobm90IGNyZWF0ZSkgYSBuZXcgbW9kdWxlIG9iamVjdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgOjogVGhlIG1vZHVsZSB0byBpbml0aWFsaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9Nb2R1bGVfQ29uc3RydWN0b3IpKCBGVF9Nb2R1bGUgIG1vZHVsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0Rlc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGZpbmFsaXplIChub3QgZGVzdHJveSkgYSBnaXZlbiBtb2R1bGUgb2JqZWN0LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlIDo6IFRoZSBtb2R1bGUgdG8gZmluYWxpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gcXVlcnkgYSBnaXZlbiBtb2R1bGUgZm9yIGEgc3BlY2lmaWMgaW50ZXJmYWNlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgOjogVGhlIG1vZHVsZSB0byBiZSBzZWFyY2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWUgOjogICBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIGluIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9Nb2R1bGVfSW50ZXJmYWNlCi0gICgqRlRfTW9kdWxlX1JlcXVlc3RlcikoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBuYW1lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbW9kdWxlIGNsYXNzIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfZmxhZ3MgICAgOjogQml0IGZsYWdzIGRlc2NyaWJpbmcgdGhlIG1vZHVsZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9zaXplICAgICA6OiBUaGUgc2l6ZSBvZiBvbmUgbW9kdWxlIG9iamVjdC9pbnN0YW5jZSBpbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9uYW1lICAgICA6OiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX3ZlcnNpb24gIDo6IFRoZSB2ZXJzaW9uLCBhcyBhIDE2LjE2IGZpeGVkIG51bWJlciAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAobWFqb3IubWlub3IpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX3JlcXVpcmVzIDo6IFRoZSB2ZXJzaW9uIG9mIEZyZWVUeXBlIHRoaXMgbW9kdWxlIHJlcXVpcmVzLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhcyBhIDE2LjE2IGZpeGVkIG51bWJlciAobWFqb3IubWlub3IpLiAgU3RhcnRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYXQgdmVyc2lvbiAyLjAsIGkuZS4sIDB4MjAwMDAuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9pbml0ICAgICA6OiBUaGUgaW5pdGlhbGl6aW5nIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX2RvbmUgICAgIDo6IFRoZSBmaW5hbGl6aW5nIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZXRfaW50ZXJmYWNlICAgOjogVGhlIGludGVyZmFjZSByZXF1ZXN0aW5nIGZ1bmN0aW9uLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Nb2R1bGVfQ2xhc3NfCi0gIHsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgIG1vZHVsZV9mbGFnczsKLSAgICBGVF9Mb25nICAgICAgICAgICAgICAgIG1vZHVsZV9zaXplOwotICAgIGNvbnN0IEZUX1N0cmluZyogICAgICAgbW9kdWxlX25hbWU7Ci0gICAgRlRfRml4ZWQgICAgICAgICAgICAgICBtb2R1bGVfdmVyc2lvbjsKLSAgICBGVF9GaXhlZCAgICAgICAgICAgICAgIG1vZHVsZV9yZXF1aXJlczsKLQotICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgbW9kdWxlX2ludGVyZmFjZTsKLQotICAgIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgbW9kdWxlX2luaXQ7Ci0gICAgRlRfTW9kdWxlX0Rlc3RydWN0b3IgICBtb2R1bGVfZG9uZTsKLSAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgIGdldF9pbnRlcmZhY2U7Ci0KLSAgfSBGVF9Nb2R1bGVfQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZGQgYSBuZXcgbW9kdWxlIHRvIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbGF6eiAgIDo6IEEgcG9pbnRlciB0byBjbGFzcyBkZXNjcmlwdG9yIGZvciB0aGUgbW9kdWxlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgbW9kdWxlIGFscmVhZHkgZXhpc3RzIGJ5IHRoYXQgbmFtZSwgKi8KLSAgLyogICAgb3IgaWYgdGhlIG1vZHVsZSByZXF1aXJlcyBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBpcyB0b28gZ3JlYXQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQWRkX01vZHVsZSggRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmQgYSBtb2R1bGUgYnkgaXRzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX25hbWUgOjogVGhlIG1vZHVsZSdzIG5hbWUgKGFzIGFuIEFTQ0lJIHN0cmluZykuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBtb2R1bGUgaGFuZGxlLiAgMH5pZiBub25lIHdhcyBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUncyBpbnRlcm5hbCBtb2R1bGVzIGFyZW4ndCBkb2N1bWVudGVkIHZlcnkgd2VsbCwgYW5kIHlvdSAgICovCi0gIC8qICAgIHNob3VsZCBsb29rIHVwIHRoZSBzb3VyY2UgY29kZSBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Nb2R1bGUgKQotICBGVF9HZXRfTW9kdWxlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG1vZHVsZV9uYW1lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW1vdmVfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW1vdmUgYSBnaXZlbiBtb2R1bGUgZnJvbSBhIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgIDo6IEEgaGFuZGxlIHRvIGEgbW9kdWxlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbW9kdWxlIG9iamVjdCBpcyBkZXN0cm95ZWQgYnkgdGhlIGZ1bmN0aW9uIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9SZW1vdmVfTW9kdWxlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGUgICBtb2R1bGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfUHJvcGVydHlfU2V0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgU2V0IGEgcHJvcGVydHkgZm9yIGEgZ2l2ZW4gbW9kdWxlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGxpYnJhcnkgOjoKLSAgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgdGhlIG1vZHVsZSBpcyBwYXJ0IG9mLgotICAgKgotICAgKiAgICBtb2R1bGVfbmFtZSA6OgotICAgKiAgICAgICBUaGUgbW9kdWxlIG5hbWUuCi0gICAqCi0gICAqICAgIHByb3BlcnR5X25hbWUgOjoKLSAgICogICAgICAgVGhlIHByb3BlcnR5IG5hbWUuICBQcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGBTeW5vcHNpcycKLSAgICogICAgICAgc3Vic2VjdGlvbiBvZiB0aGUgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbi4KLSAgICoKLSAgICogICAgICAgTm90ZSB0aGF0IG9ubHkgYSBmZXcgbW9kdWxlcyBoYXZlIHByb3BlcnRpZXMuCi0gICAqCi0gICAqICAgIHZhbHVlIDo6Ci0gICAqICAgICAgIEEgZ2VuZXJpYyBwb2ludGVyIHRvIGEgdmFyaWFibGUgb3Igc3RydWN0dXJlIHRoYXQgZ2l2ZXMgdGhlIG5ldwotICAgKiAgICAgICB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBUaGUgZXhhY3QgZGVmaW5pdGlvbiBvZiBgdmFsdWUnIGlzCi0gICAqICAgICAgIGRlcGVuZGVudCBvbiB0aGUgcHJvcGVydHk7IHNlZSB0aGUgYFN5bm9wc2lzJyBzdWJzZWN0aW9uIG9mIHRoZQotICAgKiAgICAgICBtb2R1bGUncyBkb2N1bWVudGF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBJZiBgbW9kdWxlX25hbWUnIGlzbid0IGEgdmFsaWQgbW9kdWxlIG5hbWUsIG9yIGBwcm9wZXJ0eV9uYW1lJwotICAgKiAgICBkb2Vzbid0IHNwZWNpZnkgYSB2YWxpZCBwcm9wZXJ0eSwgb3IgaWYgYHZhbHVlJyBkb2Vzbid0IHJlcHJlc2VudCBhCi0gICAqICAgIHZhbGlkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHksIGFuIGVycm9yIGlzIHJldHVybmVkLgotICAgKgotICAgKiAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyBwcm9wZXJ0eSBgYmFyJyAoYSBzaW1wbGUgaW50ZWdlcikgaW4KLSAgICogICAgbW9kdWxlIGBmb28nIHRvIHZhbHVlfjEuCi0gICAqCi0gICAqICAgIHsKLSAgICogICAgICBGVF9VSW50ICBiYXI7Ci0gICAqCi0gICAqCi0gICAqICAgICAgYmFyID0gMTsKLSAgICogICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJmb28iLCAiYmFyIiwgJmJhciApOwotICAgKiAgICB9Ci0gICAqCi0gICAqICAgIE5vdGUgdGhhdCB0aGUgRnJlZVR5cGUgQ2FjaGUgc3ViLXN5c3RlbSBkb2Vzbid0IHJlY29nbml6ZSBtb2R1bGUKLSAgICogICAgcHJvcGVydHkgY2hhbmdlcy4gIFRvIGF2b2lkIGdseXBoIGxvb2t1cCBjb25mdXNpb24gd2l0aGluIHRoZSBjYWNoZQotICAgKiAgICB5b3Ugc2hvdWxkIGNhbGwgQEZUQ19NYW5hZ2VyX1Jlc2V0IHRvIGNvbXBsZXRlbHkgZmx1c2ggdGhlIGNhY2hlIGlmCi0gICAqICAgIGEgbW9kdWxlIHByb3BlcnR5IGdldHMgY2hhbmdlZCBhZnRlciBARlRDX01hbmFnZXJfTmV3IGhhcyBiZWVuCi0gICAqICAgIGNhbGxlZC4KLSAgICoKLSAgICogICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBGcmVlVHlwZSBDYWNoZQotICAgKiAgICBzdWItc3lzdGVtIGl0c2VsZiB3aXRoIEZUX1Byb3BlcnR5X1NldDsgdXNlIEBGVENfUHJvcGVydHlfU2V0Ci0gICAqICAgIGluc3RlYWQuCi0gICAqCi0gICAqICBAc2luY2U6Ci0gICAqICAgIDIuNC4xMQotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1Byb3BlcnR5X1NldCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICAgICAgIHZhbHVlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX1Byb3BlcnR5X0dldAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIEdldCBhIG1vZHVsZSdzIHByb3BlcnR5IHZhbHVlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGxpYnJhcnkgOjoKLSAgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgdGhlIG1vZHVsZSBpcyBwYXJ0IG9mLgotICAgKgotICAgKiAgICBtb2R1bGVfbmFtZSA6OgotICAgKiAgICAgICBUaGUgbW9kdWxlIG5hbWUuCi0gICAqCi0gICAqICAgIHByb3BlcnR5X25hbWUgOjoKLSAgICogICAgICAgVGhlIHByb3BlcnR5IG5hbWUuICBQcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGBTeW5vcHNpcycKLSAgICogICAgICAgc3Vic2VjdGlvbiBvZiB0aGUgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbi4KLSAgICoKLSAgICogQGlub3V0OgotICAgKiAgICB2YWx1ZSA6OgotICAgKiAgICAgICBBIGdlbmVyaWMgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSB0aGF0IGdpdmVzIHRoZQotICAgKiAgICAgICB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBUaGUgZXhhY3QgZGVmaW5pdGlvbiBvZiBgdmFsdWUnIGlzCi0gICAqICAgICAgIGRlcGVuZGVudCBvbiB0aGUgcHJvcGVydHk7IHNlZSB0aGUgYFN5bm9wc2lzJyBzdWJzZWN0aW9uIG9mIHRoZQotICAgKiAgICAgICBtb2R1bGUncyBkb2N1bWVudGF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBJZiBgbW9kdWxlX25hbWUnIGlzbid0IGEgdmFsaWQgbW9kdWxlIG5hbWUsIG9yIGBwcm9wZXJ0eV9uYW1lJwotICAgKiAgICBkb2Vzbid0IHNwZWNpZnkgYSB2YWxpZCBwcm9wZXJ0eSwgb3IgaWYgYHZhbHVlJyBkb2Vzbid0IHJlcHJlc2VudCBhCi0gICAqICAgIHZhbGlkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHksIGFuIGVycm9yIGlzIHJldHVybmVkLgotICAgKgotICAgKiAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZ2V0cyBwcm9wZXJ0eSBgYmF6JyAoYSByYW5nZSkgaW4gbW9kdWxlIGBmb28nLgotICAgKgotICAgKiAgICB7Ci0gICAqICAgICAgdHlwZWRlZiAgcmFuZ2VfCi0gICAqICAgICAgewotICAgKiAgICAgICAgRlRfSW50MzIgIG1pbjsKLSAgICogICAgICAgIEZUX0ludDMyICBtYXg7Ci0gICAqCi0gICAqICAgICAgfSByYW5nZTsKLSAgICoKLSAgICogICAgICByYW5nZSAgYmF6OwotICAgKgotICAgKgotICAgKiAgICAgIEZUX1Byb3BlcnR5X0dldCggbGlicmFyeSwgImZvbyIsICJiYXoiLCAmYmF6ICk7Ci0gICAqICAgIH0KLSAgICoKLSAgICogICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgb2YgdGhlIEZyZWVUeXBlIENhY2hlCi0gICAqICAgIHN1Yi1zeXN0ZW0gd2l0aCBGVF9Qcm9wZXJ0eV9HZXQ7IHVzZSBARlRDX1Byb3BlcnR5X0dldCBpbnN0ZWFkLgotICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAyLjQuMTEKLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Qcm9wZXJ0eV9HZXQoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgbW9kdWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB2YWx1ZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0RlZmF1bHRfUHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgY29tcGlsYXRpb24gb3B0aW9uIEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyBpcyAgICovCi0gIC8qICAgIHNldCwgdGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgYEZSRUVUWVBFX1BST1BFUlRJRVMnIGVudmlyb25tZW50ICAgICAqLwotICAvKiAgICB2YXJpYWJsZSB0byBjb250cm9sIGRyaXZlciBwcm9wZXJ0aWVzLiAgU2VlIHNlY3Rpb25zIEBhdXRvX2hpbnRlciwgKi8KLSAgLyogICAgQGNmZl9kcml2ZXIsIEBwY2ZfZHJpdmVyLCBhbmQgQHR0X2RyaXZlciBmb3IgbW9yZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgY29tcGlsYXRpb24gb3B0aW9uIGlzIG5vdCBzZXQsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXggZm9ybSAoYnJva2VuIGhlcmUgICAqLwotICAvKiAgICBpbnRvIG11bHRpcGxlIGxpbmVzIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIDxvcHRpb25hbCB3aGl0ZXNwYWNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICA8bW9kdWxlLW5hbWUxPiAnOicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgPHByb3BlcnR5LW5hbWUxPiAnPScgPHByb3BlcnR5LXZhbHVlMT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIDx3aGl0ZXNwYWNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICA8bW9kdWxlLW5hbWUyPiAnOicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgPHByb3BlcnR5LW5hbWUyPiAnPScgPHByb3BlcnR5LXZhbHVlMj4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZSRUVUWVBFX1BST1BFUlRJRVM9dHJ1ZXR5cGU6aW50ZXJwcmV0ZXItdmVyc2lvbj0zNSBcICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgIGNmZjpuby1zdGVtLWRhcmtlbmluZz0xIFwgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZml0dGVyOndhcnBpbmc9MSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlZmVyZW5jZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY291bnRlciBnZXRzIGluaXRpYWxpemVkIHRvfjEgYXQgdGhlIHRpbWUgYW4gQEZUX0xpYnJhcnkgICAgICAgICAqLwotICAvKiAgICBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4gIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgY291bnRlci4gICAgICAgKi8KLSAgLyogICAgQEZUX0RvbmVfTGlicmFyeSB0aGVuIG9ubHkgZGVzdHJveXMgYSBsaWJyYXJ5IGlmIHRoZSBjb3VudGVyIGlzfjEsICovCi0gIC8qICAgIG90aGVyd2lzZSBpdCBzaW1wbHkgZGVjcmVtZW50cyB0aGUgY291bnRlci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBoZWxwcyBpbiBtYW5hZ2luZyBsaWZlLWN5Y2xlcyBvZiBzdHJ1Y3R1cmVzIHRoYXQgICAgICovCi0gIC8qICAgIHJlZmVyZW5jZSBARlRfTGlicmFyeSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuNC4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1JlZmVyZW5jZV9MaWJyYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UgICAgKi8KLSAgLyogICAgZnJvbSBhIGdpdmVuIG1lbW9yeSBvYmplY3QuICBJdCBpcyB0aHVzIHBvc3NpYmxlIHRvIHVzZSBsaWJyYXJpZXMgICovCi0gIC8qICAgIHdpdGggZGlzdGluY3QgbWVtb3J5IGFsbG9jYXRvcnMgd2l0aGluIHRoZSBzYW1lIHByb2dyYW0uICBOb3RlLCAgICAqLwotICAvKiAgICBob3dldmVyLCB0aGF0IHRoZSB1c2VkIEBGVF9NZW1vcnkgc3RydWN0dXJlIGlzIGV4cGVjdGVkIHRvIHJlbWFpbiAgKi8KLSAgLyogICAgdmFsaWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBARlRfTGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3JtYWxseSwgeW91IHdvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiAoZm9sbG93ZWQgYnkgYSBjYWxsIHRvICAgICAgKi8KLSAgLyogICAgQEZUX0FkZF9EZWZhdWx0X01vZHVsZXMgb3IgYSBzZXJpZXMgb2YgY2FsbHMgdG8gQEZUX0FkZF9Nb2R1bGUsICAgICovCi0gIC8qICAgIGFuZCBhIGNhbGwgdG8gQEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMpIGluc3RlYWQgb2YgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfSW5pdF9GcmVlVHlwZSB0byBpbml0aWFsaXplIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvbid0IHVzZSBARlRfRG9uZV9GcmVlVHlwZSBidXQgQEZUX0RvbmVfTGlicmFyeSB0byBkZXN0cm95IGEgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICA6OiBBIGhhbmRsZSB0byB0aGUgb3JpZ2luYWwgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbGlicmFyeSA6OiBBIHBvaW50ZXIgdG8gaGFuZGxlIG9mIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgKi8KLSAgLyogICAgQEZUX1JlZmVyZW5jZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0xpYnJhcnkoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5ICAqYWxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpc2NhcmQgYSBnaXZlbiBsaWJyYXJ5IG9iamVjdC4gIFRoaXMgY2xvc2VzIGFsbCBkcml2ZXJzIGFuZCAgICAgICAqLwotICAvKiAgICBkaXNjYXJkcyBhbGwgcmVzb3VyY2Ugb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgKi8KLSAgLyogICAgQEZUX1JlZmVyZW5jZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9MaWJyYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgLyogKi8KLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9EZWJ1Z0hvb2tfRnVuYykoIHZvaWQqICBhcmcgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9EZWJ1Z19Ib29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCBhIGRlYnVnIGhvb2sgZnVuY3Rpb24gZm9yIGRlYnVnZ2luZyB0aGUgaW50ZXJwcmV0ZXIgb2YgYSBmb250ICAqLwotICAvKiAgICBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob29rX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZGVidWcgaG9vay4gIFlvdSBzaG91bGQgdXNlIHRoZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMgZGVmaW5lZCBpbiBgZnRvYmpzLmgnLCBlLmcuLCAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVidWdfaG9vayA6OiBUaGUgZnVuY3Rpb24gdXNlZCB0byBkZWJ1ZyB0aGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3VycmVudGx5LCBmb3VyIGRlYnVnIGhvb2sgc2xvdHMgYXJlIGF2YWlsYWJsZSwgYnV0IG9ubHkgdHdvIChmb3IgICovCi0gIC8qICAgIHRoZSBUcnVlVHlwZSBhbmQgdGhlIFR5cGV+MSBpbnRlcnByZXRlcikgYXJlIGRlZmluZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2luY2UgdGhlIGludGVybmFsIGhlYWRlcnMgb2YgRnJlZVR5cGUgYXJlIG5vIGxvbmdlciBpbnN0YWxsZWQsICAgICovCi0gIC8qICAgIHRoZSBzeW1ib2wgYEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUnIGlzbid0IGF2YWlsYWJsZSBwdWJsaWNseS4gICAgICAqLwotICAvKiAgICBUaGlzIGlzIGEgYnVnIGFuZCB3aWxsIGJlIGZpeGVkIGluIGEgZm9ydGhjb21pbmcgcmVsZWFzZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1NldF9EZWJ1Z19Ib29rKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICBob29rX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgRlRfRGVidWdIb29rX0Z1bmMgIGRlYnVnX2hvb2sgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkZCB0aGUgc2V0IG9mIGRlZmF1bHQgZHJpdmVycyB0byBhIGdpdmVuIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4geW91IGNyZWF0ZSBhIGxpYnJhcnkgb2JqZWN0IHdpdGggICAgICAgICAgKi8KLSAgLyogICAgQEZUX05ld19MaWJyYXJ5ICh1c3VhbGx5IHRvIHBsdWcgYSBjdXN0b20gbWVtb3J5IG1hbmFnZXIpLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIG5ldyBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICB0cnVldHlwZV9lbmdpbmUKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIFRoZSBUcnVlVHlwZSBFbmdpbmUKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIFRydWVUeXBlIGJ5dGVjb2RlIHN1cHBvcnQuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIHNlY3Rpb24gY29udGFpbnMgYSBmdW5jdGlvbiB1c2VkIHRvIHF1ZXJ5IHRoZSBsZXZlbCBvZiBUcnVlVHlwZQotICAgKiAgIGJ5dGVjb2RlIHN1cHBvcnQgY29tcGlsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiAgQGVudW06Ci0gICAqICAgICBGVF9UcnVlVHlwZUVuZ2luZVR5cGUKLSAgICoKLSAgICogIEBkZXNjcmlwdGlvbjoKLSAgICogICAgIEEgbGlzdCBvZiB2YWx1ZXMgZGVzY3JpYmluZyB3aGljaCBraW5kIG9mIFRydWVUeXBlIGJ5dGVjb2RlCi0gICAqICAgICBlbmdpbmUgaXMgaW1wbGVtZW50ZWQgaW4gYSBnaXZlbiBGVF9MaWJyYXJ5IGluc3RhbmNlLiAgSXQgaXMgdXNlZAotICAgKiAgICAgYnkgdGhlIEBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUgZnVuY3Rpb24uCi0gICAqCi0gICAqICBAdmFsdWVzOgotICAgKiAgICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfTk9ORSA6OgotICAgKiAgICAgICBUaGUgbGlicmFyeSBkb2Vzbid0IGltcGxlbWVudCBhbnkga2luZCBvZiBieXRlY29kZSBpbnRlcnByZXRlci4KLSAgICoKLSAgICogICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1VOUEFURU5URUQgOjoKLSAgICogICAgICAgRGVwcmVjYXRlZCBhbmQgcmVtb3ZlZC4KLSAgICoKLSAgICogICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1BBVEVOVEVEIDo6Ci0gICAqICAgICAgIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgYSBieXRlY29kZSBpbnRlcnByZXRlciB0aGF0IGNvdmVycwotICAgKiAgICAgICB0aGUgZnVsbCBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlIFRydWVUeXBlIHZpcnR1YWwgbWFjaGluZSAodGhpcwotICAgKiAgICAgICB3YXMgZ292ZXJuZWQgYnkgcGF0ZW50cyB1bnRpbCBNYXkgMjAxMCwgaGVuY2UgdGhlIG5hbWUpLgotICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAgMi4yCi0gICAqCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1RydWVUeXBlRW5naW5lVHlwZV8KLSAgewotICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX05PTkUgPSAwLAotICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1VOUEFURU5URUQsCi0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfUEFURU5URUQKLQotICB9IEZUX1RydWVUeXBlRW5naW5lVHlwZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiAgQGZ1bmM6Ci0gICAqICAgICBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUKLSAgICoKLSAgICogIEBkZXNjcmlwdGlvbjoKLSAgICogICAgIFJldHVybiBhbiBARlRfVHJ1ZVR5cGVFbmdpbmVUeXBlIHZhbHVlIHRvIGluZGljYXRlIHdoaWNoIGxldmVsIG9mCi0gICAqICAgICB0aGUgVHJ1ZVR5cGUgdmlydHVhbCBtYWNoaW5lIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZSBzdXBwb3J0cy4KLSAgICoKLSAgICogIEBpbnB1dDoKLSAgICogICAgIGxpYnJhcnkgOjoKLSAgICogICAgICAgQSBsaWJyYXJ5IGluc3RhbmNlLgotICAgKgotICAgKiAgQHJldHVybjoKLSAgICogICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGljaCBsZXZlbCBpcyBzdXBwb3J0ZWQuCi0gICAqCi0gICAqICBAc2luY2U6Ci0gICAqICAgICAyLjIKLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlICkKLSAgRlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVE1PREFQSV9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjYwODM3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RlcnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1vZGVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgbW9kdWxlIGVycm9yIG9mZnNldHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIEZyZWVUeXBlIG1vZHVsZSBlcnJvciBjb2Rlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGluIGBmdG9wdGlvbi5oJyBpcyAgICAqLwotICAvKiBzZXQsIHRoZSBsb3dlciBieXRlIG9mIGFuIGVycm9yIHZhbHVlIGlkZW50aWZpZXMgdGhlIGVycm9yIGNvZGUgYXMgICAgKi8KLSAgLyogdXN1YWwuICBJbiBhZGRpdGlvbiwgdGhlIGhpZ2hlciBieXRlIGlkZW50aWZpZXMgdGhlIG1vZHVsZS4gIEZvciAgICAgICovCi0gIC8qIGV4YW1wbGUsIHRoZSBlcnJvciBgRlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDAwMDMsIHRoZSAqLwotICAvKiBlcnJvciBgVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDEzMDMsIHRoZSBlcnJvciAgICAgICAgKi8KLSAgLyogYFQxX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0JyBoYXMgdmFsdWUgMHgxNDAzLCBldGMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgYEZUX0Vycl9PaycsIGBUVF9FcnJfT2snLCBldGMuIGFyZSBhbHdheXMgZXF1YWwgdG8gemVybywgICAgKi8KLSAgLyogaW5jbHVkaW5nIHRoZSBoaWdoIGJ5dGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGlzbid0IHNldCwgdGhlIGhpZ2hlciBieXRlIG9mICAgKi8KLSAgLyogYW4gZXJyb3IgdmFsdWUgaXMgc2V0IHRvIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUbyBoaWRlIHRoZSB2YXJpb3VzIGBYWFhfRXJyXycgcHJlZml4ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLCBGcmVlVHlwZSAgKi8KLSAgLyogcHJvdmlkZXMgc29tZSBtYWNyb3MgaW4gYGZ0dHlwZXMuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUiggZXJyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEFkZCBjdXJyZW50IGVycm9yIG1vZHVsZSBwcmVmaXggKGFzIGRlZmluZWQgd2l0aCB0aGUgICAgICAgICAgICAgICovCi0gIC8qICAgICBgRlRfRVJSX1BSRUZJWCcgbWFjcm8pIHRvIGBlcnInLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBCREYgbW9kdWxlICAqLwotICAvKiAgICAgdGhlIGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX091dGxpbmUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGV4cGFuZHMgdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBlcnJvciA9IEJERl9FcnJfSW52YWxpZF9PdXRsaW5lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBGb3Igc2ltcGxpY2l0eSwgeW91IGNhbiBhbHdheXMgdXNlIGBGVF9FcnJfT2snIGRpcmVjdGx5IGluc3RlYWQgICAqLwotICAvKiAgICAgb2YgYEZUX0VSUiggT2sgKScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJSX0VRKCBlcnJjb2RlLCBlcnIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUl9ORVEoIGVycmNvZGUsIGVyciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIENvbXBhcmUgZXJyb3IgY29kZSBgZXJyY29kZScgd2l0aCB0aGUgZXJyb3IgYGVycicgZm9yIGVxdWFsaXR5ICAgICovCi0gIC8qICAgICBhbmQgaW5lcXVhbGl0eSwgcmVzcGVjdGl2ZWx5LiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBJbnZhbGlkX091dGxpbmUgKSApICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFVzaW5nIHRoaXMgbWFjcm8geW91IGRvbid0IGhhdmUgdG8gdGhpbmsgYWJvdXQgZXJyb3IgcHJlZml4ZXMuICAgICovCi0gIC8qICAgICBPZiBjb3Vyc2UsIGlmIG1vZHVsZSBlcnJvcnMgYXJlIG5vdCBhY3RpdmUsIHRoZSBhYm92ZSBleGFtcGxlIGlzICAqLwotICAvKiAgICAgdGhlIHNhbWUgYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlmICggZXJyb3IgPT0gRlRfRXJyX0ludmFsaWRfT3V0bGluZSApICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJST1JfQkFTRSggZXJyY29kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUk9SX01PRFVMRSggZXJyY29kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEdldCBiYXNlIGVycm9yIGFuZCBtb2R1bGUgZXJyb3IgY29kZSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSBtb2R1bGUgZXJyb3IgbWVzc2FnZSB0YWJsZSBlYXNpbHkgICAgICovCi0gIC8qIHdpdGggc29tZXRoaW5nIGxpa2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjdW5kZWYgRlRNT0RFUlJfSF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgI2RlZmluZSBGVF9NT0RFUlJERUYoIGUsIHYsIHMgKSAgeyBGVF9Nb2RfRXJyXyAjIyBlLCBzIH0sICAgICAgICAgKi8KLSAgLyogICAgICNkZWZpbmUgRlRfTU9ERVJSX1NUQVJUX0xJU1QgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjZGVmaW5lIEZUX01PREVSUl9FTkRfTElTVCAgICAgICB7IDAsIDAgfSB9OyAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNvbnN0IHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpbnQgICAgICAgICAgbW9kX2Vycl9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgY29uc3QgY2hhciogIG1vZF9lcnJfbXNnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB9IGZ0X21vZF9lcnJvcnNbXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVE1PREVSUl9IXwotI2RlZmluZSBGVE1PREVSUl9IXwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBTRVRVUCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI3VuZGVmICBGVF9ORUVEX0VYVEVSTl9DCi0KLSNpZm5kZWYgRlRfTU9ERVJSREVGCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTCi0jZGVmaW5lIEZUX01PREVSUkRFRiggZSwgdiwgcyApICBGVF9Nb2RfRXJyXyAjIyBlID0gdiwKLSNlbHNlCi0jZGVmaW5lIEZUX01PREVSUkRFRiggZSwgdiwgcyApICBGVF9Nb2RfRXJyXyAjIyBlID0gMCwKLSNlbmRpZgotCi0jZGVmaW5lIEZUX01PREVSUl9TVEFSVF9MSVNUICBlbnVtIHsKLSNkZWZpbmUgRlRfTU9ERVJSX0VORF9MSVNUICAgIEZUX01vZF9FcnJfTWF4IH07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9ORUVEX0VYVEVSTl9DCi0gIGV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfTU9ERVJSREVGICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICBMSVNUIE1PRFVMRSBFUlJPUiBCQVNFUyAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZkZWYgRlRfTU9ERVJSX1NUQVJUX0xJU1QKLSAgRlRfTU9ERVJSX1NUQVJUX0xJU1QKLSNlbmRpZgotCi0KLSAgRlRfTU9ERVJSREVGKCBCYXNlLCAgICAgIDB4MDAwLCAiYmFzZSBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBBdXRvZml0LCAgIDB4MTAwLCAiYXV0b2ZpdHRlciBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBCREYsICAgICAgIDB4MjAwLCAiQkRGIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEJ6aXAyLCAgICAgMHgzMDAsICJCemlwMiBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBDYWNoZSwgICAgIDB4NDAwLCAiY2FjaGUgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggQ0ZGLCAgICAgICAweDUwMCwgIkNGRiBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBDSUQsICAgICAgIDB4NjAwLCAiQ0lEIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEd6aXAsICAgICAgMHg3MDAsICJHemlwIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIExaVywgICAgICAgMHg4MDAsICJMWlcgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggT1R2YWxpZCwgICAweDkwMCwgIk9wZW5UeXBlIHZhbGlkYXRpb24gbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggUENGLCAgICAgICAweEEwMCwgIlBDRiBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBQRlIsICAgICAgIDB4QjAwLCAiUEZSIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFBTYXV4LCAgICAgMHhDMDAsICJQUyBhdXhpbGlhcnkgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggUFNoaW50ZXIsICAweEQwMCwgIlBTIGhpbnRlciBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBQU25hbWVzLCAgIDB4RTAwLCAiUFMgbmFtZXMgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggUmFzdGVyLCAgICAweEYwMCwgInJhc3RlciBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBTRk5ULCAgICAgMHgxMDAwLCAiU0ZOVCBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBTbW9vdGgsICAgMHgxMTAwLCAic21vb3RoIHJhc3RlciBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBUcnVlVHlwZSwgMHgxMjAwLCAiVHJ1ZVR5cGUgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggVHlwZTEsICAgIDB4MTMwMCwgIlR5cGUgMSBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBUeXBlNDIsICAgMHgxNDAwLCAiVHlwZSA0MiBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBXaW5mb250cywgMHgxNTAwLCAiV2luZG93cyBGT04vRk5UIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEdYdmFsaWQsICAweDE2MDAsICJHWCB2YWxpZGF0aW9uIG1vZHVsZSIgKQotCi0KLSNpZmRlZiBGVF9NT0RFUlJfRU5EX0xJU1QKLSAgRlRfTU9ERVJSX0VORF9MSVNUCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBDTEVBTlVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBGVF9ORUVEX0VYVEVSTl9DCi0gIH0KLSNlbmRpZgotCi0jdW5kZWYgRlRfTU9ERVJSX1NUQVJUX0xJU1QKLSN1bmRlZiBGVF9NT0RFUlJfRU5EX0xJU1QKLSN1bmRlZiBGVF9NT0RFUlJERUYKLSN1bmRlZiBGVF9ORUVEX0VYVEVSTl9DCi0KLQotI2VuZGlmIC8qIEZUTU9ERVJSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3R2YWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRvdHZhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQyN2NmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRvdHZhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0b3R2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIHZhbGlkYXRpbmcgT3BlblR5cGUgdGFibGVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogV2FybmluZzogVGhpcyBtb2R1bGUgbWlnaHQgYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgbGlicmFyeSBpbiB0aGUgICAgICAgKi8KLS8qICAgICAgICAgIGZ1dHVyZSB0byBhdm9pZCBhIHRpZ2h0IGRlcGVuZGVuY3kgYmV0d2VlbiBGcmVlVHlwZSBhbmQgdGhlICAgICovCi0vKiAgICAgICAgICBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRPVFZBTF9IXwotI2RlZmluZSBGVE9UVkFMX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG90X3ZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9wZW5UeXBlIFZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEFQSSB0byB2YWxpZGF0ZSBPcGVuVHlwZSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zIHRvIHZhbGlkYXRlICAgICAqLwotICAvKiAgICBzb21lIE9wZW5UeXBlIHRhYmxlcyAoQkFTRSwgR0RFRiwgR1BPUywgR1NVQiwgSlNURiwgTUFUSCkuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuVHlwZV9WYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3BlblR5cGVfRnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WQUxJREFURV9PVFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGVudW06Ci0gICogICAgRlRfVkFMSURBVEVfT1RYWFgKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBBIGxpc3Qgb2YgYml0LWZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGggQEZUX09wZW5UeXBlX1ZhbGlkYXRlIHRvCi0gICogICAgaW5kaWNhdGUgd2hpY2ggT3BlblR5cGUgdGFibGVzIHNob3VsZCBiZSB2YWxpZGF0ZWQuCi0gICoKLSAgKiBAdmFsdWVzOgotICAqICAgIEZUX1ZBTElEQVRFX0JBU0UgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEJBU0UgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9HREVGIDo6Ci0gICogICAgICBWYWxpZGF0ZSBHREVGIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfR1BPUyA6OgotICAqICAgICAgVmFsaWRhdGUgR1BPUyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0dTVUIgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEdTVUIgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9KU1RGIDo6Ci0gICogICAgICBWYWxpZGF0ZSBKU1RGIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfTUFUSCA6OgotICAqICAgICAgVmFsaWRhdGUgTUFUSCB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX09UIDo6Ci0gICogICAgICBWYWxpZGF0ZSBhbGwgT3BlblR5cGUgdGFibGVzIChCQVNFLCBHREVGLCBHUE9TLCBHU1VCLCBKU1RGLCBNQVRIKS4KLSAgKgotICAqLwotI2RlZmluZSBGVF9WQUxJREFURV9CQVNFICAweDAxMDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfR0RFRiAgMHgwMjAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dQT1MgIDB4MDQwMAotI2RlZmluZSBGVF9WQUxJREFURV9HU1VCICAweDA4MDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfSlNURiAgMHgxMDAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX01BVEggIDB4MjAwMAotCi0jZGVmaW5lIEZUX1ZBTElEQVRFX09UICAoIEZUX1ZBTElEQVRFX0JBU0UgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0dERUYgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0dQT1MgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0dTVUIgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0pTVEYgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX01BVEggKQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9PcGVuVHlwZV9WYWxpZGF0ZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFZhbGlkYXRlIHZhcmlvdXMgT3BlblR5cGUgdGFibGVzIHRvIGFzc3VyZSB0aGF0IGFsbCBvZmZzZXRzIGFuZAotICAqICAgIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHRoYXQKLSAgKiAgICBhY3R1YWxseSBkb2VzIHRoZSB0ZXh0IGxheW91dCBjYW4gYWNjZXNzIHRob3NlIHRhYmxlcyB3aXRob3V0Ci0gICogICAgZXJyb3IgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgotICAqICAgICAgIEEgYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZSB0YWJsZXMgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCi0gICogICAgICAgQEZUX1ZBTElEQVRFX09UWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIEJBU0VfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEJBU0UgdGFibGUuCi0gICoKLSAgKiAgICBHREVGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBHREVGIHRhYmxlLgotICAqCi0gICogICAgR1BPU190YWJsZSA6OgotICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUgR1BPUyB0YWJsZS4KLSAgKgotICAqICAgIEdTVUJfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEdTVUIgdGFibGUuCi0gICoKLSAgKiAgICBKU1RGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBKU1RGIHRhYmxlLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIE9wZW5UeXBlIGZvbnRzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgKiAgIG90aGVyd2lzZS4KLSAgKgotICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGZpdmUgdGFibGVzIHdpdGgKLSAgKiAgIEBGVF9PcGVuVHlwZV9GcmVlLiAgQSBOVUxMIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIKLSAgKiAgIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIG9yIHRoZSBhcHBsaWNhdGlvbiBoYXNuJ3QgYXNrZWQgZm9yCi0gICogICB2YWxpZGF0aW9uLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3BlblR5cGVfVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqQkFTRV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR0RFRl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1BPU190YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1NVQl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqSlNURl90YWJsZSApOwotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9PcGVuVHlwZV9GcmVlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBPcGVuVHlwZSB2YWxpZGF0b3IuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdGFibGUgOjoKLSAgKiAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgaXMgYWxsb2NhdGVkIGJ5Ci0gICogICAgICAgQEZUX09wZW5UeXBlX1ZhbGlkYXRlLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0gICogICBARlRfT3BlblR5cGVfVmFsaWRhdGUgb25seS4KLSAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3BlblR5cGVfRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRPVFZBTF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmNzNlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG91dGxuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBmb3IgdGhlIEZUX091dGxpbmUgdHlwZSB1c2VkIHRvIHN0b3JlIGdseXBoIHNoYXBlcyBvZiAgICAgICAgKi8KLS8qICAgIG1vc3Qgc2NhbGFibGUgZm9udCBmb3JtYXRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUT1VUTE5fSF8KLSNkZWZpbmUgRlRPVVRMTl9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE91dGxpbmUgUHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZ1bmN0aW9ucyB0byBjcmVhdGUsIHRyYW5zZm9ybSwgYW5kIHJlbmRlciB2ZWN0b3JpYWwgZ2x5cGggaW1hZ2VzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyByb3V0aW5lcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBzY2FsYWJsZSAqLwotICAvKiAgICBnbHlwaCBpbWFnZXMga25vd24gYXMgYG91dGxpbmVzJy4gIFRoZXNlIGNhbiBhbHNvIGJlIG1lYXN1cmVkLCAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtZWQsIGFuZCBjb252ZXJ0ZWQgaW50byBiaXRtYXBzIGFuZCBwaXhtYXBzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9FbWJvbGRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9SZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTGluZVRvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcmllbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9EZWNvbXBvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2FsayBvdmVyIGFuIG91dGxpbmUncyBzdHJ1Y3R1cmUgdG8gZGVjb21wb3NlIGl0IGludG8gaW5kaXZpZHVhbCAgICovCi0gIC8qICAgIHNlZ21lbnRzIGFuZCBCw6l6aWVyIGFyY3MuICBUaGlzIGZ1bmN0aW9uIGFsc28gZW1pdHMgYG1vdmUgdG8nICAgICAgKi8KLSAgLyogICAgb3BlcmF0aW9ucyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgbmV3IGNvbnRvdXJzIGluIHRoZSBvdXRsaW5lLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdW5jX2ludGVyZmFjZSA6OiBBIHRhYmxlIG9mIGBlbWl0dGVycycsIGkuZS4sIGZ1bmN0aW9uIHBvaW50ZXJzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyBkZWNvbXBvc2l0aW9uIHRvIGluZGljYXRlIHBhdGggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byBlYWNoICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVyIGR1cmluZyB0aGUgZGVjb21wb3NpdGlvbi4gIEl0IGNhbiBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgZHVyaW5nIHRoZSAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY29udG91ciB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIHBvaW50IG9ubHkgaXMgcmVwcmVzZW50ZWQgYnkgYSAgICAqLwotICAvKiAgICBgbW92ZSB0bycgb3BlcmF0aW9uIGZvbGxvd2VkIGJ5IGBsaW5lIHRvJyB0byB0aGUgc2FtZSBwb2ludC4gIEluICAgKi8KLSAgLyogICAgbW9zdCBjYXNlcywgaXQgaXMgYmVzdCB0byBmaWx0ZXIgdGhpcyBvdXQgYmVmb3JlIHVzaW5nIHRoZSAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgZm9yIHN0cm9raW5nIHB1cnBvc2VzIChvdGhlcndpc2UgaXQgd291bGQgcmVzdWx0IGluIGEgICAgICAqLwotICAvKiAgICB2aXNpYmxlIGRvdCB3aGVuIHJvdW5kIGNhcHMgYXJlIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbWlsYXJseSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgc3VjY2VzcyBmb3IgYW4gZW1wdHkgb3V0bGluZSBhbHNvICAqLwotICAvKiAgICAoZG9pbmcgbm90aGluZywgdGhpcyBpcywgbm90IGNhbGxpbmcgYW55IGVtaXR0ZXIpOyBpZiBuZWNlc3NhcnksICAgKi8KLSAgLyogICAgeW91IHNob3VsZCBmaWx0ZXIgdGhpcyBvdXQsIHRvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9EZWNvbXBvc2UoIEZUX091dGxpbmUqICAgICAgICAgICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3V0bGluZV9GdW5jcyogIGZ1bmNfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgIHVzZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBvdXRsaW5lIG9mIGEgZ2l2ZW4gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdCBmcm9tIHdoZXJlIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGlzIGFsbG9jYXRlZC4gIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBuZXcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgb3V0bGluZSB3aWxsICpub3QqIG5lY2Vzc2FyaWx5IGJlICpmcmVlZCosIHdoZW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lpbmcgdGhlIGxpYnJhcnksIGJ5IEBGVF9Eb25lX0ZyZWVUeXBlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtUG9pbnRzICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIE11c3QgYmUgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRiAoNjU1MzUpLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtQ29udG91cnMgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIHdpdGhpbiB0aGUgb3V0bGluZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCB0byBgbnVtUG9pbnRzJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub3V0bGluZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZWFzb24gd2h5IHRoaXMgZnVuY3Rpb24gdGFrZXMgYSBgbGlicmFyeScgcGFyYW1ldGVyIGlzIHNpbXBseSAqLwotICAvKiAgICB0byB1c2UgdGhlIGxpYnJhcnkncyBtZW1vcnkgYWxsb2NhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX05ldyggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApOwotCi0KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfTmV3X0ludGVybmFsKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bVBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBudW1Db250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICphbm91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3kgYW4gb3V0bGluZSBjcmVhdGVkIHdpdGggQEZUX091dGxpbmVfTmV3LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0IHVzZWQgdG8gYWxsb2NhdGUgdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBvdXRsaW5lIG9iamVjdCB0byBiZSBkaXNjYXJkZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBvdXRsaW5lJ3MgYG93bmVyJyBmaWVsZCBpcyBub3Qgc2V0LCBvbmx5IHRoZSBvdXRsaW5lICAgICAgICAqLwotICAvKiAgICBkZXNjcmlwdG9yIHdpbGwgYmUgcmVsZWFzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZWFzb24gd2h5IHRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gYGxpYnJhcnknIHBhcmFtZXRlciBpcyAgICAgICAqLwotICAvKiAgICBzaW1wbHkgdG8gdXNlIGZ0X21lbV9mcmVlKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0RvbmUoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9Eb25lX0ludGVybmFsKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0NoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB0aGUgY29udGVudHMgb2YgYW4gb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbXB0eSBvdXRsaW5lLCBvciBhbiBvdXRsaW5lIHdpdGggYSBzaW5nbGUgcG9pbnQgb25seSBpcyBhbHNvICAgKi8KLSAgLyogICAgdmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9DaGVjayggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfR2V0X0NCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhbiBvdXRsaW5lJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwgICAqLwotICAvKiAgICB0aGUgb3V0bGluZSdzIHBvaW50cywgaW5jbHVkaW5nIELDqXppZXIgY29udHJvbCBwb2ludHMuICBUaG91Z2ggaXQgICovCi0gIC8qICAgIGNvaW5jaWRlcyB3aXRoIHRoZSBleGFjdCBib3VuZGluZyBib3ggZm9yIG1vc3QgZ2x5cGhzLCBpdCBjYW4gYmUgICAqLwotICAvKiAgICBzbGlnaHRseSBsYXJnZXIgaW4gc29tZSBzaXR1YXRpb25zIChsaWtlIHdoZW4gcm90YXRpbmcgYW4gb3V0bGluZSAgKi8KLSAgLyogICAgdGhhdCBjb250YWlucyBCw6l6aWVyIG91dHNpZGUgYXJjcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0aW5nIHRoZSBjb250cm9sIGJveCBpcyB2ZXJ5IGZhc3QsIHdoaWxlIGdldHRpbmcgdGhlIGJvdW5kaW5nICovCi0gIC8qICAgIGJveCBjYW4gdGFrZSBtdWNoIG1vcmUgdGltZSBhcyBpdCBuZWVkcyB0byB3YWxrIG92ZXIgYWxsIHNlZ21lbnRzICAqLwotICAvKiAgICBhbmQgYXJjcyBpbiB0aGUgb3V0bGluZS4gIFRvIGdldCB0aGUgbGF0dGVyLCB5b3UgY2FuIHVzZSB0aGUgICAgICAgKi8KLSAgLyogICAgYGZ0YmJveCcgY29tcG9uZW50LCB3aGljaCBpcyBkZWRpY2F0ZWQgdG8gdGhpcyBzaW5nbGUgdGFzay4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNib3ggICA6OiBUaGUgb3V0bGluZSdzIGNvbnRyb2wgYm94LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9HbHlwaF9HZXRfQ0JveCBmb3IgYSBkaXNjdXNzaW9uIG9mIHRyaWNreSBmb250cy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9PdXRsaW5lX0dldF9DQm94KCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCAgICAgICAgICAgKmFjYm94ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcHBseSBhIHNpbXBsZSB0cmFuc2xhdGlvbiB0byB0aGUgcG9pbnRzIG9mIGFuIG91dGxpbmUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4T2Zmc2V0IDo6IFRoZSBob3Jpem9udGFsIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlPZmZzZXQgOjogVGhlIHZlcnRpY2FsIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgICAgIHhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgeU9mZnNldCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29weSBhbiBvdXRsaW5lIGludG8gYW5vdGhlciBvbmUuICBCb3RoIG9iamVjdHMgbXVzdCBoYXZlIHRoZSAgICAgICovCi0gIC8qICAgIHNhbWUgc2l6ZXMgKG51bWJlciBvZiBwb2ludHMgJiBudW1iZXIgb2YgY29udG91cnMpIHdoZW4gdGhpcyAgICAgICAqLwotICAvKiAgICBmdW5jdGlvbiBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3VyY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YXJnZXQgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0NvcHkoIGNvbnN0IEZUX091dGxpbmUqICBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgICAgICAgKnRhcmdldCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXBwbHkgYSBzaW1wbGUgMngyIG1hdHJpeCB0byBhbGwgb2YgYW4gb3V0bGluZSdzIHBvaW50cy4gIFVzZWZ1bCAgICovCi0gIC8qICAgIGZvciBhcHBseWluZyByb3RhdGlvbnMsIHNsYW50aW5nLCBmbGlwcGluZywgZXRjLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hdHJpeCAgOjogQSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBjYW4gdXNlIEBGVF9PdXRsaW5lX1RyYW5zbGF0ZSBpZiB5b3UgbmVlZCB0byB0cmFuc2xhdGUgdGhlICAgICAqLwotICAvKiAgICBvdXRsaW5lJ3MgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX091dGxpbmVfVHJhbnNmb3JtKCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogICBtYXRyaXggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVtYm9sZGVuIGFuIG91dGxpbmUuICBUaGUgbmV3IG91dGxpbmUgd2lsbCBiZSBhdCBtb3N0IDR+dGltZXMgICAgICAqLwotICAvKiAgICBgc3RyZW5ndGgnIHBpeGVscyB3aWRlciBhbmQgaGlnaGVyLiAgWW91IG1heSB0aGluayBvZiB0aGUgbGVmdCBhbmQgKi8KLSAgLyogICAgYm90dG9tIGJvcmRlcnMgYXMgdW5jaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOZWdhdGl2ZSBgc3RyZW5ndGgnIHZhbHVlcyB0byByZWR1Y2UgdGhlIG91dGxpbmUgdGhpY2tuZXNzIGFyZSAgICAgKi8KLSAgLyogICAgcG9zc2libGUgYWxzby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZW5ndGggOjogSG93IHN0cm9uZyB0aGUgZ2x5cGggaXMgZW1ib2xkZW5lZC4gIEV4cHJlc3NlZCBpbiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSB1c2VkIGFsZ29yaXRobSB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgdGhpY2tuZXNzIG9mIHRoZSAgICAqLwotICAvKiAgICBnbHlwaCBkb2Vzbid0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIHBvaW50czsgdGhpcyBtZWFucyB0aGF0IGNlcnRhaW4gKi8KLSAgLyogICAgc2l0dWF0aW9ucyBsaWtlIGFjdXRlIGFuZ2xlcyBvciBpbnRlcnNlY3Rpb25zIGFyZSBzb21ldGltZXMgICAgICAgICovCi0gIC8qICAgIGhhbmRsZWQgaW5jb3JyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgeW91IG5lZWQgYGJldHRlcicgbWV0cmljcyB2YWx1ZXMgeW91IHNob3VsZCBjYWxsICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9PdXRsaW5lX0dldF9DQm94IG9yIEBGVF9PdXRsaW5lX0dldF9CQm94LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXhhbXBsZSBjYWxsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCBpbmRleCwgRlRfTE9BRF9ERUZBVUxUICk7ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaWYgKCBmYWNlLT5nbHlwaC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfT3V0bGluZV9FbWJvbGRlbiggJmZhY2UtPmdseXBoLT5vdXRsaW5lLCBzdHJlbmd0aCApOyAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgbWVhbmluZ2Z1bCByZXN1bHRzLCBmb250IHNjYWxpbmcgdmFsdWVzIG11c3QgYmUgc2V0IHdpdGggICAgKi8KLSAgLyogICAgZnVuY3Rpb25zIGxpa2UgQEZUX1NldF9DaGFyX1NpemUgYmVmb3JlIGNhbGxpbmcgRlRfUmVuZGVyX0dseXBoLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9FbWJvbGRlbiggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICBzdHJlbmd0aCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9FbWJvbGRlblhZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW1ib2xkZW4gYW4gb3V0bGluZS4gIFRoZSBuZXcgb3V0bGluZSB3aWxsIGJlIGB4c3RyZW5ndGgnIHBpeGVscyAgICovCi0gIC8qICAgIHdpZGVyIGFuZCBgeXN0cmVuZ3RoJyBwaXhlbHMgaGlnaGVyLiAgT3RoZXJ3aXNlLCBpdCBpcyBzaW1pbGFyIHRvICAqLwotICAvKiAgICBARlRfT3V0bGluZV9FbWJvbGRlbiwgd2hpY2ggdXNlcyB0aGUgc2FtZSBzdHJlbmd0aCBpbiBib3RoICAgICAgICAgKi8KLSAgLyogICAgZGlyZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9FbWJvbGRlblhZKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgeHN0cmVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICB5c3RyZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfUmV2ZXJzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldmVyc2UgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGFuIG91dGxpbmUuICBUaGlzIGlzIHVzZWQgdG8gICAgICAqLwotICAvKiAgICBlbnN1cmUgY29uc2lzdGVudCBmaWxsIGNvbnZlbnRpb25zIGZvciBtaXJyb3JlZCBnbHlwaHMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHRvZ2dsZXMgdGhlIGJpdCBmbGFnIEBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTCBpbiAgICAgKi8KLSAgLyogICAgdGhlIG91dGxpbmUncyBgZmxhZ3MnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBzaG91bGRuJ3QgYmUgdXNlZCBieSBhIG5vcm1hbCBjbGllbnQgYXBwbGljYXRpb24sIHVubGVzcyBpdCAgICAgKi8KLSAgLyogICAga25vd3Mgd2hhdCBpdCBpcyBkb2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9PdXRsaW5lX1JldmVyc2UoIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXIgYW4gb3V0bGluZSB3aXRoaW4gYSBiaXRtYXAuICBUaGUgb3V0bGluZSdzIGltYWdlIGlzIHNpbXBseSAgKi8KLSAgLyogICAgT1ItZWQgdG8gdGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYml0bWFwIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGJpdG1hcCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIENSRUFURSB0aGUgYml0bWFwLCBpdCBvbmx5IHJlbmRlcnMgYW4gICAgICAgKi8KLSAgLyogICAgb3V0bGluZSBpbWFnZSB3aXRoaW4gdGhlIG9uZSB5b3UgcGFzcyB0byBpdCEgIENvbnNlcXVlbnRseSwgdGhlICAgICovCi0gIC8qICAgIHZhcmlvdXMgZmllbGRzIGluIGBhYml0bWFwJyBzaG91bGQgYmUgc2V0IGFjY29yZGluZ2x5LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgd2lsbCB1c2UgdGhlIHJhc3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZWZhdWx0IGdseXBoIGZvcm1hdC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdmFsdWUgb2YgdGhlIGBudW1fZ3JheXMnIGZpZWxkIGluIGBhYml0bWFwJyBpcyBpZ25vcmVkLiAgSWYgICAgKi8KLSAgLyogICAgeW91IHNlbGVjdCB0aGUgZ3JheS1sZXZlbCByYXN0ZXJpemVyLCBhbmQgeW91IHdhbnQgbGVzcyB0aGFuIDI1NiAgICovCi0gIC8qICAgIGdyYXkgbGV2ZWxzLCB5b3UgaGF2ZSB0byB1c2UgQEZUX091dGxpbmVfUmVuZGVyIGRpcmVjdGx5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfR2V0X0JpdG1hcCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKmFiaXRtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfUmVuZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlciBhbiBvdXRsaW5lIHdpdGhpbiBhIGJpdG1hcCB1c2luZyB0aGUgY3VycmVudCBzY2FuLWNvbnZlcnQuICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIGFzIGFuIGFyZ3VtZW50LCAgKi8KLSAgLyogICAgYWxsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgbGlrZSBkaXJlY3QgY29tcG9zaXRpb24sIHRyYW5zbHVjZW5jeSwgICovCi0gIC8qICAgIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICA6OiBBIHBvaW50ZXIgdG8gYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gICAgICovCi0gIC8qICAgICAgICAgICAgICAgZGVzY3JpYmUgdGhlIHJlbmRlcmluZyBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgYW5kIGhvdyBARlRfUmFzdGVyX1BhcmFtcyB3b3JrcyAqLwotICAvKiAgICB0byB1c2UgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmaWVsZCBgcGFyYW1zLnNvdXJjZScgd2lsbCBiZSBzZXQgdG8gYG91dGxpbmUnIGJlZm9yZSB0aGUgc2NhbiAqLwotICAvKiAgICBjb252ZXJ0ZXIgaXMgY2FsbGVkLCB3aGljaCBtZWFucyB0aGF0IHRoZSB2YWx1ZSB5b3UgZ2l2ZSB0byBpdCBpcyAgKi8KLSAgLyogICAgYWN0dWFsbHkgaWdub3JlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ3JheS1sZXZlbCByYXN0ZXJpemVyIGFsd2F5cyB1c2VzIDI1NiBncmF5IGxldmVscy4gIElmIHlvdSAgICAgKi8KLSAgLyogICAgd2FudCBsZXNzIGdyYXkgbGV2ZWxzLCB5b3UgaGF2ZSB0byBwcm92aWRlIHlvdXIgb3duIHNwYW4gY2FsbGJhY2suICovCi0gIC8qICAgIFNlZSB0aGUgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCB2YWx1ZSBvZiB0aGUgYGZsYWdzJyBmaWVsZCBpbiB0aGUgICAqLwotICAvKiAgICBARlRfUmFzdGVyX1BhcmFtcyBzdHJ1Y3R1cmUgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX1JlbmRlciggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZW51bToKLSAgKiAgIEZUX09yaWVudGF0aW9uCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBBIGxpc3Qgb2YgdmFsdWVzIHVzZWQgdG8gZGVzY3JpYmUgYW4gb3V0bGluZSdzIGNvbnRvdXIgb3JpZW50YXRpb24uCi0gICoKLSAgKiAgIFRoZSBUcnVlVHlwZSBhbmQgUG9zdFNjcmlwdCBzcGVjaWZpY2F0aW9ucyB1c2UgZGlmZmVyZW50IGNvbnZlbnRpb25zCi0gICogICB0byBkZXRlcm1pbmUgd2hldGhlciBvdXRsaW5lIGNvbnRvdXJzIHNob3VsZCBiZSBmaWxsZWQgb3IgdW5maWxsZWQuCi0gICoKLSAgKiBAdmFsdWVzOgotICAqICAgRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgOjoKLSAgKiAgICAgQWNjb3JkaW5nIHRvIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLCBjbG9ja3dpc2UgY29udG91cnMgbXVzdAotICAqICAgICBiZSBmaWxsZWQsIGFuZCBjb3VudGVyLWNsb2Nrd2lzZSBvbmVzIG11c3QgYmUgdW5maWxsZWQuCi0gICoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQgOjoKLSAgKiAgICAgQWNjb3JkaW5nIHRvIHRoZSBQb3N0U2NyaXB0IHNwZWNpZmljYXRpb24sIGNvdW50ZXItY2xvY2t3aXNlIGNvbnRvdXJzCi0gICogICAgIG11c3QgYmUgZmlsbGVkLCBhbmQgY2xvY2t3aXNlIG9uZXMgbXVzdCBiZSB1bmZpbGxlZC4KLSAgKgotICAqICAgRlRfT1JJRU5UQVRJT05fRklMTF9SSUdIVCA6OgotICAqICAgICBUaGlzIGlzIGlkZW50aWNhbCB0byBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUsIGJ1dCBpcyB1c2VkIHRvCi0gICogICAgIHJlbWVtYmVyIHRoYXQgaW4gVHJ1ZVR5cGUsIGV2ZXJ5dGhpbmcgdGhhdCBpcyB0byB0aGUgcmlnaHQgb2YKLSAgKiAgICAgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGEgY29udG91ciBtdXN0IGJlIGZpbGxlZC4KLSAgKgotICAqICAgRlRfT1JJRU5UQVRJT05fRklMTF9MRUZUIDo6Ci0gICogICAgIFRoaXMgaXMgaWRlbnRpY2FsIHRvIEBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBULCBidXQgaXMgdXNlZCB0bwotICAqICAgICByZW1lbWJlciB0aGF0IGluIFBvc3RTY3JpcHQsIGV2ZXJ5dGhpbmcgdGhhdCBpcyB0byB0aGUgbGVmdCBvZgotICAqICAgICB0aGUgZHJhd2luZyBkaXJlY3Rpb24gb2YgYSBjb250b3VyIG11c3QgYmUgZmlsbGVkLgotICAqCi0gICogICBGVF9PUklFTlRBVElPTl9OT05FIDo6Ci0gICogICAgIFRoZSBvcmllbnRhdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gIFRoYXQgaXMsIGRpZmZlcmVudCBwYXJ0cyBvZgotICAqICAgICB0aGUgZ2x5cGggaGF2ZSBkaWZmZXJlbnQgb3JpZW50YXRpb24uCi0gICoKLSAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9PcmllbnRhdGlvbl8KLSAgewotICAgIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFICAgPSAwLAotICAgIEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQgPSAxLAotICAgIEZUX09SSUVOVEFUSU9OX0ZJTExfUklHSFQgPSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSwKLSAgICBGVF9PUklFTlRBVElPTl9GSUxMX0xFRlQgID0gRlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCwKLSAgICBGVF9PUklFTlRBVElPTl9OT05FCi0KLSAgfSBGVF9PcmllbnRhdGlvbjsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgVGhpcyBmdW5jdGlvbiBhbmFseXplcyBhIGdseXBoIG91dGxpbmUgYW5kIHRyaWVzIHRvIGNvbXB1dGUgaXRzCi0gICogICBmaWxsIG9yaWVudGF0aW9uIChzZWUgQEZUX09yaWVudGF0aW9uKS4gIFRoaXMgaXMgZG9uZSBieSBpbnRlZ3JhdGluZwotICAqICAgdGhlIHRvdGFsIGFyZWEgY292ZXJlZCBieSB0aGUgb3V0bGluZS4gVGhlIHBvc2l0aXZlIGludGVncmFsCi0gICogICBjb3JyZXNwb25kcyB0byB0aGUgY2xvY2t3aXNlIG9yaWVudGF0aW9uIGFuZCBARlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVAotICAqICAgaXMgcmV0dXJuZWQuIFRoZSBuZWdhdGl2ZSBpbnRlZ3JhbCBjb3JyZXNwb25kcyB0byB0aGUgY291bnRlci1jbG9ja3dpc2UKLSAgKiAgIG9yaWVudGF0aW9uIGFuZCBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgaXMgcmV0dXJuZWQuCi0gICoKLSAgKiAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmV0dXJuIEBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSBmb3IgZW1wdHkKLSAgKiAgIG91dGxpbmVzLgotICAqCi0gICogQGlucHV0OgotICAqICAgb3V0bGluZSA6OgotICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIG91dGxpbmUuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgVGhlIG9yaWVudGF0aW9uLgotICAqCi0gICovCi0gIEZUX0VYUE9SVCggRlRfT3JpZW50YXRpb24gKQotICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUT1VUTE5fSF8gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGNmZHJ2LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGNmZHJ2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MjJjOTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHBjZmRydi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cGNmZHJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBQQ0YgZHJpdmVyIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVFBDRkRSVl9IXwotI2RlZmluZSBGVFBDRkRSVl9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgcGNmX2RyaXZlcgotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgVGhlIFBDRiBkcml2ZXIKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIENvbnRyb2xsaW5nIHRoZSBQQ0YgZHJpdmVyIG1vZHVsZS4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFdoaWxlIEZyZWVUeXBlJ3MgUENGIGRyaXZlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5IGl0c2VsZiwKLSAgICogICBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0IGFuZAotICAgKiAgIEBGVF9Qcm9wZXJ0eV9HZXQuICBSaWdodCBub3csIHRoZXJlIGlzIGEgc2luZ2xlIHByb3BlcnR5Ci0gICAqICAgYG5vLWxvbmctZmFtaWx5LW5hbWVzJyBhdmFpbGFibGUgaWYgRnJlZVR5cGUgaXMgY29tcGlsZWQgd2l0aAotICAgKiAgIFBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTLgotICAgKgotICAgKiAgIFRoZSBQQ0YgZHJpdmVyJ3MgbW9kdWxlIG5hbWUgaXMgYHBjZicuCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICBuby1sb25nLWZhbWlseS1uYW1lcwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgSWYgUENGX0NPTkZJR19PUFRJT05fTE9OR19GQU1JTFlfTkFNRVMgaXMgYWN0aXZlIHdoaWxlIGNvbXBpbGluZwotICAgKiAgIEZyZWVUeXBlLCB0aGUgUENGIGRyaXZlciBjb25zdHJ1Y3RzIGxvbmcgZmFtaWx5IG5hbWVzLgotICAgKgotICAgKiAgIFRoZXJlIGFyZSBtYW55IFBDRiBmb250cyBqdXN0IGNhbGxlZCBgRml4ZWQnIHdoaWNoIGxvb2sgY29tcGxldGVseQotICAgKiAgIGRpZmZlcmVudCwgYW5kIHdoaWNoIGhhdmUgbm90aGluZyB0byBkbyB3aXRoIGVhY2ggb3RoZXIuICBXaGVuCi0gICAqICAgc2VsZWN0aW5nIGBGaXhlZCcgaW4gS0RFIG9yIEdub21lIG9uZSBnZXRzIHJlc3VsdHMgdGhhdCBhcHBlYXIgcmF0aGVyCi0gICAqICAgcmFuZG9tLCB0aGUgc3R5bGUgY2hhbmdlcyBvZnRlbiBpZiBvbmUgY2hhbmdlcyB0aGUgc2l6ZSBhbmQgb25lCi0gICAqICAgY2Fubm90IHNlbGVjdCBzb21lIGZvbnRzIGF0IGFsbC4gIFRoZSBpbXByb3ZlIHRoaXMgc2l0dWF0aW9uLCB0aGUgUENGCi0gICAqICAgbW9kdWxlIHByZXBlbmRzIHRoZSBmb3VuZHJ5IG5hbWUgKHBsdXMgYSBzcGFjZSkgdG8gdGhlIGZhbWlseSBuYW1lLiAKLSAgICogICBJdCBhbHNvIGNoZWNrcyB3aGV0aGVyIHRoZXJlIGFyZSBgd2lkZScgY2hhcmFjdGVyczsgYWxsIHB1dCB0b2dldGhlciwKLSAgICogICBmYW1pbHkgbmFtZXMgbGlrZSBgU29ueSBGaXhlZCcgb3IgYE1pc2MgRml4ZWQgV2lkZScgYXJlIGNvbnN0cnVjdGVkLgotICAgKgotICAgKiAgIElmIGBuby1sb25nLWZhbWlseS1uYW1lcycgaXMgc2V0LCB0aGlzIGZlYXR1cmUgZ2V0cyBzd2l0Y2hlZCBvZmYuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX0Jvb2wgICAgIG5vX2xvbmdfZmFtaWx5X25hbWVzID0gVFJVRTsKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJwY2YiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8tbG9uZy1mYW1pbHktbmFtZXMiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9fbG9uZ19mYW1pbHlfbmFtZXMgKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgc2V0IHZpYSB0aGUgYEZSRUVUWVBFX1BST1BFUlRJRVMnIGVudmlyb25tZW50Ci0gICAqICAgdmFyaWFibGUgKHVzaW5nIHZhbHVlcyAxIGFuZCAwIGZvciBgb24nIGFuZCBgb2ZmJywgcmVzcGVjdGl2ZWx5KS4KLSAgICoKLSAgICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBGVFBDRkRSVl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHBmci5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHBmci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmE2YWU5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRwZnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBmci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgUEZSLXNwZWNpZmljIGRhdGEgKHNwZWNpZmljYXRpb24gb25seSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRQRlJfSF8KLSNkZWZpbmUgRlRQRlJfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGZyX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUEZSIEZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUEZSL1RydWVEb2Mgc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBQRlItc3BlY2lmaWMgZnVuY3Rpb25zLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfUEZSX01ldHJpY3MKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXR1cm4gdGhlIG91dGxpbmUgYW5kIG1ldHJpY3MgcmVzb2x1dGlvbnMgb2YgYSBnaXZlbiBQRlIgZmFjZS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6IEhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4gIEl0IGNhbiBiZSBhIG5vbi1QRlIgZmFjZS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYW91dGxpbmVfcmVzb2x1dGlvbiA6OgotICAqICAgICAgT3V0bGluZSByZXNvbHV0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBmYWNlLT51bml0c19wZXJfRU0nCi0gICogICAgICBmb3Igbm9uLVBGUiBmb250cy4gIE9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogICAgYW1ldHJpY3NfcmVzb2x1dGlvbiA6OgotICAqICAgICAgTWV0cmljcyByZXNvbHV0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBvdXRsaW5lX3Jlc29sdXRpb24nCi0gICogICAgICBmb3Igbm9uLVBGUiBmb250cy4gIE9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogICAgYW1ldHJpY3NfeF9zY2FsZSA6OgotICAqICAgICAgQSAxNi4xNiBmaXhlZC1wb2ludCBudW1iZXIgdXNlZCB0byBzY2FsZSBkaXN0YW5jZSBleHByZXNzZWQKLSAgKiAgICAgIGluIG1ldHJpY3MgdW5pdHMgdG8gZGV2aWNlIHN1Yi1waXhlbHMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgKiAgICAgIGBmYWNlLT5zaXplLT54X3NjYWxlJywgYnV0IGZvciBtZXRyaWNzIG9ubHkuICBPcHRpb25hbCAocGFyYW1ldGVyCi0gICogICAgICBjYW4gYmUgTlVMTCkuCi0gICoKLSAgKiAgICBhbWV0cmljc195X3NjYWxlIDo6Ci0gICogICAgICBTYW1lIGFzIGBhbWV0cmljc194X3NjYWxlJyBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICogICAgICBvcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBOVUxMKS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgSWYgdGhlIGlucHV0IGZhY2UgaXMgbm90IGEgUEZSLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVycm9yLgotICAqICAgSG93ZXZlciwgaW4gYWxsIGNhc2VzLCBpdCB3aWxsIHJldHVybiB2YWxpZCB2YWx1ZXMuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUEZSX01ldHJpY3MoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFvdXRsaW5lX3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphbWV0cmljc19yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYW1ldHJpY3NfeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmFtZXRyaWNzX3lfc2NhbGUgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfUEZSX0tlcm5pbmcKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXR1cm4gdGhlIGtlcm5pbmcgcGFpciBjb3JyZXNwb25kaW5nIHRvIHR3byBnbHlwaHMgaW4gYSBQRlIgZmFjZS4KLSAgKiAgICBUaGUgZGlzdGFuY2UgaXMgZXhwcmVzc2VkIGluIG1ldHJpY3MgdW5pdHMsIHVubGlrZSB0aGUgcmVzdWx0IG9mCi0gICogICAgQEZUX0dldF9LZXJuaW5nLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgbGVmdCAgOjogSW5kZXggb2YgdGhlIGxlZnQgZ2x5cGguCi0gICoKLSAgKiAgICByaWdodCA6OiBJbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGguCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGF2ZWN0b3IgOjogQSBrZXJuaW5nIHZlY3Rvci4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybiBkaXN0YW5jZXMgaW4gb3JpZ2luYWwgUEZSIG1ldHJpY3MKLSAgKiAgICB1bml0cy4gIFRoaXMgaXMgdW5saWtlIEBGVF9HZXRfS2VybmluZyB3aXRoIHRoZSBARlRfS0VSTklOR19VTlNDQUxFRAotICAqICAgIG1vZGUsIHdoaWNoIGFsd2F5cyByZXR1cm5zIGRpc3RhbmNlcyBjb252ZXJ0ZWQgdG8gb3V0bGluZSB1bml0cy4KLSAgKgotICAqICAgIFlvdSBjYW4gdXNlIHRoZSB2YWx1ZSBvZiB0aGUgYHhfc2NhbGUnIGFuZCBgeV9zY2FsZScgcGFyYW1ldGVycwotICAqICAgIHJldHVybmVkIGJ5IEBGVF9HZXRfUEZSX01ldHJpY3MgdG8gc2NhbGUgdGhlc2UgdG8gZGV2aWNlIHN1Yi1waXhlbHMuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUEZSX0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICphdmVjdG9yICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfR2V0X1BGUl9BZHZhbmNlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgUmV0dXJuIGEgZ2l2ZW4gZ2x5cGggYWR2YW5jZSwgZXhwcmVzc2VkIGluIG9yaWdpbmFsIG1ldHJpY3MgdW5pdHMsCi0gICogICAgZnJvbSBhIFBGUiBmb250LgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIGdpbmRleCA6OiBUaGUgZ2x5cGggaW5kZXguCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGFhZHZhbmNlIDo6IFRoZSBnbHlwaCBhZHZhbmNlIGluIG1ldHJpY3MgdW5pdHMuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgICBZb3UgY2FuIHVzZSB0aGUgYHhfc2NhbGUnIG9yIGB5X3NjYWxlJyByZXN1bHRzIG9mIEBGVF9HZXRfUEZSX01ldHJpY3MKLSAgKiAgICB0byBjb252ZXJ0IHRoZSBhZHZhbmNlIHRvIGRldmljZSBzdWItcGl4ZWxzIChpLmUuLCAxLzY0dGggb2YgcGl4ZWxzKS4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9QRlJfQWR2YW5jZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAqYWFkdmFuY2UgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUUEZSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDgzNzUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmVuZGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSByZW5kZXJlciBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVFJFTkRFUl9IXwotI2RlZmluZSBGVFJFTkRFUl9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLSNpbmNsdWRlIEZUX0dMWVBIX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBjcmVhdGUgYSBuZXcgZ2x5cGggb2JqZWN0ICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HbHlwaF9Jbml0RnVuYykoIEZUX0dseXBoICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotICAvKiBkZXN0cm95cyBhIGdpdmVuIGdseXBoIG9iamVjdCAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9HbHlwaF9Eb25lRnVuYykoIEZUX0dseXBoICBnbHlwaCApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0dseXBoX1RyYW5zZm9ybUZ1bmMpKCBGVF9HbHlwaCAgICAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBkZWx0YSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0dseXBoX0dldEJCb3hGdW5jKSggRlRfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogIGFiYm94ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0dseXBoX0NvcHlGdW5jKSggRlRfR2x5cGggICBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgIHRhcmdldCApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HbHlwaF9QcmVwYXJlRnVuYykoIEZUX0dseXBoICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBGVF9HbHlwaF9Jbml0X0Z1bmMgICAgICAgRlRfR2x5cGhfSW5pdEZ1bmMKLSNkZWZpbmUgRlRfR2x5cGhfRG9uZV9GdW5jICAgICAgIEZUX0dseXBoX0RvbmVGdW5jCi0jZGVmaW5lIEZUX0dseXBoX1RyYW5zZm9ybV9GdW5jICBGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jCi0jZGVmaW5lIEZUX0dseXBoX0JCb3hfRnVuYyAgICAgICBGVF9HbHlwaF9HZXRCQm94RnVuYwotI2RlZmluZSBGVF9HbHlwaF9Db3B5X0Z1bmMgICAgICAgRlRfR2x5cGhfQ29weUZ1bmMKLSNkZWZpbmUgRlRfR2x5cGhfUHJlcGFyZV9GdW5jICAgIEZUX0dseXBoX1ByZXBhcmVGdW5jCi0KLQotICBzdHJ1Y3QgIEZUX0dseXBoX0NsYXNzXwotICB7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgZ2x5cGhfc2l6ZTsKLSAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICBnbHlwaF9mb3JtYXQ7Ci0KLSAgICBGVF9HbHlwaF9Jbml0RnVuYyAgICAgICBnbHlwaF9pbml0OwotICAgIEZUX0dseXBoX0RvbmVGdW5jICAgICAgIGdseXBoX2RvbmU7Ci0gICAgRlRfR2x5cGhfQ29weUZ1bmMgICAgICAgZ2x5cGhfY29weTsKLSAgICBGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jICBnbHlwaF90cmFuc2Zvcm07Ci0gICAgRlRfR2x5cGhfR2V0QkJveEZ1bmMgICAgZ2x5cGhfYmJveDsKLSAgICBGVF9HbHlwaF9QcmVwYXJlRnVuYyAgICBnbHlwaF9wcmVwYXJlOwotICB9OwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1JlbmRlcmVyX1JlbmRlckZ1bmMpKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgb3JpZ2luICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMpKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBkZWx0YSApOwotCi0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMpKCBGVF9SZW5kZXJlciAgIHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogICAgICBjYm94ICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMpKCBGVF9SZW5kZXJlciAgcmVuZGVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgbW9kZV90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgbW9kZV9wdHIgKTsKLQotLyogZGVwcmVjYXRlZCBpZGVudGlmaWVycyAqLwotI2RlZmluZSBGVFJlbmRlcmVyX3JlbmRlciAgRlRfUmVuZGVyZXJfUmVuZGVyRnVuYwotI2RlZmluZSBGVFJlbmRlcmVyX3RyYW5zZm9ybSAgRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYwotI2RlZmluZSBGVFJlbmRlcmVyX2dldENCb3ggIEZUX1JlbmRlcmVyX0dldENCb3hGdW5jCi0jZGVmaW5lIEZUUmVuZGVyZXJfc2V0TW9kZSAgRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcmVyX0NsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZW5kZXJlciBtb2R1bGUgY2xhc3MgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICAgICAgICAgICA6OiBUaGUgcm9vdCBARlRfTW9kdWxlX0NsYXNzIGZpZWxkcy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfZm9ybWF0ICAgIDo6IFRoZSBnbHlwaCBpbWFnZSBmb3JtYXQgdGhpcyByZW5kZXJlciBoYW5kbGVzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZW5kZXJfZ2x5cGggICAgOjogQSBtZXRob2QgdXNlZCB0byByZW5kZXIgdGhlIGltYWdlIHRoYXQgaXMgaW4gYSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGdseXBoIHNsb3QgaW50byBhIGJpdG1hcC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1fZ2x5cGggOjogQSBtZXRob2QgdXNlZCB0byB0cmFuc2Zvcm0gdGhlIGltYWdlIHRoYXQgaXMgaW4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZXRfZ2x5cGhfY2JveCAgOjogQSBtZXRob2QgdXNlZCB0byBhY2Nlc3MgdGhlIGdseXBoJ3MgY2JveC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNldF9tb2RlICAgICAgICA6OiBBIG1ldGhvZCB1c2VkIHRvIHBhc3MgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyX2NsYXNzICAgIDo6IEZvciBARlRfR0xZUEhfRk9STUFUX09VVExJTkUgcmVuZGVyZXJzIG9ubHkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgcG9pbnRlciB0byBpdHMgcmFzdGVyJ3MgY2xhc3MuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1JlbmRlcmVyX0NsYXNzXwotICB7Ci0gICAgRlRfTW9kdWxlX0NsYXNzICAgICAgICAgICAgcm9vdDsKLQotICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgICAgIGdseXBoX2Zvcm1hdDsKLQotICAgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMgICAgIHJlbmRlcl9nbHlwaDsKLSAgICBGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jICB0cmFuc2Zvcm1fZ2x5cGg7Ci0gICAgRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMgICAgZ2V0X2dseXBoX2Nib3g7Ci0gICAgRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMgICAgc2V0X21vZGU7Ci0KLSAgICBGVF9SYXN0ZXJfRnVuY3MqICAgICAgICAgICByYXN0ZXJfY2xhc3M7Ci0KLSAgfSBGVF9SZW5kZXJlcl9DbGFzczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciBhIGdpdmVuIGdseXBoIGZvcm1hdC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0ICA6OiBUaGUgZ2x5cGggZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSByZW5kZXJlciBoYW5kbGUuICAwfmlmIG5vbmUgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIG1vZHVsZSBhbHJlYWR5IGV4aXN0cyBieSB0aGF0IG5hbWUsICovCi0gIC8qICAgIG9yIGlmIHRoZSBtb2R1bGUgcmVxdWlyZXMgYSB2ZXJzaW9uIG9mIEZyZWVUeXBlIHRoYXQgaXMgdG9vIGdyZWF0LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gYWRkIGEgbmV3IHJlbmRlcmVyLCBzaW1wbHkgdXNlIEBGVF9BZGRfTW9kdWxlLiAgVG8gcmV0cmlldmUgYSAgICovCi0gIC8qICAgIHJlbmRlcmVyIGJ5IGl0cyBuYW1lLCB1c2UgQEZUX0dldF9Nb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9SZW5kZXJlciApCi0gIEZUX0dldF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX0Zvcm1hdCAgZm9ybWF0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXQgdGhlIGN1cnJlbnQgcmVuZGVyZXIgdG8gdXNlLCBhbmQgc2V0IGFkZGl0aW9uYWwgbW9kZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZW5kZXJlciAgIDo6IEEgaGFuZGxlIHRvIHRoZSByZW5kZXJlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1ldGVycyA6OiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gY2FzZSBvZiBzdWNjZXNzLCB0aGUgcmVuZGVyZXIgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgZ2x5cGggICAgICovCi0gIC8qICAgIGltYWdlcyBpbiB0aGUgcmVuZGVyZXIncyBrbm93biBmb3JtYXQgaW50byBiaXRtYXBzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgY3VycmVudCByZW5kZXJlciBmb3Igb3RoZXIgZm9ybWF0cy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdXJyZW50bHksIG5vIEZyZWVUeXBlIHJlbmRlcmVyIG1vZHVsZSB1c2VzIGBwYXJhbWV0ZXJzJzsgeW91ICAgICAgKi8KLSAgLyogICAgc2hvdWxkIHRodXMgYWx3YXlzIHBhc3MgTlVMTCBhcyB0aGUgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1JlbmRlcmVyKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcmVyICAgIHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1ldGVycyApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRSRU5ERVJfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzaXplcy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHNpemVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMzk1OGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHNpemVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzaXplcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHNpemUgb2JqZWN0cyBtYW5hZ2VtZW50IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBub3JtYWxseSBub3QgbmVlZCB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLiAgICovCi0gIC8qIEhvd2V2ZXIsIHRoZXkgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhIHB1YmxpYyBBUEkgZm9yIHRoZSByYXJlIGNhc2VzICAgICAqLwotICAvKiB3aGVyZSB0aGV5IGFyZSBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRTSVpFU19IXwotI2RlZmluZSBGVFNJWkVTX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZXNfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2l6ZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFuYWdpbmcgbXVsdGlwbGUgc2l6ZXMgcGVyIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBjcmVhdGluZyBhIG5ldyBmYWNlIG9iamVjdCAoZS5nLiwgd2l0aCBARlRfTmV3X0ZhY2UpLCBhbiAgICAgICovCi0gIC8qICAgIEBGVF9TaXplIG9iamVjdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHVzZWQgdG8gc3RvcmUgYWxsICAgICAqLwotICAvKiAgICBwaXhlbC1zaXplIGRlcGVuZGVudCBpbmZvcm1hdGlvbiwgYXZhaWxhYmxlIGluIHRoZSBgZmFjZS0+c2l6ZScgICAgKi8KLSAgLyogICAgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBpcyBob3dldmVyIHBvc3NpYmxlIHRvIGNyZWF0ZSBtb3JlIHNpemVzIGZvciBhIGdpdmVuIGZhY2UsICAgICAgKi8KLSAgLyogICAgbW9zdGx5IGluIG9yZGVyIHRvIG1hbmFnZSBzZXZlcmFsIGNoYXJhY3RlciBwaXhlbCBzaXplcyBvZiB0aGUgICAgICovCi0gIC8qICAgIHNhbWUgZm9udCBmYW1pbHkgYW5kIHN0eWxlLiAgU2VlIEBGVF9OZXdfU2l6ZSBhbmQgQEZUX0RvbmVfU2l6ZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IEBGVF9TZXRfUGl4ZWxfU2l6ZXMgYW5kIEBGVF9TZXRfQ2hhcl9TaXplIG9ubHkgICAgICAgICAgICovCi0gIC8qICAgIG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYGFjdGl2ZScgc2l6ZTsgeW91IHRodXMgbmVlZCAgICAqLwotICAvKiAgICB0byB1c2UgQEZUX0FjdGl2YXRlX1NpemUgdG8gY2hhbmdlIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDk5JSBvZiBhcHBsaWNhdGlvbnMgd29uJ3QgbmVlZCB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUsICAgICAgICAqLwotICAvKiAgICBlc3BlY2lhbGx5IGlmIHRoZXkgdXNlIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0sIHNvIGJlIGNhdXRpb3VzICAgICAgKi8KLSAgLyogICAgd2hlbiB1c2luZyB0aGVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBzaXplIG9iamVjdCBmcm9tIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzaXplIDo6IEEgaGFuZGxlIHRvIGEgbmV3IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBuZWVkIHRvIGNhbGwgQEZUX0FjdGl2YXRlX1NpemUgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBuZXcgc2l6ZSAqLwotICAvKiAgICBmb3IgdXBjb21pbmcgY2FsbHMgdG8gQEZUX1NldF9QaXhlbF9TaXplcywgQEZUX1NldF9DaGFyX1NpemUsICAgICAgKi8KLSAgLyogICAgQEZUX0xvYWRfR2x5cGgsIEBGVF9Mb2FkX0NoYXIsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X1NpemUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgRlRfU2l6ZSogIHNpemUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpc2NhcmQgYSBnaXZlbiBzaXplIG9iamVjdC4gIE5vdGUgdGhhdCBARlRfRG9uZV9GYWNlICAgICAgICAgICAgICAqLwotICAvKiAgICBhdXRvbWF0aWNhbGx5IGRpc2NhcmRzIGFsbCBzaXplIG9iamVjdHMgYWxsb2NhdGVkIHdpdGggICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX05ld19TaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9TaXplKCBGVF9TaXplICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BY3RpdmF0ZV9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFdmVuIHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgc2V2ZXJhbCBzaXplIG9iamVjdHMgZm9yIGEgICAgKi8KLSAgLyogICAgZ2l2ZW4gZmFjZSAoc2VlIEBGVF9OZXdfU2l6ZSBmb3IgZGV0YWlscyksIGZ1bmN0aW9ucyBsaWtlICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0dseXBoIG9yIEBGVF9Mb2FkX0NoYXIgb25seSB1c2UgdGhlIG9uZSB0aGF0IGhhcyBiZWVuICAgICAqLwotICAvKiAgICBhY3RpdmF0ZWQgbGFzdCB0byBkZXRlcm1pbmUgdGhlIGBjdXJyZW50IGNoYXJhY3RlciBwaXhlbCBzaXplJy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYGFjdGl2YXRlJyBhIHByZXZpb3VzbHkgY3JlYXRlZCBzaXplICAqLwotICAvKiAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgZmFjZScgaXMgdGhlIHNpemUncyBwYXJlbnQgZmFjZSBvYmplY3QsIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyAgKi8KLSAgLyogICAgdGhlIHZhbHVlIG9mIGBmYWNlLT5zaXplJyB0byB0aGUgaW5wdXQgc2l6ZSBoYW5kbGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQWN0aXZhdGVfU2l6ZSggRlRfU2l6ZSAgc2l6ZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRTSVpFU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzE2NTQwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzbmFtZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNuYW1lcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU2ltcGxlIGludGVyZmFjZSB0byBhY2Nlc3MgU0ZOVCBgbmFtZScgdGFibGVzICh3aGljaCBhcmUgdXNlZCAgICAgICAgKi8KLS8qICAgIHRvIGhvbGQgZm9udCBuYW1lcywgY29weXJpZ2h0IGluZm8sIG5vdGljZXMsIGV0Yy4pIChzcGVjaWZpY2F0aW9uKS4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBpcyBfbm90XyB1c2VkIHRvIHJldHJpZXZlIGdseXBoIG5hbWVzISAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRTTkFNRVNfSF8KLSNkZWZpbmUgRlRTTkFNRVNfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZm50X25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTRk5UIE5hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBY2Nlc3MgdGhlIG5hbWVzIGVtYmVkZGVkIGluIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmaWxlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIHNwZWNpZmljYXRpb25zIGFsbG93IHRoZSBpbmNsdXNpb24gb2YgICAgKi8KLSAgLyogICAgYSBzcGVjaWFsIG5hbWVzIHRhYmxlIChgbmFtZScpIGluIGZvbnQgZmlsZXMuICBUaGlzIHRhYmxlIGNvbnRhaW5zICovCi0gIC8qICAgIHRleHR1YWwgKGFuZCBpbnRlcm5hdGlvbmFsaXplZCkgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBmb250LCAgICAqLwotICAvKiAgICBsaWtlIGZhbWlseSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlbSBpZiBhdmFpbGFibGUuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoaXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBnbHlwaCBuYW1lcyEgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnROYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYW4gU0ZOVCBgbmFtZScgdGFibGUgZW50cnkuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBsYXRmb3JtX2lkIDo6IFRoZSBwbGF0Zm9ybSBJRCBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBTZWUgQFRUX1BMQVRGT1JNX1hYWCBmb3IgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVuY29kaW5nX2lkIDo6IFRoZSBlbmNvZGluZyBJRCBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBTZWUgQFRUX0FQUExFX0lEX1hYWCwgQFRUX01BQ19JRF9YWFgsICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgQFRUX0lTT19JRF9YWFgsIEBUVF9NU19JRF9YWFgsIGFuZCBAVFRfQURPQkVfSURfWFhYICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGZvciBwb3NzaWJsZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFuZ3VhZ2VfaWQgOjogVGhlIGxhbmd1YWdlIElEIGZvciBgc3RyaW5nJy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIFNlZSBAVFRfTUFDX0xBTkdJRF9YWFggYW5kIEBUVF9NU19MQU5HSURfWFhYIGZvciAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWQgT3BlblR5cGUgdmFsdWVzIGZvciBgbGFuZ3VhZ2VfaWQnIGFyZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBhbHdheXMgc21hbGxlciB0aGFuIDB4ODAwMDsgdmFsdWVzIGVxdWFsIG9yIGxhcmdlciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdGhhbiAweDgwMDAgdXN1YWxseSBpbmRpY2F0ZSBhIGxhbmd1YWdlIHRhZyBzdHJpbmcgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIChpbnRyb2R1Y2VkIGluIE9wZW5UeXBlIHZlcnNpb24gMS42KS4gIFVzZSBmdW5jdGlvbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICBARlRfR2V0X1NmbnRfTGFuZ1RhZyB3aXRoIGBsYW5ndWFnZV9pZCcgYXMgaXRzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gcmV0cmlldmUgdGhlIGFzc29jaWF0ZWQgbGFuZ3VhZ2UgdGFnLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lX2lkICAgICA6OiBBbiBpZGVudGlmaWVyIGZvciBgc3RyaW5nJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgU2VlIEBUVF9OQU1FX0lEX1hYWCBmb3IgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmcgICAgICA6OiBUaGUgYG5hbWUnIHN0cmluZy4gIE5vdGUgdGhhdCBpdHMgZm9ybWF0IGRpZmZlcnMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSAocGxhdGZvcm0sZW5jb2RpbmcpIHBhaXIsIGJlaW5nICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGVpdGhlciBhIHN0cmluZyBvZiBieXRlcyAod2l0aG91dCBhIHRlcm1pbmF0aW5nICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBOVUxMIGJ5dGUpIG9yIGNvbnRhaW5pbmcgVVRGLTE2QkUgZW50aXRpZXMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZ19sZW4gIDo6IFRoZSBsZW5ndGggb2YgYHN0cmluZycgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBsZWFzZSByZWZlciB0byB0aGUgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSAgICAqLwotICAvKiAgICBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TZm50TmFtZV8KLSAgewotICAgIEZUX1VTaG9ydCAgcGxhdGZvcm1faWQ7Ci0gICAgRlRfVVNob3J0ICBlbmNvZGluZ19pZDsKLSAgICBGVF9VU2hvcnQgIGxhbmd1YWdlX2lkOwotICAgIEZUX1VTaG9ydCAgbmFtZV9pZDsKLQotICAgIEZUX0J5dGUqICAgc3RyaW5nOyAgICAgIC8qIHRoaXMgc3RyaW5nIGlzICpub3QqIG51bGwtdGVybWluYXRlZCEgKi8KLSAgICBGVF9VSW50ICAgIHN0cmluZ19sZW47ICAvKiBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgfSBGVF9TZm50TmFtZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X05hbWVfQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgbmFtZSBzdHJpbmdzIGluIHRoZSBTRk5UIGBuYW1lJyB0YWJsZS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgYG5hbWUnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50ICkKLSAgRlRfR2V0X1NmbnRfTmFtZV9Db3VudCggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1NmbnRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgYSBzdHJpbmcgb2YgdGhlIFNGTlQgYG5hbWUnIHRhYmxlIGZvciBhIGdpdmVuIGluZGV4LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggICA6OiBUaGUgaW5kZXggb2YgdGhlIGBuYW1lJyBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbmFtZSA6OiBUaGUgaW5kZXhlZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYHN0cmluZycgYXJyYXkgcmV0dXJuZWQgaW4gdGhlIGBhbmFtZScgc3RydWN0dXJlIGlzIG5vdCAgICAgICAgKi8KLSAgLyogICAgbnVsbC10ZXJtaW5hdGVkLiAgTm90ZSB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGRlYWxsb2NhdGUgYHN0cmluZycgICovCi0gIC8qICAgIGJ5IHlvdXJzZWxmOyBGcmVlVHlwZSB0YWtlcyBjYXJlIG9mIGl0IGlmIHlvdSBjYWxsIEBGVF9Eb25lX0ZhY2UuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9HZXRfU2ZudF9OYW1lX0NvdW50IHRvIGdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSAgICovCi0gIC8qICAgIGBuYW1lJyB0YWJsZSBlbnRyaWVzLCB0aGVuIGRvIGEgbG9vcCB1bnRpbCB5b3UgZ2V0IHRoZSByaWdodCAgICAgICAqLwotICAvKiAgICBwbGF0Zm9ybSwgZW5jb2RpbmcsIGFuZCBuYW1lIElELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBuYW1lJyB0YWJsZSBmb3JtYXR+MSBlbnRyaWVzIGNhbiB1c2UgbGFuZ3VhZ2UgdGFncyBhbHNvLCBzZWUgICAgICAqLwotICAvKiAgICBARlRfR2V0X1NmbnRfTGFuZ1RhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfU2ZudF9OYW1lKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICBGVF9TZm50TmFtZSAgKmFuYW1lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZm50TGFuZ1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIGxhbmd1YWdlIHRhZyBlbnRyeSBmcm9tIGFuIFNGTlQgYG5hbWUnICAgICAgKi8KLSAgLyogICAgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nICAgICAgOjogVGhlIGxhbmd1YWdlIHRhZyBzdHJpbmcsIGVuY29kZWQgaW4gVVRGLTE2QkUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICh3aXRob3V0IHRyYWlsaW5nIE5VTEwgYnl0ZXMpLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBvZiBgc3RyaW5nJyBpbiAqYnl0ZXMqLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBUcnVlVHlwZSBvciBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlICAgICovCi0gIC8qICAgIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NmbnRMYW5nVGFnXwotICB7Ci0gICAgRlRfQnl0ZSogIHN0cmluZzsgICAgICAvKiB0aGlzIHN0cmluZyBpcyAqbm90KiBudWxsLXRlcm1pbmF0ZWQhICovCi0gICAgRlRfVUludCAgIHN0cmluZ19sZW47ICAvKiBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgfSBGVF9TZm50TGFuZ1RhZzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X0xhbmdUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBsYW5ndWFnZSB0YWcgYXNzb2NpYXRlZCB3aXRoIGEgbGFuZ3VhZ2UgSUQgb2YgYW4gU0ZOVCAqLwotICAvKiAgICBgbmFtZScgdGFibGUgZW50cnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhbmdJRCAgIDo6IFRoZSBsYW5ndWFnZSBJRCwgYXMgcmV0dXJuZWQgYnkgQEZUX0dldF9TZm50X05hbWUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBUaGlzIGlzIGFsd2F5cyBhIHZhbHVlIGxhcmdlciB0aGFuIDB4ODAwMC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbGFuZ1RhZyA6OiBUaGUgbGFuZ3VhZ2UgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgYG5hbWUnIHRhYmxlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgZW50cnkncyBsYW5ndWFnZSBJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBzdHJpbmcnIGFycmF5IHJldHVybmVkIGluIHRoZSBgYWxhbmdUYWcnIHN0cnVjdHVyZSBpcyBub3QgICAgICovCi0gIC8qICAgIG51bGwtdGVybWluYXRlZC4gIE5vdGUgdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byBkZWFsbG9jYXRlIGBzdHJpbmcnICAqLwotICAvKiAgICBieSB5b3Vyc2VsZjsgRnJlZVR5cGUgdGFrZXMgY2FyZSBvZiBpdCBpZiB5b3UgY2FsbCBARlRfRG9uZV9GYWNlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgYG5hbWUnIHRhYmxlIGZvcm1hdH4xIHN1cHBvcnRzIGxhbmd1YWdlIHRhZ3MuICBGb3IgZm9ybWF0fjAgICAqLwotICAvKiAgICB0YWJsZXMsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgRlRfRXJyX0ludmFsaWRfVGFibGUuICBGb3IgICAgKi8KLSAgLyogICAgaW52YWxpZCBmb3JtYXR+MSBsYW5ndWFnZSBJRCB2YWx1ZXMsIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50IGlzICAgICovCi0gIC8qICAgIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9TZm50X0xhbmdUYWcoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBsYW5nSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1NmbnRMYW5nVGFnICAqYWxhbmdUYWcgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGNvbnN0YW50OgotICAgKiAgIEZUX1BBUkFNX1RBR19JR05PUkVfVFlQT0dSQVBISUNfRkFNSUxZCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHRhZyBmb3IgQEZUX1BhcmFtZXRlciB0byBtYWtlIEBGVF9PcGVuX0ZhY2UgaWdub3JlIHR5cG9ncmFwaGljCi0gICAqICAgZmFtaWx5IG5hbWVzIGluIHRoZSBgbmFtZScgdGFibGUgKGludHJvZHVjZWQgaW4gT3BlblR5cGUgdmVyc2lvbgotICAgKiAgIDEuNCkuICBVc2UgdGhpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzeXN0ZW1zIHRoYXQKLSAgICogICBoYXZlIGEgZm91ci1mYWNlcy1wZXItZmFtaWx5IHJlc3RyaWN0aW9uLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfUEFSQU1fVEFHX0lHTk9SRV9UWVBPR1JBUEhJQ19GQU1JTFkgXAotICAgICAgICAgIEZUX01BS0VfVEFHKCAnaScsICdnJywgJ3AnLCAnZicgKQotCi0KLSAgLyogdGhpcyBjb25zdGFudCBpcyBkZXByZWNhdGVkICovCi0jZGVmaW5lIEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX0ZBTUlMWSBcCi0gICAgICAgICAgRlRfUEFSQU1fVEFHX0lHTk9SRV9UWVBPR1JBUEhJQ19GQU1JTFkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGNvbnN0YW50OgotICAgKiAgIEZUX1BBUkFNX1RBR19JR05PUkVfVFlQT0dSQVBISUNfU1VCRkFNSUxZCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHRhZyBmb3IgQEZUX1BhcmFtZXRlciB0byBtYWtlIEBGVF9PcGVuX0ZhY2UgaWdub3JlIHR5cG9ncmFwaGljCi0gICAqICAgc3ViZmFtaWx5IG5hbWVzIGluIHRoZSBgbmFtZScgdGFibGUgKGludHJvZHVjZWQgaW4gT3BlblR5cGUgdmVyc2lvbgotICAgKiAgIDEuNCkuICBVc2UgdGhpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzeXN0ZW1zIHRoYXQKLSAgICogICBoYXZlIGEgZm91ci1mYWNlcy1wZXItZmFtaWx5IHJlc3RyaWN0aW9uLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfUEFSQU1fVEFHX0lHTk9SRV9UWVBPR1JBUEhJQ19TVUJGQU1JTFkgXAotICAgICAgICAgIEZUX01BS0VfVEFHKCAnaScsICdnJywgJ3AnLCAncycgKQotCi0KLSAgLyogdGhpcyBjb25zdGFudCBpcyBkZXByZWNhdGVkICovCi0jZGVmaW5lIEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX1NVQkZBTUlMWSBcCi0gICAgICAgICAgRlRfUEFSQU1fVEFHX0lHTk9SRV9UWVBPR1JBUEhJQ19TVUJGQU1JTFkKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUU05BTUVTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjA2NjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3Ryb2tlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBwYXRoIHN0cm9rZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVFNUUk9LRV9IXwotI2RlZmluZSBGVFNUUk9LRV9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfR0xZUEhfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAc2VjdGlvbjoKLSAgKiAgICBnbHlwaF9zdHJva2VyCi0gICoKLSAgKiBAdGl0bGU6Ci0gICogICAgR2x5cGggU3Ryb2tlcgotICAqCi0gICogQGFic3RyYWN0OgotICAqICAgIEdlbmVyYXRpbmcgYm9yZGVyZWQgYW5kIHN0cm9rZWQgZ2x5cGhzLgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFRoaXMgY29tcG9uZW50IGdlbmVyYXRlcyBzdHJva2VkIG91dGxpbmVzIG9mIGEgZ2l2ZW4gdmVjdG9yaWFsCi0gICogICAgZ2x5cGguICBJdCBhbHNvIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIGBvdXRzaWRlJyBhbmQvb3IgdGhlCi0gICogICAgYGluc2lkZScgYm9yZGVycyBvZiB0aGUgc3Ryb2tlLgotICAqCi0gICogICAgVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGdlbmVyYXRlIGBib3JkZXJlZCcgZ2x5cGgsIGkuZS4sIGdseXBocwotICAqICAgIGRpc3BsYXllZCB3aXRoIGEgY29sb3VyZWQgKGFuZCBhbnRpLWFsaWFzZWQpIGJvcmRlciBhcm91bmQgdGhlaXIKLSAgKiAgICBzaGFwZS4KLSAgKgotICAqIEBvcmRlcjoKLSAgKiAgICBGVF9TdHJva2VyCi0gICoKLSAgKiAgICBGVF9TdHJva2VyX0xpbmVKb2luCi0gICogICAgRlRfU3Ryb2tlcl9MaW5lQ2FwCi0gICogICAgRlRfU3Ryb2tlckJvcmRlcgotICAqCi0gICogICAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIKLSAgKiAgICBGVF9PdXRsaW5lX0dldE91dHNpZGVCb3JkZXIKLSAgKgotICAqICAgIEZUX0dseXBoX1N0cm9rZQotICAqICAgIEZUX0dseXBoX1N0cm9rZUJvcmRlcgotICAqCi0gICogICAgRlRfU3Ryb2tlcl9OZXcKLSAgKiAgICBGVF9TdHJva2VyX1NldAotICAqICAgIEZUX1N0cm9rZXJfUmV3aW5kCi0gICogICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKLSAgKiAgICBGVF9TdHJva2VyX0RvbmUKLSAgKgotICAqICAgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoCi0gICogICAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoCi0gICoKLSAgKiAgICBGVF9TdHJva2VyX0xpbmVUbwotICAqICAgIEZUX1N0cm9rZXJfQ29uaWNUbwotICAqICAgIEZUX1N0cm9rZXJfQ3ViaWNUbwotICAqCi0gICogICAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMKLSAgKiAgICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlcgotICAqICAgIEZUX1N0cm9rZXJfR2V0Q291bnRzCi0gICogICAgRlRfU3Ryb2tlcl9FeHBvcnQKLSAgKgotICAqLwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEB0eXBlOgotICAqICAgRlRfU3Ryb2tlcgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgT3BhcXVlIGhhbmRsZSB0byBhIHBhdGggc3Ryb2tlciBvYmplY3QuCi0gICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1N0cm9rZXJSZWNfKiAgRlRfU3Ryb2tlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9TdHJva2VyX0xpbmVKb2luCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIGhvdyB0d28gam9pbmluZyBsaW5lcyBhcmUgcmVuZGVyZWQKLSAgICogICBpbiBhIHN0cm9rZXIuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9ST1VORCA6OgotICAgKiAgICAgVXNlZCB0byByZW5kZXIgcm91bmRlZCBsaW5lIGpvaW5zLiAgQ2lyY3VsYXIgYXJjcyBhcmUgdXNlZAotICAgKiAgICAgdG8gam9pbiB0d28gbGluZXMgc21vb3RobHkuCi0gICAqCi0gICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9CRVZFTCA6OgotICAgKiAgICAgVXNlZCB0byByZW5kZXIgYmV2ZWxlZCBsaW5lIGpvaW5zLiAgVGhlIG91dGVyIGNvcm5lciBvZgotICAgKiAgICAgdGhlIGpvaW5lZCBsaW5lcyBpcyBmaWxsZWQgYnkgZW5jbG9zaW5nIHRoZSB0cmlhbmd1bGFyCi0gICAqICAgICByZWdpb24gb2YgdGhlIGNvcm5lciB3aXRoIGEgc3RyYWlnaHQgbGluZSBiZXR3ZWVuIHRoZQotICAgKiAgICAgb3V0ZXIgY29ybmVycyBvZiBlYWNoIHN0cm9rZS4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVEIDo6Ci0gICAqICAgICBVc2VkIHRvIHJlbmRlciBtaXRlcmVkIGxpbmUgam9pbnMsIHdpdGggZml4ZWQgYmV2ZWxzIGlmIHRoZQotICAgKiAgICAgbWl0ZXIgbGltaXQgaXMgZXhjZWVkZWQuICBUaGUgb3V0ZXIgZWRnZXMgb2YgdGhlIHN0cm9rZXMKLSAgICogICAgIGZvciB0aGUgdHdvIHNlZ21lbnRzIGFyZSBleHRlbmRlZCB1bnRpbCB0aGV5IG1lZXQgYXQgYW4KLSAgICogICAgIGFuZ2xlLiAgSWYgdGhlIHNlZ21lbnRzIG1lZXQgYXQgdG9vIHNoYXJwIGFuIGFuZ2xlIChzdWNoCi0gICAqICAgICB0aGF0IHRoZSBtaXRlciB3b3VsZCBleHRlbmQgZnJvbSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZQotICAgKiAgICAgc2VnbWVudHMgYSBkaXN0YW5jZSBncmVhdGVyIHRoYW4gdGhlIHByb2R1Y3Qgb2YgdGhlIG1pdGVyCi0gICAqICAgICBsaW1pdCB2YWx1ZSBhbmQgdGhlIGJvcmRlciByYWRpdXMpLCB0aGVuIGEgYmV2ZWwgam9pbiAoc2VlCi0gICAqICAgICBhYm92ZSkgaXMgdXNlZCBpbnN0ZWFkLiAgVGhpcyBwcmV2ZW50cyBsb25nIHNwaWtlcyBiZWluZwotICAgKiAgICAgY3JlYXRlZC4gIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfRklYRUQgZ2VuZXJhdGVzIGEgbWl0ZXIKLSAgICogICAgIGxpbmUgam9pbiBhcyB1c2VkIGluIFBvc3RTY3JpcHQgYW5kIFBERi4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFIDo6Ci0gICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUiA6OgotICAgKiAgICAgVXNlZCB0byByZW5kZXIgbWl0ZXJlZCBsaW5lIGpvaW5zLCB3aXRoIHZhcmlhYmxlIGJldmVscyBpZgotICAgKiAgICAgdGhlIG1pdGVyIGxpbWl0IGlzIGV4Y2VlZGVkLiAgVGhlIGludGVyc2VjdGlvbiBvZiB0aGUKLSAgICogICAgIHN0cm9rZXMgaXMgY2xpcHBlZCBhdCBhIGxpbmUgcGVycGVuZGljdWxhciB0byB0aGUgYmlzZWN0b3IKLSAgICogICAgIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBzdHJva2VzLCBhdCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUKLSAgICogICAgIGludGVyc2VjdGlvbiBvZiB0aGUgc2VnbWVudHMgZXF1YWwgdG8gdGhlIHByb2R1Y3Qgb2YgdGhlCi0gICAqICAgICBtaXRlciBsaW1pdCB2YWx1ZSBhbmQgdGhlIGJvcmRlciByYWRpdXMuICBUaGlzIHByZXZlbnRzCi0gICAqICAgICBsb25nIHNwaWtlcyBiZWluZyBjcmVhdGVkLgotICAgKiAgICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSBnZW5lcmF0ZXMgYSBtaXRlcmVkIGxpbmUKLSAgICogICAgIGpvaW4gYXMgdXNlZCBpbiBYUFMuICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSIGlzIGFuIGFsaWFzCi0gICAqICAgICBmb3IgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSwgcmV0YWluZWQgZm9yCi0gICAqICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9TdHJva2VyX0xpbmVKb2luXwotICB7Ci0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9ST1VORCAgICAgICAgICA9IDAsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9CRVZFTCAgICAgICAgICA9IDEsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSA9IDIsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUiAgICAgICAgICA9IEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9GSVhFRCAgICA9IDMKLQotICB9IEZUX1N0cm9rZXJfTGluZUpvaW47Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfU3Ryb2tlcl9MaW5lQ2FwCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIGhvdyB0aGUgZW5kIG9mIG9wZW5lZCBzdWItcGF0aHMgYXJlCi0gICAqICAgcmVuZGVyZWQgaW4gYSBzdHJva2UuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfU1RST0tFUl9MSU5FQ0FQX0JVVFQgOjoKLSAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBmdWxsIHN0b3Agb24gdGhlIGxhc3QKLSAgICogICAgIHBvaW50IGl0c2VsZi4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVDQVBfUk9VTkQgOjoKLSAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBoYWxmLWNpcmNsZSBhcm91bmQgdGhlCi0gICAqICAgICBsYXN0IHBvaW50LgotICAgKgotICAgKiAgIEZUX1NUUk9LRVJfTElORUNBUF9TUVVBUkUgOjoKLSAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBzcXVhcmUgYXJvdW5kIHRoZQotICAgKiAgICAgbGFzdCBwb2ludC4KLSAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfU3Ryb2tlcl9MaW5lQ2FwXwotICB7Ci0gICAgRlRfU1RST0tFUl9MSU5FQ0FQX0JVVFQgPSAwLAotICAgIEZUX1NUUk9LRVJfTElORUNBUF9ST1VORCwKLSAgICBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFCi0KLSAgfSBGVF9TdHJva2VyX0xpbmVDYXA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfU3Ryb2tlckJvcmRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIHNlbGVjdCBhIGdpdmVuIHN0cm9rZSBib3JkZXIKLSAgICogICBpbiBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgYW5kIEBGVF9TdHJva2VyX0V4cG9ydEJvcmRlci4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9TVFJPS0VSX0JPUkRFUl9MRUZUIDo6Ci0gICAqICAgICBTZWxlY3QgdGhlIGxlZnQgYm9yZGVyLCByZWxhdGl2ZSB0byB0aGUgZHJhd2luZyBkaXJlY3Rpb24uCi0gICAqCi0gICAqICAgRlRfU1RST0tFUl9CT1JERVJfUklHSFQgOjoKLSAgICogICAgIFNlbGVjdCB0aGUgcmlnaHQgYm9yZGVyLCByZWxhdGl2ZSB0byB0aGUgZHJhd2luZyBkaXJlY3Rpb24uCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEFwcGxpY2F0aW9ucyBhcmUgZ2VuZXJhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGBpbnNpZGUnIGFuZCBgb3V0c2lkZScKLSAgICogICBib3JkZXJzLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gZGlyZWN0IG1hcHBpbmcgYmV0d2VlbiB0aGVzZSBhbmQgdGhlCi0gICAqICAgYGxlZnQnIGFuZCBgcmlnaHQnIG9uZXMsIHNpbmNlIHRoaXMgcmVhbGx5IGRlcGVuZHMgb24gdGhlIGdseXBoJ3MKLSAgICogICBkcmF3aW5nIG9yaWVudGF0aW9uLCB3aGljaCB2YXJpZXMgYmV0d2VlbiBmb250IGZvcm1hdHMuCi0gICAqCi0gICAqICAgWW91IGNhbiBob3dldmVyIHVzZSBARlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIgYW5kCi0gICAqICAgQEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlciB0byBnZXQgdGhlc2UuCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1N0cm9rZXJCb3JkZXJfCi0gIHsKLSAgICBGVF9TVFJPS0VSX0JPUkRFUl9MRUZUID0gMCwKLSAgICBGVF9TVFJPS0VSX0JPUkRFUl9SSUdIVAotCi0gIH0gRlRfU3Ryb2tlckJvcmRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHJpZXZlIHRoZSBARlRfU3Ryb2tlckJvcmRlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgKiAgIGBpbnNpZGUnIGJvcmRlcnMgb2YgYSBnaXZlbiBvdXRsaW5lLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBvdXRsaW5lIGhhbmRsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgYm9yZGVyIGluZGV4LiAgQEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUIGZvciBlbXB0eSBvciBpbnZhbGlkCi0gICAqICAgb3V0bGluZXMuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX1N0cm9rZXJCb3JkZXIgKQotICBGVF9PdXRsaW5lX0dldEluc2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICBgb3V0c2lkZScgYm9yZGVycyBvZiBhIGdpdmVuIG91dGxpbmUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBvdXRsaW5lIDo6Ci0gICAqICAgICBUaGUgc291cmNlIG91dGxpbmUgaGFuZGxlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSBib3JkZXIgaW5kZXguICBARlRfU1RST0tFUl9CT1JERVJfTEVGVCBmb3IgZW1wdHkgb3IgaW52YWxpZAotICAgKiAgIG91dGxpbmVzLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9TdHJva2VyQm9yZGVyICkKLSAgRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX05ldwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ3JlYXRlIGEgbmV3IHN0cm9rZXIgb2JqZWN0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbGlicmFyeSA6OgotICAgKiAgICAgRnJlZVR5cGUgbGlicmFyeSBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYXN0cm9rZXIgOjoKLSAgICogICAgIEEgbmV3IHN0cm9rZXIgb2JqZWN0IGhhbmRsZS4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX05ldyggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAqYXN0cm9rZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9TZXQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJlc2V0IGEgc3Ryb2tlciBvYmplY3QncyBhdHRyaWJ1dGVzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICByYWRpdXMgOjoKLSAgICogICAgIFRoZSBib3JkZXIgcmFkaXVzLgotICAgKgotICAgKiAgIGxpbmVfY2FwIDo6Ci0gICAqICAgICBUaGUgbGluZSBjYXAgc3R5bGUuCi0gICAqCi0gICAqICAgbGluZV9qb2luIDo6Ci0gICAqICAgICBUaGUgbGluZSBqb2luIHN0eWxlLgotICAgKgotICAgKiAgIG1pdGVyX2xpbWl0IDo6Ci0gICAqICAgICBUaGUgbWl0ZXIgbGltaXQgZm9yIHRoZSBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVEIGFuZAotICAgKiAgICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSBsaW5lIGpvaW4gc3R5bGVzLAotICAgKiAgICAgZXhwcmVzc2VkIGFzIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgcmFkaXVzIGlzIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB1bml0cyBhcyB0aGUgb3V0bGluZQotICAgKiAgIGNvb3JkaW5hdGVzLgotICAgKgotICAgKiAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX1N0cm9rZXJfUmV3aW5kIGF1dG9tYXRpY2FsbHkuCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TdHJva2VyX1NldCggRlRfU3Ryb2tlciAgICAgICAgICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJfTGluZUNhcCAgIGxpbmVfY2FwLAotICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlcl9MaW5lSm9pbiAgbGluZV9qb2luLAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICAgICAgICAgbWl0ZXJfbGltaXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9SZXdpbmQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJlc2V0IGEgc3Ryb2tlciBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBpdHMgYXR0cmlidXRlcy4KLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgYmVnaW5uaW5nIGEgbmV3Ci0gICAqICAgc2VyaWVzIG9mIGNhbGxzIHRvIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBvcgotICAgKiAgIEBGVF9TdHJva2VyX0VuZFN1YlBhdGguCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9SZXdpbmQoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZCB0byBwYXJzZSBhIHdob2xlIG91dGxpbmUgd2l0aAotICAgKiAgIHRoZSBzdHJva2VyLiAgVGhlIHJlc3VsdGluZyBvdXRsaW5lKHMpIGNhbiBiZSByZXRyaWV2ZWQKLSAgICogICBsYXRlciBieSBmdW5jdGlvbnMgbGlrZSBARlRfU3Ryb2tlcl9HZXRDb3VudHMgYW5kIEBGVF9TdHJva2VyX0V4cG9ydC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBvdXRsaW5lLgotICAgKgotICAgKiAgIG9wZW5lZCA6OgotICAgKiAgICAgQSBib29sZWFuLiAgSWZ+MSwgdGhlIG91dGxpbmUgaXMgdHJlYXRlZCBhcyBhbiBvcGVuIHBhdGggaW5zdGVhZAotICAgKiAgICAgb2YgYSBjbG9zZWQgb25lLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIGBvcGVuZWQnIGlzfjAgKHRoZSBkZWZhdWx0KSwgdGhlIG91dGxpbmUgaXMgdHJlYXRlZCBhcyBhIGNsb3NlZAotICAgKiAgIHBhdGgsIGFuZCB0aGUgc3Ryb2tlciBnZW5lcmF0ZXMgdHdvIGRpc3RpbmN0IGBib3JkZXInIG91dGxpbmVzLgotICAgKgotICAgKiAgIElmIGBvcGVuZWQnIGlzfjEsIHRoZSBvdXRsaW5lIGlzIHByb2Nlc3NlZCBhcyBhbiBvcGVuIHBhdGgsIGFuZCB0aGUKLSAgICogICBzdHJva2VyIGdlbmVyYXRlcyBhIHNpbmdsZSBgc3Ryb2tlJyBvdXRsaW5lLgotICAgKgotICAgKiAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX1N0cm9rZXJfUmV3aW5kIGF1dG9tYXRpY2FsbHkuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUoIEZUX1N0cm9rZXIgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgb3BlbmVkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBTdGFydCBhIG5ldyBzdWItcGF0aCBpbiB0aGUgc3Ryb2tlci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgdG8gOjoKLSAgICogICAgIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgdmVjdG9yLgotICAgKgotICAgKiAgIG9wZW4gOjoKLSAgICogICAgIEEgYm9vbGVhbi4gIElmfjEsIHRoZSBzdWItcGF0aCBpcyB0cmVhdGVkIGFzIGFuIG9wZW4gb25lLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gc3Ryb2tlIGEgcGF0aCB0aGF0IGlzCi0gICAqICAgbm90IHN0b3JlZCBhcyBhbiBARlRfT3V0bGluZSBvYmplY3QuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG9wZW4gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDbG9zZSB0aGUgY3VycmVudCBzdWItcGF0aCBpbiB0aGUgc3Ryb2tlci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgQEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoLgotICAgKiAgIElmIHRoZSBzdWJwYXRoIHdhcyBub3QgYG9wZW5lZCcsIHRoaXMgZnVuY3Rpb24gYGRyYXdzJyBhCi0gICAqICAgc2luZ2xlIGxpbmUgc2VnbWVudCB0byB0aGUgc3RhcnQgcG9zaXRpb24gd2hlbiBuZWVkZWQuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoKCBGVF9TdHJva2VyICBzdHJva2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfTGluZVRvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBgRHJhdycgYSBzaW5nbGUgbGluZSBzZWdtZW50IGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKLSAgICogICBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICB0byA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBwb2ludC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZXR3ZWVuIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBhbmQKLSAgICogICBARlRfU3Ryb2tlcl9FbmRTdWJQYXRoLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfTGluZVRvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9Db25pY1RvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBgRHJhdycgYSBzaW5nbGUgcXVhZHJhdGljIELDqXppZXIgaW4gdGhlIHN0cm9rZXIncyBjdXJyZW50IHN1Yi1wYXRoLAotICAgKiAgIGZyb20gdGhlIGxhc3QgcG9zaXRpb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGNvbnRyb2wgOjoKLSAgICogICAgIEEgcG9pbnRlciB0byBhIELDqXppZXIgY29udHJvbCBwb2ludC4KLSAgICoKLSAgICogICB0byA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBwb2ludC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZXR3ZWVuIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBhbmQKLSAgICogICBARlRfU3Ryb2tlcl9FbmRTdWJQYXRoLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQ29uaWNUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfQ3ViaWNUbwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgYERyYXcnIGEgc2luZ2xlIGN1YmljIELDqXppZXIgaW4gdGhlIHN0cm9rZXIncyBjdXJyZW50IHN1Yi1wYXRoLAotICAgKiAgIGZyb20gdGhlIGxhc3QgcG9zaXRpb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGNvbnRyb2wxIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IELDqXppZXIgY29udHJvbCBwb2ludC4KLSAgICoKLSAgICogICBjb250cm9sMiA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHNlY29uZCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuCi0gICAqCi0gICAqICAgdG8gOjoKLSAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcG9pbnQuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmV0d2VlbiBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggYW5kCi0gICAqICAgQEZUX1N0cm9rZXJfRW5kU3ViUGF0aC4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0N1YmljVG8oIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIHlvdSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgeW91ciBwYXRocwotICAgKiAgIHdpdGggdGhlIHN0cm9rZXIuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9pbnRzIGFuZAotICAgKiAgIGNvbnRvdXJzIG5lY2Vzc2FyeSB0byBleHBvcnQgb25lIG9mIHRoZSBgYm9yZGVyJyBvciBgc3Ryb2tlJwotICAgKiAgIG91dGxpbmVzIGdlbmVyYXRlZCBieSB0aGUgc3Ryb2tlci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgYm9yZGVyIDo6Ci0gICAqICAgICBUaGUgYm9yZGVyIGluZGV4LgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFudW1fcG9pbnRzIDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIHBvaW50cy4KLSAgICoKLSAgICogICBhbnVtX2NvbnRvdXJzIDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIGNvbnRvdXJzLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFdoZW4gYW4gb3V0bGluZSwgb3IgYSBzdWItcGF0aCwgaXMgYGNsb3NlZCcsIHRoZSBzdHJva2VyIGdlbmVyYXRlcwotICAgKiAgIHR3byBpbmRlcGVuZGVudCBgYm9yZGVyJyBvdXRsaW5lcywgbmFtZWQgYGxlZnQnIGFuZCBgcmlnaHQnLgotICAgKgotICAgKiAgIFdoZW4gdGhlIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBvcGVuZWQnLCB0aGUgc3Ryb2tlciBtZXJnZXMKLSAgICogICB0aGUgYGJvcmRlcicgb3V0bGluZXMgd2l0aCBjYXBzLiAgVGhlIGBsZWZ0JyBib3JkZXIgcmVjZWl2ZXMgYWxsCi0gICAqICAgcG9pbnRzLCB3aGlsZSB0aGUgYHJpZ2h0JyBib3JkZXIgYmVjb21lcyBlbXB0eS4KLSAgICoKLSAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0dldENvdW50cyBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvCi0gICAqICAgcmV0cmlldmUgdGhlIGNvdW50cyBhc3NvY2lhdGVkIHRvIGJvdGggYm9yZGVycy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyggRlRfU3Ryb2tlciAgICAgICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgKmFudW1fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAqYW51bV9jb250b3VycyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0bwotICAgKiAgIGV4cG9ydCB0aGUgY29ycmVzcG9uZGluZyBib3JkZXIgdG8geW91ciBvd24gQEZUX091dGxpbmUKLSAgICogICBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgYm9yZGVyIHBvaW50cyBhbmQKLSAgICogICBjb250b3VycyB0byB5b3VyIG91dGxpbmUsIGJ1dCBkb2VzIG5vdCB0cnkgdG8gcmVzaXplIGl0cwotICAgKiAgIGFycmF5cy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgYm9yZGVyIDo6Ci0gICAqICAgICBUaGUgYm9yZGVyIGluZGV4LgotICAgKgotICAgKiAgIG91dGxpbmUgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgb3V0bGluZSBoYW5kbGUuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEFsd2F5cyBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgQEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzIHRvCi0gICAqICAgZ2V0IHN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB5b3VyIEBGVF9PdXRsaW5lIG9iamVjdCB0bwotICAgKiAgIHJlY2VpdmUgYWxsIG5ldyBkYXRhLgotICAgKgotICAgKiAgIFdoZW4gYW4gb3V0bGluZSwgb3IgYSBzdWItcGF0aCwgaXMgYGNsb3NlZCcsIHRoZSBzdHJva2VyIGdlbmVyYXRlcwotICAgKiAgIHR3byBpbmRlcGVuZGVudCBgYm9yZGVyJyBvdXRsaW5lcywgbmFtZWQgYGxlZnQnIGFuZCBgcmlnaHQnLgotICAgKgotICAgKiAgIFdoZW4gdGhlIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBvcGVuZWQnLCB0aGUgc3Ryb2tlciBtZXJnZXMKLSAgICogICB0aGUgYGJvcmRlcicgb3V0bGluZXMgd2l0aCBjYXBzLiAgVGhlIGBsZWZ0JyBib3JkZXIgcmVjZWl2ZXMgYWxsCi0gICAqICAgcG9pbnRzLCB3aGlsZSB0aGUgYHJpZ2h0JyBib3JkZXIgYmVjb21lcyBlbXB0eS4KLSAgICoKLSAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0V4cG9ydCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvCi0gICAqICAgcmV0cmlldmUgYWxsIGJvcmRlcnMgYXQgb25jZS4KLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBGVF9TdHJva2VyICAgICAgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlckJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0dldENvdW50cwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UgeW91IGhhdmUgZmluaXNoZWQgcGFyc2luZyB5b3VyIHBhdGhzCi0gICAqICAgd2l0aCB0aGUgc3Ryb2tlci4gIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBwb2ludHMgYW5kCi0gICAqICAgY29udG91cnMgbmVjZXNzYXJ5IHRvIGV4cG9ydCBhbGwgcG9pbnRzL2JvcmRlcnMgZnJvbSB0aGUgc3Ryb2tlZAotICAgKiAgIG91dGxpbmUvcGF0aC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYW51bV9wb2ludHMgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgcG9pbnRzLgotICAgKgotICAgKiAgIGFudW1fY29udG91cnMgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgY29udG91cnMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0dldENvdW50cyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgKmFudW1fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAqYW51bV9jb250b3VycyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0V4cG9ydAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0bwotICAgKiAgIGV4cG9ydCBhbGwgYm9yZGVycyB0byB5b3VyIG93biBARlRfT3V0bGluZSBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgYm9yZGVyIHBvaW50cyBhbmQKLSAgICogICBjb250b3VycyB0byB5b3VyIG91dGxpbmUsIGJ1dCBkb2VzIG5vdCB0cnkgdG8gcmVzaXplIGl0cwotICAgKiAgIGFycmF5cy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHRhcmdldCBvdXRsaW5lIGhhbmRsZS4KLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0KCBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfRG9uZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgRGVzdHJveSBhIHN0cm9rZXIgb2JqZWN0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4gIENhbiBiZSBOVUxMLgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9Eb25lKCBGVF9TdHJva2VyICBzdHJva2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0dseXBoX1N0cm9rZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgU3Ryb2tlIGEgZ2l2ZW4gb3V0bGluZSBnbHlwaCBvYmplY3Qgd2l0aCBhIGdpdmVuIHN0cm9rZXIuCi0gICAqCi0gICAqIEBpbm91dDoKLSAgICogICBwZ2x5cGggOjoKLSAgICogICAgIFNvdXJjZSBnbHlwaCBoYW5kbGUgb24gaW5wdXQsIG5ldyBnbHlwaCBoYW5kbGUgb24gb3V0cHV0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBkZXN0cm95IDo6Ci0gICAqICAgICBBIEJvb2xlYW4uICBJZn4xLCB0aGUgc291cmNlIGdseXBoIG9iamVjdCBpcyBkZXN0cm95ZWQKLSAgICogICAgIG9uIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBzb3VyY2UgZ2x5cGggaXMgdW50b3VjaGVkIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAqCi0gICAqICAgQWRkaW5nIHN0cm9rZSBtYXkgeWllbGQgYSBzaWduaWZpY2FudGx5IHdpZGVyIGFuZCB0YWxsZXIgZ2x5cGgKLSAgICogICBkZXBlbmRpbmcgb24gaG93IGxhcmdlIG9mIGEgcmFkaXVzIHdhcyB1c2VkIHRvIHN0cm9rZSB0aGUgZ2x5cGguICBZb3UKLSAgICogICBtYXkgbmVlZCB0byBtYW51YWxseSBhZGp1c3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZSBhbW91bnRzCi0gICAqICAgdG8gYWNjb3VudCBmb3IgdGhpcyBhZGRlZCBzaXplLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1N0cm9rZSggRlRfR2x5cGggICAgKnBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9HbHlwaF9TdHJva2VCb3JkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFN0cm9rZSBhIGdpdmVuIG91dGxpbmUgZ2x5cGggb2JqZWN0IHdpdGggYSBnaXZlbiBzdHJva2VyLCBidXQKLSAgICogICBvbmx5IHJldHVybiBlaXRoZXIgaXRzIGluc2lkZSBvciBvdXRzaWRlIGJvcmRlci4KLSAgICoKLSAgICogQGlub3V0OgotICAgKiAgIHBnbHlwaCA6OgotICAgKiAgICAgU291cmNlIGdseXBoIGhhbmRsZSBvbiBpbnB1dCwgbmV3IGdseXBoIGhhbmRsZSBvbiBvdXRwdXQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBBIHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGluc2lkZSA6OgotICAgKiAgICAgQSBCb29sZWFuLiAgSWZ+MSwgcmV0dXJuIHRoZSBpbnNpZGUgYm9yZGVyLCBvdGhlcndpc2UKLSAgICogICAgIHRoZSBvdXRzaWRlIGJvcmRlci4KLSAgICoKLSAgICogICBkZXN0cm95IDo6Ci0gICAqICAgICBBIEJvb2xlYW4uICBJZn4xLCB0aGUgc291cmNlIGdseXBoIG9iamVjdCBpcyBkZXN0cm95ZWQKLSAgICogICAgIG9uIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBzb3VyY2UgZ2x5cGggaXMgdW50b3VjaGVkIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAqCi0gICAqICAgQWRkaW5nIHN0cm9rZSBtYXkgeWllbGQgYSBzaWduaWZpY2FudGx5IHdpZGVyIGFuZCB0YWxsZXIgZ2x5cGgKLSAgICogICBkZXBlbmRpbmcgb24gaG93IGxhcmdlIG9mIGEgcmFkaXVzIHdhcyB1c2VkIHRvIHN0cm9rZSB0aGUgZ2x5cGguICBZb3UKLSAgICogICBtYXkgbmVlZCB0byBtYW51YWxseSBhZGp1c3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZSBhbW91bnRzCi0gICAqICAgdG8gYWNjb3VudCBmb3IgdGhpcyBhZGRlZCBzaXplLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1N0cm9rZUJvcmRlciggRlRfR2x5cGggICAgKnBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgaW5zaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBkZXN0cm95ICk7Ci0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRTVFJPS0VfSF8gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODYzZmEyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeW50aC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN5bnRoZXNpemluZyBjb2RlIGZvciBlbWJvbGRlbmluZyBhbmQgc2xhbnRpbmcgICAgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqICAgICAgICBXQVJOSU5HLCBUSElTIElTIEFMUEhBIENPREUhICBUSElTIEFQSSAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiAgICBJUyBEVUUgVE8gQ0hBTkdFIFVOVElMIFNUUklDVExZIE5PVElGSUVEIEJZIFRIRSAgICAqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgICAgICAgICBGUkVFVFlQRSBERVZFTE9QTUVOVCBURUFNICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogTWFpbiByZWFzb24gZm9yIG5vdCBsaWZ0aW5nIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgdG8gYSAgKi8KLSAgLyogYHN0YW5kYXJkJyBBUEkgaXMgdGhhdCB0aGUgdXNlZCBwYXJhbWV0ZXJzIGZvciBlbWJvbGRlbmluZyBhbmQgKi8KLSAgLyogc2xhbnRpbmcgYXJlIG5vdCBjb25maWd1cmFibGUuICBDb25zaWRlciB0aGUgZnVuY3Rpb25zIGFzIGEgICAgKi8KLSAgLyogY29kZSByZXNvdXJjZSB0aGF0IHNob3VsZCBiZSBjb3BpZWQgaW50byB0aGUgYXBwbGljYXRpb24gYW5kICAgKi8KLSAgLyogYWRhcHRlZCB0byB0aGUgcGFydGljdWxhciBuZWVkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0jaWZuZGVmIEZUU1lOVEhfSF8KLSNkZWZpbmUgRlRTWU5USF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKiBFbWJvbGRlbiBhIGdseXBoIGJ5IGEgYHJlYXNvbmFibGUnIHZhbHVlICh3aGljaCBpcyBoaWdobHkgYSBtYXR0ZXIgb2YgKi8KLSAgLyogdGFzdGUpLiAgVGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCBwcm92aWRpbmcgICovCi0gIC8qIGEgd3JhcHBlciBmb3IgQEZUX091dGxpbmVfRW1ib2xkZW4gYW5kIEBGVF9CaXRtYXBfRW1ib2xkZW4uICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRm9yIGVtYm9sZGVuZWQgb3V0bGluZXMgdGhlIGhlaWdodCwgd2lkdGgsIGFuZCBhZHZhbmNlIG1ldHJpY3MgYXJlICAgICovCi0gIC8qIGluY3JlYXNlZCBieSB0aGUgc3RyZW5ndGggb2YgdGhlIGVtYm9sZGVuaW5nIC0tIHRoaXMgZXZlbiBhZmZlY3RzICAgICAqLwotICAvKiBtb25vLXdpZHRoIGZvbnRzISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFlvdSBjYW4gYWxzbyBjYWxsIEBGVF9PdXRsaW5lX0dldF9DQm94IHRvIGdldCBwcmVjaXNlIHZhbHVlcy4gICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9HbHlwaFNsb3RfRW1ib2xkZW4oIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gIC8qIFNsYW50IGFuIG91dGxpbmUgZ2x5cGggdG8gdGhlIHJpZ2h0IGJ5IGFib3V0IDEyIGRlZ3JlZXMuICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0dseXBoU2xvdF9PYmxpcXVlKCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUU1lOVEhfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzeXN0ZW0uaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRzeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhNDc2Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeXN0ZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGxvdy1sZXZlbCBzeXN0ZW0gaW50ZXJmYWNlIGRlZmluaXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUU1lTVEVNX0hfCi0jZGVmaW5lIEZUU1lTVEVNX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN5c3RlbV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFN5c3RlbSBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEhvdyBGcmVlVHlwZSBtYW5hZ2VzIG1lbW9yeSBhbmQgaS9vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5ICAgICAgICAgKi8KLSAgLyogICBtYW5hZ2VtZW50IGFuZCBpL28gYWNjZXNzLiAgWW91IG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzICAgICAgICAgICAgICovCi0gIC8qICAgaW5mb3JtYXRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGEgY3VzdG9tIG1lbW9yeSBtYW5hZ2VyIG9yIHlvdSBvd24gICAqLwotICAvKiAgIGkvbyBzdHJlYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIE0gRSBNIE8gUiBZICAgTSBBIE4gQSBHIEUgTSBFIE4gVCAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfTWVtb3J5Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGhhbmRsZSB0byBhIGdpdmVuIG1lbW9yeSBtYW5hZ2VyIG9iamVjdCwgZGVmaW5lZCB3aXRoIGFuCi0gICAqICAgQEZUX01lbW9yeVJlYyBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1vcnlSZWNfKiAgRlRfTWVtb3J5OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIEZUX0FsbG9jX0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBhbGxvY2F0ZSBgc2l6ZScgYnl0ZXMgZnJvbSBgbWVtb3J5Jy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG1lbW9yeSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBtZW1vcnkgbWFuYWdlci4KLSAgICoKLSAgICogICBzaXplIDo6Ci0gICAqICAgICBUaGUgc2l6ZSBpbiBieXRlcyB0byBhbGxvY2F0ZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBBZGRyZXNzIG9mIG5ldyBtZW1vcnkgYmxvY2suICAwfmluIGNhc2Ugb2YgZmFpbHVyZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZCoKLSAgKCpGVF9BbGxvY19GdW5jKSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc2l6ZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIEZUX0ZyZWVfRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlbGVhc2UgYSBnaXZlbiBibG9jayBvZiBtZW1vcnkuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBtZW1vcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgbWVtb3J5IG1hbmFnZXIuCi0gICAqCi0gICAqICAgYmxvY2sgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgbWVtb3J5IGJsb2NrLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfRnJlZV9GdW5jKSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIEZUX1JlYWxsb2NfRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlLWFsbG9jYXRlIGEgZ2l2ZW4gYmxvY2sgb2YgbWVtb3J5LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbWVtb3J5IDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIG1lbW9yeSBtYW5hZ2VyLgotICAgKgotICAgKiAgIGN1cl9zaXplIDo6Ci0gICAqICAgICBUaGUgYmxvY2sncyBjdXJyZW50IHNpemUgaW4gYnl0ZXMuCi0gICAqCi0gICAqICAgbmV3X3NpemUgOjoKLSAgICogICAgIFRoZSBibG9jaydzIHJlcXVlc3RlZCBuZXcgc2l6ZS4KLSAgICoKLSAgICogICBibG9jayA6OgotICAgKiAgICAgVGhlIGJsb2NrJ3MgY3VycmVudCBhZGRyZXNzLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIE5ldyBibG9jayBhZGRyZXNzLiAgMH5pbiBjYXNlIG9mIG1lbW9yeSBzaG9ydGFnZS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSW4gY2FzZSBvZiBlcnJvciwgdGhlIG9sZCBibG9jayBtdXN0IHN0aWxsIGJlIGF2YWlsYWJsZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZCoKLSAgKCpGVF9SZWFsbG9jX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIGN1cl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVF9NZW1vcnlSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiBtZW1vcnkgbWFuYWdlciB0byBGcmVlVHlwZX4yLgotICAgKgotICAgKiBAZmllbGRzOgotICAgKiAgIHVzZXIgOjoKLSAgICogICAgIEEgZ2VuZXJpYyB0eXBlbGVzcyBwb2ludGVyIGZvciB1c2VyIGRhdGEuCi0gICAqCi0gICAqICAgYWxsb2MgOjoKLSAgICogICAgIEEgcG9pbnRlciB0eXBlIHRvIGFuIGFsbG9jYXRpb24gZnVuY3Rpb24uCi0gICAqCi0gICAqICAgZnJlZSA6OgotICAgKiAgICAgQSBwb2ludGVyIHR5cGUgdG8gYW4gbWVtb3J5IGZyZWVpbmcgZnVuY3Rpb24uCi0gICAqCi0gICAqICAgcmVhbGxvYyA6OgotICAgKiAgICAgQSBwb2ludGVyIHR5cGUgdG8gYSByZWFsbG9jYXRpb24gZnVuY3Rpb24uCi0gICAqCi0gICAqLwotICBzdHJ1Y3QgIEZUX01lbW9yeVJlY18KLSAgewotICAgIHZvaWQqICAgICAgICAgICAgdXNlcjsKLSAgICBGVF9BbGxvY19GdW5jICAgIGFsbG9jOwotICAgIEZUX0ZyZWVfRnVuYyAgICAgZnJlZTsKLSAgICBGVF9SZWFsbG9jX0Z1bmMgIHJlYWxsb2M7Ci0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBJIC8gTyAgIE0gQSBOIEEgRyBFIE0gRSBOIFQgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9TdHJlYW0KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgaGFuZGxlIHRvIGFuIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogQGFsc286Ci0gICAqICAgU2VlIEBGVF9TdHJlYW1SZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuCi0gICAqICAgc3RyZWFtIG9iamVjdC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1N0cmVhbVJlY18qICBGVF9TdHJlYW07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX1N0cmVhbURlc2MKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgdW5pb24gdHlwZSB1c2VkIHRvIHN0b3JlIGVpdGhlciBhIGxvbmcgb3IgYSBwb2ludGVyLiAgVGhpcyBpcyB1c2VkCi0gICAqICAgdG8gc3RvcmUgYSBmaWxlIGRlc2NyaXB0b3Igb3IgYSBgRklMRSonIGluIGFuIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdW5pb24gIEZUX1N0cmVhbURlc2NfCi0gIHsKLSAgICBsb25nICAgdmFsdWU7Ci0gICAgdm9pZCogIHBvaW50ZXI7Ci0KLSAgfSBGVF9TdHJlYW1EZXNjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIEZUX1N0cmVhbV9Jb0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBzZWVrIGFuZCByZWFkIGRhdGEgZnJvbSBhIGdpdmVuIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cmVhbSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzdHJlYW0uCi0gICAqCi0gICAqICAgb2Zmc2V0IDo6Ci0gICAqICAgICBUaGUgb2Zmc2V0IG9mIHJlYWQgaW4gc3RyZWFtIChhbHdheXMgZnJvbSBzdGFydCkuCi0gICAqCi0gICAqICAgYnVmZmVyIDo6Ci0gICAqICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgcmVhZCBidWZmZXIuCi0gICAqCi0gICAqICAgY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBzdHJlYW0uCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIG51bWJlciBvZiBieXRlcyBlZmZlY3RpdmVseSByZWFkIGJ5IHRoZSBzdHJlYW0uCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgY2FsbGVkIHRvIHBlcmZvcm0gYSBzZWVrIG9yIHNraXAgb3BlcmF0aW9uCi0gICAqICAgd2l0aCBhIGBjb3VudCcgb2Z+MC4gIEEgbm9uLXplcm8gcmV0dXJuIHZhbHVlIHRoZW4gaW5kaWNhdGVzIGFuCi0gICAqICAgZXJyb3IuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcKLSAgKCpGVF9TdHJlYW1fSW9GdW5jKSggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIGNvdW50ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfU3RyZWFtX0Nsb3NlRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIGNsb3NlIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICBzdHJlYW0gOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfU3RyZWFtX0Nsb3NlRnVuYykoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX1N0cmVhbVJlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhbiBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBiYXNlIDo6Ci0gICAqICAgICBGb3IgbWVtb3J5LWJhc2VkIHN0cmVhbXMsIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHN0cmVhbQotICAgKiAgICAgYnl0ZSBpbiBtZW1vcnkuICBUaGlzIGZpZWxkIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIE5VTEwgZm9yCi0gICAqICAgICBkaXNrLWJhc2VkIHN0cmVhbXMuCi0gICAqCi0gICAqICAgc2l6ZSA6OgotICAgKiAgICAgVGhlIHN0cmVhbSBzaXplIGluIGJ5dGVzLgotICAgKgotICAgKiAgICAgSW4gY2FzZSBvZiBjb21wcmVzc2VkIHN0cmVhbXMgd2hlcmUgdGhlIHNpemUgaXMgdW5rbm93biBiZWZvcmUKLSAgICogICAgIGFjdHVhbGx5IGRvaW5nIHRoZSBkZWNvbXByZXNzaW9uLCB0aGUgdmFsdWUgaXMgc2V0IHRvIDB4N0ZGRkZGRkYuCi0gICAqICAgICAoTm90ZSB0aGF0IHRoaXMgc2l6ZSB2YWx1ZSBjYW4gb2NjdXIgZm9yIG5vcm1hbCBzdHJlYW1zIGFsc287IGl0IGlzCi0gICAqICAgICB0aHVzIGp1c3QgYSBoaW50LikKLSAgICoKLSAgICogICBwb3MgOjoKLSAgICogICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLgotICAgKgotICAgKiAgIGRlc2NyaXB0b3IgOjoKLSAgICogICAgIFRoaXMgZmllbGQgaXMgYSB1bmlvbiB0aGF0IGNhbiBob2xkIGFuIGludGVnZXIgb3IgYSBwb2ludGVyLiAgSXQgaXMKLSAgICogICAgIHVzZWQgYnkgc3RyZWFtIGltcGxlbWVudGF0aW9ucyB0byBzdG9yZSBmaWxlIGRlc2NyaXB0b3JzIG9yIGBGSUxFKicKLSAgICogICAgIHBvaW50ZXJzLgotICAgKgotICAgKiAgIHBhdGhuYW1lIDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSBGcmVlVHlwZS4gIEhvd2V2ZXIsIGl0IGlzIG9mdGVuCi0gICAqICAgICB1c2VmdWwgZHVyaW5nIGRlYnVnZ2luZyB0byB1c2UgaXQgdG8gc3RvcmUgdGhlIHN0cmVhbSdzIGZpbGVuYW1lCi0gICAqICAgICAod2hlcmUgYXZhaWxhYmxlKS4KLSAgICoKLSAgICogICByZWFkIDo6Ci0gICAqICAgICBUaGUgc3RyZWFtJ3MgaW5wdXQgZnVuY3Rpb24uCi0gICAqCi0gICAqICAgY2xvc2UgOjoKLSAgICogICAgIFRoZSBzdHJlYW0ncyBjbG9zZSBmdW5jdGlvbi4KLSAgICoKLSAgICogICBtZW1vcnkgOjoKLSAgICogICAgIFRoZSBtZW1vcnkgbWFuYWdlciB0byB1c2UgdG8gcHJlbG9hZCBmcmFtZXMuICBUaGlzIGlzIHNldAotICAgKiAgICAgaW50ZXJuYWxseSBieSBGcmVlVHlwZSBhbmQgc2hvdWxkbid0IGJlIHRvdWNoZWQgYnkgc3RyZWFtCi0gICAqICAgICBpbXBsZW1lbnRhdGlvbnMuCi0gICAqCi0gICAqICAgY3Vyc29yIDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIHNldCBhbmQgdXNlZCBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIHdoZW4gcGFyc2luZwotICAgKiAgICAgZnJhbWVzLgotICAgKgotICAgKiAgIGxpbWl0IDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIHNldCBhbmQgdXNlZCBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIHdoZW4gcGFyc2luZwotICAgKiAgICAgZnJhbWVzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1N0cmVhbVJlY18KLSAgewotICAgIHVuc2lnbmVkIGNoYXIqICAgICAgIGJhc2U7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgICBwb3M7Ci0KLSAgICBGVF9TdHJlYW1EZXNjICAgICAgICBkZXNjcmlwdG9yOwotICAgIEZUX1N0cmVhbURlc2MgICAgICAgIHBhdGhuYW1lOwotICAgIEZUX1N0cmVhbV9Jb0Z1bmMgICAgIHJlYWQ7Ci0gICAgRlRfU3RyZWFtX0Nsb3NlRnVuYyAgY2xvc2U7Ci0KLSAgICBGVF9NZW1vcnkgICAgICAgICAgICBtZW1vcnk7Ci0gICAgdW5zaWduZWQgY2hhciogICAgICAgY3Vyc29yOwotICAgIHVuc2lnbmVkIGNoYXIqICAgICAgIGxpbWl0OwotCi0gIH0gRlRfU3RyZWFtUmVjOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRTWVNURU1fSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmMDM1MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR0cmlnb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUVFJJR09OX0hfCi0jZGVmaW5lIEZUVFJJR09OX0hfCi0KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGNvbXB1dGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfQW5nbGUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIG1vZGVsIGFuZ2xlIHZhbHVlcyBpbiBGcmVlVHlwZS4gIE5vdGUgdGhhdCB0aGUKLSAgICogICBhbmdsZSBpcyBhIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlIGV4cHJlc3NlZCBpbiBkZWdyZWVzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBGVF9GaXhlZCAgRlRfQW5nbGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQU5HTEVfUEkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBhbmdsZSBwaSBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQU5HTEVfUEkgICggMTgwTCA8PCAxNiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQU5HTEVfMlBJCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgYW5nbGUgMipwaSBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQU5HTEVfMlBJICAoIEZUX0FOR0xFX1BJICogMiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQU5HTEVfUEkyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgYW5nbGUgcGkvMiBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQU5HTEVfUEkyICAoIEZUX0FOR0xFX1BJIC8gMiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQU5HTEVfUEk0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgYW5nbGUgcGkvNCBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQU5HTEVfUEk0ICAoIEZUX0FOR0xFX1BJIC8gNCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU2luCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIHNpbnVzIG9mIGEgZ2l2ZW4gYW5nbGUgaW4gZml4ZWQtcG9pbnQgZm9ybWF0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSBpbnB1dCBhbmdsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgc2ludXMgdmFsdWUuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIHlvdSBuZWVkIGJvdGggdGhlIHNpbnVzIGFuZCBjb3NpbnVzIGZvciBhIGdpdmVuIGFuZ2xlLCB1c2UgdGhlCi0gICAqICAgZnVuY3Rpb24gQEZUX1ZlY3Rvcl9Vbml0LgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCi0gIEZUX1NpbiggRlRfQW5nbGUgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfQ29zCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIGNvc2ludXMgb2YgYSBnaXZlbiBhbmdsZSBpbiBmaXhlZC1wb2ludCBmb3JtYXQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZSA6OgotICAgKiAgICAgVGhlIGlucHV0IGFuZ2xlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSBjb3NpbnVzIHZhbHVlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJZiB5b3UgbmVlZCBib3RoIHRoZSBzaW51cyBhbmQgY29zaW51cyBmb3IgYSBnaXZlbiBhbmdsZSwgdXNlIHRoZQotICAgKiAgIGZ1bmN0aW9uIEBGVF9WZWN0b3JfVW5pdC4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9Db3MoIEZUX0FuZ2xlICBhbmdsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1RhbgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSB0YW5nZW50IG9mIGEgZ2l2ZW4gYW5nbGUgaW4gZml4ZWQtcG9pbnQgZm9ybWF0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSBpbnB1dCBhbmdsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgdGFuZ2VudCB2YWx1ZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9UYW4oIEZUX0FuZ2xlICBhbmdsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0F0YW4yCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIGFyYy10YW5nZW50IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiB2ZWN0b3IgKHgseSkgaW4KLSAgICogICB0aGUgMmQgcGxhbmUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICB4IDo6Ci0gICAqICAgICBUaGUgaG9yaXpvbnRhbCB2ZWN0b3IgY29vcmRpbmF0ZS4KLSAgICoKLSAgICogICB5IDo6Ci0gICAqICAgICBUaGUgdmVydGljYWwgdmVjdG9yIGNvb3JkaW5hdGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIGFyYy10YW5nZW50IHZhbHVlIChpLmUuIGFuZ2xlKS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfQW5nbGUgKQotICBGVF9BdGFuMiggRlRfRml4ZWQgIHgsCi0gICAgICAgICAgICBGVF9GaXhlZCAgeSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0FuZ2xlX0RpZmYKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhbmdsZXMuICBUaGUgcmVzdWx0IGlzIGFsd2F5cwotICAgKiAgIGNvbnN0cmFpbmVkIHRvIHRoZSBdLVBJLi5QSV0gaW50ZXJ2YWwuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZTEgOjoKLSAgICogICAgIEZpcnN0IGFuZ2xlLgotICAgKgotICAgKiAgIGFuZ2xlMiA6OgotICAgKiAgICAgU2Vjb25kIGFuZ2xlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIENvbnN0cmFpbmVkIHZhbHVlIG9mIGB2YWx1ZTItdmFsdWUxJy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfQW5nbGUgKQotICBGVF9BbmdsZV9EaWZmKCBGVF9BbmdsZSAgYW5nbGUxLAotICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgYW5nbGUyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX1VuaXQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgdW5pdCB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGFuZ2xlLiAgQWZ0ZXIgdGhlCi0gICAqICAgY2FsbCwgdGhlIHZhbHVlIG9mIGB2ZWMueCcgd2lsbCBiZSBgY29zKGFuZ2xlKScsIGFuZCB0aGUgdmFsdWUgb2YKLSAgICogICBgdmVjLnknIHdpbGwgYmUgYHNpbihhbmdsZSknLgotICAgKgotICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIHJldHJpZXZlIGJvdGggdGhlIHNpbnVzIGFuZCBjb3NpbnVzIG9mIGEKLSAgICogICBnaXZlbiBhbmdsZSBxdWlja2x5LgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfVW5pdCggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9WZWN0b3JfUm90YXRlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSb3RhdGUgYSB2ZWN0b3IgYnkgYSBnaXZlbiBhbmdsZS4KLSAgICoKLSAgICogQGlub3V0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfUm90YXRlKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX0xlbmd0aAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgYSBnaXZlbiB2ZWN0b3IuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICB2ZWMgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRhcmdldCB2ZWN0b3IuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIHZlY3RvciBsZW5ndGgsIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB1bml0cyB0aGF0IHRoZSBvcmlnaW5hbAotICAgKiAgIHZlY3RvciBjb29yZGluYXRlcy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9WZWN0b3JfTGVuZ3RoKCBGVF9WZWN0b3IqICB2ZWMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9WZWN0b3JfUG9sYXJpemUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENvbXB1dGUgYm90aCB0aGUgbGVuZ3RoIGFuZCBhbmdsZSBvZiBhIGdpdmVuIHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2Ygc291cmNlIHZlY3Rvci4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBsZW5ndGggOjoKLSAgICogICAgIFRoZSB2ZWN0b3IgbGVuZ3RoLgotICAgKgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgdmVjdG9yIGFuZ2xlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVmVjdG9yX1BvbGFyaXplKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAqbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgKmFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENvbXB1dGUgdmVjdG9yIGNvb3JkaW5hdGVzIGZyb20gYSBsZW5ndGggYW5kIGFuZ2xlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2Ygc291cmNlIHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGxlbmd0aCA6OgotICAgKiAgICAgVGhlIHZlY3RvciBsZW5ndGguCi0gICAqCi0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSB2ZWN0b3IgYW5nbGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUVFJJR09OX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHRkcnYuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnR0dGRydi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmJjNWU5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnR0dGRydi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHRkcnYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBUcnVlVHlwZSBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRUVERSVl9IXwotI2RlZmluZSBGVFRURFJWX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICB0dF9kcml2ZXIKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIFRoZSBUcnVlVHlwZSBkcml2ZXIKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIENvbnRyb2xsaW5nIHRoZSBUcnVlVHlwZSBkcml2ZXIgbW9kdWxlLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgV2hpbGUgRnJlZVR5cGUncyBUcnVlVHlwZSBkcml2ZXIgZG9lc24ndCBleHBvc2UgQVBJIGZ1bmN0aW9ucyBieQotICAgKiAgIGl0c2VsZiwgaXQgaXMgcG9zc2libGUgdG8gY29udHJvbCBpdHMgYmVoYXZpb3VyIHdpdGggQEZUX1Byb3BlcnR5X1NldAotICAgKiAgIGFuZCBARlRfUHJvcGVydHlfR2V0LiAgVGhlIGZvbGxvd2luZyBsaXN0cyB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXMKLSAgICogICB0b2dldGhlciB3aXRoIHRoZSBuZWNlc3NhcnkgbWFjcm9zIGFuZCBzdHJ1Y3R1cmVzLgotICAgKgotICAgKiAgIFRoZSBUcnVlVHlwZSBkcml2ZXIncyBtb2R1bGUgbmFtZSBpcyBgdHJ1ZXR5cGUnLgotICAgKgotICAgKiAgIFdlIHN0YXJ0IHdpdGggYSBsaXN0IG9mIGRlZmluaXRpb25zLCBraW5kbHkgcHJvdmlkZWQgYnkgR3JlZwotICAgKiAgIEhpdGNoY29jay4KLSAgICoKLSAgICogICBfQmktTGV2ZWxfIF9SZW5kZXJpbmdfCi0gICAqCi0gICAqICAgTW9ub2Nocm9tYXRpYyByZW5kZXJpbmcsIGV4Y2x1c2l2ZWx5IHVzZWQgaW4gdGhlIGVhcmx5IGRheXMgb2YKLSAgICogICBUcnVlVHlwZSBieSBib3RoIEFwcGxlIGFuZCBNaWNyb3NvZnQuICBNaWNyb3NvZnQncyBHREkgaW50ZXJmYWNlCi0gICAqICAgc3VwcG9ydGVkIGhpbnRpbmcgb2YgdGhlIHJpZ2h0LXNpZGUgYmVhcmluZyBwb2ludCwgc3VjaCB0aGF0IHRoZQotICAgKiAgIGFkdmFuY2Ugd2lkdGggY291bGQgYmUgbm9uLWxpbmVhci4gIE1vc3Qgb2Z0ZW4gdGhpcyB3YXMgZG9uZSB0bwotICAgKiAgIGFjaGlldmUgc29tZSBsZXZlbCBvZiBnbHlwaCBzeW1tZXRyeS4gIFRvIGVuYWJsZSByZWFzb25hYmxlCi0gICAqICAgcGVyZm9ybWFuY2UgKGUuZy4sIG5vdCBoYXZpbmcgdG8gcnVuIGhpbnRpbmcgb24gYWxsIGdseXBocyBqdXN0IHRvCi0gICAqICAgZ2V0IHRoZSB3aWR0aHMpIHRoZXJlIHdhcyBhIGJpdCBpbiB0aGUgaGVhZCB0YWJsZSBpbmRpY2F0aW5nIGlmIHRoZQotICAgKiAgIHNpZGUgYmVhcmluZyB3YXMgaGludGVkLCBhbmQgYWRkaXRpb25hbCB0YWJsZXMsIGBoZG14JyBhbmQgYExUU0gnLCB0bwotICAgKiAgIGNhY2hlIGhpbnRpbmcgd2lkdGhzIGFjcm9zcyBtdWx0aXBsZSBzaXplcyBhbmQgZGV2aWNlIGFzcGVjdCByYXRpb3MuCi0gICAqCi0gICAqICAgX0ZvbnRfIF9TbW9vdGhpbmdfCi0gICAqCi0gICAqICAgTWljcm9zb2Z0J3MgR0RJIGltcGxlbWVudGF0aW9uIG9mIGFudGktYWxpYXNpbmcuICBOb3QgdHJhZGl0aW9uYWwKLSAgICogICBhbnRpLWFsaWFzaW5nIGFzIHRoZSBvdXRsaW5lcyB3ZXJlIGhpbnRlZCBiZWZvcmUgdGhlIHNhbXBsaW5nLiAgVGhlCi0gICAqICAgd2lkdGhzIG1hdGNoZWQgdGhlIGJpLWxldmVsIHJlbmRlcmluZy4KLSAgICoKLSAgICogICBfQ2xlYXJUeXBlXyBfUmVuZGVyaW5nXwotICAgKgotICAgKiAgIFRlY2huaXF1ZSB0aGF0IHVzZXMgcGh5c2ljYWwgc3VicGl4ZWxzIHRvIGltcHJvdmUgcmVuZGVyaW5nIG9uIExDRAotICAgKiAgIChhbmQgb3RoZXIpIGRpc3BsYXlzLiAgQmVjYXVzZSBvZiB0aGUgaGlnaGVyIHJlc29sdXRpb24sIG1hbnkgbWV0aG9kcwotICAgKiAgIG9mIGltcHJvdmluZyBzeW1tZXRyeSBpbiBnbHlwaHMgdGhyb3VnaCBoaW50aW5nIHRoZSByaWdodC1zaWRlCi0gICAqICAgYmVhcmluZyB3ZXJlIG5vIGxvbmdlciBuZWNlc3NhcnkuICBUaGlzIGxlYWQgdG8gd2hhdCBHREkgY2FsbHMKLSAgICogICBgbmF0dXJhbCB3aWR0aHMnIENsZWFyVHlwZSwgc2VlCi0gICAqICAgaHR0cDovL3d3dy5iZWF0c3RhbW0uY29tL3R5cG9ncmFwaHkvUlRSQ2g0Lmh0bSNTZWMyMS4gIFNpbmNlIGhpbnRpbmcKLSAgICogICBoYXMgZXh0cmEgcmVzb2x1dGlvbiwgbW9zdCBub24tbGluZWFyaXR5IHdlbnQgYXdheSwgYnV0IGl0IGlzIHN0aWxsCi0gICAqICAgcG9zc2libGUgZm9yIGhpbnRzIHRvIGNoYW5nZSB0aGUgYWR2YW5jZSB3aWR0aHMgaW4gdGhpcyBtb2RlLgotICAgKgotICAgKiAgIF9DbGVhclR5cGVfIF9Db21wYXRpYmxlXyBfV2lkdGhzXwotICAgKgotICAgKiAgIE9uZSBvZiB0aGUgZWFybGllc3QgY2hhbGxlbmdlcyB3aXRoIENsZWFyVHlwZSB3YXMgYWxsb3dpbmcgdGhlCi0gICAqICAgaW1wbGVtZW50YXRpb24gaW4gR0RJIHRvIGJlIHNlbGVjdGVkIHdpdGhvdXQgcmVxdWlyaW5nIGFsbCBVSSBhbmQKLSAgICogICBkb2N1bWVudHMgdG8gcmVmbG93LiAgVG8gYWRkcmVzcyB0aGlzLCBhIGNvbXBhdGlibGUgbWV0aG9kIG9mCi0gICAqICAgcmVuZGVyaW5nIENsZWFyVHlwZSB3YXMgYWRkZWQgd2hlcmUgdGhlIGZvbnQgaGludHMgYXJlIGV4ZWN1dGVkIG9uY2UKLSAgICogICB0byBkZXRlcm1pbmUgdGhlIHdpZHRoIGluIGJpLWxldmVsIHJlbmRlcmluZywgYW5kIHRoZW4gcmUtcnVuIGluCi0gICAqICAgQ2xlYXJUeXBlLCB3aXRoIHRoZSBkaWZmZXJlbmNlIGluIHdpZHRocyBiZWluZyBhYnNvcmJlZCBpbiB0aGUgZm9udAotICAgKiAgIGhpbnRzIGZvciBDbGVhclR5cGUgKG1vc3RseSBpbiB0aGUgd2hpdGUgc3BhY2Ugb2YgaGludHMpOyBzZWUKLSAgICogICBodHRwOi8vd3d3LmJlYXRzdGFtbS5jb20vdHlwb2dyYXBoeS9SVFJDaDQuaHRtI1NlYzIwLiAgU29tZXdoYXQgYnkKLSAgICogICBkZWZpbml0aW9uLCBjb21wYXRpYmxlIHdpZHRoIENsZWFyVHlwZSBhbGxvd3MgZm9yIG5vbi1saW5lYXIgd2lkdGhzLAotICAgKiAgIGJ1dCBvbmx5IHdoZW4gdGhlIGJpLWxldmVsIHZlcnNpb24gaGFzIG5vbi1saW5lYXIgd2lkdGhzLgotICAgKgotICAgKiAgIF9DbGVhclR5cGVfIF9TdWJwaXhlbF8gX1Bvc2l0aW9uaW5nXwotICAgKgotICAgKiAgIE9uZSBvZiB0aGUgbmljZSBiZW5lZml0cyBvZiBDbGVhclR5cGUgaXMgdGhlIGFiaWxpdHkgdG8gbW9yZSBjcmlzcGx5Ci0gICAqICAgZGlzcGxheSBmcmFjdGlvbmFsIHdpZHRoczsgdW5mb3J0dW5hdGVseSwgdGhlIEdESSBtb2RlbCBvZiBpbnRlZ2VyCi0gICAqICAgYml0bWFwcyBkaWQgbm90IHN1cHBvcnQgdGhpcy4gIEhvd2V2ZXIsIHRoZSBXUEYgYW5kIERpcmVjdCBXcml0ZQotICAgKiAgIGZyYW1ld29ya3MgZG8gc3VwcG9ydCBmcmFjdGlvbmFsIHdpZHRocy4gIERXcml0ZSBjYWxscyB0aGlzIGBuYXR1cmFsCi0gICAqICAgbW9kZScsIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIEdESSdzIGBuYXR1cmFsIHdpZHRocycuICBTdWJwaXhlbAotICAgKiAgIHBvc2l0aW9uaW5nLCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QgV3JpdGUsCi0gICAqICAgdW5mb3J0dW5hdGVseSBkb2VzIG5vdCBzdXBwb3J0IGhpbnRlZCBhZHZhbmNlIHdpZHRocywgc2VlCi0gICAqICAgaHR0cDovL3d3dy5iZWF0c3RhbW0uY29tL3R5cG9ncmFwaHkvUlRSQ2g0Lmh0bSNTZWMyMi4gIE5vdGUgdGhhdCB0aGUKLSAgICogICBUcnVlVHlwZSBpbnRlcnByZXRlciBmdWxseSBhbGxvd3MgdGhlIGFkdmFuY2Ugd2lkdGggdG8gYmUgYWRqdXN0ZWQgaW4KLSAgICogICB0aGlzIG1vZGUsIGp1c3QgdGhlIERXcml0ZSBjbGllbnQgd2lsbCBpZ25vcmUgdGhvc2UgY2hhbmdlcy4KLSAgICoKLSAgICogICBfQ2xlYXJUeXBlXyBfQmFja3dhcmRfIF9Db21wYXRpYmlsaXR5XwotICAgKgotICAgKiAgIFRoaXMgaXMgYSBzZXQgb2YgZXhjZXB0aW9ucyBtYWRlIGluIHRoZSBUcnVlVHlwZSBpbnRlcnByZXRlciB0bwotICAgKiAgIG1pbmltaXplIGhpbnRpbmcgdGVjaG5pcXVlcyB0aGF0IHdlcmUgcHJvYmxlbWF0aWMgd2l0aCB0aGUgZXh0cmEKLSAgICogICByZXNvbHV0aW9uIG9mIENsZWFyVHlwZTsgc2VlCi0gICAqICAgaHR0cDovL3d3dy5iZWF0c3RhbW0uY29tL3R5cG9ncmFwaHkvUlRSQ2g0Lmh0bSNTZWMxIGFuZAotICAgKiAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L2NsZWFydHlwZS90cnVldHlwZWNsZWFydHlwZS5hc3B4LgotICAgKiAgIFRoaXMgdGVjaG5pcXVlIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIENsZWFyVHlwZSBjb21wYXRpYmxlCi0gICAqICAgd2lkdGhzLiAgQ2xlYXJUeXBlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaGFzIG5vIGRpcmVjdCBpbXBhY3Qgb24KLSAgICogICBjaGFuZ2luZyBhZHZhbmNlIHdpZHRocywgYnV0IHRoZXJlIG1pZ2h0IGJlIGFuIGluZGlyZWN0IGltcGFjdCBvbgotICAgKiAgIGRpc2FibGluZyBzb21lIGRlbHRhcy4gIFRoaXMgY291bGQgYmUgd29ya2VkIGFyb3VuZCBpbiBiYWNrd2FyZAotICAgKiAgIGNvbXBhdGliaWxpdHkgbW9kZS4KLSAgICoKLSAgICogICBfTmF0aXZlXyBfQ2xlYXJUeXBlXyBfTW9kZV8KLSAgICoKLSAgICogICAoTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYG5hdHVyYWwgd2lkdGhzJy4pICBUaGlzIG1vZGUgcmVtb3ZlcyBhbGwKLSAgICogICB0aGUgZXhjZXB0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUgaW50ZXJwcmV0ZXIgd2hlbiBydW5uaW5nIHdpdGgKLSAgICogICBDbGVhclR5cGUuICBBbnkgaXNzdWVzIG9uIHdpZHRocyB3b3VsZCBzdGlsbCBhcHBseSwgdGhvdWdoLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgaW50ZXJwcmV0ZXItdmVyc2lvbgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ3VycmVudGx5LCB0aHJlZSB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlLCB0d28gcmVwcmVzZW50aW5nIHRoZQotICAgKiAgIGJ5dGVjb2RlIGludGVycHJldGVyIHdpdGggc3VicGl4ZWwgaGludGluZyBzdXBwb3J0IChvbGQgYEluZmluYWxpdHknCi0gICAqICAgY29kZSBhbmQgbmV3IHN0cmlwcGVkLWRvd24gYW5kIGhpZ2hlciBwZXJmb3JtYW5jZSBgbWluaW1hbCcgY29kZSkgYW5kCi0gICAqICAgb25lIHdpdGhvdXQsIHJlc3BlY3RpdmVseS4gIFRoZSBkZWZhdWx0IGlzIHN1YnBpeGVsIHN1cHBvcnQgaWYKLSAgICogICBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgaXMgZGVmaW5lZCwgYW5kIG5vIHN1YnBpeGVsIHN1cHBvcnQKLSAgICogICBvdGhlcndpc2UgKHNpbmNlIGl0IGlzbid0IGF2YWlsYWJsZSB0aGVuKS4KLSAgICoKLSAgICogICBJZiBzdWJwaXhlbCBoaW50aW5nIGlzIG9uLCBtYW55IFRydWVUeXBlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBiZWhhdmUKLSAgICogICBkaWZmZXJlbnRseSBjb21wYXJlZCB0byBCL1cgb3IgZ3JheXNjYWxlIHJlbmRlcmluZyAoZXhjZXB0IGlmIGBuYXRpdmUKLSAgICogICBDbGVhclR5cGUnIGlzIHNlbGVjdGVkIGJ5IHRoZSBmb250KS4gIE1pY3Jvc29mdCdzIG1haW4gaWRlYSBpcyB0bwotICAgKiAgIHJlbmRlciBhdCBhIG11Y2ggaW5jcmVhc2VkIGhvcml6b250YWwgcmVzb2x1dGlvbiwgdGhlbiBzYW1wbGluZyBkb3duCi0gICAqICAgdGhlIGNyZWF0ZWQgb3V0cHV0IHRvIHN1YnBpeGVsIHByZWNpc2lvbi4gIEhvd2V2ZXIsIG1hbnkgb2xkZXIgZm9udHMKLSAgICogICBhcmUgbm90IHN1aXRlZCB0byB0aGlzIGFuZCBtdXN0IGJlIHNwZWNpYWxseSB0YWtlbiBjYXJlIG9mIGJ5Ci0gICAqICAgYXBwbHlpbmcgKGhhcmRjb2RlZCkgdHdlYWtzIGluIE1pY3Jvc29mdCdzIGludGVycHJldGVyLgotICAgKgotICAgKiAgIERldGFpbHMgb24gc3VicGl4ZWwgaGludGluZyBhbmQgc29tZSBvZiB0aGUgbmVjZXNzYXJ5IHR3ZWFrcyBjYW4gYmUKLSAgICogICBmb3VuZCBpbiBHcmVnIEhpdGNoY29jaydzIHdoaXRlcGFwZXIgYXQKLSAgICogICBgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHgnLiAKLSAgICogICBOb3RlIHRoYXQgRnJlZVR5cGUgY3VycmVudGx5IGRvZXNuJ3QgcmVhbGx5IGBzdWJwaXhlbCBoaW50JyAoNngxLCA2eDIsCi0gICAqICAgb3IgNng1IHN1cGVyc2FtcGxpbmcpIGxpa2UgZGlzY3Vzc2VkIGluIHRoZSBwYXBlci4gIERlcGVuZGluZyBvbiB0aGUKLSAgICogICBjaG9zZW4gaW50ZXJwcmV0ZXIsIGl0IHNpbXBseSBpZ25vcmVzIGluc3RydWN0aW9ucyBvbiB2ZXJ0aWNhbCBzdGVtcwotICAgKiAgIHRvIGFycml2ZSBhdCB2ZXJ5IHNpbWlsYXIgcmVzdWx0cy4KLSAgICoKLSAgICogICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGRlYWN0aXZhdGUgc3VicGl4ZWwKLSAgICogICBoaW50aW5nIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9GYWNlICAgICBmYWNlOwotICAgKiAgICAgRlRfVUludCAgICAgaW50ZXJwcmV0ZXJfdmVyc2lvbiA9IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzU7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAidHJ1ZXR5cGUiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJwcmV0ZXItdmVyc2lvbiIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcnByZXRlcl92ZXJzaW9uICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudAotICAgKiAgIHZhcmlhYmxlICh1c2luZyB2YWx1ZXMgYDM1JywgYDM4Jywgb3IgYDQwJykuCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgZm9yIHRoZSBAaW50ZXJwcmV0ZXItdmVyc2lvbiBwcm9wZXJ0eSB0bwotICAgKiAgIHNlbGVjdCB0aGUgaGludGluZyBlbmdpbmUgZm9yIFRydWV0eXBlIGZvbnRzLgotICAgKgotICAgKiAgIFRoZSBudW1lcmljIHZhbHVlIGluIHRoZSBjb25zdGFudCBuYW1lcyByZXByZXNlbnRzIHRoZSB2ZXJzaW9uCi0gICAqICAgbnVtYmVyIGFzIHJldHVybmVkIGJ5IHRoZSBgR0VUSU5GTycgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSA6OgotICAgKiAgICAgVmVyc2lvbn4zNSBjb3JyZXNwb25kcyB0byBNUyByYXN0ZXJpemVyIHYuMS43IGFzIHVzZWQgZS5nLiBpbgotICAgKiAgICAgV2luZG93c345ODsgb25seSBncmF5c2NhbGUgYW5kIEIvVyByYXN0ZXJpemluZyBpcyBzdXBwb3J0ZWQuCi0gICAqCi0gICAqICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCA6OgotICAgKiAgICAgVmVyc2lvbn4zOCBjb3JyZXNwb25kcyB0byBNUyByYXN0ZXJpemVyIHYuMS45OyBpdCBpcyByb3VnaGx5Ci0gICAqICAgICBlcXVpdmFsZW50IHRvIHRoZSBoaW50aW5nIHByb3ZpZGVkIGJ5IERpcmVjdFdyaXRlIENsZWFyVHlwZSAoYXMgY2FuCi0gICAqICAgICBiZSBmb3VuZCwgZm9yIGV4YW1wbGUsIGluIHRoZSBJbnRlcm5ldCBFeHBsb3Jlcn45IHJ1bm5pbmcgb24KLSAgICogICAgIFdpbmRvd3N+NykuICBJdCBpcyB1c2VkIGluIEZyZWVUeXBlIHRvIHNlbGVjdCB0aGUgYEluZmluYWxpdHknCi0gICAqICAgICBzdWJwaXhlbCBoaW50aW5nIGNvZGUuICBUaGUgY29kZSBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZQotICAgKiAgICAgdmVyc2lvbi4KLSAgICoKLSAgICogICBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzQwIDo6Ci0gICAqICAgICBWZXJzaW9ufjQwIGNvcnJlc3BvbmRzIHRvIE1TIHJhc3Rlcml6ZXIgdi4yLjE7IGl0IGlzIHJvdWdobHkKLSAgICogICAgIGVxdWl2YWxlbnQgdG8gdGhlIGhpbnRpbmcgcHJvdmlkZWQgYnkgRGlyZWN0V3JpdGUgQ2xlYXJUeXBlIChhcyBjYW4KLSAgICogICAgIGJlIGZvdW5kLCBmb3IgZXhhbXBsZSwgaW4gTWljcm9zb2Z0J3MgRWRnZSBCcm93c2VyIG9uIFdpbmRvd3N+MTApLiAKLSAgICogICAgIEl0IGlzIHVzZWQgaW4gRnJlZVR5cGUgdG8gc2VsZWN0IHRoZSBgbWluaW1hbCcgc3VicGl4ZWwgaGludGluZwotICAgKiAgICAgY29kZSwgYSBzdHJpcHBlZC1kb3duIGFuZCBoaWdoZXIgcGVyZm9ybWFuY2UgdmVyc2lvbiBvZiB0aGUKLSAgICogICAgIGBJbmZpbmFsaXR5JyBjb2RlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNvbnRyb2xzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyCi0gICAqICAgYW5kIHRodXMgaG93IG91dGxpbmVzIGdldCBoaW50ZWQuICBJdCBkb2VzICpub3QqIGNvbnRyb2wgaG93IGdseXBoCi0gICAqICAgZ2V0IHJhc3Rlcml6ZWQhICBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBjb250cm9sIHN1YnBpeGVsIGNvbG9yCi0gICAqICAgZmlsdGVyaW5nLgotICAgKgotICAgKiAgIElmIEZyZWVUeXBlIGhhcyBub3QgYmVlbiBjb21waWxlZCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbgotICAgKiAgIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORywgc2VsZWN0aW5nIHZlcnNpb25+Mzggb3J+NDAgY2F1c2VzCi0gICAqICAgYW4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGVycm9yLgotICAgKgotICAgKiAgIERlcGVuZGluZyBvbiB0aGUgZ3JhcGhpY3MgZnJhbWV3b3JrLCBNaWNyb3NvZnQgdXNlcyBkaWZmZXJlbnQKLSAgICogICBieXRlY29kZSBhbmQgcmVuZGVyaW5nIGVuZ2luZXMuICBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgdmVyc2lvbgotICAgKiAgIG51bWJlcnMgcmV0dXJuZWQgYnkgYSBjYWxsIHRvIHRoZSBgR0VUSU5GTycgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gYXJlCi0gICAqICAgbW9yZSBjb252b2x1dGVkIHRoYW4gZGVzaXJlZC4KLSAgICoKLSAgICogICBIZXJlIGFyZSB0d28gdGFibGVzIHRoYXQgdHJ5IHRvIHNoZWQgc29tZSBsaWdodCBvbiB0aGUgcG9zc2libGUKLSAgICogICB2YWx1ZXMgZm9yIHRoZSBNUyByYXN0ZXJpemVyIGVuZ2luZSwgdG9nZXRoZXIgd2l0aCB0aGUgYWRkaXRpb25hbAotICAgKiAgIGZlYXR1cmVzIGludHJvZHVjZWQgYnkgaXQuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgR0VUSU5GTyBmcmFtZXdvcmsgICAgICAgICAgICAgICB2ZXJzaW9uIGZlYXR1cmUKLSAgICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICogICAgICAgICAzICAgR0RJIChXaW4gMy4xKSwgICAgICAgICAgICB2MS4wICAxNi1iaXQsIGZpcnN0IHZlcnNpb24KLSAgICogICAgICAgICAgICAgVHJ1ZUltYWdlCi0gICAqICAgICAgICAzMyAgIEdESSAoV2luIE5UIDMuMSksICAgICAgICAgdjEuNSAgMzItYml0Ci0gICAqICAgICAgICAgICAgIEhQIExhc2VyamV0Ci0gICAqICAgICAgICAzNCAgIEdESSAoV2luIDk1KSAgICAgICAgICAgICAgdjEuNiAgZm9udCBzbW9vdGhpbmcsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNDQU5UWVBFIG9wY29kZQotICAgKiAgICAgICAgMzUgICBHREkgKFdpbiA5OC8yMDAwKSAgICAgICAgIHYxLjcgIChVTilTQ0FMRURfQ09NUE9ORU5UX09GRlNFVAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyBpbiBjb21wb3NpdGUgZ2x5cGhzCi0gICAqICAgICAgICAzNiAgIE1HREkgKFdpbiBDRSAyKSAgICAgICAgICAgdjEuNisgY2xhc3NpYyBDbGVhclR5cGUKLSAgICogICAgICAgIDM3ICAgR0RJIChYUCBhbmQgbGF0ZXIpLCAgICAgICB2MS44ICBDbGVhclR5cGUKLSAgICogICAgICAgICAgICAgR0RJKyBvbGQgKGJlZm9yZSBWaXN0YSkKLSAgICogICAgICAgIDM4ICAgR0RJKyBvbGQgKFZpc3RhLCBXaW4gNyksICB2MS45ICBzdWJwaXhlbCBDbGVhclR5cGUsCi0gICAqICAgICAgICAgICAgIFdQRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWS1kaXJlY3Rpb24gQ2xlYXJUeXBlLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgZXJyb3IgY2hlY2tpbmcKLSAgICogICAgICAgIDM5ICAgRFdyaXRlIChiZWZvcmUgV2luIDgpICAgICB2Mi4wICBzdWJwaXhlbCBDbGVhclR5cGUgZmxhZ3MKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEdFVElORk8gb3Bjb2RlLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZyBmaXhlcwotICAgKiAgICAgICAgNDAgICBHREkrIChhZnRlciBXaW4gNyksICAgICAgIHYyLjEgIFktZGlyZWN0aW9uIENsZWFyVHlwZSBmbGFnCi0gICAqICAgICAgICAgICAgIERXcml0ZSAoV2luIDgpICAgICAgICAgICAgICAgICAgICBpbiBHRVRJTkZPIG9wY29kZSwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmF5IENsZWFyVHlwZQotICAgKiAgIH0KLSAgICoKLSAgICogICBUaGUgYHZlcnNpb24nIGZpZWxkIGdpdmVzIGEgcm91Z2ggb3JpZW50YXRpb24gb25seSwgc2luY2Ugc29tZQotICAgKiAgIGFwcGxpY2F0aW9ucyBwcm92aWRlZCBjZXJ0YWluIGZlYXR1cmVzIG11Y2ggZWFybGllciAoYXMgYW4gZXhhbXBsZSwKLSAgICogICBNaWNyb3NvZnQgUmVhZGVyIHVzZWQgc3VicGl4ZWwgYW5kIFktZGlyZWN0aW9uIENsZWFyVHlwZSBhbHJlYWR5IGluCi0gICAqICAgV2luZG93cyAyMDAwKS4gIFNpbWlsYXJseSwgdXBkYXRlcyB0byBhIGdpdmVuIGZyYW1ld29yayBtaWdodCBpbmNsdWRlCi0gICAqICAgaW1wcm92ZWQgaGludGluZyBzdXBwb3J0LgotICAgKgotICAgKiAgIHsKLSAgICogICAgICB2ZXJzaW9uICAgc2FtcGxpbmcgICAgICAgICAgcmVuZGVyaW5nICAgICAgICBjb21tZW50Ci0gICAqICAgICAgICAgICAgICAgeCAgICAgICAgeSAgICAgICB4ICAgICAgICAgICB5Ci0gICAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgKiAgICAgICB2MS4wICAgbm9ybWFsICBub3JtYWwgIEIvVyAgICAgICAgICAgQi9XICAgIGJpLWxldmVsCi0gICAqICAgICAgIHYxLjYgICBoaWdoICAgIGhpZ2ggICAgZ3JheSAgICAgICAgICBncmF5ICAgZ3JheXNjYWxlCi0gICAqICAgICAgIHYxLjggICBoaWdoICAgIG5vcm1hbCAgY29sb3ItZmlsdGVyICBCL1cgICAgKEdESSkgQ2xlYXJUeXBlCi0gICAqICAgICAgIHYxLjkgICBoaWdoICAgIGhpZ2ggICAgY29sb3ItZmlsdGVyICBncmF5ICAgQ29sb3IgQ2xlYXJUeXBlCi0gICAqICAgICAgIHYyLjEgICBoaWdoICAgIG5vcm1hbCAgZ3JheSAgICAgICAgICBCL1cgICAgR3JheSBDbGVhclR5cGUKLSAgICogICAgICAgdjIuMSAgIGhpZ2ggICAgaGlnaCAgICBncmF5ICAgICAgICAgIGdyYXkgICBHcmF5IENsZWFyVHlwZQotICAgKiAgIH0KLSAgICoKLSAgICogICBDb2xvciBhbmQgR3JheSBDbGVhclR5cGUgYXJlIHRoZSB0d28gYXZhaWxhYmxlIHZhcmlhbnRzIG9mCi0gICAqICAgYFktZGlyZWN0aW9uIENsZWFyVHlwZScsIG1lYW5pbmcgZ3JheXNjYWxlIHJhc3Rlcml6YXRpb24gYWxvbmcgdGhlCi0gICAqICAgWS1kaXJlY3Rpb247IHRoZSBuYW1lIHVzZWQgaW4gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gZm9yIHRoaXMKLSAgICogICBmZWF0dXJlIGlzIGBzeW1tZXRyaWMgc21vb3RoaW5nJy4gIGBDbGFzc2ljIENsZWFyVHlwZScgaXMgdGhlCi0gICAqICAgb3JpZ2luYWwgYWxnb3JpdGhtIHVzZWQgYmVmb3JlIGludHJvZHVjaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBpbgotICAgKiAgIFdpbn5YUC4gIEFub3RoZXIgbmFtZSBmb3IgdjEuNidzIGdyYXlzY2FsZSByZW5kZXJpbmcgaXMgYGZvbnQKLSAgICogICBzbW9vdGhpbmcnLCBhbmQgYENvbG9yIENsZWFyVHlwZScgaXMgc29tZXRpbWVzIGFsc28gY2FsbGVkIGBEV3JpdGUKLSAgICogICBDbGVhclR5cGUnLiAgVG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRvZGF5J3MgQ29sb3IgQ2xlYXJUeXBlIGFuZCB0aGUKLSAgICogICBlYXJsaWVyIENsZWFyVHlwZSB2YXJpYW50IHdpdGggQi9XIHJlbmRlcmluZyBhbG9uZyB0aGUgdmVydGljYWwgYXhpcywKLSAgICogICB0aGUgbGF0dGVyIGlzIHNvbWV0aW1lcyBjYWxsZWQgYEdESSBDbGVhclR5cGUnLgotICAgKgotICAgKiAgIGBOb3JtYWwnIGFuZCBgaGlnaCcgc2FtcGxpbmcgZGVzY3JpYmUgdGhlICh2aXJ0dWFsKSByZXNvbHV0aW9uIHRvCi0gICAqICAgYWNjZXNzIHRoZSByYXN0ZXJpemVkIG91dGxpbmUgYWZ0ZXIgdGhlIGhpbnRpbmcgcHJvY2Vzcy4gIGBOb3JtYWwnCi0gICAqICAgbWVhbnMgMSBzYW1wbGUgcGVyIGdyaWQgbGluZSAoaS5lLiwgQi9XKS4gIEluIHRoZSBjdXJyZW50IE1pY3Jvc29mdAotICAgKiAgIGltcGxlbWVudGF0aW9uLCBgaGlnaCcgbWVhbnMgYW4gZXh0cmEgdmlydHVhbCByZXNvbHV0aW9uIG9mIDE2eDE2IChvcgotICAgKiAgIDE2eDEpIGdyaWQgbGluZXMgcGVyIHBpeGVsIGZvciBieXRlY29kZSBpbnN0cnVjdGlvbnMgbGlrZSBgTUlSUCcuCi0gICAqICAgQWZ0ZXIgaGludGluZywgdGhlc2UgMTYgZ3JpZCBsaW5lcyBhcmUgbWFwcGVkIHRvIDZ4NSAob3IgNngxKSBncmlkCi0gICAqICAgbGluZXMgZm9yIGNvbG9yIGZpbHRlcmluZyBpZiBDb2xvciBDbGVhclR5cGUgaXMgYWN0aXZhdGVkLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCBgR3JheSBDbGVhclR5cGUnIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHYxLjYncwotICAgKiAgIGdyYXlzY2FsZSByZW5kZXJpbmcuICBIb3dldmVyLCB0aGUgR0VUSU5GTyBpbnN0cnVjdGlvbiBoYW5kbGVzIGl0Ci0gICAqICAgZGlmZmVyZW50bHk6IHYxLjYgcmV0dXJucyBiaXR+MTIgKGhpbnRpbmcgZm9yIGdyYXlzY2FsZSksIHdoaWxlIHYyLjEKLSAgICogICByZXR1cm5zIGJpdHN+MTMgKGhpbnRpbmcgZm9yIENsZWFyVHlwZSksIDE4IChzeW1tZXRyaWNhbCBzbW9vdGhpbmcpLAotICAgKiAgIGFuZH4xOSAoR3JheSBDbGVhclR5cGUpLiAgQWxzbywgdGhpcyBtb2RlIHJlc3BlY3RzIGJpdHMgMiBhbmR+MyBmb3IKLSAgICogICB0aGUgdmVyc2lvbn4xIGdhc3AgdGFibGUgZXhjbHVzaXZlbHkgKGxpa2UgQ29sb3IgQ2xlYXJUeXBlKSwgd2hpbGUKLSAgICogICB2MS42IG9ubHkgcmVzcGVjdHMgdGhlIHZhbHVlcyBvZiB2ZXJzaW9ufjAgKGJpdHMgMCBhbmR+MSkuCi0gICAqCi0gICAqICAgS2VlcCBpbiBtaW5kIHRoYXQgdGhlIGZlYXR1cmVzIG9mIHRoZSBhYm92ZSBpbnRlcnByZXRlciB2ZXJzaW9ucwotICAgKiAgIG1pZ2h0IG5vdCBtYXAgZXhhY3RseSB0byBGcmVlVHlwZSBmZWF0dXJlcyBvciBiZWhhdmlvciBiZWNhdXNlIGl0IGlzCi0gICAqICAgYSBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBsaWJyYXJ5IHdpdGggZGlmZmVyZW50IGludGVybmFscy4KLSAgICoKLSAgICovCi0jZGVmaW5lIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzUgIDM1Ci0jZGVmaW5lIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzggIDM4Ci0jZGVmaW5lIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fNDAgIDQwCi0KLSAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogRlRUVERSVl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiOGFkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc2ltcGxlIHR5cGVzIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRUWVBFU19IXwotI2RlZmluZSBGVFRZUEVTX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0jaW5jbHVkZSBGVF9JTUFHRV9ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJhc2ljIERhdGEgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBiYXNpYyBkYXRhIHR5cGVzIGRlZmluZWQgYnkgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgYmFzaWMgZGF0YSB0eXBlcyBkZWZpbmVkIGJ5IEZyZWVUeXBlfjIsICAqLwotICAvKiAgICByYW5naW5nIGZyb20gc2ltcGxlIHNjYWxhciB0eXBlcyB0byBiaXRtYXAgZGVzY3JpcHRvcnMuICBNb3JlICAgICAgKi8KLSAgLyogICAgZm9udC1zcGVjaWZpYyBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHNlY3Rpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QdHJEaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VGV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GMkRvdDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVW5pdFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyNkRvdDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01BS0VfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dlbmVyaWNfRmluYWxpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BpeGVsX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QYWxldHRlX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lNQUdFX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgb2YgdW5zaWduZWQgY2hhciwgdXNlZCBmb3Igc2ltcGxlIGJvb2xlYW5zLiAgQXMgdXN1YWwsICAgKi8KLSAgLyogICAgdmFsdWVzIDEgYW5kfjAgcmVwcmVzZW50IHRydWUgYW5kIGZhbHNlLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEZUX0Jvb2w7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpZ25lZCAxNi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIGEgZGlzdGFuY2UgaW4gb3JpZ2luYWwgZm9udCAgKi8KLSAgLyogICAgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfRldvcmQ7ICAgLyogZGlzdGFuY2UgaW4gRlVuaXRzICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIGEgZGlzdGFuY2UgaW4gb3JpZ2luYWwgICAgKi8KLSAgLyogICAgZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VRldvcmQ7ICAvKiB1bnNpZ25lZCBkaXN0YW5jZSAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF9zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBjaGFyICBGVF9DaGFyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF91bnNpZ25lZF8gY2hhciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEZUX0J5dGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGNvbnN0YW50IG1lbW9yeSBhcmVhcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgY29uc3QgRlRfQnl0ZSogIEZUX0J5dGVzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciAzMi1iaXQgdGFncyAoYXMgdXNlZCBpbiB0aGUgU0ZOVCBmb3JtYXQpLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX1VJbnQzMiAgRlRfVGFnOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIGNoYXIgdHlwZSwgdXN1YWxseSB1c2VkIGZvciBzdHJpbmdzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGNoYXIgIEZUX1N0cmluZzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3Igc2lnbmVkIHNob3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX1Nob3J0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciB1bnNpZ25lZCBzaG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VU2hvcnQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHRoZSBpbnQgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIGludCAgRlRfSW50OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciB0aGUgdW5zaWduZWQgaW50IHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgRlRfVUludDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3Igc2lnbmVkIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfTG9uZzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VMb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgdW5zaWduZWQgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICBGVF9VTG9uZzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyRG90MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2lnbmVkIDIuMTQgZml4ZWQtcG9pbnQgdHlwZSB1c2VkIGZvciB1bml0IHZlY3RvcnMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX0YyRG90MTQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GMjZEb3Q2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpZ25lZCAyNi42IGZpeGVkLXBvaW50IHR5cGUgdXNlZCBmb3IgdmVjdG9yaWFsIHBpeGVsICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBsb25nICBGVF9GMjZEb3Q2OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWVzLCBsaWtlIHNjYWxpbmcgICovCi0gIC8qICAgIHZhbHVlcyBvciBtYXRyaXggY29lZmZpY2llbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfRml4ZWQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgRnJlZVR5cGUgZXJyb3IgY29kZSB0eXBlLiAgQSB2YWx1ZSBvZn4wIGlzIGFsd2F5cyBpbnRlcnByZXRlZCAgKi8KLSAgLyogICAgYXMgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludCAgRlRfRXJyb3I7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciBhIHR5cGVsZXNzIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZCogIEZUX1BvaW50ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEFOU0l+QyBgc2l6ZV90JyB0eXBlLCBpLmUuLCB0aGUgbGFyZ2VzdCAgKi8KLSAgLyogICAgX3Vuc2lnbmVkXyBpbnRlZ2VyIHR5cGUgdXNlZCB0byBleHByZXNzIGEgZmlsZSBzaXplIG9yIHBvc2l0aW9uLCAgICovCi0gIC8qICAgIG9yIGEgbWVtb3J5IGJsb2NrIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaXplX3QgIEZUX09mZnNldDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1B0ckRpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgQU5TSX5DIGBwdHJkaWZmX3QnIHR5cGUsIGkuZS4sIHRoZSAgICAgICAqLwotICAvKiAgICBsYXJnZXN0IF9zaWduZWRfIGludGVnZXIgdHlwZSB1c2VkIHRvIGV4cHJlc3MgdGhlIGRpc3RhbmNlICAgICAgICAgKi8KLSAgLyogICAgYmV0d2VlbiB0d28gcG9pbnRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGZ0X3B0cmRpZmZfdCAgRlRfUHRyRGlzdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VuaXRWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMkQgdmVjdG9yIHVuaXQgdmVjdG9yLiAgVXNlcyAgICAqLwotICAvKiAgICBGVF9GMkRvdDE0IHR5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4IDo6IEhvcml6b250YWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkgOjogVmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1VuaXRWZWN0b3JfCi0gIHsKLSAgICBGVF9GMkRvdDE0ICB4OwotICAgIEZUX0YyRG90MTQgIHk7Ci0KLSAgfSBGVF9Vbml0VmVjdG9yOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyeDIgbWF0cml4LiAgQ29lZmZpY2llbnRzIGFyZSAgICovCi0gIC8qICAgIGluIDE2LjE2IGZpeGVkLXBvaW50IGZvcm1hdC4gIFRoZSBjb21wdXRhdGlvbiBwZXJmb3JtZWQgaXM6ICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIHgnID0geCp4eCArIHkqeHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICB5JyA9IHgqeXggKyB5Knl5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeHggOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4eSA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHl4IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeXkgOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTWF0cml4XwotICB7Ci0gICAgRlRfRml4ZWQgIHh4LCB4eTsKLSAgICBGVF9GaXhlZCAgeXgsIHl5OwotCi0gIH0gRlRfTWF0cml4OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVhZC1vbmx5IGJpbmFyeSBkYXRhIHJlcHJlc2VudGVkIGFzIGEgcG9pbnRlciBhbmQgYSBsZW5ndGguICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRlciA6OiBUaGUgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggIDo6IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9EYXRhXwotICB7Ci0gICAgY29uc3QgRlRfQnl0ZSogIHBvaW50ZXI7Ci0gICAgRlRfSW50ICAgICAgICAgIGxlbmd0aDsKLQotICB9IEZUX0RhdGE7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZW5lcmljX0ZpbmFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXNjcmliZSBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSB0aGUgYGNsaWVudCcgZGF0YSBvZiBhbnkgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgb2JqZWN0LiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQEZUX0dlbmVyaWMgdHlwZSBmb3IgICovCi0gIC8qICAgIGRldGFpbHMgb2YgdXNhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBhZGRyZXNzIG9mIHRoZSBGcmVlVHlwZSBvYmplY3QgdGhhdCBpcyB1bmRlciBmaW5hbGl6YXRpb24uICAgICAqLwotICAvKiAgICBJdHMgY2xpZW50IGRhdGEgaXMgYWNjZXNzZWQgdGhyb3VnaCBpdHMgYGdlbmVyaWMnIGZpZWxkLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZCAgKCpGVF9HZW5lcmljX0ZpbmFsaXplcikodm9pZCogIG9iamVjdCk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDbGllbnQgYXBwbGljYXRpb25zIG9mdGVuIG5lZWQgdG8gYXNzb2NpYXRlIHRoZWlyIG93biBkYXRhIHRvIGEgICAgKi8KLSAgLyogICAgdmFyaWV0eSBvZiBGcmVlVHlwZSBjb3JlIG9iamVjdHMuICBGb3IgZXhhbXBsZSwgYSB0ZXh0IGxheW91dCBBUEkgICovCi0gIC8qICAgIG1pZ2h0IHdhbnQgdG8gYXNzb2NpYXRlIGEgZ2x5cGggY2FjaGUgdG8gYSBnaXZlbiBzaXplIG9iamVjdC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU29tZSBGcmVlVHlwZSBvYmplY3QgY29udGFpbnMgYSBgZ2VuZXJpYycgZmllbGQsIG9mIHR5cGUgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dlbmVyaWMsIHdoaWNoIHVzYWdlIGlzIGxlZnQgdG8gY2xpZW50IGFwcGxpY2F0aW9ucyBhbmQgZm9udCAgICAqLwotICAvKiAgICBzZXJ2ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGEgcG9pbnRlciB0byBjbGllbnQtc3BlY2lmaWMgZGF0YSwgYXMgd2VsbCAqLwotICAvKiAgICBhcyB0aGUgYWRkcmVzcyBvZiBhIGBmaW5hbGl6ZXInIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBieSAgKi8KLSAgLyogICAgRnJlZVR5cGUgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCAoZm9yIGV4YW1wbGUsIHRoZSBwcmV2aW91cyAgICovCi0gIC8qICAgIGNsaWVudCBleGFtcGxlIHdvdWxkIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2x5cGggY2FjaGUgZGVzdHJ1Y3RvciAqLwotICAvKiAgICBpbiB0aGUgYGZpbmFsaXplcicgZmllbGQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIGFueSBjbGllbnQtc3BlY2lmaWVkIGRhdGEuIFRoaXMgKi8KLSAgLyogICAgICAgICAgICAgICAgIGZpZWxkIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSB0aGUgRnJlZVR5cGUgbGlicmFyeS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaW5hbGl6ZXIgOjogQSBwb2ludGVyIHRvIGEgYGdlbmVyaWMgZmluYWxpemVyJyBmdW5jdGlvbiwgd2hpY2ggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuICBJZiB0aGlzICovCi0gIC8qICAgICAgICAgICAgICAgICBmaWVsZCBpcyBzZXQgdG8gTlVMTCwgbm8gY29kZSB3aWxsIGJlIGNhbGxlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dlbmVyaWNfCi0gIHsKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgZGF0YTsKLSAgICBGVF9HZW5lcmljX0ZpbmFsaXplciAgZmluYWxpemVyOwotCi0gIH0gRlRfR2VuZXJpYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01BS0VfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ci1sZXR0ZXIgdGFncyB0aGF0IGFyZSB1c2VkIHRvIGxhYmVsICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSB0YWJsZXMgaW50byBhbiB1bnNpZ25lZCBsb25nLCB0byBiZSB1c2VkIHdpdGhpbiBGcmVlVHlwZS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcHJvZHVjZWQgdmFsdWVzICptdXN0KiBiZSAzMi1iaXQgaW50ZWdlcnMuICBEb24ndCByZWRlZmluZSAgICAgKi8KLSAgLyogICAgdGhpcyBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NQUtFX1RBRyggX3gxLCBfeDIsIF94MywgX3g0ICkgXAotICAgICAgICAgIChGVF9UYWcpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKCAoRlRfVUxvbmcpX3gxIDw8IDI0ICkgfCAgICAgXAotICAgICAgICAgICAgKCAoRlRfVUxvbmcpX3gyIDw8IDE2ICkgfCAgICAgXAotICAgICAgICAgICAgKCAoRlRfVUxvbmcpX3gzIDw8ICA4ICkgfCAgICAgXAotICAgICAgICAgICAgICAoRlRfVUxvbmcpX3g0ICAgICAgICAgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEwgSSBTIFQgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0X3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdE5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIE1hbnkgZWxlbWVudHMgYW5kIG9iamVjdHMgaW4gRnJlZVR5cGUgYXJlIGxpc3RlZCB0aHJvdWdoIGFuICAgICAgICovCi0gIC8qICAgICBARlRfTGlzdCByZWNvcmQgKHNlZSBARlRfTGlzdFJlYykuICBBcyBpdHMgbmFtZSBzdWdnZXN0cywgYW4gICAgICAqLwotICAvKiAgICAgRlRfTGlzdE5vZGUgaXMgYSBoYW5kbGUgdG8gYSBzaW5nbGUgbGlzdCBlbGVtZW50LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0xpc3ROb2RlUmVjXyogIEZUX0xpc3ROb2RlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBsaXN0IHJlY29yZCAoc2VlIEBGVF9MaXN0UmVjKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9MaXN0UmVjXyogIEZUX0xpc3Q7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0Tm9kZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYSBzaW5nbGUgbGlzdCBlbGVtZW50LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwcmV2IDo6IFRoZSBwcmV2aW91cyBlbGVtZW50IGluIHRoZSBsaXN0LiAgTlVMTCBpZiBmaXJzdC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5leHQgOjogVGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdC4gIE5VTEwgaWYgbGFzdC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGxpc3RlZCBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTGlzdE5vZGVSZWNfCi0gIHsKLSAgICBGVF9MaXN0Tm9kZSAgcHJldjsKLSAgICBGVF9MaXN0Tm9kZSAgbmV4dDsKLSAgICB2b2lkKiAgICAgICAgZGF0YTsKLQotICB9IEZUX0xpc3ROb2RlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgc2ltcGxlIGRvdWJseS1saW5rZWQgbGlzdC4gIFRoZXNlIGFyZSAgICovCi0gIC8qICAgIHVzZWQgaW4gbWFueSBwYXJ0cyBvZiBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlYWQgOjogVGhlIGhlYWQgKGZpcnN0IGVsZW1lbnQpIG9mIGRvdWJseS1saW5rZWQgbGlzdC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFpbCA6OiBUaGUgdGFpbCAobGFzdCBlbGVtZW50KSBvZiBkb3VibHktbGlua2VkIGxpc3QuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTGlzdFJlY18KLSAgewotICAgIEZUX0xpc3ROb2RlICBoZWFkOwotICAgIEZUX0xpc3ROb2RlICB0YWlsOwotCi0gIH0gRlRfTGlzdFJlYzsKLQotICAvKiAqLwotCi0KLSNkZWZpbmUgRlRfSVNfRU1QVFkoIGxpc3QgKSAgKCAobGlzdCkuaGVhZCA9PSAwICkKLSNkZWZpbmUgRlRfQk9PTCggeCApICAoIChGVF9Cb29sKSggeCApICkKLQotICAvKiBjb25jYXRlbmF0ZSBDIHRva2VucyAqLwotI2RlZmluZSBGVF9FUlJfWENBVCggeCwgeSApICB4ICMjIHkKLSNkZWZpbmUgRlRfRVJSX0NBVCggeCwgeSApICAgRlRfRVJSX1hDQVQoIHgsIHkgKQotCi0gIC8qIHNlZSBgZnRtb2RlcnIuaCcgZm9yIGRlc2NyaXB0aW9ucyBvZiB0aGUgZm9sbG93aW5nIG1hY3JvcyAqLwotCi0jZGVmaW5lIEZUX0VSUiggZSApICBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICkKLQotI2RlZmluZSBGVF9FUlJPUl9CQVNFKCB4ICkgICAgKCAoeCkgJiAweEZGICkKLSNkZWZpbmUgRlRfRVJST1JfTU9EVUxFKCB4ICkgICggKHgpICYgMHhGRjAwVSApCi0KLSNkZWZpbmUgRlRfRVJSX0VRKCB4LCBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggRlRfRVJST1JfQkFTRSggeCApID09IEZUX0VSUk9SX0JBU0UoIEZUX0VSUiggZSApICkgKQotI2RlZmluZSBGVF9FUlJfTkVRKCB4LCBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBGVF9FUlJPUl9CQVNFKCB4ICkgIT0gRlRfRVJST1JfQkFTRSggRlRfRVJSKCBlICkgKSApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRUWVBFU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWVlZjZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnR3aW5mbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHdpbmZudC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgV2luZG93cyBmbnQtc3BlY2lmaWMgZGF0YS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRXSU5GTlRfSF8KLSNkZWZpbmUgRlRXSU5GTlRfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2luZm50X2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93IEZOVCBGaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93cyBGTlQgc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBXaW5kb3dzIEZOVCBzcGVjaWZpYyAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9XaW5GTlRfSURfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGNoYXJzZXQnIGJ5dGUgaW4KLSAgICogICBARlRfV2luRk5UX0hlYWRlclJlYy4gIEV4YWN0IG1hcHBpbmcgdGFibGVzIGZvciB0aGUgdmFyaW91cyBjcFhYWFgKLSAgICogICBlbmNvZGluZ3MgKGV4Y2VwdCBmb3IgY3AxMzYxKSBjYW4gYmUgZm91bmQgYXQKLSAgICogICBmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljIGluIHRoZSBNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTCi0gICAqICAgc3ViZGlyZWN0b3J5LiAgY3AxMzYxIGlzIHJvdWdobHkgYSBzdXBlcnNldCBvZgotICAgKiAgIE1BUFBJTkdTL09CU09MRVRFL0VBU1RBU0lBL0tTQy9KT0hBQi5UWFQuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfV2luRk5UX0lEX0RFRkFVTFQgOjoKLSAgICogICAgIFRoaXMgaXMgdXNlZCBmb3IgZm9udCBlbnVtZXJhdGlvbiBhbmQgZm9udCBjcmVhdGlvbiBhcyBhCi0gICAqICAgICBgZG9uJ3QgY2FyZScgdmFsdWUuICBWYWxpZCBmb250IGZpbGVzIGRvbid0IGNvbnRhaW4gdGhpcyB2YWx1ZS4KLSAgICogICAgIFdoZW4gcXVlcnlpbmcgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBmb250Ci0gICAqICAgICB0aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZCBpbnRvIGEgc3BlY2lmaWVkIGRldmljZSBjb250ZXh0LCB0aGlzCi0gICAqICAgICByZXR1cm4gdmFsdWUgKG9mIHRoZSByZWxhdGVkIFdpbmRvd3MgQVBJKSBzaW1wbHkgZGVub3RlcyBmYWlsdXJlLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9TWU1CT0wgOjoKLSAgICogICAgIFRoZXJlIGlzIG5vIGtub3duIG1hcHBpbmcgdGFibGUgYXZhaWxhYmxlLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9NQUMgOjoKLSAgICogICAgIE1hYyBSb21hbiBlbmNvZGluZy4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfT0VNIDo6Ci0gICAqICAgICBGcm9tIE1pY2hhZWwgUMO2dHRnZW4gPG1pY2hhZWxAcG9ldHRnZW4uZGU+OgotICAgKgotICAgKiAgICAgICBUaGUgYFdpbmRvd3MgRm9udCBNYXBwaW5nJyBhcnRpY2xlIHNheXMgdGhhdCBGVF9XaW5GTlRfSURfT0VNCi0gICAqICAgICAgIGlzIHVzZWQgZm9yIHRoZSBjaGFyc2V0IG9mIHZlY3RvciBmb250cywgbGlrZSBgbW9kZXJuLmZvbicsCi0gICAqICAgICAgIGByb21hbi5mb24nLCBhbmQgYHNjcmlwdC5mb24nIG9uIFdpbmRvd3MuCi0gICAqCi0gICAqICAgICAgIFRoZSBgQ3JlYXRlRm9udCcgZG9jdW1lbnRhdGlvbiBzYXlzOiBUaGUgRlRfV2luRk5UX0lEX09FTSB2YWx1ZQotICAgKiAgICAgICBzcGVjaWZpZXMgYSBjaGFyYWN0ZXIgc2V0IHRoYXQgaXMgb3BlcmF0aW5nLXN5c3RlbSBkZXBlbmRlbnQuCi0gICAqCi0gICAqICAgICAgIFRoZSBgSUZJTUVUUklDUycgZG9jdW1lbnRhdGlvbiBmcm9tIHRoZSBgV2luZG93cyBEcml2ZXIKLSAgICogICAgICAgRGV2ZWxvcG1lbnQgS2l0JyBzYXlzOiBUaGlzIGZvbnQgc3VwcG9ydHMgYW4gT0VNLXNwZWNpZmljCi0gICAqICAgICAgIGNoYXJhY3RlciBzZXQuICBUaGUgT0VNIGNoYXJhY3RlciBzZXQgaXMgc3lzdGVtIGRlcGVuZGVudC4KLSAgICoKLSAgICogICAgICAgSW4gZ2VuZXJhbCBPRU0sIGFzIG9wcG9zZWQgdG8gQU5TSSAoaS5lLiwgY3AxMjUyKSwgZGVub3RlcyB0aGUKLSAgICogICAgICAgc2Vjb25kIGRlZmF1bHQgY29kZXBhZ2UgdGhhdCBtb3N0IGludGVybmF0aW9uYWwgdmVyc2lvbnMgb2YKLSAgICogICAgICAgV2luZG93cyBoYXZlLiAgSXQgaXMgb25lIG9mIHRoZSBPRU0gY29kZXBhZ2VzIGZyb20KLSAgICoKLSAgICogICAgICAgICBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9nb2dsb2JhbC9iYjk2NDY1NSwKLSAgICoKLSAgICogICAgICAgYW5kIGlzIHVzZWQgZm9yIHRoZSBgRE9TIGJveGVzJywgdG8gc3VwcG9ydCBsZWdhY3kgYXBwbGljYXRpb25zLgotICAgKiAgICAgICBBIEdlcm1hbiBXaW5kb3dzIHZlcnNpb24gZm9yIGV4YW1wbGUgdXN1YWxseSB1c2VzIEFOU0kgY29kZXBhZ2UKLSAgICogICAgICAgMTI1MiBhbmQgT0VNIGNvZGVwYWdlIDg1MC4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1A4NzQgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgVGhhaSBUSVMgNjIwIGFuZCBJU08gODg1OS0xMS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1A5MzIgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgSmFwYW5lc2UgU2hpZnQtSklTICh3aXRoIG1pbm9yIGRldmlhdGlvbnMpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDkzNiA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBzaW1wbGlmaWVkIENoaW5lc2UgR0IgMjMxMi0xOTgwICh3aXRoIGRpZmZlcmVudAotICAgKiAgICAgb3JkZXJpbmcgYW5kIG1pbm9yIGRldmlhdGlvbnMpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDk0OSA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBLb3JlYW4gSGFuZ3VsIEtTfkMgNTYwMS0xOTg3ICh3aXRoIGRpZmZlcmVudAotICAgKiAgICAgb3JkZXJpbmcgYW5kIG1pbm9yIGRldmlhdGlvbnMpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDk1MCA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiB0cmFkaXRpb25hbCBDaGluZXNlIEJpZ341IEVUZW4gKHdpdGggZGlmZmVyZW50Ci0gICAqICAgICBvcmRlcmluZyBhbmQgbWlub3IgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1MCA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBFYXN0IEV1cm9wZWFuIElTTyA4ODU5LTIgKHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50Ci0gICAqICAgICBvcmRlcmluZykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1MSA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBSdXNzaWFuIElTTyA4ODU5LTUgKHdpdGggZGlmZmVyZW50IG9yZGVyaW5nKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjUyIDo6Ci0gICAqICAgICBBTlNJIGVuY29kaW5nLiAgQSBzdXBlcnNldCBvZiBJU08gODg1OS0xLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTMgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgR3JlZWsgSVNPIDg4NTktNyAod2l0aCBtaW5vciBtb2RpZmljYXRpb25zKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU0IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIFR1cmtpc2ggSVNPIDg4NTktOS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU1IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIEhlYnJldyBJU08gODg1OS04ICh3aXRoIHNvbWUgbW9kaWZpY2F0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1NiA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBBcmFiaWMgSVNPIDg4NTktNiAod2l0aCBkaWZmZXJlbnQgb3JkZXJpbmcpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTcgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgQmFsdGljIElTTyA4ODU5LTEzICh3aXRoIHNvbWUgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1OCA6OgotICAgKiAgICAgRm9yIFZpZXRuYW1lc2UuICBUaGlzIGVuY29kaW5nIGRvZXNuJ3QgY292ZXIgYWxsIG5lY2Vzc2FyeQotICAgKiAgICAgY2hhcmFjdGVycy4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMzYxIDo6Ci0gICAqICAgICBLb3JlYW4gKEpvaGFiKS4KLSAgICovCi0KLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1MiAgICAwCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9ERUZBVUxUICAgMQotI2RlZmluZSBGVF9XaW5GTlRfSURfU1lNQk9MICAgIDIKLSNkZWZpbmUgRlRfV2luRk5UX0lEX01BQyAgICAgIDc3Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDkzMiAgIDEyOAotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1A5NDkgICAxMjkKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTM2MSAgMTMwCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDkzNiAgIDEzNAotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1A5NTAgICAxMzYKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1MyAgMTYxCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTQgIDE2MgotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjU4ICAxNjMKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1NSAgMTc3Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTYgIDE3OAotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjU3ICAxODYKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1MSAgMjA0Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDg3NCAgIDIyMgotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUwICAyMzgKLSNkZWZpbmUgRlRfV2luRk5UX0lEX09FTSAgICAgMjU1Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9XaW5GTlRfSGVhZGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaW5kb3dzIEZOVCBIZWFkZXIgaW5mby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9XaW5GTlRfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICB2ZXJzaW9uOwotICAgIEZUX1VMb25nICAgZmlsZV9zaXplOwotICAgIEZUX0J5dGUgICAgY29weXJpZ2h0WzYwXTsKLSAgICBGVF9VU2hvcnQgIGZpbGVfdHlwZTsKLSAgICBGVF9VU2hvcnQgIG5vbWluYWxfcG9pbnRfc2l6ZTsKLSAgICBGVF9VU2hvcnQgIHZlcnRpY2FsX3Jlc29sdXRpb247Ci0gICAgRlRfVVNob3J0ICBob3Jpem9udGFsX3Jlc29sdXRpb247Ci0gICAgRlRfVVNob3J0ICBhc2NlbnQ7Ci0gICAgRlRfVVNob3J0ICBpbnRlcm5hbF9sZWFkaW5nOwotICAgIEZUX1VTaG9ydCAgZXh0ZXJuYWxfbGVhZGluZzsKLSAgICBGVF9CeXRlICAgIGl0YWxpYzsKLSAgICBGVF9CeXRlICAgIHVuZGVybGluZTsKLSAgICBGVF9CeXRlICAgIHN0cmlrZV9vdXQ7Ci0gICAgRlRfVVNob3J0ICB3ZWlnaHQ7Ci0gICAgRlRfQnl0ZSAgICBjaGFyc2V0OwotICAgIEZUX1VTaG9ydCAgcGl4ZWxfd2lkdGg7Ci0gICAgRlRfVVNob3J0ICBwaXhlbF9oZWlnaHQ7Ci0gICAgRlRfQnl0ZSAgICBwaXRjaF9hbmRfZmFtaWx5OwotICAgIEZUX1VTaG9ydCAgYXZnX3dpZHRoOwotICAgIEZUX1VTaG9ydCAgbWF4X3dpZHRoOwotICAgIEZUX0J5dGUgICAgZmlyc3RfY2hhcjsKLSAgICBGVF9CeXRlICAgIGxhc3RfY2hhcjsKLSAgICBGVF9CeXRlICAgIGRlZmF1bHRfY2hhcjsKLSAgICBGVF9CeXRlICAgIGJyZWFrX2NoYXI7Ci0gICAgRlRfVVNob3J0ICBieXRlc19wZXJfcm93OwotICAgIEZUX1VMb25nICAgZGV2aWNlX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGZhY2VfbmFtZV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBiaXRzX3BvaW50ZXI7Ci0gICAgRlRfVUxvbmcgICBiaXRzX29mZnNldDsKLSAgICBGVF9CeXRlICAgIHJlc2VydmVkOwotICAgIEZUX1VMb25nICAgZmxhZ3M7Ci0gICAgRlRfVVNob3J0ICBBX3NwYWNlOwotICAgIEZUX1VTaG9ydCAgQl9zcGFjZTsKLSAgICBGVF9VU2hvcnQgIENfc3BhY2U7Ci0gICAgRlRfVVNob3J0ICBjb2xvcl90YWJsZV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICByZXNlcnZlZDFbNF07Ci0KLSAgfSBGVF9XaW5GTlRfSGVhZGVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfV2luRk5UX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gQEZUX1dpbkZOVF9IZWFkZXJSZWMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9XaW5GTlRfSGVhZGVyUmVjXyogIEZUX1dpbkZOVF9IZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9XaW5GTlRfSGVhZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgUmV0cmlldmUgYSBXaW5kb3dzIEZOVCBmb250IGluZm8gaGVhZGVyLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIGFoZWFkZXIgOjogVGhlIFdpbkZOVCBoZWFkZXIuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggV2luZG93cyBGTlQgZmFjZXMsIHJldHVybmluZyBhbiBlcnJvcgotICAgKiAgIG90aGVyd2lzZS4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfV2luRk5UX0hlYWRlciggRlRfRmFjZSAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9XaW5GTlRfSGVhZGVyUmVjICAqYWhlYWRlciApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRXSU5GTlRfSF8gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZTgzZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGF1dG9oaW50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIGBhdXRvaGludCcgbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBhdXRvLWhpbnRlciBpcyB1c2VkIHRvIGxvYWQgYW5kIGF1dG9tYXRpY2FsbHkgaGludCBnbHlwaHMgaWYgYSAgICAqLwotICAvKiBmb3JtYXQtc3BlY2lmaWMgaGludGVyIGlzbid0IGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQVVUT0hJTlRfSF8KLSNkZWZpbmUgQVVUT0hJTlRfSF8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBzbWFsbCB0ZWNobmljYWwgbm90ZSByZWdhcmRpbmcgYXV0b21hdGljIGhpbnRpbmcgaW4gb3JkZXIgdG8gICAgICAgICovCi0gIC8qIGNsYXJpZnkgdGhpcyBtb2R1bGUgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQW4gYXV0b21hdGljIGhpbnRlciBtaWdodCBjb21wdXRlIHR3byBraW5kcyBvZiBkYXRhIGZvciBhIGdpdmVuIGZhY2U6ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGdsb2JhbCBoaW50czogVXN1YWxseSBzb21lIG1ldHJpY3MgdGhhdCBkZXNjcmliZSBnbG9iYWwgcHJvcGVydGllcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgIG9mIHRoZSBmYWNlLiAgSXQgaXMgY29tcHV0ZWQgYnkgc2Nhbm5pbmcgbW9yZSBvciBsZXNzICovCi0gIC8qICAgICAgICAgICAgICAgICBhZ2dyZXNzaXZlbHkgdGhlIGdseXBocyBpbiB0aGUgZmFjZSwgYW5kIHRodXMgY2FuIGJlICAqLwotICAvKiAgICAgICAgICAgICAgICAgdmVyeSBzbG93IHRvIGNvbXB1dGUgKGV2ZW4gaWYgdGhlIHNpemUgb2YgZ2xvYmFsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGhpbnRzIGlzIHJlYWxseSBzbWFsbCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGdseXBoIGhpbnRzOiAgVGhlc2UgZGVzY3JpYmUgc29tZSBpbXBvcnRhbnQgZmVhdHVyZXMgb2YgdGhlIGdseXBoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIG91dGxpbmUsIGFzIHdlbGwgYXMgaG93IHRvIGFsaWduIHRoZW0uICBUaGV5IGFyZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBnZW5lcmFsbHkgbXVjaCBmYXN0ZXIgdG8gY29tcHV0ZSB0aGFuIGdsb2JhbCBoaW50cy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGN1cnJlbnQgRnJlZVR5cGUgYXV0by1oaW50ZXIgZG9lcyBhIHByZXR0eSBnb29kIGpvYiB3aGlsZSAgICAgICAgICovCi0gIC8qIHBlcmZvcm1pbmcgZmFzdCBjb21wdXRhdGlvbnMgZm9yIGJvdGggZ2xvYmFsIGFuZCBnbHlwaCBoaW50cy4gICAgICAgICAqLwotICAvKiBIb3dldmVyLCB3ZSBtaWdodCBiZSBpbnRlcmVzdGVkIGluIGludHJvZHVjaW5nIG1vcmUgY29tcGxleCBhbmQgICAgICAgKi8KLSAgLyogcG93ZXJmdWwgYWxnb3JpdGhtcyBpbiB0aGUgZnV0dXJlLCBsaWtlIHRoZSBvbmUgZGVzY3JpYmVkIGluIHRoZSBKb2huICovCi0gIC8qIEQuIEhvYmJ5IHBhcGVyLCB3aGljaCB1bmZvcnR1bmF0ZWx5IHJlcXVpcmVzIGEgbG90IG1vcmUgaG9yc2Vwb3dlci4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQmVjYXVzZSBhIHN1ZmZpY2llbnRseSBzb3BoaXN0aWNhdGVkIGZvbnQgbWFuYWdlbWVudCBzeXN0ZW0gd291bGQgICAgICovCi0gIC8qIHR5cGljYWxseSBpbXBsZW1lbnQgYW4gTFJVIGNhY2hlIG9mIG9wZW5lZCBmYWNlIG9iamVjdHMgdG8gcmVkdWNlICAgICAqLwotICAvKiBtZW1vcnkgdXNhZ2UsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGJlIGFibGUgdG8gYXZvaWQgcmVjb21wdXRpbmcgICAgICAgKi8KLSAgLyogZ2xvYmFsIGhpbnRzIGV2ZXJ5IHRpbWUgdGhlIHNhbWUgZmFjZSBpcyByZS1vcGVuZWQuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSB0aHVzIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gY2FjaGUgZ2xvYmFsIGhpbnRzIG91dHNpZGUgb2YgdGhlIGZhY2UgKi8KLSAgLyogb2JqZWN0LCBpbiBvcmRlciB0byBzcGVlZCB1cCBmb250IHJlLW9wZW5pbmcgdGltZS4gIE9mIGNvdXJzZSwgdGhpcyAgICovCi0gIC8qIGZlYXR1cmUgaXMgcHVyZWx5IG9wdGlvbmFsLCBzbyBtb3N0IGNsaWVudCBwcm9ncmFtcyB3b24ndCBldmVuIG5vdGljZSAqLwotICAvKiBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEkgaW5pdGlhbGx5IHRob3VnaHQgdGhhdCBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSB0byBjYWNoZSB0aGUgZ2x5cGggICAqLwotICAvKiBoaW50cyB0b28uICBIb3dldmVyLCBteSBnZW5lcmFsIGlkZWEgbm93IGlzIHRoYXQgaWYgeW91IHJlYWxseSBuZWVkICAgKi8KLSAgLyogdG8gY2FjaGUgdGhlc2UgdG9vLCB5b3UgYXJlIHNpbXBseSBpbiBuZWVkIG9mIGEgbmV3IGZvbnQgZm9ybWF0LCAgICAgICovCi0gIC8qIHdoZXJlIGFsbCB0aGlzIGluZm9ybWF0aW9uIGNvdWxkIGJlIHN0b3JlZCB3aXRoaW4gdGhlIGZvbnQgZmlsZSBhbmQgICAqLwotICAvKiBkZWNvZGVkIG9uIHRoZSBmbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfQXV0b0hpbnRlclJlY18gICpGVF9BdXRvSGludGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxHZXRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIGdsb2JhbCBoaW50cyBjb21wdXRlZCBmb3IgYSBnaXZlbiBmYWNlIG9iamVjdC4gIFRoZSAgICovCi0gIC8qICAgIHJlc3VsdGluZyBkYXRhIGlzIGRpc3NvY2lhdGVkIGZyb20gdGhlIGZhY2UgYW5kIHdpbGwgc3Vydml2ZSBhICAgICAqLwotICAvKiAgICBjYWxsIHRvIEZUX0RvbmVfRmFjZSgpLiAgSXQgbXVzdCBiZSBkaXNjYXJkZWQgdGhyb3VnaCB0aGUgQVBJICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxEb25lRnVuYygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludGVyICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgYXV0by1oaW50ZXIuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbG9iYWxfaGludHMgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBnbG9iYWwgaGludHMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdsb2JhbF9sZW4gICA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZ2xvYmFsIGhpbnRzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfQXV0b0hpbnRlcl9HbG9iYWxHZXRGdW5jKSggRlRfQXV0b0hpbnRlciAgaGludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqICAgICAgICAgZ2xvYmFsX2hpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcqICAgICAgICAgIGdsb2JhbF9sZW4gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsRG9uZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpc2NhcmQgdGhlIGdsb2JhbCBoaW50cyByZXRyaWV2ZWQgdGhyb3VnaCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbEdldEZ1bmMoKS4gIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRoZXNlIGhpbnRzICAgKi8KLSAgLyogICAgYXJlIGZyZWVkIGZyb20gbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludGVyIDo6IEEgaGFuZGxlIHRvIHRoZSBhdXRvLWhpbnRlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbG9iYWwgOjogQSBwb2ludGVyIHRvIHJldHJpZXZlZCBnbG9iYWwgaGludHMgdG8gZGlzY2FyZC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0F1dG9IaW50ZXJfR2xvYmFsRG9uZUZ1bmMpKCBGVF9BdXRvSGludGVyICBoaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIGdsb2JhbCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxSZXNldEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY29tcHV0ZSB0aGUgZ2xvYmFsIG1ldHJpY3MgaW4gYSBnaXZlbiAgICovCi0gIC8qICAgIGZvbnQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGdsb2JhbCBmb250IGRhdGEgY2hhbmdlcyAoZS5nLiBNdWx0aXBsZSAqLwotICAvKiAgICBNYXN0ZXJzIGZvbnRzIHdoZXJlIGJsZW5kIGNvb3JkaW5hdGVzIGNoYW5nZSkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBhdXRvLWhpbnRlci4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfQXV0b0hpbnRlcl9HbG9iYWxSZXNldEZ1bmMpKCBGVF9BdXRvSGludGVyICBoaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dseXBoTG9hZEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCwgc2NhbGUsIGFuZCBhdXRvbWF0aWNhbGx5IGhpbnQgYSAgICAgKi8KLSAgLyogICAgZ2x5cGggZnJvbSBhIGdpdmVuIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IFRoZSBsb2FkIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FwYWJsZSBvZiBsb2FkaW5nIGNvbXBvc2l0ZSBnbHlwaHMgYnkgaGludGluZyAgICAqLwotICAvKiAgICBlYWNoIHN1Yi1nbHlwaCBpbmRlcGVuZGVudGx5ICh3aGljaCBpbXByb3ZlcyBxdWFsaXR5KS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IHdpbGwgY2FsbCB0aGUgZm9udCBkcml2ZXIgd2l0aCBARlRfTG9hZF9HbHlwaCwgd2l0aCAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9BdXRvSGludGVyX0dseXBoTG9hZEZ1bmMpKCBGVF9BdXRvSGludGVyICBoaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgIGxvYWRfZmxhZ3MgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBhdXRvLWhpbnRlciBtb2R1bGUncyBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlUmVjXwotICB7Ci0gICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxSZXNldEZ1bmMgIHJlc2V0X2ZhY2U7Ci0gICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxHZXRGdW5jICAgIGdldF9nbG9iYWxfaGludHM7Ci0gICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxEb25lRnVuYyAgIGRvbmVfZ2xvYmFsX2hpbnRzOwotICAgIEZUX0F1dG9IaW50ZXJfR2x5cGhMb2FkRnVuYyAgICBsb2FkX2dseXBoOwotCi0gIH0gRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWMsICpGVF9BdXRvSGludGVyX0ludGVyZmFjZTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX0FVVE9ISU5URVJfSU5URVJGQUNFKCAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlc2V0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9nbG9iYWxfaGludHNfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZ2x5cGhfICkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlUmVjICBjbGFzc18gPSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXNldF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2dseXBoXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX0FVVE9ISU5URVJfSU5URVJGQUNFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlc2V0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9nbG9iYWxfaGludHNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZ2x5cGhfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlUmVjKiAgY2xhenogKSAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmVzZXRfZmFjZSAgICAgICAgPSByZXNldF9mYWNlXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9nbG9iYWxfaGludHMgID0gZ2V0X2dsb2JhbF9oaW50c187ICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lX2dsb2JhbF9oaW50cyA9IGRvbmVfZ2xvYmFsX2hpbnRzXzsgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9nbHlwaCAgICAgICAgPSBsb2FkX2dseXBoXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEFVVE9ISU5UX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzYTA1NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2FsYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBcml0aG1ldGljIGNvbXB1dGF0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVENBTENfSF8KLSNkZWZpbmUgRlRDQUxDX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX011bERpdigpIGFuZCBGVF9NdWxGaXgoKSBhcmUgZGVjbGFyZWQgaW4gZnJlZXR5cGUuaC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgIEZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSCi0gIC8qIFByb3ZpZGUgYXNzZW1ibGVyIGZyYWdtZW50cyBmb3IgcGVyZm9ybWFuY2UtY3JpdGljYWwgZnVuY3Rpb25zLiAqLwotICAvKiBUaGVzZSBtdXN0IGJlIGRlZmluZWQgYHN0YXRpYyBfX2lubGluZV9fJyB3aXRoIEdDQy4gICAgICAgICAgICAgKi8KLQotI2lmIGRlZmluZWQoIF9fQ0NfQVJNICkgfHwgZGVmaW5lZCggX19BUk1DQ19fICkgIC8qIFJWQ1QgKi8KLQotI2RlZmluZSBGVF9NVUxGSVhfQVNTRU1CTEVSICBGVF9NdWxGaXhfYXJtCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgc3RhdGljIF9faW5saW5lIEZUX0ludDMyCi0gIEZUX011bEZpeF9hcm0oIEZUX0ludDMyICBhLAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgYiApCi0gIHsKLSAgICBGVF9JbnQzMiAgdCwgdDI7Ci0KLQotICAgIF9fYXNtCi0gICAgewotICAgICAgc211bGwgdDIsIHQsICBiLCAgYSAgICAgICAgICAgLyogKGxvPXQyLGhpPXQpID0gYSpiICovCi0gICAgICBtb3YgICBhLCAgdCwgIGFzciAjMzEgICAgICAgICAvKiBhICAgPSAoaGkgPj4gMzEpICovCi0gICAgICBhZGQgICBhLCAgYSwgICMweDgwMDAgICAgICAgICAvKiBhICArPSAweDgwMDAgKi8KLSAgICAgIGFkZHMgIHQyLCB0MiwgYSAgICAgICAgICAgICAgIC8qIHQyICs9IGEgKi8KLSAgICAgIGFkYyAgIHQsICB0LCAgIzAgICAgICAgICAgICAgIC8qIHQgICs9IGNhcnJ5ICovCi0gICAgICBtb3YgICBhLCAgdDIsIGxzciAjMTYgICAgICAgICAvKiBhICAgPSB0MiA+PiAxNiAqLwotICAgICAgb3JyICAgYSwgIGEsICB0LCAgbHNsICMxNiAgICAgLyogYSAgfD0gdCA8PCAxNiAqLwotICAgIH0KLSAgICByZXR1cm4gYTsKLSAgfQotCi0jZW5kaWYgLyogX19DQ19BUk0gfHwgX19BUk1DQ19fICovCi0KLQotI2lmZGVmIF9fR05VQ19fCi0KLSNpZiBkZWZpbmVkKCBfX2FybV9fICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgKCAhZGVmaW5lZCggX190aHVtYl9fICkgfHwgZGVmaW5lZCggX190aHVtYjJfXyApICkgJiYgXAotICAgICEoIGRlZmluZWQoIF9fQ0NfQVJNICkgfHwgZGVmaW5lZCggX19BUk1DQ19fICkgKQotCi0jZGVmaW5lIEZUX01VTEZJWF9BU1NFTUJMRVIgIEZUX011bEZpeF9hcm0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBzdGF0aWMgX19pbmxpbmVfXyBGVF9JbnQzMgotICBGVF9NdWxGaXhfYXJtKCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGIgKQotICB7Ci0gICAgRlRfSW50MzIgIHQsIHQyOwotCi0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAic211bGwgICUxLCAlMiwgJTQsICUzXG5cdCIgICAgICAgLyogKGxvPSUxLGhpPSUyKSA9IGEqYiAqLwotICAgICAgIm1vdiAgICAlMCwgJTIsIGFzciAjMzFcblx0IiAgICAgIC8qICUwICA9IChoaSA+PiAzMSkgKi8KLSNpZiBkZWZpbmVkKCBfX2NsYW5nX18gKSAmJiBkZWZpbmVkKCBfX3RodW1iMl9fICkKLSAgICAgICJhZGQudyAgJTAsICUwLCAjMHg4MDAwXG5cdCIgICAgICAvKiAlMCArPSAweDgwMDAgKi8KLSNlbHNlCi0gICAgICAiYWRkICAgICUwLCAlMCwgIzB4ODAwMFxuXHQiICAgICAgLyogJTAgKz0gMHg4MDAwICovCi0jZW5kaWYKLSAgICAgICJhZGRzICAgJTEsICUxLCAlMFxuXHQiICAgICAgICAgICAvKiAlMSArPSAlMCAqLwotICAgICAgImFkYyAgICAlMiwgJTIsICMwXG5cdCIgICAgICAgICAgIC8qICUyICs9IGNhcnJ5ICovCi0gICAgICAibW92ICAgICUwLCAlMSwgbHNyICMxNlxuXHQiICAgICAgLyogJTAgID0gJTEgPj4gMTYgKi8KLSAgICAgICJvcnIgICAgJTAsICUwLCAlMiwgbHNsICMxNlxuXHQiICAvKiAlMCB8PSAlMiA8PCAxNiAqLwotICAgICAgOiAiPXIiKGEpLCAiPSZyIih0MiksICI9JnIiKHQpCi0gICAgICA6ICJyIihhKSwgInIiKGIpCi0gICAgICA6ICJjYyIgKTsKLSAgICByZXR1cm4gYTsKLSAgfQotCi0jZW5kaWYgLyogX19hcm1fXyAgICAgICAgICAgICAgICAgICAgICAmJiAqLwotICAgICAgIC8qICggX190aHVtYjJfXyB8fCAhX190aHVtYl9fICkgJiYgKi8KLSAgICAgICAvKiAhKCBfX0NDX0FSTSB8fCBfX0FSTUNDX18gKSAgICAgICovCi0KLQotI2lmIGRlZmluZWQoIF9faTM4Nl9fICkKLQotI2RlZmluZSBGVF9NVUxGSVhfQVNTRU1CTEVSICBGVF9NdWxGaXhfaTM4NgotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIHN0YXRpYyBfX2lubGluZV9fIEZUX0ludDMyCi0gIEZUX011bEZpeF9pMzg2KCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludDMyICBiICkKLSAgewotICAgIEZUX0ludDMyICByZXN1bHQ7Ci0KLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICJpbXVsICAlJWVkeFxuIgotICAgICAgIm1vdmwgICUlZWR4LCAlJWVjeFxuIgotICAgICAgInNhcmwgICQzMSwgJSVlY3hcbiIKLSAgICAgICJhZGRsICAkMHg4MDAwLCAlJWVjeFxuIgotICAgICAgImFkZGwgICUlZWN4LCAlJWVheFxuIgotICAgICAgImFkY2wgICQwLCAlJWVkeFxuIgotICAgICAgInNocmwgICQxNiwgJSVlYXhcbiIKLSAgICAgICJzaGxsICAkMTYsICUlZWR4XG4iCi0gICAgICAiYWRkbCAgJSVlZHgsICUlZWF4XG4iCi0gICAgICA6ICI9YSIocmVzdWx0KSwgIj1kIihiKQotICAgICAgOiAiYSIoYSksICJkIihiKQotICAgICAgOiAiJWVjeCIsICJjYyIgKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSNlbmRpZiAvKiBpMzg2ICovCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotCi0KLSNpZmRlZiBfTVNDX1ZFUiAvKiBWaXN1YWwgQysrICovCi0KLSNpZmRlZiBfTV9JWDg2Ci0KLSNkZWZpbmUgRlRfTVVMRklYX0FTU0VNQkxFUiAgRlRfTXVsRml4X2kzODYKLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBzdGF0aWMgX19pbmxpbmUgRlRfSW50MzIKLSAgRlRfTXVsRml4X2kzODYoIEZUX0ludDMyICBhLAotICAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGIgKQotICB7Ci0gICAgRlRfSW50MzIgIHJlc3VsdDsKLQotICAgIF9fYXNtCi0gICAgewotICAgICAgbW92IGVheCwgYQotICAgICAgbW92IGVkeCwgYgotICAgICAgaW11bCBlZHgKLSAgICAgIG1vdiBlY3gsIGVkeAotICAgICAgc2FyIGVjeCwgMzEKLSAgICAgIGFkZCBlY3gsIDgwMDBoCi0gICAgICBhZGQgZWF4LCBlY3gKLSAgICAgIGFkYyBlZHgsIDAKLSAgICAgIHNociBlYXgsIDE2Ci0gICAgICBzaGwgZWR4LCAxNgotICAgICAgYWRkIGVheCwgZWR4Ci0gICAgICBtb3YgcmVzdWx0LCBlYXgKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0jZW5kaWYgLyogX01fSVg4NiAqLwotCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotCi0jaWYgZGVmaW5lZCggX19HTlVDX18gKSAmJiBkZWZpbmVkKCBfX3g4Nl82NF9fICkKLQotI2RlZmluZSBGVF9NVUxGSVhfQVNTRU1CTEVSICBGVF9NdWxGaXhfeDg2XzY0Ci0KLSAgc3RhdGljIF9faW5saW5lX18gRlRfSW50MzIKLSAgRlRfTXVsRml4X3g4Nl82NCggRlRfSW50MzIgIGEsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICBiICkKLSAgewotICAgIC8qIFRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBDOTAgZG9lc24ndCBzdXBwb3J0ICovCi0gICAgLyogYGxvbmcgbG9uZycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBfX0dOVUNfXyA+IDQgfHwgKCBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgKQotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbG9uZy1sb25nIgotI2VuZGlmCi0KLSNpZiAxCi0gICAgLyogVGVjaG5pY2FsbHkgbm90IGFuIGFzc2VtYmx5IGZyYWdtZW50LCBidXQgR0NDIGRvZXMgYSByZWFsbHkgZ29vZCAqLwotICAgIC8qIGpvYiBhdCBpbmxpbmluZyBpdCBhbmQgZ2VuZXJhdGluZyBnb29kIG1hY2hpbmUgY29kZSBmb3IgaXQuICAgICAgKi8KLSAgICBsb25nIGxvbmcgIHJldCwgdG1wOwotCi0KLSAgICByZXQgID0gKGxvbmcgbG9uZylhICogYjsKLSAgICB0bXAgID0gcmV0ID4+IDYzOwotICAgIHJldCArPSAweDgwMDAgKyB0bXA7Ci0KLSAgICByZXR1cm4gKEZUX0ludDMyKSggcmV0ID4+IDE2ICk7Ci0jZWxzZQotCi0gICAgLyogRm9yIHNvbWUgcmVhc29uLCBHQ0MgNC42IG9uIFVidW50dSAxMi4wNCBnZW5lcmF0ZXMgaW52YWxpZCBtYWNoaW5lICAqLwotICAgIC8qIGNvZGUgZnJvbSB0aGUgbGluZXMgYmVsb3cuICBUaGUgbWFpbiBpc3N1ZSBpcyB0aGF0IGB3aWRlX2EnIGlzIG5vdCAgKi8KLSAgICAvKiBwcm9wZXJseSBpbml0aWFsaXplZCBieSBzaWduLWV4dGVuZGluZyBgYScuICBJbnN0ZWFkLCB0aGUgZ2VuZXJhdGVkICovCi0gICAgLyogbWFjaGluZSBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgcmVnaXN0ZXIgdGhhdCBjb250YWlucyBgYScgb24gaW5wdXQgICAqLwotICAgIC8qIGNhbiBiZSB1c2VkIGRpcmVjdGx5IGFzIGEgNjQtYml0IHZhbHVlLCB3aGljaCBpcyB3cm9uZyBtb3N0IG9mIHRoZSAgKi8KLSAgICAvKiB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgbG9uZyBsb25nICB3aWRlX2EgPSAobG9uZyBsb25nKWE7Ci0gICAgbG9uZyBsb25nICB3aWRlX2IgPSAobG9uZyBsb25nKWI7Ci0gICAgbG9uZyBsb25nICByZXN1bHQ7Ci0KLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICJpbXVsICUyLCAlMVxuIgotICAgICAgIm1vdiAlMSwgJTBcbiIKLSAgICAgICJzYXIgJDYzLCAlMFxuIgotICAgICAgImxlYSAweDgwMDAoJTEsICUwKSwgJTBcbiIKLSAgICAgICJzYXIgJDE2LCAlMFxuIgotICAgICAgOiAiPSZyIihyZXN1bHQpLCAiPSZyIih3aWRlX2EpCi0gICAgICA6ICJyIih3aWRlX2IpCi0gICAgICA6ICJjYyIgKTsKLQotICAgIHJldHVybiAoRlRfSW50MzIpcmVzdWx0OwotI2VuZGlmCi0KLSNpZiBfX0dOVUNfXyA+IDQgfHwgKCBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgKQotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKLSNlbmRpZgotICB9Ci0KLSNlbmRpZiAvKiBfX0dOVUNfXyAmJiBfX3g4Nl82NF9fICovCi0KLSNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIgKi8KLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkxJTkVfTVVMRklYCi0jaWZkZWYgRlRfTVVMRklYX0FTU0VNQkxFUgotI2RlZmluZSBGVF9NdWxGaXgoIGEsIGIgKSAgRlRfTVVMRklYX0FTU0VNQkxFUiggKEZUX0ludDMyKShhKSwgKEZUX0ludDMyKShiKSApCi0jZW5kaWYKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTXVsRGl2X05vX1JvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIGAoYSpiKS9jJyAgICovCi0gIC8qICAgICh3aXRob3V0IHJvdW5kaW5nKSB3aXRoIG1heGltdW0gYWNjdXJhY3kgKGl0IHVzZXMgYSA2NC1iaXQgICAgICAgICAqLwotICAvKiAgICBpbnRlcm1lZGlhdGUgaW50ZWdlciB3aGVuZXZlciBuZWNlc3NhcnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLwotICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGMgOjogVGhlIGRpdmlzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKmIpL2MnLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0byAqLwotICAvKiAgICBkaXZpZGUgYnkgemVybzsgaXQgc2ltcGx5IHJldHVybnMgYE1heEludCcgb3IgYE1pbkludCcgZGVwZW5kaW5nICAgKi8KLSAgLyogICAgb24gdGhlIHNpZ25zIG9mIGBhJyBhbmQgYGInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9Mb25nICkKLSAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYyApOwotCi0KLSAgLyoKLSAgICogIEEgdmFyaWFudCBvZiBGVF9NYXRyaXhfTXVsdGlwbHkgd2hpY2ggc2NhbGVzIGl0cyByZXN1bHQgYWZ0ZXJ3YXJkcy4KLSAgICogIFRoZSBpZGVhIGlzIHRoYXQgYm90aCBgYScgYW5kIGBiJyBhcmUgc2NhbGVkIGJ5IGZhY3RvcnMgb2YgMTAgc28gdGhhdAotICAgKiAgdGhlIHZhbHVlcyBhcmUgYXMgcHJlY2lzZSBhcyBwb3NzaWJsZSB0byBnZXQgYSBjb3JyZWN0IHJlc3VsdCBkdXJpbmcKLSAgICogIHRoZSA2NGJpdCBtdWx0aXBsaWNhdGlvbi4gIExldCBgc2EnIGFuZCBgc2InIGJlIHRoZSBzY2FsaW5nIGZhY3RvcnMgb2YKLSAgICogIGBhJyBhbmQgYGInLCByZXNwZWN0aXZlbHksIHRoZW4gdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSByZXN1bHQgaXMKLSAgICogIGBzYSpzYicuCi0gICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZCggY29uc3QgRlRfTWF0cml4KiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4ICAgICAgICAqYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgc2NhbGluZyApOwotCi0KLSAgLyoKLSAgICogIEEgdmFyaWFudCBvZiBGVF9WZWN0b3JfVHJhbnNmb3JtLiAgU2VlIGNvbW1lbnRzIGZvcgotICAgKiAgRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZC4KLSAgICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9WZWN0b3JfVHJhbnNmb3JtX1NjYWxlZCggRlRfVmVjdG9yKiAgICAgICAgdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgc2NhbGluZyApOwotCi0KLSAgLyoKLSAgICogIFRoaXMgZnVuY3Rpb24gbm9ybWFsaXplcyBhIHZlY3RvciBhbmQgcmV0dXJucyBpdHMgb3JpZ2luYWwgbGVuZ3RoLgotICAgKiAgVGhlIG5vcm1hbGl6ZWQgdmVjdG9yIGlzIGEgMTYuMTYgZml4ZWQtcG9pbnQgdW5pdCB2ZWN0b3Igd2l0aCBsZW5ndGgKLSAgICogIGNsb3NlIHRvIDB4MTAwMDAuICBUaGUgYWNjdXJhY3kgb2YgdGhlIHJldHVybmVkIGxlbmd0aCBpcyBsaW1pdGVkIHRvCi0gICAqICAxNiBiaXRzIGFsc28uICBUaGUgZnVuY3Rpb24gdXRpbGl6ZXMgcXVpY2sgaW52ZXJzZSBzcXVhcmUgcm9vdAotICAgKiAgYXBwcm94aW1hdGlvbiB3aXRob3V0IGRpdmlzaW9ucyBhbmQgc3F1YXJlIHJvb3RzIHJlbHlpbmcgb24gTmV3dG9uJ3MKLSAgICogIGl0ZXJhdGlvbnMgaW5zdGVhZC4KLSAgICovCi0gIEZUX0JBU0UoIEZUX1VJbnQzMiApCi0gIEZUX1ZlY3Rvcl9Ob3JtTGVuKCBGVF9WZWN0b3IqICB2ZWN0b3IgKTsKLQotCi0gIC8qCi0gICAqICBSZXR1cm4gLTEsIDAsIG9yICsxLCBkZXBlbmRpbmcgb24gdGhlIG9yaWVudGF0aW9uIG9mIGEgZ2l2ZW4gY29ybmVyLgotICAgKiAgV2UgdXNlIHRoZSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0sIHdpdGggcG9zaXRpdmUgdmVydGljYWwgdmFsdWVzCi0gICAqICBnb2luZyB1cHdhcmRzLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgKzEgaWYgdGhlIGNvcm5lciB0dXJucyB0byB0aGUKLSAgICogIGxlZnQsIC0xIHRvIHRoZSByaWdodCwgYW5kIDAgZm9yIHVuZGVjaWRhYmxlIGNhc2VzLgotICAgKi8KLSAgRlRfQkFTRSggRlRfSW50ICkKLSAgZnRfY29ybmVyX29yaWVudGF0aW9uKCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApOwotCi0KLSAgLyoKLSAgICogIFJldHVybiBUUlVFIGlmIGEgY29ybmVyIGlzIGZsYXQgb3IgbmVhcmx5IGZsYXQuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgICogIHNheWluZyB0aGF0IHRoZSBjb3JuZXIgcG9pbnQgaXMgY2xvc2UgdG8gaXRzIG5laWdoYm9ycywgb3IgaW5zaWRlIGFuCi0gICAqICBlbGxpcHNlIGRlZmluZWQgYnkgdGhlIG5laWdoYm9yIGZvY2FsIHBvaW50cyB0byBiZSBtb3JlIHByZWNpc2UuCi0gICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBmdF9jb3JuZXJfaXNfZmxhdCggRlRfUG9zICBpbl94LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3kgKTsKLQotCi0gIC8qCi0gICAqICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluZGV4LgotICAgKi8KLQotI2lmbmRlZiAgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIKLSNpZiBkZWZpbmVkKCBfX0dOVUNfXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAotICAgICggX19HTlVDX18gPiAzIHx8ICggX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0ICkgKQotCi0jaWYgRlRfU0laRU9GX0lOVCA9PSA0Ci0KLSNkZWZpbmUgRlRfTVNCKCB4ICkgICggMzEgLSBfX2J1aWx0aW5fY2x6KCB4ICkgKQotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSA0Ci0KLSNkZWZpbmUgRlRfTVNCKCB4ICkgICggMzEgLSBfX2J1aWx0aW5fY2x6bCggeCApICkKLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIEZUX01TQgotCi0gIEZUX0JBU0UoIEZUX0ludCApCi0gIEZUX01TQiggRlRfVUludDMyICB6ICk7Ci0KLSNlbmRpZgotCi0KLSAgLyoKLSAgICogIFJldHVybiBzcXJ0KHgqeCt5KnkpLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBgRlRfVmVjdG9yX0xlbmd0aCcgYnV0IHVzZXMKLSAgICogIHR3byBmaXhlZC1wb2ludCBhcmd1bWVudHMgaW5zdGVhZC4KLSAgICovCi0gIEZUX0JBU0UoIEZUX0ZpeGVkICkKLSAgRlRfSHlwb3QoIEZUX0ZpeGVkICB4LAotICAgICAgICAgICAgRlRfRml4ZWQgIHkgKTsKLQotCi0jaWYgMAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NxcnRGaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGVzIHRoZSBzcXVhcmUgcm9vdCBvZiBhIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggOjogVGhlIHZhbHVlIHRvIGNvbXB1dGUgdGhlIHJvb3QgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYHNxcnQoeCknLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHZlcnkgZmFzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfSW50MzIgKQotICBGVF9TcXJ0Rml4ZWQoIEZUX0ludDMyICB4ICk7Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotI2RlZmluZSBJTlRfVE9fRjI2RE9UNiggeCApICAgICggKEZUX0xvbmcpKHgpICogNjQgICkgICAgLyogPDwgNiAgKi8KLSNkZWZpbmUgSU5UX1RPX0YyRE9UMTQoIHggKSAgICAoIChGVF9Mb25nKSh4KSAqIDE2Mzg0ICkgIC8qIDw8IDE0ICovCi0jZGVmaW5lIElOVF9UT19GSVhFRCggeCApICAgICAgKCAoRlRfTG9uZykoeCkgKiA2NTUzNiApICAvKiA8PCAxNiAqLwotI2RlZmluZSBGMkRPVDE0X1RPX0ZJWEVEKCB4ICkgICggKEZUX0xvbmcpKHgpICogNCApICAgICAgLyogPDwgMiAgKi8KLSNkZWZpbmUgRklYRURfVE9fSU5UKCB4ICkgICAgICAoIEZUX1JvdW5kRml4KCB4ICkgPj4gMTYgKQotCi0jZGVmaW5lIFJPVU5EX0YyNkRPVDYoIHggKSAgICAgKCB4ID49IDAgPyAoICAgICggKHgpICsgMzIgKSAmIC02NCApICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIC0oICggMzIgLSAoeCkgKSAmIC02NCApICkgKQotCi0gIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIG1hY3JvcyBoYXZlIHR3byBwdXJwb3Nlcy4KLSAgICoKLSAgICogIC4gVGFnIHBsYWNlcyB3aGVyZSBvdmVyZmxvdyBpcyBleHBlY3RlZCBhbmQgaGFybWxlc3MuCi0gICAqCi0gICAqICAuIEF2b2lkIHJ1bi10aW1lIHNhbml0aXplciBlcnJvcnMuCi0gICAqCi0gICAqICBVc2Ugd2l0aCBjYXJlIQotICAgKi8KLSNkZWZpbmUgQUREX0xPTkcoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChGVF9Mb25nKSggKEZUX1VMb25nKShhKSArIChGVF9VTG9uZykoYikgKQotI2RlZmluZSBTVUJfTE9ORyggYSwgYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKEZUX0xvbmcpKCAoRlRfVUxvbmcpKGEpIC0gKEZUX1VMb25nKShiKSApCi0jZGVmaW5lIE1VTF9MT05HKCBhLCBiICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoRlRfTG9uZykoIChGVF9VTG9uZykoYSkgKiAoRlRfVUxvbmcpKGIpICkKLSNkZWZpbmUgTkVHX0xPTkcoIGEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChGVF9Mb25nKSggLShGVF9VTG9uZykoYSkgKQotCi0jZGVmaW5lIEFERF9JTlQzMiggYSwgYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoRlRfSW50MzIpKCAoRlRfVUludDMyKShhKSArIChGVF9VSW50MzIpKGIpICkKLSNkZWZpbmUgU1VCX0lOVDMyKCBhLCBiICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChGVF9JbnQzMikoIChGVF9VSW50MzIpKGEpIC0gKEZUX1VJbnQzMikoYikgKQotI2RlZmluZSBNVUxfSU5UMzIoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKEZUX0ludDMyKSggKEZUX1VJbnQzMikoYSkgKiAoRlRfVUludDMyKShiKSApCi0jZGVmaW5lIE5FR19JTlQzMiggYSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoRlRfSW50MzIpKCAtKEZUX1VJbnQzMikoYSkgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUQ0FMQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjZDJiMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRlYnVnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIElNUE9SVEFOVDogQSBkZXNjcmlwdGlvbiBvZiBGcmVlVHlwZSdzIGRlYnVnZ2luZyBzdXBwb3J0IGNhbiBiZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgIGZvdW5kIGluIGBkb2NzL0RFQlVHLlRYVCcuICBSZWFkIGl0IGlmIHlvdSBuZWVkIHRvIHVzZSBvciAgICovCi0vKiAgICAgICAgICAgICB1bmRlcnN0YW5kIHRoaXMgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVERFQlVHX0hfCi0jZGVmaW5lIEZUREVCVUdfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogZm9yY2UgdGhlIGRlZmluaXRpb24gb2YgRlRfREVCVUdfTEVWRUxfRVJST1IgaWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLSAgLyogaXMgYWxyZWFkeSBkZWZpbmVkOyB0aGlzIHNpbXBsaWZpZXMgdGhlIGZvbGxvd2luZyAjaWZkZWZzICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotI3VuZGVmICBGVF9ERUJVR19MRVZFTF9FUlJPUgotI2RlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGUgdHJhY2UgZW51bXMgYXMgd2VsbCBhcyB0aGUgdHJhY2UgbGV2ZWxzIGFycmF5IHdoZW4gdGhleSAgICAqLwotICAvKiBhcmUgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotI2RlZmluZSBGVF9UUkFDRV9ERUYoIHggKSAgdHJhY2VfICMjIHggLAotCi0gIC8qIGRlZmluaW5nIHRoZSBlbnVtZXJhdGlvbiAqLwotICB0eXBlZGVmIGVudW0gIEZUX1RyYWNlXwotICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICi0gICAgdHJhY2VfY291bnQKLQotICB9IEZUX1RyYWNlOwotCi0KLSAgLyogZGVmaW5pbmcgdGhlIGFycmF5IG9mIHRyYWNlIGxldmVscywgcHJvdmlkZWQgYnkgYHNyYy9iYXNlL2Z0ZGVidWcuYycgKi8KLSAgZXh0ZXJuIGludCAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2NvdW50XTsKLQotI3VuZGVmIEZUX1RSQUNFX0RFRgotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoZSBGVF9UUkFDRSBtYWNybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJTVBPUlRBTlQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggY29tcG9uZW50IG11c3QgZGVmaW5lIHRoZSBtYWNybyBGVF9DT01QT05FTlQgdG8gYSB2YWxpZCBGVF9UcmFjZSAqLwotICAvKiB2YWx1ZSBiZWZvcmUgdXNpbmcgYW55IFRSQUNFIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCBmdF90cmFjZV9sZXZlbHNbRlRfQ09NUE9ORU5UXSA+PSBsZXZlbCApIFwKLSAgICAgICAgICAgICAgRlRfTWVzc2FnZSB2YXJmb3JtYXQ7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSB3aGlsZSAoIDAgKQotCi0jZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgICAvKiBub3RoaW5nICovCi0KLSNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RyYWNlX0dldF9Db3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFjZSBjb21wb25lbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBudW1iZXIgb2YgdHJhY2UgY29tcG9uZW50cy4gIDAgaWYgRnJlZVR5cGUgMiBpcyBub3QgYnVpbHQgd2l0aCAqLwotICAvKiAgICBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYWNjZXNzIGVsZW1lbnRzIG9mICAgICAgKi8KLSAgLyogICAgdGhlIGludGVybmFsIGBmdF90cmFjZV9sZXZlbHMnIGFycmF5IGJ5IGFuIGluZGV4LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RyYWNlX0dldF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgbmFtZSBvZiBhIHRyYWNlIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBpbmRleCBvZiB0aGUgdHJhY2UgY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBuYW1lIG9mIHRoZSB0cmFjZSBjb21wb25lbnQuICBUaGlzIGlzIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgICAqLwotICAvKiAgICBDIHN0cmluZywgc28gZG8gbm90IGZyZWUgaXQgYWZ0ZXIgdXNlLiAgTlVMTCBpZiBGcmVlVHlwZSAyIGlzIG5vdCAgKi8KLSAgLyogICAgYnVpbHQgd2l0aCBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9UcmFjZV9HZXRfQ291bnQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRyYWNlICAgICAgICovCi0gIC8qICAgIGNvbXBvbmVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgRnJlZVR5cGUgMidzICAgICovCi0gIC8qICAgIGRlYnVnIGxldmVsIGluIHlvdXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggY29uc3QgY2hhciogKQotICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWW91IG5lZWQgdHdvIG9wZW5pbmcgYW5kIGNsb3NpbmcgcGFyZW50aGVzZXMhICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFeGFtcGxlOiBGVF9UUkFDRTAoKCAiVmFsdWUgaXMgJWkiLCBmb28gKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE91dHB1dCBvZiB0aGUgRlRfVFJBQ0VYIG1hY3JvcyBpcyBzZW50IHRvIHN0ZGVyci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRlRfVFJBQ0UwKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDAsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFMSggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCAxLCB2YXJmb3JtYXQgKQotI2RlZmluZSBGVF9UUkFDRTIoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMiwgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0UzKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDMsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFNCggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA0LCB2YXJmb3JtYXQgKQotI2RlZmluZSBGVF9UUkFDRTUoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggNSwgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0U2KCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDYsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFNyggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA3LCB2YXJmb3JtYXQgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIEZUX0VSUk9SIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE91dHB1dCBvZiB0aGlzIG1hY3JvIGlzIHNlbnQgdG8gc3RkZXJyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgotCi0jZGVmaW5lIEZUX0VSUk9SKCB2YXJmb3JtYXQgKSAgRlRfTWVzc2FnZSAgdmFyZm9ybWF0Ci0KLSNlbHNlICAvKiAhRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLQotI2RlZmluZSBGVF9FUlJPUiggdmFyZm9ybWF0ICkgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAgIC8qIG5vdGhpbmcgKi8KLQotI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIEZUX0FTU0VSVCBhbmQgRlRfVEhST1cgbWFjcm9zLiAgVGhlIGNhbGwgdG8gYEZUX1Rocm93JyAgICAgKi8KLSAgLyogbWFrZXMgaXQgcG9zc2libGUgdG8gZWFzaWx5IHNldCBhIGJyZWFrcG9pbnQgYXQgdGhpcyBmdW5jdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0KLSNkZWZpbmUgRlRfQVNTRVJUKCBjb25kaXRpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICggISggY29uZGl0aW9uICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBGVF9QYW5pYyggImFzc2VydGlvbiBmYWlsZWQgb24gbGluZSAlZCBvZiBmaWxlICVzXG4iLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgX19GSUxFX18gKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLSNkZWZpbmUgRlRfVEhST1coIGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggRlRfVGhyb3coIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKSwgICBcCi0gICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXyApICAgICAgICAgICAgICAgICAgICAgIHwgXAotICAgICAgICAgICAgRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApICAgICAgICAgICAgKQotCi0jZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLQotI2RlZmluZSBGVF9BU1NFUlQoIGNvbmRpdGlvbiApICBkbyB7IH0gd2hpbGUgKCAwICkKLQotI2RlZmluZSBGVF9USFJPVyggZSApICBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICkKLQotI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgYEZUX01lc3NhZ2UnIGFuZCBgRlRfUGFuaWMnIHdoZW4gbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKLQotI2luY2x1ZGUgInN0ZGlvLmgiICAvKiBmb3IgdmZwcmludGYoKSAqLwotCi0gIC8qIHByaW50IGEgbWVzc2FnZSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfTWVzc2FnZSggY29uc3QgY2hhciogIGZtdCwKLSAgICAgICAgICAgICAgLi4uICk7Ci0KLSAgLyogcHJpbnQgYSBtZXNzYWdlIGFuZCBleGl0ICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9QYW5pYyggY29uc3QgY2hhciogIGZtdCwKLSAgICAgICAgICAgIC4uLiApOwotCi0gIC8qIHJlcG9ydCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIG9mIGFuIGVycm9yICovCi0gIEZUX0JBU0UoIGludCApCi0gIEZUX1Rocm93KCBGVF9FcnJvciAgICAgZXJyb3IsCi0gICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlICk7Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X2RlYnVnX2luaXQoIHZvaWQgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRERUJVR19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJmYThkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRyaXZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlREUklWRVJfSF8KLSNkZWZpbmUgRlREUklWRVJfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfRmFjZV9Jbml0RnVuYykoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgdHlwZWZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtZXRlcnMgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9GYWNlX0RvbmVGdW5jKSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NpemVfSW5pdEZ1bmMpKCBGVF9TaXplICBzaXplICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfU2l6ZV9Eb25lRnVuYykoIEZUX1NpemUgIHNpemUgKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TbG90X0luaXRGdW5jKSggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfU2xvdF9Eb25lRnVuYykoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NpemVfUmVxdWVzdEZ1bmMpKCBGVF9TaXplICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NpemVfU2VsZWN0RnVuYykoIEZUX1NpemUgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBzaXplX2luZGV4ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1Nsb3RfTG9hZEZ1bmMpKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfRmFjZV9HZXRLZXJuaW5nRnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBrZXJuaW5nICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfRmFjZV9BdHRhY2hGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGFkdmFuY2VzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Ecml2ZXJfQ2xhc3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZm9udCBkcml2ZXIgY2xhc3MuICBUaGlzIHN0cnVjdHVyZSBtb3N0bHkgY29udGFpbnMgcG9pbnRlcnMgdG8gKi8KLSAgLyogICAgZHJpdmVyIG1ldGhvZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgICAgICA6OiBUaGUgcGFyZW50IG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX29iamVjdF9zaXplIDo6IFRoZSBzaXplIG9mIGEgZmFjZSBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemVfb2JqZWN0X3NpemUgOjogVGhlIHNpemUgb2YgYSBzaXplIG9iamVjdCBpbiBieXRlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2xvdF9vYmplY3Rfc2l6ZSA6OiBUaGUgc2l6ZSBvZiBhIGdseXBoIG9iamVjdCBpbiBieXRlcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbml0X2ZhY2UgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgZmFjZSBjb25zdHJ1Y3Rvci4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRvbmVfZmFjZSAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBmYWNlIGRlc3RydWN0b3IuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5pdF9zaXplICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIHNpemUgY29uc3RydWN0b3IuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkb25lX3NpemUgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgc2l6ZSBkZXN0cnVjdG9yLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluaXRfc2xvdCAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzbG90IGNvbnN0cnVjdG9yLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9uZV9zbG90ICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIHNsb3QgZGVzdHJ1Y3Rvci4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9nbHlwaCAgICAgICA6OiBBIGZ1bmN0aW9uIGhhbmRsZSB0byBsb2FkIGEgZ2x5cGggdG8gYSBzbG90LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBtYW5kYXRvcnkhICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2V0X2tlcm5pbmcgICAgICA6OiBBIGZ1bmN0aW9uIGhhbmRsZSB0byByZXR1cm4gdGhlIHVuc2NhbGVkICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZyBmb3IgYSBnaXZlbiBwYWlyIG9mIGdseXBocy4gIENhbiBiZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byAwIGlmIHRoZSBmb3JtYXQgZG9lc24ndCBzdXBwb3J0ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBrZXJuaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhdHRhY2hfZmlsZSAgICAgIDo6IFRoaXMgZnVuY3Rpb24gaGFuZGxlIGlzIHVzZWQgdG8gcmVhZCAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsIGRhdGEgZm9yIGEgZmFjZSBmcm9tIGFub3RoZXIgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS9zdHJlYW0uICBGb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZCB0byAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBkYXRhIGZyb20gQUZNIG9yIFBGTSBmaWxlcyBvbiBhIFR5cGUgMSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmYWNlLCBvciBhIENJRE1hcCBvbiBhIENJRC1rZXllZCBmYWNlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZXRfYWR2YW5jZXMgICAgIDo6IEEgZnVuY3Rpb24gaGFuZGxlIHVzZWQgdG8gcmV0dXJuIGFkdmFuY2UgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMgb2YgYGNvdW50JyBnbHlwaHMgKGluIGZvbnQgdW5pdHMpLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgYGZpcnN0Jy4gIFRoZSBgdmVydGljYWwnIGZsYWcgbXVzdCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCB0byBnZXQgdmVydGljYWwgYWR2YW5jZSBoZWlnaHRzLiAgVGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBgYWR2YW5jZXMnIGJ1ZmZlciBpcyBjYWxsZXItYWxsb2NhdGVkLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlkZWEgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBiZSBhYmxlIHRvICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gZGV2aWNlLWluZGVwZW5kZW50IHRleHQgbGF5b3V0IHdpdGhvdXQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nIGEgc2luZ2xlIGdseXBoIGltYWdlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZXF1ZXN0X3NpemUgICAgIDo6IEEgaGFuZGxlIHRvIGEgZnVuY3Rpb24gdXNlZCB0byByZXF1ZXN0IHRoZSBuZXcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2l6ZS4gIENhbiBiZSBzZXQgdG8gMCBpZiB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGluZyBkb25lIGluIHRoZSBiYXNlIGxheWVyIHN1ZmZpY2VzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2VsZWN0X3NpemUgICAgICA6OiBBIGhhbmRsZSB0byBhIGZ1bmN0aW9uIHVzZWQgdG8gc2VsZWN0IGEgbmV3ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgc2l6ZS4gIEl0IGlzIHVzZWQgb25seSBpZiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgaXMgc2V0LiAgQ2FuIGJlIHNldCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICB0byAwIGlmIHRoZSBzY2FsaW5nIGRvbmUgaW4gdGhlIGJhc2UgbGF5ZXIgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc3VmZmljZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTW9zdCBmdW5jdGlvbiBwb2ludGVycywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGBsb2FkX2dseXBoJywgY2FuIGJlICovCi0gIC8qICAgIHNldCB0byAwIHRvIGluZGljYXRlIGEgZGVmYXVsdCBiZWhhdmlvdXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0RyaXZlcl9DbGFzc1JlY18KLSAgewotICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICByb290OwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgIGZhY2Vfb2JqZWN0X3NpemU7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgIHNpemVfb2JqZWN0X3NpemU7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgIHNsb3Rfb2JqZWN0X3NpemU7Ci0KLSAgICBGVF9GYWNlX0luaXRGdW5jICAgICAgICAgaW5pdF9mYWNlOwotICAgIEZUX0ZhY2VfRG9uZUZ1bmMgICAgICAgICBkb25lX2ZhY2U7Ci0KLSAgICBGVF9TaXplX0luaXRGdW5jICAgICAgICAgaW5pdF9zaXplOwotICAgIEZUX1NpemVfRG9uZUZ1bmMgICAgICAgICBkb25lX3NpemU7Ci0KLSAgICBGVF9TbG90X0luaXRGdW5jICAgICAgICAgaW5pdF9zbG90OwotICAgIEZUX1Nsb3RfRG9uZUZ1bmMgICAgICAgICBkb25lX3Nsb3Q7Ci0KLSAgICBGVF9TbG90X0xvYWRGdW5jICAgICAgICAgbG9hZF9nbHlwaDsKLQotICAgIEZUX0ZhY2VfR2V0S2VybmluZ0Z1bmMgICBnZXRfa2VybmluZzsKLSAgICBGVF9GYWNlX0F0dGFjaEZ1bmMgICAgICAgYXR0YWNoX2ZpbGU7Ci0gICAgRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMgIGdldF9hZHZhbmNlczsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4yICovCi0gICAgRlRfU2l6ZV9SZXF1ZXN0RnVuYyAgICAgIHJlcXVlc3Rfc2l6ZTsKLSAgICBGVF9TaXplX1NlbGVjdEZ1bmMgICAgICAgc2VsZWN0X3NpemU7Ci0KLSAgfSBGVF9Ecml2ZXJfQ2xhc3NSZWMsICpGVF9Ecml2ZXJfQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUNMQVJFX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGNyZWF0ZSBhIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gRlRfRHJpdmVyX0NsYXNzUmVjICAgICAgKi8KLSAgLyogICAgc3RydWN0IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIEZUX0RyaXZlcl9DbGFzc1JlYyBzdHJ1Y3QuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYSBgY3JlYXRlJyBmdW5jdGlvbiBoYXMgdG8gYmUgKi8KLSAgLyogICAgY2FsbGVkIHdpdGggYSBwb2ludGVyIHdoZXJlIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlIGlzIHJldHVybmVkLiAgICovCi0gIC8qICAgIEFuZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgYSBgZGVzdHJveScgZnVuY3Rpb24gbmVlZHMgdG8gYmUgICAqLwotICAvKiAgICBjYWxsZWQgdG8gcmVsZWFzZSB0aGF0IGFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBmdGluaXQuYycgKGZ0X2NyZWF0ZV9kZWZhdWx0X21vZHVsZV9jbGFzc2VzKSBhbHJlYWR5IGNvbnRhaW5zIGEgICAqLwotICAvKiAgICBtZWNoYW5pc20gdG8gY2FsbCB0aGVzZSBmdW5jdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG1vZHVsZXMgICAgICAgICAgKi8KLSAgLyogICAgZGVzY3JpYmVkIGluIGBmdG1vZHVsZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RpY2UgdGhhdCB0aGUgY3JlYXRlZCBgY3JlYXRlJyBhbmQgYGRlc3Ryb3knIGZ1bmN0aW9ucyBjYWxsICAgICAgKi8KLSAgLyogICAgYHBpY19pbml0JyBhbmQgYHBpY19mcmVlJyB0byBhbGxvdyB5b3UgdG8gbWFudWFsbHkgYWxsb2NhdGUgYW5kICAgICovCi0gIC8qICAgIGluaXRpYWxpemUgYW55IGFkZGl0aW9uYWwgZ2xvYmFsIGRhdGEsIGxpa2UgYSBtb2R1bGUgc3BlY2lmaWMgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UsIGFuZCBwdXQgdGhlbSBpbiB0aGUgZ2xvYmFsIHBpYyBjb250YWluZXIgZGVmaW5lZCBpbiAgICAgKi8KLSAgLyogICAgYGZ0cGljLmgnLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlbSBqdXN0IGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIGFzICovCi0gIC8qICAgIGVtcHR5IHRvIHJlc29sdmUgdGhlIGxpbmsgZXJyb3IuICBBbHNvIHRoZSBgcGljX2luaXQnIGFuZCAgICAgICAgICAqLwotICAvKiAgICBgcGljX2ZyZWUnIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gYHBpYy5oJywgdG8gYmUgcmVmZXJyZWQgKi8KLSAgLyogICAgYnkgZHJpdmVyIGRlZmluaXRpb24gY2FsbGluZyBgRlRfREVGSU5FX0RSSVZFUicgaW4gZm9sbG93aW5nLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIG5vdCBkZWZpbmVkIHRoZSBzdHJ1Y3Qgd2lsbCBiZSAgICAgICAgKi8KLSAgLyogICAgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZSB0aGUgbWFjcm8gaXMgICAgICovCi0gIC8qICAgIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUNMQVJFX0RSSVZFUiggY2xhc3NfICkgIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyAgY2xhc3NfOwotCi0jZGVmaW5lIEZUX0RFRklORV9EUklWRVIoICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmFjZV9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2xvdF9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF9zbG90XywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9zbG90XywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2tlcm5pbmdfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgYXR0YWNoX2ZpbGVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2FkdmFuY2VzXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWVzdF9zaXplXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2VsZWN0X3NpemVfICkgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyAgY2xhc3NfID0gICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCBmbGFnc18sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc18sICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lXywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmFjZV9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2l6ZV9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2xvdF9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF9zbG90XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV9zbG90XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2tlcm5pbmdfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXR0YWNoX2ZpbGVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2FkdmFuY2VzXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVxdWVzdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2VsZWN0X3NpemVfICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9EUklWRVIoIGNsYXNzXyApICBGVF9ERUNMQVJFX01PRFVMRSggY2xhc3NfICkKLQotI2RlZmluZSBGVF9ERUZJTkVfRFJJVkVSKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmYWNlX29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2xvdF9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9zbG90XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9rZXJuaW5nXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgYXR0YWNoX2ZpbGVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfYWR2YW5jZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVlc3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2VsZWN0X3NpemVfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKSAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRHJpdmVyX0NsYXNzICBkY2xhenogPSAoRlRfRHJpdmVyX0NsYXNzKWNsYXp6OyAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhc3NfICMjIF9waWNfZnJlZSggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGRjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggZGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICkgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBjbGFzc18gIyMgX3BpY19pbml0KCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9ERUZJTkVfUk9PVF9NT0RVTEUoIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5mYWNlX29iamVjdF9zaXplID0gZmFjZV9vYmplY3Rfc2l6ZV87ICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNpemVfb2JqZWN0X3NpemUgPSBzaXplX29iamVjdF9zaXplXzsgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2xvdF9vYmplY3Rfc2l6ZSA9IHNsb3Rfb2JqZWN0X3NpemVfOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmluaXRfZmFjZSAgICAgICAgPSBpbml0X2ZhY2VfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZG9uZV9mYWNlICAgICAgICA9IGRvbmVfZmFjZV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmluaXRfc2l6ZSAgICAgICAgPSBpbml0X3NpemVfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZG9uZV9zaXplICAgICAgICA9IGRvbmVfc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmluaXRfc2xvdCAgICAgICAgPSBpbml0X3Nsb3RfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZG9uZV9zbG90ICAgICAgICA9IGRvbmVfc2xvdF87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfZ2x5cGggICAgICAgPSBsb2FkX2dseXBoXzsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfa2VybmluZyAgICAgID0gZ2V0X2tlcm5pbmdfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmF0dGFjaF9maWxlICAgICAgPSBhdHRhY2hfZmlsZV87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2FkdmFuY2VzICAgICA9IGdldF9hZHZhbmNlc187ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJlcXVlc3Rfc2l6ZSAgICAgPSByZXF1ZXN0X3NpemVfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2VsZWN0X3NpemUgICAgICA9IHNlbGVjdF9zaXplXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IChGVF9Nb2R1bGVfQ2xhc3MqKWNsYXp6OyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlREUklWRVJfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxYzNkZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnbG9hZHIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUR0xPQURSX0hfCi0jZGVmaW5lIEZUR0xPQURSX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaExvYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ2x5cGggbG9hZGVyIGlzIGFuIGludGVybmFsIG9iamVjdCB1c2VkIHRvIGxvYWQgc2V2ZXJhbCBnbHlwaHMgKi8KLSAgLyogICAgdG9nZXRoZXIgKGZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBjb21wb3NpdGVzKS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU3ViR2x5cGhSZWNfCi0gIHsKLSAgICBGVF9JbnQgICAgIGluZGV4OwotICAgIEZUX1VTaG9ydCAgZmxhZ3M7Ci0gICAgRlRfSW50ICAgICBhcmcxOwotICAgIEZUX0ludCAgICAgYXJnMjsKLSAgICBGVF9NYXRyaXggIHRyYW5zZm9ybTsKLQotICB9IEZUX1N1YkdseXBoUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoTG9hZFJlY18KLSAgewotICAgIEZUX091dGxpbmUgICBvdXRsaW5lOyAgICAgICAvKiBvdXRsaW5lICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVmVjdG9yKiAgIGV4dHJhX3BvaW50czsgIC8qIGV4dHJhIHBvaW50cyB0YWJsZSAgICAgICAgKi8KLSAgICBGVF9WZWN0b3IqICAgZXh0cmFfcG9pbnRzMjsgLyogc2Vjb25kIGV4dHJhIHBvaW50cyB0YWJsZSAqLwotICAgIEZUX1VJbnQgICAgICBudW1fc3ViZ2x5cGhzOyAvKiBudW1iZXIgb2Ygc3ViZ2x5cGhzICAgICAgICovCi0gICAgRlRfU3ViR2x5cGggIHN1YmdseXBoczsgICAgIC8qIHN1YmdseXBocyAgICAgICAgICAgICAgICAgKi8KLQotICB9IEZUX0dseXBoTG9hZFJlYywgKkZUX0dseXBoTG9hZDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaExvYWRlclJlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OwotICAgIEZUX1VJbnQgICAgICAgICAgbWF4X3BvaW50czsKLSAgICBGVF9VSW50ICAgICAgICAgIG1heF9jb250b3VyczsKLSAgICBGVF9VSW50ICAgICAgICAgIG1heF9zdWJnbHlwaHM7Ci0gICAgRlRfQm9vbCAgICAgICAgICB1c2VfZXh0cmE7Ci0KLSAgICBGVF9HbHlwaExvYWRSZWMgIGJhc2U7Ci0gICAgRlRfR2x5cGhMb2FkUmVjICBjdXJyZW50OwotCi0gICAgdm9pZCogICAgICAgICAgICBvdGhlcjsgICAgICAgICAgICAvKiBmb3IgcG9zc2libGUgZnV0dXJlIGV4dGVuc2lvbj8gKi8KLQotICB9IEZUX0dseXBoTG9hZGVyUmVjLCAqRlRfR2x5cGhMb2FkZXI7Ci0KLQotICAvKiBjcmVhdGUgbmV3IGVtcHR5IGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX05ldyggRlRfTWVtb3J5ICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhMb2FkZXIgICphbG9hZGVyICk7Ci0KLSAgLyogYWRkIGFuIGV4dHJhIHBvaW50cyB0YWJsZSB0byBhIGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogZGVzdHJveSBhIGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfRG9uZSggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOwotCi0gIC8qIHJlc2V0IGEgZ2x5cGggbG9hZGVyIChmcmVlcyBldmVyeXRoaW5nIGludCBpdCkgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1Jlc2V0KCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogcmV3aW5kIGEgZ2x5cGggbG9hZGVyICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKLQotICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byBhZGQgYG5fcG9pbnRzJyBhbmQgYG5fY29udG91cnMnICovCi0gIC8qIHRvIHRoZSBnbHlwaCBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX2NvbnRvdXJzICk7Ci0KLQotI2RlZmluZSBGVF9HTFlQSExPQURFUl9DSEVDS19QKCBfbG9hZGVyLCBfY291bnQgKSAgICAgICBcCi0gICggKF9jb3VudCkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAoIChGVF9VSW50KShfbG9hZGVyKS0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzICAgICsgICAgXAotICAgICAgKEZUX1VJbnQpKF9sb2FkZXIpLT5jdXJyZW50Lm91dGxpbmUubl9wb2ludHMgKyAgICBcCi0gICAgICAoRlRfVUludCkoX2NvdW50KSApIDw9IChfbG9hZGVyKS0+bWF4X3BvaW50cyAgICkKLQotI2RlZmluZSBGVF9HTFlQSExPQURFUl9DSEVDS19DKCBfbG9hZGVyLCBfY291bnQgKSAgICAgICAgIFwKLSAgKCAoX2NvdW50KSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCi0gICAgKCAoRlRfVUludCkoX2xvYWRlciktPmJhc2Uub3V0bGluZS5uX2NvbnRvdXJzICAgICsgICAgXAotICAgICAgKEZUX1VJbnQpKF9sb2FkZXIpLT5jdXJyZW50Lm91dGxpbmUubl9jb250b3VycyArICAgIFwKLSAgICAgIChGVF9VSW50KShfY291bnQpICkgPD0gKF9sb2FkZXIpLT5tYXhfY29udG91cnMgICApCi0KLSNkZWZpbmUgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBfbG9hZGVyLCBfcG9pbnRzLCBfY29udG91cnMgKSBcCi0gICggKCBGVF9HTFlQSExPQURFUl9DSEVDS19QKCBfbG9hZGVyLCBfcG9pbnRzICkgICAmJiAgICAgICAgICAgICAgXAotICAgICAgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfQyggX2xvYWRlciwgX2NvbnRvdXJzICkgKSAgICAgICAgICAgICAgIFwKLSAgICA/IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgOiBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggKF9sb2FkZXIpLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KShfcG9pbnRzKSwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCkoX2NvbnRvdXJzKSApICkKLQotCi0gIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIGFkZCBgbl9zdWJzJyBzdWItZ2x5cGhzIHRvICovCi0gIC8qIGEgZ2x5cGggbG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ2hlY2tTdWJHbHlwaHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9zdWJzICk7Ci0KLSAgLyogcHJlcGFyZSBhIGdseXBoIGxvYWRlciwgaS5lLiBlbXB0eSB0aGUgY3VycmVudCBnbHlwaCAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfUHJlcGFyZSggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOwotCi0gIC8qIGFkZCB0aGUgY3VycmVudCBnbHlwaCB0byB0aGUgYmFzZSBnbHlwaCAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfQWRkKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogY29weSBwb2ludHMgZnJvbSBvbmUgZ2x5cGggbG9hZGVyIHRvIGFub3RoZXIgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9Db3B5UG9pbnRzKCBGVF9HbHlwaExvYWRlciAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgc291cmNlICk7Ci0KLSAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUR0xPQURSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0aGFzaC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyZjlkNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0aGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aGFzaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIYXNoaW5nIGZ1bmN0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMCBDb21wdXRpbmcgUmVzZWFyY2ggTGFicywgTmV3IE1leGljbyBTdGF0ZSBVbml2ZXJzaXR5Ci0gKiBDb3B5cmlnaHQgMjAwMS0yMDE1Ci0gKiAgIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIENPTVBVVElORyBSRVNFQVJDSCBMQUIgT1IgTkVXIE1FWElDTyBTVEFURSBVTklWRVJTSVRZIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUCi0gKiBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IKLSAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGNvZGUgZnJvbSBiZGYuYyx2IDEuMjIgMjAwMC8wMy8xNiAyMDowODo1MCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICB0YWtlbiBmcm9tIE1hcmsgTGVpc2hlcidzIHhtYmRmZWQgcGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVEhBU0hfSF8KLSNkZWZpbmUgRlRIQVNIX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICB0eXBlZGVmIHVuaW9uICBGVF9IYXNoa2V5XwotICB7Ci0gICAgRlRfSW50ICAgICAgIG51bTsKLSAgICBjb25zdCBjaGFyKiAgc3RyOwotCi0gIH0gRlRfSGFzaGtleTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9IYXNobm9kZVJlY18KLSAgewotICAgIEZUX0hhc2hrZXkgIGtleTsKLSAgICBzaXplX3QgICAgICBkYXRhOwotCi0gIH0gRlRfSGFzaG5vZGVSZWM7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfSGFzaG5vZGVSZWNfICAqRlRfSGFzaG5vZGU7Ci0KLQotICB0eXBlZGVmIEZUX1VMb25nCi0gICgqRlRfSGFzaF9Mb29rdXBGdW5jKSggRlRfSGFzaGtleSogIGtleSApOwotCi0gIHR5cGVkZWYgRlRfQm9vbAotICAoKkZUX0hhc2hfQ29tcGFyZUZ1bmMpKCBGVF9IYXNoa2V5KiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSGFzaGtleSogIGIgKTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9IYXNoUmVjXwotICB7Ci0gICAgRlRfVUludCAgbGltaXQ7Ci0gICAgRlRfVUludCAgc2l6ZTsKLSAgICBGVF9VSW50ICB1c2VkOwotCi0gICAgRlRfSGFzaF9Mb29rdXBGdW5jICAgbG9va3VwOwotICAgIEZUX0hhc2hfQ29tcGFyZUZ1bmMgIGNvbXBhcmU7Ci0KLSAgICBGVF9IYXNobm9kZSogIHRhYmxlOwotCi0gIH0gRlRfSGFzaFJlYzsKLQotICB0eXBlZGVmIHN0cnVjdCBGVF9IYXNoUmVjXyAgKkZUX0hhc2g7Ci0KLQotICBGVF9FcnJvcgotICBmdF9oYXNoX3N0cl9pbml0KCBGVF9IYXNoICAgIGhhc2gsCi0gICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgZnRfaGFzaF9udW1faW5pdCggRlRfSGFzaCAgICBoYXNoLAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0gIHZvaWQKLSAgZnRfaGFzaF9zdHJfZnJlZSggRlRfSGFzaCAgICBoYXNoLAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0jZGVmaW5lIGZ0X2hhc2hfbnVtX2ZyZWUgIGZ0X2hhc2hfc3RyX2ZyZWUKLQotICBGVF9FcnJvcgotICBmdF9oYXNoX3N0cl9pbnNlcnQoIGNvbnN0IGNoYXIqICBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSGFzaCAgICAgIGhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgIG1lbW9yeSApOwotCi0gIEZUX0Vycm9yCi0gIGZ0X2hhc2hfbnVtX2luc2VydCggRlRfSW50ICAgICBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0hhc2ggICAgaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0gIHNpemVfdCoKLSAgZnRfaGFzaF9zdHJfbG9va3VwKCBjb25zdCBjaGFyKiAga2V5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0hhc2ggICAgICBoYXNoICk7Ci0KLSAgc2l6ZV90KgotICBmdF9oYXNoX251bV9sb29rdXAoIEZUX0ludCAgIG51bSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9IYXNoICBoYXNoICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBGVEhBU0hfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllNWI1OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtZW1vcnkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBtZW1vcnkgbWFuYWdlbWVudCBtYWNyb3MgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUTUVNT1JZX0hfCi0jZGVmaW5lIEZUTUVNT1JZX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NFVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBzZXQgYW4gaW1wbGljaXQgYGVycm9yJyB2YXJpYWJsZSB0byBhIGdpdmVuICAqLwotICAvKiAgICBleHByZXNzaW9uJ3MgdmFsdWUgKHVzdWFsbHkgYSBmdW5jdGlvbiBjYWxsKSwgYW5kIGNvbnZlcnQgaXQgdG8gYSAgKi8KLSAgLyogICAgYm9vbGVhbiB3aGljaCBpcyBzZXQgd2hlbmV2ZXIgdGhlIHZhbHVlIGlzICE9IDAuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9TRVRfRVJST1IKLSNkZWZpbmUgRlRfU0VUX0VSUk9SKCBleHByZXNzaW9uICkgXAotICAgICAgICAgICggKCBlcnJvciA9IChleHByZXNzaW9uKSApICE9IDAgKQotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiAgQysrIHJlZnVzZXMgdG8gaGFuZGxlIHN0YXRlbWVudHMgbGlrZSBwID0gKHZvaWQqKWFueXRoaW5nLCB3aXRoIGBwJyBhCi0gICAqICB0eXBlZCBwb2ludGVyLiAgU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGB0eXBlb2YnIG9wZXJhdG9yIGluIHN0YW5kYXJkCi0gICAqICBDKyssIHdlIGhhdmUgdG8gdXNlIGEgdGVtcGxhdGUgdG8gZW11bGF0ZSBpdC4KLSAgICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1leHRlcm4gIkMrKyIKLXsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBUKgotICBjcGx1c3BsdXNfdHlwZW9mKCAgICAgICAgVCosCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICp2ICkKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdCA8VCo+ICggdiApOwotICB9Ci19Ci0KLSNkZWZpbmUgRlRfQVNTSUdOUCggcCwgdmFsICkgIChwKSA9IGNwbHVzcGx1c190eXBlb2YoIChwKSwgKHZhbCkgKQotCi0jZWxzZQotCi0jZGVmaW5lIEZUX0FTU0lHTlAoIHAsIHZhbCApICAocCkgPSAodmFsKQotCi0jZW5kaWYKLQotCi0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLQotICBGVF9CQVNFKCBjb25zdCBjaGFyKiApICBfZnRfZGVidWdfZmlsZTsKLSAgRlRfQkFTRSggbG9uZyApICAgICAgICAgX2Z0X2RlYnVnX2xpbmVubzsKLQotI2RlZmluZSBGVF9ERUJVR19JTk5FUiggZXhwICkgICggX2Z0X2RlYnVnX2ZpbGUgICA9IF9fRklMRV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnRfZGVidWdfbGluZW5vID0gX19MSU5FX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHApICkKLQotI2RlZmluZSBGVF9BU1NJR05QX0lOTkVSKCBwLCBleHAgKSAgKCBfZnRfZGVidWdfZmlsZSAgID0gX19GSUxFX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Z0X2RlYnVnX2xpbmVubyA9IF9fTElORV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FTU0lHTlAoIHAsIGV4cCApICkKLQotI2Vsc2UgLyogIUZUX0RFQlVHX01FTU9SWSAqLwotCi0jZGVmaW5lIEZUX0RFQlVHX0lOTkVSKCBleHAgKSAgICAgICAoZXhwKQotI2RlZmluZSBGVF9BU1NJR05QX0lOTkVSKCBwLCBleHAgKSAgRlRfQVNTSUdOUCggcCwgZXhwICkKLQotI2VuZGlmIC8qICFGVF9ERUJVR19NRU1PUlkgKi8KLQotCi0gIC8qCi0gICAqICBUaGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgcmV0dXJuIGEgcG9pbnRlciwgYW5kIHRoZSBlcnJvciBjb2RlCi0gICAqICBpcyB3cml0dGVuIHRvIHRocm91Z2ggdGhlIGBwX2Vycm9yJyBwYXJhbWV0ZXIuCi0gICAqLwotCi0gIC8qIFRoZSBgcScgdmFyaWFudHMgb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdyAoYHEnIGZvciBgcXVpY2snKSBkb24ndCBmaWxsICovCi0gIC8qIHRoZSBhbGxvY2F0ZWQgb3IgcmVhbGxvY2F0ZWQgbWVtb3J5IHdpdGggemVybyBieXRlcy4gICAgICAgICAgICAgICAgICovCi0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKTsKLQotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX3JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBpdGVtX3NpemUsCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGN1cl9jb3VudCwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jaywKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcXJlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgaXRlbV9zaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICk7Ci0KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X21lbV9mcmVlKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIFAgKTsKLQotCi0gIC8qIFRoZSBgUScgdmFyaWFudHMgb2YgdGhlIG1hY3JvcyBiZWxvdyAoYFEnIGZvciBgcXVpY2snKSBkb24ndCBmaWxsICovCi0gIC8qIHRoZSBhbGxvY2F0ZWQgb3IgcmVhbGxvY2F0ZWQgbWVtb3J5IHdpdGggemVybyBieXRlcy4gICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgRlRfTUVNX0FMTE9DKCBwdHIsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fYWxsb2MoIG1lbW9yeSwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9GUkVFKCBwdHIgKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBmdF9tZW1fZnJlZSggbWVtb3J5LCAocHRyKSApOyBcCi0gICAgICAgICAgICAocHRyKSA9IE5VTEw7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfRU5EX1NUTU5UCi0KLSNkZWZpbmUgRlRfTUVNX05FVyggcHRyICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX0FMTE9DKCBwdHIsIHNpemVvZiAoICoocHRyKSApICkKLQotI2RlZmluZSBGVF9NRU1fUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjdXJzeiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3c3opLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUUFMTE9DKCBwdHIsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcWFsbG9jKCBtZW1vcnksICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShzaXplKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RTkVXKCBwdHIgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fUUFMTE9DKCBwdHIsIHNpemVvZiAoICoocHRyKSApICkKLQotI2RlZmluZSBGVF9NRU1fUVJFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY3Vyc3opLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShuZXdzeiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX0FMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3JlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGl0ZW1fc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjb3VudCksICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1JFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsIG5ld2NudCwgaXRtc3ogKSAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3JlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGl0bXN6KSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykob2xkY250KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShuZXdjbnQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1FBTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9xcmVhbGxvYyggbWVtb3J5LCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGl0ZW1fc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGNvdW50KSwgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgbmV3Y250LCBpdG1zeikgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShpdG1zeiksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShvbGRjbnQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShuZXdjbnQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotCi0jZGVmaW5lIEZUX01FTV9TRVRfRVJST1IoIGNvbmQgKSAgKCAoY29uZCksIGVycm9yICE9IDAgKQotCi0KLSNkZWZpbmUgRlRfTUVNX1NFVCggZGVzdCwgYnl0ZSwgY291bnQgKSAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmdF9tZW1zZXQoIGRlc3QsIGJ5dGUsIChGVF9PZmZzZXQpKGNvdW50KSApCi0KLSNkZWZpbmUgRlRfTUVNX0NPUFkoIGRlc3QsIHNvdXJjZSwgY291bnQgKSAgICAgICAgICAgICAgXAotICAgICAgICAgIGZ0X21lbWNweSggZGVzdCwgc291cmNlLCAoRlRfT2Zmc2V0KShjb3VudCkgKQotCi0jZGVmaW5lIEZUX01FTV9NT1ZFKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnRfbWVtbW92ZSggZGVzdCwgc291cmNlLCAoRlRfT2Zmc2V0KShjb3VudCkgKQotCi0KLSNkZWZpbmUgRlRfTUVNX1pFUk8oIGRlc3QsIGNvdW50ICkgIEZUX01FTV9TRVQoIGRlc3QsIDAsIGNvdW50ICkKLQotI2RlZmluZSBGVF9aRVJPKCBwICkgICAgICAgICAgICAgICAgRlRfTUVNX1pFUk8oIHAsIHNpemVvZiAoICoocCkgKSApCi0KLQotI2RlZmluZSBGVF9BUlJBWV9aRVJPKCBkZXN0LCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1pFUk8oIGRlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgKEZUX09mZnNldCkoY291bnQpICogc2l6ZW9mICggKihkZXN0KSApICkKLQotI2RlZmluZSBGVF9BUlJBWV9DT1BZKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX0NPUFkoIGRlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjb3VudCkgKiBzaXplb2YgKCAqKGRlc3QpICkgKQotCi0jZGVmaW5lIEZUX0FSUkFZX01PVkUoIGRlc3QsIHNvdXJjZSwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fTU9WRSggZGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIChGVF9PZmZzZXQpKGNvdW50KSAqIHNpemVvZiAoICooZGVzdCkgKSApCi0KLQotICAvKgotICAgKiAgUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRyZXNzYWJsZSBlbGVtZW50cyBpbiBhbiBhcnJheS4KLSAgICogIFdlIGxpbWl0IG91cnNlbHZlcyB0byBJTlRfTUFYLCByYXRoZXIgdGhhbiBVSU5UX01BWCwgdG8gYXZvaWQKLSAgICogIGFueSBwcm9ibGVtcy4KLSAgICovCi0jZGVmaW5lIEZUX0FSUkFZX01BWCggcHRyICkgICAgICAgICAgICggRlRfSU5UX01BWCAvIHNpemVvZiAoICoocHRyKSApICkKLQotI2RlZmluZSBGVF9BUlJBWV9DSEVDSyggcHRyLCBjb3VudCApICAoIChjb3VudCkgPD0gRlRfQVJSQVlfTUFYKCBwdHIgKSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1hY3JvcyBleHBlY3QgdGhhdCB0aGVpciBwb2ludGVyIGFyZ3VtZW50IGlzICAqLwotICAvKiBfdHlwZWRfIGluIG9yZGVyIHRvIGF1dG9tYXRpY2FsbHkgY29tcHV0ZSBhcnJheSBlbGVtZW50IHNpemVzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgRlRfTUVNX05FV19BUlJBWSggcHRyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3JlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggKihwdHIpICksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjb3VudCksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1JFTkVXX0FSUkFZKCBwdHIsIGN1cnN6LCBuZXdzeiApICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3JlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggKihwdHIpICksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY3Vyc3opLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShuZXdzeiksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1FORVdfQVJSQVkoIHB0ciwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9xcmVhbGxvYyggbWVtb3J5LCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggKihwdHIpICksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGNvdW50KSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RUkVORVdfQVJSQVkoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoICoocHRyKSApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjdXJzeiksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShuZXdzeiksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9BTExPQyggcHRyLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX0FMTE9DKCBwdHIsIHNpemUgKSApCi0KLSNkZWZpbmUgRlRfUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSApCi0KLSNkZWZpbmUgRlRfQUxMT0NfTVVMVCggcHRyLCBjb3VudCwgaXRlbV9zaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX0FMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICkKLQotI2RlZmluZSBGVF9SRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCBuZXdjbnQsIGl0bXN6ICkgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Y250LCBpdG1zeiApICkKLQotI2RlZmluZSBGVF9RQUxMT0MoIHB0ciwgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9RQUxMT0MoIHB0ciwgc2l6ZSApICkKLQotI2RlZmluZSBGVF9RUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUVJFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgKQotCi0jZGVmaW5lIEZUX1FBTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUUFMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICkKLQotI2RlZmluZSBGVF9RUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgbmV3Y250LCBpdG1zeiApICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FSRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Y250LCBpdG1zeiApICkKLQotI2RlZmluZSBGVF9GUkVFKCBwdHIgKSAgRlRfTUVNX0ZSRUUoIHB0ciApCi0KLSNkZWZpbmUgRlRfTkVXKCBwdHIgKSAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX05FVyggcHRyICkgKQotCi0jZGVmaW5lIEZUX05FV19BUlJBWSggcHRyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9ORVdfQVJSQVkoIHB0ciwgY291bnQgKSApCi0KLSNkZWZpbmUgRlRfUkVORVdfQVJSQVkoIHB0ciwgY3VyY250LCBuZXdjbnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUkVORVdfQVJSQVkoIHB0ciwgY3VyY250LCBuZXdjbnQgKSApCi0KLSNkZWZpbmUgRlRfUU5FVyggcHRyICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FORVcoIHB0ciApICkKLQotI2RlZmluZSBGVF9RTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgKQotCi0jZGVmaW5lIEZUX1FSRU5FV19BUlJBWSggcHRyLCBjdXJjbnQsIG5ld2NudCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1JFTkVXX0FSUkFZKCBwdHIsIGN1cmNudCwgbmV3Y250ICkgKQotCi0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9zdHJkdXAoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzdHIsCi0gICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgICpwX2Vycm9yICk7Ci0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9kdXAoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBhZGRyZXNzLAotICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgRlRfRXJyb3IgICAgKnBfZXJyb3IgKTsKLQotCi0jZGVmaW5lIEZUX01FTV9TVFJEVVAoIGRzdCwgc3RyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoZHN0KSA9IChjaGFyKilmdF9tZW1fc3RyZHVwKCBtZW1vcnksIChjb25zdCBjaGFyKikoc3RyKSwgJmVycm9yICkKLQotI2RlZmluZSBGVF9TVFJEVVAoIGRzdCwgc3RyICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1NUUkRVUCggZHN0LCBzdHIgKSApCi0KLSNkZWZpbmUgRlRfTUVNX0RVUCggZHN0LCBhZGRyZXNzLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKGRzdCkgPSBmdF9tZW1fZHVwKCBtZW1vcnksIChhZGRyZXNzKSwgKEZUX1VMb25nKShzaXplKSwgJmVycm9yICkKLQotI2RlZmluZSBGVF9EVVAoIGRzdCwgYWRkcmVzcywgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9EVVAoIGRzdCwgYWRkcmVzcywgc2l6ZSApICkKLQotCi0gIC8qIFJldHVybiA+PSAxIGlmIGEgdHJ1bmNhdGlvbiBvY2N1cnMuICAgICAgICAgICAgKi8KLSAgLyogUmV0dXJuIDAgaWYgdGhlIHNvdXJjZSBzdHJpbmcgZml0cyB0aGUgYnVmZmVyLiAqLwotICAvKiBUaGlzIGlzICpub3QqIHRoZSBzYW1lIGFzIHN0cmxjcHkoKS4gICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0ludCApCi0gIGZ0X21lbV9zdHJjcHluKCBjaGFyKiAgICAgICAgZHN0LAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNyYywKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplICk7Ci0KLSNkZWZpbmUgRlRfU1RSQ1BZTiggZHN0LCBzcmMsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZ0X21lbV9zdHJjcHluKCAoY2hhciopZHN0LCAoY29uc3QgY2hhciopKHNyYyksIChGVF9VTG9uZykoc2l6ZSkgKQotCi0gLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVE1FTU9SWV9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMzFiZTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvYmpzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGJhc2UgY2xhc3NlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhbGwgaW50ZXJuYWwgRnJlZVR5cGUgY2xhc3Nlcy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUT0JKU19IXwotI2RlZmluZSBGVE9CSlNfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9SRU5ERVJfSAotI2luY2x1ZGUgRlRfU0laRVNfSAotI2luY2x1ZGUgRlRfTENEX0ZJTFRFUl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfR0xZUEhfTE9BREVSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9BVVRPSElOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSNpbmNsdWRlIEZUX0lOQ1JFTUVOVEFMX0gKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIGdlbmVyaWMgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgIDAKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgKHZvaWQqKTAKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWluIGFuZCBtYXggZnVuY3Rpb25zIG1pc3NpbmcgaW4gQy4gIEFzIHVzdWFsLCBiZSBjYXJlZnVsIG5vdCB0byAgKi8KLSAgLyogd3JpdGUgdGhpbmdzIGxpa2UgRlRfTUlOKCBhKyssIGIrKyApIHRvIGF2b2lkIHNpZGUgZWZmZWN0cy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NSU4oIGEsIGIgKSAgKCAoYSkgPCAoYikgPyAoYSkgOiAoYikgKQotI2RlZmluZSBGVF9NQVgoIGEsIGIgKSAgKCAoYSkgPiAoYikgPyAoYSkgOiAoYikgKQotCi0jZGVmaW5lIEZUX0FCUyggYSApICAgICAoIChhKSA8IDAgPyAtKGEpIDogKGEpICkKLQotICAvKgotICAgKiAgQXBwcm94aW1hdGUgc3FydCh4KngreSp5KSB1c2luZyB0aGUgYGFscGhhIG1heCBwbHVzIGJldGEgbWluJwotICAgKiAgYWxnb3JpdGhtLiAgV2UgdXNlIGFscGhhID0gMSwgYmV0YSA9IDMvOCwgZ2l2aW5nIHVzIHJlc3VsdHMgd2l0aCBhCi0gICAqICBsYXJnZXN0IGVycm9yIGxlc3MgdGhhbiA3JSBjb21wYXJlZCB0byB0aGUgZXhhY3QgdmFsdWUuCi0gICAqLwotI2RlZmluZSBGVF9IWVBPVCggeCwgeSApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCB4ID0gRlRfQUJTKCB4ICksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHkgPSBGVF9BQlMoIHkgKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgeCA+IHkgPyB4ICsgKCAzICogeSA+PiAzICkgICBcCi0gICAgICAgICAgICAgICAgICA6IHkgKyAoIDMgKiB4ID4+IDMgKSApCi0KLSAgLyogd2UgdXNlIEZUX1RZUEVPRiB0byBzdXBwcmVzcyBzaWduZWRuZXNzIGNvbXBpbGF0aW9uIHdhcm5pbmdzICovCi0jZGVmaW5lIEZUX1BBRF9GTE9PUiggeCwgbiApICAoICh4KSAmIH5GVF9UWVBFT0YoIHggKSggKG4pLTEgKSApCi0jZGVmaW5lIEZUX1BBRF9ST1VORCggeCwgbiApICBGVF9QQURfRkxPT1IoICh4KSArIChuKS8yLCBuICkKLSNkZWZpbmUgRlRfUEFEX0NFSUwoIHgsIG4gKSAgIEZUX1BBRF9GTE9PUiggKHgpICsgKG4pLTEsIG4gKQotCi0jZGVmaW5lIEZUX1BJWF9GTE9PUiggeCApICAgICAoICh4KSAmIH5GVF9UWVBFT0YoIHggKTYzICkKLSNkZWZpbmUgRlRfUElYX1JPVU5EKCB4ICkgICAgIEZUX1BJWF9GTE9PUiggKHgpICsgMzIgKQotI2RlZmluZSBGVF9QSVhfQ0VJTCggeCApICAgICAgRlRfUElYX0ZMT09SKCAoeCkgKyA2MyApCi0KLSAgLyogc3BlY2lhbGl6ZWQgdmVyc2lvbnMgKGZvciBzaWduZWQgdmFsdWVzKSAgICAgICAgICAgICAgICAgICAqLwotICAvKiB0aGF0IGRvbid0IHByb2R1Y2UgcnVuLXRpbWUgZXJyb3JzIGR1ZSB0byBpbnRlZ2VyIG92ZXJmbG93ICovCi0jZGVmaW5lIEZUX1BBRF9ST1VORF9MT05HKCB4LCBuICkgIEZUX1BBRF9GTE9PUiggQUREX0xPTkcoICh4KSwgKG4pIC8gMiApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiApCi0jZGVmaW5lIEZUX1BBRF9DRUlMX0xPTkcoIHgsIG4gKSAgIEZUX1BBRF9GTE9PUiggQUREX0xPTkcoICh4KSwgKG4pIC0gMSApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiApCi0jZGVmaW5lIEZUX1BJWF9ST1VORF9MT05HKCB4ICkgICAgIEZUX1BJWF9GTE9PUiggQUREX0xPTkcoICh4KSwgMzIgKSApCi0jZGVmaW5lIEZUX1BJWF9DRUlMX0xPTkcoIHggKSAgICAgIEZUX1BJWF9GTE9PUiggQUREX0xPTkcoICh4KSwgNjMgKSApCi0KLSNkZWZpbmUgRlRfUEFEX1JPVU5EX0lOVDMyKCB4LCBuICkgIEZUX1BBRF9GTE9PUiggQUREX0lOVDMyKCAoeCksIChuKSAvIDIgKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICkKLSNkZWZpbmUgRlRfUEFEX0NFSUxfSU5UMzIoIHgsIG4gKSAgIEZUX1BBRF9GTE9PUiggQUREX0lOVDMyKCAoeCksIChuKSAtIDEgKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICkKLSNkZWZpbmUgRlRfUElYX1JPVU5EX0lOVDMyKCB4ICkgICAgIEZUX1BJWF9GTE9PUiggQUREX0lOVDMyKCAoeCksIDMyICkgKQotI2RlZmluZSBGVF9QSVhfQ0VJTF9JTlQzMiggeCApICAgICAgRlRfUElYX0ZMT09SKCBBRERfSU5UMzIoICh4KSwgNjMgKSApCi0KLQotICAvKgotICAgKiAgY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIGZ1bmN0aW9ucyAtLSBzaW5jZSB0aGVzZSBhcmUgdXNlZCB0byBwYXJzZQotICAgKiAgZm9udCBmaWxlcywgd2UgbXVzdCBub3QgdXNlIHRob3NlIGluIDxjdHlwZXMuaD4gd2hpY2ggYXJlCi0gICAqICBsb2NhbGUtZGVwZW5kZW50Ci0gICAqLwotI2RlZmluZSAgZnRfaXNkaWdpdCggeCApICAgKCAoICh1bnNpZ25lZCkoeCkgLSAnMCcgKSA8IDEwVSApCi0KLSNkZWZpbmUgIGZ0X2lzeGRpZ2l0KCB4ICkgICggKCAodW5zaWduZWQpKHgpIC0gJzAnICkgPCAxMFUgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCkoeCkgLSAnYScgKSA8IDZVICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkKSh4KSAtICdBJyApIDwgNlUgICkKLQotICAvKiB0aGUgbmV4dCB0d28gbWFjcm9zIGFzc3VtZSBBU0NJSSByZXByZXNlbnRhdGlvbiAqLwotI2RlZmluZSAgZnRfaXN1cHBlciggeCApICAoICggKHVuc2lnbmVkKSh4KSAtICdBJyApIDwgMjZVICkKLSNkZWZpbmUgIGZ0X2lzbG93ZXIoIHggKSAgKCAoICh1bnNpZ25lZCkoeCkgLSAnYScgKSA8IDI2VSApCi0KLSNkZWZpbmUgIGZ0X2lzYWxwaGEoIHggKSAgKCBmdF9pc3VwcGVyKCB4ICkgfHwgZnRfaXNsb3dlciggeCApICkKLSNkZWZpbmUgIGZ0X2lzYWxudW0oIHggKSAgKCBmdF9pc2RpZ2l0KCB4ICkgfHwgZnRfaXNhbHBoYSggeCApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEMgSCBBIFIgTSBBIFAgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBoYW5kbGUgdG8gaW50ZXJuYWwgY2hhcm1hcCBvYmplY3QgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfQ01hcFJlY18qICAgICAgICAgICAgICBGVF9DTWFwOwotCi0gIC8qIGhhbmRsZSB0byBjaGFybWFwIGNsYXNzIHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBGVF9DTWFwX0NsYXNzUmVjXyogIEZUX0NNYXBfQ2xhc3M7Ci0KLSAgLyogaW50ZXJuYWwgY2hhcm1hcCBvYmplY3Qgc3RydWN0dXJlICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9DTWFwUmVjXwotICB7Ci0gICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsKLSAgICBGVF9DTWFwX0NsYXNzICBjbGF6ejsKLQotICB9IEZUX0NNYXBSZWM7Ci0KLSAgLyogdHlwZWNhc2UgYW55IHBvaW50ZXIgdG8gYSBjaGFybWFwIGhhbmRsZSAqLwotI2RlZmluZSBGVF9DTUFQKCB4ICkgICAgICAgICAgICAgICgoRlRfQ01hcCkoIHggKSkKLQotICAvKiBvYnZpb3VzIG1hY3JvcyAqLwotI2RlZmluZSBGVF9DTUFQX1BMQVRGT1JNX0lEKCB4ICkgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5wbGF0Zm9ybV9pZAotI2RlZmluZSBGVF9DTUFQX0VOQ09ESU5HX0lEKCB4ICkgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5lbmNvZGluZ19pZAotI2RlZmluZSBGVF9DTUFQX0VOQ09ESU5HKCB4ICkgICAgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5lbmNvZGluZwotI2RlZmluZSBGVF9DTUFQX0ZBQ0UoIHggKSAgICAgICAgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5mYWNlCi0KLQotICAvKiBjbGFzcyBtZXRob2QgZGVmaW5pdGlvbnMgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0NNYXBfSW5pdEZ1bmMpKCBGVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBpbml0X2RhdGEgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9DTWFwX0RvbmVGdW5jKSggRlRfQ01hcCAgY21hcCApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0NNYXBfQ2hhckluZGV4RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0NNYXBfQ2hhck5leHRGdW5jKSggRlRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKmFjaGFyX2NvZGUgKTsKLQotICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpKCBGVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ01hcCAgICB1bmljb2RlX2NtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICB2YXJpYW50X3NlbGVjdG9yICk7Ci0KLSAgdHlwZWRlZiBGVF9Cb29sCi0gICgqRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudF9zZWxlY3RvciApOwotCi0gIHR5cGVkZWYgRlRfVUludDMyICoKLSAgKCpGVF9DTWFwX1ZhcmlhbnRMaXN0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50MzIgKgotICAoKkZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApOwotCi0gIHR5cGVkZWYgRlRfVUludDMyICoKLSAgKCpGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpKCBGVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICB2YXJpYW50X3NlbGVjdG9yICk7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfQ01hcF9DbGFzc1JlY18KLSAgewotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgc2l6ZTsKLQotICAgIEZUX0NNYXBfSW5pdEZ1bmMgICAgICAgaW5pdDsKLSAgICBGVF9DTWFwX0RvbmVGdW5jICAgICAgIGRvbmU7Ci0gICAgRlRfQ01hcF9DaGFySW5kZXhGdW5jICBjaGFyX2luZGV4OwotICAgIEZUX0NNYXBfQ2hhck5leHRGdW5jICAgY2hhcl9uZXh0OwotCi0gICAgLyogU3Vic2VxdWVudCBlbnRyaWVzIGFyZSBzcGVjaWFsIG9uZXMgZm9yIGZvcm1hdCAxNCAtLSB0aGUgdmFyaWFudCAqLwotICAgIC8qIHNlbGVjdG9yIHN1YnRhYmxlIHdoaWNoIGJlaGF2ZXMgbGlrZSBubyBvdGhlciAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIEZUX0NNYXBfQ2hhclZhckluZGV4RnVuYyAgICAgIGNoYXJfdmFyX2luZGV4OwotICAgIEZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMgIGNoYXJfdmFyX2RlZmF1bHQ7Ci0gICAgRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMgICAgICAgdmFyaWFudF9saXN0OwotICAgIEZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYyAgIGNoYXJ2YXJpYW50X2xpc3Q7Ci0gICAgRlRfQ01hcF9WYXJpYW50Q2hhckxpc3RGdW5jICAgdmFyaWFudGNoYXJfbGlzdDsKLQotICB9IEZUX0NNYXBfQ2xhc3NSZWM7Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyggY2xhc3NfICkgICAgICAgICAgICAgIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgIEZUX0NNYXBfQ2xhc3NSZWMgY2xhc3NfOwotCi0jZGVmaW5lIEZUX0RFRklORV9DTUFQX0NMQVNTKCAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2hhcl9pbmRleF8sICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2hhcl9uZXh0XywgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2hhcl92YXJfaW5kZXhfLCAgICAgICAgICBcCi0gICAgICAgICAgY2hhcl92YXJfZGVmYXVsdF8sICAgICAgICBcCi0gICAgICAgICAgdmFyaWFudF9saXN0XywgICAgICAgICAgICBcCi0gICAgICAgICAgY2hhcnZhcmlhbnRfbGlzdF8sICAgICAgICBcCi0gICAgICAgICAgdmFyaWFudGNoYXJfbGlzdF8gKSAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICBcCi0gIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMgIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhcl9pbmRleF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhcl9uZXh0XywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhcl92YXJfaW5kZXhfLCAgICAgICAgICAgICAgICBcCi0gICAgY2hhcl92YXJfZGVmYXVsdF8sICAgICAgICAgICAgICBcCi0gICAgdmFyaWFudF9saXN0XywgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhcnZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICBcCi0gICAgdmFyaWFudGNoYXJfbGlzdF8gICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9DTUFQX0NMQVNTKCBjbGFzc18gKSAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DTWFwX0NsYXNzUmVjKiAgY2xhenogKTsKLQotI2RlZmluZSBGVF9ERUZJTkVfQ01BUF9DTEFTUyggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfdmFyX2luZGV4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfdmFyX2RlZmF1bHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZhcmlhbnRjaGFyX2xpc3RfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NNYXBfQ2xhc3NSZWMqICBjbGF6eiApICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zaXplICAgICAgICAgICAgID0gc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0ICAgICAgICAgICAgID0gaW5pdF87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lICAgICAgICAgICAgID0gZG9uZV87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFyX2luZGV4ICAgICAgID0gY2hhcl9pbmRleF87ICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFyX25leHQgICAgICAgID0gY2hhcl9uZXh0XzsgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFyX3Zhcl9pbmRleCAgID0gY2hhcl92YXJfaW5kZXhfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFyX3Zhcl9kZWZhdWx0ID0gY2hhcl92YXJfZGVmYXVsdF87ICAgICAgICAgXAotICAgIGNsYXp6LT52YXJpYW50X2xpc3QgICAgID0gdmFyaWFudF9saXN0XzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFydmFyaWFudF9saXN0ID0gY2hhcnZhcmlhbnRfbGlzdF87ICAgICAgICAgXAotICAgIGNsYXp6LT52YXJpYW50Y2hhcl9saXN0ID0gdmFyaWFudGNoYXJfbGlzdF87ICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyogY3JlYXRlIGEgbmV3IGNoYXJtYXAgYW5kIGFkZCBpdCB0byBjaGFybWFwLT5mYWNlICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfQ01hcF9OZXcoIEZUX0NNYXBfQ2xhc3MgIGNsYXp6LAotICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgRlRfQ2hhck1hcCAgICAgY2hhcm1hcCwKLSAgICAgICAgICAgICAgIEZUX0NNYXAgICAgICAgKmFjbWFwICk7Ci0KLSAgLyogZGVzdHJveSBhIGNoYXJtYXAgYW5kIHJlbW92ZSBpdCBmcm9tIGZhY2UncyBsaXN0ICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9DTWFwX0RvbmUoIEZUX0NNYXAgIGNtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWxSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmaWVsZHMgb2YgZWFjaCBGVF9GYWNlICAgICAgICAqLwotICAvKiAgICBvYmplY3QuICBUaGVzZSBmaWVsZHMgbWF5IGNoYW5nZSBiZXR3ZWVuIGRpZmZlcmVudCByZWxlYXNlcyBvZiAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3BvaW50cyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB1c2VkIHRvIHN0b3JlIHRoZSB2ZWN0b3JpYWwgb3V0bGluZSAqLwotICAvKiAgICAgIG9mIGFueSBnbHlwaCBpbiB0aGlzIGZhY2UuICBJZiB0aGlzIHZhbHVlIGNhbm5vdCBiZSBrbm93biBpbiAgICAgKi8KLSAgLyogICAgICBhZHZhbmNlLCBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIDAuICovCi0gIC8qICAgICAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2NvbnRvdXJzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIHVzZWQgdG8gc3RvcmUgdGhlIHZlY3RvcmlhbCAgICAgICAqLwotICAvKiAgICAgIG91dGxpbmUgb2YgYW55IGdseXBoIGluIHRoaXMgZmFjZS4gIElmIHRoaXMgdmFsdWUgY2Fubm90IGJlICAgICAgKi8KLSAgLyogICAgICBrbm93biBpbiBhZHZhbmNlLCBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgdGhpcyBzaG91bGQgYmUgICovCi0gIC8qICAgICAgc2V0IHRvIDAuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtX21hdHJpeCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSAyeDIgbWF0cml4IG9mIDE2LjE2IGNvZWZmaWNpZW50cyB1c2VkIHRvIHRyYW5zZm9ybSBnbHlwaCAgICAgICAqLwotICAvKiAgICAgIG91dGxpbmVzIGFmdGVyIHRoZXkgYXJlIGxvYWRlZCBmcm9tIHRoZSBmb250LiAgT25seSB1c2VkIGJ5IHRoZSAgKi8KLSAgLyogICAgICBjb252ZW5pZW5jZSBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1fZGVsdGEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIHRyYW5zbGF0aW9uIHZlY3RvciB1c2VkIHRvIHRyYW5zZm9ybSBnbHlwaCBvdXRsaW5lcyBhZnRlciB0aGV5ICovCi0gIC8qICAgICAgYXJlIGxvYWRlZCBmcm9tIHRoZSBmb250LiAgT25seSB1c2VkIGJ5IHRoZSBjb252ZW5pZW5jZSAgICAgICAgICAqLwotICAvKiAgICAgIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybV9mbGFncyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNvbWUgZmxhZ3MgdXNlZCB0byBjbGFzc2lmeSB0aGUgdHJhbnNmb3JtLiAgT25seSB1c2VkIGJ5IHRoZSAgICAgKi8KLSAgLyogICAgICBjb252ZW5pZW5jZSBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZXJ2aWNlcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGNhY2hlIGZvciBmcmVxdWVudGx5IHVzZWQgc2VydmljZXMuICBJdCBzaG91bGQgYmUgb25seSAgICAgICAgICovCi0gIC8qICAgICAgYWNjZXNzZWQgd2l0aCB0aGUgbWFjcm8gYEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UnLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5jcmVtZW50YWxfaW50ZXJmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgbm9uLW51bGwsIHRoZSBpbnRlcmZhY2UgdGhyb3VnaCB3aGljaCBnbHlwaCBkYXRhIGFuZCBtZXRyaWNzICAqLwotICAvKiAgICAgIGFyZSBsb2FkZWQgaW5jcmVtZW50YWxseSBmb3IgZmFjZXMgdGhhdCBkbyBub3QgcHJvdmlkZSBhbGwgb2YgICAgKi8KLSAgLyogICAgICB0aGlzIGRhdGEgd2hlbiBmaXJzdCBvcGVuZWQuICBUaGlzIGZpZWxkIGV4aXN0cyBvbmx5IGlmICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgaXMgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9fc3RlbV9kYXJrZW5pbmcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgT3ZlcnJpZGVzIHRoZSBtb2R1bGUtbGV2ZWwgZGVmYXVsdCwgc2VlIEBzdGVtLWRhcmtlbmluZ1tjZmZdLCAgICAqLwotICAvKiAgICAgIGZvciBleGFtcGxlLiAgRkFMU0UgYW5kIFRSVUUgdG9nZ2xlIHN0ZW0gZGFya2VuaW5nIG9uIGFuZCBvZmYsICAgKi8KLSAgLyogICAgICByZXNwZWN0aXZlbHksIHZhbHVlfi0xIG1lYW5zIHRvIHVzZSB0aGUgbW9kdWxlL2RyaXZlciBkZWZhdWx0LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYW5kb21fc2VlZCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJZiBwb3NpdGl2ZSwgb3ZlcnJpZGUgdGhlIHNlZWQgdmFsdWUgZm9yIHRoZSBDRkYgYHJhbmRvbScgICAgICAgICovCi0gIC8qICAgICAgb3BlcmF0b3IuICBWYWx1ZX4wIG1lYW5zIHRvIHVzZSB0aGUgZm9udCdzIHZhbHVlLiAgVmFsdWV+LTEgICAgICAqLwotICAvKiAgICAgIG1lYW5zIHRvIHVzZSB0aGUgQ0ZGIGRyaXZlcidzIGRlZmF1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxjZF93ZWlnaHRzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIE92ZXJyaWRlcyB0aGUgbGlicmFyeSBkZWZhdWx0IHdpdGggY3VzdG9tIHdlaWdodHMgZm9yIHRoZSA1LXRhcCAgKi8KLSAgLyogICAgICBGSVIgZmlsdGVyLiAgYHswLCAwLCAwLCAwLCAwfScgbWVhbnMgdG8gdXNlIHRoZSBsaWJyYXJ5IGRlZmF1bHQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWZjb3VudCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGNvdW50ZXIgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiBARlRfRmFjZSBzdHJ1Y3R1cmUgaXMgICovCi0gIC8qICAgICAgY3JlYXRlZC4gIEBGVF9SZWZlcmVuY2VfRmFjZSBpbmNyZW1lbnRzIHRoaXMgY291bnRlciwgYW5kICAgICAgICAqLwotICAvKiAgICAgIEBGVF9Eb25lX0ZhY2Ugb25seSBkZXN0cm95cyBhIGZhY2UgaWYgdGhlIGNvdW50ZXIgaXN+MSwgICAgICAgICAgKi8KLSAgLyogICAgICBvdGhlcndpc2UgaXQgc2ltcGx5IGRlY3JlbWVudHMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfRmFjZV9JbnRlcm5hbFJlY18KLSAgewotICAgIEZUX01hdHJpeCAgdHJhbnNmb3JtX21hdHJpeDsKLSAgICBGVF9WZWN0b3IgIHRyYW5zZm9ybV9kZWx0YTsKLSAgICBGVF9JbnQgICAgIHRyYW5zZm9ybV9mbGFnczsKLQotICAgIEZUX1NlcnZpY2VDYWNoZVJlYyAgc2VydmljZXM7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjKiAgaW5jcmVtZW50YWxfaW50ZXJmYWNlOwotI2VuZGlmCi0KLSAgICBGVF9DaGFyICAgICAgICAgICAgICBub19zdGVtX2RhcmtlbmluZzsKLSAgICBGVF9JbnQzMiAgICAgICAgICAgICByYW5kb21fc2VlZDsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwotICAgIEZUX0xjZEZpdmVUYXBGaWx0ZXIgIGxjZF93ZWlnaHRzOyAgLyogcHJlc2V0IG9yIGN1c3RvbSBmaWx0ZXIgd2VpZ2h0cyAqLwotI2VuZGlmCi0KLSAgICBGVF9JbnQgIHJlZmNvdW50OwotCi0gIH0gRlRfRmFjZV9JbnRlcm5hbFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nsb3RfSW50ZXJuYWxSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmaWVsZHMgb2YgZWFjaCBGVF9HbHlwaFNsb3QgICAqLwotICAvKiAgICBvYmplY3QuICBUaGVzZSBmaWVsZHMgbWF5IGNoYW5nZSBiZXR3ZWVuIGRpZmZlcmVudCByZWxlYXNlcyBvZiAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyICAgICAgICAgICAgOjogVGhlIGdseXBoIGxvYWRlciBvYmplY3QgdXNlZCB0byBsb2FkIG91dGxpbmVzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxhZ3MgICAgICAgICAgICAgOjogUG9zc2libGUgdmFsdWVzIGFyZSB6ZXJvIG9yICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dMWVBIX09XTl9CSVRNQVAuICBUaGUgbGF0dGVyIGluZGljYXRlcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBGVF9HbHlwaFNsb3Qgc3RydWN0dXJlIG93bnMgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF90cmFuc2Zvcm1lZCA6OiBCb29sZWFuLiAgU2V0IHRvIFRSVUUgd2hlbiB0aGUgbG9hZGVkIGdseXBoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSB0cmFuc2Zvcm1lZCB0aHJvdWdoIGEgc3BlY2lmaWMgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgdHJhbnNmb3JtYXRpb24uICBUaGlzIGlzIF9ub3RfIHRoZSBzYW1lICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0aGUgZmFjZSB0cmFuc2Zvcm0gc2V0IHRocm91Z2ggICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2V0X1RyYW5zZm9ybSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9tYXRyaXggICAgICA6OiBUaGUgMngyIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnbHlwaCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24sIGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9kZWx0YSAgICAgICA6OiBUaGUgMmQgdHJhbnNsYXRpb24gdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBoIHRyYW5zZm9ybWF0aW9uLCBpZiBuZWNlc3NhcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9oaW50cyAgICAgICA6OiBGb3JtYXQtc3BlY2lmaWMgZ2x5cGggaGludHMgbWFuYWdlbWVudC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgRlRfR0xZUEhfT1dOX0JJVE1BUCAgMHgxVQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TbG90X0ludGVybmFsUmVjXwotICB7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlcjsKLSAgICBGVF9VSW50ICAgICAgICAgZmxhZ3M7Ci0gICAgRlRfQm9vbCAgICAgICAgIGdseXBoX3RyYW5zZm9ybWVkOwotICAgIEZUX01hdHJpeCAgICAgICBnbHlwaF9tYXRyaXg7Ci0gICAgRlRfVmVjdG9yICAgICAgIGdseXBoX2RlbHRhOwotICAgIHZvaWQqICAgICAgICAgICBnbHlwaF9oaW50czsKLQotICB9IEZUX0dseXBoU2xvdF9JbnRlcm5hbFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfSW50ZXJuYWxSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmaWVsZHMgb2YgZWFjaCBGVF9TaXplICAgICAgICAqLwotICAvKiAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfZGF0YSAgICAgIDo6IERhdGEgc3BlY2lmaWMgdG8gYSBkcml2ZXIgbW9kdWxlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF1dG9oaW50X21vZGUgICAgOjogVGhlIHVzZWQgYXV0by1oaW50aW5nIG1vZGUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXV0b2hpbnRfbWV0cmljcyA6OiBNZXRyaWNzIHVzZWQgYnkgdGhlIGF1dG8taGludGVyLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9JbnRlcm5hbFJlY18KLSAgewotICAgIHZvaWQqICBtb2R1bGVfZGF0YTsKLQotICAgIEZUX1JlbmRlcl9Nb2RlICAgYXV0b2hpbnRfbW9kZTsKLSAgICBGVF9TaXplX01ldHJpY3MgIGF1dG9oaW50X21ldHJpY3M7Ci0KLSAgfSBGVF9TaXplX0ludGVybmFsUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBNIE8gRCBVIEwgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBtb2R1bGUgb2JqZWN0IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2xhenogICA6OiBBIHBvaW50ZXIgdG8gdGhlIG1vZHVsZSdzIGNsYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01vZHVsZVJlY18KLSAgewotICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6OwotICAgIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnk7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5OwotCi0gIH0gRlRfTW9kdWxlUmVjOwotCi0KLSAgLyogdHlwZWNhc3QgYW4gb2JqZWN0IHRvIGFuIEZUX01vZHVsZSAqLwotI2RlZmluZSBGVF9NT0RVTEUoIHggKSAgICAgICAgICAoKEZUX01vZHVsZSkoIHggKSkKLSNkZWZpbmUgRlRfTU9EVUxFX0NMQVNTKCB4ICkgICAgRlRfTU9EVUxFKCB4ICktPmNsYXp6Ci0jZGVmaW5lIEZUX01PRFVMRV9MSUJSQVJZKCB4ICkgIEZUX01PRFVMRSggeCApLT5saWJyYXJ5Ci0jZGVmaW5lIEZUX01PRFVMRV9NRU1PUlkoIHggKSAgIEZUX01PRFVMRSggeCApLT5tZW1vcnkKLQotCi0jZGVmaW5lIEZUX01PRFVMRV9JU19EUklWRVIoIHggKSAgKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICkKLQotI2RlZmluZSBGVF9NT0RVTEVfSVNfUkVOREVSRVIoIHggKSAgKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfUkVOREVSRVIgKQotCi0jZGVmaW5lIEZUX01PRFVMRV9JU19ISU5URVIoIHggKSAgKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX0hJTlRFUiApCi0KLSNkZWZpbmUgRlRfTU9EVUxFX0lTX1NUWUxFUiggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfU1RZTEVSICkKLQotI2RlZmluZSBGVF9EUklWRVJfSVNfU0NBTEFCTEUoIHggKSAgKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfRFJJVkVSX1NDQUxBQkxFICkKLQotI2RlZmluZSBGVF9EUklWRVJfVVNFU19PVVRMSU5FUyggeCApICAhKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfRFJJVkVSX05PX09VVExJTkVTICkKLQotI2RlZmluZSBGVF9EUklWRVJfSEFTX0hJTlRFUiggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX0RSSVZFUl9IQVNfSElOVEVSICkKLQotI2RlZmluZSBGVF9EUklWRVJfSElOVFNfTElHSFRMWSggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX0RSSVZFUl9ISU5UU19MSUdIVExZICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmRzIGEgbW9kdWxlIGFuZCByZXR1cm5zIGl0cyBzcGVjaWZpYyBpbnRlcmZhY2UgYXMgYSB0eXBlbGVzcyAgICAqLwotICAvKiAgICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9uYW1lIDo6IFRoZSBtb2R1bGUncyBuYW1lIChhcyBhbiBBU0NJSSBzdHJpbmcpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSBpZiBhdmFpbGFibGUsIDAgb3RoZXJ3aXNlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgYmV0dGVyIGJlIGZhbWlsaWFyIHdpdGggRnJlZVR5cGUgaW50ZXJuYWxzIHRvIGtub3cgICAgICAqLwotICAvKiAgICB3aGljaCBtb2R1bGUgdG8gbG9vayBmb3IsIGFuZCB3aGF0IGl0cyBpbnRlcmZhY2UgaXMgOi0pICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIGNvbnN0IHZvaWQqICkKLSAgRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG1vZF9uYW1lICk7Ci0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21vZHVsZV9nZXRfc2VydmljZSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgc2VydmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZ2xvYmFsICk7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBmdF9wcm9wZXJ0eV9zdHJpbmdfc2V0KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgICAgICAgdmFsdWUgKTsKLSNlbmRpZgotCi0gIC8qICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgRiBBIEMgRSwgICBTIEkgWiBFICAgJiAgIEcgTCBZIFAgSCAgIFMgTCBPIFQgICBPIEIgSiBFIEMgVCBTICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogYSBmZXcgbWFjcm9zIHVzZWQgdG8gcGVyZm9ybSBlYXN5IHR5cGVjYXN0cyB3aXRoIG1pbmltYWwgYnJhaW4gZGFtYWdlICovCi0KLSNkZWZpbmUgRlRfRkFDRSggeCApICAgICAgICAgICgoRlRfRmFjZSkoeCkpCi0jZGVmaW5lIEZUX1NJWkUoIHggKSAgICAgICAgICAoKEZUX1NpemUpKHgpKQotI2RlZmluZSBGVF9TTE9UKCB4ICkgICAgICAgICAgKChGVF9HbHlwaFNsb3QpKHgpKQotCi0jZGVmaW5lIEZUX0ZBQ0VfRFJJVkVSKCB4ICkgICBGVF9GQUNFKCB4ICktPmRyaXZlcgotI2RlZmluZSBGVF9GQUNFX0xJQlJBUlkoIHggKSAgRlRfRkFDRV9EUklWRVIoIHggKS0+cm9vdC5saWJyYXJ5Ci0jZGVmaW5lIEZUX0ZBQ0VfTUVNT1JZKCB4ICkgICBGVF9GQUNFKCB4ICktPm1lbW9yeQotI2RlZmluZSBGVF9GQUNFX1NUUkVBTSggeCApICAgRlRfRkFDRSggeCApLT5zdHJlYW0KLQotI2RlZmluZSBGVF9TSVpFX0ZBQ0UoIHggKSAgICAgRlRfU0laRSggeCApLT5mYWNlCi0jZGVmaW5lIEZUX1NMT1RfRkFDRSggeCApICAgICBGVF9TTE9UKCB4ICktPmZhY2UKLQotI2RlZmluZSBGVF9GQUNFX1NMT1QoIHggKSAgICAgRlRfRkFDRSggeCApLT5nbHlwaAotI2RlZmluZSBGVF9GQUNFX1NJWkUoIHggKSAgICAgRlRfRkFDRSggeCApLT5zaXplCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBnbHlwaCBzbG90IGZvciBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gZmFjZSBvYmplY3QuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgICAgICovCi0gIC8qICAgIHNsb3RzLiAgQWxsIG9mIHRoZW0gYXJlIGF1dG9tYXRpY2FsbHkgZGlzY2FyZGVkIHdoZW4gdGhlIGZhY2UgaXMgICAqLwotICAvKiAgICBkZXN0cm95ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICA6OiBBIGhhbmRsZSB0byBhIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc2xvdCA6OiBBIGhhbmRsZSB0byBhIG5ldyBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0dseXBoU2xvdCggRlRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAqYXNsb3QgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gIFJlbWVtYmVyIGhvd2V2ZXIgdGhhdCBhbGwgc2xvdHMgYXJlICAqLwotICAvKiAgICBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZCB3aXRoIGl0cyBwYXJlbnQuICBVc2luZyB0aGlzIGZ1bmN0aW9uIGlzICAgKi8KLSAgLyogICAgbm90IGFsd2F5cyBtYW5kYXRvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2xvdCA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfRG9uZV9HbHlwaFNsb3QoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gLyogKi8KLQotI2RlZmluZSBGVF9SRVFVRVNUX1dJRFRIKCByZXEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHJlcSktPmhvcmlSZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICA/ICggKHJlcSktPndpZHRoICogKEZUX1BvcykocmVxKS0+aG9yaVJlc29sdXRpb24gKyAzNiApIC8gNzIgXAotICAgICAgICAgICAgICA6IChyZXEpLT53aWR0aCApCi0KLSNkZWZpbmUgRlRfUkVRVUVTVF9IRUlHSFQoIHJlcSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAocmVxKS0+dmVydFJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICA/ICggKHJlcSktPmhlaWdodCAqIChGVF9Qb3MpKHJlcSktPnZlcnRSZXNvbHV0aW9uICsgMzYgKSAvIDcyIFwKLSAgICAgICAgICAgICAgOiAocmVxKS0+aGVpZ2h0ICkKLQotCi0gIC8qIFNldCB0aGUgbWV0cmljcyBhY2NvcmRpbmcgdG8gYSBiaXRtYXAgc3RyaWtlLiAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU2VsZWN0X01ldHJpY3MoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHN0cmlrZV9pbmRleCApOwotCi0KLSAgLyogU2V0IHRoZSBtZXRyaWNzIGFjY29yZGluZyB0byBhIHNpemUgcmVxdWVzdC4gKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1JlcXVlc3RfTWV0cmljcyggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICk7Ci0KLQotICAvKiBNYXRjaCBhIHNpemUgcmVxdWVzdCBhZ2FpbnN0IGBhdmFpbGFibGVfc2l6ZXMnLiAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX01hdGNoX1NpemUoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEsCi0gICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgaWdub3JlX3dpZHRoLAotICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgIHNpemVfaW5kZXggKTsKLQotCi0gIC8qIFVzZSB0aGUgaG9yaXpvbnRhbCBtZXRyaWNzIHRvIHN5bnRoZXNpemUgdGhlIHZlcnRpY2FsIG1ldHJpY3MuICovCi0gIC8qIElmIGBhZHZhbmNlJyBpcyB6ZXJvLCBpdCBpcyBhbHNvIHN5bnRoZXNpemVkLiAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBmdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MoIEZUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICBhZHZhbmNlICk7Ci0KLQotICAvKiBGcmVlIHRoZSBiaXRtYXAgb2YgYSBnaXZlbiBnbHlwaHNsb3Qgd2hlbiBuZWVkZWQgKGkuZS4sIG9ubHkgd2hlbiBpdCAqLwotICAvKiB3YXMgYWxsb2NhdGVkIHdpdGggZnRfZ2x5cGhzbG90X2FsbG9jX2JpdG1hcCkuICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotCi0gIC8qIEFsbG9jYXRlIGEgbmV3IGJpdG1hcCBidWZmZXIgaW4gYSBnbHlwaCBzbG90LiAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBzaXplICk7Ci0KLQotICAvKiBTZXQgdGhlIGJpdG1hcCBidWZmZXIgaW4gYSBnbHlwaCBzbG90IHRvIGEgZ2l2ZW4gcG9pbnRlci4gIFRoZSBidWZmZXIgKi8KLSAgLyogd2lsbCBub3QgYmUgZnJlZWQgYnkgYSBsYXRlciBjYWxsIHRvIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcC4gICAgICAgICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBmdF9nbHlwaHNsb3Rfc2V0X2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICBidWZmZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICBSIEUgTiBEIEUgUiBFIFIgUyAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX1JFTkRFUkVSKCB4ICkgICAgICAoKEZUX1JlbmRlcmVyKSggeCApKQotI2RlZmluZSBGVF9HTFlQSCggeCApICAgICAgICAgKChGVF9HbHlwaCkoIHggKSkKLSNkZWZpbmUgRlRfQklUTUFQX0dMWVBIKCB4ICkgICgoRlRfQml0bWFwR2x5cGgpKCB4ICkpCi0jZGVmaW5lIEZUX09VVExJTkVfR0xZUEgoIHggKSAoKEZUX091dGxpbmVHbHlwaCkoIHggKSkKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9SZW5kZXJlclJlY18KLSAgewotICAgIEZUX01vZHVsZVJlYyAgICAgICAgICAgIHJvb3Q7Ci0gICAgRlRfUmVuZGVyZXJfQ2xhc3MqICAgICAgY2xheno7Ci0gICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICAgZ2x5cGhfZm9ybWF0OwotICAgIEZUX0dseXBoX0NsYXNzICAgICAgICAgIGdseXBoX2NsYXNzOwotCi0gICAgRlRfUmFzdGVyICAgICAgICAgICAgICAgcmFzdGVyOwotICAgIEZUX1Jhc3Rlcl9SZW5kZXJfRnVuYyAgIHJhc3Rlcl9yZW5kZXI7Ci0gICAgRlRfUmVuZGVyZXJfUmVuZGVyRnVuYyAgcmVuZGVyOwotCi0gIH0gRlRfUmVuZGVyZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICBGIE8gTiBUICAgRCBSIEkgViBFIFIgUyAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiB0eXBlY2FzdCBhIG1vZHVsZSBpbnRvIGEgZHJpdmVyIGVhc2lseSAqLwotI2RlZmluZSBGVF9EUklWRVIoIHggKSAgICAgICAgKChGVF9Ecml2ZXIpKHgpKQotCi0gIC8qIHR5cGVjYXN0IGEgbW9kdWxlIGFzIGEgZHJpdmVyLCBhbmQgZ2V0IGl0cyBkcml2ZXIgY2xhc3MgKi8KLSNkZWZpbmUgRlRfRFJJVkVSX0NMQVNTKCB4ICkgIEZUX0RSSVZFUiggeCApLT5jbGF6egotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRHJpdmVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJvb3QgZm9udCBkcml2ZXIgY2xhc3MuICBBIGZvbnQgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciAgICAgICovCi0gIC8qICAgIG1hbmFnaW5nIGFuZCBsb2FkaW5nIGZvbnQgZmlsZXMgb2YgYSBnaXZlbiBmb3JtYXQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICByb290ICAgICAgICAgOjogQ29udGFpbnMgdGhlIGZpZWxkcyBvZiB0aGUgcm9vdCBtb2R1bGUgY2xhc3MuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNsYXp6ICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGZvbnQgZHJpdmVyJ3MgY2xhc3MuICBOb3RlIHRoYXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBOT1Qgcm9vdC5jbGF6ei4gIGBjbGFzcycgd2Fzbid0IHVzZWQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIGFzIGl0IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBDKysuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBmYWNlc19saXN0ICAgOjogVGhlIGxpc3Qgb2YgZmFjZXMgY3VycmVudGx5IG9wZW5lZCBieSB0aGlzICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBnbHlwaF9sb2FkZXIgOjogVW51c2VkLiAgVXNlZCB0byBiZSBnbHlwaCBsb2FkZXIgZm9yIGFsbCBmYWNlcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgYnkgdGhpcyBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Ecml2ZXJSZWNfCi0gIHsKLSAgICBGVF9Nb2R1bGVSZWMgICAgIHJvb3Q7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6ejsKLSAgICBGVF9MaXN0UmVjICAgICAgIGZhY2VzX2xpc3Q7Ci0gICAgRlRfR2x5cGhMb2FkZXIgICBnbHlwaF9sb2FkZXI7Ci0KLSAgfSBGVF9Ecml2ZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICBMIEkgQiBSIEEgUiBJIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBUaGlzIGhvb2sgaXMgdXNlZCBieSB0aGUgVHJ1ZVR5cGUgZGVidWdnZXIuICBJdCBtdXN0IGJlIHNldCB0byBhbiAqLwotICAvKiBhbHRlcm5hdGUgdHJ1ZXR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9ERUJVR19IT09LX1RSVUVUWVBFICAwCi0KLQotICB0eXBlZGVmIHZvaWQgICgqRlRfQml0bWFwX0xjZEZpbHRlckZ1bmMpKCBGVF9CaXRtYXAqICAgICAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICB3ZWlnaHRzICk7Ci0KLQotICAvKiBUaGlzIGlzIHRoZSBkZWZhdWx0IExDRCBmaWx0ZXIsIGFuIGluLXBsYWNlLCA1LXRhcCBGSVIgZmlsdGVyLiAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfbGNkX2ZpbHRlcl9maXIoIEZUX0JpdG1hcCogICAgICAgICAgIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9MY2RGaXZlVGFwRmlsdGVyICB3ZWlnaHRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgRnJlZVR5cGUgbGlicmFyeSBjbGFzcy4gIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYWxsIEZyZWVUeXBlICAgICAgKi8KLSAgLyogICAgZGF0YS4gIFVzZSBGVF9OZXdfTGlicmFyeSgpIHRvIGNyZWF0ZSBhIGxpYnJhcnkgb2JqZWN0LCBhbmQgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfTGlicmFyeSgpIHRvIGRpc2NhcmQgaXQgYW5kIGFsbCBjaGlsZCBvYmplY3RzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgICAgICAgOjogVGhlIGxpYnJhcnkncyBtZW1vcnkgb2JqZWN0LiAgTWFuYWdlcyBtZW1vcnkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb25fbWFqb3IgICAgOjogVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbl9taW5vciAgICA6OiBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uX3BhdGNoICAgIDo6IFRoZSBjdXJyZW50IHBhdGNoIGxldmVsIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9tb2R1bGVzICAgICAgOjogVGhlIG51bWJlciBvZiBtb2R1bGVzIGN1cnJlbnRseSByZWdpc3RlcmVkICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGlzIGxpYnJhcnkuICBUaGlzIGlzIHNldCB0byAwIGZvciBuZXcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMuICBOZXcgbW9kdWxlcyBhcmUgYWRkZWQgdGhyb3VnaCB0aGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgRlRfQWRkX01vZHVsZSgpIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlcyAgICAgICAgICA6OiBBIHRhYmxlIHVzZWQgdG8gc3RvcmUgaGFuZGxlcyB0byB0aGUgY3VycmVudGx5ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCBtb2R1bGVzLiBOb3RlIHRoYXQgZWFjaCBmb250IGRyaXZlciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGEgbGlzdCBvZiBpdHMgb3BlbmVkIGZhY2VzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlbmRlcmVycyAgICAgICAgOjogVGhlIGxpc3Qgb2YgcmVuZGVyZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cl9yZW5kZXJlciAgICAgOjogVGhlIGN1cnJlbnQgb3V0bGluZSByZW5kZXJlci4gIFRoaXMgaXMgYSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0IHVzZWQgdG8gYXZvaWQgcGFyc2luZyB0aGUgbGlzdCBvbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGNhbGwgdG8gRlRfT3V0bGluZV9SZW5kZXIoKS4gIEl0IGlzIGEgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIHRvIHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciB0aGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIGZvcm1hdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF1dG9faGludGVyICAgICAgOjogVGhlIGF1dG8taGludGVyIG1vZHVsZSBpbnRlcmZhY2UuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVidWdfaG9va3MgICAgICA6OiBBbiBhcnJheSBvZiBmb3VyIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgYWxsb3cgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnZXJzIHRvIGhvb2sgaW50byBhIGZvbnQgZm9ybWF0J3MgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGVyLiAgQ3VycmVudGx5LCBvbmx5IHRoZSBUcnVlVHlwZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBieXRlY29kZSBkZWJ1Z2dlciB1c2VzIHRoaXMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsY2RfZmlsdGVyICAgICAgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBMQ0QgZmlsdGVyIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsY2Rfd2VpZ2h0cyAgICAgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSBMQ0QgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgd2VpZ2h0cywgaWYgYW55LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsY2RfZmlsdGVyX2Z1bmMgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSBMQ0QgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmcgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaWNfY29udGFpbmVyICAgIDo6IENvbnRhaW5zIGdsb2JhbCBzdHJ1Y3RzIGFuZCB0YWJsZXMsIGluc3RlYWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBvZiBkZWZpbmluZyB0aGVtIGdsb2JhbGx5LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWZjb3VudCAgICAgICAgIDo6IEEgY291bnRlciBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBARlRfTGlicmFyeSBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1JlZmVyZW5jZV9MaWJyYXJ5IGluY3JlbWVudHMgdGhpcyBjb3VudGVyLCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBARlRfRG9uZV9MaWJyYXJ5IG9ubHkgZGVzdHJveXMgYSBsaWJyYXJ5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgY291bnRlciBpc34xLCBvdGhlcndpc2UgaXQgc2ltcGx5ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVtZW50cyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0xpYnJhcnlSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OyAgICAgICAgICAgLyogbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyICovCi0KLSAgICBGVF9JbnQgICAgICAgICAgICAgdmVyc2lvbl9tYWpvcjsKLSAgICBGVF9JbnQgICAgICAgICAgICAgdmVyc2lvbl9taW5vcjsKLSAgICBGVF9JbnQgICAgICAgICAgICAgdmVyc2lvbl9wYXRjaDsKLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fbW9kdWxlczsKLSAgICBGVF9Nb2R1bGUgICAgICAgICAgbW9kdWxlc1tGVF9NQVhfTU9EVUxFU107ICAvKiBtb2R1bGUgb2JqZWN0cyAgKi8KLQotICAgIEZUX0xpc3RSZWMgICAgICAgICByZW5kZXJlcnM7ICAgICAgICAvKiBsaXN0IG9mIHJlbmRlcmVycyAgICAgICAgKi8KLSAgICBGVF9SZW5kZXJlciAgICAgICAgY3VyX3JlbmRlcmVyOyAgICAgLyogY3VycmVudCBvdXRsaW5lIHJlbmRlcmVyICovCi0gICAgRlRfTW9kdWxlICAgICAgICAgIGF1dG9faGludGVyOwotCi0gICAgRlRfRGVidWdIb29rX0Z1bmMgIGRlYnVnX2hvb2tzWzRdOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLSAgICBGVF9MY2RGaWx0ZXIgICAgICAgICAgICAgbGNkX2ZpbHRlcjsKLSAgICBGVF9MY2RGaXZlVGFwRmlsdGVyICAgICAgbGNkX3dlaWdodHM7ICAgICAgLyogZmlsdGVyIHdlaWdodHMsIGlmIGFueSAqLwotICAgIEZUX0JpdG1hcF9MY2RGaWx0ZXJGdW5jICBsY2RfZmlsdGVyX2Z1bmM7ICAvKiBmaWx0ZXJpbmcgY2FsbGJhY2sgICAgICovCi0jZW5kaWYKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgRlRfUElDX0NvbnRhaW5lciAgIHBpY19jb250YWluZXI7Ci0jZW5kaWYKLQotICAgIEZUX0ludCAgICAgICAgICAgICByZWZjb3VudDsKLQotICB9IEZUX0xpYnJhcnlSZWM7Ci0KLQotICBGVF9CQVNFKCBGVF9SZW5kZXJlciApCi0gIEZUX0xvb2t1cF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX0Zvcm1hdCAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlKiAgICAgbm9kZSApOwotCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKCBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUgKTsKLQotICB0eXBlZGVmIGNvbnN0IGNoYXIqCi0gICgqRlRfRmFjZV9HZXRQb3N0c2NyaXB0TmFtZUZ1bmMpKCBGVF9GYWNlICBmYWNlICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0ZhY2VfR2V0R2x5cGhOYW1lRnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKTsKLQotICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpGVF9GYWNlX0dldEdseXBoTmFtZUluZGV4RnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICk7Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlcyBhIG5ldyBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBwb2ludGVyIHRvIHRoZSBuZXcgbWVtb3J5IG9iamVjdC4gIDAgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9NZW1vcnkgKQotICBGVF9OZXdfTWVtb3J5KCB2b2lkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkcyBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9Eb25lX01lbW9yeSggRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNICovCi0KLQotICAvKiBEZWZpbmUgZGVmYXVsdCByYXN0ZXIncyBpbnRlcmZhY2UuICBUaGUgZGVmYXVsdCByYXN0ZXIgaXMgbG9jYXRlZCBpbiAgKi8KLSAgLyogYHNyYy9iYXNlL2Z0cmFzdGVyLmMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDbGllbnQgYXBwbGljYXRpb25zIGNhbiByZWdpc3RlciBuZXcgcmFzdGVycyB0aHJvdWdoIHRoZSAgICAgICAgICAgICAgKi8KLSAgLyogRlRfU2V0X1Jhc3RlcigpIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZm5kZWYgRlRfTk9fREVGQVVMVF9SQVNURVIKLSAgRlRfRVhQT1JUX1ZBUiggRlRfUmFzdGVyX0Z1bmNzICkgIGZ0X2RlZmF1bHRfcmFzdGVyOwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgIFAgSSBDICAgUyBVIFAgUCBPIFIgVCAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBQSUMgc3VwcG9ydCBtYWNyb3MgZm9yIGZ0aW1hZ2UuaCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIEZUX091dGxpbmVfRnVuY3Mgc3RydWN0LiAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhbiBpbml0IGZ1bmN0aW9uIHdpbGwgbmVlZCAgICAqLwotICAvKiAgICB0byBiZSBjYWxsZWQgd2l0aCBhIHByZS1hbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLwotICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1vdmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsaW5lX3RvXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY29uaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGN1YmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaGlmdF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZGVsdGFfICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgIEZUX091dGxpbmVfRnVuY3MgY2xhc3NfID0gIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbW92ZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpbmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25pY190b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3ViaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNoaWZ0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkZWx0YV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbW92ZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsaW5lX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvbmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY3ViaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaGlmdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRlbHRhXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9PdXRsaW5lX0Z1bmNzKiAgY2xhenogKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vdmVfdG8gID0gbW92ZV90b187ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bGluZV90byAgPSBsaW5lX3RvXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jb25pY190byA9IGNvbmljX3RvXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmN1YmljX3RvID0gY3ViaWNfdG9fOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2hpZnQgICAgPSBzaGlmdF87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kZWx0YSAgICA9IGRlbHRhXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1JBU1RFUl9GVU5DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIEZUX1Jhc3Rlcl9GdW5jcyBzdHJ1Y3QuICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhbiBpbml0IGZ1bmN0aW9uIHdpbGwgbmVlZCAgICAqLwotICAvKiAgICB0byBiZSBjYWxsZWQgd2l0aCBhIHByZS1hbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLwotICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1JBU1RFUl9GVU5DUyggICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfbmV3XywgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9yZXNldF8sICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX3NldF9tb2RlXywgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfcmVuZGVyXywgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9kb25lXyApICAgICAgICAgICBcCi0gIGNvbnN0IEZUX1Jhc3Rlcl9GdW5jcyAgY2xhc3NfID0gIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICBcCi0gICAgcmFzdGVyX25ld18sICAgICAgICAgICAgICAgICAgIFwKLSAgICByYXN0ZXJfcmVzZXRfLCAgICAgICAgICAgICAgICAgXAotICAgIHJhc3Rlcl9zZXRfbW9kZV8sICAgICAgICAgICAgICBcCi0gICAgcmFzdGVyX3JlbmRlcl8sICAgICAgICAgICAgICAgIFwKLSAgICByYXN0ZXJfZG9uZV8gICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnbHlwaF9mb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX25ld18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9yZXNldF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfc2V0X21vZGVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX3JlbmRlcl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9kb25lXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfUmFzdGVyX0Z1bmNzKiAgY2xhenogKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfZm9ybWF0ICAgID0gZ2x5cGhfZm9ybWF0XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPnJhc3Rlcl9uZXcgICAgICA9IHJhc3Rlcl9uZXdfOyAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfcmVzZXQgICAgPSByYXN0ZXJfcmVzZXRfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmFzdGVyX3NldF9tb2RlID0gcmFzdGVyX3NldF9tb2RlXzsgICAgICAgICBcCi0gICAgY2xhenotPnJhc3Rlcl9yZW5kZXIgICA9IHJhc3Rlcl9yZW5kZXJfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfZG9uZSAgICAgPSByYXN0ZXJfZG9uZV87ICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qIFBJQyBzdXBwb3J0IG1hY3JvcyBmb3IgZnRyZW5kZXIuaCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX0dMWVBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIEZUX0dseXBoX0NsYXNzIHN0cnVjdC4gICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhbiBpbml0IGZ1bmN0aW9uIHdpbGwgbmVlZCAgICAqLwotICAvKiAgICB0byBiZSBjYWxsZWQgd2l0aCBhIHByZS1hbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLwotICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX0dMWVBIKCAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmb3JtYXRfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb3B5XywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdHJhbnNmb3JtXywgICAgICAgICAgICAgXAotICAgICAgICAgIGJib3hfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBwcmVwYXJlXyApICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgXAotICBjb25zdCBGVF9HbHlwaF9DbGFzcyAgY2xhc3NfID0gIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvcHlfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0cmFuc2Zvcm1fLCAgICAgICAgICAgICAgICAgICBcCi0gICAgYmJveF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByZXBhcmVfICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfR0xZUEgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvcHlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHRyYW5zZm9ybV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGJib3hfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHByZXBhcmVfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0dseXBoX0NsYXNzKiAgY2xhenogKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9zaXplICAgICAgPSBzaXplXzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9mb3JtYXQgICAgPSBmb3JtYXRfOyAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9pbml0ICAgICAgPSBpbml0XzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9kb25lICAgICAgPSBkb25lXzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9jb3B5ICAgICAgPSBjb3B5XzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1fOyAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9iYm94ICAgICAgPSBiYm94XzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9wcmVwYXJlICAgPSBwcmVwYXJlXzsgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVDTEFSRV9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBjcmVhdGUgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGEgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcmVyX0NsYXNzIHN0cnVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9SZW5kZXJlcl9DbGFzcyBzdHJ1Y3QuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVuY3Rpb24gd2lsbCAgICAgICovCi0gIC8qICAgIG5lZWQgdG8gYmUgY2FsbGVkIHdpdGggYSBwb2ludGVyIHdoZXJlIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlIGlzICAqLwotICAvKiAgICByZXR1cm5lZC4gIEFuZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgYSBgZGVzdHJveScgZnVuY3Rpb24gICAgKi8KLSAgLyogICAgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBmdGluaXQuYycgKGZ0X2NyZWF0ZV9kZWZhdWx0X21vZHVsZV9jbGFzc2VzKSBhbHJlYWR5IGNvbnRhaW5zICAgICAqLwotICAvKiAgICBhIG1lY2hhbmlzbSB0byBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbW9kdWxlcyAgICAgICAgKi8KLSAgLyogICAgZGVzY3JpYmVkIGluIGBmdG1vZHVsZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RpY2UgdGhhdCB0aGUgY3JlYXRlZCBgY3JlYXRlJyBhbmQgYGRlc3Ryb3knIGZ1bmN0aW9ucyBjYWxsICAgICAgKi8KLSAgLyogICAgYHBpY19pbml0JyBhbmQgYHBpY19mcmVlJyB0byBhbGxvdyB5b3UgdG8gbWFudWFsbHkgYWxsb2NhdGUgYW5kICAgICovCi0gIC8qICAgIGluaXRpYWxpemUgYW55IGFkZGl0aW9uYWwgZ2xvYmFsIGRhdGEsIGxpa2UgYSBtb2R1bGUgc3BlY2lmaWMgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UsIGFuZCBwdXQgdGhlbSBpbiB0aGUgZ2xvYmFsIHBpYyBjb250YWluZXIgZGVmaW5lZCBpbiAgICAgKi8KLSAgLyogICAgYGZ0cGljLmgnLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlbSBqdXN0IGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIGFzICovCi0gIC8qICAgIGVtcHR5IHRvIHJlc29sdmUgdGhlIGxpbmsgZXJyb3IuICBBbHNvIHRoZSBgcGljX2luaXQnIGFuZCAgICAgICAgICAqLwotICAvKiAgICBgcGljX2ZyZWUnIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gYHBpYy5oJywgdG8gYmUgcmVmZXJyZWQgKi8KLSAgLyogICAgYnkgdGhlIHJlbmRlcmVyIGRlZmluaXRpb24gY2FsbGluZyBgRlRfREVGSU5FX1JFTkRFUkVSJyBpbiB0aGUgICAgICovCi0gIC8qICAgIGZvbGxvd2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLwotICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9SRU5ERVJFUiggY2xhc3NfICkgICAgICAgICAgICAgICBcCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICkgY2xhc3NfOwotCi0jZGVmaW5lIEZUX0RFRklORV9SRU5ERVJFUiggICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVuZGVyX2dseXBoXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdHJhbnNmb3JtX2dseXBoXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2dseXBoX2Nib3hfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X21vZGVfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX2NsYXNzXyApICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICBjbGFzc18gPSAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCBmbGFnc18sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc18sICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lXywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICBcCi0gICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVuZGVyX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHJhbnNmb3JtX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2dseXBoX2Nib3hfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2V0X21vZGVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmFzdGVyX2NsYXNzXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9SRU5ERVJFUiggY2xhc3NfICkgIEZUX0RFQ0xBUkVfTU9EVUxFKCBjbGFzc18gKQotCi0jZGVmaW5lIEZUX0RFRklORV9SRU5ERVJFUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVuZGVyX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB0cmFuc2Zvcm1fZ2x5cGhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbHlwaF9jYm94XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X21vZGVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfY2xhc3NfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUmVuZGVyZXJfQ2xhc3MqICByY2xhenogPSAoRlRfUmVuZGVyZXJfQ2xhc3MqKWNsYXp6OyAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGFzc18gIyMgX3BpY19mcmVlKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggcmNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCByY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgb3V0cHV0X2NsYXNzICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1JlbmRlcmVyX0NsYXNzKiAgY2xhenogPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKSApICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlcnJvciA9IGNsYXNzXyAjIyBfcGljX2luaXQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0RFRklORV9ST09UX01PRFVMRSggZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdseXBoX2Zvcm1hdCAgICA9IGdseXBoX2Zvcm1hdF87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yZW5kZXJfZ2x5cGggICAgPSByZW5kZXJfZ2x5cGhfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnRyYW5zZm9ybV9nbHlwaCA9IHRyYW5zZm9ybV9nbHlwaF87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2dseXBoX2Nib3ggID0gZ2V0X2dseXBoX2Nib3hfOyAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfbW9kZSAgICAgICAgPSBzZXRfbW9kZV87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmFzdGVyX2NsYXNzICAgID0gcmFzdGVyX2NsYXNzXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IChGVF9Nb2R1bGVfQ2xhc3MqKWNsYXp6OyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotICAvKiBQSUMgc3VwcG9ydCBtYWNyb3MgZm9yIGZ0bW9kYXBpLmggKiovCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0NyZWF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSAoYWxsb2NhdGUpIGEgbmV3IG1vZHVsZSBjbGFzcyBvYmplY3QuICAgICovCi0gIC8qICAgIFRoZSBvYmplY3QncyBtZW1iZXJzIGFyZSBpbml0aWFsaXplZCwgYnV0IHRoZSBtb2R1bGUgaXRzZWxmIGlzICAgICAqLwotICAvKiAgICBub3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0cHV0X2NsYXNzIDo6IEluaXRpYWxpemVkIHdpdGggdGhlIG5ld2x5IGFsbG9jYXRlZCBjbGFzcy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfTW9kdWxlX0NyZWF0b3IpKCBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9EZXN0cm95ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBkZXN0cm95IChkZWFsbG9jYXRlKSBhIG1vZHVsZSBjbGFzcyBvYmplY3QuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbGF6eiAgOjogTW9kdWxlIGNsYXNzIHRvIGRlc3Ryb3kuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX01vZHVsZV9EZXN0cm95ZXIpKCBGVF9NZW1vcnkgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICk7Ci0KLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVDTEFSRV9NT0RVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBjcmVhdGUgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGEgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9DbGFzcyBzdHJ1Y3QgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9NT0RVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBhbiBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVuY3Rpb24gbmVlZHMgICAgICovCi0gIC8qICAgIHRvIGJlIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB3aGVyZSB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSBpcyAgICAgICAqLwotICAvKiAgICByZXR1cm5lZC4gIEFuZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgYSBgZGVzdHJveScgZnVuY3Rpb24gICAgKi8KLSAgLyogICAgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBmdGluaXQuYycgKGZ0X2NyZWF0ZV9kZWZhdWx0X21vZHVsZV9jbGFzc2VzKSBhbHJlYWR5IGNvbnRhaW5zICAgICAqLwotICAvKiAgICBhIG1lY2hhbmlzbSB0byBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbW9kdWxlcyAgICAgICAgKi8KLSAgLyogICAgZGVzY3JpYmVkIGluIGBmdG1vZHVsZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RpY2UgdGhhdCB0aGUgY3JlYXRlZCBgY3JlYXRlJyBhbmQgYGRlc3Ryb3knIGZ1bmN0aW9ucyBjYWxsICAgICAgKi8KLSAgLyogICAgYHBpY19pbml0JyBhbmQgYHBpY19mcmVlJyB0byBhbGxvdyB5b3UgdG8gbWFudWFsbHkgYWxsb2NhdGUgYW5kICAgICovCi0gIC8qICAgIGluaXRpYWxpemUgYW55IGFkZGl0aW9uYWwgZ2xvYmFsIGRhdGEsIGxpa2UgYSBtb2R1bGUgc3BlY2lmaWMgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UsIGFuZCBwdXQgdGhlbSBpbiB0aGUgZ2xvYmFsIHBpYyBjb250YWluZXIgZGVmaW5lZCBpbiAgICAgKi8KLSAgLyogICAgYGZ0cGljLmgnLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlbSBqdXN0IGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIGFzICovCi0gIC8qICAgIGVtcHR5IHRvIHJlc29sdmUgdGhlIGxpbmsgZXJyb3IuICBBbHNvIHRoZSBgcGljX2luaXQnIGFuZCAgICAgICAgICAqLwotICAvKiAgICBgcGljX2ZyZWUnIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gYHBpYy5oJywgdG8gYmUgcmVmZXJyZWQgKi8KLSAgLyogICAgYnkgdGhlIG1vZHVsZSBkZWZpbml0aW9uIGNhbGxpbmcgYEZUX0RFRklORV9NT0RVTEUnIGluIHRoZSAgICAgICAgICovCi0gIC8qICAgIGZvbGxvd2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLwotICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfUk9PVF9NT0RVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgYW4gRlRfTW9kdWxlX0NsYXNzIHN0cnVjdCBpbnNpZGUgKi8KLSAgLyogICAgYW5vdGhlciBzdHJ1Y3QgdGhhdCBjb250YWlucyBpdCBvciBpbiBhIGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgICovCi0gIC8qICAgIHRoYXQgY29udGFpbmluZyBzdHJ1Y3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUNMQVJFX01PRFVMRSggY2xhc3NfICkgIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IEZUX01vZHVsZV9DbGFzcyAgY2xhc3NfOwotCi0jZGVmaW5lIEZUX0RFRklORV9ST09UX01PRFVMRSggIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgXAotICB9LAotCi0jZGVmaW5lIEZUX0RFRklORV9NT0RVTEUoICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICAgIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAgICAgICAgICBcCi0gIGNvbnN0IEZUX01vZHVsZV9DbGFzcyBjbGFzc18gPSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgIFwKLSAgfTsKLQotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfTU9EVUxFKCBjbGFzc18gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgb3V0cHV0X2NsYXNzICk7ICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKTsKLQotI2RlZmluZSBGVF9ERUZJTkVfUk9PVF9NT0RVTEUoICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfZmxhZ3MgICAgID0gZmxhZ3NfOyAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX3NpemUgICAgICA9IHNpemVfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9uYW1lICAgICAgPSBuYW1lXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfdmVyc2lvbiAgID0gdmVyc2lvbl87ICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX3JlcXVpcmVzICA9IHJlcXVpcmVzXzsgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfaW50ZXJmYWNlID0gaW50ZXJmYWNlXzsgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9pbml0ICAgICAgPSBpbml0XzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfZG9uZSAgICAgID0gZG9uZV87ICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QuZ2V0X2ludGVyZmFjZSAgICA9IGdldF9pbnRlcmZhY2VfOwotCi0jZGVmaW5lIEZUX0RFRklORV9NT0RVTEUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5IG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhc3NfICMjIF9waWNfZnJlZSggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICkgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVycm9yID0gY2xhc3NfICMjIF9waWNfaW5pdCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9mbGFncyAgICAgPSBmbGFnc187ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX3NpemUgICAgICA9IHNpemVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfbmFtZSAgICAgID0gbmFtZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV92ZXJzaW9uICAgPSB2ZXJzaW9uXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX3JlcXVpcmVzICA9IHJlcXVpcmVzXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9pbnRlcmZhY2UgPSBpbnRlcmZhY2VfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfaW5pdCAgICAgID0gaW5pdF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9kb25lICAgICAgPSBkb25lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2ludGVyZmFjZSAgICA9IGdldF9pbnRlcmZhY2VfOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRPQkpTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cGljLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDNlZDIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHBpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIChkZWNsYXJhdGlvbikuICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBNb2R1bGVzIHRoYXQgb3JkaW5hcmlseSBoYXZlIGNvbnN0IGdsb2JhbCBkYXRhIHRoYXQgbmVlZCBhZGRyZXNzICAgICAqLwotICAvKiAgY2FuIGluc3RlYWQgZGVmaW5lIHBvaW50ZXJzIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRQSUNfSF8KLSNkZWZpbmUgRlRQSUNfSF8KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1BJQ19Db250YWluZXJfCi0gIHsKLSAgICAvKiBwaWMgY29udGFpbmVycyBmb3IgYmFzZSAqLwotICAgIHZvaWQqICBiYXNlOwotCi0gICAgLyogcGljIGNvbnRhaW5lcnMgZm9yIG1vZHVsZXMgKi8KLSAgICB2b2lkKiAgYXV0b2ZpdDsKLSAgICB2b2lkKiAgY2ZmOwotICAgIHZvaWQqICBwc2hpbnRlcjsKLSAgICB2b2lkKiAgcHNuYW1lczsKLSAgICB2b2lkKiAgcmFzdGVyOwotICAgIHZvaWQqICBzZm50OwotICAgIHZvaWQqICBzbW9vdGg7Ci0gICAgdm9pZCogIHRydWV0eXBlOwotCi0gIH0gRlRfUElDX0NvbnRhaW5lcjsKLQotCi0gIC8qIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgZnVuY3Rpb24gdGFibGVzLCBzdHJ1Y3RzLCBldGMuICovCi0gIC8qIHN0b3JlZCBpbiB0aGUgY29udGFpbmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgZnRfcGljX2NvbnRhaW5lcl9pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLQotICAvKiBEZXN0cm95IHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyLiAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfcGljX2NvbnRhaW5lcl9kZXN0cm95KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRQSUNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTQ0YTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyZm9yay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEVtYmVkZGVkIHJlc291cmNlIGZvcmtzIGFjY2Vzc29yIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8gYW5kIFJlZGhhdCBLLksuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERldmVsb3BtZW50IG9mIHRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBzdXBwb3J0IG9mICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbmZvcm1hdGlvbi10ZWNobm9sb2d5IFByb21vdGlvbiBBZ2VuY3ksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUUkZPUktfSF8KLSNkZWZpbmUgRlRSRk9SS19IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiBOdW1iZXIgb2YgZ3Vlc3NpbmcgcnVsZXMgc3VwcG9ydGVkIGluIGBGVF9SYWNjZXNzX0d1ZXNzJy4gICAgICAgICAgICAqLwotICAvKiBEb24ndCBmb3JnZXQgdG8gaW5jcmVtZW50IHRoZSBudW1iZXIgaWYgeW91IGFkZCBhIG5ldyBndWVzc2luZyBydWxlLiAqLwotI2RlZmluZSBGVF9SQUNDRVNTX05fUlVMRVMgIDkKLQotCi0gIC8qIEEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgcmVmZXJlbmNlIGluIGEgcmVzb3VyY2UgYnkgaXRzIHJlc291cmNlIElEICovCi0gIC8qIGFuZCBpbnRlcm5hbCBvZmZzZXQuICBUaGUgYFBPU1QnIHJlc291cmNlIGV4cGVjdHMgdG8gYmUgY29uY2F0ZW5hdGVkICovCi0gIC8qIGJ5IHRoZSBvcmRlciBvZiByZXNvdXJjZSBJRHMgaW5zdGVhZCBvZiBpdHMgYXBwZWFyYW5jZSBpbiB0aGUgZmlsZS4gICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1JGb3JrX1JlZl8KLSAgewotICAgIEZUX1Nob3J0ICByZXNfaWQ7Ci0gICAgRlRfTG9uZyAgIG9mZnNldDsKLQotICB9IEZUX1JGb3JrX1JlZjsKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqZnRfcmFjY2Vzc19ndWVzc19mdW5jKSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgdHlwZWRlZiBlbnVtICBGVF9SRm9ya19SdWxlXyB7Ci0gICAgRlRfUkZvcmtfUnVsZV9pbnZhbGlkID0gLTIsCi0gICAgRlRfUkZvcmtfUnVsZV91a25vd24sIC8qIC0xICovCi0gICAgRlRfUkZvcmtfUnVsZV9hcHBsZV9kb3VibGUsCi0gICAgRlRfUkZvcmtfUnVsZV9hcHBsZV9zaW5nbGUsCi0gICAgRlRfUkZvcmtfUnVsZV9kYXJ3aW5fdWZzX2V4cG9ydCwKLSAgICBGVF9SRm9ya19SdWxlX2Rhcndpbl9uZXd2ZnMsCi0gICAgRlRfUkZvcmtfUnVsZV9kYXJ3aW5faGZzcGx1cywKLSAgICBGVF9SRm9ya19SdWxlX3ZmYXQsCi0gICAgRlRfUkZvcmtfUnVsZV9saW51eF9jYXAsCi0gICAgRlRfUkZvcmtfUnVsZV9saW51eF9kb3VibGUsCi0gICAgRlRfUkZvcmtfUnVsZV9saW51eF9uZXRhdGFsawotICB9IEZUX1JGb3JrX1J1bGU7Ci0KLSAgLyogRm9yIGZhc3QgdHJhbnNsYXRpb24gYmV0d2VlbiBydWxlIGluZGV4IGFuZCBydWxlIHR5cGUsCi0gICAqIHRoZSBtYWNyb3MgRlRfUkZPUktfeHh4IHNob3VsZCBiZSBrZXB0IGNvbnNpc3RlbnQgd2l0aAotICAgKiB0aGUgcmFjY2Vzc19ndWVzc19mdW5jcyB0YWJsZQotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgZnRfcmFjY2Vzc19ndWVzc19yZWNfIHsKLSAgICBmdF9yYWNjZXNzX2d1ZXNzX2Z1bmMgIGZ1bmM7Ci0gICAgRlRfUkZvcmtfUnVsZSAgICAgICAgICB0eXBlOwotICB9IGZ0X3JhY2Nlc3NfZ3Vlc3NfcmVjOwotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyogdGhpcyBhcnJheSBpcyBhIHN0b3JhZ2UgaW4gbm9uLVBJQyBtb2RlLCBzbyA7IGlzIG5lZWRlZCBpbiBFTkQgKi8KLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9CRUdJTiggbmFtZSwgdHlwZSApICBcCi0gICAgICAgICAgc3RhdGljIGNvbnN0IHR5cGUgbmFtZVtdID0gewotI2RlZmluZSBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKCBmdW5jX3N1ZmZpeCwgdHlwZV9zdWZmaXggKSAgXAotICAgICAgICAgIHsgcmFjY2Vzc19ndWVzc18gIyMgZnVuY19zdWZmaXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfUkZvcmtfUnVsZV8gIyMgdHlwZV9zdWZmaXggfSwKLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTkQgIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogdGhpcyBhcnJheSBpcyBhIGZ1bmN0aW9uIGluIFBJQyBtb2RlLCBzbyBubyA7IGlzIG5lZWRlZCBpbiBFTkQgKi8KLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9CRUdJTiggbmFtZSwgdHlwZSApICBcCi0gICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0luaXRfVGFibGVfICMjIG5hbWUoIHR5cGUqICBzdG9yYWdlICkgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB0eXBlKiAgbG9jYWwgPSBzdG9yYWdlOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpbnQgIGkgPSAwOwotI2RlZmluZSBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKCBmdW5jX3N1ZmZpeCwgdHlwZV9zdWZmaXggKSAgXAotICAgICAgICAgIGxvY2FsW2ldLmZ1bmMgPSByYWNjZXNzX2d1ZXNzXyAjIyBmdW5jX3N1ZmZpeDsgICAgICAgICAgICAgXAotICAgICAgICAgIGxvY2FsW2ldLnR5cGUgPSBGVF9SRm9ya19SdWxlXyAjIyB0eXBlX3N1ZmZpeDsgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsKLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTkQgIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYWNjZXNzX0d1ZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHdWVzcyBhIGZpbGUgbmFtZSBhbmQgb2Zmc2V0IHdoZXJlIHRoZSBhY3R1YWwgcmVzb3VyY2UgZm9yayBpcyAgICAgKi8KLSAgLyogICAgc3RvcmVkLiAgVGhlIG1hY3JvIEZUX1JBQ0NFU1NfTl9SVUxFUyBob2xkcyB0aGUgbnVtYmVyIG9mICAgICAgICAgICovCi0gIC8qICAgIGd1ZXNzaW5nIHJ1bGVzOyAgdGhlIGd1ZXNzZWQgcmVzdWx0IGZvciB0aGUgTnRoIHJ1bGUgaXMgICAgICAgICAgICAqLwotICAvKiAgICByZXByZXNlbnRlZCBhcyBhIHRyaXBsZXQ6IGEgbmV3IGZpbGUgbmFtZSAobmV3X25hbWVzW05dKSwgYSBmaWxlICAgKi8KLSAgLyogICAgb2Zmc2V0IChvZmZzZXRzW05dKSwgYW5kIGFuIGVycm9yIGNvZGUgKGVycm9yc1tOXSkuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBmaWxlIHN0cmVhbSBjb250YWluaW5nIHRoZSByZXNvdXJjZSBmb3JrLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9uYW1lIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIChiYXNlKSBmaWxlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZvcmsgdXNlZCBmb3Igc29tZSAgICAgICAgICAqLwotICAvKiAgICAgIGd1ZXNzaW5nIHJ1bGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXdfbmFtZXMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiBhcnJheSBvZiBndWVzc2VkIGZpbGUgbmFtZXMgaW4gd2hpY2ggdGhlIHJlc291cmNlIGZvcmtzIG1heSAgICovCi0gIC8qICAgICAgZXhpc3QuICBJZiBgbmV3X25hbWVzW05dJyBpcyBOVUxMLCB0aGUgZ3Vlc3NlZCBmaWxlIG5hbWUgaXMgICAgICAqLwotICAvKiAgICAgIGVxdWFsIHRvIGBiYXNlX25hbWUnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIGFycmF5IG9mIGd1ZXNzZWQgZmlsZSBvZmZzZXRzLiAgYG9mZnNldHNbTl0nIGhvbGRzIHRoZSBmaWxlICAgKi8KLSAgLyogICAgICBvZmZzZXQgb2YgdGhlIHBvc3NpYmxlIHN0YXJ0IG9mIHRoZSByZXNvdXJjZSBmb3JrIGluIGZpbGUgICAgICAgICovCi0gIC8qICAgICAgYG5ld19uYW1lc1tOXScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXJyb3JzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gYXJyYXkgb2YgRnJlZVR5cGUgZXJyb3IgY29kZXMuICBgZXJyb3JzW05dJyBpcyB0aGUgZXJyb3IgICAgICAqLwotICAvKiAgICAgIGNvZGUgb2YgTnRoIGd1ZXNzaW5nIHJ1bGUgZnVuY3Rpb24uICBJZiBgZXJyb3JzW05dJyBpcyBub3QgICAgICAgKi8KLSAgLyogICAgICBGVF9FcnJfT2ssIGBuZXdfbmFtZXNbTl0nIGFuZCBgb2Zmc2V0c1tOXScgYXJlIG1lYW5pbmdsZXNzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfUmFjY2Vzc19HdWVzcyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICBiYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqKiAgICAgIG5ld19uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICAgZXJyb3JzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGhlYWRlciBvZiByZXNvdXJjZSBmb3JrLiAgVGhlICAgICAgICAgKi8KLSAgLyogICAgaW5mb3JtYXRpb24gaW5jbHVkZXMgdGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBtYXAgICAgICAgICovCi0gIC8qICAgIHN0YXJ0cywgYW5kIHRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAqLwotICAvKiAgICBgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMnIHJlcXVpcmVzIHRoZXNlIHR3byBkYXRhLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGZpbGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIGZvcmsuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZm9ya19vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGZvcmsgc3RhcnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFwX29mZnNldCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBtYXAgc3RhcnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmRhdGFfcG9zIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBkYXRhIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICBGVF9FcnJfT2sgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIHJmb3JrX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqbWFwX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmRhdGFfcG9zICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGRhdGEgb2Zmc2V0cyBmb3IgYSB0YWcgaW4gYSByZXNvdXJjZSBmb3JrLiAgT2Zmc2V0cyBhcmUgICAgKi8KLSAgLyogICAgc3RvcmVkIGluIGFuIGFycmF5IGJlY2F1c2UsIGluIHNvbWUgY2FzZXMsIHJlc291cmNlcyBpbiBhIHJlc291cmNlICovCi0gIC8qICAgIGZvcmsgaGF2ZSB0aGUgc2FtZSB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgZmlsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzb3VyY2UgZm9yay4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hcF9vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJkYXRhX3BvcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSByZXNvdXJjZSB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNvcnRfYnlfcmVzX2lkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgQm9vbGVhbiB0byBzb3J0IHRoZSBmcmFnbWVudGVkIHJlc291cmNlIGJ5IHRoZWlyIGlkcy4gICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZnJhZ21lbnRlZCByZXNvdXJjZXMgZm9yIGBQT1NUJyByZXNvdXJjZSBzaG91bGQgYmUgc29ydGVkICAgICovCi0gIC8qICAgICAgdG8gcmVzdG9yZSBUeXBlMSBmb250IHByb3Blcmx5LiAgRm9yIGBzZm50JyByZXNvdXJjZXMsIHNvcnRpbmcgICAqLwotICAvKiAgICAgIG1heSBpbmR1Y2UgYSBkaWZmZXJlbnQgb3JkZXIgb2YgdGhlIGZhY2VzIGluIGNvbXBhcmlzb24gdG8gdGhhdCAgKi8KLSAgLyogICAgICBieSBRdWlja0RyYXcgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHN0cmVhbSBvZmZzZXRzIGZvciB0aGUgcmVzb3VyY2UgZGF0YSBzcGVjaWZpZWQgYnkgYHRhZycuICAgICAqLwotICAvKiAgICAgIFRoaXMgYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiwgc28geW91IGhhdmUgdG8gY2FsbCAgICAgKi8KLSAgLyogICAgICBAZnRfbWVtX2ZyZWUgYWZ0ZXIgdXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbGVuZ3RoIG9mIG9mZnNldHMgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIEZUX0Vycl9PayBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm9ybWFsbHkgeW91IHNob3VsZCB1c2UgYEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8nIHRvIGdldCB0aGUgICAgICovCi0gIC8qICAgIHZhbHVlIGZvciBgbWFwX29mZnNldCcgYW5kIGByZGF0YV9wb3MnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIG1hcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZGF0YV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBzb3J0X2J5X3Jlc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAqKm9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpjb3VudCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUUkZPUktfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWVmOWNhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzZXJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBFYWNoIG1vZHVsZSBjYW4gZXhwb3J0IG9uZSBvciBtb3JlIGBzZXJ2aWNlcycuICBFYWNoIHNlcnZpY2UgaXMgICAgICAqLwotICAvKiAgaWRlbnRpZmllZCBieSBhIGNvbnN0YW50IHN0cmluZyBhbmQgbW9kZWxlZCBieSBhIHBvaW50ZXI7IHRoZSBsYXR0ZXIgKi8KLSAgLyogIGdlbmVyYWxseSBjb3JyZXNwb25kcyB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIGZ1bmN0aW9uIHBvaW50ZXJzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgTm90ZSB0aGF0IGEgc2VydmljZSdzIGRhdGEgY2Fubm90IGJlIGEgbWVyZSBmdW5jdGlvbiBwb2ludGVyIGJlY2F1c2UgKi8KLSAgLyogIGluIEMgaXQgaXMgcG9zc2libGUgdGhhdCBmdW5jdGlvbiBwb2ludGVycyBtaWdodCBiZSBpbXBsZW1lbnRlZCAgICAgICovCi0gIC8qICBkaWZmZXJlbnRseSB0aGFuIGRhdGEgcG9pbnRlcnMgKGUuZy4gNDggYml0cyBpbnN0ZWFkIG9mIDMyKS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVFNFUlZfSF8KLSNkZWZpbmUgRlRTRVJWX0hfCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbG9vayB1cCBhIHNlcnZpY2UgZnJvbSBhIGZhY2UncyBkcml2ZXIgbW9kdWxlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogICBpZCA6OgotICAgKiAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmljZSBhcyBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlJ3MKLSAgICogICAgIGhlYWRlciBmaWxlcyAoZS5nLiBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgd2hpY2ggZXhwYW5kcyB0bwotICAgKiAgICAgYG11bHRpLW1hc3RlcnMnKS4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aAotICAgKiAgICAgYEZUX1NFUlZJQ0VfSURfJy4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBwdHIgOjoKLSAgICogICAgIEEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgc2VydmljZSBwb2ludGVyLiAgV2lsbCBiZSBOVUxMCi0gICAqICAgICBpZiBub3QgZm91bmQuCi0gICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgICBtb2R1bGUgPSBGVF9NT0RVTEUoIEZUX0ZBQ0UoIGZhY2UgKS0+ZHJpdmVyICk7ICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICAgX3RtcF8gID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciogIF9wcHRyXyA9IChGVF9Qb2ludGVyKikmKHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgX3RtcF8gPSBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkICk7IFwKLSAgICAqX3BwdHJfID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZWxzZSAvKiAhQysrICovCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgIG1vZHVsZSA9IEZUX01PRFVMRSggRlRfRkFDRSggZmFjZSApLT5kcml2ZXIgKTsgICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICBfdG1wXyAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIF90bXBfID0gbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggbW9kdWxlLCBGVF9TRVJWSUNFX0lEXyAjIyBpZCApOyBcCi0gICAgcHRyID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2VuZGlmIC8qICFDKysgKi8KLQotCi0gIC8qCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBsb29rIHVwIGEgc2VydmljZSBmcm9tIGFsbCBtb2R1bGVzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogICBpZCA6OgotICAgKiAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmljZSBhcyBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlJ3MKLSAgICogICAgIGhlYWRlciBmaWxlcyAoZS5nLiBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgd2hpY2ggZXhwYW5kcyB0bwotICAgKiAgICAgYG11bHRpLW1hc3RlcnMnKS4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aAotICAgKiAgICAgYEZUX1NFUlZJQ0VfSURfJy4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBwdHIgOjoKLSAgICogICAgIEEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgc2VydmljZSBwb2ludGVyLiAgV2lsbCBiZSBOVUxMCi0gICAqICAgICBpZiBub3QgZm91bmQuCi0gICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgICBtb2R1bGUgPSBGVF9NT0RVTEUoIEZUX0ZBQ0UoIGZhY2UgKS0+ZHJpdmVyICk7ICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICAgX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciogIF9wcHRyXyA9IChGVF9Qb2ludGVyKikmKHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX3RtcF8gPSBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIG1vZHVsZSwgRlRfU0VSVklDRV9JRF8gIyMgaWQsIDEgKTsgXAotICAgICpfcHB0cl8gPSBfdG1wXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLSNlbHNlIC8qICFDKysgKi8KLQotI2RlZmluZSBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTW9kdWxlICAgbW9kdWxlID0gRlRfTU9EVUxFKCBGVF9GQUNFKCBmYWNlICktPmRyaXZlciApOyAgICAgICAgXAotICAgIEZUX1BvaW50ZXIgIF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF90bXBfID0gZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkLCAxICk7IFwKLSAgICBwdHIgICA9IF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZW5kaWYgLyogIUMrKyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgUyBFIFIgViBJIEMgRSAgIEQgRSBTIEMgUiBJIFAgVCBPIFIgUyAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoKLSAgICogIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gX2Rlc2NyaWJlXyBhIGdpdmVuIHNlcnZpY2UKLSAgICogIHRvIHRoZSBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgdG8gYnVpbGQgc2ltcGxlIHN0YXRpYyBzZXJ2aWNlIGxpc3RzLgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NlcnZpY2VEZXNjUmVjXwotICB7Ci0gICAgY29uc3QgY2hhciogIHNlcnZfaWQ7ICAgICAvKiBzZXJ2aWNlIG5hbWUgICAgICAgICAqLwotICAgIGNvbnN0IHZvaWQqICBzZXJ2X2RhdGE7ICAgLyogc2VydmljZSBwb2ludGVyL2RhdGEgKi8KLQotICB9IEZUX1NlcnZpY2VEZXNjUmVjOwotCi0gIHR5cGVkZWYgY29uc3QgRlRfU2VydmljZURlc2NSZWMqICBGVF9TZXJ2aWNlRGVzYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gYXJyYXkgb2YgRlRfU2VydmljZURlc2NSZWMgc3RydWN0dXJlcy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhIGBjcmVhdGUnIGZ1bmN0aW9uIG5lZWRzIHRvICAqLwotICAvKiAgICBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdG8gcmV0dXJuIGFuIGFsbG9jYXRlZCBhcnJheS4gIEFzIHNvb24gYXMgKi8KLSAgLyogICAgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYSBgZGVzdHJveScgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIHRvICovCi0gIC8qICAgIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBtYW51YWxseSBjYWxsZWQgZnJvbSB0aGUgYHBpY19pbml0JyBhbmQgICovCi0gIC8qICAgIGBwaWNfZnJlZScgZnVuY3Rpb25zIG9mIHlvdXIgbW9kdWxlIChzZWUgRlRfREVGSU5FX01PRFVMRSkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgYXJyYXkgd2lsbCBiZSAgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvIGlzICAgICAqLwotICAvKiAgICB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMSggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMyKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNCggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNiggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNywgc2Vydl9kYXRhXzcgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzcsIHNlcnZfZGF0YV83IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM4KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF83LCBzZXJ2X2RhdGFfNywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfOCwgc2Vydl9kYXRhXzggKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzcsIHNlcnZfZGF0YV83IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF84LCBzZXJ2X2RhdGFfOCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDOSggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNywgc2Vydl9kYXRhXzcsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzgsIHNlcnZfZGF0YV84LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF85LCBzZXJ2X2RhdGFfOSApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNywgc2Vydl9kYXRhXzcgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzgsIHNlcnZfZGF0YV84IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF85LCBzZXJ2X2RhdGFfOSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMSggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogMiApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzIoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiAzICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMzKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDQgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNCggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogNSApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9pZCAgID0gc2Vydl9pZF80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzUoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA2ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfaWQgICA9IHNlcnZfaWRfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM2KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82ICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MpICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDcgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9pZCAgID0gc2Vydl9pZF81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzZdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els2XS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNywgc2Vydl9kYXRhXzcgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcykgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogOCApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9pZCAgID0gc2Vydl9pZF80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfaWQgICA9IHNlcnZfaWRfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNl0uc2Vydl9pZCAgID0gc2Vydl9pZF83OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzZdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV83OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els3XS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbN10uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzgoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzcsIHNlcnZfZGF0YV83LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF84LCBzZXJ2X2RhdGFfOCApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzKSAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA5ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfaWQgICA9IHNlcnZfaWRfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9pZCAgID0gc2Vydl9pZF82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els2XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzddLnNlcnZfaWQgICA9IHNlcnZfaWRfODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els3XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbOF0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzhdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM5KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF83LCBzZXJ2X2RhdGFfNywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfOCwgc2Vydl9kYXRhXzgsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzksIHNlcnZfZGF0YV85ICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MpICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDEwICkgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9pZCAgID0gc2Vydl9pZF81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzZdLnNlcnZfaWQgICA9IHNlcnZfaWRfNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els2XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbN10uc2Vydl9pZCAgID0gc2Vydl9pZF84OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzddLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV84OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els4XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbOF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzldLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els5XS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyoKLSAgICogIFBhcnNlIGEgbGlzdCBvZiBGVF9TZXJ2aWNlRGVzY1JlYyBkZXNjcmlwdG9ycyBhbmQgbG9vayBmb3IKLSAgICogIGEgc3BlY2lmaWMgc2VydmljZSBieSBJRC4gIE5vdGUgdGhhdCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZQotICAgKiAgYXJyYXkgbXVzdCBiZSB7IE5VTEwsIE5VTEwgfSwgYW5kIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZAotICAgKiAgcmV0dXJuIE5VTEwgaWYgdGhlIHNlcnZpY2UgaXNuJ3QgYXZhaWxhYmxlLgotICAgKgotICAgKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBtb2R1bGVzIHRvIGltcGxlbWVudCB0aGVpcgotICAgKiAgYGdldF9zZXJ2aWNlJyBtZXRob2QuCi0gICAqLwotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfc2VydmljZV9saXN0X2xvb2t1cCggRlRfU2VydmljZURlc2MgIHNlcnZpY2VfZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICBzZXJ2aWNlX2lkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgUyBFIFIgViBJIEMgRSBTICAgQyBBIEMgSCBFICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSBhIGNhY2hlIGZvciBzZXZlcmFsIGZyZXF1ZW50bHkgdXNlZAotICAgKiAgc2VydmljZXMuICBJdCBpcyB0aGUgdHlwZSBvZiBgZmFjZS0+aW50ZXJuYWwtPnNlcnZpY2VzJy4gIFlvdQotICAgKiAgc2hvdWxkIG9ubHkgdXNlIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UgdG8gYWNjZXNzIGl0LgotICAgKgotICAgKiAgQWxsIGZpZWxkcyBzaG91bGQgaGF2ZSB0aGUgdHlwZSBGVF9Qb2ludGVyIHRvIHJlbGF4IGNvbXBpbGF0aW9uCi0gICAqICBkZXBlbmRlbmNpZXMuICBXZSBhc3N1bWUgdGhlIGRldmVsb3BlciBpc24ndCBjb21wbGV0ZWx5IHN0dXBpZC4KLSAgICoKLSAgICogIEVhY2ggZmllbGQgbXVzdCBiZSBuYW1lZCBgc2VydmljZV9YWFhYJyB3aGVyZSBgWFhYJyBjb3JyZXNwb25kcyB0bwotICAgKiAgdGhlIGNvcnJlY3QgRlRfU0VSVklDRV9JRF9YWFhYIG1hY3JvLiAgU2VlIHRoZSBkZWZpbml0aW9uIG9mCi0gICAqICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFIGJlbG93IGhvdyB0aGlzIGlzIGltcGxlbWVudGVkLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NlcnZpY2VDYWNoZVJlY18KLSAgewotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfUE9TVFNDUklQVF9GT05UX05BTUU7Ci0gICAgRlRfUG9pbnRlciAgc2VydmljZV9NVUxUSV9NQVNURVJTOwotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfTUVUUklDU19WQVJJQVRJT05TOwotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfR0xZUEhfRElDVDsKLSAgICBGVF9Qb2ludGVyICBzZXJ2aWNlX1BGUl9NRVRSSUNTOwotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfV0lORk5UOwotCi0gIH0gRlRfU2VydmljZUNhY2hlUmVjLCAqRlRfU2VydmljZUNhY2hlOwotCi0KLSAgLyoKLSAgICogIEEgbWFnaWMgbnVtYmVyIHVzZWQgd2l0aGluIHRoZSBzZXJ2aWNlcyBjYWNoZS4KLSAgICovCi0KLSAgLyogZW5zdXJlIHRoYXQgdmFsdWUgYDEnIGhhcyB0aGUgc2FtZSB3aWR0aCBhcyBhIHBvaW50ZXIgKi8KLSNkZWZpbmUgRlRfU0VSVklDRV9VTkFWQUlMQUJMRSAgKChGVF9Qb2ludGVyKX4oRlRfUHRyRGlzdCkxKQotCi0KLSAgLyoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBsb29rIHVwIGEgc2VydmljZSBmcm9tIGEgZmFjZSdzIGRyaXZlciBtb2R1bGUKLSAgICogICB1c2luZyBpdHMgY2FjaGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBmYWNlOjoKLSAgICogICAgIFRoZSBzb3VyY2UgZmFjZSBoYW5kbGUgY29udGFpbmluZyB0aGUgY2FjaGUuCi0gICAqCi0gICAqICAgZmllbGQgOjoKLSAgICogICAgIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBjYWNoZS4KLSAgICoKLSAgICogICBpZCA6OgotICAgKiAgICAgVGhlIHNlcnZpY2UgSUQuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgcHRyIDo6Ci0gICAqICAgICBBIHZhcmlhYmxlIHJlY2VpdmluZyB0aGUgc2VydmljZSBkYXRhLiAgTlVMTCBpZiBub3QgYXZhaWxhYmxlLgotICAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0jZGVmaW5lIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciAgIHN2YzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciogIFBwdHIgPSAoRlRfUG9pbnRlciopJihwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ZjID0gRlRfRkFDRSggZmFjZSApLT5pbnRlcm5hbC0+c2VydmljZXMuIHNlcnZpY2VfICMjIGlkOyBcCi0gICAgaWYgKCBzdmMgPT0gRlRfU0VSVklDRV9VTkFWQUlMQUJMRSApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBzdmMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAoIHN2YyA9PSBOVUxMICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc3ZjLCBpZCApOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GQUNFKCBmYWNlICktPmludGVybmFsLT5zZXJ2aWNlcy4gc2VydmljZV8gIyMgaWQgPSAgICBcCi0gICAgICAgIChGVF9Qb2ludGVyKSggc3ZjICE9IE5VTEwgPyBzdmMgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9TRVJWSUNFX1VOQVZBSUxBQkxFICk7ICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKlBwdHIgPSBzdmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZWxzZSAvKiAhQysrICovCi0KLSNkZWZpbmUgRlRfRkFDRV9MT09LVVBfU0VSVklDRSggZmFjZSwgcHRyLCBpZCApICAgICAgICAgICAgICAgIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICBzdmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdmMgPSBGVF9GQUNFKCBmYWNlICktPmludGVybmFsLT5zZXJ2aWNlcy4gc2VydmljZV8gIyMgaWQ7IFwKLSAgICBpZiAoIHN2YyA9PSBGVF9TRVJWSUNFX1VOQVZBSUxBQkxFICkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHN2YyA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmICggc3ZjID09IE5VTEwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzdmMsIGlkICk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZBQ0UoIGZhY2UgKS0+aW50ZXJuYWwtPnNlcnZpY2VzLiBzZXJ2aWNlXyAjIyBpZCA9ICAgIFwKLSAgICAgICAgKEZUX1BvaW50ZXIpKCBzdmMgIT0gTlVMTCA/IHN2YyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX1NFUlZJQ0VfVU5BVkFJTEFCTEUgKTsgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwdHIgPSBzdmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLSNlbmRpZiAvKiAhQysrICovCi0KLSAgLyoKLSAgICogIEEgbWFjcm8gdXNlZCB0byBkZWZpbmUgbmV3IHNlcnZpY2Ugc3RydWN0dXJlIHR5cGVzLgotICAgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRSggbmFtZSApICAgICAgICAgICAgXAotICB0eXBlZGVmIHN0cnVjdCBGVF9TZXJ2aWNlXyAjIyBuYW1lICMjIFJlY18gXAotICAgIEZUX1NlcnZpY2VfICMjIG5hbWUgIyMgUmVjIDsgICAgICAgICAgICAgXAotICB0eXBlZGVmIHN0cnVjdCBGVF9TZXJ2aWNlXyAjIyBuYW1lICMjIFJlY18gXAotICAgIGNvbnN0ICogRlRfU2VydmljZV8gIyMgbmFtZSA7ICAgICAgICAgICAgXAotICBzdHJ1Y3QgRlRfU2VydmljZV8gIyMgbmFtZSAjIyBSZWNfCi0KLSAgLyogKi8KLQotICAvKgotICAgKiAgVGhlIGhlYWRlciBmaWxlcyBjb250YWluaW5nIHRoZSBzZXJ2aWNlcy4KLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9CREZfSCAgICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9DSURfSCAgICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0ggICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9HWF9WQUxJREFURV9IICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX0tFUk5JTkdfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmtlcm4uaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSCA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0ggICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oPgotI2RlZmluZSBGVF9TRVJWSUNFX09QRU5UWVBFX1ZBTElEQVRFX0ggIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUEZSX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cGZyLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19IICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0ggICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0ggICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19IICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHJvcC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1NGTlRfSCAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9UUlVFVFlQRV9FTkdJTkVfSCAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1RUX0NNQVBfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1dJTkZOVF9IICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0ggICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSCAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oPgotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRTRVJWX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMmMwN2IuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3RyZWFtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTdHJlYW0gaGFuZGxpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVFNUUkVBTV9IXwotI2RlZmluZSBGVFNUUkVBTV9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogZm9ybWF0IG9mIGFuIDgtYml0IGZyYW1lX29wIHZhbHVlOiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYml0ICA3NjU0MzIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB4eHh4eHhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogcyBpcyBzZXQgdG8gMSBpZiB0aGUgdmFsdWUgaXMgc2lnbmVkLiAgICAgICAgKi8KLSAgLyogZSBpcyBzZXQgdG8gMSBpZiB0aGUgdmFsdWUgaXMgbGl0dGxlLWVuZGlhbi4gKi8KLSAgLyogeHh4IGlzIGEgY29tbWFuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBGVF9GUkFNRV9PUF9TSElGVCAgICAgICAgIDIKLSNkZWZpbmUgRlRfRlJBTUVfT1BfU0lHTkVEICAgICAgICAxCi0jZGVmaW5lIEZUX0ZSQU1FX09QX0xJVFRMRSAgICAgICAgMgotI2RlZmluZSBGVF9GUkFNRV9PUF9DT01NQU5EKCB4ICkgICggeCA+PiBGVF9GUkFNRV9PUF9TSElGVCApCi0KLSNkZWZpbmUgRlRfTUFLRV9GUkFNRV9PUCggY29tbWFuZCwgbGl0dGxlLCBzaWduICkgXAotICAgICAgICAgICggKCBjb21tYW5kIDw8IEZUX0ZSQU1FX09QX1NISUZUICkgfCAoIGxpdHRsZSA8PCAxICkgfCBzaWduICkKLQotI2RlZmluZSBGVF9GUkFNRV9PUF9FTkQgICAgMAotI2RlZmluZSBGVF9GUkFNRV9PUF9TVEFSVCAgMSAgLyogc3RhcnQgYSBuZXcgZnJhbWUgICAgICovCi0jZGVmaW5lIEZUX0ZSQU1FX09QX0JZVEUgICAyICAvKiByZWFkIDEtYnl0ZSB2YWx1ZSAgICAgKi8KLSNkZWZpbmUgRlRfRlJBTUVfT1BfU0hPUlQgIDMgIC8qIHJlYWQgMi1ieXRlIHZhbHVlICAgICAqLwotI2RlZmluZSBGVF9GUkFNRV9PUF9MT05HICAgNCAgLyogcmVhZCA0LWJ5dGUgdmFsdWUgICAgICovCi0jZGVmaW5lIEZUX0ZSQU1FX09QX09GRjMgICA1ICAvKiByZWFkIDMtYnl0ZSB2YWx1ZSAgICAgKi8KLSNkZWZpbmUgRlRfRlJBTUVfT1BfQllURVMgIDYgIC8qIHJlYWQgYSBieXRlcyBzZXF1ZW5jZSAqLwotCi0KLSAgdHlwZWRlZiBlbnVtICBGVF9GcmFtZV9PcF8KLSAgewotICAgIGZ0X2ZyYW1lX2VuZCAgICAgICA9IDAsCi0gICAgZnRfZnJhbWVfc3RhcnQgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU1RBUlQsIDAsIDAgKSwKLQotICAgIGZ0X2ZyYW1lX2J5dGUgICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0JZVEUsICAwLCAwICksCi0gICAgZnRfZnJhbWVfc2NoYXIgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfQllURSwgIDAsIDEgKSwKLQotICAgIGZ0X2ZyYW1lX3VzaG9ydF9iZSA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NIT1JULCAwLCAwICksCi0gICAgZnRfZnJhbWVfc2hvcnRfYmUgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU0hPUlQsIDAsIDEgKSwKLSAgICBmdF9mcmFtZV91c2hvcnRfbGUgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9TSE9SVCwgMSwgMCApLAotICAgIGZ0X2ZyYW1lX3Nob3J0X2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NIT1JULCAxLCAxICksCi0KLSAgICBmdF9mcmFtZV91bG9uZ19iZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9MT05HLCAwLCAwICksCi0gICAgZnRfZnJhbWVfbG9uZ19iZSAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfTE9ORywgMCwgMSApLAotICAgIGZ0X2ZyYW1lX3Vsb25nX2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0xPTkcsIDEsIDAgKSwKLSAgICBmdF9mcmFtZV9sb25nX2xlICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9MT05HLCAxLCAxICksCi0KLSAgICBmdF9mcmFtZV91b2ZmM19iZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9PRkYzLCAwLCAwICksCi0gICAgZnRfZnJhbWVfb2ZmM19iZSAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfT0ZGMywgMCwgMSApLAotICAgIGZ0X2ZyYW1lX3VvZmYzX2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX09GRjMsIDEsIDAgKSwKLSAgICBmdF9mcmFtZV9vZmYzX2xlICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9PRkYzLCAxLCAxICksCi0KLSAgICBmdF9mcmFtZV9ieXRlcyAgICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9CWVRFUywgMCwgMCApLAotICAgIGZ0X2ZyYW1lX3NraXAgICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0JZVEVTLCAwLCAxICkKLQotICB9IEZUX0ZyYW1lX09wOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ZyYW1lX0ZpZWxkXwotICB7Ci0gICAgRlRfQnl0ZSAgICB2YWx1ZTsKLSAgICBGVF9CeXRlICAgIHNpemU7Ci0gICAgRlRfVVNob3J0ICBvZmZzZXQ7Ci0KLSAgfSBGVF9GcmFtZV9GaWVsZDsKLQotCi0gIC8qIENvbnN0cnVjdCBhbiBGVF9GcmFtZV9GaWVsZCBvdXQgb2YgYSBzdHJ1Y3R1cmUgdHlwZSBhbmQgYSBmaWVsZCBuYW1lLiAqLwotICAvKiBUaGUgc3RydWN0dXJlIHR5cGUgbXVzdCBiZSBzZXQgaW4gdGhlIEZUX1NUUlVDVFVSRSBtYWNybyBiZWZvcmUgICAgICAgKi8KLSAgLyogY2FsbGluZyB0aGUgRlRfRlJBTUVfU1RBUlQoKSBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9GSUVMRF9TSVpFKCBmICkgXAotICAgICAgICAgIChGVF9CeXRlKXNpemVvZiAoICgoRlRfU1RSVUNUVVJFKikwKS0+ZiApCi0KLSNkZWZpbmUgRlRfRklFTERfU0laRV9ERUxUQSggZiApIFwKLSAgICAgICAgICAoRlRfQnl0ZSlzaXplb2YgKCAoKEZUX1NUUlVDVFVSRSopMCktPmZbMF0gKQotCi0jZGVmaW5lIEZUX0ZJRUxEX09GRlNFVCggZiApIFwKLSAgICAgICAgICAoRlRfVVNob3J0KSggb2Zmc2V0b2YoIEZUX1NUUlVDVFVSRSwgZiApICkKLQotI2RlZmluZSBGVF9GUkFNRV9GSUVMRCggZnJhbWVfb3AsIGZpZWxkICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnJhbWVfb3AsICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRSggZmllbGQgKSwgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBmaWVsZCApICAgICAgXAotICAgICAgICAgIH0KLQotI2RlZmluZSBGVF9NQUtFX0VNUFRZX0ZJRUxEKCBmcmFtZV9vcCApICB7IGZyYW1lX29wLCAwLCAwIH0KLQotI2RlZmluZSBGVF9GUkFNRV9TVEFSVCggc2l6ZSApICAgeyBmdF9mcmFtZV9zdGFydCwgMCwgc2l6ZSB9Ci0jZGVmaW5lIEZUX0ZSQU1FX0VORCAgICAgICAgICAgICB7IGZ0X2ZyYW1lX2VuZCwgMCwgMCB9Ci0KLSNkZWZpbmUgRlRfRlJBTUVfTE9ORyggZiApICAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9sb25nX2JlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfVUxPTkcoIGYgKSAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91bG9uZ19iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1NIT1JUKCBmICkgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfc2hvcnRfYmUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9VU0hPUlQoIGYgKSAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3VzaG9ydF9iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX09GRjMoIGYgKSAgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfb2ZmM19iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1VPRkYzKCBmICkgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdW9mZjNfYmUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9CWVRFKCBmICkgICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX2J5dGUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9DSEFSKCBmICkgICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3NjaGFyLCBmICkKLQotI2RlZmluZSBGVF9GUkFNRV9MT05HX0xFKCBmICkgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX2xvbmdfbGUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9VTE9OR19MRSggZiApICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3Vsb25nX2xlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfU0hPUlRfTEUoIGYgKSAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9zaG9ydF9sZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1VTSE9SVF9MRSggZiApICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdXNob3J0X2xlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfT0ZGM19MRSggZiApICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9vZmYzX2xlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfVU9GRjNfTEUoIGYgKSAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91b2ZmM19sZSwgZiApCi0KLSNkZWZpbmUgRlRfRlJBTUVfU0tJUF9MT05HICAgICAgIHsgZnRfZnJhbWVfbG9uZ19iZSwgMCwgMCB9Ci0jZGVmaW5lIEZUX0ZSQU1FX1NLSVBfU0hPUlQgICAgICB7IGZ0X2ZyYW1lX3Nob3J0X2JlLCAwLCAwIH0KLSNkZWZpbmUgRlRfRlJBTUVfU0tJUF9CWVRFICAgICAgIHsgZnRfZnJhbWVfYnl0ZSwgMCwgMCB9Ci0KLSNkZWZpbmUgRlRfRlJBTUVfQllURVMoIGZpZWxkLCBjb3VudCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZ0X2ZyYW1lX2J5dGVzLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvdW50LCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggZmllbGQgKSAgIFwKLSAgICAgICAgICB9Ci0KLSNkZWZpbmUgRlRfRlJBTUVfU0tJUF9CWVRFUyggY291bnQgKSAgeyBmdF9mcmFtZV9za2lwLCBjb3VudCwgMCB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEludGVnZXIgZXh0cmFjdGlvbiBtYWNyb3MgLS0gdGhlIGBidWZmZXInIHBhcmFtZXRlciBtdXN0IEFMV0FZUyBiZSBvZiAqLwotICAvKiB0eXBlIGBjaGFyKicgb3IgZXF1aXZhbGVudCAoMS1ieXRlIGVsZW1lbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgRlRfQllURV8oIHAsIGkgKSAgKCAoKGNvbnN0IEZUX0J5dGUqKShwKSlbKGkpXSApCi0KLSNkZWZpbmUgRlRfSU5UMTYoIHggKSAgICggKEZUX0ludDE2KSh4KSAgKQotI2RlZmluZSBGVF9VSU5UMTYoIHggKSAgKCAoRlRfVUludDE2KSh4KSApCi0jZGVmaW5lIEZUX0lOVDMyKCB4ICkgICAoIChGVF9JbnQzMikoeCkgICkKLSNkZWZpbmUgRlRfVUlOVDMyKCB4ICkgICggKEZUX1VJbnQzMikoeCkgKQotCi0KLSNkZWZpbmUgRlRfQllURV9VMTYoIHAsIGksIHMgKSAgKCBGVF9VSU5UMTYoIEZUX0JZVEVfKCBwLCBpICkgKSA8PCAocykgKQotI2RlZmluZSBGVF9CWVRFX1UzMiggcCwgaSwgcyApICAoIEZUX1VJTlQzMiggRlRfQllURV8oIHAsIGkgKSApIDw8IChzKSApCi0KLQotI2RlZmluZSBGVF9QRUVLX1NIT1JUKCBwICkgIEZUX0lOVDE2KCBGVF9CWVRFX1UxNiggcCwgMCwgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTE2KCBwLCAxLCAwKSApCi0KLSNkZWZpbmUgRlRfUEVFS19VU0hPUlQoIHAgKSAgRlRfVUlOVDE2KCBGVF9CWVRFX1UxNiggcCwgMCwgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTE2KCBwLCAxLCAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfTE9ORyggcCApICBGVF9JTlQzMiggRlRfQllURV9VMzIoIHAsIDAsIDI0ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDMsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVUxPTkcoIHAgKSAgRlRfVUlOVDMyKCBGVF9CWVRFX1UzMiggcCwgMCwgMjQgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMywgIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19PRkYzKCBwICkgIEZUX0lOVDMyKCBGVF9CWVRFX1UzMiggcCwgMCwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19VT0ZGMyggcCApICBGVF9VSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAwLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19TSE9SVF9MRSggcCApICBGVF9JTlQxNiggRlRfQllURV9VMTYoIHAsIDEsIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMTYoIHAsIDAsIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19VU0hPUlRfTEUoIHAgKSAgRlRfVUlOVDE2KCBGVF9CWVRFX1UxNiggcCwgMSwgOCApIHwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UxNiggcCwgMCwgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX0xPTkdfTEUoIHAgKSAgRlRfSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAzLCAyNCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAyLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAwLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX1VMT05HX0xFKCBwICkgIEZUX1VJTlQzMiggRlRfQllURV9VMzIoIHAsIDMsIDI0ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDAsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfT0ZGM19MRSggcCApICBGVF9JTlQzMiggRlRfQllURV9VMzIoIHAsIDIsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDAsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVU9GRjNfTEUoIHAgKSAgRlRfVUlOVDMyKCBGVF9CWVRFX1UzMiggcCwgMiwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDAsICAwICkgKQotCi0KLSNkZWZpbmUgRlRfTkVYVF9DSEFSKCBidWZmZXIgKSAgICAgICBcCi0gICAgICAgICAgKCAoc2lnbmVkIGNoYXIpKmJ1ZmZlcisrICkKLQotI2RlZmluZSBGVF9ORVhUX0JZVEUoIGJ1ZmZlciApICAgICAgICAgXAotICAgICAgICAgICggKHVuc2lnbmVkIGNoYXIpKmJ1ZmZlcisrICkKLQotI2RlZmluZSBGVF9ORVhUX1NIT1JUKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHNob3J0KSggYnVmZmVyICs9IDIsIEZUX1BFRUtfU0hPUlQoIGJ1ZmZlciAtIDIgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX1VTSE9SVCggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBzaG9ydCkoIGJ1ZmZlciArPSAyLCBGVF9QRUVLX1VTSE9SVCggYnVmZmVyIC0gMiApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfT0ZGMyggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKGxvbmcpKCBidWZmZXIgKz0gMywgRlRfUEVFS19PRkYzKCBidWZmZXIgLSAzICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9VT0ZGMyggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpKCBidWZmZXIgKz0gMywgRlRfUEVFS19VT0ZGMyggYnVmZmVyIC0gMyApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfTE9ORyggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKGxvbmcpKCBidWZmZXIgKz0gNCwgRlRfUEVFS19MT05HKCBidWZmZXIgLSA0ICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9VTE9ORyggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpKCBidWZmZXIgKz0gNCwgRlRfUEVFS19VTE9ORyggYnVmZmVyIC0gNCApICkgKQotCi0KLSNkZWZpbmUgRlRfTkVYVF9TSE9SVF9MRSggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChzaG9ydCkoIGJ1ZmZlciArPSAyLCBGVF9QRUVLX1NIT1JUX0xFKCBidWZmZXIgLSAyICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9VU0hPUlRfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgc2hvcnQpKCBidWZmZXIgKz0gMiwgRlRfUEVFS19VU0hPUlRfTEUoIGJ1ZmZlciAtIDIgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX09GRjNfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChsb25nKSggYnVmZmVyICs9IDMsIEZUX1BFRUtfT0ZGM19MRSggYnVmZmVyIC0gMyApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVU9GRjNfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDMsIEZUX1BFRUtfVU9GRjNfTEUoIGJ1ZmZlciAtIDMgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX0xPTkdfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfTE9OR19MRSggYnVmZmVyIC0gNCApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVUxPTkdfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfVUxPTkdfTEUoIGJ1ZmZlciAtIDQgKSApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRWFjaCBHRVRfeHh4eCgpIG1hY3JvIHVzZXMgYW4gaW1wbGljaXQgYHN0cmVhbScgdmFyaWFibGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIDAKLSNkZWZpbmUgRlRfR0VUX01BQ1JPKCB0eXBlICkgICAgRlRfTkVYVF8gIyMgdHlwZSAoIHN0cmVhbS0+Y3Vyc29yICkKLQotI2RlZmluZSBGVF9HRVRfQ0hBUigpICAgICAgIEZUX0dFVF9NQUNSTyggQ0hBUiApCi0jZGVmaW5lIEZUX0dFVF9CWVRFKCkgICAgICAgRlRfR0VUX01BQ1JPKCBCWVRFICkKLSNkZWZpbmUgRlRfR0VUX1NIT1JUKCkgICAgICBGVF9HRVRfTUFDUk8oIFNIT1JUICkKLSNkZWZpbmUgRlRfR0VUX1VTSE9SVCgpICAgICBGVF9HRVRfTUFDUk8oIFVTSE9SVCApCi0jZGVmaW5lIEZUX0dFVF9PRkYzKCkgICAgICAgRlRfR0VUX01BQ1JPKCBPRkYzICkKLSNkZWZpbmUgRlRfR0VUX1VPRkYzKCkgICAgICBGVF9HRVRfTUFDUk8oIFVPRkYzICkKLSNkZWZpbmUgRlRfR0VUX0xPTkcoKSAgICAgICBGVF9HRVRfTUFDUk8oIExPTkcgKQotI2RlZmluZSBGVF9HRVRfVUxPTkcoKSAgICAgIEZUX0dFVF9NQUNSTyggVUxPTkcgKQotI2RlZmluZSBGVF9HRVRfVEFHNCgpICAgICAgIEZUX0dFVF9NQUNSTyggVUxPTkcgKQotCi0jZGVmaW5lIEZUX0dFVF9TSE9SVF9MRSgpICAgRlRfR0VUX01BQ1JPKCBTSE9SVF9MRSApCi0jZGVmaW5lIEZUX0dFVF9VU0hPUlRfTEUoKSAgRlRfR0VUX01BQ1JPKCBVU0hPUlRfTEUgKQotI2RlZmluZSBGVF9HRVRfTE9OR19MRSgpICAgIEZUX0dFVF9NQUNSTyggTE9OR19MRSApCi0jZGVmaW5lIEZUX0dFVF9VTE9OR19MRSgpICAgRlRfR0VUX01BQ1JPKCBVTE9OR19MRSApCi0KLSNlbHNlCi0jZGVmaW5lIEZUX0dFVF9NQUNSTyggZnVuYywgdHlwZSApICAgICAgICAoICh0eXBlKWZ1bmMoIHN0cmVhbSApICkKLQotI2RlZmluZSBGVF9HRVRfQ0hBUigpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldENoYXIsIEZUX0NoYXIgKQotI2RlZmluZSBGVF9HRVRfQllURSgpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldENoYXIsIEZUX0J5dGUgKQotI2RlZmluZSBGVF9HRVRfU0hPUlQoKSAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVTaG9ydCwgRlRfU2hvcnQgKQotI2RlZmluZSBGVF9HRVRfVVNIT1JUKCkgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVTaG9ydCwgRlRfVVNob3J0ICkKLSNkZWZpbmUgRlRfR0VUX09GRjMoKSAgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVT2Zmc2V0LCBGVF9Mb25nICkKLSNkZWZpbmUgRlRfR0VUX1VPRkYzKCkgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVT2Zmc2V0LCBGVF9VTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9MT05HKCkgICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmcsIEZUX0xvbmcgKQotI2RlZmluZSBGVF9HRVRfVUxPTkcoKSAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVMb25nLCBGVF9VTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9UQUc0KCkgICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmcsIEZUX1VMb25nICkKLQotI2RlZmluZSBGVF9HRVRfU0hPUlRfTEUoKSAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVTaG9ydExFLCBGVF9TaG9ydCApCi0jZGVmaW5lIEZUX0dFVF9VU0hPUlRfTEUoKSAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VVNob3J0TEUsIEZUX1VTaG9ydCApCi0jZGVmaW5lIEZUX0dFVF9MT05HX0xFKCkgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmdMRSwgRlRfTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9VTE9OR19MRSgpICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmdMRSwgRlRfVUxvbmcgKQotI2VuZGlmCi0KLSNkZWZpbmUgRlRfUkVBRF9NQUNSTyggZnVuYywgdHlwZSwgdmFyICkgICAgICAgIFwKLSAgICAgICAgICAoIHZhciA9ICh0eXBlKWZ1bmMoIHN0cmVhbSwgJmVycm9yICksIFwKLSAgICAgICAgICAgIGVycm9yICE9IEZUX0Vycl9PayApCi0KLSNkZWZpbmUgRlRfUkVBRF9CWVRFKCB2YXIgKSAgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZENoYXIsIEZUX0J5dGUsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfQ0hBUiggdmFyICkgICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRDaGFyLCBGVF9DaGFyLCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX1NIT1JUKCB2YXIgKSAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVVNob3J0LCBGVF9TaG9ydCwgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9VU0hPUlQoIHZhciApICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVTaG9ydCwgRlRfVVNob3J0LCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX09GRjMoIHZhciApICAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVU9mZnNldCwgRlRfTG9uZywgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9VT0ZGMyggdmFyICkgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVPZmZzZXQsIEZUX1VMb25nLCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX0xPTkcoIHZhciApICAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVUxvbmcsIEZUX0xvbmcsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVUxPTkcoIHZhciApICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVTG9uZywgRlRfVUxvbmcsIHZhciApCi0KLSNkZWZpbmUgRlRfUkVBRF9TSE9SVF9MRSggdmFyICkgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVTaG9ydExFLCBGVF9TaG9ydCwgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9VU0hPUlRfTEUoIHZhciApICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVTaG9ydExFLCBGVF9VU2hvcnQsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfTE9OR19MRSggdmFyICkgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVTG9uZ0xFLCBGVF9Mb25nLCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX1VMT05HX0xFKCB2YXIgKSAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVUxvbmdMRSwgRlRfVUxvbmcsIHZhciApCi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNCi0KLSAgLyogaW5pdGlhbGl6ZSBhIHN0cmVhbSBmb3IgcmVhZGluZyBhIHJlZ3VsYXIgc3lzdGVtIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9PcGVuKCBGVF9TdHJlYW0gICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApOwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTSAqLwotCi0KLSAgLyogY3JlYXRlIGEgbmV3IChpbnB1dCkgc3RyZWFtIGZyb20gYW4gRlRfT3Blbl9BcmdzIHN0cnVjdHVyZSAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9OZXcoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyogIGFyZ3MsCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgKmFzdHJlYW0gKTsKLQotICAvKiBmcmVlIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9TdHJlYW1fRnJlZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGV4dGVybmFsICk7Ci0KLSAgLyogaW5pdGlhbGl6ZSBhIHN0cmVhbSBmb3IgcmVhZGluZyBpbi1tZW1vcnkgZGF0YSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU3RyZWFtX09wZW5NZW1vcnkoIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBzaXplICk7Ci0KLSAgLyogY2xvc2UgYSBzdHJlYW0gKGRvZXMgbm90IGRlc3Ryb3kgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUpICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9TdHJlYW1fQ2xvc2UoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICAvKiBzZWVrIHdpdGhpbiBhIHN0cmVhbS4gcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gc3RhcnQgb2Ygc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1NlZWsoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MgKTsKLQotICAvKiBza2lwIGJ5dGVzIGluIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1NraXAoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBkaXN0YW5jZSApOwotCi0gIC8qIHJldHVybiBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9Qb3MoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgLyogcmVhZCBieXRlcyBmcm9tIGEgc3RyZWFtIGludG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIsIHJldHVybnMgYW4gKi8KLSAgLyogZXJyb3IgaWYgbm90IGFsbCBieXRlcyBjb3VsZCBiZSByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fUmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiByZWFkIGJ5dGVzIGZyb20gYSBzdHJlYW0gYXQgYSBnaXZlbiBwb3NpdGlvbiAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcywKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiB0cnkgdG8gcmVhZCBieXRlcyBhdCB0aGUgZW5kIG9mIGEgc3RyZWFtOyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzICovCi0gIC8qIHJlYWxseSBhdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fVHJ5UmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiBFbnRlciBhIGZyYW1lIG9mIGBjb3VudCcgY29uc2VjdXRpdmUgYnl0ZXMgaW4gYSBzdHJlYW0uICBSZXR1cm5zIGFuICovCi0gIC8qIGVycm9yIGlmIHRoZSBmcmFtZSBjb3VsZCBub3QgYmUgcmVhZC9hY2Nlc3NlZC4gIFRoZSBjYWxsZXIgY2FuIHVzZSAgKi8KLSAgLyogdGhlIEZUX1N0cmVhbV9HZXRfWFhYIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBmcmFtZSBkYXRhIHdpdGhvdXQgICAgICAqLwotICAvKiBlcnJvciBjaGVja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWW91IG11c3QgX2Fsd2F5c18gY2FsbCBGVF9TdHJlYW1fRXhpdEZyYW1lKCkgb25jZSB5b3UgaGF2ZSBlbnRlcmVkICAqLwotICAvKiBhIHN0cmVhbSBmcmFtZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fRW50ZXJGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICk7Ci0KLSAgLyogZXhpdCBhIHN0cmVhbSBmcmFtZSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU3RyZWFtX0V4aXRGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiBFeHRyYWN0IGEgc3RyZWFtIGZyYW1lLiAgSWYgdGhlIHN0cmVhbSBpcyBkaXNrLWJhc2VkLCBhIGhlYXAgYmxvY2sgKi8KLSAgLyogaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgYnl0ZXMgYXJlIHJlYWQgaW50byBpdC4gIElmIHRoZSBzdHJlYW0gICovCi0gIC8qIGlzIG1lbW9yeS1iYXNlZCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgc2V0IGEgcG9pbnRlciB0byB0aGUgZGF0YS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXNlZnVsIHRvIG9wdGltaXplIGFjY2VzcyB0byBtZW1vcnktYmFzZWQgc3RyZWFtcyB0cmFuc3BhcmVudGx5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGwgZXh0cmFjdGVkIGZyYW1lcyBtdXN0IGJlIGBmcmVlZCcgd2l0aCBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uICAgKi8KLSAgLyogRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApOwotCi0gIC8qIHJlbGVhc2UgYW4gZXh0cmFjdCBmcmFtZSAoc2VlIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUpICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMgKTsKLQotICAvKiByZWFkIGEgYnl0ZSBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KLSAgRlRfQkFTRSggRlRfQ2hhciApCi0gIEZUX1N0cmVhbV9HZXRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAxNi1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fR2V0VVNob3J0KCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAyNC1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVT2Zmc2V0KCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAzMi1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVTG9uZyggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiByZWFkIGEgMTYtYml0IGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KLSAgRlRfQkFTRSggRlRfVVNob3J0ICkKLSAgRlRfU3RyZWFtX0dldFVTaG9ydExFKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgLyogcmVhZCBhIGJ5dGUgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9DaGFyICkKLSAgRlRfU3RyZWFtX1JlYWRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogcmVhZCBhIDE2LWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fUmVhZFVTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogcmVhZCBhIDI0LWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9SZWFkVU9mZnNldCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOwotCi0gIC8qIHJlYWQgYSAzMi1iaXQgYmlnLWVuZGlhbiBpbnRlZ2VyIGZyb20gYSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fUmVhZFVMb25nKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOwotCi0gIC8qIHJlYWQgYSAxNi1iaXQgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfVVNob3J0ICkKLSAgRlRfU3RyZWFtX1JlYWRVU2hvcnRMRSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLQotICAvKiByZWFkIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1JlYWRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogUmVhZCBhIHN0cnVjdHVyZSBmcm9tIGEgc3RyZWFtLiAgVGhlIHN0cnVjdHVyZSBtdXN0IGJlIGRlc2NyaWJlZCAqLwotICAvKiBieSBhbiBhcnJheSBvZiBGVF9GcmFtZV9GaWVsZCByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1JlYWRGaWVsZHMoIEZUX1N0cmVhbSAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfRnJhbWVfRmllbGQqICBmaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSApOwotCi0KLSNkZWZpbmUgRlRfU1RSRUFNX1BPUygpICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU3RyZWFtX1Bvcyggc3RyZWFtICkKLQotI2RlZmluZSBGVF9TVFJFQU1fU0VFSyggcG9zaXRpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpKHBvc2l0aW9uKSApICkKLQotI2RlZmluZSBGVF9TVFJFQU1fU0tJUCggZGlzdGFuY2UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1N0cmVhbV9Ta2lwKCBzdHJlYW0sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGRpc3RhbmNlKSApICkKLQotI2RlZmluZSBGVF9TVFJFQU1fUkVBRCggYnVmZmVyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopKGJ1ZmZlciksICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoY291bnQpICkgKQotCi0jZGVmaW5lIEZUX1NUUkVBTV9SRUFEX0FUKCBwb3NpdGlvbiwgYnVmZmVyLCBjb3VudCApICAgICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggRlRfU3RyZWFtX1JlYWRBdCggc3RyZWFtLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykocG9zaXRpb24pLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopKGJ1ZmZlciksICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShjb3VudCkgKSApCi0KLSNkZWZpbmUgRlRfU1RSRUFNX1JFQURfRklFTERTKCBmaWVsZHMsIG9iamVjdCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fUmVhZEZpZWxkcyggc3RyZWFtLCBmaWVsZHMsIG9iamVjdCApICkKLQotCi0jZGVmaW5lIEZUX0ZSQU1FX0VOVEVSKCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0RFQlVHX0lOTkVSKCBGVF9TdHJlYW1fRW50ZXJGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoc2l6ZSkgKSApICkKLQotI2RlZmluZSBGVF9GUkFNRV9FWElUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX0V4aXRGcmFtZSggc3RyZWFtICkgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX0VYVFJBQ1QoIHNpemUsIGJ5dGVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShzaXplKSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKikmKGJ5dGVzKSApICkgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX1JFTEVBU0UoIGJ5dGVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKSYoYnl0ZXMpICkgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUU1RSRUFNX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWY1ZmM5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHJhY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcmFjaW5nIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBkZWZpbml0aW9ucyBvZiB0cmFjZSBsZXZlbHMgZm9yIEZyZWVUeXBlIDIgKi8KLQotICAvKiB0aGUgZmlyc3QgbGV2ZWwgbXVzdCBhbHdheXMgYmUgYHRyYWNlX2FueScgKi8KLUZUX1RSQUNFX0RFRiggYW55ICkKLQotICAvKiBiYXNlIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggY2FsYyApICAgICAgLyogY2FsY3VsYXRpb25zICAgICAgICAgICAgKGZ0Y2FsYy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIG1lbW9yeSApICAgIC8qIG1lbW9yeSBtYW5hZ2VyICAgICAgICAgIChmdG9ianMuYykgICAqLwotRlRfVFJBQ0VfREVGKCBzdHJlYW0gKSAgICAvKiBzdHJlYW0gbWFuYWdlciAgICAgICAgICAoZnRzdHJlYW0uYykgKi8KLUZUX1RSQUNFX0RFRiggaW8gKSAgICAgICAgLyogaS9vIGludGVyZmFjZSAgICAgICAgICAgKGZ0c3lzdGVtLmMpICovCi1GVF9UUkFDRV9ERUYoIGxpc3QgKSAgICAgIC8qIGxpc3QgbWFuYWdlbWVudCAgICAgICAgIChmdGxpc3QuYykgICAqLwotRlRfVFJBQ0VfREVGKCBpbml0ICkgICAgICAvKiBpbml0aWFsaXphdGlvbiAgICAgICAgICAoZnRpbml0LmMpICAgKi8KLUZUX1RSQUNFX0RFRiggb2JqcyApICAgICAgLyogYmFzZSBvYmplY3RzICAgICAgICAgICAgKGZ0b2Jqcy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIG91dGxpbmUgKSAgIC8qIG91dGxpbmUgbWFuYWdlbWVudCAgICAgIChmdG91dGxuLmMpICAqLwotRlRfVFJBQ0VfREVGKCBnbHlwaCApICAgICAvKiBnbHlwaCBtYW5hZ2VtZW50ICAgICAgICAoZnRnbHlwaC5jKSAgKi8KLUZUX1RSQUNFX0RFRiggZ2xvYWRlciApICAgLyogZ2x5cGggbG9hZGVyICAgICAgICAgICAgKGZ0Z2xvYWRyLmMpICovCi0KLUZUX1RSQUNFX0RFRiggcmFzdGVyICkgICAgLyogbW9ub2Nocm9tZSByYXN0ZXJpemVyICAgKGZ0cmFzdGVyLmMpICovCi1GVF9UUkFDRV9ERUYoIHNtb290aCApICAgIC8qIGFudGktYWxpYXNpbmcgcmFzdGVyICAgIChmdGdyYXlzLmMpICAqLwotRlRfVFJBQ0VfREVGKCBtbSApICAgICAgICAvKiBNTSBpbnRlcmZhY2UgICAgICAgICAgICAoZnRtbS5jKSAgICAgKi8KLUZUX1RSQUNFX0RFRiggcmFjY2VzcyApICAgLyogcmVzb3VyY2UgZm9yayBhY2Nlc3NvciAgKGZ0cmZvcmsuYykgICovCi1GVF9UUkFDRV9ERUYoIHN5bnRoICkgICAgIC8qIGJvbGQvc2xhbnQgc3ludGhlc2l6ZXIgIChmdHN5bnRoLmMpICAqLwotRlRfVFJBQ0VfREVGKCBiaXRtYXAgKSAgICAvKiBiaXRtYXAgY2hlY2tzdW0gICAgICAgICAoZnRvYmpzLmMpICAgKi8KLQotICAvKiBDYWNoZSBzdWItc3lzdGVtICovCi1GVF9UUkFDRV9ERUYoIGNhY2hlICkgICAgIC8qIGNhY2hlIHN1Yi1zeXN0ZW0gICAgICAgIChmdGNhY2hlLmMsIGV0Yy4pICovCi0KLSAgLyogU0ZOVCBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBzZmRyaXZlciApICAvKiBTRk5UIGZvbnQgZHJpdmVyICAgICAgICAoc2Zkcml2ZXIuYykgKi8KLUZUX1RSQUNFX0RFRiggc2ZvYmpzICkgICAgLyogU0ZOVCBvYmplY3QgaGFuZGxlciAgICAgKHNmb2Jqcy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0Y21hcCApICAgIC8qIGNoYXJtYXAgaGFuZGxlciAgICAgICAgICh0dGNtYXAuYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dGtlcm4gKSAgICAvKiBrZXJuaW5nIGhhbmRsZXIgICAgICAgICAodHRrZXJuLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRsb2FkICkgICAgLyogYmFzaWMgVHJ1ZVR5cGUgdGFibGVzICAgKHR0bG9hZC5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0bXR4ICkgICAgIC8qIG1ldHJpY3MtcmVsYXRlZCB0YWJsZXMgICh0dG10eC5jKSAgICAqLwotRlRfVFJBQ0VfREVGKCB0dHBvc3QgKSAgICAvKiBQUyB0YWJsZSBwcm9jZXNzaW5nICAgICAodHRwb3N0LmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRzYml0ICkgICAgLyogVHJ1ZVR5cGUgc2JpdCBoYW5kbGluZyAgKHR0c2JpdC5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0YmRmICkgICAgIC8qIFRydWVUeXBlIGVtYmVkZGVkIEJERiAgICh0dGJkZi5jKSAgICAqLwotCi0gIC8qIFRydWVUeXBlIGRyaXZlciBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIHR0ZHJpdmVyICkgIC8qIFRUIGZvbnQgZHJpdmVyICAgICAgICAgICh0dGRyaXZlci5jKSAqLwotRlRfVFJBQ0VfREVGKCB0dGdsb2FkICkgICAvKiBUVCBnbHlwaCBsb2FkZXIgICAgICAgICAodHRnbG9hZC5jKSAgKi8KLUZUX1RSQUNFX0RFRiggdHRpbnRlcnAgKSAgLyogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgICAgKHR0aW50ZXJwLmMpICovCi1GVF9UUkFDRV9ERUYoIHR0b2JqcyApICAgIC8qIFRUIG9iamVjdHMgbWFuYWdlciAgICAgICh0dG9ianMuYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dHBsb2FkICkgICAvKiBUVCBkYXRhL3Byb2dyYW0gbG9hZGVyICAodHRwbG9hZC5jKSAgKi8KLUZUX1RSQUNFX0RFRiggdHRneHZhciApICAgLyogVHJ1ZVR5cGUgR1ggdmFyIGhhbmRsZXIgKHR0Z3h2YXIuYykgICovCi0KLSAgLyogVHlwZSAxIGRyaXZlciBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIHQxYWZtICkKLUZUX1RSQUNFX0RFRiggdDFkcml2ZXIgKQotRlRfVFJBQ0VfREVGKCB0MWdsb2FkICkKLUZUX1RSQUNFX0RFRiggdDFoaW50ICkKLUZUX1RSQUNFX0RFRiggdDFsb2FkICkKLUZUX1RSQUNFX0RFRiggdDFvYmpzICkKLUZUX1RSQUNFX0RFRiggdDFwYXJzZSApCi0KLSAgLyogUG9zdFNjcmlwdCBoZWxwZXIgbW9kdWxlIGBwc2F1eCcgKi8KLUZUX1RSQUNFX0RFRiggdDFkZWNvZGUgKQotRlRfVFJBQ0VfREVGKCBwc29ianMgKQotRlRfVFJBQ0VfREVGKCBwc2NvbnYgKQotCi0gIC8qIFBvc3RTY3JpcHQgaGludGluZyBtb2R1bGUgYHBzaGludGVyJyAqLwotRlRfVFJBQ0VfREVGKCBwc2hyZWMgKQotRlRfVFJBQ0VfREVGKCBwc2hhbGdvMSApCi1GVF9UUkFDRV9ERUYoIHBzaGFsZ28yICkKLQotICAvKiBUeXBlIDIgZHJpdmVyIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggY2ZmZHJpdmVyICkKLUZUX1RSQUNFX0RFRiggY2ZmZ2xvYWQgKQotRlRfVFJBQ0VfREVGKCBjZmZsb2FkICkKLUZUX1RSQUNFX0RFRiggY2Zmb2JqcyApCi1GVF9UUkFDRV9ERUYoIGNmZnBhcnNlICkKLQotRlRfVFJBQ0VfREVGKCBjZjJibHVlcyApCi1GVF9UUkFDRV9ERUYoIGNmMmhpbnRzICkKLUZUX1RSQUNFX0RFRiggY2YyaW50ZXJwICkKLQotICAvKiBUeXBlIDQyIGRyaXZlciBjb21wb25lbnQgKi8KLUZUX1RSQUNFX0RFRiggdDQyICkKLQotICAvKiBDSUQgZHJpdmVyIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggY2lkYWZtICkKLUZUX1RSQUNFX0RFRiggY2lkZHJpdmVyICkKLUZUX1RSQUNFX0RFRiggY2lkZ2xvYWQgKQotRlRfVFJBQ0VfREVGKCBjaWRsb2FkICkKLUZUX1RSQUNFX0RFRiggY2lkb2JqcyApCi1GVF9UUkFDRV9ERUYoIGNpZHBhcnNlICkKLQotICAvKiBXaW5kb3dzIGZvbnQgY29tcG9uZW50ICovCi1GVF9UUkFDRV9ERUYoIHdpbmZudCApCi0KLSAgLyogUENGIGZvbnQgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBwY2Zkcml2ZXIgKQotRlRfVFJBQ0VfREVGKCBwY2ZyZWFkICkKLQotICAvKiBCREYgZm9udCBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIGJkZmRyaXZlciApCi1GVF9UUkFDRV9ERUYoIGJkZmxpYiApCi0KLSAgLyogUEZSIGZvbnQgY29tcG9uZW50ICovCi1GVF9UUkFDRV9ERUYoIHBmciApCi0KLSAgLyogT3BlblR5cGUgdmFsaWRhdGlvbiBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIG90dm1vZHVsZSApCi1GVF9UUkFDRV9ERUYoIG90dmNvbW1vbiApCi1GVF9UUkFDRV9ERUYoIG90dmJhc2UgKQotRlRfVFJBQ0VfREVGKCBvdHZnZGVmICkKLUZUX1RSQUNFX0RFRiggb3R2Z3BvcyApCi1GVF9UUkFDRV9ERUYoIG90dmdzdWIgKQotRlRfVFJBQ0VfREVGKCBvdHZqc3RmICkKLUZUX1RSQUNFX0RFRiggb3R2bWF0aCApCi0KLSAgLyogVHJ1ZVR5cGVHWC9BQVQgdmFsaWRhdGlvbiBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIGd4dm1vZHVsZSApCi1GVF9UUkFDRV9ERUYoIGd4dmNvbW1vbiApCi1GVF9UUkFDRV9ERUYoIGd4dmZlYXQgKQotRlRfVFJBQ0VfREVGKCBneHZtb3J0ICkKLUZUX1RSQUNFX0RFRiggZ3h2bW9yeCApCi1GVF9UUkFDRV9ERUYoIGd4dmJzbG4gKQotRlRfVFJBQ0VfREVGKCBneHZqdXN0ICkKLUZUX1RSQUNFX0RFRiggZ3h2a2VybiApCi1GVF9UUkFDRV9ERUYoIGd4dm9wYmQgKQotRlRfVFJBQ0VfREVGKCBneHZ0cmFrICkKLUZUX1RSQUNFX0RFRiggZ3h2cHJvcCApCi1GVF9UUkFDRV9ERUYoIGd4dmxjYXIgKQotCi0gIC8qIGF1dG9maXQgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBhZm1vZHVsZSApCi1GVF9UUkFDRV9ERUYoIGFmaGludHMgKQotRlRfVFJBQ0VfREVGKCBhZmNqayApCi1GVF9UUkFDRV9ERUYoIGFmbGF0aW4gKQotRlRfVFJBQ0VfREVGKCBhZmxhdGluMiApCi1GVF9UUkFDRV9ERUYoIGFmd2FycCApCi1GVF9UUkFDRV9ERUYoIGFmc2hhcGVyICkKLUZUX1RSQUNFX0RFRiggYWZnbG9iYWwgKQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNmY3YzUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR2YWxpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHZhbGlkYXRpb24gc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUVkFMSURfSF8KLSNkZWZpbmUgRlRWQUxJRF9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0ggICAvKiBmb3IgZnRfc2V0am1wIGFuZCBmdF9sb25nam1wICovCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICBWIEEgTCBJIEQgQSBUIEkgTyBOICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogaGFuZGxlIHRvIGEgdmFsaWRhdGlvbiBvYmplY3QgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfVmFsaWRhdG9yUmVjXyB2b2xhdGlsZSogIEZUX1ZhbGlkYXRvcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlcmUgYXJlIHRocmVlIGRpc3RpbmN0IHZhbGlkYXRpb24gbGV2ZWxzIGRlZmluZWQgaGVyZTogICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9WQUxJREFURV9ERUZBVUxUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBIHRhYmxlIHRoYXQgcGFzc2VzIHRoaXMgdmFsaWRhdGlvbiBsZXZlbCBjYW4gYmUgdXNlZCByZWxpYWJseSBieSAgICovCi0gIC8qICAgRnJlZVR5cGUuICBJdCBnZW5lcmFsbHkgbWVhbnMgdGhhdCBhbGwgb2Zmc2V0cyBoYXZlIGJlZW4gY2hlY2tlZCB0byAqLwotICAvKiAgIHByZXZlbnQgb3V0LW9mLWJvdW5kIHJlYWRzLCB0aGF0IGFycmF5IGNvdW50cyBhcmUgY29ycmVjdCwgZXRjLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX1ZBTElEQVRFX1RJR0hUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEEgdGFibGUgdGhhdCBwYXNzZXMgdGhpcyB2YWxpZGF0aW9uIGxldmVsIGNhbiBiZSB1c2VkIHJlbGlhYmx5IGFuZCAgKi8KLSAgLyogICBkb2Vzbid0IGNvbnRhaW4gaW52YWxpZCBkYXRhLiAgRm9yIGV4YW1wbGUsIGEgY2hhcm1hcCB0YWJsZSB0aGF0ICAgICovCi0gIC8qICAgcmV0dXJucyBpbnZhbGlkIGdseXBoIGluZGljZXMgd2lsbCBub3QgcGFzcywgZXZlbiB0aG91Z2ggaXQgY2FuICAgICAqLwotICAvKiAgIGJlIHVzZWQgd2l0aCBGcmVlVHlwZSBpbiBkZWZhdWx0IG1vZGUgKHRoZSBsaWJyYXJ5IHdpbGwgc2ltcGx5ICAgICAgKi8KLSAgLyogICByZXR1cm4gYW4gZXJyb3IgbGF0ZXIgd2hlbiB0cnlpbmcgdG8gbG9hZCB0aGUgZ2x5cGgpLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEl0IGFsc28gY2hlY2tzIHRoYXQgZmllbGRzIHdoaWNoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyLCA0LCBvciA4LCAgKi8KLSAgLyogICBkb24ndCBoYXZlIGluY29ycmVjdCB2YWx1ZXMsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9WQUxJREFURV9QQVJBTk9JRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBPbmx5IGZvciBmb250IGRlYnVnZ2luZy4gIENoZWNrcyB0aGF0IGEgdGFibGUgZm9sbG93cyB0aGUgICAgICAgICAgICovCi0gIC8qICAgc3BlY2lmaWNhdGlvbiBieSAxMDAlLiAgVmVyeSBmZXcgZm9udHMgd2lsbCBiZSBhYmxlIHRvIHBhc3MgdGhpcyAgICAqLwotICAvKiAgIGxldmVsIGFueXdheSBidXQgaXQgY2FuIGJlIHVzZWZ1bCBmb3IgY2VydGFpbiB0b29scyBsaWtlIGZvbnQgICAgICAgKi8KLSAgLyogICBlZGl0b3JzL2NvbnZlcnRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1ZhbGlkYXRpb25MZXZlbF8KLSAgewotICAgIEZUX1ZBTElEQVRFX0RFRkFVTFQgPSAwLAotICAgIEZUX1ZBTElEQVRFX1RJR0hULAotICAgIEZUX1ZBTElEQVRFX1BBUkFOT0lECi0KLSAgfSBGVF9WYWxpZGF0aW9uTGV2ZWw7Ci0KLQotI2lmIGRlZmluZWQoIF9NU0NfVkVSICkgICAgICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAqLwotICAvKiBXZSBkaXNhYmxlIHRoZSB3YXJuaW5nIGBzdHJ1Y3R1cmUgd2FzIHBhZGRlZCBkdWUgdG8gICAqLwotICAvKiBfX2RlY2xzcGVjKGFsaWduKCkpJyBpbiBvcmRlciB0byBjb21waWxlIGNsZWFubHkgd2l0aCAqLwotICAvKiB0aGUgbWF4aW11bSBsZXZlbCBvZiB3YXJuaW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKLSNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQzMjQgKQotI2VuZGlmIC8qIF9NU0NfVkVSICovCi0KLSAgLyogdmFsaWRhdG9yIHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfVmFsaWRhdG9yUmVjXwotICB7Ci0gICAgZnRfam1wX2J1ZiAgICAgICAgICBqdW1wX2J1ZmZlcjsgLyogdXNlZCBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nICAgICAgKi8KLQotICAgIGNvbnN0IEZUX0J5dGUqICAgICAgYmFzZTsgICAgICAgIC8qIGFkZHJlc3Mgb2YgdGFibGUgaW4gbWVtb3J5ICAgICAgICovCi0gICAgY29uc3QgRlRfQnl0ZSogICAgICBsaW1pdDsgICAgICAgLyogYGJhc2UnICsgc2l6ZW9mKHRhYmxlKSBpbiBtZW1vcnkgKi8KLSAgICBGVF9WYWxpZGF0aW9uTGV2ZWwgIGxldmVsOyAgICAgICAvKiB2YWxpZGF0aW9uIGxldmVsICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgIC8qIGVycm9yIHJldHVybmVkLiAwIG1lYW5zIHN1Y2Nlc3MgICovCi0KLSAgfSBGVF9WYWxpZGF0b3JSZWM7Ci0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApCi0jcHJhZ21hIHdhcm5pbmcoIHBvcCApCi0jZW5kaWYKLQotI2RlZmluZSBGVF9WQUxJREFUT1IoIHggKSAgKCAoRlRfVmFsaWRhdG9yKSggeCApICkKLQotCi0gIEZUX0JBU0UoIHZvaWQgKQotICBmdF92YWxpZGF0b3JfaW5pdCggRlRfVmFsaWRhdG9yICAgICAgICB2YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0aW9uTGV2ZWwgIGxldmVsICk7Ci0KLSAgLyogRG8gbm90IHVzZSB0aGlzLiBJdCdzIGJyb2tlbiBhbmQgd2lsbCBjYXVzZSB5b3VyIHZhbGlkYXRvciB0byBjcmFzaCAqLwotICAvKiBpZiB5b3UgcnVuIGl0IG9uIGFuIGludmFsaWQgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0ludCApCi0gIGZ0X3ZhbGlkYXRvcl9ydW4oIEZUX1ZhbGlkYXRvciAgdmFsaWQgKTsKLQotICAvKiBTZXRzIHRoZSBlcnJvciBmaWVsZCBpbiBhIHZhbGlkYXRvciwgdGhlbiBjYWxscyBgbG9uZ2ptcCcgdG8gcmV0dXJuICovCi0gIC8qIHRvIGhpZ2gtbGV2ZWwgY2FsbGVyLiAgVXNpbmcgYHNldGptcC9sb25nam1wJyBhdm9pZHMgbWFueSBzdHVwaWQgICAgKi8KLSAgLyogZXJyb3IgY2hlY2tzIHdpdGhpbiB0aGUgdmFsaWRhdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBmdF92YWxpZGF0b3JfZXJyb3IoIEZUX1ZhbGlkYXRvciAgdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICAgICBlcnJvciApOwotCi0KLSAgLyogQ2FsbHMgZnRfdmFsaWRhdGVfZXJyb3IuICBBc3N1bWVzIHRoYXQgdGhlIGB2YWxpZCcgbG9jYWwgdmFyaWFibGUgKi8KLSAgLyogaG9sZHMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHZhbGlkYXRvciBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRCggX2Vycm9yICkgIEZUX0lOVkFMSURfKCBfZXJyb3IgKQotI2RlZmluZSBGVF9JTlZBTElEXyggX2Vycm9yICkgXAotICAgICAgICAgIGZ0X3ZhbGlkYXRvcl9lcnJvciggdmFsaWQsIEZUX1RIUk9XKCBfZXJyb3IgKSApCi0KLSAgLyogY2FsbGVkIHdoZW4gYSBicm9rZW4gdGFibGUgaXMgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRF9UT09fU0hPUlQgXAotICAgICAgICAgIEZUX0lOVkFMSUQoIEludmFsaWRfVGFibGUgKQotCi0gIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgb2Zmc2V0IGlzIGRldGVjdGVkICovCi0jZGVmaW5lIEZUX0lOVkFMSURfT0ZGU0VUIFwKLSAgICAgICAgICBGVF9JTlZBTElEKCBJbnZhbGlkX09mZnNldCApCi0KLSAgLyogY2FsbGVkIHdoZW4gYW4gaW52YWxpZCBmb3JtYXQvdmFsdWUgaXMgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRF9GT1JNQVQgXAotICAgICAgICAgIEZUX0lOVkFMSUQoIEludmFsaWRfVGFibGUgKQotCi0gIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgZ2x5cGggaW5kZXggaXMgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRF9HTFlQSF9JRCBcCi0gICAgICAgICAgRlRfSU5WQUxJRCggSW52YWxpZF9HbHlwaF9JbmRleCApCi0KLSAgLyogY2FsbGVkIHdoZW4gYW4gaW52YWxpZCBmaWVsZCB2YWx1ZSBpcyBkZXRlY3RlZCAqLwotI2RlZmluZSBGVF9JTlZBTElEX0RBVEEgXAotICAgICAgICAgIEZUX0lOVkFMSUQoIEludmFsaWRfVGFibGUgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUVkFMSURfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNDY4MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBpbnRlcm5hbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW50ZXJuYWwgaGVhZGVyIGZpbGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBieSBgZnQyYnVpbGQuaCcuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRG8gbm90IGluY2x1ZGUgaXQgbWFudWFsbHkhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX0lOVEVSTkFMX09CSkVDVFNfSCAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1BJQ19IICAgICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRwaWMuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfU1RSRUFNX0ggICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9NRU1PUllfSCAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5Lmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX0RFQlVHX0ggICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9DQUxDX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9IQVNIX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0aGFzaC5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9EUklWRVJfSCAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZHJpdmVyLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1RSQUNFX0ggICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9HTFlQSF9MT0FERVJfSCAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1NGTlRfSCAgICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0ggICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9SRk9SS19IICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfVkFMSURBVEVfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmg+Ci0KLSNkZWZpbmUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSCAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0ggICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oPgotCi0jZGVmaW5lIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0ggICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19IICAgIDxmcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmg+Ci0KLSNkZWZpbmUgRlRfSU5URVJOQUxfQVVUT0hJTlRfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oPgotCi0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICAgICAgLyogVmlzdWFsIEMrKyAoYW5kIEludGVsIEMrKykgKi8KLQotICAvKiBXZSBkaXNhYmxlIHRoZSB3YXJuaW5nIGBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50JyBoZXJlICovCi0gIC8qIGluIG9yZGVyIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoIHRoZSBtYXhpbXVtIGxldmVsIG9mIHdhcm5pbmdzLiAgKi8KLSAgLyogSW4gcGFydGljdWxhciwgdGhlIHdhcm5pbmcgY29tcGxhaW5zIGFib3V0IHN0dWZmIGxpa2UgYHdoaWxlKDApJyAqLwotICAvKiB3aGljaCBpcyB2ZXJ5IHVzZWZ1bCBpbiBtYWNybyBkZWZpbml0aW9ucy4gIFRoZXJlIGlzIG5vIGJlbmVmaXQgICovCi0gIC8qIGluIGhhdmluZyBpdCBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMjcgKQotCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1ZWIxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIFBvc3RTY3JpcHQgZm9udHMgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBQU0FVWF9IXwotI2RlZmluZSBQU0FVWF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0IFBTX1RhYmxlUmVjXyogICAgICAgICAgICAgIFBTX1RhYmxlOwotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBQU19UYWJsZV9GdW5jc1JlY18qICBQU19UYWJsZV9GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1RhYmxlX0Z1bmNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1hbmFnZSBQU19UYWJsZSBvYmplY3RzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlX2luaXQgICAgOjogVXNlZCB0byBpbml0aWFsaXplIGEgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfZG9uZSAgICA6OiBGaW5hbGl6ZXMgcmVzcC4gZGVzdHJveSBhIGdpdmVuIHRhYmxlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZV9hZGQgICAgIDo6IEFkZHMgYSBuZXcgb2JqZWN0IHRvIGEgdGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlX3JlbGVhc2UgOjogUmVsZWFzZXMgdGFibGUgZGF0YSwgdGhlbiBmaW5hbGl6ZXMgaXQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1RhYmxlX0Z1bmNzUmVjXwotICB7Ci0gICAgRlRfRXJyb3IKLSAgICAoKmluaXQpKCBQU19UYWJsZSAgIHRhYmxlLAotICAgICAgICAgICAgIEZUX0ludCAgICAgY291bnQsCi0gICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBQU19UYWJsZSAgdGFibGUgKTsKLQotICAgIEZUX0Vycm9yCi0gICAgKCphZGQpKCBQU19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICBGVF9JbnQgICAgaWR4LAotICAgICAgICAgICAgdm9pZCogICAgIG9iamVjdCwKLSAgICAgICAgICAgIEZUX1VJbnQgICBsZW5ndGggKTsKLQotICAgIHZvaWQKLSAgICAoKnJlbGVhc2UpKCBQU19UYWJsZSAgdGFibGUgKTsKLQotICB9IFBTX1RhYmxlX0Z1bmNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBQU19UYWJsZSBpcyBhIHNpbXBsZSBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBhcnJheSBvZiBvYmplY3RzIGluICovCi0gIC8qICAgIGEgc2luZ2xlIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsb2NrICAgICA6OiBUaGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIGdyb3doZWFwJ3MgYmxvY2suICBUaGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgY2FuIGNoYW5nZSBiZXR3ZWVuIHR3byBvYmplY3QgYWRkcywgZHVlIHRvICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHJlYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJzb3IgICAgOjogVGhlIGN1cnJlbnQgdG9wIG9mIHRoZSBncm93IGhlYXAgd2l0aGluIGl0cyBibG9jay4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcGFjaXR5ICA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBoZWFwIGJsb2NrLiAgSW5jcmVtZW50cyBieSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgMWtCeXRlIGNodW5rcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluaXQgICAgICA6OiBTZXQgdG8gMHhERUFEQkVFRiBpZiBgZWxlbWVudHMnIGFuZCBgbGVuZ3RocycgaGF2ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgYmVlbiBhbGxvY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9lbGVtcyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGFibGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2VsZW1zIDo6IFRoZSBjdXJyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0YWJsZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbGVtZW50cyAgOjogQSB0YWJsZSBvZiBlbGVtZW50IGFkZHJlc3NlcyB3aXRoaW4gdGhlIGJsb2NrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aHMgICA6OiBBIHRhYmxlIG9mIGVsZW1lbnQgc2l6ZXMgd2l0aGluIHRoZSBibG9jay4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgIDo6IFRoZSBvYmplY3QgdXNlZCBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAoYWxsb2MvcmVhbGxvYykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY3MgICAgIDo6IEEgdGFibGUgb2YgbWV0aG9kIHBvaW50ZXJzIGZvciB0aGlzIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfVGFibGVSZWNfCi0gIHsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgYmxvY2s7ICAgICAgICAgIC8qIGN1cnJlbnQgbWVtb3J5IGJsb2NrICAgICAgICAgICAqLwotICAgIEZUX09mZnNldCAgICAgICAgICBjdXJzb3I7ICAgICAgICAgLyogY3VycmVudCBjdXJzb3IgaW4gbWVtb3J5IGJsb2NrICovCi0gICAgRlRfT2Zmc2V0ICAgICAgICAgIGNhcGFjaXR5OyAgICAgICAvKiBjdXJyZW50IHNpemUgb2YgbWVtb3J5IGJsb2NrICAgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgaW5pdDsKLQotICAgIEZUX0ludCAgICAgICAgICAgICBtYXhfZWxlbXM7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIG51bV9lbGVtczsKLSAgICBGVF9CeXRlKiogICAgICAgICAgZWxlbWVudHM7ICAgICAgIC8qIGFkZHJlc3NlcyBvZiB0YWJsZSBlbGVtZW50cyAqLwotICAgIEZUX1VJbnQqICAgICAgICAgICBsZW5ndGhzOyAgICAgICAgLyogbGVuZ3RocyBvZiB0YWJsZSBlbGVtZW50cyAgICovCi0KLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OwotICAgIFBTX1RhYmxlX0Z1bmNzUmVjICBmdW5jczsKLQotICB9IFBTX1RhYmxlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBUMSBGSUVMRFMgJiBUT0tFTlMgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNfUGFyc2VyUmVjXyogIFBTX1BhcnNlcjsKLQotICB0eXBlZGVmIHN0cnVjdCBUMV9Ub2tlblJlY18qICAgVDFfVG9rZW47Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfRmllbGRSZWNfKiAgIFQxX0ZpZWxkOwotCi0KLSAgLyogc2ltcGxlIGVudW1lcmF0aW9uIHR5cGUgdXNlZCB0byBpZGVudGlmeSB0b2tlbiB0eXBlcyAqLwotICB0eXBlZGVmIGVudW0gIFQxX1Rva2VuVHlwZV8KLSAgewotICAgIFQxX1RPS0VOX1RZUEVfTk9ORSA9IDAsCi0gICAgVDFfVE9LRU5fVFlQRV9BTlksCi0gICAgVDFfVE9LRU5fVFlQRV9TVFJJTkcsCi0gICAgVDFfVE9LRU5fVFlQRV9BUlJBWSwKLSAgICBUMV9UT0tFTl9UWVBFX0tFWSwgLyogYWthIGBuYW1lJyAqLwotCi0gICAgLyogZG8gbm90IHJlbW92ZSAqLwotICAgIFQxX1RPS0VOX1RZUEVfTUFYCi0KLSAgfSBUMV9Ub2tlblR5cGU7Ci0KLQotICAvKiBhIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBpZGVudGlmeSB0b2tlbnMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX1Rva2VuUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICAgICBzdGFydDsgICAvKiBmaXJzdCBjaGFyYWN0ZXIgb2YgdG9rZW4gaW4gaW5wdXQgc3RyZWFtICovCi0gICAgRlRfQnl0ZSogICAgICBsaW1pdDsgICAvKiBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHRva2VuICAgICAgICAgICovCi0gICAgVDFfVG9rZW5UeXBlICB0eXBlOyAgICAvKiB0eXBlIG9mIHRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgfSBUMV9Ub2tlblJlYzsKLQotCi0gIC8qIGVudW1lcmF0aW9uIHR5cGUgdXNlZCB0byBpZGVudGlmeSBvYmplY3QgZmllbGRzICovCi0gIHR5cGVkZWYgZW51bSAgVDFfRmllbGRUeXBlXwotICB7Ci0gICAgVDFfRklFTERfVFlQRV9OT05FID0gMCwKLSAgICBUMV9GSUVMRF9UWVBFX0JPT0wsCi0gICAgVDFfRklFTERfVFlQRV9JTlRFR0VSLAotICAgIFQxX0ZJRUxEX1RZUEVfRklYRUQsCi0gICAgVDFfRklFTERfVFlQRV9GSVhFRF8xMDAwLAotICAgIFQxX0ZJRUxEX1RZUEVfU1RSSU5HLAotICAgIFQxX0ZJRUxEX1RZUEVfS0VZLAotICAgIFQxX0ZJRUxEX1RZUEVfQkJPWCwKLSAgICBUMV9GSUVMRF9UWVBFX01NX0JCT1gsCi0gICAgVDFfRklFTERfVFlQRV9JTlRFR0VSX0FSUkFZLAotICAgIFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVksCi0gICAgVDFfRklFTERfVFlQRV9DQUxMQkFDSywKLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUMV9GSUVMRF9UWVBFX01BWAotCi0gIH0gVDFfRmllbGRUeXBlOwotCi0KLSAgdHlwZWRlZiBlbnVtICBUMV9GaWVsZExvY2F0aW9uXwotICB7Ci0gICAgVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk8sCi0gICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9ESUNULAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRVhUUkEsCi0gICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9JTkZPLAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX1BSSVZBVEUsCi0gICAgVDFfRklFTERfTE9DQVRJT05fQkJPWCwKLSAgICBUMV9GSUVMRF9MT0NBVElPTl9MT0FERVIsCi0gICAgVDFfRklFTERfTE9DQVRJT05fRkFDRSwKLSAgICBUMV9GSUVMRF9MT0NBVElPTl9CTEVORCwKLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUMV9GSUVMRF9MT0NBVElPTl9NQVgKLQotICB9IFQxX0ZpZWxkTG9jYXRpb247Ci0KLQotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9GaWVsZF9QYXJzZUZ1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIHBhcnNlciApOwotCi0KLSAgLyogc3RydWN0dXJlIHR5cGUgdXNlZCB0byBtb2RlbCBvYmplY3QgZmllbGRzICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9GaWVsZFJlY18KLSAgewotICAgIGNvbnN0IGNoYXIqICAgICAgICAgaWRlbnQ7ICAgICAgICAvKiBmaWVsZCBpZGVudGlmaWVyICAgICAgICAgICAgICAgKi8KLSAgICBUMV9GaWVsZExvY2F0aW9uICAgIGxvY2F0aW9uOwotICAgIFQxX0ZpZWxkVHlwZSAgICAgICAgdHlwZTsgICAgICAgICAvKiB0eXBlIG9mIGZpZWxkICAgICAgICAgICAgICAgICAgKi8KLSAgICBUMV9GaWVsZF9QYXJzZUZ1bmMgIHJlYWRlcjsKLSAgICBGVF9VSW50ICAgICAgICAgICAgIG9mZnNldDsgICAgICAgLyogb2Zmc2V0IG9mIGZpZWxkIGluIG9iamVjdCAgICAgICovCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICBzaXplOyAgICAgICAgIC8qIHNpemUgb2YgZmllbGQgaW4gYnl0ZXMgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICAgYXJyYXlfbWF4OyAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBmb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVUludCAgICAgICAgICAgICBjb3VudF9vZmZzZXQ7IC8qIG9mZnNldCBvZiBlbGVtZW50IGNvdW50IGZvciAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcnJheXM7IG11c3Qgbm90IGJlIHplcm8gaWYgaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIC0tIGluIG90aGVyIHdvcmRzLCBhICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBudW1fRk9PJyBlbGVtZW50IG11c3Qgbm90ICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCB0aGUgdXNlZCBzdHJ1Y3R1cmUgaWYgd2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFyc2UgYSBgRk9PJyBhcnJheSAgICAgICAgICAgICovCi0gICAgRlRfVUludCAgICAgICAgICAgICBkaWN0OyAgICAgICAgIC8qIHdoZXJlIHdlIGV4cGVjdCBpdCAgICAgICAgICAgICAqLwotICB9IFQxX0ZpZWxkUmVjOwotCi0jZGVmaW5lIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKCAxIDw8IDAgKSAvKiBhbHNvIEZvbnRJbmZvIGFuZCBGREFycmF5ICovCi0jZGVmaW5lIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSAgKCAxIDw8IDEgKQotCi0KLQotI2RlZmluZSBUMV9ORVdfU0lNUExFX0ZJRUxEKCBfaWRlbnQsIF90eXBlLCBfZm5hbWUsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRSggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2RpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgVDFfTkVXX0NBTExCQUNLX0ZJRUxEKCBfaWRlbnQsIF9yZWFkZXIsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgVDFfRklFTERfVFlQRV9DQUxMQkFDSywgICAgIFwKLSAgICAgICAgICAgIChUMV9GaWVsZF9QYXJzZUZ1bmMpX3JlYWRlciwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9kaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgVDFfTkVXX1RBQkxFX0ZJRUxEKCBfaWRlbnQsIF90eXBlLCBfZm5hbWUsIF9tYXgsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFX0RFTFRBKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9tYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBudW1fICMjIF9mbmFtZSApLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jZGVmaW5lIFQxX05FV19UQUJMRV9GSUVMRDIoIF9pZGVudCwgX3R5cGUsIF9mbmFtZSwgX21heCwgX2RpY3QgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIF9mbmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFX0RFTFRBKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfbWF4LCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSwKLQotCi0jZGVmaW5lIFQxX0ZJRUxEX0JPT0woIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0JPT0wsIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX05VTSggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0lOVEVHRVIsIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0ZJWEVEKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRCwgX2ZuYW1lLCBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfRklYRURfMTAwMCggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0ZJWEVEXzEwMDAsIF9mbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9TVFJJTkcoIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX1NUUklORywgX2ZuYW1lLCBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfS0VZKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9LRVksIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0JCT1goIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0JCT1gsIF9mbmFtZSwgX2RpY3QgKQotCi0KLSNkZWZpbmUgVDFfRklFTERfTlVNX1RBQkxFKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1RBQkxFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0ZJWEVEX1RBQkxFKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgIFwKLSAgICAgICAgICBUMV9ORVdfVEFCTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX05VTV9UQUJMRTIoIF9pZGVudCwgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKSAgICAgICAgIFwKLSAgICAgICAgICBUMV9ORVdfVEFCTEVfRklFTEQyKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9GSVhFRF9UQUJMRTIoIF9pZGVudCwgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKSAgICAgXAotICAgICAgICAgIFQxX05FV19UQUJMRV9GSUVMRDIoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9DQUxMQkFDSyggX2lkZW50LCBfbmFtZSwgX2RpY3QgKSAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX0NBTExCQUNLX0ZJRUxEKCBfaWRlbnQsIF9uYW1lLCBfZGljdCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgUEFSU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBQU19QYXJzZXJfRnVuY3NSZWNfKiAgUFNfUGFyc2VyX0Z1bmNzOwotCi0gIHR5cGVkZWYgc3RydWN0ICBQU19QYXJzZXJfRnVuY3NSZWNfCi0gIHsKLSAgICB2b2lkCi0gICAgKCppbml0KSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgRlRfQnl0ZSogICBiYXNlLAotICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0gICAgdm9pZAotICAgICgqc2tpcF9zcGFjZXMpKCBQU19QYXJzZXIgIHBhcnNlciApOwotICAgIHZvaWQKLSAgICAoKnNraXBfUFNfdG9rZW4pKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0gICAgRlRfTG9uZwotICAgICgqdG9faW50KSggUFNfUGFyc2VyICBwYXJzZXIgKTsKLSAgICBGVF9GaXhlZAotICAgICgqdG9fZml4ZWQpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKTsKLQotICAgIEZUX0Vycm9yCi0gICAgKCp0b19ieXRlcykoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIG1heF9ieXRlcywKLSAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBwbnVtX2J5dGVzLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGRlbGltaXRlcnMgKTsKLQotICAgIEZUX0ludAotICAgICgqdG9fY29vcmRfYXJyYXkpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIGNvb3JkcyApOwotICAgIEZUX0ludAotICAgICgqdG9fZml4ZWRfYXJyYXkpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKTsKLQotICAgIHZvaWQKLSAgICAoKnRvX3Rva2VuKSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgIFQxX1Rva2VuICAgdG9rZW4gKTsKLSAgICB2b2lkCi0gICAgKCp0b190b2tlbl9hcnJheSkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9Ub2tlbiAgIHRva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBtYXhfdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgIHBudW1fdG9rZW5zICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqbG9hZF9maWVsZCkoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqbG9hZF9maWVsZF90YWJsZSkoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICk7Ci0KLSAgfSBQU19QYXJzZXJfRnVuY3NSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFBTX1BhcnNlciBpcyBhbiBvYmplY3QgdXNlZCB0byBwYXJzZSBhIFR5cGUgMSBmb250IHZlcnkgcXVpY2tseS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJzb3IgOjogVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2UgICA6OiBTdGFydCBvZiB0aGUgcHJvY2Vzc2VkIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGltaXQgIDo6IEVuZCBvZiB0aGUgcHJvY2Vzc2VkIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlcnJvciAgOjogVGhlIGxhc3QgZXJyb3IgcmV0dXJuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zIChhbGxvYy9yZWFsbG9jKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY3MgIDo6IEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciB0aGUgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfUGFyc2VyUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICBjdXJzb3I7Ci0gICAgRlRfQnl0ZSogICBiYXNlOwotICAgIEZUX0J5dGUqICAgbGltaXQ7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotICAgIFBTX1BhcnNlcl9GdW5jc1JlYyAgZnVuY3M7Ci0KLSAgfSBQU19QYXJzZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgVDEgQlVJTERFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0J1aWxkZXJSZWNfKiAgVDFfQnVpbGRlcjsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0NoZWNrX1BvaW50c19GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgY291bnQgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9CdWlsZGVyX0FkZF9Qb2ludF9GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgZmxhZyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0FkZF9Qb2ludDFfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0FkZF9Db250b3VyX0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlQxX0J1aWxkZXJfU3RhcnRfUG9pbnRfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5ICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfQnVpbGRlcl9DbG9zZV9Db250b3VyX0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMV9CdWlsZGVyX0Z1bmNzUmVjXyogIFQxX0J1aWxkZXJfRnVuY3M7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0J1aWxkZXJfRnVuY3NSZWNfCi0gIHsKLSAgICB2b2lkCi0gICAgKCppbml0KSggVDFfQnVpbGRlciAgICBidWlsZGVyLAotICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgaGludGluZyApOwotCi0gICAgdm9pZAotICAgICgqZG9uZSkoIFQxX0J1aWxkZXIgICBidWlsZGVyICk7Ci0KLSAgICBUMV9CdWlsZGVyX0NoZWNrX1BvaW50c19GdW5jICAgY2hlY2tfcG9pbnRzOwotICAgIFQxX0J1aWxkZXJfQWRkX1BvaW50X0Z1bmMgICAgICBhZGRfcG9pbnQ7Ci0gICAgVDFfQnVpbGRlcl9BZGRfUG9pbnQxX0Z1bmMgICAgIGFkZF9wb2ludDE7Ci0gICAgVDFfQnVpbGRlcl9BZGRfQ29udG91cl9GdW5jICAgIGFkZF9jb250b3VyOwotICAgIFQxX0J1aWxkZXJfU3RhcnRfUG9pbnRfRnVuYyAgICBzdGFydF9wb2ludDsKLSAgICBUMV9CdWlsZGVyX0Nsb3NlX0NvbnRvdXJfRnVuYyAgY2xvc2VfY29udG91cjsKLQotICB9IFQxX0J1aWxkZXJfRnVuY3NSZWM7Ci0KLQotICAvKiBhbiBlbnVtZXJhdGlvbiB0eXBlIHRvIGhhbmRsZSBjaGFyc3RyaW5nIHBhcnNpbmcgc3RhdGVzICovCi0gIHR5cGVkZWYgZW51bSAgVDFfUGFyc2VTdGF0ZV8KLSAgewotICAgIFQxX1BhcnNlX1N0YXJ0LAotICAgIFQxX1BhcnNlX0hhdmVfV2lkdGgsCi0gICAgVDFfUGFyc2VfSGF2ZV9Nb3ZldG8sCi0gICAgVDFfUGFyc2VfSGF2ZV9QYXRoCi0KLSAgfSBUMV9QYXJzZVN0YXRlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0dXJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQnVpbGRlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIGdseXBoIGxvYWRpbmcgdG8gc3RvcmUgaXRzIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgIDo6IFRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyICAgICAgIDo6IFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlICAgICAgICAgOjogVGhlIGJhc2UgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cnJlbnQgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3BvaW50cyAgIDo6IG1heGltdW0gcG9pbnRzIGluIGJ1aWxkZXIgb3V0bGluZSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfY29udG91cnMgOjogTWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgaW4gYnVpbGRlciBvdXRsaW5lLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc194ICAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCB0cmFuc2xhdGlvbiAoaWYgY29tcG9zaXRlIGdseXBoKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zX3kgICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCB0cmFuc2xhdGlvbiAoaWYgY29tcG9zaXRlIGdseXBoKS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0X2JlYXJpbmcgOjogVGhlIGxlZnQgc2lkZSBiZWFyaW5nIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBhZHZhbmNlIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmJveCAgICAgICAgIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJzZV9zdGF0ZSAgOjogQW4gZW51bWVyYXRpb24gd2hpY2ggY29udHJvbHMgdGhlIGNoYXJzdHJpbmcgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX3BvaW50cyAgOjogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIG5vIHBvaW50cyBhcmUgbG9hZGVkLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vX3JlY3Vyc2UgICA6OiBTZXQgYnV0IG5vdCB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljc19vbmx5IDo6IEEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0aGUgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoLCBub3QgbG9hZCBhbGwgb2YgaXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNzICAgICAgICA6OiBBbiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgdGhlIGJ1aWxkZXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0J1aWxkZXJSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5OwotICAgIEZUX0ZhY2UgICAgICAgICBmYWNlOwotICAgIEZUX0dseXBoU2xvdCAgICBnbHlwaDsKLSAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyOwotICAgIEZUX091dGxpbmUqICAgICBiYXNlOwotICAgIEZUX091dGxpbmUqICAgICBjdXJyZW50OwotCi0gICAgRlRfUG9zICAgICAgICAgIHBvc194OwotICAgIEZUX1BvcyAgICAgICAgICBwb3NfeTsKLQotICAgIEZUX1ZlY3RvciAgICAgICBsZWZ0X2JlYXJpbmc7Ci0gICAgRlRfVmVjdG9yICAgICAgIGFkdmFuY2U7Ci0KLSAgICBGVF9CQm94ICAgICAgICAgYmJveDsgICAgICAgICAgLyogYm91bmRpbmcgYm94ICovCi0gICAgVDFfUGFyc2VTdGF0ZSAgIHBhcnNlX3N0YXRlOwotICAgIEZUX0Jvb2wgICAgICAgICBsb2FkX3BvaW50czsKLSAgICBGVF9Cb29sICAgICAgICAgbm9fcmVjdXJzZTsKLQotICAgIEZUX0Jvb2wgICAgICAgICBtZXRyaWNzX29ubHk7Ci0KLSAgICB2b2lkKiAgICAgICAgICAgaGludHNfZnVuY3M7ICAgIC8qIGhpbnRlci1zcGVjaWZpYyAqLwotICAgIHZvaWQqICAgICAgICAgICBoaW50c19nbG9iYWxzOyAgLyogaGludGVyLXNwZWNpZmljICovCi0KLSAgICBUMV9CdWlsZGVyX0Z1bmNzUmVjICBmdW5jczsKLQotICB9IFQxX0J1aWxkZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgVDEgREVDT0RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIDAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUgICAqLwotICAvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9TVUJSU19DQUxMUyAgOAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUMV9NQVhfQ0hBUlNUUklOR19PUEVSQU5EUyBpcyB0aGUgY2hhcnN0cmluZyBzdGFjaydzIGNhcGFjaXR5LiAgQSAgICAgKi8KLSAgLyogbWluaW11bSBvZiAxNiBpcyByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDMyCi0KLSNlbmRpZiAvKiAwICovCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfRGVjb2Rlcl9ab25lUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogIGN1cnNvcjsKLSAgICBGVF9CeXRlKiAgYmFzZTsKLSAgICBGVF9CeXRlKiAgbGltaXQ7Ci0KLSAgfSBUMV9EZWNvZGVyX1pvbmVSZWMsICpUMV9EZWNvZGVyX1pvbmU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBUMV9EZWNvZGVyUmVjXyogICAgICAgICAgICAgIFQxX0RlY29kZXI7Ci0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IFQxX0RlY29kZXJfRnVuY3NSZWNfKiAgVDFfRGVjb2Rlcl9GdW5jczsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9EZWNvZGVyX0NhbGxiYWNrKSggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXggKTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9EZWNvZGVyX0Z1bmNzUmVjXwotICB7Ci0gICAgRlRfRXJyb3IKLSAgICAoKmluaXQpKCBUMV9EZWNvZGVyICAgICAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgRlRfU2l6ZSAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICAgICBzbG90LAotICAgICAgICAgICAgIEZUX0J5dGUqKiAgICAgICAgICAgIGdseXBoX25hbWVzLAotICAgICAgICAgICAgIFBTX0JsZW5kICAgICAgICAgICAgIGJsZW5kLAotICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgIGhpbnRpbmcsCi0gICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgICAgaGludF9tb2RlLAotICAgICAgICAgICAgIFQxX0RlY29kZXJfQ2FsbGJhY2sgIGNhbGxiYWNrICk7Ci0KLSAgICB2b2lkCi0gICAgKCpkb25lKSggVDFfRGVjb2RlciAgZGVjb2RlciApOwotCi0gICAgRlRfRXJyb3IKLSAgICAoKnBhcnNlX2NoYXJzdHJpbmdzKSggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVuICk7Ci0KLSAgfSBUMV9EZWNvZGVyX0Z1bmNzUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0RlY29kZXJSZWNfCi0gIHsKLSAgICBUMV9CdWlsZGVyUmVjICAgICAgICBidWlsZGVyOwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgICAgc3RhY2tbVDFfTUFYX0NIQVJTVFJJTkdTX09QRVJBTkRTXTsKLSAgICBGVF9Mb25nKiAgICAgICAgICAgICB0b3A7Ci0KLSAgICBUMV9EZWNvZGVyX1pvbmVSZWMgICB6b25lc1tUMV9NQVhfU1VCUlNfQ0FMTFMgKyAxXTsKLSAgICBUMV9EZWNvZGVyX1pvbmUgICAgICB6b25lOwotCi0gICAgRlRfU2VydmljZV9Qc0NNYXBzICAgcHNuYW1lczsgICAgICAvKiBmb3Igc2VhYyAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9nbHlwaHM7Ci0gICAgRlRfQnl0ZSoqICAgICAgICAgICAgZ2x5cGhfbmFtZXM7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICAgICBsZW5JVjsgICAgICAgIC8qIGludGVybmFsIGZvciBzdWIgcm91dGluZSBjYWxscyAqLwotICAgIEZUX0ludCAgICAgICAgICAgICAgIG51bV9zdWJyczsKLSAgICBGVF9CeXRlKiogICAgICAgICAgICBzdWJyczsKLSAgICBGVF9VSW50KiAgICAgICAgICAgICBzdWJyc19sZW47ICAgIC8qIGFycmF5IG9mIHN1YnJzIGxlbmd0aCAob3B0aW9uYWwpICovCi0gICAgRlRfSGFzaCAgICAgICAgICAgICAgc3VicnNfaGFzaDsgICAvKiB1c2VkIGlmIGBudW1fc3VicnMnIHdhcyBtYXNzYWdlZCAqLwotCi0gICAgRlRfTWF0cml4ICAgICAgICAgICAgZm9udF9tYXRyaXg7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgICAgZm9udF9vZmZzZXQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICAgICBmbGV4X3N0YXRlOwotICAgIEZUX0ludCAgICAgICAgICAgICAgIG51bV9mbGV4X3ZlY3RvcnM7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgICAgZmxleF92ZWN0b3JzWzddOwotCi0gICAgUFNfQmxlbmQgICAgICAgICAgICAgYmxlbmQ7ICAgICAgIC8qIGZvciBtdWx0aXBsZSBtYXN0ZXIgc3VwcG9ydCAqLwotCi0gICAgRlRfUmVuZGVyX01vZGUgICAgICAgaGludF9tb2RlOwotCi0gICAgVDFfRGVjb2Rlcl9DYWxsYmFjayAgcGFyc2VfY2FsbGJhY2s7Ci0gICAgVDFfRGVjb2Rlcl9GdW5jc1JlYyAgZnVuY3M7Ci0KLSAgICBGVF9Mb25nKiAgICAgICAgICAgICBidWlsZGNoYXI7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgbGVuX2J1aWxkY2hhcjsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICAgIHNlYWM7Ci0KLSAgfSBUMV9EZWNvZGVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGTSBQQVJTRVIgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgQUZNX1BhcnNlclJlY18qICBBRk1fUGFyc2VyOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fUGFyc2VyX0Z1bmNzUmVjXwotICB7Ci0gICAgRlRfRXJyb3IKLSAgICAoKmluaXQpKCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBBRk1fUGFyc2VyICBwYXJzZXIgKTsKLQotICAgIEZUX0Vycm9yCi0gICAgKCpwYXJzZSkoIEFGTV9QYXJzZXIgIHBhcnNlciApOwotCi0gIH0gQUZNX1BhcnNlcl9GdW5jc1JlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0IEFGTV9TdHJlYW1SZWNfKiAgQUZNX1N0cmVhbTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFGTV9QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEFGTV9QYXJzZXIgaXMgYSBwYXJzZXIgZm9yIHRoZSBBRk0gZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zIChhbGxvYyBhbmQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgcmVhbGxvYykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICA6OiBUaGlzIGlzIGFuIG9wYXF1ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9udEluZm8gIDo6IFRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZXRfaW5kZXggOjogQSB1c2VyIHByb3ZpZGVkIGZ1bmN0aW9uIHRvIGdldCBhIGdseXBoIGluZGV4IGJ5IGl0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQUZNX1BhcnNlclJlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5OwotICAgIEFGTV9TdHJlYW0gICAgc3RyZWFtOwotCi0gICAgQUZNX0ZvbnRJbmZvICBGb250SW5mbzsKLQotICAgIEZUX0ludAotICAgICgqZ2V0X2luZGV4KSggY29uc3QgY2hhciogIG5hbWUsCi0gICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgICAgbGVuLAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHVzZXJfZGF0YSApOwotCi0gICAgdm9pZCogICAgICAgICB1c2VyX2RhdGE7Ci0KLSAgfSBBRk1fUGFyc2VyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgVFlQRTEgQ0hBUk1BUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVDFfQ01hcF9DbGFzc2VzUmVjXyogIFQxX0NNYXBfQ2xhc3NlczsKLQotICB0eXBlZGVmIHN0cnVjdCBUMV9DTWFwX0NsYXNzZXNSZWNfCi0gIHsKLSAgICBGVF9DTWFwX0NsYXNzICBzdGFuZGFyZDsKLSAgICBGVF9DTWFwX0NsYXNzICBleHBlcnQ7Ci0gICAgRlRfQ01hcF9DbGFzcyAgY3VzdG9tOwotICAgIEZUX0NNYXBfQ2xhc3MgIHVuaWNvZGU7Ci0KLSAgfSBUMV9DTWFwX0NsYXNzZXNSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBQU0F1eCBNb2R1bGUgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNBdXhfU2VydmljZVJlY18KLSAgewotICAgIC8qIGRvbid0IHVzZSBgUFNfVGFibGVfRnVuY3MnIGFuZCBmcmllbmRzIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzICovCi0gICAgY29uc3QgUFNfVGFibGVfRnVuY3NSZWMqICAgIHBzX3RhYmxlX2Z1bmNzOwotICAgIGNvbnN0IFBTX1BhcnNlcl9GdW5jc1JlYyogICBwc19wYXJzZXJfZnVuY3M7Ci0gICAgY29uc3QgVDFfQnVpbGRlcl9GdW5jc1JlYyogIHQxX2J1aWxkZXJfZnVuY3M7Ci0gICAgY29uc3QgVDFfRGVjb2Rlcl9GdW5jc1JlYyogIHQxX2RlY29kZXJfZnVuY3M7Ci0KLSAgICB2b2lkCi0gICAgKCp0MV9kZWNyeXB0KSggRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICBzZWVkICk7Ci0KLSAgICBUMV9DTWFwX0NsYXNzZXMgIHQxX2NtYXBfY2xhc3NlczsKLQotICAgIC8qIGZpZWxkcyBhZnRlciB0aGlzIGNvbW1lbnQgbGluZSB3ZXJlIGFkZGVkIGFmdGVyIHZlcnNpb24gMi4xLjEwICovCi0gICAgY29uc3QgQUZNX1BhcnNlcl9GdW5jc1JlYyogIGFmbV9wYXJzZXJfZnVuY3M7Ci0KLSAgfSBQU0F1eF9TZXJ2aWNlUmVjLCAqUFNBdXhfU2VydmljZTsKLQotICAvKiBiYWNrd2FyZCBjb21wYXRpYmxlIHR5cGUgZGVmaW5pdGlvbiAqLwotICB0eXBlZGVmIFBTQXV4X1NlcnZpY2VSZWMgICBQU0F1eF9JbnRlcmZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgIFNvbWUgY29udmVuaWVuY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBJU19QU19ORVdMSU5FKCBjaCApIFwKLSAgKCAoY2gpID09ICdccicgfHwgICAgICAgICBcCi0gICAgKGNoKSA9PSAnXG4nICkKLQotI2RlZmluZSBJU19QU19TUEFDRSggY2ggKSAgXAotICAoIChjaCkgPT0gJyAnICAgICAgICAgfHwgXAotICAgIElTX1BTX05FV0xJTkUoIGNoICkgfHwgXAotICAgIChjaCkgPT0gJ1x0JyAgICAgICAgfHwgXAotICAgIChjaCkgPT0gJ1xmJyAgICAgICAgfHwgXAotICAgIChjaCkgPT0gJ1wwJyApCi0KLSNkZWZpbmUgSVNfUFNfU1BFQ0lBTCggY2ggKSAgICAgICBcCi0gICggKGNoKSA9PSAnLycgICAgICAgICAgICAgICAgfHwgXAotICAgIChjaCkgPT0gJygnIHx8IChjaCkgPT0gJyknIHx8IFwKLSAgICAoY2gpID09ICc8JyB8fCAoY2gpID09ICc+JyB8fCBcCi0gICAgKGNoKSA9PSAnWycgfHwgKGNoKSA9PSAnXScgfHwgXAotICAgIChjaCkgPT0gJ3snIHx8IChjaCkgPT0gJ30nIHx8IFwKLSAgICAoY2gpID09ICclJyAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgSVNfUFNfREVMSU0oIGNoICkgIFwKLSAgKCBJU19QU19TUEFDRSggY2ggKSAgIHx8IFwKLSAgICBJU19QU19TUEVDSUFMKCBjaCApICkKLQotI2RlZmluZSBJU19QU19ESUdJVCggY2ggKSAgICAgICAgXAotICAoIChjaCkgPj0gJzAnICYmIChjaCkgPD0gJzknICkKLQotI2RlZmluZSBJU19QU19YRElHSVQoIGNoICkgICAgICAgICAgICBcCi0gICggSVNfUFNfRElHSVQoIGNoICkgICAgICAgICAgICAgIHx8IFwKLSAgICAoIChjaCkgPj0gJ0EnICYmIChjaCkgPD0gJ0YnICkgfHwgXAotICAgICggKGNoKSA+PSAnYScgJiYgKGNoKSA8PSAnZicgKSApCi0KLSNkZWZpbmUgSVNfUFNfQkFTRTg1KCBjaCApICAgICAgIFwKLSAgKCAoY2gpID49ICchJyAmJiAoY2gpIDw9ICd1JyApCi0KLSNkZWZpbmUgSVNfUFNfVE9LRU4oIGN1ciwgbGltaXQsIHRva2VuICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKCAoY2hhcikoY3VyKVswXSA9PSAodG9rZW4pWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKLSAgICAoIChjdXIpICsgc2l6ZW9mICggKHRva2VuKSApID09IChsaW1pdCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICggKGN1cikgKyBzaXplb2YoICh0b2tlbikgKSA8IChsaW1pdCkgICAgICAgICAgJiYgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgSVNfUFNfREVMSU0oIChjdXIpW3NpemVvZiAoICh0b2tlbikgKSAtIDFdICkgKSApICAgICAgICAgICAgICYmIFwKLSAgICBmdF9zdHJuY21wKCAoY2hhciopKGN1ciksICh0b2tlbiksIHNpemVvZiAoICh0b2tlbikgKSAtIDEgKSA9PSAwICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBQU0FVWF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzaGludHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMTZlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzaGludHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hpbnRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW50ZXJmYWNlIHRvIFBvc3RzY3JpcHQtc3BlY2lmaWMgKFR5cGUgMSBhbmQgVHlwZSAyKSBoaW50cyAgICAgICAgICAgKi8KLS8qICAgIHJlY29yZGVycyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gIFRoZXNlIGFyZSB1c2VkIHRvIHN1cHBvcnQgbmF0aXZlICAgICovCi0vKiAgICBUMS9UMiBoaW50cyBpbiB0aGUgYHR5cGUxJywgYGNpZCcsIGFuZCBgY2ZmJyBmb250IGRyaXZlcnMuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBQU0hJTlRTX0hfCi0jZGVmaW5lIFBTSElOVFNfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICBJTlRFUk5BTCBSRVBSRVNFTlRBVElPTiBPRiBHTE9CQUxTICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCBQU0hfR2xvYmFsc1JlY18qICBQU0hfR2xvYmFsczsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqUFNIX0dsb2JhbHNfTmV3RnVuYykoIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qcml2YXRlKiAgIHByaXZhdGVfZGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMqICBhZ2xvYmFscyApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKlBTSF9HbG9iYWxzX1NldFNjYWxlRnVuYykoIFBTSF9HbG9iYWxzICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X2RlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X2RlbHRhICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqUFNIX0dsb2JhbHNfRGVzdHJveUZ1bmMpKCBQU0hfR2xvYmFscyAgZ2xvYmFscyApOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9HbG9iYWxzX0Z1bmNzUmVjXwotICB7Ci0gICAgUFNIX0dsb2JhbHNfTmV3RnVuYyAgICAgICBjcmVhdGU7Ci0gICAgUFNIX0dsb2JhbHNfU2V0U2NhbGVGdW5jICBzZXRfc2NhbGU7Ci0gICAgUFNIX0dsb2JhbHNfRGVzdHJveUZ1bmMgICBkZXN0cm95OwotCi0gIH0gUFNIX0dsb2JhbHNfRnVuY3NSZWMsICpQU0hfR2xvYmFsc19GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgIFBVQkxJQyBUWVBFIDEgSElOVFMgUkVDT1JERVIgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIFQxX0hpbnRzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIGlzIGEgaGFuZGxlIHRvIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNvcmQgZ2x5cGggaGludHMKLSAgICogICBmcm9tIGEgVHlwZSAxIGNoYXJhY3RlciBnbHlwaCBjaGFyYWN0ZXIgc3RyaW5nLgotICAgKgotICAgKiAgIFRoZSBtZXRob2RzIHVzZWQgdG8gb3BlcmF0ZSBvbiB0aGlzIG9iamVjdCBhcmUgZGVmaW5lZCBieSB0aGUKLSAgICogICBAVDFfSGludHNfRnVuY3NSZWMgc3RydWN0dXJlLiAgUmVjb3JkaW5nIGdseXBoIGhpbnRzIGlzIG5vcm1hbGx5Ci0gICAqICAgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHNjaGVtZToKLSAgICoKLSAgICogICAtIE9wZW4gYSBuZXcgaGludCByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSBgb3BlbicgbWV0aG9kLgotICAgKiAgICAgVGhpcyByZXdpbmRzIHRoZSByZWNvcmRlciBhbmQgcHJlcGFyZSBpdCBmb3IgbmV3IGlucHV0LgotICAgKgotICAgKiAgIC0gRm9yIGVhY2ggaGludCBmb3VuZCBpbiB0aGUgZ2x5cGggY2hhcnN0cmluZywgY2FsbCB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgICAgbWV0aG9kIChgc3RlbScsIGBzdGVtMycsIG9yIGByZXNldCcpLiAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBkbwotICAgKiAgICAgbm90IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgKgotICAgKiAgIC0gQ2xvc2UgdGhlIHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBjbG9zZScgbWV0aG9kLiAgSXQKLSAgICogICAgIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGUgaGludHMgd2VyZSBpbnZhbGlkIG9yIHNvbWV0aGluZwotICAgKiAgICAgc3RyYW5nZSBoYXBwZW5lZCAoZS5nLiwgbWVtb3J5IHNob3J0YWdlKS4KLSAgICoKLSAgICogICBUaGUgaGludHMgYWNjdW11bGF0ZWQgaW4gdGhlIG9iamVjdCBjYW4gbGF0ZXIgYmUgdXNlZCBieSB0aGUKLSAgICogICBQb3N0U2NyaXB0IGhpbnRlci4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IFQxX0hpbnRzUmVjXyogIFQxX0hpbnRzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgVDFfSGludHNfRnVuY3MKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgcG9pbnRlciB0byB0aGUgQFQxX0hpbnRzX0Z1bmNzUmVjIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIEFQSSBvZgotICAgKiAgIGEgZ2l2ZW4gQFQxX0hpbnRzIG9iamVjdC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IFQxX0hpbnRzX0Z1bmNzUmVjXyogIFQxX0hpbnRzX0Z1bmNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX09wZW5GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcHJlcGFyZSBpdCBmb3IgYSBuZXcgVHlwZSAxCi0gICAqICAgaGludHMgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBhbHdheXMgY2FsbCB0aGUgQFQxX0hpbnRzX0Nsb3NlRnVuYyBtZXRob2QgaW4gb3JkZXIgdG8KLSAgICogICBjbG9zZSBhbiBvcGVuZWQgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9IaW50c19PcGVuRnVuYykoIFQxX0hpbnRzICBoaW50cyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX1NldFN0ZW1GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcmVjb3JkIGEgbmV3IGhvcml6b250YWwgb3IKLSAgICogICB2ZXJ0aWNhbCBzdGVtLiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVHlwZSAxIGBoc3RlbScgYW5kIGB2c3RlbScKLSAgICogICBvcGVyYXRvcnMuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBkaW1lbnNpb24gOjoKLSAgICogICAgIDAgZm9yIGhvcml6b250YWwgc3RlbXMgKGhzdGVtKSwgMSBmb3IgdmVydGljYWwgb25lcyAodnN0ZW0pLgotICAgKgotICAgKiAgIGNvb3JkcyA6OgotICAgKiAgICAgQXJyYXkgb2YgMiBjb29yZGluYXRlcyBpbiAxNi4xNiBmb3JtYXQsIHVzZWQgYXMgKHBvc2l0aW9uLGxlbmd0aCkKLSAgICogICAgIHN0ZW0gZGVzY3JpcHRvci4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCi0gICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCi0gICAqCi0gICAqICAgYGNvb3Jkc1swXScgaXMgdGhlIGFic29sdXRlIHN0ZW0gcG9zaXRpb24gKGxvd2VzdCBjb29yZGluYXRlKTsKLSAgICogICBgY29vcmRzWzFdJyBpcyB0aGUgbGVuZ3RoLgotICAgKgotICAgKiAgIFRoZSBsZW5ndGggY2FuIGJlIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZWl0aGVyIC0yMCBvcgotICAgKiAgIC0yMS4gIEl0IGlzIGludGVycHJldGVkIGFzIGEgYGdob3N0JyBzdGVtLCBhY2NvcmRpbmcgdG8gdGhlIFR5cGUgMQotICAgKiAgIHNwZWNpZmljYXRpb24uCi0gICAqCi0gICAqICAgSWYgdGhlIGxlbmd0aCBpcyAtMjEgKGNvcnJlc3BvbmRpbmcgdG8gYSBib3R0b20gZ2hvc3Qgc3RlbSksIHRoZW4KLSAgICogICB0aGUgcmVhbCBzdGVtIHBvc2l0aW9uIGlzIGBjb29yZHNbMF0rY29vcmRzWzFdJy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQxX0hpbnRzX1NldFN0ZW1GdW5jKSggVDFfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMV9IaW50c19TZXRTdGVtM0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDFfSGludHMgY2xhc3MgdXNlZCB0byByZWNvcmQgdGhyZWUKLSAgICogICBjb3VudGVyLWNvbnRyb2xsZWQgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzdGVtcyBhdCBvbmNlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZGltZW5zaW9uIDo6Ci0gICAqICAgICAwIGZvciBob3Jpem9udGFsIHN0ZW1zLCAxIGZvciB2ZXJ0aWNhbCBvbmVzLgotICAgKgotICAgKiAgIGNvb3JkcyA6OgotICAgKiAgICAgQW4gYXJyYXkgb2YgNiB2YWx1ZXMgaW4gMTYuMTYgZm9ybWF0LCBob2xkaW5nIDMgKHBvc2l0aW9uLGxlbmd0aCkKLSAgICogICAgIHBhaXJzIGZvciB0aGUgY291bnRlci1jb250cm9sbGVkIHN0ZW1zLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBVc2UgdmVydGljYWwgY29vcmRpbmF0ZXMgKHkpIGZvciBob3Jpem9udGFsIHN0ZW1zIChkaW09MCkuICBVc2UKLSAgICogICBob3Jpem9udGFsIGNvb3JkaW5hdGVzICh4KSBmb3IgdmVydGljYWwgc3RlbXMgKGRpbT0xKS4KLSAgICoKLSAgICogICBUaGUgbGVuZ3RocyBjYW5ub3QgYmUgbmVnYXRpdmUgKGdob3N0IHN0ZW1zIGFyZSBuZXZlcgotICAgKiAgIGNvdW50ZXItY29udHJvbGxlZCkuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9IaW50c19TZXRTdGVtM0Z1bmMpKCBUMV9IaW50cyAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfUmVzZXRGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcmVzZXQgdGhlIHN0ZW1zIGhpbnRzIGluIGEKLSAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAxIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGVuZF9wb2ludCA6OgotICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IGluIHRoZSBpbnB1dCBnbHlwaCBpbiB3aGljaCB0aGUKLSAgICogICAgIHByZXZpb3VzbHkgZGVmaW5lZCBoaW50cyBhcHBseS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQxX0hpbnRzX1Jlc2V0RnVuYykoIFQxX0hpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZW5kX3BvaW50ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfQ2xvc2VGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gY2xvc2UgYSBoaW50IHJlY29yZGluZwotICAgKiAgIHNlc3Npb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBlbmRfcG9pbnQgOjoKLSAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCBpbiB0aGUgaW5wdXQgZ2x5cGguCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIGVycm9yIGNvZGUgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZQotICAgKiAgIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlQxX0hpbnRzX0Nsb3NlRnVuYykoIFQxX0hpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZW5kX3BvaW50ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfQXBwbHlGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gYXBwbHkgaGludHMgdG8gdGhlCi0gICAqICAgY29ycmVzcG9uZGluZyBnbHlwaCBvdXRsaW5lLiAgTXVzdCBiZSBjYWxsZWQgb25jZSBhbGwgaGludHMgaGF2ZSBiZWVuCi0gICAqICAgcmVjb3JkZWQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBvdXRsaW5lIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqICAgZ2xvYmFscyA6OgotICAgKiAgICAgVGhlIGhpbnRlciBnbG9iYWxzIGZvciB0aGlzIGZvbnQuCi0gICAqCi0gICAqICAgaGludF9tb2RlIDo6Ci0gICAqICAgICBIaW50aW5nIGluZm9ybWF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIE9uIGlucHV0LCBhbGwgcG9pbnRzIHdpdGhpbiB0aGUgb3V0bGluZSBhcmUgaW4gZm9udCBjb29yZGluYXRlcy4gT24KLSAgICogICBvdXRwdXQsIHRoZXkgYXJlIGluIDEvNjR0aCBvZiBwaXhlbHMuCi0gICAqCi0gICAqICAgVGhlIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgYGdsb2JhbHMnIG9iamVjdCB3aGljaAotICAgKiAgIG11c3QgY29ycmVzcG9uZCB0byB0aGUgc2FtZSBmb250IGFzIHRoZSBnbHlwaC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9IaW50c19BcHBseUZ1bmMpKCBUMV9IaW50cyAgICAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBUMV9IaW50c19GdW5jc1JlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIEFQSSB0byBAVDFfSGludHMgb2JqZWN0cy4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFQxIEhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIG9wZW4gOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqICAgY2xvc2UgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBjbG9zZSBhIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiAgIHN0ZW0gOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgYSBzaW1wbGUgc3RlbS4KLSAgICoKLSAgICogICBzdGVtMyA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNldCBjb3VudGVyLWNvbnRyb2xsZWQgc3RlbXMuCi0gICAqCi0gICAqICAgcmVzZXQgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byByZXNldCBzdGVtIGhpbnRzLgotICAgKgotICAgKiAgIGFwcGx5IDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdGhlIGhpbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIG91dGxpbmUuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDFfSGludHNfRnVuY3NSZWNfCi0gIHsKLSAgICBUMV9IaW50cyAgICAgICAgICAgICAgIGhpbnRzOwotICAgIFQxX0hpbnRzX09wZW5GdW5jICAgICAgb3BlbjsKLSAgICBUMV9IaW50c19DbG9zZUZ1bmMgICAgIGNsb3NlOwotICAgIFQxX0hpbnRzX1NldFN0ZW1GdW5jICAgc3RlbTsKLSAgICBUMV9IaW50c19TZXRTdGVtM0Z1bmMgIHN0ZW0zOwotICAgIFQxX0hpbnRzX1Jlc2V0RnVuYyAgICAgcmVzZXQ7Ci0gICAgVDFfSGludHNfQXBwbHlGdW5jICAgICBhcHBseTsKLQotICB9IFQxX0hpbnRzX0Z1bmNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgUFVCTElDIFRZUEUgMiBISU5UUyBSRUNPUkRFUiAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgVDJfSGludHMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgaXMgYSBoYW5kbGUgdG8gYW4gb3BhcXVlIHN0cnVjdHVyZSB1c2VkIHRvIHJlY29yZCBnbHlwaCBoaW50cwotICAgKiAgIGZyb20gYSBUeXBlIDIgY2hhcmFjdGVyIGdseXBoIGNoYXJhY3RlciBzdHJpbmcuCi0gICAqCi0gICAqICAgVGhlIG1ldGhvZHMgdXNlZCB0byBvcGVyYXRlIG9uIHRoaXMgb2JqZWN0IGFyZSBkZWZpbmVkIGJ5IHRoZQotICAgKiAgIEBUMl9IaW50c19GdW5jc1JlYyBzdHJ1Y3R1cmUuICBSZWNvcmRpbmcgZ2x5cGggaGludHMgaXMgbm9ybWFsbHkKLSAgICogICBhY2hpZXZlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgotICAgKgotICAgKiAgIC0gT3BlbiBhIG5ldyBoaW50IHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBvcGVuJyBtZXRob2QuCi0gICAqICAgICBUaGlzIHJld2luZHMgdGhlIHJlY29yZGVyIGFuZCBwcmVwYXJlIGl0IGZvciBuZXcgaW5wdXQuCi0gICAqCi0gICAqICAgLSBGb3IgZWFjaCBoaW50IGZvdW5kIGluIHRoZSBnbHlwaCBjaGFyc3RyaW5nLCBjYWxsIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqICAgICBtZXRob2QgKGBzdGVtcycsIGBoaW50bWFzaycsIGBjb3VudGVycycpLiAgTm90ZSB0aGF0IHRoZXNlCi0gICAqICAgICBmdW5jdGlvbnMgZG8gbm90IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgKgotICAgKiAgIC0gQ2xvc2UgdGhlIHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBjbG9zZScgbWV0aG9kLiAgSXQKLSAgICogICAgIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGUgaGludHMgd2VyZSBpbnZhbGlkIG9yIHNvbWV0aGluZwotICAgKiAgICAgc3RyYW5nZSBoYXBwZW5lZCAoZS5nLiwgbWVtb3J5IHNob3J0YWdlKS4KLSAgICoKLSAgICogICBUaGUgaGludHMgYWNjdW11bGF0ZWQgaW4gdGhlIG9iamVjdCBjYW4gbGF0ZXIgYmUgdXNlZCBieSB0aGUKLSAgICogICBQb3N0c2NyaXB0IGhpbnRlci4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IFQyX0hpbnRzUmVjXyogIFQyX0hpbnRzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgVDJfSGludHNfRnVuY3MKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgcG9pbnRlciB0byB0aGUgQFQyX0hpbnRzX0Z1bmNzUmVjIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIEFQSSBvZgotICAgKiAgIGEgZ2l2ZW4gQFQyX0hpbnRzIG9iamVjdC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IFQyX0hpbnRzX0Z1bmNzUmVjXyogIFQyX0hpbnRzX0Z1bmNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX09wZW5GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQyX0hpbnRzIGNsYXNzIHVzZWQgdG8gcHJlcGFyZSBpdCBmb3IgYSBuZXcgVHlwZSAyCi0gICAqICAgaGludHMgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMiBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBhbHdheXMgY2FsbCB0aGUgQFQyX0hpbnRzX0Nsb3NlRnVuYyBtZXRob2QgaW4gb3JkZXIgdG8KLSAgICogICBjbG9zZSBhbiBvcGVuZWQgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMl9IaW50c19PcGVuRnVuYykoIFQyX0hpbnRzICBoaW50cyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX1N0ZW1zRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCB0aGUgdGFibGUgb2Ygc3RlbXMgaW4KLSAgICogICBlaXRoZXIgdGhlIHZlcnRpY2FsIG9yIGhvcml6b250YWwgZGltZW5zaW9uLiAgRXF1aXZhbGVudCB0byB0aGUKLSAgICogICBgaHN0ZW0nLCBgdnN0ZW0nLCBgaHN0ZW1obScsIGFuZCBgdnN0ZW1obScgVHlwZSAyIG9wZXJhdG9ycy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGRpbWVuc2lvbiA6OgotICAgKiAgICAgMCBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoaHN0ZW0pLCAxIGZvciB2ZXJ0aWNhbCBvbmVzICh2c3RlbSkuCi0gICAqCi0gICAqICAgY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2Ygc3RlbXMuCi0gICAqCi0gICAqICAgY29vcmRzIDo6Ci0gICAqICAgICBBbiBhcnJheSBvZiBgY291bnQnIChwb3NpdGlvbixsZW5ndGgpIHBhaXJzIGluIDE2LjE2IGZvcm1hdC4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCi0gICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCi0gICAqCi0gICAqICAgVGhlcmUgYXJlIGAyKmNvdW50JyBlbGVtZW50cyBpbiB0aGUgYGNvb3JkcycgYXJyYXkuICBFYWNoIGV2ZW4KLSAgICogICBlbGVtZW50IGlzIGFuIGFic29sdXRlIHBvc2l0aW9uIGluIGZvbnQgdW5pdHMsIGVhY2ggb2RkIGVsZW1lbnQgaXMgYQotICAgKiAgIGxlbmd0aCBpbiBmb250IHVuaXRzLgotICAgKgotICAgKiAgIEEgbGVuZ3RoIGNhbiBiZSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGVpdGhlciAtMjAgb3IKLSAgICogICAtMjEuICBJdCBpcyBpbnRlcnByZXRlZCBhcyBhIGBnaG9zdCcgc3RlbSwgYWNjb3JkaW5nIHRvIHRoZSBUeXBlIDEKLSAgICogICBzcGVjaWZpY2F0aW9uLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDJfSGludHNfU3RlbXNGdW5jKSggVDJfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRpbmF0ZXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19NYXNrRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCBhIGdpdmVuIGhpbnRtYXNrICh0aGlzCi0gICAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGBoaW50bWFzaycgVHlwZSAyIG9wZXJhdG9yKS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGVuZF9wb2ludCA6OgotICAgKiAgICAgVGhlIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQKLSAgICogICAgIG9yIGFjdGl2YXRlZCBoaW50cyBhcHBseS4KLSAgICoKLSAgICogICBiaXRfY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaGludCBtYXNrLgotICAgKgotICAgKiAgIGJ5dGVzIDo6Ci0gICAqICAgICBBbiBhcnJheSBvZiBieXRlcyBtb2RlbGxpbmcgdGhlIGhpbnQgbWFzay4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAotICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCi0gICAqCi0gICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0Ci0gICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAotICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KLSAgICoKLSAgICogICBUaGUgYGJ5dGVzJyBhcnJheSBjYW4gY29tZSBkaXJlY3RseSBmcm9tIHRoZSBUeXBlIDIgY2hhcnN0cmluZyBhbmQKLSAgICogICByZXNwZWN0cyB0aGUgc2FtZSBmb3JtYXQuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMl9IaW50c19NYXNrRnVuYykoIFQyX0hpbnRzICAgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGJ5dGVzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDJfSGludHNfQ291bnRlckZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBzZXQgYSBnaXZlbiBjb3VudGVyIG1hc2sKLSAgICogICAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYGhpbnRtYXNrJyBUeXBlIDIgb3BlcmF0b3IpLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZW5kX3BvaW50IDo6Ci0gICAqICAgICBBIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQgb3IKLSAgICogICAgIGFjdGl2ZSBoaW50cyBhcHBseS4KLSAgICoKLSAgICogICBiaXRfY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaGludCBtYXNrLgotICAgKgotICAgKiAgIGJ5dGVzIDo6Ci0gICAqICAgICBBbiBhcnJheSBvZiBieXRlcyBtb2RlbGxpbmcgdGhlIGhpbnQgbWFzay4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAotICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCi0gICAqCi0gICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0Ci0gICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAotICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KLSAgICoKLSAgICogICAgVGhlIGBieXRlcycgYXJyYXkgY2FuIGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUgVHlwZSAyIGNoYXJzdHJpbmcgYW5kCi0gICAqICAgIHJlc3BlY3RzIHRoZSBzYW1lIGZvcm1hdC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQyX0hpbnRzX0NvdW50ZXJGdW5jKSggVDJfSGludHMgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX0Nsb3NlRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIGNsb3NlIGEgaGludCByZWNvcmRpbmcKLSAgICogICBzZXNzaW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZW5kX3BvaW50IDo6Ci0gICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGlucHV0IGdseXBoLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUKLSAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMl9IaW50c19DbG9zZUZ1bmMpKCBUMl9IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX0FwcGx5RnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIGFwcGx5IGhpbnRzIHRvIHRoZQotICAgKiAgIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4gIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgY2xvc2UnCi0gICAqICAgbWV0aG9kLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiAgIGdsb2JhbHMgOjoKLSAgICogICAgIFRoZSBoaW50ZXIgZ2xvYmFscyBmb3IgdGhpcyBmb250LgotICAgKgotICAgKiAgIGhpbnRfbW9kZSA6OgotICAgKiAgICAgSGludGluZyBpbmZvcm1hdGlvbi4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBPbiBpbnB1dCwgYWxsIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUgYXJlIGluIGZvbnQgY29vcmRpbmF0ZXMuIE9uCi0gICAqICAgb3V0cHV0LCB0aGV5IGFyZSBpbiAxLzY0dGggb2YgcGl4ZWxzLgotICAgKgotICAgKiAgIFRoZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlIGBnbG9iYWxzJyBvYmplY3Qgd2hpY2gKLSAgICogICBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZm9udCB0aGFuIHRoZSBnbHlwaC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMl9IaW50c19BcHBseUZ1bmMpKCBUMl9IaW50cyAgICAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBUMl9IaW50c19GdW5jc1JlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIEFQSSB0byBAVDJfSGludHMgb2JqZWN0cy4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFQyIGhpbnRzIHJlY29yZGVyIG9iamVjdC4KLSAgICoKLSAgICogICBvcGVuIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gb3BlbiBhIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiAgIGNsb3NlIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogICBzdGVtcyA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNldCB0aGUgZGltZW5zaW9uJ3Mgc3RlbXMgdGFibGUuCi0gICAqCi0gICAqICAgaGludG1hc2sgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgaGludCBtYXNrcy4KLSAgICoKLSAgICogICBjb3VudGVyIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gc2V0IGNvdW50ZXIgbWFza3MuCi0gICAqCi0gICAqICAgYXBwbHkgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0aGUgaGludHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMl9IaW50c19GdW5jc1JlY18KLSAgewotICAgIFQyX0hpbnRzICAgICAgICAgICAgICBoaW50czsKLSAgICBUMl9IaW50c19PcGVuRnVuYyAgICAgb3BlbjsKLSAgICBUMl9IaW50c19DbG9zZUZ1bmMgICAgY2xvc2U7Ci0gICAgVDJfSGludHNfU3RlbXNGdW5jICAgIHN0ZW1zOwotICAgIFQyX0hpbnRzX01hc2tGdW5jICAgICBoaW50bWFzazsKLSAgICBUMl9IaW50c19Db3VudGVyRnVuYyAgY291bnRlcjsKLSAgICBUMl9IaW50c19BcHBseUZ1bmMgICAgYXBwbHk7Ci0KLSAgfSBUMl9IaW50c19GdW5jc1JlYzsKLQotCi0gIC8qICovCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIaW50ZXJfSW50ZXJmYWNlXwotICB7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgICgqZ2V0X2dsb2JhbHNfZnVuY3MpKCBGVF9Nb2R1bGUgIG1vZHVsZSApOwotICAgIFQxX0hpbnRzX0Z1bmNzICAgICAoKmdldF90MV9mdW5jcykgICAgICggRlRfTW9kdWxlICBtb2R1bGUgKTsKLSAgICBUMl9IaW50c19GdW5jcyAgICAgKCpnZXRfdDJfZnVuY3MpICAgICAoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLSAgfSBQU0hpbnRlcl9JbnRlcmZhY2U7Ci0KLSAgdHlwZWRlZiBQU0hpbnRlcl9JbnRlcmZhY2UqICBQU0hpbnRlcl9TZXJ2aWNlOwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfUFNISU5URVJfSU5URVJGQUNFKCAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF90MV9mdW5jc18sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF90Ml9mdW5jc18gKSAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgUFNIaW50ZXJfSW50ZXJmYWNlICBjbGFzc18gPSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF90MV9mdW5jc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF90Ml9mdW5jc18gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9QU0hJTlRFUl9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X3QxX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfdDJfZnVuY3NfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hpbnRlcl9JbnRlcmZhY2UqICBjbGF6eiApICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfZ2xvYmFsc19mdW5jcyA9IGdldF9nbG9iYWxzX2Z1bmNzXzsgICAgICAgICBcCi0gICAgY2xhenotPmdldF90MV9mdW5jcyAgICAgID0gZ2V0X3QxX2Z1bmNzXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3QyX2Z1bmNzICAgICAgPSBnZXRfdDJfZnVuY3NfOyAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBQU0hJTlRTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZWJmNjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmJkZi5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZiZGYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBCREYgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWQkRGX0hfCi0jZGVmaW5lIFNWQkRGX0hfCi0KLSNpbmNsdWRlIEZUX0JERl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfQkRGICAiYmRmIgotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9CREZfR2V0Q2hhcnNldElkRnVuYykoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X3JlZ2lzdHJ5ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0JERl9HZXRQcm9wZXJ0eUZ1bmMpKCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICBwcm9wX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJERl9Qcm9wZXJ0eVJlYyAgKmFwcm9wZXJ0eSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIEJERiApCi0gIHsKLSAgICBGVF9CREZfR2V0Q2hhcnNldElkRnVuYyAgZ2V0X2NoYXJzZXRfaWQ7Ci0gICAgRlRfQkRGX0dldFByb3BlcnR5RnVuYyAgIGdldF9wcm9wZXJ0eTsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfQkRGUmVjKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NoYXJzZXRfaWRfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcm9wZXJ0eV8gKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfQkRGUmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9jaGFyc2V0X2lkXywgZ2V0X3Byb3BlcnR5XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9CREZSZWMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2hhcnNldF9pZF8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Byb3BlcnR5XyApICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX0JERlJlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfY2hhcnNldF9pZCA9IGdldF9jaGFyc2V0X2lkXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3Byb3BlcnR5ICAgPSBnZXRfcHJvcGVydHlfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFNWQkRGX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTk0ZDguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZjaWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBDSUQgZm9udCBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEZXJlayBDbGVnZyBhbmQgTWljaGFlbCBUb2Z0ZGFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWQ0lEX0hfCi0jZGVmaW5lIFNWQ0lEX0hfCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9DSUQgICJDSUQiCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0NJRF9HZXRSZWdpc3RyeU9yZGVyaW5nU3VwcGxlbWVudEZ1bmMpKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqb3JkZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqc3VwcGxlbWVudCApOwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfQ0lEX0dldElzSW50ZXJuYWxseUNJREtleWVkRnVuYykoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAqaXNfY2lkICk7Ci0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9DSURfR2V0Q0lERnJvbUdseXBoSW5kZXhGdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmNpZCApOwotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBDSUQgKQotICB7Ci0gICAgRlRfQ0lEX0dldFJlZ2lzdHJ5T3JkZXJpbmdTdXBwbGVtZW50RnVuYyAgZ2V0X3JvczsKLSAgICBGVF9DSURfR2V0SXNJbnRlcm5hbGx5Q0lES2V5ZWRGdW5jICAgICAgICBnZXRfaXNfY2lkOwotICAgIEZUX0NJRF9HZXRDSURGcm9tR2x5cGhJbmRleEZ1bmMgICAgICAgICAgIGdldF9jaWRfZnJvbV9nbHlwaF9pbmRleDsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfQ0lEUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jvc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9pc19jaWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXhfICkgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX0NJRFJlYyBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfcm9zXywgZ2V0X2lzX2NpZF8sIGdldF9jaWRfZnJvbV9nbHlwaF9pbmRleF8gICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfQ0lEUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jvc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9pc19jaWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXhfICkgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX0NJRFJlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9yb3MgICAgICAgICAgICAgICAgICA9IGdldF9yb3NfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfaXNfY2lkICAgICAgICAgICAgICAgPSBnZXRfaXNfY2lkXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2NpZF9mcm9tX2dseXBoX2luZGV4ID0gZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4XzsgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFNWQ0lEX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Zm50Zm10LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Zm50Zm10LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NmQ5MjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZmbnRmbXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBmb250IGZvcm1hdCBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWRk5URk1UX0hfCi0jZGVmaW5lIFNWRk5URk1UX0hfCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIEEgdHJpdmlhbCBzZXJ2aWNlIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIG9mIGEgZmFjZSdzIGZvbnQgZHJpdmVyLAotICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBYRnJlZTg2IG5vbWVuY2xhdHVyZS4gIE5vdGUgdGhhdCB0aGUgc2VydmljZSBkYXRhCi0gICAqICBpcyBhIHNpbXBsZSBjb25zdGFudCBzdHJpbmcgcG9pbnRlci4KLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCAgImZvbnQtZm9ybWF0IgotCi0jZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1RSVUVUWVBFICAiVHJ1ZVR5cGUiCi0jZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1RZUEVfMSAgICAiVHlwZSAxIgotI2RlZmluZSBGVF9GT05UX0ZPUk1BVF9CREYgICAgICAgIkJERiIKLSNkZWZpbmUgRlRfRk9OVF9GT1JNQVRfUENGICAgICAgICJQQ0YiCi0jZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1RZUEVfNDIgICAiVHlwZSA0MiIKLSNkZWZpbmUgRlRfRk9OVF9GT1JNQVRfQ0lEICAgICAgICJDSUQgVHlwZSAxIgotI2RlZmluZSBGVF9GT05UX0ZPUk1BVF9DRkYgICAgICAgIkNGRiIKLSNkZWZpbmUgRlRfRk9OVF9GT1JNQVRfUEZSICAgICAgICJQRlIiCi0jZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1dJTkZOVCAgICAiV2luZG93cyBGTlQiCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFNWRk5URk1UX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZDEzNjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmdsZGljdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZnbGRpY3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCBkaWN0aW9uYXJ5IHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWR0xESUNUX0hfCi0jZGVmaW5lIFNWR0xESUNUX0hfCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIEEgc2VydmljZSB1c2VkIHRvIHJldHJpZXZlIGdseXBoIG5hbWVzLCBhcyB3ZWxsIGFzIHRvIGZpbmQgdGhlCi0gICAqICBpbmRleCBvZiBhIGdpdmVuIGdseXBoIG5hbWUgaW4gYSBmb250LgotICAgKgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QgICJnbHlwaC1kaWN0IgotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0dseXBoRGljdF9HZXROYW1lRnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKTsKLQotICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpGVF9HbHlwaERpY3RfTmFtZUluZGV4RnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggR2x5cGhEaWN0ICkKLSAgewotICAgIEZUX0dseXBoRGljdF9HZXROYW1lRnVuYyAgICBnZXRfbmFtZTsKLSAgICBGVF9HbHlwaERpY3RfTmFtZUluZGV4RnVuYyAgbmFtZV9pbmRleDsgIC8qIG9wdGlvbmFsICovCi0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0dMWVBIRElDVFJFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfaW5kZXhfKSAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX0dseXBoRGljdFJlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9uYW1lXywgbmFtZV9pbmRleF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfR0xZUEhESUNUUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9pbmRleF8pICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgbGlicmFyeSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9HbHlwaERpY3RSZWMqICBjbGF6eiApICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X25hbWUgICA9IGdldF9uYW1lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5uYW1lX2luZGV4ID0gbmFtZV9pbmRleF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFNWR0xESUNUX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z3h2YWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJmYTk3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZneHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKHNwZWNpZmljYXRpb24pLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBTVkdYVkFMX0hfCi0jZGVmaW5lIFNWR1hWQUxfSF8KLQotI2luY2x1ZGUgRlRfR1hfVkFMSURBVEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVkFMSURBVEVfSAotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfR1hfVkFMSURBVEUgICAgICAgICAgICJ0cnVldHlwZWd4LXZhbGlkYXRlIgotI2RlZmluZSBGVF9TRVJWSUNFX0lEX0NMQVNTSUNLRVJOX1ZBTElEQVRFICAiY2xhc3NpY2tlcm4tdmFsaWRhdGUiCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKmd4dl92YWxpZGF0ZV9mdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ3hfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGVzW0ZUX1ZBTElEQVRFX0dYX0xFTkdUSF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgdGFibGVfbGVuZ3RoICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqY2tlcm5fdmFsaWRhdGVfZnVuYykoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgY2tlcm5fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqY2tlcm5fdGFibGUgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBHWHZhbGlkYXRlICkKLSAgewotICAgIGd4dl92YWxpZGF0ZV9mdW5jICB2YWxpZGF0ZTsKLSAgfTsKLQotICBGVF9ERUZJTkVfU0VSVklDRSggQ0tFUk52YWxpZGF0ZSApCi0gIHsKLSAgICBja2Vybl92YWxpZGF0ZV9mdW5jICB2YWxpZGF0ZTsKLSAgfTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogU1ZHWFZBTF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmtlcm4uaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzQ0ZTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmtlcm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2a2Vybi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgS2VybmluZyBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBTVktFUk5fSF8KLSNkZWZpbmUgU1ZLRVJOX0hfCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX0tFUk5JTkcgICJrZXJuaW5nIgotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0tlcm5pbmdfVHJhY2tHZXRGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICBwb2ludF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGFrZXJuaW5nICk7Ci0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIEtlcm5pbmcgKQotICB7Ci0gICAgRlRfS2VybmluZ19UcmFja0dldEZ1bmMgIGdldF90cmFjazsKLSAgfTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogU1ZLRVJOX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bWV0cmljLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bWV0cmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmN2Q1ZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1ldHJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2bWV0cmljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgc2VydmljZXMgZm9yIG1ldHJpY3MgdmFyaWF0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxNi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBTVk1FVFJJQ19IXwotI2RlZmluZSBTVk1FVFJJQ19IXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qCi0gICAqICBBIHNlcnZpY2UgdG8gbWFuYWdlIHRoZSBgSFZBUiwgYE1WQVInLCBhbmQgYFZWQVInIE9wZW5UeXBlIHRhYmxlcy4KLSAgICoKLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9NRVRSSUNTX1ZBUklBVElPTlMgICJtZXRyaWNzLXZhcmlhdGlvbnMiCi0KLQotICAvKiBIVkFSICovCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0hBZHZhbmNlX0FkanVzdF9GdW5jKSggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgKmF2YWx1ZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9MU0JfQWRqdXN0X0Z1bmMpKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICphdmFsdWUgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUlNCX0FkanVzdF9GdW5jKSggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAqYXZhbHVlICk7Ci0KLSAgLyogVlZBUiAqLwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9WQWR2YW5jZV9BZGp1c3RfRnVuYykoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICphdmFsdWUgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfVFNCX0FkanVzdF9GdW5jKSggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAqYXZhbHVlICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0JTQl9BZGp1c3RfRnVuYykoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgKmF2YWx1ZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9WT3JnX0FkanVzdF9GdW5jKSggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICphdmFsdWUgKTsKLQotICAvKiBNVkFSICovCi0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfTWV0cmljc19BZGp1c3RfRnVuYykoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBNZXRyaWNzVmFyaWF0aW9ucyApCi0gIHsKLSAgICBGVF9IQWR2YW5jZV9BZGp1c3RfRnVuYyAgaGFkdmFuY2VfYWRqdXN0OwotICAgIEZUX0xTQl9BZGp1c3RfRnVuYyAgICAgICBsc2JfYWRqdXN0OwotICAgIEZUX1JTQl9BZGp1c3RfRnVuYyAgICAgICByc2JfYWRqdXN0OwotCi0gICAgRlRfVkFkdmFuY2VfQWRqdXN0X0Z1bmMgIHZhZHZhbmNlX2FkanVzdDsKLSAgICBGVF9UU0JfQWRqdXN0X0Z1bmMgICAgICAgdHNiX2FkanVzdDsKLSAgICBGVF9CU0JfQWRqdXN0X0Z1bmMgICAgICAgYnNiX2FkanVzdDsKLSAgICBGVF9WT3JnX0FkanVzdF9GdW5jICAgICAgdm9yZ19hZGp1c3Q7Ci0KLSAgICBGVF9NZXRyaWNzX0FkanVzdF9GdW5jICAgbWV0cmljc19hZGp1c3Q7Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX01FVFJJQ1NWQVJJQVRJT05TUkVDKCBjbGFzc18sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFkdmFuY2VfYWRqdXN0XywgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzYl9hZGp1c3RfLCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2JfYWRqdXN0XywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFkdmFuY2VfYWRqdXN0XywgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzYl9hZGp1c3RfLCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic2JfYWRqdXN0XywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yZ19hZGp1c3RfLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3NfYWRqdXN0XyAgKSBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zUmVjICBjbGFzc18gPSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBoYWR2YW5jZV9hZGp1c3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbHNiX2FkanVzdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJzYl9hZGp1c3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2YWR2YW5jZV9hZGp1c3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHNiX2FkanVzdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJzYl9hZGp1c3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2b3JnX2FkanVzdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbWV0cmljc19hZGp1c3RfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX01FVFJJQ1NWQVJJQVRJT05TUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFkdmFuY2VfYWRqdXN0XywgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzYl9hZGp1c3RfLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2JfYWRqdXN0XywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFkdmFuY2VfYWRqdXN0XywgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzYl9hZGp1c3RfLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic2JfYWRqdXN0XywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yZ19hZGp1c3RfLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3NfYWRqdXN0XyAgKSAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfTWV0cmljc1ZhcmlhdGlvbnNSZWMqICBjbGF6eiApIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmhhZHZhbmNlX2FkanVzdCA9IGhhZHZhbmNlX2FkanVzdF87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sc2JfYWRqdXN0ICAgICAgPSBsc2JfYWRqdXN0XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cnNiX2FkanVzdCAgICAgID0gcnNiX2FkanVzdF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnZhZHZhbmNlX2FkanVzdCA9IHZhZHZhbmNlX2FkanVzdF87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT50c2JfYWRqdXN0ICAgICAgPSB0c2JfYWRqdXN0XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+YnNiX2FkanVzdCAgICAgID0gYnNiX2FkanVzdF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnZvcmdfYWRqdXN0ICAgICA9IHZvcmdfYWRqdXN0XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tZXRyaWNzX2FkanVzdCAgPSBtZXRyaWNzX2FkanVzdF87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFNWTUVUUklDX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDUxY2Q5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2bW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgTXVsdGlwbGUgTWFzdGVycyBhbmQgR1ggdmFyIHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uKS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBTVk1NX0hfCi0jZGVmaW5lIFNWTU1fSF8KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKgotICAgKiAgQSBzZXJ2aWNlIHVzZWQgdG8gbWFuYWdlIG11bHRpcGxlLW1hc3RlcnMgZGF0YSBpbiBhIGdpdmVuIGZhY2UuCi0gICAqCi0gICAqICBTZWUgdGhlIHJlbGF0ZWQgQVBJcyBpbiBgZnRtbS5oJyAoRlRfTVVMVElQTEVfTUFTVEVSU19IKS4KLSAgICoKLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTICAibXVsdGktbWFzdGVycyIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HZXRfTU1fRnVuYykoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9NdWx0aV9NYXN0ZXIqICBtYXN0ZXIgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfR2V0X01NX1Zhcl9GdW5jKSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU1fVmFyKiAgKm1hc3RlciApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TZXRfTU1fRGVzaWduX0Z1bmMpKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NldF9WYXJfRGVzaWduX0Z1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2V0X01NX0JsZW5kX0Z1bmMpKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HZXRfVmFyX0Rlc2lnbl9GdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0dldF9NTV9CbGVuZF9GdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfR2V0X1Zhcl9CbGVuZF9GdW5jKSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgKm51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICAgKmNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogICAqbm9ybWFsaXplZGNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbW1fdmFyICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfRG9uZV9CbGVuZF9GdW5jKSggRlRfRmFjZSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIE11bHRpTWFzdGVycyApCi0gIHsKLSAgICBGVF9HZXRfTU1fRnVuYyAgICAgICAgICBnZXRfbW07Ci0gICAgRlRfU2V0X01NX0Rlc2lnbl9GdW5jICAgc2V0X21tX2Rlc2lnbjsKLSAgICBGVF9TZXRfTU1fQmxlbmRfRnVuYyAgICBzZXRfbW1fYmxlbmQ7Ci0gICAgRlRfR2V0X01NX0JsZW5kX0Z1bmMgICAgZ2V0X21tX2JsZW5kOwotICAgIEZUX0dldF9NTV9WYXJfRnVuYyAgICAgIGdldF9tbV92YXI7Ci0gICAgRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYyAgc2V0X3Zhcl9kZXNpZ247Ci0gICAgRlRfR2V0X1Zhcl9EZXNpZ25fRnVuYyAgZ2V0X3Zhcl9kZXNpZ247Ci0KLSAgICAvKiBmb3IgaW50ZXJuYWwgdXNlOyBvbmx5IG5lZWRlZCBmb3IgY29kZSBzaGFyaW5nIGJldHdlZW4gbW9kdWxlcyAqLwotICAgIEZUX0dldF9WYXJfQmxlbmRfRnVuYyAgIGdldF92YXJfYmxlbmQ7Ci0gICAgRlRfRG9uZV9CbGVuZF9GdW5jICAgICAgZG9uZV9ibGVuZDsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfTVVMVElNQVNURVJTUkVDKCBjbGFzc18sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tXywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9tbV9kZXNpZ25fLCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbW1fYmxlbmRfLCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tX2JsZW5kXywgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV92YXJfLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFyX2Rlc2lnbl8sICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Zhcl9kZXNpZ25fLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92YXJfYmxlbmRfLCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lX2JsZW5kXyAgICAgKSBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyAgY2xhc3NfID0gICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfbW1fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2V0X21tX2Rlc2lnbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNldF9tbV9ibGVuZF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfbW1fYmxlbmRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X21tX3Zhcl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNldF92YXJfZGVzaWduXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfdmFyX2Rlc2lnbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X3Zhcl9ibGVuZF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfYmxlbmRfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9NVUxUSU1BU1RFUlNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tXywgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbW1fZGVzaWduXywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9tbV9ibGVuZF8sICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tX2JsZW5kXywgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbW1fdmFyXywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF92YXJfZGVzaWduXywgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Zhcl9kZXNpZ25fLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmFyX2JsZW5kXywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfYmxlbmRfICkgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyogIGNsYXp6ICkgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9tbSAgICAgICAgID0gZ2V0X21tXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X21tX2Rlc2lnbiAgPSBzZXRfbW1fZGVzaWduXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfbW1fYmxlbmQgICA9IHNldF9tbV9ibGVuZF87ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9tbV9ibGVuZCAgID0gZ2V0X21tX2JsZW5kXzsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X21tX3ZhciAgICAgPSBnZXRfbW1fdmFyXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfdmFyX2Rlc2lnbiA9IHNldF92YXJfZGVzaWduXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF92YXJfZGVzaWduID0gZ2V0X3Zhcl9kZXNpZ25fOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3Zhcl9ibGVuZCAgPSBnZXRfdmFyX2JsZW5kXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lX2JsZW5kICAgICA9IGRvbmVfYmxlbmRfOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBTVk1NX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2b3R2YWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzg0YWJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZvdHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBPcGVuVHlwZSB2YWxpZGF0aW9uIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWT1RWQUxfSF8KLSNkZWZpbmUgU1ZPVFZBTF9IXwotCi0jaW5jbHVkZSBGVF9PUEVOVFlQRV9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9PUEVOVFlQRV9WQUxJREFURSAgIm9wZW50eXBlLXZhbGlkYXRlIgotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKm90dl92YWxpZGF0ZV9mdW5jKSggRlRfRmFjZSB2b2xhdGlsZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIG90X2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAqYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmdkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICpncG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAqZ3N1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmpzdGYgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBPVHZhbGlkYXRlICkKLSAgewotICAgIG90dl92YWxpZGF0ZV9mdW5jICB2YWxpZGF0ZTsKLSAgfTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogU1ZPVFZBTF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWExODJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2cGZyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJbnRlcm5hbCBQRlIgc2VydmljZSBmdW5jdGlvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBTVlBGUl9IXwotI2RlZmluZSBTVlBGUl9IXwotCi0jaW5jbHVkZSBGVF9QRlJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BGUl9NRVRSSUNTICAicGZyLW1ldHJpY3MiCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUEZSX0dldE1ldHJpY3NGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmF4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYXlfc2NhbGUgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUEZSX0dldEtlcm5pbmdGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgKmF2ZWN0b3IgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUEZSX0dldEFkdmFuY2VGdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAqYWFkdmFuY2UgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQZnJNZXRyaWNzICkKLSAgewotICAgIEZUX1BGUl9HZXRNZXRyaWNzRnVuYyAgZ2V0X21ldHJpY3M7Ci0gICAgRlRfUEZSX0dldEtlcm5pbmdGdW5jICBnZXRfa2VybmluZzsKLSAgICBGVF9QRlJfR2V0QWR2YW5jZUZ1bmMgIGdldF9hZHZhbmNlOwotCi0gIH07Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBTVlBGUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJjZGVjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2cG9zdG5tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgUG9zdFNjcmlwdCBuYW1lIHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBTVlBPU1ROTV9IXwotI2RlZmluZSBTVlBPU1ROTV9IXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKgotICAgKiAgQSB0cml2aWFsIHNlcnZpY2UgdXNlZCB0byByZXRyaWV2ZSB0aGUgUG9zdFNjcmlwdCBuYW1lIG9mIGEgZ2l2ZW4KLSAgICogIGZvbnQgd2hlbiBhdmFpbGFibGUuICBUaGUgYGdldF9uYW1lJyBmaWVsZCBzaG91bGQgbmV2ZXIgYmUgTlVMTC4KLSAgICoKLSAgICogIFRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGNhbiByZXR1cm4gTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoZQotICAgKiAgUG9zdFNjcmlwdCBuYW1lIGlzIG5vdCBhdmFpbGFibGUuCi0gICAqCi0gICAqICBUaGUgbmFtZSBpcyBvd25lZCBieSB0aGUgZmFjZSBhbmQgd2lsbCBiZSBkZXN0cm95ZWQgd2l0aCBpdC4KLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSAgInBvc3RzY3JpcHQtZm9udC1uYW1lIgotCi0KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKkZUX1BzTmFtZV9HZXRGdW5jKSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFBzRm9udE5hbWUgKQotICB7Ci0gICAgRlRfUHNOYW1lX0dldEZ1bmMgIGdldF9wc19mb250X25hbWU7Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTRk9OVE5BTUVSRUMoIGNsYXNzXywgZ2V0X3BzX2ZvbnRfbmFtZV8gKSBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X3BzX2ZvbnRfbmFtZV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNGT05UTkFNRVJFQyggY2xhc3NfLCBnZXRfcHNfZm9udF9uYW1lXyApIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICBsaWJyYXJ5LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMqICBjbGF6eiApICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3BzX2ZvbnRfbmFtZSA9IGdldF9wc19mb250X25hbWVfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogU1ZQT1NUTk1fSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHJvcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjJkNGVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnByb3AuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHByb3BlcnR5IHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgU1ZQUk9QX0hfCi0jZGVmaW5lIFNWUFJPUF9IXwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTICAicHJvcGVydGllcyIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9Qcm9wZXJ0aWVzX1NldEZ1bmMpKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgdmFsdWVfaXNfc3RyaW5nICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1Byb3BlcnRpZXNfR2V0RnVuYykoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHZhbHVlICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggUHJvcGVydGllcyApCi0gIHsKLSAgICBGVF9Qcm9wZXJ0aWVzX1NldEZ1bmMgIHNldF9wcm9wZXJ0eTsKLSAgICBGVF9Qcm9wZXJ0aWVzX0dldEZ1bmMgIGdldF9wcm9wZXJ0eTsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFJPUEVSVElFU1JFQyggY2xhc3NfLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcm9wZXJ0eV8sICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJvcGVydHlfICkgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHJvcGVydGllc1JlYyAgY2xhc3NfID0gICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNldF9wcm9wZXJ0eV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfcHJvcGVydHlfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFJPUEVSVElFU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcm9wZXJ0eV8sICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJvcGVydHlfICkgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfU2VydmljZV9Qcm9wZXJ0aWVzUmVjKiAgY2xhenogKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X3Byb3BlcnR5ID0gc2V0X3Byb3BlcnR5XzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9wcm9wZXJ0eSA9IGdldF9wcm9wZXJ0eV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBTVlBST1BfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyMTIyZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Zwc2NtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBQb3N0U2NyaXB0IGNoYXJtYXAgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWUFNDTUFQX0hfCi0jZGVmaW5lIFNWUFNDTUFQX0hfCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0NNQVBTICAicG9zdHNjcmlwdC1jbWFwcyIKLQotCi0gIC8qCi0gICAqICBBZG9iZSBnbHlwaCBuYW1lIHRvIHVuaWNvZGUgdmFsdWUuCi0gICAqLwotICB0eXBlZGVmIEZUX1VJbnQzMgotICAoKlBTX1VuaWNvZGVfVmFsdWVGdW5jKSggY29uc3QgY2hhciogIGdseXBoX25hbWUgKTsKLQotICAvKgotICAgKiAgTWFjaW50b3NoIG5hbWUgaWQgdG8gZ2x5cGggbmFtZS4gIE5VTEwgaWYgaW52YWxpZCBpbmRleC4KLSAgICovCi0gIHR5cGVkZWYgY29uc3QgY2hhcioKLSAgKCpQU19NYWNpbnRvc2hfTmFtZUZ1bmMpKCBGVF9VSW50ICBuYW1lX2luZGV4ICk7Ci0KLSAgLyoKLSAgICogIEFkb2JlIHN0YW5kYXJkIHN0cmluZyBJRCB0byBnbHlwaCBuYW1lLiAgTlVMTCBpZiBpbnZhbGlkIGluZGV4LgotICAgKi8KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKlBTX0Fkb2JlX1N0ZF9TdHJpbmdzRnVuYykoIEZUX1VJbnQgIHN0cmluZ19pbmRleCApOwotCi0KLSAgLyoKLSAgICogIFNpbXBsZSB1bmljb2RlIC0+IGdseXBoIGluZGV4IGNoYXJtYXAgYnVpbHQgZnJvbSBmb250IGdseXBoIG5hbWVzCi0gICAqICB0YWJsZS4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19VbmlNYXBfCi0gIHsKLSAgICBGVF9VSW50MzIgIHVuaWNvZGU7ICAgICAgLyogYml0IDMxIHNldDogaXMgZ2x5cGggdmFyaWFudCAqLwotICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXg7Ci0KLSAgfSBQU19VbmlNYXA7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBQU19Vbmljb2Rlc1JlY18qICBQU19Vbmljb2RlczsKLQotICB0eXBlZGVmIHN0cnVjdCAgUFNfVW5pY29kZXNSZWNfCi0gIHsKLSAgICBGVF9DTWFwUmVjICBjbWFwOwotICAgIEZUX1VJbnQgICAgIG51bV9tYXBzOwotICAgIFBTX1VuaU1hcCogIG1hcHM7Ci0KLSAgfSBQU19Vbmljb2Rlc1JlYzsKLQotCi0gIC8qCi0gICAqICBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBnbHlwaCBuYW1lIGZvciBhIGdpdmVuIGluZGV4LiAgUmV0dXJucwotICAgKiAgTlVMTCBpZiBpbnZhbGlkIGluZGV4LgotICAgKi8KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKlBTX0dldEdseXBoTmFtZUZ1bmMpKCBGVF9Qb2ludGVyICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBzdHJpbmdfaW5kZXggKTsKLQotICAvKgotICAgKiAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlbGVhc2UgdGhlIGdseXBoIG5hbWUgcmV0dXJuZWQgYnkKLSAgICogIFBTX0dldEdseXBoTmFtZUZ1bmMsIHdoZW4gbmVlZGVkCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpQU19GcmVlR2x5cGhOYW1lRnVuYykoIEZUX1BvaW50ZXIgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbmFtZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpQU19Vbmljb2Rlc19Jbml0RnVuYykoIEZUX01lbW9yeSAgICAgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Vbmljb2RlcyAgICAgICAgICAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0dldEdseXBoTmFtZUZ1bmMgICBnZXRfZ2x5cGhfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0ZyZWVHbHlwaE5hbWVGdW5jICBmcmVlX2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgICAgICAgZ2x5cGhfZGF0YSApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKlBTX1VuaWNvZGVzX0NoYXJJbmRleEZ1bmMpKCBQU19Vbmljb2RlcyAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICB1bmljb2RlICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50MzIKLSAgKCpQU19Vbmljb2Rlc19DaGFyTmV4dEZ1bmMpKCBQU19Vbmljb2RlcyAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnVuaWNvZGUgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQc0NNYXBzICkKLSAgewotICAgIFBTX1VuaWNvZGVfVmFsdWVGdW5jICAgICAgIHVuaWNvZGVfdmFsdWU7Ci0KLSAgICBQU19Vbmljb2Rlc19Jbml0RnVuYyAgICAgICB1bmljb2Rlc19pbml0OwotICAgIFBTX1VuaWNvZGVzX0NoYXJJbmRleEZ1bmMgIHVuaWNvZGVzX2NoYXJfaW5kZXg7Ci0gICAgUFNfVW5pY29kZXNfQ2hhck5leHRGdW5jICAgdW5pY29kZXNfY2hhcl9uZXh0OwotCi0gICAgUFNfTWFjaW50b3NoX05hbWVGdW5jICAgICAgbWFjaW50b3NoX25hbWU7Ci0gICAgUFNfQWRvYmVfU3RkX1N0cmluZ3NGdW5jICAgYWRvYmVfc3RkX3N0cmluZ3M7Ci0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQqICAgICAgYWRvYmVfc3RkX2VuY29kaW5nOwotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiAgICAgIGFkb2JlX2V4cGVydF9lbmNvZGluZzsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNDTUFQU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVfdmFsdWVfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19pbml0XywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfY2hhcl9pbmRleF8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2NoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNpbnRvc2hfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfc3RkX3N0cmluZ3NfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX3N0ZF9lbmNvZGluZ18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9leHBlcnRfZW5jb2RpbmdfICkgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNDTWFwc1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVuaWNvZGVfdmFsdWVfLCB1bmljb2Rlc19pbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1bmljb2Rlc19jaGFyX2luZGV4XywgdW5pY29kZXNfY2hhcl9uZXh0XywgbWFjaW50b3NoX25hbWVfLCAgICAgICAgICAgICBcCi0gICAgYWRvYmVfc3RkX3N0cmluZ3NfLCBhZG9iZV9zdGRfZW5jb2RpbmdfLCBhZG9iZV9leHBlcnRfZW5jb2RpbmdfICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTQ01BUFNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlX3ZhbHVlXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2NoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19jaGFyX25leHRfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaW50b3NoX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX3N0ZF9zdHJpbmdzXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9zdGRfZW5jb2RpbmdfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfZXhwZXJ0X2VuY29kaW5nXyApICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzQ01hcHNSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnVuaWNvZGVfdmFsdWUgICAgICAgICA9IHVuaWNvZGVfdmFsdWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT51bmljb2Rlc19pbml0ICAgICAgICAgPSB1bmljb2Rlc19pbml0XzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dW5pY29kZXNfY2hhcl9pbmRleCAgID0gdW5pY29kZXNfY2hhcl9pbmRleF87ICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnVuaWNvZGVzX2NoYXJfbmV4dCAgICA9IHVuaWNvZGVzX2NoYXJfbmV4dF87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tYWNpbnRvc2hfbmFtZSAgICAgICAgPSBtYWNpbnRvc2hfbmFtZV87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+YWRvYmVfc3RkX3N0cmluZ3MgICAgID0gYWRvYmVfc3RkX3N0cmluZ3NfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmFkb2JlX3N0ZF9lbmNvZGluZyAgICA9IGFkb2JlX3N0ZF9lbmNvZGluZ187ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5hZG9iZV9leHBlcnRfZW5jb2RpbmcgPSBhZG9iZV9leHBlcnRfZW5jb2RpbmdfOyAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogU1ZQU0NNQVBfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyMGNlNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Zwc2luZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBQb3N0U2NyaXB0IGluZm8gc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWUFNJTkZPX0hfCi0jZGVmaW5lIFNWUFNJTkZPX0hfCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8gICJwb3N0c2NyaXB0LWluZm8iCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqUFNfR2V0Rm9udEluZm9GdW5jKSggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvUmVjKiAgYWZvbnRfaW5mbyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpQU19HZXRGb250RXh0cmFGdW5jKSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEV4dHJhUmVjKiAgYWZvbnRfZXh0cmEgKTsKLQotICB0eXBlZGVmIEZUX0ludAotICAoKlBTX0hhc0dseXBoTmFtZXNGdW5jKSggRlRfRmFjZSAgZmFjZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpQU19HZXRGb250UHJpdmF0ZUZ1bmMpKCBGVF9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlUmVjKiAgYWZvbnRfcHJpdmF0ZSApOwotCi0gIHR5cGVkZWYgRlRfTG9uZwotICAoKlBTX0dldEZvbnRWYWx1ZUZ1bmMpKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0RpY3RfS2V5cyAga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICB2YWx1ZV9sZW4gKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQc0luZm8gKQotICB7Ci0gICAgUFNfR2V0Rm9udEluZm9GdW5jICAgICBwc19nZXRfZm9udF9pbmZvOwotICAgIFBTX0dldEZvbnRFeHRyYUZ1bmMgICAgcHNfZ2V0X2ZvbnRfZXh0cmE7Ci0gICAgUFNfSGFzR2x5cGhOYW1lc0Z1bmMgICBwc19oYXNfZ2x5cGhfbmFtZXM7Ci0gICAgUFNfR2V0Rm9udFByaXZhdGVGdW5jICBwc19nZXRfZm9udF9wcml2YXRlOwotICAgIFBTX0dldEZvbnRWYWx1ZUZ1bmMgICAgcHNfZ2V0X2ZvbnRfdmFsdWU7Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTSU5GT1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9pbmZvXywgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2dldF9mb250X2V4dHJhXywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2dseXBoX25hbWVzXywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9wcml2YXRlXywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb250X3ZhbHVlXyApICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzSW5mb1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9mb250X2luZm9fLCBwc19nZXRfZm9udF9leHRyYV8sIGhhc19nbHlwaF9uYW1lc18sICAgICAgICBcCi0gICAgZ2V0X2ZvbnRfcHJpdmF0ZV8sIGdldF9mb250X3ZhbHVlXyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0lORk9SRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbnRfaW5mb18sICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19nZXRfZm9udF9leHRyYV8sICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19nbHlwaF9uYW1lc18sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbnRfcHJpdmF0ZV8sICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF92YWx1ZV8gKSAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzSW5mb1JlYyogIGNsYXp6ICkgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5wc19nZXRfZm9udF9pbmZvICAgID0gZ2V0X2ZvbnRfaW5mb187ICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnBzX2dldF9mb250X2V4dHJhICAgPSBwc19nZXRfZm9udF9leHRyYV87ICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cHNfaGFzX2dseXBoX25hbWVzICA9IGhhc19nbHlwaF9uYW1lc187ICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5wc19nZXRfZm9udF9wcml2YXRlID0gZ2V0X2ZvbnRfcHJpdmF0ZV87ICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnBzX2dldF9mb250X3ZhbHVlICAgPSBnZXRfZm9udF92YWx1ZV87ICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogU1ZQU0lORk9fSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQxOGU0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZzZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBTRk5UIHRhYmxlIGxvYWRpbmcgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWU0ZOVF9IXwotI2RlZmluZSBTVlNGTlRfSF8KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlLgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUgICJzZm50LXRhYmxlIgotCi0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfTG9hZF9TZm50X1RhYmxlKCkuCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU0ZOVF9UYWJsZUxvYWRGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfR2V0X1NmbnRfVGFibGUoKS4KLSAgICovCi0gIHR5cGVkZWYgdm9pZCoKLSAgKCpGVF9TRk5UX1RhYmxlR2V0RnVuYykoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2ZudF9UYWcgIHRhZyApOwotCi0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfU2ZudF9UYWJsZV9JbmZvKCkuCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU0ZOVF9UYWJsZUluZm9GdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggU0ZOVF9UYWJsZSApCi0gIHsKLSAgICBGVF9TRk5UX1RhYmxlTG9hZEZ1bmMgIGxvYWRfdGFibGU7Ci0gICAgRlRfU0ZOVF9UYWJsZUdldEZ1bmMgICBnZXRfdGFibGU7Ci0gICAgRlRfU0ZOVF9UYWJsZUluZm9GdW5jICB0YWJsZV9pbmZvOwotICB9OwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9TRk5UX1RBQkxFUkVDKCBjbGFzc18sIGxvYWRfLCBnZXRfLCBpbmZvXyApICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1NGTlRfVGFibGVSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfLCBnZXRfLCBpbmZvXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfU0ZOVF9UQUJMRVJFQyggY2xhc3NfLCBsb2FkXywgZ2V0XywgaW5mb18gKSBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyogIGNsYXp6ICkgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfdGFibGUgPSBsb2FkXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfdGFibGUgID0gZ2V0XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dGFibGVfaW5mbyA9IGluZm9fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFNWU0ZOVF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY3ZmVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnR0Y21hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFRydWVUeXBlL3NmbnQgY21hcCBleHRyYSBpbmZvcm1hdGlvbiBzZXJ2aWNlLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkaGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRGV2ZWxvcG1lbnQgb2YgdGhpcyBzZXJ2aWNlIGlzIHN1cHBvcnQgb2YKLSAgIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgUHJvbW90aW9uIEFnZW5jeSwgSmFwYW4uICovCi0KLSNpZm5kZWYgU1ZUVENNQVBfSF8KLSNkZWZpbmUgU1ZUVENNQVBfSF8KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9UVF9DTUFQICAidHQtY21hcHMiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9DTWFwSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIFRydWVUeXBlL3NmbnQgc3BlY2lmaWMgY21hcCBpbmZvcm1hdGlvbiAgKi8KLSAgLyogICAgd2hpY2ggaXMgbm90IGNvdmVyZWQgYnkgdGhlIGdlbmVyaWMgQEZUX0NoYXJNYXAgc3RydWN0dXJlLiAgVGhpcyAgICovCi0gIC8qICAgIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgQEZUX0dldF9UVF9DTWFwX0luZm8gZnVuY3Rpb24uICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhbmd1YWdlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBsYW5ndWFnZSBJRCB1c2VkIGluIE1hYyBmb250cy4gIERlZmluaXRpb25zIG9mIHZhbHVlcyBhcmUgaW4gKi8KLSAgLyogICAgICBgdHRuYW1laWQuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY21hcCBmb3JtYXQuICBPcGVuVHlwZSAxLjYgZGVmaW5lcyB0aGUgZm9ybWF0cyAwIChieXRlICAgICAgICovCi0gIC8qICAgICAgZW5jb2RpbmcgdGFibGUpLCAyfihoaWdoLWJ5dGUgbWFwcGluZyB0aHJvdWdoIHRhYmxlKSwgNH4oc2VnbWVudCAqLwotICAvKiAgICAgIG1hcHBpbmcgdG8gZGVsdGEgdmFsdWVzKSwgNn4odHJpbW1lZCB0YWJsZSBtYXBwaW5nKSwgOH4obWl4ZWQgICAgKi8KLSAgLyogICAgICAxNi1iaXQgYW5kIDMyLWJpdCBjb3ZlcmFnZSksIDEwfih0cmltbWVkIGFycmF5KSwgMTJ+KHNlZ21lbnRlZCAgICovCi0gIC8qICAgICAgY292ZXJhZ2UpLCAxM34obGFzdCByZXNvcnQgZm9udCksIGFuZCAxNCAoVW5pY29kZSBWYXJpYXRpb24gICAgICAqLwotICAvKiAgICAgIFNlcXVlbmNlcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9DTWFwSW5mb18KLSAgewotICAgIEZUX1VMb25nICBsYW5ndWFnZTsKLSAgICBGVF9Mb25nICAgZm9ybWF0OwotCi0gIH0gVFRfQ01hcEluZm87Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfQ01hcF9JbmZvX0dldEZ1bmMpKCBGVF9DaGFyTWFwICAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFRUQ01hcHMgKQotICB7Ci0gICAgVFRfQ01hcF9JbmZvX0dldEZ1bmMgIGdldF9jbWFwX2luZm87Ci0gIH07Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9UVENNQVBTUkVDKCBjbGFzc18sIGdldF9jbWFwX2luZm9fICkgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfVFRDTWFwc1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9jbWFwX2luZm9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9UVENNQVBTUkVDKCBjbGFzc18sIGdldF9jbWFwX2luZm9fICkgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfVFRDTWFwc1JlYyogIGNsYXp6ICkgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2NtYXBfaW5mbyA9IGdldF9jbWFwX2luZm9fOyAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBTVlRUQ01BUF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0ZW5nLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiMzY4YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2dHRlbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgVHJ1ZVR5cGUgZW5naW5lIHF1ZXJ5IHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBTVlRURU5HX0hfCi0jZGVmaW5lIFNWVFRFTkdfSF8KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9NT0RVTEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlLgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1RSVUVUWVBFX0VOR0lORSAgInRydWV0eXBlLWVuZ2luZSIKLQotICAvKgotICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUKLSAgICovCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFRydWVUeXBlRW5naW5lICkKLSAgewotICAgIEZUX1RydWVUeXBlRW5naW5lVHlwZSAgZW5naW5lX3R5cGU7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFNWVFRFTkdfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3OTMwNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnR0Z2x5Zi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFRydWVUeXBlIGdseXBoIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFNWVFRHTFlGX0hfCi0jZGVmaW5lIFNWVFRHTFlGX0hfCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfVFRfR0xZRiAgInR0LWdseWYiCi0KLQotICB0eXBlZGVmIEZUX1VMb25nCi0gICgqVFRfR2x5Zl9HZXRMb2NhdGlvbkZ1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqcHNpemUgKTsKLQotICBGVF9ERUZJTkVfU0VSVklDRSggVFRHbHlmICkKLSAgewotICAgIFRUX0dseWZfR2V0TG9jYXRpb25GdW5jICBnZXRfbG9jYXRpb247Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1RUR0xZRlJFQyggY2xhc3NfLCBnZXRfbG9jYXRpb25fICkgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfVFRHbHlmUmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2xvY2F0aW9uXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9UVEdMWUZSRUMoIGNsYXNzXywgZ2V0X2xvY2F0aW9uXyApICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX1RUR2x5ZlJlYyogIGNsYXp6ICkgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9sb2NhdGlvbiA9IGdldF9sb2NhdGlvbl87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFNWVFRHTFlGX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGI3ZTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Z3aW5mbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBXaW5kb3dzIEZOVC9GT05UIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFNWV0lORk5UX0hfCi0jZGVmaW5lIFNWV0lORk5UX0hfCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfV0lORk9OVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9XSU5GTlQgICJ3aW5mb250cyIKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfV2luRm50X0dldEhlYWRlckZ1bmMpKCBGVF9GYWNlICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICphaGVhZGVyICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggV2luRm50ICkKLSAgewotICAgIEZUX1dpbkZudF9HZXRIZWFkZXJGdW5jICBnZXRfaGVhZGVyOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBTVldJTkZOVF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2NjdhMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBgc2ZudCcgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgU0ZOVF9IXwotI2RlZmluZSBTRk5UX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSW5pdF9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmlyc3QgcGFydCBvZiB0aGUgU0ZOVCBmYWNlIG9iamVjdCBpbml0aWFsaXphdGlvbi4gIFRoaXMgZmluZHMgICAgICovCi0gIC8qICAgIHRoZSBmYWNlIGluIGEgU0ZOVCBmaWxlIG9yIGNvbGxlY3Rpb24sIGFuZCBsb2FkIGl0cyBmb3JtYXQgdGFnIGluICAqLwotICAvKiAgICBmYWNlLT5mb3JtYXRfdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiwgaW4gYml0cyAwLTE1LiAgVGhlIG51bWJlcmVkIGluc3RhbmNlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGluZGV4fit+MSBvZiBhIEdYIChzdWIpZm9udCwgaWYgYXBwbGljYWJsZSwgaW4gYml0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAxNi0zMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogT3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgYXQgdGhlIGZvbnQgZmlsZSdzIG9yaWdpbi4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGZvbnRzIGVtYmVkZGVkIGluIGEgYFRydWVUeXBlICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbGxlY3Rpb24nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25jZSB0aGUgZm9ybWF0IHRhZyBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlIGZvbnQgZHJpdmVyLCBpdCAgICAgICovCi0gIC8qICAgIHNob3VsZCB0aGVuIGNhbGwgdGhlIFRUX0xvYWRfRmFjZV9GdW5jKCkgY2FsbGJhY2sgdG8gcmVhZCB0aGUgcmVzdCAqLwotICAvKiAgICBvZiB0aGUgU0ZOVCB0YWJsZXMgaW4gdGhlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Jbml0X0ZhY2VfRnVuYykoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2Vjb25kIHBhcnQgb2YgdGhlIFNGTlQgZmFjZSBvYmplY3QgaW5pdGlhbGl6YXRpb24uICBUaGlzIGxvYWRzICAgICovCi0gIC8qICAgIHRoZSBjb21tb24gU0ZOVCB0YWJsZXMgKGhlYWQsIE9TLzIsIG1heHAsIG1ldHJpY3MsIGV0Yy4pIGluIHRoZSAgICAqLwotICAvKiAgICBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiwgaW4gYml0cyAwLTE1LiAgVGhlIG51bWJlcmVkIGluc3RhbmNlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGluZGV4fit+MSBvZiBhIEdYIChzdWIpZm9udCwgaWYgYXBwbGljYWJsZSwgaW4gYml0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAxNi0zMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogT3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgVFRfSW5pdF9GYWNlX0Z1bmMoKS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfRmFjZV9GdW5jKSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Eb25lX0ZhY2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNhbGxiYWNrIHVzZWQgdG8gZGVsZXRlIHRoZSBjb21tb24gU0ZOVCBkYXRhIGZyb20gYSBmYWNlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGRlc3Ryb3kgdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlRUX0RvbmVfRmFjZV9GdW5jKSggVFRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9BbnlfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhbnkgZm9udCB0YWJsZSBpbnRvIGNsaWVudCBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IFRoZSBmYWNlIG9iamVjdCB0byBsb29rIGZvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgICAgOjogVGhlIHRhZyBvZiB0YWJsZSB0byBsb2FkLiAgVXNlIHRoZSB2YWx1ZSAwIGlmIHlvdSB3YW50ICAgKi8KLSAgLyogICAgICAgICAgICAgIHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLCBlbHNlIHNldCB0aGlzIHBhcmFtZXRlciAgICovCi0gIC8qICAgICAgICAgICAgICB0byBhIHZhbGlkIFRydWVUeXBlIHRhYmxlIHRhZyB0aGF0IHlvdSBjYW4gZm9yZ2Ugd2l0aCAgICAqLwotICAvKiAgICAgICAgICAgICAgdGhlIE1BS0VfVFRfVEFHIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldCA6OiBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSB0YWJsZSAob3IgdGhlIGZpbGUgaWYgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgdGFnID09IDApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgZGVjaXNpb24gdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgbGVuZ3RoID09IE5VTEw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgTG9hZHMgdGhlIHdob2xlIHRhYmxlLiAgUmV0dXJucyBhbiBlcnJvciBpZiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBvZmZzZXQnID09IDAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggPT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEV4aXRzIGltbWVkaWF0ZWx5OyByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gKi8KLSAgLyogICAgICAgICAgICAgICAgICB0YWJsZSBvciBvZiB0aGUgZm9udCBmaWxlLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mICovCi0gIC8qICAgICAgICAgICAgICAgICAgYHRhZycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCAhPSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgTG9hZHMgdGhlIG5leHQgYGxlbmd0aCcgYnl0ZXMgb2YgdGFibGUgb3IgZm9udCwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IG9mZnNldCBgb2Zmc2V0JyAoaW4gdGFibGUgb3IgZm9udCB0b28pLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX0FueV9GdW5jKSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRmluZF9TQml0X0ltYWdlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2hlY2sgd2hldGhlciBhbiBlbWJlZGRlZCBiaXRtYXAgKGFuIGBzYml0JykgZXhpc3RzIGZvciBhIGdpdmVuICAgICovCi0gIC8qICAgIGdseXBoLCBhdCBhIGdpdmVuIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpa2VfaW5kZXggIDo6IFRoZSBjdXJyZW50IHN0cmlrZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcmFuZ2UgICAgICAgIDo6IFRoZSBTQml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzdHJpa2UgICAgICAgOjogVGhlIFNCaXQgc3RyaWtlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdseXBoX29mZnNldCA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBnbHlwaCBkYXRhIGluIGBFQkRUJyB0YWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlRfRXJyX0ludmFsaWRfQXJndW1lbnQgaWYgbm8gc2JpdCBleGlzdHMgZm9yIHRoZSByZXF1ZXN0ZWQgICAgICAqLwotICAvKiAgICBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9GaW5kX1NCaXRfSW1hZ2VfRnVuYykoIFRUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UgICAqYXJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9TdHJpa2UgICphc3RyaWtlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICphZ2x5cGhfb2Zmc2V0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX1NCaXRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGJpZyBtZXRyaWNzIGZvciBhIGdpdmVuIGVtYmVkZGVkIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlICAgICAgIDo6IFRoZSBTQml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpZ19tZXRyaWNzIDo6IEEgYmlnIFNCaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUgZ2x5cGgncyBvZmZzZXQgd2l0aGluICAqLwotICAvKiAgICB0aGUgYEVCRFQnIHRhYmxlIGJlZm9yZSB0aGUgY2FsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBpbWFnZSBmb3JtYXQgdXNlcyB2YXJpYWJsZSBtZXRyaWNzLCB0aGUgc3RyZWFtIGN1cnNvciBpcyAgICAqLwotICAvKiAgICBwb3NpdGlvbmVkIGp1c3QgYWZ0ZXIgdGhlIG1ldHJpY3MgaGVhZGVyIGluIHRoZSBgRUJEVCcgdGFibGUgb24gICAgKi8KLSAgLyogICAgZnVuY3Rpb24gZXhpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9TQml0X01ldHJpY3NfRnVuYykoIEZUX1N0cmVhbSAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1JhbmdlICAgIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MgIG1ldHJpY3MgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfU0JpdF9JbWFnZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgYSBnaXZlbiBnbHlwaCBzYml0IGltYWdlIGZyb20gdGhlIGZvbnQgcmVzb3VyY2UuICBUaGlzIGFsc28gICAqLwotICAvKiAgICByZXR1cm5zIGl0cyBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpa2VfaW5kZXggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgc3RyaWtlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY3VycmVudCBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY3VycmVudCBsb2FkIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1hcCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHRhcmdldCBwaXhtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1ldHJpY3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBiaWcgc2JpdCBtZXRyaWNzIHN0cnVjdHVyZSBmb3IgdGhlIGdseXBoIGltYWdlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLwotICAvKiAgICBnbHlwaCBzYml0IGV4aXN0cyBmb3IgdGhlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYG1hcC5idWZmZXInIGZpZWxkIGlzIGFsd2F5cyBmcmVlZCBiZWZvcmUgdGhlIGdseXBoIGlzIGxvYWRlZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX1NCaXRfSW1hZ2VfRnVuYykoIFRUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICAgICphbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzUmVjICAqYW1ldHJpY3MgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NldF9TQml0X1N0cmlrZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlbGVjdCBhbiBzYml0IHN0cmlrZSBmb3IgYSBnaXZlbiBzaXplIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVxICAgICAgICAgICA6OiBUaGUgc2l6ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXN0cmlrZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIHNiaXQgc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCi0gIC8qICAgIHNiaXQgc3RyaWtlIGV4aXN0cyBmb3IgdGhlIHNlbGVjdGVkIHBwZW0gdmFsdWVzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX1NldF9TQml0X1N0cmlrZV9GdW5jKSggVFRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgIGFzdHJpa2VfaW5kZXggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIG1ldHJpY3Mgb2YgYSBnaXZlbiBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaWtlX2luZGV4ICA6OiBUaGUgc3RyaWtlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljcyAgICAgICA6OiB0aGUgbWV0cmljcyBvZiB0aGUgc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCi0gIC8qICAgIHN1Y2ggc2JpdCBzdHJpa2UgZXhpc3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYykoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dldF9QU19OYW1lX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldCB0aGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lIG9mIGEgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlkeCAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNuYW1lIDo6IFRoZSBhZGRyZXNzIG9mIGEgc3RyaW5nIHBvaW50ZXIuICBXaWxsIGJlIE5VTEwgaW4gY2FzZSAgICovCi0gIC8qICAgICAgICAgICAgICBvZiBlcnJvciwgb3RoZXJ3aXNlIGl0IGlzIGEgcG9pbnRlciB0byB0aGUgZ2x5cGggbmFtZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIFlvdSBtdXN0IG5vdCBtb2RpZnkgdGhlIHJldHVybmVkIHN0cmluZyEgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfR2V0X1BTX05hbWVfRnVuYykoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgUFNuYW1lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX01ldHJpY3NfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIGEgbWV0cmljcyB0YWJsZSwgd2hpY2ggaXMgYSB0YWJsZSB3aXRoIGEgaG9yaXpvbnRhbCBhbmQgYSAgICAgKi8KLSAgLyogICAgdmVydGljYWwgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIHRoZSB2ZXJ0aWNhbCBvbmUuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfTWV0cmljc19GdW5jKSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHZlcnRpY2FsICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGhlYWRlciBpbiBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIHZlcnRpY2FsIG1ldHJpY3MuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJlYXJpbmcgOjogVGhlIGhvcml6b250YWwgKG9yIHZlcnRpY2FsKSBiZWFyaW5nLiAgU2V0IHRvIHplcm8gaW4gICovCi0gIC8qICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWFkdmFuY2UgOjogVGhlIGhvcml6b250YWwgKG9yIHZlcnRpY2FsKSBhZHZhbmNlLiAgU2V0IHRvIHplcm8gaW4gICovCi0gIC8qICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVFRfR2V0X01ldHJpY3NfRnVuYykoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIHZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgIGFiZWFyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhYWR2YW5jZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2V0X05hbWVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJvbSB0aGUgYG5hbWUnIHRhYmxlLCByZXR1cm4gYSBnaXZlbiBFTkdMSVNIIG5hbWUgcmVjb3JkIGluICAgICAgICovCi0gIC8qICAgIEFTQ0lJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZWlkICAgOjogVGhlIG5hbWUgaWQgb2YgdGhlIG5hbWUgcmVjb3JkIHRvIHJldHVybi4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZSAgICAgOjogVGhlIGFkZHJlc3Mgb2YgYW4gYWxsb2NhdGVkIHN0cmluZyBwb2ludGVyLiAgTlVMTCBpZiAgICovCi0gIC8qICAgICAgICAgICAgICAgIG5vIG5hbWUgaXMgcHJlc2VudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0dldF9OYW1lX0Z1bmMpKCBUVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgIG5hbWVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiogIG5hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dldF9OYW1lX0lEX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlYXJjaCB3aGV0aGVyIGFuIEVOR0xJU0ggdmVyc2lvbiBmb3IgYSBnaXZlbiBuYW1lIElEIGlzIGluIHRoZSAgICAqLwotICAvKiAgICBgbmFtZScgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWVpZCAgIDo6IFRoZSBuYW1lIGlkIG9mIHRoZSBuYW1lIHJlY29yZCB0byByZXR1cm4uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpbiAgICAgIDo6IElmIG5vbi1uZWdhdGl2ZSwgYW4gaW5kZXggaW50byB0aGUgYG5hbWUnIHRhYmxlIHdpdGggICAqLwotICAvKiAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyAoMywxKSBvciAoMywwKSBXaW5kb3dzIGVudHJ5LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFwcGxlICAgIDo6IElmIG5vbi1uZWdhdGl2ZSwgYW4gaW5kZXggaW50byB0aGUgYG5hbWUnIHRhYmxlIHdpdGggICAqLwotICAvKiAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyAoMSwwKSBBcHBsZSBlbnRyeS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAxIGlmIHRoZXJlIGlzIGVpdGhlciBhIHdpbiBvciBhcHBsZSBlbnRyeSAob3IgYm90aCksIDAgb3RoZXJpd3NlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfQm9vbAotICAoKlRUX0dldF9OYW1lX0lEX0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgbmFtZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgKndpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICphcHBsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBgZmFjZS0+Z290b190YWJsZScgdG8gc2VlayB0aGUgc3RyZWFtIHRvIHRoZSAgICAgKi8KLSAgLyogICAgc3RhcnQgb2YgdGhlIHRhYmxlLCBleGNlcHQgd2hpbGUgbG9hZGluZyB0aGUgZm9udCBkaXJlY3RvcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9UYWJsZV9GdW5jKSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlIGEgZ2l2ZW4gVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlRUX0ZyZWVfVGFibGVfRnVuYykoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qCi0gICAqIEBmdW5jdHlwZToKLSAgICogICAgVFRfRmFjZV9HZXRLZXJuaW5nRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIFJldHVybiB0aGUgaG9yaXpvbnRhbCBrZXJuaW5nIHZhbHVlIGJldHdlZW4gdHdvIGdseXBocy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgotICAgKiAgICBsZWZ0X2dseXBoICA6OiBUaGUgbGVmdCBnbHlwaCBpbmRleC4KLSAgICogICAgcmlnaHRfZ2x5cGggOjogVGhlIHJpZ2h0IGdseXBoIGluZGV4LgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBUaGUga2VybmluZyB2YWx1ZSBpbiBmb250IHVuaXRzLgotICAgKi8KLSAgdHlwZWRlZiBGVF9JbnQKLSAgKCpUVF9GYWNlX0dldEtlcm5pbmdGdW5jKSggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcmlnaHRfZ2x5cGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlRfSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGhvbGRzIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBsb2FkIGFuZCAgICAqLwotICAvKiAgICBmcmVlIHRoZSBiYXNpYyB0YWJsZXMgdGhhdCBhcmUgcmVxdWlyZWQgaW4gYSBgc2ZudCcgZm9udCBmaWxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB0aGUgdmFyaW91cyB4eHhfRnVuYygpIGRlc2NyaXB0aW9ucyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBTRk5UX0ludGVyZmFjZV8KLSAgewotICAgIFRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jICAgICAgZ290b190YWJsZTsKLQotICAgIFRUX0luaXRfRmFjZV9GdW5jICAgICAgICAgICAgaW5pdF9mYWNlOwotICAgIFRUX0xvYWRfRmFjZV9GdW5jICAgICAgICAgICAgbG9hZF9mYWNlOwotICAgIFRUX0RvbmVfRmFjZV9GdW5jICAgICAgICAgICAgZG9uZV9mYWNlOwotICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgICAgICAgZ2V0X2ludGVyZmFjZTsKLQotICAgIFRUX0xvYWRfQW55X0Z1bmMgICAgICAgICAgICAgbG9hZF9hbnk7Ci0KLSAgICAvKiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSBgbG9hZF9mYWNlJyBidXQgdGhleSBjYW4gYWxzbyAgKi8KLSAgICAvKiBiZSBjYWxsZWQgZnJvbSBleHRlcm5hbCBtb2R1bGVzLCBpZiB0aGVyZSBpcyBhIG5lZWQgdG8gZG8gc28gKi8KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfaGVhZDsKLSAgICBUVF9Mb2FkX01ldHJpY3NfRnVuYyAgICAgICAgIGxvYWRfaGhlYTsKLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfY21hcDsKLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfbWF4cDsKLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfb3MyOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9wb3N0OwotCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX25hbWU7Ci0gICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICBmcmVlX25hbWU7Ci0KLSAgICAvKiB0aGlzIGZpZWxkIHdhcyBjYWxsZWQgYGxvYWRfa2VybmluZycgdXAgdG8gdmVyc2lvbiAyLjEuMTAgKi8KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfa2VybjsKLQotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9nYXNwOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9wY2x0OwotCi0gICAgLyogc2VlIGB0dGxvYWQuaCc7IHRoaXMgZmllbGQgd2FzIGNhbGxlZCBgbG9hZF9iaXRtYXBfaGVhZGVyJyB1cCB0byAqLwotICAgIC8qIHZlcnNpb24gMi4xLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfYmhlZDsKLQotICAgIFRUX0xvYWRfU0JpdF9JbWFnZV9GdW5jICAgICAgbG9hZF9zYml0X2ltYWdlOwotCi0gICAgLyogc2VlIGB0dHBvc3QuaCcgKi8KLSAgICBUVF9HZXRfUFNfTmFtZV9GdW5jICAgICAgICAgIGdldF9wc25hbWU7Ci0gICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICBmcmVlX3BzbmFtZXM7Ci0KLSAgICAvKiBzdGFydGluZyBoZXJlLCB0aGUgc3RydWN0dXJlIGRpZmZlcnMgZnJvbSB2ZXJzaW9uIDIuMS43ICovCi0KLSAgICAvKiB0aGlzIGZpZWxkIHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMi4xLjgsIG5hbWVkIGBnZXRfcHNuYW1lJyAqLwotICAgIFRUX0ZhY2VfR2V0S2VybmluZ0Z1bmMgICAgICAgZ2V0X2tlcm5pbmc7Ci0KLSAgICAvKiBuZXcgZWxlbWVudHMgaW50cm9kdWNlZCBhZnRlciB2ZXJzaW9uIDIuMS4xMCAqLwotCi0gICAgLyogbG9hZCB0aGUgZm9udCBkaXJlY3RvcnksIGkuZS4sIHRoZSBvZmZzZXQgdGFibGUgYW5kICovCi0gICAgLyogdGhlIHRhYmxlIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2ZvbnRfZGlyOwotICAgIFRUX0xvYWRfTWV0cmljc19GdW5jICAgICAgICAgbG9hZF9obXR4OwotCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2VibGM7Ci0gICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICBmcmVlX2VibGM7Ci0KLSAgICBUVF9TZXRfU0JpdF9TdHJpa2VfRnVuYyAgICAgIHNldF9zYml0X3N0cmlrZTsKLSAgICBUVF9Mb2FkX1N0cmlrZV9NZXRyaWNzX0Z1bmMgIGxvYWRfc3RyaWtlX21ldHJpY3M7Ci0KLSAgICBUVF9HZXRfTWV0cmljc19GdW5jICAgICAgICAgIGdldF9tZXRyaWNzOwotCi0gICAgVFRfR2V0X05hbWVfRnVuYyAgICAgICAgICAgICBnZXRfbmFtZTsKLSAgICBUVF9HZXRfTmFtZV9JRF9GdW5jICAgICAgICAgIGdldF9uYW1lX2lkOwotCi0gIH0gU0ZOVF9JbnRlcmZhY2U7Ci0KLQotICAvKiB0cmFuc2l0aW9uYWwgKi8KLSAgdHlwZWRlZiBTRk5UX0ludGVyZmFjZSogICBTRk5UX1NlcnZpY2U7Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0ZOVF9JTlRFUkZBQ0UoICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnb3RvX3RhYmxlXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9mYWNlXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9hbnlfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2hlYWRfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfaGhlYV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9jbWFwXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX21heHBfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfb3MyXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9wb3N0XywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX25hbWVfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfbmFtZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9rZXJuXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dhc3BfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfcGNsdF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9iaGVkXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3NiaXRfaW1hZ2VfLCAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9wc25hbWVfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnJlZV9wc25hbWVzXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZm9udF9kaXJfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9obXR4XywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2VibGNfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfZWJsY18sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X3NiaXRfc3RyaWtlXywgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3N0cmlrZV9tZXRyaWNzXywgICAgICAgICAgXAotICAgICAgICAgIGdldF9tZXRyaWNzXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfbmFtZV9pZF8gKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgU0ZOVF9JbnRlcmZhY2UgIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnb3RvX3RhYmxlXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9hbnlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2hlYWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfaGhlYV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9jbWFwXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX21heHBfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfb3MyXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9wb3N0XywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZyZWVfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9rZXJuXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2dhc3BfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfcGNsdF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9iaGVkXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX3NiaXRfaW1hZ2VfLCAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9wc25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnJlZV9wc25hbWVzXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfZm9udF9kaXJfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9obXR4XywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZyZWVfZWJsY18sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2V0X3NiaXRfc3RyaWtlXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX3N0cmlrZV9tZXRyaWNzXywgICAgICAgICAgICAgICAgXAotICAgIGdldF9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfbmFtZV9pZF8gICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0lOVEVSTkFMKCBhLCBhXyApICBcCi0gICAgICAgICAgY2xhenotPmEgPSBhXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0ZOVF9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnb3RvX3RhYmxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9hbnlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2hlYWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfaGhlYV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9jbWFwXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX21heHBfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfb3MyXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9wb3N0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9rZXJuXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dhc3BfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfcGNsdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9iaGVkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3NiaXRfaW1hZ2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9wc25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnJlZV9wc25hbWVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZm9udF9kaXJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9obXR4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfZWJsY18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X3NiaXRfc3RyaWtlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3N0cmlrZV9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfbmFtZV9pZF8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRk5UX0ludGVyZmFjZSogIGNsYXp6ICkgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nb3RvX3RhYmxlICAgICAgICAgID0gZ290b190YWJsZV87ICAgICAgICAgICBcCi0gICAgY2xhenotPmluaXRfZmFjZSAgICAgICAgICAgPSBpbml0X2ZhY2VfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9mYWNlICAgICAgICAgICA9IGxvYWRfZmFjZV87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lX2ZhY2UgICAgICAgICAgID0gZG9uZV9mYWNlXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9pbnRlcmZhY2UgICAgICAgPSBnZXRfaW50ZXJmYWNlXzsgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9hbnkgICAgICAgICAgICA9IGxvYWRfYW55XzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2hlYWQgICAgICAgICAgID0gbG9hZF9oZWFkXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfaGhlYSAgICAgICAgICAgPSBsb2FkX2hoZWFfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9jbWFwICAgICAgICAgICA9IGxvYWRfY21hcF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX21heHAgICAgICAgICAgID0gbG9hZF9tYXhwXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfb3MyICAgICAgICAgICAgPSBsb2FkX29zMl87ICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9wb3N0ICAgICAgICAgICA9IGxvYWRfcG9zdF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX25hbWUgICAgICAgICAgID0gbG9hZF9uYW1lXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmZyZWVfbmFtZSAgICAgICAgICAgPSBmcmVlX25hbWVfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9rZXJuICAgICAgICAgICA9IGxvYWRfa2Vybl87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2dhc3AgICAgICAgICAgID0gbG9hZF9nYXNwXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfcGNsdCAgICAgICAgICAgPSBsb2FkX3BjbHRfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9iaGVkICAgICAgICAgICA9IGxvYWRfYmhlZF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX3NiaXRfaW1hZ2UgICAgID0gbG9hZF9zYml0X2ltYWdlXzsgICAgICBcCi0gICAgY2xhenotPmdldF9wc25hbWUgICAgICAgICAgPSBnZXRfcHNuYW1lXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZnJlZV9wc25hbWVzICAgICAgICA9IGZyZWVfcHNuYW1lc187ICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfa2VybmluZyAgICAgICAgID0gZ2V0X2tlcm5pbmdfOyAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfZm9udF9kaXIgICAgICAgPSBsb2FkX2ZvbnRfZGlyXzsgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9obXR4ICAgICAgICAgICA9IGxvYWRfaG10eF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2VibGMgICAgICAgICAgID0gbG9hZF9lYmxjXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmZyZWVfZWJsYyAgICAgICAgICAgPSBmcmVlX2VibGNfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X3NiaXRfc3RyaWtlICAgICA9IHNldF9zYml0X3N0cmlrZV87ICAgICAgXAotICAgIGNsYXp6LT5sb2FkX3N0cmlrZV9tZXRyaWNzID0gbG9hZF9zdHJpa2VfbWV0cmljc187ICBcCi0gICAgY2xhenotPmdldF9tZXRyaWNzICAgICAgICAgPSBnZXRfbWV0cmljc187ICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X25hbWUgICAgICAgICAgICA9IGdldF9uYW1lXzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfbmFtZV9pZCAgICAgICAgID0gZ2V0X25hbWVfaWRfOyAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFNGTlRfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZTM1ZDQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDF0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIFR5cGUxL1R5cGUyIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgICAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUMVRZUEVTX0hfCi0jZGVmaW5lIFQxVFlQRVNfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfSEFTSF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICBSRVFVSVJFRCBUWVBFMS9UWVBFMiBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRW5jb2RpbmdSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgYSBjdXN0b20gZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2NoYXJzICA6OiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciBjb2RlcyBpbiB0aGUgZW5jb2RpbmcuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgVXN1YWxseSAyNTYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29kZV9maXJzdCA6OiBUaGUgbG93ZXN0IHZhbGlkIGNoYXJhY3RlciBjb2RlIGluIHRoZSBlbmNvZGluZy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb2RlX2xhc3QgIDo6IFRoZSBoaWdoZXN0IHZhbGlkIGNoYXJhY3RlciBjb2RlIGluIHRoZSBlbmNvZGluZyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICArIDEuIFdoZW4gZXF1YWwgdG8gY29kZV9maXJzdCB0aGVyZSBhcmUgbm8gdmFsaWQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9pbmRleCA6OiBBbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIGdseXBoIGluZGljZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX25hbWUgIDo6IEFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9FbmNvZGluZ1JlY1JlY18KLSAgewotICAgIEZUX0ludCAgICAgICBudW1fY2hhcnM7Ci0gICAgRlRfSW50ICAgICAgIGNvZGVfZmlyc3Q7Ci0gICAgRlRfSW50ICAgICAgIGNvZGVfbGFzdDsKLQotICAgIEZUX1VTaG9ydCogICBjaGFyX2luZGV4OwotICAgIEZUX1N0cmluZyoqICBjaGFyX25hbWU7Ci0KLSAgfSBUMV9FbmNvZGluZ1JlYywgKlQxX0VuY29kaW5nOwotCi0KLSAgLyogdXNlZCB0byBob2xkIGV4dHJhIGRhdGEgb2YgUFNfRm9udEluZm9SZWMgdGhhdAotICAgKiBjYW5ub3QgYmUgc3RvcmVkIGluIHRoZSBwdWJsaWNseSBkZWZpbmVkIHN0cnVjdHVyZS4KLSAgICoKLSAgICogTm90ZSB0aGVzZSBjYW4ndCBiZSBibGVuZGVkIHdpdGggbXVsdGlwbGUtbWFzdGVycy4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19Gb250RXh0cmFSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIGZzX3R5cGU7Ci0KLSAgfSBQU19Gb250RXh0cmFSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfRm9udFJlY18KLSAgewotICAgIFBTX0ZvbnRJbmZvUmVjICAgZm9udF9pbmZvOyAgICAgICAgIC8qIGZvbnQgaW5mbyBkaWN0aW9uYXJ5ICAgKi8KLSAgICBQU19Gb250RXh0cmFSZWMgIGZvbnRfZXh0cmE7ICAgICAgICAvKiBmb250IGluZm8gZXh0cmEgZmllbGRzICovCi0gICAgUFNfUHJpdmF0ZVJlYyAgICBwcml2YXRlX2RpY3Q7ICAgICAgLyogcHJpdmF0ZSBkaWN0aW9uYXJ5ICAgICAqLwotICAgIEZUX1N0cmluZyogICAgICAgZm9udF9uYW1lOyAgICAgICAgIC8qIHRvcC1sZXZlbCBkaWN0aW9uYXJ5ICAgKi8KLQotICAgIFQxX0VuY29kaW5nVHlwZSAgZW5jb2RpbmdfdHlwZTsKLSAgICBUMV9FbmNvZGluZ1JlYyAgIGVuY29kaW5nOwotCi0gICAgRlRfQnl0ZSogICAgICAgICBzdWJyc19ibG9jazsKLSAgICBGVF9CeXRlKiAgICAgICAgIGNoYXJzdHJpbmdzX2Jsb2NrOwotICAgIEZUX0J5dGUqICAgICAgICAgZ2x5cGhfbmFtZXNfYmxvY2s7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgIG51bV9zdWJyczsKLSAgICBGVF9CeXRlKiogICAgICAgIHN1YnJzOwotICAgIEZUX1VJbnQqICAgICAgICAgc3VicnNfbGVuOwotICAgIEZUX0hhc2ggICAgICAgICAgc3VicnNfaGFzaDsKLQotICAgIEZUX0ludCAgICAgICAgICAgbnVtX2dseXBoczsKLSAgICBGVF9TdHJpbmcqKiAgICAgIGdseXBoX25hbWVzOyAgICAgICAvKiBhcnJheSBvZiBnbHlwaCBuYW1lcyAgICAgICAqLwotICAgIEZUX0J5dGUqKiAgICAgICAgY2hhcnN0cmluZ3M7ICAgICAgIC8qIGFycmF5IG9mIGdseXBoIGNoYXJzdHJpbmdzICovCi0gICAgRlRfVUludCogICAgICAgICBjaGFyc3RyaW5nc19sZW47Ci0KLSAgICBGVF9CeXRlICAgICAgICAgIHBhaW50X3R5cGU7Ci0gICAgRlRfQnl0ZSAgICAgICAgICBmb250X3R5cGU7Ci0gICAgRlRfTWF0cml4ICAgICAgICBmb250X21hdHJpeDsKLSAgICBGVF9WZWN0b3IgICAgICAgIGZvbnRfb2Zmc2V0OwotICAgIEZUX0JCb3ggICAgICAgICAgZm9udF9iYm94OwotICAgIEZUX0xvbmcgICAgICAgICAgZm9udF9pZDsKLQotICAgIEZUX0ZpeGVkICAgICAgICAgc3Ryb2tlX3dpZHRoOwotCi0gIH0gVDFfRm9udFJlYywgKlQxX0ZvbnQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0lEX1N1YnJzUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICBudW1fc3VicnM7Ci0gICAgRlRfQnl0ZSoqICBjb2RlOwotCi0gIH0gQ0lEX1N1YnJzUmVjLCAqQ0lEX1N1YnJzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgIEFGTSBGT05UIElORk9STUFUSU9OIFNUUlVDVFVSRVMgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fVHJhY2tLZXJuUmVjXwotICB7Ci0gICAgRlRfSW50ICAgIGRlZ3JlZTsKLSAgICBGVF9GaXhlZCAgbWluX3B0c2l6ZTsKLSAgICBGVF9GaXhlZCAgbWluX2tlcm47Ci0gICAgRlRfRml4ZWQgIG1heF9wdHNpemU7Ci0gICAgRlRfRml4ZWQgIG1heF9rZXJuOwotCi0gIH0gQUZNX1RyYWNrS2VyblJlYywgKkFGTV9UcmFja0tlcm47Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9LZXJuUGFpclJlY18KLSAgewotICAgIEZUX1VJbnQgIGluZGV4MTsKLSAgICBGVF9VSW50ICBpbmRleDI7Ci0gICAgRlRfSW50ICAgeDsKLSAgICBGVF9JbnQgICB5OwotCi0gIH0gQUZNX0tlcm5QYWlyUmVjLCAqQUZNX0tlcm5QYWlyOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fRm9udEluZm9SZWNfCi0gIHsKLSAgICBGVF9Cb29sICAgICAgICBJc0NJREZvbnQ7Ci0gICAgRlRfQkJveCAgICAgICAgRm9udEJCb3g7Ci0gICAgRlRfRml4ZWQgICAgICAgQXNjZW5kZXI7Ci0gICAgRlRfRml4ZWQgICAgICAgRGVzY2VuZGVyOwotICAgIEFGTV9UcmFja0tlcm4gIFRyYWNrS2VybnM7ICAgLyogZnJlZSBpZiBub24tTlVMTCAqLwotICAgIEZUX1VJbnQgICAgICAgIE51bVRyYWNrS2VybjsKLSAgICBBRk1fS2VyblBhaXIgICBLZXJuUGFpcnM7ICAgIC8qIGZyZWUgaWYgbm9uLU5VTEwgKi8KLSAgICBGVF9VSW50ICAgICAgICBOdW1LZXJuUGFpcjsKLQotICB9IEFGTV9Gb250SW5mb1JlYywgKkFGTV9Gb250SW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICBPUklHSU5BTCBUMV9GQUNFIENMQVNTIERFRklOSVRJT04gICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0ZhY2VSZWNfKiAgIFQxX0ZhY2U7Ci0gIHR5cGVkZWYgc3RydWN0IENJRF9GYWNlUmVjXyogIENJRF9GYWNlOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0ZhY2VSZWNfCi0gIHsKLSAgICBGVF9GYWNlUmVjICAgICAgcm9vdDsKLSAgICBUMV9Gb250UmVjICAgICAgdHlwZTE7Ci0gICAgY29uc3Qgdm9pZCogICAgIHBzbmFtZXM7Ci0gICAgY29uc3Qgdm9pZCogICAgIHBzYXV4OwotICAgIGNvbnN0IHZvaWQqICAgICBhZm1fZGF0YTsKLSAgICBGVF9DaGFyTWFwUmVjICAgY2hhcm1hcHJlY3NbMl07Ci0gICAgRlRfQ2hhck1hcCAgICAgIGNoYXJtYXBzWzJdOwotCi0gICAgLyogc3VwcG9ydCBmb3IgTXVsdGlwbGUgTWFzdGVycyBmb250cyAqLwotICAgIFBTX0JsZW5kICAgICAgICBibGVuZDsKLQotICAgIC8qIHVuZG9jdW1lbnRlZCwgb3B0aW9uYWw6IGluZGljZXMgb2Ygc3Vicm91dGluZXMgdGhhdCBleHByZXNzICAgICAgKi8KLSAgICAvKiB0aGUgTm9ybWFsaXplRGVzaWduVmVjdG9yIGFuZCB0aGUgQ29udmVydERlc2lnblZlY3RvciBwcm9jZWR1cmUsICovCi0gICAgLyogcmVzcGVjdGl2ZWx5LCBhcyBUeXBlIDIgY2hhcnN0cmluZ3M7IC0xIGlmIGtleXdvcmRzIG5vdCBwcmVzZW50ICAqLwotICAgIEZUX0ludCAgICAgICAgICAgbmR2X2lkeDsKLSAgICBGVF9JbnQgICAgICAgICAgIGNkdl9pZHg7Ci0KLSAgICAvKiB1bmRvY3VtZW50ZWQsIG9wdGlvbmFsOiBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBsZW5fYnVpbGRjaGFyICovCi0gICAgLyogZm9yIFR5cGUgMiBmb250czsgbWFuaXB1bGF0ZWQgYnkgb3RoZXJzdWJycyAxOSwgMjQsIGFuZCAyNSAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgbGVuX2J1aWxkY2hhcjsKLSAgICBGVF9Mb25nKiAgICAgICAgIGJ1aWxkY2hhcjsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xIC0gaW50ZXJmYWNlIHRvIFBvc3RTY3JpcHQgaGludGVyICovCi0gICAgY29uc3Qgdm9pZCogICAgIHBzaGludGVyOwotCi0gIH0gVDFfRmFjZVJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZVJlY18KLSAgewotICAgIEZUX0ZhY2VSZWMgICAgICAgcm9vdDsKLSAgICB2b2lkKiAgICAgICAgICAgIHBzbmFtZXM7Ci0gICAgdm9pZCogICAgICAgICAgICBwc2F1eDsKLSAgICBDSURfRmFjZUluZm9SZWMgIGNpZDsKLSAgICBQU19Gb250RXh0cmFSZWMgIGZvbnRfZXh0cmE7Ci0jaWYgMAotICAgIHZvaWQqICAgICAgICAgICAgYWZtX2RhdGE7Ci0jZW5kaWYKLSAgICBDSURfU3VicnMgICAgICAgIHN1YnJzOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjEgLSBpbnRlcmZhY2UgdG8gUG9zdFNjcmlwdCBoaW50ZXIgKi8KLSAgICB2b2lkKiAgICAgICAgICAgIHBzaGludGVyOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjEuOCwgYnV0IHdhcyBvcmlnaW5hbGx5IHBvc2l0aW9uZWQgYWZ0ZXIgYGFmbV9kYXRhJyAqLwotICAgIEZUX0J5dGUqICAgICAgICAgYmluYXJ5X2RhdGE7IC8qIHVzZWQgaWYgaGV4IGRhdGEgaGFzIGJlZW4gY29udmVydGVkICovCi0gICAgRlRfU3RyZWFtICAgICAgICBjaWRfc3RyZWFtOwotCi0gIH0gQ0lEX0ZhY2VSZWM7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVDFUWVBFU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3NThlMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHR0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIFNGTlQvVHJ1ZVR5cGUgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUVFRZUEVTX0hfCi0jZGVmaW5lIFRUVFlQRVNfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgUkVRVUlSRUQgVFJVRVRZUEUvT1BFTlRZUEUgVEFCTEVTIERFRklOSVRJT05TICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVENfSGVhZGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSBjb2xsZWN0aW9uIGhlYWRlci4gIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG9mZnNldHMgb2YgICAgKi8KLSAgLyogICAgdGhlIGZvbnQgaGVhZGVycyBvZiBlYWNoIGRpc3RpbmN0IFRydWVUeXBlIGZhY2UgaW4gdGhlIGZpbGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgICA6OiBNdXN0IGJlIGB0dGMgJyB0byBpbmRpY2F0ZSBhIFRydWVUeXBlIGNvbGxlY3Rpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICAgOjogVGhlIG51bWJlciBvZiBmYWNlcyBpbiB0aGUgY29sbGVjdGlvbi4gIFRoZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gc2F5cyB0aGlzIHNob3VsZCBiZSBhbiB1bnNpZ25lZCBsb25nLCBidXQgKi8KLSAgLyogICAgICAgICAgICAgICB3ZSB1c2UgYSBzaWduZWQgbG9uZyBzaW5jZSB3ZSBuZWVkIHRoZSB2YWx1ZSAtMSBmb3IgICAgICovCi0gIC8qICAgICAgICAgICAgICAgc3BlY2lmaWMgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyA6OiBUaGUgb2Zmc2V0cyBvZiB0aGUgZm9udCBoZWFkZXJzLCBvbmUgcGVyIGZhY2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRDX0hlYWRlclJlY18KLSAgewotICAgIEZUX1VMb25nICAgdGFnOwotICAgIEZUX0ZpeGVkICAgdmVyc2lvbjsKLSAgICBGVF9Mb25nICAgIGNvdW50OwotICAgIEZUX1VMb25nKiAgb2Zmc2V0czsKLQotICB9IFRUQ19IZWFkZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTRk5UX0hlYWRlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTRk5UIGZpbGUgZm9ybWF0IGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfdGFnICAgICA6OiBUaGUgZm9udCBmb3JtYXQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV90YWJsZXMgICAgIDo6IFRoZSBudW1iZXIgb2YgdGFibGVzIGluIGZpbGUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2VhcmNoX3JhbmdlICAgOjogTXVzdCBiZSBgMTYgKiAobWF4IHBvd2VyIG9mIDIgPD0gbnVtX3RhYmxlcyknLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbnRyeV9zZWxlY3RvciA6OiBNdXN0IGJlIGxvZzIgb2YgYHNlYXJjaF9yYW5nZSAvIDE2Jy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlX3NoaWZ0ICAgIDo6IE11c3QgYmUgYG51bV90YWJsZXMgKiAxNiAtIHNlYXJjaF9yYW5nZScuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFNGTlRfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICBmb3JtYXRfdGFnOwotICAgIEZUX1VTaG9ydCAgbnVtX3RhYmxlczsKLSAgICBGVF9VU2hvcnQgIHNlYXJjaF9yYW5nZTsKLSAgICBGVF9VU2hvcnQgIGVudHJ5X3NlbGVjdG9yOwotICAgIEZUX1VTaG9ydCAgcmFuZ2Vfc2hpZnQ7Ci0KLSAgICBGVF9VTG9uZyAgIG9mZnNldDsgIC8qIG5vdCBpbiBmaWxlICovCi0KLSAgfSBTRk5UX0hlYWRlclJlYywgKlNGTlRfSGVhZGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgZ2l2ZW4gdGFibGUgb2YgYSBUcnVlVHlwZSBmb250LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGFnICAgICAgOjogQSBmb3VyLWJ5dGVzIHRhZyBkZXNjcmliaW5nIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVja1N1bSA6OiBUaGUgdGFibGUgY2hlY2tzdW0uICBUaGlzIHZhbHVlIGNhbiBiZSBpZ25vcmVkLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9mZnNldCAgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIHRhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBUcnVlVHlwZSAqLwotICAvKiAgICAgICAgICAgICAgICBmb250IGluIGl0cyByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExlbmd0aCAgIDo6IFRoZSB0YWJsZSBsZW5ndGggKGluIGJ5dGVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1RhYmxlUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgIFRhZzsgICAgICAgIC8qICAgICAgICB0YWJsZSB0eXBlICovCi0gICAgRlRfVUxvbmcgIENoZWNrU3VtOyAgIC8qICAgIHRhYmxlIGNoZWNrc3VtICovCi0gICAgRlRfVUxvbmcgIE9mZnNldDsgICAgIC8qIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gICAgRlRfVUxvbmcgIExlbmd0aDsgICAgIC8qICAgICAgdGFibGUgbGVuZ3RoICovCi0KLSAgfSBUVF9UYWJsZVJlYywgKlRUX1RhYmxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV09GRl9IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV09GRiBmaWxlIGZvcm1hdCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1dPRkYvI1dPRkZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBXT0ZGX0hlYWRlclJlY18KLSAgewotICAgIEZUX1VMb25nICAgc2lnbmF0dXJlOwotICAgIEZUX1VMb25nICAgZmxhdm9yOwotICAgIEZUX1VMb25nICAgbGVuZ3RoOwotICAgIEZUX1VTaG9ydCAgbnVtX3RhYmxlczsKLSAgICBGVF9VU2hvcnQgIHJlc2VydmVkOwotICAgIEZUX1VMb25nICAgdG90YWxTZm50U2l6ZTsKLSAgICBGVF9VU2hvcnQgIG1ham9yVmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgIG1pbm9yVmVyc2lvbjsKLSAgICBGVF9VTG9uZyAgIG1ldGFPZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBtZXRhTGVuZ3RoOwotICAgIEZUX1VMb25nICAgbWV0YU9yaWdMZW5ndGg7Ci0gICAgRlRfVUxvbmcgICBwcml2T2Zmc2V0OwotICAgIEZUX1VMb25nICAgcHJpdkxlbmd0aDsKLQotICB9IFdPRkZfSGVhZGVyUmVjLCAqV09GRl9IZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXT0ZGX1RhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBnaXZlbiB0YWJsZSBvZiBhIFdPRkYgZm9udC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUYWcgICAgICAgIDo6IEEgZm91ci1ieXRlcyB0YWcgZGVzY3JpYmluZyB0aGUgdGFibGUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9mZnNldCAgICAgOjogVGhlIG9mZnNldCBvZiB0aGUgdGFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFdPRkYgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGZvbnQgaW4gaXRzIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXBMZW5ndGggOjogQ29tcHJlc3NlZCB0YWJsZSBsZW5ndGggKGluIGJ5dGVzKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3JpZ0xlbmd0aCA6OiBVbmNvbXByZXNzZWQgdGFibGUgbGVuZ3RoIChpbiBieXRlcykuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVja1N1bSAgIDo6IFRoZSB0YWJsZSBjaGVja3N1bS4gIFRoaXMgdmFsdWUgY2FuIGJlIGlnbm9yZWQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9yaWdPZmZzZXQgOjogVGhlIHVuY29tcHJlc3NlZCB0YWJsZSBmaWxlIG9mZnNldC4gIFRoaXMgdmFsdWUgZ2V0cyAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIHdoaWxlIGNvbnN0cnVjdGluZyB0aGUgKHVuY29tcHJlc3NlZCkgU0ZOVCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBoZWFkZXIuICBJdCBpcyBub3QgY29udGFpbmVkIGluIHRoZSBXT0ZGIGZpbGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgV09GRl9UYWJsZVJlY18KLSAgewotICAgIEZUX1VMb25nICBUYWc7ICAgICAgICAgICAvKiB0YWJsZSBJRCAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVUxvbmcgIE9mZnNldDsgICAgICAgIC8qIHRhYmxlIGZpbGUgb2Zmc2V0ICAgICAgICAgKi8KLSAgICBGVF9VTG9uZyAgQ29tcExlbmd0aDsgICAgLyogY29tcHJlc3NlZCB0YWJsZSBsZW5ndGggICAqLwotICAgIEZUX1VMb25nICBPcmlnTGVuZ3RoOyAgICAvKiB1bmNvbXByZXNzZWQgdGFibGUgbGVuZ3RoICovCi0gICAgRlRfVUxvbmcgIENoZWNrU3VtOyAgICAgIC8qIHVuY29tcHJlc3NlZCBjaGVja3N1bSAgICAgKi8KLQotICAgIEZUX1VMb25nICBPcmlnT2Zmc2V0OyAgICAvKiB1bmNvbXByZXNzZWQgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vdCBpbiB0aGUgV09GRiBmaWxlKSAgICAgICAgICovCi0gIH0gV09GRl9UYWJsZVJlYywgKldPRkZfVGFibGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb25nTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyB0aGUgbG9uZyBtZXRyaWNzIG9mIHRoZSBgaG10eCcgYW5kIGB2bXR4JyAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgdGFibGVzLiAgVGhlIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB3aWR0aCBvciBoZWlnaHQgZm9yIHRoZSBnbHlwaC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZWFyaW5nIDo6IFRoZSBsZWZ0LXNpZGUgb3IgdG9wLXNpZGUgYmVhcmluZyBmb3IgdGhlIGdseXBoLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Mb25nTWV0cmljc1JlY18KLSAgewotICAgIEZUX1VTaG9ydCAgYWR2YW5jZTsKLSAgICBGVF9TaG9ydCAgIGJlYXJpbmc7Ci0KLSAgfSBUVF9Mb25nTWV0cmljc1JlYywgKlRUX0xvbmdNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2hvcnRNZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgdHlwZSB0byBtb2RlbCB0aGUgc2hvcnQgbWV0cmljcyBvZiB0aGUgYGhtdHgnIGFuZCBgdm10eCcgICovCi0gIC8qICAgIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9TaG9ydCAgVFRfU2hvcnRNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTmFtZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgVHJ1ZVR5cGUgbmFtZSByZWNvcmRzLiAgTmFtZSByZWNvcmRzIGFyZSB1c2VkICovCi0gIC8qICAgIHRvIHN0b3JlIGltcG9ydGFudCBzdHJpbmdzIGxpa2UgZmFtaWx5IG5hbWUsIHN0eWxlIG5hbWUsICAgICAgICAgICAqLwotICAvKiAgICBjb3B5cmlnaHQsIGV0Yy4gaW4gX2xvY2FsaXplZF8gdmVyc2lvbnMgKGkuZS4sIGxhbmd1YWdlLCBlbmNvZGluZywgKi8KLSAgLyogICAgZXRjKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGxhdGZvcm1JRCAgIDo6IFRoZSBJRCBvZiB0aGUgbmFtZSdzIGVuY29kaW5nIHBsYXRmb3JtLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZ0lEICAgOjogVGhlIHBsYXRmb3JtLXNwZWNpZmljIElEIGZvciB0aGUgbmFtZSdzIGVuY29kaW5nLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhbmd1YWdlSUQgICA6OiBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgSUQgZm9yIHRoZSBuYW1lJ3MgbGFuZ3VhZ2UuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZUlEICAgICAgIDo6IFRoZSBJRCBzcGVjaWZ5aW5nIHdoYXQga2luZCBvZiBuYW1lIHRoaXMgaXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmdMZW5ndGggOjogVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZ09mZnNldCA6OiBUaGUgb2Zmc2V0IHRvIHRoZSBzdHJpbmcgaW4gdGhlIGBuYW1lJyB0YWJsZS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgc3RyaW5nJ3MgYnl0ZXMuICBOb3RlIHRoYXQgdGhlc2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBhcmUgdXN1YWxseSBVVEYtMTYgZW5jb2RlZCBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX05hbWVSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHBsYXRmb3JtSUQ7Ci0gICAgRlRfVVNob3J0ICBlbmNvZGluZ0lEOwotICAgIEZUX1VTaG9ydCAgbGFuZ3VhZ2VJRDsKLSAgICBGVF9VU2hvcnQgIG5hbWVJRDsKLSAgICBGVF9VU2hvcnQgIHN0cmluZ0xlbmd0aDsKLSAgICBGVF9VTG9uZyAgIHN0cmluZ09mZnNldDsKLQotICAgIC8qIHRoaXMgbGFzdCBmaWVsZCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc3BlYyAqLwotICAgIC8qIGJ1dCB1c2VkIGJ5IHRoZSBGcmVlVHlwZSBlbmdpbmUgICAgICAgICAgICAqLwotCi0gICAgRlRfQnl0ZSogIHN0cmluZzsKLQotICB9IFRUX05hbWVSZWMsICpUVF9OYW1lOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTGFuZ1RhZ1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgbGFuZ3VhZ2UgdGFnIHJlY29yZHMgaW4gU0ZOVCBgbmFtZScgdGFibGVzLCAgICovCi0gIC8qICAgIGludHJvZHVjZWQgaW4gT3BlblR5cGUgdmVyc2lvbiAxLjYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZ0xlbmd0aCA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nT2Zmc2V0IDo6IFRoZSBvZmZzZXQgdG8gdGhlIHN0cmluZyBpbiB0aGUgYG5hbWUnIHRhYmxlLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmcgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzdHJpbmcncyBieXRlcy4gIE5vdGUgdGhhdCB0aGVzZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGFyZSBVVEYtMTZCRSBlbmNvZGVkIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBUVF9MYW5nVGFnUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICBzdHJpbmdMZW5ndGg7Ci0gICAgRlRfVUxvbmcgICBzdHJpbmdPZmZzZXQ7Ci0KLSAgICAvKiB0aGlzIGxhc3QgZmllbGQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHNwZWMgKi8KLSAgICAvKiBidXQgdXNlZCBieSB0aGUgRnJlZVR5cGUgZW5naW5lICAgICAgICAgICAgKi8KLQotICAgIEZUX0J5dGUqICBzdHJpbmc7Ci0KLSAgfSBUVF9MYW5nVGFnUmVjLCAqVFRfTGFuZ1RhZzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX05hbWVUYWJsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSBuYW1lIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgICAgICAgICAgIDo6IFRoZSBmb3JtYXQgb2YgdGhlIG5hbWUgdGFibGUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtTmFtZVJlY29yZHMgICAgOjogVGhlIG51bWJlciBvZiBuYW1lcyBpbiB0YWJsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdG9yYWdlT2Zmc2V0ICAgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBuYW1lIHRhYmxlIGluIHRoZSBgbmFtZScgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lcyAgICAgICAgICAgICA6OiBBbiBhcnJheSBvZiBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bUxhbmdUYWdSZWNvcmRzIDo6IFRoZSBudW1iZXIgb2YgbGFuZ3VhZ2UgdGFncyBpbiB0YWJsZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFuZ1RhZ3MgICAgICAgICAgOjogQW4gYXJyYXkgb2YgbGFuZ3VhZ2UgdGFnIHJlY29yZHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICAgICAgICA6OiBUaGUgZmlsZSdzIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9OYW1lVGFibGVSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgICAgICAgZm9ybWF0OwotICAgIEZUX1VJbnQgICAgICAgICBudW1OYW1lUmVjb3JkczsKLSAgICBGVF9VSW50ICAgICAgICAgc3RvcmFnZU9mZnNldDsKLSAgICBUVF9OYW1lUmVjKiAgICAgbmFtZXM7Ci0gICAgRlRfVUludCAgICAgICAgIG51bUxhbmdUYWdSZWNvcmRzOwotICAgIFRUX0xhbmdUYWdSZWMqICBsYW5nVGFnczsKLSAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtOwotCi0gIH0gVFRfTmFtZVRhYmxlUmVjLCAqVFRfTmFtZVRhYmxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgIE9QVElPTkFMIFRSVUVUWVBFL09QRU5UWVBFIFRBQkxFUyBERUZJTklUSU9OUyAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2FzcFJhbmdlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0aW55IHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgZ2FzcCByYW5nZSBhY2NvcmRpbmcgdG8gdGhlICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBQRU0gIDo6IFRoZSBtYXhpbXVtIHBwZW0gdmFsdWUgdG8gd2hpY2ggYGdhc3BGbGFnJyBhcHBsaWVzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2FzcEZsYWcgOjogQSBmbGFnIGRlc2NyaWJpbmcgdGhlIGdyaWQtZml0dGluZyBhbmQgYW50aS1hbGlhc2luZyAgICovCi0gIC8qICAgICAgICAgICAgICAgIG1vZGVzIHRvIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0dhc3BSYW5nZVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgbWF4UFBFTTsKLSAgICBGVF9VU2hvcnQgIGdhc3BGbGFnOwotCi0gIH0gVFRfR2FzcFJhbmdlUmVjLCAqVFRfR2FzcFJhbmdlOwotCi0KLSNkZWZpbmUgVFRfR0FTUF9HUklERklUICAweDAxCi0jZGVmaW5lIFRUX0dBU1BfRE9HUkFZICAgMHgwMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2FzcFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgdGhlIFRydWVUeXBlIGBnYXNwJyB0YWJsZSB1c2VkIHRvIHNwZWNpZnkgICAgICovCi0gIC8qICAgIGdyaWQtZml0dGluZyBhbmQgYW50aS1hbGlhc2luZyBiZWhhdmlvdXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gICAgOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtUmFuZ2VzICA6OiBUaGUgbnVtYmVyIG9mIGdhc3AgcmFuZ2VzIGluIHRhYmxlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnYXNwUmFuZ2VzIDo6IEFuIGFycmF5IG9mIGdhc3AgcmFuZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9HYXNwXwotICB7Ci0gICAgRlRfVVNob3J0ICAgICB2ZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgICAgbnVtUmFuZ2VzOwotICAgIFRUX0dhc3BSYW5nZSAgZ2FzcFJhbmdlczsKLQotICB9IFRUX0dhc3BSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgIEVNQkVEREVEIEJJVE1BUFMgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X01ldHJpY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGJpZyBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggYml0bWFwICAgKi8KLSAgLyogICAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250LiAgVGhlc2UgYXJlIHVzdWFsbHkgZm91bmQgaW4gdGhlICAgICovCi0gIC8qICAgIGBFQkRUJyAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgICAgICA6OiBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgICAgIDo6IFRoZSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpQmVhcmluZ1ggOjogVGhlIGhvcml6b250YWwgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlCZWFyaW5nWSA6OiBUaGUgaG9yaXpvbnRhbCB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUFkdmFuY2UgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0QmVhcmluZ1ggOjogVGhlIHZlcnRpY2FsIGxlZnQgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRCZWFyaW5nWSA6OiBUaGUgdmVydGljYWwgdG9wIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEFkdmFuY2UgIDo6IFRoZSB2ZXJ0aWNhbCBhZHZhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9NZXRyaWNzUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICBoZWlnaHQ7Ci0gICAgRlRfVVNob3J0ICB3aWR0aDsKLQotICAgIEZUX1Nob3J0ICAgaG9yaUJlYXJpbmdYOwotICAgIEZUX1Nob3J0ICAgaG9yaUJlYXJpbmdZOwotICAgIEZUX1VTaG9ydCAgaG9yaUFkdmFuY2U7Ci0KLSAgICBGVF9TaG9ydCAgIHZlcnRCZWFyaW5nWDsKLSAgICBGVF9TaG9ydCAgIHZlcnRCZWFyaW5nWTsKLSAgICBGVF9VU2hvcnQgIHZlcnRBZHZhbmNlOwotCi0gIH0gVFRfU0JpdF9NZXRyaWNzUmVjLCAqVFRfU0JpdF9NZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9TbWFsbE1ldHJpY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHRoZSBzbWFsbCBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggYml0bWFwICovCi0gIC8qICAgIGluIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udC4gIFRoZXNlIGFyZSB1c3VhbGx5IGZvdW5kIGluIHRoZSAgICAqLwotICAvKiAgICBgRUJEVCcgKE1pY3Jvc29mdCkgb3IgdGhlIGBiZGF0JyAoQXBwbGUpIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICA6OiBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgIDo6IFRoZSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmVhcmluZ1ggOjogVGhlIGxlZnQtc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZWFyaW5nWSA6OiBUaGUgdG9wLXNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9yIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfU21hbGxfTWV0cmljc18KLSAgewotICAgIEZUX0J5dGUgIGhlaWdodDsKLSAgICBGVF9CeXRlICB3aWR0aDsKLQotICAgIEZUX0NoYXIgIGJlYXJpbmdYOwotICAgIEZUX0NoYXIgIGJlYXJpbmdZOwotICAgIEZUX0J5dGUgIGFkdmFuY2U7Ci0KLSAgfSBUVF9TQml0X1NtYWxsTWV0cmljc1JlYywgKlRUX1NCaXRfU21hbGxNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgdGV4dCBsaW5lIG1ldHJpY3Mgb2YgYSBnaXZlbiAgICAgICovCi0gIC8qICAgIGJpdG1hcCBzdHJpa2UsIGZvciBlaXRoZXIgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGxheW91dC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzY2VuZGVyICAgICAgICAgICAgICAgIDo6IFRoZSBhc2NlbmRlciBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVzY2VuZGVyICAgICAgICAgICAgICAgOjogVGhlIGRlc2NlbmRlciBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfd2lkdGggICAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X3Nsb3BlX2VudW1lcmF0b3IgIDo6IFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAxIGZvciBub24taXRhbGljIGZvbnRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X3Nsb3BlX2Rlbm9taW5hdG9yIDo6IFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAwIGZvciBub24taXRhbGljIGZvbnRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X29mZnNldCAgICAgICAgICAgIDo6IE9mZnNldCBpbiBwaXhlbHMgdG8gbW92ZSB0aGUgY2FyZXQgZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXIgcG9zaXRpb25pbmcuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9vcmlnaW5fU0IgICAgICAgICAgIDo6IE1pbmltdW0gb2YgaG9yaUJlYXJpbmdYIChyZXNwLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1kpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX2FkdmFuY2VfU0IgICAgICAgICAgOjogTWluaW11bSBvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgYWR2YW5jZSAtICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaG9yaUJlYXJpbmdYICsgd2lkdGggKSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgYWR2YW5jZSAtICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2ZXJ0QmVhcmluZ1kgKyBoZWlnaHQgKSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9iZWZvcmVfQkwgICAgICAgICAgIDo6IE1heGltdW0gb2YgaG9yaUJlYXJpbmdZIChyZXNwLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1kpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9hZnRlcl9CTCAgICAgICAgICAgIDo6IE1pbmltdW0gb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3JpQmVhcmluZ1kgLSBoZWlnaHQgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydEJlYXJpbmdYIC0gd2lkdGggICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFkcyAgICAgICAgICAgICAgICAgICAgOjogVW51c2VkICh0byBtYWtlIHRoZSBzaXplIG9mIHRoZSByZWNvcmQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbXVsdGlwbGUgb2YgMzIgYml0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWNfCi0gIHsKLSAgICBGVF9DaGFyICBhc2NlbmRlcjsKLSAgICBGVF9DaGFyICBkZXNjZW5kZXI7Ci0gICAgRlRfQnl0ZSAgbWF4X3dpZHRoOwotICAgIEZUX0NoYXIgIGNhcmV0X3Nsb3BlX251bWVyYXRvcjsKLSAgICBGVF9DaGFyICBjYXJldF9zbG9wZV9kZW5vbWluYXRvcjsKLSAgICBGVF9DaGFyICBjYXJldF9vZmZzZXQ7Ci0gICAgRlRfQ2hhciAgbWluX29yaWdpbl9TQjsKLSAgICBGVF9DaGFyICBtaW5fYWR2YW5jZV9TQjsKLSAgICBGVF9DaGFyICBtYXhfYmVmb3JlX0JMOwotICAgIEZUX0NoYXIgIG1pbl9hZnRlcl9CTDsKLSAgICBGVF9DaGFyICBwYWRzWzJdOwotCi0gIH0gVFRfU0JpdF9MaW5lTWV0cmljc1JlYywgKlRUX1NCaXRfTGluZU1ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X1JhbmdlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFRydWVUeXBlL09wZW5UeXBlIHN1YkluZGV4VGFibGUgYXMgZGVmaW5lZCBpbiB0aGUgYEVCTEMnICAgICAgICAgKi8KLSAgLyogICAgKE1pY3Jvc29mdCkgb3IgYGJsb2MnIChBcHBsZSkgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmlyc3RfZ2x5cGggICA6OiBUaGUgZmlyc3QgZ2x5cGggaW5kZXggaW4gdGhlIHJhbmdlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsYXN0X2dseXBoICAgIDo6IFRoZSBsYXN0IGdseXBoIGluZGV4IGluIHRoZSByYW5nZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluZGV4X2Zvcm1hdCAgOjogVGhlIGZvcm1hdCBvZiBpbmRleCB0YWJsZS4gIFZhbGlkIHZhbHVlcyBhcmUgMSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHRvIDUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGltYWdlX2Zvcm1hdCAgOjogVGhlIGZvcm1hdCBvZiBgRUJEVCcgaW1hZ2UgZGF0YS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1hZ2Vfb2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IHRvIGltYWdlIGRhdGEgaW4gYEVCRFQnLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbWFnZV9zaXplICAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDIgYW5kIDUuICBUaGlzIGlzIHRoZSBzaXplIGluICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBlYWNoIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaWdfbWV0cmljcyAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDIgYW5kIDUuICBUaGlzIGlzIHRoZSBiaWcgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBtZXRyaWNzIGZvciBlYWNoIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzICAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDQgYW5kIDUuICBUaGlzIGlzIHRoZSBudW1iZXIgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBnbHlwaHMgaW4gdGhlIGNvZGUgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9vZmZzZXRzIDo6IEZvciBpbmRleCBmb3JtYXRzIDEgYW5kIDMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2NvZGVzICAgOjogRm9yIGluZGV4IGZvcm1hdHMgNCBhbmQgNS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfb2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBpbmRleCB0YWJsZSBpbiB0aGUgYEVCTEMnICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBPbmx5IHVzZWQgZHVyaW5nIHN0cmlrZSBsb2FkaW5nLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfUmFuZ2VSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgIGZpcnN0X2dseXBoOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgbGFzdF9nbHlwaDsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgICAgaW5kZXhfZm9ybWF0OwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgaW1hZ2VfZm9ybWF0OwotICAgIEZUX1VMb25nICAgICAgICAgICAgaW1hZ2Vfb2Zmc2V0OwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICBpbWFnZV9zaXplOwotICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgbWV0cmljczsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgIG51bV9nbHlwaHM7Ci0KLSAgICBGVF9VTG9uZyogICAgICAgICAgIGdseXBoX29mZnNldHM7Ci0gICAgRlRfVVNob3J0KiAgICAgICAgICBnbHlwaF9jb2RlczsKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgdGFibGVfb2Zmc2V0OwotCi0gIH0gVFRfU0JpdF9SYW5nZVJlYywgKlRUX1NCaXRfUmFuZ2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X1N0cmlrZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGRlc2NyaWJlIGEgZ2l2ZW4gYml0bWFwIHN0cmlrZSBpbiB0aGUgYEVCTEMnICAgICAgKi8KLSAgLyogICAgKE1pY3Jvc29mdCkgb3IgYGJsb2MnIChBcHBsZSkgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBudW1faW5kZXhfcmFuZ2VzIDo6IFRoZSBudW1iZXIgb2YgaW5kZXggcmFuZ2VzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGluZGV4X3JhbmdlcyAgICAgOjogQW4gYXJyYXkgb2YgZ2x5cGggaW5kZXggcmFuZ2VzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY29sb3JfcmVmICAgICAgICA6OiBVbnVzZWQuICBgY29sb3JfcmVmJyBpcyBwdXQgaW4gZm9yIGZ1dHVyZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgZW5oYW5jZW1lbnRzLCBidXQgdGhlc2UgZmllbGRzIGFyZSBhbHJlYWR5ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGluIHVzZSBieSBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gTmV3dG9uKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBGb3IgZGV0YWlscywgcGxlYXNlIHNlZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmJsb2MuaHRtbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBob3JpICAgICAgICAgICAgIDo6IFRoZSBsaW5lIG1ldHJpY3MgZm9yIGhvcml6b250YWwgbGF5b3V0cy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHZlcnQgICAgICAgICAgICAgOjogVGhlIGxpbmUgbWV0cmljcyBmb3IgdmVydGljYWwgbGF5b3V0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRfZ2x5cGggICAgICA6OiBUaGUgbG93ZXN0IGdseXBoIGluZGV4IGZvciB0aGlzIHN0cmlrZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBlbmRfZ2x5cGggICAgICAgIDo6IFRoZSBoaWdoZXN0IGdseXBoIGluZGV4IGZvciB0aGlzIHN0cmlrZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHhfcHBlbSAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeV9wcGVtICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBiaXRfZGVwdGggICAgICAgIDo6IFRoZSBiaXQgZGVwdGguICBWYWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhbmQgOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmbGFncyAgICAgICAgICAgIDo6IElzIHRoaXMgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIHN0cmlrZT8gIEZvciAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLCBwbGVhc2Ugc2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmJsb2MuaHRtbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfU3RyaWtlUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICAgICAgICAgICAgICAgbnVtX3JhbmdlczsKLSAgICBUVF9TQml0X1JhbmdlICAgICAgICAgICBzYml0X3JhbmdlczsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICByYW5nZXNfb2Zmc2V0OwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgICAgY29sb3JfcmVmOwotCi0gICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgaG9yaTsKLSAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICB2ZXJ0OwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgc3RhcnRfZ2x5cGg7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgZW5kX2dseXBoOwotCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeF9wcGVtOwotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHlfcHBlbTsKLQotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIGJpdF9kZXB0aDsKLSAgICBGVF9DaGFyICAgICAgICAgICAgICAgICBmbGFnczsKLQotICB9IFRUX1NCaXRfU3RyaWtlUmVjLCAqVFRfU0JpdF9TdHJpa2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X0NvbXBvbmVudFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBjb21wb3VuZCBzYml0IGVsZW1lbnQuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9jb2RlIDo6IFRoZSBlbGVtZW50J3MgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfb2Zmc2V0ICAgOjogVGhlIGVsZW1lbnQncyBsZWZ0IGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9vZmZzZXQgICA6OiBUaGUgZWxlbWVudCdzIHRvcCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9Db21wb25lbnRSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIGdseXBoX2NvZGU7Ci0gICAgRlRfQ2hhciAgICB4X29mZnNldDsKLSAgICBGVF9DaGFyICAgIHlfb2Zmc2V0OwotCi0gIH0gVFRfU0JpdF9Db21wb25lbnRSZWMsICpUVF9TQml0X0NvbXBvbmVudDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfU2NhbGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZGVzY3JpYmUgYSBnaXZlbiBiaXRtYXAgc2NhbGluZyB0YWJsZSwgYXMgZGVmaW5lZCAqLwotICAvKiAgICBpbiB0aGUgYEVCU0MnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpICAgICAgICAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBsaW5lIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnQgICAgICAgICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCBsaW5lIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9wcGVtICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW0gICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfcHBlbV9zdWJzdGl0dXRlIDo6IFN1YnN0aXR1dGlvbiB4X3BwZW0gdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9wcGVtX3N1YnN0aXR1dGUgOjogU3Vic3RpdHV0aW9uIHlfcHBlbSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TY2FsZVJlY18KLSAgewotICAgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWMgIGhvcmk7Ci0gICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgdmVydDsKLQotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHhfcHBlbTsKLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB5X3BwZW07Ci0KLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB4X3BwZW1fc3Vic3RpdHV0ZTsKLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB5X3BwZW1fc3Vic3RpdHV0ZTsKLQotICB9IFRUX1NCaXRfU2NhbGVSZWMsICpUVF9TQml0X1NjYWxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgUE9TVFNDUklQVCBHTFlQSCBOQU1FUyBTVVBQT1JUICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdF8yMFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUG9zdHNjcmlwdCBuYW1lcyBzdWItdGFibGUsIGZvcm1hdCAyLjAuICBTdG9yZXMgdGhlIFBTIG5hbWUgb2YgICAgICovCi0gIC8qICAgIGVhY2ggZ2x5cGggaW4gdGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9nbHlwaHMgICAgOjogVGhlIG51bWJlciBvZiBuYW1lZCBnbHlwaHMgaW4gdGhlIHRhYmxlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX25hbWVzICAgICA6OiBUaGUgbnVtYmVyIG9mIFBTIG5hbWVzIHN0b3JlZCBpbiB0aGUgdGFibGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRpY2VzIDo6IFRoZSBpbmRpY2VzIG9mIHRoZSBnbHlwaHMgaW4gdGhlIG5hbWVzIGFycmF5cy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX25hbWVzICAgOjogVGhlIFBTIG5hbWVzIG5vdCBpbiBNYWMgRW5jb2RpbmcuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfMjBSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgICBudW1fZ2x5cGhzOwotICAgIEZUX1VTaG9ydCAgIG51bV9uYW1lczsKLSAgICBGVF9VU2hvcnQqICBnbHlwaF9pbmRpY2VzOwotICAgIEZUX0NoYXIqKiAgIGdseXBoX25hbWVzOwotCi0gIH0gVFRfUG9zdF8yMFJlYywgKlRUX1Bvc3RfMjA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qb3N0XzI1UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQb3N0c2NyaXB0IG5hbWVzIHN1Yi10YWJsZSwgZm9ybWF0IDIuNS4gIFN0b3JlcyB0aGUgUFMgbmFtZSBvZiAgICAgKi8KLSAgLyogICAgZWFjaCBnbHlwaCBpbiB0aGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2dseXBocyA6OiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXRzICAgIDo6IEFuIGFycmF5IG9mIHNpZ25lZCBvZmZzZXRzIGluIGEgbm9ybWFsIE1hYyAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBQb3N0c2NyaXB0IG5hbWUgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF8yNV8KLSAgewotICAgIEZUX1VTaG9ydCAgbnVtX2dseXBoczsKLSAgICBGVF9DaGFyKiAgIG9mZnNldHM7Ci0KLSAgfSBUVF9Qb3N0XzI1UmVjLCAqVFRfUG9zdF8yNTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Bvc3RfTmFtZXNSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgdGFibGUsIGVpdGhlciBmb3JtYXQgMi4wIG9yIDIuNS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlZCAgICA6OiBBIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgUFMgbmFtZXMgYXJlIGxvYWRlZC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0XzIwIDo6IFRoZSBzdWItdGFibGUgdXNlZCBmb3IgZm9ybWF0IDIuMC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfMjUgOjogVGhlIHN1Yi10YWJsZSB1c2VkIGZvciBmb3JtYXQgMi41LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0X05hbWVzUmVjXwotICB7Ci0gICAgRlRfQm9vbCAgbG9hZGVkOwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBUVF9Qb3N0XzIwUmVjICBmb3JtYXRfMjA7Ci0gICAgICBUVF9Qb3N0XzI1UmVjICBmb3JtYXRfMjU7Ci0KLSAgICB9IG5hbWVzOwotCi0gIH0gVFRfUG9zdF9OYW1lc1JlYywgKlRUX1Bvc3RfTmFtZXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgIEdYIFZBUklBVElPTiBUQUJMRSBTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgdHlwZWRlZiBzdHJ1Y3QgR1hfQmxlbmRSZWNfICAqR1hfQmxlbmQ7Ci0jZW5kaWYKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgIEVNQkVEREVEIEJERiBQUk9QRVJUSUVTIFRBQkxFIFNVUFBPUlQgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoKLSAgICogVGhlc2UgdHlwZXMgYXJlIHVzZWQgdG8gc3VwcG9ydCBhIGBCREYgJyB0YWJsZSB0aGF0IGlzbid0IHBhcnQgb2YgdGhlCi0gICAqIG9mZmljaWFsIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICBJdCBpcyBtYWlubHkgdXNlZCBpbiBTRk5ULWJhc2VkCi0gICAqIGJpdG1hcCBmb250cyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGZyb20gYSBzZXQgb2YgQkRGIGZvbnRzLgotICAgKgotICAgKiBUaGUgZm9ybWF0IG9mIHRoZSB0YWJsZSBpcyBhcyBmb2xsb3dzLgotICAgKgotICAgKiAgIFVTSE9SVCAgIHZlcnNpb24gICAgICBgQkRGICcgdGFibGUgdmVyc2lvbiBudW1iZXIsIHNob3VsZCBiZSAweDAwMDEuCi0gICAqICAgVVNIT1JUICAgc3RyaWtlQ291bnQgIE51bWJlciBvZiBzdHJpa2VzIChiaXRtYXAgc2l6ZXMpIGluIHRoaXMgdGFibGUuCi0gICAqICAgVUxPTkcgICAgc3RyaW5nVGFibGUgIE9mZnNldCAoZnJvbSBzdGFydCBvZiBCREYgdGFibGUpIHRvIHN0cmluZwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4KLSAgICoKLSAgICogVGhpcyBpcyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZiBgc3RyaWtlQ291bnQnIGRlc2NyaXB0b3JzLCBoYXZpbmcgdGhlCi0gICAqIGZvbGxvd2luZyBmb3JtYXQuCi0gICAqCi0gICAqICAgVVNIT1JUICAgcHBlbSAgICAgICAgIFZlcnRpY2FsIHBpeGVscyBwZXIgRU0gZm9yIHRoaXMgc3RyaWtlLgotICAgKiAgIFVTSE9SVCAgIG51bUl0ZW1zICAgICBOdW1iZXIgb2YgaXRlbXMgZm9yIHRoaXMgc3RyaWtlIChwcm9wZXJ0aWVzIGFuZAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhdG9tcykuICBNYXhpbXVtIGlzIDI1NS4KLSAgICoKLSAgICogVGhpcyBhcnJheSBpbiB0dXJuIGlzIGZvbGxvd2VkIGJ5IGBzdHJpa2VDb3VudCcgdmFsdWUgc2V0cy4gIEVhY2gKLSAgICogYHZhbHVlIHNldCcgaXMgYW4gYXJyYXkgb2YgYG51bUl0ZW1zJyBpdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgotICAgKgotICAgKiAgIFVMT05HICAgIGl0ZW1fbmFtZSAgICBPZmZzZXQgaW4gc3RyaW5nIHRhYmxlIHRvIGl0ZW0gbmFtZS4KLSAgICogICBVU0hPUlQgICBpdGVtX3R5cGUgICAgVGhlIGl0ZW0gdHlwZS4gIFBvc3NpYmxlIHZhbHVlcyBhcmUKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PiBzdHJpbmcgKGUuZy4sIENPTU1FTlQpCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gYXRvbSAgIChlLmcuLCBGT05UIG9yIGV2ZW4gU0laRSkKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9PiBpbnQzMgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0+IHVpbnQzMgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAweDEwID0+IEEgZmxhZyB0byBpbmRpY2F0ZSBhIHByb3BlcnRpZXMuICBUaGlzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgT1JlZCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMuCi0gICAqICAgVUxPTkcgICAgaXRlbV92YWx1ZSAgIEZvciBzdHJpbmdzICA9PiBPZmZzZXQgaW50byBzdHJpbmcgdGFibGUgd2l0aG91dAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgZG91YmxlIHF1b3Rlcy4KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGF0b21zICAgID0+IE9mZnNldCBpbnRvIHN0cmluZyB0YWJsZS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGludGVnZXJzID0+IERpcmVjdCB2YWx1ZS4KLSAgICoKLSAgICogQWxsIHN0cmluZ3MgaW4gdGhlIHN0cmluZyB0YWJsZSBjb25zaXN0IG9mIGJ5dGVzIGFuZCBhcmUKLSAgICogemVyby10ZXJtaW5hdGVkLgotICAgKgotICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0JERlJlY18KLSAgewotICAgIEZUX0J5dGUqICAgdGFibGU7Ci0gICAgRlRfQnl0ZSogICB0YWJsZV9lbmQ7Ci0gICAgRlRfQnl0ZSogICBzdHJpbmdzOwotICAgIEZUX1VMb25nICAgc3RyaW5nc19zaXplOwotICAgIEZUX1VJbnQgICAgbnVtX3N0cmlrZXM7Ci0gICAgRlRfQm9vbCAgICBsb2FkZWQ7Ci0KLSAgfSBUVF9CREZSZWMsICpUVF9CREY7Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0JERiAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgIE9SSUdJTkFMIFRUX0ZBQ0UgQ0xBU1MgREVGSU5JVElPTiAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBzdHJ1Y3R1cmUvY2xhc3MgaXMgZGVmaW5lZCBoZXJlIGJlY2F1c2UgaXQgaXMgY29tbW9uIHRvIHRoZSAgICAgICovCi0gIC8qIGZvbGxvd2luZyBmb3JtYXRzOiBUVEYsIE9wZW5UeXBlLVRULCBhbmQgT3BlblR5cGUtQ0ZGLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgY2xhc3NlcyBUVF9TaXplIGFuZCBUVF9HbHlwaFNsb3QgYXJlIG5vdCAgICAgICovCi0gIC8qIHNoYXJlZCBiZXR3ZWVuIGZvbnQgZHJpdmVycywgYW5kIGFyZSB0aHVzIGRlZmluZWQgaW4gYHR0b2Jqcy5oJy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGZhY2UvZm9udCBvYmplY3QuICBBIFRUX0ZhY2UgZW5jYXBzdWxhdGVzICAgKi8KLSAgLyogICAgdGhlIHJlc29sdXRpb24gYW5kIHNjYWxpbmcgaW5kZXBlbmRlbnQgcGFydHMgb2YgYSBUcnVlVHlwZSBmb250ICAgICovCi0gIC8qICAgIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUVF9GYWNlIHN0cnVjdHVyZSBpcyBhbHNvIHVzZWQgYXMgYSBgcGFyZW50IGNsYXNzJyBmb3IgdGhlICAgICAqLwotICAvKiAgICBPcGVuVHlwZS1DRkYgY2xhc3MgKFQyX0ZhY2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFRUX0ZhY2VSZWNfKiAgVFRfRmFjZTsKLQotCi0gIC8qIGEgZnVuY3Rpb24gdHlwZSB1c2VkIGZvciB0aGUgdHJ1ZXR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaG9va3MgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0ludGVycHJldGVyKSggdm9pZCogIGV4ZWNfY29udGV4dCApOwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVFRfTG9hZGVyUmVjXyogIFRUX0xvYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZWtzIGEgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IEEgNC1ieXRlIHRhZyB1c2VkIHRvIG5hbWUgdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgaW4gYnl0ZXMuICBTZXQgdG8gMCBpZiBub3QgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgZm9udCBmaWxlJ3Mgb3JpZ2luLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZGVyX0dvdG9UYWJsZUZ1bmMpKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlcl9TdGFydEdseXBoRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZWtzIGEgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiBhIGdpdmVuIGdseXBoIGVsZW1lbnQsIGFuZCBvcGVucyBhICAqLwotICAvKiAgICBmcmFtZSBmb3IgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgICAgICA6OiBUaGUgY3VycmVudCBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoIGluZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggdG8gYWNjZXNzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0ICAgICAgOjogVGhlIG9mZnNldCBvZiB0aGUgZ2x5cGggYWNjb3JkaW5nIHRvIHRoZSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGBsb2NhdGlvbnMnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnl0ZV9jb3VudCAgOjogVGhlIHNpemUgb2YgdGhlIGZyYW1lIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseSBlcXVpdmFsZW50IHRvIEZUX1NUUkVBTV9TRUVLKG9mZnNldCkgICAgICovCi0gIC8qICAgIGZvbGxvd2VkIGJ5IEZUX0ZSQU1FX0VOVEVSKGJ5dGVfY291bnQpIHdpdGggdGhlIGxvYWRlcidzIHN0cmVhbSwgICAqLwotICAvKiAgICBidXQgYWx0ZXJuYXRpdmUgZm9ybWF0cyAoZS5nLiBjb21wcmVzc2VkIG9uZXMpIG1pZ2h0IHVzZSBzb21ldGhpbmcgKi8KLSAgLyogICAgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZGVyX1N0YXJ0R2x5cGhGdW5jKSggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGJ5dGVfY291bnQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWRzIG9uZSBnbHlwaCBlbGVtZW50IChpdHMgaGVhZGVyLCBhIHNpbXBsZSBnbHlwaCwgb3IgYSAgICAgICAgICAqLwotICAvKiAgICBjb21wb3NpdGUpIGZyb20gdGhlIGxvYWRlcidzIGN1cnJlbnQgc3RyZWFtIGZyYW1lLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgOjogVGhlIGN1cnJlbnQgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYykoIFRUX0xvYWRlciAgbG9hZGVyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkZXJfRW5kR2x5cGhGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDbG9zZXMgdGhlIGN1cnJlbnQgbG9hZGVyIHN0cmVhbSBmcmFtZSBmb3IgdGhlIGdseXBoLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgOjogVGhlIGN1cnJlbnQgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlRUX0xvYWRlcl9FbmRHbHlwaEZ1bmMpKCBUVF9Mb2FkZXIgIGxvYWRlciApOwotCi0KLSAgdHlwZWRlZiBlbnVtIFRUX1NiaXRUYWJsZVR5cGVfCi0gIHsKLSAgICBUVF9TQklUX1RBQkxFX1RZUEVfTk9ORSA9IDAsCi0gICAgVFRfU0JJVF9UQUJMRV9UWVBFX0VCTEMsIC8qIGBFQkxDJyAoTWljcm9zb2Z0KSwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYGJsb2MnIChBcHBsZSkgICAgICAqLwotICAgIFRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDLCAvKiBgQ0JMQycgKEdvb2dsZSkgICAgICovCi0gICAgVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVgsIC8qIGBzYml4JyAoQXBwbGUpICAgICAgKi8KLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUVF9TQklUX1RBQkxFX1RZUEVfTUFYCi0KLSAgfSBUVF9TYml0VGFibGVUeXBlOwotCi0KLSAgLyogT3BlblR5cGUgMS44IGJyaW5ncyBuZXcgdGFibGVzIGZvciB2YXJpYXRpb24gZm9udCBzdXBwb3J0OyAgKi8KLSAgLyogdG8gbWFrZSB0aGUgb2xkIE1NIGFuZCBHWCBmb250cyBzdGlsbCB3b3JrIHdlIG5lZWQgdG8gY2hlY2sgKi8KLSAgLyogdGhlIHByZXNlbmNlIChhbmQgdmFsaWRpdHkpIG9mIHRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkICAgKi8KLSAgLyogYnkgdGhvc2UgdGFibGVzLiAgVGhlIGZvbGxvd2luZyBmbGFnIG1hY3JvcyBhcmUgZm9yIHRoZSAgICAgKi8KLSAgLyogZmllbGQgYHZhcmlhdGlvbl9zdXBwb3J0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IGBmdmFyJyBnZXRzIGNoZWNrZWQgaW1tZWRpYXRlbHkgYXQgZm9udCBsb2FkaW5nLCAgKi8KLSAgLyogd2hpbGUgdGhlIG90aGVyIGZlYXR1cmVzIGFyZSBvbmx5IGxvYWRlZCBpZiBNTSBzdXBwb3J0IGlzICAgKi8KLSAgLyogYWN0dWFsbHkgcmVxdWVzdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBGVkFSICovCi0jZGVmaW5lIFRUX0ZBQ0VfRkxBR19WQVJfRlZBUiAgKCAxIDw8IDAgKQotCi0gIC8qIEhWQVIgKi8KLSNkZWZpbmUgVFRfRkFDRV9GTEFHX1ZBUl9IQURWQU5DRSAgKCAxIDw8IDEgKQotI2RlZmluZSBUVF9GQUNFX0ZMQUdfVkFSX0xTQiAgICAgICAoIDEgPDwgMiApCi0jZGVmaW5lIFRUX0ZBQ0VfRkxBR19WQVJfUlNCICAgICAgICggMSA8PCAzICkKLQotICAvKiBWVkFSICovCi0jZGVmaW5lIFRUX0ZBQ0VfRkxBR19WQVJfVkFEVkFOQ0UgICggMSA8PCA0ICkKLSNkZWZpbmUgVFRfRkFDRV9GTEFHX1ZBUl9UU0IgICAgICAgKCAxIDw8IDUgKQotI2RlZmluZSBUVF9GQUNFX0ZMQUdfVkFSX0JTQiAgICAgICAoIDEgPDwgNiApCi0jZGVmaW5lIFRUX0ZBQ0VfRkxBR19WQVJfVk9SRyAgICAgICggMSA8PCA3ICkKLQotICAvKiBNVkFSICovCi0jZGVmaW5lIFRUX0ZBQ0VfRkxBR19WQVJfTVZBUiAgKCAxIDw8IDggKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBGYWNlIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVHJ1ZVR5cGUgZmFjZSBjbGFzcy4gIFRoZXNlIG9iamVjdHMgbW9kZWwgdGhlIHJlc29sdXRpb24gYW5kICAgKi8KLSAgLyogICAgcG9pbnQtc2l6ZSBpbmRlcGVuZGVudCBkYXRhIGZvdW5kIGluIGEgVHJ1ZVR5cGUgZm9udCBmaWxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgICAgICAgICAgOjogVGhlIGJhc2UgRlRfRmFjZSBzdHJ1Y3R1cmUsIG1hbmFnZWQgYnkgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRjX2hlYWRlciAgICAgICAgICAgOjogVGhlIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLCB1c2VkIHdoZW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGlzIGEgYHR0YycgcmF0aGVyIHRoYW4gYSBgdHRmJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3Igb3JkaW5hcnkgZm9udCBmaWxlcywgdGhlIGZpZWxkICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYHR0Y19oZWFkZXIuY291bnQnIGlzIHNldCB0byAwLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfdGFnICAgICAgICAgICA6OiBUaGUgZm9udCBmb3JtYXQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV90YWJsZXMgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgVHJ1ZVR5cGUgdGFibGVzIGluIHRoaXMgZm9udCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpcl90YWJsZXMgICAgICAgICAgIDo6IFRoZSBkaXJlY3Rvcnkgb2YgVHJ1ZVR5cGUgdGFibGVzIGZvciB0aGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlYWRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZm9udCBoZWFkZXIgKGBoZWFkJyB0YWJsZSkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIG9uIGZvbnQgb3BlbmluZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcml6b250YWwgICAgICAgICAgIDo6IFRoZSBmb250J3MgaG9yaXpvbnRhbCBoZWFkZXIgKGBoaGVhJyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSkuICBUaGlzIGZpZWxkIGFsc28gY29udGFpbnMgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBob3Jpem9udGFsIG1ldHJpY3MgdGFibGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIChgaG10eCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3Byb2ZpbGUgICAgICAgICAgOjogVGhlIGZvbnQncyBtYXhpbXVtIHByb2ZpbGUgdGFibGUuICBSZWFkIG9uICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgb3BlbmluZy4gIE5vdGUgdGhhdCBzb21lIG1heGltdW0gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgY2Fubm90IGJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBXZSB0aHVzIGRlZmluZSBhZGRpdGlvbmFsIGZpZWxkcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHRvIGhvbGQgdGhlIGNvbXB1dGVkIG1heGltYS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWxfaW5mbyAgICAgICAgOjogQSBib29sZWFuIHdoaWNoIGlzIHNldCB3aGVuIHRoZSBmb250IGZpbGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHZlcnRpY2FsIG1ldHJpY3MuICBJZiBub3QsIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiB0aGUgYHZlcnRpY2FsJyBmaWVsZCBpcyAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIHZlcnRpY2FsIGhlYWRlciAoYHZoZWEnIHRhYmxlKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBhbHNvIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIG1ldHJpY3MgdGFibGUgKGB2bXR4JyksIGlmIGZvdW5kLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQ6IFRoZSBjb250ZW50cyBvZiB0aGlzIGZpZWxkIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIGlmIHRoZSBgdmVydGljYWxfaW5mbycgZmllbGQgaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX25hbWVzICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBuYW1lIHJlY29yZHMgd2l0aGluIHRoaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZV90YWJsZSAgICAgICAgICAgOjogVGhlIHRhYmxlIG9mIG5hbWUgcmVjb3JkcyAoYG5hbWUnKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvczIgICAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIE9TLzIgdGFibGUgKGBPUy8yJykuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc3RzY3JpcHQgICAgICAgICAgIDo6IFRoZSBmb250J3MgUG9zdFNjcmlwdCB0YWJsZSAoYHBvc3QnICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSkuICBUaGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcyBhcmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGxvYWRlZCBieSB0aGUgZHJpdmVyIG9uIGZhY2Ugb3BlbmluZy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgYHR0cG9zdCcgbW9kdWxlIGZvciBtb3JlIGRldGFpbHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY21hcF90YWJsZSAgICAgICAgICAgOjogQWRkcmVzcyBvZiB0aGUgZmFjZSdzIGBjbWFwJyBTRk5UIHRhYmxlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1lbW9yeSAoaXQncyBhbiBleHRyYWN0ZWQgZnJhbWUpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY21hcF9zaXplICAgICAgICAgICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGBjbWFwX3RhYmxlJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlZCBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ290b190YWJsZSAgICAgICAgICAgOjogQSBmdW5jdGlvbiBjYWxsZWQgYnkgZWFjaCBUcnVlVHlwZSB0YWJsZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciB0byBwb3NpdGlvbiBhIHN0cmVhbSdzIGN1cnNvciB0byAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgYSBnaXZlbiB0YWJsZSBhY2NvcmRpbmcgdG8gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzIHRhZy4gIEl0IGRlZmF1bHRzIHRvIFRUX0dvdG9fRmFjZSBidXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBkaWZmZXJlbnQgZm9yIHN0cmFuZ2UgZm9ybWF0cyAoZS5nLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDQyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFjY2Vzc19nbHlwaF9mcmFtZSAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byBhY2Nlc3MgdGhlIGZyYW1lIG9mIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCB3aXRoaW4gdGhlIGZhY2UncyBmb250IGZpbGUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcmdldF9nbHlwaF9mcmFtZSAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byBmb3JnZXQgdGhlIGZyYW1lIG9mIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCB3aGVuIGFsbCBkYXRhIGhhcyBiZWVuIGxvYWRlZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlYWRfZ2x5cGhfaGVhZGVyICAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byByZWFkIGEgZ2x5cGggaGVhZGVyLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBiZXR3ZWVuIGFuIGBhY2Nlc3MnIGFuZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZvcmdldCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWFkX3NpbXBsZV9nbHlwaCAgICA6OiBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVhZCBhIHNpbXBsZSBnbHlwaC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGhlYWRlciB3YXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIGFuZCBiZWZvcmUgdGhlIGBmb3JnZXQnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVhZF9jb21wb3NpdGVfZ2x5cGggOjogQSBmdW5jdGlvbiB1c2VkIHRvIHJlYWQgYSBjb21wb3NpdGUgZ2x5cGguICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBoZWFkZXIgd2FzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkLCBhbmQgYmVmb3JlIHRoZSBgZm9yZ2V0Jy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNmbnQgICAgICAgICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgU0ZOVCBzZXJ2aWNlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHNuYW1lcyAgICAgICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBQb3N0U2NyaXB0IG5hbWVzIHNlcnZpY2UuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtbSAgICAgICAgICAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIE11bHRpcGxlIE1hc3RlcnMgc2VydmljZS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhciAgICAgICAgICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgTWV0cmljcyBWYXJpYXRpb25zICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhkbXggICAgICAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgaG9yaXpvbnRhbCBkZXZpY2UgbWV0cmljcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYGhkbXgnIHRhYmxlKS4gIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwgaW4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnYXNwICAgICAgICAgICAgICAgICA6OiBUaGUgZ3JpZC1maXR0aW5nIGFuZCBzY2FsaW5nIHByb3BlcnRpZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKGBnYXNwJykuICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGNsdCAgICAgICAgICAgICAgICAgOjogVGhlIGBwY2x0JyBTRk5UIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fc2JpdF9zY2FsZXMgICAgICA6OiBUaGUgbnVtYmVyIG9mIHNiaXQgc2NhbGVzIGZvciB0aGlzIGZvbnQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNiaXRfc2NhbGVzICAgICAgICAgIDo6IEFycmF5IG9mIHNiaXQgc2NhbGVzIGVtYmVkZGVkIGluIHRoaXMgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiBhICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0X25hbWVzICAgICA6OiBBIHRhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIFBvc3RzY3JpcHQgbmFtZXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgIHRoZSBnbHlwaHMgZm9yIHRoaXMgZm9udC4gIFNlZSB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgIGB0dGNvbmZpZy5oJyBmb3IgY29tbWVudHMgb24gdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgb3B0aW9uLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnRfcHJvZ3JhbV9zaXplICAgIDo6IFNpemUgaW4gYnl0ZWNvZGVzIG9mIHRoZSBmYWNlJ3MgZm9udCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLiAgMCBpZiBub25lIGRlZmluZWQuICBJZ25vcmVkIGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb250X3Byb2dyYW0gICAgICAgICA6OiBUaGUgZmFjZSdzIGZvbnQgcHJvZ3JhbSAoYnl0ZWNvZGUgc3RyZWFtKSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgYXQgbG9hZCB0aW1lLCBhbHNvIHVzZWQgZHVyaW5nICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHJlbmRlcmluZy4gIENvbWVzIGZyb20gdGhlIGBmcGdtJyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZvbnRzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN2dF9wcm9ncmFtX3NpemUgICAgIDo6IFRoZSBzaXplIGluIGJ5dGVjb2RlcyBvZiB0aGUgZmFjZSdzIGN2dCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLiAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN2dF9wcm9ncmFtICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgY3Z0IHByb2dyYW0gKGJ5dGVjb2RlIHN0cmVhbSkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBlYWNoIHRpbWUgYW4gaW5zdGFuY2Uvc2l6ZSBpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC9yZXNldC4gIENvbWVzIGZyb20gdGhlIGBwcmVwJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLiAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Z0X3NpemUgICAgICAgICAgICAgOjogU2l6ZSBvZiB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSAoaW4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMpLiAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Z0ICAgICAgICAgICAgICAgICAgOjogVGhlIGZhY2UncyBvcmlnaW5hbCBjb250cm9sIHZhbHVlIHRhYmxlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb3JkaW5hdGVzIGFyZSBleHByZXNzZWQgaW4gdW5zY2FsZWQgZm9udCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cy4gIENvbWVzIGZyb20gdGhlIGBjdnQgJyB0YWJsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbnRlcnByZXRlciAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIFRydWVUeXBlIGJ5dGVjb2RlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXJzIGZpZWxkIGlzIGFsc28gdXNlZCB0byBob29rICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWJ1Z2dlciBpbiBgdHRkZWJ1ZycuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXh0cmEgICAgICAgICAgICAgICAgOjogUmVzZXJ2ZWQgZm9yIHRoaXJkLXBhcnR5IGZvbnQgZHJpdmVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0X25hbWUgICAgICA6OiBUaGUgUFMgbmFtZSBvZiB0aGUgZm9udC4gIFVzZWQgYnkgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHNjcmlwdCBuYW1lIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlmX2xlbiAgICAgICAgICAgICA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBgZ2x5ZicgdGFibGUuICBOZWVkZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1hbGZvcm1lZCBgbG9jYScgdGFibGVzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlmX29mZnNldCAgICAgICAgICA6OiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGBnbHlmJyB0YWJsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlzX2NmZjIgICAgICAgICAgICAgIDo6IFNldCBpZiB0aGUgZm9udCBmb3JtYXQgaXMgQ0ZGMi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9ibGVuZCAgICAgICAgICAgICAgOjogQSBib29sZWFuIHdoaWNoIGlzIHNldCBpZiB0aGUgZm9udCBzaG91bGQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGJsZW5kZWQgKHRoaXMgaXMgZm9yIEdYIHZhcikuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxlbmQgICAgICAgICAgICAgICAgOjogQ29udGFpbnMgdGhlIGRhdGEgbmVlZGVkIHRvIGNvbnRyb2wgR1ggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhdGlvbiB0YWJsZXMgKHJhdGhlciBsaWtlIE11bHRpcGxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXN0ZXIgZGF0YSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlzX2RlZmF1bHRfaW5zdGFuY2UgIDo6IFNldCBpZiB0aGUgZ2x5cGggb3V0bGluZXMgY2FuIGJlIHVzZWQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bm1vZGlmaWVkIChpLmUuLCB3aXRob3V0IGFwcGx5aW5nIGdseXBoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9uIGRlbHRhcykuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYXRpb25fc3VwcG9ydCAgICA6OiBGbGFncyB0aGF0IGluZGljYXRlIHdoaWNoIE9wZW5UeXBlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbGl0eSByZWxhdGVkIHRvIGZvbnQgdmFyaWF0aW9uICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgaXMgcHJlc2VudCwgdmFsaWQsIGFuZCB1c2FibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgVFRfRkFDRV9GTEFHX1ZBUl9GVkFSIGlzIG9ubHkgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGRlc2lnbiBheGlzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJfcG9zdHNjcmlwdF9wcmVmaXggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFBvc3RTY3JpcHQgbmFtZSBwcmVmaXggbmVlZGVkIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdGluZyBhIHZhcmlhdGlvbiBmb250IGluc3RhbmNlJ3MgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUyBuYW1lIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhcl9wb3N0c2NyaXB0X3ByZWZpeF9sZW4gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBgdmFyX3Bvc3RzY3JpcHRfcHJlZml4JyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3J6X21ldHJpY3Nfc2l6ZSAgICA6OiBUaGUgc2l6ZSBvZiB0aGUgYGhtdHgnIHRhYmxlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRfbWV0cmljc19zaXplICAgIDo6IFRoZSBzaXplIG9mIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2xvY2F0aW9ucyAgICAgICAgOjogVGhlIG51bWJlciBvZiBnbHlwaCBsb2NhdGlvbnMgaW4gdGhpcyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGZpbGUuICBUaGlzIHNob3VsZCBiZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGljYWwgdG8gdGhlIG51bWJlciBvZiBnbHlwaHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9sb2NhdGlvbnMgICAgICA6OiBBbiBhcnJheSBvZiBsb25ncy4gIFRoZXNlIGFyZSBvZmZzZXRzIHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggZGF0YSB3aXRoaW4gdGhlIGBnbHlmJyB0YWJsZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGRteF90YWJsZSAgICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBgaGRteCcgdGFibGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZG14X3RhYmxlX3NpemUgICAgICA6OiBUaGUgc2l6ZSBvZiB0aGUgYGhkbXgnIHRhYmxlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhkbXhfcmVjb3JkX2NvdW50ICAgIDo6IFRoZSBudW1iZXIgb2YgaGRteCByZWNvcmRzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGRteF9yZWNvcmRfc2l6ZSAgICAgOjogVGhlIHNpemUgb2YgYSBzaW5nbGUgaGRteCByZWNvcmQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZG14X3JlY29yZF9zaXplcyAgICA6OiBBbiBhcnJheSBob2xkaW5nIHRoZSBwcGVtIHNpemVzIGF2YWlsYWJsZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGBoZG14JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0X3RhYmxlICAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGZvbnQncyBlbWJlZGRlZCBiaXRtYXAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0X3RhYmxlX3NpemUgICAgICA6OiBUaGUgc2l6ZSBvZiBgc2JpdF90YWJsZScuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNiaXRfdGFibGVfdHlwZSAgICAgIDo6IFRoZSBzYml0IHRhYmxlIHR5cGUgKENCTEMsIHNiaXgsIGV0Yy4pLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2JpdF9udW1fc3RyaWtlcyAgICAgOjogVGhlIG51bWJlciBvZiBzYml0IHN0cmlrZXMgZXhwb3NlZCBieSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVUeXBlJ3MgQVBJLCBvbWl0dGluZyBpbnZhbGlkIHN0cmlrZXMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2JpdF9zdHJpa2VfbWFwICAgICAgOjogQSBtYXBwaW5nIGJldHdlZW4gdGhlIHN0cmlrZSBpbmRpY2VzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9zZWQgYnkgdGhlIEFQSSBhbmQgdGhlIGluZGljZXMgdXNlZCBpbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZm9udCdzIHNiaXQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGtlcm5fdGFibGUgICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgYGtlcm4nIHRhYmxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2Vybl90YWJsZV9zaXplICAgICAgOjogVGhlIHNpemUgb2YgdGhlIGBrZXJuJyB0YWJsZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fa2Vybl90YWJsZXMgICAgICA6OiBUaGUgbnVtYmVyIG9mIHN1cHBvcnRlZCBrZXJuIHN1YnRhYmxlcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwIHRvIDMyOyBGcmVlVHlwZSByZWNvZ25pemVzIG9ubHkgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgb25lcyB3aXRoIGZvcm1hdCAwKS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2Vybl9hdmFpbF9iaXRzICAgICAgOjogVGhlIGF2YWlsYWJpbGl0eSBzdGF0dXMgb2Yga2VybiBzdWJ0YWJsZXM7ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJpdCBuIGlzIHNldCwgdGFibGUgbiBpcyBhdmFpbGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2Vybl9vcmRlcl9iaXRzICAgICAgOjogVGhlIHNvcnRlZG5lc3Mgc3RhdHVzIG9mIGtlcm4gc3VidGFibGVzOyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJpdCBuIGlzIHNldCwgdGFibGUgbiBpcyBzb3J0ZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmRmICAgICAgICAgICAgICAgICAgOjogRGF0YSByZWxhdGVkIHRvIGFuIFNGTlQgZm9udCdzIGBiZGYnICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlOyBzZWUgYHR0dHlwZXMuaCcuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yel9tZXRyaWNzX29mZnNldCAgOjogVGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBgaG10eCcgdGFibGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0X21ldHJpY3Nfb2Zmc2V0ICA6OiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwaF9mb3VuZF9mdW5jX2ZsYWdzIDo6IEZsYWdzIGlkZW50aWZ5aW5nIHNwZWNpYWwgYnl0ZWNvZGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgKHVzZWQgYnkgdGhlIHYzOCBpbXBsZW1lbnRhdGlvbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyKS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzcGhfY29tcGF0aWJpbGl0eV9tb2RlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmbGFnIGlzIHNldCBpZiB3ZSBhcmUgaW4gQ2xlYXJUeXBlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSAodXNlZCBieSB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MzggaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ5dGVjb2RlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlYmR0X3N0YXJ0ICAgICAgICAgICA6OiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIHNiaXQgZGF0YSB0YWJsZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKENCRFQsIGJkYXQsIGV0Yy4pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlYmR0X3NpemUgICAgICAgICAgICA6OiBUaGUgc2l6ZSBvZiB0aGUgc2JpdCBkYXRhIHRhYmxlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9GYWNlUmVjXwotICB7Ci0gICAgRlRfRmFjZVJlYyAgICAgICAgICAgIHJvb3Q7Ci0KLSAgICBUVENfSGVhZGVyUmVjICAgICAgICAgdHRjX2hlYWRlcjsKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgICBmb3JtYXRfdGFnOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBudW1fdGFibGVzOwotICAgIFRUX1RhYmxlICAgICAgICAgICAgICBkaXJfdGFibGVzOwotCi0gICAgVFRfSGVhZGVyICAgICAgICAgICAgIGhlYWRlcjsgICAgICAgLyogVHJ1ZVR5cGUgaGVhZGVyIHRhYmxlICAgICAgICAgICovCi0gICAgVFRfSG9yaUhlYWRlciAgICAgICAgIGhvcml6b250YWw7ICAgLyogVHJ1ZVR5cGUgaG9yaXpvbnRhbCBoZWFkZXIgICAgICovCi0KLSAgICBUVF9NYXhQcm9maWxlICAgICAgICAgbWF4X3Byb2ZpbGU7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgdmVydGljYWxfaW5mbzsKLSAgICBUVF9WZXJ0SGVhZGVyICAgICAgICAgdmVydGljYWw7ICAgICAvKiBUVCBWZXJ0aWNhbCBoZWFkZXIsIGlmIHByZXNlbnQgKi8KLQotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBudW1fbmFtZXM7ICAgIC8qIG51bWJlciBvZiBuYW1lIHJlY29yZHMgICovCi0gICAgVFRfTmFtZVRhYmxlUmVjICAgICAgIG5hbWVfdGFibGU7ICAgLyogbmFtZSB0YWJsZSAgICAgICAgICAgICAgKi8KLQotICAgIFRUX09TMiAgICAgICAgICAgICAgICBvczI7ICAgICAgICAgIC8qIFRydWVUeXBlIE9TLzIgdGFibGUgICAgICAgICAgICAqLwotICAgIFRUX1Bvc3RzY3JpcHQgICAgICAgICBwb3N0c2NyaXB0OyAgIC8qIFRydWVUeXBlIFBvc3RzY3JpcHQgdGFibGUgICAgICAqLwotCi0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGNtYXBfdGFibGU7ICAgLyogZXh0cmFjdGVkIGBjbWFwJyB0YWJsZSAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBjbWFwX3NpemU7Ci0KLSAgICBUVF9Mb2FkZXJfR290b1RhYmxlRnVuYyAgIGdvdG9fdGFibGU7Ci0KLSAgICBUVF9Mb2FkZXJfU3RhcnRHbHlwaEZ1bmMgIGFjY2Vzc19nbHlwaF9mcmFtZTsKLSAgICBUVF9Mb2FkZXJfRW5kR2x5cGhGdW5jICAgIGZvcmdldF9nbHlwaF9mcmFtZTsKLSAgICBUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYyAgIHJlYWRfZ2x5cGhfaGVhZGVyOwotICAgIFRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jICAgcmVhZF9zaW1wbGVfZ2x5cGg7Ci0gICAgVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMgICByZWFkX2NvbXBvc2l0ZV9nbHlwaDsKLQotICAgIC8qIGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgU0ZOVF9JbnRlcmZhY2UgdGFibGUgdXNlZCB0byBsb2FkICovCi0gICAgLyogdGhlIGJhc2ljIFRydWVUeXBlIHRhYmxlcyBpbiB0aGUgZmFjZSBvYmplY3QgICAgICAgICAgICAgICAgKi8KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgc2ZudDsKLQotICAgIC8qIGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgRlRfU2VydmljZV9Qc0NNYXBzUmVjIHRhYmxlIHVzZWQgdG8gKi8KLSAgICAvKiBoYW5kbGUgZ2x5cGggbmFtZXMgPC0+IHVuaWNvZGUgJiBNYWMgdmFsdWVzICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCogICAgICAgICAgICAgICAgIHBzbmFtZXM7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgLyogYSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyB0YWJsZSB1c2VkIHRvICovCi0gICAgLyogaGFuZGxlIHZhcmlhdGlvbiBmb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCogICAgICAgICAgICAgICAgIG1tOwotCi0gICAgLyogYSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zUmVjIHRhYmxlICovCi0gICAgLyogdXNlZCB0byBoYW5kbGUgdGhlIEhWQVIsIFZWQVIsIGFuZCBNVkFSIE9wZW5UeXBlIHRhYmxlcyAgICAgICAgICovCi0gICAgdm9pZCogICAgICAgICAgICAgICAgIHZhcjsKLSNlbmRpZgotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE9wdGlvbmFsIFRydWVUeXBlL09wZW5UeXBlIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogZ3JpZC1maXR0aW5nIGFuZCBzY2FsaW5nIHRhYmxlICovCi0gICAgVFRfR2FzcFJlYyAgICAgICAgICAgIGdhc3A7ICAgICAgICAgICAgICAgICAvKiB0aGUgYGdhc3AnIHRhYmxlICovCi0KLSAgICAvKiBQQ0wgNSB0YWJsZSAqLwotICAgIFRUX1BDTFQgICAgICAgICAgICAgICBwY2x0OwotCi0gICAgLyogZW1iZWRkZWQgYml0bWFwcyBzdXBwb3J0ICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIG51bV9zYml0X3NjYWxlczsKLSAgICBUVF9TQml0X1NjYWxlICAgICAgICAgc2JpdF9zY2FsZXM7Ci0KLSAgICAvKiBwb3N0c2NyaXB0IG5hbWVzIHRhYmxlICovCi0gICAgVFRfUG9zdF9OYW1lc1JlYyAgICAgIHBvc3RzY3JpcHRfbmFtZXM7Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVHJ1ZVR5cGUtc3BlY2lmaWMgZmllbGRzIChpZ25vcmVkIGJ5IHRoZSBDRkYgZHJpdmVyKSAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiB0aGUgZm9udCBwcm9ncmFtLCBpZiBhbnkgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgZm9udF9wcm9ncmFtX3NpemU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGZvbnRfcHJvZ3JhbTsKLQotICAgIC8qIHRoZSBjdnQgcHJvZ3JhbSwgaWYgYW55ICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGN2dF9wcm9ncmFtX3NpemU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGN2dF9wcm9ncmFtOwotCi0gICAgLyogdGhlIG9yaWdpbmFsLCB1bnNjYWxlZCwgY29udHJvbCB2YWx1ZSB0YWJsZSAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBjdnRfc2l6ZTsKLSAgICBGVF9TaG9ydCogICAgICAgICAgICAgY3Z0OwotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciB0byB1c2UuICBUaGlzIGlzIGFsc28gKi8KLSAgICAvKiB1c2VkIHRvIGhvb2sgdGhlIGRlYnVnZ2VyIGZvciB0aGUgYHR0ZGVidWcnIHV0aWxpdHkuICAgICAgICAqLwotICAgIFRUX0ludGVycHJldGVyICAgICAgICBpbnRlcnByZXRlcjsKLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBPdGhlciB0YWJsZXMgb3IgZmllbGRzLiBUaGlzIGlzIHVzZWQgYnkgZGVyaXZhdGl2ZSBmb3JtYXRzIGxpa2UgICAgICovCi0gICAgLyogT3BlblR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBGVF9HZW5lcmljICAgICAgICAgICAgZXh0cmE7Ci0KLSAgICBjb25zdCBjaGFyKiAgICAgICAgICAgcG9zdHNjcmlwdF9uYW1lOwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGdseWZfbGVuOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBnbHlmX29mZnNldDsgICAgLyogc2luY2UgMi43LjEgKi8KLQotICAgIEZUX0Jvb2wgICAgICAgICAgICAgICBpc19jZmYyOyAgICAgICAgLyogc2luY2UgMi43LjEgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgZG9ibGVuZDsKLSAgICBHWF9CbGVuZCAgICAgICAgICAgICAgYmxlbmQ7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgaXNfZGVmYXVsdF9pbnN0YW5jZTsgICAvKiBzaW5jZSAyLjcuMSAqLwotICAgIEZUX1VJbnQzMiAgICAgICAgICAgICB2YXJpYXRpb25fc3VwcG9ydDsgICAgIC8qIHNpbmNlIDIuNy4xICovCi0KLSAgICBjb25zdCBjaGFyKiAgICAgICAgICAgdmFyX3Bvc3RzY3JpcHRfcHJlZml4OyAgICAgLyogc2luY2UgMi43LjIgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgdmFyX3Bvc3RzY3JpcHRfcHJlZml4X2xlbjsgLyogc2luY2UgMi43LjIgKi8KLQotI2VuZGlmCi0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMiAqLwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGhvcnpfbWV0cmljc19zaXplOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICB2ZXJ0X21ldHJpY3Nfc2l6ZTsKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgICBudW1fbG9jYXRpb25zOyAvKiBpbiBicm9rZW4gVFRGLCBnaWQgPiAweEZGRkYgKi8KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgZ2x5cGhfbG9jYXRpb25zOwotCi0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGhkbXhfdGFibGU7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGhkbXhfdGFibGVfc2l6ZTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgaGRteF9yZWNvcmRfY291bnQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGhkbXhfcmVjb3JkX3NpemU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGhkbXhfcmVjb3JkX3NpemVzOwotCi0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIHNiaXRfdGFibGU7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIHNiaXRfdGFibGVfc2l6ZTsKLSAgICBUVF9TYml0VGFibGVUeXBlICAgICAgc2JpdF90YWJsZV90eXBlOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICBzYml0X251bV9zdHJpa2VzOwotICAgIEZUX1VJbnQqICAgICAgICAgICAgICBzYml0X3N0cmlrZV9tYXA7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAga2Vybl90YWJsZTsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAga2Vybl90YWJsZV9zaXplOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICBudW1fa2Vybl90YWJsZXM7Ci0gICAgRlRfVUludDMyICAgICAgICAgICAgIGtlcm5fYXZhaWxfYml0czsKLSAgICBGVF9VSW50MzIgICAgICAgICAgICAga2Vybl9vcmRlcl9iaXRzOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSAgICBUVF9CREZSZWMgICAgICAgICAgICAgYmRmOwotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fQkRGICovCi0KLSAgICAvKiBzaW5jZSAyLjMuMCAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBob3J6X21ldHJpY3Nfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgICAgICAgICAgICB2ZXJ0X21ldHJpY3Nfb2Zmc2V0OwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAvKiBzaW5jZSAyLjQuMTIgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgc3BoX2ZvdW5kX2Z1bmNfZmxhZ3M7IC8qIHNwZWNpYWwgZnVuY3Rpb25zIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgdGhpcyBmYWNlICAgICAgICAgICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICAgICBzcGhfY29tcGF0aWJpbGl0eV9tb2RlOwotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLSAgICAvKiBzaW5jZSAyLjcgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgZWJkdF9zdGFydDsgIC8qIGVpdGhlciBgQ0JEVCcsIGBFQkRUJywgb3IgYGJkYXQnICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGViZHRfc2l6ZTsKLSNlbmRpZgotCi0gIH0gVFRfRmFjZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUVF9HbHlwaFpvbmVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBBIGdseXBoIHpvbmUgaXMgdXNlZCB0byBsb2FkLCBzY2FsZSBhbmQgaGludCBnbHlwaCBvdXRsaW5lICAgICAgICAqLwotICAvKiAgICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbWVtb3J5ICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBtYXhfcG9pbnRzICAgOjogVGhlIG1heGltdW0gc2l6ZSBpbiBwb2ludHMgb2YgdGhlIHpvbmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG1heF9jb250b3VycyA6OiBNYXggc2l6ZSBpbiBsaW5rcyBjb250b3VycyBvZiB0aGUgem9uZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbl9wb2ludHMgICAgIDo6IFRoZSBjdXJyZW50IG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHpvbmUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBuX2NvbnRvdXJzICAgOjogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNvbnRvdXJzIGluIHRoZSB6b25lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG9yZyAgICAgICAgICA6OiBUaGUgb3JpZ2luYWwgZ2x5cGggY29vcmRpbmF0ZXMgKGZvbnQgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdW5pdHMvc2NhbGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGN1ciAgICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBjb29yZGluYXRlcyAoc2NhbGVkL2hpbnRlZCkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgdGFncyAgICAgICAgIDo6IFRoZSBwb2ludCBjb250cm9sIHRhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjb250b3VycyAgICAgOjogVGhlIGNvbnRvdXJzIGVuZCBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGZpcnN0X3BvaW50ICA6OiBPZmZzZXQgb2YgdGhlIGN1cnJlbnQgc3ViZ2x5cGgncyBmaXJzdCBwb2ludC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfR2x5cGhab25lUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5OwotICAgIEZUX1VTaG9ydCAgIG1heF9wb2ludHM7Ci0gICAgRlRfU2hvcnQgICAgbWF4X2NvbnRvdXJzOwotICAgIEZUX1VTaG9ydCAgIG5fcG9pbnRzOyAgICAvKiBudW1iZXIgb2YgcG9pbnRzIGluIHpvbmUgICAgKi8KLSAgICBGVF9TaG9ydCAgICBuX2NvbnRvdXJzOyAgLyogbnVtYmVyIG9mIGNvbnRvdXJzICAgICAgICAgICovCi0KLSAgICBGVF9WZWN0b3IqICBvcmc7ICAgICAgICAgLyogb3JpZ2luYWwgcG9pbnQgY29vcmRpbmF0ZXMgICovCi0gICAgRlRfVmVjdG9yKiAgY3VyOyAgICAgICAgIC8qIGN1cnJlbnQgcG9pbnQgY29vcmRpbmF0ZXMgICAqLwotICAgIEZUX1ZlY3RvciogIG9ydXM7ICAgICAgICAvKiBvcmlnaW5hbCAodW5zY2FsZWQpIHBvaW50IGNvb3JkaW5hdGVzICovCi0KLSAgICBGVF9CeXRlKiAgICB0YWdzOyAgICAgICAgLyogY3VycmVudCB0b3VjaCBmbGFncyAgICAgICAgICovCi0gICAgRlRfVVNob3J0KiAgY29udG91cnM7ICAgIC8qIGNvbnRvdXIgZW5kIHBvaW50cyAgICAgICAgICAqLwotCi0gICAgRlRfVVNob3J0ICAgZmlyc3RfcG9pbnQ7IC8qIG9mZnNldCBvZiBmaXJzdCAoIzApIHBvaW50ICAqLwotCi0gIH0gVFRfR2x5cGhab25lUmVjLCAqVFRfR2x5cGhab25lOwotCi0KLSAgLyogaGFuZGxlIHRvIGV4ZWN1dGlvbiBjb250ZXh0ICovCi0gIHR5cGVkZWYgc3RydWN0IFRUX0V4ZWNDb250ZXh0UmVjXyogIFRUX0V4ZWNDb250ZXh0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBUVF9TaXplUmVjXyogIFRUX1NpemU7Ci0KLQotICAvKiBnbHlwaCBsb2FkZXIgc3RydWN0dXJlICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Mb2FkZXJSZWNfCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgIGZhY2U7Ci0gICAgVFRfU2l6ZSAgICAgICAgICBzaXplOwotICAgIEZUX0dseXBoU2xvdCAgICAgZ2x5cGg7Ci0gICAgRlRfR2x5cGhMb2FkZXIgICBnbG9hZGVyOwotCi0gICAgRlRfVUxvbmcgICAgICAgICBsb2FkX2ZsYWdzOwotICAgIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXg7Ci0KLSAgICBGVF9TdHJlYW0gICAgICAgIHN0cmVhbTsKLSAgICBGVF9JbnQgICAgICAgICAgIGJ5dGVfbGVuOwotCi0gICAgRlRfU2hvcnQgICAgICAgICBuX2NvbnRvdXJzOwotICAgIEZUX0JCb3ggICAgICAgICAgYmJveDsKLSAgICBGVF9JbnQgICAgICAgICAgIGxlZnRfYmVhcmluZzsKLSAgICBGVF9JbnQgICAgICAgICAgIGFkdmFuY2U7Ci0gICAgRlRfSW50ICAgICAgICAgICBsaW5lYXI7Ci0gICAgRlRfQm9vbCAgICAgICAgICBsaW5lYXJfZGVmOwotICAgIEZUX1ZlY3RvciAgICAgICAgcHAxOwotICAgIEZUX1ZlY3RvciAgICAgICAgcHAyOwotCi0gICAgLyogdGhlIHpvbmUgd2hlcmUgd2UgbG9hZCBvdXIgZ2x5cGhzICovCi0gICAgVFRfR2x5cGhab25lUmVjICBiYXNlOwotICAgIFRUX0dseXBoWm9uZVJlYyAgem9uZTsKLQotICAgIFRUX0V4ZWNDb250ZXh0ICAgZXhlYzsKLSAgICBGVF9CeXRlKiAgICAgICAgIGluc3RydWN0aW9uczsKLSAgICBGVF9VTG9uZyAgICAgICAgIGluc19wb3M7Ci0KLSAgICAvKiBmb3IgcG9zc2libGUgZXh0ZW5zaWJpbGl0eSBpbiBvdGhlciBmb3JtYXRzICovCi0gICAgdm9pZCogICAgICAgICAgICBvdGhlcjsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xLjggKi8KLSAgICBGVF9JbnQgICAgICAgICAgIHRvcF9iZWFyaW5nOwotICAgIEZUX0ludCAgICAgICAgICAgdmFkdmFuY2U7Ci0gICAgRlRfVmVjdG9yICAgICAgICBwcDM7Ci0gICAgRlRfVmVjdG9yICAgICAgICBwcDQ7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMi4xICovCi0gICAgRlRfQnl0ZSogICAgICAgICBjdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgICBsaW1pdDsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi42LjIgKi8KLSAgICBGVF9MaXN0UmVjICAgICAgIGNvbXBvc2l0ZXM7Ci0KLSAgfSBUVF9Mb2FkZXJSZWM7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVFRUWVBFU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oIGIvaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjZiMzZlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MXRhYmxlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgVHlwZSAxL1R5cGUgMiB0YWJsZXMgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFQxVEFCTEVTX0hfCi0jZGVmaW5lIFQxVEFCTEVTX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHlwZTFfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHlwZSAxIFRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHlwZX4xIChQb3N0U2NyaXB0KSBzcGVjaWZpYyBmb250IHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIFR5cGUgMS1zcGVjaWZpYyB0YWJsZXMsICAgICovCi0gIC8qICAgIGluY2x1ZGluZyBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gb3RoZXIgUG9zdFNjcmlwdCBmb250IGZvcm1hdHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0ZvbnRJbmZvUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Gb250SW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUHJpdmF0ZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VEaWN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlRGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZUluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IYXNfUFNfR2x5cGhfTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1BTX0ZvbnRfSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9QU19Gb250X1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfUFNfRm9udF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JsZW5kX0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FbmNvZGluZ1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRGljdF9LZXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIE5vdGUgdGhhdCB3ZSBzZXBhcmF0ZSBmb250IGRhdGEgaW4gUFNfRm9udEluZm9SZWMgYW5kIFBTX1ByaXZhdGVSZWMgKi8KLSAgLyogc3RydWN0dXJlcyBpbiBvcmRlciB0byBzdXBwb3J0IE11bHRpcGxlIE1hc3RlciBmb250cy4gICAgICAgICAgICAgICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRm9udEluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFR5cGV+MSBvciBUeXBlfjIgRm9udEluZm8gZGljdGlvbmFyeS4gICovCi0gIC8qICAgIE5vdGUgdGhhdCBmb3IgTXVsdGlwbGUgTWFzdGVyIGZvbnRzLCBlYWNoIGluc3RhbmNlIGhhcyBpdHMgb3duICAgICAqLwotICAvKiAgICBGb250SW5mbyBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19Gb250SW5mb1JlY18KLSAgewotICAgIEZUX1N0cmluZyogIHZlcnNpb247Ci0gICAgRlRfU3RyaW5nKiAgbm90aWNlOwotICAgIEZUX1N0cmluZyogIGZ1bGxfbmFtZTsKLSAgICBGVF9TdHJpbmcqICBmYW1pbHlfbmFtZTsKLSAgICBGVF9TdHJpbmcqICB3ZWlnaHQ7Ci0gICAgRlRfTG9uZyAgICAgaXRhbGljX2FuZ2xlOwotICAgIEZUX0Jvb2wgICAgIGlzX2ZpeGVkX3BpdGNoOwotICAgIEZUX1Nob3J0ICAgIHVuZGVybGluZV9wb3NpdGlvbjsKLSAgICBGVF9VU2hvcnQgICB1bmRlcmxpbmVfdGhpY2tuZXNzOwotCi0gIH0gUFNfRm9udEluZm9SZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Gb250SW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFBTX0ZvbnRJbmZvUmVjXyogIFBTX0ZvbnRJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRm9udEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQFBTX0ZvbnRJbmZvUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICovCi0gIC8qICAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAqLwotICAvKiAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgUFNfRm9udEluZm9SZWMgIFQxX0ZvbnRJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUHJpdmF0ZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFR5cGV+MSBvciBUeXBlfjIgcHJpdmF0ZSBkaWN0aW9uYXJ5LiAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBmb3IgTXVsdGlwbGUgTWFzdGVyIGZvbnRzLCBlYWNoIGluc3RhbmNlIGhhcyBpdHMgb3duICAgICAqLwotICAvKiAgICBQcml2YXRlIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19Qcml2YXRlUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICB1bmlxdWVfaWQ7Ci0gICAgRlRfSW50ICAgICBsZW5JVjsKLQotICAgIEZUX0J5dGUgICAgbnVtX2JsdWVfdmFsdWVzOwotICAgIEZUX0J5dGUgICAgbnVtX290aGVyX2JsdWVzOwotICAgIEZUX0J5dGUgICAgbnVtX2ZhbWlseV9ibHVlczsKLSAgICBGVF9CeXRlICAgIG51bV9mYW1pbHlfb3RoZXJfYmx1ZXM7Ci0KLSAgICBGVF9TaG9ydCAgIGJsdWVfdmFsdWVzWzE0XTsKLSAgICBGVF9TaG9ydCAgIG90aGVyX2JsdWVzWzEwXTsKLQotICAgIEZUX1Nob3J0ICAgZmFtaWx5X2JsdWVzICAgICAgWzE0XTsKLSAgICBGVF9TaG9ydCAgIGZhbWlseV9vdGhlcl9ibHVlc1sxMF07Ci0KLSAgICBGVF9GaXhlZCAgIGJsdWVfc2NhbGU7Ci0gICAgRlRfSW50ICAgICBibHVlX3NoaWZ0OwotICAgIEZUX0ludCAgICAgYmx1ZV9mdXp6OwotCi0gICAgRlRfVVNob3J0ICBzdGFuZGFyZF93aWR0aFsxXTsKLSAgICBGVF9VU2hvcnQgIHN0YW5kYXJkX2hlaWdodFsxXTsKLQotICAgIEZUX0J5dGUgICAgbnVtX3NuYXBfd2lkdGhzOwotICAgIEZUX0J5dGUgICAgbnVtX3NuYXBfaGVpZ2h0czsKLSAgICBGVF9Cb29sICAgIGZvcmNlX2JvbGQ7Ci0gICAgRlRfQm9vbCAgICByb3VuZF9zdGVtX3VwOwotCi0gICAgRlRfU2hvcnQgICBzbmFwX3dpZHRocyBbMTNdOyAgLyogaW5jbHVkaW5nIHN0ZCB3aWR0aCAgKi8KLSAgICBGVF9TaG9ydCAgIHNuYXBfaGVpZ2h0c1sxM107ICAvKiBpbmNsdWRpbmcgc3RkIGhlaWdodCAqLwotCi0gICAgRlRfRml4ZWQgICBleHBhbnNpb25fZmFjdG9yOwotCi0gICAgRlRfTG9uZyAgICBsYW5ndWFnZV9ncm91cDsKLSAgICBGVF9Mb25nICAgIHBhc3N3b3JkOwotCi0gICAgRlRfU2hvcnQgICBtaW5fZmVhdHVyZVsyXTsKLQotICB9IFBTX1ByaXZhdGVSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEBQU19Qcml2YXRlUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFBTX1ByaXZhdGVSZWNfKiAgUFNfUHJpdmF0ZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQFBTX1ByaXZhdGVSZWMuICBJdCBpcyBkZXByZWNhdGVkIGJ1dCAgICAqLwotICAvKiAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAgKi8KLSAgLyogICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIFBTX1ByaXZhdGVSZWMgIFQxX1ByaXZhdGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CbGVuZF9GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNldCBvZiBmbGFncyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gYmxlbmQgZGljdGlvbmFyeSAoZm9udCBpbmZvIG9yIHByaXZhdGUpLiAgVXNlZCB0byBzdXBwb3J0ICAgICovCi0gIC8qICAgIE11bHRpcGxlIE1hc3RlcnMgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX1VOREVSTElORV9QT1NJVElPTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9VTkRFUkxJTkVfVEhJQ0tORVNTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfSVRBTElDX0FOR0xFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0JMVUVfVkFMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9PVEhFUl9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfU1RBTkRBUkRfV0lEVEggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX1NUQU5EQVJEX0hFSUdIVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9TVEVNX1NOQVBfV0lEVEhTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfU1RFTV9TTkFQX0hFSUdIVFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0JMVUVfU0NBTEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9CTFVFX1NISUZUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfRkFNSUxZX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0ZBTUlMWV9PVEhFUl9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9GT1JDRV9CT0xEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgVDFfQmxlbmRfRmxhZ3NfCi0gIHsKLSAgICAvKiByZXF1aXJlZCBmaWVsZHMgaW4gYSBGb250SW5mbyBibGVuZCBkaWN0aW9uYXJ5ICovCi0gICAgVDFfQkxFTkRfVU5ERVJMSU5FX1BPU0lUSU9OID0gMCwKLSAgICBUMV9CTEVORF9VTkRFUkxJTkVfVEhJQ0tORVNTLAotICAgIFQxX0JMRU5EX0lUQUxJQ19BTkdMRSwKLQotICAgIC8qIHJlcXVpcmVkIGZpZWxkcyBpbiBhIFByaXZhdGUgYmxlbmQgZGljdGlvbmFyeSAqLwotICAgIFQxX0JMRU5EX0JMVUVfVkFMVUVTLAotICAgIFQxX0JMRU5EX09USEVSX0JMVUVTLAotICAgIFQxX0JMRU5EX1NUQU5EQVJEX1dJRFRILAotICAgIFQxX0JMRU5EX1NUQU5EQVJEX0hFSUdIVCwKLSAgICBUMV9CTEVORF9TVEVNX1NOQVBfV0lEVEhTLAotICAgIFQxX0JMRU5EX1NURU1fU05BUF9IRUlHSFRTLAotICAgIFQxX0JMRU5EX0JMVUVfU0NBTEUsCi0gICAgVDFfQkxFTkRfQkxVRV9TSElGVCwKLSAgICBUMV9CTEVORF9GQU1JTFlfQkxVRVMsCi0gICAgVDFfQkxFTkRfRkFNSUxZX09USEVSX0JMVUVTLAotICAgIFQxX0JMRU5EX0ZPUkNFX0JPTEQsCi0KLSAgICBUMV9CTEVORF9NQVggICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gVDFfQmxlbmRfRmxhZ3M7Ci0KLQotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyAqLwotICAvKiBgVDFfQmxlbmRfRmxhZ3MnIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSB0MV9ibGVuZF91bmRlcmxpbmVfcG9zaXRpb24gICBUMV9CTEVORF9VTkRFUkxJTkVfUE9TSVRJT04KLSNkZWZpbmUgdDFfYmxlbmRfdW5kZXJsaW5lX3RoaWNrbmVzcyAgVDFfQkxFTkRfVU5ERVJMSU5FX1RISUNLTkVTUwotI2RlZmluZSB0MV9ibGVuZF9pdGFsaWNfYW5nbGUgICAgICAgICBUMV9CTEVORF9JVEFMSUNfQU5HTEUKLSNkZWZpbmUgdDFfYmxlbmRfYmx1ZV92YWx1ZXMgICAgICAgICAgVDFfQkxFTkRfQkxVRV9WQUxVRVMKLSNkZWZpbmUgdDFfYmxlbmRfb3RoZXJfYmx1ZXMgICAgICAgICAgVDFfQkxFTkRfT1RIRVJfQkxVRVMKLSNkZWZpbmUgdDFfYmxlbmRfc3RhbmRhcmRfd2lkdGhzICAgICAgVDFfQkxFTkRfU1RBTkRBUkRfV0lEVEgKLSNkZWZpbmUgdDFfYmxlbmRfc3RhbmRhcmRfaGVpZ2h0ICAgICAgVDFfQkxFTkRfU1RBTkRBUkRfSEVJR0hUCi0jZGVmaW5lIHQxX2JsZW5kX3N0ZW1fc25hcF93aWR0aHMgICAgIFQxX0JMRU5EX1NURU1fU05BUF9XSURUSFMKLSNkZWZpbmUgdDFfYmxlbmRfc3RlbV9zbmFwX2hlaWdodHMgICAgVDFfQkxFTkRfU1RFTV9TTkFQX0hFSUdIVFMKLSNkZWZpbmUgdDFfYmxlbmRfYmx1ZV9zY2FsZSAgICAgICAgICAgVDFfQkxFTkRfQkxVRV9TQ0FMRQotI2RlZmluZSB0MV9ibGVuZF9ibHVlX3NoaWZ0ICAgICAgICAgICBUMV9CTEVORF9CTFVFX1NISUZUCi0jZGVmaW5lIHQxX2JsZW5kX2ZhbWlseV9ibHVlcyAgICAgICAgIFQxX0JMRU5EX0ZBTUlMWV9CTFVFUwotI2RlZmluZSB0MV9ibGVuZF9mYW1pbHlfb3RoZXJfYmx1ZXMgICBUMV9CTEVORF9GQU1JTFlfT1RIRVJfQkxVRVMKLSNkZWZpbmUgdDFfYmxlbmRfZm9yY2VfYm9sZCAgICAgICAgICAgVDFfQkxFTkRfRk9SQ0VfQk9MRAotI2RlZmluZSB0MV9ibGVuZF9tYXggICAgICAgICAgICAgICAgICBUMV9CTEVORF9NQVgKLQotICAvKiAqLwotCi0KLSAgLyogbWF4aW11bSBudW1iZXIgb2YgTXVsdGlwbGUgTWFzdGVycyBkZXNpZ25zLCBhcyBkZWZpbmVkIGluIHRoZSBzcGVjICovCi0jZGVmaW5lIFQxX01BWF9NTV9ERVNJR05TICAgICAxNgotCi0gIC8qIG1heGltdW0gbnVtYmVyIG9mIE11bHRpcGxlIE1hc3RlcnMgYXhlcywgYXMgZGVmaW5lZCBpbiB0aGUgc3BlYyAqLwotI2RlZmluZSBUMV9NQVhfTU1fQVhJUyAgICAgICAgNAotCi0gIC8qIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgZGVzaWduIG1hcCAqLwotI2RlZmluZSBUMV9NQVhfTU1fTUFQX1BPSU5UUyAgMjAKLQotCi0gIC8qIHRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIEJsZW5kRGVzaWduTWFwIGVudHJ5IGZvciBhbiBheGlzICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19EZXNpZ25NYXBfCi0gIHsKLSAgICBGVF9CeXRlICAgIG51bV9wb2ludHM7Ci0gICAgRlRfTG9uZyogICBkZXNpZ25fcG9pbnRzOwotICAgIEZUX0ZpeGVkKiAgYmxlbmRfcG9pbnRzOwotCi0gIH0gUFNfRGVzaWduTWFwUmVjLCAqUFNfRGVzaWduTWFwOwotCi0gIC8qIGJhY2t3YXJkIGNvbXBhdGlibGUgZGVmaW5pdGlvbiAqLwotICB0eXBlZGVmIFBTX0Rlc2lnbk1hcFJlYyAgVDFfRGVzaWduTWFwOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0JsZW5kUmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgICBudW1fZGVzaWduczsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9heGlzOwotCi0gICAgRlRfU3RyaW5nKiAgICAgICBheGlzX25hbWVzW1QxX01BWF9NTV9BWElTXTsKLSAgICBGVF9GaXhlZCogICAgICAgIGRlc2lnbl9wb3NbVDFfTUFYX01NX0RFU0lHTlNdOwotICAgIFBTX0Rlc2lnbk1hcFJlYyAgZGVzaWduX21hcFtUMV9NQVhfTU1fQVhJU107Ci0KLSAgICBGVF9GaXhlZCogICAgICAgIHdlaWdodF92ZWN0b3I7Ci0gICAgRlRfRml4ZWQqICAgICAgICBkZWZhdWx0X3dlaWdodF92ZWN0b3I7Ci0KLSAgICBQU19Gb250SW5mbyAgICAgIGZvbnRfaW5mb3NbVDFfTUFYX01NX0RFU0lHTlMgKyAxXTsKLSAgICBQU19Qcml2YXRlICAgICAgIHByaXZhdGVzICBbVDFfTUFYX01NX0RFU0lHTlMgKyAxXTsKLQotICAgIEZUX1VMb25nICAgICAgICAgYmxlbmRfYml0ZmxhZ3M7Ci0KLSAgICBGVF9CQm94KiAgICAgICAgIGJib3hlcyAgICBbVDFfTUFYX01NX0RFU0lHTlMgKyAxXTsKLQotICAgIC8qIHNpbmNlIDIuMy4wICovCi0KLSAgICAvKiB1bmRvY3VtZW50ZWQsIG9wdGlvbmFsOiB0aGUgZGVmYXVsdCBkZXNpZ24gaW5zdGFuY2U7ICAgKi8KLSAgICAvKiBjb3JyZXNwb25kcyB0byBkZWZhdWx0X3dlaWdodF92ZWN0b3IgLS0gICAgICAgICAgICAgICAgKi8KLSAgICAvKiBudW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yID09IDAgbWVhbnMgaXQgaXMgbm90IHByZXNlbnQgKi8KLSAgICAvKiBpbiB0aGUgZm9udCBhbmQgYXNzb2NpYXRlZCBtZXRyaWNzIGZpbGVzICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgICAgICAgIGRlZmF1bHRfZGVzaWduX3ZlY3RvcltUMV9NQVhfTU1fREVTSUdOU107Ci0gICAgRlRfVUludCAgICAgICAgICBudW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yOwotCi0gIH0gUFNfQmxlbmRSZWMsICpQU19CbGVuZDsKLQotCi0gIC8qIGJhY2t3YXJkIGNvbXBhdGlibGUgZGVmaW5pdGlvbiAqLwotICB0eXBlZGVmIFBTX0JsZW5kUmVjICBUMV9CbGVuZDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlRGljdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGRhdGEgaW4gYSBDSUQgdG9wLWxldmVsIGRpY3Rpb25hcnkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9GYWNlRGljdFJlY18KLSAgewotICAgIFBTX1ByaXZhdGVSZWMgIHByaXZhdGVfZGljdDsKLQotICAgIEZUX1VJbnQgICAgICAgIGxlbl9idWlsZGNoYXI7Ci0gICAgRlRfRml4ZWQgICAgICAgZm9yY2Vib2xkX3RocmVzaG9sZDsKLSAgICBGVF9Qb3MgICAgICAgICBzdHJva2Vfd2lkdGg7Ci0gICAgRlRfRml4ZWQgICAgICAgZXhwYW5zaW9uX2ZhY3RvcjsKLQotICAgIEZUX0J5dGUgICAgICAgIHBhaW50X3R5cGU7Ci0gICAgRlRfQnl0ZSAgICAgICAgZm9udF90eXBlOwotICAgIEZUX01hdHJpeCAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgIGZvbnRfb2Zmc2V0OwotCi0gICAgRlRfVUludCAgICAgICAgbnVtX3N1YnJzOwotICAgIEZUX1VMb25nICAgICAgIHN1YnJtYXBfb2Zmc2V0OwotICAgIEZUX0ludCAgICAgICAgIHNkX2J5dGVzOwotCi0gIH0gQ0lEX0ZhY2VEaWN0UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VEaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VEaWN0UmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZURpY3RSZWNfKiAgQ0lEX0ZhY2VEaWN0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZvbnREaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQENJRF9GYWNlRGljdFJlYy4gIEl0IGlzIGRlcHJlY2F0ZWQgYnV0ICovCi0gIC8qICAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAqLwotICAvKiAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgQ0lEX0ZhY2VEaWN0UmVjICBDSURfRm9udERpY3Q7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZUluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBDSUQgRmFjZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZUluZm9SZWNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICAgICAgY2lkX2ZvbnRfbmFtZTsKLSAgICBGVF9GaXhlZCAgICAgICAgY2lkX3ZlcnNpb247Ci0gICAgRlRfSW50ICAgICAgICAgIGNpZF9mb250X3R5cGU7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgcmVnaXN0cnk7Ci0gICAgRlRfU3RyaW5nKiAgICAgIG9yZGVyaW5nOwotICAgIEZUX0ludCAgICAgICAgICBzdXBwbGVtZW50OwotCi0gICAgUFNfRm9udEluZm9SZWMgIGZvbnRfaW5mbzsKLSAgICBGVF9CQm94ICAgICAgICAgZm9udF9iYm94OwotICAgIEZUX1VMb25nICAgICAgICB1aWRfYmFzZTsKLQotICAgIEZUX0ludCAgICAgICAgICBudW1feHVpZDsKLSAgICBGVF9VTG9uZyAgICAgICAgeHVpZFsxNl07Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgY2lkbWFwX29mZnNldDsKLSAgICBGVF9JbnQgICAgICAgICAgZmRfYnl0ZXM7Ci0gICAgRlRfSW50ICAgICAgICAgIGdkX2J5dGVzOwotICAgIEZUX1VMb25nICAgICAgICBjaWRfY291bnQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgbnVtX2RpY3RzOwotICAgIENJRF9GYWNlRGljdCAgICBmb250X2RpY3RzOwotCi0gICAgRlRfVUxvbmcgICAgICAgIGRhdGFfb2Zmc2V0OwotCi0gIH0gQ0lEX0ZhY2VJbmZvUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VJbmZvUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZUluZm9SZWNfKiAgQ0lEX0ZhY2VJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAQ0lEX0ZhY2VJbmZvUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICovCi0gIC8qICAga2VwdCB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgICAqLwotICAvKiAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgQ0lEX0ZhY2VJbmZvUmVjICBDSURfSW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9IYXNfUFNfR2x5cGhfTmFtZXMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXR1cm4gdHJ1ZSBpZiBhIGdpdmVuIGZhY2UgcHJvdmlkZXMgcmVsaWFibGUgUG9zdFNjcmlwdCBnbHlwaAotICAgKiAgICBuYW1lcy4gIFRoaXMgaXMgc2ltaWxhciB0byB1c2luZyB0aGUgQEZUX0hBU19HTFlQSF9OQU1FUyBtYWNybywKLSAgICogICAgZXhjZXB0IHRoYXQgY2VydGFpbiBmb250cyAobW9zdGx5IFRydWVUeXBlKSBjb250YWluIGluY29ycmVjdAotICAgKiAgICBnbHlwaCBuYW1lIHRhYmxlcy4KLSAgICoKLSAgICogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGNhbGxlciBpcyBzdXJlIHRoYXQgdGhlIGdseXBoCi0gICAqICAgIG5hbWVzIHJldHVybmVkIGJ5IEBGVF9HZXRfR2x5cGhfTmFtZSBhcmUgcmVsaWFibGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBmYWNlIGhhbmRsZQotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBCb29sZWFuLiAgVHJ1ZSBpZiBnbHlwaCBuYW1lcyBhcmUgcmVsaWFibGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0ludCApCi0gIEZUX0hhc19QU19HbHlwaF9OYW1lcyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9QU19Gb250X0luZm8KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAgICogICAgUG9zdFNjcmlwdCBmb250LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgOjoKLSAgICogICAgICAgUG9zdFNjcmlwdCBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgYWZvbnRfaW5mbyA6OgotICAgKiAgICAgICBPdXRwdXQgZm9udCBpbmZvIHN0cnVjdHVyZSBwb2ludGVyLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgU3RyaW5nIHBvaW50ZXJzIHdpdGhpbiB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSBhcmUgb3duZWQgYnkKLSAgICogICAgdGhlIGZhY2UgYW5kIGRvbid0IG5lZWQgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gIE1pc3NpbmcgZW50cmllcwotICAgKiAgICBpbiB0aGUgZm9udCdzIEZvbnRJbmZvIGRpY3Rpb25hcnkgYXJlIHJlcHJlc2VudGVkIGJ5IE5VTEwgcG9pbnRlcnMuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKLSAgICogICAgcmV0dXJuIHRoZSBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yIGNvZGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1BTX0ZvbnRfSW5mbyggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvICBhZm9udF9pbmZvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1BTX0ZvbnRfUHJpdmF0ZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIFJldHJpZXZlIHRoZSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCi0gICAqICAgIFBvc3RTY3JpcHQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIGFmb250X3ByaXZhdGUgOjoKLSAgICogICAgICAgT3V0cHV0IHByaXZhdGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgcG9pbnRlci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIFRoZSBzdHJpbmcgcG9pbnRlcnMgd2l0aGluIHRoZSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUgYXJlIG93bmVkIGJ5Ci0gICAqICAgIHRoZSBmYWNlIGFuZCBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICogICAgdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgZXJyb3IgY29kZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUFNfRm9udF9Qcml2YXRlKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlICBhZm9udF9wcml2YXRlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FbmNvZGluZ1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBgRW5jb2RpbmcnIGVudHJ5IGluIGEgVHlwZSAxICAgICAgICAgKi8KLSAgLyogICAgZGljdGlvbmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRU5DT0RJTkdfVFlQRV9OT05FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfQVJSQVkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FTkNPRElOR19UWVBFX1NUQU5EQVJEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRU5DT0RJTkdfVFlQRV9JU09MQVRJTjEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfRVhQRVJUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBUMV9FbmNvZGluZ1R5cGVfCi0gIHsKLSAgICBUMV9FTkNPRElOR19UWVBFX05PTkUgPSAwLAotICAgIFQxX0VOQ09ESU5HX1RZUEVfQVJSQVksCi0gICAgVDFfRU5DT0RJTkdfVFlQRV9TVEFOREFSRCwKLSAgICBUMV9FTkNPRElOR19UWVBFX0lTT0xBVElOMSwKLSAgICBUMV9FTkNPRElOR19UWVBFX0VYUEVSVAotCi0gIH0gVDFfRW5jb2RpbmdUeXBlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRGljdF9LZXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdXNlZCBpbiBjYWxscyB0byBARlRfR2V0X1BTX0ZvbnRfVmFsdWUgdG8gaWRlbnRpZnkgICovCi0gIC8qICAgIHRoZSBUeXBlfjEgZGljdGlvbmFyeSBlbnRyeSB0byByZXRyaWV2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRk9OVF9UWVBFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZPTlRfTUFUUklYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GT05UX0JCT1ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfUEFJTlRfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZPTlRfTkFNRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9VTklRVUVfSUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX0NIQVJfU1RSSU5HUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0NIQVJfU1RSSU5HX0tFWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9DSEFSX1NUUklORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRU5DT0RJTkdfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0VOQ09ESU5HX0VOVFJZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fU1VCUlMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfU1VCUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1NURF9IVyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9TVERfVlcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX0JMVUVfVkFMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0JMVUVfVkFMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9CTFVFX0ZVWlogOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX09USEVSX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX09USEVSX0JMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fRkFNSUxZX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRkFNSUxZX0JMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9GQU1JTFlfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GQU1JTFlfT1RIRVJfQkxVRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfQkxVRV9TQ0FMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0JMVUVfU0hJRlQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX0ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfU1RFTV9TTkFQX0ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9TVEVNX1NOQVBfViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9TVEVNX1NOQVBfViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRk9SQ0VfQk9MRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1JORF9TVEVNX1VQIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9NSU5fRkVBVFVSRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTEVOX0lWIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1BBU1NXT1JEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9MQU5HVUFHRV9HUk9VUCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfVkVSU0lPTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05PVElDRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GVUxMX05BTUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRkFNSUxZX05BTUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1dFSUdIVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9JU19GSVhFRF9QSVRDSCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfVU5ERVJMSU5FX1BPU0lUSU9OIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1VOREVSTElORV9USElDS05FU1MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GU19UWVBFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfSVRBTElDX0FOR0xFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBQU19EaWN0X0tleXNfCi0gIHsKLSAgICAvKiBjb252ZW50aW9uYWxseSBpbiB0aGUgZm9udCBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9GT05UX1RZUEUsICAgICAgICAgICAgICAvKiBGVF9CeXRlICAgICAgICAgKi8KLSAgICBQU19ESUNUX0ZPTlRfTUFUUklYLCAgICAgICAgICAgIC8qIEZUX0ZpeGVkICAgICAgICAqLwotICAgIFBTX0RJQ1RfRk9OVF9CQk9YLCAgICAgICAgICAgICAgLyogRlRfRml4ZWQgICAgICAgICovCi0gICAgUFNfRElDVF9QQUlOVF9UWVBFLCAgICAgICAgICAgICAvKiBGVF9CeXRlICAgICAgICAgKi8KLSAgICBQU19ESUNUX0ZPTlRfTkFNRSwgICAgICAgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotICAgIFBTX0RJQ1RfVU5JUVVFX0lELCAgICAgICAgICAgICAgLyogRlRfSW50ICAgICAgICAgICovCi0gICAgUFNfRElDVF9OVU1fQ0hBUl9TVFJJTkdTLCAgICAgICAvKiBGVF9JbnQgICAgICAgICAgKi8KLSAgICBQU19ESUNUX0NIQVJfU1RSSU5HX0tFWSwgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotICAgIFBTX0RJQ1RfQ0hBUl9TVFJJTkcsICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAgICAgICovCi0gICAgUFNfRElDVF9FTkNPRElOR19UWVBFLCAgICAgICAgICAvKiBUMV9FbmNvZGluZ1R5cGUgKi8KLSAgICBQU19ESUNUX0VOQ09ESU5HX0VOVFJZLCAgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotCi0gICAgLyogY29udmVudGlvbmFsbHkgaW4gdGhlIGZvbnQgUHJpdmF0ZSBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9OVU1fU1VCUlMsICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9TVUJSLCAgICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9TVERfSFcsICAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9TVERfVlcsICAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9OVU1fQkxVRV9WQUxVRVMsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9CTFVFX1ZBTFVFLCAgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9CTFVFX0ZVWlosICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9OVU1fT1RIRVJfQkxVRVMsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9PVEhFUl9CTFVFLCAgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fRkFNSUxZX0JMVUVTLCAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9GQU1JTFlfQkxVRSwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fRkFNSUxZX09USEVSX0JMVUVTLCAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9GQU1JTFlfT1RIRVJfQkxVRSwgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9CTFVFX1NDQUxFLCAgICAgICAgICAgICAvKiBGVF9GaXhlZCAgICovCi0gICAgUFNfRElDVF9CTFVFX1NISUZULCAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX0gsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9TVEVNX1NOQVBfSCwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX1YsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9TVEVNX1NOQVBfViwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9GT1JDRV9CT0xELCAgICAgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9STkRfU1RFTV9VUCwgICAgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9NSU5fRkVBVFVSRSwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9MRU5fSVYsICAgICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9QQVNTV09SRCwgICAgICAgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0gICAgUFNfRElDVF9MQU5HVUFHRV9HUk9VUCwgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0KLSAgICAvKiBjb252ZW50aW9uYWxseSBpbiB0aGUgZm9udCBGb250SW5mbyBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9WRVJTSU9OLCAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9OT1RJQ0UsICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9GVUxMX05BTUUsICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9GQU1JTFlfTkFNRSwgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9XRUlHSFQsICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9JU19GSVhFRF9QSVRDSCwgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9VTkRFUkxJTkVfUE9TSVRJT04sICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9VTkRFUkxJTkVfVEhJQ0tORVNTLCAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9GU19UWVBFLCAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9JVEFMSUNfQU5HTEUsICAgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0KLSAgICBQU19ESUNUX01BWCA9IFBTX0RJQ1RfSVRBTElDX0FOR0xFCi0KLSAgfSBQU19EaWN0X0tleXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1BTX0ZvbnRfVmFsdWUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgZm9yIHRoZSBzdXBwbGllZCBrZXkgZnJvbSBhIFBvc3RTY3JpcHQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqICAgIGtleSA6OgotICAgKiAgICAgICBBbiBlbnVtZXJhdGlvbiB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGRpY3Rpb25hcnkga2V5IHRvIHJldHJpZXZlLgotICAgKgotICAgKiAgICBpZHggOjoKLSAgICogICAgICAgRm9yIGFycmF5IHZhbHVlcywgdGhpcyBzcGVjaWZpZXMgdGhlIGluZGV4IHRvIGJlIHJldHVybmVkLgotICAgKgotICAgKiAgICB2YWx1ZSA6OgotICAgKiAgICAgICBBIHBvaW50ZXIgdG8gbWVtb3J5IGludG8gd2hpY2ggdG8gd3JpdGUgdGhlIHZhbHVlLgotICAgKgotICAgKiAgICB2YWxlbl9sZW4gOjoKLSAgICogICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgbWVtb3J5IHN1cHBsaWVkIGZvciB0aGUgdmFsdWUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIHZhbHVlIDo6Ci0gICAqICAgICAgIFRoZSB2YWx1ZSBtYXRjaGluZyB0aGUgYWJvdmUga2V5LCBpZiBpdCBleGlzdHMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIFRoZSBhbW91bnQgb2YgbWVtb3J5IChpbiBieXRlcykgcmVxdWlyZWQgdG8gaG9sZCB0aGUgcmVxdWVzdGVkCi0gICAqICAgIHZhbHVlIChpZiBpdCBleGlzdHMsIC0xIG90aGVyd2lzZSkuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBUaGUgdmFsdWVzIHJldHVybmVkIGFyZSBub3QgcG9pbnRlcnMgaW50byB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyBvZgotICAgKiAgICB0aGUgZmFjZSwgYnV0IGFyZSBgZnJlc2gnIGNvcGllcywgc28gdGhhdCB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlbQotICAgKiAgICBiZWxvbmdzIHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAgVGhpcyBhbHNvIGVuZm9yY2VzIHRoZQotICAgKiAgICBgcmVhZC1vbmx5JyBuYXR1cmUgb2YgdGhlc2UgdmFsdWVzLCBpLmUuLCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZQotICAgKiAgICB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGZhY2UuCi0gICAqCi0gICAqICAgIGB2YWx1ZScgaXMgYSB2b2lkIHBvaW50ZXIgYmVjYXVzZSB0aGUgdmFsdWVzIHJldHVybmVkIGNhbiBiZSBvZgotICAgKiAgICB2YXJpb3VzIHR5cGVzLgotICAgKgotICAgKiAgICBJZiBlaXRoZXIgYHZhbHVlJyBpcyBOVUxMIG9yIGB2YWx1ZV9sZW4nIGlzIHRvbyBzbWFsbCwganVzdCB0aGUKLSAgICogICAgcmVxdWlyZWQgbWVtb3J5IHNpemUgZm9yIHRoZSByZXF1ZXN0ZWQgZW50cnkgaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqICAgIFRoZSBgaWR4JyBwYXJhbWV0ZXIgaXMgdXNlZCwgbm90IG9ubHkgdG8gcmV0cmlldmUgZWxlbWVudHMgb2YsIGZvcgotICAgKiAgICBleGFtcGxlLCB0aGUgRm9udE1hdHJpeCBvciBGb250QkJveCwgYnV0IGFsc28gdG8gcmV0cmlldmUgbmFtZSBrZXlzCi0gICAqICAgIGZyb20gdGhlIENoYXJTdHJpbmdzIGRpY3Rpb25hcnksIGFuZCB0aGUgY2hhcnN0cmluZ3MgdGhlbXNlbHZlcy4gIEl0Ci0gICAqICAgIGlzIGlnbm9yZWQgZm9yIGF0b21pYyB2YWx1ZXMuCi0gICAqCi0gICAqICAgIFBTX0RJQ1RfQkxVRV9TQ0FMRSByZXR1cm5zIGEgdmFsdWUgdGhhdCBpcyBzY2FsZWQgdXAgYnkgMTAwMC4gIFRvCi0gICAqICAgIGdldCB0aGUgdmFsdWUgYXMgaW4gdGhlIGZvbnQgc3RyZWFtLCB5b3UgbmVlZCB0byBkaXZpZGUgYnkKLSAgICogICAgNjU1MzYwMDAuMCAodG8gcmVtb3ZlIHRoZSBGVF9GaXhlZCBzY2FsZSwgYW5kIHRoZSB4MTAwMCBzY2FsZSkuCi0gICAqCi0gICAqICAgIElNUE9SVEFOVDogT25seSBrZXkvdmFsdWUgcGFpcnMgcmVhZCBieSB0aGUgRnJlZVR5cGUgaW50ZXJwcmV0ZXIgY2FuCi0gICAqICAgIGJlIHJldHJpZXZlZC4gIFNvLCBmb3IgZXhhbXBsZSwgUG9zdFNjcmlwdCBwcm9jZWR1cmVzIHN1Y2ggYXMgTlAsCi0gICAqICAgIE5ELCBhbmQgUkQgYXJlIG5vdCBhdmFpbGFibGUuICBBcmJpdHJhcnkga2V5cyBhcmUsIG9idmlvdXNseSwgbm90IGJlCi0gICAqICAgIGF2YWlsYWJsZSBlaXRoZXIuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICogICAgdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgZXJyb3IgY29kZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX0dldF9QU19Gb250X1ZhbHVlKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBQU19EaWN0X0tleXMgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgdmFsdWVfbGVuICk7Ci0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVDFUQUJMRVNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0ZDY3Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0bmFtZWlkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBuYW1lIElEIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUVE5BTUVJRF9IXwotI2RlZmluZSBUVE5BTUVJRF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJ1ZXR5cGVfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpbiB0aGUgbmFtZSAgICAgICAgKi8KLSAgLyogcmVjb3JkcyBvZiBhbiBTRk5UIGBuYW1lJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9QTEFURk9STV9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm1faWQnIGlkZW50aWZpZXIgY29kZSBpbgotICAgKiAgIEBGVF9DaGFyTWFwUmVjIGFuZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlcy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFIDo6Ci0gICAqICAgICBVc2VkIGJ5IEFwcGxlIHRvIGluZGljYXRlIGEgVW5pY29kZSBjaGFyYWN0ZXIgbWFwIGFuZC9vciBuYW1lIGVudHJ5LgotICAgKiAgICAgU2VlIEBUVF9BUFBMRV9JRF9YWFggZm9yIGNvcnJlc3BvbmRpbmcgYGVuY29kaW5nX2lkJyB2YWx1ZXMuICBOb3RlCi0gICAqICAgICB0aGF0IG5hbWUgZW50cmllcyBpbiB0aGlzIGZvcm1hdCBhcmUgY29kZWQgYXMgYmlnLWVuZGlhbiBVQ1MtMgotICAgKiAgICAgY2hhcmFjdGVyIGNvZGVzIF9vbmx5Xy4KLSAgICoKLSAgICogICBUVF9QTEFURk9STV9NQUNJTlRPU0ggOjoKLSAgICogICAgIFVzZWQgYnkgQXBwbGUgdG8gaW5kaWNhdGUgYSBNYWNPUy1zcGVjaWZpYyBjaGFybWFwIGFuZC9vciBuYW1lIGVudHJ5LgotICAgKiAgICAgU2VlIEBUVF9NQUNfSURfWFhYIGZvciBjb3JyZXNwb25kaW5nIGBlbmNvZGluZ19pZCcgdmFsdWVzLiAgTm90ZSB0aGF0Ci0gICAqICAgICBtb3N0IFRydWVUeXBlIGZvbnRzIGNvbnRhaW4gYW4gQXBwbGUgcm9tYW4gY2hhcm1hcCB0byBiZSB1c2FibGUgb24KLSAgICogICAgIE1hY09TIHN5c3RlbXMgKGV2ZW4gaWYgdGhleSBjb250YWluIGEgTWljcm9zb2Z0IGNoYXJtYXAgYXMgd2VsbCkuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fSVNPIDo6Ci0gICAqICAgICBUaGlzIHZhbHVlIHdhcyB1c2VkIHRvIHNwZWNpZnkgSVNPL0lFQyAxMDY0NiBjaGFybWFwcy4gIEl0IGlzIGhvd2V2ZXIKLSAgICogICAgIG5vdyBkZXByZWNhdGVkLiAgU2VlIEBUVF9JU09fSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZwotICAgKiAgICAgYGVuY29kaW5nX2lkJyB2YWx1ZXMuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fTUlDUk9TT0ZUIDo6Ci0gICAqICAgICBVc2VkIGJ5IE1pY3Jvc29mdCB0byBpbmRpY2F0ZSBXaW5kb3dzLXNwZWNpZmljIGNoYXJtYXBzLiAgU2VlCi0gICAqICAgICBAVFRfTVNfSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZyBgZW5jb2RpbmdfaWQnIHZhbHVlcy4KLSAgICogICAgIE5vdGUgdGhhdCBtb3N0IGZvbnRzIGNvbnRhaW4gYSBVbmljb2RlIGNoYXJtYXAgdXNpbmcKLSAgICogICAgIChUVF9QTEFURk9STV9NSUNST1NPRlQsIEBUVF9NU19JRF9VTklDT0RFX0NTKS4KLSAgICoKLSAgICogICBUVF9QTEFURk9STV9DVVNUT00gOjoKLSAgICogICAgIFVzZWQgdG8gaW5kaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgY2hhcm1hcHMuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fQURPQkUgOjoKLSAgICogICAgIFRoaXMgdmFsdWUgaXNuJ3QgcGFydCBvZiBhbnkgZm9udCBmb3JtYXQgc3BlY2lmaWNhdGlvbiwgYnV0IGlzIHVzZWQKLSAgICogICAgIGJ5IEZyZWVUeXBlIHRvIHJlcG9ydCBBZG9iZS1zcGVjaWZpYyBjaGFybWFwcyBpbiBhbiBARlRfQ2hhck1hcFJlYwotICAgKiAgICAgc3RydWN0dXJlLiAgU2VlIEBUVF9BRE9CRV9JRF9YWFguCi0gICAqLwotCi0jZGVmaW5lIFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgIDAKLSNkZWZpbmUgVFRfUExBVEZPUk1fTUFDSU5UT1NIICAgICAgMQotI2RlZmluZSBUVF9QTEFURk9STV9JU08gICAgICAgICAgICAyIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgVFRfUExBVEZPUk1fTUlDUk9TT0ZUICAgICAgMwotI2RlZmluZSBUVF9QTEFURk9STV9DVVNUT00gICAgICAgICA0Ci0jZGVmaW5lIFRUX1BMQVRGT1JNX0FET0JFICAgICAgICAgIDcgLyogYXJ0aWZpY2lhbCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX0FQUExFX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgY2hhcm1hcHMgYW5kIG5hbWUgZW50cmllcy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9BUFBMRV9JRF9ERUZBVUxUIDo6Ci0gICAqICAgICBVbmljb2RlIHZlcnNpb24gMS4wLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMV8xIDo6Ci0gICAqICAgICBVbmljb2RlIDEuMTsgc3BlY2lmaWVzIEhhbmd1bCBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IFUrMzR4eC4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9JU09fMTA2NDYgOjoKLSAgICogICAgIERlcHJlY2F0ZWQgKGlkZW50aWNhbCB0byBwcmVjZWRpbmcpLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMl8wIDo6Ci0gICAqICAgICBVbmljb2RlIDIuMCBhbmQgYmV5b25kIChVVEYtMTYgQk1QIG9ubHkpLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMzIgOjoKLSAgICogICAgIFVuaWNvZGUgMy4xIGFuZCBiZXlvbmQsIHVzaW5nIFVURi0zMi4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9WQVJJQU5UX1NFTEVDVE9SIDo6Ci0gICAqICAgICBGcm9tIEFkb2JlLCBub3QgQXBwbGUuICBOb3QgYSBub3JtYWwgY21hcC4gIFNwZWNpZmllcyB2YXJpYXRpb25zCi0gICAqICAgICBvbiBhIHJlYWwgY21hcC4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9GVUxMX1VOSUNPREUgOjoKLSAgICogICAgIFVzZWQgZm9yIGZhbGxiYWNrIGZvbnRzIHRoYXQgcHJvdmlkZSBjb21wbGV0ZSBVbmljb2RlIGNvdmVyYWdlIHdpdGgKLSAgICogICAgIGEgdHlwZX4xMyBjbWFwLgotICAgKi8KLQotI2RlZmluZSBUVF9BUFBMRV9JRF9ERUZBVUxUICAgICAgICAgICAwIC8qIFVuaWNvZGUgMS4wICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0FQUExFX0lEX1VOSUNPREVfMV8xICAgICAgIDEgLyogc3BlY2lmeSBIYW5ndWwgYXQgVSszNHh4ICAgICAgKi8KLSNkZWZpbmUgVFRfQVBQTEVfSURfSVNPXzEwNjQ2ICAgICAgICAgMiAvKiBkZXByZWNhdGVkICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9VTklDT0RFXzJfMCAgICAgICAzIC8qIG9yIGxhdGVyICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0FQUExFX0lEX1VOSUNPREVfMzIgICAgICAgIDQgLyogMi4wIG9yIGxhdGVyLCBmdWxsIHJlcGVydG9pcmUgKi8KLSNkZWZpbmUgVFRfQVBQTEVfSURfVkFSSUFOVF9TRUxFQ1RPUiAgNSAvKiB2YXJpYXRpb24gc2VsZWN0b3IgZGF0YSAgICAgICAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9GVUxMX1VOSUNPREUgICAgICA2IC8qIHVzZWQgd2l0aCB0eXBlIDEzIGNtYXBzICAgICAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfTUFDX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSCBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgotICAgKi8KLQotI2RlZmluZSBUVF9NQUNfSURfUk9NQU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgVFRfTUFDX0lEX0pBUEFORVNFICAgICAgICAgICAgICAxCi0jZGVmaW5lIFRUX01BQ19JRF9UUkFESVRJT05BTF9DSElORVNFICAgMgotI2RlZmluZSBUVF9NQUNfSURfS09SRUFOICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgVFRfTUFDX0lEX0FSQUJJQyAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFRUX01BQ19JRF9IRUJSRVcgICAgICAgICAgICAgICAgNQotI2RlZmluZSBUVF9NQUNfSURfR1JFRUsgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgVFRfTUFDX0lEX1JVU1NJQU4gICAgICAgICAgICAgICA3Ci0jZGVmaW5lIFRUX01BQ19JRF9SU1lNQk9MICAgICAgICAgICAgICAgOAotI2RlZmluZSBUVF9NQUNfSURfREVWQU5BR0FSSSAgICAgICAgICAgIDkKLSNkZWZpbmUgVFRfTUFDX0lEX0dVUk1VS0hJICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFRUX01BQ19JRF9HVUpBUkFUSSAgICAgICAgICAgICAxMQotI2RlZmluZSBUVF9NQUNfSURfT1JJWUEgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgVFRfTUFDX0lEX0JFTkdBTEkgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFRUX01BQ19JRF9UQU1JTCAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBUVF9NQUNfSURfVEVMVUdVICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgVFRfTUFDX0lEX0tBTk5BREEgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFRUX01BQ19JRF9NQUxBWUFMQU0gICAgICAgICAgICAxNwotI2RlZmluZSBUVF9NQUNfSURfU0lOSEFMRVNFICAgICAgICAgICAgMTgKLSNkZWZpbmUgVFRfTUFDX0lEX0JVUk1FU0UgICAgICAgICAgICAgIDE5Ci0jZGVmaW5lIFRUX01BQ19JRF9LSE1FUiAgICAgICAgICAgICAgICAyMAotI2RlZmluZSBUVF9NQUNfSURfVEhBSSAgICAgICAgICAgICAgICAgMjEKLSNkZWZpbmUgVFRfTUFDX0lEX0xBT1RJQU4gICAgICAgICAgICAgIDIyCi0jZGVmaW5lIFRUX01BQ19JRF9HRU9SR0lBTiAgICAgICAgICAgICAyMwotI2RlZmluZSBUVF9NQUNfSURfQVJNRU5JQU4gICAgICAgICAgICAgMjQKLSNkZWZpbmUgVFRfTUFDX0lEX01BTERJVklBTiAgICAgICAgICAgIDI1Ci0jZGVmaW5lIFRUX01BQ19JRF9TSU1QTElGSUVEX0NISU5FU0UgICAyNQotI2RlZmluZSBUVF9NQUNfSURfVElCRVRBTiAgICAgICAgICAgICAgMjYKLSNkZWZpbmUgVFRfTUFDX0lEX01PTkdPTElBTiAgICAgICAgICAgIDI3Ci0jZGVmaW5lIFRUX01BQ19JRF9HRUVaICAgICAgICAgICAgICAgICAyOAotI2RlZmluZSBUVF9NQUNfSURfU0xBVklDICAgICAgICAgICAgICAgMjkKLSNkZWZpbmUgVFRfTUFDX0lEX1ZJRVROQU1FU0UgICAgICAgICAgIDMwCi0jZGVmaW5lIFRUX01BQ19JRF9TSU5ESEkgICAgICAgICAgICAgICAzMQotI2RlZmluZSBUVF9NQUNfSURfVU5JTlRFUlAgICAgICAgICAgICAgMzIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9JU09fSURfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKLSAgICogICBAVFRfUExBVEZPUk1fSVNPIGNoYXJtYXBzIGFuZCBuYW1lIGVudHJpZXMuCi0gICAqCi0gICAqICAgVGhlaXIgdXNlIGlzIG5vdyBkZXByZWNhdGVkLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIFRUX0lTT19JRF83QklUX0FTQ0lJIDo6Ci0gICAqICAgICBBU0NJSS4KLSAgICogICBUVF9JU09fSURfMTA2NDYgOjoKLSAgICogICAgIElTTy8xMDY0Ni4KLSAgICogICBUVF9JU09fSURfODg1OV8xIDo6Ci0gICAqICAgICBBbHNvIGtub3duIGFzIExhdGluLTEuCi0gICAqLwotCi0jZGVmaW5lIFRUX0lTT19JRF83QklUX0FTQ0lJICAwCi0jZGVmaW5lIFRUX0lTT19JRF8xMDY0NiAgICAgICAxCi0jZGVmaW5lIFRUX0lTT19JRF84ODU5XzEgICAgICAyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfTVNfSURfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKLSAgICogICBAVFRfUExBVEZPUk1fTUlDUk9TT0ZUIGNoYXJtYXBzIGFuZCBuYW1lIGVudHJpZXMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfTVNfSURfU1lNQk9MX0NTIDo6Ci0gICAqICAgICBNaWNyb3NvZnQgc3ltYm9sIGVuY29kaW5nLiAgU2VlIEBGVF9FTkNPRElOR19NU19TWU1CT0wuCi0gICAqCi0gICAqICAgVFRfTVNfSURfVU5JQ09ERV9DUyA6OgotICAgKiAgICAgTWljcm9zb2Z0IFdHTDQgY2hhcm1hcCwgbWF0Y2hpbmcgVW5pY29kZS4gIFNlZQotICAgKiAgICAgQEZUX0VOQ09ESU5HX1VOSUNPREUuCi0gICAqCi0gICAqICAgVFRfTVNfSURfU0pJUyA6OgotICAgKiAgICAgU2hpZnQgSklTIEphcGFuZXNlIGVuY29kaW5nLiAgU2VlIEBGVF9FTkNPRElOR19TSklTLgotICAgKgotICAgKiAgIFRUX01TX0lEX1BSQyA6OgotICAgKiAgICAgQ2hpbmVzZSBlbmNvZGluZ3MgYXMgdXNlZCBpbiB0aGUgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgQ2hpbmEgKFBSQykuCi0gICAqICAgICBUaGlzIG1lYW5zIHRoZSBlbmNvZGluZ3MgR0J+MjMxMiBhbmQgaXRzIHN1cGVyc2V0cyBHQksgYW5kCi0gICAqICAgICBHQn4xODAzMC4gIFNlZSBARlRfRU5DT0RJTkdfUFJDLgotICAgKgotICAgKiAgIFRUX01TX0lEX0JJR181IDo6Ci0gICAqICAgICBUcmFkaXRpb25hbCBDaGluZXNlIGFzIHVzZWQgaW4gVGFpd2FuIGFuZCBIb25nIEtvbmcuICBTZWUKLSAgICogICAgIEBGVF9FTkNPRElOR19CSUc1LgotICAgKgotICAgKiAgIFRUX01TX0lEX1dBTlNVTkcgOjoKLSAgICogICAgIEtvcmVhbiBFeHRlbmRlZCBXYW5zdW5nIGVuY29kaW5nLiAgU2VlIEBGVF9FTkNPRElOR19XQU5TVU5HLgotICAgKgotICAgKiAgIFRUX01TX0lEX0pPSEFCIDo6Ci0gICAqICAgICBLb3JlYW4gSm9oYWIgZW5jb2RpbmcuICBTZWUgQEZUX0VOQ09ESU5HX0pPSEFCLgotICAgKgotICAgKiAgIFRUX01TX0lEX1VDU180IDo6Ci0gICAqICAgICBVQ1MtNCBvciBVVEYtMzIgY2hhcm1hcHMuICBUaGlzIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBPcGVuVHlwZQotICAgKiAgICAgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuNCAobWlkLTIwMDEpLgotICAgKi8KLQotI2RlZmluZSBUVF9NU19JRF9TWU1CT0xfQ1MgICAgMAotI2RlZmluZSBUVF9NU19JRF9VTklDT0RFX0NTICAgMQotI2RlZmluZSBUVF9NU19JRF9TSklTICAgICAgICAgMgotI2RlZmluZSBUVF9NU19JRF9QUkMgICAgICAgICAgMwotI2RlZmluZSBUVF9NU19JRF9CSUdfNSAgICAgICAgNAotI2RlZmluZSBUVF9NU19JRF9XQU5TVU5HICAgICAgNQotI2RlZmluZSBUVF9NU19JRF9KT0hBQiAgICAgICAgNgotI2RlZmluZSBUVF9NU19JRF9VQ1NfNCAgICAgICAxMAotCi0gIC8qIHRoaXMgdmFsdWUgaXMgZGVwcmVjYXRlZCAqLwotI2RlZmluZSBUVF9NU19JRF9HQjIzMTIgIFRUX01TX0lEX1BSQwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX0FET0JFX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX0FET0JFIGNoYXJtYXBzLiAgVGhpcyBpcyBhIEZyZWVUeXBlLXNwZWNpZmljIGV4dGVuc2lvbiEKLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9BRE9CRV9JRF9TVEFOREFSRCA6OgotICAgKiAgICAgQWRvYmUgc3RhbmRhcmQgZW5jb2RpbmcuCi0gICAqICAgVFRfQURPQkVfSURfRVhQRVJUIDo6Ci0gICAqICAgICBBZG9iZSBleHBlcnQgZW5jb2RpbmcuCi0gICAqICAgVFRfQURPQkVfSURfQ1VTVE9NIDo6Ci0gICAqICAgICBBZG9iZSBjdXN0b20gZW5jb2RpbmcuCi0gICAqICAgVFRfQURPQkVfSURfTEFUSU5fMSA6OgotICAgKiAgICAgQWRvYmUgTGF0aW5+MSBlbmNvZGluZy4KLSAgICovCi0KLSNkZWZpbmUgVFRfQURPQkVfSURfU1RBTkRBUkQgIDAKLSNkZWZpbmUgVFRfQURPQkVfSURfRVhQRVJUICAgIDEKLSNkZWZpbmUgVFRfQURPQkVfSURfQ1VTVE9NICAgIDIKLSNkZWZpbmUgVFRfQURPQkVfSURfTEFUSU5fMSAgIDMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9NQUNfTEFOR0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUG9zc2libGUgdmFsdWVzIG9mIHRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMKLSAgICogICBvZiB0aGUgU0ZOVCBgbmFtZScgdGFibGUgaWYgdGhlIGBwbGF0Zm9ybScgaWRlbnRpZmllciBjb2RlIGlzCi0gICAqICAgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSC4gIFRoZXNlIHZhbHVlcyBhcmUgYWxzbyB1c2VkIGFzIHJldHVybiB2YWx1ZXMKLSAgICogICBmb3IgZnVuY3Rpb24gQEZUX0dldF9DTWFwX0xhbmd1YWdlX0lELgotICAgKgotICAgKiAgIFRoZSBjYW5vbmljYWwgc291cmNlIGZvciBBcHBsZSdzIElEcyBpcwotICAgKgotICAgKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNm5hbWUuaHRtbAotICAgKi8KLQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0VOR0xJU0ggICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GUkVOQ0ggICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR0VSTUFOICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lUQUxJQU4gICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9EVVRDSCAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU1dFRElTSCAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NQQU5JU0ggICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9EQU5JU0ggICAgICAgICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfUE9SVFVHVUVTRSAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX05PUldFR0lBTiAgICAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9IRUJSRVcgICAgICAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSkFQQU5FU0UgICAgICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GSU5OSVNIICAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1JFRUsgICAgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lDRUxBTkRJQyAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxURVNFICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVFVSS0lTSCAgICAgICAgICAgICAgICAgICAgICAxNwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NST0FUSUFOICAgICAgICAgICAgICAgICAgICAgMTgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DSElORVNFX1RSQURJVElPTkFMICAgICAgICAgIDE5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVVJEVSAgICAgICAgICAgICAgICAgICAgICAgICAyMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0hJTkRJICAgICAgICAgICAgICAgICAgICAgICAgMjEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USEFJICAgICAgICAgICAgICAgICAgICAgICAgIDIyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfS09SRUFOICAgICAgICAgICAgICAgICAgICAgICAyMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xJVEhVQU5JQU4gICAgICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QT0xJU0ggICAgICAgICAgICAgICAgICAgICAgIDI1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSFVOR0FSSUFOICAgICAgICAgICAgICAgICAgICAyNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0VTVE9OSUFOICAgICAgICAgICAgICAgICAgICAgMjcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9MRVRUSVNIICAgICAgICAgICAgICAgICAgICAgIDI4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0FBTUlTSyAgICAgICAgICAgICAgICAgICAgICAyOQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZBRVJPRVNFICAgICAgICAgICAgICAgICAgICAgMzAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GQVJTSSAgICAgICAgICAgICAgICAgICAgICAgIDMxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfUlVTU0lBTiAgICAgICAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NISU5FU0VfU0lNUExJRklFRCAgICAgICAgICAgMzMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GTEVNSVNIICAgICAgICAgICAgICAgICAgICAgIDM0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0ggICAgICAgICAgICAgICAgICAgICAgICAzNQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FMQkFOSUFOICAgICAgICAgICAgICAgICAgICAgMzYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ST01BTklBTiAgICAgICAgICAgICAgICAgICAgIDM3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ1pFQ0ggICAgICAgICAgICAgICAgICAgICAgICAzOAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NMT1ZBSyAgICAgICAgICAgICAgICAgICAgICAgMzkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TTE9WRU5JQU4gICAgICAgICAgICAgICAgICAgIDQwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfWUlERElTSCAgICAgICAgICAgICAgICAgICAgICA0MQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NFUkJJQU4gICAgICAgICAgICAgICAgICAgICAgNDIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUNFRE9OSUFOICAgICAgICAgICAgICAgICAgIDQzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfQlVMR0FSSUFOICAgICAgICAgICAgICAgICAgICA0NAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1VLUkFJTklBTiAgICAgICAgICAgICAgICAgICAgNDUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CWUVMT1JVU1NJQU4gICAgICAgICAgICAgICAgIDQ2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVVpCRUsgICAgICAgICAgICAgICAgICAgICAgICA0NwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tBWkFLSCAgICAgICAgICAgICAgICAgICAgICAgNDgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSSAgICAgICAgICAgICAgICAgIDQ5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQVpFUkJBSUpBTklfQ1lSSUxMSUNfU0NSSVBUICA0OQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JX0FSQUJJQ19TQ1JJUFQgICAgNTAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BUk1FTklBTiAgICAgICAgICAgICAgICAgICAgIDUxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR0VPUkdJQU4gICAgICAgICAgICAgICAgICAgICA1MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTERBVklBTiAgICAgICAgICAgICAgICAgICAgNTMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LSVJHSElaICAgICAgICAgICAgICAgICAgICAgIDU0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVEFKSUtJICAgICAgICAgICAgICAgICAgICAgICA1NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RVUktNRU4gICAgICAgICAgICAgICAgICAgICAgNTYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NT05HT0xJQU4gICAgICAgICAgICAgICAgICAgIDU3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBTl9TQ1JJUFQgICA1NwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTkdPTElBTl9DWVJJTExJQ19TQ1JJUFQgICAgNTgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QQVNIVE8gICAgICAgICAgICAgICAgICAgICAgIDU5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfS1VSRElTSCAgICAgICAgICAgICAgICAgICAgICA2MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tBU0hNSVJJICAgICAgICAgICAgICAgICAgICAgNjEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TSU5ESEkgICAgICAgICAgICAgICAgICAgICAgIDYyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfVElCRVRBTiAgICAgICAgICAgICAgICAgICAgICA2MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX05FUEFMSSAgICAgICAgICAgICAgICAgICAgICAgNjQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQU5TS1JJVCAgICAgICAgICAgICAgICAgICAgIDY1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTUFSQVRISSAgICAgICAgICAgICAgICAgICAgICA2NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JFTkdBTEkgICAgICAgICAgICAgICAgICAgICAgNjcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BU1NBTUVTRSAgICAgICAgICAgICAgICAgICAgIDY4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1VKQVJBVEkgICAgICAgICAgICAgICAgICAgICA2OQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BVTkpBQkkgICAgICAgICAgICAgICAgICAgICAgNzAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9PUklZQSAgICAgICAgICAgICAgICAgICAgICAgIDcxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTUFMQVlBTEFNICAgICAgICAgICAgICAgICAgICA3MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tBTk5BREEgICAgICAgICAgICAgICAgICAgICAgNzMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQU1JTCAgICAgICAgICAgICAgICAgICAgICAgIDc0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVEVMVUdVICAgICAgICAgICAgICAgICAgICAgICA3NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NJTkhBTEVTRSAgICAgICAgICAgICAgICAgICAgNzYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CVVJNRVNFICAgICAgICAgICAgICAgICAgICAgIDc3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0hNRVIgICAgICAgICAgICAgICAgICAgICAgICA3OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xBTyAgICAgICAgICAgICAgICAgICAgICAgICAgNzkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9WSUVUTkFNRVNFICAgICAgICAgICAgICAgICAgIDgwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSU5ET05FU0lBTiAgICAgICAgICAgICAgICAgICA4MQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBR0FMT0cgICAgICAgICAgICAgICAgICAgICAgODIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWV9ST01BTl9TQ1JJUFQgICAgICAgICAgIDgzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTUFMQVlfQVJBQklDX1NDUklQVCAgICAgICAgICA4NAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FNSEFSSUMgICAgICAgICAgICAgICAgICAgICAgODUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USUdSSU5ZQSAgICAgICAgICAgICAgICAgICAgIDg2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfR0FMTEEgICAgICAgICAgICAgICAgICAgICAgICA4NwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NPTUFMSSAgICAgICAgICAgICAgICAgICAgICAgODgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TV0FISUxJICAgICAgICAgICAgICAgICAgICAgIDg5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfUlVBTkRBICAgICAgICAgICAgICAgICAgICAgICA5MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JVTkRJICAgICAgICAgICAgICAgICAgICAgICAgOTEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DSEVXQSAgICAgICAgICAgICAgICAgICAgICAgIDkyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTUFMQUdBU1kgICAgICAgICAgICAgICAgICAgICA5MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0VTUEVSQU5UTyAgICAgICAgICAgICAgICAgICAgOTQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9XRUxTSCAgICAgICAgICAgICAgICAgICAgICAgMTI4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQkFTUVVFICAgICAgICAgICAgICAgICAgICAgIDEyOQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NBVEFMQU4gICAgICAgICAgICAgICAgICAgICAxMzAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9MQVRJTiAgICAgICAgICAgICAgICAgICAgICAgMTMxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfUVVFQ0hVQSAgICAgICAgICAgICAgICAgICAgIDEzMgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dVQVJBTkkgICAgICAgICAgICAgICAgICAgICAxMzMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWU1BUkEgICAgICAgICAgICAgICAgICAgICAgMTM0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVEFUQVIgICAgICAgICAgICAgICAgICAgICAgIDEzNQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1VJR0hVUiAgICAgICAgICAgICAgICAgICAgICAxMzYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9EWk9OR0tIQSAgICAgICAgICAgICAgICAgICAgMTM3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSkFWQU5FU0UgICAgICAgICAgICAgICAgICAgIDEzOAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NVTkRBTkVTRSAgICAgICAgICAgICAgICAgICAxMzkKLQotICAvKiBUaGUgZm9sbG93aW5nIGNvZGVzIGFyZSBuZXcgYXMgb2YgMjAwMC0wMy0xMCAqLwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dBTElDSUFOICAgICAgICAgICAgICAgICAgICAxNDAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BRlJJS0FBTlMgICAgICAgICAgICAgICAgICAgMTQxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfQlJFVE9OICAgICAgICAgICAgICAgICAgICAgIDE0MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lOVUtUSVRVVCAgICAgICAgICAgICAgICAgICAxNDMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQ09UVElTSF9HQUVMSUMgICAgICAgICAgICAgMTQ0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTUFOWF9HQUVMSUMgICAgICAgICAgICAgICAgIDE0NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lSSVNIX0dBRUxJQyAgICAgICAgICAgICAgICAxNDYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UT05HQU4gICAgICAgICAgICAgICAgICAgICAgMTQ3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1JFRUtfUE9MWVRPTklDICAgICAgICAgICAgIDE0OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dSRUVMQU5ESUMgICAgICAgICAgICAgICAgICAxNDkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSV9ST01BTl9TQ1JJUFQgICAgMTUwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfTVNfTEFOR0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUG9zc2libGUgdmFsdWVzIG9mIHRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMKLSAgICogICBvZiB0aGUgU0ZOVCBgbmFtZScgdGFibGUgaWYgdGhlIGBwbGF0Zm9ybScgaWRlbnRpZmllciBjb2RlIGlzCi0gICAqICAgQFRUX1BMQVRGT1JNX01JQ1JPU09GVC4gIFRoZXNlIHZhbHVlcyBhcmUgYWxzbyB1c2VkIGFzIHJldHVybiB2YWx1ZXMKLSAgICogICBmb3IgZnVuY3Rpb24gQEZUX0dldF9DTWFwX0xhbmd1YWdlX0lELgotICAgKgotICAgKiAgIFRoZSBjYW5vbmljYWwgc291cmNlIGZvciBNaWNyb3NvZnQncyBJRHMgaXMKLSAgICoKLSAgICogICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9nbG9iYWxkZXYvcmVmZXJlbmNlL2xjaWQtYWxsLm1zcHggLAotICAgKgotICAgKiAgIGhvd2V2ZXIsIHdlIG9ubHkgcHJvdmlkZSBtYWNyb3MgZm9yIGxhbmd1YWdlIGlkZW50aWZpZXJzIHByZXNlbnQgaW4KLSAgICogICB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbjogTWljcm9zb2Z0IGhhcyBhYmFuZG9uZWQgdGhlIGNvbmNlcHQgb2YKLSAgICogICBMQ0lEcyAobGFuZ3VhZ2UgY29kZSBpZGVudGlmaWVycyksIGFuZCBmb3JtYXR+MSBvZiB0aGUgYG5hbWUnIHRhYmxlCi0gICAqICAgcHJvdmlkZXMgYSBiZXR0ZXIgbWVjaGFuaXNtIGZvciBsYW5ndWFnZXMgbm90IGNvdmVyZWQgaGVyZS4KLSAgICoKLSAgICogICBNb3JlIGxlZ2FjeSB2YWx1ZXMgbm90IGxpc3RlZCBpbiB0aGUgcmVmZXJlbmNlIGNhbiBiZSBmb3VuZCBpbiB0aGUKLSAgICogICBARlRfVFJVRVRZUEVfSURTX0ggaGVhZGVyIGZpbGUuCi0gICAqLwotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfU0FVRElfQVJBQklBICAgICAgICAgICAgICAgMHgwNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSVJBUSAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfRUdZUFQgICAgICAgICAgICAgICAgICAgICAgMHgwQzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTElCWUEgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQUxHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgxNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTU9ST0NDTyAgICAgICAgICAgICAgICAgICAgMHgxODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVFVOSVNJQSAgICAgICAgICAgICAgICAgICAgMHgxQzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfT01BTiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfWUVNRU4gICAgICAgICAgICAgICAgICAgICAgMHgyNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfU1lSSUEgICAgICAgICAgICAgICAgICAgICAgMHgyODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSk9SREFOICAgICAgICAgICAgICAgICAgICAgMHgyQzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTEVCQU5PTiAgICAgICAgICAgICAgICAgICAgMHgzMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfS1VXQUlUICAgICAgICAgICAgICAgICAgICAgMHgzNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVUFFICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQkFIUkFJTiAgICAgICAgICAgICAgICAgICAgMHgzQzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfUUFUQVIgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CVUxHQVJJQU5fQlVMR0FSSUEgICAgICAgICAgICAgICAgMHgwNDAyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DQVRBTEFOX0NBVEFMQU4gICAgICAgICAgICAgICAgICAgMHgwNDAzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1RBSVdBTiAgICAgICAgICAgICAgICAgICAgMHgwNDA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1BSQyAgICAgICAgICAgICAgICAgICAgICAgMHgwODA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX0hPTkdfS09ORyAgICAgICAgICAgICAgICAgMHgwQzA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1NJTkdBUE9SRSAgICAgICAgICAgICAgICAgMHgxMDA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX01BQ0FPICAgICAgICAgICAgICAgICAgICAgMHgxNDA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DWkVDSF9DWkVDSF9SRVBVQkxJQyAgICAgICAgICAgICAgMHgwNDA1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9EQU5JU0hfREVOTUFSSyAgICAgICAgICAgICAgICAgICAgMHgwNDA2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fR0VSTUFOWSAgICAgICAgICAgICAgICAgICAgMHgwNDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fU1dJVFpFUkxBTkQgICAgICAgICAgICAgICAgMHgwODA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fQVVTVFJJQSAgICAgICAgICAgICAgICAgICAgMHgwQzA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTFVYRU1CT1VSRyAgICAgICAgICAgICAgICAgMHgxMDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTElFQ0hURU5TVEVJTiAgICAgICAgICAgICAgMHgxNDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HUkVFS19HUkVFQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwNDA4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1VOSVRFRF9TVEFURVMgICAgICAgICAgICAgMHgwNDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1VOSVRFRF9LSU5HRE9NICAgICAgICAgICAgMHgwODA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0FVU1RSQUxJQSAgICAgICAgICAgICAgICAgMHgwQzA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0NBTkFEQSAgICAgICAgICAgICAgICAgICAgMHgxMDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX05FV19aRUFMQU5EICAgICAgICAgICAgICAgMHgxNDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0lSRUxBTkQgICAgICAgICAgICAgICAgICAgMHgxODA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgMHgxQzA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0pBTUFJQ0EgICAgICAgICAgICAgICAgICAgMHgyMDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0NBUklCQkVBTiAgICAgICAgICAgICAgICAgMHgyNDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0JFTElaRSAgICAgICAgICAgICAgICAgICAgMHgyODA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1RSSU5JREFEICAgICAgICAgICAgICAgICAgMHgyQzA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1pJTUJBQldFICAgICAgICAgICAgICAgICAgMHgzMDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1BISUxJUFBJTkVTICAgICAgICAgICAgICAgMHgzNDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0lORElBICAgICAgICAgICAgICAgICAgICAgMHg0MDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX01BTEFZU0lBICAgICAgICAgICAgICAgICAgMHg0NDA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1NJTkdBUE9SRSAgICAgICAgICAgICAgICAgMHg0ODA5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1NQQUlOX1RSQURJVElPTkFMX1NPUlQgICAgMHgwNDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX01FWElDTyAgICAgICAgICAgICAgICAgICAgMHgwODBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1NQQUlOX01PREVSTl9TT1JUICAgICAgICAgMHgwQzBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0dVQVRFTUFMQSAgICAgICAgICAgICAgICAgMHgxMDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0NPU1RBX1JJQ0EgICAgICAgICAgICAgICAgMHgxNDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1BBTkFNQSAgICAgICAgICAgICAgICAgICAgMHgxODBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0RPTUlOSUNBTl9SRVBVQkxJQyAgICAgICAgMHgxQzBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1ZFTkVaVUVMQSAgICAgICAgICAgICAgICAgMHgyMDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0NPTE9NQklBICAgICAgICAgICAgICAgICAgMHgyNDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1BFUlUgICAgICAgICAgICAgICAgICAgICAgMHgyODBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0FSR0VOVElOQSAgICAgICAgICAgICAgICAgMHgyQzBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0VDVUFET1IgICAgICAgICAgICAgICAgICAgMHgzMDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0NISUxFICAgICAgICAgICAgICAgICAgICAgMHgzNDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1VSVUdVQVkgICAgICAgICAgICAgICAgICAgMHgzODBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1BBUkFHVUFZICAgICAgICAgICAgICAgICAgMHgzQzBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0JPTElWSUEgICAgICAgICAgICAgICAgICAgMHg0MDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0VMX1NBTFZBRE9SICAgICAgICAgICAgICAgMHg0NDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0hPTkRVUkFTICAgICAgICAgICAgICAgICAgMHg0ODBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX05JQ0FSQUdVQSAgICAgICAgICAgICAgICAgMHg0QzBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1BVRVJUT19SSUNPICAgICAgICAgICAgICAgMHg1MDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1VOSVRFRF9TVEFURVMgICAgICAgICAgICAgMHg1NDBBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GSU5OSVNIX0ZJTkxBTkQgICAgICAgICAgICAgICAgICAgMHgwNDBCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfRlJBTkNFICAgICAgICAgICAgICAgICAgICAgMHgwNDBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQkVMR0lVTSAgICAgICAgICAgICAgICAgICAgMHgwODBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ0FOQURBICAgICAgICAgICAgICAgICAgICAgMHgwQzBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfU1dJVFpFUkxBTkQgICAgICAgICAgICAgICAgMHgxMDBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTFVYRU1CT1VSRyAgICAgICAgICAgICAgICAgMHgxNDBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTU9OQUNPICAgICAgICAgICAgICAgICAgICAgMHgxODBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9IRUJSRVdfSVNSQUVMICAgICAgICAgICAgICAgICAgICAgMHgwNDBECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9IVU5HQVJJQU5fSFVOR0FSWSAgICAgICAgICAgICAgICAgMHgwNDBFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JQ0VMQU5ESUNfSUNFTEFORCAgICAgICAgICAgICAgICAgMHgwNDBGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JVEFMSUFOX0lUQUxZICAgICAgICAgICAgICAgICAgICAgMHgwNDEwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JVEFMSUFOX1NXSVRaRVJMQU5EICAgICAgICAgICAgICAgMHgwODEwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9KQVBBTkVTRV9KQVBBTiAgICAgICAgICAgICAgICAgICAgMHgwNDExCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LT1JFQU5fS09SRUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDEyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9EVVRDSF9ORVRIRVJMQU5EUyAgICAgICAgICAgICAgICAgMHgwNDEzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9EVVRDSF9CRUxHSVVNICAgICAgICAgICAgICAgICAgICAgMHgwODEzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9OT1JXRUdJQU5fTk9SV0FZX0JPS01BTCAgICAgICAgICAgMHgwNDE0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9OT1JXRUdJQU5fTk9SV0FZX05ZTk9SU0sgICAgICAgICAgMHgwODE0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QT0xJU0hfUE9MQU5EICAgICAgICAgICAgICAgICAgICAgMHgwNDE1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QT1JUVUdVRVNFX0JSQVpJTCAgICAgICAgICAgICAgICAgMHgwNDE2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QT1JUVUdVRVNFX1BPUlRVR0FMICAgICAgICAgICAgICAgMHgwODE2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ST01BTlNIX1NXSVRaRVJMQU5EICAgICAgICAgICAgICAgMHgwNDE3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ST01BTklBTl9ST01BTklBICAgICAgICAgICAgICAgICAgMHgwNDE4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9SVVNTSUFOX1JVU1NJQSAgICAgICAgICAgICAgICAgICAgMHgwNDE5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DUk9BVElBTl9DUk9BVElBICAgICAgICAgICAgICAgICAgMHgwNDFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVJCSUFOX1NFUkJJQV9MQVRJTiAgICAgICAgICAgICAgMHgwODFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVJCSUFOX1NFUkJJQV9DWVJJTExJQyAgICAgICAgICAgMHgwQzFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DUk9BVElBTl9CT1NOSUFfSEVSWkVHT1ZJTkEgICAgICAgMHgxMDFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CT1NOSUFOX0JPU05JQV9IRVJaRUdPVklOQSAgICAgICAgMHgxNDFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVJCSUFOX0JPU05JQV9IRVJaX0xBVElOICAgICAgICAgMHgxODFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVJCSUFOX0JPU05JQV9IRVJaX0NZUklMTElDICAgICAgMHgxQzFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CT1NOSUFOX0JPU05JQV9IRVJaX0NZUklMTElDICAgICAgMHgyMDFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WQUtfU0xPVkFLSUEgICAgICAgICAgICAgICAgICAgMHgwNDFCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BTEJBTklBTl9BTEJBTklBICAgICAgICAgICAgICAgICAgMHgwNDFDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX1NXRURFTiAgICAgICAgICAgICAgICAgICAgMHgwNDFECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX0ZJTkxBTkQgICAgICAgICAgICAgICAgICAgMHgwODFECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USEFJX1RIQUlMQU5EICAgICAgICAgICAgICAgICAgICAgMHgwNDFFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UVVJLSVNIX1RVUktFWSAgICAgICAgICAgICAgICAgICAgMHgwNDFGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgICAgMHgwNDIwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JTkRPTkVTSUFOX0lORE9ORVNJQSAgICAgICAgICAgICAgMHgwNDIxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VS1JBSU5JQU5fVUtSQUlORSAgICAgICAgICAgICAgICAgMHgwNDIyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CRUxBUlVTSUFOX0JFTEFSVVMgICAgICAgICAgICAgICAgMHgwNDIzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WRU5JQU5fU0xPVkVOSUEgICAgICAgICAgICAgICAgMHgwNDI0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FU1RPTklBTl9FU1RPTklBICAgICAgICAgICAgICAgICAgMHgwNDI1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9MQVRWSUFOX0xBVFZJQSAgICAgICAgICAgICAgICAgICAgMHgwNDI2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9MSVRIVUFOSUFOX0xJVEhVQU5JQSAgICAgICAgICAgICAgMHgwNDI3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQUpJS19UQUpJS0lTVEFOICAgICAgICAgICAgICAgICAgMHgwNDI4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9WSUVUTkFNRVNFX1ZJRVRfTkFNICAgICAgICAgICAgICAgMHgwNDJBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUk1FTklBTl9BUk1FTklBICAgICAgICAgICAgICAgICAgMHgwNDJCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0xBVElOICAgICAgICAgICAgMHgwNDJDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0NZUklMTElDICAgICAgICAgMHgwODJDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CQVNRVUVfQkFTUVVFICAgICAgICAgICAgICAgICAgICAgMHgwNDJECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VUFBFUl9TT1JCSUFOX0dFUk1BTlkgICAgICAgICAgICAgMHgwNDJFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9MT1dFUl9TT1JCSUFOX0dFUk1BTlkgICAgICAgICAgICAgMHgwODJFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUNFRE9OSUFOX01BQ0VET05JQSAgICAgICAgICAgICAgMHgwNDJGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVRTV0FOQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgMHgwNDMyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JU0lYSE9TQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgMHgwNDM0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9JU0laVUxVX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgMHgwNDM1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9BRlJJS0FBTlNfU09VVEhfQUZSSUNBICAgICAgICAgICAgMHgwNDM2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRU9SR0lBTl9HRU9SR0lBICAgICAgICAgICAgICAgICAgMHgwNDM3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9GQUVST0VTRV9GQUVST0VfSVNMQU5EUyAgICAgICAgICAgMHgwNDM4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ISU5ESV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDM5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxURVNFX01BTFRBICAgICAgICAgICAgICAgICAgICAgMHgwNDNBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX05PUlRIRVJOX05PUldBWSAgICAgICAgICAgICAgMHgwNDNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX05PUlRIRVJOX1NXRURFTiAgICAgICAgICAgICAgMHgwODNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX05PUlRIRVJOX0ZJTkxBTkQgICAgICAgICAgICAgMHgwQzNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX0xVTEVfTk9SV0FZICAgICAgICAgICAgICAgICAgMHgxMDNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX0xVTEVfU1dFREVOICAgICAgICAgICAgICAgICAgMHgxNDNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX1NPVVRIRVJOX05PUldBWSAgICAgICAgICAgICAgMHgxODNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX1NPVVRIRVJOX1NXRURFTiAgICAgICAgICAgICAgMHgxQzNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX1NLT0xUX0ZJTkxBTkQgICAgICAgICAgICAgICAgMHgyMDNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU1JX0lOQVJJX0ZJTkxBTkQgICAgICAgICAgICAgICAgMHgyNDNCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JUklTSF9JUkVMQU5EICAgICAgICAgICAgICAgICAgICAgMHgwODNDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxBWV9NQUxBWVNJQSAgICAgICAgICAgICAgICAgICAgMHgwNDNFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxBWV9CUlVORUlfREFSVVNTQUxBTSAgICAgICAgICAgMHgwODNFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVpBS0hfS0FaQUtIU1RBTiAgICAgICAgICAgICAgICAgMHgwNDNGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LWVJHWVpfS1lSR1laU1RBTiAvKiBDeXJpbGxpYyovICAgMHgwNDQwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LSVNXQUhJTElfS0VOWUEgICAgICAgICAgICAgICAgICAgMHgwNDQxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UVVJLTUVOX1RVUktNRU5JU1RBTiAgICAgICAgICAgICAgMHgwNDQyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VWkJFS19VWkJFS0lTVEFOX0xBVElOICAgICAgICAgICAgMHgwNDQzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VWkJFS19VWkJFS0lTVEFOX0NZUklMTElDICAgICAgICAgMHgwODQzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQVRBUl9SVVNTSUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDQ0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9CRU5HQUxJX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDQ1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9CRU5HQUxJX0JBTkdMQURFU0ggICAgICAgICAgICAgICAgMHgwODQ1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QVU5KQUJJX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDQ2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HVUpBUkFUSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgMHgwNDQ3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9PRElBX0lORElBICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDQ4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1JTF9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDQ5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9URUxVR1VfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDRBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQU5OQURBX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDRCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxBWUFMQU1fSU5ESUEgICAgICAgICAgICAgICAgICAgMHgwNDRDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BU1NBTUVTRV9JTkRJQSAgICAgICAgICAgICAgICAgICAgMHgwNDRECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQVJBVEhJX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDRFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU5TS1JJVF9JTkRJQSAgICAgICAgICAgICAgICAgICAgMHgwNDRGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUEgLyogQ3lyaWxsaWMgKi8gMHgwNDUwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NT05HT0xJQU5fUFJDICAgICAgICAgICAgICAgICAgICAgMHgwODUwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUJFVEFOX1BSQyAgICAgICAgICAgICAgICAgICAgICAgMHgwNDUxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9XRUxTSF9VTklURURfS0lOR0RPTSAgICAgICAgICAgICAgMHgwNDUyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LSE1FUl9DQU1CT0RJQSAgICAgICAgICAgICAgICAgICAgMHgwNDUzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9MQU9fTEFPUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDU0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HQUxJQ0lBTl9HQUxJQ0lBTiAgICAgICAgICAgICAgICAgMHgwNDU2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9LT05LQU5JX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDU3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9TWVJJQUNfU1lSSUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDVBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TSU5IQUxBX1NSSV9MQU5LQSAgICAgICAgICAgICAgICAgMHgwNDVCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JTlVLVElUVVRfQ0FOQURBICAgICAgICAgICAgICAgICAgMHgwNDVECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JTlVLVElUVVRfQ0FOQURBX0xBVElOICAgICAgICAgICAgMHgwODVECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BTUhBUklDX0VUSElPUElBICAgICAgICAgICAgICAgICAgMHgwNDVFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfQUxHRVJJQSAgICAgICAgICAgICAgICAgMHgwODVGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ORVBBTElfTkVQQUwgICAgICAgICAgICAgICAgICAgICAgMHgwNDYxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUklTSUFOX05FVEhFUkxBTkRTICAgICAgICAgICAgICAgMHgwNDYyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9QQVNIVE9fQUZHSEFOSVNUQU4gICAgICAgICAgICAgICAgMHgwNDYzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GSUxJUElOT19QSElMSVBQSU5FUyAgICAgICAgICAgICAgMHgwNDY0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ESElWRUhJX01BTERJVkVTICAgICAgICAgICAgICAgICAgMHgwNDY1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9IQVVTQV9OSUdFUklBICAgICAgICAgICAgICAgICAgICAgMHgwNDY4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ZT1JVQkFfTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDZBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX0JPTElWSUEgICAgICAgICAgICAgICAgICAgMHgwNDZCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX0VDVUFET1IgICAgICAgICAgICAgICAgICAgMHgwODZCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX1BFUlUgICAgICAgICAgICAgICAgICAgICAgMHgwQzZCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVNPVEhPX1NBX0xFQk9BX1NPVVRIX0FGUklDQSAgICAgMHgwNDZDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CQVNIS0lSX1JVU1NJQSAgICAgICAgICAgICAgICAgICAgMHgwNDZECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9MVVhFTUJPVVJHSVNIX0xVWEVNQk9VUkcgICAgICAgICAgMHgwNDZFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9HUkVFTkxBTkRJQ19HUkVFTkxBTkQgICAgICAgICAgICAgMHgwNDZGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JR0JPX05JR0VSSUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDcwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ZSV9QUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDc4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQVBVRFVOR1VOX0NISUxFICAgICAgICAgICAgICAgICAgMHgwNDdBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NT0hBV0tfTU9IQVdLICAgICAgICAgICAgICAgICAgICAgMHgwNDdDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CUkVUT05fRlJBTkNFICAgICAgICAgICAgICAgICAgICAgMHgwNDdFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VSUdIVVJfUFJDICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDgwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQU9SSV9ORVdfWkVBTEFORCAgICAgICAgICAgICAgICAgMHgwNDgxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9PQ0NJVEFOX0ZSQU5DRSAgICAgICAgICAgICAgICAgICAgMHgwNDgyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DT1JTSUNBTl9GUkFOQ0UgICAgICAgICAgICAgICAgICAgMHgwNDgzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BTFNBVElBTl9GUkFOQ0UgICAgICAgICAgICAgICAgICAgMHgwNDg0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ZQUtVVF9SVVNTSUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDg1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9LSUNIRV9HVUFURU1BTEEgICAgICAgICAgICAgICAgICAgMHgwNDg2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9LSU5ZQVJXQU5EQV9SV0FOREEgICAgICAgICAgICAgICAgMHgwNDg3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9XT0xPRl9TRU5FR0FMICAgICAgICAgICAgICAgICAgICAgMHgwNDg4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9EQVJJX0FGR0hBTklTVEFOICAgICAgICAgICAgICAgICAgMHgwNDhDCi0KLSAgLyogKi8KLQotCi0gIC8qIGxlZ2FjeSBtYWNybyBkZWZpbml0aW9ucyBub3QgcHJlc2VudCBpbiBPcGVuVHlwZSAxLjguMSAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0dFTkVSQUwgICAgICAgICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBUVF9NU19MQU5HSURfQ0FUQUxBTl9TUEFJTiBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0NBVEFMQU5fQ0FUQUxBTgotI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9HRU5FUkFMICAgICAgICAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9NQUNBVSBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQU8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9MSUVDSFRFTlNURUkgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9HRVJNQU5fTElFQ0hURU5TVEVJTgotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9HRU5FUkFMICAgICAgICAgICAgICAgICAgIDB4MDAwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9JTkRPTkVTSUEgICAgICAgICAgICAgICAgIDB4MzgwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9IT05HX0tPTkcgICAgICAgICAgICAgICAgIDB4M0MwOQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9TUEFJTl9JTlRFUk5BVElPTkFMX1NPUlQgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9TUEFOSVNIX1NQQUlOX01PREVSTl9TT1JUCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0xBVElOX0FNRVJJQ0EgICAgICAgICAgICAgMHhFNDBBVQotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1dFU1RfSU5ESUVTICAgICAgICAgICAgICAgIDB4MUMwQwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1JFVU5JT04gICAgICAgICAgICAgICAgICAgIDB4MjAwQwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0NPTkdPICAgICAgICAgICAgICAgICAgICAgIDB4MjQwQwotICAvKiB3aGljaCB3YXMgZm9ybWVybHk6ICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfWkFJUkUgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ09OR08KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9TRU5FR0FMICAgICAgICAgICAgICAgICAgICAweDI4MEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DQU1FUk9PTiAgICAgICAgICAgICAgICAgICAweDJDMEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DT1RFX0RfSVZPSVJFICAgICAgICAgICAgICAweDMwMEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9NQUxJICAgICAgICAgICAgICAgICAgICAgICAweDM0MEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9NT1JPQ0NPICAgICAgICAgICAgICAgICAgICAweDM4MEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9IQUlUSSAgICAgICAgICAgICAgICAgICAgICAweDNDMEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9OT1JUSF9BRlJJQ0EgICAgICAgICAgICAgICAweEU0MENVCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LT1JFQU5fRVhURU5ERURfV0FOU1VOR19LT1JFQSBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0tPUkVBTl9LT1JFQQotI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0pPSEFCX0tPUkVBICAgICAgICAgICAgICAgIDB4MDgxMgotI2RlZmluZSBUVF9NU19MQU5HSURfUkhBRVRPX1JPTUFOSUNfU1dJVFpFUkxBTkQgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9ST01BTlNIX1NXSVRaRVJMQU5ECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NT0xEQVZJQU5fTU9MREFWSUEgICAgICAgICAgICAgICAgMHgwODE4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9SVVNTSUFOX01PTERBVklBICAgICAgICAgICAgICAgICAgMHgwODE5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX0lORElBICAgICAgICAgICAgICAgICAgICAgICAgMHgwODIwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DTEFTU0lDX0xJVEhVQU5JQU5fTElUSFVBTklBICAgICAgMHgwODI3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WRU5FX1NMT1ZFTklBIFwKLSAgICAgICAgICBUVF9NU19MQU5HSURfU0xPVkVOSUFOX1NMT1ZFTklBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GQVJTSV9JUkFOICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9CQVNRVUVfU1BBSU4gXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9CQVNRVUVfQkFTUVVFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TT1JCSUFOX0dFUk1BTlkgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9VUFBFUl9TT1JCSUFOX0dFUk1BTlkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NVVFVfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgICAweDA0MzAKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RTT05HQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAweDA0MzEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RTV0FOQV9TT1VUSF9BRlJJQ0EgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9TRVRTV0FOQV9TT1VUSF9BRlJJQ0EKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1ZFTkRBX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAweDA0MzMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1hIT1NBX1NPVVRIX0FGUklDQSBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0lTSVhIT1NBX1NPVVRIX0FGUklDQQotI2RlZmluZSBUVF9NU19MQU5HSURfWlVMVV9TT1VUSF9BRlJJQ0EgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9JU0laVUxVX1NPVVRIX0FGUklDQQotI2RlZmluZSBUVF9NU19MQU5HSURfU0FBTUlfTEFQT05JQSAgICAgICAgICAgICAgICAgICAgIDB4MDQzQgotICAvKiB0aGUgbmV4dCB0d28gdmFsdWVzIGFyZSBpbmNvcnJlY3RseSBpbnZlcnRlZCAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfSVJJU0hfR0FFTElDX0lSRUxBTkQgICAgICAgICAgICAgIDB4MDQzQwotI2RlZmluZSBUVF9NU19MQU5HSURfU0NPVFRJU0hfR0FFTElDX1VOSVRFRF9LSU5HRE9NICAgIDB4MDgzQwotI2RlZmluZSBUVF9NU19MQU5HSURfWUlERElTSF9HRVJNQU5ZICAgICAgICAgICAgICAgICAgIDB4MDQzRAotI2RlZmluZSBUVF9NU19MQU5HSURfS0FaQUtfS0FaQUtTVEFOIFwKLSAgICAgICAgICBUVF9NU19MQU5HSURfS0FaQUtIX0tBWkFLSFNUQU4KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tJUkdISVpfS0lSR0hJWl9SRVBVQkxJQyBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0tZUkdZWl9LWVJHWVpTVEFOCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LSVJHSElaX0tJUkdISVpTVEFOIFwKLSAgICAgICAgICBUVF9NU19MQU5HSURfS1lSR1laX0tZUkdZWlNUQU4KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NXQUhJTElfS0VOWUEgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9LSVNXQUhJTElfS0VOWUEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RBVEFSX1RBVEFSU1RBTiBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX1RBVEFSX1JVU1NJQQotI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9BUkFCSUNfUEFLSVNUQU4gICAgICAgICAgIDB4MDg0NgotI2RlZmluZSBUVF9NU19MQU5HSURfT1JJWUFfSU5ESUEgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9PRElBX0lORElBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUFfTU9OR09MSUFOIFwKLSAgICAgICAgICBUVF9NU19MQU5HSURfTU9OR09MSUFOX1BSQwotI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9DSElOQSBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX1RJQkVUQU5fUFJDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9EWk9OR0hLQV9CSFVUQU4gICAgICAgICAgICAgICAgICAgMHgwODUxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUJFVEFOX0JIVVRBTiBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0RaT05HSEtBX0JIVVRBTgotI2RlZmluZSBUVF9NU19MQU5HSURfV0VMU0hfV0FMRVMgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9XRUxTSF9VTklURURfS0lOR0RPTQotI2RlZmluZSBUVF9NU19MQU5HSURfQlVSTUVTRV9NWUFOTUFSICAgICAgICAgICAgICAgICAgIDB4MDQ1NQotI2RlZmluZSBUVF9NU19MQU5HSURfR0FMSUNJQU5fU1BBSU4gXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9HQUxJQ0lBTl9HQUxJQ0lBTgotI2RlZmluZSBUVF9NU19MQU5HSURfTUFOSVBVUklfSU5ESUEgIC8qIEJlbmdhbGkgKi8gICAgIDB4MDQ1OAotI2RlZmluZSBUVF9NU19MQU5HSURfU0lOREhJX0lORElBIC8qIEFyYWJpYyAqLyAgICAgICAgIDB4MDQ1OQotI2RlZmluZSBUVF9NU19MQU5HSURfU0lOREhJX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgIDB4MDg1OQotI2RlZmluZSBUVF9NU19MQU5HSURfU0lOSEFMRVNFX1NSSV9MQU5LQSBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX1NJTkhBTEFfU1JJX0xBTktBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSEVST0tFRV9VTklURURfU1RBVEVTICAgICAgICAgICAgMHgwNDVDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDTyAvKiBBcmFiaWMgKi8gICAgMHgwNDVGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDT19MQVRJTiBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX1RBTUFaSUdIVF9BTEdFUklBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9QQUtJU1RBTiAvKiBBcmFiaWMgKi8gICAgMHgwNDYwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9TQVNJQSAgICAgICAgICAgICAgICAgICAgMHgwODYwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9JTkRJQSBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0tBU0hNSVJJX1NBU0lBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ORVBBTElfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgMHgwODYxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ESVZFSElfTUFMRElWRVMgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9ESElWRUhJX01BTERJVkVTCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9FRE9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDY2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9GVUxGVUxERV9OSUdFUklBICAgICAgICAgICAgICAgICAgMHgwNDY3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9JQklCSU9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDY5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVBFRElfU09VVEhfQUZSSUNBIFwKLSAgICAgICAgICBUVF9NU19MQU5HSURfU0VTT1RIT19TQV9MRUJPQV9TT1VUSF9BRlJJQ0EKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NPVEhPX1NPVVRIRVJOX1NPVVRIX0FGUklDQSBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX1NFU09USE9fU0FfTEVCT0FfU09VVEhfQUZSSUNBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQU5VUklfTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDcxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9PUk9NT19FVEhJT1BJQSAgICAgICAgICAgICAgICAgICAgMHgwNDcyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUdSSUdOQV9FVEhJT1BJQSAgICAgICAgICAgICAgICAgMHgwNDczCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUdSSUdOQV9FUllUSFJFQSAgICAgICAgICAgICAgICAgMHgwODczCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUdSSUdOQV9FUllUUkVBIFwKLSAgICAgICAgICBUVF9NU19MQU5HSURfVElHUklHTkFfRVJZVEhSRUEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dVQVJBTklfUEFSQUdVQVkgICAgICAgICAgICAgICAgICAweDA0NzQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0hBV0FJSUFOX1VOSVRFRF9TVEFURVMgICAgICAgICAgICAweDA0NzUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0xBVElOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NzYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NPTUFMSV9TT01BTElBICAgICAgICAgICAgICAgICAgICAweDA0NzcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1lJX0NISU5BIFwKLSAgICAgICAgICBUVF9NU19MQU5HSURfWUlfUFJDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9QQVBJQU1FTlRVX05FVEhFUkxBTkRTX0FOVElMTEVTICAgMHgwNDc5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9VSUdIVVJfQ0hJTkEgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9VSUdIVVJfUFJDCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfTkFNRV9JRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgYG5hbWUnIGlkZW50aWZpZXIgZmllbGQgaW4gdGhlIG5hbWUgcmVjb3JkcyBvZgotICAgKiAgIGFuIFNGTlQgYG5hbWUnIHRhYmxlLiAgVGhlc2UgdmFsdWVzIGFyZSBwbGF0Zm9ybSBpbmRlcGVuZGVudC4KLSAgICovCi0KLSNkZWZpbmUgVFRfTkFNRV9JRF9DT1BZUklHSFQgICAgICAgICAgICAgIDAKLSNkZWZpbmUgVFRfTkFNRV9JRF9GT05UX0ZBTUlMWSAgICAgICAgICAgIDEKLSNkZWZpbmUgVFRfTkFNRV9JRF9GT05UX1NVQkZBTUlMWSAgICAgICAgIDIKLSNkZWZpbmUgVFRfTkFNRV9JRF9VTklRVUVfSUQgICAgICAgICAgICAgIDMKLSNkZWZpbmUgVFRfTkFNRV9JRF9GVUxMX05BTUUgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVFRfTkFNRV9JRF9WRVJTSU9OX1NUUklORyAgICAgICAgIDUKLSNkZWZpbmUgVFRfTkFNRV9JRF9QU19OQU1FICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgVFRfTkFNRV9JRF9UUkFERU1BUksgICAgICAgICAgICAgIDcKLQotICAvKiB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgZnJvbSB0aGUgT3BlblR5cGUgc3BlYyAqLwotI2RlZmluZSBUVF9OQU1FX0lEX01BTlVGQUNUVVJFUiAgICAgICAgICAgOAotI2RlZmluZSBUVF9OQU1FX0lEX0RFU0lHTkVSICAgICAgICAgICAgICAgOQotI2RlZmluZSBUVF9OQU1FX0lEX0RFU0NSSVBUSU9OICAgICAgICAgICAgMTAKLSNkZWZpbmUgVFRfTkFNRV9JRF9WRU5ET1JfVVJMICAgICAgICAgICAgIDExCi0jZGVmaW5lIFRUX05BTUVfSURfREVTSUdORVJfVVJMICAgICAgICAgICAxMgotI2RlZmluZSBUVF9OQU1FX0lEX0xJQ0VOU0UgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgVFRfTkFNRV9JRF9MSUNFTlNFX1VSTCAgICAgICAgICAgIDE0Ci0gIC8qIG51bWJlciAxNSBpcyByZXNlcnZlZCAqLwotI2RlZmluZSBUVF9OQU1FX0lEX1RZUE9HUkFQSElDX0ZBTUlMWSAgICAgMTYKLSNkZWZpbmUgVFRfTkFNRV9JRF9UWVBPR1JBUEhJQ19TVUJGQU1JTFkgIDE3Ci0jZGVmaW5lIFRUX05BTUVfSURfTUFDX0ZVTExfTkFNRSAgICAgICAgICAxOAotCi0gIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBuZXcgYXMgb2YgMjAwMC0wMS0yMSAqLwotI2RlZmluZSBUVF9OQU1FX0lEX1NBTVBMRV9URVhUICAgICAgICAgICAgMTkKLQotICAvKiBUaGlzIGlzIG5ldyBpbiBPcGVuVHlwZSAxLjMgKi8KLSNkZWZpbmUgVFRfTkFNRV9JRF9DSURfRklOREZPTlRfTkFNRSAgICAgIDIwCi0KLSAgLyogVGhpcyBpcyBuZXcgaW4gT3BlblR5cGUgMS41ICovCi0jZGVmaW5lIFRUX05BTUVfSURfV1dTX0ZBTUlMWSAgICAgICAgICAgICAyMQotI2RlZmluZSBUVF9OQU1FX0lEX1dXU19TVUJGQU1JTFkgICAgICAgICAgMjIKLQotICAvKiBUaGlzIGlzIG5ldyBpbiBPcGVuVHlwZSAxLjcgKi8KLSNkZWZpbmUgVFRfTkFNRV9JRF9MSUdIVF9CQUNLR1JPVU5EICAgICAgIDIzCi0jZGVmaW5lIFRUX05BTUVfSURfREFSS19CQUNLR1JPVU5EICAgICAgICAyNAotCi0gIC8qIFRoaXMgaXMgbmV3IGluIE9wZW5UeXBlIDEuOCAqLwotI2RlZmluZSBUVF9OQU1FX0lEX1ZBUklBVElPTlNfUFJFRklYICAgICAgMjUKLQotICAvKiB0aGVzZSB0d28gdmFsdWVzIGFyZSBkZXByZWNhdGVkICovCi0jZGVmaW5lIFRUX05BTUVfSURfUFJFRkVSUkVEX0ZBTUlMWSAgICAgVFRfTkFNRV9JRF9UWVBPR1JBUEhJQ19GQU1JTFkKLSNkZWZpbmUgVFRfTkFNRV9JRF9QUkVGRVJSRURfU1VCRkFNSUxZICBUVF9OQU1FX0lEX1RZUE9HUkFQSElDX1NVQkZBTUlMWQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX1VDUl9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFBvc3NpYmxlIGJpdCBtYXNrIHZhbHVlcyBmb3IgdGhlIGB1bFVuaWNvZGVSYW5nZVgnIGZpZWxkcyBpbiBhbiBTRk5UCi0gICAqICAgYE9TLzInIHRhYmxlLgotICAgKi8KLQotICAvKiB1bFVuaWNvZGVSYW5nZTEgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgLyogQml0ICAwICAgQmFzaWMgTGF0aW4gKi8KLSNkZWZpbmUgVFRfVUNSX0JBU0lDX0xBVElOICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICAwKSAvKiBVKzAwMjAtVSswMDdFICovCi0gIC8qIEJpdCAgMSAgIEMxIENvbnRyb2xzIGFuZCBMYXRpbi0xIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0xBVElOMV9TVVBQTEVNRU5UICAgICAgICAgICAgICAgKDFMIDw8ICAxKSAvKiBVKzAwODAtVSswMEZGICovCi0gIC8qIEJpdCAgMiAgIExhdGluIEV4dGVuZGVkLUEgKi8KLSNkZWZpbmUgVFRfVUNSX0xBVElOX0VYVEVOREVEX0EgICAgICAgICAgICAgICAgKDFMIDw8ICAyKSAvKiBVKzAxMDAtVSswMTdGICovCi0gIC8qIEJpdCAgMyAgIExhdGluIEV4dGVuZGVkLUIgKi8KLSNkZWZpbmUgVFRfVUNSX0xBVElOX0VYVEVOREVEX0IgICAgICAgICAgICAgICAgKDFMIDw8ICAzKSAvKiBVKzAxODAtVSswMjRGICovCi0gIC8qIEJpdCAgNCAgIElQQSBFeHRlbnNpb25zICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBQaG9uZXRpYyBFeHRlbnNpb25zICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgUGhvbmV0aWMgRXh0ZW5zaW9ucyBTdXBwbGVtZW50ICovCi0jZGVmaW5lIFRUX1VDUl9JUEFfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICgxTCA8PCAgNCkgLyogVSswMjUwLVUrMDJBRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMUQwMC1VKzFEN0YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzFEODAtVSsxREJGICovCi0gIC8qIEJpdCAgNSAgIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAqLwotICAvKiAgICAgICAgICBNb2RpZmllciBUb25lIExldHRlcnMgICAgKi8KLSNkZWZpbmUgVFRfVUNSX1NQQUNJTkdfTU9ESUZJRVIgICAgICAgICAgICAgICAgKDFMIDw8ICA1KSAvKiBVKzAyQjAtVSswMkZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStBNzAwLVUrQTcxRiAqLwotICAvKiBCaXQgIDYgICBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgU3VwcGxlbWVudCAqLwotI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTICAgICAoMUwgPDwgIDYpIC8qIFUrMDMwMC1VKzAzNkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzFEQzAtVSsxREZGICovCi0gIC8qIEJpdCAgNyAgIEdyZWVrIGFuZCBDb3B0aWMgKi8KLSNkZWZpbmUgVFRfVUNSX0dSRUVLICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA3KSAvKiBVKzAzNzAtVSswM0ZGICovCi0gIC8qIEJpdCAgOCAgIENvcHRpYyAqLwotI2RlZmluZSBUVF9VQ1JfQ09QVElDICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDgpIC8qIFUrMkM4MC1VKzJDRkYgKi8KLSAgLyogQml0ICA5ICAgQ3lyaWxsaWMgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBDeXJpbGxpYyBTdXBwbGVtZW50ICovCi0gIC8qICAgICAgICAgIEN5cmlsbGljIEV4dGVuZGVkLUEgKi8KLSAgLyogICAgICAgICAgQ3lyaWxsaWMgRXh0ZW5kZWQtQiAqLwotI2RlZmluZSBUVF9VQ1JfQ1lSSUxMSUMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDkpIC8qIFUrMDQwMC1VKzA0RkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzA1MDAtVSswNTJGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyREUwLVUrMkRGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrQTY0MC1VK0E2OUYgKi8KLSAgLyogQml0IDEwICAgQXJtZW5pYW4gKi8KLSNkZWZpbmUgVFRfVUNSX0FSTUVOSUFOICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEwKSAvKiBVKzA1MzAtVSswNThGICovCi0gIC8qIEJpdCAxMSAgIEhlYnJldyAqLwotI2RlZmluZSBUVF9VQ1JfSEVCUkVXICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qIFUrMDU5MC1VKzA1RkYgKi8KLSAgLyogQml0IDEyICAgVmFpICovCi0jZGVmaW5lIFRUX1VDUl9WQUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMikgLyogVStBNTAwLVUrQTYzRiAqLwotICAvKiBCaXQgMTMgICBBcmFiaWMgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBBcmFiaWMgU3VwcGxlbWVudCAqLwotI2RlZmluZSBUVF9VQ1JfQVJBQklDICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTMpIC8qIFUrMDYwMC1VKzA2RkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzA3NTAtVSswNzdGICovCi0gIC8qIEJpdCAxNCAgIE5LbyAqLwotI2RlZmluZSBUVF9VQ1JfTktPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTQpIC8qIFUrMDdDMC1VKzA3RkYgKi8KLSAgLyogQml0IDE1ICAgRGV2YW5hZ2FyaSAqLwotI2RlZmluZSBUVF9VQ1JfREVWQU5BR0FSSSAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTUpIC8qIFUrMDkwMC1VKzA5N0YgKi8KLSAgLyogQml0IDE2ICAgQmVuZ2FsaSAqLwotI2RlZmluZSBUVF9VQ1JfQkVOR0FMSSAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTYpIC8qIFUrMDk4MC1VKzA5RkYgKi8KLSAgLyogQml0IDE3ICAgR3VybXVraGkgKi8KLSNkZWZpbmUgVFRfVUNSX0dVUk1VS0hJICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzBBMDAtVSswQTdGICovCi0gIC8qIEJpdCAxOCAgIEd1amFyYXRpICovCi0jZGVmaW5lIFRUX1VDUl9HVUpBUkFUSSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOCkgLyogVSswQTgwLVUrMEFGRiAqLwotICAvKiBCaXQgMTkgICBPcml5YSAqLwotI2RlZmluZSBUVF9VQ1JfT1JJWUEgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTkpIC8qIFUrMEIwMC1VKzBCN0YgKi8KLSAgLyogQml0IDIwICAgVGFtaWwgKi8KLSNkZWZpbmUgVFRfVUNSX1RBTUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIwKSAvKiBVKzBCODAtVSswQkZGICovCi0gIC8qIEJpdCAyMSAgIFRlbHVndSAqLwotI2RlZmluZSBUVF9VQ1JfVEVMVUdVICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC8qIFUrMEMwMC1VKzBDN0YgKi8KLSAgLyogQml0IDIyICAgS2FubmFkYSAqLwotI2RlZmluZSBUVF9VQ1JfS0FOTkFEQSAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjIpIC8qIFUrMEM4MC1VKzBDRkYgKi8KLSAgLyogQml0IDIzICAgTWFsYXlhbGFtICovCi0jZGVmaW5lIFRUX1VDUl9NQUxBWUFMQU0gICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMykgLyogVSswRDAwLVUrMEQ3RiAqLwotICAvKiBCaXQgMjQgICBUaGFpICovCi0jZGVmaW5lIFRUX1VDUl9USEFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNCkgLyogVSswRTAwLVUrMEU3RiAqLwotICAvKiBCaXQgMjUgICBMYW8gKi8KLSNkZWZpbmUgVFRfVUNSX0xBTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI1KSAvKiBVKzBFODAtVSswRUZGICovCi0gIC8qIEJpdCAyNiAgIEdlb3JnaWFuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgR2VvcmdpYW4gU3VwcGxlbWVudCAqLwotI2RlZmluZSBUVF9VQ1JfR0VPUkdJQU4gICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjYpIC8qIFUrMTBBMC1VKzEwRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzJEMDAtVSsyRDJGICovCi0gIC8qIEJpdCAyNyAgIEJhbGluZXNlICovCi0jZGVmaW5lIFRUX1VDUl9CQUxJTkVTRSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNykgLyogVSsxQjAwLVUrMUI3RiAqLwotICAvKiBCaXQgMjggICBIYW5ndWwgSmFtbyAqLwotI2RlZmluZSBUVF9VQ1JfSEFOR1VMX0pBTU8gICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjgpIC8qIFUrMTEwMC1VKzExRkYgKi8KLSAgLyogQml0IDI5ICAgTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCAqLwotICAvKiAgICAgICAgICBMYXRpbiBFeHRlbmRlZC1DICAgICAgICAgICovCi0gIC8qICAgICAgICAgIExhdGluIEV4dGVuZGVkLUQgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfVUNSX0xBVElOX0VYVEVOREVEX0FERElUSU9OQUwgICAgICAgKDFMIDw8IDI5KSAvKiBVKzFFMDAtVSsxRUZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyQzYwLVUrMkM3RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrQTcyMC1VK0E3RkYgKi8KLSAgLyogQml0IDMwICAgR3JlZWsgRXh0ZW5kZWQgKi8KLSNkZWZpbmUgVFRfVUNSX0dSRUVLX0VYVEVOREVEICAgICAgICAgICAgICAgICAgKDFMIDw8IDMwKSAvKiBVKzFGMDAtVSsxRkZGICovCi0gIC8qIEJpdCAzMSAgIEdlbmVyYWwgUHVuY3R1YXRpb24gICAgICAqLwotICAvKiAgICAgICAgICBTdXBwbGVtZW50YWwgUHVuY3R1YXRpb24gKi8KLSNkZWZpbmUgVFRfVUNSX0dFTkVSQUxfUFVOQ1RVQVRJT04gICAgICAgICAgICAgKDFMIDw8IDMxKSAvKiBVKzIwMDAtVSsyMDZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRTAwLVUrMkU3RiAqLwotCi0gIC8qIHVsVW5pY29kZVJhbmdlMiAqLwotICAvKiAtLS0tLS0tLS0tLS0tLS0gKi8KLQotICAvKiBCaXQgMzIgICBTdXBlcnNjcmlwdHMgQW5kIFN1YnNjcmlwdHMgKi8KLSNkZWZpbmUgVFRfVUNSX1NVUEVSU0NSSVBUU19TVUJTQ1JJUFRTICAgICAgICAgKDFMIDw8ICAwKSAvKiBVKzIwNzAtVSsyMDlGICovCi0gIC8qIEJpdCAzMyAgIEN1cnJlbmN5IFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX0NVUlJFTkNZX1NZTUJPTFMgICAgICAgICAgICAgICAgKDFMIDw8ICAxKSAvKiBVKzIwQTAtVSsyMENGICovCi0gIC8qIEJpdCAzNCAgIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBGb3IgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTX1NZTUIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDIpIC8qIFUrMjBEMC1VKzIwRkYgKi8KLSAgLyogQml0IDM1ICAgTGV0dGVybGlrZSBTeW1ib2xzICovCi0jZGVmaW5lIFRUX1VDUl9MRVRURVJMSUtFX1NZTUJPTFMgICAgICAgICAgICAgICgxTCA8PCAgMykgLyogVSsyMTAwLVUrMjE0RiAqLwotICAvKiBCaXQgMzYgICBOdW1iZXIgRm9ybXMgKi8KLSNkZWZpbmUgVFRfVUNSX05VTUJFUl9GT1JNUyAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA0KSAvKiBVKzIxNTAtVSsyMThGICovCi0gIC8qIEJpdCAzNyAgIEFycm93cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIFN1cHBsZW1lbnRhbCBBcnJvd3MtQSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIFN1cHBsZW1lbnRhbCBBcnJvd3MtQiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIE1pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzICovCi0jZGVmaW5lIFRUX1VDUl9BUlJPV1MgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNSkgLyogVSsyMTkwLVUrMjFGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMjdGMC1VKzI3RkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI5MDAtVSsyOTdGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyQjAwLVUrMkJGRiAqLwotICAvKiBCaXQgMzggICBNYXRoZW1hdGljYWwgT3BlcmF0b3JzICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgU3VwcGxlbWVudGFsIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgICovCi0gIC8qICAgICAgICAgIE1pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQSAqLwotICAvKiAgICAgICAgICBNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUIgKi8KLSNkZWZpbmUgVFRfVUNSX01BVEhFTUFUSUNBTF9PUEVSQVRPUlMgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzIyMDAtVSsyMkZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyQTAwLVUrMkFGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMjdDMC1VKzI3RUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI5ODAtVSsyOUZGICovCi0gIC8qIEJpdCAzOSBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAqLwotI2RlZmluZSBUVF9VQ1JfTUlTQ0VMTEFORU9VU19URUNITklDQUwgICAgICAgICAoMUwgPDwgIDcpIC8qIFUrMjMwMC1VKzIzRkYgKi8KLSAgLyogQml0IDQwICAgQ29udHJvbCBQaWN0dXJlcyAqLwotI2RlZmluZSBUVF9VQ1JfQ09OVFJPTF9QSUNUVVJFUyAgICAgICAgICAgICAgICAoMUwgPDwgIDgpIC8qIFUrMjQwMC1VKzI0M0YgKi8KLSAgLyogQml0IDQxICAgT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24gKi8KLSNkZWZpbmUgVFRfVUNSX09DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA5KSAvKiBVKzI0NDAtVSsyNDVGICovCi0gIC8qIEJpdCA0MiAgIEVuY2xvc2VkIEFscGhhbnVtZXJpY3MgKi8KLSNkZWZpbmUgVFRfVUNSX0VOQ0xPU0VEX0FMUEhBTlVNRVJJQ1MgICAgICAgICAgKDFMIDw8IDEwKSAvKiBVKzI0NjAtVSsyNEZGICovCi0gIC8qIEJpdCA0MyAgIEJveCBEcmF3aW5nICovCi0jZGVmaW5lIFRUX1VDUl9CT1hfRFJBV0lORyAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMSkgLyogVSsyNTAwLVUrMjU3RiAqLwotICAvKiBCaXQgNDQgICBCbG9jayBFbGVtZW50cyAqLwotI2RlZmluZSBUVF9VQ1JfQkxPQ0tfRUxFTUVOVFMgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrMjU4MC1VKzI1OUYgKi8KLSAgLyogQml0IDQ1ICAgR2VvbWV0cmljIFNoYXBlcyAqLwotI2RlZmluZSBUVF9VQ1JfR0VPTUVUUklDX1NIQVBFUyAgICAgICAgICAgICAgICAoMUwgPDwgMTMpIC8qIFUrMjVBMC1VKzI1RkYgKi8KLSAgLyogQml0IDQ2ICAgTWlzY2VsbGFuZW91cyBTeW1ib2xzICovCi0jZGVmaW5lIFRUX1VDUl9NSVNDRUxMQU5FT1VTX1NZTUJPTFMgICAgICAgICAgICgxTCA8PCAxNCkgLyogVSsyNjAwLVUrMjZGRiAqLwotICAvKiBCaXQgNDcgICBEaW5nYmF0cyAqLwotI2RlZmluZSBUVF9VQ1JfRElOR0JBVFMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTUpIC8qIFUrMjcwMC1VKzI3QkYgKi8KLSAgLyogQml0IDQ4ICAgQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9DSktfU1lNQk9MUyAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNikgLyogVSszMDAwLVUrMzAzRiAqLwotICAvKiBCaXQgNDkgICBIaXJhZ2FuYSAqLwotI2RlZmluZSBUVF9VQ1JfSElSQUdBTkEgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTcpIC8qIFUrMzA0MC1VKzMwOUYgKi8KLSAgLyogQml0IDUwICAgS2F0YWthbmEgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zICovCi0jZGVmaW5lIFRUX1VDUl9LQVRBS0FOQSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOCkgLyogVSszMEEwLVUrMzBGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMzFGMC1VKzMxRkYgKi8KLSAgLyogQml0IDUxICAgQm9wb21vZm8gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQm9wb21vZm8gRXh0ZW5kZWQgKi8KLSNkZWZpbmUgVFRfVUNSX0JPUE9NT0ZPICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVKzMxMDAtVSszMTJGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSszMUEwLVUrMzFCRiAqLwotICAvKiBCaXQgNTIgICBIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vICovCi0jZGVmaW5lIFRUX1VDUl9IQU5HVUxfQ09NUEFUSUJJTElUWV9KQU1PICAgICAgICgxTCA8PCAyMCkgLyogVSszMTMwLVUrMzE4RiAqLwotICAvKiBCaXQgNTMgICBQaGFncy1QYSAqLwotI2RlZmluZSBUVF9VQ1JfQ0pLX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC8qIFUrQTg0MC1VK0E4N0YgKi8KLSNkZWZpbmUgVFRfVUNSX0tBTkJVTiAgVFRfVUNSX0NKS19NSVNDIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgVFRfVUNSX1BIQUdTUEEKLSAgLyogQml0IDU0ICAgRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyAqLwotI2RlZmluZSBUVF9VQ1JfRU5DTE9TRURfQ0pLX0xFVFRFUlNfTU9OVEhTICAgICAoMUwgPDwgMjIpIC8qIFUrMzIwMC1VKzMyRkYgKi8KLSAgLyogQml0IDU1ICAgQ0pLIENvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgVFRfVUNSX0NKS19DT01QQVRJQklMSVRZICAgICAgICAgICAgICAgKDFMIDw8IDIzKSAvKiBVKzMzMDAtVSszM0ZGICovCi0gIC8qIEJpdCA1NiAgIEhhbmd1bCBTeWxsYWJsZXMgKi8KLSNkZWZpbmUgVFRfVUNSX0hBTkdVTCAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI0KSAvKiBVK0FDMDAtVStEN0EzICovCi0gIC8qIEJpdCA1NyAgIEhpZ2ggU3Vycm9nYXRlcyAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzICAqLwotICAvKiAgICAgICAgICBMb3cgU3Vycm9nYXRlcyAgICAgICAgICAgICAgICovCi0KLSAgLyogQWNjb3JkaW5nIHRvIE9wZW5UeXBlIHNwZWNzIHYuMS4zKywgICAqLwotICAvKiBzZXR0aW5nIGJpdCA1NyBpbXBsaWVzIHRoYXQgdGhlcmUgaXMgICovCi0gIC8qIGF0IGxlYXN0IG9uZSBjb2RlcG9pbnQgYmV5b25kIHRoZSAgICAgKi8KLSAgLyogQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIHRoYXQgaXMgICAgICAqLwotICAvKiBzdXBwb3J0ZWQgYnkgdGhpcyBmb250LiAgU28gaXQgcmVhbGx5ICovCi0gIC8qIG1lYW5zID49IFUrMTAwMDAuICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfVUNSX1NVUlJPR0FURVMgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI1KSAvKiBVK0Q4MDAtVStEQjdGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStEQjgwLVUrREJGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrREMwMC1VK0RGRkYgKi8KLSNkZWZpbmUgVFRfVUNSX05PTl9QTEFORV8wICBUVF9VQ1JfU1VSUk9HQVRFUwotICAvKiBCaXQgNTggIFBob2VuaWNpYW4gKi8KLSNkZWZpbmUgVFRfVUNSX1BIT0VOSUNJQU4gICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI2KSAvKlUrMTA5MDAtVSsxMDkxRiovCi0gIC8qIEJpdCA1OSAgIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBLYW5neGkgUmFkaWNhbHMgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIElkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnMgKi8KLSAgLyogICAgICAgICAgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSAqLwotICAvKiAgICAgICAgICBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBCICovCi0gIC8qICAgICAgICAgIEthbmJ1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfVUNSX0NKS19VTklGSUVEX0lERU9HUkFQSFMgICAgICAgICAgKDFMIDw8IDI3KSAvKiBVKzRFMDAtVSs5RkZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRTgwLVUrMkVGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkYwMC1VKzJGREYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzJGRjAtVSsyRkZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSszNDAwLVUrNERCNSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsyMDAwMC1VKzJBNkRGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzMxOTAtVSszMTlGICovCi0gIC8qIEJpdCA2MCAgIFByaXZhdGUgVXNlICovCi0jZGVmaW5lIFRUX1VDUl9QUklWQVRFX1VTRSAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOCkgLyogVStFMDAwLVUrRjhGRiAqLwotICAvKiBCaXQgNjEgICBDSksgU3Ryb2tlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCAqLwotI2RlZmluZSBUVF9VQ1JfQ0pLX0NPTVBBVElCSUxJVFlfSURFT0dSQVBIUyAgICAoMUwgPDwgMjkpIC8qIFUrMzFDMC1VKzMxRUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0Y5MDAtVStGQUZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzJGODAwLVUrMkZBMUYqLwotICAvKiBCaXQgNjIgICBBbHBoYWJldGljIFByZXNlbnRhdGlvbiBGb3JtcyAqLwotI2RlZmluZSBUVF9VQ1JfQUxQSEFCRVRJQ19QUkVTRU5UQVRJT05fRk9STVMgICAoMUwgPDwgMzApIC8qIFUrRkIwMC1VK0ZCNEYgKi8KLSAgLyogQml0IDYzICAgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BICovCi0jZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0EgICAgICgxTCA8PCAzMSkgLyogVStGQjUwLVUrRkRGRiAqLwotCi0gIC8qIHVsVW5pY29kZVJhbmdlMyAqLwotICAvKiAtLS0tLS0tLS0tLS0tLS0gKi8KLQotICAvKiBCaXQgNjQgICBDb21iaW5pbmcgSGFsZiBNYXJrcyAqLwotI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0hBTEZfTUFSS1MgICAgICAgICAgICAoMUwgPDwgIDApIC8qIFUrRkUyMC1VK0ZFMkYgKi8KLSAgLyogQml0IDY1ICAgVmVydGljYWwgZm9ybXMgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgKi8KLSNkZWZpbmUgVFRfVUNSX0NKS19DT01QQVRJQklMSVRZX0ZPUk1TICAgICAgICAgKDFMIDw8ICAxKSAvKiBVK0ZFMTAtVStGRTFGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStGRTMwLVUrRkU0RiAqLwotICAvKiBCaXQgNjYgICBTbWFsbCBGb3JtIFZhcmlhbnRzICovCi0jZGVmaW5lIFRUX1VDUl9TTUFMTF9GT1JNX1ZBUklBTlRTICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVStGRTUwLVUrRkU2RiAqLwotICAvKiBCaXQgNjcgICBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUIgKi8KLSNkZWZpbmUgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQiAgICAgKDFMIDw8ICAzKSAvKiBVK0ZFNzAtVStGRUZFICovCi0gIC8qIEJpdCA2OCAgIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zICovCi0jZGVmaW5lIFRUX1VDUl9IQUxGV0lEVEhfRlVMTFdJRFRIX0ZPUk1TICAgICAgICgxTCA8PCAgNCkgLyogVStGRjAwLVUrRkZFRiAqLwotICAvKiBCaXQgNjkgICBTcGVjaWFscyAqLwotI2RlZmluZSBUVF9VQ1JfU1BFQ0lBTFMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qIFUrRkZGMC1VK0ZGRkQgKi8KLSAgLyogQml0IDcwICAgVGliZXRhbiAqLwotI2RlZmluZSBUVF9VQ1JfVElCRVRBTiAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDYpIC8qIFUrMEYwMC1VKzBGRkYgKi8KLSAgLyogQml0IDcxICAgU3lyaWFjICovCi0jZGVmaW5lIFRUX1VDUl9TWVJJQUMgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNykgLyogVSswNzAwLVUrMDc0RiAqLwotICAvKiBCaXQgNzIgICBUaGFhbmEgKi8KLSNkZWZpbmUgVFRfVUNSX1RIQUFOQSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzA3ODAtVSswN0JGICovCi0gIC8qIEJpdCA3MyAgIFNpbmhhbGEgKi8KLSNkZWZpbmUgVFRfVUNSX1NJTkhBTEEgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA5KSAvKiBVKzBEODAtVSswREZGICovCi0gIC8qIEJpdCA3NCAgIE15YW5tYXIgKi8KLSNkZWZpbmUgVFRfVUNSX01ZQU5NQVIgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEwKSAvKiBVKzEwMDAtVSsxMDlGICovCi0gIC8qIEJpdCA3NSAgIEV0aGlvcGljICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgRXRoaW9waWMgU3VwcGxlbWVudCAqLwotICAvKiAgICAgICAgICBFdGhpb3BpYyBFeHRlbmRlZCAgICovCi0jZGVmaW5lIFRUX1VDUl9FVEhJT1BJQyAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMSkgLyogVSsxMjAwLVUrMTM3RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMTM4MC1VKzEzOUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzJEODAtVSsyRERGICovCi0gIC8qIEJpdCA3NiAgIENoZXJva2VlICovCi0jZGVmaW5lIFRUX1VDUl9DSEVST0tFRSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMikgLyogVSsxM0EwLVUrMTNGRiAqLwotICAvKiBCaXQgNzcgICBVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzICovCi0jZGVmaW5lIFRUX1VDUl9DQU5BRElBTl9BQk9SSUdJTkFMX1NZTExBQklDUyAgICgxTCA8PCAxMykgLyogVSsxNDAwLVUrMTY3RiAqLwotICAvKiBCaXQgNzggICBPZ2hhbSAqLwotI2RlZmluZSBUVF9VQ1JfT0dIQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTQpIC8qIFUrMTY4MC1VKzE2OUYgKi8KLSAgLyogQml0IDc5ICAgUnVuaWMgKi8KLSNkZWZpbmUgVFRfVUNSX1JVTklDICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzE2QTAtVSsxNkZGICovCi0gIC8qIEJpdCA4MCAgIEtobWVyICAgICAgICAgKi8KLSAgLyogICAgICAgICAgS2htZXIgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfS0hNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTYpIC8qIFUrMTc4MC1VKzE3RkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzE5RTAtVSsxOUZGICovCi0gIC8qIEJpdCA4MSAgIE1vbmdvbGlhbiAqLwotI2RlZmluZSBUVF9VQ1JfTU9OR09MSUFOICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTcpIC8qIFUrMTgwMC1VKzE4QUYgKi8KLSAgLyogQml0IDgyICAgQnJhaWxsZSBQYXR0ZXJucyAqLwotI2RlZmluZSBUVF9VQ1JfQlJBSUxMRSAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMjgwMC1VKzI4RkYgKi8KLSAgLyogQml0IDgzICAgWWkgU3lsbGFibGVzICovCi0gIC8qICAgICAgICAgIFlpIFJhZGljYWxzICAqLwotI2RlZmluZSBUVF9VQ1JfWUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTkpIC8qIFUrQTAwMC1VK0E0OEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0E0OTAtVStBNENGICovCi0gIC8qIEJpdCA4NCAgIFRhZ2Fsb2cgICovCi0gIC8qICAgICAgICAgIEhhbnVub28gICovCi0gIC8qICAgICAgICAgIEJ1aGlkICAgICovCi0gIC8qICAgICAgICAgIFRhZ2JhbndhICovCi0jZGVmaW5lIFRUX1VDUl9QSElMSVBQSU5FICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLyogVSsxNzAwLVUrMTcxRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMTcyMC1VKzE3M0YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzE3NDAtVSsxNzVGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxNzYwLVUrMTc3RiAqLwotICAvKiBCaXQgODUgICBPbGQgSXRhbGljICovCi0jZGVmaW5lIFRUX1VDUl9PTERfSVRBTElDICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMSkgLypVKzEwMzAwLVUrMTAzMkYqLwotICAvKiBCaXQgODYgICBHb3RoaWMgKi8KLSNkZWZpbmUgVFRfVUNSX0dPVEhJQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIyKSAvKlUrMTAzMzAtVSsxMDM0RiovCi0gIC8qIEJpdCA4NyAgIERlc2VyZXQgKi8KLSNkZWZpbmUgVFRfVUNSX0RFU0VSRVQgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIzKSAvKlUrMTA0MDAtVSsxMDQ0RiovCi0gIC8qIEJpdCA4OCAgIEJ5emFudGluZSBNdXNpY2FsIFN5bWJvbHMgICAgICAqLwotICAvKiAgICAgICAgICBNdXNpY2FsIFN5bWJvbHMgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQW5jaWVudCBHcmVlayBNdXNpY2FsIE5vdGF0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9NVVNJQ0FMX1NZTUJPTFMgICAgICAgICAgICAgICAgICgxTCA8PCAyNCkgLypVKzFEMDAwLVUrMUQwRkYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsxRDEwMC1VKzFEMUZGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMUQyMDAtVSsxRDI0RiovCi0gIC8qIEJpdCA4OSAgIE1hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfTUFUSF9BTFBIQU5VTUVSSUNfU1lNQk9MUyAgICAgICAoMUwgPDwgMjUpIC8qVSsxRDQwMC1VKzFEN0ZGKi8KLSAgLyogQml0IDkwICAgUHJpdmF0ZSBVc2UgKHBsYW5lIDE1KSAqLwotICAvKiAgICAgICAgICBQcml2YXRlIFVzZSAocGxhbmUgMTYpICovCi0jZGVmaW5lIFRUX1VDUl9QUklWQVRFX1VTRV9TVVBQTEVNRU5UQVJZICAgICAgICgxTCA8PCAyNikgLypVK0YwMDAwLVUrRkZGRkQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTAwMDAwLVUrMTBGRkZEKi8KLSAgLyogQml0IDkxICAgVmFyaWF0aW9uIFNlbGVjdG9ycyAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIFZhcmlhdGlvbiBTZWxlY3RvcnMgU3VwcGxlbWVudCAqLwotI2RlZmluZSBUVF9VQ1JfVkFSSUFUSU9OX1NFTEVDVE9SUyAgICAgICAgICAgICAoMUwgPDwgMjcpIC8qIFUrRkUwMC1VK0ZFMEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrRTAxMDAtVStFMDFFRiovCi0gIC8qIEJpdCA5MiAgIFRhZ3MgKi8KLSNkZWZpbmUgVFRfVUNSX1RBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAvKlUrRTAwMDAtVStFMDA3RiovCi0gIC8qIEJpdCA5MyAgIExpbWJ1ICovCi0jZGVmaW5lIFRUX1VDUl9MSU1CVSAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOSkgLyogVSsxOTAwLVUrMTk0RiAqLwotICAvKiBCaXQgOTQgICBUYWkgTGUgKi8KLSNkZWZpbmUgVFRfVUNSX1RBSV9MRSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDMwKSAvKiBVKzE5NTAtVSsxOTdGICovCi0gIC8qIEJpdCA5NSAgIE5ldyBUYWkgTHVlICovCi0jZGVmaW5lIFRUX1VDUl9ORVdfVEFJX0xVRSAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzMSkgLyogVSsxOTgwLVUrMTlERiAqLwotCi0gIC8qIHVsVW5pY29kZVJhbmdlNCAqLwotICAvKiAtLS0tLS0tLS0tLS0tLS0gKi8KLQotICAvKiBCaXQgOTYgICBCdWdpbmVzZSAqLwotI2RlZmluZSBUVF9VQ1JfQlVHSU5FU0UgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDApIC8qIFUrMUEwMC1VKzFBMUYgKi8KLSAgLyogQml0IDk3ICAgR2xhZ29saXRpYyAqLwotI2RlZmluZSBUVF9VQ1JfR0xBR09MSVRJQyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDEpIC8qIFUrMkMwMC1VKzJDNUYgKi8KLSAgLyogQml0IDk4ICAgVGlmaW5hZ2ggKi8KLSNkZWZpbmUgVFRfVUNSX1RJRklOQUdIICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICAyKSAvKiBVKzJEMzAtVSsyRDdGICovCi0gIC8qIEJpdCA5OSAgIFlpamluZyBIZXhhZ3JhbSBTeW1ib2xzICovCi0jZGVmaW5lIFRUX1VDUl9ZSUpJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgMykgLyogVSs0REMwLVUrNERGRiAqLwotICAvKiBCaXQgMTAwICBTeWxvdGkgTmFncmkgKi8KLSNkZWZpbmUgVFRfVUNSX1NZTE9USV9OQUdSSSAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA0KSAvKiBVK0E4MDAtVStBODJGICovCi0gIC8qIEJpdCAxMDEgIExpbmVhciBCIFN5bGxhYmFyeSAqLwotICAvKiAgICAgICAgICBMaW5lYXIgQiBJZGVvZ3JhbXMgKi8KLSAgLyogICAgICAgICAgQWVnZWFuIE51bWJlcnMgICAgICovCi0jZGVmaW5lIFRUX1VDUl9MSU5FQVJfQiAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNSkgLypVKzEwMDAwLVUrMTAwN0YqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsxMDA4MC1VKzEwMEZGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTAxMDAtVSsxMDEzRiovCi0gIC8qIEJpdCAxMDIgIEFuY2llbnQgR3JlZWsgTnVtYmVycyAqLwotI2RlZmluZSBUVF9VQ1JfQU5DSUVOVF9HUkVFS19OVU1CRVJTICAgICAgICAgICAoMUwgPDwgIDYpIC8qVSsxMDE0MC1VKzEwMThGKi8KLSAgLyogQml0IDEwMyAgVWdhcml0aWMgKi8KLSNkZWZpbmUgVFRfVUNSX1VHQVJJVElDICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA3KSAvKlUrMTAzODAtVSsxMDM5RiovCi0gIC8qIEJpdCAxMDQgIE9sZCBQZXJzaWFuICovCi0jZGVmaW5lIFRUX1VDUl9PTERfUEVSU0lBTiAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOCkgLypVKzEwM0EwLVUrMTAzREYqLwotICAvKiBCaXQgMTA1ICBTaGF2aWFuICovCi0jZGVmaW5lIFRUX1VDUl9TSEFWSUFOICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOSkgLypVKzEwNDUwLVUrMTA0N0YqLwotICAvKiBCaXQgMTA2ICBPc21hbnlhICovCi0jZGVmaW5lIFRUX1VDUl9PU01BTllBICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCkgLypVKzEwNDgwLVUrMTA0QUYqLwotICAvKiBCaXQgMTA3ICBDeXByaW90IFN5bGxhYmFyeSAqLwotI2RlZmluZSBUVF9VQ1JfQ1lQUklPVF9TWUxMQUJBUlkgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qVSsxMDgwMC1VKzEwODNGKi8KLSAgLyogQml0IDEwOCAgS2hhcm9zaHRoaSAqLwotI2RlZmluZSBUVF9VQ1JfS0hBUk9TSFRISSAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qVSsxMEEwMC1VKzEwQTVGKi8KLSAgLyogQml0IDEwOSAgVGFpIFh1YW4gSmluZyBTeW1ib2xzICovCi0jZGVmaW5lIFRUX1VDUl9UQUlfWFVBTl9KSU5HICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMykgLypVKzFEMzAwLVUrMUQzNUYqLwotICAvKiBCaXQgMTEwICBDdW5laWZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQ3VuZWlmb3JtIE51bWJlcnMgYW5kIFB1bmN0dWF0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9DVU5FSUZPUk0gICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNCkgLypVKzEyMDAwLVUrMTIzRkYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsxMjQwMC1VKzEyNDdGKi8KLSAgLyogQml0IDExMSAgQ291bnRpbmcgUm9kIE51bWVyYWxzICovCi0jZGVmaW5lIFRUX1VDUl9DT1VOVElOR19ST0RfTlVNRVJBTFMgICAgICAgICAgICgxTCA8PCAxNSkgLypVKzFEMzYwLVUrMUQzN0YqLwotICAvKiBCaXQgMTEyICBTdW5kYW5lc2UgKi8KLSNkZWZpbmUgVFRfVUNSX1NVTkRBTkVTRSAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAvKiBVKzFCODAtVSsxQkJGICovCi0gIC8qIEJpdCAxMTMgIExlcGNoYSAqLwotI2RlZmluZSBUVF9VQ1JfTEVQQ0hBICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTcpIC8qIFUrMUMwMC1VKzFDNEYgKi8KLSAgLyogQml0IDExNCAgT2wgQ2hpa2kgKi8KLSNkZWZpbmUgVFRfVUNSX09MX0NISUtJICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE4KSAvKiBVKzFDNTAtVSsxQzdGICovCi0gIC8qIEJpdCAxMTUgIFNhdXJhc2h0cmEgKi8KLSNkZWZpbmUgVFRfVUNSX1NBVVJBU0hUUkEgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVK0E4ODAtVStBOERGICovCi0gIC8qIEJpdCAxMTYgIEtheWFoIExpICovCi0jZGVmaW5lIFRUX1VDUl9LQVlBSF9MSSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLyogVStBOTAwLVUrQTkyRiAqLwotICAvKiBCaXQgMTE3ICBSZWphbmcgKi8KLSNkZWZpbmUgVFRfVUNSX1JFSkFORyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKiBVK0E5MzAtVStBOTVGICovCi0gIC8qIEJpdCAxMTggIENoYW0gKi8KLSNkZWZpbmUgVFRfVUNSX0NIQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIyKSAvKiBVK0FBMDAtVStBQTVGICovCi0gIC8qIEJpdCAxMTkgIEFuY2llbnQgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfQU5DSUVOVF9TWU1CT0xTICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpIC8qVSsxMDE5MC1VKzEwMUNGKi8KLSAgLyogQml0IDEyMCAgUGhhaXN0b3MgRGlzYyAqLwotI2RlZmluZSBUVF9VQ1JfUEhBSVNUT1NfRElTQyAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qVSsxMDFEMC1VKzEwMUZGKi8KLSAgLyogQml0IDEyMSAgQ2FyaWFuICovCi0gIC8qICAgICAgICAgIEx5Y2lhbiAqLwotICAvKiAgICAgICAgICBMeWRpYW4gKi8KLSNkZWZpbmUgVFRfVUNSX09MRF9BTkFUT0xJQU4gICAgICAgICAgICAgICAgICAgKDFMIDw8IDI1KSAvKlUrMTAyQTAtVSsxMDJERiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzEwMjgwLVUrMTAyOUYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsxMDkyMC1VKzEwOTNGKi8KLSAgLyogQml0IDEyMiAgRG9taW5vIFRpbGVzICAqLwotICAvKiAgICAgICAgICBNYWhqb25nIFRpbGVzICovCi0jZGVmaW5lIFRUX1VDUl9HQU1FX1RJTEVTICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNikgLypVKzFGMDMwLVUrMUYwOUYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsxRjAwMC1VKzFGMDJGKi8KLSAgLyogQml0IDEyMy0xMjcgUmVzZXJ2ZWQgZm9yIHByb2Nlc3MtaW50ZXJuYWwgdXNhZ2UgKi8KLQotICAvKiAqLwotCi0gIC8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgRnJlZVR5cGUgdmVyc2lvbnMgKi8KLSNkZWZpbmUgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05fQSAgICAgICAgIFwKLSAgICAgICAgICBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTl9GT1JNU19BCi0jZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OX0IgICAgICAgICBcCi0gICAgICAgICAgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQgotCi0jZGVmaW5lIFRUX1VDUl9DT01CSU5JTkdfRElBQ1JJVElDUyAgICAgICAgICBcCi0gICAgICAgICAgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLUwotI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ1NfU1lNQiAgICAgICAgICBcCi0gICAgICAgICAgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLU19TWU1CCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVFROQU1FSURfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMTIwNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHR0YWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIFNGTlQvVHJ1ZVR5cGUgdGFibGVzIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUVFRBQkxFU19IXwotI2RlZmluZSBUVFRBQkxFU19IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0cnVldHlwZV90YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSBUYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSBzcGVjaWZpYyB0YWJsZSB0eXBlcyBhbmQgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGVmaW5pdGlvbnMgb2Ygc29tZSBiYXNpYyB0YWJsZXMgc3BlY2lmaWMgdG8gKi8KLSAgLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGFzIHdlbGwgYXMgc29tZSByb3V0aW5lcyB1c2VkIHRvIGFjY2VzcyBhbmQgICovCi0gIC8qICAgIHByb2Nlc3MgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Ib3JpSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfVmVydEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX09TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUENMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX01heFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2ZudF9UYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb2FkX1NmbnRfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2ZudF9UYWJsZV9JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBUcnVlVHlwZSBmb250IGhlYWRlciB0YWJsZS4gIEFsbCBmaWVsZHMgICAgICovCi0gIC8qICAgIGZvbGxvdyB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hlYWRlcl8KLSAgewotICAgIEZUX0ZpeGVkICAgVGFibGVfVmVyc2lvbjsKLSAgICBGVF9GaXhlZCAgIEZvbnRfUmV2aXNpb247Ci0KLSAgICBGVF9Mb25nICAgIENoZWNrU3VtX0FkanVzdDsKLSAgICBGVF9Mb25nICAgIE1hZ2ljX051bWJlcjsKLQotICAgIEZUX1VTaG9ydCAgRmxhZ3M7Ci0gICAgRlRfVVNob3J0ICBVbml0c19QZXJfRU07Ci0KLSAgICBGVF9Mb25nICAgIENyZWF0ZWQgWzJdOwotICAgIEZUX0xvbmcgICAgTW9kaWZpZWRbMl07Ci0KLSAgICBGVF9TaG9ydCAgIHhNaW47Ci0gICAgRlRfU2hvcnQgICB5TWluOwotICAgIEZUX1Nob3J0ICAgeE1heDsKLSAgICBGVF9TaG9ydCAgIHlNYXg7Ci0KLSAgICBGVF9VU2hvcnQgIE1hY19TdHlsZTsKLSAgICBGVF9VU2hvcnQgIExvd2VzdF9SZWNfUFBFTTsKLQotICAgIEZUX1Nob3J0ICAgRm9udF9EaXJlY3Rpb247Ci0gICAgRlRfU2hvcnQgICBJbmRleF9Ub19Mb2NfRm9ybWF0OwotICAgIEZUX1Nob3J0ICAgR2x5cGhfRGF0YV9Gb3JtYXQ7Ci0KLSAgfSBUVF9IZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Ib3JpSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIFRydWVUeXBlIGhvcml6b250YWwgaGVhZGVyLCB0aGUgYGhoZWEnICAgICAgKi8KLSAgLyogICAgdGFibGUsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgaG9yaXpvbnRhbCBtZXRyaWNzIHRhYmxlLCAgICAgICovCi0gIC8qICAgIGBobXR4Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFZlcnNpb24gICAgICAgICAgICAgICAgOjogVGhlIHRhYmxlIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXNjZW5kZXIgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IG9mIGFsbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSBBU0NJSSkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvQXNjZW5kZXInIGZpZWxkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGBPUy8yJyB0YWJsZSBpbnN0ZWFkIGlmIHlvdSB3YW50ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc2NlbmRlciAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBkZXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSBib3R0b20tbW9zdCBvZiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVnYXRpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlIEFTQ0lJKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9EZXNjZW5kZXInICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBvZiB0aGUgYE9TLzInIHRhYmxlIGluc3RlYWQgaWYgeW91ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGluZV9HYXAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGxpbmUgZ2FwLCBpLmUuLCB0aGUgZGlzdGFuY2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWRkIHRvIHRoZSBhc2NlbmRlciBhbmQgZGVzY2VuZGVyIHRvICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCB0aGUgQlRCLCBpLmUuLCB0aGUgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZS10by1iYXNlbGluZSBkaXN0YW5jZSBmb3IgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZV9XaWR0aF9NYXggICAgICA6OiBUaGlzIGZpZWxkIGlzIHRoZSBtYXhpbXVtIG9mIGFsbCBhZHZhbmNlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgY2FuIGJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSB3aWR0aCBvZiBhbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmJpdHJhcnkgc3RyaW5nIG9mIHRleHQuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fTGVmdF9TaWRlX0JlYXJpbmcgIDo6IFRoZSBtaW5pbXVtIGxlZnQgc2lkZSBiZWFyaW5nIG9mIGFsbCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fUmlnaHRfU2lkZV9CZWFyaW5nIDo6IFRoZSBtaW5pbXVtIHJpZ2h0IHNpZGUgYmVhcmluZyBvZiBhbGwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4TWF4X0V4dGVudCAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIGhvcml6b250YWwgZXh0ZW50IChpLmUuLCB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgd2lkdGgnIG9mIGEgZ2x5cGgncyBib3VuZGluZyBib3gpIGZvciAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfU2xvcGVfUmlzZSAgICAgICA6OiBUaGUgcmlzZSBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUgb2YgdGhlIGN1cnNvciAoc2xvcGU9cmlzZS9ydW4pLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfU2xvcGVfUnVuICAgICAgICA6OiBUaGUgcnVuIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfT2Zmc2V0ICAgICAgICAgICA6OiBUaGUgY3Vyc29yJ3Mgb2Zmc2V0IGZvciBzbGFudGVkIGZvbnRzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXNlcnZlZCAgICAgICAgICAgICAgIDo6IDh+cmVzZXJ2ZWQgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY19EYXRhX0Zvcm1hdCAgICAgOjogQWx3YXlzfjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtYmVyX09mX0hNZXRyaWNzICAgICA6OiBOdW1iZXIgb2YgSE1ldHJpY3MgZW50cmllcyBpbiB0aGUgYGhtdHgnICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgLS0gdGhpcyB2YWx1ZSBjYW4gYmUgc21hbGxlciB0aGFuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmb250LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvbmdfbWV0cmljcyAgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGBobXR4JyB0YWJsZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2hvcnRfbWV0cmljcyAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYGhtdHgnIHRhYmxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIGFuIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250LCB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzICovCi0gIC8qICAgIGNhbiBjaGFuZ2UgYWZ0ZXIgYSBjYWxsIHRvIEBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAoYW5kICAgICAqLwotICAvKiAgICBmcmllbmRzKSBpZiB0aGUgZm9udCBjb250YWlucyBhbiBgTVZBUicgdGFibGU6IGBjYXJldF9TbG9wZV9SaXNlJywgKi8KLSAgLyogICAgYGNhcmV0X1Nsb3BlX1J1bicsIGFuZCBgY2FyZXRfT2Zmc2V0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfSG9yaUhlYWRlcl8KLSAgewotICAgIEZUX0ZpeGVkICAgVmVyc2lvbjsKLSAgICBGVF9TaG9ydCAgIEFzY2VuZGVyOwotICAgIEZUX1Nob3J0ICAgRGVzY2VuZGVyOwotICAgIEZUX1Nob3J0ICAgTGluZV9HYXA7Ci0KLSAgICBGVF9VU2hvcnQgIGFkdmFuY2VfV2lkdGhfTWF4OyAgICAgIC8qIGFkdmFuY2Ugd2lkdGggbWF4aW11bSAqLwotCi0gICAgRlRfU2hvcnQgICBtaW5fTGVmdF9TaWRlX0JlYXJpbmc7ICAvKiBtaW5pbXVtIGxlZnQtc2IgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgIG1pbl9SaWdodF9TaWRlX0JlYXJpbmc7IC8qIG1pbmltdW0gcmlnaHQtc2IgICAgICAqLwotICAgIEZUX1Nob3J0ICAgeE1heF9FeHRlbnQ7ICAgICAgICAgICAgLyogeG1heCBleHRlbnRzICAgICAgICAgICovCi0gICAgRlRfU2hvcnQgICBjYXJldF9TbG9wZV9SaXNlOwotICAgIEZUX1Nob3J0ICAgY2FyZXRfU2xvcGVfUnVuOwotICAgIEZUX1Nob3J0ICAgY2FyZXRfT2Zmc2V0OwotCi0gICAgRlRfU2hvcnQgICBSZXNlcnZlZFs0XTsKLQotICAgIEZUX1Nob3J0ICAgbWV0cmljX0RhdGFfRm9ybWF0OwotICAgIEZUX1VTaG9ydCAgbnVtYmVyX09mX0hNZXRyaWNzOwotCi0gICAgLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uICovCi0gICAgLyogYnV0IHRoZXkgYXJlIHVzZWQgdG8gY29ubmVjdCB0aGUgbWV0cmljcyBoZWFkZXIgdG8gdGhlIHJlbGV2YW50ICAgICovCi0gICAgLyogYGhtdHgnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB2b2lkKiAgICAgIGxvbmdfbWV0cmljczsKLSAgICB2b2lkKiAgICAgIHNob3J0X21ldHJpY3M7Ci0KLSAgfSBUVF9Ib3JpSGVhZGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfVmVydEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIHZlcnRpY2FsIGhlYWRlciwgdGhlIGB2aGVhJyAgICovCi0gIC8qICAgIHRhYmxlLCBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRpY2FsIG1ldHJpY3MgdGFibGUsICAgICAgICAqLwotICAvKiAgICBgdm10eCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBWZXJzaW9uICAgICAgICAgICAgICAgICA6OiBUaGUgdGFibGUgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFzY2VuZGVyICAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgYXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgdG9wLW1vc3Qgb2YgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDSUkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvQXNjZW5kZXInICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgdGhlIGBPUy8yJyB0YWJsZSBpbnN0ZWFkIGlmICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdSB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzY2VuZGVyICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBkZXNjZW5kZXIsIGkuZS4sIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20tbW9zdCBvZiBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZvbnQuICBJdCBpcyBuZWdhdGl2ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDSUkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvRGVzY2VuZGVyJyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgdGhlIGBPUy8yJyB0YWJsZSBpbnN0ZWFkIGlmICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdSB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGluZV9HYXAgICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBsaW5lIGdhcCwgaS5lLiwgdGhlIGRpc3RhbmNlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkZCB0byB0aGUgYXNjZW5kZXIgYW5kIGRlc2NlbmRlciB0byAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGhlIEJUQiwgaS5lLiwgdGhlICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmUtdG8tYmFzZWxpbmUgZGlzdGFuY2UgZm9yIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZV9IZWlnaHRfTWF4ICAgICAgOjogVGhpcyBmaWVsZCBpcyB0aGUgbWF4aW11bSBvZiBhbGwgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgaGVpZ2h0cyBmb3VuZCBpbiB0aGUgZm9udC4gIEl0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBtYXhpbXVtICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIGFuIGFyYml0cmFyeSBzdHJpbmcgb2YgdGV4dC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fVG9wX1NpZGVfQmVhcmluZyAgICA6OiBUaGUgbWluaW11bSB0b3Agc2lkZSBiZWFyaW5nIG9mIGFsbCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIHdpdGhpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fQm90dG9tX1NpZGVfQmVhcmluZyA6OiBUaGUgbWluaW11bSBib3R0b20gc2lkZSBiZWFyaW5nIG9mIGFsbCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIHdpdGhpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5TWF4X0V4dGVudCAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSB2ZXJ0aWNhbCBleHRlbnQgKGkuZS4sIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGhlaWdodCcgb2YgYSBnbHlwaCdzIGJvdW5kaW5nIGJveCkgZm9yICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaHMgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfU2xvcGVfUmlzZSAgICAgICAgOjogVGhlIHJpc2UgY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlIG9mIHRoZSBjdXJzb3IgKHNsb3BlPXJpc2UvcnVuKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfU2xvcGVfUnVuICAgICAgICAgOjogVGhlIHJ1biBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfT2Zmc2V0ICAgICAgICAgICAgOjogVGhlIGN1cnNvcidzIG9mZnNldCBmb3Igc2xhbnRlZCBmb250cy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXNlcnZlZCAgICAgICAgICAgICAgICA6OiA4fnJlc2VydmVkIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY19EYXRhX0Zvcm1hdCAgICAgIDo6IEFsd2F5c34wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtYmVyX09mX1ZNZXRyaWNzICAgICAgOjogTnVtYmVyIG9mIFZNZXRyaWNzIGVudHJpZXMgaW4gdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB2bXR4JyB0YWJsZSAtLSB0aGlzIHZhbHVlIGNhbiBiZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGVyIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiBnbHlwaHMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb25nX21ldHJpY3MgICAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYHZtdHgnIHRhYmxlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNob3J0X21ldHJpY3MgICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBhbiBPcGVuVHlwZSB2YXJpYXRpb24gZm9udCwgdGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyAqLwotICAvKiAgICBjYW4gY2hhbmdlIGFmdGVyIGEgY2FsbCB0byBARlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMgKGFuZCAgICAgKi8KLSAgLyogICAgZnJpZW5kcykgaWYgdGhlIGZvbnQgY29udGFpbnMgYW4gYE1WQVInIHRhYmxlOiBgQXNjZW5kZXInLCAgICAgICAgICovCi0gIC8qICAgIGBEZXNjZW5kZXInLCBgTGluZV9HYXAnLCBgY2FyZXRfU2xvcGVfUmlzZScsIGBjYXJldF9TbG9wZV9SdW4nLCAgICAqLwotICAvKiAgICBhbmQgYGNhcmV0X09mZnNldCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9WZXJ0SGVhZGVyXwotICB7Ci0gICAgRlRfRml4ZWQgICBWZXJzaW9uOwotICAgIEZUX1Nob3J0ICAgQXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBEZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBMaW5lX0dhcDsKLQotICAgIEZUX1VTaG9ydCAgYWR2YW5jZV9IZWlnaHRfTWF4OyAgICAgIC8qIGFkdmFuY2UgaGVpZ2h0IG1heGltdW0gKi8KLQotICAgIEZUX1Nob3J0ICAgbWluX1RvcF9TaWRlX0JlYXJpbmc7ICAgIC8qIG1pbmltdW0gdG9wLXNiICAgICAgICAgICovCi0gICAgRlRfU2hvcnQgICBtaW5fQm90dG9tX1NpZGVfQmVhcmluZzsgLyogbWluaW11bSBib3R0b20tc2IgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgIHlNYXhfRXh0ZW50OyAgICAgICAgICAgICAvKiB5bWF4IGV4dGVudHMgICAgICAgICAgICAqLwotICAgIEZUX1Nob3J0ICAgY2FyZXRfU2xvcGVfUmlzZTsKLSAgICBGVF9TaG9ydCAgIGNhcmV0X1Nsb3BlX1J1bjsKLSAgICBGVF9TaG9ydCAgIGNhcmV0X09mZnNldDsKLQotICAgIEZUX1Nob3J0ICAgUmVzZXJ2ZWRbNF07Ci0KLSAgICBGVF9TaG9ydCAgIG1ldHJpY19EYXRhX0Zvcm1hdDsKLSAgICBGVF9VU2hvcnQgIG51bWJlcl9PZl9WTWV0cmljczsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgIC8qIGJ1dCB0aGV5IGFyZSB1c2VkIHRvIGNvbm5lY3QgdGhlIG1ldHJpY3MgaGVhZGVyIHRvIHRoZSByZWxldmFudCAgICAqLwotICAgIC8qIGB2bXR4JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7Ci0gICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOwotCi0gIH0gVFRfVmVydEhlYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX09TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgYE9TLzInIHRhYmxlLiAgQWxsIGZpZWxkcyBjb21wbHkgICAqLwotICAvKiAgICB0byB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB3ZSBub3cgc3VwcG9ydCBvbGQgTWFjIGZvbnRzIHRoYXQgZG8gbm90IGluY2x1ZGUgYW4gICAgICAqLwotICAvKiAgICBgT1MvMicgdGFibGUuICBJbiB0aGlzIGNhc2UsIHRoZSBgdmVyc2lvbicgZmllbGQgaXMgYWx3YXlzIHNldCB0byAgKi8KLSAgLyogICAgMHhGRkZGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIGFuIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250LCB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzICovCi0gIC8qICAgIGNhbiBjaGFuZ2UgYWZ0ZXIgYSBjYWxsIHRvIEBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAoYW5kICAgICAqLwotICAvKiAgICBmcmllbmRzKSBpZiB0aGUgZm9udCBjb250YWlucyBhbiBgTVZBUicgdGFibGU6IGBzQ2FwSGVpZ2h0JywgICAgICAgKi8KLSAgLyogICAgYHNUeXBvQXNjZW5kZXInLCBgc1R5cG9EZXNjZW5kZXInLCBgc1R5cG9MaW5lR2FwJywgYHN4SGVpZ2h0JywgICAgICovCi0gIC8qICAgIGB1c1dpbkFzY2VudCcsIGB1c1dpbkRlc2NlbnQnLCBgeVN0cmlrZW91dFBvc2l0aW9uJywgICAgICAgICAgICAgICAqLwotICAvKiAgICBgeVN0cmlrZW91dFNpemUnLCBgeVN1YnNjcmlwdFhPZmZzZXQnLCBgeVN1YlNjcmlwdFhTaXplJywgICAgICAgICAgKi8KLSAgLyogICAgYHlTdWJzY3JpcHRZT2Zmc2V0JywgYHlTdWJzY3JpcHRZU2l6ZScsIGB5U3VwZXJzY3JpcHRYT2Zmc2V0JywgICAgICovCi0gIC8qICAgIGB5U3VwZXJzY3JpcHRYU2l6ZScsIGB5U3VwZXJzY3JpcHRZT2Zmc2V0JywgYW5kICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgeVN1cGVyc2NyaXB0WVNpemUnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBvc3NpYmxlIHZhbHVlcyBmb3IgYml0cyBpbiB0aGUgYHVsVW5pY29kZVJhbmdlWCcgZmllbGRzIGFyZSBnaXZlbiAqLwotICAvKiAgICBieSB0aGUgQFRUX1VDUl9YWFggbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX09TMl8KLSAgewotICAgIEZUX1VTaG9ydCAgdmVyc2lvbjsgICAgICAgICAgICAgICAgLyogMHgwMDAxIC0gbW9yZSBvciAweEZGRkYgKi8KLSAgICBGVF9TaG9ydCAgIHhBdmdDaGFyV2lkdGg7Ci0gICAgRlRfVVNob3J0ICB1c1dlaWdodENsYXNzOwotICAgIEZUX1VTaG9ydCAgdXNXaWR0aENsYXNzOwotICAgIEZUX1VTaG9ydCAgZnNUeXBlOwotICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFhTaXplOwotICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFlTaXplOwotICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFhPZmZzZXQ7Ci0gICAgRlRfU2hvcnQgICB5U3Vic2NyaXB0WU9mZnNldDsKLSAgICBGVF9TaG9ydCAgIHlTdXBlcnNjcmlwdFhTaXplOwotICAgIEZUX1Nob3J0ICAgeVN1cGVyc2NyaXB0WVNpemU7Ci0gICAgRlRfU2hvcnQgICB5U3VwZXJzY3JpcHRYT2Zmc2V0OwotICAgIEZUX1Nob3J0ICAgeVN1cGVyc2NyaXB0WU9mZnNldDsKLSAgICBGVF9TaG9ydCAgIHlTdHJpa2VvdXRTaXplOwotICAgIEZUX1Nob3J0ICAgeVN0cmlrZW91dFBvc2l0aW9uOwotICAgIEZUX1Nob3J0ICAgc0ZhbWlseUNsYXNzOwotCi0gICAgRlRfQnl0ZSAgICBwYW5vc2VbMTBdOwotCi0gICAgRlRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTE7ICAgICAgICAvKiBCaXRzIDAtMzEgICAqLwotICAgIEZUX1VMb25nICAgdWxVbmljb2RlUmFuZ2UyOyAgICAgICAgLyogQml0cyAzMi02MyAgKi8KLSAgICBGVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlMzsgICAgICAgIC8qIEJpdHMgNjQtOTUgICovCi0gICAgRlRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTQ7ICAgICAgICAvKiBCaXRzIDk2LTEyNyAqLwotCi0gICAgRlRfQ2hhciAgICBhY2hWZW5kSURbNF07Ci0KLSAgICBGVF9VU2hvcnQgIGZzU2VsZWN0aW9uOwotICAgIEZUX1VTaG9ydCAgdXNGaXJzdENoYXJJbmRleDsKLSAgICBGVF9VU2hvcnQgIHVzTGFzdENoYXJJbmRleDsKLSAgICBGVF9TaG9ydCAgIHNUeXBvQXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBzVHlwb0Rlc2NlbmRlcjsKLSAgICBGVF9TaG9ydCAgIHNUeXBvTGluZUdhcDsKLSAgICBGVF9VU2hvcnQgIHVzV2luQXNjZW50OwotICAgIEZUX1VTaG9ydCAgdXNXaW5EZXNjZW50OwotCi0gICAgLyogb25seSB2ZXJzaW9uIDEgYW5kIGhpZ2hlcjogKi8KLQotICAgIEZUX1VMb25nICAgdWxDb2RlUGFnZVJhbmdlMTsgICAgICAgLyogQml0cyAwLTMxICAgKi8KLSAgICBGVF9VTG9uZyAgIHVsQ29kZVBhZ2VSYW5nZTI7ICAgICAgIC8qIEJpdHMgMzItNjMgICovCi0KLSAgICAvKiBvbmx5IHZlcnNpb24gMiBhbmQgaGlnaGVyOiAqLwotCi0gICAgRlRfU2hvcnQgICBzeEhlaWdodDsKLSAgICBGVF9TaG9ydCAgIHNDYXBIZWlnaHQ7Ci0gICAgRlRfVVNob3J0ICB1c0RlZmF1bHRDaGFyOwotICAgIEZUX1VTaG9ydCAgdXNCcmVha0NoYXI7Ci0gICAgRlRfVVNob3J0ICB1c01heENvbnRleHQ7Ci0KLSAgICAvKiBvbmx5IHZlcnNpb24gNSBhbmQgaGlnaGVyOiAqLwotCi0gICAgRlRfVVNob3J0ICB1c0xvd2VyT3B0aWNhbFBvaW50U2l6ZTsgICAgICAgLyogaW4gdHdpcHMgKDEvMjB0aCBwb2ludHMpICovCi0gICAgRlRfVVNob3J0ICB1c1VwcGVyT3B0aWNhbFBvaW50U2l6ZTsgICAgICAgLyogaW4gdHdpcHMgKDEvMjB0aCBwb2ludHMpICovCi0KLSAgfSBUVF9PUzI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIFRydWVUeXBlIGBwb3N0JyB0YWJsZS4gIEFsbCBmaWVsZHMgY29tcGx5ICAgKi8KLSAgLyogICAgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICBUaGlzIHN0cnVjdHVyZSBkb2VzIG5vdCByZWZlcmVuY2UgICovCi0gIC8qICAgIGEgZm9udCdzIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXM7IHVzZSBARlRfR2V0X0dseXBoX05hbWUgdG8gICAgICAgICAqLwotICAvKiAgICByZXRyaWV2ZSB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgKi8KLSAgLyogICAgY2FuIGNoYW5nZSBhZnRlciBhIGNhbGwgdG8gQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIChhbmQgICAgICovCi0gIC8qICAgIGZyaWVuZHMpIGlmIHRoZSBmb250IGNvbnRhaW5zIGFuIGBNVkFSJyB0YWJsZTogYHVuZGVybGluZVBvc2l0aW9uJyAqLwotICAvKiAgICBhbmQgYHVuZGVybGluZVRoaWNrbmVzcycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0c2NyaXB0XwotICB7Ci0gICAgRlRfRml4ZWQgIEZvcm1hdFR5cGU7Ci0gICAgRlRfRml4ZWQgIGl0YWxpY0FuZ2xlOwotICAgIEZUX1Nob3J0ICB1bmRlcmxpbmVQb3NpdGlvbjsKLSAgICBGVF9TaG9ydCAgdW5kZXJsaW5lVGhpY2tuZXNzOwotICAgIEZUX1VMb25nICBpc0ZpeGVkUGl0Y2g7Ci0gICAgRlRfVUxvbmcgIG1pbk1lbVR5cGU0MjsKLSAgICBGVF9VTG9uZyAgbWF4TWVtVHlwZTQyOwotICAgIEZUX1VMb25nICBtaW5NZW1UeXBlMTsKLSAgICBGVF9VTG9uZyAgbWF4TWVtVHlwZTE7Ci0KLSAgICAvKiBHbHlwaCBuYW1lcyBmb2xsb3cgaW4gdGhlIGBwb3N0JyB0YWJsZSwgYnV0IHdlIGRvbid0ICovCi0gICAgLyogbG9hZCB0aGVtIGJ5IGRlZmF1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIH0gVFRfUG9zdHNjcmlwdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1BDTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgYFBDTFQnIHRhYmxlLiAgQWxsIGZpZWxkcyBjb21wbHkgICAqLwotICAvKiAgICB0byB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9QQ0xUXwotICB7Ci0gICAgRlRfRml4ZWQgICBWZXJzaW9uOwotICAgIEZUX1VMb25nICAgRm9udE51bWJlcjsKLSAgICBGVF9VU2hvcnQgIFBpdGNoOwotICAgIEZUX1VTaG9ydCAgeEhlaWdodDsKLSAgICBGVF9VU2hvcnQgIFN0eWxlOwotICAgIEZUX1VTaG9ydCAgVHlwZUZhbWlseTsKLSAgICBGVF9VU2hvcnQgIENhcEhlaWdodDsKLSAgICBGVF9VU2hvcnQgIFN5bWJvbFNldDsKLSAgICBGVF9DaGFyICAgIFR5cGVGYWNlWzE2XTsKLSAgICBGVF9DaGFyICAgIENoYXJhY3RlckNvbXBsZW1lbnRbOF07Ci0gICAgRlRfQ2hhciAgICBGaWxlTmFtZVs2XTsKLSAgICBGVF9DaGFyICAgIFN0cm9rZVdlaWdodDsKLSAgICBGVF9DaGFyICAgIFdpZHRoVHlwZTsKLSAgICBGVF9CeXRlICAgIFNlcmlmU3R5bGU7Ci0gICAgRlRfQnl0ZSAgICBSZXNlcnZlZDsKLQotICB9IFRUX1BDTFQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9NYXhQcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWF4aW11bSBwcm9maWxlIChgbWF4cCcpIHRhYmxlIGNvbnRhaW5zIG1hbnkgbWF4IHZhbHVlcywgd2hpY2ggKi8KLSAgLyogICAgY2FuIGJlIHVzZWQgdG8gcHJlLWFsbG9jYXRlIGFycmF5cyBmb3Igc3BlZWRpbmcgdXAgZ2x5cGggbG9hZGluZyAgICovCi0gIC8qICAgIGFuZCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gICAgICAgICAgICAgICA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtR2x5cGhzICAgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoaXMgVHJ1ZVR5cGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4UG9pbnRzICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgaW4gYSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYG1heENvbXBvc2l0ZVBvaW50cycuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heENvbnRvdXJzICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgaW4gYSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBtYXhDb21wb3NpdGVDb250b3VycycuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhDb21wb3NpdGVQb2ludHMgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF4UG9pbnRzJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9zaXRlQ29udG91cnMgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYG1heENvbnRvdXJzJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFpvbmVzICAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygem9uZXMgdXNlZCBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFR3aWxpZ2h0UG9pbnRzICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdpbGlnaHQgem9uZSB1c2VkIGZvciBnbHlwaCBoaW50aW5nLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFN0b3JhZ2UgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSBhcmVhIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heEZ1bmN0aW9uRGVmcyAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb24gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgaW4gdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhJbnN0cnVjdGlvbkRlZnMgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zIGluIHRoZSBUcnVlVHlwZSBieXRlY29kZSBmb3IgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4U3RhY2tFbGVtZW50cyAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBlbGVtZW50cyB1c2VkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24uICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBUcnVlVHlwZSBvcGNvZGVzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9uZW50RWxlbWVudHMgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW1wbGUgKGkuZS4sIG5vbi0gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUpIGdseXBocyBpbiBhIGNvbXBvc2l0ZSBnbHlwaC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9uZW50RGVwdGggICAgIDo6IFRoZSBtYXhpbXVtIG5lc3RpbmcgZGVwdGggb2YgY29tcG9zaXRlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCBkdXJpbmcgZm9udCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX01heFByb2ZpbGVfCi0gIHsKLSAgICBGVF9GaXhlZCAgIHZlcnNpb247Ci0gICAgRlRfVVNob3J0ICBudW1HbHlwaHM7Ci0gICAgRlRfVVNob3J0ICBtYXhQb2ludHM7Ci0gICAgRlRfVVNob3J0ICBtYXhDb250b3VyczsKLSAgICBGVF9VU2hvcnQgIG1heENvbXBvc2l0ZVBvaW50czsKLSAgICBGVF9VU2hvcnQgIG1heENvbXBvc2l0ZUNvbnRvdXJzOwotICAgIEZUX1VTaG9ydCAgbWF4Wm9uZXM7Ci0gICAgRlRfVVNob3J0ICBtYXhUd2lsaWdodFBvaW50czsKLSAgICBGVF9VU2hvcnQgIG1heFN0b3JhZ2U7Ci0gICAgRlRfVVNob3J0ICBtYXhGdW5jdGlvbkRlZnM7Ci0gICAgRlRfVVNob3J0ICBtYXhJbnN0cnVjdGlvbkRlZnM7Ci0gICAgRlRfVVNob3J0ICBtYXhTdGFja0VsZW1lbnRzOwotICAgIEZUX1VTaG9ydCAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zOwotICAgIEZUX1VTaG9ydCAgbWF4Q29tcG9uZW50RWxlbWVudHM7Ci0gICAgRlRfVVNob3J0ICBtYXhDb21wb25lbnREZXB0aDsKLQotICB9IFRUX01heFByb2ZpbGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZm50X1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0byBzcGVjaWZ5IGluZGljZXMgb2YgU0ZOVCB0YWJsZXMgbG9hZGVkIGFuZCBwYXJzZWQgKi8KLSAgLyogICAgYnkgRnJlZVR5cGUgZHVyaW5nIGluaXRpYWxpemF0aW9uIG9mIGFuIFNGTlQgZm9udC4gIFVzZWQgaW4gdGhlICAgICovCi0gIC8qICAgIEBGVF9HZXRfU2ZudF9UYWJsZSBBUEkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfSEVBRCA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfSGVhZGVyIHN0cnVjdHVyZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9NQVhQIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9NYXhQcm9maWxlIHN0cnVjdHVyZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRk5UX09TMiAgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX09TMiBzdHJ1Y3R1cmUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfSEhFQSA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfSG9yaUhlYWRlciBzdHJ1Y3R1cmUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9WSEVBIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9WZXJ0SGVhZGVyIHN0cnVjdHVyZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRk5UX1BPU1QgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX1Bvc3RzY3JpcHQgc3RydWN0dXJlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfUENMVCA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfUENMVCBzdHJ1Y3R1cmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9TZm50X1RhZ18KLSAgewotICAgIEZUX1NGTlRfSEVBRCwKLSAgICBGVF9TRk5UX01BWFAsCi0gICAgRlRfU0ZOVF9PUzIsCi0gICAgRlRfU0ZOVF9ISEVBLAotICAgIEZUX1NGTlRfVkhFQSwKLSAgICBGVF9TRk5UX1BPU1QsCi0gICAgRlRfU0ZOVF9QQ0xULAotCi0gICAgRlRfU0ZOVF9NQVgKLQotICB9IEZUX1NmbnRfVGFnOwotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGBGVF9TZm50X1RhZycgKi8KLSAgLyogdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9zZm50X2hlYWQgIEZUX1NGTlRfSEVBRAotI2RlZmluZSBmdF9zZm50X21heHAgIEZUX1NGTlRfTUFYUAotI2RlZmluZSBmdF9zZm50X29zMiAgIEZUX1NGTlRfT1MyCi0jZGVmaW5lIGZ0X3NmbnRfaGhlYSAgRlRfU0ZOVF9ISEVBCi0jZGVmaW5lIGZ0X3NmbnRfdmhlYSAgRlRfU0ZOVF9WSEVBCi0jZGVmaW5lIGZ0X3NmbnRfcG9zdCAgRlRfU0ZOVF9QT1NUCi0jZGVmaW5lIGZ0X3NmbnRfcGNsdCAgRlRfU0ZOVF9QQ0xUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfU2ZudF9UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgZ2l2ZW4gU0ZOVCB0YWJsZSBzdG9yZWQgd2l0aGluIGEgZmFjZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgOjogVGhlIGluZGV4IG9mIHRoZSBTRk5UIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZS1sZXNzIHBvaW50ZXIgdG8gdGhlIHRhYmxlLiAgVGhpcyB3aWxsIGJlIE5VTEwgaW4gY2FzZSBvZiAgICAqLwotICAvKiAgICBlcnJvciwgb3IgaWYgdGhlIGNvcnJlc3BvbmRpbmcgdGFibGUgd2FzIG5vdCBmb3VuZCAqT1IqIGxvYWRlZCAgICAgKi8KLSAgLyogICAgZnJvbSB0aGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2UgYSB0eXBlY2FzdCBhY2NvcmRpbmcgdG8gYHRhZycgdG8gYWNjZXNzIHRoZSBzdHJ1Y3R1cmUgICAgICAgICAgKi8KLSAgLyogICAgZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHRhYmxlIGlzIG93bmVkIGJ5IHRoZSBmYWNlIG9iamVjdCBhbmQgZGlzYXBwZWFycyB3aXRoIGl0LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZnVsIHRvIGFjY2VzcyBTRk5UIHRhYmxlcyB0aGF0IGFyZSBsb2FkZWQgKi8KLSAgLyogICAgYnkgdGhlIHNmbnQsIHRydWV0eXBlLCBhbmQgb3BlbnR5cGUgZHJpdmVycy4gIFNlZSBARlRfU2ZudF9UYWcgZm9yICovCi0gIC8qICAgIGEgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBhbiBleGFtcGxlIGhvdyB0byBhY2Nlc3MgdGhlIGB2aGVhJyB0YWJsZTogICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUVF9WZXJ0SGVhZGVyKiAgdmVydF9oZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB2ZXJ0X2hlYWRlciA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAoVFRfVmVydEhlYWRlciopRlRfR2V0X1NmbnRfVGFibGUoIGZhY2UsIEZUX1NGTlRfVkhFQSApOyAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCogKQotICBGVF9HZXRfU2ZudF9UYWJsZSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TZm50X1RhZyAgdGFnICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0xvYWRfU2ZudF9UYWJsZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgTG9hZCBhbnkgU0ZOVCBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGZhY2UgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KLSAgICoKLSAgICogICB0YWcgOjoKLSAgICogICAgIFRoZSBmb3VyLWJ5dGUgdGFnIG9mIHRoZSB0YWJsZSB0byBsb2FkLiAgVXNlIHZhbHVlfjAgaWYgeW91IHdhbnQKLSAgICogICAgIHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLiAgT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlCi0gICAqICAgICBkZWZpbml0aW9ucyBmb3VuZCBpbiB0aGUgQEZUX1RSVUVUWVBFX1RBR1NfSCBmaWxlLCBvciBmb3JnZSBhIG5ldwotICAgKiAgICAgb25lIHdpdGggQEZUX01BS0VfVEFHLgotICAgKgotICAgKiAgIG9mZnNldCA6OgotICAgKiAgICAgVGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgdGFibGUgKG9yIGZpbGUgaWYgdGFnfj09fjApLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGJ1ZmZlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBidWZmZXIgYWRkcmVzcy4gIFRoZSBjbGllbnQgbXVzdCBlbnN1cmUgdGhhdCB0aGUgbWVtb3J5Ci0gICAqICAgICBhcnJheSBpcyBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGRhdGEuCi0gICAqCi0gICAqIEBpbm91dDoKLSAgICogICBsZW5ndGggOjoKLSAgICogICAgIElmIHRoZSBgbGVuZ3RoJyBwYXJhbWV0ZXIgaXMgTlVMTCwgdHJ5IHRvIGxvYWQgdGhlIHdob2xlIHRhYmxlLgotICAgKiAgICAgUmV0dXJuIGFuIGVycm9yIGNvZGUgaWYgaXQgZmFpbHMuCi0gICAqCi0gICAqICAgICBFbHNlLCBpZiBgKmxlbmd0aCcgaXN+MCwgZXhpdCBpbW1lZGlhdGVseSB3aGlsZSByZXR1cm5pbmcgdGhlCi0gICAqICAgICB0YWJsZSdzIChvciBmaWxlKSBmdWxsIHNpemUgaW4gaXQuCi0gICAqCi0gICAqICAgICBFbHNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSB0YWJsZSBvciBmaWxlLCBmcm9tIHRoZQotICAgKiAgICAgc3RhcnRpbmcgb2Zmc2V0LgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIHlvdSBuZWVkIHRvIGRldGVybWluZSB0aGUgdGFibGUncyBsZW5ndGggeW91IHNob3VsZCBmaXJzdCBjYWxsIHRoaXMKLSAgICogICBmdW5jdGlvbiB3aXRoIGAqbGVuZ3RoJyBzZXQgdG9+MCwgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgotICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBGVF9VTG9uZyAgbGVuZ3RoID0gMDsKLSAgICoKLSAgICoKLSAgICogICAgICAgZXJyb3IgPSBGVF9Mb2FkX1NmbnRfVGFibGUoIGZhY2UsIHRhZywgMCwgTlVMTCwgJmxlbmd0aCApOwotICAgKiAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gdGFibGUgZG9lcyBub3QgZXhpc3QgLi4uIH0KLSAgICoKLSAgICogICAgICAgYnVmZmVyID0gbWFsbG9jKCBsZW5ndGggKTsKLSAgICogICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsgLi4uIG5vdCBlbm91Z2ggbWVtb3J5IC4uLiB9Ci0gICAqCi0gICAqICAgICAgIGVycm9yID0gRlRfTG9hZF9TZm50X1RhYmxlKCBmYWNlLCB0YWcsIDAsIGJ1ZmZlciwgJmxlbmd0aCApOwotICAgKiAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gY291bGQgbm90IGxvYWQgdGFibGUgLi4uIH0KLSAgICogICAgIH0KLSAgICoKLSAgICogICBOb3RlIHRoYXQgc3RydWN0dXJlcyBsaWtlIEBUVF9IZWFkZXIgb3IgQFRUX09TMiBjYW4ndCBiZSB1c2VkIHdpdGgKLSAgICogICB0aGlzIGZ1bmN0aW9uOyB0aGV5IGFyZSBsaW1pdGVkIHRvIEBGVF9HZXRfU2ZudF9UYWJsZS4gIFJlYXNvbiBpcyB0aGF0Ci0gICAqICAgdGhvc2Ugc3RydWN0dXJlcyBkZXBlbmQgb24gdGhlIHByb2Nlc3NvciBhcmNoaXRlY3R1cmUsIHdpdGggdmFyeWluZwotICAgKiAgIHNpemUgKGUuZy4gMzJiaXQgdnMuIDY0Yml0KSBvciBvcmRlciAoYmlnIGVuZGlhbiB2cy4gbGl0dGxlIGVuZGlhbikuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTG9hZF9TZm50X1RhYmxlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU2ZudF9UYWJsZV9JbmZvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gaW5mb3JtYXRpb24gb24gYW4gU0ZOVCB0YWJsZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGZhY2UgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KLSAgICoKLSAgICogICB0YWJsZV9pbmRleCA6OgotICAgKiAgICAgVGhlIGluZGV4IG9mIGFuIFNGTlQgdGFibGUuICBUaGUgZnVuY3Rpb24gcmV0dXJucwotICAgKiAgICAgRlRfRXJyX1RhYmxlX01pc3NpbmcgZm9yIGFuIGludmFsaWQgdmFsdWUuCi0gICAqCi0gICAqIEBpbm91dDoKLSAgICogICB0YWcgOjoKLSAgICogICAgIFRoZSBuYW1lIHRhZyBvZiB0aGUgU0ZOVCB0YWJsZS4gIElmIHRoZSB2YWx1ZSBpcyBOVUxMLCBgdGFibGVfaW5kZXgnCi0gICAqICAgICBpcyBpZ25vcmVkLCBhbmQgYGxlbmd0aCcgcmV0dXJucyB0aGUgbnVtYmVyIG9mIFNGTlQgdGFibGVzIGluIHRoZQotICAgKiAgICAgZm9udC4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBsZW5ndGggOjoKLSAgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIFNGTlQgdGFibGUgKG9yIHRoZSBudW1iZXIgb2YgU0ZOVCB0YWJsZXMsIGRlcGVuZGluZwotICAgKiAgICAgb24gYHRhZycpLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFdoaWxlIHBhcnNpbmcgZm9udHMsIEZyZWVUeXBlIGhhbmRsZXMgU0ZOVCB0YWJsZXMgd2l0aCBsZW5ndGggemVybyBhcwotICAgKiAgIG1pc3NpbmcuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2ZudF9UYWJsZV9JbmZvKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICB0YWJsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKnRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKmxlbmd0aCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGNtYXAgbGFuZ3VhZ2UgSUQgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuVHlwZSBzdGFuZGFyZC4gICAgICovCi0gIC8qICAgIERlZmluaXRpb25zIG9mIGxhbmd1YWdlIElEIHZhbHVlcyBhcmUgaW4gZmlsZSBARlRfVFJVRVRZUEVfSURTX0guICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGFuZ3VhZ2UgSUQgb2YgYGNoYXJtYXAnLiAgSWYgYGNoYXJtYXAnIGRvZXNuJ3QgYmVsb25nIHRvIGFuICAgKi8KLSAgLyogICAgU0ZOVCBmYWNlLCBqdXN0IHJldHVybn4wIGFzIHRoZSBkZWZhdWx0IHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYSBmb3JtYXR+MTQgY21hcCAodG8gYWNjZXNzIFVuaWNvZGUgSVZTKSwgdGhlIHJldHVybiB2YWx1ZSBpcyAgKi8KLSAgLyogICAgMHhGRkZGRkZGRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VMb25nICkKLSAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DTWFwX0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZm9ybWF0IG9mIGFuIFNGTlQgYGNtYXAnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZm9ybWF0IG9mIGBjaGFybWFwJy4gIElmIGBjaGFybWFwJyBkb2Vzbid0IGJlbG9uZyB0byBhbiBTRk5UICAgKi8KLSAgLyogICAgZmFjZSwgcmV0dXJuIC0xLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0xvbmcgKQotICBGVF9HZXRfQ01hcF9Gb3JtYXQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFRUVEFCTEVTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oIGIvaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlYjJmZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0dGFncy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUYWdzIGZvciBUcnVlVHlwZSBhbmQgT3BlblR5cGUgdGFibGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUVEFHU19IXwotI2RlZmluZSBUVEFHU19IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIFRUQUdfYXZhciAgRlRfTUFLRV9UQUcoICdhJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfQkFTRSAgRlRfTUFLRV9UQUcoICdCJywgJ0EnLCAnUycsICdFJyApCi0jZGVmaW5lIFRUQUdfYmRhdCAgRlRfTUFLRV9UQUcoICdiJywgJ2QnLCAnYScsICd0JyApCi0jZGVmaW5lIFRUQUdfQkRGICAgRlRfTUFLRV9UQUcoICdCJywgJ0QnLCAnRicsICcgJyApCi0jZGVmaW5lIFRUQUdfYmhlZCAgRlRfTUFLRV9UQUcoICdiJywgJ2gnLCAnZScsICdkJyApCi0jZGVmaW5lIFRUQUdfYmxvYyAgRlRfTUFLRV9UQUcoICdiJywgJ2wnLCAnbycsICdjJyApCi0jZGVmaW5lIFRUQUdfYnNsbiAgRlRfTUFLRV9UQUcoICdiJywgJ3MnLCAnbCcsICduJyApCi0jZGVmaW5lIFRUQUdfQ0JEVCAgRlRfTUFLRV9UQUcoICdDJywgJ0InLCAnRCcsICdUJyApCi0jZGVmaW5lIFRUQUdfQ0JMQyAgRlRfTUFLRV9UQUcoICdDJywgJ0InLCAnTCcsICdDJyApCi0jZGVmaW5lIFRUQUdfQ0ZGICAgRlRfTUFLRV9UQUcoICdDJywgJ0YnLCAnRicsICcgJyApCi0jZGVmaW5lIFRUQUdfQ0ZGMiAgRlRfTUFLRV9UQUcoICdDJywgJ0YnLCAnRicsICcyJyApCi0jZGVmaW5lIFRUQUdfQ0lEICAgRlRfTUFLRV9UQUcoICdDJywgJ0knLCAnRCcsICcgJyApCi0jZGVmaW5lIFRUQUdfY21hcCAgRlRfTUFLRV9UQUcoICdjJywgJ20nLCAnYScsICdwJyApCi0jZGVmaW5lIFRUQUdfY3ZhciAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfY3Z0ICAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAndCcsICcgJyApCi0jZGVmaW5lIFRUQUdfRFNJRyAgRlRfTUFLRV9UQUcoICdEJywgJ1MnLCAnSScsICdHJyApCi0jZGVmaW5lIFRUQUdfRUJEVCAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnRCcsICdUJyApCi0jZGVmaW5lIFRUQUdfRUJMQyAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnTCcsICdDJyApCi0jZGVmaW5lIFRUQUdfRUJTQyAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnUycsICdDJyApCi0jZGVmaW5lIFRUQUdfZmVhdCAgRlRfTUFLRV9UQUcoICdmJywgJ2UnLCAnYScsICd0JyApCi0jZGVmaW5lIFRUQUdfRk9ORCAgRlRfTUFLRV9UQUcoICdGJywgJ08nLCAnTicsICdEJyApCi0jZGVmaW5lIFRUQUdfZnBnbSAgRlRfTUFLRV9UQUcoICdmJywgJ3AnLCAnZycsICdtJyApCi0jZGVmaW5lIFRUQUdfZnZhciAgRlRfTUFLRV9UQUcoICdmJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfZ2FzcCAgRlRfTUFLRV9UQUcoICdnJywgJ2EnLCAncycsICdwJyApCi0jZGVmaW5lIFRUQUdfR0RFRiAgRlRfTUFLRV9UQUcoICdHJywgJ0QnLCAnRScsICdGJyApCi0jZGVmaW5lIFRUQUdfZ2x5ZiAgRlRfTUFLRV9UQUcoICdnJywgJ2wnLCAneScsICdmJyApCi0jZGVmaW5lIFRUQUdfR1BPUyAgRlRfTUFLRV9UQUcoICdHJywgJ1AnLCAnTycsICdTJyApCi0jZGVmaW5lIFRUQUdfR1NVQiAgRlRfTUFLRV9UQUcoICdHJywgJ1MnLCAnVScsICdCJyApCi0jZGVmaW5lIFRUQUdfZ3ZhciAgRlRfTUFLRV9UQUcoICdnJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfSFZBUiAgRlRfTUFLRV9UQUcoICdIJywgJ1YnLCAnQScsICdSJyApCi0jZGVmaW5lIFRUQUdfaGRteCAgRlRfTUFLRV9UQUcoICdoJywgJ2QnLCAnbScsICd4JyApCi0jZGVmaW5lIFRUQUdfaGVhZCAgRlRfTUFLRV9UQUcoICdoJywgJ2UnLCAnYScsICdkJyApCi0jZGVmaW5lIFRUQUdfaGhlYSAgRlRfTUFLRV9UQUcoICdoJywgJ2gnLCAnZScsICdhJyApCi0jZGVmaW5lIFRUQUdfaG10eCAgRlRfTUFLRV9UQUcoICdoJywgJ20nLCAndCcsICd4JyApCi0jZGVmaW5lIFRUQUdfSlNURiAgRlRfTUFLRV9UQUcoICdKJywgJ1MnLCAnVCcsICdGJyApCi0jZGVmaW5lIFRUQUdfanVzdCAgRlRfTUFLRV9UQUcoICdqJywgJ3UnLCAncycsICd0JyApCi0jZGVmaW5lIFRUQUdfa2VybiAgRlRfTUFLRV9UQUcoICdrJywgJ2UnLCAncicsICduJyApCi0jZGVmaW5lIFRUQUdfbGNhciAgRlRfTUFLRV9UQUcoICdsJywgJ2MnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfbG9jYSAgRlRfTUFLRV9UQUcoICdsJywgJ28nLCAnYycsICdhJyApCi0jZGVmaW5lIFRUQUdfTFRTSCAgRlRfTUFLRV9UQUcoICdMJywgJ1QnLCAnUycsICdIJyApCi0jZGVmaW5lIFRUQUdfTFdGTiAgRlRfTUFLRV9UQUcoICdMJywgJ1cnLCAnRicsICdOJyApCi0jZGVmaW5lIFRUQUdfTUFUSCAgRlRfTUFLRV9UQUcoICdNJywgJ0EnLCAnVCcsICdIJyApCi0jZGVmaW5lIFRUQUdfbWF4cCAgRlRfTUFLRV9UQUcoICdtJywgJ2EnLCAneCcsICdwJyApCi0jZGVmaW5lIFRUQUdfTUVUQSAgRlRfTUFLRV9UQUcoICdNJywgJ0UnLCAnVCcsICdBJyApCi0jZGVmaW5lIFRUQUdfTU1GWCAgRlRfTUFLRV9UQUcoICdNJywgJ00nLCAnRicsICdYJyApCi0jZGVmaW5lIFRUQUdfTU1TRCAgRlRfTUFLRV9UQUcoICdNJywgJ00nLCAnUycsICdEJyApCi0jZGVmaW5lIFRUQUdfbW9ydCAgRlRfTUFLRV9UQUcoICdtJywgJ28nLCAncicsICd0JyApCi0jZGVmaW5lIFRUQUdfbW9yeCAgRlRfTUFLRV9UQUcoICdtJywgJ28nLCAncicsICd4JyApCi0jZGVmaW5lIFRUQUdfTVZBUiAgRlRfTUFLRV9UQUcoICdNJywgJ1YnLCAnQScsICdSJyApCi0jZGVmaW5lIFRUQUdfbmFtZSAgRlRfTUFLRV9UQUcoICduJywgJ2EnLCAnbScsICdlJyApCi0jZGVmaW5lIFRUQUdfb3BiZCAgRlRfTUFLRV9UQUcoICdvJywgJ3AnLCAnYicsICdkJyApCi0jZGVmaW5lIFRUQUdfT1MyICAgRlRfTUFLRV9UQUcoICdPJywgJ1MnLCAnLycsICcyJyApCi0jZGVmaW5lIFRUQUdfT1RUTyAgRlRfTUFLRV9UQUcoICdPJywgJ1QnLCAnVCcsICdPJyApCi0jZGVmaW5lIFRUQUdfUENMVCAgRlRfTUFLRV9UQUcoICdQJywgJ0MnLCAnTCcsICdUJyApCi0jZGVmaW5lIFRUQUdfUE9TVCAgRlRfTUFLRV9UQUcoICdQJywgJ08nLCAnUycsICdUJyApCi0jZGVmaW5lIFRUQUdfcG9zdCAgRlRfTUFLRV9UQUcoICdwJywgJ28nLCAncycsICd0JyApCi0jZGVmaW5lIFRUQUdfcHJlcCAgRlRfTUFLRV9UQUcoICdwJywgJ3InLCAnZScsICdwJyApCi0jZGVmaW5lIFRUQUdfcHJvcCAgRlRfTUFLRV9UQUcoICdwJywgJ3InLCAnbycsICdwJyApCi0jZGVmaW5lIFRUQUdfc2JpeCAgRlRfTUFLRV9UQUcoICdzJywgJ2InLCAnaScsICd4JyApCi0jZGVmaW5lIFRUQUdfc2ZudCAgRlRfTUFLRV9UQUcoICdzJywgJ2YnLCAnbicsICd0JyApCi0jZGVmaW5lIFRUQUdfU0lORyAgRlRfTUFLRV9UQUcoICdTJywgJ0knLCAnTicsICdHJyApCi0jZGVmaW5lIFRUQUdfdHJhayAgRlRfTUFLRV9UQUcoICd0JywgJ3InLCAnYScsICdrJyApCi0jZGVmaW5lIFRUQUdfdHJ1ZSAgRlRfTUFLRV9UQUcoICd0JywgJ3InLCAndScsICdlJyApCi0jZGVmaW5lIFRUQUdfdHRjICAgRlRfTUFLRV9UQUcoICd0JywgJ3QnLCAnYycsICcgJyApCi0jZGVmaW5lIFRUQUdfdHRjZiAgRlRfTUFLRV9UQUcoICd0JywgJ3QnLCAnYycsICdmJyApCi0jZGVmaW5lIFRUQUdfVFlQMSAgRlRfTUFLRV9UQUcoICdUJywgJ1knLCAnUCcsICcxJyApCi0jZGVmaW5lIFRUQUdfdHlwMSAgRlRfTUFLRV9UQUcoICd0JywgJ3knLCAncCcsICcxJyApCi0jZGVmaW5lIFRUQUdfVkRNWCAgRlRfTUFLRV9UQUcoICdWJywgJ0QnLCAnTScsICdYJyApCi0jZGVmaW5lIFRUQUdfdmhlYSAgRlRfTUFLRV9UQUcoICd2JywgJ2gnLCAnZScsICdhJyApCi0jZGVmaW5lIFRUQUdfdm10eCAgRlRfTUFLRV9UQUcoICd2JywgJ20nLCAndCcsICd4JyApCi0jZGVmaW5lIFRUQUdfVlZBUiAgRlRfTUFLRV9UQUcoICdWJywgJ1YnLCAnQScsICdSJyApCi0jZGVmaW5lIFRUQUdfd09GRiAgRlRfTUFLRV9UQUcoICd3JywgJ08nLCAnRicsICdGJyApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVFRBR1NfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvdHR1bnBhdC5oIGIvaW5jbHVkZS9mcmVldHlwZS90dHVucGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTQxNzAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS90dHVucGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHVucGF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVmaW5pdGlvbnMgZm9yIHRoZSB1bnBhdGVudGVkIFRydWVUeXBlIGhpbnRpbmcgc3lzdGVtLiAgICAgICAgICAgICAgKi8KLS8qICAgIE9ic29sZXRlLCByZXRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdyaXR0ZW4gYnkgR3JhaGFtIEFzaGVyIDxncmFoYW0uYXNoZXJAYnRpbnRlcm5ldC5jb20+ICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVFRVTlBBVF9IXwotI2RlZmluZSBUVFVOUEFUX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAY29uc3RhbnQ6Ci0gICogICBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBEZXByZWNhdGVkLgotICAqCi0gICogICBQcmV2aW91c2x5OiBBIGNvbnN0YW50IHVzZWQgYXMgdGhlIHRhZyBvZiBhbiBARlRfUGFyYW1ldGVyIHN0cnVjdHVyZSB0bwotICAqICAgaW5kaWNhdGUgdGhhdCB1bnBhdGVudGVkIG1ldGhvZHMgb25seSBzaG91bGQgYmUgdXNlZCBieSB0aGUgVHJ1ZVR5cGUKLSAgKiAgIGJ5dGVjb2RlIGludGVycHJldGVyIGZvciBhIHR5cGVmYWNlIG9wZW5lZCBieSBARlRfT3Blbl9GYWNlLgotICAqCi0gICovCi0jZGVmaW5lIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcgIEZUX01BS0VfVEFHKCAndScsICduJywgJ3AnLCAnYScgKQotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBUVFVOUEFUX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Z0MmJ1aWxkLmggYi9pbmNsdWRlL2Z0MmJ1aWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDgwOGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mdDJidWlsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnQyYnVpbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIDIgYnVpbGQgYW5kIHNldHVwIG1hY3Jvcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyB0aGUgYGVudHJ5IHBvaW50JyBmb3IgRnJlZVR5cGUgaGVhZGVyIGZpbGUgaW5jbHVzaW9ucy4gIEl0IGlzICovCi0gIC8qIHRoZSBvbmx5IGhlYWRlciBmaWxlIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBkaXJlY3RseTsgYWxsIG90aGVyICAgICAqLwotICAvKiBGcmVlVHlwZSBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggbWFjcm8gbmFtZXMgKGFmdGVyICAgICAgKi8KLSAgLyogaW5jbHVkaW5nIGBmdDJidWlsZC5oJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHR5cGljYWwgZXhhbXBsZSBpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlQyQlVJTERfSF8KLSNkZWZpbmUgRlQyQlVJTERfSF8KLQotI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oPgotCi0jZW5kaWYgLyogRlQyQlVJTERfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2dseXBodGVzdC9pbmRleC5odG1sIGIvaW5kZXguaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ2x5cGh0ZXN0L2luZGV4Lmh0bWwKcmVuYW1lIHRvIGluZGV4Lmh0bWwKZGlmZiAtLWdpdCBhL21vZHVsZXMuY2ZnIGIvbW9kdWxlcy5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzExMWUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy5jZmcKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotIyBtb2R1bGVzLmNmZwotIwotIyBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLSMKLSMKLSMgSW4gY2FzZSB5b3UgY29tcGlsZSB0aGUgRnJlZVR5cGUgbGlicmFyeSB3aXRoIEdOVSBtYWtlIG9yIG1ha2VwcCwgdGhpcwotIyBmaWxlIGNvbnRyb2xzIHdoaWNoIGNvbXBvbmVudHMgYXJlIGJ1aWx0IGludG8gdGhlIGxpYnJhcnkuICBPdGhlcndpc2UsCi0jIHBsZWFzZSByZWFkIHRoaXMgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIHZhcmlvdXMgbW9kdWxlcyBhbmQgaXRzCi0jIGRlcGVuZGVuY2llcywgdGhlbiBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgZmlsZSBgZG9jcy9JTlNUQUxMLkFOWScuCi0jCi0jIFRvIGRlYWN0aXZhdGUgYSBtb2R1bGUsIHNpbXBseSBjb21tZW50IG91dCB0aGUgY29ycmVzcG9uZGluZyBsaW5lLiAgVG8KLSMgYWN0aXZhdGUgYSBtb2R1bGUsIHJlbW92ZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIuCi0jCi0jIE5vdGUgdGhhdCBtYW55IG1vZHVsZXMgYW5kIGNvbXBvbmVudHMgYXJlIGZ1cnRoZXIgY29udHJvbGxlZCB3aXRoIG1hY3JvcwotIyBpbiB0aGUgZmlsZSBgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCcuCi0KLQotIyMjIwotIyMjIyBmb250IG1vZHVsZXMgLS0gYXQgbGVhc3Qgb25lIGlzIHJlcXVpcmVkCi0jIyMjCi0jIyMjICAgVGhlIG9yZGVyIGdpdmVuIGhlcmUgKGZyb20gdG9wIHRvIGRvd24pIGlzIHRoZSBvcmRlciB1c2VkIGZvciB0ZXN0aW5nCi0jIyMjICAgZm9udCBmb3JtYXRzIGluIHRoZSBjb21waWxlZCBsaWJyYXJ5LgotIyMjIwotCi0jIFRydWVUeXBlIGZvbnQgZHJpdmVyLgotIwotIyBUaGlzIGRyaXZlciBuZWVkcyB0aGUgYHNmbnQnIG1vZHVsZS4KLUZPTlRfTU9EVUxFUyArPSB0cnVldHlwZQotCi0jIFBvc3RTY3JpcHQgVHlwZSAxIGZvbnQgZHJpdmVyLgotIwotIyBUaGlzIGRyaXZlciBuZWVkcyB0aGUgYHBzYXV4JywgYHBzaGludGVyJywgYW5kIGBwc25hbWVzJyBtb2R1bGVzLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgotRk9OVF9NT0RVTEVTICs9IHR5cGUxCi0KLSMgQ0ZGL09wZW5UeXBlIGZvbnQgZHJpdmVyLgotIwotIyBUaGlzIGRyaXZlciBuZWVkcyB0aGUgYHNmbnQnLCBgcHNoaW50ZXInLCBhbmQgYHBzbmFtZXMnIG1vZHVsZXMuCi1GT05UX01PRFVMRVMgKz0gY2ZmCi0KLSMgVHlwZSAxIENJRC1rZXllZCBmb250IGRyaXZlci4KLSMKLSMgVGhpcyBkcml2ZXIgbmVlZHMgdGhlIGBwc2F1eCcsIGBwc2hpbnRlcicsIGFuZCBgcHNuYW1lcycgbW9kdWxlcy4KLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KLUZPTlRfTU9EVUxFUyArPSBjaWQKLQotIyBQRlIvVHJ1ZURvYyBmb250IGRyaXZlci4gIFNlZSBvcHRpb25hbCBleHRlbnNpb24gZnRwZnIuYyBiZWxvdyBhbHNvLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgotRk9OVF9NT0RVTEVTICs9IHBmcgotCi0jIFBvc3RTY3JpcHQgVHlwZSA0MiBmb250IGRyaXZlci4KLSMKLSMgVGhpcyBkcml2ZXIgbmVlZHMgdGhlIGB0cnVldHlwZScgYW5kIGBwc2F1eCcgbW9kdWxlcy4KLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KLUZPTlRfTU9EVUxFUyArPSB0eXBlNDIKLQotIyBXaW5kb3dzIEZPTlQvRk5UIGZvbnQgZHJpdmVyLiAgU2VlIG9wdGlvbmFsIGV4dGVuc2lvbiBmdHdpbmZudC5jIGJlbG93Ci0jIGFsc28uCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCi1GT05UX01PRFVMRVMgKz0gd2luZm9udHMKLQotIyBQQ0YgZm9udCBkcml2ZXIuCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCi1GT05UX01PRFVMRVMgKz0gcGNmCi0KLSMgQkRGIGZvbnQgZHJpdmVyLiAgU2VlIG9wdGlvbmFsIGV4dGVuc2lvbiBmdGJkZi5jIGJlbG93IGFsc28uCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCi1GT05UX01PRFVMRVMgKz0gYmRmCi0KLSMgU0ZOVCBmaWxlcyBzdXBwb3J0LiAgSWYgdXNlZCB3aXRob3V0IGB0cnVldHlwZScgb3IgYGNmZicsIGl0IHN1cHBvcnRzCi0jIGJpdG1hcC1vbmx5IGZvbnRzIHdpdGhpbiBhbiBTRk5UIHdyYXBwZXIuCi0jCi0jIFRoaXMgZHJpdmVyIG5lZWRzIHRoZSBgcHNuYW1lcycgbW9kdWxlLgotRk9OVF9NT0RVTEVTICs9IHNmbnQKLQotCi0jIyMjCi0jIyMjIGhpbnRpbmcgbW9kdWxlcwotIyMjIwotCi0jIEZyZWVUeXBlJ3MgYXV0byBoaW50ZXIuCi1ISU5USU5HX01PRFVMRVMgKz0gYXV0b2ZpdAotCi0jIFBvc3RTY3JpcHQgaGludGVyLgotSElOVElOR19NT0RVTEVTICs9IHBzaGludGVyCi0KLSMgVGhlIFRydWVUeXBlIGhpbnRpbmcgZW5naW5lIGRvZXNuJ3QgaGF2ZSBhIG1vZHVsZSBvZiBpdHMgb3duIGJ1dCBpcwotIyBjb250cm9sbGVkIGluIGZpbGUgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAotIyAoVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiBhbmQgZnJpZW5kcykuCi0KLQotIyMjIwotIyMjIyByYXN0ZXIgbW9kdWxlcyAtLSBhdCBsZWFzdCBvbmUgaXMgcmVxdWlyZWQgZm9yIHZlY3RvciBmb250IGZvcm1hdHMKLSMjIyMKLQotIyBNb25vY2hyb21lIHJhc3Rlcml6ZXIuCi1SQVNURVJfTU9EVUxFUyArPSByYXN0ZXIKLQotIyBBbnRpLWFsaWFzaW5nIHJhc3Rlcml6ZXIuCi1SQVNURVJfTU9EVUxFUyArPSBzbW9vdGgKLQotCi0jIyMjCi0jIyMjIGF1eGlsaWFyeSBtb2R1bGVzCi0jIyMjCi0KLSMgRnJlZVR5cGUncyBjYWNoZSBzdWItc3lzdGVtIChxdWl0ZSBzdGFibGUgYnV0IHN0aWxsIGluIGJldGEgLS0gdGhpcyBtZWFucwotIyB0aGF0IGl0cyBwdWJsaWMgQVBJIGlzIHN1YmplY3QgdG8gY2hhbmdlIGlmIG5lY2Vzc2FyeSkuICBTZWUKLSMgaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmguICBOZWVkcyBmdGdseXBoLmMuCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCi1BVVhfTU9EVUxFUyArPSBjYWNoZQotCi0jIFRydWVUeXBlIEdYL0FBVCB0YWJsZSB2YWxpZGF0aW9uLiAgTmVlZHMgZnRneHZhbC5jIGJlbG93LgotIwotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgotIyBBVVhfTU9EVUxFUyArPSBneHZhbGlkCi0KLSMgU3VwcG9ydCBmb3Igc3RyZWFtcyBjb21wcmVzc2VkIHdpdGggZ3ppcCAoZmlsZXMgd2l0aCBzdWZmaXggLmd6KS4KLSMKLSMgU2VlIGluY2x1ZGUvZnJlZXR5cGUvZnRnemlwLmggZm9yIHRoZSBBUEkuCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCi1BVVhfTU9EVUxFUyArPSBnemlwCi0KLSMgU3VwcG9ydCBmb3Igc3RyZWFtcyBjb21wcmVzc2VkIHdpdGggTFpXIChmaWxlcyB3aXRoIHN1ZmZpeCAuWikuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0bHp3LmggZm9yIHRoZSBBUEkuCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCi1BVVhfTU9EVUxFUyArPSBsencKLQotIyBTdXBwb3J0IGZvciBzdHJlYW1zIGNvbXByZXNzZWQgd2l0aCBiemlwMiAoZmlsZXMgd2l0aCBzdWZmaXggLmJ6MikuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaCBmb3IgdGhlIEFQSS4KLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KLUFVWF9NT0RVTEVTICs9IGJ6aXAyCi0KLSMgT3BlblR5cGUgdGFibGUgdmFsaWRhdGlvbi4gIE5lZWRzIGZ0b3R2YWwuYyBiZWxvdy4KLSMKLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KLSMgQVVYX01PRFVMRVMgKz0gb3R2YWxpZAotCi0jIEF1eGlsaWFyeSBQb3N0U2NyaXB0IGRyaXZlciBjb21wb25lbnQgdG8gc2hhcmUgY29tbW9uIGNvZGUuCi0jCi0jIFRoaXMgbW9kdWxlIGRlcGVuZHMgb24gYHBzbmFtZXMnLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgotQVVYX01PRFVMRVMgKz0gcHNhdXgKLQotIyBTdXBwb3J0IGZvciBQb3N0U2NyaXB0IGdseXBoIG5hbWVzLgotIwotIyBUaGlzIG1vZHVsZSBjYW4gYmUgY29udHJvbGxlZCBpbiBmdGNvbmZpZy5oCi0jIChGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMpLgotQVVYX01PRFVMRVMgKz0gcHNuYW1lcwotCi0KLSMjIyMKLSMjIyMgYmFzZSBtb2R1bGUgZXh0ZW5zaW9ucwotIyMjIwotCi0jIEV4YWN0IGJvdW5kaW5nIGJveCBjYWxjdWxhdGlvbi4KLSMKLSMgU2VlIGluY2x1ZGUvZnJlZXR5cGUvZnRiYm94LmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRiYm94LmMKLQotIyBBY2Nlc3MgQkRGLXNwZWNpZmljIHN0cmluZ3MuICBOZWVkcyBCREYgZm9udCBkcml2ZXIuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0YmRmLmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRiZGYuYwotCi0jIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIDFicHAsIDJicHAsIDRicHAsIGFuZCA4YnBwIGJpdG1hcHMgaW50bwotIyA4YnBwIGZvcm1hdCwgYW5kIGZvciBlbWJvbGRlbmluZyBvZiBiaXRtYXAgZ2x5cGhzLgotIwotIyBTZWUgaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oIGZvciB0aGUgQVBJLgotQkFTRV9FWFRFTlNJT05TICs9IGZ0Yml0bWFwLmMKLQotIyBBY2Nlc3MgQ0lEIGZvbnQgaW5mb3JtYXRpb24uCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2lkLmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRjaWQuYwotCi0jIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBmb250IGZvcm1hdHMuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0Zm50Zm10LmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRmbnRmbXQuYwotCi0jIEFjY2VzcyBGU1R5cGUgaW5mb3JtYXRpb24uICBOZWVkcyBmdHR5cGUxLmMuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRmc3R5cGUuYwotCi0jIFN1cHBvcnQgZm9yIEdBU1AgdGFibGUgcXVlcmllcy4KLSMKLSMgU2VlIGluY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRnYXNwLmMKLQotIyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGdseXBocy4gIE5lZWRzIGZ0Yml0bWFwLmMuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaCBmb3IgdGhlIEFQSS4KLUJBU0VfRVhURU5TSU9OUyArPSBmdGdseXBoLmMKLQotIyBJbnRlcmZhY2UgZm9yIGd4dmFsaWQgbW9kdWxlLgotIwotIyBTZWUgaW5jbHVkZS9mcmVldHlwZS9mdGd4dmFsLmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRneHZhbC5jCi0KLSMgU3VwcG9ydCBmb3IgTENEIGNvbG9yIGZpbHRlcmluZyBvZiBzdWJwaXhlbCBiaXRtYXBzLgotIwotIyBTZWUgaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oIGZvciB0aGUgQVBJLgotQkFTRV9FWFRFTlNJT05TICs9IGZ0bGNkZmlsLmMKLQotIyBNdWx0aXBsZSBNYXN0ZXIgZm9udCBpbnRlcmZhY2UuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaCBmb3IgdGhlIEFQSS4KLUJBU0VfRVhURU5TSU9OUyArPSBmdG1tLmMKLQotIyBJbnRlcmZhY2UgZm9yIG90dmFsaWQgbW9kdWxlLgotIwotIyBTZWUgaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRvdHZhbC5jCi0KLSMgU3VwcG9ydCBmb3IgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cy4KLSMKLSMgU2VlIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCBmb3IgdGhlIEFQSS4KLUJBU0VfRVhURU5TSU9OUyArPSBmdHBhdGVudC5jCi0KLSMgSW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgUEZSLXNwZWNpZmljIGRhdGEuICBOZWVkcyBQRlIgZm9udCBkcml2ZXIuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0cGZyLmggZm9yIHRoZSBBUEkuCi1CQVNFX0VYVEVOU0lPTlMgKz0gZnRwZnIuYwotCi0jIFBhdGggc3Ryb2tlci4gIE5lZWRzIGZ0Z2x5cGguYy4KLSMKLSMgU2VlIGluY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaCBmb3IgdGhlIEFQSS4KLUJBU0VfRVhURU5TSU9OUyArPSBmdHN0cm9rZS5jCi0KLSMgU3VwcG9ydCBmb3Igc3ludGhldGljIGVtYm9sZGVuaW5nIGFuZCBzbGFudGluZyBvZiBmb250cy4gIE5lZWRzIGZ0Yml0bWFwLmMuCi0jCi0jIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaCBmb3IgdGhlIEFQSS4KLUJBU0VfRVhURU5TSU9OUyArPSBmdHN5bnRoLmMKLQotIyBJbnRlcmZhY2UgdG8gYWNjZXNzIGRhdGEgc3BlY2lmaWMgdG8gUG9zdFNjcmlwdCBUeXBlIDEgYW5kIFR5cGUgMiAoQ0ZGKQotIyBmb250cy4KLSMKLSMgU2VlIGluY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCBmb3IgdGhlIEFQSS4KLUJBU0VfRVhURU5TSU9OUyArPSBmdHR5cGUxLmMKLQotIyBJbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBkYXRhIHNwZWNpZmljIHRvIFdpbmRvd3MgRk5UIGZpbGVzLiAgTmVlZHMgd2luZm50Ci0jIGRyaXZlci4KLSMKLSMgU2VlIGluY2x1ZGUvZnJlZXR5cGUvZnR3aW5mbnQuaCBmb3IgdGhlIEFQSS4KLUJBU0VfRVhURU5TSU9OUyArPSBmdHdpbmZudC5jCi0KLSMjIyMKLSMjIyMgVGhlIGNvbXBvbmVudHMgYGZ0c3lzdGVtLmMnIChmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIHN0cmVhbSBJL08KLSMjIyMgbWFuYWdlbWVudCkgYW5kIGBmdGRlYnVnLmMnIChmb3IgZW1pdHRpbmcgZGVidWcgbWVzc2FnZXMgdG8gdGhlIHVzZXIpCi0jIyMjIGFyZSBjb250cm9sbGVkIHdpdGggdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMuCi0jIyMjCi0jIyMjICAgZnRzeXN0ZW0uYzogICQoRlRTWVNfU1JDKQotIyMjIyAgIGZ0ZGVidWcuYzogICAkKEZUREVCVUdfU1JDKQotIyMjIwotIyMjIyBQbGVhc2UgcmVmZXIgdG8gZG9jcy9DVVNUT01JWkUgZm9yIGRldGFpbHMuCi0jIyMjCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL2dseXBodGVzdC9tdXJtdXIzLmMgYi9tdXJtdXIzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdseXBodGVzdC9tdXJtdXIzLmMKcmVuYW1lIHRvIG11cm11cjMuYwpkaWZmIC0tZ2l0IGEvZ2x5cGh0ZXN0L211cm11cjMuaCBiL211cm11cjMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ2x5cGh0ZXN0L211cm11cjMuaApyZW5hbWUgdG8gbXVybXVyMy5oCmRpZmYgLS1naXQgYS9vYmpzLy5naXRpZ25vcmUgYi9vYmpzLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjY3ZjYuLjAwMDAwMDAKLS0tIGEvb2Jqcy8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYXBpbmFtZXMKLWZyZWV0eXBlLmRlZgotZnJlZXR5cGUubGliCi1mdGV4cG9ydC5zeW0KLWZ0bW9kdWxlLmgKLWZ0b3B0aW9uLmgKLWxpYmZyZWV0eXBlLmxhCi0ubGlicwotKi5sbwotKi5vCi0qLmEKLWRlYnVnKi8KLXJlbGVhc2UqLwotd2luMzIvCi13aW42NC8KZGlmZiAtLWdpdCBhL29ianMvUkVBRE1FIGIvb2Jqcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmI2M2UuLjAwMDAwMDAKLS0tIGEvb2Jqcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGFsbCB0aGUgb2JqZWN0IGZpbGVzIGNyZWF0ZWQgd2hlbiBidWlsZGluZyB0aGUKLWxpYnJhcnkuCmRpZmYgLS1naXQgYS9nbHlwaHRlc3QvcmVhZG1lLnR4dCBiL3JlYWRtZS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdseXBodGVzdC9yZWFkbWUudHh0CnJlbmFtZSB0byByZWFkbWUudHh0CmRpZmYgLS1naXQgYS9zcmMvSmFtZmlsZSBiL3NyYy9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJjMDIyLi4wMDAwMDAwCi0tLSBhL3NyYy9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYyBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgOwotCi1mb3IgeHggaW4gJChGVDJfQ09NUE9ORU5UUykKLXsKLSAgU3ViSW5jbHVkZSBGVDJfVE9QICQoRlQyX1NSQ19ESVIpICQoeHgpIDsKLX0KLQotIyBlbmQgb2Ygc3JjIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L0phbWZpbGUgYi9zcmMvYXV0b2ZpdC9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTNkYzhhLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL2F1dG9maXQgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyIEZUMl9UT1Agc3JjIGF1dG9maXQgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgIyBkZWZpbmUgRlQyX0FVVE9GSVQyIHRvIGVuYWJsZSBleHBlcmltZW50YWwgbGF0aW4gaGludGVyIHJlcGxhY2VtZW50Ci0gIGlmICQoRlQyX0FVVE9GSVQyKQotICB7Ci0gICAgQ0NGTEFHUyArPSBGVF9PUFRJT05fQVVUT0ZJVDIgOwotICB9Ci0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBhZmFuZ2xlcwotICAgICAgICAgICAgICAgYWZibHVlCi0gICAgICAgICAgICAgICBhZmNqawotICAgICAgICAgICAgICAgYWZkdW1teQotICAgICAgICAgICAgICAgYWZnbG9iYWwKLSAgICAgICAgICAgICAgIGFmaGludHMKLSAgICAgICAgICAgICAgIGFmaW5kaWMKLSAgICAgICAgICAgICAgIGFmbGF0aW4KLSAgICAgICAgICAgICAgIGFmbG9hZGVyCi0gICAgICAgICAgICAgICBhZm1vZHVsZQotICAgICAgICAgICAgICAgYWZwaWMKLSAgICAgICAgICAgICAgIGFmcmFuZ2VzCi0gICAgICAgICAgICAgICBhZnNoYXBlcgotICAgICAgICAgICAgICAgYWZ3YXJwCi0gICAgICAgICAgICAgICA7Ci0KLSAgICBpZiAkKEZUMl9BVVRPRklUMikKLSAgICB7Ci0gICAgICBfc291cmNlcyArPSBhZmxhdGluMiA7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gYXV0b2ZpdCA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9hdXRvZml0IEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmYW5nbGVzLmMgYi9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2RhZTg0Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmYW5nbGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZhbmdsZXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFJvdXRpbmVzIHVzZWQgdG8gY29tcHV0ZSB2ZWN0b3IgYW5nbGVzIHdpdGggbGltaXRlZCBhY2N1cmFjeSAgICAgICAgICovCi0vKiAgICBhbmQgdmVyeSBoaWdoIHNwZWVkLiAgSXQgYWxzbyBjb250YWlucyBzb3J0aW5nIHJvdXRpbmVzIChib2R5KS4gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImFmdHlwZXMuaCIKLQotCi0gIC8qCi0gICAqICBXZSBhcmUgbm90IHVzaW5nIGBhZl9hbmdsZV9hdGFuJyBhbnltb3JlLCBidXQgd2Uga2VlcCB0aGUgc291cmNlCi0gICAqICBjb2RlIGJlbG93IGp1c3QgaW4gY2FzZS4uLgotICAgKi8KLQotCi0jaWYgMAotCi0KLSAgLyoKLSAgICogIFRoZSB0cmljayBoZXJlIGlzIHRvIHJlYWxpemUgdGhhdCB3ZSBkb24ndCBuZWVkIGEgdmVyeSBhY2N1cmF0ZSBhbmdsZQotICAgKiAgYXBwcm94aW1hdGlvbi4gIFdlIGFyZSBnb2luZyB0byB1c2UgdGhlIHJlc3VsdCBvZiBgYWZfYW5nbGVfYXRhbicgdG8KLSAgICogIG9ubHkgY29tcGFyZSB0aGUgc2lnbiBvZiBhbmdsZSBkaWZmZXJlbmNlcywgb3IgY2hlY2sgd2hldGhlciBpdHMKLSAgICogIG1hZ25pdHVkZSBpcyB2ZXJ5IHNtYWxsLgotICAgKgotICAgKiAgVGhlIGFwcHJveGltYXRpb24KLSAgICoKLSAgICogICAgZHkgKiBQSSAvICh8ZHh8K3xkeXwpCi0gICAqCi0gICAqICBzaG91bGQgYmUgZW5vdWdoLCBhbmQgbXVjaCBmYXN0ZXIgdG8gY29tcHV0ZS4KLSAgICovCi0gIEZUX0xPQ0FMX0RFRiggQUZfQW5nbGUgKQotICBhZl9hbmdsZV9hdGFuKCBGVF9GaXhlZCAgZHgsCi0gICAgICAgICAgICAgICAgIEZUX0ZpeGVkICBkeSApCi0gIHsKLSAgICBBRl9BbmdsZSAgYW5nbGU7Ci0gICAgRlRfRml4ZWQgIGF4ID0gZHg7Ci0gICAgRlRfRml4ZWQgIGF5ID0gZHk7Ci0KLQotICAgIGlmICggYXggPCAwICkKLSAgICAgIGF4ID0gLWF4OwotICAgIGlmICggYXkgPCAwICkKLSAgICAgIGF5ID0gLWF5OwotCi0gICAgYXggKz0gYXk7Ci0KLSAgICBpZiAoIGF4ID09IDAgKQotICAgICAgYW5nbGUgPSAwOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhbmdsZSA9ICggQUZfQU5HTEVfUEkyICogZHkgKSAvICggYXggKyBheSApOwotICAgICAgaWYgKCBkeCA8IDAgKQotICAgICAgewotICAgICAgICBpZiAoIGFuZ2xlID49IDAgKQotICAgICAgICAgIGFuZ2xlID0gQUZfQU5HTEVfUEkgLSBhbmdsZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGFuZ2xlID0gLUFGX0FOR0xFX1BJIC0gYW5nbGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGFuZ2xlOwotICB9Ci0KLQotI2VsaWYgMAotCi0KLSAgLyogdGhlIGZvbGxvd2luZyB0YWJsZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aXRoICovCi0gIC8qIHRoZSBgbWF0aGVyLnB5JyBQeXRob24gc2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEFGX0FUQU5fQklUUyAgOAotCi0gIHN0YXRpYyBjb25zdCBGVF9CeXRlICBhZl9hcmN0YW5bMUwgPDwgQUZfQVRBTl9CSVRTXSA9Ci0gIHsKLSAgICAgMCwgIDAsICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsCi0gICAgIDMsICAzLCAgMywgIDMsICA0LCAgNCwgIDQsICA1LAotICAgICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKLSAgICAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAxMCwgMTAsCi0gICAgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLAotICAgIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwKLSAgICAxNSwgMTUsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsCi0gICAgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDIwLAotICAgIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwKLSAgICAyMiwgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsCi0gICAgMjUsIDI1LCAyNSwgMjYsIDI2LCAyNiwgMjYsIDI3LAotICAgIDI3LCAyNywgMjgsIDI4LCAyOCwgMjgsIDI5LCAyOSwKLSAgICAyOSwgMzAsIDMwLCAzMCwgMzAsIDMxLCAzMSwgMzEsCi0gICAgMzEsIDMyLCAzMiwgMzIsIDMzLCAzMywgMzMsIDMzLAotICAgIDM0LCAzNCwgMzQsIDM0LCAzNSwgMzUsIDM1LCAzNSwKLSAgICAzNiwgMzYsIDM2LCAzNiwgMzcsIDM3LCAzNywgMzgsCi0gICAgMzgsIDM4LCAzOCwgMzksIDM5LCAzOSwgMzksIDQwLAotICAgIDQwLCA0MCwgNDAsIDQxLCA0MSwgNDEsIDQxLCA0MiwKLSAgICA0MiwgNDIsIDQyLCA0MiwgNDMsIDQzLCA0MywgNDMsCi0gICAgNDQsIDQ0LCA0NCwgNDQsIDQ1LCA0NSwgNDUsIDQ1LAotICAgIDQ2LCA0NiwgNDYsIDQ2LCA0NiwgNDcsIDQ3LCA0NywKLSAgICA0NywgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OSwgNDksCi0gICAgNDksIDQ5LCA1MCwgNTAsIDUwLCA1MCwgNTAsIDUxLAotICAgIDUxLCA1MSwgNTEsIDUxLCA1MiwgNTIsIDUyLCA1MiwKLSAgICA1MiwgNTMsIDUzLCA1MywgNTMsIDUzLCA1NCwgNTQsCi0gICAgNTQsIDU0LCA1NCwgNTUsIDU1LCA1NSwgNTUsIDU1LAotICAgIDU2LCA1NiwgNTYsIDU2LCA1NiwgNTcsIDU3LCA1NywKLSAgICA1NywgNTcsIDU3LCA1OCwgNTgsIDU4LCA1OCwgNTgsCi0gICAgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNjAsIDYwLAotICAgIDYwLCA2MCwgNjAsIDYxLCA2MSwgNjEsIDYxLCA2MSwKLSAgICA2MSwgNjIsIDYyLCA2MiwgNjIsIDYyLCA2MiwgNjMsCi0gICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2NCwgNjQsIDY0Ci0gIH07Ci0KLQotICBGVF9MT0NBTF9ERUYoIEFGX0FuZ2xlICkKLSAgYWZfYW5nbGVfYXRhbiggRlRfRml4ZWQgIGR4LAotICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgZHkgKQotICB7Ci0gICAgQUZfQW5nbGUgIGFuZ2xlOwotCi0KLSAgICAvKiBjaGVjayB0cml2aWFsIGNhc2VzICovCi0gICAgaWYgKCBkeSA9PSAwICkKLSAgICB7Ci0gICAgICBhbmdsZSA9IDA7Ci0gICAgICBpZiAoIGR4IDwgMCApCi0gICAgICAgIGFuZ2xlID0gQUZfQU5HTEVfUEk7Ci0gICAgICByZXR1cm4gYW5nbGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBkeCA9PSAwICkKLSAgICB7Ci0gICAgICBhbmdsZSA9IEFGX0FOR0xFX1BJMjsKLSAgICAgIGlmICggZHkgPCAwICkKLSAgICAgICAgYW5nbGUgPSAtQUZfQU5HTEVfUEkyOwotICAgICAgcmV0dXJuIGFuZ2xlOwotICAgIH0KLQotICAgIGFuZ2xlID0gMDsKLSAgICBpZiAoIGR4IDwgMCApCi0gICAgewotICAgICAgZHggPSAtZHg7Ci0gICAgICBkeSA9IC1keTsKLSAgICAgIGFuZ2xlID0gQUZfQU5HTEVfUEk7Ci0gICAgfQotCi0gICAgaWYgKCBkeSA8IDAgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgdG1wOwotCi0KLSAgICAgIHRtcCA9IGR4OwotICAgICAgZHggID0gLWR5OwotICAgICAgZHkgID0gdG1wOwotICAgICAgYW5nbGUgLT0gQUZfQU5HTEVfUEkyOwotICAgIH0KLQotICAgIGlmICggZHggPT0gMCAmJiBkeSA9PSAwICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCBkeCA9PSBkeSApCi0gICAgICBhbmdsZSArPSBBRl9BTkdMRV9QSTQ7Ci0gICAgZWxzZSBpZiAoIGR4ID4gZHkgKQotICAgICAgYW5nbGUgKz0gYWZfYXJjdGFuW0ZUX0RpdkZpeCggZHksIGR4ICkgPj4gKCAxNiAtIEFGX0FUQU5fQklUUyApXTsKLSAgICBlbHNlCi0gICAgICBhbmdsZSArPSBBRl9BTkdMRV9QSTIgLQotICAgICAgICAgICAgICAgYWZfYXJjdGFuW0ZUX0RpdkZpeCggZHgsIGR5ICkgPj4gKCAxNiAtIEFGX0FUQU5fQklUUyApXTsKLQotICAgIGlmICggYW5nbGUgPiBBRl9BTkdMRV9QSSApCi0gICAgICBhbmdsZSAtPSBBRl9BTkdMRV8yUEk7Ci0KLSAgICByZXR1cm4gYW5nbGU7Ci0gIH0KLQotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfc29ydF9wb3MoIEZUX1VJbnQgIGNvdW50LAotICAgICAgICAgICAgICAgRlRfUG9zKiAgdGFibGUgKQotICB7Ci0gICAgRlRfVUludCAgaSwgajsKLSAgICBGVF9Qb3MgICBzd2FwOwotCi0KLSAgICBmb3IgKCBpID0gMTsgaSA8IGNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIGZvciAoIGogPSBpOyBqID4gMDsgai0tICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCB0YWJsZVtqXSA+PSB0YWJsZVtqIC0gMV0gKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHN3YXAgICAgICAgICA9IHRhYmxlW2pdOwotICAgICAgICB0YWJsZVtqXSAgICAgPSB0YWJsZVtqIC0gMV07Ci0gICAgICAgIHRhYmxlW2ogLSAxXSA9IHN3YXA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9zb3J0X2FuZF9xdWFudGl6ZV93aWR0aHMoIEZUX1VJbnQqICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9XaWR0aCAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgIHRocmVzaG9sZCApCi0gIHsKLSAgICBGVF9VSW50ICAgICAgaSwgajsKLSAgICBGVF9VSW50ICAgICAgY3VyX2lkeDsKLSAgICBGVF9Qb3MgICAgICAgY3VyX3ZhbDsKLSAgICBGVF9Qb3MgICAgICAgc3VtOwotICAgIEFGX1dpZHRoUmVjICBzd2FwOwotCi0KLSAgICBpZiAoICpjb3VudCA9PSAxICkKLSAgICAgIHJldHVybjsKLQotICAgIC8qIHNvcnQgKi8KLSAgICBmb3IgKCBpID0gMTsgaSA8ICpjb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBmb3IgKCBqID0gaTsgaiA+IDA7IGotLSApCi0gICAgICB7Ci0gICAgICAgIGlmICggdGFibGVbal0ub3JnID49IHRhYmxlW2ogLSAxXS5vcmcgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHN3YXAgICAgICAgICA9IHRhYmxlW2pdOwotICAgICAgICB0YWJsZVtqXSAgICAgPSB0YWJsZVtqIC0gMV07Ci0gICAgICAgIHRhYmxlW2ogLSAxXSA9IHN3YXA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY3VyX2lkeCA9IDA7Ci0gICAgY3VyX3ZhbCA9IHRhYmxlW2N1cl9pZHhdLm9yZzsKLQotICAgIC8qIGNvbXB1dGUgYW5kIHVzZSBtZWFuIHZhbHVlcyBmb3IgY2x1c3RlcnMgbm90IGxhcmdlciB0aGFuICAqLwotICAgIC8qIGB0aHJlc2hvbGQnOyB0aGlzIGlzIHZlcnkgcHJpbWl0aXZlIGFuZCBtaWdodCBub3QgeWllbGQgICAqLwotICAgIC8qIHRoZSBiZXN0IHJlc3VsdCwgYnV0IG5vcm1hbGx5LCB1c2luZyByZWZlcmVuY2UgY2hhcmFjdGVyICAqLwotICAgIC8qIGBvJywgYCpjb3VudCcgaXMgMiwgc28gdGhlIGNvZGUgYmVsb3cgaXMgZnVsbHkgc3VmZmljaWVudCAqLwotICAgIGZvciAoIGkgPSAxOyBpIDwgKmNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIGlmICggdGFibGVbaV0ub3JnIC0gY3VyX3ZhbCA+IHRocmVzaG9sZCB8fAotICAgICAgICAgICBpID09ICpjb3VudCAtIDEgICAgICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgc3VtID0gMDsKLQotICAgICAgICAvKiBmaXggbG9vcCBmb3IgZW5kIG9mIGFycmF5ICovCi0gICAgICAgIGlmICggdGFibGVbaV0ub3JnIC0gY3VyX3ZhbCA8PSB0aHJlc2hvbGQgJiYKLSAgICAgICAgICAgICBpID09ICpjb3VudCAtIDEgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgaSsrOwotCi0gICAgICAgIGZvciAoIGogPSBjdXJfaWR4OyBqIDwgaTsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIHN1bSAgICAgICAgICs9IHRhYmxlW2pdLm9yZzsKLSAgICAgICAgICB0YWJsZVtqXS5vcmcgPSAwOwotICAgICAgICB9Ci0gICAgICAgIHRhYmxlW2N1cl9pZHhdLm9yZyA9IHN1bSAvIChGVF9Qb3MpajsKLQotICAgICAgICBpZiAoIGkgPCAqY291bnQgLSAxICkKLSAgICAgICAgewotICAgICAgICAgIGN1cl9pZHggPSBpICsgMTsKLSAgICAgICAgICBjdXJfdmFsID0gdGFibGVbY3VyX2lkeF0ub3JnOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY3VyX2lkeCA9IDE7Ci0KLSAgICAvKiBjb21wcmVzcyBhcnJheSB0byByZW1vdmUgemVybyB2YWx1ZXMgKi8KLSAgICBmb3IgKCBpID0gMTsgaSA8ICpjb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIHRhYmxlW2ldLm9yZyApCi0gICAgICAgIHRhYmxlW2N1cl9pZHgrK10gPSB0YWJsZVtpXTsKLSAgICB9Ci0KLSAgICAqY291bnQgPSBjdXJfaWR4OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5oIGIvc3JjL2F1dG9maXQvYWZhbmdsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzZjllMS4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vKgotICogIGFmYW5nbGVzLmgKLSAqCi0gKiAgVGhpcyBpcyBhIGR1bW15IGZpbGUsIHVzZWQgdG8gcGxlYXNlIHRoZSBidWlsZCBzeXN0ZW0uICBJdCBpcyBuZXZlcgotICogIGluY2x1ZGVkIGJ5IHRoZSBhdXRvLWZpdHRlciBzb3VyY2VzLgotICoKLSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZibHVlLmMgYi9zcmMvYXV0b2ZpdC9hZmJsdWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkZWFjZi4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmJsdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSBQZXJsIHNjcmlwdCBgYWZibHVlLnBsJywgKi8KLS8qIHVzaW5nIGRhdGEgZnJvbSBmaWxlIGBhZmJsdWUuZGF0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmJsdWUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgZGF0YSBmb3IgYmx1ZSBzdHJpbmdzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJhZnR5cGVzLmgiCi0KLQotICBGVF9MT0NBTF9BUlJBWV9ERUYoIGNoYXIgKQotICBhZl9ibHVlX3N0cmluZ3NbXSA9Ci0gIHsKLSAgICAvKiAqLwotICAgICdceEYwJywgJ1x4OUUnLCAnXHhBNCcsICdceDhDJywgJyAnLCAnXHhGMCcsICdceDlFJywgJ1x4QTQnLCAnXHg4NScsICcgJywgJ1x4RjAnLCAnXHg5RScsICdceEE0JywgJ1x4ODgnLCAnICcsICdceEYwJywgJ1x4OUUnLCAnXHhBNCcsICdceDhGJywgJyAnLCAnXHhGMCcsICdceDlFJywgJ1x4QTQnLCAnXHg5NCcsICcgJywgJ1x4RjAnLCAnXHg5RScsICdceEE0JywgJ1x4OUEnLCAgLyog8J6kjCDwnqSFIPCepIgg8J6kjyDwnqSUIPCepJogKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OUUnLCAnXHhBNCcsICdceDgyJywgJyAnLCAnXHhGMCcsICdceDlFJywgJ1x4QTQnLCAnXHg5NicsICAvKiDwnqSCIPCepJYgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OUUnLCAnXHhBNCcsICdceEFDJywgJyAnLCAnXHhGMCcsICdceDlFJywgJ1x4QTQnLCAnXHhBRScsICcgJywgJ1x4RjAnLCAnXHg5RScsICdceEE0JywgJ1x4QkInLCAnICcsICdceEYwJywgJ1x4OUUnLCAnXHhBNCcsICdceEJDJywgJyAnLCAnXHhGMCcsICdceDlFJywgJ1x4QTQnLCAnXHhCRScsICAvKiDwnqSsIPCepK4g8J6kuyDwnqS8IPCepL4gKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OUUnLCAnXHhBNCcsICdceEE0JywgJyAnLCAnXHhGMCcsICdceDlFJywgJ1x4QTQnLCAnXHhBOCcsICcgJywgJ1x4RjAnLCAnXHg5RScsICdceEE0JywgJ1x4QTknLCAnICcsICdceEYwJywgJ1x4OUUnLCAnXHhBNCcsICdceEFEJywgJyAnLCAnXHhGMCcsICdceDlFJywgJ1x4QTQnLCAnXHhCNCcsICcgJywgJ1x4RjAnLCAnXHg5RScsICdceEE0JywgJ1x4QjgnLCAnICcsICdceEYwJywgJ1x4OUUnLCAnXHhBNCcsICdceEJBJywgJyAnLCAnXHhGMCcsICdceDlFJywgJ1x4QTUnLCAnXHg4MCcsICAvKiDwnqSkIPCepKgg8J6kqSDwnqStIPCepLQg8J6kuCDwnqS6IPCepYAgKi8KLSAgICAnXDAnLAotICAgICdceEQ4JywgJ1x4QTcnLCAnICcsICdceEQ4JywgJ1x4QTUnLCAnICcsICdceEQ5JywgJ1x4ODQnLCAnICcsICdceEQ5JywgJ1x4ODMnLCAnICcsICdceEQ4JywgJ1x4QjcnLCAnICcsICdceEQ4JywgJ1x4QjgnLCAgLyog2Kcg2KUg2YQg2YMg2Lcg2LggKi8KLSAgICAnXDAnLAotICAgICdceEQ4JywgJ1x4QUEnLCAnICcsICdceEQ4JywgJ1x4QUInLCAnICcsICdceEQ4JywgJ1x4QjcnLCAnICcsICdceEQ4JywgJ1x4QjgnLCAnICcsICdceEQ5JywgJ1x4ODMnLCAgLyog2Kog2Ksg2Lcg2Lgg2YMgKi8KLSAgICAnXDAnLAotICAgICdceEQ5JywgJ1x4ODAnLCAgLyog2YAgKi8KLSAgICAnXDAnLAotICAgICdceEQ0JywgJ1x4QjEnLCAnICcsICdceEQ1JywgJ1x4ODQnLCAnICcsICdceEQ1JywgJ1x4OTInLCAnICcsICdceEQ1JywgJ1x4OEQnLCAnICcsICdceEQ0JywgJ1x4QjInLCAnICcsICdceEQ0JywgJ1x4QjMnLCAnICcsICdceEQ0JywgJ1x4QjQnLCAnICcsICdceEQ1JywgJ1x4OTUnLCAgLyog1LEg1YQg1ZIg1Y0g1LIg1LMg1LQg1ZUgKi8KLSAgICAnXDAnLAotICAgICdceEQ1JywgJ1x4OTInLCAnICcsICdceEQ1JywgJ1x4ODgnLCAnICcsICdceEQ0JywgJ1x4QjQnLCAnICcsICdceEQ1JywgJ1x4ODMnLCAnICcsICdceEQ1JywgJ1x4ODcnLCAnICcsICdceEQ1JywgJ1x4OEQnLCAnICcsICdceEQ1JywgJ1x4OEYnLCAnICcsICdceEQ1JywgJ1x4OTUnLCAgLyog1ZIg1Ygg1LQg1YMg1Ycg1Y0g1Y8g1ZUgKi8KLSAgICAnXDAnLAotICAgICdceEQ1JywgJ1x4QTUnLCAnICcsICdceEQ1JywgJ1x4QTcnLCAnICcsICdceEQ1JywgJ1x4QUInLCAnICcsICdceEQ1JywgJ1x4QjQnLCAnICcsICdceEQ1JywgJ1x4QkUnLCAnICcsICdceEQ2JywgJ1x4ODYnLCAnICcsICdceEQ1JywgJ1x4QjMnLCAgLyog1aUg1acg1asg1bQg1b4g1oYg1bMgKi8KLSAgICAnXDAnLAotICAgICdceEQ1JywgJ1x4QTEnLCAnICcsICdceEQ1JywgJ1x4QjUnLCAnICcsICdceEQ2JywgJ1x4ODInLCAnICcsICdceEQ1JywgJ1x4QkQnLCAnICcsICdceEQ1JywgJ1x4QTMnLCAnICcsICdceEQ1JywgJ1x4QjcnLCAnICcsICdceEQ2JywgJ1x4ODAnLCAnICcsICdceEQ2JywgJ1x4ODUnLCAgLyog1aEg1bUg1oIg1b0g1aMg1bcg1oAg1oUgKi8KLSAgICAnXDAnLAotICAgICdceEQ1JywgJ1x4QjAnLCAnICcsICdceEQ1JywgJ1x4QjgnLCAnICcsICdceEQ1JywgJ1x4QjMnLCAnICcsICdceEQ1JywgJ1x4QTEnLCAnICcsICdceEQ1JywgJ1x4QTUnLCAnICcsICdceEQ1JywgJ1x4QUUnLCAnICcsICdceEQ1JywgJ1x4QkQnLCAnICcsICdceEQ2JywgJ1x4ODUnLCAgLyog1bAg1bgg1bMg1aEg1aUg1a4g1b0g1oUgKi8KLSAgICAnXDAnLAotICAgICdceEQ1JywgJ1x4QTInLCAnICcsICdceEQ1JywgJ1x4QTgnLCAnICcsICdceEQ1JywgJ1x4QUInLCAnICcsICdceEQ1JywgJ1x4QUMnLCAnICcsICdceEQ1JywgJ1x4QjInLCAnICcsICdceEQ1JywgJ1x4QkEnLCAnICcsICdceEQ2JywgJ1x4ODMnLCAnICcsICdceEQ2JywgJ1x4ODEnLCAgLyog1aIg1agg1asg1awg1bIg1bog1oMg1oEgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHhBQycsICdceDgwJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QUMnLCAnXHg4MScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEFDJywgJ1x4OTAnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHhBQycsICdceDlCJywgIC8qIPCQrIAg8JCsgSDwkKyQIPCQrJsgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHhBQycsICdceDgwJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QUMnLCAnXHg4MScsICAvKiDwkKyAIPCQrIEgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4OUEnLCAnXHhBNycsICcgJywgJ1x4RUEnLCAnXHg5QScsICdceEE4JywgJyAnLCAnXHhFQScsICdceDlCJywgJ1x4OUInLCAnICcsICdceEVBJywgJ1x4OUInLCAnXHg4OScsICcgJywgJ1x4RUEnLCAnXHg5QicsICdceDgxJywgJyAnLCAnXHhFQScsICdceDlCJywgJ1x4ODgnLCAnICcsICdceEVBJywgJ1x4OUInLCAnXHhBQicsICcgJywgJ1x4RUEnLCAnXHg5QicsICdceEFGJywgIC8qIOqapyDqmqgg6pubIOqbiSDqm4Eg6puIIOqbqyDqm68gKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4OUEnLCAnXHhBRCcsICcgJywgJ1x4RUEnLCAnXHg5QScsICdceEIzJywgJyAnLCAnXHhFQScsICdceDlBJywgJ1x4QjYnLCAnICcsICdceEVBJywgJ1x4OUInLCAnXHhBQycsICcgJywgJ1x4RUEnLCAnXHg5QScsICdceEEyJywgJyAnLCAnXHhFQScsICdceDlBJywgJ1x4QkQnLCAnICcsICdceEVBJywgJ1x4OUInLCAnXHhBRicsICcgJywgJ1x4RUEnLCAnXHg5QicsICdceEIyJywgIC8qIOqarSDqmrMg6pq2IOqbrCDqmqIg6pq9IOqbryDqm7IgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTYnLCAnXHg4NScsICcgJywgJ1x4RTAnLCAnXHhBNicsICdceEExJywgJyAnLCAnXHhFMCcsICdceEE2JywgJ1x4QTQnLCAnICcsICdceEUwJywgJ1x4QTYnLCAnXHhBOCcsICcgJywgJ1x4RTAnLCAnXHhBNicsICdceEFDJywgJyAnLCAnXHhFMCcsICdceEE2JywgJ1x4QUQnLCAnICcsICdceEUwJywgJ1x4QTYnLCAnXHhCMicsICcgJywgJ1x4RTAnLCAnXHhBNicsICdceDk1JywgIC8qIOCmhSDgpqEg4KakIOCmqCDgpqwg4KatIOCmsiDgppUgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTYnLCAnXHg4NycsICcgJywgJ1x4RTAnLCAnXHhBNicsICdceDlGJywgJyAnLCAnXHhFMCcsICdceEE2JywgJ1x4QTAnLCAnICcsICdceEUwJywgJ1x4QTYnLCAnXHhCRicsICcgJywgJ1x4RTAnLCAnXHhBNycsICdceDgwJywgJyAnLCAnXHhFMCcsICdceEE3JywgJ1x4ODgnLCAnICcsICdceEUwJywgJ1x4QTcnLCAnXHg5NycsICAvKiDgpocg4KafIOCmoCDgpr8g4KeAIOCniCDgp5cgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTYnLCAnXHg5MycsICcgJywgJ1x4RTAnLCAnXHhBNicsICdceDhGJywgJyAnLCAnXHhFMCcsICdceEE2JywgJ1x4QTEnLCAnICcsICdceEUwJywgJ1x4QTYnLCAnXHhBNCcsICcgJywgJ1x4RTAnLCAnXHhBNicsICdceEE4JywgJyAnLCAnXHhFMCcsICdceEE2JywgJ1x4QUMnLCAnICcsICdceEUwJywgJ1x4QTYnLCAnXHhCMicsICcgJywgJ1x4RTAnLCAnXHhBNicsICdceDk1JywgIC8qIOCmkyDgpo8g4KahIOCmpCDgpqgg4KasIOCmsiDgppUgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUQnLCAnXHg5MCcsICcgJywgJ1x4RTEnLCAnXHg5RCcsICdceDg4JywgIC8qIOGdkCDhnYggKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUQnLCAnXHg4NScsICcgJywgJ1x4RTEnLCAnXHg5RCcsICdceDhBJywgJyAnLCAnXHhFMScsICdceDlEJywgJ1x4OEUnLCAgLyog4Z2FIOGdiiDhnY4gKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUQnLCAnXHg4MicsICcgJywgJ1x4RTEnLCAnXHg5RCcsICdceDgzJywgJyAnLCAnXHhFMScsICdceDlEJywgJ1x4ODknLCAnICcsICdceEUxJywgJ1x4OUQnLCAnXHg4QycsICAvKiDhnYIg4Z2DIOGdiSDhnYwgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUQnLCAnXHg4MCcsICcgJywgJ1x4RTEnLCAnXHg5RCcsICdceDgzJywgJyAnLCAnXHhFMScsICdceDlEJywgJ1x4ODYnLCAnICcsICdceEUxJywgJ1x4OUQnLCAnXHg4OScsICcgJywgJ1x4RTEnLCAnXHg5RCcsICdceDhCJywgJyAnLCAnXHhFMScsICdceDlEJywgJ1x4OEYnLCAnICcsICdceEUxJywgJ1x4OUQnLCAnXHg5MScsICAvKiDhnYAg4Z2DIOGdhiDhnYkg4Z2LIOGdjyDhnZEgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OTcnLCAnXHg5QycsICcgJywgJ1x4RTEnLCAnXHg5NicsICdceEI0JywgJyAnLCAnXHhFMScsICdceDkwJywgJ1x4ODEnLCAnICcsICdceEUxJywgJ1x4OTInLCAnXHhBMycsICcgJywgJ1x4RTEnLCAnXHg5MScsICdceEFCJywgJyAnLCAnXHhFMScsICdceDkxJywgJ1x4OEUnLCAnICcsICdceEUxJywgJ1x4OTQnLCAnXHg5MScsICcgJywgJ1x4RTEnLCAnXHg5NycsICdceEIwJywgIC8qIOGXnCDhlrQg4ZCBIOGSoyDhkasg4ZGOIOGUkSDhl7AgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OTcnLCAnXHhCNicsICcgJywgJ1x4RTEnLCAnXHg5NicsICdceEI1JywgJyAnLCAnXHhFMScsICdceDkyJywgJ1x4QTcnLCAnICcsICdceEUxJywgJ1x4OTAnLCAnXHg4MycsICcgJywgJ1x4RTEnLCAnXHg5MScsICdceDhDJywgJyAnLCAnXHhFMScsICdceDkyJywgJ1x4OEQnLCAnICcsICdceEUxJywgJ1x4OTQnLCAnXHg5MScsICcgJywgJ1x4RTEnLCAnXHg5NycsICdceEEyJywgIC8qIOGXtiDhlrUg4ZKnIOGQgyDhkYwg4ZKNIOGUkSDhl6IgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OTMnLCAnXHg5MycsICcgJywgJ1x4RTEnLCAnXHg5MycsICdceDk1JywgJyAnLCAnXHhFMScsICdceDkzJywgJ1x4ODAnLCAnICcsICdceEUxJywgJ1x4OTMnLCAnXHg4MicsICcgJywgJ1x4RTEnLCAnXHg5MycsICdceDg0JywgJyAnLCAnXHhFMScsICdceDk1JywgJ1x4ODQnLCAnICcsICdceEUxJywgJ1x4OTUnLCAnXHg4NicsICcgJywgJ1x4RTEnLCAnXHg5OCcsICdceEEzJywgIC8qIOGTkyDhk5Ug4ZOAIOGTgiDhk4Qg4ZWEIOGVhiDhmKMgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OTUnLCAnXHg4MycsICcgJywgJ1x4RTEnLCAnXHg5MycsICdceDgyJywgJyAnLCAnXHhFMScsICdceDkzJywgJ1x4ODAnLCAnICcsICdceEUxJywgJ1x4OTUnLCAnXHg4MicsICcgJywgJ1x4RTEnLCAnXHg5MycsICdceDk3JywgJyAnLCAnXHhFMScsICdceDkzJywgJ1x4OUEnLCAnICcsICdceEUxJywgJ1x4OTUnLCAnXHg4NicsICcgJywgJ1x4RTEnLCAnXHg5OCcsICdceEEzJywgIC8qIOGVgyDhk4Ig4ZOAIOGVgiDhk5cg4ZOaIOGVhiDhmKMgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OTAnLCAnXHhBQScsICcgJywgJ1x4RTEnLCAnXHg5OScsICdceDg2JywgJyAnLCAnXHhFMScsICdceEEzJywgJ1x4OTgnLCAnICcsICdceEUxJywgJ1x4OTAnLCAnXHhBMicsICcgJywgJ1x4RTEnLCAnXHg5MicsICdceEJFJywgJyAnLCAnXHhFMScsICdceEEzJywgJ1x4OTcnLCAnICcsICdceEUxJywgJ1x4OTQnLCAnXHg4NicsICAvKiDhkKog4ZmGIOGjmCDhkKIg4ZK+IOGjlyDhlIYgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OTknLCAnXHg4NicsICcgJywgJ1x4RTEnLCAnXHg5NycsICdceEFFJywgJyAnLCAnXHhFMScsICdceDkyJywgJ1x4QkInLCAnICcsICdceEUxJywgJ1x4OTAnLCAnXHg5RScsICcgJywgJ1x4RTEnLCAnXHg5NCcsICdceDg2JywgJyAnLCAnXHhFMScsICdceDkyJywgJ1x4QTEnLCAnICcsICdceEUxJywgJ1x4OTInLCAnXHhBMicsICcgJywgJ1x4RTEnLCAnXHg5MycsICdceDkxJywgIC8qIOGZhiDhl64g4ZK7IOGQniDhlIYg4ZKhIOGSoiDhk5EgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg4QScsICdceEE3JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEEnLCAnXHhBQicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDhBJywgJ1x4QUMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg4QScsICdceEFEJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEEnLCAnXHhCMScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDhBJywgJ1x4QkEnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg4QScsICdceEJDJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEEnLCAnXHhCRicsICAvKiDwkIqnIPCQiqsg8JCKrCDwkIqtIPCQirEg8JCKuiDwkIq8IPCQir8gKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg4QScsICdceEEzJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEEnLCAnXHhBNycsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDhBJywgJ1x4QjcnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg4QicsICdceDgwJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEEnLCAnXHhBQicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDhBJywgJ1x4QjgnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg4QicsICdceDg5JywgIC8qIPCQiqMg8JCKpyDwkIq3IPCQi4Ag8JCKqyDwkIq4IPCQi4kgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceDgzJywgJyAnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHg4NScsICcgJywgJ1x4RjAnLCAnXHg5MScsICdceDg0JywgJ1x4ODknLCAnICcsICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceDk5JywgJyAnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHg5NycsICAvKiDwkYSDIPCRhIUg8JGEiSDwkYSZIPCRhJcgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceDg1JywgJyAnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHg5QicsICcgJywgJ1x4RjAnLCAnXHg5MScsICdceDg0JywgJ1x4OUQnLCAnICcsICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceDk3JywgJyAnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHg5MycsICAvKiDwkYSFIPCRhJsg8JGEnSDwkYSXIPCRhJMgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceDk2JywgJ1x4RjAnLCAnXHg5MScsICdceDg0JywgJ1x4QjMnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHhBMicsICcgJywgJ1x4RjAnLCAnXHg5MScsICdceDg0JywgJ1x4OTgnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHhCMycsICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceEEyJywgJyAnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHg5OScsICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceEIzJywgJ1x4RjAnLCAnXHg5MScsICdceDg0JywgJ1x4QTInLCAnICcsICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceEE0JywgJ1x4RjAnLCAnXHg5MScsICdceDg0JywgJ1x4QjMnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHhBMicsICcgJywgJ1x4RjAnLCAnXHg5MScsICdceDg0JywgJ1x4QTUnLCAnXHhGMCcsICdceDkxJywgJ1x4ODQnLCAnXHhCMycsICdceEYwJywgJ1x4OTEnLCAnXHg4NCcsICdceEEyJywgIC8qIPCRhJbwkYSz8JGEoiDwkYSY8JGEs/CRhKIg8JGEmfCRhLPwkYSiIPCRhKTwkYSz8JGEoiDwkYSl8JGEs/CRhKIgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OEYnLCAnXHg4NicsICcgJywgJ1x4RTEnLCAnXHg4RScsICdceEJCJywgJyAnLCAnXHhFMScsICdceDhFJywgJ1x4QUMnLCAnICcsICdceEUxJywgJ1x4OEYnLCAnXHg4MycsICcgJywgJ1x4RTEnLCAnXHg4RScsICdceEE0JywgJyAnLCAnXHhFMScsICdceDhGJywgJ1x4QTMnLCAnICcsICdceEUxJywgJ1x4OEUnLCAnXHhBNicsICcgJywgJ1x4RTEnLCAnXHg4RicsICdceDk1JywgIC8qIOGPhiDhjrsg4Y6sIOGPgyDhjqQg4Y+jIOGOpiDhj5UgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QUUnLCAnXHg5MicsICcgJywgJ1x4RUEnLCAnXHhBRScsICdceEE0JywgJyAnLCAnXHhFQScsICdceEFFJywgJ1x4QjYnLCAnICcsICdceEVBJywgJ1x4QUQnLCAnXHhCNCcsICcgJywgJ1x4RUEnLCAnXHhBRCcsICdceEJFJywgJyAnLCAnXHhFQScsICdceEFFJywgJ1x4OTcnLCAnICcsICdceEVBJywgJ1x4QUUnLCAnXHg5RCcsICcgJywgJ1x4RUEnLCAnXHhBRScsICdceEJGJywgIC8qIOqukiDqrqQg6q62IOqttCDqrb4g6q6XIOqunSDqrr8gKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QUUnLCAnXHg5NicsICcgJywgJ1x4RUEnLCAnXHhBRCcsICdceEJDJywgJyAnLCAnXHhFQScsICdceEFFJywgJ1x4OTMnLCAnICcsICdceEVBJywgJ1x4QUUnLCAnXHhBMCcsICcgJywgJ1x4RUEnLCAnXHhBRScsICdceEIzJywgJyAnLCAnXHhFQScsICdceEFEJywgJ1x4QjYnLCAnICcsICdceEVBJywgJ1x4QUUnLCAnXHhBNScsICcgJywgJ1x4RUEnLCAnXHhBRScsICdceEJCJywgIC8qIOquliDqrbwg6q6TIOquoCDqrrMg6q22IOqupSDqrrsgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OEYnLCAnXHhCOCcsICcgJywgJ1x4RUEnLCAnXHhBRScsICdceDkwJywgJyAnLCAnXHhFQScsICdceEFEJywgJ1x4QjknLCAnICcsICdceEVBJywgJ1x4QUQnLCAnXHhCQicsICAvKiDhj7gg6q6QIOqtuSDqrbsgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjInLCAnXHg4QycsICcgJywgJ1x4RTInLCAnXHhCMicsICdceDhFJywgJyAnLCAnXHhFMicsICdceEIyJywgJ1x4QTAnLCAnICcsICdceEUyJywgJ1x4QjMnLCAnXHg5RScsICcgJywgJ1x4RTInLCAnXHhCMicsICdceDlFJywgJyAnLCAnXHhFMicsICdceEIyJywgJ1x4OTAnLCAnICcsICdceEUyJywgJ1x4QjInLCAnXHhBNCcsICcgJywgJ1x4RTInLCAnXHhCMycsICdceDhBJywgIC8qIOKyjCDiso4g4rKgIOKzniDisp4g4rKQIOKypCDis4ogKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjMnLCAnXHg5MCcsICcgJywgJ1x4RTInLCAnXHhCMycsICdceDk4JywgJyAnLCAnXHhFMicsICdceEIzJywgJ1x4OUUnLCAnICcsICdceEUyJywgJ1x4QjInLCAnXHg4RScsICcgJywgJ1x4RTInLCAnXHhCMicsICdceDlFJywgJyAnLCAnXHhFMicsICdceEIyJywgJ1x4OTAnLCAnICcsICdceEUyJywgJ1x4QjMnLCAnXHg5QycsICcgJywgJ1x4RTInLCAnXHhCMicsICdceEIwJywgIC8qIOKzkCDis5gg4rOeIOKyjiDisp4g4rKQIOKznCDisrAgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjInLCAnXHg4RCcsICcgJywgJ1x4RTInLCAnXHhCMicsICdceDhGJywgJyAnLCAnXHhFMicsICdceEIyJywgJ1x4QTEnLCAnICcsICdceEUyJywgJ1x4QjMnLCAnXHg5RicsICcgJywgJ1x4RTInLCAnXHhCMicsICdceDlGJywgJyAnLCAnXHhFMicsICdceEIyJywgJ1x4OTEnLCAnICcsICdceEUyJywgJ1x4QjInLCAnXHhBNScsICcgJywgJ1x4RTInLCAnXHhCMycsICdceDhCJywgIC8qIOKyjSDiso8g4rKhIOKznyDisp8g4rKRIOKypSDis4sgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjMnLCAnXHg5MScsICcgJywgJ1x4RTInLCAnXHhCMycsICdceDk5JywgJyAnLCAnXHhFMicsICdceEIzJywgJ1x4OUYnLCAnICcsICdceEUyJywgJ1x4QjInLCAnXHg4RicsICcgJywgJ1x4RTInLCAnXHhCMicsICdceDlGJywgJyAnLCAnXHhFMicsICdceEIyJywgJ1x4OTEnLCAnICcsICdceEUyJywgJ1x4QjMnLCAnXHg5RCcsICcgJywgJ1x4RTInLCAnXHhCMycsICdceDkyJywgIC8qIOKzkSDis5kg4rOfIOKyjyDisp8g4rKRIOKznSDis5IgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHhBMCcsICdceDhEJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QTAnLCAnXHg5OScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEEwJywgJ1x4QjMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHhBMCcsICdceEIxJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QTAnLCAnXHg4NScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEEwJywgJ1x4OTMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHhBMCcsICdceEEzJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QTAnLCAnXHhBNicsICAvKiDwkKCNIPCQoJkg8JCgsyDwkKCxIPCQoIUg8JCgkyDwkKCjIPCQoKYgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHhBMCcsICdceDgzJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QTAnLCAnXHg4QScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEEwJywgJ1x4OUInLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHhBMCcsICdceEEzJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QTAnLCAnXHhCMycsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEEwJywgJ1x4QjUnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHhBMCcsICdceDkwJywgIC8qIPCQoIMg8JCgiiDwkKCbIPCQoKMg8JCgsyDwkKC1IPCQoJAgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHhBMCcsICdceDg4JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QTAnLCAnXHg4RicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEEwJywgJ1x4OTYnLCAgLyog8JCgiCDwkKCPIPCQoJYgKi8KLSAgICAnXDAnLAotICAgICdceEQwJywgJ1x4OTEnLCAnICcsICdceEQwJywgJ1x4OTInLCAnICcsICdceEQwJywgJ1x4OTUnLCAnICcsICdceEQwJywgJ1x4OUYnLCAnICcsICdceEQwJywgJ1x4OTcnLCAnICcsICdceEQwJywgJ1x4OUUnLCAnICcsICdceEQwJywgJ1x4QTEnLCAnICcsICdceEQwJywgJ1x4QUQnLCAgLyog0JEg0JIg0JUg0J8g0Jcg0J4g0KEg0K0gKi8KLSAgICAnXDAnLAotICAgICdceEQwJywgJ1x4OTEnLCAnICcsICdceEQwJywgJ1x4OTInLCAnICcsICdceEQwJywgJ1x4OTUnLCAnICcsICdceEQwJywgJ1x4QTgnLCAnICcsICdceEQwJywgJ1x4OTcnLCAnICcsICdceEQwJywgJ1x4OUUnLCAnICcsICdceEQwJywgJ1x4QTEnLCAnICcsICdceEQwJywgJ1x4QUQnLCAgLyog0JEg0JIg0JUg0Kgg0Jcg0J4g0KEg0K0gKi8KLSAgICAnXDAnLAotICAgICdceEQxJywgJ1x4ODUnLCAnICcsICdceEQwJywgJ1x4QkYnLCAnICcsICdceEQwJywgJ1x4QkQnLCAnICcsICdceEQxJywgJ1x4ODgnLCAnICcsICdceEQwJywgJ1x4QjUnLCAnICcsICdceEQwJywgJ1x4QjcnLCAnICcsICdceEQwJywgJ1x4QkUnLCAnICcsICdceEQxJywgJ1x4ODEnLCAgLyog0YUg0L8g0L0g0Ygg0LUg0Lcg0L4g0YEgKi8KLSAgICAnXDAnLAotICAgICdceEQxJywgJ1x4ODAnLCAnICcsICdceEQxJywgJ1x4ODMnLCAnICcsICdceEQxJywgJ1x4ODQnLCAgLyog0YAg0YMg0YQgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceDgyJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHg4NCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkwJywgJ1x4OEInLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceDk3JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHg5MScsICAvKiDwkJCCIPCQkIQg8JCQiyDwkJCXIPCQkJEgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceDgwJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHg4MicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkwJywgJ1x4ODQnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceDk3JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHg5QicsICAvKiDwkJCAIPCQkIIg8JCQhCDwkJCXIPCQkJsgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceEFBJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHhBQycsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkwJywgJ1x4QjMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceEJGJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHhCOScsICAvKiDwkJCqIPCQkKwg8JCQsyDwkJC/IPCQkLkgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceEE4JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHhBQScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkwJywgJ1x4QUMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceEJGJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTEnLCAnXHg4MycsICAvKiDwkJCoIPCQkKog8JCQrCDwkJC/IPCQkYMgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTQnLCAnXHg5NScsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEFFJywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4ODUnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHg4NicsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEE1JywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4QTcnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHhBRCcsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEI2JywgIC8qIOCklSDgpK4g4KSFIOCkhiDgpKUg4KSnIOCkrSDgpLYgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTQnLCAnXHg4OCcsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceDkwJywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4OTMnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHg5NCcsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEJGJywgJyAnLCAnXHhFMCcsICdceEE1JywgJ1x4ODAnLCAnICcsICdceEUwJywgJ1x4QTUnLCAnXHg4QicsICcgJywgJ1x4RTAnLCAnXHhBNScsICdceDhDJywgIC8qIOCkiCDgpJAg4KSTIOCklCDgpL8g4KWAIOCliyDgpYwgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTQnLCAnXHg5NScsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEFFJywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4ODUnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHg4NicsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEE1JywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4QTcnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHhBRCcsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEI2JywgIC8qIOCklSDgpK4g4KSFIOCkhiDgpKUg4KSnIOCkrSDgpLYgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTUnLCAnXHg4MScsICcgJywgJ1x4RTAnLCAnXHhBNScsICdceDgzJywgIC8qIOClgSDgpYMgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODgnLCAnXHg4MCcsICcgJywgJ1x4RTEnLCAnXHg4OCcsICdceDgzJywgJyAnLCAnXHhFMScsICdceDhCJywgJ1x4OTgnLCAnICcsICdceEUxJywgJ1x4OEQnLCAnXHg5MCcsICcgJywgJ1x4RTEnLCAnXHg4OCcsICdceDlCJywgJyAnLCAnXHhFMScsICdceDg5JywgJ1x4QTAnLCAnICcsICdceEUxJywgJ1x4OEInLCAnXHg4QicsICcgJywgJ1x4RTEnLCAnXHg4QicsICdceDkwJywgIC8qIOGIgCDhiIMg4YuYIOGNkCDhiJsg4YmgIOGLiyDhi5AgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODgnLCAnXHg4OCcsICcgJywgJ1x4RTEnLCAnXHg4OCcsICdceDkwJywgJyAnLCAnXHhFMScsICdceDg5JywgJ1x4QTAnLCAnICcsICdceEUxJywgJ1x4OEInLCAnXHg5OCcsICcgJywgJ1x4RTEnLCAnXHg4OCcsICdceDgwJywgJyAnLCAnXHhFMScsICdceDg4JywgJ1x4QUEnLCAnICcsICdceEUxJywgJ1x4OEInLCAnXHg5MCcsICcgJywgJ1x4RTEnLCAnXHg4QycsICdceEE4JywgIC8qIOGIiCDhiJAg4YmgIOGLmCDhiIAg4YiqIOGLkCDhjKggKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODMnLCAnXHg5MicsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceDkzJywgJyAnLCAnXHhFMScsICdceDgzJywgJ1x4OTQnLCAnICcsICdceEUxJywgJ1x4ODMnLCAnXHg5NScsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceDk3JywgJyAnLCAnXHhFMScsICdceDgzJywgJ1x4OTgnLCAnICcsICdceEUxJywgJ1x4ODMnLCAnXHg5RCcsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceEE2JywgIC8qIOGDkiDhg5Mg4YOUIOGDlSDhg5cg4YOYIOGDnSDhg6YgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODMnLCAnXHg5MCcsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceDk2JywgJyAnLCAnXHhFMScsICdceDgzJywgJ1x4OUInLCAnICcsICdceEUxJywgJ1x4ODMnLCAnXHhBMScsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceEE4JywgJyAnLCAnXHhFMScsICdceDgzJywgJ1x4QUInLCAnICcsICdceEUxJywgJ1x4ODMnLCAnXHhBRScsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceDlFJywgIC8qIOGDkCDhg5Yg4YObIOGDoSDhg6gg4YOrIOGDriDhg54gKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODMnLCAnXHhBMScsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceEFFJywgJyAnLCAnXHhFMScsICdceDgzJywgJ1x4QTUnLCAnICcsICdceEUxJywgJ1x4ODMnLCAnXHg5NicsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceDlCJywgJyAnLCAnXHhFMScsICdceDgzJywgJ1x4QTgnLCAnICcsICdceEUxJywgJ1x4ODMnLCAnXHhBOScsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceEFDJywgIC8qIOGDoSDhg64g4YOlIOGDliDhg5sg4YOoIOGDqSDhg6wgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODMnLCAnXHg5NCcsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceDk1JywgJyAnLCAnXHhFMScsICdceDgzJywgJ1x4OUYnLCAnICcsICdceEUxJywgJ1x4ODMnLCAnXHhBMicsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceEEzJywgJyAnLCAnXHhFMScsICdceDgzJywgJ1x4QTQnLCAnICcsICdceEUxJywgJ1x4ODMnLCAnXHhBNScsICcgJywgJ1x4RTEnLCAnXHg4MycsICdceEE3JywgIC8qIOGDlCDhg5Ug4YOfIOGDoiDhg6Mg4YOkIOGDpSDhg6cgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODInLCAnXHhCMScsICcgJywgJ1x4RTEnLCAnXHg4MicsICdceEE3JywgJyAnLCAnXHhFMScsICdceDgyJywgJ1x4QjknLCAnICcsICdceEUxJywgJ1x4ODInLCAnXHhCQycsICcgJywgJ1x4RTEnLCAnXHg4MicsICdceEE0JywgJyAnLCAnXHhFMScsICdceDgyJywgJ1x4QTUnLCAnICcsICdceEUxJywgJ1x4ODInLCAnXHhCMycsICcgJywgJ1x4RTEnLCAnXHg4MicsICdceEJBJywgIC8qIOGCsSDhgqcg4YK5IOGCvCDhgqQg4YKlIOGCsyDhgrogKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODInLCAnXHhBNCcsICcgJywgJ1x4RTEnLCAnXHg4MicsICdceEE1JywgJyAnLCAnXHhFMScsICdceDgyJywgJ1x4QTcnLCAnICcsICdceEUxJywgJ1x4ODInLCAnXHhBOCcsICcgJywgJ1x4RTEnLCAnXHg4MicsICdceEE2JywgJyAnLCAnXHhFMScsICdceDgyJywgJ1x4QjEnLCAnICcsICdceEUxJywgJ1x4ODInLCAnXHhBQScsICcgJywgJ1x4RTEnLCAnXHg4MicsICdceEFCJywgIC8qIOGCpCDhgqUg4YKnIOGCqCDhgqYg4YKxIOGCqiDhgqsgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjQnLCAnXHg4MScsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDk3JywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4ODInLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHg4NCcsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDg1JywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4ODcnLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHg5NCcsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDk2JywgIC8qIOK0gSDitJcg4rSCIOK0hCDitIUg4rSHIOK0lCDitJYgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjQnLCAnXHg4OCcsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDhDJywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4OTYnLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHg4RScsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDgzJywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4ODYnLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHg4QicsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceEEyJywgIC8qIOK0iCDitIwg4rSWIOK0jiDitIMg4rSGIOK0iyDitKIgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjQnLCAnXHg5MCcsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDkxJywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4OTMnLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHg5NScsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDk5JywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4OUInLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHhBMScsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceEEzJywgIC8qIOK0kCDitJEg4rSTIOK0lSDitJkg4rSbIOK0oSDitKMgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjQnLCAnXHg4NCcsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDg1JywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4OTQnLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHg5NScsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDgxJywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4ODInLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHg5OCcsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceDlEJywgIC8qIOK0hCDitIUg4rSUIOK0lSDitIEg4rSCIOK0mCDitJ0gKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjAnLCAnXHg4NScsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceDk0JywgJyAnLCAnXHhFMicsICdceEIwJywgJ1x4QUEnLCAnICcsICdceEUyJywgJ1x4QjAnLCAnXHg4NCcsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceDgyJywgJyAnLCAnXHhFMicsICdceEIwJywgJ1x4OEEnLCAnICcsICdceEUyJywgJ1x4QjAnLCAnXHhBQicsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceDhCJywgIC8qIOKwhSDisJQg4rCqIOKwhCDisIIg4rCKIOKwqyDisIsgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjAnLCAnXHg4NScsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceDg0JywgJyAnLCAnXHhFMicsICdceEIwJywgJ1x4ODInLCAnICcsICdceEUyJywgJ1x4QjAnLCAnXHhBQScsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceDlFJywgJyAnLCAnXHhFMicsICdceEIwJywgJ1x4QTEnLCAnICcsICdceEUyJywgJ1x4QjAnLCAnXHg4QScsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceDk0JywgIC8qIOKwhSDisIQg4rCCIOKwqiDisJ4g4rChIOKwiiDisJQgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjAnLCAnXHhCNScsICcgJywgJ1x4RTInLCAnXHhCMScsICdceDg0JywgJyAnLCAnXHhFMicsICdceEIxJywgJ1x4OUEnLCAnICcsICdceEUyJywgJ1x4QjAnLCAnXHhCNCcsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceEIyJywgJyAnLCAnXHhFMicsICdceEIwJywgJ1x4QkEnLCAnICcsICdceEUyJywgJ1x4QjEnLCAnXHg5QicsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceEJCJywgIC8qIOKwtSDisYQg4rGaIOKwtCDisLIg4rC6IOKxmyDisLsgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjAnLCAnXHhCNScsICcgJywgJ1x4RTInLCAnXHhCMCcsICdceEI0JywgJyAnLCAnXHhFMicsICdceEIwJywgJ1x4QjInLCAnICcsICdceEUyJywgJ1x4QjEnLCAnXHg5QScsICcgJywgJ1x4RTInLCAnXHhCMScsICdceDhFJywgJyAnLCAnXHhFMicsICdceEIxJywgJ1x4OTEnLCAnICcsICdceEUyJywgJ1x4QjAnLCAnXHhCQScsICcgJywgJ1x4RTInLCAnXHhCMScsICdceDg0JywgIC8qIOKwtSDisLQg4rCyIOKxmiDisY4g4rGRIOKwuiDisYQgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg4QycsICdceEIyJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEMnLCAnXHhCNicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDhEJywgJ1x4ODAnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg4RCcsICdceDg0JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEMnLCAnXHhCNCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDhEJywgJ1x4ODMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg4RCcsICdceDg4JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEMnLCAnXHhCRScsICAvKiDwkIyyIPCQjLYg8JCNgCDwkI2EIPCQjLQg8JCNgyDwkI2IIPCQjL4gKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg4QycsICdceEI2JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OEMnLCAnXHhCNCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDhEJywgJ1x4ODMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg4RCcsICdceDg4JywgIC8qIPCQjLYg8JCMtCDwkI2DIPCQjYggKi8KLSAgICAnXDAnLAotICAgICdceENFJywgJ1x4OTMnLCAnICcsICdceENFJywgJ1x4OTInLCAnICcsICdceENFJywgJ1x4OTUnLCAnICcsICdceENFJywgJ1x4OTYnLCAnICcsICdceENFJywgJ1x4OTgnLCAnICcsICdceENFJywgJ1x4OUYnLCAnICcsICdceENFJywgJ1x4QTknLCAgLyogzpMgzpIgzpUgzpYgzpggzp8gzqkgKi8KLSAgICAnXDAnLAotICAgICdceENFJywgJ1x4OTInLCAnICcsICdceENFJywgJ1x4OTQnLCAnICcsICdceENFJywgJ1x4OTYnLCAnICcsICdceENFJywgJ1x4OUUnLCAnICcsICdceENFJywgJ1x4OTgnLCAnICcsICdceENFJywgJ1x4OUYnLCAgLyogzpIgzpQgzpYgzp4gzpggzp8gKi8KLSAgICAnXDAnLAotICAgICdceENFJywgJ1x4QjInLCAnICcsICdceENFJywgJ1x4QjgnLCAnICcsICdceENFJywgJ1x4QjQnLCAnICcsICdceENFJywgJ1x4QjYnLCAnICcsICdceENFJywgJ1x4QkInLCAnICcsICdceENFJywgJ1x4QkUnLCAgLyogzrIgzrggzrQgzrYgzrsgzr4gKi8KLSAgICAnXDAnLAotICAgICdceENFJywgJ1x4QjEnLCAnICcsICdceENFJywgJ1x4QjUnLCAnICcsICdceENFJywgJ1x4QjknLCAnICcsICdceENFJywgJ1x4QkYnLCAnICcsICdceENGJywgJ1x4ODAnLCAnICcsICdceENGJywgJ1x4ODMnLCAnICcsICdceENGJywgJ1x4ODQnLCAnICcsICdceENGJywgJ1x4ODknLCAgLyogzrEgzrUgzrkgzr8gz4Agz4Mgz4Qgz4kgKi8KLSAgICAnXDAnLAotICAgICdceENFJywgJ1x4QjInLCAnICcsICdceENFJywgJ1x4QjMnLCAnICcsICdceENFJywgJ1x4QjcnLCAnICcsICdceENFJywgJ1x4QkMnLCAnICcsICdceENGJywgJ1x4ODEnLCAnICcsICdceENGJywgJ1x4ODYnLCAnICcsICdceENGJywgJ1x4ODcnLCAnICcsICdceENGJywgJ1x4ODgnLCAgLyogzrIgzrMgzrcgzrwgz4Egz4Ygz4cgz4ggKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QUEnLCAnXHhBNCcsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceEE4JywgJyAnLCAnXHhFMCcsICdceEFBJywgJ1x4OEInLCAnICcsICdceEUwJywgJ1x4QUEnLCAnXHg4QycsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceDlCJywgJyAnLCAnXHhFMCcsICdceEFBJywgJ1x4OUYnLCAnICcsICdceEUwJywgJ1x4QUEnLCAnXHhCMCcsICcgJywgJ1x4RTAnLCAnXHhBQicsICdceEE2JywgIC8qIOCqpCDgqqgg4KqLIOCqjCDgqpsg4KqfIOCqsCDgq6YgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QUEnLCAnXHg5NicsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceDk3JywgJyAnLCAnXHhFMCcsICdceEFBJywgJ1x4OTgnLCAnICcsICdceEUwJywgJ1x4QUEnLCAnXHg5RScsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceDg3JywgJyAnLCAnXHhFMCcsICdceEFBJywgJ1x4ODgnLCAnICcsICdceEUwJywgJ1x4QUEnLCAnXHhBMCcsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceDlDJywgIC8qIOCqliDgqpcg4KqYIOCqniDgqocg4KqIIOCqoCDgqpwgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QUEnLCAnXHg4OCcsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceDhBJywgJyAnLCAnXHhFMCcsICdceEFBJywgJ1x4QkYnLCAnICcsICdceEUwJywgJ1x4QUInLCAnXHg4MCcsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceEIyJywgJ1x4RTAnLCAnXHhBQicsICdceDgwJywgJyAnLCAnXHhFMCcsICdceEFBJywgJ1x4QjYnLCAnXHhFMCcsICdceEFCJywgJ1x4OEQnLCAnXHhFMCcsICdceEFBJywgJ1x4OUEnLCAnXHhFMCcsICdceEFBJywgJ1x4QkYnLCAnICcsICdceEUwJywgJ1x4QUEnLCAnXHg5QycsICdceEUwJywgJ1x4QUEnLCAnXHhCRicsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceEI4JywgJ1x4RTAnLCAnXHhBQicsICdceDgwJywgIC8qIOCqiCDgqoog4Kq/IOCrgCDgqrLgq4Ag4Kq24KuN4Kqa4Kq/IOCqnOCqvyDgqrjgq4AgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QUInLCAnXHg4MScsICcgJywgJ1x4RTAnLCAnXHhBQicsICdceDgzJywgJyAnLCAnXHhFMCcsICdceEFCJywgJ1x4ODQnLCAnICcsICdceEUwJywgJ1x4QUEnLCAnXHg5NicsICdceEUwJywgJ1x4QUInLCAnXHg4MScsICcgJywgJ1x4RTAnLCAnXHhBQScsICdceDlCJywgJ1x4RTAnLCAnXHhBQicsICdceDgzJywgJyAnLCAnXHhFMCcsICdceEFBJywgJ1x4OUInLCAnXHhFMCcsICdceEFCJywgJ1x4ODQnLCAgLyog4KuBIOCrgyDgq4Qg4KqW4KuBIOCqm+CrgyDgqpvgq4QgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QUInLCAnXHhBNicsICcgJywgJ1x4RTAnLCAnXHhBQicsICdceEE3JywgJyAnLCAnXHhFMCcsICdceEFCJywgJ1x4QTgnLCAnICcsICdceEUwJywgJ1x4QUInLCAnXHhBOScsICcgJywgJ1x4RTAnLCAnXHhBQicsICdceEFEJywgIC8qIOCrpiDgq6cg4KuoIOCrqSDgq60gKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTgnLCAnXHg5NScsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceDk3JywgJyAnLCAnXHhFMCcsICdceEE4JywgJ1x4OTknLCAnICcsICdceEUwJywgJ1x4QTgnLCAnXHg5QScsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceDlDJywgJyAnLCAnXHhFMCcsICdceEE4JywgJ1x4QTQnLCAnICcsICdceEUwJywgJ1x4QTgnLCAnXHhBNycsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceEI4JywgIC8qIOColSDgqJcg4KiZIOComiDgqJwg4KikIOCopyDgqLggKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTgnLCAnXHg5NScsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceDk3JywgJyAnLCAnXHhFMCcsICdceEE4JywgJ1x4OTknLCAnICcsICdceEUwJywgJ1x4QTgnLCAnXHg5QScsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceDlDJywgJyAnLCAnXHhFMCcsICdceEE4JywgJ1x4QTQnLCAnICcsICdceEUwJywgJ1x4QTgnLCAnXHhBNycsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceEI4JywgIC8qIOColSDgqJcg4KiZIOComiDgqJwg4KikIOCopyDgqLggKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTgnLCAnXHg4NycsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceDg4JywgJyAnLCAnXHhFMCcsICdceEE4JywgJ1x4ODknLCAnICcsICdceEUwJywgJ1x4QTgnLCAnXHg4RicsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceDkzJywgJyAnLCAnXHhFMCcsICdceEE5JywgJ1x4QjMnLCAnICcsICdceEUwJywgJ1x4QTgnLCAnXHhCRicsICcgJywgJ1x4RTAnLCAnXHhBOScsICdceDgwJywgIC8qIOCohyDgqIgg4KiJIOCojyDgqJMg4KmzIOCovyDgqYAgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTgnLCAnXHg4NScsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceDhGJywgJyAnLCAnXHhFMCcsICdceEE4JywgJ1x4OTMnLCAnICcsICdceEUwJywgJ1x4QTgnLCAnXHg5NycsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceDlDJywgJyAnLCAnXHhFMCcsICdceEE4JywgJ1x4QTAnLCAnICcsICdceEUwJywgJ1x4QTgnLCAnXHhCMCcsICcgJywgJ1x4RTAnLCAnXHhBOCcsICdceEI4JywgIC8qIOCohSDgqI8g4KiTIOColyDgqJwg4KigIOCosCDgqLggKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QTknLCAnXHhBNicsICcgJywgJ1x4RTAnLCAnXHhBOScsICdceEE3JywgJyAnLCAnXHhFMCcsICdceEE5JywgJ1x4QTgnLCAnICcsICdceEUwJywgJ1x4QTknLCAnXHhBOScsICcgJywgJ1x4RTAnLCAnXHhBOScsICdceEFEJywgIC8qIOCppiDgqacg4KmoIOCpqSDgqa0gKi8KLSAgICAnXDAnLAotICAgICdceEQ3JywgJ1x4OTEnLCAnICcsICdceEQ3JywgJ1x4OTMnLCAnICcsICdceEQ3JywgJ1x4OTQnLCAnICcsICdceEQ3JywgJ1x4OTcnLCAnICcsICdceEQ3JywgJ1x4OUEnLCAnICcsICdceEQ3JywgJ1x4OUInLCAnICcsICdceEQ3JywgJ1x4OUQnLCAnICcsICdceEQ3JywgJ1x4QTEnLCAgLyog15Eg15Mg15Qg15cg15og15sg150g16EgKi8KLSAgICAnXDAnLAotICAgICdceEQ3JywgJ1x4OTEnLCAnICcsICdceEQ3JywgJ1x4OTgnLCAnICcsICdceEQ3JywgJ1x4OUInLCAnICcsICdceEQ3JywgJ1x4OUQnLCAnICcsICdceEQ3JywgJ1x4QTEnLCAnICcsICdceEQ3JywgJ1x4QTYnLCAgLyog15Eg15gg15sg150g16Eg16YgKi8KLSAgICAnXDAnLAotICAgICdceEQ3JywgJ1x4QTcnLCAnICcsICdceEQ3JywgJ1x4OUEnLCAnICcsICdceEQ3JywgJ1x4OUYnLCAnICcsICdceEQ3JywgJ1x4QTMnLCAnICcsICdceEQ3JywgJ1x4QTUnLCAgLyog16cg15og158g16Mg16UgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjInLCAnXHg4NycsICcgJywgJ1x4RTAnLCAnXHhCMicsICdceDhBJywgJyAnLCAnXHhFMCcsICdceEIyJywgJ1x4OTAnLCAnICcsICdceEUwJywgJ1x4QjInLCAnXHhBMycsICcgJywgJ1x4RTAnLCAnXHhCMicsICdceEI4JywgJ1x4RTAnLCAnXHhCMicsICdceEJFJywgJyAnLCAnXHhFMCcsICdceEIyJywgJ1x4QTgnLCAnXHhFMCcsICdceEIyJywgJ1x4QkUnLCAnICcsICdceEUwJywgJ1x4QjInLCAnXHhBNicsICdceEUwJywgJ1x4QjInLCAnXHhCRScsICcgJywgJ1x4RTAnLCAnXHhCMicsICdceEIwJywgJ1x4RTAnLCAnXHhCMicsICdceEJFJywgIC8qIOCyhyDgsoog4LKQIOCyoyDgsrjgsr4g4LKo4LK+IOCypuCyviDgsrDgsr4gKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjInLCAnXHg4NScsICcgJywgJ1x4RTAnLCAnXHhCMicsICdceDg5JywgJyAnLCAnXHhFMCcsICdceEIyJywgJ1x4OEUnLCAnICcsICdceEUwJywgJ1x4QjInLCAnXHhCMicsICcgJywgJ1x4RTAnLCAnXHhCMycsICdceEE2JywgJyAnLCAnXHhFMCcsICdceEIzJywgJ1x4QTgnLCAnICcsICdceEUwJywgJ1x4QjMnLCAnXHhBQycsICcgJywgJ1x4RTAnLCAnXHhCMycsICdceEFEJywgIC8qIOCyhSDgsokg4LKOIOCysiDgs6Yg4LOoIOCzrCDgs60gKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QTQnLCAnXHg4NScsICcgJywgJ1x4RUEnLCAnXHhBNCcsICdceDhGJywgJyAnLCAnXHhFQScsICdceEE0JywgJ1x4ODEnLCAnICcsICdceEVBJywgJ1x4QTQnLCAnXHg4QicsICcgJywgJ1x4RUEnLCAnXHhBNCcsICdceDgwJywgJyAnLCAnXHhFQScsICdceEE0JywgJ1x4OEQnLCAgLyog6qSFIOqkjyDqpIEg6qSLIOqkgCDqpI0gKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QTQnLCAnXHg4OCcsICcgJywgJ1x4RUEnLCAnXHhBNCcsICdceDk4JywgJyAnLCAnXHhFQScsICdceEE0JywgJ1x4ODAnLCAnICcsICdceEVBJywgJ1x4QTQnLCAnXHg4RCcsICcgJywgJ1x4RUEnLCAnXHhBNCcsICdceEEyJywgIC8qIOqkiCDqpJgg6qSAIOqkjSDqpKIgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QTQnLCAnXHg5NicsICcgJywgJ1x4RUEnLCAnXHhBNCcsICdceEExJywgIC8qIOqkliDqpKEgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QTQnLCAnXHg5MScsICcgJywgJ1x4RUEnLCAnXHhBNCcsICdceDlDJywgJyAnLCAnXHhFQScsICdceEE0JywgJ1x4OUUnLCAgLyog6qSRIOqknCDqpJ4gKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QTQnLCAnXHg5MScsICdceEVBJywgJ1x4QTQnLCAnXHhBQycsICcgJywgJ1x4RUEnLCAnXHhBNCcsICdceDlDJywgJ1x4RUEnLCAnXHhBNCcsICdceEFEJywgJyAnLCAnXHhFQScsICdceEE0JywgJ1x4OTQnLCAnXHhFQScsICdceEE0JywgJ1x4QUMnLCAgLyog6qSR6qSsIOqknOqkrSDqpJTqpKwgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUUnLCAnXHg4MScsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceDkxJywgJyAnLCAnXHhFMScsICdceDlFJywgJ1x4OTMnLCAnICcsICdceEUxJywgJ1x4OUUnLCAnXHhBNycsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceEE5JywgJyAnLCAnXHhFMScsICdceDlFJywgJ1x4QjYnLCAgLyog4Z6BIOGekSDhnpMg4Z6nIOGeqSDhnrYgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUUnLCAnXHg4MCcsICdceEUxJywgJ1x4OUYnLCAnXHg5MicsICdceEUxJywgJ1x4OUUnLCAnXHg4MCcsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceDgwJywgJ1x4RTEnLCAnXHg5RicsICdceDkyJywgJ1x4RTEnLCAnXHg5RScsICdceDgxJywgJyAnLCAnXHhFMScsICdceDlFJywgJ1x4ODAnLCAnXHhFMScsICdceDlGJywgJ1x4OTInLCAnXHhFMScsICdceDlFJywgJ1x4ODInLCAnICcsICdceEUxJywgJ1x4OUUnLCAnXHg4MCcsICdceEUxJywgJ1x4OUYnLCAnXHg5MicsICdceEUxJywgJ1x4OUUnLCAnXHg5MCcsICAvKiDhnoDhn5LhnoAg4Z6A4Z+S4Z6BIOGegOGfkuGegiDhnoDhn5LhnpAgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUUnLCAnXHg4MScsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceDgzJywgJyAnLCAnXHhFMScsICdceDlFJywgJ1x4ODUnLCAnICcsICdceEUxJywgJ1x4OUUnLCAnXHg4QicsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceDk0JywgJyAnLCAnXHhFMScsICdceDlFJywgJ1x4OTgnLCAnICcsICdceEUxJywgJ1x4OUUnLCAnXHg5OScsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceEIyJywgIC8qIOGegSDhnoMg4Z6FIOGeiyDhnpQg4Z6YIOGemSDhnrIgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUUnLCAnXHg4RicsICdceEUxJywgJ1x4OUYnLCAnXHg5MicsICdceEUxJywgJ1x4OUUnLCAnXHg5QScsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceDlBJywgJ1x4RTEnLCAnXHg5RicsICdceDgwJywgJyAnLCAnXHhFMScsICdceDlFJywgJ1x4QjInLCAnXHhFMScsICdceDlGJywgJ1x4OTInLCAnXHhFMScsICdceDlFJywgJ1x4OTknLCAnICcsICdceEUxJywgJ1x4OUUnLCAnXHhBMicsICdceEUxJywgJ1x4OUUnLCAnXHhCRicsICAvKiDhno/hn5Lhnpog4Z6a4Z+AIOGesuGfkuGemSDhnqLhnr8gKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4OUUnLCAnXHg5MycsICdceEUxJywgJ1x4OUYnLCAnXHg5MicsICdceEUxJywgJ1x4OUUnLCAnXHg4RicsICdceEUxJywgJ1x4OUYnLCAnXHg5MicsICdceEUxJywgJ1x4OUUnLCAnXHg5QScsICdceEUxJywgJ1x4OUYnLCAnXHg4MycsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceDg0JywgJ1x4RTEnLCAnXHg5RicsICdceDkyJywgJ1x4RTEnLCAnXHg5RScsICdceDgxJywgJ1x4RTEnLCAnXHg5RicsICdceDkyJywgJ1x4RTEnLCAnXHg5RScsICdceDk5JywgJyAnLCAnXHhFMScsICdceDlFJywgJ1x4ODAnLCAnXHhFMScsICdceDlGJywgJ1x4OTInLCAnXHhFMScsICdceDlFJywgJ1x4OTQnLCAnXHhFMScsICdceDlGJywgJ1x4ODAnLCAnICcsICdceEUxJywgJ1x4OUUnLCAnXHg4NScsICdceEUxJywgJ1x4OUYnLCAnXHg5MicsICdceEUxJywgJ1x4OUUnLCAnXHg5QScsICdceEUxJywgJ1x4OUYnLCAnXHg4MCcsICcgJywgJ1x4RTEnLCAnXHg5RScsICdceDkzJywgJ1x4RTEnLCAnXHg5RicsICdceDkyJywgJ1x4RTEnLCAnXHg5RScsICdceDhGJywgJ1x4RTEnLCAnXHg5RScsICdceEJGJywgJyAnLCAnXHhFMScsICdceDlFJywgJ1x4OUInLCAnXHhFMScsICdceDlGJywgJ1x4OTInLCAnXHhFMScsICdceDlFJywgJ1x4OTQnLCAnXHhFMScsICdceDlFJywgJ1x4QkYnLCAgLyog4Z6T4Z+S4Z6P4Z+S4Z6a4Z+DIOGehOGfkuGegeGfkuGemSDhnoDhn5LhnpThn4Ag4Z6F4Z+S4Z6a4Z+AIOGek+GfkuGej+GevyDhnpvhn5LhnpThnr8gKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QTcnLCAnXHhBMCcsICcgJywgJ1x4RTEnLCAnXHhBNycsICdceEExJywgIC8qIOGnoCDhp6EgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QTcnLCAnXHhCNicsICcgJywgJ1x4RTEnLCAnXHhBNycsICdceEI5JywgIC8qIOGntiDhp7kgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QkEnLCAnXHhCMicsICcgJywgJ1x4RTAnLCAnXHhCQScsICdceDk0JywgJyAnLCAnXHhFMCcsICdceEJBJywgJ1x4QUQnLCAnICcsICdceEUwJywgJ1x4QkEnLCAnXHhBMScsICcgJywgJ1x4RTAnLCAnXHhCQScsICdceEE1JywgJyAnLCAnXHhFMCcsICdceEJBJywgJ1x4QTcnLCAnICcsICdceEUwJywgJ1x4QkEnLCAnXHhBMycsICcgJywgJ1x4RTAnLCAnXHhCQScsICdceDg3JywgIC8qIOC6siDgupQg4LqtIOC6oSDguqUg4LqnIOC6oyDguocgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QkEnLCAnXHhCMicsICcgJywgJ1x4RTAnLCAnXHhCQScsICdceEFEJywgJyAnLCAnXHhFMCcsICdceEJBJywgJ1x4OUEnLCAnICcsICdceEUwJywgJ1x4QkEnLCAnXHg4RCcsICcgJywgJ1x4RTAnLCAnXHhCQScsICdceEEzJywgJyAnLCAnXHhFMCcsICdceEJBJywgJ1x4QUUnLCAnICcsICdceEUwJywgJ1x4QkEnLCAnXHhBNycsICcgJywgJ1x4RTAnLCAnXHhCQScsICdceEEyJywgIC8qIOC6siDguq0g4LqaIOC6jSDguqMg4LquIOC6pyDguqIgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QkEnLCAnXHg5QicsICcgJywgJ1x4RTAnLCAnXHhCQScsICdceEEyJywgJyAnLCAnXHhFMCcsICdceEJBJywgJ1x4OUYnLCAnICcsICdceEUwJywgJ1x4QkEnLCAnXHg5RCcsICAvKiDgupsg4LqiIOC6nyDgup0gKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QkInLCAnXHg4MicsICcgJywgJ1x4RTAnLCAnXHhCQicsICdceDg0JywgJyAnLCAnXHhFMCcsICdceEJCJywgJ1x4ODMnLCAgLyog4LuCIOC7hCDgu4MgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QkEnLCAnXHg4NycsICcgJywgJ1x4RTAnLCAnXHhCQScsICdceDhBJywgJyAnLCAnXHhFMCcsICdceEJBJywgJ1x4OTYnLCAnICcsICdceEUwJywgJ1x4QkEnLCAnXHhCRCcsICcgJywgJ1x4RTAnLCAnXHhCQicsICdceDg2JywgJyAnLCAnXHhFMCcsICdceEJBJywgJ1x4QUYnLCAgLyog4LqHIOC6iiDgupYg4Lq9IOC7hiDguq8gKi8KLSAgICAnXDAnLAotICAgICdUJywgJyAnLCAnSCcsICcgJywgJ0UnLCAnICcsICdaJywgJyAnLCAnTycsICcgJywgJ0MnLCAnICcsICdRJywgJyAnLCAnUycsICAvKiBUIEggRSBaIE8gQyBRIFMgKi8KLSAgICAnXDAnLAotICAgICdIJywgJyAnLCAnRScsICcgJywgJ1onLCAnICcsICdMJywgJyAnLCAnTycsICcgJywgJ0MnLCAnICcsICdVJywgJyAnLCAnUycsICAvKiBIIEUgWiBMIE8gQyBVIFMgKi8KLSAgICAnXDAnLAotICAgICdmJywgJyAnLCAnaScsICcgJywgJ2onLCAnICcsICdrJywgJyAnLCAnZCcsICcgJywgJ2InLCAnICcsICdoJywgIC8qIGYgaSBqIGsgZCBiIGggKi8KLSAgICAnXDAnLAotICAgICd1JywgJyAnLCAndicsICcgJywgJ3gnLCAnICcsICd6JywgJyAnLCAnbycsICcgJywgJ2UnLCAnICcsICdzJywgJyAnLCAnYycsICAvKiB1IHYgeCB6IG8gZSBzIGMgKi8KLSAgICAnXDAnLAotICAgICduJywgJyAnLCAncicsICcgJywgJ3gnLCAnICcsICd6JywgJyAnLCAnbycsICcgJywgJ2UnLCAnICcsICdzJywgJyAnLCAnYycsICAvKiBuIHIgeCB6IG8gZSBzIGMgKi8KLSAgICAnXDAnLAotICAgICdwJywgJyAnLCAncScsICcgJywgJ2cnLCAnICcsICdqJywgJyAnLCAneScsICAvKiBwIHEgZyBqIHkgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4ODInLCAnXHg4MCcsICcgJywgJ1x4RTInLCAnXHg4MicsICdceDgzJywgJyAnLCAnXHhFMicsICdceDgyJywgJ1x4ODUnLCAnICcsICdceEUyJywgJ1x4ODInLCAnXHg4NycsICcgJywgJ1x4RTInLCAnXHg4MicsICdceDg4JywgIC8qIOKCgCDigoMg4oKFIOKChyDigoggKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4ODInLCAnXHg4MCcsICcgJywgJ1x4RTInLCAnXHg4MicsICdceDgxJywgJyAnLCAnXHhFMicsICdceDgyJywgJ1x4ODInLCAnICcsICdceEUyJywgJ1x4ODInLCAnXHg4MycsICcgJywgJ1x4RTInLCAnXHg4MicsICdceDg4JywgIC8qIOKCgCDigoEg4oKCIOKCgyDigoggKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QjUnLCAnXHhBMicsICcgJywgJ1x4RTInLCAnXHhCMScsICdceEJDJywgJyAnLCAnXHhFMicsICdceDgyJywgJ1x4OTUnLCAnICcsICdceEUyJywgJ1x4ODInLCAnXHg5NicsICcgJywgJ1x4RTInLCAnXHg4MicsICdceDk3JywgIC8qIOG1oiDisbwg4oKVIOKCliDigpcgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4ODInLCAnXHg5MCcsICcgJywgJ1x4RTInLCAnXHg4MicsICdceDkxJywgJyAnLCAnXHhFMicsICdceDgyJywgJ1x4OTInLCAnICcsICdceEUyJywgJ1x4ODInLCAnXHg5MycsICcgJywgJ1x4RTInLCAnXHg4MicsICdceDk5JywgJyAnLCAnXHhFMicsICdceDgyJywgJ1x4OUInLCAnICcsICdceEUxJywgJ1x4QjUnLCAnXHhBNScsICcgJywgJ1x4RTEnLCAnXHhCNScsICdceEE0JywgJyAnLCAnXHhFMScsICdceEI1JywgJ1x4QTMnLCAgLyog4oKQIOKCkSDigpIg4oKTIOKCmSDigpsg4bWlIOG1pCDhtaMgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QjUnLCAnXHhBNicsICcgJywgJ1x4RTEnLCAnXHhCNScsICdceEE3JywgJyAnLCAnXHhFMScsICdceEI1JywgJ1x4QTgnLCAnICcsICdceEUxJywgJ1x4QjUnLCAnXHhBOScsICcgJywgJ1x4RTInLCAnXHg4MicsICdceDlBJywgIC8qIOG1piDhtacg4bWoIOG1qSDigpogKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4ODEnLCAnXHhCMCcsICcgJywgJ1x4QzInLCAnXHhCMycsICcgJywgJ1x4RTInLCAnXHg4MScsICdceEI1JywgJyAnLCAnXHhFMicsICdceDgxJywgJ1x4QjcnLCAnICcsICdceEUxJywgJ1x4QjUnLCAnXHg4MCcsICcgJywgJ1x4RTEnLCAnXHhCNCcsICdceEI0JywgJyAnLCAnXHhFMScsICdceEI0JywgJ1x4QjEnLCAnICcsICdceEUxJywgJ1x4QjQnLCAnXHhCQycsICAvKiDigbAgwrMg4oG1IOKBtyDhtYAg4bS0IOG0sSDhtLwgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4ODEnLCAnXHhCMCcsICcgJywgJ1x4QzInLCAnXHhCOScsICcgJywgJ1x4QzInLCAnXHhCMicsICcgJywgJ1x4QzInLCAnXHhCMycsICcgJywgJ1x4RTEnLCAnXHhCNCcsICdceEIxJywgJyAnLCAnXHhFMScsICdceEI0JywgJ1x4QjgnLCAnICcsICdceEUxJywgJ1x4QjQnLCAnXHhCQycsICcgJywgJ1x4RTEnLCAnXHhCNScsICdceDgxJywgIC8qIOKBsCDCuSDCsiDCsyDhtLEg4bS4IOG0vCDhtYEgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QjUnLCAnXHg4NycsICcgJywgJ1x4RTEnLCAnXHhCNScsICdceDg4JywgJyAnLCAnXHhFMScsICdceEI1JywgJ1x4OEYnLCAnICcsICdceENBJywgJ1x4QjAnLCAnICcsICdceENBJywgJ1x4QjInLCAnICcsICdceEUxJywgJ1x4QjYnLCAnXHhBMCcsICcgJywgJ1x4RTInLCAnXHg4MScsICdceEIxJywgIC8qIOG1hyDhtYgg4bWPIMqwIMqyIOG2oCDigbEgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QjUnLCAnXHg4OScsICcgJywgJ1x4RTEnLCAnXHhCNScsICdceDkyJywgJyAnLCAnXHhDQScsICdceEIzJywgJyAnLCAnXHhDQicsICdceEEyJywgJyAnLCAnXHhDQicsICdceEEzJywgJyAnLCAnXHhFMScsICdceEI2JywgJ1x4OUMnLCAnICcsICdceEUxJywgJ1x4QjYnLCAnXHhCQicsICAvKiDhtYkg4bWSIMqzIMuiIMujIOG2nCDhtrsgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QjUnLCAnXHg5NicsICcgJywgJ1x4Q0EnLCAnXHhCOCcsICcgJywgJ1x4RTEnLCAnXHhCNScsICdceDhEJywgIC8qIOG1liDKuCDhtY0gKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4OTMnLCAnXHhBMScsICcgJywgJ1x4RUEnLCAnXHg5MycsICdceEE3JywgJyAnLCAnXHhFQScsICdceDkzJywgJ1x4QjEnLCAnICcsICdceEVBJywgJ1x4OTMnLCAnXHhCNicsICcgJywgJ1x4RUEnLCAnXHg5MycsICdceEE5JywgJyAnLCAnXHhFQScsICdceDkzJywgJ1x4OUEnLCAnICcsICdceEVBJywgJ1x4OTMnLCAnXHhCNScsICcgJywgJ1x4RUEnLCAnXHg5MycsICdceEIzJywgIC8qIOqToSDqk6cg6pOxIOqTtiDqk6kg6pOaIOqTtSDqk7MgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4OTMnLCAnXHg5NScsICcgJywgJ1x4RUEnLCAnXHg5MycsICdceDlDJywgJyAnLCAnXHhFQScsICdceDkzJywgJ1x4OUUnLCAnICcsICdceEVBJywgJ1x4OTMnLCAnXHhBMScsICcgJywgJ1x4RUEnLCAnXHg5MycsICdceDlCJywgJyAnLCAnXHhFQScsICdceDkzJywgJ1x4QTInLCAnICcsICdceEVBJywgJ1x4OTMnLCAnXHhCMycsICcgJywgJ1x4RUEnLCAnXHg5MycsICdceEI0JywgIC8qIOqTlSDqk5wg6pOeIOqToSDqk5sg6pOiIOqTsyDqk7QgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjQnLCAnXHg5MicsICcgJywgJ1x4RTAnLCAnXHhCNCcsICdceDlGJywgJyAnLCAnXHhFMCcsICdceEI0JywgJ1x4QTAnLCAnICcsICdceEUwJywgJ1x4QjQnLCAnXHhCMScsICcgJywgJ1x4RTAnLCAnXHhCNCcsICdceDlBJywgJyAnLCAnXHhFMCcsICdceEI0JywgJ1x4QUEnLCAnICcsICdceEUwJywgJ1x4QjQnLCAnXHg5QScsICdceEUwJywgJ1x4QjUnLCAnXHg4RCcsICdceEUwJywgJ1x4QjQnLCAnXHg5QScsICcgJywgJ1x4RTAnLCAnXHhCNCcsICdceEFBJywgJ1x4RTAnLCAnXHhCNScsICdceDhEJywgJ1x4RTAnLCAnXHhCNCcsICdceEFBJywgIC8qIOC0kiDgtJ8g4LSgIOC0sSDgtJog4LSqIOC0muC1jeC0miDgtKrgtY3gtKogKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjQnLCAnXHg5RicsICcgJywgJ1x4RTAnLCAnXHhCNCcsICdceEEwJywgJyAnLCAnXHhFMCcsICdceEI0JywgJ1x4QTcnLCAnICcsICdceEUwJywgJ1x4QjQnLCAnXHhCNicsICcgJywgJ1x4RTAnLCAnXHhCNCcsICdceDk4JywgJyAnLCAnXHhFMCcsICdceEI0JywgJ1x4OUEnLCAnICcsICdceEUwJywgJ1x4QjQnLCAnXHhBNScsICcgJywgJ1x4RTAnLCAnXHhCNCcsICdceEIyJywgIC8qIOC0nyDgtKAg4LSnIOC0tiDgtJgg4LSaIOC0pSDgtLIgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODAnLCAnXHg4MScsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceDgyJywgJyAnLCAnXHhFMScsICdceDgwJywgJ1x4ODQnLCAnICcsICdceEUxJywgJ1x4ODAnLCAnXHg5MicsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceDlEJywgJyAnLCAnXHhFMScsICdceDgxJywgJ1x4QTUnLCAnICcsICdceEUxJywgJ1x4ODEnLCAnXHg4QScsICcgJywgJ1x4RTEnLCAnXHg4MScsICdceDhCJywgIC8qIOGAgSDhgIIg4YCEIOGAkiDhgJ0g4YGlIOGBiiDhgYsgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODAnLCAnXHg4NCcsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceDhFJywgJyAnLCAnXHhFMScsICdceDgwJywgJ1x4OTInLCAnICcsICdceEUxJywgJ1x4ODAnLCAnXHg5NScsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceDk3JywgJyAnLCAnXHhFMScsICdceDgwJywgJ1x4OUQnLCAnICcsICdceEUxJywgJ1x4ODEnLCAnXHg4QScsICcgJywgJ1x4RTEnLCAnXHg4MScsICdceDhCJywgIC8qIOGAhCDhgI4g4YCSIOGAlSDhgJcg4YCdIOGBiiDhgYsgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODAnLCAnXHhBOScsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceEJDJywgJyAnLCAnXHhFMScsICdceDgxJywgJ1x4OEQnLCAnICcsICdceEUxJywgJ1x4ODEnLCAnXHg4RicsICcgJywgJ1x4RTEnLCAnXHg4MScsICdceDg2JywgJyAnLCAnXHhFMScsICdceDgwJywgJ1x4QUInLCAnICcsICdceEUxJywgJ1x4ODAnLCAnXHhBRCcsICAvKiDhgKkg4YC8IOGBjSDhgY8g4YGGIOGAqyDhgK0gKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4ODAnLCAnXHg4OScsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceDhBJywgJyAnLCAnXHhFMScsICdceDgwJywgJ1x4QTUnLCAnICcsICdceEUxJywgJ1x4ODAnLCAnXHhBOScsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceEE4JywgJyAnLCAnXHhFMScsICdceDgxJywgJ1x4ODInLCAnICcsICdceEUxJywgJ1x4ODEnLCAnXHg4NScsICcgJywgJ1x4RTEnLCAnXHg4MScsICdceDg5JywgIC8qIOGAiSDhgIog4YClIOGAqSDhgKgg4YGCIOGBhSDhgYkgKi8KLSAgICAnXDAnLAotICAgICdceERGJywgJ1x4OTAnLCAnICcsICdceERGJywgJ1x4ODknLCAnICcsICdceERGJywgJ1x4OTInLCAnICcsICdceERGJywgJ1x4OUYnLCAnICcsICdceERGJywgJ1x4OTYnLCAnICcsICdceERGJywgJ1x4OUMnLCAnICcsICdceERGJywgJ1x4QTAnLCAnICcsICdceERGJywgJ1x4QTUnLCAgLyog35Ag34kg35Ig358g35Yg35wg36Ag36UgKi8KLSAgICAnXDAnLAotICAgICdceERGJywgJ1x4ODAnLCAnICcsICdceERGJywgJ1x4OTgnLCAnICcsICdceERGJywgJ1x4QTEnLCAnICcsICdceERGJywgJ1x4QTAnLCAnICcsICdceERGJywgJ1x4QTUnLCAgLyog34Ag35gg36Eg36Ag36UgKi8KLSAgICAnXDAnLAotICAgICdceERGJywgJ1x4OEYnLCAnICcsICdceERGJywgJ1x4OUInLCAnICcsICdceERGJywgJ1x4OEInLCAgLyog348g35sg34sgKi8KLSAgICAnXDAnLAotICAgICdceERGJywgJ1x4OEUnLCAnICcsICdceERGJywgJ1x4OEYnLCAnICcsICdceERGJywgJ1x4OUInLCAnICcsICdceERGJywgJ1x4OEInLCAgLyog344g348g35sg34sgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QjEnLCAnXHg5QicsICcgJywgJ1x4RTEnLCAnXHhCMScsICdceDlDJywgJyAnLCAnXHhFMScsICdceEIxJywgJ1x4OUQnLCAnICcsICdceEUxJywgJ1x4QjEnLCAnXHhBMScsICcgJywgJ1x4RTEnLCAnXHhCMScsICdceEEyJywgJyAnLCAnXHhFMScsICdceEIxJywgJ1x4QTUnLCAgLyog4bGbIOGxnCDhsZ0g4bGhIOGxoiDhsaUgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHhCMCcsICdceDk3JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QjAnLCAnXHg5OCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEIwJywgJ1x4QTcnLCAgLyog8JCwlyDwkLCYIPCQsKcgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHhCMCcsICdceDg5JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QjAnLCAnXHg5NycsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEIwJywgJ1x4QTYnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHhCMCcsICdceEE3JywgIC8qIPCQsIkg8JCwlyDwkLCmIPCQsKcgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceEJFJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHg4RCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4OTInLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceDkzJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHhCQicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4ODInLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceEI1JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHg4NicsICAvKiDwkJK+IPCQk40g8JCTkiDwkJOTIPCQkrsg8JCTgiDwkJK1IPCQk4YgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceEIwJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHg4RCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4ODInLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceEJGJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHg4RScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4QjknLCAgLyog8JCSsCDwkJONIPCQk4Ig8JCSvyDwkJOOIPCQkrkgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceEJDJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHhCRCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4QkUnLCAgLyog8JCSvCDwkJK9IPCQkr4gKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceEI1JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHhCNicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4QkEnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceEJCJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHg5RCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4QTMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceEFBJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHhBRScsICAvKiDwkJO1IPCQk7Yg8JCTuiDwkJO7IPCQk50g8JCToyDwkJOqIPCQk64gKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceDk4JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHg5QScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4QTMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceEI1JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHhBMScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4QTcnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceEFBJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHhCNicsICAvKiDwkJOYIPCQk5og8JCToyDwkJO1IPCQk6Eg8JCTpyDwkJOqIPCQk7YgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceEE0JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHhBNicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4QjgnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceEI5JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHg5QicsICAvKiDwkJOkIPCQk6Yg8JCTuCDwkJO5IPCQk5sgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MycsICdceEE0JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTMnLCAnXHhBNScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkzJywgJ1x4QTYnLCAgLyog8JCTpCDwkJOlIPCQk6YgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceDg2JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHg4OScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4OTAnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceDkyJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHg5OCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4OUInLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceEEwJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHhBMycsICAvKiDwkJKGIPCQkokg8JCSkCDwkJKSIPCQkpgg8JCSmyDwkJKgIPCQkqMgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceDgwJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHg4MicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4ODYnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceDg4JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHg4QScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4OTInLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceEEwJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHhBOScsICAvKiDwkJKAIPCQkoIg8JCShiDwkJKIIPCQkoog8JCSkiDwkJKgIPCQkqkgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QTInLCAnXHg5QycsICcgJywgJ1x4RUEnLCAnXHhBMicsICdceDlFJywgJyAnLCAnXHhFQScsICdceEEyJywgJ1x4QjMnLCAnICcsICdceEVBJywgJ1x4QTInLCAnXHg4MicsICcgJywgJ1x4RUEnLCAnXHhBMicsICdceDk2JywgJyAnLCAnXHhFQScsICdceEEyJywgJ1x4OTInLCAnICcsICdceEVBJywgJ1x4QTInLCAnXHg5RCcsICcgJywgJ1x4RUEnLCAnXHhBMicsICdceDlCJywgIC8qIOqinCDqop4g6qKzIOqigiDqopYg6qKSIOqinSDqopsgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QTInLCAnXHg4MicsICcgJywgJ1x4RUEnLCAnXHhBMicsICdceEE4JywgJyAnLCAnXHhFQScsICdceEEyJywgJ1x4QkEnLCAnICcsICdceEVBJywgJ1x4QTInLCAnXHhBNCcsICcgJywgJ1x4RUEnLCAnXHhBMicsICdceDhFJywgIC8qIOqigiDqoqgg6qK6IOqipCDqoo4gKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MScsICdceDk1JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTEnLCAnXHg5OScsICAvKiDwkJGVIPCQkZkgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MScsICdceDk0JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTEnLCAnXHg5NicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkxJywgJ1x4OTcnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MScsICdceEI5JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTEnLCAnXHhCQicsICAvKiDwkJGUIPCQkZYg8JCRlyDwkJG5IPCQkbsgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MScsICdceDlGJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTEnLCAnXHhBMycsICAvKiDwkJGfIPCQkaMgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MScsICdceEIxJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTEnLCAnXHhCMicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkxJywgJ1x4QjMnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MScsICdceEI0JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTEnLCAnXHhCOCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkxJywgJ1x4QkEnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MScsICdceEJDJywgIC8qIPCQkbEg8JCRsiDwkJGzIPCQkbQg8JCRuCDwkJG6IPCQkbwgKi8KLSAgICAnXDAnLAotICAgICdceEYwJywgJ1x4OTAnLCAnXHg5MScsICdceEI0JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTEnLCAnXHhCQicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkxJywgJ1x4QjknLCAgLyog8JCRtCDwkJG7IPCQkbkgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjYnLCAnXHg4OScsICcgJywgJ1x4RTAnLCAnXHhCNicsICdceDlBJywgJyAnLCAnXHhFMCcsICdceEI2JywgJ1x4OUQnLCAnICcsICdceEUwJywgJ1x4QjYnLCAnXHhCMycsICcgJywgJ1x4RTAnLCAnXHhCNicsICdceEI0JywgJyAnLCAnXHhFMCcsICdceEI2JywgJ1x4QkEnLCAnICcsICdceEUwJywgJ1x4QjYnLCAnXHhCRCcsICcgJywgJ1x4RTAnLCAnXHhCNycsICdceDg2JywgIC8qIOC2iSDgtpog4LadIOC2syDgtrQg4La6IOC2vSDgt4YgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjYnLCAnXHg5MScsICcgJywgJ1x4RTAnLCAnXHhCNicsICdceDk0JywgJyAnLCAnXHhFMCcsICdceEI2JywgJ1x4OUQnLCAnICcsICdceEUwJywgJ1x4QjYnLCAnXHhBMicsICcgJywgJ1x4RTAnLCAnXHhCNicsICdceEE3JywgJyAnLCAnXHhFMCcsICdceEI2JywgJ1x4QUUnLCAnICcsICdceEUwJywgJ1x4QjYnLCAnXHhCMCcsICcgJywgJ1x4RTAnLCAnXHhCNicsICdceEJCJywgIC8qIOC2kSDgtpQg4LadIOC2oiDgtqcg4LauIOC2sCDgtrsgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjYnLCAnXHhBRicsICcgJywgJ1x4RTAnLCAnXHhCNicsICdceEIzJywgJyAnLCAnXHhFMCcsICdceEI2JywgJ1x4OEInLCAnICcsICdceEUwJywgJ1x4QjYnLCAnXHhCRCcsICcgJywgJ1x4RTAnLCAnXHhCNicsICdceEFEJywgJ1x4RTAnLCAnXHhCNycsICdceDk2JywgJyAnLCAnXHhFMCcsICdceEI2JywgJ1x4QUQnLCAnXHhFMCcsICdceEI3JywgJ1x4OTQnLCAnICcsICdceEUwJywgJ1x4QjYnLCAnXHhCNicsICdceEUwJywgJ1x4QjcnLCAnXHg5NCcsICcgJywgJ1x4RTAnLCAnXHhCNicsICdceEFGJywgJ1x4RTAnLCAnXHhCNycsICdceDk0JywgIC8qIOC2ryDgtrMg4LaLIOC2vSDgtq3gt5Yg4Lat4LeUIOC2tuC3lCDgtq/gt5QgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QUUnLCAnXHg4QicsICcgJywgJ1x4RTEnLCAnXHhBRScsICdceDlFJywgJyAnLCAnXHhFMScsICdceEFFJywgJ1x4QUUnLCAnICcsICdceEUxJywgJ1x4QUUnLCAnXHhCRCcsICcgJywgJ1x4RTEnLCAnXHhBRScsICdceEIwJywgJyAnLCAnXHhFMScsICdceEFFJywgJ1x4ODgnLCAgLyog4a6LIOGuniDhrq4g4a69IOGusCDhroggKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QUUnLCAnXHg4NCcsICcgJywgJ1x4RTEnLCAnXHhBRScsICdceDk0JywgJyAnLCAnXHhFMScsICdceEFFJywgJ1x4OTUnLCAnICcsICdceEUxJywgJ1x4QUUnLCAnXHg5NycsICcgJywgJ1x4RTEnLCAnXHhBRScsICdceEIwJywgJyAnLCAnXHhFMScsICdceEFFJywgJ1x4ODYnLCAnICcsICdceEUxJywgJ1x4QUUnLCAnXHg4OCcsICcgJywgJ1x4RTEnLCAnXHhBRScsICdceDg5JywgIC8qIOGuhCDhrpQg4a6VIOGulyDhrrAg4a6GIOGuiCDhrokgKi8KLSAgICAnXDAnLAotICAgICdceEUxJywgJ1x4QUUnLCAnXHhCQycsICcgJywgJ1x4RTEnLCAnXHhCMycsICdceDg0JywgIC8qIOGuvCDhs4QgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QUEnLCAnXHg4NicsICcgJywgJ1x4RUEnLCAnXHhBQScsICdceDk0JywgJyAnLCAnXHhFQScsICdceEFBJywgJ1x4OTInLCAnICcsICdceEVBJywgJ1x4QUEnLCAnXHg5NicsICcgJywgJ1x4RUEnLCAnXHhBQScsICdceEFCJywgIC8qIOqqhiDqqpQg6qqSIOqqliDqqqsgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4QUEnLCAnXHg4OScsICcgJywgJ1x4RUEnLCAnXHhBQScsICdceEFCJywgJyAnLCAnXHhFQScsICdceEFBJywgJ1x4QUUnLCAgLyog6qqJIOqqqyDqqq4gKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QUUnLCAnXHg4OScsICcgJywgJ1x4RTAnLCAnXHhBRScsICdceDkyJywgJyAnLCAnXHhFMCcsICdceEFFJywgJ1x4OTMnLCAnICcsICdceEUwJywgJ1x4QUUnLCAnXHhCMScsICcgJywgJ1x4RTAnLCAnXHhBRScsICdceDg4JywgJyAnLCAnXHhFMCcsICdceEFFJywgJ1x4OTUnLCAnICcsICdceEUwJywgJ1x4QUUnLCAnXHg5OScsICcgJywgJ1x4RTAnLCAnXHhBRScsICdceDlBJywgIC8qIOCuiSDgrpIg4K6TIOCusSDgrogg4K6VIOCumSDgrpogKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QUUnLCAnXHg5NScsICcgJywgJ1x4RTAnLCAnXHhBRScsICdceDlBJywgJyAnLCAnXHhFMCcsICdceEFFJywgJ1x4QjInLCAnICcsICdceEUwJywgJ1x4QUUnLCAnXHhCNicsICcgJywgJ1x4RTAnLCAnXHhBRScsICdceDg5JywgJyAnLCAnXHhFMCcsICdceEFFJywgJ1x4OTknLCAnICcsICdceEUwJywgJ1x4QUUnLCAnXHg5RicsICcgJywgJ1x4RTAnLCAnXHhBRScsICdceEFBJywgIC8qIOCulSDgrpog4K6yIOCutiDgrokg4K6ZIOCunyDgrqogKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjAnLCAnXHg4NycsICcgJywgJ1x4RTAnLCAnXHhCMCcsICdceDhDJywgJyAnLCAnXHhFMCcsICdceEIwJywgJ1x4OTknLCAnICcsICdceEUwJywgJ1x4QjAnLCAnXHg5RScsICcgJywgJ1x4RTAnLCAnXHhCMCcsICdceEEzJywgJyAnLCAnXHhFMCcsICdceEIwJywgJ1x4QjEnLCAnICcsICdceEUwJywgJ1x4QjEnLCAnXHhBRicsICAvKiDgsIcg4LCMIOCwmSDgsJ4g4LCjIOCwsSDgsa8gKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjAnLCAnXHg4NScsICcgJywgJ1x4RTAnLCAnXHhCMCcsICdceDk1JywgJyAnLCAnXHhFMCcsICdceEIwJywgJ1x4OUEnLCAnICcsICdceEUwJywgJ1x4QjAnLCAnXHhCMCcsICcgJywgJ1x4RTAnLCAnXHhCMCcsICdceEJEJywgJyAnLCAnXHhFMCcsICdceEIxJywgJ1x4QTgnLCAnICcsICdceEUwJywgJ1x4QjEnLCAnXHhBQycsICAvKiDgsIUg4LCVIOCwmiDgsLAg4LC9IOCxqCDgsawgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjgnLCAnXHg5QScsICcgJywgJ1x4RTAnLCAnXHhCOScsICdceDgwJywgJyAnLCAnXHhFMCcsICdceEI5JywgJ1x4ODEnLCAnICcsICdceEUwJywgJ1x4QjgnLCAnXHhBRCcsICcgJywgJ1x4RTAnLCAnXHhCOCcsICdceDgxJywgJyAnLCAnXHhFMCcsICdceEI4JywgJ1x4QjInLCAgLyog4LiaIOC5gCDguYEg4LitIOC4gSDguLIgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjgnLCAnXHg5QScsICcgJywgJ1x4RTAnLCAnXHhCOCcsICdceDlCJywgJyAnLCAnXHhFMCcsICdceEI4JywgJ1x4QTknLCAnICcsICdceEUwJywgJ1x4QjgnLCAnXHhBRicsICcgJywgJ1x4RTAnLCAnXHhCOCcsICdceEFEJywgJyAnLCAnXHhFMCcsICdceEI4JywgJ1x4QTInLCAnICcsICdceEUwJywgJ1x4QjgnLCAnXHhBRScsICAvKiDguJog4LibIOC4qSDguK8g4LitIOC4oiDguK4gKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjgnLCAnXHg5QicsICcgJywgJ1x4RTAnLCAnXHhCOCcsICdceDlEJywgJyAnLCAnXHhFMCcsICdceEI4JywgJ1x4OUYnLCAgLyog4LibIOC4nSDguJ8gKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjknLCAnXHg4MicsICcgJywgJ1x4RTAnLCAnXHhCOScsICdceDgzJywgJyAnLCAnXHhFMCcsICdceEI5JywgJ1x4ODQnLCAgLyog4LmCIOC5gyDguYQgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjgnLCAnXHg4RScsICcgJywgJ1x4RTAnLCAnXHhCOCcsICdceDhGJywgJyAnLCAnXHhFMCcsICdceEI4JywgJ1x4QTQnLCAnICcsICdceEUwJywgJ1x4QjgnLCAnXHhBNicsICAvKiDguI4g4LiPIOC4pCDguKYgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjgnLCAnXHg4RCcsICcgJywgJ1x4RTAnLCAnXHhCOCcsICdceDkwJywgIC8qIOC4jSDguJAgKi8KLSAgICAnXDAnLAotICAgICdceEUwJywgJ1x4QjknLCAnXHg5MCcsICcgJywgJ1x4RTAnLCAnXHhCOScsICdceDkxJywgJyAnLCAnXHhFMCcsICdceEI5JywgJ1x4OTMnLCAgLyog4LmQIOC5kSDguZMgKi8KLSAgICAnXDAnLAotICAgICdceEUyJywgJ1x4QjUnLCAnXHg5NCcsICcgJywgJ1x4RTInLCAnXHhCNScsICdceDk5JywgJyAnLCAnXHhFMicsICdceEI1JywgJ1x4OUInLCAnICcsICdceEUyJywgJ1x4QjUnLCAnXHg5RScsICcgJywgJ1x4RTInLCAnXHhCNCcsICdceEI1JywgJyAnLCAnXHhFMicsICdceEI0JywgJ1x4QkMnLCAnICcsICdceEUyJywgJ1x4QjQnLCAnXHhCOScsICcgJywgJ1x4RTInLCAnXHhCNScsICdceDhFJywgIC8qIOK1lCDitZkg4rWbIOK1niDitLUg4rS8IOK0uSDitY4gKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4OTcnLCAnXHg4RCcsICcgJywgJ1x4RUEnLCAnXHg5OCcsICdceDk2JywgJyAnLCAnXHhFQScsICdceDk4JywgJ1x4OTknLCAnICcsICdceEVBJywgJ1x4OTgnLCAnXHg5QycsICcgJywgJ1x4RUEnLCAnXHg5NicsICdceDlDJywgJyAnLCAnXHhFQScsICdceDk2JywgJ1x4OUQnLCAnICcsICdceEVBJywgJ1x4OTQnLCAnXHg4NScsICcgJywgJ1x4RUEnLCAnXHg5NScsICdceEEyJywgIC8qIOqXjSDqmJYg6piZIOqYnCDqlpwg6padIOqUhSDqlaIgKi8KLSAgICAnXDAnLAotICAgICdceEVBJywgJ1x4OTcnLCAnXHg4RCcsICcgJywgJ1x4RUEnLCAnXHg5OCcsICdceDk2JywgJyAnLCAnXHhFQScsICdceDk4JywgJ1x4OTknLCAnICcsICdceEVBJywgJ1x4OTcnLCAnXHg5RScsICcgJywgJ1x4RUEnLCAnXHg5NCcsICdceDg1JywgJyAnLCAnXHhFQScsICdceDk1JywgJ1x4QTInLCAnICcsICdceEVBJywgJ1x4OTYnLCAnXHg5QycsICcgJywgJ1x4RUEnLCAnXHg5NCcsICdceDg2JywgIC8qIOqXjSDqmJYg6piZIOqXniDqlIUg6pWiIOqWnCDqlIYgKi8KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKSwotICAgICdcMCcsCi0gICAgJ1x4RTQnLCAnXHhCQicsICdceDk2JywgJyAnLCAnXHhFNCcsICdceEJCJywgJ1x4QUMnLCAnICcsICdceEU0JywgJ1x4QkQnLCAnXHhBMCcsICcgJywgJ1x4RTQnLCAnXHhCRScsICdceDg2JywgJyAnLCAnXHhFNScsICdceDgwJywgJ1x4OTEnLCAnICcsICdceEU1JywgJ1x4ODgnLCAnXHhCMCcsICcgJywgJ1x4RTUnLCAnXHg5MicsICdceDhDJywgJyAnLCAnXHhFNScsICdceDlDJywgJ1x4QjAnLCAgLyog5LuWIOS7rCDkvaAg5L6GIOWAkSDliLAg5ZKMIOWcsCAqLwotICAgICcgJywgJ1x4RTUnLCAnXHhBRicsICdceEI5JywgJyAnLCAnXHhFNScsICdceEIwJywgJ1x4OEQnLCAnICcsICdceEU1JywgJ1x4QjAnLCAnXHhCMScsICcgJywgJ1x4RTUnLCAnXHhCOCcsICdceEFEJywgJyAnLCAnXHhFNicsICdceDg4JywgJ1x4OTEnLCAnICcsICdceEU2JywgJ1x4OTcnLCAnXHhCNicsICcgJywgJ1x4RTYnLCAnXHg5OScsICdceDgyJywgJyAnLCAnXHhFNicsICdceDlDJywgJ1x4ODMnLCAgLyogIOWvuSDlsI0g5bCxIOW4rSDmiJEg5pe2IOaZgiDmnIMgKi8KLSAgICAnICcsICdceEU2JywgJ1x4OUQnLCAnXHhBNScsICcgJywgJ1x4RTcnLCAnXHg4MicsICdceEJBJywgJyAnLCAnXHhFOCcsICdceDgzJywgJ1x4QkQnLCAnICcsICdceEU4JywgJ1x4ODgnLCAnXHhCMCcsICcgJywgJ1x4RTgnLCAnXHhBQScsICdceEFBJywgJyAnLCAnXHhFOCcsICdceEFGJywgJ1x4QjQnLCAnICcsICdceEU4JywgJ1x4QkYnLCAnXHg5OScsICcgJywgJ1x4RTknLCAnXHg4MCcsICdceDk5JywgIC8qICDmnaUg54K6IOiDvSDoiLAg6KqqIOivtCDov5kg6YCZICovCi0gICAgJyAnLCAnXHhFOScsICdceEJEJywgJ1x4OEEnLCAnICcsICd8JywgIC8qICDpvYogfCAqLwotICAgICcgJywgJ1x4RTUnLCAnXHg4NicsICdceDlCJywgJyAnLCAnXHhFNScsICdceDkwJywgJ1x4OEMnLCAnICcsICdceEU1JywgJ1x4QjcnLCAnXHhCMicsICcgJywgJ1x4RTYnLCAnXHg4NCcsICdceEJGJywgJyAnLCAnXHhFNicsICdceDk3JywgJ1x4QTInLCAnICcsICdceEU2JywgJ1x4OTgnLCAnXHg5RicsICcgJywgJ1x4RTYnLCAnXHg5OCcsICdceEFGJywgJyAnLCAnXHhFNicsICdceDk5JywgJ1x4QUYnLCAgLyogIOWGmyDlkIwg5beyIOaEvyDml6Ig5pifIOaYryDmma8gKi8KLSAgICAnICcsICdceEU2JywgJ1x4QjAnLCAnXHg5MScsICcgJywgJ1x4RTcnLCAnXHg4NScsICdceEE3JywgJyAnLCAnXHhFNycsICdceDhFJywgJ1x4QjAnLCAnICcsICdceEU3JywgJ1x4OEYnLCAnXHhCRScsICcgJywgJ1x4RTcnLCAnXHg5MCcsICdceDg2JywgJyAnLCAnXHhFNycsICdceDk0JywgJ1x4QTgnLCAnICcsICdceEU3JywgJ1x4QkQnLCAnXHhBRScsICcgJywgJ1x4RTgnLCAnXHhBNicsICdceDgxJywgIC8qICDmsJEg54WnIOeOsCDnj74g55CGIOeUqCDnva4g6KaBICovCi0gICAgJyAnLCAnXHhFOCcsICdceEJCJywgJ1x4OEQnLCAnICcsICdceEU5JywgJ1x4ODInLCAnXHhBMycsICcgJywgJ1x4RTknLCAnXHg4NScsICdceDhEJywgJyAnLCAnXHhFOScsICdceDg3JywgJ1x4OEMnLCAnICcsICdceEU5JywgJ1x4OTYnLCAnXHg4QicsICcgJywgJ1x4RTknLCAnXHg5QicsICdceEI3JywgJyAnLCAnXHhFOScsICdceDlDJywgJ1x4QjInLCAnICcsICdceEU5JywgJ1x4OUQnLCAnXHhBMicsICAvKiAg6LuNIOmCoyDphY0g6YeMIOmWiyDpm7cg6ZyyIOmdoiAqLwotICAgICcgJywgJ1x4RTknLCAnXHhBMScsICdceEJFJywgIC8qICDpob4gKi8KLSAgICAnXDAnLAotICAgICdceEU0JywgJ1x4QjgnLCAnXHhBQScsICcgJywgJ1x4RTQnLCAnXHhCOCcsICdceEJBJywgJyAnLCAnXHhFNCcsICdceEJBJywgJ1x4QkEnLCAnICcsICdceEU0JywgJ1x4QkInLCAnXHg5NicsICcgJywgJ1x4RTQnLCAnXHhCQicsICdceEE1JywgJyAnLCAnXHhFNCcsICdceEJCJywgJ1x4QUMnLCAnICcsICdceEU0JywgJ1x4QkQnLCAnXHhBMCcsICcgJywgJ1x4RTQnLCAnXHhCRScsICdceDg2JywgIC8qIOS4qiDkuLog5Lq6IOS7liDku6Ug5LusIOS9oCDkvoYgKi8KLSAgICAnICcsICdceEU1JywgJ1x4ODAnLCAnXHg4QicsICcgJywgJ1x4RTUnLCAnXHg4MCcsICdceDkxJywgJyAnLCAnXHhFNScsICdceDg4JywgJ1x4QjAnLCAnICcsICdceEU1JywgJ1x4OTInLCAnXHg4QycsICcgJywgJ1x4RTUnLCAnXHhBNCcsICdceEE3JywgJyAnLCAnXHhFNScsICdceEFGJywgJ1x4QjknLCAnICcsICdceEU1JywgJ1x4QjAnLCAnXHg4RCcsICcgJywgJ1x4RTUnLCAnXHhCMCcsICdceEIxJywgIC8qICDlgIsg5YCRIOWIsCDlkowg5aSnIOWvuSDlsI0g5bCxICovCi0gICAgJyAnLCAnXHhFNicsICdceDg4JywgJ1x4OTEnLCAnICcsICdceEU2JywgJ1x4OTcnLCAnXHhCNicsICcgJywgJ1x4RTYnLCAnXHg5OScsICdceDgyJywgJyAnLCAnXHhFNicsICdceDlDJywgJ1x4ODknLCAnICcsICdceEU2JywgJ1x4OUQnLCAnXHhBNScsICcgJywgJ1x4RTcnLCAnXHg4MicsICdceEJBJywgJyAnLCAnXHhFOCcsICdceEE2JywgJ1x4ODEnLCAnICcsICdceEU4JywgJ1x4QUEnLCAnXHhBQScsICAvKiAg5oiRIOaXtiDmmYIg5pyJIOadpSDngrog6KaBIOiqqiAqLwotICAgICcgJywgJ1x4RTgnLCAnXHhBRicsICdceEI0JywgJyAnLCAnfCcsICAvKiAg6K+0IHwgKi8KLSAgICAnICcsICdceEU0JywgJ1x4QjgnLCAnXHhCQicsICcgJywgJ1x4RTQnLCAnXHhCQScsICdceDlCJywgJyAnLCAnXHhFNScsICdceDlCJywgJ1x4QTAnLCAnICcsICdceEU1JywgJ1x4QUUnLCAnXHg4MycsICcgJywgJ1x4RTYnLCAnXHg4MycsICdceEIzJywgJyAnLCAnXHhFNicsICdceDg0JywgJ1x4OEYnLCAnICcsICdceEU3JywgJ1x4OTAnLCAnXHg4NicsICcgJywgJ1x4RTcnLCAnXHg5NCcsICdceDlGJywgIC8qICDkuLsg5LqbIOWboCDlroMg5oOzIOaEjyDnkIYg55SfICovCi0gICAgJyAnLCAnXHhFNycsICdceDk1JywgJ1x4QjYnLCAnICcsICdceEU3JywgJ1x4OUMnLCAnXHg4QicsICcgJywgJ1x4RTcnLCAnXHg5RCcsICdceDgwJywgJyAnLCAnXHhFNycsICdceEJEJywgJ1x4QUUnLCAnICcsICdceEU4JywgJ1x4ODAnLCAnXHg4NScsICcgJywgJ1x4RTgnLCAnXHg4NycsICdceEFBJywgJyAnLCAnXHhFOCcsICdceDkxJywgJ1x4OTcnLCAnICcsICdceEU4JywgJ1x4QTMnLCAnXHhBMScsICAvKiAg55W2IOeciyDnnYAg572uIOiAhSDoh6og6JGXIOijoSAqLwotICAgICcgJywgJ1x4RTgnLCAnXHhCRicsICdceDg3JywgJyAnLCAnXHhFOCcsICdceEJGJywgJ1x4OTgnLCAnICcsICdceEU4JywgJ1x4QkYnLCAnXHg5QicsICcgJywgJ1x4RTknLCAnXHg4MCcsICdceEIyJywgJyAnLCAnXHhFOScsICdceDgxJywgJ1x4OEUnLCAnICcsICdceEU5JywgJ1x4ODEnLCAnXHg5MycsICcgJywgJ1x4RTknLCAnXHg4MicsICdceDg0JywgJyAnLCAnXHhFOScsICdceDg3JywgJ1x4OEMnLCAgLyogIOi/hyDov5gg6L+bIOmAsiDpgY4g6YGTIOmChCDph4wgKi8KLSAgICAnICcsICdceEU5JywgJ1x4OUQnLCAnXHhBMicsICAvKiAg6Z2iICovCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSktfQkxVRV9IQU5JX1ZFUlQKLSAgICAnXDAnLAotICAgICcgJywgJ1x4RTQnLCAnXHhCQScsICdceDlCJywgJyAnLCAnXHhFNCcsICdceEJCJywgJ1x4QUMnLCAnICcsICdceEU0JywgJ1x4QkQnLCAnXHhBMCcsICcgJywgJ1x4RTQnLCAnXHhCRScsICdceDg2JywgJyAnLCAnXHhFNScsICdceDgwJywgJ1x4OTEnLCAnICcsICdceEU1JywgJ1x4ODgnLCAnXHhCMCcsICcgJywgJ1x4RTUnLCAnXHg5MicsICdceDhDJywgJyAnLCAnXHhFNScsICdceDlDJywgJ1x4QjAnLCAgLyogIOS6myDku6wg5L2gIOS+hiDlgJEg5YiwIOWSjCDlnLAgKi8KLSAgICAnICcsICdceEU1JywgJ1x4QTUnLCAnXHhCOScsICcgJywgJ1x4RTUnLCAnXHhCMCcsICdceDg2JywgJyAnLCAnXHhFNScsICdceEIwJywgJ1x4ODcnLCAnICcsICdceEU1JywgJ1x4QjAnLCAnXHhCMScsICcgJywgJ1x4RTUnLCAnXHhCOScsICdceEI0JywgJyAnLCAnXHhFNScsICdceEJFJywgJ1x4OTcnLCAnICcsICdceEU2JywgJ1x4ODMnLCAnXHg4NScsICcgJywgJ1x4RTYnLCAnXHg5QycsICdceDgwJywgIC8qICDlpbkg5bCGIOWwhyDlsLEg5bm0IOW+lyDmg4Ug5pyAICovCi0gICAgJyAnLCAnXHhFNicsICdceEEwJywgJ1x4QjcnLCAnICcsICdceEU2JywgJ1x4QTgnLCAnXHhBMycsICcgJywgJ1x4RTcnLCAnXHg5MCcsICdceDg2JywgJyAnLCAnXHhFOCcsICdceDgzJywgJ1x4QkQnLCAnICcsICdceEU4JywgJ1x4QUEnLCAnXHhBQScsICcgJywgJ1x4RTgnLCAnXHhBRicsICdceEI0JywgJyAnLCAnXHhFOCcsICdceEJGJywgJ1x4OTknLCAnICcsICdceEU5JywgJ1x4ODAnLCAnXHg5OScsICAvKiAg5qC3IOaooyDnkIYg6IO9IOiqqiDor7Qg6L+ZIOmAmSAqLwotICAgICcgJywgJ1x4RTknLCAnXHg4MCcsICdceDlBJywgJyAnLCAnfCcsICAvKiAg6YCaIHwgKi8KLSAgICAnICcsICdceEU1JywgJ1x4OEQnLCAnXHhCMycsICcgJywgJ1x4RTUnLCAnXHg5MCcsICdceDk3JywgJyAnLCAnXHhFNScsICdceDkwJywgJ1x4QTcnLCAnICcsICdceEU1JywgJ1x4OTAnLCAnXHhBQycsICcgJywgJ1x4RTUnLCAnXHg5MScsICdceEEyJywgJyAnLCAnXHhFNScsICdceDkzJywgJ1x4ODEnLCAnICcsICdceEU1JywgJ1x4OTMnLCAnXHg4RCcsICcgJywgJ1x4RTUnLCAnXHg5NycsICdceDhFJywgIC8qICDljbMg5ZCXIOWQpyDlkKwg5ZGiIOWTgSDlk40g5ZeOICovCi0gICAgJyAnLCAnXHhFNScsICdceEI4JywgJ1x4ODgnLCAnICcsICdceEU1JywgJ1x4QjgnLCAnXHhBQicsICcgJywgJ1x4RTYnLCAnXHg5NCcsICdceEI2JywgJyAnLCAnXHhFNicsICdceDk2JywgJ1x4QUQnLCAnICcsICdceEU2JywgJ1x4OTYnLCAnXHhCNycsICcgJywgJ1x4RTYnLCAnXHg5OCcsICdceDhFJywgJyAnLCAnXHhFNycsICdceDlDJywgJ1x4QkMnLCAnICcsICdceEU5JywgJ1x4OTYnLCAnXHg5MycsICAvKiAg5biIIOW4qyDmlLYg5patIOaWtyDmmI4g55y8IOmWkyAqLwotICAgICcgJywgJ1x4RTknLCAnXHg5NycsICdceEI0JywgJyAnLCAnXHhFOScsICdceDk5JywgJ1x4ODUnLCAnICcsICdceEU5JywgJ1x4OTknLCAnXHg4OCcsICcgJywgJ1x4RTknLCAnXHg5OScsICdceDkwJywgJyAnLCAnXHhFOScsICdceDk5JywgJ1x4QTQnLCAnICcsICdceEU5JywgJ1x4OTknLCAnXHhCMycsICcgJywgJ1x4RTknLCAnXHg5QScsICdceDhGJywgJyAnLCAnXHhFOScsICdceDlBJywgJ1x4OUInLCAgLyogIOmXtCDpmYUg6ZmIIOmZkCDpmaQg6ZmzIOmajyDpmpsgKi8KLSAgICAnICcsICdceEU5JywgJ1x4OUEnLCAnXHhBOCcsICAvKiAg6ZqoICovCi0gICAgJ1wwJywKLSAgICAnXHhFNCcsICdceEJBJywgJ1x4OEInLCAnICcsICdceEU1JywgJ1x4ODknLCAnXHg4RCcsICcgJywgJ1x4RTUnLCAnXHhBRCcsICdceEI4JywgJyAnLCAnXHhFNScsICdceEIwJywgJ1x4ODYnLCAnICcsICdceEU1JywgJ1x4QjAnLCAnXHg4NycsICcgJywgJ1x4RTYnLCAnXHg4MycsICdceDg1JywgJyAnLCAnXHhFNicsICdceDgzJywgJ1x4QjMnLCAnICcsICdceEU2JywgJ1x4ODgnLCAnXHg5NicsICAvKiDkuosg5YmNIOWtuCDlsIYg5bCHIOaDhSDmg7Mg5oiWICovCi0gICAgJyAnLCAnXHhFNicsICdceDk0JywgJ1x4QkYnLCAnICcsICdceEU2JywgJ1x4OTYnLCAnXHhBRicsICcgJywgJ1x4RTYnLCAnXHg5NicsICdceEIwJywgJyAnLCAnXHhFNicsICdceEEwJywgJ1x4QjcnLCAnICcsICdceEU2JywgJ1x4QTgnLCAnXHhBMycsICcgJywgJ1x4RTYnLCAnXHhCMCcsICdceDkxJywgJyAnLCAnXHhFNicsICdceEIyJywgJ1x4OTInLCAnICcsICdceEU2JywgJ1x4QjInLCAnXHhBMScsICAvKiAg5pS/IOaWryDmlrAg5qC3IOaooyDmsJEg5rKSIOayoSAqLwotICAgICcgJywgJ1x4RTcnLCAnXHg4NCcsICdceEI2JywgJyAnLCAnXHhFNycsICdceDg5JywgJ1x4QjknLCAnICcsICdceEU3JywgJ1x4OEUnLCAnXHhCMCcsICcgJywgJ1x4RTcnLCAnXHg4RicsICdceEJFJywgJyAnLCAnXHhFNycsICdceDkwJywgJ1x4ODMnLCAnICcsICdceEU3JywgJ1x4QUMnLCAnXHhBQycsICcgJywgJ1x4RTcnLCAnXHhCNicsICdceDkzJywgJyAnLCAnXHhFOCcsICdceEIwJywgJ1x4ODEnLCAgLyogIOeEtiDnibkg546wIOePviDnkIMg56ysIOe2kyDosIEgKi8KLSAgICAnICcsICdceEU4JywgJ1x4QjUnLCAnXHhCNycsICcgJywgJ3wnLCAgLyogIOi1tyB8ICovCi0gICAgJyAnLCAnXHhFNCcsICdceEJFJywgJ1x4OEInLCAnICcsICdceEU1JywgJ1x4ODgnLCAnXHhBNScsICcgJywgJ1x4RTUnLCAnXHg4OCcsICdceEFCJywgJyAnLCAnXHhFNScsICdceDg4JywgJ1x4QjYnLCAnICcsICdceEU1JywgJ1x4OEEnLCAnXHhBOCcsICcgJywgJ1x4RTUnLCAnXHg4QicsICdceDk1JywgJyAnLCAnXHhFNScsICdceDkwJywgJ1x4OTcnLCAnICcsICdceEU1JywgJ1x4OTcnLCAnXHg4RScsICAvKiAg5L6LIOWIpSDliKsg5Yi2IOWKqCDli5Ug5ZCXIOWXjiAqLwotICAgICcgJywgJ1x4RTUnLCAnXHhBMicsICdceDlFJywgJyAnLCAnXHhFNicsICdceDhDJywgJ1x4ODcnLCAnICcsICdceEU2JywgJ1x4OTgnLCAnXHg4RScsICcgJywgJ1x4RTYnLCAnXHg5QycsICdceDlEJywgJyAnLCAnXHhFNicsICdceDlDJywgJ1x4OUYnLCAnICcsICdceEU2JywgJ1x4OUUnLCAnXHg4NCcsICcgJywgJ1x4RTcnLCAnXHg4OScsICdceEE5JywgJyAnLCAnXHhFNycsICdceEExJywgJ1x4QUUnLCAgLyogIOWiniDmjIcg5piOIOacnSDmnJ8g5p6EIOeJqSDnoa4gKi8KLSAgICAnICcsICdceEU3JywgJ1x4QTcnLCAnXHg4RCcsICcgJywgJ1x4RTgnLCAnXHhBQScsICdceEJGJywgJyAnLCAnXHhFOCcsICdceEIwJywgJ1x4ODMnLCAnICcsICdceEU4JywgJ1x4QjInLCAnXHhCQicsICcgJywgJ1x4RTgnLCAnXHhCNCcsICdceEI5JywgJyAnLCAnXHhFOScsICdceDgyJywgJ1x4QTMnLCAnICcsICdceEU5JywgJ1x4ODMnLCAnXHhCRCcsICcgJywgJ1x4RTknLCAnXHg5NicsICdceDkzJywgIC8qICDnp40g6Kq/IOiwgyDosrsg6LS5IOmCoyDpg70g6ZaTICovCi0gICAgJyAnLCAnXHhFOScsICdceDk3JywgJ1x4QjQnLCAgLyogIOmXtCAqLwotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fQ0pLX0JMVUVfSEFOSV9WRVJUICovCi0jZW5kaWYgLyogQUZfQ09ORklHX09QVElPTl9DSksgICAgICAgICAgICAgICAgKi8KLSAgICAnXDAnLAotCi0gIH07Ci0KLQotICAvKiBzdHJpbmdzZXRzIGFyZSBzcGVjaWZpYyB0byBzdHlsZXMgKi8KLSAgRlRfTE9DQUxfQVJSQVlfREVGKCBBRl9CbHVlX1N0cmluZ1JlYyApCi0gIGFmX2JsdWVfc3RyaW5nc2V0c1tdID0KLSAgewotICAgIC8qICovCi0gICAgeyBBRl9CTFVFX1NUUklOR19BRExBTV9DQVBJVEFMX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19BRExBTV9DQVBJVEFMX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19BRExBTV9TTUFMTF9UT1AsICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19BRExBTV9TTUFMTF9CT1RUT00sICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19BUkFCSUNfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0FSQUJJQ19CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVJBQklDX0pPSU4sICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9ORVVUUkFMIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOX0NBUElUQUxfVE9QLCAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19BUk1FTklBTl9DQVBJVEFMX0JPVFRPTSwgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fU01BTExfQVNDRU5ERVIsICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOX1NNQUxMX1RPUCwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fU01BTExfQk9UVE9NLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOX1NNQUxMX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVZFU1RBTl9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19BVkVTVEFOX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQkFNVU1fVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQkFNVU1fQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQkVOR0FMSV9UT1AsICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0JFTkdBTElfSEVBRCwgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19CRU5HQUxJX0JBU0UsIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX05FVVRSQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19CRU5HQUxJX0JBU0UsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0JVSElEX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19CVUhJRF9MQVJHRSwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQlVISURfU01BTEwsICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19CVUhJRF9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NIQUtNQV9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DSEFLTUFfQk9UVE9NLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hBS01BX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfVE9QLCAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19CT1RUT00sICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NNQUxMX1RPUCwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TTUFMTF9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NVUFNfVE9QLCAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU1VQU19CT1RUT00sICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FSSUFOX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBUklBTl9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfQ0FQSVRBTCwgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NIRVJPS0VFX0NBUElUQUwsICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DSEVST0tFRV9TTUFMTF9BU0NFTkRFUiwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfU01BTEwsICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DSEVST0tFRV9TTUFMTCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfU01BTExfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DT1BUSUNfQ0FQSVRBTF9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ09QVElDX0NBUElUQUxfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NPUFRJQ19TTUFMTF9UT1AsICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ09QVElDX1NNQUxMX0JPVFRPTSwgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DWVBSSU9UX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NZUFJJT1RfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ1lQUklPVF9TTUFMTCwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DWVBSSU9UX1NNQUxMLCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ1lSSUxMSUNfQ0FQSVRBTF9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NZUklMTElDX0NBUElUQUxfQk9UVE9NLCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DWVJJTExJQ19TTUFMTCwgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NZUklMTElDX1NNQUxMLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DWVJJTExJQ19TTUFMTF9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0RFVkFOQUdBUklfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0RFVkFOQUdBUklfSEVBRCwgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0RFVkFOQUdBUklfQkFTRSwgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX05FVVRSQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0RFVkFOQUdBUklfQkFTRSwgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0RFVkFOQUdBUklfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0RFU0VSRVRfQ0FQSVRBTF9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfREVTRVJFVF9DQVBJVEFMX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19ERVNFUkVUX1NNQUxMX1RPUCwgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfREVTRVJFVF9TTUFMTF9CT1RUT00sICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0VUSElPUElDX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0VUSElPUElDX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX01LSEVEUlVMSV9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9NS0hFRFJVTElfQk9UVE9NLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX01LSEVEUlVMSV9BU0NFTkRFUiwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTUtIRURSVUxJX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX0FTT01UQVZSVUxJX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9BU09NVEFWUlVMSV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9OVVNLSFVSSV9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfQVNDRU5ERVIsICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX05VU0tIVVJJX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0xBR09MSVRJQ19DQVBJVEFMX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HTEFHT0xJVElDX0NBUElUQUxfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dMQUdPTElUSUNfU01BTExfVE9QLCAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HTEFHT0xJVElDX1NNQUxMX0JPVFRPTSwgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR09USElDX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dPVEhJQ19CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR1JFRUtfQ0FQSVRBTF9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dSRUVLX0NBUElUQUxfQk9UVE9NLCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HUkVFS19TTUFMTF9CRVRBX1RPUCwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR1JFRUtfU01BTEwsICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HUkVFS19TTUFMTCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR1JFRUtfU01BTExfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HVUpBUkFUSV9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVSkFSQVRJX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HVUpBUkFUSV9BU0NFTkRFUiwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR1VKQVJBVElfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVSkFSQVRJX0RJR0lUX1RPUCwgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR1VSTVVLSElfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVUk1VS0hJX0hFQUQsICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HVVJNVUtISV9CQVNFLCAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX05FVVRSQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19HVVJNVUtISV9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR1VSTVVLSElfRElHSVRfVE9QLCBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19IRUJSRVdfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9MT05HICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0hFQlJFV19CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19IRUJSRVdfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tBWUFIX0xJX1RPUCwgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfS0FZQUhfTElfQk9UVE9NLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tBWUFIX0xJX0FTQ0VOREVSLCAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9ERVNDRU5ERVIsICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfS0FZQUhfTElfTEFSR0VfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19LSE1FUl9UT1AsICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tITUVSX1NVQlNDUklQVF9UT1AsICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9TVUJfVE9QICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19LSE1FUl9CT1RUT00sICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfS0hNRVJfREVTQ0VOREVSLCAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tITUVSX0xBUkdFX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfS0hNRVJfU1lNQk9MU19XQVhJTkdfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19LSE1FUl9TWU1CT0xTX1dBTklOR19CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tBTk5BREFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfS0FOTkFEQV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBT19UT1AsICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFPX0JPVFRPTSwgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBT19BU0NFTkRFUiwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19MQU9fTEFSR0VfQVNDRU5ERVIsIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFPX0RFU0NFTkRFUiwgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19MQVRJTl9DQVBJVEFMX1RPUCwgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fQ0FQSVRBTF9CT1RUT00sICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NNQUxMX0ZfVE9QLCAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19MQVRJTl9TTUFMTF9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NNQUxMX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19MQVRJTl9TTUFMTF9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfQ0FQSVRBTF9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfQ0FQSVRBTF9CT1RUT00sICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTExfRl9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTEwsICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTEwsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTExfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfQ0FQSVRBTF9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfQ0FQSVRBTF9CT1RUT00sICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfU01BTExfRl9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfU01BTEwsICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfU01BTEwsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfU01BTExfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xJU1VfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTElTVV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BTEFZQUxBTV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQUxBWUFMQU1fQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfQk9UVE9NLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfQVNDRU5ERVIsICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX05LT19UT1AsICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTktPX0JPVFRPTSwgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19OS09fU01BTExfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTktPX1NNQUxMX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgMCB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfT0xfQ0hJS0ksIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19PTF9DSElLSSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfT0xEX1RVUktJQ19UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19PTERfVFVSS0lDX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NBR0VfQ0FQSVRBTF9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19PU0FHRV9DQVBJVEFMX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX09TQUdFX0NBUElUQUxfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NBR0VfU01BTExfVE9QLCAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0JPVFRPTSwgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NBR0VfU01BTExfQVNDRU5ERVIsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19PU0FHRV9TTUFMTF9ERVNDRU5ERVIsICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NNQU5ZQV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19PU01BTllBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0FVUkFTSFRSQV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19TQVVSQVNIVFJBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9UT1AsICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9CT1RUT00sICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9ERVNDRU5ERVIsICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9TTUFMTF9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9TTUFMTF9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0lOSEFMQV9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19TSU5IQUxBX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NJTkhBTEFfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19TVU5EQU5FU0VfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfU1VOREFORVNFX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NVTkRBTkVTRV9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEFNSUxfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEFNSUxfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEFJX1ZJRVRfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEFJX1ZJRVRfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEVMVUdVX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX1RFTFVHVV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVElGSU5BR0gsIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19USUZJTkFHSCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9UT1AsICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9CT1RUT00sICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9BU0NFTkRFUiwgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9MQVJHRV9BU0NFTkRFUiwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9ERVNDRU5ERVIsICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9MQVJHRV9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9ESUdJVF9UT1AsICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVkFJX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX1ZBSV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fQ0pLCi0gICAgeyBBRl9CTFVFX1NUUklOR19DSktfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0NKS19UT1AgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DSktfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSktfQkxVRV9IQU5JX1ZFUlQKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NKS19MRUZULCAgIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX0hPUklaICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NKS19SSUdIVCwgIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX0hPUklaIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX1JJR0hUICAgfSwKLSNlbmRpZiAvKiBBRl9DT05GSUdfT1BUSU9OX0NKS19CTFVFX0hBTklfVkVSVCAqLwotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fQ0pLICAgICAgICAgICAgICAgICovCi0KLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmYmx1ZS5jaW4gYi9zcmMvYXV0b2ZpdC9hZmJsdWUuY2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTA4MGM1Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmYmx1ZS5jaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmJsdWUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgZGF0YSBmb3IgYmx1ZSBzdHJpbmdzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJhZnR5cGVzLmgiCi0KLQotICBGVF9MT0NBTF9BUlJBWV9ERUYoIGNoYXIgKQotICBhZl9ibHVlX3N0cmluZ3NbXSA9Ci0gIHsKLSAgICAvKiAqLwotQEFGX0JMVUVfU1RSSU5HU19BUlJBWUAKLSAgfTsKLQotCi0gIC8qIHN0cmluZ3NldHMgYXJlIHNwZWNpZmljIHRvIHN0eWxlcyAqLwotICBGVF9MT0NBTF9BUlJBWV9ERUYoIEFGX0JsdWVfU3RyaW5nUmVjICkKLSAgYWZfYmx1ZV9zdHJpbmdzZXRzW10gPQotICB7Ci0gICAgLyogKi8KLUBBRl9CTFVFX1NUUklOR1NFVFNfQVJSQVlACi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmJsdWUuZGF0IGIvc3JjL2F1dG9maXQvYWZibHVlLmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyZWI4Mi4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmJsdWUuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMTA2NiArMCwwIEBACi0vLyAgYWZibHVlLmRhdAotLy8KLS8vICAgIEF1dG8tZml0dGVyIGRhdGEgZm9yIGJsdWUgc3RyaW5ncy4KLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieQotLy8gIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLS8vCi0vLyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAotLy8gIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0Ci0vLyAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0vLyAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCi0vLyAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLS8vIFRoaXMgZmlsZSBjb250YWlucyBkYXRhIHNwZWNpZmljIHRvIGJsdWUgem9uZXMuICBJdCBnZXRzIHByb2Nlc3NlZCBieQotLy8gYSBzY3JpcHQgdG8gc2ltdWxhdGUgYGphZ2dlZCBhcnJheXMnLCB3aXRoIGVudW1lcmF0aW9uIHZhbHVlcyBob2xkaW5nCi0vLyBvZmZzZXRzIGludG8gdGhlIGFycmF5cy4KLS8vCi0vLyBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzIHJhdGhlciBzaW1wbGU6ICBBIHNlY3Rpb24gc3RhcnRzIHdpdGggdGhyZWUKLS8vIGxhYmVscyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhbmQgZm9sbG93ZWQgYnkgYSBjb2xvbiAoZXZlcnl0aGluZyBpbiBhCi0vLyBzaW5nbGUgbGluZSk7IHRoZSBmaXJzdCBsYWJlbCBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgZW51bWVyYXRpb24gdGVtcGxhdGUsCi0vLyB0aGUgc2Vjb25kIHRoZSBuYW1lIG9mIHRoZSBhcnJheSB0ZW1wbGF0ZSwgYW5kIHRoZSB0aGlyZCB0aGUgbmFtZSBvZiB0aGUKLS8vIGBtYXhpbXVtJyB0ZW1wbGF0ZS4gIFRoZSBzY3JpcHQgdGhlbiBmaWxscyB0aGUgY29ycmVzcG9uZGluZyB0ZW1wbGF0ZXMKLS8vIChpbmRpY2F0ZWQgYnkgYEAnIGNoYXJhY3RlcnMgYXJvdW5kIHRoZSBuYW1lKS4KLS8vCi0vLyBBIHNlY3Rpb24gY29udGFpbnMgb25lIG9yIG1vcmUgZGF0YSByZWNvcmRzLiAgRWFjaCBkYXRhIHJlY29yZCBjb25zaXN0cwotLy8gb2YgdHdvIG9yIG1vcmUgbGluZXMuICBUaGUgZmlyc3QgbGluZSBob2xkcyB0aGUgZW51bWVyYXRpb24gbmFtZSwgYW5kIHRoZQotLy8gcmVtYWluaW5nIGxpbmVzIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IGRhdGEuCi0vLwotLy8gVGhlcmUgYXJlIHR3byBwb3NzaWJsZSByZXByZXNlbnRhdGlvbnMgZm9yIGFycmF5IGRhdGEuCi0vLwotLy8gLSBBIHN0cmluZyBvZiBjaGFyYWN0ZXJzIG9yIGNoYXJhY3RlciBjbHVzdGVycyAoZm9yIGV4YW1wbGUsIHJlcHJlc2VudGluZwotLy8gICBBa3NoYXJhcywgRGV2YW5hZ2FyaSBzeWxsYWJsZXMpIGluIFVURi04IGVuY29kaW5nIGVuY2xvc2VkIGluIGRvdWJsZQotLy8gICBxdW90ZXMsIHVzaW5nIEMgc3ludGF4LCB3aGVyZSB0aGUgZWxlbWVudHMgYXJlIHNlcGFyYXRlZCBieSBzcGFjZXMuCi0vLyAgIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBzdHJpbmcgcGVyIGxpbmUsIHRodXMgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcKLS8vICAgZG91YmxlIHF1b3RlIG11c3QgYmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNoYXJhY3RlciBpbiB0aGUgbGluZSwKLS8vICAgcmVzcGVjdGl2ZWx5LCBpZ25vcmluZyB3aGl0ZXNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHN0cmluZy4gIElmCi0vLyAgIHRoZXJlIGFyZSBtdWx0aXBsZSBzdHJpbmdzIChpbiBtdWx0aXBsZSBsaW5lcyksIHRoZXkgYXJlIGNvbmNhdGVuYXRlZAotLy8gICB0byBhIHNpbmdsZSBzdHJpbmcuICBJbiB0aGUgb3V0cHV0LCBhIHN0cmluZyBnZXRzIHJlcHJlc2VudGVkIGFzIGEKLS8vICAgc2VyaWVzIG9mIHNpbmdsZXMgYnl0ZXMsIGZvbGxvd2VkIGJ5IGEgemVybyBieXRlLiAgVGhlIGVudW1lcmF0aW9uCi0vLyAgIHZhbHVlcyBzaW1wbHkgaG9sZCBieXRlIG9mZnNldHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb3JyZXNwb25kaW5nCi0vLyAgIHN0cmluZ3MuCi0vLwotLy8gICBGb3Igc3RyaW5ncywgdGhlIGBtYXhpbXVtJyB0ZW1wbGF0ZSBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLS8vICAgbm9uLXNwYWNlIGNoYXJhY3RlcnMgaW4gYWxsIHN0cmluZ3MuCi0vLwotLy8gLSBEYXRhIGJsb2NrcyBlbmNsb3NlZCBpbiBiYWxhbmNlZCBicmFjZXMsIHdoaWNoIGdldCBjb3BpZWQgdmVyYmF0aW0gYW5kCi0vLyAgIHdoaWNoIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzLiAgVGhlIG9wZW5pbmcgYnJhY2Ugb2YgYSBibG9jayBtdXN0IGJlCi0vLyAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBsaW5lIChpZ25vcmluZyB3aGl0ZXNwYWNlKSwgYW5kIHRoZSBjbG9zaW5nCi0vLyAgIGJyYWNlIHRoZSBsYXN0IChpZ25vcmluZyB3aGl0ZXNwYWNlIGFsc28pLiAgVGhlIHNjcmlwdCBhcHBlbmRzIGEgY29tbWEKLS8vICAgY2hhcmFjdGVyIGFmdGVyIGVhY2ggYmxvY2sgYW5kIGNvdW50cyB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBzZXQgdGhlCi0vLyAgIGVudW1lcmF0aW9uIHZhbHVlcy4KLS8vCi0vLyAgIEZvciBkYXRhIGJsb2NrcywgdGhlIGBtYXhpbXVtJyB0ZW1wbGF0ZSBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLS8vICAgYXJyYXkgZWxlbWVudHMuCi0vLwotLy8gQSBzZWN0aW9uIGNhbiBjb250YWluIGVpdGhlciBzdHJpbmdzIG9ubHkgb3IgZGF0YSBibG9ja3Mgb25seS4KLS8vCi0vLyBBIGNvbW1lbnQgbGluZSBzdGFydHMgd2l0aCBgLy8nOyBpdCBnZXRzIHJlbW92ZWQuICBBIHByZXByb2Nlc3NvcgotLy8gZGlyZWN0aXZlIGxpbmUgKHVzaW5nIHRoZSBzdGFuZGFyZCBzeW50YXggb2YgYGNwcCcpIHN0YXJ0cyB3aXRoIGAjJyBhbmQKLS8vIGdldHMgY29waWVkIHZlcmJhdGltIHRvIGJvdGggdGhlIGVudW1lcmF0aW9uIGFuZCB0aGUgYXJyYXkuICBXaGl0ZXNwYWNlCi0vLyBvdXRzaWRlIG9mIGEgc3RyaW5nIGlzIGluc2lnbmlmaWNhbnQuCi0vLwotLy8gUHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYXJlIGlnbm9yZWQgd2hpbGUgdGhlIHNjcmlwdCBjb21wdXRlcyBtYXhpbXVtCi0vLyB2YWx1ZXM7IHRoaXMgZXNzZW50aWFsbHkgbWVhbnMgdGhhdCB0aGUgbWF4aW11bSB2YWx1ZXMgY2FuIGVhc2lseSBiZSB0b28KLS8vIGxhcmdlLiAgR2l2ZW4gdGhhdCB0aGUgcHVycG9zZSBvZiB0aG9zZSB2YWx1ZXMgaXMgdG8gY3JlYXRlIGxvY2FsCi0vLyBmaXhlZC1zaXplIGFycmF5cyBhdCBjb21waWxlIHRpbWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBvZiB0aGUgYmx1ZSB6b25lCi0vLyBkYXRhLCB0aGlzIGlzbid0IGEgcHJvYmxlbS4gIE5vdGUgdGhlIGZpbmFsIHplcm8gYnl0ZSBvZiBhIHN0cmluZyBpcyBub3QKLS8vIGNvdW50ZWQuICBOb3RlIGFsc28gdGhhdCB0aGUgY291bnQgaG9sZHMgdGhlIG51bWJlciBvZiBVVEYtOCBlbmNvZGVkCi0vLyBjaGFyYWN0ZXJzLCBub3QgYnl0ZXMuCi0KLQotLy8gVGhlIGJsdWUgem9uZSBzdHJpbmcgZGF0YSwgdG8gYmUgdXNlZCBpbiB0aGUgYmx1ZSBzdHJpbmdzZXRzIGJlbG93LgotCi1BRl9CTFVFX1NUUklOR19FTlVNIEFGX0JMVUVfU1RSSU5HU19BUlJBWSBBRl9CTFVFX1NUUklOR19NQVhfTEVOOgotCi0gIEFGX0JMVUVfU1RSSU5HX0FETEFNX0NBUElUQUxfVE9QCi0gICAgIvCepIwg8J6khSDwnqSIIPCepI8g8J6klCDwnqSaIgotICBBRl9CTFVFX1NUUklOR19BRExBTV9DQVBJVEFMX0JPVFRPTQotICAgICLwnqSCIPCepJYiCi0gIEFGX0JMVUVfU1RSSU5HX0FETEFNX1NNQUxMX1RPUAotICAgICLwnqSsIPCepK4g8J6kuyDwnqS8IPCepL4iCi0gIEFGX0JMVUVfU1RSSU5HX0FETEFNX1NNQUxMX0JPVFRPTQotICAgICLwnqSkIPCepKgg8J6kqSDwnqStIPCepLQg8J6kuCDwnqS6IPCepYAiCi0KLSAgQUZfQkxVRV9TVFJJTkdfQVJBQklDX1RPUAotICAgICLYpyDYpSDZhCDZgyDYtyDYuCIKLSAgQUZfQkxVRV9TVFJJTkdfQVJBQklDX0JPVFRPTQotICAgICLYqiDYqyDYtyDYuCDZgyIKLSAgLy8gV2UgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSBhY2Nlc3MgdG8gbWVkaWFsIGZvcm1zIHZpYSBVbmljb2RlIGluIGNhc2UKLSAgLy8gQXJhYmljIHByZXNlbnRhdGlvbmFsIGZvcm1zIGFyZSBtaXNzaW5nLiAgVGhlIG9ubHkgY2hhcmFjdGVyIHRoYXQgaXMKLSAgLy8gZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzYW1lIHZlcnRpY2FsIHBvc2l0aW9uIHdpdGggam9pbmluZyAodGhpcyBpcywKLSAgLy8gbm9uLWlzb2xhdGVkKSBmb3JtcyBpcyBVKzA2NDAsIEFSQUJJQyBUQVRXRUVMLCB3aGljaCBtdXN0IGpvaW4gYm90aAotICAvLyByb3VuZCBhbmQgZmxhdCBjdXJ2ZXMuCi0gIEFGX0JMVUVfU1RSSU5HX0FSQUJJQ19KT0lOCi0gICAgItmAIgotCi0gIEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOX0NBUElUQUxfVE9QCi0gICAgItSxINWEINWSINWNINSyINSzINS0INWVIgotICBBRl9CTFVFX1NUUklOR19BUk1FTklBTl9DQVBJVEFMX0JPVFRPTQotICAgICLVkiDViCDUtCDVgyDVhyDVjSDVjyDVlSIKLSAgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fU01BTExfQVNDRU5ERVIKLSAgICAi1aUg1acg1asg1bQg1b4g1oYg1bMiCi0gIEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOX1NNQUxMX1RPUAotICAgICLVoSDVtSDWgiDVvSDVoyDVtyDWgCDWhSIKLSAgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fU01BTExfQk9UVE9NCi0gICAgItWwINW4INWzINWhINWlINWuINW9INaFIgotICBBRl9CTFVFX1NUUklOR19BUk1FTklBTl9TTUFMTF9ERVNDRU5ERVIKLSAgICAi1aIg1agg1asg1awg1bIg1bog1oMg1oEiCi0KLSAgQUZfQkxVRV9TVFJJTkdfQVZFU1RBTl9UT1AKLSAgICAi8JCsgCDwkKyBIPCQrJAg8JCsmyIKLSAgQUZfQkxVRV9TVFJJTkdfQVZFU1RBTl9CT1RUT00KLSAgICAi8JCsgCDwkKyBIgotCi0gIEFGX0JMVUVfU1RSSU5HX0JBTVVNX1RPUAotICAgICLqmqcg6pqoIOqbmyDqm4kg6puBIOqbiCDqm6sg6puvIgotICBBRl9CTFVFX1NUUklOR19CQU1VTV9CT1RUT00KLSAgICAi6pqtIOqasyDqmrYg6pusIOqaoiDqmr0g6puvIOqbsiIKLQotICBBRl9CTFVFX1NUUklOR19CRU5HQUxJX0JBU0UKLSAgICAi4KaFIOCmoSDgpqQg4KaoIOCmrCDgpq0g4KayIOCmlSIKLSAgQUZfQkxVRV9TVFJJTkdfQkVOR0FMSV9UT1AKLSAgICAi4KaHIOCmnyDgpqAg4Ka/IOCngCDgp4gg4KeXIgotICBBRl9CTFVFX1NUUklOR19CRU5HQUxJX0hFQUQKLSAgICAi4KaTIOCmjyDgpqEg4KakIOCmqCDgpqwg4KayIOCmlSIKLQotICBBRl9CTFVFX1NUUklOR19CVUhJRF9UT1AKLSAgICAi4Z2QIOGdiCIKLSAgQUZfQkxVRV9TVFJJTkdfQlVISURfTEFSR0UKLSAgICAi4Z2FIOGdiiDhnY4iCi0gIEFGX0JMVUVfU1RSSU5HX0JVSElEX1NNQUxMCi0gICAgIuGdgiDhnYMg4Z2JIOGdjCIKLSAgQUZfQkxVRV9TVFJJTkdfQlVISURfQk9UVE9NCi0gICAgIuGdgCDhnYMg4Z2GIOGdiSDhnYsg4Z2PIOGdkSIKLQotICBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfVE9QCi0gICAgIuGXnCDhlrQg4ZCBIOGSoyDhkasg4ZGOIOGUkSDhl7AiCi0gIEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19CT1RUT00KLSAgICAi4Ze2IOGWtSDhkqcg4ZCDIOGRjCDhko0g4ZSRIOGXoiIKLSAgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NNQUxMX1RPUAotICAgICLhk5Mg4ZOVIOGTgCDhk4Ig4ZOEIOGVhCDhlYYg4ZijIgotICBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU01BTExfQk9UVE9NCi0gICAgIuGVgyDhk4Ig4ZOAIOGVgiDhk5cg4ZOaIOGVhiDhmKMiCi0gIEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TVVBTX1RPUAotICAgICLhkKog4ZmGIOGjmCDhkKIg4ZK+IOGjlyDhlIYiCi0gIEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TVVBTX0JPVFRPTQotICAgICLhmYYg4ZeuIOGSuyDhkJ4g4ZSGIOGSoSDhkqIg4ZORIgotCi0gIEFGX0JMVUVfU1RSSU5HX0NBUklBTl9UT1AKLSAgICAi8JCKpyDwkIqrIPCQiqwg8JCKrSDwkIqxIPCQirog8JCKvCDwkIq/IgotICBBRl9CTFVFX1NUUklOR19DQVJJQU5fQk9UVE9NCi0gICAgIvCQiqMg8JCKpyDwkIq3IPCQi4Ag8JCKqyDwkIq4IPCQi4kiCi0KLSAgQUZfQkxVRV9TVFJJTkdfQ0hBS01BX1RPUAotICAgICLwkYSDIPCRhIUg8JGEiSDwkYSZIPCRhJciCi0gIEFGX0JMVUVfU1RSSU5HX0NIQUtNQV9CT1RUT00KLSAgICAi8JGEhSDwkYSbIPCRhJ0g8JGElyDwkYSTIgotICBBRl9CTFVFX1NUUklOR19DSEFLTUFfREVTQ0VOREVSCi0gICAgIvCRhJbwkYSz8JGEoiDwkYSY8JGEs/CRhKIg8JGEmfCRhLPwkYSiIPCRhKTwkYSz8JGEoiDwkYSl8JGEs/CRhKIiCi0KLSAgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfQ0FQSVRBTAotICAgICLhj4Yg4Y67IOGOrCDhj4Mg4Y6kIOGPoyDhjqYg4Y+VIgotICBBRl9CTFVFX1NUUklOR19DSEVST0tFRV9TTUFMTF9BU0NFTkRFUgotICAgICLqrpIg6q6kIOqutiDqrbQg6q2+IOqulyDqrp0g6q6/IgotICBBRl9CTFVFX1NUUklOR19DSEVST0tFRV9TTUFMTAotICAgICLqrpYg6q28IOqukyDqrqAg6q6zIOqttiDqrqUg6q67IgotICBBRl9CTFVFX1NUUklOR19DSEVST0tFRV9TTUFMTF9ERVNDRU5ERVIKLSAgICAi4Y+4IOqukCDqrbkg6q27IgotCi0gIEFGX0JMVUVfU1RSSU5HX0NPUFRJQ19DQVBJVEFMX1RPUAotICAgICLisowg4rKOIOKyoCDis54g4rKeIOKykCDisqQg4rOKIgotICBBRl9CTFVFX1NUUklOR19DT1BUSUNfQ0FQSVRBTF9CT1RUT00KLSAgICAi4rOQIOKzmCDis54g4rKOIOKyniDispAg4rOcIOKysCIKLSAgQUZfQkxVRV9TVFJJTkdfQ09QVElDX1NNQUxMX1RPUAotICAgICLiso0g4rKPIOKyoSDis58g4rKfIOKykSDisqUg4rOLIgotICBBRl9CTFVFX1NUUklOR19DT1BUSUNfU01BTExfQk9UVE9NCi0gICAgIuKzkSDis5kg4rOfIOKyjyDisp8g4rKRIOKznSDis5IiCi0KLSAgQUZfQkxVRV9TVFJJTkdfQ1lQUklPVF9UT1AKLSAgICAi8JCgjSDwkKCZIPCQoLMg8JCgsSDwkKCFIPCQoJMg8JCgoyDwkKCmIgotICBBRl9CTFVFX1NUUklOR19DWVBSSU9UX0JPVFRPTQotICAgICLwkKCDIPCQoIog8JCgmyDwkKCjIPCQoLMg8JCgtSDwkKCQIgotICBBRl9CTFVFX1NUUklOR19DWVBSSU9UX1NNQUxMCi0gICAgIvCQoIgg8JCgjyDwkKCWIgotCi0gIEFGX0JMVUVfU1RSSU5HX0NZUklMTElDX0NBUElUQUxfVE9QCi0gICAgItCRINCSINCVINCfINCXINCeINChINCtIgotICBBRl9CTFVFX1NUUklOR19DWVJJTExJQ19DQVBJVEFMX0JPVFRPTQotICAgICLQkSDQkiDQlSDQqCDQlyDQniDQoSDQrSIKLSAgQUZfQkxVRV9TVFJJTkdfQ1lSSUxMSUNfU01BTEwKLSAgICAi0YUg0L8g0L0g0Ygg0LUg0Lcg0L4g0YEiCi0gIEFGX0JMVUVfU1RSSU5HX0NZUklMTElDX1NNQUxMX0RFU0NFTkRFUgotICAgICLRgCDRgyDRhCIKLQotICBBRl9CTFVFX1NUUklOR19ERVNFUkVUX0NBUElUQUxfVE9QCi0gICAgIvCQkIIg8JCQhCDwkJCLIPCQkJcg8JCQkSIKLSAgQUZfQkxVRV9TVFJJTkdfREVTRVJFVF9DQVBJVEFMX0JPVFRPTQotICAgICLwkJCAIPCQkIIg8JCQhCDwkJCXIPCQkJsiCi0gIEFGX0JMVUVfU1RSSU5HX0RFU0VSRVRfU01BTExfVE9QCi0gICAgIvCQkKog8JCQrCDwkJCzIPCQkL8g8JCQuSIKLSAgQUZfQkxVRV9TVFJJTkdfREVTRVJFVF9TTUFMTF9CT1RUT00KLSAgICAi8JCQqCDwkJCqIPCQkKwg8JCQvyDwkJGDIgotCi0gIEFGX0JMVUVfU1RSSU5HX0RFVkFOQUdBUklfQkFTRQotICAgICLgpJUg4KSuIOCkhSDgpIYg4KSlIOCkpyDgpK0g4KS2IgotICBBRl9CTFVFX1NUUklOR19ERVZBTkFHQVJJX1RPUAotICAgICLgpIgg4KSQIOCkkyDgpJQg4KS/IOClgCDgpYsg4KWMIgotICAvLyBub3RlIHRoYXQgc29tZSBmb250cyBoYXZlIGV4dHJlbWUgdmFyaWF0aW9uIGluIHRoZSBoZWlnaHQgb2YgdGhlCi0gIC8vIHJvdW5kIGhlYWQgZWxlbWVudHM7IGZvciB0aGlzIHJlYXNvbiB3ZSBhbHNvIGRlZmluZSB0aGUgYGJhc2UnCi0gIC8vIGJsdWUgem9uZSwgd2hpY2ggbXVzdCBiZSBhbHdheXMgcHJlc2VudAotICBBRl9CTFVFX1NUUklOR19ERVZBTkFHQVJJX0hFQUQKLSAgICAi4KSVIOCkriDgpIUg4KSGIOCkpSDgpKcg4KStIOCktiIKLSAgQUZfQkxVRV9TVFJJTkdfREVWQU5BR0FSSV9CT1RUT00KLSAgICAi4KWBIOClgyIKLQotICBBRl9CTFVFX1NUUklOR19FVEhJT1BJQ19UT1AKLSAgICAi4YiAIOGIgyDhi5gg4Y2QIOGImyDhiaAg4YuLIOGLkCIKLSAgQUZfQkxVRV9TVFJJTkdfRVRISU9QSUNfQk9UVE9NCi0gICAgIuGIiCDhiJAg4YmgIOGLmCDhiIAg4YiqIOGLkCDhjKgiCi0KLSAgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTUtIRURSVUxJX1RPUAotICAgICLhg5Ig4YOTIOGDlCDhg5Ug4YOXIOGDmCDhg50g4YOmIgotICBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9NS0hFRFJVTElfQk9UVE9NCi0gICAgIuGDkCDhg5Yg4YObIOGDoSDhg6gg4YOrIOGDriDhg54iCi0gIEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX01LSEVEUlVMSV9BU0NFTkRFUgotICAgICLhg6Eg4YOuIOGDpSDhg5Yg4YObIOGDqCDhg6kg4YOsIgotICBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9NS0hFRFJVTElfREVTQ0VOREVSCi0gICAgIuGDlCDhg5Ug4YOfIOGDoiDhg6Mg4YOkIOGDpSDhg6ciCi0KLSAgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fQVNPTVRBVlJVTElfVE9QCi0gICAgIuGCsSDhgqcg4YK5IOGCvCDhgqQg4YKlIOGCsyDhgroiCi0gIEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX0FTT01UQVZSVUxJX0JPVFRPTQotICAgICLhgqQg4YKlIOGCpyDhgqgg4YKmIOGCsSDhgqog4YKrIgotCi0gIEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX05VU0tIVVJJX1RPUAotICAgICLitIEg4rSXIOK0giDitIQg4rSFIOK0hyDitJQg4rSWIgotICBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9OVVNLSFVSSV9CT1RUT00KLSAgICAi4rSIIOK0jCDitJYg4rSOIOK0gyDitIYg4rSLIOK0oiIKLSAgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfQVNDRU5ERVIKLSAgICAi4rSQIOK0kSDitJMg4rSVIOK0mSDitJsg4rShIOK0oyIKLSAgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfREVTQ0VOREVSCi0gICAgIuK0hCDitIUg4rSUIOK0lSDitIEg4rSCIOK0mCDitJ0iCi0KLSAgQUZfQkxVRV9TVFJJTkdfR0xBR09MSVRJQ19DQVBJVEFMX1RPUAotICAgICLisIUg4rCUIOKwqiDisIQg4rCCIOKwiiDisKsg4rCLIgotICBBRl9CTFVFX1NUUklOR19HTEFHT0xJVElDX0NBUElUQUxfQk9UVE9NCi0gICAgIuKwhSDisIQg4rCCIOKwqiDisJ4g4rChIOKwiiDisJQiCi0gIEFGX0JMVUVfU1RSSU5HX0dMQUdPTElUSUNfU01BTExfVE9QCi0gICAgIuKwtSDisYQg4rGaIOKwtCDisLIg4rC6IOKxmyDisLsiCi0gIEFGX0JMVUVfU1RSSU5HX0dMQUdPTElUSUNfU01BTExfQk9UVE9NCi0gICAgIuKwtSDisLQg4rCyIOKxmiDisY4g4rGRIOKwuiDisYQiCi0KLSAgQUZfQkxVRV9TVFJJTkdfR09USElDX1RPUAotICAgICLwkIyyIPCQjLYg8JCNgCDwkI2EIPCQjLQg8JCNgyDwkI2IIPCQjL4iCi0gIEFGX0JMVUVfU1RSSU5HX0dPVEhJQ19CT1RUT00KLSAgICAi8JCMtiDwkIy0IPCQjYMg8JCNiCIKLQotICBBRl9CTFVFX1NUUklOR19HUkVFS19DQVBJVEFMX1RPUAotICAgICLOkyDOkiDOlSDOliDOmCDOnyDOqSIKLSAgQUZfQkxVRV9TVFJJTkdfR1JFRUtfQ0FQSVRBTF9CT1RUT00KLSAgICAizpIgzpQgzpYgzp4gzpggzp8iCi0gIEFGX0JMVUVfU1RSSU5HX0dSRUVLX1NNQUxMX0JFVEFfVE9QCi0gICAgIs6yIM64IM60IM62IM67IM6+IgotICBBRl9CTFVFX1NUUklOR19HUkVFS19TTUFMTAotICAgICLOsSDOtSDOuSDOvyDPgCDPgyDPhCDPiSIKLSAgQUZfQkxVRV9TVFJJTkdfR1JFRUtfU01BTExfREVTQ0VOREVSCi0gICAgIs6yIM6zIM63IM68IM+BIM+GIM+HIM+IIgotCi0gIEFGX0JMVUVfU1RSSU5HX0dVSkFSQVRJX1RPUAotICAgICLgqqQg4KqoIOCqiyDgqowg4KqbIOCqnyDgqrAg4KumIgotICBBRl9CTFVFX1NUUklOR19HVUpBUkFUSV9CT1RUT00KLSAgICAi4KqWIOCqlyDgqpgg4KqeIOCqhyDgqogg4KqgIOCqnCIKLSAgQUZfQkxVRV9TVFJJTkdfR1VKQVJBVElfQVNDRU5ERVIKLSAgICAi4KqIIOCqiiDgqr8g4KuAIOCqsuCrgCDgqrbgq43gqprgqr8g4Kqc4Kq/IOCquOCrgCIKLSAgQUZfQkxVRV9TVFJJTkdfR1VKQVJBVElfREVTQ0VOREVSCi0gICAgIuCrgSDgq4Mg4KuEIOCqluCrgSDgqpvgq4Mg4Kqb4KuEIgotICBBRl9CTFVFX1NUUklOR19HVUpBUkFUSV9ESUdJVF9UT1AKLSAgICAi4KumIOCrpyDgq6gg4KupIOCrrSIKLQotICBBRl9CTFVFX1NUUklOR19HVVJNVUtISV9CQVNFCi0gICAgIuColSDgqJcg4KiZIOComiDgqJwg4KikIOCopyDgqLgiCi0gIEFGX0JMVUVfU1RSSU5HX0dVUk1VS0hJX0hFQUQKLSAgICAi4KiVIOColyDgqJkg4KiaIOConCDgqKQg4KinIOCouCIKLSAgQUZfQkxVRV9TVFJJTkdfR1VSTVVLSElfVE9QCi0gICAgIuCohyDgqIgg4KiJIOCojyDgqJMg4KmzIOCovyDgqYAiCi0gIEFGX0JMVUVfU1RSSU5HX0dVUk1VS0hJX0JPVFRPTQotICAgICLgqIUg4KiPIOCokyDgqJcg4KicIOCooCDgqLAg4Ki4IgotICBBRl9CTFVFX1NUUklOR19HVVJNVUtISV9ESUdJVF9UT1AKLSAgICAi4KmmIOCppyDgqagg4KmpIOCprSIKLQotICBBRl9CTFVFX1NUUklOR19IRUJSRVdfVE9QCi0gICAgIteRINeTINeUINeXINeaINebINedINehIgotICBBRl9CTFVFX1NUUklOR19IRUJSRVdfQk9UVE9NCi0gICAgIteRINeYINebINedINehINemIgotICBBRl9CTFVFX1NUUklOR19IRUJSRVdfREVTQ0VOREVSCi0gICAgItenINeaINefINejINelIgotCi0gIEFGX0JMVUVfU1RSSU5HX0tBTk5BREFfVE9QCi0gICAgIuCyhyDgsoog4LKQIOCyoyDgsrjgsr4g4LKo4LK+IOCypuCyviDgsrDgsr4iCi0gIEFGX0JMVUVfU1RSSU5HX0tBTk5BREFfQk9UVE9NCi0gICAgIuCyhSDgsokg4LKOIOCysiDgs6Yg4LOoIOCzrCDgs60iCi0KLSAgQUZfQkxVRV9TVFJJTkdfS0FZQUhfTElfVE9QCi0gICAgIuqkhSDqpI8g6qSBIOqkiyDqpIAg6qSNIgotICBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9CT1RUT00KLSAgICAi6qSIIOqkmCDqpIAg6qSNIOqkoiIKLSAgQUZfQkxVRV9TVFJJTkdfS0FZQUhfTElfQVNDRU5ERVIKLSAgICAi6qSWIOqkoSIKLSAgQUZfQkxVRV9TVFJJTkdfS0FZQUhfTElfREVTQ0VOREVSCi0gICAgIuqkkSDqpJwg6qSeIgotICBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9MQVJHRV9ERVNDRU5ERVIKLSAgICAi6qSR6qSsIOqknOqkrSDqpJTqpKwiCi0KLSAgQUZfQkxVRV9TVFJJTkdfS0hNRVJfVE9QCi0gICAgIuGegSDhnpEg4Z6TIOGepyDhnqkg4Z62IgotICBBRl9CTFVFX1NUUklOR19LSE1FUl9TVUJTQ1JJUFRfVE9QCi0gICAgIuGegOGfkuGegCDhnoDhn5LhnoEg4Z6A4Z+S4Z6CIOGegOGfkuGekCIKLSAgQUZfQkxVRV9TVFJJTkdfS0hNRVJfQk9UVE9NCi0gICAgIuGegSDhnoMg4Z6FIOGeiyDhnpQg4Z6YIOGemSDhnrIiCi0gIEFGX0JMVUVfU1RSSU5HX0tITUVSX0RFU0NFTkRFUgotICAgICLhno/hn5Lhnpog4Z6a4Z+AIOGesuGfkuGemSDhnqLhnr8iCi0gIEFGX0JMVUVfU1RSSU5HX0tITUVSX0xBUkdFX0RFU0NFTkRFUgotICAgICLhnpPhn5Lhno/hn5Lhnprhn4Mg4Z6E4Z+S4Z6B4Z+S4Z6ZIOGegOGfkuGelOGfgCDhnoXhn5Lhnprhn4Ag4Z6T4Z+S4Z6P4Z6/IOGem+GfkuGelOGevyIKLQotICBBRl9CTFVFX1NUUklOR19LSE1FUl9TWU1CT0xTX1dBWElOR19UT1AKLSAgICAi4aegIOGnoSIKLSAgQUZfQkxVRV9TVFJJTkdfS0hNRVJfU1lNQk9MU19XQU5JTkdfQk9UVE9NCi0gICAgIuGntiDhp7kiCi0KLSAgQUZfQkxVRV9TVFJJTkdfTEFPX1RPUAotICAgICLgurIg4LqUIOC6rSDguqEg4LqlIOC6pyDguqMg4LqHIgotICBBRl9CTFVFX1NUUklOR19MQU9fQk9UVE9NCi0gICAgIuC6siDguq0g4LqaIOC6jSDguqMg4LquIOC6pyDguqIiCi0gIEFGX0JMVUVfU1RSSU5HX0xBT19BU0NFTkRFUgotICAgICLgupsg4LqiIOC6nyDgup0iCi0gIEFGX0JMVUVfU1RSSU5HX0xBT19MQVJHRV9BU0NFTkRFUgotICAgICLgu4Ig4LuEIOC7gyIKLSAgQUZfQkxVRV9TVFJJTkdfTEFPX0RFU0NFTkRFUgotICAgICLguocg4LqKIOC6liDgur0g4LuGIOC6ryIKLQotICBBRl9CTFVFX1NUUklOR19MQVRJTl9DQVBJVEFMX1RPUAotICAgICJUIEggRSBaIE8gQyBRIFMiCi0gIEFGX0JMVUVfU1RSSU5HX0xBVElOX0NBUElUQUxfQk9UVE9NCi0gICAgIkggRSBaIEwgTyBDIFUgUyIKLSAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfRl9UT1AKLSAgICAiZiBpIGogayBkIGIgaCIKLSAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfVE9QCi0gICAgInUgdiB4IHogbyBlIHMgYyIKLSAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfQk9UVE9NCi0gICAgIm4gciB4IHogbyBlIHMgYyIKLSAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfREVTQ0VOREVSCi0gICAgInAgcSBnIGogeSIKLQotICAvLyB3ZSBhc3N1bWUgdGhhdCBib3RoIHRoZSBzdWJzY3JpcHQgYW5kIHN1cGVyc2NyaXB0IHJhbmdlcwotICAvLyBkb24ndCBjb250YWluIG9sZHN0eWxlIGRpZ2l0cyAoYWN0dWFsbHksIG1vc3QgZm9udHMgcHJvYmFibHkKLSAgLy8gaGF2ZSBkaWdpdHMgb25seSBpbiB0aG9zZSByYW5nZXMpCi0gIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfQ0FQSVRBTF9UT1AKLSAgICAi4oKAIOKCgyDigoUg4oKHIOKCiCIKLSAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU1VCU19DQVBJVEFMX0JPVFRPTQotICAgICLigoAg4oKBIOKCgiDigoMg4oKIIgotICBBRl9CTFVFX1NUUklOR19MQVRJTl9TVUJTX1NNQUxMX0ZfVE9QCi0gICAgIuG1oiDisbwg4oKVIOKCliDigpciCi0gIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTEwKLSAgICAi4oKQIOKCkSDigpIg4oKTIOKCmSDigpsg4bWlIOG1pCDhtaMiCi0gIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTExfREVTQ0VOREVSCi0gICAgIuG1piDhtacg4bWoIOG1qSDigpoiCi0KLSAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU1VQU19DQVBJVEFMX1RPUAotICAgICLigbAgwrMg4oG1IOKBtyDhtYAg4bS0IOG0sSDhtLwiCi0gIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfQ0FQSVRBTF9CT1RUT00KLSAgICAi4oGwIMK5IMKyIMKzIOG0sSDhtLgg4bS8IOG1gSIKLSAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU1VQU19TTUFMTF9GX1RPUAotICAgICLhtYcg4bWIIOG1jyDKsCDKsiDhtqAg4oGxIgotICBBRl9CTFVFX1NUUklOR19MQVRJTl9TVVBTX1NNQUxMCi0gICAgIuG1iSDhtZIgyrMgy6Igy6Mg4bacIOG2uyIKLSAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU1VQU19TTUFMTF9ERVNDRU5ERVIKLSAgICAi4bWWIMq4IOG1jSIKLQotICBBRl9CTFVFX1NUUklOR19MSVNVX1RPUAotICAgICLqk6Eg6pOnIOqTsSDqk7Yg6pOpIOqTmiDqk7Ug6pOzIgotICBBRl9CTFVFX1NUUklOR19MSVNVX0JPVFRPTQotICAgICLqk5Ug6pOcIOqTniDqk6Eg6pObIOqToiDqk7Mg6pO0IgotCi0gIEFGX0JMVUVfU1RSSU5HX01BTEFZQUxBTV9UT1AKLSAgICAi4LSSIOC0nyDgtKAg4LSxIOC0miDgtKog4LSa4LWN4LSaIOC0quC1jeC0qiIKLSAgQUZfQkxVRV9TVFJJTkdfTUFMQVlBTEFNX0JPVFRPTQotICAgICLgtJ8g4LSgIOC0pyDgtLYg4LSYIOC0miDgtKUg4LSyIgotCi0gIEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfVE9QCi0gICAgIuGAgSDhgIIg4YCEIOGAkiDhgJ0g4YGlIOGBiiDhgYsiCi0gIEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfQk9UVE9NCi0gICAgIuGAhCDhgI4g4YCSIOGAlSDhgJcg4YCdIOGBiiDhgYsiCi0gIEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfQVNDRU5ERVIKLSAgICAi4YCpIOGAvCDhgY0g4YGPIOGBhiDhgKsg4YCtIgotICBBRl9CTFVFX1NUUklOR19NWUFOTUFSX0RFU0NFTkRFUgotICAgICLhgIkg4YCKIOGApSDhgKkg4YCoIOGBgiDhgYUg4YGJIgotCi0gIEFGX0JMVUVfU1RSSU5HX05LT19UT1AKLSAgICAi35Ag34kg35Ig358g35Yg35wg36Ag36UiCi0gIEFGX0JMVUVfU1RSSU5HX05LT19CT1RUT00KLSAgICAi34Ag35gg36Eg36Ag36UiCi0gIEFGX0JMVUVfU1RSSU5HX05LT19TTUFMTF9UT1AKLSAgICAi348g35sg34siCi0gIEFGX0JMVUVfU1RSSU5HX05LT19TTUFMTF9CT1RUT00KLSAgICAi344g348g35sg34siCi0KLSAgQUZfQkxVRV9TVFJJTkdfT0xfQ0hJS0kKLSAgICAi4bGbIOGxnCDhsZ0g4bGhIOGxoiDhsaUiCi0KLSAgQUZfQkxVRV9TVFJJTkdfT0xEX1RVUktJQ19UT1AKLSAgICAi8JCwlyDwkLCYIPCQsKciCi0gIEFGX0JMVUVfU1RSSU5HX09MRF9UVVJLSUNfQk9UVE9NCi0gICAgIvCQsIkg8JCwlyDwkLCmIPCQsKciCi0KLSAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfQ0FQSVRBTF9UT1AKLSAgICAi8JCSviDwkJONIPCQk5Ig8JCTkyDwkJK7IPCQk4Ig8JCStSDwkJOGIgotICBBRl9CTFVFX1NUUklOR19PU0FHRV9DQVBJVEFMX0JPVFRPTQotICAgICLwkJKwIPCQk40g8JCTgiDwkJK/IPCQk44g8JCSuSIKLSAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfQ0FQSVRBTF9ERVNDRU5ERVIKLSAgICAi8JCSvCDwkJK9IPCQkr4iCi0gIEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX1RPUAotICAgICLwkJO1IPCQk7Yg8JCTuiDwkJO7IPCQk50g8JCToyDwkJOqIPCQk64iCi0gIEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0JPVFRPTQotICAgICLwkJOYIPCQk5og8JCToyDwkJO1IPCQk6Eg8JCTpyDwkJOqIPCQk7YiCi0gIEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0FTQ0VOREVSCi0gICAgIvCQk6Qg8JCTpiDwkJO4IPCQk7kg8JCTmyIKLSAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfU01BTExfREVTQ0VOREVSCi0gICAgIvCQk6Qg8JCTpSDwkJOmIgotCi0gIEFGX0JMVUVfU1RSSU5HX09TTUFOWUFfVE9QCi0gICAgIvCQkoYg8JCSiSDwkJKQIPCQkpIg8JCSmCDwkJKbIPCQkqAg8JCSoyIKLSAgQUZfQkxVRV9TVFJJTkdfT1NNQU5ZQV9CT1RUT00KLSAgICAi8JCSgCDwkJKCIPCQkoYg8JCSiCDwkJKKIPCQkpIg8JCSoCDwkJKpIgotCi0gIEFGX0JMVUVfU1RSSU5HX1NBVVJBU0hUUkFfVE9QCi0gICAgIuqinCDqop4g6qKzIOqigiDqopYg6qKSIOqinSDqopsiCi0gIEFGX0JMVUVfU1RSSU5HX1NBVVJBU0hUUkFfQk9UVE9NCi0gICAgIuqigiDqoqgg6qK6IOqipCDqoo4iCi0KLSAgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9UT1AKLSAgICAi8JCRlSDwkJGZIgotICBBRl9CTFVFX1NUUklOR19TSEFWSUFOX0JPVFRPTQotICAgICLwkJGUIPCQkZYg8JCRlyDwkJG5IPCQkbsiCi0gIEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fREVTQ0VOREVSCi0gICAgIvCQkZ8g8JCRoyIKLSAgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9TTUFMTF9UT1AKLSAgICAi8JCRsSDwkJGyIPCQkbMg8JCRtCDwkJG4IPCQkbog8JCRvCIKLSAgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9TTUFMTF9CT1RUT00KLSAgICAi8JCRtCDwkJG7IPCQkbkiCi0KLSAgQUZfQkxVRV9TVFJJTkdfU0lOSEFMQV9UT1AKLSAgICAi4LaJIOC2miDgtp0g4LazIOC2tCDgtrog4La9IOC3hiIKLSAgQUZfQkxVRV9TVFJJTkdfU0lOSEFMQV9CT1RUT00KLSAgICAi4LaRIOC2lCDgtp0g4LaiIOC2pyDgtq4g4LawIOC2uyIKLSAgQUZfQkxVRV9TVFJJTkdfU0lOSEFMQV9ERVNDRU5ERVIKLSAgICAi4LavIOC2syDgtosg4La9IOC2reC3liDgtq3gt5Qg4La24LeUIOC2r+C3lCIKLQotICBBRl9CTFVFX1NUUklOR19TVU5EQU5FU0VfVE9QCi0gICAgIuGuiyDhrp4g4a6uIOGuvSDhrrAg4a6IIgotICBBRl9CTFVFX1NUUklOR19TVU5EQU5FU0VfQk9UVE9NCi0gICAgIuGuhCDhrpQg4a6VIOGulyDhrrAg4a6GIOGuiCDhrokiCi0gIEFGX0JMVUVfU1RSSU5HX1NVTkRBTkVTRV9ERVNDRU5ERVIKLSAgICAi4a68IOGzhCIKLQotICBBRl9CTFVFX1NUUklOR19UQUlfVklFVF9UT1AKLSAgICAi6qqGIOqqlCDqqpIg6qqWIOqqqyIKLSAgQUZfQkxVRV9TVFJJTkdfVEFJX1ZJRVRfQk9UVE9NCi0gICAgIuqqiSDqqqsg6qquIgotCi0gIEFGX0JMVUVfU1RSSU5HX1RBTUlMX1RPUAotICAgICLgrokg4K6SIOCukyDgrrEg4K6IIOCulSDgrpkg4K6aIgotICBBRl9CTFVFX1NUUklOR19UQU1JTF9CT1RUT00KLSAgICAi4K6VIOCumiDgrrIg4K62IOCuiSDgrpkg4K6fIOCuqiIKLQotICBBRl9CTFVFX1NUUklOR19URUxVR1VfVE9QCi0gICAgIuCwhyDgsIwg4LCZIOCwniDgsKMg4LCxIOCxryIKLSAgQUZfQkxVRV9TVFJJTkdfVEVMVUdVX0JPVFRPTQotICAgICLgsIUg4LCVIOCwmiDgsLAg4LC9IOCxqCDgsawiCi0KLSAgQUZfQkxVRV9TVFJJTkdfVEhBSV9UT1AKLSAgICAi4LiaIOC5gCDguYEg4LitIOC4gSDguLIiCi0gIEFGX0JMVUVfU1RSSU5HX1RIQUlfQk9UVE9NCi0gICAgIuC4miDguJsg4LipIOC4ryDguK0g4LiiIOC4riIKLSAgQUZfQkxVRV9TVFJJTkdfVEhBSV9BU0NFTkRFUgotICAgICLguJsg4LidIOC4nyIKLSAgQUZfQkxVRV9TVFJJTkdfVEhBSV9MQVJHRV9BU0NFTkRFUgotICAgICLguYIg4LmDIOC5hCIKLSAgQUZfQkxVRV9TVFJJTkdfVEhBSV9ERVNDRU5ERVIKLSAgICAi4LiOIOC4jyDguKQg4LimIgotICBBRl9CTFVFX1NUUklOR19USEFJX0xBUkdFX0RFU0NFTkRFUgotICAgICLguI0g4LiQIgotICBBRl9CTFVFX1NUUklOR19USEFJX0RJR0lUX1RPUAotICAgICLguZAg4LmRIOC5kyIKLQotICBBRl9CTFVFX1NUUklOR19USUZJTkFHSAotICAgICLitZQg4rWZIOK1myDitZ4g4rS1IOK0vCDitLkg4rWOIgotCi0gIEFGX0JMVUVfU1RSSU5HX1ZBSV9UT1AKLSAgICAi6peNIOqYliDqmJkg6picIOqWnCDqlp0g6pSFIOqVoiIKLSAgQUZfQkxVRV9TVFJJTkdfVkFJX0JPVFRPTQotICAgICLql40g6piWIOqYmSDql54g6pSFIOqVoiDqlpwg6pSGIgotCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKSwotCi0gIEFGX0JMVUVfU1RSSU5HX0NKS19UT1AKLSAgICAi5LuWIOS7rCDkvaAg5L6GIOWAkSDliLAg5ZKMIOWcsCIKLSAgICAiIOWvuSDlsI0g5bCxIOW4rSDmiJEg5pe2IOaZgiDmnIMiCi0gICAgIiDmnaUg54K6IOiDvSDoiLAg6KqqIOivtCDov5kg6YCZIgotICAgICIg6b2KIHwiCi0gICAgIiDlhpsg5ZCMIOW3siDmhL8g5peiIOaYnyDmmK8g5pmvIgotICAgICIg5rCRIOeFpyDnjrAg54++IOeQhiDnlKgg572uIOimgSIKLSAgICAiIOi7jSDpgqMg6YWNIOmHjCDplosg6Zu3IOmcsiDpnaIiCi0gICAgIiDpob4iCi0gIEFGX0JMVUVfU1RSSU5HX0NKS19CT1RUT00KLSAgICAi5LiqIOS4uiDkurog5LuWIOS7pSDku6wg5L2gIOS+hiIKLSAgICAiIOWAiyDlgJEg5YiwIOWSjCDlpKcg5a+5IOWwjSDlsLEiCi0gICAgIiDmiJEg5pe2IOaZgiDmnIkg5p2lIOeCuiDopoEg6KqqIgotICAgICIg6K+0IHwiCi0gICAgIiDkuLsg5LqbIOWboCDlroMg5oOzIOaEjyDnkIYg55SfIgotICAgICIg55W2IOeciyDnnYAg572uIOiAhSDoh6og6JGXIOijoSIKLSAgICAiIOi/hyDov5gg6L+bIOmAsiDpgY4g6YGTIOmChCDph4wiCi0gICAgIiDpnaIiCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKS19CTFVFX0hBTklfVkVSVAotCi0gIEFGX0JMVUVfU1RSSU5HX0NKS19MRUZUCi0gICAgIiDkupsg5LusIOS9oCDkvoYg5YCRIOWIsCDlkowg5ZywIgotICAgICIg5aW5IOWwhiDlsIcg5bCxIOW5tCDlvpcg5oOFIOacgCIKLSAgICAiIOagtyDmqKMg55CGIOiDvSDoqqog6K+0IOi/mSDpgJkiCi0gICAgIiDpgJogfCIKLSAgICAiIOWNsyDlkJcg5ZCnIOWQrCDlkaIg5ZOBIOWTjSDll44iCi0gICAgIiDluIgg5birIOaUtiDmlq0g5pa3IOaYjiDnnLwg6ZaTIgotICAgICIg6Ze0IOmZhSDpmYgg6ZmQIOmZpCDpmbMg6ZqPIOmamyIKLSAgICAiIOmaqCIKLSAgQUZfQkxVRV9TVFJJTkdfQ0pLX1JJR0hUCi0gICAgIuS6iyDliY0g5a24IOWwhiDlsIcg5oOFIOaDsyDmiJYiCi0gICAgIiDmlL8g5pavIOaWsCDmoLcg5qijIOawkSDmspIg5rKhIgotICAgICIg54S2IOeJuSDnjrAg54++IOeQgyDnrKwg57aTIOiwgSIKLSAgICAiIOi1tyB8IgotICAgICIg5L6LIOWIpSDliKsg5Yi2IOWKqCDli5Ug5ZCXIOWXjiIKLSAgICAiIOWiniDmjIcg5piOIOacnSDmnJ8g5p6EIOeJqSDnoa4iCi0gICAgIiDnp40g6Kq/IOiwgyDosrsg6LS5IOmCoyDpg70g6ZaTIgotICAgICIg6Ze0IgotCi0jZW5kaWYgLyogQUZfQ09ORklHX09QVElPTl9DSktfQkxVRV9IQU5JX1ZFUlQgKi8KLQotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fQ0pLICAgICAgICAgICAgICAgICovCi0KLQotLy8gVGhlIGJsdWUgem9uZSBzdHJpbmdzZXRzLCBhcyB1c2VkIGluIHRoZSBzY3JpcHQgc3R5bGVzLCBjZi4gYGFmc3R5bGVzLmgnLgotLy8KLS8vIFRoZSBBRl9CTFVFX1BST1BFUlRZX1hYWCBmbGFncyBhcmUgZGVmaW5lZCBpbiBgYWZibHVlLmgnOyBoZXJlIHNvbWUKLS8vIGV4cGxhbmF0aW9ucy4KLS8vCi0vLyBBIGJsdWUgem9uZSBpbiBnZW5lcmFsIGlzIGRlZmluZWQgYnkgYSByZWZlcmVuY2UgYW5kIGFuIG92ZXJzaG9vdCBsaW5lLgotLy8gRHVyaW5nIHRoZSBoaW50aW5nIHByb2Nlc3MsIGFsbCBjb29yZGluYXRlIHZhbHVlcyBiZXR3ZWVuIHRob3NlIHR3byBsaW5lcwotLy8gYXJlIHNldCBlcXVhbCB0byB0aGUgcmVmZXJlbmNlIHZhbHVlLCBwcm92aWRlZCB0aGF0IHRoZSBibHVlIHpvbmUgaXMgbm90Ci0vLyB3aWRlciB0aGFuIDAuNzUgcGl4ZWxzIChvdGhlcndpc2UgdGhlIGJsdWUgem9uZSBnZXRzIGlnbm9yZWQpLiAgQWxsCi0vLyBlbnRyaWVzIG11c3QgaGF2ZSBgQUZfQkxVRV9TVFJJTkdfTUFYJyBhcyB0aGUgZmluYWwgbGluZS4KLS8vCi0vLyBEdXJpbmcgdGhlIGdseXBoIGFuYWx5c2lzLCBlZGdlcyBhcmUgc29ydGVkIGZyb20gYm90dG9tIHRvIHRvcCwgYW5kIHRoZW4KLS8vIHNlcXVlbnRpYWxseSBjaGVja2VkLCBlZGdlIGJ5IGVkZ2UsIGFnYWluc3QgdGhlIGJsdWUgem9uZXMgaW4gdGhlIG9yZGVyCi0vLyBnaXZlbiBiZWxvdy4KLS8vCi0vLwotLy8gbGF0aW4gYXV0by1oaW50ZXIKLS8vIC0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQ2hhcmFjdGVycyBpbiBhIGJsdWUgc3RyaW5nIGFyZSBhdXRvbWF0aWNhbGx5IGNsYXNzaWZpZWQgYXMgaGF2aW5nIGEgZmxhdAotLy8gKHJlZmVyZW5jZSkgb3IgYSByb3VuZCAob3ZlcnNob290KSBleHRyZW11bS4gIFRoZSBibHVlIHpvbmUgaXMgdGhlbiBzZXQKLS8vIHVwIGJ5IHRoZSBtZWFuIHZhbHVlcyBvZiBhbGwgZmxhdCBleHRyZW1hIGFuZCBhbGwgcm91bmQgZXh0cmVtYSwKLS8vIHJlc3BlY3RpdmVseS4gIE9ubHkgaG9yaXpvbnRhbCBibHVlIHpvbmVzIChpLmUuLCBhZGp1c3RpbmcgdmVydGljYWwKLS8vIGNvb3JkaW5hdGUgdmFsdWVzKSBhcmUgc3VwcG9ydGVkLgotLy8KLS8vIFNvbWUgc2NyaXB0cyBsaWtlIEtobWVyIG5lZWQgY2hhcmFjdGVyIGNvbXBvc2l0aW9uIHRvIGdldCBhbGwgbmVjZXNzYXJ5Ci0vLyBibHVlIHpvbmVzLCBzaW5jZSBVbmljb2RlIG9ubHkgcHJvdmlkZXMgYW4gYWJzdHJhY3QgZGF0YSBtb2RlbCB0aGF0Ci0vLyBkb2Vzbid0IHJlcHJlc2VudCBhbGwgcG9zc2libGUgZ2x5cGggc2hhcGVzLiAgRm9yIHN1Y2ggY2hhcmFjdGVyCi0vLyBjbHVzdGVycywgdGhlIEhhcmZCdXp6IGxpYnJhcnkgaXMgdXNlZCB0byBjb252ZXJ0IHRoZW0gaW50byB0aGUKLS8vIGNvcnJlc3BvbmRpbmcgZ2x5cGhzLiAgVGhlIGxhcmdlc3QgZ2x5cGggZWxlbWVudCAod2hlcmUgYGxhcmdlc3QnIGNhbiBiZQotLy8gZWl0aGVyIGBsYXJnZXN0IGFzY2VuZGVyJyBvciBgbGFyZ2VzdCBkZXNjZW5kZXInKSB0aGVuIGRlZmluZXMgdGhlCi0vLyBjb3JyZXNwb25kaW5nIGZsYXQgb3Igcm91bmQgZXh0cmVtdW0uCi0vLwotLy8gRm9yIHRoZSBsYXRpbiBhdXRvLWhpbnRlciwgdGhlIG92ZXJzaG9vdCBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gdGhlCi0vLyByZWZlcmVuY2UgZm9yIHRvcCB6b25lcywgYW5kIHZpY2UgdmVyc2EgZm9yIGJvdHRvbSB6b25lcy4KLS8vCi0vLyAgIExBVElOX1RPUAotLy8gICAgIFRha2UgdGhlIG1heGltdW0gZmxhdCBhbmQgcm91bmQgY29vcmRpbmF0ZSB2YWx1ZXMgb2YgdGhlIGJsdWUgc3RyaW5nCi0vLyAgICAgY2hhcmFjdGVycyBmb3IgY29tcHV0aW5nIHRoZSBibHVlIHpvbmUncyByZWZlcmVuY2UgYW5kIG92ZXJzaG9vdAotLy8gICAgIHZhbHVlcy4KLS8vCi0vLyAgICAgSWYgbm90IHNldCwgdGFrZSB0aGUgbWluaW11bSB2YWx1ZXMuCi0vLwotLy8gICAgIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBMQVRJTl9TVUJfVE9QJy4KLS8vCi0vLyAgIExBVElOX1NVQl9UT1AKLS8vICAgICBGb3IgYWxsIGdseXBocyBvZiBhIGNoYXJhY3RlciBjbHVzdGVyLCBjb21wdXRlIHRoZSBtYXhpbXVtIGZsYXQKLS8vICAgICBhbmQgcm91bmQgY29vcmRpbmF0ZSB2YWx1ZXMgb2YgZWFjaCBjb21wb25lbnQsIHRoZW4gdGFrZSB0aGUKLS8vICAgICBzbWFsbGVzdCBvZiB0aGUgbWF4aW11bSB2YWx1ZXMuICBUaGUgaWRlYSBpcyB0byBnZXQgdGhlIHRvcCBvZgotLy8gICAgIHN1YnNjcmlwdCBnbHlwaHMsIGFzIHVzZWQgaW4gS2htZXIsIGZvciBleGFtcGxlLiAgTm90ZSB0aGF0Ci0vLyAgICAgdGhpcyBtZWNoYW5pc20gZG9lc24ndCB3b3JrIGZvciBvcmRpbmFyeSBsaWdhdHVyZXMuCi0vLwotLy8gICAgIFRoaXMgZmxhZ3MgaW5kaWNhdGVzIGEgc2Vjb25kYXJ5IGJsdWUgem9uZTogSXQgZ2V0cyByZW1vdmVkIGlmCi0vLyAgICAgdGhlcmUgaXMgYSBub24tTEFUSU5fU1VCX1RPUCBibHVlIHpvbmUgYXQgdGhlIHNhbWUgY29vcmRpbmF0ZQotLy8gICAgIHZhbHVlIChhZnRlciBzY2FsaW5nKS4KLS8vCi0vLyAgICAgTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYExBVElOX1RPUCcuCi0vLwotLy8gICBMQVRJTl9ORVVUUkFMCi0vLyAgICAgSWdub3JlIHJvdW5kIGV4dHJlbWEgYW5kIGRlZmluZSB0aGUgYmx1ZSB6b25lIHdpdGggZmxhdCB2YWx1ZXMgb25seS4KLS8vICAgICBCb3RoIHRvcCBhbmQgYm90dG9tIG9mIGNvbnRvdXJzIGNhbiBtYXRjaC4gIFRoaXMgaXMgdXNlZnVsIGZvcgotLy8gICAgIHNjcmlwdHMgbGlrZSBEZXZhbmFnYXJpIHdoZXJlIHZvd2VsIHNpZ25zIGF0dGFjaCB0byB0aGUgYmFzZQotLy8gICAgIGNoYXJhY3RlciBhbmQgYXJlIGltcGxlbWVudGVkIGFzIGNvbXBvbmVudHMgb2YgY29tcG9zaXRlIGdseXBocy4KLS8vCi0vLyAgICAgSWYgbm90IHNldCwgYm90aCByb3VuZCBhbmQgZmxhdCBleHRyZW1hIGFyZSB0YWtlbiBpbnRvIGFjY291bnQuCi0vLyAgICAgQWRkaXRpb25hbGx5LCBvbmx5IHRoZSB0b3Agb3IgdGhlIGJvdHRvbSBvZiBhIGNvbnRvdXIgY2FuIG1hdGNoLAotLy8gICAgIGRlcGVuZGluZyBvbiB0aGUgTEFUSU5fVE9QIGZsYWcuCi0vLwotLy8gICAgIE5ldXRyYWwgYmx1ZSB6b25lcyBzaG91bGQgYWx3YXlzIGZvbGxvdyBub24tbmV1dHJhbCBibHVlIHpvbmVzLgotLy8KLS8vICAgTEFUSU5fWF9IRUlHSFQKLS8vICAgICBTY2FsZSBhbGwgZ2x5cGhzIHZlcnRpY2FsbHkgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBzY3JpcHQgdG8gbWFrZSB0aGUKLS8vICAgICByZWZlcmVuY2UgbGluZSBvZiB0aGlzIGJsdWUgem9uZSBhbGlnbiBvbiB0aGUgZ3JpZC4gIFRoZSBzY2FsaW5nCi0vLyAgICAgdGFrZXMgcGxhY2UgYmVmb3JlIGFsbCBvdGhlciBibHVlIHpvbmVzIGdldCBhbGlnbmVkIHRvIHRoZSBncmlkLgotLy8gICAgIE9ubHkgb25lIGJsdWUgY2hhcmFjdGVyIHN0cmluZyBvZiBhIHNjcmlwdCBzdHlsZSBjYW4gaGF2ZSB0aGlzIGZsYWcuCi0vLwotLy8gICBMQVRJTl9MT05HCi0vLyAgICAgQXBwbHkgYW4gYWRkaXRpb25hbCBjb25zdHJhaW50IGZvciBibHVlIHpvbmUgdmFsdWVzOiBEb24ndAotLy8gICAgIG5lY2Vzc2FyaWx5IHVzZSB0aGUgZXh0cmVtdW0gYXMtaXMgYnV0IGEgc2VnbWVudCBvZiB0aGUgdG9wbW9zdCAob3IKLS8vICAgICBib3R0b21tb3N0KSBjb250b3VyIHRoYXQgaXMgbG9uZ2VyIHRoYW4gYSBoZXVyaXN0aWMgdGhyZXNob2xkLCBhbmQKLS8vICAgICB3aGljaCBpcyBub3QgdG9vIGZhciBhd2F5IHZlcnRpY2FsbHkgZnJvbSB0aGUgcmVhbCBleHRyZW11bS4gIFRoaXMKLS8vICAgICBlbnN1cmVzIHRoYXQgc21hbGwgYnVtcHMgaW4gdGhlIG91dGxpbmUgYXJlIGlnbm9yZWQgKGZvciBleGFtcGxlLCB0aGUKLS8vICAgICBgdmVydGljYWwgc2VyaWZzJyBmb3VuZCBpbiBtYW55IEhlYnJldyBnbHlwaCBkZXNpZ25zKS4KLS8vCi0vLyAgICAgVGhlIHNlZ21lbnQgbXVzdCBiZSBhdCBsZWFzdCBFTS8yNSBmb250IHVuaXRzIGxvbmcsIGFuZCB0aGUgZGlzdGFuY2UKLS8vICAgICB0byB0aGUgZXh0cmVtdW0gbXVzdCBiZSBzbWFsbGVyIHRoYW4gRU0vNC4KLS8vCi0vLwotLy8gY2prIGF1dG8taGludGVyCi0vLyAtLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBDaGFyYWN0ZXJzIGluIGEgYmx1ZSBzdHJpbmcgYXJlICpub3QqIGF1dG9tYXRpY2FsbHkgY2xhc3NpZmllZC4gIEluc3RlYWQsCi0vLyBmaXJzdCBjb21lIHRoZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIHRoZSBvdmVyc2hvb3QgdmFsdWUsIHRoZW4gdGhlCi0vLyBjaGFyYWN0ZXIgYHwnLCB0aGVuIHRoZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIHRoZSByZWZlcmVuY2UgdmFsdWUKLS8vIChldmVyeXRoaW5nIHNlcGFyYXRlZCBieSBzcGFjZSBjaGFyYWN0ZXJzKS4gIFRoZSBibHVlIHpvbmUgaXMgdGhlbiBzZXQgdXAKLS8vIGJ5IHRoZSBtZWFuIHZhbHVlcyBvZiBhbGwgcmVmZXJlbmNlIHZhbHVlcyBhbmQgYWxsIG92ZXJzaG9vdCB2YWx1ZXMsCi0vLyByZXNwZWN0aXZlbHkuICBCb3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGJsdWUgem9uZXMgKGkuZS4sIGFkanVzdGluZwotLy8gdmVydGljYWwgYW5kIGhvcml6b250YWwgY29vcmRpbmF0ZSB2YWx1ZXMsIHJlc3BlY3RpdmVseSkgYXJlIHN1cHBvcnRlZC4KLS8vCi0vLyBGb3IgdGhlIGNqayBhdXRvLWhpbnRlciwgdGhlIG92ZXJzaG9vdCBzaG91bGQgYmUgc21hbGxlciB0aGFuIHRoZQotLy8gcmVmZXJlbmNlIGZvciB0b3Agem9uZXMsIGFuZCB2aWNlIHZlcnNhIGZvciBib3R0b20gem9uZXMuCi0vLwotLy8gICBDSktfVE9QCi0vLyAgICAgVGFrZSB0aGUgbWF4aW11bSBmbGF0IGFuZCByb3VuZCBjb29yZGluYXRlIHZhbHVlcyBvZiB0aGUgYmx1ZSBzdHJpbmcKLS8vICAgICBjaGFyYWN0ZXJzLiAgSWYgbm90IHNldCwgdGFrZSB0aGUgbWluaW11bSB2YWx1ZXMuCi0vLwotLy8gICBDSktfUklHSFQKLS8vICAgICBBIHN5bm9ueW0gZm9yIENKS19UT1AuICBJZiBDSktfSE9SSVogaXMgc2V0LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoZQotLy8gICAgIHJpZ2h0IGJsdWUgem9uZSwgdGFraW5nIGhvcml6b250YWwgbWF4aW11bSB2YWx1ZXMuCi0vLwotLy8gICBDSktfSE9SSVoKLS8vICAgICBEZWZpbmUgYSBibHVlIHpvbmUgZm9yIGhvcml6b250YWwgaGludGluZyAoaS5lLiwgdmVydGljYWwgYmx1ZQotLy8gICAgIHpvbmVzKS4gIElmIG5vdCBzZXQsIHRoaXMgaXMgYSBibHVlIHpvbmUgZm9yIHZlcnRpY2FsIGhpbnRpbmcuCi0KLQotQUZfQkxVRV9TVFJJTkdTRVRfRU5VTSBBRl9CTFVFX1NUUklOR1NFVFNfQVJSQVkgQUZfQkxVRV9TVFJJTkdTRVRfTUFYX0xFTjoKLQotICBBRl9CTFVFX1NUUklOR1NFVF9BRExNCi0gICAgeyBBRl9CTFVFX1NUUklOR19BRExBTV9DQVBJVEFMX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0FETEFNX0NBUElUQUxfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQURMQU1fU01BTExfVE9QLCAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19BRExBTV9TTUFMTF9CT1RUT00sICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0FSQUIKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0FSQUJJQ19UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19BUkFCSUNfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVJBQklDX0pPSU4sICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9ORVVUUkFMIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfQVJNTgotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fQ0FQSVRBTF9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fQ0FQSVRBTF9CT1RUT00sICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fU01BTExfQVNDRU5ERVIsICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fU01BTExfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOX1NNQUxMX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOX1NNQUxMX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9BVlNUCi0gICAgeyBBRl9CTFVFX1NUUklOR19BVkVTVEFOX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQVZFU1RBTl9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfQkFNVQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQkFNVU1fVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19CQU1VTV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0JFTkcKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0JFTkdBTElfVE9QLCAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0JFTkdBTElfSEVBRCwgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0JFTkdBTElfQkFTRSwgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fTkVVVFJBTCAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQkVOR0FMSV9CQVNFLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0JVSEQKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0JVSElEX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0JVSElEX0xBUkdFLCAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0JVSElEX1NNQUxMLCAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19CVUhJRF9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfQ0FLTQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hBS01BX1RPUCwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hBS01BX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hBS01BX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0NBTlMKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19UT1AsICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfQk9UVE9NLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NNQUxMX1RPUCwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NNQUxMX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TVVBTX1RPUCwgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU1VQU19CT1RUT00sICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9DQVJJCi0gICAgeyBBRl9CTFVFX1NUUklOR19DQVJJQU5fVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DQVJJQU5fQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfQ0hFUgotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfQ0FQSVRBTCwgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfQ0FQSVRBTCwgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfU01BTExfQVNDRU5ERVIsICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfU01BTEwsICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NIRVJPS0VFX1NNQUxMLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NIRVJPS0VFX1NNQUxMX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9DT1BUCi0gICAgeyBBRl9CTFVFX1NUUklOR19DT1BUSUNfQ0FQSVRBTF9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DT1BUSUNfQ0FQSVRBTF9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DT1BUSUNfU01BTExfVE9QLCAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ09QVElDX1NNQUxMX0JPVFRPTSwgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0NQUlQKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NZUFJJT1RfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DWVBSSU9UX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ1lQUklPVF9TTUFMTCwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NZUFJJT1RfU01BTEwsICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0NZUkwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NZUklMTElDX0NBUElUQUxfVE9QLCAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NZUklMTElDX0NBUElUQUxfQk9UVE9NLCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NZUklMTElDX1NNQUxMLCAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DWVJJTExJQ19TTUFMTCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DWVJJTExJQ19TTUFMTF9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfREVWQQotICAgIHsgQUZfQkxVRV9TVFJJTkdfREVWQU5BR0FSSV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19ERVZBTkFHQVJJX0hFQUQsICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0RFVkFOQUdBUklfQkFTRSwgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX05FVVRSQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfREVWQU5BR0FSSV9CQVNFLCAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19ERVZBTkFHQVJJX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0RTUlQKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0RFU0VSRVRfQ0FQSVRBTF9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19ERVNFUkVUX0NBUElUQUxfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfREVTRVJFVF9TTUFMTF9UT1AsICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfREVTRVJFVF9TTUFMTF9CT1RUT00sICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfRVRISQotICAgIHsgQUZfQkxVRV9TVFJJTkdfRVRISU9QSUNfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19FVEhJT1BJQ19CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIC8vIGJsdWUgem9uZXMgZm9yIE10YXZydWxpIGFyZSBtaXNzaW5nIChub3QgeWV0IGRlZmluZWQgaW4gVW5pY29kZSkKLSAgQUZfQkxVRV9TVFJJTkdTRVRfR0VPUgotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTUtIRURSVUxJX1RPUCwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTUtIRURSVUxJX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX01LSEVEUlVMSV9BU0NFTkRFUiwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9NS0hFRFJVTElfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9HRU9LCi0gICAgeyBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9BU09NVEFWUlVMSV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9BU09NVEFWUlVMSV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9OVVNLSFVSSV9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfQk9UVE9NLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfQVNDRU5ERVIsICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0dMQUcKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dMQUdPTElUSUNfQ0FQSVRBTF9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19HTEFHT0xJVElDX0NBUElUQUxfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0xBR09MSVRJQ19TTUFMTF9UT1AsICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfR0xBR09MSVRJQ19TTUFMTF9CT1RUT00sICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfR09USAotICAgIHsgQUZfQkxVRV9TVFJJTkdfR09USElDX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfR09USElDX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0dSRUsKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dSRUVLX0NBUElUQUxfVE9QLCAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dSRUVLX0NBUElUQUxfQk9UVE9NLCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dSRUVLX1NNQUxMX0JFVEFfVE9QLCAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dSRUVLX1NNQUxMLCAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19HUkVFS19TTUFMTCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19HUkVFS19TTUFMTF9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfR1VKUgotICAgIHsgQUZfQkxVRV9TVFJJTkdfR1VKQVJBVElfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVSkFSQVRJX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVSkFSQVRJX0FTQ0VOREVSLCAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVSkFSQVRJX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVSkFSQVRJX0RJR0lUX1RPUCwgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9HVVJVCi0gICAgeyBBRl9CTFVFX1NUUklOR19HVVJNVUtISV9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19HVVJNVUtISV9IRUFELCAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19HVVJNVUtISV9CQVNFLCAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX05FVVRSQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVUk1VS0hJX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0dVUk1VS0hJX0RJR0lUX1RPUCwgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9IRUJSCi0gICAgeyBBRl9CTFVFX1NUUklOR19IRUJSRVdfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9MT05HICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfSEVCUkVXX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfSEVCUkVXX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0tBTEkKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tBWUFIX0xJX1RPUCwgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9CT1RUT00sICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9BU0NFTkRFUiwgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9ERVNDRU5ERVIsICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9MQVJHRV9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfS0hNUgotICAgIHsgQUZfQkxVRV9TVFJJTkdfS0hNRVJfVE9QLCAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tITUVSX1NVQlNDUklQVF9UT1AsICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9TVUJfVE9QICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tITUVSX0JPVFRPTSwgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tITUVSX0RFU0NFTkRFUiwgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tITUVSX0xBUkdFX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9LSE1TCi0gICAgeyBBRl9CTFVFX1NUUklOR19LSE1FUl9TWU1CT0xTX1dBWElOR19UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfS0hNRVJfU1lNQk9MU19XQU5JTkdfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0tOREEKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tBTk5BREFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19LQU5OQURBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9MQU8KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBT19UT1AsICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19MQU9fQk9UVE9NLCAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19MQU9fQVNDRU5ERVIsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19MQU9fTEFSR0VfQVNDRU5ERVIsIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19MQU9fREVTQ0VOREVSLCAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfTEFUTgotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fQ0FQSVRBTF9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fQ0FQSVRBTF9CT1RUT00sICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfRl9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NNQUxMX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NNQUxMX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9MQVRCCi0gICAgeyBBRl9CTFVFX1NUUklOR19MQVRJTl9TVUJTX0NBUElUQUxfVE9QLCAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfQ0FQSVRBTF9CT1RUT00sICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU1VCU19TTUFMTF9GX1RPUCwgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19MQVRJTl9TVUJTX1NNQUxMLCAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTEwsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU1VCU19TTUFMTF9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9MQVRQCi0gICAgeyBBRl9CTFVFX1NUUklOR19MQVRJTl9TVVBTX0NBUElUQUxfVE9QLCAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfQ0FQSVRBTF9CT1RUT00sICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU1VQU19TTUFMTF9GX1RPUCwgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19MQVRJTl9TVVBTX1NNQUxMLCAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVUFNfU01BTEwsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU1VQU19TTUFMTF9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9MSVNVCi0gICAgeyBBRl9CTFVFX1NUUklOR19MSVNVX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTElTVV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfTUxZTQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFMQVlBTEFNX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFMQVlBTEFNX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX01ZTVIKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTVlBTk1BUl9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NWUFOTUFSX0FTQ0VOREVSLCAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfTktPTwotICAgIHsgQUZfQkxVRV9TVFJJTkdfTktPX1RPUCwgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX05LT19CT1RUT00sICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19OS09fU01BTExfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19OS09fU01BTExfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9OT05FCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsIDAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX09MQ0sKLSAgICB7IEFGX0JMVUVfU1RSSU5HX09MX0NISUtJLCBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19PTF9DSElLSSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9PUktICi0gICAgeyBBRl9CTFVFX1NUUklOR19PTERfVFVSS0lDX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfT0xEX1RVUktJQ19CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfT1NHRQotICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NBR0VfQ0FQSVRBTF9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX09TQUdFX0NBUElUQUxfQk9UVE9NLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19PU0FHRV9DQVBJVEFMX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NBR0VfU01BTExfVE9QLCAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NBR0VfU01BTExfQk9UVE9NLCAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0FTQ0VOREVSLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19PU0FHRV9TTUFMTF9ERVNDRU5ERVIsICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9PU01BCi0gICAgeyBBRl9CTFVFX1NUUklOR19PU01BTllBX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NNQU5ZQV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfU0FVUgotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0FVUkFTSFRSQV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NBVVJBU0hUUkFfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX1NIQVcKLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fVE9QLCAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9CT1RUT00sICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19TSEFWSUFOX0RFU0NFTkRFUiwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fU01BTExfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9TTUFMTF9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9TSU5ICi0gICAgeyBBRl9CTFVFX1NUUklOR19TSU5IQUxBX1RPUCwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfU0lOSEFMQV9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NJTkhBTEFfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX1NVTkQKLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NVTkRBTkVTRV9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NVTkRBTkVTRV9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1NVTkRBTkVTRV9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9UQU1MCi0gICAgeyBBRl9CTFVFX1NUUklOR19UQU1JTF9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1RBTUlMX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfVEFWVAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEFJX1ZJRVRfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19UQUlfVklFVF9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX1RFTFUKLSAgICB7IEFGX0JMVUVfU1RSSU5HX1RFTFVHVV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1RFTFVHVV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9URk5HCi0gICAgeyBBRl9CTFVFX1NUUklOR19USUZJTkFHSCwgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfVElGSU5BR0gsIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgQUZfQkxVRV9TVFJJTkdTRVRfVEhBSQotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9UT1AsICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19USEFJX0JPVFRPTSwgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1RIQUlfQVNDRU5ERVIsICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9MQVJHRV9BU0NFTkRFUiwgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19USEFJX0RFU0NFTkRFUiwgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1RIQUlfTEFSR0VfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9ESUdJVF9UT1AsICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICBBRl9CTFVFX1NUUklOR1NFVF9WQUlJCi0gICAgeyBBRl9CTFVFX1NUUklOR19WQUlfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19WQUlfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKSwotCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0hBTkkKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NKS19UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX1RPUCAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0pLX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSktfQkxVRV9IQU5JX1ZFUlQKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NKS19MRUZULCAgIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX0hPUklaICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0pLX1JJR0hULCAgQUZfQkxVRV9QUk9QRVJUWV9DSktfSE9SSVogfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9DSktfUklHSFQgICB9Ci0jZW5kaWYgLyogQUZfQ09ORklHX09QVElPTl9DSktfQkxVRV9IQU5JX1ZFUlQgKi8KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLyogQUZfQ09ORklHX09QVElPTl9DSksgICAgICAgICAgICAgICAgKi8KLQotCi0vLyBFTkQKZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmYmx1ZS5oIGIvc3JjL2F1dG9maXQvYWZibHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWY1MWMuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZibHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGUgUGVybCBzY3JpcHQgYGFmYmx1ZS5wbCcsICovCi0vKiB1c2luZyBkYXRhIGZyb20gZmlsZSBgYWZibHVlLmRhdCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZibHVlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGRhdGEgZm9yIGJsdWUgc3RyaW5ncyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEFGQkxVRV9IXwotI2RlZmluZSBBRkJMVUVfSF8KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIGFuIGF1eGlsaWFyeSBtYWNybyB0byBkZWNvZGUgYSBVVEYtOCBjaGFyYWN0ZXIgLS0gc2luY2Ugd2Ugb25seSB1c2UgKi8KLSAgLyogaGFyZC1jb2RlZCwgc2VsZi1jb252ZXJ0ZWQgZGF0YSwgbm8gZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkICAgICAqLwotI2RlZmluZSBHRVRfVVRGOF9DSEFSKCBjaCwgcCApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY2ggPSAodW5zaWduZWQgY2hhcikqcCsrOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICggY2ggPj0gMHg4MCApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBGVF9VSW50ICBsZW5fOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBpZiAoIGNoIDwgMHhFMCApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGVuXyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGNoICAmPSAweDFGOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIGVsc2UgaWYgKCBjaCA8IDB4RjAgKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBsZW5fID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgY2ggICY9IDB4MEY7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGxlbl8gPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBjaCAgJj0gMHgwNzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgZm9yICggOyBsZW5fID4gMDsgbGVuXy0tICkgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgY2ggPSAoIGNoIDw8IDYgKSB8ICggKnArKyAmIDB4M0YgKTsgXAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIEIgTCBVIEUgICBTIFQgUiBJIE4gRyBTICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBBdCB0aGUgYm90dG9tbW9zdCBsZXZlbCwgd2UgZGVmaW5lIHN0cmluZ3MgZm9yIGZpbmRpbmcgYmx1ZSB6b25lcy4gKi8KLQotCi0jZGVmaW5lIEFGX0JMVUVfU1RSSU5HX01BWF9MRU4gIDUxCi0KLSAgLyogVGhlIEFGX0JsdWVfU3RyaW5nIGVudW1lcmF0aW9uIHZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSAqLwotICAvKiBgYWZfYmx1ZV9zdHJpbmdzJyBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgdHlwZWRlZiBlbnVtICBBRl9CbHVlX1N0cmluZ18KLSAgewotICAgIEFGX0JMVUVfU1RSSU5HX0FETEFNX0NBUElUQUxfVE9QID0gMCwKLSAgICBBRl9CTFVFX1NUUklOR19BRExBTV9DQVBJVEFMX0JPVFRPTSA9IDMwLAotICAgIEFGX0JMVUVfU1RSSU5HX0FETEFNX1NNQUxMX1RPUCA9IDQwLAotICAgIEFGX0JMVUVfU1RSSU5HX0FETEFNX1NNQUxMX0JPVFRPTSA9IDY1LAotICAgIEFGX0JMVUVfU1RSSU5HX0FSQUJJQ19UT1AgPSAxMDUsCi0gICAgQUZfQkxVRV9TVFJJTkdfQVJBQklDX0JPVFRPTSA9IDEyMywKLSAgICBBRl9CTFVFX1NUUklOR19BUkFCSUNfSk9JTiA9IDEzOCwKLSAgICBBRl9CTFVFX1NUUklOR19BUk1FTklBTl9DQVBJVEFMX1RPUCA9IDE0MSwKLSAgICBBRl9CTFVFX1NUUklOR19BUk1FTklBTl9DQVBJVEFMX0JPVFRPTSA9IDE2NSwKLSAgICBBRl9CTFVFX1NUUklOR19BUk1FTklBTl9TTUFMTF9BU0NFTkRFUiA9IDE4OSwKLSAgICBBRl9CTFVFX1NUUklOR19BUk1FTklBTl9TTUFMTF9UT1AgPSAyMTAsCi0gICAgQUZfQkxVRV9TVFJJTkdfQVJNRU5JQU5fU01BTExfQk9UVE9NID0gMjM0LAotICAgIEFGX0JMVUVfU1RSSU5HX0FSTUVOSUFOX1NNQUxMX0RFU0NFTkRFUiA9IDI1OCwKLSAgICBBRl9CTFVFX1NUUklOR19BVkVTVEFOX1RPUCA9IDI4MiwKLSAgICBBRl9CTFVFX1NUUklOR19BVkVTVEFOX0JPVFRPTSA9IDMwMiwKLSAgICBBRl9CTFVFX1NUUklOR19CQU1VTV9UT1AgPSAzMTIsCi0gICAgQUZfQkxVRV9TVFJJTkdfQkFNVU1fQk9UVE9NID0gMzQ0LAotICAgIEFGX0JMVUVfU1RSSU5HX0JFTkdBTElfQkFTRSA9IDM3NiwKLSAgICBBRl9CTFVFX1NUUklOR19CRU5HQUxJX1RPUCA9IDQwOCwKLSAgICBBRl9CTFVFX1NUUklOR19CRU5HQUxJX0hFQUQgPSA0MzYsCi0gICAgQUZfQkxVRV9TVFJJTkdfQlVISURfVE9QID0gNDY4LAotICAgIEFGX0JMVUVfU1RSSU5HX0JVSElEX0xBUkdFID0gNDc2LAotICAgIEFGX0JMVUVfU1RSSU5HX0JVSElEX1NNQUxMID0gNDg4LAotICAgIEFGX0JMVUVfU1RSSU5HX0JVSElEX0JPVFRPTSA9IDUwNCwKLSAgICBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfVE9QID0gNTMyLAotICAgIEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19CT1RUT00gPSA1NjQsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NNQUxMX1RPUCA9IDU5NiwKLSAgICBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU01BTExfQk9UVE9NID0gNjI4LAotICAgIEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TVVBTX1RPUCA9IDY2MCwKLSAgICBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU1VQU19CT1RUT00gPSA2ODgsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ0FSSUFOX1RPUCA9IDcyMCwKLSAgICBBRl9CTFVFX1NUUklOR19DQVJJQU5fQk9UVE9NID0gNzYwLAotICAgIEFGX0JMVUVfU1RSSU5HX0NIQUtNQV9UT1AgPSA3OTUsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ0hBS01BX0JPVFRPTSA9IDgyMCwKLSAgICBBRl9CTFVFX1NUUklOR19DSEFLTUFfREVTQ0VOREVSID0gODQ1LAotICAgIEFGX0JMVUVfU1RSSU5HX0NIRVJPS0VFX0NBUElUQUwgPSA5MTAsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfU01BTExfQVNDRU5ERVIgPSA5NDIsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfU01BTEwgPSA5NzQsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ0hFUk9LRUVfU01BTExfREVTQ0VOREVSID0gMTAwNiwKLSAgICBBRl9CTFVFX1NUUklOR19DT1BUSUNfQ0FQSVRBTF9UT1AgPSAxMDIyLAotICAgIEFGX0JMVUVfU1RSSU5HX0NPUFRJQ19DQVBJVEFMX0JPVFRPTSA9IDEwNTQsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ09QVElDX1NNQUxMX1RPUCA9IDEwODYsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ09QVElDX1NNQUxMX0JPVFRPTSA9IDExMTgsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ1lQUklPVF9UT1AgPSAxMTUwLAotICAgIEFGX0JMVUVfU1RSSU5HX0NZUFJJT1RfQk9UVE9NID0gMTE5MCwKLSAgICBBRl9CTFVFX1NUUklOR19DWVBSSU9UX1NNQUxMID0gMTIyNSwKLSAgICBBRl9CTFVFX1NUUklOR19DWVJJTExJQ19DQVBJVEFMX1RPUCA9IDEyNDAsCi0gICAgQUZfQkxVRV9TVFJJTkdfQ1lSSUxMSUNfQ0FQSVRBTF9CT1RUT00gPSAxMjY0LAotICAgIEFGX0JMVUVfU1RSSU5HX0NZUklMTElDX1NNQUxMID0gMTI4OCwKLSAgICBBRl9CTFVFX1NUUklOR19DWVJJTExJQ19TTUFMTF9ERVNDRU5ERVIgPSAxMzEyLAotICAgIEFGX0JMVUVfU1RSSU5HX0RFU0VSRVRfQ0FQSVRBTF9UT1AgPSAxMzIxLAotICAgIEFGX0JMVUVfU1RSSU5HX0RFU0VSRVRfQ0FQSVRBTF9CT1RUT00gPSAxMzQ2LAotICAgIEFGX0JMVUVfU1RSSU5HX0RFU0VSRVRfU01BTExfVE9QID0gMTM3MSwKLSAgICBBRl9CTFVFX1NUUklOR19ERVNFUkVUX1NNQUxMX0JPVFRPTSA9IDEzOTYsCi0gICAgQUZfQkxVRV9TVFJJTkdfREVWQU5BR0FSSV9CQVNFID0gMTQyMSwKLSAgICBBRl9CTFVFX1NUUklOR19ERVZBTkFHQVJJX1RPUCA9IDE0NTMsCi0gICAgQUZfQkxVRV9TVFJJTkdfREVWQU5BR0FSSV9IRUFEID0gMTQ4NSwKLSAgICBBRl9CTFVFX1NUUklOR19ERVZBTkFHQVJJX0JPVFRPTSA9IDE1MTcsCi0gICAgQUZfQkxVRV9TVFJJTkdfRVRISU9QSUNfVE9QID0gMTUyNSwKLSAgICBBRl9CTFVFX1NUUklOR19FVEhJT1BJQ19CT1RUT00gPSAxNTU3LAotICAgIEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX01LSEVEUlVMSV9UT1AgPSAxNTg5LAotICAgIEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX01LSEVEUlVMSV9CT1RUT00gPSAxNjIxLAotICAgIEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX01LSEVEUlVMSV9BU0NFTkRFUiA9IDE2NTMsCi0gICAgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTUtIRURSVUxJX0RFU0NFTkRFUiA9IDE2ODUsCi0gICAgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fQVNPTVRBVlJVTElfVE9QID0gMTcxNywKLSAgICBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9BU09NVEFWUlVMSV9CT1RUT00gPSAxNzQ5LAotICAgIEFGX0JMVUVfU1RSSU5HX0dFT1JHSUFOX05VU0tIVVJJX1RPUCA9IDE3ODEsCi0gICAgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfQk9UVE9NID0gMTgxMywKLSAgICBBRl9CTFVFX1NUUklOR19HRU9SR0lBTl9OVVNLSFVSSV9BU0NFTkRFUiA9IDE4NDUsCi0gICAgQUZfQkxVRV9TVFJJTkdfR0VPUkdJQU5fTlVTS0hVUklfREVTQ0VOREVSID0gMTg3NywKLSAgICBBRl9CTFVFX1NUUklOR19HTEFHT0xJVElDX0NBUElUQUxfVE9QID0gMTkwOSwKLSAgICBBRl9CTFVFX1NUUklOR19HTEFHT0xJVElDX0NBUElUQUxfQk9UVE9NID0gMTk0MSwKLSAgICBBRl9CTFVFX1NUUklOR19HTEFHT0xJVElDX1NNQUxMX1RPUCA9IDE5NzMsCi0gICAgQUZfQkxVRV9TVFJJTkdfR0xBR09MSVRJQ19TTUFMTF9CT1RUT00gPSAyMDA1LAotICAgIEFGX0JMVUVfU1RSSU5HX0dPVEhJQ19UT1AgPSAyMDM3LAotICAgIEFGX0JMVUVfU1RSSU5HX0dPVEhJQ19CT1RUT00gPSAyMDc3LAotICAgIEFGX0JMVUVfU1RSSU5HX0dSRUVLX0NBUElUQUxfVE9QID0gMjA5NywKLSAgICBBRl9CTFVFX1NUUklOR19HUkVFS19DQVBJVEFMX0JPVFRPTSA9IDIxMTgsCi0gICAgQUZfQkxVRV9TVFJJTkdfR1JFRUtfU01BTExfQkVUQV9UT1AgPSAyMTM2LAotICAgIEFGX0JMVUVfU1RSSU5HX0dSRUVLX1NNQUxMID0gMjE1NCwKLSAgICBBRl9CTFVFX1NUUklOR19HUkVFS19TTUFMTF9ERVNDRU5ERVIgPSAyMTc4LAotICAgIEFGX0JMVUVfU1RSSU5HX0dVSkFSQVRJX1RPUCA9IDIyMDIsCi0gICAgQUZfQkxVRV9TVFJJTkdfR1VKQVJBVElfQk9UVE9NID0gMjIzNCwKLSAgICBBRl9CTFVFX1NUUklOR19HVUpBUkFUSV9BU0NFTkRFUiA9IDIyNjYsCi0gICAgQUZfQkxVRV9TVFJJTkdfR1VKQVJBVElfREVTQ0VOREVSID0gMjMxNiwKLSAgICBBRl9CTFVFX1NUUklOR19HVUpBUkFUSV9ESUdJVF9UT1AgPSAyMzQ5LAotICAgIEFGX0JMVUVfU1RSSU5HX0dVUk1VS0hJX0JBU0UgPSAyMzY5LAotICAgIEFGX0JMVUVfU1RSSU5HX0dVUk1VS0hJX0hFQUQgPSAyNDAxLAotICAgIEFGX0JMVUVfU1RSSU5HX0dVUk1VS0hJX1RPUCA9IDI0MzMsCi0gICAgQUZfQkxVRV9TVFJJTkdfR1VSTVVLSElfQk9UVE9NID0gMjQ2NSwKLSAgICBBRl9CTFVFX1NUUklOR19HVVJNVUtISV9ESUdJVF9UT1AgPSAyNDk3LAotICAgIEFGX0JMVUVfU1RSSU5HX0hFQlJFV19UT1AgPSAyNTE3LAotICAgIEFGX0JMVUVfU1RSSU5HX0hFQlJFV19CT1RUT00gPSAyNTQxLAotICAgIEFGX0JMVUVfU1RSSU5HX0hFQlJFV19ERVNDRU5ERVIgPSAyNTU5LAotICAgIEFGX0JMVUVfU1RSSU5HX0tBTk5BREFfVE9QID0gMjU3NCwKLSAgICBBRl9CTFVFX1NUUklOR19LQU5OQURBX0JPVFRPTSA9IDI2MTgsCi0gICAgQUZfQkxVRV9TVFJJTkdfS0FZQUhfTElfVE9QID0gMjY1MCwKLSAgICBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9CT1RUT00gPSAyNjc0LAotICAgIEFGX0JMVUVfU1RSSU5HX0tBWUFIX0xJX0FTQ0VOREVSID0gMjY5NCwKLSAgICBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9ERVNDRU5ERVIgPSAyNzAyLAotICAgIEFGX0JMVUVfU1RSSU5HX0tBWUFIX0xJX0xBUkdFX0RFU0NFTkRFUiA9IDI3MTQsCi0gICAgQUZfQkxVRV9TVFJJTkdfS0hNRVJfVE9QID0gMjczNSwKLSAgICBBRl9CTFVFX1NUUklOR19LSE1FUl9TVUJTQ1JJUFRfVE9QID0gMjc1OSwKLSAgICBBRl9CTFVFX1NUUklOR19LSE1FUl9CT1RUT00gPSAyNzk5LAotICAgIEFGX0JMVUVfU1RSSU5HX0tITUVSX0RFU0NFTkRFUiA9IDI4MzEsCi0gICAgQUZfQkxVRV9TVFJJTkdfS0hNRVJfTEFSR0VfREVTQ0VOREVSID0gMjg2NSwKLSAgICBBRl9CTFVFX1NUUklOR19LSE1FUl9TWU1CT0xTX1dBWElOR19UT1AgPSAyOTUyLAotICAgIEFGX0JMVUVfU1RSSU5HX0tITUVSX1NZTUJPTFNfV0FOSU5HX0JPVFRPTSA9IDI5NjAsCi0gICAgQUZfQkxVRV9TVFJJTkdfTEFPX1RPUCA9IDI5NjgsCi0gICAgQUZfQkxVRV9TVFJJTkdfTEFPX0JPVFRPTSA9IDMwMDAsCi0gICAgQUZfQkxVRV9TVFJJTkdfTEFPX0FTQ0VOREVSID0gMzAzMiwKLSAgICBBRl9CTFVFX1NUUklOR19MQU9fTEFSR0VfQVNDRU5ERVIgPSAzMDQ4LAotICAgIEFGX0JMVUVfU1RSSU5HX0xBT19ERVNDRU5ERVIgPSAzMDYwLAotICAgIEFGX0JMVUVfU1RSSU5HX0xBVElOX0NBUElUQUxfVE9QID0gMzA4NCwKLSAgICBBRl9CTFVFX1NUUklOR19MQVRJTl9DQVBJVEFMX0JPVFRPTSA9IDMxMDAsCi0gICAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfRl9UT1AgPSAzMTE2LAotICAgIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NNQUxMX1RPUCA9IDMxMzAsCi0gICAgQUZfQkxVRV9TVFJJTkdfTEFUSU5fU01BTExfQk9UVE9NID0gMzE0NiwKLSAgICBBRl9CTFVFX1NUUklOR19MQVRJTl9TTUFMTF9ERVNDRU5ERVIgPSAzMTYyLAotICAgIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfQ0FQSVRBTF9UT1AgPSAzMTcyLAotICAgIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfQ0FQSVRBTF9CT1RUT00gPSAzMTkyLAotICAgIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTExfRl9UT1AgPSAzMjEyLAotICAgIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTEwgPSAzMjMyLAotICAgIEFGX0JMVUVfU1RSSU5HX0xBVElOX1NVQlNfU01BTExfREVTQ0VOREVSID0gMzI2OCwKLSAgICBBRl9CTFVFX1NUUklOR19MQVRJTl9TVVBTX0NBUElUQUxfVE9QID0gMzI4OCwKLSAgICBBRl9CTFVFX1NUUklOR19MQVRJTl9TVVBTX0NBUElUQUxfQk9UVE9NID0gMzMxOSwKLSAgICBBRl9CTFVFX1NUUklOR19MQVRJTl9TVVBTX1NNQUxMX0ZfVE9QID0gMzM0OCwKLSAgICBBRl9CTFVFX1NUUklOR19MQVRJTl9TVVBTX1NNQUxMID0gMzM3NCwKLSAgICBBRl9CTFVFX1NUUklOR19MQVRJTl9TVVBTX1NNQUxMX0RFU0NFTkRFUiA9IDMzOTksCi0gICAgQUZfQkxVRV9TVFJJTkdfTElTVV9UT1AgPSAzNDEwLAotICAgIEFGX0JMVUVfU1RSSU5HX0xJU1VfQk9UVE9NID0gMzQ0MiwKLSAgICBBRl9CTFVFX1NUUklOR19NQUxBWUFMQU1fVE9QID0gMzQ3NCwKLSAgICBBRl9CTFVFX1NUUklOR19NQUxBWUFMQU1fQk9UVE9NID0gMzUxOCwKLSAgICBBRl9CTFVFX1NUUklOR19NWUFOTUFSX1RPUCA9IDM1NTAsCi0gICAgQUZfQkxVRV9TVFJJTkdfTVlBTk1BUl9CT1RUT00gPSAzNTgyLAotICAgIEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfQVNDRU5ERVIgPSAzNjE0LAotICAgIEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfREVTQ0VOREVSID0gMzY0MiwKLSAgICBBRl9CTFVFX1NUUklOR19OS09fVE9QID0gMzY3NCwKLSAgICBBRl9CTFVFX1NUUklOR19OS09fQk9UVE9NID0gMzY5OCwKLSAgICBBRl9CTFVFX1NUUklOR19OS09fU01BTExfVE9QID0gMzcxMywKLSAgICBBRl9CTFVFX1NUUklOR19OS09fU01BTExfQk9UVE9NID0gMzcyMiwKLSAgICBBRl9CTFVFX1NUUklOR19PTF9DSElLSSA9IDM3MzQsCi0gICAgQUZfQkxVRV9TVFJJTkdfT0xEX1RVUktJQ19UT1AgPSAzNzU4LAotICAgIEFGX0JMVUVfU1RSSU5HX09MRF9UVVJLSUNfQk9UVE9NID0gMzc3MywKLSAgICBBRl9CTFVFX1NUUklOR19PU0FHRV9DQVBJVEFMX1RPUCA9IDM3OTMsCi0gICAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfQ0FQSVRBTF9CT1RUT00gPSAzODMzLAotICAgIEFGX0JMVUVfU1RSSU5HX09TQUdFX0NBUElUQUxfREVTQ0VOREVSID0gMzg2MywKLSAgICBBRl9CTFVFX1NUUklOR19PU0FHRV9TTUFMTF9UT1AgPSAzODc4LAotICAgIEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0JPVFRPTSA9IDM5MTgsCi0gICAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfU01BTExfQVNDRU5ERVIgPSAzOTU4LAotICAgIEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0RFU0NFTkRFUiA9IDM5ODMsCi0gICAgQUZfQkxVRV9TVFJJTkdfT1NNQU5ZQV9UT1AgPSAzOTk4LAotICAgIEFGX0JMVUVfU1RSSU5HX09TTUFOWUFfQk9UVE9NID0gNDAzOCwKLSAgICBBRl9CTFVFX1NUUklOR19TQVVSQVNIVFJBX1RPUCA9IDQwNzgsCi0gICAgQUZfQkxVRV9TVFJJTkdfU0FVUkFTSFRSQV9CT1RUT00gPSA0MTEwLAotICAgIEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fVE9QID0gNDEzMCwKLSAgICBBRl9CTFVFX1NUUklOR19TSEFWSUFOX0JPVFRPTSA9IDQxNDAsCi0gICAgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9ERVNDRU5ERVIgPSA0MTY1LAotICAgIEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fU01BTExfVE9QID0gNDE3NSwKLSAgICBBRl9CTFVFX1NUUklOR19TSEFWSUFOX1NNQUxMX0JPVFRPTSA9IDQyMTAsCi0gICAgQUZfQkxVRV9TVFJJTkdfU0lOSEFMQV9UT1AgPSA0MjI1LAotICAgIEFGX0JMVUVfU1RSSU5HX1NJTkhBTEFfQk9UVE9NID0gNDI1NywKLSAgICBBRl9CTFVFX1NUUklOR19TSU5IQUxBX0RFU0NFTkRFUiA9IDQyODksCi0gICAgQUZfQkxVRV9TVFJJTkdfU1VOREFORVNFX1RPUCA9IDQzMzMsCi0gICAgQUZfQkxVRV9TVFJJTkdfU1VOREFORVNFX0JPVFRPTSA9IDQzNTcsCi0gICAgQUZfQkxVRV9TVFJJTkdfU1VOREFORVNFX0RFU0NFTkRFUiA9IDQzODksCi0gICAgQUZfQkxVRV9TVFJJTkdfVEFJX1ZJRVRfVE9QID0gNDM5NywKLSAgICBBRl9CTFVFX1NUUklOR19UQUlfVklFVF9CT1RUT00gPSA0NDE3LAotICAgIEFGX0JMVUVfU1RSSU5HX1RBTUlMX1RPUCA9IDQ0MjksCi0gICAgQUZfQkxVRV9TVFJJTkdfVEFNSUxfQk9UVE9NID0gNDQ2MSwKLSAgICBBRl9CTFVFX1NUUklOR19URUxVR1VfVE9QID0gNDQ5MywKLSAgICBBRl9CTFVFX1NUUklOR19URUxVR1VfQk9UVE9NID0gNDUyMSwKLSAgICBBRl9CTFVFX1NUUklOR19USEFJX1RPUCA9IDQ1NDksCi0gICAgQUZfQkxVRV9TVFJJTkdfVEhBSV9CT1RUT00gPSA0NTczLAotICAgIEFGX0JMVUVfU1RSSU5HX1RIQUlfQVNDRU5ERVIgPSA0NjAxLAotICAgIEFGX0JMVUVfU1RSSU5HX1RIQUlfTEFSR0VfQVNDRU5ERVIgPSA0NjEzLAotICAgIEFGX0JMVUVfU1RSSU5HX1RIQUlfREVTQ0VOREVSID0gNDYyNSwKLSAgICBBRl9CTFVFX1NUUklOR19USEFJX0xBUkdFX0RFU0NFTkRFUiA9IDQ2NDEsCi0gICAgQUZfQkxVRV9TVFJJTkdfVEhBSV9ESUdJVF9UT1AgPSA0NjQ5LAotICAgIEFGX0JMVUVfU1RSSU5HX1RJRklOQUdIID0gNDY2MSwKLSAgICBBRl9CTFVFX1NUUklOR19WQUlfVE9QID0gNDY5MywKLSAgICBBRl9CTFVFX1NUUklOR19WQUlfQk9UVE9NID0gNDcyNSwKLSAgICBhZl9ibHVlXzFfMSA9IDQ3NTYsCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSksKLSAgICBBRl9CTFVFX1NUUklOR19DSktfVE9QID0gYWZfYmx1ZV8xXzEgKyAxLAotICAgIEFGX0JMVUVfU1RSSU5HX0NKS19CT1RUT00gPSBhZl9ibHVlXzFfMSArIDIwMywKLSAgICBhZl9ibHVlXzFfMV8xID0gYWZfYmx1ZV8xXzEgKyA0MDQsCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSktfQkxVRV9IQU5JX1ZFUlQKLSAgICBBRl9CTFVFX1NUUklOR19DSktfTEVGVCA9IGFmX2JsdWVfMV8xXzEgKyAxLAotICAgIEFGX0JMVUVfU1RSSU5HX0NKS19SSUdIVCA9IGFmX2JsdWVfMV8xXzEgKyAyMDQsCi0gICAgYWZfYmx1ZV8xXzFfMiA9IGFmX2JsdWVfMV8xXzEgKyA0MDUsCi0jZWxzZQotICAgIGFmX2JsdWVfMV8xXzIgPSBhZl9ibHVlXzFfMV8xICsgMCwKLSNlbmRpZiAvKiBBRl9DT05GSUdfT1BUSU9OX0NKS19CTFVFX0hBTklfVkVSVCAqLwotICAgIGFmX2JsdWVfMV8yID0gYWZfYmx1ZV8xXzFfMiArIDAsCi0jZWxzZQotICAgIGFmX2JsdWVfMV8yID0gYWZfYmx1ZV8xXzEgKyAwLAotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fQ0pLICAgICAgICAgICAgICAgICovCi0KLQotICAgIEFGX0JMVUVfU1RSSU5HX01BWCAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLQotICB9IEFGX0JsdWVfU3RyaW5nOwotCi0KLSAgRlRfTE9DQUxfQVJSQVkoIGNoYXIgKQotICBhZl9ibHVlX3N0cmluZ3NbXTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgQiBMIFUgRSAgIFMgVCBSIEkgTiBHIFMgRSBUIFMgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIFRoZSBuZXh0IGxldmVsIGlzIHRvIGdyb3VwIGJsdWUgc3RyaW5ncyBpbnRvIHN0eWxlLXNwZWNpZmljIHNldHMuICovCi0KLQotICAvKiBQcm9wZXJ0aWVzIGFyZSBzcGVjaWZpYyB0byBhIHdyaXRpbmcgc3lzdGVtLiAgV2UgYXNzdW1lIHRoYXQgYSBnaXZlbiAgKi8KLSAgLyogYmx1ZSBzdHJpbmcgY2FuJ3QgYmUgdXNlZCBpbiBtb3JlIHRoYW4gYSBzaW5nbGUgd3JpdGluZyBzeXN0ZW0sIHdoaWNoICovCi0gIC8qIGlzIGEgc2FmZSBiZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAoIDFVIDw8IDAgKSAgLyogbXVzdCBoYXZlIHZhbHVlIDEgKi8KLSNkZWZpbmUgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9TVUJfVE9QICAgKCAxVSA8PCAxICkKLSNkZWZpbmUgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9ORVVUUkFMICAgKCAxVSA8PCAyICkKLSNkZWZpbmUgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgKCAxVSA8PCAzICkKLSNkZWZpbmUgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9MT05HICAgICAgKCAxVSA8PCA0ICkKLQotI2RlZmluZSBBRl9CTFVFX1BST1BFUlRZX0NKS19UT1AgICAgKCAxVSA8PCAwICkgICAgICAgLyogbXVzdCBoYXZlIHZhbHVlIDEgKi8KLSNkZWZpbmUgQUZfQkxVRV9QUk9QRVJUWV9DSktfSE9SSVogICggMVUgPDwgMSApICAgICAgIC8qIG11c3QgaGF2ZSB2YWx1ZSAyICovCi0jZGVmaW5lIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX1JJR0hUICBBRl9CTFVFX1BST1BFUlRZX0NKS19UT1AKLQotCi0jZGVmaW5lIEFGX0JMVUVfU1RSSU5HU0VUX01BWF9MRU4gIDgKLQotICAvKiBUaGUgQUZfQmx1ZV9TdHJpbmdzZXQgZW51bWVyYXRpb24gdmFsdWVzIGFyZSBvZmZzZXRzIGludG8gdGhlICovCi0gIC8qIGBhZl9ibHVlX3N0cmluZ3NldHMnIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICB0eXBlZGVmIGVudW0gIEFGX0JsdWVfU3RyaW5nc2V0XwotICB7Ci0gICAgQUZfQkxVRV9TVFJJTkdTRVRfQURMTSA9IDAsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfQVJBQiA9IDUsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfQVJNTiA9IDksCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfQVZTVCA9IDE2LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0JBTVUgPSAxOSwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9CRU5HID0gMjIsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfQlVIRCA9IDI3LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0NBS00gPSAzMiwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9DQU5TID0gMzYsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfQ0FSSSA9IDQzLAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0NIRVIgPSA0NiwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9DT1BUID0gNTMsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfQ1BSVCA9IDU4LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0NZUkwgPSA2MywKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9ERVZBID0gNjksCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfRFNSVCA9IDc1LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0VUSEkgPSA4MCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9HRU9SID0gODMsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfR0VPSyA9IDg4LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0dMQUcgPSA5NSwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9HT1RIID0gMTAwLAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0dSRUsgPSAxMDMsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfR1VKUiA9IDExMCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9HVVJVID0gMTE2LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0hFQlIgPSAxMjIsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfS0FMSSA9IDEyNiwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9LSE1SID0gMTMyLAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0tITVMgPSAxMzgsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfS05EQSA9IDE0MSwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9MQU8gPSAxNDQsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfTEFUTiA9IDE1MCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9MQVRCID0gMTU3LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0xBVFAgPSAxNjQsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfTElTVSA9IDE3MSwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9NTFlNID0gMTc0LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX01ZTVIgPSAxNzcsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfTktPTyA9IDE4MiwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9OT05FID0gMTg3LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX09MQ0sgPSAxODgsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfT1JLSCA9IDE5MSwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9PU0dFID0gMTk0LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX09TTUEgPSAyMDIsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfU0FVUiA9IDIwNSwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9TSEFXID0gMjA4LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX1NJTkggPSAyMTQsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfU1VORCA9IDIxOCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9UQU1MID0gMjIyLAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX1RBVlQgPSAyMjUsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfVEVMVSA9IDIyOCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9URk5HID0gMjMxLAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX1RIQUkgPSAyMzQsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfVkFJSSA9IDI0MiwKLSAgICBhZl9ibHVlXzJfMSA9IDI0NSwKLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKSwotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0hBTkkgPSBhZl9ibHVlXzJfMSArIDAsCi0gICAgYWZfYmx1ZV8yXzFfMSA9IGFmX2JsdWVfMl8xICsgMiwKLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKS19CTFVFX0hBTklfVkVSVAotICAgIGFmX2JsdWVfMl8xXzIgPSBhZl9ibHVlXzJfMV8xICsgMiwKLSNlbHNlCi0gICAgYWZfYmx1ZV8yXzFfMiA9IGFmX2JsdWVfMl8xXzEgKyAwLAotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fQ0pLX0JMVUVfSEFOSV9WRVJUICovCi0gICAgYWZfYmx1ZV8yXzIgPSBhZl9ibHVlXzJfMV8yICsgMSwKLSNlbHNlCi0gICAgYWZfYmx1ZV8yXzIgPSBhZl9ibHVlXzJfMSArIDAsCi0jZW5kaWYgLyogQUZfQ09ORklHX09QVElPTl9DSksgICAgICAgICAgICAgICAgKi8KLQotCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfTUFYICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gQUZfQmx1ZV9TdHJpbmdzZXQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfQmx1ZV9TdHJpbmdSZWNfCi0gIHsKLSAgICBBRl9CbHVlX1N0cmluZyAgc3RyaW5nOwotICAgIEZUX1VTaG9ydCAgICAgICBwcm9wZXJ0aWVzOwotCi0gIH0gQUZfQmx1ZV9TdHJpbmdSZWM7Ci0KLQotICBGVF9MT0NBTF9BUlJBWSggQUZfQmx1ZV9TdHJpbmdSZWMgKQotICBhZl9ibHVlX3N0cmluZ3NldHNbXTsKLQotLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBBRkJMVUVfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmYmx1ZS5oaW4gYi9zcmMvYXV0b2ZpdC9hZmJsdWUuaGluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjhiY2JjLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmYmx1ZS5oaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZibHVlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGRhdGEgZm9yIGJsdWUgc3RyaW5ncyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEFGQkxVRV9IXwotI2RlZmluZSBBRkJMVUVfSF8KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIGFuIGF1eGlsaWFyeSBtYWNybyB0byBkZWNvZGUgYSBVVEYtOCBjaGFyYWN0ZXIgLS0gc2luY2Ugd2Ugb25seSB1c2UgKi8KLSAgLyogaGFyZC1jb2RlZCwgc2VsZi1jb252ZXJ0ZWQgZGF0YSwgbm8gZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkICAgICAqLwotI2RlZmluZSBHRVRfVVRGOF9DSEFSKCBjaCwgcCApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY2ggPSAodW5zaWduZWQgY2hhcikqcCsrOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICggY2ggPj0gMHg4MCApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBGVF9VSW50ICBsZW5fOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBpZiAoIGNoIDwgMHhFMCApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGVuXyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGNoICAmPSAweDFGOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIGVsc2UgaWYgKCBjaCA8IDB4RjAgKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBsZW5fID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgY2ggICY9IDB4MEY7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGxlbl8gPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBjaCAgJj0gMHgwNzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgZm9yICggOyBsZW5fID4gMDsgbGVuXy0tICkgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgY2ggPSAoIGNoIDw8IDYgKSB8ICggKnArKyAmIDB4M0YgKTsgXAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIEIgTCBVIEUgICBTIFQgUiBJIE4gRyBTICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBBdCB0aGUgYm90dG9tbW9zdCBsZXZlbCwgd2UgZGVmaW5lIHN0cmluZ3MgZm9yIGZpbmRpbmcgYmx1ZSB6b25lcy4gKi8KLQotCi0jZGVmaW5lIEFGX0JMVUVfU1RSSU5HX01BWF9MRU4gIEBBRl9CTFVFX1NUUklOR19NQVhfTEVOQAotCi0gIC8qIFRoZSBBRl9CbHVlX1N0cmluZyBlbnVtZXJhdGlvbiB2YWx1ZXMgYXJlIG9mZnNldHMgaW50byB0aGUgKi8KLSAgLyogYGFmX2JsdWVfc3RyaW5ncycgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHR5cGVkZWYgZW51bSAgQUZfQmx1ZV9TdHJpbmdfCi0gIHsKLUBBRl9CTFVFX1NUUklOR19FTlVNQAotCi0gICAgQUZfQkxVRV9TVFJJTkdfTUFYICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gQUZfQmx1ZV9TdHJpbmc7Ci0KLQotICBGVF9MT0NBTF9BUlJBWSggY2hhciApCi0gIGFmX2JsdWVfc3RyaW5nc1tdOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICBCIEwgVSBFICAgUyBUIFIgSSBOIEcgUyBFIFQgUyAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogVGhlIG5leHQgbGV2ZWwgaXMgdG8gZ3JvdXAgYmx1ZSBzdHJpbmdzIGludG8gc3R5bGUtc3BlY2lmaWMgc2V0cy4gKi8KLQotCi0gIC8qIFByb3BlcnRpZXMgYXJlIHNwZWNpZmljIHRvIGEgd3JpdGluZyBzeXN0ZW0uICBXZSBhc3N1bWUgdGhhdCBhIGdpdmVuICAqLwotICAvKiBibHVlIHN0cmluZyBjYW4ndCBiZSB1c2VkIGluIG1vcmUgdGhhbiBhIHNpbmdsZSB3cml0aW5nIHN5c3RlbSwgd2hpY2ggKi8KLSAgLyogaXMgYSBzYWZlIGJldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICggMVUgPDwgMCApICAvKiBtdXN0IGhhdmUgdmFsdWUgMSAqLwotI2RlZmluZSBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1NVQl9UT1AgICAoIDFVIDw8IDEgKQotI2RlZmluZSBBRl9CTFVFX1BST1BFUlRZX0xBVElOX05FVVRSQUwgICAoIDFVIDw8IDIgKQotI2RlZmluZSBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAoIDFVIDw8IDMgKQotI2RlZmluZSBBRl9CTFVFX1BST1BFUlRZX0xBVElOX0xPTkcgICAgICAoIDFVIDw8IDQgKQotCi0jZGVmaW5lIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX1RPUCAgICAoIDFVIDw8IDAgKSAgICAgICAvKiBtdXN0IGhhdmUgdmFsdWUgMSAqLwotI2RlZmluZSBBRl9CTFVFX1BST1BFUlRZX0NKS19IT1JJWiAgKCAxVSA8PCAxICkgICAgICAgLyogbXVzdCBoYXZlIHZhbHVlIDIgKi8KLSNkZWZpbmUgQUZfQkxVRV9QUk9QRVJUWV9DSktfUklHSFQgIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX1RPUAotCi0KLSNkZWZpbmUgQUZfQkxVRV9TVFJJTkdTRVRfTUFYX0xFTiAgQEFGX0JMVUVfU1RSSU5HU0VUX01BWF9MRU5ACi0KLSAgLyogVGhlIEFGX0JsdWVfU3RyaW5nc2V0IGVudW1lcmF0aW9uIHZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSAqLwotICAvKiBgYWZfYmx1ZV9zdHJpbmdzZXRzJyBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgdHlwZWRlZiBlbnVtICBBRl9CbHVlX1N0cmluZ3NldF8KLSAgewotQEFGX0JMVUVfU1RSSU5HU0VUX0VOVU1ACi0KLSAgICBBRl9CTFVFX1NUUklOR1NFVF9NQVggICAvKiBkbyBub3QgcmVtb3ZlICovCi0KLSAgfSBBRl9CbHVlX1N0cmluZ3NldDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9CbHVlX1N0cmluZ1JlY18KLSAgewotICAgIEFGX0JsdWVfU3RyaW5nICBzdHJpbmc7Ci0gICAgRlRfVVNob3J0ICAgICAgIHByb3BlcnRpZXM7Ci0KLSAgfSBBRl9CbHVlX1N0cmluZ1JlYzsKLQotCi0gIEZUX0xPQ0FMX0FSUkFZKCBBRl9CbHVlX1N0cmluZ1JlYyApCi0gIGFmX2JsdWVfc3RyaW5nc2V0c1tdOwotCi0vKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIEFGQkxVRV9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZjamsuYyBiL3NyYy9hdXRvZml0L2FmY2prLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzUzM2QuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZjamsuYworKysgL2Rldi9udWxsCkBAIC0xLDIzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZjamsuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIENKSyB3cml0aW5nIHN5c3RlbSAoYm9keSkuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiAgVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBha2l0bydzIGF1dG9oaW50IHBhdGNoLCBhdmFpbGFibGUgaGVyZToKLSAgICoKLSAgICogIGh0dHA6Ly93d3cua2RlLmdyLmpwL35ha2l0by9wYXRjaC9mcmVldHlwZTIvCi0gICAqCi0gICAqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0FEVkFOQ0VTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImFmZ2xvYmFsLmgiCi0jaW5jbHVkZSAiYWZwaWMuaCIKLSNpbmNsdWRlICJhZmxhdGluLmgiCi0jaW5jbHVkZSAiYWZjamsuaCIKLQotCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSksKLQotI3VuZGVmIEFGX0NPTkZJR19PUFRJT05fQ0pLX0JMVUVfSEFOSV9WRVJUCi0KLSNpbmNsdWRlICJhZmVycm9ycy5oIgotCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLSNpbmNsdWRlICJhZndhcnAuaCIKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYWZjamsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgQyBKIEsgICBHIEwgTyBCIEEgTCAgIE0gRSBUIFIgSSBDIFMgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogQmFzaWNhbGx5IHRoZSBMYXRpbiB2ZXJzaW9uIHdpdGggQUZfQ0pLTWV0cmljcyAqLwotICAvKiB0byByZXBsYWNlIEFGX0xhdGluTWV0cmljcy4gICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMoIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlICkKLSAgewotICAgIC8qIHNjYW4gdGhlIGFycmF5IG9mIHNlZ21lbnRzIGluIGVhY2ggZGlyZWN0aW9uICovCi0gICAgQUZfR2x5cGhIaW50c1JlYyAgaGludHNbMV07Ci0KLQotICAgIEZUX1RSQUNFNSgoICJcbiIKLSAgICAgICAgICAgICAgICAiY2prIHN0YW5kYXJkIHdpZHRocyBjb21wdXRhdGlvbiAoc3R5bGUgYCVzJylcbiIKLSAgICAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0gICAgICAgICAgICAgICAgIlxuIiwKLSAgICAgICAgICAgICAgICBhZl9zdHlsZV9uYW1lc1ttZXRyaWNzLT5yb290LnN0eWxlX2NsYXNzLT5zdHlsZV0gKSk7Ci0KLSAgICBhZl9nbHlwaF9oaW50c19pbml0KCBoaW50cywgZmFjZS0+bWVtb3J5ICk7Ci0KLSAgICBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS53aWR0aF9jb3VudCA9IDA7Ci0gICAgbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0ud2lkdGhfY291bnQgPSAwOwotCi0gICAgewotICAgICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3I7Ci0gICAgICBGVF9VTG9uZyAgICAgICAgICBnbHlwaF9pbmRleDsKLSAgICAgIGludCAgICAgICAgICAgICAgIGRpbTsKLSAgICAgIEFGX0NKS01ldHJpY3NSZWMgIGR1bW15WzFdOwotICAgICAgQUZfU2NhbGVyICAgICAgICAgc2NhbGVyID0gJmR1bW15LT5yb290LnNjYWxlcjsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgICBBRl9GYWNlR2xvYmFscyAgZ2xvYmFscyA9IG1ldHJpY3MtPnJvb3QuZ2xvYmFsczsKLSNlbmRpZgotCi0gICAgICBBRl9TdHlsZUNsYXNzICAgc3R5bGVfY2xhc3MgID0gbWV0cmljcy0+cm9vdC5zdHlsZV9jbGFzczsKLSAgICAgIEFGX1NjcmlwdENsYXNzICBzY3JpcHRfY2xhc3MgPSBBRl9TQ1JJUFRfQ0xBU1NFU19HRVQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV9jbGFzcy0+c2NyaXB0XTsKLQotICAgICAgdm9pZCogICAgICAgIHNoYXBlcl9idWY7Ci0gICAgICBjb25zdCBjaGFyKiAgcDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICBGVF9VTG9uZyAgY2ggPSAwOwotI2VuZGlmCi0KLSAgICAgIHAgICAgICAgICAgPSBzY3JpcHRfY2xhc3MtPnN0YW5kYXJkX2NoYXJzdHJpbmc7Ci0gICAgICBzaGFwZXJfYnVmID0gYWZfc2hhcGVyX2J1Zl9jcmVhdGUoIGZhY2UgKTsKLQotICAgICAgLyogV2UgY2hlY2sgYSBsaXN0IG9mIHN0YW5kYXJkIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgbWF0Y2ggd2lucy4gKi8KLQotICAgICAgZ2x5cGhfaW5kZXggPSAwOwotICAgICAgd2hpbGUgKCAqcCApCi0gICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgbnVtX2lkeDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGNvbnN0IGNoYXIqICBwX29sZDsKLSNlbmRpZgotCi0KLSAgICAgICAgd2hpbGUgKCAqcCA9PSAnICcgKQotICAgICAgICAgIHArKzsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIHBfb2xkID0gcDsKLSAgICAgICAgR0VUX1VURjhfQ0hBUiggY2gsIHBfb2xkICk7Ci0jZW5kaWYKLQotICAgICAgICAvKiByZWplY3QgaW5wdXQgdGhhdCBtYXBzIHRvIG1vcmUgdGhhbiBhIHNpbmdsZSBnbHlwaCAqLwotICAgICAgICBwID0gYWZfc2hhcGVyX2dldF9jbHVzdGVyKCBwLCAmbWV0cmljcy0+cm9vdCwgc2hhcGVyX2J1ZiwgJm51bV9pZHggKTsKLSAgICAgICAgaWYgKCBudW1faWR4ID4gMSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogb3RoZXJ3aXNlIGV4aXQgbG9vcCBpZiB3ZSBoYXZlIGEgcmVzdWx0ICovCi0gICAgICAgIGdseXBoX2luZGV4ID0gYWZfc2hhcGVyX2dldF9lbGVtKCAmbWV0cmljcy0+cm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlcl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgKTsKLSAgICAgICAgaWYgKCBnbHlwaF9pbmRleCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGFmX3NoYXBlcl9idWZfZGVzdHJveSggZmFjZSwgc2hhcGVyX2J1ZiApOwotCi0gICAgICBpZiAoICFnbHlwaF9pbmRleCApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCAhZ2x5cGhfaW5kZXggKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICJzdGFuZGFyZCBjaGFyYWN0ZXI6IFUrJTA0bFggKGdseXBoIGluZGV4ICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgIGNoLCBnbHlwaF9pbmRleCApKTsKLQotICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgRlRfTE9BRF9OT19TQ0FMRSApOwotICAgICAgaWYgKCBlcnJvciB8fCBmYWNlLT5nbHlwaC0+b3V0bGluZS5uX3BvaW50cyA8PSAwICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBGVF9aRVJPKCBkdW1teSApOwotCi0gICAgICBkdW1teS0+dW5pdHNfcGVyX2VtID0gbWV0cmljcy0+dW5pdHNfcGVyX2VtOwotCi0gICAgICBzY2FsZXItPnhfc2NhbGUgPSAweDEwMDAwTDsKLSAgICAgIHNjYWxlci0+eV9zY2FsZSA9IDB4MTAwMDBMOwotICAgICAgc2NhbGVyLT54X2RlbHRhID0gMDsKLSAgICAgIHNjYWxlci0+eV9kZWx0YSA9IDA7Ci0KLSAgICAgIHNjYWxlci0+ZmFjZSAgICAgICAgPSBmYWNlOwotICAgICAgc2NhbGVyLT5yZW5kZXJfbW9kZSA9IEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLSAgICAgIHNjYWxlci0+ZmxhZ3MgICAgICAgPSAwOwotCi0gICAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgKEFGX1N0eWxlTWV0cmljcylkdW1teSApOwotCi0gICAgICBlcnJvciA9IGFmX2dseXBoX2hpbnRzX3JlbG9hZCggaGludHMsICZmYWNlLT5nbHlwaC0+b3V0bGluZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggZGltID0gMDsgZGltIDwgQUZfRElNRU5TSU9OX01BWDsgZGltKysgKQotICAgICAgewotICAgICAgICBBRl9DSktBeGlzICAgIGF4aXMgICAgPSAmbWV0cmljcy0+YXhpc1tkaW1dOwotICAgICAgICBBRl9BeGlzSGludHMgIGF4aGludHMgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICAgICAgQUZfU2VnbWVudCAgICBzZWcsIGxpbWl0LCBsaW5rOwotICAgICAgICBGVF9VSW50ICAgICAgIG51bV93aWR0aHMgPSAwOwotCi0KLSAgICAgICAgZXJyb3IgPSBhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzKCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIFdlIGFzc3VtZSB0aGF0IHRoZSBnbHlwaHMgc2VsZWN0ZWQgZm9yIHRoZSBzdGVtIHdpZHRoCi0gICAgICAgICAqICBjb21wdXRhdGlvbiBhcmUgYGZlYXR1cmVsZXNzJyBlbm91Z2ggc28gdGhhdCB0aGUgbGlua2luZwotICAgICAgICAgKiAgYWxnb3JpdGhtIHdvcmtzIGZpbmUgd2l0aG91dCBhZGp1c3RtZW50cyBvZiBpdHMgc2NvcmluZwotICAgICAgICAgKiAgZnVuY3Rpb24uCi0gICAgICAgICAqLwotICAgICAgICBhZl9sYXRpbl9oaW50c19saW5rX3NlZ21lbnRzKCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0RpbWVuc2lvbilkaW0gKTsKLQotICAgICAgICBzZWcgICA9IGF4aGludHMtPnNlZ21lbnRzOwotICAgICAgICBsaW1pdCA9IHNlZyArIGF4aGludHMtPm51bV9zZWdtZW50czsKLQotICAgICAgICBmb3IgKCA7IHNlZyA8IGxpbWl0OyBzZWcrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBsaW5rID0gc2VnLT5saW5rOwotCi0gICAgICAgICAgLyogd2Ugb25seSBjb25zaWRlciBzdGVtIHNlZ21lbnRzIHRoZXJlISAqLwotICAgICAgICAgIGlmICggbGluayAmJiBsaW5rLT5saW5rID09IHNlZyAmJiBsaW5rID4gc2VnICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIGRpc3Q7Ci0KLQotICAgICAgICAgICAgZGlzdCA9IHNlZy0+cG9zIC0gbGluay0+cG9zOwotICAgICAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICAgICAgaWYgKCBudW1fd2lkdGhzIDwgQUZfQ0pLX01BWF9XSURUSFMgKQotICAgICAgICAgICAgICBheGlzLT53aWR0aHNbbnVtX3dpZHRocysrXS5vcmcgPSBkaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRoaXMgYWxzbyByZXBsYWNlcyBtdWx0aXBsZSBhbG1vc3QgaWRlbnRpY2FsIHN0ZW0gd2lkdGhzICovCi0gICAgICAgIC8qIHdpdGggYSBzaW5nbGUgb25lICh0aGUgdmFsdWUgMTAwIGlzIGhldXJpc3RpYykgICAgICAgICAgICovCi0gICAgICAgIGFmX3NvcnRfYW5kX3F1YW50aXplX3dpZHRocyggJm51bV93aWR0aHMsIGF4aXMtPndpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teS0+dW5pdHNfcGVyX2VtIC8gMTAwICk7Ci0gICAgICAgIGF4aXMtPndpZHRoX2NvdW50ID0gbnVtX3dpZHRoczsKLSAgICAgIH0KLQotICAgIEV4aXQ6Ci0gICAgICBmb3IgKCBkaW0gPSAwOyBkaW0gPCBBRl9ESU1FTlNJT05fTUFYOyBkaW0rKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0NKS0F4aXMgIGF4aXMgPSAmbWV0cmljcy0+YXhpc1tkaW1dOwotICAgICAgICBGVF9Qb3MgICAgICBzdGR3OwotCi0KLSAgICAgICAgc3RkdyA9ICggYXhpcy0+d2lkdGhfY291bnQgPiAwICkgPyBheGlzLT53aWR0aHNbMF0ub3JnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQUZfTEFUSU5fQ09OU1RBTlQoIG1ldHJpY3MsIDUwICk7Ci0KLSAgICAgICAgLyogbGV0J3MgdHJ5IDIwJSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggKi8KLSAgICAgICAgYXhpcy0+ZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSBzdGR3IC8gNTsKLSAgICAgICAgYXhpcy0+c3RhbmRhcmRfd2lkdGggICAgICAgICAgPSBzdGR3OwotICAgICAgICBheGlzLT5leHRyYV9saWdodCAgICAgICAgICAgICA9IDA7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiVzIHdpZHRoczpcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZGltID09IEFGX0RJTUVOU0lPTl9WRVJUID8gImhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInZlcnRpY2FsIiApKTsKLQotICAgICAgICAgIEZUX1RSQUNFNSgoICIgICVkIChzdGFuZGFyZCkiLCBheGlzLT5zdGFuZGFyZF93aWR0aCApKTsKLSAgICAgICAgICBmb3IgKCBpID0gMTsgaSA8IGF4aXMtPndpZHRoX2NvdW50OyBpKysgKQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAlZCIsIGF4aXMtPndpZHRoc1tpXS5vcmcgKSk7Ci0KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwotCi0gICAgYWZfZ2x5cGhfaGludHNfZG9uZSggaGludHMgKTsKLSAgfQotCi0KLSAgLyogRmluZCBhbGwgYmx1ZSB6b25lcy4gKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl9jamtfbWV0cmljc19pbml0X2JsdWVzKCBBRl9DSktNZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlICkKLSAgewotICAgIEZUX1BvcyAgICAgIGZpbGxzW0FGX0JMVUVfU1RSSU5HX01BWF9MRU5dOwotICAgIEZUX1BvcyAgICAgIGZsYXRzW0FGX0JMVUVfU1RSSU5HX01BWF9MRU5dOwotCi0gICAgRlRfVUludCAgICAgbnVtX2ZpbGxzOwotICAgIEZUX1VJbnQgICAgIG51bV9mbGF0czsKLQotICAgIEZUX0Jvb2wgICAgIGZpbGw7Ci0KLSAgICBBRl9DSktCbHVlICBibHVlOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEFGX0NKS0F4aXMgIGF4aXM7Ci0gICAgRlRfT3V0bGluZSAgb3V0bGluZTsKLQotICAgIEFGX1N0eWxlQ2xhc3MgIHNjID0gbWV0cmljcy0+cm9vdC5zdHlsZV9jbGFzczsKLQotICAgIEFGX0JsdWVfU3RyaW5nc2V0ICAgICAgICAgYnNzID0gc2MtPmJsdWVfc3RyaW5nc2V0OwotICAgIGNvbnN0IEFGX0JsdWVfU3RyaW5nUmVjKiAgYnMgID0gJmFmX2JsdWVfc3RyaW5nc2V0c1tic3NdOwotCi0gICAgdm9pZCogIHNoYXBlcl9idWY7Ci0KLQotICAgIC8qIHdlIHdhbGsgb3ZlciB0aGUgYmx1ZSBjaGFyYWN0ZXIgc3RyaW5ncyBhcyBzcGVjaWZpZWQgaW4gdGhlICAgKi8KLSAgICAvKiBzdHlsZSdzIGVudHJ5IGluIHRoZSBgYWZfYmx1ZV9zdHJpbmdzZXQnIGFycmF5LCBjb21wdXRpbmcgaXRzICovCi0gICAgLyogZXh0cmVtdW0gcG9pbnRzIChkZXBlbmRpbmcgb24gdGhlIHN0cmluZyBwcm9wZXJ0aWVzKSAgICAgICAgICAqLwotCi0gICAgRlRfVFJBQ0U1KCggImNqayBibHVlIHpvbmVzIGNvbXB1dGF0aW9uXG4iCi0gICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0gICAgICAgICAgICAgICAgIlxuIiApKTsKLQotICAgIHNoYXBlcl9idWYgPSBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggZmFjZSApOwotCi0gICAgZm9yICggOyBicy0+c3RyaW5nICE9IEFGX0JMVUVfU1RSSU5HX01BWDsgYnMrKyApCi0gICAgewotICAgICAgY29uc3QgY2hhciogIHAgPSAmYWZfYmx1ZV9zdHJpbmdzW2JzLT5zdHJpbmddOwotICAgICAgRlRfUG9zKiAgICAgIGJsdWVfcmVmOwotICAgICAgRlRfUG9zKiAgICAgIGJsdWVfc2hvb3Q7Ci0KLQotICAgICAgaWYgKCBBRl9DSktfSVNfSE9SSVpfQkxVRSggYnMgKSApCi0gICAgICAgIGF4aXMgPSAmbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl07Ci0gICAgICBlbHNlCi0gICAgICAgIGF4aXMgPSAmbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF07Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgewotICAgICAgICBGVF9TdHJpbmcqICBjamtfYmx1ZV9uYW1lWzRdID0KLSAgICAgICAgewotICAgICAgICAgIChGVF9TdHJpbmcqKSJib3R0b20iLCAgICAvKiAtLSAgICwgLS0gICovCi0gICAgICAgICAgKEZUX1N0cmluZyopInRvcCIsICAgICAgIC8qIC0tICAgLCBUT1AgKi8KLSAgICAgICAgICAoRlRfU3RyaW5nKikibGVmdCIsICAgICAgLyogSE9SSVosIC0tICAqLwotICAgICAgICAgIChGVF9TdHJpbmcqKSJyaWdodCIgICAgICAvKiBIT1JJWiwgVE9QICovCi0gICAgICAgIH07Ci0KLQotICAgICAgICBGVF9UUkFDRTUoKCAiYmx1ZSB6b25lICVkICglcyk6XG4iLAotICAgICAgICAgICAgICAgICAgICBheGlzLT5ibHVlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICBjamtfYmx1ZV9uYW1lW0FGX0NKS19JU19IT1JJWl9CTFVFKCBicyApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9DSktfSVNfVE9QX0JMVUUoIGJzICkgICBdICkpOwotICAgICAgfQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSAgICAgIG51bV9maWxscyA9IDA7Ci0gICAgICBudW1fZmxhdHMgPSAwOwotCi0gICAgICBmaWxsID0gMTsgIC8qIHN0YXJ0IHdpdGggY2hhcmFjdGVycyB0aGF0IGRlZmluZSBmaWxsIHZhbHVlcyAqLwotICAgICAgRlRfVFJBQ0U1KCggIiAgW292ZXJzaG9vdCB2YWx1ZXNdXG4iICkpOwotCi0gICAgICB3aGlsZSAoICpwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUxvbmcgICAgZ2x5cGhfaW5kZXg7Ci0gICAgICAgIEZUX1BvcyAgICAgIGJlc3RfcG9zOyAgICAgICAvKiBzYW1lIGFzIHBvaW50cy55IG9yIHBvaW50cy54LCByZXNwLiAqLwotICAgICAgICBGVF9JbnQgICAgICBiZXN0X3BvaW50OwotICAgICAgICBGVF9WZWN0b3IqICBwb2ludHM7Ci0KLSAgICAgICAgdW5zaWduZWQgaW50ICBudW1faWR4OwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgY29uc3QgY2hhciogIHBfb2xkOwotICAgICAgICBGVF9VTG9uZyAgICAgY2g7Ci0jZW5kaWYKLQotCi0gICAgICAgIHdoaWxlICggKnAgPT0gJyAnICkKLSAgICAgICAgICBwKys7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBwX29sZCA9IHA7Ci0gICAgICAgIEdFVF9VVEY4X0NIQVIoIGNoLCBwX29sZCApOwotI2VuZGlmCi0KLSAgICAgICAgLyogc3dpdGNoIHRvIGNoYXJhY3RlcnMgdGhhdCBkZWZpbmUgZmxhdCB2YWx1ZXMgKi8KLSAgICAgICAgaWYgKCAqcCA9PSAnfCcgKQotICAgICAgICB7Ci0gICAgICAgICAgZmlsbCA9IDA7Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgW3JlZmVyZW5jZSB2YWx1ZXNdXG4iICkpOwotICAgICAgICAgIHArKzsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHJlamVjdCBpbnB1dCB0aGF0IG1hcHMgdG8gbW9yZSB0aGFuIGEgc2luZ2xlIGdseXBoICovCi0gICAgICAgIHAgPSBhZl9zaGFwZXJfZ2V0X2NsdXN0ZXIoIHAsICZtZXRyaWNzLT5yb290LCBzaGFwZXJfYnVmLCAmbnVtX2lkeCApOwotICAgICAgICBpZiAoIG51bV9pZHggPiAxICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBsb2FkIHRoZSBjaGFyYWN0ZXIgaW4gdGhlIGZhY2UgLS0gc2tpcCB1bmtub3duIG9yIGVtcHR5IG9uZXMgKi8KLSAgICAgICAgZ2x5cGhfaW5kZXggPSBhZl9zaGFwZXJfZ2V0X2VsZW0oICZtZXRyaWNzLT5yb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVyX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOwotICAgICAgICBpZiAoIGdseXBoX2luZGV4ID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgVSslMDRsWCB1bmF2YWlsYWJsZVxuIiwgY2ggKSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnJvciAgID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgZ2x5cGhfaW5kZXgsIEZUX0xPQURfTk9fU0NBTEUgKTsKLSAgICAgICAgb3V0bGluZSA9IGZhY2UtPmdseXBoLT5vdXRsaW5lOwotICAgICAgICBpZiAoIGVycm9yIHx8IG91dGxpbmUubl9wb2ludHMgPD0gMiApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBVKyUwNGxYIGNvbnRhaW5zIG5vICh1c2FibGUpIG91dGxpbmVzXG4iLCBjaCApKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdyBjb21wdXRlIG1pbiBvciBtYXggcG9pbnQgaW5kaWNlcyBhbmQgY29vcmRpbmF0ZXMgKi8KLSAgICAgICAgcG9pbnRzICAgICA9IG91dGxpbmUucG9pbnRzOwotICAgICAgICBiZXN0X3BvaW50ID0gLTE7Ci0gICAgICAgIGJlc3RfcG9zICAgPSAwOyAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIG5uOwotICAgICAgICAgIEZUX0ludCAgZmlyc3QgPSAwOwotICAgICAgICAgIEZUX0ludCAgbGFzdCAgPSAtMTsKLQotCi0gICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG91dGxpbmUubl9jb250b3VyczsgZmlyc3QgPSBsYXN0ICsgMSwgbm4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBwcDsKLQotCi0gICAgICAgICAgICBsYXN0ID0gb3V0bGluZS5jb250b3Vyc1tubl07Ci0KLSAgICAgICAgICAgIC8qIEF2b2lkIHNpbmdsZS1wb2ludCBjb250b3VycyBzaW5jZSB0aGV5IGFyZSBuZXZlciByYXN0ZXJpemVkLiAqLwotICAgICAgICAgICAgLyogSW4gc29tZSBmb250cywgdGhleSBjb3JyZXNwb25kIHRvIG1hcmsgYXR0YWNobWVudCBwb2ludHMgICAgICovCi0gICAgICAgICAgICAvKiB3aGljaCBhcmUgd2F5IG91dHNpZGUgb2YgdGhlIGdseXBoJ3MgcmVhbCBvdXRsaW5lLiAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggbGFzdCA8PSBmaXJzdCApCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAoIEFGX0NKS19JU19IT1JJWl9CTFVFKCBicyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCBBRl9DSktfSVNfUklHSFRfQkxVRSggYnMgKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBwcCA9IGZpcnN0OyBwcCA8PSBsYXN0OyBwcCsrICkKLSAgICAgICAgICAgICAgICAgIGlmICggYmVzdF9wb2ludCA8IDAgfHwgcG9pbnRzW3BwXS54ID4gYmVzdF9wb3MgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiZXN0X3BvaW50ID0gcHA7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RfcG9zICAgPSBwb2ludHNbcHBdLng7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggcHAgPSBmaXJzdDsgcHAgPD0gbGFzdDsgcHArKyApCi0gICAgICAgICAgICAgICAgICBpZiAoIGJlc3RfcG9pbnQgPCAwIHx8IHBvaW50c1twcF0ueCA8IGJlc3RfcG9zICkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdF9wb2ludCA9IHBwOwotICAgICAgICAgICAgICAgICAgICBiZXN0X3BvcyAgID0gcG9pbnRzW3BwXS54OwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggQUZfQ0pLX0lTX1RPUF9CTFVFKCBicyApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIHBwID0gZmlyc3Q7IHBwIDw9IGxhc3Q7IHBwKysgKQotICAgICAgICAgICAgICAgICAgaWYgKCBiZXN0X3BvaW50IDwgMCB8fCBwb2ludHNbcHBdLnkgPiBiZXN0X3BvcyApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RfcG9pbnQgPSBwcDsKLSAgICAgICAgICAgICAgICAgICAgYmVzdF9wb3MgICA9IHBvaW50c1twcF0ueTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBwcCA9IGZpcnN0OyBwcCA8PSBsYXN0OyBwcCsrICkKLSAgICAgICAgICAgICAgICAgIGlmICggYmVzdF9wb2ludCA8IDAgfHwgcG9pbnRzW3BwXS55IDwgYmVzdF9wb3MgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiZXN0X3BvaW50ID0gcHA7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RfcG9zICAgPSBwb2ludHNbcHBdLnk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBVKyUwNGxYOiBiZXN0X3BvcyA9ICU1bGRcbiIsIGNoLCBiZXN0X3BvcyApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZmlsbCApCi0gICAgICAgICAgZmlsbHNbbnVtX2ZpbGxzKytdID0gYmVzdF9wb3M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBmbGF0c1tudW1fZmxhdHMrK10gPSBiZXN0X3BvczsKLQotICAgICAgfSAvKiBlbmQgd2hpbGUgbG9vcCAqLwotCi0gICAgICBpZiAoIG51bV9mbGF0cyA9PSAwICYmIG51bV9maWxscyA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogIHdlIGNvdWxkbid0IGZpbmQgYSBzaW5nbGUgZ2x5cGggdG8gY29tcHV0ZSB0aGlzIGJsdWUgem9uZSwKLSAgICAgICAgICogIHdlIHdpbGwgc2ltcGx5IGlnbm9yZSBpdCB0aGVuCi0gICAgICAgICAqLwotICAgICAgICBGVF9UUkFDRTUoKCAiICBlbXB0eVxuIiApKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIGhhdmUgY29tcHV0ZWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBgZmlsbCcgYW5kIGBmbGF0cycgdGFibGVzLCAgICovCi0gICAgICAvKiBub3cgZGV0ZXJtaW5lIHRoZSByZWZlcmVuY2UgYW5kIG92ZXJzaG9vdCBwb3NpdGlvbiBvZiB0aGUgYmx1ZSAtLSAqLwotICAgICAgLyogd2Ugc2ltcGx5IHRha2UgdGhlIG1lZGlhbiB2YWx1ZSBhZnRlciBhIHNpbXBsZSBzb3J0ICAgICAgICAgICAgICAgKi8KLSAgICAgIGFmX3NvcnRfcG9zKCBudW1fZmlsbHMsIGZpbGxzICk7Ci0gICAgICBhZl9zb3J0X3BvcyggbnVtX2ZsYXRzLCBmbGF0cyApOwotCi0gICAgICBibHVlICAgICAgID0gJmF4aXMtPmJsdWVzW2F4aXMtPmJsdWVfY291bnRdOwotICAgICAgYmx1ZV9yZWYgICA9ICZibHVlLT5yZWYub3JnOwotICAgICAgYmx1ZV9zaG9vdCA9ICZibHVlLT5zaG9vdC5vcmc7Ci0KLSAgICAgIGF4aXMtPmJsdWVfY291bnQrKzsKLQotICAgICAgaWYgKCBudW1fZmxhdHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpibHVlX3JlZiAgID0KLSAgICAgICAgKmJsdWVfc2hvb3QgPSBmaWxsc1tudW1fZmlsbHMgLyAyXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBudW1fZmlsbHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpibHVlX3JlZiAgID0KLSAgICAgICAgKmJsdWVfc2hvb3QgPSBmbGF0c1tudW1fZmxhdHMgLyAyXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmJsdWVfcmVmICAgPSBmaWxsc1tudW1fZmlsbHMgLyAyXTsKLSAgICAgICAgKmJsdWVfc2hvb3QgPSBmbGF0c1tudW1fZmxhdHMgLyAyXTsKLSAgICAgIH0KLQotICAgICAgLyogbWFrZSBzdXJlIGJsdWVfcmVmID49IGJsdWVfc2hvb3QgZm9yIHRvcC9yaWdodCBvciAqLwotICAgICAgLyogdmljZSB2ZXJzYSBmb3IgYm90dG9tL2xlZnQgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCAqYmx1ZV9zaG9vdCAhPSAqYmx1ZV9yZWYgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgICByZWYgICAgICAgPSAqYmx1ZV9yZWY7Ci0gICAgICAgIEZUX1BvcyAgIHNob290ICAgICA9ICpibHVlX3Nob290OwotICAgICAgICBGVF9Cb29sICB1bmRlcl9yZWYgPSBGVF9CT09MKCBzaG9vdCA8IHJlZiApOwotCi0KLSAgICAgICAgLyogQUZfQ0pLX0lTX1RPUF9CTFVFIGNvdmVycyBgcmlnaHQnIGFuZCBgdG9wJyAqLwotICAgICAgICBpZiAoIEFGX0NKS19JU19UT1BfQkxVRSggYnMgKSBeIHVuZGVyX3JlZiApCi0gICAgICAgIHsKLSAgICAgICAgICAqYmx1ZV9yZWYgICA9Ci0gICAgICAgICAgKmJsdWVfc2hvb3QgPSAoIHNob290ICsgcmVmICkgLyAyOwotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgW3JlZmVyZW5jZSBzbWFsbGVyIHRoYW4gb3ZlcnNob290LCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHRha2luZyBtZWFuIHZhbHVlXVxuIiApKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBibHVlLT5mbGFncyA9IDA7Ci0gICAgICBpZiAoIEFGX0NKS19JU19UT1BfQkxVRSggYnMgKSApCi0gICAgICAgIGJsdWUtPmZsYWdzIHw9IEFGX0NKS19CTFVFX1RPUDsKLQotICAgICAgRlRfVFJBQ0U1KCggIiAgICAtPiByZWZlcmVuY2UgPSAlbGRcbiIKLSAgICAgICAgICAgICAgICAgICIgICAgICAgb3ZlcnNob290ID0gJWxkXG4iLAotICAgICAgICAgICAgICAgICAgKmJsdWVfcmVmLCAqYmx1ZV9zaG9vdCApKTsKLQotICAgIH0gLyogZW5kIGZvciBsb29wICovCi0KLSAgICBhZl9zaGFwZXJfYnVmX2Rlc3Ryb3koIGZhY2UsIHNoYXBlcl9idWYgKTsKLQotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotCi0gIC8qIEJhc2ljYWxseSB0aGUgTGF0aW4gdmVyc2lvbiB3aXRoIHR5cGUgQUZfQ0pLTWV0cmljcyBmb3IgbWV0cmljcy4gKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9jamtfbWV0cmljc19jaGVja19kaWdpdHMoIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSApCi0gIHsKLSAgICBGVF9Cb29sICAgc3RhcnRlZCA9IDAsIHNhbWVfd2lkdGggPSAxOwotICAgIEZUX0ZpeGVkICBhZHZhbmNlID0gMCwgb2xkX2FkdmFuY2UgPSAwOwotCi0gICAgdm9pZCogIHNoYXBlcl9idWY7Ci0KLSAgICAvKiBpbiBhbGwgc3VwcG9ydGVkIGNoYXJtYXBzLCBkaWdpdHMgaGF2ZSBjaGFyYWN0ZXIgY29kZXMgMHgzMC0weDM5ICovCi0gICAgY29uc3QgY2hhciAgIGRpZ2l0c1tdID0gIjAgMSAyIDMgNCA1IDYgNyA4IDkiOwotICAgIGNvbnN0IGNoYXIqICBwOwotCi0KLSAgICBwICAgICAgICAgID0gZGlnaXRzOwotICAgIHNoYXBlcl9idWYgPSBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggZmFjZSApOwotCi0gICAgd2hpbGUgKCAqcCApCi0gICAgewotICAgICAgRlRfVUxvbmcgICAgICBnbHlwaF9pbmRleDsKLSAgICAgIHVuc2lnbmVkIGludCAgbnVtX2lkeDsKLQotCi0gICAgICAvKiByZWplY3QgaW5wdXQgdGhhdCBtYXBzIHRvIG1vcmUgdGhhbiBhIHNpbmdsZSBnbHlwaCAqLwotICAgICAgcCA9IGFmX3NoYXBlcl9nZXRfY2x1c3RlciggcCwgJm1ldHJpY3MtPnJvb3QsIHNoYXBlcl9idWYsICZudW1faWR4ICk7Ci0gICAgICBpZiAoIG51bV9pZHggPiAxICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGdseXBoX2luZGV4ID0gYWZfc2hhcGVyX2dldF9lbGVtKCAmbWV0cmljcy0+cm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZXJfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOwotICAgICAgaWYgKCAhZ2x5cGhfaW5kZXggKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBzdGFydGVkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBhZHZhbmNlICE9IG9sZF9hZHZhbmNlICkKLSAgICAgICAgewotICAgICAgICAgIHNhbWVfd2lkdGggPSAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9sZF9hZHZhbmNlID0gYWR2YW5jZTsKLSAgICAgICAgc3RhcnRlZCAgICAgPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIGFmX3NoYXBlcl9idWZfZGVzdHJveSggZmFjZSwgc2hhcGVyX2J1ZiApOwotCi0gICAgbWV0cmljcy0+cm9vdC5kaWdpdHNfaGF2ZV9zYW1lX3dpZHRoID0gc2FtZV93aWR0aDsKLSAgfQotCi0KLSAgLyogSW5pdGlhbGl6ZSBnbG9iYWwgbWV0cmljcy4gKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfY2prX21ldHJpY3NfaW5pdCggQUZfQ0pLTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSApCi0gIHsKLSAgICBGVF9DaGFyTWFwICBvbGRtYXAgPSBmYWNlLT5jaGFybWFwOwotCi0KLSAgICBtZXRyaWNzLT51bml0c19wZXJfZW0gPSBmYWNlLT51bml0c19wZXJfRU07Ci0KLSAgICBpZiAoICFGVF9TZWxlY3RfQ2hhcm1hcCggZmFjZSwgRlRfRU5DT0RJTkdfVU5JQ09ERSApICkKLSAgICB7Ci0gICAgICBhZl9jamtfbWV0cmljc19pbml0X3dpZHRocyggbWV0cmljcywgZmFjZSApOwotICAgICAgYWZfY2prX21ldHJpY3NfaW5pdF9ibHVlcyggbWV0cmljcywgZmFjZSApOwotICAgICAgYWZfY2prX21ldHJpY3NfY2hlY2tfZGlnaXRzKCBtZXRyaWNzLCBmYWNlICk7Ci0gICAgfQotCi0gICAgRlRfU2V0X0NoYXJtYXAoIGZhY2UsIG9sZG1hcCApOwotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIEFkanVzdCBzY2FsaW5nIHZhbHVlLCB0aGVuIHNjYWxlIGFuZCBzaGlmdCB3aWR0aHMgICAqLwotICAvKiBhbmQgYmx1ZSB6b25lcyAoaWYgYXBwbGljYWJsZSkgZm9yIGdpdmVuIGRpbWVuc2lvbi4gKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl9jamtfbWV0cmljc19zY2FsZV9kaW0oIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU2NhbGVyICAgICAgc2NhbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBGVF9GaXhlZCAgICBzY2FsZTsKLSAgICBGVF9Qb3MgICAgICBkZWx0YTsKLSAgICBBRl9DSktBeGlzICBheGlzOwotICAgIEZUX1VJbnQgICAgIG5uOwotCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgc2NhbGUgPSBzY2FsZXItPnhfc2NhbGU7Ci0gICAgICBkZWx0YSA9IHNjYWxlci0+eF9kZWx0YTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNjYWxlID0gc2NhbGVyLT55X3NjYWxlOwotICAgICAgZGVsdGEgPSBzY2FsZXItPnlfZGVsdGE7Ci0gICAgfQotCi0gICAgYXhpcyA9ICZtZXRyaWNzLT5heGlzW2RpbV07Ci0KLSAgICBpZiAoIGF4aXMtPm9yZ19zY2FsZSA9PSBzY2FsZSAmJiBheGlzLT5vcmdfZGVsdGEgPT0gZGVsdGEgKQotICAgICAgcmV0dXJuOwotCi0gICAgYXhpcy0+b3JnX3NjYWxlID0gc2NhbGU7Ci0gICAgYXhpcy0+b3JnX2RlbHRhID0gZGVsdGE7Ci0KLSAgICBheGlzLT5zY2FsZSA9IHNjYWxlOwotICAgIGF4aXMtPmRlbHRhID0gZGVsdGE7Ci0KLSAgICAvKiBzY2FsZSB0aGUgYmx1ZSB6b25lcyAqLwotICAgIGZvciAoIG5uID0gMDsgbm4gPCBheGlzLT5ibHVlX2NvdW50OyBubisrICkKLSAgICB7Ci0gICAgICBBRl9DSktCbHVlICBibHVlID0gJmF4aXMtPmJsdWVzW25uXTsKLSAgICAgIEZUX1BvcyAgICAgIGRpc3Q7Ci0KLQotICAgICAgYmx1ZS0+cmVmLmN1ciAgID0gRlRfTXVsRml4KCBibHVlLT5yZWYub3JnLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICBibHVlLT5yZWYuZml0ICAgPSBibHVlLT5yZWYuY3VyOwotICAgICAgYmx1ZS0+c2hvb3QuY3VyID0gRlRfTXVsRml4KCBibHVlLT5zaG9vdC5vcmcsIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgIGJsdWUtPnNob290LmZpdCA9IGJsdWUtPnNob290LmN1cjsKLSAgICAgIGJsdWUtPmZsYWdzICAgICY9IH5BRl9DSktfQkxVRV9BQ1RJVkU7Ci0KLSAgICAgIC8qIGEgYmx1ZSB6b25lIGlzIG9ubHkgYWN0aXZlIGlmIGl0IGlzIGxlc3MgdGhhbiAzLzQgcGl4ZWxzIHRhbGwgKi8KLSAgICAgIGRpc3QgPSBGVF9NdWxGaXgoIGJsdWUtPnJlZi5vcmcgLSBibHVlLT5zaG9vdC5vcmcsIHNjYWxlICk7Ci0gICAgICBpZiAoIGRpc3QgPD0gNDggJiYgZGlzdCA+PSAtNDggKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGRlbHRhMSwgZGVsdGEyOwotCi0KLSAgICAgICAgYmx1ZS0+cmVmLmZpdCAgPSBGVF9QSVhfUk9VTkQoIGJsdWUtPnJlZi5jdXIgKTsKLQotICAgICAgICAvKiBzaG9vdCBpcyB1bmRlciBzaG9vdCBmb3IgY2prICovCi0gICAgICAgIGRlbHRhMSA9IEZUX0RpdkZpeCggYmx1ZS0+cmVmLmZpdCwgc2NhbGUgKSAtIGJsdWUtPnNob290Lm9yZzsKLSAgICAgICAgZGVsdGEyID0gZGVsdGExOwotICAgICAgICBpZiAoIGRlbHRhMSA8IDAgKQotICAgICAgICAgIGRlbHRhMiA9IC1kZWx0YTI7Ci0KLSAgICAgICAgZGVsdGEyID0gRlRfTXVsRml4KCBkZWx0YTIsIHNjYWxlICk7Ci0KLSAgICAgICAgRlRfVFJBQ0U1KCggImRlbHRhOiAlZCIsIGRlbHRhMSApKTsKLSAgICAgICAgaWYgKCBkZWx0YTIgPCAzMiApCi0gICAgICAgICAgZGVsdGEyID0gMDsKLSNpZiAwCi0gICAgICAgIGVsc2UgaWYgKCBkZWx0YTIgPCA2NCApCi0gICAgICAgICAgZGVsdGEyID0gMzIgKyAoICggKCBkZWx0YTIgLSAzMiApICsgMTYgKSAmIH4zMSApOwotI2VuZGlmCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBkZWx0YTIgPSBGVF9QSVhfUk9VTkQoIGRlbHRhMiApOwotICAgICAgICBGVF9UUkFDRTUoKCAiLyVkXG4iLCBkZWx0YTIgKSk7Ci0KLSAgICAgICAgaWYgKCBkZWx0YTEgPCAwICkKLSAgICAgICAgICBkZWx0YTIgPSAtZGVsdGEyOwotCi0gICAgICAgIGJsdWUtPnNob290LmZpdCA9IGJsdWUtPnJlZi5maXQgLSBkZWx0YTI7Ci0KLSAgICAgICAgRlRfVFJBQ0U1KCggIj4+IGFjdGl2ZSBjamsgYmx1ZSB6b25lICVjJWRbJWxkLyVsZF06XG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgIHJlZjogICBjdXI9JS4yZiBmaXQ9JS4yZlxuIgotICAgICAgICAgICAgICAgICAgICAiICAgICBzaG9vdDogY3VyPSUuMmYgZml0PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkgPyAnSCcgOiAnVicsCi0gICAgICAgICAgICAgICAgICAgIG5uLCBibHVlLT5yZWYub3JnLCBibHVlLT5zaG9vdC5vcmcsCi0gICAgICAgICAgICAgICAgICAgIGJsdWUtPnJlZi5jdXIgLyA2NC4wLCBibHVlLT5yZWYuZml0IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgYmx1ZS0+c2hvb3QuY3VyIC8gNjQuMCwgYmx1ZS0+c2hvb3QuZml0IC8gNjQuMCApKTsKLQotICAgICAgICBibHVlLT5mbGFncyB8PSBBRl9DSktfQkxVRV9BQ1RJVkU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBTY2FsZSBnbG9iYWwgdmFsdWVzIGluIGJvdGggZGlyZWN0aW9ucy4gKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9jamtfbWV0cmljc19zY2FsZSggQUZfQ0pLTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgIHNjYWxlciApCi0gIHsKLSAgICAvKiB3ZSBjb3B5IHRoZSB3aG9sZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIHggYW5kIHkgc2NhbGluZyB2YWx1ZXMgKi8KLSAgICAvKiBhcmUgbm90IG1vZGlmaWVkLCBjb250cmFyeSB0byBlLmcuIHRoZSBgbGF0aW4nIGF1dG8taGludGVyICAgKi8KLSAgICBtZXRyaWNzLT5yb290LnNjYWxlciA9ICpzY2FsZXI7Ci0KLSAgICBhZl9jamtfbWV0cmljc19zY2FsZV9kaW0oIG1ldHJpY3MsIHNjYWxlciwgQUZfRElNRU5TSU9OX0hPUlogKTsKLSAgICBhZl9jamtfbWV0cmljc19zY2FsZV9kaW0oIG1ldHJpY3MsIHNjYWxlciwgQUZfRElNRU5TSU9OX1ZFUlQgKTsKLSAgfQotCi0KLSAgLyogRXh0cmFjdCBzdGFuZGFyZF93aWR0aCBmcm9tIHdyaXRpbmcgc3lzdGVtL3NjcmlwdCBzcGVjaWZpYyAqLwotICAvKiBtZXRyaWNzIGNsYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfY2prX2dldF9zdGFuZGFyZF93aWR0aHMoIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgICBzdGRIVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAgIHN0ZFZXICkKLSAgewotICAgIGlmICggc3RkSFcgKQotICAgICAgKnN0ZEhXID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0uc3RhbmRhcmRfd2lkdGg7Ci0KLSAgICBpZiAoIHN0ZFZXICkKLSAgICAgICpzdGRWVyA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdLnN0YW5kYXJkX3dpZHRoOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgIEMgSiBLICAgRyBMIFkgUCBIICAgQSBOIEEgTCBZIFMgSSBTICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFdhbGsgb3ZlciBhbGwgY29udG91cnMgYW5kIGNvbXB1dGUgaXRzIHNlZ21lbnRzLiAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9jamtfaGludHNfY29tcHV0ZV9zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgICAgID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50cyAgICAgID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50X2xpbWl0ID0gc2VnbWVudHMgKyBheGlzLT5udW1fc2VnbWVudHM7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBBRl9TZWdtZW50ICAgIHNlZzsKLQotCi0gICAgZXJyb3IgPSBhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzKCBoaW50cywgZGltICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBhIHNlZ21lbnQgaXMgcm91bmQgaWYgaXQgZG9lc24ndCBoYXZlIHN1Y2Nlc3NpdmUgKi8KLSAgICAvKiBvbi1jdXJ2ZSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmb3IgKCBzZWcgPSBzZWdtZW50czsgc2VnIDwgc2VnbWVudF9saW1pdDsgc2VnKysgKQotICAgIHsKLSAgICAgIEFGX1BvaW50ICBwdCAgID0gc2VnLT5maXJzdDsKLSAgICAgIEFGX1BvaW50ICBsYXN0ID0gc2VnLT5sYXN0OwotICAgICAgRlRfVUludCAgIGYwICAgPSBwdC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0w7Ci0gICAgICBGVF9VSW50ICAgZjE7Ci0KLQotICAgICAgc2VnLT5mbGFncyAmPSB+QUZfRURHRV9ST1VORDsKLQotICAgICAgZm9yICggOyBwdCAhPSBsYXN0OyBmMCA9IGYxICkKLSAgICAgIHsKLSAgICAgICAgcHQgPSBwdC0+bmV4dDsKLSAgICAgICAgZjEgPSBwdC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0w7Ci0KLSAgICAgICAgaWYgKCAhZjAgJiYgIWYxICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIHB0ID09IGxhc3QgKQotICAgICAgICAgIHNlZy0+ZmxhZ3MgfD0gQUZfRURHRV9ST1VORDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBhZl9jamtfaGludHNfbGlua19zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgICAgID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50cyAgICAgID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50X2xpbWl0ID0gc2VnbWVudHMgKyBheGlzLT5udW1fc2VnbWVudHM7Ci0gICAgQUZfRGlyZWN0aW9uICBtYWpvcl9kaXIgICAgID0gYXhpcy0+bWFqb3JfZGlyOwotICAgIEFGX1NlZ21lbnQgICAgc2VnMSwgc2VnMjsKLSAgICBGVF9Qb3MgICAgICAgIGxlbl90aHJlc2hvbGQ7Ci0gICAgRlRfUG9zICAgICAgICBkaXN0X3RocmVzaG9sZDsKLQotCi0gICAgbGVuX3RocmVzaG9sZCA9IEFGX0xBVElOX0NPTlNUQU5UKCBoaW50cy0+bWV0cmljcywgOCApOwotCi0gICAgZGlzdF90aHJlc2hvbGQgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApID8gaGludHMtPnhfc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoaW50cy0+eV9zY2FsZTsKLSAgICBkaXN0X3RocmVzaG9sZCA9IEZUX0RpdkZpeCggNjQgKiAzLCBkaXN0X3RocmVzaG9sZCApOwotCi0gICAgLyogbm93IGNvbXBhcmUgZWFjaCBzZWdtZW50IHRvIHRoZSBvdGhlcnMgKi8KLSAgICBmb3IgKCBzZWcxID0gc2VnbWVudHM7IHNlZzEgPCBzZWdtZW50X2xpbWl0OyBzZWcxKysgKQotICAgIHsKLSAgICAgIGlmICggc2VnMS0+ZGlyICE9IG1ham9yX2RpciApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBmb3IgKCBzZWcyID0gc2VnbWVudHM7IHNlZzIgPCBzZWdtZW50X2xpbWl0OyBzZWcyKysgKQotICAgICAgICBpZiAoIHNlZzIgIT0gc2VnMSAmJiBzZWcxLT5kaXIgKyBzZWcyLT5kaXIgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgIGRpc3QgPSBzZWcyLT5wb3MgLSBzZWcxLT5wb3M7Ci0KLQotICAgICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIG1pbiA9IHNlZzEtPm1pbl9jb29yZDsKLSAgICAgICAgICAgIEZUX1BvcyAgbWF4ID0gc2VnMS0+bWF4X2Nvb3JkOwotICAgICAgICAgICAgRlRfUG9zICBsZW47Ci0KLQotICAgICAgICAgICAgaWYgKCBtaW4gPCBzZWcyLT5taW5fY29vcmQgKQotICAgICAgICAgICAgICBtaW4gPSBzZWcyLT5taW5fY29vcmQ7Ci0KLSAgICAgICAgICAgIGlmICggbWF4ID4gc2VnMi0+bWF4X2Nvb3JkICkKLSAgICAgICAgICAgICAgbWF4ID0gc2VnMi0+bWF4X2Nvb3JkOwotCi0gICAgICAgICAgICBsZW4gPSBtYXggLSBtaW47Ci0gICAgICAgICAgICBpZiAoIGxlbiA+PSBsZW5fdGhyZXNob2xkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCBkaXN0ICogOCA8IHNlZzEtPnNjb3JlICogOSAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgKCBkaXN0ICogOCA8IHNlZzEtPnNjb3JlICogNyB8fCBzZWcxLT5sZW4gPCBsZW4gKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWcxLT5zY29yZSA9IGRpc3Q7Ci0gICAgICAgICAgICAgICAgc2VnMS0+bGVuICAgPSBsZW47Ci0gICAgICAgICAgICAgICAgc2VnMS0+bGluayAgPSBzZWcyOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKCBkaXN0ICogOCA8IHNlZzItPnNjb3JlICogOSAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgKCBkaXN0ICogOCA8IHNlZzItPnNjb3JlICogNyB8fCBzZWcyLT5sZW4gPCBsZW4gKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWcyLT5zY29yZSA9IGRpc3Q7Ci0gICAgICAgICAgICAgICAgc2VnMi0+bGVuICAgPSBsZW47Ci0gICAgICAgICAgICAgICAgc2VnMi0+bGluayAgPSBzZWcxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgbm93IGNvbXB1dGUgdGhlIGBzZXJpZicgc2VnbWVudHMKLSAgICAgKgotICAgICAqICBJbiBIYW56aSwgc29tZSBzdHJva2VzIGFyZSB3aWRlciBvbiBvbmUgb3IgYm90aCBvZiB0aGUgZW5kcy4KLSAgICAgKiAgV2UgZWl0aGVyIGlkZW50aWZ5IHRoZSBzdGVtcyBvbiB0aGUgZW5kcyBhcyBzZXJpZnMgb3IgcmVtb3ZlCi0gICAgICogIHRoZSBsaW5rYWdlLCBkZXBlbmRpbmcgb24gdGhlIGxlbmd0aCBvZiB0aGUgc3RlbXMuCi0gICAgICoKLSAgICAgKi8KLQotICAgIHsKLSAgICAgIEFGX1NlZ21lbnQgIGxpbmsxLCBsaW5rMjsKLQotCi0gICAgICBmb3IgKCBzZWcxID0gc2VnbWVudHM7IHNlZzEgPCBzZWdtZW50X2xpbWl0OyBzZWcxKysgKQotICAgICAgewotICAgICAgICBsaW5rMSA9IHNlZzEtPmxpbms7Ci0gICAgICAgIGlmICggIWxpbmsxIHx8IGxpbmsxLT5saW5rICE9IHNlZzEgfHwgbGluazEtPnBvcyA8PSBzZWcxLT5wb3MgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmICggc2VnMS0+c2NvcmUgPj0gZGlzdF90aHJlc2hvbGQgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGZvciAoIHNlZzIgPSBzZWdtZW50czsgc2VnMiA8IHNlZ21lbnRfbGltaXQ7IHNlZzIrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHNlZzItPnBvcyA+IHNlZzEtPnBvcyB8fCBzZWcxID09IHNlZzIgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBsaW5rMiA9IHNlZzItPmxpbms7Ci0gICAgICAgICAgaWYgKCAhbGluazIgfHwgbGluazItPmxpbmsgIT0gc2VnMiB8fCBsaW5rMi0+cG9zIDwgbGluazEtPnBvcyApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGlmICggc2VnMS0+cG9zID09IHNlZzItPnBvcyAmJiBsaW5rMS0+cG9zID09IGxpbmsyLT5wb3MgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBpZiAoIHNlZzItPnNjb3JlIDw9IHNlZzEtPnNjb3JlIHx8IHNlZzEtPnNjb3JlICogNCA8PSBzZWcyLT5zY29yZSApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIC8qIHNlZzIgPCBzZWcxIDwgbGluazEgPCBsaW5rMiAqLwotCi0gICAgICAgICAgaWYgKCBzZWcxLT5sZW4gPj0gc2VnMi0+bGVuICogMyApCi0gICAgICAgICAgewotICAgICAgICAgICAgQUZfU2VnbWVudCAgc2VnOwotCi0KLSAgICAgICAgICAgIGZvciAoIHNlZyA9IHNlZ21lbnRzOyBzZWcgPCBzZWdtZW50X2xpbWl0OyBzZWcrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFGX1NlZ21lbnQgIGxpbmsgPSBzZWctPmxpbms7Ci0KLQotICAgICAgICAgICAgICBpZiAoIGxpbmsgPT0gc2VnMiApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWctPmxpbmsgID0gTlVMTDsKLSAgICAgICAgICAgICAgICBzZWctPnNlcmlmID0gbGluazE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoIGxpbmsgPT0gbGluazIgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VnLT5saW5rICA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgc2VnLT5zZXJpZiA9IHNlZzE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlZzEtPmxpbmsgPSBsaW5rMS0+bGluayA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoIHNlZzEgPSBzZWdtZW50czsgc2VnMSA8IHNlZ21lbnRfbGltaXQ7IHNlZzErKyApCi0gICAgewotICAgICAgc2VnMiA9IHNlZzEtPmxpbms7Ci0KLSAgICAgIGlmICggc2VnMiApCi0gICAgICB7Ci0gICAgICAgIGlmICggc2VnMi0+bGluayAhPSBzZWcxICkKLSAgICAgICAgewotICAgICAgICAgIHNlZzEtPmxpbmsgPSBOVUxMOwotCi0gICAgICAgICAgaWYgKCBzZWcyLT5zY29yZSA8IGRpc3RfdGhyZXNob2xkIHx8IHNlZzEtPnNjb3JlIDwgc2VnMi0+c2NvcmUgKiA0ICkKLSAgICAgICAgICAgIHNlZzEtPnNlcmlmID0gc2VnMi0+bGluazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2Nqa19oaW50c19jb21wdXRlX2VkZ2VzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLSAgICBBRl9DSktBeGlzICAgIGxheGlzICA9ICYoKEFGX0NKS01ldHJpY3MpaGludHMtPm1ldHJpY3MpLT5heGlzW2RpbV07Ci0KLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzICAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRfbGltaXQgPSBzZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIHNlZzsKLQotICAgIEZUX0ZpeGVkICAgICAgc2NhbGU7Ci0gICAgRlRfUG9zICAgICAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZDsKLQotCi0gICAgYXhpcy0+bnVtX2VkZ2VzID0gMDsKLQotICAgIHNjYWxlID0gKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKSA/IGhpbnRzLT54X3NjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaGludHMtPnlfc2NhbGU7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2UgYmVnaW4gYnkgZ2VuZXJhdGluZyBhIHNvcnRlZCB0YWJsZSBvZiBlZGdlcyBmb3IgdGhlIGN1cnJlbnQgICAgKi8KLSAgICAvKiBkaXJlY3Rpb24uICBUbyBkbyBzbywgd2Ugc2ltcGx5IHNjYW4gZWFjaCBzZWdtZW50IGFuZCB0cnkgdG8gZmluZCAqLwotICAgIC8qIGFuIGVkZ2UgaW4gb3VyIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXRzIHBvc2l0aW9uLiAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBJZiBubyBlZGdlIGlzIGZvdW5kLCB3ZSBjcmVhdGUgYW5kIGluc2VydCBhIG5ldyBlZGdlIGluIHRoZSAgICAgICAqLwotICAgIC8qIHNvcnRlZCB0YWJsZS4gIE90aGVyd2lzZSwgd2Ugc2ltcGx5IGFkZCB0aGUgc2VnbWVudCB0byB0aGUgZWRnZSdzICovCi0gICAgLyogbGlzdCB3aGljaCBpcyB0aGVuIHByb2Nlc3NlZCBpbiB0aGUgc2Vjb25kIHN0ZXAgdG8gY29tcHV0ZSB0aGUgICAgKi8KLSAgICAvKiBlZGdlJ3MgcHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogTm90ZSB0aGF0IHRoZSBlZGdlcyB0YWJsZSBpcyBzb3J0ZWQgYWxvbmcgdGhlIHNlZ21lbnQvZWRnZSAgICAgICAgKi8KLSAgICAvKiBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gRlRfTXVsRml4KCBsYXhpcy0+ZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlICk7Ci0gICAgaWYgKCBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA+IDY0IC8gNCApCi0gICAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA9IEZUX0RpdkZpeCggNjQgLyA0LCBzY2FsZSApOwotICAgIGVsc2UKLSAgICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gbGF4aXMtPmVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkOwotCi0gICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICB7Ci0gICAgICBBRl9FZGdlICBmb3VuZCA9IE5VTEw7Ci0gICAgICBGVF9Qb3MgICBiZXN0ICA9IDB4RkZGRlU7Ci0gICAgICBGVF9JbnQgICBlZTsKLQotCi0gICAgICAvKiBsb29rIGZvciBhbiBlZGdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlZ21lbnQgKi8KLSAgICAgIGZvciAoIGVlID0gMDsgZWUgPCBheGlzLT5udW1fZWRnZXM7IGVlKysgKQotICAgICAgewotICAgICAgICBBRl9FZGdlICBlZGdlID0gYXhpcy0+ZWRnZXMgKyBlZTsKLSAgICAgICAgRlRfUG9zICAgZGlzdDsKLQotCi0gICAgICAgIGlmICggZWRnZS0+ZGlyICE9IHNlZy0+ZGlyICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBkaXN0ID0gc2VnLT5wb3MgLSBlZGdlLT5mcG9zOwotICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgaWYgKCBkaXN0IDwgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgJiYgZGlzdCA8IGJlc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgQUZfU2VnbWVudCAgbGluayA9IHNlZy0+bGluazsKLQotCi0gICAgICAgICAgLyogY2hlY2sgd2hldGhlciBhbGwgbGlua2VkIHNlZ21lbnRzIG9mIHRoZSBjYW5kaWRhdGUgZWRnZSAqLwotICAgICAgICAgIC8qIGNhbiBtYWtlIGEgc2luZ2xlIGVkZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGxpbmsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFGX1NlZ21lbnQgIHNlZzEgID0gZWRnZS0+Zmlyc3Q7Ci0gICAgICAgICAgICBGVF9Qb3MgICAgICBkaXN0MiA9IDA7Ci0KLQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQUZfU2VnbWVudCAgbGluazEgPSBzZWcxLT5saW5rOwotCi0KLSAgICAgICAgICAgICAgaWYgKCBsaW5rMSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaXN0MiA9IEFGX1NFR01FTlRfRElTVCggbGluaywgbGluazEgKTsKLSAgICAgICAgICAgICAgICBpZiAoIGRpc3QyID49IGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkICkKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gd2hpbGUgKCAoIHNlZzEgPSBzZWcxLT5lZGdlX25leHQgKSAhPSBlZGdlLT5maXJzdCApOwotCi0gICAgICAgICAgICBpZiAoIGRpc3QyID49IGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkICkKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYmVzdCAgPSBkaXN0OwotICAgICAgICAgIGZvdW5kID0gZWRnZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoICFmb3VuZCApCi0gICAgICB7Ci0gICAgICAgIEFGX0VkZ2UgIGVkZ2U7Ci0KLQotICAgICAgICAvKiBpbnNlcnQgYSBuZXcgZWRnZSBpbiB0aGUgbGlzdCBhbmQgKi8KLSAgICAgICAgLyogc29ydCBhY2NvcmRpbmcgdG8gdGhlIHBvc2l0aW9uICAgICovCi0gICAgICAgIGVycm9yID0gYWZfYXhpc19oaW50c19uZXdfZWRnZSggYXhpcywgc2VnLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0RpcmVjdGlvbilzZWctPmRpciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksICZlZGdlICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIG5ldyBlZGdlJ3MgbGlzdCAqLwotICAgICAgICBGVF9aRVJPKCBlZGdlICk7Ci0KLSAgICAgICAgZWRnZS0+Zmlyc3QgICAgPSBzZWc7Ci0gICAgICAgIGVkZ2UtPmxhc3QgICAgID0gc2VnOwotICAgICAgICBlZGdlLT5kaXIgICAgICA9IHNlZy0+ZGlyOwotICAgICAgICBlZGdlLT5mcG9zICAgICA9IHNlZy0+cG9zOwotICAgICAgICBlZGdlLT5vcG9zICAgICA9IEZUX011bEZpeCggc2VnLT5wb3MsIHNjYWxlICk7Ci0gICAgICAgIGVkZ2UtPnBvcyAgICAgID0gZWRnZS0+b3BvczsKLSAgICAgICAgc2VnLT5lZGdlX25leHQgPSBzZWc7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIGFuIGVkZ2Ugd2FzIGZvdW5kLCBzaW1wbHkgYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBlZGdlJ3MgKi8KLSAgICAgICAgLyogbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBzZWctPmVkZ2VfbmV4dCAgICAgICAgID0gZm91bmQtPmZpcnN0OwotICAgICAgICBmb3VuZC0+bGFzdC0+ZWRnZV9uZXh0ID0gc2VnOwotICAgICAgICBmb3VuZC0+bGFzdCAgICAgICAgICAgID0gc2VnOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBHb29kLCB3ZSBub3cgY29tcHV0ZSBlYWNoIGVkZ2UncyBwcm9wZXJ0aWVzIGFjY29yZGluZyB0byB0aGUgICAqLwotICAgIC8qIHNlZ21lbnRzIGZvdW5kIG9uIGl0cyBwb3NpdGlvbi4gIEJhc2ljYWxseSwgdGhlc2UgYXJlICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgLSB0aGUgZWRnZSdzIG1haW4gZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAtIHN0ZW0gZWRnZSwgc2VyaWYgZWRnZSBvciBib3RoICh3aGljaCBkZWZhdWx0cyB0byBzdGVtIHRoZW4pICovCi0gICAgLyogIC0gcm91bmRlZCBlZGdlLCBzdHJhaWdodCBvciBib3RoICh3aGljaCBkZWZhdWx0cyB0byBzdHJhaWdodCkgKi8KLSAgICAvKiAgLSBsaW5rIGZvciBlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIGZpcnN0IG9mIGFsbCwgc2V0IHRoZSBgZWRnZScgZmllbGQgaW4gZWFjaCBzZWdtZW50IC0tIHRoaXMgaXMgKi8KLSAgICAvKiByZXF1aXJlZCBpbiBvcmRlciB0byBjb21wdXRlIGVkZ2UgbGlua3MgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKgotICAgICAqIE5vdGUgdGhhdCByZW1vdmluZyB0aGlzIGxvb3AgYW5kIHNldHRpbmcgdGhlIGBlZGdlJyBmaWVsZCBvZiBlYWNoCi0gICAgICogc2VnbWVudCBkaXJlY3RseSBpbiB0aGUgY29kZSBhYm92ZSBzbG93cyBkb3duIGV4ZWN1dGlvbiBzcGVlZCBmb3IKLSAgICAgKiBzb21lIHJlYXNvbnMgb24gcGxhdGZvcm1zIGxpa2UgdGhlIFN1bi4KLSAgICAgKi8KLSAgICB7Ci0gICAgICBBRl9FZGdlICBlZGdlcyAgICAgID0gYXhpcy0+ZWRnZXM7Ci0gICAgICBBRl9FZGdlICBlZGdlX2xpbWl0ID0gZWRnZXMgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgICBBRl9FZGdlICBlZGdlOwotCi0KLSAgICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgICB7Ci0gICAgICAgIHNlZyA9IGVkZ2UtPmZpcnN0OwotICAgICAgICBpZiAoIHNlZyApCi0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWctPmVkZ2UgPSBlZGdlOwotICAgICAgICAgICAgc2VnICAgICAgID0gc2VnLT5lZGdlX25leHQ7Ci0KLSAgICAgICAgICB9IHdoaWxlICggc2VnICE9IGVkZ2UtPmZpcnN0ICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBjb21wdXRlIGVhY2ggZWRnZSBwcm9wZXJ0aWVzICovCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGlzX3JvdW5kICAgID0gMDsgIC8qIGRvZXMgaXQgY29udGFpbiByb3VuZCBzZWdtZW50cz8gICAgKi8KLSAgICAgICAgRlRfSW50ICBpc19zdHJhaWdodCA9IDA7ICAvKiBkb2VzIGl0IGNvbnRhaW4gc3RyYWlnaHQgc2VnbWVudHM/ICovCi0KLQotICAgICAgICBzZWcgPSBlZGdlLT5maXJzdDsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgRlRfQm9vbCAgaXNfc2VyaWY7Ci0KLQotICAgICAgICAgIC8qIGNoZWNrIGZvciByb3VuZG5lc3Mgb2Ygc2VnbWVudCAqLwotICAgICAgICAgIGlmICggc2VnLT5mbGFncyAmIEFGX0VER0VfUk9VTkQgKQotICAgICAgICAgICAgaXNfcm91bmQrKzsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBpc19zdHJhaWdodCsrOwotCi0gICAgICAgICAgLyogY2hlY2sgZm9yIGxpbmtzIC0tIGlmIHNlZy0+c2VyaWYgaXMgc2V0LCB0aGVuIHNlZy0+bGluayBtdXN0ICovCi0gICAgICAgICAgLyogYmUgaWdub3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaXNfc2VyaWYgPSAoRlRfQm9vbCkoIHNlZy0+c2VyaWYgJiYgc2VnLT5zZXJpZi0+ZWRnZSAhPSBlZGdlICk7Ci0KLSAgICAgICAgICBpZiAoIHNlZy0+bGluayB8fCBpc19zZXJpZiApCi0gICAgICAgICAgewotICAgICAgICAgICAgQUZfRWRnZSAgICAgZWRnZTI7Ci0gICAgICAgICAgICBBRl9TZWdtZW50ICBzZWcyOwotCi0KLSAgICAgICAgICAgIGVkZ2UyID0gZWRnZS0+bGluazsKLSAgICAgICAgICAgIHNlZzIgID0gc2VnLT5saW5rOwotCi0gICAgICAgICAgICBpZiAoIGlzX3NlcmlmICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VnMiAgPSBzZWctPnNlcmlmOwotICAgICAgICAgICAgICBlZGdlMiA9IGVkZ2UtPnNlcmlmOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGVkZ2UyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfUG9zICBlZGdlX2RlbHRhOwotICAgICAgICAgICAgICBGVF9Qb3MgIHNlZ19kZWx0YTsKLQotCi0gICAgICAgICAgICAgIGVkZ2VfZGVsdGEgPSBlZGdlLT5mcG9zIC0gZWRnZTItPmZwb3M7Ci0gICAgICAgICAgICAgIGlmICggZWRnZV9kZWx0YSA8IDAgKQotICAgICAgICAgICAgICAgIGVkZ2VfZGVsdGEgPSAtZWRnZV9kZWx0YTsKLQotICAgICAgICAgICAgICBzZWdfZGVsdGEgPSBBRl9TRUdNRU5UX0RJU1QoIHNlZywgc2VnMiApOwotCi0gICAgICAgICAgICAgIGlmICggc2VnX2RlbHRhIDwgZWRnZV9kZWx0YSApCi0gICAgICAgICAgICAgICAgZWRnZTIgPSBzZWcyLT5lZGdlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlZGdlMiA9IHNlZzItPmVkZ2U7Ci0KLSAgICAgICAgICAgIGlmICggaXNfc2VyaWYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGdlLT5zZXJpZiAgID0gZWRnZTI7Ci0gICAgICAgICAgICAgIGVkZ2UyLT5mbGFncyB8PSBBRl9FREdFX1NFUklGOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlZGdlLT5saW5rICA9IGVkZ2UyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHNlZyA9IHNlZy0+ZWRnZV9uZXh0OwotCi0gICAgICAgIH0gd2hpbGUgKCBzZWcgIT0gZWRnZS0+Zmlyc3QgKTsKLQotICAgICAgICAvKiBzZXQgdGhlIHJvdW5kL3N0cmFpZ2h0IGZsYWdzICovCi0gICAgICAgIGVkZ2UtPmZsYWdzID0gQUZfRURHRV9OT1JNQUw7Ci0KLSAgICAgICAgaWYgKCBpc19yb3VuZCA+IDAgJiYgaXNfcm91bmQgPj0gaXNfc3RyYWlnaHQgKQotICAgICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfUk9VTkQ7Ci0KLSAgICAgICAgLyogZ2V0IHJpZCBvZiBzZXJpZnMgaWYgbGluayBpcyBzZXQgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFhYWDogVGhpcyBnZXRzIHJpZCBvZiBtYW55IHVucGxlYXNhbnQgYXJ0ZWZhY3RzISAqLwotICAgICAgICAvKiAgICAgIEV4YW1wbGU6IHRoZSBgYycgaW4gY291ci5wZmEgYXQgc2l6ZSAxMyAgICAgKi8KLQotICAgICAgICBpZiAoIGVkZ2UtPnNlcmlmICYmIGVkZ2UtPmxpbmsgKQotICAgICAgICAgIGVkZ2UtPnNlcmlmID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIERldGVjdCBzZWdtZW50cyBhbmQgZWRnZXMgZm9yIGdpdmVuIGRpbWVuc2lvbi4gKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZfY2prX2hpbnRzX2RldGVjdF9mZWF0dXJlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gYWZfY2prX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMoIGhpbnRzLCBkaW0gKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgYWZfY2prX2hpbnRzX2xpbmtfc2VnbWVudHMoIGhpbnRzLCBkaW0gKTsKLQotICAgICAgZXJyb3IgPSBhZl9jamtfaGludHNfY29tcHV0ZV9lZGdlcyggaGludHMsIGRpbSApOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIENvbXB1dGUgYWxsIGVkZ2VzIHdoaWNoIGxpZSB3aXRoaW4gYmx1ZSB6b25lcy4gKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl9jamtfaGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQ0pLTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZSAgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZV9saW1pdCA9IGVkZ2UgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgQUZfQ0pLQXhpcyAgICBjamsgICAgICAgID0gJm1ldHJpY3MtPmF4aXNbZGltXTsKLSAgICBGVF9GaXhlZCAgICAgIHNjYWxlICAgICAgPSBjamstPnNjYWxlOwotICAgIEZUX1BvcyAgICAgICAgYmVzdF9kaXN0MDsgIC8qIGluaXRpYWwgdGhyZXNob2xkICovCi0KLQotICAgIC8qIGNvbXB1dGUgdGhlIGluaXRpYWwgdGhyZXNob2xkIGFzIGEgZnJhY3Rpb24gb2YgdGhlIEVNIHNpemUgKi8KLSAgICBiZXN0X2Rpc3QwID0gRlRfTXVsRml4KCBtZXRyaWNzLT51bml0c19wZXJfZW0gLyA0MCwgc2NhbGUgKTsKLQotICAgIGlmICggYmVzdF9kaXN0MCA+IDY0IC8gMiApIC8qIG1heGltdW0gMS8yIHBpeGVsICovCi0gICAgICBiZXN0X2Rpc3QwID0gNjQgLyAyOwotCi0gICAgLyogY29tcHV0ZSB3aGljaCBibHVlIHpvbmVzIGFyZSBhY3RpdmUsIGkuZS4gaGF2ZSB0aGVpciBzY2FsZWQgKi8KLSAgICAvKiBzaXplIDwgMy80IHBpeGVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogSWYgdGhlIGRpc3RhbnQgYmV0d2VlbiBhbiBlZGdlIGFuZCBhIGJsdWUgem9uZSBpcyBzaG9ydGVyIHRoYW4gKi8KLSAgICAvKiBiZXN0X2Rpc3QwLCBzZXQgdGhlIGJsdWUgem9uZSBmb3IgdGhlIGVkZ2UuICBUaGVuIHNlYXJjaCBmb3IgICAqLwotICAgIC8qIHRoZSBibHVlIHpvbmUgd2l0aCB0aGUgc21hbGxlc3QgYmVzdF9kaXN0IHRvIHRoZSBlZGdlLiAgICAgICAgICovCi0KLSAgICBmb3IgKCA7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICBiYjsKLSAgICAgIEFGX1dpZHRoICBiZXN0X2JsdWUgPSBOVUxMOwotICAgICAgRlRfUG9zICAgIGJlc3RfZGlzdCA9IGJlc3RfZGlzdDA7Ci0KLQotICAgICAgZm9yICggYmIgPSAwOyBiYiA8IGNqay0+Ymx1ZV9jb3VudDsgYmIrKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0NKS0JsdWUgIGJsdWUgPSBjamstPmJsdWVzICsgYmI7Ci0gICAgICAgIEZUX0Jvb2wgICAgIGlzX3RvcF9yaWdodF9ibHVlLCBpc19tYWpvcl9kaXI7Ci0KLQotICAgICAgICAvKiBza2lwIGluYWN0aXZlIGJsdWUgem9uZXMgKGkuZS4sIHRob3NlIHRoYXQgYXJlIHRvbyBzbWFsbCkgKi8KLSAgICAgICAgaWYgKCAhKCBibHVlLT5mbGFncyAmIEFGX0NKS19CTFVFX0FDVElWRSApICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBpZiBpdCBpcyBhIHRvcCB6b25lLCBjaGVjayBmb3IgcmlnaHQgZWRnZXMgLS0gaWYgaXQgaXMgYSBib3R0b20gKi8KLSAgICAgICAgLyogem9uZSwgY2hlY2sgZm9yIGxlZnQgZWRnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBvZiBjb3Vyc2UsIHRoYXQncyBmb3IgVHJ1ZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaXNfdG9wX3JpZ2h0X2JsdWUgPQotICAgICAgICAgIChGVF9CeXRlKSggKCBibHVlLT5mbGFncyAmIEFGX0NKS19CTFVFX1RPUCApICE9IDAgKTsKLSAgICAgICAgaXNfbWFqb3JfZGlyID0KLSAgICAgICAgICBGVF9CT09MKCBlZGdlLT5kaXIgPT0gYXhpcy0+bWFqb3JfZGlyICk7Ci0KLSAgICAgICAgLyogaWYgaXQgaXMgYSB0b3Agem9uZSwgdGhlIGVkZ2UgbXVzdCBiZSBhZ2FpbnN0IHRoZSBtYWpvciAgICAqLwotICAgICAgICAvKiBkaXJlY3Rpb247IGlmIGl0IGlzIGEgYm90dG9tIHpvbmUsIGl0IG11c3QgYmUgaW4gdGhlIG1ham9yICovCi0gICAgICAgIC8qIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBpc190b3BfcmlnaHRfYmx1ZSBeIGlzX21ham9yX2RpciApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgICAgZGlzdDsKLSAgICAgICAgICBBRl9XaWR0aCAgY29tcGFyZTsKLQotCi0gICAgICAgICAgLyogQ29tcGFyZSB0aGUgZWRnZSB0byB0aGUgY2xvc2VzdCBibHVlIHpvbmUgdHlwZSAqLwotICAgICAgICAgIGlmICggRlRfQUJTKCBlZGdlLT5mcG9zIC0gYmx1ZS0+cmVmLm9yZyApID4KLSAgICAgICAgICAgICAgIEZUX0FCUyggZWRnZS0+ZnBvcyAtIGJsdWUtPnNob290Lm9yZyApICkKLSAgICAgICAgICAgIGNvbXBhcmUgPSAmYmx1ZS0+c2hvb3Q7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29tcGFyZSA9ICZibHVlLT5yZWY7Ci0KLSAgICAgICAgICBkaXN0ID0gZWRnZS0+ZnBvcyAtIGNvbXBhcmUtPm9yZzsKLSAgICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICAgIGRpc3QgPSBGVF9NdWxGaXgoIGRpc3QsIHNjYWxlICk7Ci0gICAgICAgICAgaWYgKCBkaXN0IDwgYmVzdF9kaXN0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiZXN0X2Rpc3QgPSBkaXN0OwotICAgICAgICAgICAgYmVzdF9ibHVlID0gY29tcGFyZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBiZXN0X2JsdWUgKQotICAgICAgICBlZGdlLT5ibHVlX2VkZ2UgPSBiZXN0X2JsdWU7Ci0gICAgfQotICB9Ci0KLQotICAvKiBJbml0YWxpemUgaGludGluZyBlbmdpbmUuICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2Nqa19oaW50c19pbml0KCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgRlRfUmVuZGVyX01vZGUgIG1vZGU7Ci0gICAgRlRfVUludDMyICAgICAgIHNjYWxlcl9mbGFncywgb3RoZXJfZmxhZ3M7Ci0KLQotICAgIGFmX2dseXBoX2hpbnRzX3Jlc2NhbGUoIGhpbnRzLCAoQUZfU3R5bGVNZXRyaWNzKW1ldHJpY3MgKTsKLQotICAgIC8qCi0gICAgICogIGNvcnJlY3QgeF9zY2FsZSBhbmQgeV9zY2FsZSB3aGVuIG5lZWRlZCwgc2luY2UgdGhleSBtYXkgaGF2ZQotICAgICAqICBiZWVuIG1vZGlmaWVkIGFmX2Nqa19zY2FsZV9kaW0gYWJvdmUKLSAgICAgKi8KLSAgICBoaW50cy0+eF9zY2FsZSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdLnNjYWxlOwotICAgIGhpbnRzLT54X2RlbHRhID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uZGVsdGE7Ci0gICAgaGludHMtPnlfc2NhbGUgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXS5zY2FsZTsKLSAgICBoaW50cy0+eV9kZWx0YSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdLmRlbHRhOwotCi0gICAgLyogY29tcHV0ZSBmbGFncyBkZXBlbmRpbmcgb24gcmVuZGVyIG1vZGUsIGV0Yy4gKi8KLSAgICBtb2RlID0gbWV0cmljcy0+cm9vdC5zY2FsZXIucmVuZGVyX21vZGU7Ci0KLSNpZiAwIC8qIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUiAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCi0gICAgICBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZSA9IG1vZGUgPSBGVF9SRU5ERVJfTU9ERV9OT1JNQUw7Ci0jZW5kaWYKLQotICAgIHNjYWxlcl9mbGFncyA9IGhpbnRzLT5zY2FsZXJfZmxhZ3M7Ci0gICAgb3RoZXJfZmxhZ3MgID0gMDsKLQotICAgIC8qCi0gICAgICogIFdlIHNuYXAgdGhlIHdpZHRoIG9mIHZlcnRpY2FsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgaG9yaXpvbnRhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19IT1JaX1NOQVA7Ci0KLSAgICAvKgotICAgICAqICBXZSBzbmFwIHRoZSB3aWR0aCBvZiBob3Jpem9udGFsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgdmVydGljYWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCi0gICAgICovCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19WRVJUX1NOQVA7Ci0KLSAgICAvKgotICAgICAqICBXZSBhZGp1c3Qgc3RlbXMgdG8gZnVsbCBwaXhlbHMgdW5sZXNzIGluIGBsaWdodCcgb3IgYGxjZCcgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgJiYgbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MQ0QgKQotICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfU1RFTV9BREpVU1Q7Ci0KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19NT05POwotCi0gICAgc2NhbGVyX2ZsYWdzIHw9IEFGX1NDQUxFUl9GTEFHX05PX0FEVkFOQ0U7Ci0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLSAgICAvKiBnZXQgKGdsb2JhbCkgd2FycGVyIGZsYWcgKi8KLSAgICBpZiAoICFtZXRyaWNzLT5yb290Lmdsb2JhbHMtPm1vZHVsZS0+d2FycGluZyApCi0gICAgICBzY2FsZXJfZmxhZ3MgfD0gQUZfU0NBTEVSX0ZMQUdfTk9fV0FSUEVSOwotI2VuZGlmCi0KLSAgICBoaW50cy0+c2NhbGVyX2ZsYWdzID0gc2NhbGVyX2ZsYWdzOwotICAgIGhpbnRzLT5vdGhlcl9mbGFncyAgPSBvdGhlcl9mbGFnczsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICBDIEogSyAgIEcgTCBZIFAgSCAgIEcgUiBJIEQgLSBGIEkgVCBUIEkgTiBHICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIFNuYXAgYSBnaXZlbiB3aWR0aCBpbiBzY2FsZWQgY29vcmRpbmF0ZXMgdG8gb25lIG9mIHRoZSAqLwotICAvKiBjdXJyZW50IHN0YW5kYXJkIHdpZHRocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgRlRfUG9zCi0gIGFmX2Nqa19zbmFwX3dpZHRoKCBBRl9XaWR0aCAgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgIHdpZHRoICkKLSAgewotICAgIEZUX1VJbnQgIG47Ci0gICAgRlRfUG9zICAgYmVzdCAgICAgID0gNjQgKyAzMiArIDI7Ci0gICAgRlRfUG9zICAgcmVmZXJlbmNlID0gd2lkdGg7Ci0gICAgRlRfUG9zICAgc2NhbGVkOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgdzsKLSAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICB3ID0gd2lkdGhzW25dLmN1cjsKLSAgICAgIGRpc3QgPSB3aWR0aCAtIHc7Ci0gICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgZGlzdCA9IC1kaXN0OwotICAgICAgaWYgKCBkaXN0IDwgYmVzdCApCi0gICAgICB7Ci0gICAgICAgIGJlc3QgICAgICA9IGRpc3Q7Ci0gICAgICAgIHJlZmVyZW5jZSA9IHc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc2NhbGVkID0gRlRfUElYX1JPVU5EKCByZWZlcmVuY2UgKTsKLQotICAgIGlmICggd2lkdGggPj0gcmVmZXJlbmNlICkKLSAgICB7Ci0gICAgICBpZiAoIHdpZHRoIDwgc2NhbGVkICsgNDggKQotICAgICAgICB3aWR0aCA9IHJlZmVyZW5jZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggd2lkdGggPiBzY2FsZWQgLSA0OCApCi0gICAgICAgIHdpZHRoID0gcmVmZXJlbmNlOwotICAgIH0KLQotICAgIHJldHVybiB3aWR0aDsKLSAgfQotCi0KLSAgLyogQ29tcHV0ZSB0aGUgc25hcHBlZCB3aWR0aCBvZiBhIGdpdmVuIHN0ZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBpcyBhIGxvdCBvZiB2b29kb28gaW4gdGhpcyBmdW5jdGlvbjsgY2hhbmdpbmcgdGhlIGhhcmQtY29kZWQgICovCi0gIC8qIHBhcmFtZXRlcnMgaW5mbHVlbmNlIHRoZSB3aG9sZSBoaW50aW5nIHByb2Nlc3MuICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgRlRfUG9zCi0gIGFmX2Nqa19jb21wdXRlX3N0ZW1fd2lkdGgoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBiYXNlX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBzdGVtX2ZsYWdzICkKLSAgewotICAgIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MgID0gKEFGX0NKS01ldHJpY3MpaGludHMtPm1ldHJpY3M7Ci0gICAgQUZfQ0pLQXhpcyAgICAgYXhpcyAgICAgPSAmbWV0cmljcy0+YXhpc1tkaW1dOwotICAgIEZUX1BvcyAgICAgICAgIGRpc3QgICAgID0gd2lkdGg7Ci0gICAgRlRfSW50ICAgICAgICAgc2lnbiAgICAgPSAwOwotICAgIEZUX0Jvb2wgICAgICAgIHZlcnRpY2FsID0gRlRfQk9PTCggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICk7Ci0KLSAgICBGVF9VTlVTRUQoIGJhc2VfZmxhZ3MgKTsKLSAgICBGVF9VTlVTRUQoIHN0ZW1fZmxhZ3MgKTsKLQotCi0gICAgaWYgKCAhQUZfTEFUSU5fSElOVFNfRE9fU1RFTV9BREpVU1QoIGhpbnRzICkgKQotICAgICAgcmV0dXJuIHdpZHRoOwotCi0gICAgaWYgKCBkaXN0IDwgMCApCi0gICAgewotICAgICAgZGlzdCA9IC13aWR0aDsKLSAgICAgIHNpZ24gPSAxOwotICAgIH0KLQotICAgIGlmICggKCAgdmVydGljYWwgJiYgIUFGX0xBVElOX0hJTlRTX0RPX1ZFUlRfU05BUCggaGludHMgKSApIHx8Ci0gICAgICAgICAoICF2ZXJ0aWNhbCAmJiAhQUZfTEFUSU5fSElOVFNfRE9fSE9SWl9TTkFQKCBoaW50cyApICkgKQotICAgIHsKLSAgICAgIC8qIHNtb290aCBoaW50aW5nIHByb2Nlc3M6IHZlcnkgbGlnaHRseSBxdWFudGl6ZSB0aGUgc3RlbSB3aWR0aCAqLwotCi0gICAgICBpZiAoIGF4aXMtPndpZHRoX2NvdW50ID4gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfQUJTKCBkaXN0IC0gYXhpcy0+d2lkdGhzWzBdLmN1ciApIDwgNDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZGlzdCA9IGF4aXMtPndpZHRoc1swXS5jdXI7Ci0gICAgICAgICAgaWYgKCBkaXN0IDwgNDggKQotICAgICAgICAgICAgZGlzdCA9IDQ4OwotCi0gICAgICAgICAgZ290byBEb25lX1dpZHRoOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZGlzdCA8IDU0ICkKLSAgICAgICAgZGlzdCArPSAoIDU0IC0gZGlzdCApIC8gMjsKLSAgICAgIGVsc2UgaWYgKCBkaXN0IDwgMyAqIDY0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkZWx0YTsKLQotCi0gICAgICAgIGRlbHRhICA9IGRpc3QgJiA2MzsKLSAgICAgICAgZGlzdCAgJj0gLTY0OwotCi0gICAgICAgIGlmICggZGVsdGEgPCAxMCApCi0gICAgICAgICAgZGlzdCArPSBkZWx0YTsKLSAgICAgICAgZWxzZSBpZiAoIGRlbHRhIDwgMjIgKQotICAgICAgICAgIGRpc3QgKz0gMTA7Ci0gICAgICAgIGVsc2UgaWYgKCBkZWx0YSA8IDQyICkKLSAgICAgICAgICBkaXN0ICs9IGRlbHRhOwotICAgICAgICBlbHNlIGlmICggZGVsdGEgPCA1NCApCi0gICAgICAgICAgZGlzdCArPSA1NDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpc3QgKz0gZGVsdGE7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBzdHJvbmcgaGludGluZyBwcm9jZXNzOiBzbmFwIHRoZSBzdGVtIHdpZHRoIHRvIGludGVnZXIgcGl4ZWxzICovCi0KLSAgICAgIGRpc3QgPSBhZl9jamtfc25hcF93aWR0aCggYXhpcy0+d2lkdGhzLCBheGlzLT53aWR0aF9jb3VudCwgZGlzdCApOwotCi0gICAgICBpZiAoIHZlcnRpY2FsICkKLSAgICAgIHsKLSAgICAgICAgLyogaW4gdGhlIGNhc2Ugb2YgdmVydGljYWwgaGludGluZywgYWx3YXlzIHJvdW5kICovCi0gICAgICAgIC8qIHRoZSBzdGVtIGhlaWdodHMgdG8gaW50ZWdlciBwaXhlbHMgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggZGlzdCA+PSA2NCApCi0gICAgICAgICAgZGlzdCA9ICggZGlzdCArIDE2ICkgJiB+NjM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXN0ID0gNjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggQUZfTEFUSU5fSElOVFNfRE9fTU9OTyggaGludHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtb25vY2hyb21lIGhvcml6b250YWwgaGludGluZzogc25hcCB3aWR0aHMgdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICAgICAgICAvKiB3aXRoIGEgZGlmZmVyZW50IHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDY0ICkKLSAgICAgICAgICAgIGRpc3QgPSA2NDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBmb3IgaG9yaXpvbnRhbCBhbnRpLWFsaWFzZWQgaGludGluZywgd2UgYWRvcHQgYSBtb3JlIHN1YnRsZSAqLwotICAgICAgICAgIC8qIGFwcHJvYWNoOiB3ZSBzdHJlbmd0aGVuIHNtYWxsIHN0ZW1zLCByb3VuZCBzdGVtcyB3aG9zZSBzaXplICovCi0gICAgICAgICAgLyogaXMgYmV0d2VlbiAxIGFuZCAyIHBpeGVscyB0byBhbiBpbnRlZ2VyLCBvdGhlcndpc2Ugbm90aGluZyAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyA2NCApID4+IDE7Ci0KLSAgICAgICAgICBlbHNlIGlmICggZGlzdCA8IDEyOCApCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMjIgKSAmIH42MzsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAvKiByb3VuZCBvdGhlcndpc2UgdG8gcHJldmVudCBjb2xvciBmcmluZ2VzIGluIExDRCBtb2RlICovCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBEb25lX1dpZHRoOgotICAgIGlmICggc2lnbiApCi0gICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICByZXR1cm4gZGlzdDsKLSAgfQotCi0KLSAgLyogQWxpZ24gb25lIHN0ZW0gZWRnZSByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgc3RlbSBlZGdlLiAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX2Nqa19hbGlnbl9saW5rZWRfZWRnZSggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIGJhc2VfZWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlICAgICAgICBzdGVtX2VkZ2UgKQotICB7Ci0gICAgRlRfUG9zICBkaXN0ID0gc3RlbV9lZGdlLT5vcG9zIC0gYmFzZV9lZGdlLT5vcG9zOwotCi0gICAgRlRfUG9zICBmaXR0ZWRfd2lkdGggPSBhZl9jamtfY29tcHV0ZV9zdGVtX3dpZHRoKCBoaW50cywgZGltLCBkaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9lZGdlLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW1fZWRnZS0+ZmxhZ3MgKTsKLQotCi0gICAgc3RlbV9lZGdlLT5wb3MgPSBiYXNlX2VkZ2UtPnBvcyArIGZpdHRlZF93aWR0aDsKLQotICAgIEZUX1RSQUNFNSgoICIgIENKS0xJTks6IGVkZ2UgJWQgQCVkIChvcG9zPSUuMmYpIGxpbmtlZCB0byAlLjJmLCIKLSAgICAgICAgICAgICAgICAiIGRpc3Qgd2FzICUuMmYsIG5vdyAlLjJmXG4iLAotICAgICAgICAgICAgICAgIHN0ZW1fZWRnZSAtIGhpbnRzLT5heGlzW2RpbV0uZWRnZXMsIHN0ZW1fZWRnZS0+ZnBvcywKLSAgICAgICAgICAgICAgICBzdGVtX2VkZ2UtPm9wb3MgLyA2NC4wLCBzdGVtX2VkZ2UtPnBvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgZGlzdCAvIDY0LjAsIGZpdHRlZF93aWR0aCAvIDY0LjAgKSk7Ci0gIH0KLQotCi0gIC8qIFNoaWZ0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgYHNlcmlmJyBlZGdlIGJ5IHRoZSBzYW1lIGFtb3VudCAqLwotICAvKiBhcyB0aGUgY29ycmVzcG9uZGluZyBgYmFzZScgZWRnZSBoYXMgYmVlbiBtb3ZlZCBhbHJlYWR5LiAgICAgKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl9jamtfYWxpZ25fc2VyaWZfZWRnZSggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgc2VyaWYgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBoaW50cyApOwotCi0gICAgc2VyaWYtPnBvcyA9IGJhc2UtPnBvcyArICggc2VyaWYtPm9wb3MgLSBiYXNlLT5vcG9zICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgRSBEIEcgRSAgIEggSSBOIFQgSSBOIEcgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBBRl9MSUdIVF9NT0RFX01BWF9IT1JaX0dBUCAgICA5Ci0jZGVmaW5lIEFGX0xJR0hUX01PREVfTUFYX1ZFUlRfR0FQICAgMTUKLSNkZWZpbmUgQUZfTElHSFRfTU9ERV9NQVhfREVMVEFfQUJTICAxNAotCi0KLSAgc3RhdGljIEZUX1BvcwotICBhZl9oaW50X25vcm1hbF9zdGVtKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgZWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgZWRnZTIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgIGFuY2hvciwKLSAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEZUX1BvcyAgb3JnX2xlbiwgY3VyX2xlbiwgb3JnX2NlbnRlcjsKLSAgICBGVF9Qb3MgIGN1cl9wb3MxLCBjdXJfcG9zMjsKLSAgICBGVF9Qb3MgIGRfb2ZmMSwgdV9vZmYxLCBkX29mZjIsIHVfb2ZmMiwgZGVsdGE7Ci0gICAgRlRfUG9zICBvZmZzZXQ7Ci0gICAgRlRfUG9zICB0aHJlc2hvbGQgPSA2NDsKLQotCi0gICAgaWYgKCAhQUZfTEFUSU5fSElOVFNfRE9fU1RFTV9BREpVU1QoIGhpbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggKCBlZGdlLT5mbGFncyAgJiBBRl9FREdFX1JPVU5EICkgJiYKLSAgICAgICAgICAgKCBlZGdlMi0+ZmxhZ3MgJiBBRl9FREdFX1JPVU5EICkgKQotICAgICAgewotICAgICAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApCi0gICAgICAgICAgdGhyZXNob2xkID0gNjQgLSBBRl9MSUdIVF9NT0RFX01BWF9IT1JaX0dBUDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHRocmVzaG9sZCA9IDY0IC0gQUZfTElHSFRfTU9ERV9NQVhfVkVSVF9HQVA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICkKLSAgICAgICAgICB0aHJlc2hvbGQgPSA2NCAtIEFGX0xJR0hUX01PREVfTUFYX0hPUlpfR0FQIC8gMzsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHRocmVzaG9sZCA9IDY0IC0gQUZfTElHSFRfTU9ERV9NQVhfVkVSVF9HQVAgLyAzOwotICAgICAgfQotICAgIH0KLQotICAgIG9yZ19sZW4gICAgPSBlZGdlMi0+b3BvcyAtIGVkZ2UtPm9wb3M7Ci0gICAgY3VyX2xlbiAgICA9IGFmX2Nqa19jb21wdXRlX3N0ZW1fd2lkdGgoIGhpbnRzLCBkaW0sIG9yZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlMi0+ZmxhZ3MgKTsKLQotICAgIG9yZ19jZW50ZXIgPSAoIGVkZ2UtPm9wb3MgKyBlZGdlMi0+b3BvcyApIC8gMiArIGFuY2hvcjsKLSAgICBjdXJfcG9zMSAgID0gb3JnX2NlbnRlciAtIGN1cl9sZW4gLyAyOwotICAgIGN1cl9wb3MyICAgPSBjdXJfcG9zMSArIGN1cl9sZW47Ci0gICAgZF9vZmYxICAgICA9IGN1cl9wb3MxIC0gRlRfUElYX0ZMT09SKCBjdXJfcG9zMSApOwotICAgIGRfb2ZmMiAgICAgPSBjdXJfcG9zMiAtIEZUX1BJWF9GTE9PUiggY3VyX3BvczIgKTsKLSAgICB1X29mZjEgICAgID0gNjQgLSBkX29mZjE7Ci0gICAgdV9vZmYyICAgICA9IDY0IC0gZF9vZmYyOwotICAgIGRlbHRhICAgICAgPSAwOwotCi0KLSAgICBpZiAoIGRfb2ZmMSA9PSAwIHx8IGRfb2ZmMiA9PSAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggY3VyX2xlbiA8PSB0aHJlc2hvbGQgKQotICAgIHsKLSAgICAgIGlmICggZF9vZmYyIDwgY3VyX2xlbiApCi0gICAgICB7Ci0gICAgICAgIGlmICggdV9vZmYxIDw9IGRfb2ZmMiApCi0gICAgICAgICAgZGVsdGEgPSAgdV9vZmYxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZGVsdGEgPSAtZF9vZmYyOwotICAgICAgfQotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCB0aHJlc2hvbGQgPCA2NCApCi0gICAgewotICAgICAgaWYgKCBkX29mZjEgPj0gdGhyZXNob2xkIHx8IHVfb2ZmMSA+PSB0aHJlc2hvbGQgfHwKLSAgICAgICAgICAgZF9vZmYyID49IHRocmVzaG9sZCB8fCB1X29mZjIgPj0gdGhyZXNob2xkICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIG9mZnNldCA9IGN1cl9sZW4gJiA2MzsKLQotICAgIGlmICggb2Zmc2V0IDwgMzIgKQotICAgIHsKLSAgICAgIGlmICggdV9vZmYxIDw9IG9mZnNldCB8fCBkX29mZjIgPD0gb2Zmc2V0ICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICBvZmZzZXQgPSA2NCAtIHRocmVzaG9sZDsKLQotICAgIGRfb2ZmMSA9IHRocmVzaG9sZCAtIHVfb2ZmMTsKLSAgICB1X29mZjEgPSB1X29mZjEgICAgLSBvZmZzZXQ7Ci0gICAgdV9vZmYyID0gdGhyZXNob2xkIC0gZF9vZmYyOwotICAgIGRfb2ZmMiA9IGRfb2ZmMiAgICAtIG9mZnNldDsKLQotICAgIGlmICggZF9vZmYxIDw9IHVfb2ZmMSApCi0gICAgICB1X29mZjEgPSAtZF9vZmYxOwotCi0gICAgaWYgKCBkX29mZjIgPD0gdV9vZmYyICkKLSAgICAgIHVfb2ZmMiA9IC1kX29mZjI7Ci0KLSAgICBpZiAoIEZUX0FCUyggdV9vZmYxICkgPD0gRlRfQUJTKCB1X29mZjIgKSApCi0gICAgICBkZWx0YSA9IHVfb2ZmMTsKLSAgICBlbHNlCi0gICAgICBkZWx0YSA9IHVfb2ZmMjsKLQotICBFeGl0OgotCi0jaWYgMQotICAgIGlmICggIUFGX0xBVElOX0hJTlRTX0RPX1NURU1fQURKVVNUKCBoaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGRlbHRhID4gQUZfTElHSFRfTU9ERV9NQVhfREVMVEFfQUJTICkKLSAgICAgICAgZGVsdGEgPSBBRl9MSUdIVF9NT0RFX01BWF9ERUxUQV9BQlM7Ci0gICAgICBlbHNlIGlmICggZGVsdGEgPCAtQUZfTElHSFRfTU9ERV9NQVhfREVMVEFfQUJTICkKLSAgICAgICAgZGVsdGEgPSAtQUZfTElHSFRfTU9ERV9NQVhfREVMVEFfQUJTOwotICAgIH0KLSNlbmRpZgotCi0gICAgY3VyX3BvczEgKz0gZGVsdGE7Ci0KLSAgICBpZiAoIGVkZ2UtPm9wb3MgPCBlZGdlMi0+b3BvcyApCi0gICAgewotICAgICAgZWRnZS0+cG9zICA9IGN1cl9wb3MxOwotICAgICAgZWRnZTItPnBvcyA9IGN1cl9wb3MxICsgY3VyX2xlbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVkZ2UtPnBvcyAgPSBjdXJfcG9zMSArIGN1cl9sZW47Ci0gICAgICBlZGdlMi0+cG9zID0gY3VyX3BvczE7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlbHRhOwotICB9Ci0KLQotICAvKiBUaGUgbWFpbiBncmlkLWZpdHRpbmcgcm91dGluZS4gKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl9jamtfaGludF9lZGdlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlcyAgICAgID0gYXhpcy0+ZWRnZXM7Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlX2xpbWl0ID0gZWRnZXMgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgRlRfUHRyRGlzdCAgICBuX2VkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZTsKLSAgICBBRl9FZGdlICAgICAgIGFuY2hvciAgID0gTlVMTDsKLSAgICBGVF9Qb3MgICAgICAgIGRlbHRhICAgID0gMDsKLSAgICBGVF9JbnQgICAgICAgIHNraXBwZWQgID0gMDsKLSAgICBGVF9Cb29sICAgICAgIGhhc19sYXN0X3N0ZW0gPSBGQUxTRTsKLSAgICBGVF9Qb3MgICAgICAgIGxhc3Rfc3RlbV9wb3MgPSAwOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBGVF9VSW50ICAgICAgIG51bV9hY3Rpb25zID0gMDsKLSNlbmRpZgotCi0KLSAgICBGVF9UUkFDRTUoKCAiY2prICVzIGVkZ2UgaGludGluZyAoc3R5bGUgYCVzJylcbiIsCi0gICAgICAgICAgICAgICAgZGltID09IEFGX0RJTUVOU0lPTl9WRVJUID8gImhvcml6b250YWwiIDogInZlcnRpY2FsIiwKLSAgICAgICAgICAgICAgICBhZl9zdHlsZV9uYW1lc1toaW50cy0+bWV0cmljcy0+c3R5bGVfY2xhc3MtPnN0eWxlXSApKTsKLQotICAgIC8qIHdlIGJlZ2luIGJ5IGFsaWduaW5nIGFsbCBzdGVtcyByZWxhdGl2ZSB0byB0aGUgYmx1ZSB6b25lICovCi0KLSAgICBpZiAoIEFGX0hJTlRTX0RPX0JMVUVTKCBoaW50cyApICkKLSAgICB7Ci0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBBRl9XaWR0aCAgYmx1ZTsKLSAgICAgICAgQUZfRWRnZSAgIGVkZ2UxLCBlZGdlMjsKLQotCi0gICAgICAgIGlmICggZWRnZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGJsdWUgID0gZWRnZS0+Ymx1ZV9lZGdlOwotICAgICAgICBlZGdlMSA9IE5VTEw7Ci0gICAgICAgIGVkZ2UyID0gZWRnZS0+bGluazsKLQotICAgICAgICBpZiAoIGJsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgZWRnZTEgPSBlZGdlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBlZGdlMiAmJiBlZGdlMi0+Ymx1ZV9lZGdlICkKLSAgICAgICAgewotICAgICAgICAgIGJsdWUgID0gZWRnZTItPmJsdWVfZWRnZTsKLSAgICAgICAgICBlZGdlMSA9IGVkZ2UyOwotICAgICAgICAgIGVkZ2UyID0gZWRnZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIWVkZ2UxICkKLSAgICAgICAgICBjb250aW51ZTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIEZUX1RSQUNFNSgoICIgIENKS0JMVUU6IGVkZ2UgJWQgQCVkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gJS4yZiwiCi0gICAgICAgICAgICAgICAgICAgICIgd2FzICUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGVkZ2UxIC0gZWRnZXMsIGVkZ2UxLT5mcG9zLCBlZGdlMS0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgIGJsdWUtPmZpdCAvIDY0LjAsIGVkZ2UxLT5wb3MgLyA2NC4wICkpOwotCi0gICAgICAgIG51bV9hY3Rpb25zKys7Ci0jZW5kaWYKLQotICAgICAgICBlZGdlMS0+cG9zICAgID0gYmx1ZS0+Zml0OwotICAgICAgICBlZGdlMS0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotCi0gICAgICAgIGlmICggZWRnZTIgJiYgIWVkZ2UyLT5ibHVlX2VkZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgYWZfY2prX2FsaWduX2xpbmtlZF9lZGdlKCBoaW50cywgZGltLCBlZGdlMSwgZWRnZTIgKTsKLSAgICAgICAgICBlZGdlMi0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBudW1fYWN0aW9ucysrOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoICFhbmNob3IgKQotICAgICAgICAgIGFuY2hvciA9IGVkZ2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogbm93IHdlIGFsaWduIGFsbCBzdGVtIGVkZ2VzLiAqLwotICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgewotICAgICAgQUZfRWRnZSAgZWRnZTI7Ci0KLQotICAgICAgaWYgKCBlZGdlLT5mbGFncyAmIEFGX0VER0VfRE9ORSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBza2lwIGFsbCBub24tc3RlbSBlZGdlcyAqLwotICAgICAgZWRnZTIgPSBlZGdlLT5saW5rOwotICAgICAgaWYgKCAhZWRnZTIgKQotICAgICAgewotICAgICAgICBza2lwcGVkKys7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiBTb21lIENKSyBjaGFyYWN0ZXJzIGhhdmUgc28gbWFueSBzdGVtcyB0aGF0Ci0gICAgICAgKiB0aGUgaGludGVyIGlzIGxpa2VseSB0byBtZXJnZSB0d28gYWRqYWNlbnQgb25lcy4KLSAgICAgICAqIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgaWYgZWl0aGVyIGVkZ2Ugb2YgYSBzdGVtCi0gICAgICAgKiBpcyB0b28gY2xvc2UgdG8gdGhlIHByZXZpb3VzIG9uZSwgd2UgYXZvaWQKLSAgICAgICAqIGFsaWduaW5nIHRoZSB0d28gZWRnZXMsIGJ1dCByYXRoZXIgaW50ZXJwb2xhdGUKLSAgICAgICAqIHRoZWlyIGxvY2F0aW9ucyBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gaW4KLSAgICAgICAqIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBzdGVtcy4KLSAgICAgICAqLwotICAgICAgaWYgKCBoYXNfbGFzdF9zdGVtICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIGVkZ2UtPnBvcyAgPCBsYXN0X3N0ZW1fcG9zICsgNjQgfHwKLSAgICAgICAgICAgICBlZGdlMi0+cG9zIDwgbGFzdF9zdGVtX3BvcyArIDY0ICkgKQotICAgICAgewotICAgICAgICBza2lwcGVkKys7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiBub3cgYWxpZ24gdGhlIHN0ZW0gKi8KLQotICAgICAgLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGl0J3MgYmV0dGVyIHRvIGJlIHNhZmUgKi8KLSAgICAgIGlmICggZWRnZTItPmJsdWVfZWRnZSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNSgoICJBU1NFUlRJT04gRkFJTEVEIGZvciBlZGdlICVkXG4iLCBlZGdlMi1lZGdlcyApKTsKLQotICAgICAgICBhZl9jamtfYWxpZ25fbGlua2VkX2VkZ2UoIGhpbnRzLCBkaW0sIGVkZ2UyLCBlZGdlICk7Ci0gICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIG51bV9hY3Rpb25zKys7Ci0jZW5kaWYKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBlZGdlMiA8IGVkZ2UgKQotICAgICAgewotICAgICAgICBhZl9jamtfYWxpZ25fbGlua2VkX2VkZ2UoIGhpbnRzLCBkaW0sIGVkZ2UyLCBlZGdlICk7Ci0gICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIG51bV9hY3Rpb25zKys7Ci0jZW5kaWYKLQotICAgICAgICAvKiBXZSByYXJlbHkgcmVhY2hlcyBoZXJlIGl0IHNlZW1zOwotICAgICAgICAgKiB1c3VhbGx5IHRoZSB0d28gZWRnZXMgYmVsb25naW5nCi0gICAgICAgICAqIHRvIG9uZSBzdGVtIGFyZSBtYXJrZWQgYXMgRE9ORSB0b2dldGhlcgotICAgICAgICAgKi8KLSAgICAgICAgaGFzX2xhc3Rfc3RlbSA9IFRSVUU7Ci0gICAgICAgIGxhc3Rfc3RlbV9wb3MgPSBlZGdlLT5wb3M7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGRpbSAhPSBBRl9ESU1FTlNJT05fVkVSVCAmJiAhYW5jaG9yICkKLSAgICAgIHsKLQotI2lmIDAKLSAgICAgICAgaWYgKCBmaXhlZHBpdGNoICkKLSAgICAgICAgewotICAgICAgICAgIEFGX0VkZ2UgICAgIGxlZnQgID0gZWRnZTsKLSAgICAgICAgICBBRl9FZGdlICAgICByaWdodCA9IGVkZ2VfbGltaXQgLSAxOwotICAgICAgICAgIEFGX0VkZ2VSZWMgIGxlZnQxLCBsZWZ0MiwgcmlnaHQxLCByaWdodDI7Ci0gICAgICAgICAgRlRfUG9zICAgICAgdGFyZ2V0LCBjZW50ZXIxLCBjZW50ZXIyOwotICAgICAgICAgIEZUX1BvcyAgICAgIGRlbHRhMSwgZGVsdGEyLCBkMSwgZDI7Ci0KLQotICAgICAgICAgIHdoaWxlICggcmlnaHQgPiBsZWZ0ICYmICFyaWdodC0+bGluayApCi0gICAgICAgICAgICByaWdodC0tOwotCi0gICAgICAgICAgbGVmdDEgID0gKmxlZnQ7Ci0gICAgICAgICAgbGVmdDIgID0gKmxlZnQtPmxpbms7Ci0gICAgICAgICAgcmlnaHQxID0gKnJpZ2h0LT5saW5rOwotICAgICAgICAgIHJpZ2h0MiA9ICpyaWdodDsKLQotICAgICAgICAgIGRlbHRhICA9ICggKCAoIGhpbnRlci0+cHAyLnggKyAzMiApICYgLTY0ICkgLSBoaW50ZXItPnBwMi54ICkgLyAyOwotICAgICAgICAgIHRhcmdldCA9IGxlZnQtPm9wb3MgKyAoIHJpZ2h0LT5vcG9zIC0gbGVmdC0+b3BvcyApIC8gMiArIGRlbHRhIC0gMTY7Ci0KLSAgICAgICAgICBkZWx0YTEgID0gZGVsdGE7Ci0gICAgICAgICAgZGVsdGExICs9IGFmX2hpbnRfbm9ybWFsX3N0ZW0oIGhpbnRzLCBsZWZ0LCBsZWZ0LT5saW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YTEsIDAgKTsKLQotICAgICAgICAgIGlmICggbGVmdC0+bGluayAhPSByaWdodCApCi0gICAgICAgICAgICBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgcmlnaHQtPmxpbmssIHJpZ2h0LCBkZWx0YTEsIDAgKTsKLQotICAgICAgICAgIGNlbnRlcjEgPSBsZWZ0LT5wb3MgKyAoIHJpZ2h0LT5wb3MgLSBsZWZ0LT5wb3MgKSAvIDI7Ci0KLSAgICAgICAgICBpZiAoIGNlbnRlcjEgPj0gdGFyZ2V0ICkKLSAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhIC0gMzI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVsdGEyID0gZGVsdGEgKyAzMjsKLQotICAgICAgICAgIGRlbHRhMiArPSBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgJmxlZnQxLCAmbGVmdDIsIGRlbHRhMiwgMCApOwotCi0gICAgICAgICAgaWYgKCBkZWx0YTEgIT0gZGVsdGEyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGxlZnQtPmxpbmsgIT0gcmlnaHQgKQotICAgICAgICAgICAgICBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgJnJpZ2h0MSwgJnJpZ2h0MiwgZGVsdGEyLCAwICk7Ci0KLSAgICAgICAgICAgIGNlbnRlcjIgPSBsZWZ0MS5wb3MgKyAoIHJpZ2h0Mi5wb3MgLSBsZWZ0MS5wb3MgKSAvIDI7Ci0KLSAgICAgICAgICAgIGQxID0gY2VudGVyMSAtIHRhcmdldDsKLSAgICAgICAgICAgIGQyID0gY2VudGVyMiAtIHRhcmdldDsKLQotICAgICAgICAgICAgaWYgKCBGVF9BQlMoIGQyICkgPCBGVF9BQlMoIGQxICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZWZ0LT5wb3MgICAgICAgPSBsZWZ0MS5wb3M7Ci0gICAgICAgICAgICAgIGxlZnQtPmxpbmstPnBvcyA9IGxlZnQyLnBvczsKLQotICAgICAgICAgICAgICBpZiAoIGxlZnQtPmxpbmsgIT0gcmlnaHQgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmlnaHQtPmxpbmstPnBvcyA9IHJpZ2h0MS5wb3M7Ci0gICAgICAgICAgICAgICAgcmlnaHQtPnBvcyAgICAgICA9IHJpZ2h0Mi5wb3M7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBkZWx0YTEgPSBkZWx0YTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZGVsdGEgICAgICAgICAgICAgICA9IGRlbHRhMTsKLSAgICAgICAgICByaWdodC0+bGluay0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgICAgIHJpZ2h0LT5mbGFncyAgICAgICB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotCi0jZW5kaWYgLyogMCAqLwotCi0gICAgICAgICAgZGVsdGEgPSBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgZWRnZSwgZWRnZTIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9ESU1FTlNJT05fSE9SWiApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgZWRnZSwgZWRnZTIsIGRlbHRhLCBkaW0gKTsKLQotI2lmIDAKLSAgICAgIHByaW50ZiggInN0ZW0gKCVkLCVkKSBhZGp1c3RlZCAoJS4xZiwlLjFmKVxuIiwKLSAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywgZWRnZTIgLSBlZGdlcywKLSAgICAgICAgICAgICAgICggZWRnZS0+cG9zIC0gZWRnZS0+b3BvcyApIC8gNjQuMCwKLSAgICAgICAgICAgICAgICggZWRnZTItPnBvcyAtIGVkZ2UyLT5vcG9zICkgLyA2NC4wICk7Ci0jZW5kaWYKLQotICAgICAgYW5jaG9yID0gZWRnZTsKLSAgICAgIGVkZ2UtPmZsYWdzICB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICBlZGdlMi0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgaGFzX2xhc3Rfc3RlbSA9IFRSVUU7Ci0gICAgICBsYXN0X3N0ZW1fcG9zID0gZWRnZTItPnBvczsKLSAgICB9Ci0KLSAgICAvKiBtYWtlIHN1cmUgdGhhdCBsb3dlcmNhc2UgbSdzIG1haW50YWluIHRoZWlyIHN5bW1ldHJ5ICovCi0KLSAgICAvKiBJbiBnZW5lcmFsLCBsb3dlcmNhc2UgbSdzIGhhdmUgc2l4IHZlcnRpY2FsIGVkZ2VzIGlmIHRoZXkgYXJlIHNhbnMgKi8KLSAgICAvKiBzZXJpZiwgb3IgdHdlbHZlIGlmIHRoZXkgYXJlIHdpdGggc2VyaWZzLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAgKi8KLSAgICAvKiBiYXNlZCBvbiB0aGF0IGFzc3VtcHRpb24sIGFuZCBzZWVtcyB0byB3b3JrIHZlcnkgd2VsbCB3aXRoIG1vc3QgICAgKi8KLSAgICAvKiBmYWNlcy4gIEhvd2V2ZXIsIGlmIGZvciBhIGNlcnRhaW4gZmFjZSB0aGlzIGFzc3VtcHRpb24gaXMgbm90ICAgICAgKi8KLSAgICAvKiB0cnVlLCB0aGUgbSBpcyBqdXN0IHJlbmRlcmVkIGxpa2UgYmVmb3JlLiAgSW4gYWRkaXRpb24sIGFueSBzdGVtICAgKi8KLSAgICAvKiBjb3JyZWN0aW9uIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHN5bW1ldHJpY2FsIGdseXBocyAoZXZlbiBpZiB0aGUgKi8KLSAgICAvKiBnbHlwaCBpcyBub3QgYW4gbSksIHNvIHRoZSBwb3RlbnRpYWwgZm9yIHVud2FudGVkIGRpc3RvcnRpb24gaXMgICAgKi8KLSAgICAvKiByZWxhdGl2ZWx5IGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIFdlIGRvbid0IGhhbmRsZSBob3Jpem9udGFsIGVkZ2VzIHNpbmNlIHdlIGNhbid0IGVhc2lseSBhc3N1cmUgdGhhdCAqLwotICAgIC8qIHRoZSB0aGlyZCAobG93ZXN0KSBzdGVtIGFsaWducyB3aXRoIHRoZSBiYXNlIGxpbmU7IGl0IG1pZ2h0IGVuZCB1cCAqLwotICAgIC8qIG9uZSBwaXhlbCBoaWdoZXIgb3IgbG93ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgbl9lZGdlcyA9IGVkZ2VfbGltaXQgLSBlZGdlczsKLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiAmJiAoIG5fZWRnZXMgPT0gNiB8fCBuX2VkZ2VzID09IDEyICkgKQotICAgIHsKLSAgICAgIEFGX0VkZ2UgIGVkZ2UxLCBlZGdlMiwgZWRnZTM7Ci0gICAgICBGVF9Qb3MgICBkaXN0MSwgZGlzdDIsIHNwYW47Ci0KLQotICAgICAgaWYgKCBuX2VkZ2VzID09IDYgKQotICAgICAgewotICAgICAgICBlZGdlMSA9IGVkZ2VzOwotICAgICAgICBlZGdlMiA9IGVkZ2VzICsgMjsKLSAgICAgICAgZWRnZTMgPSBlZGdlcyArIDQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVkZ2UxID0gZWRnZXMgKyAxOwotICAgICAgICBlZGdlMiA9IGVkZ2VzICsgNTsKLSAgICAgICAgZWRnZTMgPSBlZGdlcyArIDk7Ci0gICAgICB9Ci0KLSAgICAgIGRpc3QxID0gZWRnZTItPm9wb3MgLSBlZGdlMS0+b3BvczsKLSAgICAgIGRpc3QyID0gZWRnZTMtPm9wb3MgLSBlZGdlMi0+b3BvczsKLQotICAgICAgc3BhbiA9IGRpc3QxIC0gZGlzdDI7Ci0gICAgICBpZiAoIHNwYW4gPCAwICkKLSAgICAgICAgc3BhbiA9IC1zcGFuOwotCi0gICAgICBpZiAoIGVkZ2UxLT5saW5rID09IGVkZ2UxICsgMSAmJgotICAgICAgICAgICBlZGdlMi0+bGluayA9PSBlZGdlMiArIDEgJiYKLSAgICAgICAgICAgZWRnZTMtPmxpbmsgPT0gZWRnZTMgKyAxICYmIHNwYW4gPCA4ICkKLSAgICAgIHsKLSAgICAgICAgZGVsdGEgPSBlZGdlMy0+cG9zIC0gKCAyICogZWRnZTItPnBvcyAtIGVkZ2UxLT5wb3MgKTsKLSAgICAgICAgZWRnZTMtPnBvcyAtPSBkZWx0YTsKLSAgICAgICAgaWYgKCBlZGdlMy0+bGluayApCi0gICAgICAgICAgZWRnZTMtPmxpbmstPnBvcyAtPSBkZWx0YTsKLQotICAgICAgICAvKiBtb3ZlIHRoZSBzZXJpZnMgYWxvbmcgd2l0aCB0aGUgc3RlbSAqLwotICAgICAgICBpZiAoIG5fZWRnZXMgPT0gMTIgKQotICAgICAgICB7Ci0gICAgICAgICAgKCBlZGdlcyArIDggKS0+cG9zIC09IGRlbHRhOwotICAgICAgICAgICggZWRnZXMgKyAxMSApLT5wb3MgLT0gZGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBlZGdlMy0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgICBpZiAoIGVkZ2UzLT5saW5rICkKLSAgICAgICAgICBlZGdlMy0+bGluay0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggIXNraXBwZWQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyoKLSAgICAgKiAgbm93IGhpbnQgdGhlIHJlbWFpbmluZyBlZGdlcyAoc2VyaWZzIGFuZCBzaW5nbGUpIGluIG9yZGVyCi0gICAgICogIHRvIGNvbXBsZXRlIG91ciBwcm9jZXNzaW5nCi0gICAgICovCi0gICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICB7Ci0gICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggZWRnZS0+c2VyaWYgKQotICAgICAgewotICAgICAgICBhZl9jamtfYWxpZ25fc2VyaWZfZWRnZSggaGludHMsIGVkZ2UtPnNlcmlmLCBlZGdlICk7Ci0gICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLSAgICAgICAgc2tpcHBlZC0tOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggIXNraXBwZWQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICB7Ci0gICAgICBBRl9FZGdlICBiZWZvcmUsIGFmdGVyOwotCi0KLSAgICAgIGlmICggZWRnZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgYmVmb3JlID0gYWZ0ZXIgPSBlZGdlOwotCi0gICAgICB3aGlsZSAoIC0tYmVmb3JlID49IGVkZ2VzICkKLSAgICAgICAgaWYgKCBiZWZvcmUtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgd2hpbGUgKCArK2FmdGVyIDwgZWRnZV9saW1pdCApCi0gICAgICAgIGlmICggYWZ0ZXItPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBiZWZvcmUgPj0gZWRnZXMgfHwgYWZ0ZXIgPCBlZGdlX2xpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBiZWZvcmUgPCBlZGdlcyApCi0gICAgICAgICAgYWZfY2prX2FsaWduX3NlcmlmX2VkZ2UoIGhpbnRzLCBhZnRlciwgZWRnZSApOwotICAgICAgICBlbHNlIGlmICggYWZ0ZXIgPj0gZWRnZV9saW1pdCApCi0gICAgICAgICAgYWZfY2prX2FsaWduX3NlcmlmX2VkZ2UoIGhpbnRzLCBiZWZvcmUsIGVkZ2UgKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBhZnRlci0+ZnBvcyA9PSBiZWZvcmUtPmZwb3MgKQotICAgICAgICAgICAgZWRnZS0+cG9zID0gYmVmb3JlLT5wb3M7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZWRnZS0+cG9zID0gYmVmb3JlLT5wb3MgKwotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBlZGdlLT5mcG9zIC0gYmVmb3JlLT5mcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci0+cG9zIC0gYmVmb3JlLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5mcG9zIC0gYmVmb3JlLT5mcG9zICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgaWYgKCAhbnVtX2FjdGlvbnMgKQotICAgICAgRlRfVFJBQ0U1KCggIiAgKG5vbmUpXG4iICkpOwotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0jZW5kaWYKLQotICAgIHJldHVybjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfY2prX2FsaWduX2VkZ2VfcG9pbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgID0gJiBoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZXMgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZV9saW1pdCA9IGVkZ2VzICsgYXhpcy0+bnVtX2VkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZTsKLSAgICBGVF9Cb29sICAgICAgIHNuYXBwaW5nOwotCi0KLSAgICBzbmFwcGluZyA9IEZUX0JPT0woICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0xBVElOX0hJTlRTX0RPX0hPUlpfU05BUCggaGludHMgKSApICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfTEFUSU5fSElOVFNfRE9fVkVSVF9TTkFQKCBoaW50cyApICkgICk7Ci0KLSAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgIHsKLSAgICAgIC8qIG1vdmUgdGhlIHBvaW50cyBvZiBlYWNoIHNlZ21lbnQgICAgICovCi0gICAgICAvKiBpbiBlYWNoIGVkZ2UgdG8gdGhlIGVkZ2UncyBwb3NpdGlvbiAqLwotICAgICAgQUZfU2VnbWVudCAgc2VnID0gZWRnZS0+Zmlyc3Q7Ci0KLQotICAgICAgaWYgKCBzbmFwcGluZyApCi0gICAgICB7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9Qb2ludCAgcG9pbnQgPSBzZWctPmZpcnN0OwotCi0KLSAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG9pbnQtPnggICAgICA9IGVkZ2UtPnBvczsKLSAgICAgICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IEFGX0ZMQUdfVE9VQ0hfWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG9pbnQtPnkgICAgICA9IGVkZ2UtPnBvczsKLSAgICAgICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IEFGX0ZMQUdfVE9VQ0hfWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBwb2ludCA9PSBzZWctPmxhc3QgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzZWcgPSBzZWctPmVkZ2VfbmV4dDsKLQotICAgICAgICB9IHdoaWxlICggc2VnICE9IGVkZ2UtPmZpcnN0ICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgZGVsdGEgPSBlZGdlLT5wb3MgLSBlZGdlLT5vcG9zOwotCi0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIEFGX1BvaW50ICBwb2ludCA9IHNlZy0+Zmlyc3Q7Ci0KLQotICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwb2ludC0+eCAgICAgKz0gZGVsdGE7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFncyB8PSBBRl9GTEFHX1RPVUNIX1g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvaW50LT55ICAgICArPSBkZWx0YTsKLSAgICAgICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IEFGX0ZMQUdfVE9VQ0hfWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBwb2ludCA9PSBzZWctPmxhc3QgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzZWcgPSBzZWctPmVkZ2VfbmV4dDsKLQotICAgICAgICB9IHdoaWxlICggc2VnICE9IGVkZ2UtPmZpcnN0ICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBBcHBseSB0aGUgY29tcGxldGUgaGludGluZyBhbGdvcml0aG0gdG8gYSBDSksgZ2x5cGguICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2Nqa19oaW50c19hcHBseSggRlRfVUludCAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICBBRl9DSktNZXRyaWNzICBtZXRyaWNzICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBpbnQgICAgICAgZGltOwotCi0gICAgRlRfVU5VU0VEKCBtZXRyaWNzICk7Ci0gICAgRlRfVU5VU0VEKCBnbHlwaF9pbmRleCApOwotCi0KLSAgICBlcnJvciA9IGFmX2dseXBoX2hpbnRzX3JlbG9hZCggaGludHMsIG91dGxpbmUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGFuYWx5emUgZ2x5cGggb3V0bGluZSAqLwotICAgIGlmICggQUZfSElOVFNfRE9fSE9SSVpPTlRBTCggaGludHMgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBhZl9jamtfaGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBoaW50cywgQUZfRElNRU5TSU9OX0hPUlogKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGFmX2Nqa19oaW50c19jb21wdXRlX2JsdWVfZWRnZXMoIGhpbnRzLCBtZXRyaWNzLCBBRl9ESU1FTlNJT05fSE9SWiApOwotICAgIH0KLQotICAgIGlmICggQUZfSElOVFNfRE9fVkVSVElDQUwoIGhpbnRzICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gYWZfY2prX2hpbnRzX2RldGVjdF9mZWF0dXJlcyggaGludHMsIEFGX0RJTUVOU0lPTl9WRVJUICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBhZl9jamtfaGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKCBoaW50cywgbWV0cmljcywgQUZfRElNRU5TSU9OX1ZFUlQgKTsKLSAgICB9Ci0KLSAgICAvKiBncmlkLWZpdCB0aGUgb3V0bGluZSAqLwotICAgIGZvciAoIGRpbSA9IDA7IGRpbSA8IEFGX0RJTUVOU0lPTl9NQVg7IGRpbSsrICkKLSAgICB7Ci0gICAgICBpZiAoICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICYmIEFGX0hJTlRTX0RPX0hPUklaT05UQUwoIGhpbnRzICkgKSB8fAotICAgICAgICAgICAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCAmJiBBRl9ISU5UU19ET19WRVJUSUNBTCggaGludHMgKSApICAgKQotICAgICAgewotCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCi0gICAgICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIucmVuZGVyX21vZGUgPT0gRlRfUkVOREVSX01PREVfTk9STUFMICYmCi0gICAgICAgICAgICAgQUZfSElOVFNfRE9fV0FSUCggaGludHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIEFGX1dhcnBlclJlYyAgd2FycGVyOwotICAgICAgICAgIEZUX0ZpeGVkICAgICAgc2NhbGU7Ci0gICAgICAgICAgRlRfUG9zICAgICAgICBkZWx0YTsKLQotCi0gICAgICAgICAgYWZfd2FycGVyX2NvbXB1dGUoICZ3YXJwZXIsIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlLCAmZGVsdGEgKTsKLSAgICAgICAgICBhZl9nbHlwaF9oaW50c19zY2FsZV9kaW0oIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLCBkZWx0YSApOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYgLyogQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSICovCi0KLSAgICAgICAgYWZfY2prX2hpbnRfZWRnZXMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9jamtfYWxpZ25fZWRnZV9wb2ludHMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19hbGlnbl9zdHJvbmdfcG9pbnRzKCBoaW50cywgKEFGX0RpbWVuc2lvbilkaW0gKTsKLSAgICAgICAgYWZfZ2x5cGhfaGludHNfYWxpZ25fd2Vha19wb2ludHMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgfQotICAgIH0KLQotICAgIGFmX2dseXBoX2hpbnRzX3NhdmUoIGhpbnRzLCBvdXRsaW5lICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICBDIEogSyAgIFMgQyBSIEkgUCBUICAgQyBMIEEgUyBTICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgQUZfREVGSU5FX1dSSVRJTkdfU1lTVEVNX0NMQVNTKAotICAgIGFmX2Nqa193cml0aW5nX3N5c3RlbV9jbGFzcywKLQotICAgIEFGX1dSSVRJTkdfU1lTVEVNX0NKSywKLQotICAgIHNpemVvZiAoIEFGX0NKS01ldHJpY3NSZWMgKSwKLQotICAgIChBRl9Xcml0aW5nU3lzdGVtX0luaXRNZXRyaWNzRnVuYykgYWZfY2prX21ldHJpY3NfaW5pdCwgICAgICAgIC8qIHN0eWxlX21ldHJpY3NfaW5pdCAgICAqLwotICAgIChBRl9Xcml0aW5nU3lzdGVtX1NjYWxlTWV0cmljc0Z1bmMpYWZfY2prX21ldHJpY3Nfc2NhbGUsICAgICAgIC8qIHN0eWxlX21ldHJpY3Nfc2NhbGUgICAqLwotICAgIChBRl9Xcml0aW5nU3lzdGVtX0RvbmVNZXRyaWNzRnVuYykgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0eWxlX21ldHJpY3NfZG9uZSAgICAqLwotICAgIChBRl9Xcml0aW5nU3lzdGVtX0dldFN0ZFdpZHRoc0Z1bmMpYWZfY2prX2dldF9zdGFuZGFyZF93aWR0aHMsIC8qIHN0eWxlX21ldHJpY3NfZ2V0c3RkdyAqLwotCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fSW5pdEhpbnRzRnVuYykgICBhZl9jamtfaGludHNfaW5pdCwgICAgICAgICAgLyogc3R5bGVfaGludHNfaW5pdCAgICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fQXBwbHlIaW50c0Z1bmMpICBhZl9jamtfaGludHNfYXBwbHkgICAgICAgICAgLyogc3R5bGVfaGludHNfYXBwbHkgICAgICovCi0gICkKLQotCi0jZWxzZSAvKiAhQUZfQ09ORklHX09QVElPTl9DSksgKi8KLQotCi0gIEFGX0RFRklORV9XUklUSU5HX1NZU1RFTV9DTEFTUygKLSAgICBhZl9jamtfd3JpdGluZ19zeXN0ZW1fY2xhc3MsCi0KLSAgICBBRl9XUklUSU5HX1NZU1RFTV9DSkssCi0KLSAgICBzaXplb2YgKCBBRl9DSktNZXRyaWNzUmVjICksCi0KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9Jbml0TWV0cmljc0Z1bmMpIE5VTEwsIC8qIHN0eWxlX21ldHJpY3NfaW5pdCAgICAqLwotICAgIChBRl9Xcml0aW5nU3lzdGVtX1NjYWxlTWV0cmljc0Z1bmMpTlVMTCwgLyogc3R5bGVfbWV0cmljc19zY2FsZSAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fRG9uZU1ldHJpY3NGdW5jKSBOVUxMLCAvKiBzdHlsZV9tZXRyaWNzX2RvbmUgICAgKi8KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9HZXRTdGRXaWR0aHNGdW5jKU5VTEwsIC8qIHN0eWxlX21ldHJpY3NfZ2V0c3RkdyAqLwotCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fSW5pdEhpbnRzRnVuYykgICBOVUxMLCAvKiBzdHlsZV9oaW50c19pbml0ICAgICAgKi8KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9BcHBseUhpbnRzRnVuYykgIE5VTEwgIC8qIHN0eWxlX2hpbnRzX2FwcGx5ICAgICAqLwotICApCi0KLQotI2VuZGlmIC8qICFBRl9DT05GSUdfT1BUSU9OX0NKSyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZjamsuaCBiL3NyYy9hdXRvZml0L2FmY2prLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Zjg5MmYuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZjamsuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmNqay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgQ0pLIHdyaXRpbmcgc3lzdGVtIChzcGVjaWZpY2F0aW9uKS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZDSktfSF8KLSNkZWZpbmUgQUZDSktfSF8KLQotI2luY2x1ZGUgImFmaGludHMuaCIKLSNpbmNsdWRlICJhZmxhdGluLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiB0aGUgQ0pLLXNwZWNpZmljIHdyaXRpbmcgc3lzdGVtICovCi0KLSAgQUZfREVDTEFSRV9XUklUSU5HX1NZU1RFTV9DTEFTUyggYWZfY2prX3dyaXRpbmdfc3lzdGVtX2NsYXNzICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgQyBKIEsgICBHIEwgTyBCIEEgTCAgIE0gRSBUIFIgSSBDIFMgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoKLSAgICogIENKSyBnbHlwaHMgdGVuZCB0byBmaWxsIHRoZSBzcXVhcmUuICBTbyB3ZSBoYXZlIGJvdGggdmVydGljYWwgYW5kCi0gICAqICBob3Jpem9udGFsIGJsdWUgem9uZXMuICBCdXQgc29tZSBnbHlwaHMgaGF2ZSBmbGF0IGJvdW5kaW5nIHN0cm9rZXMgdGhhdAotICAgKiAgbGVhdmUgc29tZSBzcGFjZSBiZXR3ZWVuIG5laWdoYm91ciBnbHlwaHMuCi0gICAqLwotCi0jZGVmaW5lIEFGX0NKS19JU19UT1BfQkxVRSggYiApIFwKLSAgICAgICAgICAoIChiKS0+cHJvcGVydGllcyAmIEFGX0JMVUVfUFJPUEVSVFlfQ0pLX1RPUCApCi0jZGVmaW5lIEFGX0NKS19JU19IT1JJWl9CTFVFKCBiICkgXAotICAgICAgICAgICggKGIpLT5wcm9wZXJ0aWVzICYgQUZfQkxVRV9QUk9QRVJUWV9DSktfSE9SSVogKQotI2RlZmluZSBBRl9DSktfSVNfUklHSFRfQkxVRSAgQUZfQ0pLX0lTX1RPUF9CTFVFCi0KLSNkZWZpbmUgQUZfQ0pLX01BWF9XSURUSFMgIDE2Ci0KLQotI2RlZmluZSBBRl9DSktfQkxVRV9BQ1RJVkUgICAgICAoIDFVIDw8IDAgKSAvKiB6b25lIGhlaWdodCBpcyA8PSAzLzRweCAgICAgICovCi0jZGVmaW5lIEFGX0NKS19CTFVFX1RPUCAgICAgICAgICggMVUgPDwgMSApIC8qIHJlc3VsdCBvZiBBRl9DSktfSVNfVE9QX0JMVUUgKi8KLSNkZWZpbmUgQUZfQ0pLX0JMVUVfQURKVVNUTUVOVCAgKCAxVSA8PCAyICkgLyogdXNlZCBmb3Igc2NhbGUgYWRqdXN0bWVudCAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcHRpbWl6YXRpb24gICAgICAgICAgICAgICAgICovCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfQ0pLQmx1ZVJlY18KLSAgewotICAgIEFGX1dpZHRoUmVjICByZWY7Ci0gICAgQUZfV2lkdGhSZWMgIHNob290OyAvKiB1bmRlcnNob290ICovCi0gICAgRlRfVUludCAgICAgIGZsYWdzOwotCi0gIH0gQUZfQ0pLQmx1ZVJlYywgKkFGX0NKS0JsdWU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfQ0pLQXhpc1JlY18KLSAgewotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlOwotICAgIEZUX1BvcyAgICAgICAgIGRlbHRhOwotCi0gICAgRlRfVUludCAgICAgICAgd2lkdGhfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB1c2VkIHdpZHRocyAqLwotICAgIEFGX1dpZHRoUmVjICAgIHdpZHRoc1tBRl9DSktfTUFYX1dJRFRIU107ICAgICAvKiB3aWR0aHMgYXJyYXkgICAgICAgICAgKi8KLSAgICBGVF9Qb3MgICAgICAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZDsgICAgIC8qIHVzZWQgZm9yIGNyZWF0aW5nIGVkZ2VzICovCi0gICAgRlRfUG9zICAgICAgICAgc3RhbmRhcmRfd2lkdGg7ICAgICAgICAgICAvKiB0aGUgZGVmYXVsdCBzdGVtIHRoaWNrbmVzcyAqLwotICAgIEZUX0Jvb2wgICAgICAgIGV4dHJhX2xpZ2h0OyAgICAgICAgICAgLyogaXMgc3RhbmRhcmQgd2lkdGggdmVyeSBsaWdodD8gKi8KLQotICAgIC8qIHVzZWQgZm9yIGhvcml6b250YWwgbWV0cmljcyB0b28gZm9yIENKSyAqLwotICAgIEZUX0Jvb2wgICAgICAgIGNvbnRyb2xfb3ZlcnNob290OwotICAgIEZUX1VJbnQgICAgICAgIGJsdWVfY291bnQ7Ci0gICAgQUZfQ0pLQmx1ZVJlYyAgYmx1ZXNbQUZfQkxVRV9TVFJJTkdTRVRfTUFYXTsKLQotICAgIEZUX0ZpeGVkICAgICAgIG9yZ19zY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgICBvcmdfZGVsdGE7Ci0KLSAgfSBBRl9DSktBeGlzUmVjLCAqQUZfQ0pLQXhpczsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9DSktNZXRyaWNzUmVjXwotICB7Ci0gICAgQUZfU3R5bGVNZXRyaWNzUmVjICByb290OwotICAgIEZUX1VJbnQgICAgICAgICAgICAgdW5pdHNfcGVyX2VtOwotICAgIEFGX0NKS0F4aXNSZWMgICAgICAgYXhpc1tBRl9ESU1FTlNJT05fTUFYXTsKLQotICB9IEFGX0NKS01ldHJpY3NSZWMsICpBRl9DSktNZXRyaWNzOwotCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKSwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9jamtfbWV0cmljc19pbml0KCBBRl9DSktNZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9jamtfbWV0cmljc19zY2FsZSggQUZfQ0pLTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgIHNjYWxlciApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmX2Nqa19oaW50c19pbml0KCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9jamtfaGludHNfYXBwbHkoIEZUX1VJbnQgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgQUZfQ0pLTWV0cmljcyAgbWV0cmljcyApOwotCi0gIC8qIHNoYXJlZDsgY2FsbGVkIGZyb20gYWZpbmRpYy5jICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfY2prX21ldHJpY3NfY2hlY2tfZGlnaXRzKCBBRl9DSktNZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGZhY2UgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX2Nqa19tZXRyaWNzX2luaXRfd2lkdGhzKCBBRl9DSktNZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSApOwotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fQ0pLICovCi0KLQotLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogQUZDSktfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmY292ZXIuaCBiL3NyYy9hdXRvZml0L2FmY292ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxOGM2Ni4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmNvdmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZjb3Zlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGNvdmVyYWdlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFRoaXMgaGVhZGVyIGZpbGUgY2FuIGJlIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzLiAqLwotICAvKiBEZWZpbmUgYENPVkVSQUdFJyBhcyBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIC8qIEFkZCBuZXcgY292ZXJhZ2VzIGhlcmUuICBUaGUgZmlyc3QgYW5kIHNlY29uZCBhcmd1bWVudHMgYXJlIHRoZSAgICovCi0gIC8qIGNvdmVyYWdlIG5hbWUgaW4gbG93ZXJjYXNlIGFuZCB1cHBlcmNhc2UsIHJlc3BlY3RpdmVseSwgZm9sbG93ZWQgICovCi0gIC8qIGJ5IGEgZGVzY3JpcHRpb24gc3RyaW5nLiAgVGhlIGxhc3QgZm91ciBhcmd1bWVudHMgYXJlIHRoZSBmb3VyICAgICovCi0gIC8qIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIGNvcnJlc3BvbmRpbmcgT3BlblR5cGUgZmVhdHVyZS4gICAgICAgICAgICovCi0KLSNpZiAwCi0gIC8qIFhYWDogSXQncyBub3QgcG9zc2libGUgdG8gZGVmaW5lIGJsdWUgem9uZSBjaGFyYWN0ZXJzIGluIGFkdmFuY2UuICovCi0gIENPVkVSQUdFKCBhbHRlcm5hdGl2ZV9mcmFjdGlvbnMsIEFMVEVSTkFUSVZFX0ZSQUNUSU9OUywKLSAgICAgICAgICAgICJhbHRlcm5hdGl2ZSBmcmFjdGlvbnMiLAotICAgICAgICAgICAgJ2EnLCAnZicsICdyJywgJ2MnICkKLSNlbmRpZgotCi0gIENPVkVSQUdFKCBwZXRpdGVfY2FwaXRhbHNfZnJvbV9jYXBpdGFscywgUEVUSVRFX0NBUElUQUxTX0ZST01fQ0FQSVRBTFMsCi0gICAgICAgICAgICAicGV0aXRlIGNhcGl0YWxzIGZyb20gY2FwaXRhbHMiLAotICAgICAgICAgICAgJ2MnLCAnMicsICdjJywgJ3AnICkKLQotICBDT1ZFUkFHRSggc21hbGxfY2FwaXRhbHNfZnJvbV9jYXBpdGFscywgU01BTExfQ0FQSVRBTFNfRlJPTV9DQVBJVEFMUywKLSAgICAgICAgICAgICJzbWFsbCBjYXBpdGFscyBmcm9tIGNhcGl0YWxzIiwKLSAgICAgICAgICAgICdjJywgJzInLCAncycsICdjJyApCi0KLSNpZiAwCi0gIC8qIFhYWDogT25seSBkaWdpdHMgYXJlIGluIHRoaXMgY292ZXJhZ2UsIGhvd2V2ZXIsIGJvdGggbm9ybWFsIHN0eWxlICovCi0gIC8qICAgICAgYW5kIG9sZHN0eWxlIHJlcHJlc2VudGF0aW9uIGZvcm1zIGFyZSBwb3NzaWJsZS4gICAgICAgICAgICAgICovCi0gIENPVkVSQUdFKCBkZW5vbWluYXRvcnMsIERFTk9NSU5BVE9SUywKLSAgICAgICAgICAgICJkZW5vbWluYXRvcnMiLAotICAgICAgICAgICAgJ2QnLCAnbicsICdvJywgJ20nICkKLSNlbmRpZgotCi0jaWYgMAotICAvKiBYWFg6IEl0J3Mgbm90IHBvc3NpYmxlIHRvIGRlZmluZSBibHVlIHpvbmUgY2hhcmFjdGVycyBpbiBhZHZhbmNlLiAqLwotICBDT1ZFUkFHRSggZnJhY3Rpb25zLCBGUkFDVElPTlMsCi0gICAgICAgICAgICAiZnJhY3Rpb25zIiwKLSAgICAgICAgICAgICdmJywgJ3InLCAnYScsICdjJyApCi0jZW5kaWYKLQotI2lmIDAKLSAgLyogWFhYOiBPbmx5IGRpZ2l0cyBhcmUgaW4gdGhpcyBjb3ZlcmFnZSwgaG93ZXZlciwgYm90aCBub3JtYWwgc3R5bGUgKi8KLSAgLyogICAgICBhbmQgb2xkc3R5bGUgcmVwcmVzZW50YXRpb24gZm9ybXMgYXJlIHBvc3NpYmxlLiAgICAgICAgICAgICAgKi8KLSAgQ09WRVJBR0UoIG51bWVyYXRvcnMsIE5VTUVSQVRPUlMsCi0gICAgICAgICAgICAibnVtZXJhdG9ycyIsCi0gICAgICAgICAgICAnbicsICd1JywgJ20nLCAncicgKQotI2VuZGlmCi0KLSAgQ09WRVJBR0UoIG9yZGluYWxzLCBPUkRJTkFMUywKLSAgICAgICAgICAgICJvcmRpbmFscyIsCi0gICAgICAgICAgICAnbycsICdyJywgJ2QnLCAnbicgKQotCi0gIENPVkVSQUdFKCBwZXRpdGVfY2FwaXRhbHMsIFBFVElURV9DQVBJVEFMUywKLSAgICAgICAgICAgICJwZXRpdGUgY2FwaXRhbHMiLAotICAgICAgICAgICAgJ3AnLCAnYycsICdhJywgJ3AnICkKLQotICBDT1ZFUkFHRSggcnVieSwgUlVCWSwKLSAgICAgICAgICAgICJydWJ5IiwKLSAgICAgICAgICAgICdyJywgJ3UnLCAnYicsICd5JyApCi0KLSAgQ09WRVJBR0UoIHNjaWVudGlmaWNfaW5mZXJpb3JzLCBTQ0lFTlRJRklDX0lORkVSSU9SUywKLSAgICAgICAgICAgICJzY2llbnRpZmljIGluZmVyaW9ycyIsCi0gICAgICAgICAgICAncycsICdpJywgJ24nLCAnZicgKQotCi0gIENPVkVSQUdFKCBzbWFsbF9jYXBpdGFscywgU01BTExfQ0FQSVRBTFMsCi0gICAgICAgICAgICAic21hbGwgY2FwaXRhbHMiLAotICAgICAgICAgICAgJ3MnLCAnbScsICdjJywgJ3AnICkKLQotICBDT1ZFUkFHRSggc3Vic2NyaXB0LCBTVUJTQ1JJUFQsCi0gICAgICAgICAgICAic3Vic2NyaXB0IiwKLSAgICAgICAgICAgICdzJywgJ3UnLCAnYicsICdzJyApCi0KLSAgQ09WRVJBR0UoIHN1cGVyc2NyaXB0LCBTVVBFUlNDUklQVCwKLSAgICAgICAgICAgICJzdXBlcnNjcmlwdCIsCi0gICAgICAgICAgICAncycsICd1JywgJ3AnLCAncycgKQotCi0gIENPVkVSQUdFKCB0aXRsaW5nLCBUSVRMSU5HLAotICAgICAgICAgICAgInRpdGxpbmciLAotICAgICAgICAgICAgJ3QnLCAnaScsICd0JywgJ2wnICkKLQotI2lmIDAKLSAgLyogdG8gYmUgYWx3YXlzIGV4Y2x1ZGVkICovCi0gIENPVkVSQUdFKG5hbHQsICduJywgJ2EnLCAnbCcsICd0Jyk7IC8qIEFsdGVybmF0ZSBBbm5vdGF0aW9uIEZvcm1zICg/KSAqLwotICBDT1ZFUkFHRShvcm5tLCAnbycsICdyJywgJ24nLCAnbScpOyAvKiBPcm5hbWVudHMgKD8pICovCi0jZW5kaWYKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmZHVtbXkuYyBiL3NyYy9hdXRvZml0L2FmZHVtbXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjMzJkYi4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmR1bW15LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmR1bW15LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgZHVtbXkgcm91dGluZXMgdG8gYmUgdXNlZCBpZiBubyBoaW50aW5nIHNob3VsZCBiZSAgICAgICAgKi8KLS8qICAgIHBlcmZvcm1lZCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYWZkdW1teS5oIgotI2luY2x1ZGUgImFmaGludHMuaCIKLSNpbmNsdWRlICJhZmVycm9ycy5oIgotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2R1bW15X2hpbnRzX2luaXQoIEFGX0dseXBoSGludHMgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX1N0eWxlTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgbWV0cmljcyApOwotCi0gICAgaGludHMtPnhfc2NhbGUgPSBtZXRyaWNzLT5zY2FsZXIueF9zY2FsZTsKLSAgICBoaW50cy0+eV9zY2FsZSA9IG1ldHJpY3MtPnNjYWxlci55X3NjYWxlOwotICAgIGhpbnRzLT54X2RlbHRhID0gbWV0cmljcy0+c2NhbGVyLnhfZGVsdGE7Ci0gICAgaGludHMtPnlfZGVsdGEgPSBtZXRyaWNzLT5zY2FsZXIueV9kZWx0YTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9kdW1teV9oaW50c19hcHBseSggRlRfVUludCAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgIG91dGxpbmUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0gICAgRlRfVU5VU0VEKCBnbHlwaF9pbmRleCApOwotCi0KLSAgICBlcnJvciA9IGFmX2dseXBoX2hpbnRzX3JlbG9hZCggaGludHMsIG91dGxpbmUgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBhZl9nbHlwaF9oaW50c19zYXZlKCBoaW50cywgb3V0bGluZSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBBRl9ERUZJTkVfV1JJVElOR19TWVNURU1fQ0xBU1MoCi0gICAgYWZfZHVtbXlfd3JpdGluZ19zeXN0ZW1fY2xhc3MsCi0KLSAgICBBRl9XUklUSU5HX1NZU1RFTV9EVU1NWSwKLQotICAgIHNpemVvZiAoIEFGX1N0eWxlTWV0cmljc1JlYyApLAotCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fSW5pdE1ldHJpY3NGdW5jKSBOVUxMLCAgICAgICAgICAgICAgICAvKiBzdHlsZV9tZXRyaWNzX2luaXQgICAgKi8KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9TY2FsZU1ldHJpY3NGdW5jKU5VTEwsICAgICAgICAgICAgICAgIC8qIHN0eWxlX21ldHJpY3Nfc2NhbGUgICAqLwotICAgIChBRl9Xcml0aW5nU3lzdGVtX0RvbmVNZXRyaWNzRnVuYykgTlVMTCwgICAgICAgICAgICAgICAgLyogc3R5bGVfbWV0cmljc19kb25lICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fR2V0U3RkV2lkdGhzRnVuYylOVUxMLCAgICAgICAgICAgICAgICAvKiBzdHlsZV9tZXRyaWNzX2dldHN0ZHcgKi8KLQotICAgIChBRl9Xcml0aW5nU3lzdGVtX0luaXRIaW50c0Z1bmMpICAgYWZfZHVtbXlfaGludHNfaW5pdCwgLyogc3R5bGVfaGludHNfaW5pdCAgICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fQXBwbHlIaW50c0Z1bmMpICBhZl9kdW1teV9oaW50c19hcHBseSAvKiBzdHlsZV9oaW50c19hcHBseSAgICAgKi8KLSAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZkdW1teS5oIGIvc3JjL2F1dG9maXQvYWZkdW1teS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmFhN2Q3Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmZHVtbXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmZHVtbXkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBkdW1teSByb3V0aW5lcyB0byBiZSB1c2VkIGlmIG5vIGhpbnRpbmcgc2hvdWxkIGJlICAgICAgICAqLwotLyogICAgcGVyZm9ybWVkIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZEVU1NWV9IXwotI2RlZmluZSBBRkRVTU1ZX0hfCi0KLSNpbmNsdWRlICJhZnR5cGVzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyogQSBkdW1teSB3cml0aW5nIHN5c3RlbSB1c2VkIHdoZW4gbm8gaGludGluZyBzaG91bGQgYmUgcGVyZm9ybWVkLiAqLwotCi0gIEFGX0RFQ0xBUkVfV1JJVElOR19TWVNURU1fQ0xBU1MoIGFmX2R1bW15X3dyaXRpbmdfc3lzdGVtX2NsYXNzICkKLQotLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBBRkRVTU1ZX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmVycm9ycy5oIGIvc3JjL2F1dG9maXQvYWZlcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlMTgyZi4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG9maXR0ZXIgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBBdXRvZml0dGVyIGVycm9yIGVudW1lcmF0aW9uICAgICAgICAgICovCi0gIC8qIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQUZFUlJPUlNfSF8KLSNkZWZpbmUgQUZFUlJPUlNfSF8KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBGVEVSUk9SU19IXwotCi0jdW5kZWYgIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgQUZfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0F1dG9maXQKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIEFGRVJST1JTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIGIvc3JjL2F1dG9maXQvYWZnbG9iYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViZWYwMC4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmdsb2JhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmZ2xvYmFsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciByb3V0aW5lcyB0byBjb21wdXRlIGdsb2JhbCBoaW50aW5nIHZhbHVlcyAoYm9keSkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImFmZ2xvYmFsLmgiCi0jaW5jbHVkZSAiYWZyYW5nZXMuaCIKLSNpbmNsdWRlICJhZnNoYXBlci5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYWZnbG9iYWwKLQotCi0gIC8qIGdldCB3cml0aW5nIHN5c3RlbSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMgKi8KLSN1bmRlZiAgV1JJVElOR19TWVNURU0KLSNkZWZpbmUgV1JJVElOR19TWVNURU0oIHdzLCBXUyApICAvKiBlbXB0eSAqLwotI2luY2x1ZGUgImFmd3J0c3lzLmgiCi0KLSNpbmNsdWRlICJhZmVycm9ycy5oIgotI2luY2x1ZGUgImFmcGljLmgiCi0KLQotI3VuZGVmICBTQ1JJUFQKLSNkZWZpbmUgU0NSSVBUKCBzLCBTLCBkLCBoLCBILCBzcyApICAgICAgICAgXAotICAgICAgICAgIEFGX0RFRklORV9TQ1JJUFRfQ0xBU1MoICAgICAgICAgICBcCi0gICAgICAgICAgICBhZl8gIyMgcyAjIyBfc2NyaXB0X2NsYXNzLCAgICAgIFwKLSAgICAgICAgICAgIEFGX1NDUklQVF8gIyMgUywgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYWZfICMjIHMgIyMgX3VuaXJhbmdlcywgICAgICAgICBcCi0gICAgICAgICAgICBhZl8gIyMgcyAjIyBfbm9uYmFzZV91bmlyYW5nZXMsIFwKLSAgICAgICAgICAgIEFGXyAjIyBILCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgc3MgKQotCi0jaW5jbHVkZSAiYWZzY3JpcHQuaCIKLQotCi0jdW5kZWYgIFNUWUxFCi0jZGVmaW5lIFNUWUxFKCBzLCBTLCBkLCB3cywgc2MsIHNzLCBjICkgIFwKLSAgICAgICAgICBBRl9ERUZJTkVfU1RZTEVfQ0xBU1MoICAgICAgICAgXAotICAgICAgICAgICAgYWZfICMjIHMgIyMgX3N0eWxlX2NsYXNzLCAgICBcCi0gICAgICAgICAgICBBRl9TVFlMRV8gIyMgUywgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgc2MsICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBzcywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGMgKQotCi0jaW5jbHVkZSAiYWZzdHlsZXMuaCIKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSN1bmRlZiAgV1JJVElOR19TWVNURU0KLSNkZWZpbmUgV1JJVElOR19TWVNURU0oIHdzLCBXUyApICAgICAgICAgICAgICAgXAotICAgICAgICAgICZhZl8gIyMgd3MgIyMgX3dyaXRpbmdfc3lzdGVtX2NsYXNzLAotCi0gIEZUX0xPQ0FMX0FSUkFZX0RFRiggQUZfV3JpdGluZ1N5c3RlbUNsYXNzICkKLSAgYWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlc1tdID0KLSAgewotCi0jaW5jbHVkZSAiYWZ3cnRzeXMuaCIKLQotICAgIE5VTEwgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgfTsKLQotCi0jdW5kZWYgIFNDUklQVAotI2RlZmluZSBTQ1JJUFQoIHMsIFMsIGQsIGgsIEgsIHNzICkgICBcCi0gICAgICAgICAgJmFmXyAjIyBzICMjIF9zY3JpcHRfY2xhc3MsCi0KLSAgRlRfTE9DQUxfQVJSQVlfREVGKCBBRl9TY3JpcHRDbGFzcyApCi0gIGFmX3NjcmlwdF9jbGFzc2VzW10gPQotICB7Ci0KLSNpbmNsdWRlICJhZnNjcmlwdC5oIgotCi0gICAgTlVMTCAgLyogZG8gbm90IHJlbW92ZSAqLwotICB9OwotCi0KLSN1bmRlZiAgU1RZTEUKLSNkZWZpbmUgU1RZTEUoIHMsIFMsIGQsIHdzLCBzYywgc3MsIGMgKSBcCi0gICAgICAgICAgJmFmXyAjIyBzICMjIF9zdHlsZV9jbGFzcywKLQotICBGVF9MT0NBTF9BUlJBWV9ERUYoIEFGX1N0eWxlQ2xhc3MgKQotICBhZl9zdHlsZV9jbGFzc2VzW10gPQotICB7Ci0KLSNpbmNsdWRlICJhZnN0eWxlcy5oIgotCi0gICAgTlVMTCAgLyogZG8gbm90IHJlbW92ZSAqLwotICB9OwotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSN1bmRlZiAgU1RZTEUKLSNkZWZpbmUgU1RZTEUoIHMsIFMsIGQsIHdzLCBzYywgc3MsIGMgKSAgI3MsCi0KLSAgRlRfTE9DQUxfQVJSQVlfREVGKCBjaGFyKiApCi0gIGFmX3N0eWxlX25hbWVzW10gPQotICB7Ci0KLSNpbmNsdWRlICJhZnN0eWxlcy5oIgotCi0gIH07Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSAgLyogQ29tcHV0ZSB0aGUgc3R5bGUgaW5kZXggb2YgZWFjaCBnbHlwaCB3aXRoaW4gYSBnaXZlbiBmYWNlLiAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zdHlsZV9jb3ZlcmFnZSggQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfRmFjZSAgICAgZmFjZSAgICAgICAgPSBnbG9iYWxzLT5mYWNlOwotICAgIEZUX0NoYXJNYXAgIG9sZF9jaGFybWFwID0gZmFjZS0+Y2hhcm1hcDsKLSAgICBGVF9VU2hvcnQqICBnc3R5bGVzICAgICA9IGdsb2JhbHMtPmdseXBoX3N0eWxlczsKLSAgICBGVF9VSW50ICAgICBzczsKLSAgICBGVF9VSW50ICAgICBpOwotICAgIEZUX1VJbnQgICAgIGRmbHQgICAgICAgID0gfjBVOyAvKiBhIG5vbi12YWxpZCB2YWx1ZSAqLwotCi0KLSAgICAvKiB0aGUgdmFsdWUgQUZfU1RZTEVfVU5BU1NJR05FRCBtZWFucyBgdW5jb3ZlcmVkIGdseXBoJyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgKEZUX1VJbnQpZ2xvYmFscy0+Z2x5cGhfY291bnQ7IGkrKyApCi0gICAgICBnc3R5bGVzW2ldID0gQUZfU1RZTEVfVU5BU1NJR05FRDsKLQotICAgIGVycm9yID0gRlRfU2VsZWN0X0NoYXJtYXAoIGZhY2UsIEZUX0VOQ09ESU5HX1VOSUNPREUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogSWdub3JlIHRoaXMgZXJyb3I7IHdlIHNpbXBseSB1c2UgdGhlIGZhbGxiYWNrIHN0eWxlLgotICAgICAgICogWFhYOiBTaG91bGRuJ3Qgd2UgcmF0aGVyIGRpc2FibGUgaGludGluZz8KLSAgICAgICAqLwotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogc2NhbiBlYWNoIHN0eWxlIGluIGEgVW5pY29kZSBjaGFybWFwICovCi0gICAgZm9yICggc3MgPSAwOyBBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc107IHNzKysgKQotICAgIHsKLSAgICAgIEFGX1N0eWxlQ2xhc3MgICAgICAgc3R5bGVfY2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NUWUxFX0NMQVNTRVNfR0VUW3NzXTsKLSAgICAgIEFGX1NjcmlwdENsYXNzICAgICAgc2NyaXB0X2NsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TQ1JJUFRfQ0xBU1NFU19HRVRbc3R5bGVfY2xhc3MtPnNjcmlwdF07Ci0gICAgICBBRl9TY3JpcHRfVW5pUmFuZ2UgIHJhbmdlOwotCi0KLSAgICAgIGlmICggIXNjcmlwdF9jbGFzcy0+c2NyaXB0X3VuaV9yYW5nZXMgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyoKLSAgICAgICAqICBTY2FuIGFsbCBVbmljb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgYW5kIHNldCB0aGUgY29ycmVzcG9uZGluZwotICAgICAgICogIGdseXBoIHN0eWxlIGluZGV4LgotICAgICAgICovCi0gICAgICBpZiAoIHN0eWxlX2NsYXNzLT5jb3ZlcmFnZSA9PSBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAoRlRfVUludClzdHlsZV9jbGFzcy0+c2NyaXB0ID09Ci0gICAgICAgICAgICAgZ2xvYmFscy0+bW9kdWxlLT5kZWZhdWx0X3NjcmlwdCApCi0gICAgICAgICAgZGZsdCA9IHNzOwotCi0gICAgICAgIGZvciAoIHJhbmdlID0gc2NyaXB0X2NsYXNzLT5zY3JpcHRfdW5pX3JhbmdlczsKLSAgICAgICAgICAgICAgcmFuZ2UtPmZpcnN0ICE9IDA7Ci0gICAgICAgICAgICAgIHJhbmdlKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlID0gcmFuZ2UtPmZpcnN0OwotICAgICAgICAgIEZUX1VJbnQgICBnaW5kZXg7Ci0KLQotICAgICAgICAgIGdpbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCBjaGFyY29kZSApOwotCi0gICAgICAgICAgaWYgKCBnaW5kZXggIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBnaW5kZXggPCAoRlRfVUxvbmcpZ2xvYmFscy0+Z2x5cGhfY291bnQgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAoIGdzdHlsZXNbZ2luZGV4XSAmIEFGX1NUWUxFX01BU0sgKSA9PSBBRl9TVFlMRV9VTkFTU0lHTkVEICkKLSAgICAgICAgICAgIGdzdHlsZXNbZ2luZGV4XSA9IChGVF9VU2hvcnQpc3M7Ci0KLSAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXJjb2RlID0gRlRfR2V0X05leHRfQ2hhciggZmFjZSwgY2hhcmNvZGUsICZnaW5kZXggKTsKLQotICAgICAgICAgICAgaWYgKCBnaW5kZXggPT0gMCB8fCBjaGFyY29kZSA+IHJhbmdlLT5sYXN0ICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmICggZ2luZGV4IDwgKEZUX1VMb25nKWdsb2JhbHMtPmdseXBoX2NvdW50ICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAoIGdzdHlsZXNbZ2luZGV4XSAmIEFGX1NUWUxFX01BU0sgKSA9PSBBRl9TVFlMRV9VTkFTU0lHTkVEICkKLSAgICAgICAgICAgICAgZ3N0eWxlc1tnaW5kZXhdID0gKEZUX1VTaG9ydClzczsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBkbyB0aGUgc2FtZSBmb3IgdGhlIHNjcmlwdCdzIG5vbi1iYXNlIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgZm9yICggcmFuZ2UgPSBzY3JpcHRfY2xhc3MtPnNjcmlwdF91bmlfbm9uYmFzZV9yYW5nZXM7Ci0gICAgICAgICAgICAgIHJhbmdlLT5maXJzdCAhPSAwOwotICAgICAgICAgICAgICByYW5nZSsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSA9IHJhbmdlLT5maXJzdDsKLSAgICAgICAgICBGVF9VSW50ICAgZ2luZGV4OwotCi0KLSAgICAgICAgICBnaW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleCggZmFjZSwgY2hhcmNvZGUgKTsKLQotICAgICAgICAgIGlmICggZ2luZGV4ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgZ2luZGV4IDwgKEZUX1VMb25nKWdsb2JhbHMtPmdseXBoX2NvdW50ICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgKCBnc3R5bGVzW2dpbmRleF0gJiBBRl9TVFlMRV9NQVNLICkgPT0gKEZUX1VTaG9ydClzcyApCi0gICAgICAgICAgICBnc3R5bGVzW2dpbmRleF0gfD0gQUZfTk9OQkFTRTsKLQotICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhcmNvZGUgPSBGVF9HZXRfTmV4dF9DaGFyKCBmYWNlLCBjaGFyY29kZSwgJmdpbmRleCApOwotCi0gICAgICAgICAgICBpZiAoIGdpbmRleCA9PSAwIHx8IGNoYXJjb2RlID4gcmFuZ2UtPmxhc3QgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKCBnaW5kZXggPCAoRlRfVUxvbmcpZ2xvYmFscy0+Z2x5cGhfY291bnQgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICggZ3N0eWxlc1tnaW5kZXhdICYgQUZfU1RZTEVfTUFTSyApID09IChGVF9VU2hvcnQpc3MgKQotICAgICAgICAgICAgICBnc3R5bGVzW2dpbmRleF0gfD0gQUZfTk9OQkFTRTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogZ2V0IGdseXBocyBub3QgZGlyZWN0bHkgYWRkcmVzc2FibGUgYnkgY21hcCAqLwotICAgICAgICBhZl9zaGFwZXJfZ2V0X2NvdmVyYWdlKCBnbG9iYWxzLCBzdHlsZV9jbGFzcywgZ3N0eWxlcywgMCApOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGhhbmRsZSB0aGUgcmVtYWluaW5nIGRlZmF1bHQgT3BlblR5cGUgZmVhdHVyZXMgLi4uICovCi0gICAgZm9yICggc3MgPSAwOyBBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc107IHNzKysgKQotICAgIHsKLSAgICAgIEFGX1N0eWxlQ2xhc3MgIHN0eWxlX2NsYXNzID0gQUZfU1RZTEVfQ0xBU1NFU19HRVRbc3NdOwotCi0KLSAgICAgIGlmICggc3R5bGVfY2xhc3MtPmNvdmVyYWdlID09IEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotICAgICAgICBhZl9zaGFwZXJfZ2V0X2NvdmVyYWdlKCBnbG9iYWxzLCBzdHlsZV9jbGFzcywgZ3N0eWxlcywgMCApOwotICAgIH0KLQotICAgIC8qIC4uLiBhbmQgZmluYWxseSB0aGUgZGVmYXVsdCBPcGVuVHlwZSBmZWF0dXJlcyBvZiB0aGUgZGVmYXVsdCBzY3JpcHQgKi8KLSAgICBhZl9zaGFwZXJfZ2V0X2NvdmVyYWdlKCBnbG9iYWxzLCBBRl9TVFlMRV9DTEFTU0VTX0dFVFtkZmx0XSwgZ3N0eWxlcywgMSApOwotCi0gICAgLyogbWFyayBBU0NJSSBkaWdpdHMgKi8KLSAgICBmb3IgKCBpID0gMHgzMDsgaSA8PSAweDM5OyBpKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGdpbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCBpICk7Ci0KLQotICAgICAgaWYgKCBnaW5kZXggIT0gMCAmJiBnaW5kZXggPCAoRlRfVUxvbmcpZ2xvYmFscy0+Z2x5cGhfY291bnQgKQotICAgICAgICBnc3R5bGVzW2dpbmRleF0gfD0gQUZfRElHSVQ7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgLyoKLSAgICAgKiAgQnkgZGVmYXVsdCwgYWxsIHVuY292ZXJlZCBnbHlwaHMgYXJlIHNldCB0byB0aGUgZmFsbGJhY2sgc3R5bGUuCi0gICAgICogIFhYWDogU2hvdWxkbid0IHdlIGRpc2FibGUgaGludGluZyBvciBkbyBzb21ldGhpbmcgc2ltaWxhcj8KLSAgICAgKi8KLSAgICBpZiAoIGdsb2JhbHMtPm1vZHVsZS0+ZmFsbGJhY2tfc3R5bGUgIT0gQUZfU1RZTEVfVU5BU1NJR05FRCApCi0gICAgewotICAgICAgRlRfTG9uZyAgbm47Ci0KLQotICAgICAgZm9yICggbm4gPSAwOyBubiA8IGdsb2JhbHMtPmdseXBoX2NvdW50OyBubisrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAoIGdzdHlsZXNbbm5dICYgQUZfU1RZTEVfTUFTSyApID09IEFGX1NUWUxFX1VOQVNTSUdORUQgKQotICAgICAgICB7Ci0gICAgICAgICAgZ3N0eWxlc1tubl0gJj0gfkFGX1NUWUxFX01BU0s7Ci0gICAgICAgICAgZ3N0eWxlc1tubl0gfD0gZ2xvYmFscy0+bW9kdWxlLT5mYWxsYmFja19zdHlsZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSAgICBGVF9UUkFDRTQoKCAiXG4iCi0gICAgICAgICAgICAgICAgInN0eWxlIGNvdmVyYWdlXG4iCi0gICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09XG4iCi0gICAgICAgICAgICAgICAgIlxuIiApKTsKLQotICAgIGZvciAoIHNzID0gMDsgQUZfU1RZTEVfQ0xBU1NFU19HRVRbc3NdOyBzcysrICkKLSAgICB7Ci0gICAgICBBRl9TdHlsZUNsYXNzICBzdHlsZV9jbGFzcyA9IEFGX1NUWUxFX0NMQVNTRVNfR0VUW3NzXTsKLSAgICAgIEZUX1VJbnQgICAgICAgIGNvdW50ICAgICAgID0gMDsKLSAgICAgIEZUX0xvbmcgICAgICAgIGlkeDsKLQotCi0gICAgICBGVF9UUkFDRTQoKCAiJXM6XG4iLCBhZl9zdHlsZV9uYW1lc1tzdHlsZV9jbGFzcy0+c3R5bGVdICkpOwotCi0gICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBnbG9iYWxzLT5nbHlwaF9jb3VudDsgaWR4KysgKQotICAgICAgewotICAgICAgICBpZiAoICggZ3N0eWxlc1tpZHhdICYgQUZfU1RZTEVfTUFTSyApID09IHN0eWxlX2NsYXNzLT5zdHlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICEoIGNvdW50ICUgMTAgKSApCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiICIgKSk7Ci0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgaWR4ICkpOwotICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICBpZiAoICEoIGNvdW50ICUgMTAgKSApCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWNvdW50ICkKLSAgICAgICAgRlRfVFJBQ0U0KCggIiAgKG5vbmUpXG4iICkpOwotICAgICAgaWYgKCBjb3VudCAlIDEwICkKLSAgICAgICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0gICAgRlRfU2V0X0NoYXJtYXAoIGZhY2UsIG9sZF9jaGFybWFwICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfZmFjZV9nbG9iYWxzX25ldyggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBBRl9GYWNlR2xvYmFscyAgKmFnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICBBRl9Nb2R1bGUgICAgICAgIG1vZHVsZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeTsKLSAgICBBRl9GYWNlR2xvYmFscyAgZ2xvYmFscyA9IE5VTEw7Ci0KLQotICAgIG1lbW9yeSA9IGZhY2UtPm1lbW9yeTsKLQotICAgIC8qIHdlIGFsbG9jYXRlIGFuIEFGX0ZhY2VHbG9iYWxzIHN0cnVjdHVyZSB0b2dldGhlciAqLwotICAgIC8qIHdpdGggdGhlIGdseXBoX3N0eWxlcyBhcnJheSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggRlRfQUxMT0MoIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mICggKmdsb2JhbHMgKSArCi0gICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpZmFjZS0+bnVtX2dseXBocyAqIHNpemVvZiAoIEZUX1VTaG9ydCApICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ2xvYmFscy0+ZmFjZSAgICAgICAgICAgICAgICAgICAgICA9IGZhY2U7Ci0gICAgZ2xvYmFscy0+Z2x5cGhfY291bnQgICAgICAgICAgICAgICA9IGZhY2UtPm51bV9nbHlwaHM7Ci0gICAgLyogcmlnaHQgYWZ0ZXIgdGhlIGdsb2JhbHMgc3RydWN0dXJlIGNvbWUgdGhlIGdseXBoIHN0eWxlcyAqLwotICAgIGdsb2JhbHMtPmdseXBoX3N0eWxlcyAgICAgICAgICAgICAgPSAoRlRfVVNob3J0KikoIGdsb2JhbHMgKyAxICk7Ci0gICAgZ2xvYmFscy0+bW9kdWxlICAgICAgICAgICAgICAgICAgICA9IG1vZHVsZTsKLSAgICBnbG9iYWxzLT5zdGVtX2RhcmtlbmluZ19mb3JfcHBlbSAgID0gMDsKLSAgICBnbG9iYWxzLT5kYXJrZW5feCAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBnbG9iYWxzLT5kYXJrZW5feSAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBnbG9iYWxzLT5zdGFuZGFyZF92ZXJ0aWNhbF93aWR0aCAgID0gMDsKLSAgICBnbG9iYWxzLT5zdGFuZGFyZF9ob3Jpem9udGFsX3dpZHRoID0gMDsKLSAgICBnbG9iYWxzLT5zY2FsZV9kb3duX2ZhY3RvciAgICAgICAgID0gMDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaCi0gICAgZ2xvYmFscy0+aGJfZm9udCA9IGhiX2Z0X2ZvbnRfY3JlYXRlKCBmYWNlLCBOVUxMICk7Ci0gICAgZ2xvYmFscy0+aGJfYnVmICA9IGhiX2J1ZmZlcl9jcmVhdGUoKTsKLSNlbmRpZgotCi0gICAgZXJyb3IgPSBhZl9mYWNlX2dsb2JhbHNfY29tcHV0ZV9zdHlsZV9jb3ZlcmFnZSggZ2xvYmFscyApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGFmX2ZhY2VfZ2xvYmFsc19mcmVlKCBnbG9iYWxzICk7Ci0gICAgICBnbG9iYWxzID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZ2xvYmFscy0+aW5jcmVhc2VfeF9oZWlnaHQgPSBBRl9QUk9QX0lOQ1JFQVNFX1hfSEVJR0hUX01BWDsKLQotICBFeGl0OgotICAgICphZ2xvYmFscyA9IGdsb2JhbHM7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9mYWNlX2dsb2JhbHNfZnJlZSggQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMgKQotICB7Ci0gICAgaWYgKCBnbG9iYWxzICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGdsb2JhbHMtPmZhY2UtPm1lbW9yeTsKLSAgICAgIEZUX1VJbnQgICAgbm47Ci0KLQotICAgICAgZm9yICggbm4gPSAwOyBubiA8IEFGX1NUWUxFX01BWDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggZ2xvYmFscy0+bWV0cmljc1tubl0gKQotICAgICAgICB7Ci0gICAgICAgICAgQUZfU3R5bGVDbGFzcyAgICAgICAgICBzdHlsZV9jbGFzcyA9Ci0gICAgICAgICAgICBBRl9TVFlMRV9DTEFTU0VTX0dFVFtubl07Ci0gICAgICAgICAgQUZfV3JpdGluZ1N5c3RlbUNsYXNzICB3cml0aW5nX3N5c3RlbV9jbGFzcyA9Ci0gICAgICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9DTEFTU0VTX0dFVFtzdHlsZV9jbGFzcy0+d3JpdGluZ19zeXN0ZW1dOwotCi0KLSAgICAgICAgICBpZiAoIHdyaXRpbmdfc3lzdGVtX2NsYXNzLT5zdHlsZV9tZXRyaWNzX2RvbmUgKQotICAgICAgICAgICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MtPnN0eWxlX21ldHJpY3NfZG9uZSggZ2xvYmFscy0+bWV0cmljc1tubl0gKTsKLQotICAgICAgICAgIEZUX0ZSRUUoIGdsb2JhbHMtPm1ldHJpY3Nbbm5dICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaCi0gICAgICBoYl9mb250X2Rlc3Ryb3koIGdsb2JhbHMtPmhiX2ZvbnQgKTsKLSAgICAgIGhiX2J1ZmZlcl9kZXN0cm95KCBnbG9iYWxzLT5oYl9idWYgKTsKLSNlbmRpZgotCi0gICAgICAvKiBubyBuZWVkIHRvIGZyZWUgYGdsb2JhbHMtPmdseXBoX3N0eWxlcyc7ICovCi0gICAgICAvKiBpdCBpcyBwYXJ0IG9mIHRoZSBgZ2xvYmFscycgYXJyYXkgICAgICAgICovCi0gICAgICBGVF9GUkVFKCBnbG9iYWxzICk7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfZmFjZV9nbG9iYWxzX2dldF9tZXRyaWNzKCBBRl9GYWNlR2xvYmFscyAgICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1N0eWxlTWV0cmljcyAgKmFtZXRyaWNzICkKLSAgewotICAgIEFGX1N0eWxlTWV0cmljcyAgbWV0cmljcyA9IE5VTEw7Ci0KLSAgICBBRl9TdHlsZSAgICAgICAgICAgICAgIHN0eWxlID0gKEFGX1N0eWxlKW9wdGlvbnM7Ci0gICAgQUZfV3JpdGluZ1N5c3RlbUNsYXNzICB3cml0aW5nX3N5c3RlbV9jbGFzczsKLSAgICBBRl9TdHlsZUNsYXNzICAgICAgICAgIHN0eWxlX2NsYXNzOwotCi0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUxvbmcpZ2xvYmFscy0+Z2x5cGhfY291bnQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBpZiB3ZSBoYXZlIGEgZm9yY2VkIHN0eWxlICh2aWEgYG9wdGlvbnMnKSwgdXNlIGl0LCAqLwotICAgIC8qIG90aGVyd2lzZSBsb29rIGludG8gYGdseXBoX3N0eWxlcycgYXJyYXkgICAgICAgICAgICovCi0gICAgaWYgKCBzdHlsZSA9PSBBRl9TVFlMRV9OT05FX0RGTFQgfHwgc3R5bGUgKyAxID49IEFGX1NUWUxFX01BWCApCi0gICAgICBzdHlsZSA9IChBRl9TdHlsZSkoIGdsb2JhbHMtPmdseXBoX3N0eWxlc1tnaW5kZXhdICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU1RZTEVfVU5BU1NJR05FRCAgICAgICAgICAgKTsKLQotICAgIHN0eWxlX2NsYXNzICAgICAgICAgID0gQUZfU1RZTEVfQ0xBU1NFU19HRVRbc3R5bGVdOwotICAgIHdyaXRpbmdfc3lzdGVtX2NsYXNzID0gQUZfV1JJVElOR19TWVNURU1fQ0xBU1NFU19HRVQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlX2NsYXNzLT53cml0aW5nX3N5c3RlbV07Ci0KLSAgICBtZXRyaWNzID0gZ2xvYmFscy0+bWV0cmljc1tzdHlsZV07Ci0gICAgaWYgKCAhbWV0cmljcyApCi0gICAgewotICAgICAgLyogY3JlYXRlIHRoZSBnbG9iYWwgbWV0cmljcyBvYmplY3QgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGdsb2JhbHMtPmZhY2UtPm1lbW9yeTsKLQotCi0gICAgICBpZiAoIEZUX0FMTE9DKCBtZXRyaWNzLCB3cml0aW5nX3N5c3RlbV9jbGFzcy0+c3R5bGVfbWV0cmljc19zaXplICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIG1ldHJpY3MtPnN0eWxlX2NsYXNzID0gc3R5bGVfY2xhc3M7Ci0gICAgICBtZXRyaWNzLT5nbG9iYWxzICAgICA9IGdsb2JhbHM7Ci0KLSAgICAgIGlmICggd3JpdGluZ19zeXN0ZW1fY2xhc3MtPnN0eWxlX21ldHJpY3NfaW5pdCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gd3JpdGluZ19zeXN0ZW1fY2xhc3MtPnN0eWxlX21ldHJpY3NfaW5pdCggbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzLT5mYWNlICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCB3cml0aW5nX3N5c3RlbV9jbGFzcy0+c3R5bGVfbWV0cmljc19kb25lICkKLSAgICAgICAgICAgIHdyaXRpbmdfc3lzdGVtX2NsYXNzLT5zdHlsZV9tZXRyaWNzX2RvbmUoIG1ldHJpY3MgKTsKLQotICAgICAgICAgIEZUX0ZSRUUoIG1ldHJpY3MgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZ2xvYmFscy0+bWV0cmljc1tzdHlsZV0gPSBtZXRyaWNzOwotICAgIH0KLQotICBFeGl0OgotICAgICphbWV0cmljcyA9IG1ldHJpY3M7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIGFmX2ZhY2VfZ2xvYmFsc19pc19kaWdpdCggQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdpbmRleCApCi0gIHsKLSAgICBpZiAoIGdpbmRleCA8IChGVF9VTG9uZylnbG9iYWxzLT5nbHlwaF9jb3VudCApCi0gICAgICByZXR1cm4gKEZUX0Jvb2wpKCBnbG9iYWxzLT5nbHlwaF9zdHlsZXNbZ2luZGV4XSAmIEFGX0RJR0lUICk7Ci0KLSAgICByZXR1cm4gKEZUX0Jvb2wpMDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZnbG9iYWwuaCBiL3NyYy9hdXRvZml0L2FmZ2xvYmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjE0MmUuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZnbG9iYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmdsb2JhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgcm91dGluZXMgdG8gY29tcHV0ZSBnbG9iYWwgaGludGluZyB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEFGR0xPQkFMX0hfCi0jZGVmaW5lIEFGR0xPQkFMX0hfCi0KLQotI2luY2x1ZGUgImFmdHlwZXMuaCIKLSNpbmNsdWRlICJhZm1vZHVsZS5oIgotI2luY2x1ZGUgImFmc2hhcGVyLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTF9BUlJBWSggQUZfV3JpdGluZ1N5c3RlbUNsYXNzICkKLSAgYWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlc1tdOwotCi0KLSN1bmRlZiAgU0NSSVBUCi0jZGVmaW5lIFNDUklQVCggcywgUywgZCwgaCwgSCwgc3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgQUZfREVDTEFSRV9TQ1JJUFRfQ0xBU1MoIGFmXyAjIyBzICMjIF9zY3JpcHRfY2xhc3MgKQotCi0jaW5jbHVkZSAiYWZzY3JpcHQuaCIKLQotICBGVF9MT0NBTF9BUlJBWSggQUZfU2NyaXB0Q2xhc3MgKQotICBhZl9zY3JpcHRfY2xhc3Nlc1tdOwotCi0KLSN1bmRlZiAgU1RZTEUKLSNkZWZpbmUgU1RZTEUoIHMsIFMsIGQsIHdzLCBzYywgc3MsIGMgKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgQUZfREVDTEFSRV9TVFlMRV9DTEFTUyggYWZfICMjIHMgIyMgX3N0eWxlX2NsYXNzICkKLQotI2luY2x1ZGUgImFmc3R5bGVzLmgiCi0KLSAgRlRfTE9DQUxfQVJSQVkoIEFGX1N0eWxlQ2xhc3MgKQotICBhZl9zdHlsZV9jbGFzc2VzW107Ci0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gIEZUX0xPQ0FMX0FSUkFZKCBjaGFyKiApCi0gIGFmX3N0eWxlX25hbWVzW107Ci0jZW5kaWYKLQotCi0gIC8qCi0gICAqICBEZWZhdWx0IHZhbHVlcyBhbmQgZmxhZ3MgZm9yIGJvdGggYXV0b2ZpdHRlciBnbG9iYWxzIChmb3VuZCBpbgotICAgKiAgQUZfTW9kdWxlUmVjKSBhbmQgZmFjZSBnbG9iYWxzIChpbiBBRl9GYWNlR2xvYmFsc1JlYykuCi0gICAqLwotCi0gIC8qIGluZGV4IG9mIGZhbGxiYWNrIHN0eWxlIGluIGBhZl9zdHlsZV9jbGFzc2VzJyAqLwotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fQ0pLCi0jZGVmaW5lIEFGX1NUWUxFX0ZBTExCQUNLICAgIEFGX1NUWUxFX0hBTklfREZMVAotI2Vsc2UKLSNkZWZpbmUgQUZfU1RZTEVfRkFMTEJBQ0sgICAgQUZfU1RZTEVfTk9ORV9ERkxUCi0jZW5kaWYKLSAgLyogZGVmYXVsdCBzY3JpcHQgZm9yIE9wZW5UeXBlOyBpZ25vcmVkIGlmIEhhcmZCdXp6IGlzbid0IHVzZWQgKi8KLSNkZWZpbmUgQUZfU0NSSVBUX0RFRkFVTFQgICAgQUZfU0NSSVBUX0xBVE4KLQotICAvKiBhIGJpdCBtYXNrIGZvciBBRl9ESUdJVCBhbmQgQUZfTk9OQkFTRSAqLwotI2RlZmluZSBBRl9TVFlMRV9NQVNLICAgICAgICAweDNGRkYKLSAgLyogYW4gdW5jb3ZlcmVkIGdseXBoICAgICAgKi8KLSNkZWZpbmUgQUZfU1RZTEVfVU5BU1NJR05FRCAgQUZfU1RZTEVfTUFTSwotCi0gIC8qIGlmIHRoaXMgZmxhZyBpcyBzZXQsIHdlIGhhdmUgYW4gQVNDSUkgZGlnaXQgICAqLwotI2RlZmluZSBBRl9ESUdJVCAgICAgICAgICAgICAweDgwMDBVCi0gIC8qIGlmIHRoaXMgZmxhZyBpcyBzZXQsIHdlIGhhdmUgYSBub24tYmFzZSBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgQUZfTk9OQkFTRSAgICAgICAgICAgMHg0MDAwVQotCi0gIC8qIGBpbmNyZWFzZS14LWhlaWdodCcgcHJvcGVydHkgKi8KLSNkZWZpbmUgQUZfUFJPUF9JTkNSRUFTRV9YX0hFSUdIVF9NSU4gIDYKLSNkZWZpbmUgQUZfUFJPUF9JTkNSRUFTRV9YX0hFSUdIVF9NQVggIDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgIEYgQSBDIEUgICBHIEwgTyBCIEEgTCBTICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiAgTm90ZSB0aGF0IGdseXBoX3N0eWxlc1tdIG1hcHMgZWFjaCBnbHlwaCB0byBhbiBpbmRleCBpbnRvIHRoZQotICAgKiAgYGFmX3N0eWxlX2NsYXNzZXMnIGFycmF5LgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX0ZhY2VHbG9iYWxzUmVjXwotICB7Ci0gICAgRlRfRmFjZSAgICAgICAgICBmYWNlOwotICAgIEZUX0xvbmcgICAgICAgICAgZ2x5cGhfY291bnQ7ICAgIC8qIHNhbWUgYXMgZmFjZS0+bnVtX2dseXBocyAqLwotICAgIEZUX1VTaG9ydCogICAgICAgZ2x5cGhfc3R5bGVzOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWloKLSAgICBoYl9mb250X3QqICAgICAgIGhiX2ZvbnQ7Ci0gICAgaGJfYnVmZmVyX3QqICAgICBoYl9idWY7ICAgICAgICAgICAvKiBmb3IgZmVhdHVyZSBjb21wYXJpc29uICovCi0jZW5kaWYKLQotICAgIC8qIHBlci1mYWNlIGF1dG8taGludGVyIHByb3BlcnRpZXMgKi8KLSAgICBGVF9VSW50ICAgICAgICAgIGluY3JlYXNlX3hfaGVpZ2h0OwotCi0gICAgQUZfU3R5bGVNZXRyaWNzICBtZXRyaWNzW0FGX1NUWUxFX01BWF07Ci0KLSAgICAvKiBDb21wdXRlIGRhcmtlbmluZyBhbW91bnQgb25jZSBwZXIgc2l6ZS4gIFVzZSB0aGlzIHRvIGNoZWNrIHdoZXRoZXIgKi8KLSAgICAvKiBkYXJrZW5fe3gseX0gbmVlZHMgdG8gYmUgcmVjb21wdXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VU2hvcnQgICAgICAgIHN0ZW1fZGFya2VuaW5nX2Zvcl9wcGVtOwotICAgIC8qIENvcHkgZnJvbSBlLmcuIEFGX0xhdGluTWV0cmljcy5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXSAqLwotICAgIC8qIHRvIGNvbXB1dGUgdGhlIGRhcmtlbmluZyBhbW91bnQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1BvcyAgICAgICAgICAgc3RhbmRhcmRfdmVydGljYWxfd2lkdGg7Ci0gICAgLyogQ29weSBmcm9tIGUuZy4gQUZfTGF0aW5NZXRyaWNzLmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdICovCi0gICAgLyogdG8gY29tcHV0ZSB0aGUgZGFya2VuaW5nIGFtb3VudC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfUG9zICAgICAgICAgICBzdGFuZGFyZF9ob3Jpem9udGFsX3dpZHRoOwotICAgIC8qIFRoZSBhY3R1YWwgYW1vdW50IHRvIGRhcmtlbiBhIGdseXBoIGFsb25nIHRoZSBYIGF4aXMuICovCi0gICAgRlRfUG9zICAgICAgICAgICBkYXJrZW5feDsKLSAgICAvKiBUaGUgYWN0dWFsIGFtb3VudCB0byBkYXJrZW4gYSBnbHlwaCBhbG9uZyB0aGUgWSBheGlzLiAqLwotICAgIEZUX1BvcyAgICAgICAgICAgZGFya2VuX3k7Ci0gICAgLyogQW1vdW50IHRvIHNjYWxlIGRvd24gYnkgdG8ga2VlcCBlbWJvbGRlbmVkIHBvaW50cyAqLwotICAgIC8qIG9uIHRoZSBZLWF4aXMgaW4gcHJlLWNvbXB1dGVkIGJsdWUgem9uZXMuICAgICAgICAgKi8KLSAgICBGVF9GaXhlZCAgICAgICAgIHNjYWxlX2Rvd25fZmFjdG9yOwotICAgIEFGX01vZHVsZSAgICAgICAgbW9kdWxlOyAgICAgICAgIC8qIHRvIGFjY2VzcyBnbG9iYWwgcHJvcGVydGllcyAqLwotCi0gIH0gQUZfRmFjZUdsb2JhbHNSZWM7Ci0KLQotICAvKgotICAgKiAgbW9kZWwgdGhlIGdsb2JhbCBoaW50cyBkYXRhIGZvciBhIGdpdmVuIGZhY2UsIGRlY29tcG9zZWQgaW50bwotICAgKiAgc3R5bGUtc3BlY2lmaWMgaXRlbXMKLSAgICovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfZmFjZV9nbG9iYWxzX25ldyggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBBRl9GYWNlR2xvYmFscyAgKmFnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICBBRl9Nb2R1bGUgICAgICAgIG1vZHVsZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmX2ZhY2VfZ2xvYmFsc19nZXRfbWV0cmljcyggQUZfRmFjZUdsb2JhbHMgICAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TdHlsZU1ldHJpY3MgICphbWV0cmljcyApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfZmFjZV9nbG9iYWxzX2ZyZWUoIEFGX0ZhY2VHbG9iYWxzICBnbG9iYWxzICk7Ci0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgYWZfZmFjZV9nbG9iYWxzX2lzX2RpZ2l0KCBBRl9GYWNlR2xvYmFscyAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2luZGV4ICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBBRkdMT0JBTF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZoaW50cy5jIGIvc3JjL2F1dG9maXQvYWZoaW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZmMGJhLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmaGludHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZoaW50cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYWZoaW50cy5oIgotI2luY2x1ZGUgImFmZXJyb3JzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2FmaGludHMKLQotCi0gIC8qIEdldCBuZXcgc2VnbWVudCBmb3IgZ2l2ZW4gYXhpcy4gKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfYXhpc19oaW50c19uZXdfc2VnbWVudCggQUZfQXhpc0hpbnRzICBheGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU2VnbWVudCAgICphc2VnbWVudCApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEFGX1NlZ21lbnQgIHNlZ21lbnQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGF4aXMtPm51bV9zZWdtZW50cyA8IEFGX1NFR01FTlRTX0VNQkVEREVEICkKLSAgICB7Ci0gICAgICBpZiAoICFheGlzLT5zZWdtZW50cyApCi0gICAgICB7Ci0gICAgICAgIGF4aXMtPnNlZ21lbnRzICAgICA9IGF4aXMtPmVtYmVkZGVkLnNlZ21lbnRzOwotICAgICAgICBheGlzLT5tYXhfc2VnbWVudHMgPSBBRl9TRUdNRU5UU19FTUJFRERFRDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIGF4aXMtPm51bV9zZWdtZW50cyA+PSBheGlzLT5tYXhfc2VnbWVudHMgKQotICAgIHsKLSAgICAgIEZUX0ludCAgb2xkX21heCA9IGF4aXMtPm1heF9zZWdtZW50czsKLSAgICAgIEZUX0ludCAgbmV3X21heCA9IG9sZF9tYXg7Ci0gICAgICBGVF9JbnQgIGJpZ19tYXggPSAoRlRfSW50KSggRlRfSU5UX01BWCAvIHNpemVvZiAoICpzZWdtZW50ICkgKTsKLQotCi0gICAgICBpZiAoIG9sZF9tYXggPj0gYmlnX21heCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBuZXdfbWF4ICs9ICggbmV3X21heCA+PiAyICkgKyA0OwotICAgICAgaWYgKCBuZXdfbWF4IDwgb2xkX21heCB8fCBuZXdfbWF4ID4gYmlnX21heCApCi0gICAgICAgIG5ld19tYXggPSBiaWdfbWF4OwotCi0gICAgICBpZiAoIGF4aXMtPnNlZ21lbnRzID09IGF4aXMtPmVtYmVkZGVkLnNlZ21lbnRzICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGF4aXMtPnNlZ21lbnRzLCBuZXdfbWF4ICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgZnRfbWVtY3B5KCBheGlzLT5zZWdtZW50cywgYXhpcy0+ZW1iZWRkZWQuc2VnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mICggYXhpcy0+ZW1iZWRkZWQuc2VnbWVudHMgKSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBheGlzLT5zZWdtZW50cywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGF4aXMtPm1heF9zZWdtZW50cyA9IG5ld19tYXg7Ci0gICAgfQotCi0gICAgc2VnbWVudCA9IGF4aXMtPnNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzKys7Ci0KLSAgRXhpdDoKLSAgICAqYXNlZ21lbnQgPSBzZWdtZW50OwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogR2V0IG5ldyBlZGdlIGZvciBnaXZlbiBheGlzLCBkaXJlY3Rpb24sIGFuZCBwb3NpdGlvbiwgKi8KLSAgLyogd2l0aG91dCBpbml0aWFsaXppbmcgdGhlIGVkZ2UgaXRzZWxmLiAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9heGlzX2hpbnRzX25ld19lZGdlKCBBRl9BeGlzSGludHMgIGF4aXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgZnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGlyZWN0aW9uICBkaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgdG9wX3RvX2JvdHRvbV9oaW50aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICphbmVkZ2UgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEFGX0VkZ2UgICBlZGdlICA9IE5VTEw7Ci0gICAgQUZfRWRnZSAgIGVkZ2VzOwotCi0KLSAgICBpZiAoIGF4aXMtPm51bV9lZGdlcyA8IEFGX0VER0VTX0VNQkVEREVEICkKLSAgICB7Ci0gICAgICBpZiAoICFheGlzLT5lZGdlcyApCi0gICAgICB7Ci0gICAgICAgIGF4aXMtPmVkZ2VzICAgICA9IGF4aXMtPmVtYmVkZGVkLmVkZ2VzOwotICAgICAgICBheGlzLT5tYXhfZWRnZXMgPSBBRl9FREdFU19FTUJFRERFRDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIGF4aXMtPm51bV9lZGdlcyA+PSBheGlzLT5tYXhfZWRnZXMgKQotICAgIHsKLSAgICAgIEZUX0ludCAgb2xkX21heCA9IGF4aXMtPm1heF9lZGdlczsKLSAgICAgIEZUX0ludCAgbmV3X21heCA9IG9sZF9tYXg7Ci0gICAgICBGVF9JbnQgIGJpZ19tYXggPSAoRlRfSW50KSggRlRfSU5UX01BWCAvIHNpemVvZiAoICplZGdlICkgKTsKLQotCi0gICAgICBpZiAoIG9sZF9tYXggPj0gYmlnX21heCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBuZXdfbWF4ICs9ICggbmV3X21heCA+PiAyICkgKyA0OwotICAgICAgaWYgKCBuZXdfbWF4IDwgb2xkX21heCB8fCBuZXdfbWF4ID4gYmlnX21heCApCi0gICAgICAgIG5ld19tYXggPSBiaWdfbWF4OwotCi0gICAgICBpZiAoIGF4aXMtPmVkZ2VzID09IGF4aXMtPmVtYmVkZGVkLmVkZ2VzICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGF4aXMtPmVkZ2VzLCBuZXdfbWF4ICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgZnRfbWVtY3B5KCBheGlzLT5lZGdlcywgYXhpcy0+ZW1iZWRkZWQuZWRnZXMsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mICggYXhpcy0+ZW1iZWRkZWQuZWRnZXMgKSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBheGlzLT5lZGdlcywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGF4aXMtPm1heF9lZGdlcyA9IG5ld19tYXg7Ci0gICAgfQotCi0gICAgZWRnZXMgPSBheGlzLT5lZGdlczsKLSAgICBlZGdlICA9IGVkZ2VzICsgYXhpcy0+bnVtX2VkZ2VzOwotCi0gICAgd2hpbGUgKCBlZGdlID4gZWRnZXMgKQotICAgIHsKLSAgICAgIGlmICggdG9wX3RvX2JvdHRvbV9oaW50aW5nID8gKCBlZGdlWy0xXS5mcG9zID4gZnBvcyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICggZWRnZVstMV0uZnBvcyA8IGZwb3MgKSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiB3ZSB3YW50IHRoZSBlZGdlIHdpdGggc2FtZSBwb3NpdGlvbiBhbmQgbWlub3IgZGlyZWN0aW9uICovCi0gICAgICAvKiB0byBhcHBlYXIgYmVmb3JlIHRob3NlIGluIHRoZSBtYWpvciBvbmUgaW4gdGhlIGxpc3QgICAgICovCi0gICAgICBpZiAoIGVkZ2VbLTFdLmZwb3MgPT0gZnBvcyAmJiBkaXIgPT0gYXhpcy0+bWFqb3JfZGlyICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGVkZ2VbMF0gPSBlZGdlWy0xXTsKLSAgICAgIGVkZ2UtLTsKLSAgICB9Ci0KLSAgICBheGlzLT5udW1fZWRnZXMrKzsKLQotICBFeGl0OgotICAgICphbmVkZ2UgPSBlZGdlOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNpZmRlZiBGVF9ERUJVR19BVVRPRklUCi0KLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotICAvKiBUaGUgZHVtcCBmdW5jdGlvbnMgYXJlIHVzZWQgaW4gdGhlIGBmdGdyaWQnIGRlbW8gcHJvZ3JhbSwgdG9vLiAqLwotI2RlZmluZSBBRl9EVU1QKCB2YXJmb3JtYXQgKSAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCB0b19zdGRvdXQgKSAgICAgICAgICBcCi0gICAgICAgICAgICAgIHByaW50ZiB2YXJmb3JtYXQ7ICAgICAgIFwKLSAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBGVF9UUkFDRTcoIHZhcmZvcm1hdCApOyBcCi0gICAgICAgICAgfSB3aGlsZSAoIDAgKQotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIGFmX2Rpcl9zdHIoIEFGX0RpcmVjdGlvbiAgZGlyICkKLSAgewotICAgIGNvbnN0IGNoYXIqICByZXN1bHQ7Ci0KLQotICAgIHN3aXRjaCAoIGRpciApCi0gICAgewotICAgIGNhc2UgQUZfRElSX1VQOgotICAgICAgcmVzdWx0ID0gInVwIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQUZfRElSX0RPV046Ci0gICAgICByZXN1bHQgPSAiZG93biI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFGX0RJUl9MRUZUOgotICAgICAgcmVzdWx0ID0gImxlZnQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBRl9ESVJfUklHSFQ6Ci0gICAgICByZXN1bHQgPSAicmlnaHQiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJlc3VsdCA9ICJub25lIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotI2RlZmluZSBBRl9JTkRFWF9OVU0oIHB0ciwgYmFzZSApICAoaW50KSggKHB0cikgPyAoIChwdHIpIC0gKGJhc2UpICkgOiAtMSApCi0KLQotICBzdGF0aWMgY2hhcioKLSAgYWZfcHJpbnRfaWR4KCBjaGFyKiBwLAotICAgICAgICAgICAgICAgIGludCAgIGlkeCApCi0gIHsKLSAgICBpZiAoIGlkeCA9PSAtMSApCi0gICAgewotICAgICAgcFswXSA9ICctJzsKLSAgICAgIHBbMV0gPSAnLSc7Ci0gICAgICBwWzJdID0gJ1wwJzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZnRfc3ByaW50ZiggcCwgIiVkIiwgaWR4ICk7Ci0KLSAgICByZXR1cm4gcDsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBhZl9nZXRfc2VnbWVudF9pbmRleCggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBwb2ludF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBkaW1lbnNpb24gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICA9ICZoaW50cy0+YXhpc1tkaW1lbnNpb25dOwotICAgIEFGX1BvaW50ICAgICAgcG9pbnQgICAgPSBoaW50cy0+cG9pbnRzICsgcG9pbnRfaWR4OwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMgPSBheGlzLT5zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIGxpbWl0ICAgID0gc2VnbWVudHMgKyBheGlzLT5udW1fc2VnbWVudHM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50OwotCi0KLSAgICBmb3IgKCBzZWdtZW50ID0gc2VnbWVudHM7IHNlZ21lbnQgPCBsaW1pdDsgc2VnbWVudCsrICkKLSAgICB7Ci0gICAgICBpZiAoIHNlZ21lbnQtPmZpcnN0IDw9IHNlZ21lbnQtPmxhc3QgKQotICAgICAgewotICAgICAgICBpZiAoIHBvaW50ID49IHNlZ21lbnQtPmZpcnN0ICYmIHBvaW50IDw9IHNlZ21lbnQtPmxhc3QgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBBRl9Qb2ludCAgcCA9IHNlZ21lbnQtPmZpcnN0OwotCi0KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGlmICggcG9pbnQgPT0gcCApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBpZiAoIHAgPT0gc2VnbWVudC0+bGFzdCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHAgPSBwLT5uZXh0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgaWYgKCBzZWdtZW50ID09IGxpbWl0ICkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIHJldHVybiAoaW50KSggc2VnbWVudCAtIHNlZ21lbnRzICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgYWZfZ2V0X2VkZ2VfaW5kZXgoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgc2VnbWVudF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBkaW1lbnNpb24gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgID0gJmhpbnRzLT5heGlzW2RpbWVuc2lvbl07Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlcyAgID0gYXhpcy0+ZWRnZXM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50ID0gYXhpcy0+c2VnbWVudHMgKyBzZWdtZW50X2lkeDsKLQotCi0gICAgcmV0dXJuIHNlZ21lbnRfaWR4ID09IC0xID8gLTEgOiBBRl9JTkRFWF9OVU0oIHNlZ21lbnQtPmVkZ2UsIGVkZ2VzICk7Ci0gIH0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLSAgdm9pZAotICBhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICB0b19zdGRvdXQgKQotICB7Ci0gICAgQUZfUG9pbnQgICBwb2ludHMgID0gaGludHMtPnBvaW50czsKLSAgICBBRl9Qb2ludCAgIGxpbWl0ICAgPSBwb2ludHMgKyBoaW50cy0+bnVtX3BvaW50czsKLSAgICBBRl9Qb2ludCogIGNvbnRvdXIgPSBoaW50cy0+Y29udG91cnM7Ci0gICAgQUZfUG9pbnQqICBjbGltaXQgID0gY29udG91ciArIGhpbnRzLT5udW1fY29udG91cnM7Ci0gICAgQUZfUG9pbnQgICBwb2ludDsKLQotCi0gICAgQUZfRFVNUCgoICJUYWJsZSBvZiBwb2ludHM6XG4iICkpOwotCi0gICAgaWYgKCBoaW50cy0+bnVtX3BvaW50cyApCi0gICAgICBBRl9EVU1QKCggIiAgaW5kZXggIGhlZGdlICBoc2VnICB2ZWRnZSAgdnNlZyAgZmxhZ3MgIgotICAgICAgICAgICAgICAgICIgIHhvcmcgIHlvcmcgIHhzY2FsZSAgeXNjYWxlICAgeGZpdCAgICB5Zml0IiApKTsKLSAgICBlbHNlCi0gICAgICBBRl9EVU1QKCggIiAgKG5vbmUpXG4iICkpOwotCi0gICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgbGltaXQ7IHBvaW50KysgKQotICAgIHsKLSAgICAgIGludCAgcG9pbnRfaWR4ICAgICA9IEFGX0lOREVYX05VTSggcG9pbnQsIHBvaW50cyApOwotICAgICAgaW50ICBzZWdtZW50X2lkeF8wID0gYWZfZ2V0X3NlZ21lbnRfaW5kZXgoIGhpbnRzLCBwb2ludF9pZHgsIDAgKTsKLSAgICAgIGludCAgc2VnbWVudF9pZHhfMSA9IGFmX2dldF9zZWdtZW50X2luZGV4KCBoaW50cywgcG9pbnRfaWR4LCAxICk7Ci0KLSAgICAgIGNoYXIgIGJ1ZjFbMTZdLCBidWYyWzE2XSwgYnVmM1sxNl0sIGJ1ZjRbMTZdOwotCi0KLSAgICAgIC8qIGluc2VydCBleHRyYSBuZXdsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb250b3VyICovCi0gICAgICBpZiAoIGNvbnRvdXIgPCBjbGltaXQgJiYgKmNvbnRvdXIgPT0gcG9pbnQgKQotICAgICAgewotICAgICAgICBBRl9EVU1QKCggIlxuIiApKTsKLSAgICAgICAgY29udG91cisrOwotICAgICAgfQotCi0gICAgICBBRl9EVU1QKCggIiAgJTVkICAlNXMgJTVzICAlNXMgJTVzICAlcyIKLSAgICAgICAgICAgICAgICAiICU1ZCAlNWQgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmZcbiIsCi0gICAgICAgICAgICAgICAgcG9pbnRfaWR4LAotICAgICAgICAgICAgICAgIGFmX3ByaW50X2lkeCggYnVmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmX2dldF9lZGdlX2luZGV4KCBoaW50cywgc2VnbWVudF9pZHhfMSwgMSApICksCi0gICAgICAgICAgICAgICAgYWZfcHJpbnRfaWR4KCBidWYyLCBzZWdtZW50X2lkeF8xICksCi0gICAgICAgICAgICAgICAgYWZfcHJpbnRfaWR4KCBidWYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZfZ2V0X2VkZ2VfaW5kZXgoIGhpbnRzLCBzZWdtZW50X2lkeF8wLCAwICkgKSwKLSAgICAgICAgICAgICAgICBhZl9wcmludF9pZHgoIGJ1ZjQsIHNlZ21lbnRfaWR4XzAgKSwKLSAgICAgICAgICAgICAgICAoIHBvaW50LT5mbGFncyAmIEFGX0ZMQUdfTkVBUiApCi0gICAgICAgICAgICAgICAgICA/ICIgbmVhciAiCi0gICAgICAgICAgICAgICAgICA6ICggcG9pbnQtPmZsYWdzICYgQUZfRkxBR19XRUFLX0lOVEVSUE9MQVRJT04gKQotICAgICAgICAgICAgICAgICAgICA/ICIgd2VhayAiCi0gICAgICAgICAgICAgICAgICAgIDogInN0cm9uZyIsCi0KLSAgICAgICAgICAgICAgICBwb2ludC0+ZngsCi0gICAgICAgICAgICAgICAgcG9pbnQtPmZ5LAotICAgICAgICAgICAgICAgIHBvaW50LT5veCAvIDY0LjAsCi0gICAgICAgICAgICAgICAgcG9pbnQtPm95IC8gNjQuMCwKLSAgICAgICAgICAgICAgICBwb2ludC0+eCAvIDY0LjAsCi0gICAgICAgICAgICAgICAgcG9pbnQtPnkgLyA2NC4wICkpOwotICAgIH0KLSAgICBBRl9EVU1QKCggIlxuIiApKTsKLSAgfQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gIH0KLSNlbmRpZgotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIGFmX2VkZ2VfZmxhZ3NfdG9fc3RyaW5nKCBGVF9VSW50ICBmbGFncyApCi0gIHsKLSAgICBzdGF0aWMgY2hhciAgdGVtcFszMl07Ci0gICAgaW50ICAgICAgICAgIHBvcyA9IDA7Ci0KLQotICAgIGlmICggZmxhZ3MgJiBBRl9FREdFX1JPVU5EICkKLSAgICB7Ci0gICAgICBmdF9tZW1jcHkoIHRlbXAgKyBwb3MsICJyb3VuZCIsIDUgKTsKLSAgICAgIHBvcyArPSA1OwotICAgIH0KLSAgICBpZiAoIGZsYWdzICYgQUZfRURHRV9TRVJJRiApCi0gICAgewotICAgICAgaWYgKCBwb3MgPiAwICkKLSAgICAgICAgdGVtcFtwb3MrK10gPSAnICc7Ci0gICAgICBmdF9tZW1jcHkoIHRlbXAgKyBwb3MsICJzZXJpZiIsIDUgKTsKLSAgICAgIHBvcyArPSA1OwotICAgIH0KLSAgICBpZiAoIHBvcyA9PSAwICkKLSAgICAgIHJldHVybiAibm9ybWFsIjsKLQotICAgIHRlbXBbcG9zXSA9ICdcMCc7Ci0KLSAgICByZXR1cm4gdGVtcDsKLSAgfQotCi0KLSAgLyogRHVtcCB0aGUgYXJyYXkgb2YgbGlua2VkIHNlZ21lbnRzLiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLSAgdm9pZAotICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgdG9fc3Rkb3V0ICkKLSAgewotICAgIEZUX0ludCAgZGltZW5zaW9uOwotCi0KLSAgICBmb3IgKCBkaW1lbnNpb24gPSAxOyBkaW1lbnNpb24gPj0gMDsgZGltZW5zaW9uLS0gKQotICAgIHsKLSAgICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgICAgPSAmaGludHMtPmF4aXNbZGltZW5zaW9uXTsKLSAgICAgIEFGX1BvaW50ICAgICAgcG9pbnRzICAgPSBoaW50cy0+cG9pbnRzOwotICAgICAgQUZfRWRnZSAgICAgICBlZGdlcyAgICA9IGF4aXMtPmVkZ2VzOwotICAgICAgQUZfU2VnbWVudCAgICBzZWdtZW50cyA9IGF4aXMtPnNlZ21lbnRzOwotICAgICAgQUZfU2VnbWVudCAgICBsaW1pdCAgICA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgICAgQUZfU2VnbWVudCAgICBzZWc7Ci0KLSAgICAgIGNoYXIgIGJ1ZjFbMTZdLCBidWYyWzE2XSwgYnVmM1sxNl07Ci0KLQotICAgICAgQUZfRFVNUCgoICJUYWJsZSBvZiAlcyBzZWdtZW50czpcbiIsCi0gICAgICAgICAgICAgICAgZGltZW5zaW9uID09IEFGX0RJTUVOU0lPTl9IT1JaID8gInZlcnRpY2FsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJob3Jpem9udGFsIiApKTsKLSAgICAgIGlmICggYXhpcy0+bnVtX3NlZ21lbnRzICkKLSAgICAgICAgQUZfRFVNUCgoICIgIGluZGV4ICAgcG9zICAgZGVsdGEgICBkaXIgICBmcm9tICAgdG8gIgotICAgICAgICAgICAgICAgICAgIiAgbGluayAgc2VyaWYgIGVkZ2UiCi0gICAgICAgICAgICAgICAgICAiICBoZWlnaHQgIGV4dHJhICAgICBmbGFnc1xuIiApKTsKLSAgICAgIGVsc2UKLSAgICAgICAgQUZfRFVNUCgoICIgIChub25lKVxuIiApKTsKLQotICAgICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IGxpbWl0OyBzZWcrKyApCi0gICAgICAgIEFGX0RVTVAoKCAiICAlNWQgICU1ZCAgJTVkICAlNXMgICU0ZCAgJTRkIgotICAgICAgICAgICAgICAgICAgIiAgJTRzICAlNXMgICU0cyIKLSAgICAgICAgICAgICAgICAgICIgICU2ZCAgJTVkICAlMTFzXG4iLAotICAgICAgICAgICAgICAgICAgQUZfSU5ERVhfTlVNKCBzZWcsIHNlZ21lbnRzICksCi0gICAgICAgICAgICAgICAgICBzZWctPnBvcywKLSAgICAgICAgICAgICAgICAgIHNlZy0+ZGVsdGEsCi0gICAgICAgICAgICAgICAgICBhZl9kaXJfc3RyKCAoQUZfRGlyZWN0aW9uKXNlZy0+ZGlyICksCi0gICAgICAgICAgICAgICAgICBBRl9JTkRFWF9OVU0oIHNlZy0+Zmlyc3QsIHBvaW50cyApLAotICAgICAgICAgICAgICAgICAgQUZfSU5ERVhfTlVNKCBzZWctPmxhc3QsIHBvaW50cyApLAotCi0gICAgICAgICAgICAgICAgICBhZl9wcmludF9pZHgoIGJ1ZjEsIEFGX0lOREVYX05VTSggc2VnLT5saW5rLCBzZWdtZW50cyApICksCi0gICAgICAgICAgICAgICAgICBhZl9wcmludF9pZHgoIGJ1ZjIsIEFGX0lOREVYX05VTSggc2VnLT5zZXJpZiwgc2VnbWVudHMgKSApLAotICAgICAgICAgICAgICAgICAgYWZfcHJpbnRfaWR4KCBidWYzLCBBRl9JTkRFWF9OVU0oIHNlZy0+ZWRnZSwgZWRnZXMgKSApLAotCi0gICAgICAgICAgICAgICAgICBzZWctPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgIHNlZy0+aGVpZ2h0IC0gKCBzZWctPm1heF9jb29yZCAtIHNlZy0+bWluX2Nvb3JkICksCi0gICAgICAgICAgICAgICAgICBhZl9lZGdlX2ZsYWdzX3RvX3N0cmluZyggc2VnLT5mbGFncyApICkpOwotICAgICAgQUZfRFVNUCgoICJcbiIgKSk7Ci0gICAgfQotICB9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLSAgfQotI2VuZGlmCi0KLQotICAvKiBGZXRjaCBudW1iZXIgb2Ygc2VnbWVudHMuICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICBleHRlcm4gIkMiIHsKLSNlbmRpZgotICBGVF9FcnJvcgotICBhZl9nbHlwaF9oaW50c19nZXRfbnVtX3NlZ21lbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgICAgICBudW1fc2VnbWVudHMgKQotICB7Ci0gICAgQUZfRGltZW5zaW9uICBkaW07Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzOwotCi0KLSAgICBkaW0gPSAoIGRpbWVuc2lvbiA9PSAwICkgPyBBRl9ESU1FTlNJT05fSE9SWiA6IEFGX0RJTUVOU0lPTl9WRVJUOwotCi0gICAgYXhpcyAgICAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgICpudW1fc2VnbWVudHMgPSBheGlzLT5udW1fc2VnbWVudHM7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLSAgfQotI2VuZGlmCi0KLQotICAvKiBGZXRjaCBvZmZzZXQgb2Ygc2VnbWVudHMgaW50byB1c2VyIHN1cHBsaWVkIG9mZnNldCBhcnJheS4gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gIGV4dGVybiAiQyIgewotI2VuZGlmCi0gIEZUX0Vycm9yCi0gIGFmX2dseXBoX2hpbnRzX2dldF9zZWdtZW50X29mZnNldCggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICpvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAqaXNfYmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICpibHVlX29mZnNldCApCi0gIHsKLSAgICBBRl9EaW1lbnNpb24gIGRpbTsKLSAgICBBRl9BeGlzSGludHMgIGF4aXM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWc7Ci0KLQotICAgIGlmICggIW9mZnNldCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGRpbSA9ICggZGltZW5zaW9uID09IDAgKSA/IEFGX0RJTUVOU0lPTl9IT1JaIDogQUZfRElNRU5TSU9OX1ZFUlQ7Ci0KLSAgICBheGlzID0gJmhpbnRzLT5heGlzW2RpbV07Ci0KLSAgICBpZiAoIGlkeCA8IDAgfHwgaWR4ID49IGF4aXMtPm51bV9zZWdtZW50cyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHNlZyAgICAgID0gJmF4aXMtPnNlZ21lbnRzW2lkeF07Ci0gICAgKm9mZnNldCAgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApID8gc2VnLT5maXJzdC0+b3gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZWctPmZpcnN0LT5veTsKLSAgICBpZiAoIHNlZy0+ZWRnZSApCi0gICAgICAqaXNfYmx1ZSA9IChGVF9Cb29sKSggc2VnLT5lZGdlLT5ibHVlX2VkZ2UgIT0gMCApOwotICAgIGVsc2UKLSAgICAgICppc19ibHVlID0gRkFMU0U7Ci0KLSAgICBpZiAoICppc19ibHVlICkKLSAgICAgICpibHVlX29mZnNldCA9IHNlZy0+ZWRnZS0+Ymx1ZV9lZGdlLT5jdXI7Ci0gICAgZWxzZQotICAgICAgKmJsdWVfb2Zmc2V0ID0gMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICB9Ci0jZW5kaWYKLQotCi0gIC8qIER1bXAgdGhlIGFycmF5IG9mIGxpbmtlZCBlZGdlcy4gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gIGV4dGVybiAiQyIgewotI2VuZGlmCi0gIHZvaWQKLSAgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIHRvX3N0ZG91dCApCi0gIHsKLSAgICBGVF9JbnQgIGRpbWVuc2lvbjsKLQotCi0gICAgZm9yICggZGltZW5zaW9uID0gMTsgZGltZW5zaW9uID49IDA7IGRpbWVuc2lvbi0tICkKLSAgICB7Ci0gICAgICBBRl9BeGlzSGludHMgIGF4aXMgID0gJmhpbnRzLT5heGlzW2RpbWVuc2lvbl07Ci0gICAgICBBRl9FZGdlICAgICAgIGVkZ2VzID0gYXhpcy0+ZWRnZXM7Ci0gICAgICBBRl9FZGdlICAgICAgIGxpbWl0ID0gZWRnZXMgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgICBBRl9FZGdlICAgICAgIGVkZ2U7Ci0KLSAgICAgIGNoYXIgIGJ1ZjFbMTZdLCBidWYyWzE2XTsKLQotCi0gICAgICAvKgotICAgICAgICogIG5vdGU6IEFGX0RJTUVOU0lPTl9IT1JaIGNvcnJlc3BvbmRzIHRvIF92ZXJ0aWNhbF8gZWRnZXMKLSAgICAgICAqICAgICAgICBzaW5jZSB0aGV5IGhhdmUgYSBjb25zdGFudCBYIGNvb3JkaW5hdGUuCi0gICAgICAgKi8KLSAgICAgIGlmICggZGltZW5zaW9uID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICAgICAgQUZfRFVNUCgoICJUYWJsZSBvZiAlcyBlZGdlcyAoMXB4PSUuMmZ1LCAxMHU9JS4yZnB4KTpcbiIsCi0gICAgICAgICAgICAgICAgICAidmVydGljYWwiLAotICAgICAgICAgICAgICAgICAgNjU1MzYuMCAqIDY0LjAgLyBoaW50cy0+eF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgIDEwLjAgKiBoaW50cy0+eF9zY2FsZSAvIDY1NTM2LjAgLyA2NC4wICkpOwotICAgICAgZWxzZQotICAgICAgICBBRl9EVU1QKCggIlRhYmxlIG9mICVzIGVkZ2VzICgxcHg9JS4yZnUsIDEwdT0lLjJmcHgpOlxuIiwKLSAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIiwKLSAgICAgICAgICAgICAgICAgIDY1NTM2LjAgKiA2NC4wIC8gaGludHMtPnlfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAxMC4wICogaGludHMtPnlfc2NhbGUgLyA2NTUzNi4wIC8gNjQuMCApKTsKLQotICAgICAgaWYgKCBheGlzLT5udW1fZWRnZXMgKQotICAgICAgICBBRl9EVU1QKCggIiAgaW5kZXggICAgcG9zICAgICBkaXIgICBsaW5rICBzZXJpZiIKLSAgICAgICAgICAgICAgICAgICIgIGJsdWUgICAgb3BvcyAgICAgcG9zICAgICAgIGZsYWdzXG4iICkpOwotICAgICAgZWxzZQotICAgICAgICBBRl9EVU1QKCggIiAgKG5vbmUpXG4iICkpOwotCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBsaW1pdDsgZWRnZSsrICkKLSAgICAgICAgQUZfRFVNUCgoICIgICU1ZCAgJTcuMmYgICU1cyAgJTRzICAlNXMiCi0gICAgICAgICAgICAgICAgICAiICAgICVjICAgJTcuMmYgICU3LjJmICAlMTFzXG4iLAotICAgICAgICAgICAgICAgICAgQUZfSU5ERVhfTlVNKCBlZGdlLCBlZGdlcyApLAotICAgICAgICAgICAgICAgICAgKGludCllZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgIGFmX2Rpcl9zdHIoIChBRl9EaXJlY3Rpb24pZWRnZS0+ZGlyICksCi0gICAgICAgICAgICAgICAgICBhZl9wcmludF9pZHgoIGJ1ZjEsIEFGX0lOREVYX05VTSggZWRnZS0+bGluaywgZWRnZXMgKSApLAotICAgICAgICAgICAgICAgICAgYWZfcHJpbnRfaWR4KCBidWYyLCBBRl9JTkRFWF9OVU0oIGVkZ2UtPnNlcmlmLCBlZGdlcyApICksCi0KLSAgICAgICAgICAgICAgICAgIGVkZ2UtPmJsdWVfZWRnZSA/ICd5JyA6ICduJywKLSAgICAgICAgICAgICAgICAgIGVkZ2UtPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgIGFmX2VkZ2VfZmxhZ3NfdG9fc3RyaW5nKCBlZGdlLT5mbGFncyApICkpOwotICAgICAgQUZfRFVNUCgoICJcbiIgKSk7Ci0gICAgfQotICB9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLSAgfQotI2VuZGlmCi0KLSN1bmRlZiBBRl9EVU1QCi0KLSNlbmRpZiAvKiAhRlRfREVCVUdfQVVUT0ZJVCAqLwotCi0KLSAgLyogQ29tcHV0ZSB0aGUgZGlyZWN0aW9uIHZhbHVlIG9mIGEgZ2l2ZW4gdmVjdG9yLiAqLwotCi0gIEZUX0xPQ0FMX0RFRiggQUZfRGlyZWN0aW9uICkKLSAgYWZfZGlyZWN0aW9uX2NvbXB1dGUoIEZUX1BvcyAgZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICkKLSAgewotICAgIEZUX1BvcyAgICAgICAgbGwsIHNzOyAgLyogbG9uZyBhbmQgc2hvcnQgYXJtIGxlbmd0aHMgKi8KLSAgICBBRl9EaXJlY3Rpb24gIGRpcjsgICAgIC8qIGNhbmRpZGF0ZSBkaXJlY3Rpb24gICAgICAgICovCi0KLQotICAgIGlmICggZHkgPj0gZHggKQotICAgIHsKLSAgICAgIGlmICggZHkgPj0gLWR4ICkKLSAgICAgIHsKLSAgICAgICAgZGlyID0gQUZfRElSX1VQOwotICAgICAgICBsbCAgPSBkeTsKLSAgICAgICAgc3MgID0gZHg7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpciA9IEFGX0RJUl9MRUZUOwotICAgICAgICBsbCAgPSAtZHg7Ci0gICAgICAgIHNzICA9IGR5OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qIGR5IDwgZHggKi8KLSAgICB7Ci0gICAgICBpZiAoIGR5ID49IC1keCApCi0gICAgICB7Ci0gICAgICAgIGRpciA9IEFGX0RJUl9SSUdIVDsKLSAgICAgICAgbGwgID0gZHg7Ci0gICAgICAgIHNzICA9IGR5OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkaXIgPSBBRl9ESVJfRE9XTjsKLSAgICAgICAgbGwgID0gLWR5OwotICAgICAgICBzcyAgPSBkeDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZXR1cm4gbm8gZGlyZWN0aW9uIGlmIGFybSBsZW5ndGhzIGRvIG5vdCBkaWZmZXIgZW5vdWdoICAgICAgICovCi0gICAgLyogKHZhbHVlIDE0IGlzIGhldXJpc3RpYywgY29ycmVzcG9uZGluZyB0byBhcHByb3guIDQuMSBkZWdyZWVzKSAqLwotICAgIC8qIHRoZSBsb25nIGFybSBpcyBuZXZlciBuZWdhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGxsIDw9IDE0ICogRlRfQUJTKCBzcyApICkKLSAgICAgIGRpciA9IEFGX0RJUl9OT05FOwotCi0gICAgcmV0dXJuIGRpcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfaW5pdCggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCi0gIHsKLSAgICAvKiBubyBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGVtYmVkZGVkIGl0ZW1zICovCi0gICAgRlRfTUVNX1pFUk8oIGhpbnRzLCBzaXplb2YgKCAqaGludHMgKSAtIHNpemVvZiAoIGhpbnRzLT5lbWJlZGRlZCApICk7Ci0gICAgaGludHMtPm1lbW9yeSA9IG1lbW9yeTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfZG9uZSggQUZfR2x5cGhIaW50cyAgaGludHMgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgaW50ICAgICAgICBkaW07Ci0KLQotICAgIGlmICggISggaGludHMgJiYgaGludHMtPm1lbW9yeSApICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IGhpbnRzLT5tZW1vcnk7Ci0KLSAgICAvKgotICAgICAqICBub3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBmcmVlIHRoZSBzZWdtZW50IGFuZCBlZGdlCi0gICAgICogIGJ1ZmZlcnMgc2luY2UgdGhleSBhcmUgcmVhbGx5IHdpdGhpbiB0aGUgaGludHMtPnBvaW50cyBhcnJheQotICAgICAqLwotICAgIGZvciAoIGRpbSA9IDA7IGRpbSA8IEFGX0RJTUVOU0lPTl9NQVg7IGRpbSsrICkKLSAgICB7Ci0gICAgICBBRl9BeGlzSGludHMgIGF4aXMgPSAmaGludHMtPmF4aXNbZGltXTsKLQotCi0gICAgICBheGlzLT5udW1fc2VnbWVudHMgPSAwOwotICAgICAgYXhpcy0+bWF4X3NlZ21lbnRzID0gMDsKLSAgICAgIGlmICggYXhpcy0+c2VnbWVudHMgIT0gYXhpcy0+ZW1iZWRkZWQuc2VnbWVudHMgKQotICAgICAgICBGVF9GUkVFKCBheGlzLT5zZWdtZW50cyApOwotCi0gICAgICBheGlzLT5udW1fZWRnZXMgPSAwOwotICAgICAgYXhpcy0+bWF4X2VkZ2VzID0gMDsKLSAgICAgIGlmICggYXhpcy0+ZWRnZXMgIT0gYXhpcy0+ZW1iZWRkZWQuZWRnZXMgKQotICAgICAgICBGVF9GUkVFKCBheGlzLT5lZGdlcyApOwotICAgIH0KLQotICAgIGlmICggaGludHMtPmNvbnRvdXJzICE9IGhpbnRzLT5lbWJlZGRlZC5jb250b3VycyApCi0gICAgICBGVF9GUkVFKCBoaW50cy0+Y29udG91cnMgKTsKLSAgICBoaW50cy0+bWF4X2NvbnRvdXJzID0gMDsKLSAgICBoaW50cy0+bnVtX2NvbnRvdXJzID0gMDsKLQotICAgIGlmICggaGludHMtPnBvaW50cyAhPSBoaW50cy0+ZW1iZWRkZWQucG9pbnRzICkKLSAgICAgIEZUX0ZSRUUoIGhpbnRzLT5wb2ludHMgKTsKLSAgICBoaW50cy0+bWF4X3BvaW50cyA9IDA7Ci0gICAgaGludHMtPm51bV9wb2ludHMgPSAwOwotCi0gICAgaGludHMtPm1lbW9yeSA9IE5VTEw7Ci0gIH0KLQotCi0gIC8qIFJlc2V0IG1ldHJpY3MuICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfcmVzY2FsZSggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU3R5bGVNZXRyaWNzICBtZXRyaWNzICkKLSAgewotICAgIGhpbnRzLT5tZXRyaWNzICAgICAgPSBtZXRyaWNzOwotICAgIGhpbnRzLT5zY2FsZXJfZmxhZ3MgPSBtZXRyaWNzLT5zY2FsZXIuZmxhZ3M7Ci0gIH0KLQotCi0gIC8qIFJlY29tcHV0ZSBhbGwgQUZfUG9pbnQgaW4gQUZfR2x5cGhIaW50cyBmcm9tIHRoZSBkZWZpbml0aW9ucyAqLwotICAvKiBpbiBhIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfZ2x5cGhfaGludHNfcmVsb2FkKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICBvdXRsaW5lICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgICA9IEZUX0Vycl9PazsKLSAgICBBRl9Qb2ludCAgIHBvaW50czsKLSAgICBGVF9VSW50ICAgIG9sZF9tYXgsIG5ld19tYXg7Ci0gICAgRlRfRml4ZWQgICB4X3NjYWxlID0gaGludHMtPnhfc2NhbGU7Ci0gICAgRlRfRml4ZWQgICB5X3NjYWxlID0gaGludHMtPnlfc2NhbGU7Ci0gICAgRlRfUG9zICAgICB4X2RlbHRhID0gaGludHMtPnhfZGVsdGE7Ci0gICAgRlRfUG9zICAgICB5X2RlbHRhID0gaGludHMtPnlfZGVsdGE7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgID0gaGludHMtPm1lbW9yeTsKLQotCi0gICAgaGludHMtPm51bV9wb2ludHMgICA9IDA7Ci0gICAgaGludHMtPm51bV9jb250b3VycyA9IDA7Ci0KLSAgICBoaW50cy0+YXhpc1swXS5udW1fc2VnbWVudHMgPSAwOwotICAgIGhpbnRzLT5heGlzWzBdLm51bV9lZGdlcyAgICA9IDA7Ci0gICAgaGludHMtPmF4aXNbMV0ubnVtX3NlZ21lbnRzID0gMDsKLSAgICBoaW50cy0+YXhpc1sxXS5udW1fZWRnZXMgICAgPSAwOwotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCByZWFsbG9jYXRlIHRoZSBjb250b3VycyBhcnJheSBpZiBuZWNlc3NhcnkgKi8KLSAgICBuZXdfbWF4ID0gKEZUX1VJbnQpb3V0bGluZS0+bl9jb250b3VyczsKLSAgICBvbGRfbWF4ID0gKEZUX1VJbnQpaGludHMtPm1heF9jb250b3VyczsKLQotICAgIGlmICggbmV3X21heCA8PSBBRl9DT05UT1VSU19FTUJFRERFRCApCi0gICAgewotICAgICAgaWYgKCAhaGludHMtPmNvbnRvdXJzICkKLSAgICAgIHsKLSAgICAgICAgaGludHMtPmNvbnRvdXJzICAgICA9IGhpbnRzLT5lbWJlZGRlZC5jb250b3VyczsKLSAgICAgICAgaGludHMtPm1heF9jb250b3VycyA9IEFGX0NPTlRPVVJTX0VNQkVEREVEOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIGlmICggaGludHMtPmNvbnRvdXJzID09IGhpbnRzLT5lbWJlZGRlZC5jb250b3VycyApCi0gICAgICAgIGhpbnRzLT5jb250b3VycyA9IE5VTEw7Ci0KLSAgICAgIG5ld19tYXggPSAoIG5ld19tYXggKyAzICkgJiB+M1U7IC8qIHJvdW5kIHVwIHRvIGEgbXVsdGlwbGUgb2YgNCAqLwotCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBoaW50cy0+Y29udG91cnMsIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaGludHMtPm1heF9jb250b3VycyA9IChGVF9JbnQpbmV3X21heDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICB0aGVuIHJlYWxsb2NhdGUgdGhlIHBvaW50cyBhcnJheXMgaWYgbmVjZXNzYXJ5IC0tCi0gICAgICogIG5vdGUgdGhhdCB3ZSByZXNlcnZlIHR3byBhZGRpdGlvbmFsIHBvaW50IHBvc2l0aW9ucywgdXNlZCB0bwotICAgICAqICBoaW50IG1ldHJpY3MgYXBwcm9wcmlhdGVseQotICAgICAqLwotICAgIG5ld19tYXggPSAoRlRfVUludCkoIG91dGxpbmUtPm5fcG9pbnRzICsgMiApOwotICAgIG9sZF9tYXggPSAoRlRfVUludCloaW50cy0+bWF4X3BvaW50czsKLQotICAgIGlmICggbmV3X21heCA8PSBBRl9QT0lOVFNfRU1CRURERUQgKQotICAgIHsKLSAgICAgIGlmICggIWhpbnRzLT5wb2ludHMgKQotICAgICAgewotICAgICAgICBoaW50cy0+cG9pbnRzICAgICA9IGhpbnRzLT5lbWJlZGRlZC5wb2ludHM7Ci0gICAgICAgIGhpbnRzLT5tYXhfcG9pbnRzID0gQUZfUE9JTlRTX0VNQkVEREVEOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIGlmICggaGludHMtPnBvaW50cyA9PSBoaW50cy0+ZW1iZWRkZWQucG9pbnRzICkKLSAgICAgICAgaGludHMtPnBvaW50cyA9IE5VTEw7Ci0KLSAgICAgIG5ld19tYXggPSAoIG5ld19tYXggKyAyICsgNyApICYgfjdVOyAvKiByb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mIDggKi8KLQotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggaGludHMtPnBvaW50cywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBoaW50cy0+bWF4X3BvaW50cyA9IChGVF9JbnQpbmV3X21heDsKLSAgICB9Ci0KLSAgICBoaW50cy0+bnVtX3BvaW50cyAgID0gb3V0bGluZS0+bl9wb2ludHM7Ci0gICAgaGludHMtPm51bV9jb250b3VycyA9IG91dGxpbmUtPm5fY29udG91cnM7Ci0KLSAgICAvKiBXZSBjYW4ndCByZWx5IG9uIHRoZSB2YWx1ZSBvZiBgRlRfT3V0bGluZS5mbGFncycgdG8ga25vdyB0aGUgZmlsbCAgICovCi0gICAgLyogZGlyZWN0aW9uIHVzZWQgZm9yIGEgZ2x5cGgsIGdpdmVuIHRoYXQgc29tZSBmb250cyBhcmUgYnJva2VuIChlLmcuLCAqLwotICAgIC8qIHRoZSBBcnBoaWMgb25lcykuICBXZSB0aHVzIHJlY29tcHV0ZSBpdCBlYWNoIHRpbWUgd2UgbmVlZCB0by4gICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaGludHMtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdLm1ham9yX2RpciA9IEFGX0RJUl9VUDsKLSAgICBoaW50cy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0ubWFqb3JfZGlyID0gQUZfRElSX0xFRlQ7Ci0KLSAgICBpZiAoIEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKCBvdXRsaW5lICkgPT0gRlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCApCi0gICAgewotICAgICAgaGludHMtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdLm1ham9yX2RpciA9IEFGX0RJUl9ET1dOOwotICAgICAgaGludHMtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdLm1ham9yX2RpciA9IEFGX0RJUl9SSUdIVDsKLSAgICB9Ci0KLSAgICBoaW50cy0+eF9zY2FsZSA9IHhfc2NhbGU7Ci0gICAgaGludHMtPnlfc2NhbGUgPSB5X3NjYWxlOwotICAgIGhpbnRzLT54X2RlbHRhID0geF9kZWx0YTsKLSAgICBoaW50cy0+eV9kZWx0YSA9IHlfZGVsdGE7Ci0KLSAgICBoaW50cy0+eG1pbl9kZWx0YSA9IDA7Ci0gICAgaGludHMtPnhtYXhfZGVsdGEgPSAwOwotCi0gICAgcG9pbnRzID0gaGludHMtPnBvaW50czsKLSAgICBpZiAoIGhpbnRzLT5udW1fcG9pbnRzID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgewotICAgICAgQUZfUG9pbnQgIHBvaW50OwotICAgICAgQUZfUG9pbnQgIHBvaW50X2xpbWl0ID0gcG9pbnRzICsgaGludHMtPm51bV9wb2ludHM7Ci0KLSAgICAgIC8qIHZhbHVlIDIwIGluIGBuZWFyX2xpbWl0JyBpcyBoZXVyaXN0aWMgKi8KLSAgICAgIEZUX1VJbnQgIHVuaXRzX3Blcl9lbSA9IGhpbnRzLT5tZXRyaWNzLT5zY2FsZXIuZmFjZS0+dW5pdHNfcGVyX0VNOwotICAgICAgRlRfSW50ICAgbmVhcl9saW1pdCAgID0gMjAgKiB1bml0c19wZXJfZW0gLyAyMDQ4OwotCi0KLSAgICAgIC8qIGNvbXB1dGUgY29vcmRpbmF0ZXMgJiBCZXppZXIgZmxhZ3MsIG5leHQgYW5kIHByZXYgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yKiAgdmVjICAgICAgICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgICAgY2hhciogICAgICAgdGFnICAgICAgICAgICA9IG91dGxpbmUtPnRhZ3M7Ci0gICAgICAgIEZUX1Nob3J0ICAgIGVuZHBvaW50ICAgICAgPSBvdXRsaW5lLT5jb250b3Vyc1swXTsKLSAgICAgICAgQUZfUG9pbnQgICAgZW5kICAgICAgICAgICA9IHBvaW50cyArIGVuZHBvaW50OwotICAgICAgICBBRl9Qb2ludCAgICBwcmV2ICAgICAgICAgID0gZW5kOwotICAgICAgICBGVF9JbnQgICAgICBjb250b3VyX2luZGV4ID0gMDsKLQotCi0gICAgICAgIGZvciAoIHBvaW50ID0gcG9pbnRzOyBwb2ludCA8IHBvaW50X2xpbWl0OyBwb2ludCsrLCB2ZWMrKywgdGFnKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICBvdXRfeCwgb3V0X3k7Ci0KLQotICAgICAgICAgIHBvaW50LT5pbl9kaXIgID0gKEZUX0NoYXIpQUZfRElSX05PTkU7Ci0gICAgICAgICAgcG9pbnQtPm91dF9kaXIgPSAoRlRfQ2hhcilBRl9ESVJfTk9ORTsKLQotICAgICAgICAgIHBvaW50LT5meCA9IChGVF9TaG9ydCl2ZWMtPng7Ci0gICAgICAgICAgcG9pbnQtPmZ5ID0gKEZUX1Nob3J0KXZlYy0+eTsKLSAgICAgICAgICBwb2ludC0+b3ggPSBwb2ludC0+eCA9IEZUX011bEZpeCggdmVjLT54LCB4X3NjYWxlICkgKyB4X2RlbHRhOwotICAgICAgICAgIHBvaW50LT5veSA9IHBvaW50LT55ID0gRlRfTXVsRml4KCB2ZWMtPnksIHlfc2NhbGUgKSArIHlfZGVsdGE7Ci0KLSAgICAgICAgICBlbmQtPmZ4ID0gKEZUX1Nob3J0KW91dGxpbmUtPnBvaW50c1tlbmRwb2ludF0ueDsKLSAgICAgICAgICBlbmQtPmZ5ID0gKEZUX1Nob3J0KW91dGxpbmUtPnBvaW50c1tlbmRwb2ludF0ueTsKLQotICAgICAgICAgIHN3aXRjaCAoIEZUX0NVUlZFX1RBRyggKnRhZyApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBGVF9DVVJWRV9UQUdfQ09OSUM6Ci0gICAgICAgICAgICBwb2ludC0+ZmxhZ3MgPSBBRl9GTEFHX0NPTklDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBGVF9DVVJWRV9UQUdfQ1VCSUM6Ci0gICAgICAgICAgICBwb2ludC0+ZmxhZ3MgPSBBRl9GTEFHX0NVQklDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBvaW50LT5mbGFncyA9IEFGX0ZMQUdfTk9ORTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBvdXRfeCA9IHBvaW50LT5meCAtIHByZXYtPmZ4OwotICAgICAgICAgIG91dF95ID0gcG9pbnQtPmZ5IC0gcHJldi0+Znk7Ci0KLSAgICAgICAgICBpZiAoIEZUX0FCUyggb3V0X3ggKSArIEZUX0FCUyggb3V0X3kgKSA8IG5lYXJfbGltaXQgKQotICAgICAgICAgICAgcHJldi0+ZmxhZ3MgfD0gQUZfRkxBR19ORUFSOwotCi0gICAgICAgICAgcG9pbnQtPnByZXYgPSBwcmV2OwotICAgICAgICAgIHByZXYtPm5leHQgID0gcG9pbnQ7Ci0gICAgICAgICAgcHJldiAgICAgICAgPSBwb2ludDsKLQotICAgICAgICAgIGlmICggcG9pbnQgPT0gZW5kICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoICsrY29udG91cl9pbmRleCA8IG91dGxpbmUtPm5fY29udG91cnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbmRwb2ludCA9IG91dGxpbmUtPmNvbnRvdXJzW2NvbnRvdXJfaW5kZXhdOwotICAgICAgICAgICAgICBlbmQgICAgICA9IHBvaW50cyArIGVuZHBvaW50OwotICAgICAgICAgICAgICBwcmV2ICAgICA9IGVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogc2V0IHVwIHRoZSBjb250b3VycyBhcnJheSAqLwotICAgICAgewotICAgICAgICBBRl9Qb2ludCogIGNvbnRvdXIgICAgICAgPSBoaW50cy0+Y29udG91cnM7Ci0gICAgICAgIEFGX1BvaW50KiAgY29udG91cl9saW1pdCA9IGNvbnRvdXIgKyBoaW50cy0+bnVtX2NvbnRvdXJzOwotICAgICAgICBzaG9ydCogICAgIGVuZCAgICAgICAgICAgPSBvdXRsaW5lLT5jb250b3VyczsKLSAgICAgICAgc2hvcnQgICAgICBpZHggICAgICAgICAgID0gMDsKLQotCi0gICAgICAgIGZvciAoIDsgY29udG91ciA8IGNvbnRvdXJfbGltaXQ7IGNvbnRvdXIrKywgZW5kKysgKQotICAgICAgICB7Ci0gICAgICAgICAgY29udG91clswXSA9IHBvaW50cyArIGlkeDsKLSAgICAgICAgICBpZHggICAgICAgID0gKHNob3J0KSggZW5kWzBdICsgMSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogIENvbXB1dGUgZGlyZWN0aW9ucyBvZiBgaW4nIGFuZCBgb3V0JyB2ZWN0b3JzLgotICAgICAgICAgKgotICAgICAgICAgKiAgTm90ZSB0aGF0IGRpc3RhbmNlcyBiZXR3ZWVuIHBvaW50cyB0aGF0IGFyZSB2ZXJ5IG5lYXIgdG8gZWFjaAotICAgICAgICAgKiAgb3RoZXIgYXJlIGFjY3VtdWxhdGVkLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBhdXRvLWhpbnRlciBlaXRoZXIKLSAgICAgICAgICogIHByZXBlbmRzIHRoZSBzbWFsbCB2ZWN0b3JzIGJldHdlZW4gbmVhciBwb2ludHMgdG8gdGhlIGZpcnN0Ci0gICAgICAgICAqICBub24tbmVhciB2ZWN0b3IsIG9yIHRoZSBzdW0gb2Ygc21hbGwgdmVjdG9yIGxlbmd0aHMgZXhjZWVkcyBhCi0gICAgICAgICAqICB0aHJlc2hvbGQsIHRodXMgYGdyb3VwaW5nJyB0aGUgc21hbGwgdmVjdG9ycy4gIEFsbCBpbnRlcm1lZGlhdGUKLSAgICAgICAgICogIHBvaW50cyBhcmUgdGFnZ2VkIGFzIHdlYWs7IHRoZSBkaXJlY3Rpb25zIGFyZSBhZGp1c3RlZCBhbHNvIHRvCi0gICAgICAgICAqICBiZSBlcXVhbCB0byB0aGUgYWNjdW11bGF0ZWQgb25lLgotICAgICAgICAgKi8KLQotICAgICAgICBGVF9JbnQgIG5lYXJfbGltaXQyID0gMiAqIG5lYXJfbGltaXQgLSAxOwotCi0gICAgICAgIEFGX1BvaW50KiAgY29udG91cjsKLSAgICAgICAgQUZfUG9pbnQqICBjb250b3VyX2xpbWl0ID0gaGludHMtPmNvbnRvdXJzICsgaGludHMtPm51bV9jb250b3VyczsKLQotCi0gICAgICAgIGZvciAoIGNvbnRvdXIgPSBoaW50cy0+Y29udG91cnM7IGNvbnRvdXIgPCBjb250b3VyX2xpbWl0OyBjb250b3VyKysgKQotICAgICAgICB7Ci0gICAgICAgICAgQUZfUG9pbnQgIGZpcnN0ID0gKmNvbnRvdXI7Ci0gICAgICAgICAgQUZfUG9pbnQgIG5leHQsIHByZXYsIGN1cnI7Ci0KLSAgICAgICAgICBGVF9Qb3MgIG91dF94LCBvdXRfeTsKLQotCi0gICAgICAgICAgLyogc2luY2UgdGhlIGZpcnN0IHBvaW50IG9mIGEgY29udG91ciBjb3VsZCBiZSBwYXJ0IG9mIGEgKi8KLSAgICAgICAgICAvKiBzZXJpZXMgb2YgbmVhciBwb2ludHMsIGdvIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBmaXJzdCAqLwotICAgICAgICAgIC8qIG5vbi1uZWFyIHBvaW50IGFuZCBhZGp1c3QgYGZpcnN0JyAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICBwb2ludCA9IGZpcnN0OwotICAgICAgICAgIHByZXYgID0gZmlyc3QtPnByZXY7Ci0KLSAgICAgICAgICB3aGlsZSAoIHByZXYgIT0gZmlyc3QgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dF94ID0gcG9pbnQtPmZ4IC0gcHJldi0+Zng7Ci0gICAgICAgICAgICBvdXRfeSA9IHBvaW50LT5meSAtIHByZXYtPmZ5OwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIFdlIHVzZSBUYXhpY2FiIG1ldHJpY3MgdG8gbWVhc3VyZSB0aGUgdmVjdG9yIGxlbmd0aC4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhY2N1bXVsYXRlZCBkaXN0YW5jZXMgc28gZmFyIGNvdWxkIGhhdmUgdGhlCi0gICAgICAgICAgICAgKiAgb3Bwb3NpdGUgZGlyZWN0aW9uIG9mIHRoZSBkaXN0YW5jZSBtZWFzdXJlZCBoZXJlLiAgRm9yIHRoaXMKLSAgICAgICAgICAgICAqICByZWFzb24gd2UgdXNlIGBuZWFyX2xpbWl0MicgZm9yIHRoZSBjb21wYXJpc29uIHRvIGdldCBhCi0gICAgICAgICAgICAgKiAgbm9uLW5lYXIgcG9pbnQgZXZlbiBpbiB0aGUgd29yc3QgY2FzZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBGVF9BQlMoIG91dF94ICkgKyBGVF9BQlMoIG91dF95ICkgPj0gbmVhcl9saW1pdDIgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgcG9pbnQgPSBwcmV2OwotICAgICAgICAgICAgcHJldiAgPSBwcmV2LT5wcmV2OwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGFkanVzdCBmaXJzdCBwb2ludCAqLwotICAgICAgICAgIGZpcnN0ID0gcG9pbnQ7Ci0KLSAgICAgICAgICAvKiBub3cgbG9vcCBvdmVyIGFsbCBwb2ludHMgb2YgdGhlIGNvbnRvdXIgdG8gZ2V0ICovCi0gICAgICAgICAgLyogYGluJyBhbmQgYG91dCcgdmVjdG9yIGRpcmVjdGlvbnMgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgY3VyciA9IGZpcnN0OwotCi0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiAgV2UgYWJ1c2UgdGhlIGB1JyBhbmQgYHYnIGZpZWxkcyB0byBzdG9yZSBpbmRleCBkZWx0YXMgdG8gdGhlCi0gICAgICAgICAgICogIG5leHQgYW5kIHByZXZpb3VzIG5vbi1uZWFyIHBvaW50LCByZXNwZWN0aXZlbHkuCi0gICAgICAgICAgICoKLSAgICAgICAgICAgKiAgVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBub3QgaGF2aW5nIG5vbi1uZWFyIHBvaW50cywgd2UgcG9pbnQgdG8KLSAgICAgICAgICAgKiAgYGZpcnN0JyBieSBkZWZhdWx0IGFzIHRoZSBuZXh0IG5vbi1uZWFyIHBvaW50LgotICAgICAgICAgICAqCi0gICAgICAgICAgICovCi0gICAgICAgICAgY3Vyci0+dSAgPSAoRlRfUG9zKSggZmlyc3QgLSBjdXJyICk7Ci0gICAgICAgICAgZmlyc3QtPnYgPSAtY3Vyci0+dTsKLQotICAgICAgICAgIG91dF94ID0gMDsKLSAgICAgICAgICBvdXRfeSA9IDA7Ci0KLSAgICAgICAgICBuZXh0ID0gZmlyc3Q7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBRl9EaXJlY3Rpb24gIG91dF9kaXI7Ci0KLQotICAgICAgICAgICAgcG9pbnQgPSBuZXh0OwotICAgICAgICAgICAgbmV4dCAgPSBwb2ludC0+bmV4dDsKLQotICAgICAgICAgICAgb3V0X3ggKz0gbmV4dC0+ZnggLSBwb2ludC0+Zng7Ci0gICAgICAgICAgICBvdXRfeSArPSBuZXh0LT5meSAtIHBvaW50LT5meTsKLQotICAgICAgICAgICAgaWYgKCBGVF9BQlMoIG91dF94ICkgKyBGVF9BQlMoIG91dF95ICkgPCBuZWFyX2xpbWl0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmV4dC0+ZmxhZ3MgfD0gQUZfRkxBR19XRUFLX0lOVEVSUE9MQVRJT047Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXJyLT51ID0gKEZUX1BvcykoIG5leHQgLSBjdXJyICk7Ci0gICAgICAgICAgICBuZXh0LT52ID0gLWN1cnItPnU7Ci0KLSAgICAgICAgICAgIG91dF9kaXIgPSBhZl9kaXJlY3Rpb25fY29tcHV0ZSggb3V0X3gsIG91dF95ICk7Ci0KLSAgICAgICAgICAgIC8qIGFkanVzdCBkaXJlY3Rpb25zIGZvciBhbGwgcG9pbnRzIGluYmV0d2VlbjsgKi8KLSAgICAgICAgICAgIC8qIHRoZSBsb29wIGFsc28gdXBkYXRlcyBwb3NpdGlvbiBvZiBgY3VycicgICAgKi8KLSAgICAgICAgICAgIGN1cnItPm91dF9kaXIgPSAoRlRfQ2hhcilvdXRfZGlyOwotICAgICAgICAgICAgZm9yICggY3VyciA9IGN1cnItPm5leHQ7IGN1cnIgIT0gbmV4dDsgY3VyciA9IGN1cnItPm5leHQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyLT5pbl9kaXIgID0gKEZUX0NoYXIpb3V0X2RpcjsKLSAgICAgICAgICAgICAgY3Vyci0+b3V0X2RpciA9IChGVF9DaGFyKW91dF9kaXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0LT5pbl9kaXIgPSAoRlRfQ2hhcilvdXRfZGlyOwotCi0gICAgICAgICAgICBjdXJyLT51ICA9IChGVF9Qb3MpKCBmaXJzdCAtIGN1cnIgKTsKLSAgICAgICAgICAgIGZpcnN0LT52ID0gLWN1cnItPnU7Ci0KLSAgICAgICAgICAgIG91dF94ID0gMDsKLSAgICAgICAgICAgIG91dF95ID0gMDsKLQotICAgICAgICAgIH0gd2hpbGUgKCBuZXh0ICE9IGZpcnN0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgVGhlIG5leHQgc3RlcCBpcyB0byBgc2ltcGxpZnknIGFuIG91dGxpbmUncyB0b3BvbG9neSBzbyB0aGF0IHdlCi0gICAgICAgICAqICBjYW4gaWRlbnRpZnkgbG9jYWwgZXh0cmVtYSBtb3JlIHJlbGlhYmx5OiBBIHNlcmllcyBvZgotICAgICAgICAgKiAgbm9uLWhvcml6b250YWwgb3Igbm9uLXZlcnRpY2FsIHZlY3RvcnMgcG9pbnRpbmcgaW50byB0aGUgc2FtZQotICAgICAgICAgKiAgcXVhZHJhbnQgYXJlIGhhbmRsZWQgYXMgYSBzaW5nbGUsIGxvbmcgdmVjdG9yLiAgRnJvbSBhCi0gICAgICAgICAqICB0b3BvbG9naWNhbCBwb2ludCBvZiB0aGUgdmlldywgdGhlIGludGVybWVkaWF0ZSBwb2ludHMgYXJlIG9mIG5vCi0gICAgICAgICAqICBpbnRlcmVzdCBhbmQgdGh1cyB0YWdnZWQgYXMgd2Vhay4KLSAgICAgICAgICovCi0KLSAgICAgICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRfbGltaXQ7IHBvaW50KysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX1dFQUtfSU5URVJQT0xBVElPTiApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGlmICggcG9pbnQtPmluX2RpciAgPT0gQUZfRElSX05PTkUgJiYKLSAgICAgICAgICAgICAgIHBvaW50LT5vdXRfZGlyID09IEFGX0RJUl9OT05FICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjaGVjayB3aGV0aGVyIGJvdGggdmVjdG9ycyBwb2ludCBpbnRvIHRoZSBzYW1lIHF1YWRyYW50ICovCi0KLSAgICAgICAgICAgIEZUX1BvcyAgaW5feCwgaW5feTsKLSAgICAgICAgICAgIEZUX1BvcyAgb3V0X3gsIG91dF95OwotCi0gICAgICAgICAgICBBRl9Qb2ludCAgbmV4dF91ID0gcG9pbnQgKyBwb2ludC0+dTsKLSAgICAgICAgICAgIEFGX1BvaW50ICBwcmV2X3YgPSBwb2ludCArIHBvaW50LT52OwotCi0KLSAgICAgICAgICAgIGluX3ggPSBwb2ludC0+ZnggLSBwcmV2X3YtPmZ4OwotICAgICAgICAgICAgaW5feSA9IHBvaW50LT5meSAtIHByZXZfdi0+Znk7Ci0KLSAgICAgICAgICAgIG91dF94ID0gbmV4dF91LT5meCAtIHBvaW50LT5meDsKLSAgICAgICAgICAgIG91dF95ID0gbmV4dF91LT5meSAtIHBvaW50LT5meTsKLQotICAgICAgICAgICAgaWYgKCAoIGluX3ggXiBvdXRfeCApID49IDAgJiYgKCBpbl95IF4gb3V0X3kgKSA+PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogeWVzLCBzbyB0YWcgY3VycmVudCBwb2ludCBhcyB3ZWFrICovCi0gICAgICAgICAgICAgIC8qIGFuZCB1cGRhdGUgaW5kZXggZGVsdGFzICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgIHBvaW50LT5mbGFncyB8PSBBRl9GTEFHX1dFQUtfSU5URVJQT0xBVElPTjsKLQotICAgICAgICAgICAgICBwcmV2X3YtPnUgPSAoRlRfUG9zKSggbmV4dF91IC0gcHJldl92ICk7Ci0gICAgICAgICAgICAgIG5leHRfdS0+diA9IC1wcmV2X3YtPnU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIEZpbmFsbHksIGNoZWNrIGZvciByZW1haW5pbmcgd2VhayBwb2ludHMuICBFdmVyeXRoaW5nIGVsc2Ugbm90Ci0gICAgICAgICAqICBjb2xsZWN0ZWQgaW4gZWRnZXMgc28gZmFyIGlzIHRoZW4gaW1wbGljaXRseSBjbGFzc2lmaWVkIGFzIHN0cm9uZwotICAgICAgICAgKiAgcG9pbnRzLgotICAgICAgICAgKi8KLQotICAgICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludF9saW1pdDsgcG9pbnQrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHBvaW50LT5mbGFncyAmIEFGX0ZMQUdfV0VBS19JTlRFUlBPTEFUSU9OICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0wgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNvbnRyb2wgcG9pbnRzIGFyZSBhbHdheXMgd2VhayAqLwotICAgICAgICAgIElzX1dlYWtfUG9pbnQ6Ci0gICAgICAgICAgICBwb2ludC0+ZmxhZ3MgfD0gQUZfRkxBR19XRUFLX0lOVEVSUE9MQVRJT047Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBwb2ludC0+b3V0X2RpciA9PSBwb2ludC0+aW5fZGlyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHBvaW50LT5vdXRfZGlyICE9IEFGX0RJUl9OT05FICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogY3VycmVudCBwb2ludCBsaWVzIG9uIGEgaG9yaXpvbnRhbCBvciAgICAgICAgICAqLwotICAgICAgICAgICAgICAvKiB2ZXJ0aWNhbCBzZWdtZW50IChidXQgZG9lc24ndCBzdGFydCBvciBlbmQgaXQpICovCi0gICAgICAgICAgICAgIGdvdG8gSXNfV2Vha19Qb2ludDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBBRl9Qb2ludCAgbmV4dF91ID0gcG9pbnQgKyBwb2ludC0+dTsKLSAgICAgICAgICAgICAgQUZfUG9pbnQgIHByZXZfdiA9IHBvaW50ICsgcG9pbnQtPnY7Ci0KLQotICAgICAgICAgICAgICBpZiAoIGZ0X2Nvcm5lcl9pc19mbGF0KCBwb2ludC0+ZnggIC0gcHJldl92LT5meCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQtPmZ5ICAtIHByZXZfdi0+ZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdS0+ZnggLSBwb2ludC0+ZngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdS0+ZnkgLSBwb2ludC0+ZnkgKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBlaXRoZXIgdGhlIGBpbicgb3IgdGhlIGBvdXQnIHZlY3RvciBpcyBtdWNoIG1vcmUgICovCi0gICAgICAgICAgICAgICAgLyogZG9taW5hbnQgdGhhbiB0aGUgb3RoZXIgb25lLCBzbyB0YWcgY3VycmVudCBwb2ludCAqLwotICAgICAgICAgICAgICAgIC8qIGFzIHdlYWsgYW5kIHVwZGF0ZSBpbmRleCBkZWx0YXMgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIHByZXZfdi0+dSA9IChGVF9Qb3MpKCBuZXh0X3UgLSBwcmV2X3YgKTsKLSAgICAgICAgICAgICAgICBuZXh0X3UtPnYgPSAtcHJldl92LT51OwotCi0gICAgICAgICAgICAgICAgZ290byBJc19XZWFrX1BvaW50OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBwb2ludC0+aW5fZGlyID09IC1wb2ludC0+b3V0X2RpciApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogY3VycmVudCBwb2ludCBmb3JtcyBhIHNwaWtlICovCi0gICAgICAgICAgICBnb3RvIElzX1dlYWtfUG9pbnQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBTdG9yZSB0aGUgaGludGVkIG91dGxpbmUgaW4gYW4gRlRfT3V0bGluZSBzdHJ1Y3R1cmUuICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfc2F2ZSggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgIG91dGxpbmUgKQotICB7Ci0gICAgQUZfUG9pbnQgICAgcG9pbnQgPSBoaW50cy0+cG9pbnRzOwotICAgIEFGX1BvaW50ICAgIGxpbWl0ID0gcG9pbnQgKyBoaW50cy0+bnVtX3BvaW50czsKLSAgICBGVF9WZWN0b3IqICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICBjaGFyKiAgICAgICB0YWcgICA9IG91dGxpbmUtPnRhZ3M7Ci0KLQotICAgIGZvciAoIDsgcG9pbnQgPCBsaW1pdDsgcG9pbnQrKywgdmVjKyssIHRhZysrICkKLSAgICB7Ci0gICAgICB2ZWMtPnggPSBwb2ludC0+eDsKLSAgICAgIHZlYy0+eSA9IHBvaW50LT55OwotCi0gICAgICBpZiAoIHBvaW50LT5mbGFncyAmIEFGX0ZMQUdfQ09OSUMgKQotICAgICAgICB0YWdbMF0gPSBGVF9DVVJWRV9UQUdfQ09OSUM7Ci0gICAgICBlbHNlIGlmICggcG9pbnQtPmZsYWdzICYgQUZfRkxBR19DVUJJQyApCi0gICAgICAgIHRhZ1swXSA9IEZUX0NVUlZFX1RBR19DVUJJQzsKLSAgICAgIGVsc2UKLSAgICAgICAgdGFnWzBdID0gRlRfQ1VSVkVfVEFHX09OOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogICAgICAgICAgICAgICAgICAgICBFREdFIFBPSU5UIEdSSUQtRklUVElORwotICAgKgotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIEFsaWduIGFsbCBwb2ludHMgb2YgYW4gZWRnZSB0byB0aGUgc2FtZSBjb29yZGluYXRlIHZhbHVlLCAqLwotICAvKiBlaXRoZXIgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19hbGlnbl9lZGdlX3BvaW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgICAgID0gJiBoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMgICAgICA9IGF4aXMtPnNlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudF9saW1pdCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnOwotCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICAgIHsKLSAgICAgICAgQUZfRWRnZSAgIGVkZ2UgPSBzZWctPmVkZ2U7Ci0gICAgICAgIEFGX1BvaW50ICBwb2ludCwgZmlyc3QsIGxhc3Q7Ci0KLQotICAgICAgICBpZiAoICFlZGdlICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmaXJzdCA9IHNlZy0+Zmlyc3Q7Ci0gICAgICAgIGxhc3QgID0gc2VnLT5sYXN0OwotICAgICAgICBwb2ludCA9IGZpcnN0OwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgcG9pbnQtPnggICAgICA9IGVkZ2UtPnBvczsKLSAgICAgICAgICBwb2ludC0+ZmxhZ3MgfD0gQUZfRkxBR19UT1VDSF9YOwotCi0gICAgICAgICAgaWYgKCBwb2ludCA9PSBsYXN0ICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICAgIHsKLSAgICAgICAgQUZfRWRnZSAgIGVkZ2UgPSBzZWctPmVkZ2U7Ci0gICAgICAgIEFGX1BvaW50ICBwb2ludCwgZmlyc3QsIGxhc3Q7Ci0KLQotICAgICAgICBpZiAoICFlZGdlICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmaXJzdCA9IHNlZy0+Zmlyc3Q7Ci0gICAgICAgIGxhc3QgID0gc2VnLT5sYXN0OwotICAgICAgICBwb2ludCA9IGZpcnN0OwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgcG9pbnQtPnkgICAgICA9IGVkZ2UtPnBvczsKLSAgICAgICAgICBwb2ludC0+ZmxhZ3MgfD0gQUZfRkxBR19UT1VDSF9ZOwotCi0gICAgICAgICAgaWYgKCBwb2ludCA9PSBsYXN0ICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogICAgICAgICAgICAgICAgICAgIFNUUk9ORyBQT0lOVCBJTlRFUlBPTEFUSU9OCi0gICAqCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogSGludCB0aGUgc3Ryb25nIHBvaW50cyAtLSB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFRydWVUeXBlIGBJUCcgKi8KLSAgLyogaGludGluZyBpbnN0cnVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19hbGlnbl9zdHJvbmdfcG9pbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX1BvaW50ICAgICAgcG9pbnRzICAgICAgPSBoaW50cy0+cG9pbnRzOwotICAgIEFGX1BvaW50ICAgICAgcG9pbnRfbGltaXQgPSBwb2ludHMgKyBoaW50cy0+bnVtX3BvaW50czsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlcyAgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZV9saW1pdCAgPSBlZGdlcyArIGF4aXMtPm51bV9lZGdlczsKLSAgICBGVF9VSW50ICAgICAgIHRvdWNoX2ZsYWc7Ci0KLQotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICAgIHRvdWNoX2ZsYWcgPSBBRl9GTEFHX1RPVUNIX1g7Ci0gICAgZWxzZQotICAgICAgdG91Y2hfZmxhZyAgPSBBRl9GTEFHX1RPVUNIX1k7Ci0KLSAgICBpZiAoIGVkZ2VzIDwgZWRnZV9saW1pdCApCi0gICAgewotICAgICAgQUZfUG9pbnQgIHBvaW50OwotICAgICAgQUZfRWRnZSAgIGVkZ2U7Ci0KLQotICAgICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRfbGltaXQ7IHBvaW50KysgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIHUsIG91LCBmdTsgIC8qIHBvaW50IHBvc2l0aW9uICovCi0gICAgICAgIEZUX1BvcyAgZGVsdGE7Ci0KLQotICAgICAgICBpZiAoIHBvaW50LT5mbGFncyAmIHRvdWNoX2ZsYWcgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIGlmIHRoaXMgcG9pbnQgaXMgY2FuZGlkYXRlIHRvIHdlYWsgaW50ZXJwb2xhdGlvbiwgd2UgICAgICAgKi8KLSAgICAgICAgLyogaW50ZXJwb2xhdGUgaXQgYWZ0ZXIgYWxsIHN0cm9uZyBwb2ludHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCAqLwotCi0gICAgICAgIGlmICggKCBwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX1dFQUtfSU5URVJQT0xBVElPTiApICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApCi0gICAgICAgIHsKLSAgICAgICAgICB1ICA9IHBvaW50LT5meTsKLSAgICAgICAgICBvdSA9IHBvaW50LT5veTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1ICA9IHBvaW50LT5meDsKLSAgICAgICAgICBvdSA9IHBvaW50LT5veDsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1ID0gdTsKLQotICAgICAgICAvKiBpcyB0aGUgcG9pbnQgYmVmb3JlIHRoZSBmaXJzdCBlZGdlPyAqLwotICAgICAgICBlZGdlICA9IGVkZ2VzOwotICAgICAgICBkZWx0YSA9IGVkZ2UtPmZwb3MgLSB1OwotICAgICAgICBpZiAoIGRlbHRhID49IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgdSA9IGVkZ2UtPnBvcyAtICggZWRnZS0+b3BvcyAtIG91ICk7Ci0gICAgICAgICAgZ290byBTdG9yZV9Qb2ludDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlzIHRoZSBwb2ludCBhZnRlciB0aGUgbGFzdCBlZGdlPyAqLwotICAgICAgICBlZGdlICA9IGVkZ2VfbGltaXQgLSAxOwotICAgICAgICBkZWx0YSA9IHUgLSBlZGdlLT5mcG9zOwotICAgICAgICBpZiAoIGRlbHRhID49IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgdSA9IGVkZ2UtPnBvcyArICggb3UgLSBlZGdlLT5vcG9zICk7Ci0gICAgICAgICAgZ290byBTdG9yZV9Qb2ludDsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9QdHJEaXN0ICBtaW4sIG1heCwgbWlkOwotICAgICAgICAgIEZUX1BvcyAgICAgIGZwb3M7Ci0KLQotICAgICAgICAgIC8qIGZpbmQgZW5jbG9zaW5nIGVkZ2VzICovCi0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgICBtYXggPSBlZGdlX2xpbWl0IC0gZWRnZXM7Ci0KLSNpZiAxCi0gICAgICAgICAgLyogZm9yIGEgc21hbGwgbnVtYmVyIG9mIGVkZ2VzLCBhIGxpbmVhciBzZWFyY2ggaXMgYmV0dGVyICovCi0gICAgICAgICAgaWYgKCBtYXggPD0gOCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUHRyRGlzdCAgbm47Ci0KLQotICAgICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG1heDsgbm4rKyApCi0gICAgICAgICAgICAgIGlmICggZWRnZXNbbm5dLmZwb3MgPj0gdSApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmICggZWRnZXNbbm5dLmZwb3MgPT0gdSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHUgPSBlZGdlc1tubl0ucG9zOwotICAgICAgICAgICAgICBnb3RvIFN0b3JlX1BvaW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWluID0gbm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaWQgID0gKCBtYXggKyBtaW4gKSA+PiAxOwotICAgICAgICAgICAgZWRnZSA9IGVkZ2VzICsgbWlkOwotICAgICAgICAgICAgZnBvcyA9IGVkZ2UtPmZwb3M7Ci0KLSAgICAgICAgICAgIGlmICggdSA8IGZwb3MgKQotICAgICAgICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICAgICAgICBlbHNlIGlmICggdSA+IGZwb3MgKQotICAgICAgICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiB3ZSBhcmUgb24gdGhlIGVkZ2UgKi8KLSAgICAgICAgICAgICAgdSA9IGVkZ2UtPnBvczsKLSAgICAgICAgICAgICAgZ290byBTdG9yZV9Qb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBwb2ludCBpcyBub3Qgb24gYW4gZWRnZSAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFGX0VkZ2UgIGJlZm9yZSA9IGVkZ2VzICsgbWluIC0gMTsKLSAgICAgICAgICAgIEFGX0VkZ2UgIGFmdGVyICA9IGVkZ2VzICsgbWluICsgMDsKLQotCi0gICAgICAgICAgICAvKiBhc3NlcnQoIGJlZm9yZSAmJiBhZnRlciAmJiBiZWZvcmUgIT0gYWZ0ZXIgKSAqLwotICAgICAgICAgICAgaWYgKCBiZWZvcmUtPnNjYWxlID09IDAgKQotICAgICAgICAgICAgICBiZWZvcmUtPnNjYWxlID0gRlRfRGl2Rml4KCBhZnRlci0+cG9zIC0gYmVmb3JlLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5mcG9zIC0gYmVmb3JlLT5mcG9zICk7Ci0KLSAgICAgICAgICAgIHUgPSBiZWZvcmUtPnBvcyArIEZUX011bEZpeCggZnUgLSBiZWZvcmUtPmZwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZS0+c2NhbGUgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgU3RvcmVfUG9pbnQ6Ci0gICAgICAgIC8qIHNhdmUgdGhlIHBvaW50IHBvc2l0aW9uICovCi0gICAgICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICAgICAgICBwb2ludC0+eCA9IHU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwb2ludC0+eSA9IHU7Ci0KLSAgICAgICAgcG9pbnQtPmZsYWdzIHw9IHRvdWNoX2ZsYWc7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiAgICAgICAgICAgICAgICAgICAgV0VBSyBQT0lOVCBJTlRFUlBPTEFUSU9OCi0gICAqCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogU2hpZnQgdGhlIG9yaWdpbmFsIGNvb3JkaW5hdGVzIG9mIGFsbCBwb2ludHMgYmV0d2VlbiBgcDEnIGFuZCAqLwotICAvKiBgcDInIHRvIGdldCBoaW50ZWQgY29vcmRpbmF0ZXMsIHVzaW5nIHRoZSBzYW1lIGRpZmZlcmVuY2UgYXMgICovCi0gIC8qIGdpdmVuIGJ5IGByZWYnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl9pdXBfc2hpZnQoIEFGX1BvaW50ICBwMSwKLSAgICAgICAgICAgICAgICBBRl9Qb2ludCAgcDIsCi0gICAgICAgICAgICAgICAgQUZfUG9pbnQgIHJlZiApCi0gIHsKLSAgICBBRl9Qb2ludCAgcDsKLSAgICBGVF9Qb3MgICAgZGVsdGEgPSByZWYtPnUgLSByZWYtPnY7Ci0KLQotICAgIGlmICggZGVsdGEgPT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICBmb3IgKCBwID0gcDE7IHAgPCByZWY7IHArKyApCi0gICAgICBwLT51ID0gcC0+diArIGRlbHRhOwotCi0gICAgZm9yICggcCA9IHJlZiArIDE7IHAgPD0gcDI7IHArKyApCi0gICAgICBwLT51ID0gcC0+diArIGRlbHRhOwotICB9Ci0KLQotICAvKiBJbnRlcnBvbGF0ZSB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZXMgb2YgYWxsIHBvaW50cyBiZXR3ZWVuIGBwMScgYW5kICAqLwotICAvKiBgcDInIHRvIGdldCBoaW50ZWQgY29vcmRpbmF0ZXMsIHVzaW5nIGByZWYxJyBhbmQgYHJlZjInIGFzIHRoZSAgICAgICAqLwotICAvKiByZWZlcmVuY2UgcG9pbnRzLiAgVGhlIGB1JyBhbmQgYHYnIG1lbWJlcnMgYXJlIHRoZSBjdXJyZW50IGFuZCAgICAgICAqLwotICAvKiBvcmlnaW5hbCBjb29yZGluYXRlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX2l1cF9pbnRlcnAoIEFGX1BvaW50ICBwMSwKLSAgICAgICAgICAgICAgICAgQUZfUG9pbnQgIHAyLAotICAgICAgICAgICAgICAgICBBRl9Qb2ludCAgcmVmMSwKLSAgICAgICAgICAgICAgICAgQUZfUG9pbnQgIHJlZjIgKQotICB7Ci0gICAgQUZfUG9pbnQgIHA7Ci0gICAgRlRfUG9zICAgIHUsIHYxLCB2MiwgdTEsIHUyLCBkMSwgZDI7Ci0KLQotICAgIGlmICggcDEgPiBwMiApCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAoIHJlZjEtPnYgPiByZWYyLT52ICkKLSAgICB7Ci0gICAgICBwICAgID0gcmVmMTsKLSAgICAgIHJlZjEgPSByZWYyOwotICAgICAgcmVmMiA9IHA7Ci0gICAgfQotCi0gICAgdjEgPSByZWYxLT52OwotICAgIHYyID0gcmVmMi0+djsKLSAgICB1MSA9IHJlZjEtPnU7Ci0gICAgdTIgPSByZWYyLT51OwotICAgIGQxID0gdTEgLSB2MTsKLSAgICBkMiA9IHUyIC0gdjI7Ci0KLSAgICBpZiAoIHUxID09IHUyIHx8IHYxID09IHYyICkKLSAgICB7Ci0gICAgICBmb3IgKCBwID0gcDE7IHAgPD0gcDI7IHArKyApCi0gICAgICB7Ci0gICAgICAgIHUgPSBwLT52OwotCi0gICAgICAgIGlmICggdSA8PSB2MSApCi0gICAgICAgICAgdSArPSBkMTsKLSAgICAgICAgZWxzZSBpZiAoIHUgPj0gdjIgKQotICAgICAgICAgIHUgKz0gZDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB1ID0gdTE7Ci0KLSAgICAgICAgcC0+dSA9IHU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgc2NhbGUgPSBGVF9EaXZGaXgoIHUyIC0gdTEsIHYyIC0gdjEgKTsKLQotCi0gICAgICBmb3IgKCBwID0gcDE7IHAgPD0gcDI7IHArKyApCi0gICAgICB7Ci0gICAgICAgIHUgPSBwLT52OwotCi0gICAgICAgIGlmICggdSA8PSB2MSApCi0gICAgICAgICAgdSArPSBkMTsKLSAgICAgICAgZWxzZSBpZiAoIHUgPj0gdjIgKQotICAgICAgICAgIHUgKz0gZDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB1ID0gdTEgKyBGVF9NdWxGaXgoIHUgLSB2MSwgc2NhbGUgKTsKLQotICAgICAgICBwLT51ID0gdTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIEhpbnQgdGhlIHdlYWsgcG9pbnRzIC0tIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgVHJ1ZVR5cGUgYElVUCcgKi8KLSAgLyogaGludGluZyBpbnN0cnVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2dseXBoX2hpbnRzX2FsaWduX3dlYWtfcG9pbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9Qb2ludCAgIHBvaW50cyAgICAgICAgPSBoaW50cy0+cG9pbnRzOwotICAgIEFGX1BvaW50ICAgcG9pbnRfbGltaXQgICA9IHBvaW50cyArIGhpbnRzLT5udW1fcG9pbnRzOwotICAgIEFGX1BvaW50KiAgY29udG91ciAgICAgICA9IGhpbnRzLT5jb250b3VyczsKLSAgICBBRl9Qb2ludCogIGNvbnRvdXJfbGltaXQgPSBjb250b3VyICsgaGludHMtPm51bV9jb250b3VyczsKLSAgICBGVF9VSW50ICAgIHRvdWNoX2ZsYWc7Ci0gICAgQUZfUG9pbnQgICBwb2ludDsKLSAgICBBRl9Qb2ludCAgIGVuZF9wb2ludDsKLSAgICBBRl9Qb2ludCAgIGZpcnN0X3BvaW50OwotCi0KLSAgICAvKiBQQVNTIDE6IE1vdmUgc2VnbWVudCBwb2ludHMgdG8gZWRnZSBwb3NpdGlvbnMgKi8KLQotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICB7Ci0gICAgICB0b3VjaF9mbGFnID0gQUZfRkxBR19UT1VDSF9YOwotCi0gICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludF9saW1pdDsgcG9pbnQrKyApCi0gICAgICB7Ci0gICAgICAgIHBvaW50LT51ID0gcG9pbnQtPng7Ci0gICAgICAgIHBvaW50LT52ID0gcG9pbnQtPm94OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdG91Y2hfZmxhZyA9IEFGX0ZMQUdfVE9VQ0hfWTsKLQotICAgICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRfbGltaXQ7IHBvaW50KysgKQotICAgICAgewotICAgICAgICBwb2ludC0+dSA9IHBvaW50LT55OwotICAgICAgICBwb2ludC0+diA9IHBvaW50LT5veTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKCA7IGNvbnRvdXIgPCBjb250b3VyX2xpbWl0OyBjb250b3VyKysgKQotICAgIHsKLSAgICAgIEFGX1BvaW50ICBmaXJzdF90b3VjaGVkLCBsYXN0X3RvdWNoZWQ7Ci0KLQotICAgICAgcG9pbnQgICAgICAgPSAqY29udG91cjsKLSAgICAgIGVuZF9wb2ludCAgID0gcG9pbnQtPnByZXY7Ci0gICAgICBmaXJzdF9wb2ludCA9IHBvaW50OwotCi0gICAgICAvKiBmaW5kIGZpcnN0IHRvdWNoZWQgcG9pbnQgKi8KLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIGlmICggcG9pbnQgPiBlbmRfcG9pbnQgKSAgLyogbm8gdG91Y2hlZCBwb2ludCBpbiBjb250b3VyICovCi0gICAgICAgICAgZ290byBOZXh0Q29udG91cjsKLQotICAgICAgICBpZiAoIHBvaW50LT5mbGFncyAmIHRvdWNoX2ZsYWcgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHBvaW50Kys7Ci0gICAgICB9Ci0KLSAgICAgIGZpcnN0X3RvdWNoZWQgPSBwb2ludDsKLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgRlRfQVNTRVJUKCBwb2ludCA8PSBlbmRfcG9pbnQgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgKCBwb2ludC0+ZmxhZ3MgJiB0b3VjaF9mbGFnICkgIT0gMCApOwotCi0gICAgICAgIC8qIHNraXAgYW55IHRvdWNoZWQgbmVpZ2hib3VycyAqLwotICAgICAgICB3aGlsZSAoIHBvaW50IDwgZW5kX3BvaW50ICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICggcG9pbnRbMV0uZmxhZ3MgJiB0b3VjaF9mbGFnICkgIT0gMCApCi0gICAgICAgICAgcG9pbnQrKzsKLQotICAgICAgICBsYXN0X3RvdWNoZWQgPSBwb2ludDsKLQotICAgICAgICAvKiBmaW5kIHRoZSBuZXh0IHRvdWNoZWQgcG9pbnQsIGlmIGFueSAqLwotICAgICAgICBwb2ludCsrOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwb2ludCA+IGVuZF9wb2ludCApCi0gICAgICAgICAgICBnb3RvIEVuZENvbnRvdXI7Ci0KLSAgICAgICAgICBpZiAoICggcG9pbnQtPmZsYWdzICYgdG91Y2hfZmxhZyApICE9IDAgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBwb2ludCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaW50ZXJwb2xhdGUgYmV0d2VlbiBsYXN0X3RvdWNoZWQgYW5kIHBvaW50ICovCi0gICAgICAgIGFmX2l1cF9pbnRlcnAoIGxhc3RfdG91Y2hlZCArIDEsIHBvaW50IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGFzdF90b3VjaGVkLCBwb2ludCApOwotICAgICAgfQotCi0gICAgRW5kQ29udG91cjoKLSAgICAgIC8qIHNwZWNpYWwgY2FzZTogb25seSBvbmUgcG9pbnQgd2FzIHRvdWNoZWQgKi8KLSAgICAgIGlmICggbGFzdF90b3VjaGVkID09IGZpcnN0X3RvdWNoZWQgKQotICAgICAgICBhZl9pdXBfc2hpZnQoIGZpcnN0X3BvaW50LCBlbmRfcG9pbnQsIGZpcnN0X3RvdWNoZWQgKTsKLQotICAgICAgZWxzZSAvKiBpbnRlcnBvbGF0ZSB0aGUgbGFzdCBwYXJ0ICovCi0gICAgICB7Ci0gICAgICAgIGlmICggbGFzdF90b3VjaGVkIDwgZW5kX3BvaW50ICkKLSAgICAgICAgICBhZl9pdXBfaW50ZXJwKCBsYXN0X3RvdWNoZWQgKyAxLCBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF90b3VjaGVkLCBmaXJzdF90b3VjaGVkICk7Ci0KLSAgICAgICAgaWYgKCBmaXJzdF90b3VjaGVkID4gcG9pbnRzICkKLSAgICAgICAgICBhZl9pdXBfaW50ZXJwKCBmaXJzdF9wb2ludCwgZmlyc3RfdG91Y2hlZCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF90b3VjaGVkLCBmaXJzdF90b3VjaGVkICk7Ci0gICAgICB9Ci0KLSAgICBOZXh0Q29udG91cjoKLSAgICAgIDsKLSAgICB9Ci0KLSAgICAvKiBub3cgc2F2ZSB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlcyBiYWNrIHRvIHgveSAqLwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICB7Ci0gICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludF9saW1pdDsgcG9pbnQrKyApCi0gICAgICAgIHBvaW50LT54ID0gcG9pbnQtPnU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludF9saW1pdDsgcG9pbnQrKyApCi0gICAgICAgIHBvaW50LT55ID0gcG9pbnQtPnU7Ci0gICAgfQotICB9Ci0KLQotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUgotCi0gIC8qIEFwcGx5IChzbWFsbCkgd2FycCBzY2FsZSBhbmQgd2FycCBkZWx0YSBmb3IgZ2l2ZW4gZGltZW5zaW9uLiAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2dseXBoX2hpbnRzX3NjYWxlX2RpbSggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgIGRlbHRhICkKLSAgewotICAgIEFGX1BvaW50ICBwb2ludHMgICAgICAgPSBoaW50cy0+cG9pbnRzOwotICAgIEFGX1BvaW50ICBwb2ludHNfbGltaXQgPSBwb2ludHMgKyBoaW50cy0+bnVtX3BvaW50czsKLSAgICBBRl9Qb2ludCAgcG9pbnQ7Ci0KLQotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICB7Ci0gICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludHNfbGltaXQ7IHBvaW50KysgKQotICAgICAgICBwb2ludC0+eCA9IEZUX011bEZpeCggcG9pbnQtPmZ4LCBzY2FsZSApICsgZGVsdGE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludHNfbGltaXQ7IHBvaW50KysgKQotICAgICAgICBwb2ludC0+eSA9IEZUX011bEZpeCggcG9pbnQtPmZ5LCBzY2FsZSApICsgZGVsdGE7Ci0gICAgfQotICB9Ci0KLSNlbmRpZiAvKiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIgKi8KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmhpbnRzLmggYi9zcmMvYXV0b2ZpdC9hZmhpbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjM4YjEuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZoaW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmaGludHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBBRkhJTlRTX0hfCi0jZGVmaW5lIEFGSElOVFNfSF8KLQotI2luY2x1ZGUgImFmdHlwZXMuaCIKLQotI2RlZmluZSB4eEFGX1NPUlRfU0VHTUVOVFMKLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoKLSAgICogIFRoZSBkZWZpbml0aW9uIG9mIG91dGxpbmUgZ2x5cGggaGludHMuICBUaGVzZSBhcmUgc2hhcmVkIGJ5IGFsbAotICAgKiAgd3JpdGluZyBzeXN0ZW0gYW5hbHlzaXMgcm91dGluZXMgKHVudGlsIG5vdykuCi0gICAqLwotCi0gIHR5cGVkZWYgZW51bSAgQUZfRGltZW5zaW9uXwotICB7Ci0gICAgQUZfRElNRU5TSU9OX0hPUlogPSAwLCAgLyogeCBjb29yZGluYXRlcywgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS5lLiwgdmVydGljYWwgc2VnbWVudHMgJiBlZGdlcyAgICovCi0gICAgQUZfRElNRU5TSU9OX1ZFUlQgPSAxLCAgLyogeSBjb29yZGluYXRlcywgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS5lLiwgaG9yaXpvbnRhbCBzZWdtZW50cyAmIGVkZ2VzICovCi0KLSAgICBBRl9ESU1FTlNJT05fTUFYICAvKiBkbyBub3QgcmVtb3ZlICovCi0KLSAgfSBBRl9EaW1lbnNpb247Ci0KLQotICAvKiBoaW50IGRpcmVjdGlvbnMgLS0gdGhlIHZhbHVlcyBhcmUgY29tcHV0ZWQgc28gdGhhdCB0d28gdmVjdG9ycyBhcmUgKi8KLSAgLyogaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyBpZmYgYGRpcjEgKyBkaXIyID09IDAnICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgQUZfRGlyZWN0aW9uXwotICB7Ci0gICAgQUZfRElSX05PTkUgID0gIDQsCi0gICAgQUZfRElSX1JJR0hUID0gIDEsCi0gICAgQUZfRElSX0xFRlQgID0gLTEsCi0gICAgQUZfRElSX1VQICAgID0gIDIsCi0gICAgQUZfRElSX0RPV04gID0gLTIKLQotICB9IEFGX0RpcmVjdGlvbjsKLQotCi0gIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIGV4cGxhbmF0aW9ucyBhcmUgbW9zdGx5IHRha2VuIGZyb20gdGhlIGFydGljbGUKLSAgICoKLSAgICogICAgUmVhbC1UaW1lIEdyaWQgRml0dGluZyBvZiBUeXBvZ3JhcGhpYyBPdXRsaW5lcwotICAgKgotICAgKiAgYnkgRGF2aWQgVHVybmVyIGFuZCBXZXJuZXIgTGVtYmVyZwotICAgKgotICAgKiAgICBodHRwOi8vd3d3LnR1Zy5vcmcvVFVHYm9hdC9BcnRpY2xlcy90YjI0LTMvbGVtYmVyZy5wZGYKLSAgICoKLSAgICogIHdpdGggYXBwcm9wcmlhdGUgdXBkYXRlcy4KLSAgICoKLSAgICoKLSAgICogIFNlZ21lbnRzCi0gICAqCi0gICAqICAgIGBhZl97Y2prLGxhdGluLC4uLn1faGludHNfY29tcHV0ZV9zZWdtZW50cycgYXJlIHRoZSBmdW5jdGlvbnMgdG8KLSAgICogICAgZmluZCBzZWdtZW50cyBpbiBhbiBvdXRsaW5lLgotICAgKgotICAgKiAgICBBIHNlZ21lbnQgaXMgYSBzZXJpZXMgb2YgYXQgbGVhc3QgdHdvIGNvbnNlY3V0aXZlIHBvaW50cyB0aGF0IGFyZQotICAgKiAgICBhcHByb3hpbWF0ZWx5IGFsaWduZWQgYWxvbmcgYSBjb29yZGluYXRlIGF4aXMuICBUaGUgYW5hbHlzaXMgdG8gZG8KLSAgICogICAgc28gaXMgc3BlY2lmaWMgdG8gYSB3cml0aW5nIHN5c3RlbS4KLSAgICoKLSAgICoKLSAgICogIEVkZ2VzCi0gICAqCi0gICAqICAgIGBhZl97Y2prLGxhdGluLC4uLn1faGludHNfY29tcHV0ZV9lZGdlcycgYXJlIHRoZSBmdW5jdGlvbnMgdG8gZmluZAotICAgKiAgICBlZGdlcy4KLSAgICoKLSAgICogICAgQXMgc29vbiBhcyBzZWdtZW50cyBhcmUgZGVmaW5lZCwgdGhlIGF1dG8taGludGVyIGdyb3VwcyB0aGVtIGludG8KLSAgICogICAgZWRnZXMuICBBbiBlZGdlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIHBvc2l0aW9uIG9uIHRoZSBtYWluCi0gICAqICAgIGRpbWVuc2lvbiB0aGF0IGNvbGxlY3RzIG9uZSBvciBtb3JlIHNlZ21lbnRzIChhbGxvd2luZyBmb3IgYSBzbWFsbAotICAgKiAgICB0aHJlc2hvbGQpLgotICAgKgotICAgKiAgICBBcyBhbiBleGFtcGxlLCB0aGUgYGxhdGluJyB3cml0aW5nIHN5c3RlbSBmaXJzdCB0cmllcyB0byBncmlkLWZpdAotICAgKiAgICBlZGdlcywgdGhlbiB0byBhbGlnbiBzZWdtZW50cyBvbiB0aGUgZWRnZXMgdW5sZXNzIGl0IGRldGVjdHMgdGhhdAotICAgKiAgICB0aGV5IGZvcm0gYSBzZXJpZi4KLSAgICoKLSAgICoKLSAgICogICAgICAgICAgICAgICAgICAgICAgQSAgICAgICAgICBICi0gICAqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0gICAqICAgICAgICAgQyAgICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgIEYKLSAgICogICAgICAgICAgKy0tLS0tLTwtLS0tLSsgICAgICAgICstLS0tLTwtLS0tLS0rCi0gICAqICAgICAgICAgIHwgICAgICAgICAgICAgQiAgICAgIEcgICAgICAgICAgICAgfAotICAgKiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICogICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAqICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0+LS0tLS0tLS0tLS0tLS0tLS0tKwotICAgKiAgICAgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFCi0gICAqCi0gICAqCi0gICAqICBTdGVtcwotICAgKgotICAgKiAgICBTdGVtcyBhcmUgZGV0ZWN0ZWQgYnkgYGFmX3tjamssbGF0aW4sLi4ufV9oaW50X2VkZ2VzJy4KLSAgICoKLSAgICogICAgU2VnbWVudHMgbmVlZCB0byBiZSBgbGlua2VkJyB0byBvdGhlciBvbmVzIGluIG9yZGVyIHRvIGRldGVjdCBzdGVtcy4KLSAgICogICAgQSBzdGVtIGlzIG1hZGUgb2YgdHdvIHNlZ21lbnRzIHRoYXQgZmFjZSBlYWNoIG90aGVyIGluIG9wcG9zaXRlCi0gICAqICAgIGRpcmVjdGlvbnMgYW5kIHRoYXQgYXJlIHN1ZmZpY2llbnRseSBjbG9zZSB0byBlYWNoIG90aGVyLiAgVXNpbmcKLSAgICogICAgdm9jYWJ1bGFyeSBmcm9tIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLCBzdGVtIHNlZ21lbnRzIGZvcm0gYQotICAgKiAgICBgYmxhY2sgZGlzdGFuY2UnLgotICAgKgotICAgKiAgICBJbiB0aGUgYWJvdmUgQVNDSUkgZHJhd2luZywgdGhlIGhvcml6b250YWwgc2VnbWVudHMgYXJlIEJDLCBERSwgYW5kCi0gICAqICAgIEZHOyB0aGUgdmVydGljYWwgc2VnbWVudHMgYXJlIEFCLCBDRCwgRUYsIGFuZCBHSC4KLSAgICoKLSAgICogICAgRWFjaCBzZWdtZW50IGhhcyBhdCBtb3N0IG9uZSBgYmVzdCcgY2FuZGlkYXRlIHRvIGZvcm0gYSBibGFjawotICAgKiAgICBkaXN0YW5jZSwgb3Igbm8gY2FuZGlkYXRlIGF0IGFsbC4gIE5vdGljZSB0aGF0IHR3byBkaXN0aW5jdCBzZWdtZW50cwotICAgKiAgICBjYW4gaGF2ZSB0aGUgc2FtZSBjYW5kaWRhdGUsIHdoaWNoIGZyZXF1ZW50bHkgbWVhbnMgYSBzZXJpZi4KLSAgICoKLSAgICogICAgQSBzdGVtIGlzIHJlY29nbml6ZWQgYnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb246Ci0gICAqCi0gICAqICAgICAgYmVzdCBzZWdtZW50XzEgPSBzZWdtZW50XzIgJiYgYmVzdCBzZWdtZW50XzIgPSBzZWdtZW50XzEKLSAgICoKLSAgICogICAgVGhlIGJlc3QgY2FuZGlkYXRlIGlzIHN0b3JlZCBpbiBmaWVsZCBgbGluaycgaW4gc3RydWN0dXJlCi0gICAqICAgIGBBRl9TZWdtZW50Jy4KLSAgICoKLSAgICogICAgSW4gdGhlIGFib3ZlIEFTQ0lJIGRyYXdpbmcsIHRoZSBiZXN0IGNhbmRpZGF0ZSBmb3IgYm90aCBBQiBhbmQgQ0QgaXMKLSAgICogICAgR0gsIHdoaWxlIHRoZSBiZXN0IGNhbmRpZGF0ZSBmb3IgR0ggaXMgQUIuICBTaW1pbGFybHksIHRoZSBiZXN0Ci0gICAqICAgIGNhbmRpZGF0ZSBmb3IgRUYgYW5kIEdIIGlzIEFCLCB3aGlsZSB0aGUgYmVzdCBjYW5kaWRhdGUgZm9yIEFCIGlzCi0gICAqICAgIEdILgotICAgKgotICAgKiAgICBUaGUgZGV0ZWN0aW9uIGFuZCBoYW5kbGluZyBvZiBzdGVtcyBpcyBkZXBlbmRlbnQgb24gdGhlIHdyaXRpbmcKLSAgICogICAgc3lzdGVtLgotICAgKgotICAgKgotICAgKiAgU2VyaWZzCi0gICAqCi0gICAqICAgIFNlcmlmcyBhcmUgZGV0ZWN0ZWQgYnkgYGFmX3tjamssbGF0aW4sLi4ufV9oaW50X2VkZ2VzJy4KLSAgICoKLSAgICogICAgSW4gY29tcGFyaXNvbiB0byBhIHN0ZW0sIGEgc2VyaWYgKGFzIGhhbmRsZWQgYnkgdGhlIGF1dG8taGludGVyCi0gICAqICAgIG1vZHVsZSB0aGF0IHRha2VzIGNhcmUgb2YgdGhlIGBsYXRpbicgd3JpdGluZyBzeXN0ZW0pIGhhcwotICAgKgotICAgKiAgICAgIGJlc3Qgc2VnbWVudF8xID0gc2VnbWVudF8yICYmIGJlc3Qgc2VnbWVudF8yICE9IHNlZ21lbnRfMQotICAgKgotICAgKiAgICB3aGVyZSBzZWdtZW50XzEgY29ycmVzcG9uZHMgdG8gdGhlIHNlcmlmIHNlZ21lbnQgKENEIGFuZCBFRiBpbiB0aGUKLSAgICogICAgYWJvdmUgQVNDSUkgZHJhd2luZykuCi0gICAqCi0gICAqICAgIFRoZSBiZXN0IGNhbmRpZGF0ZSBpcyBzdG9yZWQgaW4gZmllbGQgYHNlcmlmJyBpbiBzdHJ1Y3R1cmUKLSAgICogICAgYEFGX1NlZ21lbnQnIChhbmQgYGxpbmsnIGlzIHNldCB0byBOVUxMKS4KLSAgICoKLSAgICoKLSAgICogIFRvdWNoZWQgcG9pbnRzCi0gICAqCi0gICAqICAgIEEgcG9pbnQgaXMgY2FsbGVkIGB0b3VjaGVkJyBpZiBpdCBoYXMgYmVlbiBwcm9jZXNzZWQgc29tZWhvdyBieSB0aGUKLSAgICogICAgYXV0by1oaW50ZXIuICBJdCBiYXNpY2FsbHkgbWVhbnMgdGhhdCBpdCBzaG91bGRuJ3QgYmUgbW92ZWQgYWdhaW4KLSAgICogICAgKG9yIG1vdmVkIG9ubHkgdW5kZXIgY2VydGFpbiBjb25zdHJhaW50cyB0byBwcmVzZXJ2ZSB0aGUgYWxyZWFkeQotICAgKiAgICBhcHBsaWVkIHByb2Nlc3NpbmcpLgotICAgKgotICAgKgotICAgKiAgRmxhdCBhbmQgcm91bmQgc2VnbWVudHMKLSAgICoKLSAgICogICAgU2VnbWVudHMgYXJlIGByb3VuZCcgb3IgYGZsYXQnLCBkZXBlbmRpbmcgb24gdGhlIHNlcmllcyBvZiBwb2ludHMKLSAgICogICAgdGhhdCBkZWZpbmUgdGhlbS4gIEEgc2VnbWVudCBpcyByb3VuZCBpZiB0aGUgbmV4dCBhbmQgcHJldmlvdXMgcG9pbnQKLSAgICogICAgb2YgYW4gZXh0cmVtdW0gKHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgcG9pbnQgb3Igc2VxdWVuY2Ugb2YKLSAgICogICAgcG9pbnRzKSBhcmUgYm90aCBjb25pYyBvciBjdWJpYyBjb250cm9sIHBvaW50cy4gIE90aGVyd2lzZSwgYQotICAgKiAgICBzZWdtZW50IHdpdGggYW4gZXh0cmVtdW0gaXMgZmxhdC4KLSAgICoKLSAgICoKLSAgICogIFN0cm9uZyBQb2ludHMKLSAgICoKLSAgICogICAgRXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBwb2ludHMgbm90IHBhcnQgb2YgYW4gZWRnZSBuZWVkIHRvIGJlCi0gICAqICAgIGludGVycG9sYXRlZCBsaW5lYXJseSBiZXR3ZWVuIHRoZWlyIHR3byBjbG9zZXN0IGVkZ2VzLCBldmVuIGlmIHRoZXNlCi0gICAqICAgIGFyZSBub3QgcGFydCBvZiB0aGUgY29udG91ciBvZiB0aG9zZSBwYXJ0aWN1bGFyIHBvaW50cy4gIFR5cGljYWwKLSAgICogICAgY2FuZGlkYXRlcyBmb3IgdGhpcyBhcmUKLSAgICoKLSAgICogICAgLSBhbmdsZSBwb2ludHMgKGkuZS4sIHBvaW50cyB3aGVyZSB0aGUgYGluJyBhbmQgYG91dCcgZGlyZWN0aW9uCi0gICAqICAgICAgZGlmZmVyIGdyZWF0bHkpCi0gICAqCi0gICAqICAgIC0gaW5mbGVjdGlvbiBwb2ludHMgKGkuZS4sIHdoZXJlIHRoZSBgaW4nIGFuZCBgb3V0JyBhbmdsZXMgYXJlIHRoZQotICAgKiAgICAgIHNhbWUsIGJ1dCB0aGUgY3VydmF0dXJlIGNoYW5nZXMgc2lnbikgW2N1cnJlbnRseSwgc3VjaCBwb2ludHMKLSAgICogICAgICBhcmVuJ3QgaGFuZGxlZCBzcGVjaWFsbHkgaW4gdGhlIGF1dG8taGludGVyXQotICAgKgotICAgKiAgICBgYWZfZ2x5cGhfaGludHNfYWxpZ25fc3Ryb25nX3BvaW50cycgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgdGFrZXMKLSAgICogICAgY2FyZSBvZiBzdWNoIHNpdHVhdGlvbnM7IGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIFRydWVUeXBlIGBJUCcKLSAgICogICAgaGludGluZyBpbnN0cnVjdGlvbi4KLSAgICoKLSAgICoKLSAgICogIFdlYWsgUG9pbnRzCi0gICAqCi0gICAqICAgIE90aGVyIHBvaW50cyBpbiB0aGUgb3V0bGluZSBtdXN0IGJlIGludGVycG9sYXRlZCB1c2luZyB0aGUKLSAgICogICAgY29vcmRpbmF0ZXMgb2YgdGhlaXIgcHJldmlvdXMgYW5kIG5leHQgdW5maXR0ZWQgY29udG91ciBuZWlnaGJvdXJzLgotICAgKiAgICBUaGVzZSBhcmUgY2FsbGVkIGB3ZWFrIHBvaW50cycgYW5kIGFyZSB0b3VjaGVkIGJ5IHRoZSBmdW5jdGlvbgotICAgKiAgICBgYWZfZ2x5cGhfaGludHNfYWxpZ25fd2Vha19wb2ludHMnLCBlcXVpdmFsZW50IHRvIHRoZSBUcnVlVHlwZSBgSVVQJwotICAgKiAgICBoaW50aW5nIGluc3RydWN0aW9uLiAgVHlwaWNhbCBjYW5kaWRhdGVzIGFyZSBjb250cm9sIHBvaW50cyBhbmQKLSAgICogICAgcG9pbnRzIG9uIHRoZSBjb250b3VyIHdpdGhvdXQgYSBtYWpvciBkaXJlY3Rpb24uCi0gICAqCi0gICAqICAgIFRoZSBtYWpvciBlZmZlY3QgaXMgdG8gcmVkdWNlIHBvc3NpYmxlIGRpc3RvcnRpb24gY2F1c2VkIGJ5Ci0gICAqICAgIGFsaWdubWVudCBvZiBlZGdlcyBhbmQgc3Ryb25nIHBvaW50cywgdGh1cyB3ZWFrIHBvaW50cyBhcmUgcHJvY2Vzc2VkCi0gICAqICAgIGFmdGVyIHN0cm9uZyBwb2ludHMuCi0gICAqLwotCi0KLSAgLyogcG9pbnQgaGludCBmbGFncyAqLwotI2RlZmluZSBBRl9GTEFHX05PTkUgIDAKLQotICAvKiBwb2ludCB0eXBlIGZsYWdzICovCi0jZGVmaW5lIEFGX0ZMQUdfQ09OSUMgICAgKCAxVSA8PCAwICkKLSNkZWZpbmUgQUZfRkxBR19DVUJJQyAgICAoIDFVIDw8IDEgKQotI2RlZmluZSBBRl9GTEFHX0NPTlRST0wgICggQUZfRkxBR19DT05JQyB8IEFGX0ZMQUdfQ1VCSUMgKQotCi0gIC8qIHBvaW50IHRvdWNoIGZsYWdzICovCi0jZGVmaW5lIEFGX0ZMQUdfVE9VQ0hfWCAgKCAxVSA8PCAyICkKLSNkZWZpbmUgQUZfRkxBR19UT1VDSF9ZICAoIDFVIDw8IDMgKQotCi0gIC8qIGNhbmRpZGF0ZXMgZm9yIHdlYWsgaW50ZXJwb2xhdGlvbiBoYXZlIHRoaXMgZmxhZyBzZXQgKi8KLSNkZWZpbmUgQUZfRkxBR19XRUFLX0lOVEVSUE9MQVRJT04gICggMVUgPDwgNCApCi0KLSAgLyogdGhlIGRpc3RhbmNlIHRvIHRoZSBuZXh0IHBvaW50IGlzIHZlcnkgc21hbGwgKi8KLSNkZWZpbmUgQUZfRkxBR19ORUFSICAoIDFVIDw8IDUgKQotCi0KLSAgLyogZWRnZSBoaW50IGZsYWdzICovCi0jZGVmaW5lIEFGX0VER0VfTk9STUFMICAwCi0jZGVmaW5lIEFGX0VER0VfUk9VTkQgICAgKCAxVSA8PCAwICkKLSNkZWZpbmUgQUZfRURHRV9TRVJJRiAgICAoIDFVIDw8IDEgKQotI2RlZmluZSBBRl9FREdFX0RPTkUgICAgICggMVUgPDwgMiApCi0jZGVmaW5lIEFGX0VER0VfTkVVVFJBTCAgKCAxVSA8PCAzICkgLyogZWRnZSBhbGlnbnMgdG8gYSBuZXV0cmFsIGJsdWUgem9uZSAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgQUZfUG9pbnRSZWNfKiAgICBBRl9Qb2ludDsKLSAgdHlwZWRlZiBzdHJ1Y3QgQUZfU2VnbWVudFJlY18qICBBRl9TZWdtZW50OwotICB0eXBlZGVmIHN0cnVjdCBBRl9FZGdlUmVjXyogICAgIEFGX0VkZ2U7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfUG9pbnRSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIGZsYWdzOyAgICAvKiBwb2ludCBmbGFncyB1c2VkIGJ5IGhpbnRlciAgICovCi0gICAgRlRfQ2hhciAgICBpbl9kaXI7ICAgLyogZGlyZWN0aW9uIG9mIGlud2FyZHMgdmVjdG9yICAqLwotICAgIEZUX0NoYXIgICAgb3V0X2RpcjsgIC8qIGRpcmVjdGlvbiBvZiBvdXR3YXJkcyB2ZWN0b3IgKi8KLQotICAgIEZUX1BvcyAgICAgb3gsIG95OyAgIC8qIG9yaWdpbmFsLCBzY2FsZWQgcG9zaXRpb24gICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgIGZ4LCBmeTsgICAvKiBvcmlnaW5hbCwgdW5zY2FsZWQgcG9zaXRpb24gKGluIGZvbnQgdW5pdHMpICovCi0gICAgRlRfUG9zICAgICB4LCB5OyAgICAgLyogY3VycmVudCBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1BvcyAgICAgdSwgdjsgICAgIC8qIGN1cnJlbnQgKHgseSkgb3IgKHkseCkgZGVwZW5kaW5nIG9uIGNvbnRleHQgKi8KLQotICAgIEFGX1BvaW50ICAgbmV4dDsgICAgIC8qIG5leHQgcG9pbnQgaW4gY29udG91ciAgICAgKi8KLSAgICBBRl9Qb2ludCAgIHByZXY7ICAgICAvKiBwcmV2aW91cyBwb2ludCBpbiBjb250b3VyICovCi0KLSAgfSBBRl9Qb2ludFJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9TZWdtZW50UmVjXwotICB7Ci0gICAgRlRfQnl0ZSAgICAgZmxhZ3M7ICAgICAgIC8qIGVkZ2Uvc2VnbWVudCBmbGFncyBmb3IgdGhpcyBzZWdtZW50ICovCi0gICAgRlRfQ2hhciAgICAgZGlyOyAgICAgICAgIC8qIHNlZ21lbnQgZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfU2hvcnQgICAgcG9zOyAgICAgICAgIC8qIHBvc2l0aW9uIG9mIHNlZ21lbnQgICAgICAgICAgICAgICAgICovCi0gICAgRlRfU2hvcnQgICAgZGVsdGE7ICAgICAgIC8qIGRldmlhdGlvbiBmcm9tIHNlZ21lbnQgcG9zaXRpb24gICAgICovCi0gICAgRlRfU2hvcnQgICAgbWluX2Nvb3JkOyAgIC8qIG1pbmltdW0gY29vcmRpbmF0ZSBvZiBzZWdtZW50ICAgICAgICovCi0gICAgRlRfU2hvcnQgICAgbWF4X2Nvb3JkOyAgIC8qIG1heGltdW0gY29vcmRpbmF0ZSBvZiBzZWdtZW50ICAgICAgICovCi0gICAgRlRfU2hvcnQgICAgaGVpZ2h0OyAgICAgIC8qIHRoZSBoaW50ZWQgc2VnbWVudCBoZWlnaHQgICAgICAgICAgICovCi0KLSAgICBBRl9FZGdlICAgICBlZGdlOyAgICAgICAgLyogdGhlIHNlZ21lbnQncyBwYXJlbnQgZWRnZSAgICAgICAgICAgKi8KLSAgICBBRl9TZWdtZW50ICBlZGdlX25leHQ7ICAgLyogbGluayB0byBuZXh0IHNlZ21lbnQgaW4gcGFyZW50IGVkZ2UgKi8KLQotICAgIEFGX1NlZ21lbnQgIGxpbms7ICAgICAgICAvKiAoc3RlbSkgbGluayBzZWdtZW50ICAgICAgICAqLwotICAgIEFGX1NlZ21lbnQgIHNlcmlmOyAgICAgICAvKiBwcmltYXJ5IHNlZ21lbnQgZm9yIHNlcmlmcyAqLwotICAgIEZUX1BvcyAgICAgIHNjb3JlOyAgICAgICAvKiB1c2VkIGR1cmluZyBzdGVtIG1hdGNoaW5nICAqLwotICAgIEZUX1BvcyAgICAgIGxlbjsgICAgICAgICAvKiB1c2VkIGR1cmluZyBzdGVtIG1hdGNoaW5nICAqLwotCi0gICAgQUZfUG9pbnQgICAgZmlyc3Q7ICAgICAgIC8qIGZpcnN0IHBvaW50IGluIGVkZ2Ugc2VnbWVudCAqLwotICAgIEFGX1BvaW50ICAgIGxhc3Q7ICAgICAgICAvKiBsYXN0IHBvaW50IGluIGVkZ2Ugc2VnbWVudCAgKi8KLQotICB9IEFGX1NlZ21lbnRSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfRWRnZVJlY18KLSAgewotICAgIEZUX1Nob3J0ICAgIGZwb3M7ICAgICAgIC8qIG9yaWdpbmFsLCB1bnNjYWxlZCBwb3NpdGlvbiAoaW4gZm9udCB1bml0cykgKi8KLSAgICBGVF9Qb3MgICAgICBvcG9zOyAgICAgICAvKiBvcmlnaW5hbCwgc2NhbGVkIHBvc2l0aW9uICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfUG9zICAgICAgcG9zOyAgICAgICAgLyogY3VycmVudCBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfQnl0ZSAgICAgZmxhZ3M7ICAgICAgLyogZWRnZSBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9DaGFyICAgICBkaXI7ICAgICAgICAvKiBlZGdlIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0ZpeGVkICAgIHNjYWxlOyAgICAgIC8qIHVzZWQgdG8gc3BlZWQgdXAgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGVkZ2VzICovCi0KLSAgICBBRl9XaWR0aCAgICBibHVlX2VkZ2U7ICAvKiBub24tTlVMTCBpZiB0aGlzIGlzIGEgYmx1ZSBlZGdlICovCi0gICAgQUZfRWRnZSAgICAgbGluazsgICAgICAgLyogbGluayBlZGdlICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX0VkZ2UgICAgIHNlcmlmOyAgICAgIC8qIHByaW1hcnkgZWRnZSBmb3Igc2VyaWZzICAgICAgICAgKi8KLSAgICBGVF9JbnQgICAgICBzY29yZTsgICAgICAvKiB1c2VkIGR1cmluZyBzdGVtIG1hdGNoaW5nICAgICAgICovCi0KLSAgICBBRl9TZWdtZW50ICBmaXJzdDsgICAgICAvKiBmaXJzdCBzZWdtZW50IGluIGVkZ2UgKi8KLSAgICBBRl9TZWdtZW50ICBsYXN0OyAgICAgICAvKiBsYXN0IHNlZ21lbnQgaW4gZWRnZSAgKi8KLQotICB9IEFGX0VkZ2VSZWM7Ci0KLSNkZWZpbmUgQUZfU0VHTUVOVFNfRU1CRURERUQgIDE4ICAgLyogbnVtYmVyIG9mIGVtYmVkZGVkIHNlZ21lbnRzICAgKi8KLSNkZWZpbmUgQUZfRURHRVNfRU1CRURERUQgICAgIDEyICAgLyogbnVtYmVyIG9mIGVtYmVkZGVkIGVkZ2VzICAgICAgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfQXhpc0hpbnRzUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICAgICBudW1fc2VnbWVudHM7IC8qIG51bWJlciBvZiB1c2VkIHNlZ21lbnRzICAgICAgKi8KLSAgICBGVF9JbnQgICAgICAgIG1heF9zZWdtZW50czsgLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBzZWdtZW50cyAqLwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHM7ICAgICAvKiBzZWdtZW50cyBhcnJheSAgICAgICAgICAgICAgICovCi0jaWZkZWYgQUZfU09SVF9TRUdNRU5UUwotICAgIEZUX0ludCAgICAgICAgbWlkX3NlZ21lbnRzOwotI2VuZGlmCi0KLSAgICBGVF9JbnQgICAgICAgIG51bV9lZGdlczsgICAgLyogbnVtYmVyIG9mIHVzZWQgZWRnZXMgICAgICAqLwotICAgIEZUX0ludCAgICAgICAgbWF4X2VkZ2VzOyAgICAvKiBudW1iZXIgb2YgYWxsb2NhdGVkIGVkZ2VzICovCi0gICAgQUZfRWRnZSAgICAgICBlZGdlczsgICAgICAgIC8qIGVkZ2VzIGFycmF5ICAgICAgICAgICAgICAgKi8KLQotICAgIEFGX0RpcmVjdGlvbiAgbWFqb3JfZGlyOyAgICAvKiBlaXRoZXIgdmVydGljYWwgb3IgaG9yaXpvbnRhbCAqLwotCi0gICAgLyogdHdvIGFycmF5cyB0byBhdm9pZCBhbGxvY2F0aW9uIHBlbmFsdHkgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBBRl9TZWdtZW50UmVjICBzZWdtZW50c1tBRl9TRUdNRU5UU19FTUJFRERFRF07Ci0gICAgICBBRl9FZGdlUmVjICAgICBlZGdlc1tBRl9FREdFU19FTUJFRERFRF07Ci0gICAgfSBlbWJlZGRlZDsKLQotCi0gIH0gQUZfQXhpc0hpbnRzUmVjLCAqQUZfQXhpc0hpbnRzOwotCi0KLSNkZWZpbmUgQUZfUE9JTlRTX0VNQkVEREVEICAgICA5NiAgIC8qIG51bWJlciBvZiBlbWJlZGRlZCBwb2ludHMgICAqLwotI2RlZmluZSBBRl9DT05UT1VSU19FTUJFRERFRCAgICA4ICAgLyogbnVtYmVyIG9mIGVtYmVkZGVkIGNvbnRvdXJzICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX0dseXBoSGludHNSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeTsKLQotICAgIEZUX0ZpeGVkICAgICAgICAgeF9zY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgICAgIHhfZGVsdGE7Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgIHlfc2NhbGU7Ci0gICAgRlRfUG9zICAgICAgICAgICB5X2RlbHRhOwotCi0gICAgRlRfSW50ICAgICAgICAgICBtYXhfcG9pbnRzOyAgICAvKiBudW1iZXIgb2YgYWxsb2NhdGVkIHBvaW50cyAqLwotICAgIEZUX0ludCAgICAgICAgICAgbnVtX3BvaW50czsgICAgLyogbnVtYmVyIG9mIHVzZWQgcG9pbnRzICAgICAgKi8KLSAgICBBRl9Qb2ludCAgICAgICAgIHBvaW50czsgICAgICAgIC8qIHBvaW50cyBhcnJheSAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9JbnQgICAgICAgICAgIG1heF9jb250b3VyczsgIC8qIG51bWJlciBvZiBhbGxvY2F0ZWQgY29udG91cnMgKi8KLSAgICBGVF9JbnQgICAgICAgICAgIG51bV9jb250b3VyczsgIC8qIG51bWJlciBvZiB1c2VkIGNvbnRvdXJzICAgICAgKi8KLSAgICBBRl9Qb2ludCogICAgICAgIGNvbnRvdXJzOyAgICAgIC8qIGNvbnRvdXJzIGFycmF5ICAgICAgICAgICAgICAgKi8KLQotICAgIEFGX0F4aXNIaW50c1JlYyAgYXhpc1tBRl9ESU1FTlNJT05fTUFYXTsKLQotICAgIEZUX1VJbnQzMiAgICAgICAgc2NhbGVyX2ZsYWdzOyAgLyogY29weSBvZiBzY2FsZXIgZmxhZ3MgICAgKi8KLSAgICBGVF9VSW50MzIgICAgICAgIG90aGVyX2ZsYWdzOyAgIC8qIGZyZWUgZm9yIHN0eWxlLXNwZWNpZmljICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbXBsZW1lbnRhdGlvbnMgICAgICAgICAqLwotICAgIEFGX1N0eWxlTWV0cmljcyAgbWV0cmljczsKLQotICAgIEZUX1BvcyAgICAgICAgICAgeG1pbl9kZWx0YTsgICAgLyogdXNlZCBmb3Igd2FycGluZyAqLwotICAgIEZUX1BvcyAgICAgICAgICAgeG1heF9kZWx0YTsKLQotICAgIC8qIFR3byBhcnJheXMgdG8gYXZvaWQgYWxsb2NhdGlvbiBwZW5hbHR5LiAgICAgICAgICAgICovCi0gICAgLyogVGhlIGBlbWJlZGRlZCcgc3RydWN0dXJlIG11c3QgYmUgdGhlIGxhc3QgZWxlbWVudCEgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBBRl9Qb2ludCAgICAgICBjb250b3Vyc1tBRl9DT05UT1VSU19FTUJFRERFRF07Ci0gICAgICBBRl9Qb2ludFJlYyAgICBwb2ludHNbQUZfUE9JTlRTX0VNQkVEREVEXTsKLSAgICB9IGVtYmVkZGVkOwotCi0gIH0gQUZfR2x5cGhIaW50c1JlYzsKLQotCi0jZGVmaW5lIEFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBmICkgICggKGgpLT5zY2FsZXJfZmxhZ3MgJiAoZikgKQotI2RlZmluZSBBRl9ISU5UU19URVNUX09USEVSKCBoLCBmICkgICAoIChoKS0+b3RoZXJfZmxhZ3MgICYgKGYpICkKLQotCi0jaWZkZWYgRlRfREVCVUdfQVVUT0ZJVAotCi0jZGVmaW5lIEFGX0hJTlRTX0RPX0hPUklaT05UQUwoIGggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAhX2FmX2RlYnVnX2Rpc2FibGVfaG9yel9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgICAgICAgICAhQUZfSElOVFNfVEVTVF9TQ0FMRVIoIGgsIEFGX1NDQUxFUl9GTEFHX05PX0hPUklaT05UQUwgKSApCi0KLSNkZWZpbmUgQUZfSElOVFNfRE9fVkVSVElDQUwoIGggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAhX2FmX2RlYnVnX2Rpc2FibGVfdmVydF9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAotICAgICAgICAgICAgIUFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBBRl9TQ0FMRVJfRkxBR19OT19WRVJUSUNBTCApICkKLQotI2RlZmluZSBBRl9ISU5UU19ET19CTFVFUyggaCApICAoICFfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzICkKLQotI2Vsc2UgLyogIUZUX0RFQlVHX0FVVE9GSVQgKi8KLQotI2RlZmluZSBBRl9ISU5UU19ET19IT1JJWk9OVEFMKCBoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAhQUZfSElOVFNfVEVTVF9TQ0FMRVIoIGgsIEFGX1NDQUxFUl9GTEFHX05PX0hPUklaT05UQUwgKQotCi0jZGVmaW5lIEFGX0hJTlRTX0RPX1ZFUlRJQ0FMKCBoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAhQUZfSElOVFNfVEVTVF9TQ0FMRVIoIGgsIEFGX1NDQUxFUl9GTEFHX05PX1ZFUlRJQ0FMICkKLQotI2RlZmluZSBBRl9ISU5UU19ET19CTFVFUyggaCApICAxCi0KLSNlbmRpZiAvKiAhRlRfREVCVUdfQVVUT0ZJVCAqLwotCi0KLSNkZWZpbmUgQUZfSElOVFNfRE9fQURWQU5DRSggaCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIUFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBBRl9TQ0FMRVJfRkxBR19OT19BRFZBTkNFICkKLQotI2RlZmluZSBBRl9ISU5UU19ET19XQVJQKCBoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICFBRl9ISU5UU19URVNUX1NDQUxFUiggaCwgQUZfU0NBTEVSX0ZMQUdfTk9fV0FSUEVSICkKLQotCi0KLSAgRlRfTE9DQUwoIEFGX0RpcmVjdGlvbiApCi0gIGFmX2RpcmVjdGlvbl9jb21wdXRlKCBGVF9Qb3MgIGR4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBkeSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfYXhpc19oaW50c19uZXdfc2VnbWVudCggQUZfQXhpc0hpbnRzICBheGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU2VnbWVudCAgICphc2VnbWVudCApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvcikKLSAgYWZfYXhpc19oaW50c19uZXdfZWRnZSggQUZfQXhpc0hpbnRzICBheGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGZwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpcmVjdGlvbiAgZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgIHRvcF90b19ib3R0b21faGludGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAqZWRnZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfaW5pdCggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfcmVzY2FsZSggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU3R5bGVNZXRyaWNzICBtZXRyaWNzICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfZ2x5cGhfaGludHNfcmVsb2FkKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICBvdXRsaW5lICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19zYXZlKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgb3V0bGluZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfYWxpZ25fZWRnZV9wb2ludHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19hbGlnbl9zdHJvbmdfcG9pbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19hbGlnbl93ZWFrX3BvaW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKTsKLQotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUgotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX2dseXBoX2hpbnRzX3NjYWxlX2RpbSggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgIGRlbHRhICk7Ci0jZW5kaWYKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX2dseXBoX2hpbnRzX2RvbmUoIEFGX0dseXBoSGludHMgIGhpbnRzICk7Ci0KLS8qICovCi0KLSNkZWZpbmUgQUZfU0VHTUVOVF9MRU4oIHNlZyApICAgICAgICAgICggKHNlZyktPm1heF9jb29yZCAtIChzZWcpLT5taW5fY29vcmQgKQotCi0jZGVmaW5lIEFGX1NFR01FTlRfRElTVCggc2VnMSwgc2VnMiApICAoICggKHNlZzEpLT5wb3MgPiAoc2VnMiktPnBvcyApICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHNlZzEpLT5wb3MgLSAoc2VnMiktPnBvcyAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzZWcyKS0+cG9zIC0gKHNlZzEpLT5wb3MgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEFGSElOVFNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmaW5kaWMuYyBiL3NyYy9hdXRvZml0L2FmaW5kaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiZTQ2ZS4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmluZGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZpbmRpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIEluZGljIHdyaXRpbmcgc3lzdGVtIChib2R5KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSYWh1bCBCaGFsZXJhbyA8cmFodWwuYmhhbGVyYW9AcmVkaGF0LmNvbT4sIDxiLnJhaHVsLnBtQGdtYWlsLmNvbT4uICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYWZ0eXBlcy5oIgotI2luY2x1ZGUgImFmbGF0aW4uaCIKLSNpbmNsdWRlICJhZmNqay5oIgotCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0lORElDCi0KLSNpbmNsdWRlICJhZmluZGljLmgiCi0jaW5jbHVkZSAiYWZlcnJvcnMuaCIKLQotCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCi0jaW5jbHVkZSAiYWZ3YXJwLmgiCi0jZW5kaWYKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9pbmRpY19tZXRyaWNzX2luaXQoIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSApCi0gIHsKLSAgICAvKiBza2lwIGJsdWUgem9uZSBpbml0IGluIENKSyByb3V0aW5lcyAqLwotICAgIEZUX0NoYXJNYXAgIG9sZG1hcCA9IGZhY2UtPmNoYXJtYXA7Ci0KLQotICAgIG1ldHJpY3MtPnVuaXRzX3Blcl9lbSA9IGZhY2UtPnVuaXRzX3Blcl9FTTsKLQotICAgIGlmICggRlRfU2VsZWN0X0NoYXJtYXAoIGZhY2UsIEZUX0VOQ09ESU5HX1VOSUNPREUgKSApCi0gICAgICBmYWNlLT5jaGFybWFwID0gTlVMTDsKLSAgICBlbHNlCi0gICAgewotICAgICAgYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMoIG1ldHJpY3MsIGZhY2UgKTsKLSNpZiAwCi0gICAgICAvKiBlaXRoZXIgbmVlZCBpbmRpYyBzcGVjaWZpYyBibHVlX2NoYXJzW10gb3IganVzdCBza2lwIGJsdWUgem9uZXMgKi8KLSAgICAgIGFmX2Nqa19tZXRyaWNzX2luaXRfYmx1ZXMoIG1ldHJpY3MsIGZhY2UsIGFmX2Nqa19ibHVlX2NoYXJzICk7Ci0jZW5kaWYKLSAgICAgIGFmX2Nqa19tZXRyaWNzX2NoZWNrX2RpZ2l0cyggbWV0cmljcywgZmFjZSApOwotICAgIH0KLQotICAgIEZUX1NldF9DaGFybWFwKCBmYWNlLCBvbGRtYXAgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX2luZGljX21ldHJpY3Nfc2NhbGUoIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgIHNjYWxlciApCi0gIHsKLSAgICAvKiB1c2UgQ0pLIHJvdXRpbmVzICovCi0gICAgYWZfY2prX21ldHJpY3Nfc2NhbGUoIG1ldHJpY3MsIHNjYWxlciApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZfaW5kaWNfaGludHNfaW5pdCggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgLyogdXNlIENKSyByb3V0aW5lcyAqLwotICAgIHJldHVybiBhZl9jamtfaGludHNfaW5pdCggaGludHMsIG1ldHJpY3MgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2luZGljX2hpbnRzX2FwcGx5KCBGVF9VSW50ICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX0NKS01ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgLyogdXNlIENKSyByb3V0aW5lcyAqLwotICAgIHJldHVybiBhZl9jamtfaGludHNfYXBwbHkoIGdseXBoX2luZGV4LCBoaW50cywgb3V0bGluZSwgbWV0cmljcyApOwotICB9Ci0KLQotICAvKiBFeHRyYWN0IHN0YW5kYXJkX3dpZHRoIGZyb20gd3JpdGluZyBzeXN0ZW0vc2NyaXB0IHNwZWNpZmljICovCi0gIC8qIG1ldHJpY3MgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl9pbmRpY19nZXRfc3RhbmRhcmRfd2lkdGhzKCBBRl9DSktNZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgICBzdGRIVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgICAgc3RkVlcgKQotICB7Ci0gICAgaWYgKCBzdGRIVyApCi0gICAgICAqc3RkSFcgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXS5zdGFuZGFyZF93aWR0aDsKLQotICAgIGlmICggc3RkVlcgKQotICAgICAgKnN0ZFZXID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uc3RhbmRhcmRfd2lkdGg7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICBJIE4gRCBJIEMgICBTIEMgUiBJIFAgVCAgIEMgTCBBIFMgUyAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgQUZfREVGSU5FX1dSSVRJTkdfU1lTVEVNX0NMQVNTKAotICAgIGFmX2luZGljX3dyaXRpbmdfc3lzdGVtX2NsYXNzLAotCi0gICAgQUZfV1JJVElOR19TWVNURU1fSU5ESUMsCi0KLSAgICBzaXplb2YgKCBBRl9DSktNZXRyaWNzUmVjICksCi0KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9Jbml0TWV0cmljc0Z1bmMpIGFmX2luZGljX21ldHJpY3NfaW5pdCwgICAgICAgIC8qIHN0eWxlX21ldHJpY3NfaW5pdCAgICAqLwotICAgIChBRl9Xcml0aW5nU3lzdGVtX1NjYWxlTWV0cmljc0Z1bmMpYWZfaW5kaWNfbWV0cmljc19zY2FsZSwgICAgICAgLyogc3R5bGVfbWV0cmljc19zY2FsZSAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fRG9uZU1ldHJpY3NGdW5jKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHlsZV9tZXRyaWNzX2RvbmUgICAgKi8KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9HZXRTdGRXaWR0aHNGdW5jKWFmX2luZGljX2dldF9zdGFuZGFyZF93aWR0aHMsIC8qIHN0eWxlX21ldHJpY3NfZ2V0c3RkdyAqLwotCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fSW5pdEhpbnRzRnVuYykgICBhZl9pbmRpY19oaW50c19pbml0LCAgICAgICAgICAvKiBzdHlsZV9oaW50c19pbml0ICAgICAgKi8KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9BcHBseUhpbnRzRnVuYykgIGFmX2luZGljX2hpbnRzX2FwcGx5ICAgICAgICAgIC8qIHN0eWxlX2hpbnRzX2FwcGx5ICAgICAqLwotICApCi0KLQotI2Vsc2UgLyogIUFGX0NPTkZJR19PUFRJT05fSU5ESUMgKi8KLQotCi0gIEFGX0RFRklORV9XUklUSU5HX1NZU1RFTV9DTEFTUygKLSAgICBhZl9pbmRpY193cml0aW5nX3N5c3RlbV9jbGFzcywKLQotICAgIEFGX1dSSVRJTkdfU1lTVEVNX0lORElDLAotCi0gICAgc2l6ZW9mICggQUZfQ0pLTWV0cmljc1JlYyApLAotCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fSW5pdE1ldHJpY3NGdW5jKSBOVUxMLCAvKiBzdHlsZV9tZXRyaWNzX2luaXQgICAgKi8KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9TY2FsZU1ldHJpY3NGdW5jKU5VTEwsIC8qIHN0eWxlX21ldHJpY3Nfc2NhbGUgICAqLwotICAgIChBRl9Xcml0aW5nU3lzdGVtX0RvbmVNZXRyaWNzRnVuYykgTlVMTCwgLyogc3R5bGVfbWV0cmljc19kb25lICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fR2V0U3RkV2lkdGhzRnVuYylOVUxMLCAvKiBzdHlsZV9tZXRyaWNzX2dldHN0ZHcgKi8KLQotICAgIChBRl9Xcml0aW5nU3lzdGVtX0luaXRIaW50c0Z1bmMpICAgTlVMTCwgLyogc3R5bGVfaGludHNfaW5pdCAgICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fQXBwbHlIaW50c0Z1bmMpICBOVUxMICAvKiBzdHlsZV9oaW50c19hcHBseSAgICAgKi8KLSAgKQotCi0KLSNlbmRpZiAvKiAhQUZfQ09ORklHX09QVElPTl9JTkRJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZpbmRpYy5oIGIvc3JjL2F1dG9maXQvYWZpbmRpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzllMjYzLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmaW5kaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmaW5kaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBJbmRpYyB3cml0aW5nIHN5c3RlbSAgICAgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJhaHVsIEJoYWxlcmFvIDxyYWh1bC5iaGFsZXJhb0ByZWRoYXQuY29tPiwgPGIucmFodWwucG1AZ21haWwuY29tPi4gICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZJTkRJQ19IXwotI2RlZmluZSBBRklORElDX0hfCi0KLSNpbmNsdWRlICJhZmhpbnRzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiB0aGUgYGluZGljJyB3cml0aW5nIHN5c3RlbSAqLwotCi0gIEFGX0RFQ0xBUkVfV1JJVElOR19TWVNURU1fQ0xBU1MoIGFmX2luZGljX3dyaXRpbmdfc3lzdGVtX2NsYXNzICkKLQotCi0vKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBBRklORElDX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmxhdGluLmMgYi9zcmMvYXV0b2ZpdC9hZmxhdGluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmMxYjcuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZsYXRpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmxhdGluLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgbGF0aW4gd3JpdGluZyBzeXN0ZW0gKGJvZHkpLiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQURWQU5DRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAiYWZnbG9iYWwuaCIKLSNpbmNsdWRlICJhZnBpYy5oIgotI2luY2x1ZGUgImFmbGF0aW4uaCIKLSNpbmNsdWRlICJhZmVycm9ycy5oIgotCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLSNpbmNsdWRlICJhZndhcnAuaCIKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYWZsYXRpbgotCi0KLSAgLyogbmVlZGVkIGZvciBjb21wdXRhdGlvbiBvZiByb3VuZCB2cy4gZmxhdCBzZWdtZW50cyAqLwotI2RlZmluZSBGTEFUX1RIUkVTSE9MRCggeCApICAoIHggLyAxNCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICBMIEEgVCBJIE4gICBHIEwgTyBCIEEgTCAgIE0gRSBUIFIgSSBDIFMgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIEZpbmQgc2VnbWVudHMgYW5kIGxpbmtzLCBjb21wdXRlIGFsbCBzdGVtIHdpZHRocywgYW5kIGluaXRpYWxpemUgKi8KLSAgLyogc3RhbmRhcmQgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIGdseXBoIHdpdGggZ2l2ZW4gY2hhcmNvZGUuICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICkKLSAgewotICAgIC8qIHNjYW4gdGhlIGFycmF5IG9mIHNlZ21lbnRzIGluIGVhY2ggZGlyZWN0aW9uICovCi0gICAgQUZfR2x5cGhIaW50c1JlYyAgaGludHNbMV07Ci0KLQotICAgIEZUX1RSQUNFNSgoICJcbiIKLSAgICAgICAgICAgICAgICAibGF0aW4gc3RhbmRhcmQgd2lkdGhzIGNvbXB1dGF0aW9uIChzdHlsZSBgJXMnKVxuIgotICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgotICAgICAgICAgICAgICAgICJcbiIsCi0gICAgICAgICAgICAgICAgYWZfc3R5bGVfbmFtZXNbbWV0cmljcy0+cm9vdC5zdHlsZV9jbGFzcy0+c3R5bGVdICkpOwotCi0gICAgYWZfZ2x5cGhfaGludHNfaW5pdCggaGludHMsIGZhY2UtPm1lbW9yeSApOwotCi0gICAgbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0ud2lkdGhfY291bnQgPSAwOwotICAgIG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdLndpZHRoX2NvdW50ID0gMDsKLQotICAgIHsKLSAgICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7Ci0gICAgICBGVF9VTG9uZyAgICAgICAgICAgIGdseXBoX2luZGV4OwotICAgICAgaW50ICAgICAgICAgICAgICAgICBkaW07Ci0gICAgICBBRl9MYXRpbk1ldHJpY3NSZWMgIGR1bW15WzFdOwotICAgICAgQUZfU2NhbGVyICAgICAgICAgICBzY2FsZXIgPSAmZHVtbXktPnJvb3Quc2NhbGVyOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICAgIEFGX0ZhY2VHbG9iYWxzICBnbG9iYWxzID0gbWV0cmljcy0+cm9vdC5nbG9iYWxzOwotI2VuZGlmCi0KLSAgICAgIEFGX1N0eWxlQ2xhc3MgICBzdHlsZV9jbGFzcyAgPSBtZXRyaWNzLT5yb290LnN0eWxlX2NsYXNzOwotICAgICAgQUZfU2NyaXB0Q2xhc3MgIHNjcmlwdF9jbGFzcyA9IEFGX1NDUklQVF9DTEFTU0VTX0dFVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlX2NsYXNzLT5zY3JpcHRdOwotCi0gICAgICB2b2lkKiAgICAgICAgc2hhcGVyX2J1ZjsKLSAgICAgIGNvbnN0IGNoYXIqICBwOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgIEZUX1VMb25nICBjaCA9IDA7Ci0jZW5kaWYKLQotICAgICAgcCAgICAgICAgICA9IHNjcmlwdF9jbGFzcy0+c3RhbmRhcmRfY2hhcnN0cmluZzsKLSAgICAgIHNoYXBlcl9idWYgPSBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggZmFjZSApOwotCi0gICAgICAvKgotICAgICAgICogV2UgY2hlY2sgYSBsaXN0IG9mIHN0YW5kYXJkIGNoYXJhY3RlcnMgdG8gY2F0Y2ggZmVhdHVyZXMgbGlrZQotICAgICAgICogYGMyc2MnIChzbWFsbCBjYXBzIGZyb20gY2FwcykgdGhhdCBkb24ndCBjb250YWluIGxvd2VyY2FzZSBsZXR0ZXJzCi0gICAgICAgKiBieSBkZWZpbml0aW9uLCBvciBvdGhlciBmZWF0dXJlcyB0aGF0IG1haW5seSBvcGVyYXRlIG9uIG51bWVyYWxzLgotICAgICAgICogVGhlIGZpcnN0IG1hdGNoIHdpbnMuCi0gICAgICAgKi8KLQotICAgICAgZ2x5cGhfaW5kZXggPSAwOwotICAgICAgd2hpbGUgKCAqcCApCi0gICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgbnVtX2lkeDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGNvbnN0IGNoYXIqICBwX29sZDsKLSNlbmRpZgotCi0KLSAgICAgICAgd2hpbGUgKCAqcCA9PSAnICcgKQotICAgICAgICAgIHArKzsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIHBfb2xkID0gcDsKLSAgICAgICAgR0VUX1VURjhfQ0hBUiggY2gsIHBfb2xkICk7Ci0jZW5kaWYKLQotICAgICAgICAvKiByZWplY3QgaW5wdXQgdGhhdCBtYXBzIHRvIG1vcmUgdGhhbiBhIHNpbmdsZSBnbHlwaCAqLwotICAgICAgICBwID0gYWZfc2hhcGVyX2dldF9jbHVzdGVyKCBwLCAmbWV0cmljcy0+cm9vdCwgc2hhcGVyX2J1ZiwgJm51bV9pZHggKTsKLSAgICAgICAgaWYgKCBudW1faWR4ID4gMSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogb3RoZXJ3aXNlIGV4aXQgbG9vcCBpZiB3ZSBoYXZlIGEgcmVzdWx0ICovCi0gICAgICAgIGdseXBoX2luZGV4ID0gYWZfc2hhcGVyX2dldF9lbGVtKCAmbWV0cmljcy0+cm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlcl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgKTsKLSAgICAgICAgaWYgKCBnbHlwaF9pbmRleCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGFmX3NoYXBlcl9idWZfZGVzdHJveSggZmFjZSwgc2hhcGVyX2J1ZiApOwotCi0gICAgICBpZiAoICFnbHlwaF9pbmRleCApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfVFJBQ0U1KCggInN0YW5kYXJkIGNoYXJhY3RlcjogVSslMDRsWCAoZ2x5cGggaW5kZXggJWQpXG4iLAotICAgICAgICAgICAgICAgICAgY2gsIGdseXBoX2luZGV4ICkpOwotCi0gICAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX05PX1NDQUxFICk7Ci0gICAgICBpZiAoIGVycm9yIHx8IGZhY2UtPmdseXBoLT5vdXRsaW5lLm5fcG9pbnRzIDw9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1pFUk8oIGR1bW15ICk7Ci0KLSAgICAgIGR1bW15LT51bml0c19wZXJfZW0gPSBtZXRyaWNzLT51bml0c19wZXJfZW07Ci0KLSAgICAgIHNjYWxlci0+eF9zY2FsZSA9IDB4MTAwMDBMOwotICAgICAgc2NhbGVyLT55X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBzY2FsZXItPnhfZGVsdGEgPSAwOwotICAgICAgc2NhbGVyLT55X2RlbHRhID0gMDsKLQotICAgICAgc2NhbGVyLT5mYWNlICAgICAgICA9IGZhY2U7Ci0gICAgICBzY2FsZXItPnJlbmRlcl9tb2RlID0gRlRfUkVOREVSX01PREVfTk9STUFMOwotICAgICAgc2NhbGVyLT5mbGFncyAgICAgICA9IDA7Ci0KLSAgICAgIGFmX2dseXBoX2hpbnRzX3Jlc2NhbGUoIGhpbnRzLCAoQUZfU3R5bGVNZXRyaWNzKWR1bW15ICk7Ci0KLSAgICAgIGVycm9yID0gYWZfZ2x5cGhfaGludHNfcmVsb2FkKCBoaW50cywgJmZhY2UtPmdseXBoLT5vdXRsaW5lICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmb3IgKCBkaW0gPSAwOyBkaW0gPCBBRl9ESU1FTlNJT05fTUFYOyBkaW0rKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0xhdGluQXhpcyAgYXhpcyAgICA9ICZtZXRyaWNzLT5heGlzW2RpbV07Ci0gICAgICAgIEFGX0F4aXNIaW50cyAgYXhoaW50cyA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgICAgICBBRl9TZWdtZW50ICAgIHNlZywgbGltaXQsIGxpbms7Ci0gICAgICAgIEZUX1VJbnQgICAgICAgbnVtX3dpZHRocyA9IDA7Ci0KLQotICAgICAgICBlcnJvciA9IGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMoIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKgotICAgICAgICAgKiAgV2UgYXNzdW1lIHRoYXQgdGhlIGdseXBocyBzZWxlY3RlZCBmb3IgdGhlIHN0ZW0gd2lkdGgKLSAgICAgICAgICogIGNvbXB1dGF0aW9uIGFyZSBgZmVhdHVyZWxlc3MnIGVub3VnaCBzbyB0aGF0IHRoZSBsaW5raW5nCi0gICAgICAgICAqICBhbGdvcml0aG0gd29ya3MgZmluZSB3aXRob3V0IGFkanVzdG1lbnRzIG9mIGl0cyBzY29yaW5nCi0gICAgICAgICAqICBmdW5jdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIGFmX2xhdGluX2hpbnRzX2xpbmtfc2VnbWVudHMoIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfRGltZW5zaW9uKWRpbSApOwotCi0gICAgICAgIHNlZyAgID0gYXhoaW50cy0+c2VnbWVudHM7Ci0gICAgICAgIGxpbWl0ID0gc2VnICsgYXhoaW50cy0+bnVtX3NlZ21lbnRzOwotCi0gICAgICAgIGZvciAoIDsgc2VnIDwgbGltaXQ7IHNlZysrICkKLSAgICAgICAgewotICAgICAgICAgIGxpbmsgPSBzZWctPmxpbms7Ci0KLSAgICAgICAgICAvKiB3ZSBvbmx5IGNvbnNpZGVyIHN0ZW0gc2VnbWVudHMgdGhlcmUhICovCi0gICAgICAgICAgaWYgKCBsaW5rICYmIGxpbmstPmxpbmsgPT0gc2VnICYmIGxpbmsgPiBzZWcgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICAgICAgICBkaXN0ID0gc2VnLT5wb3MgLSBsaW5rLT5wb3M7Ci0gICAgICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgICAgICBpZiAoIG51bV93aWR0aHMgPCBBRl9MQVRJTl9NQVhfV0lEVEhTICkKLSAgICAgICAgICAgICAgYXhpcy0+d2lkdGhzW251bV93aWR0aHMrK10ub3JnID0gZGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0aGlzIGFsc28gcmVwbGFjZXMgbXVsdGlwbGUgYWxtb3N0IGlkZW50aWNhbCBzdGVtIHdpZHRocyAqLwotICAgICAgICAvKiB3aXRoIGEgc2luZ2xlIG9uZSAodGhlIHZhbHVlIDEwMCBpcyBoZXVyaXN0aWMpICAgICAgICAgICAqLwotICAgICAgICBhZl9zb3J0X2FuZF9xdWFudGl6ZV93aWR0aHMoICZudW1fd2lkdGhzLCBheGlzLT53aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtbXktPnVuaXRzX3Blcl9lbSAvIDEwMCApOwotICAgICAgICBheGlzLT53aWR0aF9jb3VudCA9IG51bV93aWR0aHM7Ci0gICAgICB9Ci0KLSAgICBFeGl0OgotICAgICAgZm9yICggZGltID0gMDsgZGltIDwgQUZfRElNRU5TSU9OX01BWDsgZGltKysgKQotICAgICAgewotICAgICAgICBBRl9MYXRpbkF4aXMgIGF4aXMgPSAmbWV0cmljcy0+YXhpc1tkaW1dOwotICAgICAgICBGVF9Qb3MgICAgICAgIHN0ZHc7Ci0KLQotICAgICAgICBzdGR3ID0gKCBheGlzLT53aWR0aF9jb3VudCA+IDAgKSA/IGF4aXMtPndpZHRoc1swXS5vcmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBRl9MQVRJTl9DT05TVEFOVCggbWV0cmljcywgNTAgKTsKLQotICAgICAgICAvKiBsZXQncyB0cnkgMjAlIG9mIHRoZSBzbWFsbGVzdCB3aWR0aCAqLwotICAgICAgICBheGlzLT5lZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA9IHN0ZHcgLyA1OwotICAgICAgICBheGlzLT5zdGFuZGFyZF93aWR0aCAgICAgICAgICA9IHN0ZHc7Ci0gICAgICAgIGF4aXMtPmV4dHJhX2xpZ2h0ICAgICAgICAgICAgID0gMDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiJXMgd2lkdGhzOlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgPyAiaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAidmVydGljYWwiICkpOwotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgJWQgKHN0YW5kYXJkKSIsIGF4aXMtPnN0YW5kYXJkX3dpZHRoICkpOwotICAgICAgICAgIGZvciAoIGkgPSAxOyBpIDwgYXhpcy0+d2lkdGhfY291bnQ7IGkrKyApCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICVkIiwgYXhpcy0+d2lkdGhzW2ldLm9yZyApKTsKLQotICAgICAgICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgICBhZl9nbHlwaF9oaW50c19kb25lKCBoaW50cyApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBhZl9sYXRpbl9zb3J0X2JsdWUoIEZUX1VJbnQgICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluQmx1ZSogIHRhYmxlICkKLSAgewotICAgIEZUX1VJbnQgICAgICAgaSwgajsKLSAgICBBRl9MYXRpbkJsdWUgIHN3YXA7Ci0KLQotICAgIC8qIHdlIHNvcnQgZnJvbSBib3R0b20gdG8gdG9wICovCi0gICAgZm9yICggaSA9IDE7IGkgPCBjb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBmb3IgKCBqID0gaTsgaiA+IDA7IGotLSApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgYSwgYjsKLQotCi0gICAgICAgIGlmICggdGFibGVbaiAtIDFdLT5mbGFncyAmICggQUZfTEFUSU5fQkxVRV9UT1AgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9MQVRJTl9CTFVFX1NVQl9UT1AgKSApCi0gICAgICAgICAgYSA9IHRhYmxlW2ogLSAxXS0+cmVmLm9yZzsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGEgPSB0YWJsZVtqIC0gMV0tPnNob290Lm9yZzsKLQotICAgICAgICBpZiAoIHRhYmxlW2pdLT5mbGFncyAmICggQUZfTEFUSU5fQkxVRV9UT1AgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0xBVElOX0JMVUVfU1VCX1RPUCApICkKLSAgICAgICAgICBiID0gdGFibGVbal0tPnJlZi5vcmc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBiID0gdGFibGVbal0tPnNob290Lm9yZzsKLQotICAgICAgICBpZiAoIGIgPj0gYSApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgc3dhcCAgICAgICAgID0gdGFibGVbal07Ci0gICAgICAgIHRhYmxlW2pdICAgICA9IHRhYmxlW2ogLSAxXTsKLSAgICAgICAgdGFibGVbaiAtIDFdID0gc3dhcDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIEZpbmQgYWxsIGJsdWUgem9uZXMuICBGbGF0IHNlZ21lbnRzIGdpdmUgdGhlIHJlZmVyZW5jZSBwb2ludHMsICovCi0gIC8qIHJvdW5kIHNlZ21lbnRzIHRoZSBvdmVyc2hvb3QgcG9zaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICkKLSAgewotICAgIEZUX1BvcyAgICAgICAgZmxhdHMgW0FGX0JMVUVfU1RSSU5HX01BWF9MRU5dOwotICAgIEZUX1BvcyAgICAgICAgcm91bmRzW0FGX0JMVUVfU1RSSU5HX01BWF9MRU5dOwotCi0gICAgRlRfVUludCAgICAgICBudW1fZmxhdHM7Ci0gICAgRlRfVUludCAgICAgICBudW1fcm91bmRzOwotCi0gICAgQUZfTGF0aW5CbHVlICBibHVlOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgQUZfTGF0aW5BeGlzICBheGlzID0gJm1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdOwotICAgIEZUX091dGxpbmUgICAgb3V0bGluZTsKLQotICAgIEFGX1N0eWxlQ2xhc3MgIHNjID0gbWV0cmljcy0+cm9vdC5zdHlsZV9jbGFzczsKLQotICAgIEFGX0JsdWVfU3RyaW5nc2V0ICAgICAgICAgYnNzID0gc2MtPmJsdWVfc3RyaW5nc2V0OwotICAgIGNvbnN0IEFGX0JsdWVfU3RyaW5nUmVjKiAgYnMgID0gJmFmX2JsdWVfc3RyaW5nc2V0c1tic3NdOwotCi0gICAgRlRfUG9zICBmbGF0X3RocmVzaG9sZCA9IEZMQVRfVEhSRVNIT0xEKCBtZXRyaWNzLT51bml0c19wZXJfZW0gKTsKLQotICAgIHZvaWQqICBzaGFwZXJfYnVmOwotCi0KLSAgICAvKiB3ZSB3YWxrIG92ZXIgdGhlIGJsdWUgY2hhcmFjdGVyIHN0cmluZ3MgYXMgc3BlY2lmaWVkIGluIHRoZSAqLwotICAgIC8qIHN0eWxlJ3MgZW50cnkgaW4gdGhlIGBhZl9ibHVlX3N0cmluZ3NldCcgYXJyYXkgICAgICAgICAgICAgICovCi0KLSAgICBGVF9UUkFDRTUoKCAibGF0aW4gYmx1ZSB6b25lcyBjb21wdXRhdGlvblxuIgotICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0gICAgICAgICAgICAgICAgIlxuIiApKTsKLQotICAgIHNoYXBlcl9idWYgPSBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggZmFjZSApOwotCi0gICAgZm9yICggOyBicy0+c3RyaW5nICE9IEFGX0JMVUVfU1RSSU5HX01BWDsgYnMrKyApCi0gICAgewotICAgICAgY29uc3QgY2hhciogIHAgPSAmYWZfYmx1ZV9zdHJpbmdzW2JzLT5zdHJpbmddOwotICAgICAgRlRfUG9zKiAgICAgIGJsdWVfcmVmOwotICAgICAgRlRfUG9zKiAgICAgIGJsdWVfc2hvb3Q7Ci0gICAgICBGVF9Qb3MgICAgICAgYXNjZW5kZXI7Ci0gICAgICBGVF9Qb3MgICAgICAgZGVzY2VuZGVyOwotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgewotICAgICAgICBGVF9Cb29sICBoYXZlX2ZsYWcgPSAwOwotCi0KLSAgICAgICAgRlRfVFJBQ0U1KCggImJsdWUgem9uZSAlZCIsIGF4aXMtPmJsdWVfY291bnQgKSk7Ci0KLSAgICAgICAgaWYgKCBicy0+cHJvcGVydGllcyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICgiICkpOwotCi0gICAgICAgICAgaWYgKCBBRl9MQVRJTl9JU19UT1BfQkxVRSggYnMgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U1KCggInRvcCIgKSk7Ci0gICAgICAgICAgICBoYXZlX2ZsYWcgPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggQUZfTEFUSU5fSVNfU1VCX1RPUF9CTFVFKCBicyApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTUoKCAic3ViIHRvcCIgKSk7Ci0gICAgICAgICAgICBoYXZlX2ZsYWcgPSAxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggQUZfTEFUSU5fSVNfTkVVVFJBTF9CTFVFKCBicyApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGhhdmVfZmxhZyApCi0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICIsICIgKSk7Ci0gICAgICAgICAgICBGVF9UUkFDRTUoKCAibmV1dHJhbCIgKSk7Ci0gICAgICAgICAgICBoYXZlX2ZsYWcgPSAxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggQUZfTEFUSU5fSVNfWF9IRUlHSFRfQkxVRSggYnMgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBoYXZlX2ZsYWcgKQotICAgICAgICAgICAgICBGVF9UUkFDRTUoKCAiLCAiICkpOwotICAgICAgICAgICAgRlRfVFJBQ0U1KCggInNtYWxsIHRvcCIgKSk7Ci0gICAgICAgICAgICBoYXZlX2ZsYWcgPSAxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggQUZfTEFUSU5fSVNfTE9OR19CTFVFKCBicyApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGhhdmVfZmxhZyApCi0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICIsICIgKSk7Ci0gICAgICAgICAgICBGVF9UUkFDRTUoKCAibG9uZyIgKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIikiICkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRlRfVFJBQ0U1KCggIjpcbiIgKSk7Ci0gICAgICB9Ci0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotICAgICAgbnVtX2ZsYXRzICA9IDA7Ci0gICAgICBudW1fcm91bmRzID0gMDsKLSAgICAgIGFzY2VuZGVyICAgPSAwOwotICAgICAgZGVzY2VuZGVyICA9IDA7Ci0KLSAgICAgIHdoaWxlICggKnAgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgICBnbHlwaF9pbmRleDsKLSAgICAgICAgRlRfTG9uZyAgICAgeV9vZmZzZXQ7Ci0gICAgICAgIEZUX0ludCAgICAgIGJlc3RfcG9pbnQsIGJlc3RfY29udG91cl9maXJzdCwgYmVzdF9jb250b3VyX2xhc3Q7Ci0gICAgICAgIEZUX1ZlY3RvciogIHBvaW50czsKLQotICAgICAgICBGVF9Qb3MgICBiZXN0X3lfZXh0cmVtdW07ICAgICAgICAgICAgICAgICAgICAgIC8qIHNhbWUgYXMgcG9pbnRzLnkgKi8KLSAgICAgICAgRlRfQm9vbCAgYmVzdF9yb3VuZCA9IDA7Ci0KLSAgICAgICAgdW5zaWduZWQgaW50ICBpLCBudW1faWR4OwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgY29uc3QgY2hhciogIHBfb2xkOwotICAgICAgICBGVF9VTG9uZyAgICAgY2g7Ci0jZW5kaWYKLQotCi0gICAgICAgIHdoaWxlICggKnAgPT0gJyAnICkKLSAgICAgICAgICBwKys7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBwX29sZCA9IHA7Ci0gICAgICAgIEdFVF9VVEY4X0NIQVIoIGNoLCBwX29sZCApOwotI2VuZGlmCi0KLSAgICAgICAgcCA9IGFmX3NoYXBlcl9nZXRfY2x1c3RlciggcCwgJm1ldHJpY3MtPnJvb3QsIHNoYXBlcl9idWYsICZudW1faWR4ICk7Ci0KLSAgICAgICAgaWYgKCAhbnVtX2lkeCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBVKyUwNGxYIHVuYXZhaWxhYmxlXG4iLCBjaCApKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggQUZfTEFUSU5fSVNfVE9QX0JMVUUoIGJzICkgKQotICAgICAgICAgIGJlc3RfeV9leHRyZW11bSA9IEZUX0lOVF9NSU47Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBiZXN0X3lfZXh0cmVtdW0gPSBGVF9JTlRfTUFYOwotCi0gICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBhbGwgZ2x5cGggZWxlbWVudHMgb2YgdGhlIGNoYXJhY3RlciBjbHVzdGVyICovCi0gICAgICAgIC8qIGFuZCBnZXQgdGhlIGRhdGEgb2YgdGhlIGBiaWdnZXN0JyBvbmUgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2lkeDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgIGJlc3RfeTsKLSAgICAgICAgICBGVF9Cb29sICByb3VuZCA9IDA7Ci0KLQotICAgICAgICAgIC8qIGxvYWQgdGhlIGNoYXJhY3RlciBpbiB0aGUgZmFjZSAtLSBza2lwIHVua25vd24gb3IgZW1wdHkgb25lcyAqLwotICAgICAgICAgIGdseXBoX2luZGV4ID0gYWZfc2hhcGVyX2dldF9lbGVtKCAmbWV0cmljcy0+cm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVyX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnlfb2Zmc2V0ICk7Ci0gICAgICAgICAgaWYgKCBnbHlwaF9pbmRleCA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBVKyUwNGxYIHVuYXZhaWxhYmxlXG4iLCBjaCApKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGVycm9yICAgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgRlRfTE9BRF9OT19TQ0FMRSApOwotICAgICAgICAgIG91dGxpbmUgPSBmYWNlLT5nbHlwaC0+b3V0bGluZTsKLSAgICAgICAgICAvKiByZWplY3QgZ2x5cGhzIHRoYXQgZG9uJ3QgcHJvZHVjZSBhbnkgcmVuZGVyaW5nICovCi0gICAgICAgICAgaWYgKCBlcnJvciB8fCBvdXRsaW5lLm5fcG9pbnRzIDw9IDIgKQotICAgICAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgICAgaWYgKCBudW1faWR4ID09IDEgKQotICAgICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBVKyUwNGxYIGNvbnRhaW5zIG5vICh1c2FibGUpIG91dGxpbmVzXG4iLCBjaCApKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY29tcG9uZW50ICVkIG9mIGNsdXN0ZXIgc3RhcnRpbmcgd2l0aCBVKyUwNGxYIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbnRhaW5zIG5vICh1c2FibGUpIG91dGxpbmVzXG4iLCBpLCBjaCApKTsKLSNlbmRpZgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogbm93IGNvbXB1dGUgbWluIG9yIG1heCBwb2ludCBpbmRpY2VzIGFuZCBjb29yZGluYXRlcyAqLwotICAgICAgICAgIHBvaW50cyAgICAgICAgICAgICA9IG91dGxpbmUucG9pbnRzOwotICAgICAgICAgIGJlc3RfcG9pbnQgICAgICAgICA9IC0xOwotICAgICAgICAgIGJlc3RfeSAgICAgICAgICAgICA9IDA7ICAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgICAgICAgYmVzdF9jb250b3VyX2ZpcnN0ID0gMDsgIC8qIGRpdHRvICovCi0gICAgICAgICAgYmVzdF9jb250b3VyX2xhc3QgID0gMDsgIC8qIGRpdHRvICovCi0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG5uOwotICAgICAgICAgICAgRlRfSW50ICBmaXJzdCA9IDA7Ci0gICAgICAgICAgICBGVF9JbnQgIGxhc3QgID0gLTE7Ci0KLQotICAgICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG91dGxpbmUubl9jb250b3VyczsgZmlyc3QgPSBsYXN0ICsgMSwgbm4rKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0ludCAgb2xkX2Jlc3RfcG9pbnQgPSBiZXN0X3BvaW50OwotICAgICAgICAgICAgICBGVF9JbnQgIHBwOwotCi0KLSAgICAgICAgICAgICAgbGFzdCA9IG91dGxpbmUuY29udG91cnNbbm5dOwotCi0gICAgICAgICAgICAgIC8qIEF2b2lkIHNpbmdsZS1wb2ludCBjb250b3VycyBzaW5jZSB0aGV5IGFyZSBuZXZlciAgICAgICovCi0gICAgICAgICAgICAgIC8qIHJhc3Rlcml6ZWQuICBJbiBzb21lIGZvbnRzLCB0aGV5IGNvcnJlc3BvbmQgdG8gbWFyayAgICovCi0gICAgICAgICAgICAgIC8qIGF0dGFjaG1lbnQgcG9pbnRzIHRoYXQgYXJlIHdheSBvdXRzaWRlIG9mIHRoZSBnbHlwaCdzICovCi0gICAgICAgICAgICAgIC8qIHJlYWwgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIGlmICggbGFzdCA8PSBmaXJzdCApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgaWYgKCBBRl9MQVRJTl9JU19UT1BfQkxVRSggYnMgKSAgICAgfHwKLSAgICAgICAgICAgICAgICAgICBBRl9MQVRJTl9JU19TVUJfVE9QX0JMVUUoIGJzICkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggcHAgPSBmaXJzdDsgcHAgPD0gbGFzdDsgcHArKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCBiZXN0X3BvaW50IDwgMCB8fCBwb2ludHNbcHBdLnkgPiBiZXN0X3kgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiZXN0X3BvaW50ID0gcHA7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RfeSAgICAgPSBwb2ludHNbcHBdLnk7Ci0gICAgICAgICAgICAgICAgICAgIGFzY2VuZGVyICAgPSBGVF9NQVgoIGFzY2VuZGVyLCBiZXN0X3kgKyB5X29mZnNldCApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkZXNjZW5kZXIgPSBGVF9NSU4oIGRlc2NlbmRlciwgcG9pbnRzW3BwXS55ICsgeV9vZmZzZXQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggcHAgPSBmaXJzdDsgcHAgPD0gbGFzdDsgcHArKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCBiZXN0X3BvaW50IDwgMCB8fCBwb2ludHNbcHBdLnkgPCBiZXN0X3kgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiZXN0X3BvaW50ID0gcHA7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RfeSAgICAgPSBwb2ludHNbcHBdLnk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NlbmRlciAgPSBGVF9NSU4oIGRlc2NlbmRlciwgYmVzdF95ICsgeV9vZmZzZXQgKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYXNjZW5kZXIgPSBGVF9NQVgoIGFzY2VuZGVyLCBwb2ludHNbcHBdLnkgKyB5X29mZnNldCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlmICggYmVzdF9wb2ludCAhPSBvbGRfYmVzdF9wb2ludCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZXN0X2NvbnRvdXJfZmlyc3QgPSBmaXJzdDsKLSAgICAgICAgICAgICAgICBiZXN0X2NvbnRvdXJfbGFzdCAgPSBsYXN0OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogbm93IGNoZWNrIHdoZXRoZXIgdGhlIHBvaW50IGJlbG9uZ3MgdG8gYSBzdHJhaWdodCBvciByb3VuZCAgICovCi0gICAgICAgICAgLyogc2VnbWVudDsgd2UgZmlyc3QgbmVlZCB0byBmaW5kIGluIHdoaWNoIGNvbnRvdXIgdGhlIGV4dHJlbXVtICovCi0gICAgICAgICAgLyogbGllcywgdGhlbiBpbnNwZWN0IGl0cyBwcmV2aW91cyBhbmQgbmV4dCBwb2ludHMgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBiZXN0X3BvaW50ID49IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgYmVzdF94ID0gcG9pbnRzW2Jlc3RfcG9pbnRdLng7Ci0gICAgICAgICAgICBGVF9JbnQgIHByZXYsIG5leHQ7Ci0gICAgICAgICAgICBGVF9JbnQgIGJlc3Rfc2VnbWVudF9maXJzdCwgYmVzdF9zZWdtZW50X2xhc3Q7Ci0gICAgICAgICAgICBGVF9JbnQgIGJlc3Rfb25fcG9pbnRfZmlyc3QsIGJlc3Rfb25fcG9pbnRfbGFzdDsKLSAgICAgICAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICAgICAgICBiZXN0X3NlZ21lbnRfZmlyc3QgPSBiZXN0X3BvaW50OwotICAgICAgICAgICAgYmVzdF9zZWdtZW50X2xhc3QgID0gYmVzdF9wb2ludDsKLQotICAgICAgICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUudGFnc1tiZXN0X3BvaW50XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJlc3Rfb25fcG9pbnRfZmlyc3QgPSBiZXN0X3BvaW50OwotICAgICAgICAgICAgICBiZXN0X29uX3BvaW50X2xhc3QgID0gYmVzdF9wb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmVzdF9vbl9wb2ludF9maXJzdCA9IC0xOwotICAgICAgICAgICAgICBiZXN0X29uX3BvaW50X2xhc3QgID0gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGxvb2sgZm9yIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBwb2ludHMgb24gdGhlIGNvbnRvdXIgICovCi0gICAgICAgICAgICAvKiB0aGF0IGFyZSBub3Qgb24gdGhlIHNhbWUgWSBjb29yZGluYXRlLCB0aGVuIHRocmVzaG9sZCAqLwotICAgICAgICAgICAgLyogdGhlIGBjbG9zZW5lc3MnLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByZXYgPSBiZXN0X3BvaW50OwotICAgICAgICAgICAgbmV4dCA9IHByZXY7Ci0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggcHJldiA+IGJlc3RfY29udG91cl9maXJzdCApCi0gICAgICAgICAgICAgICAgcHJldi0tOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJldiA9IGJlc3RfY29udG91cl9sYXN0OwotCi0gICAgICAgICAgICAgIGRpc3QgPSBGVF9BQlMoIHBvaW50c1twcmV2XS55IC0gYmVzdF95ICk7Ci0gICAgICAgICAgICAgIC8qIGFjY2VwdCBhIHNtYWxsIGRpc3RhbmNlIG9yIGEgc21hbGwgYW5nbGUgKGJvdGggdmFsdWVzIGFyZSAqLwotICAgICAgICAgICAgICAvKiBoZXVyaXN0aWM7IHZhbHVlIDIwIGNvcnJlc3BvbmRzIHRvIGFwcHJveC4gMi45IGRlZ3JlZXMpICAgKi8KLSAgICAgICAgICAgICAgaWYgKCBkaXN0ID4gNSApCi0gICAgICAgICAgICAgICAgaWYgKCBGVF9BQlMoIHBvaW50c1twcmV2XS54IC0gYmVzdF94ICkgPD0gMjAgKiBkaXN0ICkKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGJlc3Rfc2VnbWVudF9maXJzdCA9IHByZXY7Ci0KLSAgICAgICAgICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUudGFnc1twcmV2XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZXN0X29uX3BvaW50X2ZpcnN0ID0gcHJldjsKLSAgICAgICAgICAgICAgICBpZiAoIGJlc3Rfb25fcG9pbnRfbGFzdCA8IDAgKQotICAgICAgICAgICAgICAgICAgYmVzdF9vbl9wb2ludF9sYXN0ID0gcHJldjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IHdoaWxlICggcHJldiAhPSBiZXN0X3BvaW50ICk7Ci0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggbmV4dCA8IGJlc3RfY29udG91cl9sYXN0ICkKLSAgICAgICAgICAgICAgICBuZXh0Kys7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuZXh0ID0gYmVzdF9jb250b3VyX2ZpcnN0OwotCi0gICAgICAgICAgICAgIGRpc3QgPSBGVF9BQlMoIHBvaW50c1tuZXh0XS55IC0gYmVzdF95ICk7Ci0gICAgICAgICAgICAgIGlmICggZGlzdCA+IDUgKQotICAgICAgICAgICAgICAgIGlmICggRlRfQUJTKCBwb2ludHNbbmV4dF0ueCAtIGJlc3RfeCApIDw9IDIwICogZGlzdCApCi0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBiZXN0X3NlZ21lbnRfbGFzdCA9IG5leHQ7Ci0KLSAgICAgICAgICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUudGFnc1tuZXh0XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZXN0X29uX3BvaW50X2xhc3QgPSBuZXh0OwotICAgICAgICAgICAgICAgIGlmICggYmVzdF9vbl9wb2ludF9maXJzdCA8IDAgKQotICAgICAgICAgICAgICAgICAgYmVzdF9vbl9wb2ludF9maXJzdCA9IG5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSB3aGlsZSAoIG5leHQgIT0gYmVzdF9wb2ludCApOwotCi0gICAgICAgICAgICBpZiAoIEFGX0xBVElOX0lTX0xPTkdfQkxVRSggYnMgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIElmIHRoaXMgZmxhZyBpcyBzZXQsIHdlIGhhdmUgYW4gYWRkaXRpb25hbCBjb25zdHJhaW50IHRvICAqLwotICAgICAgICAgICAgICAvKiBnZXQgdGhlIGJsdWUgem9uZSBkaXN0YW5jZTogRmluZCBhIHNlZ21lbnQgb2YgdGhlIHRvcG1vc3QgKi8KLSAgICAgICAgICAgICAgLyogKG9yIGJvdHRvbW1vc3QpIGNvbnRvdXIgdGhhdCBpcyBsb25nZXIgdGhhbiBhIGhldXJpc3RpYyAgICovCi0gICAgICAgICAgICAgIC8qIHRocmVzaG9sZC4gIFRoaXMgZW5zdXJlcyB0aGF0IHNtYWxsIGJ1bXBzIGluIHRoZSBvdXRsaW5lICAqLwotICAgICAgICAgICAgICAvKiBhcmUgaWdub3JlZCAoZm9yIGV4YW1wbGUsIHRoZSBgdmVydGljYWwgc2VyaWZzJyBmb3VuZCBpbiAgKi8KLSAgICAgICAgICAgICAgLyogbWFueSBIZWJyZXcgZ2x5cGggZGVzaWducykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgLyogSWYgdGhpcyBzZWdtZW50IGlzIGxvbmcgZW5vdWdoLCB3ZSBhcmUgZG9uZS4gIE90aGVyd2lzZSwgICovCi0gICAgICAgICAgICAgIC8qIHNlYXJjaCB0aGUgc2VnbWVudCBuZXh0IHRvIHRoZSBleHRyZW11bSB0aGF0IGlzIGxvbmcgICAgICAqLwotICAgICAgICAgICAgICAvKiBlbm91Z2gsIGhhcyB0aGUgc2FtZSBkaXJlY3Rpb24sIGFuZCBhIG5vdCB0b28gbGFyZ2UgICAgICAgKi8KLSAgICAgICAgICAgICAgLyogdmVydGljYWwgZGlzdGFuY2UgZnJvbSB0aGUgZXh0cmVtdW0uICBOb3RlIHRoYXQgdGhlICAgICAgICovCi0gICAgICAgICAgICAgIC8qIGFsZ29yaXRobSBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgdGhlIGZvdW5kIHNlZ21lbnQgaXMgICAgICAqLwotICAgICAgICAgICAgICAvKiBhY3R1YWxseSB0aGUgb25lICh2ZXJ0aWNhbGx5KSBuZWFyZXN0IHRvIHRoZSBleHRyZW11bS4gICAgKi8KLQotICAgICAgICAgICAgICAvKiBoZXVyaXN0aWMgdGhyZXNob2xkIHZhbHVlICovCi0gICAgICAgICAgICAgIEZUX1BvcyAgbGVuZ3RoX3RocmVzaG9sZCA9IG1ldHJpY3MtPnVuaXRzX3Blcl9lbSAvIDI1OwotCi0KLSAgICAgICAgICAgICAgZGlzdCA9IEZUX0FCUyggcG9pbnRzW2Jlc3Rfc2VnbWVudF9sYXN0XS54IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbYmVzdF9zZWdtZW50X2ZpcnN0XS54ICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBkaXN0IDwgbGVuZ3RoX3RocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICBiZXN0X3NlZ21lbnRfbGFzdCAtIGJlc3Rfc2VnbWVudF9maXJzdCArIDIgPD0KLSAgICAgICAgICAgICAgICAgICAgIGJlc3RfY29udG91cl9sYXN0IC0gYmVzdF9jb250b3VyX2ZpcnN0ICAgICAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaGV1cmlzdGljIHRocmVzaG9sZCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIEZUX1BvcyAgaGVpZ2h0X3RocmVzaG9sZCA9IG1ldHJpY3MtPnVuaXRzX3Blcl9lbSAvIDQ7Ci0KLSAgICAgICAgICAgICAgICBGVF9JbnQgICBmaXJzdDsKLSAgICAgICAgICAgICAgICBGVF9JbnQgICBsYXN0OwotICAgICAgICAgICAgICAgIEZUX0Jvb2wgIGhpdDsKLQotICAgICAgICAgICAgICAgIC8qIHdlIGludGVudGlvbmFsbHkgZGVjbGFyZSB0aGVzZSB0d28gdmFyaWFibGVzICAgICAgICAqLwotICAgICAgICAgICAgICAgIC8qIG91dHNpZGUgb2YgdGhlIGxvb3Agc2luY2UgdmFyaW91cyBjb21waWxlcnMgZW1pdCAgICAqLwotICAgICAgICAgICAgICAgIC8qIGluY29ycmVjdCB3YXJuaW5nIG1lc3NhZ2VzIG90aGVyd2lzZSwgdGFsa2luZyBhYm91dCAqLwotICAgICAgICAgICAgICAgIC8qIGBwb3NzaWJseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcycgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEZUX0ludCAgcF9maXJzdCA9IDA7ICAgICAgICAgICAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgICAgICAgICAgICAgIEZUX0ludCAgcF9sYXN0ICA9IDA7Ci0KLSAgICAgICAgICAgICAgICBGVF9Cb29sICBsZWZ0MnJpZ2h0OwotCi0KLSAgICAgICAgICAgICAgICAvKiBjb21wdXRlIGRpcmVjdGlvbiAqLwotICAgICAgICAgICAgICAgIHByZXYgPSBiZXN0X3BvaW50OwotCi0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoIHByZXYgPiBiZXN0X2NvbnRvdXJfZmlyc3QgKQotICAgICAgICAgICAgICAgICAgICBwcmV2LS07Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHByZXYgPSBiZXN0X2NvbnRvdXJfbGFzdDsKLQotICAgICAgICAgICAgICAgICAgaWYgKCBwb2ludHNbcHJldl0ueCAhPSBiZXN0X3ggKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCBwcmV2ICE9IGJlc3RfcG9pbnQgKTsKLQotICAgICAgICAgICAgICAgIC8qIHNraXAgZ2x5cGggZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2UgKi8KLSAgICAgICAgICAgICAgICBpZiAoIHByZXYgPT0gYmVzdF9wb2ludCApCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGxlZnQycmlnaHQgPSBGVF9CT09MKCBwb2ludHNbcHJldl0ueCA8IHBvaW50c1tiZXN0X3BvaW50XS54ICk7Ci0KLSAgICAgICAgICAgICAgICBmaXJzdCA9IGJlc3Rfc2VnbWVudF9sYXN0OwotICAgICAgICAgICAgICAgIGxhc3QgID0gZmlyc3Q7Ci0gICAgICAgICAgICAgICAgaGl0ICAgPSAwOwotCi0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBGVF9Cb29sICBsMnI7Ci0gICAgICAgICAgICAgICAgICBGVF9Qb3MgICBkOwotCi0KLSAgICAgICAgICAgICAgICAgIGlmICggIWhpdCApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG5vIGhpdDsgYWRqdXN0IGZpcnN0IHBvaW50ICovCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gbGFzdDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBhbHNvIGFkanVzdCBmaXJzdCBhbmQgbGFzdCBvbiBwb2ludCAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIEZUX0NVUlZFX1RBRyggb3V0bGluZS50YWdzW2ZpcnN0XSApID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DVVJWRV9UQUdfT04gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcF9maXJzdCA9IGZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgIHBfbGFzdCAgPSBmaXJzdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBwX2ZpcnN0ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgcF9sYXN0ICA9IC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaGl0ID0gMTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgaWYgKCBsYXN0IDwgYmVzdF9jb250b3VyX2xhc3QgKQotICAgICAgICAgICAgICAgICAgICBsYXN0Kys7Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGxhc3QgPSBiZXN0X2NvbnRvdXJfZmlyc3Q7Ci0KLSAgICAgICAgICAgICAgICAgIGlmICggRlRfQUJTKCBiZXN0X3kgLSBwb2ludHNbZmlyc3RdLnkgKSA+IGhlaWdodF90aHJlc2hvbGQgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0aWNhbCBkaXN0YW5jZSB0b28gbGFyZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgaGl0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIC8qIHNhbWUgdGVzdCBhcyBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgZGlzdCA9IEZUX0FCUyggcG9pbnRzW2xhc3RdLnkgLSBwb2ludHNbZmlyc3RdLnkgKTsKLSAgICAgICAgICAgICAgICAgIGlmICggZGlzdCA+IDUgKQotICAgICAgICAgICAgICAgICAgICBpZiAoIEZUX0FCUyggcG9pbnRzW2xhc3RdLnggLSBwb2ludHNbZmlyc3RdLnggKSA8PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgKiBkaXN0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGhpdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUudGFnc1tsYXN0XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBfbGFzdCA9IGxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggcF9maXJzdCA8IDAgKQotICAgICAgICAgICAgICAgICAgICAgIHBfZmlyc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBsMnIgPSBGVF9CT09MKCBwb2ludHNbZmlyc3RdLnggPCBwb2ludHNbbGFzdF0ueCApOwotICAgICAgICAgICAgICAgICAgZCAgID0gRlRfQUJTKCBwb2ludHNbbGFzdF0ueCAtIHBvaW50c1tmaXJzdF0ueCApOwotCi0gICAgICAgICAgICAgICAgICBpZiAoIGwyciA9PSBsZWZ0MnJpZ2h0ICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICBkID49IGxlbmd0aF90aHJlc2hvbGQgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBhbGwgY29uc3RyYWludHMgYXJlIG1ldDsgdXBkYXRlIHNlZ21lbnQgYWZ0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogZmluZGluZyBpdHMgZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxhc3QgPCBiZXN0X2NvbnRvdXJfbGFzdCApCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGJlc3RfY29udG91cl9maXJzdDsKLQotICAgICAgICAgICAgICAgICAgICAgIGQgPSBGVF9BQlMoIHBvaW50c1tsYXN0XS55IC0gcG9pbnRzW2ZpcnN0XS55ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKCBkID4gNSApCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIEZUX0FCUyggcG9pbnRzW25leHRdLnggLSBwb2ludHNbZmlyc3RdLnggKSA8PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwICogZGlzdCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbGFzdCA+IGJlc3RfY29udG91cl9maXJzdCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGJlc3RfY29udG91cl9sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgIHBfbGFzdCA9IGxhc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIEZUX0NVUlZFX1RBRyggb3V0bGluZS50YWdzW2xhc3RdICkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2xhc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX2ZpcnN0IDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmlyc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggbGFzdCAhPSBiZXN0X3NlZ21lbnRfZmlyc3QgKTsKLQotICAgICAgICAgICAgICAgICAgICBiZXN0X3kgPSBwb2ludHNbZmlyc3RdLnk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYmVzdF9zZWdtZW50X2ZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3Rfc2VnbWVudF9sYXN0ICA9IGxhc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgYmVzdF9vbl9wb2ludF9maXJzdCA9IHBfZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3Rfb25fcG9pbnRfbGFzdCAgPSBwX2xhc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IHdoaWxlICggbGFzdCAhPSBiZXN0X3NlZ21lbnRfZmlyc3QgKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBmb3IgY29tcHV0aW5nIGJsdWUgem9uZXMsIHdlIGFkZCB0aGUgeSBvZmZzZXQgYXMgcmV0dXJuZWQgKi8KLSAgICAgICAgICAgIC8qIGJ5IHRoZSBjdXJyZW50bHkgdXNlZCBPcGVuVHlwZSBmZWF0dXJlIC0tIGZvciBleGFtcGxlLCAgICAqLwotICAgICAgICAgICAgLyogc3VwZXJzY3JpcHQgZ2x5cGhzIG1pZ2h0IGJlIGlkZW50aWNhbCB0byBzdWJzY3JpcHQgZ2x5cGhzICovCi0gICAgICAgICAgICAvKiB3aXRoIGEgdmVydGljYWwgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJlc3RfeSArPSB5X29mZnNldDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgICBpZiAoIG51bV9pZHggPT0gMSApCi0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIFUrJTA0bFg6IGJlc3RfeSA9ICU1bGQiLCBjaCwgYmVzdF95ICkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBjb21wb25lbnQgJWQgb2YgY2x1c3RlciBzdGFydGluZyB3aXRoIFUrJTA0bFg6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJlc3RfeSA9ICU1bGQiLCBpLCBjaCwgYmVzdF95ICkpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIC8qIG5vdyBzZXQgdGhlIGByb3VuZCcgZmxhZyBkZXBlbmRpbmcgb24gdGhlIHNlZ21lbnQncyBraW5kOiAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiAtIGlmIHRoZSBob3Jpem9udGFsIGRpc3RhbmNlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0ICAgKi8KLSAgICAgICAgICAgIC8qICAgYG9uJyBwb2ludCBpcyBsYXJnZXIgdGhhbiBhIGhldXJpc3RpYyB0aHJlc2hvbGQgICAgICAgICAqLwotICAgICAgICAgICAgLyogICB3ZSBoYXZlIGEgZmxhdCBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiAtIGlmIGVpdGhlciB0aGUgZmlyc3Qgb3IgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIHNlZ21lbnQgaXMgKi8KLSAgICAgICAgICAgIC8qICAgYW4gYG9mZicgcG9pbnQsIHRoZSBzZWdtZW50IGlzIHJvdW5kLCBvdGhlcndpc2UgaXQgaXMgICAqLwotICAgICAgICAgICAgLyogICBmbGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIGJlc3Rfb25fcG9pbnRfZmlyc3QgPj0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICBiZXN0X29uX3BvaW50X2xhc3QgPj0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgKCBGVF9BQlMoIHBvaW50c1tiZXN0X29uX3BvaW50X2xhc3RdLnggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzW2Jlc3Rfb25fcG9pbnRfZmlyc3RdLnggKSApID4KLSAgICAgICAgICAgICAgICAgICBmbGF0X3RocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgcm91bmQgPSAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICByb3VuZCA9IEZUX0JPT0woCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9DVVJWRV9UQUcoIG91dGxpbmUudGFnc1tiZXN0X3NlZ21lbnRfZmlyc3RdICkgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCBvdXRsaW5lLnRhZ3NbYmVzdF9zZWdtZW50X2xhc3RdICApICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NVUlZFX1RBR19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgaWYgKCByb3VuZCAmJiBBRl9MQVRJTl9JU19ORVVUUkFMX0JMVUUoIGJzICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBvbmx5IHVzZSBmbGF0IHNlZ21lbnRzIGZvciBhIG5ldXRyYWwgYmx1ZSB6b25lICovCi0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgKHJvdW5kLCBza2lwcGVkKVxuIiApKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgKCVzKVxuIiwgcm91bmQgPyAicm91bmQiIDogImZsYXQiICkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggQUZfTEFUSU5fSVNfVE9QX0JMVUUoIGJzICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggYmVzdF95ID4gYmVzdF95X2V4dHJlbXVtICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmVzdF95X2V4dHJlbXVtID0gYmVzdF95OwotICAgICAgICAgICAgICBiZXN0X3JvdW5kICAgICAgPSByb3VuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggYmVzdF95IDwgYmVzdF95X2V4dHJlbXVtICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmVzdF95X2V4dHJlbXVtID0gYmVzdF95OwotICAgICAgICAgICAgICBiZXN0X3JvdW5kICAgICAgPSByb3VuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSAvKiBlbmQgZm9yIGxvb3AgKi8KLQotICAgICAgICBpZiAoICEoIGJlc3RfeV9leHRyZW11bSA9PSBGVF9JTlRfTUlOIHx8Ci0gICAgICAgICAgICAgICAgYmVzdF95X2V4dHJlbXVtID09IEZUX0lOVF9NQVggKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGJlc3Rfcm91bmQgKQotICAgICAgICAgICAgcm91bmRzW251bV9yb3VuZHMrK10gPSBiZXN0X3lfZXh0cmVtdW07Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZmxhdHNbbnVtX2ZsYXRzKytdICAgPSBiZXN0X3lfZXh0cmVtdW07Ci0gICAgICAgIH0KLQotICAgICAgfSAvKiBlbmQgd2hpbGUgbG9vcCAqLwotCi0gICAgICBpZiAoIG51bV9mbGF0cyA9PSAwICYmIG51bV9yb3VuZHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICB3ZSBjb3VsZG4ndCBmaW5kIGEgc2luZ2xlIGdseXBoIHRvIGNvbXB1dGUgdGhpcyBibHVlIHpvbmUsCi0gICAgICAgICAqICB3ZSB3aWxsIHNpbXBseSBpZ25vcmUgaXQgdGhlbgotICAgICAgICAgKi8KLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgZW1wdHlcbiIgKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiB3ZSBoYXZlIGNvbXB1dGVkIHRoZSBjb250ZW50cyBvZiB0aGUgYHJvdW5kcycgYW5kIGBmbGF0cycgdGFibGVzLCAqLwotICAgICAgLyogbm93IGRldGVybWluZSB0aGUgcmVmZXJlbmNlIGFuZCBvdmVyc2hvb3QgcG9zaXRpb24gb2YgdGhlIGJsdWUgLS0gKi8KLSAgICAgIC8qIHdlIHNpbXBseSB0YWtlIHRoZSBtZWRpYW4gdmFsdWUgYWZ0ZXIgYSBzaW1wbGUgc29ydCAgICAgICAgICAgICAgICovCi0gICAgICBhZl9zb3J0X3BvcyggbnVtX3JvdW5kcywgcm91bmRzICk7Ci0gICAgICBhZl9zb3J0X3BvcyggbnVtX2ZsYXRzLCAgZmxhdHMgKTsKLQotICAgICAgYmx1ZSAgICAgICA9ICZheGlzLT5ibHVlc1theGlzLT5ibHVlX2NvdW50XTsKLSAgICAgIGJsdWVfcmVmICAgPSAmYmx1ZS0+cmVmLm9yZzsKLSAgICAgIGJsdWVfc2hvb3QgPSAmYmx1ZS0+c2hvb3Qub3JnOwotCi0gICAgICBheGlzLT5ibHVlX2NvdW50Kys7Ci0KLSAgICAgIGlmICggbnVtX2ZsYXRzID09IDAgKQotICAgICAgewotICAgICAgICAqYmx1ZV9yZWYgICA9Ci0gICAgICAgICpibHVlX3Nob290ID0gcm91bmRzW251bV9yb3VuZHMgLyAyXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBudW1fcm91bmRzID09IDAgKQotICAgICAgewotICAgICAgICAqYmx1ZV9yZWYgICA9Ci0gICAgICAgICpibHVlX3Nob290ID0gZmxhdHNbbnVtX2ZsYXRzIC8gMl07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICpibHVlX3JlZiAgID0gZmxhdHMgW251bV9mbGF0cyAgLyAyXTsKLSAgICAgICAgKmJsdWVfc2hvb3QgPSByb3VuZHNbbnVtX3JvdW5kcyAvIDJdOwotICAgICAgfQotCi0gICAgICAvKiB0aGVyZSBhcmUgc29tZXRpbWVzIHByb2JsZW1zOiBpZiB0aGUgb3ZlcnNob290IHBvc2l0aW9uIG9mIHRvcCAgICAgKi8KLSAgICAgIC8qIHpvbmVzIGlzIHVuZGVyIGl0cyByZWZlcmVuY2UgcG9zaXRpb24sIG9yIHRoZSBvcHBvc2l0ZSBmb3IgYm90dG9tICAqLwotICAgICAgLyogem9uZXMuICBXZSBtdXN0IHRodXMgY2hlY2sgZXZlcnl0aGluZyB0aGVyZSBhbmQgY29ycmVjdCB0aGUgZXJyb3JzICovCi0gICAgICBpZiAoICpibHVlX3Nob290ICE9ICpibHVlX3JlZiApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgIHJlZiAgICAgID0gKmJsdWVfcmVmOwotICAgICAgICBGVF9Qb3MgICBzaG9vdCAgICA9ICpibHVlX3Nob290OwotICAgICAgICBGVF9Cb29sICBvdmVyX3JlZiA9IEZUX0JPT0woIHNob290ID4gcmVmICk7Ci0KLQotICAgICAgICBpZiAoICggQUZfTEFUSU5fSVNfVE9QX0JMVUUoIGJzICkgICAgfHwKLSAgICAgICAgICAgICAgIEFGX0xBVElOX0lTX1NVQl9UT1BfQkxVRSggYnMpICkgXiBvdmVyX3JlZiApCi0gICAgICAgIHsKLSAgICAgICAgICAqYmx1ZV9yZWYgICA9Ci0gICAgICAgICAgKmJsdWVfc2hvb3QgPSAoIHNob290ICsgcmVmICkgLyAyOwotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgW292ZXJzaG9vdCBzbWFsbGVyIHRoYW4gcmVmZXJlbmNlLCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHRha2luZyBtZWFuIHZhbHVlXVxuIiApKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBibHVlLT5hc2NlbmRlciAgPSBhc2NlbmRlcjsKLSAgICAgIGJsdWUtPmRlc2NlbmRlciA9IGRlc2NlbmRlcjsKLQotICAgICAgYmx1ZS0+ZmxhZ3MgPSAwOwotICAgICAgaWYgKCBBRl9MQVRJTl9JU19UT1BfQkxVRSggYnMgKSApCi0gICAgICAgIGJsdWUtPmZsYWdzIHw9IEFGX0xBVElOX0JMVUVfVE9QOwotICAgICAgaWYgKCBBRl9MQVRJTl9JU19TVUJfVE9QX0JMVUUoIGJzICkgKQotICAgICAgICBibHVlLT5mbGFncyB8PSBBRl9MQVRJTl9CTFVFX1NVQl9UT1A7Ci0gICAgICBpZiAoIEFGX0xBVElOX0lTX05FVVRSQUxfQkxVRSggYnMgKSApCi0gICAgICAgIGJsdWUtPmZsYWdzIHw9IEFGX0xBVElOX0JMVUVfTkVVVFJBTDsKLQotICAgICAgLyoKLSAgICAgICAqIFRoZSBmb2xsb3dpbmcgZmxhZyBpcyB1c2VkIGxhdGVyIHRvIGFkanVzdCB0aGUgeSBhbmQgeCBzY2FsZXMKLSAgICAgICAqIGluIG9yZGVyIHRvIG9wdGltaXplIHRoZSBwaXhlbCBncmlkIGFsaWdubWVudCBvZiB0aGUgdG9wIG9mIHNtYWxsCi0gICAgICAgKiBsZXR0ZXJzLgotICAgICAgICovCi0gICAgICBpZiAoIEFGX0xBVElOX0lTX1hfSEVJR0hUX0JMVUUoIGJzICkgKQotICAgICAgICBibHVlLT5mbGFncyB8PSBBRl9MQVRJTl9CTFVFX0FESlVTVE1FTlQ7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgICAgLT4gcmVmZXJlbmNlID0gJWxkXG4iCi0gICAgICAgICAgICAgICAgICAiICAgICAgIG92ZXJzaG9vdCA9ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICpibHVlX3JlZiwgKmJsdWVfc2hvb3QgKSk7Ci0KLSAgICB9IC8qIGVuZCBmb3IgbG9vcCAqLwotCi0gICAgYWZfc2hhcGVyX2J1Zl9kZXN0cm95KCBmYWNlLCBzaGFwZXJfYnVmICk7Ci0KLSAgICAvKiB3ZSBmaW5hbGx5IGNoZWNrIHdoZXRoZXIgYmx1ZSB6b25lcyBhcmUgb3JkZXJlZDsgKi8KLSAgICAvKiBgcmVmJyBhbmQgYHNob290JyB2YWx1ZXMgb2YgdHdvIGJsdWUgem9uZXMgbXVzdCBub3Qgb3ZlcmxhcCAqLwotICAgIGlmICggYXhpcy0+Ymx1ZV9jb3VudCApCi0gICAgewotICAgICAgRlRfVUludCAgICAgICBpOwotICAgICAgQUZfTGF0aW5CbHVlICBibHVlX3NvcnRlZFtBRl9CTFVFX1NUUklOR1NFVF9NQVhfTEVOICsgMl07Ci0KLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBheGlzLT5ibHVlX2NvdW50OyBpKysgKQotICAgICAgICBibHVlX3NvcnRlZFtpXSA9ICZheGlzLT5ibHVlc1tpXTsKLQotICAgICAgLyogc29ydCBib3R0b21zIG9mIGJsdWUgem9uZXMuLi4gKi8KLSAgICAgIGFmX2xhdGluX3NvcnRfYmx1ZSggYXhpcy0+Ymx1ZV9jb3VudCwgYmx1ZV9zb3J0ZWQgKTsKLQotICAgICAgLyogLi4uYW5kIGFkanVzdCB0b3AgdmFsdWVzIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgZm9yICggaSA9IDA7IGkgPCBheGlzLT5ibHVlX2NvdW50IC0gMTsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zKiAgYTsKLSAgICAgICAgRlRfUG9zKiAgYjsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIEZUX0Jvb2wgIGFfaXNfdG9wID0gMDsKLSNlbmRpZgotCi0KLSAgICAgICAgaWYgKCBibHVlX3NvcnRlZFtpXS0+ZmxhZ3MgJiAoIEFGX0xBVElOX0JMVUVfVE9QICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9MQVRJTl9CTFVFX1NVQl9UT1AgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBhID0gJmJsdWVfc29ydGVkW2ldLT5zaG9vdC5vcmc7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBhX2lzX3RvcCA9IDE7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgYSA9ICZibHVlX3NvcnRlZFtpXS0+cmVmLm9yZzsKLQotICAgICAgICBpZiAoIGJsdWVfc29ydGVkW2kgKyAxXS0+ZmxhZ3MgJiAoIEFGX0xBVElOX0JMVUVfVE9QICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfTEFUSU5fQkxVRV9TVUJfVE9QICkgKQotICAgICAgICAgIGIgPSAmYmx1ZV9zb3J0ZWRbaSArIDFdLT5zaG9vdC5vcmc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBiID0gJmJsdWVfc29ydGVkW2kgKyAxXS0+cmVmLm9yZzsKLQotICAgICAgICBpZiAoICphID4gKmIgKQotICAgICAgICB7Ci0gICAgICAgICAgKmEgPSAqYjsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiYmx1ZSB6b25lIG92ZXJsYXA6IgotICAgICAgICAgICAgICAgICAgICAgICIgYWRqdXN0aW5nICVzICVkIHRvICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBhX2lzX3RvcCA/ICJvdmVyc2hvb3QiIDogInJlZmVyZW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgYmx1ZV9zb3J0ZWRbaV0gLSBheGlzLT5ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAqYSApKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotCi0gIC8qIENoZWNrIHdoZXRoZXIgYWxsIEFTQ0lJIGRpZ2l0cyBoYXZlIHRoZSBzYW1lIGFkdmFuY2Ugd2lkdGguICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW5fbWV0cmljc19jaGVja19kaWdpdHMoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSApCi0gIHsKLSAgICBGVF9Cb29sICAgc3RhcnRlZCA9IDAsIHNhbWVfd2lkdGggPSAxOwotICAgIEZUX0ZpeGVkICBhZHZhbmNlID0gMCwgb2xkX2FkdmFuY2UgPSAwOwotCi0gICAgdm9pZCogIHNoYXBlcl9idWY7Ci0KLSAgICAvKiBpbiBhbGwgc3VwcG9ydGVkIGNoYXJtYXBzLCBkaWdpdHMgaGF2ZSBjaGFyYWN0ZXIgY29kZXMgMHgzMC0weDM5ICovCi0gICAgY29uc3QgY2hhciAgIGRpZ2l0c1tdID0gIjAgMSAyIDMgNCA1IDYgNyA4IDkiOwotICAgIGNvbnN0IGNoYXIqICBwOwotCi0KLSAgICBwICAgICAgICAgID0gZGlnaXRzOwotICAgIHNoYXBlcl9idWYgPSBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggZmFjZSApOwotCi0gICAgd2hpbGUgKCAqcCApCi0gICAgewotICAgICAgRlRfVUxvbmcgICAgICBnbHlwaF9pbmRleDsKLSAgICAgIHVuc2lnbmVkIGludCAgbnVtX2lkeDsKLQotCi0gICAgICAvKiByZWplY3QgaW5wdXQgdGhhdCBtYXBzIHRvIG1vcmUgdGhhbiBhIHNpbmdsZSBnbHlwaCAqLwotICAgICAgcCA9IGFmX3NoYXBlcl9nZXRfY2x1c3RlciggcCwgJm1ldHJpY3MtPnJvb3QsIHNoYXBlcl9idWYsICZudW1faWR4ICk7Ci0gICAgICBpZiAoIG51bV9pZHggPiAxICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGdseXBoX2luZGV4ID0gYWZfc2hhcGVyX2dldF9lbGVtKCAmbWV0cmljcy0+cm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZXJfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOwotICAgICAgaWYgKCAhZ2x5cGhfaW5kZXggKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBzdGFydGVkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBhZHZhbmNlICE9IG9sZF9hZHZhbmNlICkKLSAgICAgICAgewotICAgICAgICAgIHNhbWVfd2lkdGggPSAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9sZF9hZHZhbmNlID0gYWR2YW5jZTsKLSAgICAgICAgc3RhcnRlZCAgICAgPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIGFmX3NoYXBlcl9idWZfZGVzdHJveSggZmFjZSwgc2hhcGVyX2J1ZiApOwotCi0gICAgbWV0cmljcy0+cm9vdC5kaWdpdHNfaGF2ZV9zYW1lX3dpZHRoID0gc2FtZV93aWR0aDsKLSAgfQotCi0KLSAgLyogSW5pdGlhbGl6ZSBnbG9iYWwgbWV0cmljcy4gKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW5fbWV0cmljc19pbml0KCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICkKLSAgewotICAgIEZUX0NoYXJNYXAgIG9sZG1hcCA9IGZhY2UtPmNoYXJtYXA7Ci0KLQotICAgIG1ldHJpY3MtPnVuaXRzX3Blcl9lbSA9IGZhY2UtPnVuaXRzX3Blcl9FTTsKLQotICAgIGlmICggIUZUX1NlbGVjdF9DaGFybWFwKCBmYWNlLCBGVF9FTkNPRElOR19VTklDT0RFICkgKQotICAgIHsKLSAgICAgIGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMoIG1ldHJpY3MsIGZhY2UgKTsKLSAgICAgIGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcyggbWV0cmljcywgZmFjZSApOwotICAgICAgYWZfbGF0aW5fbWV0cmljc19jaGVja19kaWdpdHMoIG1ldHJpY3MsIGZhY2UgKTsKLSAgICB9Ci0KLSAgICBGVF9TZXRfQ2hhcm1hcCggZmFjZSwgb2xkbWFwICk7Ci0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogQWRqdXN0IHNjYWxpbmcgdmFsdWUsIHRoZW4gc2NhbGUgYW5kIHNoaWZ0IHdpZHRocyAgICovCi0gIC8qIGFuZCBibHVlIHpvbmVzIChpZiBhcHBsaWNhYmxlKSBmb3IgZ2l2ZW4gZGltZW5zaW9uLiAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX2xhdGluX21ldHJpY3Nfc2NhbGVfZGltKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TY2FsZXIgICAgICAgIHNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgICAgZGltICkKLSAgewotICAgIEZUX0ZpeGVkICAgICAgc2NhbGU7Ci0gICAgRlRfUG9zICAgICAgICBkZWx0YTsKLSAgICBBRl9MYXRpbkF4aXMgIGF4aXM7Ci0gICAgRlRfVUludCAgICAgICBubjsKLQotCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgIHsKLSAgICAgIHNjYWxlID0gc2NhbGVyLT54X3NjYWxlOwotICAgICAgZGVsdGEgPSBzY2FsZXItPnhfZGVsdGE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzY2FsZSA9IHNjYWxlci0+eV9zY2FsZTsKLSAgICAgIGRlbHRhID0gc2NhbGVyLT55X2RlbHRhOwotICAgIH0KLQotICAgIGF4aXMgPSAmbWV0cmljcy0+YXhpc1tkaW1dOwotCi0gICAgaWYgKCBheGlzLT5vcmdfc2NhbGUgPT0gc2NhbGUgJiYgYXhpcy0+b3JnX2RlbHRhID09IGRlbHRhICkKLSAgICAgIHJldHVybjsKLQotICAgIGF4aXMtPm9yZ19zY2FsZSA9IHNjYWxlOwotICAgIGF4aXMtPm9yZ19kZWx0YSA9IGRlbHRhOwotCi0gICAgLyoKLSAgICAgKiBjb3JyZWN0IFggYW5kIFkgc2NhbGUgdG8gb3B0aW1pemUgdGhlIGFsaWdubWVudCBvZiB0aGUgdG9wIG9mIHNtYWxsCi0gICAgICogbGV0dGVycyB0byB0aGUgcGl4ZWwgZ3JpZAotICAgICAqLwotICAgIHsKLSAgICAgIEFGX0xhdGluQXhpcyAgQXhpcyA9ICZtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXTsKLSAgICAgIEFGX0xhdGluQmx1ZSAgYmx1ZSA9IE5VTEw7Ci0KLQotICAgICAgZm9yICggbm4gPSAwOyBubiA8IEF4aXMtPmJsdWVfY291bnQ7IG5uKysgKQotICAgICAgewotICAgICAgICBpZiAoIEF4aXMtPmJsdWVzW25uXS5mbGFncyAmIEFGX0xBVElOX0JMVUVfQURKVVNUTUVOVCApCi0gICAgICAgIHsKLSAgICAgICAgICBibHVlID0gJkF4aXMtPmJsdWVzW25uXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGJsdWUgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgICBzY2FsZWQ7Ci0gICAgICAgIEZUX1BvcyAgIHRocmVzaG9sZDsKLSAgICAgICAgRlRfUG9zICAgZml0dGVkOwotICAgICAgICBGVF9VSW50ICBsaW1pdDsKLSAgICAgICAgRlRfVUludCAgcHBlbTsKLQotCi0gICAgICAgIHNjYWxlZCAgICA9IEZUX011bEZpeCggYmx1ZS0+c2hvb3Qub3JnLCBzY2FsZSApOwotICAgICAgICBwcGVtICAgICAgPSBtZXRyaWNzLT5yb290LnNjYWxlci5mYWNlLT5zaXplLT5tZXRyaWNzLnhfcHBlbTsKLSAgICAgICAgbGltaXQgICAgID0gbWV0cmljcy0+cm9vdC5nbG9iYWxzLT5pbmNyZWFzZV94X2hlaWdodDsKLSAgICAgICAgdGhyZXNob2xkID0gNDA7Ci0KLSAgICAgICAgLyogaWYgdGhlIGBpbmNyZWFzZS14LWhlaWdodCcgcHJvcGVydHkgaXMgYWN0aXZlLCAqLwotICAgICAgICAvKiB3ZSByb3VuZCB1cCBtdWNoIG1vcmUgb2Z0ZW4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHBwZW0gPD0gbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBwcGVtID49IEFGX1BST1BfSU5DUkVBU0VfWF9IRUlHSFRfTUlOICkKLSAgICAgICAgICB0aHJlc2hvbGQgPSA1MjsKLQotICAgICAgICBmaXR0ZWQgPSAoIHNjYWxlZCArIHRocmVzaG9sZCApICYgfjYzOwotCi0gICAgICAgIGlmICggc2NhbGVkICE9IGZpdHRlZCApCi0gICAgICAgIHsKLSNpZiAwCi0gICAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZml0dGVkIDwgc2NhbGVkICkKLSAgICAgICAgICAgICAgc2NhbGUgLT0gc2NhbGUgLyA1MDsgIC8qIHNjYWxlICo9IDAuOTggKi8KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgICBtYXhfaGVpZ2h0OwotICAgICAgICAgICAgRlRfUG9zICAgIGRpc3Q7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgbmV3X3NjYWxlOwotCi0KLSAgICAgICAgICAgIG5ld19zY2FsZSA9IEZUX011bERpdiggc2NhbGUsIGZpdHRlZCwgc2NhbGVkICk7Ci0KLSAgICAgICAgICAgIC8qIHRoZSBzY2FsaW5nIHNob3VsZCBub3QgY2hhbmdlIHRoZSByZXN1bHQgYnkgbW9yZSB0aGFuIHR3byBwaXhlbHMgKi8KLSAgICAgICAgICAgIG1heF9oZWlnaHQgPSBtZXRyaWNzLT51bml0c19wZXJfZW07Ci0KLSAgICAgICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBBeGlzLT5ibHVlX2NvdW50OyBubisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWF4X2hlaWdodCA9IEZUX01BWCggbWF4X2hlaWdodCwgQXhpcy0+Ymx1ZXNbbm5dLmFzY2VuZGVyICk7Ci0gICAgICAgICAgICAgIG1heF9oZWlnaHQgPSBGVF9NQVgoIG1heF9oZWlnaHQsIC1BeGlzLT5ibHVlc1tubl0uZGVzY2VuZGVyICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRpc3QgID0gRlRfQUJTKCBGVF9NdWxGaXgoIG1heF9oZWlnaHQsIG5ld19zY2FsZSAtIHNjYWxlICkgKTsKLSAgICAgICAgICAgIGRpc3QgJj0gfjEyNzsKLQotICAgICAgICAgICAgaWYgKCBkaXN0ID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9UUkFDRTUoKAotICAgICAgICAgICAgICAgICJhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbToiCi0gICAgICAgICAgICAgICAgIiB4IGhlaWdodCBhbGlnbm1lbnQgKHN0eWxlIGAlcycpOlxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgIiB2ZXJ0aWNhbCBzY2FsaW5nIGNoYW5nZWQgZnJvbSAlLjVmIHRvICUuNWYgKGJ5ICVkJSUpXG4iCi0gICAgICAgICAgICAgICAgIlxuIiwKLSAgICAgICAgICAgICAgICBhZl9zdHlsZV9uYW1lc1ttZXRyaWNzLT5yb290LnN0eWxlX2NsYXNzLT5zdHlsZV0sCi0gICAgICAgICAgICAgICAgc2NhbGUgLyA2NTUzNi4wLAotICAgICAgICAgICAgICAgIG5ld19zY2FsZSAvIDY1NTM2LjAsCi0gICAgICAgICAgICAgICAgKCBmaXR0ZWQgLSBzY2FsZWQgKSAqIDEwMCAvIHNjYWxlZCApKTsKLQotICAgICAgICAgICAgICBzY2FsZSA9IG5ld19zY2FsZTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9UUkFDRTUoKAotICAgICAgICAgICAgICAgICJhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbToiCi0gICAgICAgICAgICAgICAgIiB4IGhlaWdodCBhbGlnbm1lbnQgKHN0eWxlIGAlcycpOlxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgIiBleGNlc3NpdmUgdmVydGljYWwgc2NhbGluZyBhYmFuZG9uZWRcbiIKLSAgICAgICAgICAgICAgICAiXG4iLAotICAgICAgICAgICAgICAgIGFmX3N0eWxlX25hbWVzW21ldHJpY3MtPnJvb3Quc3R5bGVfY2xhc3MtPnN0eWxlXSApKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGF4aXMtPnNjYWxlID0gc2NhbGU7Ci0gICAgYXhpcy0+ZGVsdGEgPSBkZWx0YTsKLQotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICB7Ci0gICAgICBtZXRyaWNzLT5yb290LnNjYWxlci54X3NjYWxlID0gc2NhbGU7Ci0gICAgICBtZXRyaWNzLT5yb290LnNjYWxlci54X2RlbHRhID0gZGVsdGE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtZXRyaWNzLT5yb290LnNjYWxlci55X3NjYWxlID0gc2NhbGU7Ci0gICAgICBtZXRyaWNzLT5yb290LnNjYWxlci55X2RlbHRhID0gZGVsdGE7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIiVzIHdpZHRocyAoc3R5bGUgYCVzJylcbiIsCi0gICAgICAgICAgICAgICAgZGltID09IEFGX0RJTUVOU0lPTl9IT1JaID8gImhvcml6b250YWwiIDogInZlcnRpY2FsIiwKLSAgICAgICAgICAgICAgICBhZl9zdHlsZV9uYW1lc1ttZXRyaWNzLT5yb290LnN0eWxlX2NsYXNzLT5zdHlsZV0gKSk7Ci0KLSAgICAvKiBzY2FsZSB0aGUgd2lkdGhzICovCi0gICAgZm9yICggbm4gPSAwOyBubiA8IGF4aXMtPndpZHRoX2NvdW50OyBubisrICkKLSAgICB7Ci0gICAgICBBRl9XaWR0aCAgd2lkdGggPSBheGlzLT53aWR0aHMgKyBubjsKLQotCi0gICAgICB3aWR0aC0+Y3VyID0gRlRfTXVsRml4KCB3aWR0aC0+b3JnLCBzY2FsZSApOwotICAgICAgd2lkdGgtPmZpdCA9IHdpZHRoLT5jdXI7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgICVkIHNjYWxlZCB0byAlLjJmXG4iLAotICAgICAgICAgICAgICAgICAgd2lkdGgtPm9yZywKLSAgICAgICAgICAgICAgICAgIHdpZHRoLT5jdXIgLyA2NC4wICkpOwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgICAvKiBhbiBleHRyYS1saWdodCBheGlzIGNvcnJlc3BvbmRzIHRvIGEgc3RhbmRhcmQgd2lkdGggdGhhdCBpcyAqLwotICAgIC8qIHNtYWxsZXIgdGhhbiA1LzggcGl4ZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgYXhpcy0+ZXh0cmFfbGlnaHQgPQotICAgICAgKEZUX0Jvb2wpKCBGVF9NdWxGaXgoIGF4aXMtPnN0YW5kYXJkX3dpZHRoLCBzY2FsZSApIDwgMzIgKyA4ICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgIGlmICggYXhpcy0+ZXh0cmFfbGlnaHQgKQotICAgICAgRlRfVFJBQ0U1KCggImAlcycgc3R5bGUgaXMgZXh0cmEgbGlnaHQgKGF0IGN1cnJlbnQgcmVzb2x1dGlvbilcbiIKLSAgICAgICAgICAgICAgICAgICJcbiIsCi0gICAgICAgICAgICAgICAgICBhZl9zdHlsZV9uYW1lc1ttZXRyaWNzLT5yb290LnN0eWxlX2NsYXNzLT5zdHlsZV0gKSk7Ci0jZW5kaWYKLQotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICkKLSAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgIGlmICggYXhpcy0+Ymx1ZV9jb3VudCApCi0gICAgICAgIEZUX1RSQUNFNSgoICJibHVlIHpvbmVzIChzdHlsZSBgJXMnKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgYWZfc3R5bGVfbmFtZXNbbWV0cmljcy0+cm9vdC5zdHlsZV9jbGFzcy0+c3R5bGVdICkpOwotI2VuZGlmCi0KLSAgICAgIC8qIHNjYWxlIHRoZSBibHVlIHpvbmVzICovCi0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgYXhpcy0+Ymx1ZV9jb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0xhdGluQmx1ZSAgYmx1ZSA9ICZheGlzLT5ibHVlc1tubl07Ci0gICAgICAgIEZUX1BvcyAgICAgICAgZGlzdDsKLQotCi0gICAgICAgIGJsdWUtPnJlZi5jdXIgICA9IEZUX011bEZpeCggYmx1ZS0+cmVmLm9yZywgc2NhbGUgKSArIGRlbHRhOwotICAgICAgICBibHVlLT5yZWYuZml0ICAgPSBibHVlLT5yZWYuY3VyOwotICAgICAgICBibHVlLT5zaG9vdC5jdXIgPSBGVF9NdWxGaXgoIGJsdWUtPnNob290Lm9yZywgc2NhbGUgKSArIGRlbHRhOwotICAgICAgICBibHVlLT5zaG9vdC5maXQgPSBibHVlLT5zaG9vdC5jdXI7Ci0gICAgICAgIGJsdWUtPmZsYWdzICAgICY9IH5BRl9MQVRJTl9CTFVFX0FDVElWRTsKLQotICAgICAgICAvKiBhIGJsdWUgem9uZSBpcyBvbmx5IGFjdGl2ZSBpZiBpdCBpcyBsZXNzIHRoYW4gMy80IHBpeGVscyB0YWxsICovCi0gICAgICAgIGRpc3QgPSBGVF9NdWxGaXgoIGJsdWUtPnJlZi5vcmcgLSBibHVlLT5zaG9vdC5vcmcsIHNjYWxlICk7Ci0gICAgICAgIGlmICggZGlzdCA8PSA0OCAmJiBkaXN0ID49IC00OCApCi0gICAgICAgIHsKLSNpZiAwCi0gICAgICAgICAgRlRfUG9zICBkZWx0YTE7Ci0jZW5kaWYKLSAgICAgICAgICBGVF9Qb3MgIGRlbHRhMjsKLQotCi0gICAgICAgICAgLyogdXNlIGRpc2NyZXRlIHZhbHVlcyBmb3IgYmx1ZSB6b25lIHdpZHRocyAqLwotCi0jaWYgMAotCi0gICAgICAgICAgLyogZ2VuZXJpYywgb3JpZ2luYWwgY29kZSAqLwotICAgICAgICAgIGRlbHRhMSA9IGJsdWUtPnNob290Lm9yZyAtIGJsdWUtPnJlZi5vcmc7Ci0gICAgICAgICAgZGVsdGEyID0gZGVsdGExOwotICAgICAgICAgIGlmICggZGVsdGExIDwgMCApCi0gICAgICAgICAgICBkZWx0YTIgPSAtZGVsdGEyOwotCi0gICAgICAgICAgZGVsdGEyID0gRlRfTXVsRml4KCBkZWx0YTIsIHNjYWxlICk7Ci0KLSAgICAgICAgICBpZiAoIGRlbHRhMiA8IDMyICkKLSAgICAgICAgICAgIGRlbHRhMiA9IDA7Ci0gICAgICAgICAgZWxzZSBpZiAoIGRlbHRhMiA8IDY0ICkKLSAgICAgICAgICAgIGRlbHRhMiA9IDMyICsgKCAoICggZGVsdGEyIC0gMzIgKSArIDE2ICkgJiB+MzEgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkZWx0YTIgPSBGVF9QSVhfUk9VTkQoIGRlbHRhMiApOwotCi0gICAgICAgICAgaWYgKCBkZWx0YTEgPCAwICkKLSAgICAgICAgICAgIGRlbHRhMiA9IC1kZWx0YTI7Ci0KLSAgICAgICAgICBibHVlLT5yZWYuZml0ICAgPSBGVF9QSVhfUk9VTkQoIGJsdWUtPnJlZi5jdXIgKTsKLSAgICAgICAgICBibHVlLT5zaG9vdC5maXQgPSBibHVlLT5yZWYuZml0ICsgZGVsdGEyOwotCi0jZWxzZQotCi0gICAgICAgICAgLyogc2ltcGxpZmllZCB2ZXJzaW9uIGR1ZSB0byBhYnMoZGlzdCkgPD0gNDggKi8KLSAgICAgICAgICBkZWx0YTIgPSBkaXN0OwotICAgICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgICAgZGVsdGEyID0gLWRlbHRhMjsKLQotICAgICAgICAgIGlmICggZGVsdGEyIDwgMzIgKQotICAgICAgICAgICAgZGVsdGEyID0gMDsKLSAgICAgICAgICBlbHNlIGlmICggZGVsdGEyIDwgNDggKQotICAgICAgICAgICAgZGVsdGEyID0gMzI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVsdGEyID0gNjQ7Ci0KLSAgICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICAgIGRlbHRhMiA9IC1kZWx0YTI7Ci0KLSAgICAgICAgICBibHVlLT5yZWYuZml0ICAgPSBGVF9QSVhfUk9VTkQoIGJsdWUtPnJlZi5jdXIgKTsKLSAgICAgICAgICBibHVlLT5zaG9vdC5maXQgPSBibHVlLT5yZWYuZml0IC0gZGVsdGEyOwotCi0jZW5kaWYKLQotICAgICAgICAgIGJsdWUtPmZsYWdzIHw9IEFGX0xBVElOX0JMVUVfQUNUSVZFOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIHVzZSBzdWItdG9wIGJsdWUgem9uZSBvbmx5IGlmIGl0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoICovCi0gICAgICAvKiBhbm90aGVyIChub24tc3VwLXRvcCkgYmx1ZSB6b25lOyBvdGhlcndpc2UsIHRoZSAgICAgICAqLwotICAgICAgLyogZWZmZWN0IHdvdWxkIGJlIHNpbWlsYXIgdG8gYSBuZXV0cmFsIGJsdWUgem9uZSwgd2hpY2ggKi8KLSAgICAgIC8qIGlzIG5vdCBkZXNpcmVkIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgYXhpcy0+Ymx1ZV9jb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0xhdGluQmx1ZSAgYmx1ZSA9ICZheGlzLT5ibHVlc1tubl07Ci0gICAgICAgIEZUX1VJbnQgICAgICAgaTsKLQotCi0gICAgICAgIGlmICggISggYmx1ZS0+ZmxhZ3MgJiBBRl9MQVRJTl9CTFVFX1NVQl9UT1AgKSApCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmICggISggYmx1ZS0+ZmxhZ3MgJiBBRl9MQVRJTl9CTFVFX0FDVElWRSApICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGF4aXMtPmJsdWVfY291bnQ7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9MYXRpbkJsdWUgIGIgPSAmYXhpcy0+Ymx1ZXNbaV07Ci0KLQotICAgICAgICAgIGlmICggYi0+ZmxhZ3MgJiBBRl9MQVRJTl9CTFVFX1NVQl9UT1AgKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgaWYgKCAhKCBiLT5mbGFncyAmIEFGX0xBVElOX0JMVUVfQUNUSVZFICkgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBpZiAoIGItPnJlZi5maXQgPD0gYmx1ZS0+c2hvb3QuZml0ICYmCi0gICAgICAgICAgICAgICBiLT5zaG9vdC5maXQgPj0gYmx1ZS0+cmVmLmZpdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgYmx1ZS0+ZmxhZ3MgJj0gfkFGX0xBVElOX0JMVUVfQUNUSVZFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgZm9yICggbm4gPSAwOyBubiA8IGF4aXMtPmJsdWVfY291bnQ7IG5uKysgKQotICAgICAgewotICAgICAgICBBRl9MYXRpbkJsdWUgIGJsdWUgPSAmYXhpcy0+Ymx1ZXNbbm5dOwotCi0KLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgcmVmZXJlbmNlICVkOiAlZCBzY2FsZWQgdG8gJS4yZiVzXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIG92ZXJzaG9vdCAlZDogJWQgc2NhbGVkIHRvICUuMmYlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgbm4sCi0gICAgICAgICAgICAgICAgICAgIGJsdWUtPnJlZi5vcmcsCi0gICAgICAgICAgICAgICAgICAgIGJsdWUtPnJlZi5maXQgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICBibHVlLT5mbGFncyAmIEFGX0xBVElOX0JMVUVfQUNUSVZFID8gIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgKGluYWN0aXZlKSIsCi0gICAgICAgICAgICAgICAgICAgIG5uLAotICAgICAgICAgICAgICAgICAgICBibHVlLT5zaG9vdC5vcmcsCi0gICAgICAgICAgICAgICAgICAgIGJsdWUtPnNob290LmZpdCAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgIGJsdWUtPmZsYWdzICYgQUZfTEFUSU5fQkxVRV9BQ1RJVkUgPyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiAoaW5hY3RpdmUpIiApKTsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgfQotCi0KLSAgLyogU2NhbGUgZ2xvYmFsIHZhbHVlcyBpbiBib3RoIGRpcmVjdGlvbnMuICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW5fbWV0cmljc19zY2FsZSggQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TY2FsZXIgICAgICAgIHNjYWxlciApCi0gIHsKLSAgICBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZSA9IHNjYWxlci0+cmVuZGVyX21vZGU7Ci0gICAgbWV0cmljcy0+cm9vdC5zY2FsZXIuZmFjZSAgICAgICAgPSBzY2FsZXItPmZhY2U7Ci0gICAgbWV0cmljcy0+cm9vdC5zY2FsZXIuZmxhZ3MgICAgICAgPSBzY2FsZXItPmZsYWdzOwotCi0gICAgYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0oIG1ldHJpY3MsIHNjYWxlciwgQUZfRElNRU5TSU9OX0hPUlogKTsKLSAgICBhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSggbWV0cmljcywgc2NhbGVyLCBBRl9ESU1FTlNJT05fVkVSVCApOwotICB9Ci0KLQotICAvKiBFeHRyYWN0IHN0YW5kYXJkX3dpZHRoIGZyb20gd3JpdGluZyBzeXN0ZW0vc2NyaXB0IHNwZWNpZmljICovCi0gIC8qIG1ldHJpY3MgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sYXRpbl9nZXRfc3RhbmRhcmRfd2lkdGhzKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAgICAgc3RkSFcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAgICAgc3RkVlcgKQotICB7Ci0gICAgaWYgKCBzdGRIVyApCi0gICAgICAqc3RkSFcgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXS5zdGFuZGFyZF93aWR0aDsKLQotICAgIGlmICggc3RkVlcgKQotICAgICAgKnN0ZFZXID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uc3RhbmRhcmRfd2lkdGg7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgTCBBIFQgSSBOICAgRyBMIFkgUCBIICAgQSBOIEEgTCBZIFMgSSBTICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogV2FsayBvdmVyIGFsbCBjb250b3VycyBhbmQgY29tcHV0ZSBpdHMgc2VnbWVudHMuICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzICAgICAgID0gKEFGX0xhdGluTWV0cmljcyloaW50cy0+bWV0cmljczsKLSAgICBBRl9BeGlzSGludHMgICAgIGF4aXMgICAgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSAgICAgICAgPSBoaW50cy0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBBRl9TZWdtZW50ICAgICAgIHNlZ21lbnQgICAgICAgPSBOVUxMOwotICAgIEFGX1NlZ21lbnRSZWMgICAgc2VnMDsKLSAgICBBRl9Qb2ludCogICAgICAgIGNvbnRvdXIgICAgICAgPSBoaW50cy0+Y29udG91cnM7Ci0gICAgQUZfUG9pbnQqICAgICAgICBjb250b3VyX2xpbWl0ID0gY29udG91ciArIGhpbnRzLT5udW1fY29udG91cnM7Ci0gICAgQUZfRGlyZWN0aW9uICAgICBtYWpvcl9kaXIsIHNlZ21lbnRfZGlyOwotCi0gICAgRlRfUG9zICBmbGF0X3RocmVzaG9sZCA9IEZMQVRfVEhSRVNIT0xEKCBtZXRyaWNzLT51bml0c19wZXJfZW0gKTsKLQotCi0gICAgRlRfWkVSTyggJnNlZzAgKTsKLSAgICBzZWcwLnNjb3JlID0gMzIwMDA7Ci0gICAgc2VnMC5mbGFncyA9IEFGX0VER0VfTk9STUFMOwotCi0gICAgbWFqb3JfZGlyICAgPSAoQUZfRGlyZWN0aW9uKUZUX0FCUyggYXhpcy0+bWFqb3JfZGlyICk7Ci0gICAgc2VnbWVudF9kaXIgPSBtYWpvcl9kaXI7Ci0KLSAgICBheGlzLT5udW1fc2VnbWVudHMgPSAwOwotCi0gICAgLyogc2V0IHVwICh1LHYpIGluIGVhY2ggcG9pbnQgKi8KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgQUZfUG9pbnQgIHBvaW50ID0gaGludHMtPnBvaW50czsKLSAgICAgIEFGX1BvaW50ICBsaW1pdCA9IHBvaW50ICsgaGludHMtPm51bV9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyBwb2ludCA8IGxpbWl0OyBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPnUgPSBwb2ludC0+Zng7Ci0gICAgICAgIHBvaW50LT52ID0gcG9pbnQtPmZ5OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgQUZfUG9pbnQgIHBvaW50ID0gaGludHMtPnBvaW50czsKLSAgICAgIEFGX1BvaW50ICBsaW1pdCA9IHBvaW50ICsgaGludHMtPm51bV9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyBwb2ludCA8IGxpbWl0OyBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPnUgPSBwb2ludC0+Znk7Ci0gICAgICAgIHBvaW50LT52ID0gcG9pbnQtPmZ4OwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGRvIGVhY2ggY29udG91ciBzZXBhcmF0ZWx5ICovCi0gICAgZm9yICggOyBjb250b3VyIDwgY29udG91cl9saW1pdDsgY29udG91cisrICkKLSAgICB7Ci0gICAgICBBRl9Qb2ludCAgcG9pbnQgICA9IGNvbnRvdXJbMF07Ci0gICAgICBBRl9Qb2ludCAgbGFzdCAgICA9IHBvaW50LT5wcmV2OwotICAgICAgaW50ICAgICAgIG9uX2VkZ2UgPSAwOwotCi0gICAgICAvKiB3ZSBjYWxsIHZhbHVlcyBtZWFzdXJlZCBhbG9uZyBhIHNlZ21lbnQgKHBvaW50LT52KSAgICAqLwotICAgICAgLyogYGNvb3JkaW5hdGVzJywgYW5kIHZhbHVlcyBvcnRob2dvbmFsIHRvIGl0IChwb2ludC0+dSkgKi8KLSAgICAgIC8qIGBwb3NpdGlvbnMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGVF9Qb3MgICAgIG1pbl9wb3MgICAgICA9ICAzMjAwMDsKLSAgICAgIEZUX1BvcyAgICAgbWF4X3BvcyAgICAgID0gLTMyMDAwOwotICAgICAgRlRfUG9zICAgICBtaW5fY29vcmQgICAgPSAgMzIwMDA7Ci0gICAgICBGVF9Qb3MgICAgIG1heF9jb29yZCAgICA9IC0zMjAwMDsKLSAgICAgIEZUX1VTaG9ydCAgbWluX2ZsYWdzICAgID0gIEFGX0ZMQUdfTk9ORTsKLSAgICAgIEZUX1VTaG9ydCAgbWF4X2ZsYWdzICAgID0gIEFGX0ZMQUdfTk9ORTsKLSAgICAgIEZUX1BvcyAgICAgbWluX29uX2Nvb3JkID0gIDMyMDAwOwotICAgICAgRlRfUG9zICAgICBtYXhfb25fY29vcmQgPSAtMzIwMDA7Ci0KLSAgICAgIEZUX0Jvb2wgIHBhc3NlZDsKLQotICAgICAgQUZfU2VnbWVudCAgcHJldl9zZWdtZW50ID0gTlVMTDsKLQotICAgICAgRlRfUG9zICAgICBwcmV2X21pbl9wb3MgICAgICA9IG1pbl9wb3M7Ci0gICAgICBGVF9Qb3MgICAgIHByZXZfbWF4X3BvcyAgICAgID0gbWF4X3BvczsKLSAgICAgIEZUX1BvcyAgICAgcHJldl9taW5fY29vcmQgICAgPSBtaW5fY29vcmQ7Ci0gICAgICBGVF9Qb3MgICAgIHByZXZfbWF4X2Nvb3JkICAgID0gbWF4X2Nvb3JkOwotICAgICAgRlRfVVNob3J0ICBwcmV2X21pbl9mbGFncyAgICA9IG1pbl9mbGFnczsKLSAgICAgIEZUX1VTaG9ydCAgcHJldl9tYXhfZmxhZ3MgICAgPSBtYXhfZmxhZ3M7Ci0gICAgICBGVF9Qb3MgICAgIHByZXZfbWluX29uX2Nvb3JkID0gbWluX29uX2Nvb3JkOwotICAgICAgRlRfUG9zICAgICBwcmV2X21heF9vbl9jb29yZCA9IG1heF9vbl9jb29yZDsKLQotCi0gICAgICBpZiAoIEZUX0FCUyggbGFzdC0+b3V0X2RpciApICA9PSBtYWpvcl9kaXIgJiYKLSAgICAgICAgICAgRlRfQUJTKCBwb2ludC0+b3V0X2RpciApID09IG1ham9yX2RpciApCi0gICAgICB7Ci0gICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IG9uIGFuIGVkZ2UsIHRyeSB0byBsb2NhdGUgaXRzIHN0YXJ0ICovCi0gICAgICAgIGxhc3QgPSBwb2ludDsKLQotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgcG9pbnQgPSBwb2ludC0+cHJldjsKLSAgICAgICAgICBpZiAoIEZUX0FCUyggcG9pbnQtPm91dF9kaXIgKSAhPSBtYWpvcl9kaXIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCBwb2ludCA9PSBsYXN0ICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGxhc3QgICA9IHBvaW50OwotICAgICAgcGFzc2VkID0gMDsKLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICB1LCB2OwotCi0KLSAgICAgICAgaWYgKCBvbl9lZGdlICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGdldCBtaW5pbXVtIGFuZCBtYXhpbXVtIHBvc2l0aW9uICovCi0gICAgICAgICAgdSA9IHBvaW50LT51OwotICAgICAgICAgIGlmICggdSA8IG1pbl9wb3MgKQotICAgICAgICAgICAgbWluX3BvcyA9IHU7Ci0gICAgICAgICAgaWYgKCB1ID4gbWF4X3BvcyApCi0gICAgICAgICAgICBtYXhfcG9zID0gdTsKLQotICAgICAgICAgIC8qIGdldCBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvb3JkaW5hdGUgdG9nZXRoZXIgd2l0aCBmbGFncyAqLwotICAgICAgICAgIHYgPSBwb2ludC0+djsKLSAgICAgICAgICBpZiAoIHYgPCBtaW5fY29vcmQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbl9jb29yZCA9IHY7Ci0gICAgICAgICAgICBtaW5fZmxhZ3MgPSBwb2ludC0+ZmxhZ3M7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICggdiA+IG1heF9jb29yZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4X2Nvb3JkID0gdjsKLSAgICAgICAgICAgIG1heF9mbGFncyA9IHBvaW50LT5mbGFnczsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBnZXQgbWluaW11bSBhbmQgbWF4aW11bSBjb29yZGluYXRlIG9mIGBvbicgcG9pbnRzICovCi0gICAgICAgICAgaWYgKCAhKCBwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0wgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgdiA9IHBvaW50LT52OwotICAgICAgICAgICAgaWYgKCB2IDwgbWluX29uX2Nvb3JkICkKLSAgICAgICAgICAgICAgbWluX29uX2Nvb3JkID0gdjsKLSAgICAgICAgICAgIGlmICggdiA+IG1heF9vbl9jb29yZCApCi0gICAgICAgICAgICAgIG1heF9vbl9jb29yZCA9IHY7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBwb2ludC0+b3V0X2RpciAhPSBzZWdtZW50X2RpciB8fCBwb2ludCA9PSBsYXN0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBuZXcgc2VnbWVudCdzIHN0YXJ0IHBvaW50IGlzIGlkZW50aWNhbCB0byAqLwotICAgICAgICAgICAgLyogdGhlIHByZXZpb3VzIHNlZ21lbnQncyBlbmQgcG9pbnQ7IGZvciBleGFtcGxlLCB0aGlzIG1pZ2h0ICAgKi8KLSAgICAgICAgICAgIC8qIGhhcHBlbiBmb3Igc3Bpa2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIGlmICggIXByZXZfc2VnbWVudCB8fCBzZWdtZW50LT5maXJzdCAhPSBwcmV2X3NlZ21lbnQtPmxhc3QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBwb2ludHMgYXJlIGRpZmZlcmVudDogd2UgYXJlIGp1c3QgbGVhdmluZyBhbiBlZGdlLCB0aHVzICovCi0gICAgICAgICAgICAgIC8qIHJlY29yZCBhIG5ldyBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICBzZWdtZW50LT5sYXN0ICA9IHBvaW50OwotICAgICAgICAgICAgICBzZWdtZW50LT5wb3MgICA9IChGVF9TaG9ydCkoICggbWluX3BvcyArIG1heF9wb3MgKSA+PiAxICk7Ci0gICAgICAgICAgICAgIHNlZ21lbnQtPmRlbHRhID0gKEZUX1Nob3J0KSggKCBtYXhfcG9zIC0gbWluX3BvcyApID4+IDEgKTsKLQotICAgICAgICAgICAgICAvKiBhIHNlZ21lbnQgaXMgcm91bmQgaWYgZWl0aGVyIGl0cyBmaXJzdCBvciBsYXN0IHBvaW50ICovCi0gICAgICAgICAgICAgIC8qIGlzIGEgY29udHJvbCBwb2ludCwgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG9uIHBvaW50cyAgKi8KLSAgICAgICAgICAgICAgLyogaW5iZXR3ZWVuIGRvZXNuJ3QgZXhjZWVkIGEgaGV1cmlzdGljIGxpbWl0ICAgICAgICAgICAqLwotICAgICAgICAgICAgICBpZiAoICggbWluX2ZsYWdzIHwgbWF4X2ZsYWdzICkgJiBBRl9GTEFHX0NPTlRST0wgICAgICAmJgotICAgICAgICAgICAgICAgICAgICggbWF4X29uX2Nvb3JkIC0gbWluX29uX2Nvb3JkICkgPCBmbGF0X3RocmVzaG9sZCApCi0gICAgICAgICAgICAgICAgc2VnbWVudC0+ZmxhZ3MgfD0gQUZfRURHRV9ST1VORDsKLQotICAgICAgICAgICAgICBzZWdtZW50LT5taW5fY29vcmQgPSAoRlRfU2hvcnQpbWluX2Nvb3JkOwotICAgICAgICAgICAgICBzZWdtZW50LT5tYXhfY29vcmQgPSAoRlRfU2hvcnQpbWF4X2Nvb3JkOwotICAgICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgICAgPSBzZWdtZW50LT5tYXhfY29vcmQgLSBzZWdtZW50LT5taW5fY29vcmQ7Ci0KLSAgICAgICAgICAgICAgcHJldl9zZWdtZW50ICAgICAgPSBzZWdtZW50OwotICAgICAgICAgICAgICBwcmV2X21pbl9wb3MgICAgICA9IG1pbl9wb3M7Ci0gICAgICAgICAgICAgIHByZXZfbWF4X3BvcyAgICAgID0gbWF4X3BvczsKLSAgICAgICAgICAgICAgcHJldl9taW5fY29vcmQgICAgPSBtaW5fY29vcmQ7Ci0gICAgICAgICAgICAgIHByZXZfbWF4X2Nvb3JkICAgID0gbWF4X2Nvb3JkOwotICAgICAgICAgICAgICBwcmV2X21pbl9mbGFncyAgICA9IG1pbl9mbGFnczsKLSAgICAgICAgICAgICAgcHJldl9tYXhfZmxhZ3MgICAgPSBtYXhfZmxhZ3M7Ci0gICAgICAgICAgICAgIHByZXZfbWluX29uX2Nvb3JkID0gbWluX29uX2Nvb3JkOwotICAgICAgICAgICAgICBwcmV2X21heF9vbl9jb29yZCA9IG1heF9vbl9jb29yZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogcG9pbnRzIGFyZSB0aGUgc2FtZTogd2UgZG9uJ3QgY3JlYXRlIGEgbmV3IHNlZ21lbnQgYnV0ICovCi0gICAgICAgICAgICAgIC8qIG1lcmdlIHRoZSBjdXJyZW50IHNlZ21lbnQgd2l0aCB0aGUgcHJldmlvdXMgb25lICAgICAgICAqLwotCi0gICAgICAgICAgICAgIGlmICggcHJldl9zZWdtZW50LT5sYXN0LT5pbl9kaXIgPT0gcG9pbnQtPmluX2RpciApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB3ZSBoYXZlIGlkZW50aWNhbCBkaXJlY3Rpb25zICh0aGlzIGNhbiBoYXBwZW4gZm9yICAgICAgICovCi0gICAgICAgICAgICAgICAgLyogZGVnZW5lcmF0ZSBvdXRsaW5lcyB0aGF0IG1vdmUgemlnLXphZyBhbG9uZyB0aGUgbWFpbiAgICAqLwotICAgICAgICAgICAgICAgIC8qIGF4aXMgd2l0aG91dCBjaGFuZ2luZyB0aGUgY29vcmRpbmF0ZSB2YWx1ZSBvZiB0aGUgb3RoZXIgKi8KLSAgICAgICAgICAgICAgICAvKiBheGlzLCBhbmQgd2hlcmUgdGhlIHNlZ21lbnRzIGhhdmUganVzdCBiZWVuIG1lcmdlZCk6ICAgICovCi0gICAgICAgICAgICAgICAgLyogdW5pZnkgc2VnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgLyogdXBkYXRlIGNvbnN0cmFpbnRzICovCi0KLSAgICAgICAgICAgICAgICBpZiAoIHByZXZfbWluX3BvcyA8IG1pbl9wb3MgKQotICAgICAgICAgICAgICAgICAgbWluX3BvcyA9IHByZXZfbWluX3BvczsKLSAgICAgICAgICAgICAgICBpZiAoIHByZXZfbWF4X3BvcyA+IG1heF9wb3MgKQotICAgICAgICAgICAgICAgICAgbWF4X3BvcyA9IHByZXZfbWF4X3BvczsKLQotICAgICAgICAgICAgICAgIGlmICggcHJldl9taW5fY29vcmQgPCBtaW5fY29vcmQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG1pbl9jb29yZCA9IHByZXZfbWluX2Nvb3JkOwotICAgICAgICAgICAgICAgICAgbWluX2ZsYWdzID0gcHJldl9taW5fZmxhZ3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggcHJldl9tYXhfY29vcmQgPiBtYXhfY29vcmQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG1heF9jb29yZCA9IHByZXZfbWF4X2Nvb3JkOwotICAgICAgICAgICAgICAgICAgbWF4X2ZsYWdzID0gcHJldl9tYXhfZmxhZ3M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCBwcmV2X21pbl9vbl9jb29yZCA8IG1pbl9vbl9jb29yZCApCi0gICAgICAgICAgICAgICAgICBtaW5fb25fY29vcmQgPSBwcmV2X21pbl9vbl9jb29yZDsKLSAgICAgICAgICAgICAgICBpZiAoIHByZXZfbWF4X29uX2Nvb3JkID4gbWF4X29uX2Nvb3JkICkKLSAgICAgICAgICAgICAgICAgIG1heF9vbl9jb29yZCA9IHByZXZfbWF4X29uX2Nvb3JkOwotCi0gICAgICAgICAgICAgICAgcHJldl9zZWdtZW50LT5sYXN0ID0gcG9pbnQ7Ci0gICAgICAgICAgICAgICAgcHJldl9zZWdtZW50LT5wb3MgID0gKEZUX1Nob3J0KSggKCBtaW5fcG9zICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wb3MgKSA+PiAxICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoICggbWluX2ZsYWdzIHwgbWF4X2ZsYWdzICkgJiBBRl9GTEFHX0NPTlRST0wgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgKCBtYXhfb25fY29vcmQgLSBtaW5fb25fY29vcmQgKSA8IGZsYXRfdGhyZXNob2xkICkKLSAgICAgICAgICAgICAgICAgIHByZXZfc2VnbWVudC0+ZmxhZ3MgfD0gQUZfRURHRV9ST1VORDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBwcmV2X3NlZ21lbnQtPmZsYWdzICY9IH5BRl9FREdFX1JPVU5EOwotCi0gICAgICAgICAgICAgICAgcHJldl9zZWdtZW50LT5taW5fY29vcmQgPSAoRlRfU2hvcnQpbWluX2Nvb3JkOwotICAgICAgICAgICAgICAgIHByZXZfc2VnbWVudC0+bWF4X2Nvb3JkID0gKEZUX1Nob3J0KW1heF9jb29yZDsKLSAgICAgICAgICAgICAgICBwcmV2X3NlZ21lbnQtPmhlaWdodCAgICA9IHByZXZfc2VnbWVudC0+bWF4X2Nvb3JkIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfc2VnbWVudC0+bWluX2Nvb3JkOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHdlIGhhdmUgZGlmZmVyZW50IGRpcmVjdGlvbnM7IHVzZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgKi8KLSAgICAgICAgICAgICAgICAvKiBsb25nZXIgc2VnbWVudCBhbmQgZGlzY2FyZCB0aGUgb3RoZXIgb25lICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpZiAoIEZUX0FCUyggcHJldl9tYXhfY29vcmQgLSBwcmV2X21pbl9jb29yZCApID4KLSAgICAgICAgICAgICAgICAgICAgIEZUX0FCUyggbWF4X2Nvb3JkIC0gbWluX2Nvb3JkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIGRpc2NhcmQgY3VycmVudCBzZWdtZW50ICovCi0KLSAgICAgICAgICAgICAgICAgIGlmICggbWluX3BvcyA8IHByZXZfbWluX3BvcyApCi0gICAgICAgICAgICAgICAgICAgIHByZXZfbWluX3BvcyA9IG1pbl9wb3M7Ci0gICAgICAgICAgICAgICAgICBpZiAoIG1heF9wb3MgPiBwcmV2X21heF9wb3MgKQotICAgICAgICAgICAgICAgICAgICBwcmV2X21heF9wb3MgPSBtYXhfcG9zOwotCi0gICAgICAgICAgICAgICAgICBwcmV2X3NlZ21lbnQtPmxhc3QgPSBwb2ludDsKLSAgICAgICAgICAgICAgICAgIHByZXZfc2VnbWVudC0+cG9zICA9IChGVF9TaG9ydCkoICggcHJldl9taW5fcG9zICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9tYXhfcG9zICkgPj4gMSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCBwcmV2aW91cyBzZWdtZW50ICovCi0KLSAgICAgICAgICAgICAgICAgIGlmICggcHJldl9taW5fcG9zIDwgbWluX3BvcyApCi0gICAgICAgICAgICAgICAgICAgIG1pbl9wb3MgPSBwcmV2X21pbl9wb3M7Ci0gICAgICAgICAgICAgICAgICBpZiAoIHByZXZfbWF4X3BvcyA+IG1heF9wb3MgKQotICAgICAgICAgICAgICAgICAgICBtYXhfcG9zID0gcHJldl9tYXhfcG9zOwotCi0gICAgICAgICAgICAgICAgICBzZWdtZW50LT5sYXN0ID0gcG9pbnQ7Ci0gICAgICAgICAgICAgICAgICBzZWdtZW50LT5wb3MgID0gKEZUX1Nob3J0KSggKCBtaW5fcG9zICsgbWF4X3BvcyApID4+IDEgKTsKLQotICAgICAgICAgICAgICAgICAgaWYgKCAoIG1pbl9mbGFncyB8IG1heF9mbGFncyApICYgQUZfRkxBR19DT05UUk9MICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKCBtYXhfb25fY29vcmQgLSBtaW5fb25fY29vcmQgKSA8IGZsYXRfdGhyZXNob2xkICkKLSAgICAgICAgICAgICAgICAgICAgc2VnbWVudC0+ZmxhZ3MgfD0gQUZfRURHRV9ST1VORDsKLQotICAgICAgICAgICAgICAgICAgc2VnbWVudC0+bWluX2Nvb3JkID0gKEZUX1Nob3J0KW1pbl9jb29yZDsKLSAgICAgICAgICAgICAgICAgIHNlZ21lbnQtPm1heF9jb29yZCA9IChGVF9TaG9ydCltYXhfY29vcmQ7Ci0gICAgICAgICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgICAgPSBzZWdtZW50LT5tYXhfY29vcmQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC0+bWluX2Nvb3JkOwotCi0gICAgICAgICAgICAgICAgICAqcHJldl9zZWdtZW50ID0gKnNlZ21lbnQ7Ci0KLSAgICAgICAgICAgICAgICAgIHByZXZfbWluX3BvcyAgICAgID0gbWluX3BvczsKLSAgICAgICAgICAgICAgICAgIHByZXZfbWF4X3BvcyAgICAgID0gbWF4X3BvczsKLSAgICAgICAgICAgICAgICAgIHByZXZfbWluX2Nvb3JkICAgID0gbWluX2Nvb3JkOwotICAgICAgICAgICAgICAgICAgcHJldl9tYXhfY29vcmQgICAgPSBtYXhfY29vcmQ7Ci0gICAgICAgICAgICAgICAgICBwcmV2X21pbl9mbGFncyAgICA9IG1pbl9mbGFnczsKLSAgICAgICAgICAgICAgICAgIHByZXZfbWF4X2ZsYWdzICAgID0gbWF4X2ZsYWdzOwotICAgICAgICAgICAgICAgICAgcHJldl9taW5fb25fY29vcmQgPSBtaW5fb25fY29vcmQ7Ci0gICAgICAgICAgICAgICAgICBwcmV2X21heF9vbl9jb29yZCA9IG1heF9vbl9jb29yZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBheGlzLT5udW1fc2VnbWVudHMtLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb25fZWRnZSA9IDA7Ci0gICAgICAgICAgICBzZWdtZW50ID0gTlVMTDsKLQotICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm93IGV4aXQgaWYgd2UgYXJlIGF0IHRoZSBzdGFydC9lbmQgcG9pbnQgKi8KLSAgICAgICAgaWYgKCBwb2ludCA9PSBsYXN0ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggcGFzc2VkICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIHBhc3NlZCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiB3ZSBhcmUgbm90IG9uIGFuIGVkZ2UsIGNoZWNrIHdoZXRoZXIgdGhlIG1ham9yIGRpcmVjdGlvbiAqLwotICAgICAgICAvKiBjb2luY2lkZXMgd2l0aCB0aGUgY3VycmVudCBwb2ludCdzIGBvdXQnIGRpcmVjdGlvbiwgb3IgICAgICAqLwotICAgICAgICAvKiB3aGV0aGVyIHdlIGhhdmUgYSBzaW5nbGUtcG9pbnQgY29udG91ciAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoICFvbl9lZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBGVF9BQlMoIHBvaW50LT5vdXRfZGlyICkgPT0gbWFqb3JfZGlyIHx8Ci0gICAgICAgICAgICAgICBwb2ludCA9PSBwb2ludC0+cHJldiAgICAgICAgICAgICAgICAgICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXcgc2VnbWVudCEgKi8KLSAgICAgICAgICBzZWdtZW50X2RpciA9IChBRl9EaXJlY3Rpb24pcG9pbnQtPm91dF9kaXI7Ci0KLSAgICAgICAgICBlcnJvciA9IGFmX2F4aXNfaGludHNfbmV3X3NlZ21lbnQoIGF4aXMsIG1lbW9yeSwgJnNlZ21lbnQgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIC8qIGNsZWFyIGFsbCBzZWdtZW50IGZpZWxkcyAqLwotICAgICAgICAgIHNlZ21lbnRbMF0gPSBzZWcwOwotCi0gICAgICAgICAgc2VnbWVudC0+ZGlyICAgPSAoRlRfQ2hhcilzZWdtZW50X2RpcjsKLSAgICAgICAgICBzZWdtZW50LT5maXJzdCA9IHBvaW50OwotICAgICAgICAgIHNlZ21lbnQtPmxhc3QgID0gcG9pbnQ7Ci0KLSAgICAgICAgICAvKiBgYWZfYXhpc19oaW50c19uZXdfc2VnbWVudCcgcmVhbGxvY2F0ZXMgbWVtb3J5LCAgICAqLwotICAgICAgICAgIC8qIHRodXMgd2UgaGF2ZSB0byByZWZyZXNoIHRoZSBgcHJldl9zZWdtZW50JyBwb2ludGVyICovCi0gICAgICAgICAgaWYgKCBwcmV2X3NlZ21lbnQgKQotICAgICAgICAgICAgcHJldl9zZWdtZW50ID0gc2VnbWVudCAtIDE7Ci0KLSAgICAgICAgICBtaW5fcG9zICAgPSBtYXhfcG9zICAgPSBwb2ludC0+dTsKLSAgICAgICAgICBtaW5fY29vcmQgPSBtYXhfY29vcmQgPSBwb2ludC0+djsKLSAgICAgICAgICBtaW5fZmxhZ3MgPSBtYXhfZmxhZ3MgPSBwb2ludC0+ZmxhZ3M7Ci0KLSAgICAgICAgICBpZiAoIHBvaW50LT5mbGFncyAmIEFGX0ZMQUdfQ09OVFJPTCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluX29uX2Nvb3JkID0gIDMyMDAwOwotICAgICAgICAgICAgbWF4X29uX2Nvb3JkID0gLTMyMDAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBtaW5fb25fY29vcmQgPSBtYXhfb25fY29vcmQgPSBwb2ludC0+djsKLQotICAgICAgICAgIG9uX2VkZ2UgPSAxOwotCi0gICAgICAgICAgaWYgKCBwb2ludCA9PSBwb2ludC0+cHJldiApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogd2UgaGF2ZSBhIG9uZS1wb2ludCBzZWdtZW50OiB0aGlzIGlzIGEgb25lLXBvaW50ICovCi0gICAgICAgICAgICAvKiBjb250b3VyIHdpdGggYGluJyBhbmQgYG91dCcgZGlyZWN0aW9uIHNldCB0byAgICAgKi8KLSAgICAgICAgICAgIC8qIEFGX0RJUl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc2VnbWVudC0+cG9zID0gKEZUX1Nob3J0KW1pbl9wb3M7Ci0KLSAgICAgICAgICAgIGlmIChwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0wpCi0gICAgICAgICAgICAgIHNlZ21lbnQtPmZsYWdzIHw9IEFGX0VER0VfUk9VTkQ7Ci0KLSAgICAgICAgICAgIHNlZ21lbnQtPm1pbl9jb29yZCA9IChGVF9TaG9ydClwb2ludC0+djsKLSAgICAgICAgICAgIHNlZ21lbnQtPm1heF9jb29yZCA9IChGVF9TaG9ydClwb2ludC0+djsKLSAgICAgICAgICAgIHNlZ21lbnQtPmhlaWdodCA9IDA7Ci0KLSAgICAgICAgICAgIG9uX2VkZ2UgPSAwOwotICAgICAgICAgICAgc2VnbWVudCA9IE5VTEw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLSAgICAgIH0KLQotICAgIH0gLyogY29udG91cnMgKi8KLQotCi0gICAgLyogbm93IHNsaWdodGx5IGluY3JlYXNlIHRoZSBoZWlnaHQgb2Ygc2VnbWVudHMgaWYgdGhpcyBtYWtlcyAqLwotICAgIC8qIHNlbnNlIC0tIHRoaXMgaXMgdXNlZCB0byBiZXR0ZXIgZGV0ZWN0IGFuZCBpZ25vcmUgc2VyaWZzICAgKi8KLSAgICB7Ci0gICAgICBBRl9TZWdtZW50ICBzZWdtZW50cyAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICAgIEFGX1NlZ21lbnQgIHNlZ21lbnRzX2VuZCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotCi0KLSAgICAgIGZvciAoIHNlZ21lbnQgPSBzZWdtZW50czsgc2VnbWVudCA8IHNlZ21lbnRzX2VuZDsgc2VnbWVudCsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfUG9pbnQgIGZpcnN0ICAgPSBzZWdtZW50LT5maXJzdDsKLSAgICAgICAgQUZfUG9pbnQgIGxhc3QgICAgPSBzZWdtZW50LT5sYXN0OwotICAgICAgICBGVF9Qb3MgICAgZmlyc3RfdiA9IGZpcnN0LT52OwotICAgICAgICBGVF9Qb3MgICAgbGFzdF92ICA9IGxhc3QtPnY7Ci0KLQotICAgICAgICBpZiAoIGZpcnN0X3YgPCBsYXN0X3YgKQotICAgICAgICB7Ci0gICAgICAgICAgQUZfUG9pbnQgIHA7Ci0KLQotICAgICAgICAgIHAgPSBmaXJzdC0+cHJldjsKLSAgICAgICAgICBpZiAoIHAtPnYgPCBmaXJzdF92ICkKLSAgICAgICAgICAgIHNlZ21lbnQtPmhlaWdodCA9IChGVF9TaG9ydCkoIHNlZ21lbnQtPmhlaWdodCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggZmlyc3RfdiAtIHAtPnYgKSA+PiAxICkgKTsKLQotICAgICAgICAgIHAgPSBsYXN0LT5uZXh0OwotICAgICAgICAgIGlmICggcC0+diA+IGxhc3RfdiApCi0gICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBzZWdtZW50LT5oZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHAtPnYgLSBsYXN0X3YgKSA+PiAxICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9Qb2ludCAgcDsKLQotCi0gICAgICAgICAgcCA9IGZpcnN0LT5wcmV2OwotICAgICAgICAgIGlmICggcC0+diA+IGZpcnN0X3YgKQotICAgICAgICAgICAgc2VnbWVudC0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggc2VnbWVudC0+aGVpZ2h0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCBwLT52IC0gZmlyc3RfdiApID4+IDEgKSApOwotCi0gICAgICAgICAgcCA9IGxhc3QtPm5leHQ7Ci0gICAgICAgICAgaWYgKCBwLT52IDwgbGFzdF92ICkKLSAgICAgICAgICAgIHNlZ21lbnQtPmhlaWdodCA9IChGVF9TaG9ydCkoIHNlZ21lbnQtPmhlaWdodCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggbGFzdF92IC0gcC0+diApID4+IDEgKSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBMaW5rIHNlZ21lbnRzIHRvIGZvcm0gc3RlbXMgYW5kIHNlcmlmcy4gIElmIGB3aWR0aF9jb3VudCcgYW5kICAgICAgKi8KLSAgLyogYHdpZHRocycgYXJlIG5vbi16ZXJvLCB1c2UgdGhlbSB0byBmaW5lLXR1bmUgdGhlIHNjb3JpbmcgZnVuY3Rpb24uICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW5faGludHNfbGlua19zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIHdpZHRoX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9XaWR0aFJlYyogICB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzICAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRfbGltaXQgPSBzZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50czsKLSAgICBGVF9Qb3MgICAgICAgIGxlbl90aHJlc2hvbGQsIGxlbl9zY29yZSwgZGlzdF9zY29yZSwgbWF4X3dpZHRoOwotICAgIEFGX1NlZ21lbnQgICAgc2VnMSwgc2VnMjsKLQotCi0gICAgaWYgKCB3aWR0aF9jb3VudCApCi0gICAgICBtYXhfd2lkdGggPSB3aWR0aHNbd2lkdGhfY291bnQgLSAxXS5vcmc7Ci0gICAgZWxzZQotICAgICAgbWF4X3dpZHRoID0gMDsKLQotICAgIC8qIGEgaGV1cmlzdGljIHZhbHVlIHRvIHNldCB1cCBhIG1pbmltdW0gdmFsdWUgZm9yIG92ZXJsYXBwaW5nICovCi0gICAgbGVuX3RocmVzaG9sZCA9IEFGX0xBVElOX0NPTlNUQU5UKCBoaW50cy0+bWV0cmljcywgOCApOwotICAgIGlmICggbGVuX3RocmVzaG9sZCA9PSAwICkKLSAgICAgIGxlbl90aHJlc2hvbGQgPSAxOwotCi0gICAgLyogYSBoZXVyaXN0aWMgdmFsdWUgdG8gd2VpZ2h0IGxlbmd0aHMgKi8KLSAgICBsZW5fc2NvcmUgPSBBRl9MQVRJTl9DT05TVEFOVCggaGludHMtPm1ldHJpY3MsIDYwMDAgKTsKLQotICAgIC8qIGEgaGV1cmlzdGljIHZhbHVlIHRvIHdlaWdodCBkaXN0YW5jZXMgKG5vIGNhbGwgdG8gICAgKi8KLSAgICAvKiBBRl9MQVRJTl9DT05TVEFOVCBuZWVkZWQsIHNpbmNlIHdlIHdvcmsgb24gbXVsdGlwbGVzICovCi0gICAgLyogb2YgdGhlIHN0ZW0gd2lkdGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGRpc3Rfc2NvcmUgPSAzMDAwOwotCi0gICAgLyogbm93IGNvbXBhcmUgZWFjaCBzZWdtZW50IHRvIHRoZSBvdGhlcnMgKi8KLSAgICBmb3IgKCBzZWcxID0gc2VnbWVudHM7IHNlZzEgPCBzZWdtZW50X2xpbWl0OyBzZWcxKysgKQotICAgIHsKLSAgICAgIGlmICggc2VnMS0+ZGlyICE9IGF4aXMtPm1ham9yX2RpciApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBzZWFyY2ggZm9yIHN0ZW1zIGhhdmluZyBvcHBvc2l0ZSBkaXJlY3Rpb25zLCAqLwotICAgICAgLyogd2l0aCBzZWcxIHRvIHRoZSBgbGVmdCcgb2Ygc2VnMiAgICAgICAgICAgICAgKi8KLSAgICAgIGZvciAoIHNlZzIgPSBzZWdtZW50czsgc2VnMiA8IHNlZ21lbnRfbGltaXQ7IHNlZzIrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgcG9zMSA9IHNlZzEtPnBvczsKLSAgICAgICAgRlRfUG9zICBwb3MyID0gc2VnMi0+cG9zOwotCi0KLSAgICAgICAgaWYgKCBzZWcxLT5kaXIgKyBzZWcyLT5kaXIgPT0gMCAmJiBwb3MyID4gcG9zMSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBjb21wdXRlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBzZWdtZW50cyAqLwotICAgICAgICAgIEZUX1BvcyAgbWluID0gc2VnMS0+bWluX2Nvb3JkOwotICAgICAgICAgIEZUX1BvcyAgbWF4ID0gc2VnMS0+bWF4X2Nvb3JkOwotICAgICAgICAgIEZUX1BvcyAgbGVuOwotCi0KLSAgICAgICAgICBpZiAoIG1pbiA8IHNlZzItPm1pbl9jb29yZCApCi0gICAgICAgICAgICBtaW4gPSBzZWcyLT5taW5fY29vcmQ7Ci0KLSAgICAgICAgICBpZiAoIG1heCA+IHNlZzItPm1heF9jb29yZCApCi0gICAgICAgICAgICBtYXggPSBzZWcyLT5tYXhfY29vcmQ7Ci0KLSAgICAgICAgICAvKiBjb21wdXRlIG1heGltdW0gY29vcmRpbmF0ZSBkaWZmZXJlbmNlIG9mIHRoZSB0d28gc2VnbWVudHMgKi8KLSAgICAgICAgICAvKiAodGhpcyBpcywgaG93IG11Y2ggdGhleSBvdmVybGFwKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBsZW4gPSBtYXggLSBtaW47Ci0gICAgICAgICAgaWYgKCBsZW4gPj0gbGVuX3RocmVzaG9sZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBUaGUgc2NvcmUgaXMgdGhlIHN1bSBvZiB0d28gZGVtZXJpdHMgaW5kaWNhdGluZyB0aGUKLSAgICAgICAgICAgICAqICBgYmFkbmVzcycgb2YgYSBmaXQsIG1lYXN1cmVkIGFsb25nIHRoZSBzZWdtZW50cycgbWFpbiBheGlzCi0gICAgICAgICAgICAgKiAgYW5kIG9ydGhvZ29uYWwgdG8gaXQsIHJlc3BlY3RpdmVseS4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAgbyBUaGUgbGVzcyBvdmVybGFwcGluZyBhbG9uZyB0aGUgbWFpbiBheGlzLCB0aGUgd29yc2UgaXQKLSAgICAgICAgICAgICAqICAgIGlzLCBjYXVzaW5nIGEgbGFyZ2VyIGRlbWVyaXQuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogIG8gVGhlIG5lYXJlciB0aGUgb3J0aG9nb25hbCBkaXN0YW5jZSB0byBhIHN0ZW0gd2lkdGgsIHRoZQotICAgICAgICAgICAgICogICAgYmV0dGVyIGl0IGlzLCBjYXVzaW5nIGEgc21hbGxlciBkZW1lcml0LiAgRm9yIHNpbXBsaWNpdHksCi0gICAgICAgICAgICAgKiAgICBob3dldmVyLCB3ZSBvbmx5IGluY3JlYXNlIHRoZSBkZW1lcml0IGZvciB2YWx1ZXMgdGhhdAotICAgICAgICAgICAgICogICAgZXhjZWVkIHRoZSBsYXJnZXN0IHN0ZW0gd2lkdGguCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgRlRfUG9zICBkaXN0ID0gcG9zMiAtIHBvczE7Ci0KLSAgICAgICAgICAgIEZUX1BvcyAgZGlzdF9kZW1lcml0LCBzY29yZTsKLQotCi0gICAgICAgICAgICBpZiAoIG1heF93aWR0aCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlbWVyaXRzIGFyZSBiYXNlZCBvbiBtdWx0aXBsZXMgb2YgYG1heF93aWR0aCc7ICovCi0gICAgICAgICAgICAgIC8qIHdlIHNjYWxlIGJ5IDEwMjQgZm9yIGdldHRpbmcgbW9yZSBwcmVjaXNpb24gICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIEZUX1BvcyAgZGVsdGEgPSAoIGRpc3QgPDwgMTAgKSAvIG1heF93aWR0aCAtICggMSA8PCAxMCApOwotCi0KLSAgICAgICAgICAgICAgaWYgKCBkZWx0YSA+IDEwMDAwICkKLSAgICAgICAgICAgICAgICBkaXN0X2RlbWVyaXQgPSAzMjAwMDsKLSAgICAgICAgICAgICAgZWxzZSBpZiAoIGRlbHRhID4gMCApCi0gICAgICAgICAgICAgICAgZGlzdF9kZW1lcml0ID0gZGVsdGEgKiBkZWx0YSAvIGRpc3Rfc2NvcmU7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkaXN0X2RlbWVyaXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBkaXN0X2RlbWVyaXQgPSBkaXN0OyAvKiBkZWZhdWx0IGlmIG5vIHdpZHRocyBhdmFpbGFibGUgKi8KLQotICAgICAgICAgICAgc2NvcmUgPSBkaXN0X2RlbWVyaXQgKyBsZW5fc2NvcmUgLyBsZW47Ci0KLSAgICAgICAgICAgIC8qIGFuZCB3ZSBzZWFyY2ggZm9yIHRoZSBzbWFsbGVzdCBzY29yZSAqLwotICAgICAgICAgICAgaWYgKCBzY29yZSA8IHNlZzEtPnNjb3JlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VnMS0+c2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgc2VnMS0+bGluayAgPSBzZWcyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHNjb3JlIDwgc2VnMi0+c2NvcmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWcyLT5zY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICBzZWcyLT5saW5rICA9IHNlZzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogbm93IGNvbXB1dGUgdGhlIGBzZXJpZicgc2VnbWVudHMsIGNmLiBleHBsYW5hdGlvbnMgaW4gYGFmaGludHMuaCcgKi8KLSAgICBmb3IgKCBzZWcxID0gc2VnbWVudHM7IHNlZzEgPCBzZWdtZW50X2xpbWl0OyBzZWcxKysgKQotICAgIHsKLSAgICAgIHNlZzIgPSBzZWcxLT5saW5rOwotCi0gICAgICBpZiAoIHNlZzIgKQotICAgICAgewotICAgICAgICBpZiAoIHNlZzItPmxpbmsgIT0gc2VnMSApCi0gICAgICAgIHsKLSAgICAgICAgICBzZWcxLT5saW5rICA9IDA7Ci0gICAgICAgICAgc2VnMS0+c2VyaWYgPSBzZWcyLT5saW5rOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBMaW5rIHNlZ21lbnRzIHRvIGVkZ2VzLCB1c2luZyBmZWF0dXJlIGFuYWx5c2lzIGZvciBzZWxlY3Rpb24uICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfZWRnZXMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IGhpbnRzLT5tZW1vcnk7Ci0gICAgQUZfTGF0aW5BeGlzICBsYXhpcyAgPSAmKChBRl9MYXRpbk1ldHJpY3MpaGludHMtPm1ldHJpY3MpLT5heGlzW2RpbV07Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIEFGX0ZhY2VHbG9iYWxzICBnbG9iYWxzID0gaGludHMtPm1ldHJpY3MtPmdsb2JhbHM7Ci0jZW5kaWYKLQotICAgIEFGX1N0eWxlQ2xhc3MgICBzdHlsZV9jbGFzcyAgPSBoaW50cy0+bWV0cmljcy0+c3R5bGVfY2xhc3M7Ci0gICAgQUZfU2NyaXB0Q2xhc3MgIHNjcmlwdF9jbGFzcyA9IEFGX1NDUklQVF9DTEFTU0VTX0dFVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV9jbGFzcy0+c2NyaXB0XTsKLQotICAgIEZUX0Jvb2wgIHRvcF90b19ib3R0b21faGludGluZyA9IDA7Ci0KLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzICAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRfbGltaXQgPSBzZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIHNlZzsKLQotI2lmIDAKLSAgICBBRl9EaXJlY3Rpb24gIHVwX2RpcjsKLSNlbmRpZgotICAgIEZUX0ZpeGVkICAgICAgc2NhbGU7Ci0gICAgRlRfUG9zICAgICAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZDsKLSAgICBGVF9Qb3MgICAgICAgIHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZDsKLSAgICBGVF9Qb3MgICAgICAgIHNlZ21lbnRfd2lkdGhfdGhyZXNob2xkOwotCi0KLSAgICBheGlzLT5udW1fZWRnZXMgPSAwOwotCi0gICAgc2NhbGUgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApID8gaGludHMtPnhfc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoaW50cy0+eV9zY2FsZTsKLQotI2lmIDAKLSAgICB1cF9kaXIgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApID8gQUZfRElSX1VQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFGX0RJUl9SSUdIVDsKLSNlbmRpZgotCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKQotICAgICAgdG9wX3RvX2JvdHRvbV9oaW50aW5nID0gc2NyaXB0X2NsYXNzLT50b3BfdG9fYm90dG9tX2hpbnRpbmc7Ci0KLSAgICAvKgotICAgICAqICBXZSBpZ25vcmUgYWxsIHNlZ21lbnRzIHRoYXQgYXJlIGxlc3MgdGhhbiAxIHBpeGVsIGluIGxlbmd0aAotICAgICAqICB0byBhdm9pZCBtYW55IHByb2JsZW1zIHdpdGggc2VyaWYgZm9udHMuICBXZSBjb21wdXRlIHRoZQotICAgICAqICBjb3JyZXNwb25kaW5nIHRocmVzaG9sZCBpbiBmb250IHVuaXRzLgotICAgICAqLwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICAgIHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZCA9IEZUX0RpdkZpeCggNjQsIGhpbnRzLT55X3NjYWxlICk7Ci0gICAgZWxzZQotICAgICAgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkID0gMDsKLQotICAgIC8qCi0gICAgICogIFNpbWlsYXJseSwgd2UgaWdub3JlIHNlZ21lbnRzIHRoYXQgaGF2ZSBhIHdpZHRoIGRlbHRhCi0gICAgICogIGxhcmdlciB0aGFuIDAuNXB4IChpLmUuLCBhIHdpZHRoIGxhcmdlciB0aGFuIDFweCkuCi0gICAgICovCi0gICAgc2VnbWVudF93aWR0aF90aHJlc2hvbGQgPSBGVF9EaXZGaXgoIDMyLCBzY2FsZSApOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIGJlZ2luIGJ5IGdlbmVyYXRpbmcgYSBzb3J0ZWQgdGFibGUgb2YgZWRnZXMgZm9yIHRoZSBjdXJyZW50ICAgICovCi0gICAgLyogZGlyZWN0aW9uLiAgVG8gZG8gc28sIHdlIHNpbXBseSBzY2FuIGVhY2ggc2VnbWVudCBhbmQgdHJ5IHRvIGZpbmQgKi8KLSAgICAvKiBhbiBlZGdlIGluIG91ciB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0cyBwb3NpdGlvbi4gICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSWYgbm8gZWRnZSBpcyBmb3VuZCwgd2UgY3JlYXRlIGFuZCBpbnNlcnQgYSBuZXcgZWRnZSBpbiB0aGUgICAgICAgKi8KLSAgICAvKiBzb3J0ZWQgdGFibGUuICBPdGhlcndpc2UsIHdlIHNpbXBseSBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIGVkZ2UncyAqLwotICAgIC8qIGxpc3Qgd2hpY2ggZ2V0cyBwcm9jZXNzZWQgaW4gdGhlIHNlY29uZCBzdGVwIHRvIGNvbXB1dGUgdGhlICAgICAgICovCi0gICAgLyogZWRnZSdzIHByb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE5vdGUgdGhhdCB0aGUgdGFibGUgb2YgZWRnZXMgaXMgc29ydGVkIGFsb25nIHRoZSBzZWdtZW50L2VkZ2UgICAgICovCi0gICAgLyogcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBhc3N1cmUgdGhhdCBlZGdlIGRpc3RhbmNlIHRocmVzaG9sZCBpcyBhdCBtb3N0IDAuMjVweCAqLwotICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gRlRfTXVsRml4KCBsYXhpcy0+ZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlICk7Ci0gICAgaWYgKCBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA+IDY0IC8gNCApCi0gICAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA9IDY0IC8gNDsKLQotICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gRlRfRGl2Rml4KCBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgKTsKLQotICAgIGZvciAoIHNlZyA9IHNlZ21lbnRzOyBzZWcgPCBzZWdtZW50X2xpbWl0OyBzZWcrKyApCi0gICAgewotICAgICAgQUZfRWRnZSAgZm91bmQgPSBOVUxMOwotICAgICAgRlRfSW50ICAgZWU7Ci0KLQotICAgICAgLyogaWdub3JlIHRvbyBzaG9ydCBzZWdtZW50cywgdG9vIHdpZGUgb25lcywgYW5kLCBpbiB0aGlzIGxvb3AsICovCi0gICAgICAvKiBvbmUtcG9pbnQgc2VnbWVudHMgd2l0aG91dCBhIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggc2VnLT5oZWlnaHQgPCBzZWdtZW50X2xlbmd0aF90aHJlc2hvbGQgfHwKLSAgICAgICAgICAgc2VnLT5kZWx0YSA+IHNlZ21lbnRfd2lkdGhfdGhyZXNob2xkICAgfHwKLSAgICAgICAgICAgc2VnLT5kaXIgPT0gQUZfRElSX05PTkUgICAgICAgICAgICAgICAgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyogQSBzcGVjaWFsIGNhc2UgZm9yIHNlcmlmIGVkZ2VzOiBJZiB0aGV5IGFyZSBzbWFsbGVyIHRoYW4gKi8KLSAgICAgIC8qIDEuNSBwaXhlbHMgd2UgaWdub3JlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHNlZy0+c2VyaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgMiAqIHNlZy0+aGVpZ2h0IDwgMyAqIHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBsb29rIGZvciBhbiBlZGdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlZ21lbnQgKi8KLSAgICAgIGZvciAoIGVlID0gMDsgZWUgPCBheGlzLT5udW1fZWRnZXM7IGVlKysgKQotICAgICAgewotICAgICAgICBBRl9FZGdlICBlZGdlID0gYXhpcy0+ZWRnZXMgKyBlZTsKLSAgICAgICAgRlRfUG9zICAgZGlzdDsKLQotCi0gICAgICAgIGRpc3QgPSBzZWctPnBvcyAtIGVkZ2UtPmZwb3M7Ci0gICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICBpZiAoIGRpc3QgPCBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCAmJiBlZGdlLT5kaXIgPT0gc2VnLT5kaXIgKQotICAgICAgICB7Ci0gICAgICAgICAgZm91bmQgPSBlZGdlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWZvdW5kICkKLSAgICAgIHsKLSAgICAgICAgQUZfRWRnZSAgZWRnZTsKLQotCi0gICAgICAgIC8qIGluc2VydCBhIG5ldyBlZGdlIGluIHRoZSBsaXN0IGFuZCAqLwotICAgICAgICAvKiBzb3J0IGFjY29yZGluZyB0byB0aGUgcG9zaXRpb24gICAgKi8KLSAgICAgICAgZXJyb3IgPSBhZl9heGlzX2hpbnRzX25ld19lZGdlKCBheGlzLCBzZWctPnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfRGlyZWN0aW9uKXNlZy0+ZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcF90b19ib3R0b21faGludGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksICZlZGdlICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIG5ldyBlZGdlJ3MgbGlzdCAqLwotICAgICAgICBGVF9aRVJPKCBlZGdlICk7Ci0KLSAgICAgICAgZWRnZS0+Zmlyc3QgICAgPSBzZWc7Ci0gICAgICAgIGVkZ2UtPmxhc3QgICAgID0gc2VnOwotICAgICAgICBlZGdlLT5kaXIgICAgICA9IHNlZy0+ZGlyOwotICAgICAgICBlZGdlLT5mcG9zICAgICA9IHNlZy0+cG9zOwotICAgICAgICBlZGdlLT5vcG9zICAgICA9IEZUX011bEZpeCggc2VnLT5wb3MsIHNjYWxlICk7Ci0gICAgICAgIGVkZ2UtPnBvcyAgICAgID0gZWRnZS0+b3BvczsKLSAgICAgICAgc2VnLT5lZGdlX25leHQgPSBzZWc7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIGFuIGVkZ2Ugd2FzIGZvdW5kLCBzaW1wbHkgYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBlZGdlJ3MgKi8KLSAgICAgICAgLyogbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBzZWctPmVkZ2VfbmV4dCAgICAgICAgID0gZm91bmQtPmZpcnN0OwotICAgICAgICBmb3VuZC0+bGFzdC0+ZWRnZV9uZXh0ID0gc2VnOwotICAgICAgICBmb3VuZC0+bGFzdCAgICAgICAgICAgID0gc2VnOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHdlIGxvb3AgYWdhaW4gb3ZlciBhbGwgc2VnbWVudHMgdG8gY2F0Y2ggb25lLXBvaW50IHNlZ21lbnRzICAgKi8KLSAgICAvKiB3aXRob3V0IGEgZGlyZWN0aW9uOiBpZiBwb3NzaWJsZSwgbGluayB0aGVtIHRvIGV4aXN0aW5nIGVkZ2VzICovCi0gICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICB7Ci0gICAgICBBRl9FZGdlICBmb3VuZCA9IE5VTEw7Ci0gICAgICBGVF9JbnQgICBlZTsKLQotCi0gICAgICBpZiAoIHNlZy0+ZGlyICE9IEFGX0RJUl9OT05FICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIGxvb2sgZm9yIGFuIGVkZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc2VnbWVudCAqLwotICAgICAgZm9yICggZWUgPSAwOyBlZSA8IGF4aXMtPm51bV9lZGdlczsgZWUrKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0VkZ2UgIGVkZ2UgPSBheGlzLT5lZGdlcyArIGVlOwotICAgICAgICBGVF9Qb3MgICBkaXN0OwotCi0KLSAgICAgICAgZGlzdCA9IHNlZy0+cG9zIC0gZWRnZS0+ZnBvczsKLSAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgIGlmICggZGlzdCA8IGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkICkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kID0gZWRnZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBvbmUtcG9pbnQgc2VnbWVudHMgd2l0aG91dCBhIG1hdGNoIGFyZSBpZ25vcmVkICovCi0gICAgICBpZiAoIGZvdW5kICkKLSAgICAgIHsKLSAgICAgICAgc2VnLT5lZGdlX25leHQgICAgICAgICA9IGZvdW5kLT5maXJzdDsKLSAgICAgICAgZm91bmQtPmxhc3QtPmVkZ2VfbmV4dCA9IHNlZzsKLSAgICAgICAgZm91bmQtPmxhc3QgICAgICAgICAgICA9IHNlZzsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBHb29kLCB3ZSBub3cgY29tcHV0ZSBlYWNoIGVkZ2UncyBwcm9wZXJ0aWVzIGFjY29yZGluZyB0byB0aGUgICAqLwotICAgIC8qIHNlZ21lbnRzIGZvdW5kIG9uIGl0cyBwb3NpdGlvbi4gIEJhc2ljYWxseSwgdGhlc2UgYXJlICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgLSB0aGUgZWRnZSdzIG1haW4gZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAtIHN0ZW0gZWRnZSwgc2VyaWYgZWRnZSBvciBib3RoICh3aGljaCBkZWZhdWx0cyB0byBzdGVtIHRoZW4pICovCi0gICAgLyogIC0gcm91bmRlZCBlZGdlLCBzdHJhaWdodCBvciBib3RoICh3aGljaCBkZWZhdWx0cyB0byBzdHJhaWdodCkgKi8KLSAgICAvKiAgLSBsaW5rIGZvciBlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIGZpcnN0IG9mIGFsbCwgc2V0IHRoZSBgZWRnZScgZmllbGQgaW4gZWFjaCBzZWdtZW50IC0tIHRoaXMgaXMgKi8KLSAgICAvKiByZXF1aXJlZCBpbiBvcmRlciB0byBjb21wdXRlIGVkZ2UgbGlua3MgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKgotICAgICAqIE5vdGUgdGhhdCByZW1vdmluZyB0aGlzIGxvb3AgYW5kIHNldHRpbmcgdGhlIGBlZGdlJyBmaWVsZCBvZiBlYWNoCi0gICAgICogc2VnbWVudCBkaXJlY3RseSBpbiB0aGUgY29kZSBhYm92ZSBzbG93cyBkb3duIGV4ZWN1dGlvbiBzcGVlZCBmb3IKLSAgICAgKiBzb21lIHJlYXNvbnMgb24gcGxhdGZvcm1zIGxpa2UgdGhlIFN1bi4KLSAgICAgKi8KLSAgICB7Ci0gICAgICBBRl9FZGdlICBlZGdlcyAgICAgID0gYXhpcy0+ZWRnZXM7Ci0gICAgICBBRl9FZGdlICBlZGdlX2xpbWl0ID0gZWRnZXMgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgICBBRl9FZGdlICBlZGdlOwotCi0KLSAgICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgICB7Ci0gICAgICAgIHNlZyA9IGVkZ2UtPmZpcnN0OwotICAgICAgICBpZiAoIHNlZyApCi0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWctPmVkZ2UgPSBlZGdlOwotICAgICAgICAgICAgc2VnICAgICAgID0gc2VnLT5lZGdlX25leHQ7Ci0KLSAgICAgICAgICB9IHdoaWxlICggc2VnICE9IGVkZ2UtPmZpcnN0ICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBjb21wdXRlIGVhY2ggZWRnZSBwcm9wZXJ0aWVzICovCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGlzX3JvdW5kICAgID0gMDsgIC8qIGRvZXMgaXQgY29udGFpbiByb3VuZCBzZWdtZW50cz8gICAgKi8KLSAgICAgICAgRlRfSW50ICBpc19zdHJhaWdodCA9IDA7ICAvKiBkb2VzIGl0IGNvbnRhaW4gc3RyYWlnaHQgc2VnbWVudHM/ICovCi0jaWYgMAotICAgICAgICBGVF9Qb3MgIHVwcyAgICAgICAgID0gMDsgIC8qIG51bWJlciBvZiB1cHdhcmRzIHNlZ21lbnRzICAgICAgICAgKi8KLSAgICAgICAgRlRfUG9zICBkb3ducyAgICAgICA9IDA7ICAvKiBudW1iZXIgb2YgZG93bndhcmRzIHNlZ21lbnRzICAgICAgICovCi0jZW5kaWYKLQotCi0gICAgICAgIHNlZyA9IGVkZ2UtPmZpcnN0OwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Cb29sICBpc19zZXJpZjsKLQotCi0gICAgICAgICAgLyogY2hlY2sgZm9yIHJvdW5kbmVzcyBvZiBzZWdtZW50ICovCi0gICAgICAgICAgaWYgKCBzZWctPmZsYWdzICYgQUZfRURHRV9ST1VORCApCi0gICAgICAgICAgICBpc19yb3VuZCsrOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlzX3N0cmFpZ2h0Kys7Ci0KLSNpZiAwCi0gICAgICAgICAgLyogY2hlY2sgZm9yIHNlZ21lbnQgZGlyZWN0aW9uICovCi0gICAgICAgICAgaWYgKCBzZWctPmRpciA9PSB1cF9kaXIgKQotICAgICAgICAgICAgdXBzICAgKz0gc2VnLT5tYXhfY29vcmQgLSBzZWctPm1pbl9jb29yZDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkb3ducyArPSBzZWctPm1heF9jb29yZCAtIHNlZy0+bWluX2Nvb3JkOwotI2VuZGlmCi0KLSAgICAgICAgICAvKiBjaGVjayBmb3IgbGlua3MgLS0gaWYgc2VnLT5zZXJpZiBpcyBzZXQsIHRoZW4gc2VnLT5saW5rIG11c3QgKi8KLSAgICAgICAgICAvKiBiZSBpZ25vcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpc19zZXJpZiA9IChGVF9Cb29sKSggc2VnLT5zZXJpZiAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+c2VyaWYtPmVkZ2UgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPnNlcmlmLT5lZGdlICE9IGVkZ2UgKTsKLQotICAgICAgICAgIGlmICggKCBzZWctPmxpbmsgJiYgc2VnLT5saW5rLT5lZGdlICkgfHwgaXNfc2VyaWYgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFGX0VkZ2UgICAgIGVkZ2UyOwotICAgICAgICAgICAgQUZfU2VnbWVudCAgc2VnMjsKLQotCi0gICAgICAgICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7Ci0gICAgICAgICAgICBzZWcyICA9IHNlZy0+bGluazsKLQotICAgICAgICAgICAgaWYgKCBpc19zZXJpZiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlZzIgID0gc2VnLT5zZXJpZjsKLSAgICAgICAgICAgICAgZWRnZTIgPSBlZGdlLT5zZXJpZjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBlZGdlMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1BvcyAgZWRnZV9kZWx0YTsKLSAgICAgICAgICAgICAgRlRfUG9zICBzZWdfZGVsdGE7Ci0KLQotICAgICAgICAgICAgICBlZGdlX2RlbHRhID0gZWRnZS0+ZnBvcyAtIGVkZ2UyLT5mcG9zOwotICAgICAgICAgICAgICBpZiAoIGVkZ2VfZGVsdGEgPCAwICkKLSAgICAgICAgICAgICAgICBlZGdlX2RlbHRhID0gLWVkZ2VfZGVsdGE7Ci0KLSAgICAgICAgICAgICAgc2VnX2RlbHRhID0gc2VnLT5wb3MgLSBzZWcyLT5wb3M7Ci0gICAgICAgICAgICAgIGlmICggc2VnX2RlbHRhIDwgMCApCi0gICAgICAgICAgICAgICAgc2VnX2RlbHRhID0gLXNlZ19kZWx0YTsKLQotICAgICAgICAgICAgICBpZiAoIHNlZ19kZWx0YSA8IGVkZ2VfZGVsdGEgKQotICAgICAgICAgICAgICAgIGVkZ2UyID0gc2VnMi0+ZWRnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZWRnZTIgPSBzZWcyLT5lZGdlOwotCi0gICAgICAgICAgICBpZiAoIGlzX3NlcmlmICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRnZS0+c2VyaWYgICA9IGVkZ2UyOwotICAgICAgICAgICAgICBlZGdlMi0+ZmxhZ3MgfD0gQUZfRURHRV9TRVJJRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZWRnZS0+bGluayAgPSBlZGdlMjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzZWcgPSBzZWctPmVkZ2VfbmV4dDsKLQotICAgICAgICB9IHdoaWxlICggc2VnICE9IGVkZ2UtPmZpcnN0ICk7Ci0KLSAgICAgICAgLyogc2V0IHRoZSByb3VuZC9zdHJhaWdodCBmbGFncyAqLwotICAgICAgICBlZGdlLT5mbGFncyA9IEFGX0VER0VfTk9STUFMOwotCi0gICAgICAgIGlmICggaXNfcm91bmQgPiAwICYmIGlzX3JvdW5kID49IGlzX3N0cmFpZ2h0ICkKLSAgICAgICAgICBlZGdlLT5mbGFncyB8PSBBRl9FREdFX1JPVU5EOwotCi0jaWYgMAotICAgICAgICAvKiBzZXQgdGhlIGVkZ2UncyBtYWluIGRpcmVjdGlvbiAqLwotICAgICAgICBlZGdlLT5kaXIgPSBBRl9ESVJfTk9ORTsKLQotICAgICAgICBpZiAoIHVwcyA+IGRvd25zICkKLSAgICAgICAgICBlZGdlLT5kaXIgPSAoRlRfQ2hhcil1cF9kaXI7Ci0KLSAgICAgICAgZWxzZSBpZiAoIHVwcyA8IGRvd25zICkKLSAgICAgICAgICBlZGdlLT5kaXIgPSAoRlRfQ2hhciktdXBfZGlyOwotCi0gICAgICAgIGVsc2UgaWYgKCB1cHMgPT0gZG93bnMgKQotICAgICAgICAgIGVkZ2UtPmRpciA9IDA7ICAvKiBib3RoIHVwIGFuZCBkb3duISAqLwotI2VuZGlmCi0KLSAgICAgICAgLyogZ2V0IHJpZCBvZiBzZXJpZnMgaWYgbGluayBpcyBzZXQgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFhYWDogVGhpcyBnZXRzIHJpZCBvZiBtYW55IHVucGxlYXNhbnQgYXJ0ZWZhY3RzISAqLwotICAgICAgICAvKiAgICAgIEV4YW1wbGU6IHRoZSBgYycgaW4gY291ci5wZmEgYXQgc2l6ZSAxMyAgICAgKi8KLQotICAgICAgICBpZiAoIGVkZ2UtPnNlcmlmICYmIGVkZ2UtPmxpbmsgKQotICAgICAgICAgIGVkZ2UtPnNlcmlmID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIERldGVjdCBzZWdtZW50cyBhbmQgZWRnZXMgZm9yIGdpdmVuIGRpbWVuc2lvbi4gKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW5faGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICB3aWR0aF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9XaWR0aFJlYyogICB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzKCBoaW50cywgZGltICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGFmX2xhdGluX2hpbnRzX2xpbmtfc2VnbWVudHMoIGhpbnRzLCB3aWR0aF9jb3VudCwgd2lkdGhzLCBkaW0gKTsKLQotICAgICAgZXJyb3IgPSBhZl9sYXRpbl9oaW50c19jb21wdXRlX2VkZ2VzKCBoaW50cywgZGltICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDb21wdXRlIGFsbCBlZGdlcyB3aGljaCBsaWUgd2l0aGluIGJsdWUgem9uZXMuICovCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW5faGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKCBBRl9HbHlwaEhpbnRzICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgPSAmaGludHMtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZSAgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZV9saW1pdCA9IGVkZ2UgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgQUZfTGF0aW5BeGlzICBsYXRpbiAgICAgID0gJm1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdOwotICAgIEZUX0ZpeGVkICAgICAgc2NhbGUgICAgICA9IGxhdGluLT5zY2FsZTsKLQotCi0gICAgLyogY29tcHV0ZSB3aGljaCBibHVlIHpvbmVzIGFyZSBhY3RpdmUsIGkuZS4gaGF2ZSB0aGVpciBzY2FsZWQgKi8KLSAgICAvKiBzaXplIDwgMy80IHBpeGVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogZm9yIGVhY2ggaG9yaXpvbnRhbCBlZGdlIHNlYXJjaCB0aGUgYmx1ZSB6b25lIHdoaWNoIGlzIGNsb3Nlc3QgKi8KLSAgICBmb3IgKCA7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICBiYjsKLSAgICAgIEFGX1dpZHRoICBiZXN0X2JsdWUgICAgICAgICAgICA9IE5VTEw7Ci0gICAgICBGVF9Cb29sICAgYmVzdF9ibHVlX2lzX25ldXRyYWwgPSAwOwotICAgICAgRlRfUG9zICAgIGJlc3RfZGlzdDsgICAgICAgICAgICAgICAgIC8qIGluaXRpYWwgdGhyZXNob2xkICovCi0KLQotICAgICAgLyogY29tcHV0ZSB0aGUgaW5pdGlhbCB0aHJlc2hvbGQgYXMgYSBmcmFjdGlvbiBvZiB0aGUgRU0gc2l6ZSAqLwotICAgICAgLyogKHRoZSB2YWx1ZSA0MCBpcyBoZXVyaXN0aWMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgYmVzdF9kaXN0ID0gRlRfTXVsRml4KCBtZXRyaWNzLT51bml0c19wZXJfZW0gLyA0MCwgc2NhbGUgKTsKLQotICAgICAgLyogYXNzdXJlIGEgbWluaW11bSBkaXN0YW5jZSBvZiAwLjVweCAqLwotICAgICAgaWYgKCBiZXN0X2Rpc3QgPiA2NCAvIDIgKQotICAgICAgICBiZXN0X2Rpc3QgPSA2NCAvIDI7Ci0KLSAgICAgIGZvciAoIGJiID0gMDsgYmIgPCBsYXRpbi0+Ymx1ZV9jb3VudDsgYmIrKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0xhdGluQmx1ZSAgYmx1ZSA9IGxhdGluLT5ibHVlcyArIGJiOwotICAgICAgICBGVF9Cb29sICAgICAgIGlzX3RvcF9ibHVlLCBpc19uZXV0cmFsX2JsdWUsIGlzX21ham9yX2RpcjsKLQotCi0gICAgICAgIC8qIHNraXAgaW5hY3RpdmUgYmx1ZSB6b25lcyAoaS5lLiwgdGhvc2UgdGhhdCBhcmUgdG9vIGxhcmdlKSAqLwotICAgICAgICBpZiAoICEoIGJsdWUtPmZsYWdzICYgQUZfTEFUSU5fQkxVRV9BQ1RJVkUgKSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogaWYgaXQgaXMgYSB0b3Agem9uZSwgY2hlY2sgZm9yIHJpZ2h0IGVkZ2VzIChhZ2FpbnN0IHRoZSBtYWpvciAqLwotICAgICAgICAvKiBkaXJlY3Rpb24pOyBpZiBpdCBpcyBhIGJvdHRvbSB6b25lLCBjaGVjayBmb3IgbGVmdCBlZGdlcyAoaW4gICovCi0gICAgICAgIC8qIHRoZSBtYWpvciBkaXJlY3Rpb24pIC0tIHRoaXMgYXNzdW1lcyB0aGUgVHJ1ZVR5cGUgY29udmVudGlvbiAgKi8KLSAgICAgICAgLyogZm9yIHRoZSBvcmllbnRhdGlvbiBvZiBjb250b3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpc190b3BfYmx1ZSA9Ci0gICAgICAgICAgKEZUX0J5dGUpKCAoIGJsdWUtPmZsYWdzICYgKCBBRl9MQVRJTl9CTFVFX1RPUCAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfTEFUSU5fQkxVRV9TVUJfVE9QICkgKSAhPSAwICk7Ci0gICAgICAgIGlzX25ldXRyYWxfYmx1ZSA9Ci0gICAgICAgICAgKEZUX0J5dGUpKCAoIGJsdWUtPmZsYWdzICYgQUZfTEFUSU5fQkxVRV9ORVVUUkFMICkgIT0gMCk7Ci0gICAgICAgIGlzX21ham9yX2RpciA9Ci0gICAgICAgICAgRlRfQk9PTCggZWRnZS0+ZGlyID09IGF4aXMtPm1ham9yX2RpciApOwotCi0gICAgICAgIC8qIG5ldXRyYWwgYmx1ZSB6b25lcyBhcmUgaGFuZGxlZCBmb3IgYm90aCBkaXJlY3Rpb25zICovCi0gICAgICAgIGlmICggaXNfdG9wX2JsdWUgXiBpc19tYWpvcl9kaXIgfHwgaXNfbmV1dHJhbF9ibHVlICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICAgICAgLyogZmlyc3Qgb2YgYWxsLCBjb21wYXJlIGl0IHRvIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gKi8KLSAgICAgICAgICBkaXN0ID0gZWRnZS0+ZnBvcyAtIGJsdWUtPnJlZi5vcmc7Ci0gICAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgICBkaXN0ID0gRlRfTXVsRml4KCBkaXN0LCBzY2FsZSApOwotICAgICAgICAgIGlmICggZGlzdCA8IGJlc3RfZGlzdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgYmVzdF9kaXN0ICAgICAgICAgICAgPSBkaXN0OwotICAgICAgICAgICAgYmVzdF9ibHVlICAgICAgICAgICAgPSAmYmx1ZS0+cmVmOwotICAgICAgICAgICAgYmVzdF9ibHVlX2lzX25ldXRyYWwgPSBpc19uZXV0cmFsX2JsdWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogbm93IGNvbXBhcmUgaXQgdG8gdGhlIG92ZXJzaG9vdCBwb3NpdGlvbiBhbmQgY2hlY2sgd2hldGhlciAqLwotICAgICAgICAgIC8qIHRoZSBlZGdlIGlzIHJvdW5kZWQsIGFuZCB3aGV0aGVyIHRoZSBlZGdlIGlzIG92ZXIgdGhlICAgICAgKi8KLSAgICAgICAgICAvKiByZWZlcmVuY2UgcG9zaXRpb24gb2YgYSB0b3Agem9uZSwgb3IgdW5kZXIgdGhlIHJlZmVyZW5jZSAgICovCi0gICAgICAgICAgLyogcG9zaXRpb24gb2YgYSBib3R0b20gem9uZSAocHJvdmlkZWQgd2UgZG9uJ3QgaGF2ZSBhICAgICAgICAqLwotICAgICAgICAgIC8qIG5ldXRyYWwgYmx1ZSB6b25lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ST1VORCAmJgotICAgICAgICAgICAgICAgZGlzdCAhPSAwICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAhaXNfbmV1dHJhbF9ibHVlICAgICAgICAgICAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0Jvb2wgIGlzX3VuZGVyX3JlZiA9IEZUX0JPT0woIGVkZ2UtPmZwb3MgPCBibHVlLT5yZWYub3JnICk7Ci0KLQotICAgICAgICAgICAgaWYgKCBpc190b3BfYmx1ZSBeIGlzX3VuZGVyX3JlZiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRpc3QgPSBlZGdlLT5mcG9zIC0gYmx1ZS0+c2hvb3Qub3JnOwotICAgICAgICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgICAgICAgZGlzdCA9IEZUX011bEZpeCggZGlzdCwgc2NhbGUgKTsKLSAgICAgICAgICAgICAgaWYgKCBkaXN0IDwgYmVzdF9kaXN0ICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlc3RfZGlzdCAgICAgICAgICAgID0gZGlzdDsKLSAgICAgICAgICAgICAgICBiZXN0X2JsdWUgICAgICAgICAgICA9ICZibHVlLT5zaG9vdDsKLSAgICAgICAgICAgICAgICBiZXN0X2JsdWVfaXNfbmV1dHJhbCA9IGlzX25ldXRyYWxfYmx1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGJlc3RfYmx1ZSApCi0gICAgICB7Ci0gICAgICAgIGVkZ2UtPmJsdWVfZWRnZSA9IGJlc3RfYmx1ZTsKLSAgICAgICAgaWYgKCBiZXN0X2JsdWVfaXNfbmV1dHJhbCApCi0gICAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ORVVUUkFMOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogSW5pdGFsaXplIGhpbnRpbmcgZW5naW5lLiAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9sYXRpbl9oaW50c19pbml0KCBBRl9HbHlwaEhpbnRzICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgRlRfUmVuZGVyX01vZGUgIG1vZGU7Ci0gICAgRlRfVUludDMyICAgICAgIHNjYWxlcl9mbGFncywgb3RoZXJfZmxhZ3M7Ci0gICAgRlRfRmFjZSAgICAgICAgIGZhY2UgPSBtZXRyaWNzLT5yb290LnNjYWxlci5mYWNlOwotCi0KLSAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgKEFGX1N0eWxlTWV0cmljcyltZXRyaWNzICk7Ci0KLSAgICAvKgotICAgICAqICBjb3JyZWN0IHhfc2NhbGUgYW5kIHlfc2NhbGUgaWYgbmVlZGVkLCBzaW5jZSB0aGV5IG1heSBoYXZlCi0gICAgICogIGJlZW4gbW9kaWZpZWQgYnkgYGFmX2xhdGluX21ldHJpY3Nfc2NhbGVfZGltJyBhYm92ZQotICAgICAqLwotICAgIGhpbnRzLT54X3NjYWxlID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uc2NhbGU7Ci0gICAgaGludHMtPnhfZGVsdGEgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS5kZWx0YTsKLSAgICBoaW50cy0+eV9zY2FsZSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdLnNjYWxlOwotICAgIGhpbnRzLT55X2RlbHRhID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0uZGVsdGE7Ci0KLSAgICAvKiBjb21wdXRlIGZsYWdzIGRlcGVuZGluZyBvbiByZW5kZXIgbW9kZSwgZXRjLiAqLwotICAgIG1vZGUgPSBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZTsKLQotI2lmIDAgLyogI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUiAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCi0gICAgICBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZSA9IG1vZGUgPSBGVF9SRU5ERVJfTU9ERV9OT1JNQUw7Ci0jZW5kaWYKLQotICAgIHNjYWxlcl9mbGFncyA9IGhpbnRzLT5zY2FsZXJfZmxhZ3M7Ci0gICAgb3RoZXJfZmxhZ3MgID0gMDsKLQotICAgIC8qCi0gICAgICogIFdlIHNuYXAgdGhlIHdpZHRoIG9mIHZlcnRpY2FsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgaG9yaXpvbnRhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19IT1JaX1NOQVA7Ci0KLSAgICAvKgotICAgICAqICBXZSBzbmFwIHRoZSB3aWR0aCBvZiBob3Jpem9udGFsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgdmVydGljYWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCi0gICAgICovCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19WRVJUX1NOQVA7Ci0KLSAgICAvKgotICAgICAqICBXZSBhZGp1c3Qgc3RlbXMgdG8gZnVsbCBwaXhlbHMgdW5sZXNzIGluIGBsaWdodCcgb3IgYGxjZCcgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgJiYgbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MQ0QgKQotICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfU1RFTV9BREpVU1Q7Ci0KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19NT05POwotCi0gICAgLyoKLSAgICAgKiAgSW4gYGxpZ2h0JyBvciBgbGNkJyBtb2RlIHdlIGRpc2FibGUgaG9yaXpvbnRhbCBoaW50aW5nIGNvbXBsZXRlbHkuCi0gICAgICogIFdlIGFsc28gZG8gaXQgaWYgdGhlIGZhY2UgaXMgaXRhbGljLgotICAgICAqCi0gICAgICogIEhvd2V2ZXIsIGlmIHdhcnBpbmcgaXMgZW5hYmxlZCAod2hpY2ggb25seSB3b3JrcyBpbiBgbGlnaHQnIGhpbnRpbmcKLSAgICAgKiAgbW9kZSksIGFkdmFuY2Ugd2lkdGhzIGdldCBhZGp1c3RlZCwgdG9vLgotICAgICAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCB8fAotICAgICAgICAgKCBmYWNlLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfSVRBTElDICkgIT0gMCAgICAgICAgICApCi0gICAgICBzY2FsZXJfZmxhZ3MgfD0gQUZfU0NBTEVSX0ZMQUdfTk9fSE9SSVpPTlRBTDsKLQotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUgotICAgIC8qIGdldCAoZ2xvYmFsKSB3YXJwZXIgZmxhZyAqLwotICAgIGlmICggIW1ldHJpY3MtPnJvb3QuZ2xvYmFscy0+bW9kdWxlLT53YXJwaW5nICkKLSAgICAgIHNjYWxlcl9mbGFncyB8PSBBRl9TQ0FMRVJfRkxBR19OT19XQVJQRVI7Ci0jZW5kaWYKLQotICAgIGhpbnRzLT5zY2FsZXJfZmxhZ3MgPSBzY2FsZXJfZmxhZ3M7Ci0gICAgaGludHMtPm90aGVyX2ZsYWdzICA9IG90aGVyX2ZsYWdzOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICBMIEEgVCBJIE4gICBHIEwgWSBQIEggICBHIFIgSSBEIC0gRiBJIFQgVCBJIE4gRyAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogU25hcCBhIGdpdmVuIHdpZHRoIGluIHNjYWxlZCBjb29yZGluYXRlcyB0byBvbmUgb2YgdGhlICovCi0gIC8qIGN1cnJlbnQgc3RhbmRhcmQgd2lkdGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9Qb3MKLSAgYWZfbGF0aW5fc25hcF93aWR0aCggQUZfV2lkdGggIHdpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgd2lkdGggKQotICB7Ci0gICAgRlRfVUludCAgbjsKLSAgICBGVF9Qb3MgICBiZXN0ICAgICAgPSA2NCArIDMyICsgMjsKLSAgICBGVF9Qb3MgICByZWZlcmVuY2UgPSB3aWR0aDsKLSAgICBGVF9Qb3MgICBzY2FsZWQ7Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCi0gICAgewotICAgICAgRlRfUG9zICB3OwotICAgICAgRlRfUG9zICBkaXN0OwotCi0KLSAgICAgIHcgPSB3aWR0aHNbbl0uY3VyOwotICAgICAgZGlzdCA9IHdpZHRoIC0gdzsKLSAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0gICAgICBpZiAoIGRpc3QgPCBiZXN0ICkKLSAgICAgIHsKLSAgICAgICAgYmVzdCAgICAgID0gZGlzdDsKLSAgICAgICAgcmVmZXJlbmNlID0gdzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzY2FsZWQgPSBGVF9QSVhfUk9VTkQoIHJlZmVyZW5jZSApOwotCi0gICAgaWYgKCB3aWR0aCA+PSByZWZlcmVuY2UgKQotICAgIHsKLSAgICAgIGlmICggd2lkdGggPCBzY2FsZWQgKyA0OCApCi0gICAgICAgIHdpZHRoID0gcmVmZXJlbmNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCB3aWR0aCA+IHNjYWxlZCAtIDQ4ICkKLSAgICAgICAgd2lkdGggPSByZWZlcmVuY2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdpZHRoOwotICB9Ci0KLQotICAvKiBDb21wdXRlIHRoZSBzbmFwcGVkIHdpZHRoIG9mIGEgZ2l2ZW4gc3RlbSwgaWdub3JpbmcgdmVyeSB0aGluIG9uZXMuICovCi0gIC8qIFRoZXJlIGlzIGEgbG90IG9mIHZvb2RvbyBpbiB0aGlzIGZ1bmN0aW9uOyBjaGFuZ2luZyB0aGUgaGFyZC1jb2RlZCAgKi8KLSAgLyogcGFyYW1ldGVycyBpbmZsdWVuY2UgdGhlIHdob2xlIGhpbnRpbmcgcHJvY2Vzcy4gICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9Qb3MKLSAgYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgYmFzZV9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBiYXNlX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIHN0ZW1fZmxhZ3MgKQotICB7Ci0gICAgQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzICA9IChBRl9MYXRpbk1ldHJpY3MpaGludHMtPm1ldHJpY3M7Ci0gICAgQUZfTGF0aW5BeGlzICAgICBheGlzICAgICA9ICZtZXRyaWNzLT5heGlzW2RpbV07Ci0gICAgRlRfUG9zICAgICAgICAgICBkaXN0ICAgICA9IHdpZHRoOwotICAgIEZUX0ludCAgICAgICAgICAgc2lnbiAgICAgPSAwOwotICAgIEZUX0ludCAgICAgICAgICAgdmVydGljYWwgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApOwotCi0KLSAgICBpZiAoICFBRl9MQVRJTl9ISU5UU19ET19TVEVNX0FESlVTVCggaGludHMgKSB8fAotICAgICAgICAgYXhpcy0+ZXh0cmFfbGlnaHQgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgIHJldHVybiB3aWR0aDsKLQotICAgIGlmICggZGlzdCA8IDAgKQotICAgIHsKLSAgICAgIGRpc3QgPSAtd2lkdGg7Ci0gICAgICBzaWduID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoICggIHZlcnRpY2FsICYmICFBRl9MQVRJTl9ISU5UU19ET19WRVJUX1NOQVAoIGhpbnRzICkgKSB8fAotICAgICAgICAgKCAhdmVydGljYWwgJiYgIUFGX0xBVElOX0hJTlRTX0RPX0hPUlpfU05BUCggaGludHMgKSApICkKLSAgICB7Ci0gICAgICAvKiBzbW9vdGggaGludGluZyBwcm9jZXNzOiB2ZXJ5IGxpZ2h0bHkgcXVhbnRpemUgdGhlIHN0ZW0gd2lkdGggKi8KLQotICAgICAgLyogbGVhdmUgdGhlIHdpZHRocyBvZiBzZXJpZnMgYWxvbmUgKi8KLSAgICAgIGlmICggKCBzdGVtX2ZsYWdzICYgQUZfRURHRV9TRVJJRiApICYmCi0gICAgICAgICAgIHZlcnRpY2FsICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIGRpc3QgPCAzICogNjQgKSAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIERvbmVfV2lkdGg7Ci0KLSAgICAgIGVsc2UgaWYgKCBiYXNlX2ZsYWdzICYgQUZfRURHRV9ST1VORCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZGlzdCA8IDgwICkKLSAgICAgICAgICBkaXN0ID0gNjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZGlzdCA8IDU2ICkKLSAgICAgICAgZGlzdCA9IDU2OwotCi0gICAgICBpZiAoIGF4aXMtPndpZHRoX2NvdW50ID4gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgZGVsdGE7Ci0KLQotICAgICAgICAvKiBjb21wYXJlIHRvIHN0YW5kYXJkIHdpZHRoICovCi0gICAgICAgIGRlbHRhID0gZGlzdCAtIGF4aXMtPndpZHRoc1swXS5jdXI7Ci0KLSAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotCi0gICAgICAgIGlmICggZGVsdGEgPCA0MCApCi0gICAgICAgIHsKLSAgICAgICAgICBkaXN0ID0gYXhpcy0+d2lkdGhzWzBdLmN1cjsKLSAgICAgICAgICBpZiAoIGRpc3QgPCA0OCApCi0gICAgICAgICAgICBkaXN0ID0gNDg7Ci0KLSAgICAgICAgICBnb3RvIERvbmVfV2lkdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRpc3QgPCAzICogNjQgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGEgID0gZGlzdCAmIDYzOwotICAgICAgICAgIGRpc3QgICY9IC02NDsKLQotICAgICAgICAgIGlmICggZGVsdGEgPCAxMCApCi0gICAgICAgICAgICBkaXN0ICs9IGRlbHRhOwotCi0gICAgICAgICAgZWxzZSBpZiAoIGRlbHRhIDwgMzIgKQotICAgICAgICAgICAgZGlzdCArPSAxMDsKLQotICAgICAgICAgIGVsc2UgaWYgKCBkZWx0YSA8IDU0ICkKLSAgICAgICAgICAgIGRpc3QgKz0gNTQ7Ci0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ICs9IGRlbHRhOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIEEgc3RlbSdzIGVuZCBwb3NpdGlvbiBkZXBlbmRzIG9uIHR3byB2YWx1ZXM6IHRoZSBzdGFydCAgICAgICAgKi8KLSAgICAgICAgICAvKiBwb3NpdGlvbiBhbmQgdGhlIHN0ZW0gbGVuZ3RoLiAgVGhlIGZvcm1lciBnZXRzIHVzdWFsbHkgICAgICAgICovCi0gICAgICAgICAgLyogcm91bmRlZCB0byB0aGUgZ3JpZCwgd2hpbGUgdGhlIGxhdHRlciBnZXRzIHJvdW5kZWQgYWxzbyBpZiBpdCAqLwotICAgICAgICAgIC8qIGV4Y2VlZHMgYSBjZXJ0YWluIGxlbmd0aCAoc2VlIGJlbG93IGluIHRoaXMgZnVuY3Rpb24pLiAgVGhpcyAgKi8KLSAgICAgICAgICAvKiBgZG91YmxlIHJvdW5kaW5nJyBjYW4gbGVhZCB0byBhIGdyZWF0IGRpZmZlcmVuY2UgdG8gdGhlICAgICAgICovCi0gICAgICAgICAgLyogb3JpZ2luYWwsIHVuaGludGVkIHBvc2l0aW9uOyB0aGlzIG5vcm1hbGx5IGRvZXNuJ3QgbWF0dGVyIGZvciAqLwotICAgICAgICAgIC8qIGxhcmdlIFBQRU0gdmFsdWVzLCBidXQgZm9yIHNtYWxsIHNpemVzIGl0IGNhbiBlYXNpbHkgbWFrZSAgICAgKi8KLSAgICAgICAgICAvKiBvdXRsaW5lcyBjb2xsaWRlLiAgRm9yIHRoaXMgcmVhc29uLCB3ZSBhZGp1c3QgdGhlIHN0ZW0gbGVuZ3RoICovCi0gICAgICAgICAgLyogYnkgYSBzbWFsbCBhbW91bnQgZGVwZW5kaW5nIG9uIHRoZSBQUEVNIHZhbHVlIGluIGNhc2UgdGhlICAgICAqLwotICAgICAgICAgIC8qIGZvcm1lciBhbmQgbGF0dGVyIHJvdW5kaW5nIGJvdGggcG9pbnQgaW50byB0aGUgc2FtZSAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBkaXJlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICBGVF9Qb3MgIGJkZWx0YSA9IDA7Ci0KLQotICAgICAgICAgIGlmICggKCAoIHdpZHRoID4gMCApICYmICggYmFzZV9kZWx0YSA+IDAgKSApIHx8Ci0gICAgICAgICAgICAgICAoICggd2lkdGggPCAwICkgJiYgKCBiYXNlX2RlbHRhIDwgMCApICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgIHBwZW0gPSBtZXRyaWNzLT5yb290LnNjYWxlci5mYWNlLT5zaXplLT5tZXRyaWNzLnhfcHBlbTsKLQotCi0gICAgICAgICAgICBpZiAoIHBwZW0gPCAxMCApCi0gICAgICAgICAgICAgIGJkZWx0YSA9IGJhc2VfZGVsdGE7Ci0gICAgICAgICAgICBlbHNlIGlmICggcHBlbSA8IDMwICkKLSAgICAgICAgICAgICAgYmRlbHRhID0gKCBiYXNlX2RlbHRhICogKEZUX1BvcykoIDMwIC0gcHBlbSApICkgLyAyMDsKLQotICAgICAgICAgICAgaWYgKCBiZGVsdGEgPCAwICkKLSAgICAgICAgICAgICAgYmRlbHRhID0gLWJkZWx0YTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkaXN0ID0gKCBkaXN0IC0gYmRlbHRhICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogc3Ryb25nIGhpbnRpbmcgcHJvY2Vzczogc25hcCB0aGUgc3RlbSB3aWR0aCB0byBpbnRlZ2VyIHBpeGVscyAqLwotCi0gICAgICBGVF9Qb3MgIG9yZ19kaXN0ID0gZGlzdDsKLQotCi0gICAgICBkaXN0ID0gYWZfbGF0aW5fc25hcF93aWR0aCggYXhpcy0+d2lkdGhzLCBheGlzLT53aWR0aF9jb3VudCwgZGlzdCApOwotCi0gICAgICBpZiAoIHZlcnRpY2FsICkKLSAgICAgIHsKLSAgICAgICAgLyogaW4gdGhlIGNhc2Ugb2YgdmVydGljYWwgaGludGluZywgYWx3YXlzIHJvdW5kICovCi0gICAgICAgIC8qIHRoZSBzdGVtIGhlaWdodHMgdG8gaW50ZWdlciBwaXhlbHMgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggZGlzdCA+PSA2NCApCi0gICAgICAgICAgZGlzdCA9ICggZGlzdCArIDE2ICkgJiB+NjM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXN0ID0gNjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggQUZfTEFUSU5fSElOVFNfRE9fTU9OTyggaGludHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtb25vY2hyb21lIGhvcml6b250YWwgaGludGluZzogc25hcCB3aWR0aHMgdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICAgICAgICAvKiB3aXRoIGEgZGlmZmVyZW50IHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDY0ICkKLSAgICAgICAgICAgIGRpc3QgPSA2NDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBmb3IgaG9yaXpvbnRhbCBhbnRpLWFsaWFzZWQgaGludGluZywgd2UgYWRvcHQgYSBtb3JlIHN1YnRsZSAqLwotICAgICAgICAgIC8qIGFwcHJvYWNoOiB3ZSBzdHJlbmd0aGVuIHNtYWxsIHN0ZW1zLCByb3VuZCBzdGVtcyB3aG9zZSBzaXplICovCi0gICAgICAgICAgLyogaXMgYmV0d2VlbiAxIGFuZCAyIHBpeGVscyB0byBhbiBpbnRlZ2VyLCBvdGhlcndpc2Ugbm90aGluZyAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyA2NCApID4+IDE7Ci0KLSAgICAgICAgICBlbHNlIGlmICggZGlzdCA8IDEyOCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogV2Ugb25seSByb3VuZCB0byBhbiBpbnRlZ2VyIHdpZHRoIGlmIHRoZSBjb3JyZXNwb25kaW5nICovCi0gICAgICAgICAgICAvKiBkaXN0b3J0aW9uIGlzIGxlc3MgdGhhbiAxLzQgcGl4ZWwuICBPdGhlcndpc2UgdGhpcyAgICAgKi8KLSAgICAgICAgICAgIC8qIG1ha2VzIGV2ZXJ5dGhpbmcgd29yc2Ugc2luY2UgdGhlIGRpYWdvbmFscywgd2hpY2ggYXJlICAqLwotICAgICAgICAgICAgLyogbm90IGhpbnRlZCwgYXBwZWFyIGEgbG90IGJvbGRlciBvciB0aGlubmVyIHRoYW4gdGhlICAgICovCi0gICAgICAgICAgICAvKiB2ZXJ0aWNhbCBzdGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgRlRfUG9zICBkZWx0YTsKLQotCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMjIgKSAmIH42MzsKLSAgICAgICAgICAgIGRlbHRhID0gZGlzdCAtIG9yZ19kaXN0OwotICAgICAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgICAgICBkZWx0YSA9IC1kZWx0YTsKLQotICAgICAgICAgICAgaWYgKCBkZWx0YSA+PSAxNiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRpc3QgPSBvcmdfZGlzdDsKLSAgICAgICAgICAgICAgaWYgKCBkaXN0IDwgNDggKQotICAgICAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyA2NCApID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8qIHJvdW5kIG90aGVyd2lzZSB0byBwcmV2ZW50IGNvbG9yIGZyaW5nZXMgaW4gTENEIG1vZGUgKi8KLSAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyAzMiApICYgfjYzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIERvbmVfV2lkdGg6Ci0gICAgaWYgKCBzaWduICkKLSAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgIHJldHVybiBkaXN0OwotICB9Ci0KLQotICAvKiBBbGlnbiBvbmUgc3RlbSBlZGdlIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBzdGVtIGVkZ2UuICovCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW5fYWxpZ25fbGlua2VkX2VkZ2UoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgYmFzZV9lZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgc3RlbV9lZGdlICkKLSAgewotICAgIEZUX1BvcyAgZGlzdCwgYmFzZV9kZWx0YTsKLSAgICBGVF9Qb3MgIGZpdHRlZF93aWR0aDsKLQotCi0gICAgZGlzdCAgICAgICA9IHN0ZW1fZWRnZS0+b3BvcyAtIGJhc2VfZWRnZS0+b3BvczsKLSAgICBiYXNlX2RlbHRhID0gYmFzZV9lZGdlLT5wb3MgLSBiYXNlX2VkZ2UtPm9wb3M7Ci0KLSAgICBmaXR0ZWRfd2lkdGggPSBhZl9sYXRpbl9jb21wdXRlX3N0ZW1fd2lkdGgoIGhpbnRzLCBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0LCBiYXNlX2RlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9lZGdlLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW1fZWRnZS0+ZmxhZ3MgKTsKLQotCi0gICAgc3RlbV9lZGdlLT5wb3MgPSBiYXNlX2VkZ2UtPnBvcyArIGZpdHRlZF93aWR0aDsKLQotICAgIEZUX1RSQUNFNSgoICIgIExJTks6IGVkZ2UgJWQgKG9wb3M9JS4yZikgbGlua2VkIHRvICUuMmYsIgotICAgICAgICAgICAgICAgICIgZGlzdCB3YXMgJS4yZiwgbm93ICUuMmZcbiIsCi0gICAgICAgICAgICAgICAgc3RlbV9lZGdlIC0gaGludHMtPmF4aXNbZGltXS5lZGdlcywgc3RlbV9lZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICBzdGVtX2VkZ2UtPnBvcyAvIDY0LjAsIGRpc3QgLyA2NC4wLCBmaXR0ZWRfd2lkdGggLyA2NC4wICkpOwotICB9Ci0KLQotICAvKiBTaGlmdCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGBzZXJpZicgZWRnZSBieSB0aGUgc2FtZSBhbW91bnQgKi8KLSAgLyogYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGJhc2UnIGVkZ2UgaGFzIGJlZW4gbW92ZWQgYWxyZWFkeS4gICAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW5fYWxpZ25fc2VyaWZfZWRnZSggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIHNlcmlmICkKLSAgewotICAgIEZUX1VOVVNFRCggaGludHMgKTsKLQotICAgIHNlcmlmLT5wb3MgPSBiYXNlLT5wb3MgKyAoIHNlcmlmLT5vcG9zIC0gYmFzZS0+b3BvcyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgIEUgRCBHIEUgICBIIEkgTiBUIEkgTiBHICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogVGhlIG1haW4gZ3JpZC1maXR0aW5nIHJvdXRpbmUuICovCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW5faGludF9lZGdlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2VzICAgICAgPSBheGlzLT5lZGdlczsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2VfbGltaXQgPSBlZGdlcyArIGF4aXMtPm51bV9lZGdlczsKLSAgICBGVF9QdHJEaXN0ICAgIG5fZWRnZXM7Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlOwotICAgIEFGX0VkZ2UgICAgICAgYW5jaG9yICAgICA9IE5VTEw7Ci0gICAgRlRfSW50ICAgICAgICBoYXNfc2VyaWZzID0gMDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMgPSBoaW50cy0+bWV0cmljcy0+Z2xvYmFsczsKLSNlbmRpZgotCi0gICAgQUZfU3R5bGVDbGFzcyAgIHN0eWxlX2NsYXNzICA9IGhpbnRzLT5tZXRyaWNzLT5zdHlsZV9jbGFzczsKLSAgICBBRl9TY3JpcHRDbGFzcyAgc2NyaXB0X2NsYXNzID0gQUZfU0NSSVBUX0NMQVNTRVNfR0VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlX2NsYXNzLT5zY3JpcHRdOwotCi0gICAgRlRfQm9vbCAgdG9wX3RvX2JvdHRvbV9oaW50aW5nID0gMDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgRlRfVUludCAgbnVtX2FjdGlvbnMgPSAwOwotI2VuZGlmCi0KLQotICAgIEZUX1RSQUNFNSgoICJsYXRpbiAlcyBlZGdlIGhpbnRpbmcgKHN0eWxlIGAlcycpXG4iLAotICAgICAgICAgICAgICAgIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCA/ICJob3Jpem9udGFsIiA6ICJ2ZXJ0aWNhbCIsCi0gICAgICAgICAgICAgICAgYWZfc3R5bGVfbmFtZXNbaGludHMtPm1ldHJpY3MtPnN0eWxlX2NsYXNzLT5zdHlsZV0gKSk7Ci0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApCi0gICAgICB0b3BfdG9fYm90dG9tX2hpbnRpbmcgPSBzY3JpcHRfY2xhc3MtPnRvcF90b19ib3R0b21faGludGluZzsKLQotICAgIC8qIHdlIGJlZ2luIGJ5IGFsaWduaW5nIGFsbCBzdGVtcyByZWxhdGl2ZSB0byB0aGUgYmx1ZSB6b25lICovCi0gICAgLyogaWYgbmVlZGVkIC0tIHRoYXQncyBvbmx5IGZvciBob3Jpem9udGFsIGVkZ2VzICAgICAgICAgICAgKi8KLQotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICYmIEFGX0hJTlRTX0RPX0JMVUVTKCBoaW50cyApICkKLSAgICB7Ci0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBBRl9XaWR0aCAgYmx1ZTsKLSAgICAgICAgQUZfRWRnZSAgIGVkZ2UxLCBlZGdlMjsgLyogdGhlc2UgZWRnZXMgZm9ybSB0aGUgc3RlbSB0byBjaGVjayAqLwotCi0KLSAgICAgICAgaWYgKCBlZGdlLT5mbGFncyAmIEFGX0VER0VfRE9ORSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZWRnZTEgPSBOVUxMOwotICAgICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIElmIGEgc3RlbSBjb250YWlucyBib3RoIGEgbmV1dHJhbCBhbmQgYSBub24tbmV1dHJhbCBibHVlIHpvbmUsCi0gICAgICAgICAqICBza2lwIHRoZSBuZXV0cmFsIG9uZS4gIE90aGVyd2lzZSwgb3V0bGluZXMgd2l0aCBkaWZmZXJlbnQKLSAgICAgICAgICogIGRpcmVjdGlvbnMgbWlnaHQgYmUgaW5jb3JyZWN0bHkgYWxpZ25lZCBhdCB0aGUgc2FtZSB2ZXJ0aWNhbAotICAgICAgICAgKiAgcG9zaXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqICBJZiB3ZSBoYXZlIHR3byBuZXV0cmFsIGJsdWUgem9uZXMsIHNraXAgb25lIG9mIHRoZW0uCi0gICAgICAgICAqCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIGVkZ2UtPmJsdWVfZWRnZSAmJiBlZGdlMiAmJiBlZGdlMi0+Ymx1ZV9lZGdlICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUgIG5ldXRyYWwgID0gZWRnZS0+ZmxhZ3MgICYgQUZfRURHRV9ORVVUUkFMOwotICAgICAgICAgIEZUX0J5dGUgIG5ldXRyYWwyID0gZWRnZTItPmZsYWdzICYgQUZfRURHRV9ORVVUUkFMOwotCi0KLSAgICAgICAgICBpZiAoIG5ldXRyYWwyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGdlMi0+Ymx1ZV9lZGdlID0gTlVMTDsKLSAgICAgICAgICAgIGVkZ2UyLT5mbGFncyAgICAmPSB+QUZfRURHRV9ORVVUUkFMOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggbmV1dHJhbCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRnZS0+Ymx1ZV9lZGdlID0gTlVMTDsKLSAgICAgICAgICAgIGVkZ2UtPmZsYWdzICAgICY9IH5BRl9FREdFX05FVVRSQUw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYmx1ZSA9IGVkZ2UtPmJsdWVfZWRnZTsKLSAgICAgICAgaWYgKCBibHVlICkKLSAgICAgICAgICBlZGdlMSA9IGVkZ2U7Ci0KLSAgICAgICAgLyogZmxpcCBlZGdlcyBpZiB0aGUgb3RoZXIgZWRnZSBpcyBhbGlnbmVkIHRvIGEgYmx1ZSB6b25lICovCi0gICAgICAgIGVsc2UgaWYgKCBlZGdlMiAmJiBlZGdlMi0+Ymx1ZV9lZGdlICkKLSAgICAgICAgewotICAgICAgICAgIGJsdWUgID0gZWRnZTItPmJsdWVfZWRnZTsKLSAgICAgICAgICBlZGdlMSA9IGVkZ2UyOwotICAgICAgICAgIGVkZ2UyID0gZWRnZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIWVkZ2UxICkKLSAgICAgICAgICBjb250aW51ZTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGlmICggIWFuY2hvciApCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgQkxVRV9BTkNIT1I6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc25hcHBlZCB0byAlLjJmLCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHdhcyAlLjJmIChhbmNob3I9ZWRnZSAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZTEgLSBlZGdlcywgZWRnZTEtPm9wb3MgLyA2NC4wLCBibHVlLT5maXQgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgIGVkZ2UxLT5wb3MgLyA2NC4wLCBlZGdlIC0gZWRnZXMgKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBCTFVFOiBlZGdlICVkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gJS4yZiwiCi0gICAgICAgICAgICAgICAgICAgICAgIiB3YXMgJS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBlZGdlMSAtIGVkZ2VzLCBlZGdlMS0+b3BvcyAvIDY0LjAsIGJsdWUtPmZpdCAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZTEtPnBvcyAvIDY0LjAgKSk7Ci0KLSAgICAgICAgbnVtX2FjdGlvbnMrKzsKLSNlbmRpZgotCi0gICAgICAgIGVkZ2UxLT5wb3MgICAgPSBibHVlLT5maXQ7Ci0gICAgICAgIGVkZ2UxLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0KLSAgICAgICAgaWYgKCBlZGdlMiAmJiAhZWRnZTItPmJsdWVfZWRnZSApCi0gICAgICAgIHsKLSAgICAgICAgICBhZl9sYXRpbl9hbGlnbl9saW5rZWRfZWRnZSggaGludHMsIGRpbSwgZWRnZTEsIGVkZ2UyICk7Ci0gICAgICAgICAgZWRnZTItPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgbnVtX2FjdGlvbnMrKzsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhYW5jaG9yICkKLSAgICAgICAgICBhbmNob3IgPSBlZGdlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIG5vdyB3ZSBhbGlnbiBhbGwgb3RoZXIgc3RlbSBlZGdlcywgdHJ5aW5nIHRvIG1haW50YWluIHRoZSAqLwotICAgIC8qIHJlbGF0aXZlIG9yZGVyIG9mIHN0ZW1zIGluIHRoZSBnbHlwaCAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgewotICAgICAgQUZfRWRnZSAgZWRnZTI7Ci0KLQotICAgICAgaWYgKCBlZGdlLT5mbGFncyAmIEFGX0VER0VfRE9ORSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBza2lwIGFsbCBub24tc3RlbSBlZGdlcyAqLwotICAgICAgZWRnZTIgPSBlZGdlLT5saW5rOwotICAgICAgaWYgKCAhZWRnZTIgKQotICAgICAgewotICAgICAgICBoYXNfc2VyaWZzKys7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiBub3cgYWxpZ24gdGhlIHN0ZW0gKi8KLQotICAgICAgLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGl0J3MgYmV0dGVyIHRvIGJlIHNhZmUgKi8KLSAgICAgIGlmICggZWRnZTItPmJsdWVfZWRnZSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIEFTU0VSVElPTiBGQUlMRUQgZm9yIGVkZ2UgJWRcbiIsIGVkZ2UyIC0gZWRnZXMgKSk7Ci0KLSAgICAgICAgYWZfbGF0aW5fYWxpZ25fbGlua2VkX2VkZ2UoIGhpbnRzLCBkaW0sIGVkZ2UyLCBlZGdlICk7Ci0gICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIG51bV9hY3Rpb25zKys7Ci0jZW5kaWYKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWFuY2hvciApCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIHdlIHJlYWNoIHRoaXMgaWYgY2xhdXNlLCBubyBzdGVtIGhhcyBiZWVuIGFsaWduZWQgeWV0ICovCi0KLSAgICAgICAgRlRfUG9zICBvcmdfbGVuLCBvcmdfY2VudGVyLCBjdXJfbGVuOwotICAgICAgICBGVF9Qb3MgIGN1cl9wb3MxLCBlcnJvcjEsIGVycm9yMiwgdV9vZmYsIGRfb2ZmOwotCi0KLSAgICAgICAgb3JnX2xlbiA9IGVkZ2UyLT5vcG9zIC0gZWRnZS0+b3BvczsKLSAgICAgICAgY3VyX2xlbiA9IGFmX2xhdGluX2NvbXB1dGVfc3RlbV93aWR0aCggaGludHMsIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnX2xlbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZS0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UyLT5mbGFncyApOwotCi0gICAgICAgIC8qIHNvbWUgdm9vZG9vIHRvIHNwZWNpYWxseSByb3VuZCBlZGdlcyBmb3Igc21hbGwgc3RlbSB3aWR0aHM7ICovCi0gICAgICAgIC8qIHRoZSBpZGVhIGlzIHRvIGFsaWduIHRoZSBjZW50ZXIgb2YgYSBzdGVtLCB0aGVuIHNoaWZ0aW5nICAgICovCi0gICAgICAgIC8qIHRoZSBzdGVtIGVkZ2VzIHRvIHN1aXRhYmxlIHBvc2l0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggY3VyX2xlbiA8PSA2NCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3aWR0aCA8PSAxcHggKi8KLSAgICAgICAgICB1X29mZiA9IDMyOwotICAgICAgICAgIGRfb2ZmID0gMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogMXB4IDwgd2lkdGggPCAxLjVweCAqLwotICAgICAgICAgIHVfb2ZmID0gMzg7Ci0gICAgICAgICAgZF9vZmYgPSAyNjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggY3VyX2xlbiA8IDk2ICkKLSAgICAgICAgewotICAgICAgICAgIG9yZ19jZW50ZXIgPSBlZGdlLT5vcG9zICsgKCBvcmdfbGVuID4+IDEgKTsKLSAgICAgICAgICBjdXJfcG9zMSAgID0gRlRfUElYX1JPVU5EKCBvcmdfY2VudGVyICk7Ci0KLSAgICAgICAgICBlcnJvcjEgPSBvcmdfY2VudGVyIC0gKCBjdXJfcG9zMSAtIHVfb2ZmICk7Ci0gICAgICAgICAgaWYgKCBlcnJvcjEgPCAwICkKLSAgICAgICAgICAgIGVycm9yMSA9IC1lcnJvcjE7Ci0KLSAgICAgICAgICBlcnJvcjIgPSBvcmdfY2VudGVyIC0gKCBjdXJfcG9zMSArIGRfb2ZmICk7Ci0gICAgICAgICAgaWYgKCBlcnJvcjIgPCAwICkKLSAgICAgICAgICAgIGVycm9yMiA9IC1lcnJvcjI7Ci0KLSAgICAgICAgICBpZiAoIGVycm9yMSA8IGVycm9yMiApCi0gICAgICAgICAgICBjdXJfcG9zMSAtPSB1X29mZjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjdXJfcG9zMSArPSBkX29mZjsKLQotICAgICAgICAgIGVkZ2UtPnBvcyAgPSBjdXJfcG9zMSAtIGN1cl9sZW4gLyAyOwotICAgICAgICAgIGVkZ2UyLT5wb3MgPSBlZGdlLT5wb3MgKyBjdXJfbGVuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBlZGdlLT5wb3MgPSBGVF9QSVhfUk9VTkQoIGVkZ2UtPm9wb3MgKTsKLQotICAgICAgICBhbmNob3IgICAgICAgPSBlZGdlOwotICAgICAgICBlZGdlLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0KLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgQU5DSE9SOiBlZGdlICVkIChvcG9zPSUuMmYpIGFuZCAlZCAob3Bvcz0lLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgIiBzbmFwcGVkIHRvICUuMmYgYW5kICUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgIGVkZ2UyIC0gZWRnZXMsIGVkZ2UyLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCwgZWRnZTItPnBvcyAvIDY0LjAgKSk7Ci0KLSAgICAgICAgYWZfbGF0aW5fYWxpZ25fbGlua2VkX2VkZ2UoIGhpbnRzLCBkaW0sIGVkZ2UsIGVkZ2UyICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBudW1fYWN0aW9ucyArPSAyOwotI2VuZGlmCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgb3JnX3Bvcywgb3JnX2xlbiwgb3JnX2NlbnRlciwgY3VyX2xlbjsKLSAgICAgICAgRlRfUG9zICBjdXJfcG9zMSwgY3VyX3BvczIsIGRlbHRhMSwgZGVsdGEyOwotCi0KLSAgICAgICAgb3JnX3BvcyAgICA9IGFuY2hvci0+cG9zICsgKCBlZGdlLT5vcG9zIC0gYW5jaG9yLT5vcG9zICk7Ci0gICAgICAgIG9yZ19sZW4gICAgPSBlZGdlMi0+b3BvcyAtIGVkZ2UtPm9wb3M7Ci0gICAgICAgIG9yZ19jZW50ZXIgPSBvcmdfcG9zICsgKCBvcmdfbGVuID4+IDEgKTsKLQotICAgICAgICBjdXJfbGVuID0gYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoKCBoaW50cywgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdfbGVuLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZTItPmZsYWdzICk7Ci0KLSAgICAgICAgaWYgKCBlZGdlMi0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgQURKVVNUOiBlZGdlICVkIChwb3M9JS4yZikgbW92ZWQgdG8gJS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBlZGdlIC0gZWRnZXMsIGVkZ2UtPnBvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgKCBlZGdlMi0+cG9zIC0gY3VyX2xlbiApIC8gNjQuMCApKTsKLQotICAgICAgICAgIGVkZ2UtPnBvcyA9IGVkZ2UyLT5wb3MgLSBjdXJfbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoIGN1cl9sZW4gPCA5NiApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgIHVfb2ZmLCBkX29mZjsKLQotCi0gICAgICAgICAgY3VyX3BvczEgPSBGVF9QSVhfUk9VTkQoIG9yZ19jZW50ZXIgKTsKLQotICAgICAgICAgIGlmICggY3VyX2xlbiA8PSA2NCApCi0gICAgICAgICAgewotICAgICAgICAgICAgdV9vZmYgPSAzMjsKLSAgICAgICAgICAgIGRfb2ZmID0gMzI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1X29mZiA9IDM4OwotICAgICAgICAgICAgZF9vZmYgPSAyNjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkZWx0YTEgPSBvcmdfY2VudGVyIC0gKCBjdXJfcG9zMSAtIHVfb2ZmICk7Ci0gICAgICAgICAgaWYgKCBkZWx0YTEgPCAwICkKLSAgICAgICAgICAgIGRlbHRhMSA9IC1kZWx0YTE7Ci0KLSAgICAgICAgICBkZWx0YTIgPSBvcmdfY2VudGVyIC0gKCBjdXJfcG9zMSArIGRfb2ZmICk7Ci0gICAgICAgICAgaWYgKCBkZWx0YTIgPCAwICkKLSAgICAgICAgICAgIGRlbHRhMiA9IC1kZWx0YTI7Ci0KLSAgICAgICAgICBpZiAoIGRlbHRhMSA8IGRlbHRhMiApCi0gICAgICAgICAgICBjdXJfcG9zMSAtPSB1X29mZjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjdXJfcG9zMSArPSBkX29mZjsKLQotICAgICAgICAgIGVkZ2UtPnBvcyAgPSBjdXJfcG9zMSAtIGN1cl9sZW4gLyAyOwotICAgICAgICAgIGVkZ2UyLT5wb3MgPSBjdXJfcG9zMSArIGN1cl9sZW4gLyAyOwotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU1RFTTogZWRnZSAlZCAob3Bvcz0lLjJmKSBsaW5rZWQgdG8gJWQgKG9wb3M9JS4yZikiCi0gICAgICAgICAgICAgICAgICAgICAgIiBzbmFwcGVkIHRvICUuMmYgYW5kICUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZSAtIGVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICBlZGdlMiAtIGVkZ2VzLCBlZGdlMi0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCwgZWRnZTItPnBvcyAvIDY0LjAgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBvcmdfcG9zICAgID0gYW5jaG9yLT5wb3MgKyAoIGVkZ2UtPm9wb3MgLSBhbmNob3ItPm9wb3MgKTsKLSAgICAgICAgICBvcmdfbGVuICAgID0gZWRnZTItPm9wb3MgLSBlZGdlLT5vcG9zOwotICAgICAgICAgIG9yZ19jZW50ZXIgPSBvcmdfcG9zICsgKCBvcmdfbGVuID4+IDEgKTsKLQotICAgICAgICAgIGN1cl9sZW4gICAgPSBhZl9sYXRpbl9jb21wdXRlX3N0ZW1fd2lkdGgoIGhpbnRzLCBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnX2xlbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlMi0+ZmxhZ3MgKTsKLQotICAgICAgICAgIGN1cl9wb3MxID0gRlRfUElYX1JPVU5EKCBvcmdfcG9zICk7Ci0gICAgICAgICAgZGVsdGExICAgPSBjdXJfcG9zMSArICggY3VyX2xlbiA+PiAxICkgLSBvcmdfY2VudGVyOwotICAgICAgICAgIGlmICggZGVsdGExIDwgMCApCi0gICAgICAgICAgICBkZWx0YTEgPSAtZGVsdGExOwotCi0gICAgICAgICAgY3VyX3BvczIgPSBGVF9QSVhfUk9VTkQoIG9yZ19wb3MgKyBvcmdfbGVuICkgLSBjdXJfbGVuOwotICAgICAgICAgIGRlbHRhMiAgID0gY3VyX3BvczIgKyAoIGN1cl9sZW4gPj4gMSApIC0gb3JnX2NlbnRlcjsKLSAgICAgICAgICBpZiAoIGRlbHRhMiA8IDAgKQotICAgICAgICAgICAgZGVsdGEyID0gLWRlbHRhMjsKLQotICAgICAgICAgIGVkZ2UtPnBvcyAgPSAoIGRlbHRhMSA8IGRlbHRhMiApID8gY3VyX3BvczEgOiBjdXJfcG9zMjsKLSAgICAgICAgICBlZGdlMi0+cG9zID0gZWRnZS0+cG9zICsgY3VyX2xlbjsKLQotICAgICAgICAgIEZUX1RSQUNFNSgoICIgIFNURU06IGVkZ2UgJWQgKG9wb3M9JS4yZikgbGlua2VkIHRvICVkIChvcG9zPSUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICIgc25hcHBlZCB0byAlLjJmIGFuZCAlLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZTIgLSBlZGdlcywgZWRnZTItPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtPnBvcyAvIDY0LjAsIGVkZ2UyLT5wb3MgLyA2NC4wICkpOwotICAgICAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBudW1fYWN0aW9ucysrOwotI2VuZGlmCi0KLSAgICAgICAgZWRnZS0+ZmxhZ3MgIHw9IEFGX0VER0VfRE9ORTsKLSAgICAgICAgZWRnZTItPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotICAgICAgICBpZiAoIGVkZ2UgPiBlZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCB0b3BfdG9fYm90dG9tX2hpbnRpbmcgPyAoIGVkZ2UtPnBvcyA+IGVkZ2VbLTFdLnBvcyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIGVkZ2UtPnBvcyA8IGVkZ2VbLTFdLnBvcyApICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogZG9uJ3QgbW92ZSBpZiBzdGVtIHdvdWxkIChhbG1vc3QpIGRpc2FwcGVhciBvdGhlcndpc2U7ICovCi0gICAgICAgICAgLyogdGhlIGFkLWhvYyB2YWx1ZSAxNiBjb3JyZXNwb25kcyB0byAxLzRweCAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBlZGdlLT5saW5rICYmIEZUX0FCUyggZWRnZS0+bGluay0+cG9zIC0gZWRnZVstMV0ucG9zICkgPiAxNiApCi0gICAgICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBCT1VORDogZWRnZSAlZCAocG9zPSUuMmYpIG1vdmVkIHRvICUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGdlIC0gZWRnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgZWRnZVstMV0ucG9zIC8gNjQuMCApKTsKLQotICAgICAgICAgICAgbnVtX2FjdGlvbnMrKzsKLSNlbmRpZgotCi0gICAgICAgICAgICBlZGdlLT5wb3MgPSBlZGdlWy0xXS5wb3M7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogbWFrZSBzdXJlIHRoYXQgbG93ZXJjYXNlIG0ncyBtYWludGFpbiB0aGVpciBzeW1tZXRyeSAqLwotCi0gICAgLyogSW4gZ2VuZXJhbCwgbG93ZXJjYXNlIG0ncyBoYXZlIHNpeCB2ZXJ0aWNhbCBlZGdlcyBpZiB0aGV5IGFyZSBzYW5zICovCi0gICAgLyogc2VyaWYsIG9yIHR3ZWx2ZSBpZiB0aGV5IGFyZSB3aXRoIHNlcmlmcy4gIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgICovCi0gICAgLyogYmFzZWQgb24gdGhhdCBhc3N1bXB0aW9uLCBhbmQgc2VlbXMgdG8gd29yayB2ZXJ5IHdlbGwgd2l0aCBtb3N0ICAgICovCi0gICAgLyogZmFjZXMuICBIb3dldmVyLCBpZiBmb3IgYSBjZXJ0YWluIGZhY2UgdGhpcyBhc3N1bXB0aW9uIGlzIG5vdCAgICAgICovCi0gICAgLyogdHJ1ZSwgdGhlIG0gaXMganVzdCByZW5kZXJlZCBsaWtlIGJlZm9yZS4gIEluIGFkZGl0aW9uLCBhbnkgc3RlbSAgICovCi0gICAgLyogY29ycmVjdGlvbiB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBzeW1tZXRyaWNhbCBnbHlwaHMgKGV2ZW4gaWYgdGhlICovCi0gICAgLyogZ2x5cGggaXMgbm90IGFuIG0pLCBzbyB0aGUgcG90ZW50aWFsIGZvciB1bndhbnRlZCBkaXN0b3J0aW9uIGlzICAgICovCi0gICAgLyogcmVsYXRpdmVseSBsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBXZSBkb24ndCBoYW5kbGUgaG9yaXpvbnRhbCBlZGdlcyBzaW5jZSB3ZSBjYW4ndCBlYXNpbHkgYXNzdXJlIHRoYXQgKi8KLSAgICAvKiB0aGUgdGhpcmQgKGxvd2VzdCkgc3RlbSBhbGlnbnMgd2l0aCB0aGUgYmFzZSBsaW5lOyBpdCBtaWdodCBlbmQgdXAgKi8KLSAgICAvKiBvbmUgcGl4ZWwgaGlnaGVyIG9yIGxvd2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIG5fZWRnZXMgPSBlZGdlX2xpbWl0IC0gZWRnZXM7Ci0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogJiYgKCBuX2VkZ2VzID09IDYgfHwgbl9lZGdlcyA9PSAxMiApICkKLSAgICB7Ci0gICAgICBBRl9FZGdlICBlZGdlMSwgZWRnZTIsIGVkZ2UzOwotICAgICAgRlRfUG9zICAgZGlzdDEsIGRpc3QyLCBzcGFuLCBkZWx0YTsKLQotCi0gICAgICBpZiAoIG5fZWRnZXMgPT0gNiApCi0gICAgICB7Ci0gICAgICAgIGVkZ2UxID0gZWRnZXM7Ci0gICAgICAgIGVkZ2UyID0gZWRnZXMgKyAyOwotICAgICAgICBlZGdlMyA9IGVkZ2VzICsgNDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWRnZTEgPSBlZGdlcyArIDE7Ci0gICAgICAgIGVkZ2UyID0gZWRnZXMgKyA1OwotICAgICAgICBlZGdlMyA9IGVkZ2VzICsgOTsKLSAgICAgIH0KLQotICAgICAgZGlzdDEgPSBlZGdlMi0+b3BvcyAtIGVkZ2UxLT5vcG9zOwotICAgICAgZGlzdDIgPSBlZGdlMy0+b3BvcyAtIGVkZ2UyLT5vcG9zOwotCi0gICAgICBzcGFuID0gZGlzdDEgLSBkaXN0MjsKLSAgICAgIGlmICggc3BhbiA8IDAgKQotICAgICAgICBzcGFuID0gLXNwYW47Ci0KLSAgICAgIGlmICggc3BhbiA8IDggKQotICAgICAgewotICAgICAgICBkZWx0YSA9IGVkZ2UzLT5wb3MgLSAoIDIgKiBlZGdlMi0+cG9zIC0gZWRnZTEtPnBvcyApOwotICAgICAgICBlZGdlMy0+cG9zIC09IGRlbHRhOwotICAgICAgICBpZiAoIGVkZ2UzLT5saW5rICkKLSAgICAgICAgICBlZGdlMy0+bGluay0+cG9zIC09IGRlbHRhOwotCi0gICAgICAgIC8qIG1vdmUgdGhlIHNlcmlmcyBhbG9uZyB3aXRoIHRoZSBzdGVtICovCi0gICAgICAgIGlmICggbl9lZGdlcyA9PSAxMiApCi0gICAgICAgIHsKLSAgICAgICAgICAoIGVkZ2VzICsgOCApLT5wb3MgLT0gZGVsdGE7Ci0gICAgICAgICAgKCBlZGdlcyArIDExICktPnBvcyAtPSBkZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGVkZ2UzLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIGlmICggZWRnZTMtPmxpbmsgKQotICAgICAgICAgIGVkZ2UzLT5saW5rLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBoYXNfc2VyaWZzIHx8ICFhbmNob3IgKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiAgbm93IGhpbnQgdGhlIHJlbWFpbmluZyBlZGdlcyAoc2VyaWZzIGFuZCBzaW5nbGUpIGluIG9yZGVyCi0gICAgICAgKiAgdG8gY29tcGxldGUgb3VyIHByb2Nlc3NpbmcKLSAgICAgICAqLwotICAgICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkZWx0YTsKLQotCi0gICAgICAgIGlmICggZWRnZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGRlbHRhID0gMTAwMDsKLQotICAgICAgICBpZiAoIGVkZ2UtPnNlcmlmICkKLSAgICAgICAgewotICAgICAgICAgIGRlbHRhID0gZWRnZS0+c2VyaWYtPm9wb3MgLSBlZGdlLT5vcG9zOwotICAgICAgICAgIGlmICggZGVsdGEgPCAwICkKLSAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBkZWx0YSA8IDY0ICsgMTYgKQotICAgICAgICB7Ci0gICAgICAgICAgYWZfbGF0aW5fYWxpZ25fc2VyaWZfZWRnZSggaGludHMsIGVkZ2UtPnNlcmlmLCBlZGdlICk7Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU0VSSUY6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc2VyaWYgdG8gJWQgKG9wb3M9JS4yZikiCi0gICAgICAgICAgICAgICAgICAgICAgIiBhbGlnbmVkIHRvICUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZSAtIGVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5zZXJpZiAtIGVkZ2VzLCBlZGdlLT5zZXJpZi0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggIWFuY2hvciApCi0gICAgICAgIHsKLSAgICAgICAgICBlZGdlLT5wb3MgPSBGVF9QSVhfUk9VTkQoIGVkZ2UtPm9wb3MgKTsKLSAgICAgICAgICBhbmNob3IgICAgPSBlZGdlOwotICAgICAgICAgIEZUX1RSQUNFNSgoICIgIFNFUklGX0FOQ0hPUjogZWRnZSAlZCAob3Bvcz0lLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAiIHNuYXBwZWQgdG8gJS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBlZGdlLWVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwgZWRnZS0+cG9zIC8gNjQuMCApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9FZGdlICBiZWZvcmUsIGFmdGVyOwotCi0KLSAgICAgICAgICBmb3IgKCBiZWZvcmUgPSBlZGdlIC0gMTsgYmVmb3JlID49IGVkZ2VzOyBiZWZvcmUtLSApCi0gICAgICAgICAgICBpZiAoIGJlZm9yZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGZvciAoIGFmdGVyID0gZWRnZSArIDE7IGFmdGVyIDwgZWRnZV9saW1pdDsgYWZ0ZXIrKyApCi0gICAgICAgICAgICBpZiAoIGFmdGVyLT5mbGFncyAmIEFGX0VER0VfRE9ORSApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgaWYgKCBiZWZvcmUgPj0gZWRnZXMgJiYgYmVmb3JlIDwgZWRnZSAgICYmCi0gICAgICAgICAgICAgICBhZnRlciA8IGVkZ2VfbGltaXQgJiYgYWZ0ZXIgPiBlZGdlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGFmdGVyLT5vcG9zID09IGJlZm9yZS0+b3BvcyApCi0gICAgICAgICAgICAgIGVkZ2UtPnBvcyA9IGJlZm9yZS0+cG9zOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlZGdlLT5wb3MgPSBiZWZvcmUtPnBvcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggZWRnZS0+b3BvcyAtIGJlZm9yZS0+b3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci0+cG9zIC0gYmVmb3JlLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPm9wb3MgLSBiZWZvcmUtPm9wb3MgKTsKLQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU0VSSUZfTElOSzE6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc25hcHBlZCB0byAlLjJmIgotICAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tICVkIChvcG9zPSUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSAtIGVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtPnBvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgLSBlZGdlcywgYmVmb3JlLT5vcG9zIC8gNjQuMCApKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVkZ2UtPnBvcyA9IGFuY2hvci0+cG9zICsKLSAgICAgICAgICAgICAgICAgICAgICAgICggKCBlZGdlLT5vcG9zIC0gYW5jaG9yLT5vcG9zICsgMTYgKSAmIH4zMSApOwotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU0VSSUZfTElOSzI6IGVkZ2UgJWQgKG9wb3M9JS4yZikiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHNuYXBwZWQgdG8gJS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsIGVkZ2UtPnBvcyAvIDY0LjAgKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBudW1fYWN0aW9ucysrOwotI2VuZGlmCi0gICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotICAgICAgICBpZiAoIGVkZ2UgPiBlZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCB0b3BfdG9fYm90dG9tX2hpbnRpbmcgPyAoIGVkZ2UtPnBvcyA+IGVkZ2VbLTFdLnBvcyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIGVkZ2UtPnBvcyA8IGVkZ2VbLTFdLnBvcyApICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogZG9uJ3QgbW92ZSBpZiBzdGVtIHdvdWxkIChhbG1vc3QpIGRpc2FwcGVhciBvdGhlcndpc2U7ICovCi0gICAgICAgICAgLyogdGhlIGFkLWhvYyB2YWx1ZSAxNiBjb3JyZXNwb25kcyB0byAxLzRweCAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBlZGdlLT5saW5rICYmIEZUX0FCUyggZWRnZS0+bGluay0+cG9zIC0gZWRnZVstMV0ucG9zICkgPiAxNiApCi0gICAgICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBCT1VORDogZWRnZSAlZCAocG9zPSUuMmYpIG1vdmVkIHRvICUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGdlIC0gZWRnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgZWRnZVstMV0ucG9zIC8gNjQuMCApKTsKLQotICAgICAgICAgICAgbnVtX2FjdGlvbnMrKzsKLSNlbmRpZgotICAgICAgICAgICAgZWRnZS0+cG9zID0gZWRnZVstMV0ucG9zOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZWRnZSArIDEgPCBlZGdlX2xpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGVkZ2VbMV0uZmxhZ3MgJiBBRl9FREdFX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAoIHRvcF90b19ib3R0b21faGludGluZyA/ICggZWRnZS0+cG9zIDwgZWRnZVsxXS5wb3MgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCBlZGdlLT5wb3MgPiBlZGdlWzFdLnBvcyApICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogZG9uJ3QgbW92ZSBpZiBzdGVtIHdvdWxkIChhbG1vc3QpIGRpc2FwcGVhciBvdGhlcndpc2U7ICovCi0gICAgICAgICAgLyogdGhlIGFkLWhvYyB2YWx1ZSAxNiBjb3JyZXNwb25kcyB0byAxLzRweCAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBlZGdlLT5saW5rICYmIEZUX0FCUyggZWRnZS0+bGluay0+cG9zIC0gZWRnZVstMV0ucG9zICkgPiAxNiApCi0gICAgICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBCT1VORDogZWRnZSAlZCAocG9zPSUuMmYpIG1vdmVkIHRvICUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGdlIC0gZWRnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgZWRnZVsxXS5wb3MgLyA2NC4wICkpOwotCi0gICAgICAgICAgICBudW1fYWN0aW9ucysrOwotI2VuZGlmCi0KLSAgICAgICAgICAgIGVkZ2UtPnBvcyA9IGVkZ2VbMV0ucG9zOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgaWYgKCAhbnVtX2FjdGlvbnMgKQotICAgICAgRlRfVFJBQ0U1KCggIiAgKG5vbmUpXG4iICkpOwotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgLyogQXBwbHkgdGhlIGNvbXBsZXRlIGhpbnRpbmcgYWxnb3JpdGhtIHRvIGEgbGF0aW4gZ2x5cGguICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2xhdGluX2hpbnRzX2FwcGx5KCBGVF9VSW50ICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgaW50ICAgICAgIGRpbTsKLQotICAgIEFGX0xhdGluQXhpcyAgYXhpczsKLQotCi0gICAgZXJyb3IgPSBhZl9nbHlwaF9oaW50c19yZWxvYWQoIGhpbnRzLCBvdXRsaW5lICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBhbmFseXplIGdseXBoIG91dGxpbmUgKi8KLSAgICBpZiAoIEFGX0hJTlRTX0RPX0hPUklaT05UQUwoIGhpbnRzICkgKQotICAgIHsKLSAgICAgIGF4aXMgID0gJm1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdOwotICAgICAgZXJyb3IgPSBhZl9sYXRpbl9oaW50c19kZXRlY3RfZmVhdHVyZXMoIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMtPndpZHRoX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMtPndpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9ESU1FTlNJT05fSE9SWiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIEFGX0hJTlRTX0RPX1ZFUlRJQ0FMKCBoaW50cyApICkKLSAgICB7Ci0gICAgICBheGlzICA9ICZtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXTsKLSAgICAgIGVycm9yID0gYWZfbGF0aW5faGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLT53aWR0aF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLT53aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRElNRU5TSU9OX1ZFUlQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIGFwcGx5IGJsdWUgem9uZXMgdG8gYmFzZSBjaGFyYWN0ZXJzIG9ubHkgKi8KLSAgICAgIGlmICggISggbWV0cmljcy0+cm9vdC5nbG9iYWxzLT5nbHlwaF9zdHlsZXNbZ2x5cGhfaW5kZXhdICYgQUZfTk9OQkFTRSApICkKLSAgICAgICAgYWZfbGF0aW5faGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKCBoaW50cywgbWV0cmljcyApOwotICAgIH0KLQotICAgIC8qIGdyaWQtZml0IHRoZSBvdXRsaW5lICovCi0gICAgZm9yICggZGltID0gMDsgZGltIDwgQUZfRElNRU5TSU9OX01BWDsgZGltKysgKQotICAgIHsKLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLSAgICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnJlbmRlcl9tb2RlID09IEZUX1JFTkRFUl9NT0RFX05PUk1BTCAmJgotICAgICAgICAgICBBRl9ISU5UU19ET19XQVJQKCBoaW50cyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgewotICAgICAgICBBRl9XYXJwZXJSZWMgIHdhcnBlcjsKLSAgICAgICAgRlRfRml4ZWQgICAgICBzY2FsZTsKLSAgICAgICAgRlRfUG9zICAgICAgICBkZWx0YTsKLQotCi0gICAgICAgIGFmX3dhcnBlcl9jb21wdXRlKCAmd2FycGVyLCBoaW50cywgKEFGX0RpbWVuc2lvbilkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUsICZkZWx0YSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19zY2FsZV9kaW0oIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwgZGVsdGEgKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0jZW5kaWYgLyogQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSICovCi0KLSAgICAgIGlmICggKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogJiYgQUZfSElOVFNfRE9fSE9SSVpPTlRBTCggaGludHMgKSApIHx8Ci0gICAgICAgICAgICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICYmIEFGX0hJTlRTX0RPX1ZFUlRJQ0FMKCBoaW50cyApICkgICApCi0gICAgICB7Ci0gICAgICAgIGFmX2xhdGluX2hpbnRfZWRnZXMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19hbGlnbl9lZGdlX3BvaW50cyggaGludHMsIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICAgIGFmX2dseXBoX2hpbnRzX2FsaWduX3N0cm9uZ19wb2ludHMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19hbGlnbl93ZWFrX3BvaW50cyggaGludHMsIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYWZfZ2x5cGhfaGludHNfc2F2ZSggaGludHMsIG91dGxpbmUgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICBMIEEgVCBJIE4gICBTIEMgUiBJIFAgVCAgIEMgTCBBIFMgUyAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBBRl9ERUZJTkVfV1JJVElOR19TWVNURU1fQ0xBU1MoCi0gICAgYWZfbGF0aW5fd3JpdGluZ19zeXN0ZW1fY2xhc3MsCi0KLSAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLQotICAgIHNpemVvZiAoIEFGX0xhdGluTWV0cmljc1JlYyApLAotCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fSW5pdE1ldHJpY3NGdW5jKSBhZl9sYXRpbl9tZXRyaWNzX2luaXQsICAgICAgICAvKiBzdHlsZV9tZXRyaWNzX2luaXQgICAgKi8KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9TY2FsZU1ldHJpY3NGdW5jKWFmX2xhdGluX21ldHJpY3Nfc2NhbGUsICAgICAgIC8qIHN0eWxlX21ldHJpY3Nfc2NhbGUgICAqLwotICAgIChBRl9Xcml0aW5nU3lzdGVtX0RvbmVNZXRyaWNzRnVuYykgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3R5bGVfbWV0cmljc19kb25lICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fR2V0U3RkV2lkdGhzRnVuYylhZl9sYXRpbl9nZXRfc3RhbmRhcmRfd2lkdGhzLCAvKiBzdHlsZV9tZXRyaWNzX2dldHN0ZHcgKi8KLQotICAgIChBRl9Xcml0aW5nU3lzdGVtX0luaXRIaW50c0Z1bmMpICAgYWZfbGF0aW5faGludHNfaW5pdCwgICAgICAgICAgLyogc3R5bGVfaGludHNfaW5pdCAgICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fQXBwbHlIaW50c0Z1bmMpICBhZl9sYXRpbl9oaW50c19hcHBseSAgICAgICAgICAvKiBzdHlsZV9oaW50c19hcHBseSAgICAgKi8KLSAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsYXRpbi5oIGIvc3JjL2F1dG9maXQvYWZsYXRpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBlMTI1Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmbGF0aW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmxhdGluLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgbGF0aW4gd3JpdGluZyBzeXN0ZW0gICAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEFGTEFUSU5fSF8KLSNkZWZpbmUgQUZMQVRJTl9IXwotCi0jaW5jbHVkZSAiYWZoaW50cy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qIHRoZSBgbGF0aW4nIHdyaXRpbmcgc3lzdGVtICovCi0KLSAgQUZfREVDTEFSRV9XUklUSU5HX1NZU1RFTV9DTEFTUyggYWZfbGF0aW5fd3JpdGluZ19zeXN0ZW1fY2xhc3MgKQotCi0KLSAgLyogY29uc3RhbnRzIGFyZSBnaXZlbiB3aXRoIHVuaXRzX3Blcl9lbSA9PSAyMDQ4IGluIG1pbmQgKi8KLSNkZWZpbmUgQUZfTEFUSU5fQ09OU1RBTlQoIG1ldHJpY3MsIGMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoICggKGMpICogKEZUX0xvbmcpKCAoQUZfTGF0aW5NZXRyaWNzKShtZXRyaWNzKSApLT51bml0c19wZXJfZW0gKSAvIDIwNDggKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgTCBBIFQgSSBOICAgRyBMIE8gQiBBIEwgICBNIEUgVCBSIEkgQyBTICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiAgVGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgY291bGQgYmUgZW1iZWRkZWQgaW4gdGhlIGZpbGUgYGFmbGF0aW4uYyc7Ci0gICAqICB0aGV5IGhhdmUgYmVlbiBtYWRlIHNlbWktcHVibGljIHRvIGFsbG93IGFsdGVybmF0ZSB3cml0aW5nIHN5c3RlbQotICAgKiAgaGludGVycyB0byByZS11c2Ugc29tZSBvZiB0aGVtLgotICAgKi8KLQotCi0jZGVmaW5lIEFGX0xBVElOX0lTX1RPUF9CTFVFKCBiICkgXAotICAgICAgICAgICggKGIpLT5wcm9wZXJ0aWVzICYgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgKQotI2RlZmluZSBBRl9MQVRJTl9JU19TVUJfVE9QX0JMVUUoIGIgKSBcCi0gICAgICAgICAgKCAoYiktPnByb3BlcnRpZXMgJiBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1NVQl9UT1AgKQotI2RlZmluZSBBRl9MQVRJTl9JU19ORVVUUkFMX0JMVUUoIGIgKSBcCi0gICAgICAgICAgKCAoYiktPnByb3BlcnRpZXMgJiBBRl9CTFVFX1BST1BFUlRZX0xBVElOX05FVVRSQUwgKQotI2RlZmluZSBBRl9MQVRJTl9JU19YX0hFSUdIVF9CTFVFKCBiICkgXAotICAgICAgICAgICggKGIpLT5wcm9wZXJ0aWVzICYgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCApCi0jZGVmaW5lIEFGX0xBVElOX0lTX0xPTkdfQkxVRSggYiApIFwKLSAgICAgICAgICAoIChiKS0+cHJvcGVydGllcyAmIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fTE9ORyApCi0KLSNkZWZpbmUgQUZfTEFUSU5fTUFYX1dJRFRIUyAgMTYKLQotCi0jZGVmaW5lIEFGX0xBVElOX0JMVUVfQUNUSVZFICAgICAgKCAxVSA8PCAwICkgLyogem9uZSBoZWlnaHQgaXMgPD0gMy80cHggICAqLwotI2RlZmluZSBBRl9MQVRJTl9CTFVFX1RPUCAgICAgICAgICggMVUgPDwgMSApIC8qIHdlIGhhdmUgYSB0b3AgYmx1ZSB6b25lICAgKi8KLSNkZWZpbmUgQUZfTEFUSU5fQkxVRV9TVUJfVE9QICAgICAoIDFVIDw8IDIgKSAvKiB3ZSBoYXZlIGEgc3Vic2NyaXB0IHRvcCAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmx1ZSB6b25lICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBRl9MQVRJTl9CTFVFX05FVVRSQUwgICAgICggMVUgPDwgMyApIC8qIHdlIGhhdmUgbmV1dHJhbCBibHVlIHpvbmUgKi8KLSNkZWZpbmUgQUZfTEFUSU5fQkxVRV9BREpVU1RNRU5UICAoIDFVIDw8IDQgKSAvKiB1c2VkIGZvciBzY2FsZSBhZGp1c3RtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3B0aW1pemF0aW9uICAgICAgICAgICAgICAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX0xhdGluQmx1ZVJlY18KLSAgewotICAgIEFGX1dpZHRoUmVjICByZWY7Ci0gICAgQUZfV2lkdGhSZWMgIHNob290OwotICAgIEZUX1BvcyAgICAgICBhc2NlbmRlcjsKLSAgICBGVF9Qb3MgICAgICAgZGVzY2VuZGVyOwotICAgIEZUX1VJbnQgICAgICBmbGFnczsKLQotICB9IEFGX0xhdGluQmx1ZVJlYywgKkFGX0xhdGluQmx1ZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9MYXRpbkF4aXNSZWNfCi0gIHsKLSAgICBGVF9GaXhlZCAgICAgICAgIHNjYWxlOwotICAgIEZUX1BvcyAgICAgICAgICAgZGVsdGE7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgIHdpZHRoX2NvdW50OyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHVzZWQgd2lkdGhzICovCi0gICAgQUZfV2lkdGhSZWMgICAgICB3aWR0aHNbQUZfTEFUSU5fTUFYX1dJRFRIU107IC8qIHdpZHRocyBhcnJheSAgICAgICAgICAqLwotICAgIEZUX1BvcyAgICAgICAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQ7ICAgLyogdXNlZCBmb3IgY3JlYXRpbmcgZWRnZXMgKi8KLSAgICBGVF9Qb3MgICAgICAgICAgIHN0YW5kYXJkX3dpZHRoOyAgICAgICAgIC8qIHRoZSBkZWZhdWx0IHN0ZW0gdGhpY2tuZXNzICovCi0gICAgRlRfQm9vbCAgICAgICAgICBleHRyYV9saWdodDsgICAgICAgICAvKiBpcyBzdGFuZGFyZCB3aWR0aCB2ZXJ5IGxpZ2h0PyAqLwotCi0gICAgLyogaWdub3JlZCBmb3IgaG9yaXpvbnRhbCBtZXRyaWNzICovCi0gICAgRlRfVUludCAgICAgICAgICBibHVlX2NvdW50OwotICAgIEFGX0xhdGluQmx1ZVJlYyAgYmx1ZXNbQUZfQkxVRV9TVFJJTkdTRVRfTUFYXTsKLQotICAgIEZUX0ZpeGVkICAgICAgICAgb3JnX3NjYWxlOwotICAgIEZUX1BvcyAgICAgICAgICAgb3JnX2RlbHRhOwotCi0gIH0gQUZfTGF0aW5BeGlzUmVjLCAqQUZfTGF0aW5BeGlzOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX0xhdGluTWV0cmljc1JlY18KLSAgewotICAgIEFGX1N0eWxlTWV0cmljc1JlYyAgcm9vdDsKLSAgICBGVF9VSW50ICAgICAgICAgICAgIHVuaXRzX3Blcl9lbTsKLSAgICBBRl9MYXRpbkF4aXNSZWMgICAgIGF4aXNbQUZfRElNRU5TSU9OX01BWF07Ci0KLSAgfSBBRl9MYXRpbk1ldHJpY3NSZWMsICpBRl9MYXRpbk1ldHJpY3M7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9sYXRpbl9tZXRyaWNzX2luaXQoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgIGZhY2UgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX2xhdGluX21ldHJpY3Nfc2NhbGUoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU2NhbGVyICAgICAgICBzY2FsZXIgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9sYXRpbl9tZXRyaWNzX2NoZWNrX2RpZ2l0cyggQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgIEwgQSBUIEkgTiAgIEcgTCBZIFAgSCAgIEEgTiBBIEwgWSBTIEkgUyAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBBRl9MQVRJTl9ISU5UU19IT1JaX1NOQVAgICAgKCAxVSA8PCAwICkgLyogc3RlbSB3aWR0aCBzbmFwcGluZyAgKi8KLSNkZWZpbmUgQUZfTEFUSU5fSElOVFNfVkVSVF9TTkFQICAgICggMVUgPDwgMSApIC8qIHN0ZW0gaGVpZ2h0IHNuYXBwaW5nICovCi0jZGVmaW5lIEFGX0xBVElOX0hJTlRTX1NURU1fQURKVVNUICAoIDFVIDw8IDIgKSAvKiBzdGVtIHdpZHRoL2hlaWdodCAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRqdXN0bWVudCAgICAgICAgICAgKi8KLSNkZWZpbmUgQUZfTEFUSU5fSElOVFNfTU9OTyAgICAgICAgICggMVUgPDwgMyApIC8qIG1vbm9jaHJvbWUgcmVuZGVyaW5nICovCi0KLQotI2RlZmluZSBBRl9MQVRJTl9ISU5UU19ET19IT1JaX1NOQVAoIGggKSAgICAgICAgICAgICBcCi0gIEFGX0hJTlRTX1RFU1RfT1RIRVIoIGgsIEFGX0xBVElOX0hJTlRTX0hPUlpfU05BUCApCi0KLSNkZWZpbmUgQUZfTEFUSU5fSElOVFNfRE9fVkVSVF9TTkFQKCBoICkgICAgICAgICAgICAgXAotICBBRl9ISU5UU19URVNUX09USEVSKCBoLCBBRl9MQVRJTl9ISU5UU19WRVJUX1NOQVAgKQotCi0jZGVmaW5lIEFGX0xBVElOX0hJTlRTX0RPX1NURU1fQURKVVNUKCBoICkgICAgICAgICAgICAgXAotICBBRl9ISU5UU19URVNUX09USEVSKCBoLCBBRl9MQVRJTl9ISU5UU19TVEVNX0FESlVTVCApCi0KLSNkZWZpbmUgQUZfTEFUSU5fSElOVFNfRE9fTU9OTyggaCApICAgICAgICAgICAgIFwKLSAgQUZfSElOVFNfVEVTVF9PVEhFUiggaCwgQUZfTEFUSU5fSElOVFNfTU9OTyApCi0KLQotICAvKgotICAgKiAgVGhlIG5leHQgZnVuY3Rpb25zIHNob3VsZG4ndCBub3JtYWxseSBiZSBleHBvcnRlZC4gIEhvd2V2ZXIsIG90aGVyCi0gICAqICB3cml0aW5nIHN5c3RlbXMgbWlnaHQgbGlrZSB0byB1c2UgdGhlc2UgZnVuY3Rpb25zIGFzLWlzLgotICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfbGF0aW5faGludHNfbGlua19zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIHdpZHRoX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9XaWR0aFJlYyogICB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfZWRnZXMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9sYXRpbl9oaW50c19kZXRlY3RfZmVhdHVyZXMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIHdpZHRoX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1dpZHRoUmVjKiAgIHdpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKTsKLQotLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogQUZMQVRJTl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsYXRpbjIuYyBiL3NyYy9hdXRvZml0L2FmbGF0aW4yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDI0NDUuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZsYXRpbjIuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MjcgKzAsMCBAQAotLyogQVRURU5USU9OOiBUaGlzIGZpbGUgZG9lc24ndCBjb21waWxlLiAgSXQgaXMgb25seSBoZXJlIGFzIGEgcmVmZXJlbmNlICovCi0vKiAgICAgICAgICAgIG9mIGFuIGFsdGVybmF0aXZlIGxhdGluIGhpbnRpbmcgYWxnb3JpdGhtIHRoYXQgd2FzIGFsd2F5cyAgKi8KLS8qICAgICAgICAgICAgbWFya2VkIGFzIGV4cGVyaW1lbnRhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbGF0aW4yLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBsYXRpbiB3cml0aW5nIHN5c3RlbSAoYm9keSkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgRlRfQURWQU5DRVNfSAotCi0KLSNpZmRlZiBGVF9PUFRJT05fQVVUT0ZJVDIKLQotI2luY2x1ZGUgImFmZ2xvYmFsLmgiCi0jaW5jbHVkZSAiYWZsYXRpbi5oIgotI2luY2x1ZGUgImFmbGF0aW4yLmgiCi0jaW5jbHVkZSAiYWZlcnJvcnMuaCIKLQotCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCi0jaW5jbHVkZSAiYWZ3YXJwLmgiCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2FmbGF0aW4yCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW4yX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICk7Ci0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW4yX2hpbnRzX2xpbmtfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgTCBBIFQgSSBOICAgRyBMIE8gQiBBIEwgICBNIEUgVCBSIEkgQyBTICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW4yX21ldHJpY3NfaW5pdF93aWR0aHMoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSApCi0gIHsKLSAgICAvKiBzY2FuIHRoZSBhcnJheSBvZiBzZWdtZW50cyBpbiBlYWNoIGRpcmVjdGlvbiAqLwotICAgIEFGX0dseXBoSGludHNSZWMgIGhpbnRzWzFdOwotCi0KLSAgICBhZl9nbHlwaF9oaW50c19pbml0KCBoaW50cywgZmFjZS0+bWVtb3J5ICk7Ci0KLSAgICBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS53aWR0aF9jb3VudCA9IDA7Ci0gICAgbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0ud2lkdGhfY291bnQgPSAwOwotCi0gICAgewotICAgICAgRlRfRXJyb3IgICAgICAgICAgICAgZXJyb3I7Ci0gICAgICBGVF9VSW50ICAgICAgICAgICAgICBnbHlwaF9pbmRleDsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgIGRpbTsKLSAgICAgIEFGX0xhdGluTWV0cmljc1JlYyAgIGR1bW15WzFdOwotICAgICAgQUZfU2NhbGVyICAgICAgICAgICAgc2NhbGVyID0gJmR1bW15LT5yb290LnNjYWxlcjsKLQotCi0gICAgICBnbHlwaF9pbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KAotICAgICAgICAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+cm9vdC5zdHlsZV9jbGFzcy0+c3RhbmRhcmRfY2hhciApOwotICAgICAgaWYgKCBnbHlwaF9pbmRleCA9PSAwICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX05PX1NDQUxFICk7Ci0gICAgICBpZiAoIGVycm9yIHx8IGZhY2UtPmdseXBoLT5vdXRsaW5lLm5fcG9pbnRzIDw9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1pFUk8oIGR1bW15ICk7Ci0KLSAgICAgIGR1bW15LT51bml0c19wZXJfZW0gPSBtZXRyaWNzLT51bml0c19wZXJfZW07Ci0gICAgICBzY2FsZXItPnhfc2NhbGUgICAgID0gc2NhbGVyLT55X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBzY2FsZXItPnhfZGVsdGEgICAgID0gc2NhbGVyLT55X2RlbHRhID0gMDsKLSAgICAgIHNjYWxlci0+ZmFjZSAgICAgICAgPSBmYWNlOwotICAgICAgc2NhbGVyLT5yZW5kZXJfbW9kZSA9IEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLSAgICAgIHNjYWxlci0+ZmxhZ3MgICAgICAgPSAwOwotCi0gICAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgKEFGX1N0eWxlTWV0cmljcylkdW1teSApOwotCi0gICAgICBlcnJvciA9IGFmX2dseXBoX2hpbnRzX3JlbG9hZCggaGludHMsICZmYWNlLT5nbHlwaC0+b3V0bGluZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggZGltID0gMDsgZGltIDwgQUZfRElNRU5TSU9OX01BWDsgZGltKysgKQotICAgICAgewotICAgICAgICBBRl9MYXRpbkF4aXMgIGF4aXMgICAgPSAmbWV0cmljcy0+YXhpc1tkaW1dOwotICAgICAgICBBRl9BeGlzSGludHMgIGF4aGludHMgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICAgICAgQUZfU2VnbWVudCAgICBzZWcsIGxpbWl0LCBsaW5rOwotICAgICAgICBGVF9VSW50ICAgICAgIG51bV93aWR0aHMgPSAwOwotCi0KLSAgICAgICAgZXJyb3IgPSBhZl9sYXRpbjJfaGludHNfY29tcHV0ZV9zZWdtZW50cyggaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0RpbWVuc2lvbilkaW0gKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGFmX2xhdGluMl9oaW50c19saW5rX3NlZ21lbnRzKCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0RpbWVuc2lvbilkaW0gKTsKLQotICAgICAgICBzZWcgICA9IGF4aGludHMtPnNlZ21lbnRzOwotICAgICAgICBsaW1pdCA9IHNlZyArIGF4aGludHMtPm51bV9zZWdtZW50czsKLQotICAgICAgICBmb3IgKCA7IHNlZyA8IGxpbWl0OyBzZWcrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBsaW5rID0gc2VnLT5saW5rOwotCi0gICAgICAgICAgLyogd2Ugb25seSBjb25zaWRlciBzdGVtIHNlZ21lbnRzIHRoZXJlISAqLwotICAgICAgICAgIGlmICggbGluayAmJiBsaW5rLT5saW5rID09IHNlZyAmJiBsaW5rID4gc2VnICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIGRpc3Q7Ci0KLQotICAgICAgICAgICAgZGlzdCA9IHNlZy0+cG9zIC0gbGluay0+cG9zOwotICAgICAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICAgICAgaWYgKCBudW1fd2lkdGhzIDwgQUZfTEFUSU5fTUFYX1dJRFRIUyApCi0gICAgICAgICAgICAgIGF4aXMtPndpZHRoc1tudW1fd2lkdGhzKytdLm9yZyA9IGRpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWZfc29ydF93aWR0aHMoIG51bV93aWR0aHMsIGF4aXMtPndpZHRocyApOwotICAgICAgICBheGlzLT53aWR0aF9jb3VudCA9IG51bV93aWR0aHM7Ci0gICAgICB9Ci0KLSAgRXhpdDoKLSAgICAgIGZvciAoIGRpbSA9IDA7IGRpbSA8IEFGX0RJTUVOU0lPTl9NQVg7IGRpbSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfTGF0aW5BeGlzICBheGlzID0gJm1ldHJpY3MtPmF4aXNbZGltXTsKLSAgICAgICAgRlRfUG9zICAgICAgICBzdGR3OwotCi0KLSAgICAgICAgc3RkdyA9ICggYXhpcy0+d2lkdGhfY291bnQgPiAwICkKLSAgICAgICAgICAgICAgICAgPyBheGlzLT53aWR0aHNbMF0ub3JnCi0gICAgICAgICAgICAgICAgIDogQUZfTEFUSU5fQ09OU1RBTlQoIG1ldHJpY3MsIDUwICk7Ci0KLSAgICAgICAgLyogbGV0J3MgdHJ5IDIwJSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggKi8KLSAgICAgICAgYXhpcy0+ZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSBzdGR3IC8gNTsKLSAgICAgICAgYXhpcy0+c3RhbmRhcmRfd2lkdGggICAgICAgICAgPSBzdGR3OwotICAgICAgICBheGlzLT5leHRyYV9saWdodCAgICAgICAgICAgICA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYWZfZ2x5cGhfaGludHNfZG9uZSggaGludHMgKTsKLSAgfQotCi0KLQotI2RlZmluZSBBRl9MQVRJTl9NQVhfVEVTVF9DSEFSQUNURVJTICAxMgotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIgYWZfbGF0aW4yX2JsdWVfY2hhcnNbQUZfTEFUSU5fTUFYX0JMVUVTXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBRl9MQVRJTl9NQVhfVEVTVF9DSEFSQUNURVJTKzFdID0KLSAgewotICAgICJUSEVaT0NRUyIsCi0gICAgIkhFWkxPQ1VTIiwKLSAgICAiZmlqa2RiaCIsCi0gICAgInh6cm9lc2MiLAotICAgICJ4enJvZXNjIiwKLSAgICAicHFnankiCi0gIH07Ci0KLQotICBzdGF0aWMgdm9pZAotICBhZl9sYXRpbjJfbWV0cmljc19pbml0X2JsdWVzKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSApCi0gIHsKLSAgICBGVF9Qb3MgICAgICAgIGZsYXRzIFtBRl9MQVRJTl9NQVhfVEVTVF9DSEFSQUNURVJTXTsKLSAgICBGVF9Qb3MgICAgICAgIHJvdW5kc1tBRl9MQVRJTl9NQVhfVEVTVF9DSEFSQUNURVJTXTsKLSAgICBGVF9JbnQgICAgICAgIG51bV9mbGF0czsKLSAgICBGVF9JbnQgICAgICAgIG51bV9yb3VuZHM7Ci0gICAgRlRfSW50ICAgICAgICBiYjsKLSAgICBBRl9MYXRpbkJsdWUgIGJsdWU7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBBRl9MYXRpbkF4aXMgIGF4aXMgID0gJm1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdOwotICAgIEZUX0dseXBoU2xvdCAgZ2x5cGggPSBmYWNlLT5nbHlwaDsKLQotCi0gICAgLyogd2UgY29tcHV0ZSB0aGUgYmx1ZXMgc2ltcGx5IGJ5IGxvYWRpbmcgZWFjaCBjaGFyYWN0ZXIgZnJvbSB0aGUgICAgICovCi0gICAgLyogJ2FmX2xhdGluMl9ibHVlX2NoYXJzW2JsdWVzXScgc3RyaW5nLCB0aGVuIGNvbXB1dGUgaXRzIHRvcC1tb3N0IG9yICovCi0gICAgLyogYm90dG9tLW1vc3QgcG9pbnRzIChkZXBlbmRpbmcgb24gYEFGX0lTX1RPUF9CTFVFJykgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9UUkFDRTUoKCAiYmx1ZSB6b25lcyBjb21wdXRhdGlvblxuIgotICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09XG5cbiIgKSk7Ci0KLSAgICBmb3IgKCBiYiA9IDA7IGJiIDwgQUZfTEFUSU5fQkxVRV9NQVg7IGJiKysgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqICBwICAgICA9IGFmX2xhdGluMl9ibHVlX2NoYXJzW2JiXTsKLSAgICAgIGNvbnN0IGNoYXIqICBsaW1pdCA9IHAgKyBBRl9MQVRJTl9NQVhfVEVTVF9DSEFSQUNURVJTOwotICAgICAgRlRfUG9zKiAgICAgIGJsdWVfcmVmOwotICAgICAgRlRfUG9zKiAgICAgIGJsdWVfc2hvb3Q7Ci0KLQotICAgICAgRlRfVFJBQ0U1KCggImJsdWUgem9uZSAlZDpcbiIsIGJiICkpOwotCi0gICAgICBudW1fZmxhdHMgID0gMDsKLSAgICAgIG51bV9yb3VuZHMgPSAwOwotCi0gICAgICBmb3IgKCA7IHAgPCBsaW1pdCAmJiAqcDsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXg7Ci0gICAgICAgIEZUX0ludCAgICAgIGJlc3RfcG9pbnQsIGJlc3RfeSwgYmVzdF9maXJzdCwgYmVzdF9sYXN0OwotICAgICAgICBGVF9WZWN0b3IqICBwb2ludHM7Ci0gICAgICAgIEZUX0Jvb2wgICAgIHJvdW5kOwotCi0KLSAgICAgICAgLyogbG9hZCB0aGUgY2hhcmFjdGVyIGluIHRoZSBmYWNlIC0tIHNraXAgdW5rbm93biBvciBlbXB0eSBvbmVzICovCi0gICAgICAgIGdseXBoX2luZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgoIGZhY2UsIChGVF9VSW50KSpwICk7Ci0gICAgICAgIGlmICggZ2x5cGhfaW5kZXggPT0gMCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgRlRfTE9BRF9OT19TQ0FMRSApOwotICAgICAgICBpZiAoIGVycm9yIHx8IGdseXBoLT5vdXRsaW5lLm5fcG9pbnRzIDw9IDAgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIG5vdyBjb21wdXRlIG1pbiBvciBtYXggcG9pbnQgaW5kaWNlcyBhbmQgY29vcmRpbmF0ZXMgKi8KLSAgICAgICAgcG9pbnRzICAgICAgPSBnbHlwaC0+b3V0bGluZS5wb2ludHM7Ci0gICAgICAgIGJlc3RfcG9pbnQgID0gLTE7Ci0gICAgICAgIGJlc3RfeSAgICAgID0gMDsgIC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICAgICAgYmVzdF9maXJzdCAgPSAwOyAgLyogZGl0dG8gKi8KLSAgICAgICAgYmVzdF9sYXN0ICAgPSAwOyAgLyogZGl0dG8gKi8KLQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBubjsKLSAgICAgICAgICBGVF9JbnQgIGZpcnN0ID0gMDsKLSAgICAgICAgICBGVF9JbnQgIGxhc3QgID0gLTE7Ci0KLQotICAgICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBnbHlwaC0+b3V0bGluZS5uX2NvbnRvdXJzOyBmaXJzdCA9IGxhc3QrMSwgbm4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBvbGRfYmVzdF9wb2ludCA9IGJlc3RfcG9pbnQ7Ci0gICAgICAgICAgICBGVF9JbnQgIHBwOwotCi0KLSAgICAgICAgICAgIGxhc3QgPSBnbHlwaC0+b3V0bGluZS5jb250b3Vyc1tubl07Ci0KLSAgICAgICAgICAgIC8qIEF2b2lkIHNpbmdsZS1wb2ludCBjb250b3VycyBzaW5jZSB0aGV5IGFyZSBuZXZlciByYXN0ZXJpemVkLiAqLwotICAgICAgICAgICAgLyogSW4gc29tZSBmb250cywgdGhleSBjb3JyZXNwb25kIHRvIG1hcmsgYXR0YWNobWVudCBwb2ludHMgICAgICovCi0gICAgICAgICAgICAvKiB3aGljaCBhcmUgd2F5IG91dHNpZGUgb2YgdGhlIGdseXBoJ3MgcmVhbCBvdXRsaW5lLiAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggbGFzdCA9PSBmaXJzdCApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGlmICggQUZfTEFUSU5fSVNfVE9QX0JMVUUoIGJiICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmb3IgKCBwcCA9IGZpcnN0OyBwcCA8PSBsYXN0OyBwcCsrICkKLSAgICAgICAgICAgICAgICBpZiAoIGJlc3RfcG9pbnQgPCAwIHx8IHBvaW50c1twcF0ueSA+IGJlc3RfeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmVzdF9wb2ludCA9IHBwOwotICAgICAgICAgICAgICAgICAgYmVzdF95ICAgICA9IHBvaW50c1twcF0ueTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZvciAoIHBwID0gZmlyc3Q7IHBwIDw9IGxhc3Q7IHBwKysgKQotICAgICAgICAgICAgICAgIGlmICggYmVzdF9wb2ludCA8IDAgfHwgcG9pbnRzW3BwXS55IDwgYmVzdF95ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBiZXN0X3BvaW50ID0gcHA7Ci0gICAgICAgICAgICAgICAgICBiZXN0X3kgICAgID0gcG9pbnRzW3BwXS55OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBiZXN0X3BvaW50ICE9IG9sZF9iZXN0X3BvaW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmVzdF9maXJzdCA9IGZpcnN0OwotICAgICAgICAgICAgICBiZXN0X2xhc3QgID0gbGFzdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgJWMgICVkIiwgKnAsIGJlc3RfeSApKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdyBjaGVjayB3aGV0aGVyIHRoZSBwb2ludCBiZWxvbmdzIHRvIGEgc3RyYWlnaHQgb3Igcm91bmQgICAqLwotICAgICAgICAvKiBzZWdtZW50OyB3ZSBmaXJzdCBuZWVkIHRvIGZpbmQgaW4gd2hpY2ggY29udG91ciB0aGUgZXh0cmVtdW0gKi8KLSAgICAgICAgLyogbGllcywgdGhlbiBpbnNwZWN0IGl0cyBwcmV2aW91cyBhbmQgbmV4dCBwb2ludHMgICAgICAgICAgICAgICovCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgIGJlc3RfeCA9IHBvaW50c1tiZXN0X3BvaW50XS54OwotICAgICAgICAgIEZUX0ludCAgc3RhcnQsIGVuZCwgcHJldiwgbmV4dDsKLSAgICAgICAgICBGVF9Qb3MgIGRpc3Q7Ci0KLQotICAgICAgICAgIC8qIG5vdyBsb29rIGZvciB0aGUgcHJldmlvdXMgYW5kIG5leHQgcG9pbnRzIHRoYXQgYXJlIG5vdCBvbiB0aGUgKi8KLSAgICAgICAgICAvKiBzYW1lIFkgY29vcmRpbmF0ZS4gIFRocmVzaG9sZCB0aGUgYGNsb3NlbmVzcycuLi4gICAgICAgICAgICAgICovCi0gICAgICAgICAgc3RhcnQgPSBlbmQgPSBiZXN0X3BvaW50OwotCi0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2ID0gc3RhcnQgLSAxOwotICAgICAgICAgICAgaWYgKCBwcmV2IDwgYmVzdF9maXJzdCApCi0gICAgICAgICAgICAgIHByZXYgPSBiZXN0X2xhc3Q7Ci0KLSAgICAgICAgICAgIGRpc3QgPSBGVF9BQlMoIHBvaW50c1twcmV2XS55IC0gYmVzdF95ICk7Ci0gICAgICAgICAgICAvKiBhY2NlcHQgYSBzbWFsbCBkaXN0YW5jZSBvciBhIHNtYWxsIGFuZ2xlIChib3RoIHZhbHVlcyBhcmUgKi8KLSAgICAgICAgICAgIC8qIGhldXJpc3RpYzsgdmFsdWUgMjAgY29ycmVzcG9uZHMgdG8gYXBwcm94LiAyLjkgZGVncmVlcykgICAqLwotICAgICAgICAgICAgaWYgKCBkaXN0ID4gNSApCi0gICAgICAgICAgICAgIGlmICggRlRfQUJTKCBwb2ludHNbcHJldl0ueCAtIGJlc3RfeCApIDw9IDIwICogZGlzdCApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHN0YXJ0ID0gcHJldjsKLQotICAgICAgICAgIH0gd2hpbGUgKCBzdGFydCAhPSBiZXN0X3BvaW50ICk7Ci0KLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5leHQgPSBlbmQgKyAxOwotICAgICAgICAgICAgaWYgKCBuZXh0ID4gYmVzdF9sYXN0ICkKLSAgICAgICAgICAgICAgbmV4dCA9IGJlc3RfZmlyc3Q7Ci0KLSAgICAgICAgICAgIGRpc3QgPSBGVF9BQlMoIHBvaW50c1tuZXh0XS55IC0gYmVzdF95ICk7Ci0gICAgICAgICAgICBpZiAoIGRpc3QgPiA1ICkKLSAgICAgICAgICAgICAgaWYgKCBGVF9BQlMoIHBvaW50c1tuZXh0XS54IC0gYmVzdF94ICkgPD0gMjAgKiBkaXN0ICkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZW5kID0gbmV4dDsKLQotICAgICAgICAgIH0gd2hpbGUgKCBlbmQgIT0gYmVzdF9wb2ludCApOwotCi0gICAgICAgICAgLyogbm93LCBzZXQgdGhlIGByb3VuZCcgZmxhZyBkZXBlbmRpbmcgb24gdGhlIHNlZ21lbnQncyBraW5kICovCi0gICAgICAgICAgcm91bmQgPSBGVF9CT09MKAotICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCBnbHlwaC0+b3V0bGluZS50YWdzW3N0YXJ0XSApICE9IEZUX0NVUlZFX1RBR19PTiB8fAotICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCBnbHlwaC0+b3V0bGluZS50YWdzWyBlbmQgXSApICE9IEZUX0NVUlZFX1RBR19PTiApOwotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAoJXMpXG4iLCByb3VuZCA/ICJyb3VuZCIgOiAiZmxhdCIgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHJvdW5kICkKLSAgICAgICAgICByb3VuZHNbbnVtX3JvdW5kcysrXSA9IGJlc3RfeTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZsYXRzW251bV9mbGF0cysrXSAgID0gYmVzdF95OwotICAgICAgfQotCi0gICAgICBpZiAoIG51bV9mbGF0cyA9PSAwICYmIG51bV9yb3VuZHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICB3ZSBjb3VsZG4ndCBmaW5kIGEgc2luZ2xlIGdseXBoIHRvIGNvbXB1dGUgdGhpcyBibHVlIHpvbmUsCi0gICAgICAgICAqICB3ZSB3aWxsIHNpbXBseSBpZ25vcmUgaXQgdGhlbgotICAgICAgICAgKi8KLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgZW1wdHlcbiIgKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiB3ZSBoYXZlIGNvbXB1dGVkIHRoZSBjb250ZW50cyBvZiB0aGUgYHJvdW5kcycgYW5kIGBmbGF0cycgdGFibGVzLCAqLwotICAgICAgLyogbm93IGRldGVybWluZSB0aGUgcmVmZXJlbmNlIGFuZCBvdmVyc2hvb3QgcG9zaXRpb24gb2YgdGhlIGJsdWUgLS0gKi8KLSAgICAgIC8qIHdlIHNpbXBseSB0YWtlIHRoZSBtZWRpYW4gdmFsdWUgYWZ0ZXIgYSBzaW1wbGUgc29ydCAgICAgICAgICAgICAgICovCi0gICAgICBhZl9zb3J0X3BvcyggbnVtX3JvdW5kcywgcm91bmRzICk7Ci0gICAgICBhZl9zb3J0X3BvcyggbnVtX2ZsYXRzLCAgZmxhdHMgKTsKLQotICAgICAgYmx1ZSAgICAgICA9ICYgYXhpcy0+Ymx1ZXNbYXhpcy0+Ymx1ZV9jb3VudF07Ci0gICAgICBibHVlX3JlZiAgID0gJiBibHVlLT5yZWYub3JnOwotICAgICAgYmx1ZV9zaG9vdCA9ICYgYmx1ZS0+c2hvb3Qub3JnOwotCi0gICAgICBheGlzLT5ibHVlX2NvdW50Kys7Ci0KLSAgICAgIGlmICggbnVtX2ZsYXRzID09IDAgKQotICAgICAgewotICAgICAgICAqYmx1ZV9yZWYgICA9Ci0gICAgICAgICpibHVlX3Nob290ID0gcm91bmRzW251bV9yb3VuZHMgLyAyXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBudW1fcm91bmRzID09IDAgKQotICAgICAgewotICAgICAgICAqYmx1ZV9yZWYgICA9Ci0gICAgICAgICpibHVlX3Nob290ID0gZmxhdHNbbnVtX2ZsYXRzIC8gMl07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICpibHVlX3JlZiAgID0gZmxhdHNbbnVtX2ZsYXRzIC8gMl07Ci0gICAgICAgICpibHVlX3Nob290ID0gcm91bmRzW251bV9yb3VuZHMgLyAyXTsKLSAgICAgIH0KLQotICAgICAgLyogdGhlcmUgYXJlIHNvbWV0aW1lcyBwcm9ibGVtczogaWYgdGhlIG92ZXJzaG9vdCBwb3NpdGlvbiBvZiB0b3AgICAgICovCi0gICAgICAvKiB6b25lcyBpcyB1bmRlciBpdHMgcmVmZXJlbmNlIHBvc2l0aW9uLCBvciB0aGUgb3Bwb3NpdGUgZm9yIGJvdHRvbSAgKi8KLSAgICAgIC8qIHpvbmVzLiAgV2UgbXVzdCB0aHVzIGNoZWNrIGV2ZXJ5dGhpbmcgdGhlcmUgYW5kIGNvcnJlY3QgdGhlIGVycm9ycyAqLwotICAgICAgaWYgKCAqYmx1ZV9zaG9vdCAhPSAqYmx1ZV9yZWYgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgICByZWYgICAgICA9ICpibHVlX3JlZjsKLSAgICAgICAgRlRfUG9zICAgc2hvb3QgICAgPSAqYmx1ZV9zaG9vdDsKLSAgICAgICAgRlRfQm9vbCAgb3Zlcl9yZWYgPSBGVF9CT09MKCBzaG9vdCA+IHJlZiApOwotCi0KLSAgICAgICAgaWYgKCBBRl9MQVRJTl9JU19UT1BfQkxVRSggYmIgKSBeIG92ZXJfcmVmICkKLSAgICAgICAgewotICAgICAgICAgICpibHVlX3JlZiAgID0KLSAgICAgICAgICAqYmx1ZV9zaG9vdCA9ICggc2hvb3QgKyByZWYgKSAvIDI7Ci0KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBbb3ZlcnNob290IHNtYWxsZXIgdGhhbiByZWZlcmVuY2UsIgotICAgICAgICAgICAgICAgICAgICAgICIgdGFraW5nIG1lYW4gdmFsdWVdXG4iICkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGJsdWUtPmZsYWdzID0gMDsKLSAgICAgIGlmICggQUZfTEFUSU5fSVNfVE9QX0JMVUUoIGJiICkgKQotICAgICAgICBibHVlLT5mbGFncyB8PSBBRl9MQVRJTl9CTFVFX1RPUDsKLQotICAgICAgLyoKLSAgICAgICAqIFRoZSBmb2xsb3dpbmcgZmxhZyBpcyB1c2VkIGxhdGVyIHRvIGFkanVzdCB0aGUgeSBhbmQgeCBzY2FsZXMKLSAgICAgICAqIGluIG9yZGVyIHRvIG9wdGltaXplIHRoZSBwaXhlbCBncmlkIGFsaWdubWVudCBvZiB0aGUgdG9wIG9mIHNtYWxsCi0gICAgICAgKiBsZXR0ZXJzLgotICAgICAgICovCi0gICAgICBpZiAoIEFGX0xBVElOX0lTX1hfSEVJR0hUX0JMVUUoIGJiICkgKQotICAgICAgICBibHVlLT5mbGFncyB8PSBBRl9MQVRJTl9CTFVFX0FESlVTVE1FTlQ7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgICAgLT4gcmVmZXJlbmNlID0gJWxkXG4iCi0gICAgICAgICAgICAgICAgICAiICAgICAgIG92ZXJzaG9vdCA9ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICpibHVlX3JlZiwgKmJsdWVfc2hvb3QgKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sYXRpbjJfbWV0cmljc19jaGVja19kaWdpdHMoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgIGZhY2UgKQotICB7Ci0gICAgRlRfVUludCAgIGk7Ci0gICAgRlRfQm9vbCAgIHN0YXJ0ZWQgPSAwLCBzYW1lX3dpZHRoID0gMTsKLSAgICBGVF9GaXhlZCAgYWR2YW5jZSwgb2xkX2FkdmFuY2UgPSAwOwotCi0KLSAgICAvKiBjaGVjayB3aGV0aGVyIGFsbCBBU0NJSSBkaWdpdHMgaGF2ZSB0aGUgc2FtZSBhZHZhbmNlIHdpZHRoOyAqLwotICAgIC8qIGRpZ2l0IGAwJyBpcyAweDMwIGluIGFsbCBzdXBwb3J0ZWQgY2hhcm1hcHMgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggaSA9IDB4MzA7IGkgPD0gMHgzOTsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBnbHlwaF9pbmRleDsKLQotCi0gICAgICBnbHlwaF9pbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCBpICk7Ci0gICAgICBpZiAoIGdseXBoX2luZGV4ID09IDAgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBGVF9HZXRfQWR2YW5jZSggZmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9OT19ISU5USU5HICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZHZhbmNlICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBzdGFydGVkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBhZHZhbmNlICE9IG9sZF9hZHZhbmNlICkKLSAgICAgICAgewotICAgICAgICAgIHNhbWVfd2lkdGggPSAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9sZF9hZHZhbmNlID0gYWR2YW5jZTsKLSAgICAgICAgc3RhcnRlZCAgICAgPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIG1ldHJpY3MtPnJvb3QuZGlnaXRzX2hhdmVfc2FtZV93aWR0aCA9IHNhbWVfd2lkdGg7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9sYXRpbjJfbWV0cmljc19pbml0KCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfQ2hhck1hcCAgb2xkbWFwID0gZmFjZS0+Y2hhcm1hcDsKLSAgICBGVF9VSW50ICAgICBlZTsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9FbmNvZGluZyAgbGF0aW5fZW5jb2RpbmdzW10gPQotICAgIHsKLSAgICAgIEZUX0VOQ09ESU5HX1VOSUNPREUsCi0gICAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTiwKLSAgICAgIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJELAotICAgICAgRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMSwKLSAgICAgIEZUX0VOQ09ESU5HX05PTkUgIC8qIGVuZCBvZiBsaXN0ICovCi0gICAgfTsKLQotCi0gICAgbWV0cmljcy0+dW5pdHNfcGVyX2VtID0gZmFjZS0+dW5pdHNfcGVyX0VNOwotCi0gICAgLyogZG8gd2UgaGF2ZSBhIGxhdGluIGNoYXJtYXAgaW4gdGhlcmU/ICovCi0gICAgZm9yICggZWUgPSAwOyBsYXRpbl9lbmNvZGluZ3NbZWVdICE9IEZUX0VOQ09ESU5HX05PTkU7IGVlKysgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfU2VsZWN0X0NoYXJtYXAoIGZhY2UsIGxhdGluX2VuY29kaW5nc1tlZV0gKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGFmX2xhdGluMl9tZXRyaWNzX2luaXRfd2lkdGhzKCBtZXRyaWNzLCBmYWNlICk7Ci0gICAgICBhZl9sYXRpbjJfbWV0cmljc19pbml0X2JsdWVzKCBtZXRyaWNzLCBmYWNlICk7Ci0gICAgICBhZl9sYXRpbjJfbWV0cmljc19jaGVja19kaWdpdHMoIG1ldHJpY3MsIGZhY2UgKTsKLSAgICB9Ci0KLSAgICBGVF9TZXRfQ2hhcm1hcCggZmFjZSwgb2xkbWFwICk7Ci0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW4yX21ldHJpY3Nfc2NhbGVfZGltKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU2NhbGVyICAgICAgICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgICBkaW0gKQotICB7Ci0gICAgRlRfRml4ZWQgICAgICBzY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgIGRlbHRhOwotICAgIEFGX0xhdGluQXhpcyAgYXhpczsKLSAgICBGVF9VSW50ICAgICAgIG5uOwotCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgc2NhbGUgPSBzY2FsZXItPnhfc2NhbGU7Ci0gICAgICBkZWx0YSA9IHNjYWxlci0+eF9kZWx0YTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNjYWxlID0gc2NhbGVyLT55X3NjYWxlOwotICAgICAgZGVsdGEgPSBzY2FsZXItPnlfZGVsdGE7Ci0gICAgfQotCi0gICAgYXhpcyA9ICZtZXRyaWNzLT5heGlzW2RpbV07Ci0KLSAgICBpZiAoIGF4aXMtPm9yZ19zY2FsZSA9PSBzY2FsZSAmJiBheGlzLT5vcmdfZGVsdGEgPT0gZGVsdGEgKQotICAgICAgcmV0dXJuOwotCi0gICAgYXhpcy0+b3JnX3NjYWxlID0gc2NhbGU7Ci0gICAgYXhpcy0+b3JnX2RlbHRhID0gZGVsdGE7Ci0KLSAgICAvKgotICAgICAqIGNvcnJlY3QgWSBzY2FsZSB0byBvcHRpbWl6ZSB0aGUgYWxpZ25tZW50IG9mIHRoZSB0b3Agb2Ygc21hbGwKLSAgICAgKiBsZXR0ZXJzIHRvIHRoZSBwaXhlbCBncmlkCi0gICAgICovCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKQotICAgIHsKLSAgICAgIEFGX0xhdGluQXhpcyAgdmF4aXMgPSAmbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF07Ci0gICAgICBBRl9MYXRpbkJsdWUgIGJsdWUgPSBOVUxMOwotCi0KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCB2YXhpcy0+Ymx1ZV9jb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggdmF4aXMtPmJsdWVzW25uXS5mbGFncyAmIEFGX0xBVElOX0JMVUVfQURKVVNUTUVOVCApCi0gICAgICAgIHsKLSAgICAgICAgICBibHVlID0gJnZheGlzLT5ibHVlc1tubl07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBibHVlICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICAgc2NhbGVkOwotICAgICAgICBGVF9Qb3MgICB0aHJlc2hvbGQ7Ci0gICAgICAgIEZUX1BvcyAgIGZpdHRlZDsKLSAgICAgICAgRlRfVUludCAgbGltaXQ7Ci0gICAgICAgIEZUX1VJbnQgIHBwZW07Ci0KLQotICAgICAgICBzY2FsZWQgICAgPSBGVF9NdWxGaXgoIGJsdWUtPnNob290Lm9yZywgc2NhbGVyLT55X3NjYWxlICk7Ci0gICAgICAgIHBwZW0gICAgICA9IG1ldHJpY3MtPnJvb3Quc2NhbGVyLmZhY2UtPnNpemUtPm1ldHJpY3MueF9wcGVtOwotICAgICAgICBsaW1pdCAgICAgPSBtZXRyaWNzLT5yb290Lmdsb2JhbHMtPmluY3JlYXNlX3hfaGVpZ2h0OwotICAgICAgICB0aHJlc2hvbGQgPSA0MDsKLQotICAgICAgICAvKiBpZiB0aGUgYGluY3JlYXNlLXgtaGVpZ2h0JyBwcm9wZXJ0eSBpcyBhY3RpdmUsICovCi0gICAgICAgIC8qIHdlIHJvdW5kIHVwIG11Y2ggbW9yZSBvZnRlbiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgcHBlbSA8PSBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHBwZW0gPj0gQUZfUFJPUF9JTkNSRUFTRV9YX0hFSUdIVF9NSU4gKQotICAgICAgICAgIHRocmVzaG9sZCA9IDUyOwotCi0gICAgICAgIGZpdHRlZCA9ICggc2NhbGVkICsgdGhyZXNob2xkICkgJiB+NjM7Ci0KLSNpZiAxCi0gICAgICAgIGlmICggc2NhbGVkICE9IGZpdHRlZCApCi0gICAgICAgIHsKLSAgICAgICAgICBzY2FsZSA9IEZUX011bERpdiggc2NhbGUsIGZpdHRlZCwgc2NhbGVkICk7Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIj09IHNjYWxlZCB4LXRvcCA9ICUuMmciCi0gICAgICAgICAgICAgICAgICAgICAgIiAgZml0dGVkID0gJS4yZywgc2NhbGluZyA9ICUuNGdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgc2NhbGVkIC8gNjQuMCwgZml0dGVkIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAoIGZpdHRlZCAqIDEuMCApIC8gc2NhbGVkICkpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBheGlzLT5zY2FsZSA9IHNjYWxlOwotICAgIGF4aXMtPmRlbHRhID0gZGVsdGE7Ci0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIueF9zY2FsZSA9IHNjYWxlOwotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIueF9kZWx0YSA9IGRlbHRhOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIueV9zY2FsZSA9IHNjYWxlOwotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIueV9kZWx0YSA9IGRlbHRhOwotICAgIH0KLQotICAgIC8qIHNjYWxlIHRoZSBzdGFuZGFyZCB3aWR0aHMgKi8KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgYXhpcy0+d2lkdGhfY291bnQ7IG5uKysgKQotICAgIHsKLSAgICAgIEFGX1dpZHRoICB3aWR0aCA9IGF4aXMtPndpZHRocyArIG5uOwotCi0KLSAgICAgIHdpZHRoLT5jdXIgPSBGVF9NdWxGaXgoIHdpZHRoLT5vcmcsIHNjYWxlICk7Ci0gICAgICB3aWR0aC0+Zml0ID0gd2lkdGgtPmN1cjsKLSAgICB9Ci0KLSAgICAvKiBhbiBleHRyYS1saWdodCBheGlzIGNvcnJlc3BvbmRzIHRvIGEgc3RhbmRhcmQgd2lkdGggdGhhdCBpcyAqLwotICAgIC8qIHNtYWxsZXIgdGhhbiA1LzggcGl4ZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgYXhpcy0+ZXh0cmFfbGlnaHQgPQotICAgICAgKEZUX0Jvb2wpKCBGVF9NdWxGaXgoIGF4aXMtPnN0YW5kYXJkX3dpZHRoLCBzY2FsZSApIDwgMzIgKyA4ICk7Ci0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApCi0gICAgewotICAgICAgLyogc2NhbGUgdGhlIGJsdWUgem9uZXMgKi8KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBheGlzLT5ibHVlX2NvdW50OyBubisrICkKLSAgICAgIHsKLSAgICAgICAgQUZfTGF0aW5CbHVlICBibHVlID0gJmF4aXMtPmJsdWVzW25uXTsKLSAgICAgICAgRlRfUG9zICAgICAgICBkaXN0OwotCi0KLSAgICAgICAgYmx1ZS0+cmVmLmN1ciAgID0gRlRfTXVsRml4KCBibHVlLT5yZWYub3JnLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICAgIGJsdWUtPnJlZi5maXQgICA9IGJsdWUtPnJlZi5jdXI7Ci0gICAgICAgIGJsdWUtPnNob290LmN1ciA9IEZUX011bEZpeCggYmx1ZS0+c2hvb3Qub3JnLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICAgIGJsdWUtPnNob290LmZpdCA9IGJsdWUtPnNob290LmN1cjsKLSAgICAgICAgYmx1ZS0+ZmxhZ3MgICAgJj0gfkFGX0xBVElOX0JMVUVfQUNUSVZFOwotCi0gICAgICAgIC8qIGEgYmx1ZSB6b25lIGlzIG9ubHkgYWN0aXZlIGlmIGl0IGlzIGxlc3MgdGhhbiAzLzQgcGl4ZWxzIHRhbGwgKi8KLSAgICAgICAgZGlzdCA9IEZUX011bEZpeCggYmx1ZS0+cmVmLm9yZyAtIGJsdWUtPnNob290Lm9yZywgc2NhbGUgKTsKLSAgICAgICAgaWYgKCBkaXN0IDw9IDQ4ICYmIGRpc3QgPj0gLTQ4ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgZGVsdGExLCBkZWx0YTI7Ci0KLSAgICAgICAgICBkZWx0YTEgPSBibHVlLT5zaG9vdC5vcmcgLSBibHVlLT5yZWYub3JnOwotICAgICAgICAgIGRlbHRhMiA9IGRlbHRhMTsKLSAgICAgICAgICBpZiAoIGRlbHRhMSA8IDAgKQotICAgICAgICAgICAgZGVsdGEyID0gLWRlbHRhMjsKLQotICAgICAgICAgIGRlbHRhMiA9IEZUX011bEZpeCggZGVsdGEyLCBzY2FsZSApOwotCi0gICAgICAgICAgaWYgKCBkZWx0YTIgPCAzMiApCi0gICAgICAgICAgICBkZWx0YTIgPSAwOwotICAgICAgICAgIGVsc2UgaWYgKCBkZWx0YTIgPCA2NCApCi0gICAgICAgICAgICBkZWx0YTIgPSAzMiArICggKCAoIGRlbHRhMiAtIDMyICkgKyAxNiApICYgfjMxICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVsdGEyID0gRlRfUElYX1JPVU5EKCBkZWx0YTIgKTsKLQotICAgICAgICAgIGlmICggZGVsdGExIDwgMCApCi0gICAgICAgICAgICBkZWx0YTIgPSAtZGVsdGEyOwotCi0gICAgICAgICAgYmx1ZS0+cmVmLmZpdCAgID0gRlRfUElYX1JPVU5EKCBibHVlLT5yZWYuY3VyICk7Ci0gICAgICAgICAgYmx1ZS0+c2hvb3QuZml0ID0gYmx1ZS0+cmVmLmZpdCArIGRlbHRhMjsKLQotICAgICAgICAgIEZUX1RSQUNFNSgoICI+PiBhY3RpdmF0aW5nIGJsdWUgem9uZSAlZDoiCi0gICAgICAgICAgICAgICAgICAgICAgIiAgcmVmLmN1cj0lLjJnIHJlZi5maXQ9JS4yZyIKLSAgICAgICAgICAgICAgICAgICAgICAiICBzaG9vdC5jdXI9JS4yZyBzaG9vdC5maXQ9JS4yZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICBubiwgYmx1ZS0+cmVmLmN1ciAvIDY0LjAsIGJsdWUtPnJlZi5maXQgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgIGJsdWUtPnNob290LmN1ciAvIDY0LjAsIGJsdWUtPnNob290LmZpdCAvIDY0LjAgKSk7Ci0KLSAgICAgICAgICBibHVlLT5mbGFncyB8PSBBRl9MQVRJTl9CTFVFX0FDVElWRTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW4yX21ldHJpY3Nfc2NhbGUoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgICAgc2NhbGVyICkKLSAgewotICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnJlbmRlcl9tb2RlID0gc2NhbGVyLT5yZW5kZXJfbW9kZTsKLSAgICBtZXRyaWNzLT5yb290LnNjYWxlci5mYWNlICAgICAgICA9IHNjYWxlci0+ZmFjZTsKLSAgICBtZXRyaWNzLT5yb290LnNjYWxlci5mbGFncyAgICAgICA9IHNjYWxlci0+ZmxhZ3M7Ci0KLSAgICBhZl9sYXRpbjJfbWV0cmljc19zY2FsZV9kaW0oIG1ldHJpY3MsIHNjYWxlciwgQUZfRElNRU5TSU9OX0hPUlogKTsKLSAgICBhZl9sYXRpbjJfbWV0cmljc19zY2FsZV9kaW0oIG1ldHJpY3MsIHNjYWxlciwgQUZfRElNRU5TSU9OX1ZFUlQgKTsKLSAgfQotCi0KLSAgLyogRXh0cmFjdCBzdGFuZGFyZF93aWR0aCBmcm9tIHdyaXRpbmcgc3lzdGVtL3NjcmlwdCBzcGVjaWZpYyAqLwotICAvKiBtZXRyaWNzIGNsYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW4yX2dldF9zdGFuZGFyZF93aWR0aHMoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAgICAgc3RkSFcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgICAgIHN0ZFZXICkKLSAgewotICAgIGlmICggc3RkSFcgKQotICAgICAgKnN0ZEhXID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0uc3RhbmRhcmRfd2lkdGg7Ci0KLSAgICBpZiAoIHN0ZFZXICkKLSAgICAgICpzdGRWVyA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdLnN0YW5kYXJkX3dpZHRoOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgIEwgQSBUIEkgTiAgIEcgTCBZIFAgSCAgIEEgTiBBIEwgWSBTIEkgUyAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSAgU09SVF9TRUdNRU5UUwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9sYXRpbjJfaGludHNfY29tcHV0ZV9zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgICAgID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgICAgICAgID0gaGludHMtPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50ICAgICAgID0gTlVMTDsKLSAgICBBRl9TZWdtZW50UmVjIHNlZzA7Ci0gICAgQUZfUG9pbnQqICAgICBjb250b3VyICAgICAgID0gaGludHMtPmNvbnRvdXJzOwotICAgIEFGX1BvaW50KiAgICAgY29udG91cl9saW1pdCA9IGNvbnRvdXIgKyBoaW50cy0+bnVtX2NvbnRvdXJzOwotICAgIEFGX0RpcmVjdGlvbiAgbWFqb3JfZGlyLCBzZWdtZW50X2RpcjsKLQotCi0gICAgRlRfWkVSTyggJnNlZzAgKTsKLSAgICBzZWcwLnNjb3JlID0gMzIwMDA7Ci0gICAgc2VnMC5mbGFncyA9IEFGX0VER0VfTk9STUFMOwotCi0gICAgbWFqb3JfZGlyICAgPSAoQUZfRGlyZWN0aW9uKUZUX0FCUyggYXhpcy0+bWFqb3JfZGlyICk7Ci0gICAgc2VnbWVudF9kaXIgPSBtYWpvcl9kaXI7Ci0KLSAgICBheGlzLT5udW1fc2VnbWVudHMgPSAwOwotCi0gICAgLyogc2V0IHVwICh1LHYpIGluIGVhY2ggcG9pbnQgKi8KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgQUZfUG9pbnQgIHBvaW50ID0gaGludHMtPnBvaW50czsKLSAgICAgIEFGX1BvaW50ICBsaW1pdCA9IHBvaW50ICsgaGludHMtPm51bV9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyBwb2ludCA8IGxpbWl0OyBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPnUgPSBwb2ludC0+Zng7Ci0gICAgICAgIHBvaW50LT52ID0gcG9pbnQtPmZ5OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgQUZfUG9pbnQgIHBvaW50ID0gaGludHMtPnBvaW50czsKLSAgICAgIEFGX1BvaW50ICBsaW1pdCA9IHBvaW50ICsgaGludHMtPm51bV9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyBwb2ludCA8IGxpbWl0OyBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPnUgPSBwb2ludC0+Znk7Ci0gICAgICAgIHBvaW50LT52ID0gcG9pbnQtPmZ4OwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGRvIGVhY2ggY29udG91ciBzZXBhcmF0ZWx5ICovCi0gICAgZm9yICggOyBjb250b3VyIDwgY29udG91cl9saW1pdDsgY29udG91cisrICkKLSAgICB7Ci0gICAgICBBRl9Qb2ludCAgcG9pbnQgICA9ICBjb250b3VyWzBdOwotICAgICAgQUZfUG9pbnQgIHN0YXJ0ICAgPSAgcG9pbnQ7Ci0gICAgICBBRl9Qb2ludCAgbGFzdCAgICA9ICBwb2ludC0+cHJldjsKLQotCi0gICAgICBpZiAoIHBvaW50ID09IGxhc3QgKSAgLyogc2tpcCBzaW5nbGV0b25zIC0tIGp1c3QgaW4gY2FzZSAqLwotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyogYWxyZWFkeSBvbiBhbiBlZGdlID8sIGJhY2t0cmFjayB0byBmaW5kIGl0cyBzdGFydCAqLwotICAgICAgaWYgKCBGVF9BQlMoIHBvaW50LT5pbl9kaXIgKSA9PSBtYWpvcl9kaXIgKQotICAgICAgewotICAgICAgICBwb2ludCA9IHBvaW50LT5wcmV2OwotCi0gICAgICAgIHdoaWxlICggcG9pbnQtPmluX2RpciA9PSBzdGFydC0+aW5fZGlyICkKLSAgICAgICAgICBwb2ludCA9IHBvaW50LT5wcmV2OwotICAgICAgfQotICAgICAgZWxzZSAgLyogb3RoZXJ3aXNlLCBmaW5kIGZpcnN0IHNlZ21lbnQgc3RhcnQsIGlmIGFueSAqLwotICAgICAgewotICAgICAgICB3aGlsZSAoIEZUX0FCUyggcG9pbnQtPm91dF9kaXIgKSAhPSBtYWpvcl9kaXIgKQotICAgICAgICB7Ci0gICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLQotICAgICAgICAgIGlmICggcG9pbnQgPT0gc3RhcnQgKQotICAgICAgICAgICAgZ290byBOZXh0Q29udG91cjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBzdGFydCA9IHBvaW50OwotCi0gICAgICBmb3IgICg7OykKLSAgICAgIHsKLSAgICAgICAgQUZfUG9pbnQgIGZpcnN0OwotICAgICAgICBGVF9Qb3MgICAgbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3Y7Ci0KLSAgICAgICAgLyogd2UncmUgYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IHNlZ21lbnQgKi8KLSAgICAgICAgRlRfQVNTRVJUKCBGVF9BQlMoIHBvaW50LT5vdXRfZGlyICkgPT0gbWFqb3JfZGlyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC0+aW5fZGlyICE9IHBvaW50LT5vdXRfZGlyICk7Ci0gICAgICAgIGZpcnN0ID0gcG9pbnQ7Ci0KLSAgICAgICAgbWluX3UgPSBtYXhfdSA9IHBvaW50LT51OwotICAgICAgICBtaW5fdiA9IG1heF92ID0gcG9pbnQtPnY7Ci0KLSAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLQotICAgICAgICB3aGlsZSAoIHBvaW50LT5vdXRfZGlyID09IGZpcnN0LT5vdXRfZGlyICkKLSAgICAgICAgewotICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0KLSAgICAgICAgICBpZiAoIHBvaW50LT51IDwgbWluX3UgKQotICAgICAgICAgICAgbWluX3UgPSBwb2ludC0+dTsKLQotICAgICAgICAgIGlmICggcG9pbnQtPnUgPiBtYXhfdSApCi0gICAgICAgICAgICBtYXhfdSA9IHBvaW50LT51OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwb2ludC0+diA8IG1pbl92ICkKLSAgICAgICAgICBtaW5fdiA9IHBvaW50LT52OwotCi0gICAgICAgIGlmICggcG9pbnQtPnYgPiBtYXhfdiApCi0gICAgICAgICAgbWF4X3YgPSBwb2ludC0+djsKLQotICAgICAgICAvKiByZWNvcmQgbmV3IHNlZ21lbnQgKi8KLSAgICAgICAgZXJyb3IgPSBhZl9heGlzX2hpbnRzX25ld19zZWdtZW50KCBheGlzLCBtZW1vcnksICZzZWdtZW50ICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBzZWdtZW50WzBdICAgICAgICAgPSBzZWcwOwotICAgICAgICBzZWdtZW50LT5kaXIgICAgICAgPSBmaXJzdC0+b3V0X2RpcjsKLSAgICAgICAgc2VnbWVudC0+Zmlyc3QgICAgID0gZmlyc3Q7Ci0gICAgICAgIHNlZ21lbnQtPmxhc3QgICAgICA9IHBvaW50OwotICAgICAgICBzZWdtZW50LT5wb3MgICAgICAgPSAoRlRfU2hvcnQpKCAoIG1pbl91ICsgbWF4X3UgKSA+PiAxICk7Ci0gICAgICAgIHNlZ21lbnQtPm1pbl9jb29yZCA9IChGVF9TaG9ydCkgbWluX3Y7Ci0gICAgICAgIHNlZ21lbnQtPm1heF9jb29yZCA9IChGVF9TaG9ydCkgbWF4X3Y7Ci0gICAgICAgIHNlZ21lbnQtPmhlaWdodCAgICA9IChGVF9TaG9ydCkoIG1heF92IC0gbWluX3YgKTsKLQotICAgICAgICAvKiBhIHNlZ21lbnQgaXMgcm91bmQgaWYgaXQgZG9lc24ndCBoYXZlIHN1Y2Nlc3NpdmUgKi8KLSAgICAgICAgLyogb24tY3VydmUgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9Qb2ludCAgcHQgICA9IGZpcnN0OwotICAgICAgICAgIEFGX1BvaW50ICBsYXN0ID0gcG9pbnQ7Ci0gICAgICAgICAgRlRfVUludCAgIGYwICAgPSBwdC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0w7Ci0gICAgICAgICAgRlRfVUludCAgIGYxOwotCi0KLSAgICAgICAgICBzZWdtZW50LT5mbGFncyAmPSB+QUZfRURHRV9ST1VORDsKLQotICAgICAgICAgIGZvciAoIDsgcHQgIT0gbGFzdDsgZjAgPSBmMSApCi0gICAgICAgICAgewotICAgICAgICAgICAgcHQgPSBwdC0+bmV4dDsKLSAgICAgICAgICAgIGYxID0gcHQtPmZsYWdzICYgQUZfRkxBR19DT05UUk9MOwotCi0gICAgICAgICAgICBpZiAoICFmMCAmJiAhZjEgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKCBwdCA9PSBsYXN0ICkKLSAgICAgICAgICAgICAgc2VnbWVudC0+ZmxhZ3MgfD0gQUZfRURHRV9ST1VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgIC8qIHRoaXMgY2FuIGhhcHBlbiBpbiB0aGUgY2FzZSBvZiBhIGRlZ2VuZXJhdGUgY29udG91cgotICAgICAgICAqIGUuZy4gYSAyLXBvaW50IHZlcnRpY2FsIGNvbnRvdXIKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKCBwb2ludCA9PSBzdGFydCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoganVtcCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc2VnbWVudCwgaWYgYW55ICovCi0gICAgICAgIHdoaWxlICggRlRfQUJTKCBwb2ludC0+b3V0X2RpciApICE9IG1ham9yX2RpciApCi0gICAgICAgIHsKLSAgICAgICAgICBwb2ludCA9IHBvaW50LT5uZXh0OwotCi0gICAgICAgICAgaWYgKCBwb2ludCA9PSBzdGFydCApCi0gICAgICAgICAgICBnb3RvIE5leHRDb250b3VyOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICBOZXh0Q29udG91cjoKLSAgICAgIDsKLSAgICB9IC8qIGNvbnRvdXJzICovCi0KLSAgICAvKiBub3cgc2xpZ2h0bHkgaW5jcmVhc2UgdGhlIGhlaWdodCBvZiBzZWdtZW50cyB3aGVuIHRoaXMgbWFrZXMgKi8KLSAgICAvKiBzZW5zZSAtLSB0aGlzIGlzIHVzZWQgdG8gYmV0dGVyIGRldGVjdCBhbmQgaWdub3JlIHNlcmlmcyAgICAgKi8KLSAgICB7Ci0gICAgICBBRl9TZWdtZW50ICBzZWdtZW50cyAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICAgIEFGX1NlZ21lbnQgIHNlZ21lbnRzX2VuZCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotCi0KLSAgICAgIGZvciAoIHNlZ21lbnQgPSBzZWdtZW50czsgc2VnbWVudCA8IHNlZ21lbnRzX2VuZDsgc2VnbWVudCsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfUG9pbnQgIGZpcnN0ICAgPSBzZWdtZW50LT5maXJzdDsKLSAgICAgICAgQUZfUG9pbnQgIGxhc3QgICAgPSBzZWdtZW50LT5sYXN0OwotICAgICAgICBBRl9Qb2ludCAgcDsKLSAgICAgICAgRlRfUG9zICAgIGZpcnN0X3YgPSBmaXJzdC0+djsKLSAgICAgICAgRlRfUG9zICAgIGxhc3RfdiAgPSBsYXN0LT52OwotCi0KLSAgICAgICAgaWYgKCBmaXJzdF92IDwgbGFzdF92ICkKLSAgICAgICAgewotICAgICAgICAgIHAgPSBmaXJzdC0+cHJldjsKLSAgICAgICAgICBpZiAoIHAtPnYgPCBmaXJzdF92ICkKLSAgICAgICAgICAgIHNlZ21lbnQtPmhlaWdodCA9IChGVF9TaG9ydCkoIHNlZ21lbnQtPmhlaWdodCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggZmlyc3RfdiAtIHAtPnYgKSA+PiAxICkgKTsKLQotICAgICAgICAgIHAgPSBsYXN0LT5uZXh0OwotICAgICAgICAgIGlmICggcC0+diA+IGxhc3RfdiApCi0gICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBzZWdtZW50LT5oZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHAtPnYgLSBsYXN0X3YgKSA+PiAxICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBwID0gZmlyc3QtPnByZXY7Ci0gICAgICAgICAgaWYgKCBwLT52ID4gZmlyc3RfdiApCi0gICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBzZWdtZW50LT5oZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHAtPnYgLSBmaXJzdF92ICkgPj4gMSApICk7Ci0KLSAgICAgICAgICBwID0gbGFzdC0+bmV4dDsKLSAgICAgICAgICBpZiAoIHAtPnYgPCBsYXN0X3YgKQotICAgICAgICAgICAgc2VnbWVudC0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggc2VnbWVudC0+aGVpZ2h0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCBsYXN0X3YgLSBwLT52ICkgPj4gMSApICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBBRl9TT1JUX1NFR01FTlRTCi0gICAvKiBwbGFjZSBhbGwgc2VnbWVudHMgd2l0aCBhIG5lZ2F0aXZlIGRpcmVjdGlvbiB0byB0aGUgc3RhcnQKLSAgICAqIG9mIHRoZSBhcnJheSwgdXNlZCB0byBzcGVlZCB1cCBzZWdtZW50IGxpbmtpbmcgbGF0ZXIuLi4KLSAgICAqLwotICAgIHsKLSAgICAgIEFGX1NlZ21lbnQgIHNlZ21lbnRzID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgICBGVF9VSW50ICAgICBjb3VudCAgICA9IGF4aXMtPm51bV9zZWdtZW50czsKLSAgICAgIEZUX1VJbnQgICAgIGlpLCBqajsKLQotICAgICAgZm9yICggaWkgPSAwOyBpaSA8IGNvdW50OyBpaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzZWdtZW50c1tpaV0uZGlyID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKCBqaiA9IGlpICsgMTsgamogPCBjb3VudDsgamorKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBzZWdtZW50c1tqal0uZGlyIDwgMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFGX1NlZ21lbnRSZWMgIHRtcDsKLQotCi0gICAgICAgICAgICAgIHRtcCAgICAgICAgICA9IHNlZ21lbnRzW2lpXTsKLSAgICAgICAgICAgICAgc2VnbWVudHNbaWldID0gc2VnbWVudHNbampdOwotICAgICAgICAgICAgICBzZWdtZW50c1tqal0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBqaiA9PSBjb3VudCApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYXhpcy0+bWlkX3NlZ21lbnRzID0gaWk7Ci0gICAgfQotI2VuZGlmCi0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2xhdGluMl9oaW50c19saW5rX3NlZ21lbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzICAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRfbGltaXQgPSBzZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50czsKLSNpZmRlZiBBRl9TT1JUX1NFR01FTlRTCi0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50X21pZCAgID0gc2VnbWVudHMgKyBheGlzLT5taWRfc2VnbWVudHM7Ci0jZW5kaWYKLSAgICBGVF9Qb3MgICAgICAgIGxlbl90aHJlc2hvbGQsIGxlbl9zY29yZTsKLSAgICBBRl9TZWdtZW50ICAgIHNlZzEsIHNlZzI7Ci0KLQotICAgIGxlbl90aHJlc2hvbGQgPSBBRl9MQVRJTl9DT05TVEFOVCggaGludHMtPm1ldHJpY3MsIDggKTsKLSAgICBpZiAoIGxlbl90aHJlc2hvbGQgPT0gMCApCi0gICAgICBsZW5fdGhyZXNob2xkID0gMTsKLQotICAgIGxlbl9zY29yZSA9IEFGX0xBVElOX0NPTlNUQU5UKCBoaW50cy0+bWV0cmljcywgNjAwMCApOwotCi0jaWZkZWYgQUZfU09SVF9TRUdNRU5UUwotICAgIGZvciAoIHNlZzEgPSBzZWdtZW50czsgc2VnMSA8IHNlZ21lbnRfbWlkOyBzZWcxKysgKQotICAgIHsKLSAgICAgIGlmICggc2VnMS0+ZGlyICE9IGF4aXMtPm1ham9yX2RpciApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBmb3IgKCBzZWcyID0gc2VnbWVudF9taWQ7IHNlZzIgPCBzZWdtZW50X2xpbWl0OyBzZWcyKysgKQotI2Vsc2UKLSAgICAvKiBub3cgY29tcGFyZSBlYWNoIHNlZ21lbnQgdG8gdGhlIG90aGVycyAqLwotICAgIGZvciAoIHNlZzEgPSBzZWdtZW50czsgc2VnMSA8IHNlZ21lbnRfbGltaXQ7IHNlZzErKyApCi0gICAgewotICAgICAgaWYgKCBzZWcxLT5kaXIgIT0gYXhpcy0+bWFqb3JfZGlyICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGZvciAoIHNlZzIgPSBzZWdtZW50czsgc2VnMiA8IHNlZ21lbnRfbGltaXQ7IHNlZzIrKyApCi0gICAgICAgIGlmICggc2VnMS0+ZGlyICsgc2VnMi0+ZGlyID09IDAgJiYgc2VnMi0+cG9zID4gc2VnMS0+cG9zICkKLSNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICBwb3MxID0gc2VnMS0+cG9zOwotICAgICAgICAgIEZUX1BvcyAgcG9zMiA9IHNlZzItPnBvczsKLSAgICAgICAgICBGVF9Qb3MgIGRpc3QgPSBwb3MyIC0gcG9zMTsKLQotCi0gICAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgbWluID0gc2VnMS0+bWluX2Nvb3JkOwotICAgICAgICAgICAgRlRfUG9zICBtYXggPSBzZWcxLT5tYXhfY29vcmQ7Ci0gICAgICAgICAgICBGVF9Qb3MgIGxlbiwgc2NvcmU7Ci0KLQotICAgICAgICAgICAgaWYgKCBtaW4gPCBzZWcyLT5taW5fY29vcmQgKQotICAgICAgICAgICAgICBtaW4gPSBzZWcyLT5taW5fY29vcmQ7Ci0KLSAgICAgICAgICAgIGlmICggbWF4ID4gc2VnMi0+bWF4X2Nvb3JkICkKLSAgICAgICAgICAgICAgbWF4ID0gc2VnMi0+bWF4X2Nvb3JkOwotCi0gICAgICAgICAgICBsZW4gPSBtYXggLSBtaW47Ci0gICAgICAgICAgICBpZiAoIGxlbiA+PSBsZW5fdGhyZXNob2xkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2NvcmUgPSBkaXN0ICsgbGVuX3Njb3JlIC8gbGVuOwotICAgICAgICAgICAgICBpZiAoIHNjb3JlIDwgc2VnMS0+c2NvcmUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VnMS0+c2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICBzZWcxLT5saW5rICA9IHNlZzI7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAoIHNjb3JlIDwgc2VnMi0+c2NvcmUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VnMi0+c2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICBzZWcyLT5saW5rICA9IHNlZzE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jaWYgMAotICAgIH0KLSNlbmRpZgotCi0gICAgLyogbm93LCBjb21wdXRlIHRoZSBgc2VyaWYnIHNlZ21lbnRzICovCi0gICAgZm9yICggc2VnMSA9IHNlZ21lbnRzOyBzZWcxIDwgc2VnbWVudF9saW1pdDsgc2VnMSsrICkKLSAgICB7Ci0gICAgICBzZWcyID0gc2VnMS0+bGluazsKLQotICAgICAgaWYgKCBzZWcyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzZWcyLT5saW5rICE9IHNlZzEgKQotICAgICAgICB7Ci0gICAgICAgICAgc2VnMS0+bGluayAgPSBOVUxMOwotICAgICAgICAgIHNlZzEtPnNlcmlmID0gc2VnMi0+bGluazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2xhdGluMl9oaW50c19jb21wdXRlX2VkZ2VzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLSAgICBBRl9MYXRpbkF4aXMgIGxheGlzICA9ICYoKEFGX0xhdGluTWV0cmljcyloaW50cy0+bWV0cmljcyktPmF4aXNbZGltXTsKLQotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMgICAgICA9IGF4aXMtPnNlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudF9saW1pdCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnOwotCi0gICAgQUZfRGlyZWN0aW9uICB1cF9kaXI7Ci0gICAgRlRfRml4ZWQgICAgICBzY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkOwotICAgIEZUX1BvcyAgICAgICAgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkOwotCi0KLSAgICBheGlzLT5udW1fZWRnZXMgPSAwOwotCi0gICAgc2NhbGUgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApID8gaGludHMtPnhfc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoaW50cy0+eV9zY2FsZTsKLQotICAgIHVwX2RpciA9ICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkgPyBBRl9ESVJfVVAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQUZfRElSX1JJR0hUOwotCi0gICAgLyoKLSAgICAgKiAgV2Ugd2FudCB0byBpZ25vcmUgdmVyeSBzbWFsbCAobW9zdGx5IHNlcmlmKSBzZWdtZW50cywgd2UgZG8gdGhhdAotICAgICAqICBieSBpZ25vcmluZyB0aG9zZSB0aGF0IHdob3NlIGxlbmd0aCBpcyBsZXNzIHRoYW4gYSBnaXZlbiBmcmFjdGlvbgotICAgICAqICBvZiB0aGUgc3RhbmRhcmQgd2lkdGguIElmIHRoZXJlIGlzIG5vIHN0YW5kYXJkIHdpZHRoLCB3ZSBpZ25vcmUKLSAgICAgKiAgdGhvc2UgdGhhdCBhcmUgbGVzcyB0aGFuIGEgZ2l2ZW4gc2l6ZSBpbiBwaXhlbHMKLSAgICAgKgotICAgICAqICBhbHNvLCB1bmxpbmsgc2VyaWYgc2VnbWVudHMgdGhhdCBhcmUgbGlua2VkIHRvIHNlZ21lbnRzIGZhcnRoZXIKLSAgICAgKiAgdGhhbiA1MCUgb2YgdGhlIHN0YW5kYXJkIHdpZHRoCi0gICAgICovCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgIHsKLSAgICAgIGlmICggbGF4aXMtPndpZHRoX2NvdW50ID4gMCApCi0gICAgICAgIHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZCA9ICggbGF4aXMtPnN0YW5kYXJkX3dpZHRoICogMTAgKSA+PiA0OwotICAgICAgZWxzZQotICAgICAgICBzZWdtZW50X2xlbmd0aF90aHJlc2hvbGQgPSBGVF9EaXZGaXgoIDY0LCBoaW50cy0+eV9zY2FsZSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBzZWdtZW50X2xlbmd0aF90aHJlc2hvbGQgPSAwOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIHdpbGwgYmVnaW4gYnkgZ2VuZXJhdGluZyBhIHNvcnRlZCB0YWJsZSBvZiBlZGdlcyBmb3IgdGhlICAgICAgICovCi0gICAgLyogY3VycmVudCBkaXJlY3Rpb24uICBUbyBkbyBzbywgd2Ugc2ltcGx5IHNjYW4gZWFjaCBzZWdtZW50IGFuZCB0cnkgKi8KLSAgICAvKiB0byBmaW5kIGFuIGVkZ2UgaW4gb3VyIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXRzIHBvc2l0aW9uLiAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSWYgbm8gZWRnZSBpcyBmb3VuZCwgd2UgY3JlYXRlIGFuZCBpbnNlcnQgYSBuZXcgZWRnZSBpbiB0aGUgICAgICAgKi8KLSAgICAvKiBzb3J0ZWQgdGFibGUuICBPdGhlcndpc2UsIHdlIHNpbXBseSBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIGVkZ2UncyAqLwotICAgIC8qIGxpc3Qgd2hpY2ggd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlIHNlY29uZCBzdGVwIHRvIGNvbXB1dGUgdGhlICAgICovCi0gICAgLyogZWRnZSdzIHByb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE5vdGUgdGhhdCB0aGUgZWRnZXMgdGFibGUgaXMgc29ydGVkIGFsb25nIHRoZSBzZWdtZW50L2VkZ2UgICAgICAgICovCi0gICAgLyogcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA9IEZUX011bEZpeCggbGF4aXMtPmVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSApOwotICAgIGlmICggZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPiA2NCAvIDQgKQotICAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSA2NCAvIDQ7Ci0KLSAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA9IEZUX0RpdkZpeCggZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlICk7Ci0KLSAgICBmb3IgKCBzZWcgPSBzZWdtZW50czsgc2VnIDwgc2VnbWVudF9saW1pdDsgc2VnKysgKQotICAgIHsKLSAgICAgIEFGX0VkZ2UgIGZvdW5kID0gTlVMTDsKLSAgICAgIEZUX0ludCAgIGVlOwotCi0KLSAgICAgIGlmICggc2VnLT5oZWlnaHQgPCBzZWdtZW50X2xlbmd0aF90aHJlc2hvbGQgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyogQSBzcGVjaWFsIGNhc2UgZm9yIHNlcmlmIGVkZ2VzOiBJZiB0aGV5IGFyZSBzbWFsbGVyIHRoYW4gKi8KLSAgICAgIC8qIDEuNSBwaXhlbHMgd2UgaWdub3JlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHNlZy0+c2VyaWYgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGRpc3QgPSBzZWctPnNlcmlmLT5wb3MgLSBzZWctPnBvczsKLQotCi0gICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICBpZiAoIGRpc3QgPj0gbGF4aXMtPnN0YW5kYXJkX3dpZHRoID4+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdW5saW5rIHRoaXMgc2VyaWYsIGl0IGlzIHRvbyBkaXN0YW50IGZyb20gaXRzIHJlZmVyZW5jZSBzdGVtICovCi0gICAgICAgICAgc2VnLT5zZXJpZiA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIDIqc2VnLT5oZWlnaHQgPCAzICogc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkICkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogbG9vayBmb3IgYW4gZWRnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWdtZW50ICovCi0gICAgICBmb3IgKCBlZSA9IDA7IGVlIDwgYXhpcy0+bnVtX2VkZ2VzOyBlZSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfRWRnZSAgZWRnZSA9IGF4aXMtPmVkZ2VzICsgZWU7Ci0gICAgICAgIEZUX1BvcyAgIGRpc3Q7Ci0KLQotICAgICAgICBkaXN0ID0gc2VnLT5wb3MgLSBlZGdlLT5mcG9zOwotICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgaWYgKCBkaXN0IDwgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgJiYgZWRnZS0+ZGlyID09IHNlZy0+ZGlyICkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kID0gZWRnZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoICFmb3VuZCApCi0gICAgICB7Ci0gICAgICAgIEFGX0VkZ2UgICBlZGdlOwotCi0KLSAgICAgICAgLyogaW5zZXJ0IGEgbmV3IGVkZ2UgaW4gdGhlIGxpc3QgYW5kICovCi0gICAgICAgIC8qIHNvcnQgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbiAgICAqLwotICAgICAgICBlcnJvciA9IGFmX2F4aXNfaGludHNfbmV3X2VkZ2UoIGF4aXMsIHNlZy0+cG9zLCBzZWctPmRpciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksICZlZGdlICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIG5ldyBlZGdlJ3MgbGlzdCAqLwotICAgICAgICBGVF9aRVJPKCBlZGdlICk7Ci0KLSAgICAgICAgZWRnZS0+Zmlyc3QgICAgPSBzZWc7Ci0gICAgICAgIGVkZ2UtPmxhc3QgICAgID0gc2VnOwotICAgICAgICBlZGdlLT5kaXIgICAgICA9IHNlZy0+ZGlyOwotICAgICAgICBlZGdlLT5mcG9zICAgICA9IHNlZy0+cG9zOwotICAgICAgICBlZGdlLT5vcG9zICAgICA9IEZUX011bEZpeCggc2VnLT5wb3MsIHNjYWxlICk7Ci0gICAgICAgIGVkZ2UtPnBvcyAgICAgID0gZWRnZS0+b3BvczsKLSAgICAgICAgc2VnLT5lZGdlX25leHQgPSBzZWc7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIGFuIGVkZ2Ugd2FzIGZvdW5kLCBzaW1wbHkgYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBlZGdlJ3MgKi8KLSAgICAgICAgLyogbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBzZWctPmVkZ2VfbmV4dCAgICAgICAgID0gZm91bmQtPmZpcnN0OwotICAgICAgICBmb3VuZC0+bGFzdC0+ZWRnZV9uZXh0ID0gc2VnOwotICAgICAgICBmb3VuZC0+bGFzdCAgICAgICAgICAgID0gc2VnOwotICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEdvb2QsIHdlIHdpbGwgbm93IGNvbXB1dGUgZWFjaCBlZGdlJ3MgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gICAgICovCi0gICAgLyogc2VnbWVudHMgZm91bmQgb24gaXRzIHBvc2l0aW9uLiAgQmFzaWNhbGx5LCB0aGVzZSBhcmU6ICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAtIGVkZ2UncyBtYWluIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIC0gc3RlbSBlZGdlLCBzZXJpZiBlZGdlIG9yIGJvdGggKHdoaWNoIGRlZmF1bHRzIHRvIHN0ZW0gdGhlbikgICAgKi8KLSAgICAvKiAgLSByb3VuZGVkIGVkZ2UsIHN0cmFpZ2h0IG9yIGJvdGggKHdoaWNoIGRlZmF1bHRzIHRvIHN0cmFpZ2h0KSAgICAqLwotICAgIC8qICAtIGxpbmsgZm9yIGVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBzZXQgdGhlIGBlZGdlJyBmaWVsZCBpbiBlYWNoIHNlZ21lbnQgLS0gdGhpcyBpcyAqLwotICAgIC8qIHJlcXVpcmVkIGluIG9yZGVyIHRvIGNvbXB1dGUgZWRnZSBsaW5rcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qCi0gICAgICogTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgbG9vcCBhbmQgc2V0dGluZyB0aGUgYGVkZ2UnIGZpZWxkIG9mIGVhY2gKLSAgICAgKiBzZWdtZW50IGRpcmVjdGx5IGluIHRoZSBjb2RlIGFib3ZlIHNsb3dzIGRvd24gZXhlY3V0aW9uIHNwZWVkIGZvcgotICAgICAqIHNvbWUgcmVhc29ucyBvbiBwbGF0Zm9ybXMgbGlrZSB0aGUgU3VuLgotICAgICAqLwotICAgIHsKLSAgICAgIEFGX0VkZ2UgIGVkZ2VzICAgICAgPSBheGlzLT5lZGdlczsKLSAgICAgIEFGX0VkZ2UgIGVkZ2VfbGltaXQgPSBlZGdlcyArIGF4aXMtPm51bV9lZGdlczsKLSAgICAgIEFGX0VkZ2UgIGVkZ2U7Ci0KLQotICAgICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICAgIHsKLSAgICAgICAgc2VnID0gZWRnZS0+Zmlyc3Q7Ci0gICAgICAgIGlmICggc2VnICkKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlZy0+ZWRnZSA9IGVkZ2U7Ci0gICAgICAgICAgICBzZWcgICAgICAgPSBzZWctPmVkZ2VfbmV4dDsKLQotICAgICAgICAgIH0gd2hpbGUgKCBzZWcgIT0gZWRnZS0+Zmlyc3QgKTsKLSAgICAgIH0KLQotICAgICAgLyogbm93LCBjb21wdXRlIGVhY2ggZWRnZSBwcm9wZXJ0aWVzICovCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGlzX3JvdW5kICAgID0gMDsgIC8qIGRvZXMgaXQgY29udGFpbiByb3VuZCBzZWdtZW50cz8gICAgKi8KLSAgICAgICAgRlRfSW50ICBpc19zdHJhaWdodCA9IDA7ICAvKiBkb2VzIGl0IGNvbnRhaW4gc3RyYWlnaHQgc2VnbWVudHM/ICovCi0jaWYgMAotICAgICAgICBGVF9Qb3MgIHVwcyAgICAgICAgID0gMDsgIC8qIG51bWJlciBvZiB1cHdhcmRzIHNlZ21lbnRzICAgICAgICAgKi8KLSAgICAgICAgRlRfUG9zICBkb3ducyAgICAgICA9IDA7ICAvKiBudW1iZXIgb2YgZG93bndhcmRzIHNlZ21lbnRzICAgICAgICovCi0jZW5kaWYKLQotCi0gICAgICAgIHNlZyA9IGVkZ2UtPmZpcnN0OwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Cb29sICBpc19zZXJpZjsKLQotCi0gICAgICAgICAgLyogY2hlY2sgZm9yIHJvdW5kbmVzcyBvZiBzZWdtZW50ICovCi0gICAgICAgICAgaWYgKCBzZWctPmZsYWdzICYgQUZfRURHRV9ST1VORCApCi0gICAgICAgICAgICBpc19yb3VuZCsrOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlzX3N0cmFpZ2h0Kys7Ci0KLSNpZiAwCi0gICAgICAgICAgLyogY2hlY2sgZm9yIHNlZ21lbnQgZGlyZWN0aW9uICovCi0gICAgICAgICAgaWYgKCBzZWctPmRpciA9PSB1cF9kaXIgKQotICAgICAgICAgICAgdXBzICAgKz0gc2VnLT5tYXhfY29vcmQtc2VnLT5taW5fY29vcmQ7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZG93bnMgKz0gc2VnLT5tYXhfY29vcmQtc2VnLT5taW5fY29vcmQ7Ci0jZW5kaWYKLQotICAgICAgICAgIC8qIGNoZWNrIGZvciBsaW5rcyAtLSBpZiBzZWctPnNlcmlmIGlzIHNldCwgdGhlbiBzZWctPmxpbmsgbXVzdCAqLwotICAgICAgICAgIC8qIGJlIGlnbm9yZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlzX3NlcmlmID0gKEZUX0Jvb2wpKCBzZWctPnNlcmlmICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5zZXJpZi0+ZWRnZSAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+c2VyaWYtPmVkZ2UgIT0gZWRnZSApOwotCi0gICAgICAgICAgaWYgKCAoIHNlZy0+bGluayAmJiBzZWctPmxpbmstPmVkZ2UgKSB8fCBpc19zZXJpZiApCi0gICAgICAgICAgewotICAgICAgICAgICAgQUZfRWRnZSAgICAgZWRnZTI7Ci0gICAgICAgICAgICBBRl9TZWdtZW50ICBzZWcyOwotCi0KLSAgICAgICAgICAgIGVkZ2UyID0gZWRnZS0+bGluazsKLSAgICAgICAgICAgIHNlZzIgID0gc2VnLT5saW5rOwotCi0gICAgICAgICAgICBpZiAoIGlzX3NlcmlmICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VnMiAgPSBzZWctPnNlcmlmOwotICAgICAgICAgICAgICBlZGdlMiA9IGVkZ2UtPnNlcmlmOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGVkZ2UyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfUG9zICBlZGdlX2RlbHRhOwotICAgICAgICAgICAgICBGVF9Qb3MgIHNlZ19kZWx0YTsKLQotCi0gICAgICAgICAgICAgIGVkZ2VfZGVsdGEgPSBlZGdlLT5mcG9zIC0gZWRnZTItPmZwb3M7Ci0gICAgICAgICAgICAgIGlmICggZWRnZV9kZWx0YSA8IDAgKQotICAgICAgICAgICAgICAgIGVkZ2VfZGVsdGEgPSAtZWRnZV9kZWx0YTsKLQotICAgICAgICAgICAgICBzZWdfZGVsdGEgPSBzZWctPnBvcyAtIHNlZzItPnBvczsKLSAgICAgICAgICAgICAgaWYgKCBzZWdfZGVsdGEgPCAwICkKLSAgICAgICAgICAgICAgICBzZWdfZGVsdGEgPSAtc2VnX2RlbHRhOwotCi0gICAgICAgICAgICAgIGlmICggc2VnX2RlbHRhIDwgZWRnZV9kZWx0YSApCi0gICAgICAgICAgICAgICAgZWRnZTIgPSBzZWcyLT5lZGdlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlZGdlMiA9IHNlZzItPmVkZ2U7Ci0KLSAgICAgICAgICAgIGlmICggaXNfc2VyaWYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGdlLT5zZXJpZiAgID0gZWRnZTI7Ci0gICAgICAgICAgICAgIGVkZ2UyLT5mbGFncyB8PSBBRl9FREdFX1NFUklGOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlZGdlLT5saW5rICA9IGVkZ2UyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHNlZyA9IHNlZy0+ZWRnZV9uZXh0OwotCi0gICAgICAgIH0gd2hpbGUgKCBzZWcgIT0gZWRnZS0+Zmlyc3QgKTsKLQotICAgICAgICAvKiBzZXQgdGhlIHJvdW5kL3N0cmFpZ2h0IGZsYWdzICovCi0gICAgICAgIGVkZ2UtPmZsYWdzID0gQUZfRURHRV9OT1JNQUw7Ci0KLSAgICAgICAgaWYgKCBpc19yb3VuZCA+IDAgJiYgaXNfcm91bmQgPj0gaXNfc3RyYWlnaHQgKQotICAgICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfUk9VTkQ7Ci0KLSNpZiAwCi0gICAgICAgIC8qIHNldCB0aGUgZWRnZSdzIG1haW4gZGlyZWN0aW9uICovCi0gICAgICAgIGVkZ2UtPmRpciA9IEFGX0RJUl9OT05FOwotCi0gICAgICAgIGlmICggdXBzID4gZG93bnMgKQotICAgICAgICAgIGVkZ2UtPmRpciA9IChGVF9DaGFyKXVwX2RpcjsKLQotICAgICAgICBlbHNlIGlmICggdXBzIDwgZG93bnMgKQotICAgICAgICAgIGVkZ2UtPmRpciA9IChGVF9DaGFyKS11cF9kaXI7Ci0KLSAgICAgICAgZWxzZSBpZiAoIHVwcyA9PSBkb3ducyApCi0gICAgICAgICAgZWRnZS0+ZGlyID0gMDsgIC8qIGJvdGggdXAgYW5kIGRvd24hICovCi0jZW5kaWYKLQotICAgICAgICAvKiBnZXRzIHJpZCBvZiBzZXJpZnMgaWYgbGluayBpcyBzZXQgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogWFhYOiBUaGlzIGdldHMgcmlkIG9mIG1hbnkgdW5wbGVhc2FudCBhcnRlZmFjdHMhICovCi0gICAgICAgIC8qICAgICAgRXhhbXBsZTogdGhlIGBjJyBpbiBjb3VyLnBmYSBhdCBzaXplIDEzICAgICAqLwotCi0gICAgICAgIGlmICggZWRnZS0+c2VyaWYgJiYgZWRnZS0+bGluayApCi0gICAgICAgICAgZWRnZS0+c2VyaWYgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2xhdGluMl9oaW50c19kZXRlY3RfZmVhdHVyZXMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IGFmX2xhdGluMl9oaW50c19jb21wdXRlX3NlZ21lbnRzKCBoaW50cywgZGltICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGFmX2xhdGluMl9oaW50c19saW5rX3NlZ21lbnRzKCBoaW50cywgZGltICk7Ci0KLSAgICAgIGVycm9yID0gYWZfbGF0aW4yX2hpbnRzX2NvbXB1dGVfZWRnZXMoIGhpbnRzLCBkaW0gKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBhZl9sYXRpbjJfaGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKCBBRl9HbHlwaEhpbnRzICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgID0gJmhpbnRzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXTsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2UgICAgICAgPSBheGlzLT5lZGdlczsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2VfbGltaXQgPSBlZGdlICsgYXhpcy0+bnVtX2VkZ2VzOwotICAgIEFGX0xhdGluQXhpcyAgbGF0aW4gICAgICA9ICZtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXTsKLSAgICBGVF9GaXhlZCAgICAgIHNjYWxlICAgICAgPSBsYXRpbi0+c2NhbGU7Ci0gICAgRlRfUG9zICAgICAgICBiZXN0X2Rpc3QwOyAgLyogaW5pdGlhbCB0aHJlc2hvbGQgKi8KLQotCi0gICAgLyogY29tcHV0ZSB0aGUgaW5pdGlhbCB0aHJlc2hvbGQgYXMgYSBmcmFjdGlvbiBvZiB0aGUgRU0gc2l6ZSAqLwotICAgIGJlc3RfZGlzdDAgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPnVuaXRzX3Blcl9lbSAvIDQwLCBzY2FsZSApOwotCi0gICAgaWYgKCBiZXN0X2Rpc3QwID4gNjQgLyAyICkKLSAgICAgIGJlc3RfZGlzdDAgPSA2NCAvIDI7Ci0KLSAgICAvKiBjb21wdXRlIHdoaWNoIGJsdWUgem9uZXMgYXJlIGFjdGl2ZSwgaS5lLiBoYXZlIHRoZWlyIHNjYWxlZCAqLwotICAgIC8qIHNpemUgPCAzLzQgcGl4ZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBmb3IgZWFjaCBob3Jpem9udGFsIGVkZ2Ugc2VhcmNoIHRoZSBibHVlIHpvbmUgd2hpY2ggaXMgY2xvc2VzdCAqLwotICAgIGZvciAoIDsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgewotICAgICAgRlRfSW50ICAgIGJiOwotICAgICAgQUZfV2lkdGggIGJlc3RfYmx1ZSA9IE5VTEw7Ci0gICAgICBGVF9Qb3MgICAgYmVzdF9kaXN0ID0gYmVzdF9kaXN0MDsKLQotICAgICAgZm9yICggYmIgPSAwOyBiYiA8IEFGX0xBVElOX0JMVUVfTUFYOyBiYisrICkKLSAgICAgIHsKLSAgICAgICAgQUZfTGF0aW5CbHVlICBibHVlID0gbGF0aW4tPmJsdWVzICsgYmI7Ci0gICAgICAgIEZUX0Jvb2wgICAgICAgaXNfdG9wX2JsdWUsIGlzX21ham9yX2RpcjsKLQotCi0gICAgICAgIC8qIHNraXAgaW5hY3RpdmUgYmx1ZSB6b25lcyAoaS5lLiwgdGhvc2UgdGhhdCBhcmUgdG9vIHNtYWxsKSAqLwotICAgICAgICBpZiAoICEoIGJsdWUtPmZsYWdzICYgQUZfTEFUSU5fQkxVRV9BQ1RJVkUgKSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogaWYgaXQgaXMgYSB0b3Agem9uZSwgY2hlY2sgZm9yIHJpZ2h0IGVkZ2VzIC0tIGlmIGl0IGlzIGEgYm90dG9tICovCi0gICAgICAgIC8qIHpvbmUsIGNoZWNrIGZvciBsZWZ0IGVkZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogb2YgY291cnNlLCB0aGF0J3MgZm9yIFRydWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlzX3RvcF9ibHVlICA9IChGVF9CeXRlKSggKCBibHVlLT5mbGFncyAmIEFGX0xBVElOX0JMVUVfVE9QICkgIT0gMCApOwotICAgICAgICBpc19tYWpvcl9kaXIgPSBGVF9CT09MKCBlZGdlLT5kaXIgPT0gYXhpcy0+bWFqb3JfZGlyICk7Ci0KLSAgICAgICAgLyogaWYgaXQgaXMgYSB0b3Agem9uZSwgdGhlIGVkZ2UgbXVzdCBiZSBhZ2FpbnN0IHRoZSBtYWpvciAgICAqLwotICAgICAgICAvKiBkaXJlY3Rpb247IGlmIGl0IGlzIGEgYm90dG9tIHpvbmUsIGl0IG11c3QgYmUgaW4gdGhlIG1ham9yICovCi0gICAgICAgIC8qIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBpc190b3BfYmx1ZSBeIGlzX21ham9yX2RpciApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgICAgIGRpc3Q7Ci0gICAgICAgICAgQUZfV2lkdGggICBjb21wYXJlOwotCi0KLSAgICAgICAgICAvKiBpZiBpdCdzIGEgcm91bmRlZCBlZGdlLCBjb21wYXJlIGl0IHRvIHRoZSBvdmVyc2hvb3QgcG9zaXRpb24gKi8KLSAgICAgICAgICAvKiBpZiBpdCdzIGEgZmxhdCBlZGdlLCBjb21wYXJlIGl0IHRvIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gICAgKi8KLSAgICAgICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ST1VORCApCi0gICAgICAgICAgICBjb21wYXJlID0gJmJsdWUtPnNob290OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbXBhcmUgPSAmYmx1ZS0+cmVmOwotCi0gICAgICAgICAgZGlzdCA9IGVkZ2UtPmZwb3MgLSBjb21wYXJlLT5vcmc7Ci0gICAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgICBkaXN0ID0gRlRfTXVsRml4KCBkaXN0LCBzY2FsZSApOwotICAgICAgICAgIGlmICggZGlzdCA8IGJlc3RfZGlzdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgYmVzdF9kaXN0ID0gZGlzdDsKLSAgICAgICAgICAgIGJlc3RfYmx1ZSA9IGNvbXBhcmU7Ci0gICAgICAgICAgfQotCi0jaWYgMAotICAgICAgICAgIC8qIG5vdywgY29tcGFyZSBpdCB0byB0aGUgb3ZlcnNob290IHBvc2l0aW9uIGlmIHRoZSBlZGdlIGlzICAgICAqLwotICAgICAgICAgIC8qIHJvdW5kZWQsIGFuZCBpZiB0aGUgZWRnZSBpcyBvdmVyIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gb2YgYSAqLwotICAgICAgICAgIC8qIHRvcCB6b25lLCBvciB1bmRlciB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIG9mIGEgYm90dG9tIHpvbmUgICAqLwotICAgICAgICAgIGlmICggZWRnZS0+ZmxhZ3MgJiBBRl9FREdFX1JPVU5EICYmIGRpc3QgIT0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfQm9vbCAgaXNfdW5kZXJfcmVmID0gRlRfQk9PTCggZWRnZS0+ZnBvcyA8IGJsdWUtPnJlZi5vcmcgKTsKLQotCi0gICAgICAgICAgICBpZiAoIGlzX3RvcF9ibHVlIF4gaXNfdW5kZXJfcmVmICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmx1ZSA9IGxhdGluLT5ibHVlcyArIGJiOwotICAgICAgICAgICAgICBkaXN0ID0gZWRnZS0+ZnBvcyAtIGJsdWUtPnNob290Lm9yZzsKLSAgICAgICAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgICAgICAgIGRpc3QgPSBGVF9NdWxGaXgoIGRpc3QsIHNjYWxlICk7Ci0gICAgICAgICAgICAgIGlmICggZGlzdCA8IGJlc3RfZGlzdCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZXN0X2Rpc3QgPSBkaXN0OwotICAgICAgICAgICAgICAgIGJlc3RfYmx1ZSA9ICYgYmx1ZS0+c2hvb3Q7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGJlc3RfYmx1ZSApCi0gICAgICAgIGVkZ2UtPmJsdWVfZWRnZSA9IGJlc3RfYmx1ZTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9sYXRpbjJfaGludHNfaW5pdCggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZTsKLSAgICBGVF9VSW50MzIgICAgICAgc2NhbGVyX2ZsYWdzLCBvdGhlcl9mbGFnczsKLSAgICBGVF9GYWNlICAgICAgICAgZmFjZSA9IG1ldHJpY3MtPnJvb3Quc2NhbGVyLmZhY2U7Ci0KLQotICAgIGFmX2dseXBoX2hpbnRzX3Jlc2NhbGUoIGhpbnRzLCAoQUZfU3R5bGVNZXRyaWNzKW1ldHJpY3MgKTsKLQotICAgIC8qCi0gICAgICogIGNvcnJlY3QgeF9zY2FsZSBhbmQgeV9zY2FsZSBpZiBuZWVkZWQsIHNpbmNlIHRoZXkgbWF5IGhhdmUKLSAgICAgKiAgYmVlbiBtb2RpZmllZCBgYWZfbGF0aW4yX21ldHJpY3Nfc2NhbGVfZGltJyBhYm92ZQotICAgICAqLwotICAgIGhpbnRzLT54X3NjYWxlID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uc2NhbGU7Ci0gICAgaGludHMtPnhfZGVsdGEgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS5kZWx0YTsKLSAgICBoaW50cy0+eV9zY2FsZSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdLnNjYWxlOwotICAgIGhpbnRzLT55X2RlbHRhID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0uZGVsdGE7Ci0KLSAgICAvKiBjb21wdXRlIGZsYWdzIGRlcGVuZGluZyBvbiByZW5kZXIgbW9kZSwgZXRjLiAqLwotICAgIG1vZGUgPSBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZTsKLQotI2lmIDAgLyogI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUiAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCi0gICAgICBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZSA9IG1vZGUgPSBGVF9SRU5ERVJfTU9ERV9OT1JNQUw7Ci0jZW5kaWYKLQotICAgIHNjYWxlcl9mbGFncyA9IGhpbnRzLT5zY2FsZXJfZmxhZ3M7Ci0gICAgb3RoZXJfZmxhZ3MgID0gMDsKLQotICAgIC8qCi0gICAgICogIFdlIHNuYXAgdGhlIHdpZHRoIG9mIHZlcnRpY2FsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgaG9yaXpvbnRhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19IT1JaX1NOQVA7Ci0KLSAgICAvKgotICAgICAqICBXZSBzbmFwIHRoZSB3aWR0aCBvZiBob3Jpem9udGFsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgdmVydGljYWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCi0gICAgICovCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19WRVJUX1NOQVA7Ci0KLSAgICAvKgotICAgICAqICBXZSBhZGp1c3Qgc3RlbXMgdG8gZnVsbCBwaXhlbHMgdW5sZXNzIGluIGBsaWdodCcgb3IgYGxjZCcgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgJiYgbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MQ0QgKQotICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfU1RFTV9BREpVU1Q7Ci0KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19NT05POwotCi0gICAgLyoKLSAgICAgKiAgSW4gYGxpZ2h0JyBvciBgbGNkJyBtb2RlIHdlIGRpc2FibGUgaG9yaXpvbnRhbCBoaW50aW5nIGNvbXBsZXRlbHkuCi0gICAgICogIFdlIGFsc28gZG8gaXQgaWYgdGhlIGZhY2UgaXMgaXRhbGljLgotICAgICAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCB8fAotICAgICAgICAgKCBmYWNlLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfSVRBTElDICkgIT0gMCAgICAgICAgICApCi0gICAgICBzY2FsZXJfZmxhZ3MgfD0gQUZfU0NBTEVSX0ZMQUdfTk9fSE9SSVpPTlRBTDsKLQotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUgotICAgIC8qIGdldCAoZ2xvYmFsKSB3YXJwZXIgZmxhZyAqLwotICAgIGlmICggIW1ldHJpY3MtPnJvb3QuZ2xvYmFscy0+bW9kdWxlLT53YXJwaW5nICkKLSAgICAgIHNjYWxlcl9mbGFncyB8PSBBRl9TQ0FMRVJfRkxBR19OT19XQVJQRVI7Ci0jZW5kaWYKLQotICAgIGhpbnRzLT5zY2FsZXJfZmxhZ3MgPSBzY2FsZXJfZmxhZ3M7Ci0gICAgaGludHMtPm90aGVyX2ZsYWdzICA9IG90aGVyX2ZsYWdzOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgTCBBIFQgSSBOICAgRyBMIFkgUCBIICAgRyBSIEkgRCAtIEYgSSBUIFQgSSBOIEcgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHNuYXAgYSBnaXZlbiB3aWR0aCBpbiBzY2FsZWQgY29vcmRpbmF0ZXMgdG8gb25lIG9mIHRoZSAqLwotICAvKiBjdXJyZW50IHN0YW5kYXJkIHdpZHRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgRlRfUG9zCi0gIGFmX2xhdGluMl9zbmFwX3dpZHRoKCBBRl9XaWR0aCAgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgIHdpZHRoICkKLSAgewotICAgIEZUX1VJbnQgIG47Ci0gICAgRlRfUG9zICAgYmVzdCAgICAgID0gNjQgKyAzMiArIDI7Ci0gICAgRlRfUG9zICAgcmVmZXJlbmNlID0gd2lkdGg7Ci0gICAgRlRfUG9zICAgc2NhbGVkOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgdzsKLSAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICB3ID0gd2lkdGhzW25dLmN1cjsKLSAgICAgIGRpc3QgPSB3aWR0aCAtIHc7Ci0gICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgZGlzdCA9IC1kaXN0OwotICAgICAgaWYgKCBkaXN0IDwgYmVzdCApCi0gICAgICB7Ci0gICAgICAgIGJlc3QgICAgICA9IGRpc3Q7Ci0gICAgICAgIHJlZmVyZW5jZSA9IHc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc2NhbGVkID0gRlRfUElYX1JPVU5EKCByZWZlcmVuY2UgKTsKLQotICAgIGlmICggd2lkdGggPj0gcmVmZXJlbmNlICkKLSAgICB7Ci0gICAgICBpZiAoIHdpZHRoIDwgc2NhbGVkICsgNDggKQotICAgICAgICB3aWR0aCA9IHJlZmVyZW5jZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggd2lkdGggPiBzY2FsZWQgLSA0OCApCi0gICAgICAgIHdpZHRoID0gcmVmZXJlbmNlOwotICAgIH0KLQotICAgIHJldHVybiB3aWR0aDsKLSAgfQotCi0KLSAgLyogY29tcHV0ZSB0aGUgc25hcHBlZCB3aWR0aCBvZiBhIGdpdmVuIHN0ZW0gKi8KLQotICBzdGF0aWMgRlRfUG9zCi0gIGFmX2xhdGluMl9jb21wdXRlX3N0ZW1fd2lkdGgoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBiYXNlX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBzdGVtX2ZsYWdzICkKLSAgewotICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcyAgPSAoQUZfTGF0aW5NZXRyaWNzKSBoaW50cy0+bWV0cmljczsKLSAgICBBRl9MYXRpbkF4aXMgICAgIGF4aXMgICAgID0gJiBtZXRyaWNzLT5heGlzW2RpbV07Ci0gICAgRlRfUG9zICAgICAgICAgICBkaXN0ICAgICA9IHdpZHRoOwotICAgIEZUX0ludCAgICAgICAgICAgc2lnbiAgICAgPSAwOwotICAgIEZUX0ludCAgICAgICAgICAgdmVydGljYWwgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApOwotCi0gICAgRlRfVU5VU0VEKCBiYXNlX2ZsYWdzICk7Ci0KLQotICAgIGlmICggIUFGX0xBVElOX0hJTlRTX0RPX1NURU1fQURKVVNUKCBoaW50cyApIHx8Ci0gICAgICAgICAgYXhpcy0+ZXh0cmFfbGlnaHQgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgcmV0dXJuIHdpZHRoOwotCi0gICAgaWYgKCBkaXN0IDwgMCApCi0gICAgewotICAgICAgZGlzdCA9IC13aWR0aDsKLSAgICAgIHNpZ24gPSAxOwotICAgIH0KLQotICAgIGlmICggKCAgdmVydGljYWwgJiYgIUFGX0xBVElOX0hJTlRTX0RPX1ZFUlRfU05BUCggaGludHMgKSApIHx8Ci0gICAgICAgICAoICF2ZXJ0aWNhbCAmJiAhQUZfTEFUSU5fSElOVFNfRE9fSE9SWl9TTkFQKCBoaW50cyApICkgKQotICAgIHsKLSAgICAgIC8qIHNtb290aCBoaW50aW5nIHByb2Nlc3M6IHZlcnkgbGlnaHRseSBxdWFudGl6ZSB0aGUgc3RlbSB3aWR0aCAqLwotCi0gICAgICAvKiBsZWF2ZSB0aGUgd2lkdGhzIG9mIHNlcmlmcyBhbG9uZSAqLwotCi0gICAgICBpZiAoICggc3RlbV9mbGFncyAmIEFGX0VER0VfU0VSSUYgKSAmJiB2ZXJ0aWNhbCAmJiAoIGRpc3QgPCAzICogNjQgKSApCi0gICAgICAgIGdvdG8gRG9uZV9XaWR0aDsKLQotI2lmIDAKLSAgICAgIGVsc2UgaWYgKCAoIGJhc2VfZmxhZ3MgJiBBRl9FREdFX1JPVU5EICkgKQotICAgICAgewotICAgICAgICBpZiAoIGRpc3QgPCA4MCApCi0gICAgICAgICAgZGlzdCA9IDY0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGRpc3QgPCA1NiApCi0gICAgICAgIGRpc3QgPSA1NjsKLSNlbmRpZgotICAgICAgaWYgKCBheGlzLT53aWR0aF9jb3VudCA+IDAgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGRlbHRhOwotCi0KLSAgICAgICAgLyogY29tcGFyZSB0byBzdGFuZGFyZCB3aWR0aCAqLwotICAgICAgICBpZiAoIGF4aXMtPndpZHRoX2NvdW50ID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWx0YSA9IGRpc3QgLSBheGlzLT53aWR0aHNbMF0uY3VyOwotCi0gICAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGE7Ci0KLSAgICAgICAgICBpZiAoIGRlbHRhIDwgNDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRpc3QgPSBheGlzLT53aWR0aHNbMF0uY3VyOwotICAgICAgICAgICAgaWYgKCBkaXN0IDwgNDggKQotICAgICAgICAgICAgICBkaXN0ID0gNDg7Ci0KLSAgICAgICAgICAgIGdvdG8gRG9uZV9XaWR0aDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRpc3QgPCAzICogNjQgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGEgID0gZGlzdCAmIDYzOwotICAgICAgICAgIGRpc3QgICY9IC02NDsKLQotICAgICAgICAgIGlmICggZGVsdGEgPCAxMCApCi0gICAgICAgICAgICBkaXN0ICs9IGRlbHRhOwotCi0gICAgICAgICAgZWxzZSBpZiAoIGRlbHRhIDwgMzIgKQotICAgICAgICAgICAgZGlzdCArPSAxMDsKLQotICAgICAgICAgIGVsc2UgaWYgKCBkZWx0YSA8IDU0ICkKLSAgICAgICAgICAgIGRpc3QgKz0gNTQ7Ci0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ICs9IGRlbHRhOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHN0cm9uZyBoaW50aW5nIHByb2Nlc3M6IHNuYXAgdGhlIHN0ZW0gd2lkdGggdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICAgIEZUX1BvcyAgb3JnX2Rpc3QgPSBkaXN0OwotCi0KLSAgICAgIGRpc3QgPSBhZl9sYXRpbjJfc25hcF93aWR0aCggYXhpcy0+d2lkdGhzLCBheGlzLT53aWR0aF9jb3VudCwgZGlzdCApOwotCi0gICAgICBpZiAoIHZlcnRpY2FsICkKLSAgICAgIHsKLSAgICAgICAgLyogaW4gdGhlIGNhc2Ugb2YgdmVydGljYWwgaGludGluZywgYWx3YXlzIHJvdW5kICovCi0gICAgICAgIC8qIHRoZSBzdGVtIGhlaWdodHMgdG8gaW50ZWdlciBwaXhlbHMgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggZGlzdCA+PSA2NCApCi0gICAgICAgICAgZGlzdCA9ICggZGlzdCArIDE2ICkgJiB+NjM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXN0ID0gNjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggQUZfTEFUSU5fSElOVFNfRE9fTU9OTyggaGludHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtb25vY2hyb21lIGhvcml6b250YWwgaGludGluZzogc25hcCB3aWR0aHMgdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICAgICAgICAvKiB3aXRoIGEgZGlmZmVyZW50IHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDY0ICkKLSAgICAgICAgICAgIGRpc3QgPSA2NDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBmb3IgaG9yaXpvbnRhbCBhbnRpLWFsaWFzZWQgaGludGluZywgd2UgYWRvcHQgYSBtb3JlIHN1YnRsZSAqLwotICAgICAgICAgIC8qIGFwcHJvYWNoOiB3ZSBzdHJlbmd0aGVuIHNtYWxsIHN0ZW1zLCByb3VuZCBzdGVtcyB3aG9zZSBzaXplICovCi0gICAgICAgICAgLyogaXMgYmV0d2VlbiAxIGFuZCAyIHBpeGVscyB0byBhbiBpbnRlZ2VyLCBvdGhlcndpc2Ugbm90aGluZyAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyA2NCApID4+IDE7Ci0KLSAgICAgICAgICBlbHNlIGlmICggZGlzdCA8IDEyOCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogV2Ugb25seSByb3VuZCB0byBhbiBpbnRlZ2VyIHdpZHRoIGlmIHRoZSBjb3JyZXNwb25kaW5nICovCi0gICAgICAgICAgICAvKiBkaXN0b3J0aW9uIGlzIGxlc3MgdGhhbiAxLzQgcGl4ZWwuICBPdGhlcndpc2UgdGhpcyAgICAgKi8KLSAgICAgICAgICAgIC8qIG1ha2VzIGV2ZXJ5dGhpbmcgd29yc2Ugc2luY2UgdGhlIGRpYWdvbmFscywgd2hpY2ggYXJlICAqLwotICAgICAgICAgICAgLyogbm90IGhpbnRlZCwgYXBwZWFyIGEgbG90IGJvbGRlciBvciB0aGlubmVyIHRoYW4gdGhlICAgICovCi0gICAgICAgICAgICAvKiB2ZXJ0aWNhbCBzdGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgRlRfSW50ICBkZWx0YTsKLQotCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMjIgKSAmIH42MzsKLSAgICAgICAgICAgIGRlbHRhID0gZGlzdCAtIG9yZ19kaXN0OwotICAgICAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgICAgICBkZWx0YSA9IC1kZWx0YTsKLQotICAgICAgICAgICAgaWYgKCBkZWx0YSA+PSAxNiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRpc3QgPSBvcmdfZGlzdDsKLSAgICAgICAgICAgICAgaWYgKCBkaXN0IDwgNDggKQotICAgICAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyA2NCApID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8qIHJvdW5kIG90aGVyd2lzZSB0byBwcmV2ZW50IGNvbG9yIGZyaW5nZXMgaW4gTENEIG1vZGUgKi8KLSAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyAzMiApICYgfjYzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIERvbmVfV2lkdGg6Ci0gICAgaWYgKCBzaWduICkKLSAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgIHJldHVybiBkaXN0OwotICB9Ci0KLQotICAvKiBhbGlnbiBvbmUgc3RlbSBlZGdlIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBzdGVtIGVkZ2UgKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl9sYXRpbjJfYWxpZ25fbGlua2VkX2VkZ2UoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlICAgICAgICBiYXNlX2VkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgc3RlbV9lZGdlICkKLSAgewotICAgIEZUX1BvcyAgZGlzdCA9IHN0ZW1fZWRnZS0+b3BvcyAtIGJhc2VfZWRnZS0+b3BvczsKLQotICAgIEZUX1BvcyAgZml0dGVkX3dpZHRoID0gYWZfbGF0aW4yX2NvbXB1dGVfc3RlbV93aWR0aCggaGludHMsIGRpbSwgZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfZWRnZS0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVtX2VkZ2UtPmZsYWdzICk7Ci0KLQotICAgIHN0ZW1fZWRnZS0+cG9zID0gYmFzZV9lZGdlLT5wb3MgKyBmaXR0ZWRfd2lkdGg7Ci0KLSAgICBGVF9UUkFDRTUoKCAiTElOSzogZWRnZSAlZCAob3Bvcz0lLjJmKSBsaW5rZWQgdG8gKCUuMmYpLCAiCi0gICAgICAgICAgICAgICAgImRpc3Qgd2FzICUuMmYsIG5vdyAlLjJmXG4iLAotICAgICAgICAgICAgICAgIHN0ZW1fZWRnZS1oaW50cy0+YXhpc1tkaW1dLmVkZ2VzLCBzdGVtX2VkZ2UtPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgIHN0ZW1fZWRnZS0+cG9zIC8gNjQuMCwgZGlzdCAvIDY0LjAsIGZpdHRlZF93aWR0aCAvIDY0LjAgKSk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX2xhdGluMl9hbGlnbl9zZXJpZl9lZGdlKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlICAgICAgICBzZXJpZiApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGhpbnRzICk7Ci0KLSAgICBzZXJpZi0+cG9zID0gYmFzZS0+cG9zICsgKCBzZXJpZi0+b3BvcyAtIGJhc2UtPm9wb3MgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICBFIEQgRyBFICAgSCBJIE4gVCBJIE4gRyAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX2xhdGluMl9oaW50X2VkZ2VzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2VzICAgICAgPSBheGlzLT5lZGdlczsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2VfbGltaXQgPSBlZGdlcyArIGF4aXMtPm51bV9lZGdlczsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2U7Ci0gICAgQUZfRWRnZSAgICAgICBhbmNob3IgICAgID0gTlVMTDsKLSAgICBGVF9JbnQgICAgICAgIGhhc19zZXJpZnMgPSAwOwotICAgIEZUX1BvcyAgICAgICAgYW5jaG9yX2RyaWZ0ID0gMDsKLQotCi0KLSAgICBGVF9UUkFDRTUoKCAiPT09PSBoaW50aW5nICVzIGVkZ2VzID09PT09XG4iLAotICAgICAgICAgICAgICAgIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiA/ICJ2ZXJ0aWNhbCIgOiAiaG9yaXpvbnRhbCIgKSk7Ci0KLSAgICAvKiB3ZSBiZWdpbiBieSBhbGlnbmluZyBhbGwgc3RlbXMgcmVsYXRpdmUgdG8gdGhlIGJsdWUgem9uZSAqLwotICAgIC8qIGlmIG5lZWRlZCAtLSB0aGF0J3Mgb25seSBmb3IgaG9yaXpvbnRhbCBlZGdlcyAgICAgICAgICAgICovCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCAmJiBBRl9ISU5UU19ET19CTFVFUyggaGludHMgKSApCi0gICAgewotICAgICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfV2lkdGggIGJsdWU7Ci0gICAgICAgIEFGX0VkZ2UgICBlZGdlMSwgZWRnZTI7Ci0KLQotICAgICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBibHVlICA9IGVkZ2UtPmJsdWVfZWRnZTsKLSAgICAgICAgZWRnZTEgPSBOVUxMOwotICAgICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7Ci0KLSAgICAgICAgaWYgKCBibHVlICkKLSAgICAgICAgewotICAgICAgICAgIGVkZ2UxID0gZWRnZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggZWRnZTIgJiYgZWRnZTItPmJsdWVfZWRnZSApCi0gICAgICAgIHsKLSAgICAgICAgICBibHVlICA9IGVkZ2UyLT5ibHVlX2VkZ2U7Ci0gICAgICAgICAgZWRnZTEgPSBlZGdlMjsKLSAgICAgICAgICBlZGdlMiA9IGVkZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICFlZGdlMSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgRlRfVFJBQ0U1KCggIkJMVUU6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc25hcHBlZCB0byAoJS4yZiksICIKLSAgICAgICAgICAgICAgICAgICAgIndhcyAoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgIGVkZ2UxLWVkZ2VzLCBlZGdlMS0+b3BvcyAvIDY0LjAsIGJsdWUtPmZpdCAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgIGVkZ2UxLT5wb3MgLyA2NC4wICkpOwotCi0gICAgICAgIGVkZ2UxLT5wb3MgICAgPSBibHVlLT5maXQ7Ci0gICAgICAgIGVkZ2UxLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0KLSAgICAgICAgaWYgKCBlZGdlMiAmJiAhZWRnZTItPmJsdWVfZWRnZSApCi0gICAgICAgIHsKLSAgICAgICAgICBhZl9sYXRpbjJfYWxpZ25fbGlua2VkX2VkZ2UoIGhpbnRzLCBkaW0sIGVkZ2UxLCBlZGdlMiApOwotICAgICAgICAgIGVkZ2UyLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICFhbmNob3IgKQotICAgICAgICB7Ci0gICAgICAgICAgYW5jaG9yID0gZWRnZTsKLQotICAgICAgICAgIGFuY2hvcl9kcmlmdCA9ICggYW5jaG9yLT5wb3MgLSBhbmNob3ItPm9wb3MgKTsKLSAgICAgICAgICBpZiAoIGVkZ2UyICkKLSAgICAgICAgICAgIGFuY2hvcl9kcmlmdCA9ICggYW5jaG9yX2RyaWZ0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBlZGdlMi0+cG9zIC0gZWRnZTItPm9wb3MgKSApID4+IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBub3cgd2Ugd2lsbCBhbGlnbiBhbGwgc3RlbSBlZGdlcywgdHJ5aW5nIHRvIG1haW50YWluIHRoZSAqLwotICAgIC8qIHJlbGF0aXZlIG9yZGVyIG9mIHN0ZW1zIGluIHRoZSBnbHlwaCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICB7Ci0gICAgICBBRl9FZGdlICBlZGdlMjsKLQotCi0gICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIHNraXAgYWxsIG5vbi1zdGVtIGVkZ2VzICovCi0gICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7Ci0gICAgICBpZiAoICFlZGdlMiApCi0gICAgICB7Ci0gICAgICAgIGhhc19zZXJpZnMrKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBhbGlnbiB0aGUgc3RlbSAqLwotCi0gICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgaXQncyBiZXR0ZXIgdG8gYmUgc2FmZSAqLwotICAgICAgaWYgKCBlZGdlMi0+Ymx1ZV9lZGdlICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U1KCggIkFTU0VSVElPTiBGQUlMRUQgZm9yIGVkZ2UgJWRcbiIsIGVkZ2UyLWVkZ2VzICkpOwotCi0gICAgICAgIGFmX2xhdGluMl9hbGlnbl9saW5rZWRfZWRnZSggaGludHMsIGRpbSwgZWRnZTIsIGVkZ2UgKTsKLSAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhYW5jaG9yICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBvcmdfbGVuLCBvcmdfY2VudGVyLCBjdXJfbGVuOwotICAgICAgICBGVF9Qb3MgIGN1cl9wb3MxLCBlcnJvcjEsIGVycm9yMiwgdV9vZmYsIGRfb2ZmOwotCi0KLSAgICAgICAgb3JnX2xlbiA9IGVkZ2UyLT5vcG9zIC0gZWRnZS0+b3BvczsKLSAgICAgICAgY3VyX2xlbiA9IGFmX2xhdGluMl9jb21wdXRlX3N0ZW1fd2lkdGgoIGhpbnRzLCBkaW0sIG9yZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UyLT5mbGFncyApOwotICAgICAgICBpZiAoIGN1cl9sZW4gPD0gNjQgKQotICAgICAgICAgIHVfb2ZmID0gZF9vZmYgPSAzMjsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdV9vZmYgPSAzODsKLSAgICAgICAgICBkX29mZiA9IDI2OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjdXJfbGVuIDwgOTYgKQotICAgICAgICB7Ci0gICAgICAgICAgb3JnX2NlbnRlciA9IGVkZ2UtPm9wb3MgKyAoIG9yZ19sZW4gPj4gMSApOwotCi0gICAgICAgICAgY3VyX3BvczEgICA9IEZUX1BJWF9ST1VORCggb3JnX2NlbnRlciApOwotCi0gICAgICAgICAgZXJyb3IxID0gb3JnX2NlbnRlciAtICggY3VyX3BvczEgLSB1X29mZiApOwotICAgICAgICAgIGlmICggZXJyb3IxIDwgMCApCi0gICAgICAgICAgICBlcnJvcjEgPSAtZXJyb3IxOwotCi0gICAgICAgICAgZXJyb3IyID0gb3JnX2NlbnRlciAtICggY3VyX3BvczEgKyBkX29mZiApOwotICAgICAgICAgIGlmICggZXJyb3IyIDwgMCApCi0gICAgICAgICAgICBlcnJvcjIgPSAtZXJyb3IyOwotCi0gICAgICAgICAgaWYgKCBlcnJvcjEgPCBlcnJvcjIgKQotICAgICAgICAgICAgY3VyX3BvczEgLT0gdV9vZmY7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY3VyX3BvczEgKz0gZF9vZmY7Ci0KLSAgICAgICAgICBlZGdlLT5wb3MgID0gY3VyX3BvczEgLSBjdXJfbGVuIC8gMjsKLSAgICAgICAgICBlZGdlMi0+cG9zID0gZWRnZS0+cG9zICsgY3VyX2xlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgZWRnZS0+cG9zID0gRlRfUElYX1JPVU5EKCBlZGdlLT5vcG9zICk7Ci0KLSAgICAgICAgRlRfVFJBQ0U1KCggIkFOQ0hPUjogZWRnZSAlZCAob3Bvcz0lLjJmKSBhbmQgJWQgKG9wb3M9JS4yZikiCi0gICAgICAgICAgICAgICAgICAgICIgc25hcHBlZCB0byAoJS4yZikgKCUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICBlZGdlLWVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgZWRnZTItZWRnZXMsIGVkZ2UyLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCwgZWRnZTItPnBvcyAvIDY0LjAgKSk7Ci0gICAgICAgIGFuY2hvciA9IGVkZ2U7Ci0KLSAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotCi0gICAgICAgIGFmX2xhdGluMl9hbGlnbl9saW5rZWRfZWRnZSggaGludHMsIGRpbSwgZWRnZSwgZWRnZTIgKTsKLQotICAgICAgICBlZGdlMi0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotCi0gICAgICAgIGFuY2hvcl9kcmlmdCA9ICggKCBhbmNob3ItPnBvcyAtIGFuY2hvci0+b3BvcyApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAoIGVkZ2UyLT5wb3MgLSBlZGdlMi0+b3BvcyApICkgPj4gMTsKLQotICAgICAgICBGVF9UUkFDRTUoKCAiRFJJRlQ6ICUuMmZcbiIsIGFuY2hvcl9kcmlmdC82NC4wICkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9Qb3MgICBvcmdfcG9zLCBvcmdfbGVuLCBvcmdfY2VudGVyLCBjdXJfY2VudGVyLCBjdXJfbGVuOwotICAgICAgICBGVF9Qb3MgICBvcmdfbGVmdCwgb3JnX3JpZ2h0OwotCi0KLSAgICAgICAgb3JnX3BvcyAgICA9IGVkZ2UtPm9wb3MgKyBhbmNob3JfZHJpZnQ7Ci0gICAgICAgIG9yZ19sZW4gICAgPSBlZGdlMi0+b3BvcyAtIGVkZ2UtPm9wb3M7Ci0gICAgICAgIG9yZ19jZW50ZXIgPSBvcmdfcG9zICsgKCBvcmdfbGVuID4+IDEgKTsKLQotICAgICAgICBjdXJfbGVuID0gYWZfbGF0aW4yX2NvbXB1dGVfc3RlbV93aWR0aCggaGludHMsIGRpbSwgb3JnX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZTItPmZsYWdzICk7Ci0KLSAgICAgICAgb3JnX2xlZnQgID0gb3JnX3BvcyArICggKCBvcmdfbGVuIC0gY3VyX2xlbiApID4+IDEgKTsKLSAgICAgICAgb3JnX3JpZ2h0ID0gb3JnX3BvcyArICggKCBvcmdfbGVuICsgY3VyX2xlbiApID4+IDEgKTsKLQotICAgICAgICBGVF9UUkFDRTUoKCAiQUxJR046IGxlZnQ9JS4yZiByaWdodD0lLjJmICIsCi0gICAgICAgICAgICAgICAgICAgIG9yZ19sZWZ0IC8gNjQuMCwgb3JnX3JpZ2h0IC8gNjQuMCApKTsKLSAgICAgICAgY3VyX2NlbnRlciA9IG9yZ19jZW50ZXI7Ci0KLSAgICAgICAgaWYgKCBlZGdlMi0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKLSAgICAgICAgICBlZGdlLT5wb3MgPSBlZGdlMi0+cG9zIC0gY3VyX2xlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgIC8qIHdlIHdhbnQgdG8gY29tcGFyZSBzZXZlcmFsIGRpc3BsYWNlbWVudCwgYW5kIGNob29zZQotICAgICAgICAgICogdGhlIG9uZSB0aGF0IGluY3JlYXNlcyBmaXRuZXNzIHdoaWxlIG1pbmltaXppbmcKLSAgICAgICAgICAqIGRpc3RvcnRpb24gYXMgd2VsbAotICAgICAgICAgICovCi0gICAgICAgICAgRlRfUG9zICAgZGlzcGxhY2VtZW50c1s2XSwgc2NvcmVzWzZdLCBvcmcsIGZpdCwgZGVsdGE7Ci0gICAgICAgICAgRlRfVUludCAgY291bnQgPSAwOwotCi0gICAgICAgICAgLyogbm90ZTogZG9uJ3QgZXZlbiB0cnkgdG8gZml0IHRpbnkgc3RlbXMgKi8KLSAgICAgICAgICBpZiAoIGN1cl9sZW4gPCAzMiApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U1KCggInRpbnkgc3RlbVxuIiApKTsKLSAgICAgICAgICAgIGdvdG8gQWxpZ25TdGVtOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGlmIHRoZSBzcGFuIGlzIHdpdGhpbiBhIHNpbmdsZSBwaXhlbCwgZG9uJ3QgdG91Y2ggaXQgKi8KLSAgICAgICAgICBpZiAoIEZUX1BJWF9GTE9PUiggb3JnX2xlZnQgKSA9PSBGVF9QSVhfQ0VJTCggb3JnX3JpZ2h0ICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1RSQUNFNSgoICJzaW5nbGUgcGl4ZWwgc3RlbVxuIiApKTsKLSAgICAgICAgICAgIGdvdG8gQWxpZ25TdGVtOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggY3VyX2xlbiA8PSA5NiApCi0gICAgICAgICAgewotICAgICAgICAgICAvKiB3ZSB3YW50IHRvIGF2b2lkIHRoZSBhYnNvbHV0ZSB3b3JzdCBjYXNlIHdoaWNoIGlzCi0gICAgICAgICAgICAqIHdoZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSBzcGFuIGVhY2ggcmVwcmVzZW50Ci0gICAgICAgICAgICAqIGFib3V0IDUwJSBvZiB0aGUgZ3JheS4gd2UnZCBiZXR0ZXIgd2FudCB0byBjaGFuZ2UgdGhpcwotICAgICAgICAgICAgKiB0byAyNS83NSUsIHNpbmNlIHRoaXMgaXMgbXVjaCBtb3JlIHBsZWFzYW50IHRvIHRoZSBleWUgd2l0aAotICAgICAgICAgICAgKiB2ZXJ5IGFjY2VwdGFibGUgZGlzdG9ydGlvbgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZUX1BvcyAgZnJhY19sZWZ0ICA9IG9yZ19sZWZ0ICAmIDYzOwotICAgICAgICAgICAgRlRfUG9zICBmcmFjX3JpZ2h0ID0gb3JnX3JpZ2h0ICYgNjM7Ci0KLSAgICAgICAgICAgIGlmICggZnJhY19sZWZ0ICA+PSAyMiAmJiBmcmFjX2xlZnQgIDw9IDQyICYmCi0gICAgICAgICAgICAgICAgIGZyYWNfcmlnaHQgPj0gMjIgJiYgZnJhY19yaWdodCA8PSA0MiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9yZyA9IGZyYWNfbGVmdDsKLSAgICAgICAgICAgICAgZml0ID0gKCBvcmcgPD0gMzIgKSA/IDE2IDogNDg7Ci0gICAgICAgICAgICAgIGRlbHRhID0gRlRfQUJTKCBmaXQgLSBvcmcgKTsKLSAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tjb3VudF0gPSBmaXQgLSBvcmc7Ci0gICAgICAgICAgICAgIHNjb3Jlc1tjb3VudCsrXSAgICAgID0gZGVsdGE7Ci0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICJkaXNwQT0lLjJmICglZCkgIiwgKCBmaXQgLSBvcmcgKSAvIDY0LjAsIGRlbHRhICkpOwotCi0gICAgICAgICAgICAgIG9yZyA9IGZyYWNfcmlnaHQ7Ci0gICAgICAgICAgICAgIGZpdCA9ICggb3JnIDw9IDMyICkgPyAxNiA6IDQ4OwotICAgICAgICAgICAgICBkZWx0YSA9IEZUX0FCUyggZml0IC0gb3JnICk7Ci0gICAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbY291bnRdID0gZml0IC0gb3JnOwotICAgICAgICAgICAgICBzY29yZXNbY291bnQrK10gICAgID0gZGVsdGE7Ci0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICJkaXNwQj0lLjJmICglZCkgIiwgKCBmaXQgLSBvcmcgKSAvIDY0LjAsIGRlbHRhICkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHNuYXBwaW5nIHRoZSBsZWZ0IGVkZ2UgdG8gdGhlIGdyaWQgKi8KLSAgICAgICAgICBvcmcgICA9IG9yZ19sZWZ0OwotICAgICAgICAgIGZpdCAgID0gRlRfUElYX1JPVU5EKCBvcmcgKTsKLSAgICAgICAgICBkZWx0YSA9IEZUX0FCUyggZml0IC0gb3JnICk7Ci0gICAgICAgICAgZGlzcGxhY2VtZW50c1tjb3VudF0gPSBmaXQgLSBvcmc7Ci0gICAgICAgICAgc2NvcmVzW2NvdW50KytdICAgICAgPSBkZWx0YTsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiZGlzcEM9JS4yZiAoJWQpICIsICggZml0IC0gb3JnICkgLyA2NC4wLCBkZWx0YSApKTsKLQotICAgICAgICAgIC8qIHNuYXBwaW5nIHRoZSByaWdodCBlZGdlIHRvIHRoZSBncmlkICovCi0gICAgICAgICAgb3JnICAgPSBvcmdfcmlnaHQ7Ci0gICAgICAgICAgZml0ICAgPSBGVF9QSVhfUk9VTkQoIG9yZyApOwotICAgICAgICAgIGRlbHRhID0gRlRfQUJTKCBmaXQgLSBvcmcgKTsKLSAgICAgICAgICBkaXNwbGFjZW1lbnRzW2NvdW50XSA9IGZpdCAtIG9yZzsKLSAgICAgICAgICBzY29yZXNbY291bnQrK10gICAgICA9IGRlbHRhOwotICAgICAgICAgIEZUX1RSQUNFNSgoICJkaXNwRD0lLjJmICglZCkgIiwgKCBmaXQgLSBvcmcgKSAvIDY0LjAsIGRlbHRhICkpOwotCi0gICAgICAgICAgLyogbm93IGZpbmQgdGhlIGJlc3QgZGlzcGxhY2VtZW50ICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICBiZXN0X3Njb3JlID0gc2NvcmVzWzBdOwotICAgICAgICAgICAgRlRfUG9zICBiZXN0X2Rpc3AgID0gZGlzcGxhY2VtZW50c1swXTsKLSAgICAgICAgICAgIEZUX1VJbnQgbm47Ci0KLSAgICAgICAgICAgIGZvciAoIG5uID0gMTsgbm4gPCBjb3VudDsgbm4rKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggc2NvcmVzW25uXSA8IGJlc3Rfc2NvcmUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3Jlc1tubl07Ci0gICAgICAgICAgICAgICAgYmVzdF9kaXNwICA9IGRpc3BsYWNlbWVudHNbbm5dOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1cl9jZW50ZXIgPSBvcmdfY2VudGVyICsgYmVzdF9kaXNwOwotICAgICAgICAgIH0KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwotICAgICAgICB9Ci0KLSAgICAgIEFsaWduU3RlbToKLSAgICAgICAgZWRnZS0+cG9zICA9IGN1cl9jZW50ZXIgLSAoIGN1cl9sZW4gPj4gMSApOwotICAgICAgICBlZGdlMi0+cG9zID0gZWRnZS0+cG9zICsgY3VyX2xlbjsKLQotICAgICAgICBGVF9UUkFDRTUoKCAiU1RFTTE6ICVkIChvcG9zPSUuMmYpIHRvICVkIChvcG9zPSUuMmYpIgotICAgICAgICAgICAgICAgICAgICAiIHNuYXBwZWQgdG8gKCUuMmYpIGFuZCAoJS4yZiksIgotICAgICAgICAgICAgICAgICAgICAiIG9yZ19sZW49JS4yZiBjdXJfbGVuPSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICBlZGdlMi1lZGdlcywgZWRnZTItPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLCBlZGdlMi0+cG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgb3JnX2xlbiAvIDY0LjAsIGN1cl9sZW4gLyA2NC4wICkpOwotCi0gICAgICAgIGVkZ2UtPmZsYWdzICB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIGVkZ2UyLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0KLSAgICAgICAgaWYgKCBlZGdlID4gZWRnZXMgJiYgZWRnZS0+cG9zIDwgZWRnZVstMV0ucG9zICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNSgoICJCT1VORDogJWQgKHBvcz0lLjJmKSB0byAoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+cG9zIC8gNjQuMCwgZWRnZVstMV0ucG9zIC8gNjQuMCApKTsKLSAgICAgICAgICBlZGdlLT5wb3MgPSBlZGdlWy0xXS5wb3M7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBtYWtlIHN1cmUgdGhhdCBsb3dlcmNhc2UgbSdzIG1haW50YWluIHRoZWlyIHN5bW1ldHJ5ICovCi0KLSAgICAvKiBJbiBnZW5lcmFsLCBsb3dlcmNhc2UgbSdzIGhhdmUgc2l4IHZlcnRpY2FsIGVkZ2VzIGlmIHRoZXkgYXJlIHNhbnMgKi8KLSAgICAvKiBzZXJpZiwgb3IgdHdlbHZlIGlmIHRoZXkgYXJlIHdpdGggc2VyaWZzLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAgKi8KLSAgICAvKiBiYXNlZCBvbiB0aGF0IGFzc3VtcHRpb24sIGFuZCBzZWVtcyB0byB3b3JrIHZlcnkgd2VsbCB3aXRoIG1vc3QgICAgKi8KLSAgICAvKiBmYWNlcy4gIEhvd2V2ZXIsIGlmIGZvciBhIGNlcnRhaW4gZmFjZSB0aGlzIGFzc3VtcHRpb24gaXMgbm90ICAgICAgKi8KLSAgICAvKiB0cnVlLCB0aGUgbSBpcyBqdXN0IHJlbmRlcmVkIGxpa2UgYmVmb3JlLiAgSW4gYWRkaXRpb24sIGFueSBzdGVtICAgKi8KLSAgICAvKiBjb3JyZWN0aW9uIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHN5bW1ldHJpY2FsIGdseXBocyAoZXZlbiBpZiB0aGUgKi8KLSAgICAvKiBnbHlwaCBpcyBub3QgYW4gbSksIHNvIHRoZSBwb3RlbnRpYWwgZm9yIHVud2FudGVkIGRpc3RvcnRpb24gaXMgICAgKi8KLSAgICAvKiByZWxhdGl2ZWx5IGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIFdlIGRvbid0IGhhbmRsZSBob3Jpem9udGFsIGVkZ2VzIHNpbmNlIHdlIGNhbid0IGVhc2lseSBhc3N1cmUgdGhhdCAqLwotICAgIC8qIHRoZSB0aGlyZCAobG93ZXN0KSBzdGVtIGFsaWducyB3aXRoIHRoZSBiYXNlIGxpbmU7IGl0IG1pZ2h0IGVuZCB1cCAqLwotICAgIC8qIG9uZSBwaXhlbCBoaWdoZXIgb3IgbG93ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWYgMAotICAgIHsKLSAgICAgIEZUX0ludCAgbl9lZGdlcyA9IGVkZ2VfbGltaXQgLSBlZGdlczsKLQotCi0gICAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiAmJiAoIG5fZWRnZXMgPT0gNiB8fCBuX2VkZ2VzID09IDEyICkgKQotICAgICAgewotICAgICAgICBBRl9FZGdlICBlZGdlMSwgZWRnZTIsIGVkZ2UzOwotICAgICAgICBGVF9Qb3MgICBkaXN0MSwgZGlzdDIsIHNwYW4sIGRlbHRhOwotCi0KLSAgICAgICAgaWYgKCBuX2VkZ2VzID09IDYgKQotICAgICAgICB7Ci0gICAgICAgICAgZWRnZTEgPSBlZGdlczsKLSAgICAgICAgICBlZGdlMiA9IGVkZ2VzICsgMjsKLSAgICAgICAgICBlZGdlMyA9IGVkZ2VzICsgNDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlZGdlMSA9IGVkZ2VzICsgMTsKLSAgICAgICAgICBlZGdlMiA9IGVkZ2VzICsgNTsKLSAgICAgICAgICBlZGdlMyA9IGVkZ2VzICsgOTsKLSAgICAgICAgfQotCi0gICAgICAgIGRpc3QxID0gZWRnZTItPm9wb3MgLSBlZGdlMS0+b3BvczsKLSAgICAgICAgZGlzdDIgPSBlZGdlMy0+b3BvcyAtIGVkZ2UyLT5vcG9zOwotCi0gICAgICAgIHNwYW4gPSBkaXN0MSAtIGRpc3QyOwotICAgICAgICBpZiAoIHNwYW4gPCAwICkKLSAgICAgICAgICBzcGFuID0gLXNwYW47Ci0KLSAgICAgICAgaWYgKCBzcGFuIDwgOCApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWx0YSA9IGVkZ2UzLT5wb3MgLSAoIDIgKiBlZGdlMi0+cG9zIC0gZWRnZTEtPnBvcyApOwotICAgICAgICAgIGVkZ2UzLT5wb3MgLT0gZGVsdGE7Ci0gICAgICAgICAgaWYgKCBlZGdlMy0+bGluayApCi0gICAgICAgICAgICBlZGdlMy0+bGluay0+cG9zIC09IGRlbHRhOwotCi0gICAgICAgICAgLyogbW92ZSB0aGUgc2VyaWZzIGFsb25nIHdpdGggdGhlIHN0ZW0gKi8KLSAgICAgICAgICBpZiAoIG5fZWRnZXMgPT0gMTIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICggZWRnZXMgKyA4ICktPnBvcyAtPSBkZWx0YTsKLSAgICAgICAgICAgICggZWRnZXMgKyAxMSApLT5wb3MgLT0gZGVsdGE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZWRnZTMtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLSAgICAgICAgICBpZiAoIGVkZ2UzLT5saW5rICkKLSAgICAgICAgICAgIGVkZ2UzLT5saW5rLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICggaGFzX3NlcmlmcyB8fCAhYW5jaG9yICkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogIG5vdyBoaW50IHRoZSByZW1haW5pbmcgZWRnZXMgKHNlcmlmcyBhbmQgc2luZ2xlKSBpbiBvcmRlcgotICAgICAgICogIHRvIGNvbXBsZXRlIG91ciBwcm9jZXNzaW5nCi0gICAgICAgKi8KLSAgICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgZGVsdGE7Ci0KLQotICAgICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBkZWx0YSA9IDEwMDA7Ci0KLSAgICAgICAgaWYgKCBlZGdlLT5zZXJpZiApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWx0YSA9IGVkZ2UtPnNlcmlmLT5vcG9zIC0gZWRnZS0+b3BvczsKLSAgICAgICAgICBpZiAoIGRlbHRhIDwgMCApCi0gICAgICAgICAgICBkZWx0YSA9IC1kZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZGVsdGEgPCA2NCArIDE2ICkKLSAgICAgICAgewotICAgICAgICAgIGFmX2xhdGluMl9hbGlnbl9zZXJpZl9lZGdlKCBoaW50cywgZWRnZS0+c2VyaWYsIGVkZ2UgKTsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiU0VSSUY6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc2VyaWYgdG8gJWQgKG9wb3M9JS4yZikiCi0gICAgICAgICAgICAgICAgICAgICAgIiBhbGlnbmVkIHRvICglLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBlZGdlLWVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5zZXJpZiAtIGVkZ2VzLCBlZGdlLT5zZXJpZi0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggIWFuY2hvciApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiU0VSSUZfQU5DSE9SOiBlZGdlICVkIChvcG9zPSUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICIgc25hcHBlZCB0byAoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsIGVkZ2UtPnBvcyAvIDY0LjAgKSk7Ci0gICAgICAgICAgZWRnZS0+cG9zID0gRlRfUElYX1JPVU5EKCBlZGdlLT5vcG9zICk7Ci0gICAgICAgICAgYW5jaG9yICAgID0gZWRnZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9FZGdlICBiZWZvcmUsIGFmdGVyOwotCi0KLSAgICAgICAgICBmb3IgKCBiZWZvcmUgPSBlZGdlIC0gMTsgYmVmb3JlID49IGVkZ2VzOyBiZWZvcmUtLSApCi0gICAgICAgICAgICBpZiAoIGJlZm9yZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGZvciAoIGFmdGVyID0gZWRnZSArIDE7IGFmdGVyIDwgZWRnZV9saW1pdDsgYWZ0ZXIrKyApCi0gICAgICAgICAgICBpZiAoIGFmdGVyLT5mbGFncyAmIEFGX0VER0VfRE9ORSApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgaWYgKCBiZWZvcmUgPj0gZWRnZXMgJiYgYmVmb3JlIDwgZWRnZSAgICYmCi0gICAgICAgICAgICAgICBhZnRlciA8IGVkZ2VfbGltaXQgJiYgYWZ0ZXIgPiBlZGdlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGFmdGVyLT5vcG9zID09IGJlZm9yZS0+b3BvcyApCi0gICAgICAgICAgICAgIGVkZ2UtPnBvcyA9IGJlZm9yZS0+cG9zOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlZGdlLT5wb3MgPSBiZWZvcmUtPnBvcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggZWRnZS0+b3BvcyAtIGJlZm9yZS0+b3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci0+cG9zIC0gYmVmb3JlLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPm9wb3MgLSBiZWZvcmUtPm9wb3MgKTsKLSAgICAgICAgICAgIEZUX1RSQUNFNSgoICJTRVJJRl9MSU5LMTogZWRnZSAlZCAob3Bvcz0lLjJmKSBzbmFwcGVkIHRvICglLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSAlZCAob3Bvcz0lLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLCBlZGdlLT5wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIC0gZWRnZXMsIGJlZm9yZS0+b3BvcyAvIDY0LjAgKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGdlLT5wb3MgPSBhbmNob3ItPnBvcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAoICggZWRnZS0+b3BvcyAtIGFuY2hvci0+b3BvcyArIDE2ICkgJiB+MzEgKTsKLQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIlNFUklGX0xJTksyOiBlZGdlICVkIChvcG9zPSUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICAgIiBzbmFwcGVkIHRvICglLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLCBlZGdlLT5wb3MgLyA2NC4wICkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotICAgICAgICBpZiAoIGVkZ2UgPiBlZGdlcyAmJiBlZGdlLT5wb3MgPCBlZGdlWy0xXS5wb3MgKQotICAgICAgICAgIGVkZ2UtPnBvcyA9IGVkZ2VbLTFdLnBvczsKLQotICAgICAgICBpZiAoIGVkZ2UgKyAxIDwgZWRnZV9saW1pdCAgICAgICAgJiYKLSAgICAgICAgICAgICBlZGdlWzFdLmZsYWdzICYgQUZfRURHRV9ET05FICYmCi0gICAgICAgICAgICAgZWRnZS0+cG9zID4gZWRnZVsxXS5wb3MgICAgICApCi0gICAgICAgICAgZWRnZS0+cG9zID0gZWRnZVsxXS5wb3M7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZfbGF0aW4yX2hpbnRzX2FwcGx5KCBGVF9VSW50ICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0dseXBoSGludHMgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgaW50ICAgICAgIGRpbTsKLQotICAgIEZUX1VOVVNFRCggZ2x5cGhfaW5kZXggKTsKLQotCi0gICAgZXJyb3IgPSBhZl9nbHlwaF9oaW50c19yZWxvYWQoIGhpbnRzLCBvdXRsaW5lICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBhbmFseXplIGdseXBoIG91dGxpbmUgKi8KLSAgICBpZiAoIEFGX0hJTlRTX0RPX0hPUklaT05UQUwoIGhpbnRzICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gYWZfbGF0aW4yX2hpbnRzX2RldGVjdF9mZWF0dXJlcyggaGludHMsIEFGX0RJTUVOU0lPTl9IT1JaICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggQUZfSElOVFNfRE9fVkVSVElDQUwoIGhpbnRzICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gYWZfbGF0aW4yX2hpbnRzX2RldGVjdF9mZWF0dXJlcyggaGludHMsIEFGX0RJTUVOU0lPTl9WRVJUICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBhZl9sYXRpbjJfaGludHNfY29tcHV0ZV9ibHVlX2VkZ2VzKCBoaW50cywgbWV0cmljcyApOwotICAgIH0KLQotICAgIC8qIGdyaWQtZml0IHRoZSBvdXRsaW5lICovCi0gICAgZm9yICggZGltID0gMDsgZGltIDwgQUZfRElNRU5TSU9OX01BWDsgZGltKysgKQotICAgIHsKLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLSAgICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnJlbmRlcl9tb2RlID09IEZUX1JFTkRFUl9NT0RFX05PUk1BTCAmJgotICAgICAgICAgICBBRl9ISU5UU19ET19XQVJQKCBoaW50cyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgewotICAgICAgICBBRl9XYXJwZXJSZWMgIHdhcnBlcjsKLSAgICAgICAgRlRfRml4ZWQgICAgICBzY2FsZTsKLSAgICAgICAgRlRfUG9zICAgICAgICBkZWx0YTsKLQotCi0gICAgICAgIGFmX3dhcnBlcl9jb21wdXRlKCAmd2FycGVyLCBoaW50cywgZGltLCAmc2NhbGUsICZkZWx0YSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19zY2FsZV9kaW0oIGhpbnRzLCBkaW0sIHNjYWxlLCBkZWx0YSApOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSNlbmRpZiAvKiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIgKi8KLQotICAgICAgaWYgKCAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiAmJiBBRl9ISU5UU19ET19IT1JJWk9OVEFMKCBoaW50cyApICkgfHwKLSAgICAgICAgICAgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgJiYgQUZfSElOVFNfRE9fVkVSVElDQUwoIGhpbnRzICkgKSAgICkKLSAgICAgIHsKLSAgICAgICAgYWZfbGF0aW4yX2hpbnRfZWRnZXMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19hbGlnbl9lZGdlX3BvaW50cyggaGludHMsIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICAgIGFmX2dseXBoX2hpbnRzX2FsaWduX3N0cm9uZ19wb2ludHMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19hbGlnbl93ZWFrX3BvaW50cyggaGludHMsIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGFmX2dseXBoX2hpbnRzX3NhdmUoIGhpbnRzLCBvdXRsaW5lICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgTCBBIFQgSSBOICAgUyBDIFIgSSBQIFQgICBDIEwgQSBTIFMgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgQUZfREVGSU5FX1dSSVRJTkdfU1lTVEVNX0NMQVNTKAotICAgIGFmX2xhdGluMl93cml0aW5nX3N5c3RlbV9jbGFzcywKLQotICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOMiwKLQotICAgIHNpemVvZiAoIEFGX0xhdGluTWV0cmljc1JlYyApLAotCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fSW5pdE1ldHJpY3NGdW5jKSBhZl9sYXRpbjJfbWV0cmljc19pbml0LCAgICAgICAgLyogc3R5bGVfbWV0cmljc19pbml0ICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fU2NhbGVNZXRyaWNzRnVuYylhZl9sYXRpbjJfbWV0cmljc19zY2FsZSwgICAgICAgLyogc3R5bGVfbWV0cmljc19zY2FsZSAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fRG9uZU1ldHJpY3NGdW5jKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3R5bGVfbWV0cmljc19kb25lICAgICovCi0gICAgKEFGX1dyaXRpbmdTeXN0ZW1fR2V0U3RkV2lkdGhzRnVuYylhZl9sYXRpbjJfZ2V0X3N0YW5kYXJkX3dpZHRocywgLyogc3R5bGVfbWV0cmljc19nZXRzdGR3ICovCi0KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9Jbml0SGludHNGdW5jKSAgIGFmX2xhdGluMl9oaW50c19pbml0LCAgICAgICAgICAvKiBzdHlsZV9oaW50c19pbml0ICAgICAgKi8KLSAgICAoQUZfV3JpdGluZ1N5c3RlbV9BcHBseUhpbnRzRnVuYykgIGFmX2xhdGluMl9oaW50c19hcHBseSAgICAgICAgICAvKiBzdHlsZV9oaW50c19hcHBseSAgICAgKi8KLSAgKQotCi0jZWxzZSAvKiAhRlRfT1BUSU9OX0FVVE9GSVQyICovCi0KLSAgLyogQU5TSSBDIGRvZXNuJ3QgbGlrZSBlbXB0eSBzb3VyY2UgZmlsZXMgKi8KLSAgdHlwZWRlZiBpbnQgIF9hZl9sYXRpbjJfZHVtbXk7Ci0KLSNlbmRpZiAvKiAhRlRfT1BUSU9OX0FVVE9GSVQyICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmxhdGluMi5oIGIvc3JjL2F1dG9maXQvYWZsYXRpbjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwYjE1NC4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmxhdGluMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogQVRURU5USU9OOiBUaGlzIGZpbGUgZG9lc24ndCBjb21waWxlLiAgSXQgaXMgb25seSBoZXJlIGFzIGEgcmVmZXJlbmNlICovCi0vKiAgICAgICAgICAgIG9mIGFuIGFsdGVybmF0aXZlIGxhdGluIGhpbnRpbmcgYWxnb3JpdGhtIHRoYXQgd2FzIGFsd2F5cyAgKi8KLS8qICAgICAgICAgICAgbWFya2VkIGFzIGV4cGVyaW1lbnRhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbGF0aW4yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBsYXRpbiB3cml0aW5nIHN5c3RlbSAgICAgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZMQVRJTjJfSF8KLSNkZWZpbmUgQUZMQVRJTjJfSF8KLQotI2luY2x1ZGUgImFmaGludHMuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIHRoZSBgbGF0aW4nIHdyaXRpbmcgc3lzdGVtICovCi0KLSAgQUZfREVDTEFSRV9XUklUSU5HX1NZU1RFTV9DTEFTUyggYWZfbGF0aW4yX3dyaXRpbmdfc3lzdGVtX2NsYXNzICkKLQotCi0vKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBBRkxBVElOX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmxvYWRlci5jIGIvc3JjL2F1dG9maXQvYWZsb2FkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3ZWJkMS4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmxvYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbG9hZGVyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBnbHlwaCBsb2FkaW5nIHJvdXRpbmVzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImFmZ2xvYmFsLmgiCi0jaW5jbHVkZSAiYWZsb2FkZXIuaCIKLSNpbmNsdWRlICJhZmhpbnRzLmgiCi0jaW5jbHVkZSAiYWZlcnJvcnMuaCIKLSNpbmNsdWRlICJhZm1vZHVsZS5oIgotI2luY2x1ZGUgImFmcGljLmgiCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotCi0KLSAgLyogSW5pdGlhbGl6ZSBnbHlwaCBsb2FkZXIuICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbG9hZGVyX2luaXQoIEFGX0xvYWRlciAgICAgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgIEFGX0dseXBoSGludHMgIGhpbnRzICkKLSAgewotICAgIEZUX1pFUk8oIGxvYWRlciApOwotCi0gICAgbG9hZGVyLT5oaW50cyA9IGhpbnRzOwotICB9Ci0KLQotICAvKiBSZXNldCBnbHlwaCBsb2FkZXIgYW5kIGNvbXB1dGUgZ2xvYmFscyBpZiBuZWNlc3NhcnkuICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2xvYWRlcl9yZXNldCggQUZfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgQUZfTW9kdWxlICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICBmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgbG9hZGVyLT5mYWNlICAgID0gZmFjZTsKLSAgICBsb2FkZXItPmdsb2JhbHMgPSAoQUZfRmFjZUdsb2JhbHMpZmFjZS0+YXV0b2hpbnQuZGF0YTsKLQotICAgIGlmICggIWxvYWRlci0+Z2xvYmFscyApCi0gICAgewotICAgICAgZXJyb3IgPSBhZl9mYWNlX2dsb2JhbHNfbmV3KCBmYWNlLCAmbG9hZGVyLT5nbG9iYWxzLCBtb2R1bGUgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgZmFjZS0+YXV0b2hpbnQuZGF0YSA9Ci0gICAgICAgICAgKEZUX1BvaW50ZXIpbG9hZGVyLT5nbG9iYWxzOwotICAgICAgICBmYWNlLT5hdXRvaGludC5maW5hbGl6ZXIgPQotICAgICAgICAgIChGVF9HZW5lcmljX0ZpbmFsaXplcilhZl9mYWNlX2dsb2JhbHNfZnJlZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIEZpbmFsaXplIGdseXBoIGxvYWRlci4gKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sb2FkZXJfZG9uZSggQUZfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgbG9hZGVyLT5mYWNlICAgID0gTlVMTDsKLSAgICBsb2FkZXItPmdsb2JhbHMgPSBOVUxMOwotICAgIGxvYWRlci0+aGludHMgICA9IE5VTEw7Ci0gIH0KLQotCi0jZGVmaW5lIGFmX2ludFRvRml4ZWQoIGkgKSBcCi0gICAgICAgICAgKCAoRlRfRml4ZWQpKCAoRlRfVUludDMyKShpKSA8PCAxNiApICkKLSNkZWZpbmUgYWZfZml4ZWRUb0ludCggeCApIFwKLSAgICAgICAgICAoIChGVF9TaG9ydCkoICggKEZUX1VJbnQzMikoeCkgKyAweDgwMDBVICkgPj4gMTYgKSApCi0jZGVmaW5lIGFmX2Zsb2F0VG9GaXhlZCggZiApIFwKLSAgICAgICAgICAoIChGVF9GaXhlZCkoIChmKSAqIDY1NTM2LjAgKyAwLjUgKSApCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZfbG9hZGVyX2VtYm9sZGVuX2dseXBoX2luX3Nsb3QoIEFGX0xvYWRlciAgICAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU3R5bGVNZXRyaWNzICBzdHlsZV9tZXRyaWNzICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIEZUX0dseXBoU2xvdCAgICAgICAgICAgc2xvdCAgICA9IGZhY2UtPmdseXBoOwotICAgIEFGX0ZhY2VHbG9iYWxzICAgICAgICAgZ2xvYmFscyA9IGxvYWRlci0+Z2xvYmFsczsKLSAgICBBRl9Xcml0aW5nU3lzdGVtQ2xhc3MgIHdyaXRpbmdfc3lzdGVtX2NsYXNzOwotCi0gICAgRlRfU2l6ZV9NZXRyaWNzKiAgc2l6ZV9tZXRyaWNzID0gJmZhY2UtPnNpemUtPmludGVybmFsLT5hdXRvaGludF9tZXRyaWNzOwotCi0gICAgRlRfUG9zICBzdGRWVyA9IDA7Ci0gICAgRlRfUG9zICBzdGRIVyA9IDA7Ci0KLSAgICBGVF9Cb29sICBzaXplX2NoYW5nZWQgPSBzaXplX21ldHJpY3MtPnhfcHBlbSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscy0+c3RlbV9kYXJrZW5pbmdfZm9yX3BwZW07Ci0KLSAgICBGVF9GaXhlZCAgZW1fc2l6ZSAgPSBhZl9pbnRUb0ZpeGVkKCBmYWNlLT51bml0c19wZXJfRU0gKTsKLSAgICBGVF9GaXhlZCAgZW1fcmF0aW8gPSBGVF9EaXZGaXgoIGFmX2ludFRvRml4ZWQoIDEwMDAgKSwgZW1fc2l6ZSApOwotCi0gICAgRlRfTWF0cml4ICBzY2FsZV9kb3duX21hdHJpeCA9IHsgMHgxMDAwMEwsIDAsIDAsIDB4MTAwMDBMIH07Ci0KLQotICAgIC8qIFNraXAgc3RlbSBkYXJrZW5pbmcgZm9yIGJyb2tlbiBmb250cy4gKi8KLSAgICBpZiAoICFmYWNlLT51bml0c19wZXJfRU0gKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBDb3JydXB0ZWRfRm9udF9IZWFkZXIgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBXZSBkZXBlbmQgb24gdGhlIHdyaXRpbmcgc3lzdGVtIChzY3JpcHQgYW5hbHl6ZXJzKSB0byBzdXBwbHkKLSAgICAgKiAgc3RhbmRhcmQgd2lkdGhzIGZvciB0aGUgc2NyaXB0IG9mIHRoZSBnbHlwaCB3ZSBhcmUgbG9va2luZyBhdC4gIElmCi0gICAgICogIGl0IGNhbid0IGRlbGl2ZXIsIHN0ZW0gZGFya2VuaW5nIGlzIGRpc2FibGVkLgotICAgICAqLwotICAgIHdyaXRpbmdfc3lzdGVtX2NsYXNzID0KLSAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0NMQVNTRVNfR0VUW3N0eWxlX21ldHJpY3MtPnN0eWxlX2NsYXNzLT53cml0aW5nX3N5c3RlbV07Ci0KLSAgICBpZiAoIHdyaXRpbmdfc3lzdGVtX2NsYXNzLT5zdHlsZV9tZXRyaWNzX2dldHN0ZHcgKQotICAgICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MtPnN0eWxlX21ldHJpY3NfZ2V0c3Rkdyggc3R5bGVfbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGRIVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGRWVyApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBzaXplX2NoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAoIHN0ZFZXID4gMCAmJiBzdGRWVyAhPSBnbG9iYWxzLT5zdGFuZGFyZF92ZXJ0aWNhbF93aWR0aCApICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgZGFya2VuX2J5X2ZvbnRfdW5pdHNfeCwgZGFya2VuX3g7Ci0KLQotICAgICAgZGFya2VuX2J5X2ZvbnRfdW5pdHNfeCA9Ci0gICAgICAgIGFmX2ludFRvRml4ZWQoIGFmX2xvYWRlcl9jb21wdXRlX2RhcmtlbmluZyggbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkVlcgKSApOwotICAgICAgZGFya2VuX3ggPSBGVF9EaXZGaXgoIEZUX011bEZpeCggZGFya2VuX2J5X2ZvbnRfdW5pdHNfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfbWV0cmljcy0+eF9zY2FsZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtX3JhdGlvICk7Ci0KLSAgICAgIGdsb2JhbHMtPnN0YW5kYXJkX3ZlcnRpY2FsX3dpZHRoID0gc3RkVlc7Ci0gICAgICBnbG9iYWxzLT5zdGVtX2RhcmtlbmluZ19mb3JfcHBlbSA9IHNpemVfbWV0cmljcy0+eF9wcGVtOwotICAgICAgZ2xvYmFscy0+ZGFya2VuX3ggICAgICAgICAgICAgICAgPSBhZl9maXhlZFRvSW50KCBkYXJrZW5feCApOwotICAgIH0KLQotICAgIGlmICggc2l6ZV9jaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAoIHN0ZEhXID4gMCAmJiBzdGRIVyAhPSBnbG9iYWxzLT5zdGFuZGFyZF9ob3Jpem9udGFsX3dpZHRoICkgKQotICAgIHsKLSAgICAgIEZUX0ZpeGVkICBkYXJrZW5fYnlfZm9udF91bml0c195LCBkYXJrZW5feTsKLQotCi0gICAgICBkYXJrZW5fYnlfZm9udF91bml0c195ID0KLSAgICAgICAgYWZfaW50VG9GaXhlZCggYWZfbG9hZGVyX2NvbXB1dGVfZGFya2VuaW5nKCBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRIVyApICk7Ci0gICAgICBkYXJrZW5feSA9IEZUX0RpdkZpeCggRlRfTXVsRml4KCBkYXJrZW5fYnlfZm9udF91bml0c195LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9tZXRyaWNzLT55X3NjYWxlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1fcmF0aW8gKTsKLQotICAgICAgZ2xvYmFscy0+c3RhbmRhcmRfaG9yaXpvbnRhbF93aWR0aCA9IHN0ZEhXOwotICAgICAgZ2xvYmFscy0+c3RlbV9kYXJrZW5pbmdfZm9yX3BwZW0gICA9IHNpemVfbWV0cmljcy0+eF9wcGVtOwotICAgICAgZ2xvYmFscy0+ZGFya2VuX3kgICAgICAgICAgICAgICAgICA9IGFmX2ZpeGVkVG9JbnQoIGRhcmtlbl95ICk7Ci0KLSAgICAgIC8qCi0gICAgICAgKiAgU2NhbGUgb3V0bGluZXMgZG93biBvbiB0aGUgWS1heGlzIHRvIGtlZXAgdGhlbSBpbnNpZGUgdGhlaXIgYmx1ZQotICAgICAgICogIHpvbmVzLiAgVGhlIHN0cm9uZ2VyIHRoZSBlbWJvbGRlbmluZywgdGhlIHN0cm9uZ2VyIHRoZSBkb3duc2NhbGluZwotICAgICAgICogIChwbHVzIGhldXJpc3RpY2FsIHBhZGRpbmcgdG8gcHJldmVudCBvdXRsaW5lcyBzdGlsbCBmYWxsaW5nIG91dAotICAgICAgICogIHRoZWlyIHpvbmVzIGR1ZSB0byByb3VuZGluZykuCi0gICAgICAgKgotICAgICAgICogIFJlYXNvbjogYEZUX091dGxpbmVfRW1ib2xkZW4nIHdvcmtzIGJ5IHNoaWZ0aW5nIHRoZSByaWdodG1vc3QKLSAgICAgICAqICBwb2ludHMgb2Ygc3RlbXMgZmFydGhlciB0byB0aGUgcmlnaHQsIGFuZCB0b3Btb3N0IHBvaW50cyBmYXJ0aGVyCi0gICAgICAgKiAgdXAuICBUaGlzIHBvc2l0aW9ucyBwb2ludHMgb24gdGhlIFktYXhpcyBvdXRzaWRlIHRoZWlyCi0gICAgICAgKiAgcHJlLWNvbXB1dGVkIGJsdWUgem9uZXMgYW5kIGxlYWRzIHRvIGRpc3RvcnRpb24gd2hlbiBhcHBseWluZyB0aGUKLSAgICAgICAqICBoaW50cyBpbiB0aGUgY29kZSBmdXJ0aGVyIGJlbG93LiAgQ29kZSBvdXRzaWRlIHRoaXMgZW1ib2xkZW5pbmcKLSAgICAgICAqICBibG9jayBkb2Vzbid0IGtub3cgd2UgYXJlIHByZXNlbnRpbmcgaXQgd2l0aCBtb2RpZmllZCBvdXRsaW5lcyB0aGUKLSAgICAgICAqICBhbmFseXplciBkaWRuJ3Qgc2VlIQotICAgICAgICoKLSAgICAgICAqICBBbiB1bmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiBkb3duc2NhbGluZyBpcyB0aGF0IHRoZSBlbWJvbGRlbmluZwotICAgICAgICogIGVmZmVjdCBpcyBzbGlnaHRseSBkZWNyZWFzZWQuICBUaGUgbG9zcyBiZWNvbWVzIG1vcmUgcHJvbm91bmNlZAotICAgICAgICogIHZlcnN1cyB0aGUgQ0ZGIGRyaXZlciBhdCBzbWFsbGVyIHNpemVzLCBlLmcuLCBhdCA5cHBlbSBhbmQgYmVsb3cuCi0gICAgICAgKi8KLSAgICAgIGdsb2JhbHMtPnNjYWxlX2Rvd25fZmFjdG9yID0KLSAgICAgICAgRlRfRGl2Rml4KCBlbV9zaXplIC0gKCBkYXJrZW5fYnlfZm9udF91bml0c195ICsgYWZfaW50VG9GaXhlZCggOCApICksCi0gICAgICAgICAgICAgICAgICAgZW1fc2l6ZSApOwotICAgIH0KLQotICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSggJnNsb3QtPm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzLT5kYXJrZW5feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHMtPmRhcmtlbl95ICk7Ci0KLSAgICBzY2FsZV9kb3duX21hdHJpeC55eSA9IGdsb2JhbHMtPnNjYWxlX2Rvd25fZmFjdG9yOwotICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmc2xvdC0+b3V0bGluZSwgJnNjYWxlX2Rvd25fbWF0cml4ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIExvYWQgdGhlIGdseXBoIGF0IGluZGV4IGludG8gdGhlIGN1cnJlbnQgc2xvdCBvZiBhIGZhY2UgYW5kIGhpbnQgaXQuICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2xvYWRlcl9sb2FkX2dseXBoKCBBRl9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX01vZHVsZSAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICBGVF9TaXplICAgICAgICAgICBzaXplICAgICAgICAgID0gZmFjZS0+c2l6ZTsKLSAgICBGVF9TaXplX0ludGVybmFsICBzaXplX2ludGVybmFsID0gc2l6ZS0+aW50ZXJuYWw7Ci0gICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCAgICAgICAgICA9IGZhY2UtPmdseXBoOwotICAgIEZUX1Nsb3RfSW50ZXJuYWwgIHNsb3RfaW50ZXJuYWwgPSBzbG90LT5pbnRlcm5hbDsKLSAgICBGVF9HbHlwaExvYWRlciAgICBnbG9hZGVyICAgICAgID0gc2xvdF9pbnRlcm5hbC0+bG9hZGVyOwotCi0gICAgQUZfR2x5cGhIaW50cyAgICAgICAgICBoaW50cyAgICAgICAgID0gbG9hZGVyLT5oaW50czsKLSAgICBBRl9TY2FsZXJSZWMgICAgICAgICAgIHNjYWxlcjsKLSAgICBBRl9TdHlsZU1ldHJpY3MgICAgICAgIHN0eWxlX21ldHJpY3M7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgICBzdHlsZV9vcHRpb25zID0gQUZfU1RZTEVfTk9ORV9ERkxUOwotICAgIEFGX1N0eWxlQ2xhc3MgICAgICAgICAgc3R5bGVfY2xhc3M7Ci0gICAgQUZfV3JpdGluZ1N5c3RlbUNsYXNzICB3cml0aW5nX3N5c3RlbV9jbGFzczsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMgPSBsb2FkZXItPmdsb2JhbHM7Ci0jZW5kaWYKLQotCi0gICAgaWYgKCAhc2l6ZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU2l6ZV9IYW5kbGUgKTsKLQotICAgIEZUX1pFUk8oICZzY2FsZXIgKTsKLQotICAgIGlmICggIXNpemVfaW50ZXJuYWwtPmF1dG9oaW50X21ldHJpY3MueF9zY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIHNpemVfaW50ZXJuYWwtPmF1dG9oaW50X21vZGUgIT0gRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICkKLSAgICB7Ci0gICAgICAvKiBzd2l0Y2hpbmcgYmV0d2VlbiBoaW50aW5nIG1vZGVzIHVzdWFsbHkgbWVhbnMgZGlmZmVyZW50IHNjYWxpbmcgKi8KLSAgICAgIC8qIHZhbHVlczsgdGhpcyBsYXRlciBvbiBlbmZvcmNlcyByZWNvbXB1dGF0aW9uIG9mIGV2ZXJ5dGhpbmcgICAgICAqLwotICAgICAgLyogcmVsYXRlZCB0byB0aGUgY3VycmVudCBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIHNpemVfaW50ZXJuYWwtPmF1dG9oaW50X21vZGUgICAgPSBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICk7Ci0gICAgICBzaXplX2ludGVybmFsLT5hdXRvaGludF9tZXRyaWNzID0gc2l6ZS0+bWV0cmljczsKLQotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVFRfU0laRV9NRVRSSUNTCi0gICAgICB7Ci0gICAgICAgIEZUX1NpemVfTWV0cmljcyogIHNpemVfbWV0cmljcyA9ICZzaXplX2ludGVybmFsLT5hdXRvaGludF9tZXRyaWNzOwotCi0KLSAgICAgICAgLyogc2V0IG1ldHJpY3MgdG8gaW50ZWdlciB2YWx1ZXMgYW5kIGFkanVzdCBzY2FsaW5nIGFjY29yZGluZ2x5OyAqLwotICAgICAgICAvKiB0aGlzIGlzIHRoZSBzYW1lIHNldHVwIGFzIHdpdGggVHJ1ZVR5cGUgZm9udHMsIGNmLiBmdW5jdGlvbiAgICovCi0gICAgICAgIC8qIGB0dF9zaXplX3Jlc2V0JyBpbiBmaWxlIGB0dG9ianMuYycgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgc2l6ZV9tZXRyaWNzLT5hc2NlbmRlciAgPSBGVF9QSVhfUk9VTkQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGZhY2UtPmFzY2VuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnlfc2NhbGUgKSApOwotICAgICAgICBzaXplX21ldHJpY3MtPmRlc2NlbmRlciA9IEZUX1BJWF9ST1VORCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZmFjZS0+ZGVzY2VuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnlfc2NhbGUgKSApOwotICAgICAgICBzaXplX21ldHJpY3MtPmhlaWdodCAgICA9IEZUX1BJWF9ST1VORCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZmFjZS0+aGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnlfc2NhbGUgKSApOwotCi0gICAgICAgIHNpemVfbWV0cmljcy0+eF9zY2FsZSAgICAgPSBGVF9EaXZGaXgoIHNpemVfbWV0cmljcy0+eF9wcGVtIDw8IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnVuaXRzX3Blcl9FTSApOwotICAgICAgICBzaXplX21ldHJpY3MtPnlfc2NhbGUgICAgID0gRlRfRGl2Rml4KCBzaXplX21ldHJpY3MtPnlfcHBlbSA8PCA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT51bml0c19wZXJfRU0gKTsKLSAgICAgICAgc2l6ZV9tZXRyaWNzLT5tYXhfYWR2YW5jZSA9IEZUX1BJWF9ST1VORCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBmYWNlLT5tYXhfYWR2YW5jZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnhfc2NhbGUgKSApOwotICAgICAgfQotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fVFRfU0laRV9NRVRSSUNTICovCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgVE9ETzogVGhpcyBjb2RlIGN1cnJlbnRseSBkb2Vzbid0IHN1cHBvcnQgZnJhY3Rpb25hbCBhZHZhbmNlIHdpZHRocywKLSAgICAgKiAgaS5lLiwgcGxhY2luZyBoaW50ZWQgZ2x5cGhzIGF0IGFueXRoaW5nIG90aGVyIHRoYW4gaW50ZWdlcgotICAgICAqICB4LXBvc2l0aW9ucy4gIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgdGhlIHdhcnBlciBjb2RlLCB3aGljaAotICAgICAqICBzY2FsZXMgYW5kIHNoaWZ0cyBnbHlwaHMgdG8gb3B0aW1pemUgYmxhY2tuZXNzIG9mIHN0ZW1zIChoaW50aW5nIG9uCi0gICAgICogIHRoZSB4LWF4aXMgYnkgbmF0dXJlIHBsYWNlcyB0aGluZ3Mgb24gcGl4ZWwgaW50ZWdlcnMsIGhpbnRpbmcgb24gdGhlCi0gICAgICogIHktYXhpcyBvbmx5LCBpLmUuLCBMSUdIVCBtb2RlLCBkb2Vzbid0IHRvdWNoIHRoZSB4LWF4aXMpLiAgVGhlIGRlbHRhCi0gICAgICogIHZhbHVlcyBvZiB0aGUgc2NhbGVyIHdvdWxkIG5lZWQgdG8gYmUgYWRqdXN0ZWQuCi0gICAgICovCi0gICAgc2NhbGVyLmZhY2UgICAgPSBmYWNlOwotICAgIHNjYWxlci54X3NjYWxlID0gc2l6ZV9pbnRlcm5hbC0+YXV0b2hpbnRfbWV0cmljcy54X3NjYWxlOwotICAgIHNjYWxlci54X2RlbHRhID0gMDsKLSAgICBzY2FsZXIueV9zY2FsZSA9IHNpemVfaW50ZXJuYWwtPmF1dG9oaW50X21ldHJpY3MueV9zY2FsZTsKLSAgICBzY2FsZXIueV9kZWx0YSA9IDA7Ci0KLSAgICBzY2FsZXIucmVuZGVyX21vZGUgPSBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICk7Ci0gICAgc2NhbGVyLmZsYWdzICAgICAgID0gMDsKLQotICAgIC8qIG5vdGUgdGhhdCB0aGUgZmFsbGJhY2sgc3R5bGUgY2FuJ3QgYmUgY2hhbmdlZCBhbnltb3JlICovCi0gICAgLyogYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgb2YgYGFmX2xvYWRlcl9sb2FkX2dseXBoJyAgICAgICAgKi8KLSAgICBlcnJvciA9IGFmX2xvYWRlcl9yZXNldCggbG9hZGVyLCBtb2R1bGUsIGZhY2UgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotI2lmZGVmIEZUX09QVElPTl9BVVRPRklUMgotICAgIC8qIFhYWDogdW5kb2N1bWVudGVkIGhvb2sgdG8gYWN0aXZhdGUgdGhlIGxhdGluMiB3cml0aW5nIHN5c3RlbS4gKi8KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiAoIDFVTCA8PCAyMCApICkKLSAgICAgIHN0eWxlX29wdGlvbnMgPSBBRl9TVFlMRV9MVE4yX0RGTFQ7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogIEdseXBocyAocmVhbGx5IGNvZGUgcG9pbnRzKSBhcmUgYXNzaWduZWQgdG8gc2NyaXB0cy4gIFNjcmlwdAotICAgICAqICBhbmFseXNpcyBpcyBkb25lIGxhemlseTogRm9yIGVhY2ggZ2x5cGggdGhhdCBwYXNzZXMgdGhyb3VnaCBoZXJlLAotICAgICAqICB0aGUgY29ycmVzcG9uZGluZyBzY3JpcHQgYW5hbHl6ZXIgaXMgY2FsbGVkLCBidXQgcmV0dXJucyBpbW1lZGlhdGVseQotICAgICAqICBpZiBpdCBoYXMgYmVlbiBydW4gYWxyZWFkeS4KLSAgICAgKi8KLSAgICBlcnJvciA9IGFmX2ZhY2VfZ2xvYmFsc19nZXRfbWV0cmljcyggbG9hZGVyLT5nbG9iYWxzLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVfb3B0aW9ucywgJnN0eWxlX21ldHJpY3MgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHN0eWxlX2NsYXNzICAgICAgICAgID0gc3R5bGVfbWV0cmljcy0+c3R5bGVfY2xhc3M7Ci0gICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MgPQotICAgICAgQUZfV1JJVElOR19TWVNURU1fQ0xBU1NFU19HRVRbc3R5bGVfY2xhc3MtPndyaXRpbmdfc3lzdGVtXTsKLQotICAgIGxvYWRlci0+bWV0cmljcyA9IHN0eWxlX21ldHJpY3M7Ci0KLSAgICBpZiAoIHdyaXRpbmdfc3lzdGVtX2NsYXNzLT5zdHlsZV9tZXRyaWNzX3NjYWxlICkKLSAgICAgIHdyaXRpbmdfc3lzdGVtX2NsYXNzLT5zdHlsZV9tZXRyaWNzX3NjYWxlKCBzdHlsZV9tZXRyaWNzLCAmc2NhbGVyICk7Ci0gICAgZWxzZQotICAgICAgc3R5bGVfbWV0cmljcy0+c2NhbGVyID0gc2NhbGVyOwotCi0gICAgaWYgKCB3cml0aW5nX3N5c3RlbV9jbGFzcy0+c3R5bGVfaGludHNfaW5pdCApCi0gICAgewotICAgICAgZXJyb3IgPSB3cml0aW5nX3N5c3RlbV9jbGFzcy0+c3R5bGVfaGludHNfaW5pdCggaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZV9tZXRyaWNzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogIERvIHRoZSBtYWluIHdvcmsgb2YgYGFmX2xvYWRlcl9sb2FkX2dseXBoJy4gIE5vdGUgdGhhdCB3ZSBuZXZlciBoYXZlCi0gICAgICogIHRvIGRlYWwgd2l0aCBjb21wb3NpdGUgZ2x5cGhzIGFzIHRob3NlIGdldCBsb2FkZWQgaW50bwotICAgICAqICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSBieSB0aGUgcmVjdXJzZWQgYEZUX0xvYWRfR2x5cGgnIGZ1bmN0aW9uLgotICAgICAqICBJbiB0aGUgcmFyZSBjYXNlcyB3aGVyZSBGVF9MT0FEX05PX1JFQ1VSU0UgaXMgc2V0LCBpdCBpbXBsaWVzCi0gICAgICogIEZUX0xPQURfTk9fU0NBTEUgYW5kIGFzIHN1Y2ggdGhlIGF1dG8taGludGVyIGlzIG5ldmVyIGNhbGxlZC4KLSAgICAgKi8KLSAgICBsb2FkX2ZsYWdzIHw9ICBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSB8Ci0gICAgICAgICAgICAgICAgICAgRlRfTE9BRF9MSU5FQVJfREVTSUdOOwotICAgIGxvYWRfZmxhZ3MgJj0gfkZUX0xPQURfUkVOREVSOwotCi0gICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyoKLSAgICAgKiAgQXBwbHkgc3RlbSBkYXJrZW5pbmcgKGVtYm9sZGVuaW5nKSBoZXJlIGJlZm9yZSBoaW50cyBhcmUgYXBwbGllZCB0bwotICAgICAqICB0aGUgb3V0bGluZS4gIEdseXBocyBhcmUgc2NhbGVkIGRvd24gcHJvcG9ydGlvbmFsbHkgdG8gdGhlCi0gICAgICogIGVtYm9sZGVuaW5nIHNvIHRoYXQgY3VydmUgcG9pbnRzIGRvbid0IGZhbGwgb3V0c2lkZSB0aGVpcgotICAgICAqICBwcmVjb21wdXRlZCBibHVlIHpvbmVzLgotICAgICAqCi0gICAgICogIEFueSBlbWJvbGRlbmluZyBkb25lIGJ5IHRoZSBmb250IGRyaXZlciAoZS5nLiwgdGhlIENGRiBkcml2ZXIpCi0gICAgICogIGRvZXNuJ3QgcmVhY2ggaGVyZSBiZWNhdXNlIHRoZSBhdXRvaGludGVyIGxvYWRzIHRoZSB1bnByb2Nlc3NlZAotICAgICAqICBnbHlwaHMgaW4gZm9udCB1bml0cyBmb3IgYW5hbHlzaXMgKGZ1bmN0aW9ucyBgYWZfKl9tZXRyaWNzX2luaXRfKicpCi0gICAgICogIGFuZCB0aGVuIGFib3ZlIHRvIHByZXBhcmUgaXQgZm9yIHRoZSByYXN0ZXJpemVycyBieSBpdHNlbGYsCi0gICAgICogIGluZGVwZW5kZW50bHkgb2YgdGhlIGZvbnQgZHJpdmVyLiAgU28gZW1ib2xkZW5pbmcgbXVzdCBiZSBkb25lIGhlcmUsCi0gICAgICogIHdpdGhpbiB0aGUgYXV0b2hpbnRlci4KLSAgICAgKgotICAgICAqICBBbGwgZ2x5cGhzIHRvIGJlIGF1dG9oaW50ZWQgcGFzcyB0aHJvdWdoIGhlcmUgb25lIGJ5IG9uZS4gIFRoZQotICAgICAqICBzdGFuZGFyZCB3aWR0aHMgY2FuIHRoZXJlZm9yZSBjaGFuZ2UgZnJvbSBvbmUgZ2x5cGggdG8gdGhlIG5leHQsCi0gICAgICogIGRlcGVuZGluZyBvbiB3aGF0IHNjcmlwdCBhIGdseXBoIGlzIGFzc2lnbmVkIHRvIChlYWNoIHNjcmlwdCBoYXMgaXRzCi0gICAgICogIG93biBzZXQgb2Ygc3RhbmRhcmQgd2lkdGhzIGFuZCBvdGhlciBtZXRyaWNzKS4gIFRoZSBkYXJrZW5pbmcgYW1vdW50Ci0gICAgICogIG11c3QgdGhlcmVmb3JlIGJlIHJlY29tcHV0ZWQgZm9yIGVhY2ggc2l6ZSBhbmQKLSAgICAgKiAgYHN0YW5kYXJkX3t2ZXJ0aWNhbCxob3Jpem9udGFsfV93aWR0aCcgY2hhbmdlLgotICAgICAqCi0gICAgICogIElnbm9yZSBlcnJvcnMgYW5kIGNhcnJ5IG9uIHdpdGhvdXQgZW1ib2xkZW5pbmcuCi0gICAgICoKLSAgICAgKi8KLQotICAgIC8qIHN0ZW0gZGFya2VuaW5nIG9ubHkgd29ya3Mgd2VsbCBpbiBgbGlnaHQnIG1vZGUgKi8KLSAgICBpZiAoIHNjYWxlci5yZW5kZXJfbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCAgICAmJgotICAgICAgICAgKCAhZmFjZS0+aW50ZXJuYWwtPm5vX3N0ZW1fZGFya2VuaW5nICAgICAgICB8fAotICAgICAgICAgICAoIGZhY2UtPmludGVybmFsLT5ub19zdGVtX2RhcmtlbmluZyA8IDAgJiYKLSAgICAgICAgICAgICAhbW9kdWxlLT5ub19zdGVtX2RhcmtlbmluZyAgICAgICAgICAgICkgKSApCi0gICAgICBhZl9sb2FkZXJfZW1ib2xkZW5fZ2x5cGhfaW5fc2xvdCggbG9hZGVyLCBmYWNlLCBzdHlsZV9tZXRyaWNzICk7Ci0KLSAgICBsb2FkZXItPnRyYW5zZm9ybWVkID0gc2xvdF9pbnRlcm5hbC0+Z2x5cGhfdHJhbnNmb3JtZWQ7Ci0gICAgaWYgKCBsb2FkZXItPnRyYW5zZm9ybWVkICkKLSAgICB7Ci0gICAgICBGVF9NYXRyaXggIGludmVyc2U7Ci0KLQotICAgICAgbG9hZGVyLT50cmFuc19tYXRyaXggPSBzbG90X2ludGVybmFsLT5nbHlwaF9tYXRyaXg7Ci0gICAgICBsb2FkZXItPnRyYW5zX2RlbHRhICA9IHNsb3RfaW50ZXJuYWwtPmdseXBoX2RlbHRhOwotCi0gICAgICBpbnZlcnNlID0gbG9hZGVyLT50cmFuc19tYXRyaXg7Ci0gICAgICBpZiAoICFGVF9NYXRyaXhfSW52ZXJ0KCAmaW52ZXJzZSApICkKLSAgICAgICAgRlRfVmVjdG9yX1RyYW5zZm9ybSggJmxvYWRlci0+dHJhbnNfZGVsdGEsICZpbnZlcnNlICk7Ci0gICAgfQotCi0gICAgc3dpdGNoICggc2xvdC0+Zm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORToKLSAgICAgIC8qIHRyYW5zbGF0ZSB0aGUgbG9hZGVkIGdseXBoIHdoZW4gYW4gaW50ZXJuYWwgdHJhbnNmb3JtIGlzIG5lZWRlZCAqLwotICAgICAgaWYgKCBsb2FkZXItPnRyYW5zZm9ybWVkICkKLSAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZzbG90LT5vdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT50cmFuc19kZWx0YS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT50cmFuc19kZWx0YS55ICk7Ci0KLSAgICAgIC8qIGNvbXB1dGUgb3JpZ2luYWwgaG9yaXpvbnRhbCBwaGFudG9tIHBvaW50cyAqLwotICAgICAgLyogKGFuZCBpZ25vcmUgdmVydGljYWwgb25lcykgICAgICAgICAgICAgICAgICovCi0gICAgICBsb2FkZXItPnBwMS54ID0gaGludHMtPnhfZGVsdGE7Ci0gICAgICBsb2FkZXItPnBwMS55ID0gaGludHMtPnlfZGVsdGE7Ci0gICAgICBsb2FkZXItPnBwMi54ID0gRlRfTXVsRml4KCBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludHMtPnhfc2NhbGUgKSArIGhpbnRzLT54X2RlbHRhOwotICAgICAgbG9hZGVyLT5wcDIueSA9IGhpbnRzLT55X2RlbHRhOwotCi0gICAgICAvKiBiZSBzdXJlIHRvIGNoZWNrIGZvciBzcGFjaW5nIGdseXBocyAqLwotICAgICAgaWYgKCBzbG90LT5vdXRsaW5lLm5fcG9pbnRzID09IDAgKQotICAgICAgICBnb3RvIEhpbnRfTWV0cmljczsKLQotICAgICAgLyogbm93IGxvYWQgdGhlIHNsb3QgaW1hZ2UgaW50byB0aGUgYXV0by1vdXRsaW5lICovCi0gICAgICAvKiBhbmQgcnVuIHRoZSBhdXRvbWF0aWMgaGludGluZyBwcm9jZXNzICAgICAgICAgKi8KLSAgICAgIGlmICggd3JpdGluZ19zeXN0ZW1fY2xhc3MtPnN0eWxlX2hpbnRzX2FwcGx5ICkKLSAgICAgICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MtPnN0eWxlX2hpbnRzX2FwcGx5KCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYWRlci0+YmFzZS5vdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlX21ldHJpY3MgKTsKLQotICAgICAgLyogd2Ugbm93IG5lZWQgdG8gYWRqdXN0IHRoZSBtZXRyaWNzIGFjY29yZGluZyB0byB0aGUgY2hhbmdlIGluICovCi0gICAgICAvKiB3aWR0aC9wb3NpdGlvbmluZyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgaGludGluZyBwcm9jZXNzICAgKi8KLSAgICAgIGlmICggc2NhbGVyLnJlbmRlcl9tb2RlICE9IEZUX1JFTkRFUl9NT0RFX0xJR0hUICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBvbGRfcnNiLCBvbGRfbHNiLCBuZXdfbHNiOwotICAgICAgICBGVF9Qb3MgIHBwMXhfdWgsIHBwMnhfdWg7Ci0KLSAgICAgICAgQUZfQXhpc0hpbnRzICBheGlzICA9ICZoaW50cy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl07Ci0gICAgICAgIEFGX0VkZ2UgICAgICAgZWRnZTEgPSBheGlzLT5lZGdlczsgICAgICAgICAvKiBsZWZ0bW9zdCBlZGdlICAqLwotICAgICAgICBBRl9FZGdlICAgICAgIGVkZ2UyID0gZWRnZTEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy0+bnVtX2VkZ2VzIC0gMTsgLyogcmlnaHRtb3N0IGVkZ2UgKi8KLQotCi0gICAgICAgIGlmICggYXhpcy0+bnVtX2VkZ2VzID4gMSAmJiBBRl9ISU5UU19ET19BRFZBTkNFKCBoaW50cyApICkKLSAgICAgICAgewotICAgICAgICAgIG9sZF9yc2IgPSBsb2FkZXItPnBwMi54IC0gZWRnZTItPm9wb3M7Ci0gICAgICAgICAgLyogbG9hZGVyLT5wcDEueCBpcyBhbHdheXMgemVybyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgKi8KLSAgICAgICAgICBvbGRfbHNiID0gZWRnZTEtPm9wb3MgLyogLSBsb2FkZXItPnBwMS54ICovOwotICAgICAgICAgIG5ld19sc2IgPSBlZGdlMS0+cG9zOwotCi0gICAgICAgICAgLyogcmVtZW1iZXIgdW5oaW50ZWQgdmFsdWVzIHRvIGxhdGVyIGFjY291bnQgKi8KLSAgICAgICAgICAvKiBmb3Igcm91bmRpbmcgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHBwMXhfdWggPSBuZXdfbHNiICAgIC0gb2xkX2xzYjsKLSAgICAgICAgICBwcDJ4X3VoID0gZWRnZTItPnBvcyArIG9sZF9yc2I7Ci0KLSAgICAgICAgICAvKiBwcmVmZXIgdG9vIG11Y2ggc3BhY2Ugb3ZlciB0b28gbGl0dGxlIHNwYWNlICovCi0gICAgICAgICAgLyogZm9yIHZlcnkgc21hbGwgc2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgaWYgKCBvbGRfbHNiIDwgMjQgKQotICAgICAgICAgICAgcHAxeF91aCAtPSA4OwotCi0gICAgICAgICAgaWYgKCBvbGRfcnNiIDwgMjQgKQotICAgICAgICAgICAgcHAyeF91aCArPSA4OwotCi0gICAgICAgICAgbG9hZGVyLT5wcDEueCA9IEZUX1BJWF9ST1VORCggcHAxeF91aCApOwotICAgICAgICAgIGxvYWRlci0+cHAyLnggPSBGVF9QSVhfUk9VTkQoIHBwMnhfdWggKTsKLQotICAgICAgICAgIGlmICggbG9hZGVyLT5wcDEueCA+PSBuZXdfbHNiICYmIG9sZF9sc2IgPiAwICkKLSAgICAgICAgICAgIGxvYWRlci0+cHAxLnggLT0gNjQ7Ci0KLSAgICAgICAgICBpZiAoIGxvYWRlci0+cHAyLnggPD0gZWRnZTItPnBvcyAmJiBvbGRfcnNiID4gMCApCi0gICAgICAgICAgICBsb2FkZXItPnBwMi54ICs9IDY0OwotCi0gICAgICAgICAgc2xvdC0+bHNiX2RlbHRhID0gbG9hZGVyLT5wcDEueCAtIHBwMXhfdWg7Ci0gICAgICAgICAgc2xvdC0+cnNiX2RlbHRhID0gbG9hZGVyLT5wcDIueCAtIHBwMnhfdWg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICBwcDF4ID0gbG9hZGVyLT5wcDEueDsKLSAgICAgICAgICBGVF9Qb3MgIHBwMnggPSBsb2FkZXItPnBwMi54OwotCi0KLSAgICAgICAgICBsb2FkZXItPnBwMS54ID0gRlRfUElYX1JPVU5EKCBwcDF4ICsgaGludHMtPnhtaW5fZGVsdGEgKTsKLSAgICAgICAgICBsb2FkZXItPnBwMi54ID0gRlRfUElYX1JPVU5EKCBwcDJ4ICsgaGludHMtPnhtYXhfZGVsdGEgKTsKLQotICAgICAgICAgIHNsb3QtPmxzYl9kZWx0YSA9IGxvYWRlci0+cHAxLnggLSBwcDF4OwotICAgICAgICAgIHNsb3QtPnJzYl9kZWx0YSA9IGxvYWRlci0+cHAyLnggLSBwcDJ4OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBgbGlnaHQnIG1vZGUgdXNlcyBpbnRlZ2VyIGFkdmFuY2Ugd2lkdGhzICovCi0gICAgICAvKiBidXQgc2V0cyBgbHNiX2RlbHRhJyBhbmQgYHJzYl9kZWx0YScgICAgICovCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgcHAxeCA9IGxvYWRlci0+cHAxLng7Ci0gICAgICAgIEZUX1BvcyAgcHAyeCA9IGxvYWRlci0+cHAyLng7Ci0KLQotICAgICAgICBsb2FkZXItPnBwMS54ID0gRlRfUElYX1JPVU5EKCBwcDF4ICk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggPSBGVF9QSVhfUk9VTkQoIHBwMnggKTsKLQotICAgICAgICBzbG90LT5sc2JfZGVsdGEgPSBsb2FkZXItPnBwMS54IC0gcHAxeDsKLSAgICAgICAgc2xvdC0+cnNiX2RlbHRhID0gbG9hZGVyLT5wcDIueCAtIHBwMng7Ci0gICAgICB9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHdlIGRvbid0IHN1cHBvcnQgb3RoZXIgZm9ybWF0cyAoeWV0PykgKi8KLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgIH0KLQotICBIaW50X01ldHJpY3M6Ci0gICAgewotICAgICAgRlRfQkJveCAgICBiYm94OwotICAgICAgRlRfVmVjdG9yICB2dmVjdG9yOwotCi0KLSAgICAgIHZ2ZWN0b3IueCA9IHNsb3QtPm1ldHJpY3MudmVydEJlYXJpbmdYIC0gc2xvdC0+bWV0cmljcy5ob3JpQmVhcmluZ1g7Ci0gICAgICB2dmVjdG9yLnkgPSBzbG90LT5tZXRyaWNzLnZlcnRCZWFyaW5nWSAtIHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdZOwotICAgICAgdnZlY3Rvci54ID0gRlRfTXVsRml4KCB2dmVjdG9yLngsIHN0eWxlX21ldHJpY3MtPnNjYWxlci54X3NjYWxlICk7Ci0gICAgICB2dmVjdG9yLnkgPSBGVF9NdWxGaXgoIHZ2ZWN0b3IueSwgc3R5bGVfbWV0cmljcy0+c2NhbGVyLnlfc2NhbGUgKTsKLQotICAgICAgLyogdHJhbnNmb3JtIHRoZSBoaW50ZWQgb3V0bGluZSBpZiBuZWVkZWQgKi8KLSAgICAgIGlmICggbG9hZGVyLT50cmFuc2Zvcm1lZCApCi0gICAgICB7Ci0gICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmZ2xvYWRlci0+YmFzZS5vdXRsaW5lLCAmbG9hZGVyLT50cmFuc19tYXRyaXggKTsKLSAgICAgICAgRlRfVmVjdG9yX1RyYW5zZm9ybSggJnZ2ZWN0b3IsICZsb2FkZXItPnRyYW5zX21hdHJpeCApOwotICAgICAgfQotCi0gICAgICAvKiB3ZSBtdXN0IHRyYW5zbGF0ZSBvdXIgZmluYWwgb3V0bGluZSBieSAtcHAxLnggYW5kIGNvbXB1dGUgKi8KLSAgICAgIC8qIHRoZSBuZXcgbWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBsb2FkZXItPnBwMS54ICkKLSAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZnbG9hZGVyLT5iYXNlLm91dGxpbmUsIC1sb2FkZXItPnBwMS54LCAwICk7Ci0KLSAgICAgIEZUX091dGxpbmVfR2V0X0NCb3goICZnbG9hZGVyLT5iYXNlLm91dGxpbmUsICZiYm94ICk7Ci0KLSAgICAgIGJib3gueE1pbiA9IEZUX1BJWF9GTE9PUiggYmJveC54TWluICk7Ci0gICAgICBiYm94LnlNaW4gPSBGVF9QSVhfRkxPT1IoIGJib3gueU1pbiApOwotICAgICAgYmJveC54TWF4ID0gRlRfUElYX0NFSUwoICBiYm94LnhNYXggKTsKLSAgICAgIGJib3gueU1heCA9IEZUX1BJWF9DRUlMKCAgYmJveC55TWF4ICk7Ci0KLSAgICAgIHNsb3QtPm1ldHJpY3Mud2lkdGggICAgICAgID0gYmJveC54TWF4IC0gYmJveC54TWluOwotICAgICAgc2xvdC0+bWV0cmljcy5oZWlnaHQgICAgICAgPSBiYm94LnlNYXggLSBiYm94LnlNaW47Ci0gICAgICBzbG90LT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IGJib3gueE1pbjsKLSAgICAgIHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gYmJveC55TWF4OwotCi0gICAgICBzbG90LT5tZXRyaWNzLnZlcnRCZWFyaW5nWCA9IEZUX1BJWF9GTE9PUiggYmJveC54TWluICsgdnZlY3Rvci54ICk7Ci0gICAgICBzbG90LT5tZXRyaWNzLnZlcnRCZWFyaW5nWSA9IEZUX1BJWF9GTE9PUiggYmJveC55TWF4ICsgdnZlY3Rvci55ICk7Ci0KLSAgICAgIC8qIGZvciBtb25vLXdpZHRoIGZvbnRzIChsaWtlIEFuZGFsZSwgQ291cmllciwgZXRjLikgd2UgbmVlZCAqLwotICAgICAgLyogdG8ga2VlcCB0aGUgb3JpZ2luYWwgcm91bmRlZCBhZHZhbmNlIHdpZHRoOyBkaXR0byBmb3IgICAgICovCi0gICAgICAvKiBkaWdpdHMgaWYgYWxsIGhhdmUgdGhlIHNhbWUgYWR2YW5jZSB3aWR0aCAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggc2NhbGVyLnJlbmRlcl9tb2RlICE9IEZUX1JFTkRFUl9NT0RFX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIEZUX0lTX0ZJWEVEX1dJRFRIKCBzbG90LT5mYWNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICggYWZfZmFjZV9nbG9iYWxzX2lzX2RpZ2l0KCBsb2FkZXItPmdsb2JhbHMsIGdseXBoX2luZGV4ICkgJiYKLSAgICAgICAgICAgICAgIHN0eWxlX21ldHJpY3MtPmRpZ2l0c19oYXZlX3NhbWVfd2lkdGggICAgICAgICAgICAgICAgICAgICkgKSApCi0gICAgICB7Ci0gICAgICAgIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPQotICAgICAgICAgIEZUX011bEZpeCggc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0eWxlX21ldHJpY3MtPnNjYWxlci54X3NjYWxlICk7Ci0KLSAgICAgICAgLyogU2V0IGRlbHRhIHZhbHVlcyB0byAwLiAgT3RoZXJ3aXNlIGNvZGUgdGhhdCB1c2VzIHRoZW0gaXMgKi8KLSAgICAgICAgLyogZ29pbmcgdG8gcnVpbiB0aGUgZml4ZWQgYWR2YW5jZSB3aWR0aC4gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgc2xvdC0+bHNiX2RlbHRhID0gMDsKLSAgICAgICAgc2xvdC0+cnNiX2RlbHRhID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogbm9uLXNwYWNpbmcgZ2x5cGhzIG11c3Qgc3RheSBhcy1pcyAqLwotICAgICAgICBpZiAoIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgKQotICAgICAgICAgIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPSBsb2FkZXItPnBwMi54IC0gbG9hZGVyLT5wcDEueDsKLSAgICAgIH0KLQotICAgICAgc2xvdC0+bWV0cmljcy52ZXJ0QWR2YW5jZSA9IEZUX011bEZpeCggc2xvdC0+bWV0cmljcy52ZXJ0QWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlX21ldHJpY3MtPnNjYWxlci55X3NjYWxlICk7Ci0KLSAgICAgIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPSBGVF9QSVhfUk9VTkQoIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgKTsKLSAgICAgIHNsb3QtPm1ldHJpY3MudmVydEFkdmFuY2UgPSBGVF9QSVhfUk9VTkQoIHNsb3QtPm1ldHJpY3MudmVydEFkdmFuY2UgKTsKLQotICAgICAgc2xvdC0+Zm9ybWF0ICA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoKLSAgICogQ29tcHV0ZSBhbW91bnQgb2YgZm9udCB1bml0cyB0aGUgZmFjZSBzaG91bGQgYmUgZW1ib2xkZW5lZCBieSwgaW4KLSAgICogYW5hbG9neSB0byB0aGUgQ0ZGIGRyaXZlcidzIGBjZjJfY29tcHV0ZURhcmtlbmluZycgZnVuY3Rpb24uICBTZWUgdGhlcmUKLSAgICogZm9yIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobS4KLSAgICoKLSAgICogWFhYOiBDdXJyZW50bHkgYSBjcnVkZSBhZGFwdGlvbiBvZiB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtLiAgRG8gYmV0dGVyPwotICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9JbnQzMiApCi0gIGFmX2xvYWRlcl9jb21wdXRlX2RhcmtlbmluZyggQUZfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgc3RhbmRhcmRfd2lkdGggKQotICB7Ci0gICAgQUZfTW9kdWxlICBtb2R1bGUgPSBsb2FkZXItPmdsb2JhbHMtPm1vZHVsZTsKLQotICAgIEZUX1VTaG9ydCAgdW5pdHNfcGVyX0VNOwotICAgIEZUX0ZpeGVkICAgcHBlbSwgZW1fcmF0aW87Ci0gICAgRlRfRml4ZWQgICBzdGVtX3dpZHRoLCBzdGVtX3dpZHRoX3Blcl8xMDAwLCBzY2FsZWRfc3RlbSwgZGFya2VuX2Ftb3VudDsKLSAgICBGVF9JbnQgICAgIGxvZ19iYXNlXzI7Ci0gICAgRlRfSW50ICAgICB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQ7Ci0KLQotICAgIHBwZW0gICAgICAgICA9IEZUX01BWCggYWZfaW50VG9GaXhlZCggNCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZfaW50VG9GaXhlZCggZmFjZS0+c2l6ZS0+bWV0cmljcy54X3BwZW0gKSApOwotICAgIHVuaXRzX3Blcl9FTSA9IGZhY2UtPnVuaXRzX3Blcl9FTTsKLQotICAgIGVtX3JhdGlvID0gRlRfRGl2Rml4KCBhZl9pbnRUb0ZpeGVkKCAxMDAwICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmX2ludFRvRml4ZWQgKCB1bml0c19wZXJfRU0gKSApOwotICAgIGlmICggZW1fcmF0aW8gPCBhZl9mbG9hdFRvRml4ZWQoIC4wMSApICkKLSAgICB7Ci0gICAgICAvKiBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgZG9uJ3QgZW1ib2xkZW4uICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB4MSA9IG1vZHVsZS0+ZGFya2VuX3BhcmFtc1swXTsKLSAgICB5MSA9IG1vZHVsZS0+ZGFya2VuX3BhcmFtc1sxXTsKLSAgICB4MiA9IG1vZHVsZS0+ZGFya2VuX3BhcmFtc1syXTsKLSAgICB5MiA9IG1vZHVsZS0+ZGFya2VuX3BhcmFtc1szXTsKLSAgICB4MyA9IG1vZHVsZS0+ZGFya2VuX3BhcmFtc1s0XTsKLSAgICB5MyA9IG1vZHVsZS0+ZGFya2VuX3BhcmFtc1s1XTsKLSAgICB4NCA9IG1vZHVsZS0+ZGFya2VuX3BhcmFtc1s2XTsKLSAgICB5NCA9IG1vZHVsZS0+ZGFya2VuX3BhcmFtc1s3XTsKLQotICAgIGlmICggc3RhbmRhcmRfd2lkdGggPD0gMCApCi0gICAgewotICAgICAgc3RlbV93aWR0aCAgICAgICAgICA9IGFmX2ludFRvRml4ZWQoIDc1ICk7IC8qIHRha2VuIGZyb20gY2YyZm9udC5jICovCi0gICAgICBzdGVtX3dpZHRoX3Blcl8xMDAwID0gc3RlbV93aWR0aDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN0ZW1fd2lkdGggICAgICAgICAgPSBhZl9pbnRUb0ZpeGVkKCBzdGFuZGFyZF93aWR0aCApOwotICAgICAgc3RlbV93aWR0aF9wZXJfMTAwMCA9IEZUX011bEZpeCggc3RlbV93aWR0aCwgZW1fcmF0aW8gKTsKLSAgICB9Ci0KLSAgICBsb2dfYmFzZV8yID0gRlRfTVNCKCAoRlRfVUludDMyKXN0ZW1fd2lkdGhfcGVyXzEwMDAgKSArCi0gICAgICAgICAgICAgICAgIEZUX01TQiggKEZUX1VJbnQzMilwcGVtICk7Ci0KLSAgICBpZiAoIGxvZ19iYXNlXzIgPj0gNDYgKQotICAgIHsKLSAgICAgIC8qIHBvc3NpYmxlIG92ZXJmbG93ICovCi0gICAgICBzY2FsZWRfc3RlbSA9IGFmX2ludFRvRml4ZWQoIHg0ICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHNjYWxlZF9zdGVtID0gRlRfTXVsRml4KCBzdGVtX3dpZHRoX3Blcl8xMDAwLCBwcGVtICk7Ci0KLSAgICAvKiBub3cgYXBwbHkgdGhlIGRhcmtlbmluZyBwYXJhbWV0ZXJzICovCi0gICAgaWYgKCBzY2FsZWRfc3RlbSA8IGFmX2ludFRvRml4ZWQoIHgxICkgKQotICAgICAgZGFya2VuX2Ftb3VudCA9IEZUX0RpdkZpeCggYWZfaW50VG9GaXhlZCggeTEgKSwgcHBlbSApOwotCi0gICAgZWxzZSBpZiAoIHNjYWxlZF9zdGVtIDwgYWZfaW50VG9GaXhlZCggeDIgKSApCi0gICAgewotICAgICAgRlRfSW50ICB4ZGVsdGEgPSB4MiAtIHgxOwotICAgICAgRlRfSW50ICB5ZGVsdGEgPSB5MiAtIHkxOwotICAgICAgRlRfSW50ICB4ICAgICAgPSBzdGVtX3dpZHRoX3Blcl8xMDAwIC0KLSAgICAgICAgICAgICAgICAgICAgICAgRlRfRGl2Rml4KCBhZl9pbnRUb0ZpeGVkKCB4MSApLCBwcGVtICk7Ci0KLQotICAgICAgaWYgKCAheGRlbHRhICkKLSAgICAgICAgZ290byBUcnlfeDM7Ci0KLSAgICAgIGRhcmtlbl9hbW91bnQgPSBGVF9NdWxEaXYoIHgsIHlkZWx0YSwgeGRlbHRhICkgKwotICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggYWZfaW50VG9GaXhlZCggeTEgKSwgcHBlbSApOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCBzY2FsZWRfc3RlbSA8IGFmX2ludFRvRml4ZWQoIHgzICkgKQotICAgIHsKLSAgICBUcnlfeDM6Ci0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgeGRlbHRhID0geDMgLSB4MjsKLSAgICAgICAgRlRfSW50ICB5ZGVsdGEgPSB5MyAtIHkyOwotICAgICAgICBGVF9JbnQgIHggICAgICA9IHN0ZW1fd2lkdGhfcGVyXzEwMDAgLQotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggYWZfaW50VG9GaXhlZCggeDIgKSwgcHBlbSApOwotCi0KLSAgICAgICAgaWYgKCAheGRlbHRhICkKLSAgICAgICAgICBnb3RvIFRyeV94NDsKLQotICAgICAgICBkYXJrZW5fYW1vdW50ID0gRlRfTXVsRGl2KCB4LCB5ZGVsdGEsIHhkZWx0YSApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggYWZfaW50VG9GaXhlZCggeTIgKSwgcHBlbSApOwotICAgICAgfQotICAgIH0KLQotICAgIGVsc2UgaWYgKCBzY2FsZWRfc3RlbSA8IGFmX2ludFRvRml4ZWQoIHg0ICkgKQotICAgIHsKLSAgICBUcnlfeDQ6Ci0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgeGRlbHRhID0geDQgLSB4MzsKLSAgICAgICAgRlRfSW50ICB5ZGVsdGEgPSB5NCAtIHkzOwotICAgICAgICBGVF9JbnQgIHggICAgICA9IHN0ZW1fd2lkdGhfcGVyXzEwMDAgLQotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggYWZfaW50VG9GaXhlZCggeDMgKSwgcHBlbSApOwotCi0KLSAgICAgICAgaWYgKCAheGRlbHRhICkKLSAgICAgICAgICBnb3RvIFVzZV95NDsKLQotICAgICAgICBkYXJrZW5fYW1vdW50ID0gRlRfTXVsRGl2KCB4LCB5ZGVsdGEsIHhkZWx0YSApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggYWZfaW50VG9GaXhlZCggeTMgKSwgcHBlbSApOwotICAgICAgfQotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgVXNlX3k0OgotICAgICAgZGFya2VuX2Ftb3VudCA9IEZUX0RpdkZpeCggYWZfaW50VG9GaXhlZCggeTQgKSwgcHBlbSApOwotICAgIH0KLQotICAgIC8qIENvbnZlcnQgZGFya2VuX2Ftb3VudCBmcm9tIHBlciAxMDAwIGVtIHRvIHRydWUgY2hhcmFjdGVyIHNwYWNlLiAqLwotICAgIHJldHVybiBhZl9maXhlZFRvSW50KCBGVF9EaXZGaXgoIGRhcmtlbl9hbW91bnQsIGVtX3JhdGlvICkgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsb2FkZXIuaCBiL3NyYy9hdXRvZml0L2FmbG9hZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzhhYmUuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZsb2FkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbG9hZGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBnbHlwaCBsb2FkaW5nIHJvdXRpbmVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBBRkxPQURFUl9IXwotI2RlZmluZSBBRkxPQURFUl9IXwotCi0jaW5jbHVkZSAiYWZoaW50cy5oIgotI2luY2x1ZGUgImFmbW9kdWxlLmgiCi0jaW5jbHVkZSAiYWZnbG9iYWwuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKgotICAgKiAgVGhlIGF1dG9maXR0ZXIgbW9kdWxlJ3MgKGdsb2JhbCkgZGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aAotICAgKiAgYWN0dWFsIGZvbnRzLiAgSWYgbmVjZXNzYXJ5LCBgbG9jYWwnIGRhdGEgbGlrZSB0aGUgY3VycmVudCBmYWNlLCB0aGUKLSAgICogIGN1cnJlbnQgZmFjZSdzIGF1dG8taGludCBkYXRhLCBvciB0aGUgY3VycmVudCBnbHlwaCdzIHBhcmFtZXRlcnMKLSAgICogIHJlbGV2YW50IHRvIGF1dG8taGludGluZyBhcmUgYHN3YXBwZWQgaW4nLiAgQ2YuIGZ1bmN0aW9ucyBsaWtlCi0gICAqICBgYWZfbG9hZGVyX3Jlc2V0JyBhbmQgYGFmX2xvYWRlcl9sb2FkX2cnLgotICAgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfTG9hZGVyUmVjXwotICB7Ci0gICAgLyogY3VycmVudCBmYWNlIGRhdGEgKi8KLSAgICBGVF9GYWNlICAgICAgICAgICBmYWNlOwotICAgIEFGX0ZhY2VHbG9iYWxzICAgIGdsb2JhbHM7Ci0KLSAgICAvKiBjdXJyZW50IGdseXBoIGRhdGEgKi8KLSAgICBBRl9HbHlwaEhpbnRzICAgICBoaW50czsKLSAgICBBRl9TdHlsZU1ldHJpY3MgICBtZXRyaWNzOwotICAgIEZUX0Jvb2wgICAgICAgICAgIHRyYW5zZm9ybWVkOwotICAgIEZUX01hdHJpeCAgICAgICAgIHRyYW5zX21hdHJpeDsKLSAgICBGVF9WZWN0b3IgICAgICAgICB0cmFuc19kZWx0YTsKLSAgICBGVF9WZWN0b3IgICAgICAgICBwcDE7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgcHAyOwotICAgIC8qIHdlIGRvbid0IGhhbmRsZSB2ZXJ0aWNhbCBwaGFudG9tIHBvaW50cyAqLwotCi0gIH0gQUZfTG9hZGVyUmVjLCAqQUZfTG9hZGVyOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9sb2FkZXJfaW5pdCggQUZfTG9hZGVyICAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgQUZfR2x5cGhIaW50cyAgaGludHMgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmX2xvYWRlcl9yZXNldCggQUZfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgQUZfTW9kdWxlICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICBmYWNlICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX2xvYWRlcl9kb25lKCBBRl9Mb2FkZXIgIGxvYWRlciApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfbG9hZGVyX2xvYWRfZ2x5cGgoIEFGX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgQUZfTW9kdWxlICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgbG9hZF9mbGFncyApOwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfSW50MzIgKQotICBhZl9sb2FkZXJfY29tcHV0ZV9kYXJrZW5pbmcoIEFGX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgIHN0YW5kYXJkX3dpZHRoICk7Ci0KLS8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogQUZMT0FERVJfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmbW9kdWxlLmMgYi9zcmMvYXV0b2ZpdC9hZm1vZHVsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdiYTIyLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmbW9kdWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZtb2R1bGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYWZnbG9iYWwuaCIKLSNpbmNsdWRlICJhZm1vZHVsZS5oIgotI2luY2x1ZGUgImFmbG9hZGVyLmgiCi0jaW5jbHVkZSAiYWZlcnJvcnMuaCIKLSNpbmNsdWRlICJhZnBpYy5oIgotCi0jaWZkZWYgRlRfREVCVUdfQVVUT0ZJVAotCi0jaWZuZGVmIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gIGV4dGVybiAiQyIgewotI2VuZGlmCi0gIGV4dGVybiB2b2lkCi0gIGFmX2dseXBoX2hpbnRzX2R1bXBfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICB0b19zdGRvdXQgKTsKLSAgZXh0ZXJuIHZvaWQKLSAgYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgdG9fc3Rkb3V0ICk7Ci0gIGV4dGVybiB2b2lkCi0gIGFmX2dseXBoX2hpbnRzX2R1bXBfZWRnZXMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICB0b19zdGRvdXQgKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotICB9Ci0jZW5kaWYKLQotI2VuZGlmCi0KLSAgaW50ICBfYWZfZGVidWdfZGlzYWJsZV9ob3J6X2hpbnRzOwotICBpbnQgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHM7Ci0gIGludCAgX2FmX2RlYnVnX2Rpc2FibGVfYmx1ZV9oaW50czsKLQotICAvKiB3ZSB1c2UgYSBnbG9iYWwgb2JqZWN0IGluc3RlYWQgb2YgYSBsb2NhbCBvbmUgZm9yIGRlYnVnZ2luZyAqLwotICBBRl9HbHlwaEhpbnRzUmVjICBfYWZfZGVidWdfaGludHNfcmVjWzFdOwotCi0gIHZvaWQqICBfYWZfZGVidWdfaGludHMgPSBfYWZfZGVidWdfaGludHNfcmVjOwotI2VuZGlmCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfQVVUT0hJTlRFUl9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYWZtb2R1bGUKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9wcm9wZXJ0eV9nZXRfZmFjZV9nbG9iYWxzKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0ZhY2VHbG9iYWxzKiAgYWdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX01vZHVsZSAgICAgICAgbW9kdWxlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBBRl9GYWNlR2xvYmFscyAgZ2xvYmFsczsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGdsb2JhbHMgPSAoQUZfRmFjZUdsb2JhbHMpZmFjZS0+YXV0b2hpbnQuZGF0YTsKLSAgICBpZiAoICFnbG9iYWxzICkKLSAgICB7Ci0gICAgICAvKiB0cmlnZ2VyIGNvbXB1dGF0aW9uIG9mIHRoZSBnbG9iYWwgc3R5bGUgZGF0YSAqLwotICAgICAgLyogaW4gY2FzZSBpdCBoYXNuJ3QgYmVlbiBkb25lIHlldCAgICAgICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gYWZfZmFjZV9nbG9iYWxzX25ldyggZmFjZSwgJmdsb2JhbHMsIG1vZHVsZSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBmYWNlLT5hdXRvaGludC5kYXRhID0KLSAgICAgICAgICAoRlRfUG9pbnRlcilnbG9iYWxzOwotICAgICAgICBmYWNlLT5hdXRvaGludC5maW5hbGl6ZXIgPQotICAgICAgICAgIChGVF9HZW5lcmljX0ZpbmFsaXplcilhZl9mYWNlX2dsb2JhbHNfZnJlZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgICAqYWdsb2JhbHMgPSBnbG9iYWxzOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSN1bmRlZiAgQUZfU0NSSVBUX0NMQVNTRVNfR0VUCi0jZGVmaW5lIEFGX1NDUklQVF9DTEFTU0VTX0dFVCAgXAotICAgICAgICAgICggR0VUX1BJQyggZnRfbW9kdWxlLT5saWJyYXJ5ICktPmFmX3NjcmlwdF9jbGFzc2VzICkKLQotI3VuZGVmICBBRl9TVFlMRV9DTEFTU0VTX0dFVAotI2RlZmluZSBBRl9TVFlMRV9DTEFTU0VTX0dFVCAgXAotICAgICAgICAgICggR0VUX1BJQyggZnRfbW9kdWxlLT5saWJyYXJ5ICktPmFmX3N0eWxlX2NsYXNzZXMgKQotCi0jZW5kaWYKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9wcm9wZXJ0eV9zZXQoIEZUX01vZHVsZSAgICBmdF9tb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIHZhbHVlLAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICB2YWx1ZV9pc19zdHJpbmcgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgQUZfTW9kdWxlICBtb2R1bGUgPSAoQUZfTW9kdWxlKWZ0X21vZHVsZTsKLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLSAgICBGVF9VTlVTRUQoIHZhbHVlX2lzX3N0cmluZyApOwotI2VuZGlmCi0KLQotICAgIGlmICggIWZ0X3N0cmNtcCggcHJvcGVydHlfbmFtZSwgImZhbGxiYWNrLXNjcmlwdCIgKSApCi0gICAgewotICAgICAgRlRfVUludCogIGZhbGxiYWNrX3NjcmlwdDsKLSAgICAgIEZUX1VJbnQgICBzczsKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTCi0gICAgICBpZiAoIHZhbHVlX2lzX3N0cmluZyApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotI2VuZGlmCi0KLSAgICAgIGZhbGxiYWNrX3NjcmlwdCA9IChGVF9VSW50Kil2YWx1ZTsKLQotICAgICAgLyogV2UgdHJhbnNsYXRlIHRoZSBmYWxsYmFjayBzY3JpcHQgdG8gYSBmYWxsYmFjayBzdHlsZSB0aGF0IHVzZXMgKi8KLSAgICAgIC8qIGBmYWxsYmFjay1zY3JpcHQnIGFzIGl0cyBzY3JpcHQgYW5kIGBBRl9DT1ZFUkFHRV9OT05FJyBhcyBpdHMgICovCi0gICAgICAvKiBjb3ZlcmFnZSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZm9yICggc3MgPSAwOyBBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc107IHNzKysgKQotICAgICAgewotICAgICAgICBBRl9TdHlsZUNsYXNzICBzdHlsZV9jbGFzcyA9IEFGX1NUWUxFX0NMQVNTRVNfR0VUW3NzXTsKLQotCi0gICAgICAgIGlmICggKEZUX1VJbnQpc3R5bGVfY2xhc3MtPnNjcmlwdCA9PSAqZmFsbGJhY2tfc2NyaXB0ICYmCi0gICAgICAgICAgICAgc3R5bGVfY2xhc3MtPmNvdmVyYWdlID09IEFGX0NPVkVSQUdFX0RFRkFVTFQgICAgICkKLSAgICAgICAgewotICAgICAgICAgIG1vZHVsZS0+ZmFsbGJhY2tfc3R5bGUgPSBzczsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoICFBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc10gKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAiYWZfcHJvcGVydHlfc2V0OiBJbnZhbGlkIHZhbHVlICVkIGZvciBwcm9wZXJ0eSBgJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICBmYWxsYmFja19zY3JpcHQsIHByb3BlcnR5X25hbWUgKSk7Ci0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgfQotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiZGVmYXVsdC1zY3JpcHQiICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQqICBkZWZhdWx0X3NjcmlwdDsKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTCi0gICAgICBpZiAoIHZhbHVlX2lzX3N0cmluZyApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotI2VuZGlmCi0KLSAgICAgIGRlZmF1bHRfc2NyaXB0ID0gKEZUX1VJbnQqKXZhbHVlOwotCi0gICAgICBtb2R1bGUtPmRlZmF1bHRfc2NyaXB0ID0gKmRlZmF1bHRfc2NyaXB0OwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiaW5jcmVhc2UteC1oZWlnaHQiICkgKQotICAgIHsKLSAgICAgIEZUX1Byb3BfSW5jcmVhc2VYSGVpZ2h0KiAgcHJvcDsKLSAgICAgIEFGX0ZhY2VHbG9iYWxzICAgICAgICAgICAgZ2xvYmFsczsKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTCi0gICAgICBpZiAoIHZhbHVlX2lzX3N0cmluZyApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotI2VuZGlmCi0KLSAgICAgIHByb3AgPSAoRlRfUHJvcF9JbmNyZWFzZVhIZWlnaHQqKXZhbHVlOwotCi0gICAgICBlcnJvciA9IGFmX3Byb3BlcnR5X2dldF9mYWNlX2dsb2JhbHMoIHByb3AtPmZhY2UsICZnbG9iYWxzLCBtb2R1bGUgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgZ2xvYmFscy0+aW5jcmVhc2VfeF9oZWlnaHQgPSBwcm9wLT5saW1pdDsKLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLSAgICBlbHNlIGlmICggIWZ0X3N0cmNtcCggcHJvcGVydHlfbmFtZSwgIndhcnBpbmciICkgKQotICAgIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLSAgICAgIGlmICggdmFsdWVfaXNfc3RyaW5nICkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogIHMgPSAoY29uc3QgY2hhciopdmFsdWU7Ci0gICAgICAgIGxvbmcgICAgICAgICB3ID0gZnRfc3RydG9sKCBzLCBOVUxMLCAxMCApOwotCi0KLSAgICAgICAgaWYgKCB3ID09IDAgKQotICAgICAgICAgIG1vZHVsZS0+d2FycGluZyA9IDA7Ci0gICAgICAgIGVsc2UgaWYgKCB3ID09IDEgKQotICAgICAgICAgIG1vZHVsZS0+d2FycGluZyA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgICBGVF9Cb29sKiAgd2FycGluZyA9IChGVF9Cb29sKil2YWx1ZTsKLQotCi0gICAgICAgIG1vZHVsZS0+d2FycGluZyA9ICp3YXJwaW5nOwotICAgICAgfQotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUiAqLwotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiZGFya2VuaW5nLXBhcmFtZXRlcnMiICkgKQotICAgIHsKLSAgICAgIEZUX0ludCogIGRhcmtlbl9wYXJhbXM7Ci0gICAgICBGVF9JbnQgICB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQ7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLSAgICAgIEZUX0ludCAgIGRwWzhdOwotCi0KLSAgICAgIGlmICggdmFsdWVfaXNfc3RyaW5nICkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogIHMgPSAoY29uc3QgY2hhciopdmFsdWU7Ci0gICAgICAgIGNoYXIqICAgICAgICBlcDsKLSAgICAgICAgaW50ICAgICAgICAgIGk7Ci0KLQotICAgICAgICAvKiBlaWdodCBjb21tYS1zZXBhcmF0ZWQgbnVtYmVycyAqLwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDc7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBkcFtpXSA9IChGVF9JbnQpZnRfc3RydG9sKCBzLCAmZXAsIDEwICk7Ci0gICAgICAgICAgaWYgKCAqZXAgIT0gJywnIHx8IHMgPT0gZXAgKQotICAgICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAgICAgICBzID0gZXAgKyAxOwotICAgICAgICB9Ci0KLSAgICAgICAgZHBbN10gPSAoRlRfSW50KWZ0X3N0cnRvbCggcywgJmVwLCAxMCApOwotICAgICAgICBpZiAoICEoICplcCA9PSAnXDAnIHx8ICplcCA9PSAnICcgKSB8fCBzID09IGVwICkKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgICAgICBkYXJrZW5fcGFyYW1zID0gZHA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgZGFya2VuX3BhcmFtcyA9IChGVF9JbnQqKXZhbHVlOwotCi0gICAgICB4MSA9IGRhcmtlbl9wYXJhbXNbMF07Ci0gICAgICB5MSA9IGRhcmtlbl9wYXJhbXNbMV07Ci0gICAgICB4MiA9IGRhcmtlbl9wYXJhbXNbMl07Ci0gICAgICB5MiA9IGRhcmtlbl9wYXJhbXNbM107Ci0gICAgICB4MyA9IGRhcmtlbl9wYXJhbXNbNF07Ci0gICAgICB5MyA9IGRhcmtlbl9wYXJhbXNbNV07Ci0gICAgICB4NCA9IGRhcmtlbl9wYXJhbXNbNl07Ci0gICAgICB5NCA9IGRhcmtlbl9wYXJhbXNbN107Ci0KLSAgICAgIGlmICggeDEgPCAwICAgfHwgeDIgPCAwICAgfHwgeDMgPCAwICAgfHwgeDQgPCAwICAgfHwKLSAgICAgICAgICAgeTEgPCAwICAgfHwgeTIgPCAwICAgfHwgeTMgPCAwICAgfHwgeTQgPCAwICAgfHwKLSAgICAgICAgICAgeDEgPiB4MiAgfHwgeDIgPiB4MyAgfHwgeDMgPiB4NCAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgeTEgPiA1MDAgfHwgeTIgPiA1MDAgfHwgeTMgPiA1MDAgfHwgeTQgPiA1MDAgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgICAgbW9kdWxlLT5kYXJrZW5fcGFyYW1zWzBdID0geDE7Ci0gICAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbMV0gPSB5MTsKLSAgICAgIG1vZHVsZS0+ZGFya2VuX3BhcmFtc1syXSA9IHgyOwotICAgICAgbW9kdWxlLT5kYXJrZW5fcGFyYW1zWzNdID0geTI7Ci0gICAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbNF0gPSB4MzsKLSAgICAgIG1vZHVsZS0+ZGFya2VuX3BhcmFtc1s1XSA9IHkzOwotICAgICAgbW9kdWxlLT5kYXJrZW5fcGFyYW1zWzZdID0geDQ7Ci0gICAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbN10gPSB5NDsKLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLSAgICBlbHNlIGlmICggIWZ0X3N0cmNtcCggcHJvcGVydHlfbmFtZSwgIm5vLXN0ZW0tZGFya2VuaW5nIiApICkKLSAgICB7Ci0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTCi0gICAgICBpZiAoIHZhbHVlX2lzX3N0cmluZyApCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIqICBzICAgPSAoY29uc3QgY2hhciopdmFsdWU7Ci0gICAgICAgIGxvbmcgICAgICAgICBuc2QgPSBmdF9zdHJ0b2woIHMsIE5VTEwsIDEwICk7Ci0KLQotICAgICAgICBpZiAoICFuc2QgKQotICAgICAgICAgIG1vZHVsZS0+bm9fc3RlbV9kYXJrZW5pbmcgPSBGQUxTRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG1vZHVsZS0+bm9fc3RlbV9kYXJrZW5pbmcgPSBUUlVFOwotICAgICAgfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICB7Ci0gICAgICAgIEZUX0Jvb2wqICBub19zdGVtX2RhcmtlbmluZyA9IChGVF9Cb29sKil2YWx1ZTsKLQotCi0gICAgICAgIG1vZHVsZS0+bm9fc3RlbV9kYXJrZW5pbmcgPSAqbm9fc3RlbV9kYXJrZW5pbmc7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTAoKCAiYWZfcHJvcGVydHlfc2V0OiBtaXNzaW5nIHByb3BlcnR5IGAlcydcbiIsCi0gICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIE1pc3NpbmdfUHJvcGVydHkgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX3Byb3BlcnR5X2dldCggRlRfTW9kdWxlICAgIGZ0X21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdmFsdWUgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBBRl9Nb2R1bGUgIG1vZHVsZSAgICAgICAgID0gKEFGX01vZHVsZSlmdF9tb2R1bGU7Ci0gICAgRlRfVUludCAgICBmYWxsYmFja19zdHlsZSA9IG1vZHVsZS0+ZmFsbGJhY2tfc3R5bGU7Ci0gICAgRlRfVUludCAgICBkZWZhdWx0X3NjcmlwdCA9IG1vZHVsZS0+ZGVmYXVsdF9zY3JpcHQ7Ci0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCi0gICAgRlRfQm9vbCAgICB3YXJwaW5nICAgICAgICA9IG1vZHVsZS0+d2FycGluZzsKLSNlbmRpZgotCi0KLSAgICBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJnbHlwaC10by1zY3JpcHQtbWFwIiApICkKLSAgICB7Ci0gICAgICBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXAqICBwcm9wID0gKEZUX1Byb3BfR2x5cGhUb1NjcmlwdE1hcCopdmFsdWU7Ci0gICAgICBBRl9GYWNlR2xvYmFscyAgICAgICAgICAgICBnbG9iYWxzOwotCi0KLSAgICAgIGVycm9yID0gYWZfcHJvcGVydHlfZ2V0X2ZhY2VfZ2xvYmFscyggcHJvcC0+ZmFjZSwgJmdsb2JhbHMsIG1vZHVsZSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBwcm9wLT5tYXAgPSBnbG9iYWxzLT5nbHlwaF9zdHlsZXM7Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJmYWxsYmFjay1zY3JpcHQiICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQqICB2YWwgPSAoRlRfVUludCopdmFsdWU7Ci0KLSAgICAgIEFGX1N0eWxlQ2xhc3MgIHN0eWxlX2NsYXNzID0gQUZfU1RZTEVfQ0xBU1NFU19HRVRbZmFsbGJhY2tfc3R5bGVdOwotCi0KLSAgICAgICp2YWwgPSBzdHlsZV9jbGFzcy0+c2NyaXB0OwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiZGVmYXVsdC1zY3JpcHQiICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQqICB2YWwgPSAoRlRfVUludCopdmFsdWU7Ci0KLQotICAgICAgKnZhbCA9IGRlZmF1bHRfc2NyaXB0OwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiaW5jcmVhc2UteC1oZWlnaHQiICkgKQotICAgIHsKLSAgICAgIEZUX1Byb3BfSW5jcmVhc2VYSGVpZ2h0KiAgcHJvcCA9IChGVF9Qcm9wX0luY3JlYXNlWEhlaWdodCopdmFsdWU7Ci0gICAgICBBRl9GYWNlR2xvYmFscyAgICAgICAgICAgIGdsb2JhbHM7Ci0KLQotICAgICAgZXJyb3IgPSBhZl9wcm9wZXJ0eV9nZXRfZmFjZV9nbG9iYWxzKCBwcm9wLT5mYWNlLCAmZ2xvYmFscywgbW9kdWxlICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHByb3AtPmxpbWl0ID0gZ2xvYmFscy0+aW5jcmVhc2VfeF9oZWlnaHQ7Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCi0gICAgZWxzZSBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJ3YXJwaW5nIiApICkKLSAgICB7Ci0gICAgICBGVF9Cb29sKiAgdmFsID0gKEZUX0Jvb2wqKXZhbHVlOwotCi0KLSAgICAgICp2YWwgPSB3YXJwaW5nOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotI2VuZGlmIC8qIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUiAqLwotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiZGFya2VuaW5nLXBhcmFtZXRlcnMiICkgKQotICAgIHsKLSAgICAgIEZUX0ludCogIGRhcmtlbl9wYXJhbXMgPSBtb2R1bGUtPmRhcmtlbl9wYXJhbXM7Ci0gICAgICBGVF9JbnQqICB2YWwgICAgICAgICAgID0gKEZUX0ludCopdmFsdWU7Ci0KLQotICAgICAgdmFsWzBdID0gZGFya2VuX3BhcmFtc1swXTsKLSAgICAgIHZhbFsxXSA9IGRhcmtlbl9wYXJhbXNbMV07Ci0gICAgICB2YWxbMl0gPSBkYXJrZW5fcGFyYW1zWzJdOwotICAgICAgdmFsWzNdID0gZGFya2VuX3BhcmFtc1szXTsKLSAgICAgIHZhbFs0XSA9IGRhcmtlbl9wYXJhbXNbNF07Ci0gICAgICB2YWxbNV0gPSBkYXJrZW5fcGFyYW1zWzVdOwotICAgICAgdmFsWzZdID0gZGFya2VuX3BhcmFtc1s2XTsKLSAgICAgIHZhbFs3XSA9IGRhcmtlbl9wYXJhbXNbN107Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJuby1zdGVtLWRhcmtlbmluZyIgKSApCi0gICAgewotICAgICAgRlRfQm9vbCAgIG5vX3N0ZW1fZGFya2VuaW5nID0gbW9kdWxlLT5ub19zdGVtX2RhcmtlbmluZzsKLSAgICAgIEZUX0Jvb2wqICB2YWwgICAgICAgICAgICAgICA9IChGVF9Cb29sKil2YWx1ZTsKLQotCi0gICAgICAqdmFsID0gbm9fc3RlbV9kYXJrZW5pbmc7Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTAoKCAiYWZfcHJvcGVydHlfZ2V0OiBtaXNzaW5nIHByb3BlcnR5IGAlcydcbiIsCi0gICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIE1pc3NpbmdfUHJvcGVydHkgKTsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0VfUFJPUEVSVElFU1JFQygKLSAgICBhZl9zZXJ2aWNlX3Byb3BlcnRpZXMsCi0KLSAgICAoRlRfUHJvcGVydGllc19TZXRGdW5jKWFmX3Byb3BlcnR5X3NldCwgICAgICAgIC8qIHNldF9wcm9wZXJ0eSAqLwotICAgIChGVF9Qcm9wZXJ0aWVzX0dldEZ1bmMpYWZfcHJvcGVydHlfZ2V0ICkgICAgICAgLyogZ2V0X3Byb3BlcnR5ICovCi0KLQotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxKAotICAgIGFmX3NlcnZpY2VzLAotCi0gICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAmQUZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCApCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX01vZHVsZV9JbnRlcmZhY2UgKQotICBhZl9nZXRfaW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX2ludGVyZmFjZSApCi0gIHsKLSAgICAvKiBBRl9TRVJWSUNFU19HRVQgZGVyZWZlcmVuY2VzIGBsaWJyYXJ5JyBpbiBQSUMgbW9kZSAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLQotCi0gICAgaWYgKCAhbW9kdWxlICkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGxpYnJhcnkgPSBtb2R1bGUtPmxpYnJhcnk7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gTlVMTDsKLSNlbHNlCi0gICAgRlRfVU5VU0VEKCBtb2R1bGUgKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIEFGX1NFUlZJQ0VTX0dFVCwgbW9kdWxlX2ludGVyZmFjZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgYWZfYXV0b2ZpdHRlcl9pbml0KCBGVF9Nb2R1bGUgIGZ0X21vZHVsZSApICAgICAgLyogQUZfTW9kdWxlICovCi0gIHsKLSAgICBBRl9Nb2R1bGUgIG1vZHVsZSA9IChBRl9Nb2R1bGUpZnRfbW9kdWxlOwotCi0KLSAgICBtb2R1bGUtPmZhbGxiYWNrX3N0eWxlICAgID0gQUZfU1RZTEVfRkFMTEJBQ0s7Ci0gICAgbW9kdWxlLT5kZWZhdWx0X3NjcmlwdCAgICA9IEFGX1NDUklQVF9ERUZBVUxUOwotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUgotICAgIG1vZHVsZS0+d2FycGluZyAgICAgICAgICAgPSAwOwotI2VuZGlmCi0gICAgbW9kdWxlLT5ub19zdGVtX2RhcmtlbmluZyA9IFRSVUU7Ci0KLSAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbMF0gID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMTsKLSAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbMV0gID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMTsKLSAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbMl0gID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMjsKLSAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbM10gID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMjsKLSAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbNF0gID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMzsKLSAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbNV0gID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMzsKLSAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbNl0gID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNDsKLSAgICBtb2R1bGUtPmRhcmtlbl9wYXJhbXNbN10gID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZNDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGFmX2F1dG9maXR0ZXJfZG9uZSggRlRfTW9kdWxlICBmdF9tb2R1bGUgKSAgICAgIC8qIEFGX01vZHVsZSAqLwotICB7Ci0gICAgRlRfVU5VU0VEKCBmdF9tb2R1bGUgKTsKLQotI2lmZGVmIEZUX0RFQlVHX0FVVE9GSVQKLSAgICBpZiAoIF9hZl9kZWJ1Z19oaW50c19yZWMtPm1lbW9yeSApCi0gICAgICBhZl9nbHlwaF9oaW50c19kb25lKCBfYWZfZGVidWdfaGludHNfcmVjICk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGFmX2F1dG9maXR0ZXJfbG9hZF9nbHlwaCggQUZfTW9kdWxlICAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IG1vZHVsZS0+cm9vdC5saWJyYXJ5LT5tZW1vcnk7Ci0KLSNpZmRlZiBGVF9ERUJVR19BVVRPRklUCi0KLSAgICAvKiBpbiBkZWJ1ZyBtb2RlLCB3ZSB1c2UgYSBnbG9iYWwgb2JqZWN0IHRoYXQgc3Vydml2ZXMgdGhpcyByb3V0aW5lICovCi0KLSAgICBBRl9HbHlwaEhpbnRzICBoaW50cyA9IF9hZl9kZWJ1Z19oaW50c19yZWM7Ci0gICAgQUZfTG9hZGVyUmVjICAgbG9hZGVyWzFdOwotCi0gICAgRlRfVU5VU0VEKCBzaXplICk7Ci0KLQotICAgIGlmICggaGludHMtPm1lbW9yeSApCi0gICAgICBhZl9nbHlwaF9oaW50c19kb25lKCBoaW50cyApOwotCi0gICAgYWZfZ2x5cGhfaGludHNfaW5pdCggaGludHMsIG1lbW9yeSApOwotICAgIGFmX2xvYWRlcl9pbml0KCBsb2FkZXIsIGhpbnRzICk7Ci0KLSAgICBlcnJvciA9IGFmX2xvYWRlcl9sb2FkX2dseXBoKCBsb2FkZXIsIG1vZHVsZSwgc2xvdC0+ZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBpZiAoIGZ0X3RyYWNlX2xldmVsc1tGVF9DT01QT05FTlRdICkKLSAgICB7Ci0jZW5kaWYKLSAgICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzKCBoaW50cywgMCApOwotICAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9zZWdtZW50cyggaGludHMsIDAgKTsKLSAgICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfZWRnZXMoIGhpbnRzLCAwICk7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICB9Ci0jZW5kaWYKLQotICAgIGFmX2xvYWRlcl9kb25lKCBsb2FkZXIgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLQotI2Vsc2UgLyogIUZUX0RFQlVHX0FVVE9GSVQgKi8KLQotICAgIEFGX0dseXBoSGludHNSZWMgIGhpbnRzWzFdOwotICAgIEFGX0xvYWRlclJlYyAgICAgIGxvYWRlclsxXTsKLQotICAgIEZUX1VOVVNFRCggc2l6ZSApOwotCi0KLSAgICBhZl9nbHlwaF9oaW50c19pbml0KCBoaW50cywgbWVtb3J5ICk7Ci0gICAgYWZfbG9hZGVyX2luaXQoIGxvYWRlciwgaGludHMgKTsKLQotICAgIGVycm9yID0gYWZfbG9hZGVyX2xvYWRfZ2x5cGgoIGxvYWRlciwgbW9kdWxlLCBzbG90LT5mYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzICk7Ci0KLSAgICBhZl9sb2FkZXJfZG9uZSggbG9hZGVyICk7Ci0gICAgYWZfZ2x5cGhfaGludHNfZG9uZSggaGludHMgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLQotI2VuZGlmIC8qICFGVF9ERUJVR19BVVRPRklUICovCi0gIH0KLQotCi0gIEZUX0RFRklORV9BVVRPSElOVEVSX0lOVEVSRkFDRSgKLSAgICBhZl9hdXRvZml0dGVyX2ludGVyZmFjZSwKLQotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0X2ZhY2UgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXRfZ2xvYmFsX2hpbnRzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb25lX2dsb2JhbF9oaW50cyAqLwotICAgIChGVF9BdXRvSGludGVyX0dseXBoTG9hZEZ1bmMpYWZfYXV0b2ZpdHRlcl9sb2FkX2dseXBoICkgIC8qIGxvYWRfZ2x5cGggKi8KLQotCi0gIEZUX0RFRklORV9NT0RVTEUoCi0gICAgYXV0b2ZpdF9tb2R1bGVfY2xhc3MsCi0KLSAgICBGVF9NT0RVTEVfSElOVEVSLAotICAgIHNpemVvZiAoIEFGX01vZHVsZVJlYyApLAotCi0gICAgImF1dG9maXR0ZXIiLAotICAgIDB4MTAwMDBMLCAgIC8qIHZlcnNpb24gMS4wIG9mIHRoZSBhdXRvZml0dGVyICAqLwotICAgIDB4MjAwMDBMLCAgIC8qIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBhYm92ZSAqLwotCi0gICAgKGNvbnN0IHZvaWQqKSZBRl9JTlRFUkZBQ0VfR0VULAotCi0gICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilhZl9hdXRvZml0dGVyX2luaXQsICAvKiBtb2R1bGVfaW5pdCAgICovCi0gICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSBhZl9hdXRvZml0dGVyX2RvbmUsICAvKiBtb2R1bGVfZG9uZSAgICovCi0gICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICBhZl9nZXRfaW50ZXJmYWNlICAgICAvKiBnZXRfaW50ZXJmYWNlICovCi0gICkKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmbW9kdWxlLmggYi9zcmMvYXV0b2ZpdC9hZm1vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTcxZDE0Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZm1vZHVsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgbW9kdWxlIGltcGxlbWVudGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZNT0RVTEVfSF8KLSNkZWZpbmUgQUZNT0RVTEVfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKgotICAgKiAgVGhpcyBpcyB0aGUgYGV4dGVuZGVkJyBGVF9Nb2R1bGUgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlCi0gICAqICBhdXRvZml0dGVyJ3MgZ2xvYmFsIGRhdGEuCi0gICAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9Nb2R1bGVSZWNfCi0gIHsKLSAgICBGVF9Nb2R1bGVSZWMgIHJvb3Q7Ci0KLSAgICBGVF9VSW50ICAgICAgIGZhbGxiYWNrX3N0eWxlOwotICAgIEZUX1VJbnQgICAgICAgZGVmYXVsdF9zY3JpcHQ7Ci0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCi0gICAgRlRfQm9vbCAgICAgICB3YXJwaW5nOwotI2VuZGlmCi0gICAgRlRfQm9vbCAgICAgICBub19zdGVtX2RhcmtlbmluZzsKLSAgICBGVF9JbnQgICAgICAgIGRhcmtlbl9wYXJhbXNbOF07Ci0KLSAgfSBBRl9Nb2R1bGVSZWMsICpBRl9Nb2R1bGU7Ci0KLQotRlRfREVDTEFSRV9NT0RVTEUoIGF1dG9maXRfbW9kdWxlX2NsYXNzICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBBRk1PRFVMRV9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZwaWMuYyBiL3NyYy9hdXRvZml0L2FmcGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMjVlMDMuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZwaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnBpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIGF1dG9maXQgbW9kdWxlLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAiYWZwaWMuaCIKLSNpbmNsdWRlICJhZmdsb2JhbC5oIgotI2luY2x1ZGUgImFmZXJyb3JzLmgiCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSBhZm1vZHVsZS5jICovCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc19hZl9zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKTsKLQotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfYWZfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApOwotCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19hZl9zZXJ2aWNlX3Byb3BlcnRpZXMoIEZUX1NlcnZpY2VfUHJvcGVydGllc1JlYyogIGNsYXp6ICk7Ci0KLSAgdm9pZCBGVF9Jbml0X0NsYXNzX2FmX2F1dG9maXR0ZXJfaW50ZXJmYWNlKAotICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyogIGNsYXp6ICk7Ci0KLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIHdyaXRpbmcgc3lzdGVtIGNsYXNzZXMgKi8KLSN1bmRlZiAgV1JJVElOR19TWVNURU0KLSNkZWZpbmUgV1JJVElOR19TWVNURU0oIHdzLCBXUyApICAvKiBlbXB0eSAqLwotCi0jaW5jbHVkZSAiYWZ3cnRzeXMuaCIKLQotCi0gIHZvaWQKLSAgYXV0b2ZpdF9tb2R1bGVfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5hdXRvZml0ICkKLSAgICB7Ci0gICAgICBBRk1vZHVsZVBJQyogIGNvbnRhaW5lciA9IChBRk1vZHVsZVBJQyopcGljX2NvbnRhaW5lci0+YXV0b2ZpdDsKLQotCi0gICAgICBpZiAoIGNvbnRhaW5lci0+YWZfc2VydmljZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX2FmX3NlcnZpY2VzKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXItPmFmX3NlcnZpY2VzICk7Ci0gICAgICBjb250YWluZXItPmFmX3NlcnZpY2VzID0gTlVMTDsKLQotICAgICAgRlRfRlJFRSggY29udGFpbmVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5hdXRvZml0ID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGF1dG9maXRfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfVUludCAgICAgICAgICAgIHNzOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciAgICAgICAgID0gRlRfRXJyX09rOwotICAgIEFGTW9kdWxlUElDKiAgICAgICBjb250YWluZXIgICAgID0gTlVMTDsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgLyogYWxsb2NhdGUgcG9pbnRlciwgY2xlYXIgYW5kIHNldCBnbG9iYWwgY29udGFpbmVyIHBvaW50ZXIgKi8KLSAgICBpZiAoIEZUX0FMTE9DICggY29udGFpbmVyLCBzaXplb2YgKCAqY29udGFpbmVyICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgRlRfTUVNX1NFVCggY29udGFpbmVyLCAwLCBzaXplb2YgKCAqY29udGFpbmVyICkgKTsKLSAgICBwaWNfY29udGFpbmVyLT5hdXRvZml0ID0gY29udGFpbmVyOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgZXJyb3IgPSBGVF9DcmVhdGVfQ2xhc3NfYWZfc2VydmljZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXItPmFmX3NlcnZpY2VzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9Jbml0X0NsYXNzX2FmX3NlcnZpY2VfcHJvcGVydGllcyggJmNvbnRhaW5lci0+YWZfc2VydmljZV9wcm9wZXJ0aWVzICk7Ci0KLSAgICBmb3IgKCBzcyA9IDA7IHNzIDwgQUZfV1JJVElOR19TWVNURU1fTUFYOyBzcysrICkKLSAgICAgIGNvbnRhaW5lci0+YWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlc1tzc10gPQotICAgICAgICAmY29udGFpbmVyLT5hZl93cml0aW5nX3N5c3RlbV9jbGFzc2VzX3JlY1tzc107Ci0gICAgY29udGFpbmVyLT5hZl93cml0aW5nX3N5c3RlbV9jbGFzc2VzW0FGX1dSSVRJTkdfU1lTVEVNX01BWF0gPSBOVUxMOwotCi0gICAgZm9yICggc3MgPSAwOyBzcyA8IEFGX1NDUklQVF9NQVg7IHNzKysgKQotICAgICAgY29udGFpbmVyLT5hZl9zY3JpcHRfY2xhc3Nlc1tzc10gPQotICAgICAgICAmY29udGFpbmVyLT5hZl9zY3JpcHRfY2xhc3Nlc19yZWNbc3NdOwotICAgIGNvbnRhaW5lci0+YWZfc2NyaXB0X2NsYXNzZXNbQUZfU0NSSVBUX01BWF0gPSBOVUxMOwotCi0gICAgZm9yICggc3MgPSAwOyBzcyA8IEFGX1NUWUxFX01BWDsgc3MrKyApCi0gICAgICBjb250YWluZXItPmFmX3N0eWxlX2NsYXNzZXNbc3NdID0KLSAgICAgICAgJmNvbnRhaW5lci0+YWZfc3R5bGVfY2xhc3Nlc19yZWNbc3NdOwotICAgIGNvbnRhaW5lci0+YWZfc3R5bGVfY2xhc3Nlc1tBRl9TVFlMRV9NQVhdID0gTlVMTDsKLQotI3VuZGVmICBXUklUSU5HX1NZU1RFTQotI2RlZmluZSBXUklUSU5HX1NZU1RFTSggd3MsIFdTICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgRlRfSW5pdF9DbGFzc19hZl8gIyMgd3MgIyMgX3dyaXRpbmdfc3lzdGVtX2NsYXNzKCAgICBcCi0gICAgICAgICAgJmNvbnRhaW5lci0+YWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlc19yZWNbc3MrK10gKTsKLQotICAgIHNzID0gMDsKLSNpbmNsdWRlICJhZndydHN5cy5oIgotCi0jdW5kZWYgIFNDUklQVAotI2RlZmluZSBTQ1JJUFQoIHMsIFMsIGQsIGgsIEgsIHNzcyApICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEZUX0luaXRfQ2xhc3NfYWZfICMjIHMgIyMgX3NjcmlwdF9jbGFzcyggICAgIFwKLSAgICAgICAgICAmY29udGFpbmVyLT5hZl9zY3JpcHRfY2xhc3Nlc19yZWNbc3MrK10gKTsKLQotICAgIHNzID0gMDsKLSNpbmNsdWRlICJhZnNjcmlwdC5oIgotCi0jdW5kZWYgIFNUWUxFCi0jZGVmaW5lIFNUWUxFKCBzLCBTLCBkLCB3cywgc2MsIGJzcywgYyApICAgICAgICAgICAgXAotICAgICAgICBGVF9Jbml0X0NsYXNzX2FmXyAjIyBzICMjIF9zdHlsZV9jbGFzcyggICAgIFwKLSAgICAgICAgICAmY29udGFpbmVyLT5hZl9zdHlsZV9jbGFzc2VzX3JlY1tzcysrXSApOwotCi0gICAgc3MgPSAwOwotI2luY2x1ZGUgImFmc3R5bGVzLmgiCi0KLSAgICBGVF9Jbml0X0NsYXNzX2FmX2F1dG9maXR0ZXJfaW50ZXJmYWNlKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+YWZfYXV0b2ZpdHRlcl9pbnRlcmZhY2UgKTsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgICAgYXV0b2ZpdF9tb2R1bGVfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZnBpYy5oIGIvc3JjL2F1dG9maXQvYWZwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkMzM5Mi4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZnBpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmcGljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgYXV0b2ZpdCBtb2R1bGUuICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBBRlBJQ19IXwotI2RlZmluZSBBRlBJQ19IXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEFGX1NFUlZJQ0VTX0dFVCAgICAgICAgICAgICAgICBhZl9zZXJ2aWNlcwotI2RlZmluZSBBRl9TRVJWSUNFX1BST1BFUlRJRVNfR0VUICAgICAgYWZfc2VydmljZV9wcm9wZXJ0aWVzCi0KLSNkZWZpbmUgQUZfV1JJVElOR19TWVNURU1fQ0xBU1NFU19HRVQgIGFmX3dyaXRpbmdfc3lzdGVtX2NsYXNzZXMKLSNkZWZpbmUgQUZfU0NSSVBUX0NMQVNTRVNfR0VUICAgICAgICAgIGFmX3NjcmlwdF9jbGFzc2VzCi0jZGVmaW5lIEFGX1NUWUxFX0NMQVNTRVNfR0VUICAgICAgICAgICBhZl9zdHlsZV9jbGFzc2VzCi0jZGVmaW5lIEFGX0lOVEVSRkFDRV9HRVQgICAgICAgICAgICAgICBhZl9hdXRvZml0dGVyX2ludGVyZmFjZQotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qIHNvbWUgaW5jbHVkZSBmaWxlcyByZXF1aXJlZCBmb3IgbWVtYmVycyBvZiBBRk1vZHVsZVBJQyAqLwotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKLQotI2luY2x1ZGUgImFmdHlwZXMuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgQUZNb2R1bGVQSUNfCi0gIHsKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogICAgICAgICAgYWZfc2VydmljZXM7Ci0gICAgRlRfU2VydmljZV9Qcm9wZXJ0aWVzUmVjICAgIGFmX3NlcnZpY2VfcHJvcGVydGllczsKLQotICAgIEFGX1dyaXRpbmdTeXN0ZW1DbGFzcyAgICAgICBhZl93cml0aW5nX3N5c3RlbV9jbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FGX1dSSVRJTkdfU1lTVEVNX01BWCArIDFdOwotICAgIEFGX1dyaXRpbmdTeXN0ZW1DbGFzc1JlYyAgICBhZl93cml0aW5nX3N5c3RlbV9jbGFzc2VzX3JlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBRl9XUklUSU5HX1NZU1RFTV9NQVhdOwotCi0gICAgQUZfU2NyaXB0Q2xhc3MgICAgICAgICAgICAgIGFmX3NjcmlwdF9jbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FGX1NDUklQVF9NQVggKyAxXTsKLSAgICBBRl9TY3JpcHRDbGFzc1JlYyAgICAgICAgICAgYWZfc2NyaXB0X2NsYXNzZXNfcmVjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FGX1NDUklQVF9NQVhdOwotCi0gICAgQUZfU3R5bGVDbGFzcyAgICAgICAgICAgICAgIGFmX3N0eWxlX2NsYXNzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUZfU1RZTEVfTUFYICsgMV07Ci0gICAgQUZfU3R5bGVDbGFzc1JlYyAgICAgICAgICAgIGFmX3N0eWxlX2NsYXNzZXNfcmVjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FGX1NUWUxFX01BWF07Ci0KLSAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyAgYWZfYXV0b2ZpdHRlcl9pbnRlcmZhY2U7Ci0KLSAgfSBBRk1vZHVsZVBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICBcCi0gICAgICAgICAgKCAoQUZNb2R1bGVQSUMqKSggKGxpYiktPnBpY19jb250YWluZXIuYXV0b2ZpdCApICkKLQotI2RlZmluZSBBRl9TRVJWSUNFU19HRVQgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+YWZfc2VydmljZXMgKQotI2RlZmluZSBBRl9TRVJWSUNFX1BST1BFUlRJRVNfR0VUICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmFmX3NlcnZpY2VfcHJvcGVydGllcyApCi0KLSNkZWZpbmUgQUZfV1JJVElOR19TWVNURU1fQ0xBU1NFU19HRVQgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIEZUX0ZBQ0VfTElCUkFSWSggZ2xvYmFscy0+ZmFjZSApICktPmFmX3dyaXRpbmdfc3lzdGVtX2NsYXNzZXMgKQotI2RlZmluZSBBRl9TQ1JJUFRfQ0xBU1NFU19HRVQgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIEZUX0ZBQ0VfTElCUkFSWSggZ2xvYmFscy0+ZmFjZSApICktPmFmX3NjcmlwdF9jbGFzc2VzICkKLSNkZWZpbmUgQUZfU1RZTEVfQ0xBU1NFU19HRVQgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIEZUX0ZBQ0VfTElCUkFSWSggZ2xvYmFscy0+ZmFjZSApICktPmFmX3N0eWxlX2NsYXNzZXMgKQotI2RlZmluZSBBRl9JTlRFUkZBQ0VfR0VUICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmFmX2F1dG9maXR0ZXJfaW50ZXJmYWNlICkKLQotCi0gIC8qIHNlZSBhZnBpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICBhdXRvZml0X21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIGF1dG9maXRfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi0jZW5kaWYgLyogQUZQSUNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmcmFuZ2VzLmMgYi9zcmMvYXV0b2ZpdC9hZnJhbmdlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM3ZWVhLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmcmFuZ2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmcmFuZ2VzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBVbmljb2RlIHNjcmlwdCByYW5nZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImFmcmFuZ2VzLmgiCi0KLSAgLyoKLSAgICogVGhlIGFsZ29yaXRobSBmb3IgYXNzaWduaW5nIHByb3BlcnRpZXMgYW5kIHN0eWxlcyB0byB0aGUgYGdseXBoX3N0eWxlcycKLSAgICogYXJyYXkgaXMgYXMgZm9sbG93cyAoY2YuIHRoZSBpbXBsZW1lbnRhdGlvbiBpbgotICAgKiBgYWZfZmFjZV9nbG9iYWxzX2NvbXB1dGVfc3R5bGVfY292ZXJhZ2UnKS4KLSAgICoKLSAgICogICBXYWxrIG92ZXIgYWxsIHNjcmlwdHMgKGFzIGxpc3RlZCBpbiBgYWZzY3JpcHQuaCcpLgotICAgKgotICAgKiAgIEZvciBhIGdpdmVuIHNjcmlwdCwgd2FsayBvdmVyIGFsbCBzdHlsZXMgKGFzIGxpc3RlZCBpbiBgYWZzdHlsZXMuaCcpLgotICAgKiAgIFRoZSBvcmRlciBvZiBzdHlsZXMgaXMgaW1wb3J0YW50IGFuZCBzaG91bGQgYmUgYXMgZm9sbG93cy4KLSAgICoKLSAgICogICAtIEZpcnN0IGNvbWUgc3R5bGVzIGJhc2VkIG9uIE9wZW5UeXBlIGZlYXR1cmVzIChzbWFsbCBjYXBzLCBmb3IKLSAgICogICAgIGV4YW1wbGUpLiAgU2luY2UgZmVhdHVyZXMgcmVseSBvbiBnbHlwaCBpbmRpY2VzLCB0aHVzIGNvbXBsZXRlbHkKLSAgICogICAgIGJ5cGFzc2luZyBjaGFyYWN0ZXIgY29kZXMsIG5vIHByb3BlcnRpZXMgYXJlIGFzc2lnbmVkLgotICAgKgotICAgKiAgIC0gTmV4dCBjb21lcyB0aGUgZGVmYXVsdCBzdHlsZSwgdXNpbmcgdGhlIGNoYXJhY3RlciByYW5nZXMgYXMgZGVmaW5lZAotICAgKiAgICAgYmVsb3cuICBUaGlzIGFsc28gYXNzaWducyBwcm9wZXJ0aWVzLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGVyZSBhbHNvIGV4aXN0IGZhbGxiYWNrIHNjcmlwdHMsIG1haW5seSBjb3ZlcmluZwotICAgKiAgIHN1cGVyc2NyaXB0IGFuZCBzdWJzY3JpcHQgZ2x5cGhzIG9mIGEgc2NyaXB0IHRoYXQgYXJlIG5vdCBwcmVzZW50IGFzCi0gICAqICAgT3BlblR5cGUgZmVhdHVyZXMuICBGYWxsYmFjayBzY3JpcHRzIGFyZSBkZWZpbmVkIGJlbG93LCBhbHNvCi0gICAqICAgYXNzaWduaW5nIHByb3BlcnRpZXM7IHRoZXkgYXJlIGFwcGxpZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICogICBzY3JpcHQuCi0gICAqCi0gICAqLwotCi0KLSAgLyogWFhYIENoZWNrIGJhc2UgY2hhcmFjdGVyIHJhbmdlcyBhZ2FpbjogICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgUmlnaHQgbm93LCB0aGV5IGFyZSBxdWlja2x5IGRlcml2ZWQgYnkgdmlzdWFsIGluc3BlY3Rpb24uICovCi0gIC8qICAgICBJIGNhbiBpbWFnaW5lIHRoYXQgZmluZS10dW5pbmcgaXMgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgKi8KLQotICAvKiBmb3IgdGhlIGF1dG8taGludGVyLCBhIGBub24tYmFzZSBjaGFyYWN0ZXInIGlzIHNvbWV0aGluZyB0aGF0IHNob3VsZCAqLwotICAvKiBub3QgYmUgYWZmZWN0ZWQgYnkgYmx1ZSB6b25lcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgaXMgYSAgICAgICAqLwotICAvKiBzcGFjaW5nIG9yIG5vLXNwYWNpbmcgZ2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIHRoZSBgYWZfeHh4eF9ub25iYXNlX3VuaXJhbmdlcycgcmFuZ2VzIG11c3QgYmUgc3RyaWN0IHN1YnNldHMgKi8KLSAgLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgYGFmX3h4eHhfdW5pcmFuZ2VzJyByYW5nZXMgICAgICAgICAgICAgICAqLwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9hZGxtX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgxRTkwMCwgMHgxRTk1RiApLCAgIC8qIEFkbGFtICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2FkbG1fbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MUQ5NDQsIDB4MUU5NEEgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9hcmFiX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDYwMCwgIDB4MDZGRiApLCAgLyogQXJhYmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDA3NTAsICAweDA3RkYgKSwgIC8qIEFyYWJpYyBTdXBwbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOEEwLCAgMHgwOEZGICksICAvKiBBcmFiaWMgRXh0ZW5kZWQtQSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4RkI1MCwgIDB4RkRGRiApLCAgLyogQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEZFNzAsICAweEZFRkYgKSwgIC8qIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAweDFFRTAwLCAweDFFRUZGICksICAvKiBBcmFiaWMgTWF0aGVtYXRpY2FsIEFscGhhYmV0aWMgU3ltYm9scyAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9hcmFiX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNjAwLCAgMHgwNjA1ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNjEwLCAgMHgwNjFBICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNjRCLCAgMHgwNjVGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNjcwLCAgMHgwNjcwICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNkQ2LCAgMHgwNkRDICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNkRGLCAgMHgwNkU0ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNkU3LCAgMHgwNkU4ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNkVBLCAgMHgwNkVEICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOEQ0LCAgMHgwOEUxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOEUzLCAgMHgwOEZGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGQkIyLCAgMHhGQkMxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTcwLCAgMHhGRTcwICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTcyLCAgMHhGRTcyICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTc0LCAgMHhGRTc0ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTc2LCAgMHhGRTc2ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTc4LCAgMHhGRTc4ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTdBLCAgMHhGRTdBICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTdDLCAgMHhGRTdDICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTdFLCAgMHhGRTdFICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfYXJtbl91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDA1MzAsICAweDA1OEYgKSwgIC8qIEFybWVuaWFuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4RkIxMywgIDB4RkIxNyApLCAgLyogQWxwaGFiLiBQcmVzZW50LiBGb3JtcyAoQXJtZW5pYW4pICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2FybW5fbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDA1NTksICAweDA1NUYgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9hdnN0X3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgxMEIwMCwgIDB4MTBCM0YgKSwgIC8qIEF2ZXN0YW4gKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2F2c3Rfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTBCMzksICAweDEwQjNGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2JhbXVfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAweEE2QTAsICAgMHhBNkZGICksICAgLyogQmFtdW0gKi8KLSNpZiAwCi0gICAgLyogVGhlIGNoYXJhY3RlcnMgaW4gdGhlIEJhbXVtIHN1cHBsZW1lbnQgYXJlIHBpY3RvZ3JhbXMsICovCi0gICAgLyogbm90IChkaXJlY3RseSkgcmVsYXRlZCB0byB0aGUgc3lsbGFiaWMgQmFtdW0gc2NyaXB0ICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAweDE2ODAwLCAweDE2QTNGICksICAgLyogQmFtdW0gU3VwcGxlbWVudCAqLwotI2VuZGlmCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2JhbXVfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEE2RjAsICAweEE2RjEgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9iZW5nX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDk4MCwgIDB4MDlGRiApLCAgLyogQmVuZ2FsaSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9iZW5nX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOTgxLCAgMHgwOTgxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOUJDLCAgMHgwOUJDICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOUMxLCAgMHgwOUM0ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOUNELCAgMHgwOUNEICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOUUyLCAgMHgwOUUzICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfYnVoZF91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDE3NDAsICAweDE3NUYgKSwgICAvKiBCdWhpZCAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9idWhkX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxNzUyLCAgMHgxNzUzICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfY2FrbV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTExMDAsIDB4MTExNEYgKSwgICAvKiBDaGFrbWEgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfY2FrbV9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgxMTEwMCwgMHgxMTEwMiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgxMTEyNywgMHgxMTEzNCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2NhbnNfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxNDAwLCAgMHgxNjdGICksIC8qIFVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDE4QjAsICAweDE4RkYgKSwgLyogVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZCAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9jYW5zX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAwLCAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfY2FyaV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTAyQTAsIDB4MTAyREYgKSwgICAvKiBDYXJpYW4gKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfY2FyaV9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2NoZXJfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxM0EwLCAgMHgxM0ZGICksICAvKiBDaGVyb2tlZSAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBQjcwLCAgMHhBQkJGICksICAvKiBDaGVyb2tlZSBTdXBwbGVtZW50ICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2NoZXJfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDAsIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9jb3B0X3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MkM4MCwgIDB4MkNGRiApLCAgIC8qIENvcHRpYyAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9jb3B0X25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyQ0VGLCAgMHgyQ0YxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfY3BydF91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTA4MDAsIDB4MTA4M0YgKSwgICAvKiBDeXByaW90ICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2NwcnRfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDAsIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9jeXJsX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDQwMCwgIDB4MDRGRiApLCAgLyogQ3lyaWxsaWMgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDUwMCwgIDB4MDUyRiApLCAgLyogQ3lyaWxsaWMgU3VwcGxlbWVudCAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MkRFMCwgIDB4MkRGRiApLCAgLyogQ3lyaWxsaWMgRXh0ZW5kZWQtQSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QTY0MCwgIDB4QTY5RiApLCAgLyogQ3lyaWxsaWMgRXh0ZW5kZWQtQiAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MUM4MCwgIDB4MUM4RiApLCAgLyogQ3lyaWxsaWMgRXh0ZW5kZWQtQyAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9jeXJsX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNDgzLCAgMHgwNDg5ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyREUwLCAgMHgyREZGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBNjZGLCAgMHhBNjdGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBNjlFLCAgMHhBNjlGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIC8qIFRoZXJlIGFyZSBzb21lIGNoYXJhY3RlcnMgaW4gdGhlIERldmFuYWdhcmkgVW5pY29kZSBibG9jayB0aGF0IGFyZSAgICAqLwotICAvKiBnZW5lcmljIHRvIEluZGljIHNjcmlwdHM7IHdlIG9taXQgdGhlbSBzbyB0aGF0IHRoZWlyIHByZXNlbmNlIGRvZXNuJ3QgKi8KLSAgLyogdHJpZ2dlciBEZXZhbmFnYXJpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9kZXZhX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDkwMCwgIDB4MDkzQiApLCAgLyogRGV2YW5hZ2FyaSAgICAgICAgICAqLwotICAgIC8qIG9taXR0aW5nIFUrMDkzQyBudWt0YSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDkzRCwgIDB4MDk1MCApLCAgLyogLi4uIGNvbnRpbnVlZCAgICAgICAqLwotICAgIC8qIG9taXR0aW5nIFUrMDk1MSB1ZGF0dGEsIFUrMDk1MiBhbnVkYXR0YSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDk1MywgIDB4MDk2MyApLCAgLyogLi4uIGNvbnRpbnVlZCAgICAgICAqLwotICAgIC8qIG9taXR0aW5nIFUrMDk2NCBkYW5kYSwgVSswOTY1IGRvdWJsZSBkYW5kYSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDk2NiwgIDB4MDk3RiApLCAgLyogLi4uIGNvbnRpbnVlZCAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MjBCOSwgIDB4MjBCOSApLCAgLyogKG5ldykgUnVwZWUgc2lnbiAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QThFMCwgIDB4QThGRiApLCAgLyogRGV2YW5hZ2FyaSBFeHRlbmRlZCAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9kZXZhX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOTAwLCAgMHgwOTAyICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOTNBLCAgMHgwOTNBICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOTQxLCAgMHgwOTQ4ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOTRELCAgMHgwOTREICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOTUzLCAgMHgwOTU3ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwOTYyLCAgMHgwOTYzICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBOEUwLCAgMHhBOEYxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfZHNydF91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTA0MDAsIDB4MTA0NEYgKSwgIC8qIERlc2VyZXQgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfZHNydF9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2V0aGlfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxMjAwLCAgMHgxMzdGICksICAvKiBFdGhpb3BpYyAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxMzgwLCAgMHgxMzlGICksICAvKiBFdGhpb3BpYyBTdXBwbGVtZW50ICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyRDgwLCAgMHgyRERGICksICAvKiBFdGhpb3BpYyBFeHRlbmRlZCAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBQjAwLCAgMHhBQjJGICksICAvKiBFdGhpb3BpYyBFeHRlbmRlZC1BICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2V0aGlfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEzNUQsICAweDEzNUYgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9nZW9yX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTBEMCwgIDB4MTBGRiApLCAgLyogR2VvcmdpYW4gKE1raGVkcnVsaSkgKi8KLSNpZiAwCi0gICAgLyogdGhlIGZvbGxvd2luZyByYW5nZSBpcyBwcm9wb3NlZCBmb3IgaW5jbHVzaW9uIGluIFVuaWNvZGUgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDFDOTAsICAweDFDQkYgKSwgIC8qIEdlb3JnaWFuIChNdGF2cnVsaSkgICovCi0jZW5kaWYKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfZ2Vvcl9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2dlb2tfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgLyogS2h1dHN1cmkgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwQTAsICAweDEwQ0QgKSwgIC8qIEdlb3JnaWFuIChBc29tdGF2cnVsaSkgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDJEMDAsICAweDJEMkQgKSwgIC8qIEdlb3JnaWFuIChOdXNraHVyaSkgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfZ2Vva19ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2dsYWdfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyQzAwLCAgMHgyQzVGICksICAvKiBHbGFnb2xpdGljICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAweDFFMDAwLCAweDFFMDJGICksICAvKiBHbGFnb2xpdGljIFN1cHBsZW1lbnQgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfZ2xhZ19ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgxRTAwMCwgMHgxRTAyRiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2dvdGhfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAweDEwMzMwLCAweDEwMzRGICksICAgLyogR290aGljICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2dvdGhfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDAsIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9ncmVrX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDM3MCwgIDB4MDNGRiApLCAgLyogR3JlZWsgYW5kIENvcHRpYyAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MUYwMCwgIDB4MUZGRiApLCAgLyogR3JlZWsgRXh0ZW5kZWQgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9ncmVrX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwMzdBLCAgMHgwMzdBICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwMzg0LCAgMHgwMzg1ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRkJELCAgMHgxRkMxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRkNELCAgMHgxRkNGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRkRELCAgMHgxRkRGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRkVELCAgMHgxRkVGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRkZELCAgMHgxRkZFICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfZ3Vqcl91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBBODAsICAweDBBRkYgKSwgIC8qIEd1amFyYXRpICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2d1anJfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBBODEsICAweDBBODIgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBBQkMsICAweDBBQkMgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBBQzEsICAweDBBQzggKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBBQ0QsICAweDBBQ0QgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBBRTIsICAweDBBRTMgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9ndXJ1X3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEEwMCwgIDB4MEE3RiApLCAgLyogR3VybXVraGkgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfZ3VydV9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEEwMSwgIDB4MEEwMiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEEzQywgIDB4MEEzQyApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEE0MSwgIDB4MEE1MSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEE3MCwgIDB4MEE3MSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEE3NSwgIDB4MEE3NSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2hlYnJfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwNTkwLCAgMHgwNUZGICksICAvKiBIZWJyZXcgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGQjFELCAgMHhGQjRGICksICAvKiBBbHBoYWIuIFByZXNlbnQuIEZvcm1zIChIZWJyZXcpICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2hlYnJfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDA1OTEsICAweDA1QkYgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDA1QzEsICAweDA1QzIgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDA1QzQsICAweDA1QzUgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDA1QzcsICAweDA1QzcgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEZCMUUsICAweEZCMUUgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9rYWxpX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QTkwMCwgIDB4QTkyRiApLCAgIC8qIEtheWFoIExpICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2thbGlfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEE5MjYsICAweEE5MkQgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9rbmRhX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEM4MCwgIDB4MENGRiApLCAgLyogS2FubmFkYSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9rbmRhX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQzgxLCAgMHgwQzgxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQ0JDLCAgMHgwQ0JDICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQ0JGLCAgMHgwQ0JGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQ0M2LCAgMHgwQ0M2ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQ0NDLCAgMHgwQ0NEICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQ0UyLCAgMHgwQ0UzICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfa2htcl91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDE3ODAsICAweDE3RkYgKSwgIC8qIEtobWVyICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2tobXJfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDE3QjcsICAweDE3QkQgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDE3QzYsICAweDE3QzYgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDE3QzksICAweDE3RDMgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDE3REQsICAweDE3REQgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9raG1zX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTlFMCwgIDB4MTlGRiApLCAgLyogS2htZXIgU3ltYm9scyAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9raG1zX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAwLCAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbGFvX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEU4MCwgIDB4MEVGRiApLCAgLyogTGFvICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2xhb19ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEVCMSwgIDB4MEVCMSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEVCNCwgIDB4MEVCQyApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEVDOCwgIDB4MEVDRCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2xhdG5fdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwMDIwLCAgMHgwMDdGICksICAvKiBCYXNpYyBMYXRpbiAobm8gY29udHJvbCBjaGFycykgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDBBMCwgIDB4MDBBOSApLCAgLyogTGF0aW4tMSBTdXBwbGVtZW50IChubyBjb250cm9sIGNoYXJzKSAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDAwQUIsICAweDAwQjEgKSwgIC8qIC4uLiBjb250aW51ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwMEI0LCAgMHgwMEI4ICksICAvKiAuLi4gY29udGludWVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDBCQiwgIDB4MDBGRiApLCAgLyogLi4uIGNvbnRpbnVlZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDAxMDAsICAweDAxN0YgKSwgIC8qIExhdGluIEV4dGVuZGVkLUEgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwMTgwLCAgMHgwMjRGICksICAvKiBMYXRpbiBFeHRlbmRlZC1CICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDI1MCwgIDB4MDJBRiApLCAgLyogSVBBIEV4dGVuc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDAyQjksICAweDAyREYgKSwgIC8qIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwMkU1LCAgMHgwMkZGICksICAvKiAuLi4gY29udGludWVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDMwMCwgIDB4MDM2RiApLCAgLyogQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDFBQjAsICAweDFBQkUgKSwgIC8qIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBFeHRlbmRlZCAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRDAwLCAgMHgxRDJCICksICAvKiBQaG9uZXRpYyBFeHRlbnNpb25zICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MUQ2QiwgIDB4MUQ3NyApLCAgLyogLi4uIGNvbnRpbnVlZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDFENzksICAweDFEN0YgKSwgIC8qIC4uLiBjb250aW51ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRDgwLCAgMHgxRDlBICksICAvKiBQaG9uZXRpYyBFeHRlbnNpb25zIFN1cHBsZW1lbnQgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MURDMCwgIDB4MURGRiApLCAgLyogQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIFN1cHBsZW1lbnQgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDFFMDAsICAweDFFRkYgKSwgIC8qIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyMDAwLCAgMHgyMDZGICksICAvKiBHZW5lcmFsIFB1bmN0dWF0aW9uICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MjBBMCwgIDB4MjBCOCApLCAgLyogQ3VycmVuY3kgU3ltYm9scyAuLi4gICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDIwQkEsICAweDIwQ0YgKSwgIC8qIC4uLiBleGNlcHQgbmV3IFJ1cGVlIHNpZ24gICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyMTUwLCAgMHgyMThGICksICAvKiBOdW1iZXIgRm9ybXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MkM2MCwgIDB4MkM3QiApLCAgLyogTGF0aW4gRXh0ZW5kZWQtQyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDJDN0UsICAweDJDN0YgKSwgIC8qIC4uLiBjb250aW51ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyRTAwLCAgMHgyRTdGICksICAvKiBTdXBwbGVtZW50YWwgUHVuY3R1YXRpb24gICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QTcyMCwgIDB4QTc2RiApLCAgLyogTGF0aW4gRXh0ZW5kZWQtRCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEE3NzEsICAweEE3RjcgKSwgIC8qIC4uLiBjb250aW51ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBN0ZBLCAgMHhBN0ZGICksICAvKiAuLi4gY29udGludWVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QUIzMCwgIDB4QUI1QiApLCAgLyogTGF0aW4gRXh0ZW5kZWQtRSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEFCNjAsICAweEFCNkYgKSwgIC8qIC4uLiBjb250aW51ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGQjAwLCAgMHhGQjA2ICksICAvKiBBbHBoYWIuIFByZXNlbnQuIEZvcm1zIChMYXRpbiBMaWdzKSAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgxRDQwMCwgMHgxRDdGRiApLCAgLyogTWF0aGVtYXRpY2FsIEFscGhhbnVtZXJpYyBTeW1ib2xzICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbGF0bl9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDA1RSwgIDB4MDA2MCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDA3RSwgIDB4MDA3RSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDBBOCwgIDB4MDBBOSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDBBRSwgIDB4MDBCMCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDBCNCwgIDB4MDBCNCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDBCOCwgIDB4MDBCOCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDBCQywgIDB4MDBCRSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDJCOSwgIDB4MDJERiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDJFNSwgIDB4MDJGRiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDMwMCwgIDB4MDM2RiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MUFCMCwgIDB4MUFCRSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MURDMCwgIDB4MURGRiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MjAxNywgIDB4MjAxNyApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MjAzRSwgIDB4MjAzRSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QTc4OCwgIDB4QTc4OCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QTdGOCwgIDB4QTdGQSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2xhdGJfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRDYyLCAgMHgxRDZBICksICAvKiBzb21lIHNtYWxsIHN1YnNjcmlwdCBsZXR0ZXJzICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDIwODAsICAweDIwOUMgKSwgIC8qIHN1YnNjcmlwdCBkaWdpdHMgYW5kIGxldHRlcnMgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MkM3QywgIDB4MkM3QyApLCAgLyogbGF0aW4gc3Vic2NyaXB0IHNtYWxsIGxldHRlciBqICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2xhdGJfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDAsIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9sYXRwX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDBBQSwgIDB4MDBBQSApLCAgLyogZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDAwQjIsICAweDAwQjMgKSwgIC8qIHN1cGVyc2NyaXB0IHR3byBhbmQgdGhyZWUgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwMEI5LCAgMHgwMEJBICksICAvKiBzdXBlcnNjcmlwdCBvbmUsIG1hc2MuIG9yZC4gaW5kaWMuICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDJCMCwgIDB4MDJCOCApLCAgLyogc29tZSBsYXRpbiBzdXBlcnNjcmlwdCBtb2QuIGxldHRlcnMgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDAyRTAsICAweDAyRTQgKSwgIC8qIHNvbWUgSVBBIG1vZGlmaWVyIGxldHRlcnMgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxRDJDLCAgMHgxRDYxICksICAvKiBsYXRpbiBzdXBlcnNjcmlwdCBtb2RpZmllciBsZXR0ZXJzICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MUQ3OCwgIDB4MUQ3OCApLCAgLyogbW9kaWZpZXIgbGV0dGVyIGN5cmlsbGljIGVuICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDFEOUIsICAweDFEQkYgKSwgIC8qIG1vcmUgbW9kaWZpZXIgbGV0dGVycyAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyMDcwLCAgMHgyMDdGICksICAvKiBzdXBlcnNjcmlwdCBkaWdpdHMgYW5kIGxldHRlcnMgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MkM3RCwgIDB4MkM3RCApLCAgLyogbW9kaWZpZXIgbGV0dGVyIGNhcGl0YWwgdiAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEE3NzAsICAweEE3NzAgKSwgIC8qIG1vZGlmaWVyIGxldHRlciB1cyAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBN0Y4LCAgMHhBN0Y5ICksICAvKiBtb3JlIG1vZGlmaWVyIGxldHRlcnMgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QUI1QywgIDB4QUI1RiApLCAgLyogbW9yZSBtb2RpZmllciBsZXR0ZXJzICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbGF0cF9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2xpc3VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBNEQwLCAgMHhBNEZGICksICAgIC8qIExpc3UgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbGlzdV9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX21seW1fdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwRDAwLCAgMHgwRDdGICksICAvKiBNYWxheWFsYW0gKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbWx5bV9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEQwMSwgIDB4MEQwMSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEQ0RCwgIDB4MEQ0RSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEQ2MiwgIDB4MEQ2MyApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX215bXJfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgxMDAwLCAgMHgxMDlGICksICAgIC8qIE15YW5tYXIgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QTlFMCwgIDB4QTlGRiApLCAgICAvKiBNeWFubWFyIEV4dGVuZGVkLUIgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEFBNjAsICAweEFBN0YgKSwgICAgLyogTXlhbm1hciBFeHRlbmRlZC1BICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX215bXJfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwMkQsICAweDEwMzAgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwMzIsICAweDEwMzcgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwM0EsICAweDEwM0EgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwM0QsICAweDEwM0UgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwNTgsICAweDEwNTkgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwNUUsICAweDEwNjAgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwNzEsICAweDEwNzQgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwODIsICAweDEwODIgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwODUsICAweDEwODYgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDEwOEQsICAweDEwOEQgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEE5RTUsICAweEE5RTUgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEFBN0MsICAweEFBN0MgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9ua29vX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MDdDMCwgIDB4MDdGRiApLCAgICAvKiBOJ0tvICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX25rb29fbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDA3RUIsICAweDA3RjUgKSwKLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9ub25lX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9ub25lX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAwLCAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfb2xja191bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDFDNTAsICAweDFDN0YgKSwgICAgLyogT2wgQ2hpa2kgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfb2xja19ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX29ya2hfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAweDEwQzAwLCAweDEwQzRGICksICAgIC8qIE9sZCBUdXJraWMgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfb3JraF9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX29zZ2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAweDEwNEIwLCAweDEwNEZGICksICAgIC8qIE9zYWdlICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX29zZ2Vfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDAsIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9vc21hX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgxMDQ4MCwgMHgxMDRBRiApLCAgIC8qIE9zbWFueWEgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfb3NtYV9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX3NhdXJfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBODgwLCAgMHhBOERGICksICAgLyogU2F1cmFzaHRyYSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9zYXVyX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBODgwLCAgMHhBODgxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBOEI0LCAgMHhBOEM1ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfc2hhd191bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTA0NTAsIDB4MTA0N0YgKSwgICAvKiBTaGF2aWFuICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX3NoYXdfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDAsIDAgKQotICB9OwotCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9zaW5oX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEQ4MCwgIDB4MERGRiApLCAgLyogU2luaGFsYSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9zaW5oX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwRENBLCAgMHgwRENBICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwREQyLCAgMHgwREQ2ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfc3VuZF91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDFCODAsICAweDFCQkYgKSwgLyogU3VuZGFuZXNlICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDFDQzAsICAweDFDQ0YgKSwgLyogU3VuZGFuZXNlIFN1cHBsZW1lbnQgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfc3VuZF9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MUI4MCwgIDB4MUI4MiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MUJBMSwgIDB4MUJBRCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX3RhbWxfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjgwLCAgMHgwQkZGICksICAvKiBUYW1pbCAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl90YW1sX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjgyLCAgMHgwQjgyICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQkMwLCAgMHgwQkMyICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQkNELCAgMHgwQkNEICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfdGF2dF91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEFBODAsICAweEFBREYgKSwgICAvKiBUYWkgVmlldCAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl90YXZ0X25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBQUIwLCAgMHhBQUIwICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBQUIyLCAgMHhBQUI0ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBQUI3LCAgMHhBQUI4ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBQUJFLCAgMHhBQUJGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBQUMxLCAgMHhBQUMxICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfdGVsdV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBDMDAsICAweDBDN0YgKSwgIC8qIFRlbHVndSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl90ZWx1X25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQzAwLCAgMHgwQzAwICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQzNFLCAgMHgwQzQwICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQzQ2LCAgMHgwQzU2ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQzYyLCAgMHgwQzYzICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfdGhhaV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBFMDAsICAweDBFN0YgKSwgIC8qIFRoYWkgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfdGhhaV9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEUzMSwgIDB4MEUzMSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEUzNCwgIDB4MEUzQSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEU0NywgIDB4MEU0RSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX3RmbmdfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyRDMwLCAgMHgyRDdGICksICAgLyogVGlmaW5hZ2ggKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfdGZuZ19ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX3ZhaWlfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBNTAwLCAgMHhBNjNGICksICAgLyogVmFpICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX3ZhaWlfbm9uYmFzZV91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoIDAsIDAgKQotICB9OwotCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0lORElDCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9saW1iX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTkwMCwgIDB4MTk0RiApLCAgLyogTGltYnUgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbGltYl9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTkyMCwgIDB4MTkyMiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTkyNywgIDB4MTkzNCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTkzNywgIDB4MTkzQiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLQotICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX29yeWFfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjAwLCAgMHgwQjdGICksICAvKiBPcml5YSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9vcnlhX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjAxLCAgMHgwQjAyICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjNDLCAgMHgwQjNDICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjNGLCAgMHgwQjNGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjQxLCAgMHgwQjQ0ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjRELCAgMHgwQjU2ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgwQjYyLCAgMHgwQjYzICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfc3lsb191bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEE4MDAsICAweEE4MkYgKSwgIC8qIFN5bG90aSBOYWdyaSAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9zeWxvX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBODAyLCAgMHhBODAyICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBODA2LCAgMHhBODA2ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBODBCLCAgMHhBODBCICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBODI1LCAgMHhBODI2ICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfdGlidF91bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDBGMDAsICAweDBGRkYgKSwgIC8qIFRpYmV0YW4gKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQotICB9OwotCi0gIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfdGlidF9ub25iYXNlX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEYxOCwgIDB4MEYxOSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEYzNSwgIDB4MEYzNSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEYzNywgIDB4MEYzNyApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEYzOSwgIDB4MEYzOSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEYzRSwgIDB4MEYzRiApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEY3MSwgIDB4MEY3RSApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEY4MCwgIDB4MEY4NCApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEY4NiwgIDB4MEY4NyApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MEY4RCwgIDB4MEZCQyApLAotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSNlbmRpZiAvKiAhQUZfQ09ORklHX09QVElPTl9JTkRJQyAqLwotCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSksKLQotICAvKiB0aGlzIGNvcnJlc3BvbmRzIHRvIFVuaWNvZGUgNi4wICovCi0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9oYW5pX3VuaXJhbmdlc1tdID0KLSAgewotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTEwMCwgIDB4MTFGRiApLCAgLyogSGFuZ3VsIEphbW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgyRTgwLCAgMHgyRUZGICksICAvKiBDSksgUmFkaWNhbHMgU3VwcGxlbWVudCAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDJGMDAsICAweDJGREYgKSwgIC8qIEthbmd4aSBSYWRpY2FscyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MkZGMCwgIDB4MkZGRiApLCAgLyogSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgzMDAwLCAgMHgzMDNGICksICAvKiBDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24gICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDMwNDAsICAweDMwOUYgKSwgIC8qIEhpcmFnYW5hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MzBBMCwgIDB4MzBGRiApLCAgLyogS2F0YWthbmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgzMTAwLCAgMHgzMTJGICksICAvKiBCb3BvbW9mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDMxMzAsICAweDMxOEYgKSwgIC8qIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8gICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MzE5MCwgIDB4MzE5RiApLCAgLyogS2FuYnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgzMUEwLCAgMHgzMUJGICksICAvKiBCb3BvbW9mbyBFeHRlbmRlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDMxQzAsICAweDMxRUYgKSwgIC8qIENKSyBTdHJva2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MzFGMCwgIDB4MzFGRiApLCAgLyogS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgzMzAwLCAgMHgzM0ZGICksICAvKiBDSksgQ29tcGF0aWJpbGl0eSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweDM0MDAsICAweDREQkYgKSwgIC8qIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4NERDMCwgIDB4NERGRiApLCAgLyogWWlqaW5nIEhleGFncmFtIFN5bWJvbHMgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHg0RTAwLCAgMHg5RkZGICksICAvKiBDSksgVW5pZmllZCBJZGVvZ3JhcGhzICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEE5NjAsICAweEE5N0YgKSwgIC8qIEhhbmd1bCBKYW1vIEV4dGVuZGVkLUEgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4QUMwMCwgIDB4RDdBRiApLCAgLyogSGFuZ3VsIFN5bGxhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhEN0IwLCAgMHhEN0ZGICksICAvKiBIYW5ndWwgSmFtbyBFeHRlbmRlZC1CICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEY5MDAsICAweEZBRkYgKSwgIC8qIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4RkUxMCwgIDB4RkUxRiApLCAgLyogVmVydGljYWwgZm9ybXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhGRTMwLCAgMHhGRTRGICksICAvKiBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoICAweEZGMDAsICAweEZGRUYgKSwgIC8qIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zICAgICAgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgxQjAwMCwgMHgxQjBGRiApLCAgLyogS2FuYSBTdXBwbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAweDFEMzAwLCAweDFEMzVGICksICAvKiBUYWkgWHVhbiBIaW5nIFN5bWJvbHMgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MjAwMDAsIDB4MkE2REYgKSwgIC8qIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEIgICAgICAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggMHgyQTcwMCwgMHgyQjczRiApLCAgLyogQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQyAgICAgICovCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAweDJCNzQwLCAweDJCODFGICksICAvKiBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBEICAgICAgKi8KLSAgICBBRl9VTklSQU5HRV9SRUMoIDB4MkY4MDAsIDB4MkZBMUYgKSwgIC8qIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCAqLwotICAgIEFGX1VOSVJBTkdFX1JFQyggICAgICAgMCwgICAgICAgMCApCi0gIH07Ci0KLSAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9oYW5pX25vbmJhc2VfdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgzMDJBLCAgMHgzMDJGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgMHgzMTkwLCAgMHgzMTlGICksCi0gICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKLSAgfTsKLQotI2VuZGlmIC8qICFBRl9DT05GSUdfT1BUSU9OX0NKSyAqLwotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmcmFuZ2VzLmggYi9zcmMvYXV0b2ZpdC9hZnJhbmdlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmQ5ZWFhLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmcmFuZ2VzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnJhbmdlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgVW5pY29kZSBzY3JpcHQgcmFuZ2VzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZSQU5HRVNfSF8KLSNkZWZpbmUgQUZSQU5HRVNfSF8KLQotCi0jaW5jbHVkZSAiYWZ0eXBlcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jdW5kZWYgIFNDUklQVAotI2RlZmluZSBTQ1JJUFQoIHMsIFMsIGQsIGgsIEgsIHNzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGV4dGVybiBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmXyAjIyBzICMjIF91bmlyYW5nZXNbXTsKLQotI2luY2x1ZGUgImFmc2NyaXB0LmgiCi0KLSN1bmRlZiAgU0NSSVBUCi0jZGVmaW5lIFNDUklQVCggcywgUywgZCwgaCwgSCwgc3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBleHRlcm4gY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl8gIyMgcyAjIyBfbm9uYmFzZV91bmlyYW5nZXNbXTsKLQotI2luY2x1ZGUgImFmc2NyaXB0LmgiCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBBRlJBTkdFU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZzY3JpcHQuaCBiL3NyYy9hdXRvZml0L2Fmc2NyaXB0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiODE1ZGIuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZzY3JpcHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnNjcmlwdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgc2NyaXB0cyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogVGhlIGZvbGxvd2luZyBwYXJ0IGNhbiBiZSBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcy4gKi8KLSAgLyogRGVmaW5lIGBTQ1JJUFQnIGFzIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIC8qIEFkZCBuZXcgc2NyaXB0cyBoZXJlLiAgVGhlIGZpcnN0IGFuZCBzZWNvbmQgYXJndW1lbnRzIGFyZSB0aGUgICAgKi8KLSAgLyogc2NyaXB0IG5hbWUgaW4gbG93ZXJjYXNlIGFuZCB1cHBlcmNhc2UsIHJlc3BlY3RpdmVseSwgZm9sbG93ZWQgICAqLwotICAvKiBieSBhIGRlc2NyaXB0aW9uIHN0cmluZy4gIFRoZW4gY29tZXMgdGhlIGNvcnJlc3BvbmRpbmcgSGFyZkJ1enogICovCi0gIC8qIHNjcmlwdCBuYW1lIHRhZywgZm9sbG93ZWQgYnkgYSBzdHJpbmcgb2Ygc3RhbmRhcmQgY2hhcmFjdGVycyAodG8gKi8KLSAgLyogZGVyaXZlIHRoZSBzdGFuZGFyZCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHN0ZW1zKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBmYWxsYmFjayBzY3JpcHRzIG9ubHkgaGF2ZSBhIGRlZmF1bHQgc3R5bGUsIHRodXMgd2UgICAgKi8KLSAgLyogdXNlIGBIQl9TQ1JJUFRfSU5WQUxJRCcgYXMgdGhlIEhhcmZCdXp6IHNjcmlwdCBuYW1lIHRhZyBmb3IgICAgICAqLwotICAvKiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgU0NSSVBUKCBhZGxtLCBBRExNLAotICAgICAgICAgICJBZGxhbSIsCi0gICAgICAgICAgSEJfU0NSSVBUX0FETEFNLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhGMFx4OUVceEE0XHg4QyBceEYwXHg5RVx4QTRceEFFIiApIC8qIPCepIwg8J6kriAqLwotCi0gIFNDUklQVCggYXJhYiwgQVJBQiwKLSAgICAgICAgICAiQXJhYmljIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfQVJBQklDLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhEOVx4ODQgXHhEOFx4QUQgXHhEOVx4ODAiICkgLyog2YQg2K0g2YAgKi8KLQotICBTQ1JJUFQoIGFybW4sIEFSTU4sCi0gICAgICAgICAgIkFybWVuaWFuIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfQVJNRU5JQU4sCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEQ1XHhCRCBceEQ1XHg4RCIgKSAvKiDVvSDVjSAqLwotCi0gIFNDUklQVCggYXZzdCwgQVZTVCwKLSAgICAgICAgICAiQXZlc3RhbiIsCi0gICAgICAgICAgSEJfU0NSSVBUX0FWRVNUQU4sCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEYwXHg5MFx4QUNceDlBIiApIC8qIPCQrJogKi8KLQotICBTQ1JJUFQoIGJhbXUsIEJBTVUsCi0gICAgICAgICAgIkJhbXVtIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfQkFNVU0sCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEVBXHg5Qlx4ODEgXHhFQVx4OUJceEFGIiApIC8qIOqbgSDqm68gKi8KLQotICAvKiB0aGVyZSBhcmUgbm8gc2ltcGxlIGZvcm1zIGZvciBsZXR0ZXJzOyB3ZSB0aHVzIHVzZSB0d28gZGlnaXQgc2hhcGVzICovCi0gIFNDUklQVCggYmVuZywgQkVORywKLSAgICAgICAgICAiQmVuZ2FsaSIsCi0gICAgICAgICAgSEJfU0NSSVBUX0JFTkdBTEksCi0gICAgICAgICAgSElOVElOR19UT1BfVE9fQk9UVE9NLAotICAgICAgICAgICJceEUwXHhBN1x4QTYgXHhFMFx4QTdceEFBIiApIC8qIOCnpiDgp6ogKi8KLQotICBTQ1JJUFQoIGJ1aGQsIEJVSEQsCi0gICAgICAgICAgIkJ1aGlkIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfQlVISUQsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUxXHg5RFx4OEIgXHhFMVx4OURceDhGIiApIC8qIOGdiyDhnY8gKi8KLQotICBTQ1JJUFQoIGNha20sIENBS00sCi0gICAgICAgICAgIkNoYWttYSIsCi0gICAgICAgICAgSEJfU0NSSVBUX0NIQUtNQSwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RjBceDkxXHg4NFx4QTQgXHhGMFx4OTFceDg0XHg4OSBceEYwXHg5MVx4ODRceDlCIiApIC8qIPCRhKQg8JGEiSDwkYSbICovCi0KLSAgU0NSSVBUKCBjYW5zLCBDQU5TLAotICAgICAgICAgICJDYW5hZGlhbiBTeWxsYWJpY3MiLAotICAgICAgICAgIEhCX1NDUklQVF9DQU5BRElBTl9TWUxMQUJJQ1MsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUxXHg5MVx4OEMgXHhFMVx4OTNceDlBIiApIC8qIOGRjCDhk5ogKi8KLQotICBTQ1JJUFQoIGNhcmksIENBUkksCi0gICAgICAgICAgIkNhcmlhbiIsCi0gICAgICAgICAgSEJfU0NSSVBUX0NBUklBTiwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RjBceDkwXHg4QVx4QUIgXHhGMFx4OTBceDhCXHg4OSIgKSAvKiDwkIqrIPCQi4kgKi8KLQotICBTQ1JJUFQoIGNoZXIsIENIRVIsCi0gICAgICAgICAgIkNoZXJva2VlIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfQ0hFUk9LRUUsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUxXHg4RVx4QTQgXHhFMVx4OEZceDg1IFx4RUFceEFFXHg5NSIgKSAvKiDhjqQg4Y+FIOqulSAqLwotCi0gIFNDUklQVCggY29wdCwgQ09QVCwKLSAgICAgICAgICAiQ29wdGljIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfQ09QVElDLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhFMlx4QjJceDlFIFx4RTJceEIyXHg5RiIgKSAvKiDisp4g4rKfICovCi0KLSAgU0NSSVBUKCBjcHJ0LCBDUFJULAotICAgICAgICAgICJDeXByaW90IiwKLSAgICAgICAgICBIQl9TQ1JJUFRfQ1lQUklPVCwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RjBceDkwXHhBMFx4ODUgXHhGMFx4OTBceEEwXHhBMyIgKSAvKiDwkKCFIPCQoKMgKi8KLQotICBTQ1JJUFQoIGN5cmwsIENZUkwsCi0gICAgICAgICAgIkN5cmlsbGljIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfQ1lSSUxMSUMsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEQwXHhCRSBceEQwXHg5RSIgKSAvKiDQviDQniAqLwotCi0gIFNDUklQVCggZGV2YSwgREVWQSwKLSAgICAgICAgICAiRGV2YW5hZ2FyaSIsCi0gICAgICAgICAgSEJfU0NSSVBUX0RFVkFOQUdBUkksCi0gICAgICAgICAgSElOVElOR19UT1BfVE9fQk9UVE9NLAotICAgICAgICAgICJceEUwXHhBNFx4QTAgXHhFMFx4QTRceEI1IFx4RTBceEE0XHg5RiIgKSAvKiDgpKAg4KS1IOCknyAqLwotCi0gIFNDUklQVCggZHNydCwgRFNSVCwKLSAgICAgICAgICAiRGVzZXJldCIsCi0gICAgICAgICAgSEJfU0NSSVBUX0RFU0VSRVQsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEYwXHg5MFx4OTBceDg0IFx4RjBceDkwXHg5MFx4QUMiICkgLyog8JCQhCDwkJCsICovCi0KLSAgU0NSSVBUKCBldGhpLCBFVEhJLAotICAgICAgICAgICJFdGhpb3BpYyIsCi0gICAgICAgICAgSEJfU0NSSVBUX0VUSElPUElDLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhFMVx4OEJceDkwIiApIC8qIOGLkCAqLwotCi0gIFNDUklQVCggZ2VvciwgR0VPUiwKLSAgICAgICAgICAiR2VvcmdpYW4gKE1raGVkcnVsaSkiLAotICAgICAgICAgIEhCX1NDUklQVF9HRU9SR0lBTiwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTFceDgzXHg5OCBceEUxXHg4M1x4OTQgXHhFMVx4ODNceDkwIiApIC8qIOGDmCDhg5Qg4YOQICovCi0KLSAgU0NSSVBUKCBnZW9rLCBHRU9LLAotICAgICAgICAgICJHZW9yZ2lhbiAoS2h1dHN1cmkpIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfSU5WQUxJRCwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTFceDgyXHhCNiBceEUxXHg4Mlx4QjEgXHhFMlx4QjRceDk5IiApIC8qIOGCtiDhgrEg4rSZICovCi0KLSAgU0NSSVBUKCBnbGFnLCBHTEFHLAotICAgICAgICAgICJHbGFnb2xpdGljIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfR0xBR09MSVRJQywKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTJceEIwXHg5NSBceEUyXHhCMVx4ODUiICkgLyog4rCVIOKxhSAqLwotCi0gIFNDUklQVCggZ290aCwgR09USCwKLSAgICAgICAgICAiR290aGljIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfR09USElDLAotICAgICAgICAgIEhJTlRJTkdfVE9QX1RPX0JPVFRPTSwKLSAgICAgICAgICAiXHhGMFx4OTBceDhDXHhCNCBceEYwXHg5MFx4OENceEJFIFx4RjBceDkwXHg4RFx4ODMiICkgLyog8JCMtCDwkIy+IPCQjYMgKi8KLQotICBTQ1JJUFQoIGdyZWssIEdSRUssCi0gICAgICAgICAgIkdyZWVrIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfR1JFRUssCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceENFXHhCRiBceENFXHg5RiIgKSAvKiDOvyDOnyAqLwotCi0gIFNDUklQVCggZ3VqciwgR1VKUiwKLSAgICAgICAgICAiR3VqYXJhdGkiLAotICAgICAgICAgIEhCX1NDUklQVF9HVUpBUkFUSSwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTBceEFBXHg5RiBceEUwXHhBQlx4QTYiICkgLyog4KqfIOCrpiAqLwotCi0gIFNDUklQVCggZ3VydSwgR1VSVSwKLSAgICAgICAgICAiR3VybXVraGkiLAotICAgICAgICAgIEhCX1NDUklQVF9HVVJNVUtISSwKLSAgICAgICAgICBISU5USU5HX1RPUF9UT19CT1RUT00sCi0gICAgICAgICAgIlx4RTBceEE4XHhBMCBceEUwXHhBOFx4QjAgXHhFMFx4QTlceEE2IiApIC8qIOCooCDgqLAg4KmmICovCi0KLSAgU0NSSVBUKCBoZWJyLCBIRUJSLAotICAgICAgICAgICJIZWJyZXciLAotICAgICAgICAgIEhCX1NDUklQVF9IRUJSRVcsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEQ3XHg5RCIgKSAvKiDXnSAqLwotCi0gIFNDUklQVCgga2FsaSwgS0FMSSwKLSAgICAgICAgICAiS2F5YWggTGkiLAotICAgICAgICAgIEhCX1NDUklQVF9LQVlBSF9MSSwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RUFceEE0XHg4RCBceEVBXHhBNFx4ODAiICkgLyog6qSNIOqkgCAqLwotCi0gIC8qIG9ubHkgZGlnaXQgemVybyBoYXMgYSBzaW1wbGUgc2hhcGUgaW4gdGhlIEtobWVyIHNjcmlwdCAqLwotICBTQ1JJUFQoIGtobXIsIEtITVIsCi0gICAgICAgICAgIktobWVyIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfS0hNRVIsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUxXHg5Rlx4QTAiICkgLyog4Z+gICovCi0KLSAgU0NSSVBUKCBraG1zLCBLSE1TLAotICAgICAgICAgICJLaG1lciBTeW1ib2xzIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfSU5WQUxJRCwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTFceEE3XHhBMSBceEUxXHhBN1x4QUEiICkgLyog4aehIOGnqiAqLwotCi0gIFNDUklQVCgga25kYSwgS05EQSwKLSAgICAgICAgICAiS2FubmFkYSIsCi0gICAgICAgICAgSEJfU0NSSVBUX0tBTk5BREEsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUwXHhCM1x4QTYgXHhFMFx4QjJceEFDIiApIC8qIOCzpiDgsqwgKi8KLQotICAvKiBvbmx5IGRpZ2l0IHplcm8gaGFzIGEgc2ltcGxlIHNoYXBlIGluIHRoZSBMYW8gc2NyaXB0ICovCi0gIFNDUklQVCggbGFvLCBMQU8sCi0gICAgICAgICAgIkxhbyIsCi0gICAgICAgICAgSEJfU0NSSVBUX0xBTywKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTBceEJCXHg5MCIgKSAvKiDgu5AgKi8KLQotICBTQ1JJUFQoIGxhdG4sIExBVE4sCi0gICAgICAgICAgIkxhdGluIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfTEFUSU4sCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJvIE8gMCIgKQotCi0gIFNDUklQVCggbGF0YiwgTEFUQiwKLSAgICAgICAgICAiTGF0aW4gU3Vic2NyaXB0IEZhbGxiYWNrIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfSU5WQUxJRCwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTJceDgyXHg5MiBceEUyXHg4Mlx4ODAiICkgLyog4oKSIOKCgCAqLwotCi0gIFNDUklQVCggbGF0cCwgTEFUUCwKLSAgICAgICAgICAiTGF0aW4gU3VwZXJzY3JpcHQgRmFsbGJhY2siLAotICAgICAgICAgIEhCX1NDUklQVF9JTlZBTElELAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhFMVx4QjVceDkyIFx4RTFceEI0XHhCQyBceEUyXHg4MVx4QjAiICkgLyog4bWSIOG0vCDigbAgKi8KLQotICBTQ1JJUFQoIGxpc3UsIExJU1UsCi0gICAgICAgICAgIkxpc3UiLAotICAgICAgICAgIEhCX1NDUklQVF9MSVNVLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhFQVx4OTNceEIzIiApIC8qIOqTsyAqLwotCi0gIFNDUklQVCggbWx5bSwgTUxZTSwKLSAgICAgICAgICAiTWFsYXlhbGFtIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfTUFMQVlBTEFNLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhFMFx4QjRceEEwIFx4RTBceEI0XHhCMSIgKSAvKiDgtKAg4LSxICovCi0KLSAgU0NSSVBUKCBteW1yLCBNWU1SLAotICAgICAgICAgICJNeWFubWFyIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfTVlBTk1BUiwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTFceDgwXHg5RCBceEUxXHg4MFx4ODQgXHhFMVx4ODBceDgyIiApIC8qIOGAnSDhgIQg4YCCICovCi0KLSAgU0NSSVBUKCBua29vLCBOS09PLAotICAgICAgICAgICJOJ0tvIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfTktPLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhERlx4OEIgXHhERlx4ODAiICkgLyog34sg34AgKi8KLQotICBTQ1JJUFQoIG5vbmUsIE5PTkUsCi0gICAgICAgICAgIm5vIHNjcmlwdCIsCi0gICAgICAgICAgSEJfU0NSSVBUX0lOVkFMSUQsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICIiICkKLQotICBTQ1JJUFQoIG9sY2ssIE9MQ0ssCi0gICAgICAgICAgIk9sIENoaWtpIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfT0xfQ0hJS0ksCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUxXHhCMVx4OUIiICkgLyog4bGbICovCi0KLSAgU0NSSVBUKCBvcmtoLCBPUktILAotICAgICAgICAgICJPbGQgVHVya2ljIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfT0xEX1RVUktJQywKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RjBceDkwXHhCMFx4OTciICkgLyog8JCwlyAqLwotCi0gIFNDUklQVCggb3NnZSwgT1NHRSwKLSAgICAgICAgICAiT3NhZ2UiLAotICAgICAgICAgIEhCX1NDUklQVF9PU0FHRSwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RjBceDkwXHg5M1x4ODIgXHhGMFx4OTBceDkzXHhBQSIgKSAvKiDwkJOCIPCQk6ogKi8KLQotICBTQ1JJUFQoIG9zbWEsIE9TTUEsCi0gICAgICAgICAgIk9zbWFueWEiLAotICAgICAgICAgIEhCX1NDUklQVF9PU01BTllBLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhGMFx4OTBceDkyXHg4NiBceEYwXHg5MFx4OTJceEEwIiApIC8qIPCQkoYg8JCSoCAqLwotCi0gIFNDUklQVCggc2F1ciwgU0FVUiwKLSAgICAgICAgICAiU2F1cmFzaHRyYSIsCi0gICAgICAgICAgSEJfU0NSSVBUX1NBVVJBU0hUUkEsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEVBXHhBMlx4OUQgXHhFQVx4QTNceDkwIiApIC8qIOqinSDqo5AgKi8KLQotICBTQ1JJUFQoIHNoYXcsIFNIQVcsCi0gICAgICAgICAgIlNoYXZpYW4iLAotICAgICAgICAgIEhCX1NDUklQVF9TSEFWSUFOLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhGMFx4OTBceDkxXHhCNCIgKSAvKiDwkJG0ICovCi0KLSAgU0NSSVBUKCBzaW5oLCBTSU5ILAotICAgICAgICAgICJTaW5oYWxhIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfU0lOSEFMQSwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTBceEI2XHhBNyIgKSAvKiDgtqcgKi8KLQotICAvKiBvbmx5IGRpZ2l0IHplcm8gaGFzIGEgc2ltcGxlIChyb3VuZCkgc2hhcGUgaW4gdGhlIFN1bmRhbmVzZSBzY3JpcHQgKi8KLSAgU0NSSVBUKCBzdW5kLCBTVU5ELAotICAgICAgICAgICJTdW5kYW5lc2UiLAotICAgICAgICAgIEhCX1NDUklQVF9TVU5EQU5FU0UsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUxXHhBRVx4QjAiICkgLyog4a6wICovCi0KLSAgLyogb25seSBkaWdpdCB6ZXJvIGhhcyBhIHNpbXBsZSAocm91bmQpIHNoYXBlIGluIHRoZSBUYW1pbCBzY3JpcHQgKi8KLSAgU0NSSVBUKCB0YW1sLCBUQU1MLAotICAgICAgICAgICJUYW1pbCIsCi0gICAgICAgICAgSEJfU0NSSVBUX1RBTUlMLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhFMFx4QUZceEE2IiApIC8qIOCvpiAqLwotCi0gIFNDUklQVCggdGF2dCwgVEFWVCwKLSAgICAgICAgICAiVGFpIFZpZXQiLAotICAgICAgICAgIEhCX1NDUklQVF9UQUlfVklFVCwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RUFceEFBXHg5MiBceEVBXHhBQVx4QUIiICkgLyog6qqSIOqqqyAqLwotCi0gIC8qIHRoZXJlIGFyZSBubyBzaW1wbGUgZm9ybXMgZm9yIGxldHRlcnM7IHdlIHRodXMgdXNlIHR3byBkaWdpdCBzaGFwZXMgKi8KLSAgU0NSSVBUKCB0ZWx1LCBURUxVLAotICAgICAgICAgICJUZWx1Z3UiLAotICAgICAgICAgIEhCX1NDUklQVF9URUxVR1UsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUwXHhCMVx4QTYgXHhFMFx4QjFceEE3IiApIC8qIOCxpiDgsacgKi8KLQotICBTQ1JJUFQoIHRmbmcsIFRGTkcsCi0gICAgICAgICAgIlRpZmluYWdoIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfVElGSU5BR0gsCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEUyXHhCNVx4OTQiICkgLyog4rWUICovCi0KLSAgU0NSSVBUKCB0aGFpLCBUSEFJLAotICAgICAgICAgICJUaGFpIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfVEhBSSwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIlx4RTBceEI4XHhCMiBceEUwXHhCOVx4ODUgXHhFMFx4QjlceDkwIiApIC8qIOC4siDguYUg4LmQICovCi0KLSAgU0NSSVBUKCB2YWlpLCBWQUlJLAotICAgICAgICAgICJWYWkiLAotICAgICAgICAgIEhCX1NDUklQVF9WQUksCi0gICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAotICAgICAgICAgICJceEVBXHg5OFx4OTMgXHhFQVx4OTZceDlDIFx4RUFceDk2XHhCNCIgKSAvKiDqmJMg6pacIOqWtCAqLwotCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9JTkRJQwotCi0gIFNDUklQVCggbGltYiwgTElNQiwKLSAgICAgICAgICAiTGltYnUiLAotICAgICAgICAgIEhCX1NDUklQVF9MSU1CVSwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIm8iICkgLyogWFhYICovCi0KLSAgU0NSSVBUKCBvcnlhLCBPUllBLAotICAgICAgICAgICJPcml5YSIsCi0gICAgICAgICAgSEJfU0NSSVBUX09SSVlBLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAibyIgKSAvKiBYWFggKi8KLQotICBTQ1JJUFQoIHN5bG8sIFNZTE8sCi0gICAgICAgICAgIlN5bG90aSBOYWdyaSIsCi0gICAgICAgICAgSEJfU0NSSVBUX1NZTE9USV9OQUdSSSwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIm8iICkgLyogWFhYICovCi0KLSAgU0NSSVBUKCB0aWJ0LCBUSUJULAotICAgICAgICAgICJUaWJldGFuIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfVElCRVRBTiwKLSAgICAgICAgICBISU5USU5HX0JPVFRPTV9UT19UT1AsCi0gICAgICAgICAgIm8iICkgLyogWFhYICovCi0KLSNlbmRpZiAvKiBBRl9DT05GSUdfT1BUSU9OX0lORElDICovCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKSwotCi0gIFNDUklQVCggaGFuaSwgSEFOSSwKLSAgICAgICAgICAiQ0pLViBpZGVvZ3JhcGhzIiwKLSAgICAgICAgICBIQl9TQ1JJUFRfSEFOLAotICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKLSAgICAgICAgICAiXHhFN1x4OTRceEIwIFx4RTVceDlCXHg5NyIgKSAvKiDnlLAg5ZuXICovCi0KLSNlbmRpZiAvKiBBRl9DT05GSUdfT1BUSU9OX0NKSyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZzaGFwZXIuYyBiL3NyYy9hdXRvZml0L2Fmc2hhcGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTJmYWQuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZzaGFwZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnNoYXBlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGFyZkJ1enogaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgT3BlblR5cGUgZmVhdHVyZXMgKGJvZHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgImFmZ2xvYmFsLmgiCi0jaW5jbHVkZSAiYWZ0eXBlcy5oIgotI2luY2x1ZGUgImFmc2hhcGVyLmgiCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYWZzaGFwZXIKLQotCi0gIC8qCi0gICAqIFdlIHVzZSBgc2V0cycgKGluIHRoZSBIYXJmQnV6eiBzZW5zZSwgd2hpY2ggY29tZXMgcXVpdGUgbmVhciB0byB0aGUKLSAgICogdXN1YWwgbWF0aGVtYXRpY2FsIG1lYW5pbmcpIHRvIG1hbmFnZSBib3RoIGxvb2t1cHMgYW5kIGdseXBoIGluZGljZXMuCi0gICAqCi0gICAqIDEuIEZvciBlYWNoIGNvdmVyYWdlLCBjb2xsZWN0IGxvb2t1cCBJRHMgaW4gYSBzZXQuICBOb3RlIHRoYXQgYW4KLSAgICogICAgYXV0by1oaW50ZXIgYGNvdmVyYWdlJyBpcyByZXByZXNlbnRlZCBieSBvbmUgYGZlYXR1cmUnLCBhbmQgYQotICAgKiAgICBmZWF0dXJlIGNvbnNpc3RzIG9mIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgKGZvbnQgc3BlY2lmaWMpIGBsb29rdXAncwotICAgKiAgICB0aGF0IGFjdHVhbGx5IGRvIHRoZSBtYXBwaW5nIGpvYi4gIFBsZWFzZSBjaGVjayB0aGUgT3BlblR5cGUKLSAgICogICAgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGZlYXR1cmVzIGFuZCBsb29rdXBzLgotICAgKgotICAgKiAyLiBDcmVhdGUgZ2x5cGggSUQgc2V0cyBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGxvb2t1cCBzZXRzLgotICAgKgotICAgKiAzLiBUaGUgZ2x5cGggc2V0IGNvcnJlc3BvbmRpbmcgdG8gQUZfQ09WRVJBR0VfREVGQVVMVCBpcyBjb21wdXRlZAotICAgKiAgICB3aXRoIGFsbCBsb29rdXBzIHNwZWNpZmljIHRvIHRoZSBPcGVuVHlwZSBzY3JpcHQgYWN0aXZhdGVkLiAgSXQKLSAgICogICAgcmVsaWVzIG9uIHRoZSBvcmRlciBvZiBBRl9ERUZJTkVfU1RZTEVfQ0xBU1MgZW50cmllcyBzbyB0aGF0Ci0gICAqICAgIHNwZWNpYWwgY292ZXJhZ2VzIChsaWtlIGBvbGRzdHlsZSBmaWd1cmVzJykgZG9uJ3QgZ2V0IG92ZXJ3cml0dGVuLgotICAgKgotICAgKi8KLQotCi0gIC8qIGxvYWQgY292ZXJhZ2UgdGFncyAqLwotI3VuZGVmICBDT1ZFUkFHRQotI2RlZmluZSBDT1ZFUkFHRSggbmFtZSwgTkFNRSwgZGVzY3JpcHRpb24sICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIHRhZzEsIHRhZzIsIHRhZzMsIHRhZzQgKSAgICAgICAgICAgICBcCi0gICAgICAgICAgc3RhdGljIGNvbnN0IGhiX3RhZ190ICBuYW1lICMjIF9jb3ZlcmFnZVtdID0gXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEhCX1RBRyggdGFnMSwgdGFnMiwgdGFnMywgdGFnNCApLCAgICAgICAgICBcCi0gICAgICAgICAgICBIQl9UQUdfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH07Ci0KLQotI2luY2x1ZGUgImFmY292ZXIuaCIKLQotCi0gIC8qIGRlZmluZSBtYXBwaW5nIGJldHdlZW4gY292ZXJhZ2UgdGFncyBhbmQgQUZfQ292ZXJhZ2UgKi8KLSN1bmRlZiAgQ09WRVJBR0UKLSNkZWZpbmUgQ09WRVJBR0UoIG5hbWUsIE5BTUUsIGRlc2NyaXB0aW9uLCBcCi0gICAgICAgICAgICAgICAgICB0YWcxLCB0YWcyLCB0YWczLCB0YWc0ICkgXAotICAgICAgICAgIG5hbWUgIyMgX2NvdmVyYWdlLAotCi0KLSAgc3RhdGljIGNvbnN0IGhiX3RhZ190KiAgY292ZXJhZ2VzW10gPQotICB7Ci0jaW5jbHVkZSAiYWZjb3Zlci5oIgotCi0gICAgTlVMTCAvKiBBRl9DT1ZFUkFHRV9ERUZBVUxUICovCi0gIH07Ci0KLQotICAvKiBsb2FkIEhhcmZCdXp6IHNjcmlwdCB0YWdzICovCi0jdW5kZWYgIFNDUklQVAotI2RlZmluZSBTQ1JJUFQoIHMsIFMsIGQsIGgsIEgsIHNzICkgIGgsCi0KLQotICBzdGF0aWMgY29uc3QgaGJfc2NyaXB0X3QgIHNjcmlwdHNbXSA9Ci0gIHsKLSNpbmNsdWRlICJhZnNjcmlwdC5oIgotICB9OwotCi0KLSAgRlRfRXJyb3IKLSAgYWZfc2hhcGVyX2dldF9jb3ZlcmFnZSggQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1N0eWxlQ2xhc3MgICBzdHlsZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgIGdzdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZWZhdWx0X3NjcmlwdCApCi0gIHsKLSAgICBoYl9mYWNlX3QqICBmYWNlOwotCi0gICAgaGJfc2V0X3QqICBnc3ViX2xvb2t1cHM7ICAvKiBHU1VCIGxvb2t1cHMgZm9yIGEgZ2l2ZW4gc2NyaXB0ICovCi0gICAgaGJfc2V0X3QqICBnc3ViX2dseXBoczsgICAvKiBnbHlwaHMgY292ZXJlZCBieSBHU1VCIGxvb2t1cHMgICovCi0gICAgaGJfc2V0X3QqICBncG9zX2xvb2t1cHM7ICAvKiBHUE9TIGxvb2t1cHMgZm9yIGEgZ2l2ZW4gc2NyaXB0ICovCi0gICAgaGJfc2V0X3QqICBncG9zX2dseXBoczsgICAvKiBnbHlwaHMgY292ZXJlZCBieSBHUE9TIGxvb2t1cHMgICovCi0KLSAgICBoYl9zY3JpcHRfdCAgICAgIHNjcmlwdDsKLSAgICBjb25zdCBoYl90YWdfdCogIGNvdmVyYWdlX3RhZ3M7Ci0gICAgaGJfdGFnX3QgICAgICAgICBzY3JpcHRfdGFnc1tdID0geyBIQl9UQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCX1RBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJfVEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQl9UQUdfTk9ORSB9OwotCi0gICAgaGJfY29kZXBvaW50X3QgIGlkeDsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgIGludCAgICAgICAgICAgICBjb3VudDsKLSNlbmRpZgotCi0KLSAgICBpZiAoICFnbG9iYWxzIHx8ICFzdHlsZV9jbGFzcyB8fCAhZ3N0eWxlcyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGZhY2UgPSBoYl9mb250X2dldF9mYWNlKCBnbG9iYWxzLT5oYl9mb250ICk7Ci0KLSAgICBnc3ViX2xvb2t1cHMgPSBoYl9zZXRfY3JlYXRlKCk7Ci0gICAgZ3N1Yl9nbHlwaHMgID0gaGJfc2V0X2NyZWF0ZSgpOwotICAgIGdwb3NfbG9va3VwcyA9IGhiX3NldF9jcmVhdGUoKTsKLSAgICBncG9zX2dseXBocyAgPSBoYl9zZXRfY3JlYXRlKCk7Ci0KLSAgICBjb3ZlcmFnZV90YWdzID0gY292ZXJhZ2VzW3N0eWxlX2NsYXNzLT5jb3ZlcmFnZV07Ci0gICAgc2NyaXB0ICAgICAgICA9IHNjcmlwdHNbc3R5bGVfY2xhc3MtPnNjcmlwdF07Ci0KLSAgICAvKiBDb252ZXJ0IGEgSGFyZkJ1enogc2NyaXB0IHRhZyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIE9wZW5UeXBlICovCi0gICAgLyogdGFnIG9yIHRhZ3MgLS0gc29tZSBJbmRpYyBzY3JpcHRzIGxpa2UgRGV2YW5hZ2FyaSBoYXZlIGFuIG9sZCAqLwotICAgIC8qIGFuZCBhIG5ldyBzZXQgb2YgZmVhdHVyZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBoYl9vdF90YWdzX2Zyb21fc2NyaXB0KCBzY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdF90YWdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRfdGFnc1sxXSApOwotCi0gICAgLyogYGhiX290X3RhZ3NfZnJvbV9zY3JpcHQnIHVzdWFsbHkgcmV0dXJucyBIQl9PVF9UQUdfREVGQVVMVF9TQ1JJUFQgKi8KLSAgICAvKiBhcyB0aGUgc2Vjb25kIHRhZy4gIFdlIGNoYW5nZSB0aGF0IHRvIEhCX1RBR19OT05FIGV4Y2VwdCBmb3IgdGhlICAqLwotICAgIC8qIGRlZmF1bHQgc2NyaXB0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBkZWZhdWx0X3NjcmlwdCApCi0gICAgewotICAgICAgaWYgKCBzY3JpcHRfdGFnc1swXSA9PSBIQl9UQUdfTk9ORSApCi0gICAgICAgIHNjcmlwdF90YWdzWzBdID0gSEJfT1RfVEFHX0RFRkFVTFRfU0NSSVBUOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIHNjcmlwdF90YWdzWzFdID09IEhCX1RBR19OT05FICkKLSAgICAgICAgICBzY3JpcHRfdGFnc1sxXSA9IEhCX09UX1RBR19ERUZBVUxUX1NDUklQVDsKLSAgICAgICAgZWxzZSBpZiAoIHNjcmlwdF90YWdzWzFdICE9IEhCX09UX1RBR19ERUZBVUxUX1NDUklQVCApCi0gICAgICAgICAgc2NyaXB0X3RhZ3NbMl0gPSBIQl9PVF9UQUdfREVGQVVMVF9TQ1JJUFQ7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiB3ZSB1c2Ugbm9uLXN0YW5kYXJkIHRhZ3MgbGlrZSBga2htcycgZm9yIHNwZWNpYWwgcHVycG9zZXM7ICAgICAgICovCi0gICAgICAvKiBIYXJmQnV6eiBtYXBzIHRoZW0gdG8gYERGTFQnLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGhhbmRsZSBoZXJlICovCi0gICAgICBpZiAoIHNjcmlwdF90YWdzWzBdID09IEhCX09UX1RBR19ERUZBVUxUX1NDUklQVCApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCBzY3JpcHRfdGFnc1sxXSA9PSBIQl9PVF9UQUdfREVGQVVMVF9TQ1JJUFQgKQotICAgICAgICBzY3JpcHRfdGFnc1sxXSA9IEhCX1RBR19OT05FOwotICAgIH0KLQotICAgIGhiX290X2xheW91dF9jb2xsZWN0X2xvb2t1cHMoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJfT1RfVEFHX0dTVUIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X3RhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZV90YWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWJfbG9va3VwcyApOwotCi0gICAgaWYgKCBoYl9zZXRfaXNfZW1wdHkoIGdzdWJfbG9va3VwcyApICkKLSAgICAgIGdvdG8gRXhpdDsgLyogbm90aGluZyB0byBkbyAqLwotCi0gICAgaGJfb3RfbGF5b3V0X2NvbGxlY3RfbG9va3VwcyggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQl9PVF9UQUdfR1BPUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfdGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlX3RhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Bvc19sb29rdXBzICk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiR1NVQiBsb29rdXBzIChzdHlsZSBgJXMnKTpcbiIKLSAgICAgICAgICAgICAgICAiICIsCi0gICAgICAgICAgICAgICAgYWZfc3R5bGVfbmFtZXNbc3R5bGVfY2xhc3MtPnN0eWxlXSApKTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgY291bnQgPSAwOwotI2VuZGlmCi0KLSAgICBmb3IgKCBpZHggPSBIQl9TRVRfVkFMVUVfSU5WQUxJRDsgaGJfc2V0X25leHQoIGdzdWJfbG9va3VwcywgJmlkeCApOyApCi0gICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICBGVF9UUkFDRTQoKCAiICVkIiwgaWR4ICkpOwotICAgICAgY291bnQrKzsKLSNlbmRpZgotCi0gICAgICAvKiBnZXQgb3V0cHV0IGNvdmVyYWdlIG9mIEdTVUIgZmVhdHVyZSAqLwotICAgICAgaGJfb3RfbGF5b3V0X2xvb2t1cF9jb2xsZWN0X2dseXBocyggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCX09UX1RBR19HU1VCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1Yl9nbHlwaHMgKTsKLSAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgIGlmICggIWNvdW50ICkKLSAgICAgIEZUX1RSQUNFNCgoICIgKG5vbmUpIiApKTsKLSAgICBGVF9UUkFDRTQoKCAiXG5cbiIgKSk7Ci0jZW5kaWYKLQotICAgIEZUX1RSQUNFNCgoICJHUE9TIGxvb2t1cHMgKHN0eWxlIGAlcycpOlxuIgotICAgICAgICAgICAgICAgICIgIiwKLSAgICAgICAgICAgICAgICBhZl9zdHlsZV9uYW1lc1tzdHlsZV9jbGFzcy0+c3R5bGVdICkpOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBjb3VudCA9IDA7Ci0jZW5kaWYKLQotICAgIGZvciAoIGlkeCA9IEhCX1NFVF9WQUxVRV9JTlZBTElEOyBoYl9zZXRfbmV4dCggZ3Bvc19sb29rdXBzLCAmaWR4ICk7ICkKLSAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgIEZUX1RSQUNFNCgoICIgJWQiLCBpZHggKSk7Ci0gICAgICBjb3VudCsrOwotI2VuZGlmCi0KLSAgICAgIC8qIGdldCBpbnB1dCBjb3ZlcmFnZSBvZiBHUE9TIGZlYXR1cmUgKi8KLSAgICAgIGhiX290X2xheW91dF9sb29rdXBfY29sbGVjdF9nbHlwaHMoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQl9PVF9UQUdfR1BPUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9zX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7Ci0gICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBpZiAoICFjb3VudCApCi0gICAgICBGVF9UUkFDRTQoKCAiIChub25lKSIgKSk7Ci0gICAgRlRfVFJBQ0U0KCggIlxuXG4iICkpOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFdlIG5vdyBjaGVjayB3aGV0aGVyIHdlIGNhbiBjb25zdHJ1Y3QgYmx1ZSB6b25lcywgdXNpbmcgZ2x5cGhzCi0gICAgICogY292ZXJlZCBieSB0aGUgZmVhdHVyZSBvbmx5LiAgSW4gY2FzZSB0aGVyZSBpcyBub3QgYSBzaW5nbGUgem9uZQotICAgICAqICh0aGlzIGlzLCBub3QgYSBzaW5nbGUgY2hhcmFjdGVyIGlzIGNvdmVyZWQpLCB3ZSBza2lwIHRoaXMgY292ZXJhZ2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBpZiAoIHN0eWxlX2NsYXNzLT5jb3ZlcmFnZSAhPSBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLSAgICB7Ci0gICAgICBBRl9CbHVlX1N0cmluZ3NldCAgICAgICAgIGJzcyA9IHN0eWxlX2NsYXNzLT5ibHVlX3N0cmluZ3NldDsKLSAgICAgIGNvbnN0IEFGX0JsdWVfU3RyaW5nUmVjKiAgYnMgID0gJmFmX2JsdWVfc3RyaW5nc2V0c1tic3NdOwotCi0gICAgICBGVF9Cb29sICBmb3VuZCA9IDA7Ci0KLQotICAgICAgZm9yICggOyBicy0+c3RyaW5nICE9IEFGX0JMVUVfU1RSSU5HX01BWDsgYnMrKyApCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIqICBwID0gJmFmX2JsdWVfc3RyaW5nc1ticy0+c3RyaW5nXTsKLQotCi0gICAgICAgIHdoaWxlICggKnAgKQotICAgICAgICB7Ci0gICAgICAgICAgaGJfY29kZXBvaW50X3QgIGNoOwotCi0KLSAgICAgICAgICBHRVRfVVRGOF9DSEFSKCBjaCwgcCApOwotCi0gICAgICAgICAgZm9yICggaWR4ID0gSEJfU0VUX1ZBTFVFX0lOVkFMSUQ7IGhiX3NldF9uZXh0KCBnc3ViX2xvb2t1cHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWR4ICk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYl9jb2RlcG9pbnRfdCAgZ2lkeCA9IEZUX0dldF9DaGFyX0luZGV4KCBnbG9iYWxzLT5mYWNlLCBjaCApOwotCi0KLSAgICAgICAgICAgIGlmICggaGJfb3RfbGF5b3V0X2xvb2t1cF93b3VsZF9zdWJzdGl0dXRlKCBmYWNlLCBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpZHgsIDEsIDEgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWZvdW5kICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U0KCggIiAgbm8gYmx1ZSBjaGFyYWN0ZXJzIGZvdW5kOyBzdHlsZSBza2lwcGVkXG4iICkpOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBWYXJpb3VzIE9wZW5UeXBlIGZlYXR1cmVzIG1pZ2h0IHVzZSB0aGUgc2FtZSBnbHlwaHMgYXQgZGlmZmVyZW50Ci0gICAgICogdmVydGljYWwgcG9zaXRpb25zOyBmb3IgZXhhbXBsZSwgc3VwZXJzY3JpcHQgYW5kIHN1YnNjcmlwdCBnbHlwaHMKLSAgICAgKiBjb3VsZCBiZSB0aGUgc2FtZS4gIEhvd2V2ZXIsIHRoZSBhdXRvLWhpbnRlciBpcyBjb21wbGV0ZWx5Ci0gICAgICogYWdub3N0aWMgb2YgT3BlblR5cGUgZmVhdHVyZXMgYWZ0ZXIgdGhlIGZlYXR1cmUgYW5hbHlzaXMgaGFzIGJlZW4KLSAgICAgKiBjb21wbGV0ZWQ6IFRoZSBlbmdpbmUgdGhlbiBzaW1wbHkgcmVjZWl2ZXMgYSBnbHlwaCBpbmRleCBhbmQgcmV0dXJucyBhCi0gICAgICogaGludGVkIGFuZCB1c3VhbGx5IHJlbmRlcmVkIGdseXBoLgotICAgICAqCi0gICAgICogQ29uc2lkZXIgdGhlIHN1cGVyc2NyaXB0IGZlYXR1cmUgb2YgZm9udCBgcGFsYS50dGYnOiBTb21lIG9mIHRoZQotICAgICAqIGdseXBocyBhcmUgYHJlYWwnLCB0aGlzIGlzLCB0aGV5IGhhdmUgYSB6ZXJvIHZlcnRpY2FsIG9mZnNldCwgYnV0Ci0gICAgICogbW9zdCBvZiB0aGVtIGFyZSBzbWFsbCBjYXBzIGdseXBocyBzaGlmdGVkIHVwIHRvIHRoZSBzdXBlcnNjcmlwdAotICAgICAqIHBvc2l0aW9uICh0aGlzIGlzLCB0aGUgYHN1cHMnIGZlYXR1cmUgaXMgcHJlc2VudCBpbiBib3RoIHRoZSBHU1VCIGFuZAotICAgICAqIEdQT1MgdGFibGVzKS4gIFRoZSBjb2RlIGZvciBibHVlIHpvbmVzIGNvbXB1dGF0aW9uIGFjdHVhbGx5IHVzZXMgYQotICAgICAqIGZlYXR1cmUncyB5IG9mZnNldCBzbyB0aGF0IHRoZSBgcmVhbCcgZ2x5cGhzIGdldCBjb3JyZWN0IGhpbnRzLiAgQnV0Ci0gICAgICogbGF0ZXIgb24gaXQgaXMgaW1wb3NzaWJsZSB0byBkZWNpZGUgd2hldGhlciBhIGdseXBoIGluZGV4IGJlbG9uZ3MgdG8sCi0gICAgICogc2F5LCB0aGUgc21hbGwgY2FwcyBvciBzdXBlcnNjcmlwdCBmZWF0dXJlLgotICAgICAqCi0gICAgICogRm9yIHRoaXMgcmVhc29uLCB3ZSBkb24ndCBhc3NpZ24gYSBzdHlsZSB0byBhIGdseXBoIGlmIHRoZSBjdXJyZW50Ci0gICAgICogZmVhdHVyZSBjb3ZlcnMgdGhlIGdseXBoIGluIGJvdGggdGhlIEdTVUIgYW5kIHRoZSBHUE9TIHRhYmxlcy4gIFRoaXMKLSAgICAgKiBpcyBxdWl0ZSBhIGJyb2FkIGNvbmRpdGlvbiwgYXNzdW1pbmcgdGhhdAotICAgICAqCi0gICAgICogICAoYSkgZ2x5cGhzIHRoYXQgZ2V0IHVzZWQgaW4gbXVsdGlwbGUgZmVhdHVyZXMgYXJlIHByZXNlbnQgaW4gYQotICAgICAqICAgICAgIGZlYXR1cmUgd2l0aG91dCB2ZXJ0aWNhbCBzaGlmdCwKLSAgICAgKgotICAgICAqIGFuZAotICAgICAqCi0gICAgICogICAoYikgYSBmZWF0dXJlJ3MgR1BPUyBkYXRhIHJlYWxseSBtb3ZlcyB0aGUgZ2x5cGggdmVydGljYWxseS4KLSAgICAgKgotICAgICAqIE5vdCBmdWxmaWxsaW5nIGNvbmRpdGlvbiAoYSkgbWFrZXMgYSBmb250IGxhcmdlcjsgaXQgd291bGQgYWxzbwotICAgICAqIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGdseXBocyB0aGF0IGNvdWxkIGJlIGFkZHJlc3NlZCBkaXJlY3RseSB3aXRob3V0Ci0gICAgICogdXNpbmcgT3BlblR5cGUgZmVhdHVyZXMsIHNvIHRoaXMgYXNzdW1wdGlvbiBpcyByYXRoZXIgc3Ryb25nLgotICAgICAqCi0gICAgICogQ29uZGl0aW9uIChiKSBpcyBtdWNoIHdlYWtlciwgYW5kIHRoZXJlIG1pZ2h0IGJlIGdseXBocyB3aGljaCBnZXQKLSAgICAgKiBtaXNzZWQuICBIb3dldmVyLCB0aGUgT3BlblR5cGUgZmVhdHVyZXMgd2UgYXJlIGdvaW5nIHRvIGhhbmRsZSBhcmUKLSAgICAgKiBwcmltYXJpbHkgbG9jYXRlZCBpbiBHU1VCLCBhbmQgSGFyZkJ1enogZG9lc24ndCBwcm92aWRlIGFuIEFQSSB0bwotICAgICAqIGRpcmVjdGx5IGdldCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIEdQT1MgdGFibGUuICBBCi0gICAgICogcG9zc2libGUgc29sdXRpb24gbWlnaHQgYmUgdG8gZGlyZWN0bHkgcGFyc2UgdGhlIEdQT1MgdGFibGUgdG8gZmluZAotICAgICAqIG91dCB3aGV0aGVyIGEgZ2x5cGggZ2V0cyBzaGlmdGVkIHZlcnRpY2FsbHksIGJ1dCB0aGlzIGlzIHNvbWV0aGluZyBJCi0gICAgICogd291bGQgbGlrZSB0byBhdm9pZCBpZiBub3QgcmVhbGx5IG5lY2Vzc2FyeS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB3ZSBkb24ndCBmb2xsb3cgdGhpcyBsb2dpYyBmb3IgdGhlIGRlZmF1bHQgY292ZXJhZ2UuCi0gICAgICogQ29tcGxleCBzY3JpcHRzIGxpa2UgRGV2YW5hZ2FyaSBoYXZlIG1hbmRhdG9yeSBHUE9TIGZlYXR1cmVzIHRvCi0gICAgICogcG9zaXRpb24gbWFueSBnbHlwaCBlbGVtZW50cywgdXNpbmcgbWFyay10by1iYXNlIG9yIG1hcmstdG8tbGlnYXR1cmUKLSAgICAgKiB0YWJsZXM7IHRoZSBudW1iZXIgb2YgZ2x5cGhzIG1pc3NlZCBkdWUgdG8gY29uZGl0aW9uIChiKSB3b3VsZCBiZSBmYXIKLSAgICAgKiB0b28gbGFyZ2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBpZiAoIHN0eWxlX2NsYXNzLT5jb3ZlcmFnZSAhPSBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLSAgICAgIGhiX3NldF9zdWJ0cmFjdCggZ3N1Yl9nbHlwaHMsIGdwb3NfZ2x5cGhzICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgIEZUX1RSQUNFNCgoICIgIGdseXBocyB3aXRob3V0IEdQT1MgZGF0YSAoYConIG1lYW5zIGFscmVhZHkgYXNzaWduZWQpIiApKTsKLSAgICBjb3VudCA9IDA7Ci0jZW5kaWYKLQotICAgIGZvciAoIGlkeCA9IEhCX1NFVF9WQUxVRV9JTlZBTElEOyBoYl9zZXRfbmV4dCggZ3N1Yl9nbHlwaHMsICZpZHggKTsgKQotICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgaWYgKCAhKCBjb3VudCAlIDEwICkgKQotICAgICAgICBGVF9UUkFDRTQoKCAiXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAiICkpOwotCi0gICAgICBGVF9UUkFDRTQoKCAiICVkIiwgaWR4ICkpOwotICAgICAgY291bnQrKzsKLSNlbmRpZgotCi0gICAgICAvKiBnbHlwaCBpbmRpY2VzIHJldHVybmVkIGJ5IGBoYl9vdF9sYXlvdXRfbG9va3VwX2NvbGxlY3RfZ2x5cGhzJyAqLwotICAgICAgLyogY2FuIGJlIGFyYml0cmFyeTogc29tZSBmb250cyB1c2UgZmFrZSBpbmRpY2VzIGZvciBwcm9jZXNzaW5nICAgKi8KLSAgICAgIC8qIGludGVybmFsIHRvIEdTVUIgb3IgR1BPUywgd2hpY2ggaXMgZnVsbHkgdmFsaWQgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGlkeCA+PSAoaGJfY29kZXBvaW50X3QpZ2xvYmFscy0+Z2x5cGhfY291bnQgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBnc3R5bGVzW2lkeF0gPT0gQUZfU1RZTEVfVU5BU1NJR05FRCApCi0gICAgICAgIGdzdHlsZXNbaWR4XSA9IChGVF9VU2hvcnQpc3R5bGVfY2xhc3MtPnN0eWxlOwotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICBlbHNlCi0gICAgICAgIEZUX1RSQUNFNCgoICIqIiApKTsKLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgaWYgKCAhY291bnQgKQotICAgICAgRlRfVFJBQ0U0KCggIlxuIgotICAgICAgICAgICAgICAgICAgIiAgICAobm9uZSkiICkpOwotICAgIEZUX1RSQUNFNCgoICJcblxuIiApKTsKLSNlbmRpZgotCi0gIEV4aXQ6Ci0gICAgaGJfc2V0X2Rlc3Ryb3koIGdzdWJfbG9va3VwcyApOwotICAgIGhiX3NldF9kZXN0cm95KCBnc3ViX2dseXBocyAgKTsKLSAgICBoYl9zZXRfZGVzdHJveSggZ3Bvc19sb29rdXBzICk7Ci0gICAgaGJfc2V0X2Rlc3Ryb3koIGdwb3NfZ2x5cGhzICApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogY29uc3RydWN0IEhhcmZCdXp6IGZlYXR1cmVzICovCi0jdW5kZWYgIENPVkVSQUdFCi0jZGVmaW5lIENPVkVSQUdFKCBuYW1lLCBOQU1FLCBkZXNjcmlwdGlvbiwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgdGFnMSwgdGFnMiwgdGFnMywgdGFnNCApICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzdGF0aWMgY29uc3QgaGJfZmVhdHVyZV90ICBuYW1lICMjIF9mZWF0dXJlW10gPSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgSEJfVEFHKCB0YWcxLCB0YWcyLCB0YWczLCB0YWc0ICksICAgICAgICAgICBcCi0gICAgICAgICAgICAgIDEsIDAsICh1bnNpZ25lZCBpbnQpLTEgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9OwotCi0KLSNpbmNsdWRlICJhZmNvdmVyLmgiCi0KLQotICAvKiBkZWZpbmUgbWFwcGluZyBiZXR3ZWVuIEhhcmZCdXp6IGZlYXR1cmVzIGFuZCBBRl9Db3ZlcmFnZSAqLwotI3VuZGVmICBDT1ZFUkFHRQotI2RlZmluZSBDT1ZFUkFHRSggbmFtZSwgTkFNRSwgZGVzY3JpcHRpb24sIFwKLSAgICAgICAgICAgICAgICAgIHRhZzEsIHRhZzIsIHRhZzMsIHRhZzQgKSBcCi0gICAgICAgICAgbmFtZSAjIyBfZmVhdHVyZSwKLQotCi0gIHN0YXRpYyBjb25zdCBoYl9mZWF0dXJlX3QqICBmZWF0dXJlc1tdID0KLSAgewotI2luY2x1ZGUgImFmY292ZXIuaCIKLQotICAgIE5VTEwgLyogQUZfQ09WRVJBR0VfREVGQVVMVCAqLwotICB9OwotCi0KLSAgdm9pZCoKLSAgYWZfc2hhcGVyX2J1Zl9jcmVhdGUoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBmYWNlICk7Ci0KLSAgICByZXR1cm4gKHZvaWQqKWhiX2J1ZmZlcl9jcmVhdGUoKTsKLSAgfQotCi0KLSAgdm9pZAotICBhZl9zaGFwZXJfYnVmX2Rlc3Ryb3koIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgYnVmICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotCi0gICAgaGJfYnVmZmVyX2Rlc3Ryb3koIChoYl9idWZmZXJfdCopYnVmICk7Ci0gIH0KLQotCi0gIGNvbnN0IGNoYXIqCi0gIGFmX3NoYXBlcl9nZXRfY2x1c3RlciggY29uc3QgY2hhciogICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1N0eWxlTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgIGJ1Zl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiAgICBjb3VudCApCi0gIHsKLSAgICBBRl9TdHlsZUNsYXNzICAgICAgICBzdHlsZV9jbGFzczsKLSAgICBjb25zdCBoYl9mZWF0dXJlX3QqICBmZWF0dXJlOwotICAgIEZUX0ludCAgICAgICAgICAgICAgIHVwZW07Ci0gICAgY29uc3QgY2hhciogICAgICAgICAgcTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBsZW47Ci0KLSAgICBoYl9idWZmZXJfdCogICAgYnVmID0gKGhiX2J1ZmZlcl90KilidWZfOwotICAgIGhiX2ZvbnRfdCogICAgICBmb250OwotICAgIGhiX2NvZGVwb2ludF90ICBkdW1teTsKLQotCi0gICAgdXBlbSAgICAgICAgPSAoRlRfSW50KW1ldHJpY3MtPmdsb2JhbHMtPmZhY2UtPnVuaXRzX3Blcl9FTTsKLSAgICBzdHlsZV9jbGFzcyA9IG1ldHJpY3MtPnN0eWxlX2NsYXNzOwotICAgIGZlYXR1cmUgICAgID0gZmVhdHVyZXNbc3R5bGVfY2xhc3MtPmNvdmVyYWdlXTsKLQotICAgIGZvbnQgPSBtZXRyaWNzLT5nbG9iYWxzLT5oYl9mb250OwotCi0gICAgLyogd2Ugc2hhcGUgYXQgYSBzaXplIG9mIHVuaXRzIHBlciBFTTsgdGhpcyBtZWFucyBmb250IHVuaXRzICovCi0gICAgaGJfZm9udF9zZXRfc2NhbGUoIGZvbnQsIHVwZW0sIHVwZW0gKTsKLQotICAgIHdoaWxlICggKnAgPT0gJyAnICkKLSAgICAgIHArKzsKLQotICAgIC8qIGNvdW50IGJ5dGVzIHVwIHRvIG5leHQgc3BhY2UgKG9yIGVuZCBvZiBidWZmZXIpICovCi0gICAgcSA9IHA7Ci0gICAgd2hpbGUgKCAhKCAqcSA9PSAnICcgfHwgKnEgPT0gJ1wwJyApICkKLSAgICAgIEdFVF9VVEY4X0NIQVIoIGR1bW15LCBxICk7Ci0gICAgbGVuID0gKGludCkoIHEgLSBwICk7Ci0KLSAgICAvKiBmZWVkIGNoYXJhY3RlcihzKSB0byB0aGUgSGFyZkJ1enogYnVmZmVyICovCi0gICAgaGJfYnVmZmVyX2NsZWFyX2NvbnRlbnRzKCBidWYgKTsKLSAgICBoYl9idWZmZXJfYWRkX3V0ZjgoIGJ1ZiwgcCwgbGVuLCAwLCBsZW4gKTsKLQotICAgIC8qIHdlIGxldCBIYXJmQnV6eiBndWVzcyB0aGUgc2NyaXB0IGFuZCB3cml0aW5nIGRpcmVjdGlvbiAqLwotICAgIGhiX2J1ZmZlcl9ndWVzc19zZWdtZW50X3Byb3BlcnRpZXMoIGJ1ZiApOwotCi0gICAgLyogc2hhcGUgYnVmZmVyLCB3aGljaCBtZWFucyBjb252ZXJzaW9uIGZyb20gY2hhcmFjdGVyIGNvZGVzIHRvICovCi0gICAgLyogZ2x5cGggaW5kaWNlcywgcG9zc2libHkgYXBwbHlpbmcgYSBmZWF0dXJlICAgICAgICAgICAgICAgICAgICovCi0gICAgaGJfc2hhcGUoIGZvbnQsIGJ1ZiwgZmVhdHVyZSwgZmVhdHVyZSA/IDEgOiAwICk7Ci0KLSAgICBpZiAoIGZlYXR1cmUgKQotICAgIHsKLSAgICAgIGhiX2J1ZmZlcl90KiAgaGJfYnVmID0gbWV0cmljcy0+Z2xvYmFscy0+aGJfYnVmOwotCi0gICAgICB1bnNpZ25lZCBpbnQgICAgICBnY291bnQ7Ci0gICAgICBoYl9nbHlwaF9pbmZvX3QqICBnaW5mbzsKLQotICAgICAgdW5zaWduZWQgaW50ICAgICAgaGJfZ2NvdW50OwotICAgICAgaGJfZ2x5cGhfaW5mb190KiAgaGJfZ2luZm87Ci0KLQotICAgICAgLyogd2UgaGF2ZSB0byBjaGVjayB3aGV0aGVyIGFwcGx5aW5nIGEgZmVhdHVyZSBkb2VzIGFjdHVhbGx5IGNoYW5nZSAqLwotICAgICAgLyogZ2x5cGggaW5kaWNlczsgb3RoZXJ3aXNlIHRoZSBhZmZlY3RlZCBnbHlwaCBvciBnbHlwaHMgYXJlbid0ICAgICAqLwotICAgICAgLyogYXZhaWxhYmxlIGF0IGFsbCBpbiB0aGUgZmVhdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBoYl9idWZmZXJfY2xlYXJfY29udGVudHMoIGhiX2J1ZiApOwotICAgICAgaGJfYnVmZmVyX2FkZF91dGY4KCBoYl9idWYsIHAsIGxlbiwgMCwgbGVuICk7Ci0gICAgICBoYl9idWZmZXJfZ3Vlc3Nfc2VnbWVudF9wcm9wZXJ0aWVzKCBoYl9idWYgKTsKLSAgICAgIGhiX3NoYXBlKCBmb250LCBoYl9idWYsIE5VTEwsIDAgKTsKLQotICAgICAgZ2luZm8gICAgPSBoYl9idWZmZXJfZ2V0X2dseXBoX2luZm9zKCBidWYsICZnY291bnQgKTsKLSAgICAgIGhiX2dpbmZvID0gaGJfYnVmZmVyX2dldF9nbHlwaF9pbmZvcyggaGJfYnVmLCAmaGJfZ2NvdW50ICk7Ci0KLSAgICAgIGlmICggZ2NvdW50ID09IGhiX2djb3VudCApCi0gICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgaTsKLQotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnY291bnQ7IGkrKyApCi0gICAgICAgICAgaWYgKCBnaW5mb1tpXS5jb2RlcG9pbnQgIT0gaGJfZ2luZm9baV0uY29kZXBvaW50ICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggaSA9PSBnY291bnQgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogYm90aCBidWZmZXJzIGhhdmUgaWRlbnRpY2FsIGdseXBoIGluZGljZXMgKi8KLSAgICAgICAgICBoYl9idWZmZXJfY2xlYXJfY29udGVudHMoIGJ1ZiApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgKmNvdW50ID0gaGJfYnVmZmVyX2dldF9sZW5ndGgoIGJ1ZiApOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBpZiAoIGZlYXR1cmUgJiYgKmNvdW50ID4gMSApCi0gICAgICBGVF9UUkFDRTEoKCAiYWZfc2hhcGVyX2dldF9jbHVzdGVyOiIKLSAgICAgICAgICAgICAgICAgICIgaW5wdXQgY2hhcmFjdGVyIG1hcHBlZCB0byBtdWx0aXBsZSBnbHlwaHNcbiIgKSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBxOwotICB9Ci0KLQotICBGVF9VTG9uZwotICBhZl9zaGFwZXJfZ2V0X2VsZW0oIEFGX1N0eWxlTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgIGJ1Zl8sCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgICBhZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICAgeV9vZmZzZXQgKQotICB7Ci0gICAgaGJfYnVmZmVyX3QqICAgICAgICAgIGJ1ZiA9IChoYl9idWZmZXJfdCopYnVmXzsKLSAgICBoYl9nbHlwaF9pbmZvX3QqICAgICAgZ2luZm87Ci0gICAgaGJfZ2x5cGhfcG9zaXRpb25fdCogIGdwb3M7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgIGdjb3VudDsKLQotICAgIEZUX1VOVVNFRCggbWV0cmljcyApOwotCi0KLSAgICBnaW5mbyA9IGhiX2J1ZmZlcl9nZXRfZ2x5cGhfaW5mb3MoIGJ1ZiwgJmdjb3VudCApOwotICAgIGdwb3MgID0gaGJfYnVmZmVyX2dldF9nbHlwaF9wb3NpdGlvbnMoIGJ1ZiwgJmdjb3VudCApOwotCi0gICAgaWYgKCBpZHggPj0gZ2NvdW50ICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCBhZHZhbmNlICkKLSAgICAgICphZHZhbmNlID0gZ3Bvc1tpZHhdLnhfYWR2YW5jZTsKLSAgICBpZiAoIHlfb2Zmc2V0ICkKLSAgICAgICp5X29mZnNldCA9IGdwb3NbaWR4XS55X29mZnNldDsKLQotICAgIHJldHVybiBnaW5mb1tpZHhdLmNvZGVwb2ludDsKLSAgfQotCi0KLSNlbHNlIC8qICFGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWiAqLwotCi0KLSAgRlRfRXJyb3IKLSAgYWZfc2hhcGVyX2dldF9jb3ZlcmFnZSggQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1N0eWxlQ2xhc3MgICBzdHlsZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgIGdzdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZWZhdWx0X3NjcmlwdCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGdsb2JhbHMgKTsKLSAgICBGVF9VTlVTRUQoIHN0eWxlX2NsYXNzICk7Ci0gICAgRlRfVU5VU0VEKCBnc3R5bGVzICk7Ci0gICAgRlRfVU5VU0VEKCBkZWZhdWx0X3NjcmlwdCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgdm9pZCoKLSAgYWZfc2hhcGVyX2J1Zl9jcmVhdGUoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZhY2UtPm1lbW9yeTsKLSAgICBGVF9VTG9uZyogIGJ1ZjsKLQotCi0gICAgRlRfTUVNX0FMTE9DKCBidWYsIHNpemVvZiAoIEZUX1VMb25nICkgKTsKLQotICAgIHJldHVybiAodm9pZCopYnVmOwotICB9Ci0KLQotICB2b2lkCi0gIGFmX3NoYXBlcl9idWZfZGVzdHJveSggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICBidWYgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIGJ1ZiApOwotICB9Ci0KLQotICBjb25zdCBjaGFyKgotICBhZl9zaGFwZXJfZ2V0X2NsdXN0ZXIoIGNvbnN0IGNoYXIqICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TdHlsZU1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICBidWZfLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogICAgY291bnQgKQotICB7Ci0gICAgRlRfRmFjZSAgICBmYWNlICAgICAgPSBtZXRyaWNzLT5nbG9iYWxzLT5mYWNlOwotICAgIEZUX1VMb25nICAgY2gsIGR1bW15ID0gMDsKLSAgICBGVF9VTG9uZyogIGJ1ZiAgICAgICA9IChGVF9VTG9uZyopYnVmXzsKLQotCi0gICAgd2hpbGUgKCAqcCA9PSAnICcgKQotICAgICAgcCsrOwotCi0gICAgR0VUX1VURjhfQ0hBUiggY2gsIHAgKTsKLQotICAgIC8qIHNpbmNlIHdlIGRvbid0IGhhdmUgYW4gZW5naW5lIHRvIGhhbmRsZSBjbHVzdGVycywgKi8KLSAgICAvKiB3ZSBzY2FuIHRoZSBjaGFyYWN0ZXJzIGJ1dCByZXR1cm4gemVybyAgICAgICAgICAgICovCi0gICAgd2hpbGUgKCAhKCAqcCA9PSAnICcgfHwgKnAgPT0gJ1wwJyApICkKLSAgICAgIEdFVF9VVEY4X0NIQVIoIGR1bW15LCBwICk7Ci0KLSAgICBpZiAoIGR1bW15ICkKLSAgICB7Ci0gICAgICAqYnVmICAgPSAwOwotICAgICAgKmNvdW50ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICpidWYgICA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCBjaCApOwotICAgICAgKmNvdW50ID0gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcDsKLSAgfQotCi0KLSAgRlRfVUxvbmcKLSAgYWZfc2hhcGVyX2dldF9lbGVtKCBBRl9TdHlsZU1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICBidWZfLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICAgYWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgIHlfb2Zmc2V0ICkKLSAgewotICAgIEZUX0ZhY2UgICBmYWNlICAgICAgICA9IG1ldHJpY3MtPmdsb2JhbHMtPmZhY2U7Ci0gICAgRlRfVUxvbmcgIGdseXBoX2luZGV4ID0gKihGVF9VTG9uZyopYnVmXzsKLQotICAgIEZUX1VOVVNFRCggaWR4ICk7Ci0KLQotICAgIGlmICggYWR2YW5jZSApCi0gICAgICBGVF9HZXRfQWR2YW5jZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xPQURfTk9fSElOVElORyAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNLAotICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgKTsKLQotICAgIGlmICggeV9vZmZzZXQgKQotICAgICAgKnlfb2Zmc2V0ID0gMDsKLQotICAgIHJldHVybiBnbHlwaF9pbmRleDsKLSAgfQotCi0KLSNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlogKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2Fmc2hhcGVyLmggYi9zcmMvYXV0b2ZpdC9hZnNoYXBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTg1ZDE5Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2Fmc2hhcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnNoYXBlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGFyZkJ1enogaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgT3BlblR5cGUgZmVhdHVyZXMgKHNwZWNpZmljYXRpb24pLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZTSEFQRVJfSF8KLSNkZWZpbmUgQUZTSEFQRVJfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWloKLQotI2luY2x1ZGUgPGhiLmg+Ci0jaW5jbHVkZSA8aGItb3QuaD4KLSNpbmNsdWRlIDxoYi1mdC5oPgotCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICBGVF9FcnJvcgotICBhZl9zaGFwZXJfZ2V0X2NvdmVyYWdlKCBBRl9GYWNlR2xvYmFscyAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU3R5bGVDbGFzcyAgIHN0eWxlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICAgZ3N0eWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGRlZmF1bHRfc2NyaXB0ICk7Ci0KLQotICB2b2lkKgotICBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggRlRfRmFjZSAgZmFjZSApOwotCi0gIHZvaWQKLSAgYWZfc2hhcGVyX2J1Zl9kZXN0cm95KCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgIGJ1ZiApOwotCi0gIGNvbnN0IGNoYXIqCi0gIGFmX3NoYXBlcl9nZXRfY2x1c3RlciggY29uc3QgY2hhciogICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1N0eWxlTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgIGJ1Zl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiAgICBjb3VudCApOwotCi0gIEZUX1VMb25nCi0gIGFmX3NoYXBlcl9nZXRfZWxlbSggQUZfU3R5bGVNZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgYnVmXywKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgIHhfYWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgIHlfb2Zmc2V0ICk7Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBBRlNIQVBFUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZzdHlsZXMuaCBiL3NyYy9hdXRvZml0L2Fmc3R5bGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MTU1OWUuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZzdHlsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnN0eWxlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgc3R5bGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogVGhlIGZvbGxvd2luZyBwYXJ0IGNhbiBiZSBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcy4gKi8KLSAgLyogRGVmaW5lIGBTVFlMRScgYXMgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIC8qIEFkZCBuZXcgc3R5bGVzIGhlcmUuICBUaGUgZmlyc3QgYW5kIHNlY29uZCBhcmd1bWVudHMgYXJlIHRoZSAgKi8KLSAgLyogc3R5bGUgbmFtZSBpbiBsb3dlcmNhc2UgYW5kIHVwcGVyY2FzZSwgcmVzcGVjdGl2ZWx5LCBmb2xsb3dlZCAqLwotICAvKiBieSBhIGRlc2NyaXB0aW9uIHN0cmluZy4gIFRoZSBuZXh0IGFyZ3VtZW50cyBhcmUgdGhlICAgICAgICAgICovCi0gIC8qIGNvcnJlc3BvbmRpbmcgd3JpdGluZyBzeXN0ZW0sIHNjcmlwdCwgYmx1ZSBzdHJpbmdzZXQsIGFuZCAgICAgKi8KLSAgLyogY292ZXJhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBzdHlsZXMgdXNpbmcgYEFGX0NPVkVSQUdFX0RFRkFVTFQnIHNob3VsZCBhbHdheXMgICAgKi8KLSAgLyogY29tZSBhZnRlciBzdHlsZXMgd2l0aCBvdGhlciBjb3ZlcmFnZXMuICBBbHNvIG5vdGUgdGhhdCAgICAgICAqLwotICAvKiBmYWxsYmFjayBzY3JpcHRzIG9ubHkgdXNlIGBBRl9DT1ZFUkFHRV9ERUZBVUxUJyBmb3IgaXRzICAgICAgICovCi0gIC8qIHN0eWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBTVFlMRSggY3lybF9kZmx0LCBDWVJMX0RGTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAiQ3lyaWxsaWMgZGVmYXVsdCBzdHlsZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQUZfU0NSSVBUX0NZUkwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9DWVJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI3VuZGVmICBTVFlMRV9MQVRJTgotI2RlZmluZSBTVFlMRV9MQVRJTiggcywgUywgZiwgRiwgZHMsIGRmLCBDICkgXAotICAgICAgICAgIFNUWUxFKCBzICMjIF8gIyMgZiwgUyAjIyBfICMjIEYsICAgXAotICAgICAgICAgICAgICAgICBkcyAiICIgZGYgIiBzdHlsZSIsICAgICAgICAgXAotICAgICAgICAgICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwgICAgXAotICAgICAgICAgICAgICAgICBBRl9TQ1JJUFRfICMjIFMsICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF8gIyMgUywgICAgXAotICAgICAgICAgICAgICAgICBBRl9DT1ZFUkFHRV8gIyMgQyApCi0KLSN1bmRlZiAgTUVUQV9TVFlMRV9MQVRJTgotI2RlZmluZSBNRVRBX1NUWUxFX0xBVElOKCBzLCBTLCBkcyApICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFNUWUxFX0xBVElOKCBzLCBTLCBjMmNwLCBDMkNQLCBkcywgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAicGV0aXRlIGNhcGl0YWxzIGZyb20gY2FwaXRhbHMiLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIFBFVElURV9DQVBJVEFMU19GUk9NX0NBUElUQUxTICkgICBcCi0gICAgICAgICAgU1RZTEVfTEFUSU4oIHMsIFMsIGMyc2MsIEMyU0MsIGRzLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICJzbWFsbCBjYXBpdGFscyBmcm9tIGNhcGl0YWxzIiwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgU01BTExfQ0FQSVRBTFNfRlJPTV9DQVBJVEFMUyApICAgIFwKLSAgICAgICAgICBTVFlMRV9MQVRJTiggcywgUywgb3JkbiwgT1JETiwgZHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIm9yZGluYWxzIiwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgT1JESU5BTFMgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBTVFlMRV9MQVRJTiggcywgUywgcGNhcCwgUENBUCwgZHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgInBldGl0ZSBjYXBpdGFscyIsICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgUEVUSVRFX0NBUElUQUxTICkgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBTVFlMRV9MQVRJTiggcywgUywgc2luZiwgU0lORiwgZHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgInNjaWVudGlmaWMgaW5mZXJpb3JzIiwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgU0NJRU5USUZJQ19JTkZFUklPUlMgKSAgICAgICAgICAgIFwKLSAgICAgICAgICBTVFlMRV9MQVRJTiggcywgUywgc21jcCwgU01DUCwgZHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgInNtYWxsIGNhcGl0YWxzIiwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgU01BTExfQ0FQSVRBTFMgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBTVFlMRV9MQVRJTiggcywgUywgc3VicywgU1VCUywgZHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgInN1YnNjcmlwdCIsICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgU1VCU0NSSVBUICkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBTVFlMRV9MQVRJTiggcywgUywgc3VwcywgU1VQUywgZHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgInN1cGVyc2NyaXB0IiwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgU1VQRVJTQ1JJUFQgKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBTVFlMRV9MQVRJTiggcywgUywgdGl0bCwgVElUTCwgZHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgInRpdGxpbmciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgVElUTElORyApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBTVFlMRV9MQVRJTiggcywgUywgZGZsdCwgREZMVCwgZHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVCApCi0KLQotICBTVFlMRSggYWRsbV9kZmx0LCBBRExNX0RGTFQsCi0gICAgICAgICAiQWRsYW0gZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9BRExNLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfQURMTSwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBhcmFiX2RmbHQsIEFSQUJfREZMVCwKLSAgICAgICAgICJBcmFiaWMgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9BUkFCLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfQVJBQiwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBhcm1uX2RmbHQsIEFSTU5fREZMVCwKLSAgICAgICAgICJBcm1lbmlhbiBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0FSTU4sCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9BUk1OLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGF2c3RfZGZsdCwgQVZTVF9ERkxULAotICAgICAgICAgIkF2ZXN0YW4gZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9BVlNULAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfQVZTVCwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBiYW11X2RmbHQsIEJBTVVfREZMVCwKLSAgICAgICAgICJCYW11bSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0JBTVUsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9CQU1VLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGJlbmdfZGZsdCwgQkVOR19ERkxULAotICAgICAgICAgIkJlbmdhbGkgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9CRU5HLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfQkVORywKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBidWhkX2RmbHQsIEJVSERfREZMVCwKLSAgICAgICAgICJCdWhpZCBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0JVSEQsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9CVUhELAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGNha21fZGZsdCwgQ0FLTV9ERkxULAotICAgICAgICAgIkNoYWttYSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0NBS00sCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9DQUtNLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGNhbnNfZGZsdCwgQ0FOU19ERkxULAotICAgICAgICAgIkNhbmFkaWFuIFN5bGxhYmljcyBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0NBTlMsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9DQU5TLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGNhcmlfZGZsdCwgQ0FSSV9ERkxULAotICAgICAgICAgIkNhcmlhbiBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0NBUkksCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9DQVJJLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGNoZXJfZGZsdCwgQ0hFUl9ERkxULAotICAgICAgICAgIkNoZXJva2VlIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfQ0hFUiwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX0NIRVIsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggY29wdF9kZmx0LCBDT1BUX0RGTFQsCi0gICAgICAgICAiQ29wdGljIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfQ09QVCwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX0NPUFQsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggY3BydF9kZmx0LCBDUFJUX0RGTFQsCi0gICAgICAgICAiQ3lwcmlvdCBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0NQUlQsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9DUFJULAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgTUVUQV9TVFlMRV9MQVRJTiggY3lybCwgQ1lSTCwgIkN5cmlsbGljIiApCi0KLSAgU1RZTEUoIGRldmFfZGZsdCwgREVWQV9ERkxULAotICAgICAgICAgIkRldmFuYWdhcmkgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9ERVZBLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfREVWQSwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBkc3J0X2RmbHQsIERTUlRfREZMVCwKLSAgICAgICAgICJEZXNlcmV0IGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfRFNSVCwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX0RTUlQsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggZXRoaV9kZmx0LCBFVEhJX0RGTFQsCi0gICAgICAgICAiRXRoaW9waWMgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9FVEhJLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfRVRISSwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBnZW9yX2RmbHQsIEdFT1JfREZMVCwKLSAgICAgICAgICJHZW9yZ2lhbiAoTWtoZWRydWxpKSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0dFT1IsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9HRU9SLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGdlb2tfZGZsdCwgR0VPS19ERkxULAotICAgICAgICAgIkdlb3JnaWFuIChLaHV0c3VyaSkgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9HRU9LLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfR0VPSywKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBnbGFnX2RmbHQsIEdMQUdfREZMVCwKLSAgICAgICAgICJHbGFnb2xpdGljIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfR0xBRywKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX0dMQUcsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggZ290aF9kZmx0LCBHT1RIX0RGTFQsCi0gICAgICAgICAiR290aGljIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfR09USCwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX0dPVEgsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBNRVRBX1NUWUxFX0xBVElOKCBncmVrLCBHUkVLLCAiR3JlZWsiICkKLQotICBTVFlMRSggZ3Vqcl9kZmx0LCBHVUpSX0RGTFQsCi0gICAgICAgICAiR3VqYXJhdGkgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9HVUpSLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfR1VKUiwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBndXJ1X2RmbHQsIEdVUlVfREZMVCwKLSAgICAgICAgICJHdXJtdWtoaSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0dVUlUsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9HVVJVLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGhlYnJfZGZsdCwgSEVCUl9ERkxULAotICAgICAgICAgIkhlYnJldyBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0hFQlIsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9IRUJSLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGthbGlfZGZsdCwgS0FMSV9ERkxULAotICAgICAgICAgIktheWFoIExpIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfS0FMSSwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX0tBTEksCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSgga2htcl9kZmx0LCBLSE1SX0RGTFQsCi0gICAgICAgICAiS2htZXIgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9LSE1SLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfS0hNUiwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBraG1zX2RmbHQsIEtITVNfREZMVCwKLSAgICAgICAgICJLaG1lciBTeW1ib2xzIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfS0hNUywKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX0tITVMsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSgga25kYV9kZmx0LCBLTkRBX0RGTFQsCi0gICAgICAgICAiS2FubmFkYSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0tOREEsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9LTkRBLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIGxhb19kZmx0LCBMQU9fREZMVCwKLSAgICAgICAgICJMYW8gZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9MQU8sCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9MQU8sCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBNRVRBX1NUWUxFX0xBVElOKCBsYXRuLCBMQVROLCAiTGF0aW4iICkKLQotICBTVFlMRSggbGF0Yl9kZmx0LCBMQVRCX0RGTFQsCi0gICAgICAgICAiTGF0aW4gc3Vic2NyaXB0IGZhbGxiYWNrIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfTEFUQiwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX0xBVEIsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggbGF0cF9kZmx0LCBMQVRQX0RGTFQsCi0gICAgICAgICAiTGF0aW4gc3VwZXJzY3JpcHQgZmFsbGJhY2sgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9MQVRQLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfTEFUUCwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0jaWZkZWYgRlRfT1BUSU9OX0FVVE9GSVQyCi0gIFNUWUxFKCBsdG4yX2RmbHQsIExUTjJfREZMVCwKLSAgICAgICAgICJMYXRpbiAyIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4yLAotICAgICAgICAgQUZfU0NSSVBUX0xBVE4sCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9MQVROLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0jZW5kaWYKLQotICBTVFlMRSggbGlzdV9kZmx0LCBMSVNVX0RGTFQsCi0gICAgICAgICAiTGlzdSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX0xJU1UsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9MSVNVLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIG1seW1fZGZsdCwgTUxZTV9ERkxULAotICAgICAgICAgIk1hbGF5YWxhbSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX01MWU0sCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9NTFlNLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIG15bXJfZGZsdCwgTVlNUl9ERkxULAotICAgICAgICAgIk15YW5tYXIgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9NWU1SLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfTVlNUiwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBua29vX2RmbHQsIE5LT09fREZMVCwKLSAgICAgICAgICJOJ0tvIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfTktPTywKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX05LT08sCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggbm9uZV9kZmx0LCBOT05FX0RGTFQsCi0gICAgICAgICAibm8gc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fRFVNTVksCi0gICAgICAgICBBRl9TQ1JJUFRfTk9ORSwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX05PTkUsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggb2xja19kZmx0LCBPTENLX0RGTFQsCi0gICAgICAgICAiT2wgQ2hpa2kgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9PTENLLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfT0xDSywKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBvcmtoX2RmbHQsIE9SS0hfREZMVCwKLSAgICAgICAgICJPbGQgVHVya2ljIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfT1JLSCwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX09SS0gsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggb3NnZV9kZmx0LCBPU0dFX0RGTFQsCi0gICAgICAgICAiT3NhZ2UgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9PU0dFLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfT1NHRSwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBvc21hX2RmbHQsIE9TTUFfREZMVCwKLSAgICAgICAgICJPc21hbnlhIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfT1NNQSwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX09TTUEsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggc2F1cl9kZmx0LCBTQVVSX0RGTFQsCi0gICAgICAgICAiU2F1cmFzaHRyYSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX1NBVVIsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9TQVVSLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIHNoYXdfZGZsdCwgU0hBV19ERkxULAotICAgICAgICAgIlNoYXZpYW4gZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9TSEFXLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfU0hBVywKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCBzaW5oX2RmbHQsIFNJTkhfREZMVCwKLSAgICAgICAgICJTaW5oYWxhIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfU0lOSCwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX1NJTkgsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggc3VuZF9kZmx0LCBTVU5EX0RGTFQsCi0gICAgICAgICAiU3VuZGFuZXNlIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfU1VORCwKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX1NVTkQsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggdGFtbF9kZmx0LCBUQU1MX0RGTFQsCi0gICAgICAgICAiVGFtaWwgZGVmYXVsdCBzdHlsZSIsCi0gICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKLSAgICAgICAgIEFGX1NDUklQVF9UQU1MLAotICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfVEFNTCwKLSAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFKCB0YXZ0X2RmbHQsIFRBVlRfREZMVCwKLSAgICAgICAgICJUYWkgVmlldCBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX1RBVlQsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9UQVZULAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIHRlbHVfZGZsdCwgVEVMVV9ERkxULAotICAgICAgICAgIlRlbHVndSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX1RFTFUsCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9URUxVLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIHRmbmdfZGZsdCwgVEZOR19ERkxULAotICAgICAgICAgIlRpZmluYWdoIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCi0gICAgICAgICBBRl9TQ1JJUFRfVEZORywKLSAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX1RGTkcsCi0gICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKLQotICBTVFlMRSggdGhhaV9kZmx0LCBUSEFJX0RGTFQsCi0gICAgICAgICAiVGhhaSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX1RIQUksCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9USEFJLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSAgU1RZTEUoIHZhaWlfZGZsdCwgVkFJSV9ERkxULAotICAgICAgICAgIlZhaSBkZWZhdWx0IHN0eWxlIiwKLSAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAotICAgICAgICAgQUZfU0NSSVBUX1ZBSUksCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9WQUlJLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0lORElDCi0KLSAgLyogbm8gYmx1ZSBzdHJpbmdzZXQgc3VwcG9ydCBmb3IgdGhlIEluZGljIHdyaXRpbmcgc3lzdGVtIHlldCAqLwotI3VuZGVmICBTVFlMRV9ERUZBVUxUX0lORElDCi0jZGVmaW5lIFNUWUxFX0RFRkFVTFRfSU5ESUMoIHMsIFMsIGQgKSAgICBcCi0gICAgICAgICAgU1RZTEUoIHMgIyMgX2RmbHQsIFMgIyMgX0RGTFQsICBcCi0gICAgICAgICAgICAgICAgIGQgIiBkZWZhdWx0IHN0eWxlIiwgICAgICBcCi0gICAgICAgICAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0lORElDLCBcCi0gICAgICAgICAgICAgICAgIEFGX1NDUklQVF8gIyMgUywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgIChBRl9CbHVlX1N0cmluZ3NldCkwLCAgICBcCi0gICAgICAgICAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQotCi0gIFNUWUxFX0RFRkFVTFRfSU5ESUMoIGxpbWIsIExJTUIsICJMaW1idSIgKQotICBTVFlMRV9ERUZBVUxUX0lORElDKCBvcnlhLCBPUllBLCAiT3JpeWEiICkKLSAgU1RZTEVfREVGQVVMVF9JTkRJQyggc3lsbywgU1lMTywgIlN5bG90aSBOYWdyaSIgKQotICBTVFlMRV9ERUZBVUxUX0lORElDKCB0aWJ0LCBUSUJULCAiVGliZXRhbiIgKQotCi0jZW5kaWYgLyogQUZfQ09ORklHX09QVElPTl9JTkRJQyAqLwotCi0jaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSksKLQotICBTVFlMRSggaGFuaV9kZmx0LCBIQU5JX0RGTFQsCi0gICAgICAgICAiQ0pLViBpZGVvZ3JhcGhzIGRlZmF1bHQgc3R5bGUiLAotICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fQ0pLLAotICAgICAgICAgQUZfU0NSSVBUX0hBTkksCi0gICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9IQU5JLAotICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCi0KLSNlbmRpZiAvKiBBRl9DT05GSUdfT1BUSU9OX0NKSyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZ0eXBlcy5oIGIvc3JjL2F1dG9maXQvYWZ0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MThkYWI3Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgdHlwZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogIFRoZSBhdXRvLWZpdHRlciBpcyBhIGNvbXBsZXRlIHJld3JpdGUgb2YgdGhlIG9sZCBhdXRvLWhpbnRlci4KLSAgICogIEl0cyBtYWluIGZlYXR1cmUgaXMgdGhlIGFiaWxpdHkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGRpZmZlcmVudAotICAgKiAgd3JpdGluZyBzeXN0ZW1zIGFuZCBzY3JpcHRzIGluIG9yZGVyIHRvIGFwcGx5IHNwZWNpZmljIHJ1bGVzLgotICAgKgotICAgKiAgVGhlIGNvZGUgaGFzIGFsc28gYmVlbiBjb21wYXJ0bWVudGFsaXplZCBpbnRvIHNldmVyYWwgZW50aXRpZXMgdGhhdAotICAgKiAgc2hvdWxkIG1ha2UgYWxnb3JpdGhtaWMgZXhwZXJpbWVudGF0aW9uIGVhc2llciB0aGFuIHdpdGggdGhlIG9sZAotICAgKiAgY29kZS4KLSAgICoKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBBRlRZUEVTX0hfCi0jZGVmaW5lIEFGVFlQRVNfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJhZmJsdWUuaCIKLQotI2lmZGVmIEZUX0RFQlVHX0FVVE9GSVQKLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgRCBFIEIgVSBHIEcgSSBOIEcgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfQVVUT0ZJVAotCi1leHRlcm4gaW50ICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2hvcnpfaGludHM7Ci1leHRlcm4gaW50ICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHM7Ci1leHRlcm4gaW50ICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2JsdWVfaGludHM7Ci1leHRlcm4gdm9pZCogIF9hZl9kZWJ1Z19oaW50czsKLQotI2VuZGlmIC8qIEZUX0RFQlVHX0FVVE9GSVQgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgVSBUIEkgTCBJIFQgWSAgIFMgVCBVIEYgRiAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9XaWR0aFJlY18KLSAgewotICAgIEZUX1BvcyAgb3JnOyAgLyogb3JpZ2luYWwgcG9zaXRpb24vd2lkdGggaW4gZm9udCB1bml0cyAgICAgICAgICAgICAgKi8KLSAgICBGVF9Qb3MgIGN1cjsgIC8qIGN1cnJlbnQvc2NhbGVkIHBvc2l0aW9uL3dpZHRoIGluIGRldmljZSBzdWItcGl4ZWxzICovCi0gICAgRlRfUG9zICBmaXQ7ICAvKiBjdXJyZW50L2ZpdHRlZCBwb3NpdGlvbi93aWR0aCBpbiBkZXZpY2Ugc3ViLXBpeGVscyAqLwotCi0gIH0gQUZfV2lkdGhSZWMsICpBRl9XaWR0aDsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfc29ydF9wb3MoIEZUX1VJbnQgIGNvdW50LAotICAgICAgICAgICAgICAgRlRfUG9zKiAgdGFibGUgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX3NvcnRfYW5kX3F1YW50aXplX3dpZHRocyggRlRfVUludCogIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1dpZHRoICB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgIHRocmVzaG9sZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgIEEgTiBHIEwgRSAgIFQgWSBQIEUgUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoKLSAgICogIFRoZSBhdXRvLWZpdHRlciBkb2Vzbid0IG5lZWQgYSB2ZXJ5IGhpZ2ggYW5ndWxhciBhY2N1cmFjeTsKLSAgICogIHRoaXMgYWxsb3dzIHVzIHRvIHNwZWVkIHVwIHNvbWUgY29tcHV0YXRpb25zIGNvbnNpZGVyYWJseSB3aXRoIGEKLSAgICogIGxpZ2h0IENvcmRpYyBhbGdvcml0aG0gKHNlZSBhZmFuZ2xlcy5jKS4KLSAgICovCi0KLSAgdHlwZWRlZiBGVF9JbnQgIEFGX0FuZ2xlOwotCi0KLSNkZWZpbmUgQUZfQU5HTEVfUEkgICAyNTYKLSNkZWZpbmUgQUZfQU5HTEVfMlBJICAoIEFGX0FOR0xFX1BJICogMiApCi0jZGVmaW5lIEFGX0FOR0xFX1BJMiAgKCBBRl9BTkdMRV9QSSAvIDIgKQotI2RlZmluZSBBRl9BTkdMRV9QSTQgICggQUZfQU5HTEVfUEkgLyA0ICkKLQotCi0jaWYgMAotICAvKgotICAgKiAgY29tcHV0ZSB0aGUgYW5nbGUgb2YgYSBnaXZlbiAyLUQgdmVjdG9yCi0gICAqLwotICBGVF9MT0NBTCggQUZfQW5nbGUgKQotICBhZl9hbmdsZV9hdGFuKCBGVF9Qb3MgIGR4LAotICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICk7Ci0KLQotICAvKgotICAgKiAgY29tcHV0ZSBgYW5nbGUyIC0gYW5nbGUxJzsgdGhlIHJlc3VsdCBpcyBhbHdheXMgd2l0aGluCi0gICAqICB0aGUgcmFuZ2UgWy1BRl9BTkdMRV9QSSAuLiBBRl9BTkdMRV9QSSAtIDFdCi0gICAqLwotICBGVF9MT0NBTCggQUZfQW5nbGUgKQotICBhZl9hbmdsZV9kaWZmKCBBRl9BbmdsZSAgYW5nbGUxLAotICAgICAgICAgICAgICAgICBBRl9BbmdsZSAgYW5nbGUyICk7Ci0jZW5kaWYgLyogMCAqLwotCi0KLSNkZWZpbmUgQUZfQU5HTEVfRElGRiggcmVzdWx0LCBhbmdsZTEsIGFuZ2xlMiApIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBRl9BbmdsZSAgX2RlbHRhID0gKGFuZ2xlMikgLSAoYW5nbGUxKTsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoIF9kZWx0YSA8PSAtQUZfQU5HTEVfUEkgKSAgICAgICAgICAgIFwKLSAgICAgIF9kZWx0YSArPSBBRl9BTkdMRV8yUEk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoIF9kZWx0YSA+IEFGX0FOR0xFX1BJICkgICAgICAgICAgICAgIFwKLSAgICAgIF9kZWx0YSAtPSBBRl9BTkdMRV8yUEk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXN1bHQgPSBfZGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLQotICAvKiAgb3BhcXVlIGhhbmRsZSB0byBnbHlwaC1zcGVjaWZpYyBoaW50cyAtLSBzZWUgYGFmaGludHMuaCcgZm9yIG1vcmUKLSAgICogIGRldGFpbHMKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEFGX0dseXBoSGludHNSZWNfKiAgQUZfR2x5cGhIaW50czsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgUyBDIEEgTCBFIFIgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAqICBBIHNjYWxlciBtb2RlbHMgdGhlIHRhcmdldCBwaXhlbCBkZXZpY2UgdGhhdCB3aWxsIHJlY2VpdmUgdGhlCi0gICAqICBhdXRvLWhpbnRlZCBnbHlwaCBpbWFnZS4KLSAgICovCi0KLSNkZWZpbmUgQUZfU0NBTEVSX0ZMQUdfTk9fSE9SSVpPTlRBTCAgMVUgLyogZGlzYWJsZSBob3Jpem9udGFsIGhpbnRpbmcgKi8KLSNkZWZpbmUgQUZfU0NBTEVSX0ZMQUdfTk9fVkVSVElDQUwgICAgMlUgLyogZGlzYWJsZSB2ZXJ0aWNhbCBoaW50aW5nICAgKi8KLSNkZWZpbmUgQUZfU0NBTEVSX0ZMQUdfTk9fQURWQU5DRSAgICAgNFUgLyogZGlzYWJsZSBhZHZhbmNlIGhpbnRpbmcgICAgKi8KLSNkZWZpbmUgQUZfU0NBTEVSX0ZMQUdfTk9fV0FSUEVSICAgICAgOFUgLyogZGlzYWJsZSB3YXJwZXIgICAgICAgICAgICAgKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9TY2FsZXJSZWNfCi0gIHsKLSAgICBGVF9GYWNlICAgICAgICAgZmFjZTsgICAgICAgIC8qIHNvdXJjZSBmb250IGZhY2UgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0ZpeGVkICAgICAgICB4X3NjYWxlOyAgICAgLyogZnJvbSBmb250IHVuaXRzIHRvIDEvNjR0aCBkZXZpY2UgcGl4ZWxzICovCi0gICAgRlRfRml4ZWQgICAgICAgIHlfc2NhbGU7ICAgICAvKiBmcm9tIGZvbnQgdW5pdHMgdG8gMS82NHRoIGRldmljZSBwaXhlbHMgKi8KLSAgICBGVF9Qb3MgICAgICAgICAgeF9kZWx0YTsgICAgIC8qIGluIDEvNjR0aCBkZXZpY2UgcGl4ZWxzICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1BvcyAgICAgICAgICB5X2RlbHRhOyAgICAgLyogaW4gMS82NHRoIGRldmljZSBwaXhlbHMgICAgICAgICAgICAgICAgICovCi0gICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlOyAvKiBtb25vY2hyb21lLCBhbnRpLWFsaWFzZWQsIExDRCwgZXRjLiAgICAgKi8KLSAgICBGVF9VSW50MzIgICAgICAgZmxhZ3M7ICAgICAgIC8qIGFkZGl0aW9uYWwgY29udHJvbCBmbGFncywgc2VlIGFib3ZlICAgICAqLwotCi0gIH0gQUZfU2NhbGVyUmVjLCAqQUZfU2NhbGVyOwotCi0KLSNkZWZpbmUgQUZfU0NBTEVSX0VRVUFMX1NDQUxFUyggYSwgYiApICAgICAgXAotICAgICAgICAgICggKGEpLT54X3NjYWxlID09IChiKS0+eF9zY2FsZSAmJiBcCi0gICAgICAgICAgICAoYSktPnlfc2NhbGUgPT0gKGIpLT55X3NjYWxlICYmIFwKLSAgICAgICAgICAgIChhKS0+eF9kZWx0YSA9PSAoYiktPnhfZGVsdGEgJiYgXAotICAgICAgICAgICAgKGEpLT55X2RlbHRhID09IChiKS0+eV9kZWx0YSApCi0KLQotICB0eXBlZGVmIHN0cnVjdCBBRl9TdHlsZU1ldHJpY3NSZWNfKiAgQUZfU3R5bGVNZXRyaWNzOwotCi0gIC8qICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhbiBGVF9GYWNlIHRvIGNvbXB1dGUgZ2xvYmFsIG1ldHJpY3MgZm9yCi0gICAqICBhIHNwZWNpZmljIHN0eWxlLgotICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkFGX1dyaXRpbmdTeXN0ZW1fSW5pdE1ldHJpY3NGdW5jKSggQUZfU3R5bGVNZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqQUZfV3JpdGluZ1N5c3RlbV9TY2FsZU1ldHJpY3NGdW5jKSggQUZfU3R5bGVNZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgICAgc2NhbGVyICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqQUZfV3JpdGluZ1N5c3RlbV9Eb25lTWV0cmljc0Z1bmMpKCBBRl9TdHlsZU1ldHJpY3MgIG1ldHJpY3MgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpBRl9Xcml0aW5nU3lzdGVtX0dldFN0ZFdpZHRoc0Z1bmMpKCBBRl9TdHlsZU1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgICAgICBzdGRIVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgICAgIHN0ZFZXICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqQUZfV3JpdGluZ1N5c3RlbV9Jbml0SGludHNGdW5jKSggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TdHlsZU1ldHJpY3MgIG1ldHJpY3MgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqQUZfV3JpdGluZ1N5c3RlbV9BcHBseUhpbnRzRnVuYykoIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0dseXBoSGludHMgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU3R5bGVNZXRyaWNzICBtZXRyaWNzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgVyBSIEkgVCBJIE4gRyAgIFMgWSBTIFQgRSBNIFMgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiAgRm9yIHRoZSBhdXRvLWhpbnRlciwgYSB3cml0aW5nIHN5c3RlbSBjb25zaXN0cyBvZiBtdWx0aXBsZSBzY3JpcHRzIHRoYXQKLSAgICogIGNhbiBiZSBoYW5kbGVkIHNpbWlsYXJseSAqaW4gYSB0eXBvZ3JhcGhpY2FsIHdheSo7IHRoZSByZWxhdGlvbnNoaXAgaXMKLSAgICogIG5vdCBiYXNlZCBvbiBoaXN0b3J5LiAgRm9yIGV4YW1wbGUsIGJvdGggdGhlIEdyZWVrIGFuZCB0aGUgdW5yZWxhdGVkCi0gICAqICBBcm1lbmlhbiBzY3JpcHRzIHNoYXJlIHRoZSBzYW1lIGZlYXR1cmVzIGxpa2UgYXNjZW5kZXIsIGRlc2NlbmRlciwKLSAgICogIHgtaGVpZ2h0LCBldGMuICBFc3NlbnRpYWxseSwgYSB3cml0aW5nIHN5c3RlbSBpcyBjb3ZlcmVkIGJ5IGEKLSAgICogIHN1Ym1vZHVsZSBvZiB0aGUgYXV0by1maXR0ZXI7IGl0IGNvbnRhaW5zCi0gICAqCi0gICAqICAtIGEgc3BlY2lmaWMgZ2xvYmFsIGFuYWx5emVyIHRoYXQgY29tcHV0ZXMgZ2xvYmFsIG1ldHJpY3Mgc3BlY2lmaWMgdG8KLSAgICogICAgdGhlIHNjcmlwdCAoYmFzZWQgb24gc2NyaXB0LXNwZWNpZmljIGNoYXJhY3RlcnMgdG8gaWRlbnRpZnkgYXNjZW5kZXIKLSAgICogICAgaGVpZ2h0LCB4LWhlaWdodCwgZXRjLiksCi0gICAqCi0gICAqICAtIGEgc3BlY2lmaWMgZ2x5cGggYW5hbHl6ZXIgdGhhdCBjb21wdXRlcyBzZWdtZW50cyBhbmQgZWRnZXMgZm9yIGVhY2gKLSAgICogICAgZ2x5cGggY292ZXJlZCBieSB0aGUgc2NyaXB0LAotICAgKgotICAgKiAgLSBhIHNwZWNpZmljIGdyaWQtZml0dGluZyBhbGdvcml0aG0gdGhhdCBkaXN0b3J0cyB0aGUgc2NhbGVkIGdseXBoCi0gICAqICAgIG91dGxpbmUgYWNjb3JkaW5nIHRvIHRoZSByZXN1bHRzIG9mIHRoZSBnbHlwaCBhbmFseXplci4KLSAgICovCi0KLSNkZWZpbmUgQUZXUlRTWVNfSF8gIC8qIGRvbid0IGxvYWQgaGVhZGVyIGZpbGVzICovCi0jdW5kZWYgIFdSSVRJTkdfU1lTVEVNCi0jZGVmaW5lIFdSSVRJTkdfU1lTVEVNKCB3cywgV1MgKSAgICBcCi0gICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fICMjIFdTLAotCi0gIC8qIFRoZSBsaXN0IG9mIGtub3duIHdyaXRpbmcgc3lzdGVtcy4gKi8KLSAgdHlwZWRlZiBlbnVtICBBRl9Xcml0aW5nU3lzdGVtXwotICB7Ci0KLSNpbmNsdWRlICJhZndydHN5cy5oIgotCi0gICAgQUZfV1JJVElOR19TWVNURU1fTUFYICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gQUZfV3JpdGluZ1N5c3RlbTsKLQotI3VuZGVmICBBRldSVFNZU19IXwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX1dyaXRpbmdTeXN0ZW1DbGFzc1JlY18KLSAgewotICAgIEFGX1dyaXRpbmdTeXN0ZW0gIHdyaXRpbmdfc3lzdGVtOwotCi0gICAgRlRfT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZV9tZXRyaWNzX3NpemU7Ci0gICAgQUZfV3JpdGluZ1N5c3RlbV9Jbml0TWV0cmljc0Z1bmMgICBzdHlsZV9tZXRyaWNzX2luaXQ7Ci0gICAgQUZfV3JpdGluZ1N5c3RlbV9TY2FsZU1ldHJpY3NGdW5jICBzdHlsZV9tZXRyaWNzX3NjYWxlOwotICAgIEFGX1dyaXRpbmdTeXN0ZW1fRG9uZU1ldHJpY3NGdW5jICAgc3R5bGVfbWV0cmljc19kb25lOwotICAgIEFGX1dyaXRpbmdTeXN0ZW1fR2V0U3RkV2lkdGhzRnVuYyAgc3R5bGVfbWV0cmljc19nZXRzdGR3OwotCi0gICAgQUZfV3JpdGluZ1N5c3RlbV9Jbml0SGludHNGdW5jICAgICBzdHlsZV9oaW50c19pbml0OwotICAgIEFGX1dyaXRpbmdTeXN0ZW1fQXBwbHlIaW50c0Z1bmMgICAgc3R5bGVfaGludHNfYXBwbHk7Ci0KLSAgfSBBRl9Xcml0aW5nU3lzdGVtQ2xhc3NSZWM7Ci0KLSAgdHlwZWRlZiBjb25zdCBBRl9Xcml0aW5nU3lzdGVtQ2xhc3NSZWMqICBBRl9Xcml0aW5nU3lzdGVtQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBTIEMgUiBJIFAgVCBTICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiAgRWFjaCBzY3JpcHQgaXMgYXNzb2NpYXRlZCB3aXRoIHR3byBzZXRzIG9mIFVuaWNvZGUgcmFuZ2VzIHRvIHRlc3QKLSAgICogIHdoZXRoZXIgdGhlIGZvbnQgZmFjZSBzdXBwb3J0cyB0aGUgc2NyaXB0LCBhbmQgd2hpY2ggbm9uLWJhc2UKLSAgICogIGNoYXJhY3RlcnMgdGhlIHNjcmlwdCBjb250YWlucy4KLSAgICoKLSAgICogIFdlIHVzZSBmb3VyLWxldHRlciBzY3JpcHQgdGFncyBmcm9tIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLAotICAgKiAgZXh0ZW5kZWQgYnkgYE5PTkUnLCB3aGljaCBpbmRpY2F0ZXMgYG5vIHNjcmlwdCcuCi0gICAqLwotCi0jdW5kZWYgIFNDUklQVAotI2RlZmluZSBTQ1JJUFQoIHMsIFMsIGQsIGgsIEgsIHNzICkgXAotICAgICAgICAgIEFGX1NDUklQVF8gIyMgUywKLQotICAvKiBUaGUgbGlzdCBvZiBrbm93biBzY3JpcHRzLiAqLwotICB0eXBlZGVmIGVudW0gIEFGX1NjcmlwdF8KLSAgewotCi0jaW5jbHVkZSAiYWZzY3JpcHQuaCIKLQotICAgIEFGX1NDUklQVF9NQVggICAvKiBkbyBub3QgcmVtb3ZlICovCi0KLSAgfSBBRl9TY3JpcHQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfU2NyaXB0X1VuaVJhbmdlUmVjXwotICB7Ci0gICAgRlRfVUludDMyICBmaXJzdDsKLSAgICBGVF9VSW50MzIgIGxhc3Q7Ci0KLSAgfSBBRl9TY3JpcHRfVW5pUmFuZ2VSZWM7Ci0KLSNkZWZpbmUgQUZfVU5JUkFOR0VfUkVDKCBhLCBiICkgeyAoRlRfVUludDMyKShhKSwgKEZUX1VJbnQzMikoYikgfQotCi0gIHR5cGVkZWYgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjKiAgQUZfU2NyaXB0X1VuaVJhbmdlOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX1NjcmlwdENsYXNzUmVjXwotICB7Ci0gICAgQUZfU2NyaXB0ICBzY3JpcHQ7Ci0KLSAgICAvKiBsYXN0IGVsZW1lbnQgaW4gdGhlIHJhbmdlcyBtdXN0IGJlIHsgMCwgMCB9ICovCi0gICAgQUZfU2NyaXB0X1VuaVJhbmdlICBzY3JpcHRfdW5pX3JhbmdlczsKLSAgICBBRl9TY3JpcHRfVW5pUmFuZ2UgIHNjcmlwdF91bmlfbm9uYmFzZV9yYW5nZXM7Ci0KLSAgICBGVF9Cb29sICB0b3BfdG9fYm90dG9tX2hpbnRpbmc7Ci0KLSAgICBjb25zdCBjaGFyKiAgc3RhbmRhcmRfY2hhcnN0cmluZzsgICAgICAvKiBmb3IgZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0ICovCi0KLSAgfSBBRl9TY3JpcHRDbGFzc1JlYzsKLQotICB0eXBlZGVmIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjKiAgQUZfU2NyaXB0Q2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgQyBPIFYgRSBSIEEgRyBFIFMgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiAgVXN1YWxseSwgYSBmb250IGNvbnRhaW5zIG1vcmUgZ2x5cGhzIHRoYW4gY2FuIGJlIGFkZHJlc3NlZCBieSBpdHMKLSAgICogIGNoYXJhY3RlciBtYXAuCi0gICAqCi0gICAqICBJbiB0aGUgUG9zdFNjcmlwdCBmb250IHdvcmxkLCBlbmNvZGluZyB2ZWN0b3JzIHNwZWNpZmljIHRvIGEgZ2l2ZW4KLSAgICogIHRhc2sgYXJlIHVzZWQgdG8gc2VsZWN0IHN1Y2ggZ2x5cGhzLCBhbmQgdGhlc2UgZ2x5cGhzIGNhbiBiZSBvZnRlbgotICAgKiAgcmVjb2duaXplZCBieSBoYXZpbmcgYSBzdWZmaXggaW4gaXRzIGdseXBoIG5hbWVzLiAgRm9yIGV4YW1wbGUsIGEKLSAgICogIHN1cGVyc2NyaXB0IGdseXBoIGBBJyBtaWdodCBiZSBjYWxsZWQgYEEuc3VwJy4gIFVuZm9ydHVuYXRlbHksIHRoaXMKLSAgICogIG5hbWluZyBzY2hlbWUgaXMgbm90IHN0YW5kYXJkaXplZCBhbmQgdGh1cyB1bnVzYWJsZSBmb3IgdXMuCi0gICAqCi0gICAqICBJbiB0aGUgT3BlblR5cGUgd29ybGQsIGEgYmV0dGVyIHNvbHV0aW9uIHdhcyBpbnZlbnRlZCwgbmFtZWx5Ci0gICAqICBgZmVhdHVyZXMnLCB3aGljaCBjbGVhbmx5IHNlcGFyYXRlIGEgY2hhcmFjdGVyJ3MgaW5wdXQgZW5jb2RpbmcgZnJvbQotICAgKiAgdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGgncyBhcHBlYXJhbmNlLCBhbmQgd2hpY2ggZG9uJ3QgdXNlIGdseXBoIG5hbWVzCi0gICAqICBhdCBhbGwuICBGb3Igb3VyIHB1cnBvc2VzLCBhbmQgc2xpZ2h0bHkgZ2VuZXJhbGl6ZWQsIGFuIE9wZW5UeXBlCi0gICAqICBmZWF0dXJlIGlzIGEgbmFtZSBvZiBhIG1hcHBpbmcgdGhhdCBtYXBzIGNoYXJhY3RlciBjb2RlcyB0bwotICAgKiAgbm9uLXN0YW5kYXJkIGdseXBoIGluZGljZXMgKGZlYXR1cmVzIGdldCB1c2VkIGZvciBvdGhlciB0aGluZ3MgYWxzbykuCi0gICAqICBGb3IgZXhhbXBsZSwgdGhlIGBzdXBzJyBmZWF0dXJlIHByb3ZpZGVzIHN1cGVyc2NyaXB0IGdseXBocywgdGh1cwotICAgKiAgbWFwcGluZyBjaGFyYWN0ZXIgY29kZXMgbGlrZSBgQScgb3IgYEInIHRvIHN1cGVyc2NyaXB0IGdseXBoCi0gICAqICByZXByZXNlbnRhdGlvbiBmb3Jtcy4gIEhvdyB0aGlzIG1hcHBpbmcgaGFwcGVucyBpcyBjb21wbGV0ZWx5Ci0gICAqICB1bmludGVyZXN0aW5nIHRvIHVzLgotICAgKgotICAgKiAgRm9yIHRoZSBhdXRvLWhpbnRlciwgYSBgY292ZXJhZ2UnIHJlcHJlc2VudHMgYWxsIGdseXBocyBvZiBhbiBPcGVuVHlwZQotICAgKiAgZmVhdHVyZSBjb2xsZWN0ZWQgaW4gYSBzZXQgKGFzIGxpc3RlZCBiZWxvdykgdGhhdCBjYW4gYmUgaGludGVkCi0gICAqICB0b2dldGhlci4gIFRvIGNvbnRpbnVlIHRoZSBhYm92ZSBleGFtcGxlLCBzdXBlcnNjcmlwdCBnbHlwaHMgbXVzdCBub3QKLSAgICogIGJlIGhpbnRlZCB0b2dldGhlciB3aXRoIG5vcm1hbCBnbHlwaHMgYmVjYXVzZSB0aGUgYmx1ZSB6b25lcwotICAgKiAgY29tcGxldGVseSBkaWZmZXIuCi0gICAqCi0gICAqICBOb3RlIHRoYXQgRnJlZVR5cGUgaXRzZWxmIGRvZXNuJ3QgY29tcHV0ZSBjb3ZlcmFnZXM7IGl0IG9ubHkgcHJvdmlkZXMKLSAgICogIHRoZSBnbHlwaHMgYWRkcmVzc2FibGUgYnkgdGhlIGRlZmF1bHQgVW5pY29kZSBjaGFyYWN0ZXIgbWFwLiAgSW5zdGVhZCwKLSAgICogIHdlIHVzZSB0aGUgSGFyZkJ1enogbGlicmFyeSAoaWYgYXZhaWxhYmxlKSwgd2hpY2ggaGFzIG1hbnkgZnVuY3Rpb25zCi0gICAqICBleGFjdGx5IGZvciB0aGlzIHB1cnBvc2UuCi0gICAqCi0gICAqICBBRl9DT1ZFUkFHRV9ERUZBVUxUIGlzIHNwZWNpYWw6IEl0IHNob3VsZCBjb3ZlciBldmVyeXRoaW5nIHRoYXQgaXNuJ3QKLSAgICogIGxpc3RlZCBzZXBhcmF0ZWx5IChpbmNsdWRpbmcgdGhlIGdseXBocyBhZGRyZXNzYWJsZSBieSB0aGUgY2hhcmFjdGVyCi0gICAqICBtYXApLiAgSW4gY2FzZSBIYXJmQnV6eiBpc24ndCBhdmFpbGFibGUsIGl0IGV4YWN0bHkgY292ZXJzIHRoZSBnbHlwaHMKLSAgICogIGFkZHJlc3NhYmxlIGJ5IHRoZSBjaGFyYWN0ZXIgbWFwLgotICAgKgotICAgKi8KLQotI3VuZGVmICBDT1ZFUkFHRQotI2RlZmluZSBDT1ZFUkFHRSggbmFtZSwgTkFNRSwgZGVzY3JpcHRpb24sIFwKLSAgICAgICAgICAgICAgICAgIHRhZzEsIHRhZzIsIHRhZzMsIHRhZzQgKSBcCi0gICAgICAgICAgQUZfQ09WRVJBR0VfICMjIE5BTUUsCi0KLQotICB0eXBlZGVmIGVudW0gIEFGX0NvdmVyYWdlXwotICB7Ci0jaW5jbHVkZSAiYWZjb3Zlci5oIgotCi0gICAgQUZfQ09WRVJBR0VfREVGQVVMVAotCi0gIH0gQUZfQ292ZXJhZ2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgUyBUIFkgTCBFIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiAgVGhlIHRvcG1vc3Qgc3RydWN0dXJlIGZvciBtb2RlbGxpbmcgdGhlIGF1dG8taGludGVyIGdseXBoIGlucHV0IGRhdGEKLSAgICogIGlzIGEgYHN0eWxlIGNsYXNzJywgZ3JvdXBpbmcgZXZlcnl0aGluZyB0b2dldGhlci4KLSAgICovCi0KLSN1bmRlZiAgU1RZTEUKLSNkZWZpbmUgU1RZTEUoIHMsIFMsIGQsIHdzLCBzYywgc3MsIGMgKSBcCi0gICAgICAgICAgQUZfU1RZTEVfICMjIFMsCi0KLSAgLyogVGhlIGxpc3Qgb2Yga25vd24gc3R5bGVzLiAqLwotICB0eXBlZGVmIGVudW0gIEFGX1N0eWxlXwotICB7Ci0KLSNpbmNsdWRlICJhZnN0eWxlcy5oIgotCi0gICAgQUZfU1RZTEVfTUFYICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gQUZfU3R5bGU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfU3R5bGVDbGFzc1JlY18KLSAgewotICAgIEFGX1N0eWxlICBzdHlsZTsKLQotICAgIEFGX1dyaXRpbmdTeXN0ZW0gICB3cml0aW5nX3N5c3RlbTsKLSAgICBBRl9TY3JpcHQgICAgICAgICAgc2NyaXB0OwotICAgIEFGX0JsdWVfU3RyaW5nc2V0ICBibHVlX3N0cmluZ3NldDsKLSAgICBBRl9Db3ZlcmFnZSAgICAgICAgY292ZXJhZ2U7Ci0KLSAgfSBBRl9TdHlsZUNsYXNzUmVjOwotCi0gIHR5cGVkZWYgY29uc3QgQUZfU3R5bGVDbGFzc1JlYyogIEFGX1N0eWxlQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgUyBUIFkgTCBFICAgTSBFIFQgUiBJIEMgUyAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCBBRl9GYWNlR2xvYmFsc1JlY18qICBBRl9GYWNlR2xvYmFsczsKLQotICAvKiBUaGlzIGlzIHRoZSBtYWluIHN0cnVjdHVyZSB0aGF0IGNvbWJpbmVzIGV2ZXJ5dGhpbmcuICBBdXRvZml0IG1vZHVsZXMgKi8KLSAgLyogc3BlY2lmaWMgdG8gd3JpdGluZyBzeXN0ZW1zIGRlcml2ZSB0aGVpciBzdHJ1Y3R1cmVzIGZyb20gaXQsIGZvciAgICAgICovCi0gIC8qIGV4YW1wbGUgYEFGX0xhdGluTWV0cmljcycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9TdHlsZU1ldHJpY3NSZWNfCi0gIHsKLSAgICBBRl9TdHlsZUNsYXNzICAgc3R5bGVfY2xhc3M7Ci0gICAgQUZfU2NhbGVyUmVjICAgIHNjYWxlcjsKLSAgICBGVF9Cb29sICAgICAgICAgZGlnaXRzX2hhdmVfc2FtZV93aWR0aDsKLQotICAgIEFGX0ZhY2VHbG9iYWxzICBnbG9iYWxzOyAgICAvKiB0byBhY2Nlc3MgcHJvcGVydGllcyAqLwotCi0gIH0gQUZfU3R5bGVNZXRyaWNzUmVjOwotCi0KLSNkZWZpbmUgQUZfSElOVElOR19CT1RUT01fVE9fVE9QICAwCi0jZGVmaW5lIEFGX0hJTlRJTkdfVE9QX1RPX0JPVFRPTSAgMQotCi0KLSAgLyogRGVjbGFyZSBhbmQgZGVmaW5lIHZ0YWJsZXMgZm9yIGNsYXNzZXMgKi8KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBBRl9ERUNMQVJFX1dSSVRJTkdfU1lTVEVNX0NMQVNTKCB3cml0aW5nX3N5c3RlbV9jbGFzcyApIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgQUZfV3JpdGluZ1N5c3RlbUNsYXNzUmVjICAgICAgICAgICAgICBcCi0gIHdyaXRpbmdfc3lzdGVtX2NsYXNzOwotCi0jZGVmaW5lIEFGX0RFRklORV9XUklUSU5HX1NZU1RFTV9DTEFTUyggICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MsICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc3lzdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbV9zaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbV9zY2FsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbV9kb25lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbV9zdGR3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaF9hcHBseSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IEFGX1dyaXRpbmdTeXN0ZW1DbGFzc1JlYyAgd3JpdGluZ19zeXN0ZW1fY2xhc3MgPSBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3lzdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbV9zaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbV9zY2FsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbV9kb25lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbV9zdGR3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaF9hcHBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLQotI2RlZmluZSBBRl9ERUNMQVJFX1NDUklQVF9DTEFTUyggc2NyaXB0X2NsYXNzICkgXAotICBGVF9DQUxMQkFDS19UQUJMRSBjb25zdCBBRl9TY3JpcHRDbGFzc1JlYyAgICAgXAotICBzY3JpcHRfY2xhc3M7Ci0KLSNkZWZpbmUgQUZfREVGSU5FX1NDUklQVF9DTEFTUyggICAgICAgICAgIFwKLSAgICAgICAgICBzY3JpcHRfY2xhc3MsICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzY3JpcHQsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYW5nZXMsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBub25iYXNlX3JhbmdlcywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB0b3BfdG9fYm90dG9tLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzdGRfY2hhcnN0cmluZyApICAgICAgICAgICAgICAgIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgQUZfU2NyaXB0Q2xhc3NSZWMgIHNjcmlwdF9jbGFzcyA9IFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzY3JpcHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByYW5nZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBub25iYXNlX3JhbmdlcywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0b3BfdG9fYm90dG9tLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGRfY2hhcnN0cmluZywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotCi0jZGVmaW5lIEFGX0RFQ0xBUkVfU1RZTEVfQ0xBU1MoIHN0eWxlX2NsYXNzICkgXAotICBGVF9DQUxMQkFDS19UQUJMRSBjb25zdCBBRl9TdHlsZUNsYXNzUmVjICAgIFwKLSAgc3R5bGVfY2xhc3M7Ci0KLSNkZWZpbmUgQUZfREVGSU5FX1NUWUxFX0NMQVNTKCAgICAgICAgICBcCi0gICAgICAgICAgc3R5bGVfY2xhc3MsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHN0eWxlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB3cml0aW5nX3N5c3RlbSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2NyaXB0LCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGJsdWVfc3RyaW5nc2V0LCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb3ZlcmFnZSApICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICAgICAgXAotICBjb25zdCBBRl9TdHlsZUNsYXNzUmVjICBzdHlsZV9jbGFzcyA9IFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3R5bGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdyaXRpbmdfc3lzdGVtLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzY3JpcHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmx1ZV9zdHJpbmdzZXQsICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvdmVyYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBBRl9ERUNMQVJFX1dSSVRJTkdfU1lTVEVNX0NMQVNTKCB3cml0aW5nX3N5c3RlbV9jbGFzcyApICAgICAgICAgICAgXAotICBGVF9MT0NBTCggdm9pZCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyB3cml0aW5nX3N5c3RlbV9jbGFzcyggQUZfV3JpdGluZ1N5c3RlbUNsYXNzUmVjKiAgYWMgKTsKLQotI2RlZmluZSBBRl9ERUZJTkVfV1JJVElOR19TWVNURU1fQ0xBU1MoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzeXN0ZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1fc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBtX3NjYWxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1fZG9uZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbV9zdGR3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBoX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGhfYXBwbHkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgd3JpdGluZ19zeXN0ZW1fY2xhc3MoIEFGX1dyaXRpbmdTeXN0ZW1DbGFzc1JlYyogIGFjICkgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWMtPndyaXRpbmdfc3lzdGVtICAgICAgICA9IHN5c3RlbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT5zdHlsZV9tZXRyaWNzX3NpemUgICAgPSBtX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c3R5bGVfbWV0cmljc19pbml0ICAgID0gbV9pbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT5zdHlsZV9tZXRyaWNzX3NjYWxlICAgPSBtX3NjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWMtPnN0eWxlX21ldHJpY3NfZG9uZSAgICA9IG1fZG9uZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c3R5bGVfbWV0cmljc19nZXRzdGR3ID0gbV9zdGR3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWMtPnN0eWxlX2hpbnRzX2luaXQgICAgICA9IGhfaW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c3R5bGVfaGludHNfYXBwbHkgICAgID0gaF9hcHBseTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotI2RlZmluZSBBRl9ERUNMQVJFX1NDUklQVF9DTEFTUyggc2NyaXB0X2NsYXNzICkgICAgICAgICAgICAgXAotICBGVF9MT0NBTCggdm9pZCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBzY3JpcHRfY2xhc3MoIEFGX1NjcmlwdENsYXNzUmVjKiAgYWMgKTsKLQotI2RlZmluZSBBRl9ERUZJTkVfU0NSSVBUX0NMQVNTKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2NyaXB0X2NsYXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzY3JpcHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhbmdlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbm9uYmFzZV9yYW5nZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB0b3BfdG9fYm90dG9tLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHN0ZF9jaGFyc3RyaW5nICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgc2NyaXB0X2NsYXNzKCBBRl9TY3JpcHRDbGFzc1JlYyogIGFjICkgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWMtPnNjcmlwdCAgICAgICAgICAgICAgICAgICAgPSBzY3JpcHRfOyAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c2NyaXB0X3VuaV9yYW5nZXMgICAgICAgICA9IHJhbmdlczsgICAgICAgICAgICAgICAgXAotICAgIGFjLT5zY3JpcHRfdW5pX25vbmJhc2VfcmFuZ2VzID0gbm9uYmFzZV9yYW5nZXM7ICAgICAgICBcCi0gICAgYWMtPnRvcF90b19ib3R0b21faGludGluZyAgICAgPSB0b3BfdG9fYm90dG9tOyAgICAgICAgIFwKLSAgICBhYy0+c3RhbmRhcmRfY2hhcnN0cmluZyAgICAgICA9IHN0ZF9jaGFyc3RyaW5nOyAgICAgICAgXAotICB9Ci0KLQotI2RlZmluZSBBRl9ERUNMQVJFX1NUWUxFX0NMQVNTKCBzdHlsZV9jbGFzcyApICAgICAgICAgICAgIFwKLSAgRlRfTE9DQUwoIHZvaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIHN0eWxlX2NsYXNzKCBBRl9TdHlsZUNsYXNzUmVjKiAgYWMgKTsKLQotI2RlZmluZSBBRl9ERUZJTkVfU1RZTEVfQ0xBU1MoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHN0eWxlX2NsYXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHN0eWxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHdyaXRpbmdfc3lzdGVtXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNjcmlwdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGJsdWVfc3RyaW5nc2V0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvdmVyYWdlXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9MT0NBTF9ERUYoIHZvaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBzdHlsZV9jbGFzcyggQUZfU3R5bGVDbGFzc1JlYyogIGFjICkgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT5zdHlsZSAgICAgICAgICA9IHN0eWxlXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT53cml0aW5nX3N5c3RlbSA9IHdyaXRpbmdfc3lzdGVtXzsgICAgICAgICAgICAgICAgXAotICAgIGFjLT5zY3JpcHQgICAgICAgICA9IHNjcmlwdF87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT5ibHVlX3N0cmluZ3NldCA9IGJsdWVfc3RyaW5nc2V0XzsgICAgICAgICAgICAgICAgXAotICAgIGFjLT5jb3ZlcmFnZSAgICAgICA9IGNvdmVyYWdlXzsgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEFGVFlQRVNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2Fmd2FycC5jIGIvc3JjL2F1dG9maXQvYWZ3YXJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWFhNmQuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZ3YXJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZ3YXJwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIHdhcnBpbmcgYWxnb3JpdGhtIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qCi0gICAqICBUaGUgaWRlYSBvZiB0aGUgd2FycGluZyBjb2RlIGlzIHRvIHNsaWdodGx5IHNjYWxlIGFuZCBzaGlmdCBhIGdseXBoCi0gICAqICB3aXRoaW4gYSBzaW5nbGUgZGltZW5zaW9uIHNvIHRoYXQgYXMgbXVjaCBvZiBpdHMgc2VnbWVudHMgYXJlIGFsaWduZWQKLSAgICogIChtb3JlIG9yIGxlc3MpIG9uIHRoZSBncmlkLiAgVG8gZmluZCBvdXQgdGhlIG9wdGltYWwgc2NhbGluZyBhbmQKLSAgICogIHNoaWZ0aW5nIHZhbHVlLCB2YXJpb3VzIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuCi0gICAqLwotCi0jaW5jbHVkZSAiYWZ3YXJwLmgiCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9hZndhcnAKLQotCi0gIC8qIFRoZSB3ZWlnaHRzIGNvdmVyIHRoZSByYW5nZSAwLzY0IC0gNjMvNjQgb2YgYSBwaXhlbC4gIE9idmlvdXNseSwgKi8KLSAgLyogdmFsdWVzIGFyb3VuZCBhIGhhbGYgcGl4ZWwgKHdoaWNoIG1lYW5zIGV4YWN0bHkgYmV0d2VlbiB0d28gZ3JpZCAqLwotICAvKiBsaW5lcykgZ2V0cyB0aGUgd29yc3Qgd2VpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgMQotICBzdGF0aWMgY29uc3QgQUZfV2FycFNjb3JlCi0gIGFmX3dhcnBlcl93ZWlnaHRzWzY0XSA9Ci0gIHsKLSAgICAzNSwgMzIsIDMwLCAyNSwgMjAsIDE1LCAxMiwgMTAsICA1LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgLTIsIC01LCAtOCwtMTAsLTEwLC0yMCwtMjAsLTMwLC0zMCwKLQotICAgLTMwLC0zMCwtMjAsLTIwLC0xMCwtMTAsIC04LCAtNSwgLTIsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDUsIDEwLCAxMiwgMTUsIDIwLCAyNSwgMzAsIDMyLAotICB9OwotI2Vsc2UKLSAgc3RhdGljIGNvbnN0IEFGX1dhcnBTY29yZQotICBhZl93YXJwZXJfd2VpZ2h0c1s2NF0gPQotICB7Ci0gICAgMzAsIDIwLCAxMCwgIDUsICA0LCAgNCwgIDMsICAyLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAtMiwgLTIsIC01LCAtNSwtMTAsLTEwLC0xNSwtMjAsCi0KLSAgIC0yMCwtMTUsLTE1LC0xMCwtMTAsIC01LCAtNSwgLTIsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMiwgIDMsICA0LCAgNCwgIDUsIDEwLCAyMCwKLSAgfTsKLSNlbmRpZgotCi0KLSAgLyogU2NvcmUgc2VnbWVudHMgZm9yIGEgZ2l2ZW4gYHNjYWxlJyBhbmQgYGRlbHRhJyBpbiB0aGUgcmFuZ2UgKi8KLSAgLyogYHh4MScgdG8gYHh4MicsIGFuZCBzdG9yZSB0aGUgYmVzdCByZXN1bHQgaW4gYHdhcnBlcicuICBJZiAgKi8KLSAgLyogdGhlIG5ldyBiZXN0IHNjb3JlIGlzIGVxdWFsIHRvIHRoZSBvbGQgb25lLCBwcmVmZXIgdGhlICAgICAgKi8KLSAgLyogdmFsdWUgd2l0aCBhIHNtYWxsZXIgZGlzdG9ydGlvbiAoYXJvdW5kIGBiYXNlX2Rpc3RvcnQnKS4gICAgKi8KLQotICBzdGF0aWMgdm9pZAotICBhZl93YXJwZXJfY29tcHV0ZV9saW5lX2Jlc3QoIEFGX1dhcnBlciAgICAgd2FycGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHh4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHh4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9XYXJwU2NvcmUgIGJhc2VfZGlzdG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgbnVtX3NlZ21lbnRzICkKLSAgewotICAgIEZUX0ludCAgICAgICAgaWR4X21pbiwgaWR4X21heCwgaWR4MDsKLSAgICBGVF9JbnQgICAgICAgIG5uOwotICAgIEFGX1dhcnBTY29yZSAgc2NvcmVzWzY1XTsKLQotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IDY1OyBubisrICkKLSAgICAgIHNjb3Jlc1tubl0gPSAwOwotCi0gICAgaWR4MCA9IHh4MSAtIHdhcnBlci0+dDE7Ci0KLSAgICAvKiBjb21wdXRlIG1pbmltdW0gYW5kIG1heGltdW0gaW5kaWNlcyAqLwotICAgIHsKLSAgICAgIEZUX1BvcyAgeHgxbWluID0gd2FycGVyLT54MW1pbjsKLSAgICAgIEZUX1BvcyAgeHgxbWF4ID0gd2FycGVyLT54MW1heDsKLSAgICAgIEZUX1BvcyAgdyAgICAgID0geHgyIC0geHgxOwotCi0KLSAgICAgIGlmICggeHgxbWluICsgdyA8IHdhcnBlci0+eDJtaW4gKQotICAgICAgICB4eDFtaW4gPSB3YXJwZXItPngybWluIC0gdzsKLQotICAgICAgaWYgKCB4eDFtYXggKyB3ID4gd2FycGVyLT54Mm1heCApCi0gICAgICAgIHh4MW1heCA9IHdhcnBlci0+eDJtYXggLSB3OwotCi0gICAgICBpZHhfbWluID0geHgxbWluIC0gd2FycGVyLT50MTsKLSAgICAgIGlkeF9tYXggPSB4eDFtYXggLSB3YXJwZXItPnQxOwotCi0gICAgICBpZiAoIGlkeF9taW4gPCAwIHx8IGlkeF9taW4gPiBpZHhfbWF4IHx8IGlkeF9tYXggPiA2NCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNSgoICJpbnZhbGlkIGluZGljZXM6XG4iCi0gICAgICAgICAgICAgICAgICAgICIgIG1pbj0lZCBtYXg9JWQsIHh4MT0lbGQgeHgyPSVsZCxcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgeDFtaW49JWxkIHgxbWF4PSVsZCwgeDJtaW49JWxkIHgybWF4PSVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaWR4X21pbiwgaWR4X21heCwgeHgxLCB4eDIsCi0gICAgICAgICAgICAgICAgICAgIHdhcnBlci0+eDFtaW4sIHdhcnBlci0+eDFtYXgsCi0gICAgICAgICAgICAgICAgICAgIHdhcnBlci0+eDJtaW4sIHdhcnBlci0+eDJtYXggKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX3NlZ21lbnRzOyBubisrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIGxlbiA9IHNlZ21lbnRzW25uXS5tYXhfY29vcmQgLSBzZWdtZW50c1tubl0ubWluX2Nvb3JkOwotICAgICAgRlRfUG9zICB5MCAgPSBGVF9NdWxGaXgoIHNlZ21lbnRzW25uXS5wb3MsIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgIEZUX1BvcyAgeSAgID0geTAgKyAoIGlkeF9taW4gLSBpZHgwICk7Ci0gICAgICBGVF9JbnQgIGlkeDsKLQotCi0gICAgICAvKiBzY29yZSB0aGUgbGVuZ3RoIG9mIHRoZSBzZWdtZW50cyBmb3IgdGhlIGdpdmVuIHJhbmdlICovCi0gICAgICBmb3IgKCBpZHggPSBpZHhfbWluOyBpZHggPD0gaWR4X21heDsgaWR4KyssIHkrKyApCi0gICAgICAgIHNjb3Jlc1tpZHhdICs9IGFmX3dhcnBlcl93ZWlnaHRzW3kgJiA2M10gKiBsZW47Ci0gICAgfQotCi0gICAgLyogZmluZCBiZXN0IHNjb3JlICovCi0gICAgewotICAgICAgRlRfSW50ICBpZHg7Ci0KLQotICAgICAgZm9yICggaWR4ID0gaWR4X21pbjsgaWR4IDw9IGlkeF9tYXg7IGlkeCsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfV2FycFNjb3JlICBzY29yZSA9IHNjb3Jlc1tpZHhdOwotICAgICAgICBBRl9XYXJwU2NvcmUgIGRpc3RvcnQgPSBiYXNlX2Rpc3RvcnQgKyAoIGlkeCAtIGlkeDAgKTsKLQotCi0gICAgICAgIGlmICggc2NvcmUgPiB3YXJwZXItPmJlc3Rfc2NvcmUgICAgICAgICB8fAotICAgICAgICAgICAgICggc2NvcmUgPT0gd2FycGVyLT5iZXN0X3Njb3JlICAgICYmCi0gICAgICAgICAgICAgICBkaXN0b3J0IDwgd2FycGVyLT5iZXN0X2Rpc3RvcnQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICB3YXJwZXItPmJlc3Rfc2NvcmUgICA9IHNjb3JlOwotICAgICAgICAgIHdhcnBlci0+YmVzdF9kaXN0b3J0ID0gZGlzdG9ydDsKLSAgICAgICAgICB3YXJwZXItPmJlc3Rfc2NhbGUgICA9IHNjYWxlOwotICAgICAgICAgIHdhcnBlci0+YmVzdF9kZWx0YSAgID0gZGVsdGEgKyAoIGlkeCAtIGlkeDAgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogQ29tcHV0ZSBvcHRpbWFsIHNjYWxpbmcgYW5kIGRlbHRhIHZhbHVlcyBmb3IgYSBnaXZlbiBnbHlwaCBhbmQgKi8KLSAgLyogZGltZW5zaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl93YXJwZXJfY29tcHV0ZSggQUZfV2FycGVyICAgICAgd2FycGVyLAotICAgICAgICAgICAgICAgICAgICAgQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICphX3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAqYV9kZWx0YSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXM7Ci0gICAgQUZfUG9pbnQgICAgICBwb2ludHM7Ci0KLSAgICBGVF9GaXhlZCAgICAgIG9yZ19zY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgIG9yZ19kZWx0YTsKLQotICAgIEZUX0ludCAgICAgICAgbm4sIG51bV9wb2ludHMsIG51bV9zZWdtZW50czsKLSAgICBGVF9JbnQgICAgICAgIFgxLCBYMjsKLSAgICBGVF9JbnQgICAgICAgIHc7Ci0KLSAgICBBRl9XYXJwU2NvcmUgIGJhc2VfZGlzdG9ydDsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzOwotCi0KLSAgICAvKiBnZXQgb3JpZ2luYWwgc2NhbGluZyB0cmFuc2Zvcm1hdGlvbiAqLwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICkKLSAgICB7Ci0gICAgICBvcmdfc2NhbGUgPSBoaW50cy0+eV9zY2FsZTsKLSAgICAgIG9yZ19kZWx0YSA9IGhpbnRzLT55X2RlbHRhOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3JnX3NjYWxlID0gaGludHMtPnhfc2NhbGU7Ci0gICAgICBvcmdfZGVsdGEgPSBoaW50cy0+eF9kZWx0YTsKLSAgICB9Ci0KLSAgICB3YXJwZXItPmJlc3Rfc2NhbGUgICA9IG9yZ19zY2FsZTsKLSAgICB3YXJwZXItPmJlc3RfZGVsdGEgICA9IG9yZ19kZWx0YTsKLSAgICB3YXJwZXItPmJlc3Rfc2NvcmUgICA9IEZUX0lOVF9NSU47Ci0gICAgd2FycGVyLT5iZXN0X2Rpc3RvcnQgPSAwOwotCi0gICAgYXhpcyAgICAgICAgID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgc2VnbWVudHMgICAgID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgbnVtX3NlZ21lbnRzID0gYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgIHBvaW50cyAgICAgICA9IGhpbnRzLT5wb2ludHM7Ci0gICAgbnVtX3BvaW50cyAgID0gaGludHMtPm51bV9wb2ludHM7Ci0KLSAgICAqYV9zY2FsZSA9IG9yZ19zY2FsZTsKLSAgICAqYV9kZWx0YSA9IG9yZ19kZWx0YTsKLQotICAgIC8qIGdldCBYMSBhbmQgWDIsIG1pbmltdW0gYW5kIG1heGltdW0gaW4gb3JpZ2luYWwgY29vcmRpbmF0ZXMgKi8KLSAgICBpZiAoIG51bV9zZWdtZW50cyA8IDEgKQotICAgICAgcmV0dXJuOwotCi0jaWYgMQotICAgIFgxID0gWDIgPSBwb2ludHNbMF0uZng7Ci0gICAgZm9yICggbm4gPSAxOyBubiA8IG51bV9wb2ludHM7IG5uKysgKQotICAgIHsKLSAgICAgIEZUX0ludCAgWCA9IHBvaW50c1tubl0uZng7Ci0KLQotICAgICAgaWYgKCBYIDwgWDEgKQotICAgICAgICBYMSA9IFg7Ci0gICAgICBpZiAoIFggPiBYMiApCi0gICAgICAgIFgyID0gWDsKLSAgICB9Ci0jZWxzZQotICAgIFgxID0gWDIgPSBzZWdtZW50c1swXS5wb3M7Ci0gICAgZm9yICggbm4gPSAxOyBubiA8IG51bV9zZWdtZW50czsgbm4rKyApCi0gICAgewotICAgICAgRlRfSW50ICBYID0gc2VnbWVudHNbbm5dLnBvczsKLQotCi0gICAgICBpZiAoIFggPCBYMSApCi0gICAgICAgIFgxID0gWDsKLSAgICAgIGlmICggWCA+IFgyICkKLSAgICAgICAgWDIgPSBYOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKCBYMSA+PSBYMiApCi0gICAgICByZXR1cm47Ci0KLSAgICB3YXJwZXItPngxID0gRlRfTXVsRml4KCBYMSwgb3JnX3NjYWxlICkgKyBvcmdfZGVsdGE7Ci0gICAgd2FycGVyLT54MiA9IEZUX011bEZpeCggWDIsIG9yZ19zY2FsZSApICsgb3JnX2RlbHRhOwotCi0gICAgd2FycGVyLT50MSA9IEFGX1dBUlBFUl9GTE9PUiggd2FycGVyLT54MSApOwotICAgIHdhcnBlci0+dDIgPSBBRl9XQVJQRVJfQ0VJTCggd2FycGVyLT54MiApOwotCi0gICAgLyogZXhhbWluZSBhIGhhbGYgcGl4ZWwgd2lkZSByYW5nZSBhcm91bmQgdGhlIG1heGltdW0gY29vcmRpbmF0ZXMgKi8KLSAgICB3YXJwZXItPngxbWluID0gd2FycGVyLT54MSAmIH4zMTsKLSAgICB3YXJwZXItPngxbWF4ID0gd2FycGVyLT54MW1pbiArIDMyOwotICAgIHdhcnBlci0+eDJtaW4gPSB3YXJwZXItPngyICYgfjMxOwotICAgIHdhcnBlci0+eDJtYXggPSB3YXJwZXItPngybWluICsgMzI7Ci0KLSAgICBpZiAoIHdhcnBlci0+eDFtYXggPiB3YXJwZXItPngyICkKLSAgICAgIHdhcnBlci0+eDFtYXggPSB3YXJwZXItPngyOwotCi0gICAgaWYgKCB3YXJwZXItPngybWluIDwgd2FycGVyLT54MSApCi0gICAgICB3YXJwZXItPngybWluID0gd2FycGVyLT54MTsKLQotICAgIHdhcnBlci0+dzAgPSB3YXJwZXItPngyIC0gd2FycGVyLT54MTsKLQotICAgIGlmICggd2FycGVyLT53MCA8PSA2NCApCi0gICAgewotICAgICAgd2FycGVyLT54MW1heCA9IHdhcnBlci0+eDE7Ci0gICAgICB3YXJwZXItPngybWluID0gd2FycGVyLT54MjsKLSAgICB9Ci0KLSAgICAvKiBleGFtaW5lIChhdCBtb3N0KSBhIHBpeGVsIHdpZGUgcmFuZ2UgYXJvdW5kIHRoZSBuYXR1cmFsIHdpZHRoICovCi0gICAgd2FycGVyLT53bWluID0gd2FycGVyLT54Mm1pbiAtIHdhcnBlci0+eDFtYXg7Ci0gICAgd2FycGVyLT53bWF4ID0gd2FycGVyLT54Mm1heCAtIHdhcnBlci0+eDFtaW47Ci0KLSNpZiAxCi0gICAgLyogc29tZSBoZXVyaXN0aWNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHdpZHRocyB0byBiZSBleGFtaW5lZCAqLwotICAgIHsKLSAgICAgIGludCAgbWFyZ2luID0gMTY7Ci0KLQotICAgICAgaWYgKCB3YXJwZXItPncwIDw9IDEyOCApCi0gICAgICB7Ci0gICAgICAgICBtYXJnaW4gPSA4OwotICAgICAgICAgaWYgKCB3YXJwZXItPncwIDw9IDk2ICkKLSAgICAgICAgICAgbWFyZ2luID0gNDsKLSAgICAgIH0KLQotICAgICAgaWYgKCB3YXJwZXItPndtaW4gPCB3YXJwZXItPncwIC0gbWFyZ2luICkKLSAgICAgICAgd2FycGVyLT53bWluID0gd2FycGVyLT53MCAtIG1hcmdpbjsKLQotICAgICAgaWYgKCB3YXJwZXItPndtYXggPiB3YXJwZXItPncwICsgbWFyZ2luICkKLSAgICAgICAgd2FycGVyLT53bWF4ID0gd2FycGVyLT53MCArIG1hcmdpbjsKLSAgICB9Ci0KLSAgICBpZiAoIHdhcnBlci0+d21pbiA8IHdhcnBlci0+dzAgKiAzIC8gNCApCi0gICAgICB3YXJwZXItPndtaW4gPSB3YXJwZXItPncwICogMyAvIDQ7Ci0KLSAgICBpZiAoIHdhcnBlci0+d21heCA+IHdhcnBlci0+dzAgKiA1IC8gNCApCi0gICAgICB3YXJwZXItPndtYXggPSB3YXJwZXItPncwICogNSAvIDQ7Ci0jZWxzZQotICAgIC8qIG5vIHNjYWxpbmcsIGp1c3QgdHJhbnNsYXRpb24gKi8KLSAgICB3YXJwZXItPndtaW4gPSB3YXJwZXItPndtYXggPSB3YXJwZXItPncwOwotI2VuZGlmCi0KLSAgICBmb3IgKCB3ID0gd2FycGVyLT53bWluOyB3IDw9IHdhcnBlci0+d21heDsgdysrICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgbmV3X3NjYWxlOwotICAgICAgRlRfUG9zICAgIG5ld19kZWx0YTsKLSAgICAgIEZUX1BvcyAgICB4eDEsIHh4MjsKLQotCi0gICAgICAvKiBjb21wdXRlIG1pbiBhbmQgbWF4IHBvc2l0aW9ucyBmb3IgZ2l2ZW4gd2lkdGgsICAgICAgICovCi0gICAgICAvKiBhc3N1cmluZyB0aGF0IHRoZXkgc3RheSB3aXRoaW4gdGhlIGNvb3JkaW5hdGUgcmFuZ2VzICovCi0gICAgICB4eDEgPSB3YXJwZXItPngxOwotICAgICAgeHgyID0gd2FycGVyLT54MjsKLSAgICAgIGlmICggdyA+PSB3YXJwZXItPncwICkKLSAgICAgIHsKLSAgICAgICAgeHgxIC09IHcgLSB3YXJwZXItPncwOwotICAgICAgICBpZiAoIHh4MSA8IHdhcnBlci0+eDFtaW4gKQotICAgICAgICB7Ci0gICAgICAgICAgeHgyICs9IHdhcnBlci0+eDFtaW4gLSB4eDE7Ci0gICAgICAgICAgeHgxICA9IHdhcnBlci0+eDFtaW47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeHgxIC09IHcgLSB3YXJwZXItPncwOwotICAgICAgICBpZiAoIHh4MSA+IHdhcnBlci0+eDFtYXggKQotICAgICAgICB7Ci0gICAgICAgICAgeHgyIC09IHh4MSAtIHdhcnBlci0+eDFtYXg7Ci0gICAgICAgICAgeHgxICA9IHdhcnBlci0+eDFtYXg7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCB4eDEgPCB3YXJwZXItPngxICkKLSAgICAgICAgYmFzZV9kaXN0b3J0ID0gd2FycGVyLT54MSAtIHh4MTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmFzZV9kaXN0b3J0ID0geHgxIC0gd2FycGVyLT54MTsKLQotICAgICAgaWYgKCB4eDIgPCB3YXJwZXItPngyICkKLSAgICAgICAgYmFzZV9kaXN0b3J0ICs9IHdhcnBlci0+eDIgLSB4eDI7Ci0gICAgICBlbHNlCi0gICAgICAgIGJhc2VfZGlzdG9ydCArPSB4eDIgLSB3YXJwZXItPngyOwotCi0gICAgICAvKiBnaXZlIGJhc2UgZGlzdG9ydGlvbiBhIGdyZWF0ZXIgd2VpZ2h0IHdoaWxlIHNjb3JpbmcgKi8KLSAgICAgIGJhc2VfZGlzdG9ydCAqPSAxMDsKLQotICAgICAgbmV3X3NjYWxlID0gb3JnX3NjYWxlICsgRlRfRGl2Rml4KCB3IC0gd2FycGVyLT53MCwgWDIgLSBYMSApOwotICAgICAgbmV3X2RlbHRhID0geHgxIC0gRlRfTXVsRml4KCBYMSwgbmV3X3NjYWxlICk7Ci0KLSAgICAgIGFmX3dhcnBlcl9jb21wdXRlX2xpbmVfYmVzdCggd2FycGVyLCBuZXdfc2NhbGUsIG5ld19kZWx0YSwgeHgxLCB4eDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfZGlzdG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudHMsIG51bV9zZWdtZW50cyApOwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX0ZpeGVkICBiZXN0X3NjYWxlID0gd2FycGVyLT5iZXN0X3NjYWxlOwotICAgICAgRlRfUG9zICAgIGJlc3RfZGVsdGEgPSB3YXJwZXItPmJlc3RfZGVsdGE7Ci0KLQotICAgICAgaGludHMtPnhtaW5fZGVsdGEgPSBGVF9NdWxGaXgoIFgxLCBiZXN0X3NjYWxlIC0gb3JnX3NjYWxlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiZXN0X2RlbHRhOwotICAgICAgaGludHMtPnhtYXhfZGVsdGEgPSBGVF9NdWxGaXgoIFgyLCBiZXN0X3NjYWxlIC0gb3JnX3NjYWxlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiZXN0X2RlbHRhOwotCi0gICAgICAqYV9zY2FsZSA9IGJlc3Rfc2NhbGU7Ci0gICAgICAqYV9kZWx0YSA9IGJlc3RfZGVsdGE7Ci0gICAgfQotICB9Ci0KLSNlbHNlIC8qICFBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIgKi8KLQotICAvKiBBTlNJIEMgZG9lc24ndCBsaWtlIGVtcHR5IHNvdXJjZSBmaWxlcyAqLwotICB0eXBlZGVmIGludCAgX2FmX3dhcnBfZHVtbXk7Ci0KLSNlbmRpZiAvKiAhQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSICovCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZ3YXJwLmggYi9zcmMvYXV0b2ZpdC9hZndhcnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4NWNiZC4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZndhcnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmd2FycC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciB3YXJwaW5nIGFsZ29yaXRobSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBBRldBUlBfSF8KLSNkZWZpbmUgQUZXQVJQX0hfCi0KLSNpbmNsdWRlICJhZmhpbnRzLmgiCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jZGVmaW5lIEFGX1dBUlBFUl9TQ0FMRQotCi0jZGVmaW5lIEFGX1dBUlBFUl9GTE9PUiggeCApICAoICh4KSAmIH5GVF9UWVBFT0YoIHggKTYzICkKLSNkZWZpbmUgQUZfV0FSUEVSX0NFSUwoIHggKSAgIEFGX1dBUlBFUl9GTE9PUiggKHgpICsgNjMgKQotCi0KLSAgdHlwZWRlZiBGVF9JbnQzMiAgQUZfV2FycFNjb3JlOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9XYXJwZXJSZWNfCi0gIHsKLSAgICBGVF9Qb3MgICAgICAgIHgxLCB4MjsKLSAgICBGVF9Qb3MgICAgICAgIHQxLCB0MjsKLSAgICBGVF9Qb3MgICAgICAgIHgxbWluLCB4MW1heDsKLSAgICBGVF9Qb3MgICAgICAgIHgybWluLCB4Mm1heDsKLSAgICBGVF9Qb3MgICAgICAgIHcwLCB3bWluLCB3bWF4OwotCi0gICAgRlRfRml4ZWQgICAgICBiZXN0X3NjYWxlOwotICAgIEZUX1BvcyAgICAgICAgYmVzdF9kZWx0YTsKLSAgICBBRl9XYXJwU2NvcmUgIGJlc3Rfc2NvcmU7Ci0gICAgQUZfV2FycFNjb3JlICBiZXN0X2Rpc3RvcnQ7Ci0KLSAgfSBBRl9XYXJwZXJSZWMsICpBRl9XYXJwZXI7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX3dhcnBlcl9jb21wdXRlKCBBRl9XYXJwZXIgICAgICB3YXJwZXIsCi0gICAgICAgICAgICAgICAgICAgICBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgKmFfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICphX2RlbHRhICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBBRldBUlBfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2Fmd3J0c3lzLmggYi9zcmMvYXV0b2ZpdC9hZndydHN5cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njc0OWEyLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2Fmd3J0c3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZndydHN5cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgd3JpdGluZyBzeXN0ZW1zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZXUlRTWVNfSF8KLSNkZWZpbmUgQUZXUlRTWVNfSF8KLQotICAvKiBTaW5jZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBjYW4ndCBjcmVhdGUgb3RoZXIgcHJlcHJvY2Vzc29yICovCi0gIC8qIGRpcmVjdGl2ZXMsIHdlIGhhdmUgdG8gaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGVzIG1hbnVhbGx5LiAgICAgKi8KLQotI2luY2x1ZGUgImFmZHVtbXkuaCIKLSNpbmNsdWRlICJhZmxhdGluLmgiCi0jaW5jbHVkZSAiYWZjamsuaCIKLSNpbmNsdWRlICJhZmluZGljLmgiCi0jaWZkZWYgRlRfT1BUSU9OX0FVVE9GSVQyCi0jaW5jbHVkZSAiYWZsYXRpbjIuaCIKLSNlbmRpZgotCi0jZW5kaWYgLyogQUZXUlRTWVNfSF8gKi8KLQotCi0gIC8qIFRoZSBmb2xsb3dpbmcgcGFydCBjYW4gYmUgaW5jbHVkZWQgbXVsdGlwbGUgdGltZXMuICovCi0gIC8qIERlZmluZSBgV1JJVElOR19TWVNURU0nIGFzIG5lZWRlZC4gICAgICAgICAgICAgICAgICovCi0KLQotICAvKiBBZGQgbmV3IHdyaXRpbmcgc3lzdGVtcyBoZXJlLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHdyaXRpbmcgc3lzdGVtICovCi0gIC8qIG5hbWUgaW4gbG93ZXJjYXNlIGFuZCB1cHBlcmNhc2UsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBXUklUSU5HX1NZU1RFTSggZHVtbXksICBEVU1NWSAgKQotICBXUklUSU5HX1NZU1RFTSggbGF0aW4sICBMQVRJTiAgKQotICBXUklUSU5HX1NZU1RFTSggY2prLCAgICBDSksgICAgKQotICBXUklUSU5HX1NZU1RFTSggaW5kaWMsICBJTkRJQyAgKQotI2lmZGVmIEZUX09QVElPTl9BVVRPRklUMgotICBXUklUSU5HX1NZU1RFTSggbGF0aW4yLCBMQVRJTjIgKQotI2VuZGlmCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hdXRvZml0LmMgYi9zcmMvYXV0b2ZpdC9hdXRvZml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZWRhZDcuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYXV0b2ZpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYXV0b2ZpdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIG1vZHVsZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAiYWZhbmdsZXMuYyIKLSNpbmNsdWRlICJhZmJsdWUuYyIKLSNpbmNsdWRlICJhZmNqay5jIgotI2luY2x1ZGUgImFmZHVtbXkuYyIKLSNpbmNsdWRlICJhZmdsb2JhbC5jIgotI2luY2x1ZGUgImFmaGludHMuYyIKLSNpbmNsdWRlICJhZmluZGljLmMiCi0jaW5jbHVkZSAiYWZsYXRpbi5jIgotI2luY2x1ZGUgImFmbGF0aW4yLmMiCi0jaW5jbHVkZSAiYWZsb2FkZXIuYyIKLSNpbmNsdWRlICJhZm1vZHVsZS5jIgotI2luY2x1ZGUgImFmcGljLmMiCi0jaW5jbHVkZSAiYWZyYW5nZXMuYyIKLSNpbmNsdWRlICJhZnNoYXBlci5jIgotI2luY2x1ZGUgImFmd2FycC5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvbW9kdWxlLm1rIGIvc3JjL2F1dG9maXQvbW9kdWxlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGUyNDliLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L21vZHVsZS5taworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBhdXRvLWZpdHRlciBtb2R1bGUgZGVmaW5pdGlvbgotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDMtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotRlRNT0RVTEVfSF9DT01NQU5EUyArPSBBVVRPRklUX01PRFVMRQotCi1kZWZpbmUgQVVUT0ZJVF9NT0RVTEUKLSQoT1BFTl9EUklWRVIpIEZUX01vZHVsZV9DbGFzcywgYXV0b2ZpdF9tb2R1bGVfY2xhc3MgJChDTE9TRV9EUklWRVIpCi0kKEVDSE9fRFJJVkVSKWF1dG9maXQgICAkKEVDSE9fRFJJVkVSX0RFU0MpYXV0b21hdGljIGhpbnRpbmcgbW9kdWxlJChFQ0hPX0RSSVZFUl9ET05FKQotZW5kZWYKLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L3J1bGVzLm1rIGIvc3JjL2F1dG9maXQvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGUxMzAuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgYXV0by1maXR0ZXIgbW9kdWxlIGNvbmZpZ3VyYXRpb24gcnVsZXMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAzLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgQVVUT0YgZHJpdmVyIGRpcmVjdG9yeQotIwotQVVUT0ZfRElSIDo9ICQoU1JDX0RJUikvYXV0b2ZpdAotCi0KLSMgY29tcGlsYXRpb24gZmxhZ3MgZm9yIHRoZSBkcml2ZXIKLSMKLUFVVE9GX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAkSSQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJChBVVRPRl9ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICQoSU5DTFVERV9GTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBBVVRPRiBkcml2ZXIgc291cmNlcyAoaS5lLiwgQyBmaWxlcykKLSMKLUFVVE9GX0RSVl9TUkMgOj0gJChBVVRPRl9ESVIpL2FmYW5nbGVzLmMgXAotICAgICAgICAgICAgICAgICAkKEFVVE9GX0RJUikvYWZibHVlLmMgICBcCi0gICAgICAgICAgICAgICAgICQoQVVUT0ZfRElSKS9hZmNqay5jICAgIFwKLSAgICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2FmZHVtbXkuYyAgXAotICAgICAgICAgICAgICAgICAkKEFVVE9GX0RJUikvYWZnbG9iYWwuYyBcCi0gICAgICAgICAgICAgICAgICQoQVVUT0ZfRElSKS9hZmhpbnRzLmMgIFwKLSAgICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2FmaW5kaWMuYyAgXAotICAgICAgICAgICAgICAgICAkKEFVVE9GX0RJUikvYWZsYXRpbi5jICBcCi0gICAgICAgICAgICAgICAgICQoQVVUT0ZfRElSKS9hZmxvYWRlci5jIFwKLSAgICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2FmbW9kdWxlLmMgXAotICAgICAgICAgICAgICAgICAkKEFVVE9GX0RJUikvYWZwaWMuYyAgICBcCi0gICAgICAgICAgICAgICAgICQoQVVUT0ZfRElSKS9hZnJhbmdlcy5jIFwKLSAgICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2Fmc2hhcGVyLmMgXAotICAgICAgICAgICAgICAgICAkKEFVVE9GX0RJUikvYWZ3YXJwLmMKLQotIyBBVVRPRiBkcml2ZXIgaGVhZGVycwotIwotQVVUT0ZfRFJWX0ggOj0gJChBVVRPRl9EUlZfU1JDOiVjPSVoKSAgXAotICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2FmY292ZXIuaCAgXAotICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2FmZXJyb3JzLmggXAotICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2Fmc2NyaXB0LmggXAotICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2Fmc3R5bGVzLmggXAotICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2FmdHlwZXMuaCAgXAotICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2Fmd3J0c3lzLmgKLQotCi0jIEFVVE9GIGRyaXZlciBvYmplY3QocykKLSMKLSMgICBBVVRPRl9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMuCi0jICAgQVVUT0ZfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcy4KLSMKLUFVVE9GX0RSVl9PQkpfTSA6PSAkKEFVVE9GX0RSVl9TUkM6JChBVVRPRl9ESVIpLyUuYz0kKE9CSl9ESVIpLyUuJE8pCi1BVVRPRl9EUlZfT0JKX1MgOj0gJChPQkpfRElSKS9hdXRvZml0LiRPCi0KLSMgQVVUT0YgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLUFVVE9GX0RSVl9TUkNfUyA6PSAkKEFVVE9GX0RJUikvYXV0b2ZpdC5jCi0KLQotIyBBVVRPRiBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0Ci0jCi0kKEFVVE9GX0RSVl9PQkpfUyk6ICQoQVVUT0ZfRFJWX1NSQ19TKSAkKEFVVE9GX0RSVl9TUkMpIFwKLSAgICAgICAgICAgICAgICAgICAkKEZSRUVUWVBFX0gpICQoQVVUT0ZfRFJWX0gpCi0JJChBVVRPRl9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChBVVRPRl9EUlZfU1JDX1MpKQotCi0KLSMgQVVUT0YgZHJpdmVyIC0gbXVsdGlwbGUgb2JqZWN0cwotIwotJChPQkpfRElSKS8lLiRPOiAkKEFVVE9GX0RJUikvJS5jICQoRlJFRVRZUEVfSCkgJChBVVRPRl9EUlZfSCkKLQkkKEFVVE9GX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkPCkKLQotCi0jIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKLSMKLURSVl9PQkpTX1MgKz0gJChBVVRPRl9EUlZfT0JKX1MpCi1EUlZfT0JKU19NICs9ICQoQVVUT0ZfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9KYW1maWxlIGIvc3JjL2Jhc2UvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5YTkxYi4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9iYXNlIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBiYXNlIDsKLQotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IGJhc2VwaWMKLSAgICAgICAgICAgICAgIGZ0YWR2YW5jCi0gICAgICAgICAgICAgICBmdGNhbGMKLSAgICAgICAgICAgICAgIGZ0ZGJnbWVtCi0gICAgICAgICAgICAgICBmdGdsb2FkcgotICAgICAgICAgICAgICAgZnRoYXNoCi0gICAgICAgICAgICAgICBmdG9ianMKLSAgICAgICAgICAgICAgIGZ0b3V0bG4KLSAgICAgICAgICAgICAgIGZ0cGljCi0gICAgICAgICAgICAgICBmdHJmb3JrCi0gICAgICAgICAgICAgICBmdHNuYW1lcwotICAgICAgICAgICAgICAgZnRzdHJlYW0KLSAgICAgICAgICAgICAgIGZ0dHJpZ29uCi0gICAgICAgICAgICAgICBmdHV0aWwKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IGZ0YmFzZSA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgQWRkIHRoZSBvcHRpb25hbC9yZXBsYWNlYWJsZSBmaWxlcy4KLSMKLXsKLSAgbG9jYWwgIF9zb3VyY2VzID0gZnRhcGkKLSAgICAgICAgICAgICAgICAgICAgZnRiYm94Ci0gICAgICAgICAgICAgICAgICAgIGZ0YmRmCi0gICAgICAgICAgICAgICAgICAgIGZ0Yml0bWFwCi0gICAgICAgICAgICAgICAgICAgIGZ0Y2lkCi0gICAgICAgICAgICAgICAgICAgIGZ0ZGVidWcKLSAgICAgICAgICAgICAgICAgICAgZnRmbnRmbXQKLSAgICAgICAgICAgICAgICAgICAgZnRmc3R5cGUKLSAgICAgICAgICAgICAgICAgICAgZnRnYXNwCi0gICAgICAgICAgICAgICAgICAgIGZ0Z2x5cGgKLSAgICAgICAgICAgICAgICAgICAgZnRneHZhbAotICAgICAgICAgICAgICAgICAgICBmdGluaXQKLSAgICAgICAgICAgICAgICAgICAgZnRsY2RmaWwKLSAgICAgICAgICAgICAgICAgICAgZnRtbQotICAgICAgICAgICAgICAgICAgICBmdG90dmFsCi0gICAgICAgICAgICAgICAgICAgIGZ0cGF0ZW50Ci0gICAgICAgICAgICAgICAgICAgIGZ0cGZyCi0gICAgICAgICAgICAgICAgICAgIGZ0c3Ryb2tlCi0gICAgICAgICAgICAgICAgICAgIGZ0c3ludGgKLSAgICAgICAgICAgICAgICAgICAgZnRzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgZnR0eXBlMQotICAgICAgICAgICAgICAgICAgICBmdHdpbmZudAotICAgICAgICAgICAgICAgICAgICA7Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIEFkZCBNYWNpbnRvc2gtc3BlY2lmaWMgZmlsZSB0byB0aGUgbGlicmFyeSB3aGVuIG5lY2Vzc2FyeS4KLSMKLWlmICQoTUFDKQotewotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogZnRtYWMuYyA7Ci19Ci1lbHNlIGlmICQoT1MpID0gTUFDT1NYCi17Ci0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgTGlicmFyeSAgJChGVDJfTElCKSA6IGZ0bWFjLmMgOwotICB9Ci19Ci0KLSMgZW5kIG9mIHNyYy9iYXNlIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Jhc2VwaWMuYyBiL3NyYy9iYXNlL2Jhc2VwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmYjgxNi4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9iYXNlcGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYmFzZXBpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBiYXNlLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgImJhc2VwaWMuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIGZ0Z2x5cGguYyAqLwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfZnRfb3V0bGluZV9nbHlwaF9jbGFzcyggRlRfR2x5cGhfQ2xhc3MqICBjbGF6eiApOwotCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19mdF9iaXRtYXBfZ2x5cGhfY2xhc3MoIEZUX0dseXBoX0NsYXNzKiAgY2xhenogKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb24gZnJvbSBmdHJmb3JrLmMgKi8KLSAgLyogKG5vdCBtb2R1bGFyaXplZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB2b2lkCi0gIEZUX0luaXRfVGFibGVfZnRfcmFjY2Vzc19ndWVzc190YWJsZSggZnRfcmFjY2Vzc19ndWVzc19yZWMqICByZWNvcmQgKTsKLSNlbmRpZgotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gZnRpbml0LmMgKi8KLSAgRlRfRXJyb3IKLSAgZnRfY3JlYXRlX2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICB2b2lkCi0gIGZ0X2Rlc3Ryb3lfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0KLSAgdm9pZAotICBmdF9iYXNlX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+YmFzZSApCi0gICAgewotICAgICAgLyogZGVzdHJveSBkZWZhdWx0IG1vZHVsZSBjbGFzc2VzICAgICAgICAgICAgKi8KLSAgICAgIC8qIChpbiBjYXNlIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMgd2FzIHVzZWQpICovCi0gICAgICBmdF9kZXN0cm95X2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMoIGxpYnJhcnkgKTsKLQotICAgICAgRlRfRlJFRSggcGljX2NvbnRhaW5lci0+YmFzZSApOwotICAgICAgcGljX2NvbnRhaW5lci0+YmFzZSA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9FcnJvcgotICBmdF9iYXNlX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgQmFzZVBJQyogICAgICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+YmFzZSA9IGNvbnRhaW5lcjsKLQotICAgIC8qIGluaXRpYWxpemUgZGVmYXVsdCBtb2R1bGVzIGxpc3QgYW5kIHBvaW50ZXJzICovCi0gICAgZXJyb3IgPSBmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggbGlicmFyeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgRlRfSW5pdF9DbGFzc19mdF9vdXRsaW5lX2dseXBoX2NsYXNzKAotICAgICAgJmNvbnRhaW5lci0+ZnRfb3V0bGluZV9nbHlwaF9jbGFzcyApOwotICAgIEZUX0luaXRfQ2xhc3NfZnRfYml0bWFwX2dseXBoX2NsYXNzKAotICAgICAgJmNvbnRhaW5lci0+ZnRfYml0bWFwX2dseXBoX2NsYXNzICk7Ci0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLSAgICBGVF9Jbml0X1RhYmxlX2Z0X3JhY2Nlc3NfZ3Vlc3NfdGFibGUoCi0gICAgICAoZnRfcmFjY2Vzc19ndWVzc19yZWMqKSZjb250YWluZXItPmZ0X3JhY2Nlc3NfZ3Vlc3NfdGFibGUgKTsKLSNlbmRpZgotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBmdF9iYXNlX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvYmFzZXBpYy5oIGIvc3JjL2Jhc2UvYmFzZXBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNThkNGNlLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Jhc2VwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJhc2VwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgYmFzZS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBCQVNFUElDX0hfCi0jZGVmaW5lIEJBU0VQSUNfSF8KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAgJmZ0X291dGxpbmVfZ2x5cGhfY2xhc3MKLSNkZWZpbmUgRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVCAgICZmdF9iaXRtYXBfZ2x5cGhfY2xhc3MKLSNkZWZpbmUgRlRfREVGQVVMVF9NT0RVTEVTX0dFVCAgICAgIGZ0X2RlZmF1bHRfbW9kdWxlcwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotI2RlZmluZSBGVF9SQUNDRVNTX0dVRVNTX1RBQkxFX0dFVCAgZnRfcmFjY2Vzc19ndWVzc190YWJsZQotI2VuZGlmCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNpbmNsdWRlIEZUX0dMWVBIX0gKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1JGT1JLX0gKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIHR5cGVkZWYgc3RydWN0ICBCYXNlUElDXwotICB7Ci0gICAgRlRfTW9kdWxlX0NsYXNzKiogIGRlZmF1bHRfbW9kdWxlX2NsYXNzZXM7Ci0gICAgRlRfR2x5cGhfQ2xhc3MgICAgIGZ0X291dGxpbmVfZ2x5cGhfY2xhc3M7Ci0gICAgRlRfR2x5cGhfQ2xhc3MgICAgIGZ0X2JpdG1hcF9nbHlwaF9jbGFzczsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKLSAgICBmdF9yYWNjZXNzX2d1ZXNzX3JlYyAgZnRfcmFjY2Vzc19ndWVzc190YWJsZVtGVF9SQUNDRVNTX05fUlVMRVNdOwotI2VuZGlmCi0KLSAgfSBCYXNlUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICggKEJhc2VQSUMqKSggKGxpYiktPnBpY19jb250YWluZXIuYmFzZSApICkKLQotI2RlZmluZSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAmR0VUX1BJQyggbGlicmFyeSApLT5mdF9vdXRsaW5lX2dseXBoX2NsYXNzICkKLSNkZWZpbmUgRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICZHRVRfUElDKCBsaWJyYXJ5ICktPmZ0X2JpdG1hcF9nbHlwaF9jbGFzcyApCi0jZGVmaW5lIEZUX0RFRkFVTFRfTU9EVUxFU19HRVQgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgKQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotI2RlZmluZSBGVF9SQUNDRVNTX0dVRVNTX1RBQkxFX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5mdF9yYWNjZXNzX2d1ZXNzX3RhYmxlICkKLSNlbmRpZgotCi0KLSAgLyogc2VlIGJhc2VwaWMuYyBmb3IgdGhlIGltcGxlbWVudGF0aW9uICovCi0gIHZvaWQKLSAgZnRfYmFzZV9waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIGZ0X2Jhc2VfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0jZW5kaWYgLyogQkFTRVBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRhZHZhbmMuYyBiL3NyYy9iYXNlL2Z0YWR2YW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTc2MDcuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRhZHZhbmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGFkdmFuYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUXVpY2sgY29tcHV0YXRpb24gb2YgYWR2YW5jZSB3aWR0aHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDgtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9BRFZBTkNFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBfZnRfZmFjZV9zY2FsZV9hZHZhbmNlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGZsYWdzICkKLSAgewotICAgIEZUX0ZpeGVkICBzY2FsZTsKLSAgICBGVF9VSW50ICAgbm47Ci0KLQotICAgIGlmICggZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoICFmYWNlLT5zaXplICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TaXplX0hhbmRsZSApOwotCi0gICAgaWYgKCBmbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICAgIHNjYWxlID0gZmFjZS0+c2l6ZS0+bWV0cmljcy55X3NjYWxlOwotICAgIGVsc2UKLSAgICAgIHNjYWxlID0gZmFjZS0+c2l6ZS0+bWV0cmljcy54X3NjYWxlOwotCi0gICAgLyogdGhpcyBtdXN0IGJlIHRoZSBzYW1lIHNjYWxpbmcgYXMgdG8gZ2V0IGxpbmVhcntIb3JpLFZlcnR9QWR2YW5jZSAqLwotICAgIC8qIChzZWUgYEZUX0xvYWRfR2x5cGgnIGltcGxlbWVudGF0aW9uIGluIHNyYy9iYXNlL2Z0b2Jqcy5jKSAgICAgICAgKi8KLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCi0gICAgICBhZHZhbmNlc1tubl0gPSBGVF9NdWxEaXYoIGFkdmFuY2VzW25uXSwgc2NhbGUsIDY0ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAgLyogYXQgdGhlIG1vbWVudCwgd2UgY2FuIHBlcmZvcm0gZmFzdCBhZHZhbmNlIHJldHJpZXZhbCBvbmx5IGluICovCi0gICAvKiB0aGUgZm9sbG93aW5nIGNhc2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgLyogIC0gdW5zY2FsZWQgbG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAvKiAgLSB1bmhpbnRlZCBsb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgIC8qICAtIGxpZ2h0LWhpbnRlZCBsb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgLyogIC0gaWYgYSB2YXJpYXRpb25zIGZvbnQsIGl0IG11c3QgaGF2ZSBhbiBgSFZBUicgb3IgYFZWQVInICAgICovCi0gICAvKiAgICB0YWJsZSAodGh1cyB0aGUgb2xkIE1NIG9yIEdYIGZvbnRzIGRvbid0IHF1YWxpZnk7IHRoaXMgICAgKi8KLSAgIC8qICAgIGdldHMgY2hlY2tlZCBieSB0aGUgZHJpdmVyLXNwZWNpZmljIGZ1bmN0aW9ucykgICAgICAgICAgICAqLwotCi0jZGVmaW5lIExPQURfQURWQU5DRV9GQVNUX0NIRUNLKCBmYWNlLCBmbGFncyApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIGZsYWdzICYgKCBGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19ISU5USU5HICkgICAgfHwgXAotICAgICAgICAgICAgRlRfTE9BRF9UQVJHRVRfTU9ERSggZmxhZ3MgKSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCApCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0YWR2YW5jLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9BZHZhbmNlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKnBhZHZhbmNlICkKLSAgewotICAgIEZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jICBmdW5jOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCAhcGFkdmFuY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9JbmRleCApOwotCi0gICAgZnVuYyA9IGZhY2UtPmRyaXZlci0+Y2xhenotPmdldF9hZHZhbmNlczsKLSAgICBpZiAoIGZ1bmMgJiYgTE9BRF9BRFZBTkNFX0ZBU1RfQ0hFQ0soIGZhY2UsIGZsYWdzICkgKQotICAgIHsKLSAgICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgICBlcnJvciA9IGZ1bmMoIGZhY2UsIGdpbmRleCwgMSwgZmxhZ3MsIHBhZHZhbmNlICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHJldHVybiBfZnRfZmFjZV9zY2FsZV9hZHZhbmNlcyggZmFjZSwgcGFkdmFuY2UsIDEsIGZsYWdzICk7Ci0KLSAgICAgIGlmICggRlRfRVJSX05FUSggZXJyb3IsIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIHJldHVybiBGVF9HZXRfQWR2YW5jZXMoIGZhY2UsIGdpbmRleCwgMSwgZmxhZ3MsIHBhZHZhbmNlICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRhZHZhbmMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0FkdmFuY2VzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICpwYWR2YW5jZXMgKQotICB7Ci0gICAgRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMgIGZ1bmM7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgICAgIG51bSwgZW5kLCBubjsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFwYWR2YW5jZXMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBudW0gPSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzOwotICAgIGVuZCA9IHN0YXJ0ICsgY291bnQ7Ci0gICAgaWYgKCBzdGFydCA+PSBudW0gfHwgZW5kIDwgc3RhcnQgfHwgZW5kID4gbnVtICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9JbmRleCApOwotCi0gICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICBmdW5jID0gZmFjZS0+ZHJpdmVyLT5jbGF6ei0+Z2V0X2FkdmFuY2VzOwotICAgIGlmICggZnVuYyAmJiBMT0FEX0FEVkFOQ0VfRkFTVF9DSEVDSyggZmFjZSwgZmxhZ3MgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBmdW5jKCBmYWNlLCBzdGFydCwgY291bnQsIGZsYWdzLCBwYWR2YW5jZXMgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgcmV0dXJuIF9mdF9mYWNlX3NjYWxlX2FkdmFuY2VzKCBmYWNlLCBwYWR2YW5jZXMsIGNvdW50LCBmbGFncyApOwotCi0gICAgICBpZiAoIEZUX0VSUl9ORVEoIGVycm9yLCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGlmICggZmxhZ3MgJiBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0KLSAgICBmbGFncyB8PSAoRlRfVUludDMyKUZUX0xPQURfQURWQU5DRV9PTkxZOwotICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBzdGFydCArIG5uLCBmbGFncyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzY2FsZSBmcm9tIDI2LjYgdG8gMTYuMTYgKi8KLSAgICAgIHBhZHZhbmNlc1tubl0gPSAoIGZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKQotICAgICAgICAgICAgICAgICAgICAgID8gZmFjZS0+Z2x5cGgtPmFkdmFuY2UueSAqIDEwMjQKLSAgICAgICAgICAgICAgICAgICAgICA6IGZhY2UtPmdseXBoLT5hZHZhbmNlLnggKiAxMDI0OwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRhcGkuYyBiL3NyYy9iYXNlL2Z0YXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNjJkMzcuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRhcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGFwaS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTElTVF9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgIEMgTyBNIFAgQSBUIEkgQiBJIEwgSSBUIFkgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IEFQSSAqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfTmV3X01lbW9yeV9TdHJlYW0oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLQotICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sIGJhc2UsIHNpemUgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2Vla19TdHJlYW0oIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIHBvcyApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9Ta2lwX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGRpc3RhbmNlICkKLSAgewotICAgIHJldHVybiBGVF9TdHJlYW1fU2tpcCggc3RyZWFtLCBkaXN0YW5jZSApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZWFkX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIGJ1ZmZlciwgY291bnQgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmVhZF9TdHJlYW1fQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9SZWFkQXQoIHN0cmVhbSwgcG9zLCBidWZmZXIsIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX0V4dHJhY3RfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApCi0gIHsKLSAgICByZXR1cm4gRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSggc3RyZWFtLCBjb3VudCwgcGJ5dGVzICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUmVsZWFzZV9GcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICkKLSAgewotICAgIEZUX1N0cmVhbV9SZWxlYXNlRnJhbWUoIHN0cmVhbSwgcGJ5dGVzICk7Ci0gIH0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9BY2Nlc3NfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9FbnRlckZyYW1lKCBzdHJlYW0sIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfRm9yZ2V0X0ZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9TdHJlYW1fRXhpdEZyYW1lKCBzdHJlYW0gKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRiYXNlLmMgYi9zcmMvYmFzZS9mdGJhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmNzM1OS4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdGJhc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmFzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTaW5nbGUgb2JqZWN0IGxpYnJhcnkgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jZGVmaW5lICBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlICJiYXNlcGljLmMiCi0jaW5jbHVkZSAiZnRhZHZhbmMuYyIKLSNpbmNsdWRlICJmdGNhbGMuYyIKLSNpbmNsdWRlICJmdGRiZ21lbS5jIgotI2luY2x1ZGUgImZ0Z2xvYWRyLmMiCi0jaW5jbHVkZSAiZnRoYXNoLmMiCi0jaW5jbHVkZSAiZnRtYWMuYyIKLSNpbmNsdWRlICJmdG9ianMuYyIKLSNpbmNsdWRlICJmdG91dGxuLmMiCi0jaW5jbHVkZSAiZnRwaWMuYyIKLSNpbmNsdWRlICJmdHJmb3JrLmMiCi0jaW5jbHVkZSAiZnRzbmFtZXMuYyIKLSNpbmNsdWRlICJmdHN0cmVhbS5jIgotI2luY2x1ZGUgImZ0dHJpZ29uLmMiCi0jaW5jbHVkZSAiZnR1dGlsLmMiCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGJhc2UuaCBiL3NyYy9iYXNlL2Z0YmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDcyMjg0Li4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0YmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiYXNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGZ1bmN0aW9ucyB1c2VkIGluIGJhc2UgbW9kdWxlIChzcGVjaWZpY2F0aW9uKS4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA4LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZywgYW5kIHN1enVraSB0b3NoaXlhLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUQkFTRV9IXwotI2RlZmluZSBGVEJBU0VfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogTWFjT1MgcmVzb3VyY2UgZm9yayBjYW5ub3QgZXhjZWVkIDE2TUIgYXQgbGVhc3QgZm9yIENhcmJvbiBjb2RlOyAqLwotICAvKiBzZWUgaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMTMwNDM3ICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX01BQ19SRk9SS19NQVhfTEVOICAweDAwRkZGRkZGVUwKLQotCi0gIC8qIEFzc3VtZSB0aGUgc3RyZWFtIGlzIHNmbnQtd3JhcHBlZCBQUyBUeXBlMSBvciBzZm50LXdyYXBwZWQgQ0lELWtleWVkICovCi0gIC8qIGZvbnQsIGFuZCB0cnkgdG8gbG9hZCBhIGZhY2Ugc3BlY2lmaWVkIGJ5IHRoZSBmYWNlX2luZGV4LiAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIgICpwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICphZmFjZSApOwotCi0KLSAgLyogQ3JlYXRlIGEgbmV3IEZUX0ZhY2UgZ2l2ZW4gYSBidWZmZXIgYW5kIGEgZHJpdmVyIG5hbWUuICovCi0gIC8qIEZyb20gZnRtYWMuYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBkcml2ZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAqYWZhY2UgKTsKLQotCi0jaWYgIGRlZmluZWQoIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksgKSAmJiBcCi0gICAgIWRlZmluZWQoIEZUX01BQ0lOVE9TSCApCi0gIC8qIE1hYyBPUyBYL0RhcndpbiBrZXJuZWwgb2Z0ZW4gY2hhbmdlcyByZWNvbW1lbmRlZCBtZXRob2QgdG8gYWNjZXNzICovCi0gIC8qIHRoZSByZXNvdXJjZSBmb3JrIGFuZCBvbGRlciBtZXRob2RzIG1ha2VzIHRoZSBrZXJuZWwgaXNzdWUgdGhlICAgICovCi0gIC8qIHdhcm5pbmcgb2YgZGVwcmVjYXRlZCBtZXRob2QuICBUbyBjYWxtIGl0IGRvd24sIHRoZSBtZXRob2RzIGJhc2VkICovCi0gIC8qIG9uIERhcndpbiBWRlMgc2hvdWxkIGJlIGdyb3VwZWQgYW5kIHNraXAgdGhlIHJlc3QgbWV0aG9kcyBhZnRlciAgICovCi0gIC8qIHRoZSBjYXNlIHRoZSByZXNvdXJjZSBpcyBvcGVuZWQgYnV0IGZvdW5kIHRvIGxhY2sgYSBmb250IGluIGl0LiAgICovCi0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgZnRfcmFjY2Vzc19ydWxlX2J5X2Rhcndpbl92ZnMoIEZUX0xpYnJhcnkgbGlicmFyeSwgRlRfVUludCAgcnVsZV9pbmRleCApOwotI2VuZGlmCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRCQVNFX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGJib3guYyBiL3NyYy9iYXNlL2Z0YmJveC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTE5ZGE2Li4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0YmJveC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmJveC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBiYm94IGNvbXB1dGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCi0vKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGhhcyBhIF9zaW5nbGVfIHJvbGU6IHRvIGNvbXB1dGUgZXhhY3Qgb3V0bGluZSBib3VuZGluZyAqLwotICAvKiBib3hlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9CQk9YX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUQkJveF9SZWNfCi0gIHsKLSAgICBGVF9WZWN0b3IgIGxhc3Q7Ci0gICAgRlRfQkJveCAgICBiYm94OwotCi0gIH0gVEJCb3hfUmVjOwotCi0KLSNkZWZpbmUgRlRfVVBEQVRFX0JCT1goIHAsIGJib3ggKSBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggcC0+eCA8IGJib3gueE1pbiApICAgICAgIFwKLSAgICAgIGJib3gueE1pbiA9IHAtPng7ICAgICAgICAgICBcCi0gICAgaWYgKCBwLT54ID4gYmJveC54TWF4ICkgICAgICAgXAotICAgICAgYmJveC54TWF4ID0gcC0+eDsgICAgICAgICAgIFwKLSAgICBpZiAoIHAtPnkgPCBiYm94LnlNaW4gKSAgICAgICBcCi0gICAgICBiYm94LnlNaW4gPSBwLT55OyAgICAgICAgICAgXAotICAgIGlmICggcC0+eSA+IGJib3gueU1heCApICAgICAgIFwKLSAgICAgIGJib3gueU1heCA9IHAtPnk7ICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZGVmaW5lIENIRUNLX1goIHAsIGJib3ggKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBwLT54IDwgYmJveC54TWluIHx8IHAtPnggPiBiYm94LnhNYXggKQotCi0jZGVmaW5lIENIRUNLX1koIHAsIGJib3ggKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBwLT55IDwgYmJveC55TWluIHx8IHAtPnkgPiBiYm94LnlNYXggKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkJveF9Nb3ZlX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgYG1vdmVfdG8nIGVtaXR0ZXIgZHVyaW5nICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlKCkuICBJdCBzaW1wbHkgcmVjb3JkcyB0aGUgZGVzdGluYXRpb24gcG9pbnQgICAqLwotICAvKiAgICBpbiBgdXNlci0+bGFzdCcuIFdlIGFsc28gdXBkYXRlIGJib3ggaW4gY2FzZSBjb250b3VyIHN0YXJ0cyB3aXRoICAgKi8KLSAgLyogICAgYW4gaW1wbGljaXQgYG9uJyBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICA6OiBBIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWx3YXlzIDAuICBOZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2Ugb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgaW50Ci0gIEJCb3hfTW92ZV9UbyggRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgVEJCb3hfUmVjKiAgdXNlciApCi0gIHsKLSAgICBGVF9VUERBVEVfQkJPWCggdG8sIHVzZXItPmJib3ggKTsKLQotICAgIHVzZXItPmxhc3QgPSAqdG87Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkJveF9MaW5lX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgYGxpbmVfdG8nIGVtaXR0ZXIgZHVyaW5nICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlKCkuICBJdCBzaW1wbHkgcmVjb3JkcyB0aGUgZGVzdGluYXRpb24gcG9pbnQgICAqLwotICAvKiAgICBpbiBgdXNlci0+bGFzdCc7IG5vIGZ1cnRoZXIgY29tcHV0YXRpb25zIGFyZSBuZWNlc3NhcnkgYmVjYXVzZSAgICAgKi8KLSAgLyogICAgYmJveCBhbHJlYWR5IGNvbnRhaW5zIGJvdGggZXhwbGljaXQgZW5kcyBvZiB0aGUgbGluZSBzZWdtZW50LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICA6OiBBIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWx3YXlzIDAuICBOZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2Ugb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgaW50Ci0gIEJCb3hfTGluZV9UbyggRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgVEJCb3hfUmVjKiAgdXNlciApCi0gIHsKLSAgICB1c2VyLT5sYXN0ID0gKnRvOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJCb3hfQ29uaWNfQ2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmQgdGhlIGV4dHJlbWEgb2YgYSAxLWRpbWVuc2lvbmFsIGNvbmljIEJlemllciBjdXJ2ZSBhbmQgdXBkYXRlICAqLwotICAvKiAgICBhIGJvdW5kaW5nIHJhbmdlLiAgVGhpcyB2ZXJzaW9uIHVzZXMgZGlyZWN0IGNvbXB1dGF0aW9uLCBhcyBpdCAgICAgKi8KLSAgLyogICAgZG9lc24ndCBuZWVkIHNxdWFyZSByb290cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTEgIDo6IFRoZSBzdGFydCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MiAgOjogVGhlIGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkzICA6OiBUaGUgZW5kIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbiA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtaW5pbXVtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4IDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IG1heGltdW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBCQm94X0NvbmljX0NoZWNrKCBGVF9Qb3MgICB5MSwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgeTIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgIHkzLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtaW4sCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyogIG1heCApCi0gIHsKLSAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIHdoZW4gYSBjb250cm9sIG9mZi1wb2ludCBpcyBvdXRzaWRlICovCi0gICAgLyogdGhlIGJib3ggdGhhdCBjb250YWlucyBhbGwgb24tcG9pbnRzLiAgSXQgZmluZHMgYSBsb2NhbCBleHRyZW11bSAqLwotICAgIC8qIHdpdGhpbiB0aGUgc2VnbWVudCwgZXF1YWwgdG8gKHkxKnkzIC0geTIqeTIpLyh5MSAtIDIqeTIgKyB5MykuICAgKi8KLSAgICAvKiBPciwgb2Zmc2V0dGluZyBmcm9tIHkyLCB3ZSBnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB5MSAtPSB5MjsKLSAgICB5MyAtPSB5MjsKLSAgICB5MiArPSBGVF9NdWxEaXYoIHkxLCB5MywgeTEgKyB5MyApOwotCi0gICAgaWYgKCB5MiA8ICptaW4gKQotICAgICAgKm1pbiA9IHkyOwotICAgIGlmICggeTIgPiAqbWF4ICkKLSAgICAgICptYXggPSB5MjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkJveF9Db25pY19UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgYGNvbmljX3RvJyBlbWl0dGVyIGR1cmluZyAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlKCkuICBJdCBjaGVja3MgYSBjb25pYyBCZXppZXIgY3VydmUgd2l0aCB0aGUgICAqLwotICAvKiAgICBjdXJyZW50IGJvdW5kaW5nIGJveCwgYW5kIGNvbXB1dGVzIGl0cyBleHRyZW1hIGlmIG5lY2Vzc2FyeSB0byAgICAgKi8KLSAgLyogICAgdXBkYXRlIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbCA6OiBBIHBvaW50ZXIgdG8gYSBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IHdhbGsgY29udGV4dC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbHdheXMgMC4gIE5lZWRlZCBmb3IgdGhlIGludGVyZmFjZSBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbiB0aGUgY2FzZSBvZiBhIG5vbi1tb25vdG9ub3VzIGFyYywgd2UgY29tcHV0ZSBkaXJlY3RseSB0aGUgICAgICAgKi8KLSAgLyogICAgZXh0cmVtdW0gY29vcmRpbmF0ZXMsIGFzIGl0IGlzIHN1ZmZpY2llbnRseSBmYXN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgaW50Ci0gIEJCb3hfQ29uaWNfVG8oIEZUX1ZlY3RvciogIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICBUQkJveF9SZWMqICB1c2VyICkKLSAgewotICAgIC8qIGluIGNhc2UgYHRvJyBpcyBpbXBsaWNpdCBhbmQgbm90IGluY2x1ZGVkIGluIGJib3ggeWV0ICovCi0gICAgRlRfVVBEQVRFX0JCT1goIHRvLCB1c2VyLT5iYm94ICk7Ci0KLSAgICBpZiAoIENIRUNLX1goIGNvbnRyb2wsIHVzZXItPmJib3ggKSApCi0gICAgICBCQm94X0NvbmljX0NoZWNrKCB1c2VyLT5sYXN0LngsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgdG8tPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC54TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueE1heCApOwotCi0gICAgaWYgKCBDSEVDS19ZKCBjb250cm9sLCB1c2VyLT5iYm94ICkgKQotICAgICAgQkJveF9Db25pY19DaGVjayggdXNlci0+bGFzdC55LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvLT55LAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueU1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnlNYXggKTsKLQotICAgIHVzZXItPmxhc3QgPSAqdG87Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkJveF9DdWJpY19DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluZCB0aGUgZXh0cmVtYSBvZiBhIDEtZGltZW5zaW9uYWwgY3ViaWMgQmV6aWVyIGN1cnZlIGFuZCAgICAgICAgICovCi0gIC8qICAgIHVwZGF0ZSBhIGJvdW5kaW5nIHJhbmdlLiAgVGhpcyB2ZXJzaW9uIHVzZXMgaXRlcmF0aXZlIHNwbGl0dGluZyAgICAqLwotICAvKiAgICBiZWNhdXNlIGl0IGlzIGZhc3RlciB0aGFuIHRoZSBleGFjdCBzb2x1dGlvbiB3aXRoIHNxdWFyZSByb290cy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwMSAgOjogVGhlIHN0YXJ0IGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHAyICA6OiBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcDMgIDo6IFRoZSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwNCAgOjogVGhlIGVuZCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW4gOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWluaW11bS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtYXhpbXVtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX1BvcwotICBjdWJpY19wZWFrKCBGVF9Qb3MgIHExLAotICAgICAgICAgICAgICBGVF9Qb3MgIHEyLAotICAgICAgICAgICAgICBGVF9Qb3MgIHEzLAotICAgICAgICAgICAgICBGVF9Qb3MgIHE0ICkKLSAgewotICAgIEZUX1BvcyAgcGVhayA9IDA7Ci0gICAgRlRfSW50ICBzaGlmdDsKLQotCi0gICAgLyogVGhpcyBmdW5jdGlvbiBmaW5kcyBhIHBlYWsgb2YgYSBjdWJpYyBzZWdtZW50IGlmIGl0IGlzIGFib3ZlIDAgICAgKi8KLSAgICAvKiB1c2luZyBpdGVyYXRpdmUgYmlzZWN0aW9uIG9mIHRoZSBzZWdtZW50LCBvciByZXR1cm5zIDAuICAgICAgICAgICAqLwotICAgIC8qIFRoZSBmaXhlZC1wb2ludCBhcml0aG1ldGljIG9mIGJpc2VjdGlvbiBpcyBpbmhlcmVudGx5IHN0YWJsZSAgICAgICovCi0gICAgLyogYnV0IG1heSBsb29zZSBhY2N1cmFjeSBpbiB0aGUgdHdvIGxvd2VzdCBiaXRzLiAgVG8gY29tcGVuc2F0ZSwgICAgKi8KLSAgICAvKiB3ZSB1cHNjYWxlIHRoZSBzZWdtZW50IGlmIHRoZXJlIGlzIHJvb20uICBMYXJnZSB2YWx1ZXMgbWF5IG5lZWQgICAqLwotICAgIC8qIHRvIGJlIGRvd25zY2FsZWQgdG8gYXZvaWQgb3ZlcmZsb3dzIGR1cmluZyBiaXNlY3Rpb24uICAgICAgICAgICAgICovCi0gICAgLyogSXQgaXMgY2FsbGVkIHdpdGggZWl0aGVyIHEyIG9yIHEzIHBvc2l0aXZlLCB3aGljaCBpcyBuZWNlc3NhcnkgICAgKi8KLSAgICAvKiBmb3IgdGhlIHBlYWsgdG8gZXhpc3QgYW5kIGF2b2lkcyB1bmRlZmluZWQgRlRfTVNCLiAgICAgICAgICAgICAgICAqLwotCi0gICAgc2hpZnQgPSAyNyAtIEZUX01TQiggKEZUX1VJbnQzMikoIEZUX0FCUyggcTEgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FCUyggcTIgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FCUyggcTMgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FCUyggcTQgKSApICk7Ci0KLSAgICBpZiAoIHNoaWZ0ID4gMCApCi0gICAgewotICAgICAgLyogdXBzY2FsaW5nIHRvbyBtdWNoIGp1c3Qgd2FzdGVzIHRpbWUgKi8KLSAgICAgIGlmICggc2hpZnQgPiAyICkKLSAgICAgICAgc2hpZnQgPSAyOwotCi0gICAgICBxMSA8PD0gIHNoaWZ0OwotICAgICAgcTIgPDw9ICBzaGlmdDsKLSAgICAgIHEzIDw8PSAgc2hpZnQ7Ci0gICAgICBxNCA8PD0gIHNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcTEgPj49IC1zaGlmdDsKLSAgICAgIHEyID4+PSAtc2hpZnQ7Ci0gICAgICBxMyA+Pj0gLXNoaWZ0OwotICAgICAgcTQgPj49IC1zaGlmdDsKLSAgICB9Ci0KLSAgICAvKiBmb3IgYSBwZWFrIHRvIGV4aXN0IGFib3ZlIDAsIHRoZSBjdWJpYyBzZWdtZW50IG11c3QgaGF2ZSAqLwotICAgIC8qIGF0IGxlYXN0IG9uZSBvZiBpdHMgY29udHJvbCBvZmYtcG9pbnRzIGFib3ZlIDAuICAgICAgICAgICovCi0gICAgd2hpbGUgKCBxMiA+IDAgfHwgcTMgPiAwICkKLSAgICB7Ci0gICAgICAvKiBkZXRlcm1pbmUgd2hpY2ggaGFsZiBjb250YWlucyB0aGUgbWF4aW11bSBhbmQgc3BsaXQgKi8KLSAgICAgIGlmICggcTEgKyBxMiA+IHEzICsgcTQgKSAvKiBmaXJzdCBoYWxmICovCi0gICAgICB7Ci0gICAgICAgIHE0ID0gcTQgKyBxMzsKLSAgICAgICAgcTMgPSBxMyArIHEyOwotICAgICAgICBxMiA9IHEyICsgcTE7Ci0gICAgICAgIHE0ID0gcTQgKyBxMzsKLSAgICAgICAgcTMgPSBxMyArIHEyOwotICAgICAgICBxNCA9ICggcTQgKyBxMyApIC8gODsKLSAgICAgICAgcTMgPSBxMyAvIDQ7Ci0gICAgICAgIHEyID0gcTIgLyAyOwotICAgICAgfQotICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBoYWxmICovCi0gICAgICB7Ci0gICAgICAgIHExID0gcTEgKyBxMjsKLSAgICAgICAgcTIgPSBxMiArIHEzOwotICAgICAgICBxMyA9IHEzICsgcTQ7Ci0gICAgICAgIHExID0gcTEgKyBxMjsKLSAgICAgICAgcTIgPSBxMiArIHEzOwotICAgICAgICBxMSA9ICggcTEgKyBxMiApIC8gODsKLSAgICAgICAgcTIgPSBxMiAvIDQ7Ci0gICAgICAgIHEzID0gcTMgLyAyOwotICAgICAgfQotCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIGVpdGhlciBlbmQgcmVhY2hlZCB0aGUgbWF4aW11bSAqLwotICAgICAgaWYgKCBxMSA9PSBxMiAmJiBxMSA+PSBxMyApCi0gICAgICB7Ci0gICAgICAgIHBlYWsgPSBxMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoIHEzID09IHE0ICYmIHEyIDw9IHE0ICkKLSAgICAgIHsKLSAgICAgICAgcGVhayA9IHE0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHNoaWZ0ID4gMCApCi0gICAgICBwZWFrID4+PSAgc2hpZnQ7Ci0gICAgZWxzZQotICAgICAgcGVhayA8PD0gLXNoaWZ0OwotCi0gICAgcmV0dXJuIHBlYWs7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEJCb3hfQ3ViaWNfQ2hlY2soIEZUX1BvcyAgIHAxLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICBwMiwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgcDMsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgIHA0LAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtaW4sCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyogIG1heCApCi0gIHsKLSAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIHdoZW4gYSBjb250cm9sIG9mZi1wb2ludCBpcyBvdXRzaWRlICAqLwotICAgIC8qIHRoZSBiYm94IHRoYXQgY29udGFpbnMgYWxsIG9uLXBvaW50cy4gIFNvIGF0IGxlYXN0IG9uZSBvZiB0aGUgICAgICovCi0gICAgLyogY29uZGl0aW9ucyBiZWxvdyBob2xkcyBhbmQgY3ViaWNfcGVhayBpcyBjYWxsZWQgd2l0aCBhdCBsZWFzdCBvbmUgKi8KLSAgICAvKiBub24temVybyBhcmd1bWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBwMiA+ICptYXggfHwgcDMgPiAqbWF4ICkKLSAgICAgICptYXggKz0gY3ViaWNfcGVhayggcDEgLSAqbWF4LCBwMiAtICptYXgsIHAzIC0gKm1heCwgcDQgLSAqbWF4ICk7Ci0KLSAgICAvKiBub3cgZmxpcCB0aGUgc2lnbnMgdG8gdXBkYXRlIHRoZSBtaW5pbXVtICovCi0gICAgaWYgKCBwMiA8ICptaW4gfHwgcDMgPCAqbWluICkKLSAgICAgICptaW4gLT0gY3ViaWNfcGVhayggKm1pbiAtIHAxLCAqbWluIC0gcDIsICptaW4gLSBwMywgKm1pbiAtIHA0ICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJCb3hfQ3ViaWNfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBjdWJpY190bycgZW1pdHRlciBkdXJpbmcgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSgpLiAgSXQgY2hlY2tzIGEgY3ViaWMgQmV6aWVyIGN1cnZlIHdpdGggdGhlICAgKi8KLSAgLyogICAgY3VycmVudCBib3VuZGluZyBib3gsIGFuZCBjb21wdXRlcyBpdHMgZXh0cmVtYSBpZiBuZWNlc3NhcnkgdG8gICAgICovCi0gIC8qICAgIHVwZGF0ZSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2wxIDo6IEEgcG9pbnRlciB0byB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbDIgOjogQSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgICA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCB3YWxrIGNvbnRleHQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbHdheXMgMC4gIE5lZWRlZCBmb3IgdGhlIGludGVyZmFjZSBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbiB0aGUgY2FzZSBvZiBhIG5vbi1tb25vdG9ub3VzIGFyYywgd2UgZG9uJ3QgY29tcHV0ZSBkaXJlY3RseSAgICAgKi8KLSAgLyogICAgZXh0cmVtdW0gY29vcmRpbmF0ZXMsIHdlIHN1YmRpdmlkZSBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgaW50Ci0gIEJCb3hfQ3ViaWNfVG8oIEZUX1ZlY3RvciogIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgIFRCQm94X1JlYyogIHVzZXIgKQotICB7Ci0gICAgLyogV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBgdG8nIHNpbmNlIGl0IGlzIGFsd2F5cyBhbiBvbi1wb2ludCwgICAgKi8KLSAgICAvKiB0aHVzIHdpdGhpbiB0aGUgYmJveC4gIE9ubHkgc2VnbWVudHMgd2l0aCBhbiBvZmYtcG9pbnQgb3V0c2lkZSAqLwotICAgIC8qIHRoZSBiYm94IGNhbiBwb3NzaWJseSByZWFjaCBuZXcgZXh0cmVtZSB2YWx1ZXMuICAgICAgICAgICAgICAgICovCi0KLSAgICBpZiAoIENIRUNLX1goIGNvbnRyb2wxLCB1c2VyLT5iYm94ICkgfHwKLSAgICAgICAgIENIRUNLX1goIGNvbnRyb2wyLCB1c2VyLT5iYm94ICkgKQotICAgICAgQkJveF9DdWJpY19DaGVjayggdXNlci0+bGFzdC54LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDEtPngsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sMi0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnhNYXggKTsKLQotICAgIGlmICggQ0hFQ0tfWSggY29udHJvbDEsIHVzZXItPmJib3ggKSB8fAotICAgICAgICAgQ0hFQ0tfWSggY29udHJvbDIsIHVzZXItPmJib3ggKSApCi0gICAgICBCQm94X0N1YmljX0NoZWNrKCB1c2VyLT5sYXN0LnksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sMS0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wyLT55LAotICAgICAgICAgICAgICAgICAgICAgICAgdG8tPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC55TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueU1heCApOwotCi0gICAgdXNlci0+bGFzdCA9ICp0bzsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9ERUZJTkVfT1VUTElORV9GVU5DUygKLSAgICBiYm94X2ludGVyZmFjZSwKLQotICAgIChGVF9PdXRsaW5lX01vdmVUb19GdW5jKSBCQm94X01vdmVfVG8sICAgLyogbW92ZV90byAgKi8KLSAgICAoRlRfT3V0bGluZV9MaW5lVG9fRnVuYykgQkJveF9MaW5lX1RvLCAgIC8qIGxpbmVfdG8gICovCi0gICAgKEZUX091dGxpbmVfQ29uaWNUb19GdW5jKUJCb3hfQ29uaWNfVG8sICAvKiBjb25pY190byAqLwotICAgIChGVF9PdXRsaW5lX0N1YmljVG9fRnVuYylCQm94X0N1YmljX1RvLCAgLyogY3ViaWNfdG8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0ICAgICovCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWx0YSAgICAqLwotICApCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0YmJveC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0dldF9CQm94KCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCAgICAgKmFiYm94ICkKLSAgewotICAgIEZUX0JCb3ggICAgIGNib3ggPSB7ICAweDdGRkZGRkZGTCwgIDB4N0ZGRkZGRkZMLAotICAgICAgICAgICAgICAgICAgICAgICAgIC0weDdGRkZGRkZGTCwgLTB4N0ZGRkZGRkZMIH07Ci0gICAgRlRfQkJveCAgICAgYmJveCA9IHsgIDB4N0ZGRkZGRkZMLCAgMHg3RkZGRkZGRkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLTB4N0ZGRkZGRkZMLCAtMHg3RkZGRkZGRkwgfTsKLSAgICBGVF9WZWN0b3IqICB2ZWM7Ci0gICAgRlRfVVNob3J0ICAgbjsKLQotCi0gICAgaWYgKCAhYWJib3ggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICAvKiBpZiBvdXRsaW5lIGlzIGVtcHR5LCByZXR1cm4gKDAsMCwwLDApICovCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwIHx8IG91dGxpbmUtPm5fY29udG91cnMgPD0gMCApCi0gICAgewotICAgICAgYWJib3gtPnhNaW4gPSBhYmJveC0+eE1heCA9IDA7Ci0gICAgICBhYmJveC0+eU1pbiA9IGFiYm94LT55TWF4ID0gMDsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogV2UgY29tcHV0ZSB0aGUgY29udHJvbCBib3ggYXMgd2VsbCBhcyB0aGUgYm91bmRpbmcgYm94IG9mICAqLwotICAgIC8qIGFsbCBgb24nIHBvaW50cyBpbiB0aGUgb3V0bGluZS4gIFRoZW4sIGlmIHRoZSB0d28gYm94ZXMgICAgKi8KLSAgICAvKiBjb2luY2lkZSwgd2UgZXhpdCBpbW1lZGlhdGVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB2ZWMgPSBvdXRsaW5lLT5wb2ludHM7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IG91dGxpbmUtPm5fcG9pbnRzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX1VQREFURV9CQk9YKCB2ZWMsIGNib3ggKTsKLQotICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUtPnRhZ3Nbbl0gKSA9PSBGVF9DVVJWRV9UQUdfT04gKQotICAgICAgICBGVF9VUERBVEVfQkJPWCggdmVjLCBiYm94ICk7Ci0KLSAgICAgIHZlYysrOwotICAgIH0KLQotICAgIC8qIHRlc3QgdHdvIGJveGVzIGZvciBlcXVhbGl0eSAqLwotICAgIGlmICggY2JveC54TWluIDwgYmJveC54TWluIHx8IGNib3gueE1heCA+IGJib3gueE1heCB8fAotICAgICAgICAgY2JveC55TWluIDwgYmJveC55TWluIHx8IGNib3gueU1heCA+IGJib3gueU1heCApCi0gICAgewotICAgICAgLyogdGhlIHR3byBib3hlcyBhcmUgZGlmZmVyZW50LCBub3cgd2FsayBvdmVyIHRoZSBvdXRsaW5lIHRvICovCi0gICAgICAvKiBnZXQgdGhlIEJlemllciBhcmMgZXh0cmVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICAgIFRCQm94X1JlYyAgdXNlcjsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgICBGVF9PdXRsaW5lX0Z1bmNzICBiYm94X2ludGVyZmFjZTsKLQotCi0gICAgICBJbml0X0NsYXNzX2Jib3hfaW50ZXJmYWNlKCAmYmJveF9pbnRlcmZhY2UgKTsKLSNlbmRpZgotCi0gICAgICB1c2VyLmJib3ggPSBiYm94OwotCi0gICAgICBlcnJvciA9IEZUX091dGxpbmVfRGVjb21wb3NlKCBvdXRsaW5lLCAmYmJveF9pbnRlcmZhY2UsICZ1c2VyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAqYWJib3ggPSB1c2VyLmJib3g7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICphYmJveCA9IGJib3g7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGJkZi5jIGIvc3JjL2Jhc2UvZnRiZGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmMGNhMi4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdGJkZi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiZGYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIEJERi1zcGVjaWZpYyBzdHJpbmdzIChib2R5KS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0JERl9ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0YmRmLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9CREZfQ2hhcnNldF9JRCggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9yZWdpc3RyeSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgY29uc3QgY2hhciogIGVuY29kaW5nID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiAgcmVnaXN0cnkgPSBOVUxMOwotCi0gICAgRlRfU2VydmljZV9CREYgIHNlcnZpY2U7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgQkRGICk7Ci0KLSAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+Z2V0X2NoYXJzZXRfaWQgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfY2hhcnNldF9pZCggZmFjZSwgJmVuY29kaW5nLCAmcmVnaXN0cnkgKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIGFjaGFyc2V0X2VuY29kaW5nICkKLSAgICAgICphY2hhcnNldF9lbmNvZGluZyA9IGVuY29kaW5nOwotCi0gICAgaWYgKCBhY2hhcnNldF9yZWdpc3RyeSApCi0gICAgICAqYWNoYXJzZXRfcmVnaXN0cnkgPSByZWdpc3RyeTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJkZi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfQkRGX1Byb3BlcnR5KCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICBwcm9wX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIEJERl9Qcm9wZXJ0eVJlYyAgKmFwcm9wZXJ0eSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICBGVF9TZXJ2aWNlX0JERiAgc2VydmljZTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFwcm9wZXJ0eSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGFwcm9wZXJ0eS0+dHlwZSA9IEJERl9QUk9QRVJUWV9UWVBFX05PTkU7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgQkRGICk7Ci0KLSAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+Z2V0X3Byb3BlcnR5ICkKLSAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X3Byb3BlcnR5KCBmYWNlLCBwcm9wX25hbWUsIGFwcm9wZXJ0eSApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRiaXRtYXAuYyBiL3NyYy9iYXNlL2Z0Yml0bWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Yzg4YzQuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRiaXRtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJpdG1hcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGJpdG1hcHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotI2luY2x1ZGUgRlRfSU1BR0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotICBzdGF0aWMKLSAgY29uc3QgRlRfQml0bWFwICBudWxsX2JpdG1hcCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJpdG1hcC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0JpdG1hcF9Jbml0KCBGVF9CaXRtYXAgICphYml0bWFwICkKLSAgewotICAgIGlmICggYWJpdG1hcCApCi0gICAgICAqYWJpdG1hcCA9IG51bGxfYml0bWFwOwotICB9Ci0KLQotICAvKiBkZXByZWNhdGVkIGZ1bmN0aW9uIG5hbWU7IHJldGFpbmVkIGZvciBBQkkgY29tcGF0aWJpbGl0eSAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9CaXRtYXBfTmV3KCBGVF9CaXRtYXAgICphYml0bWFwICkKLSAgewotICAgIGlmICggYWJpdG1hcCApCi0gICAgICAqYWJpdG1hcCA9IG51bGxfYml0bWFwOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Yml0bWFwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0JpdG1hcF9Db3B5KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQml0bWFwICAqc291cmNlLAotICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAgICAgICAqdGFyZ2V0KQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLSAgICBGVF9JbnQgICAgcGl0Y2g7Ci0gICAgRlRfVUxvbmcgIHNpemU7Ci0KLSAgICBGVF9JbnQgIHNvdXJjZV9waXRjaF9zaWduLCB0YXJnZXRfcGl0Y2hfc2lnbjsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIXNvdXJjZSB8fCAhdGFyZ2V0ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBzb3VyY2UgPT0gdGFyZ2V0ICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICBzb3VyY2VfcGl0Y2hfc2lnbiA9IHNvdXJjZS0+cGl0Y2ggPCAwID8gLTEgOiAxOwotICAgIHRhcmdldF9waXRjaF9zaWduID0gdGFyZ2V0LT5waXRjaCA8IDAgPyAtMSA6IDE7Ci0KLSAgICBpZiAoICFzb3VyY2UtPmJ1ZmZlciApCi0gICAgewotICAgICAgKnRhcmdldCA9ICpzb3VyY2U7Ci0gICAgICBpZiAoIHNvdXJjZV9waXRjaF9zaWduICE9IHRhcmdldF9waXRjaF9zaWduICkKLSAgICAgICAgdGFyZ2V0LT5waXRjaCA9IC10YXJnZXQtPnBpdGNoOwotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBwaXRjaCAgPSBzb3VyY2UtPnBpdGNoOwotCi0gICAgaWYgKCBwaXRjaCA8IDAgKQotICAgICAgcGl0Y2ggPSAtcGl0Y2g7Ci0gICAgc2l6ZSA9IChGVF9VTG9uZylwaXRjaCAqIHNvdXJjZS0+cm93czsKLQotICAgIGlmICggdGFyZ2V0LT5idWZmZXIgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICB0YXJnZXRfcGl0Y2ggPSB0YXJnZXQtPnBpdGNoOwotICAgICAgRlRfVUxvbmcgIHRhcmdldF9zaXplOwotCi0KLSAgICAgIGlmICggdGFyZ2V0X3BpdGNoIDwgMCApCi0gICAgICAgIHRhcmdldF9waXRjaCA9IC10YXJnZXRfcGl0Y2g7Ci0gICAgICB0YXJnZXRfc2l6ZSA9IChGVF9VTG9uZyl0YXJnZXRfcGl0Y2ggKiB0YXJnZXQtPnJvd3M7Ci0KLSAgICAgIGlmICggdGFyZ2V0X3NpemUgIT0gc2l6ZSApCi0gICAgICAgICh2b2lkKUZUX1FSRUFMTE9DKCB0YXJnZXQtPmJ1ZmZlciwgdGFyZ2V0X3NpemUsIHNpemUgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgKHZvaWQpRlRfUUFMTE9DKCB0YXJnZXQtPmJ1ZmZlciwgc2l6ZSApOwotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0KLQotICAgICAgcCA9IHRhcmdldC0+YnVmZmVyOwotICAgICAgKnRhcmdldCA9ICpzb3VyY2U7Ci0gICAgICB0YXJnZXQtPmJ1ZmZlciA9IHA7Ci0KLSAgICAgIGlmICggc291cmNlX3BpdGNoX3NpZ24gPT0gdGFyZ2V0X3BpdGNoX3NpZ24gKQotICAgICAgICBGVF9NRU1fQ09QWSggdGFyZ2V0LT5idWZmZXIsIHNvdXJjZS0+YnVmZmVyLCBzaXplICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHRha2UgY2FyZSBvZiBiaXRtYXAgZmxvdyAqLwotICAgICAgICBGVF9VSW50ICAgaTsKLSAgICAgICAgRlRfQnl0ZSogIHMgPSBzb3VyY2UtPmJ1ZmZlcjsKLSAgICAgICAgRlRfQnl0ZSogIHQgPSB0YXJnZXQtPmJ1ZmZlcjsKLQotCi0gICAgICAgIHQgKz0gKEZUX1VMb25nKXBpdGNoICogKCB0YXJnZXQtPnJvd3MgLSAxICk7Ci0KLSAgICAgICAgZm9yICggaSA9IHRhcmdldC0+cm93czsgaSA+IDA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9BUlJBWV9DT1BZKCB0LCBzLCBwaXRjaCApOwotCi0gICAgICAgICAgcyArPSBwaXRjaDsKLSAgICAgICAgICB0IC09IHBpdGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBFbmxhcmdlIGBiaXRtYXAnIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseSBieSBgeHBpeGVscycgKi8KLSAgLyogYW5kIGB5cGl4ZWxzJywgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKCBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAqICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICB4cGl4ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgeXBpeGVscyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgaW50ICAgICAgICAgICAgIHBpdGNoOwotICAgIGludCAgICAgICAgICAgICBuZXdfcGl0Y2g7Ci0gICAgRlRfVUludCAgICAgICAgIGJwcDsKLSAgICBGVF9VSW50ICAgICAgICAgaSwgd2lkdGgsIGhlaWdodDsKLSAgICB1bnNpZ25lZCBjaGFyKiAgYnVmZmVyID0gTlVMTDsKLQotCi0gICAgd2lkdGggID0gYml0bWFwLT53aWR0aDsKLSAgICBoZWlnaHQgPSBiaXRtYXAtPnJvd3M7Ci0gICAgcGl0Y2ggID0gYml0bWFwLT5waXRjaDsKLSAgICBpZiAoIHBpdGNoIDwgMCApCi0gICAgICBwaXRjaCA9IC1waXRjaDsKLQotICAgIHN3aXRjaCAoIGJpdG1hcC0+cGl4ZWxfbW9kZSApCi0gICAgewotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9NT05POgotICAgICAgYnBwICAgICAgID0gMTsKLSAgICAgIG5ld19waXRjaCA9IChpbnQpKCAoIHdpZHRoICsgeHBpeGVscyArIDcgKSA+PiAzICk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTI6Ci0gICAgICBicHAgICAgICAgPSAyOwotICAgICAgbmV3X3BpdGNoID0gKGludCkoICggd2lkdGggKyB4cGl4ZWxzICsgMyApID4+IDIgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZNDoKLSAgICAgIGJwcCAgICAgICA9IDQ7Ci0gICAgICBuZXdfcGl0Y2ggPSAoaW50KSggKCB3aWR0aCArIHhwaXhlbHMgKyAxICkgPj4gMSApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVk6Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRDoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfTENEX1Y6Ci0gICAgICBicHAgICAgICAgPSA4OwotICAgICAgbmV3X3BpdGNoID0gKGludCkoIHdpZHRoICsgeHBpeGVscyApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICAvKiBpZiBubyBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGlmICggeXBpeGVscyA9PSAwICYmIG5ld19waXRjaCA8PSBwaXRjaCApCi0gICAgewotICAgICAgLyogemVybyB0aGUgcGFkZGluZyAqLwotICAgICAgRlRfVUludCAgYml0X3dpZHRoID0gKEZUX1VJbnQpcGl0Y2ggKiA4OwotICAgICAgRlRfVUludCAgYml0X2xhc3QgID0gKCB3aWR0aCArIHhwaXhlbHMgKSAqIGJwcDsKLQotCi0gICAgICBpZiAoIGJpdF9sYXN0IDwgYml0X3dpZHRoICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIGxpbmUgID0gYml0bWFwLT5idWZmZXIgKyAoIGJpdF9sYXN0ID4+IDMgKTsKLSAgICAgICAgRlRfQnl0ZSogIGVuZCAgID0gYml0bWFwLT5idWZmZXIgKyBwaXRjaDsKLSAgICAgICAgRlRfVUludCAgIHNoaWZ0ID0gYml0X2xhc3QgJiA3OwotICAgICAgICBGVF9VSW50ICAgbWFzayAgPSAweEZGMDBVID4+IHNoaWZ0OwotICAgICAgICBGVF9VSW50ICAgY291bnQgPSBoZWlnaHQ7Ci0KLQotICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgbGluZSArPSBwaXRjaCwgZW5kICs9IHBpdGNoICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICB3cml0ZSA9IGxpbmU7Ci0KLQotICAgICAgICAgIGlmICggc2hpZnQgPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVswXSA9IChGVF9CeXRlKSggd3JpdGVbMF0gJiBtYXNrICk7Ci0gICAgICAgICAgICB3cml0ZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIHdyaXRlIDwgZW5kICkKLSAgICAgICAgICAgIEZUX01FTV9aRVJPKCB3cml0ZSwgZW5kIC0gd3JpdGUgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIC8qIG90aGVyd2lzZSBhbGxvY2F0ZSBuZXcgYnVmZmVyICovCi0gICAgaWYgKCBGVF9RQUxMT0NfTVVMVCggYnVmZmVyLCBuZXdfcGl0Y2gsIGJpdG1hcC0+cm93cyArIHlwaXhlbHMgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBuZXcgcm93cyBnZXQgYWRkZWQgYXQgdGhlIHRvcCBvZiB0aGUgYml0bWFwLCAqLwotICAgIC8qIHRodXMgdGFrZSBjYXJlIG9mIHRoZSBmbG93IGRpcmVjdGlvbiAgICAgICAgICovCi0gICAgaWYgKCBiaXRtYXAtPnBpdGNoID4gMCApCi0gICAgewotICAgICAgRlRfVUludCAgbGVuID0gKCB3aWR0aCAqIGJwcCArIDcgKSA+PiAzOwotCi0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgYml0bWFwLT5yb3dzOyBpKysgKQotICAgICAgICBGVF9NRU1fQ09QWSggYnVmZmVyICsgKEZUX1VJbnQpbmV3X3BpdGNoICogKCB5cGl4ZWxzICsgaSApLAotICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5idWZmZXIgKyAoRlRfVUludClwaXRjaCAqIGksCi0gICAgICAgICAgICAgICAgICAgICBsZW4gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGxlbiA9ICggd2lkdGggKiBicHAgKyA3ICkgPj4gMzsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IGJpdG1hcC0+cm93czsgaSsrICkKLSAgICAgICAgRlRfTUVNX0NPUFkoIGJ1ZmZlciArIChGVF9VSW50KW5ld19waXRjaCAqIGksCi0gICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPmJ1ZmZlciArIChGVF9VSW50KXBpdGNoICogaSwKLSAgICAgICAgICAgICAgICAgICAgIGxlbiApOwotICAgIH0KLQotICAgIEZUX0ZSRUUoIGJpdG1hcC0+YnVmZmVyICk7Ci0gICAgYml0bWFwLT5idWZmZXIgPSBidWZmZXI7Ci0KLSAgICBpZiAoIGJpdG1hcC0+cGl0Y2ggPCAwICkKLSAgICAgIG5ld19waXRjaCA9IC1uZXdfcGl0Y2g7Ci0KLSAgICAvKiBzZXQgcGl0Y2ggb25seSwgd2lkdGggYW5kIGhlaWdodCBhcmUgbGVmdCB1bnRvdWNoZWQgKi8KLSAgICBiaXRtYXAtPnBpdGNoID0gbmV3X3BpdGNoOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJpdG1hcC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfRW1ib2xkZW4oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHhTdHJlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5U3RyZW5ndGggKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIHVuc2lnbmVkIGNoYXIqICBwOwotICAgIEZUX0ludCAgICAgICAgICBpLCB4LCBwaXRjaDsKLSAgICBGVF9VSW50ICAgICAgICAgeTsKLSAgICBGVF9JbnQgICAgICAgICAgeHN0ciwgeXN0cjsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIWJpdG1hcCB8fCAhYml0bWFwLT5idWZmZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoICggKCBGVF9QSVhfUk9VTkQoIHhTdHJlbmd0aCApID4+IDYgKSA+IEZUX0lOVF9NQVggKSB8fAotICAgICAgICAgKCAoIEZUX1BJWF9ST1VORCggeVN0cmVuZ3RoICkgPj4gNiApID4gRlRfSU5UX01BWCApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgeHN0ciA9IChGVF9JbnQpRlRfUElYX1JPVU5EKCB4U3RyZW5ndGggKSA+PiA2OwotICAgIHlzdHIgPSAoRlRfSW50KUZUX1BJWF9ST1VORCggeVN0cmVuZ3RoICkgPj4gNjsKLQotICAgIGlmICggeHN0ciA9PSAwICYmIHlzdHIgPT0gMCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIGVsc2UgaWYgKCB4c3RyIDwgMCB8fCB5c3RyIDwgMCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHN3aXRjaCAoIGJpdG1hcC0+cGl4ZWxfbW9kZSApCi0gICAgewotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZMjoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTQ6Ci0gICAgICB7Ci0gICAgICAgIEZUX0JpdG1hcCAgdG1wOwotCi0KLSAgICAgICAgLyogY29udmVydCB0byA4YnBwICovCi0gICAgICAgIEZUX0JpdG1hcF9Jbml0KCAmdG1wICk7Ci0gICAgICAgIGVycm9yID0gRlRfQml0bWFwX0NvbnZlcnQoIGxpYnJhcnksIGJpdG1hcCwgJnRtcCwgMSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgRlRfQml0bWFwX0RvbmUoIGxpYnJhcnksIGJpdG1hcCApOwotICAgICAgICAqYml0bWFwID0gdG1wOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1BJWEVMX01PREVfTU9OTzoKLSAgICAgIGlmICggeHN0ciA+IDggKQotICAgICAgICB4c3RyID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRDoKLSAgICAgIHhzdHIgKj0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRF9WOgotICAgICAgeXN0ciAqPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1BJWEVMX01PREVfQkdSQToKLSAgICAgIC8qIFdlIGRvbid0IGVtYm9sZGVuIGNvbG9yIGdseXBocy4gKi8KLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9iaXRtYXBfYXNzdXJlX2J1ZmZlciggbGlicmFyeS0+bWVtb3J5LCBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpeHN0ciwgKEZUX1VJbnQpeXN0ciApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogdGFrZSBjYXJlIG9mIGJpdG1hcCBmbG93ICovCi0gICAgcGl0Y2ggPSBiaXRtYXAtPnBpdGNoOwotICAgIGlmICggcGl0Y2ggPiAwICkKLSAgICAgIHAgPSBiaXRtYXAtPmJ1ZmZlciArIHBpdGNoICogeXN0cjsKLSAgICBlbHNlCi0gICAgewotICAgICAgcGl0Y2ggPSAtcGl0Y2g7Ci0gICAgICBwID0gYml0bWFwLT5idWZmZXIgKyAoRlRfVUludClwaXRjaCAqICggYml0bWFwLT5yb3dzIC0gMSApOwotICAgIH0KLQotICAgIC8qIGZvciBlYWNoIHJvdyAqLwotICAgIGZvciAoIHkgPSAwOyB5IDwgYml0bWFwLT5yb3dzOyB5KysgKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBIb3Jpem9udGFsbHk6Ci0gICAgICAgKgotICAgICAgICogRnJvbSB0aGUgbGFzdCBwaXhlbCBvbiwgbWFrZSBlYWNoIHBpeGVsIG9yJ2VkIHdpdGggdGhlCi0gICAgICAgKiBgeHN0cicgcGl4ZWxzIGJlZm9yZSBpdC4KLSAgICAgICAqLwotICAgICAgZm9yICggeCA9IHBpdGNoIC0gMTsgeCA+PSAwOyB4LS0gKQotICAgICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICB0bXA7Ci0KLQotICAgICAgICB0bXAgPSBwW3hdOwotICAgICAgICBmb3IgKCBpID0gMTsgaSA8PSB4c3RyOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBiaXRtYXAtPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9NT05PICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwW3hdIHw9IHRtcCA+PiBpOwotCi0gICAgICAgICAgICAvKiB0aGUgbWF4aW11bSB2YWx1ZSBvZiA4IGZvciBgeHN0cicgY29tZXMgZnJvbSBoZXJlICovCi0gICAgICAgICAgICBpZiAoIHggPiAwICkKLSAgICAgICAgICAgICAgcFt4XSB8PSBwW3ggLSAxXSA8PCAoIDggLSBpICk7Ci0KLSNpZiAwCi0gICAgICAgICAgICBpZiAoIHBbeF0gPT0gMHhGRiApCi0gICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHggLSBpID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIHBbeF0gKyBwW3ggLSBpXSA+IGJpdG1hcC0+bnVtX2dyYXlzIC0gMSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwW3hdID0gKHVuc2lnbmVkIGNoYXIpKCBiaXRtYXAtPm51bV9ncmF5cyAtIDEgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwW3hdID0gKHVuc2lnbmVkIGNoYXIpKCBwW3hdICsgcFt4IC0gaV0gKTsKLSAgICAgICAgICAgICAgICBpZiAoIHBbeF0gPT0gYml0bWFwLT5udW1fZ3JheXMgLSAxICkKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogVmVydGljYWxseToKLSAgICAgICAqCi0gICAgICAgKiBNYWtlIHRoZSBhYm92ZSBgeXN0cicgcm93cyBvcidlZCB3aXRoIGl0LgotICAgICAgICovCi0gICAgICBmb3IgKCB4ID0gMTsgeCA8PSB5c3RyOyB4KysgKQotICAgICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyKiAgcTsKLQotCi0gICAgICAgIHEgPSBwIC0gYml0bWFwLT5waXRjaCAqIHg7Ci0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcGl0Y2g7IGkrKyApCi0gICAgICAgICAgcVtpXSB8PSBwW2ldOwotICAgICAgfQotCi0gICAgICBwICs9IGJpdG1hcC0+cGl0Y2g7Ci0gICAgfQotCi0gICAgYml0bWFwLT53aWR0aCArPSAoRlRfVUludCl4c3RyOwotICAgIGJpdG1hcC0+cm93cyArPSAoRlRfVUludCl5c3RyOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0J5dGUKLSAgZnRfZ3JheV9mb3JfcHJlbXVsdGlwbGllZF9zcmdiX2JncmEoIGNvbnN0IEZUX0J5dGUqICBiZ3JhICkKLSAgewotICAgIEZUX1VJbnQgIGEgPSBiZ3JhWzNdOwotICAgIEZUX1VJbnQgIGw7Ci0KLQotICAgIC8qIFNob3J0LWNpcmN1aXQgdHJhbnNwYXJlbnQgY29sb3IgdG8gYXZvaWQgZGl2aXNpb24gYnkgemVyby4gKi8KLSAgICBpZiAoICFhICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgLyoKLSAgICAgKiBMdW1pbm9zaXR5IGZvciBzUkdCIGlzIGRlZmluZWQgdXNpbmcgfjAuMjEyNiwwLjcxNTIsMC4wNzIyCi0gICAgICogY29lZmZpY2llbnRzIGZvciBSR0IgY2hhbm5lbHMgKm9uIHRoZSBsaW5lYXIgY29sb3JzKi4KLSAgICAgKiBBIGdhbW1hIG9mIDIuMiBpcyBmYWlyIHRvIGFzc3VtZS4gIEFuZCB0aGVuLCB3ZSBuZWVkIHRvCi0gICAgICogdW5kbyB0aGUgcHJlbXVsdGlwbGljYXRpb24gdG9vLgotICAgICAqCi0gICAgICogICBodHRwOi8vYWNjZXNzaWJpbGl0eS5rZGUub3JnL2hzbC1hZGp1c3RlZC5waHAKLSAgICAgKgotICAgICAqIFdlIGRvIHRoZSBjb21wdXRhdGlvbiB3aXRoIGludGVnZXJzIG9ubHksIGFwcGx5aW5nIGEgZ2FtbWEgb2YgMi4wLgotICAgICAqIFdlIGd1YXJhbnRlZSAzMi1iaXQgYXJpdGhtZXRpYyB0byBhdm9pZCBvdmVyZmxvdyBidXQgdGhlIHJlc3VsdGluZwotICAgICAqIGx1bWlub3NpdHkgZml0cyBpbnRvIDE2IGJpdHMuCi0gICAgICoKLSAgICAgKi8KLQotICAgIGwgPSAoICA0NzMyVUwgLyogMC4wNzIyICogNjU1MzYgKi8gKiBiZ3JhWzBdICogYmdyYVswXSArCi0gICAgICAgICAgNDY4NzFVTCAvKiAwLjcxNTIgKiA2NTUzNiAqLyAqIGJncmFbMV0gKiBiZ3JhWzFdICsKLSAgICAgICAgICAxMzkzM1VMIC8qIDAuMjEyNiAqIDY1NTM2ICovICogYmdyYVsyXSAqIGJncmFbMl0gKSA+PiAxNjsKLQotICAgIC8qCi0gICAgICogRmluYWwgdHJhbnNwYXJlbmN5IGNhbiBiZSBkZXRlcm1pbmVkIGFzIGZvbGxvd3MuCi0gICAgICoKLSAgICAgKiAtIElmIGFscGhhIGlzIHplcm8sIHdlIHdhbnQgMC4KLSAgICAgKiAtIElmIGFscGhhIGlzIHplcm8gYW5kIGx1bWlub3NpdHkgaXMgemVybywgd2Ugd2FudCAyNTUuCi0gICAgICogLSBJZiBhbHBoYSBpcyB6ZXJvIGFuZCBsdW1pbm9zaXR5IGlzIG9uZSwgd2Ugd2FudCAwLgotICAgICAqCi0gICAgICogU28gdGhlIGZvcm11bGEgaXMgYSAqICgxIC0gbCkgPSBhIC0gbCAqIGEuCi0gICAgICoKLSAgICAgKiBXZSBzdGlsbCBuZWVkIHRvIHVuZG8gcHJlbXVsdGlwbGljYXRpb24gYnkgZGl2aWRpbmcgbCBieSBhKmEuCi0gICAgICoKLSAgICAgKi8KLQotICAgIHJldHVybiAoRlRfQnl0ZSkoIGEgLSBsIC8gYSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Yml0bWFwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0JpdG1hcF9Db252ZXJ0KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQml0bWFwICAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAgICAgICAqdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgICAgYWxpZ25tZW50ICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLSAgICBGVF9CeXRlKiAgczsKLSAgICBGVF9CeXRlKiAgdDsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIXNvdXJjZSB8fCAhdGFyZ2V0ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgc3dpdGNoICggc291cmNlLT5waXhlbF9tb2RlICkKLSAgICB7Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX01PTk86Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVk6Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVkyOgotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZNDoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfTENEOgotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9MQ0RfVjoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfQkdSQToKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICAgIHBhZCwgb2xkX3RhcmdldF9waXRjaCwgdGFyZ2V0X3BpdGNoOwotICAgICAgICBGVF9VTG9uZyAgb2xkX3NpemU7Ci0KLQotICAgICAgICBvbGRfdGFyZ2V0X3BpdGNoID0gdGFyZ2V0LT5waXRjaDsKLSAgICAgICAgaWYgKCBvbGRfdGFyZ2V0X3BpdGNoIDwgMCApCi0gICAgICAgICAgb2xkX3RhcmdldF9waXRjaCA9IC1vbGRfdGFyZ2V0X3BpdGNoOwotCi0gICAgICAgIG9sZF9zaXplID0gdGFyZ2V0LT5yb3dzICogKEZUX1VJbnQpb2xkX3RhcmdldF9waXRjaDsKLQotICAgICAgICB0YXJnZXQtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVk7Ci0gICAgICAgIHRhcmdldC0+cm93cyAgICAgICA9IHNvdXJjZS0+cm93czsKLSAgICAgICAgdGFyZ2V0LT53aWR0aCAgICAgID0gc291cmNlLT53aWR0aDsKLQotICAgICAgICBwYWQgPSAwOwotICAgICAgICBpZiAoIGFsaWdubWVudCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgcGFkID0gKEZUX0ludClzb3VyY2UtPndpZHRoICUgYWxpZ25tZW50OwotICAgICAgICAgIGlmICggcGFkICE9IDAgKQotICAgICAgICAgICAgcGFkID0gYWxpZ25tZW50IC0gcGFkOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFyZ2V0X3BpdGNoID0gKEZUX0ludClzb3VyY2UtPndpZHRoICsgcGFkOwotCi0gICAgICAgIGlmICggdGFyZ2V0X3BpdGNoID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAoRlRfVUxvbmcpdGFyZ2V0LT5yb3dzID4gRlRfVUxPTkdfTUFYIC8gKEZUX1VMb25nKXRhcmdldF9waXRjaCApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAgICAgaWYgKCB0YXJnZXQtPnJvd3MgKiAoRlRfVUxvbmcpdGFyZ2V0X3BpdGNoID4gb2xkX3NpemUgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgRlRfUVJFQUxMT0MoIHRhcmdldC0+YnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfc2l6ZSwgdGFyZ2V0LT5yb3dzICogKEZUX1VJbnQpdGFyZ2V0X3BpdGNoICkgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgICB0YXJnZXQtPnBpdGNoID0gdGFyZ2V0LT5waXRjaCA8IDAgPyAtdGFyZ2V0X3BpdGNoIDogdGFyZ2V0X3BpdGNoOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIH0KLQotICAgIHMgPSBzb3VyY2UtPmJ1ZmZlcjsKLSAgICB0ID0gdGFyZ2V0LT5idWZmZXI7Ci0KLSAgICAvKiB0YWtlIGNhcmUgb2YgYml0bWFwIGZsb3cgKi8KLSAgICBpZiAoIHNvdXJjZS0+cGl0Y2ggPCAwICkKLSAgICAgIHMgLT0gc291cmNlLT5waXRjaCAqIChGVF9JbnQpKCBzb3VyY2UtPnJvd3MgLSAxICk7Ci0gICAgaWYgKCB0YXJnZXQtPnBpdGNoIDwgMCApCi0gICAgICB0IC09IHRhcmdldC0+cGl0Y2ggKiAoRlRfSW50KSggdGFyZ2V0LT5yb3dzIC0gMSApOwotCi0gICAgc3dpdGNoICggc291cmNlLT5waXhlbF9tb2RlICkKLSAgICB7Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX01PTk86Ci0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICB0YXJnZXQtPm51bV9ncmF5cyA9IDI7Ci0KLSAgICAgICAgZm9yICggaSA9IHNvdXJjZS0+cm93czsgaSA+IDA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgc3MgPSBzOwotICAgICAgICAgIEZUX0J5dGUqICB0dCA9IHQ7Ci0gICAgICAgICAgRlRfVUludCAgIGo7Ci0KLQotICAgICAgICAgIC8qIGdldCB0aGUgZnVsbCBieXRlcyAqLwotICAgICAgICAgIGZvciAoIGogPSBzb3VyY2UtPndpZHRoID4+IDM7IGogPiAwOyBqLS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgdmFsID0gc3NbMF07IC8qIGF2b2lkIGEgYnl0ZS0+aW50IGNhc3Qgb24gZWFjaCBsaW5lICovCi0KLQotICAgICAgICAgICAgdHRbMF0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHg4MCApID4+IDcgKTsKLSAgICAgICAgICAgIHR0WzFdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4NDAgKSA+PiA2ICk7Ci0gICAgICAgICAgICB0dFsyXSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDIwICkgPj4gNSApOwotICAgICAgICAgICAgdHRbM10gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgxMCApID4+IDQgKTsKLSAgICAgICAgICAgIHR0WzRdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MDggKSA+PiAzICk7Ci0gICAgICAgICAgICB0dFs1XSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDA0ICkgPj4gMiApOwotICAgICAgICAgICAgdHRbNl0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgwMiApID4+IDEgKTsKLSAgICAgICAgICAgIHR0WzddID0gKEZUX0J5dGUpKCAgIHZhbCAmIDB4MDEgKTsKLQotICAgICAgICAgICAgdHQgKz0gODsKLSAgICAgICAgICAgIHNzICs9IDE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogZ2V0IHJlbWFpbmluZyBwaXhlbHMgKGlmIGFueSkgKi8KLSAgICAgICAgICBqID0gc291cmNlLT53aWR0aCAmIDc7Ci0gICAgICAgICAgaWYgKCBqID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICB2YWwgPSAqc3M7Ci0KLQotICAgICAgICAgICAgZm9yICggOyBqID4gMDsgai0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHRbMF0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHg4MCApID4+IDcpOwotICAgICAgICAgICAgICB2YWwgPDw9IDE7Ci0gICAgICAgICAgICAgIHR0ICAgKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzICs9IHNvdXJjZS0+cGl0Y2g7Ci0gICAgICAgICAgdCArPSB0YXJnZXQtPnBpdGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVk6Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRDoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfTENEX1Y6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIHdpZHRoID0gc291cmNlLT53aWR0aDsKLSAgICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICAgIHRhcmdldC0+bnVtX2dyYXlzID0gMjU2OwotCi0gICAgICAgIGZvciAoIGkgPSBzb3VyY2UtPnJvd3M7IGkgPiAwOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQVJSQVlfQ09QWSggdCwgcywgd2lkdGggKTsKLQotICAgICAgICAgIHMgKz0gc291cmNlLT5waXRjaDsKLSAgICAgICAgICB0ICs9IHRhcmdldC0+cGl0Y2g7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTI6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICB0YXJnZXQtPm51bV9ncmF5cyA9IDQ7Ci0KLSAgICAgICAgZm9yICggaSA9IHNvdXJjZS0+cm93czsgaSA+IDA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgc3MgPSBzOwotICAgICAgICAgIEZUX0J5dGUqICB0dCA9IHQ7Ci0gICAgICAgICAgRlRfVUludCAgIGo7Ci0KLQotICAgICAgICAgIC8qIGdldCB0aGUgZnVsbCBieXRlcyAqLwotICAgICAgICAgIGZvciAoIGogPSBzb3VyY2UtPndpZHRoID4+IDI7IGogPiAwOyBqLS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgdmFsID0gc3NbMF07Ci0KLQotICAgICAgICAgICAgdHRbMF0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHhDMCApID4+IDYgKTsKLSAgICAgICAgICAgIHR0WzFdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MzAgKSA+PiA0ICk7Ci0gICAgICAgICAgICB0dFsyXSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDBDICkgPj4gMiApOwotICAgICAgICAgICAgdHRbM10gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgwMyApICk7Ci0KLSAgICAgICAgICAgIHNzICs9IDE7Ci0gICAgICAgICAgICB0dCArPSA0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGogPSBzb3VyY2UtPndpZHRoICYgMzsKLSAgICAgICAgICBpZiAoIGogPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIHZhbCA9IHNzWzBdOwotCi0KLSAgICAgICAgICAgIGZvciAoIDsgaiA+IDA7IGotLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHR0WzBdICA9IChGVF9CeXRlKSggKCB2YWwgJiAweEMwICkgPj4gNiApOwotICAgICAgICAgICAgICB2YWwgIDw8PSAyOwotICAgICAgICAgICAgICB0dCAgICArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIHMgKz0gc291cmNlLT5waXRjaDsKLSAgICAgICAgICB0ICs9IHRhcmdldC0+cGl0Y2g7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTQ6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICB0YXJnZXQtPm51bV9ncmF5cyA9IDE2OwotCi0gICAgICAgIGZvciAoIGkgPSBzb3VyY2UtPnJvd3M7IGkgPiAwOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIHNzID0gczsKLSAgICAgICAgICBGVF9CeXRlKiAgdHQgPSB0OwotICAgICAgICAgIEZUX1VJbnQgICBqOwotCi0KLSAgICAgICAgICAvKiBnZXQgdGhlIGZ1bGwgYnl0ZXMgKi8KLSAgICAgICAgICBmb3IgKCBqID0gc291cmNlLT53aWR0aCA+PiAxOyBqID4gMDsgai0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIHZhbCA9IHNzWzBdOwotCi0KLSAgICAgICAgICAgIHR0WzBdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4RjAgKSA+PiA0ICk7Ci0gICAgICAgICAgICB0dFsxXSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDBGICkgKTsKLQotICAgICAgICAgICAgc3MgKz0gMTsKLSAgICAgICAgICAgIHR0ICs9IDI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBzb3VyY2UtPndpZHRoICYgMSApCi0gICAgICAgICAgICB0dFswXSA9IChGVF9CeXRlKSggKCBzc1swXSAmIDB4RjAgKSA+PiA0ICk7Ci0KLSAgICAgICAgICBzICs9IHNvdXJjZS0+cGl0Y2g7Ci0gICAgICAgICAgdCArPSB0YXJnZXQtPnBpdGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0JHUkE6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICB0YXJnZXQtPm51bV9ncmF5cyA9IDI1NjsKLQotICAgICAgICBmb3IgKCBpID0gc291cmNlLT5yb3dzOyBpID4gMDsgaS0tICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICBzcyA9IHM7Ci0gICAgICAgICAgRlRfQnl0ZSogIHR0ID0gdDsKLSAgICAgICAgICBGVF9VSW50ICAgajsKLQotCi0gICAgICAgICAgZm9yICggaiA9IHNvdXJjZS0+d2lkdGg7IGogPiAwOyBqLS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR0WzBdID0gZnRfZ3JheV9mb3JfcHJlbXVsdGlwbGllZF9zcmdiX2JncmEoIHNzICk7Ci0KLSAgICAgICAgICAgIHNzICs9IDQ7Ci0gICAgICAgICAgICB0dCArPSAxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHMgKz0gc291cmNlLT5waXRjaDsKLSAgICAgICAgICB0ICs9IHRhcmdldC0+cGl0Y2g7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRiaXRtYXAuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhTbG90X093bl9CaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBpZiAoIHNsb3QgJiYgc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgICAmJgotICAgICAgICAgISggc2xvdC0+aW50ZXJuYWwtPmZsYWdzICYgRlRfR0xZUEhfT1dOX0JJVE1BUCApICkKLSAgICB7Ci0gICAgICBGVF9CaXRtYXAgIGJpdG1hcDsKLSAgICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgICAgRlRfQml0bWFwX0luaXQoICZiaXRtYXAgKTsKLSAgICAgIGVycm9yID0gRlRfQml0bWFwX0NvcHkoIHNsb3QtPmxpYnJhcnksICZzbG90LT5iaXRtYXAsICZiaXRtYXAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIHNsb3QtPmJpdG1hcCA9IGJpdG1hcDsKLSAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyB8PSBGVF9HTFlQSF9PV05fQklUTUFQOwotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRiaXRtYXAuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0RvbmUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICpiaXRtYXAgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFiaXRtYXAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBGVF9GUkVFKCBiaXRtYXAtPmJ1ZmZlciApOwotICAgICpiaXRtYXAgPSBudWxsX2JpdG1hcDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Y2FsYy5jIGIvc3JjL2Jhc2UvZnRjYWxjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTA2MTIuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRjYWxjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2FsYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBcml0aG1ldGljIGNvbXB1dGF0aW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdXBwb3J0IGZvciAxLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBoYXMgYmVlbiB0b3RhbGx5IGRyb3BwZWQgaW4gdGhpcyAgKi8KLSAgLyogcmVsZWFzZS4gIFlvdSBjYW4gc3RpbGwgd3JpdGUgeW91ciBvd24gY29kZSBpZiB5b3UgbmVlZCBpdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEltcGxlbWVudGluZyBiYXNpYyBjb21wdXRhdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfTXVsRGl2KCksIEZUX011bEZpeCgpLCBGVF9EaXZGaXgoKSwgRlRfUm91bmRGaXgoKSwgRlRfQ2VpbEZpeCgpLCAgICovCi0gIC8qIGFuZCBGVF9GbG9vckZpeCgpIGFyZSBkZWNsYXJlZCBpbiBmcmVldHlwZS5oLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9HTFlQSF9ICi0jaW5jbHVkZSBGVF9UUklHT05PTUVUUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0jaWZkZWYgRlRfTVVMRklYX0FTU0VNQkxFUgotI3VuZGVmIEZUX011bEZpeAotI2VuZGlmCi0KLS8qIHdlIG5lZWQgdG8gZW11bGF0ZSBhIDY0LWJpdCBkYXRhIHR5cGUgaWYgYSByZWFsIG9uZSBpc24ndCBhdmFpbGFibGUgKi8KLQotI2lmbmRlZiBGVF9MT05HNjQKLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfSW50NjRfCi0gIHsKLSAgICBGVF9VSW50MzIgIGxvOwotICAgIEZUX1VJbnQzMiAgaGk7Ci0KLSAgfSBGVF9JbnQ2NDsKLQotI2VuZGlmIC8qICFGVF9MT05HNjQgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NhbGMKLQotCi0gIC8qIHRyYW5zZmVyIHNpZ24sIGxlYXZpbmcgYSBwb3NpdGl2ZSBudW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogd2UgbmVlZCBhbiB1bnNpZ25lZCB2YWx1ZSB0byBzYWZlbHkgbmVnYXRlIElOVF9NSU4gKG9yIExPTkdfTUlOKSAqLwotI2RlZmluZSBGVF9NT1ZFX1NJR04oIHgsIHhfdW5zaWduZWQsIHMgKSBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIHggPCAwICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB4X3Vuc2lnbmVkID0gLXhfdW5zaWduZWQ7ICAgICAgICAgIFwKLSAgICAgIHMgICAgICAgICAgPSAtczsgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0gIC8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyICovCi0gIC8qIEZUX0xPTkc2NCBpcyBkZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQotICBGVF9Sb3VuZEZpeCggRlRfRml4ZWQgIGEgKQotICB7Ci0gICAgcmV0dXJuICggQUREX0xPTkcoIGEsIDB4ODAwMEwgLSAoIGEgPCAwICkgKSApICYgfjB4RkZGRkw7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfQ2VpbEZpeCggRlRfRml4ZWQgIGEgKQotICB7Ci0gICAgcmV0dXJuICggQUREX0xPTkcoIGEsIDB4RkZGRkwgKSApICYgfjB4RkZGRkw7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfRmxvb3JGaXgoIEZUX0ZpeGVkICBhICkKLSAgewotICAgIHJldHVybiBhICYgfjB4RkZGRkw7Ci0gIH0KLQotI2lmbmRlZiBGVF9NU0IKLQotICBGVF9CQVNFX0RFRiAoIEZUX0ludCApCi0gIEZUX01TQiggRlRfVUludDMyIHogKQotICB7Ci0gICAgRlRfSW50ICBzaGlmdCA9IDA7Ci0KLQotICAgIC8qIGRldGVybWluZSBtc2IgYml0IGluZGV4IGluIGBzaGlmdCcgKi8KLSAgICBpZiAoIHogJiAweEZGRkYwMDAwVUwgKQotICAgIHsKLSAgICAgIHogICAgID4+PSAxNjsKLSAgICAgIHNoaWZ0ICArPSAxNjsKLSAgICB9Ci0gICAgaWYgKCB6ICYgMHgwMDAwRkYwMFVMICkKLSAgICB7Ci0gICAgICB6ICAgICA+Pj0gODsKLSAgICAgIHNoaWZ0ICArPSA4OwotICAgIH0KLSAgICBpZiAoIHogJiAweDAwMDAwMEYwVUwgKQotICAgIHsKLSAgICAgIHogICAgID4+PSA0OwotICAgICAgc2hpZnQgICs9IDQ7Ci0gICAgfQotICAgIGlmICggeiAmIDB4MDAwMDAwMENVTCApCi0gICAgewotICAgICAgeiAgICAgPj49IDI7Ci0gICAgICBzaGlmdCAgKz0gMjsKLSAgICB9Ci0gICAgaWYgKCB6ICYgMHgwMDAwMDAwMlVMICkKLSAgICB7Ci0gICAvKiB6ICAgICA+Pj0gMTsgKi8KLSAgICAgIHNoaWZ0ICArPSAxOwotICAgIH0KLQotICAgIHJldHVybiBzaGlmdDsKLSAgfQotCi0jZW5kaWYgLyogIUZUX01TQiAqLwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9GaXhlZCApCi0gIEZUX0h5cG90KCBGVF9GaXhlZCAgeCwKLSAgICAgICAgICAgIEZUX0ZpeGVkICB5ICkKLSAgewotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgdi54ID0geDsKLSAgICB2LnkgPSB5OwotCi0gICAgcmV0dXJuIEZUX1ZlY3Rvcl9MZW5ndGgoICZ2ICk7Ci0gIH0KLQotCi0jaWZkZWYgRlRfTE9ORzY0Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRGl2KCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICBGVF9Mb25nICBiXywKLSAgICAgICAgICAgICBGVF9Mb25nICBjXyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQ2NCAgYSwgYiwgYywgZDsKLSAgICBGVF9Mb25nICAgIGRfOwotCi0KLSAgICBhID0gKEZUX1VJbnQ2NClhXzsKLSAgICBiID0gKEZUX1VJbnQ2NCliXzsKLSAgICBjID0gKEZUX1VJbnQ2NCljXzsKLQotICAgIEZUX01PVkVfU0lHTiggYV8sIGEsIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGJfLCBiLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBjXywgYywgcyApOwotCi0gICAgZCA9IGMgPiAwID8gKCBhICogYiArICggYyA+PiAxICkgKSAvIGMKLSAgICAgICAgICAgICAgOiAweDdGRkZGRkZGVUw7Ci0KLSAgICBkXyA9IChGVF9Mb25nKWQ7Ci0KLSAgICByZXR1cm4gcyA8IDAgPyAtZF8gOiBkXzsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiXywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBjXyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQ2NCAgYSwgYiwgYywgZDsKLSAgICBGVF9Mb25nICAgIGRfOwotCi0KLSAgICBhID0gKEZUX1VJbnQ2NClhXzsKLSAgICBiID0gKEZUX1VJbnQ2NCliXzsKLSAgICBjID0gKEZUX1VJbnQ2NCljXzsKLQotICAgIEZUX01PVkVfU0lHTiggYV8sIGEsIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGJfLCBiLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBjXywgYywgcyApOwotCi0gICAgZCA9IGMgPiAwID8gYSAqIGIgLyBjCi0gICAgICAgICAgICAgIDogMHg3RkZGRkZGRlVMOwotCi0gICAgZF8gPSAoRlRfTG9uZylkOwotCi0gICAgcmV0dXJuIHMgPCAwID8gLWRfIDogZF87Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9NdWxGaXgoIEZUX0xvbmcgIGFfLAotICAgICAgICAgICAgIEZUX0xvbmcgIGJfICkKLSAgewotI2lmZGVmIEZUX01VTEZJWF9BU1NFTUJMRVIKLQotICAgIHJldHVybiBGVF9NVUxGSVhfQVNTRU1CTEVSKCAoRlRfSW50MzIpYV8sIChGVF9JbnQzMiliXyApOwotCi0jZWxzZQotCi0gICAgRlRfSW50NjQgIGFiID0gKEZUX0ludDY0KWFfICogKEZUX0ludDY0KWJfOwotCi0gICAgLyogdGhpcyByZXF1aXJlcyBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IG9mIHNpZ25lZCBudW1iZXJzICovCi0gICAgcmV0dXJuIChGVF9Mb25nKSggKCBhYiArIDB4ODAwMEwgLSAoIGFiIDwgMCApICkgPj4gMTYgKTsKLQotI2VuZGlmIC8qIEZUX01VTEZJWF9BU1NFTUJMRVIgKi8KLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfTG9uZyApCi0gIEZUX0RpdkZpeCggRlRfTG9uZyAgYV8sCi0gICAgICAgICAgICAgRlRfTG9uZyAgYl8gKQotICB7Ci0gICAgRlRfSW50ICAgICBzID0gMTsKLSAgICBGVF9VSW50NjQgIGEsIGIsIHE7Ci0gICAgRlRfTG9uZyAgICBxXzsKLQotCi0gICAgYSA9IChGVF9VSW50NjQpYV87Ci0gICAgYiA9IChGVF9VSW50NjQpYl87Ci0KLSAgICBGVF9NT1ZFX1NJR04oIGFfLCBhLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiXywgYiwgcyApOwotCi0gICAgcSA9IGIgPiAwID8gKCAoIGEgPDwgMTYgKSArICggYiA+PiAxICkgKSAvIGIKLSAgICAgICAgICAgICAgOiAweDdGRkZGRkZGVUw7Ci0KLSAgICBxXyA9IChGVF9Mb25nKXE7Ci0KLSAgICByZXR1cm4gcyA8IDAgPyAtcV8gOiBxXzsKLSAgfQotCi0KLSNlbHNlIC8qICFGVF9MT05HNjQgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X211bHRvNjQoIEZUX1VJbnQzMiAgeCwKLSAgICAgICAgICAgICAgRlRfVUludDMyICB5LAotICAgICAgICAgICAgICBGVF9JbnQ2NCAgKnogKQotICB7Ci0gICAgRlRfVUludDMyICBsbzEsIGhpMSwgbG8yLCBoaTIsIGxvLCBoaSwgaTEsIGkyOwotCi0KLSAgICBsbzEgPSB4ICYgMHgwMDAwRkZGRlU7ICBoaTEgPSB4ID4+IDE2OwotICAgIGxvMiA9IHkgJiAweDAwMDBGRkZGVTsgIGhpMiA9IHkgPj4gMTY7Ci0KLSAgICBsbyA9IGxvMSAqIGxvMjsKLSAgICBpMSA9IGxvMSAqIGhpMjsKLSAgICBpMiA9IGxvMiAqIGhpMTsKLSAgICBoaSA9IGhpMSAqIGhpMjsKLQotICAgIC8qIENoZWNrIGNhcnJ5IG92ZXJmbG93IG9mIGkxICsgaTIgKi8KLSAgICBpMSArPSBpMjsKLSAgICBoaSArPSAoRlRfVUludDMyKSggaTEgPCBpMiApIDw8IDE2OwotCi0gICAgaGkgKz0gaTEgPj4gMTY7Ci0gICAgaTEgID0gaTEgPDwgMTY7Ci0KLSAgICAvKiBDaGVjayBjYXJyeSBvdmVyZmxvdyBvZiBpMSArIGxvICovCi0gICAgbG8gKz0gaTE7Ci0gICAgaGkgKz0gKCBsbyA8IGkxICk7Ci0KLSAgICB6LT5sbyA9IGxvOwotICAgIHotPmhpID0gaGk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50MzIKLSAgZnRfZGl2NjRieTMyKCBGVF9VSW50MzIgIGhpLAotICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgbG8sCi0gICAgICAgICAgICAgICAgRlRfVUludDMyICB5ICkKLSAgewotICAgIEZUX1VJbnQzMiAgciwgcTsKLSAgICBGVF9JbnQgICAgIGk7Ci0KLQotICAgIGlmICggaGkgPj0geSApCi0gICAgICByZXR1cm4gKEZUX1VJbnQzMikweDdGRkZGRkZGTDsKLQotICAgIC8qIFdlIHNoaWZ0IGFzIG1hbnkgYml0cyBhcyB3ZSBjYW4gaW50byB0aGUgaGlnaCByZWdpc3RlciwgcGVyZm9ybSAgICAgKi8KLSAgICAvKiAzMi1iaXQgZGl2aXNpb24gd2l0aCBtb2R1bG8gdGhlcmUsIHRoZW4gd29yayB0aHJvdWdoIHRoZSByZW1haW5pbmcgICovCi0gICAgLyogYml0cyB3aXRoIGxvbmcgZGl2aXNpb24uIFRoaXMgb3B0aW1pemF0aW9uIGlzIGVzcGVjaWFsbHkgbm90aWNlYWJsZSAqLwotICAgIC8qIGZvciBzbWFsbGVyIGRpdmlkZW5kcyB0aGF0IGJhcmVseSB1c2UgdGhlIGhpZ2ggcmVnaXN0ZXIuICAgICAgICAgICAgKi8KLQotICAgIGkgPSAzMSAtIEZUX01TQiggaGkgKTsKLSAgICByID0gKCBoaSA8PCBpICkgfCAoIGxvID4+ICggMzIgLSBpICkgKTsgbG8gPDw9IGk7IC8qIGxlZnQgNjQtYml0IHNoaWZ0ICovCi0gICAgcSA9IHIgLyB5OwotICAgIHIgLT0gcSAqIHk7ICAgLyogcmVtYWluZGVyICovCi0KLSAgICBpID0gMzIgLSBpOyAgIC8qIGJpdHMgcmVtYWluaW5nIGluIGxvdyByZWdpc3RlciAqLwotICAgIGRvCi0gICAgewotICAgICAgcSA8PD0gMTsKLSAgICAgIHIgICA9ICggciA8PCAxICkgfCAoIGxvID4+IDMxICk7IGxvIDw8PSAxOwotCi0gICAgICBpZiAoIHIgPj0geSApCi0gICAgICB7Ci0gICAgICAgIHIgLT0geTsKLSAgICAgICAgcSB8PSAxOwotICAgICAgfQotICAgIH0gd2hpbGUgKCAtLWkgKTsKLQotICAgIHJldHVybiBxOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBGVF9BZGQ2NCggRlRfSW50NjQqICB4LAotICAgICAgICAgICAgRlRfSW50NjQqICB5LAotICAgICAgICAgICAgRlRfSW50NjQgICp6ICkKLSAgewotICAgIEZUX1VJbnQzMiAgbG8sIGhpOwotCi0KLSAgICBsbyA9IHgtPmxvICsgeS0+bG87Ci0gICAgaGkgPSB4LT5oaSArIHktPmhpICsgKCBsbyA8IHgtPmxvICk7Ci0KLSAgICB6LT5sbyA9IGxvOwotICAgIHotPmhpID0gaGk7Ci0gIH0KLQotCi0gIC8qICBUaGUgRlRfTXVsRGl2IGZ1bmN0aW9uIGhhcyBiZWVuIG9wdGltaXplZCB0aGFua3MgdG8gaWRlYXMgZnJvbSAgICAgKi8KLSAgLyogIEdyYWhhbSBBc2hlciBhbmQgQWxleGVpIFBvZHRlbGV6aG5pa292LiAgVGhlIHRyaWNrIGlzIHRvIG9wdGltaXplICAqLwotICAvKiAgYSByYXRoZXIgY29tbW9uIGNhc2Ugd2hlbiBldmVyeXRoaW5nIGZpdHMgd2l0aGluIDMyLWJpdHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFdlIGNvbXB1dGUgJ2EqYitjLzInLCB0aGVuIGRpdmlkZSBpdCBieSAnYycgKGFsbCBwb3NpdGl2ZSB2YWx1ZXMpLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGUgcHJvZHVjdCBvZiB0d28gcG9zaXRpdmUgbnVtYmVycyBuZXZlciBleGNlZWRzIHRoZSBzcXVhcmUgb2YgICAgKi8KLSAgLyogIGl0cyBtZWFuIHZhbHVlcy4gIFRoZXJlZm9yZSwgd2UgYWx3YXlzIGF2b2lkIHRoZSBvdmVyZmxvdyBieSAgICAgICAqLwotICAvKiAgaW1wb3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgKGEgKyBiKSAvIDIgPD0gc3FydChYIC0gYy8yKSAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICB3aGVyZSBYID0gMl4zMiAtIDEsIHRoZSBtYXhpbXVtIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZSwgYW5kIHVzaW5nICAgKi8KLSAgLyogIHVuc2lnbmVkIGFyaXRobWV0aWMuICBOb3cgd2UgcmVwbGFjZSBgc3FydCcgd2l0aCBhIGxpbmVhciBmdW5jdGlvbiAqLwotICAvKiAgdGhhdCBpcyBzbWFsbGVyIG9yIGVxdWFsIGZvciBhbGwgdmFsdWVzIG9mIGMgaW4gdGhlIGludGVydmFsICAgICAgICovCi0gIC8qICBbMDtYLzJdOyBpdCBzaG91bGQgYmUgZXF1YWwgdG8gc3FydChYKSBhbmQgc3FydCgzWC80KSBhdCB0aGUgICAgICAgKi8KLSAgLyogIGVuZHBvaW50cy4gIFN1YnN0aXR1dGluZyB0aGUgbGluZWFyIHNvbHV0aW9uIGFuZCBleHBsaWNpdCBudW1iZXJzICAqLwotICAvKiAgd2UgZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSArIGIgPD0gMTMxMDcxLjk5IC0gYyAvIDEyMjI5MS44NCAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBJbiBwcmFjdGljZSwgd2Ugc2hvdWxkIHVzZSBhIGZhc3RlciBhbmQgZXZlbiBzdHJvbmdlciBpbmVxdWFsaXR5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhICsgYiA8PSAxMzEwNzEgLSAoYyA+PiAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIG9yLCBhbHRlcm5hdGl2ZWx5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgKyBiIDw9IDEyOTg5NCAtIChjID4+IDE3KSAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRlRfTXVsRml4LCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgb3B0aW1pemVkIGZvciBhIHNtYWxsIHZhbHVlIG9mICAgICovCi0gIC8qICB0aGUgZmlyc3QgYXJndW1lbnQsIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCBjYW4gYmUgbXVjaCBsYXJnZXIuICAgKi8KLSAgLyogIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHNjYWxpbmcgdGhlIHNlY29uZCBhcmd1bWVudCBhbmQgdGhlIGxpbWl0ICAqLwotICAvKiAgaW4gdGhlIGFib3ZlIGluZXF1YWxpdGllcy4gIEZvciBleGFtcGxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSArIChiID4+IDgpIDw9ICgxMzEwNzEgPj4gNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBjb3ZlcnMgdGhlIHByYWN0aWNhbCByYW5nZSBvZiB1c2UuIFRoZSBhY3R1YWwgdGVzdCBiZWxvdyBpcyBhIGJpdCAgKi8KLSAgLyogIHRpZ2h0ZXIgdG8gYXZvaWQgdGhlIGJvcmRlciBjYXNlIG92ZXJmbG93cy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBJbiB0aGUgY2FzZSBvZiBGVF9EaXZGaXgsIHRoZSBleGFjdCBvdmVyZmxvdyBjaGVjayAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDw8IDE2IDw9IFggLSBjLzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIGlzIHNjYWxlZCBkb3duIGJ5IDJeMTYgYW5kIHdlIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgPD0gNjU1MzUgLSAoYyA+PiAxNykgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRGl2KCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICBGVF9Mb25nICBiXywKLSAgICAgICAgICAgICBGVF9Mb25nICBjXyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQzMiAgYSwgYiwgYzsKLQotCi0gICAgLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG93IDY0LWJpdCBhcmd1bWVudHMgKi8KLQotICAgIGEgPSAoRlRfVUludDMyKWFfOwotICAgIGIgPSAoRlRfVUludDMyKWJfOwotICAgIGMgPSAoRlRfVUludDMyKWNfOwotCi0gICAgRlRfTU9WRV9TSUdOKCBhXywgYSwgcyApOwotICAgIEZUX01PVkVfU0lHTiggYl8sIGIsIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGNfLCBjLCBzICk7Ci0KLSAgICBpZiAoIGMgPT0gMCApCi0gICAgICBhID0gMHg3RkZGRkZGRlVMOwotCi0gICAgZWxzZSBpZiAoIGEgKyBiIDw9IDEyOTg5NFVMIC0gKCBjID4+IDE3ICkgKQotICAgICAgYSA9ICggYSAqIGIgKyAoIGMgPj4gMSApICkgLyBjOwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX0ludDY0ICB0ZW1wLCB0ZW1wMjsKLQotCi0gICAgICBmdF9tdWx0bzY0KCBhLCBiLCAmdGVtcCApOwotCi0gICAgICB0ZW1wMi5oaSA9IDA7Ci0gICAgICB0ZW1wMi5sbyA9IGMgPj4gMTsKLQotICAgICAgRlRfQWRkNjQoICZ0ZW1wLCAmdGVtcDIsICZ0ZW1wICk7Ci0KLSAgICAgIC8qIGxhc3QgYXR0ZW1wdCB0byBkaXRjaCBsb25nIGRpdmlzaW9uICovCi0gICAgICBhID0gKCB0ZW1wLmhpID09IDAgKSA/IHRlbXAubG8gLyBjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYyApOwotICAgIH0KLQotICAgIGFfID0gKEZUX0xvbmcpYTsKLQotICAgIHJldHVybiBzIDwgMCA/IC1hXyA6IGFfOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfTG9uZyApCi0gIEZUX011bERpdl9Ob19Sb3VuZCggRlRfTG9uZyAgYV8sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYl8sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgY18gKQotICB7Ci0gICAgRlRfSW50ICAgICBzID0gMTsKLSAgICBGVF9VSW50MzIgIGEsIGIsIGM7Ci0KLQotICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyA2NC1iaXQgYXJndW1lbnRzICovCi0KLSAgICBhID0gKEZUX1VJbnQzMilhXzsKLSAgICBiID0gKEZUX1VJbnQzMiliXzsKLSAgICBjID0gKEZUX1VJbnQzMiljXzsKLQotICAgIEZUX01PVkVfU0lHTiggYV8sIGEsIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGJfLCBiLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBjXywgYywgcyApOwotCi0gICAgaWYgKCBjID09IDAgKQotICAgICAgYSA9IDB4N0ZGRkZGRkZVTDsKLQotICAgIGVsc2UgaWYgKCBhICsgYiA8PSAxMzEwNzFVTCApCi0gICAgICBhID0gYSAqIGIgLyBjOwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX0ludDY0ICB0ZW1wOwotCi0KLSAgICAgIGZ0X211bHRvNjQoIGEsIGIsICZ0ZW1wICk7Ci0KLSAgICAgIC8qIGxhc3QgYXR0ZW1wdCB0byBkaXRjaCBsb25nIGRpdmlzaW9uICovCi0gICAgICBhID0gKCB0ZW1wLmhpID09IDAgKSA/IHRlbXAubG8gLyBjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYyApOwotICAgIH0KLQotICAgIGFfID0gKEZUX0xvbmcpYTsKLQotICAgIHJldHVybiBzIDwgMCA/IC1hXyA6IGFfOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRml4KCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICBGVF9Mb25nICBiXyApCi0gIHsKLSNpZmRlZiBGVF9NVUxGSVhfQVNTRU1CTEVSCi0KLSAgICByZXR1cm4gRlRfTVVMRklYX0FTU0VNQkxFUiggYV8sIGJfICk7Ci0KLSNlbGlmIDAKLQotICAgIC8qCi0gICAgICogIFRoaXMgY29kZSBpcyBub25wb3J0YWJsZS4gIFNlZSBjb21tZW50IGJlbG93LgotICAgICAqCi0gICAgICogIEhvd2V2ZXIsIG9uIGEgcGxhdGZvcm0gd2hlcmUgcmlnaHQtc2hpZnQgb2YgYSBzaWduZWQgcXVhbnRpdHkgZmlsbHMKLSAgICAgKiAgdGhlIGxlZnRtb3N0IGJpdHMgYnkgY29weWluZyB0aGUgc2lnbiBiaXQsIGl0IG1pZ2h0IGJlIGZhc3Rlci4KLSAgICAgKi8KLQotICAgIEZUX0xvbmcgICAgc2EsIHNiOwotICAgIEZUX1VJbnQzMiAgYSwgYjsKLQotCi0gICAgLyoKLSAgICAgKiAgVGhpcyBpcyBhIGNsZXZlciB3YXkgb2YgY29udmVydGluZyBhIHNpZ25lZCBudW1iZXIgYGEnIGludG8gaXRzCi0gICAgICogIGFic29sdXRlIHZhbHVlIChzdG9yZWQgYmFjayBpbnRvIGBhJykgYW5kIGl0cyBzaWduLiAgVGhlIHNpZ24gaXMKLSAgICAgKiAgc3RvcmVkIGluIGBzYSc7IDAgbWVhbnMgYGEnIHdhcyBwb3NpdGl2ZSBvciB6ZXJvLCBhbmQgLTEgbWVhbnMgYGEnCi0gICAgICogIHdhcyBuZWdhdGl2ZS4gIChTaW1pbGFybHkgZm9yIGBiJyBhbmQgYHNiJykuCi0gICAgICoKLSAgICAgKiAgVW5mb3J0dW5hdGVseSwgaXQgZG9lc24ndCB3b3JrIChhdCBsZWFzdCBub3QgcG9ydGFibHkpLgotICAgICAqCi0gICAgICogIEl0IG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgcmlnaHQtc2hpZnQgb24gYSBuZWdhdGl2ZSBzaWduZWQgdmFsdWUKLSAgICAgKiAgZmlsbHMgdGhlIGxlZnRtb3N0IGJpdHMgYnkgY29weWluZyB0aGUgc2lnbiBiaXQuICBUaGlzIGlzIHdyb25nLgotICAgICAqICBBY2NvcmRpbmcgdG8gSyZSIDJuZCBlZCwgc2VjdGlvbiBgQTcuOCBTaGlmdCBPcGVyYXRvcnMnIG9uIHBhZ2UgMjA2LAotICAgICAqICB0aGUgcmVzdWx0IG9mIHJpZ2h0LXNoaWZ0IG9mIGEgbmVnYXRpdmUgc2lnbmVkIHZhbHVlIGlzCi0gICAgICogIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBBdCBsZWFzdCBvbmUgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlCi0gICAgICogIGxlZnRtb3N0IGJpdHMgd2l0aCAwcyAoaS5lLiwgaXQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBhbiB1bnNpZ25lZAotICAgICAqICByaWdodCBzaGlmdCkuICBUaGlzIG1lYW5zIHRoYXQgd2hlbiBgYScgaXMgbmVnYXRpdmUsIGBzYScgZW5kcyB1cAotICAgICAqICB3aXRoIHRoZSB2YWx1ZSAxIHJhdGhlciB0aGFuIC0xLiAgQWZ0ZXIgdGhhdCwgZXZlcnl0aGluZyBlbHNlIGdvZXMKLSAgICAgKiAgd3JvbmcuCi0gICAgICovCi0gICAgc2EgPSAoIGFfID4+ICggc2l6ZW9mICggYV8gKSAqIDggLSAxICkgKTsKLSAgICBhICA9ICggYV8gXiBzYSApIC0gc2E7Ci0gICAgc2IgPSAoIGJfID4+ICggc2l6ZW9mICggYl8gKSAqIDggLSAxICkgKTsKLSAgICBiICA9ICggYl8gXiBzYiApIC0gc2I7Ci0KLSAgICBhID0gKEZUX1VJbnQzMilhXzsKLSAgICBiID0gKEZUX1VJbnQzMiliXzsKLQotICAgIGlmICggYSArICggYiA+PiA4ICkgPD0gODE5MFVMICkKLSAgICAgIGEgPSAoIGEgKiBiICsgMHg4MDAwVSApID4+IDE2OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIGFsID0gYSAmIDB4RkZGRlVMOwotCi0KLSAgICAgIGEgPSAoIGEgPj4gMTYgKSAqIGIgKyBhbCAqICggYiA+PiAxNiApICsKLSAgICAgICAgICAoICggYWwgKiAoIGIgJiAweEZGRkZVTCApICsgMHg4MDAwVUwgKSA+PiAxNiApOwotICAgIH0KLQotICAgIHNhIF49IHNiOwotICAgIGEgICA9ICggYSBeIHNhICkgLSBzYTsKLQotICAgIHJldHVybiAoRlRfTG9uZylhOwotCi0jZWxzZSAvKiAwICovCi0KLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQzMiAgYSwgYjsKLQotCi0gICAgLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG93IDY0LWJpdCBhcmd1bWVudHMgKi8KLQotICAgIGEgPSAoRlRfVUludDMyKWFfOwotICAgIGIgPSAoRlRfVUludDMyKWJfOwotCi0gICAgRlRfTU9WRV9TSUdOKCBhXywgYSwgcyApOwotICAgIEZUX01PVkVfU0lHTiggYl8sIGIsIHMgKTsKLQotICAgIGlmICggYSArICggYiA+PiA4ICkgPD0gODE5MFVMICkKLSAgICAgIGEgPSAoIGEgKiBiICsgMHg4MDAwVUwgKSA+PiAxNjsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfVUludDMyICBhbCA9IGEgJiAweEZGRkZVTDsKLQotCi0gICAgICBhID0gKCBhID4+IDE2ICkgKiBiICsgYWwgKiAoIGIgPj4gMTYgKSArCi0gICAgICAgICAgKCAoIGFsICogKCBiICYgMHhGRkZGVUwgKSArIDB4ODAwMFVMICkgPj4gMTYgKTsKLSAgICB9Ci0KLSAgICBhXyA9IChGVF9Mb25nKWE7Ci0KLSAgICByZXR1cm4gcyA8IDAgPyAtYV8gOiBhXzsKLQotI2VuZGlmIC8qIDAgKi8KLQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfRGl2Rml4KCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICBGVF9Mb25nICBiXyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQzMiAgYSwgYiwgcTsKLSAgICBGVF9Mb25nICAgIHFfOwotCi0KLSAgICAvKiBYWFg6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWxsb3cgNjQtYml0IGFyZ3VtZW50cyAqLwotCi0gICAgYSA9IChGVF9VSW50MzIpYV87Ci0gICAgYiA9IChGVF9VSW50MzIpYl87Ci0KLSAgICBGVF9NT1ZFX1NJR04oIGFfLCBhLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiXywgYiwgcyApOwotCi0gICAgaWYgKCBiID09IDAgKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIGZvciBkaXZpc2lvbiBieSAwICovCi0gICAgICBxID0gMHg3RkZGRkZGRlVMOwotICAgIH0KLSAgICBlbHNlIGlmICggYSA8PSA2NTUzNVVMIC0gKCBiID4+IDE3ICkgKQotICAgIHsKLSAgICAgIC8qIGNvbXB1dGUgcmVzdWx0IGRpcmVjdGx5ICovCi0gICAgICBxID0gKCAoIGEgPDwgMTYgKSArICggYiA+PiAxICkgKSAvIGI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiB3ZSBuZWVkIG1vcmUgYml0czsgd2UgaGF2ZSB0byBkbyBpdCBieSBoYW5kICovCi0gICAgICBGVF9JbnQ2NCAgdGVtcCwgdGVtcDI7Ci0KLQotICAgICAgdGVtcC5oaSAgPSBhID4+IDE2OwotICAgICAgdGVtcC5sbyAgPSBhIDw8IDE2OwotICAgICAgdGVtcDIuaGkgPSAwOwotICAgICAgdGVtcDIubG8gPSBiID4+IDE7Ci0KLSAgICAgIEZUX0FkZDY0KCAmdGVtcCwgJnRlbXAyLCAmdGVtcCApOwotICAgICAgcSA9IGZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYiApOwotICAgIH0KLQotICAgIHFfID0gKEZUX0xvbmcpcTsKLQotICAgIHJldHVybiBzIDwgMCA/IC1xXyA6IHFfOwotICB9Ci0KLQotI2VuZGlmIC8qICFGVF9MT05HNjQgKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX01hdHJpeF9NdWx0aXBseSggY29uc3QgRlRfTWF0cml4KiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXggICAgICAgICpiICkKLSAgewotICAgIEZUX0ZpeGVkICB4eCwgeHksIHl4LCB5eTsKLQotCi0gICAgaWYgKCAhYSB8fCAhYiApCi0gICAgICByZXR1cm47Ci0KLSAgICB4eCA9IEFERF9MT05HKCBGVF9NdWxGaXgoIGEtPnh4LCBiLT54eCApLAotICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggYS0+eHksIGItPnl4ICkgKTsKLSAgICB4eSA9IEFERF9MT05HKCBGVF9NdWxGaXgoIGEtPnh4LCBiLT54eSApLAotICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggYS0+eHksIGItPnl5ICkgKTsKLSAgICB5eCA9IEFERF9MT05HKCBGVF9NdWxGaXgoIGEtPnl4LCBiLT54eCApLAotICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggYS0+eXksIGItPnl4ICkgKTsKLSAgICB5eSA9IEFERF9MT05HKCBGVF9NdWxGaXgoIGEtPnl4LCBiLT54eSApLAotICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggYS0+eXksIGItPnl5ICkgKTsKLQotICAgIGItPnh4ID0geHg7Ci0gICAgYi0+eHkgPSB4eTsKLSAgICBiLT55eCA9IHl4OwotICAgIGItPnl5ID0geXk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9NYXRyaXhfSW52ZXJ0KCBGVF9NYXRyaXgqICBtYXRyaXggKQotICB7Ci0gICAgRlRfUG9zICBkZWx0YSwgeHgsIHl5OwotCi0KLSAgICBpZiAoICFtYXRyaXggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBjb21wdXRlIGRpc2NyaW1pbmFudCAqLwotICAgIGRlbHRhID0gRlRfTXVsRml4KCBtYXRyaXgtPnh4LCBtYXRyaXgtPnl5ICkgLQotICAgICAgICAgICAgRlRfTXVsRml4KCBtYXRyaXgtPnh5LCBtYXRyaXgtPnl4ICk7Ci0KLSAgICBpZiAoICFkZWx0YSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsgIC8qIG1hdHJpeCBjYW4ndCBiZSBpbnZlcnRlZCAqLwotCi0gICAgbWF0cml4LT54eSA9IC0gRlRfRGl2Rml4KCBtYXRyaXgtPnh5LCBkZWx0YSApOwotICAgIG1hdHJpeC0+eXggPSAtIEZUX0RpdkZpeCggbWF0cml4LT55eCwgZGVsdGEgKTsKLQotICAgIHh4ID0gbWF0cml4LT54eDsKLSAgICB5eSA9IG1hdHJpeC0+eXk7Ci0KLSAgICBtYXRyaXgtPnh4ID0gRlRfRGl2Rml4KCB5eSwgZGVsdGEgKTsKLSAgICBtYXRyaXgtPnl5ID0gRlRfRGl2Rml4KCB4eCwgZGVsdGEgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQoIGNvbnN0IEZUX01hdHJpeCogIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCAgICAgICAgKmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgIHNjYWxpbmcgKQotICB7Ci0gICAgRlRfRml4ZWQgIHh4LCB4eSwgeXgsIHl5OwotCi0gICAgRlRfTG9uZyAgIHZhbCA9IDB4MTAwMDBMICogc2NhbGluZzsKLQotCi0gICAgaWYgKCAhYSB8fCAhYiApCi0gICAgICByZXR1cm47Ci0KLSAgICB4eCA9IEFERF9MT05HKCBGVF9NdWxEaXYoIGEtPnh4LCBiLT54eCwgdmFsICksCi0gICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBhLT54eSwgYi0+eXgsIHZhbCApICk7Ci0gICAgeHkgPSBBRERfTE9ORyggRlRfTXVsRGl2KCBhLT54eCwgYi0+eHksIHZhbCApLAotICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggYS0+eHksIGItPnl5LCB2YWwgKSApOwotICAgIHl4ID0gQUREX0xPTkcoIEZUX011bERpdiggYS0+eXgsIGItPnh4LCB2YWwgKSwKLSAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGEtPnl5LCBiLT55eCwgdmFsICkgKTsKLSAgICB5eSA9IEFERF9MT05HKCBGVF9NdWxEaXYoIGEtPnl4LCBiLT54eSwgdmFsICksCi0gICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBhLT55eSwgYi0+eXksIHZhbCApICk7Ci0KLSAgICBiLT54eCA9IHh4OwotICAgIGItPnh5ID0geHk7Ci0gICAgYi0+eXggPSB5eDsKLSAgICBiLT55eSA9IHl5OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9WZWN0b3JfVHJhbnNmb3JtX1NjYWxlZCggRlRfVmVjdG9yKiAgICAgICAgdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgc2NhbGluZyApCi0gIHsKLSAgICBGVF9Qb3MgICB4eiwgeXo7Ci0KLSAgICBGVF9Mb25nICB2YWwgPSAweDEwMDAwTCAqIHNjYWxpbmc7Ci0KLQotICAgIGlmICggIXZlY3RvciB8fCAhbWF0cml4ICkKLSAgICAgIHJldHVybjsKLQotICAgIHh6ID0gQUREX0xPTkcoIEZUX011bERpdiggdmVjdG9yLT54LCBtYXRyaXgtPnh4LCB2YWwgKSwKLSAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIHZlY3Rvci0+eSwgbWF0cml4LT54eSwgdmFsICkgKTsKLSAgICB5eiA9IEFERF9MT05HKCBGVF9NdWxEaXYoIHZlY3Rvci0+eCwgbWF0cml4LT55eCwgdmFsICksCi0gICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCB2ZWN0b3ItPnksIG1hdHJpeC0+eXksIHZhbCApICk7Ci0KLSAgICB2ZWN0b3ItPnggPSB4ejsKLSAgICB2ZWN0b3ItPnkgPSB5ejsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9VSW50MzIgKQotICBGVF9WZWN0b3JfTm9ybUxlbiggRlRfVmVjdG9yKiAgdmVjdG9yICkKLSAgewotICAgIEZUX0ludDMyICAgeF8gPSB2ZWN0b3ItPng7Ci0gICAgRlRfSW50MzIgICB5XyA9IHZlY3Rvci0+eTsKLSAgICBGVF9JbnQzMiAgIGIsIHo7Ci0gICAgRlRfVUludDMyICB4LCB5LCB1LCB2LCBsOwotICAgIEZUX0ludCAgICAgc3ggPSAxLCBzeSA9IDEsIHNoaWZ0OwotCi0KLSAgICB4ID0gKEZUX1VJbnQzMil4XzsKLSAgICB5ID0gKEZUX1VJbnQzMil5XzsKLQotICAgIEZUX01PVkVfU0lHTiggeF8sIHgsIHN4ICk7Ci0gICAgRlRfTU9WRV9TSUdOKCB5XywgeSwgc3kgKTsKLQotICAgIC8qIHRyaXZpYWwgY2FzZXMgKi8KLSAgICBpZiAoIHggPT0gMCApCi0gICAgewotICAgICAgaWYgKCB5ID4gMCApCi0gICAgICAgIHZlY3Rvci0+eSA9IHN5ICogMHgxMDAwMDsKLSAgICAgIHJldHVybiB5OwotICAgIH0KLSAgICBlbHNlIGlmICggeSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIHggPiAwICkKLSAgICAgICAgdmVjdG9yLT54ID0gc3ggKiAweDEwMDAwOwotICAgICAgcmV0dXJuIHg7Ci0gICAgfQotCi0gICAgLyogRXN0aW1hdGUgbGVuZ3RoIGFuZCBwcmVub3JtYWxpemUgYnkgc2hpZnRpbmcgc28gdGhhdCAqLwotICAgIC8qIHRoZSBuZXcgYXBwcm94aW1hdGUgbGVuZ3RoIGlzIGJldHdlZW4gMi8zIGFuZCA0LzMuICAgKi8KLSAgICAvKiBUaGUgbWFnaWMgY29uc3RhbnQgMHhBQUFBQUFBQVVMICgyLzMgb2YgMl4zMikgaGVscHMgICovCi0gICAgLyogYWNoaWV2ZSB0aGlzIGluIDE2LjE2IGZpeGVkLXBvaW50IHJlcHJlc2VudGF0aW9uLiAgICAqLwotICAgIGwgPSB4ID4geSA/IHggKyAoIHkgPj4gMSApCi0gICAgICAgICAgICAgIDogeSArICggeCA+PiAxICk7Ci0KLSAgICBzaGlmdCAgPSAzMSAtIEZUX01TQiggbCApOwotICAgIHNoaWZ0IC09IDE1ICsgKCBsID49ICggMHhBQUFBQUFBQVVMID4+IHNoaWZ0ICkgKTsKLQotICAgIGlmICggc2hpZnQgPiAwICkKLSAgICB7Ci0gICAgICB4IDw8PSBzaGlmdDsKLSAgICAgIHkgPDw9IHNoaWZ0OwotCi0gICAgICAvKiByZS1lc3RpbWF0ZSBsZW5ndGggZm9yIHRpbnkgdmVjdG9ycyAqLwotICAgICAgbCA9IHggPiB5ID8geCArICggeSA+PiAxICkKLSAgICAgICAgICAgICAgICA6IHkgKyAoIHggPj4gMSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgeCA+Pj0gLXNoaWZ0OwotICAgICAgeSA+Pj0gLXNoaWZ0OwotICAgICAgbCA+Pj0gLXNoaWZ0OwotICAgIH0KLQotICAgIC8qIGxvd2VyIGxpbmVhciBhcHByb3hpbWF0aW9uIGZvciByZWNpcHJvY2FsIGxlbmd0aCBtaW51cyBvbmUgKi8KLSAgICBiID0gMHgxMDAwMCAtIChGVF9JbnQzMilsOwotCi0gICAgeF8gPSAoRlRfSW50MzIpeDsKLSAgICB5XyA9IChGVF9JbnQzMil5OwotCi0gICAgLyogTmV3dG9uJ3MgaXRlcmF0aW9ucyAqLwotICAgIGRvCi0gICAgewotICAgICAgdSA9IChGVF9VSW50MzIpKCB4XyArICggeF8gKiBiID4+IDE2ICkgKTsKLSAgICAgIHYgPSAoRlRfVUludDMyKSggeV8gKyAoIHlfICogYiA+PiAxNiApICk7Ci0KLSAgICAgIC8qIE5vcm1hbGl6ZWQgc3F1YXJlZCBsZW5ndGggaW4gdGhlIHBhcmVudGhlc2VzIGFwcHJvYWNoZXMgMl4zMi4gKi8KLSAgICAgIC8qIE9uIHR3bydzIGNvbXBsZW1lbnQgc3lzdGVtcywgY29udmVydGluZyB0byBzaWduZWQgZ2l2ZXMgdGhlICAgKi8KLSAgICAgIC8qIGRpZmZlcmVuY2Ugd2l0aCAyXjMyIGV2ZW4gaWYgdGhlIGV4cHJlc3Npb24gd3JhcHMgYXJvdW5kLiAgICAgKi8KLSAgICAgIHogPSAtKEZUX0ludDMyKSggdSAqIHUgKyB2ICogdiApIC8gMHgyMDA7Ci0gICAgICB6ID0geiAqICggKCAweDEwMDAwICsgYiApID4+IDggKSAvIDB4MTAwMDA7Ci0KLSAgICAgIGIgKz0gejsKLQotICAgIH0gd2hpbGUgKCB6ID4gMCApOwotCi0gICAgdmVjdG9yLT54ID0gc3ggPCAwID8gLShGVF9Qb3MpdSA6IChGVF9Qb3MpdTsKLSAgICB2ZWN0b3ItPnkgPSBzeSA8IDAgPyAtKEZUX1Bvcyl2IDogKEZUX1Bvcyl2OwotCi0gICAgLyogQ29udmVyc2lvbiB0byBzaWduZWQgaGVscHMgdG8gcmVjb3ZlciBmcm9tIGxpa2VseSB3cmFwIGFyb3VuZCAqLwotICAgIC8qIGluIGNhbGN1bGF0aW5nIHRoZSBwcmVub3JtYWxpemVkIGxlbmd0aCwgYmVjYXVzZSBpdCBnaXZlcyB0aGUgKi8KLSAgICAvKiBjb3JyZWN0IGRpZmZlcmVuY2Ugd2l0aCAyXjMyIG9uIHR3bydzIGNvbXBsZW1lbnQgc3lzdGVtcy4gICAgICovCi0gICAgbCA9IChGVF9VSW50MzIpKCAweDEwMDAwICsgKEZUX0ludDMyKSggdSAqIHggKyB2ICogeSApIC8gMHgxMDAwMCApOwotICAgIGlmICggc2hpZnQgPiAwICkKLSAgICAgIGwgPSAoIGwgKyAoIDEgPDwgKCBzaGlmdCAtIDEgKSApICkgPj4gc2hpZnQ7Ci0gICAgZWxzZQotICAgICAgbCA8PD0gLXNoaWZ0OwotCi0gICAgcmV0dXJuIGw7Ci0gIH0KLQotCi0jaWYgMAotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfSW50MzIgKQotICBGVF9TcXJ0Rml4ZWQoIEZUX0ludDMyICB4ICkKLSAgewotICAgIEZUX1VJbnQzMiAgcm9vdCwgcmVtX2hpLCByZW1fbG8sIHRlc3RfZGl2OwotICAgIEZUX0ludCAgICAgY291bnQ7Ci0KLQotICAgIHJvb3QgPSAwOwotCi0gICAgaWYgKCB4ID4gMCApCi0gICAgewotICAgICAgcmVtX2hpID0gMDsKLSAgICAgIHJlbV9sbyA9IChGVF9VSW50MzIpeDsKLSAgICAgIGNvdW50ICA9IDI0OwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgcmVtX2hpICAgPSAoIHJlbV9oaSA8PCAyICkgfCAoIHJlbV9sbyA+PiAzMCApOwotICAgICAgICByZW1fbG8gPDw9IDI7Ci0gICAgICAgIHJvb3QgICA8PD0gMTsKLSAgICAgICAgdGVzdF9kaXYgPSAoIHJvb3QgPDwgMSApICsgMTsKLQotICAgICAgICBpZiAoIHJlbV9oaSA+PSB0ZXN0X2RpdiApCi0gICAgICAgIHsKLSAgICAgICAgICByZW1faGkgLT0gdGVzdF9kaXY7Ci0gICAgICAgICAgcm9vdCAgICs9IDE7Ci0gICAgICAgIH0KLSAgICAgIH0gd2hpbGUgKCAtLWNvdW50ICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChGVF9JbnQzMilyb290OwotICB9Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0ludCApCi0gIGZ0X2Nvcm5lcl9vcmllbnRhdGlvbiggRlRfUG9zICBpbl94LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgaW5feSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF94LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3kgKQotICB7Ci0jaWZkZWYgRlRfTE9ORzY0Ci0KLSAgICBGVF9JbnQ2NCAgZGVsdGEgPSAoRlRfSW50NjQpaW5feCAqIG91dF95IC0gKEZUX0ludDY0KWluX3kgKiBvdXRfeDsKLQotCi0gICAgcmV0dXJuICggZGVsdGEgPiAwICkgLSAoIGRlbHRhIDwgMCApOwotCi0jZWxzZQotCi0gICAgRlRfSW50ICByZXN1bHQ7Ci0KLQotICAgIC8qIHdlIHNpbGVudGx5IGlnbm9yZSBvdmVyZmxvdyBlcnJvcnMsIHNpbmNlIHN1Y2ggbGFyZ2UgdmFsdWVzICovCi0gICAgLyogbGVhZCB0byBldmVuIG1vcmUgKGhhcm1sZXNzKSByZW5kZXJpbmcgZXJyb3JzIGxhdGVyIG9uICAgICAgKi8KLSAgICBpZiAoIEFERF9MT05HKCBGVF9BQlMoIGluX3ggKSwgRlRfQUJTKCBvdXRfeSApICkgPD0gMTMxMDcxTCAmJgotICAgICAgICAgQUREX0xPTkcoIEZUX0FCUyggaW5feSApLCBGVF9BQlMoIG91dF94ICkgKSA8PSAxMzEwNzFMICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICB6MSA9IE1VTF9MT05HKCBpbl94LCBvdXRfeSApOwotICAgICAgRlRfTG9uZyAgejIgPSBNVUxfTE9ORyggaW5feSwgb3V0X3ggKTsKLQotCi0gICAgICBpZiAoIHoxID4gejIgKQotICAgICAgICByZXN1bHQgPSArMTsKLSAgICAgIGVsc2UgaWYgKCB6MSA8IHoyICkKLSAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgfQotICAgIGVsc2UgLyogcHJvZHVjdHMgbWlnaHQgb3ZlcmZsb3cgMzIgYml0cyAqLwotICAgIHsKLSAgICAgIEZUX0ludDY0ICB6MSwgejI7Ci0KLQotICAgICAgLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG93IDY0LWJpdCBhcmd1bWVudHMgKi8KLSAgICAgIGZ0X211bHRvNjQoIChGVF9VSW50MzIpaW5feCwgKEZUX1VJbnQzMilvdXRfeSwgJnoxICk7Ci0gICAgICBmdF9tdWx0bzY0KCAoRlRfVUludDMyKWluX3ksIChGVF9VSW50MzIpb3V0X3gsICZ6MiApOwotCi0gICAgICBpZiAoIHoxLmhpID4gejIuaGkgKQotICAgICAgICByZXN1bHQgPSArMTsKLSAgICAgIGVsc2UgaWYgKCB6MS5oaSA8IHoyLmhpICkKLSAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICBlbHNlIGlmICggejEubG8gPiB6Mi5sbyApCi0gICAgICAgIHJlc3VsdCA9ICsxOwotICAgICAgZWxzZSBpZiAoIHoxLmxvIDwgejIubG8gKQotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0KLSAgICAvKiBYWFg6IG9ubHkgdGhlIHNpZ24gb2YgcmV0dXJuIHZhbHVlLCArMS8wLy0xIG11c3QgYmUgdXNlZCAqLwotICAgIHJldHVybiByZXN1bHQ7Ci0KLSNlbmRpZgotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0ludCApCi0gIGZ0X2Nvcm5lcl9pc19mbGF0KCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGluX3ksCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF94LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApCi0gIHsKLSAgICBGVF9Qb3MgIGF4ID0gaW5feCArIG91dF94OwotICAgIEZUX1BvcyAgYXkgPSBpbl95ICsgb3V0X3k7Ci0KLSAgICBGVF9Qb3MgIGRfaW4sIGRfb3V0LCBkX2h5cG90OwotCi0KLSAgICAvKiBUaGUgaWRlYSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGNvbXBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgKi8KLSAgICAvKiBoeXBvdGVudXNlIHdpdGggdGhlIGBpbicgYW5kIGBvdXQnIGxlbmd0aC4gIFRoZSBgY29ybmVyJyAgKi8KLSAgICAvKiByZXByZXNlbnRlZCBieSBgaW4nIGFuZCBgb3V0JyBpcyBmbGF0IGlmIHRoZSBoeXBvdGVudXNlJ3MgKi8KLSAgICAvKiBsZW5ndGggaXNuJ3QgdG9vIGxhcmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGlzIGFwcHJvYWNoIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIGFuZ2xlIGJldHdlZW4gICAgKi8KLSAgICAvKiBgaW4nIGFuZCBgb3V0JyBpcyBub3QgY2hlY2tlZC4gIEluIGNhc2Ugb25lIG9mIHRoZSB0d28gICAgKi8KLSAgICAvKiB2ZWN0b3JzIGlzIGBkb21pbmFudCcsIHRoaXMgaXMsIG11Y2ggbGFyZ2VyIHRoYW4gdGhlICAgICAgKi8KLSAgICAvKiBvdGhlciB2ZWN0b3IsIHdlIHRodXMgYWx3YXlzIGhhdmUgYSBmbGF0IGNvcm5lci4gICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICBoeXBvdGVudXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICB4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0teCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgIFwgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIGluICBcICAgICAgICAgIC8gIG91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgXCAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgIG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGRfaW4gICAgPSBGVF9IWVBPVCggIGluX3gsICBpbl95ICk7Ci0gICAgZF9vdXQgICA9IEZUX0hZUE9UKCBvdXRfeCwgb3V0X3kgKTsKLSAgICBkX2h5cG90ID0gRlRfSFlQT1QoICAgIGF4LCAgICBheSApOwotCi0gICAgLyogbm93IGRvIGEgc2ltcGxlIGxlbmd0aCBjb21wYXJpc29uOiAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIGRfaW4gKyBkX291dCA8IDE3LzE2IGRfaHlwb3QgICAgICovCi0KLSAgICByZXR1cm4gKCBkX2luICsgZF9vdXQgLSBkX2h5cG90ICkgPCAoIGRfaHlwb3QgPj4gNCApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGNpZC5jIGIvc3JjL2Jhc2UvZnRjaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4Mzk2Yi4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdGNpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2lkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBDSUQgZm9udCBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGVyZWsgQ2xlZ2cgYW5kIE1pY2hhZWwgVG9mdGRhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DSURfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0NJRF9ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2lkLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9DSURfUmVnaXN0cnlfT3JkZXJpbmdfU3VwcGxlbWVudCggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpvcmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQpCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgY29uc3QgY2hhciogIHIgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqICBvID0gTlVMTDsKLSAgICBGVF9JbnQgICAgICAgcyA9IDA7Ci0KLQotICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIGZhY2UgKQotICAgIHsKLSAgICAgIEZUX1NlcnZpY2VfQ0lEICBzZXJ2aWNlOwotCi0KLSAgICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBDSUQgKTsKLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPmdldF9yb3MgKQotICAgICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9yb3MoIGZhY2UsICZyLCAmbywgJnMgKTsKLSAgICB9Ci0KLSAgICBpZiAoIHJlZ2lzdHJ5ICkKLSAgICAgICpyZWdpc3RyeSA9IHI7Ci0KLSAgICBpZiAoIG9yZGVyaW5nICkKLSAgICAgICpvcmRlcmluZyA9IG87Ci0KLSAgICBpZiAoIHN1cHBsZW1lbnQgKQotICAgICAgKnN1cHBsZW1lbnQgPSBzOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9DSURfSXNfSW50ZXJuYWxseV9DSURfS2V5ZWQoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAqaXNfY2lkICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIEZUX0Jvb2wgICBpYyA9IDA7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfU2VydmljZV9DSUQgIHNlcnZpY2U7Ci0KLQotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIENJRCApOwotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+Z2V0X2lzX2NpZCApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X2lzX2NpZCggZmFjZSwgJmljKTsKLSAgICB9Ci0KLSAgICBpZiAoIGlzX2NpZCApCi0gICAgICAqaXNfY2lkID0gaWM7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0NJRF9Gcm9tX0dseXBoX0luZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmNpZCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBGVF9VSW50ICAgYyA9IDA7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfU2VydmljZV9DSUQgIHNlcnZpY2U7Ci0KLQotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIENJRCApOwotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+Z2V0X2NpZF9mcm9tX2dseXBoX2luZGV4ICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXgoIGZhY2UsIGdseXBoX2luZGV4LCAmYyk7Ci0gICAgfQotCi0gICAgaWYgKCBjaWQgKQotICAgICAgKmNpZCA9IGM7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0ZGJnbWVtLmMgYi9zcmMvYmFzZS9mdGRiZ21lbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDIyNDZiLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0ZGJnbWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRkYmdtZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE1lbW9yeSBkZWJ1Z2dlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotI2luY2x1ZGUgRlRfVFlQRVNfSAotCi0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLQotI2RlZmluZSAgS0VFUEFMSVZFIC8qIGBLZWVwIGFsaXZlJyBtZWFucyB0aGF0IGZyZWVkIGJsb2NrcyBhcmVuJ3QgcmVsZWFzZWQKLSAgICAgICAgICAgICAgICAgICAgKiB0byB0aGUgaGVhcC4gIFRoaXMgaXMgdXNlZnVsIHRvIGRldGVjdCBkb3VibGUtZnJlZXMKLSAgICAgICAgICAgICAgICAgICAgKiBvciB3ZWlyZCBoZWFwIGNvcnJ1cHRpb24sIGJ1dCBpdCB1c2VzIGxhcmdlIGFtb3VudHMgb2YKLSAgICAgICAgICAgICAgICAgICAgKiBtZW1vcnksIGhvd2V2ZXIuCi0gICAgICAgICAgICAgICAgICAgICovCi0KLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotICBGVF9CQVNFX0RFRiggY29uc3QgY2hhciogKSAgX2Z0X2RlYnVnX2ZpbGUgICA9IE5VTEw7Ci0gIEZUX0JBU0VfREVGKCBsb25nICkgICAgICAgICBfZnRfZGVidWdfbGluZW5vID0gMDsKLQotICBleHRlcm4gdm9pZAotICBGVF9EdW1wTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTWVtU291cmNlUmVjXyogIEZUX01lbVNvdXJjZTsKLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTWVtTm9kZVJlY18qICAgIEZUX01lbU5vZGU7Ci0gIHR5cGVkZWYgc3RydWN0IEZUX01lbVRhYmxlUmVjXyogICBGVF9NZW1UYWJsZTsKLQotCi0jZGVmaW5lIEZUX01FTV9WQUwoIGFkZHIgKSAgKCAoRlRfUHRyRGlzdCkoRlRfUG9pbnRlcikoIGFkZHIgKSApCi0KLSAgLyoKLSAgICogIFRoaXMgc3RydWN0dXJlIGhvbGRzIHN0YXRpc3RpY3MgZm9yIGEgc2luZ2xlIGFsbG9jYXRpb24vcmVsZWFzZQotICAgKiAgc2l0ZS4gIFRoaXMgaXMgdXNlZnVsIHRvIGtub3cgd2hlcmUgbWVtb3J5IG9wZXJhdGlvbnMgaGFwcGVuIHRoZQotICAgKiAgbW9zdC4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NZW1Tb3VyY2VSZWNfCi0gIHsKLSAgICBjb25zdCBjaGFyKiAgIGZpbGVfbmFtZTsKLSAgICBsb25nICAgICAgICAgIGxpbmVfbm87Ci0KLSAgICBGVF9Mb25nICAgICAgIGN1cl9ibG9ja3M7ICAgLyogY3VycmVudCBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrcyAqLwotICAgIEZUX0xvbmcgICAgICAgbWF4X2Jsb2NrczsgICAvKiBtYXguIG51bWJlciBvZiBhbGxvY2F0ZWQgYmxvY2tzICAgICovCi0gICAgRlRfTG9uZyAgICAgICBhbGxfYmxvY2tzOyAgIC8qIHRvdGFsIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkICAgKi8KLQotICAgIEZUX0xvbmcgICAgICAgY3VyX3NpemU7ICAgICAvKiBjdXJyZW50IGN1bXVsYXRpdmUgYWxsb2NhdGVkIHNpemUgKi8KLSAgICBGVF9Mb25nICAgICAgIG1heF9zaXplOyAgICAgLyogbWF4aW11bSBjdW11bGF0aXZlIGFsbG9jYXRlZCBzaXplICovCi0gICAgRlRfTG9uZyAgICAgICBhbGxfc2l6ZTsgICAgIC8qIHRvdGFsIGN1bXVsYXRpdmUgYWxsb2NhdGVkIHNpemUgICAqLwotCi0gICAgRlRfTG9uZyAgICAgICBjdXJfbWF4OyAgICAgIC8qIGN1cnJlbnQgbWF4aW11bSBhbGxvY2F0ZWQgc2l6ZSAqLwotCi0gICAgRlRfVUludDMyICAgICBoYXNoOwotICAgIEZUX01lbVNvdXJjZSAgbGluazsKLQotICB9IEZUX01lbVNvdXJjZVJlYzsKLQotCi0gIC8qCi0gICAqICBXZSBkb24ndCBuZWVkIGEgcmVzaXphYmxlIGFycmF5IGZvciB0aGUgbWVtb3J5IHNvdXJjZXMgYmVjYXVzZQotICAgKiAgdGhlaXIgbnVtYmVyIGlzIHByZXR0eSBsaW1pdGVkIHdpdGhpbiBGcmVlVHlwZS4KLSAgICovCi0jZGVmaW5lIEZUX01FTV9TT1VSQ0VfQlVDS0VUUyAgMTI4Ci0KLSAgLyoKLSAgICogIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYSBzaW5nbGUgYWxsb2NhdGVkCi0gICAqICBtZW1vcnkgYmxvY2suICBJZiBLRUVQQUxJVkUgaXMgZGVmaW5lZCwgYmxvY2tzIHRoYXQgYXJlIGZyZWVkIGJ5Ci0gICAqICBGcmVlVHlwZSBhcmUgbmV2ZXIgcmVsZWFzZWQgdG8gdGhlIHN5c3RlbS4gIEluc3RlYWQsIHRoZWlyIGBzaXplJwotICAgKiAgZmllbGQgaXMgc2V0IHRvIGAtc2l6ZScuICBUaGlzIGlzIG1haW5seSB1c2VmdWwgdG8gZGV0ZWN0IGRvdWJsZQotICAgKiAgZnJlZXMsIGF0IHRoZSBwcmljZSBvZiBhIGxhcmdlIG1lbW9yeSBmb290cHJpbnQgZHVyaW5nIGV4ZWN1dGlvbi4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NZW1Ob2RlUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICAgICBhZGRyZXNzOwotICAgIEZUX0xvbmcgICAgICAgc2l6ZTsgICAgIC8qIDwgMCBpZiB0aGUgYmxvY2sgd2FzIGZyZWVkICovCi0KLSAgICBGVF9NZW1Tb3VyY2UgIHNvdXJjZTsKLQotI2lmZGVmIEtFRVBBTElWRQotICAgIGNvbnN0IGNoYXIqICAgZnJlZV9maWxlX25hbWU7Ci0gICAgRlRfTG9uZyAgICAgICBmcmVlX2xpbmVfbm87Ci0jZW5kaWYKLQotICAgIEZUX01lbU5vZGUgICAgbGluazsKLQotICB9IEZUX01lbU5vZGVSZWM7Ci0KLQotICAvKgotICAgKiAgVGhlIGdsb2JhbCBzdHJ1Y3R1cmUsIGNvbnRhaW5pbmcgY29tcG91bmQgc3RhdGlzdGljcyBhbmQgYWxsIGhhc2gKLSAgICogIHRhYmxlcy4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NZW1UYWJsZVJlY18KLSAgewotICAgIEZUX0xvbmcgICAgICAgICAgc2l6ZTsKLSAgICBGVF9Mb25nICAgICAgICAgIG5vZGVzOwotICAgIEZUX01lbU5vZGUqICAgICAgYnVja2V0czsKLQotICAgIEZUX0xvbmcgICAgICAgICAgYWxsb2NfdG90YWw7Ci0gICAgRlRfTG9uZyAgICAgICAgICBhbGxvY19jdXJyZW50OwotICAgIEZUX0xvbmcgICAgICAgICAgYWxsb2NfbWF4OwotICAgIEZUX0xvbmcgICAgICAgICAgYWxsb2NfY291bnQ7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgIGJvdW5kX3RvdGFsOwotICAgIEZUX0xvbmcgICAgICAgICAgYWxsb2NfdG90YWxfbWF4OwotCi0gICAgRlRfQm9vbCAgICAgICAgICBib3VuZF9jb3VudDsKLSAgICBGVF9Mb25nICAgICAgICAgIGFsbG9jX2NvdW50X21heDsKLQotICAgIEZUX01lbVNvdXJjZSAgICAgc291cmNlc1tGVF9NRU1fU09VUkNFX0JVQ0tFVFNdOwotCi0gICAgRlRfQm9vbCAgICAgICAgICBrZWVwX2FsaXZlOwotCi0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnk7Ci0gICAgRlRfUG9pbnRlciAgICAgICBtZW1vcnlfdXNlcjsKLSAgICBGVF9BbGxvY19GdW5jICAgIGFsbG9jOwotICAgIEZUX0ZyZWVfRnVuYyAgICAgZnJlZTsKLSAgICBGVF9SZWFsbG9jX0Z1bmMgIHJlYWxsb2M7Ci0KLSAgfSBGVF9NZW1UYWJsZVJlYzsKLQotCi0jZGVmaW5lIEZUX01FTV9TSVpFX01JTiAgNwotI2RlZmluZSBGVF9NRU1fU0laRV9NQVggIDEzODQ1MTYzCi0KLSNkZWZpbmUgRlRfRklMRU5BTUUoIHggKSAgKCAoeCkgPyAoeCkgOiAidW5rbm93biBmaWxlIiApCi0KLQotICAvKgotICAgKiAgUHJpbWUgbnVtYmVycyBhcmUgdWdseSB0byBoYW5kbGUuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaW1wbGVtZW50Ci0gICAqICBMLUhhc2hpbmcsIHdoaWNoIGlzIDEwJSBmYXN0ZXIgYW5kIGRvZXNuJ3QgcmVxdWlyZSBkaXZpc2lvbnMuCi0gICAqLwotICBzdGF0aWMgY29uc3QgRlRfSW50ICBmdF9tZW1fcHJpbWVzW10gPQotICB7Ci0gICAgNywKLSAgICAxMSwKLSAgICAxOSwKLSAgICAzNywKLSAgICA3MywKLSAgICAxMDksCi0gICAgMTYzLAotICAgIDI1MSwKLSAgICAzNjcsCi0gICAgNTU3LAotICAgIDgyMywKLSAgICAxMjM3LAotICAgIDE4NjEsCi0gICAgMjc3NywKLSAgICA0MTc3LAotICAgIDYyNDcsCi0gICAgOTM3MSwKLSAgICAxNDA1NywKLSAgICAyMTA4OSwKLSAgICAzMTYyNywKLSAgICA0NzQzMSwKLSAgICA3MTE0MywKLSAgICAxMDY3MjEsCi0gICAgMTYwMDczLAotICAgIDI0MDEwMSwKLSAgICAzNjAxNjMsCi0gICAgNTQwMjE3LAotICAgIDgxMDM0MywKLSAgICAxMjE1NDk3LAotICAgIDE4MjMyMzEsCi0gICAgMjczNDg2NywKLSAgICA0MTAyMjgzLAotICAgIDYxNTM0MDksCi0gICAgOTIzMDExMywKLSAgICAxMzg0NTE2MywKLSAgfTsKLQotCi0gIHN0YXRpYyBGVF9Mb25nCi0gIGZ0X21lbV9jbG9zZXN0X3ByaW1lKCBGVF9Mb25nICBudW0gKQotICB7Ci0gICAgc2l6ZV90ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICBpIDwgc2l6ZW9mICggZnRfbWVtX3ByaW1lcyApIC8gc2l6ZW9mICggZnRfbWVtX3ByaW1lc1swXSApOyBpKysgKQotICAgICAgaWYgKCBmdF9tZW1fcHJpbWVzW2ldID4gbnVtICkKLSAgICAgICAgcmV0dXJuIGZ0X21lbV9wcmltZXNbaV07Ci0KLSAgICByZXR1cm4gRlRfTUVNX1NJWkVfTUFYOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9tZW1fZGVidWdfcGFuaWMoIGNvbnN0IGNoYXIqICBmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgLi4uICkKLSAgewotICAgIHZhX2xpc3QgIGFwOwotCi0KLSAgICBwcmludGYoICJGcmVlVHlwZS5EZWJ1ZzogIiApOwotCi0gICAgdmFfc3RhcnQoIGFwLCBmbXQgKTsKLSAgICB2cHJpbnRmKCBmbXQsIGFwICk7Ci0gICAgdmFfZW5kKCBhcCApOwotCi0gICAgcHJpbnRmKCAiXG4iICk7Ci0gICAgZXhpdCggRVhJVF9GQUlMVVJFICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Qb2ludGVyCi0gIGZ0X21lbV90YWJsZV9hbGxvYyggRlRfTWVtVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBzaXplICkKLSAgewotICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IHRhYmxlLT5tZW1vcnk7Ci0gICAgRlRfUG9pbnRlciAgYmxvY2s7Ci0KLQotICAgIG1lbW9yeS0+dXNlciA9IHRhYmxlLT5tZW1vcnlfdXNlcjsKLSAgICBibG9jayA9IHRhYmxlLT5hbGxvYyggbWVtb3J5LCBzaXplICk7Ci0gICAgbWVtb3J5LT51c2VyID0gdGFibGU7Ci0KLSAgICByZXR1cm4gYmxvY2s7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X21lbV90YWJsZV9mcmVlKCBGVF9NZW1UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgYmxvY2sgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSB0YWJsZS0+bWVtb3J5OwotCi0KLSAgICBtZW1vcnktPnVzZXIgPSB0YWJsZS0+bWVtb3J5X3VzZXI7Ci0gICAgdGFibGUtPmZyZWUoIG1lbW9yeSwgYmxvY2sgKTsKLSAgICBtZW1vcnktPnVzZXIgPSB0YWJsZTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX3RhYmxlX3Jlc2l6ZSggRlRfTWVtVGFibGUgIHRhYmxlICkKLSAgewotICAgIEZUX0xvbmcgIG5ld19zaXplOwotCi0KLSAgICBuZXdfc2l6ZSA9IGZ0X21lbV9jbG9zZXN0X3ByaW1lKCB0YWJsZS0+bm9kZXMgKTsKLSAgICBpZiAoIG5ld19zaXplICE9IHRhYmxlLT5zaXplICkKLSAgICB7Ci0gICAgICBGVF9NZW1Ob2RlKiAgbmV3X2J1Y2tldHM7Ci0gICAgICBGVF9Mb25nICAgICAgaTsKLQotCi0gICAgICBuZXdfYnVja2V0cyA9IChGVF9NZW1Ob2RlICopCi0gICAgICAgICAgICAgICAgICAgICAgZnRfbWVtX3RhYmxlX2FsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2l6ZSAqIChGVF9Mb25nKXNpemVvZiAoIEZUX01lbU5vZGUgKSApOwotICAgICAgaWYgKCAhbmV3X2J1Y2tldHMgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIEZUX0FSUkFZX1pFUk8oIG5ld19idWNrZXRzLCBuZXdfc2l6ZSApOwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKysgKQotICAgICAgewotICAgICAgICBGVF9NZW1Ob2RlICBub2RlLCBuZXh0LCAqcG5vZGU7Ci0gICAgICAgIEZUX1B0ckRpc3QgIGhhc2g7Ci0KLQotICAgICAgICBub2RlID0gdGFibGUtPmJ1Y2tldHNbaV07Ci0gICAgICAgIHdoaWxlICggbm9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICBuZXh0ICA9IG5vZGUtPmxpbms7Ci0gICAgICAgICAgaGFzaCAgPSBGVF9NRU1fVkFMKCBub2RlLT5hZGRyZXNzICkgJSAoRlRfUHRyRGlzdCluZXdfc2l6ZTsKLSAgICAgICAgICBwbm9kZSA9IG5ld19idWNrZXRzICsgaGFzaDsKLQotICAgICAgICAgIG5vZGUtPmxpbmsgPSBwbm9kZVswXTsKLSAgICAgICAgICBwbm9kZVswXSAgID0gbm9kZTsKLQotICAgICAgICAgIG5vZGUgPSBuZXh0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdGFibGUtPmJ1Y2tldHMgKQotICAgICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIHRhYmxlLT5idWNrZXRzICk7Ci0KLSAgICAgIHRhYmxlLT5idWNrZXRzID0gbmV3X2J1Y2tldHM7Ci0gICAgICB0YWJsZS0+c2l6ZSAgICA9IG5ld19zaXplOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX01lbVRhYmxlCi0gIGZ0X21lbV90YWJsZV9uZXcoIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX01lbVRhYmxlICB0YWJsZTsKLQotCi0gICAgdGFibGUgPSAoRlRfTWVtVGFibGUpbWVtb3J5LT5hbGxvYyggbWVtb3J5LCBzaXplb2YgKCAqdGFibGUgKSApOwotICAgIGlmICggIXRhYmxlICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1pFUk8oIHRhYmxlICk7Ci0KLSAgICB0YWJsZS0+c2l6ZSAgPSBGVF9NRU1fU0laRV9NSU47Ci0gICAgdGFibGUtPm5vZGVzID0gMDsKLQotICAgIHRhYmxlLT5tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgICB0YWJsZS0+bWVtb3J5X3VzZXIgPSBtZW1vcnktPnVzZXI7Ci0KLSAgICB0YWJsZS0+YWxsb2MgICA9IG1lbW9yeS0+YWxsb2M7Ci0gICAgdGFibGUtPnJlYWxsb2MgPSBtZW1vcnktPnJlYWxsb2M7Ci0gICAgdGFibGUtPmZyZWUgICAgPSBtZW1vcnktPmZyZWU7Ci0KLSAgICB0YWJsZS0+YnVja2V0cyA9IChGVF9NZW1Ob2RlICopCi0gICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS0+YWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5zaXplICogKEZUX0xvbmcpc2l6ZW9mICggRlRfTWVtTm9kZSApICk7Ci0gICAgaWYgKCB0YWJsZS0+YnVja2V0cyApCi0gICAgICBGVF9BUlJBWV9aRVJPKCB0YWJsZS0+YnVja2V0cywgdGFibGUtPnNpemUgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgbWVtb3J5LT5mcmVlKCBtZW1vcnksIHRhYmxlICk7Ci0gICAgICB0YWJsZSA9IE5VTEw7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHRhYmxlOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9tZW1fdGFibGVfZGVzdHJveSggRlRfTWVtVGFibGUgIHRhYmxlICkKLSAgewotICAgIEZUX0xvbmcgIGk7Ci0gICAgRlRfTG9uZyAgbGVha19jb3VudCA9IDA7Ci0gICAgRlRfTG9uZyAgbGVha3MgICAgICA9IDA7Ci0KLQotICAgIEZUX0R1bXBNZW1vcnkoIHRhYmxlLT5tZW1vcnkgKTsKLQotICAgIC8qIHJlbW92ZSBhbGwgYmxvY2tzIGZyb20gdGhlIHRhYmxlLCByZXZlYWxpbmcgbGVha2VkIG9uZXMgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKysgKQotICAgIHsKLSAgICAgIEZUX01lbU5vZGUgICpwbm9kZSA9IHRhYmxlLT5idWNrZXRzICsgaSwgbmV4dCwgbm9kZSA9ICpwbm9kZTsKLQotCi0gICAgICB3aGlsZSAoIG5vZGUgKQotICAgICAgewotICAgICAgICBuZXh0ICAgICAgID0gbm9kZS0+bGluazsKLSAgICAgICAgbm9kZS0+bGluayA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKCBub2RlLT5zaXplID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBwcmludGYoCi0gICAgICAgICAgICAibGVha2VkIG1lbW9yeSBibG9jayBhdCBhZGRyZXNzICVwLCBzaXplICU4bGQgaW4gKCVzOiVsZClcbiIsCi0gICAgICAgICAgICAodm9pZCopbm9kZS0+YWRkcmVzcywKLSAgICAgICAgICAgIG5vZGUtPnNpemUsCi0gICAgICAgICAgICBGVF9GSUxFTkFNRSggbm9kZS0+c291cmNlLT5maWxlX25hbWUgKSwKLSAgICAgICAgICAgIG5vZGUtPnNvdXJjZS0+bGluZV9ubyApOwotCi0gICAgICAgICAgbGVha19jb3VudCsrOwotICAgICAgICAgIGxlYWtzICs9IG5vZGUtPnNpemU7Ci0KLSAgICAgICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIG5vZGUtPmFkZHJlc3MgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5vZGUtPmFkZHJlc3MgPSBOVUxMOwotICAgICAgICBub2RlLT5zaXplICAgID0gMDsKLQotICAgICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIG5vZGUgKTsKLSAgICAgICAgbm9kZSA9IG5leHQ7Ci0gICAgICB9Ci0gICAgICB0YWJsZS0+YnVja2V0c1tpXSA9IE5VTEw7Ci0gICAgfQotCi0gICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCB0YWJsZS0+YnVja2V0cyApOwotICAgIHRhYmxlLT5idWNrZXRzID0gTlVMTDsKLQotICAgIHRhYmxlLT5zaXplICA9IDA7Ci0gICAgdGFibGUtPm5vZGVzID0gMDsKLQotICAgIC8qIHJlbW92ZSBhbGwgc291cmNlcyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfTUVNX1NPVVJDRV9CVUNLRVRTOyBpKysgKQotICAgIHsKLSAgICAgIEZUX01lbVNvdXJjZSAgc291cmNlLCBuZXh0OwotCi0KLSAgICAgIGZvciAoIHNvdXJjZSA9IHRhYmxlLT5zb3VyY2VzW2ldOyBzb3VyY2UgIT0gTlVMTDsgc291cmNlID0gbmV4dCApCi0gICAgICB7Ci0gICAgICAgIG5leHQgPSBzb3VyY2UtPmxpbms7Ci0gICAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgc291cmNlICk7Ci0gICAgICB9Ci0KLSAgICAgIHRhYmxlLT5zb3VyY2VzW2ldID0gTlVMTDsKLSAgICB9Ci0KLSAgICBwcmludGYoICJGcmVlVHlwZTogdG90YWwgbWVtb3J5IGFsbG9jYXRpb25zID0gJWxkXG4iLAotICAgICAgICAgICAgdGFibGUtPmFsbG9jX3RvdGFsICk7Ci0gICAgcHJpbnRmKCAiRnJlZVR5cGU6IG1heGltdW0gbWVtb3J5IGZvb3RwcmludCA9ICVsZFxuIiwKLSAgICAgICAgICAgIHRhYmxlLT5hbGxvY19tYXggKTsKLQotICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgdGFibGUgKTsKLQotICAgIGlmICggbGVha19jb3VudCA+IDAgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAiRnJlZVR5cGU6ICVsZCBieXRlcyBvZiBtZW1vcnkgbGVha2VkIGluICVsZCBibG9ja3NcbiIsCi0gICAgICAgIGxlYWtzLCBsZWFrX2NvdW50ICk7Ci0KLSAgICBwcmludGYoICJGcmVlVHlwZTogbm8gbWVtb3J5IGxlYWtzIGRldGVjdGVkXG4iICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9NZW1Ob2RlKgotICBmdF9tZW1fdGFibGVfZ2V0X25vZGVwKCBGVF9NZW1UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICBhZGRyZXNzICkKLSAgewotICAgIEZUX1B0ckRpc3QgICBoYXNoOwotICAgIEZUX01lbU5vZGUgICpwbm9kZSwgbm9kZTsKLQotCi0gICAgaGFzaCAgPSBGVF9NRU1fVkFMKCBhZGRyZXNzICk7Ci0gICAgcG5vZGUgPSB0YWJsZS0+YnVja2V0cyArICggaGFzaCAlIChGVF9QdHJEaXN0KXRhYmxlLT5zaXplICk7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIG5vZGUgPSBwbm9kZVswXTsKLSAgICAgIGlmICggIW5vZGUgKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBub2RlLT5hZGRyZXNzID09IGFkZHJlc3MgKQotICAgICAgICBicmVhazsKLQotICAgICAgcG5vZGUgPSAmbm9kZS0+bGluazsKLSAgICB9Ci0gICAgcmV0dXJuIHBub2RlOwotICB9Ci0KLQotICBzdGF0aWMgRlRfTWVtU291cmNlCi0gIGZ0X21lbV90YWJsZV9nZXRfc291cmNlKCBGVF9NZW1UYWJsZSAgdGFibGUgKQotICB7Ci0gICAgRlRfVUludDMyICAgICBoYXNoOwotICAgIEZUX01lbVNvdXJjZSAgbm9kZSwgKnBub2RlOwotCi0KLSAgICAvKiBjYXN0IHRvIEZUX1B0ckRpc3QgZmlyc3Qgc2luY2Ugdm9pZCogY2FuIGJlIGxhcmdlciAqLwotICAgIC8qIHRoYW4gRlRfVUludDMyIGFuZCBHQ0MgNC4xLjEgZW1pdHMgYSB3YXJuaW5nICAgICAgICovCi0gICAgaGFzaCAgPSAoRlRfVUludDMyKShGVF9QdHJEaXN0KSh2b2lkKilfZnRfZGVidWdfZmlsZSArCi0gICAgICAgICAgICAgIChGVF9VSW50MzIpKCA1ICogX2Z0X2RlYnVnX2xpbmVubyApOwotICAgIHBub2RlID0gJnRhYmxlLT5zb3VyY2VzW2hhc2ggJSBGVF9NRU1fU09VUkNFX0JVQ0tFVFNdOwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBub2RlID0gKnBub2RlOwotICAgICAgaWYgKCAhbm9kZSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIG5vZGUtPmZpbGVfbmFtZSA9PSBfZnRfZGVidWdfZmlsZSAgICYmCi0gICAgICAgICAgIG5vZGUtPmxpbmVfbm8gICA9PSBfZnRfZGVidWdfbGluZW5vICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwbm9kZSA9ICZub2RlLT5saW5rOwotICAgIH0KLQotICAgIG5vZGUgPSAoRlRfTWVtU291cmNlKWZ0X21lbV90YWJsZV9hbGxvYyggdGFibGUsIHNpemVvZiAoICpub2RlICkgKTsKLSAgICBpZiAoICFub2RlICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYygKLSAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gbWVtb3J5IGRlYnVnZ2luZ1xuIiApOwotCi0gICAgbm9kZS0+ZmlsZV9uYW1lID0gX2Z0X2RlYnVnX2ZpbGU7Ci0gICAgbm9kZS0+bGluZV9ubyAgID0gX2Z0X2RlYnVnX2xpbmVubzsKLQotICAgIG5vZGUtPmN1cl9ibG9ja3MgPSAwOwotICAgIG5vZGUtPm1heF9ibG9ja3MgPSAwOwotICAgIG5vZGUtPmFsbF9ibG9ja3MgPSAwOwotCi0gICAgbm9kZS0+Y3VyX3NpemUgPSAwOwotICAgIG5vZGUtPm1heF9zaXplID0gMDsKLSAgICBub2RlLT5hbGxfc2l6ZSA9IDA7Ci0KLSAgICBub2RlLT5jdXJfbWF4ID0gMDsKLQotICAgIG5vZGUtPmxpbmsgPSBOVUxMOwotICAgIG5vZGUtPmhhc2ggPSBoYXNoOwotICAgICpwbm9kZSAgICAgPSBub2RlOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIG5vZGU7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X21lbV90YWJsZV9zZXQoIEZUX01lbVRhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgZGVsdGEgKQotICB7Ci0gICAgRlRfTWVtTm9kZSAgKnBub2RlLCBub2RlOwotCi0KLSAgICBpZiAoIHRhYmxlICkKLSAgICB7Ci0gICAgICBGVF9NZW1Tb3VyY2UgIHNvdXJjZTsKLQotCi0gICAgICBwbm9kZSA9IGZ0X21lbV90YWJsZV9nZXRfbm9kZXAoIHRhYmxlLCBhZGRyZXNzICk7Ci0gICAgICBub2RlICA9ICpwbm9kZTsKLSAgICAgIGlmICggbm9kZSApCi0gICAgICB7Ci0gICAgICAgIGlmICggbm9kZS0+c2l6ZSA8IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBibG9jayB3YXMgYWxyZWFkeSBmcmVlZC4gIE91ciBtZW1vcnkgaXMgbm93IGNvbXBsZXRlbHkgKi8KLSAgICAgICAgICAvKiBjb3JydXB0ZWQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGluIGtlZXAtYWxpdmUgbW9kZS4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAgICAgIm1lbW9yeSBoZWFwIGNvcnJ1cHRlZCAoYWxsb2NhdGluZyBmcmVlZCBibG9jaykiICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBibG9jayB3YXMgYWxyZWFkeSBhbGxvY2F0ZWQuICBUaGlzIG1lYW5zIHRoYXQgb3VyIG1lbW9yeSAqLwotICAgICAgICAgIC8qIGlzIGFsc28gY29ycnVwdGVkISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICAgICAibWVtb3J5IGhlYXAgY29ycnVwdGVkIChyZS1hbGxvY2F0aW5nIGFsbG9jYXRlZCBibG9jayBhdCIKLSAgICAgICAgICAgICIgJXAsIG9mIHNpemUgJWxkKVxuIgotICAgICAgICAgICAgIm9yZz0lczolZCBuZXc9JXM6JWRcbiIsCi0gICAgICAgICAgICBub2RlLT5hZGRyZXNzLCBub2RlLT5zaXplLAotICAgICAgICAgICAgRlRfRklMRU5BTUUoIG5vZGUtPnNvdXJjZS0+ZmlsZV9uYW1lICksIG5vZGUtPnNvdXJjZS0+bGluZV9ubywKLSAgICAgICAgICAgIEZUX0ZJTEVOQU1FKCBfZnRfZGVidWdfZmlsZSApLCBfZnRfZGVidWdfbGluZW5vICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgbm9kZSBpbiB0aGlzIHRhYmxlICovCi0gICAgICBub2RlID0gKEZUX01lbU5vZGUpZnRfbWVtX3RhYmxlX2FsbG9jKCB0YWJsZSwgc2l6ZW9mICggKm5vZGUgKSApOwotICAgICAgaWYgKCAhbm9kZSApCi0gICAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggIm5vdCBlbm91Z2ggbWVtb3J5IHRvIHJ1biBtZW1vcnkgdGVzdHMiICk7Ci0KLSAgICAgIG5vZGUtPmFkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgbm9kZS0+c2l6ZSAgICA9IHNpemU7Ci0gICAgICBub2RlLT5zb3VyY2UgID0gc291cmNlID0gZnRfbWVtX3RhYmxlX2dldF9zb3VyY2UoIHRhYmxlICk7Ci0KLSAgICAgIGlmICggZGVsdGEgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgaXMgYW4gYWxsb2NhdGlvbiAqLwotICAgICAgICBzb3VyY2UtPmFsbF9ibG9ja3MrKzsKLSAgICAgICAgc291cmNlLT5jdXJfYmxvY2tzKys7Ci0gICAgICAgIGlmICggc291cmNlLT5jdXJfYmxvY2tzID4gc291cmNlLT5tYXhfYmxvY2tzICkKLSAgICAgICAgICBzb3VyY2UtPm1heF9ibG9ja3MgPSBzb3VyY2UtPmN1cl9ibG9ja3M7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggc2l6ZSA+IHNvdXJjZS0+Y3VyX21heCApCi0gICAgICAgIHNvdXJjZS0+Y3VyX21heCA9IHNpemU7Ci0KLSAgICAgIGlmICggZGVsdGEgIT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIHdlIGFyZSBncm93aW5nIG9yIHNocmlua2luZyBhIHJlYWxsb2NhdGVkIGJsb2NrICovCi0gICAgICAgIHNvdXJjZS0+Y3VyX3NpemUgICAgICs9IGRlbHRhOwotICAgICAgICB0YWJsZS0+YWxsb2NfY3VycmVudCArPSBkZWx0YTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogd2UgYXJlIGFsbG9jYXRpbmcgYSBuZXcgYmxvY2sgKi8KLSAgICAgICAgc291cmNlLT5jdXJfc2l6ZSAgICAgKz0gc2l6ZTsKLSAgICAgICAgdGFibGUtPmFsbG9jX2N1cnJlbnQgKz0gc2l6ZTsKLSAgICAgIH0KLQotICAgICAgc291cmNlLT5hbGxfc2l6ZSArPSBzaXplOwotCi0gICAgICBpZiAoIHNvdXJjZS0+Y3VyX3NpemUgPiBzb3VyY2UtPm1heF9zaXplICkKLSAgICAgICAgc291cmNlLT5tYXhfc2l6ZSA9IHNvdXJjZS0+Y3VyX3NpemU7Ci0KLSAgICAgIG5vZGUtPmZyZWVfZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIG5vZGUtPmZyZWVfbGluZV9ubyAgID0gMDsKLQotICAgICAgbm9kZS0+bGluayA9IHBub2RlWzBdOwotCi0gICAgICBwbm9kZVswXSA9IG5vZGU7Ci0gICAgICB0YWJsZS0+bm9kZXMrKzsKLQotICAgICAgdGFibGUtPmFsbG9jX3RvdGFsICs9IHNpemU7Ci0KLSAgICAgIGlmICggdGFibGUtPmFsbG9jX2N1cnJlbnQgPiB0YWJsZS0+YWxsb2NfbWF4ICkKLSAgICAgICAgdGFibGUtPmFsbG9jX21heCA9IHRhYmxlLT5hbGxvY19jdXJyZW50OwotCi0gICAgICBpZiAoIHRhYmxlLT5ub2RlcyAqIDMgPCB0YWJsZS0+c2l6ZSAgfHwKLSAgICAgICAgICAgdGFibGUtPnNpemUgICogMyA8IHRhYmxlLT5ub2RlcyApCi0gICAgICAgIGZ0X21lbV90YWJsZV9yZXNpemUoIHRhYmxlICk7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9tZW1fdGFibGVfcmVtb3ZlKCBGVF9NZW1UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgZGVsdGEgKQotICB7Ci0gICAgaWYgKCB0YWJsZSApCi0gICAgewotICAgICAgRlRfTWVtTm9kZSAgKnBub2RlLCBub2RlOwotCi0KLSAgICAgIHBub2RlID0gZnRfbWVtX3RhYmxlX2dldF9ub2RlcCggdGFibGUsIGFkZHJlc3MgKTsKLSAgICAgIG5vZGUgID0gKnBub2RlOwotICAgICAgaWYgKCBub2RlICkKLSAgICAgIHsKLSAgICAgICAgRlRfTWVtU291cmNlICBzb3VyY2U7Ci0KLQotICAgICAgICBpZiAoIG5vZGUtPnNpemUgPCAwICkKLSAgICAgICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICAgICAiZnJlZWluZyBtZW1vcnkgYmxvY2sgYXQgJXAgbW9yZSB0aGFuIG9uY2UgYXQgKCVzOiVsZClcbiIKLSAgICAgICAgICAgICJibG9jayBhbGxvY2F0ZWQgYXQgKCVzOiVsZCkgYW5kIHJlbGVhc2VkIGF0ICglczolbGQpIiwKLSAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICBGVF9GSUxFTkFNRSggX2Z0X2RlYnVnX2ZpbGUgKSwgX2Z0X2RlYnVnX2xpbmVubywKLSAgICAgICAgICAgIEZUX0ZJTEVOQU1FKCBub2RlLT5zb3VyY2UtPmZpbGVfbmFtZSApLCBub2RlLT5zb3VyY2UtPmxpbmVfbm8sCi0gICAgICAgICAgICBGVF9GSUxFTkFNRSggbm9kZS0+ZnJlZV9maWxlX25hbWUgKSwgbm9kZS0+ZnJlZV9saW5lX25vICk7Ci0KLSAgICAgICAgLyogc2NyYW1ibGUgdGhlIG5vZGUncyBjb250ZW50IGZvciBhZGRpdGlvbmFsIHNhZmV0eSAqLwotICAgICAgICBGVF9NRU1fU0VUKCBhZGRyZXNzLCAweEYzLCBub2RlLT5zaXplICk7Ci0KLSAgICAgICAgaWYgKCBkZWx0YSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIHNvdXJjZSA9IG5vZGUtPnNvdXJjZTsKLQotICAgICAgICAgIHNvdXJjZS0+Y3VyX2Jsb2Nrcy0tOwotICAgICAgICAgIHNvdXJjZS0+Y3VyX3NpemUgLT0gbm9kZS0+c2l6ZTsKLQotICAgICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50IC09IG5vZGUtPnNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHRhYmxlLT5rZWVwX2FsaXZlICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHdlIHNpbXBseSBpbnZlcnQgdGhlIG5vZGUncyBzaXplIHRvIGluZGljYXRlIHRoYXQgdGhlIG5vZGUgKi8KLSAgICAgICAgICAvKiB3YXMgZnJlZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgbm9kZS0+c2l6ZSAgICAgICAgICAgPSAtbm9kZS0+c2l6ZTsKLSAgICAgICAgICBub2RlLT5mcmVlX2ZpbGVfbmFtZSA9IF9mdF9kZWJ1Z19maWxlOwotICAgICAgICAgIG5vZGUtPmZyZWVfbGluZV9ubyAgID0gX2Z0X2RlYnVnX2xpbmVubzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0YWJsZS0+bm9kZXMtLTsKLQotICAgICAgICAgICpwbm9kZSA9IG5vZGUtPmxpbms7Ci0KLSAgICAgICAgICBub2RlLT5zaXplICAgPSAwOwotICAgICAgICAgIG5vZGUtPnNvdXJjZSA9IE5VTEw7Ci0KLSAgICAgICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIG5vZGUgKTsKLQotICAgICAgICAgIGlmICggdGFibGUtPm5vZGVzICogMyA8IHRhYmxlLT5zaXplICB8fAotICAgICAgICAgICAgICAgdGFibGUtPnNpemUgICogMyA8IHRhYmxlLT5ub2RlcyApCi0gICAgICAgICAgICBmdF9tZW1fdGFibGVfcmVzaXplKCB0YWJsZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYygKLSAgICAgICAgICAidHJ5aW5nIHRvIGZyZWUgdW5rbm93biBibG9jayBhdCAlcCBpbiAoJXM6JWxkKVxuIiwKLSAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgIEZUX0ZJTEVOQU1FKCBfZnRfZGVidWdfZmlsZSApLCBfZnRfZGVidWdfbGluZW5vICk7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfUG9pbnRlcgotICBmdF9tZW1fZGVidWdfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSApCi0gIHsKLSAgICBGVF9NZW1UYWJsZSAgdGFibGUgPSAoRlRfTWVtVGFibGUpbWVtb3J5LT51c2VyOwotICAgIEZUX0J5dGUqICAgICBibG9jazsKLQotCi0gICAgaWYgKCBzaXplIDw9IDAgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKCAibmVnYXRpdmUgYmxvY2sgc2l6ZSBhbGxvY2F0aW9uICglbGQpIiwgc2l6ZSApOwotCi0gICAgLyogcmV0dXJuIE5VTEwgaWYgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG9jYXRpb25zIHdhcyByZWFjaGVkICovCi0gICAgaWYgKCB0YWJsZS0+Ym91bmRfY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdGFibGUtPmFsbG9jX2NvdW50ID49IHRhYmxlLT5hbGxvY19jb3VudF9tYXggKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiByZXR1cm4gTlVMTCBpZiB0aGlzIGFsbG9jYXRpb24gd291bGQgb3ZlcmZsb3cgdGhlIG1heGltdW0gaGVhcCBzaXplICovCi0gICAgaWYgKCB0YWJsZS0+Ym91bmRfdG90YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB0YWJsZS0+YWxsb2NfdG90YWxfbWF4IC0gdGFibGUtPmFsbG9jX2N1cnJlbnQgPiBzaXplICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgYmxvY2sgPSAoRlRfQnl0ZSAqKWZ0X21lbV90YWJsZV9hbGxvYyggdGFibGUsIHNpemUgKTsKLSAgICBpZiAoIGJsb2NrICkKLSAgICB7Ci0gICAgICBmdF9tZW1fdGFibGVfc2V0KCB0YWJsZSwgYmxvY2ssIHNpemUsIDAgKTsKLQotICAgICAgdGFibGUtPmFsbG9jX2NvdW50Kys7Ci0gICAgfQotCi0gICAgX2Z0X2RlYnVnX2ZpbGUgICA9ICI8dW5rbm93bj4iOwotICAgIF9mdF9kZWJ1Z19saW5lbm8gPSAwOwotCi0gICAgcmV0dXJuIChGVF9Qb2ludGVyKWJsb2NrOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9tZW1fZGVidWdfZnJlZSggRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYmxvY2sgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+dXNlcjsKLQotCi0gICAgaWYgKCAhYmxvY2sgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKCAidHJ5aW5nIHRvIGZyZWUgTlVMTCBpbiAoJXM6JWxkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZJTEVOQU1FKCBfZnRfZGVidWdfZmlsZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfZnRfZGVidWdfbGluZW5vICk7Ci0KLSAgICBmdF9tZW1fdGFibGVfcmVtb3ZlKCB0YWJsZSwgKEZUX0J5dGUqKWJsb2NrLCAwICk7Ci0KLSAgICBpZiAoICF0YWJsZS0+a2VlcF9hbGl2ZSApCi0gICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIGJsb2NrICk7Ci0KLSAgICB0YWJsZS0+YWxsb2NfY291bnQtLTsKLQotICAgIF9mdF9kZWJ1Z19maWxlICAgPSAiPHVua25vd24+IjsKLSAgICBfZnRfZGVidWdfbGluZW5vID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1BvaW50ZXIKLSAgZnRfbWVtX2RlYnVnX3JlYWxsb2MoIEZUX01lbW9yeSAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGN1cl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgbmV3X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBibG9jayApCi0gIHsKLSAgICBGVF9NZW1UYWJsZSAgdGFibGUgPSAoRlRfTWVtVGFibGUpbWVtb3J5LT51c2VyOwotICAgIEZUX01lbU5vZGUgICBub2RlLCAqcG5vZGU7Ci0gICAgRlRfUG9pbnRlciAgIG5ld19ibG9jazsKLSAgICBGVF9Mb25nICAgICAgZGVsdGE7Ci0KLSAgICBjb25zdCBjaGFyKiAgZmlsZV9uYW1lID0gRlRfRklMRU5BTUUoIF9mdF9kZWJ1Z19maWxlICk7Ci0gICAgRlRfTG9uZyAgICAgIGxpbmVfbm8gICA9IF9mdF9kZWJ1Z19saW5lbm87Ci0KLQotICAgIC8qIHVubGlrZWx5LCBidXQgcG9zc2libGUgKi8KLSAgICBpZiAoIG5ld19zaXplID09IGN1cl9zaXplICkKLSAgICAgIHJldHVybiBibG9jazsKLQotICAgIC8qIHRoZSBmb2xsb3dpbmcgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIEFOU0kgQyAqLwotI2lmIDAKLSAgICBpZiAoICFibG9jayB8fCAhY3VyX3NpemUgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKCAidHJ5aW5nIHRvIHJlYWxsb2NhdGUgTlVMTCBpbiAoJXM6JWxkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZSwgbGluZV9ubyApOwotI2VuZGlmCi0KLSAgICAvKiB3aGlsZSB0aGUgZm9sbG93aW5nIGlzIGFsbG93ZWQgaW4gQU5TSSBDIGFsc28sIHdlIGFib3J0IHNpbmNlICovCi0gICAgLyogc3VjaCBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggbmV3X3NpemUgPD0gMCApCi0gICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICJ0cnlpbmcgdG8gcmVhbGxvY2F0ZSAlcCB0byBzaXplIDAgKGN1cnJlbnQgaXMgJWxkKSBpbiAoJXM6JWxkKSIsCi0gICAgICAgIGJsb2NrLCBjdXJfc2l6ZSwgZmlsZV9uYW1lLCBsaW5lX25vICk7Ci0KLSAgICAvKiBjaGVjayBgY3VyX3NpemUnIHZhbHVlICovCi0gICAgcG5vZGUgPSBmdF9tZW1fdGFibGVfZ2V0X25vZGVwKCB0YWJsZSwgKEZUX0J5dGUqKWJsb2NrICk7Ci0gICAgbm9kZSAgPSAqcG5vZGU7Ci0gICAgaWYgKCAhbm9kZSApCi0gICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICJ0cnlpbmcgdG8gcmVhbGxvY2F0ZSB1bmtub3duIGJsb2NrIGF0ICVwIGluICglczolbGQpIiwKLSAgICAgICAgYmxvY2ssIGZpbGVfbmFtZSwgbGluZV9ubyApOwotCi0gICAgaWYgKCBub2RlLT5zaXplIDw9IDAgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAidHJ5aW5nIHRvIHJlYWxsb2NhdGUgZnJlZWQgYmxvY2sgYXQgJXAgaW4gKCVzOiVsZCkiLAotICAgICAgICBibG9jaywgZmlsZV9uYW1lLCBsaW5lX25vICk7Ci0KLSAgICBpZiAoIG5vZGUtPnNpemUgIT0gY3VyX3NpemUgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKCAiaW52YWxpZCBmdF9yZWFsbG9jIHJlcXVlc3QgZm9yICVwLiBjdXJfc2l6ZSBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIlbGQgaW5zdGVhZCBvZiAlbGQgaW4gKCVzOiVsZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaywgY3VyX3NpemUsIG5vZGUtPnNpemUsIGZpbGVfbmFtZSwgbGluZV9ubyApOwotCi0gICAgLyogcmV0dXJuIE5VTEwgaWYgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG9jYXRpb25zIHdhcyByZWFjaGVkICovCi0gICAgaWYgKCB0YWJsZS0+Ym91bmRfY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdGFibGUtPmFsbG9jX2NvdW50ID49IHRhYmxlLT5hbGxvY19jb3VudF9tYXggKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBkZWx0YSA9IG5ld19zaXplIC0gY3VyX3NpemU7Ci0KLSAgICAvKiByZXR1cm4gTlVMTCBpZiB0aGlzIGFsbG9jYXRpb24gd291bGQgb3ZlcmZsb3cgdGhlIG1heGltdW0gaGVhcCBzaXplICovCi0gICAgaWYgKCBkZWx0YSA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdGFibGUtPmJvdW5kX3RvdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50ICsgZGVsdGEgPiB0YWJsZS0+YWxsb2NfdG90YWxfbWF4ICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgbmV3X2Jsb2NrID0gKEZUX1BvaW50ZXIpZnRfbWVtX3RhYmxlX2FsbG9jKCB0YWJsZSwgbmV3X3NpemUgKTsKLSAgICBpZiAoICFuZXdfYmxvY2sgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmdF9tZW1fdGFibGVfc2V0KCB0YWJsZSwgKEZUX0J5dGUqKW5ld19ibG9jaywgbmV3X3NpemUsIGRlbHRhICk7Ci0KLSAgICBmdF9tZW1jcHkoIG5ld19ibG9jaywgYmxvY2ssIGN1cl9zaXplIDwgbmV3X3NpemUgPyAoc2l6ZV90KWN1cl9zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHNpemVfdCluZXdfc2l6ZSApOwotCi0gICAgZnRfbWVtX3RhYmxlX3JlbW92ZSggdGFibGUsIChGVF9CeXRlKilibG9jaywgZGVsdGEgKTsKLQotICAgIF9mdF9kZWJ1Z19maWxlICAgPSAiPHVua25vd24+IjsKLSAgICBfZnRfZGVidWdfbGluZW5vID0gMDsKLQotICAgIGlmICggIXRhYmxlLT5rZWVwX2FsaXZlICkKLSAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgYmxvY2sgKTsKLQotICAgIHJldHVybiBuZXdfYmxvY2s7Ci0gIH0KLQotCi0gIGV4dGVybiBGVF9JbnQKLSAgZnRfbWVtX2RlYnVnX2luaXQoIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX01lbVRhYmxlICB0YWJsZTsKLSAgICBGVF9JbnQgICAgICAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCBnZXRlbnYoICJGVDJfREVCVUdfTUVNT1JZIiApICkKLSAgICB7Ci0gICAgICB0YWJsZSA9IGZ0X21lbV90YWJsZV9uZXcoIG1lbW9yeSApOwotICAgICAgaWYgKCB0YWJsZSApCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIqICBwOwotCi0KLSAgICAgICAgbWVtb3J5LT51c2VyICAgID0gdGFibGU7Ci0gICAgICAgIG1lbW9yeS0+YWxsb2MgICA9IGZ0X21lbV9kZWJ1Z19hbGxvYzsKLSAgICAgICAgbWVtb3J5LT5yZWFsbG9jID0gZnRfbWVtX2RlYnVnX3JlYWxsb2M7Ci0gICAgICAgIG1lbW9yeS0+ZnJlZSAgICA9IGZ0X21lbV9kZWJ1Z19mcmVlOwotCi0gICAgICAgIHAgPSBnZXRlbnYoICJGVDJfQUxMT0NfVE9UQUxfTUFYIiApOwotICAgICAgICBpZiAoIHAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTG9uZyAgdG90YWxfbWF4ID0gZnRfc3RydG9sKCBwLCBOVUxMLCAxMCApOwotCi0KLSAgICAgICAgICBpZiAoIHRvdGFsX21heCA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhYmxlLT5ib3VuZF90b3RhbCAgICAgPSAxOwotICAgICAgICAgICAgdGFibGUtPmFsbG9jX3RvdGFsX21heCA9IHRvdGFsX21heDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gZ2V0ZW52KCAiRlQyX0FMTE9DX0NPVU5UX01BWCIgKTsKLSAgICAgICAgaWYgKCBwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0xvbmcgIHRvdGFsX2NvdW50ID0gZnRfc3RydG9sKCBwLCBOVUxMLCAxMCApOwotCi0KLSAgICAgICAgICBpZiAoIHRvdGFsX2NvdW50ID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFibGUtPmJvdW5kX2NvdW50ICAgICA9IDE7Ci0gICAgICAgICAgICB0YWJsZS0+YWxsb2NfY291bnRfbWF4ID0gdG90YWxfY291bnQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcCA9IGdldGVudiggIkZUMl9LRUVQX0FMSVZFIiApOwotICAgICAgICBpZiAoIHAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTG9uZyAga2VlcF9hbGl2ZSA9IGZ0X3N0cnRvbCggcCwgTlVMTCwgMTAgKTsKLQotCi0gICAgICAgICAgaWYgKCBrZWVwX2FsaXZlID4gMCApCi0gICAgICAgICAgICB0YWJsZS0+a2VlcF9hbGl2ZSA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSAxOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBleHRlcm4gdm9pZAotICBmdF9tZW1fZGVidWdfZG9uZSggRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+dXNlcjsKLQotCi0gICAgaWYgKCB0YWJsZSApCi0gICAgewotICAgICAgbWVtb3J5LT5mcmVlICAgID0gdGFibGUtPmZyZWU7Ci0gICAgICBtZW1vcnktPnJlYWxsb2MgPSB0YWJsZS0+cmVhbGxvYzsKLSAgICAgIG1lbW9yeS0+YWxsb2MgICA9IHRhYmxlLT5hbGxvYzsKLQotICAgICAgZnRfbWVtX3RhYmxlX2Rlc3Ryb3koIHRhYmxlICk7Ci0gICAgICBtZW1vcnktPnVzZXIgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIGludAotICBmdF9tZW1fc291cmNlX2NvbXBhcmUoIGNvbnN0IHZvaWQqICBwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgcDIgKQotICB7Ci0gICAgRlRfTWVtU291cmNlICBzMSA9ICooRlRfTWVtU291cmNlKilwMTsKLSAgICBGVF9NZW1Tb3VyY2UgIHMyID0gKihGVF9NZW1Tb3VyY2UqKXAyOwotCi0KLSAgICBpZiAoIHMyLT5tYXhfc2l6ZSA+IHMxLT5tYXhfc2l6ZSApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlIGlmICggczItPm1heF9zaXplIDwgczEtPm1heF9zaXplICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgZXh0ZXJuIHZvaWQKLSAgRlRfRHVtcE1lbW9yeSggRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+dXNlcjsKLQotCi0gICAgaWYgKCB0YWJsZSApCi0gICAgewotICAgICAgRlRfTWVtU291cmNlKiAgYnVja2V0ID0gdGFibGUtPnNvdXJjZXM7Ci0gICAgICBGVF9NZW1Tb3VyY2UqICBsaW1pdCAgPSBidWNrZXQgKyBGVF9NRU1fU09VUkNFX0JVQ0tFVFM7Ci0gICAgICBGVF9NZW1Tb3VyY2UqICBzb3VyY2VzOwotICAgICAgRlRfSW50ICAgICAgICAgbm4sIGNvdW50OwotICAgICAgY29uc3QgY2hhciogICAgZm10OwotCi0KLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIGZvciAoIDsgYnVja2V0IDwgbGltaXQ7IGJ1Y2tldCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfTWVtU291cmNlICBzb3VyY2UgPSAqYnVja2V0OwotCi0KLSAgICAgICAgZm9yICggOyBzb3VyY2U7IHNvdXJjZSA9IHNvdXJjZS0+bGluayApCi0gICAgICAgICAgY291bnQrKzsKLSAgICAgIH0KLQotICAgICAgc291cmNlcyA9IChGVF9NZW1Tb3VyY2UqKQotICAgICAgICAgICAgICAgICAgZnRfbWVtX3RhYmxlX2FsbG9jKAotICAgICAgICAgICAgICAgICAgICB0YWJsZSwgY291bnQgKiAoRlRfTG9uZylzaXplb2YgKCAqc291cmNlcyApICk7Ci0KLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIGZvciAoIGJ1Y2tldCA9IHRhYmxlLT5zb3VyY2VzOyBidWNrZXQgPCBsaW1pdDsgYnVja2V0KysgKQotICAgICAgewotICAgICAgICBGVF9NZW1Tb3VyY2UgIHNvdXJjZSA9ICpidWNrZXQ7Ci0KLQotICAgICAgICBmb3IgKCA7IHNvdXJjZTsgc291cmNlID0gc291cmNlLT5saW5rICkKLSAgICAgICAgICBzb3VyY2VzW2NvdW50KytdID0gc291cmNlOwotICAgICAgfQotCi0gICAgICBmdF9xc29ydCggc291cmNlcywKLSAgICAgICAgICAgICAgICAoc2l6ZV90KWNvdW50LAotICAgICAgICAgICAgICAgIHNpemVvZiAoICpzb3VyY2VzICksCi0gICAgICAgICAgICAgICAgZnRfbWVtX3NvdXJjZV9jb21wYXJlICk7Ci0KLSAgICAgIHByaW50ZiggIkZyZWVUeXBlIE1lbW9yeSBEdW1wOiAiCi0gICAgICAgICAgICAgICJjdXJyZW50PSVsZCBtYXg9JWxkIHRvdGFsPSVsZCBjb3VudD0lbGRcbiIsCi0gICAgICAgICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50LCB0YWJsZS0+YWxsb2NfbWF4LAotICAgICAgICAgICAgICB0YWJsZS0+YWxsb2NfdG90YWwsIHRhYmxlLT5hbGxvY19jb3VudCApOwotICAgICAgcHJpbnRmKCAiIGJsb2NrICBibG9jayAgICBzaXplcyAgICBzaXplcyAgICBzaXplcyAgIHNvdXJjZVxuIiApOwotICAgICAgcHJpbnRmKCAiIGNvdW50ICAgaGlnaCAgICAgIHN1bSAgaGlnaHN1bSAgICAgIG1heCAgIGxvY2F0aW9uXG4iICk7Ci0gICAgICBwcmludGYoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7Ci0KLSAgICAgIGZtdCA9ICIlNmxkICU2bGQgJThsZCAlOGxkICU4bGQgJXM6JWRcbiI7Ci0KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX01lbVNvdXJjZSAgc291cmNlID0gc291cmNlc1tubl07Ci0KLQotICAgICAgICBwcmludGYoIGZtdCwKLSAgICAgICAgICAgICAgICBzb3VyY2UtPmN1cl9ibG9ja3MsIHNvdXJjZS0+bWF4X2Jsb2NrcywKLSAgICAgICAgICAgICAgICBzb3VyY2UtPmN1cl9zaXplLCBzb3VyY2UtPm1heF9zaXplLCBzb3VyY2UtPmN1cl9tYXgsCi0gICAgICAgICAgICAgICAgRlRfRklMRU5BTUUoIHNvdXJjZS0+ZmlsZV9uYW1lICksCi0gICAgICAgICAgICAgICAgc291cmNlLT5saW5lX25vICk7Ci0gICAgICB9Ci0gICAgICBwcmludGYoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKLQotICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCBzb3VyY2VzICk7Ci0gICAgfQotICB9Ci0KLSNlbHNlICAvKiAhRlRfREVCVUdfTUVNT1JZICovCi0KLSAgLyogQU5TSSBDIGRvZXNuJ3QgbGlrZSBlbXB0eSBzb3VyY2UgZmlsZXMgKi8KLSAgdHlwZWRlZiBpbnQgIF9kZWJ1Z19tZW1fZHVtbXk7Ci0KLSNlbmRpZiAvKiAhRlRfREVCVUdfTUVNT1JZICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGRlYnVnLmMgYi9zcmMvYmFzZS9mdGRlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzYxNzAuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRkZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZGVidWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBEZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgY29tcG9uZW50IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZSAqLwotICAvKiBkZWJ1Z2dpbmcgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZS4gIEl0cyBtYWluIHB1cnBvc2UgaXMgaW4gYXNzZXJ0aW9uICAgKi8KLSAgLyogY2hlY2tpbmcsIHRyYWNpbmcsIGFuZCBlcnJvciBkZXRlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgbm93IHRocmVlIGRlYnVnZ2luZyBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gdHJhY2UgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFcnJvciBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIGxvZyBmaWxlICh3aGljaCBjYW4gYmUgdGhlICovCi0gIC8qICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBlcnJvciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9ubHkgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gcmVsZWFzZSBtb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBObyBlcnJvciBtZXNzYWdlIGlzIHNlbnQgb3IgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgaXMgZnJlZSBmcm9tIGFueSAgICovCi0gIC8qICAgZGVidWdnaW5nIHBhcnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX01lc3NhZ2UoIGNvbnN0IGNoYXIqICBmbXQsCi0gICAgICAgICAgICAgIC4uLiApCi0gIHsKLSAgICB2YV9saXN0ICBhcDsKLQotCi0gICAgdmFfc3RhcnQoIGFwLCBmbXQgKTsKLSAgICB2ZnByaW50Ziggc3RkZXJyLCBmbXQsIGFwICk7Ci0gICAgdmFfZW5kKCBhcCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUGFuaWMoIGNvbnN0IGNoYXIqICBmbXQsCi0gICAgICAgICAgICAuLi4gKQotICB7Ci0gICAgdmFfbGlzdCAgYXA7Ci0KLQotICAgIHZhX3N0YXJ0KCBhcCwgZm10ICk7Ci0gICAgdmZwcmludGYoIHN0ZGVyciwgZm10LCBhcCApOwotICAgIHZhX2VuZCggYXAgKTsKLQotICAgIGV4aXQoIEVYSVRfRkFJTFVSRSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBpbnQgKQotICBGVF9UaHJvdyggRlRfRXJyb3IgICAgIGVycm9yLAotICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0gICAgRlRfVU5VU0VEKCBsaW5lICk7Ci0gICAgRlRfVU5VU0VEKCBmaWxlICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLQotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gIC8qIGFycmF5IG9mIHRyYWNlIGxldmVscywgaW5pdGlhbGl6ZWQgdG8gMCAqLwotICBpbnQgIGZ0X3RyYWNlX2xldmVsc1t0cmFjZV9jb3VudF07Ci0KLQotICAvKiBkZWZpbmUgYXJyYXkgb2YgdHJhY2UgdG9nZ2xlIG5hbWVzICovCi0jZGVmaW5lIEZUX1RSQUNFX0RFRiggeCApICAjeCAsCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqICBmdF90cmFjZV90b2dnbGVzW3RyYWNlX2NvdW50ICsgMV0gPQotICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICi0gICAgTlVMTAotICB9OwotCi0jdW5kZWYgRlRfVFJBQ0VfREVGCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQgKQotICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuIHRyYWNlX2NvdW50OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyICogKQotICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKQotICB7Ci0gICAgaW50ICBtYXggPSBGVF9UcmFjZV9HZXRfQ291bnQoKTsKLQotCi0gICAgaWYgKCBpZHggPCBtYXggKQotICAgICAgcmV0dXJuIGZ0X3RyYWNlX3RvZ2dsZXNbaWR4XTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbml0aWFsaXplIHRoZSB0cmFjaW5nIHN1Yi1zeXN0ZW0uICBUaGlzIGlzIGRvbmUgYnkgcmV0cmlldmluZyB0aGUgICAgKi8KLSAgLyogdmFsdWUgb2YgdGhlIGBGVDJfREVCVUcnIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSXQgbXVzdCBiZSBhIGxpc3Qgb2YgICovCi0gIC8qIHRvZ2dsZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGA7Jywgb3IgYCwnLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhwb3J0IEZUMl9ERUJVRz0iYW55OjMgbWVtb3J5Ojcgc3RyZWFtOjUiICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIHJlcXVlc3RzIHRoYXQgYWxsIGxldmVscyBiZSBzZXQgdG8gMywgZXhjZXB0IHRoZSB0cmFjZSBsZXZlbCBmb3IgKi8KLSAgLyogdGhlIG1lbW9yeSBhbmQgc3RyZWFtIGNvbXBvbmVudHMgd2hpY2ggYXJlIHNldCB0byA3IGFuZCA1LCAgICAgICAgICAgICovCi0gIC8qIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2VlIHRoZSBmaWxlIGBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCcgZm9yIGRldGFpbHMgb2YgICAgICovCi0gIC8qIHRoZSBhdmFpbGFibGUgdG9nZ2xlIG5hbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGxldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA3OyAwIG1lYW5zIHF1aWV0IChleGNlcHQgZm9yIHNlcmlvdXMgICovCi0gIC8qIHJ1bnRpbWUgZXJyb3JzKSwgYW5kIDcgbWVhbnMgX3ZlcnlfIHZlcmJvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKLSAgewotICAgIGNvbnN0IGNoYXIqICBmdDJfZGVidWcgPSBnZXRlbnYoICJGVDJfREVCVUciICk7Ci0KLQotICAgIGlmICggZnQyX2RlYnVnICkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyKiAgcCA9IGZ0Ml9kZWJ1ZzsKLSAgICAgIGNvbnN0IGNoYXIqICBxOwotCi0KLSAgICAgIGZvciAoIDsgKnA7IHArKyApCi0gICAgICB7Ci0gICAgICAgIC8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBzZXBhcmF0b3JzICovCi0gICAgICAgIGlmICggKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnIHx8ICpwID09ICc7JyB8fCAqcCA9PSAnPScgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIHJlYWQgdG9nZ2xlIG5hbWUsIGZvbGxvd2VkIGJ5ICc6JyAqLwotICAgICAgICBxID0gcDsKLSAgICAgICAgd2hpbGUgKCAqcCAmJiAqcCAhPSAnOicgKQotICAgICAgICAgIHArKzsKLQotICAgICAgICBpZiAoICEqcCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCAqcCA9PSAnOicgJiYgcCA+IHEgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBuLCBpLCBsZW4gPSAoRlRfSW50KSggcCAtIHEgKTsKLSAgICAgICAgICBGVF9JbnQgIGxldmVsID0gLTEsIGZvdW5kID0gLTE7Ci0KLQotICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdHJhY2VfY291bnQ7IG4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgY29uc3QgY2hhciogIHRvZ2dsZSA9IGZ0X3RyYWNlX3RvZ2dsZXNbbl07Ci0KLQotICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggdG9nZ2xlW2ldICE9IHFbaV0gKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGkgPT0gbGVuICYmIHRvZ2dsZVtpXSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm91bmQgPSBuOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiByZWFkIGxldmVsICovCi0gICAgICAgICAgcCsrOwotICAgICAgICAgIGlmICggKnAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxldmVsID0gKnAgLSAnMCc7Ci0gICAgICAgICAgICBpZiAoIGxldmVsIDwgMCB8fCBsZXZlbCA+IDcgKQotICAgICAgICAgICAgICBsZXZlbCA9IC0xOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggZm91bmQgPj0gMCAmJiBsZXZlbCA+PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGZvdW5kID09IHRyYWNlX2FueSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgYGFueScgKi8KLSAgICAgICAgICAgICAgZm9yICggbiA9IDA7IG4gPCB0cmFjZV9jb3VudDsgbisrICkKLSAgICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNbbl0gPSBsZXZlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW2ZvdW5kXSA9IGxldmVsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSNlbHNlICAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfZGVidWdfaW5pdCggdm9pZCApCi0gIHsKLSAgICAvKiBub3RoaW5nICovCi0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQgKQotICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyICogKQotICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKQotICB7Ci0gICAgRlRfVU5VU0VEKCBpZHggKTsKLQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLQotI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRmbnRmbXQuYyBiL3NyYy9iYXNlL2Z0Zm50Zm10LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYmViYTAuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRmbnRmbXQuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Zm50Zm10LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgZm9yIGZvbnQgZm9ybWF0cyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GT05UX0ZPUk1BVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRmbnRmbXQuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIGNvbnN0IGNoYXIqICkKLSAgRlRfR2V0X0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGZhY2UgKQotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHJlc3VsdCwgRk9OVF9GT1JNQVQgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRlcHJlY2F0ZWQgZnVuY3Rpb24gbmFtZTsgcmV0YWluZWQgZm9yIEFCSSBjb21wYXRpYmlsaXR5ICovCi0KLSAgRlRfRVhQT1JUX0RFRiggY29uc3QgY2hhciogKQotICBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGZhY2UgKQotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHJlc3VsdCwgRk9OVF9GT1JNQVQgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0ZnN0eXBlLmMgYi9zcmMvYmFzZS9mdGZzdHlwZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWM0ZmIzLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0ZnN0eXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGZzdHlwZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIHRvIGFjY2VzcyBGU1R5cGUgZGF0YSAoYm9keSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDgtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VU2hvcnQgKQotICBGVF9HZXRfRlNUeXBlX0ZsYWdzKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIFRUX09TMiogIG9zMjsKLQotCi0gICAgLyogZmlyc3QsIHRyeSB0byBnZXQgdGhlIGZzX3R5cGUgZGlyZWN0bHkgZnJvbSB0aGUgZm9udCAqLwotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfU2VydmljZV9Qc0luZm8gIHNlcnZpY2UgPSBOVUxMOwotCi0KLSAgICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBQT1NUU0NSSVBUX0lORk8gKTsKLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPnBzX2dldF9mb250X2V4dHJhICkKLSAgICAgIHsKLSAgICAgICAgUFNfRm9udEV4dHJhUmVjICBleHRyYTsKLQotCi0gICAgICAgIGlmICggIXNlcnZpY2UtPnBzX2dldF9mb250X2V4dHJhKCBmYWNlLCAmZXh0cmEgKSAmJgotICAgICAgICAgICAgIGV4dHJhLmZzX3R5cGUgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgIHJldHVybiBleHRyYS5mc190eXBlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGxvb2sgYXQgRlNUeXBlIGJlZm9yZSBmc1R5cGUgZm9yIFR5cGU0MiAqLwotCi0gICAgaWYgKCAoIG9zMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKCBmYWNlLCBGVF9TRk5UX09TMiApICkgIT0gTlVMTCAmJgotICAgICAgICAgb3MyLT52ZXJzaW9uICE9IDB4RkZGRlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgcmV0dXJuIG9zMi0+ZnNUeXBlOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Z2FzcC5jIGIvc3JjL2Jhc2UvZnRnYXNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3N2I3MjUuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRnYXNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdhc3AuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgYGdhc3AnIHRhYmxlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfR0FTUF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9JbnQgKQotICBGVF9HZXRfR2FzcCggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgIEZUX1VJbnQgIHBwZW0gKQotICB7Ci0gICAgRlRfSW50ICByZXN1bHQgPSBGVF9HQVNQX05PX1RBQkxFOwotCi0KLSAgICBpZiAoIGZhY2UgJiYgRlRfSVNfU0ZOVCggZmFjZSApICkKLSAgICB7Ci0gICAgICBUVF9GYWNlICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOwotCi0KLSAgICAgIGlmICggdHRmYWNlLT5nYXNwLm51bVJhbmdlcyA+IDAgKQotICAgICAgewotICAgICAgICBUVF9HYXNwUmFuZ2UgIHJhbmdlICAgICA9IHR0ZmFjZS0+Z2FzcC5nYXNwUmFuZ2VzOwotICAgICAgICBUVF9HYXNwUmFuZ2UgIHJhbmdlX2VuZCA9IHJhbmdlICsgdHRmYWNlLT5nYXNwLm51bVJhbmdlczsKLQotCi0gICAgICAgIHdoaWxlICggcHBlbSA+IHJhbmdlLT5tYXhQUEVNICkKLSAgICAgICAgewotICAgICAgICAgIHJhbmdlKys7Ci0gICAgICAgICAgaWYgKCByYW5nZSA+PSByYW5nZV9lbmQgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gcmFuZ2UtPmdhc3BGbGFnOwotCi0gICAgICAgIC8qIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgc3B1cmlvdXMgYml0cyAqLwotICAgICAgICBpZiAoIHR0ZmFjZS0+Z2FzcC52ZXJzaW9uID09IDAgKQotICAgICAgICAgIHJlc3VsdCAmPSAzOwotICAgICAgfQotICAgIH0KLSAgRXhpdDoKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGdsb2Fkci5jIGIvc3JjL2Jhc2UvZnRnbG9hZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzNDAwMy4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdGdsb2Fkci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z2xvYWRyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9HTFlQSF9MT0FERVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2dsb2FkZXIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBHIEwgWSBQIEggICBMIE8gQSBEIEUgUiAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBnbHlwaCBsb2FkZXIgaXMgYSBzaW1wbGUgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gbG9hZCBhIHNldCBvZiAgICAqLwotICAvKiBnbHlwaHMgZWFzaWx5LiAgSXQgaXMgY3JpdGljYWwgZm9yIHRoZSBjb3JyZWN0IGxvYWRpbmcgb2YgY29tcG9zaXRlcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElkZWFsbHksIG9uZSBjYW4gc2VlIGl0IGFzIGEgc3RhY2sgb2YgYWJzdHJhY3QgYGdseXBoJyBvYmplY3RzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsb2FkZXIuYmFzZSAgICAgSXMgcmVhbGx5IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLiAgSXQgZGVzY3JpYmVzIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNpbmdsZSBnbHlwaCBpbWFnZSBtYWRlIG9mIHRoZSBqdXh0YXBvc2l0aW9uIG9mICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzZXZlcmFsIGdseXBocyAodGhvc2UgYGluIHRoZSBzdGFjaycpLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbG9hZGVyLmN1cnJlbnQgIERlc2NyaWJlcyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgb24gd2hpY2ggYSBuZXcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBjYW4gYmUgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmV3aW5kICAgICAgICAgIENsZWFycyB0aGUgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFByZXBhcmUgICAgICAgICBTZXQgdXAgYGxvYWRlci5jdXJyZW50JyBmb3IgYWRkaXRpb24gb2YgYSBuZXcgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWRkICAgICAgICAgICAgIEFkZCB0aGUgYGN1cnJlbnQnIGdseXBoIGltYWdlIHRvIHRoZSBgYmFzZScgb25lLCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBhbmQgcHJlcGFyZSBmb3IgYW5vdGhlciBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBnbHlwaCBsb2FkZXIgaXMgbm93IGEgYmFzZSBvYmplY3QuICBFYWNoIGRyaXZlciB1c2VkIHRvICAgICAgICAgICAqLwotICAvKiByZS1pbXBsZW1lbnQgaXQgaW4gb25lIHdheSBvciB0aGUgb3RoZXIsIHdoaWNoIHdhc3RlZCBjb2RlIGFuZCAgICAgICAgKi8KLSAgLyogZW5lcmd5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyBnbHlwaCBsb2FkZXIgKi8KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfTmV3KCBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgKmFsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlciA9IE5VTEw7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFGVF9ORVcoIGxvYWRlciApICkKLSAgICB7Ci0gICAgICBsb2FkZXItPm1lbW9yeSA9IG1lbW9yeTsKLSAgICAgICphbG9hZGVyICAgICAgID0gbG9hZGVyOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHJld2luZCB0aGUgZ2x5cGggbG9hZGVyIC0gcmVzZXQgY291bnRlcnMgdG8gMCAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1Jld2luZCggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9HbHlwaExvYWQgIGJhc2UgICAgPSAmbG9hZGVyLT5iYXNlOwotICAgIEZUX0dseXBoTG9hZCAgY3VycmVudCA9ICZsb2FkZXItPmN1cnJlbnQ7Ci0KLQotICAgIGJhc2UtPm91dGxpbmUubl9wb2ludHMgICA9IDA7Ci0gICAgYmFzZS0+b3V0bGluZS5uX2NvbnRvdXJzID0gMDsKLSAgICBiYXNlLT5udW1fc3ViZ2x5cGhzICAgICAgPSAwOwotCi0gICAgKmN1cnJlbnQgPSAqYmFzZTsKLSAgfQotCi0KLSAgLyogcmVzZXQgdGhlIGdseXBoIGxvYWRlciwgZnJlZXMgYWxsIGFsbG9jYXRlZCB0YWJsZXMgKi8KLSAgLyogYW5kIHN0YXJ0cyBmcm9tIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9SZXNldCggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgbWVtb3J5ID0gbG9hZGVyLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIGxvYWRlci0+YmFzZS5vdXRsaW5lLnBvaW50cyApOwotICAgIEZUX0ZSRUUoIGxvYWRlci0+YmFzZS5vdXRsaW5lLnRhZ3MgKTsKLSAgICBGVF9GUkVFKCBsb2FkZXItPmJhc2Uub3V0bGluZS5jb250b3VycyApOwotICAgIEZUX0ZSRUUoIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMgKTsKLSAgICBGVF9GUkVFKCBsb2FkZXItPmJhc2Uuc3ViZ2x5cGhzICk7Ci0KLSAgICBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzMiA9IE5VTEw7Ci0KLSAgICBsb2FkZXItPm1heF9wb2ludHMgICAgPSAwOwotICAgIGxvYWRlci0+bWF4X2NvbnRvdXJzICA9IDA7Ci0gICAgbG9hZGVyLT5tYXhfc3ViZ2x5cGhzID0gMDsKLQotICAgIEZUX0dseXBoTG9hZGVyX1Jld2luZCggbG9hZGVyICk7Ci0gIH0KLQotCi0gIC8qIGRlbGV0ZSBhIGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX0RvbmUoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgaWYgKCBsb2FkZXIgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSBtZW1vcnkgPSBsb2FkZXItPm1lbW9yeTsKLQotCi0gICAgICBGVF9HbHlwaExvYWRlcl9SZXNldCggbG9hZGVyICk7Ci0gICAgICBGVF9GUkVFKCBsb2FkZXIgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIHJlLWFkanVzdCB0aGUgYGN1cnJlbnQnIG91dGxpbmUgZmllbGRzICovCi0gIHN0YXRpYyB2b2lkCi0gIEZUX0dseXBoTG9hZGVyX0FkanVzdF9Qb2ludHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIGJhc2UgICAgPSAmbG9hZGVyLT5iYXNlLm91dGxpbmU7Ci0gICAgRlRfT3V0bGluZSogIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0KLQotICAgIGN1cnJlbnQtPnBvaW50cyAgID0gYmFzZS0+cG9pbnRzICAgKyBiYXNlLT5uX3BvaW50czsKLSAgICBjdXJyZW50LT50YWdzICAgICA9IGJhc2UtPnRhZ3MgICAgICsgYmFzZS0+bl9wb2ludHM7Ci0gICAgY3VycmVudC0+Y29udG91cnMgPSBiYXNlLT5jb250b3VycyArIGJhc2UtPm5fY29udG91cnM7Ci0KLSAgICAvKiBoYW5kbGUgZXh0cmEgcG9pbnRzIHRhYmxlIC0gaWYgYW55ICovCi0gICAgaWYgKCBsb2FkZXItPnVzZV9leHRyYSApCi0gICAgewotICAgICAgbG9hZGVyLT5jdXJyZW50LmV4dHJhX3BvaW50cyAgPSBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+bl9wb2ludHM7Ci0KLSAgICAgIGxvYWRlci0+Y3VycmVudC5leHRyYV9wb2ludHMyID0gbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50czIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5uX3BvaW50czsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsb2FkZXItPm1lbW9yeTsKLQotCi0gICAgaWYgKCAhRlRfTkVXX0FSUkFZKCBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzLCAyICogbG9hZGVyLT5tYXhfcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGxvYWRlci0+dXNlX2V4dHJhICAgICAgICAgID0gMTsKLSAgICAgIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMyID0gbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+bWF4X3BvaW50czsKLQotICAgICAgRlRfR2x5cGhMb2FkZXJfQWRqdXN0X1BvaW50cyggbG9hZGVyICk7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcmUtYWRqdXN0IHRoZSBgY3VycmVudCcgc3ViZ2x5cGhzIGZpZWxkICovCi0gIHN0YXRpYyB2b2lkCi0gIEZUX0dseXBoTG9hZGVyX0FkanVzdF9TdWJnbHlwaHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkICBiYXNlICAgID0gJmxvYWRlci0+YmFzZTsKLSAgICBGVF9HbHlwaExvYWQgIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50OwotCi0KLSAgICBjdXJyZW50LT5zdWJnbHlwaHMgPSBiYXNlLT5zdWJnbHlwaHMgKyBiYXNlLT5udW1fc3ViZ2x5cGhzOwotICB9Ci0KLQotICAvKiBFbnN1cmUgdGhhdCB3ZSBjYW4gYWRkIGBuX3BvaW50cycgYW5kIGBuX2NvbnRvdXJzJyB0byBvdXIgZ2x5cGguICAgICAgKi8KLSAgLyogVGhpcyBmdW5jdGlvbiByZWFsbG9jYXRlcyBpdHMgb3V0bGluZSB0YWJsZXMgaWYgbmVjZXNzYXJ5LiAgTm90ZSB0aGF0ICovCi0gIC8qIGl0IERPRVNOJ1QgY2hhbmdlIHRoZSBudW1iZXIgb2YgcG9pbnRzIHdpdGhpbiB0aGUgbG9hZGVyISAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9jb250b3VycyApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICA9IGxvYWRlci0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEZUX091dGxpbmUqICBiYXNlICAgID0gJmxvYWRlci0+YmFzZS5vdXRsaW5lOwotICAgIEZUX091dGxpbmUqICBjdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudC5vdXRsaW5lOwotICAgIEZUX0Jvb2wgICAgICBhZGp1c3QgID0gMDsKLQotICAgIEZUX1VJbnQgICAgICBuZXdfbWF4LCBvbGRfbWF4OwotCi0KLSAgICAvKiBjaGVjayBwb2ludHMgJiB0YWdzICovCi0gICAgbmV3X21heCA9IChGVF9VSW50KWJhc2UtPm5fcG9pbnRzICsgKEZUX1VJbnQpY3VycmVudC0+bl9wb2ludHMgKwotICAgICAgICAgICAgICBuX3BvaW50czsKLSAgICBvbGRfbWF4ID0gbG9hZGVyLT5tYXhfcG9pbnRzOwotCi0gICAgaWYgKCBuZXdfbWF4ID4gb2xkX21heCApCi0gICAgewotICAgICAgbmV3X21heCA9IEZUX1BBRF9DRUlMKCBuZXdfbWF4LCA4ICk7Ci0KLSAgICAgIGlmICggbmV3X21heCA+IEZUX09VVExJTkVfUE9JTlRTX01BWCApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7Ci0KLSAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGJhc2UtPnBvaW50cywgb2xkX21heCwgbmV3X21heCApIHx8Ci0gICAgICAgICAgIEZUX1JFTkVXX0FSUkFZKCBiYXNlLT50YWdzLCAgIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCBsb2FkZXItPnVzZV9leHRyYSApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9tYXggKiAyLCBuZXdfbWF4ICogMiApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgRlRfQVJSQVlfTU9WRSggbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50cyArIG5ld19tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMgKyBvbGRfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICBvbGRfbWF4ICk7Ci0KLSAgICAgICAgbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50czIgPSBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzICsgbmV3X21heDsKLSAgICAgIH0KLQotICAgICAgYWRqdXN0ID0gMTsKLSAgICAgIGxvYWRlci0+bWF4X3BvaW50cyA9IG5ld19tYXg7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgY29udG91cnMgKi8KLSAgICBvbGRfbWF4ID0gbG9hZGVyLT5tYXhfY29udG91cnM7Ci0gICAgbmV3X21heCA9IChGVF9VSW50KWJhc2UtPm5fY29udG91cnMgKyAoRlRfVUludCljdXJyZW50LT5uX2NvbnRvdXJzICsKLSAgICAgICAgICAgICAgbl9jb250b3VyczsKLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDQgKTsKLQotICAgICAgaWYgKCBuZXdfbWF4ID4gRlRfT1VUTElORV9DT05UT1VSU19NQVggKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBiYXNlLT5jb250b3Vycywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBhZGp1c3QgPSAxOwotICAgICAgbG9hZGVyLT5tYXhfY29udG91cnMgPSBuZXdfbWF4OwotICAgIH0KLQotICAgIGlmICggYWRqdXN0ICkKLSAgICAgIEZUX0dseXBoTG9hZGVyX0FkanVzdF9Qb2ludHMoIGxvYWRlciApOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9HbHlwaExvYWRlcl9SZXNldCggbG9hZGVyICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIEVuc3VyZSB0aGF0IHdlIGNhbiBhZGQgYG5fc3ViZ2x5cGhzJyB0byBvdXIgZ2x5cGguIHRoaXMgZnVuY3Rpb24gKi8KLSAgLyogcmVhbGxvY2F0ZXMgaXRzIHN1YmdseXBocyB0YWJsZSBpZiBuZWNlc3NhcnkuICBOb3RlIHRoYXQgaXQgRE9FUyAqLwotICAvKiBOT1QgY2hhbmdlIHRoZSBudW1iZXIgb2Ygc3ViZ2x5cGhzIHdpdGhpbiB0aGUgbG9hZGVyISAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ2hlY2tTdWJHbHlwaHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9zdWJzICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gbG9hZGVyLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgICAgICBuZXdfbWF4LCBvbGRfbWF4OwotCi0gICAgRlRfR2x5cGhMb2FkICBiYXNlICAgID0gJmxvYWRlci0+YmFzZTsKLSAgICBGVF9HbHlwaExvYWQgIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50OwotCi0KLSAgICBuZXdfbWF4ID0gYmFzZS0+bnVtX3N1YmdseXBocyArIGN1cnJlbnQtPm51bV9zdWJnbHlwaHMgKyBuX3N1YnM7Ci0gICAgb2xkX21heCA9IGxvYWRlci0+bWF4X3N1YmdseXBoczsKLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDIgKTsKLSAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGJhc2UtPnN1YmdseXBocywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBsb2FkZXItPm1heF9zdWJnbHlwaHMgPSBuZXdfbWF4OwotCi0gICAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfU3ViZ2x5cGhzKCBsb2FkZXIgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHByZXBhcmUgbG9hZGVyIGZvciB0aGUgYWRkaXRpb24gb2YgYSBuZXcgZ2x5cGggb24gdG9wIG9mIHRoZSBiYXNlIG9uZSAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1ByZXBhcmUoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkICBjdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudDsKLQotCi0gICAgY3VycmVudC0+b3V0bGluZS5uX3BvaW50cyAgID0gMDsKLSAgICBjdXJyZW50LT5vdXRsaW5lLm5fY29udG91cnMgPSAwOwotICAgIGN1cnJlbnQtPm51bV9zdWJnbHlwaHMgICAgICA9IDA7Ci0KLSAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfUG9pbnRzICAgKCBsb2FkZXIgKTsKLSAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfU3ViZ2x5cGhzKCBsb2FkZXIgKTsKLSAgfQotCi0KLSAgLyogYWRkIGN1cnJlbnQgZ2x5cGggdG8gdGhlIGJhc2UgaW1hZ2UgLS0gYW5kIHByZXBhcmUgZm9yIGFub3RoZXIgKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9BZGQoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkICBiYXNlOwotICAgIEZUX0dseXBoTG9hZCAgY3VycmVudDsKLQotICAgIEZUX0ludCAgICAgICAgbl9jdXJyX2NvbnRvdXJzOwotICAgIEZUX0ludCAgICAgICAgbl9iYXNlX3BvaW50czsKLSAgICBGVF9JbnQgICAgICAgIG47Ci0KLQotICAgIGlmICggIWxvYWRlciApCi0gICAgICByZXR1cm47Ci0KLSAgICBiYXNlICAgID0gJmxvYWRlci0+YmFzZTsKLSAgICBjdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudDsKLQotICAgIG5fY3Vycl9jb250b3VycyA9IGN1cnJlbnQtPm91dGxpbmUubl9jb250b3VyczsKLSAgICBuX2Jhc2VfcG9pbnRzICAgPSBiYXNlLT5vdXRsaW5lLm5fcG9pbnRzOwotCi0gICAgYmFzZS0+b3V0bGluZS5uX3BvaW50cyA9Ci0gICAgICAoc2hvcnQpKCBiYXNlLT5vdXRsaW5lLm5fcG9pbnRzICsgY3VycmVudC0+b3V0bGluZS5uX3BvaW50cyApOwotICAgIGJhc2UtPm91dGxpbmUubl9jb250b3VycyA9Ci0gICAgICAoc2hvcnQpKCBiYXNlLT5vdXRsaW5lLm5fY29udG91cnMgKyBjdXJyZW50LT5vdXRsaW5lLm5fY29udG91cnMgKTsKLQotICAgIGJhc2UtPm51bV9zdWJnbHlwaHMgKz0gY3VycmVudC0+bnVtX3N1YmdseXBoczsKLQotICAgIC8qIGFkanVzdCBjb250b3VycyBjb3VudCBpbiBuZXdlc3Qgb3V0bGluZSAqLwotICAgIGZvciAoIG4gPSAwOyBuIDwgbl9jdXJyX2NvbnRvdXJzOyBuKysgKQotICAgICAgY3VycmVudC0+b3V0bGluZS5jb250b3Vyc1tuXSA9Ci0gICAgICAgIChzaG9ydCkoIGN1cnJlbnQtPm91dGxpbmUuY29udG91cnNbbl0gKyBuX2Jhc2VfcG9pbnRzICk7Ci0KLSAgICAvKiBwcmVwYXJlIGZvciBhbm90aGVyIG5ldyBnbHlwaCBpbWFnZSAqLwotICAgIEZUX0dseXBoTG9hZGVyX1ByZXBhcmUoIGxvYWRlciApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9Db3B5UG9pbnRzKCBGVF9HbHlwaExvYWRlciAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgc291cmNlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VSW50ICAgbnVtX3BvaW50cyAgID0gKEZUX1VJbnQpc291cmNlLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0gICAgRlRfVUludCAgIG51bV9jb250b3VycyA9IChGVF9VSW50KXNvdXJjZS0+YmFzZS5vdXRsaW5lLm5fY29udG91cnM7Ci0KLQotICAgIGVycm9yID0gRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMoIHRhcmdldCwgbnVtX3BvaW50cywgbnVtX2NvbnRvdXJzICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX091dGxpbmUqICBvdXQgPSAmdGFyZ2V0LT5iYXNlLm91dGxpbmU7Ci0gICAgICBGVF9PdXRsaW5lKiAgaW4gID0gJnNvdXJjZS0+YmFzZS5vdXRsaW5lOwotCi0KLSAgICAgIEZUX0FSUkFZX0NPUFkoIG91dC0+cG9pbnRzLCBpbi0+cG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cyApOwotICAgICAgRlRfQVJSQVlfQ09QWSggb3V0LT50YWdzLCBpbi0+dGFncywKLSAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMgKTsKLSAgICAgIEZUX0FSUkFZX0NPUFkoIG91dC0+Y29udG91cnMsIGluLT5jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgIG51bV9jb250b3VycyApOwotCi0gICAgICAvKiBkbyB3ZSBuZWVkIHRvIGNvcHkgdGhlIGV4dHJhIHBvaW50cz8gKi8KLSAgICAgIGlmICggdGFyZ2V0LT51c2VfZXh0cmEgJiYgc291cmNlLT51c2VfZXh0cmEgKQotICAgICAgewotICAgICAgICBGVF9BUlJBWV9DT1BZKCB0YXJnZXQtPmJhc2UuZXh0cmFfcG9pbnRzLCBzb3VyY2UtPmJhc2UuZXh0cmFfcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBudW1fcG9pbnRzICk7Ci0gICAgICAgIEZUX0FSUkFZX0NPUFkoIHRhcmdldC0+YmFzZS5leHRyYV9wb2ludHMyLCBzb3VyY2UtPmJhc2UuZXh0cmFfcG9pbnRzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cyApOwotICAgICAgfQotCi0gICAgICBvdXQtPm5fcG9pbnRzICAgPSAoc2hvcnQpbnVtX3BvaW50czsKLSAgICAgIG91dC0+bl9jb250b3VycyA9IChzaG9ydCludW1fY29udG91cnM7Ci0KLSAgICAgIEZUX0dseXBoTG9hZGVyX0FkanVzdF9Qb2ludHMoIHRhcmdldCApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRnbHlwaC5jIGIvc3JjL2Jhc2UvZnRnbHlwaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQ5NGNiLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0Z2x5cGguYworKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdseXBoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGhhbmRsZSBnbHlwaHMgKGJvZHkpLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBzZXZlcmFsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyAgICovCi0gIC8qICB0aGF0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gZWFzaWx5IHJldHJpZXZlIGdseXBoICAgICAqLwotICAvKiAgYml0bWFwcyBhbmQgb3V0bGluZXMgZnJvbSBhIGdpdmVuIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIG9wdGlvbmFsIGlmIHlvdSBhcmUgd3JpdGluZyBhIGZvbnQgc2VydmVyICAqLwotICAvKiAgb3IgdGV4dCBsYXlvdXQgZW5naW5lIG9uIHRvcCBvZiBGcmVlVHlwZS4gIEhvd2V2ZXIsIHRoZXkgYXJlIHByZXR0eSAgKi8KLSAgLyogIGhhbmR5IGZvciBtYW55IG90aGVyIHNpbXBsZSB1c2VzIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgRlRfR0xZUEhfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLSNpbmNsdWRlICJiYXNlcGljLmgiCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ2x5cGgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgRlRfQml0bWFwR2x5cGggc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdF9iaXRtYXBfZ2x5cGhfaW5pdCggRlRfR2x5cGggICAgICBiaXRtYXBfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfQml0bWFwR2x5cGggIGdseXBoICAgPSAoRlRfQml0bWFwR2x5cGgpYml0bWFwX2dseXBoOwotICAgIEZUX0Vycm9yICAgICAgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5ID0gRlRfR0xZUEgoIGdseXBoICktPmxpYnJhcnk7Ci0KLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZ2x5cGgtPmxlZnQgPSBzbG90LT5iaXRtYXBfbGVmdDsKLSAgICBnbHlwaC0+dG9wICA9IHNsb3QtPmJpdG1hcF90b3A7Ci0KLSAgICAvKiBkbyBsYXp5IGNvcHlpbmcgd2hlbmV2ZXIgcG9zc2libGUgKi8KLSAgICBpZiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKQotICAgIHsKLSAgICAgIGdseXBoLT5iaXRtYXAgPSBzbG90LT5iaXRtYXA7Ci0gICAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJj0gfkZUX0dMWVBIX09XTl9CSVRNQVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9CaXRtYXBfSW5pdCggJmdseXBoLT5iaXRtYXAgKTsKLSAgICAgIGVycm9yID0gRlRfQml0bWFwX0NvcHkoIGxpYnJhcnksICZzbG90LT5iaXRtYXAsICZnbHlwaC0+Yml0bWFwICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgZnRfYml0bWFwX2dseXBoX2NvcHkoIEZUX0dseXBoICBiaXRtYXBfc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggIGJpdG1hcF90YXJnZXQgKQotICB7Ci0gICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgPSBiaXRtYXBfc291cmNlLT5saWJyYXJ5OwotICAgIEZUX0JpdG1hcEdseXBoICBzb3VyY2UgID0gKEZUX0JpdG1hcEdseXBoKWJpdG1hcF9zb3VyY2U7Ci0gICAgRlRfQml0bWFwR2x5cGggIHRhcmdldCAgPSAoRlRfQml0bWFwR2x5cGgpYml0bWFwX3RhcmdldDsKLQotCi0gICAgdGFyZ2V0LT5sZWZ0ID0gc291cmNlLT5sZWZ0OwotICAgIHRhcmdldC0+dG9wICA9IHNvdXJjZS0+dG9wOwotCi0gICAgcmV0dXJuIEZUX0JpdG1hcF9Db3B5KCBsaWJyYXJ5LCAmc291cmNlLT5iaXRtYXAsICZ0YXJnZXQtPmJpdG1hcCApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9iaXRtYXBfZ2x5cGhfZG9uZSggRlRfR2x5cGggIGJpdG1hcF9nbHlwaCApCi0gIHsKLSAgICBGVF9CaXRtYXBHbHlwaCAgZ2x5cGggICA9IChGVF9CaXRtYXBHbHlwaCliaXRtYXBfZ2x5cGg7Ci0gICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgPSBGVF9HTFlQSCggZ2x5cGggKS0+bGlicmFyeTsKLQotCi0gICAgRlRfQml0bWFwX0RvbmUoIGxpYnJhcnksICZnbHlwaC0+Yml0bWFwICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X2JpdG1hcF9nbHlwaF9iYm94KCBGVF9HbHlwaCAgYml0bWFwX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogIGNib3ggKQotICB7Ci0gICAgRlRfQml0bWFwR2x5cGggIGdseXBoID0gKEZUX0JpdG1hcEdseXBoKWJpdG1hcF9nbHlwaDsKLQotCi0gICAgY2JveC0+eE1pbiA9IGdseXBoLT5sZWZ0ICogNjQ7Ci0gICAgY2JveC0+eE1heCA9IGNib3gtPnhNaW4gKyAoRlRfUG9zKSggZ2x5cGgtPmJpdG1hcC53aWR0aCAqIDY0ICk7Ci0gICAgY2JveC0+eU1heCA9IGdseXBoLT50b3AgKiA2NDsKLSAgICBjYm94LT55TWluID0gY2JveC0+eU1heCAtIChGVF9Qb3MpKCBnbHlwaC0+Yml0bWFwLnJvd3MgKiA2NCApOwotICB9Ci0KLQotICBGVF9ERUZJTkVfR0xZUEgoCi0gICAgZnRfYml0bWFwX2dseXBoX2NsYXNzLAotCi0gICAgc2l6ZW9mICggRlRfQml0bWFwR2x5cGhSZWMgKSwKLSAgICBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLAotCi0gICAgZnRfYml0bWFwX2dseXBoX2luaXQsICAgIC8qIEZUX0dseXBoX0luaXRGdW5jICAgICAgIGdseXBoX2luaXQgICAgICAqLwotICAgIGZ0X2JpdG1hcF9nbHlwaF9kb25lLCAgICAvKiBGVF9HbHlwaF9Eb25lRnVuYyAgICAgICBnbHlwaF9kb25lICAgICAgKi8KLSAgICBmdF9iaXRtYXBfZ2x5cGhfY29weSwgICAgLyogRlRfR2x5cGhfQ29weUZ1bmMgICAgICAgZ2x5cGhfY29weSAgICAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgIC8qIEZUX0dseXBoX1RyYW5zZm9ybUZ1bmMgIGdseXBoX3RyYW5zZm9ybSAqLwotICAgIGZ0X2JpdG1hcF9nbHlwaF9iYm94LCAgICAvKiBGVF9HbHlwaF9HZXRCQm94RnVuYyAgICBnbHlwaF9iYm94ICAgICAgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgLyogRlRfR2x5cGhfUHJlcGFyZUZ1bmMgICAgZ2x5cGhfcHJlcGFyZSAgICovCi0gICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgRlRfT3V0bGluZUdseXBoIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGZ0X291dGxpbmVfZ2x5cGhfaW5pdCggRlRfR2x5cGggICAgICBvdXRsaW5lX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBGVF9PdXRsaW5lR2x5cGggIGdseXBoICAgPSAoRlRfT3V0bGluZUdseXBoKW91dGxpbmVfZ2x5cGg7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSA9IEZUX0dMWVBIKCBnbHlwaCApLT5saWJyYXJ5OwotICAgIEZUX091dGxpbmUqICAgICAgc291cmNlICA9ICZzbG90LT5vdXRsaW5lOwotICAgIEZUX091dGxpbmUqICAgICAgdGFyZ2V0ICA9ICZnbHlwaC0+b3V0bGluZTsKLQotCi0gICAgLyogY2hlY2sgZm9ybWF0IGluIGdseXBoIHNsb3QgKi8KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBuZXcgb3V0bGluZSAqLwotICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpc291cmNlLT5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPm5fY29udG91cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoLT5vdXRsaW5lICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9PdXRsaW5lX0NvcHkoIHNvdXJjZSwgdGFyZ2V0ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X291dGxpbmVfZ2x5cGhfZG9uZSggRlRfR2x5cGggIG91dGxpbmVfZ2x5cGggKQotICB7Ci0gICAgRlRfT3V0bGluZUdseXBoICBnbHlwaCA9IChGVF9PdXRsaW5lR2x5cGgpb3V0bGluZV9nbHlwaDsKLQotCi0gICAgRlRfT3V0bGluZV9Eb25lKCBGVF9HTFlQSCggZ2x5cGggKS0+bGlicmFyeSwgJmdseXBoLT5vdXRsaW5lICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdF9vdXRsaW5lX2dseXBoX2NvcHkoIEZUX0dseXBoICBvdXRsaW5lX3NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgb3V0bGluZV90YXJnZXQgKQotICB7Ci0gICAgRlRfT3V0bGluZUdseXBoICBzb3VyY2UgID0gKEZUX091dGxpbmVHbHlwaClvdXRsaW5lX3NvdXJjZTsKLSAgICBGVF9PdXRsaW5lR2x5cGggIHRhcmdldCAgPSAoRlRfT3V0bGluZUdseXBoKW91dGxpbmVfdGFyZ2V0OwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5ID0gRlRfR0xZUEgoIHNvdXJjZSApLT5saWJyYXJ5OwotCi0KLSAgICBlcnJvciA9IEZUX091dGxpbmVfTmV3KCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KXNvdXJjZS0+b3V0bGluZS5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPm91dGxpbmUubl9jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LT5vdXRsaW5lICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgRlRfT3V0bGluZV9Db3B5KCAmc291cmNlLT5vdXRsaW5lLCAmdGFyZ2V0LT5vdXRsaW5lICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X291dGxpbmVfZ2x5cGhfdHJhbnNmb3JtKCBGVF9HbHlwaCAgICAgICAgICBvdXRsaW5lX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgZGVsdGEgKQotICB7Ci0gICAgRlRfT3V0bGluZUdseXBoICBnbHlwaCA9IChGVF9PdXRsaW5lR2x5cGgpb3V0bGluZV9nbHlwaDsKLQotCi0gICAgaWYgKCBtYXRyaXggKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oICZnbHlwaC0+b3V0bGluZSwgbWF0cml4ICk7Ci0KLSAgICBpZiAoIGRlbHRhICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmZ2x5cGgtPm91dGxpbmUsIGRlbHRhLT54LCBkZWx0YS0+eSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9vdXRsaW5lX2dseXBoX2Jib3goIEZUX0dseXBoICBvdXRsaW5lX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3gqICBiYm94ICkKLSAgewotICAgIEZUX091dGxpbmVHbHlwaCAgZ2x5cGggPSAoRlRfT3V0bGluZUdseXBoKW91dGxpbmVfZ2x5cGg7Ci0KLQotICAgIEZUX091dGxpbmVfR2V0X0NCb3goICZnbHlwaC0+b3V0bGluZSwgYmJveCApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgZnRfb3V0bGluZV9nbHlwaF9wcmVwYXJlKCBGVF9HbHlwaCAgICAgIG91dGxpbmVfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIEZUX091dGxpbmVHbHlwaCAgZ2x5cGggPSAoRlRfT3V0bGluZUdseXBoKW91dGxpbmVfZ2x5cGg7Ci0KLQotICAgIHNsb3QtPmZvcm1hdCAgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX09VVExJTkU7Ci0gICAgc2xvdC0+b3V0bGluZSAgICAgICAgPSBnbHlwaC0+b3V0bGluZTsKLSAgICBzbG90LT5vdXRsaW5lLmZsYWdzICY9IH5GVF9PVVRMSU5FX09XTkVSOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfREVGSU5FX0dMWVBIKAotICAgIGZ0X291dGxpbmVfZ2x5cGhfY2xhc3MsCi0KLSAgICBzaXplb2YgKCBGVF9PdXRsaW5lR2x5cGhSZWMgKSwKLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIGZ0X291dGxpbmVfZ2x5cGhfaW5pdCwgICAgICAvKiBGVF9HbHlwaF9Jbml0RnVuYyAgICAgICBnbHlwaF9pbml0ICAgICAgKi8KLSAgICBmdF9vdXRsaW5lX2dseXBoX2RvbmUsICAgICAgLyogRlRfR2x5cGhfRG9uZUZ1bmMgICAgICAgZ2x5cGhfZG9uZSAgICAgICovCi0gICAgZnRfb3V0bGluZV9nbHlwaF9jb3B5LCAgICAgIC8qIEZUX0dseXBoX0NvcHlGdW5jICAgICAgIGdseXBoX2NvcHkgICAgICAqLwotICAgIGZ0X291dGxpbmVfZ2x5cGhfdHJhbnNmb3JtLCAvKiBGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jICBnbHlwaF90cmFuc2Zvcm0gKi8KLSAgICBmdF9vdXRsaW5lX2dseXBoX2Jib3gsICAgICAgLyogRlRfR2x5cGhfR2V0QkJveEZ1bmMgICAgZ2x5cGhfYmJveCAgICAgICovCi0gICAgZnRfb3V0bGluZV9nbHlwaF9wcmVwYXJlICAgIC8qIEZUX0dseXBoX1ByZXBhcmVGdW5jICAgIGdseXBoX3ByZXBhcmUgICAqLwotICApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgIEZUX0dseXBoIGNsYXNzIGFuZCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgc3RhdGljIEZUX0Vycm9yCi0gICBmdF9uZXdfZ2x5cGgoIEZUX0xpYnJhcnkgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6eiwKLSAgICAgICAgICAgICAgICAgRlRfR2x5cGgqICAgICAgICAgICAgICBhZ2x5cGggKQotICAgewotICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICAgRlRfR2x5cGggICBnbHlwaCAgPSBOVUxMOwotCi0KLSAgICAgKmFnbHlwaCA9IE5VTEw7Ci0KLSAgICAgaWYgKCAhRlRfQUxMT0MoIGdseXBoLCBjbGF6ei0+Z2x5cGhfc2l6ZSApICkKLSAgICAgewotICAgICAgIGdseXBoLT5saWJyYXJ5ID0gbGlicmFyeTsKLSAgICAgICBnbHlwaC0+Y2xhenogICA9IGNsYXp6OwotICAgICAgIGdseXBoLT5mb3JtYXQgID0gY2xhenotPmdseXBoX2Zvcm1hdDsKLQotICAgICAgICphZ2x5cGggPSBnbHlwaDsKLSAgICAgfQotCi0gICAgIHJldHVybiBlcnJvcjsKLSAgIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9Db3B5KCBGVF9HbHlwaCAgIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgRlRfR2x5cGggICp0YXJnZXQgKQotICB7Ci0gICAgRlRfR2x5cGggICAgICAgICAgICAgICBjb3B5OwotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6ejsKLQotCi0gICAgLyogY2hlY2sgYXJndW1lbnRzICovCi0gICAgaWYgKCAhdGFyZ2V0IHx8ICFzb3VyY2UgfHwgIXNvdXJjZS0+Y2xhenogKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAqdGFyZ2V0ID0gTlVMTDsKLQotICAgIGlmICggIXNvdXJjZSB8fCAhc291cmNlLT5jbGF6eiApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGNsYXp6ID0gc291cmNlLT5jbGF6ejsKLSAgICBlcnJvciA9IGZ0X25ld19nbHlwaCggc291cmNlLT5saWJyYXJ5LCBjbGF6eiwgJmNvcHkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGNvcHktPmFkdmFuY2UgPSBzb3VyY2UtPmFkdmFuY2U7Ci0gICAgY29weS0+Zm9ybWF0ICA9IHNvdXJjZS0+Zm9ybWF0OwotCi0gICAgaWYgKCBjbGF6ei0+Z2x5cGhfY29weSApCi0gICAgICBlcnJvciA9IGNsYXp6LT5nbHlwaF9jb3B5KCBzb3VyY2UsIGNvcHkgKTsKLQotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfRG9uZV9HbHlwaCggY29weSApOwotICAgIGVsc2UKLSAgICAgICp0YXJnZXQgPSBjb3B5OwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z2x5cGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0dseXBoKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICphZ2x5cGggKQotICB7Ci0gICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9HbHlwaCAgICBnbHlwaDsKLQotICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgY2xhenogPSBOVUxMOwotCi0KLSAgICBpZiAoICFzbG90ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TbG90X0hhbmRsZSApOwotCi0gICAgbGlicmFyeSA9IHNsb3QtPmxpYnJhcnk7Ci0KLSAgICBpZiAoICFhZ2x5cGggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBpZiBpdCBpcyBhIGJpdG1hcCwgdGhhdCdzIGVhc3kgOi0pICovCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCApCi0gICAgICBjbGF6eiA9IEZUX0JJVE1BUF9HTFlQSF9DTEFTU19HRVQ7Ci0KLSAgICAvKiBpZiBpdCBpcyBhbiBvdXRsaW5lICovCi0gICAgZWxzZSBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICBjbGF6eiA9IEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUOwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHRyeSB0byBmaW5kIGEgcmVuZGVyZXIgdGhhdCBzdXBwb3J0cyB0aGUgZ2x5cGggaW1hZ2UgZm9ybWF0ICovCi0gICAgICBGVF9SZW5kZXJlciAgcmVuZGVyID0gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBzbG90LT5mb3JtYXQsIDAgKTsKLQotCi0gICAgICBpZiAoIHJlbmRlciApCi0gICAgICAgIGNsYXp6ID0gJnJlbmRlci0+Z2x5cGhfY2xhc3M7Ci0gICAgfQotCi0gICAgaWYgKCAhY2xhenogKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogY3JlYXRlIEZUX0dseXBoIG9iamVjdCAqLwotICAgIGVycm9yID0gZnRfbmV3X2dseXBoKCBsaWJyYXJ5LCBjbGF6eiwgJmdseXBoICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjb3B5IGFkdmFuY2Ugd2hpbGUgY29udmVydGluZyAyNi42IHRvIDE2LjE2IGZvcm1hdCAqLwotICAgIGlmICggc2xvdC0+YWR2YW5jZS54ID49ICAweDgwMDBMICogNjQgfHwKLSAgICAgICAgIHNsb3QtPmFkdmFuY2UueCA8PSAtMHg4MDAwTCAqIDY0ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9HZXRfR2x5cGg6IGFkdmFuY2Ugd2lkdGggdG9vIGxhcmdlXG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgfQotICAgIGlmICggc2xvdC0+YWR2YW5jZS55ID49ICAweDgwMDBMICogNjQgfHwKLSAgICAgICAgIHNsb3QtPmFkdmFuY2UueSA8PSAtMHg4MDAwTCAqIDY0ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9HZXRfR2x5cGg6IGFkdmFuY2UgaGVpZ2h0IHRvbyBsYXJnZVxuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIH0KLQotICAgIGdseXBoLT5hZHZhbmNlLnggPSBzbG90LT5hZHZhbmNlLnggKiAxMDI0OwotICAgIGdseXBoLT5hZHZhbmNlLnkgPSBzbG90LT5hZHZhbmNlLnkgKiAxMDI0OwotCi0gICAgLyogbm93IGltcG9ydCB0aGUgaW1hZ2UgZnJvbSB0aGUgZ2x5cGggc2xvdCAqLwotICAgIGVycm9yID0gY2xhenotPmdseXBoX2luaXQoIGdseXBoLCBzbG90ICk7Ci0KLSAgICAvKiBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZGVzdHJveSB0aGUgZ2x5cGggKi8KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7Ci0gICAgZWxzZQotICAgICAgKmFnbHlwaCA9IGdseXBoOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z2x5cGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhfVHJhbnNmb3JtKCBGVF9HbHlwaCAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgZGVsdGEgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFnbHlwaCB8fCAhZ2x5cGgtPmNsYXp6ICkKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6eiA9IGdseXBoLT5jbGF6ejsKLQotCi0gICAgICBpZiAoIGNsYXp6LT5nbHlwaF90cmFuc2Zvcm0gKQotICAgICAgewotICAgICAgICAvKiB0cmFuc2Zvcm0gZ2x5cGggaW1hZ2UgKi8KLSAgICAgICAgY2xhenotPmdseXBoX3RyYW5zZm9ybSggZ2x5cGgsIG1hdHJpeCwgZGVsdGEgKTsKLQotICAgICAgICAvKiB0cmFuc2Zvcm0gYWR2YW5jZSB2ZWN0b3IgKi8KLSAgICAgICAgaWYgKCBtYXRyaXggKQotICAgICAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oICZnbHlwaC0+YWR2YW5jZSwgbWF0cml4ICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGdseXBoLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfR2x5cGhfR2V0X0NCb3goIEZUX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBiYm94X21vZGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAqYWNib3ggKQotICB7Ci0gICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6ejsKLQotCi0gICAgaWYgKCAhYWNib3ggKQotICAgICAgcmV0dXJuOwotCi0gICAgYWNib3gtPnhNaW4gPSBhY2JveC0+eU1pbiA9IGFjYm94LT54TWF4ID0gYWNib3gtPnlNYXggPSAwOwotCi0gICAgaWYgKCAhZ2x5cGggfHwgIWdseXBoLT5jbGF6eiApCi0gICAgICByZXR1cm47Ci0KLSAgICBjbGF6eiA9IGdseXBoLT5jbGF6ejsKLSAgICBpZiAoICFjbGF6ei0+Z2x5cGhfYmJveCApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiByZXRyaWV2ZSBiYm94IGluIDI2LjYgY29vcmRpbmF0ZXMgKi8KLSAgICBjbGF6ei0+Z2x5cGhfYmJveCggZ2x5cGgsIGFjYm94ICk7Ci0KLSAgICAvKiBwZXJmb3JtIGdyaWQgZml0dGluZyBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIGJib3hfbW9kZSA9PSBGVF9HTFlQSF9CQk9YX0dSSURGSVQgfHwKLSAgICAgICAgIGJib3hfbW9kZSA9PSBGVF9HTFlQSF9CQk9YX1BJWEVMUyAgKQotICAgIHsKLSAgICAgIGFjYm94LT54TWluID0gRlRfUElYX0ZMT09SKCBhY2JveC0+eE1pbiApOwotICAgICAgYWNib3gtPnlNaW4gPSBGVF9QSVhfRkxPT1IoIGFjYm94LT55TWluICk7Ci0gICAgICBhY2JveC0+eE1heCA9IEZUX1BJWF9DRUlMKCBhY2JveC0+eE1heCApOwotICAgICAgYWNib3gtPnlNYXggPSBGVF9QSVhfQ0VJTCggYWNib3gtPnlNYXggKTsKLSAgICB9Ci0KLSAgICAvKiBjb252ZXJ0IHRvIGludGVnZXIgcGl4ZWxzIGlmIG5lZWRlZCAqLwotICAgIGlmICggYmJveF9tb2RlID09IEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUgfHwKLSAgICAgICAgIGJib3hfbW9kZSA9PSBGVF9HTFlQSF9CQk9YX1BJWEVMUyAgICkKLSAgICB7Ci0gICAgICBhY2JveC0+eE1pbiA+Pj0gNjsKLSAgICAgIGFjYm94LT55TWluID4+PSA2OwotICAgICAgYWNib3gtPnhNYXggPj49IDY7Ci0gICAgICBhY2JveC0+eU1heCA+Pj0gNjsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9Ub19CaXRtYXAoIEZUX0dseXBoKiAgICAgICB0aGVfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICBvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGRlc3Ryb3kgKQotICB7Ci0gICAgRlRfR2x5cGhTbG90UmVjICAgICAgICAgICBkdW1teTsKLSAgICBGVF9HbHlwaFNsb3RfSW50ZXJuYWxSZWMgIGR1bW15X2ludGVybmFsOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfR2x5cGggICAgICAgICAgICAgICAgICBiLCBnbHlwaDsKLSAgICBGVF9CaXRtYXBHbHlwaCAgICAgICAgICAgIGJpdG1hcCA9IE5VTEw7Ci0gICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICAgICBjbGF6ejsKLQotICAgIC8qIEZUX0JJVE1BUF9HTFlQSF9DTEFTU19HRVQgZGVyZWZlcmVuY2VzIGBsaWJyYXJ5JyBpbiBQSUMgbW9kZSAqLwotICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgbGlicmFyeTsKLQotCi0gICAgLyogY2hlY2sgYXJndW1lbnQgKi8KLSAgICBpZiAoICF0aGVfZ2x5cGggKQotICAgICAgZ290byBCYWQ7Ci0gICAgZ2x5cGggPSAqdGhlX2dseXBoOwotICAgIGlmICggIWdseXBoICkKLSAgICAgIGdvdG8gQmFkOwotCi0gICAgY2xhenogICA9IGdseXBoLT5jbGF6ejsKLSAgICBsaWJyYXJ5ID0gZ2x5cGgtPmxpYnJhcnk7Ci0gICAgaWYgKCAhbGlicmFyeSB8fCAhY2xhenogKQotICAgICAgZ290byBCYWQ7Ci0KLSAgICAvKiB3aGVuIGNhbGxlZCB3aXRoIGEgYml0bWFwIGdseXBoLCBkbyBub3RoaW5nIGFuZCByZXR1cm4gc3VjY2Vzc2Z1bGx5ICovCi0gICAgaWYgKCBjbGF6eiA9PSBGVF9CSVRNQVBfR0xZUEhfQ0xBU1NfR0VUICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggIWNsYXp6LT5nbHlwaF9wcmVwYXJlICkKLSAgICAgIGdvdG8gQmFkOwotCi0gICAgLyogd2UgcmVuZGVyIHRoZSBnbHlwaCBpbnRvIGEgZ2x5cGggYml0bWFwIHVzaW5nIGEgYGR1bW15JyBnbHlwaCBzbG90ICovCi0gICAgLyogdGhlbiBjYWxsaW5nIEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9aRVJPKCAmZHVtbXkgKTsKLSAgICBGVF9aRVJPKCAmZHVtbXlfaW50ZXJuYWwgKTsKLSAgICBkdW1teS5pbnRlcm5hbCA9ICZkdW1teV9pbnRlcm5hbDsKLSAgICBkdW1teS5saWJyYXJ5ICA9IGxpYnJhcnk7Ci0gICAgZHVtbXkuZm9ybWF0ICAgPSBjbGF6ei0+Z2x5cGhfZm9ybWF0OwotCi0gICAgLyogY3JlYXRlIHJlc3VsdCBiaXRtYXAgZ2x5cGggKi8KLSAgICBlcnJvciA9IGZ0X25ld19nbHlwaCggbGlicmFyeSwgRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVCwgJmIgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBiaXRtYXAgPSAoRlRfQml0bWFwR2x5cGgpYjsKLQotI2lmIDEKLSAgICAvKiBpZiBgb3JpZ2luJyBpcyBzZXQsIHRyYW5zbGF0ZSB0aGUgZ2x5cGggaW1hZ2UgKi8KLSAgICBpZiAoIG9yaWdpbiApCi0gICAgICBGVF9HbHlwaF9UcmFuc2Zvcm0oIGdseXBoLCAwLCBvcmlnaW4gKTsKLSNlbHNlCi0gICAgRlRfVU5VU0VEKCBvcmlnaW4gKTsKLSNlbmRpZgotCi0gICAgLyogcHJlcGFyZSBkdW1teSBzbG90IGZvciByZW5kZXJpbmcgKi8KLSAgICBlcnJvciA9IGNsYXp6LT5nbHlwaF9wcmVwYXJlKCBnbHlwaCwgJmR1bW15ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgZXJyb3IgPSBGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwoIGdseXBoLT5saWJyYXJ5LCAmZHVtbXksIHJlbmRlcl9tb2RlICk7Ci0KLSNpZiAxCi0gICAgaWYgKCAhZGVzdHJveSAmJiBvcmlnaW4gKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgICB2LnggPSAtb3JpZ2luLT54OwotICAgICAgdi55ID0gLW9yaWdpbi0+eTsKLSAgICAgIEZUX0dseXBoX1RyYW5zZm9ybSggZ2x5cGgsIDAsICZ2ICk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGluIGNhc2Ugb2Ygc3VjY2VzcywgY29weSB0aGUgYml0bWFwIHRvIHRoZSBnbHlwaCBiaXRtYXAgKi8KLSAgICBlcnJvciA9IGZ0X2JpdG1hcF9nbHlwaF9pbml0KCAoRlRfR2x5cGgpYml0bWFwLCAmZHVtbXkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNvcHkgYWR2YW5jZSAqLwotICAgIGJpdG1hcC0+cm9vdC5hZHZhbmNlID0gZ2x5cGgtPmFkdmFuY2U7Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggZ2x5cGggKTsKLQotICAgICp0aGVfZ2x5cGggPSBGVF9HTFlQSCggYml0bWFwICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICYmIGJpdG1hcCApCi0gICAgICBGVF9Eb25lX0dseXBoKCBGVF9HTFlQSCggYml0bWFwICkgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLQotICBCYWQ6Ci0gICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGdseXBoLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfRG9uZV9HbHlwaCggRlRfR2x5cGggIGdseXBoICkKLSAgewotICAgIGlmICggZ2x5cGggKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgICAgICAgICAgICAgbWVtb3J5ID0gZ2x5cGgtPmxpYnJhcnktPm1lbW9yeTsKLSAgICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgY2xhenogID0gZ2x5cGgtPmNsYXp6OwotCi0KLSAgICAgIGlmICggY2xhenotPmdseXBoX2RvbmUgKQotICAgICAgICBjbGF6ei0+Z2x5cGhfZG9uZSggZ2x5cGggKTsKLQotICAgICAgRlRfRlJFRSggZ2x5cGggKTsKLSAgICB9Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Z3h2YWwuYyBiL3NyYy9iYXNlL2Z0Z3h2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNGQzMy4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdGd4dmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRneHZhbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKGJvZHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZGhhdCBLLkssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HWF9WQUxJREFURV9ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z3h2YWwuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICB2YWxpZGF0aW9uX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGVzW0ZUX1ZBTElEQVRFX0dYX0xFTkdUSF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICB0YWJsZV9sZW5ndGggKQotICB7Ci0gICAgRlRfU2VydmljZV9HWHZhbGlkYXRlICBzZXJ2aWNlOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoICF0YWJsZXMgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIEdYX1ZBTElEQVRFICk7Ci0KLSAgICBpZiAoIHNlcnZpY2UgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT52YWxpZGF0ZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9sZW5ndGggKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1RydWVUeXBlR1hfRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLSAgICBGVF9GUkVFKCB0YWJsZSApOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKmNrZXJuX3RhYmxlICkKLSAgewotICAgIEZUX1NlcnZpY2VfQ0tFUk52YWxpZGF0ZSAgc2VydmljZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAhY2tlcm5fdGFibGUgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIENMQVNTSUNLRVJOX1ZBTElEQVRFICk7Ci0KLSAgICBpZiAoIHNlcnZpY2UgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT52YWxpZGF0ZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2Vybl90YWJsZSApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfQ2xhc3NpY0tlcm5fRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICBGVF9GUkVFKCB0YWJsZSApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGhhc2guYyBiL3NyYy9iYXNlL2Z0aGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJjOGRkLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0aGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aGFzaC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIYXNoaW5nIGZ1bmN0aW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMCBDb21wdXRpbmcgUmVzZWFyY2ggTGFicywgTmV3IE1leGljbyBTdGF0ZSBVbml2ZXJzaXR5Ci0gKiBDb3B5cmlnaHQgMjAwMS0yMDE1Ci0gKiAgIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIENPTVBVVElORyBSRVNFQVJDSCBMQUIgT1IgTkVXIE1FWElDTyBTVEFURSBVTklWRVJTSVRZIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUCi0gKiBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IKLSAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGNvZGUgZnJvbSBiZGYuYyx2IDEuMjIgMjAwMC8wMy8xNiAyMDowODo1MCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICB0YWtlbiBmcm9tIE1hcmsgTGVpc2hlcidzIHhtYmRmZWQgcGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0KLQotI2RlZmluZSBJTklUSUFMX0hUX1NJWkUgIDI0MQotCi0KLSAgc3RhdGljIEZUX1VMb25nCi0gIGhhc2hfc3RyX2xvb2t1cCggRlRfSGFzaGtleSogIGtleSApCi0gIHsKLSAgICBjb25zdCBjaGFyKiAga3AgID0ga2V5LT5zdHI7Ci0gICAgRlRfVUxvbmcgICAgIHJlcyA9IDA7Ci0KLQotICAgIC8qIE1vY2tsaXNwIGhhc2ggZnVuY3Rpb24uICovCi0gICAgd2hpbGUgKCAqa3AgKQotICAgICAgcmVzID0gKCByZXMgPDwgNSApIC0gcmVzICsgKEZUX1VMb25nKSprcCsrOwotCi0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VMb25nCi0gIGhhc2hfbnVtX2xvb2t1cCggRlRfSGFzaGtleSogIGtleSApCi0gIHsKLSAgICBGVF9VTG9uZyAgbnVtID0gKEZUX1VMb25nKWtleS0+bnVtOwotICAgIEZUX1VMb25nICByZXM7Ci0KLQotICAgIC8qIE1vY2tsaXNwIGhhc2ggZnVuY3Rpb24uICovCi0gICAgcmVzID0gbnVtICYgMHhGRjsKLSAgICByZXMgPSAoIHJlcyA8PCA1ICkgLSByZXMgKyAoICggbnVtID4+ICA4ICkgJiAweEZGICk7Ci0gICAgcmVzID0gKCByZXMgPDwgNSApIC0gcmVzICsgKCAoIG51bSA+PiAxNiApICYgMHhGRiApOwotICAgIHJlcyA9ICggcmVzIDw8IDUgKSAtIHJlcyArICggKCBudW0gPj4gMjQgKSAmIDB4RkYgKTsKLQotICAgIHJldHVybiByZXM7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGhhc2hfc3RyX2NvbXBhcmUoIEZUX0hhc2hrZXkqICBhLAotICAgICAgICAgICAgICAgICAgICBGVF9IYXNoa2V5KiAgYiApCi0gIHsKLSAgICBpZiAoIGEtPnN0clswXSA9PSBiLT5zdHJbMF0gICAgICAgICAgICYmCi0gICAgICAgICBmdF9zdHJjbXAoIGEtPnN0ciwgYi0+c3RyICkgPT0gMCApCi0gICAgICByZXR1cm4gMTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBoYXNoX251bV9jb21wYXJlKCBGVF9IYXNoa2V5KiAgYSwKLSAgICAgICAgICAgICAgICAgICAgRlRfSGFzaGtleSogIGIgKQotICB7Ci0gICAgaWYgKCBhLT5udW0gPT0gYi0+bnVtICkKLSAgICAgIHJldHVybiAxOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9IYXNobm9kZSoKLSAgaGFzaF9idWNrZXQoIEZUX0hhc2hrZXkgIGtleSwKLSAgICAgICAgICAgICAgIEZUX0hhc2ggICAgIGhhc2ggKQotICB7Ci0gICAgRlRfVUxvbmcgICAgICByZXMgPSAwOwotICAgIEZUX0hhc2hub2RlKiAgYnAgID0gaGFzaC0+dGFibGU7Ci0gICAgRlRfSGFzaG5vZGUqICBuZHA7Ci0KLQotICAgIHJlcyA9IChoYXNoLT5sb29rdXApKCAma2V5ICk7Ci0KLSAgICBuZHAgPSBicCArICggcmVzICUgaGFzaC0+c2l6ZSApOwotICAgIHdoaWxlICggKm5kcCApCi0gICAgewotICAgICAgaWYgKCAoaGFzaC0+Y29tcGFyZSkoICYoKm5kcCktPmtleSwgJmtleSApICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIG5kcC0tOwotICAgICAgaWYgKCBuZHAgPCBicCApCi0gICAgICAgIG5kcCA9IGJwICsgKCBoYXNoLT5zaXplIC0gMSApOwotICAgIH0KLQotICAgIHJldHVybiBuZHA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBoYXNoX3JlaGFzaCggRlRfSGFzaCAgICBoYXNoLAotICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfSGFzaG5vZGUqICBvYnAgPSBoYXNoLT50YWJsZTsKLSAgICBGVF9IYXNobm9kZSogIGJwOwotICAgIEZUX0hhc2hub2RlKiAgbmJwOwotCi0gICAgRlRfVUludCAgIGksIHN6ID0gaGFzaC0+c2l6ZTsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGhhc2gtPnNpemUgPDw9IDE7Ci0gICAgaGFzaC0+bGltaXQgID0gaGFzaC0+c2l6ZSAvIDM7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggaGFzaC0+dGFibGUsIGhhc2gtPnNpemUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb3IgKCBpID0gMCwgYnAgPSBvYnA7IGkgPCBzejsgaSsrLCBicCsrICkKLSAgICB7Ci0gICAgICBpZiAoICpicCApCi0gICAgICB7Ci0gICAgICAgIG5icCA9IGhhc2hfYnVja2V0KCAoKmJwKS0+a2V5LCBoYXNoICk7Ci0gICAgICAgICpuYnAgPSAqYnA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRlRfRlJFRSggb2JwICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBoYXNoX2luaXQoIEZUX0hhc2ggICAgaGFzaCwKLSAgICAgICAgICAgICBGVF9Cb29sICAgIGlzX251bSwKLSAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9VSW50ICAgc3ogPSBJTklUSUFMX0hUX1NJWkU7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBoYXNoLT5zaXplICA9IHN6OwotICAgIGhhc2gtPmxpbWl0ID0gc3ogLyAzOwotICAgIGhhc2gtPnVzZWQgID0gMDsKLQotICAgIGlmICggaXNfbnVtICkKLSAgICB7Ci0gICAgICBoYXNoLT5sb29rdXAgID0gaGFzaF9udW1fbG9va3VwOwotICAgICAgaGFzaC0+Y29tcGFyZSA9IGhhc2hfbnVtX2NvbXBhcmU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBoYXNoLT5sb29rdXAgID0gaGFzaF9zdHJfbG9va3VwOwotICAgICAgaGFzaC0+Y29tcGFyZSA9IGhhc2hfc3RyX2NvbXBhcmU7Ci0gICAgfQotCi0gICAgRlRfTUVNX05FV19BUlJBWSggaGFzaC0+dGFibGUsIHN6ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGZ0X2hhc2hfc3RyX2luaXQoIEZUX0hhc2ggICAgaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgcmV0dXJuIGhhc2hfaW5pdCggaGFzaCwgMCwgbWVtb3J5ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGZ0X2hhc2hfbnVtX2luaXQoIEZUX0hhc2ggICAgaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgcmV0dXJuIGhhc2hfaW5pdCggaGFzaCwgMSwgbWVtb3J5ICk7Ci0gIH0KLQotCi0gIHZvaWQKLSAgZnRfaGFzaF9zdHJfZnJlZSggRlRfSGFzaCAgICBoYXNoLAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBpZiAoIGhhc2ggKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgICAgc3ogPSBoYXNoLT5zaXplOwotICAgICAgRlRfSGFzaG5vZGUqICBicCA9IGhhc2gtPnRhYmxlOwotICAgICAgRlRfVUludCAgICAgICBpOwotCi0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgc3o7IGkrKywgYnArKyApCi0gICAgICAgIEZUX0ZSRUUoICpicCApOwotCi0gICAgICBGVF9GUkVFKCBoYXNoLT50YWJsZSApOwotICAgIH0KLSAgfQotCi0KLSAgLyogYGZ0X2hhc2hfbnVtX2ZyZWUnIGlzIHRoZSBzYW1lIGFzIGBmdF9oYXNoX3N0cl9mcmVlJyAqLwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGhhc2hfaW5zZXJ0KCBGVF9IYXNoa2V5ICBrZXksCi0gICAgICAgICAgICAgICBzaXplX3QgICAgICBkYXRhLAotICAgICAgICAgICAgICAgRlRfSGFzaCAgICAgaGFzaCwKLSAgICAgICAgICAgICAgIEZUX01lbW9yeSAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9IYXNobm9kZSAgIG5uOwotICAgIEZUX0hhc2hub2RlKiAgYnAgICAgPSBoYXNoX2J1Y2tldCgga2V5LCBoYXNoICk7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgbm4gPSAqYnA7Ci0gICAgaWYgKCAhbm4gKQotICAgIHsKLSAgICAgIGlmICggRlRfTkVXKCBubiApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgKmJwID0gbm47Ci0KLSAgICAgIG5uLT5rZXkgID0ga2V5OwotICAgICAgbm4tPmRhdGEgPSBkYXRhOwotCi0gICAgICBpZiAoIGhhc2gtPnVzZWQgPj0gaGFzaC0+bGltaXQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGhhc2hfcmVoYXNoKCBoYXNoLCBtZW1vcnkgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBoYXNoLT51c2VkKys7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIG5uLT5kYXRhID0gZGF0YTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgZnRfaGFzaF9zdHJfaW5zZXJ0KCBjb25zdCBjaGFyKiAga2V5LAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0hhc2ggICAgICBoYXNoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfSGFzaGtleSAgaGs7Ci0KLQotICAgIGhrLnN0ciA9IGtleTsKLQotICAgIHJldHVybiBoYXNoX2luc2VydCggaGssIGRhdGEsIGhhc2gsIG1lbW9yeSApOwotICB9Ci0KLQotICBGVF9FcnJvcgotICBmdF9oYXNoX251bV9pbnNlcnQoIEZUX0ludCAgICAgbnVtLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9IYXNoICAgIGhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfSGFzaGtleSAgaGs7Ci0KLQotICAgIGhrLm51bSA9IG51bTsKLQotICAgIHJldHVybiBoYXNoX2luc2VydCggaGssIGRhdGEsIGhhc2gsIG1lbW9yeSApOwotICB9Ci0KLQotICBzdGF0aWMgc2l6ZV90KgotICBoYXNoX2xvb2t1cCggRlRfSGFzaGtleSAga2V5LAotICAgICAgICAgICAgICAgRlRfSGFzaCAgICAgaGFzaCApCi0gIHsKLSAgICBGVF9IYXNobm9kZSogIG5wID0gaGFzaF9idWNrZXQoIGtleSwgaGFzaCApOwotCi0KLSAgICByZXR1cm4gKCpucCkgPyAmKCpucCktPmRhdGEKLSAgICAgICAgICAgICAgICAgOiBOVUxMOwotICB9Ci0KLQotICBzaXplX3QqCi0gIGZ0X2hhc2hfc3RyX2xvb2t1cCggY29uc3QgY2hhciogIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9IYXNoICAgICAgaGFzaCApCi0gIHsKLSAgICBGVF9IYXNoa2V5ICBoazsKLQotCi0gICAgaGsuc3RyID0ga2V5OwotCi0gICAgcmV0dXJuIGhhc2hfbG9va3VwKCBoaywgaGFzaCApOwotICB9Ci0KLQotICBzaXplX3QqCi0gIGZ0X2hhc2hfbnVtX2xvb2t1cCggRlRfSW50ICAgbnVtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0hhc2ggIGhhc2ggKQotICB7Ci0gICAgRlRfSGFzaGtleSAgaGs7Ci0KLQotICAgIGhrLm51bSA9IG51bTsKLQotICAgIHJldHVybiBoYXNoX2xvb2t1cCggaGssIGhhc2ggKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRpbml0LmMgYi9zcmMvYmFzZS9mdGluaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiMDhmYS4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdGluaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGluaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgaW5pdGlhbGl6YXRpb24gbGF5ZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyB0d28gICAgICAgICAgICovCi0gIC8qICBmdW5jdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMoKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIHRoZSBzZXQgb2YgZGVmYXVsdCBtb2R1bGVzIHRvIGEgICAgICAqLwotICAvKiAgICAgZnJlc2ggbmV3IGxpYnJhcnkgb2JqZWN0LiAgVGhlIHNldCBpcyB0YWtlbiBmcm9tIHRoZSBoZWFkZXIgZmlsZSAgKi8KLSAgLyogICAgIGBmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCcuICBTZWUgdGhlIGRvY3VtZW50IGBGcmVlVHlwZSAyLjAgICAgICovCi0gIC8qICAgICBCdWlsZCBTeXN0ZW0nIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIEZUX0luaXRfRnJlZVR5cGUoKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzeXN0ZW0gb2JqZWN0IGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybSwgICAqLwotICAvKiAgICAgYnVpbGRzIGEgbGlicmFyeSBvdXQgb2YgaXQsIHRoZW4gY2FsbHMgRlRfRGVmYXVsdF9Ecml2ZXJzKCkuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBOb3RlIHRoYXQgZXZlbiBpZiBGVF9Jbml0X0ZyZWVUeXBlKCkgdXNlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICAqLwotICAvKiAgc3lzdGVtIG9iamVjdCBkZWZpbmVkIGF0IGJ1aWxkIHRpbWUsIGNsaWVudCBhcHBsaWNhdGlvbnMgYXJlIHN0aWxsICAgKi8KLSAgLyogIGFibGUgdG8gcHJvdmlkZSB0aGVpciBvd24gYGZ0c3lzdGVtLmMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9NT0RVTEVfSAotI2luY2x1ZGUgImJhc2VwaWMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2luaXQKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLQotI3VuZGVmICBGVF9VU0VfTU9EVUxFCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfVVNFX01PRFVMRSggdHlwZSwgeCApICBleHRlcm4gIkMiIGNvbnN0IHR5cGUgIHg7Ci0jZWxzZQotI2RlZmluZSBGVF9VU0VfTU9EVUxFKCB0eXBlLCB4ICkgIGV4dGVybiBjb25zdCB0eXBlICB4OwotI2VuZGlmCi0KLSNpbmNsdWRlIEZUX0NPTkZJR19NT0RVTEVTX0gKLQotI3VuZGVmICBGVF9VU0VfTU9EVUxFCi0jZGVmaW5lIEZUX1VTRV9NT0RVTEUoIHR5cGUsIHggKSAgKGNvbnN0IEZUX01vZHVsZV9DbGFzcyopJih4KSwKLQotICBzdGF0aWMKLSAgY29uc3QgRlRfTW9kdWxlX0NsYXNzKiAgY29uc3QgZnRfZGVmYXVsdF9tb2R1bGVzW10gPQotICB7Ci0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0gICAgMAotICB9OwotCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYVEVSTkMgIGV4dGVybiAiQyIKLSNlbHNlCi0jZGVmaW5lIEZUX0VYVEVSTkMgIGV4dGVybgotI2VuZGlmCi0KLSAgLyogZGVjbGFyZSB0aGUgbW9kdWxlJ3MgY2xhc3MgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gZnVuY3Rpb25zICovCi0jdW5kZWYgIEZUX1VTRV9NT0RVTEUKLSNkZWZpbmUgRlRfVVNFX01PRFVMRSggdHlwZSwgeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRVhURVJOQyBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyB4KCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICAqb3V0cHV0X2NsYXNzICk7IFwKLSAgRlRfRVhURVJOQyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgeCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKTsKLQotI2luY2x1ZGUgRlRfQ09ORklHX01PRFVMRVNfSAotCi0gIC8qIGNvdW50IGFsbCBtb2R1bGUgY2xhc3NlcyAqLwotI3VuZGVmICBGVF9VU0VfTU9EVUxFCi0jZGVmaW5lIEZUX1VTRV9NT0RVTEUoIHR5cGUsIHggKSAgTU9EVUxFX0NMQVNTXyAjIyB4LAotCi0gIGVudW0KLSAgewotI2luY2x1ZGUgRlRfQ09ORklHX01PRFVMRVNfSAotICAgIEZUX05VTV9NT0RVTEVfQ0xBU1NFUwotICB9OwotCi0gIC8qIGRlc3Ryb3kgYWxsIG1vZHVsZSBjbGFzc2VzICovCi0jdW5kZWYgIEZUX1VTRV9NT0RVTEUKLSNkZWZpbmUgRlRfVVNFX01PRFVMRSggdHlwZSwgeCApICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKCBjbGFzc2VzW2ldICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9EZXN0cm95X0NsYXNzXyAjIyB4KCBsaWJyYXJ5LCBjbGFzc2VzW2ldICk7IFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaSsrOwotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9kZXN0cm95X2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfTW9kdWxlX0NsYXNzKiAgKmNsYXNzZXM7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgaTsKLSAgICBCYXNlUElDKiAgICAgICAgICAgcGljX2NvbnRhaW5lciA9IChCYXNlUElDKilsaWJyYXJ5LT5waWNfY29udGFpbmVyLmJhc2U7Ci0KLQotICAgIGlmICggIXBpY19jb250YWluZXItPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgKQotICAgICAgcmV0dXJuOwotCi0gICAgbWVtb3J5ICA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBjbGFzc2VzID0gcGljX2NvbnRhaW5lci0+ZGVmYXVsdF9tb2R1bGVfY2xhc3NlczsKLSAgICBpICAgICAgID0gMDsKLQotI2luY2x1ZGUgRlRfQ09ORklHX01PRFVMRVNfSAotCi0gICAgRlRfRlJFRSggY2xhc3NlcyApOwotICAgIHBpY19jb250YWluZXItPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgPSBOVUxMOwotICB9Ci0KLQotICAvKiBpbml0aWFsaXplIGFsbCBtb2R1bGUgY2xhc3NlcyBhbmQgdGhlIHBvaW50ZXIgdGFibGUgKi8KLSN1bmRlZiAgRlRfVVNFX01PRFVMRQotI2RlZmluZSBGVF9VU0VfTU9EVUxFKCB0eXBlLCB4ICkgICAgICAgICAgICAgICAgICAgICBcCi0gIGVycm9yID0gRlRfQ3JlYXRlX0NsYXNzXyAjIyB4KCBsaWJyYXJ5LCAmY2xhenogKTsgIFwKLSAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdvdG8gRXhpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzZXNbaSsrXSA9IGNsYXp6OwotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgZnRfY3JlYXRlX2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnk7Ci0gICAgRlRfTW9kdWxlX0NsYXNzKiAgKmNsYXNzZXMgPSBOVUxMOwotICAgIEZUX01vZHVsZV9DbGFzcyogICBjbGF6ejsKLSAgICBGVF9VSW50ICAgICAgICAgICAgaTsKLSAgICBCYXNlUElDKiAgICAgICAgICAgcGljX2NvbnRhaW5lciA9IChCYXNlUElDKilsaWJyYXJ5LT5waWNfY29udGFpbmVyLmJhc2U7Ci0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIHBpY19jb250YWluZXItPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgPSBOVUxMOwotCi0gICAgaWYgKCBGVF9BTExPQyggY2xhc3Nlcywgc2l6ZW9mICggRlRfTW9kdWxlX0NsYXNzKiApICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggRlRfTlVNX01PRFVMRV9DTEFTU0VTICsgMSApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogaW5pdGlhbGl6ZSBhbGwgcG9pbnRlcnMgdG8gMCwgZXNwZWNpYWxseSB0aGUgbGFzdCBvbmUgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IEZUX05VTV9NT0RVTEVfQ0xBU1NFUzsgaSsrICkKLSAgICAgIGNsYXNzZXNbaV0gPSBOVUxMOwotICAgIGNsYXNzZXNbRlRfTlVNX01PRFVMRV9DTEFTU0VTXSA9IE5VTEw7Ci0KLSAgICBpID0gMDsKLQotI2luY2x1ZGUgRlRfQ09ORklHX01PRFVMRVNfSAotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBmdF9kZXN0cm95X2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMoIGxpYnJhcnkgKTsKLSAgICBlbHNlCi0gICAgICBwaWNfY29udGFpbmVyLT5kZWZhdWx0X21vZHVsZV9jbGFzc2VzID0gY2xhc3NlczsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOwotICAgIGNvbnN0IEZUX01vZHVsZV9DbGFzcyogY29uc3QqICBjdXI7Ci0KLQotICAgIC8qIEZUX0RFRkFVTFRfTU9EVUxFU19HRVQgZGVyZWZlcmVuY2VzIGBsaWJyYXJ5JyBpbiBQSUMgbW9kZSAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm47Ci0jZW5kaWYKLQotICAgIC8qIEdDQyA0LjYgd2FybnMgdGhlIHR5cGUgZGlmZmVyZW5jZToKLSAgICAgKiAgIEZUX01vZHVsZV9DbGFzcyoqICE9IGNvbnN0IEZUX01vZHVsZV9DbGFzcyogY29uc3QqCi0gICAgICovCi0gICAgY3VyID0gKGNvbnN0IEZUX01vZHVsZV9DbGFzcyogY29uc3QqKUZUX0RFRkFVTFRfTU9EVUxFU19HRVQ7Ci0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgbGlicmFyeScgZGVsYXllZCB0byBGVF9BZGRfTW9kdWxlKCkgKi8KLSAgICB3aGlsZSAoICpjdXIgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfQWRkX01vZHVsZSggbGlicmFyeSwgKmN1ciApOwotICAgICAgLyogbm90aWZ5IGVycm9ycywgYnV0IGRvbid0IHN0b3AgKi8KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBGVF9UUkFDRTAoKCAiRlRfQWRkX0RlZmF1bHRfTW9kdWxlOiIKLSAgICAgICAgICAgICAgICAgICAgIiBDYW5ub3QgaW5zdGFsbCBgJXMnLCBlcnJvciA9IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICgqY3VyKS0+bW9kdWxlX25hbWUsIGVycm9yICkpOwotICAgICAgY3VyKys7Ci0gICAgfQotICB9Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUwotCi0jZGVmaW5lIE1BWF9MRU5HVEggIDEyOAotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TZXRfRGVmYXVsdF9Qcm9wZXJ0aWVzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIGNvbnN0IGNoYXIqICBlbnY7Ci0gICAgY29uc3QgY2hhciogIHA7Ci0gICAgY29uc3QgY2hhciogIHE7Ci0KLSAgICBjaGFyICBtb2R1bGVfbmFtZVtNQVhfTEVOR1RIICsgMV07Ci0gICAgY2hhciAgcHJvcGVydHlfbmFtZVtNQVhfTEVOR1RIICsgMV07Ci0gICAgY2hhciAgcHJvcGVydHlfdmFsdWVbTUFYX0xFTkdUSCArIDFdOwotCi0gICAgaW50ICBpOwotCi0KLSAgICBlbnYgPSBmdF9nZXRlbnYoICJGUkVFVFlQRV9QUk9QRVJUSUVTIiApOwotICAgIGlmICggIWVudiApCi0gICAgICByZXR1cm47Ci0KLSAgICBmb3IgKCBwID0gZW52OyAqcDsgcCsrICkKLSAgICB7Ci0gICAgICAvKiBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgc2VwYXJhdG9ycyAqLwotICAgICAgaWYgKCAqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiByZWFkIG1vZHVsZSBuYW1lLCBmb2xsb3dlZCBieSBgOicgKi8KLSAgICAgIHEgPSBwOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBNQVhfTEVOR1RIOyBpKysgKQotICAgICAgewotICAgICAgICBpZiAoICEqcCB8fCAqcCA9PSAnOicgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBtb2R1bGVfbmFtZVtpXSA9ICpwKys7Ci0gICAgICB9Ci0gICAgICBtb2R1bGVfbmFtZVtpXSA9ICdcMCc7Ci0KLSAgICAgIGlmICggISpwIHx8ICpwICE9ICc6JyB8fCBwID09IHEgKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogcmVhZCBwcm9wZXJ0eSBuYW1lLCBmb2xsb3dlZCBieSBgPScgKi8KLSAgICAgIHEgPSArK3A7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9MRU5HVEg7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggISpwIHx8ICpwID09ICc9JyApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHByb3BlcnR5X25hbWVbaV0gPSAqcCsrOwotICAgICAgfQotICAgICAgcHJvcGVydHlfbmFtZVtpXSA9ICdcMCc7Ci0KLSAgICAgIGlmICggISpwIHx8ICpwICE9ICc9JyB8fCBwID09IHEgKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogcmVhZCBwcm9wZXJ0eSB2YWx1ZSwgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSAoaWYgYW55KSAqLwotICAgICAgcSA9ICsrcDsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgTUFYX0xFTkdUSDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAhKnAgfHwgKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBwcm9wZXJ0eV92YWx1ZVtpXSA9ICpwKys7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eV92YWx1ZVtpXSA9ICdcMCc7Ci0KLSAgICAgIGlmICggISggKnAgPT0gJ1wwJyB8fCAqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyApIHx8IHAgPT0gcSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiB3ZSBjb21wbGV0ZWx5IGlnbm9yZSBlcnJvcnMgKi8KLSAgICAgIGZ0X3Byb3BlcnR5X3N0cmluZ19zZXQoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV92YWx1ZSApOwotICAgIH0KLSAgfQotCi0jZWxzZQotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TZXRfRGVmYXVsdF9Qcm9wZXJ0aWVzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotICB9Ci0KLSNlbmRpZgotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5ICAqYWxpYnJhcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgLyogY2hlY2sgb2YgYGFsaWJyYXJ5JyBkZWxheWVkIHRvIGBGVF9OZXdfTGlicmFyeScgKi8KLQotICAgIC8qIEZpcnN0IG9mIGFsbCwgYWxsb2NhdGUgYSBuZXcgc3lzdGVtIG9iamVjdCAtLSB0aGlzIGZ1bmN0aW9uIGlzIHBhcnQgKi8KLSAgICAvKiBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIGNvbXBvbmVudCwgaS5lLiBgZnRzeXN0ZW0uYycuICAgICAgICAgICAgICAgICovCi0KLSAgICBtZW1vcnkgPSBGVF9OZXdfTWVtb3J5KCk7Ci0gICAgaWYgKCAhbWVtb3J5ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9Jbml0X0ZyZWVUeXBlOiBjYW5ub3QgZmluZCBtZW1vcnkgbWFuYWdlclxuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgfQotCi0gICAgLyogYnVpbGQgYSBsaWJyYXJ5IG91dCBvZiBpdCwgdGhlbiBmaWxsIGl0IHdpdGggdGhlIHNldCBvZiAqLwotICAgIC8qIGRlZmF1bHQgZHJpdmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGVycm9yID0gRlRfTmV3X0xpYnJhcnkoIG1lbW9yeSwgYWxpYnJhcnkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0RvbmVfTWVtb3J5KCBtZW1vcnkgKTsKLSAgICBlbHNlCi0gICAgICBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzKCAqYWxpYnJhcnkgKTsKLQotICAgIEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMoICphbGlicmFyeSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfRnJlZVR5cGUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICAvKiBEaXNjYXJkIHRoZSBsaWJyYXJ5IG9iamVjdCAqLwotICAgIEZUX0RvbmVfTGlicmFyeSggbGlicmFyeSApOwotCi0gICAgLyogZGlzY2FyZCBtZW1vcnkgbWFuYWdlciAqLwotICAgIEZUX0RvbmVfTWVtb3J5KCBtZW1vcnkgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0bGNkZmlsLmMgYi9zcmMvYmFzZS9mdGxjZGZpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM1ZTM1Li4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0bGNkZmlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRsY2RmaWwuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY29sb3IgZmlsdGVyaW5nIG9mIHN1YnBpeGVsIGJpdG1hcCBnbHlwaHMgKGJvZHkpLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgRlRfTENEX0ZJTFRFUl9ICi0jaW5jbHVkZSBGVF9JTUFHRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLQotLyogZGVmaW5lIFVTRV9MRUdBQ1kgdG8gaW1wbGVtZW50IHRoZSBsZWdhY3kgZmlsdGVyICovCi0jZGVmaW5lICBVU0VfTEVHQUNZCi0KLSAgLyogRklSIGZpbHRlciB1c2VkIGJ5IHRoZSBkZWZhdWx0IGFuZCBsaWdodCBmaWx0ZXJzICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBmdF9sY2RfZmlsdGVyX2ZpciggRlRfQml0bWFwKiAgICAgICAgICAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgICAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0xjZEZpdmVUYXBGaWx0ZXIgIHdlaWdodHMgKQotICB7Ci0gICAgRlRfVUludCAgIHdpZHRoICA9IChGVF9VSW50KWJpdG1hcC0+d2lkdGg7Ci0gICAgRlRfVUludCAgIGhlaWdodCA9IChGVF9VSW50KWJpdG1hcC0+cm93czsKLSAgICBGVF9JbnQgICAgcGl0Y2ggID0gYml0bWFwLT5waXRjaDsKLSAgICBGVF9CeXRlKiAgb3JpZ2luID0gYml0bWFwLT5idWZmZXI7Ci0KLQotICAgIC8qIHRha2UgY2FyZSBvZiBiaXRtYXAgZmxvdyAqLwotICAgIGlmICggcGl0Y2ggPiAwICkKLSAgICAgIG9yaWdpbiArPSBwaXRjaCAqIChGVF9JbnQpKCBoZWlnaHQgLSAxICk7Ci0KLSAgICAvKiBob3Jpem9udGFsIGluLXBsYWNlIEZJUiBmaWx0ZXIgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEICYmIHdpZHRoID49IDIgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBsaW5lID0gb3JpZ2luOwotCi0KLSAgICAgIC8qIGBmaXInIG11c3QgYmUgYXQgbGVhc3QgMzIgYml0IHdpZGUsIHNpbmNlIHRoZSBzdW0gb2YgKi8KLSAgICAgIC8qIHRoZSB2YWx1ZXMgaW4gYHdlaWdodHMnIGNhbiBleGNlZWQgMHhGRiAgICAgICAgICAgICAgKi8KLQotICAgICAgZm9yICggOyBoZWlnaHQgPiAwOyBoZWlnaHQtLSwgbGluZSAtPSBwaXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGZpcls1XTsKLSAgICAgICAgRlRfVUludCAgdmFsLCB4eDsKLQotCi0gICAgICAgIHZhbCAgICA9IGxpbmVbMF07Ci0gICAgICAgIGZpclsyXSA9IHdlaWdodHNbMl0gKiB2YWw7Ci0gICAgICAgIGZpclszXSA9IHdlaWdodHNbM10gKiB2YWw7Ci0gICAgICAgIGZpcls0XSA9IHdlaWdodHNbNF0gKiB2YWw7Ci0KLSAgICAgICAgdmFsICAgID0gbGluZVsxXTsKLSAgICAgICAgZmlyWzFdID0gZmlyWzJdICsgd2VpZ2h0c1sxXSAqIHZhbDsKLSAgICAgICAgZmlyWzJdID0gZmlyWzNdICsgd2VpZ2h0c1syXSAqIHZhbDsKLSAgICAgICAgZmlyWzNdID0gZmlyWzRdICsgd2VpZ2h0c1szXSAqIHZhbDsKLSAgICAgICAgZmlyWzRdID0gICAgICAgICAgd2VpZ2h0c1s0XSAqIHZhbDsKLQotICAgICAgICBmb3IgKCB4eCA9IDI7IHh4IDwgd2lkdGg7IHh4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsICAgID0gbGluZVt4eF07Ci0gICAgICAgICAgZmlyWzBdID0gZmlyWzFdICsgd2VpZ2h0c1swXSAqIHZhbDsKLSAgICAgICAgICBmaXJbMV0gPSBmaXJbMl0gKyB3ZWlnaHRzWzFdICogdmFsOwotICAgICAgICAgIGZpclsyXSA9IGZpclszXSArIHdlaWdodHNbMl0gKiB2YWw7Ci0gICAgICAgICAgZmlyWzNdID0gZmlyWzRdICsgd2VpZ2h0c1szXSAqIHZhbDsKLSAgICAgICAgICBmaXJbNF0gPSAgICAgICAgICB3ZWlnaHRzWzRdICogdmFsOwotCi0gICAgICAgICAgZmlyWzBdICAgICA+Pj0gODsKLSAgICAgICAgICBmaXJbMF0gICAgICB8PSAoRlRfVUludCktKEZUX0ludCkoIGZpclswXSA+PiA4ICk7Ci0gICAgICAgICAgbGluZVt4eCAtIDJdID0gKEZUX0J5dGUpZmlyWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlyWzFdICAgICA+Pj0gODsKLSAgICAgICAgZmlyWzFdICAgICAgfD0gKEZUX1VJbnQpLShGVF9JbnQpKCBmaXJbMV0gPj4gOCApOwotICAgICAgICBsaW5lW3h4IC0gMl0gPSAoRlRfQnl0ZSlmaXJbMV07Ci0KLSAgICAgICAgZmlyWzJdICAgICA+Pj0gODsKLSAgICAgICAgZmlyWzJdICAgICAgfD0gKEZUX1VJbnQpLShGVF9JbnQpKCBmaXJbMl0gPj4gOCApOwotICAgICAgICBsaW5lW3h4IC0gMV0gPSAoRlRfQnl0ZSlmaXJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogdmVydGljYWwgaW4tcGxhY2UgRklSIGZpbHRlciAqLwotICAgIGVsc2UgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WICYmIGhlaWdodCA+PSAyICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgY29sdW1uID0gb3JpZ2luOwotCi0KLSAgICAgIGZvciAoIDsgd2lkdGggPiAwOyB3aWR0aC0tLCBjb2x1bW4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBjb2wgPSBjb2x1bW47Ci0gICAgICAgIEZUX1VJbnQgICBmaXJbNV07Ci0gICAgICAgIEZUX1VJbnQgICB2YWwsIHl5OwotCi0KLSAgICAgICAgdmFsICAgID0gY29sWzBdOwotICAgICAgICBmaXJbMl0gPSB3ZWlnaHRzWzJdICogdmFsOwotICAgICAgICBmaXJbM10gPSB3ZWlnaHRzWzNdICogdmFsOwotICAgICAgICBmaXJbNF0gPSB3ZWlnaHRzWzRdICogdmFsOwotICAgICAgICBjb2wgICAtPSBwaXRjaDsKLQotICAgICAgICB2YWwgICAgPSBjb2xbMF07Ci0gICAgICAgIGZpclsxXSA9IGZpclsyXSArIHdlaWdodHNbMV0gKiB2YWw7Ci0gICAgICAgIGZpclsyXSA9IGZpclszXSArIHdlaWdodHNbMl0gKiB2YWw7Ci0gICAgICAgIGZpclszXSA9IGZpcls0XSArIHdlaWdodHNbM10gKiB2YWw7Ci0gICAgICAgIGZpcls0XSA9ICAgICAgICAgIHdlaWdodHNbNF0gKiB2YWw7Ci0gICAgICAgIGNvbCAgIC09IHBpdGNoOwotCi0gICAgICAgIGZvciAoIHl5ID0gMjsgeXkgPCBoZWlnaHQ7IHl5KyssIGNvbCAtPSBwaXRjaCApCi0gICAgICAgIHsKLSAgICAgICAgICB2YWwgICAgPSBjb2xbMF07Ci0gICAgICAgICAgZmlyWzBdID0gZmlyWzFdICsgd2VpZ2h0c1swXSAqIHZhbDsKLSAgICAgICAgICBmaXJbMV0gPSBmaXJbMl0gKyB3ZWlnaHRzWzFdICogdmFsOwotICAgICAgICAgIGZpclsyXSA9IGZpclszXSArIHdlaWdodHNbMl0gKiB2YWw7Ci0gICAgICAgICAgZmlyWzNdID0gZmlyWzRdICsgd2VpZ2h0c1szXSAqIHZhbDsKLSAgICAgICAgICBmaXJbNF0gPSAgICAgICAgICB3ZWlnaHRzWzRdICogdmFsOwotCi0gICAgICAgICAgZmlyWzBdICAgICAgICA+Pj0gODsKLSAgICAgICAgICBmaXJbMF0gICAgICAgICB8PSAoRlRfVUludCktKEZUX0ludCkoIGZpclswXSA+PiA4ICk7Ci0gICAgICAgICAgY29sW3BpdGNoICogMl0gID0gKEZUX0J5dGUpZmlyWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlyWzFdICAgICAgICA+Pj0gODsKLSAgICAgICAgZmlyWzFdICAgICAgICAgfD0gKEZUX1VJbnQpLShGVF9JbnQpKCBmaXJbMV0gPj4gOCApOwotICAgICAgICBjb2xbcGl0Y2ggKiAyXSAgPSAoRlRfQnl0ZSlmaXJbMV07Ci0KLSAgICAgICAgZmlyWzJdICAgICAgICA+Pj0gODsKLSAgICAgICAgZmlyWzJdICAgICAgICAgfD0gKEZUX1VJbnQpLShGVF9JbnQpKCBmaXJbMl0gPj4gOCApOwotICAgICAgICBjb2xbcGl0Y2hdICAgICAgPSAoRlRfQnl0ZSlmaXJbMl07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotI2lmZGVmIFVTRV9MRUdBQ1kKLQotICAvKiBpbnRyYS1waXhlbCBmaWx0ZXIgdXNlZCBieSB0aGUgbGVnYWN5IGZpbHRlciAqLwotICBzdGF0aWMgdm9pZAotICBfZnRfbGNkX2ZpbHRlcl9sZWdhY3koIEZUX0JpdG1hcCogICAgICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIHdlaWdodHMgKQotICB7Ci0gICAgRlRfVUludCAgIHdpZHRoICA9IChGVF9VSW50KWJpdG1hcC0+d2lkdGg7Ci0gICAgRlRfVUludCAgIGhlaWdodCA9IChGVF9VSW50KWJpdG1hcC0+cm93czsKLSAgICBGVF9JbnQgICAgcGl0Y2ggID0gYml0bWFwLT5waXRjaDsKLSAgICBGVF9CeXRlKiAgb3JpZ2luID0gYml0bWFwLT5idWZmZXI7Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50ICBmaWx0ZXJzWzNdWzNdID0KLSAgICB7Ci0gICAgICB7IDY1NTM4ICogOS8xMywgNjU1MzggKiAxLzYsIDY1NTM4ICogMS8xMyB9LAotICAgICAgeyA2NTUzOCAqIDMvMTMsIDY1NTM4ICogNC82LCA2NTUzOCAqIDMvMTMgfSwKLSAgICAgIHsgNjU1MzggKiAxLzEzLCA2NTUzOCAqIDEvNiwgNjU1MzggKiA5LzEzIH0KLSAgICB9OwotCi0gICAgRlRfVU5VU0VEKCB3ZWlnaHRzICk7Ci0KLQotICAgIC8qIHRha2UgY2FyZSBvZiBiaXRtYXAgZmxvdyAqLwotICAgIGlmICggcGl0Y2ggPiAwICkKLSAgICAgIG9yaWdpbiArPSBwaXRjaCAqIChGVF9JbnQpKCBoZWlnaHQgLSAxICk7Ci0KLSAgICAvKiBob3Jpem9udGFsIGluLXBsYWNlIGludHJhLXBpeGVsIGZpbHRlciAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgJiYgd2lkdGggPj0gMyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGxpbmUgPSBvcmlnaW47Ci0KLQotICAgICAgZm9yICggOyBoZWlnaHQgPiAwOyBoZWlnaHQtLSwgbGluZSAtPSBwaXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIHh4OwotCi0KLSAgICAgICAgZm9yICggeHggPSAwOyB4eCA8IHdpZHRoOyB4eCArPSAzICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHIsIGcsIGI7Ci0gICAgICAgICAgRlRfVUludCAgcDsKLQotCi0gICAgICAgICAgcCAgPSBsaW5lW3h4XTsKLSAgICAgICAgICByICA9IGZpbHRlcnNbMF1bMF0gKiBwOwotICAgICAgICAgIGcgID0gZmlsdGVyc1swXVsxXSAqIHA7Ci0gICAgICAgICAgYiAgPSBmaWx0ZXJzWzBdWzJdICogcDsKLQotICAgICAgICAgIHAgID0gbGluZVt4eCArIDFdOwotICAgICAgICAgIHIgKz0gZmlsdGVyc1sxXVswXSAqIHA7Ci0gICAgICAgICAgZyArPSBmaWx0ZXJzWzFdWzFdICogcDsKLSAgICAgICAgICBiICs9IGZpbHRlcnNbMV1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBsaW5lW3h4ICsgMl07Ci0gICAgICAgICAgciArPSBmaWx0ZXJzWzJdWzBdICogcDsKLSAgICAgICAgICBnICs9IGZpbHRlcnNbMl1bMV0gKiBwOwotICAgICAgICAgIGIgKz0gZmlsdGVyc1syXVsyXSAqIHA7Ci0KLSAgICAgICAgICBsaW5lW3h4XSAgICAgPSAoRlRfQnl0ZSkoIHIgLyA2NTUzNiApOwotICAgICAgICAgIGxpbmVbeHggKyAxXSA9IChGVF9CeXRlKSggZyAvIDY1NTM2ICk7Ci0gICAgICAgICAgbGluZVt4eCArIDJdID0gKEZUX0J5dGUpKCBiIC8gNjU1MzYgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViAmJiBoZWlnaHQgPj0gMyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGNvbHVtbiA9IG9yaWdpbjsKLQotCi0gICAgICBmb3IgKCA7IHdpZHRoID4gMDsgd2lkdGgtLSwgY29sdW1uKysgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgY29sID0gY29sdW1uIC0gMiAqIHBpdGNoOwotCi0KLSAgICAgICAgZm9yICggOyBoZWlnaHQgPiAwOyBoZWlnaHQgLT0gMywgY29sIC09IDMgKiBwaXRjaCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICByLCBnLCBiOwotICAgICAgICAgIEZUX1VJbnQgIHA7Ci0KLQotICAgICAgICAgIHAgID0gY29sWzBdOwotICAgICAgICAgIHIgID0gZmlsdGVyc1swXVswXSAqIHA7Ci0gICAgICAgICAgZyAgPSBmaWx0ZXJzWzBdWzFdICogcDsKLSAgICAgICAgICBiICA9IGZpbHRlcnNbMF1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBjb2xbcGl0Y2hdOwotICAgICAgICAgIHIgKz0gZmlsdGVyc1sxXVswXSAqIHA7Ci0gICAgICAgICAgZyArPSBmaWx0ZXJzWzFdWzFdICogcDsKLSAgICAgICAgICBiICs9IGZpbHRlcnNbMV1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBjb2xbcGl0Y2ggKiAyXTsKLSAgICAgICAgICByICs9IGZpbHRlcnNbMl1bMF0gKiBwOwotICAgICAgICAgIGcgKz0gZmlsdGVyc1syXVsxXSAqIHA7Ci0gICAgICAgICAgYiArPSBmaWx0ZXJzWzJdWzJdICogcDsKLQotICAgICAgICAgIGNvbFswXSAgICAgICAgID0gKEZUX0J5dGUpKCByIC8gNjU1MzYgKTsKLSAgICAgICAgICBjb2xbcGl0Y2hdICAgICA9IChGVF9CeXRlKSggZyAvIDY1NTM2ICk7Ci0gICAgICAgICAgY29sW3BpdGNoICogMl0gPSAoRlRfQnl0ZSkoIGIgLyA2NTUzNiApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSNlbmRpZiAvKiBVU0VfTEVHQUNZICovCi0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cyggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKndlaWdodHMgKQotICB7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIXdlaWdodHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBmdF9tZW1jcHkoIGxpYnJhcnktPmxjZF93ZWlnaHRzLCB3ZWlnaHRzLCBGVF9MQ0RfRklMVEVSX0ZJVkVfVEFQUyApOwotICAgIGxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYyA9IGZ0X2xjZF9maWx0ZXJfZmlyOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGNkRmlsdGVyICBmaWx0ZXIgKQotICB7Ci0gICAgc3RhdGljIGNvbnN0IEZUX0xjZEZpdmVUYXBGaWx0ZXIgIGRlZmF1bHRfd2VpZ2h0cyA9Ci0gICAgICAgICAgICAgICAgICAgeyAweDA4LCAweDRkLCAweDU2LCAweDRkLCAweDA4IH07Ci0gICAgc3RhdGljIGNvbnN0IEZUX0xjZEZpdmVUYXBGaWx0ZXIgIGxpZ2h0X3dlaWdodHMgPQotICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHg1NSwgMHg1NiwgMHg1NSwgMHgwMCB9OwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgc3dpdGNoICggZmlsdGVyICkKLSAgICB7Ci0gICAgY2FzZSBGVF9MQ0RfRklMVEVSX05PTkU6Ci0gICAgICBsaWJyYXJ5LT5sY2RfZmlsdGVyX2Z1bmMgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX0xDRF9GSUxURVJfREVGQVVMVDoKLSAgICAgIGZ0X21lbWNweSggbGlicmFyeS0+bGNkX3dlaWdodHMsCi0gICAgICAgICAgICAgICAgIGRlZmF1bHRfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgRlRfTENEX0ZJTFRFUl9GSVZFX1RBUFMgKTsKLSAgICAgIGxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYyA9IGZ0X2xjZF9maWx0ZXJfZmlyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX0xDRF9GSUxURVJfTElHSFQ6Ci0gICAgICBmdF9tZW1jcHkoIGxpYnJhcnktPmxjZF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICBsaWdodF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICBGVF9MQ0RfRklMVEVSX0ZJVkVfVEFQUyApOwotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gZnRfbGNkX2ZpbHRlcl9maXI7Ci0gICAgICBicmVhazsKLQotI2lmZGVmIFVTRV9MRUdBQ1kKLQotICAgIGNhc2UgRlRfTENEX0ZJTFRFUl9MRUdBQ1k6Ci0gICAgY2FzZSBGVF9MQ0RfRklMVEVSX0xFR0FDWTE6Ci0gICAgICBsaWJyYXJ5LT5sY2RfZmlsdGVyX2Z1bmMgPSBfZnRfbGNkX2ZpbHRlcl9sZWdhY3k7Ci0gICAgICBicmVhazsKLQotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgfQotCi0gICAgbGlicmFyeS0+bGNkX2ZpbHRlciA9IGZpbHRlcjsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICovCi0KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X2xjZF9maWx0ZXJfZmlyKCBGVF9CaXRtYXAqICAgICAgICAgICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgRlRfTGNkRml2ZVRhcEZpbHRlciAgd2VpZ2h0cyApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGJpdG1hcCApOwotICAgIEZUX1VOVVNFRCggbW9kZSApOwotICAgIEZUX1VOVVNFRCggd2VpZ2h0cyApOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cyggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKndlaWdodHMgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0gICAgRlRfVU5VU0VEKCB3ZWlnaHRzICk7Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MY2RGaWx0ZXIgIGZpbHRlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLSAgICBGVF9VTlVTRUQoIGZpbHRlciApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgfQotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdG1hYy5jIGIvc3JjL2Jhc2UvZnRtYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MjA2Ni4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdG1hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1hYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTWFjIEZPTkQgc3VwcG9ydC4gIFdyaXR0ZW4gYnkganVzdEBsZXR0ZXJyb3IuY29tLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBIZWF2aWx5IG1vZGlmaWVkIGJ5IG1wc3V6dWtpLCBHZW9yZ2UgV2lsbGlhbXMsIGFuZCBTZWFuIE1jQnJpZGUuICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBmb3IgTWFjIE9TIFggb25seTsgc2VlIGJ1aWxkcy9tYWMvZnRvbGRtYWMuYyBmb3IgICAgICAgICAgKi8KLS8qICBjbGFzc2ljIHBsYXRmb3JtcyBidWlsdCBieSBNUFcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBKdXN0IHZhbiBSb3NzdW0sIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qCi0gICAgTm90ZXMKLQotICAgIE1hYyBzdWl0Y2FzZSBmaWxlcyBjYW4gKGFuZCBvZnRlbiBkbyEpIGNvbnRhaW4gbXVsdGlwbGUgZm9udHMuICBUbwotICAgIHN1cHBvcnQgdGhpcyBJIHVzZSB0aGUgZmFjZV9pbmRleCBhcmd1bWVudCBvZiBGVF8oT3BlbnxOZXcpX0ZhY2UoKQotICAgIGZ1bmN0aW9ucywgYW5kIHByZXRlbmQgdGhlIHN1aXRjYXNlIGZpbGUgaXMgYSBjb2xsZWN0aW9uLgotCi0gICAgV2FybmluZzogZmJpdCBhbmQgTkZOVCBiaXRtYXAgcmVzb3VyY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4gIEluIG9sZAotICAgIHNmbnQgZm9udHMsIGJpdG1hcCBnbHlwaCBkYXRhIGZvciBlYWNoIHNpemUgaXMgc3RvcmVkIGluIGVhY2ggYE5GTlQnCi0gICAgcmVzb3VyY2VzIGluc3RlYWQgb2YgdGhlIGBiZGF0JyB0YWJsZSBpbiB0aGUgc2ZudCByZXNvdXJjZS4gIFRoZXJlZm9yZSwKLSAgICBmYWNlLT5udW1fZml4ZWRfc2l6ZXMgaXMgc2V0IHRvIDAsIGJlY2F1c2UgYml0bWFwIGRhdGEgaW4gYE5GTlQnCi0gICAgcmVzb3VyY2UgaXMgdW5hdmFpbGFibGUgYXQgcHJlc2VudC4KLQotICAgIFRoZSBNYWMgRk9ORCBzdXBwb3J0IHdvcmtzIHJvdWdobHkgbGlrZSB0aGlzOgotCi0gICAgLSBDaGVjayB3aGV0aGVyIHRoZSBvZmZlcmVkIHN0cmVhbSBwb2ludHMgdG8gYSBNYWMgc3VpdGNhc2UgZmlsZS4gIFRoaXMKLSAgICAgIGlzIGRvbmUgYnkgY2hlY2tpbmcgdGhlIGZpbGUgdHlwZTogaXQgaGFzIHRvIGJlICdGRklMJyBvciAndGZpbCcuICBUaGUKLSAgICAgIHN0cmVhbSB0aGF0IGdldHMgcGFzc2VkIHRvIG91ciBpbml0X2ZhY2UoKSByb3V0aW5lIGlzIGEgc3RkaW8gc3RyZWFtLAotICAgICAgd2hpY2ggaXNuJ3QgdXNhYmxlIGZvciB1cywgc2luY2UgdGhlIEZPTkQgcmVzb3VyY2VzIGxpdmUgaW4gdGhlCi0gICAgICByZXNvdXJjZSBmb3JrLiAgU28gd2UganVzdCBncmFiIHRoZSBzdHJlYW0tPnBhdGhuYW1lIGZpZWxkLgotCi0gICAgLSBSZWFkIHRoZSBGT05EIHJlc291cmNlIGludG8gbWVtb3J5LCB0aGVuIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYQotICAgICAgVHJ1ZVR5cGUgZm9udCBhbmQvb3IoISkgYSBUeXBlIDEgZm9udCBhdmFpbGFibGUuCi0KLSAgICAtIElmIHRoZXJlIGlzIGEgVHlwZSAxIGZvbnQgYXZhaWxhYmxlIChhcyBhIHNlcGFyYXRlIGBMV0ZOJyBmaWxlKSwgcmVhZAotICAgICAgaXRzIGRhdGEgaW50byBtZW1vcnksIG1hc3NhZ2UgaXQgc2xpZ2h0bHkgc28gaXQgYmVjb21lcyBQRkIgZGF0YSwgd3JhcAotICAgICAgaXQgaW50byBhIG1lbW9yeSBzdHJlYW0sIGxvYWQgdGhlIFR5cGUgMSBkcml2ZXIgYW5kIGRlbGVnYXRlIHRoZSByZXN0Ci0gICAgICBvZiB0aGUgd29yayB0byBpdCBieSBjYWxsaW5nIEZUX09wZW5fRmFjZSgpLiAgKFhYWCBUT0RPOiBhZnRlciB0aGlzCi0gICAgICBoYXMgYmVlbiBkb25lLCB0aGUga2VybmluZyBkYXRhIGZyb20gdGhlIEZPTkQgcmVzb3VyY2Ugc2hvdWxkIGJlCi0gICAgICBhcHBlbmRlZCB0byB0aGUgZmFjZTogT24gdGhlIE1hYyB0aGVyZSBhcmUgdXN1YWxseSBubyBBRk0gZmlsZXMKLSAgICAgIGF2YWlsYWJsZS4gIEhvd2V2ZXIsIHRoaXMgaXMgdHJpY2t5IHNpbmNlIHdlIG5lZWQgdG8gbWFwIE1hYyBjaGFyCi0gICAgICBjb2RlcyB0byBwcyBnbHlwaCBuYW1lcyB0byBnbHlwaCBJRCdzLi4uKQotCi0gICAgLSBJZiB0aGVyZSBpcyBhIFRydWVUeXBlIGZvbnQgKGFuIGBzZm50JyByZXNvdXJjZSksIHJlYWQgaXQgaW50byBtZW1vcnksCi0gICAgICB3cmFwIGl0IGludG8gYSBtZW1vcnkgc3RyZWFtLCBsb2FkIHRoZSBUcnVlVHlwZSBkcml2ZXIgYW5kIGRlbGVnYXRlCi0gICAgICB0aGUgcmVzdCBvZiB0aGUgd29yayB0byBpdCwgYnkgY2FsbGluZyBGVF9PcGVuX0ZhY2UoKS4KLQotICAgIC0gU29tZSBzdWl0Y2FzZSBmb250cyAobm90YWJseSBPbnl4KSBtaWdodCBwb2ludCB0aGUgYExXRk4nIGZpbGUgdG8KLSAgICAgIGl0c2VsZiwgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBjb250YWlucyBgUE9TVCcgcmVzb3VyY2VzLiAgVG8gaGFuZGxlCi0gICAgICB0aGlzIHNwZWNpYWwgY2FzZSB3aXRob3V0IG9wZW5pbmcgdGhlIGZpbGUgYW4gZXh0cmEgdGltZSwgd2UganVzdAotICAgICAgaWdub3JlIGVycm9ycyBmcm9tIHRoZSBgTFdGTicgYW5kIGZhbGxiYWNrIHRvIHRoZSBgc2ZudCcgaWYgYm90aCBhcmUKLSAgICAgIGF2YWlsYWJsZS4KLSAgKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlICJmdGJhc2UuaCIKLQotCi0jaWZkZWYgRlRfTUFDSU5UT1NICi0KLSAgLyogVGhpcyBpcyBmb3IgTWFjIE9TIFguICBXaXRob3V0IHJlZGVmaW5pdGlvbiwgT1NfSU5MSU5FICovCi0gIC8qIGV4cGFuZHMgdG8gYHN0YXRpYyBpbmxpbmUnIHdoaWNoIGRvZXNuJ3Qgc3Vydml2ZSB0aGUgICAqLwotICAvKiAtYW5zaSBjb21waWxhdGlvbiBmbGFnIG9mIEdDQy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAhSEFWRV9BTlNJX09TX0lOTElORQotI3VuZGVmICBPU19JTkxJTkUKLSNkZWZpbmUgT1NfSU5MSU5FICBzdGF0aWMgX19pbmxpbmVfXwotI2VuZGlmCi0KLSAgLyogYGNvbmZpZ3VyZScgY2hlY2tzIHRoZSBhdmFpbGFiaWxpdHkgb2YgYFJlc291cmNlSW5kZXgnIHN0cmljdGx5ICovCi0gIC8qIGFuZCBzZXRzIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCAxIG9yIDAgYWx3YXlzLiAgSWYgaXQgaXMgICAgICAqLwotICAvKiBub3Qgc2V0IChlLmcuLCBhIGJ1aWxkIHdpdGhvdXQgYGNvbmZpZ3VyZScpLCB0aGUgYXZhaWxhYmlsaXR5ICAgKi8KLSAgLyogaXMgZ3Vlc3NlZCBmcm9tIHRoZSBTREsgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWAotI2lmICFkZWZpbmVkKCBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgKSB8fCBcCi0gICAgKCBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgTUFDX09TX1hfVkVSU0lPTl8xMF81ICkKLSNkZWZpbmUgSEFWRV9UWVBFX1JFU09VUkNFX0lOREVYIDAKLSNlbHNlCi0jZGVmaW5lIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCAxCi0jZW5kaWYKLSNlbmRpZiAvKiAhSEFWRV9UWVBFX1JFU09VUkNFX0lOREVYICovCi0KLSNpZiAoIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCA9PSAwICkKLSAgdHlwZWRlZiBzaG9ydCAgUmVzb3VyY2VJbmRleDsKLSNlbmRpZgotCi0jaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgotI2luY2x1ZGUgPHN5cy9zeXNsaW1pdHMuaD4gLyogUEFUSF9NQVggKi8KLQotICAvKiBEb24ndCB3YW50IHdhcm5pbmdzIGFib3V0IG91ciBvd24gdXNlIG9mIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLiAqLwotI2RlZmluZSBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURQotCi0jaW5jbHVkZSBGVF9NQUNfSAotCi0jaWZuZGVmIGtBVFNPcHRpb25GbGFnc1VuUmVzdHJpY3RlZFNjb3BlIC8qIHNpbmNlIE1hYyBPUyBYIDEwLjEgKi8KLSNkZWZpbmUga0FUU09wdGlvbkZsYWdzVW5SZXN0cmljdGVkU2NvcGUga0FUU09wdGlvbkZsYWdzRGVmYXVsdAotI2VuZGlmCi0KLQotICAvKiBTZXQgUFJFRkVSX0xXRk4gdG8gMSBpZiBMV0ZOIChUeXBlIDEpIGlzIHByZWZlcnJlZCBvdmVyCi0gICAgIFRydWVUeXBlIGluIGNhc2UgKmJvdGgqIGFyZSBhdmFpbGFibGUgKHRoaXMgaXMgbm90IGNvbW1vbiwKLSAgICAgYnV0IGl0ICppcyogcG9zc2libGUpLiAqLwotI2lmbmRlZiBQUkVGRVJfTFdGTgotI2RlZmluZSBQUkVGRVJfTFdGTiAgMQotI2VuZGlmCi0KLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBGU1NwZWMgaXMgZGVwcmVjYXRlZCBpbiBNYWMgT1MgWCAgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUoIGNvbnN0IGNoYXIqICBmb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWMqICAgICAgcGF0aFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgRlRfVU5VU0VEKCBmb250TmFtZSApOwotICAgIEZUX1VOVVNFRCggcGF0aFNwZWMgKTsKLSAgICBGVF9VTlVTRUQoIGZhY2VfaW5kZXggKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gIH0KLQotCi0gIC8qIFByaXZhdGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgRlNTcGVjIHR5cGUgaGFzIGJlZW4gZGlzY291cmFnZWQgZm9yIGEgbG9uZyB0aW1lLCAgICAgKi8KLSAgLyogdW5mb3J0dW5hdGVseSBhbiBGU1JlZiByZXBsYWNlbWVudCBBUEkgZm9yICAgICAgICAgICAgICAgICovCi0gIC8qIEFUU0ZvbnRHZXRGaWxlU3BlY2lmaWNhdGlvbigpIGlzIG9ubHkgYXZhaWxhYmxlIGluICAgICAgICAqLwotICAvKiBNYWMgT1MgWCAxMC41IGFuZCBsYXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIE9TU3RhdHVzCi0gIEZUX0FUU0ZvbnRHZXRGaWxlUmVmZXJlbmNlKCBBVFNGb250UmVmICBhdHNfZm9udF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmKiAgICAgIGF0c19mb250X3JlZiApCi0gIHsKLSNpZiBkZWZpbmVkKCBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgKSAmJiBcCi0gICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgKQotCi0gICAgT1NTdGF0dXMgIGVycjsKLQotICAgIGVyciA9IEFUU0ZvbnRHZXRGaWxlUmVmZXJlbmNlKCBhdHNfZm9udF9pZCwgYXRzX2ZvbnRfcmVmICk7Ci0KLSAgICByZXR1cm4gZXJyOwotI2VsaWYgX19MUDY0X18gLyogTm8gNjRiaXQgQ2FyYm9uIEFQSSBvbiBsZWdhY3kgcGxhdGZvcm1zICovCi0gICAgRlRfVU5VU0VEKCBhdHNfZm9udF9pZCApOwotICAgIEZUX1VOVVNFRCggYXRzX2ZvbnRfcmVmICk7Ci0KLQotICAgIHJldHVybiBmbmZFcnI7Ci0jZWxzZSAvKiAzMmJpdCBDYXJib24gQVBJIG9uIGxlZ2FjeSBwbGF0Zm9ybXMgKi8KLSAgICBPU1N0YXR1cyAgZXJyOwotICAgIEZTU3BlYyAgICBzcGVjOwotCi0KLSAgICBlcnIgPSBBVFNGb250R2V0RmlsZVNwZWNpZmljYXRpb24oIGF0c19mb250X2lkLCAmc3BlYyApOwotICAgIGlmICggbm9FcnIgPT0gZXJyICkKLSAgICAgIGVyciA9IEZTcE1ha2VGU1JlZiggJnNwZWMsIGF0c19mb250X3JlZiApOwotCi0gICAgcmV0dXJuIGVycjsKLSNlbmRpZgotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgRlRfR2V0RmlsZVJlZl9Gcm9tX01hY19BVFNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZiogICAgICAgYXRzX2ZvbnRfcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gIHsKLSAgICBDRlN0cmluZ1JlZiAgY2ZfZm9udE5hbWU7Ci0gICAgQVRTRm9udFJlZiAgIGF0c19mb250X2lkOwotCi0KLSAgICAqZmFjZV9pbmRleCA9IDA7Ci0KLSAgICBjZl9mb250TmFtZSA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoIE5VTEwsIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbiApOwotICAgIGF0c19mb250X2lkID0gQVRTRm9udEZpbmRGcm9tTmFtZSggY2ZfZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQVRTT3B0aW9uRmxhZ3NVblJlc3RyaWN0ZWRTY29wZSApOwotICAgIENGUmVsZWFzZSggY2ZfZm9udE5hbWUgKTsKLQotICAgIGlmICggYXRzX2ZvbnRfaWQgPT0gMCB8fCBhdHNfZm9udF9pZCA9PSAweEZGRkZGRkZGVUwgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZUX0FUU0ZvbnRHZXRGaWxlUmVmZXJlbmNlKCBhdHNfZm9udF9pZCwgYXRzX2ZvbnRfcmVmICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAvKiBmYWNlX2luZGV4IGNhbGN1bGF0aW9uIGJ5IHNlYXJjaGluZyBwcmVjZWRpbmcgZm9udElEcyAqLwotICAgIC8qIHdpdGggc2FtZSBGU1JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgQVRTRm9udFJlZiAgaWQyID0gYXRzX2ZvbnRfaWQgLSAxOwotICAgICAgRlNSZWYgICAgICAgcmVmMjsKLQotCi0gICAgICB3aGlsZSAoIGlkMiA+IDAgKQotICAgICAgewotICAgICAgICBpZiAoIG5vRXJyICE9IEZUX0FUU0ZvbnRHZXRGaWxlUmVmZXJlbmNlKCBpZDIsICZyZWYyICkgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoIG5vRXJyICE9IEZTQ29tcGFyZUZTUmVmcyggYXRzX2ZvbnRfcmVmLCAmcmVmMiApICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZDIgLS07Ci0gICAgICB9Ci0gICAgICAqZmFjZV9pbmRleCA9IGF0c19mb250X2lkIC0gKCBpZDIgKyAxICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlUGF0aF9Gcm9tX01hY19BVFNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDgqICAgICAgIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgbWF4UGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gIHsKLSAgICBGU1JlZiAgICAgcmVmOwotICAgIEZUX0Vycm9yICBlcnI7Ci0KLQotICAgIGlmICggIWZvbnROYW1lIHx8ICFmYWNlX2luZGV4ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCk7Ci0KLSAgICBlcnIgPSBGVF9HZXRGaWxlUmVmX0Zyb21fTWFjX0FUU19OYW1lKCBmb250TmFtZSwgJnJlZiwgZmFjZV9pbmRleCApOwotICAgIGlmICggZXJyICkKLSAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTUmVmTWFrZVBhdGgoICZyZWYsIHBhdGgsIG1heFBhdGhTaXplICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBGU1NwZWMgaXMgZGVwcmVjYXRlZCBpbiBNYWMgT1MgWCAgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICB7Ci0jaWYgKCBfX0xQNjRfXyApIHx8ICggZGVmaW5lZCggTUFDX09TX1hfVkVSU0lPTl8xMF81ICkgJiYgXAotICAgICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgKSApCi0gICAgRlRfVU5VU0VEKCBmb250TmFtZSApOwotICAgIEZUX1VOVVNFRCggcGF0aFNwZWMgKTsKLSAgICBGVF9VTlVTRUQoIGZhY2VfaW5kZXggKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0jZWxzZQotICAgIEZTUmVmICAgICByZWY7Ci0gICAgRlRfRXJyb3IgIGVycjsKLQotCi0gICAgaWYgKCAhZm9udE5hbWUgfHwgIWZhY2VfaW5kZXggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnIgPSBGVF9HZXRGaWxlUmVmX0Zyb21fTWFjX0FUU19OYW1lKCBmb250TmFtZSwgJnJlZiwgZmFjZV9pbmRleCApOwotICAgIGlmICggZXJyICkKLSAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTR2V0Q2F0YWxvZ0luZm8oICZyZWYsIGtGU0NhdEluZm9Ob25lLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFNwZWMsIE5VTEwgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0jZW5kaWYKLSAgfQotCi0KLSAgc3RhdGljIE9TRXJyCi0gIEZUX0ZTUGF0aE1ha2VSZXMoIGNvbnN0IFVJbnQ4KiAgICBwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgUmVzRmlsZVJlZk51bSogIHJlcyApCi0gIHsKLSAgICBPU0VyciAgZXJyOwotICAgIEZTUmVmICByZWY7Ci0KLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aG5hbWUsICZyZWYsIEZBTFNFICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgLyogYXQgcHJlc2VudCwgbm8gc3VwcG9ydCBmb3IgZGZvbnQgZm9ybWF0ICovCi0gICAgZXJyID0gRlNPcGVuUmVzb3VyY2VGaWxlKCAmcmVmLCAwLCBOVUxMLCBmc1JkUGVybSwgcmVzICk7Ci0gICAgaWYgKCBub0VyciA9PSBlcnIgKQotICAgICAgcmV0dXJuIGVycjsKLQotICAgIC8qIGZhbGxiYWNrIHRvIG9yaWdpbmFsIHJlc291cmNlLWZvcmsgZm9udCAqLwotICAgICpyZXMgPSBGU09wZW5SZXNGaWxlKCAmcmVmLCBmc1JkUGVybSApOwotICAgIGVyciAgPSBSZXNFcnJvcigpOwotCi0gICAgcmV0dXJuIGVycjsKLSAgfQotCi0KLSAgLyogUmV0dXJuIHRoZSBmaWxlIHR5cGUgZm9yIGdpdmVuIHBhdGhuYW1lICovCi0gIHN0YXRpYyBPU1R5cGUKLSAgZ2V0X2ZpbGVfdHlwZV9mcm9tX3BhdGgoIGNvbnN0IFVJbnQ4KiAgcGF0aG5hbWUgKQotICB7Ci0gICAgRlNSZWYgICAgICAgICAgcmVmOwotICAgIEZTQ2F0YWxvZ0luZm8gIGluZm87Ci0KLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aG5hbWUsICZyZWYsIEZBTFNFICkgKQotICAgICAgcmV0dXJuICggT1NUeXBlICkgMDsKLQotICAgIGlmICggbm9FcnIgIT0gRlNHZXRDYXRhbG9nSW5mbyggJnJlZiwga0ZTQ2F0SW5mb0ZpbmRlckluZm8sICZpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCApICkKLSAgICAgIHJldHVybiAoIE9TVHlwZSApIDA7Ci0KLSAgICByZXR1cm4gKChGSW5mbyAqKShpbmZvLmZpbmRlckluZm8pKS0+ZmRUeXBlOwotICB9Ci0KLQotICAvKiBHaXZlbiBhIFBvc3RTY3JpcHQgZm9udCBuYW1lLCBjcmVhdGUgdGhlIE1hY2ludG9zaCBMV0ZOIGZpbGUgbmFtZS4gKi8KLSAgc3RhdGljIHZvaWQKLSAgY3JlYXRlX2x3Zm5fbmFtZSggY2hhciogICBwc19uYW1lLAotICAgICAgICAgICAgICAgICAgICBTdHIyNTUgIGx3Zm5fZmlsZV9uYW1lICkKLSAgewotICAgIGludCAgICAgICBtYXggPSA1LCBjb3VudCA9IDA7Ci0gICAgRlRfQnl0ZSogIHAgPSBsd2ZuX2ZpbGVfbmFtZTsKLSAgICBGVF9CeXRlKiAgcSA9IChGVF9CeXRlKilwc19uYW1lOwotCi0KLSAgICBsd2ZuX2ZpbGVfbmFtZVswXSA9IDA7Ci0KLSAgICB3aGlsZSAoICpxICkKLSAgICB7Ci0gICAgICBpZiAoIGZ0X2lzdXBwZXIoICpxICkgKQotICAgICAgewotICAgICAgICBpZiAoIGNvdW50ICkKLSAgICAgICAgICBtYXggPSAzOwotICAgICAgICBjb3VudCA9IDA7Ci0gICAgICB9Ci0gICAgICBpZiAoIGNvdW50IDwgbWF4ICYmICggZnRfaXNhbG51bSggKnEgKSB8fCAqcSA9PSAnXycgKSApCi0gICAgICB7Ci0gICAgICAgICorK3AgPSAqcTsKLSAgICAgICAgbHdmbl9maWxlX25hbWVbMF0rKzsKLSAgICAgICAgY291bnQrKzsKLSAgICAgIH0KLSAgICAgIHErKzsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBzaG9ydAotICBjb3VudF9mYWNlc19zZm50KCBjaGFyKiAgZm9uZF9kYXRhICkKLSAgewotICAgIC8qIFRoZSBjb3VudCBpcyAxIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgaW4gdGhlIEZPTkQuICAqLwotICAgIC8qIElzbid0IHRoYXQgY3V0ZT8gOi0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgcmV0dXJuIEVuZGlhblMxNl9CdG9OKCAqKCAoc2hvcnQqKSggZm9uZF9kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGYW1SZWMgKSApICkgKSArIDE7Ci0gIH0KLQotCi0gIHN0YXRpYyBzaG9ydAotICBjb3VudF9mYWNlc19zY2FsYWJsZSggY2hhciogIGZvbmRfZGF0YSApCi0gIHsKLSAgICBBc3NjRW50cnkqICBhc3NvYzsKLSAgICBzaG9ydCAgICAgICBpLCBmYWNlLCBmYWNlX2FsbDsKLQotCi0gICAgZmFjZV9hbGwgPSBFbmRpYW5TMTZfQnRvTiggKiggKHNob3J0ICopKCBmb25kX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRmFtUmVjICkgKSApICkgKyAxOwotICAgIGFzc29jICAgID0gKEFzc2NFbnRyeSopKCBmb25kX2RhdGEgKyBzaXplb2YgKCBGYW1SZWMgKSArIDIgKTsKLSAgICBmYWNlICAgICA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2VfYWxsOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggMCA9PSBFbmRpYW5TMTZfQnRvTiggYXNzb2NbaV0uZm9udFNpemUgKSApCi0gICAgICAgIGZhY2UrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGZhY2U7Ci0gIH0KLQotCi0gIC8qIExvb2sgaW5zaWRlIHRoZSBGT05EIGRhdGEsIGFuc3dlciB3aGV0aGVyIHRoZXJlIHNob3VsZCBiZSBhbiBTRk5UCi0gICAgIHJlc291cmNlLCBhbmQgYW5zd2VyIHRoZSBuYW1lIG9mIGEgcG9zc2libGUgTFdGTiBUeXBlIDEgZmlsZS4KLQotICAgICBUaGFua3MgdG8gUGF1bCBNaWxsZXIgKHBhdWxtQHByb2ZvdW5kZWZmZWN0cy5jb20pIGZvciB0aGUgZml4Ci0gICAgIHRvIGxvYWQgYSBmYWNlIE9USEVSIHRoYW4gdGhlIGZpcnN0IG9uZSBpbiB0aGUgRk9ORCEKLSAgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBhcnNlX2ZvbmQoIGNoYXIqICAgZm9uZF9kYXRhLAotICAgICAgICAgICAgICBzaG9ydCogIGhhdmVfc2ZudCwKLSAgICAgICAgICAgICAgUmVzSUQqICBzZm50X2lkLAotICAgICAgICAgICAgICBTdHIyNTUgIGx3Zm5fZmlsZV9uYW1lLAotICAgICAgICAgICAgICBzaG9ydCAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgQXNzY0VudHJ5KiAgYXNzb2M7Ci0gICAgQXNzY0VudHJ5KiAgYmFzZV9hc3NvYzsKLSAgICBGYW1SZWMqICAgICBmb25kOwotCi0KLSAgICAqc2ZudF9pZCAgICAgICAgICA9IDA7Ci0gICAgKmhhdmVfc2ZudCAgICAgICAgPSAwOwotICAgIGx3Zm5fZmlsZV9uYW1lWzBdID0gMDsKLQotICAgIGZvbmQgICAgICAgPSAoRmFtUmVjKilmb25kX2RhdGE7Ci0gICAgYXNzb2MgICAgICA9IChBc3NjRW50cnkqKSggZm9uZF9kYXRhICsgc2l6ZW9mICggRmFtUmVjICkgKyAyICk7Ci0gICAgYmFzZV9hc3NvYyA9IGFzc29jOwotCi0gICAgLyogdGhlIG1heGltdW0gZmFjZXMgaW4gYSBGT05EIGlzIDQ4LCBzaXplIG9mIFN0eWxlVGFibGUuaW5kZXhlc1tdICovCi0gICAgaWYgKCA0NyA8IGZhY2VfaW5kZXggKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogTGV0J3MgZG8gYSBsaXR0bGUgcmFuZ2UgY2hlY2tpbmcgYmVmb3JlIHdlIGdldCB0b28gZXhjaXRlZCBoZXJlICovCi0gICAgaWYgKCBmYWNlX2luZGV4IDwgY291bnRfZmFjZXNfc2ZudCggZm9uZF9kYXRhICkgKQotICAgIHsKLSAgICAgIGFzc29jICs9IGZhY2VfaW5kZXg7ICAgICAgICAvKiBhZGQgb24gdGhlIGZhY2VfaW5kZXghICovCi0KLSAgICAgIC8qIGlmIHRoZSBmYWNlIGF0IHRoaXMgaW5kZXggaXMgbm90IHNjYWxhYmxlLAotICAgICAgICAgZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBvbmUgKG9sZCBiZWhhdmlvcikgKi8KLSAgICAgIGlmICggRW5kaWFuUzE2X0J0b04oIGFzc29jLT5mb250U2l6ZSApID09IDAgKQotICAgICAgewotICAgICAgICAqaGF2ZV9zZm50ID0gMTsKLSAgICAgICAgKnNmbnRfaWQgICA9IEVuZGlhblMxNl9CdG9OKCBhc3NvYy0+Zm9udElEICk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggYmFzZV9hc3NvYy0+Zm9udFNpemUgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpoYXZlX3NmbnQgPSAxOwotICAgICAgICAqc2ZudF9pZCAgID0gRW5kaWFuUzE2X0J0b04oIGJhc2VfYXNzb2MtPmZvbnRJRCApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggRW5kaWFuUzMyX0J0b04oIGZvbmQtPmZmU3R5bE9mZiApICkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyKiAgcCA9ICh1bnNpZ25lZCBjaGFyKilmb25kX2RhdGE7Ci0gICAgICBTdHlsZVRhYmxlKiAgICAgc3R5bGU7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgc3RyaW5nX2NvdW50OwotICAgICAgY2hhciAgICAgICAgICAgIHBzX25hbWVbMjU2XTsKLSAgICAgIHVuc2lnbmVkIGNoYXIqICBuYW1lc1s2NF07Ci0gICAgICBpbnQgICAgICAgICAgICAgaTsKLQotCi0gICAgICBwICs9IEVuZGlhblMzMl9CdG9OKCBmb25kLT5mZlN0eWxPZmYgKTsKLSAgICAgIHN0eWxlID0gKFN0eWxlVGFibGUqKXA7Ci0gICAgICBwICs9IHNpemVvZiAoIFN0eWxlVGFibGUgKTsKLSAgICAgIHN0cmluZ19jb3VudCA9IEVuZGlhblMxNl9CdG9OKCAqKHNob3J0KikocCkgKTsKLSAgICAgIHN0cmluZ19jb3VudCA9IEZUX01JTiggNjQsIHN0cmluZ19jb3VudCApOwotICAgICAgcCArPSBzaXplb2YgKCBzaG9ydCApOwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IHN0cmluZ19jb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNbaV0gPSBwOwotICAgICAgICBwICAgICAgICs9IG5hbWVzW2ldWzBdOwotICAgICAgICBwKys7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgc2l6ZV90ICBwc19uYW1lX2xlbiA9IChzaXplX3QpbmFtZXNbMF1bMF07Ci0KLQotICAgICAgICBpZiAoIHBzX25hbWVfbGVuICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZnRfbWVtY3B5KHBzX25hbWUsIG5hbWVzWzBdICsgMSwgcHNfbmFtZV9sZW4pOwotICAgICAgICAgIHBzX25hbWVbcHNfbmFtZV9sZW5dID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHN0eWxlLT5pbmRleGVzW2ZhY2VfaW5kZXhdID4gMSAmJgotICAgICAgICAgICAgIHN0eWxlLT5pbmRleGVzW2ZhY2VfaW5kZXhdIDw9IHN0cmluZ19jb3VudCApCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgc3VmZml4ZXMgPSBuYW1lc1tzdHlsZS0+aW5kZXhlc1tmYWNlX2luZGV4XSAtIDFdOwotCi0KLSAgICAgICAgICBmb3IgKCBpID0gMTsgaSA8PSBzdWZmaXhlc1swXTsgaSsrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgczsKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBqID0gc3VmZml4ZXNbaV0gLSAxOwotCi0KLSAgICAgICAgICAgIGlmICggaiA8IHN0cmluZ19jb3VudCAmJiAoIHMgPSBuYW1lc1tqXSApICE9IE5VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzaXplX3QgIHNfbGVuID0gKHNpemVfdClzWzBdOwotCi0KLSAgICAgICAgICAgICAgaWYgKCBzX2xlbiAhPSAwICYmIHBzX25hbWVfbGVuICsgc19sZW4gPCBzaXplb2YgKCBwc19uYW1lICkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnRfbWVtY3B5KCBwc19uYW1lICsgcHNfbmFtZV9sZW4sIHMgKyAxLCBzX2xlbiApOwotICAgICAgICAgICAgICAgIHBzX25hbWVfbGVuICs9IHNfbGVuOwotICAgICAgICAgICAgICAgIHBzX25hbWVbcHNfbmFtZV9sZW5dID0gMDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBjcmVhdGVfbHdmbl9uYW1lKCBwc19uYW1lLCBsd2ZuX2ZpbGVfbmFtZSApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljICBGVF9FcnJvcgotICBsb29rdXBfbHdmbl9ieV9mb25kKCBjb25zdCBVSW50OCogICAgICBwYXRoX2ZvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gIGJhc2VfbHdmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgVUludDgqICAgICAgICAgICAgcGF0aF9sd2ZuLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICBwYXRoX3NpemUgKQotICB7Ci0gICAgRlNSZWYgICByZWYsIHBhcl9yZWY7Ci0gICAgc2l6ZV90ICBkaXJuYW1lX2xlbjsKLQotCi0gICAgLyogUGF0aG5hbWUgZm9yIEZTUmVmIGNhbiBiZSBpbiB2YXJpb3VzIGZvcm1hdHM6IEhGUywgSEZTKywgYW5kIFBPU0lYLiAqLwotICAgIC8qIFdlIHNob3VsZCBub3QgZXh0cmFjdCBwYXJlbnQgZGlyZWN0b3J5IGJ5IHN0cmluZyBtYW5pcHVsYXRpb24uICAgICAgKi8KLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aF9mb25kLCAmcmVmLCBGQUxTRSApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBub0VyciAhPSBGU0dldENhdGFsb2dJbmZvKCAmcmVmLCBrRlNDYXRJbmZvTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsICZwYXJfcmVmICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTUmVmTWFrZVBhdGgoICZwYXJfcmVmLCBwYXRoX2x3Zm4sIHBhdGhfc2l6ZSApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBmdF9zdHJsZW4oIChjaGFyICopcGF0aF9sd2ZuICkgKyAxICsgYmFzZV9sd2ZuWzBdID4gcGF0aF9zaXplICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgLyogbm93IHdlIGhhdmUgYWJzb2x1dGUgZGlybmFtZSBpbiBwYXRoX2x3Zm4gKi8KLSAgICBmdF9zdHJjYXQoIChjaGFyICopcGF0aF9sd2ZuLCAiLyIgKTsKLSAgICBkaXJuYW1lX2xlbiA9IGZ0X3N0cmxlbiggKGNoYXIgKilwYXRoX2x3Zm4gKTsKLSAgICBmdF9zdHJjYXQoIChjaGFyICopcGF0aF9sd2ZuLCAoY2hhciAqKWJhc2VfbHdmbiArIDEgKTsKLSAgICBwYXRoX2x3Zm5bZGlybmFtZV9sZW4gKyBiYXNlX2x3Zm5bMF1dID0gJ1wwJzsKLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aF9sd2ZuLCAmcmVmLCBGQUxTRSApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIGlmICggbm9FcnIgIT0gRlNHZXRDYXRhbG9nSW5mbyggJnJlZiwga0ZTQ2F0SW5mb05vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIHNob3J0Ci0gIGNvdW50X2ZhY2VzKCBIYW5kbGUgICAgICAgIGZvbmQsCi0gICAgICAgICAgICAgICBjb25zdCBVSW50OCogIHBhdGhuYW1lICkKLSAgewotICAgIFJlc0lEICAgICBzZm50X2lkOwotICAgIHNob3J0ICAgICBoYXZlX3NmbnQsIGhhdmVfbHdmbjsKLSAgICBTdHIyNTUgICAgbHdmbl9maWxlX25hbWU7Ci0gICAgVUludDggICAgIGJ1ZmZbUEFUSF9NQVhdOwotICAgIEZUX0Vycm9yICBlcnI7Ci0gICAgc2hvcnQgICAgIG51bV9mYWNlczsKLQotCi0gICAgaGF2ZV9zZm50ID0gaGF2ZV9sd2ZuID0gMDsKLQotICAgIHBhcnNlX2ZvbmQoICpmb25kLCAmaGF2ZV9zZm50LCAmc2ZudF9pZCwgbHdmbl9maWxlX25hbWUsIDAgKTsKLQotICAgIGlmICggbHdmbl9maWxlX25hbWVbMF0gKQotICAgIHsKLSAgICAgIGVyciA9IGxvb2t1cF9sd2ZuX2J5X2ZvbmQoIHBhdGhuYW1lLCBsd2ZuX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYsIHNpemVvZiAoIGJ1ZmYgKSAgKTsKLSAgICAgIGlmICggIWVyciApCi0gICAgICAgIGhhdmVfbHdmbiA9IDE7Ci0gICAgfQotCi0gICAgaWYgKCBoYXZlX2x3Zm4gJiYgKCAhaGF2ZV9zZm50IHx8IFBSRUZFUl9MV0ZOICkgKQotICAgICAgbnVtX2ZhY2VzID0gMTsKLSAgICBlbHNlCi0gICAgICBudW1fZmFjZXMgPSBjb3VudF9mYWNlc19zY2FsYWJsZSggKmZvbmQgKTsKLQotICAgIHJldHVybiBudW1fZmFjZXM7Ci0gIH0KLQotCi0gIC8qIFJlYWQgVHlwZSAxIGRhdGEgZnJvbSB0aGUgUE9TVCByZXNvdXJjZXMgaW5zaWRlIHRoZSBMV0ZOIGZpbGUsCi0gICAgIHJldHVybiBhIFBGQiBidWZmZXIuICBUaGlzIGlzIHNvbWV3aGF0IGNvbnZvbHV0ZWQgYmVjYXVzZSB0aGUgRlQyCi0gICAgIFBGQiBwYXJzZXIgd2FudHMgdGhlIEFTQ0lJIGhlYWRlciBhcyBvbmUgY2h1bmssIGFuZCB0aGUgTFdGTgotICAgICBjaHVua3MgYXJlIG9mdGVuIG5vdCBvcmdhbml6ZWQgdGhhdCB3YXksIHNvIHdlIGdsdWUgY2h1bmtzCi0gICAgIG9mIHRoZSBzYW1lIHR5cGUgdG9nZXRoZXIuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICByZWFkX2x3Zm4oIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICBSZXNGaWxlUmVmTnVtICByZXMsCi0gICAgICAgICAgICAgRlRfQnl0ZSoqICAgICAgcGZiX2RhdGEsCi0gICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgc2l6ZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBSZXNJRCAgICAgICAgICByZXNfaWQ7Ci0gICAgdW5zaWduZWQgY2hhciAgKmJ1ZmZlciwgKnAsICpzaXplX3AgPSBOVUxMOwotICAgIEZUX1VMb25nICAgICAgIHRvdGFsX3NpemUgPSAwOwotICAgIEZUX1VMb25nICAgICAgIG9sZF90b3RhbF9zaXplID0gMDsKLSAgICBGVF9VTG9uZyAgICAgICBwb3N0X3NpemUsIHBmYl9jaHVua19zaXplOwotICAgIEhhbmRsZSAgICAgICAgIHBvc3RfZGF0YTsKLSAgICBjaGFyICAgICAgICAgICBjb2RlLCBsYXN0X2NvZGU7Ci0KLQotICAgIFVzZVJlc0ZpbGUoIHJlcyApOwotCi0gICAgLyogRmlyc3QgcGFzczogbG9hZCBhbGwgUE9TVCByZXNvdXJjZXMsIGFuZCBkZXRlcm1pbmUgdGhlIHNpemUgb2YgKi8KLSAgICAvKiB0aGUgb3V0cHV0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHJlc19pZCAgICA9IDUwMTsKLSAgICBsYXN0X2NvZGUgPSAtMTsKLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgcG9zdF9kYXRhID0gR2V0MVJlc291cmNlKCBUVEFHX1BPU1QsIHJlc19pZCsrICk7Ci0gICAgICBpZiAoICFwb3N0X2RhdGEgKQotICAgICAgICBicmVhazsgIC8qIHdlIGFyZSBkb25lICovCi0KLSAgICAgIGNvZGUgPSAoKnBvc3RfZGF0YSlbMF07Ci0KLSAgICAgIGlmICggY29kZSAhPSBsYXN0X2NvZGUgKQotICAgICAgewotICAgICAgICBpZiAoIGNvZGUgPT0gNSApCi0gICAgICAgICAgdG90YWxfc2l6ZSArPSAyOyAvKiBqdXN0IHRoZSBlbmQgY29kZSAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgdG90YWxfc2l6ZSArPSA2OyAvKiBjb2RlICsgNCBieXRlcyBjaHVuayBsZW5ndGggKi8KLSAgICAgIH0KLQotICAgICAgdG90YWxfc2l6ZSArPSAoRlRfVUxvbmcpR2V0SGFuZGxlU2l6ZSggcG9zdF9kYXRhICkgLSAyOwotICAgICAgbGFzdF9jb2RlID0gY29kZTsKLQotICAgICAgLyogZGV0ZWN0IHJlc291cmNlIGZvcmsgb3ZlcmZsb3cgKi8KLSAgICAgIGlmICggRlRfTUFDX1JGT1JLX01BWF9MRU4gPCB0b3RhbF9zaXplICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7Ci0gICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICB9Ci0KLSAgICAgIG9sZF90b3RhbF9zaXplID0gdG90YWxfc2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX0FMTE9DKCBidWZmZXIsIChGVF9Mb25nKXRvdGFsX3NpemUgKSApCi0gICAgICBnb3RvIEVycm9yOwotCi0gICAgLyogU2Vjb25kIHBhc3M6IGFwcGVuZCBhbGwgUE9TVCBkYXRhIHRvIHRoZSBidWZmZXIsIGFkZCBQRkIgZmllbGRzLiAqLwotICAgIC8qIEdsdWUgYWxsIGNvbnNlY3V0aXZlIGNodW5rcyBvZiB0aGUgc2FtZSB0eXBlIHRvZ2V0aGVyLiAgICAgICAgICAgKi8KLSAgICBwICAgICAgICAgICAgICA9IGJ1ZmZlcjsKLSAgICByZXNfaWQgICAgICAgICA9IDUwMTsKLSAgICBsYXN0X2NvZGUgICAgICA9IC0xOwotICAgIHBmYl9jaHVua19zaXplID0gMDsKLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgcG9zdF9kYXRhID0gR2V0MVJlc291cmNlKCBUVEFHX1BPU1QsIHJlc19pZCsrICk7Ci0gICAgICBpZiAoICFwb3N0X2RhdGEgKQotICAgICAgICBicmVhazsgIC8qIHdlIGFyZSBkb25lICovCi0KLSAgICAgIHBvc3Rfc2l6ZSA9IChGVF9VTG9uZylHZXRIYW5kbGVTaXplKCBwb3N0X2RhdGEgKSAtIDI7Ci0gICAgICBjb2RlID0gKCpwb3N0X2RhdGEpWzBdOwotCi0gICAgICBpZiAoIGNvZGUgIT0gbGFzdF9jb2RlICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBsYXN0X2NvZGUgIT0gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogd2UgYXJlIGRvbmUgYWRkaW5nIGEgY2h1bmssIGZpbGwgaW4gdGhlIHNpemUgZmllbGQgKi8KLSAgICAgICAgICBpZiAoIHNpemVfcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgKnNpemVfcCsrID0gKEZUX0J5dGUpKCAgIHBmYl9jaHVua19zaXplICAgICAgICAgJiAweEZGICk7Ci0gICAgICAgICAgICAqc2l6ZV9wKysgPSAoRlRfQnl0ZSkoICggcGZiX2NodW5rX3NpemUgPj4gOCAgKSAmIDB4RkYgKTsKLSAgICAgICAgICAgICpzaXplX3ArKyA9IChGVF9CeXRlKSggKCBwZmJfY2h1bmtfc2l6ZSA+PiAxNiApICYgMHhGRiApOwotICAgICAgICAgICAgKnNpemVfcCsrID0gKEZUX0J5dGUpKCAoIHBmYl9jaHVua19zaXplID4+IDI0ICkgJiAweEZGICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBmYl9jaHVua19zaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgICpwKysgPSAweDgwOwotICAgICAgICBpZiAoIGNvZGUgPT0gNSApCi0gICAgICAgICAgKnArKyA9IDB4MDM7ICAvKiB0aGUgZW5kICovCi0gICAgICAgIGVsc2UgaWYgKCBjb2RlID09IDIgKQotICAgICAgICAgICpwKysgPSAweDAyOyAgLyogYmluYXJ5IHNlZ21lbnQgKi8KLSAgICAgICAgZWxzZQotICAgICAgICAgICpwKysgPSAweDAxOyAgLyogQVNDSUkgc2VnbWVudCAqLwotCi0gICAgICAgIGlmICggY29kZSAhPSA1ICkKLSAgICAgICAgewotICAgICAgICAgIHNpemVfcCA9IHA7ICAgLyogc2F2ZSBmb3IgbGF0ZXIgKi8KLSAgICAgICAgICBwICs9IDQ7ICAgICAgIC8qIG1ha2Ugc3BhY2UgZm9yIHNpemUgZmllbGQgKi8KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmdF9tZW1jcHkoIHAsICpwb3N0X2RhdGEgKyAyLCBwb3N0X3NpemUgKTsKLSAgICAgIHBmYl9jaHVua19zaXplICs9IHBvc3Rfc2l6ZTsKLSAgICAgIHAgKz0gcG9zdF9zaXplOwotICAgICAgbGFzdF9jb2RlID0gY29kZTsKLSAgICB9Ci0KLSAgICAqcGZiX2RhdGEgPSBidWZmZXI7Ci0gICAgKnNpemUgPSB0b3RhbF9zaXplOwotCi0gIEVycm9yOgotICAgIENsb3NlUmVzRmlsZSggcmVzICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDcmVhdGUgYSBuZXcgRlRfRmFjZSBmcm9tIGEgZmlsZSBwYXRoIHRvIGFuIExXRk4gZmlsZS4gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEZUX05ld19GYWNlX0Zyb21fTFdGTiggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJbnQ4KiAgcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgICAgYWZhY2UgKQotICB7Ci0gICAgRlRfQnl0ZSogICAgICAgcGZiX2RhdGE7Ci0gICAgRlRfVUxvbmcgICAgICAgcGZiX3NpemU7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgUmVzRmlsZVJlZk51bSAgcmVzOwotCi0KLSAgICBpZiAoIG5vRXJyICE9IEZUX0ZTUGF0aE1ha2VSZXMoIHBhdGhuYW1lLCAmcmVzICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgcGZiX2RhdGEgPSBOVUxMOwotICAgIHBmYl9zaXplID0gMDsKLSAgICBlcnJvciA9IHJlYWRfbHdmbiggbGlicmFyeS0+bWVtb3J5LCByZXMsICZwZmJfZGF0YSwgJnBmYl9zaXplICk7Ci0gICAgQ2xvc2VSZXNGaWxlKCByZXMgKTsgLyogUEZCIGlzIGFscmVhZHkgbG9hZGVkLCB1c2VsZXNzIGFueW1vcmUgKi8KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHJldHVybiBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZiX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZiX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmYWNlICk7Ci0gIH0KLQotCi0gIC8qIENyZWF0ZSBhIG5ldyBGVF9GYWNlIGZyb20gYW4gU0ZOVCByZXNvdXJjZSwgc3BlY2lmaWVkIGJ5IHJlcyBJRC4gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEZUX05ld19GYWNlX0Zyb21fU0ZOVCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBSZXNJRCAgICAgICBzZm50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgYWZhY2UgKQotICB7Ci0gICAgSGFuZGxlICAgICBzZm50ID0gTlVMTDsKLSAgICBGVF9CeXRlKiAgIHNmbnRfZGF0YTsKLSAgICBzaXplX3QgICAgIHNmbnRfc2l6ZTsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBpbnQgICAgICAgIGlzX2NmZiwgaXNfc2ZudF9wczsKLQotCi0gICAgc2ZudCA9IEdldFJlc291cmNlKCBUVEFHX3NmbnQsIHNmbnRfaWQgKTsKLSAgICBpZiAoICFzZm50ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9IYW5kbGUgKTsKLQotICAgIHNmbnRfc2l6ZSA9IChGVF9VTG9uZylHZXRIYW5kbGVTaXplKCBzZm50ICk7Ci0KLSAgICAvKiBkZXRlY3QgcmVzb3VyY2UgZm9yayBvdmVyZmxvdyAqLwotICAgIGlmICggRlRfTUFDX1JGT1JLX01BWF9MRU4gPCBzZm50X3NpemUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBBcnJheV9Ub29fTGFyZ2UgKTsKLQotICAgIGlmICggRlRfQUxMT0MoIHNmbnRfZGF0YSwgKEZUX0xvbmcpc2ZudF9zaXplICkgKQotICAgIHsKLSAgICAgIFJlbGVhc2VSZXNvdXJjZSggc2ZudCApOwotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIGZ0X21lbWNweSggc2ZudF9kYXRhLCAqc2ZudCwgc2ZudF9zaXplICk7Ci0gICAgUmVsZWFzZVJlc291cmNlKCBzZm50ICk7Ci0KLSAgICBpc19jZmYgICAgID0gc2ZudF9zaXplID4gNCAmJiAhZnRfbWVtY21wKCBzZm50X2RhdGEsICJPVFRPIiwgNCApOwotICAgIGlzX3NmbnRfcHMgPSBzZm50X3NpemUgPiA0ICYmICFmdF9tZW1jbXAoIHNmbnRfZGF0YSwgInR5cDEiLCA0ICk7Ci0KLSAgICBpZiAoIGlzX3NmbnRfcHMgKQotICAgIHsKLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotCi0KLSAgICAgIGlmICggRlRfTkVXKCBzdHJlYW0gKSApCi0gICAgICAgIGdvdG8gVHJ5X09wZW5UeXBlOwotCi0gICAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggc3RyZWFtLCBzZm50X2RhdGEsIHNmbnRfc2l6ZSApOwotICAgICAgaWYgKCAhb3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW0oIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmFjZSApICkKLSAgICAgIHsKLSAgICAgICAgRlRfU3RyZWFtX0Nsb3NlKCBzdHJlYW0gKTsKLSAgICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgICAgIEZUX0ZSRUUoIHNmbnRfZGF0YSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSRUUoIHN0cmVhbSApOwotICAgIH0KLSAgVHJ5X09wZW5UeXBlOgotICAgIGVycm9yID0gb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY2ZmID8gImNmZiIgOiAidHJ1ZXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmFjZSApOwotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogQ3JlYXRlIGEgbmV3IEZUX0ZhY2UgZnJvbSBhIGZpbGUgcGF0aCB0byBhIHN1aXRjYXNlIGZpbGUuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBGVF9OZXdfRmFjZV9Gcm9tX1N1aXRjYXNlKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJbnQ4KiAgcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgICBhZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvciA9IEZUX0VSUiggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLSAgICBSZXNGaWxlUmVmTnVtICByZXNfcmVmOwotICAgIFJlc291cmNlSW5kZXggIHJlc19pbmRleDsKLSAgICBIYW5kbGUgICAgICAgICBmb25kOwotICAgIHNob3J0ICAgICAgICAgIG51bV9mYWNlc19pbl9yZXM7Ci0KLQotICAgIGlmICggbm9FcnIgIT0gRlRfRlNQYXRoTWFrZVJlcyggcGF0aG5hbWUsICZyZXNfcmVmICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgVXNlUmVzRmlsZSggcmVzX3JlZiApOwotICAgIGlmICggUmVzRXJyb3IoKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0KLSAgICBudW1fZmFjZXNfaW5fcmVzID0gMDsKLSAgICBmb3IgKCByZXNfaW5kZXggPSAxOyA7IHJlc19pbmRleCsrICkKLSAgICB7Ci0gICAgICBzaG9ydCAgbnVtX2ZhY2VzX2luX2ZvbmQ7Ci0KLQotICAgICAgZm9uZCA9IEdldDFJbmRSZXNvdXJjZSggVFRBR19GT05ELCByZXNfaW5kZXggKTsKLSAgICAgIGlmICggUmVzRXJyb3IoKSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBudW1fZmFjZXNfaW5fZm9uZCAgPSBjb3VudF9mYWNlcyggZm9uZCwgcGF0aG5hbWUgKTsKLSAgICAgIG51bV9mYWNlc19pbl9yZXMgICs9IG51bV9mYWNlc19pbl9mb25kOwotCi0gICAgICBpZiAoIDAgPD0gZmFjZV9pbmRleCAmJiBmYWNlX2luZGV4IDwgbnVtX2ZhY2VzX2luX2ZvbmQgJiYgZXJyb3IgKQotICAgICAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fRk9ORCggbGlicmFyeSwgZm9uZCwgZmFjZV9pbmRleCwgYWZhY2UgKTsKLQotICAgICAgZmFjZV9pbmRleCAtPSBudW1fZmFjZXNfaW5fZm9uZDsKLSAgICB9Ci0KLSAgICBDbG9zZVJlc0ZpbGUoIHJlc19yZWYgKTsKLSAgICBpZiAoICFlcnJvciAmJiBhZmFjZSAmJiAqYWZhY2UgKQotICAgICAgKCphZmFjZSktPm51bV9mYWNlcyA9IG51bV9mYWNlc19pbl9yZXM7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bWFjLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlX0Zyb21fRk9ORCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgICAgICBmb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgYWZhY2UgKQotICB7Ci0gICAgc2hvcnQgICAgIGhhdmVfc2ZudCwgaGF2ZV9sd2ZuID0gMDsKLSAgICBSZXNJRCAgICAgc2ZudF9pZCwgZm9uZF9pZDsKLSAgICBPU1R5cGUgICAgZm9uZF90eXBlOwotICAgIFN0cjI1NSAgICBmb25kX25hbWU7Ci0gICAgU3RyMjU1ICAgIGx3Zm5fZmlsZV9uYW1lOwotICAgIFVJbnQ4ICAgICBwYXRoX2x3Zm5bUEFUSF9NQVhdOwotICAgIE9TRXJyICAgICBlcnI7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICAvKiBjaGVjayBvZiBgbGlicmFyeScgYW5kIGBhZmFjZScgZGVsYXllZCB0byBgRlRfTmV3X0ZhY2VfRnJvbV9YWFgnICovCi0KLSAgICBHZXRSZXNJbmZvKCBmb25kLCAmZm9uZF9pZCwgJmZvbmRfdHlwZSwgZm9uZF9uYW1lICk7Ci0gICAgaWYgKCBSZXNFcnJvcigpICE9IG5vRXJyIHx8IGZvbmRfdHlwZSAhPSBUVEFHX0ZPTkQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBwYXJzZV9mb25kKCAqZm9uZCwgJmhhdmVfc2ZudCwgJnNmbnRfaWQsIGx3Zm5fZmlsZV9uYW1lLCBmYWNlX2luZGV4ICk7Ci0KLSAgICBpZiAoIGx3Zm5fZmlsZV9uYW1lWzBdICkKLSAgICB7Ci0gICAgICBSZXNGaWxlUmVmTnVtICByZXM7Ci0KLQotICAgICAgcmVzID0gSG9tZVJlc0ZpbGUoIGZvbmQgKTsKLSAgICAgIGlmICggbm9FcnIgIT0gUmVzRXJyb3IoKSApCi0gICAgICAgIGdvdG8gZm91bmRfbm9fbHdmbl9maWxlOwotCi0gICAgICB7Ci0gICAgICAgIFVJbnQ4ICBwYXRoX2ZvbmRbUEFUSF9NQVhdOwotICAgICAgICBGU1JlZiAgcmVmOwotCi0KLSAgICAgICAgZXJyID0gRlNHZXRGb3JrQ0JJbmZvKCByZXMsIGtGU0ludmFsaWRWb2x1bWVSZWZOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgJnJlZiwgTlVMTCApOwotICAgICAgICBpZiAoIG5vRXJyICE9IGVyciApCi0gICAgICAgICAgZ290byBmb3VuZF9ub19sd2ZuX2ZpbGU7Ci0KLSAgICAgICAgZXJyID0gRlNSZWZNYWtlUGF0aCggJnJlZiwgcGF0aF9mb25kLCBzaXplb2YgKCBwYXRoX2ZvbmQgKSApOwotICAgICAgICBpZiAoIG5vRXJyICE9IGVyciApCi0gICAgICAgICAgZ290byBmb3VuZF9ub19sd2ZuX2ZpbGU7Ci0KLSAgICAgICAgZXJyb3IgPSBsb29rdXBfbHdmbl9ieV9mb25kKCBwYXRoX2ZvbmQsIGx3Zm5fZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfbHdmbiwgc2l6ZW9mICggcGF0aF9sd2ZuICkgKTsKLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgIGhhdmVfbHdmbiA9IDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBoYXZlX2x3Zm4gJiYgKCAhaGF2ZV9zZm50IHx8IFBSRUZFUl9MV0ZOICkgKQotICAgICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX0xXRk4oIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9sd2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgZm91bmRfbm9fbHdmbl9maWxlOgotICAgIGlmICggaGF2ZV9zZm50ICYmIGVycm9yICkKLSAgICAgIGVycm9yID0gRlRfTmV3X0ZhY2VfRnJvbV9TRk5UKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmFjZSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDb21tb24gZnVuY3Rpb24gdG8gbG9hZCBhIG5ldyBGVF9GYWNlIGZyb20gYSByZXNvdXJjZSBmaWxlLiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgRlRfTmV3X0ZhY2VfRnJvbV9SZXNvdXJjZSggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgICAgYWZhY2UgKQotICB7Ci0gICAgT1NUeXBlICAgIGZpbGVfdHlwZTsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIC8qIExXRk4gaXMgYSAodmVyeSkgc3BlY2lmaWMgZmlsZSBmb3JtYXQsIGNoZWNrIGZvciBpdCBleHBsaWNpdGx5ICovCi0gICAgZmlsZV90eXBlID0gZ2V0X2ZpbGVfdHlwZV9mcm9tX3BhdGgoIHBhdGhuYW1lICk7Ci0gICAgaWYgKCBmaWxlX3R5cGUgPT0gVFRBR19MV0ZOICkKLSAgICAgIHJldHVybiBGVF9OZXdfRmFjZV9Gcm9tX0xXRk4oIGxpYnJhcnksIHBhdGhuYW1lLCBmYWNlX2luZGV4LCBhZmFjZSApOwotCi0gICAgLyogT3RoZXJ3aXNlIHRoZSBmaWxlIHR5cGUgZG9lc24ndCBtYXR0ZXIgKHRoZXJlIGFyZSBtb3JlIHRoYW4gICovCi0gICAgLyogYEZGSUwnIGFuZCBgdGZpbCcpLiAgSnVzdCB0cnkgb3BlbmluZyBpdCBhcyBhIGZvbnQgc3VpdGNhc2U7ICovCi0gICAgLyogaWYgaXQgd29ya3MsIGZpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fU3VpdGNhc2UoIGxpYnJhcnksIHBhdGhuYW1lLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIC8qIGxldCBpdCBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIGxvYWRlciAoLnR0ZiwgLm90ZiwgZXRjLik7ICovCi0gICAgICAvKiB3ZSBzaWduYWwgdGhpcyBieSByZXR1cm5pbmcgbm8gZXJyb3IgYW5kIG5vIEZUX0ZhY2UgICAgICAqLwotICAgICAgKmFmYWNlID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIHRoZSBNYWMtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgRlRfTmV3X0ZhY2UuICBJbiAgICAgICAgKi8KLSAgLyogICAgYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIEZUX05ld19GYWNlKCkgZnVuY3Rpb25hbGl0eSwgaXQgYWxzbyAgICAgICovCi0gIC8qICAgIGFjY2VwdHMgcGF0aG5hbWVzIHRvIE1hYyBzdWl0Y2FzZSBmaWxlcy4gIEZvciBmdXJ0aGVyICAgICAgICAgICAgICAqLwotICAvKiAgICBkb2N1bWVudGF0aW9uIHNlZSB0aGUgb3JpZ2luYWwgRlRfTmV3X0ZhY2UoKSBpbiBmcmVldHlwZS5oLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgYWZhY2UgKQotICB7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBhbmQgYGFmYWNlJyBkZWxheWVkIHRvIEZUX09wZW5fRmFjZSgpICovCi0gICAgaWYgKCAhcGF0aG5hbWUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAqYWZhY2UgPSBOVUxMOwotCi0gICAgLyogdHJ5IHJlc291cmNlZm9yayBiYXNlZCBmb250OiBMV0ZOLCBGRklMICovCi0gICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX1Jlc291cmNlKCBsaWJyYXJ5LCAoVUludDggKilwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0gICAgaWYgKCBlcnJvciB8fCAqYWZhY2UgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogbGV0IGl0IGZhbGwgdGhyb3VnaCB0byBub3JtYWwgbG9hZGVyICgudHRmLCAub3RmLCBldGMuKSAqLwotICAgIGFyZ3MuZmxhZ3MgICAgPSBGVF9PUEVOX1BBVEhOQU1FOwotICAgIGFyZ3MucGF0aG5hbWUgPSAoY2hhciopcGF0aG5hbWU7Ci0KLSAgICByZXR1cm4gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmYXJncywgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiBpcyBpZGVudGljYWwgdG8gRlRfTmV3X0ZhY2UgZXhjZXB0IGl0ICAgICAgICovCi0gIC8qICAgIGFjY2VwdHMgYW4gRlNSZWYgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGJlY2F1c2UgQ2FyYm9uIGRhdGEgdHlwZXMgKEZTUmVmKSAgICAgICAgICovCi0gIC8qIGFyZSBub3QgY3Jvc3MtcGxhdGZvcm0sIGFuZCB0aHVzIG5vdCBzdWl0YWJsZSBmb3IgdGhlIGZyZWV0eXBlIEFQSS4gICAqLwotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlX0Zyb21fRlNSZWYoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNSZWYqICByZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgICBhZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIEZUX09wZW5fQXJncyAgYXJnczsKLQotICAgIE9TRXJyICBlcnI7Ci0gICAgVUludDggIHBhdGhuYW1lW1BBVEhfTUFYXTsKLQotCi0gICAgLyogY2hlY2sgb2YgYGxpYnJhcnknIGFuZCBgYWZhY2UnIGRlbGF5ZWQgdG8gKi8KLSAgICAvKiBgRlRfTmV3X0ZhY2VfRnJvbV9SZXNvdXJjZScgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCAhcmVmICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyID0gRlNSZWZNYWtlUGF0aCggcmVmLCBwYXRobmFtZSwgc2l6ZW9mICggcGF0aG5hbWUgKSApOwotICAgIGlmICggZXJyICkKLSAgICAgIGVycm9yID0gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0KLSAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fUmVzb3VyY2UoIGxpYnJhcnksIHBhdGhuYW1lLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICAgIGlmICggZXJyb3IgfHwgKmFmYWNlICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIGZhbGxiYWNrIHRvIGRhdGFmb3JrIGZvbnQgKi8KLSAgICBhcmdzLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBhcmdzLnBhdGhuYW1lID0gKGNoYXIqKXBhdGhuYW1lOwotICAgIHJldHVybiBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyBpcyBpZGVudGljYWwgdG8gRlRfTmV3X0ZhY2UgZXhjZXB0IGl0ICAgICAgKi8KLSAgLyogICAgYWNjZXB0cyBhbiBGU1NwZWMgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBGU1NwZWMgaXMgZGVwcmVjYXRlZCBpbiBNYWMgT1MgWCAgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTU3BlYyogIHNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgICAgYWZhY2UgKQotICB7Ci0jaWYgKCBfX0xQNjRfXyApIHx8ICggZGVmaW5lZCggTUFDX09TX1hfVkVSU0lPTl8xMF81ICkgJiYgXAotICAgICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgKSApCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0gICAgRlRfVU5VU0VEKCBzcGVjICk7Ci0gICAgRlRfVU5VU0VEKCBmYWNlX2luZGV4ICk7Ci0gICAgRlRfVU5VU0VEKCBhZmFjZSApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSNlbHNlCi0gICAgRlNSZWYgIHJlZjsKLQotCi0gICAgLyogY2hlY2sgb2YgYGxpYnJhcnknIGFuZCBgYWZhY2UnIGRlbGF5ZWQgdG8gYEZUX05ld19GYWNlX0Zyb21fRlNSZWYnICovCi0KLSAgICBpZiAoICFzcGVjIHx8IEZTcE1ha2VGU1JlZiggc3BlYywgJnJlZiApICE9IG5vRXJyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmKCBsaWJyYXJ5LCAmcmVmLCBmYWNlX2luZGV4LCBhZmFjZSApOwotI2VuZGlmCi0gIH0KLQotI2Vsc2UgLyogIUZUX01BQ0lOVE9TSCAqLwotCi0gIC8qIEFOU0kgQyBkb2Vzbid0IGxpa2UgZW1wdHkgc291cmNlIGZpbGVzICovCi0gIHR5cGVkZWYgaW50ICBfZnRfbWFjX2R1bW15OwotCi0jZW5kaWYgLyogIUZUX01BQ0lOVE9TSCAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRtbS5jIGIvc3JjL2Jhc2UvZnRtbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2I1NmEzLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0bW0uYworKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1tLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTXVsdGlwbGUgTWFzdGVyIGZvbnQgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX21tCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfZmFjZV9nZXRfbW1fc2VydmljZSggRlRfRmFjZSAgICAgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgKmFzZXJ2aWNlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgKmFzZXJ2aWNlID0gTlVMTDsKLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggZmFjZSApICkKLSAgICB7Ci0gICAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVElfTUFTVEVSUyApOwotCi0gICAgICBpZiAoICphc2VydmljZSApCi0gICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2ZhY2VfZ2V0X212YXJfc2VydmljZSggRlRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9NZXRyaWNzVmFyaWF0aW9ucyAgKmFzZXJ2aWNlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgKmFzZXJ2aWNlID0gTlVMTDsKLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggZmFjZSApICkKLSAgICB7Ci0gICAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUUklDU19WQVJJQVRJT05TICk7Ci0KLSAgICAgIGlmICggKmFzZXJ2aWNlICkKLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW0uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X011bHRpX01hc3RlciggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsdGlfTWFzdGVyICAqYW1hc3RlciApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7Ci0KLQotICAgIC8qIGNoZWNrIG9mIGBmYWNlJyBkZWxheWVkIHRvIGBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlJyAqLwotCi0gICAgaWYgKCAhYW1hc3RlciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGVycm9yID0gZnRfZmFjZV9nZXRfbW1fc2VydmljZSggZmFjZSwgJnNlcnZpY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGlmICggc2VydmljZS0+Z2V0X21tICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfbW0oIGZhY2UsIGFtYXN0ZXIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtbS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfTU1fVmFyKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfTU1fVmFyKiAgKmFtYXN0ZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBzZXJ2aWNlOwotCi0KLSAgICAvKiBjaGVjayBvZiBgZmFjZScgZGVsYXllZCB0byBgZnRfZmFjZV9nZXRfbW1fc2VydmljZScgKi8KLQotICAgIGlmICggIWFtYXN0ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnJvciA9IGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBpZiAoIHNlcnZpY2UtPmdldF9tbV92YXIgKQotICAgICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9tbV92YXIoIGZhY2UsIGFtYXN0ZXIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtbS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBzZXJ2aWNlOwotCi0KLSAgICAvKiBjaGVjayBvZiBgZmFjZScgZGVsYXllZCB0byBgZnRfZmFjZV9nZXRfbW1fc2VydmljZScgKi8KLQotICAgIGlmICggIWNvb3JkcyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGVycm9yID0gZnRfZmFjZV9nZXRfbW1fc2VydmljZSggZmFjZSwgJnNlcnZpY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGlmICggc2VydmljZS0+c2V0X21tX2Rlc2lnbiApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+c2V0X21tX2Rlc2lnbiggZmFjZSwgbnVtX2Nvb3JkcywgY29vcmRzICk7Ci0gICAgfQotCi0gICAgLyogZW5mb3JjZSByZWNvbXB1dGF0aW9uIG9mIGF1dG8taGludGluZyBkYXRhICovCi0gICAgaWYgKCAhZXJyb3IgJiYgZmFjZS0+YXV0b2hpbnQuZmluYWxpemVyICkKLSAgICB7Ci0gICAgICBmYWNlLT5hdXRvaGludC5maW5hbGl6ZXIoIGZhY2UtPmF1dG9oaW50LmRhdGEgKTsKLSAgICAgIGZhY2UtPmF1dG9oaW50LmRhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgICAgICBzZXJ2aWNlX21tICAgPSBOVUxMOwotICAgIEZUX1NlcnZpY2VfTWV0cmljc1ZhcmlhdGlvbnMgIHNlcnZpY2VfbXZhciA9IE5VTEw7Ci0KLQotICAgIC8qIGNoZWNrIG9mIGBmYWNlJyBkZWxheWVkIHRvIGBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlJyAqLwotCi0gICAgaWYgKCAhY29vcmRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyb3IgPSBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZV9tbSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgaWYgKCBzZXJ2aWNlX21tLT5zZXRfdmFyX2Rlc2lnbiApCi0gICAgICAgIGVycm9yID0gc2VydmljZV9tbS0+c2V0X3Zhcl9kZXNpZ24oIGZhY2UsIG51bV9jb29yZHMsIGNvb3JkcyApOwotICAgIH0KLQotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICAodm9pZClmdF9mYWNlX2dldF9tdmFyX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlX212YXIgKTsKLQotICAgICAgaWYgKCBzZXJ2aWNlX212YXIgJiYgc2VydmljZV9tdmFyLT5tZXRyaWNzX2FkanVzdCApCi0gICAgICAgIHNlcnZpY2VfbXZhci0+bWV0cmljc19hZGp1c3QoIGZhY2UgKTsKLSAgICB9Ci0KLSAgICAvKiBlbmZvcmNlIHJlY29tcHV0YXRpb24gb2YgYXV0by1oaW50aW5nIGRhdGEgKi8KLSAgICBpZiAoICFlcnJvciAmJiBmYWNlLT5hdXRvaGludC5maW5hbGl6ZXIgKQotICAgIHsKLSAgICAgIGZhY2UtPmF1dG9oaW50LmZpbmFsaXplciggZmFjZS0+YXV0b2hpbnQuZGF0YSApOwotICAgICAgZmFjZS0+YXV0b2hpbnQuZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW0uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgc2VydmljZTsKLQotCi0gICAgLyogY2hlY2sgb2YgYGZhY2UnIGRlbGF5ZWQgdG8gYGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UnICovCi0KLSAgICBpZiAoICFjb29yZHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnJvciA9IGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBpZiAoIHNlcnZpY2UtPmdldF92YXJfZGVzaWduICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfdmFyX2Rlc2lnbiggZmFjZSwgbnVtX2Nvb3JkcywgY29vcmRzICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW0uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICAgICAgIHNlcnZpY2VfbW0gICA9IE5VTEw7Ci0gICAgRlRfU2VydmljZV9NZXRyaWNzVmFyaWF0aW9ucyAgc2VydmljZV9tdmFyID0gTlVMTDsKLQotCi0gICAgLyogY2hlY2sgb2YgYGZhY2UnIGRlbGF5ZWQgdG8gYGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UnICovCi0KLSAgICBpZiAoICFjb29yZHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnJvciA9IGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlX21tICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBpZiAoIHNlcnZpY2VfbW0tPnNldF9tbV9ibGVuZCApCi0gICAgICAgIGVycm9yID0gc2VydmljZV9tbS0+c2V0X21tX2JsZW5kKCBmYWNlLCBudW1fY29vcmRzLCBjb29yZHMgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgKHZvaWQpZnRfZmFjZV9nZXRfbXZhcl9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZV9tdmFyICk7Ci0KLSAgICAgIGlmICggc2VydmljZV9tdmFyICYmIHNlcnZpY2VfbXZhci0+bWV0cmljc19hZGp1c3QgKQotICAgICAgICBzZXJ2aWNlX212YXItPm1ldHJpY3NfYWRqdXN0KCBmYWNlICk7Ci0gICAgfQotCi0gICAgLyogZW5mb3JjZSByZWNvbXB1dGF0aW9uIG9mIGF1dG8taGludGluZyBkYXRhICovCi0gICAgaWYgKCAhZXJyb3IgJiYgZmFjZS0+YXV0b2hpbnQuZmluYWxpemVyICkKLSAgICB7Ci0gICAgICBmYWNlLT5hdXRvaGludC5maW5hbGl6ZXIoIGZhY2UtPmF1dG9oaW50LmRhdGEgKTsKLSAgICAgIGZhY2UtPmF1dG9oaW50LmRhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICAvKiBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLiAgSXQgZXhpc3RzIGZvciAqLwotICAvKiBvcnRob2dvbmFsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICAgICAgIHNlcnZpY2VfbW0gICA9IE5VTEw7Ci0gICAgRlRfU2VydmljZV9NZXRyaWNzVmFyaWF0aW9ucyAgc2VydmljZV9tdmFyID0gTlVMTDsKLQotCi0gICAgLyogY2hlY2sgb2YgYGZhY2UnIGRlbGF5ZWQgdG8gYGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UnICovCi0KLSAgICBpZiAoICFjb29yZHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnJvciA9IGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlX21tICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBpZiAoIHNlcnZpY2VfbW0tPnNldF9tbV9ibGVuZCApCi0gICAgICAgIGVycm9yID0gc2VydmljZV9tbS0+c2V0X21tX2JsZW5kKCBmYWNlLCBudW1fY29vcmRzLCBjb29yZHMgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgKHZvaWQpZnRfZmFjZV9nZXRfbXZhcl9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZV9tdmFyICk7Ci0KLSAgICAgIGlmICggc2VydmljZV9tdmFyICYmIHNlcnZpY2VfbXZhci0+bWV0cmljc19hZGp1c3QgKQotICAgICAgICBzZXJ2aWNlX212YXItPm1ldHJpY3NfYWRqdXN0KCBmYWNlICk7Ci0gICAgfQotCi0gICAgLyogZW5mb3JjZSByZWNvbXB1dGF0aW9uIG9mIGF1dG8taGludGluZyBkYXRhICovCi0gICAgaWYgKCAhZXJyb3IgJiYgZmFjZS0+YXV0b2hpbnQuZmluYWxpemVyICkKLSAgICB7Ci0gICAgICBmYWNlLT5hdXRvaGludC5maW5hbGl6ZXIoIGZhY2UtPmF1dG9oaW50LmRhdGEgKTsKLSAgICAgIGZhY2UtPmF1dG9oaW50LmRhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9NTV9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7Ci0KLQotICAgIC8qIGNoZWNrIG9mIGBmYWNlJyBkZWxheWVkIHRvIGBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlJyAqLwotCi0gICAgaWYgKCAhY29vcmRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyb3IgPSBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgaWYgKCBzZXJ2aWNlLT5nZXRfbW1fYmxlbmQgKQotICAgICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9tbV9ibGVuZCggZmFjZSwgbnVtX2Nvb3JkcywgY29vcmRzICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW0uaCAqLwotCi0gIC8qIFRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgZnVuY3Rpb24uICBJdCBleGlzdHMgZm9yICovCi0gIC8qIG9ydGhvZ29uYWxpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBzZXJ2aWNlOwotCi0KLSAgICAvKiBjaGVjayBvZiBgZmFjZScgZGVsYXllZCB0byBgZnRfZmFjZV9nZXRfbW1fc2VydmljZScgKi8KLQotICAgIGlmICggIWNvb3JkcyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGVycm9yID0gZnRfZmFjZV9nZXRfbW1fc2VydmljZSggZmFjZSwgJnNlcnZpY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGlmICggc2VydmljZS0+Z2V0X21tX2JsZW5kICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfbW1fYmxlbmQoIGZhY2UsIG51bV9jb29yZHMsIGNvb3JkcyApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRvYmpzLmMgYi9zcmMvYmFzZS9mdG9ianMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5MGRlMy4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdG9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDUyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGJhc2UgY2xhc3NlcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0xJU1RfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1JGT1JLX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0ggICAgLyogZm9yIFNGTlRfTG9hZF9UYWJsZV9GdW5jICovCi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9TRk5UX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RUX0NNQVBfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9LRVJOSU5HX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFJVRVRZUEVfRU5HSU5FX0gKLQotI2luY2x1ZGUgRlRfQVVUT0hJTlRFUl9ICi0jaW5jbHVkZSBGVF9DRkZfRFJJVkVSX0gKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCi0jaW5jbHVkZSAiZnRiYXNlLmgiCi0jZW5kaWYKLQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotI2luY2x1ZGUgRlRfQklUTUFQX0gKLQotI2lmIGRlZmluZWQoIF9NU0NfVkVSICkgICAgICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAgICovCi0gIC8qIFdlIGRpc2FibGUgdGhlIHdhcm5pbmcgYGNvbnZlcnNpb24gZnJvbSBYWFggdG8gWVlZLCAgICAgKi8KLSAgLyogcG9zc2libGUgbG9zcyBvZiBkYXRhJyBpbiBvcmRlciB0byBjb21waWxlIGNsZWFubHkgd2l0aCAqLwotICAvKiB0aGUgbWF4aW11bSBsZXZlbCBvZiB3YXJuaW5nczogYG1kNS5jJyBpcyBub24tRnJlZVR5cGUgICovCi0gIC8qIGNvZGUsIGFuZCBpdCBnZXRzIHVzZWQgZHVyaW5nIGRldmVsb3BtZW50IGJ1aWxkcyBvbmx5LiAgKi8KLSNwcmFnbWEgd2FybmluZyggcHVzaCApCi0jcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjQ0ICkKLSNlbmRpZiAvKiBfTVNDX1ZFUiAqLwotCi0gIC8qIEl0J3MgZWFzaWVzdCB0byBpbmNsdWRlIGBtZDUuYycgZGlyZWN0bHkuICBIb3dldmVyLCBzaW5jZSBPcGVuU1NMICovCi0gIC8qIGFsc28gcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25zLCB0aGVyZSBtaWdodCBiZSBjb25mbGljdHMgaWYgICAgICovCi0gIC8qIGJvdGggRnJlZVR5cGUgYW5kIE9wZW5TU0wgYXJlIGJ1aWx0IGFzIHN0YXRpYyBsaWJyYXJpZXMuICBGb3IgICAgICovCi0gIC8qIHRoaXMgcmVhc29uLCB3ZSBwdXQgdGhlIE1ENSBzdHVmZiBpbnRvIHRoZSBgRlRfJyBuYW1lc3BhY2UuICAgICAgICovCi0jZGVmaW5lIE1ENV91MzJwbHVzICBGVF9NRDVfdTMycGx1cwotI2RlZmluZSBNRDVfQ1RYICAgICAgRlRfTUQ1X0NUWAotI2RlZmluZSBNRDVfSW5pdCAgICAgRlRfTUQ1X0luaXQKLSNkZWZpbmUgTUQ1X1VwZGF0ZSAgIEZUX01ENV9VcGRhdGUKLSNkZWZpbmUgTUQ1X0ZpbmFsICAgIEZUX01ENV9GaW5hbAotCi0jdW5kZWYgIEhBVkVfT1BFTlNTTAotCi0jaW5jbHVkZSAibWQ1LmMiCi0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApCi0jcHJhZ21hIHdhcm5pbmcoIHBvcCApCi0jZW5kaWYKLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotI2RlZmluZSBHUklEX0ZJVF9NRVRSSUNTCi0KLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9vcGVuX2ZhY2VfaW50ZXJuYWwoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3Blbl9BcmdzKiAgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgKmFmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgIHRlc3RfbWFjX2ZvbnRzICk7Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfUG9pbnRlciApCi0gIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIEZUX1NlcnZpY2VEZXNjICBzZXJ2aWNlX2Rlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgc2VydmljZV9pZCApCi0gIHsKLSAgICBGVF9Qb2ludGVyICAgICAgcmVzdWx0ID0gTlVMTDsKLSAgICBGVF9TZXJ2aWNlRGVzYyAgZGVzYyAgID0gc2VydmljZV9kZXNjcmlwdG9yczsKLQotCi0gICAgaWYgKCBkZXNjICYmIHNlcnZpY2VfaWQgKQotICAgIHsKLSAgICAgIGZvciAoIDsgZGVzYy0+c2Vydl9pZCAhPSBOVUxMOyBkZXNjKysgKQotICAgICAgewotICAgICAgICBpZiAoIGZ0X3N0cmNtcCggZGVzYy0+c2Vydl9pZCwgc2VydmljZV9pZCApID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gKEZUX1BvaW50ZXIpZGVzYy0+c2Vydl9kYXRhOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF92YWxpZGF0b3JfaW5pdCggRlRfVmFsaWRhdG9yICAgICAgICB2YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0aW9uTGV2ZWwgIGxldmVsICkKLSAgewotICAgIHZhbGlkLT5iYXNlICA9IGJhc2U7Ci0gICAgdmFsaWQtPmxpbWl0ID0gbGltaXQ7Ci0gICAgdmFsaWQtPmxldmVsID0gbGV2ZWw7Ci0gICAgdmFsaWQtPmVycm9yID0gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfSW50ICkKLSAgZnRfdmFsaWRhdG9yX3J1biggRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICAvKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3Qgd29yayEgIE5vbmUgc2hvdWxkIGNhbGwgaXQuICovCi0gICAgRlRfVU5VU0VEKCB2YWxpZCApOwotCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X3ZhbGlkYXRvcl9lcnJvciggRlRfVmFsaWRhdG9yICB2YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciAgICAgIGVycm9yICkKLSAgewotICAgIC8qIHNpbmNlIHRoZSBjYXN0IGJlbG93IGFsc28gZGlzYWJsZXMgdGhlIGNvbXBpbGVyJ3MgKi8KLSAgICAvKiB0eXBlIGNoZWNrLCB3ZSBpbnRyb2R1Y2UgYSBkdW1teSB2YXJpYWJsZSwgd2hpY2ggICovCi0gICAgLyogd2lsbCBiZSBvcHRpbWl6ZWQgYXdheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHZvbGF0aWxlIGZ0X2ptcF9idWYqIGp1bXBfYnVmZmVyID0gJnZhbGlkLT5qdW1wX2J1ZmZlcjsKLQotCi0gICAgdmFsaWQtPmVycm9yID0gZXJyb3I7Ci0KLSAgICAvKiB0aHJvdyBhd2F5IHZvbGF0aWxlbmVzczsgdXNlIGBqdW1wX2J1ZmZlcicgb3IgdGhlICAqLwotICAgIC8qIGNvbXBpbGVyIG1heSB3YXJuIGFib3V0IGFuIHVudXNlZCBsb2NhbCB2YXJpYWJsZSAgICovCi0gICAgZnRfbG9uZ2ptcCggKihmdF9qbXBfYnVmKikganVtcF9idWZmZXIsIDEgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgVCBSIEUgQSBNICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogY3JlYXRlIGEgbmV3IGlucHV0IHN0cmVhbSBmcm9tIGFuIEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX05ldyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3Blbl9BcmdzKiAgYXJncywKLSAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAqYXN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gTlVMTDsKLQotCi0gICAgKmFzdHJlYW0gPSBOVUxMOwotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFyZ3MgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBpZiAoIEZUX05FVyggc3RyZWFtICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc3RyZWFtLT5tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgICBpZiAoIGFyZ3MtPmZsYWdzICYgRlRfT1BFTl9NRU1PUlkgKQotICAgIHsKLSAgICAgIC8qIGNyZWF0ZSBhIG1lbW9yeS1iYXNlZCBzdHJlYW0gKi8KLSAgICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZUX0J5dGUqKWFyZ3MtPm1lbW9yeV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZylhcmdzLT5tZW1vcnlfc2l6ZSApOwotICAgIH0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX0RJU0FCTEVfU1RSRUFNX1NVUFBPUlQKLQotICAgIGVsc2UgaWYgKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fUEFUSE5BTUUgKQotICAgIHsKLSAgICAgIC8qIGNyZWF0ZSBhIG5vcm1hbCBzeXN0ZW0gc3RyZWFtICovCi0gICAgICBlcnJvciA9IEZUX1N0cmVhbV9PcGVuKCBzdHJlYW0sIGFyZ3MtPnBhdGhuYW1lICk7Ci0gICAgICBzdHJlYW0tPnBhdGhuYW1lLnBvaW50ZXIgPSBhcmdzLT5wYXRobmFtZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1NUUkVBTSApICYmIGFyZ3MtPnN0cmVhbSApCi0gICAgewotICAgICAgLyogdXNlIGFuIGV4aXN0aW5nLCB1c2VyLXByb3ZpZGVkIHN0cmVhbSAqLwotCi0gICAgICAvKiBpbiB0aGlzIGNhc2UsIHdlIGRvIG5vdCBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHN0cmVhbSBvYmplY3QgKi8KLSAgICAgIC8qIHNpbmNlIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQgaGltc2VsZiAgICAgICAqLwotICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgICBzdHJlYW0gPSBhcmdzLT5zdHJlYW07Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgZWxzZQotICAgICAgc3RyZWFtLT5tZW1vcnkgPSBtZW1vcnk7ICAvKiBqdXN0IHRvIGJlIGNlcnRhaW4gKi8KLQotICAgICphc3RyZWFtID0gc3RyZWFtOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1N0cmVhbV9GcmVlKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZXh0ZXJuYWwgKQotICB7Ci0gICAgaWYgKCBzdHJlYW0gKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgICAgRlRfU3RyZWFtX0Nsb3NlKCBzdHJlYW0gKTsKLQotICAgICAgaWYgKCAhZXh0ZXJuYWwgKQotICAgICAgICBGVF9GUkVFKCBzdHJlYW0gKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX29ianMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICBGQUNFLCBTSVpFICYgR0xZUEggU0xPVCBPQkpFQ1RTICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9nbHlwaHNsb3RfaW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIEZUX0RyaXZlciAgICAgICAgIGRyaXZlciAgID0gc2xvdC0+ZmFjZS0+ZHJpdmVyOwotICAgIEZUX0RyaXZlcl9DbGFzcyAgIGNsYXp6ICAgID0gZHJpdmVyLT5jbGF6ejsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnkgICA9IGRyaXZlci0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3IgICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfU2xvdF9JbnRlcm5hbCAgaW50ZXJuYWwgPSBOVUxMOwotCi0KLSAgICBzbG90LT5saWJyYXJ5ID0gZHJpdmVyLT5yb290LmxpYnJhcnk7Ci0KLSAgICBpZiAoIEZUX05FVyggaW50ZXJuYWwgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzbG90LT5pbnRlcm5hbCA9IGludGVybmFsOwotCi0gICAgaWYgKCBGVF9EUklWRVJfVVNFU19PVVRMSU5FUyggZHJpdmVyICkgKQotICAgICAgZXJyb3IgPSBGVF9HbHlwaExvYWRlcl9OZXcoIG1lbW9yeSwgJmludGVybmFsLT5sb2FkZXIgKTsKLQotICAgIGlmICggIWVycm9yICYmIGNsYXp6LT5pbml0X3Nsb3QgKQotICAgICAgZXJyb3IgPSBjbGF6ei0+aW5pdF9zbG90KCBzbG90ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgaWYgKCBzbG90LT5pbnRlcm5hbCAmJiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKSApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggc2xvdC0+ZmFjZSApOwotCi0KLSAgICAgIEZUX0ZSRUUoIHNsb3QtPmJpdG1hcC5idWZmZXIgKTsKLSAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyAmPSB+RlRfR0xZUEhfT1dOX0JJVE1BUDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGFzc3VtZSB0aGF0IHRoZSBiaXRtYXAgYnVmZmVyIHdhcyBzdG9sZW4gb3Igbm90ICovCi0gICAgICAvKiBhbGxvY2F0ZWQgZnJvbSB0aGUgaGVhcCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgc2xvdC0+Yml0bWFwLmJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X2dseXBoc2xvdF9zZXRfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgIGJ1ZmZlciApCi0gIHsKLSAgICBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAoIHNsb3QgKTsKLQotICAgIHNsb3QtPmJpdG1hcC5idWZmZXIgPSBidWZmZXI7Ci0KLSAgICBGVF9BU1NFUlQoIChzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJiBGVF9HTFlQSF9PV05fQklUTUFQKSA9PSAwICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBzaXplICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIHNsb3QtPmZhY2UgKTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotCi0KLSAgICBpZiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKQotICAgICAgRlRfRlJFRSggc2xvdC0+Yml0bWFwLmJ1ZmZlciApOwotICAgIGVsc2UKLSAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyB8PSBGVF9HTFlQSF9PV05fQklUTUFQOwotCi0gICAgKHZvaWQpRlRfQUxMT0MoIHNsb3QtPmJpdG1hcC5idWZmZXIsIHNpemUgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2dseXBoc2xvdF9jbGVhciggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIC8qIGZyZWUgYml0bWFwIGlmIG5lZWRlZCAqLwotICAgIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCggc2xvdCApOwotCi0gICAgLyogY2xlYXIgYWxsIHB1YmxpYyBmaWVsZHMgaW4gdGhlIGdseXBoIHNsb3QgKi8KLSAgICBGVF9aRVJPKCAmc2xvdC0+bWV0cmljcyApOwotICAgIEZUX1pFUk8oICZzbG90LT5vdXRsaW5lICk7Ci0KLSAgICBzbG90LT5iaXRtYXAud2lkdGggICAgICA9IDA7Ci0gICAgc2xvdC0+Yml0bWFwLnJvd3MgICAgICAgPSAwOwotICAgIHNsb3QtPmJpdG1hcC5waXRjaCAgICAgID0gMDsKLSAgICBzbG90LT5iaXRtYXAucGl4ZWxfbW9kZSA9IDA7Ci0gICAgLyogYHNsb3QtPmJpdG1hcC5idWZmZXInIGhhcyBiZWVuIGhhbmRsZWQgYnkgZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwICovCi0KLSAgICBzbG90LT5iaXRtYXBfbGVmdCAgID0gMDsKLSAgICBzbG90LT5iaXRtYXBfdG9wICAgID0gMDsKLSAgICBzbG90LT5udW1fc3ViZ2x5cGhzID0gMDsKLSAgICBzbG90LT5zdWJnbHlwaHMgICAgID0gTlVMTDsKLSAgICBzbG90LT5jb250cm9sX2RhdGEgID0gTlVMTDsKLSAgICBzbG90LT5jb250cm9sX2xlbiAgID0gMDsKLSAgICBzbG90LT5vdGhlciAgICAgICAgID0gTlVMTDsKLSAgICBzbG90LT5mb3JtYXQgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX05PTkU7Ci0KLSAgICBzbG90LT5saW5lYXJIb3JpQWR2YW5jZSA9IDA7Ci0gICAgc2xvdC0+bGluZWFyVmVydEFkdmFuY2UgPSAwOwotICAgIHNsb3QtPmxzYl9kZWx0YSAgICAgICAgID0gMDsKLSAgICBzbG90LT5yc2JfZGVsdGEgICAgICAgICA9IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2dseXBoc2xvdF9kb25lKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfRHJpdmVyICAgICAgICBkcml2ZXIgPSBzbG90LT5mYWNlLT5kcml2ZXI7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6eiAgPSBkcml2ZXItPmNsYXp6OwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLQotCi0gICAgaWYgKCBjbGF6ei0+ZG9uZV9zbG90ICkKLSAgICAgIGNsYXp6LT5kb25lX3Nsb3QoIHNsb3QgKTsKLQotICAgIC8qIGZyZWUgYml0bWFwIGJ1ZmZlciBpZiBuZWVkZWQgKi8KLSAgICBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAoIHNsb3QgKTsKLQotICAgIC8qIHNsb3QtPmludGVybmFsIG1pZ2h0IGJlIE5VTEwgaW4gb3V0LW9mLW1lbW9yeSBzaXR1YXRpb25zICovCi0gICAgaWYgKCBzbG90LT5pbnRlcm5hbCApCi0gICAgewotICAgICAgLyogZnJlZSBnbHlwaCBsb2FkZXIgKi8KLSAgICAgIGlmICggRlRfRFJJVkVSX1VTRVNfT1VUTElORVMoIGRyaXZlciApICkKLSAgICAgIHsKLSAgICAgICAgRlRfR2x5cGhMb2FkZXJfRG9uZSggc2xvdC0+aW50ZXJuYWwtPmxvYWRlciApOwotICAgICAgICBzbG90LT5pbnRlcm5hbC0+bG9hZGVyID0gTlVMTDsKLSAgICAgIH0KLQotICAgICAgRlRfRlJFRSggc2xvdC0+aW50ZXJuYWwgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfR2x5cGhTbG90KCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICphc2xvdCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIEZUX0RyaXZlciAgICAgICAgZHJpdmVyOwotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7Ci0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnk7Ci0gICAgRlRfR2x5cGhTbG90ICAgICBzbG90ID0gTlVMTDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIWZhY2UtPmRyaXZlciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGRyaXZlciA9IGZhY2UtPmRyaXZlcjsKLSAgICBjbGF6eiAgPSBkcml2ZXItPmNsYXp6OwotICAgIG1lbW9yeSA9IGRyaXZlci0+cm9vdC5tZW1vcnk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiRlRfTmV3X0dseXBoU2xvdDogQ3JlYXRpbmcgbmV3IHNsb3Qgb2JqZWN0XG4iICkpOwotICAgIGlmICggIUZUX0FMTE9DKCBzbG90LCBjbGF6ei0+c2xvdF9vYmplY3Rfc2l6ZSApICkKLSAgICB7Ci0gICAgICBzbG90LT5mYWNlID0gZmFjZTsKLQotICAgICAgZXJyb3IgPSBmdF9nbHlwaHNsb3RfaW5pdCggc2xvdCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGZ0X2dseXBoc2xvdF9kb25lKCBzbG90ICk7Ci0gICAgICAgIEZUX0ZSRUUoIHNsb3QgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBzbG90LT5uZXh0ICA9IGZhY2UtPmdseXBoOwotICAgICAgZmFjZS0+Z2x5cGggPSBzbG90OwotCi0gICAgICBpZiAoIGFzbG90ICkKLSAgICAgICAgKmFzbG90ID0gc2xvdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGFzbG90ICkKLSAgICAgICphc2xvdCA9IE5VTEw7Ci0KLQotICBFeGl0OgotICAgIEZUX1RSQUNFNCgoICJGVF9OZXdfR2x5cGhTbG90OiBSZXR1cm4gMHgleFxuIiwgZXJyb3IgKSk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0RvbmVfR2x5cGhTbG90KCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgaWYgKCBzbG90ICkKLSAgICB7Ci0gICAgICBGVF9Ecml2ZXIgICAgIGRyaXZlciA9IHNsb3QtPmZhY2UtPmRyaXZlcjsKLSAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLSAgICAgIEZUX0dseXBoU2xvdCAgcHJldjsKLSAgICAgIEZUX0dseXBoU2xvdCAgY3VyOwotCi0KLSAgICAgIC8qIFJlbW92ZSBzbG90IGZyb20gaXRzIHBhcmVudCBmYWNlJ3MgbGlzdCAqLwotICAgICAgcHJldiA9IE5VTEw7Ci0gICAgICBjdXIgID0gc2xvdC0+ZmFjZS0+Z2x5cGg7Ci0KLSAgICAgIHdoaWxlICggY3VyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjdXIgPT0gc2xvdCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICFwcmV2ICkKLSAgICAgICAgICAgIHNsb3QtPmZhY2UtPmdseXBoID0gY3VyLT5uZXh0OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZXYtPm5leHQgPSBjdXItPm5leHQ7Ci0KLSAgICAgICAgICAvKiBmaW5hbGl6ZSBjbGllbnQtc3BlY2lmaWMgZGF0YSAqLwotICAgICAgICAgIGlmICggc2xvdC0+Z2VuZXJpYy5maW5hbGl6ZXIgKQotICAgICAgICAgICAgc2xvdC0+Z2VuZXJpYy5maW5hbGl6ZXIoIHNsb3QgKTsKLQotICAgICAgICAgIGZ0X2dseXBoc2xvdF9kb25lKCBzbG90ICk7Ci0gICAgICAgICAgRlRfRlJFRSggc2xvdCApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHByZXYgPSBjdXI7Ci0gICAgICAgIGN1ciAgPSBjdXItPm5leHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfU2V0X1RyYW5zZm9ybSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBkZWx0YSApCi0gIHsKLSAgICBGVF9GYWNlX0ludGVybmFsICBpbnRlcm5hbDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBpbnRlcm5hbCA9IGZhY2UtPmludGVybmFsOwotCi0gICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyA9IDA7Ci0KLSAgICBpZiAoICFtYXRyaXggKQotICAgIHsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnh4ID0gMHgxMDAwMEw7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC54eSA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC55eCA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC55eSA9IDB4MTAwMDBMOwotCi0gICAgICBtYXRyaXggPSAmaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXg7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4ID0gKm1hdHJpeDsKLQotICAgIC8qIHNldCB0cmFuc2Zvcm1fZmxhZ3MgYml0IGZsYWcgMCBpZiBgbWF0cml4JyBpc24ndCB0aGUgaWRlbnRpdHkgKi8KLSAgICBpZiAoICggbWF0cml4LT54eSB8IG1hdHJpeC0+eXggKSB8fAotICAgICAgICAgbWF0cml4LT54eCAhPSAweDEwMDAwTCAgICAgIHx8Ci0gICAgICAgICBtYXRyaXgtPnl5ICE9IDB4MTAwMDBMICAgICAgKQotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyB8PSAxOwotCi0gICAgaWYgKCAhZGVsdGEgKQotICAgIHsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEueCA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhLnkgPSAwOwotCi0gICAgICBkZWx0YSA9ICZpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhID0gKmRlbHRhOwotCi0gICAgLyogc2V0IHRyYW5zZm9ybV9mbGFncyBiaXQgZmxhZyAxIGlmIGBkZWx0YScgaXNuJ3QgdGhlIG51bGwgdmVjdG9yICovCi0gICAgaWYgKCBkZWx0YS0+eCB8IGRlbHRhLT55ICkKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZmxhZ3MgfD0gMjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1JlbmRlcmVyCi0gIGZ0X2xvb2t1cF9nbHlwaF9yZW5kZXJlciggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotI2lmZGVmIEdSSURfRklUX01FVFJJQ1MKLSAgc3RhdGljIHZvaWQKLSAgZnRfZ2x5cGhzbG90X2dyaWRfZml0X21ldHJpY3MoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgdmVydGljYWwgKQotICB7Ci0gICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgPSAmc2xvdC0+bWV0cmljczsKLSAgICBGVF9Qb3MgICAgICAgICAgICAgcmlnaHQsIGJvdHRvbTsKLQotCi0gICAgaWYgKCB2ZXJ0aWNhbCApCi0gICAgewotICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IEZUX1BJWF9DRUlMICggbWV0cmljcy0+aG9yaUJlYXJpbmdZICk7Ci0KLSAgICAgIHJpZ2h0ICA9IEZUX1BJWF9DRUlMKCBBRERfTE9ORyggbWV0cmljcy0+dmVydEJlYXJpbmdYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT53aWR0aCApICk7Ci0gICAgICBib3R0b20gPSBGVF9QSVhfQ0VJTCggQUREX0xPTkcoIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+aGVpZ2h0ICkgKTsKLQotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IEZUX1BJWF9GTE9PUiggbWV0cmljcy0+dmVydEJlYXJpbmdZICk7Ci0KLSAgICAgIG1ldHJpY3MtPndpZHRoICA9IFNVQl9MT05HKCByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPmhlaWdodCA9IFNVQl9MT05HKCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdZICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSBGVF9QSVhfRkxPT1IoIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCApOwotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdZID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgKTsKLQotICAgICAgcmlnaHQgID0gRlRfUElYX0NFSUwgKCBBRERfTE9ORyggbWV0cmljcy0+aG9yaUJlYXJpbmdYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+d2lkdGggKSApOwotICAgICAgYm90dG9tID0gRlRfUElYX0ZMT09SKCBTVUJfTE9ORyggbWV0cmljcy0+aG9yaUJlYXJpbmdZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+aGVpZ2h0ICkgKTsKLQotICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IEZUX1BJWF9DRUlMICggbWV0cmljcy0+aG9yaUJlYXJpbmdZICk7Ci0KLSAgICAgIG1ldHJpY3MtPndpZHRoICA9IFNVQl9MT05HKCByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPmhlaWdodCA9IFNVQl9MT05HKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tICk7Ci0gICAgfQotCi0gICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBGVF9QSVhfUk9VTkQoIG1ldHJpY3MtPmhvcmlBZHZhbmNlICk7Ci0gICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSBGVF9QSVhfUk9VTkQoIG1ldHJpY3MtPnZlcnRBZHZhbmNlICk7Ci0gIH0KLSNlbmRpZiAvKiBHUklEX0ZJVF9NRVRSSUNTICovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xvYWRfR2x5cGgoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICBsb2FkX2ZsYWdzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfRHJpdmVyICAgICBkcml2ZXI7Ci0gICAgRlRfR2x5cGhTbG90ICBzbG90OwotICAgIEZUX0xpYnJhcnkgICAgbGlicmFyeTsKLSAgICBGVF9Cb29sICAgICAgIGF1dG9oaW50ID0gRkFMU0U7Ci0gICAgRlRfTW9kdWxlICAgICBoaW50ZXI7Ci0gICAgVFRfRmFjZSAgICAgICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOwotCi0KLSAgICBpZiAoICFmYWNlIHx8ICFmYWNlLT5zaXplIHx8ICFmYWNlLT5nbHlwaCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIC8qIFRoZSB2YWxpZGl0eSB0ZXN0IGZvciBgZ2x5cGhfaW5kZXgnIGlzIHBlcmZvcm1lZCBieSB0aGUgKi8KLSAgICAvKiBmb250IGRyaXZlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBzbG90ID0gZmFjZS0+Z2x5cGg7Ci0gICAgZnRfZ2x5cGhzbG90X2NsZWFyKCBzbG90ICk7Ci0KLSAgICBkcml2ZXIgID0gZmFjZS0+ZHJpdmVyOwotICAgIGxpYnJhcnkgPSBkcml2ZXItPnJvb3QubGlicmFyeTsKLSAgICBoaW50ZXIgID0gbGlicmFyeS0+YXV0b19oaW50ZXI7Ci0KLSAgICAvKiByZXNvbHZlIGxvYWQgZmxhZ3MgZGVwZW5kZW5jaWVzICovCi0KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKQotICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk07Ci0KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkKLSAgICB7Ci0gICAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fSElOVElORyB8Ci0gICAgICAgICAgICAgICAgICAgIEZUX0xPQURfTk9fQklUTUFQOwotCi0gICAgICBsb2FkX2ZsYWdzICY9IH5GVF9MT0FEX1JFTkRFUjsKLSAgICB9Ci0KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX0JJVE1BUF9NRVRSSUNTX09OTFkgKQotICAgICAgbG9hZF9mbGFncyAmPSB+RlRfTE9BRF9SRU5ERVI7Ci0KLSAgICAvKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gYXV0by1oaW50IG9yIG5vdC4KLSAgICAgKiBUaGUgZ2VuZXJhbCBydWxlcyBhcmU6Ci0gICAgICoKLSAgICAgKiAtIERvIG9ubHkgYXV0by1oaW50aW5nIGlmIHdlIGhhdmUgYSBoaW50ZXIgbW9kdWxlLCBhIHNjYWxhYmxlIGZvbnQKLSAgICAgKiAgIGZvcm1hdCBkZWFsaW5nIHdpdGggb3V0bGluZXMsIGFuZCBubyB0cmFuc2Zvcm1zIGV4Y2VwdCBzaW1wbGUKLSAgICAgKiAgIHNsYW50cyBhbmQvb3Igcm90YXRpb25zIGJ5IGludGVnZXIgbXVsdGlwbGVzIG9mIDkwIGRlZ3JlZXMuCi0gICAgICoKLSAgICAgKiAtIFRoZW4sIGF1dG8taGludCBpZiBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UIGlzIHNldCBvciBpZiB3ZSBkb24ndAotICAgICAqICAgaGF2ZSBhIG5hdGl2ZSBmb250IGhpbnRlci4KLSAgICAgKgotICAgICAqIC0gT3RoZXJ3aXNlLCBhdXRvLWhpbnQgZm9yIExJR0hUIGhpbnRpbmcgbW9kZSBvciBpZiB0aGVyZSBpc24ndAotICAgICAqICAgYW55IGhpbnRpbmcgYnl0ZWNvZGUgaW4gdGhlIFRydWVUeXBlL09wZW5UeXBlIGZvbnQuCi0gICAgICoKLSAgICAgKiAtIEV4Y2VwdGlvbjogVGhlIGZvbnQgaXMgYHRyaWNreScgYW5kIHJlcXVpcmVzIHRoZSBuYXRpdmUgaGludGVyIHRvCi0gICAgICogICBsb2FkIHByb3Blcmx5LgotICAgICAqLwotCi0gICAgaWYgKCBoaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICEoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0hJTlRJTkcgKSAgICAgICAgICAgICAmJgotICAgICAgICAgISggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fQVVUT0hJTlQgKSAgICAgICAgICAgICYmCi0gICAgICAgICBGVF9EUklWRVJfSVNfU0NBTEFCTEUoIGRyaXZlciApICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIEZUX0RSSVZFUl9VU0VTX09VVExJTkVTKCBkcml2ZXIgKSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgIUZUX0lTX1RSSUNLWSggZmFjZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSApICAgIHx8Ci0gICAgICAgICAgICggZmFjZS0+aW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueXggPT0gMCAmJgotICAgICAgICAgICAgIGZhY2UtPmludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnh4ICE9IDAgKSB8fAotICAgICAgICAgICAoIGZhY2UtPmludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnh4ID09IDAgJiYKLSAgICAgICAgICAgICBmYWNlLT5pbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC55eCAhPSAwICkgKSApCi0gICAgewotICAgICAgaWYgKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UICkgfHwKLSAgICAgICAgICAgIUZUX0RSSVZFUl9IQVNfSElOVEVSKCBkcml2ZXIgKSAgICAgICAgICkKLSAgICAgICAgYXV0b2hpbnQgPSBUUlVFOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZSA9IEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKTsKLQotCi0gICAgICAgIC8qIHRoZSBjaGVjayBmb3IgYG51bV9sb2NhdGlvbnMnIGFzc3VyZXMgdGhhdCB3ZSBhY3R1YWxseSAgICAqLwotICAgICAgICAvKiB0ZXN0IGZvciBpbnN0cnVjdGlvbnMgaW4gYSBUVEYgYW5kIG5vdCBpbiBhIENGRi1iYXNlZCBPVEYgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIHNpbmNlIGBtYXhTaXplT2ZJbnN0cnVjdGlvbnMnIG1pZ2h0IGJlIHVucmVsaWFibGUsIHdlICAgICAqLwotICAgICAgICAvKiBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgYGZwZ20nIGFuZCBgcHJlcCcgdGFibGVzLCB0b28gLS0gICAgKi8KLSAgICAgICAgLyogdGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGVyZSBkb24ndCBleGlzdCByZWFsIFRURnMgd2hlcmUgICovCi0gICAgICAgIC8qIGJvdGggYGZwZ20nIGFuZCBgcHJlcCcgdGFibGVzIGFyZSBtaXNzaW5nICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCAgICAgICAmJgotICAgICAgICAgICAgICAgIUZUX0RSSVZFUl9ISU5UU19MSUdIVExZKCBkcml2ZXIgKSApICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgKCBGVF9JU19TRk5UKCBmYWNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICB0dGZhY2UtPm51bV9sb2NhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICB0dGZhY2UtPm1heF9wcm9maWxlLm1heFNpemVPZkluc3RydWN0aW9ucyA9PSAwICYmCi0gICAgICAgICAgICAgICB0dGZhY2UtPmZvbnRfcHJvZ3JhbV9zaXplID09IDAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICB0dGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgPT0gMCAgICAgICAgICAgICAgICAgICkgKQotICAgICAgICAgIGF1dG9oaW50ID0gVFJVRTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGF1dG9oaW50ICkKLSAgICB7Ci0gICAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZSAgaGludGluZzsKLQotCi0gICAgICAvKiB0cnkgdG8gbG9hZCBlbWJlZGRlZCBiaXRtYXBzIGZpcnN0IGlmIGF2YWlsYWJsZSAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBYWFg6IFRoaXMgaXMgcmVhbGx5IGEgdGVtcG9yYXJ5IGhhY2sgdGhhdCBzaG91bGQgZGlzYXBwZWFyICovCi0gICAgICAvKiAgICAgIHByb21wdGx5IHdpdGggRnJlZVR5cGUgMi4xISAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIEZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApICAgICAgICAgICAgICYmCi0gICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19CSVRNQVAgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBkcml2ZXItPmNsYXp6LT5sb2FkX2dseXBoKCBzbG90LCBmYWNlLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfZmxhZ3MgfCBGVF9MT0FEX1NCSVRTX09OTFkgKTsKLQotICAgICAgICBpZiAoICFlcnJvciAmJiBzbG90LT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCApCi0gICAgICAgICAgZ290byBMb2FkX09rOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsICAgICAgICA9IGZhY2UtPmludGVybmFsOwotICAgICAgICBGVF9JbnQgICAgICAgICAgICB0cmFuc2Zvcm1fZmxhZ3MgPSBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzOwotCi0KLSAgICAgICAgLyogc2luY2UgdGhlIGF1dG8taGludGVyIGNhbGxzIEZUX0xvYWRfR2x5cGggYnkgaXRzZWxmLCAqLwotICAgICAgICAvKiBtYWtlIHN1cmUgdGhhdCBnbHlwaHMgYXJlbid0IHRyYW5zZm9ybWVkICAgICAgICAgICAgICovCi0gICAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZmxhZ3MgPSAwOwotCi0gICAgICAgIC8qIGxvYWQgYXV0by1oaW50ZWQgb3V0bGluZSAqLwotICAgICAgICBoaW50aW5nID0gKEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlKWhpbnRlci0+Y2xhenotPm1vZHVsZV9pbnRlcmZhY2U7Ci0KLSAgICAgICAgZXJyb3IgICA9IGhpbnRpbmctPmxvYWRfZ2x5cGgoIChGVF9BdXRvSGludGVyKWhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsIGZhY2UtPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotCi0gICAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZmxhZ3MgPSB0cmFuc2Zvcm1fZmxhZ3M7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvciA9IGRyaXZlci0+Y2xhenotPmxvYWRfZ2x5cGgoIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICB7Ci0gICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGxvYWRlZCBvdXRsaW5lIGlzIGNvcnJlY3QgKi8KLSAgICAgICAgZXJyb3IgPSBGVF9PdXRsaW5lX0NoZWNrKCAmc2xvdC0+b3V0bGluZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSNpZmRlZiBHUklEX0ZJVF9NRVRSSUNTCi0gICAgICAgIGlmICggISggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApICkKLSAgICAgICAgICBmdF9nbHlwaHNsb3RfZ3JpZF9maXRfbWV0cmljcyggc2xvdCwKLSAgICAgICAgICAgICAgRlRfQk9PTCggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkgKTsKLSNlbmRpZgotICAgICAgfQotICAgIH0KLQotICBMb2FkX09rOgotICAgIC8qIGNvbXB1dGUgdGhlIGFkdmFuY2UgKi8KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgewotICAgICAgc2xvdC0+YWR2YW5jZS54ID0gMDsKLSAgICAgIHNsb3QtPmFkdmFuY2UueSA9IHNsb3QtPm1ldHJpY3MudmVydEFkdmFuY2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzbG90LT5hZHZhbmNlLnggPSBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlOwotICAgICAgc2xvdC0+YWR2YW5jZS55ID0gMDsKLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlIHRoZSBsaW5lYXIgYWR2YW5jZSBpbiAxNi4xNiBwaXhlbHMgKi8KLSAgICBpZiAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfTElORUFSX0RFU0lHTiApID09IDAgJiYKLSAgICAgICAgICggRlRfSVNfU0NBTEFCTEUoIGZhY2UgKSApICAgICAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgPSAmZmFjZS0+c2l6ZS0+bWV0cmljczsKLQotCi0gICAgICAvKiBpdCdzIHRyaWNreSEgKi8KLSAgICAgIHNsb3QtPmxpbmVhckhvcmlBZHZhbmNlID0gRlRfTXVsRGl2KCBzbG90LT5saW5lYXJIb3JpQWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlLCA2NCApOwotCi0gICAgICBzbG90LT5saW5lYXJWZXJ0QWR2YW5jZSA9IEZUX011bERpdiggc2xvdC0+bGluZWFyVmVydEFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSwgNjQgKTsKLSAgICB9Ci0KLSAgICBpZiAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSApID09IDAgKQotICAgIHsKLSAgICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsID0gZmFjZS0+aW50ZXJuYWw7Ci0KLQotICAgICAgLyogbm93LCB0cmFuc2Zvcm0gdGhlIGdseXBoIGltYWdlIGlmIG5lZWRlZCAqLwotICAgICAgaWYgKCBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzICkKLSAgICAgIHsKLSAgICAgICAgLyogZ2V0IHJlbmRlcmVyICovCi0gICAgICAgIEZUX1JlbmRlcmVyICByZW5kZXJlciA9IGZ0X2xvb2t1cF9nbHlwaF9yZW5kZXJlciggc2xvdCApOwotCi0KLSAgICAgICAgaWYgKCByZW5kZXJlciApCi0gICAgICAgICAgZXJyb3IgPSByZW5kZXJlci0+Y2xhenotPnRyYW5zZm9ybV9nbHlwaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlciwgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEgKTsKLSAgICAgICAgZWxzZSBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBhcHBseSBgc3RhbmRhcmQnIHRyYW5zZm9ybWF0aW9uIGlmIG5vIHJlbmRlcmVyIGlzIGF2YWlsYWJsZSAqLwotICAgICAgICAgIGlmICggaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyAmIDEgKQotICAgICAgICAgICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oICZzbG90LT5vdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeCApOwotCi0gICAgICAgICAgaWYgKCBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzICYgMiApCi0gICAgICAgICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggJnNsb3QtPm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9kZWx0YS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEueSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdHJhbnNmb3JtIGFkdmFuY2UgKi8KLSAgICAgICAgRlRfVmVjdG9yX1RyYW5zZm9ybSggJnNsb3QtPmFkdmFuY2UsICZpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeCApOwotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICIgIHggYWR2YW5jZTogJWRcbiIgLCBzbG90LT5hZHZhbmNlLnggKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeSBhZHZhbmNlOiAlZFxuIiAsIHNsb3QtPmFkdmFuY2UueSApKTsKLQotICAgIEZUX1RSQUNFNSgoICIgIGxpbmVhciB4IGFkdmFuY2U6ICVkXG4iICwgc2xvdC0+bGluZWFySG9yaUFkdmFuY2UgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgbGluZWFyIHkgYWR2YW5jZTogJWRcbiIgLCBzbG90LT5saW5lYXJWZXJ0QWR2YW5jZSApKTsKLQotICAgIC8qIGRvIHdlIG5lZWQgdG8gcmVuZGVyIHRoZSBpbWFnZSBub3c/ICovCi0gICAgaWYgKCAhZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgICAgJiYKLSAgICAgICAgIHNsb3QtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFICYmCi0gICAgICAgICBsb2FkX2ZsYWdzICYgRlRfTE9BRF9SRU5ERVIgKQotICAgIHsKLSAgICAgIEZUX1JlbmRlcl9Nb2RlICBtb2RlID0gRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApOwotCi0KLSAgICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgICAgICAmJgotICAgICAgICAgICAobG9hZF9mbGFncyAmIEZUX0xPQURfTU9OT0NIUk9NRSApICkKLSAgICAgICAgbW9kZSA9IEZUX1JFTkRFUl9NT0RFX01PTk87Ci0KLSAgICAgIGVycm9yID0gRlRfUmVuZGVyX0dseXBoKCBzbG90LCBtb2RlICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xvYWRfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9VSW50ICBnbHlwaF9pbmRleDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGdseXBoX2luZGV4ID0gKEZUX1VJbnQpY2hhcl9jb2RlOwotICAgIGlmICggZmFjZS0+Y2hhcm1hcCApCi0gICAgICBnbHlwaF9pbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCBjaGFyX2NvZGUgKTsKLQotICAgIHJldHVybiBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotICB9Ci0KLQotICAvKiBkZXN0cnVjdG9yIGZvciBzaXplcyBsaXN0ICovCi0gIHN0YXRpYyB2b2lkCi0gIGRlc3Ryb3lfc2l6ZSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgRlRfU2l6ZSAgICBzaXplLAotICAgICAgICAgICAgICAgIEZUX0RyaXZlciAgZHJpdmVyICkKLSAgewotICAgIC8qIGZpbmFsaXplIGNsaWVudC1zcGVjaWZpYyBkYXRhICovCi0gICAgaWYgKCBzaXplLT5nZW5lcmljLmZpbmFsaXplciApCi0gICAgICBzaXplLT5nZW5lcmljLmZpbmFsaXplciggc2l6ZSApOwotCi0gICAgLyogZmluYWxpemUgZm9ybWF0LXNwZWNpZmljIHN0dWZmICovCi0gICAgaWYgKCBkcml2ZXItPmNsYXp6LT5kb25lX3NpemUgKQotICAgICAgZHJpdmVyLT5jbGF6ei0+ZG9uZV9zaXplKCBzaXplICk7Ci0KLSAgICBGVF9GUkVFKCBzaXplLT5pbnRlcm5hbCApOwotICAgIEZUX0ZSRUUoIHNpemUgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfY21hcF9kb25lX2ludGVybmFsKCBGVF9DTWFwICBjbWFwICk7Ci0KLQotICBzdGF0aWMgdm9pZAotICBkZXN0cm95X2NoYXJtYXBzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX0ludCAgbjsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGZhY2UtPm51bV9jaGFybWFwczsgbisrICkKLSAgICB7Ci0gICAgICBGVF9DTWFwICBjbWFwID0gRlRfQ01BUCggZmFjZS0+Y2hhcm1hcHNbbl0gKTsKLQotCi0gICAgICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIGNtYXAgKTsKLQotICAgICAgZmFjZS0+Y2hhcm1hcHNbbl0gPSBOVUxMOwotICAgIH0KLQotICAgIEZUX0ZSRUUoIGZhY2UtPmNoYXJtYXBzICk7Ci0gICAgZmFjZS0+bnVtX2NoYXJtYXBzID0gMDsKLSAgfQotCi0KLSAgLyogZGVzdHJ1Y3RvciBmb3IgZmFjZXMgbGlzdCAqLwotICBzdGF0aWMgdm9pZAotICBkZXN0cm95X2ZhY2UoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICBGVF9Ecml2ZXIgIGRyaXZlciApCi0gIHsKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6ID0gZHJpdmVyLT5jbGF6ejsKLQotCi0gICAgLyogZGlzY2FyZCBhdXRvLWhpbnRpbmcgZGF0YSAqLwotICAgIGlmICggZmFjZS0+YXV0b2hpbnQuZmluYWxpemVyICkKLSAgICAgIGZhY2UtPmF1dG9oaW50LmZpbmFsaXplciggZmFjZS0+YXV0b2hpbnQuZGF0YSApOwotCi0gICAgLyogRGlzY2FyZCBnbHlwaCBzbG90cyBmb3IgdGhpcyBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogQmV3YXJlISAgRlRfRG9uZV9HbHlwaFNsb3QoKSBjaGFuZ2VzIHRoZSBmaWVsZCBgZmFjZS0+Z2x5cGgnICovCi0gICAgd2hpbGUgKCBmYWNlLT5nbHlwaCApCi0gICAgICBGVF9Eb25lX0dseXBoU2xvdCggZmFjZS0+Z2x5cGggKTsKLQotICAgIC8qIGRpc2NhcmQgYWxsIHNpemVzIGZvciB0aGlzIGZhY2UgKi8KLSAgICBGVF9MaXN0X0ZpbmFsaXplKCAmZmFjZS0+c2l6ZXNfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfTGlzdF9EZXN0cnVjdG9yKWRlc3Ryb3lfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgZHJpdmVyICk7Ci0gICAgZmFjZS0+c2l6ZSA9IE5VTEw7Ci0KLSAgICAvKiBub3cgZGlzY2FyZCBjbGllbnQgZGF0YSAqLwotICAgIGlmICggZmFjZS0+Z2VuZXJpYy5maW5hbGl6ZXIgKQotICAgICAgZmFjZS0+Z2VuZXJpYy5maW5hbGl6ZXIoIGZhY2UgKTsKLQotICAgIC8qIGRpc2NhcmQgY2hhcm1hcHMgKi8KLSAgICBkZXN0cm95X2NoYXJtYXBzKCBmYWNlLCBtZW1vcnkgKTsKLQotICAgIC8qIGZpbmFsaXplIGZvcm1hdC1zcGVjaWZpYyBzdHVmZiAqLwotICAgIGlmICggY2xhenotPmRvbmVfZmFjZSApCi0gICAgICBjbGF6ei0+ZG9uZV9mYWNlKCBmYWNlICk7Ci0KLSAgICAvKiBjbG9zZSB0aGUgc3RyZWFtIGZvciB0aGlzIGZhY2UgaWYgbmVlZGVkICovCi0gICAgRlRfU3RyZWFtX0ZyZWUoCi0gICAgICBmYWNlLT5zdHJlYW0sCi0gICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNICkgIT0gMCApOwotCi0gICAgZmFjZS0+c3RyZWFtID0gTlVMTDsKLQotICAgIC8qIGdldCByaWQgb2YgaXQgKi8KLSAgICBpZiAoIGZhY2UtPmludGVybmFsICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBmYWNlLT5pbnRlcm5hbCApOwotICAgIH0KLSAgICBGVF9GUkVFKCBmYWNlICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIERlc3Ryb3lfRHJpdmVyKCBGVF9Ecml2ZXIgIGRyaXZlciApCi0gIHsKLSAgICBGVF9MaXN0X0ZpbmFsaXplKCAmZHJpdmVyLT5mYWNlc19saXN0LAotICAgICAgICAgICAgICAgICAgICAgIChGVF9MaXN0X0Rlc3RydWN0b3IpZGVzdHJveV9mYWNlLAotICAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgZHJpdmVyICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbmRfdW5pY29kZV9jaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBVbmljb2RlIGNoYXJtYXAsIGlmIHRoZXJlIGlzIG9uZS4gICAgICAgICAgICAqLwotICAvKiAgICBBbmQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgaXQgdHJpZXMgdG8gZmF2b3VyIHRoZSBtb3JlICAgICAgICAgKi8KLSAgLyogICAgZXh0ZW5zaXZlIG9uZSwgaS5lLiwgb25lIHRoYXQgc3VwcG9ydHMgVUNTLTQgYWdhaW5zdCB0aG9zZSB3aGljaCAgICovCi0gIC8qICAgIGFyZSBsaW1pdGVkIHRvIHRoZSBCTVAgKHNhaWQgVUNTLTIgZW5jb2RpbmcuKSAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBvcGVuX2ZhY2UoKSAoanVzdCBiZWxvdyksIGFuZCBhbHNvICAgICovCi0gIC8qICAgIGZyb20gRlRfU2VsZWN0X0NoYXJtYXAoIC4uLiwgRlRfRU5DT0RJTkdfVU5JQ09ERSApLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZpbmRfdW5pY29kZV9jaGFybWFwKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0NoYXJNYXAqICBmaXJzdDsKLSAgICBGVF9DaGFyTWFwKiAgY3VyOwotCi0KLSAgICAvKiBjYWxsZXIgc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgYGZhY2UnIGlzIHZhbGlkICovCi0gICAgRlRfQVNTRVJUKCBmYWNlICk7Ci0KLSAgICBmaXJzdCA9IGZhY2UtPmNoYXJtYXBzOwotCi0gICAgaWYgKCAhZmlyc3QgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlICk7Ci0KLSAgICAvKgotICAgICAqICBUaGUgb3JpZ2luYWwgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbihzKSBvbmx5IHNwZWNpZmllZCBjaGFybWFwCi0gICAgICogIGZvcm1hdHMgdGhhdCBhcmUgY2FwYWJsZSBvZiBtYXBwaW5nIDggb3IgMTYgYml0IGNoYXJhY3RlciBjb2RlcyB0bwotICAgICAqICBnbHlwaCBpbmRpY2VzLgotICAgICAqCi0gICAgICogIEhvd2V2ZXIsIHJlY2VudCB1cGRhdGVzIHRvIHRoZSBBcHBsZSBhbmQgT3BlblR5cGUgc3BlY2lmaWNhdGlvbnMKLSAgICAgKiAgaW50cm9kdWNlZCBuZXcgZm9ybWF0cyB0aGF0IGFyZSBjYXBhYmxlIG9mIG1hcHBpbmcgMzItYml0IGNoYXJhY3RlcgotICAgICAqICBjb2RlcyBhcyB3ZWxsLiAgQW5kIHRoZXNlIGFyZSBhbHJlYWR5IHVzZWQgb24gc29tZSBmb250cywgbWFpbmx5IHRvCi0gICAgICogIG1hcCBub24tQk1QIEFzaWFuIGlkZW9ncmFwaHMgYXMgZGVmaW5lZCBpbiBVbmljb2RlLgotICAgICAqCi0gICAgICogIEZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLCB0aGVzZSBmb250cyBnZW5lcmFsbHkgY29tZSB3aXRoCi0gICAgICogICpzZXZlcmFsKiBVbmljb2RlIGNoYXJtYXBzOgotICAgICAqCi0gICAgICogICAtIE9uZSBvZiB0aGVtIGluIHRoZSAib2xkIiAxNi1iaXQgZm9ybWF0LCB0aGF0IGNhbm5vdCBhY2Nlc3MKLSAgICAgKiAgICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4KLSAgICAgKgotICAgICAqICAgLSBBbm90aGVyIG9uZSBpbiB0aGUgIm5ldyIgMzItYml0IGZvcm1hdCwgdGhhdCBjYW4gYWNjZXNzIGFsbAotICAgICAqICAgICB0aGUgZ2x5cGhzLgotICAgICAqCi0gICAgICogIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gd3JpdHRlbiB0byBhbHdheXMgZmF2b3IgYSAzMi1iaXQgY2hhcm1hcAotICAgICAqICB3aGVuIGZvdW5kLiAgT3RoZXJ3aXNlLCBhIDE2LWJpdCBvbmUgaXMgcmV0dXJuZWQgd2hlbiBmb3VuZC4KLSAgICAgKi8KLQotICAgIC8qIFNpbmNlIHRoZSBgaW50ZXJlc3RpbmcnIHRhYmxlLCB3aXRoIElEcyAoMywxMCksIGlzIG5vcm1hbGx5IHRoZSAqLwotICAgIC8qIGxhc3Qgb25lLCB3ZSBsb29wIGJhY2t3YXJkcy4gIFRoaXMgbG9zZXMgd2l0aCB0eXBlMSBmb250cyB3aXRoICAqLwotICAgIC8qIG5vbi1CTVAgY2hhcmFjdGVycyAoPC4wMDAxJSksIHRoaXMgd2lucyB3aXRoIC50dGYgd2l0aCBub24tQk1QICAqLwotICAgIC8qIGNoYXJzICguMDElID8pLCBhbmQgdGhpcyBpcyB0aGUgc2FtZSBhYm91dCA5OS45OSUgb2YgdGhlIHRpbWUhICAqLwotCi0gICAgY3VyID0gZmlyc3QgKyBmYWNlLT5udW1fY2hhcm1hcHM7ICAvKiBwb2ludHMgYWZ0ZXIgdGhlIGxhc3Qgb25lICovCi0KLSAgICBmb3IgKCA7IC0tY3VyID49IGZpcnN0OyApCi0gICAgewotICAgICAgaWYgKCBjdXJbMF0tPmVuY29kaW5nID09IEZUX0VOQ09ESU5HX1VOSUNPREUgKQotICAgICAgewotICAgICAgICAvKiBYWFggSWYgc29tZSBuZXcgZW5jb2RpbmdzIHRvIHJlcHJlc2VudCBVQ1MtNCBhcmUgYWRkZWQsICovCi0gICAgICAgIC8qICAgICB0aGV5IHNob3VsZCBiZSBhZGRlZCBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAoIGN1clswXS0+cGxhdGZvcm1faWQgPT0gVFRfUExBVEZPUk1fTUlDUk9TT0ZUICYmCi0gICAgICAgICAgICAgICBjdXJbMF0tPmVuY29kaW5nX2lkID09IFRUX01TX0lEX1VDU180ICAgICAgICApICAgICB8fAotICAgICAgICAgICAgICggY3VyWzBdLT5wbGF0Zm9ybV9pZCA9PSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFICYmCi0gICAgICAgICAgICAgICBjdXJbMF0tPmVuY29kaW5nX2lkID09IFRUX0FQUExFX0lEX1VOSUNPREVfMzIgICAgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBmYWNlLT5jaGFybWFwID0gY3VyWzBdOwotICAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBXZSBkbyBub3QgaGF2ZSBhbnkgVUNTLTQgY2hhcm1hcC4gICAgICAgICAgICAgICAgKi8KLSAgICAvKiBEbyB0aGUgbG9vcCBhZ2FpbiBhbmQgc2VhcmNoIGZvciBVQ1MtMiBjaGFybWFwcy4gKi8KLSAgICBjdXIgPSBmaXJzdCArIGZhY2UtPm51bV9jaGFybWFwczsKLQotICAgIGZvciAoIDsgLS1jdXIgPj0gZmlyc3Q7ICkKLSAgICB7Ci0gICAgICBpZiAoIGN1clswXS0+ZW5jb2RpbmcgPT0gRlRfRU5DT0RJTkdfVU5JQ09ERSApCi0gICAgICB7Ci0gICAgICAgIGZhY2UtPmNoYXJtYXAgPSBjdXJbMF07Ci0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHZhcmlhbnQgc2VsZWN0b3IgY2hhcm1hcCwgaWYgdGhlcmUgaXMgb25lLiAqLwotICAvKiAgICBUaGVyZSBjYW4gb25seSBiZSBvbmUgKHBsYXRmb3JtPTAsIHNwZWNpZmljPTUsIGZvcm1hdD0xNCkuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9DaGFyTWFwCi0gIGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0NoYXJNYXAqICBmaXJzdDsKLSAgICBGVF9DaGFyTWFwKiAgZW5kOwotICAgIEZUX0NoYXJNYXAqICBjdXI7Ci0KLQotICAgIC8qIGNhbGxlciBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCBgZmFjZScgaXMgdmFsaWQgKi8KLSAgICBGVF9BU1NFUlQoIGZhY2UgKTsKLQotICAgIGZpcnN0ID0gZmFjZS0+Y2hhcm1hcHM7Ci0KLSAgICBpZiAoICFmaXJzdCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGVuZCA9IGZpcnN0ICsgZmFjZS0+bnVtX2NoYXJtYXBzOyAgLyogcG9pbnRzIGFmdGVyIHRoZSBsYXN0IG9uZSAqLwotCi0gICAgZm9yICggY3VyID0gZmlyc3Q7IGN1ciA8IGVuZDsgY3VyKysgKQotICAgIHsKLSAgICAgIGlmICggY3VyWzBdLT5wbGF0Zm9ybV9pZCA9PSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFICAgICYmCi0gICAgICAgICAgIGN1clswXS0+ZW5jb2RpbmdfaWQgPT0gVFRfQVBQTEVfSURfVkFSSUFOVF9TRUxFQ1RPUiAmJgotICAgICAgICAgICBGVF9HZXRfQ01hcF9Gb3JtYXQoIGN1clswXSApID09IDE0ICAgICAgICAgICAgICAgICAgKQotICAgICAgICByZXR1cm4gY3VyWzBdOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvcGVuX2ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgc29tZSB3b3JrIGZvciBGVF9PcGVuX0ZhY2UoKS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBvcGVuX2ZhY2UoIEZUX0RyaXZlciAgICAgIGRyaXZlciwKLSAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAqYXN0cmVhbSwKLSAgICAgICAgICAgICBGVF9Cb29sICAgICAgICBleHRlcm5hbF9zdHJlYW0sCi0gICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcywKLSAgICAgICAgICAgICBGVF9GYWNlICAgICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnk7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICAgY2xheno7Ci0gICAgRlRfRmFjZSAgICAgICAgICAgZmFjZSAgICAgPSBOVUxMOwotICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsID0gTlVMTDsKLQotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yLCBlcnJvcjI7Ci0KLQotICAgIGNsYXp6ICA9IGRyaXZlci0+Y2xheno7Ci0gICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLQotICAgIC8qIGFsbG9jYXRlIHRoZSBmYWNlIG9iamVjdCBhbmQgcGVyZm9ybSBiYXNpYyBpbml0aWFsaXphdGlvbiAqLwotICAgIGlmICggRlRfQUxMT0MoIGZhY2UsIGNsYXp6LT5mYWNlX29iamVjdF9zaXplICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZmFjZS0+ZHJpdmVyID0gZHJpdmVyOwotICAgIGZhY2UtPm1lbW9yeSA9IG1lbW9yeTsKLSAgICBmYWNlLT5zdHJlYW0gPSAqYXN0cmVhbTsKLQotICAgIC8qIHNldCB0aGUgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSBiaXQgZm9yIEZUX0RvbmVfRmFjZSAqLwotICAgIGlmICggZXh0ZXJuYWxfc3RyZWFtICkKLSAgICAgIGZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTTsKLQotICAgIGlmICggRlRfTkVXKCBpbnRlcm5hbCApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGZhY2UtPmludGVybmFsID0gaW50ZXJuYWw7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgewotICAgICAgaW50ICBpOwotCi0KLSAgICAgIGZhY2UtPmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgPSBOVUxMOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFyYW1zICYmICFmYWNlLT5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgaWYgKCBwYXJhbXNbaV0udGFnID09IEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTCApCi0gICAgICAgICAgZmFjZS0+aW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSA9Ci0gICAgICAgICAgICAoRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlKXBhcmFtc1tpXS5kYXRhOwotICAgIH0KLSNlbmRpZgotCi0gICAgZmFjZS0+aW50ZXJuYWwtPnJhbmRvbV9zZWVkID0gLTE7Ci0KLSAgICBpZiAoIGNsYXp6LT5pbml0X2ZhY2UgKQotICAgICAgZXJyb3IgPSBjbGF6ei0+aW5pdF9mYWNlKCAqYXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludClmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgKTsKLSAgICAqYXN0cmVhbSA9IGZhY2UtPnN0cmVhbTsgLyogU3RyZWFtIG1heSBoYXZlIGJlZW4gY2hhbmdlZC4gKi8KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIHNlbGVjdCBVbmljb2RlIGNoYXJtYXAgYnkgZGVmYXVsdCAqLwotICAgIGVycm9yMiA9IGZpbmRfdW5pY29kZV9jaGFybWFwKCBmYWNlICk7Ci0KLSAgICAvKiBpZiBubyBVbmljb2RlIGNoYXJtYXAgY2FuIGJlIGZvdW5kLCBGVF9FcnJfSW52YWxpZF9DaGFyTWFwX0hhbmRsZSAqLwotICAgIC8qIGlzIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBubyBlcnJvciBzaG91bGQgaGFwcGVuLCBidXQgd2Ugd2FudCB0byBwbGF5IHNhZmUgKi8KLSAgICBpZiAoIGVycm9yMiAmJiBGVF9FUlJfTkVRKCBlcnJvcjIsIEludmFsaWRfQ2hhck1hcF9IYW5kbGUgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBlcnJvcjI7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgKmFmYWNlID0gZmFjZTsKLQotICBGYWlsOgotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGRlc3Ryb3lfY2hhcm1hcHMoIGZhY2UsIG1lbW9yeSApOwotICAgICAgaWYgKCBjbGF6ei0+ZG9uZV9mYWNlICkKLSAgICAgICAgY2xhenotPmRvbmVfZmFjZSggZmFjZSApOwotICAgICAgRlRfRlJFRSggaW50ZXJuYWwgKTsKLSAgICAgIEZUX0ZSRUUoIGZhY2UgKTsKLSAgICAgICphZmFjZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiB0aGVyZSdzIGEgTWFjLXNwZWNpZmljIGV4dGVuZGVkIGltcGxlbWVudGF0aW9uIG9mIEZUX05ld19GYWNlKCkgKi8KLSAgLyogaW4gc3JjL2Jhc2UvZnRtYWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZm5kZWYgRlRfTUFDSU5UT1NICi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfRmFjZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcGF0aG5hbWUsCi0gICAgICAgICAgICAgICBGVF9Mb25nICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9PcGVuX0FyZ3MgIGFyZ3M7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBhbmQgYGFmYWNlJyBkZWxheWVkIHRvIGBGVF9PcGVuX0ZhY2UnICovCi0gICAgaWYgKCAhcGF0aG5hbWUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBhcmdzLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBhcmdzLnBhdGhuYW1lID0gKGNoYXIqKXBhdGhuYW1lOwotICAgIGFyZ3Muc3RyZWFtICAgPSBOVUxMOwotCi0gICAgcmV0dXJuIGZ0X29wZW5fZmFjZV9pbnRlcm5hbCggbGlicmFyeSwgJmFyZ3MsIGZhY2VfaW5kZXgsIGFmYWNlLCAxICk7Ci0gIH0KLQotI2VuZGlmCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX05ld19NZW1vcnlfRmFjZSggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGZpbGVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgZmlsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9PcGVuX0FyZ3MgIGFyZ3M7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBhbmQgYGZhY2UnIGRlbGF5ZWQgdG8gYEZUX09wZW5fRmFjZScgKi8KLSAgICBpZiAoICFmaWxlX2Jhc2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBhcmdzLmZsYWdzICAgICAgID0gRlRfT1BFTl9NRU1PUlk7Ci0gICAgYXJncy5tZW1vcnlfYmFzZSA9IGZpbGVfYmFzZTsKLSAgICBhcmdzLm1lbW9yeV9zaXplID0gZmlsZV9zaXplOwotICAgIGFyZ3Muc3RyZWFtICAgICAgPSBOVUxMOwotCi0gICAgcmV0dXJuIGZ0X29wZW5fZmFjZV9pbnRlcm5hbCggbGlicmFyeSwgJmFyZ3MsIGZhY2VfaW5kZXgsIGFmYWNlLCAxICk7Ci0gIH0KLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLQotICAvKiBUaGUgYmVoYXZpb3IgaGVyZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBpbiBiYXNlL2Z0bWFjLmMsIGJ1dCBpdCAgICAgKi8KLSAgLyogaXMgZGVzaWduZWQgdG8gd29yayBvbiBub24tbWFjIHN5c3RlbXMsIHNvIG5vIG1hYyBzcGVjaWZpYyBjYWxscy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBsb29rIGF0IHRoZSBmaWxlIGFuZCBkZXRlcm1pbmUgaWYgaXQgaXMgYSBtYWMgZGZvbnQgZmlsZSBvciBhIG1hYyAgKi8KLSAgLyogcmVzb3VyY2UgZmlsZSwgb3IgYSBtYWNiaW5hcnkgZmlsZSBjb250YWluaW5nIGEgbWFjIHJlc291cmNlIGZpbGUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVbmxpa2UgZnRtYWMgSSdtIG5vdCBnb2luZyB0byBsb29rIGF0IGEgYEZPTkQnLiAgSSBkb24ndCByZWFsbHkgc2VlICAgKi8KLSAgLyogdGhlIHBvaW50LCBlc3BlY2lhbGx5IHNpbmNlIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBgRk9ORCcgcmVzb3VyY2VzLiAgICovCi0gIC8qIEluc3RlYWQgSSdsbCBqdXN0IGxvb2sgZm9yIGBzZm50JyBhbmQgYFBPU1QnIHJlc291cmNlcywgb3JkZXJlZCBhcyAgICAqLwotICAvKiB0aGV5IG9jY3VyIGluIHRoZSBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBtdWx0aXBsZSBgUE9TVCcgcmVzb3VyY2VzIGRvIG5vdCBtZWFuIG11bHRpcGxlIHBvc3RzY3JpcHQgICAqLwotICAvKiBmb250czsgdGhleSBhbGwgZ2V0IGphbW1lZCB0b2dldGhlciB0byBtYWtlIHdoYXQgaXMgZXNzZW50aWFsbHkgYSAgICAgKi8KLSAgLyogcGZiIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBgTkZOVCcgb3IgYEZPTlQnIGJpdG1hcCByZXNvdXJjZXMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFzIHNvb24gYXMgd2UgZ2V0IGFuIGBzZm50JyBsb2FkIGl0IGludG8gbWVtb3J5IGFuZCBwYXNzIGl0IG9mZiB0byAgICAqLwotICAvKiBGVF9PcGVuX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHdlIGhhdmUgYSAoc2V0IG9mKSBgUE9TVCcgcmVzb3VyY2VzLCBtYXNzYWdlIHRoZW0gaW50byBhIChtZW1vcnkpICAqLwotICAvKiBwZmIgZmlsZSBhbmQgcGFzcyB0aGF0IHRvIEZUX09wZW5fRmFjZS4gIChBcyB3aXRoIGZ0bWFjLmMgSSdtIG5vdCAgICAgKi8KLSAgLyogZ29pbmcgdG8gdHJ5IHRvIHNhdmUgdGhlIGtlcm5pbmcgaW5mby4gIEFmdGVyIGFsbCB0aGF0IGxpdmVzIGluIHRoZSAgICovCi0gIC8qIGBGT05EJyB3aGljaCBpc24ndCBpbiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBgUE9TVCcgcmVzb3VyY2VzIHNvICAgICAqLwotICAvKiB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhY2Nlc3MgdG8gaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIC8qIEZpbmFsaXplciBmb3IgYSBtZW1vcnkgc3RyZWFtOyBnZXRzIGNhbGxlZCBieSBGVF9Eb25lX0ZhY2UoKS4gKi8KLSAgLyogSXQgZnJlZXMgdGhlIG1lbW9yeSBpdCB1c2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGcm9tIGBmdG1hYy5jJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIG1lbW9yeV9zdHJlYW1fY2xvc2UoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIHN0cmVhbS0+YmFzZSApOwotCi0gICAgc3RyZWFtLT5zaXplICA9IDA7Ci0gICAgc3RyZWFtLT5iYXNlICA9IE5VTEw7Ci0gICAgc3RyZWFtLT5jbG9zZSA9IE5VTEw7Ci0gIH0KLQotCi0gIC8qIENyZWF0ZSBhIG5ldyBtZW1vcnkgc3RyZWFtIGZyb20gYSBidWZmZXIgYW5kIGEgc2l6ZS4gKi8KLSAgLyogRnJvbSBgZnRtYWMuYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgbmV3X21lbW9yeV9zdHJlYW0oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbV9DbG9zZUZ1bmMgIGNsb3NlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAqYXN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gTlVMTDsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIWJhc2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAqYXN0cmVhbSA9IE5VTEw7Ci0gICAgbWVtb3J5ICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgaWYgKCBGVF9ORVcoIHN0cmVhbSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sIGJhc2UsIHNpemUgKTsKLQotICAgIHN0cmVhbS0+Y2xvc2UgPSBjbG9zZTsKLQotICAgICphc3RyZWFtID0gc3RyZWFtOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDcmVhdGUgYSBuZXcgRlRfRmFjZSBnaXZlbiBhIGJ1ZmZlciBhbmQgYSBkcml2ZXIgbmFtZS4gKi8KLSAgLyogRnJvbSBgZnRtYWMuYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBkcml2ZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfU3RyZWFtICAgICBzdHJlYW0gPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBlcnJvciA9IG5ld19tZW1vcnlfc3RyZWFtKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfc3RyZWFtX2Nsb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBiYXNlICk7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgYXJncy5mbGFncyAgPSBGVF9PUEVOX1NUUkVBTTsKLSAgICBhcmdzLnN0cmVhbSA9IHN0cmVhbTsKLSAgICBpZiAoIGRyaXZlcl9uYW1lICkKLSAgICB7Ci0gICAgICBhcmdzLmZsYWdzICA9IGFyZ3MuZmxhZ3MgfCBGVF9PUEVOX0RSSVZFUjsKLSAgICAgIGFyZ3MuZHJpdmVyID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgZHJpdmVyX25hbWUgKTsKLSAgICB9Ci0KLSNpZmRlZiBGVF9NQUNJTlRPU0gKLSAgICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmFjZSBpbmRleCBoYXMgc2VydmVkIGl0cyBwdXJwb3NlOyAgKi8KLSAgICAvKiB3aG9ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gaGFzIGFscmVhZHkgdXNlZCBpdCB0byAgICAgKi8KLSAgICAvKiBsb2NhdGUgdGhlIGNvcnJlY3QgZm9udCBkYXRhLiAgV2Ugc2hvdWxkIG5vdCBwcm9wYWdhdGUgKi8KLSAgICAvKiB0aGlzIGluZGV4IHRvIEZUX09wZW5fRmFjZSgpICh1bmxlc3MgaXQgaXMgbmVnYXRpdmUpLiAgKi8KLQotICAgIGlmICggZmFjZV9pbmRleCA+IDAgKQotICAgICAgZmFjZV9pbmRleCAmPSAweDdGRkYwMDAwTDsgLyogcmV0YWluIEdYIGRhdGEgKi8KLSNlbmRpZgotCi0gICAgZXJyb3IgPSBmdF9vcGVuX2ZhY2VfaW50ZXJuYWwoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSwgMCApOwotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgKCphZmFjZSktPmZhY2VfZmxhZ3MgJj0gfkZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU07Ci0gICAgZWxzZQotI2lmZGVmIEZUX01BQ0lOVE9TSAotICAgICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbSwgMCApOwotI2Vsc2UKLSAgICB7Ci0gICAgICBGVF9TdHJlYW1fQ2xvc2UoIHN0cmVhbSApOwotICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIExvb2sgdXAgYFRZUDEnIG9yIGBDSUQgJyB0YWJsZSBmcm9tIHNmbnQgdGFibGUgZGlyZWN0b3J5LiAgICAgICAqLwotICAvKiBgb2Zmc2V0JyBhbmQgYGxlbmd0aCcgbXVzdCBleGNsdWRlIHRoZSBiaW5hcnkgaGVhZGVyIGluIHRhYmxlcy4gKi8KLQotICAvKiBUeXBlIDEgYW5kIENJRC1rZXllZCBmb250IGRyaXZlcnMgc2hvdWxkIHJlY29nbml6ZSBzZm50LXdyYXBwZWQgKi8KLSAgLyogZm9ybWF0IHRvby4gIEhlcmUsIHNpbmNlIHdlIGNhbid0IGV4cGVjdCB0aGF0IHRoZSBUcnVlVHlwZSBmb250ICovCi0gIC8qIGRyaXZlciBpcyBsb2FkZWQgdW5jb25kaXRpb25hbGx5LCB3ZSBtdXN0IHBhcnNlIHRoZSBmb250IGJ5ICAgICAqLwotICAvKiBvdXJzZWx2ZXMuICBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBhbmQgKi8KLSAgLyogdGhlIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2xvb2t1cF9QU19pbl9zZm50X3N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgaXNfc2ZudF9jaWQgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VU2hvcnQgIG51bVRhYmxlczsKLSAgICBGVF9Mb25nICAgIHBzdGFibGVfaW5kZXg7Ci0gICAgRlRfVUxvbmcgICB0YWc7Ci0gICAgaW50ICAgICAgICBpOwotCi0KLSAgICAqb2Zmc2V0ID0gMDsKLSAgICAqbGVuZ3RoID0gMDsKLSAgICAqaXNfc2ZudF9jaWQgPSBGQUxTRTsKLQotICAgIC8qIFRPRE86IHN1cHBvcnQgZm9yIHNmbnQtd3JhcHBlZCBQUy9DSUQgaW4gVFRDIGZvcm1hdCAqLwotCi0gICAgLyogdmVyc2lvbiBjaGVjayBmb3IgJ3R5cDEnIChzaG91bGQgYmUgaWdub3JlZD8pICovCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HKCB0YWcgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgaWYgKCB0YWcgIT0gVFRBR190eXAxICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbnVtVGFibGVzICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIDIgKiAzICkgKSAvKiBza2lwIGJpbmFyeSBzZWFyY2ggaGVhZGVyICovCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBwc3RhYmxlX2luZGV4ID0gLTE7Ci0gICAgKmlzX3NmbnRfY2lkICA9IEZBTFNFOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBGVF9SRUFEX1VMT05HKCB0YWcgKSAgICAgfHwgRlRfU1RSRUFNX1NLSVAoIDQgKSAgICAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVUxPTkcoICpvZmZzZXQgKSB8fCBGVF9SRUFEX1VMT05HKCAqbGVuZ3RoICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGlmICggdGFnID09IFRUQUdfQ0lEICkKLSAgICAgIHsKLSAgICAgICAgcHN0YWJsZV9pbmRleCsrOwotICAgICAgICAqb2Zmc2V0ICs9IDIyOwotICAgICAgICAqbGVuZ3RoIC09IDIyOwotICAgICAgICAqaXNfc2ZudF9jaWQgPSBUUlVFOwotICAgICAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHRhZyA9PSBUVEFHX1RZUDEgKQotICAgICAgewotICAgICAgICBwc3RhYmxlX2luZGV4Kys7Ci0gICAgICAgICpvZmZzZXQgKz0gMjQ7Ci0gICAgICAgICpsZW5ndGggLT0gMjQ7Ci0gICAgICAgICppc19zZm50X2NpZCA9IEZBTFNFOwotICAgICAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgICAgfQotICAgICAgaWYgKCBmYWNlX2luZGV4ID49IDAgJiYgcHN0YWJsZV9pbmRleCA9PSBmYWNlX2luZGV4ICkKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIFRhYmxlX01pc3NpbmcgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIgICpwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotICAgIEZUX1VMb25nICAgb2Zmc2V0LCBsZW5ndGg7Ci0gICAgRlRfVUxvbmcgICBwb3M7Ci0gICAgRlRfQm9vbCAgICBpc19zZm50X2NpZDsKLSAgICBGVF9CeXRlKiAgIHNmbnRfcHMgPSBOVUxMOwotCi0gICAgRlRfVU5VU0VEKCBudW1fcGFyYW1zICk7Ci0gICAgRlRfVU5VU0VEKCBwYXJhbXMgKTsKLQotCi0gICAgLyogaWdub3JlIEdYIHN0dWZmICovCi0gICAgaWYgKCBmYWNlX2luZGV4ID4gMCApCi0gICAgICBmYWNlX2luZGV4ICY9IDB4RkZGRkw7Ci0KLSAgICBwb3MgPSBGVF9TVFJFQU1fUE9TKCk7Ci0KLSAgICBlcnJvciA9IGZ0X2xvb2t1cF9QU19pbl9zZm50X3N0cmVhbSggc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfc2ZudF9jaWQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggb2Zmc2V0ID4gc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAib3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW06IGludmFsaWQgdGFibGUgb2Zmc2V0XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBlbHNlIGlmICggbGVuZ3RoID4gc3RyZWFtLT5zaXplIC0gb2Zmc2V0ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAib3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW06IGludmFsaWQgdGFibGUgbGVuZ3RoXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgcG9zICsgb2Zmc2V0ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX0FMTE9DKCBzZm50X3BzLCAoRlRfTG9uZylsZW5ndGggKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIChGVF9CeXRlICopc2ZudF9wcywgbGVuZ3RoICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfRlJFRSggc2ZudF9wcyApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGVycm9yID0gb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01JTiggZmFjZV9pbmRleCwgMCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zZm50X2NpZCA/ICJjaWQiIDogInR5cGUxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLSAgRXhpdDoKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgZXJyb3IxOwotCi0KLSAgICAgIGlmICggRlRfRVJSX0VRKCBlcnJvciwgVW5rbm93bl9GaWxlX0Zvcm1hdCApICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IxID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgcG9zICk7Ci0gICAgICAgIGlmICggZXJyb3IxICkKLSAgICAgICAgICByZXR1cm4gZXJyb3IxOwotICAgICAgfQotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICB9Ci0KLQotI2lmbmRlZiBGVF9NQUNJTlRPU0gKLQotICAvKiBUaGUgcmVzb3VyY2UgaGVhZGVyIHNheXMgd2UndmUgZ290IHJlc291cmNlX2NudCBgUE9TVCcgKHR5cGUxKSAqLwotICAvKiByZXNvdXJjZXMgaW4gdGhpcyBmaWxlLiAgVGhleSBhbGwgbmVlZCB0byBiZSBjb2FsZXNjZWQgaW50byAgICAqLwotICAvKiBvbmUgbHVtcCB3aGljaCBnZXRzIHBhc3NlZCBvbiB0byB0aGUgdHlwZTEgZHJpdmVyLiAgICAgICAgICAgICAqLwotICAvKiBIZXJlIGNhbiBiZSBvbmx5IG9uZSBQb3N0U2NyaXB0IGZvbnQgaW4gYSBmaWxlIHNvIGZhY2VfaW5kZXggICAqLwotICAvKiBtdXN0IGJlIDAgKG9yIC0xKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgTWFjX1JlYWRfUE9TVF9SZXNvdXJjZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZXNvdXJjZV9jbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgKmFmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRVJSKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgRlRfQnl0ZSogICBwZmJfZGF0YSA9IE5VTEw7Ci0gICAgaW50ICAgICAgICBpLCB0eXBlLCBmbGFnczsKLSAgICBGVF9VTG9uZyAgIGxlbjsKLSAgICBGVF9VTG9uZyAgIHBmYl9sZW4sIHBmYl9wb3MsIHBmYl9sZW5wb3M7Ci0gICAgRlRfVUxvbmcgICBybGVuLCB0ZW1wOwotCi0KLSAgICBpZiAoIGZhY2VfaW5kZXggPT0gLTEgKQotICAgICAgZmFjZV9pbmRleCA9IDA7Ci0gICAgaWYgKCBmYWNlX2luZGV4ICE9IDAgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogRmluZCB0aGUgbGVuZ3RoIG9mIGFsbCB0aGUgUE9TVCByZXNvdXJjZXMsIGNvbmNhdGVuYXRlZC4gIEFzc3VtZSAqLwotICAgIC8qIHdvcnN0IGNhc2UgKGVhY2ggcmVzb3VyY2UgaW4gaXRzIG93biBzZWN0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLSAgICBwZmJfbGVuID0gMDsKLSAgICBmb3IgKCBpID0gMDsgaSA8IHJlc291cmNlX2NudDsgaSsrICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZylvZmZzZXRzW2ldICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgaWYgKCBGVF9SRUFEX1VMT05HKCB0ZW1wICkgKSAgLyogYWN0dWFsbHkgTE9ORyAqLwotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIEZUMiBhbGxvY2F0b3IgdGFrZXMgc2lnbmVkIGxvbmcgYnVmZmVyIGxlbmd0aCwKLSAgICAgICAqIHRvbyBsYXJnZSB2YWx1ZSBjYXVzaW5nIG92ZXJmbG93IHNob3VsZCBiZSBjaGVja2VkCi0gICAgICAgKi8KLSAgICAgIEZUX1RSQUNFNCgoICIgICAgICAgICAgICAgICAgIFBPU1QgZnJhZ21lbnQgIyVkOiBsZW5ndGg9MHglMDh4IgotICAgICAgICAgICAgICAgICAgIiB0b3RhbCBwZmJfbGVuPTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgIGksIHRlbXAsIHBmYl9sZW4gKyB0ZW1wICsgNiApKTsKLQotICAgICAgaWYgKCBGVF9NQUNfUkZPUktfTUFYX0xFTiA8IHRlbXAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9NQUNfUkZPUktfTUFYX0xFTiAtIHRlbXAgPCBwZmJfbGVuICsgNiApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICIgICAgICAgICAgICAgTWFjT1MgcmVzb3VyY2UgbGVuZ3RoIGNhbm5vdCBleGNlZWQiCi0gICAgICAgICAgICAgICAgICAgICIgMHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICBGVF9NQUNfUkZPUktfTUFYX0xFTiApKTsKLQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX09mZnNldCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHBmYl9sZW4gKz0gdGVtcCArIDY7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UyKCggIiAgICAgICAgICAgICB0b3RhbCBidWZmZXIgc2l6ZSB0byBjb25jYXRlbmF0ZSIKLSAgICAgICAgICAgICAgICAiICVkIFBPU1QgZnJhZ21lbnRzOiAweCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgIHJlc291cmNlX2NudCwgcGZiX2xlbiArIDIgKSk7Ci0KLSAgICBpZiAoIHBmYl9sZW4gKyAyIDwgNiApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIiAgICAgICAgICAgICB0b28gbG9uZyBmcmFnbWVudCBsZW5ndGggbWFrZXMiCi0gICAgICAgICAgICAgICAgICAiIHBmYl9sZW4gY29uZnVzZWQ6IHBmYl9sZW49MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgcGZiX2xlbiApKTsKLQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9BTExPQyggcGZiX2RhdGEsIChGVF9Mb25nKXBmYl9sZW4gKyAyICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcGZiX2RhdGFbMF0gPSAweDgwOwotICAgIHBmYl9kYXRhWzFdID0gMTsgICAgICAgICAgICAvKiBBc2NpaSBzZWN0aW9uICovCi0gICAgcGZiX2RhdGFbMl0gPSAwOyAgICAgICAgICAgIC8qIDQtYnl0ZSBsZW5ndGgsIGZpbGwgaW4gbGF0ZXIgKi8KLSAgICBwZmJfZGF0YVszXSA9IDA7Ci0gICAgcGZiX2RhdGFbNF0gPSAwOwotICAgIHBmYl9kYXRhWzVdID0gMDsKLSAgICBwZmJfcG9zICAgICA9IDY7Ci0gICAgcGZiX2xlbnBvcyAgPSAyOwotCi0gICAgbGVuICA9IDA7Ci0gICAgdHlwZSA9IDE7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHJlc291cmNlX2NudDsgaSsrICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZylvZmZzZXRzW2ldICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0MjsKLSAgICAgIGlmICggRlRfUkVBRF9VTE9ORyggcmxlbiApICkKLSAgICAgICAgZ290byBFeGl0MjsKLQotICAgICAgLyogRlQyIGFsbG9jYXRvciB0YWtlcyBzaWduZWQgbG9uZyBidWZmZXIgbGVuZ3RoLAotICAgICAgICogdG9vIGxhcmdlIGZyYWdtZW50IGxlbmd0aCBjYXVzaW5nIG92ZXJmbG93IHNob3VsZCBiZSBjaGVja2VkCi0gICAgICAgKi8KLSAgICAgIGlmICggMHg3RkZGRkZGRlVMIDwgcmxlbiApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfT2Zmc2V0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDI7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIGZsYWdzICkgKQotICAgICAgICBnb3RvIEV4aXQyOwotCi0gICAgICBGVF9UUkFDRTMoKCAiUE9TVCBmcmFnbWVudFslZF06IgotICAgICAgICAgICAgICAgICAgIiBvZmZzZXRzPTB4JTA4eCwgcmxlbj0weCUwOHgsIGZsYWdzPTB4JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgIGksIG9mZnNldHNbaV0sIHJsZW4sIGZsYWdzICkpOwotCi0gICAgICBlcnJvciA9IEZUX0VSUiggQXJyYXlfVG9vX0xhcmdlICk7Ci0KLSAgICAgIC8qIHBvc3Rwb25lIHRoZSBjaGVjayBvZiBgcmxlbiBsb25nZXIgdGhhbiBidWZmZXInICovCi0gICAgICAvKiB1bnRpbCBgRlRfU3RyZWFtX1JlYWQnICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBpZiAoICggZmxhZ3MgPj4gOCApID09IDAgKSAgICAgICAgLyogQ29tbWVudCwgc2hvdWxkIG5vdCBiZSBsb2FkZWQgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UzKCggIiAgICBTa2lwIFBPU1QgZnJhZ21lbnQgIyVkIGJlY2F1c2UgaXQgaXMgYSBjb21tZW50XG4iLAotICAgICAgICAgICAgICAgICAgICBpICkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogdGhlIGZsYWdzIGFyZSBwYXJ0IG9mIHRoZSByZXNvdXJjZSwgc28gcmxlbiA+PSAyLCAgKi8KLSAgICAgIC8qIGJ1dCBzb21lIGZvbnRzIGRlY2xhcmUgcmxlbiA9IDAgZm9yIGVtcHR5IGZyYWdtZW50ICovCi0gICAgICBpZiAoIHJsZW4gPiAyICkKLSAgICAgICAgcmxlbiAtPSAyOwotICAgICAgZWxzZQotICAgICAgICBybGVuID0gMDsKLQotICAgICAgaWYgKCAoIGZsYWdzID4+IDggKSA9PSB0eXBlICkKLSAgICAgICAgbGVuICs9IHJsZW47Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMygoICIgICAgV3JpdGUgUE9TVCBmcmFnbWVudCAjJWQgaGVhZGVyICg0LWJ5dGUpIHRvIGJ1ZmZlciIKLSAgICAgICAgICAgICAgICAgICAgIiAlcCArIDB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgcGZiX2RhdGEsIHBmYl9sZW5wb3MgKSk7Ci0KLSAgICAgICAgaWYgKCBwZmJfbGVucG9zICsgMyA+IHBmYl9sZW4gKyAyICkKLSAgICAgICAgICBnb3RvIEV4aXQyOwotCi0gICAgICAgIHBmYl9kYXRhW3BmYl9sZW5wb3MgICAgXSA9IChGVF9CeXRlKSggbGVuICk7Ci0gICAgICAgIHBmYl9kYXRhW3BmYl9sZW5wb3MgKyAxXSA9IChGVF9CeXRlKSggbGVuID4+IDggKTsKLSAgICAgICAgcGZiX2RhdGFbcGZiX2xlbnBvcyArIDJdID0gKEZUX0J5dGUpKCBsZW4gPj4gMTYgKTsKLSAgICAgICAgcGZiX2RhdGFbcGZiX2xlbnBvcyArIDNdID0gKEZUX0J5dGUpKCBsZW4gPj4gMjQgKTsKLQotICAgICAgICBpZiAoICggZmxhZ3MgPj4gOCApID09IDUgKSAgICAgIC8qIEVuZCBvZiBmb250IG1hcmsgKi8KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBGVF9UUkFDRTMoKCAiICAgIFdyaXRlIFBPU1QgZnJhZ21lbnQgIyVkIGhlYWRlciAoNi1ieXRlKSB0byBidWZmZXIiCi0gICAgICAgICAgICAgICAgICAgICIgJXAgKyAweCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICAgIGksIHBmYl9kYXRhLCBwZmJfcG9zICkpOwotCi0gICAgICAgIGlmICggcGZiX3BvcyArIDYgPiBwZmJfbGVuICsgMiApCi0gICAgICAgICAgZ290byBFeGl0MjsKLQotICAgICAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMHg4MDsKLQotICAgICAgICB0eXBlID0gZmxhZ3MgPj4gODsKLSAgICAgICAgbGVuICA9IHJsZW47Ci0KLSAgICAgICAgcGZiX2RhdGFbcGZiX3BvcysrXSA9IChGVF9CeXRlKXR5cGU7Ci0gICAgICAgIHBmYl9sZW5wb3MgICAgICAgICAgPSBwZmJfcG9zOwotICAgICAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMDsgICAgICAgIC8qIDQtYnl0ZSBsZW5ndGgsIGZpbGwgaW4gbGF0ZXIgKi8KLSAgICAgICAgcGZiX2RhdGFbcGZiX3BvcysrXSA9IDA7Ci0gICAgICAgIHBmYl9kYXRhW3BmYl9wb3MrK10gPSAwOwotICAgICAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBwZmJfcG9zID4gcGZiX2xlbiB8fCBwZmJfcG9zICsgcmxlbiA+IHBmYl9sZW4gKQotICAgICAgICBnb3RvIEV4aXQyOwotCi0gICAgICBGVF9UUkFDRTMoKCAiICAgIExvYWQgUE9TVCBmcmFnbWVudCAjJWQgKCVkIGJ5dGUpIHRvIGJ1ZmZlciIKLSAgICAgICAgICAgICAgICAgICIgJXAgKyAweCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICBpLCBybGVuLCBwZmJfZGF0YSwgcGZiX3BvcyApKTsKLQotICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSAqKXBmYl9kYXRhICsgcGZiX3BvcywgcmxlbiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDI7Ci0KLSAgICAgIHBmYl9wb3MgKz0gcmxlbjsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX0VSUiggQXJyYXlfVG9vX0xhcmdlICk7Ci0KLSAgICBpZiAoIHBmYl9wb3MgKyAyID4gcGZiX2xlbiArIDIgKQotICAgICAgZ290byBFeGl0MjsKLSAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMHg4MDsKLSAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMzsKLQotICAgIGlmICggcGZiX2xlbnBvcyArIDMgPiBwZmJfbGVuICsgMiApCi0gICAgICBnb3RvIEV4aXQyOwotICAgIHBmYl9kYXRhW3BmYl9sZW5wb3MgICAgXSA9IChGVF9CeXRlKSggbGVuICk7Ci0gICAgcGZiX2RhdGFbcGZiX2xlbnBvcyArIDFdID0gKEZUX0J5dGUpKCBsZW4gPj4gOCApOwotICAgIHBmYl9kYXRhW3BmYl9sZW5wb3MgKyAyXSA9IChGVF9CeXRlKSggbGVuID4+IDE2ICk7Ci0gICAgcGZiX2RhdGFbcGZiX2xlbnBvcyArIDNdID0gKEZUX0J5dGUpKCBsZW4gPj4gMjQgKTsKLQotICAgIHJldHVybiBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZiX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZiX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLQotICBFeGl0MjoKLSAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIEFycmF5X1Rvb19MYXJnZSApICkKLSAgICAgIEZUX1RSQUNFMigoICIgIEFib3J0IGR1ZSB0byB0b28tc2hvcnQgYnVmZmVyIHRvIHN0b3JlIgotICAgICAgICAgICAgICAgICAgIiBhbGwgUE9TVCBmcmFnbWVudHNcbiIgKSk7Ci0gICAgZWxzZSBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIEludmFsaWRfT2Zmc2V0ICkgKQotICAgICAgRlRfVFJBQ0UyKCggIiAgQWJvcnQgZHVlIHRvIGludmFsaWQgb2Zmc2V0IGluIGEgUE9TVCBmcmFnbWVudFxuIiApKTsKLQotICAgIGlmICggZXJyb3IgKQotICAgICAgZXJyb3IgPSBGVF9FUlIoIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0gICAgRlRfRlJFRSggcGZiX2RhdGEgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogVGhlIHJlc291cmNlIGhlYWRlciBzYXlzIHdlJ3ZlIGdvdCByZXNvdXJjZV9jbnQgYHNmbnQnICAgICAgKi8KLSAgLyogKFRydWVUeXBlL09wZW5UeXBlKSByZXNvdXJjZXMgaW4gdGhpcyBmaWxlLiAgTG9vayB0aHJvdWdoICAgKi8KLSAgLyogdGhlbSBmb3IgdGhlIG9uZSBpbmRpY2F0ZWQgYnkgZmFjZV9pbmRleCwgbG9hZCBpdCBpbnRvIG1lbSwgKi8KLSAgLyogcGFzcyBpdCBvbiB0byB0aGUgdHJ1ZXR5cGUgZHJpdmVyLCBhbmQgcmV0dXJuIGl0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIE1hY19SZWFkX3NmbnRfUmVzb3VyY2UoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmVzb3VyY2VfY250LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9CeXRlKiAgIHNmbnRfZGF0YSA9IE5VTEw7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgIGZsYWdfb2Zmc2V0OwotICAgIEZUX0xvbmcgICAgcmxlbjsKLSAgICBpbnQgICAgICAgIGlzX2NmZjsKLSAgICBGVF9Mb25nICAgIGZhY2VfaW5kZXhfaW5fcmVzb3VyY2UgPSAwOwotCi0KLSAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgIGZhY2VfaW5kZXggPSAtZmFjZV9pbmRleCAtIDE7Ci0gICAgaWYgKCBmYWNlX2luZGV4ID49IHJlc291cmNlX2NudCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0KLSAgICBmbGFnX29mZnNldCA9IChGVF9VTG9uZylvZmZzZXRzW2ZhY2VfaW5kZXhdOwotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgZmxhZ19vZmZzZXQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfUkVBRF9MT05HKCBybGVuICkgKQotICAgICAgZ290byBFeGl0OwotICAgIGlmICggcmxlbiA8IDEgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIGlmICggKEZUX1VMb25nKXJsZW4gPiBGVF9NQUNfUkZPUktfTUFYX0xFTiApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT2Zmc2V0ICk7Ci0KLSAgICBlcnJvciA9IG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiByZXdpbmQgc2ZudCBzdHJlYW0gYmVmb3JlIG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCkgKi8KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIGZsYWdfb2Zmc2V0ICsgNCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9BTExPQyggc2ZudF9kYXRhLCBybGVuICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIGVycm9yID0gRlRfU3RyZWFtX1JlYWQoIHN0cmVhbSwgKEZUX0J5dGUgKilzZm50X2RhdGEsIChGVF9VTG9uZylybGVuICk7Ci0gICAgaWYgKCBlcnJvciApIHsKLSAgICAgIEZUX0ZSRUUoIHNmbnRfZGF0YSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlzX2NmZiA9IHJsZW4gPiA0ICYmICFmdF9tZW1jbXAoIHNmbnRfZGF0YSwgIk9UVE8iLCA0ICk7Ci0gICAgZXJyb3IgPSBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKXJsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXhfaW5fcmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NmZiA/ICJjZmYiIDogInRydWV0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgcmVzb3VyY2UgZm9yayBoZWFkZXIsIG9yIGEgdmFsaWQgZGZvbnQgICAgKi8KLSAgLyogaGVhZGVyLiAgSW4gYSByZXNvdXJjZSBmb3JrIHRoZSBmaXJzdCAxNiBieXRlcyBhcmUgcmVwZWF0ZWQgKi8KLSAgLyogYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBieXRlcyA0LTcuICBJbiBhIGRmb250IGJ5dGVzICAgKi8KLSAgLyogNC03IHBvaW50IHRvIDE2IGJ5dGVzIG9mIHplcm9lcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIElzTWFjUmVzb3VyY2UoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmVzb3VyY2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX0xvbmcgICAgbWFwX29mZnNldCwgcmRhdGFfcG9zOwotICAgIEZUX0xvbmcgICAgKmRhdGFfb2Zmc2V0czsKLSAgICBGVF9Mb25nICAgIGNvdW50OwotCi0KLSAgICBlcnJvciA9IEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8oIGxpYnJhcnksIHN0cmVhbSwgcmVzb3VyY2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9vZmZzZXQsICZyZGF0YV9wb3MgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIFBPU1QgcmVzb3VyY2VzIG11c3QgYmUgc29ydGVkIHRvIGNvbmNhdGVuYXRlIHByb3Blcmx5ICovCi0gICAgZXJyb3IgPSBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyggbGlicmFyeSwgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9vZmZzZXQsIHJkYXRhX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEFHX1BPU1QsIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfb2Zmc2V0cywgJmNvdW50ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gTWFjX1JlYWRfUE9TVF9SZXNvdXJjZSggbGlicmFyeSwgc3RyZWFtLCBkYXRhX29mZnNldHMsIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LCBhZmFjZSApOwotICAgICAgRlRfRlJFRSggZGF0YV9vZmZzZXRzICk7Ci0gICAgICAvKiBQT1NUIGV4aXN0cyBpbiBhbiBMV0ZOIHByb3ZpZGluZyBhIHNpbmdsZSBmYWNlICovCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICgqYWZhY2UpLT5udW1fZmFjZXMgPSAxOwotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIC8qIHNmbnQgcmVzb3VyY2VzIHNob3VsZCBub3QgYmUgc29ydGVkIHRvIHByZXNlcnZlIHRoZSBmYWNlIG9yZGVyIGJ5Ci0gICAgICAgUXVpY2tEcmF3IEFQSSAqLwotICAgIGVycm9yID0gRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMoIGxpYnJhcnksIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfb2Zmc2V0LCByZGF0YV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRBR19zZm50LCBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YV9vZmZzZXRzLCAmY291bnQgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfTG9uZyAgZmFjZV9pbmRleF9pbnRlcm5hbCA9IGZhY2VfaW5kZXggJSBjb3VudDsKLQotCi0gICAgICBlcnJvciA9IE1hY19SZWFkX3NmbnRfUmVzb3VyY2UoIGxpYnJhcnksIHN0cmVhbSwgZGF0YV9vZmZzZXRzLCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleF9pbnRlcm5hbCwgYWZhY2UgKTsKLSAgICAgIEZUX0ZSRUUoIGRhdGFfb2Zmc2V0cyApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAoKmFmYWNlKS0+bnVtX2ZhY2VzID0gY291bnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDaGVjayBmb3IgYSB2YWxpZCBtYWNiaW5hcnkgaGVhZGVyLCBhbmQgaWYgd2UgZmluZCBvbmUgICAqLwotICAvKiBjaGVjayB0aGF0IHRoZSAoZmxhdHRlbmVkKSByZXNvdXJjZSBmb3JrIGluIGl0IGlzIHZhbGlkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgSXNNYWNCaW5hcnkoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgRlRfRmFjZSAgICAqYWZhY2UgKQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAgaGVhZGVyWzEyOF07Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgRlRfTG9uZyAgICAgICAgZGxlbiwgb2Zmc2V0OwotCi0KLSAgICBpZiAoICFzdHJlYW0gKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSopaGVhZGVyLCAxMjggKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggICAgICAgICAgICBoZWFkZXJbIDBdICE9ICAgMCB8fAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNzRdICE9ICAgMCB8fAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbODJdICE9ICAgMCB8fAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbIDFdID09ICAgMCB8fAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbIDFdID4gICAzMyB8fAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNjNdICE9ICAgMCB8fAotICAgICAgICAgaGVhZGVyWzIgKyBoZWFkZXJbMV1dICE9ICAgMCB8fAotICAgICAgICAgICAgICAgICAgaGVhZGVyWzB4NTNdID4gMHg3RiApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIGRsZW4gPSAoIGhlYWRlclsweDUzXSA8PCAyNCApIHwKLSAgICAgICAgICAgKCBoZWFkZXJbMHg1NF0gPDwgMTYgKSB8Ci0gICAgICAgICAgICggaGVhZGVyWzB4NTVdIDw8ICA4ICkgfAotICAgICAgICAgICAgIGhlYWRlclsweDU2XTsKLSNpZiAwCi0gICAgcmxlbiA9ICggaGVhZGVyWzB4NTddIDw8IDI0ICkgfAotICAgICAgICAgICAoIGhlYWRlclsweDU4XSA8PCAxNiApIHwKLSAgICAgICAgICAgKCBoZWFkZXJbMHg1OV0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgaGVhZGVyWzB4NUFdOwotI2VuZGlmIC8qIDAgKi8KLSAgICBvZmZzZXQgPSAxMjggKyAoICggZGxlbiArIDEyNyApICYgfjEyNyApOwotCi0gICAgcmV0dXJuIElzTWFjUmVzb3VyY2UoIGxpYnJhcnksIHN0cmVhbSwgb2Zmc2V0LCBmYWNlX2luZGV4LCBhZmFjZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF9mYWNlX2luX2VtYmVkZGVkX3Jmb3JrKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgKmFmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyAgKmFyZ3MgKQotICB7Ci0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcmFjY2VzcwotCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FUlIoIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICBGVF9VSW50ICAgIGk7Ci0KLSAgICBjaGFyICogICAgIGZpbGVfbmFtZXNbRlRfUkFDQ0VTU19OX1JVTEVTXTsKLSAgICBGVF9Mb25nICAgIG9mZnNldHNbRlRfUkFDQ0VTU19OX1JVTEVTXTsKLSAgICBGVF9FcnJvciAgIGVycm9yc1tGVF9SQUNDRVNTX05fUlVMRVNdOwotICAgIEZUX0Jvb2wgICAgaXNfZGFyd2luX3ZmcywgdmZzX3Jmb3JrX2hhc19ub19mb250ID0gRkFMU0U7IC8qIG5vdCB0ZXN0ZWQgKi8KLQotICAgIEZUX09wZW5fQXJncyAgYXJnczI7Ci0gICAgRlRfU3RyZWFtICAgICBzdHJlYW0yID0gTlVMTDsKLQotCi0gICAgRlRfUmFjY2Vzc19HdWVzcyggbGlicmFyeSwgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPnBhdGhuYW1lLCBmaWxlX25hbWVzLCBvZmZzZXRzLCBlcnJvcnMgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfUkFDQ0VTU19OX1JVTEVTOyBpKysgKQotICAgIHsKLSAgICAgIGlzX2Rhcndpbl92ZnMgPSBmdF9yYWNjZXNzX3J1bGVfYnlfZGFyd2luX3ZmcyggbGlicmFyeSwgaSApOwotICAgICAgaWYgKCBpc19kYXJ3aW5fdmZzICYmIHZmc19yZm9ya19oYXNfbm9fZm9udCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMygoICJTa2lwIHJ1bGUgJWQ6IGRhcndpbiB2ZnMgcmVzb3VyY2UgZm9yayIKLSAgICAgICAgICAgICAgICAgICAgIiBpcyBhbHJlYWR5IGNoZWNrZWQgYW5kIgotICAgICAgICAgICAgICAgICAgICAiIG5vIGZvbnQgaXMgZm91bmRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGkgKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGVycm9yc1tpXSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMygoICJFcnJvciAweCV4IGhhcyBvY2N1cnJlZCBpbiBydWxlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBlcnJvcnNbaV0sIGkgKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBhcmdzMi5mbGFncyAgICA9IEZUX09QRU5fUEFUSE5BTUU7Ci0gICAgICBhcmdzMi5wYXRobmFtZSA9IGZpbGVfbmFtZXNbaV0gPyBmaWxlX25hbWVzW2ldIDogYXJncy0+cGF0aG5hbWU7Ci0KLSAgICAgIEZUX1RSQUNFMygoICJUcnkgcnVsZSAlZDogJXMgKG9mZnNldD0lZCkgLi4uIiwKLSAgICAgICAgICAgICAgICAgIGksIGFyZ3MyLnBhdGhuYW1lLCBvZmZzZXRzW2ldICkpOwotCi0gICAgICBlcnJvciA9IEZUX1N0cmVhbV9OZXcoIGxpYnJhcnksICZhcmdzMiwgJnN0cmVhbTIgKTsKLSAgICAgIGlmICggaXNfZGFyd2luX3ZmcyAmJiBGVF9FUlJfRVEoIGVycm9yLCBDYW5ub3RfT3Blbl9TdHJlYW0gKSApCi0gICAgICAgIHZmc19yZm9ya19oYXNfbm9fZm9udCA9IFRSVUU7Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTMoKCAiZmFpbGVkXG4iICkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBJc01hY1Jlc291cmNlKCBsaWJyYXJ5LCBzdHJlYW0yLCBvZmZzZXRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LCBhZmFjZSApOwotICAgICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbTIsIDAgKTsKLQotICAgICAgRlRfVFJBQ0UzKCggIiVzXG4iLCBlcnJvciA/ICJmYWlsZWQiOiAic3VjY2Vzc2Z1bCIgKSk7Ci0KLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIGVsc2UgaWYgKCBpc19kYXJ3aW5fdmZzICkKLSAgICAgICAgICB2ZnNfcmZvcmtfaGFzX25vX2ZvbnQgPSBUUlVFOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBGVF9SQUNDRVNTX05fUlVMRVM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIGZpbGVfbmFtZXNbaV0gKQotICAgICAgICBGVF9GUkVFKCBmaWxlX25hbWVzW2ldICk7Ci0gICAgfQotCi0gICAgLyogQ2FsbGVyIChsb2FkX21hY19mYWNlKSByZXF1aXJlcyBGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdC4gKi8KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGVycm9yID0gRlRfRVJSKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb2JqcwotCi0gIH0KLQotCi0gIC8qIENoZWNrIGZvciBzb21lIG1hY2ludG9zaCBmb3JtYXRzIHdpdGhvdXQgQ2FyYm9uIGZyYW1ld29yay4gICAgKi8KLSAgLyogSXMgdGhpcyBhIG1hY2JpbmFyeSBmaWxlPyAgSWYgc28gbG9vayBhdCB0aGUgcmVzb3VyY2UgZm9yay4gICAqLwotICAvKiBJcyB0aGlzIGEgbWFjIGRmb250IGZpbGU/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElzIHRoaXMgYW4gb2xkIHN0eWxlIHJlc291cmNlIGZvcms/IChpbiBkYXRhKSAgICAgICAgICAgICAgICAgKi8KLSAgLyogRWxzZSBjYWxsIGxvYWRfZmFjZV9pbl9lbWJlZGRlZF9yZm9yayB0byB0cnkgZXh0cmEgcnVsZXMgICAgICAqLwotICAvKiAoZGVmaW5lZCBpbiBgZnRyZm9yay5jJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGxvYWRfbWFjX2ZhY2UoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAqYWZhY2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyAgKmFyZ3MgKQotICB7Ci0gICAgRlRfRXJyb3IgZXJyb3I7Ci0gICAgRlRfVU5VU0VEKCBhcmdzICk7Ci0KLQotICAgIGVycm9yID0gSXNNYWNCaW5hcnkoIGxpYnJhcnksIHN0cmVhbSwgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIFVua25vd25fRmlsZV9Gb3JtYXQgKSApCi0gICAgewotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3JhY2Nlc3MKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICBGVF9UUkFDRTMoKCAiVHJ5IGFzIGRmb250OiAiICkpOwotICAgICAgaWYgKCAhKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fTUVNT1JZICkgKQotICAgICAgICBGVF9UUkFDRTMoKCAiJXMgLi4uIiwgYXJncy0+cGF0aG5hbWUgKSk7Ci0jZW5kaWYKLQotICAgICAgZXJyb3IgPSBJc01hY1Jlc291cmNlKCBsaWJyYXJ5LCBzdHJlYW0sIDAsIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0KLSAgICAgIEZUX1RSQUNFMygoICIlc1xuIiwgZXJyb3IgPyAiZmFpbGVkIiA6ICJzdWNjZXNzZnVsIiApKTsKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vYmpzCi0KLSAgICB9Ci0KLSAgICBpZiAoICggRlRfRVJSX0VRKCBlcnJvciwgVW5rbm93bl9GaWxlX0Zvcm1hdCApICAgICAgfHwKLSAgICAgICAgICAgRlRfRVJSX0VRKCBlcnJvciwgSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICkgKSAmJgotICAgICAgICAgKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fUEFUSE5BTUUgKSAgICAgICAgICAgICAgICkKLSAgICAgIGVycm9yID0gbG9hZF9mYWNlX2luX2VtYmVkZGVkX3Jmb3JrKCBsaWJyYXJ5LCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwgYWZhY2UsIGFyZ3MgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLSNlbmRpZgotCi0jZW5kaWYgIC8qICFGVF9NQUNJTlRPU0ggJiYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMgKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3Blbl9GYWNlKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyogIGFyZ3MsCi0gICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICphZmFjZSApCi0gIHsKLSAgICByZXR1cm4gZnRfb3Blbl9mYWNlX2ludGVybmFsKCBsaWJyYXJ5LCBhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSwgMSApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfb3Blbl9mYWNlX2ludGVybmFsKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyogIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICphZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgICAgICB0ZXN0X21hY19mb250cyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgRlRfRHJpdmVyICAgIGRyaXZlciA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgIG1lbW9yeSA9IE5VTEw7Ci0gICAgRlRfU3RyZWFtICAgIHN0cmVhbSA9IE5VTEw7Ci0gICAgRlRfRmFjZSAgICAgIGZhY2UgICA9IE5VTEw7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGUgICA9IE5VTEw7Ci0gICAgRlRfQm9vbCAgICAgIGV4dGVybmFsX3N0cmVhbTsKLSAgICBGVF9Nb2R1bGUqICAgY3VyOwotICAgIEZUX01vZHVsZSogICBsaW1pdDsKLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwotICAgIEZUX1VOVVNFRCggdGVzdF9tYWNfZm9udHMgKTsKLSNlbmRpZgotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgIEZUX1RSQUNFMygoICJGVF9PcGVuX0ZhY2U6ICIgKSk7Ci0gICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICBGVF9UUkFDRTMoKCAiUmVxdWVzdGluZyBudW1iZXIgb2YgZmFjZXMgYW5kIG5hbWVkIGluc3RhbmNlc1xuIikpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9UUkFDRTMoKCAiUmVxdWVzdGluZyBmYWNlICVsZCIsIGZhY2VfaW5kZXggJiAweEZGRkZMICkpOwotICAgICAgaWYgKCBmYWNlX2luZGV4ICYgMHg3RkZGMDAwMEwgKQotICAgICAgICBGVF9UUkFDRTMoKCAiLCBuYW1lZCBpbnN0YW5jZSAlbGQiLCBmYWNlX2luZGV4ID4+IDE2ICkpOwotICAgICAgRlRfVFJBQ0UzKCggIlxuIiApKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBkZWxheWVkIHRvIGBGVF9TdHJlYW1fTmV3JyAqLwotCi0gICAgaWYgKCAoICFhZmFjZSAmJiBmYWNlX2luZGV4ID49IDAgKSB8fCAhYXJncyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGV4dGVybmFsX3N0cmVhbSA9IEZUX0JPT0woICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1NUUkVBTSApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+c3RyZWFtICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgIC8qIGNyZWF0ZSBpbnB1dCBzdHJlYW0gKi8KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9OZXcoIGxpYnJhcnksIGFyZ3MsICZzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDM7Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICAvKiBJZiB0aGUgZm9udCBkcml2ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBgYXJncycgc3RydWN0dXJlLCB1c2UgKi8KLSAgICAvKiBpdC4gIE90aGVyd2lzZSwgd2Ugc2NhbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGRyaXZlcnMuICAgICAgKi8KLSAgICBpZiAoICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX0RSSVZFUiApICYmIGFyZ3MtPmRyaXZlciApCi0gICAgewotICAgICAgZHJpdmVyID0gRlRfRFJJVkVSKCBhcmdzLT5kcml2ZXIgKTsKLQotICAgICAgLyogbm90IGFsbCBtb2R1bGVzIGFyZSBkcml2ZXJzLCBzbyBjaGVjay4uLiAqLwotICAgICAgaWYgKCBGVF9NT0RVTEVfSVNfRFJJVkVSKCBkcml2ZXIgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMgPSAwOwotICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgICAgID0gTlVMTDsKLQotCi0gICAgICAgIGlmICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1BBUkFNUyApCi0gICAgICAgIHsKLSAgICAgICAgICBudW1fcGFyYW1zID0gYXJncy0+bnVtX3BhcmFtczsKLSAgICAgICAgICBwYXJhbXMgICAgID0gYXJncy0+cGFyYW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyb3IgPSBvcGVuX2ZhY2UoIGRyaXZlciwgJnN0cmVhbSwgZXh0ZXJuYWxfc3RyZWFtLCBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcmFtcywgcGFyYW1zLCAmZmFjZSApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgZ290byBTdWNjZXNzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0hhbmRsZSApOwotCi0gICAgICBGVF9TdHJlYW1fRnJlZSggc3RyZWFtLCBleHRlcm5hbF9zdHJlYW0gKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBNaXNzaW5nX01vZHVsZSApOwotCi0gICAgICAvKiBjaGVjayBlYWNoIGZvbnQgZHJpdmVyIGZvciBhbiBhcHByb3ByaWF0ZSBmb3JtYXQgKi8KLSAgICAgIGN1ciAgID0gbGlicmFyeS0+bW9kdWxlczsKLSAgICAgIGxpbWl0ID0gY3VyICsgbGlicmFyeS0+bnVtX21vZHVsZXM7Ci0KLSAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgIHsKLSAgICAgICAgLyogbm90IGFsbCBtb2R1bGVzIGFyZSBmb250IGRyaXZlcnMsIHNvIGNoZWNrLi4uICovCi0gICAgICAgIGlmICggRlRfTU9EVUxFX0lTX0RSSVZFUiggY3VyWzBdICkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcyA9IDA7Ci0gICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICAgICA9IE5VTEw7Ci0KLQotICAgICAgICAgIGRyaXZlciA9IEZUX0RSSVZFUiggY3VyWzBdICk7Ci0KLSAgICAgICAgICBpZiAoIGFyZ3MtPmZsYWdzICYgRlRfT1BFTl9QQVJBTVMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG51bV9wYXJhbXMgPSBhcmdzLT5udW1fcGFyYW1zOwotICAgICAgICAgICAgcGFyYW1zICAgICA9IGFyZ3MtPnBhcmFtczsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlcnJvciA9IG9wZW5fZmFjZSggZHJpdmVyLCAmc3RyZWFtLCBleHRlcm5hbF9zdHJlYW0sIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXMsIHBhcmFtcywgJmZhY2UgKTsKLSAgICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgICBnb3RvIFN1Y2Nlc3M7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwotICAgICAgICAgIGlmICggdGVzdF9tYWNfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGZ0X3N0cmNtcCggY3VyWzBdLT5jbGF6ei0+bW9kdWxlX25hbWUsICJ0cnVldHlwZSIgKSA9PSAwICYmCi0gICAgICAgICAgICAgICBGVF9FUlJfRVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogVHJ1ZVR5cGUgYnV0IGVzc2VudGlhbCB0YWJsZXMgYXJlIG1pc3NpbmcgKi8KLSAgICAgICAgICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgMCApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBlcnJvciA9IG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmFjZSApOwotICAgICAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9TdHJlYW1fRnJlZSggc3RyZWFtLCBleHRlcm5hbF9zdHJlYW0gKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgaWYgKCBGVF9FUlJfTkVRKCBlcnJvciwgVW5rbm93bl9GaWxlX0Zvcm1hdCApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDM7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIEZhaWwzOgotICAgICAgLyogSWYgd2UgYXJlIG9uIHRoZSBtYWMsIGFuZCB3ZSBnZXQgYW4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uIGl0IG1heSBiZSBiZWNhdXNlIHdlIGhhdmUgYW4gKi8KLSAgICAgIC8qIGVtcHR5IGRhdGEgZm9yaywgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgcmVzb3VyY2UgZm9yay4gICAgICAqLwotICAgICAgaWYgKCBGVF9FUlJfTkVRKCBlcnJvciwgQ2Fubm90X09wZW5fU3RyZWFtICkgICAgICAgJiYKLSAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIFVua25vd25fRmlsZV9Gb3JtYXQgKSAgICAgICYmCi0gICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKSApCi0gICAgICAgIGdvdG8gRmFpbDI7Ci0KLSNpZiAhZGVmaW5lZCggRlRfTUFDSU5UT1NIICkgJiYgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMgKQotICAgICAgaWYgKCB0ZXN0X21hY19mb250cyApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gbG9hZF9tYWNfZmFjZSggbGlicmFyeSwgc3RyZWFtLCBmYWNlX2luZGV4LCBhZmFjZSwgYXJncyApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGdvIHRvIFN1Y2Nlc3MgaGVyZS4gIFdlJ3ZlIGFscmVhZHkgZG9uZSAgICovCi0gICAgICAgICAgLyogdGhhdC4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBzdWNjZWVkZWQgd2Ugc3RpbGwgbmVlZCB0byAqLwotICAgICAgICAgIC8qIGNsb3NlIHRoaXMgc3RyZWFtICh3ZSBvcGVuZWQgYSBkaWZmZXJlbnQgc3RyZWFtIHdoaWNoICAgICAgKi8KLSAgICAgICAgICAvKiBleHRyYWN0ZWQgdGhlIGludGVyZXN0aW5nIGluZm9ybWF0aW9uIG91dCBvZiB0aGlzIHN0cmVhbSAgICovCi0gICAgICAgICAgLyogaGVyZS4gIFRoYXQgc3RyZWFtIHdpbGwgc3RpbGwgYmUgb3BlbiBhbmQgdGhlIGZhY2Ugd2lsbCAgICAqLwotICAgICAgICAgIC8qIHBvaW50IHRvIGl0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBGVF9TdHJlYW1fRnJlZSggc3RyZWFtLCBleHRlcm5hbF9zdHJlYW0gKTsKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBGVF9FUlJfTkVRKCBlcnJvciwgVW5rbm93bl9GaWxlX0Zvcm1hdCApICkKLSAgICAgICAgZ290byBGYWlsMjsKLSNlbmRpZiAgLyogIUZUX01BQ0lOVE9TSCAmJiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUyAqLwotCi0gICAgICAvKiBubyBkcml2ZXIgaXMgYWJsZSB0byBoYW5kbGUgdGhpcyBmb3JtYXQgKi8KLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICBGYWlsMjoKLSAgICAgIEZUX1N0cmVhbV9GcmVlKCBzdHJlYW0sIGV4dGVybmFsX3N0cmVhbSApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICBTdWNjZXNzOgotICAgIEZUX1RSQUNFNCgoICJGVF9PcGVuX0ZhY2U6IE5ldyBmYWNlIG9iamVjdCwgYWRkaW5nIHRvIGxpc3RcbiIgKSk7Ci0KLSAgICAvKiBhZGQgdGhlIGZhY2Ugb2JqZWN0IHRvIGl0cyBkcml2ZXIncyBsaXN0ICovCi0gICAgaWYgKCBGVF9ORVcoIG5vZGUgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBub2RlLT5kYXRhID0gZmFjZTsKLSAgICAvKiBkb24ndCBhc3N1bWUgZHJpdmVyIGlzIHRoZSBzYW1lIGFzIGZhY2UtPmRyaXZlciwgc28gdXNlICovCi0gICAgLyogZmFjZS0+ZHJpdmVyIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0xpc3RfQWRkKCAmZmFjZS0+ZHJpdmVyLT5mYWNlc19saXN0LCBub2RlICk7Ci0KLSAgICAvKiBub3cgYWxsb2NhdGUgYSBnbHlwaCBzbG90IG9iamVjdCBmb3IgdGhlIGZhY2UgKi8KLSAgICBGVF9UUkFDRTQoKCAiRlRfT3Blbl9GYWNlOiBDcmVhdGluZyBnbHlwaCBzbG90XG4iICkpOwotCi0gICAgaWYgKCBmYWNlX2luZGV4ID49IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfTmV3X0dseXBoU2xvdCggZmFjZSwgTlVMTCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgLyogZmluYWxseSwgYWxsb2NhdGUgYSBzaXplIG9iamVjdCBmb3IgdGhlIGZhY2UgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfU2l6ZSAgc2l6ZTsKLQotCi0gICAgICAgIEZUX1RSQUNFNCgoICJGVF9PcGVuX0ZhY2U6IENyZWF0aW5nIHNpemUgb2JqZWN0XG4iICkpOwotCi0gICAgICAgIGVycm9yID0gRlRfTmV3X1NpemUoIGZhY2UsICZzaXplICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBmYWNlLT5zaXplID0gc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzb21lIGNoZWNrcyAqLwotCi0gICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggZmFjZSApICkKLSAgICB7Ci0gICAgICBpZiAoIGZhY2UtPmhlaWdodCA8IDAgKQotICAgICAgICBmYWNlLT5oZWlnaHQgPSAoRlRfU2hvcnQpLWZhY2UtPmhlaWdodDsKLQotICAgICAgaWYgKCAhRlRfSEFTX1ZFUlRJQ0FMKCBmYWNlICkgKQotICAgICAgICBmYWNlLT5tYXhfYWR2YW5jZV9oZWlnaHQgPSAoRlRfU2hvcnQpZmFjZS0+aGVpZ2h0OwotICAgIH0KLQotICAgIGlmICggRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkgKQotICAgIHsKLSAgICAgIEZUX0ludCAgaTsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2UtPm51bV9maXhlZF9zaXplczsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfQml0bWFwX1NpemUqICBic2l6ZSA9IGZhY2UtPmF2YWlsYWJsZV9zaXplcyArIGk7Ci0KLQotICAgICAgICBpZiAoIGJzaXplLT5oZWlnaHQgPCAwICkKLSAgICAgICAgICBic2l6ZS0+aGVpZ2h0ID0gLWJzaXplLT5oZWlnaHQ7Ci0gICAgICAgIGlmICggYnNpemUtPnhfcHBlbSA8IDAgKQotICAgICAgICAgIGJzaXplLT54X3BwZW0gPSAtYnNpemUtPnhfcHBlbTsKLSAgICAgICAgaWYgKCBic2l6ZS0+eV9wcGVtIDwgMCApCi0gICAgICAgICAgYnNpemUtPnlfcHBlbSA9IC1ic2l6ZS0+eV9wcGVtOwotCi0gICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgbmVnYXRpb24gYWN0dWFsbHkgaGFzIHdvcmtlZCAqLwotICAgICAgICBpZiAoIGJzaXplLT5oZWlnaHQgPCAwIHx8IGJzaXplLT54X3BwZW0gPCAwIHx8IGJzaXplLT55X3BwZW0gPCAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMCgoICJGVF9PcGVuX0ZhY2U6IgotICAgICAgICAgICAgICAgICAgICAgICIgSW52YWxpZCBiaXRtYXAgZGltZW5zaW9ucyBmb3Igc3RyaWtlICVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAiIG5vdyBkaXNhYmxlZFxuIiwgaSApKTsKLSAgICAgICAgICBic2l6ZS0+d2lkdGggID0gMDsKLSAgICAgICAgICBic2l6ZS0+aGVpZ2h0ID0gMDsKLSAgICAgICAgICBic2l6ZS0+c2l6ZSAgID0gMDsKLSAgICAgICAgICBic2l6ZS0+eF9wcGVtID0gMDsKLSAgICAgICAgICBic2l6ZS0+eV9wcGVtID0gMDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgaW50ZXJuYWwgZmFjZSBkYXRhICovCi0gICAgewotICAgICAgRlRfRmFjZV9JbnRlcm5hbCAgaW50ZXJuYWwgPSBmYWNlLT5pbnRlcm5hbDsKLQotCi0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC54eCA9IDB4MTAwMDBMOwotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueHkgPSAwOwotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueXggPSAwOwotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueXkgPSAweDEwMDAwTDsKLQotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9kZWx0YS54ID0gMDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEueSA9IDA7Ci0KLSAgICAgIGludGVybmFsLT5yZWZjb3VudCA9IDE7Ci0KLSAgICAgIGludGVybmFsLT5ub19zdGVtX2RhcmtlbmluZyA9IC0xOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLSAgICAgIGZ0X21lbXNldCggaW50ZXJuYWwtPmxjZF93ZWlnaHRzLCAwLCBGVF9MQ0RfRklMVEVSX0ZJVkVfVEFQUyApOwotI2VuZGlmCi0gICAgfQotCi0gICAgaWYgKCBhZmFjZSApCi0gICAgICAqYWZhY2UgPSBmYWNlOwotICAgIGVsc2UKLSAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOwotCi0gICAgZ290byBFeGl0OwotCi0gIEZhaWw6Ci0gICAgaWYgKCBub2RlICkKLSAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOyAgICAvKiBmYWNlIG11c3QgYmUgaW4gdGhlIGRyaXZlcidzIGxpc3QgKi8KLSAgICBlbHNlIGlmICggZmFjZSApCi0gICAgICBkZXN0cm95X2ZhY2UoIG1lbW9yeSwgZmFjZSwgZHJpdmVyICk7Ci0KLSAgRXhpdDoKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgIGlmICggIWVycm9yICYmIGZhY2VfaW5kZXggPCAwICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTMoKCAiRlRfT3Blbl9GYWNlOiBUaGUgZm9udCBoYXMgJWxkIGZhY2Ulc1xuIgotICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgYW5kICVsZCBuYW1lZCBpbnN0YW5jZSVzIGZvciBmYWNlICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9mYWNlcywKLSAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9mYWNlcyA9PSAxID8gIiIgOiAicyIsCi0gICAgICAgICAgICAgICAgICBmYWNlLT5zdHlsZV9mbGFncyA+PiAxNiwKLSAgICAgICAgICAgICAgICAgICggZmFjZS0+c3R5bGVfZmxhZ3MgPj4gMTYgKSA9PSAxID8gIiIgOiAicyIsCi0gICAgICAgICAgICAgICAgICAtZmFjZV9pbmRleCAtIDEgKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBGVF9UUkFDRTQoKCAiRlRfT3Blbl9GYWNlOiBSZXR1cm4gMHgleFxuIiwgZXJyb3IgKSk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfQXR0YWNoX0ZpbGUoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApCi0gIHsKLSAgICBGVF9PcGVuX0FyZ3MgIG9wZW47Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBmYWNlJyBkZWxheWVkIHRvIGBGVF9BdHRhY2hfU3RyZWFtJyAqLwotCi0gICAgaWYgKCAhZmlsZXBhdGhuYW1lICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgb3Blbi5zdHJlYW0gICA9IE5VTEw7Ci0gICAgb3Blbi5mbGFncyAgICA9IEZUX09QRU5fUEFUSE5BTUU7Ci0gICAgb3Blbi5wYXRobmFtZSA9IChjaGFyKilmaWxlcGF0aG5hbWU7Ci0KLSAgICByZXR1cm4gRlRfQXR0YWNoX1N0cmVhbSggZmFjZSwgJm9wZW4gKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9BdHRhY2hfU3RyZWFtKCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9PcGVuX0FyZ3MqICBwYXJhbWV0ZXJzICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfRHJpdmVyICBkcml2ZXI7Ci0KLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6OwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgcGFyYW1ldGVycycgZGVsYXllZCB0byBgRlRfU3RyZWFtX05ldycgKi8KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBkcml2ZXIgPSBmYWNlLT5kcml2ZXI7Ci0gICAgaWYgKCAhZHJpdmVyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Ecml2ZXJfSGFuZGxlICk7Ci0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9OZXcoIGRyaXZlci0+cm9vdC5saWJyYXJ5LCBwYXJhbWV0ZXJzLCAmc3RyZWFtICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiB3ZSBpbXBsZW1lbnQgRlRfQXR0YWNoX1N0cmVhbSBpbiBlYWNoIGRyaXZlciB0aHJvdWdoIHRoZSAqLwotICAgIC8qIGBhdHRhY2hfZmlsZScgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBlcnJvciA9IEZUX0VSUiggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgY2xhenogPSBkcml2ZXItPmNsYXp6OwotICAgIGlmICggY2xhenotPmF0dGFjaF9maWxlICkKLSAgICAgIGVycm9yID0gY2xhenotPmF0dGFjaF9maWxlKCBmYWNlLCBzdHJlYW0gKTsKLQotICAgIC8qIGNsb3NlIHRoZSBhdHRhY2hlZCBzdHJlYW0gKi8KLSAgICBGVF9TdHJlYW1fRnJlZSggc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAoRlRfQm9vbCkoIHBhcmFtZXRlcnMtPnN0cmVhbSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggcGFyYW1ldGVycy0+ZmxhZ3MgJiBGVF9PUEVOX1NUUkVBTSApICkgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZWZlcmVuY2VfRmFjZSggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgZmFjZS0+aW50ZXJuYWwtPnJlZmNvdW50Kys7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfRmFjZSggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgRlRfRHJpdmVyICAgIGRyaXZlcjsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotICAgIEZUX0xpc3ROb2RlICBub2RlOwotCi0KLSAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotICAgIGlmICggZmFjZSAmJiBmYWNlLT5kcml2ZXIgKQotICAgIHsKLSAgICAgIGZhY2UtPmludGVybmFsLT5yZWZjb3VudC0tOwotICAgICAgaWYgKCBmYWNlLT5pbnRlcm5hbC0+cmVmY291bnQgPiAwICkKLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRyaXZlciA9IGZhY2UtPmRyaXZlcjsKLSAgICAgICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLQotICAgICAgICAvKiBmaW5kIGZhY2UgaW4gZHJpdmVyJ3MgbGlzdCAqLwotICAgICAgICBub2RlID0gRlRfTGlzdF9GaW5kKCAmZHJpdmVyLT5mYWNlc19saXN0LCBmYWNlICk7Ci0gICAgICAgIGlmICggbm9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiByZW1vdmUgZmFjZSBvYmplY3QgZnJvbSB0aGUgZHJpdmVyJ3MgbGlzdCAqLwotICAgICAgICAgIEZUX0xpc3RfUmVtb3ZlKCAmZHJpdmVyLT5mYWNlc19saXN0LCBub2RlICk7Ci0gICAgICAgICAgRlRfRlJFRSggbm9kZSApOwotCi0gICAgICAgICAgLyogbm93IGRlc3Ryb3kgdGhlIG9iamVjdCBwcm9wZXIgKi8KLSAgICAgICAgICBkZXN0cm95X2ZhY2UoIG1lbW9yeSwgZmFjZSwgZHJpdmVyICk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX05ld19TaXplKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgIEZUX1NpemUgICphc2l6ZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OwotICAgIEZUX0RyaXZlciAgICAgICAgZHJpdmVyOwotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7Ci0KLSAgICBGVF9TaXplICAgICAgICAgIHNpemUgPSBOVUxMOwotICAgIEZUX0xpc3ROb2RlICAgICAgbm9kZSA9IE5VTEw7Ci0KLSAgICBGVF9TaXplX0ludGVybmFsICBpbnRlcm5hbCA9IE5VTEw7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFhc2l6ZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggIWZhY2UtPmRyaXZlciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRHJpdmVyX0hhbmRsZSApOwotCi0gICAgKmFzaXplID0gTlVMTDsKLQotICAgIGRyaXZlciA9IGZhY2UtPmRyaXZlcjsKLSAgICBjbGF6eiAgPSBkcml2ZXItPmNsYXp6OwotICAgIG1lbW9yeSA9IGZhY2UtPm1lbW9yeTsKLQotICAgIC8qIEFsbG9jYXRlIG5ldyBzaXplIG9iamVjdCBhbmQgcGVyZm9ybSBiYXNpYyBpbml0aWFsaXNhdGlvbiAqLwotICAgIGlmICggRlRfQUxMT0MoIHNpemUsIGNsYXp6LT5zaXplX29iamVjdF9zaXplICkgfHwgRlRfTkVXKCBub2RlICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2l6ZS0+ZmFjZSA9IGZhY2U7Ci0KLSAgICBpZiAoIEZUX05FVyggaW50ZXJuYWwgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzaXplLT5pbnRlcm5hbCA9IGludGVybmFsOwotCi0gICAgaWYgKCBjbGF6ei0+aW5pdF9zaXplICkKLSAgICAgIGVycm9yID0gY2xhenotPmluaXRfc2l6ZSggc2l6ZSApOwotCi0gICAgLyogaW4gY2FzZSBvZiBzdWNjZXNzLCBhZGQgdG8gdGhlIGZhY2UncyBsaXN0ICovCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgICphc2l6ZSAgICAgPSBzaXplOwotICAgICAgbm9kZS0+ZGF0YSA9IHNpemU7Ci0gICAgICBGVF9MaXN0X0FkZCggJmZhY2UtPnNpemVzX2xpc3QsIG5vZGUgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBub2RlICk7Ci0gICAgICBGVF9GUkVFKCBzaXplICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9Eb25lX1NpemUoIEZUX1NpemUgIHNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX0RyaXZlciAgICBkcml2ZXI7Ci0gICAgRlRfTWVtb3J5ICAgIG1lbW9yeTsKLSAgICBGVF9GYWNlICAgICAgZmFjZTsKLSAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKLQotCi0gICAgaWYgKCAhc2l6ZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU2l6ZV9IYW5kbGUgKTsKLQotICAgIGZhY2UgPSBzaXplLT5mYWNlOwotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBkcml2ZXIgPSBmYWNlLT5kcml2ZXI7Ci0gICAgaWYgKCAhZHJpdmVyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Ecml2ZXJfSGFuZGxlICk7Ci0KLSAgICBtZW1vcnkgPSBkcml2ZXItPnJvb3QubWVtb3J5OwotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgbm9kZSAgPSBGVF9MaXN0X0ZpbmQoICZmYWNlLT5zaXplc19saXN0LCBzaXplICk7Ci0gICAgaWYgKCBub2RlICkKLSAgICB7Ci0gICAgICBGVF9MaXN0X1JlbW92ZSggJmZhY2UtPnNpemVzX2xpc3QsIG5vZGUgKTsKLSAgICAgIEZUX0ZSRUUoIG5vZGUgKTsKLQotICAgICAgaWYgKCBmYWNlLT5zaXplID09IHNpemUgKQotICAgICAgewotICAgICAgICBmYWNlLT5zaXplID0gTlVMTDsKLSAgICAgICAgaWYgKCBmYWNlLT5zaXplc19saXN0LmhlYWQgKQotICAgICAgICAgIGZhY2UtPnNpemUgPSAoRlRfU2l6ZSkoZmFjZS0+c2l6ZXNfbGlzdC5oZWFkLT5kYXRhKTsKLSAgICAgIH0KLQotICAgICAgZGVzdHJveV9zaXplKCBtZW1vcnksIHNpemUsIGRyaXZlciApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1NpemVfSGFuZGxlICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9NYXRjaF9TaXplKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIGlnbm9yZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICBzaXplX2luZGV4ICkKLSAgewotICAgIEZUX0ludCAgIGk7Ci0gICAgRlRfTG9uZyAgdywgaDsKLQotCi0gICAgaWYgKCAhRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICAvKiBGVF9CaXRtYXBfU2l6ZSBkb2Vzbid0IHByb3ZpZGUgZW5vdWdoIGluZm8uLi4gKi8KLSAgICBpZiAoIHJlcS0+dHlwZSAhPSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0KLSAgICB3ID0gRlRfUkVRVUVTVF9XSURUSCAoIHJlcSApOwotICAgIGggPSBGVF9SRVFVRVNUX0hFSUdIVCggcmVxICk7Ci0KLSAgICBpZiAoIHJlcS0+d2lkdGggJiYgIXJlcS0+aGVpZ2h0ICkKLSAgICAgIGggPSB3OwotICAgIGVsc2UgaWYgKCAhcmVxLT53aWR0aCAmJiByZXEtPmhlaWdodCApCi0gICAgICB3ID0gaDsKLQotICAgIHcgPSBGVF9QSVhfUk9VTkQoIHcgKTsKLSAgICBoID0gRlRfUElYX1JPVU5EKCBoICk7Ci0KLSAgICBpZiAoICF3IHx8ICFoICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9QaXhlbF9TaXplICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2UtPm51bV9maXhlZF9zaXplczsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9CaXRtYXBfU2l6ZSogIGJzaXplID0gZmFjZS0+YXZhaWxhYmxlX3NpemVzICsgaTsKLQotCi0gICAgICBpZiAoIGggIT0gRlRfUElYX1JPVU5EKCBic2l6ZS0+eV9wcGVtICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCB3ID09IEZUX1BJWF9ST1VORCggYnNpemUtPnhfcHBlbSApIHx8IGlnbm9yZV93aWR0aCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMygoICJGVF9NYXRjaF9TaXplOiBiaXRtYXAgc3RyaWtlICVkIG1hdGNoZXNcbiIsIGkgKSk7Ci0KLSAgICAgICAgaWYgKCBzaXplX2luZGV4ICkKLSAgICAgICAgICAqc2l6ZV9pbmRleCA9IChGVF9VTG9uZylpOwotCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UzKCggIkZUX01hdGNoX1NpemU6IG5vIG1hdGNoaW5nIGJpdG1hcCBzdHJpa2VcbiIgKSk7Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfUGl4ZWxfU2l6ZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MoIEZUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICBhZHZhbmNlICkKLSAgewotICAgIEZUX1BvcyAgaGVpZ2h0ID0gbWV0cmljcy0+aGVpZ2h0OwotCi0KLSAgICAvKiBjb21wZW5zYXRlIGZvciBnbHlwaCB3aXRoIGJib3ggYWJvdmUvYmVsb3cgdGhlIGJhc2VsaW5lICovCi0gICAgaWYgKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPCAwICkKLSAgICB7Ci0gICAgICBpZiAoIGhlaWdodCA8IG1ldHJpY3MtPmhvcmlCZWFyaW5nWSApCi0gICAgICAgIGhlaWdodCA9IG1ldHJpY3MtPmhvcmlCZWFyaW5nWTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA+IDAgKQotICAgICAgaGVpZ2h0IC09IG1ldHJpY3MtPmhvcmlCZWFyaW5nWTsKLQotICAgIC8qIHRoZSBmYWN0b3IgMS4yIGlzIGEgaGV1cmlzdGljYWwgdmFsdWUgKi8KLSAgICBpZiAoICFhZHZhbmNlICkKLSAgICAgIGFkdmFuY2UgPSBoZWlnaHQgKiAxMiAvIDEwOwotCi0gICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gbWV0cmljcy0+aG9yaUJlYXJpbmdYIC0gbWV0cmljcy0+aG9yaUFkdmFuY2UgLyAyOwotICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9ICggYWR2YW5jZSAtIGhlaWdodCApIC8gMjsKLSAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSBhZHZhbmNlOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9yZWNvbXB1dGVfc2NhbGVkX21ldHJpY3MoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyApCi0gIHsKLSAgICAvKiBDb21wdXRlIHJvb3QgYXNjZW5kZXIsIGRlc2NlbmRlciwgdGVzdCBoZWlnaHQsIGFuZCBtYXhfYWR2YW5jZSAqLwotCi0jaWZkZWYgR1JJRF9GSVRfTUVUUklDUwotICAgIG1ldHJpY3MtPmFzY2VuZGVyICAgID0gRlRfUElYX0NFSUwoIEZUX011bEZpeCggZmFjZS0+YXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gRlRfUElYX0ZMT09SKCBGVF9NdWxGaXgoIGZhY2UtPmRlc2NlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gRlRfUElYX1JPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gRlRfUElYX1JPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPm1heF9hZHZhbmNlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnhfc2NhbGUgKSApOwotI2Vsc2UgLyogIUdSSURfRklUX01FVFJJQ1MgKi8KLSAgICBtZXRyaWNzLT5hc2NlbmRlciAgICA9IEZUX011bEZpeCggZmFjZS0+YXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gRlRfTXVsRml4KCBmYWNlLT5kZXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gRlRfTXVsRml4KCBmYWNlLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gRlRfTXVsRml4KCBmYWNlLT5tYXhfYWR2YW5jZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSApOwotI2VuZGlmIC8qICFHUklEX0ZJVF9NRVRSSUNTICovCi0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfU2VsZWN0X01ldHJpY3MoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHN0cmlrZV9pbmRleCApCi0gIHsKLSAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzOwotICAgIEZUX0JpdG1hcF9TaXplKiAgIGJzaXplOwotCi0KLSAgICBtZXRyaWNzID0gJmZhY2UtPnNpemUtPm1ldHJpY3M7Ci0gICAgYnNpemUgICA9IGZhY2UtPmF2YWlsYWJsZV9zaXplcyArIHN0cmlrZV9pbmRleDsKLQotICAgIG1ldHJpY3MtPnhfcHBlbSA9IChGVF9VU2hvcnQpKCAoIGJzaXplLT54X3BwZW0gKyAzMiApID4+IDYgKTsKLSAgICBtZXRyaWNzLT55X3BwZW0gPSAoRlRfVVNob3J0KSggKCBic2l6ZS0+eV9wcGVtICsgMzIgKSA+PiA2ICk7Ci0KLSAgICBpZiAoIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkgKQotICAgIHsKLSAgICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBGVF9EaXZGaXgoIGJzaXplLT54X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT51bml0c19wZXJfRU0gKTsKLSAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSBGVF9EaXZGaXgoIGJzaXplLT55X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT51bml0c19wZXJfRU0gKTsKLQotICAgICAgZnRfcmVjb21wdXRlX3NjYWxlZF9tZXRyaWNzKCBmYWNlLCBtZXRyaWNzICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtZXRyaWNzLT54X3NjYWxlICAgICA9IDFMIDw8IDE2OwotICAgICAgbWV0cmljcy0+eV9zY2FsZSAgICAgPSAxTCA8PCAxNjsKLSAgICAgIG1ldHJpY3MtPmFzY2VuZGVyICAgID0gYnNpemUtPnlfcHBlbTsKLSAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gMDsKLSAgICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gYnNpemUtPmhlaWdodCA8PCA2OwotICAgICAgbWV0cmljcy0+bWF4X2FkdmFuY2UgPSBic2l6ZS0+eF9wcGVtOwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJGVF9TZWxlY3RfTWV0cmljczpcbiIgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeCBzY2FsZTogJWQgKCVmKVxuIiwKLSAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlLCBtZXRyaWNzLT54X3NjYWxlIC8gNjU1MzYuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICB5IHNjYWxlOiAlZCAoJWYpXG4iLAotICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUsIG1ldHJpY3MtPnlfc2NhbGUgLyA2NTUzNi4wICkpOwotICAgIEZUX1RSQUNFNSgoICIgIGFzY2VuZGVyOiAlZlxuIiwgICAgbWV0cmljcy0+YXNjZW5kZXIgLyA2NC4wICkpOwotICAgIEZUX1RSQUNFNSgoICIgIGRlc2NlbmRlcjogJWZcbiIsICAgbWV0cmljcy0+ZGVzY2VuZGVyIC8gNjQuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICBoZWlnaHQ6ICVmXG4iLCAgICAgIG1ldHJpY3MtPmhlaWdodCAvIDY0LjAgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgbWF4IGFkdmFuY2U6ICVmXG4iLCBtZXRyaWNzLT5tYXhfYWR2YW5jZSAvIDY0LjAgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeCBwcGVtOiAlZFxuIiwgICAgICBtZXRyaWNzLT54X3BwZW0gKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeSBwcGVtOiAlZFxuIiwgICAgICBtZXRyaWNzLT55X3BwZW0gKSk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUmVxdWVzdF9NZXRyaWNzKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljczsKLQotCi0gICAgbWV0cmljcyA9ICZmYWNlLT5zaXplLT5tZXRyaWNzOwotCi0gICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggZmFjZSApICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICB3ID0gMCwgaCA9IDAsIHNjYWxlZF93ID0gMCwgc2NhbGVkX2ggPSAwOwotCi0KLSAgICAgIHN3aXRjaCAoIHJlcS0+dHlwZSApCi0gICAgICB7Ci0gICAgICBjYXNlIEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUw6Ci0gICAgICAgIHcgPSBoID0gZmFjZS0+dW5pdHNfcGVyX0VNOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTToKLSAgICAgICAgdyA9IGggPSBmYWNlLT5hc2NlbmRlciAtIGZhY2UtPmRlc2NlbmRlcjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfQkJPWDoKLSAgICAgICAgdyA9IGZhY2UtPmJib3gueE1heCAtIGZhY2UtPmJib3gueE1pbjsKLSAgICAgICAgaCA9IGZhY2UtPmJib3gueU1heCAtIGZhY2UtPmJib3gueU1pbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfQ0VMTDoKLSAgICAgICAgdyA9IGZhY2UtPm1heF9hZHZhbmNlX3dpZHRoOwotICAgICAgICBoID0gZmFjZS0+YXNjZW5kZXIgLSBmYWNlLT5kZXNjZW5kZXI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1NDQUxFUzoKLSAgICAgICAgbWV0cmljcy0+eF9zY2FsZSA9IChGVF9GaXhlZClyZXEtPndpZHRoOwotICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gKEZUX0ZpeGVkKXJlcS0+aGVpZ2h0OwotICAgICAgICBpZiAoICFtZXRyaWNzLT54X3NjYWxlICkKLSAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlID0gbWV0cmljcy0+eV9zY2FsZTsKLSAgICAgICAgZWxzZSBpZiAoICFtZXRyaWNzLT55X3NjYWxlICkKLSAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gbWV0cmljcy0+eF9zY2FsZTsKLSAgICAgICAgZ290byBDYWxjdWxhdGVfUHBlbTsKLQotICAgICAgY2FzZSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9NQVg6Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvKiB0byBiZSBvbiB0aGUgc2FmZSBzaWRlICovCi0gICAgICBpZiAoIHcgPCAwICkKLSAgICAgICAgdyA9IC13OwotCi0gICAgICBpZiAoIGggPCAwICkKLSAgICAgICAgaCA9IC1oOwotCi0gICAgICBzY2FsZWRfdyA9IEZUX1JFUVVFU1RfV0lEVEggKCByZXEgKTsKLSAgICAgIHNjYWxlZF9oID0gRlRfUkVRVUVTVF9IRUlHSFQoIHJlcSApOwotCi0gICAgICAvKiBkZXRlcm1pbmUgc2NhbGVzICovCi0gICAgICBpZiAoIHJlcS0+d2lkdGggKQotICAgICAgewotICAgICAgICBtZXRyaWNzLT54X3NjYWxlID0gRlRfRGl2Rml4KCBzY2FsZWRfdywgdyApOwotCi0gICAgICAgIGlmICggcmVxLT5oZWlnaHQgKQotICAgICAgICB7Ci0gICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSA9IEZUX0RpdkZpeCggc2NhbGVkX2gsIGggKTsKLQotICAgICAgICAgIGlmICggcmVxLT50eXBlID09IEZUX1NJWkVfUkVRVUVTVF9UWVBFX0NFTEwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggbWV0cmljcy0+eV9zY2FsZSA+IG1ldHJpY3MtPnhfc2NhbGUgKQotICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gbWV0cmljcy0+eF9zY2FsZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSA9IG1ldHJpY3MtPnlfc2NhbGU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSBtZXRyaWNzLT54X3NjYWxlOwotICAgICAgICAgIHNjYWxlZF9oID0gRlRfTXVsRGl2KCBzY2FsZWRfdywgaCwgdyApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBtZXRyaWNzLT55X3NjYWxlID0gRlRfRGl2Rml4KCBzY2FsZWRfaCwgaCApOwotICAgICAgICBzY2FsZWRfdyA9IEZUX011bERpdiggc2NhbGVkX2gsIHcsIGggKTsKLSAgICAgIH0KLQotICBDYWxjdWxhdGVfUHBlbToKLSAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcHBlbXMgKi8KLSAgICAgIGlmICggcmVxLT50eXBlICE9IEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUwgKQotICAgICAgewotICAgICAgICBzY2FsZWRfdyA9IEZUX011bEZpeCggZmFjZS0+dW5pdHNfcGVyX0VNLCBtZXRyaWNzLT54X3NjYWxlICk7Ci0gICAgICAgIHNjYWxlZF9oID0gRlRfTXVsRml4KCBmYWNlLT51bml0c19wZXJfRU0sIG1ldHJpY3MtPnlfc2NhbGUgKTsKLSAgICAgIH0KLQotICAgICAgbWV0cmljcy0+eF9wcGVtID0gKEZUX1VTaG9ydCkoICggc2NhbGVkX3cgKyAzMiApID4+IDYgKTsKLSAgICAgIG1ldHJpY3MtPnlfcHBlbSA9IChGVF9VU2hvcnQpKCAoIHNjYWxlZF9oICsgMzIgKSA+PiA2ICk7Ci0KLSAgICAgIGZ0X3JlY29tcHV0ZV9zY2FsZWRfbWV0cmljcyggZmFjZSwgbWV0cmljcyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfWkVSTyggbWV0cmljcyApOwotICAgICAgbWV0cmljcy0+eF9zY2FsZSA9IDFMIDw8IDE2OwotICAgICAgbWV0cmljcy0+eV9zY2FsZSA9IDFMIDw8IDE2OwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJGVF9SZXF1ZXN0X01ldHJpY3M6XG4iICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHggc2NhbGU6ICVkICglZilcbiIsCi0gICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSwgbWV0cmljcy0+eF9zY2FsZSAvIDY1NTM2LjAgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeSBzY2FsZTogJWQgKCVmKVxuIiwKLSAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlLCBtZXRyaWNzLT55X3NjYWxlIC8gNjU1MzYuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICBhc2NlbmRlcjogJWZcbiIsICAgIG1ldHJpY3MtPmFzY2VuZGVyIC8gNjQuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICBkZXNjZW5kZXI6ICVmXG4iLCAgIG1ldHJpY3MtPmRlc2NlbmRlciAvIDY0LjAgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgaGVpZ2h0OiAlZlxuIiwgICAgICBtZXRyaWNzLT5oZWlnaHQgLyA2NC4wICkpOwotICAgIEZUX1RSQUNFNSgoICIgIG1heCBhZHZhbmNlOiAlZlxuIiwgbWV0cmljcy0+bWF4X2FkdmFuY2UgLyA2NC4wICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHggcHBlbTogJWRcbiIsICAgICAgbWV0cmljcy0+eF9wcGVtICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHkgcHBlbTogJWRcbiIsICAgICAgbWV0cmljcy0+eV9wcGVtICkpOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9TaXplKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgc3RyaWtlX2luZGV4ICkKLSAgewotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7Ci0KLQotICAgIGlmICggIWZhY2UgfHwgIUZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCBzdHJpa2VfaW5kZXggPCAwIHx8IHN0cmlrZV9pbmRleCA+PSBmYWNlLT5udW1fZml4ZWRfc2l6ZXMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBjbGF6eiA9IGZhY2UtPmRyaXZlci0+Y2xheno7Ci0KLSAgICBpZiAoIGNsYXp6LT5zZWxlY3Rfc2l6ZSApCi0gICAgewotICAgICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICAgIGVycm9yID0gY2xhenotPnNlbGVjdF9zaXplKCBmYWNlLT5zaXplLCAoRlRfVUxvbmcpc3RyaWtlX2luZGV4ICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgewotICAgICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzID0gJmZhY2UtPnNpemUtPm1ldHJpY3M7Ci0KLQotICAgICAgICBGVF9UUkFDRTUoKCAiRlRfU2VsZWN0X1NpemUgKGZvbnQgZHJpdmVyJ3MgYHNlbGVjdF9zaXplJyk6XG4iICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICB4IHNjYWxlOiAlZCAoJWYpXG4iLAotICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlLCBtZXRyaWNzLT54X3NjYWxlIC8gNjU1MzYuMCApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgeSBzY2FsZTogJWQgKCVmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSwgbWV0cmljcy0+eV9zY2FsZSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIGFzY2VuZGVyOiAlZlxuIiwgICAgbWV0cmljcy0+YXNjZW5kZXIgLyA2NC4wICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICBkZXNjZW5kZXI6ICVmXG4iLCAgIG1ldHJpY3MtPmRlc2NlbmRlciAvIDY0LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIGhlaWdodDogJWZcbiIsICAgICAgbWV0cmljcy0+aGVpZ2h0IC8gNjQuMCApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgbWF4IGFkdmFuY2U6ICVmXG4iLCBtZXRyaWNzLT5tYXhfYWR2YW5jZSAvIDY0LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIHggcHBlbTogJWRcbiIsICAgICAgbWV0cmljcy0+eF9wcGVtICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICB5IHBwZW06ICVkXG4iLCAgICAgIG1ldHJpY3MtPnlfcHBlbSApKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgRlRfU2VsZWN0X01ldHJpY3MoIGZhY2UsIChGVF9VTG9uZylzdHJpa2VfaW5kZXggKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmVxdWVzdF9TaXplKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6ejsKLSAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIXJlcSB8fCByZXEtPndpZHRoIDwgMCB8fCByZXEtPmhlaWdodCA8IDAgfHwKLSAgICAgICAgIHJlcS0+dHlwZSA+PSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9NQVggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBzaWduYWwgdGhlIGF1dG8taGludGVyIHRvIHJlY29tcHV0ZSBpdHMgc2l6ZSBtZXRyaWNzICovCi0gICAgLyogKGlmIHJlcXVlc3RlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZhY2UtPnNpemUtPmludGVybmFsLT5hdXRvaGludF9tZXRyaWNzLnhfc2NhbGUgPSAwOwotCi0gICAgY2xhenogPSBmYWNlLT5kcml2ZXItPmNsYXp6OwotCi0gICAgaWYgKCBjbGF6ei0+cmVxdWVzdF9zaXplICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgICAgZXJyb3IgPSBjbGF6ei0+cmVxdWVzdF9zaXplKCBmYWNlLT5zaXplLCByZXEgKTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICB7Ci0gICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgPSAmZmFjZS0+c2l6ZS0+bWV0cmljczsKLQotCi0gICAgICAgIEZUX1RSQUNFNSgoICJGVF9SZXF1ZXN0X1NpemUgKGZvbnQgZHJpdmVyJ3MgYHJlcXVlc3Rfc2l6ZScpOlxuIiApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgeCBzY2FsZTogJWQgKCVmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSwgbWV0cmljcy0+eF9zY2FsZSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIHkgc2NhbGU6ICVkICglZilcbiIsCi0gICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUsIG1ldHJpY3MtPnlfc2NhbGUgLyA2NTUzNi4wICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICBhc2NlbmRlcjogJWZcbiIsICAgIG1ldHJpY3MtPmFzY2VuZGVyIC8gNjQuMCApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgZGVzY2VuZGVyOiAlZlxuIiwgICBtZXRyaWNzLT5kZXNjZW5kZXIgLyA2NC4wICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICBoZWlnaHQ6ICVmXG4iLCAgICAgIG1ldHJpY3MtPmhlaWdodCAvIDY0LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIG1heCBhZHZhbmNlOiAlZlxuIiwgbWV0cmljcy0+bWF4X2FkdmFuY2UgLyA2NC4wICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICB4IHBwZW06ICVkXG4iLCAgICAgIG1ldHJpY3MtPnhfcHBlbSApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgeSBwcGVtOiAlZFxuIiwgICAgICBtZXRyaWNzLT55X3BwZW0gKSk7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlIHJlYXNvbiB0aGF0IGEgZHJpdmVyIGRvZXNuJ3QgaGF2ZSBgcmVxdWVzdF9zaXplJyBkZWZpbmVkIGlzCi0gICAgICogZWl0aGVyIHRoYXQgdGhlIHNjYWxpbmcgaGVyZSBzdWZmaWNlcyBvciB0aGF0IHRoZSBzdXBwb3J0ZWQgZm9ybWF0cwotICAgICAqIGFyZSBiaXRtYXAtb25seSBhbmQgc2l6ZSBtYXRjaGluZyBpcyBub3QgaW1wbGVtZW50ZWQuCi0gICAgICoKLSAgICAgKiBJbiB0aGUgbGF0dGVyIGNhc2UsIGEgc2ltcGxlIHNpemUgbWF0Y2hpbmcgaXMgZG9uZS4KLSAgICAgKi8KLSAgICBpZiAoICFGVF9JU19TQ0FMQUJMRSggZmFjZSApICYmIEZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgICAgZXJyb3IgPSBGVF9NYXRjaF9TaXplKCBmYWNlLCByZXEsIDAsICZzdHJpa2VfaW5kZXggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIHJldHVybiBGVF9TZWxlY3RfU2l6ZSggZmFjZSwgKEZUX0ludClzdHJpa2VfaW5kZXggKTsKLSAgICB9Ci0KLSAgICBGVF9SZXF1ZXN0X01ldHJpY3MoIGZhY2UsIHJlcSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZXRfQ2hhcl9TaXplKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaG9yel9yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICB2ZXJ0X3Jlc29sdXRpb24gKQotICB7Ci0gICAgRlRfU2l6ZV9SZXF1ZXN0UmVjICByZXE7Ci0KLQotICAgIC8qIGNoZWNrIG9mIGBmYWNlJyBkZWxheWVkIHRvIGBGVF9SZXF1ZXN0X1NpemUnICovCi0KLSAgICBpZiAoICFjaGFyX3dpZHRoICkKLSAgICAgIGNoYXJfd2lkdGggPSBjaGFyX2hlaWdodDsKLSAgICBlbHNlIGlmICggIWNoYXJfaGVpZ2h0ICkKLSAgICAgIGNoYXJfaGVpZ2h0ID0gY2hhcl93aWR0aDsKLQotICAgIGlmICggIWhvcnpfcmVzb2x1dGlvbiApCi0gICAgICBob3J6X3Jlc29sdXRpb24gPSB2ZXJ0X3Jlc29sdXRpb247Ci0gICAgZWxzZSBpZiAoICF2ZXJ0X3Jlc29sdXRpb24gKQotICAgICAgdmVydF9yZXNvbHV0aW9uID0gaG9yel9yZXNvbHV0aW9uOwotCi0gICAgaWYgKCBjaGFyX3dpZHRoICA8IDEgKiA2NCApCi0gICAgICBjaGFyX3dpZHRoICA9IDEgKiA2NDsKLSAgICBpZiAoIGNoYXJfaGVpZ2h0IDwgMSAqIDY0ICkKLSAgICAgIGNoYXJfaGVpZ2h0ID0gMSAqIDY0OwotCi0gICAgaWYgKCAhaG9yel9yZXNvbHV0aW9uICkKLSAgICAgIGhvcnpfcmVzb2x1dGlvbiA9IHZlcnRfcmVzb2x1dGlvbiA9IDcyOwotCi0gICAgcmVxLnR5cGUgICAgICAgICAgID0gRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTDsKLSAgICByZXEud2lkdGggICAgICAgICAgPSBjaGFyX3dpZHRoOwotICAgIHJlcS5oZWlnaHQgICAgICAgICA9IGNoYXJfaGVpZ2h0OwotICAgIHJlcS5ob3JpUmVzb2x1dGlvbiA9IGhvcnpfcmVzb2x1dGlvbjsKLSAgICByZXEudmVydFJlc29sdXRpb24gPSB2ZXJ0X3Jlc29sdXRpb247Ci0KLSAgICByZXR1cm4gRlRfUmVxdWVzdF9TaXplKCBmYWNlLCAmcmVxICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1BpeGVsX1NpemVzKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHBpeGVsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHBpeGVsX2hlaWdodCApCi0gIHsKLSAgICBGVF9TaXplX1JlcXVlc3RSZWMgIHJlcTsKLQotCi0gICAgLyogY2hlY2sgb2YgYGZhY2UnIGRlbGF5ZWQgdG8gYEZUX1JlcXVlc3RfU2l6ZScgKi8KLQotICAgIGlmICggcGl4ZWxfd2lkdGggPT0gMCApCi0gICAgICBwaXhlbF93aWR0aCA9IHBpeGVsX2hlaWdodDsKLSAgICBlbHNlIGlmICggcGl4ZWxfaGVpZ2h0ID09IDAgKQotICAgICAgcGl4ZWxfaGVpZ2h0ID0gcGl4ZWxfd2lkdGg7Ci0KLSAgICBpZiAoIHBpeGVsX3dpZHRoICA8IDEgKQotICAgICAgcGl4ZWxfd2lkdGggID0gMTsKLSAgICBpZiAoIHBpeGVsX2hlaWdodCA8IDEgKQotICAgICAgcGl4ZWxfaGVpZ2h0ID0gMTsKLQotICAgIC8qIHVzZSBgPj0nIHRvIGF2b2lkIHBvdGVudGlhbCBjb21waWxlciB3YXJuaW5nIG9uIDE2Yml0IHBsYXRmb3JtcyAqLwotICAgIGlmICggcGl4ZWxfd2lkdGggPj0gMHhGRkZGVSApCi0gICAgICBwaXhlbF93aWR0aCA9IDB4RkZGRlU7Ci0gICAgaWYgKCBwaXhlbF9oZWlnaHQgPj0gMHhGRkZGVSApCi0gICAgICBwaXhlbF9oZWlnaHQgPSAweEZGRkZVOwotCi0gICAgcmVxLnR5cGUgICAgICAgICAgID0gRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTDsKLSAgICByZXEud2lkdGggICAgICAgICAgPSAoRlRfTG9uZykoIHBpeGVsX3dpZHRoIDw8IDYgKTsKLSAgICByZXEuaGVpZ2h0ICAgICAgICAgPSAoRlRfTG9uZykoIHBpeGVsX2hlaWdodCA8PCA2ICk7Ci0gICAgcmVxLmhvcmlSZXNvbHV0aW9uID0gMDsKLSAgICByZXEudmVydFJlc29sdXRpb24gPSAwOwotCi0gICAgcmV0dXJuIEZUX1JlcXVlc3RfU2l6ZSggZmFjZSwgJnJlcSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9LZXJuaW5nKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAga2Vybl9tb2RlLAotICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAqYWtlcm5pbmcgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9Ecml2ZXIgIGRyaXZlcjsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFrZXJuaW5nICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZHJpdmVyID0gZmFjZS0+ZHJpdmVyOwotCi0gICAgYWtlcm5pbmctPnggPSAwOwotICAgIGFrZXJuaW5nLT55ID0gMDsKLQotICAgIGlmICggZHJpdmVyLT5jbGF6ei0+Z2V0X2tlcm5pbmcgKQotICAgIHsKLSAgICAgIGVycm9yID0gZHJpdmVyLT5jbGF6ei0+Z2V0X2tlcm5pbmcoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBha2VybmluZyApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBpZiAoIGtlcm5fbW9kZSAhPSBGVF9LRVJOSU5HX1VOU0NBTEVEICkKLSAgICAgICAgewotICAgICAgICAgIGFrZXJuaW5nLT54ID0gRlRfTXVsRml4KCBha2VybmluZy0+eCwgZmFjZS0+c2l6ZS0+bWV0cmljcy54X3NjYWxlICk7Ci0gICAgICAgICAgYWtlcm5pbmctPnkgPSBGVF9NdWxGaXgoIGFrZXJuaW5nLT55LCBmYWNlLT5zaXplLT5tZXRyaWNzLnlfc2NhbGUgKTsKLQotICAgICAgICAgIGlmICgga2Vybl9tb2RlICE9IEZUX0tFUk5JTkdfVU5GSVRURUQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgb3JpZ194ID0gYWtlcm5pbmctPng7Ci0gICAgICAgICAgICBGVF9Qb3MgIG9yaWdfeSA9IGFrZXJuaW5nLT55OwotCi0KLSAgICAgICAgICAgIC8qIHdlIHNjYWxlIGRvd24ga2VybmluZyB2YWx1ZXMgZm9yIHNtYWxsIHBwZW0gdmFsdWVzICovCi0gICAgICAgICAgICAvKiB0byBhdm9pZCB0aGF0IHJvdW5kaW5nIG1ha2VzIHRoZW0gdG9vIGJpZy4gICAgICAgICAqLwotICAgICAgICAgICAgLyogYDI1JyBoYXMgYmVlbiBkZXRlcm1pbmVkIGhldXJpc3RpY2FsbHkuICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggZmFjZS0+c2l6ZS0+bWV0cmljcy54X3BwZW0gPCAyNSApCi0gICAgICAgICAgICAgIGFrZXJuaW5nLT54ID0gRlRfTXVsRGl2KCBvcmlnX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zaXplLT5tZXRyaWNzLnhfcHBlbSwgMjUgKTsKLSAgICAgICAgICAgIGlmICggZmFjZS0+c2l6ZS0+bWV0cmljcy55X3BwZW0gPCAyNSApCi0gICAgICAgICAgICAgIGFrZXJuaW5nLT55ID0gRlRfTXVsRGl2KCBvcmlnX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zaXplLT5tZXRyaWNzLnlfcHBlbSwgMjUgKTsKLQotICAgICAgICAgICAgYWtlcm5pbmctPnggPSBGVF9QSVhfUk9VTkQoIGFrZXJuaW5nLT54ICk7Ci0gICAgICAgICAgICBha2VybmluZy0+eSA9IEZUX1BJWF9ST1VORCggYWtlcm5pbmctPnkgKTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1BvcyAgb3JpZ194X3JvdW5kZWQgPSBGVF9QSVhfUk9VTkQoIG9yaWdfeCApOwotICAgICAgICAgICAgICBGVF9Qb3MgIG9yaWdfeV9yb3VuZGVkID0gRlRfUElYX1JPVU5EKCBvcmlnX3kgKTsKLQotCi0gICAgICAgICAgICAgIGlmICggYWtlcm5pbmctPnggIT0gb3JpZ194X3JvdW5kZWQgfHwKLSAgICAgICAgICAgICAgICAgICBha2VybmluZy0+eSAhPSBvcmlnX3lfcm91bmRlZCApCi0gICAgICAgICAgICAgICAgRlRfVFJBQ0U1KCggIkZUX0dldF9LZXJuaW5nOiBob3Jpem9udGFsIGtlcm5pbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoJWQsICVkKSBzY2FsZWQgZG93biB0byAoJWQsICVkKSBwaXhlbHNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ194X3JvdW5kZWQgLyA2NCwgb3JpZ195X3JvdW5kZWQgLyA2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBha2VybmluZy0+eCAvIDY0LCBha2VybmluZy0+eSAvIDY0ICkpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9UcmFja19LZXJuaW5nKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgIHBvaW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWtlcm5pbmcgKQotICB7Ci0gICAgRlRfU2VydmljZV9LZXJuaW5nICBzZXJ2aWNlOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFha2VybmluZyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBLRVJOSU5HICk7Ci0gICAgaWYgKCAhc2VydmljZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotCi0gICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfdHJhY2soIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWtlcm5pbmcgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZWxlY3RfQ2hhcm1hcCggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9FbmNvZGluZyAgZW5jb2RpbmcgKQotICB7Ci0gICAgRlRfQ2hhck1hcCogIGN1cjsKLSAgICBGVF9DaGFyTWFwKiAgbGltaXQ7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoIGVuY29kaW5nID09IEZUX0VOQ09ESU5HX05PTkUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBGVF9FTkNPRElOR19VTklDT0RFIGlzIHNwZWNpYWwuICBXZSB0cnkgdG8gZmluZCB0aGUgYGJlc3QnIFVuaWNvZGUgKi8KLSAgICAvKiBjaGFybWFwIGF2YWlsYWJsZSwgaS5lLiwgb25lIHdpdGggVUNTLTQgY2hhcmFjdGVycywgaWYgcG9zc2libGUuICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGlzIGlzIGRvbmUgYnkgZmluZF91bmljb2RlX2NoYXJtYXAoKSBhYm92ZSwgdG8gc2hhcmUgY29kZS4gICAgICAgKi8KLSAgICBpZiAoIGVuY29kaW5nID09IEZUX0VOQ09ESU5HX1VOSUNPREUgKQotICAgICAgcmV0dXJuIGZpbmRfdW5pY29kZV9jaGFybWFwKCBmYWNlICk7Ci0KLSAgICBjdXIgPSBmYWNlLT5jaGFybWFwczsKLSAgICBpZiAoICFjdXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlICk7Ci0KLSAgICBsaW1pdCA9IGN1ciArIGZhY2UtPm51bV9jaGFybWFwczsKLQotICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICB7Ci0gICAgICBpZiAoIGN1clswXS0+ZW5jb2RpbmcgPT0gZW5jb2RpbmcgKQotICAgICAgewotICAgICAgICBmYWNlLT5jaGFybWFwID0gY3VyWzBdOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZXRfQ2hhcm1hcCggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgKQotICB7Ci0gICAgRlRfQ2hhck1hcCogIGN1cjsKLSAgICBGVF9DaGFyTWFwKiAgbGltaXQ7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBjdXIgPSBmYWNlLT5jaGFybWFwczsKLSAgICBpZiAoICFjdXIgfHwgIWNoYXJtYXAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlICk7Ci0KLSAgICBpZiAoIEZUX0dldF9DTWFwX0Zvcm1hdCggY2hhcm1hcCApID09IDE0ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgbGltaXQgPSBjdXIgKyBmYWNlLT5udW1fY2hhcm1hcHM7Ci0KLSAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCi0gICAgewotICAgICAgaWYgKCBjdXJbMF0gPT0gY2hhcm1hcCApCi0gICAgICB7Ci0gICAgICAgIGZhY2UtPmNoYXJtYXAgPSBjdXJbMF07Ci0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ludCApCi0gIEZUX0dldF9DaGFybWFwX0luZGV4KCBGVF9DaGFyTWFwICBjaGFybWFwICkKLSAgewotICAgIEZUX0ludCAgaTsKLQotCi0gICAgaWYgKCAhY2hhcm1hcCB8fCAhY2hhcm1hcC0+ZmFjZSApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGNoYXJtYXAtPmZhY2UtPm51bV9jaGFybWFwczsgaSsrICkKLSAgICAgIGlmICggY2hhcm1hcC0+ZmFjZS0+Y2hhcm1hcHNbaV0gPT0gY2hhcm1hcCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgRlRfQVNTRVJUKCBpIDwgY2hhcm1hcC0+ZmFjZS0+bnVtX2NoYXJtYXBzICk7Ci0KLSAgICByZXR1cm4gaTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfY21hcF9kb25lX2ludGVybmFsKCBGVF9DTWFwICBjbWFwICkKLSAgewotICAgIEZUX0NNYXBfQ2xhc3MgIGNsYXp6ICA9IGNtYXAtPmNsYXp6OwotICAgIEZUX0ZhY2UgICAgICAgIGZhY2UgICA9IGNtYXAtPmNoYXJtYXAuZmFjZTsKLSAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICBpZiAoIGNsYXp6LT5kb25lICkKLSAgICAgIGNsYXp6LT5kb25lKCBjbWFwICk7Ci0KLSAgICBGVF9GUkVFKCBjbWFwICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfQ01hcF9Eb25lKCBGVF9DTWFwICBjbWFwICkKLSAgewotICAgIGlmICggY21hcCApCi0gICAgewotICAgICAgRlRfRmFjZSAgICBmYWNlICAgPSBjbWFwLT5jaGFybWFwLmZhY2U7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0gICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICAgRlRfSW50ICAgICBpLCBqOwotCi0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZS0+bnVtX2NoYXJtYXBzOyBpKysgKQotICAgICAgewotICAgICAgICBpZiAoIChGVF9DTWFwKWZhY2UtPmNoYXJtYXBzW2ldID09IGNtYXAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQ2hhck1hcCAgbGFzdF9jaGFybWFwID0gZmFjZS0+Y2hhcm1hcHNbZmFjZS0+bnVtX2NoYXJtYXBzIC0gMV07Ci0KLQotICAgICAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGZhY2UtPmNoYXJtYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5udW1fY2hhcm1hcHMgLSAxICkgKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgLyogcmVtb3ZlIGl0IGZyb20gb3VyIGxpc3Qgb2YgY2hhcm1hcHMgKi8KLSAgICAgICAgICBmb3IgKCBqID0gaSArIDE7IGogPCBmYWNlLT5udW1fY2hhcm1hcHM7IGorKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBqID09IGZhY2UtPm51bV9jaGFybWFwcyAtIDEgKQotICAgICAgICAgICAgICBmYWNlLT5jaGFybWFwc1tqIC0gMV0gPSBsYXN0X2NoYXJtYXA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZhY2UtPmNoYXJtYXBzW2ogLSAxXSA9IGZhY2UtPmNoYXJtYXBzW2pdOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcy0tOwotCi0gICAgICAgICAgaWYgKCAoRlRfQ01hcClmYWNlLT5jaGFybWFwID09IGNtYXAgKQotICAgICAgICAgICAgZmFjZS0+Y2hhcm1hcCA9IE5VTEw7Ci0KLSAgICAgICAgICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIGNtYXAgKTsKLQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9DTWFwX05ldyggRlRfQ01hcF9DbGFzcyAgY2xhenosCi0gICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICBGVF9DaGFyTWFwICAgICBjaGFybWFwLAotICAgICAgICAgICAgICAgRlRfQ01hcCAgICAgICAqYWNtYXAgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9GYWNlICAgIGZhY2U7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfQ01hcCAgICBjbWFwID0gTlVMTDsKLQotCi0gICAgaWYgKCAhY2xhenogfHwgIWNoYXJtYXAgfHwgIWNoYXJtYXAtPmZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBmYWNlICAgPSBjaGFybWFwLT5mYWNlOwotICAgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLSAgICBpZiAoICFGVF9BTExPQyggY21hcCwgY2xhenotPnNpemUgKSApCi0gICAgewotICAgICAgY21hcC0+Y2hhcm1hcCA9ICpjaGFybWFwOwotICAgICAgY21hcC0+Y2xhenogICA9IGNsYXp6OwotCi0gICAgICBpZiAoIGNsYXp6LT5pbml0ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBjbGF6ei0+aW5pdCggY21hcCwgaW5pdF9kYXRhICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgLyogYWRkIGl0IHRvIG91ciBsaXN0IG9mIGNoYXJtYXBzICovCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBmYWNlLT5jaGFybWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcyArIDEgKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZmFjZS0+Y2hhcm1hcHNbZmFjZS0+bnVtX2NoYXJtYXBzKytdID0gKEZUX0NoYXJNYXApY21hcDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGFjbWFwICkKLSAgICAgICphY21hcCA9IGNtYXA7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIGNtYXAgKTsKLSAgICBjbWFwID0gTlVMTDsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VJbnQgKQotICBGVF9HZXRfQ2hhcl9JbmRleCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUgKQotICB7Ci0gICAgRlRfVUludCAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCBmYWNlICYmIGZhY2UtPmNoYXJtYXAgKQotICAgIHsKLSAgICAgIEZUX0NNYXAgIGNtYXAgPSBGVF9DTUFQKCBmYWNlLT5jaGFybWFwICk7Ci0KLQotICAgICAgaWYgKCBjaGFyY29kZSA+IDB4RkZGRkZGRkZVTCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMSgoICJGVF9HZXRfQ2hhcl9JbmRleDogdG9vIGxhcmdlIGNoYXJjb2RlIiApKTsKLSAgICAgICAgRlRfVFJBQ0UxKCggIiAweCV4IGlzIHRydW5jYXRlZFxuIiwgY2hhcmNvZGUgKSk7Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdCA9IGNtYXAtPmNsYXp6LT5jaGFyX2luZGV4KCBjbWFwLCAoRlRfVUludDMyKWNoYXJjb2RlICk7Ci0gICAgICBpZiAoIHJlc3VsdCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VTG9uZyApCi0gIEZUX0dldF9GaXJzdF9DaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICphZ2luZGV4ICkKLSAgewotICAgIEZUX1VMb25nICByZXN1bHQgPSAwOwotICAgIEZUX1VJbnQgICBnaW5kZXggPSAwOwotCi0KLSAgICAvKiBvbmx5IGRvIHNvbWV0aGluZyBpZiB3ZSBoYXZlIGEgY2hhcm1hcCwgYW5kIHdlIGhhdmUgZ2x5cGhzIGF0IGFsbCAqLwotICAgIGlmICggZmFjZSAmJiBmYWNlLT5jaGFybWFwICYmIGZhY2UtPm51bV9nbHlwaHMgKQotICAgIHsKLSAgICAgIGdpbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCAwICk7Ci0gICAgICBpZiAoIGdpbmRleCA9PSAwICkKLSAgICAgICAgcmVzdWx0ID0gRlRfR2V0X05leHRfQ2hhciggZmFjZSwgMCwgJmdpbmRleCApOwotICAgIH0KLQotICAgIGlmICggYWdpbmRleCApCi0gICAgICAqYWdpbmRleCA9IGdpbmRleDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VMb25nICkKLSAgRlRfR2V0X05leHRfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmFnaW5kZXggKQotICB7Ci0gICAgRlRfVUxvbmcgIHJlc3VsdCA9IDA7Ci0gICAgRlRfVUludCAgIGdpbmRleCA9IDA7Ci0KLQotICAgIGlmICggZmFjZSAmJiBmYWNlLT5jaGFybWFwICYmIGZhY2UtPm51bV9nbHlwaHMgKQotICAgIHsKLSAgICAgIEZUX1VJbnQzMiAgY29kZSA9IChGVF9VSW50MzIpY2hhcmNvZGU7Ci0gICAgICBGVF9DTWFwICAgIGNtYXAgPSBGVF9DTUFQKCBmYWNlLT5jaGFybWFwICk7Ci0KLQotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ID0gY21hcC0+Y2xhenotPmNoYXJfbmV4dCggY21hcCwgJmNvZGUgKTsKLQotICAgICAgfSB3aGlsZSAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICk7Ci0KLSAgICAgIHJlc3VsdCA9ICggZ2luZGV4ID09IDAgKSA/IDAgOiBjb2RlOwotICAgIH0KLQotICAgIGlmICggYWdpbmRleCApCi0gICAgICAqYWdpbmRleCA9IGdpbmRleDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfRmFjZV9Qcm9wZXJ0aWVzKCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHByb3BlcnRpZXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIG51bV9wcm9wZXJ0aWVzID4gMCAmJiAhcHJvcGVydGllcyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGZvciAoIDsgbnVtX3Byb3BlcnRpZXMgPiAwOyBudW1fcHJvcGVydGllcy0tICkKLSAgICB7Ci0gICAgICBpZiAoIHByb3BlcnRpZXMtPnRhZyA9PSBGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkcgKQotICAgICAgewotICAgICAgICBpZiAoIHByb3BlcnRpZXMtPmRhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAqKCAoRlRfQm9vbCopcHJvcGVydGllcy0+ZGF0YSApID09IFRSVUUgKQotICAgICAgICAgICAgZmFjZS0+aW50ZXJuYWwtPm5vX3N0ZW1fZGFya2VuaW5nID0gRkFMU0U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZmFjZS0+aW50ZXJuYWwtPm5vX3N0ZW1fZGFya2VuaW5nID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB1c2UgbW9kdWxlIGRlZmF1bHQgKi8KLSAgICAgICAgICBmYWNlLT5pbnRlcm5hbC0+bm9fc3RlbV9kYXJrZW5pbmcgPSAtMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHByb3BlcnRpZXMtPnRhZyA9PSBGVF9QQVJBTV9UQUdfTENEX0ZJTFRFUl9XRUlHSFRTICkKLSAgICAgIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwotICAgICAgICBpZiAoIHByb3BlcnRpZXMtPmRhdGEgKQotICAgICAgICAgIGZ0X21lbWNweSggZmFjZS0+aW50ZXJuYWwtPmxjZF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0xDRF9GSUxURVJfRklWRV9UQVBTICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIFZhbHVlIE5VTEwgaW5kaWNhdGVzIGBubyBjdXN0b20gd2VpZ2h0cywgdXNlIGxpYnJhcnkgICAgICAgICovCi0gICAgICAgICAgLyogZGVmYXVsdHMnLCBzaWduYWxlZCBieSBmaWxsaW5nIHRoZSB3ZWlnaHQgZmllbGQgd2l0aCB6ZXJvcy4gKi8KLSAgICAgICAgICBmdF9tZW1zZXQoIGZhY2UtPmludGVybmFsLT5sY2Rfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICBGVF9MQ0RfRklMVEVSX0ZJVkVfVEFQUyApOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICAgICAgZ290byBFeGl0OwotI2VuZGlmCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICggcHJvcGVydGllcy0+dGFnID09IEZUX1BBUkFNX1RBR19SQU5ET01fU0VFRCApCi0gICAgICB7Ci0gICAgICAgIGlmICggcHJvcGVydGllcy0+ZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICBmYWNlLT5pbnRlcm5hbC0+cmFuZG9tX3NlZWQgPSAqKCAoRlRfSW50MzIqKXByb3BlcnRpZXMtPmRhdGEgKTsKLSAgICAgICAgICBpZiAoIGZhY2UtPmludGVybmFsLT5yYW5kb21fc2VlZCA8IDAgKQotICAgICAgICAgICAgZmFjZS0+aW50ZXJuYWwtPnJhbmRvbV9zZWVkID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB1c2UgbW9kdWxlIGRlZmF1bHQgKi8KLSAgICAgICAgICBmYWNlLT5pbnRlcm5hbC0+cmFuZG9tX3NlZWQgPSAtMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBwcm9wZXJ0aWVzKys7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VSW50ICkKLSAgRlRfRmFjZV9HZXRDaGFyVmFyaWFudEluZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApCi0gIHsKLSAgICBGVF9VSW50ICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoIGZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZhY2UtPmNoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZhY2UtPmNoYXJtYXAtPmVuY29kaW5nID09IEZUX0VOQ09ESU5HX1VOSUNPREUgKQotICAgIHsKLSAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgPSBmaW5kX3ZhcmlhbnRfc2VsZWN0b3JfY2hhcm1hcCggZmFjZSApOwotICAgICAgRlRfQ01hcCAgICAgdWNtYXAgPSBGVF9DTUFQKCBmYWNlLT5jaGFybWFwICk7Ci0KLQotICAgICAgaWYgKCBjaGFybWFwICkKLSAgICAgIHsKLSAgICAgICAgRlRfQ01hcCAgdmNtYXAgPSBGVF9DTUFQKCBjaGFybWFwICk7Ci0KLQotICAgICAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMSgoICJGVF9GYWNlX0dldENoYXJWYXJpYW50SW5kZXg6IgotICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIGNoYXJjb2RlIiApKTsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHZhcmlhbnRTZWxlY3RvciA+IDB4RkZGRkZGRkZVTCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiRlRfRmFjZV9HZXRDaGFyVmFyaWFudEluZGV4OiIKLSAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSB2YXJpYW50U2VsZWN0b3IiICkpOwotICAgICAgICAgIEZUX1RSQUNFMSgoICIgMHgleCBpcyB0cnVuY2F0ZWRcbiIsIHZhcmlhbnRTZWxlY3RvciApKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IHZjbWFwLT5jbGF6ei0+Y2hhcl92YXJfaW5kZXgoIHZjbWFwLCB1Y21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMiljaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMil2YXJpYW50U2VsZWN0b3IgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9JbnQgKQotICBGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0ludCAgcmVzdWx0ID0gLTE7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfQ2hhck1hcCAgY2hhcm1hcCA9IGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBmYWNlICk7Ci0KLQotICAgICAgaWYgKCBjaGFybWFwICkKLSAgICAgIHsKLSAgICAgICAgRlRfQ01hcCAgdmNtYXAgPSBGVF9DTUFQKCBjaGFybWFwICk7Ci0KLQotICAgICAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMSgoICJGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0OiIKLSAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSBjaGFyY29kZSIgKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIiAweCV4IGlzIHRydW5jYXRlZFxuIiwgY2hhcmNvZGUgKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCB2YXJpYW50U2VsZWN0b3IgPiAweEZGRkZGRkZGVUwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQ6IgotICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIHZhcmlhbnRTZWxlY3RvciIgKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIiAweCV4IGlzIHRydW5jYXRlZFxuIiwgdmFyaWFudFNlbGVjdG9yICkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gdmNtYXAtPmNsYXp6LT5jaGFyX3Zhcl9kZWZhdWx0KCB2Y21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludDMyKWNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50MzIpdmFyaWFudFNlbGVjdG9yICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludDMyKiApCi0gIEZUX0ZhY2VfR2V0VmFyaWFudFNlbGVjdG9ycyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9VSW50MzIgICpyZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGZhY2UgKQotICAgIHsKLSAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgPSBmaW5kX3ZhcmlhbnRfc2VsZWN0b3JfY2hhcm1hcCggZmFjZSApOwotCi0KLSAgICAgIGlmICggY2hhcm1hcCApCi0gICAgICB7Ci0gICAgICAgIEZUX0NNYXAgICAgdmNtYXAgID0gRlRfQ01BUCggY2hhcm1hcCApOwotICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLQotICAgICAgICByZXN1bHQgPSB2Y21hcC0+Y2xhenotPnZhcmlhbnRfbGlzdCggdmNtYXAsIG1lbW9yeSApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VJbnQzMiogKQotICBGVF9GYWNlX0dldFZhcmlhbnRzT2ZDaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlICkKLSAgewotICAgIEZUX1VJbnQzMiAgKnJlc3VsdCA9IE5VTEw7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfQ2hhck1hcCAgY2hhcm1hcCA9IGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBmYWNlICk7Ci0KLQotICAgICAgaWYgKCBjaGFybWFwICkKLSAgICAgIHsKLSAgICAgICAgRlRfQ01hcCAgICB2Y21hcCAgPSBGVF9DTUFQKCBjaGFybWFwICk7Ci0gICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotCi0gICAgICAgIGlmICggY2hhcmNvZGUgPiAweEZGRkZGRkZGVUwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0ZhY2VfR2V0VmFyaWFudHNPZkNoYXI6IHRvbyBsYXJnZSBjaGFyY29kZSIgKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIiAweCV4IGlzIHRydW5jYXRlZFxuIiwgY2hhcmNvZGUgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSB2Y21hcC0+Y2xhenotPmNoYXJ2YXJpYW50X2xpc3QoIHZjbWFwLCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMiljaGFyY29kZSApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VSW50MzIqICkKLSAgRlRfRmFjZV9HZXRDaGFyc09mVmFyaWFudCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKQotICB7Ci0gICAgRlRfVUludDMyICAqcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICB7Ci0gICAgICBGVF9DaGFyTWFwICBjaGFybWFwID0gZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXAoIGZhY2UgKTsKLQotCi0gICAgICBpZiAoIGNoYXJtYXAgKQotICAgICAgewotICAgICAgICBGVF9DTWFwICAgIHZjbWFwICA9IEZUX0NNQVAoIGNoYXJtYXAgKTsKLSAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICAgICAgaWYgKCB2YXJpYW50U2VsZWN0b3IgPiAweEZGRkZGRkZGVUwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0dldF9DaGFyX0luZGV4OiB0b28gbGFyZ2UgdmFyaWFudFNlbGVjdG9yIiApKTsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCB2YXJpYW50U2VsZWN0b3IgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSB2Y21hcC0+Y2xhenotPnZhcmlhbnRjaGFyX2xpc3QoIHZjbWFwLCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMil2YXJpYW50U2VsZWN0b3IgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VSW50ICkKLSAgRlRfR2V0X05hbWVfSW5kZXgoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKLSAgewotICAgIEZUX1VJbnQgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggZmFjZSAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIEZUX0hBU19HTFlQSF9OQU1FUyggZmFjZSApICYmCi0gICAgICAgICBnbHlwaF9uYW1lICAgICAgICAgICAgICAgICApCi0gICAgewotICAgICAgRlRfU2VydmljZV9HbHlwaERpY3QgIHNlcnZpY2U7Ci0KLQotICAgICAgRlRfRkFDRV9MT09LVVBfU0VSVklDRSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTFlQSF9ESUNUICk7Ci0KLSAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5uYW1lX2luZGV4ICkKLSAgICAgICAgcmVzdWx0ID0gc2VydmljZS0+bmFtZV9pbmRleCggZmFjZSwgZ2x5cGhfbmFtZSApOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0dseXBoX05hbWUoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfR2x5cGhEaWN0ICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCAhYnVmZmVyIHx8IGJ1ZmZlcl9tYXggPT0gMCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIC8qIGNsZWFuIHVwIGJ1ZmZlciAqLwotICAgICgoRlRfQnl0ZSopYnVmZmVyKVswXSA9ICdcMCc7Ci0KLSAgICBpZiAoIChGVF9Mb25nKWdseXBoX2luZGV4ID49IGZhY2UtPm51bV9nbHlwaHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0dseXBoX0luZGV4ICk7Ci0KLSAgICBpZiAoICFGVF9IQVNfR0xZUEhfTkFNRVMoIGZhY2UgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIEdMWVBIX0RJQ1QgKTsKLSAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+Z2V0X25hbWUgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfbmFtZSggZmFjZSwgZ2x5cGhfaW5kZXgsIGJ1ZmZlciwgYnVmZmVyX21heCApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggY29uc3QgY2hhciogKQotICBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggIXJlc3VsdCApCi0gICAgewotICAgICAgRlRfU2VydmljZV9Qc0ZvbnROYW1lICBzZXJ2aWNlOwotCi0KLSAgICAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TVFNDUklQVF9GT05UX05BTUUgKTsKLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPmdldF9wc19mb250X25hbWUgKQotICAgICAgICByZXN1bHQgPSBzZXJ2aWNlLT5nZXRfcHNfZm9udF9uYW1lKCBmYWNlICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0dHRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCogKQotICBGVF9HZXRfU2ZudF9UYWJsZSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TZm50X1RhZyAgdGFnICkKLSAgewotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgdGFibGUgPSBOVUxMOwotICAgIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZSAgc2VydmljZTsKLQotCi0gICAgaWYgKCBmYWNlICYmIEZUX0lTX1NGTlQoIGZhY2UgKSApCi0gICAgewotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFNGTlRfVEFCTEUgKTsKLSAgICAgIGlmICggc2VydmljZSApCi0gICAgICAgIHRhYmxlID0gc2VydmljZS0+Z2V0X3RhYmxlKCBmYWNlLCB0YWcgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHR0YWJsZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTG9hZF9TZm50X1RhYmxlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKQotICB7Ci0gICAgRlRfU2VydmljZV9TRk5UX1RhYmxlICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlIHx8ICFGVF9JU19TRk5UKCBmYWNlICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgU0ZOVF9UQUJMRSApOwotICAgIGlmICggIXNlcnZpY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLQotICAgIHJldHVybiBzZXJ2aWNlLT5sb2FkX3RhYmxlKCBmYWNlLCB0YWcsIG9mZnNldCwgYnVmZmVyLCBsZW5ndGggKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0dHRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZm50X1RhYmxlX0luZm8oIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHRhYmxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqdGFnLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICkKLSAgewotICAgIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZSAgc2VydmljZTsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgIG9mZnNldDsKLQotCi0gICAgLyogdGVzdCBmb3IgdmFsaWQgYGxlbmd0aCcgZGVsYXllZCB0byBgc2VydmljZS0+dGFibGVfaW5mbycgKi8KLQotICAgIGlmICggIWZhY2UgfHwgIUZUX0lTX1NGTlQoIGZhY2UgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBTRk5UX1RBQkxFICk7Ci0gICAgaWYgKCAhc2VydmljZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotCi0gICAgcmV0dXJuIHNlcnZpY2UtPnRhYmxlX2luZm8oIGZhY2UsIHRhYmxlX2luZGV4LCB0YWcsICZvZmZzZXQsIGxlbmd0aCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHR0dGFibGVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VTG9uZyApCi0gIEZUX0dldF9DTWFwX0xhbmd1YWdlX0lEKCBGVF9DaGFyTWFwICBjaGFybWFwICkKLSAgewotICAgIEZUX1NlcnZpY2VfVFRDTWFwcyAgc2VydmljZTsKLSAgICBGVF9GYWNlICAgICAgICAgICAgIGZhY2U7Ci0gICAgVFRfQ01hcEluZm8gICAgICAgICBjbWFwX2luZm87Ci0KLQotICAgIGlmICggIWNoYXJtYXAgfHwgIWNoYXJtYXAtPmZhY2UgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmYWNlID0gY2hhcm1hcC0+ZmFjZTsKLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgVFRfQ01BUCApOwotICAgIGlmICggIXNlcnZpY2UgKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCBzZXJ2aWNlLT5nZXRfY21hcF9pbmZvKCBjaGFybWFwLCAmY21hcF9pbmZvICkpCi0gICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBjbWFwX2luZm8ubGFuZ3VhZ2U7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHR0YWJsZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9HZXRfQ01hcF9Gb3JtYXQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKQotICB7Ci0gICAgRlRfU2VydmljZV9UVENNYXBzICBzZXJ2aWNlOwotICAgIEZUX0ZhY2UgICAgICAgICAgICAgZmFjZTsKLSAgICBUVF9DTWFwSW5mbyAgICAgICAgIGNtYXBfaW5mbzsKLQotCi0gICAgaWYgKCAhY2hhcm1hcCB8fCAhY2hhcm1hcC0+ZmFjZSApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBmYWNlID0gY2hhcm1hcC0+ZmFjZTsKLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgVFRfQ01BUCApOwotICAgIGlmICggIXNlcnZpY2UgKQotICAgICAgcmV0dXJuIC0xOwotICAgIGlmICggc2VydmljZS0+Z2V0X2NtYXBfaW5mbyggY2hhcm1hcCwgJmNtYXBfaW5mbyApKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgcmV0dXJuIGNtYXBfaW5mby5mb3JtYXQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzaXplcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9BY3RpdmF0ZV9TaXplKCBGVF9TaXplICBzaXplICkKLSAgewotICAgIEZUX0ZhY2UgIGZhY2U7Ci0KLQotICAgIGlmICggIXNpemUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1NpemVfSGFuZGxlICk7Ci0KLSAgICBmYWNlID0gc2l6ZS0+ZmFjZTsKLSAgICBpZiAoICFmYWNlIHx8ICFmYWNlLT5kcml2ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICAvKiB3ZSBkb24ndCBuZWVkIGFueXRoaW5nIG1vcmUgY29tcGxleCB0aGFuIHRoYXQ7IGFsbCBzaXplIG9iamVjdHMgKi8KLSAgICAvKiBhcmUgYWxyZWFkeSBsaXN0ZWQgYnkgdGhlIGZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmYWNlLT5zaXplID0gc2l6ZTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICBSIEUgTiBEIEUgUiBFIFIgUyAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBsb29rdXAgYSByZW5kZXJlciBieSBnbHlwaCBmb3JtYXQgaW4gdGhlIGxpYnJhcnkncyBsaXN0ICovCi0gIEZUX0JBU0VfREVGKCBGVF9SZW5kZXJlciApCi0gIEZUX0xvb2t1cF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX0Zvcm1hdCAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlKiAgICAgbm9kZSApCi0gIHsKLSAgICBGVF9MaXN0Tm9kZSAgY3VyOwotICAgIEZUX1JlbmRlcmVyICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGN1ciA9IGxpYnJhcnktPnJlbmRlcmVycy5oZWFkOwotCi0gICAgaWYgKCBub2RlICkKLSAgICB7Ci0gICAgICBpZiAoICpub2RlICkKLSAgICAgICAgY3VyID0gKCpub2RlKS0+bmV4dDsKLSAgICAgICpub2RlID0gTlVMTDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIGN1ciApCi0gICAgewotICAgICAgRlRfUmVuZGVyZXIgIHJlbmRlcmVyID0gRlRfUkVOREVSRVIoIGN1ci0+ZGF0YSApOwotCi0KLSAgICAgIGlmICggcmVuZGVyZXItPmdseXBoX2Zvcm1hdCA9PSBmb3JtYXQgKQotICAgICAgewotICAgICAgICBpZiAoIG5vZGUgKQotICAgICAgICAgICpub2RlID0gY3VyOwotCi0gICAgICAgIHJlc3VsdCA9IHJlbmRlcmVyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGN1ciA9IGN1ci0+bmV4dDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgRlRfUmVuZGVyZXIKLSAgZnRfbG9va3VwX2dseXBoX3JlbmRlcmVyKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfRmFjZSAgICAgIGZhY2UgICAgPSBzbG90LT5mYWNlOwotICAgIEZUX0xpYnJhcnkgICBsaWJyYXJ5ID0gRlRfRkFDRV9MSUJSQVJZKCBmYWNlICk7Ci0gICAgRlRfUmVuZGVyZXIgIHJlc3VsdCAgPSBsaWJyYXJ5LT5jdXJfcmVuZGVyZXI7Ci0KLQotICAgIGlmICggIXJlc3VsdCB8fCByZXN1bHQtPmdseXBoX2Zvcm1hdCAhPSBzbG90LT5mb3JtYXQgKQotICAgICAgcmVzdWx0ID0gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBzbG90LT5mb3JtYXQsIDAgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3NldF9jdXJyZW50X3JlbmRlcmVyKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1JlbmRlcmVyICByZW5kZXJlcjsKLQotCi0gICAgcmVuZGVyZXIgPSBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLCAwICk7Ci0gICAgbGlicmFyeS0+Y3VyX3JlbmRlcmVyID0gcmVuZGVyZXI7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9hZGRfcmVuZGVyZXIoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIEZUX0xpYnJhcnkgICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotICAgIEZUX01lbW9yeSAgICBtZW1vcnkgID0gbGlicmFyeS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9MaXN0Tm9kZSAgbm9kZSAgICA9IE5VTEw7Ci0KLQotICAgIGlmICggRlRfTkVXKCBub2RlICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgewotICAgICAgRlRfUmVuZGVyZXIgICAgICAgICByZW5kZXIgPSBGVF9SRU5ERVJFUiggbW9kdWxlICk7Ci0gICAgICBGVF9SZW5kZXJlcl9DbGFzcyogIGNsYXp6ICA9IChGVF9SZW5kZXJlcl9DbGFzcyopbW9kdWxlLT5jbGF6ejsKLQotCi0gICAgICByZW5kZXItPmNsYXp6ICAgICAgICA9IGNsYXp6OwotICAgICAgcmVuZGVyLT5nbHlwaF9mb3JtYXQgPSBjbGF6ei0+Z2x5cGhfZm9ybWF0OwotCi0gICAgICAvKiBhbGxvY2F0ZSByYXN0ZXIgb2JqZWN0IGlmIG5lZWRlZCAqLwotICAgICAgaWYgKCBjbGF6ei0+Z2x5cGhfZm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICYmCi0gICAgICAgICAgIGNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9uZXcgICAgICAgICAgICAgICAgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9uZXcoIG1lbW9yeSwgJnJlbmRlci0+cmFzdGVyICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICByZW5kZXItPnJhc3Rlcl9yZW5kZXIgPSBjbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfcmVuZGVyOwotICAgICAgICByZW5kZXItPnJlbmRlciAgICAgICAgPSBjbGF6ei0+cmVuZGVyX2dseXBoOwotICAgICAgfQotCi0gICAgICAvKiBhZGQgdG8gbGlzdCAqLwotICAgICAgbm9kZS0+ZGF0YSA9IG1vZHVsZTsKLSAgICAgIEZUX0xpc3RfQWRkKCAmbGlicmFyeS0+cmVuZGVyZXJzLCBub2RlICk7Ci0KLSAgICAgIGZ0X3NldF9jdXJyZW50X3JlbmRlcmVyKCBsaWJyYXJ5ICk7Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9GUkVFKCBub2RlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3JlbW92ZV9yZW5kZXJlciggRlRfTW9kdWxlICBtb2R1bGUgKQotICB7Ci0gICAgRlRfTGlicmFyeSAgIGxpYnJhcnk7Ci0gICAgRlRfTWVtb3J5ICAgIG1lbW9yeTsKLSAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKLQotCi0gICAgbGlicmFyeSA9IG1vZHVsZS0+bGlicmFyeTsKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIG5vZGUgPSBGVF9MaXN0X0ZpbmQoICZsaWJyYXJ5LT5yZW5kZXJlcnMsIG1vZHVsZSApOwotICAgIGlmICggbm9kZSApCi0gICAgewotICAgICAgRlRfUmVuZGVyZXIgIHJlbmRlciA9IEZUX1JFTkRFUkVSKCBtb2R1bGUgKTsKLQotCi0gICAgICAvKiByZWxlYXNlIHJhc3RlciBvYmplY3QsIGlmIGFueSAqLwotICAgICAgaWYgKCByZW5kZXItPmNsYXp6LT5nbHlwaF9mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUgJiYKLSAgICAgICAgICAgcmVuZGVyLT5yYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgcmVuZGVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfZG9uZSggcmVuZGVyLT5yYXN0ZXIgKTsKLQotICAgICAgLyogcmVtb3ZlIGZyb20gbGlzdCAqLwotICAgICAgRlRfTGlzdF9SZW1vdmUoICZsaWJyYXJ5LT5yZW5kZXJlcnMsIG5vZGUgKTsKLSAgICAgIEZUX0ZSRUUoIG5vZGUgKTsKLQotICAgICAgZnRfc2V0X2N1cnJlbnRfcmVuZGVyZXIoIGxpYnJhcnkgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRyZW5kZXIuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1JlbmRlcmVyICkKLSAgRlRfR2V0X1JlbmRlcmVyKCBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgRlRfR2x5cGhfRm9ybWF0ICBmb3JtYXQgKQotICB7Ci0gICAgLyogdGVzdCBmb3IgdmFsaWQgYGxpYnJhcnknIGRlbGF5ZWQgdG8gYEZUX0xvb2t1cF9SZW5kZXJlcicgKi8KLQotICAgIHJldHVybiBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIGZvcm1hdCwgMCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0cmVuZGVyLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJlciAgICByZW5kZXJlciwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtZXRlcnMgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGU7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMgIHNldF9tb2RlOwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAhcmVuZGVyZXIgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIG51bV9wYXJhbXMgPiAwICYmICFwYXJhbWV0ZXJzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgbm9kZSA9IEZUX0xpc3RfRmluZCggJmxpYnJhcnktPnJlbmRlcmVycywgcmVuZGVyZXIgKTsKLSAgICBpZiAoICFub2RlICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgRlRfTGlzdF9VcCggJmxpYnJhcnktPnJlbmRlcmVycywgbm9kZSApOwotCi0gICAgaWYgKCByZW5kZXJlci0+Z2x5cGhfZm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKLSAgICAgIGxpYnJhcnktPmN1cl9yZW5kZXJlciA9IHJlbmRlcmVyOwotCi0gICAgc2V0X21vZGUgPSByZW5kZXJlci0+Y2xhenotPnNldF9tb2RlOwotCi0gICAgZm9yICggOyBudW1fcGFyYW1zID4gMDsgbnVtX3BhcmFtcy0tICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHNldF9tb2RlKCByZW5kZXJlciwgcGFyYW1ldGVycy0+dGFnLCBwYXJhbWV0ZXJzLT5kYXRhICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBwYXJhbWV0ZXJzKys7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfUmVuZGVyZXIgIHJlbmRlcmVyOwotCi0KLSAgICAvKiBpZiBpdCBpcyBhbHJlYWR5IGEgYml0bWFwLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nICovCi0gICAgc3dpdGNoICggc2xvdC0+Zm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQOiAgIC8qIGFscmVhZHkgYSBiaXRtYXAsIGRvbid0IGRvIGFueXRoaW5nICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgIEZUX0xpc3ROb2RlICBub2RlID0gTlVMTDsKLQotCi0gICAgICAgIC8qIHNtYWxsIHNob3J0Y3V0IGZvciB0aGUgdmVyeSBjb21tb24gY2FzZSAqLwotICAgICAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICAgIHsKLSAgICAgICAgICByZW5kZXJlciA9IGxpYnJhcnktPmN1cl9yZW5kZXJlcjsKLSAgICAgICAgICBub2RlICAgICA9IGxpYnJhcnktPnJlbmRlcmVycy5oZWFkOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZW5kZXJlciA9IEZUX0xvb2t1cF9SZW5kZXJlciggbGlicmFyeSwgc2xvdC0+Zm9ybWF0LCAmbm9kZSApOwotCi0gICAgICAgIGVycm9yID0gRlRfRVJSKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICAgICAgd2hpbGUgKCByZW5kZXJlciApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IHJlbmRlcmVyLT5yZW5kZXIoIHJlbmRlcmVyLCBzbG90LCByZW5kZXJfbW9kZSwgTlVMTCApOwotICAgICAgICAgIGlmICggIWVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIENhbm5vdF9SZW5kZXJfR2x5cGggKSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIC8qIEZUX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoIGlzIHJldHVybmVkIGlmIHRoZSByZW5kZXIgbW9kZSAgICovCi0gICAgICAgICAgLyogaXMgdW5zdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIHRoaXMgZ2x5cGggaW1hZ2UgKi8KLSAgICAgICAgICAvKiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgLyogbm93LCBsb29rIGZvciBhbm90aGVyIHJlbmRlcmVyIHRoYXQgc3VwcG9ydHMgdGhlIHNhbWUgKi8KLSAgICAgICAgICAvKiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHJlbmRlcmVyID0gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBzbG90LT5mb3JtYXQsICZub2RlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2JpdG1hcAotCi0gICAgLyoKLSAgICAgKiBDb21wdXRpbmcgdGhlIE1ENSBjaGVja3N1bSBpcyBleHBlbnNpdmUsIHVubmVjZXNzYXJpbHkgZGlzdG9ydGluZyBhCi0gICAgICogcG9zc2libGUgcHJvZmlsaW5nIG9mIEZyZWVUeXBlIGlmIGNvbXBpbGVkIHdpdGggdHJhY2luZyBzdXBwb3J0LiAgRm9yCi0gICAgICogdGhpcyByZWFzb24sIHdlIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb2RlIG9ubHkgaWYgZXhwbGljaXRseQotICAgICAqIHJlcXVlc3RlZC4KLSAgICAgKi8KLQotICAgIC8qIHdlIHVzZSBGVF9UUkFDRTMgaW4gdGhpcyBibG9jayAqLwotICAgIGlmICggZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2JpdG1hcF0gPj0gMyApCi0gICAgewotICAgICAgLyogd2UgY29udmVydCB0byBhIHNpbmdsZSBiaXRtYXAgZm9ybWF0IGZvciBjb21wdXRpbmcgdGhlIGNoZWNrc3VtICovCi0gICAgICBpZiAoICFlcnJvciAmJiBzbG90LT5iaXRtYXAuYnVmZmVyICkKLSAgICAgIHsKLSAgICAgICAgRlRfQml0bWFwICBiaXRtYXA7Ci0gICAgICAgIEZUX0Vycm9yICAgZXJyOwotCi0KLSAgICAgICAgRlRfQml0bWFwX0luaXQoICZiaXRtYXAgKTsKLQotICAgICAgICAvKiB0aGlzIGFsc28gY29udmVydHMgdGhlIGJpdG1hcCBmbG93IHRvIGBkb3duJyAoaS5lLiwgcGl0Y2ggPiAwKSAqLwotICAgICAgICBlcnIgPSBGVF9CaXRtYXBfQ29udmVydCggbGlicmFyeSwgJnNsb3QtPmJpdG1hcCwgJmJpdG1hcCwgMSApOwotICAgICAgICBpZiAoICFlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgTUQ1X0NUWCAgICAgICAgY3R4OwotICAgICAgICAgIHVuc2lnbmVkIGNoYXIgIG1kNVsxNl07Ci0gICAgICAgICAgaW50ICAgICAgICAgICAgaTsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgICByb3dzICA9IGJpdG1hcC5yb3dzOwotICAgICAgICAgIHVuc2lnbmVkIGludCAgIHBpdGNoID0gKHVuc2lnbmVkIGludCliaXRtYXAucGl0Y2g7Ci0KLQotICAgICAgICAgIE1ENV9Jbml0KCAmY3R4ICk7Ci0gICAgICAgICAgaWYgKCBiaXRtYXAuYnVmZmVyICkKLSAgICAgICAgICAgIE1ENV9VcGRhdGUoICZjdHgsIGJpdG1hcC5idWZmZXIsIHJvd3MgKiBwaXRjaCApOwotICAgICAgICAgIE1ENV9GaW5hbCggbWQ1LCAmY3R4ICk7Ci0KLSAgICAgICAgICBGVF9UUkFDRTMoKCAiTUQ1IGNoZWNrc3VtIGZvciAlZHglZCBiaXRtYXA6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIiAgIiwKLSAgICAgICAgICAgICAgICAgICAgICByb3dzLCBwaXRjaCApKTsKLSAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDE2OyBpKysgKQotICAgICAgICAgICAgRlRfVFJBQ0UzKCggIiUwMlgiLCBtZDVbaV0gKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UzKCggIlxuIiApKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZUX0JpdG1hcF9Eb25lKCBsaWJyYXJ5LCAmYml0bWFwICk7Ci0gICAgICB9Ci0gICAgfQotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX29ianMKLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmVuZGVyX0dseXBoKCBGVF9HbHlwaFNsb3QgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUgKQotICB7Ci0gICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLQotCi0gICAgaWYgKCAhc2xvdCB8fCAhc2xvdC0+ZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGxpYnJhcnkgPSBGVF9GQUNFX0xJQlJBUlkoIHNsb3QtPmZhY2UgKTsKLQotICAgIHJldHVybiBGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwoIGxpYnJhcnksIHNsb3QsIHJlbmRlcl9tb2RlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgTSBPIEQgVSBMIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3lfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gbW9kdWxlIG9iamVjdC4gIEZvciBkcml2ZXJzLCB0aGlzIGFsc28gZGVzdHJveXMgICAqLwotICAvKiAgICBhbGwgY2hpbGQgZmFjZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZHJpdmVyIF9tdXN0XyBiZSBMT0NLRUQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIERlc3Ryb3lfTW9kdWxlKCBGVF9Nb2R1bGUgIG1vZHVsZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnkgID0gbW9kdWxlLT5tZW1vcnk7Ci0gICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogICA9IG1vZHVsZS0+Y2xheno7Ci0gICAgRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSA9IG1vZHVsZS0+bGlicmFyeTsKLQotCi0gICAgaWYgKCBsaWJyYXJ5ICYmIGxpYnJhcnktPmF1dG9faGludGVyID09IG1vZHVsZSApCi0gICAgICBsaWJyYXJ5LT5hdXRvX2hpbnRlciA9IE5VTEw7Ci0KLSAgICAvKiBpZiB0aGUgbW9kdWxlIGlzIGEgcmVuZGVyZXIgKi8KLSAgICBpZiAoIEZUX01PRFVMRV9JU19SRU5ERVJFUiggbW9kdWxlICkgKQotICAgICAgZnRfcmVtb3ZlX3JlbmRlcmVyKCBtb2R1bGUgKTsKLQotICAgIC8qIGlmIHRoZSBtb2R1bGUgaXMgYSBmb250IGRyaXZlciwgYWRkIHNvbWUgc3RlcHMgKi8KLSAgICBpZiAoIEZUX01PRFVMRV9JU19EUklWRVIoIG1vZHVsZSApICkKLSAgICAgIERlc3Ryb3lfRHJpdmVyKCBGVF9EUklWRVIoIG1vZHVsZSApICk7Ci0KLSAgICAvKiBmaW5hbGl6ZSB0aGUgbW9kdWxlIG9iamVjdCAqLwotICAgIGlmICggY2xhenotPm1vZHVsZV9kb25lICkKLSAgICAgIGNsYXp6LT5tb2R1bGVfZG9uZSggbW9kdWxlICk7Ci0KLSAgICAvKiBkaXNjYXJkIGl0ICovCi0gICAgRlRfRlJFRSggbW9kdWxlICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfQWRkX01vZHVsZSggRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9Nb2R1bGUgIG1vZHVsZSA9IE5VTEw7Ci0gICAgRlRfVUludCAgICBubjsKLQotCi0jZGVmaW5lIEZSRUVUWVBFX1ZFUl9GSVhFRCAgKCAoIChGVF9Mb25nKUZSRUVUWVBFX01BSk9SIDw8IDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSRUVUWVBFX01JTk9SICAgICAgICAgICAgICAgICAgKQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIWNsYXp6ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgLyogY2hlY2sgZnJlZXR5cGUgdmVyc2lvbiAqLwotICAgIGlmICggY2xhenotPm1vZHVsZV9yZXF1aXJlcyA+IEZSRUVUWVBFX1ZFUl9GSVhFRCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVmVyc2lvbiApOwotCi0gICAgLyogbG9vayBmb3IgYSBtb2R1bGUgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBsaWJyYXJ5J3MgdGFibGUgKi8KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgbGlicmFyeS0+bnVtX21vZHVsZXM7IG5uKysgKQotICAgIHsKLSAgICAgIG1vZHVsZSA9IGxpYnJhcnktPm1vZHVsZXNbbm5dOwotICAgICAgaWYgKCBmdF9zdHJjbXAoIG1vZHVsZS0+Y2xhenotPm1vZHVsZV9uYW1lLCBjbGF6ei0+bW9kdWxlX25hbWUgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcyBpbnN0YWxsZWQgbW9kdWxlIGhhcyB0aGUgc2FtZSBuYW1lLCBjb21wYXJlIHRoZWlyIHZlcnNpb25zICovCi0gICAgICAgIGlmICggY2xhenotPm1vZHVsZV92ZXJzaW9uIDw9IG1vZHVsZS0+Y2xhenotPm1vZHVsZV92ZXJzaW9uICkKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIExvd2VyX01vZHVsZV9WZXJzaW9uICk7Ci0KLSAgICAgICAgLyogcmVtb3ZlIHRoZSBtb2R1bGUgZnJvbSBvdXIgbGlzdCwgdGhlbiBleGl0IHRoZSBsb29wIHRvIHJlcGxhY2UgKi8KLSAgICAgICAgLyogaXQgYnkgb3VyIG5ldyB2ZXJzaW9uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgRlRfUmVtb3ZlX01vZHVsZSggbGlicmFyeSwgbW9kdWxlICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIGxpYnJhcnktPm51bV9tb2R1bGVzID49IEZUX01BWF9NT0RVTEVTICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBUb29fTWFueV9Ecml2ZXJzICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgbW9kdWxlIG9iamVjdCAqLwotICAgIGlmICggRlRfQUxMT0MoIG1vZHVsZSwgY2xhenotPm1vZHVsZV9zaXplICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogYmFzZSBpbml0aWFsaXphdGlvbiAqLwotICAgIG1vZHVsZS0+bGlicmFyeSA9IGxpYnJhcnk7Ci0gICAgbW9kdWxlLT5tZW1vcnkgID0gbWVtb3J5OwotICAgIG1vZHVsZS0+Y2xhenogICA9IChGVF9Nb2R1bGVfQ2xhc3MqKWNsYXp6OwotCi0gICAgLyogY2hlY2sgd2hldGhlciB0aGUgbW9kdWxlIGlzIGEgcmVuZGVyZXIgLSB0aGlzIG11c3QgYmUgcGVyZm9ybWVkICovCi0gICAgLyogYmVmb3JlIHRoZSBub3JtYWwgbW9kdWxlIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBGVF9NT0RVTEVfSVNfUkVOREVSRVIoIG1vZHVsZSApICkKLSAgICB7Ci0gICAgICAvKiBhZGQgdG8gdGhlIHJlbmRlcmVycyBsaXN0ICovCi0gICAgICBlcnJvciA9IGZ0X2FkZF9yZW5kZXJlciggbW9kdWxlICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBtb2R1bGUgYSBhdXRvLWhpbnRlcj8gKi8KLSAgICBpZiAoIEZUX01PRFVMRV9JU19ISU5URVIoIG1vZHVsZSApICkKLSAgICAgIGxpYnJhcnktPmF1dG9faGludGVyID0gbW9kdWxlOwotCi0gICAgLyogaWYgdGhlIG1vZHVsZSBpcyBhIGZvbnQgZHJpdmVyICovCi0gICAgaWYgKCBGVF9NT0RVTEVfSVNfRFJJVkVSKCBtb2R1bGUgKSApCi0gICAgewotICAgICAgRlRfRHJpdmVyICBkcml2ZXIgPSBGVF9EUklWRVIoIG1vZHVsZSApOwotCi0KLSAgICAgIGRyaXZlci0+Y2xhenogPSAoRlRfRHJpdmVyX0NsYXNzKW1vZHVsZS0+Y2xheno7Ci0gICAgfQotCi0gICAgaWYgKCBjbGF6ei0+bW9kdWxlX2luaXQgKQotICAgIHsKLSAgICAgIGVycm9yID0gY2xhenotPm1vZHVsZV9pbml0KCBtb2R1bGUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogYWRkIG1vZHVsZSB0byB0aGUgbGlicmFyeSdzIHRhYmxlICovCi0gICAgbGlicmFyeS0+bW9kdWxlc1tsaWJyYXJ5LT5udW1fbW9kdWxlcysrXSA9IG1vZHVsZTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIGlmICggRlRfTU9EVUxFX0lTX1JFTkRFUkVSKCBtb2R1bGUgKSApCi0gICAgewotICAgICAgRlRfUmVuZGVyZXIgIHJlbmRlcmVyID0gRlRfUkVOREVSRVIoIG1vZHVsZSApOwotCi0KLSAgICAgIGlmICggcmVuZGVyZXItPmNsYXp6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgcmVuZGVyZXItPmNsYXp6LT5nbHlwaF9mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUgJiYKLSAgICAgICAgICAgcmVuZGVyZXItPnJhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICByZW5kZXJlci0+Y2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX2RvbmUoIHJlbmRlcmVyLT5yYXN0ZXIgKTsKLSAgICB9Ci0KLSAgICBGVF9GUkVFKCBtb2R1bGUgKTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX01vZHVsZSApCi0gIEZUX0dldF9Nb2R1bGUoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX25hbWUgKQotICB7Ci0gICAgRlRfTW9kdWxlICAgcmVzdWx0ID0gTlVMTDsKLSAgICBGVF9Nb2R1bGUqICBjdXI7Ci0gICAgRlRfTW9kdWxlKiAgbGltaXQ7Ci0KLQotICAgIGlmICggIWxpYnJhcnkgfHwgIW1vZHVsZV9uYW1lICkKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICBjdXIgICA9IGxpYnJhcnktPm1vZHVsZXM7Ci0gICAgbGltaXQgPSBjdXIgKyBsaWJyYXJ5LT5udW1fbW9kdWxlczsKLQotICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgIGlmICggZnRfc3RyY21wKCBjdXJbMF0tPmNsYXp6LT5tb2R1bGVfbmFtZSwgbW9kdWxlX25hbWUgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gY3VyWzBdOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggY29uc3Qgdm9pZCogKQotICBGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kX25hbWUgKQotICB7Ci0gICAgRlRfTW9kdWxlICBtb2R1bGU7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBkZWxheWVkIHRvIEZUX0dldF9Nb2R1bGUoKSAqLwotCi0gICAgbW9kdWxlID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgbW9kX25hbWUgKTsKLQotICAgIHJldHVybiBtb2R1bGUgPyBtb2R1bGUtPmNsYXp6LT5tb2R1bGVfaW50ZXJmYWNlIDogMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNlcnZpY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGdsb2JhbCApCi0gIHsKLSAgICBGVF9Qb2ludGVyICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIG1vZHVsZSApCi0gICAgewotICAgICAgRlRfQVNTRVJUKCBtb2R1bGUtPmNsYXp6ICYmIG1vZHVsZS0+Y2xhenotPmdldF9pbnRlcmZhY2UgKTsKLQotICAgICAgLyogZmlyc3QsIGxvb2sgZm9yIHRoZSBzZXJ2aWNlIGluIHRoZSBtb2R1bGUgKi8KLSAgICAgIGlmICggbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSApCi0gICAgICAgIHJlc3VsdCA9IG1vZHVsZS0+Y2xhenotPmdldF9pbnRlcmZhY2UoIG1vZHVsZSwgc2VydmljZV9pZCApOwotCi0gICAgICBpZiAoIGdsb2JhbCAmJiAhcmVzdWx0ICkKLSAgICAgIHsKLSAgICAgICAgLyogd2UgZGlkbid0IGZpbmQgaXQsIGxvb2sgaW4gYWxsIG90aGVyIG1vZHVsZXMgdGhlbiAqLwotICAgICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotICAgICAgICBGVF9Nb2R1bGUqICBjdXIgICAgID0gbGlicmFyeS0+bW9kdWxlczsKLSAgICAgICAgRlRfTW9kdWxlKiAgbGltaXQgICA9IGN1ciArIGxpYnJhcnktPm51bV9tb2R1bGVzOwotCi0KLSAgICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBjdXJbMF0gIT0gbW9kdWxlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9BU1NFUlQoIGN1clswXS0+Y2xhenogKTsKLQotICAgICAgICAgICAgaWYgKCBjdXJbMF0tPmNsYXp6LT5nZXRfaW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gY3VyWzBdLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggY3VyWzBdLCBzZXJ2aWNlX2lkICk7Ci0gICAgICAgICAgICAgIGlmICggcmVzdWx0ICkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1JlbW92ZV9Nb2R1bGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZSAgIG1vZHVsZSApCi0gIHsKLSAgICAvKiB0cnkgdG8gZmluZCB0aGUgbW9kdWxlIGZyb20gdGhlIHRhYmxlLCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZXJlICovCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgaWYgKCBtb2R1bGUgKQotICAgIHsKLSAgICAgIEZUX01vZHVsZSogIGN1ciAgID0gbGlicmFyeS0+bW9kdWxlczsKLSAgICAgIEZUX01vZHVsZSogIGxpbWl0ID0gY3VyICsgbGlicmFyeS0+bnVtX21vZHVsZXM7Ci0KLQotICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgICAgewotICAgICAgICBpZiAoIGN1clswXSA9PSBtb2R1bGUgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogcmVtb3ZlIGl0IGZyb20gdGhlIHRhYmxlICovCi0gICAgICAgICAgbGlicmFyeS0+bnVtX21vZHVsZXMtLTsKLSAgICAgICAgICBsaW1pdC0tOwotICAgICAgICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGN1clswXSA9IGN1clsxXTsKLSAgICAgICAgICAgIGN1cisrOwotICAgICAgICAgIH0KLSAgICAgICAgICBsaW1pdFswXSA9IE5VTEw7Ci0KLSAgICAgICAgICAvKiBkZXN0cm95IHRoZSBtb2R1bGUgKi8KLSAgICAgICAgICBEZXN0cm95X01vZHVsZSggbW9kdWxlICk7Ci0KLSAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Ecml2ZXJfSGFuZGxlICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9wcm9wZXJ0eV9kbyggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIG1vZHVsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgc2V0LAotICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgdmFsdWVfaXNfc3RyaW5nICkKLSAgewotICAgIEZUX01vZHVsZSogICAgICAgICAgIGN1cjsKLSAgICBGVF9Nb2R1bGUqICAgICAgICAgICBsaW1pdDsKLSAgICBGVF9Nb2R1bGVfSW50ZXJmYWNlICBpbnRlcmZhY2U7Ci0KLSAgICBGVF9TZXJ2aWNlX1Byb3BlcnRpZXMgIHNlcnZpY2U7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgotICAgIGNvbnN0IEZUX1N0cmluZyogIHNldF9uYW1lICA9ICJGVF9Qcm9wZXJ0eV9TZXQiOwotICAgIGNvbnN0IEZUX1N0cmluZyogIGdldF9uYW1lICA9ICJGVF9Qcm9wZXJ0eV9HZXQiOwotICAgIGNvbnN0IEZUX1N0cmluZyogIGZ1bmNfbmFtZSA9IHNldCA/IHNldF9uYW1lIDogZ2V0X25hbWU7Ci0jZW5kaWYKLQotICAgIEZUX0Jvb2wgIG1pc3NpbmdfZnVuYzsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIW1vZHVsZV9uYW1lIHx8ICFwcm9wZXJ0eV9uYW1lIHx8ICF2YWx1ZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGN1ciAgID0gbGlicmFyeS0+bW9kdWxlczsKLSAgICBsaW1pdCA9IGN1ciArIGxpYnJhcnktPm51bV9tb2R1bGVzOwotCi0gICAgLyogc2VhcmNoIG1vZHVsZSAqLwotICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgIGlmICggIWZ0X3N0cmNtcCggY3VyWzBdLT5jbGF6ei0+bW9kdWxlX25hbWUsIG1vZHVsZV9uYW1lICkgKQotICAgICAgICBicmVhazsKLQotICAgIGlmICggY3VyID09IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICIlczogY2FuJ3QgZmluZCBtb2R1bGUgYCVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBtb2R1bGVfbmFtZSApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggTWlzc2luZ19Nb2R1bGUgKTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBzZXJ2aWNlIGludGVyZmFjZSAqLwotICAgIGlmICggIWN1clswXS0+Y2xhenotPmdldF9pbnRlcmZhY2UgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIiVzOiBtb2R1bGUgYCVzJyBkb2Vzbid0IHN1cHBvcnQgcHJvcGVydGllc1xuIiwKLSAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBtb2R1bGVfbmFtZSApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgfQotCi0gICAgLyogc2VhcmNoIHByb3BlcnR5IHNlcnZpY2UgKi8KLSAgICBpbnRlcmZhY2UgPSBjdXJbMF0tPmNsYXp6LT5nZXRfaW50ZXJmYWNlKCBjdXJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTICk7Ci0gICAgaWYgKCAhaW50ZXJmYWNlICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICIlczogbW9kdWxlIGAlcycgZG9lc24ndCBzdXBwb3J0IHByb3BlcnRpZXNcbiIsCi0gICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgbW9kdWxlX25hbWUgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgIH0KLQotICAgIHNlcnZpY2UgPSAoRlRfU2VydmljZV9Qcm9wZXJ0aWVzKWludGVyZmFjZTsKLQotICAgIGlmICggc2V0ICkKLSAgICAgIG1pc3NpbmdfZnVuYyA9IChGVF9Cb29sKSggIXNlcnZpY2UtPnNldF9wcm9wZXJ0eSApOwotICAgIGVsc2UKLSAgICAgIG1pc3NpbmdfZnVuYyA9IChGVF9Cb29sKSggIXNlcnZpY2UtPmdldF9wcm9wZXJ0eSApOwotCi0gICAgaWYgKCBtaXNzaW5nX2Z1bmMgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIiVzOiBwcm9wZXJ0eSBzZXJ2aWNlIG9mIG1vZHVsZSBgJXMnIGlzIGJyb2tlblxuIiwKLSAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBtb2R1bGVfbmFtZSApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNldCA/IHNlcnZpY2UtPnNldF9wcm9wZXJ0eSggY3VyWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfaXNfc3RyaW5nICkKLSAgICAgICAgICAgICAgIDogc2VydmljZS0+Z2V0X3Byb3BlcnR5KCBjdXJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1Byb3BlcnR5X1NldCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICAgICAgIHZhbHVlICkKLSAgewotICAgIHJldHVybiBmdF9wcm9wZXJ0eV9kbyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKil2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1Byb3BlcnR5X0dldCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHZhbHVlICkKLSAgewotICAgIHJldHVybiBmdF9wcm9wZXJ0eV9kbyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSApOwotICB9Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUwotCi0gIC8qIHRoaXMgdmFyaWFudCBpcyB1c2VkIGZvciBoYW5kbGluZyB0aGUgRlJFRVRZUEVfUFJPUEVSVElFUyAqLwotICAvKiBlbnZpcm9ubWVudCB2YXJpYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBmdF9wcm9wZXJ0eV9zdHJpbmdfc2V0KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgICAgICAgdmFsdWUgKQotICB7Ci0gICAgcmV0dXJuIGZ0X3Byb3BlcnR5X2RvKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKXZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgKTsKLSAgfQotCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgTCBJIEIgUiBBIFIgWSAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmVmZXJlbmNlX0xpYnJhcnkoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGxpYnJhcnktPnJlZmNvdW50Kys7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX05ld19MaWJyYXJ5KCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgKmFsaWJyYXJ5ICkKLSAgewotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBOVUxMOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFtZW1vcnkgfHwgIWFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKLSAgICAvKiBpbml0IGRlYnVnZ2luZyBzdXBwb3J0ICovCi0gICAgZnRfZGVidWdfaW5pdCgpOwotI2VuZGlmCi0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIGFsbG9jYXRlIHRoZSBsaWJyYXJ5IG9iamVjdCAqLwotICAgIGlmICggRlRfTkVXKCBsaWJyYXJ5ICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgbGlicmFyeS0+bWVtb3J5ID0gbWVtb3J5OwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICAvKiBpbml0aWFsaXplIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgY29udGFpbmVycyAqLwotICAgIGVycm9yID0gZnRfcGljX2NvbnRhaW5lcl9pbml0KCBsaWJyYXJ5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0jZW5kaWYKLQotICAgIGxpYnJhcnktPnZlcnNpb25fbWFqb3IgPSBGUkVFVFlQRV9NQUpPUjsKLSAgICBsaWJyYXJ5LT52ZXJzaW9uX21pbm9yID0gRlJFRVRZUEVfTUlOT1I7Ci0gICAgbGlicmFyeS0+dmVyc2lvbl9wYXRjaCA9IEZSRUVUWVBFX1BBVENIOwotCi0gICAgbGlicmFyeS0+cmVmY291bnQgPSAxOwotCi0gICAgLyogVGhhdCdzIG9rIG5vdyAqLwotICAgICphbGlicmFyeSA9IGxpYnJhcnk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgRmFpbDoKLSAgICBmdF9waWNfY29udGFpbmVyX2Rlc3Ryb3koIGxpYnJhcnkgKTsKLSNlbmRpZgotICAgIEZUX0ZSRUUoIGxpYnJhcnkgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9MaWJyYXJ5X1ZlcnNpb24oIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgKmFtaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYXBhdGNoICkKLSAgewotICAgIEZUX0ludCAgbWFqb3IgPSAwOwotICAgIEZUX0ludCAgbWlub3IgPSAwOwotICAgIEZUX0ludCAgcGF0Y2ggPSAwOwotCi0KLSAgICBpZiAoIGxpYnJhcnkgKQotICAgIHsKLSAgICAgIG1ham9yID0gbGlicmFyeS0+dmVyc2lvbl9tYWpvcjsKLSAgICAgIG1pbm9yID0gbGlicmFyeS0+dmVyc2lvbl9taW5vcjsKLSAgICAgIHBhdGNoID0gbGlicmFyeS0+dmVyc2lvbl9wYXRjaDsKLSAgICB9Ci0KLSAgICBpZiAoIGFtYWpvciApCi0gICAgICAqYW1ham9yID0gbWFqb3I7Ci0KLSAgICBpZiAoIGFtaW5vciApCi0gICAgICAqYW1pbm9yID0gbWlub3I7Ci0KLSAgICBpZiAoIGFwYXRjaCApCi0gICAgICAqYXBhdGNoID0gcGF0Y2g7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9MaWJyYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgbGlicmFyeS0+cmVmY291bnQtLTsKLSAgICBpZiAoIGxpYnJhcnktPnJlZmNvdW50ID4gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICAvKgotICAgICAqIENsb3NlIGFsbCBmYWNlcyBpbiB0aGUgbGlicmFyeS4gIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlIGNhbiBoYXZlCi0gICAgICogc29tZSBzdWJ0bGUgbWVtb3J5IGxlYWtzLgotICAgICAqCi0gICAgICogRXhhbXBsZToKLSAgICAgKgotICAgICAqICAtIHRoZSBjZmYgZm9udCBkcml2ZXIgdXNlcyB0aGUgcHNoaW50ZXIgbW9kdWxlIGluIGNmZl9zaXplX2RvbmUKLSAgICAgKiAgLSBpZiB0aGUgcHNoaW50ZXIgbW9kdWxlIGlzIGRlc3Ryb3llZCBiZWZvcmUgdGhlIGNmZiBmb250IGRyaXZlciwKLSAgICAgKiAgICBvcGVuZWQgRlRfRmFjZSBvYmplY3RzIG1hbmFnZWQgYnkgdGhlIGRyaXZlciBhcmUgbm90IHByb3Blcmx5Ci0gICAgICogICAgZGVzdHJveWVkLCByZXN1bHRpbmcgaW4gYSBtZW1vcnkgbGVhawotICAgICAqCi0gICAgICogU29tZSBmYWNlcyBhcmUgZGVwZW5kZW50IG9uIG90aGVyIGZhY2VzLCBsaWtlIFR5cGU0MiBmYWNlcyB0aGF0Ci0gICAgICogZGVwZW5kIG9uIFRydWVUeXBlIGZhY2VzIHN5bnRoZXNpemVkIGludGVybmFsbHkuCi0gICAgICoKLSAgICAgKiBUaGUgb3JkZXIgb2YgZHJpdmVycyBzaG91bGQgYmUgc3BlY2lmaWVkIGluIGRyaXZlcl9uYW1lW10uCi0gICAgICovCi0gICAgewotICAgICAgRlRfVUludCAgICAgIG0sIG47Ci0gICAgICBjb25zdCBjaGFyKiAgZHJpdmVyX25hbWVbXSA9IHsgInR5cGU0MiIsIE5VTEwgfTsKLQotCi0gICAgICBmb3IgKCBtID0gMDsKLSAgICAgICAgICAgIG0gPCBzaXplb2YgKCBkcml2ZXJfbmFtZSApIC8gc2l6ZW9mICggZHJpdmVyX25hbWVbMF0gKTsKLSAgICAgICAgICAgIG0rKyApCi0gICAgICB7Ci0gICAgICAgIGZvciAoIG4gPSAwOyBuIDwgbGlicmFyeS0+bnVtX21vZHVsZXM7IG4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Nb2R1bGUgICAgbW9kdWxlICAgICAgPSBsaWJyYXJ5LT5tb2R1bGVzW25dOwotICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2R1bGVfbmFtZSA9IG1vZHVsZS0+Y2xhenotPm1vZHVsZV9uYW1lOwotICAgICAgICAgIEZUX0xpc3QgICAgICBmYWNlczsKLQotCi0gICAgICAgICAgaWYgKCBkcml2ZXJfbmFtZVttXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGZ0X3N0cmNtcCggbW9kdWxlX25hbWUsIGRyaXZlcl9uYW1lW21dICkgIT0gMCApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGlmICggKCBtb2R1bGUtPmNsYXp6LT5tb2R1bGVfZmxhZ3MgJiBGVF9NT0RVTEVfRk9OVF9EUklWRVIgKSA9PSAwICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgRlRfVFJBQ0U3KCggIkZUX0RvbmVfTGlicmFyeTogY2xvc2UgZmFjZXMgZm9yICVzXG4iLCBtb2R1bGVfbmFtZSApKTsKLQotICAgICAgICAgIGZhY2VzID0gJkZUX0RSSVZFUiggbW9kdWxlICktPmZhY2VzX2xpc3Q7Ci0gICAgICAgICAgd2hpbGUgKCBmYWNlcy0+aGVhZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRG9uZV9GYWNlKCBGVF9GQUNFKCBmYWNlcy0+aGVhZC0+ZGF0YSApICk7Ci0gICAgICAgICAgICBpZiAoIGZhY2VzLT5oZWFkICkKLSAgICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkZUX0RvbmVfTGlicmFyeTogZmFpbGVkIHRvIGZyZWUgc29tZSBmYWNlc1xuIiApKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDbG9zZSBhbGwgb3RoZXIgbW9kdWxlcyBpbiB0aGUgbGlicmFyeSAqLwotI2lmIDEKLSAgICAvKiBYWFggTW9kdWxlcyBhcmUgcmVtb3ZlZCBpbiB0aGUgcmV2ZXJzZWQgb3JkZXIgc28gdGhhdCAgKi8KLSAgICAvKiB0eXBlNDIgbW9kdWxlIGlzIHJlbW92ZWQgYmVmb3JlIHRydWV0eXBlIG1vZHVsZS4gIFRoaXMgKi8KLSAgICAvKiBhdm9pZHMgZG91YmxlIGZyZWUgaW4gc29tZSBvY2Nhc2lvbnMuICBJdCBpcyBhIGhhY2suICAgKi8KLSAgICB3aGlsZSAoIGxpYnJhcnktPm51bV9tb2R1bGVzID4gMCApCi0gICAgICBGVF9SZW1vdmVfTW9kdWxlKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeS0+bW9kdWxlc1tsaWJyYXJ5LT5udW1fbW9kdWxlcyAtIDFdICk7Ci0jZWxzZQotICAgIHsKLSAgICAgIEZUX1VJbnQgIG47Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBsaWJyYXJ5LT5udW1fbW9kdWxlczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfTW9kdWxlICBtb2R1bGUgPSBsaWJyYXJ5LT5tb2R1bGVzW25dOwotCi0KLSAgICAgICAgaWYgKCBtb2R1bGUgKQotICAgICAgICB7Ci0gICAgICAgICAgRGVzdHJveV9Nb2R1bGUoIG1vZHVsZSApOwotICAgICAgICAgIGxpYnJhcnktPm1vZHVsZXNbbl0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIC8qIERlc3Ryb3kgcGljIGNvbnRhaW5lciBjb250ZW50cyAqLwotICAgIGZ0X3BpY19jb250YWluZXJfZGVzdHJveSggbGlicmFyeSApOwotI2VuZGlmCi0KLSAgICBGVF9GUkVFKCBsaWJyYXJ5ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfU2V0X0RlYnVnX0hvb2soIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGhvb2tfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9EZWJ1Z0hvb2tfRnVuYyAgZGVidWdfaG9vayApCi0gIHsKLSAgICBpZiAoIGxpYnJhcnkgJiYgZGVidWdfaG9vayAmJgotICAgICAgICAgaG9va19pbmRleCA8Ci0gICAgICAgICAgICggc2l6ZW9mICggbGlicmFyeS0+ZGVidWdfaG9va3MgKSAvIHNpemVvZiAoIHZvaWQqICkgKSApCi0gICAgICBsaWJyYXJ5LT5kZWJ1Z19ob29rc1tob29rX2luZGV4XSA9IGRlYnVnX2hvb2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1RydWVUeXBlRW5naW5lVHlwZSApCi0gIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9UcnVlVHlwZUVuZ2luZVR5cGUgIHJlc3VsdCA9IEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX05PTkU7Ci0KLQotICAgIGlmICggbGlicmFyeSApCi0gICAgewotICAgICAgRlRfTW9kdWxlICBtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBsaWJyYXJ5LCAidHJ1ZXR5cGUiICk7Ci0KLQotICAgICAgaWYgKCBtb2R1bGUgKQotICAgICAgewotICAgICAgICBGVF9TZXJ2aWNlX1RydWVUeXBlRW5naW5lICBzZXJ2aWNlOwotCi0KLSAgICAgICAgc2VydmljZSA9IChGVF9TZXJ2aWNlX1RydWVUeXBlRW5naW5lKQotICAgICAgICAgICAgICAgICAgICBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TRVJWSUNFX0lEX1RSVUVUWVBFX0VOR0lORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0gICAgICAgIGlmICggc2VydmljZSApCi0gICAgICAgICAgcmVzdWx0ID0gc2VydmljZS0+ZW5naW5lX3R5cGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfU3ViR2x5cGhfSW5mbyggRlRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgc3ViX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpwX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICpwX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpwX2FyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCAgICAqcF90cmFuc2Zvcm0gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLQotICAgIGlmICggZ2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBnbHlwaC0+c3ViZ2x5cGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSAmJgotICAgICAgICAgc3ViX2luZGV4IDwgZ2x5cGgtPm51bV9zdWJnbHlwaHMgICAgICAgICAgICkKLSAgICB7Ci0gICAgICBGVF9TdWJHbHlwaCAgc3ViZyA9IGdseXBoLT5zdWJnbHlwaHMgKyBzdWJfaW5kZXg7Ci0KLQotICAgICAgKnBfaW5kZXggICAgID0gc3ViZy0+aW5kZXg7Ci0gICAgICAqcF9mbGFncyAgICAgPSBzdWJnLT5mbGFnczsKLSAgICAgICpwX2FyZzEgICAgICA9IHN1YmctPmFyZzE7Ci0gICAgICAqcF9hcmcyICAgICAgPSBzdWJnLT5hcmcyOwotICAgICAgKnBfdHJhbnNmb3JtID0gc3ViZy0+dHJhbnNmb3JtOwotCi0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0b3R2YWwuYyBiL3NyYy9iYXNlL2Z0b3R2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhMDk4Ni4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdG90dmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG90dmFsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIE9wZW5UeXBlIHRhYmxlcyAoYm9keSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX09QRU5UWVBFX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX09QRU5UWVBFX1ZBTElEQVRFX0gKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdHZhbC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PcGVuVHlwZV9WYWxpZGF0ZSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICB2YWxpZGF0aW9uX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICpCQVNFX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICpHREVGX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICpHUE9TX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICpHU1VCX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICpKU1RGX3RhYmxlICkKLSAgewotICAgIEZUX1NlcnZpY2VfT1R2YWxpZGF0ZSAgc2VydmljZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAhKCBCQVNFX3RhYmxlICYmCi0gICAgICAgICAgICBHREVGX3RhYmxlICYmCi0gICAgICAgICAgICBHUE9TX3RhYmxlICYmCi0gICAgICAgICAgICBHU1VCX3RhYmxlICYmCi0gICAgICAgICAgICBKU1RGX3RhYmxlICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIE9QRU5UWVBFX1ZBTElEQVRFICk7Ci0KLSAgICBpZiAoIHNlcnZpY2UgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT52YWxpZGF0ZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVNFX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RFRl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQT1NfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1VCX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNURl90YWJsZSApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfT3BlblR5cGVfRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0gICAgRlRfRlJFRSggdGFibGUgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRvdXRsbi5jIGIvc3JjL2Jhc2UvZnRvdXRsbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2ViOWNmLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0b3V0bG4uYworKysgL2Rldi9udWxsCkBAIC0xLDExMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvdXRsbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIG91dGxpbmUgbWFuYWdlbWVudCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWxsIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgaW4gZnJlZXR5cGUuaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vdXRsaW5lCi0KLQotICBzdGF0aWMKLSAgY29uc3QgRlRfT3V0bGluZSAgbnVsbF9vdXRsaW5lID0geyAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAwIH07Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9EZWNvbXBvc2UoIEZUX091dGxpbmUqICAgICAgICAgICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3V0bGluZV9GdW5jcyogIGZ1bmNfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgIHVzZXIgKQotICB7Ci0jdW5kZWYgIFNDQUxFRAotI2RlZmluZSBTQ0FMRUQoIHggKSAgKCAoICh4KSA8IDAgPyAtKCAtKHgpIDw8IHNoaWZ0ICkgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgKCAgKHgpIDw8IHNoaWZ0ICkgKSAtIGRlbHRhICkKLQotICAgIEZUX1ZlY3RvciAgIHZfbGFzdDsKLSAgICBGVF9WZWN0b3IgICB2X2NvbnRyb2w7Ci0gICAgRlRfVmVjdG9yICAgdl9zdGFydDsKLQotICAgIEZUX1ZlY3RvciogIHBvaW50OwotICAgIEZUX1ZlY3RvciogIGxpbWl0OwotICAgIGNoYXIqICAgICAgIHRhZ3M7Ci0KLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotICAgIEZUX0ludCAgIG47ICAgICAgICAgLyogaW5kZXggb2YgY29udG91ciBpbiBvdXRsaW5lICAgICAqLwotICAgIEZUX1VJbnQgIGZpcnN0OyAgICAgLyogaW5kZXggb2YgZmlyc3QgcG9pbnQgaW4gY29udG91ciAqLwotICAgIEZUX0ludCAgIHRhZzsgICAgICAgLyogY3VycmVudCBwb2ludCdzIHN0YXRlICAgICAgICAgICAqLwotCi0gICAgRlRfSW50ICAgc2hpZnQ7Ci0gICAgRlRfUG9zICAgZGVsdGE7Ci0KLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIGlmICggIWZ1bmNfaW50ZXJmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgc2hpZnQgPSBmdW5jX2ludGVyZmFjZS0+c2hpZnQ7Ci0gICAgZGVsdGEgPSBmdW5jX2ludGVyZmFjZS0+ZGVsdGE7Ci0gICAgZmlyc3QgPSAwOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX0ludCAgbGFzdDsgIC8qIGluZGV4IG9mIGxhc3QgcG9pbnQgaW4gY29udG91ciAqLwotCi0KLSAgICAgIEZUX1RSQUNFNSgoICJGVF9PdXRsaW5lX0RlY29tcG9zZTogT3V0bGluZSAlZFxuIiwgbiApKTsKLQotICAgICAgbGFzdCA9IG91dGxpbmUtPmNvbnRvdXJzW25dOwotICAgICAgaWYgKCBsYXN0IDwgMCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotICAgICAgbGltaXQgPSBvdXRsaW5lLT5wb2ludHMgKyBsYXN0OwotCi0gICAgICB2X3N0YXJ0ICAgPSBvdXRsaW5lLT5wb2ludHNbZmlyc3RdOwotICAgICAgdl9zdGFydC54ID0gU0NBTEVEKCB2X3N0YXJ0LnggKTsKLSAgICAgIHZfc3RhcnQueSA9IFNDQUxFRCggdl9zdGFydC55ICk7Ci0KLSAgICAgIHZfbGFzdCAgID0gb3V0bGluZS0+cG9pbnRzW2xhc3RdOwotICAgICAgdl9sYXN0LnggPSBTQ0FMRUQoIHZfbGFzdC54ICk7Ci0gICAgICB2X2xhc3QueSA9IFNDQUxFRCggdl9sYXN0LnkgKTsKLQotICAgICAgdl9jb250cm9sID0gdl9zdGFydDsKLQotICAgICAgcG9pbnQgPSBvdXRsaW5lLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgIHRhZ3MgID0gb3V0bGluZS0+dGFncyAgICsgZmlyc3Q7Ci0gICAgICB0YWcgICA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgICAvKiBBIGNvbnRvdXIgY2Fubm90IHN0YXJ0IHdpdGggYSBjdWJpYyBjb250cm9sIHBvaW50ISAqLwotICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NVQklDICkKLSAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgIC8qIGNoZWNrIGZpcnN0IHBvaW50IHRvIGRldGVybWluZSBvcmlnaW4gKi8KLSAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICB7Ci0gICAgICAgIC8qIGZpcnN0IHBvaW50IGlzIGNvbmljIGNvbnRyb2wuICBZZXMsIHRoaXMgaGFwcGVucy4gKi8KLSAgICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUtPnRhZ3NbbGFzdF0gKSA9PSBGVF9DVVJWRV9UQUdfT04gKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc3RhcnQgYXQgbGFzdCBwb2ludCBpZiBpdCBpcyBvbiB0aGUgY3VydmUgKi8KLSAgICAgICAgICB2X3N0YXJ0ID0gdl9sYXN0OwotICAgICAgICAgIGxpbWl0LS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogaWYgYm90aCBmaXJzdCBhbmQgbGFzdCBwb2ludHMgYXJlIGNvbmljLCAgICAgICAgICovCi0gICAgICAgICAgLyogc3RhcnQgYXQgdGhlaXIgbWlkZGxlIGFuZCByZWNvcmQgaXRzIHBvc2l0aW9uICAgICovCi0gICAgICAgICAgLyogZm9yIGNsb3N1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgdl9zdGFydC54ID0gKCB2X3N0YXJ0LnggKyB2X2xhc3QueCApIC8gMjsKLSAgICAgICAgICB2X3N0YXJ0LnkgPSAoIHZfc3RhcnQueSArIHZfbGFzdC55ICkgLyAyOwotCi0gICAgICAgLyogdl9sYXN0ID0gdl9zdGFydDsgKi8KLSAgICAgICAgfQotICAgICAgICBwb2ludC0tOwotICAgICAgICB0YWdzLS07Ci0gICAgICB9Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgIG1vdmUgdG8gKCUuMmYsICUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgdl9zdGFydC54IC8gNjQuMCwgdl9zdGFydC55IC8gNjQuMCApKTsKLSAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPm1vdmVfdG8oICZ2X3N0YXJ0LCB1c2VyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICB3aGlsZSAoIHBvaW50IDwgbGltaXQgKQotICAgICAgewotICAgICAgICBwb2ludCsrOwotICAgICAgICB0YWdzKys7Ci0KLSAgICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0gICAgICAgIHN3aXRjaCAoIHRhZyApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBGVF9DVVJWRV9UQUdfT046ICAvKiBlbWl0IGEgc2luZ2xlIGxpbmVfdG8gKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzsKLQotCi0gICAgICAgICAgICB2ZWMueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICAgIHZlYy55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBsaW5lIHRvICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlYy54IC8gNjQuMCwgdmVjLnkgLyA2NC4wICkpOwotICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+bGluZV90byggJnZlYywgdXNlciApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIEZUX0NVUlZFX1RBR19DT05JQzogIC8qIGNvbnN1bWUgY29uaWMgYXJjcyAqLwotICAgICAgICAgIHZfY29udHJvbC54ID0gU0NBTEVEKCBwb2ludC0+eCApOwotICAgICAgICAgIHZfY29udHJvbC55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgIERvX0NvbmljOgotICAgICAgICAgIGlmICggcG9pbnQgPCBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZfbWlkZGxlOwotCi0KLSAgICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgICAgICB0YWdzKys7Ci0gICAgICAgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLQotICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICB2ZWMueSA9IFNDQUxFRCggcG9pbnQtPnkgKTsKLQotICAgICAgICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY29uaWMgdG8gKCUuMmYsICUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZlYy54IC8gNjQuMCwgdmVjLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2X2NvbnRyb2wueCAvIDY0LjAsIHZfY29udHJvbC55IC8gNjQuMCApKTsKLSAgICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y29uaWNfdG8oICZ2X2NvbnRyb2wsICZ2ZWMsIHVzZXIgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCB0YWcgIT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICAgICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgICAgIHZfbWlkZGxlLnggPSAoIHZfY29udHJvbC54ICsgdmVjLnggKSAvIDI7Ci0gICAgICAgICAgICB2X21pZGRsZS55ID0gKCB2X2NvbnRyb2wueSArIHZlYy55ICkgLyAyOwotCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBjb25pYyB0byAoJS4yZiwgJS4yZikiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2X21pZGRsZS54IC8gNjQuMCwgdl9taWRkbGUueSAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICB2X2NvbnRyb2wueCAvIDY0LjAsIHZfY29udHJvbC55IC8gNjQuMCApKTsKLSAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdl9taWRkbGUsIHVzZXIgKTsKLSAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIHZfY29udHJvbCA9IHZlYzsKLSAgICAgICAgICAgIGdvdG8gRG9fQ29uaWM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY29uaWMgdG8gKCUuMmYsICUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBjb250cm9sICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICB2X3N0YXJ0LnggLyA2NC4wLCB2X3N0YXJ0LnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgIHZfY29udHJvbC54IC8gNjQuMCwgdl9jb250cm9sLnkgLyA2NC4wICkpOwotICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdl9zdGFydCwgdXNlciApOwotICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0KLSAgICAgICAgZGVmYXVsdDogIC8qIEZUX0NVUlZFX1RBR19DVUJJQyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjMSwgdmVjMjsKLQotCi0gICAgICAgICAgICBpZiAoIHBvaW50ICsgMSA+IGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBGVF9DVVJWRV9UQUcoIHRhZ3NbMV0gKSAhPSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgICAgcG9pbnQgKz0gMjsKLSAgICAgICAgICAgIHRhZ3MgICs9IDI7Ci0KLSAgICAgICAgICAgIHZlYzEueCA9IFNDQUxFRCggcG9pbnRbLTJdLnggKTsKLSAgICAgICAgICAgIHZlYzEueSA9IFNDQUxFRCggcG9pbnRbLTJdLnkgKTsKLQotICAgICAgICAgICAgdmVjMi54ID0gU0NBTEVEKCBwb2ludFstMV0ueCApOwotICAgICAgICAgICAgdmVjMi55ID0gU0NBTEVEKCBwb2ludFstMV0ueSApOwotCi0gICAgICAgICAgICBpZiAoIHBvaW50IDw9IGxpbWl0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICAgICAgICB2ZWMueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICAgICAgdmVjLnkgPSBTQ0FMRUQoIHBvaW50LT55ICk7Ci0KLSAgICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY3ViaWMgdG8gKCUuMmYsICUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbHMgKCUuMmYsICUuMmYpIGFuZCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZlYy54IC8gNjQuMCwgdmVjLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMxLnggLyA2NC4wLCB2ZWMxLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyLnggLyA2NC4wLCB2ZWMyLnkgLyA2NC4wICkpOwotICAgICAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jdWJpY190byggJnZlYzEsICZ2ZWMyLCAmdmVjLCB1c2VyICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGN1YmljIHRvICglLjJmLCAlLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBjb250cm9scyAoJS4yZiwgJS4yZikgYW5kICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZfc3RhcnQueCAvIDY0LjAsIHZfc3RhcnQueSAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICB2ZWMxLnggLyA2NC4wLCB2ZWMxLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi54IC8gNjQuMCwgdmVjMi55IC8gNjQuMCApKTsKLSAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmN1YmljX3RvKCAmdmVjMSwgJnZlYzIsICZ2X3N0YXJ0LCB1c2VyICk7Ci0gICAgICAgICAgICBnb3RvIENsb3NlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBjbG9zZSB0aGUgY29udG91ciB3aXRoIGEgbGluZSBzZWdtZW50ICovCi0gICAgICBGVF9UUkFDRTUoKCAiICBsaW5lIHRvICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgIHZfc3RhcnQueCAvIDY0LjAsIHZfc3RhcnQueSAvIDY0LjAgKSk7Ci0gICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5saW5lX3RvKCAmdl9zdGFydCwgdXNlciApOwotCi0gICAgQ2xvc2U6Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmaXJzdCA9IChGVF9VSW50KWxhc3QgKyAxOwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJGVF9PdXRsaW5lX0RlY29tcG9zZTogRG9uZVxuIiwgbiApKTsKLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEV4aXQ6Ci0gICAgRlRfVFJBQ0U1KCggIkZUX091dGxpbmVfRGVjb21wb3NlOiBFcnJvciAweCV4XG4iLCBlcnJvciApKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgSW52YWxpZF9PdXRsaW5lOgotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0gIH0KLQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9OZXdfSW50ZXJuYWwoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGlmICggIWFub3V0bGluZSB8fCAhbWVtb3J5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgKmFub3V0bGluZSA9IG51bGxfb3V0bGluZTsKLQotICAgIGlmICggbnVtQ29udG91cnMgPCAwICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIChGVF9VSW50KW51bUNvbnRvdXJzID4gbnVtUG9pbnRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBudW1Qb2ludHMgPiBGVF9PVVRMSU5FX1BPSU5UU19NQVggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBBcnJheV9Ub29fTGFyZ2UgKTsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBhbm91dGxpbmUtPnBvaW50cywgICBudW1Qb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIGFub3V0bGluZS0+dGFncywgICAgIG51bVBvaW50cyAgICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggYW5vdXRsaW5lLT5jb250b3VycywgbnVtQ29udG91cnMgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBhbm91dGxpbmUtPm5fcG9pbnRzICAgID0gKEZUX1Nob3J0KW51bVBvaW50czsKLSAgICBhbm91dGxpbmUtPm5fY29udG91cnMgID0gKEZUX1Nob3J0KW51bUNvbnRvdXJzOwotICAgIGFub3V0bGluZS0+ZmxhZ3MgICAgICB8PSBGVF9PVVRMSU5FX09XTkVSOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICBGYWlsOgotICAgIGFub3V0bGluZS0+ZmxhZ3MgfD0gRlRfT1VUTElORV9PV05FUjsKLSAgICBGVF9PdXRsaW5lX0RvbmVfSW50ZXJuYWwoIG1lbW9yeSwgYW5vdXRsaW5lICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX05ldyggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApCi0gIHsKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgcmV0dXJuIEZUX091dGxpbmVfTmV3X0ludGVybmFsKCBsaWJyYXJ5LT5tZW1vcnksIG51bVBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNvbnRvdXJzLCBhbm91dGxpbmUgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfQ2hlY2soIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIGlmICggb3V0bGluZSApCi0gICAgewotICAgICAgRlRfSW50ICBuX3BvaW50cyAgID0gb3V0bGluZS0+bl9wb2ludHM7Ci0gICAgICBGVF9JbnQgIG5fY29udG91cnMgPSBvdXRsaW5lLT5uX2NvbnRvdXJzOwotICAgICAgRlRfSW50ICBlbmQwLCBlbmQ7Ci0gICAgICBGVF9JbnQgIG47Ci0KLQotICAgICAgLyogZW1wdHkgZ2x5cGg/ICovCi0gICAgICBpZiAoIG5fcG9pbnRzID09IDAgJiYgbl9jb250b3VycyA9PSAwICkKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgICAgLyogY2hlY2sgcG9pbnQgYW5kIGNvbnRvdXIgY291bnRzICovCi0gICAgICBpZiAoIG5fcG9pbnRzIDw9IDAgfHwgbl9jb250b3VycyA8PSAwICkKLSAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgIGVuZDAgPSBlbmQgPSAtMTsKLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbl9jb250b3VyczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgZW5kID0gb3V0bGluZS0+Y29udG91cnNbbl07Ci0KLSAgICAgICAgLyogbm90ZSB0aGF0IHdlIGRvbid0IGFjY2VwdCBlbXB0eSBjb250b3VycyAqLwotICAgICAgICBpZiAoIGVuZCA8PSBlbmQwIHx8IGVuZCA+PSBuX3BvaW50cyApCi0gICAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgICAgZW5kMCA9IGVuZDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBlbmQgIT0gbl9wb2ludHMgLSAxICkKLSAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgIC8qIFhYWDogY2hlY2sgdGhlIHRhZ3MgYXJyYXkgKi8KLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgfQotCi0gIEJhZDoKLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfQ29weSggY29uc3QgRlRfT3V0bGluZSogIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lICAgICAgICAqdGFyZ2V0ICkKLSAgewotICAgIEZUX0ludCAgaXNfb3duZXI7Ci0KLQotICAgIGlmICggIXNvdXJjZSB8fCAhdGFyZ2V0ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICBpZiAoIHNvdXJjZS0+bl9wb2ludHMgICAhPSB0YXJnZXQtPm5fcG9pbnRzICAgfHwKLSAgICAgICAgIHNvdXJjZS0+bl9jb250b3VycyAhPSB0YXJnZXQtPm5fY29udG91cnMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIHNvdXJjZSA9PSB0YXJnZXQgKQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgIGlmICggc291cmNlLT5uX3BvaW50cyApCi0gICAgewotICAgICAgRlRfQVJSQVlfQ09QWSggdGFyZ2V0LT5wb2ludHMsIHNvdXJjZS0+cG9pbnRzLCBzb3VyY2UtPm5fcG9pbnRzICk7Ci0gICAgICBGVF9BUlJBWV9DT1BZKCB0YXJnZXQtPnRhZ3MsICAgc291cmNlLT50YWdzLCAgIHNvdXJjZS0+bl9wb2ludHMgKTsKLSAgICB9Ci0KLSAgICBpZiAoIHNvdXJjZS0+bl9jb250b3VycyApCi0gICAgICBGVF9BUlJBWV9DT1BZKCB0YXJnZXQtPmNvbnRvdXJzLCBzb3VyY2UtPmNvbnRvdXJzLCBzb3VyY2UtPm5fY29udG91cnMgKTsKLQotICAgIC8qIGNvcHkgYWxsIGZsYWdzLCBleGNlcHQgdGhlIGBGVF9PVVRMSU5FX09XTkVSJyBvbmUgKi8KLSAgICBpc19vd25lciAgICAgID0gdGFyZ2V0LT5mbGFncyAmIEZUX09VVExJTkVfT1dORVI7Ci0gICAgdGFyZ2V0LT5mbGFncyA9IHNvdXJjZS0+ZmxhZ3M7Ci0KLSAgICB0YXJnZXQtPmZsYWdzICY9IH5GVF9PVVRMSU5FX09XTkVSOwotICAgIHRhcmdldC0+ZmxhZ3MgfD0gaXNfb3duZXI7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICBpZiAoICFtZW1vcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIG91dGxpbmUtPmZsYWdzICYgRlRfT1VUTElORV9PV05FUiApCi0gICAgewotICAgICAgRlRfRlJFRSggb3V0bGluZS0+cG9pbnRzICAgKTsKLSAgICAgIEZUX0ZSRUUoIG91dGxpbmUtPnRhZ3MgICAgICk7Ci0gICAgICBGVF9GUkVFKCBvdXRsaW5lLT5jb250b3VycyApOwotICAgIH0KLSAgICAqb3V0bGluZSA9IG51bGxfb3V0bGluZTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0RvbmUoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIC8qIGNoZWNrIGZvciB2YWxpZCBgb3V0bGluZScgaW4gRlRfT3V0bGluZV9Eb25lX0ludGVybmFsKCkgKi8KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICByZXR1cm4gRlRfT3V0bGluZV9Eb25lX0ludGVybmFsKCBsaWJyYXJ5LT5tZW1vcnksIG91dGxpbmUgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfT3V0bGluZV9HZXRfQ0JveCggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICAgICAgICAgICphY2JveCApCi0gIHsKLSAgICBGVF9Qb3MgIHhNaW4sIHlNaW4sIHhNYXgsIHlNYXg7Ci0KLQotICAgIGlmICggb3V0bGluZSAmJiBhY2JveCApCi0gICAgewotICAgICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgeE1pbiA9IDA7Ci0gICAgICAgIHlNaW4gPSAwOwotICAgICAgICB4TWF4ID0gMDsKLSAgICAgICAgeU1heCA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciogIHZlYyAgID0gb3V0bGluZS0+cG9pbnRzOwotICAgICAgICBGVF9WZWN0b3IqICBsaW1pdCA9IHZlYyArIG91dGxpbmUtPm5fcG9pbnRzOwotCi0KLSAgICAgICAgeE1pbiA9IHhNYXggPSB2ZWMtPng7Ci0gICAgICAgIHlNaW4gPSB5TWF4ID0gdmVjLT55OwotICAgICAgICB2ZWMrKzsKLQotICAgICAgICBmb3IgKCA7IHZlYyA8IGxpbWl0OyB2ZWMrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgIHgsIHk7Ci0KLQotICAgICAgICAgIHggPSB2ZWMtPng7Ci0gICAgICAgICAgaWYgKCB4IDwgeE1pbiApIHhNaW4gPSB4OwotICAgICAgICAgIGlmICggeCA+IHhNYXggKSB4TWF4ID0geDsKLQotICAgICAgICAgIHkgPSB2ZWMtPnk7Ci0gICAgICAgICAgaWYgKCB5IDwgeU1pbiApIHlNaW4gPSB5OwotICAgICAgICAgIGlmICggeSA+IHlNYXggKSB5TWF4ID0geTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYWNib3gtPnhNaW4gPSB4TWluOwotICAgICAgYWNib3gtPnhNYXggPSB4TWF4OwotICAgICAgYWNib3gtPnlNaW4gPSB5TWluOwotICAgICAgYWNib3gtPnlNYXggPSB5TWF4OwotICAgIH0KLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgICAgIHhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgeU9mZnNldCApCi0gIHsKLSAgICBGVF9VU2hvcnQgICBuOwotICAgIEZUX1ZlY3RvciogIHZlYzsKLQotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm47Ci0KLSAgICB2ZWMgPSBvdXRsaW5lLT5wb2ludHM7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IG91dGxpbmUtPm5fcG9pbnRzOyBuKysgKQotICAgIHsKLSAgICAgIHZlYy0+eCArPSB4T2Zmc2V0OwotICAgICAgdmVjLT55ICs9IHlPZmZzZXQ7Ci0gICAgICB2ZWMrKzsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX091dGxpbmVfUmV2ZXJzZSggRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgRlRfVVNob3J0ICBuOwotICAgIEZUX0ludCAgICAgZmlyc3QsIGxhc3Q7Ci0KLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuOwotCi0gICAgZmlyc3QgPSAwOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBuKysgKQotICAgIHsKLSAgICAgIGxhc3QgID0gb3V0bGluZS0+Y29udG91cnNbbl07Ci0KLSAgICAgIC8qIHJldmVyc2UgcG9pbnQgdGFibGUgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yKiAgcCA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwotICAgICAgICBGVF9WZWN0b3IqICBxID0gb3V0bGluZS0+cG9pbnRzICsgbGFzdDsKLSAgICAgICAgRlRfVmVjdG9yICAgc3dhcDsKLQotCi0gICAgICAgIHdoaWxlICggcCA8IHEgKQotICAgICAgICB7Ci0gICAgICAgICAgc3dhcCA9ICpwOwotICAgICAgICAgICpwICAgPSAqcTsKLSAgICAgICAgICAqcSAgID0gc3dhcDsKLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgcS0tOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIHJldmVyc2UgdGFncyB0YWJsZSAqLwotICAgICAgewotICAgICAgICBjaGFyKiAgcCA9IG91dGxpbmUtPnRhZ3MgKyBmaXJzdDsKLSAgICAgICAgY2hhciogIHEgPSBvdXRsaW5lLT50YWdzICsgbGFzdDsKLQotCi0gICAgICAgIHdoaWxlICggcCA8IHEgKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAgc3dhcDsKLQotCi0gICAgICAgICAgc3dhcCA9ICpwOwotICAgICAgICAgICpwICAgPSAqcTsKLSAgICAgICAgICAqcSAgID0gc3dhcDsKLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgcS0tOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZpcnN0ID0gbGFzdCArIDE7Ci0gICAgfQotCi0gICAgb3V0bGluZS0+ZmxhZ3MgXj0gRlRfT1VUTElORV9SRVZFUlNFX0ZJTEw7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX1JlbmRlciggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX1JlbmRlcmVyICByZW5kZXJlcjsKLSAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIGlmICggIXBhcmFtcyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHJlbmRlcmVyID0gbGlicmFyeS0+Y3VyX3JlbmRlcmVyOwotICAgIG5vZGUgICAgID0gbGlicmFyeS0+cmVuZGVyZXJzLmhlYWQ7Ci0KLSAgICBwYXJhbXMtPnNvdXJjZSA9ICh2b2lkKilvdXRsaW5lOwotCi0gICAgZXJyb3IgPSBGVF9FUlIoIENhbm5vdF9SZW5kZXJfR2x5cGggKTsKLSAgICB3aGlsZSAoIHJlbmRlcmVyICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHJlbmRlcmVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXJlci0+cmFzdGVyLCBwYXJhbXMgKTsKLSAgICAgIGlmICggIWVycm9yIHx8IEZUX0VSUl9ORVEoIGVycm9yLCBDYW5ub3RfUmVuZGVyX0dseXBoICkgKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogRlRfRXJyX0Nhbm5vdF9SZW5kZXJfR2x5cGggaXMgcmV0dXJuZWQgaWYgdGhlIHJlbmRlciBtb2RlICAgKi8KLSAgICAgIC8qIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciB0aGlzIGdseXBoIGltYWdlICovCi0gICAgICAvKiBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBub3csIGxvb2sgZm9yIGFub3RoZXIgcmVuZGVyZXIgdGhhdCBzdXBwb3J0cyB0aGUgc2FtZSAqLwotICAgICAgLyogZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHJlbmRlcmVyID0gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9kZSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfR2V0X0JpdG1hcCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKmFiaXRtYXAgKQotICB7Ci0gICAgRlRfUmFzdGVyX1BhcmFtcyAgcGFyYW1zOwotCi0KLSAgICBpZiAoICFhYml0bWFwICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgLyogb3RoZXIgY2hlY2tzIGFyZSBkZWxheWVkIHRvIGBGVF9PdXRsaW5lX1JlbmRlcicgKi8KLQotICAgIHBhcmFtcy50YXJnZXQgPSBhYml0bWFwOwotICAgIHBhcmFtcy5mbGFncyAgPSAwOwotCi0gICAgaWYgKCBhYml0bWFwLT5waXhlbF9tb2RlID09IEZUX1BJWEVMX01PREVfR1JBWSAgfHwKLSAgICAgICAgIGFiaXRtYXAtPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9MQ0QgICB8fAotICAgICAgICAgYWJpdG1hcC0+cGl4ZWxfbW9kZSA9PSBGVF9QSVhFTF9NT0RFX0xDRF9WICkKLSAgICAgIHBhcmFtcy5mbGFncyB8PSBGVF9SQVNURVJfRkxBR19BQTsKLQotICAgIHJldHVybiBGVF9PdXRsaW5lX1JlbmRlciggbGlicmFyeSwgb3V0bGluZSwgJnBhcmFtcyApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfVmVjdG9yX1RyYW5zZm9ybSggRlRfVmVjdG9yKiAgICAgICAgdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXggKQotICB7Ci0gICAgRlRfUG9zICB4eiwgeXo7Ci0KLQotICAgIGlmICggIXZlY3RvciB8fCAhbWF0cml4ICkKLSAgICAgIHJldHVybjsKLQotICAgIHh6ID0gRlRfTXVsRml4KCB2ZWN0b3ItPngsIG1hdHJpeC0+eHggKSArCi0gICAgICAgICBGVF9NdWxGaXgoIHZlY3Rvci0+eSwgbWF0cml4LT54eSApOwotCi0gICAgeXogPSBGVF9NdWxGaXgoIHZlY3Rvci0+eCwgbWF0cml4LT55eCApICsKLSAgICAgICAgIEZUX011bEZpeCggdmVjdG9yLT55LCBtYXRyaXgtPnl5ICk7Ci0KLSAgICB2ZWN0b3ItPnggPSB4ejsKLSAgICB2ZWN0b3ItPnkgPSB5ejsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgIG1hdHJpeCApCi0gIHsKLSAgICBGVF9WZWN0b3IqICB2ZWM7Ci0gICAgRlRfVmVjdG9yKiAgbGltaXQ7Ci0KLQotICAgIGlmICggIW91dGxpbmUgfHwgIW1hdHJpeCApCi0gICAgICByZXR1cm47Ci0KLSAgICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICBsaW1pdCA9IHZlYyArIG91dGxpbmUtPm5fcG9pbnRzOwotCi0gICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgICAgRlRfVmVjdG9yX1RyYW5zZm9ybSggdmVjLCBtYXRyaXggKTsKLSAgfQotCi0KLSNpZiAwCi0KLSNkZWZpbmUgRlRfT1VUTElORV9HRVRfQ09OVE9VUiggb3V0bGluZSwgYywgZmlyc3QsIGxhc3QgKSAgXAotICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoZmlyc3QpID0gKCBjID4gMCApID8gKG91dGxpbmUpLT5wb2ludHMgKyAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRsaW5lKS0+Y29udG91cnNbYyAtIDFdICsgMSBcCi0gICAgICAgICAgICAgICAgICAgICAgICA6IChvdXRsaW5lKS0+cG9pbnRzOyAgICAgICAgICAgICAgIFwKLSAgICAobGFzdCkgPSAob3V0bGluZSktPnBvaW50cyArIChvdXRsaW5lKS0+Y29udG91cnNbY107ICAgXAotICB9IHdoaWxlICggMCApCi0KLQotICAvKiBJcyBhIHBvaW50IGluIHNvbWUgY29udG91cj8gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSB0cmVhdCBldmVyeSBwb2ludCBvZiB0aGUgY29udG91ciBhcyBpZiBpdCAgICAqLwotICAvKiBpdCB3ZXJlIE9OLiAgVGhhdCBpcywgd2UgYWxsb3cgZmFsc2UgcG9zaXRpdmVzLCAqLwotICAvKiBidXQgZGlzYWxsb3cgZmFsc2UgbmVnYXRpdmVzLiAgKFhYWCByZWFsbHk/KSAgICAqLwotICBzdGF0aWMgRlRfQm9vbAotICBmdF9jb250b3VyX2hhcyggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICBGVF9TaG9ydCAgICAgYywKLSAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICBwb2ludCApCi0gIHsKLSAgICBGVF9WZWN0b3IqICBmaXJzdDsKLSAgICBGVF9WZWN0b3IqICBsYXN0OwotICAgIEZUX1ZlY3RvciogIGE7Ci0gICAgRlRfVmVjdG9yKiAgYjsKLSAgICBGVF9VSW50ICAgICBuID0gMDsKLQotCi0gICAgRlRfT1VUTElORV9HRVRfQ09OVE9VUiggb3V0bGluZSwgYywgZmlyc3QsIGxhc3QgKTsKLQotICAgIGZvciAoIGEgPSBmaXJzdDsgYSA8PSBsYXN0OyBhKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgeDsKLSAgICAgIEZUX0ludCAgaW50ZXJzZWN0OwotCi0KLSAgICAgIGIgPSAoIGEgPT0gbGFzdCApID8gZmlyc3QgOiBhICsgMTsKLQotICAgICAgaW50ZXJzZWN0ID0gKCBhLT55IC0gcG9pbnQtPnkgKSBeICggYi0+eSAtIHBvaW50LT55ICk7Ci0KLSAgICAgIC8qIGEgYW5kIGIgYXJlIG9uIHRoZSBzYW1lIHNpZGUgKi8KLSAgICAgIGlmICggaW50ZXJzZWN0ID49IDAgKQotICAgICAgewotICAgICAgICBpZiAoIGludGVyc2VjdCA9PSAwICYmIGEtPnkgPT0gcG9pbnQtPnkgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAoIGEtPnggPD0gcG9pbnQtPnggJiYgYi0+eCA+PSBwb2ludC0+eCApIHx8Ci0gICAgICAgICAgICAgICAoIGEtPnggPj0gcG9pbnQtPnggJiYgYi0+eCA8PSBwb2ludC0+eCApICkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHggPSBhLT54ICsgKCBiLT54IC0gYS0+eCApICogKHBvaW50LT55IC0gYS0+eSApIC8gKCBiLT55IC0gYS0+eSApOwotCi0gICAgICBpZiAoIHggPCBwb2ludC0+eCApCi0gICAgICAgIG4rKzsKLSAgICAgIGVsc2UgaWYgKCB4ID09IHBvaW50LT54ICkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIG4gJiAxOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBmdF9jb250b3VyX2VuY2xvc2VkKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgIGMgKQotICB7Ci0gICAgRlRfVmVjdG9yKiAgZmlyc3Q7Ci0gICAgRlRfVmVjdG9yKiAgbGFzdDsKLSAgICBGVF9TaG9ydCAgICBpOwotCi0KLSAgICBGVF9PVVRMSU5FX0dFVF9DT05UT1VSKCBvdXRsaW5lLCBjLCBmaXJzdCwgbGFzdCApOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggaSAhPSBjICYmIGZ0X2NvbnRvdXJfaGFzKCBvdXRsaW5lLCBpLCBmaXJzdCApICkKLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yKiAgcHQ7Ci0KLQotICAgICAgICBmb3IgKCBwdCA9IGZpcnN0ICsgMTsgcHQgPD0gbGFzdDsgcHQrKyApCi0gICAgICAgICAgaWYgKCAhZnRfY29udG91cl9oYXMoIG91dGxpbmUsIGksIHB0ICkgKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qIFRoaXMgdmVyc2lvbiBkaWZmZXJzIGZyb20gdGhlIHB1YmxpYyBvbmUgaW4gdGhhdCBlYWNoICovCi0gIC8qIHBhcnQgKGNvbnRvdXIgbm90IGVuY2xvc2VkIGluIGFub3RoZXIgY29udG91cikgb2YgdGhlICovCi0gIC8qIG91dGxpbmUgaXMgY2hlY2tlZCBmb3Igb3JpZW50YXRpb24uICBUaGlzIGlzICAgICAgICAgICovCi0gIC8qIG5lY2Vzc2FyeSBmb3Igc29tZSBidWdneSBDSksgZm9udHMuICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9PcmllbnRhdGlvbgotICBmdF9vdXRsaW5lX2dldF9vcmllbnRhdGlvbiggRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgRlRfU2hvcnQgICAgICAgIGk7Ci0gICAgRlRfVmVjdG9yKiAgICAgIGZpcnN0OwotICAgIEZUX1ZlY3RvciogICAgICBsYXN0OwotICAgIEZUX09yaWVudGF0aW9uICBvcmllbnQgPSBGVF9PUklFTlRBVElPTl9OT05FOwotCi0KLSAgICBmaXJzdCA9IG91dGxpbmUtPnBvaW50czsKLSAgICBmb3IgKCBpID0gMDsgaSA8IG91dGxpbmUtPm5fY29udG91cnM7IGkrKywgZmlyc3QgPSBsYXN0ICsgMSApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgcG9pbnQ7Ci0gICAgICBGVF9WZWN0b3IqICB4bWluX3BvaW50OwotICAgICAgRlRfUG9zICAgICAgeG1pbjsKLQotCi0gICAgICBsYXN0ID0gb3V0bGluZS0+cG9pbnRzICsgb3V0bGluZS0+Y29udG91cnNbaV07Ci0KLSAgICAgIC8qIHNraXAgZGVnZW5lcmF0ZSBjb250b3VycyAqLwotICAgICAgaWYgKCBsYXN0IDwgZmlyc3QgKyAyICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggZnRfY29udG91cl9lbmNsb3NlZCggb3V0bGluZSwgaSApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIHhtaW4gICAgICAgPSBmaXJzdC0+eDsKLSAgICAgIHhtaW5fcG9pbnQgPSBmaXJzdDsKLQotICAgICAgZm9yICggcG9pbnQgPSBmaXJzdCArIDE7IHBvaW50IDw9IGxhc3Q7IHBvaW50KysgKQotICAgICAgewotICAgICAgICBpZiAoIHBvaW50LT54IDwgeG1pbiApCi0gICAgICAgIHsKLSAgICAgICAgICB4bWluICAgICAgID0gcG9pbnQtPng7Ci0gICAgICAgICAgeG1pbl9wb2ludCA9IHBvaW50OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNoZWNrIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgY29udG91ciAqLwotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICAgICAgcHJldjsKLSAgICAgICAgRlRfVmVjdG9yKiAgICAgIG5leHQ7Ci0gICAgICAgIEZUX09yaWVudGF0aW9uICBvOwotCi0KLSAgICAgICAgcHJldiA9ICggeG1pbl9wb2ludCA9PSBmaXJzdCApID8gbGFzdCA6IHhtaW5fcG9pbnQgLSAxOwotICAgICAgICBuZXh0ID0gKCB4bWluX3BvaW50ID09IGxhc3QgKSA/IGZpcnN0IDogeG1pbl9wb2ludCArIDE7Ci0KLSAgICAgICAgaWYgKCBGVF9BdGFuMiggcHJldi0+eCAtIHhtaW5fcG9pbnQtPngsIHByZXYtPnkgLSB4bWluX3BvaW50LT55ICkgPgotICAgICAgICAgICAgIEZUX0F0YW4yKCBuZXh0LT54IC0geG1pbl9wb2ludC0+eCwgbmV4dC0+eSAtIHhtaW5fcG9pbnQtPnkgKSApCi0gICAgICAgICAgbyA9IEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvID0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEU7Ci0KLSAgICAgICAgaWYgKCBvcmllbnQgPT0gRlRfT1JJRU5UQVRJT05fTk9ORSApCi0gICAgICAgICAgb3JpZW50ID0gbzsKLSAgICAgICAgZWxzZSBpZiAoIG9yaWVudCAhPSBvICkKLSAgICAgICAgICByZXR1cm4gRlRfT1JJRU5UQVRJT05fTk9ORTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3JpZW50OwotICB9Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9FbWJvbGRlbiggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICBzdHJlbmd0aCApCi0gIHsKLSAgICByZXR1cm4gRlRfT3V0bGluZV9FbWJvbGRlblhZKCBvdXRsaW5lLCBzdHJlbmd0aCwgc3RyZW5ndGggKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRW1ib2xkZW5YWSggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHhzdHJlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgeXN0cmVuZ3RoICkKLSAgewotICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICBGVF9JbnQgICAgICBjLCBmaXJzdCwgbGFzdDsKLSAgICBGVF9JbnQgICAgICBvcmllbnRhdGlvbjsKLQotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT3V0bGluZSApOwotCi0gICAgeHN0cmVuZ3RoIC89IDI7Ci0gICAgeXN0cmVuZ3RoIC89IDI7Ci0gICAgaWYgKCB4c3RyZW5ndGggPT0gMCAmJiB5c3RyZW5ndGggPT0gMCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgb3JpZW50YXRpb24gPSBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiggb3V0bGluZSApOwotICAgIGlmICggb3JpZW50YXRpb24gPT0gRlRfT1JJRU5UQVRJT05fTk9ORSApCi0gICAgewotICAgICAgaWYgKCBvdXRsaW5lLT5uX2NvbnRvdXJzICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgcG9pbnRzID0gb3V0bGluZS0+cG9pbnRzOwotCi0gICAgZmlyc3QgPSAwOwotICAgIGZvciAoIGMgPSAwOyBjIDwgb3V0bGluZS0+bl9jb250b3VyczsgYysrICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IgIGluLCBvdXQsIGFuY2hvciwgc2hpZnQ7Ci0gICAgICBGVF9GaXhlZCAgIGxfaW4sIGxfb3V0LCBsX2FuY2hvciA9IDAsIGwsIHEsIGQ7Ci0gICAgICBGVF9JbnQgICAgIGksIGosIGs7Ci0KLQotICAgICAgbF9pbiA9IDA7Ci0gICAgICBsYXN0ID0gb3V0bGluZS0+Y29udG91cnNbY107Ci0KLSAgICAgIC8qIHBhY2lmeSBjb21waWxlciAqLwotICAgICAgaW4ueCA9IGluLnkgPSBhbmNob3IueCA9IGFuY2hvci55ID0gMDsKLQotICAgICAgLyogQ291bnRlciBqIGN5Y2xlcyB0aG91Z2ggdGhlIHBvaW50czsgY291bnRlciBpIGFkdmFuY2VzIG9ubHkgICovCi0gICAgICAvKiB3aGVuIHBvaW50cyBhcmUgbW92ZWQ7IGFuY2hvciBrIG1hcmtzIHRoZSBmaXJzdCBtb3ZlZCBwb2ludC4gKi8KLSAgICAgIGZvciAoIGkgPSBsYXN0LCBqID0gZmlyc3QsIGsgPSAtMTsKLSAgICAgICAgICAgIGogIT0gaSAmJiBpICE9IGs7Ci0gICAgICAgICAgICBqID0gaiA8IGxhc3QgPyBqICsgMSA6IGZpcnN0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBqICE9IGsgKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnggPSBwb2ludHNbal0ueCAtIHBvaW50c1tpXS54OwotICAgICAgICAgIG91dC55ID0gcG9pbnRzW2pdLnkgLSBwb2ludHNbaV0ueTsKLSAgICAgICAgICBsX291dCA9IChGVF9GaXhlZClGVF9WZWN0b3JfTm9ybUxlbiggJm91dCApOwotCi0gICAgICAgICAgaWYgKCBsX291dCA9PSAwICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG91dCAgID0gYW5jaG9yOwotICAgICAgICAgIGxfb3V0ID0gbF9hbmNob3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGxfaW4gIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGsgPCAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrICAgICAgICA9IGk7Ci0gICAgICAgICAgICBhbmNob3IgICA9IGluOwotICAgICAgICAgICAgbF9hbmNob3IgPSBsX2luOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGQgPSBGVF9NdWxGaXgoIGluLngsIG91dC54ICkgKyBGVF9NdWxGaXgoIGluLnksIG91dC55ICk7Ci0KLSAgICAgICAgICAvKiBzaGlmdCBvbmx5IGlmIHR1cm4gaXMgbGVzcyB0aGFuIH4xNjAgZGVncmVlcyAqLwotICAgICAgICAgIGlmICggZCA+IC0weEYwMDBMICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkID0gZCArIDB4MTAwMDBMOwotCi0gICAgICAgICAgICAvKiBzaGlmdCBjb21wb25lbnRzIGFsb25nIGxhdGVyYWwgYmlzZWN0b3IgaW4gcHJvcGVyIG9yaWVudGF0aW9uICovCi0gICAgICAgICAgICBzaGlmdC54ID0gaW4ueSArIG91dC55OwotICAgICAgICAgICAgc2hpZnQueSA9IGluLnggKyBvdXQueDsKLQotICAgICAgICAgICAgaWYgKCBvcmllbnRhdGlvbiA9PSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSApCi0gICAgICAgICAgICAgIHNoaWZ0LnggPSAtc2hpZnQueDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgc2hpZnQueSA9IC1zaGlmdC55OwotCi0gICAgICAgICAgICAvKiByZXN0cmljdCBzaGlmdCBtYWduaXR1ZGUgdG8gYmV0dGVyIGhhbmRsZSBjb2xsYXBzaW5nIHNlZ21lbnRzICovCi0gICAgICAgICAgICBxID0gRlRfTXVsRml4KCBvdXQueCwgaW4ueSApIC0gRlRfTXVsRml4KCBvdXQueSwgaW4ueCApOwotICAgICAgICAgICAgaWYgKCBvcmllbnRhdGlvbiA9PSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSApCi0gICAgICAgICAgICAgIHEgPSAtcTsKLQotICAgICAgICAgICAgbCA9IEZUX01JTiggbF9pbiwgbF9vdXQgKTsKLQotICAgICAgICAgICAgLyogbm9uLXN0cmljdCBpbmVxdWFsaXRpZXMgYXZvaWQgZGl2aWRlLWJ5LXplcm8gd2hlbiBxID09IGwgPT0gMCAqLwotICAgICAgICAgICAgaWYgKCBGVF9NdWxGaXgoIHhzdHJlbmd0aCwgcSApIDw9IEZUX011bEZpeCggbCwgZCApICkKLSAgICAgICAgICAgICAgc2hpZnQueCA9IEZUX011bERpdiggc2hpZnQueCwgeHN0cmVuZ3RoLCBkICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHNoaWZ0LnggPSBGVF9NdWxEaXYoIHNoaWZ0LngsIGwsIHEgKTsKLQotCi0gICAgICAgICAgICBpZiAoIEZUX011bEZpeCggeXN0cmVuZ3RoLCBxICkgPD0gRlRfTXVsRml4KCBsLCBkICkgKQotICAgICAgICAgICAgICBzaGlmdC55ID0gRlRfTXVsRGl2KCBzaGlmdC55LCB5c3RyZW5ndGgsIGQgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgc2hpZnQueSA9IEZUX011bERpdiggc2hpZnQueSwgbCwgcSApOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzaGlmdC54ID0gc2hpZnQueSA9IDA7Ci0KLSAgICAgICAgICBmb3IgKCA7Ci0gICAgICAgICAgICAgICAgaSAhPSBqOwotICAgICAgICAgICAgICAgIGkgPSBpIDwgbGFzdCA/IGkgKyAxIDogZmlyc3QgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvaW50c1tpXS54ICs9IHhzdHJlbmd0aCArIHNoaWZ0Lng7Ci0gICAgICAgICAgICBwb2ludHNbaV0ueSArPSB5c3RyZW5ndGggKyBzaGlmdC55OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgaSA9IGo7Ci0KLSAgICAgICAgaW4gICA9IG91dDsKLSAgICAgICAgbF9pbiA9IGxfb3V0OwotICAgICAgfQotCi0gICAgICBmaXJzdCA9IGxhc3QgKyAxOwotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfT3JpZW50YXRpb24gKQotICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiggRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgRlRfQkJveCAgICAgY2JveDsKLSAgICBGVF9JbnQgICAgICB4c2hpZnQsIHlzaGlmdDsKLSAgICBGVF9WZWN0b3IqICBwb2ludHM7Ci0gICAgRlRfVmVjdG9yICAgdl9wcmV2LCB2X2N1cjsKLSAgICBGVF9JbnQgICAgICBjLCBuLCBmaXJzdDsKLSAgICBGVF9Qb3MgICAgICBhcmVhID0gMDsKLQotCi0gICAgaWYgKCAhb3V0bGluZSB8fCBvdXRsaW5lLT5uX3BvaW50cyA8PSAwICkKLSAgICAgIHJldHVybiBGVF9PUklFTlRBVElPTl9UUlVFVFlQRTsKLQotICAgIC8qIFdlIHVzZSB0aGUgbm9uemVybyB3aW5kaW5nIHJ1bGUgdG8gZmluZCB0aGUgb3JpZW50YXRpb24uICAgICAgICovCi0gICAgLyogU2luY2UgZ2x5cGggb3V0bGluZXMgYmVoYXZlIG11Y2ggbW9yZSBgcmVndWxhcicgdGhhbiBhcmJpdHJhcnkgKi8KLSAgICAvKiBjdWJpYyBvciBxdWFkcmF0aWMgY3VydmVzLCB0aGlzIHRlc3QgZGVhbHMgd2l0aCB0aGUgcG9seWdvbiAgICAqLwotICAgIC8qIG9ubHkgdGhhdCBpcyBzcGFubmVkIHVwIGJ5IHRoZSBjb250cm9sIHBvaW50cy4gICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9PdXRsaW5lX0dldF9DQm94KCBvdXRsaW5lLCAmY2JveCApOwotCi0gICAgLyogSGFuZGxlIGNvbGxhcHNlZCBvdXRsaW5lcyB0byBhdm9pZCB1bmRlZmluZWQgRlRfTVNCLiAqLwotICAgIGlmICggY2JveC54TWluID09IGNib3gueE1heCB8fCBjYm94LnlNaW4gPT0gY2JveC55TWF4ICkKLSAgICAgIHJldHVybiBGVF9PUklFTlRBVElPTl9OT05FOwotCi0gICAgeHNoaWZ0ID0gRlRfTVNCKCAoRlRfVUludDMyKSggRlRfQUJTKCBjYm94LnhNYXggKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQUJTKCBjYm94LnhNaW4gKSApICkgLSAxNDsKLSAgICB4c2hpZnQgPSBGVF9NQVgoIHhzaGlmdCwgMCApOwotCi0gICAgeXNoaWZ0ID0gRlRfTVNCKCAoRlRfVUludDMyKSggY2JveC55TWF4IC0gY2JveC55TWluICkgKSAtIDE0OwotICAgIHlzaGlmdCA9IEZUX01BWCggeXNoaWZ0LCAwICk7Ci0KLSAgICBwb2ludHMgPSBvdXRsaW5lLT5wb2ludHM7Ci0KLSAgICBmaXJzdCA9IDA7Ci0gICAgZm9yICggYyA9IDA7IGMgPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBjKysgKQotICAgIHsKLSAgICAgIEZUX0ludCAgbGFzdCA9IG91dGxpbmUtPmNvbnRvdXJzW2NdOwotCi0KLSAgICAgIHZfcHJldi54ID0gcG9pbnRzW2xhc3RdLnggPj4geHNoaWZ0OwotICAgICAgdl9wcmV2LnkgPSBwb2ludHNbbGFzdF0ueSA+PiB5c2hpZnQ7Ci0KLSAgICAgIGZvciAoIG4gPSBmaXJzdDsgbiA8PSBsYXN0OyBuKysgKQotICAgICAgewotICAgICAgICB2X2N1ci54ID0gcG9pbnRzW25dLnggPj4geHNoaWZ0OwotICAgICAgICB2X2N1ci55ID0gcG9pbnRzW25dLnkgPj4geXNoaWZ0OwotCi0gICAgICAgIGFyZWEgPSBBRERfTE9ORyggYXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoIHZfY3VyLnkgLSB2X3ByZXYueSApICogKCB2X2N1ci54ICsgdl9wcmV2LnggKSApOwotCi0gICAgICAgIHZfcHJldiA9IHZfY3VyOwotICAgICAgfQotCi0gICAgICBmaXJzdCA9IGxhc3QgKyAxOwotICAgIH0KLQotICAgIGlmICggYXJlYSA+IDAgKQotICAgICAgcmV0dXJuIEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQ7Ci0gICAgZWxzZSBpZiAoIGFyZWEgPCAwICkKLSAgICAgIHJldHVybiBGVF9PUklFTlRBVElPTl9UUlVFVFlQRTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gRlRfT1JJRU5UQVRJT05fTk9ORTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRwYXRlbnQuYyBiL3NyYy9iYXNlL2Z0cGF0ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDBmOTkuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRwYXRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cGF0ZW50LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNoZWNraW5nIHBhdGVudGVkIFRydWVUeXBlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyAgICAqLwotLyogICAgKGJvZHkpLiAgT2Jzb2xldGUsIHJldGFpbmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfU0VSVklDRV9TRk5UX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFJVRVRZUEVfR0xZRl9ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Cb29sICkKLSAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfQm9vbCApCi0gIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHZhbHVlICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotICAgIEZUX1VOVVNFRCggdmFsdWUgKTsKLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0cGZyLmMgYi9zcmMvYmFzZS9mdHBmci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2MwYjcwLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0cGZyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRwZnIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIFBGUi1zcGVjaWZpYyBkYXRhIChib2R5KS4gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QRlJfSAotCi0KLSAgLyogY2hlY2sgdGhlIGZvcm1hdCAqLwotICBzdGF0aWMgRlRfU2VydmljZV9QZnJNZXRyaWNzCi0gIGZ0X3Bmcl9jaGVjayggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX1Bmck1ldHJpY3MgIHNlcnZpY2UgPSBOVUxMOwotCi0KLSAgICBpZiAoIGZhY2UgKQotICAgICAgRlRfRkFDRV9MT09LVVBfU0VSVklDRSggZmFjZSwgc2VydmljZSwgUEZSX01FVFJJQ1MgKTsKLQotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0cGZyLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9QRlJfTWV0cmljcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW91dGxpbmVfcmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFtZXRyaWNzX3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICphbWV0cmljc194X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYW1ldHJpY3NfeV9zY2FsZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1NlcnZpY2VfUGZyTWV0cmljcyAgc2VydmljZTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIHNlcnZpY2UgPSBmdF9wZnJfY2hlY2soIGZhY2UgKTsKLSAgICBpZiAoIHNlcnZpY2UgKQotICAgIHsKLSAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X21ldHJpY3MoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3V0bGluZV9yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1ldHJpY3NfcmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtZXRyaWNzX3hfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWV0cmljc195X3NjYWxlICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgeF9zY2FsZSwgeV9zY2FsZTsKLQotCi0gICAgICAvKiB0aGlzIGlzIG5vdCBhIFBGUiBmb250ICovCi0gICAgICBpZiAoIGFvdXRsaW5lX3Jlc29sdXRpb24gKQotICAgICAgICAqYW91dGxpbmVfcmVzb2x1dGlvbiA9IGZhY2UtPnVuaXRzX3Blcl9FTTsKLQotICAgICAgaWYgKCBhbWV0cmljc19yZXNvbHV0aW9uICkKLSAgICAgICAgKmFtZXRyaWNzX3Jlc29sdXRpb24gPSBmYWNlLT51bml0c19wZXJfRU07Ci0KLSAgICAgIHhfc2NhbGUgPSB5X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBpZiAoIGZhY2UtPnNpemUgKQotICAgICAgewotICAgICAgICB4X3NjYWxlID0gZmFjZS0+c2l6ZS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgICB5X3NjYWxlID0gZmFjZS0+c2l6ZS0+bWV0cmljcy55X3NjYWxlOwotICAgICAgfQotCi0gICAgICBpZiAoIGFtZXRyaWNzX3hfc2NhbGUgKQotICAgICAgICAqYW1ldHJpY3NfeF9zY2FsZSA9IHhfc2NhbGU7Ci0KLSAgICAgIGlmICggYW1ldHJpY3NfeV9zY2FsZSApCi0gICAgICAgICphbWV0cmljc195X3NjYWxlID0geV9zY2FsZTsKLQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHBmci5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfUEZSX0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICphdmVjdG9yICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9QZnJNZXRyaWNzICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCAhYXZlY3RvciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHNlcnZpY2UgPSBmdF9wZnJfY2hlY2soIGZhY2UgKTsKLSAgICBpZiAoIHNlcnZpY2UgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfa2VybmluZyggZmFjZSwgbGVmdCwgcmlnaHQsIGF2ZWN0b3IgKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX0dldF9LZXJuaW5nKCBmYWNlLCBsZWZ0LCByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0tFUk5JTkdfVU5TQ0FMRUQsIGF2ZWN0b3IgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHBmci5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfUEZSX0FkdmFuY2UoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgKmFhZHZhbmNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9QZnJNZXRyaWNzICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCAhYWFkdmFuY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBzZXJ2aWNlID0gZnRfcGZyX2NoZWNrKCBmYWNlICk7Ci0gICAgaWYgKCBzZXJ2aWNlICkKLSAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X2FkdmFuY2UoIGZhY2UsIGdpbmRleCwgYWFkdmFuY2UgKTsKLSAgICBlbHNlCi0gICAgICAvKiBYWFg6IFRPRE86IFBST1ZJREUgQURWQU5DRS1MT0FESU5HIE1FVEhPRCBUTyBBTEwgRk9OVCBEUklWRVJTICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0cGljLmMgYi9zcmMvYmFzZS9mdHBpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjg0ZmRkLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0cGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgKGJvZHkpLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAiYmFzZXBpYy5oIgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0cGljLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBmdF9waWNfY29udGFpbmVyX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3I7Ci0KLQotICAgIEZUX01FTV9TRVQoIHBpY19jb250YWluZXIsIDAsIHNpemVvZiAoICpwaWNfY29udGFpbmVyICkgKTsKLQotICAgIGVycm9yID0gZnRfYmFzZV9waWNfaW5pdCggbGlicmFyeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogRGVzdHJveSB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9waWNfY29udGFpbmVyX2Rlc3Ryb3koIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgZnRfYmFzZV9waWNfZnJlZSggbGlicmFyeSApOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRyZm9yay5jIGIvc3JjL2Jhc2UvZnRyZm9yay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2I4MTM3Li4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0cmZvcmsuYworKysgL2Rldi9udWxsCkBAIC0xLDkzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHJmb3JrLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRW1iZWRkZWQgcmVzb3VyY2UgZm9ya3MgYWNjZXNzb3IgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTyBhbmQgUmVkaGF0IEsuSy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbygpIGFuZCByYWNjZXNzX2d1ZXNzX2Rhcndpbl9oZnNwbHVzKCkgYXJlICAgICAqLwotLyogIGRlcml2ZWQgZnJvbSBmdG9ianMuYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGV2ZWxvcG1lbnQgb2YgdGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIHN1cHBvcnQgb2YgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgUHJvbW90aW9uIEFnZW5jeSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1JGT1JLX0gKLSNpbmNsdWRlICJiYXNlcGljLmgiCi0jaW5jbHVkZSAiZnRiYXNlLmgiCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcmFjY2VzcwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgIFJlc291cmNlIGZvcmsgZGlyZWN0b3J5IGFjY2VzcyAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmZvcmtfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICptYXBfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZGF0YV9wb3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgdW5zaWduZWQgY2hhciAgaGVhZFsxNl0sIGhlYWQyWzE2XTsKLSAgICBGVF9Mb25nICAgICAgICBtYXBfcG9zLCBtYXBfbGVuLCByZGF0YV9sZW47Ci0gICAgaW50ICAgICAgICAgICAgYWxsemVyb3MsIGFsbG1hdGNoLCBpOwotICAgIEZUX0xvbmcgICAgICAgIHR5cGVfbGlzdDsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZylyZm9ya19vZmZzZXQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1JlYWQoIHN0cmVhbSwgKEZUX0J5dGUqKWhlYWQsIDE2ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBlbnN1cmUgcG9zaXRpdmUgdmFsdWVzICovCi0gICAgaWYgKCBoZWFkWzBdICA+PSAweDgwIHx8Ci0gICAgICAgICBoZWFkWzRdICA+PSAweDgwIHx8Ci0gICAgICAgICBoZWFkWzhdICA+PSAweDgwIHx8Ci0gICAgICAgICBoZWFkWzEyXSA+PSAweDgwICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgKnJkYXRhX3BvcyA9ICggaGVhZFsgMF0gPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICggaGVhZFsgMV0gPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICggaGVhZFsgMl0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICAgaGVhZFsgM107Ci0gICAgbWFwX3BvcyAgICA9ICggaGVhZFsgNF0gPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICggaGVhZFsgNV0gPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICggaGVhZFsgNl0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICAgaGVhZFsgN107Ci0gICAgcmRhdGFfbGVuICA9ICggaGVhZFsgOF0gPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICggaGVhZFsgOV0gPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICggaGVhZFsxMF0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICAgaGVhZFsxMV07Ci0gICAgbWFwX2xlbiAgICA9ICggaGVhZFsxMl0gPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICggaGVhZFsxM10gPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICggaGVhZFsxNF0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICAgaGVhZFsxNV07Ci0KLSAgICAvKiB0aGUgbWFwIG11c3Qgbm90IGJlIGVtcHR5ICovCi0gICAgaWYgKCAhbWFwX3BvcyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgcmRhdGEgYW5kIG1hcCBvdmVybGFwICovCi0gICAgaWYgKCAqcmRhdGFfcG9zIDwgbWFwX3BvcyApCi0gICAgewotICAgICAgaWYgKCAqcmRhdGFfcG9zID4gbWFwX3BvcyAtIHJkYXRhX2xlbiApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBtYXBfcG9zID4gKnJkYXRhX3BvcyAtIG1hcF9sZW4gKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB3aGV0aGVyIGVuZCBvZiByZGF0YSBvciBtYXAgZXhjZWVkcyBzdHJlYW0gc2l6ZSAqLwotICAgIGlmICggRlRfTE9OR19NQVggLSByZGF0YV9sZW4gPCAqcmRhdGFfcG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBGVF9MT05HX01BWCAtIG1hcF9sZW4gPCBtYXBfcG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLQotICAgICAgICAgRlRfTE9OR19NQVggLSAoICpyZGF0YV9wb3MgKyByZGF0YV9sZW4gKSA8IHJmb3JrX29mZnNldCAgICAgICAgICAgIHx8Ci0gICAgICAgICBGVF9MT05HX01BWCAtICggbWFwX3BvcyArIG1hcF9sZW4gKSA8IHJmb3JrX29mZnNldCAgICAgICAgICAgICAgICAgfHwKLQotICAgICAgICAgKEZUX1VMb25nKSggcmZvcmtfb2Zmc2V0ICsgKnJkYXRhX3BvcyArIHJkYXRhX2xlbiApID4gc3RyZWFtLT5zaXplIHx8Ci0gICAgICAgICAoRlRfVUxvbmcpKCByZm9ya19vZmZzZXQgKyBtYXBfcG9zICsgbWFwX2xlbiApID4gc3RyZWFtLT5zaXplICAgICAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAqcmRhdGFfcG9zICs9IHJmb3JrX29mZnNldDsKLSAgICBtYXBfcG9zICAgICs9IHJmb3JrX29mZnNldDsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgKEZUX1VMb25nKW1hcF9wb3MgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGhlYWQyWzE1XSA9IChGVF9CeXRlKSggaGVhZFsxNV0gKyAxICk7ICAgICAgIC8qIG1ha2UgaXQgYmUgZGlmZmVyZW50ICovCi0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIChGVF9CeXRlKiloZWFkMiwgMTYgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGFsbHplcm9zID0gMTsKLSAgICBhbGxtYXRjaCA9IDE7Ci0gICAgZm9yICggaSA9IDA7IGkgPCAxNjsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIGhlYWQyW2ldICE9IDAgKQotICAgICAgICBhbGx6ZXJvcyA9IDA7Ci0gICAgICBpZiAoIGhlYWQyW2ldICE9IGhlYWRbaV0gKQotICAgICAgICBhbGxtYXRjaCA9IDA7Ci0gICAgfQotICAgIGlmICggIWFsbHplcm9zICYmICFhbGxtYXRjaCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIC8qIElmIHdlIGhhdmUgcmVhY2hlZCB0aGlzIHBvaW50IHRoZW4gaXQgaXMgcHJvYmFibHkgYSBtYWMgcmVzb3VyY2UgKi8KLSAgICAvKiBmaWxlLiAgTm93LCBkb2VzIGl0IGNvbnRhaW4gYW55IGludGVyZXN0aW5nIHJlc291cmNlcz8gICAgICAgICAgICovCi0KLSAgICAodm9pZClGVF9TVFJFQU1fU0tJUCggNCAgICAgICAgLyogc2tpcCBoYW5kbGUgdG8gbmV4dCByZXNvdXJjZSBtYXAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyAyICAgICAgLyogc2tpcCBmaWxlIHJlc291cmNlIG51bWJlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICArIDIgKTsgICAvKiBza2lwIGF0dHJpYnV0ZXMgKi8KLQotICAgIGlmICggRlRfUkVBRF9TSE9SVCggdHlwZV9saXN0ICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIGlmICggdHlwZV9saXN0IDwgMCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgKEZUX1VMb25nKSggbWFwX3BvcyArIHR5cGVfbGlzdCApICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAqbWFwX29mZnNldCA9IG1hcF9wb3MgKyB0eXBlX2xpc3Q7Ci0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBmdF9yYWNjZXNzX3NvcnRfcmVmX2J5X2lkKCBGVF9SRm9ya19SZWYqICBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SRm9ya19SZWYqICBiICkKLSAgewotICAgIGlmICggYS0+cmVzX2lkIDwgYi0+cmVzX2lkICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlIGlmICggYS0+cmVzX2lkID4gYi0+cmVzX2lkICkKLSAgICAgIHJldHVybiAxOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIG1hcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZGF0YV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBzb3J0X2J5X3Jlc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAqKm9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpjb3VudCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIGludCAgICAgICAgICAgaSwgaiwgY250LCBzdWJjbnQ7Ci0gICAgRlRfTG9uZyAgICAgICB0YWdfaW50ZXJuYWwsIHJwb3M7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgRlRfTG9uZyAgICAgICB0ZW1wOwotICAgIEZUX0xvbmcgICAgICAgKm9mZnNldHNfaW50ZXJuYWwgPSBOVUxMOwotICAgIEZUX1JGb3JrX1JlZiAgKnJlZiA9IE5VTEw7Ci0KLQotICAgIEZUX1RSQUNFMygoICJcbiIgKSk7Ci0gICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAoRlRfVUxvbmcpbWFwX29mZnNldCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgaWYgKCBGVF9SRUFEX1NIT1JUKCBjbnQgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgY250Kys7Ci0KLSAgICAvKiBgcnBvcycgaXMgYSBzaWduZWQgMTZiaXQgaW50ZWdlciBvZmZzZXQgdG8gcmVzb3VyY2UgcmVjb3JkczsgdGhlICAgICovCi0gICAgLyogc2l6ZSBvZiBhIHJlc291cmNlIHJlY29yZCBpcyAxMiBieXRlcy4gIFRoZSBtYXAgaGVhZGVyIGlzIDI4IGJ5dGVzLCAqLwotICAgIC8qIGFuZCBhIHR5cGUgbGlzdCBuZWVkcyAxMCBieXRlcyBvciBtb3JlLiAgSWYgd2UgYXNzdW1lIHRoYXQgdGhlIG5hbWUgKi8KLSAgICAvKiBsaXN0IGlzIGVtcHR5IGFuZCB3ZSBoYXZlIG9ubHkgYSBzaW5nbGUgZW50cnkgaW4gdGhlIHR5cGUgbGlzdCwgICAgICovCi0gICAgLyogdGhlcmUgY2FuIGJlIGF0IG1vc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICgzMjc2OCAtIDI4IC0gMTApIC8gMTIgPSAyNzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHJlc291cmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogQSB0eXBlIGxpc3Qgc3RhcnRzIHdpdGggYSB0d28tYnl0ZSBjb3VudGVyLCBmb2xsb3dlZCBieSAxMC1ieXRlICAgICAqLwotICAgIC8qIHR5cGUgcmVjb3Jkcy4gIEFzc3VtaW5nIHRoYXQgdGhlcmUgYXJlIG5vIHJlc291cmNlcywgdGhlIG51bWJlciBvZiAgKi8KLSAgICAvKiB0eXBlIHJlY29yZHMgY2FuIGJlIGF0IG1vc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgKDMyNzY4IC0gMjggLSAyKSAvIDggPSA0MDc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBjbnQgPiA0MDc5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBjbnQ7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBGVF9SRUFEX0xPTkcoIHRhZ19pbnRlcm5hbCApIHx8Ci0gICAgICAgICAgIEZUX1JFQURfU0hPUlQoIHN1YmNudCApICAgICAgfHwKLSAgICAgICAgICAgRlRfUkVBRF9TSE9SVCggcnBvcyApICAgICAgICApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgRlRfVFJBQ0UyKCggIlJlc291cmNlIHRhZ3M6ICVjJWMlYyVjXG4iLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gMjQgKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gMTYgKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gIDggKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gIDAgKSApICkpOwotICAgICAgRlRfVFJBQ0UzKCggIiAgICAgICAgICAgICA6IHN1YmNvdW50PSVkLCBzdWJvZmZzZXQ9MHglMDR4XG4iLAotICAgICAgICAgICAgICAgICAgc3ViY250LCBycG9zICkpOwotCi0gICAgICBpZiAoIHRhZ19pbnRlcm5hbCA9PSB0YWcgKQotICAgICAgewotICAgICAgICAqY291bnQgPSBzdWJjbnQgKyAxOwotICAgICAgICBycG9zICArPSBtYXBfb2Zmc2V0OwotCi0gICAgICAgIC8qIGEgemVybyBjb3VudCBtaWdodCBiZSB2YWxpZCBpbiB0aGUgcmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiwgKi8KLSAgICAgICAgLyogaG93ZXZlciwgaXQgaXMgY29tcGxldGVseSB1c2VsZXNzIHRvIHVzICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoICpjb3VudCA8IDEgfHwgKmNvdW50ID4gMjcyNyApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAoRlRfVUxvbmcpcnBvcyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHJlZiwgKmNvdW50ICkgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8ICpjb3VudDsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggRlRfUkVBRF9TSE9SVCggcmVmW2pdLnJlc19pZCApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCAyICkgKSAgLyogcmVzb3VyY2UgbmFtZSBvZmZzZXQgKi8KLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICBpZiAoIEZUX1JFQURfTE9ORyggdGVtcCApICkgLyogYXR0cmlidXRlcyAoOGJpdCksIG9mZnNldCAoMjRiaXQpICovCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggNCApICkgIC8qIG1ieiAqLwotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgaWYgKCByZWZbal0ucmVzX2lkIDwgMCB8fCB0ZW1wIDwgMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIHJlZltqXS5vZmZzZXQgPSB0ZW1wICYgMHhGRkZGRkZMOwotCi0gICAgICAgICAgRlRfVFJBQ0UzKCggIiAgICAgICAgICAgICBbJWRdOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIHJlc291cmNlX2lkPTB4JTA0eCwgb2Zmc2V0PTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBqLCByZWZbal0ucmVzX2lkLCByZWZbal0ub2Zmc2V0ICkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBzb3J0X2J5X3Jlc19pZCApCi0gICAgICAgIHsKLSAgICAgICAgICBmdF9xc29ydCggcmVmLAotICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KSpjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRlRfUkZvcmtfUmVmICksCi0gICAgICAgICAgICAgICAgICAgICggaW50KCopKGNvbnN0IHZvaWQqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKikgKWZ0X3JhY2Nlc3Nfc29ydF9yZWZfYnlfaWQgKTsKLQotICAgICAgICAgIEZUX1RSQUNFMygoICIgICAgICAgICAgICAgLS0gc29ydCByZXNvdXJjZXMgYnkgdGhlaXIgaWRzIC0tXG4iICkpOwotCi0gICAgICAgICAgZm9yICggaiA9IDA7IGogPCAqY291bnQ7IGorKyApCi0gICAgICAgICAgICBGVF9UUkFDRTMoKCAiICAgICAgICAgICAgIFslZF06IgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZXNvdXJjZV9pZD0weCUwNHgsIG9mZnNldD0weCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBqLCByZWZbal0ucmVzX2lkLCByZWZbal0ub2Zmc2V0ICkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIG9mZnNldHNfaW50ZXJuYWwsICpjb3VudCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogWFhYOiBkdXBsaWNhdGVkIHJlZmVyZW5jZSBJRCwKLSAgICAgICAgICogICAgICBnYXAgYmV0d2VlbiByZWZlcmVuY2UgSURzIGFyZSBhY2NlcHRhYmxlPwotICAgICAgICAgKiAgICAgIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBvbiBBcHBsZSBpbXBsZW1lbnRhdGlvbiBpcyBuZWVkZWQuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8ICpjb3VudDsgaisrICkKLSAgICAgICAgICBvZmZzZXRzX2ludGVybmFsW2pdID0gcmRhdGFfcG9zICsgcmVmW2pdLm9mZnNldDsKLQotICAgICAgICAqb2Zmc2V0cyA9IG9mZnNldHNfaW50ZXJuYWw7Ci0gICAgICAgIGVycm9yICAgID0gRlRfRXJyX09rOwotCi0gICAgICBFeGl0OgotICAgICAgICBGVF9GUkVFKCByZWYgKTsKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLSAgfQotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgIEd1ZXNzaW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgV2hlbiB5b3UgYWRkIGEgbmV3IGd1ZXNzaW5nIGZ1bmN0aW9uLCAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgdXBkYXRlIEZUX1JBQ0NFU1NfTl9SVUxFUyBpbiBmdHJmb3JrLmguICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZG91YmxlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2FwcGxlX3NpbmdsZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19kYXJ3aW5fdWZzX2V4cG9ydCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2Rhcndpbl9uZXd2ZnMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2Rhcndpbl9oZnNwbHVzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfdmZhdCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfbGludXhfY2FwKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19saW51eF9uZXRhdGFsayggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0KLSAgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9CRUdJTihmdF9yYWNjZXNzX2d1ZXNzX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0X3JhY2Nlc3NfZ3Vlc3NfcmVjKQotICBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKGFwcGxlX2RvdWJsZSwgICAgICBhcHBsZV9kb3VibGUpCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkoYXBwbGVfc2luZ2xlLCAgICAgIGFwcGxlX3NpbmdsZSkKLSAgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWShkYXJ3aW5fdWZzX2V4cG9ydCwgZGFyd2luX3Vmc19leHBvcnQpCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkoZGFyd2luX25ld3ZmcywgICAgIGRhcndpbl9uZXd2ZnMpCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkoZGFyd2luX2hmc3BsdXMsICAgIGRhcndpbl9oZnNwbHVzKQotICBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKHZmYXQsICAgICAgICAgICAgICB2ZmF0KQotICBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKGxpbnV4X2NhcCwgICAgICAgICBsaW51eF9jYXApCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkobGludXhfZG91YmxlLCAgICAgIGxpbnV4X2RvdWJsZSkKLSAgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWShsaW51eF9uZXRhdGFsaywgICAgbGludXhfbmV0YXRhbGspCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5ECi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICBIZWxwZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZ2VuZXJpYyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgbWFnaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZV9mcm9tX2ZpbGVfbmFtZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiAgICAgIGZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgY2hhciAqCi0gIHJhY2Nlc3NfbWFrZV9maWxlX25hbWUoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpvcmlnaW5hbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaW5zZXJ0aW9uICk7Ci0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9SYWNjZXNzX0d1ZXNzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqbmV3X25hbWVzLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciAgICplcnJvcnMgKQotICB7Ci0gICAgRlRfSW50ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IEZUX1JBQ0NFU1NfTl9SVUxFUzsgaSsrICkKLSAgICB7Ci0gICAgICBuZXdfbmFtZXNbaV0gPSBOVUxMOwotICAgICAgaWYgKCBOVUxMICE9IHN0cmVhbSApCi0gICAgICAgIGVycm9yc1tpXSA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIDAgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZXJyb3JzW2ldID0gRlRfRXJyX09rOwotCi0gICAgICBpZiAoIGVycm9yc1tpXSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBlcnJvcnNbaV0gPSAoRlRfUkFDQ0VTU19HVUVTU19UQUJMRV9HRVRbaV0uZnVuYykoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBiYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihuZXdfbmFtZXNbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYob2Zmc2V0c1tpXSkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotCi0jaWZuZGVmIEZUX01BQ0lOVE9TSAotICBzdGF0aWMgRlRfUkZvcmtfUnVsZQotICByYWNjZXNzX2dldF9ydWxlX3R5cGVfZnJvbV9ydWxlX2luZGV4KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBydWxlX2luZGV4ICkKLSAgewotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0gICAgaWYgKCBydWxlX2luZGV4ID49IEZUX1JBQ0NFU1NfTl9SVUxFUyApCi0gICAgICByZXR1cm4gRlRfUkZvcmtfUnVsZV9pbnZhbGlkOwotCi0gICAgcmV0dXJuIEZUX1JBQ0NFU1NfR1VFU1NfVEFCTEVfR0VUW3J1bGVfaW5kZXhdLnR5cGU7Ci0gIH0KLQotCi0gIC8qCi0gICAqIEZvciB0aGlzIGZ1bmN0aW9uLCByZWZlciBmdGJhc2UuaC4KLSAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIGZ0X3JhY2Nlc3NfcnVsZV9ieV9kYXJ3aW5fdmZzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcnVsZV9pbmRleCApCi0gIHsKLSAgICBzd2l0Y2goIHJhY2Nlc3NfZ2V0X3J1bGVfdHlwZV9mcm9tX3J1bGVfaW5kZXgoIGxpYnJhcnksIHJ1bGVfaW5kZXggKSApCi0gICAgewotICAgICAgY2FzZSBGVF9SRm9ya19SdWxlX2Rhcndpbl9uZXd2ZnM6Ci0gICAgICBjYXNlIEZUX1JGb3JrX1J1bGVfZGFyd2luX2hmc3BsdXM6Ci0gICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICB9Ci0jZW5kaWYKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2FwcGxlX2RvdWJsZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgRlRfSW50MzIgIG1hZ2ljID0gKCAweDAwIDw8IDI0ICkgfAotICAgICAgICAgICAgICAgICAgICAgICggMHgwNSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAgICAoIDB4MTYgPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAweDA3OwotCi0KLSAgICAqcmVzdWx0X2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgaWYgKCBOVUxMID09IHN0cmVhbSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1N0cmVhbSApOwotCi0gICAgcmV0dXJuIHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZ2VuZXJpYyggbGlicmFyeSwgc3RyZWFtLCBiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdpYywgcmVzdWx0X29mZnNldCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19hcHBsZV9zaW5nbGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIEZUX0ludDMyICBtYWdpYyA9ICggMHgwMCA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAoIDB4MDUgPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKCAweDE2IDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDsKLQotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBOVUxMOwotICAgIGlmICggTlVMTCA9PSBzdHJlYW0gKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9TdHJlYW0gKTsKLQotICAgIHJldHVybiByYWNjZXNzX2d1ZXNzX2FwcGxlX2dlbmVyaWMoIGxpYnJhcnksIHN0cmVhbSwgYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnaWMsIHJlc3VsdF9vZmZzZXQgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX3Vmc19leHBvcnQoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgY2hhciogICAgICBuZXdwYXRoOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0KLSAgICBtZW1vcnkgID0gbGlicmFyeS0+bWVtb3J5OwotICAgIG5ld3BhdGggPSByYWNjZXNzX21ha2VfZmlsZV9uYW1lKCBtZW1vcnksIGJhc2VfZmlsZV9uYW1lLCAiLl8iICk7Ci0gICAgaWYgKCAhbmV3cGF0aCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLQotICAgIGVycm9yID0gcmFjY2Vzc19ndWVzc19saW51eF9kb3VibGVfZnJvbV9maWxlX25hbWUoIGxpYnJhcnksIG5ld3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X29mZnNldCApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgICpyZXN1bHRfZmlsZV9uYW1lID0gbmV3cGF0aDsKLSAgICBlbHNlCi0gICAgICBGVF9GUkVFKCBuZXdwYXRoICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2Rhcndpbl9oZnNwbHVzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIC8qCi0gICAgICBPbmx5IG1lYW5pbmdmdWwgb24gc3lzdGVtcyB3aXRoIGhmcysgZHJpdmVycyAob3IgTWFjcykuCi0gICAgICovCi0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBjaGFyKiAgICAgIG5ld3BhdGggPSBOVUxMOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX0xvbmcgICAgYmFzZV9maWxlX2xlbiA9IChGVF9Mb25nKWZ0X3N0cmxlbiggYmFzZV9maWxlX25hbWUgKTsKLQotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIGlmICggYmFzZV9maWxlX2xlbiArIDYgPiBGVF9JTlRfTUFYICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7Ci0KLSAgICBpZiAoIEZUX0FMTE9DKCBuZXdwYXRoLCBiYXNlX2ZpbGVfbGVuICsgNiApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIEZUX01FTV9DT1BZKCBuZXdwYXRoLCBiYXNlX2ZpbGVfbmFtZSwgYmFzZV9maWxlX2xlbiApOwotICAgIEZUX01FTV9DT1BZKCBuZXdwYXRoICsgYmFzZV9maWxlX2xlbiwgIi9yc3JjIiwgNiApOwotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBuZXdwYXRoOwotICAgICpyZXN1bHRfb2Zmc2V0ICAgID0gMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2Rhcndpbl9uZXd2ZnMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICAvKgotICAgICAgT25seSBtZWFuaW5nZnVsIG9uIHN5c3RlbXMgd2l0aCBNYWMgT1MgWCAoPiAxMC4xKS4KLSAgICAgKi8KLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIGNoYXIqICAgICAgbmV3cGF0aCA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfTG9uZyAgICBiYXNlX2ZpbGVfbGVuID0gKEZUX0xvbmcpZnRfc3RybGVuKCBiYXNlX2ZpbGVfbmFtZSApOwotCi0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgaWYgKCBiYXNlX2ZpbGVfbGVuICsgMTggPiBGVF9JTlRfTUFYICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7Ci0KLSAgICBpZiAoIEZUX0FMTE9DKCBuZXdwYXRoLCBiYXNlX2ZpbGVfbGVuICsgMTggKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBGVF9NRU1fQ09QWSggbmV3cGF0aCwgYmFzZV9maWxlX25hbWUsIGJhc2VfZmlsZV9sZW4gKTsKLSAgICBGVF9NRU1fQ09QWSggbmV3cGF0aCArIGJhc2VfZmlsZV9sZW4sICIvLi5uYW1lZGZvcmsvcnNyYyIsIDE4ICk7Ci0KLSAgICAqcmVzdWx0X2ZpbGVfbmFtZSA9IG5ld3BhdGg7Ci0gICAgKnJlc3VsdF9vZmZzZXQgICAgPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfdmZhdCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIGNoYXIqICAgICAgbmV3cGF0aDsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIG5ld3BhdGggPSByYWNjZXNzX21ha2VfZmlsZV9uYW1lKCBtZW1vcnksIGJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2UuZnJrLyIgKTsKLSAgICBpZiAoICFuZXdwYXRoICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBuZXdwYXRoOwotICAgICpyZXN1bHRfb2Zmc2V0ICAgID0gMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2NhcCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgY2hhciogICAgICBuZXdwYXRoOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgbmV3cGF0aCA9IHJhY2Nlc3NfbWFrZV9maWxlX25hbWUoIG1lbW9yeSwgYmFzZV9maWxlX25hbWUsICIucmVzb3VyY2UvIiApOwotICAgIGlmICggIW5ld3BhdGggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0KLSAgICAqcmVzdWx0X2ZpbGVfbmFtZSA9IG5ld3BhdGg7Ci0gICAgKnJlc3VsdF9vZmZzZXQgICAgPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfbGludXhfZG91YmxlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICBjaGFyKiAgICAgIG5ld3BhdGg7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIG5ld3BhdGggPSByYWNjZXNzX21ha2VfZmlsZV9uYW1lKCBtZW1vcnksIGJhc2VfZmlsZV9uYW1lLCAiJSIgKTsKLSAgICBpZiAoICFuZXdwYXRoICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotCi0gICAgZXJyb3IgPSByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZV9mcm9tX2ZpbGVfbmFtZSggbGlicmFyeSwgbmV3cGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfb2Zmc2V0ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgKnJlc3VsdF9maWxlX25hbWUgPSBuZXdwYXRoOwotICAgIGVsc2UKLSAgICAgIEZUX0ZSRUUoIG5ld3BhdGggKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfbGludXhfbmV0YXRhbGsoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgY2hhciogICAgICBuZXdwYXRoOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBuZXdwYXRoID0gcmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSggbWVtb3J5LCBiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5BcHBsZURvdWJsZS8iICk7Ci0gICAgaWYgKCAhbmV3cGF0aCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLQotICAgIGVycm9yID0gcmFjY2Vzc19ndWVzc19saW51eF9kb3VibGVfZnJvbV9maWxlX25hbWUoIGxpYnJhcnksIG5ld3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X29mZnNldCApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgICpyZXN1bHRfZmlsZV9uYW1lID0gbmV3cGF0aDsKLSAgICBlbHNlCi0gICAgICBGVF9GUkVFKCBuZXdwYXRoICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2FwcGxlX2dlbmVyaWMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgIG1hZ2ljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgRlRfSW50MzIgICBtYWdpY19mcm9tX3N0cmVhbTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX0ludDMyICAgdmVyc2lvbl9udW1iZXIgPSAwOwotICAgIEZUX1VTaG9ydCAgbl9vZl9lbnRyaWVzOwotCi0gICAgaW50ICAgICAgICBpOwotICAgIEZUX0ludDMyICAgZW50cnlfaWQsIGVudHJ5X29mZnNldCwgZW50cnlfbGVuZ3RoID0gMDsKLQotICAgIGNvbnN0IEZUX0ludDMyICByZXNvdXJjZV9mb3JrX2VudHJ5X2lkID0gMHgyOwotCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0gICAgRlRfVU5VU0VEKCBiYXNlX2ZpbGVfbmFtZSApOwotICAgIEZUX1VOVVNFRCggdmVyc2lvbl9udW1iZXIgKTsKLSAgICBGVF9VTlVTRUQoIGVudHJ5X2xlbmd0aCAgICk7Ci0KLQotICAgIGlmICggRlRfUkVBRF9MT05HKCBtYWdpY19mcm9tX3N0cmVhbSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBpZiAoIG1hZ2ljX2Zyb21fc3RyZWFtICE9IG1hZ2ljICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgaWYgKCBGVF9SRUFEX0xPTkcoIHZlcnNpb25fbnVtYmVyICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogZmlsbGVyICovCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fU2tpcCggc3RyZWFtLCAxNiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbl9vZl9lbnRyaWVzICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIGlmICggbl9vZl9lbnRyaWVzID09IDAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG5fb2ZfZW50cmllczsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX1JFQURfTE9ORyggZW50cnlfaWQgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIGlmICggZW50cnlfaWQgPT0gcmVzb3VyY2VfZm9ya19lbnRyeV9pZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfUkVBRF9MT05HKCBlbnRyeV9vZmZzZXQgKSB8fAotICAgICAgICAgICAgIEZUX1JFQURfTE9ORyggZW50cnlfbGVuZ3RoICkgKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAqcmVzdWx0X29mZnNldCA9IGVudHJ5X29mZnNldDsKLQotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1N0cmVhbV9Ta2lwKCBzdHJlYW0sIDQgKyA0ICk7ICAgIC8qIG9mZnNldCArIGxlbmd0aCAqLwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZV9mcm9tX2ZpbGVfbmFtZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzMjsKLSAgICBGVF9TdHJlYW0gICAgIHN0cmVhbTI7Ci0gICAgY2hhciAqICAgICAgICBub3VzZSA9IE5VTEw7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLQotCi0gICAgYXJnczIuZmxhZ3MgICAgPSBGVF9PUEVOX1BBVEhOQU1FOwotICAgIGFyZ3MyLnBhdGhuYW1lID0gZmlsZV9uYW1lOwotICAgIGVycm9yID0gRlRfU3RyZWFtX05ldyggbGlicmFyeSwgJmFyZ3MyLCAmc3RyZWFtMiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZXJyb3IgPSByYWNjZXNzX2d1ZXNzX2FwcGxlX2RvdWJsZSggbGlicmFyeSwgc3RyZWFtMiwgZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub3VzZSwgcmVzdWx0X29mZnNldCApOwotCi0gICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbTIsIDAgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIGNoYXIqCi0gIHJhY2Nlc3NfbWFrZV9maWxlX25hbWUoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpvcmlnaW5hbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaW5zZXJ0aW9uICkKLSAgewotICAgIGNoYXIqICAgICAgICBuZXdfbmFtZSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciogIHRtcDsKLSAgICBjb25zdCBjaGFyKiAgc2xhc2g7Ci0gICAgc2l6ZV90ICAgICAgIG5ld19sZW5ndGg7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgRlRfVU5VU0VEKCBlcnJvciApOwotCi0KLSAgICBuZXdfbGVuZ3RoID0gZnRfc3RybGVuKCBvcmlnaW5hbF9uYW1lICkgKyBmdF9zdHJsZW4oIGluc2VydGlvbiApOwotICAgIGlmICggRlRfQUxMT0MoIG5ld19uYW1lLCBuZXdfbGVuZ3RoICsgMSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgdG1wID0gZnRfc3RycmNociggb3JpZ2luYWxfbmFtZSwgJy8nICk7Ci0gICAgaWYgKCB0bXAgKQotICAgIHsKLSAgICAgIGZ0X3N0cm5jcHkoIG5ld19uYW1lLAotICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfbmFtZSwKLSAgICAgICAgICAgICAgICAgIChzaXplX3QpKCB0bXAgLSBvcmlnaW5hbF9uYW1lICsgMSApICk7Ci0gICAgICBuZXdfbmFtZVt0bXAgLSBvcmlnaW5hbF9uYW1lICsgMV0gPSAnXDAnOwotICAgICAgc2xhc2ggPSB0bXAgKyAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2xhc2ggICAgICAgPSBvcmlnaW5hbF9uYW1lOwotICAgICAgbmV3X25hbWVbMF0gPSAnXDAnOwotICAgIH0KLQotICAgIGZ0X3N0cmNhdCggbmV3X25hbWUsIGluc2VydGlvbiApOwotICAgIGZ0X3N0cmNhdCggbmV3X25hbWUsIHNsYXNoICk7Ci0KLSAgICByZXR1cm4gbmV3X25hbWU7Ci0gIH0KLQotCi0jZWxzZSAgIC8qICFGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICBEdW1teSBmdW5jdGlvbjsganVzdCBzZXRzIGVycm9ycyAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUmFjY2Vzc19HdWVzcyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKm5ld19uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICAqZXJyb3JzICkKLSAgewotICAgIEZUX0ludCAgaTsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0gICAgRlRfVU5VU0VEKCBiYXNlX25hbWUgKTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBGVF9SQUNDRVNTX05fUlVMRVM7IGkrKyApCi0gICAgewotICAgICAgbmV3X25hbWVzW2ldID0gTlVMTDsKLSAgICAgIG9mZnNldHNbaV0gICA9IDA7Ci0gICAgICBlcnJvcnNbaV0gICAgPSBGVF9FUlIoIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgIH0KLSAgfQotCi0KLSNlbmRpZiAgLyogIUZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0c25hbWVzLmMgYi9zcmMvYmFzZS9mdHNuYW1lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA5NDUwLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0c25hbWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzbmFtZXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNpbXBsZSBpbnRlcmZhY2UgdG8gYWNjZXNzIFNGTlQgbmFtZSB0YWJsZXMgKHdoaWNoIGFyZSB1c2VkICAgICAgICAgICovCi0vKiAgICB0byBob2xkIGZvbnQgbmFtZXMsIGNvcHlyaWdodCBpbmZvLCBub3RpY2VzLCBldGMuKSAoYm9keSkuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgaXMgX25vdF8gdXNlZCB0byByZXRyaWV2ZSBnbHlwaCBuYW1lcyEgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzbmFtZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VJbnQgKQotICBGVF9HZXRfU2ZudF9OYW1lX0NvdW50KCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIHJldHVybiAoIGZhY2UgJiYgRlRfSVNfU0ZOVCggZmFjZSApICkgPyAoKFRUX0ZhY2UpZmFjZSktPm51bV9uYW1lcyA6IDA7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzbmFtZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1NmbnRfTmFtZSggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgRlRfU2ZudE5hbWUgICphbmFtZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLQotCi0gICAgaWYgKCBhbmFtZSAmJiBmYWNlICYmIEZUX0lTX1NGTlQoIGZhY2UgKSApCi0gICAgewotICAgICAgVFRfRmFjZSAgdHRmYWNlID0gKFRUX0ZhY2UpZmFjZTsKLQotCi0gICAgICBpZiAoIGlkeCA8IChGVF9VSW50KXR0ZmFjZS0+bnVtX25hbWVzICkKLSAgICAgIHsKLSAgICAgICAgVFRfTmFtZSAgZW50cnkgPSB0dGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBpZHg7Ci0KLQotICAgICAgICAvKiBsb2FkIG5hbWUgb24gZGVtYW5kICovCi0gICAgICAgIGlmICggZW50cnktPnN0cmluZ0xlbmd0aCA+IDAgJiYgIWVudHJ5LT5zdHJpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5tZW1vcnk7Ci0gICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5zdHJlYW07Ci0KLQotICAgICAgICAgIGlmICggRlRfTkVXX0FSUkFZICAoIGVudHJ5LT5zdHJpbmcsIGVudHJ5LT5zdHJpbmdMZW5ndGggKSB8fAotICAgICAgICAgICAgICAgRlRfU1RSRUFNX1NFRUsoIGVudHJ5LT5zdHJpbmdPZmZzZXQgKSAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIGVudHJ5LT5zdHJpbmcsIGVudHJ5LT5zdHJpbmdMZW5ndGggKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotICAgICAgICAgICAgZW50cnktPnN0cmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYW5hbWUtPnBsYXRmb3JtX2lkID0gZW50cnktPnBsYXRmb3JtSUQ7Ci0gICAgICAgIGFuYW1lLT5lbmNvZGluZ19pZCA9IGVudHJ5LT5lbmNvZGluZ0lEOwotICAgICAgICBhbmFtZS0+bGFuZ3VhZ2VfaWQgPSBlbnRyeS0+bGFuZ3VhZ2VJRDsKLSAgICAgICAgYW5hbWUtPm5hbWVfaWQgICAgID0gZW50cnktPm5hbWVJRDsKLSAgICAgICAgYW5hbWUtPnN0cmluZyAgICAgID0gKEZUX0J5dGUqKWVudHJ5LT5zdHJpbmc7Ci0gICAgICAgIGFuYW1lLT5zdHJpbmdfbGVuICA9IGVudHJ5LT5zdHJpbmdMZW5ndGg7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c25hbWVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9TZm50X0xhbmdUYWcoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBsYW5nSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1NmbnRMYW5nVGFnICAqYWxhbmdUYWcgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLQotICAgIGlmICggYWxhbmdUYWcgJiYgZmFjZSAmJiBGVF9JU19TRk5UKCBmYWNlICkgKQotICAgIHsKLSAgICAgIFRUX0ZhY2UgIHR0ZmFjZSA9IChUVF9GYWNlKWZhY2U7Ci0KLQotICAgICAgaWYgKCB0dGZhY2UtPm5hbWVfdGFibGUuZm9ybWF0ICE9IDEgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICAgICAgaWYgKCBsYW5nSUQgPiAweDgwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGxhbmdJRCAtIDB4ODAwMFUgPCB0dGZhY2UtPm5hbWVfdGFibGUubnVtTGFuZ1RhZ1JlY29yZHMgKQotICAgICAgewotICAgICAgICBUVF9MYW5nVGFnICBlbnRyeSA9IHR0ZmFjZS0+bmFtZV90YWJsZS5sYW5nVGFncyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBsYW5nSUQgLSAweDgwMDBVICk7Ci0KLQotICAgICAgICAvKiBsb2FkIG5hbWUgb24gZGVtYW5kICovCi0gICAgICAgIGlmICggZW50cnktPnN0cmluZ0xlbmd0aCA+IDAgJiYgIWVudHJ5LT5zdHJpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5tZW1vcnk7Ci0gICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5zdHJlYW07Ci0KLQotICAgICAgICAgIGlmICggRlRfTkVXX0FSUkFZICAoIGVudHJ5LT5zdHJpbmcsIGVudHJ5LT5zdHJpbmdMZW5ndGggKSB8fAotICAgICAgICAgICAgICAgRlRfU1RSRUFNX1NFRUsoIGVudHJ5LT5zdHJpbmdPZmZzZXQgKSAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIGVudHJ5LT5zdHJpbmcsIGVudHJ5LT5zdHJpbmdMZW5ndGggKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotICAgICAgICAgICAgZW50cnktPnN0cmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWxhbmdUYWctPnN0cmluZyAgICAgPSAoRlRfQnl0ZSopZW50cnktPnN0cmluZzsKLSAgICAgICAgYWxhbmdUYWctPnN0cmluZ19sZW4gPSBlbnRyeS0+c3RyaW5nTGVuZ3RoOwotCi0gICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0c3RyZWFtLmMgYi9zcmMvYmFzZS9mdHN0cmVhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Y4YzhiLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0c3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzdHJlYW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEkvTyBzdHJlYW0gc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9zdHJlYW0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfU3RyZWFtX09wZW5NZW1vcnkoIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBzaXplICkKLSAgewotICAgIHN0cmVhbS0+YmFzZSAgID0gKEZUX0J5dGUqKSBiYXNlOwotICAgIHN0cmVhbS0+c2l6ZSAgID0gc2l6ZTsKLSAgICBzdHJlYW0tPnBvcyAgICA9IDA7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBOVUxMOwotICAgIHN0cmVhbS0+cmVhZCAgID0gTlVMTDsKLSAgICBzdHJlYW0tPmNsb3NlICA9IE5VTEw7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfU3RyZWFtX0Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBpZiAoIHN0cmVhbSAmJiBzdHJlYW0tPmNsb3NlICkKLSAgICAgIHN0cmVhbS0+Y2xvc2UoIHN0cmVhbSApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fU2VlayggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cmVhZCggc3RyZWFtLCBwb3MsIDAsIDAgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9TZWVrOiIKLSAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgICAgIHBvcywgc3RyZWFtLT5zaXplICkpOwotCi0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgICAgfQotICAgIH0KLSAgICAvKiBub3RlIHRoYXQgc2Vla2luZyB0byB0aGUgZmlyc3QgcG9zaXRpb24gYWZ0ZXIgdGhlIGZpbGUgaXMgdmFsaWQgKi8KLSAgICBlbHNlIGlmICggcG9zID4gc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fU2VlazoiCi0gICAgICAgICAgICAgICAgICIgaW52YWxpZCBpL287IHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICAgIHBvcywgc3RyZWFtLT5zaXplICkpOwotCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICB9Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgICBzdHJlYW0tPnBvcyA9IHBvczsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1NraXAoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBkaXN0YW5jZSApCi0gIHsKLSAgICBpZiAoIGRpc3RhbmNlIDwgMCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotCi0gICAgcmV0dXJuIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIHN0cmVhbS0+cG9zICsgKEZUX1VMb25nKWRpc3RhbmNlICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9Qb3MoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIHJldHVybiBzdHJlYW0tPnBvczsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1JlYWQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICkKLSAgewotICAgIHJldHVybiBGVF9TdHJlYW1fUmVhZEF0KCBzdHJlYW0sIHN0cmVhbS0+cG9zLCBidWZmZXIsIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcywKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1VMb25nICByZWFkX2J5dGVzOwotCi0KLSAgICBpZiAoIHBvcyA+PSBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9SZWFkQXQ6IgotICAgICAgICAgICAgICAgICAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgICBwb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICB9Ci0KLSAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgICByZWFkX2J5dGVzID0gc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHBvcywgYnVmZmVyLCBjb3VudCApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWFkX2J5dGVzID0gc3RyZWFtLT5zaXplIC0gcG9zOwotICAgICAgaWYgKCByZWFkX2J5dGVzID4gY291bnQgKQotICAgICAgICByZWFkX2J5dGVzID0gY291bnQ7Ci0KLSAgICAgIEZUX01FTV9DT1BZKCBidWZmZXIsIHN0cmVhbS0+YmFzZSArIHBvcywgcmVhZF9ieXRlcyApOwotICAgIH0KLQotICAgIHN0cmVhbS0+cG9zID0gcG9zICsgcmVhZF9ieXRlczsKLQotICAgIGlmICggcmVhZF9ieXRlcyA8IGNvdW50ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZEF0OiIKLSAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHJlYWQ7IGV4cGVjdGVkICVsdSBieXRlcywgZ290ICVsdVxuIiwKLSAgICAgICAgICAgICAgICAgY291bnQsIHJlYWRfYnl0ZXMgKSk7Ci0KLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1RyeVJlYWQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICkKLSAgewotICAgIEZUX1VMb25nICByZWFkX2J5dGVzID0gMDsKLQotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyA+PSBzdHJlYW0tPnNpemUgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBzdHJlYW0tPnJlYWQgKQotICAgICAgcmVhZF9ieXRlcyA9IHN0cmVhbS0+cmVhZCggc3RyZWFtLCBzdHJlYW0tPnBvcywgYnVmZmVyLCBjb3VudCApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWFkX2J5dGVzID0gc3RyZWFtLT5zaXplIC0gc3RyZWFtLT5wb3M7Ci0gICAgICBpZiAoIHJlYWRfYnl0ZXMgPiBjb3VudCApCi0gICAgICAgIHJlYWRfYnl0ZXMgPSBjb3VudDsKLQotICAgICAgRlRfTUVNX0NPUFkoIGJ1ZmZlciwgc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3MsIHJlYWRfYnl0ZXMgKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0tPnBvcyArPSByZWFkX2J5dGVzOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHJlYWRfYnl0ZXM7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gRlRfU3RyZWFtX0VudGVyRnJhbWUoIHN0cmVhbSwgY291bnQgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgKnBieXRlcyA9IChGVF9CeXRlKilzdHJlYW0tPmN1cnNvcjsKLQotICAgICAgLyogZXF1aXZhbGVudCB0byBGVF9TdHJlYW1fRXhpdEZyYW1lKCksIHdpdGggbm8gbWVtb3J5IGJsb2NrIHJlbGVhc2UgKi8KLSAgICAgIHN0cmVhbS0+Y3Vyc29yID0gTlVMTDsKLSAgICAgIHN0cmVhbS0+bGltaXQgID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICkKLSAgewotICAgIGlmICggc3RyZWFtICYmIHN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotICAgICAgZnRfbWVtX2ZyZWUoIG1lbW9yeSwgKnBieXRlcyApOwotICAgICAgKnBieXRlcyA9IE5VTEw7Ci0jZWxzZQotICAgICAgRlRfRlJFRSggKnBieXRlcyApOwotI2VuZGlmCi0gICAgfQotICAgICpwYnl0ZXMgPSBOVUxMOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fRW50ZXJGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VTG9uZyAgcmVhZF9ieXRlczsKLQotCi0gICAgLyogY2hlY2sgZm9yIG5lc3RlZCBmcmFtZSBhY2Nlc3MgKi8KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciA9PSAwICk7Ci0KLSAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgLyogYWxsb2NhdGUgdGhlIGZyYW1lIGluIG1lbW9yeSAqLwotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotCi0gICAgICAvKiBzaW1wbGUgc2FuaXR5IGNoZWNrICovCi0gICAgICBpZiAoIGNvdW50ID4gc3RyZWFtLT5zaXplICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX0VudGVyRnJhbWU6IgotICAgICAgICAgICAgICAgICAgICIgZnJhbWUgc2l6ZSAoJWx1KSBsYXJnZXIgdGhhbiBzdHJlYW0gc2l6ZSAoJWx1KVxuIiwKLSAgICAgICAgICAgICAgICAgICBjb3VudCwgc3RyZWFtLT5zaXplICkpOwotCi0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLSAgICAgIC8qIGFzc3VtZSBfZnRfZGVidWdfZmlsZSBhbmQgX2Z0X2RlYnVnX2xpbmVubyBhcmUgYWxyZWFkeSBzZXQgKi8KLSAgICAgIHN0cmVhbS0+YmFzZSA9ICh1bnNpZ25lZCBjaGFyKilmdF9tZW1fcWFsbG9jKCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotI2Vsc2UKLSAgICAgIGlmICggRlRfUUFMTE9DKCBzdHJlYW0tPmJhc2UsIGNvdW50ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0jZW5kaWYKLSAgICAgIC8qIHJlYWQgaXQgKi8KLSAgICAgIHJlYWRfYnl0ZXMgPSBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmJhc2UsIGNvdW50ICk7Ci0gICAgICBpZiAoIHJlYWRfYnl0ZXMgPCBjb3VudCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9FbnRlckZyYW1lOiIKLSAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgcmVhZDsgZXhwZWN0ZWQgJWx1IGJ5dGVzLCBnb3QgJWx1XG4iLAotICAgICAgICAgICAgICAgICAgIGNvdW50LCByZWFkX2J5dGVzICkpOwotCi0gICAgICAgIEZUX0ZSRUUoIHN0cmVhbS0+YmFzZSApOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgIH0KLSAgICAgIHN0cmVhbS0+Y3Vyc29yID0gc3RyZWFtLT5iYXNlOwotICAgICAgc3RyZWFtLT5saW1pdCAgPSBzdHJlYW0tPmN1cnNvciArIGNvdW50OwotICAgICAgc3RyZWFtLT5wb3MgICArPSByZWFkX2J5dGVzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogY2hlY2sgY3VycmVudCBhbmQgbmV3IHBvc2l0aW9uICovCi0gICAgICBpZiAoIHN0cmVhbS0+cG9zID49IHN0cmVhbS0+c2l6ZSAgICAgICAgfHwKLSAgICAgICAgICAgc3RyZWFtLT5zaXplIC0gc3RyZWFtLT5wb3MgPCBjb3VudCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9FbnRlckZyYW1lOiIKLSAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgY291bnQgPSAlbHUsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnBvcywgY291bnQsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBzZXQgY3Vyc29yICovCi0gICAgICBzdHJlYW0tPmN1cnNvciA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotICAgICAgc3RyZWFtLT5saW1pdCAgPSBzdHJlYW0tPmN1cnNvciArIGNvdW50OwotICAgICAgc3RyZWFtLT5wb3MgICArPSBjb3VudDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfU3RyZWFtX0V4aXRGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgLyogSU1QT1JUQU5UOiBUaGUgYXNzZXJ0aW9uIHN0cmVhbS0+Y3Vyc29yICE9IDAgd2FzIHJlbW92ZWQsIGdpdmVuICAgICovCi0gICAgLyogICAgICAgICAgICB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGFjY2VzcyBhIGZyYW1lIG9mIGxlbmd0aCAwIGluICAgICovCi0gICAgLyogICAgICAgICAgICBzb21lIHdlaXJkIGZvbnRzICh1c3VhbGx5LCB3aGVuIGFjY2Vzc2luZyBhbiBhcnJheSBvZiAgICovCi0gICAgLyogICAgICAgICAgICAwIHJlY29yZHMsIGxpa2UgaW4gc29tZSBzdHJhbmdlIGtlcm4gdGFibGVzKS4gICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIEluIHRoaXMgY2FzZSwgdGhlIGxvYWRlciBjb2RlIGhhbmRsZXMgdGhlIDAtbGVuZ3RoIHRhYmxlICAgICAgICAgICovCi0gICAgLyogIGdyYWNlZnVsbHk7IGhvd2V2ZXIsIHN0cmVhbS5jdXJzb3IgaXMgcmVhbGx5IHNldCB0byAwIGJ5IHRoZSAgICAgICovCi0gICAgLyogIEZUX1N0cmVhbV9FbnRlckZyYW1lKCkgY2FsbCwgYW5kIHRoaXMgaXMgbm90IGFuIGVycm9yLiAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKLQotICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgICBmdF9tZW1fZnJlZSggbWVtb3J5LCBzdHJlYW0tPmJhc2UgKTsKLSAgICAgIHN0cmVhbS0+YmFzZSA9IE5VTEw7Ci0jZWxzZQotICAgICAgRlRfRlJFRSggc3RyZWFtLT5iYXNlICk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBOVUxMOwotICAgIHN0cmVhbS0+bGltaXQgID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0NoYXIgKQotICBGVF9TdHJlYW1fR2V0Q2hhciggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfQ2hhciAgcmVzdWx0OwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOwotCi0gICAgcmVzdWx0ID0gMDsKLSAgICBpZiAoIHN0cmVhbS0+Y3Vyc29yIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgPSAoRlRfQ2hhcikqc3RyZWFtLT5jdXJzb3IrKzsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fR2V0VVNob3J0KCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHA7Ci0gICAgRlRfVVNob3J0ICByZXN1bHQ7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7Ci0KLSAgICByZXN1bHQgICAgICAgICA9IDA7Ci0gICAgcCAgICAgICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBpZiAoIHAgKyAxIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIHN0cmVhbS0+Y3Vyc29yID0gcDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fR2V0VVNob3J0TEUoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0J5dGUqICAgcDsKLSAgICBGVF9VU2hvcnQgIHJlc3VsdDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gJiYgc3RyZWFtLT5jdXJzb3IgKTsKLQotICAgIHJlc3VsdCAgICAgICAgID0gMDsKLSAgICBwICAgICAgICAgICAgICA9IHN0cmVhbS0+Y3Vyc29yOwotICAgIGlmICggcCArIDEgPCBzdHJlYW0tPmxpbWl0ICkKLSAgICAgIHJlc3VsdCAgICAgICA9IEZUX05FWFRfVVNIT1JUX0xFKCBwICk7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBwOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX0dldFVPZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VMb25nICByZXN1bHQ7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7Ci0KLSAgICByZXN1bHQgICAgICAgICA9IDA7Ci0gICAgcCAgICAgICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBpZiAoIHAgKyAyIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgICAgICAgPSBGVF9ORVhUX1VPRkYzKCBwICk7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVTG9uZyggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUxvbmcgIHJlc3VsdDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gJiYgc3RyZWFtLT5jdXJzb3IgKTsKLQotICAgIHJlc3VsdCAgICAgICAgID0gMDsKLSAgICBwICAgICAgICAgICAgICA9IHN0cmVhbS0+Y3Vyc29yOwotICAgIGlmICggcCArIDMgPCBzdHJlYW0tPmxpbWl0ICkKLSAgICAgIHJlc3VsdCAgICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBzdHJlYW0tPmN1cnNvciA9IHA7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX0dldFVMb25nTEUoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VMb25nICByZXN1bHQ7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7Ci0KLSAgICByZXN1bHQgICAgICAgICA9IDA7Ci0gICAgcCAgICAgICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBpZiAoIHAgKyAzIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgICAgICAgPSBGVF9ORVhUX1VMT05HX0xFKCBwICk7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9DaGFyICkKLSAgRlRfU3RyZWFtX1JlYWRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKLSAgewotICAgIEZUX0J5dGUgIHJlc3VsdCA9IDA7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICk7Ci0KLSAgICAqZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsICZyZXN1bHQsIDFMICkgIT0gMUwgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cG9zIDwgc3RyZWFtLT5zaXplICkKLSAgICAgICAgcmVzdWx0ID0gc3RyZWFtLT5iYXNlW3N0cmVhbS0+cG9zXTsKLSAgICAgIGVsc2UKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLSAgICBzdHJlYW0tPnBvcysrOwotCi0gICAgcmV0dXJuIChGVF9DaGFyKXJlc3VsdDsKLQotICBGYWlsOgotICAgICplcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZENoYXI6IgotICAgICAgICAgICAgICAgIiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VTaG9ydCApCi0gIEZUX1N0cmVhbV9SZWFkVVNob3J0KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQotICB7Ci0gICAgRlRfQnl0ZSAgICByZWFkc1syXTsKLSAgICBGVF9CeXRlKiAgIHAgICAgICA9IDA7Ci0gICAgRlRfVVNob3J0ICByZXN1bHQgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwotCi0gICAgKmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyArIDEgPCBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIHJlYWRzLCAyTCApICE9IDJMICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcCA9IHJlYWRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7Ci0KLSAgICAgIGlmICggcCApCi0gICAgICAgIHJlc3VsdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIHN0cmVhbS0+cG9zICs9IDI7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIEZhaWw6Ci0gICAgKmVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9SZWFkVVNob3J0OiIKLSAgICAgICAgICAgICAgICIgaW52YWxpZCBpL287IHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICBzdHJlYW0tPnBvcywgc3RyZWFtLT5zaXplICkpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fUmVhZFVTaG9ydExFKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApCi0gIHsKLSAgICBGVF9CeXRlICAgIHJlYWRzWzJdOwotICAgIEZUX0J5dGUqICAgcCAgICAgID0gMDsKLSAgICBGVF9VU2hvcnQgIHJlc3VsdCA9IDA7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICk7Ci0KLSAgICAqZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIHN0cmVhbS0+cG9zICsgMSA8IHN0cmVhbS0+c2l6ZSApCi0gICAgewotICAgICAgaWYgKCBzdHJlYW0tPnJlYWQgKQotICAgICAgewotICAgICAgICBpZiAoIHN0cmVhbS0+cmVhZCggc3RyZWFtLCBzdHJlYW0tPnBvcywgcmVhZHMsIDJMICkgIT0gMkwgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBwID0gcmVhZHM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHAgPSBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKLQotICAgICAgaWYgKCBwICkKLSAgICAgICAgcmVzdWx0ID0gRlRfTkVYVF9VU0hPUlRfTEUoIHAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZ290byBGYWlsOwotCi0gICAgc3RyZWFtLT5wb3MgKz0gMjsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgRmFpbDoKLSAgICAqZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1JlYWRVU2hvcnRMRToiCi0gICAgICAgICAgICAgICAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fUmVhZFVPZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQotICB7Ci0gICAgRlRfQnl0ZSAgIHJlYWRzWzNdOwotICAgIEZUX0J5dGUqICBwICAgICAgPSAwOwotICAgIEZUX1VMb25nICByZXN1bHQgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwotCi0gICAgKmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyArIDIgPCBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKHN0cmVhbS0+cmVhZCggc3RyZWFtLCBzdHJlYW0tPnBvcywgcmVhZHMsIDNMICkgIT0gM0wgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBwID0gcmVhZHM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHAgPSBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKLQotICAgICAgaWYgKCBwICkKLSAgICAgICAgcmVzdWx0ID0gRlRfTkVYVF9VT0ZGMyggcCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBzdHJlYW0tPnBvcyArPSAzOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBGYWlsOgotICAgICplcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZFVPZmZzZXQ6IgotICAgICAgICAgICAgICAgIiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1JlYWRVTG9uZyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQotICB7Ci0gICAgRlRfQnl0ZSAgIHJlYWRzWzRdOwotICAgIEZUX0J5dGUqICBwICAgICAgPSAwOwotICAgIEZUX1VMb25nICByZXN1bHQgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwotCi0gICAgKmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyArIDMgPCBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIHJlYWRzLCA0TCApICE9IDRMICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcCA9IHJlYWRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7Ci0KLSAgICAgIGlmICggcCApCi0gICAgICAgIHJlc3VsdCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZ290byBGYWlsOwotCi0gICAgc3RyZWFtLT5wb3MgKz0gNDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgRmFpbDoKLSAgICAqZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1JlYWRVTG9uZzoiCi0gICAgICAgICAgICAgICAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fUmVhZFVMb25nTEUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQotICB7Ci0gICAgRlRfQnl0ZSAgIHJlYWRzWzRdOwotICAgIEZUX0J5dGUqICBwICAgICAgPSAwOwotICAgIEZUX1VMb25nICByZXN1bHQgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwotCi0gICAgKmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyArIDMgPCBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIHJlYWRzLCA0TCApICE9IDRMICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcCA9IHJlYWRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7Ci0KLSAgICAgIGlmICggcCApCi0gICAgICAgIHJlc3VsdCA9IEZUX05FWFRfVUxPTkdfTEUoIHAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZ290byBGYWlsOwotCi0gICAgc3RyZWFtLT5wb3MgKz0gNDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgRmFpbDoKLSAgICAqZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1JlYWRVTG9uZ0xFOiIKLSAgICAgICAgICAgICAgICIgaW52YWxpZCBpL287IHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICBzdHJlYW0tPnBvcywgc3RyZWFtLT5zaXplICkpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkRmllbGRzKCBGVF9TdHJlYW0gICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkKiAgZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX0Jvb2wgICBmcmFtZV9hY2Nlc3NlZCA9IDA7Ci0gICAgRlRfQnl0ZSogIGN1cnNvcjsKLQotCi0gICAgaWYgKCAhZmllbGRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCAhc3RyZWFtICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fSGFuZGxlICk7Ci0KLSAgICBjdXJzb3IgPSBzdHJlYW0tPmN1cnNvcjsKLQotICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIGRvCi0gICAgewotICAgICAgRlRfVUxvbmcgIHZhbHVlOwotICAgICAgRlRfSW50ICAgIHNpZ25fc2hpZnQ7Ci0gICAgICBGVF9CeXRlKiAgcDsKLQotCi0gICAgICBzd2l0Y2ggKCBmaWVsZHMtPnZhbHVlICkKLSAgICAgIHsKLSAgICAgIGNhc2UgZnRfZnJhbWVfc3RhcnQ6ICAvKiBhY2Nlc3MgYSBuZXcgZnJhbWUgKi8KLSAgICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fRW50ZXJGcmFtZSggc3RyZWFtLCBmaWVsZHMtPm9mZnNldCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgZnJhbWVfYWNjZXNzZWQgPSAxOwotICAgICAgICBjdXJzb3IgICAgICAgICA9IHN0cmVhbS0+Y3Vyc29yOwotICAgICAgICBmaWVsZHMrKzsKLSAgICAgICAgY29udGludWU7ICAvKiBsb29wISAqLwotCi0gICAgICBjYXNlIGZ0X2ZyYW1lX2J5dGVzOiAgLyogcmVhZCBhIGJ5dGUgc2VxdWVuY2UgKi8KLSAgICAgIGNhc2UgZnRfZnJhbWVfc2tpcDogICAvKiBza2lwIHNvbWUgYnl0ZXMgICAgICAqLwotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgbGVuID0gZmllbGRzLT5zaXplOwotCi0KLSAgICAgICAgICBpZiAoIGN1cnNvciArIGxlbiA+IHN0cmVhbS0+bGltaXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggZmllbGRzLT52YWx1ZSA9PSBmdF9mcmFtZV9ieXRlcyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcCA9IChGVF9CeXRlKilzdHJ1Y3R1cmUgKyBmaWVsZHMtPm9mZnNldDsKLSAgICAgICAgICAgIEZUX01FTV9DT1BZKCBwLCBjdXJzb3IsIGxlbiApOwotICAgICAgICAgIH0KLSAgICAgICAgICBjdXJzb3IgKz0gbGVuOwotICAgICAgICAgIGZpZWxkcysrOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIGNhc2UgZnRfZnJhbWVfYnl0ZToKLSAgICAgIGNhc2UgZnRfZnJhbWVfc2NoYXI6ICAvKiByZWFkIGEgc2luZ2xlIGJ5dGUgKi8KLSAgICAgICAgdmFsdWUgPSBGVF9ORVhUX0JZVEUoIGN1cnNvciApOwotICAgICAgICBzaWduX3NoaWZ0ID0gMjQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGZ0X2ZyYW1lX3Nob3J0X2JlOgotICAgICAgY2FzZSBmdF9mcmFtZV91c2hvcnRfYmU6ICAvKiByZWFkIGEgMi1ieXRlIGJpZy1lbmRpYW4gc2hvcnQgKi8KLSAgICAgICAgdmFsdWUgPSBGVF9ORVhUX1VTSE9SVCggY3Vyc29yICk7Ci0gICAgICAgIHNpZ25fc2hpZnQgPSAxNjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgZnRfZnJhbWVfc2hvcnRfbGU6Ci0gICAgICBjYXNlIGZ0X2ZyYW1lX3VzaG9ydF9sZTogIC8qIHJlYWQgYSAyLWJ5dGUgbGl0dGxlLWVuZGlhbiBzaG9ydCAqLwotICAgICAgICB2YWx1ZSA9IEZUX05FWFRfVVNIT1JUX0xFKCBjdXJzb3IgKTsKLSAgICAgICAgc2lnbl9zaGlmdCA9IDE2OwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBmdF9mcmFtZV9sb25nX2JlOgotICAgICAgY2FzZSBmdF9mcmFtZV91bG9uZ19iZTogIC8qIHJlYWQgYSA0LWJ5dGUgYmlnLWVuZGlhbiBsb25nICovCi0gICAgICAgIHZhbHVlID0gRlRfTkVYVF9VTE9ORyggY3Vyc29yICk7Ci0gICAgICAgIHNpZ25fc2hpZnQgPSAwOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBmdF9mcmFtZV9sb25nX2xlOgotICAgICAgY2FzZSBmdF9mcmFtZV91bG9uZ19sZTogIC8qIHJlYWQgYSA0LWJ5dGUgbGl0dGxlLWVuZGlhbiBsb25nICovCi0gICAgICAgIHZhbHVlID0gRlRfTkVYVF9VTE9OR19MRSggY3Vyc29yICk7Ci0gICAgICAgIHNpZ25fc2hpZnQgPSAwOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBmdF9mcmFtZV9vZmYzX2JlOgotICAgICAgY2FzZSBmdF9mcmFtZV91b2ZmM19iZTogIC8qIHJlYWQgYSAzLWJ5dGUgYmlnLWVuZGlhbiBsb25nICovCi0gICAgICAgIHZhbHVlID0gRlRfTkVYVF9VT0ZGMyggY3Vyc29yICk7Ci0gICAgICAgIHNpZ25fc2hpZnQgPSA4OwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBmdF9mcmFtZV9vZmYzX2xlOgotICAgICAgY2FzZSBmdF9mcmFtZV91b2ZmM19sZTogIC8qIHJlYWQgYSAzLWJ5dGUgbGl0dGxlLWVuZGlhbiBsb25nICovCi0gICAgICAgIHZhbHVlID0gRlRfTkVYVF9VT0ZGM19MRSggY3Vyc29yICk7Ci0gICAgICAgIHNpZ25fc2hpZnQgPSA4OwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLyogb3RoZXJ3aXNlLCBleGl0IHRoZSBsb29wICovCi0gICAgICAgIHN0cmVhbS0+Y3Vyc29yID0gY3Vyc29yOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdywgY29tcHV0ZSB0aGUgc2lnbmVkIHZhbHVlIGlzIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKCBmaWVsZHMtPnZhbHVlICYgRlRfRlJBTUVfT1BfU0lHTkVEICkKLSAgICAgICAgdmFsdWUgPSAoRlRfVUxvbmcpKCAoRlRfSW50MzIpKCB2YWx1ZSA8PCBzaWduX3NoaWZ0ICkgPj4gc2lnbl9zaGlmdCApOwotCi0gICAgICAvKiBmaW5hbGx5LCBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCAqLwotCi0gICAgICBwID0gKEZUX0J5dGUqKXN0cnVjdHVyZSArIGZpZWxkcy0+b2Zmc2V0OwotICAgICAgc3dpdGNoICggZmllbGRzLT5zaXplICkKLSAgICAgIHsKLSAgICAgIGNhc2UgKCA4IC8gRlRfQ0hBUl9CSVQgKToKLSAgICAgICAgKihGVF9CeXRlKilwID0gKEZUX0J5dGUpdmFsdWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlICggMTYgLyBGVF9DSEFSX0JJVCApOgotICAgICAgICAqKEZUX1VTaG9ydCopcCA9IChGVF9VU2hvcnQpdmFsdWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlICggMzIgLyBGVF9DSEFSX0JJVCApOgotICAgICAgICAqKEZUX1VJbnQzMiopcCA9IChGVF9VSW50MzIpdmFsdWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OiAgLyogZm9yIDY0LWJpdCBzeXN0ZW1zICovCi0gICAgICAgICooRlRfVUxvbmcqKXAgPSAoRlRfVUxvbmcpdmFsdWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGdvIHRvIG5leHQgZmllbGQgKi8KLSAgICAgIGZpZWxkcysrOwotICAgIH0KLSAgICB3aGlsZSAoIDEgKTsKLQotICBFeGl0OgotICAgIC8qIGNsb3NlIHRoZSBmcmFtZSBpZiBpdCB3YXMgb3BlbmVkIGJ5IHRoaXMgcmVhZCAqLwotICAgIGlmICggZnJhbWVfYWNjZXNzZWQgKQotICAgICAgRlRfU3RyZWFtX0V4aXRGcmFtZSggc3RyZWFtICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0c3Ryb2tlLmMgYi9zcmMvYmFzZS9mdHN0cm9rZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzJkZTBkLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0c3Ryb2tlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3Ryb2tlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBwYXRoIHN0cm9rZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9TVFJPS0VSX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotI2luY2x1ZGUgImJhc2VwaWMuaCIKLQotCi0gIC8qIGRlY2xhcmUgYW4gZXh0ZXJuIHRvIGFjY2VzcyBgZnRfb3V0bGluZV9nbHlwaF9jbGFzcycgZ2xvYmFsbHkgICAgICovCi0gIC8qIGFsbG9jYXRlZCAgaW4gYGZ0Z2x5cGguYycsIGFuZCB1c2UgdGhlIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUICovCi0gIC8qIG1hY3JvIHRvIGFjY2VzcyBpdCB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEZUX0dseXBoX0NsYXNzICBmdF9vdXRsaW5lX2dseXBoX2NsYXNzOwotI2VuZGlmCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9TdHJva2VyQm9yZGVyICkKLSAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIoIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIEZUX09yaWVudGF0aW9uICBvID0gRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24oIG91dGxpbmUgKTsKLQotCi0gICAgcmV0dXJuIG8gPT0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgPyBGVF9TVFJPS0VSX0JPUkRFUl9SSUdIVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlRfU1RST0tFUl9CT1JERVJfTEVGVDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfU3Ryb2tlckJvcmRlciApCi0gIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgRlRfT3JpZW50YXRpb24gIG8gPSBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiggb3V0bGluZSApOwotCi0KLSAgICByZXR1cm4gbyA9PSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSA/IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgQkVaSUVSIENPTVBVVEFUSU9OUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGVF9TTUFMTF9DT05JQ19USFJFU0hPTEQgICggRlRfQU5HTEVfUEkgLyA2ICkKLSNkZWZpbmUgRlRfU01BTExfQ1VCSUNfVEhSRVNIT0xEICAoIEZUX0FOR0xFX1BJIC8gOCApCi0KLSNkZWZpbmUgRlRfRVBTSUxPTiAgMgotCi0jZGVmaW5lIEZUX0lTX1NNQUxMKCB4ICkgICggKHgpID4gLUZUX0VQU0lMT04gJiYgKHgpIDwgRlRfRVBTSUxPTiApCi0KLQotICBzdGF0aWMgRlRfUG9zCi0gIGZ0X3Bvc19hYnMoIEZUX1BvcyAgeCApCi0gIHsKLSAgICByZXR1cm4geCA+PSAwID8geCA6IC14OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9jb25pY19zcGxpdCggRlRfVmVjdG9yKiAgYmFzZSApCi0gIHsKLSAgICBGVF9Qb3MgIGEsIGI7Ci0KLQotICAgIGJhc2VbNF0ueCA9IGJhc2VbMl0ueDsKLSAgICBiID0gYmFzZVsxXS54OwotICAgIGEgPSBiYXNlWzNdLnggPSAoIGJhc2VbMl0ueCArIGIgKSAvIDI7Ci0gICAgYiA9IGJhc2VbMV0ueCA9ICggYmFzZVswXS54ICsgYiApIC8gMjsKLSAgICBiYXNlWzJdLnggPSAoIGEgKyBiICkgLyAyOwotCi0gICAgYmFzZVs0XS55ID0gYmFzZVsyXS55OwotICAgIGIgPSBiYXNlWzFdLnk7Ci0gICAgYSA9IGJhc2VbM10ueSA9ICggYmFzZVsyXS55ICsgYiApIC8gMjsKLSAgICBiID0gYmFzZVsxXS55ID0gKCBiYXNlWzBdLnkgKyBiICkgLyAyOwotICAgIGJhc2VbMl0ueSA9ICggYSArIGIgKSAvIDI7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGZ0X2NvbmljX2lzX3NtYWxsX2Vub3VnaCggRlRfVmVjdG9yKiAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICphbmdsZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICphbmdsZV9vdXQgKQotICB7Ci0gICAgRlRfVmVjdG9yICBkMSwgZDI7Ci0gICAgRlRfQW5nbGUgICB0aGV0YTsKLSAgICBGVF9JbnQgICAgIGNsb3NlMSwgY2xvc2UyOwotCi0KLSAgICBkMS54ID0gYmFzZVsxXS54IC0gYmFzZVsyXS54OwotICAgIGQxLnkgPSBiYXNlWzFdLnkgLSBiYXNlWzJdLnk7Ci0gICAgZDIueCA9IGJhc2VbMF0ueCAtIGJhc2VbMV0ueDsKLSAgICBkMi55ID0gYmFzZVswXS55IC0gYmFzZVsxXS55OwotCi0gICAgY2xvc2UxID0gRlRfSVNfU01BTEwoIGQxLnggKSAmJiBGVF9JU19TTUFMTCggZDEueSApOwotICAgIGNsb3NlMiA9IEZUX0lTX1NNQUxMKCBkMi54ICkgJiYgRlRfSVNfU01BTEwoIGQyLnkgKTsKLQotICAgIGlmICggY2xvc2UxICkKLSAgICB7Ci0gICAgICBpZiAoIGNsb3NlMiApCi0gICAgICB7Ci0gICAgICAgIC8qIGJhc2ljYWxseSBhIHBvaW50OyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBkbyBub3RoaW5nIHRvIHJldGFpbiBvcmlnaW5hbCBkaXJlY3Rpb24gKi8KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmFuZ2xlX2luICA9Ci0gICAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDIueCwgZDIueSApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qICFjbG9zZTEgKi8KLSAgICB7Ci0gICAgICBpZiAoIGNsb3NlMiApCi0gICAgICB7Ci0gICAgICAgICphbmdsZV9pbiAgPQotICAgICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQxLngsIGQxLnkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmFuZ2xlX2luICA9IEZUX0F0YW4yKCBkMS54LCBkMS55ICk7Ci0gICAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDIueCwgZDIueSApOwotICAgICAgfQotICAgIH0KLQotICAgIHRoZXRhID0gZnRfcG9zX2FicyggRlRfQW5nbGVfRGlmZiggKmFuZ2xlX2luLCAqYW5nbGVfb3V0ICkgKTsKLQotICAgIHJldHVybiBGVF9CT09MKCB0aGV0YSA8IEZUX1NNQUxMX0NPTklDX1RIUkVTSE9MRCApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9jdWJpY19zcGxpdCggRlRfVmVjdG9yKiAgYmFzZSApCi0gIHsKLSAgICBGVF9Qb3MgIGEsIGIsIGMsIGQ7Ci0KLQotICAgIGJhc2VbNl0ueCA9IGJhc2VbM10ueDsKLSAgICBjID0gYmFzZVsxXS54OwotICAgIGQgPSBiYXNlWzJdLng7Ci0gICAgYmFzZVsxXS54ID0gYSA9ICggYmFzZVswXS54ICsgYyApIC8gMjsKLSAgICBiYXNlWzVdLnggPSBiID0gKCBiYXNlWzNdLnggKyBkICkgLyAyOwotICAgIGMgPSAoIGMgKyBkICkgLyAyOwotICAgIGJhc2VbMl0ueCA9IGEgPSAoIGEgKyBjICkgLyAyOwotICAgIGJhc2VbNF0ueCA9IGIgPSAoIGIgKyBjICkgLyAyOwotICAgIGJhc2VbM10ueCA9ICggYSArIGIgKSAvIDI7Ci0KLSAgICBiYXNlWzZdLnkgPSBiYXNlWzNdLnk7Ci0gICAgYyA9IGJhc2VbMV0ueTsKLSAgICBkID0gYmFzZVsyXS55OwotICAgIGJhc2VbMV0ueSA9IGEgPSAoIGJhc2VbMF0ueSArIGMgKSAvIDI7Ci0gICAgYmFzZVs1XS55ID0gYiA9ICggYmFzZVszXS55ICsgZCApIC8gMjsKLSAgICBjID0gKCBjICsgZCApIC8gMjsKLSAgICBiYXNlWzJdLnkgPSBhID0gKCBhICsgYyApIC8gMjsKLSAgICBiYXNlWzRdLnkgPSBiID0gKCBiICsgYyApIC8gMjsKLSAgICBiYXNlWzNdLnkgPSAoIGEgKyBiICkgLyAyOwotICB9Ci0KLQotICAvKiBSZXR1cm4gdGhlIGF2ZXJhZ2Ugb2YgYGFuZ2xlMScgYW5kIGBhbmdsZTInLiAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZ2l2ZXMgY29ycmVjdCByZXN1bHQgZXZlbiBpZiBgYW5nbGUxJyBhbmQgYGFuZ2xlMicgKi8KLSAgLyogaGF2ZSBvcHBvc2l0ZSBzaWducy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfQW5nbGUKLSAgZnRfYW5nbGVfbWVhbiggRlRfQW5nbGUgIGFuZ2xlMSwKLSAgICAgICAgICAgICAgICAgRlRfQW5nbGUgIGFuZ2xlMiApCi0gIHsKLSAgICByZXR1cm4gYW5nbGUxICsgRlRfQW5nbGVfRGlmZiggYW5nbGUxLCBhbmdsZTIgKSAvIDI7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGZ0X2N1YmljX2lzX3NtYWxsX2Vub3VnaCggRlRfVmVjdG9yKiAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICphbmdsZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICphbmdsZV9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAqYW5nbGVfb3V0ICkKLSAgewotICAgIEZUX1ZlY3RvciAgZDEsIGQyLCBkMzsKLSAgICBGVF9BbmdsZSAgIHRoZXRhMSwgdGhldGEyOwotICAgIEZUX0ludCAgICAgY2xvc2UxLCBjbG9zZTIsIGNsb3NlMzsKLQotCi0gICAgZDEueCA9IGJhc2VbMl0ueCAtIGJhc2VbM10ueDsKLSAgICBkMS55ID0gYmFzZVsyXS55IC0gYmFzZVszXS55OwotICAgIGQyLnggPSBiYXNlWzFdLnggLSBiYXNlWzJdLng7Ci0gICAgZDIueSA9IGJhc2VbMV0ueSAtIGJhc2VbMl0ueTsKLSAgICBkMy54ID0gYmFzZVswXS54IC0gYmFzZVsxXS54OwotICAgIGQzLnkgPSBiYXNlWzBdLnkgLSBiYXNlWzFdLnk7Ci0KLSAgICBjbG9zZTEgPSBGVF9JU19TTUFMTCggZDEueCApICYmIEZUX0lTX1NNQUxMKCBkMS55ICk7Ci0gICAgY2xvc2UyID0gRlRfSVNfU01BTEwoIGQyLnggKSAmJiBGVF9JU19TTUFMTCggZDIueSApOwotICAgIGNsb3NlMyA9IEZUX0lTX1NNQUxMKCBkMy54ICkgJiYgRlRfSVNfU01BTEwoIGQzLnkgKTsKLQotICAgIGlmICggY2xvc2UxICkKLSAgICB7Ci0gICAgICBpZiAoIGNsb3NlMiApCi0gICAgICB7Ci0gICAgICAgIGlmICggY2xvc2UzICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGJhc2ljYWxseSBhIHBvaW50OyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIGRvIG5vdGhpbmcgdG8gcmV0YWluIG9yaWdpbmFsIGRpcmVjdGlvbiAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogIWNsb3NlMyAqLwotICAgICAgICB7Ci0gICAgICAgICAgKmFuZ2xlX2luICA9Ci0gICAgICAgICAgKmFuZ2xlX21pZCA9Ci0gICAgICAgICAgKmFuZ2xlX291dCA9IEZUX0F0YW4yKCBkMy54LCBkMy55ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLyogIWNsb3NlMiAqLwotICAgICAgewotICAgICAgICBpZiAoIGNsb3NlMyApCi0gICAgICAgIHsKLSAgICAgICAgICAqYW5nbGVfaW4gID0KLSAgICAgICAgICAqYW5nbGVfbWlkID0KLSAgICAgICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQyLngsIGQyLnkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qICFjbG9zZTMgKi8KLSAgICAgICAgewotICAgICAgICAgICphbmdsZV9pbiAgPQotICAgICAgICAgICphbmdsZV9taWQgPSBGVF9BdGFuMiggZDIueCwgZDIueSApOwotICAgICAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDMueCwgZDMueSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogIWNsb3NlMSAqLwotICAgIHsKLSAgICAgIGlmICggY2xvc2UyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjbG9zZTMgKQotICAgICAgICB7Ci0gICAgICAgICAgKmFuZ2xlX2luICA9Ci0gICAgICAgICAgKmFuZ2xlX21pZCA9Ci0gICAgICAgICAgKmFuZ2xlX291dCA9IEZUX0F0YW4yKCBkMS54LCBkMS55ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiAhY2xvc2UzICovCi0gICAgICAgIHsKLSAgICAgICAgICAqYW5nbGVfaW4gID0gRlRfQXRhbjIoIGQxLngsIGQxLnkgKTsKLSAgICAgICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQzLngsIGQzLnkgKTsKLSAgICAgICAgICAqYW5nbGVfbWlkID0gZnRfYW5nbGVfbWVhbiggKmFuZ2xlX2luLCAqYW5nbGVfb3V0ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLyogIWNsb3NlMiAqLwotICAgICAgewotICAgICAgICBpZiAoIGNsb3NlMyApCi0gICAgICAgIHsKLSAgICAgICAgICAqYW5nbGVfaW4gID0gRlRfQXRhbjIoIGQxLngsIGQxLnkgKTsKLSAgICAgICAgICAqYW5nbGVfbWlkID0KLSAgICAgICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQyLngsIGQyLnkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qICFjbG9zZTMgKi8KLSAgICAgICAgewotICAgICAgICAgICphbmdsZV9pbiAgPSBGVF9BdGFuMiggZDEueCwgZDEueSApOwotICAgICAgICAgICphbmdsZV9taWQgPSBGVF9BdGFuMiggZDIueCwgZDIueSApOwotICAgICAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDMueCwgZDMueSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGhldGExID0gZnRfcG9zX2FicyggRlRfQW5nbGVfRGlmZiggKmFuZ2xlX2luLCAgKmFuZ2xlX21pZCApICk7Ci0gICAgdGhldGEyID0gZnRfcG9zX2FicyggRlRfQW5nbGVfRGlmZiggKmFuZ2xlX21pZCwgKmFuZ2xlX291dCApICk7Ci0KLSAgICByZXR1cm4gRlRfQk9PTCggdGhldGExIDwgRlRfU01BTExfQ1VCSUNfVEhSRVNIT0xEICYmCi0gICAgICAgICAgICAgICAgICAgIHRoZXRhMiA8IEZUX1NNQUxMX0NVQklDX1RIUkVTSE9MRCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNUUk9LRSBCT1JERVJTICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIGVudW0gIEZUX1N0cm9rZVRhZ3NfCi0gIHsKLSAgICBGVF9TVFJPS0VfVEFHX09OICAgID0gMSwgICAvKiBvbi1jdXJ2ZSBwb2ludCAgKi8KLSAgICBGVF9TVFJPS0VfVEFHX0NVQklDID0gMiwgICAvKiBjdWJpYyBvZmYtcG9pbnQgKi8KLSAgICBGVF9TVFJPS0VfVEFHX0JFR0lOID0gNCwgICAvKiBzdWItcGF0aCBzdGFydCAgKi8KLSAgICBGVF9TVFJPS0VfVEFHX0VORCAgID0gOCAgICAvKiBzdWItcGF0aCBlbmQgICAgKi8KLQotICB9IEZUX1N0cm9rZVRhZ3M7Ci0KLSNkZWZpbmUgIEZUX1NUUk9LRV9UQUdfQkVHSU5fRU5EICAoIEZUX1NUUk9LRV9UQUdfQkVHSU4gfCBGVF9TVFJPS0VfVEFHX0VORCApCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1N0cm9rZUJvcmRlclJlY18KLSAgewotICAgIEZUX1VJbnQgICAgIG51bV9wb2ludHM7Ci0gICAgRlRfVUludCAgICAgbWF4X3BvaW50czsKLSAgICBGVF9WZWN0b3IqICBwb2ludHM7Ci0gICAgRlRfQnl0ZSogICAgdGFnczsKLSAgICBGVF9Cb29sICAgICBtb3ZhYmxlOyAgLyogVFJVRSBmb3IgZW5kcyBvZiBsaW5ldG8gYm9yZGVycyAqLwotICAgIEZUX0ludCAgICAgIHN0YXJ0OyAgICAvKiBpbmRleCBvZiBjdXJyZW50IHN1Yi1wYXRoIHN0YXJ0IHBvaW50ICovCi0gICAgRlRfTWVtb3J5ICAgbWVtb3J5OwotICAgIEZUX0Jvb2wgICAgIHZhbGlkOwotCi0gIH0gRlRfU3Ryb2tlQm9yZGVyUmVjLCAqRlRfU3Ryb2tlQm9yZGVyOwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZV9ib3JkZXJfZ3JvdyggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBuZXdfcG9pbnRzICkKLSAgewotICAgIEZUX1VJbnQgICBvbGRfbWF4ID0gYm9yZGVyLT5tYXhfcG9pbnRzOwotICAgIEZUX1VJbnQgICBuZXdfbWF4ID0gYm9yZGVyLT5udW1fcG9pbnRzICsgbmV3X3BvaW50czsKLSAgICBGVF9FcnJvciAgZXJyb3IgICA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBuZXdfbWF4ID4gb2xkX21heCApCi0gICAgewotICAgICAgRlRfVUludCAgICBjdXJfbWF4ID0gb2xkX21heDsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICA9IGJvcmRlci0+bWVtb3J5OwotCi0KLSAgICAgIHdoaWxlICggY3VyX21heCA8IG5ld19tYXggKQotICAgICAgICBjdXJfbWF4ICs9ICggY3VyX21heCA+PiAxICkgKyAxNjsKLQotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggYm9yZGVyLT5wb2ludHMsIG9sZF9tYXgsIGN1cl9tYXggKSB8fAotICAgICAgICAgICBGVF9SRU5FV19BUlJBWSggYm9yZGVyLT50YWdzLCAgIG9sZF9tYXgsIGN1cl9tYXggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgYm9yZGVyLT5tYXhfcG9pbnRzID0gY3VyX21heDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3N0cm9rZV9ib3JkZXJfY2xvc2UoIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIHJldmVyc2UgKQotICB7Ci0gICAgRlRfVUludCAgc3RhcnQgPSAoRlRfVUludClib3JkZXItPnN0YXJ0OwotICAgIEZUX1VJbnQgIGNvdW50ID0gYm9yZGVyLT5udW1fcG9pbnRzOwotCi0KLSAgICBGVF9BU1NFUlQoIGJvcmRlci0+c3RhcnQgPj0gMCApOwotCi0gICAgLyogZG9uJ3QgcmVjb3JkIGVtcHR5IHBhdGhzISAqLwotICAgIGlmICggY291bnQgPD0gc3RhcnQgKyAxVSApCi0gICAgICBib3JkZXItPm51bV9wb2ludHMgPSBzdGFydDsKLSAgICBlbHNlCi0gICAgewotICAgICAgLyogY29weSB0aGUgbGFzdCBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhpcyBzdWItcGF0aCwgc2luY2UgKi8KLSAgICAgIC8qIGl0IGNvbnRhaW5zIHRoZSBgYWRqdXN0ZWQnIHN0YXJ0aW5nIGNvb3JkaW5hdGVzICAgICAgICAgICovCi0gICAgICBib3JkZXItPm51bV9wb2ludHMgICAgPSAtLWNvdW50OwotICAgICAgYm9yZGVyLT5wb2ludHNbc3RhcnRdID0gYm9yZGVyLT5wb2ludHNbY291bnRdOwotCi0gICAgICBpZiAoIHJldmVyc2UgKQotICAgICAgewotICAgICAgICAvKiByZXZlcnNlIHRoZSBwb2ludHMgKi8KLSAgICAgICAgewotICAgICAgICAgIEZUX1ZlY3RvciogIHZlYzEgPSBib3JkZXItPnBvaW50cyArIHN0YXJ0ICsgMTsKLSAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMyID0gYm9yZGVyLT5wb2ludHMgKyBjb3VudCAtIDE7Ci0KLQotICAgICAgICAgIGZvciAoIDsgdmVjMSA8IHZlYzI7IHZlYzErKywgdmVjMi0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHRtcDsKLQotCi0gICAgICAgICAgICB0bXAgICA9ICp2ZWMxOwotICAgICAgICAgICAgKnZlYzEgPSAqdmVjMjsKLSAgICAgICAgICAgICp2ZWMyID0gdG1wOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRoZW4gdGhlIHRhZ3MgKi8KLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICB0YWcxID0gYm9yZGVyLT50YWdzICsgc3RhcnQgKyAxOwotICAgICAgICAgIEZUX0J5dGUqICB0YWcyID0gYm9yZGVyLT50YWdzICsgY291bnQgLSAxOwotCi0KLSAgICAgICAgICBmb3IgKCA7IHRhZzEgPCB0YWcyOyB0YWcxKyssIHRhZzItLSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfQnl0ZSAgdG1wOwotCi0KLSAgICAgICAgICAgIHRtcCAgID0gKnRhZzE7Ci0gICAgICAgICAgICAqdGFnMSA9ICp0YWcyOwotICAgICAgICAgICAgKnRhZzIgPSB0bXA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGJvcmRlci0+dGFnc1tzdGFydCAgICBdIHw9IEZUX1NUUk9LRV9UQUdfQkVHSU47Ci0gICAgICBib3JkZXItPnRhZ3NbY291bnQgLSAxXSB8PSBGVF9TVFJPS0VfVEFHX0VORDsKLSAgICB9Ci0KLSAgICBib3JkZXItPnN0YXJ0ICAgPSAtMTsKLSAgICBib3JkZXItPm1vdmFibGUgPSBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIG1vdmFibGUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBGVF9BU1NFUlQoIGJvcmRlci0+c3RhcnQgPj0gMCApOwotCi0gICAgaWYgKCBib3JkZXItPm1vdmFibGUgKQotICAgIHsKLSAgICAgIC8qIG1vdmUgbGFzdCBwb2ludCAqLwotICAgICAgYm9yZGVyLT5wb2ludHNbYm9yZGVyLT5udW1fcG9pbnRzIC0gMV0gPSAqdG87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBkb24ndCBhZGQgemVyby1sZW5ndGggbGluZXRvICovCi0gICAgICBpZiAoIGJvcmRlci0+bnVtX3BvaW50cyA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBGVF9JU19TTUFMTCggYm9yZGVyLT5wb2ludHNbYm9yZGVyLT5udW1fcG9pbnRzIC0gMV0ueCAtIHRvLT54ICkgJiYKLSAgICAgICAgICAgRlRfSVNfU01BTEwoIGJvcmRlci0+cG9pbnRzW2JvcmRlci0+bnVtX3BvaW50cyAtIDFdLnkgLSB0by0+eSApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAvKiBhZGQgb25lIHBvaW50ICovCi0gICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfZ3JvdyggYm9yZGVyLCAxICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciogIHZlYyA9IGJvcmRlci0+cG9pbnRzICsgYm9yZGVyLT5udW1fcG9pbnRzOwotICAgICAgICBGVF9CeXRlKiAgICB0YWcgPSBib3JkZXItPnRhZ3MgICArIGJvcmRlci0+bnVtX3BvaW50czsKLQotCi0gICAgICAgIHZlY1swXSA9ICp0bzsKLSAgICAgICAgdGFnWzBdID0gRlRfU1RST0tFX1RBR19PTjsKLQotICAgICAgICBib3JkZXItPm51bV9wb2ludHMgKz0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYm9yZGVyLT5tb3ZhYmxlID0gbW92YWJsZTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX2NvbmljdG8oIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIHRvICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgRlRfQVNTRVJUKCBib3JkZXItPnN0YXJ0ID49IDAgKTsKLQotICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9ncm93KCBib3JkZXIsIDIgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjID0gYm9yZGVyLT5wb2ludHMgKyBib3JkZXItPm51bV9wb2ludHM7Ci0gICAgICBGVF9CeXRlKiAgICB0YWcgPSBib3JkZXItPnRhZ3MgICArIGJvcmRlci0+bnVtX3BvaW50czsKLQotCi0gICAgICB2ZWNbMF0gPSAqY29udHJvbDsKLSAgICAgIHZlY1sxXSA9ICp0bzsKLQotICAgICAgdGFnWzBdID0gMDsKLSAgICAgIHRhZ1sxXSA9IEZUX1NUUk9LRV9UQUdfT047Ci0KLSAgICAgIGJvcmRlci0+bnVtX3BvaW50cyArPSAyOwotICAgIH0KLQotICAgIGJvcmRlci0+bW92YWJsZSA9IEZBTFNFOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlX2JvcmRlcl9jdWJpY3RvKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICB0byApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIEZUX0FTU0VSVCggYm9yZGVyLT5zdGFydCA+PSAwICk7Ci0KLSAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfZ3JvdyggYm9yZGVyLCAzICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHZlYyA9IGJvcmRlci0+cG9pbnRzICsgYm9yZGVyLT5udW1fcG9pbnRzOwotICAgICAgRlRfQnl0ZSogICAgdGFnID0gYm9yZGVyLT50YWdzICAgKyBib3JkZXItPm51bV9wb2ludHM7Ci0KLQotICAgICAgdmVjWzBdID0gKmNvbnRyb2wxOwotICAgICAgdmVjWzFdID0gKmNvbnRyb2wyOwotICAgICAgdmVjWzJdID0gKnRvOwotCi0gICAgICB0YWdbMF0gPSBGVF9TVFJPS0VfVEFHX0NVQklDOwotICAgICAgdGFnWzFdID0gRlRfU1RST0tFX1RBR19DVUJJQzsKLSAgICAgIHRhZ1syXSA9IEZUX1NUUk9LRV9UQUdfT047Ci0KLSAgICAgIGJvcmRlci0+bnVtX3BvaW50cyArPSAzOwotICAgIH0KLQotICAgIGJvcmRlci0+bW92YWJsZSA9IEZBTFNFOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2RlZmluZSBGVF9BUkNfQ1VCSUNfQU5HTEUgICggRlRfQU5HTEVfUEkgLyAyICkKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX2FyY3RvKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICBjZW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICAgICAgIGFuZ2xlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICAgICAgIGFuZ2xlX2RpZmYgKQotICB7Ci0gICAgRlRfQW5nbGUgICB0b3RhbCwgYW5nbGUsIHN0ZXAsIHJvdGF0ZSwgbmV4dCwgdGhldGE7Ci0gICAgRlRfVmVjdG9yICBhLCBiLCBhMiwgYjI7Ci0gICAgRlRfRml4ZWQgICBsZW5ndGg7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgLyogY29tcHV0ZSBzdGFydCBwb2ludCAqLwotICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmYSwgcmFkaXVzLCBhbmdsZV9zdGFydCApOwotICAgIGEueCArPSBjZW50ZXItPng7Ci0gICAgYS55ICs9IGNlbnRlci0+eTsKLQotICAgIHRvdGFsICA9IGFuZ2xlX2RpZmY7Ci0gICAgYW5nbGUgID0gYW5nbGVfc3RhcnQ7Ci0gICAgcm90YXRlID0gKCBhbmdsZV9kaWZmID49IDAgKSA/IEZUX0FOR0xFX1BJMiA6IC1GVF9BTkdMRV9QSTI7Ci0KLSAgICB3aGlsZSAoIHRvdGFsICE9IDAgKQotICAgIHsKLSAgICAgIHN0ZXAgPSB0b3RhbDsKLSAgICAgIGlmICggc3RlcCA+IEZUX0FSQ19DVUJJQ19BTkdMRSApCi0gICAgICAgIHN0ZXAgPSBGVF9BUkNfQ1VCSUNfQU5HTEU7Ci0KLSAgICAgIGVsc2UgaWYgKCBzdGVwIDwgLUZUX0FSQ19DVUJJQ19BTkdMRSApCi0gICAgICAgIHN0ZXAgPSAtRlRfQVJDX0NVQklDX0FOR0xFOwotCi0gICAgICBuZXh0ICA9IGFuZ2xlICsgc3RlcDsKLSAgICAgIHRoZXRhID0gc3RlcDsKLSAgICAgIGlmICggdGhldGEgPCAwICkKLSAgICAgICAgdGhldGEgPSAtdGhldGE7Ci0KLSAgICAgIHRoZXRhID4+PSAxOwotCi0gICAgICAvKiBjb21wdXRlIGVuZCBwb2ludCAqLwotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZiLCByYWRpdXMsIG5leHQgKTsKLSAgICAgIGIueCArPSBjZW50ZXItPng7Ci0gICAgICBiLnkgKz0gY2VudGVyLT55OwotCi0gICAgICAvKiBjb21wdXRlIGZpcnN0IGFuZCBzZWNvbmQgY29udHJvbCBwb2ludHMgKi8KLSAgICAgIGxlbmd0aCA9IEZUX011bERpdiggcmFkaXVzLCBGVF9TaW4oIHRoZXRhICkgKiA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAoIDB4MTAwMDBMICsgRlRfQ29zKCB0aGV0YSApICkgKiAzICk7Ci0KLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmYTIsIGxlbmd0aCwgYW5nbGUgKyByb3RhdGUgKTsKLSAgICAgIGEyLnggKz0gYS54OwotICAgICAgYTIueSArPSBhLnk7Ci0KLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmYjIsIGxlbmd0aCwgbmV4dCAtIHJvdGF0ZSApOwotICAgICAgYjIueCArPSBiLng7Ci0gICAgICBiMi55ICs9IGIueTsKLQotICAgICAgLyogYWRkIGN1YmljIGFyYyAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2N1YmljdG8oIGJvcmRlciwgJmEyLCAmYjIsICZiICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGFyYyA/PyAqLwotICAgICAgYSAgICAgID0gYjsKLSAgICAgIHRvdGFsIC09IHN0ZXA7Ci0gICAgICBhbmdsZSAgPSBuZXh0OwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZV9ib3JkZXJfbW92ZXRvKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICAgdG8gKQotICB7Ci0gICAgLyogY2xvc2UgY3VycmVudCBvcGVuIHBhdGggaWYgYW55ID8gKi8KLSAgICBpZiAoIGJvcmRlci0+c3RhcnQgPj0gMCApCi0gICAgICBmdF9zdHJva2VfYm9yZGVyX2Nsb3NlKCBib3JkZXIsIEZBTFNFICk7Ci0KLSAgICBib3JkZXItPnN0YXJ0ID0gKEZUX0ludClib3JkZXItPm51bV9wb2ludHM7Ci0gICAgYm9yZGVyLT5tb3ZhYmxlID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgdG8sIEZBTFNFICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3N0cm9rZV9ib3JkZXJfaW5pdCggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgKQotICB7Ci0gICAgYm9yZGVyLT5tZW1vcnkgPSBtZW1vcnk7Ci0gICAgYm9yZGVyLT5wb2ludHMgPSBOVUxMOwotICAgIGJvcmRlci0+dGFncyAgID0gTlVMTDsKLQotICAgIGJvcmRlci0+bnVtX3BvaW50cyA9IDA7Ci0gICAgYm9yZGVyLT5tYXhfcG9pbnRzID0gMDsKLSAgICBib3JkZXItPnN0YXJ0ICAgICAgPSAtMTsKLSAgICBib3JkZXItPnZhbGlkICAgICAgPSBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfc3Ryb2tlX2JvcmRlcl9yZXNldCggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgKQotICB7Ci0gICAgYm9yZGVyLT5udW1fcG9pbnRzID0gMDsKLSAgICBib3JkZXItPnN0YXJ0ICAgICAgPSAtMTsKLSAgICBib3JkZXItPnZhbGlkICAgICAgPSBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfc3Ryb2tlX2JvcmRlcl9kb25lKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGJvcmRlci0+bWVtb3J5OwotCi0KLSAgICBGVF9GUkVFKCBib3JkZXItPnBvaW50cyApOwotICAgIEZUX0ZSRUUoIGJvcmRlci0+dGFncyApOwotCi0gICAgYm9yZGVyLT5udW1fcG9pbnRzID0gMDsKLSAgICBib3JkZXItPm1heF9wb2ludHMgPSAwOwotICAgIGJvcmRlci0+c3RhcnQgICAgICA9IC0xOwotICAgIGJvcmRlci0+dmFsaWQgICAgICA9IEZBTFNFOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlX2JvcmRlcl9nZXRfY291bnRzKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgKmFudW1fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAqYW51bV9jb250b3VycyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgICAgICAgID0gRlRfRXJyX09rOwotICAgIEZUX1VJbnQgICBudW1fcG9pbnRzICAgPSAwOwotICAgIEZUX1VJbnQgICBudW1fY29udG91cnMgPSAwOwotCi0gICAgRlRfVUludCAgICAgY291bnQgICAgICA9IGJvcmRlci0+bnVtX3BvaW50czsKLSAgICBGVF9WZWN0b3IqICBwb2ludCAgICAgID0gYm9yZGVyLT5wb2ludHM7Ci0gICAgRlRfQnl0ZSogICAgdGFncyAgICAgICA9IGJvcmRlci0+dGFnczsKLSAgICBGVF9JbnQgICAgICBpbl9jb250b3VyID0gMDsKLQotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIG51bV9wb2ludHMrKywgcG9pbnQrKywgdGFncysrICkKLSAgICB7Ci0gICAgICBpZiAoIHRhZ3NbMF0gJiBGVF9TVFJPS0VfVEFHX0JFR0lOICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBpbl9jb250b3VyICE9IDAgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBpbl9jb250b3VyID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBpbl9jb250b3VyID09IDAgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGlmICggdGFnc1swXSAmIEZUX1NUUk9LRV9UQUdfRU5EICkKLSAgICAgIHsKLSAgICAgICAgaW5fY29udG91ciA9IDA7Ci0gICAgICAgIG51bV9jb250b3VycysrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggaW5fY29udG91ciAhPSAwICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGJvcmRlci0+dmFsaWQgPSBUUlVFOwotCi0gIEV4aXQ6Ci0gICAgKmFudW1fcG9pbnRzICAgPSBudW1fcG9pbnRzOwotICAgICphbnVtX2NvbnRvdXJzID0gbnVtX2NvbnRvdXJzOwotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIG51bV9wb2ludHMgICA9IDA7Ci0gICAgbnVtX2NvbnRvdXJzID0gMDsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3N0cm9rZV9ib3JkZXJfZXhwb3J0KCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgb3V0bGluZSApCi0gIHsKLSAgICAvKiBjb3B5IHBvaW50IGxvY2F0aW9ucyAqLwotICAgIGlmICggYm9yZGVyLT5udW1fcG9pbnRzICkKLSAgICAgIEZUX0FSUkFZX0NPUFkoIG91dGxpbmUtPnBvaW50cyArIG91dGxpbmUtPm5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLT5wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICBib3JkZXItPm51bV9wb2ludHMgKTsKLQotICAgIC8qIGNvcHkgdGFncyAqLwotICAgIHsKLSAgICAgIEZUX1VJbnQgICBjb3VudCA9IGJvcmRlci0+bnVtX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICByZWFkICA9IGJvcmRlci0+dGFnczsKLSAgICAgIEZUX0J5dGUqICB3cml0ZSA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHJlYWQrKywgd3JpdGUrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnJlYWQgJiBGVF9TVFJPS0VfVEFHX09OICkKLSAgICAgICAgICAqd3JpdGUgPSBGVF9DVVJWRV9UQUdfT047Ci0gICAgICAgIGVsc2UgaWYgKCAqcmVhZCAmIEZUX1NUUk9LRV9UQUdfQ1VCSUMgKQotICAgICAgICAgICp3cml0ZSA9IEZUX0NVUlZFX1RBR19DVUJJQzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICp3cml0ZSA9IEZUX0NVUlZFX1RBR19DT05JQzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjb3B5IGNvbnRvdXJzICovCi0gICAgewotICAgICAgRlRfVUludCAgICBjb3VudCA9IGJvcmRlci0+bnVtX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICAgdGFncyAgPSBib3JkZXItPnRhZ3M7Ci0gICAgICBGVF9TaG9ydCogIHdyaXRlID0gb3V0bGluZS0+Y29udG91cnMgKyBvdXRsaW5lLT5uX2NvbnRvdXJzOwotICAgICAgRlRfU2hvcnQgICBpZHggICA9IChGVF9TaG9ydClvdXRsaW5lLT5uX3BvaW50czsKLQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgdGFncysrLCBpZHgrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnRhZ3MgJiBGVF9TVFJPS0VfVEFHX0VORCApCi0gICAgICAgIHsKLSAgICAgICAgICAqd3JpdGUrKyA9IGlkeDsKLSAgICAgICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRsaW5lLT5uX3BvaW50cyArPSAoc2hvcnQpYm9yZGVyLT5udW1fcG9pbnRzOwotCi0gICAgRlRfQVNTRVJUKCBGVF9PdXRsaW5lX0NoZWNrKCBvdXRsaW5lICkgPT0gMCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJPS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGVF9TSURFX1RPX1JPVEFURSggcyApICAgKCBGVF9BTkdMRV9QSTIgLSAocykgKiBGVF9BTkdMRV9QSSApCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1N0cm9rZXJSZWNfCi0gIHsKLSAgICBGVF9BbmdsZSAgICAgICAgICAgICBhbmdsZV9pbjsgICAgICAgICAgICAgLyogZGlyZWN0aW9uIGludG8gY3VyciBqb2luICovCi0gICAgRlRfQW5nbGUgICAgICAgICAgICAgYW5nbGVfb3V0OyAgICAgICAgICAgIC8qIGRpcmVjdGlvbiBvdXQgb2Ygam9pbiAgKi8KLSAgICBGVF9WZWN0b3IgICAgICAgICAgICBjZW50ZXI7ICAgICAgICAgICAgICAgLyogY3VycmVudCBwb3NpdGlvbiAqLwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgIGxpbmVfbGVuZ3RoOyAgICAgICAgICAvKiBsZW5ndGggb2YgbGFzdCBsaW5ldG8gKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgICBmaXJzdF9wb2ludDsgICAgICAgICAgLyogaXMgdGhpcyB0aGUgc3RhcnQ/ICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgc3VicGF0aF9vcGVuOyAgICAgICAgIC8qIGlzIHRoZSBzdWJwYXRoIG9wZW4/ICovCi0gICAgRlRfQW5nbGUgICAgICAgICAgICAgc3VicGF0aF9hbmdsZTsgICAgICAgIC8qIHN1YnBhdGggc3RhcnQgZGlyZWN0aW9uICovCi0gICAgRlRfVmVjdG9yICAgICAgICAgICAgc3VicGF0aF9zdGFydDsgICAgICAgIC8qIHN1YnBhdGggc3RhcnQgcG9zaXRpb24gKi8KLSAgICBGVF9GaXhlZCAgICAgICAgICAgICBzdWJwYXRoX2xpbmVfbGVuZ3RoOyAgLyogc3VicGF0aCBzdGFydCBsaW5ldG8gbGVuICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgaGFuZGxlX3dpZGVfc3Ryb2tlczsgIC8qIHVzZSB3aWRlIHN0cm9rZXMgbG9naWM/ICovCi0KLSAgICBGVF9TdHJva2VyX0xpbmVDYXAgICBsaW5lX2NhcDsKLSAgICBGVF9TdHJva2VyX0xpbmVKb2luICBsaW5lX2pvaW47Ci0gICAgRlRfU3Ryb2tlcl9MaW5lSm9pbiAgbGluZV9qb2luX3NhdmVkOwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgIG1pdGVyX2xpbWl0OwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgIHJhZGl1czsKLQotICAgIEZUX1N0cm9rZUJvcmRlclJlYyAgIGJvcmRlcnNbMl07Ci0gICAgRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeTsKLQotICB9IEZUX1N0cm9rZXJSZWM7Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfTmV3KCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXIgICphc3Ryb2tlciApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsgICAgICAgICAgIC8qIGFzc2lnbmVkIGluIEZUX05FVyAqLwotICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKLSAgICBGVF9TdHJva2VyICBzdHJva2VyID0gTlVMTDsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFzdHJva2VyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgaWYgKCAhRlRfTkVXKCBzdHJva2VyICkgKQotICAgIHsKLSAgICAgIHN0cm9rZXItPmxpYnJhcnkgPSBsaWJyYXJ5OwotCi0gICAgICBmdF9zdHJva2VfYm9yZGVyX2luaXQoICZzdHJva2VyLT5ib3JkZXJzWzBdLCBtZW1vcnkgKTsKLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfaW5pdCggJnN0cm9rZXItPmJvcmRlcnNbMV0sIG1lbW9yeSApOwotICAgIH0KLQotICAgICphc3Ryb2tlciA9IHN0cm9rZXI7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TdHJva2VyX1NldCggRlRfU3Ryb2tlciAgICAgICAgICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJfTGluZUNhcCAgIGxpbmVfY2FwLAotICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlcl9MaW5lSm9pbiAgbGluZV9qb2luLAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICAgICAgICAgbWl0ZXJfbGltaXQgKQotICB7Ci0gICAgaWYgKCAhc3Ryb2tlciApCi0gICAgICByZXR1cm47Ci0KLSAgICBzdHJva2VyLT5yYWRpdXMgICAgICA9IHJhZGl1czsKLSAgICBzdHJva2VyLT5saW5lX2NhcCAgICA9IGxpbmVfY2FwOwotICAgIHN0cm9rZXItPmxpbmVfam9pbiAgID0gbGluZV9qb2luOwotICAgIHN0cm9rZXItPm1pdGVyX2xpbWl0ID0gbWl0ZXJfbGltaXQ7Ci0KLSAgICAvKiBlbnN1cmUgbWl0ZXIgbGltaXQgaGFzIHNlbnNpYmxlIHZhbHVlICovCi0gICAgaWYgKCBzdHJva2VyLT5taXRlcl9saW1pdCA8IDB4MTAwMDBMICkKLSAgICAgIHN0cm9rZXItPm1pdGVyX2xpbWl0ID0gMHgxMDAwMEw7Ci0KLSAgICAvKiBzYXZlIGxpbmUgam9pbiBzdHlsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBsaW5lIGpvaW4gc3R5bGUgY2FuIGJlIHRlbXBvcmFyaWx5IGNoYW5nZWQgd2hlbiBzdHJva2luZyBjdXJ2ZXMgKi8KLSAgICBzdHJva2VyLT5saW5lX2pvaW5fc2F2ZWQgPSBsaW5lX2pvaW47Ci0KLSAgICBGVF9TdHJva2VyX1Jld2luZCggc3Ryb2tlciApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9SZXdpbmQoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKQotICB7Ci0gICAgaWYgKCBzdHJva2VyICkKLSAgICB7Ci0gICAgICBmdF9zdHJva2VfYm9yZGVyX3Jlc2V0KCAmc3Ryb2tlci0+Ym9yZGVyc1swXSApOwotICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9yZXNldCggJnN0cm9rZXItPmJvcmRlcnNbMV0gKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TdHJva2VyX0RvbmUoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKQotICB7Ci0gICAgaWYgKCBzdHJva2VyICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cm9rZXItPmxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgICBmdF9zdHJva2VfYm9yZGVyX2RvbmUoICZzdHJva2VyLT5ib3JkZXJzWzBdICk7Ci0gICAgICBmdF9zdHJva2VfYm9yZGVyX2RvbmUoICZzdHJva2VyLT5ib3JkZXJzWzFdICk7Ci0KLSAgICAgIHN0cm9rZXItPmxpYnJhcnkgPSBOVUxMOwotICAgICAgRlRfRlJFRSggc3Ryb2tlciApOwotICAgIH0KLSAgfQotCi0KLSAgLyogY3JlYXRlIGEgY2lyY3VsYXIgYXJjIGF0IGEgY29ybmVyIG9yIGNhcCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlcl9hcmN0byggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgc2lkZSApCi0gIHsKLSAgICBGVF9BbmdsZSAgICAgICAgIHRvdGFsLCByb3RhdGU7Ci0gICAgRlRfRml4ZWQgICAgICAgICByYWRpdXMgPSBzdHJva2VyLT5yYWRpdXM7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzICsgc2lkZTsKLQotCi0gICAgcm90YXRlID0gRlRfU0lERV9UT19ST1RBVEUoIHNpZGUgKTsKLQotICAgIHRvdGFsID0gRlRfQW5nbGVfRGlmZiggc3Ryb2tlci0+YW5nbGVfaW4sIHN0cm9rZXItPmFuZ2xlX291dCApOwotICAgIGlmICggdG90YWwgPT0gRlRfQU5HTEVfUEkgKQotICAgICAgdG90YWwgPSAtcm90YXRlICogMjsKLQotICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9hcmN0byggYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cm9rZXItPmNlbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX2luICsgcm90YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKTsKLSAgICBib3JkZXItPm1vdmFibGUgPSBGQUxTRTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGFkZCBhIGNhcCBhdCB0aGUgZW5kIG9mIGFuIG9wZW5lZCBwYXRoICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX2NhcCggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgc2lkZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggc3Ryb2tlci0+bGluZV9jYXAgPT0gRlRfU1RST0tFUl9MSU5FQ0FQX1JPVU5EICkKLSAgICB7Ci0gICAgICAvKiBhZGQgYSByb3VuZCBjYXAgKi8KLSAgICAgIHN0cm9rZXItPmFuZ2xlX2luICA9IGFuZ2xlOwotICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGUgKyBGVF9BTkdMRV9QSTsKLQotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX2FyY3RvKCBzdHJva2VyLCBzaWRlICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBzdHJva2VyLT5saW5lX2NhcCA9PSBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFICkKLSAgICB7Ci0gICAgICAvKiBhZGQgYSBzcXVhcmUgY2FwICovCi0gICAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhLCBkZWx0YTI7Ci0gICAgICBGVF9BbmdsZSAgICAgICAgIHJvdGF0ZSA9IEZUX1NJREVfVE9fUk9UQVRFKCBzaWRlICk7Ci0gICAgICBGVF9GaXhlZCAgICAgICAgIHJhZGl1cyA9IHN0cm9rZXItPnJhZGl1czsKLSAgICAgIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVycyArIHNpZGU7Ci0KLQotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YTIsIHJhZGl1cywgYW5nbGUgKyByb3RhdGUgKTsKLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsICByYWRpdXMsIGFuZ2xlICk7Ci0KLSAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLnggKyBkZWx0YTIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnkgKyBkZWx0YTIueTsKLQotICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhMiwgcmFkaXVzLCBhbmdsZSAtIHJvdGF0ZSApOwotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgIHJhZGl1cywgYW5nbGUgKTsKLQotICAgICAgZGVsdGEueCArPSBkZWx0YTIueCArIHN0cm9rZXItPmNlbnRlci54OwotICAgICAgZGVsdGEueSArPSBkZWx0YTIueSArIHN0cm9rZXItPmNlbnRlci55OwotCi0gICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHN0cm9rZXItPmxpbmVfY2FwID09IEZUX1NUUk9LRVJfTElORUNBUF9CVVRUICkKLSAgICB7Ci0gICAgICAvKiBhZGQgYSBidXR0IGVuZGluZyAqLwotICAgICAgRlRfVmVjdG9yICAgICAgICBkZWx0YTsKLSAgICAgIEZUX0FuZ2xlICAgICAgICAgcm90YXRlID0gRlRfU0lERV9UT19ST1RBVEUoIHNpZGUgKTsKLSAgICAgIEZUX0ZpeGVkICAgICAgICAgcmFkaXVzID0gc3Ryb2tlci0+cmFkaXVzOwotICAgICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzICsgc2lkZTsKLQotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCByYWRpdXMsIGFuZ2xlICsgcm90YXRlICk7Ci0KLSAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICBkZWx0YS55ICs9IHN0cm9rZXItPmNlbnRlci55OwotCi0gICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIHJhZGl1cywgYW5nbGUgLSByb3RhdGUgKTsKLQotICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcHJvY2VzcyBhbiBpbnNpZGUgY29ybmVyLCBpLmUuIGNvbXB1dGUgaW50ZXJzZWN0aW9uICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX2luc2lkZSggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIHNpZGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICBsaW5lX2xlbmd0aCApCi0gIHsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciA9IHN0cm9rZXItPmJvcmRlcnMgKyBzaWRlOwotICAgIEZUX0FuZ2xlICAgICAgICAgcGhpLCB0aGV0YSwgcm90YXRlOwotICAgIEZUX0ZpeGVkICAgICAgICAgbGVuZ3RoLCB0aGNvczsKLSAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfQm9vbCAgICAgICAgICBpbnRlcnNlY3Q7ICAgICAgICAgIC8qIHVzZSBpbnRlcnNlY3Rpb24gb2YgbGluZXM/ICovCi0KLQotICAgIHJvdGF0ZSA9IEZUX1NJREVfVE9fUk9UQVRFKCBzaWRlICk7Ci0KLSAgICB0aGV0YSA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLCBzdHJva2VyLT5hbmdsZV9vdXQgKSAvIDI7Ci0KLSAgICAvKiBPbmx5IGludGVyc2VjdCBib3JkZXJzIGlmIGJldHdlZW4gdHdvIGxpbmV0bydzIGFuZCBib3RoICovCi0gICAgLyogbGluZXMgYXJlIGxvbmcgZW5vdWdoIChsaW5lX2xlbmd0aCBpcyB6ZXJvIGZvciBjdXJ2ZXMpLiAqLwotICAgIC8qIEFsc28gYXZvaWQgVS10dXJucyBvZiBuZWFybHkgMTgwIGRlZ3JlZS4gICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFib3JkZXItPm1vdmFibGUgfHwgbGluZV9sZW5ndGggPT0gMCAgfHwKLSAgICAgICAgIHRoZXRhID4gMHg1OUMwMDAgfHwgdGhldGEgPCAtMHg1OUMwMDAgKQotICAgICAgaW50ZXJzZWN0ID0gRkFMU0U7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGNvbXB1dGUgbWluaW11bSByZXF1aXJlZCBsZW5ndGggb2YgbGluZXMgKi8KLSAgICAgIEZUX0ZpeGVkICBtaW5fbGVuZ3RoID0gZnRfcG9zX2FicyggRlRfTXVsRml4KCBzdHJva2VyLT5yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVGFuKCB0aGV0YSApICkgKTsKLQotCi0gICAgICBpbnRlcnNlY3QgPSBGVF9CT09MKCBtaW5fbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VyLT5saW5lX2xlbmd0aCA+PSBtaW5fbGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2xlbmd0aCAgICAgICAgICA+PSBtaW5fbGVuZ3RoICk7Ci0gICAgfQotCi0gICAgaWYgKCAhaW50ZXJzZWN0ICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBzdHJva2VyLT5yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ICsgcm90YXRlICk7Ci0gICAgICBkZWx0YS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgYm9yZGVyLT5tb3ZhYmxlID0gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBjb21wdXRlIG1lZGlhbiBhbmdsZSAqLwotICAgICAgcGhpID0gc3Ryb2tlci0+YW5nbGVfaW4gKyB0aGV0YTsKLQotICAgICAgdGhjb3MgPSBGVF9Db3MoIHRoZXRhICk7Ci0KLSAgICAgIGxlbmd0aCA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCB0aGNvcyApOwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSArIHJvdGF0ZSApOwotICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHByb2Nlc3MgYW4gb3V0c2lkZSBjb3JuZXIsIGkuZS4gY29tcHV0ZSBiZXZlbC9taXRlci9yb3VuZCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlcl9vdXRzaWRlKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIHNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgbGluZV9sZW5ndGggKQotICB7Ci0gICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzICsgc2lkZTsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIEZUX0FuZ2xlICAgICAgICAgcm90YXRlOwotCi0KLSAgICBpZiAoIHN0cm9rZXItPmxpbmVfam9pbiA9PSBGVF9TVFJPS0VSX0xJTkVKT0lOX1JPVU5EICkKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9hcmN0byggc3Ryb2tlciwgc2lkZSApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiB0aGlzIGlzIGEgbWl0ZXJlZCAocG9pbnRlZCkgb3IgYmV2ZWxlZCAodHJ1bmNhdGVkKSBjb3JuZXIgKi8KLSAgICAgIEZUX0ZpeGVkICBzaWdtYSA9IDAsIHJhZGl1cyA9IHN0cm9rZXItPnJhZGl1czsKLSAgICAgIEZUX0FuZ2xlICB0aGV0YSA9IDAsIHBoaSA9IDA7Ci0gICAgICBGVF9GaXhlZCAgdGhjb3MgPSAwOwotICAgICAgRlRfQm9vbCAgIGJldmVsLCBmaXhlZF9iZXZlbDsKLQotCi0gICAgICByb3RhdGUgPSBGVF9TSURFX1RPX1JPVEFURSggc2lkZSApOwotCi0gICAgICBiZXZlbCA9Ci0gICAgICAgIEZUX0JPT0woIHN0cm9rZXItPmxpbmVfam9pbiA9PSBGVF9TVFJPS0VSX0xJTkVKT0lOX0JFVkVMICk7Ci0KLSAgICAgIGZpeGVkX2JldmVsID0KLSAgICAgICAgRlRfQk9PTCggc3Ryb2tlci0+bGluZV9qb2luICE9IEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUgKTsKLQotICAgICAgaWYgKCAhYmV2ZWwgKQotICAgICAgewotICAgICAgICB0aGV0YSA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLCBzdHJva2VyLT5hbmdsZV9vdXQgKTsKLQotICAgICAgICBpZiAoIHRoZXRhID09IEZUX0FOR0xFX1BJICkKLSAgICAgICAgewotICAgICAgICAgIHRoZXRhID0gcm90YXRlOwotICAgICAgICAgIHBoaSAgID0gc3Ryb2tlci0+YW5nbGVfaW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGhldGEgLz0gMjsKLSAgICAgICAgICBwaGkgICAgPSBzdHJva2VyLT5hbmdsZV9pbiArIHRoZXRhICsgcm90YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhjb3MgPSBGVF9Db3MoIHRoZXRhICk7Ci0gICAgICAgIHNpZ21hID0gRlRfTXVsRml4KCBzdHJva2VyLT5taXRlcl9saW1pdCwgdGhjb3MgKTsKLQotICAgICAgICAvKiBpcyBtaXRlciBsaW1pdCBleGNlZWRlZD8gKi8KLSAgICAgICAgaWYgKCBzaWdtYSA8IDB4MTAwMDBMICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGRvbid0IGNyZWF0ZSB2YXJpYWJsZSBiZXZlbHMgZm9yIHZlcnkgc21hbGwgZGV2aWF0aW9uczsgKi8KLSAgICAgICAgICAvKiBGVF9TaW4oeCkgPSAwIGZvciB4IDw9IDU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBmaXhlZF9iZXZlbCB8fCBmdF9wb3NfYWJzKCB0aGV0YSApID4gNTcgKQotICAgICAgICAgICAgYmV2ZWwgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmV2ZWwgKSAgLyogdGhpcyBpcyBhIGJldmVsIChicm9rZW4gYW5nbGUpICovCi0gICAgICB7Ci0gICAgICAgIGlmICggZml4ZWRfYmV2ZWwgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhlIG91dGVyIGNvcm5lcnMgYXJlIHNpbXBseSBqb2luZWQgdG9nZXRoZXIgKi8KLSAgICAgICAgICBGVF9WZWN0b3IgIGRlbHRhOwotCi0KLSAgICAgICAgICAvKiBhZGQgYmV2ZWwgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX291dCArIHJvdGF0ZSApOwotICAgICAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICAgIGJvcmRlci0+bW92YWJsZSA9IEZBTFNFOwotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogdmFyaWFibGUgYmV2ZWwgKi8KLSAgICAgICAgewotICAgICAgICAgIC8qIHRoZSBtaXRlciBpcyB0cnVuY2F0ZWQgKi8KLSAgICAgICAgICBGVF9WZWN0b3IgIG1pZGRsZSwgZGVsdGE7Ci0gICAgICAgICAgRlRfRml4ZWQgICBsZW5ndGg7Ci0KLQotICAgICAgICAgIC8qIGNvbXB1dGUgbWlkZGxlIHBvaW50ICovCi0gICAgICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZtaWRkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggcmFkaXVzLCBzdHJva2VyLT5taXRlcl9saW1pdCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGkgKTsKLSAgICAgICAgICBtaWRkbGUueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgICAgICBtaWRkbGUueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICAgIC8qIGNvbXB1dGUgZmlyc3QgYW5nbGUgcG9pbnQgKi8KLSAgICAgICAgICBsZW5ndGggPSBGVF9NdWxEaXYoIHJhZGl1cywgMHgxMDAwMEwgLSBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0X3Bvc19hYnMoIEZUX1NpbiggdGhldGEgKSApICk7Ci0KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSArIHJvdGF0ZSApOwotICAgICAgICAgIGRlbHRhLnggKz0gbWlkZGxlLng7Ci0gICAgICAgICAgZGVsdGEueSArPSBtaWRkbGUueTsKLQotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogY29tcHV0ZSBzZWNvbmQgYW5nbGUgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSAtIHJvdGF0ZSApOwotICAgICAgICAgIGRlbHRhLnggKz0gbWlkZGxlLng7Ci0gICAgICAgICAgZGVsdGEueSArPSBtaWRkbGUueTsKLQotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogZmluYWxseSwgYWRkIGFuIGVuZCBwb2ludDsgb25seSBuZWVkZWQgaWYgbm90IGxpbmV0byAqLwotICAgICAgICAgIC8qIChsaW5lX2xlbmd0aCBpcyB6ZXJvIGZvciBjdXJ2ZXMpICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGxpbmVfbGVuZ3RoID09IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX291dCArIHJvdGF0ZSApOwotCi0gICAgICAgICAgICBkZWx0YS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8qIHRoaXMgaXMgYSBtaXRlciAoaW50ZXJzZWN0aW9uKSAqLwotICAgICAgewotICAgICAgICBGVF9GaXhlZCAgIGxlbmd0aDsKLSAgICAgICAgRlRfVmVjdG9yICBkZWx0YTsKLQotCi0gICAgICAgIGxlbmd0aCA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCB0aGNvcyApOwotCi0gICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIGxlbmd0aCwgcGhpICk7Ci0gICAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBub3cgYWRkIGFuIGVuZCBwb2ludDsgb25seSBuZWVkZWQgaWYgbm90IGxpbmV0byAqLwotICAgICAgICAvKiAobGluZV9sZW5ndGggaXMgemVybyBmb3IgY3VydmVzKSAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGxpbmVfbGVuZ3RoID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+cmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VyLT5hbmdsZV9vdXQgKyByb3RhdGUgKTsKLSAgICAgICAgICBkZWx0YS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZXJfcHJvY2Vzc19jb3JuZXIoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgIGxpbmVfbGVuZ3RoICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9BbmdsZSAgdHVybjsKLSAgICBGVF9JbnQgICAgaW5zaWRlX3NpZGU7Ci0KLQotICAgIHR1cm4gPSBGVF9BbmdsZV9EaWZmKCBzdHJva2VyLT5hbmdsZV9pbiwgc3Ryb2tlci0+YW5nbGVfb3V0ICk7Ci0KLSAgICAvKiBubyBzcGVjaWZpYyBjb3JuZXIgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCBpZiB0aGUgdHVybiBpcyAwICovCi0gICAgaWYgKCB0dXJuID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogd2hlbiB3ZSB0dXJuIHRvIHRoZSByaWdodCwgdGhlIGluc2lkZSBzaWRlIGlzIDAgKi8KLSAgICAvKiBvdGhlcndpc2UsIHRoZSBpbnNpZGUgc2lkZSBpcyAxICovCi0gICAgaW5zaWRlX3NpZGUgPSAoIHR1cm4gPCAwICk7Ci0KLSAgICAvKiBwcm9jZXNzIHRoZSBpbnNpZGUgc2lkZSAqLwotICAgIGVycm9yID0gZnRfc3Ryb2tlcl9pbnNpZGUoIHN0cm9rZXIsIGluc2lkZV9zaWRlLCBsaW5lX2xlbmd0aCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcHJvY2VzcyB0aGUgb3V0c2lkZSBzaWRlICovCi0gICAgZXJyb3IgPSBmdF9zdHJva2VyX291dHNpZGUoIHN0cm9rZXIsICFpbnNpZGVfc2lkZSwgbGluZV9sZW5ndGggKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogYWRkIHR3byBwb2ludHMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgKi8KLSAgLyogc3RhcnQgb2YgdGhlIHN1YnBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZXJfc3VicGF0aF9zdGFydCggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICBzdGFydF9hbmdsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICBsaW5lX2xlbmd0aCApCi0gIHsKLSAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhOwotICAgIEZUX1ZlY3RvciAgICAgICAgcG9pbnQ7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlcjsKLQotCi0gICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgc3Ryb2tlci0+cmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hbmdsZSArIEZUX0FOR0xFX1BJMiApOwotCi0gICAgcG9pbnQueCA9IHN0cm9rZXItPmNlbnRlci54ICsgZGVsdGEueDsKLSAgICBwb2ludC55ID0gc3Ryb2tlci0+Y2VudGVyLnkgKyBkZWx0YS55OwotCi0gICAgYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVyczsKLSAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbW92ZXRvKCBib3JkZXIsICZwb2ludCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcG9pbnQueCA9IHN0cm9rZXItPmNlbnRlci54IC0gZGVsdGEueDsKLSAgICBwb2ludC55ID0gc3Ryb2tlci0+Y2VudGVyLnkgLSBkZWx0YS55OwotCi0gICAgYm9yZGVyKys7Ci0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX21vdmV0byggYm9yZGVyLCAmcG9pbnQgKTsKLQotICAgIC8qIHNhdmUgYW5nbGUsIHBvc2l0aW9uLCBhbmQgbGluZSBsZW5ndGggZm9yIGxhc3Qgam9pbiAqLwotICAgIC8qIChsaW5lX2xlbmd0aCBpcyB6ZXJvIGZvciBjdXJ2ZXMpICAgICAgICAgICAgICAgICAgICAqLwotICAgIHN0cm9rZXItPnN1YnBhdGhfYW5nbGUgICAgICAgPSBzdGFydF9hbmdsZTsKLSAgICBzdHJva2VyLT5maXJzdF9wb2ludCAgICAgICAgID0gRkFMU0U7Ci0gICAgc3Ryb2tlci0+c3VicGF0aF9saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfTGluZVRvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlcjsKLSAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhOwotICAgIEZUX0FuZ2xlICAgICAgICAgYW5nbGU7Ci0gICAgRlRfSW50ICAgICAgICAgICBzaWRlOwotICAgIEZUX0ZpeGVkICAgICAgICAgbGluZV9sZW5ndGg7Ci0KLQotICAgIGlmICggIXN0cm9rZXIgfHwgIXRvICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZGVsdGEueCA9IHRvLT54IC0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgZGVsdGEueSA9IHRvLT55IC0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAvKiBhIHplcm8tbGVuZ3RoIGxpbmV0byBpcyBhIG5vLW9wOyBhdm9pZCBjcmVhdGluZyBhIHNwdXJpb3VzIGNvcm5lciAqLwotICAgIGlmICggZGVsdGEueCA9PSAwICYmIGRlbHRhLnkgPT0gMCApCi0gICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY29tcHV0ZSBsZW5ndGggb2YgbGluZSAqLwotICAgIGxpbmVfbGVuZ3RoID0gRlRfVmVjdG9yX0xlbmd0aCggJmRlbHRhICk7Ci0KLSAgICBhbmdsZSA9IEZUX0F0YW4yKCBkZWx0YS54LCBkZWx0YS55ICk7Ci0gICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgc3Ryb2tlci0+cmFkaXVzLCBhbmdsZSArIEZUX0FOR0xFX1BJMiApOwotCi0gICAgLyogcHJvY2VzcyBjb3JuZXIgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCBzdHJva2VyLT5maXJzdF9wb2ludCApCi0gICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3Qgc2VnbWVudCBvZiBhIHN1YnBhdGguICBXZSBuZWVkIHRvICAgICAqLwotICAgICAgLyogYWRkIGEgcG9pbnQgdG8gZWFjaCBib3JkZXIgYXQgdGhlaXIgcmVzcGVjdGl2ZSBzdGFydGluZyAqLwotICAgICAgLyogcG9pbnQgbG9jYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3N1YnBhdGhfc3RhcnQoIHN0cm9rZXIsIGFuZ2xlLCBsaW5lX2xlbmd0aCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHByb2Nlc3MgdGhlIGN1cnJlbnQgY29ybmVyICovCi0gICAgICBzdHJva2VyLT5hbmdsZV9vdXQgPSBhbmdsZTsKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9wcm9jZXNzX2Nvcm5lciggc3Ryb2tlciwgbGluZV9sZW5ndGggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbm93IGFkZCBhIGxpbmUgc2VnbWVudCB0byBib3RoIHRoZSBgaW5zaWRlJyBhbmQgYG91dHNpZGUnIHBhdGhzICovCi0gICAgZm9yICggYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVycywgc2lkZSA9IDE7IHNpZGUgPj0gMDsgc2lkZS0tLCBib3JkZXIrKyApCi0gICAgewotICAgICAgRlRfVmVjdG9yICBwb2ludDsKLQotCi0gICAgICBwb2ludC54ID0gdG8tPnggKyBkZWx0YS54OwotICAgICAgcG9pbnQueSA9IHRvLT55ICsgZGVsdGEueTsKLQotICAgICAgLyogdGhlIGVuZHMgb2YgbGluZXRvIGJvcmRlcnMgYXJlIG1vdmFibGUgKi8KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJnBvaW50LCBUUlVFICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBkZWx0YS54ID0gLWRlbHRhLng7Ci0gICAgICBkZWx0YS55ID0gLWRlbHRhLnk7Ci0gICAgfQotCi0gICAgc3Ryb2tlci0+YW5nbGVfaW4gICAgPSBhbmdsZTsKLSAgICBzdHJva2VyLT5jZW50ZXIgICAgICA9ICp0bzsKLSAgICBzdHJva2VyLT5saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQ29uaWNUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1ZlY3RvciAgIGJlel9zdGFja1szNF07Ci0gICAgRlRfVmVjdG9yKiAgYXJjOwotICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gYmV6X3N0YWNrICsgMzA7Ci0gICAgRlRfQm9vbCAgICAgZmlyc3RfYXJjID0gVFJVRTsKLQotCi0gICAgaWYgKCAhc3Ryb2tlciB8fCAhY29udHJvbCB8fCAhdG8gKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBpZiBhbGwgY29udHJvbCBwb2ludHMgYXJlIGNvaW5jaWRlbnQsIHRoaXMgaXMgYSBuby1vcDsgKi8KLSAgICAvKiBhdm9pZCBjcmVhdGluZyBhIHNwdXJpb3VzIGNvcm5lciAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIEZUX0lTX1NNQUxMKCBzdHJva2VyLT5jZW50ZXIueCAtIGNvbnRyb2wtPnggKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIHN0cm9rZXItPmNlbnRlci55IC0gY29udHJvbC0+eSApICYmCi0gICAgICAgICBGVF9JU19TTUFMTCggY29udHJvbC0+eCAgICAgICAgLSB0by0+eCAgICAgICkgJiYKLSAgICAgICAgIEZUX0lTX1NNQUxMKCBjb250cm9sLT55ICAgICAgICAtIHRvLT55ICAgICAgKSApCi0gICAgewotICAgICAgIHN0cm9rZXItPmNlbnRlciA9ICp0bzsKLSAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgYXJjICAgID0gYmV6X3N0YWNrOwotICAgIGFyY1swXSA9ICp0bzsKLSAgICBhcmNbMV0gPSAqY29udHJvbDsKLSAgICBhcmNbMl0gPSBzdHJva2VyLT5jZW50ZXI7Ci0KLSAgICB3aGlsZSAoIGFyYyA+PSBiZXpfc3RhY2sgKQotICAgIHsKLSAgICAgIEZUX0FuZ2xlICBhbmdsZV9pbiwgYW5nbGVfb3V0OwotCi0KLSAgICAgIC8qIGluaXRpYWxpemUgd2l0aCBjdXJyZW50IGRpcmVjdGlvbiAqLwotICAgICAgYW5nbGVfaW4gPSBhbmdsZV9vdXQgPSBzdHJva2VyLT5hbmdsZV9pbjsKLQotICAgICAgaWYgKCBhcmMgPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICFmdF9jb25pY19pc19zbWFsbF9lbm91Z2goIGFyYywgJmFuZ2xlX2luLCAmYW5nbGVfb3V0ICkgKQotICAgICAgewotICAgICAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICAgICAgICBzdHJva2VyLT5hbmdsZV9pbiA9IGFuZ2xlX2luOwotCi0gICAgICAgIGZ0X2NvbmljX3NwbGl0KCBhcmMgKTsKLSAgICAgICAgYXJjICs9IDI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGZpcnN0X2FyYyApCi0gICAgICB7Ci0gICAgICAgIGZpcnN0X2FyYyA9IEZBTFNFOwotCi0gICAgICAgIC8qIHByb2Nlc3MgY29ybmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfc3VicGF0aF9zdGFydCggc3Ryb2tlciwgYW5nbGVfaW4sIDAgKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGVfaW47Ci0gICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3Byb2Nlc3NfY29ybmVyKCBzdHJva2VyLCAwICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmdF9wb3NfYWJzKCBGVF9BbmdsZV9EaWZmKCBzdHJva2VyLT5hbmdsZV9pbiwgYW5nbGVfaW4gKSApID4KLSAgICAgICAgICAgICAgICAgIEZUX1NNQUxMX0NPTklDX1RIUkVTSE9MRCAvIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgLyogaWYgdGhlIGRldmlhdGlvbiBmcm9tIG9uZSBhcmMgdG8gdGhlIG5leHQgaXMgdG9vIGdyZWF0LCAqLwotICAgICAgICAvKiBhZGQgYSByb3VuZCBjb3JuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHN0cm9rZXItPmNlbnRlciAgICA9IGFyY1syXTsKLSAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGVfaW47Ci0gICAgICAgIHN0cm9rZXItPmxpbmVfam9pbiA9IEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQ7Ci0KLSAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3Byb2Nlc3NfY29ybmVyKCBzdHJva2VyLCAwICk7Ci0KLSAgICAgICAgLyogcmVpbnN0YXRlIGxpbmUgam9pbiBzdHlsZSAqLwotICAgICAgICBzdHJva2VyLT5saW5lX2pvaW4gPSBzdHJva2VyLT5saW5lX2pvaW5fc2F2ZWQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIHRoZSBhcmMncyBhbmdsZSBpcyBzbWFsbCBlbm91Z2g7IHdlIGNhbiBhZGQgaXQgZGlyZWN0bHkgdG8gZWFjaCAqLwotICAgICAgLyogYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgICAgICAgY3RybCwgZW5kOwotICAgICAgICBGVF9BbmdsZSAgICAgICAgIHRoZXRhLCBwaGksIHJvdGF0ZSwgYWxwaGEwID0gMDsKLSAgICAgICAgRlRfRml4ZWQgICAgICAgICBsZW5ndGg7Ci0gICAgICAgIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyOwotICAgICAgICBGVF9JbnQgICAgICAgICAgIHNpZGU7Ci0KLQotICAgICAgICB0aGV0YSAgPSBGVF9BbmdsZV9EaWZmKCBhbmdsZV9pbiwgYW5nbGVfb3V0ICkgLyAyOwotICAgICAgICBwaGkgICAgPSBhbmdsZV9pbiArIHRoZXRhOwotICAgICAgICBsZW5ndGggPSBGVF9EaXZGaXgoIHN0cm9rZXItPnJhZGl1cywgRlRfQ29zKCB0aGV0YSApICk7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBkaXJlY3Rpb24gb2Ygb3JpZ2luYWwgYXJjICovCi0gICAgICAgIGlmICggc3Ryb2tlci0+aGFuZGxlX3dpZGVfc3Ryb2tlcyApCi0gICAgICAgICAgYWxwaGEwID0gRlRfQXRhbjIoIGFyY1swXS54IC0gYXJjWzJdLngsIGFyY1swXS55IC0gYXJjWzJdLnkgKTsKLQotICAgICAgICBmb3IgKCBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzLCBzaWRlID0gMDsKLSAgICAgICAgICAgICAgc2lkZSA8PSAxOwotICAgICAgICAgICAgICBzaWRlKyssIGJvcmRlcisrICkKLSAgICAgICAgewotICAgICAgICAgIHJvdGF0ZSA9IEZUX1NJREVfVE9fUk9UQVRFKCBzaWRlICk7Ci0KLSAgICAgICAgICAvKiBjb21wdXRlIGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmN0cmwsIGxlbmd0aCwgcGhpICsgcm90YXRlICk7Ci0gICAgICAgICAgY3RybC54ICs9IGFyY1sxXS54OwotICAgICAgICAgIGN0cmwueSArPSBhcmNbMV0ueTsKLQotICAgICAgICAgIC8qIGNvbXB1dGUgZW5kIHBvaW50ICovCi0gICAgICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZlbmQsIHN0cm9rZXItPnJhZGl1cywgYW5nbGVfb3V0ICsgcm90YXRlICk7Ci0gICAgICAgICAgZW5kLnggKz0gYXJjWzBdLng7Ci0gICAgICAgICAgZW5kLnkgKz0gYXJjWzBdLnk7Ci0KLSAgICAgICAgICBpZiAoIHN0cm9rZXItPmhhbmRsZV93aWRlX3N0cm9rZXMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgc3RhcnQ7Ci0gICAgICAgICAgICBGVF9BbmdsZSAgIGFscGhhMTsKLQotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgd2hldGhlciB0aGUgYm9yZGVyIHJhZGl1cyBpcyBncmVhdGVyIHRoYW4gdGhlICovCi0gICAgICAgICAgICAvKiByYWRpdXMgb2YgY3VydmF0dXJlIG9mIHRoZSBvcmlnaW5hbCBhcmMgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzdGFydCA9IGJvcmRlci0+cG9pbnRzW2JvcmRlci0+bnVtX3BvaW50cyAtIDFdOwotCi0gICAgICAgICAgICBhbHBoYTEgPSBGVF9BdGFuMiggZW5kLnggLSBzdGFydC54LCBlbmQueSAtIHN0YXJ0LnkgKTsKLQotICAgICAgICAgICAgLyogaXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYm9yZGVyIGFyYyBvcHBvc2l0ZSB0byAqLwotICAgICAgICAgICAgLyogdGhhdCBvZiB0aGUgb3JpZ2luYWwgYXJjPyAqLwotICAgICAgICAgICAgaWYgKCBmdF9wb3NfYWJzKCBGVF9BbmdsZV9EaWZmKCBhbHBoYTAsIGFscGhhMSApICkgPgotICAgICAgICAgICAgICAgICAgIEZUX0FOR0xFX1BJIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9BbmdsZSAgIGJldGEsIGdhbW1hOwotICAgICAgICAgICAgICBGVF9WZWN0b3IgIGJ2ZWMsIGRlbHRhOwotICAgICAgICAgICAgICBGVF9GaXhlZCAgIGJsZW4sIHNpbkEsIHNpbkIsIGFsZW47Ci0KLQotICAgICAgICAgICAgICAvKiB1c2UgdGhlIHNpbmUgcnVsZSB0byBmaW5kIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgKi8KLSAgICAgICAgICAgICAgYmV0YSAgPSBGVF9BdGFuMiggYXJjWzJdLnggLSBzdGFydC54LCBhcmNbMl0ueSAtIHN0YXJ0LnkgKTsKLSAgICAgICAgICAgICAgZ2FtbWEgPSBGVF9BdGFuMiggYXJjWzBdLnggLSBlbmQueCwgICBhcmNbMF0ueSAtIGVuZC55ICk7Ci0KLSAgICAgICAgICAgICAgYnZlYy54ID0gZW5kLnggLSBzdGFydC54OwotICAgICAgICAgICAgICBidmVjLnkgPSBlbmQueSAtIHN0YXJ0Lnk7Ci0KLSAgICAgICAgICAgICAgYmxlbiA9IEZUX1ZlY3Rvcl9MZW5ndGgoICZidmVjICk7Ci0KLSAgICAgICAgICAgICAgc2luQSA9IGZ0X3Bvc19hYnMoIEZUX1NpbiggYWxwaGExIC0gZ2FtbWEgKSApOwotICAgICAgICAgICAgICBzaW5CID0gZnRfcG9zX2FicyggRlRfU2luKCBiZXRhIC0gZ2FtbWEgKSApOwotCi0gICAgICAgICAgICAgIGFsZW4gPSBGVF9NdWxEaXYoIGJsZW4sIHNpbkEsIHNpbkIgKTsKLQotICAgICAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBhbGVuLCBiZXRhICk7Ci0gICAgICAgICAgICAgIGRlbHRhLnggKz0gc3RhcnQueDsKLSAgICAgICAgICAgICAgZGVsdGEueSArPSBzdGFydC55OwotCi0gICAgICAgICAgICAgIC8qIGNpcmN1bW5hdmlnYXRlIHRoZSBuZWdhdGl2ZSBzZWN0b3IgYmFja3dhcmRzICovCi0gICAgICAgICAgICAgIGJvcmRlci0+bW92YWJsZSA9IEZBTFNFOwotICAgICAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZlbmQsIEZBTFNFICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2NvbmljdG8oIGJvcmRlciwgJmN0cmwsICZzdGFydCApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIC8qIGFuZCB0aGVuIG1vdmUgdG8gdGhlIGVuZHBvaW50ICovCi0gICAgICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmVuZCwgRkFMU0UgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHNpbXBseSBhZGQgYW4gYXJjICovCi0gICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2NvbmljdG8oIGJvcmRlciwgJmN0cmwsICZlbmQgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBhcmMgLT0gMjsKLQotICAgICAgc3Ryb2tlci0+YW5nbGVfaW4gPSBhbmdsZV9vdXQ7Ci0gICAgfQotCi0gICAgc3Ryb2tlci0+Y2VudGVyID0gKnRvOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQ3ViaWNUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0byApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9WZWN0b3IgICBiZXpfc3RhY2tbMzddOwotICAgIEZUX1ZlY3RvciogIGFyYzsKLSAgICBGVF9WZWN0b3IqICBsaW1pdCA9IGJlel9zdGFjayArIDMyOwotICAgIEZUX0Jvb2wgICAgIGZpcnN0X2FyYyA9IFRSVUU7Ci0KLQotICAgIGlmICggIXN0cm9rZXIgfHwgIWNvbnRyb2wxIHx8ICFjb250cm9sMiB8fCAhdG8gKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBpZiBhbGwgY29udHJvbCBwb2ludHMgYXJlIGNvaW5jaWRlbnQsIHRoaXMgaXMgYSBuby1vcDsgKi8KLSAgICAvKiBhdm9pZCBjcmVhdGluZyBhIHNwdXJpb3VzIGNvcm5lciAqLwotICAgIGlmICggRlRfSVNfU01BTEwoIHN0cm9rZXItPmNlbnRlci54IC0gY29udHJvbDEtPnggKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIHN0cm9rZXItPmNlbnRlci55IC0gY29udHJvbDEtPnkgKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIGNvbnRyb2wxLT54ICAgICAgIC0gY29udHJvbDItPnggKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIGNvbnRyb2wxLT55ICAgICAgIC0gY29udHJvbDItPnkgKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIGNvbnRyb2wyLT54ICAgICAgIC0gdG8tPnggICAgICAgKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIGNvbnRyb2wyLT55ICAgICAgIC0gdG8tPnkgICAgICAgKSApCi0gICAgewotICAgICAgIHN0cm9rZXItPmNlbnRlciA9ICp0bzsKLSAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgYXJjICAgID0gYmV6X3N0YWNrOwotICAgIGFyY1swXSA9ICp0bzsKLSAgICBhcmNbMV0gPSAqY29udHJvbDI7Ci0gICAgYXJjWzJdID0gKmNvbnRyb2wxOwotICAgIGFyY1szXSA9IHN0cm9rZXItPmNlbnRlcjsKLQotICAgIHdoaWxlICggYXJjID49IGJlel9zdGFjayApCi0gICAgewotICAgICAgRlRfQW5nbGUgIGFuZ2xlX2luLCBhbmdsZV9taWQsIGFuZ2xlX291dDsKLQotCi0gICAgICAvKiBpbml0aWFsaXplIHdpdGggY3VycmVudCBkaXJlY3Rpb24gKi8KLSAgICAgIGFuZ2xlX2luID0gYW5nbGVfb3V0ID0gYW5nbGVfbWlkID0gc3Ryb2tlci0+YW5nbGVfaW47Ci0KLSAgICAgIGlmICggYXJjIDwgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICFmdF9jdWJpY19pc19zbWFsbF9lbm91Z2goIGFyYywgJmFuZ2xlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5nbGVfbWlkLCAmYW5nbGVfb3V0ICkgKQotICAgICAgewotICAgICAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICAgICAgICBzdHJva2VyLT5hbmdsZV9pbiA9IGFuZ2xlX2luOwotCi0gICAgICAgIGZ0X2N1YmljX3NwbGl0KCBhcmMgKTsKLSAgICAgICAgYXJjICs9IDM7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGZpcnN0X2FyYyApCi0gICAgICB7Ci0gICAgICAgIGZpcnN0X2FyYyA9IEZBTFNFOwotCi0gICAgICAgIC8qIHByb2Nlc3MgY29ybmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfc3VicGF0aF9zdGFydCggc3Ryb2tlciwgYW5nbGVfaW4sIDAgKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGVfaW47Ci0gICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3Byb2Nlc3NfY29ybmVyKCBzdHJva2VyLCAwICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmdF9wb3NfYWJzKCBGVF9BbmdsZV9EaWZmKCBzdHJva2VyLT5hbmdsZV9pbiwgYW5nbGVfaW4gKSApID4KLSAgICAgICAgICAgICAgICAgIEZUX1NNQUxMX0NVQklDX1RIUkVTSE9MRCAvIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgLyogaWYgdGhlIGRldmlhdGlvbiBmcm9tIG9uZSBhcmMgdG8gdGhlIG5leHQgaXMgdG9vIGdyZWF0LCAqLwotICAgICAgICAvKiBhZGQgYSByb3VuZCBjb3JuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHN0cm9rZXItPmNlbnRlciAgICA9IGFyY1szXTsKLSAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGVfaW47Ci0gICAgICAgIHN0cm9rZXItPmxpbmVfam9pbiA9IEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQ7Ci0KLSAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3Byb2Nlc3NfY29ybmVyKCBzdHJva2VyLCAwICk7Ci0KLSAgICAgICAgLyogcmVpbnN0YXRlIGxpbmUgam9pbiBzdHlsZSAqLwotICAgICAgICBzdHJva2VyLT5saW5lX2pvaW4gPSBzdHJva2VyLT5saW5lX2pvaW5fc2F2ZWQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIHRoZSBhcmMncyBhbmdsZSBpcyBzbWFsbCBlbm91Z2g7IHdlIGNhbiBhZGQgaXQgZGlyZWN0bHkgdG8gZWFjaCAqLwotICAgICAgLyogYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgICAgICAgY3RybDEsIGN0cmwyLCBlbmQ7Ci0gICAgICAgIEZUX0FuZ2xlICAgICAgICAgdGhldGExLCBwaGkxLCB0aGV0YTIsIHBoaTIsIHJvdGF0ZSwgYWxwaGEwID0gMDsKLSAgICAgICAgRlRfRml4ZWQgICAgICAgICBsZW5ndGgxLCBsZW5ndGgyOwotICAgICAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlcjsKLSAgICAgICAgRlRfSW50ICAgICAgICAgICBzaWRlOwotCi0KLSAgICAgICAgdGhldGExICA9IEZUX0FuZ2xlX0RpZmYoIGFuZ2xlX2luLCAgYW5nbGVfbWlkICkgLyAyOwotICAgICAgICB0aGV0YTIgID0gRlRfQW5nbGVfRGlmZiggYW5nbGVfbWlkLCBhbmdsZV9vdXQgKSAvIDI7Ci0gICAgICAgIHBoaTEgICAgPSBmdF9hbmdsZV9tZWFuKCBhbmdsZV9pbiwgIGFuZ2xlX21pZCApOwotICAgICAgICBwaGkyICAgID0gZnRfYW5nbGVfbWVhbiggYW5nbGVfbWlkLCBhbmdsZV9vdXQgKTsKLSAgICAgICAgbGVuZ3RoMSA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCBGVF9Db3MoIHRoZXRhMSApICk7Ci0gICAgICAgIGxlbmd0aDIgPSBGVF9EaXZGaXgoIHN0cm9rZXItPnJhZGl1cywgRlRfQ29zKCB0aGV0YTIgKSApOwotCi0gICAgICAgIC8qIGNvbXB1dGUgZGlyZWN0aW9uIG9mIG9yaWdpbmFsIGFyYyAqLwotICAgICAgICBpZiAoIHN0cm9rZXItPmhhbmRsZV93aWRlX3N0cm9rZXMgKQotICAgICAgICAgIGFscGhhMCA9IEZUX0F0YW4yKCBhcmNbMF0ueCAtIGFyY1szXS54LCBhcmNbMF0ueSAtIGFyY1szXS55ICk7Ci0KLSAgICAgICAgZm9yICggYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVycywgc2lkZSA9IDA7Ci0gICAgICAgICAgICAgIHNpZGUgPD0gMTsKLSAgICAgICAgICAgICAgc2lkZSsrLCBib3JkZXIrKyApCi0gICAgICAgIHsKLSAgICAgICAgICByb3RhdGUgPSBGVF9TSURFX1RPX1JPVEFURSggc2lkZSApOwotCi0gICAgICAgICAgLyogY29tcHV0ZSBjb250cm9sIHBvaW50cyAqLwotICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmY3RybDEsIGxlbmd0aDEsIHBoaTEgKyByb3RhdGUgKTsKLSAgICAgICAgICBjdHJsMS54ICs9IGFyY1syXS54OwotICAgICAgICAgIGN0cmwxLnkgKz0gYXJjWzJdLnk7Ci0KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmN0cmwyLCBsZW5ndGgyLCBwaGkyICsgcm90YXRlICk7Ci0gICAgICAgICAgY3RybDIueCArPSBhcmNbMV0ueDsKLSAgICAgICAgICBjdHJsMi55ICs9IGFyY1sxXS55OwotCi0gICAgICAgICAgLyogY29tcHV0ZSBlbmQgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmVuZCwgc3Ryb2tlci0+cmFkaXVzLCBhbmdsZV9vdXQgKyByb3RhdGUgKTsKLSAgICAgICAgICBlbmQueCArPSBhcmNbMF0ueDsKLSAgICAgICAgICBlbmQueSArPSBhcmNbMF0ueTsKLQotICAgICAgICAgIGlmICggc3Ryb2tlci0+aGFuZGxlX3dpZGVfc3Ryb2tlcyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICBzdGFydDsKLSAgICAgICAgICAgIEZUX0FuZ2xlICAgYWxwaGExOwotCi0KLSAgICAgICAgICAgIC8qIGRldGVybWluZSB3aGV0aGVyIHRoZSBib3JkZXIgcmFkaXVzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgKi8KLSAgICAgICAgICAgIC8qIHJhZGl1cyBvZiBjdXJ2YXR1cmUgb2YgdGhlIG9yaWdpbmFsIGFyYyAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN0YXJ0ID0gYm9yZGVyLT5wb2ludHNbYm9yZGVyLT5udW1fcG9pbnRzIC0gMV07Ci0KLSAgICAgICAgICAgIGFscGhhMSA9IEZUX0F0YW4yKCBlbmQueCAtIHN0YXJ0LngsIGVuZC55IC0gc3RhcnQueSApOwotCi0gICAgICAgICAgICAvKiBpcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBib3JkZXIgYXJjIG9wcG9zaXRlIHRvICovCi0gICAgICAgICAgICAvKiB0aGF0IG9mIHRoZSBvcmlnaW5hbCBhcmM/ICovCi0gICAgICAgICAgICBpZiAoIGZ0X3Bvc19hYnMoIEZUX0FuZ2xlX0RpZmYoIGFscGhhMCwgYWxwaGExICkgKSA+Ci0gICAgICAgICAgICAgICAgICAgRlRfQU5HTEVfUEkgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0FuZ2xlICAgYmV0YSwgZ2FtbWE7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgYnZlYywgZGVsdGE7Ci0gICAgICAgICAgICAgIEZUX0ZpeGVkICAgYmxlbiwgc2luQSwgc2luQiwgYWxlbjsKLQotCi0gICAgICAgICAgICAgIC8qIHVzZSB0aGUgc2luZSBydWxlIHRvIGZpbmQgdGhlIGludGVyc2VjdGlvbiBwb2ludCAqLwotICAgICAgICAgICAgICBiZXRhICA9IEZUX0F0YW4yKCBhcmNbM10ueCAtIHN0YXJ0LngsIGFyY1szXS55IC0gc3RhcnQueSApOwotICAgICAgICAgICAgICBnYW1tYSA9IEZUX0F0YW4yKCBhcmNbMF0ueCAtIGVuZC54LCAgIGFyY1swXS55IC0gZW5kLnkgKTsKLQotICAgICAgICAgICAgICBidmVjLnggPSBlbmQueCAtIHN0YXJ0Lng7Ci0gICAgICAgICAgICAgIGJ2ZWMueSA9IGVuZC55IC0gc3RhcnQueTsKLQotICAgICAgICAgICAgICBibGVuID0gRlRfVmVjdG9yX0xlbmd0aCggJmJ2ZWMgKTsKLQotICAgICAgICAgICAgICBzaW5BID0gZnRfcG9zX2FicyggRlRfU2luKCBhbHBoYTEgLSBnYW1tYSApICk7Ci0gICAgICAgICAgICAgIHNpbkIgPSBmdF9wb3NfYWJzKCBGVF9TaW4oIGJldGEgLSBnYW1tYSApICk7Ci0KLSAgICAgICAgICAgICAgYWxlbiA9IEZUX011bERpdiggYmxlbiwgc2luQSwgc2luQiApOwotCi0gICAgICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIGFsZW4sIGJldGEgKTsKLSAgICAgICAgICAgICAgZGVsdGEueCArPSBzdGFydC54OwotICAgICAgICAgICAgICBkZWx0YS55ICs9IHN0YXJ0Lnk7Ci0KLSAgICAgICAgICAgICAgLyogY2lyY3VtbmF2aWdhdGUgdGhlIG5lZ2F0aXZlIHNlY3RvciBiYWNrd2FyZHMgKi8KLSAgICAgICAgICAgICAgYm9yZGVyLT5tb3ZhYmxlID0gRkFMU0U7Ci0gICAgICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmVuZCwgRkFMU0UgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfY3ViaWN0byggYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0cmwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0cmwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0ICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgLyogYW5kIHRoZW4gbW92ZSB0byB0aGUgZW5kcG9pbnQgKi8KLSAgICAgICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZW5kLCBGQUxTRSApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGVsc2UgZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogc2ltcGx5IGFkZCBhbiBhcmMgKi8KLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfY3ViaWN0byggYm9yZGVyLCAmY3RybDEsICZjdHJsMiwgJmVuZCApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGFyYyAtPSAzOwotCi0gICAgICBzdHJva2VyLT5hbmdsZV9pbiA9IGFuZ2xlX291dDsKLSAgICB9Ci0KLSAgICBzdHJva2VyLT5jZW50ZXIgPSAqdG87Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG9wZW4gKQotICB7Ci0gICAgaWYgKCAhc3Ryb2tlciB8fCAhdG8gKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBXZSBjYW5ub3QgcHJvY2VzcyB0aGUgZmlyc3QgcG9pbnQsIGJlY2F1c2UgdGhlcmUgaXMgbm90IGVub3VnaCAgICAgICovCi0gICAgLyogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGl0cyBjb3JuZXIvY2FwLiAgVGhlIGxhdHRlciB3aWxsIGJlIHByb2Nlc3NlZCAqLwotICAgIC8qIGluIHRoZSBgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoJyByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc3Ryb2tlci0+Zmlyc3RfcG9pbnQgID0gVFJVRTsKLSAgICBzdHJva2VyLT5jZW50ZXIgICAgICAgPSAqdG87Ci0gICAgc3Ryb2tlci0+c3VicGF0aF9vcGVuID0gb3BlbjsKLQotICAgIC8qIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJvcmRlciByYWRpdXMgaXMgZ3JlYXRlciAqLwotICAgIC8qIHRoYW4gdGhlIHJhZGl1cyBvZiBjdXJ2YXR1cmUgb2YgYSBjdXJ2ZSwgdG8gaGFuZGxlIHRoaXMgY2FzZSAgICAgICAqLwotICAgIC8qIHNwZWNpYWxseS4gIFRoaXMgaXMgb25seSByZXF1aXJlZCBpZiBiZXZlbCBqb2lucyBvciBidXR0IGNhcHMgbWF5ICAqLwotICAgIC8qIGJlIGNyZWF0ZWQsIGJlY2F1c2Ugcm91bmQgJiBtaXRlciBqb2lucyBhbmQgcm91bmQgJiBzcXVhcmUgY2FwcyAgICAqLwotICAgIC8qIGNvdmVyIHRoZSBuZWdhdGl2ZSBzZWN0b3IgY3JlYXRlZCB3aXRoIHdpZGUgc3Ryb2tlcy4gICAgICAgICAgICAgICAqLwotICAgIHN0cm9rZXItPmhhbmRsZV93aWRlX3N0cm9rZXMgPQotICAgICAgRlRfQk9PTCggc3Ryb2tlci0+bGluZV9qb2luICE9IEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQgIHx8Ci0gICAgICAgICAgICAgICAoIHN0cm9rZXItPnN1YnBhdGhfb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgIHN0cm9rZXItPmxpbmVfY2FwID09IEZUX1NUUk9LRVJfTElORUNBUF9CVVRUICkgKTsKLQotICAgIC8qIHJlY29yZCB0aGUgc3VicGF0aCBzdGFydCBwb2ludCBmb3IgZWFjaCBib3JkZXIgKi8KLSAgICBzdHJva2VyLT5zdWJwYXRoX3N0YXJ0ID0gKnRvOwotCi0gICAgc3Ryb2tlci0+YW5nbGVfaW4gPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZXJfYWRkX3JldmVyc2VfbGVmdCggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBvcGVuICkKLSAgewotICAgIEZUX1N0cm9rZUJvcmRlciAgcmlnaHQgPSBzdHJva2VyLT5ib3JkZXJzICsgMDsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGxlZnQgID0gc3Ryb2tlci0+Ym9yZGVycyArIDE7Ci0gICAgRlRfSW50ICAgICAgICAgICBuZXdfcG9pbnRzOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIEZUX0FTU0VSVCggbGVmdC0+c3RhcnQgPj0gMCApOwotCi0gICAgbmV3X3BvaW50cyA9IChGVF9JbnQpbGVmdC0+bnVtX3BvaW50cyAtIGxlZnQtPnN0YXJ0OwotICAgIGlmICggbmV3X3BvaW50cyA+IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9ncm93KCByaWdodCwgKEZUX1VJbnQpbmV3X3BvaW50cyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICBkc3RfcG9pbnQgPSByaWdodC0+cG9pbnRzICsgcmlnaHQtPm51bV9wb2ludHM7Ci0gICAgICAgIEZUX0J5dGUqICAgIGRzdF90YWcgICA9IHJpZ2h0LT50YWdzICAgKyByaWdodC0+bnVtX3BvaW50czsKLSAgICAgICAgRlRfVmVjdG9yKiAgc3JjX3BvaW50ID0gbGVmdC0+cG9pbnRzICArIGxlZnQtPm51bV9wb2ludHMgLSAxOwotICAgICAgICBGVF9CeXRlKiAgICBzcmNfdGFnICAgPSBsZWZ0LT50YWdzICAgICsgbGVmdC0+bnVtX3BvaW50cyAtIDE7Ci0KLQotICAgICAgICB3aGlsZSAoIHNyY19wb2ludCA+PSBsZWZ0LT5wb2ludHMgKyBsZWZ0LT5zdGFydCApCi0gICAgICAgIHsKLSAgICAgICAgICAqZHN0X3BvaW50ID0gKnNyY19wb2ludDsKLSAgICAgICAgICAqZHN0X3RhZyAgID0gKnNyY190YWc7Ci0KLSAgICAgICAgICBpZiAoIG9wZW4gKQotICAgICAgICAgICAgZHN0X3RhZ1swXSAmPSB+RlRfU1RST0tFX1RBR19CRUdJTl9FTkQ7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0J5dGUgIHR0YWcgPQotICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSkoIGRzdF90YWdbMF0gJiBGVF9TVFJPS0VfVEFHX0JFR0lOX0VORCApOwotCi0KLSAgICAgICAgICAgIC8qIHN3aXRjaCBiZWdpbi9lbmQgdGFncyBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgICAgIGlmICggdHRhZyA9PSBGVF9TVFJPS0VfVEFHX0JFR0lOIHx8Ci0gICAgICAgICAgICAgICAgIHR0YWcgPT0gRlRfU1RST0tFX1RBR19FTkQgICApCi0gICAgICAgICAgICAgIGRzdF90YWdbMF0gXj0gRlRfU1RST0tFX1RBR19CRUdJTl9FTkQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3JjX3BvaW50LS07Ci0gICAgICAgICAgc3JjX3RhZy0tOwotICAgICAgICAgIGRzdF9wb2ludCsrOwotICAgICAgICAgIGRzdF90YWcrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBsZWZ0LT5udW1fcG9pbnRzICAgPSAoRlRfVUludClsZWZ0LT5zdGFydDsKLSAgICAgIHJpZ2h0LT5udW1fcG9pbnRzICs9IChGVF9VSW50KW5ld19wb2ludHM7Ci0KLSAgICAgIHJpZ2h0LT5tb3ZhYmxlID0gRkFMU0U7Ci0gICAgICBsZWZ0LT5tb3ZhYmxlICA9IEZBTFNFOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgLyogdGhlcmUncyBhIGxvdCBvZiBtYWdpYyBpbiB0aGlzIGZ1bmN0aW9uISAqLwotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfRW5kU3ViUGF0aCggRlRfU3Ryb2tlciAgc3Ryb2tlciApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggIXN0cm9rZXIgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIHN0cm9rZXItPnN1YnBhdGhfb3BlbiApCi0gICAgewotICAgICAgRlRfU3Ryb2tlQm9yZGVyICByaWdodCA9IHN0cm9rZXItPmJvcmRlcnM7Ci0KLQotICAgICAgLyogQWxsIHJpZ2h0LCB0aGlzIGlzIGFuIG9wZW5lZCBwYXRoLCB3ZSBuZWVkIHRvIGFkZCBhIGNhcCBiZXR3ZWVuICovCi0gICAgICAvKiByaWdodCAmIGxlZnQsIGFkZCB0aGUgcmV2ZXJzZSBvZiBsZWZ0LCB0aGVuIGFkZCBhIGZpbmFsIGNhcCAgICAgKi8KLSAgICAgIC8qIGJldHdlZW4gbGVmdCAmIHJpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX2NhcCggc3Ryb2tlciwgc3Ryb2tlci0+YW5nbGVfaW4sIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIGFkZCByZXZlcnNlZCBwb2ludHMgZnJvbSBgbGVmdCcgdG8gYHJpZ2h0JyAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX2FkZF9yZXZlcnNlX2xlZnQoIHN0cm9rZXIsIFRSVUUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIG5vdyBhZGQgdGhlIGZpbmFsIGNhcCAqLwotICAgICAgc3Ryb2tlci0+Y2VudGVyID0gc3Ryb2tlci0+c3VicGF0aF9zdGFydDsKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9jYXAoIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VyLT5zdWJwYXRoX2FuZ2xlICsgRlRfQU5HTEVfUEksIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIE5vdyBlbmQgdGhlIHJpZ2h0IHN1YnBhdGggYWNjb3JkaW5nbHkuICBUaGUgbGVmdCBvbmUgaXMgKi8KLSAgICAgIC8qIHJld2luZCBhbmQgZG9lc24ndCBuZWVkIGZ1cnRoZXIgcHJvY2Vzc2luZy4gICAgICAgICAgICAgKi8KLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfY2xvc2UoIHJpZ2h0LCBGQUxTRSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfQW5nbGUgIHR1cm47Ci0gICAgICBGVF9JbnQgICAgaW5zaWRlX3NpZGU7Ci0KLQotICAgICAgLyogY2xvc2UgdGhlIHBhdGggaWYgbmVlZGVkICovCi0gICAgICBpZiAoIHN0cm9rZXItPmNlbnRlci54ICE9IHN0cm9rZXItPnN1YnBhdGhfc3RhcnQueCB8fAotICAgICAgICAgICBzdHJva2VyLT5jZW50ZXIueSAhPSBzdHJva2VyLT5zdWJwYXRoX3N0YXJ0LnkgKQotICAgICAgewotICAgICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0xpbmVUbyggc3Ryb2tlciwgJnN0cm9rZXItPnN1YnBhdGhfc3RhcnQgKTsKLSAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHByb2Nlc3MgdGhlIGNvcm5lciAqLwotICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gc3Ryb2tlci0+c3VicGF0aF9hbmdsZTsKLSAgICAgIHR1cm4gICAgICAgICAgICAgICA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ICk7Ci0KLSAgICAgIC8qIG5vIHNwZWNpZmljIGNvcm5lciBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkIGlmIHRoZSB0dXJuIGlzIDAgKi8KLSAgICAgIGlmICggdHVybiAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogd2hlbiB3ZSB0dXJuIHRvIHRoZSByaWdodCwgdGhlIGluc2lkZSBzaWRlIGlzIDAgKi8KLSAgICAgICAgLyogb3RoZXJ3aXNlLCB0aGUgaW5zaWRlIHNpZGUgaXMgMSAqLwotICAgICAgICBpbnNpZGVfc2lkZSA9ICggdHVybiA8IDAgKTsKLQotICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfaW5zaWRlKCBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+c3VicGF0aF9saW5lX2xlbmd0aCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogcHJvY2VzcyB0aGUgb3V0c2lkZSBzaWRlICovCi0gICAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9vdXRzaWRlKCBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWluc2lkZV9zaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+c3VicGF0aF9saW5lX2xlbmd0aCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRoZW4gZW5kIG91ciB0d28gc3VicGF0aHMgKi8KLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfY2xvc2UoIHN0cm9rZXItPmJvcmRlcnMgKyAwLCBGQUxTRSApOwotICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9jbG9zZSggc3Ryb2tlci0+Ym9yZGVycyArIDEsIFRSVUUgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMoIEZUX1N0cm9rZXIgICAgICAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICphbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgKmFudW1fY29udG91cnMgKQotICB7Ci0gICAgRlRfVUludCAgIG51bV9wb2ludHMgPSAwLCBudW1fY29udG91cnMgPSAwOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgaWYgKCAhc3Ryb2tlciB8fCBib3JkZXIgPiAxICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2dldF9jb3VudHMoIHN0cm9rZXItPmJvcmRlcnMgKyBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1fcG9pbnRzLCAmbnVtX2NvbnRvdXJzICk7Ci0gIEV4aXQ6Ci0gICAgaWYgKCBhbnVtX3BvaW50cyApCi0gICAgICAqYW51bV9wb2ludHMgPSBudW1fcG9pbnRzOwotCi0gICAgaWYgKCBhbnVtX2NvbnRvdXJzICkKLSAgICAgICphbnVtX2NvbnRvdXJzID0gbnVtX2NvbnRvdXJzOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfR2V0Q291bnRzKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAqYW51bV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICphbnVtX2NvbnRvdXJzICkKLSAgewotICAgIEZUX1VJbnQgICBjb3VudDEsIGNvdW50MiwgbnVtX3BvaW50cyAgID0gMDsKLSAgICBGVF9VSW50ICAgY291bnQzLCBjb3VudDQsIG51bV9jb250b3VycyA9IDA7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBpZiAoICFzdHJva2VyICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2dldF9jb3VudHMoIHN0cm9rZXItPmJvcmRlcnMgKyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQxLCAmY291bnQyICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfZ2V0X2NvdW50cyggc3Ryb2tlci0+Ym9yZGVycyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudDMsICZjb3VudDQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG51bV9wb2ludHMgICA9IGNvdW50MSArIGNvdW50MzsKLSAgICBudW1fY29udG91cnMgPSBjb3VudDIgKyBjb3VudDQ7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGFudW1fcG9pbnRzICkKLSAgICAgICphbnVtX3BvaW50cyAgID0gbnVtX3BvaW50czsKLQotICAgIGlmICggYW51bV9jb250b3VycyApCi0gICAgICAqYW51bV9jb250b3VycyA9IG51bV9jb250b3VyczsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBGVF9TdHJva2VyICAgICAgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlckJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSApCi0gIHsKLSAgICBpZiAoICFzdHJva2VyIHx8ICFvdXRsaW5lICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggYm9yZGVyID09IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgIHx8Ci0gICAgICAgICBib3JkZXIgPT0gRlRfU1RST0tFUl9CT1JERVJfUklHSFQgKQotICAgIHsKLSAgICAgIEZUX1N0cm9rZUJvcmRlciAgc2JvcmRlciA9ICYgc3Ryb2tlci0+Ym9yZGVyc1tib3JkZXJdOwotCi0KLSAgICAgIGlmICggc2JvcmRlci0+dmFsaWQgKQotICAgICAgICBmdF9zdHJva2VfYm9yZGVyX2V4cG9ydCggc2JvcmRlciwgb3V0bGluZSApOwotICAgIH0KLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0KCBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBzdHJva2VyLCBGVF9TVFJPS0VSX0JPUkRFUl9MRUZULCBvdXRsaW5lICk7Ci0gICAgRlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIoIHN0cm9rZXIsIEZUX1NUUk9LRVJfQk9SREVSX1JJR0hULCBvdXRsaW5lICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIGlzIHZlcnkgc2ltaWxhciB0byBGVF9PdXRsaW5lX0RlY29tcG9zZSwgZXhjZXB0Ci0gICAqICB0aGF0IHdlIGRvIHN1cHBvcnQgb3BlbmVkIHBhdGhzLCBhbmQgZG8gbm90IHNjYWxlIHRoZSBvdXRsaW5lLgotICAgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBvcGVuZWQgKQotICB7Ci0gICAgRlRfVmVjdG9yICAgdl9sYXN0OwotICAgIEZUX1ZlY3RvciAgIHZfY29udHJvbDsKLSAgICBGVF9WZWN0b3IgICB2X3N0YXJ0OwotCi0gICAgRlRfVmVjdG9yKiAgcG9pbnQ7Ci0gICAgRlRfVmVjdG9yKiAgbGltaXQ7Ci0gICAgY2hhciogICAgICAgdGFnczsKLQotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0gICAgRlRfSW50ICAgICAgbjsgICAgICAgICAvKiBpbmRleCBvZiBjb250b3VyIGluIG91dGxpbmUgICAgICovCi0gICAgRlRfVUludCAgICAgZmlyc3Q7ICAgICAvKiBpbmRleCBvZiBmaXJzdCBwb2ludCBpbiBjb250b3VyICovCi0gICAgRlRfSW50ICAgICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCi0KLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIGlmICggIXN0cm9rZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBGVF9TdHJva2VyX1Jld2luZCggc3Ryb2tlciApOwotCi0gICAgZmlyc3QgPSAwOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGxhc3Q7ICAvKiBpbmRleCBvZiBsYXN0IHBvaW50IGluIGNvbnRvdXIgKi8KLQotCi0gICAgICBsYXN0ICA9IChGVF9VSW50KW91dGxpbmUtPmNvbnRvdXJzW25dOwotICAgICAgbGltaXQgPSBvdXRsaW5lLT5wb2ludHMgKyBsYXN0OwotCi0gICAgICAvKiBza2lwIGVtcHR5IHBvaW50czsgd2UgZG9uJ3Qgc3Ryb2tlIHRoZXNlICovCi0gICAgICBpZiAoIGxhc3QgPD0gZmlyc3QgKQotICAgICAgewotICAgICAgICBmaXJzdCA9IGxhc3QgKyAxOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgdl9zdGFydCA9IG91dGxpbmUtPnBvaW50c1tmaXJzdF07Ci0gICAgICB2X2xhc3QgID0gb3V0bGluZS0+cG9pbnRzW2xhc3RdOwotCi0gICAgICB2X2NvbnRyb2wgPSB2X3N0YXJ0OwotCi0gICAgICBwb2ludCA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwotICAgICAgdGFncyAgPSBvdXRsaW5lLT50YWdzICAgKyBmaXJzdDsKLSAgICAgIHRhZyAgID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0KLSAgICAgIC8qIEEgY29udG91ciBjYW5ub3Qgc3RhcnQgd2l0aCBhIGN1YmljIGNvbnRyb2wgcG9pbnQhICovCi0gICAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgLyogY2hlY2sgZmlyc3QgcG9pbnQgdG8gZGV0ZXJtaW5lIG9yaWdpbiAqLwotICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICAgIHsKLSAgICAgICAgLyogRmlyc3QgcG9pbnQgaXMgY29uaWMgY29udHJvbC4gIFllcywgdGhpcyBoYXBwZW5zLiAqLwotICAgICAgICBpZiAoIEZUX0NVUlZFX1RBRyggb3V0bGluZS0+dGFnc1tsYXN0XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBzdGFydCBhdCBsYXN0IHBvaW50IGlmIGl0IGlzIG9uIHRoZSBjdXJ2ZSAqLwotICAgICAgICAgIHZfc3RhcnQgPSB2X2xhc3Q7Ci0gICAgICAgICAgbGltaXQtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBpZiBib3RoIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgY29uaWMsICovCi0gICAgICAgICAgLyogc3RhcnQgYXQgdGhlaXIgbWlkZGxlICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7Ci0gICAgICAgICAgdl9zdGFydC55ID0gKCB2X3N0YXJ0LnkgKyB2X2xhc3QueSApIC8gMjsKLSAgICAgICAgfQotICAgICAgICBwb2ludC0tOwotICAgICAgICB0YWdzLS07Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgoIHN0cm9rZXIsICZ2X3N0YXJ0LCBvcGVuZWQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHdoaWxlICggcG9pbnQgPCBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIHBvaW50Kys7Ci0gICAgICAgIHRhZ3MrKzsKLQotICAgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLSAgICAgICAgc3dpdGNoICggdGFnICkKLSAgICAgICAgewotICAgICAgICBjYXNlIEZUX0NVUlZFX1RBR19PTjogIC8qIGVtaXQgYSBzaW5nbGUgbGluZV90byAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgIHZlYy54ID0gcG9pbnQtPng7Ci0gICAgICAgICAgICB2ZWMueSA9IHBvaW50LT55OwotCi0gICAgICAgICAgICBlcnJvciA9IEZUX1N0cm9rZXJfTGluZVRvKCBzdHJva2VyLCAmdmVjICk7Ci0gICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX0NPTklDOiAgLyogY29uc3VtZSBjb25pYyBhcmNzICovCi0gICAgICAgICAgdl9jb250cm9sLnggPSBwb2ludC0+eDsKLSAgICAgICAgICB2X2NvbnRyb2wueSA9IHBvaW50LT55OwotCi0gICAgICAgIERvX0NvbmljOgotICAgICAgICAgIGlmICggcG9pbnQgPCBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZfbWlkZGxlOwotCi0KLSAgICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgICAgICB0YWdzKys7Ci0gICAgICAgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLQotICAgICAgICAgICAgdmVjID0gcG9pbnRbMF07Ci0KLSAgICAgICAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9Db25pY1RvKCBzdHJva2VyLCAmdl9jb250cm9sLCAmdmVjICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggdGFnICE9IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgICAgICB2X21pZGRsZS54ID0gKCB2X2NvbnRyb2wueCArIHZlYy54ICkgLyAyOwotICAgICAgICAgICAgdl9taWRkbGUueSA9ICggdl9jb250cm9sLnkgKyB2ZWMueSApIC8gMjsKLQotICAgICAgICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0NvbmljVG8oIHN0cm9rZXIsICZ2X2NvbnRyb2wsICZ2X21pZGRsZSApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgICAgdl9jb250cm9sID0gdmVjOwotICAgICAgICAgICAgZ290byBEb19Db25pYzsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlcnJvciA9IEZUX1N0cm9rZXJfQ29uaWNUbyggc3Ryb2tlciwgJnZfY29udHJvbCwgJnZfc3RhcnQgKTsKLSAgICAgICAgICBnb3RvIENsb3NlOwotCi0gICAgICAgIGRlZmF1bHQ6ICAvKiBGVF9DVVJWRV9UQUdfQ1VCSUMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzEsIHZlYzI7Ci0KLQotICAgICAgICAgICAgaWYgKCBwb2ludCArIDEgPiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCB0YWdzWzFdICkgIT0gRlRfQ1VSVkVfVEFHX0NVQklDICkKLSAgICAgICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgICAgIHBvaW50ICs9IDI7Ci0gICAgICAgICAgICB0YWdzICArPSAyOwotCi0gICAgICAgICAgICB2ZWMxID0gcG9pbnRbLTJdOwotICAgICAgICAgICAgdmVjMiA9IHBvaW50Wy0xXTsKLQotICAgICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgICAgdmVjID0gcG9pbnRbMF07Ci0KLSAgICAgICAgICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0N1YmljVG8oIHN0cm9rZXIsICZ2ZWMxLCAmdmVjMiwgJnZlYyApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnJvciA9IEZUX1N0cm9rZXJfQ3ViaWNUbyggc3Ryb2tlciwgJnZlYzEsICZ2ZWMyLCAmdl9zdGFydCApOwotICAgICAgICAgICAgZ290byBDbG9zZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIENsb3NlOgotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogZG9uJ3QgdHJ5IHRvIGVuZCB0aGUgcGF0aCBpZiBubyBzZWdtZW50cyBoYXZlIGJlZW4gZ2VuZXJhdGVkICovCi0gICAgICBpZiAoICFzdHJva2VyLT5maXJzdF9wb2ludCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9FbmRTdWJQYXRoKCBzdHJva2VyICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEludmFsaWRfT3V0bGluZToKLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT3V0bGluZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1N0cm9rZSggRlRfR2x5cGggICAgKnBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBGVF9HbHlwaCAgZ2x5cGggPSBOVUxMOwotCi0gICAgLyogZm9yIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUIChpbiBQSUMgbW9kZSkgKi8KLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gc3Ryb2tlci0+bGlicmFyeTsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0KLSAgICBpZiAoICFwZ2x5cGggKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ2x5cGggPSAqcGdseXBoOwotICAgIGlmICggIWdseXBoIHx8IGdseXBoLT5jbGF6eiAhPSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB7Ci0gICAgICBGVF9HbHlwaCAgY29weTsKLQotCi0gICAgICBlcnJvciA9IEZUX0dseXBoX0NvcHkoIGdseXBoLCAmY29weSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZ2x5cGggPSBjb3B5OwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX091dGxpbmVHbHlwaCAgb2dseXBoICA9IChGVF9PdXRsaW5lR2x5cGgpZ2x5cGg7Ci0gICAgICBGVF9PdXRsaW5lKiAgICAgIG91dGxpbmUgPSAmb2dseXBoLT5vdXRsaW5lOwotICAgICAgRlRfVUludCAgICAgICAgICBudW1fcG9pbnRzLCBudW1fY29udG91cnM7Ci0KLQotICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggc3Ryb2tlciwgb3V0bGluZSwgRkFMU0UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIEZUX1N0cm9rZXJfR2V0Q291bnRzKCBzdHJva2VyLCAmbnVtX3BvaW50cywgJm51bV9jb250b3VycyApOwotCi0gICAgICBGVF9PdXRsaW5lX0RvbmUoIGdseXBoLT5saWJyYXJ5LCBvdXRsaW5lICk7Ci0KLSAgICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGdseXBoLT5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpbnVtX2NvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgb3V0bGluZS0+bl9wb2ludHMgICA9IDA7Ci0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzID0gMDsKLQotICAgICAgRlRfU3Ryb2tlcl9FeHBvcnQoIHN0cm9rZXIsIG91dGxpbmUgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggKnBnbHlwaCApOwotCi0gICAgKnBnbHlwaCA9IGdseXBoOwotICAgIGdvdG8gRXhpdDsKLQotICBGYWlsOgotICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7Ci0gICAgZ2x5cGggPSBOVUxMOwotCi0gICAgaWYgKCAhZGVzdHJveSApCi0gICAgICAqcGdseXBoID0gTlVMTDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9TdHJva2VCb3JkZXIoIEZUX0dseXBoICAgICpwZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGluc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBGVF9HbHlwaCAgZ2x5cGggPSBOVUxMOwotCi0gICAgLyogZm9yIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUIChpbiBQSUMgbW9kZSkgKi8KLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gc3Ryb2tlci0+bGlicmFyeTsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0KLSAgICBpZiAoICFwZ2x5cGggKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ2x5cGggPSAqcGdseXBoOwotICAgIGlmICggIWdseXBoIHx8IGdseXBoLT5jbGF6eiAhPSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB7Ci0gICAgICBGVF9HbHlwaCAgY29weTsKLQotCi0gICAgICBlcnJvciA9IEZUX0dseXBoX0NvcHkoIGdseXBoLCAmY29weSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZ2x5cGggPSBjb3B5OwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX091dGxpbmVHbHlwaCAgIG9nbHlwaCAgPSAoRlRfT3V0bGluZUdseXBoKWdseXBoOwotICAgICAgRlRfU3Ryb2tlckJvcmRlciAgYm9yZGVyOwotICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSA9ICZvZ2x5cGgtPm91dGxpbmU7Ci0gICAgICBGVF9VSW50ICAgICAgICAgICBudW1fcG9pbnRzLCBudW1fY29udG91cnM7Ci0KLQotICAgICAgYm9yZGVyID0gRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyKCBvdXRsaW5lICk7Ci0gICAgICBpZiAoIGluc2lkZSApCi0gICAgICB7Ci0gICAgICAgIGlmICggYm9yZGVyID09IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgKQotICAgICAgICAgIGJvcmRlciA9IEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYm9yZGVyID0gRlRfU1RST0tFUl9CT1JERVJfTEVGVDsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggc3Ryb2tlciwgb3V0bGluZSwgRkFMU0UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzKCBzdHJva2VyLCBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bV9wb2ludHMsICZudW1fY29udG91cnMgKTsKLQotICAgICAgRlRfT3V0bGluZV9Eb25lKCBnbHlwaC0+bGlicmFyeSwgb3V0bGluZSApOwotCi0gICAgICBlcnJvciA9IEZUX091dGxpbmVfTmV3KCBnbHlwaC0+bGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KW51bV9jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIG91dGxpbmUtPm5fcG9pbnRzICAgPSAwOwotICAgICAgb3V0bGluZS0+bl9jb250b3VycyA9IDA7Ci0KLSAgICAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBzdHJva2VyLCBib3JkZXIsIG91dGxpbmUgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggKnBnbHlwaCApOwotCi0gICAgKnBnbHlwaCA9IGdseXBoOwotICAgIGdvdG8gRXhpdDsKLQotICBGYWlsOgotICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7Ci0gICAgZ2x5cGggPSBOVUxMOwotCi0gICAgaWYgKCAhZGVzdHJveSApCi0gICAgICAqcGdseXBoID0gTlVMTDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRzeW50aC5jIGIvc3JjL2Jhc2UvZnRzeW50aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmRhZTYwLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0c3ludGguYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN5bnRoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc3ludGhlc2l6aW5nIGNvZGUgZm9yIGVtYm9sZGVuaW5nIGFuZCBzbGFudGluZyAoYm9keSkuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfU1lOVEhFU0lTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc3ludGgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgRVhQRVJJTUVOVEFMIE9CTElRVUlORyBTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzeW50aC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0dseXBoU2xvdF9PYmxpcXVlKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfTWF0cml4ICAgIHRyYW5zZm9ybTsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZTsKLQotCi0gICAgaWYgKCAhc2xvdCApCi0gICAgICByZXR1cm47Ci0KLSAgICBvdXRsaW5lID0gJnNsb3QtPm91dGxpbmU7Ci0KLSAgICAvKiBvbmx5IG9ibGlxdWUgb3V0bGluZSBnbHlwaHMgKi8KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiB3ZSBkb24ndCB0b3VjaCB0aGUgYWR2YW5jZSB3aWR0aCAqLwotCi0gICAgLyogRm9yIGl0YWxpYywgc2ltcGx5IGFwcGx5IGEgc2hlYXIgdHJhbnNmb3JtLCB3aXRoIGFuIGFuZ2xlICovCi0gICAgLyogb2YgYWJvdXQgMTIgZGVncmVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB0cmFuc2Zvcm0ueHggPSAweDEwMDAwTDsKLSAgICB0cmFuc2Zvcm0ueXggPSAweDAwMDAwTDsKLQotICAgIHRyYW5zZm9ybS54eSA9IDB4MDM2NkFMOwotICAgIHRyYW5zZm9ybS55eSA9IDB4MTAwMDBMOwotCi0gICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oIG91dGxpbmUsICZ0cmFuc2Zvcm0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICBFWFBFUklNRU5UQUwgRU1CT0xERU5JTkcgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3ludGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9HbHlwaFNsb3RfRW1ib2xkZW4oIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICAgIEZUX0ZhY2UgICAgIGZhY2U7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfUG9zICAgICAgeHN0ciwgeXN0cjsKLQotCi0gICAgaWYgKCAhc2xvdCApCi0gICAgICByZXR1cm47Ci0KLSAgICBsaWJyYXJ5ID0gc2xvdC0+bGlicmFyeTsKLSAgICBmYWNlICAgID0gc2xvdC0+ZmFjZTsKLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICYmCi0gICAgICAgICBzbG90LT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCAgKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogc29tZSByZWFzb25hYmxlIHN0cmVuZ3RoICovCi0gICAgeHN0ciA9IEZUX011bEZpeCggZmFjZS0+dW5pdHNfcGVyX0VNLAotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnNpemUtPm1ldHJpY3MueV9zY2FsZSApIC8gMjQ7Ci0gICAgeXN0ciA9IHhzdHI7Ci0KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICBGVF9PdXRsaW5lX0VtYm9sZGVuWFkoICZzbG90LT5vdXRsaW5lLCB4c3RyLCB5c3RyICk7Ci0KLSAgICBlbHNlIC8qIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICovCi0gICAgewotICAgICAgLyogcm91bmQgdG8gZnVsbCBwaXhlbHMgKi8KLSAgICAgIHhzdHIgJj0gfjYzOwotICAgICAgaWYgKCB4c3RyID09IDAgKQotICAgICAgICB4c3RyID0gMSA8PCA2OwotICAgICAgeXN0ciAmPSB+NjM7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBYWFg6IG92ZXJmbG93IGNoZWNrIGZvciAxNi1iaXQgc3lzdGVtLCBmb3IgY29tcGF0aWJpbGl0eQotICAgICAgICogICAgICB3aXRoIEZUX0dseXBoU2xvdF9FbWJvbGRlbigpIHNpbmNlIGZyZWV0eXBlLTIuMS4xMC4KLSAgICAgICAqICAgICAgdW5mb3J0dW5hdGVseSwgdGhpcyBmdW5jdGlvbiByZXR1cm4gbm8gaW5mb3JtYXRpb25zCi0gICAgICAgKiAgICAgIGFib3V0IHRoZSBjYXVzZSBvZiBlcnJvci4KLSAgICAgICAqLwotICAgICAgaWYgKCAoIHlzdHIgPj4gNiApID4gRlRfSU5UX01BWCB8fCAoIHlzdHIgPj4gNiApIDwgRlRfSU5UX01JTiApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMSgoICJGVF9HbHlwaFNsb3RfRW1ib2xkZW46IiApKTsKLSAgICAgICAgRlRfVFJBQ0UxKCggInRvbyBzdHJvbmcgZW1ib2xkZW5pbmcgcGFyYW1ldGVyIHlzdHI9JWRcbiIsIHlzdHIgKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVycm9yID0gRlRfR2x5cGhTbG90X093bl9CaXRtYXAoIHNsb3QgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIGVycm9yID0gRlRfQml0bWFwX0VtYm9sZGVuKCBsaWJyYXJ5LCAmc2xvdC0+Yml0bWFwLCB4c3RyLCB5c3RyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggc2xvdC0+YWR2YW5jZS54ICkKLSAgICAgIHNsb3QtPmFkdmFuY2UueCArPSB4c3RyOwotCi0gICAgaWYgKCBzbG90LT5hZHZhbmNlLnkgKQotICAgICAgc2xvdC0+YWR2YW5jZS55ICs9IHlzdHI7Ci0KLSAgICBzbG90LT5tZXRyaWNzLndpZHRoICAgICAgICArPSB4c3RyOwotICAgIHNsb3QtPm1ldHJpY3MuaGVpZ2h0ICAgICAgICs9IHlzdHI7Ci0gICAgc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZSAgKz0geHN0cjsKLSAgICBzbG90LT5tZXRyaWNzLnZlcnRBZHZhbmNlICArPSB5c3RyOwotICAgIHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdZICs9IHlzdHI7Ci0KLSAgICAvKiBYWFg6IDE2LWJpdCBvdmVyZmxvdyBjYXNlIG11c3QgYmUgZXhjbHVkZWQgYmVmb3JlIGhlcmUgKi8KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICkKLSAgICAgIHNsb3QtPmJpdG1hcF90b3AgKz0gKEZUX0ludCkoIHlzdHIgPj4gNiApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHN5c3RlbS5jIGIvc3JjL2Jhc2UvZnRzeXN0ZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0Zjk0OS4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdHN5c3RlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3lzdGVtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBTlNJLXNwZWNpZmljIEZyZWVUeXBlIGxvdy1sZXZlbCBzeXN0ZW0gaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmF1bHQgaW50ZXJmYWNlIHVzZWQgYnkgRnJlZVR5cGUgdG8gYWNjZXNzICAgKi8KLSAgLyogbG93LWxldmVsLCBpLmUuIG1lbW9yeSBtYW5hZ2VtZW50LCBpL28gYWNjZXNzIGFzIHdlbGwgYXMgdGhyZWFkICAgICAgICovCi0gIC8qIHN5bmNocm9uaXNhdGlvbi4gIEl0IGNhbiBiZSByZXBsYWNlZCBieSB1c2VyLXNwZWNpZmljIHJvdXRpbmVzIGlmICAgICAqLwotICAvKiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBNRU1PUlkgTUFOQUdFTUVOVCBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRvIGFueSBlcnJvciBjaGVja2luZyBmb3IgdGhlICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYWxsb2NhdGlvbi1yZWxhdGVkIGZ1bmN0aW9ucy4gIFRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBoaWdoZXIgbGV2ZWwgICovCi0gIC8qIHJvdXRpbmVzIGxpa2UgZnRfbWVtX2FsbG9jKCkgb3IgZnRfbWVtX3JlYWxsb2MoKS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICA6OiBUaGUgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBhZGRyZXNzIG9mIG5ld2x5IGFsbG9jYXRlZCBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkKiApCi0gIGZ0X2FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgIGxvbmcgICAgICAgc2l6ZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwotCi0gICAgcmV0dXJuIGZ0X3NtYWxsb2MoIChzaXplX3Qpc2l6ZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVtb3J5IHJlYWxsb2NhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cl9zaXplIDo6IFRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2suICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmV3X3NpemUgOjogVGhlIG5ld2x5IHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibG9jayAgICA6OiBUaGUgY3VycmVudCBhZGRyZXNzIG9mIHRoZSBibG9jayBpbiBtZW1vcnkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWRkcmVzcyBvZiB0aGUgcmVhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCogKQotICBmdF9yZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgbG9uZyAgICAgICBjdXJfc2l6ZSwKLSAgICAgICAgICAgICAgbG9uZyAgICAgICBuZXdfc2l6ZSwKLSAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwotICAgIEZUX1VOVVNFRCggY3VyX3NpemUgKTsKLQotICAgIHJldHVybiBmdF9zcmVhbGxvYyggYmxvY2ssIChzaXplX3QpbmV3X3NpemUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1lbW9yeSByZWxlYXNlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibG9jayAgIDo6IFRoZSBhZGRyZXNzIG9mIGJsb2NrIGluIG1lbW9yeSB0byBiZSBmcmVlZC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X2ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICkKLSAgewotICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0KLSAgICBmdF9zZnJlZSggYmxvY2sgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fRElTQUJMRV9TVFJFQU1fU1VQUE9SVAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCi0KLSAgLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRklMRSBmb3IgY29udmVuaWVuY2UgdG8gZXh0cmFjdCB0aGUgICAgICAgKi8KLSAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8KLSNkZWZpbmUgU1RSRUFNX0ZJTEUoIHN0cmVhbSApICAoIChGVF9GSUxFKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9hbnNpX3N0cmVhbV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X2Fuc2lfc3RyZWFtX2Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBmdF9mY2xvc2UoIFNUUkVBTV9GSUxFKCBzdHJlYW0gKSApOwotCi0gICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwotICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IE5VTEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2Fuc2lfc3RyZWFtX2lvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0IDo6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBzdHJlYW0gdG8gc3RhcnQgcmVhZGluZy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gIElmIGBjb3VudCcgaXMgemVybyAodGhpcyBpcywgICAqLwotICAvKiAgICB0aGUgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc2Vla2luZyksIGEgbm9uLXplcm8gcmV0dXJuIHZhbHVlICAgICAgICAgKi8KLSAgLyogICAgaW5kaWNhdGVzIGFuIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHVuc2lnbmVkIGxvbmcgKQotICBmdF9hbnNpX3N0cmVhbV9pbyggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIGNvdW50ICkKLSAgewotICAgIEZUX0ZJTEUqICBmaWxlOwotCi0KLSAgICBpZiAoICFjb3VudCAmJiBvZmZzZXQgPiBzdHJlYW0tPnNpemUgKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBmaWxlID0gU1RSRUFNX0ZJTEUoIHN0cmVhbSApOwotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyAhPSBvZmZzZXQgKQotICAgICAgZnRfZnNlZWsoIGZpbGUsIChsb25nKW9mZnNldCwgU0VFS19TRVQgKTsKLQotICAgIHJldHVybiAodW5zaWduZWQgbG9uZylmdF9mcmVhZCggYnVmZmVyLCAxLCBjb3VudCwgZmlsZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3RyZWFtLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3BlbiggRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKQotICB7Ci0gICAgRlRfRklMRSogIGZpbGU7Ci0KLQotICAgIGlmICggIXN0cmVhbSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX0hhbmRsZSApOwotCi0gICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwotICAgIHN0cmVhbS0+cGF0aG5hbWUucG9pbnRlciAgID0gKGNoYXIqKWZpbGVwYXRobmFtZTsKLSAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICAgc3RyZWFtLT5wb3MgICAgICAgICAgICAgICAgPSAwOwotICAgIHN0cmVhbS0+cmVhZCAgICAgICAgICAgICAgID0gTlVMTDsKLSAgICBzdHJlYW0tPmNsb3NlICAgICAgICAgICAgICA9IE5VTEw7Ci0KLSAgICBmaWxlID0gZnRfZm9wZW4oIGZpbGVwYXRobmFtZSwgInJiIiApOwotICAgIGlmICggIWZpbGUgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIKLSAgICAgICAgICAgICAgICAgIiBjb3VsZCBub3Qgb3BlbiBgJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7Ci0KLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLSAgICB9Ci0KLSAgICBmdF9mc2VlayggZmlsZSwgMCwgU0VFS19FTkQgKTsKLSAgICBzdHJlYW0tPnNpemUgPSAodW5zaWduZWQgbG9uZylmdF9mdGVsbCggZmlsZSApOwotICAgIGlmICggIXN0cmVhbS0+c2l6ZSApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKLSAgICAgIEZUX0VSUk9SKCggIiBvcGVuZWQgYCVzJyBidXQgemVyby1zaXplZFxuIiwgZmlsZXBhdGhuYW1lICkpOwotICAgICAgZnRfZmNsb3NlKCBmaWxlICk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1N0cmVhbSApOwotICAgIH0KLSAgICBmdF9mc2VlayggZmlsZSwgMCwgU0VFS19TRVQgKTsKLQotICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gZmlsZTsKLSAgICBzdHJlYW0tPnJlYWQgID0gZnRfYW5zaV9zdHJlYW1faW87Ci0gICAgc3RyZWFtLT5jbG9zZSA9IGZ0X2Fuc2lfc3RyZWFtX2Nsb3NlOwotCi0gICAgRlRfVFJBQ0UxKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgRlRfVFJBQ0UxKCggIiBvcGVuZWQgYCVzJyAoJWQgYnl0ZXMpIHN1Y2Nlc3NmdWxseVxuIiwKLSAgICAgICAgICAgICAgICBmaWxlcGF0aG5hbWUsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX0RJU0FCTEVfU1RSRUFNX1NVUFBPUlQgKi8KLQotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotCi0gIGV4dGVybiBGVF9JbnQKLSAgZnRfbWVtX2RlYnVnX2luaXQoIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgZXh0ZXJuIHZvaWQKLSAgZnRfbWVtX2RlYnVnX2RvbmUoIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSNlbmRpZgotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9NZW1vcnkgKQotICBGVF9OZXdfTWVtb3J5KCB2b2lkICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBtZW1vcnkgPSAoRlRfTWVtb3J5KWZ0X3NtYWxsb2MoIHNpemVvZiAoICptZW1vcnkgKSApOwotICAgIGlmICggbWVtb3J5ICkKLSAgICB7Ci0gICAgICBtZW1vcnktPnVzZXIgICAgPSBOVUxMOwotICAgICAgbWVtb3J5LT5hbGxvYyAgID0gZnRfYWxsb2M7Ci0gICAgICBtZW1vcnktPnJlYWxsb2MgPSBmdF9yZWFsbG9jOwotICAgICAgbWVtb3J5LT5mcmVlICAgID0gZnRfZnJlZTsKLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLSAgICAgIGZ0X21lbV9kZWJ1Z19pbml0KCBtZW1vcnkgKTsKLSNlbmRpZgotICAgIH0KLQotICAgIHJldHVybiBtZW1vcnk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0RvbmVfTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLSAgICBmdF9tZW1fZGVidWdfZG9uZSggbWVtb3J5ICk7Ci0jZW5kaWYKLSAgICBmdF9zZnJlZSggbWVtb3J5ICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0dHJpZ29uLmMgYi9zcmMvYmFzZS9mdHRyaWdvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTRkMTdjLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0dHJpZ29uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR0cmlnb24uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgYSBmaXhlZC1wb2ludCBDT1JESUMgaW1wbGVtZW50YXRpb24gb2YgdHJpZ29ub21ldHJpYyAgICAgICAgICAqLwotICAvKiBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0cmFuc2Zvcm1hdGlvbnMgYmV0d2VlbiBDYXJ0ZXNpYW4gYW5kIHBvbGFyICAgICAgKi8KLSAgLyogY29vcmRpbmF0ZXMuICBUaGUgYW5nbGVzIGFyZSByZXByZXNlbnRlZCBhcyAxNi4xNiBmaXhlZC1wb2ludCB2YWx1ZXMgICovCi0gIC8qIGluIGRlZ3JlZXMsIGkuZS4sIHRoZSBhbmd1bGFyIHJlc29sdXRpb24gaXMgMl4tMTYgZGVncmVlcy4gIE5vdGUgdGhhdCAqLwotICAvKiBvbmx5IHZlY3RvcnMgbG9uZ2VyIHRoYW4gMl4xNioxODAvcGkgKG9yIGF0IGxlYXN0IDIyIGJpdHMpIG9uIGEgICAgICAgKi8KLSAgLyogZGlzY3JldGUgQ2FydGVzaWFuIGdyaWQgY2FuIGhhdmUgdGhlIHNhbWUgb3IgYmV0dGVyIGFuZ3VsYXIgICAgICAgICAgICovCi0gIC8qIHJlc29sdXRpb24uICBUaGVyZWZvcmUsIHRvIG1haW50YWluIHRoaXMgcHJlY2lzaW9uLCBzb21lIGZ1bmN0aW9ucyAgICAqLwotICAvKiByZXF1aXJlIGFuIGludGVyaW0gdXBzY2FsaW5nIG9mIHRoZSB2ZWN0b3JzLCB3aGVyZWFzIG90aGVycyBvcGVyYXRlICAgKi8KLSAgLyogd2l0aCAyNC1iaXQgbG9uZyB2ZWN0b3JzIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKLQotCi0gIC8qIHRoZSBDb3JkaWMgc2hyaW5rIGZhY3RvciAwLjg1ODc4NTMzNjQ4MDQzNiAqIDJeMzIgKi8KLSNkZWZpbmUgRlRfVFJJR19TQ0FMRSAgICAgIDB4REJEOTVCMTZVTAotCi0gIC8qIHRoZSBoaWdoZXN0IGJpdCBpbiBvdmVyZmxvdy1zYWZlIHZlY3RvciBjb21wb25lbnRzLCAqLwotICAvKiBNU0Igb2YgMC44NTg3ODUzMzY0ODA0MzYgKiBzcXJ0KDAuNSkgKiAyXjMwICAgICAgICAgKi8KLSNkZWZpbmUgRlRfVFJJR19TQUZFX01TQiAgIDI5Ci0KLSAgLyogdGhpcyB0YWJsZSB3YXMgZ2VuZXJhdGVkIGZvciBGVF9QSSA9IDE4MEwgPDwgMTYsIGkuZS4gZGVncmVlcyAqLwotI2RlZmluZSBGVF9UUklHX01BWF9JVEVSUyAgMjMKLQotICBzdGF0aWMgY29uc3QgRlRfQW5nbGUKLSAgZnRfdHJpZ19hcmN0YW5fdGFibGVbXSA9Ci0gIHsKLSAgICAxNzQwOTY3TCwgOTE5ODc5TCwgNDY2OTQ1TCwgMjM0Mzc5TCwgMTE3MzA0TCwgNTg2NjZMLCAyOTMzNUwsCi0gICAgMTQ2NjhMLCA3MzM0TCwgMzY2N0wsIDE4MzNMLCA5MTdMLCA0NThMLCAyMjlMLCAxMTVMLAotICAgIDU3TCwgMjlMLCAxNEwsIDdMLCA0TCwgMkwsIDFMCi0gIH07Ci0KLQotI2lmZGVmIEZUX0xPTkc2NAotCi0gIC8qIG11bHRpcGx5IGEgZ2l2ZW4gdmFsdWUgYnkgdGhlIENPUkRJQyBzaHJpbmsgZmFjdG9yICovCi0gIHN0YXRpYyBGVF9GaXhlZAotICBmdF90cmlnX2Rvd25zY2FsZSggRlRfRml4ZWQgIHZhbCApCi0gIHsKLSAgICBGVF9JbnQgIHMgPSAxOwotCi0KLSAgICBpZiAoIHZhbCA8IDAgKQotICAgIHsKLSAgICAgICB2YWwgPSAtdmFsOwotICAgICAgIHMgPSAtMTsKLSAgICB9Ci0KLSAgICAvKiAweDQwMDAwMDAwIGNvbWVzIGZyb20gcmVncmVzc2lvbiBhbmFseXNpcyBiZXR3ZWVuIHRydWUgKi8KLSAgICAvKiBhbmQgQ09SRElDIGh5cG90ZW51c2UsIHNvIGl0IG1pbmltaXplcyB0aGUgZXJyb3IgICAgICAgKi8KLSAgICB2YWwgPSAoRlRfRml4ZWQpKAotICAgICAgICAgICAgKCAoRlRfVUludDY0KXZhbCAqIEZUX1RSSUdfU0NBTEUgKyAweDQwMDAwMDAwVUwgKSA+PiAzMiApOwotCi0gICAgcmV0dXJuIHMgPCAwID8gLXZhbCA6IHZhbDsKLSAgfQotCi0jZWxzZSAvKiAhRlRfTE9ORzY0ICovCi0KLSAgLyogbXVsdGlwbHkgYSBnaXZlbiB2YWx1ZSBieSB0aGUgQ09SRElDIHNocmluayBmYWN0b3IgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGZ0X3RyaWdfZG93bnNjYWxlKCBGVF9GaXhlZCAgdmFsICkKLSAgewotICAgIEZUX0ludCAgICAgcyA9IDE7Ci0gICAgRlRfVUludDMyICBsbzEsIGhpMSwgbG8yLCBoaTIsIGxvLCBoaSwgaTEsIGkyOwotCi0KLSAgICBpZiAoIHZhbCA8IDAgKQotICAgIHsKLSAgICAgICB2YWwgPSAtdmFsOwotICAgICAgIHMgPSAtMTsKLSAgICB9Ci0KLSAgICBsbzEgPSAoRlRfVUludDMyKXZhbCAmIDB4MDAwMEZGRkZVOwotICAgIGhpMSA9IChGVF9VSW50MzIpdmFsID4+IDE2OwotICAgIGxvMiA9IEZUX1RSSUdfU0NBTEUgJiAweDAwMDBGRkZGVTsKLSAgICBoaTIgPSBGVF9UUklHX1NDQUxFID4+IDE2OwotCi0gICAgbG8gPSBsbzEgKiBsbzI7Ci0gICAgaTEgPSBsbzEgKiBoaTI7Ci0gICAgaTIgPSBsbzIgKiBoaTE7Ci0gICAgaGkgPSBoaTEgKiBoaTI7Ci0KLSAgICAvKiBDaGVjayBjYXJyeSBvdmVyZmxvdyBvZiBpMSArIGkyICovCi0gICAgaTEgKz0gaTI7Ci0gICAgaGkgKz0gKEZUX1VJbnQzMikoIGkxIDwgaTIgKSA8PCAxNjsKLQotICAgIGhpICs9IGkxID4+IDE2OwotICAgIGkxICA9IGkxIDw8IDE2OwotCi0gICAgLyogQ2hlY2sgY2Fycnkgb3ZlcmZsb3cgb2YgaTEgKyBsbyAqLwotICAgIGxvICs9IGkxOwotICAgIGhpICs9ICggbG8gPCBpMSApOwotCi0gICAgLyogMHg0MDAwMDAwMCBjb21lcyBmcm9tIHJlZ3Jlc3Npb24gYW5hbHlzaXMgYmV0d2VlbiB0cnVlICovCi0gICAgLyogYW5kIENPUkRJQyBoeXBvdGVudXNlLCBzbyBpdCBtaW5pbWl6ZXMgdGhlIGVycm9yICAgICAgICovCi0KLSAgICAvKiBDaGVjayBjYXJyeSBvdmVyZmxvdyBvZiBsbyArIDB4NDAwMDAwMDAgKi8KLSAgICBsbyArPSAweDQwMDAwMDAwVUw7Ci0gICAgaGkgKz0gKCBsbyA8IDB4NDAwMDAwMDBVTCApOwotCi0gICAgdmFsID0gKEZUX0ZpeGVkKWhpOwotCi0gICAgcmV0dXJuIHMgPCAwID8gLXZhbCA6IHZhbDsKLSAgfQotCi0jZW5kaWYgLyogIUZUX0xPTkc2NCAqLwotCi0KLSAgLyogdW5kZWZpbmVkIGFuZCBuZXZlciBjYWxsZWQgZm9yIHplcm8gdmVjdG9yICovCi0gIHN0YXRpYyBGVF9JbnQKLSAgZnRfdHJpZ19wcmVub3JtKCBGVF9WZWN0b3IqICB2ZWMgKQotICB7Ci0gICAgRlRfUG9zICB4LCB5OwotICAgIEZUX0ludCAgc2hpZnQ7Ci0KLQotICAgIHggPSB2ZWMtPng7Ci0gICAgeSA9IHZlYy0+eTsKLQotICAgIHNoaWZ0ID0gRlRfTVNCKCAoRlRfVUludDMyKSggRlRfQUJTKCB4ICkgfCBGVF9BQlMoIHkgKSApICk7Ci0KLSAgICBpZiAoIHNoaWZ0IDw9IEZUX1RSSUdfU0FGRV9NU0IgKQotICAgIHsKLSAgICAgIHNoaWZ0ICA9IEZUX1RSSUdfU0FGRV9NU0IgLSBzaGlmdDsKLSAgICAgIHZlYy0+eCA9IChGVF9Qb3MpKCAoRlRfVUxvbmcpeCA8PCBzaGlmdCApOwotICAgICAgdmVjLT55ID0gKEZUX1BvcykoIChGVF9VTG9uZyl5IDw8IHNoaWZ0ICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaGlmdCAtPSBGVF9UUklHX1NBRkVfTVNCOwotICAgICAgdmVjLT54ID0geCA+PiBzaGlmdDsKLSAgICAgIHZlYy0+eSA9IHkgPj4gc2hpZnQ7Ci0gICAgICBzaGlmdCAgPSAtc2hpZnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNoaWZ0OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF90cmlnX3BzZXVkb19yb3RhdGUoIEZUX1ZlY3RvciogIHZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICB0aGV0YSApCi0gIHsKLSAgICBGVF9JbnQgICAgICAgICAgIGk7Ci0gICAgRlRfRml4ZWQgICAgICAgICB4LCB5LCB4dGVtcCwgYjsKLSAgICBjb25zdCBGVF9BbmdsZSAgKmFyY3RhbnB0cjsKLQotCi0gICAgeCA9IHZlYy0+eDsKLSAgICB5ID0gdmVjLT55OwotCi0gICAgLyogUm90YXRlIGluc2lkZSBbLVBJLzQsUEkvNF0gc2VjdG9yICovCi0gICAgd2hpbGUgKCB0aGV0YSA8IC1GVF9BTkdMRV9QSTQgKQotICAgIHsKLSAgICAgIHh0ZW1wICA9ICB5OwotICAgICAgeSAgICAgID0gLXg7Ci0gICAgICB4ICAgICAgPSAgeHRlbXA7Ci0gICAgICB0aGV0YSArPSAgRlRfQU5HTEVfUEkyOwotICAgIH0KLQotICAgIHdoaWxlICggdGhldGEgPiBGVF9BTkdMRV9QSTQgKQotICAgIHsKLSAgICAgIHh0ZW1wICA9IC15OwotICAgICAgeSAgICAgID0gIHg7Ci0gICAgICB4ICAgICAgPSAgeHRlbXA7Ci0gICAgICB0aGV0YSAtPSAgRlRfQU5HTEVfUEkyOwotICAgIH0KLQotICAgIGFyY3RhbnB0ciA9IGZ0X3RyaWdfYXJjdGFuX3RhYmxlOwotCi0gICAgLyogUHNldWRvcm90YXRpb25zLCB3aXRoIHJpZ2h0IHNoaWZ0cyAqLwotICAgIGZvciAoIGkgPSAxLCBiID0gMTsgaSA8IEZUX1RSSUdfTUFYX0lURVJTOyBiIDw8PSAxLCBpKysgKQotICAgIHsKLSAgICAgIGlmICggdGhldGEgPCAwICkKLSAgICAgIHsKLSAgICAgICAgeHRlbXAgID0geCArICggKCB5ICsgYiApID4+IGkgKTsKLSAgICAgICAgeSAgICAgID0geSAtICggKCB4ICsgYiApID4+IGkgKTsKLSAgICAgICAgeCAgICAgID0geHRlbXA7Ci0gICAgICAgIHRoZXRhICs9ICphcmN0YW5wdHIrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeHRlbXAgID0geCAtICggKCB5ICsgYiApID4+IGkgKTsKLSAgICAgICAgeSAgICAgID0geSArICggKCB4ICsgYiApID4+IGkgKTsKLSAgICAgICAgeCAgICAgID0geHRlbXA7Ci0gICAgICAgIHRoZXRhIC09ICphcmN0YW5wdHIrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2ZWMtPnggPSB4OwotICAgIHZlYy0+eSA9IHk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3RyaWdfcHNldWRvX3BvbGFyaXplKCBGVF9WZWN0b3IqICB2ZWMgKQotICB7Ci0gICAgRlRfQW5nbGUgICAgICAgICB0aGV0YTsKLSAgICBGVF9JbnQgICAgICAgICAgIGk7Ci0gICAgRlRfRml4ZWQgICAgICAgICB4LCB5LCB4dGVtcCwgYjsKLSAgICBjb25zdCBGVF9BbmdsZSAgKmFyY3RhbnB0cjsKLQotCi0gICAgeCA9IHZlYy0+eDsKLSAgICB5ID0gdmVjLT55OwotCi0gICAgLyogR2V0IHRoZSB2ZWN0b3IgaW50byBbLVBJLzQsUEkvNF0gc2VjdG9yICovCi0gICAgaWYgKCB5ID4geCApCi0gICAgewotICAgICAgaWYgKCB5ID4gLXggKQotICAgICAgewotICAgICAgICB0aGV0YSA9ICBGVF9BTkdMRV9QSTI7Ci0gICAgICAgIHh0ZW1wID0gIHk7Ci0gICAgICAgIHkgICAgID0gLXg7Ci0gICAgICAgIHggICAgID0gIHh0ZW1wOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aGV0YSA9ICB5ID4gMCA/IEZUX0FOR0xFX1BJIDogLUZUX0FOR0xFX1BJOwotICAgICAgICB4ICAgICA9IC14OwotICAgICAgICB5ICAgICA9IC15OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCB5IDwgLXggKQotICAgICAgewotICAgICAgICB0aGV0YSA9IC1GVF9BTkdMRV9QSTI7Ci0gICAgICAgIHh0ZW1wID0gLXk7Ci0gICAgICAgIHkgICAgID0gIHg7Ci0gICAgICAgIHggICAgID0gIHh0ZW1wOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aGV0YSA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYXJjdGFucHRyID0gZnRfdHJpZ19hcmN0YW5fdGFibGU7Ci0KLSAgICAvKiBQc2V1ZG9yb3RhdGlvbnMsIHdpdGggcmlnaHQgc2hpZnRzICovCi0gICAgZm9yICggaSA9IDEsIGIgPSAxOyBpIDwgRlRfVFJJR19NQVhfSVRFUlM7IGIgPDw9IDEsIGkrKyApCi0gICAgewotICAgICAgaWYgKCB5ID4gMCApCi0gICAgICB7Ci0gICAgICAgIHh0ZW1wICA9IHggKyAoICggeSArIGIgKSA+PiBpICk7Ci0gICAgICAgIHkgICAgICA9IHkgLSAoICggeCArIGIgKSA+PiBpICk7Ci0gICAgICAgIHggICAgICA9IHh0ZW1wOwotICAgICAgICB0aGV0YSArPSAqYXJjdGFucHRyKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHh0ZW1wICA9IHggLSAoICggeSArIGIgKSA+PiBpICk7Ci0gICAgICAgIHkgICAgICA9IHkgKyAoICggeCArIGIgKSA+PiBpICk7Ci0gICAgICAgIHggICAgICA9IHh0ZW1wOwotICAgICAgICB0aGV0YSAtPSAqYXJjdGFucHRyKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogcm91bmQgdGhldGEgdG8gYWNrbm93bGVkZ2UgaXRzIGVycm9yIHRoYXQgbW9zdGx5IGNvbWVzICovCi0gICAgLyogZnJvbSBhY2N1bXVsYXRlZCByb3VuZGluZyBlcnJvcnMgaW4gdGhlIGFyY3RhbiB0YWJsZSAgICovCi0gICAgaWYgKCB0aGV0YSA+PSAwICkKLSAgICAgIHRoZXRhID0gRlRfUEFEX1JPVU5EKCB0aGV0YSwgMTYgKTsKLSAgICBlbHNlCi0gICAgICB0aGV0YSA9IC1GVF9QQURfUk9VTkQoIC10aGV0YSwgMTYgKTsKLQotICAgIHZlYy0+eCA9IHg7Ci0gICAgdmVjLT55ID0gdGhldGE7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfQ29zKCBGVF9BbmdsZSAgYW5nbGUgKQotICB7Ci0gICAgRlRfVmVjdG9yICB2OwotCi0KLSAgICBGVF9WZWN0b3JfVW5pdCggJnYsIGFuZ2xlICk7Ci0KLSAgICByZXR1cm4gdi54OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9GaXhlZCApCi0gIEZUX1NpbiggRlRfQW5nbGUgIGFuZ2xlICkKLSAgewotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgRlRfVmVjdG9yX1VuaXQoICZ2LCBhbmdsZSApOwotCi0gICAgcmV0dXJuIHYueTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQotICBGVF9UYW4oIEZUX0FuZ2xlICBhbmdsZSApCi0gIHsKLSAgICBGVF9WZWN0b3IgIHY7Ci0KLQotICAgIEZUX1ZlY3Rvcl9Vbml0KCAmdiwgYW5nbGUgKTsKLQotICAgIHJldHVybiBGVF9EaXZGaXgoIHYueSwgdi54ICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0FuZ2xlICkKLSAgRlRfQXRhbjIoIEZUX0ZpeGVkICBkeCwKLSAgICAgICAgICAgIEZUX0ZpeGVkICBkeSApCi0gIHsKLSAgICBGVF9WZWN0b3IgIHY7Ci0KLQotICAgIGlmICggZHggPT0gMCAmJiBkeSA9PSAwICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgdi54ID0gZHg7Ci0gICAgdi55ID0gZHk7Ci0gICAgZnRfdHJpZ19wcmVub3JtKCAmdiApOwotICAgIGZ0X3RyaWdfcHNldWRvX3BvbGFyaXplKCAmdiApOwotCi0gICAgcmV0dXJuIHYueTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1ZlY3Rvcl9Vbml0KCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICBhbmdsZSApCi0gIHsKLSAgICBpZiAoICF2ZWMgKQotICAgICAgcmV0dXJuOwotCi0gICAgdmVjLT54ID0gRlRfVFJJR19TQ0FMRSA+PiA4OwotICAgIHZlYy0+eSA9IDA7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCB2ZWMsIGFuZ2xlICk7Ci0gICAgdmVjLT54ID0gKCB2ZWMtPnggKyAweDgwTCApID4+IDg7Ci0gICAgdmVjLT55ID0gKCB2ZWMtPnkgKyAweDgwTCApID4+IDg7Ci0gIH0KLQotCi0gIC8qIHRoZXNlIG1hY3JvcyByZXR1cm4gMCBmb3IgcG9zaXRpdmUgbnVtYmVycywKLSAgICAgYW5kIC0xIGZvciBuZWdhdGl2ZSBvbmVzICovCi0jZGVmaW5lIEZUX1NJR05fTE9ORyggeCApICAgKCAoeCkgPj4gKCBGVF9TSVpFT0ZfTE9ORyAqIDggLSAxICkgKQotI2RlZmluZSBGVF9TSUdOX0lOVCggeCApICAgICggKHgpID4+ICggRlRfU0laRU9GX0lOVCAqIDggLSAxICkgKQotI2RlZmluZSBGVF9TSUdOX0lOVDMyKCB4ICkgICggKHgpID4+IDMxICkKLSNkZWZpbmUgRlRfU0lHTl9JTlQxNiggeCApICAoICh4KSA+PiAxNSApCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfVmVjdG9yX1JvdGF0ZSggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICBhbmdsZSApCi0gIHsKLSAgICBGVF9JbnQgICAgIHNoaWZ0OwotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgaWYgKCAhdmVjIHx8ICFhbmdsZSApCi0gICAgICByZXR1cm47Ci0KLSAgICB2ID0gKnZlYzsKLQotICAgIGlmICggdi54ID09IDAgJiYgdi55ID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gICAgc2hpZnQgPSBmdF90cmlnX3ByZW5vcm0oICZ2ICk7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCAmdiwgYW5nbGUgKTsKLSAgICB2LnggPSBmdF90cmlnX2Rvd25zY2FsZSggdi54ICk7Ci0gICAgdi55ID0gZnRfdHJpZ19kb3duc2NhbGUoIHYueSApOwotCi0gICAgaWYgKCBzaGlmdCA+IDAgKQotICAgIHsKLSAgICAgIEZUX0ludDMyICBoYWxmID0gKEZUX0ludDMyKTFMIDw8ICggc2hpZnQgLSAxICk7Ci0KLQotICAgICAgdmVjLT54ID0gKCB2LnggKyBoYWxmICsgRlRfU0lHTl9MT05HKCB2LnggKSApID4+IHNoaWZ0OwotICAgICAgdmVjLT55ID0gKCB2LnkgKyBoYWxmICsgRlRfU0lHTl9MT05HKCB2LnkgKSApID4+IHNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hpZnQgID0gLXNoaWZ0OwotICAgICAgdmVjLT54ID0gKEZUX1BvcykoIChGVF9VTG9uZyl2LnggPDwgc2hpZnQgKTsKLSAgICAgIHZlYy0+eSA9IChGVF9Qb3MpKCAoRlRfVUxvbmcpdi55IDw8IHNoaWZ0ICk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9GaXhlZCApCi0gIEZUX1ZlY3Rvcl9MZW5ndGgoIEZUX1ZlY3RvciogIHZlYyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHNoaWZ0OwotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgaWYgKCAhdmVjICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgdiA9ICp2ZWM7Ci0KLSAgICAvKiBoYW5kbGUgdHJpdmlhbCBjYXNlcyAqLwotICAgIGlmICggdi54ID09IDAgKQotICAgIHsKLSAgICAgIHJldHVybiBGVF9BQlMoIHYueSApOwotICAgIH0KLSAgICBlbHNlIGlmICggdi55ID09IDAgKQotICAgIHsKLSAgICAgIHJldHVybiBGVF9BQlMoIHYueCApOwotICAgIH0KLQotICAgIC8qIGdlbmVyYWwgY2FzZSAqLwotICAgIHNoaWZ0ID0gZnRfdHJpZ19wcmVub3JtKCAmdiApOwotICAgIGZ0X3RyaWdfcHNldWRvX3BvbGFyaXplKCAmdiApOwotCi0gICAgdi54ID0gZnRfdHJpZ19kb3duc2NhbGUoIHYueCApOwotCi0gICAgaWYgKCBzaGlmdCA+IDAgKQotICAgICAgcmV0dXJuICggdi54ICsgKCAxTCA8PCAoIHNoaWZ0IC0gMSApICkgKSA+PiBzaGlmdDsKLQotICAgIHJldHVybiAoRlRfRml4ZWQpKCAoRlRfVUludDMyKXYueCA8PCAtc2hpZnQgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1ZlY3Rvcl9Qb2xhcml6ZSggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgKmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICphbmdsZSApCi0gIHsKLSAgICBGVF9JbnQgICAgIHNoaWZ0OwotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgaWYgKCAhdmVjIHx8ICFsZW5ndGggfHwgIWFuZ2xlICkKLSAgICAgIHJldHVybjsKLQotICAgIHYgPSAqdmVjOwotCi0gICAgaWYgKCB2LnggPT0gMCAmJiB2LnkgPT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICBzaGlmdCA9IGZ0X3RyaWdfcHJlbm9ybSggJnYgKTsKLSAgICBmdF90cmlnX3BzZXVkb19wb2xhcml6ZSggJnYgKTsKLQotICAgIHYueCA9IGZ0X3RyaWdfZG93bnNjYWxlKCB2LnggKTsKLQotICAgICpsZW5ndGggPSBzaGlmdCA+PSAwID8gICAgICAgICAgICAgICAgICAgICAgKCB2LnggPj4gIHNoaWZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICA6IChGVF9GaXhlZCkoIChGVF9VSW50MzIpdi54IDw8IC1zaGlmdCApOwotICAgICphbmdsZSAgPSB2Lnk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKQotICB7Ci0gICAgaWYgKCAhdmVjICkKLSAgICAgIHJldHVybjsKLQotICAgIHZlYy0+eCA9IGxlbmd0aDsKLSAgICB2ZWMtPnkgPSAwOwotCi0gICAgRlRfVmVjdG9yX1JvdGF0ZSggdmVjLCBhbmdsZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9BbmdsZSApCi0gIEZUX0FuZ2xlX0RpZmYoIEZUX0FuZ2xlICBhbmdsZTEsCi0gICAgICAgICAgICAgICAgIEZUX0FuZ2xlICBhbmdsZTIgKQotICB7Ci0gICAgRlRfQW5nbGUgIGRlbHRhID0gYW5nbGUyIC0gYW5nbGUxOwotCi0KLSAgICB3aGlsZSAoIGRlbHRhIDw9IC1GVF9BTkdMRV9QSSApCi0gICAgICBkZWx0YSArPSBGVF9BTkdMRV8yUEk7Ci0KLSAgICB3aGlsZSAoIGRlbHRhID4gRlRfQU5HTEVfUEkgKQotICAgICAgZGVsdGEgLT0gRlRfQU5HTEVfMlBJOwotCi0gICAgcmV0dXJuIGRlbHRhOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHR5cGUxLmMgYi9zcmMvYmFzZS9mdHR5cGUxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTZhNjMuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnR0eXBlMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHlwZTEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgZm9yIFBTIG5hbWVzIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0lORk9fSAotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0MXRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfUFNfRm9udF9JbmZvKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvUmVjKiAgYWZvbnRfaW5mbyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9Qc0luZm8gIHNlcnZpY2U7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFhZm9udF9pbmZvICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFBPU1RTQ1JJUFRfSU5GTyApOwotCi0gICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPnBzX2dldF9mb250X2luZm8gKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5wc19nZXRfZm9udF9pbmZvKCBmYWNlLCBhZm9udF9pbmZvICk7Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHQxdGFibGVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9JbnQgKQotICBGVF9IYXNfUFNfR2x5cGhfTmFtZXMoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgRlRfU2VydmljZV9Qc0luZm8gIHNlcnZpY2U7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFBPU1RTQ1JJUFRfSU5GTyApOwotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+cHNfaGFzX2dseXBoX25hbWVzICkKLSAgICAgICAgcmVzdWx0ID0gc2VydmljZS0+cHNfaGFzX2dseXBoX25hbWVzKCBmYWNlICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0MXRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfUFNfRm9udF9Qcml2YXRlKCBGVF9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfUHJpdmF0ZVJlYyogIGFmb250X3ByaXZhdGUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfUHNJbmZvICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCAhYWZvbnRfcHJpdmF0ZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBQT1NUU0NSSVBUX0lORk8gKTsKLQotICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5wc19nZXRfZm9udF9wcml2YXRlICkKLSAgICAgIGVycm9yID0gc2VydmljZS0+cHNfZ2V0X2ZvbnRfcHJpdmF0ZSggZmFjZSwgYWZvbnRfcHJpdmF0ZSApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0MXRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfTG9uZyApCi0gIEZUX0dldF9QU19Gb250X1ZhbHVlKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBQU19EaWN0X0tleXMgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgdmFsdWVfbGVuICkKLSAgewotICAgIEZUX0ludCAgICAgICAgICAgICByZXN1bHQgID0gMDsKLSAgICBGVF9TZXJ2aWNlX1BzSW5mbyAgc2VydmljZSA9IE5VTEw7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFBPU1RTQ1JJUFRfSU5GTyApOwotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+cHNfZ2V0X2ZvbnRfdmFsdWUgKQotICAgICAgICByZXN1bHQgPSBzZXJ2aWNlLT5wc19nZXRfZm9udF92YWx1ZSggZmFjZSwga2V5LCBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgdmFsdWVfbGVuICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnR1dGlsLmMgYi9zcmMvYmFzZS9mdHV0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjYzIwOS4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdHV0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHV0aWwuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIGZvciBtZW1vcnkgYW5kIGxpc3QgbWFuYWdlbWVudCAoYm9keSkuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfTElTVF9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9tZW1vcnkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX2FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUsCi0gICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX1BvaW50ZXIgIGJsb2NrID0gZnRfbWVtX3FhbGxvYyggbWVtb3J5LCBzaXplLCAmZXJyb3IgKTsKLQotICAgIGlmICggIWVycm9yICYmIHNpemUgPiAwICkKLSAgICAgIEZUX01FTV9aRVJPKCBibG9jaywgc2l6ZSApOwotCi0gICAgKnBfZXJyb3IgPSBlcnJvcjsKLSAgICByZXR1cm4gYmxvY2s7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX3FhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1BvaW50ZXIgIGJsb2NrID0gTlVMTDsKLQotCi0gICAgaWYgKCBzaXplID4gMCApCi0gICAgewotICAgICAgYmxvY2sgPSBtZW1vcnktPmFsbG9jKCBtZW1vcnksIHNpemUgKTsKLSAgICAgIGlmICggIWJsb2NrICkKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotICAgIH0KLSAgICBlbHNlIGlmICggc2l6ZSA8IDAgKQotICAgIHsKLSAgICAgIC8qIG1heSBoZWxwIGNhdGNoL3ByZXZlbnQgc2VjdXJpdHkgaXNzdWVzICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgfQotCi0gICAgKnBfZXJyb3IgPSBlcnJvcjsKLSAgICByZXR1cm4gYmxvY2s7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX3JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBpdGVtX3NpemUsCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGN1cl9jb3VudCwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jaywKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGJsb2NrID0gZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksIGl0ZW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2NvdW50LCBuZXdfY291bnQsIGJsb2NrLCAmZXJyb3IgKTsKLSAgICBpZiAoICFlcnJvciAmJiBuZXdfY291bnQgPiBjdXJfY291bnQgKQotICAgICAgRlRfTUVNX1pFUk8oIChjaGFyKilibG9jayArIGN1cl9jb3VudCAqIGl0ZW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAoIG5ld19jb3VudCAtIGN1cl9jb3VudCApICogaXRlbV9zaXplICk7Ci0KLSAgICAqcF9lcnJvciA9IGVycm9yOwotICAgIHJldHVybiBibG9jazsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcXJlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgaXRlbV9zaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgLyogTm90ZSB0aGF0IHdlIG5vdyBhY2NlcHQgYGl0ZW1fc2l6ZSA9PSAwJyBhcyBhIHZhbGlkIHBhcmFtZXRlciwgaW4KLSAgICAgKiBvcmRlciB0byBjb3ZlciB2ZXJ5IHdlaXJkIGNhc2VzIHdoZXJlIGFuIEFMTE9DX01VTFQgbWFjcm8gd291bGQgYmUKLSAgICAgKiBjYWxsZWQuCi0gICAgICovCi0gICAgaWYgKCBjdXJfY291bnQgPCAwIHx8IG5ld19jb3VudCA8IDAgfHwgaXRlbV9zaXplIDwgMCApCi0gICAgewotICAgICAgLyogbWF5IGhlbHAgY2F0Y2gvcHJldmVudCBuYXN0eSBzZWN1cml0eSBpc3N1ZXMgKi8KLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG5ld19jb3VudCA9PSAwIHx8IGl0ZW1fc2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICBmdF9tZW1fZnJlZSggbWVtb3J5LCBibG9jayApOwotICAgICAgYmxvY2sgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIGlmICggbmV3X2NvdW50ID4gRlRfSU5UX01BWC9pdGVtX3NpemUgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotICAgIH0KLSAgICBlbHNlIGlmICggY3VyX2NvdW50ID09IDAgKQotICAgIHsKLSAgICAgIEZUX0FTU0VSVCggIWJsb2NrICk7Ci0KLSAgICAgIGJsb2NrID0gZnRfbWVtX2FsbG9jKCBtZW1vcnksIG5ld19jb3VudCppdGVtX3NpemUsICZlcnJvciApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfUG9pbnRlciAgYmxvY2syOwotICAgICAgRlRfTG9uZyAgICAgY3VyX3NpemUgPSBjdXJfY291bnQqaXRlbV9zaXplOwotICAgICAgRlRfTG9uZyAgICAgbmV3X3NpemUgPSBuZXdfY291bnQqaXRlbV9zaXplOwotCi0KLSAgICAgIGJsb2NrMiA9IG1lbW9yeS0+cmVhbGxvYyggbWVtb3J5LCBjdXJfc2l6ZSwgbmV3X3NpemUsIGJsb2NrICk7Ci0gICAgICBpZiAoICFibG9jazIgKQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0gICAgICBlbHNlCi0gICAgICAgIGJsb2NrID0gYmxvY2syOwotICAgIH0KLQotICAgICpwX2Vycm9yID0gZXJyb3I7Ci0gICAgcmV0dXJuIGJsb2NrOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X21lbV9mcmVlKCBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgICBjb25zdCB2b2lkICpQICkKLSAgewotICAgIGlmICggUCApCi0gICAgICBtZW1vcnktPmZyZWUoIG1lbW9yeSwgKHZvaWQqKVAgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fZHVwKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgYWRkcmVzcywKLSAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIHNpemUsCi0gICAgICAgICAgICAgIEZUX0Vycm9yICAgICpwX2Vycm9yICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX1BvaW50ZXIgIHAgPSBmdF9tZW1fcWFsbG9jKCBtZW1vcnksIChGVF9Mb25nKXNpemUsICZlcnJvciApOwotCi0KLSAgICBpZiAoICFlcnJvciAmJiBhZGRyZXNzICkKLSAgICAgIGZ0X21lbWNweSggcCwgYWRkcmVzcywgc2l6ZSApOwotCi0gICAgKnBfZXJyb3IgPSBlcnJvcjsKLSAgICByZXR1cm4gcDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fc3RyZHVwKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgc3RyLAotICAgICAgICAgICAgICAgICBGVF9FcnJvciAgICAqcF9lcnJvciApCi0gIHsKLSAgICBGVF9VTG9uZyAgbGVuID0gc3RyID8gKEZUX1VMb25nKWZ0X3N0cmxlbiggc3RyICkgKyAxCi0gICAgICAgICAgICAgICAgICAgICAgICA6IDA7Ci0KLQotICAgIHJldHVybiBmdF9tZW1fZHVwKCBtZW1vcnksIHN0ciwgbGVuLCBwX2Vycm9yICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQgKQotICBmdF9tZW1fc3RyY3B5biggY2hhciogICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzcmMsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSApCi0gIHsKLSAgICB3aGlsZSAoIHNpemUgPiAxICYmICpzcmMgIT0gMCApCi0gICAgewotICAgICAgKmRzdCsrID0gKnNyYysrOwotICAgICAgc2l6ZS0tOwotICAgIH0KLQotICAgICpkc3QgPSAwOyAgLyogYWx3YXlzIHplcm8tdGVybWluYXRlICovCi0KLSAgICByZXR1cm4gKnNyYyAhPSAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgIEQgTyBVIEIgTCBZICAgTCBJIE4gSyBFIEQgICBMIEkgUyBUIFMgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfbGlzdAotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9MaXN0Tm9kZSApCi0gIEZUX0xpc3RfRmluZCggRlRfTGlzdCAgbGlzdCwKLSAgICAgICAgICAgICAgICB2b2lkKiAgICBkYXRhICkKLSAgewotICAgIEZUX0xpc3ROb2RlICBjdXI7Ci0KLQotICAgIGlmICggIWxpc3QgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjdXIgPSBsaXN0LT5oZWFkOwotICAgIHdoaWxlICggY3VyICkKLSAgICB7Ci0gICAgICBpZiAoIGN1ci0+ZGF0YSA9PSBkYXRhICkKLSAgICAgICAgcmV0dXJuIGN1cjsKLQotICAgICAgY3VyID0gY3VyLT5uZXh0OwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bGlzdC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0xpc3RfQWRkKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICkKLSAgewotICAgIEZUX0xpc3ROb2RlICBiZWZvcmU7Ci0KLQotICAgIGlmICggIWxpc3QgfHwgIW5vZGUgKQotICAgICAgcmV0dXJuOwotCi0gICAgYmVmb3JlID0gbGlzdC0+dGFpbDsKLQotICAgIG5vZGUtPm5leHQgPSBOVUxMOwotICAgIG5vZGUtPnByZXYgPSBiZWZvcmU7Ci0KLSAgICBpZiAoIGJlZm9yZSApCi0gICAgICBiZWZvcmUtPm5leHQgPSBub2RlOwotICAgIGVsc2UKLSAgICAgIGxpc3QtPmhlYWQgPSBub2RlOwotCi0gICAgbGlzdC0+dGFpbCA9IG5vZGU7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfTGlzdF9JbnNlcnQoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGFmdGVyOwotCi0KLSAgICBpZiAoICFsaXN0IHx8ICFub2RlICkKLSAgICAgIHJldHVybjsKLQotICAgIGFmdGVyID0gbGlzdC0+aGVhZDsKLQotICAgIG5vZGUtPm5leHQgPSBhZnRlcjsKLSAgICBub2RlLT5wcmV2ID0gTlVMTDsKLQotICAgIGlmICggIWFmdGVyICkKLSAgICAgIGxpc3QtPnRhaWwgPSBub2RlOwotICAgIGVsc2UKLSAgICAgIGFmdGVyLT5wcmV2ID0gbm9kZTsKLQotICAgIGxpc3QtPmhlYWQgPSBub2RlOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bGlzdC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0xpc3RfUmVtb3ZlKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICkKLSAgewotICAgIEZUX0xpc3ROb2RlICBiZWZvcmUsIGFmdGVyOwotCi0KLSAgICBpZiAoICFsaXN0IHx8ICFub2RlICkKLSAgICAgIHJldHVybjsKLQotICAgIGJlZm9yZSA9IG5vZGUtPnByZXY7Ci0gICAgYWZ0ZXIgID0gbm9kZS0+bmV4dDsKLQotICAgIGlmICggYmVmb3JlICkKLSAgICAgIGJlZm9yZS0+bmV4dCA9IGFmdGVyOwotICAgIGVsc2UKLSAgICAgIGxpc3QtPmhlYWQgPSBhZnRlcjsKLQotICAgIGlmICggYWZ0ZXIgKQotICAgICAgYWZ0ZXItPnByZXYgPSBiZWZvcmU7Ci0gICAgZWxzZQotICAgICAgbGlzdC0+dGFpbCA9IGJlZm9yZTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGxpc3QuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9MaXN0X1VwKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGJlZm9yZSwgYWZ0ZXI7Ci0KLQotICAgIGlmICggIWxpc3QgfHwgIW5vZGUgKQotICAgICAgcmV0dXJuOwotCi0gICAgYmVmb3JlID0gbm9kZS0+cHJldjsKLSAgICBhZnRlciAgPSBub2RlLT5uZXh0OwotCi0gICAgLyogY2hlY2sgd2hldGhlciB3ZSBhcmUgYWxyZWFkeSBvbiB0b3Agb2YgdGhlIGxpc3QgKi8KLSAgICBpZiAoICFiZWZvcmUgKQotICAgICAgcmV0dXJuOwotCi0gICAgYmVmb3JlLT5uZXh0ID0gYWZ0ZXI7Ci0KLSAgICBpZiAoIGFmdGVyICkKLSAgICAgIGFmdGVyLT5wcmV2ID0gYmVmb3JlOwotICAgIGVsc2UKLSAgICAgIGxpc3QtPnRhaWwgPSBiZWZvcmU7Ci0KLSAgICBub2RlLT5wcmV2ICAgICAgID0gTlVMTDsKLSAgICBub2RlLT5uZXh0ICAgICAgID0gbGlzdC0+aGVhZDsKLSAgICBsaXN0LT5oZWFkLT5wcmV2ID0gbm9kZTsKLSAgICBsaXN0LT5oZWFkICAgICAgID0gbm9kZTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGxpc3QuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTGlzdF9JdGVyYXRlKCBGVF9MaXN0ICAgICAgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgIEZUX0xpc3RfSXRlcmF0b3IgIGl0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHVzZXIgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGN1cjsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggIWxpc3QgfHwgIWl0ZXJhdG9yICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgY3VyID0gbGlzdC0+aGVhZDsKLQotICAgIHdoaWxlICggY3VyICkKLSAgICB7Ci0gICAgICBGVF9MaXN0Tm9kZSAgbmV4dCA9IGN1ci0+bmV4dDsKLQotCi0gICAgICBlcnJvciA9IGl0ZXJhdG9yKCBjdXIsIHVzZXIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLQotICAgICAgY3VyID0gbmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfTGlzdF9GaW5hbGl6ZSggRlRfTGlzdCAgICAgICAgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgICBGVF9MaXN0X0Rlc3RydWN0b3IgIGRlc3Ryb3ksCi0gICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgIHVzZXIgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGN1cjsKLQotCi0gICAgaWYgKCAhbGlzdCB8fCAhbWVtb3J5ICkKLSAgICAgIHJldHVybjsKLQotICAgIGN1ciA9IGxpc3QtPmhlYWQ7Ci0gICAgd2hpbGUgKCBjdXIgKQotICAgIHsKLSAgICAgIEZUX0xpc3ROb2RlICBuZXh0ID0gY3VyLT5uZXh0OwotICAgICAgdm9pZCogICAgICAgIGRhdGEgPSBjdXItPmRhdGE7Ci0KLQotICAgICAgaWYgKCBkZXN0cm95ICkKLSAgICAgICAgZGVzdHJveSggbWVtb3J5LCBkYXRhLCB1c2VyICk7Ci0KLSAgICAgIEZUX0ZSRUUoIGN1ciApOwotICAgICAgY3VyID0gbmV4dDsKLSAgICB9Ci0KLSAgICBsaXN0LT5oZWFkID0gTlVMTDsKLSAgICBsaXN0LT50YWlsID0gTlVMTDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnR3aW5mbnQuYyBiL3NyYy9iYXNlL2Z0d2luZm50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YmFhMDIuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnR3aW5mbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0d2luZm50LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBXaW5kb3dzIEZOVCBzcGVjaWZpYyBpbmZvIChib2R5KS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9XSU5GT05UU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfV0lORk5UX0gKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR3aW5mbnQuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1dpbkZOVF9IZWFkZXIoIEZUX0ZhY2UgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfV2luRk5UX0hlYWRlclJlYyAgKmhlYWRlciApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX1dpbkZudCAgc2VydmljZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFoZWFkZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBXSU5GTlQgKTsKLQotICAgIGlmICggc2VydmljZSApCi0gICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9oZWFkZXIoIGZhY2UsIGhlYWRlciApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvbWQ1LmMgYi9zcmMvYmFzZS9tZDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzNWUxNy4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9tZDUuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKgotICogVGhpcyBpcyBhbiBPcGVuU1NMLWNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCi0gKiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIChSRkMgMTMyMSkuCi0gKgotICogSG9tZXBhZ2U6Ci0gKiBodHRwOi8vb3BlbndhbGwuaW5mby93aWtpL3Blb3BsZS9zb2xhci9zb2Z0d2FyZS9wdWJsaWMtZG9tYWluLXNvdXJjZS1jb2RlL21kNQotICoKLSAqIEF1dGhvcjoKLSAqIEFsZXhhbmRlciBQZXNseWFrLCBiZXR0ZXIga25vd24gYXMgU29sYXIgRGVzaWduZXIgPHNvbGFyIGF0IG9wZW53YWxsLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIHdhcyB3cml0dGVuIGJ5IEFsZXhhbmRlciBQZXNseWFrIGluIDIwMDEuICBObyBjb3B5cmlnaHQgaXMKLSAqIGNsYWltZWQsIGFuZCB0aGUgc29mdHdhcmUgaXMgaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSAqIEluIGNhc2UgdGhpcyBhdHRlbXB0IHRvIGRpc2NsYWltIGNvcHlyaWdodCBhbmQgcGxhY2UgdGhlIHNvZnR3YXJlIGluIHRoZQotICogcHVibGljIGRvbWFpbiBpcyBkZWVtZWQgbnVsbCBhbmQgdm9pZCwgdGhlbiB0aGUgc29mdHdhcmUgaXMKLSAqIENvcHlyaWdodCAoYykgMjAwMSBBbGV4YW5kZXIgUGVzbHlhayBhbmQgaXQgaXMgaGVyZWJ5IHJlbGVhc2VkIHRvIHRoZQotICogZ2VuZXJhbCBwdWJsaWMgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZC4KLSAqCi0gKiBUaGVyZSdzIEFCU09MVVRFTFkgTk8gV0FSUkFOVFksIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqCi0gKiAoVGhpcyBpcyBhIGhlYXZpbHkgY3V0LWRvd24gIkJTRCBsaWNlbnNlIi4pCi0gKgotICogVGhpcyBkaWZmZXJzIGZyb20gQ29saW4gUGx1bWIncyBvbGRlciBwdWJsaWMgZG9tYWluIGltcGxlbWVudGF0aW9uIGluIHRoYXQKLSAqIG5vIGV4YWN0bHkgMzItYml0IGludGVnZXIgZGF0YSB0eXBlIGlzIHJlcXVpcmVkIChhbnkgMzItYml0IG9yIHdpZGVyCi0gKiB1bnNpZ25lZCBpbnRlZ2VyIGRhdGEgdHlwZSB3aWxsIGRvKSwgdGhlcmUncyBubyBjb21waWxlLXRpbWUgZW5kaWFubmVzcwotICogY29uZmlndXJhdGlvbiwgYW5kIHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzIG1hdGNoIE9wZW5TU0wncy4gIE5vIGNvZGUgZnJvbQotICogQ29saW4gUGx1bWIncyBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiByZXVzZWQ7IHRoaXMgY29tbWVudCBtZXJlbHkgY29tcGFyZXMKLSAqIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb25zLgotICoKLSAqIFRoZSBwcmltYXJ5IGdvYWxzIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gYXJlIHBvcnRhYmlsaXR5IGFuZCBlYXNlIG9mIHVzZS4KLSAqIEl0IGlzIG1lYW50IHRvIGJlIGZhc3QsIGJ1dCBub3QgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIFNvbWUga25vd24KLSAqIG9wdGltaXphdGlvbnMgYXJlIG5vdCBpbmNsdWRlZCB0byByZWR1Y2Ugc291cmNlIGNvZGUgc2l6ZSBhbmQgYXZvaWQKLSAqIGNvbXBpbGUtdGltZSBjb25maWd1cmF0aW9uLgotICovCi0KLSNpZm5kZWYgSEFWRV9PUEVOU1NMCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIm1kNS5oIgotCi0vKgotICogVGhlIGJhc2ljIE1ENSBmdW5jdGlvbnMuCi0gKgotICogRiBhbmQgRyBhcmUgb3B0aW1pemVkIGNvbXBhcmVkIHRvIHRoZWlyIFJGQyAxMzIxIGRlZmluaXRpb25zIGZvcgotICogYXJjaGl0ZWN0dXJlcyB0aGF0IGxhY2sgYW4gQU5ELU5PVCBpbnN0cnVjdGlvbiwganVzdCBsaWtlIGluIENvbGluIFBsdW1iJ3MKLSAqIGltcGxlbWVudGF0aW9uLgotICovCi0jZGVmaW5lIEYoeCwgeSwgeikJCQkoKHopIF4gKCh4KSAmICgoeSkgXiAoeikpKSkKLSNkZWZpbmUgRyh4LCB5LCB6KQkJCSgoeSkgXiAoKHopICYgKCh4KSBeICh5KSkpKQotI2RlZmluZSBIKHgsIHksIHopCQkJKCgoeCkgXiAoeSkpIF4gKHopKQotI2RlZmluZSBIMih4LCB5LCB6KQkJCSgoeCkgXiAoKHkpIF4gKHopKSkKLSNkZWZpbmUgSSh4LCB5LCB6KQkJCSgoeSkgXiAoKHgpIHwgfih6KSkpCi0KLS8qCi0gKiBUaGUgTUQ1IHRyYW5zZm9ybWF0aW9uIGZvciBhbGwgZm91ciByb3VuZHMuCi0gKi8KLSNkZWZpbmUgU1RFUChmLCBhLCBiLCBjLCBkLCB4LCB0LCBzKSBcCi0JKGEpICs9IGYoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAodCk7IFwKLQkoYSkgPSAoKChhKSA8PCAocykpIHwgKCgoYSkgJiAweGZmZmZmZmZmKSA+PiAoMzIgLSAocykpKSk7IFwKLQkoYSkgKz0gKGIpOwotCi0vKgotICogU0VUIHJlYWRzIDQgaW5wdXQgYnl0ZXMgaW4gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyIGFuZCBzdG9yZXMgdGhlbSBpbiBhCi0gKiBwcm9wZXJseSBhbGlnbmVkIHdvcmQgaW4gaG9zdCBieXRlIG9yZGVyLgotICoKLSAqIFRoZSBjaGVjayBmb3IgbGl0dGxlLWVuZGlhbiBhcmNoaXRlY3R1cmVzIHRoYXQgdG9sZXJhdGUgdW5hbGlnbmVkIG1lbW9yeQotICogYWNjZXNzZXMgaXMganVzdCBhbiBvcHRpbWl6YXRpb24uICBOb3RoaW5nIHdpbGwgYnJlYWsgaWYgaXQgZmFpbHMgdG8gZGV0ZWN0Ci0gKiBhIHN1aXRhYmxlIGFyY2hpdGVjdHVyZS4KLSAqCi0gKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIG9wdGltaXphdGlvbiBtYXkgYmUgYSBDIHN0cmljdCBhbGlhc2luZyBydWxlcyB2aW9sYXRpb24KLSAqIGlmIHRoZSBjYWxsZXIncyBkYXRhIGJ1ZmZlciBoYXMgZWZmZWN0aXZlIHR5cGUgdGhhdCBjYW5ub3QgYmUgYWxpYXNlZCBieQotICogTUQ1X3UzMnBsdXMuICBJbiBwcmFjdGljZSwgdGhpcyBwcm9ibGVtIG1heSBvY2N1ciBpZiB0aGVzZSBNRDUgcm91dGluZXMgYXJlCi0gKiBpbmxpbmVkIGludG8gYSBjYWxsaW5nIGZ1bmN0aW9uLCBvciB3aXRoIGZ1dHVyZSBhbmQgZGFuZ2Vyb3VzbHkgYWR2YW5jZWQKLSAqIGxpbmstdGltZSBvcHRpbWl6YXRpb25zLiAgRm9yIHRoZSB0aW1lIGJlaW5nLCBrZWVwaW5nIHRoZXNlIE1ENSByb3V0aW5lcyBpbgotICogdGhlaXIgb3duIHRyYW5zbGF0aW9uIHVuaXQgYXZvaWRzIHRoZSBwcm9ibGVtLgotICovCi0jaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fdmF4X18pCi0jZGVmaW5lIFNFVChuKSBcCi0JKCooTUQ1X3UzMnBsdXMgKikmcHRyWyhuKSAqIDRdKQotI2RlZmluZSBHRVQobikgXAotCVNFVChuKQotI2Vsc2UKLSNkZWZpbmUgU0VUKG4pIFwKLQkoY3R4LT5ibG9ja1sobildID0gXAotCShNRDVfdTMycGx1cylwdHJbKG4pICogNF0gfCBcCi0JKChNRDVfdTMycGx1cylwdHJbKG4pICogNCArIDFdIDw8IDgpIHwgXAotCSgoTUQ1X3UzMnBsdXMpcHRyWyhuKSAqIDQgKyAyXSA8PCAxNikgfCBcCi0JKChNRDVfdTMycGx1cylwdHJbKG4pICogNCArIDNdIDw8IDI0KSkKLSNkZWZpbmUgR0VUKG4pIFwKLQkoY3R4LT5ibG9ja1sobildKQotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIHByb2Nlc3NlcyBvbmUgb3IgbW9yZSA2NC1ieXRlIGRhdGEgYmxvY2tzLCBidXQgZG9lcyBOT1QgdXBkYXRlIHRoZSBiaXQKLSAqIGNvdW50ZXJzLiAgVGhlcmUgYXJlIG5vIGFsaWdubWVudCByZXF1aXJlbWVudHMuCi0gKi8KLXN0YXRpYyBjb25zdCB2b2lkICpib2R5KE1ENV9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKLQlNRDVfdTMycGx1cyBhLCBiLCBjLCBkOwotCU1ENV91MzJwbHVzIHNhdmVkX2EsIHNhdmVkX2IsIHNhdmVkX2MsIHNhdmVkX2Q7Ci0KLQlwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWRhdGE7Ci0KLQlhID0gY3R4LT5hOwotCWIgPSBjdHgtPmI7Ci0JYyA9IGN0eC0+YzsKLQlkID0gY3R4LT5kOwotCi0JZG8gewotCQlzYXZlZF9hID0gYTsKLQkJc2F2ZWRfYiA9IGI7Ci0JCXNhdmVkX2MgPSBjOwotCQlzYXZlZF9kID0gZDsKLQotLyogUm91bmQgMSAqLwotCQlTVEVQKEYsIGEsIGIsIGMsIGQsIFNFVCgwKSwgMHhkNzZhYTQ3OCwgNykKLQkJU1RFUChGLCBkLCBhLCBiLCBjLCBTRVQoMSksIDB4ZThjN2I3NTYsIDEyKQotCQlTVEVQKEYsIGMsIGQsIGEsIGIsIFNFVCgyKSwgMHgyNDIwNzBkYiwgMTcpCi0JCVNURVAoRiwgYiwgYywgZCwgYSwgU0VUKDMpLCAweGMxYmRjZWVlLCAyMikKLQkJU1RFUChGLCBhLCBiLCBjLCBkLCBTRVQoNCksIDB4ZjU3YzBmYWYsIDcpCi0JCVNURVAoRiwgZCwgYSwgYiwgYywgU0VUKDUpLCAweDQ3ODdjNjJhLCAxMikKLQkJU1RFUChGLCBjLCBkLCBhLCBiLCBTRVQoNiksIDB4YTgzMDQ2MTMsIDE3KQotCQlTVEVQKEYsIGIsIGMsIGQsIGEsIFNFVCg3KSwgMHhmZDQ2OTUwMSwgMjIpCi0JCVNURVAoRiwgYSwgYiwgYywgZCwgU0VUKDgpLCAweDY5ODA5OGQ4LCA3KQotCQlTVEVQKEYsIGQsIGEsIGIsIGMsIFNFVCg5KSwgMHg4YjQ0ZjdhZiwgMTIpCi0JCVNURVAoRiwgYywgZCwgYSwgYiwgU0VUKDEwKSwgMHhmZmZmNWJiMSwgMTcpCi0JCVNURVAoRiwgYiwgYywgZCwgYSwgU0VUKDExKSwgMHg4OTVjZDdiZSwgMjIpCi0JCVNURVAoRiwgYSwgYiwgYywgZCwgU0VUKDEyKSwgMHg2YjkwMTEyMiwgNykKLQkJU1RFUChGLCBkLCBhLCBiLCBjLCBTRVQoMTMpLCAweGZkOTg3MTkzLCAxMikKLQkJU1RFUChGLCBjLCBkLCBhLCBiLCBTRVQoMTQpLCAweGE2Nzk0MzhlLCAxNykKLQkJU1RFUChGLCBiLCBjLCBkLCBhLCBTRVQoMTUpLCAweDQ5YjQwODIxLCAyMikKLQotLyogUm91bmQgMiAqLwotCQlTVEVQKEcsIGEsIGIsIGMsIGQsIEdFVCgxKSwgMHhmNjFlMjU2MiwgNSkKLQkJU1RFUChHLCBkLCBhLCBiLCBjLCBHRVQoNiksIDB4YzA0MGIzNDAsIDkpCi0JCVNURVAoRywgYywgZCwgYSwgYiwgR0VUKDExKSwgMHgyNjVlNWE1MSwgMTQpCi0JCVNURVAoRywgYiwgYywgZCwgYSwgR0VUKDApLCAweGU5YjZjN2FhLCAyMCkKLQkJU1RFUChHLCBhLCBiLCBjLCBkLCBHRVQoNSksIDB4ZDYyZjEwNWQsIDUpCi0JCVNURVAoRywgZCwgYSwgYiwgYywgR0VUKDEwKSwgMHgwMjQ0MTQ1MywgOSkKLQkJU1RFUChHLCBjLCBkLCBhLCBiLCBHRVQoMTUpLCAweGQ4YTFlNjgxLCAxNCkKLQkJU1RFUChHLCBiLCBjLCBkLCBhLCBHRVQoNCksIDB4ZTdkM2ZiYzgsIDIwKQotCQlTVEVQKEcsIGEsIGIsIGMsIGQsIEdFVCg5KSwgMHgyMWUxY2RlNiwgNSkKLQkJU1RFUChHLCBkLCBhLCBiLCBjLCBHRVQoMTQpLCAweGMzMzcwN2Q2LCA5KQotCQlTVEVQKEcsIGMsIGQsIGEsIGIsIEdFVCgzKSwgMHhmNGQ1MGQ4NywgMTQpCi0JCVNURVAoRywgYiwgYywgZCwgYSwgR0VUKDgpLCAweDQ1NWExNGVkLCAyMCkKLQkJU1RFUChHLCBhLCBiLCBjLCBkLCBHRVQoMTMpLCAweGE5ZTNlOTA1LCA1KQotCQlTVEVQKEcsIGQsIGEsIGIsIGMsIEdFVCgyKSwgMHhmY2VmYTNmOCwgOSkKLQkJU1RFUChHLCBjLCBkLCBhLCBiLCBHRVQoNyksIDB4Njc2ZjAyZDksIDE0KQotCQlTVEVQKEcsIGIsIGMsIGQsIGEsIEdFVCgxMiksIDB4OGQyYTRjOGEsIDIwKQotCi0vKiBSb3VuZCAzICovCi0JCVNURVAoSCwgYSwgYiwgYywgZCwgR0VUKDUpLCAweGZmZmEzOTQyLCA0KQotCQlTVEVQKEgyLCBkLCBhLCBiLCBjLCBHRVQoOCksIDB4ODc3MWY2ODEsIDExKQotCQlTVEVQKEgsIGMsIGQsIGEsIGIsIEdFVCgxMSksIDB4NmQ5ZDYxMjIsIDE2KQotCQlTVEVQKEgyLCBiLCBjLCBkLCBhLCBHRVQoMTQpLCAweGZkZTUzODBjLCAyMykKLQkJU1RFUChILCBhLCBiLCBjLCBkLCBHRVQoMSksIDB4YTRiZWVhNDQsIDQpCi0JCVNURVAoSDIsIGQsIGEsIGIsIGMsIEdFVCg0KSwgMHg0YmRlY2ZhOSwgMTEpCi0JCVNURVAoSCwgYywgZCwgYSwgYiwgR0VUKDcpLCAweGY2YmI0YjYwLCAxNikKLQkJU1RFUChIMiwgYiwgYywgZCwgYSwgR0VUKDEwKSwgMHhiZWJmYmM3MCwgMjMpCi0JCVNURVAoSCwgYSwgYiwgYywgZCwgR0VUKDEzKSwgMHgyODliN2VjNiwgNCkKLQkJU1RFUChIMiwgZCwgYSwgYiwgYywgR0VUKDApLCAweGVhYTEyN2ZhLCAxMSkKLQkJU1RFUChILCBjLCBkLCBhLCBiLCBHRVQoMyksIDB4ZDRlZjMwODUsIDE2KQotCQlTVEVQKEgyLCBiLCBjLCBkLCBhLCBHRVQoNiksIDB4MDQ4ODFkMDUsIDIzKQotCQlTVEVQKEgsIGEsIGIsIGMsIGQsIEdFVCg5KSwgMHhkOWQ0ZDAzOSwgNCkKLQkJU1RFUChIMiwgZCwgYSwgYiwgYywgR0VUKDEyKSwgMHhlNmRiOTllNSwgMTEpCi0JCVNURVAoSCwgYywgZCwgYSwgYiwgR0VUKDE1KSwgMHgxZmEyN2NmOCwgMTYpCi0JCVNURVAoSDIsIGIsIGMsIGQsIGEsIEdFVCgyKSwgMHhjNGFjNTY2NSwgMjMpCi0KLS8qIFJvdW5kIDQgKi8KLQkJU1RFUChJLCBhLCBiLCBjLCBkLCBHRVQoMCksIDB4ZjQyOTIyNDQsIDYpCi0JCVNURVAoSSwgZCwgYSwgYiwgYywgR0VUKDcpLCAweDQzMmFmZjk3LCAxMCkKLQkJU1RFUChJLCBjLCBkLCBhLCBiLCBHRVQoMTQpLCAweGFiOTQyM2E3LCAxNSkKLQkJU1RFUChJLCBiLCBjLCBkLCBhLCBHRVQoNSksIDB4ZmM5M2EwMzksIDIxKQotCQlTVEVQKEksIGEsIGIsIGMsIGQsIEdFVCgxMiksIDB4NjU1YjU5YzMsIDYpCi0JCVNURVAoSSwgZCwgYSwgYiwgYywgR0VUKDMpLCAweDhmMGNjYzkyLCAxMCkKLQkJU1RFUChJLCBjLCBkLCBhLCBiLCBHRVQoMTApLCAweGZmZWZmNDdkLCAxNSkKLQkJU1RFUChJLCBiLCBjLCBkLCBhLCBHRVQoMSksIDB4ODU4NDVkZDEsIDIxKQotCQlTVEVQKEksIGEsIGIsIGMsIGQsIEdFVCg4KSwgMHg2ZmE4N2U0ZiwgNikKLQkJU1RFUChJLCBkLCBhLCBiLCBjLCBHRVQoMTUpLCAweGZlMmNlNmUwLCAxMCkKLQkJU1RFUChJLCBjLCBkLCBhLCBiLCBHRVQoNiksIDB4YTMwMTQzMTQsIDE1KQotCQlTVEVQKEksIGIsIGMsIGQsIGEsIEdFVCgxMyksIDB4NGUwODExYTEsIDIxKQotCQlTVEVQKEksIGEsIGIsIGMsIGQsIEdFVCg0KSwgMHhmNzUzN2U4MiwgNikKLQkJU1RFUChJLCBkLCBhLCBiLCBjLCBHRVQoMTEpLCAweGJkM2FmMjM1LCAxMCkKLQkJU1RFUChJLCBjLCBkLCBhLCBiLCBHRVQoMiksIDB4MmFkN2QyYmIsIDE1KQotCQlTVEVQKEksIGIsIGMsIGQsIGEsIEdFVCg5KSwgMHhlYjg2ZDM5MSwgMjEpCi0KLQkJYSArPSBzYXZlZF9hOwotCQliICs9IHNhdmVkX2I7Ci0JCWMgKz0gc2F2ZWRfYzsKLQkJZCArPSBzYXZlZF9kOwotCi0JCXB0ciArPSA2NDsKLQl9IHdoaWxlIChzaXplIC09IDY0KTsKLQotCWN0eC0+YSA9IGE7Ci0JY3R4LT5iID0gYjsKLQljdHgtPmMgPSBjOwotCWN0eC0+ZCA9IGQ7Ci0KLQlyZXR1cm4gcHRyOwotfQotCi12b2lkIE1ENV9Jbml0KE1ENV9DVFggKmN0eCkKLXsKLQljdHgtPmEgPSAweDY3NDUyMzAxOwotCWN0eC0+YiA9IDB4ZWZjZGFiODk7Ci0JY3R4LT5jID0gMHg5OGJhZGNmZTsKLQljdHgtPmQgPSAweDEwMzI1NDc2OwotCi0JY3R4LT5sbyA9IDA7Ci0JY3R4LT5oaSA9IDA7Ci19Ci0KLXZvaWQgTUQ1X1VwZGF0ZShNRDVfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlNRDVfdTMycGx1cyBzYXZlZF9sbzsKLQl1bnNpZ25lZCBsb25nIHVzZWQsIGF2YWlsYWJsZTsKLQotCXNhdmVkX2xvID0gY3R4LT5sbzsKLQlpZiAoKGN0eC0+bG8gPSAoc2F2ZWRfbG8gKyBzaXplKSAmIDB4MWZmZmZmZmYpIDwgc2F2ZWRfbG8pCi0JCWN0eC0+aGkrKzsKLQljdHgtPmhpICs9IHNpemUgPj4gMjk7Ci0KLQl1c2VkID0gc2F2ZWRfbG8gJiAweDNmOwotCi0JaWYgKHVzZWQpIHsKLQkJYXZhaWxhYmxlID0gNjQgLSB1c2VkOwotCi0JCWlmIChzaXplIDwgYXZhaWxhYmxlKSB7Ci0JCQltZW1jcHkoJmN0eC0+YnVmZmVyW3VzZWRdLCBkYXRhLCBzaXplKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1lbWNweSgmY3R4LT5idWZmZXJbdXNlZF0sIGRhdGEsIGF2YWlsYWJsZSk7Ci0JCWRhdGEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWRhdGEgKyBhdmFpbGFibGU7Ci0JCXNpemUgLT0gYXZhaWxhYmxlOwotCQlib2R5KGN0eCwgY3R4LT5idWZmZXIsIDY0KTsKLQl9Ci0KLQlpZiAoc2l6ZSA+PSA2NCkgewotCQlkYXRhID0gYm9keShjdHgsIGRhdGEsIHNpemUgJiB+KHVuc2lnbmVkIGxvbmcpMHgzZik7Ci0JCXNpemUgJj0gMHgzZjsKLQl9Ci0KLQltZW1jcHkoY3R4LT5idWZmZXIsIGRhdGEsIHNpemUpOwotfQotCi0jZGVmaW5lIE9VVChkc3QsIHNyYykgXAotCShkc3QpWzBdID0gKHVuc2lnbmVkIGNoYXIpKHNyYyk7IFwKLQkoZHN0KVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoc3JjKSA+PiA4KTsgXAotCShkc3QpWzJdID0gKHVuc2lnbmVkIGNoYXIpKChzcmMpID4+IDE2KTsgXAotCShkc3QpWzNdID0gKHVuc2lnbmVkIGNoYXIpKChzcmMpID4+IDI0KTsKLQotdm9pZCBNRDVfRmluYWwodW5zaWduZWQgY2hhciAqcmVzdWx0LCBNRDVfQ1RYICpjdHgpCi17Ci0JdW5zaWduZWQgbG9uZyB1c2VkLCBhdmFpbGFibGU7Ci0KLQl1c2VkID0gY3R4LT5sbyAmIDB4M2Y7Ci0KLQljdHgtPmJ1ZmZlclt1c2VkKytdID0gMHg4MDsKLQotCWF2YWlsYWJsZSA9IDY0IC0gdXNlZDsKLQotCWlmIChhdmFpbGFibGUgPCA4KSB7Ci0JCW1lbXNldCgmY3R4LT5idWZmZXJbdXNlZF0sIDAsIGF2YWlsYWJsZSk7Ci0JCWJvZHkoY3R4LCBjdHgtPmJ1ZmZlciwgNjQpOwotCQl1c2VkID0gMDsKLQkJYXZhaWxhYmxlID0gNjQ7Ci0JfQotCi0JbWVtc2V0KCZjdHgtPmJ1ZmZlclt1c2VkXSwgMCwgYXZhaWxhYmxlIC0gOCk7Ci0KLQljdHgtPmxvIDw8PSAzOwotCU9VVCgmY3R4LT5idWZmZXJbNTZdLCBjdHgtPmxvKQotCU9VVCgmY3R4LT5idWZmZXJbNjBdLCBjdHgtPmhpKQotCi0JYm9keShjdHgsIGN0eC0+YnVmZmVyLCA2NCk7Ci0KLQlPVVQoJnJlc3VsdFswXSwgY3R4LT5hKQotCU9VVCgmcmVzdWx0WzRdLCBjdHgtPmIpCi0JT1VUKCZyZXN1bHRbOF0sIGN0eC0+YykKLQlPVVQoJnJlc3VsdFsxMl0sIGN0eC0+ZCkKLQotCW1lbXNldChjdHgsIDAsIHNpemVvZigqY3R4KSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvbWQ1LmggYi9zcmMvYmFzZS9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhNDRiZi4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9tZDUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBUaGlzIGlzIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KLSAqIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0gKFJGQyAxMzIxKS4KLSAqCi0gKiBIb21lcGFnZToKLSAqIGh0dHA6Ly9vcGVud2FsbC5pbmZvL3dpa2kvcGVvcGxlL3NvbGFyL3NvZnR3YXJlL3B1YmxpYy1kb21haW4tc291cmNlLWNvZGUvbWQ1Ci0gKgotICogQXV0aG9yOgotICogQWxleGFuZGVyIFBlc2x5YWssIGJldHRlciBrbm93biBhcyBTb2xhciBEZXNpZ25lciA8c29sYXIgYXQgb3BlbndhbGwuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgd2FzIHdyaXR0ZW4gYnkgQWxleGFuZGVyIFBlc2x5YWsgaW4gMjAwMS4gIE5vIGNvcHlyaWdodCBpcwotICogY2xhaW1lZCwgYW5kIHRoZSBzb2Z0d2FyZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLgotICogSW4gY2FzZSB0aGlzIGF0dGVtcHQgdG8gZGlzY2xhaW0gY29weXJpZ2h0IGFuZCBwbGFjZSB0aGUgc29mdHdhcmUgaW4gdGhlCi0gKiBwdWJsaWMgZG9tYWluIGlzIGRlZW1lZCBudWxsIGFuZCB2b2lkLCB0aGVuIHRoZSBzb2Z0d2FyZSBpcwotICogQ29weXJpZ2h0IChjKSAyMDAxIEFsZXhhbmRlciBQZXNseWFrIGFuZCBpdCBpcyBoZXJlYnkgcmVsZWFzZWQgdG8gdGhlCi0gKiBnZW5lcmFsIHB1YmxpYyB1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zOgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkLgotICoKLSAqIFRoZXJlJ3MgQUJTT0xVVEVMWSBOTyBXQVJSQU5UWSwgZXhwcmVzcyBvciBpbXBsaWVkLgotICoKLSAqIFNlZSBtZDUuYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotCi0jaWZkZWYgSEFWRV9PUEVOU1NMCi0jaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KLSNlbGlmICFkZWZpbmVkKF9NRDVfSCkKLSNkZWZpbmUgX01ENV9ICi0KLS8qIEFueSAzMi1iaXQgb3Igd2lkZXIgdW5zaWduZWQgaW50ZWdlciBkYXRhIHR5cGUgd2lsbCBkbyAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgTUQ1X3UzMnBsdXM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlNRDVfdTMycGx1cyBsbywgaGk7Ci0JTUQ1X3UzMnBsdXMgYSwgYiwgYywgZDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07Ci0JTUQ1X3UzMnBsdXMgYmxvY2tbMTZdOwotfSBNRDVfQ1RYOwotCi1leHRlcm4gdm9pZCBNRDVfSW5pdChNRDVfQ1RYICpjdHgpOwotZXh0ZXJuIHZvaWQgTUQ1X1VwZGF0ZShNRDVfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gdm9pZCBNRDVfRmluYWwodW5zaWduZWQgY2hhciAqcmVzdWx0LCBNRDVfQ1RYICpjdHgpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL3J1bGVzLm1rIGIvc3JjL2Jhc2UvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWU5M2MuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIGJhc2UgbGF5ZXIgY29uZmlndXJhdGlvbiBydWxlcwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBJdCBzZXRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZSBtYXN0ZXIgTWFrZWZpbGUKLSMgYWZ0ZXIgdGhlIGNhbGw6Ci0jCi0jICAgQkFTRV9PQkpfUzogICBUaGUgc2luZ2xlLW9iamVjdCBiYXNlIGxheWVyLgotIyAgIEJBU0VfT0JKX006ICAgQSBsaXN0IG9mIGFsbCBvYmplY3RzIGZvciBhIG11bHRpcGxlLW9iamVjdHMgYnVpbGQuCi0jICAgQkFTRV9FWFRfT0JKOiBBIGxpc3Qgb2YgYmFzZSBsYXllciBleHRlbnNpb25zLCBpLmUuLCBjb21wb25lbnRzIGZvdW5kCi0jICAgICAgICAgICAgICAgICBpbiBgc3JjL2Jhc2UnIHdoaWNoIGFyZSBub3QgY29tcGlsZWQgd2l0aGluIHRoZSBiYXNlCi0jICAgICAgICAgICAgICAgICBsYXllciBwcm9wZXIuCi0KLQotQkFTRV9DT01QSUxFIDo9ICQoQ0MpICQoQU5TSUZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKEJBU0VfRElSKSkgXAotICAgICAgICAgICAgICAgICAgICAgICQoSU5DTFVERV9GTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICQoRlRfQ0ZMQUdTKQotCi0KLSMgQmFzZSBsYXllciBzb3VyY2VzCi0jCi0jICAgZnRzeXN0ZW0sIGZ0aW5pdCwgYW5kIGZ0ZGVidWcgYXJlIGhhbmRsZWQgYnkgZnJlZXR5cGUubWsKLSMKLSMgQWxsIGZpbGVzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBgZnRiYXNlLmMnIChmb3IgYSBgc2luZ2xlJwotIyBidWlsZCkuCi0jCi1CQVNFX1NSQyA6PSAkKEJBU0VfRElSKS9iYXNlcGljLmMgIFwKLSAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0YWR2YW5jLmMgXAotICAgICAgICAgICAgJChCQVNFX0RJUikvZnRjYWxjLmMgICBcCi0gICAgICAgICAgICAkKEJBU0VfRElSKS9mdGRiZ21lbS5jIFwKLSAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0Z2xvYWRyLmMgXAotICAgICAgICAgICAgJChCQVNFX0RJUikvZnRoYXNoLmMgICBcCi0gICAgICAgICAgICAkKEJBU0VfRElSKS9mdG9ianMuYyAgIFwKLSAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0b3V0bG4uYyAgXAotICAgICAgICAgICAgJChCQVNFX0RJUikvZnRwaWMuYyAgICBcCi0gICAgICAgICAgICAkKEJBU0VfRElSKS9mdHJmb3JrLmMgIFwKLSAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0c25hbWVzLmMgXAotICAgICAgICAgICAgJChCQVNFX0RJUikvZnRzdHJlYW0uYyBcCi0gICAgICAgICAgICAkKEJBU0VfRElSKS9mdHRyaWdvbi5jIFwKLSAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0dXRpbC5jCi0KLQotaWZuZXEgKCQoZnRtYWNfYyksKQotICBCQVNFX1NSQyArPSAkKEJBU0VfRElSKS8kKGZ0bWFjX2MpCi1lbmRpZgotCi0jIGZvciBzaW1wbGljaXR5LCB3ZSBhbHNvIGhhbmRsZSBgbWQ1LmMnICh3aGljaCBnZXRzIGluY2x1ZGVkIGJ5IGBmdG9ianMuaCcpCi1CQVNFX0ggOj0gJChCQVNFX0RJUikvYmFzZXBpYy5oIFwKLSAgICAgICAgICAkKEJBU0VfRElSKS9mdGJhc2UuaCAgXAotICAgICAgICAgICQoQkFTRV9ESVIpL21kNS5jICAgICBcCi0gICAgICAgICAgJChCQVNFX0RJUikvbWQ1LmgKLQotIyBCYXNlIGxheWVyIGBleHRlbnNpb25zJyBzb3VyY2VzCi0jCi0jIEFuIGV4dGVuc2lvbiBpcyBhZGRlZCB0byB0aGUgbGlicmFyeSBmaWxlIGFzIGEgc2VwYXJhdGUgb2JqZWN0LiAgSXQgaXMKLSMgdGhlbiBsaW5rZWQgdG8gdGhlIGZpbmFsIGV4ZWN1dGFibGUgb25seSBpZiBvbmUgb2YgaXRzIHN5bWJvbHMgaXMgdXNlZCBieQotIyB0aGUgYXBwbGljYXRpb24uCi0jCi1CQVNFX0VYVF9TUkMgOj0gJChwYXRzdWJzdCAlLCQoQkFTRV9ESVIpLyUsJChCQVNFX0VYVEVOU0lPTlMpKQotCi0jIERlZmF1bHQgZXh0ZW5zaW9ucyBvYmplY3RzCi0jCi1CQVNFX0VYVF9PQkogOj0gJChCQVNFX0VYVF9TUkM6JChCQVNFX0RJUikvJS5jPSQoT0JKX0RJUikvJS4kTykKLQotCi0jIEJhc2UgbGF5ZXIgb2JqZWN0KHMpCi0jCi0jICAgQkFTRV9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcyAoZWFjaCBiYXNlIHNvdXJjZSBmaWxlIGNvbXBpbGVzCi0jICAgdG8gYSBzaW5nbGUgb2JqZWN0IGZpbGUpLgotIwotIyAgIEJBU0VfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHNpbmdsZScgYnVpbGRzICh0aGUgd2hvbGUgYmFzZSBsYXllciBpcwotIyAgIGNvbXBpbGVkIGFzIGEgc2luZ2xlIG9iamVjdCBmaWxlIHVzaW5nIGZ0YmFzZS5jKS4KLSMKLUJBU0VfT0JKX00gOj0gJChCQVNFX1NSQzokKEJBU0VfRElSKS8lLmM9JChPQkpfRElSKS8lLiRPKQotQkFTRV9PQkpfUyA6PSAkKE9CSl9ESVIpL2Z0YmFzZS4kTwotCi0jIEJhc2UgbGF5ZXIgcm9vdCBzb3VyY2UgZmlsZSBmb3Igc2luZ2xlIGJ1aWxkCi0jCi1CQVNFX1NSQ19TIDo9ICQoQkFTRV9ESVIpL2Z0YmFzZS5jCi0KLQotIyBCYXNlIGxheWVyIC0gc2luZ2xlIG9iamVjdCBidWlsZAotIwotJChCQVNFX09CSl9TKTogJChCQVNFX1NSQ19TKSAkKEJBU0VfU1JDKSAkKEZSRUVUWVBFX0gpICQoQkFTRV9IKQotCSQoQkFTRV9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChCQVNFX1NSQ19TKSkKLQotCi0jIE11bHRpcGxlIG9iamVjdHMgYnVpbGQgKyBleHRlbnNpb25zCi0jCi0kKE9CSl9ESVIpLyUuJE86ICQoQkFTRV9ESVIpLyUuYyAkKEZSRUVUWVBFX0gpICQoQkFTRV9IKQotCSQoQkFTRV9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9iZGYvSmFtZmlsZSBiL3NyYy9iZGYvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4MmI1MS4uMDAwMDAwMAotLS0gYS9zcmMvYmRmL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL2JkZiBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAyLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgYmRmIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBiZGZkcml2cgotICAgICAgICAgICAgICAgYmRmbGliCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBiZGYgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvYmRmIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9iZGYvUkVBRE1FIGIvc3JjL2JkZi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NjFhYmEuLjAwMDAwMDAKLS0tIGEvc3JjL2JkZi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotICAgICAgICAgICAgICAgICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgZm9yIEJERiBmb250cwotCi0gICAgICAgICAgICAgICAgICAgICAgIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotICAgICAgICAgICAgICAgICAgPGZyYW5jZXNjby56YXBwYS5uYXJkZWxsaUBlbnMuZnI+Ci0KLQotSW50cm9kdWN0aW9uCi0qKioqKioqKioqKioKLQotQkRGIChCaXRtYXAgRGlzdHJpYnV0aW9uIEZvcm1hdCkgaXMgYSBiaXRtYXAgZm9udCBmb3JtYXQgZGVmaW5lZCBieSBBZG9iZSwKLXdoaWNoIGlzIGludGVuZGVkIHRvIGJlIGVhc2lseSB1bmRlcnN0b29kIGJ5IGJvdGggaHVtYW5zIGFuZCBjb21wdXRlcnMuCi1UaGlzIGNvZGUgaW1wbGVtZW50cyBhIEJERiBkcml2ZXIgZm9yIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LCBmb2xsb3dpbmcgdGhlCi1BZG9iZSBTcGVjaWZpY2F0aW9uIFYgMi4yLiAgVGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEJERiBmb250IGZvcm1hdCBpcwotYXZhaWxhYmxlIGZyb20gQWRvYmUncyB3ZWIgc2l0ZToKLQotICBodHRwOi8vcGFydG5lcnMuYWRvYmUuY29tL3B1YmxpYy9kZXZlbG9wZXIvZW4vZm9udC81MDA1LkJERl9TcGVjLnBkZgotCi1NYW55IGdvb2QgYml0bWFwIGZvbnRzIGluIGJkZiBmb3JtYXQgY29tZSB3aXRoIFhGcmVlODYgKHd3dy5YRnJlZTg2Lm9yZykuCi1UaGV5IGRvIG5vdCBkZWZpbmUgdmVydGljYWwgbWV0cmljcywgYmVjYXVzZSB0aGUgWCBDb25zb3J0aXVtIEJERgotc3BlY2lmaWNhdGlvbiBoYXMgcmVtb3ZlZCB0aGVtLgotCi0KLUVuY29kaW5ncwotKioqKioqKioqCi0KLVRoZSB2YXJpZXR5IG9mIGVuY29kaW5ncyB0aGF0IGFjY29tcGFuaWVzIGJkZiBmb250cyBhcHBlYXJzIHRvIGVuY29tcGFzcyB0aGUKLXNtYWxsIHNldCBkZWZpbmVkIGluIGZyZWV0eXBlLmguICBPbiB0aGUgb3RoZXIgaGFuZCwgdHdvIHByb3BlcnRpZXMgdGhhdAotc3BlY2lmeSBlbmNvZGluZyBhbmQgcmVnaXN0cnkgYXJlIHVzdWFsbHkgZGVmaW5lZCBpbiBiZGYgZm9udHMuCi0KLUkgZGVjaWRlZCB0byBtYWtlIHRoZXNlIHR3byBwcm9wZXJ0aWVzIGRpcmVjdGx5IGFjY2Vzc2libGUsIGxlYXZpbmcgdG8gdGhlCi1jbGllbnQgYXBwbGljYXRpb24gdGhlIHdvcmsgb2YgaW50ZXJwcmV0aW5nIHRoZW0uICBGb3IgaW5zdGFuY2U6Ci0KLQotICAjaW5jbHVkZSBGVF9JTlRFUk5BTF9CREZfVFlQRVNfSAotCi0gIEZUX0ZhY2UgICAgICAgICAgZmFjZTsKLSAgQkRGX1B1YmxpY19GYWNlICBiZGZmYWNlOwotCi0KLSAgRlRfTmV3X0ZhY2UoIGxpYnJhcnksIC4uLiwgJmZhY2UgKTsKLQotICBiZGZmYWNlID0gKEJERl9QdWJsaWNfRmFjZSlmYWNlOwotCi0gIGlmICggKCBiZGZmYWNlLT5jaGFyc2V0X3JlZ2lzdHJ5ID09ICJJU08xMDY0NiIgKSAmJgotICAgICAgICggYmRmZmFjZS0+Y2hhcnNldF9lbmNvZGluZyA9PSAiMSIgKSAgICAgICAgKQotICAgIFsuLl0KLQotCi1UaHVzIHRoZSBkcml2ZXIgYWx3YXlzIGV4cG9ydHMgYGZ0X2VuY29kaW5nX25vbmUnIGFzIGZhY2UtPmNoYXJtYXAuZW5jb2RpbmcuCi1GVF9HZXRfQ2hhcl9JbmRleCdzIGJlaGF2aW9yIGlzIHVubW9kaWZpZWQsIHRoYXQgaXMsIGl0IGNvbnZlcnRzIHRoZSBVTG9uZwotdmFsdWUgZ2l2ZW4gYXMgYXJndW1lbnQgaW50byB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBudW1iZXIuCi0KLUlmIHRoZSB0d28gcHJvcGVydGllcyBhcmUgbm90IGF2YWlsYWJsZSwgQWRvYmUgU3RhbmRhcmQgRW5jb2Rpbmcgc2hvdWxkIGJlCi1hc3N1bWVkLgotCi0KLUFudGktQWxpYXNlZCBCaXRtYXBzCi0qKioqKioqKioqKioqKioqKioqKgotCi1UaGUgZHJpdmVyIHN1cHBvcnRzIGFuIGV4dGVuc2lvbiB0byB0aGUgQkRGIGZvcm1hdCBhcyB1c2VkIGluIE1hcmsgTGVpc2hlcidzCi14bWJkZmVkIGJpdG1hcCBmb250IGVkaXRvci4gIE1pY3Jvc29mdCdzIFNCSVQgdG9vbCBleHBlY3RzIGJpdG1hcCBmb250cyBpbgotdGhhdCBmb3JtYXQgZm9yIGFkZGluZyBhbnRpLWFsaWFzZWQgdGhlbSB0byBUcnVlVHlwZSBmb250cy4gIEl0IGludHJvZHVjZXMgYQotZm91cnRoIGZpZWxkIHRvIHRoZSBgU0laRScga2V5d29yZCB3aGljaCBnaXZlcyB0aGUgYnBwIHZhbHVlIChiaXRzIHBlcgotcGl4ZWwpIG9mIHRoZSBnbHlwaCBkYXRhIGluIHRoZSBmb250LiAgUG9zc2libGUgdmFsdWVzIGFyZSAxICh0aGUgZGVmYXVsdCksCi0yIChmb3VyIGdyYXkgbGV2ZWxzKSwgNCAoMTYgZ3JheSBsZXZlbHMpLCBhbmQgOCAoMjU2IGdyYXkgbGV2ZWxzKS4gIFRoZQotZHJpdmVyIHJldHVybnMgZWl0aGVyIGEgYml0bWFwIHdpdGggMSBiaXQgcGVyIHBpeGVsIG9yIGEgcGl4bWFwIHdpdGggOGJpdHMKLXBlciBwaXhlbCAodXNpbmcgNCwgMTYsIGFuZCAyNTYgZ3JheSBsZXZlbHMsIHJlc3BlY3RpdmVseSkuCi0KLQotS25vd24gcHJvYmxlbXMKLSoqKioqKioqKioqKioqCi0KLS0gQSBmb250IGlzIGVudGlyZWx5IGxvYWRlZCBpbnRvIG1lbW9yeS4gIE9idmlvdXNseSwgdGhpcyBpcyBub3QgdGhlIFJpZ2h0Ci0gIFRoaW5nKFRNKS4gIElmIHlvdSBoYXZlIGJpZyBmb250cyBJIHN1Z2dlc3QgeW91IGNvbnZlcnQgdGhlbSBpbnRvIFBDRgotICBmb3JtYXQgKHVzaW5nIHRoZSBiZGZ0b3BjZiB1dGlsaXR5KTogdGhlIFBDRiBmb250IGRyaXZlIG9mIEZyZWVUeXBlIGNhbgotICBwZXJmb3JtIGluY3JlbWVudGFsIGdseXBoIGxvYWRpbmcuCi0KLVdoZW4gSSBoYXZlIHNvbWUgdGltZSwgSSB3aWxsIGltcGxlbWVudCBvbi1kZW1hbmQgZ2x5cGggcGFyc2luZy4KLQotLSBFeGNlcHQgZm9yIGVuY29kaW5ncyBwcm9wZXJ0aWVzLCBjbGllbnQgYXBwbGljYXRpb25zIGhhdmUgbm8gdmlzaWJpbGl0eSBvZgotICB0aGUgUENGX0ZhY2Ugb2JqZWN0LiAgVGhpcyBtZWFucyB0aGF0IGFwcGxpY2F0aW9ucyBjYW5ub3QgZGlyZWN0bHkgYWNjZXNzCi0gIGZvbnQgdGFibGVzIGFuZCBtdXN0IHRydXN0IEZyZWVUeXBlLgotCi0tIEN1cnJlbnRseSwgZ2x5cGggbmFtZXMgYXJlIGlnbm9yZWQuCi0KLSAgSSBwbGFuIHRvIGdpdmUgZnVsbCB2aXNpYmlsaXR5IG9mIHRoZSBCREZfRmFjZSBvYmplY3QgaW4gYW4gdXBjb21pbmcKLSAgcmV2aXNpb24gb2YgdGhlIGRyaXZlciwgdGh1cyBpbXBsZW1lbnRpbmcgYWxzbyBnbHlwaCBuYW1lcy4KLQotLSBBcyBJIGhhdmUgbmV2ZXIgc2VlbiBhIEJERiBmb250IHRoYXQgZGVmaW5lcyB2ZXJ0aWNhbCBtZXRyaWNzLCB2ZXJ0aWNhbAotICBtZXRyaWNzIGFyZSAocGFyc2VkIGFuZCkgZGlzY2FyZGVkLiAgSWYgeW91IG93biBhIEJERiBmb250IHRoYXQgZGVmaW5lcwotICB2ZXJ0aWNhbCBtZXRyaWNzLCBwbGVhc2UgbGV0IG1lIGtub3cgKEkgd2lsbCBpbXBsZW1lbnQgdGhlbSBpbiA1LTEwCi0gIG1pbnV0ZXMpLgotCi0KLUxpY2Vuc2UKLSoqKioqKioKLQotQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgYnkgRnJhbmNlc2NvIFphcHBhIE5hcmRlbGxpCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0iU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi13aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi1kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQotaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi1JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLVRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi1TT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotKioqIFBvcnRpb25zIG9mIHRoZSBkcml2ZXIgKHRoYXQgaXMsIGJkZmxpYi5jIGFuZCBiZGYuaCk6Ci0KLUNvcHlyaWdodCAyMDAwIENvbXB1dGluZyBSZXNlYXJjaCBMYWJzLCBOZXcgTWV4aWNvIFN0YXRlIFVuaXZlcnNpdHkKLUNvcHlyaWdodCAyMDAxLTIwMDIsIDIwMTEgRnJhbmNlc2NvIFphcHBhIE5hcmRlbGxpCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi1hbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLVNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi1hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi1USEUgQ09NUFVUSU5HIFJFU0VBUkNIIExBQiBPUiBORVcgTUVYSUNPIFNUQVRFIFVOSVZFUlNJVFkgQkUgTElBQkxFIEZPUiBBTlkKLUNMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQKLU9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUgotVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLQotQ3JlZGl0cwotKioqKioqKgotCi1UaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBleGNlbGxlbnQgTWFyayBMZWlzaGVyJ3MgYmRmIGxpYnJhcnkuICBJZiB5b3UKLWZpbmQgc29tZXRoaW5nIGdvb2QgaW4gdGhpcyBkcml2ZXIgeW91IHNob3VsZCBwcm9iYWJseSB0aGFuayBoaW0sIG5vdAotbWUuCmRpZmYgLS1naXQgYS9zcmMvYmRmL2JkZi5jIGIvc3JjL2JkZi9iZGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZGY2Ni4uMDAwMDAwMAotLS0gYS9zcmMvYmRmL2JkZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogIGJkZi5jCi0KLSAgICBGcmVlVHlwZSBmb250IGRyaXZlciBmb3IgYmRmIGZpbGVzCi0KLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgYnkKLSAgICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotVEhFIFNPRlRXQVJFLgotKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAiYmRmbGliLmMiCi0jaW5jbHVkZSAiYmRmZHJpdnIuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iZGYvYmRmLmggYi9zcmMvYmRmL2JkZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDEyNzI3Li4wMDAwMDAwCi0tLSBhL3NyYy9iZGYvYmRmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAwIENvbXB1dGluZyBSZXNlYXJjaCBMYWJzLCBOZXcgTWV4aWNvIFN0YXRlIFVuaXZlcnNpdHkKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQsIDIwMTEgRnJhbmNlc2NvIFphcHBhIE5hcmRlbGxpCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQ09NUFVUSU5HIFJFU0VBUkNIIExBQiBPUiBORVcgTUVYSUNPIFNUQVRFIFVOSVZFUlNJVFkgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQKLSAqIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUgotICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKi8KLQotCi0jaWZuZGVmIEJERl9IXwotI2RlZmluZSBCREZfSF8KLQotCi0vKgotICogQmFzZWQgb24gYmRmLmgsdiAxLjE2IDIwMDAvMDMvMTYgMjA6MDg6NTEgbWxlaXNoZXIKLSAqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0hBU0hfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLS8qIEltcG9ydGVkIGZyb20gYmRmUC5oICovCi0KLSNkZWZpbmUgX2JkZl9nbHlwaF9tb2RpZmllZCggbWFwLCBlICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAobWFwKVsoZSkgPj4gNV0gJiAoIDFVTCA8PCAoIChlKSAmIDMxICkgKSApCi0jZGVmaW5lIF9iZGZfc2V0X2dseXBoX21vZGlmaWVkKCBtYXAsIGUgKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKG1hcClbKGUpID4+IDVdIHw9ICggMVVMIDw8ICggKGUpICYgMzEgKSApICkKLSNkZWZpbmUgX2JkZl9jbGVhcl9nbHlwaF9tb2RpZmllZCggbWFwLCBlICkgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAobWFwKVsoZSkgPj4gNV0gJj0gfiggMVVMIDw8ICggKGUpICYgMzEgKSApICkKLQotLyogZW5kIG9mIGJkZlAuaCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCREYgZm9udCBvcHRpb25zIG1hY3JvcyBhbmQgdHlwZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgQkRGX0NPUlJFQ1RfTUVUUklDUyAgMHgwMSAvKiBDb3JyZWN0IGludmFsaWQgbWV0cmljcyB3aGVuIGxvYWRpbmcuICovCi0jZGVmaW5lIEJERl9LRUVQX0NPTU1FTlRTICAgIDB4MDIgLyogUHJlc2VydmUgdGhlIGZvbnQgY29tbWVudHMuICAgICAgICAgICAqLwotI2RlZmluZSBCREZfS0VFUF9VTkVOQ09ERUQgICAweDA0IC8qIEtlZXAgdGhlIHVuZW5jb2RlZCBnbHlwaHMuICAgICAgICAgICAgKi8KLSNkZWZpbmUgQkRGX1BST1BPUlRJT05BTCAgICAgMHgwOCAvKiBGb250IGhhcyBwcm9wb3J0aW9uYWwgc3BhY2luZy4gICAgICAgICovCi0jZGVmaW5lIEJERl9NT05PV0lEVEggICAgICAgIDB4MTAgLyogRm9udCBoYXMgbW9ubyB3aWR0aC4gICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBCREZfQ0hBUkNFTEwgICAgICAgICAweDIwIC8qIEZvbnQgaGFzIGNoYXJjZWxsIHNwYWNpbmcuICAgICAgICAgICAgKi8KLQotI2RlZmluZSBCREZfQUxMX1NQQUNJTkcgICggQkRGX1BST1BPUlRJT05BTCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJERl9NT05PV0lEVEggICAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCREZfQ0hBUkNFTEwgICAgICkKLQotI2RlZmluZSBCREZfREVGQVVMVF9MT0FEX09QVElPTlMgICggQkRGX0NPUlJFQ1RfTUVUUklDUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJERl9LRUVQX0NPTU1FTlRTICAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCREZfS0VFUF9VTkVOQ09ERUQgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRGX1BST1BPUlRJT05BTCAgICApCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgYmRmX29wdGlvbnNfdF8KLSAgewotICAgIGludCAgICAgICAgICAgIGNvcnJlY3RfbWV0cmljczsKLSAgICBpbnQgICAgICAgICAgICBrZWVwX3VuZW5jb2RlZDsKLSAgICBpbnQgICAgICAgICAgICBrZWVwX2NvbW1lbnRzOwotICAgIGludCAgICAgICAgICAgIGZvbnRfc3BhY2luZzsKLQotICB9IGJkZl9vcHRpb25zX3Q7Ci0KLQotICAvKiBDYWxsYmFjayBmdW5jdGlvbiB0eXBlIGZvciB1bmtub3duIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gKi8KLSAgdHlwZWRlZiBpbnQKLSAgKCpiZGZfb3B0aW9uc19jYWxsYmFja190KSggYmRmX29wdGlvbnNfdCogIG9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiAgICAgICAgICBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBucGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgY2xpZW50X2RhdGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQkRGIGZvbnQgcHJvcGVydHkgbWFjcm9zIGFuZCB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEJERl9BVE9NICAgICAgMQotI2RlZmluZSBCREZfSU5URUdFUiAgIDIKLSNkZWZpbmUgQkRGX0NBUkRJTkFMICAzCi0KLQotICAvKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgcGFydGljdWxhciBwcm9wZXJ0eSBvZiBhIGZvbnQuICovCi0gIC8qIFRoZXJlIGFyZSBhIHNldCBvZiBkZWZhdWx0cyBhbmQgZWFjaCBmb250IGhhcyB0aGVpciBvd24uICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIGJkZl9wcm9wZXJ0eV90XwotICB7Ci0gICAgY2hhciogIG5hbWU7ICAgICAgICAgLyogTmFtZSBvZiB0aGUgcHJvcGVydHkuICAgKi8KLSAgICBpbnQgICAgZm9ybWF0OyAgICAgICAvKiBGb3JtYXQgb2YgdGhlIHByb3BlcnR5LiAqLwotICAgIGludCAgICBidWlsdGluOyAgICAgIC8qIEEgYnVpbHRpbiBwcm9wZXJ0eS4gICAgICovCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBjaGFyKiAgICAgICAgICBhdG9tOwotICAgICAgbG9uZyAgICAgICAgICAgbDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgIHVsOwotCi0gICAgfSB2YWx1ZTsgICAgICAgICAgICAgLyogVmFsdWUgb2YgdGhlIHByb3BlcnR5LiAgKi8KLQotICB9IGJkZl9wcm9wZXJ0eV90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCREYgZm9udCBtZXRyaWMgYW5kIGdseXBoIHR5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIGJkZl9iYnhfdF8KLSAgewotICAgIHVuc2lnbmVkIHNob3J0ICB3aWR0aDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgaGVpZ2h0OwotCi0gICAgc2hvcnQgICAgICAgICAgIHhfb2Zmc2V0OwotICAgIHNob3J0ICAgICAgICAgICB5X29mZnNldDsKLQotICAgIHNob3J0ICAgICAgICAgICBhc2NlbnQ7Ci0gICAgc2hvcnQgICAgICAgICAgIGRlc2NlbnQ7Ci0KLSAgfSBiZGZfYmJ4X3Q7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgYmRmX2dseXBoX3RfCi0gIHsKLSAgICBjaGFyKiAgICAgICAgICAgbmFtZTsgICAgICAgIC8qIEdseXBoIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGxvbmcgICAgICAgICAgICBlbmNvZGluZzsgICAgLyogR2x5cGggZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdW5zaWduZWQgc2hvcnQgIHN3aWR0aDsgICAgICAvKiBTY2FsYWJsZSB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCAgZHdpZHRoOyAgICAgIC8qIERldmljZSB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGJkZl9iYnhfdCAgICAgICBiYng7ICAgICAgICAgLyogR2x5cGggYm91bmRpbmcgYm94LiAgICAgICAgICAgICAgICAgICovCi0gICAgdW5zaWduZWQgY2hhciogIGJpdG1hcDsgICAgICAvKiBHbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgYnByOyAgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB1c2VkIHBlciByb3cuICAgICAgICAqLwotICAgIHVuc2lnbmVkIHNob3J0ICBieXRlczsgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIHRoZSBiaXRtYXAuICovCi0KLSAgfSBiZGZfZ2x5cGhfdDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBiZGZfZ2x5cGhsaXN0X3RfCi0gIHsKLSAgICB1bnNpZ25lZCBzaG9ydCAgcGFkOyAgICAgICAgICAvKiBQYWQgdG8gNC1ieXRlIGJvdW5kYXJ5LiAgICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCAgYnBwOyAgICAgICAgICAvKiBCaXRzIHBlciBwaXhlbC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBsb25nICAgICAgICAgICAgc3RhcnQ7ICAgICAgICAvKiBCZWdpbm5pbmcgZW5jb2RpbmcgdmFsdWUgb2YgZ2x5cGhzLiAgKi8KLSAgICBsb25nICAgICAgICAgICAgZW5kOyAgICAgICAgICAvKiBFbmRpbmcgZW5jb2RpbmcgdmFsdWUgb2YgZ2x5cGhzLiAgICAgKi8KLSAgICBiZGZfZ2x5cGhfdCogICAgZ2x5cGhzOyAgICAgICAvKiBHbHlwaHMgdGhlbXNlbHZlcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgZ2x5cGhzX3NpemU7ICAvKiBHbHlwaCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZC4gICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgZ2x5cGhzX3VzZWQ7ICAvKiBHbHlwaCBzdHJ1Y3R1cmVzIHVzZWQuICAgICAgICAgICAgICAgKi8KLSAgICBiZGZfYmJ4X3QgICAgICAgYmJ4OyAgICAgICAgICAvKiBPdmVyYWxsIGJvdW5kaW5nIGJveCBvZiBnbHlwaHMuICAgICAgKi8KLQotICB9IGJkZl9nbHlwaGxpc3RfdDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBiZGZfZm9udF90XwotICB7Ci0gICAgY2hhciogICAgICAgICAgICBuYW1lOyAgICAgICAgICAgLyogTmFtZSBvZiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAgKi8KLSAgICBiZGZfYmJ4X3QgICAgICAgIGJieDsgICAgICAgICAgICAvKiBGb250IGJvdW5kaW5nIGJveC4gICAgICAgICAgICAgICAgICAqLwotCi0gICAgdW5zaWduZWQgbG9uZyAgICBwb2ludF9zaXplOyAgICAgLyogUG9pbnQgc2l6ZSBvZiB0aGUgZm9udC4gICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgIHJlc29sdXRpb25feDsgICAvKiBGb250IGhvcml6b250YWwgcmVzb2x1dGlvbi4gICAgICAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgICAgcmVzb2x1dGlvbl95OyAgIC8qIEZvbnQgdmVydGljYWwgcmVzb2x1dGlvbi4gICAgICAgICAgICovCi0KLSAgICBpbnQgICAgICAgICAgICAgIHNwYWNpbmc7ICAgICAgICAvKiBGb250IHNwYWNpbmcgdmFsdWUuICAgICAgICAgICAgICAgICAqLwotCi0gICAgdW5zaWduZWQgc2hvcnQgICBtb25vd2lkdGg7ICAgICAgLyogTG9naWNhbCB3aWR0aCBmb3IgbW9ub3dpZHRoIGZvbnQuICAgKi8KLQotICAgIGxvbmcgICAgICAgICAgICAgZGVmYXVsdF9jaGFyOyAgIC8qIEVuY29kaW5nIG9mIHRoZSBkZWZhdWx0IGdseXBoLiAgICAgICovCi0KLSAgICBsb25nICAgICAgICAgICAgIGZvbnRfYXNjZW50OyAgICAvKiBGb250IGFzY2VudC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGxvbmcgICAgICAgICAgICAgZm9udF9kZXNjZW50OyAgIC8qIEZvbnQgZGVzY2VudC4gICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB1bnNpZ25lZCBsb25nICAgIGdseXBoc19zaXplOyAgICAvKiBHbHlwaCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZC4gICAgICAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgICAgZ2x5cGhzX3VzZWQ7ICAgIC8qIEdseXBoIHN0cnVjdHVyZXMgdXNlZC4gICAgICAgICAgICAgICovCi0gICAgYmRmX2dseXBoX3QqICAgICBnbHlwaHM7ICAgICAgICAgLyogR2x5cGhzIHRoZW1zZWx2ZXMuICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHVuc2lnbmVkIGxvbmcgICAgdW5lbmNvZGVkX3NpemU7IC8qIFVuZW5jb2RlZCBnbHlwaCBzdHJ1Y3QuIGFsbG9jYXRlZC4gICovCi0gICAgdW5zaWduZWQgbG9uZyAgICB1bmVuY29kZWRfdXNlZDsgLyogVW5lbmNvZGVkIGdseXBoIHN0cnVjdC4gdXNlZC4gICAgICAgKi8KLSAgICBiZGZfZ2x5cGhfdCogICAgIHVuZW5jb2RlZDsgICAgICAvKiBVbmVuY29kZWQgZ2x5cGhzIHRoZW1zZWx2ZXMuICAgICAgICAqLwotCi0gICAgdW5zaWduZWQgbG9uZyAgICBwcm9wc19zaXplOyAgICAgLyogRm9udCBwcm9wZXJ0aWVzIGFsbG9jYXRlZC4gICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgIHByb3BzX3VzZWQ7ICAgICAvKiBGb250IHByb3BlcnRpZXMgdXNlZC4gICAgICAgICAgICAgICAqLwotICAgIGJkZl9wcm9wZXJ0eV90KiAgcHJvcHM7ICAgICAgICAgIC8qIEZvbnQgcHJvcGVydGllcyB0aGVtc2VsdmVzLiAgICAgICAgICovCi0KLSAgICBjaGFyKiAgICAgICAgICAgIGNvbW1lbnRzOyAgICAgICAvKiBGb250IGNvbW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgICAgY29tbWVudHNfbGVuOyAgIC8qIExlbmd0aCBvZiBjb21tZW50IHN0cmluZy4gICAgICAgICAgICovCi0KLSAgICBiZGZfZ2x5cGhsaXN0X3QgIG92ZXJmbG93OyAgICAgICAvKiBTdG9yYWdlIHVzZWQgZm9yIGdseXBoIGluc2VydGlvbi4gICAqLwotCi0gICAgdm9pZCogICAgICAgICAgICBpbnRlcm5hbDsgICAgICAgLyogSW50ZXJuYWwgZGF0YSBmb3IgdGhlIGZvbnQuICAgICAgICAgKi8KLQotICAgIC8qIFRoZSBzaXplIG9mIHRoZSBuZXh0IHR3byBhcnJheXMgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlICovCi0gICAgLyogc2l6ZSBvZiB0aGUgYGhhdmUnIGFycmF5IGluIHRoZSBgYmRmX3BhcnNlX3QnIHN0cnVjdHVyZS4gKi8KLSAgICB1bnNpZ25lZCBsb25nICAgIG5tb2RbMzQ4MTZdOyAgICAvKiBCaXRtYXAgaW5kaWNhdGluZyBtb2RpZmllZCBnbHlwaHMuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgICAgdW1vZFszNDgxNl07ICAgIC8qIEJpdG1hcCBpbmRpY2F0aW5nIG1vZGlmaWVkICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5lbmNvZGVkIGdseXBocy4gICAgICAgICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCAgIG1vZGlmaWVkOyAgICAgICAvKiBCb29sZWFuIGluZGljYXRpbmcgZm9udCBtb2RpZmllZC4gICAqLwotICAgIHVuc2lnbmVkIHNob3J0ICAgYnBwOyAgICAgICAgICAgIC8qIEJpdHMgcGVyIHBpeGVsLiAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeTsKLQotICAgIGJkZl9wcm9wZXJ0eV90KiAgdXNlcl9wcm9wczsKLSAgICB1bnNpZ25lZCBsb25nICAgIG51c2VyX3Byb3BzOwotICAgIEZUX0hhc2hSZWMgICAgICAgcHJvcHRibDsKLQotICB9IGJkZl9mb250X3Q7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFR5cGVzIGZvciBsb2FkL3NhdmUgY2FsbGJhY2tzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBFcnJvciBjb2Rlcy4gKi8KLSNkZWZpbmUgQkRGX01JU1NJTkdfU1RBUlQgICAgICAgLTEKLSNkZWZpbmUgQkRGX01JU1NJTkdfRk9OVE5BTUUgICAgLTIKLSNkZWZpbmUgQkRGX01JU1NJTkdfU0laRSAgICAgICAgLTMKLSNkZWZpbmUgQkRGX01JU1NJTkdfQ0hBUlMgICAgICAgLTQKLSNkZWZpbmUgQkRGX01JU1NJTkdfU1RBUlRDSEFSICAgLTUKLSNkZWZpbmUgQkRGX01JU1NJTkdfRU5DT0RJTkcgICAgLTYKLSNkZWZpbmUgQkRGX01JU1NJTkdfQkJYICAgICAgICAgLTcKLQotI2RlZmluZSBCREZfT1VUX09GX01FTU9SWSAgICAgIC0yMAotCi0jZGVmaW5lIEJERl9JTlZBTElEX0xJTkUgICAgICAtMTAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJERiBmb250IEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYmRmX2xvYWRfZm9udCggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgYmRmX29wdGlvbnNfdCogIG9wdHMsCi0gICAgICAgICAgICAgICAgIGJkZl9mb250X3QqICAgICpmb250ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBiZGZfZnJlZV9mb250KCBiZGZfZm9udF90KiAgZm9udCApOwotCi0gIEZUX0xPQ0FMKCBiZGZfcHJvcGVydHlfdCAqICkKLSAgYmRmX2dldF9wcm9wZXJ0eSggY2hhciogICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGJkZl9mb250X3QqICBmb250ICk7Ci0KLSAgRlRfTE9DQUwoIGJkZl9wcm9wZXJ0eV90ICogKQotICBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGJkZl9mb250X3QqICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBuYW1lICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBCREZfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iZGYvYmRmZHJpdnIuYyBiL3NyYy9iZGYvYmRmZHJpdnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlNmVlYS4uMDAwMDAwMAotLS0gYS9zcmMvYmRmL2JkZmRyaXZyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ODYgKzAsMCBAQAotLyogIGJkZmRyaXZyLmMKLQotICAgIEZyZWVUeXBlIGZvbnQgZHJpdmVyIGZvciBiZGYgZmlsZXMKLQotICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4LCAyMDExLCAyMDEzLCAyMDE0IGJ5Ci0gICAgRnJhbmNlc2NvIFphcHBhIE5hcmRlbGxpCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi1hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KLVRIRSBTT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9CREZfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9CREZfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICi0KLSNpbmNsdWRlICJiZGYuaCIKLSNpbmNsdWRlICJiZGZkcml2ci5oIgotCi0jaW5jbHVkZSAiYmRmZXJyb3IuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2JkZmRyaXZlcgotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEJERl9DTWFwUmVjXwotICB7Ci0gICAgRlRfQ01hcFJlYyAgICAgICAgY21hcDsKLSAgICBGVF9VTG9uZyAgICAgICAgICBudW1fZW5jb2RpbmdzOyAvKiBmdG9ianMuaDogRlRfQ01hcC0+Y2xhenotPnNpemUgKi8KLSAgICBCREZfZW5jb2RpbmdfZWwqICBlbmNvZGluZ3M7Ci0KLSAgfSBCREZfQ01hcFJlYywgKkJERl9DTWFwOwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGJkZl9jbWFwX2luaXQoIEZUX0NNYXAgICAgIGJkZmNtYXAsCi0gICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGluaXRfZGF0YSApCi0gIHsKLSAgICBCREZfQ01hcCAgY21hcCA9IChCREZfQ01hcCliZGZjbWFwOwotICAgIEJERl9GYWNlICBmYWNlID0gKEJERl9GYWNlKUZUX0NNQVBfRkFDRSggY21hcCApOwotICAgIEZUX1VOVVNFRCggaW5pdF9kYXRhICk7Ci0KLQotICAgIGNtYXAtPm51bV9lbmNvZGluZ3MgPSBmYWNlLT5iZGZmb250LT5nbHlwaHNfdXNlZDsKLSAgICBjbWFwLT5lbmNvZGluZ3MgICAgID0gZmFjZS0+ZW5fdGFibGU7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBiZGZfY21hcF9kb25lKCBGVF9DTWFwICBiZGZjbWFwICkKLSAgewotICAgIEJERl9DTWFwICBjbWFwID0gKEJERl9DTWFwKWJkZmNtYXA7Ci0KLQotICAgIGNtYXAtPmVuY29kaW5ncyAgICAgPSBOVUxMOwotICAgIGNtYXAtPm51bV9lbmNvZGluZ3MgPSAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICBiZGZfY21hcF9jaGFyX2luZGV4KCBGVF9DTWFwICAgIGJkZmNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcmNvZGUgKQotICB7Ci0gICAgQkRGX0NNYXAgICAgICAgICAgY21hcCAgICAgID0gKEJERl9DTWFwKWJkZmNtYXA7Ci0gICAgQkRGX2VuY29kaW5nX2VsKiAgZW5jb2RpbmdzID0gY21hcC0+ZW5jb2RpbmdzOwotICAgIEZUX1VMb25nICAgICAgICAgIG1pbiwgbWF4LCBtaWQ7IC8qIG51bV9lbmNvZGluZ3MgKi8KLSAgICBGVF9VU2hvcnQgICAgICAgICByZXN1bHQgICAgPSAwOyAvKiBlbmNvZGluZ3MtPmdseXBoICovCi0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gY21hcC0+bnVtX2VuY29kaW5nczsKLQotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgY29kZTsKLQotCi0gICAgICBtaWQgID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgY29kZSA9IChGVF9VTG9uZyllbmNvZGluZ3NbbWlkXS5lbmM7Ci0KLSAgICAgIGlmICggY2hhcmNvZGUgPT0gY29kZSApCi0gICAgICB7Ci0gICAgICAgIC8qIGluY3JlYXNlIGdseXBoIGluZGV4IGJ5IDEgLS0gICAgICAgICAgICAgICovCi0gICAgICAgIC8qIHdlIHJlc2VydmUgc2xvdCAwIGZvciB0aGUgdW5kZWZpbmVkIGdseXBoICovCi0gICAgICAgIHJlc3VsdCA9IGVuY29kaW5nc1ttaWRdLmdseXBoICsgMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggY2hhcmNvZGUgPCBjb2RlICkKLSAgICAgICAgbWF4ID0gbWlkOwotICAgICAgZWxzZQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIGJkZl9jbWFwX2NoYXJfbmV4dCggRlRfQ01hcCAgICAgYmRmY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICphY2hhcmNvZGUgKQotICB7Ci0gICAgQkRGX0NNYXAgICAgICAgICAgY21hcCAgICAgID0gKEJERl9DTWFwKWJkZmNtYXA7Ci0gICAgQkRGX2VuY29kaW5nX2VsKiAgZW5jb2RpbmdzID0gY21hcC0+ZW5jb2RpbmdzOwotICAgIEZUX1VMb25nICAgICAgICAgIG1pbiwgbWF4LCBtaWQ7IC8qIG51bV9lbmNvZGluZ3MgKi8KLSAgICBGVF9VU2hvcnQgICAgICAgICByZXN1bHQgICA9IDA7ICAvKiBlbmNvZGluZ3MtPmdseXBoICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgY2hhcmNvZGUgPSAqYWNoYXJjb2RlICsgMTsKLQotCi0gICAgbWluID0gMDsKLSAgICBtYXggPSBjbWFwLT5udW1fZW5jb2RpbmdzOwotCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIEZUX1VMb25nICBjb2RlOyAvKiBzYW1lIGFzIEJERl9lbmNvZGluZ19lbC5lbmMgKi8KLQotCi0gICAgICBtaWQgID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgY29kZSA9IChGVF9VTG9uZyllbmNvZGluZ3NbbWlkXS5lbmM7Ci0KLSAgICAgIGlmICggY2hhcmNvZGUgPT0gY29kZSApCi0gICAgICB7Ci0gICAgICAgIC8qIGluY3JlYXNlIGdseXBoIGluZGV4IGJ5IDEgLS0gICAgICAgICAgICAgICovCi0gICAgICAgIC8qIHdlIHJlc2VydmUgc2xvdCAwIGZvciB0aGUgdW5kZWZpbmVkIGdseXBoICovCi0gICAgICAgIHJlc3VsdCA9IGVuY29kaW5nc1ttaWRdLmdseXBoICsgMTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIGNoYXJjb2RlIDwgY29kZSApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICB9Ci0KLSAgICBjaGFyY29kZSA9IDA7Ci0gICAgaWYgKCBtaW4gPCBjbWFwLT5udW1fZW5jb2RpbmdzICkKLSAgICB7Ci0gICAgICBjaGFyY29kZSA9IChGVF9VTG9uZyllbmNvZGluZ3NbbWluXS5lbmM7Ci0gICAgICByZXN1bHQgICA9IGVuY29kaW5nc1ttaW5dLmdseXBoICsgMTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAiYmRmX2NtYXBfY2hhcl9uZXh0OiBjaGFyY29kZSAweCV4ID4gMzJiaXQgQVBJIiApKTsKLSAgICAgICphY2hhcmNvZGUgPSAwOwotICAgICAgLyogWFhYOiByZXN1bHQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gaW5kaWNhdGUgYW4gb3ZlcmZsb3cgZXJyb3IgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgICAgKmFjaGFyY29kZSA9IChGVF9VSW50MzIpY2hhcmNvZGU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMgIGJkZl9jbWFwX2NsYXNzID0KLSAgewotICAgIHNpemVvZiAoIEJERl9DTWFwUmVjICksCi0gICAgYmRmX2NtYXBfaW5pdCwKLSAgICBiZGZfY21hcF9kb25lLAotICAgIGJkZl9jbWFwX2NoYXJfaW5kZXgsCi0gICAgYmRmX2NtYXBfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICB9OwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGJkZl9pbnRlcnByZXRfc3R5bGUoIEJERl9GYWNlICBiZGYgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfRmFjZSAgICAgICAgICBmYWNlICAgPSBGVF9GQUNFKCBiZGYgKTsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGZhY2UtPm1lbW9yeTsKLSAgICBiZGZfZm9udF90KiAgICAgIGZvbnQgICA9IGJkZi0+YmRmZm9udDsKLSAgICBiZGZfcHJvcGVydHlfdCogIHByb3A7Ci0KLSAgICBjaGFyKiAgIHN0cmluZ3NbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKLSAgICBzaXplX3QgIG5uLCBsZW4sIGxlbmd0aHNbNF07Ci0KLQotICAgIGZhY2UtPnN0eWxlX2ZsYWdzID0gMDsKLQotICAgIHByb3AgPSBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGZvbnQsIChjaGFyICopIlNMQU5UIiApOwotICAgIGlmICggcHJvcCAmJiBwcm9wLT5mb3JtYXQgPT0gQkRGX0FUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBwcm9wLT52YWx1ZS5hdG9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnTycgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnbycgfHwKLSAgICAgICAgICAgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnSScgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnaScgKSApCi0gICAgewotICAgICAgZmFjZS0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0gICAgICBzdHJpbmdzWzJdID0gKCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdPJyB8fCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdvJyApCi0gICAgICAgICAgICAgICAgICAgPyAoY2hhciAqKSJPYmxpcXVlIgotICAgICAgICAgICAgICAgICAgIDogKGNoYXIgKikiSXRhbGljIjsKLSAgICB9Ci0KLSAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAoY2hhciAqKSJXRUlHSFRfTkFNRSIgKTsKLSAgICBpZiAoIHByb3AgJiYgcHJvcC0+Zm9ybWF0ID09IEJERl9BVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgcHJvcC0+dmFsdWUuYXRvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ0InIHx8ICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ2InICkgKQotICAgIHsKLSAgICAgIGZhY2UtPnN0eWxlX2ZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfQk9MRDsKLSAgICAgIHN0cmluZ3NbMV0gPSAoY2hhciAqKSJCb2xkIjsKLSAgICB9Ci0KLSAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAoY2hhciAqKSJTRVRXSURUSF9OQU1FIiApOwotICAgIGlmICggcHJvcCAmJiBwcm9wLT5mb3JtYXQgPT0gQkRGX0FUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgcHJvcC0+dmFsdWUuYXRvbSAmJiAqKHByb3AtPnZhbHVlLmF0b20pICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnTicgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnbicgKSApCi0gICAgICBzdHJpbmdzWzNdID0gKGNoYXIgKikocHJvcC0+dmFsdWUuYXRvbSk7Ci0KLSAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAoY2hhciAqKSJBRERfU1RZTEVfTkFNRSIgKTsKLSAgICBpZiAoIHByb3AgJiYgcHJvcC0+Zm9ybWF0ID09IEJERl9BVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHByb3AtPnZhbHVlLmF0b20gJiYgKihwcm9wLT52YWx1ZS5hdG9tKSAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICEoICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ04nIHx8ICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ24nICkgKQotICAgICAgc3RyaW5nc1swXSA9IChjaGFyICopKHByb3AtPnZhbHVlLmF0b20pOwotCi0gICAgZm9yICggbGVuID0gMCwgbm4gPSAwOyBubiA8IDQ7IG5uKysgKQotICAgIHsKLSAgICAgIGxlbmd0aHNbbm5dID0gMDsKLSAgICAgIGlmICggc3RyaW5nc1tubl0gKQotICAgICAgewotICAgICAgICBsZW5ndGhzW25uXSA9IGZ0X3N0cmxlbiggc3RyaW5nc1tubl0gKTsKLSAgICAgICAgbGVuICAgICAgICArPSBsZW5ndGhzW25uXSArIDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBsZW4gPT0gMCApCi0gICAgewotICAgICAgc3RyaW5nc1swXSA9IChjaGFyICopIlJlZ3VsYXIiOwotICAgICAgbGVuZ3Roc1swXSA9IGZ0X3N0cmxlbiggc3RyaW5nc1swXSApOwotICAgICAgbGVuICAgICAgICA9IGxlbmd0aHNbMF0gKyAxOwotICAgIH0KLQotICAgIHsKLSAgICAgIGNoYXIqICBzOwotCi0KLSAgICAgIGlmICggRlRfQUxMT0MoIGZhY2UtPnN0eWxlX25hbWUsIGxlbiApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBzID0gZmFjZS0+c3R5bGVfbmFtZTsKLQotICAgICAgZm9yICggbm4gPSAwOyBubiA8IDQ7IG5uKysgKQotICAgICAgewotICAgICAgICBjaGFyKiAgc3JjID0gc3RyaW5nc1tubl07Ci0KLQotICAgICAgICBsZW4gPSBsZW5ndGhzW25uXTsKLQotICAgICAgICBpZiAoICFzcmMgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIHNlcGFyYXRlIGVsZW1lbnRzIHdpdGggYSBzcGFjZSAqLwotICAgICAgICBpZiAoIHMgIT0gZmFjZS0+c3R5bGVfbmFtZSApCi0gICAgICAgICAgKnMrKyA9ICcgJzsKLQotICAgICAgICBmdF9tZW1jcHkoIHMsIHNyYywgbGVuICk7Ci0KLSAgICAgICAgLyogbmVlZCB0byBjb252ZXJ0IHNwYWNlcyB0byBkYXNoZXMgZm9yICovCi0gICAgICAgIC8qIGFkZF9zdHlsZV9uYW1lIGFuZCBzZXR3aWR0aF9uYW1lICAgICAqLwotICAgICAgICBpZiAoIG5uID09IDAgfHwgbm4gPT0gMyApCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3QgIG1tOwotCi0KLSAgICAgICAgICBmb3IgKCBtbSA9IDA7IG1tIDwgbGVuOyBtbSsrICkKLSAgICAgICAgICAgIGlmICggc1ttbV0gPT0gJyAnICkKLSAgICAgICAgICAgICAgc1ttbV0gPSAnLSc7Ci0gICAgICAgIH0KLQotICAgICAgICBzICs9IGxlbjsKLSAgICAgIH0KLSAgICAgICpzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIEJERl9GYWNlX0RvbmUoIEZUX0ZhY2UgIGJkZmZhY2UgKSAgICAgICAgIC8qIEJERl9GYWNlICovCi0gIHsKLSAgICBCREZfRmFjZSAgIGZhY2UgPSAoQkRGX0ZhY2UpYmRmZmFjZTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0gICAgYmRmX2ZyZWVfZm9udCggZmFjZS0+YmRmZm9udCApOwotCi0gICAgRlRfRlJFRSggZmFjZS0+ZW5fdGFibGUgKTsKLQotICAgIEZUX0ZSRUUoIGZhY2UtPmNoYXJzZXRfZW5jb2RpbmcgKTsKLSAgICBGVF9GUkVFKCBmYWNlLT5jaGFyc2V0X3JlZ2lzdHJ5ICk7Ci0gICAgRlRfRlJFRSggYmRmZmFjZS0+ZmFtaWx5X25hbWUgKTsKLSAgICBGVF9GUkVFKCBiZGZmYWNlLT5zdHlsZV9uYW1lICk7Ci0KLSAgICBGVF9GUkVFKCBiZGZmYWNlLT5hdmFpbGFibGVfc2l6ZXMgKTsKLQotICAgIEZUX0ZSRUUoIGZhY2UtPmJkZmZvbnQgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIEJERl9GYWNlX0luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgYmRmZmFjZSwgICAgICAgIC8qIEJERl9GYWNlICovCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgQkRGX0ZhY2UgICAgICAgZmFjZSAgID0gKEJERl9GYWNlKWJkZmZhY2U7Ci0gICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotICAgIGJkZl9mb250X3QqICAgIGZvbnQgPSBOVUxMOwotICAgIGJkZl9vcHRpb25zX3QgIG9wdGlvbnM7Ci0KLSAgICBGVF9VTlVTRUQoIG51bV9wYXJhbXMgKTsKLSAgICBGVF9VTlVTRUQoIHBhcmFtcyApOwotCi0KLSAgICBGVF9UUkFDRTIoKCAiQkRGIGRyaXZlclxuIiApKTsKLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBvcHRpb25zLmNvcnJlY3RfbWV0cmljcyA9IDE7ICAgLyogRlogWFhYOiBvcHRpb25zIHNlbWFudGljcyAqLwotICAgIG9wdGlvbnMua2VlcF91bmVuY29kZWQgID0gMTsKLSAgICBvcHRpb25zLmtlZXBfY29tbWVudHMgICA9IDA7Ci0gICAgb3B0aW9ucy5mb250X3NwYWNpbmcgICAgPSBCREZfUFJPUE9SVElPTkFMOwotCi0gICAgZXJyb3IgPSBiZGZfbG9hZF9mb250KCBzdHJlYW0sIG1lbW9yeSwgJm9wdGlvbnMsICZmb250ICk7Ci0gICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBNaXNzaW5nX1N0YXJ0Zm9udF9GaWVsZCApICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiICBub3QgYSBCREYgZmlsZVxuIiApKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHdlIGhhdmUgYSBiZGYgZm9udDogbGV0J3MgY29uc3RydWN0IHRoZSBmYWNlIG9iamVjdCAqLwotICAgIGZhY2UtPmJkZmZvbnQgPSBmb250OwotCi0gICAgLyogQkRGIGNhbm5vdCBoYXZlIG11bHRpcGxlIGZhY2VzIGluIGEgc2luZ2xlIGZvbnQgZmlsZS4KLSAgICAgKiBYWFg6IG5vbi16ZXJvIGZhY2VfaW5kZXggaXMgYWxyZWFkeSBpbnZhbGlkIGFyZ3VtZW50LCBidXQKLSAgICAgKiAgICAgIFR5cGUxLCBUeXBlNDIgZHJpdmVyIGhhcyBhIGNvbnZlbnRpb24gdG8gcmV0dXJuCi0gICAgICogICAgICBhbiBpbnZhbGlkIGFyZ3VtZW50IGVycm9yIHdoZW4gdGhlIGZvbnQgY291bGQgYmUKLSAgICAgKiAgICAgIG9wZW5lZCBieSB0aGUgc3BlY2lmaWVkIGRyaXZlci4KLSAgICAgKi8KLSAgICBpZiAoIGZhY2VfaW5kZXggPiAwICYmICggZmFjZV9pbmRleCAmIDB4RkZGRiApID4gMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiQkRGX0ZhY2VfSW5pdDogaW52YWxpZCBmYWNlIGluZGV4XG4iICkpOwotICAgICAgQkRGX0ZhY2VfRG9uZSggYmRmZmFjZSApOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgfQotCi0gICAgewotICAgICAgYmRmX3Byb3BlcnR5X3QqICBwcm9wID0gTlVMTDsKLQotCi0gICAgICBGVF9UUkFDRTQoKCAiICBudW1iZXIgb2YgZ2x5cGhzOiBhbGxvY2F0ZWQgJWQgKHVzZWQgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgZm9udC0+Z2x5cGhzX3NpemUsCi0gICAgICAgICAgICAgICAgICBmb250LT5nbHlwaHNfdXNlZCApKTsKLSAgICAgIEZUX1RSQUNFNCgoICIgIG51bWJlciBvZiB1bmVuY29kZWQgZ2x5cGhzOiBhbGxvY2F0ZWQgJWQgKHVzZWQgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgZm9udC0+dW5lbmNvZGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICBmb250LT51bmVuY29kZWRfdXNlZCApKTsKLQotICAgICAgYmRmZmFjZS0+bnVtX2ZhY2VzICA9IDE7Ci0gICAgICBiZGZmYWNlLT5mYWNlX2luZGV4ID0gMDsKLQotICAgICAgYmRmZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFM7Ci0KLSAgICAgIHByb3AgPSBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGZvbnQsICJTUEFDSU5HIiApOwotICAgICAgaWYgKCBwcm9wICYmIHByb3AtPmZvcm1hdCA9PSBCREZfQVRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgcHJvcC0+dmFsdWUuYXRvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnTScgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnbScgfHwKLSAgICAgICAgICAgICAqKHByb3AtPnZhbHVlLmF0b20pID09ICdDJyB8fCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdjJyApICkKLSAgICAgICAgYmRmZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEg7Ci0KLSAgICAgIC8qIEZaIFhYWDogVE8gRE86IEZUX0ZBQ0VfRkxBR1NfVkVSVElDQUwgICAqLwotICAgICAgLyogRlogWFhYOiBJIG5lZWQgYSBmb250IHRvIGltcGxlbWVudCB0aGlzICovCi0KLSAgICAgIHByb3AgPSBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGZvbnQsICJGQU1JTFlfTkFNRSIgKTsKLSAgICAgIGlmICggcHJvcCAmJiBwcm9wLT52YWx1ZS5hdG9tICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9TVFJEVVAoIGJkZmZhY2UtPmZhbWlseV9uYW1lLCBwcm9wLT52YWx1ZS5hdG9tICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgYmRmZmFjZS0+ZmFtaWx5X25hbWUgPSBOVUxMOwotCi0gICAgICBpZiAoIEZUX1NFVF9FUlJPUiggYmRmX2ludGVycHJldF9zdHlsZSggZmFjZSApICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIHRoZSBudW1iZXIgb2YgZ2x5cGhzICh3aXRoIG9uZSBzbG90IGZvciB0aGUgdW5kZWZpbmVkIGdseXBoICovCi0gICAgICAvKiBhdCBwb3NpdGlvbiAwIGFuZCBhbGwgdW5lbmNvZGVkIGdseXBocykgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgYmRmZmFjZS0+bnVtX2dseXBocyA9IChGVF9Mb25nKSggZm9udC0+Z2x5cGhzX3NpemUgKyAxICk7Ci0KLSAgICAgIGJkZmZhY2UtPm51bV9maXhlZF9zaXplcyA9IDE7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggYmRmZmFjZS0+YXZhaWxhYmxlX3NpemVzLCAxICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHsKLSAgICAgICAgRlRfQml0bWFwX1NpemUqICBic2l6ZSA9IGJkZmZhY2UtPmF2YWlsYWJsZV9zaXplczsKLSAgICAgICAgRlRfU2hvcnQgICAgICAgICByZXNvbHV0aW9uX3ggPSAwLCByZXNvbHV0aW9uX3kgPSAwOwotCi0KLSAgICAgICAgRlRfWkVSTyggYnNpemUgKTsKLQotICAgICAgICAvKiBzYW5pdHkgY2hlY2tzICovCi0gICAgICAgIGlmICggZm9udC0+Zm9udF9hc2NlbnQgPiAweDdGRkYgfHwgZm9udC0+Zm9udF9hc2NlbnQgPCAtMHg3RkZGICkKLSAgICAgICAgewotICAgICAgICAgIGZvbnQtPmZvbnRfYXNjZW50ID0gZm9udC0+Zm9udF9hc2NlbnQgPCAwID8gLTB4N0ZGRiA6IDB4N0ZGRjsKLSAgICAgICAgICBGVF9UUkFDRTAoKCAiQkRGX0ZhY2VfSW5pdDogY2xhbXBpbmcgZm9udCBhc2NlbnQgdG8gdmFsdWUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZm9udC0+Zm9udF9hc2NlbnQgKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBmb250LT5mb250X2Rlc2NlbnQgPiAweDdGRkYgfHwgZm9udC0+Zm9udF9kZXNjZW50IDwgLTB4N0ZGRiApCi0gICAgICAgIHsKLSAgICAgICAgICBmb250LT5mb250X2Rlc2NlbnQgPSBmb250LT5mb250X2Rlc2NlbnQgPCAwID8gLTB4N0ZGRiA6IDB4N0ZGRjsKLSAgICAgICAgICBGVF9UUkFDRTAoKCAiQkRGX0ZhY2VfSW5pdDogY2xhbXBpbmcgZm9udCBkZXNjZW50IHRvIHZhbHVlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmZvbnRfZGVzY2VudCApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJzaXplLT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBmb250LT5mb250X2FzY2VudCArIGZvbnQtPmZvbnRfZGVzY2VudCApOwotCi0gICAgICAgIHByb3AgPSBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGZvbnQsICJBVkVSQUdFX1dJRFRIIiApOwotICAgICAgICBpZiAoIHByb3AgKQotICAgICAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBpZiAoIHByb3AtPnZhbHVlLmwgPCAwICkKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJCREZfRmFjZV9Jbml0OiBuZWdhdGl2ZSBhdmVyYWdlIHdpZHRoXG4iICkpOwotI2VuZGlmCi0gICAgICAgICAgaWYgKCBwcm9wLT52YWx1ZS5sID4gICAgMHg3RkZGTCAqIDEwIC0gNSAgIHx8Ci0gICAgICAgICAgICAgICBwcm9wLT52YWx1ZS5sIDwgLSggMHg3RkZGTCAqIDEwIC0gNSApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBic2l6ZS0+d2lkdGggPSAweDdGRkY7Ci0gICAgICAgICAgICBGVF9UUkFDRTAoKCAiQkRGX0ZhY2VfSW5pdDogY2xhbXBpbmcgYXZlcmFnZSB3aWR0aCB0byB2YWx1ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJzaXplLT53aWR0aCApKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYnNpemUtPndpZHRoID0gRlRfQUJTKCAoRlRfU2hvcnQpKCAoIHByb3AtPnZhbHVlLmwgKyA1ICkgLyAxMCApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhpcyBpcyBhIGhldXJpc3RpY2FsIHZhbHVlICovCi0gICAgICAgICAgYnNpemUtPndpZHRoID0gKEZUX1Nob3J0KUZUX011bERpdiggYnNpemUtPmhlaWdodCwgMiwgMyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcCA9IGJkZl9nZXRfZm9udF9wcm9wZXJ0eSggZm9udCwgIlBPSU5UX1NJWkUiICk7Ci0gICAgICAgIGlmICggcHJvcCApCi0gICAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA8IDAgKQotICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkJERl9GYWNlX0luaXQ6IG5lZ2F0aXZlIHBvaW50IHNpemVcbiIgKSk7Ci0jZW5kaWYKLSAgICAgICAgICAvKiBjb252ZXJ0IGZyb20gNzIyLjcgZGVjaXBvaW50cyB0byA3MiBwb2ludHMgcGVyIGluY2ggKi8KLSAgICAgICAgICBpZiAoIHByb3AtPnZhbHVlLmwgPiAgMHg1MDRDMkwgfHwgLyogMHg3RkZGICogNzIyNzAvNzIwMCAqLwotICAgICAgICAgICAgICAgcHJvcC0+dmFsdWUubCA8IC0weDUwNEMyTCApCi0gICAgICAgICAgewotICAgICAgICAgICAgYnNpemUtPnNpemUgPSAweDdGRkY7Ci0gICAgICAgICAgICBGVF9UUkFDRTAoKCAiQkRGX0ZhY2VfSW5pdDogY2xhbXBpbmcgcG9pbnQgc2l6ZSB0byB2YWx1ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJzaXplLT5zaXplICkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBic2l6ZS0+c2l6ZSA9IEZUX011bERpdiggRlRfQUJTKCBwcm9wLT52YWx1ZS5sICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQgKiA3MjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMjcwTCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgaXMgYSBoZXVyaXN0aWNhbCB2YWx1ZSAqLwotICAgICAgICAgIGJzaXplLT5zaXplID0gYnNpemUtPndpZHRoICogNjQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAiUElYRUxfU0laRSIgKTsKLSAgICAgICAgaWYgKCBwcm9wICkKLSAgICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgaWYgKCBwcm9wLT52YWx1ZS5sIDwgMCApCi0gICAgICAgICAgICBGVF9UUkFDRTAoKCAiQkRGX0ZhY2VfSW5pdDogbmVnYXRpdmUgcGl4ZWwgc2l6ZVxuIiApKTsKLSNlbmRpZgotICAgICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA+IDB4N0ZGRiB8fCBwcm9wLT52YWx1ZS5sIDwgLTB4N0ZGRiApCi0gICAgICAgICAgewotICAgICAgICAgICAgYnNpemUtPnlfcHBlbSA9IDB4N0ZGRiA8PCA2OwotICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkJERl9GYWNlX0luaXQ6IGNsYW1waW5nIHBpeGVsIHNpemUgdG8gdmFsdWUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBic2l6ZS0+eV9wcGVtICkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBic2l6ZS0+eV9wcGVtID0gRlRfQUJTKCAoRlRfU2hvcnQpcHJvcC0+dmFsdWUubCApIDw8IDY7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAiUkVTT0xVVElPTl9YIiApOwotICAgICAgICBpZiAoIHByb3AgKQotICAgICAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBpZiAoIHByb3AtPnZhbHVlLmwgPCAwICkKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJCREZfRmFjZV9Jbml0OiBuZWdhdGl2ZSBYIHJlc29sdXRpb25cbiIgKSk7Ci0jZW5kaWYKLSAgICAgICAgICBpZiAoIHByb3AtPnZhbHVlLmwgPiAweDdGRkYgfHwgcHJvcC0+dmFsdWUubCA8IC0weDdGRkYgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc29sdXRpb25feCA9IDB4N0ZGRjsKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJCREZfRmFjZV9Jbml0OiBjbGFtcGluZyBYIHJlc29sdXRpb24gdG8gdmFsdWUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uX3ggKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc29sdXRpb25feCA9IEZUX0FCUyggKEZUX1Nob3J0KXByb3AtPnZhbHVlLmwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3AgPSBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGZvbnQsICJSRVNPTFVUSU9OX1kiICk7Ci0gICAgICAgIGlmICggcHJvcCApCi0gICAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA8IDAgKQotICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkJERl9GYWNlX0luaXQ6IG5lZ2F0aXZlIFkgcmVzb2x1dGlvblxuIiApKTsKLSNlbmRpZgotICAgICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA+IDB4N0ZGRiB8fCBwcm9wLT52YWx1ZS5sIDwgLTB4N0ZGRiApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb2x1dGlvbl95ID0gMHg3RkZGOwotICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkJERl9GYWNlX0luaXQ6IGNsYW1waW5nIFkgcmVzb2x1dGlvbiB0byB2YWx1ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb25feSApKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzb2x1dGlvbl95ID0gRlRfQUJTKCAoRlRfU2hvcnQpcHJvcC0+dmFsdWUubCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBic2l6ZS0+eV9wcGVtID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgYnNpemUtPnlfcHBlbSA9IGJzaXplLT5zaXplOwotICAgICAgICAgIGlmICggcmVzb2x1dGlvbl95ICkKLSAgICAgICAgICAgIGJzaXplLT55X3BwZW0gPSBGVF9NdWxEaXYoIGJzaXplLT55X3BwZW0sIHJlc29sdXRpb25feSwgNzIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHJlc29sdXRpb25feCAmJiByZXNvbHV0aW9uX3kgKQotICAgICAgICAgIGJzaXplLT54X3BwZW0gPSBGVF9NdWxEaXYoIGJzaXplLT55X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbl94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb25feSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYnNpemUtPnhfcHBlbSA9IGJzaXplLT55X3BwZW07Ci0gICAgICB9Ci0KLSAgICAgIC8qIGVuY29kaW5nIHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIGJkZl9nbHlwaF90KiAgIGN1ciA9IGZvbnQtPmdseXBoczsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgbjsKLQotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBmYWNlLT5lbl90YWJsZSwgZm9udC0+Z2x5cGhzX3NpemUgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGZhY2UtPmRlZmF1bHRfZ2x5cGggPSAwOwotICAgICAgICBmb3IgKCBuID0gMDsgbiA8IGZvbnQtPmdseXBoc19zaXplOyBuKysgKQotICAgICAgICB7Ci0gICAgICAgICAgKGZhY2UtPmVuX3RhYmxlW25dKS5lbmMgPSBjdXJbbl0uZW5jb2Rpbmc7Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiAgaWR4ICVkLCB2YWwgMHglbFhcbiIsIG4sIGN1cltuXS5lbmNvZGluZyApKTsKLSAgICAgICAgICAoZmFjZS0+ZW5fdGFibGVbbl0pLmdseXBoID0gKEZUX1VTaG9ydCluOwotCi0gICAgICAgICAgaWYgKCBjdXJbbl0uZW5jb2RpbmcgPT0gZm9udC0+ZGVmYXVsdF9jaGFyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIG4gPCBGVF9VSU5UX01BWCApCi0gICAgICAgICAgICAgIGZhY2UtPmRlZmF1bHRfZ2x5cGggPSAoRlRfVUludCluOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBGVF9UUkFDRTEoKCAiQkRGX0ZhY2VfSW5pdDoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgaWR4ICVkIGlzIHRvbyBsYXJnZSBmb3IgdGhpcyBzeXN0ZW1cbiIsIG4gKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNoYXJtYXBzICovCi0gICAgICB7Ci0gICAgICAgIGJkZl9wcm9wZXJ0eV90ICAqY2hhcnNldF9yZWdpc3RyeSwgKmNoYXJzZXRfZW5jb2Rpbmc7Ci0gICAgICAgIEZUX0Jvb2wgICAgICAgICAgdW5pY29kZV9jaGFybWFwICA9IDA7Ci0KLQotICAgICAgICBjaGFyc2V0X3JlZ2lzdHJ5ID0KLSAgICAgICAgICBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGZvbnQsICJDSEFSU0VUX1JFR0lTVFJZIiApOwotICAgICAgICBjaGFyc2V0X2VuY29kaW5nID0KLSAgICAgICAgICBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGZvbnQsICJDSEFSU0VUX0VOQ09ESU5HIiApOwotICAgICAgICBpZiAoIGNoYXJzZXRfcmVnaXN0cnkgJiYgY2hhcnNldF9lbmNvZGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGNoYXJzZXRfcmVnaXN0cnktPmZvcm1hdCA9PSBCREZfQVRPTSAmJgotICAgICAgICAgICAgICAgY2hhcnNldF9lbmNvZGluZy0+Zm9ybWF0ID09IEJERl9BVE9NICYmCi0gICAgICAgICAgICAgICBjaGFyc2V0X3JlZ2lzdHJ5LT52YWx1ZS5hdG9tICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGNoYXJzZXRfZW5jb2RpbmctPnZhbHVlLmF0b20gICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgY29uc3QgY2hhciogIHM7Ci0KLQotICAgICAgICAgICAgaWYgKCBGVF9TVFJEVVAoIGZhY2UtPmNoYXJzZXRfZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldF9lbmNvZGluZy0+dmFsdWUuYXRvbSApIHx8Ci0gICAgICAgICAgICAgICAgIEZUX1NUUkRVUCggZmFjZS0+Y2hhcnNldF9yZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0X3JlZ2lzdHJ5LT52YWx1ZS5hdG9tICkgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIC8qIFVoLCBvaCwgY29tcGFyZSBmaXJzdCBsZXR0ZXJzIG1hbnVhbGx5IHRvIGF2b2lkIGRlcGVuZGVuY3kgKi8KLSAgICAgICAgICAgIC8qIG9uIGxvY2FsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHMgPSBmYWNlLT5jaGFyc2V0X3JlZ2lzdHJ5OwotICAgICAgICAgICAgaWYgKCAoIHNbMF0gPT0gJ2knIHx8IHNbMF0gPT0gJ0knICkgJiYKLSAgICAgICAgICAgICAgICAgKCBzWzFdID09ICdzJyB8fCBzWzFdID09ICdTJyApICYmCi0gICAgICAgICAgICAgICAgICggc1syXSA9PSAnbycgfHwgc1syXSA9PSAnTycgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHMgKz0gMzsKLSAgICAgICAgICAgICAgaWYgKCAhZnRfc3RyY21wKCBzLCAiMTA2NDYiICkgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAoICFmdF9zdHJjbXAoIHMsICI4ODU5IiApICYmCi0gICAgICAgICAgICAgICAgICAgICAhZnRfc3RyY21wKCBmYWNlLT5jaGFyc2V0X2VuY29kaW5nLCAiMSIgKSApICkKLSAgICAgICAgICAgICAgICB1bmljb2RlX2NoYXJtYXAgPSAxOwotICAgICAgICAgICAgICAvKiBhbm90aGVyIG5hbWUgZm9yIEFTQ0lJICovCi0gICAgICAgICAgICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBzLCAiNjQ2LjE5OTEiICkgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhZnRfc3RyY21wKCBmYWNlLT5jaGFyc2V0X2VuY29kaW5nLCAiSVJWIiApICkKLSAgICAgICAgICAgICAgICB1bmljb2RlX2NoYXJtYXAgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0NoYXJNYXBSZWMgIGNoYXJtYXA7Ci0KLQotICAgICAgICAgICAgICBjaGFybWFwLmZhY2UgICAgICAgID0gRlRfRkFDRSggZmFjZSApOwotICAgICAgICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfTk9ORTsKLSAgICAgICAgICAgICAgLyogaW5pdGlhbCBwbGF0Zm9ybS9lbmNvZGluZyBzaG91bGQgaW5kaWNhdGUgdW5zZXQgc3RhdHVzPyAqLwotICAgICAgICAgICAgICBjaGFybWFwLnBsYXRmb3JtX2lkID0gVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERTsKLSAgICAgICAgICAgICAgY2hhcm1hcC5lbmNvZGluZ19pZCA9IFRUX0FQUExFX0lEX0RFRkFVTFQ7Ci0KLSAgICAgICAgICAgICAgaWYgKCB1bmljb2RlX2NoYXJtYXAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhcm1hcC5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX1VOSUNPREU7Ci0gICAgICAgICAgICAgICAgY2hhcm1hcC5wbGF0Zm9ybV9pZCA9IFRUX1BMQVRGT1JNX01JQ1JPU09GVDsKLSAgICAgICAgICAgICAgICBjaGFybWFwLmVuY29kaW5nX2lkID0gVFRfTVNfSURfVU5JQ09ERV9DUzsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGVycm9yID0gRlRfQ01hcF9OZXcoICZiZGZfY21hcF9jbGFzcywgTlVMTCwgJmNoYXJtYXAsIE5VTEwgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIG90aGVyd2lzZSBhc3N1bWUgQWRvYmUgc3RhbmRhcmQgZW5jb2RpbmcgKi8KLQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsKLQotCi0gICAgICAgICAgY2hhcm1hcC5mYWNlICAgICAgICA9IEZUX0ZBQ0UoIGZhY2UgKTsKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQ7Ci0gICAgICAgICAgY2hhcm1hcC5wbGF0Zm9ybV9pZCA9IFRUX1BMQVRGT1JNX0FET0JFOwotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9TVEFOREFSRDsKLQotICAgICAgICAgIGVycm9yID0gRlRfQ01hcF9OZXcoICZiZGZfY21hcF9jbGFzcywgTlVMTCwgJmNoYXJtYXAsIE5VTEwgKTsKLQotICAgICAgICAgIC8qIFNlbGVjdCBkZWZhdWx0IGNoYXJtYXAgKi8KLSAgICAgICAgICBpZiAoIGJkZmZhY2UtPm51bV9jaGFybWFwcyApCi0gICAgICAgICAgICBiZGZmYWNlLT5jaGFybWFwID0gYmRmZmFjZS0+Y2hhcm1hcHNbMF07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBCREZfRmFjZV9Eb25lKCBiZGZmYWNlICk7Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBCREZfU2l6ZV9TZWxlY3QoIEZUX1NpemUgICBzaXplLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBzdHJpa2VfaW5kZXggKQotICB7Ci0gICAgYmRmX2ZvbnRfdCogIGJkZmZvbnQgPSAoIChCREZfRmFjZSlzaXplLT5mYWNlICktPmJkZmZvbnQ7Ci0KLQotICAgIEZUX1NlbGVjdF9NZXRyaWNzKCBzaXplLT5mYWNlLCBzdHJpa2VfaW5kZXggKTsKLQotICAgIHNpemUtPm1ldHJpY3MuYXNjZW5kZXIgICAgPSBiZGZmb250LT5mb250X2FzY2VudCAqIDY0OwotICAgIHNpemUtPm1ldHJpY3MuZGVzY2VuZGVyICAgPSAtYmRmZm9udC0+Zm9udF9kZXNjZW50ICogNjQ7Ci0gICAgc2l6ZS0+bWV0cmljcy5tYXhfYWR2YW5jZSA9IGJkZmZvbnQtPmJieC53aWR0aCAqIDY0OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIEJERl9TaXplX1JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgRlRfRmFjZSAgICAgICAgICBmYWNlICAgID0gc2l6ZS0+ZmFjZTsKLSAgICBGVF9CaXRtYXBfU2l6ZSogIGJzaXplICAgPSBmYWNlLT5hdmFpbGFibGVfc2l6ZXM7Ci0gICAgYmRmX2ZvbnRfdCogICAgICBiZGZmb250ID0gKCAoQkRGX0ZhY2UpZmFjZSApLT5iZGZmb250OwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgICA9IEZUX0VSUiggSW52YWxpZF9QaXhlbF9TaXplICk7Ci0gICAgRlRfTG9uZyAgICAgICAgICBoZWlnaHQ7Ci0KLQotICAgIGhlaWdodCA9IEZUX1JFUVVFU1RfSEVJR0hUKCByZXEgKTsKLSAgICBoZWlnaHQgPSAoIGhlaWdodCArIDMyICkgPj4gNjsKLQotICAgIHN3aXRjaCAoIHJlcS0+dHlwZSApCi0gICAgewotICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTDoKLSAgICAgIGlmICggaGVpZ2h0ID09ICggKCBic2l6ZS0+eV9wcGVtICsgMzIgKSA+PiA2ICkgKQotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTToKLSAgICAgIGlmICggaGVpZ2h0ID09ICggYmRmZm9udC0+Zm9udF9hc2NlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICBiZGZmb250LT5mb250X2Rlc2NlbnQgKSApCi0gICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gQkRGX1NpemVfU2VsZWN0KCBzaXplLCAwICk7Ci0gIH0KLQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIEJERl9HbHlwaF9Mb2FkKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICkKLSAgewotICAgIEJERl9GYWNlICAgICBiZGYgICAgPSAoQkRGX0ZhY2UpRlRfU0laRV9GQUNFKCBzaXplICk7Ci0gICAgRlRfRmFjZSAgICAgIGZhY2UgICA9IEZUX0ZBQ0UoIGJkZiApOwotICAgIEZUX0Vycm9yICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfQml0bWFwKiAgIGJpdG1hcCA9ICZzbG90LT5iaXRtYXA7Ci0gICAgYmRmX2dseXBoX3QgIGdseXBoOwotICAgIGludCAgICAgICAgICBicHAgICAgPSBiZGYtPmJkZmZvbnQtPmJwcDsKLQotICAgIEZUX1VOVVNFRCggbG9hZF9mbGFncyApOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBnbHlwaF9pbmRleCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UxKCggIkJERl9HbHlwaF9Mb2FkOiBnbHlwaCBpbmRleCAlZFxuIiwgZ2x5cGhfaW5kZXggKSk7Ci0KLSAgICAvKiBpbmRleCAwIGlzIHRoZSB1bmRlZmluZWQgZ2x5cGggKi8KLSAgICBpZiAoIGdseXBoX2luZGV4ID09IDAgKQotICAgICAgZ2x5cGhfaW5kZXggPSBiZGYtPmRlZmF1bHRfZ2x5cGg7Ci0gICAgZWxzZQotICAgICAgZ2x5cGhfaW5kZXgtLTsKLQotICAgIC8qIHNsb3QsIGJpdG1hcCA9PiBmcmVldHlwZSwgZ2x5cGggPT4gYmRmbGliICovCi0gICAgZ2x5cGggPSBiZGYtPmJkZmZvbnQtPmdseXBoc1tnbHlwaF9pbmRleF07Ci0KLSAgICBiaXRtYXAtPnJvd3MgID0gZ2x5cGguYmJ4LmhlaWdodDsKLSAgICBiaXRtYXAtPndpZHRoID0gZ2x5cGguYmJ4LndpZHRoOwotICAgIGlmICggZ2x5cGguYnByID4gSU5UX01BWCApCi0gICAgICBGVF9UUkFDRTEoKCAiQkRGX0dseXBoX0xvYWQ6IHRvbyBsYXJnZSBwaXRjaCAlZCBpcyB0cnVuY2F0ZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgZ2x5cGguYnByICkpOwotICAgIGJpdG1hcC0+cGl0Y2ggPSAoaW50KWdseXBoLmJwcjsgLyogc2FtZSBhcyBGVF9CaXRtYXAucGl0Y2ggKi8KLQotICAgIC8qIG5vdGU6IHdlIGRvbid0IGFsbG9jYXRlIGEgbmV3IGFycmF5IHRvIGhvbGQgdGhlIGJpdG1hcDsgKi8KLSAgICAvKiAgICAgICB3ZSBjYW4gc2ltcGx5IHBvaW50IHRvIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZnRfZ2x5cGhzbG90X3NldF9iaXRtYXAoIHNsb3QsIGdseXBoLmJpdG1hcCApOwotCi0gICAgc3dpdGNoICggYnBwICkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgYml0bWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9NT05POwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgYml0bWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJpdG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBiaXRtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVk7Ci0gICAgICBiaXRtYXAtPm51bV9ncmF5cyAgPSAyNTY7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzbG90LT5mb3JtYXQgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVA7Ci0gICAgc2xvdC0+Yml0bWFwX2xlZnQgPSBnbHlwaC5iYngueF9vZmZzZXQ7Ci0gICAgc2xvdC0+Yml0bWFwX3RvcCAgPSBnbHlwaC5iYnguYXNjZW50OwotCi0gICAgc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZSAgPSAoRlRfUG9zKSggZ2x5cGguZHdpZHRoICogNjQgKTsKLSAgICBzbG90LT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IChGVF9Qb3MpKCBnbHlwaC5iYngueF9vZmZzZXQgKiA2NCApOwotICAgIHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gKEZUX1BvcykoIGdseXBoLmJieC5hc2NlbnQgKiA2NCApOwotICAgIHNsb3QtPm1ldHJpY3Mud2lkdGggICAgICAgID0gKEZUX1BvcykoIGJpdG1hcC0+d2lkdGggKiA2NCApOwotICAgIHNsb3QtPm1ldHJpY3MuaGVpZ2h0ICAgICAgID0gKEZUX1BvcykoIGJpdG1hcC0+cm93cyAqIDY0ICk7Ci0KLSAgICAvKgotICAgICAqIFhYWCBEV0lEVEgxIGFuZCBWVkVDVE9SIHNob3VsZCBiZSBwYXJzZWQgYW5kCi0gICAgICogdXNlZCBoZXJlLCBwcm92aWRlZCBzdWNoIGZvbnRzIGRvIGV4aXN0LgotICAgICAqLwotICAgIGZ0X3N5bnRoZXNpemVfdmVydGljYWxfbWV0cmljcyggJnNsb3QtPm1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGYtPmJkZmZvbnQtPmJieC5oZWlnaHQgKiA2NCApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotIC8qCi0gICoKLSAgKiAgQkRGIFNFUlZJQ0UKLSAgKgotICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBiZGZfZ2V0X2JkZl9wcm9wZXJ0eSggQkRGX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJERl9Qcm9wZXJ0eVJlYyAgKmFwcm9wZXJ0eSApCi0gIHsKLSAgICBiZGZfcHJvcGVydHlfdCogIHByb3A7Ci0KLQotICAgIEZUX0FTU0VSVCggZmFjZSAmJiBmYWNlLT5iZGZmb250ICk7Ci0KLSAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmYWNlLT5iZGZmb250LCBwcm9wX25hbWUgKTsKLSAgICBpZiAoIHByb3AgKQotICAgIHsKLSAgICAgIHN3aXRjaCAoIHByb3AtPmZvcm1hdCApCi0gICAgICB7Ci0gICAgICBjYXNlIEJERl9BVE9NOgotICAgICAgICBhcHJvcGVydHktPnR5cGUgICA9IEJERl9QUk9QRVJUWV9UWVBFX0FUT007Ci0gICAgICAgIGFwcm9wZXJ0eS0+dS5hdG9tID0gcHJvcC0+dmFsdWUuYXRvbTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQkRGX0lOVEVHRVI6Ci0gICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA+IDB4N0ZGRkZGRkZMIHx8IHByb3AtPnZhbHVlLmwgPCAoIC0xIC0gMHg3RkZGRkZGRkwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiYmRmX2dldF9iZGZfcHJvcGVydHk6IgotICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIGludGVnZXIgMHgleCBpcyB0cnVuY2F0ZWRcbiIgKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXByb3BlcnR5LT50eXBlICAgICAgPSBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSOwotICAgICAgICBhcHJvcGVydHktPnUuaW50ZWdlciA9IChGVF9JbnQzMilwcm9wLT52YWx1ZS5sOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCREZfQ0FSRElOQUw6Ci0gICAgICAgIGlmICggcHJvcC0+dmFsdWUudWwgPiAweEZGRkZGRkZGVUwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggImJkZl9nZXRfYmRmX3Byb3BlcnR5OiIKLSAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSBjYXJkaW5hbCAweCV4IGlzIHRydW5jYXRlZFxuIiApKTsKLSAgICAgICAgfQotICAgICAgICBhcHJvcGVydHktPnR5cGUgICAgICAgPSBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTDsKLSAgICAgICAgYXByb3BlcnR5LT51LmNhcmRpbmFsID0gKEZUX1VJbnQzMilwcm9wLT52YWx1ZS51bDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYmRmX2dldF9jaGFyc2V0X2lkKCBCREZfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X3JlZ2lzdHJ5ICkKLSAgewotICAgICphY2hhcnNldF9lbmNvZGluZyA9IGZhY2UtPmNoYXJzZXRfZW5jb2Rpbmc7Ci0gICAgKmFjaGFyc2V0X3JlZ2lzdHJ5ID0gZmFjZS0+Y2hhcnNldF9yZWdpc3RyeTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9CREZSZWMgIGJkZl9zZXJ2aWNlX2JkZiA9Ci0gIHsKLSAgICAoRlRfQkRGX0dldENoYXJzZXRJZEZ1bmMpYmRmX2dldF9jaGFyc2V0X2lkLCAgICAgICAvKiBnZXRfY2hhcnNldF9pZCAqLwotICAgIChGVF9CREZfR2V0UHJvcGVydHlGdW5jKSBiZGZfZ2V0X2JkZl9wcm9wZXJ0eSAgICAgIC8qIGdldF9wcm9wZXJ0eSAgICovCi0gIH07Ci0KLQotIC8qCi0gICoKLSAgKiAgU0VSVklDRVMgTElTVAotICAqCi0gICovCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBiZGZfc2VydmljZXNbXSA9Ci0gIHsKLSAgICB7IEZUX1NFUlZJQ0VfSURfQkRGLCAgICAgICAgICZiZGZfc2VydmljZV9iZGYgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsIEZUX0ZPTlRfRk9STUFUX0JERiB9LAotICAgIHsgTlVMTCwgTlVMTCB9Ci0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX01vZHVsZV9JbnRlcmZhY2UgKQotICBiZGZfZHJpdmVyX3JlcXVlc3RlciggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBuYW1lICkKLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0KLSAgICByZXR1cm4gZnRfc2VydmljZV9saXN0X2xvb2t1cCggYmRmX3NlcnZpY2VzLCBuYW1lICk7Ci0gIH0KLQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyAgYmRmX2RyaXZlcl9jbGFzcyA9Ci0gIHsKLSAgICB7Ci0gICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIgICAgICAgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX05PX09VVExJTkVTLAotICAgICAgc2l6ZW9mICggRlRfRHJpdmVyUmVjICksCi0KLSAgICAgICJiZGYiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgTlVMTCwgICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgbW9kdWxlX2luaXQgICAqLwotICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgIG1vZHVsZV9kb25lICAgKi8KLSAgICAgIGJkZl9kcml2ZXJfcmVxdWVzdGVyICAgICAgLyogRlRfTW9kdWxlX1JlcXVlc3RlciAgICBnZXRfaW50ZXJmYWNlICovCi0gICAgfSwKLQotICAgIHNpemVvZiAoIEJERl9GYWNlUmVjICksCi0gICAgc2l6ZW9mICggRlRfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIEZUX0dseXBoU2xvdFJlYyApLAotCi0gICAgQkRGX0ZhY2VfSW5pdCwgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfSW5pdEZ1bmMgIGluaXRfZmFjZSAqLwotICAgIEJERl9GYWNlX0RvbmUsICAgICAgICAgICAgICAvKiBGVF9GYWNlX0RvbmVGdW5jICBkb25lX2ZhY2UgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9Jbml0RnVuYyAgaW5pdF9zaXplICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX1NpemVfRG9uZUZ1bmMgIGRvbmVfc2l6ZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TbG90X0luaXRGdW5jICBpbml0X3Nsb3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2xvdF9Eb25lRnVuYyAgZG9uZV9zbG90ICovCi0KLSAgICBCREZfR2x5cGhfTG9hZCwgICAgICAgICAgICAgLyogRlRfU2xvdF9Mb2FkRnVuYyAgbG9hZF9nbHlwaCAqLwotCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfR2V0S2VybmluZ0Z1bmMgICBnZXRfa2VybmluZyAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfRmFjZV9BdHRhY2hGdW5jICAgICAgIGF0dGFjaF9maWxlICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAgZ2V0X2FkdmFuY2VzICovCi0KLSAgICBCREZfU2l6ZV9SZXF1ZXN0LCAgICAgICAgICAgLyogRlRfU2l6ZV9SZXF1ZXN0RnVuYyAgcmVxdWVzdF9zaXplICovCi0gICAgQkRGX1NpemVfU2VsZWN0ICAgICAgICAgICAgIC8qIEZUX1NpemVfU2VsZWN0RnVuYyAgIHNlbGVjdF9zaXplICAqLwotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2JkZi9iZGZkcml2ci5oIGIvc3JjL2JkZi9iZGZkcml2ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDU1MDgxLi4wMDAwMDAwCi0tLSBhL3NyYy9iZGYvYmRmZHJpdnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qICBiZGZkcml2ci5oCi0KLSAgICBGcmVlVHlwZSBmb250IGRyaXZlciBmb3IgYmRmIGZvbnRzCi0KLSAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IGJ5Ci0gIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCi0qLwotCi0KLSNpZm5kZWYgQkRGRFJJVlJfSF8KLSNkZWZpbmUgQkRGRFJJVlJfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotCi0jaW5jbHVkZSAiYmRmLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotI2Vycm9yICJ0aGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFBJQyB5ZXQiCi0jZW5kaWYKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBCREZfZW5jb2RpbmdfZWxfCi0gIHsKLSAgICBGVF9Mb25nICAgIGVuYzsKLSAgICBGVF9VU2hvcnQgIGdseXBoOwotCi0gIH0gQkRGX2VuY29kaW5nX2VsOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEJERl9GYWNlUmVjXwotICB7Ci0gICAgRlRfRmFjZVJlYyAgICAgICAgcm9vdDsKLQotICAgIGNoYXIqICAgICAgICAgICAgIGNoYXJzZXRfZW5jb2Rpbmc7Ci0gICAgY2hhciogICAgICAgICAgICAgY2hhcnNldF9yZWdpc3RyeTsKLQotICAgIGJkZl9mb250X3QqICAgICAgIGJkZmZvbnQ7Ci0KLSAgICBCREZfZW5jb2RpbmdfZWwqICBlbl90YWJsZTsKLQotICAgIEZUX0NoYXJNYXAgICAgICAgIGNoYXJtYXBfaGFuZGxlOwotICAgIEZUX0NoYXJNYXBSZWMgICAgIGNoYXJtYXA7ICAvKiBhIHNpbmdsZSBjaGFybWFwIHBlciBmYWNlICovCi0KLSAgICBGVF9VSW50ICAgICAgICAgICBkZWZhdWx0X2dseXBoOwotCi0gIH0gQkRGX0ZhY2VSZWMsICpCREZfRmFjZTsKLQotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyApICBiZGZfZHJpdmVyX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogQkRGRFJJVlJfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iZGYvYmRmZXJyb3IuaCBiL3NyYy9iZGYvYmRmZXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2MmM3ZC4uMDAwMDAwMAotLS0gYS9zcmMvYmRmL2JkZmVycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTIgRnJhbmNlc2NvIFphcHBhIE5hcmRlbGxpCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQ09NUFVUSU5HIFJFU0VBUkNIIExBQiBPUiBORVcgTUVYSUNPIFNUQVRFIFVOSVZFUlNJVFkgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQKLSAqIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUgotICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgQkRGIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQkRGRVJST1JfSF8KLSNkZWZpbmUgQkRGRVJST1JfSF8KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBGVEVSUk9SU19IXwotCi0jdW5kZWYgIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgQkRGX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9CREYKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIEJERkVSUk9SX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmRmL2JkZmxpYi5jIGIvc3JjL2JkZi9iZGZsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxMDg4Ny4uMDAwMDAwMAotLS0gYS9zcmMvYmRmL2JkZmxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDAgQ29tcHV0aW5nIFJlc2VhcmNoIExhYnMsIE5ldyBNZXhpY28gU3RhdGUgVW5pdmVyc2l0eQotICogQ29weXJpZ2h0IDIwMDEtMjAxNAotICogICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBDT01QVVRJTkcgUkVTRUFSQ0ggTEFCIE9SIE5FVyBNRVhJQ08gU1RBVEUgVU5JVkVSU0lUWSBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVAotICogT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SCi0gKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBiZGYuYyx2IDEuMjIgMjAwMC8wMy8xNiAyMDowODo1MCAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgdGFrZW4gZnJvbSBNYXJrIExlaXNoZXIncyB4bWJkZmVkIHBhY2thZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLSNpbmNsdWRlICJiZGYuaCIKLSNpbmNsdWRlICJiZGZlcnJvci5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYmRmbGliCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmF1bHQgQkRGIGZvbnQgb3B0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgY29uc3QgYmRmX29wdGlvbnNfdCAgX2JkZl9vcHRzID0KLSAgewotICAgIDEsICAgICAgICAgICAgICAgIC8qIENvcnJlY3QgbWV0cmljcy4gICAgICAgICAgICAgICAqLwotICAgIDEsICAgICAgICAgICAgICAgIC8qIFByZXNlcnZlIHVuZW5jb2RlZCBnbHlwaHMuICAgICAqLwotICAgIDAsICAgICAgICAgICAgICAgIC8qIFByZXNlcnZlIGNvbW1lbnRzLiAgICAgICAgICAgICAqLwotICAgIEJERl9QUk9QT1JUSU9OQUwgIC8qIERlZmF1bHQgc3BhY2luZy4gICAgICAgICAgICAgICAqLwotICB9OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCdWlsdGluIEJERiBmb250IHByb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIExpc3Qgb2YgbW9zdCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYXBwZWFyIGluIGEgZm9udC4gIERvZXNuJ3QgaW5jbHVkZSAqLwotICAvKiB0aGUgUkFXXyogYW5kIEFYSVNfKiBwcm9wZXJ0aWVzIGluIFgxMVI2IHBvbHltb3JwaGljIGZvbnRzLiAgICAgICAgICAgKi8KLQotICBzdGF0aWMgY29uc3QgYmRmX3Byb3BlcnR5X3QgIF9iZGZfcHJvcGVydGllc1tdID0KLSAgewotICAgIHsgKGNoYXIgKikiQUREX1NUWUxFX05BTUUiLCAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJBVkVSQUdFX1dJRFRIIiwgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkFWR19DQVBJVEFMX1dJRFRIIiwgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiQVZHX0xPV0VSQ0FTRV9XSURUSCIsICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJDQVBfSEVJR0hUIiwgICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkNIQVJTRVRfQ09MTEVDVElPTlMiLCAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiQ0hBUlNFVF9FTkNPRElORyIsICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJDSEFSU0VUX1JFR0lTVFJZIiwgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkNPTU1FTlQiLCAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiQ09QWVJJR0hUIiwgICAgICAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJERUZBVUxUX0NIQVIiLCAgICAgICAgICAgIEJERl9DQVJESU5BTCwgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkRFU1RJTkFUSU9OIiwgICAgICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiREVWSUNFX0ZPTlRfTkFNRSIsICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJFTkRfU1BBQ0UiLCAgICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkZBQ0VfTkFNRSIsICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiRkFNSUxZX05BTUUiLCAgICAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJGSUdVUkVfV0lEVEgiLCAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkZPTlQiLCAgICAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiRk9OVE5BTUVfUkVHSVNUUlkiLCAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJGT05UX0FTQ0VOVCIsICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkZPTlRfREVTQ0VOVCIsICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiRk9VTkRSWSIsICAgICAgICAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJGVUxMX05BTUUiLCAgICAgICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIklUQUxJQ19BTkdMRSIsICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiTUFYX1NQQUNFIiwgICAgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJNSU5fU1BBQ0UiLCAgICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIk5PUk1fU1BBQ0UiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiTk9USUNFIiwgICAgICAgICAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJQSVhFTF9TSVpFIiwgICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlBPSU5UX1NJWkUiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUVVBRF9XSURUSCIsICAgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfQVNDRU5UIiwgICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19BVkVSQUdFX1dJRFRIIiwgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX0FWR19DQVBJVEFMX1dJRFRIIiwgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfQVZHX0xPV0VSQ0FTRV9XSURUSCIsIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19DQVBfSEVJR0hUIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX0RFU0NFTlQiLCAgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfRU5EX1NQQUNFIiwgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19GSUdVUkVfV0lEVEgiLCAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX01BWF9TUEFDRSIsICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfTUlOX1NQQUNFIiwgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19OT1JNX1NQQUNFIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1BJWEVMX1NJWkUiLCAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfUE9JTlRfU0laRSIsICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19QSVhFTFNJWkUiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1BPSU5UU0laRSIsICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfUVVBRF9XSURUSCIsICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19TTUFMTF9DQVBfU0laRSIsICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1NUUklLRU9VVF9BU0NFTlQiLCAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfU1RSSUtFT1VUX0RFU0NFTlQiLCAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19TVUJTQ1JJUFRfU0laRSIsICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1NVQlNDUklQVF9YIiwgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfU1VCU0NSSVBUX1kiLCAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19TVVBFUlNDUklQVF9TSVpFIiwgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1NVUEVSU0NSSVBUX1giLCAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfU1VQRVJTQ1JJUFRfWSIsICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19VTkRFUkxJTkVfUE9TSVRJT04iLCAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1VOREVSTElORV9USElDS05FU1MiLCBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfWF9IRUlHSFQiLCAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJFTEFUSVZFX1NFVFdJRFRIIiwgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkVMQVRJVkVfV0VJR0hUIiwgICAgICAgICBCREZfQ0FSRElOQUwsIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSRVNPTFVUSU9OIiwgICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJFU09MVVRJT05fWCIsICAgICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkVTT0xVVElPTl9ZIiwgICAgICAgICAgICBCREZfQ0FSRElOQUwsIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJTRVRXSURUSF9OQU1FIiwgICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlNMQU5UIiwgICAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiU01BTExfQ0FQX1NJWkUiLCAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJTUEFDSU5HIiwgICAgICAgICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlNUUklLRU9VVF9BU0NFTlQiLCAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiU1RSSUtFT1VUX0RFU0NFTlQiLCAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJTVUJTQ1JJUFRfU0laRSIsICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlNVQlNDUklQVF9YIiwgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiU1VCU0NSSVBUX1kiLCAgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJTVVBFUlNDUklQVF9TSVpFIiwgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlNVUEVSU0NSSVBUX1giLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiU1VQRVJTQ1JJUFRfWSIsICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJVTkRFUkxJTkVfUE9TSVRJT04iLCAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlVOREVSTElORV9USElDS05FU1MiLCAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiV0VJR0hUIiwgICAgICAgICAgICAgICAgICBCREZfQ0FSRElOQUwsIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJXRUlHSFRfTkFNRSIsICAgICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlhfSEVJR0hUIiwgICAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiX01VTEVfQkFTRUxJTkVfT0ZGU0VUIiwgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJfTVVMRV9SRUxBVElWRV9DT01QT1NFIiwgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZwotICBfbnVtX2JkZl9wcm9wZXJ0aWVzID0gc2l6ZW9mICggX2JkZl9wcm9wZXJ0aWVzICkgLwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggX2JkZl9wcm9wZXJ0aWVzWzBdICk7Ci0KLQotICAvKiBBbiBhdXhpbGlhcnkgbWFjcm8gdG8gcGFyc2UgcHJvcGVydGllcywgdG8gYmUgdXNlZCBpbiBjb25kaXRpb25hbHMuICovCi0gIC8qIEl0IGJlaGF2ZXMgbGlrZSBgc3RybmNtcCcgYnV0IGFsc28gdGVzdHMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgICAgKi8KLSAgLyogd2hldGhlciBpdCBpcyBhIHdoaXRlc3BhY2Ugb3IgTlVMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgcHJvcGVydHknIGlzIGEgY29uc3RhbnQgc3RyaW5nIG9mIGxlbmd0aCBgbicgdG8gY29tcGFyZSB3aXRoLiAgICAgICovCi0jZGVmaW5lIF9iZGZfc3RybmNtcCggbmFtZSwgcHJvcGVydHksIG4gKSAgICAgIFwKLSAgICAgICAgICAoIGZ0X3N0cm5jbXAoIG5hbWUsIHByb3BlcnR5LCBuICkgfHwgXAotICAgICAgICAgICAgISggbmFtZVtuXSA9PSAnICcgIHx8ICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICBuYW1lW25dID09ICdcMCcgfHwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgIG5hbWVbbl0gPT0gJ1xuJyB8fCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgbmFtZVtuXSA9PSAnXHInIHx8ICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICBuYW1lW25dID09ICdcdCcgKSAgICAgICAgICAgICkKLQotICAvKiBBdXRvIGNvcnJlY3Rpb24gbWVzc2FnZXMuICovCi0jZGVmaW5lIEFDTVNHMSAgICJGT05UX0FTQ0VOVCBwcm9wZXJ0eSBtaXNzaW5nLiAgIiBcCi0gICAgICAgICAgICAgICAgICJBZGRlZCBgRk9OVF9BU0NFTlQgJWhkJy5cbiIKLSNkZWZpbmUgQUNNU0cyICAgIkZPTlRfREVTQ0VOVCBwcm9wZXJ0eSBtaXNzaW5nLiAgIiBcCi0gICAgICAgICAgICAgICAgICJBZGRlZCBgRk9OVF9ERVNDRU5UICVoZCcuXG4iCi0jZGVmaW5lIEFDTVNHMyAgICJGb250IHdpZHRoICE9IGFjdHVhbCB3aWR0aC4gIE9sZDogJWhkIE5ldzogJWhkLlxuIgotI2RlZmluZSBBQ01TRzQgICAiRm9udCBsZWZ0IGJlYXJpbmcgIT0gYWN0dWFsIGxlZnQgYmVhcmluZy4gICIgXAotICAgICAgICAgICAgICAgICAiT2xkOiAlaGQgTmV3OiAlaGQuXG4iCi0jZGVmaW5lIEFDTVNHNSAgICJGb250IGFzY2VudCAhPSBhY3R1YWwgYXNjZW50LiAgT2xkOiAlaGQgTmV3OiAlaGQuXG4iCi0jZGVmaW5lIEFDTVNHNiAgICJGb250IGRlc2NlbnQgIT0gYWN0dWFsIGRlc2NlbnQuICBPbGQ6ICVoZCBOZXc6ICVoZC5cbiIKLSNkZWZpbmUgQUNNU0c3ICAgIkZvbnQgaGVpZ2h0ICE9IGFjdHVhbCBoZWlnaHQuIE9sZDogJWhkIE5ldzogJWhkLlxuIgotI2RlZmluZSBBQ01TRzggICAiR2x5cGggc2NhbGFibGUgd2lkdGggKFNXSURUSCkgYWRqdXN0bWVudHMgbWFkZS5cbiIKLSNkZWZpbmUgQUNNU0c5ICAgIlNXSURUSCBmaWVsZCBtaXNzaW5nIGF0IGxpbmUgJWxkLiAgU2V0IGF1dG9tYXRpY2FsbHkuXG4iCi0jZGVmaW5lIEFDTVNHMTAgICJEV0lEVEggZmllbGQgbWlzc2luZyBhdCBsaW5lICVsZC4gIFNldCB0byBnbHlwaCB3aWR0aC5cbiIKLSNkZWZpbmUgQUNNU0cxMSAgIlNJWkUgYml0cyBwZXIgcGl4ZWwgZmllbGQgYWRqdXN0ZWQgdG8gJWhkLlxuIgotI2RlZmluZSBBQ01TRzEyICAiRHVwbGljYXRlIGVuY29kaW5nICVsZCAoJXMpIGNoYW5nZWQgdG8gdW5lbmNvZGVkLlxuIgotI2RlZmluZSBBQ01TRzEzICAiR2x5cGggJWxkIGV4dHJhIHJvd3MgcmVtb3ZlZC5cbiIKLSNkZWZpbmUgQUNNU0cxNCAgIkdseXBoICVsZCBleHRyYSBjb2x1bW5zIHJlbW92ZWQuXG4iCi0jZGVmaW5lIEFDTVNHMTUgICJJbmNvcnJlY3QgZ2x5cGggY291bnQ6ICVsZCBpbmRpY2F0ZWQgYnV0ICVsZCBmb3VuZC5cbiIKLSNkZWZpbmUgQUNNU0cxNiAgIkdseXBoICVsZCBtaXNzaW5nIGNvbHVtbnMgcGFkZGVkIHdpdGggemVybyBiaXRzLlxuIgotI2RlZmluZSBBQ01TRzE3ICAiQWRqdXN0aW5nIG51bWJlciBvZiBnbHlwaHMgdG8gJWxkLlxuIgotCi0gIC8qIEVycm9yIG1lc3NhZ2VzLiAqLwotI2RlZmluZSBFUlJNU0cxICAiW2xpbmUgJWxkXSBNaXNzaW5nIGAlcycgbGluZS5cbiIKLSNkZWZpbmUgRVJSTVNHMiAgIltsaW5lICVsZF0gRm9udCBoZWFkZXIgY29ycnVwdGVkIG9yIG1pc3NpbmcgZmllbGRzLlxuIgotI2RlZmluZSBFUlJNU0czICAiW2xpbmUgJWxkXSBGb250IGdseXBocyBjb3JydXB0ZWQgb3IgbWlzc2luZyBmaWVsZHMuXG4iCi0jZGVmaW5lIEVSUk1TRzQgICJbbGluZSAlbGRdIEJCWCB0b28gYmlnLlxuIgotI2RlZmluZSBFUlJNU0c1ICAiW2xpbmUgJWxkXSBgJXMnIHZhbHVlIHRvbyBiaWcuXG4iCi0jZGVmaW5lIEVSUk1TRzYgICJbbGluZSAlbGRdIElucHV0IGxpbmUgdG9vIGxvbmcuXG4iCi0jZGVmaW5lIEVSUk1TRzcgICJbbGluZSAlbGRdIEZvbnQgbmFtZSB0b28gbG9uZy5cbiIKLSNkZWZpbmUgRVJSTVNHOCAgIltsaW5lICVsZF0gSW52YWxpZCBgJXMnIHZhbHVlLlxuIgotI2RlZmluZSBFUlJNU0c5ICAiW2xpbmUgJWxkXSBJbnZhbGlkIGtleXdvcmQuXG4iCi0KLSAgLyogRGVidWcgbWVzc2FnZXMuICovCi0jZGVmaW5lIERCR01TRzEgICIgIFslNmxkXSAlcyIgLyogbm8gXG4gKi8KLSNkZWZpbmUgREJHTVNHMiAgIiAoMHglbFgpXG4iCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFV0aWxpdHkgdHlwZXMgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBGdW5jdGlvbiB0eXBlIGZvciBwYXJzaW5nIGxpbmVzIG9mIGEgQkRGIGZvbnQuICovCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKl9iZGZfbGluZV9mdW5jX3QpKCBjaGFyKiAgICAgICAgICBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBsaW5lbGVuLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIGNhbGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgY2xpZW50X2RhdGEgKTsKLQotCi0gIC8qIExpc3Qgc3RydWN0dXJlIGZvciBzcGxpdHRpbmcgbGluZXMgaW50byBmaWVsZHMuICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIF9iZGZfbGlzdF90XwotICB7Ci0gICAgY2hhcioqICAgICAgICAgZmllbGQ7Ci0gICAgdW5zaWduZWQgbG9uZyAgc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nICB1c2VkOwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeTsKLQotICB9IF9iZGZfbGlzdF90OwotCi0KLSAgLyogU3RydWN0dXJlIHVzZWQgd2hpbGUgbG9hZGluZyBCREYgZm9udHMuICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIF9iZGZfcGFyc2VfdF8KLSAgewotICAgIHVuc2lnbmVkIGxvbmcgICBmbGFnczsKLSAgICB1bnNpZ25lZCBsb25nICAgY250OwotICAgIHVuc2lnbmVkIGxvbmcgICByb3c7Ci0KLSAgICBzaG9ydCAgICAgICAgICAgbWlubGI7Ci0gICAgc2hvcnQgICAgICAgICAgIG1heGxiOwotICAgIHNob3J0ICAgICAgICAgICBtYXhyYjsKLSAgICBzaG9ydCAgICAgICAgICAgbWF4YXM7Ci0gICAgc2hvcnQgICAgICAgICAgIG1heGRzOwotCi0gICAgc2hvcnQgICAgICAgICAgIHJiZWFyaW5nOwotCi0gICAgY2hhciogICAgICAgICAgIGdseXBoX25hbWU7Ci0gICAgbG9uZyAgICAgICAgICAgIGdseXBoX2VuYzsKLQotICAgIGJkZl9mb250X3QqICAgICBmb250OwotICAgIGJkZl9vcHRpb25zX3QqICBvcHRzOwotCi0gICAgdW5zaWduZWQgbG9uZyAgIGhhdmVbMzQ4MTZdOyAvKiBtdXN0IGJlIGluIHN5bmMgd2l0aCBgbm1vZCcgYW5kIGB1bW9kJyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJyYXlzIGZyb20gYGJkZl9mb250X3QnIHN0cnVjdHVyZSAgICAgKi8KLSAgICBfYmRmX2xpc3RfdCAgICAgbGlzdDsKLQotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnk7Ci0gICAgdW5zaWduZWQgbG9uZyAgIHNpemU7ICAgICAgICAvKiB0aGUgc3RyZWFtIHNpemUgKi8KLQotICB9IF9iZGZfcGFyc2VfdDsKLQotCi0jZGVmaW5lIHNldHNiaXQoIG0sIGNjICkgXAotICAgICAgICAgICggbVsoRlRfQnl0ZSkoY2MpID4+IDNdIHw9IChGVF9CeXRlKSggMSA8PCAoIChjYykgJiA3ICkgKSApCi0jZGVmaW5lIHNiaXRzZXQoIG0sIGNjICkgXAotICAgICAgICAgICggbVsoRlRfQnl0ZSkoY2MpID4+IDNdICAmICggMSA8PCAoIChjYykgJiA3ICkgKSApCi0KLQotICBzdGF0aWMgdm9pZAotICBfYmRmX2xpc3RfaW5pdCggX2JkZl9saXN0X3QqICBsaXN0LAotICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfWkVSTyggbGlzdCApOwotICAgIGxpc3QtPm1lbW9yeSA9IG1lbW9yeTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgX2JkZl9saXN0X2RvbmUoIF9iZGZfbGlzdF90KiAgbGlzdCApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpc3QtPm1lbW9yeTsKLQotCi0gICAgaWYgKCBtZW1vcnkgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGxpc3QtPmZpZWxkICk7Ci0gICAgICBGVF9aRVJPKCBsaXN0ICk7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgX2JkZl9saXN0X2Vuc3VyZSggX2JkZl9saXN0X3QqICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgbnVtX2l0ZW1zICkgLyogc2FtZSBhcyBfYmRmX2xpc3RfdC51c2VkICovCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggbnVtX2l0ZW1zID4gbGlzdC0+c2l6ZSApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyAgb2xkc2l6ZSA9IGxpc3QtPnNpemU7IC8qIHNhbWUgYXMgX2JkZl9saXN0X3Quc2l6ZSAqLwotICAgICAgdW5zaWduZWQgbG9uZyAgbmV3c2l6ZSA9IG9sZHNpemUgKyAoIG9sZHNpemUgPj4gMSApICsgNTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgIGJpZ3NpemUgPSAodW5zaWduZWQgbG9uZykoIEZUX0lOVF9NQVggLyBzaXplb2YgKCBjaGFyKiApICk7Ci0gICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgID0gbGlzdC0+bWVtb3J5OwotCi0KLSAgICAgIGlmICggb2xkc2l6ZSA9PSBiaWdzaXplICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggbmV3c2l6ZSA8IG9sZHNpemUgfHwgbmV3c2l6ZSA+IGJpZ3NpemUgKQotICAgICAgICBuZXdzaXplID0gYmlnc2l6ZTsKLQotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggbGlzdC0+ZmllbGQsIG9sZHNpemUsIG5ld3NpemUgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgbGlzdC0+c2l6ZSA9IG5ld3NpemU7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBfYmRmX2xpc3Rfc2hpZnQoIF9iZGZfbGlzdF90KiAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgbiApCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nICBpLCB1OwotCi0KLSAgICBpZiAoIGxpc3QgPT0gMCB8fCBsaXN0LT51c2VkID09IDAgfHwgbiA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggbiA+PSBsaXN0LT51c2VkICkKLSAgICB7Ci0gICAgICBsaXN0LT51c2VkID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKCB1ID0gbiwgaSA9IDA7IHUgPCBsaXN0LT51c2VkOyBpKyssIHUrKyApCi0gICAgICBsaXN0LT5maWVsZFtpXSA9IGxpc3QtPmZpZWxkW3VdOwotICAgIGxpc3QtPnVzZWQgLT0gbjsKLSAgfQotCi0KLSAgLyogQW4gZW1wdHkgc3RyaW5nIGZvciBlbXB0eSBmaWVsZHMuICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIgIGVtcHR5WzFdID0geyAwIH07ICAgICAgLyogWFhYIGVsaW1pbmF0ZSB0aGlzICovCi0KLQotICBzdGF0aWMgY2hhciAqCi0gIF9iZGZfbGlzdF9qb2luKCBfYmRmX2xpc3RfdCogICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgKmFsZW4gKQotICB7Ci0gICAgdW5zaWduZWQgbG9uZyAgaSwgajsKLSAgICBjaGFyKiAgICAgICAgICBkcDsKLQotCi0gICAgKmFsZW4gPSAwOwotCi0gICAgaWYgKCBsaXN0ID09IDAgfHwgbGlzdC0+dXNlZCA9PSAwICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZHAgPSBsaXN0LT5maWVsZFswXTsKLSAgICBmb3IgKCBpID0gaiA9IDA7IGkgPCBsaXN0LT51c2VkOyBpKysgKQotICAgIHsKLSAgICAgIGNoYXIqICBmcCA9IGxpc3QtPmZpZWxkW2ldOwotCi0KLSAgICAgIHdoaWxlICggKmZwICkKLSAgICAgICAgZHBbaisrXSA9ICpmcCsrOwotCi0gICAgICBpZiAoIGkgKyAxIDwgbGlzdC0+dXNlZCApCi0gICAgICAgIGRwW2orK10gPSAoY2hhciljOwotICAgIH0KLSAgICBpZiAoIGRwICE9IGVtcHR5ICkKLSAgICAgIGRwW2pdID0gMDsKLQotICAgICphbGVuID0gajsKLSAgICByZXR1cm4gZHA7Ci0gIH0KLQotCi0gIC8qIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IDQgKyAxIGBmaWVsZCcgKi8KLSAgLyogZWxlbWVudHMgaW4gYGxpc3QnICh3aGljaCBhcmUgcG9zc2libHkgTlVMTCkgc28gdGhhdCB3ZSAgICAqLwotICAvKiBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIG1vc3QgY2FzZXMuICAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIF9iZGZfbGlzdF9zcGxpdCggX2JkZl9saXN0X3QqICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgICBzZXBhcmF0b3JzLAotICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgbGluZWxlbiApCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nICBmaW5hbF9lbXB0eTsKLSAgICBpbnQgICAgICAgICAgICBtdWx0OwotICAgIGNoYXIgICAgICAgICAgICpzcCwgKmVwLCAqZW5kOwotICAgIGNoYXIgICAgICAgICAgIHNlcHNbMzJdOwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBsaXN0LiAqLwotICAgIGxpc3QtPnVzZWQgPSAwOwotICAgIGlmICggbGlzdC0+c2l6ZSApCi0gICAgewotICAgICAgbGlzdC0+ZmllbGRbMF0gPSAoY2hhciopZW1wdHk7Ci0gICAgICBsaXN0LT5maWVsZFsxXSA9IChjaGFyKillbXB0eTsKLSAgICAgIGxpc3QtPmZpZWxkWzJdID0gKGNoYXIqKWVtcHR5OwotICAgICAgbGlzdC0+ZmllbGRbM10gPSAoY2hhciopZW1wdHk7Ci0gICAgICBsaXN0LT5maWVsZFs0XSA9IChjaGFyKillbXB0eTsKLSAgICB9Ci0KLSAgICAvKiBJZiB0aGUgbGluZSBpcyBlbXB0eSwgdGhlbiBzaW1wbHkgcmV0dXJuLiAqLwotICAgIGlmICggbGluZWxlbiA9PSAwIHx8IGxpbmVbMF0gPT0gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBJbiB0aGUgb3JpZ2luYWwgY29kZSwgaWYgdGhlIGBzZXBhcmF0b3JzJyBwYXJhbWV0ZXIgaXMgTlVMTCBvciAqLwotICAgIC8qIGVtcHR5LCB0aGUgbGlzdCBpcyBzcGxpdCBpbnRvIGluZGl2aWR1YWwgYnl0ZXMuICBXZSBkb24ndCBuZWVkICovCi0gICAgLyogdGhpcywgc28gYW4gZXJyb3IgaXMgc2lnbmFsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIHNlcGFyYXRvcnMgPT0gMCB8fCAqc2VwYXJhdG9ycyA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogUHJlcGFyZSB0aGUgc2VwYXJhdG9yIGJpdG1hcC4gKi8KLSAgICBGVF9NRU1fWkVSTyggc2VwcywgMzIgKTsKLQotICAgIC8qIElmIHRoZSB2ZXJ5IGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzZXBhcmF0b3Igc3RyaW5nIGlzIGEgcGx1cywgdGhlbiAqLwotICAgIC8qIHNldCB0aGUgYG11bHQnIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBtdWx0aXBsZSBzZXBhcmF0b3JzIHNob3VsZCBiZSAqLwotICAgIC8qIGNvbGxhcHNlZCBpbnRvIG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIG11bHQgPSAwLCBzcCA9IHNlcGFyYXRvcnM7IHNwICYmICpzcDsgc3ArKyApCi0gICAgewotICAgICAgaWYgKCAqc3AgPT0gJysnICYmICooIHNwICsgMSApID09IDAgKQotICAgICAgICBtdWx0ID0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2V0c2JpdCggc2VwcywgKnNwICk7Ci0gICAgfQotCi0gICAgLyogQnJlYWsgdGhlIGxpbmUgdXAgaW50byBmaWVsZHMuICovCi0gICAgZm9yICggZmluYWxfZW1wdHkgPSAwLCBzcCA9IGVwID0gbGluZSwgZW5kID0gc3AgKyBsaW5lbGVuOwotICAgICAgICAgIHNwIDwgZW5kICYmICpzcDsgKQotICAgIHsKLSAgICAgIC8qIENvbGxlY3QgZXZlcnl0aGluZyB0aGF0IGlzIG5vdCBhIHNlcGFyYXRvci4gKi8KLSAgICAgIGZvciAoIDsgKmVwICYmICFzYml0c2V0KCBzZXBzLCAqZXAgKTsgZXArKyApCi0gICAgICAgIDsKLQotICAgICAgLyogUmVzaXplIHRoZSBsaXN0IGlmIG5lY2Vzc2FyeS4gKi8KLSAgICAgIGlmICggbGlzdC0+dXNlZCA9PSBsaXN0LT5zaXplICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBfYmRmX2xpc3RfZW5zdXJlKCBsaXN0LCBsaXN0LT51c2VkICsgMSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEFzc2lnbiB0aGUgZmllbGQgYXBwcm9wcmlhdGVseS4gKi8KLSAgICAgIGxpc3QtPmZpZWxkW2xpc3QtPnVzZWQrK10gPSAoIGVwID4gc3AgKSA/IHNwIDogKGNoYXIqKWVtcHR5OwotCi0gICAgICBzcCA9IGVwOwotCi0gICAgICBpZiAoIG11bHQgKQotICAgICAgewotICAgICAgICAvKiBJZiBtdWx0aXBsZSBzZXBhcmF0b3JzIHNob3VsZCBiZSBjb2xsYXBzZWQsIGRvIGl0IG5vdyBieSAqLwotICAgICAgICAvKiBzZXR0aW5nIGFsbCB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlcnMgdG8gMC4gICAgICAgICAgICAgICAqLwotICAgICAgICBmb3IgKCA7ICplcCAmJiBzYml0c2V0KCBzZXBzLCAqZXAgKTsgZXArKyApCi0gICAgICAgICAgKmVwID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCAqZXAgIT0gMCApCi0gICAgICAgIC8qIERvbid0IGNvbGxhcHNlIG11bHRpcGxlIHNlcGFyYXRvcnMgYnkgbWFraW5nIHRoZW0gMCwgc28ganVzdCAqLwotICAgICAgICAvKiBtYWtlIHRoZSBvbmUgZW5jb3VudGVyZWQgMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgKmVwKysgPSAwOwotCi0gICAgICBmaW5hbF9lbXB0eSA9ICggZXAgPiBzcCAmJiAqZXAgPT0gMCApOwotICAgICAgc3AgPSBlcDsKLSAgICB9Ci0KLSAgICAvKiBGaW5hbGx5LCBOVUxMLXRlcm1pbmF0ZSB0aGUgbGlzdC4gKi8KLSAgICBpZiAoIGxpc3QtPnVzZWQgKyBmaW5hbF9lbXB0eSA+PSBsaXN0LT5zaXplICkKLSAgICB7Ci0gICAgICBlcnJvciA9IF9iZGZfbGlzdF9lbnN1cmUoIGxpc3QsIGxpc3QtPnVzZWQgKyBmaW5hbF9lbXB0eSArIDEgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBmaW5hbF9lbXB0eSApCi0gICAgICBsaXN0LT5maWVsZFtsaXN0LT51c2VkKytdID0gKGNoYXIqKWVtcHR5OwotCi0gICAgbGlzdC0+ZmllbGRbbGlzdC0+dXNlZF0gPSAwOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2RlZmluZSBOT19TS0lQICAyNTYgIC8qIHRoaXMgdmFsdWUgY2Fubm90IGJlIHN0b3JlZCBpbiBhICdjaGFyJyAqLwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIF9iZGZfcmVhZHN0cmVhbSggRlRfU3RyZWFtICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIF9iZGZfbGluZV9mdW5jX3QgIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIGNsaWVudF9kYXRhLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgKmxubyApCi0gIHsKLSAgICBfYmRmX2xpbmVfZnVuY190ICBjYjsKLSAgICB1bnNpZ25lZCBsb25nICAgICBsaW5lbm8sIGJ1Zl9zaXplOwotICAgIGludCAgICAgICAgICAgICAgIHJlZmlsbCwgaG9sZCwgdG9fc2tpcDsKLSAgICBwdHJkaWZmX3QgICAgICAgICBieXRlcywgc3RhcnQsIGVuZCwgY3Vyc29yLCBhdmFpbDsKLSAgICBjaGFyKiAgICAgICAgICAgICBidWYgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBjYWxsYmFjayA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbCBzaXplIGFuZCBhbGxvY2F0aW9uIG9mIHRoZSBpbnB1dCBidWZmZXIgKi8KLSAgICBidWZfc2l6ZSA9IDEwMjQ7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggYnVmLCBidWZfc2l6ZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGNiICAgICAgPSBjYWxsYmFjazsKLSAgICBsaW5lbm8gID0gMTsKLSAgICBidWZbMF0gID0gMDsKLSAgICBzdGFydCAgID0gMDsKLSAgICBhdmFpbCAgID0gMDsKLSAgICBjdXJzb3IgID0gMDsKLSAgICByZWZpbGwgID0gMTsKLSAgICB0b19za2lwID0gTk9fU0tJUDsKLSAgICBieXRlcyAgID0gMDsgICAgICAgIC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKCByZWZpbGwgKQotICAgICAgewotICAgICAgICBieXRlcyAgPSAocHRyZGlmZl90KUZUX1N0cmVhbV9UcnlSZWFkKAotICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgKEZUX0J5dGUqKWJ1ZiArIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAtICh1bnNpZ25lZCBsb25nKWN1cnNvciApOwotICAgICAgICBhdmFpbCAgPSBjdXJzb3IgKyBieXRlczsKLSAgICAgICAgY3Vyc29yID0gMDsKLSAgICAgICAgcmVmaWxsID0gMDsKLSAgICAgIH0KLQotICAgICAgZW5kID0gc3RhcnQ7Ci0KLSAgICAgIC8qIHNob3VsZCB3ZSBza2lwIGFuIG9wdGlvbmFsIGNoYXJhY3RlciBsaWtlIFxuIG9yIFxyPyAqLwotICAgICAgaWYgKCBzdGFydCA8IGF2YWlsICYmIGJ1ZltzdGFydF0gPT0gdG9fc2tpcCApCi0gICAgICB7Ci0gICAgICAgIHN0YXJ0ICArPSAxOwotICAgICAgICB0b19za2lwID0gTk9fU0tJUDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRyeSB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KLSAgICAgIHdoaWxlICggZW5kIDwgYXZhaWwgJiYgYnVmW2VuZF0gIT0gJ1xuJyAmJiBidWZbZW5kXSAhPSAnXHInICkKLSAgICAgICAgZW5kKys7Ci0KLSAgICAgIC8qIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIHRyeSBzaGlmdGluZyBpdHMgY29udGVudCAqLwotICAgICAgLyogb3IgZXZlbiByZXNpemluZyBpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGVuZCA+PSBhdmFpbCApCi0gICAgICB7Ci0gICAgICAgIGlmICggYnl0ZXMgPT0gMCApICAvKiBsYXN0IGxpbmUgaW4gZmlsZSBkb2Vzbid0IGVuZCBpbiBcciBvciBcbiAqLwotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgLyogaWdub3JlIGl0IHRoZW4gZXhpdCAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBpZiAoIHN0YXJ0ID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhpcyBsaW5lIGlzIGRlZmluaXRlbHkgdG9vIGxvbmc7IHRyeSByZXNpemluZyB0aGUgaW5wdXQgKi8KLSAgICAgICAgICAvKiBidWZmZXIgYSBiaXQgdG8gaGFuZGxlIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIEZUX1VMb25nICBuZXdfc2l6ZTsKLQotCi0gICAgICAgICAgaWYgKCBidWZfc2l6ZSA+PSA2NTUzNlVMICkgIC8qIGxpbWl0IG91cnNlbHZlcyB0byA2NEtCeXRlICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRVJST1IoKCAiX2JkZl9yZWFkc3RyZWFtOiAiIEVSUk1TRzYsIGxpbmVubyApKTsKLSAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBuZXdfc2l6ZSA9IGJ1Zl9zaXplICogMjsKLSAgICAgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBidWYsIGJ1Zl9zaXplLCBuZXdfc2l6ZSApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIGN1cnNvciAgID0gKHB0cmRpZmZfdClidWZfc2l6ZTsKLSAgICAgICAgICBidWZfc2l6ZSA9IG5ld19zaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJ5dGVzID0gYXZhaWwgLSBzdGFydDsKLQotICAgICAgICAgIEZUX01FTV9NT1ZFKCBidWYsIGJ1ZiArIHN0YXJ0LCBieXRlcyApOwotCi0gICAgICAgICAgY3Vyc29yID0gYnl0ZXM7Ci0gICAgICAgICAgYXZhaWwgLT0gYnl0ZXM7Ci0gICAgICAgICAgc3RhcnQgID0gMDsKLSAgICAgICAgfQotICAgICAgICByZWZpbGwgPSAxOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogVGVtcG9yYXJpbHkgTlVMLXRlcm1pbmF0ZSB0aGUgbGluZS4gKi8KLSAgICAgIGhvbGQgICAgID0gYnVmW2VuZF07Ci0gICAgICBidWZbZW5kXSA9IDA7Ci0KLSAgICAgIC8qIFhYWDogVXNlIGVuY29kaW5nIGluZGVwZW5kZW50IHZhbHVlIGZvciAweDFBICovCi0gICAgICBpZiAoIGJ1ZltzdGFydF0gIT0gJyMnICYmIGJ1ZltzdGFydF0gIT0gMHgxQSAmJiBlbmQgPiBzdGFydCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gKCpjYikoIGJ1ZiArIHN0YXJ0LCAodW5zaWduZWQgbG9uZykoIGVuZCAtIHN0YXJ0ICksIGxpbmVubywKLSAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZjYiwgY2xpZW50X2RhdGEgKTsKLSAgICAgICAgLyogUmVkbyBpZiB3ZSBoYXZlIGVuY291bnRlcmVkIENIQVJTIHdpdGhvdXQgcHJvcGVydGllcy4gKi8KLSAgICAgICAgaWYgKCBlcnJvciA9PSAtMSApCi0gICAgICAgICAgZXJyb3IgPSAoKmNiKSggYnVmICsgc3RhcnQsICh1bnNpZ25lZCBsb25nKSggZW5kIC0gc3RhcnQgKSwgbGluZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmY2IsIGNsaWVudF9kYXRhICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBsaW5lbm8gICs9IDE7Ci0gICAgICBidWZbZW5kXSA9IChjaGFyKWhvbGQ7Ci0gICAgICBzdGFydCAgICA9IGVuZCArIDE7Ci0KLSAgICAgIGlmICggaG9sZCA9PSAnXG4nICkKLSAgICAgICAgdG9fc2tpcCA9ICdccic7Ci0gICAgICBlbHNlIGlmICggaG9sZCA9PSAnXHInICkKLSAgICAgICAgdG9fc2tpcCA9ICdcbic7Ci0gICAgICBlbHNlCi0gICAgICAgIHRvX3NraXAgPSBOT19TS0lQOwotICAgIH0KLQotICAgICpsbm8gPSBsaW5lbm87Ci0KLSAgRXhpdDoKLSAgICBGVF9GUkVFKCBidWYgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIFhYWDogbWFrZSB0aGlzIHdvcmsgd2l0aCBFQkNESUMgYWxzbyAqLwotCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICBhMmlbMTI4XSA9Ci0gIHsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAgZGRpZ2l0c1szMl0gPQotICB7Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMywKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAgaGRpZ2l0c1szMl0gPQotICB7Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMywKLSAgICAweDdFLCAweDAwLCAweDAwLCAweDAwLCAweDdFLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgfTsKLQotCi0gIC8qIFJvdXRpbmUgdG8gY29udmVydCBhIGRlY2ltYWwgQVNDSUkgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlci4gKi8KLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcKLSAgX2JkZl9hdG91bCggY2hhciogIHMgKQotICB7Ci0gICAgdW5zaWduZWQgbG9uZyAgdjsKLQotCi0gICAgaWYgKCBzID09IDAgfHwgKnMgPT0gMCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGZvciAoIHYgPSAwOyBzYml0c2V0KCBkZGlnaXRzLCAqcyApOyBzKysgKQotICAgIHsKLSAgICAgIGlmICggdiA8ICggVUxPTkdfTUFYIC0gOSApIC8gMTAgKQotICAgICAgICB2ID0gdiAqIDEwICsgYTJpWyhpbnQpKnNdOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2ID0gVUxPTkdfTUFYOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdjsKLSAgfQotCi0KLSAgLyogUm91dGluZSB0byBjb252ZXJ0IGEgZGVjaW1hbCBBU0NJSSBzdHJpbmcgdG8gYSBzaWduZWQgbG9uZyBpbnRlZ2VyLiAqLwotICBzdGF0aWMgbG9uZwotICBfYmRmX2F0b2woIGNoYXIqICBzICkKLSAgewotICAgIGxvbmcgIHYsIG5lZzsKLQotCi0gICAgaWYgKCBzID09IDAgfHwgKnMgPT0gMCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIENoZWNrIGZvciBhIG1pbnVzIHNpZ24uICovCi0gICAgbmVnID0gMDsKLSAgICBpZiAoICpzID09ICctJyApCi0gICAgewotICAgICAgcysrOwotICAgICAgbmVnID0gMTsKLSAgICB9Ci0KLSAgICBmb3IgKCB2ID0gMDsgc2JpdHNldCggZGRpZ2l0cywgKnMgKTsgcysrICkKLSAgICB7Ci0gICAgICBpZiAoIHYgPCAoIExPTkdfTUFYIC0gOSApIC8gMTAgKQotICAgICAgICB2ID0gdiAqIDEwICsgYTJpWyhpbnQpKnNdOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2ID0gTE9OR19NQVg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAoICFuZWcgKSA/IHYgOiAtdjsKLSAgfQotCi0KLSAgLyogUm91dGluZSB0byBjb252ZXJ0IGEgZGVjaW1hbCBBU0NJSSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgc2hvcnQgaW50ZWdlci4gKi8KLSAgc3RhdGljIHVuc2lnbmVkIHNob3J0Ci0gIF9iZGZfYXRvdXMoIGNoYXIqICBzICkKLSAgewotICAgIHVuc2lnbmVkIHNob3J0ICB2OwotCi0KLSAgICBpZiAoIHMgPT0gMCB8fCAqcyA9PSAwICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZm9yICggdiA9IDA7IHNiaXRzZXQoIGRkaWdpdHMsICpzICk7IHMrKyApCi0gICAgewotICAgICAgaWYgKCB2IDwgKCBVU0hSVF9NQVggLSA5ICkgLyAxMCApCi0gICAgICAgIHYgPSAodW5zaWduZWQgc2hvcnQpKCB2ICogMTAgKyBhMmlbKGludCkqc10gKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdiA9IFVTSFJUX01BWDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHY7Ci0gIH0KLQotCi0gIC8qIFJvdXRpbmUgdG8gY29udmVydCBhIGRlY2ltYWwgQVNDSUkgc3RyaW5nIHRvIGEgc2lnbmVkIHNob3J0IGludGVnZXIuICovCi0gIHN0YXRpYyBzaG9ydAotICBfYmRmX2F0b3MoIGNoYXIqICBzICkKLSAgewotICAgIHNob3J0ICB2LCBuZWc7Ci0KLQotICAgIGlmICggcyA9PSAwIHx8ICpzID09IDAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBDaGVjayBmb3IgYSBtaW51cy4gKi8KLSAgICBuZWcgPSAwOwotICAgIGlmICggKnMgPT0gJy0nICkKLSAgICB7Ci0gICAgICBzKys7Ci0gICAgICBuZWcgPSAxOwotICAgIH0KLQotICAgIGZvciAoIHYgPSAwOyBzYml0c2V0KCBkZGlnaXRzLCAqcyApOyBzKysgKQotICAgIHsKLSAgICAgIGlmICggdiA8ICggU0hSVF9NQVggLSA5ICkgLyAxMCApCi0gICAgICAgIHYgPSAoc2hvcnQpKCB2ICogMTAgKyBhMmlbKGludCkqc10gKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdiA9IFNIUlRfTUFYOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHNob3J0KSggKCAhbmVnICkgPyB2IDogLXYgKTsKLSAgfQotCi0KLSAgLyogUm91dGluZSB0byBjb21wYXJlIHR3byBnbHlwaHMgYnkgZW5jb2Rpbmcgc28gdGhleSBjYW4gYmUgc29ydGVkLiAqLwotICBzdGF0aWMgaW50Ci0gIGJ5X2VuY29kaW5nKCBjb25zdCB2b2lkKiAgYSwKLSAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBiICkKLSAgewotICAgIGJkZl9nbHlwaF90ICAqYzEsICpjMjsKLQotCi0gICAgYzEgPSAoYmRmX2dseXBoX3QgKilhOwotICAgIGMyID0gKGJkZl9nbHlwaF90ICopYjsKLQotICAgIGlmICggYzEtPmVuY29kaW5nIDwgYzItPmVuY29kaW5nICkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGlmICggYzEtPmVuY29kaW5nID4gYzItPmVuY29kaW5nICkKLSAgICAgIHJldHVybiAxOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBiZGZfY3JlYXRlX3Byb3BlcnR5KCBjaGFyKiAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgYmRmX2ZvbnRfdCogIGZvbnQgKQotICB7Ci0gICAgc2l6ZV90ICAgICAgICAgICBuOwotICAgIGJkZl9wcm9wZXJ0eV90KiAgcDsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGZvbnQtPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLQotCi0gICAgLyogRmlyc3QgY2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaGFzICAgICAgICAqLwotICAgIC8qIGFscmVhZHkgYmVlbiBhZGRlZCBvciBub3QuICBJZiBpdCBoYXMsIHRoZW4gKi8KLSAgICAvKiBzaW1wbHkgaWdub3JlIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBmdF9oYXNoX3N0cl9sb29rdXAoIG5hbWUsICYoZm9udC0+cHJvcHRibCkgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBmb250LT51c2VyX3Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPm51c2VyX3Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPm51c2VyX3Byb3BzICsgMSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHAgPSBmb250LT51c2VyX3Byb3BzICsgZm9udC0+bnVzZXJfcHJvcHM7Ci0gICAgRlRfWkVSTyggcCApOwotCi0gICAgbiA9IGZ0X3N0cmxlbiggbmFtZSApICsgMTsKLSAgICBpZiAoIG4gPiBGVF9VTE9OR19NQVggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggcC0+bmFtZSwgbiApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX01FTV9DT1BZKCAoY2hhciAqKXAtPm5hbWUsIG5hbWUsIG4gKTsKLQotICAgIHAtPmZvcm1hdCAgPSBmb3JtYXQ7Ci0gICAgcC0+YnVpbHRpbiA9IDA7Ci0KLSAgICBuID0gX251bV9iZGZfcHJvcGVydGllcyArIGZvbnQtPm51c2VyX3Byb3BzOwotCi0gICAgZXJyb3IgPSBmdF9oYXNoX3N0cl9pbnNlcnQoIHAtPm5hbWUsIG4sICYoZm9udC0+cHJvcHRibCksIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9udC0+bnVzZXJfcHJvcHMrKzsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBiZGZfcHJvcGVydHlfdCogKQotICBiZGZfZ2V0X3Byb3BlcnR5KCBjaGFyKiAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgYmRmX2ZvbnRfdCogIGZvbnQgKQotICB7Ci0gICAgc2l6ZV90KiAgcHJvcGlkOwotCi0KLSAgICBpZiAoIG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCAoIHByb3BpZCA9IGZ0X2hhc2hfc3RyX2xvb2t1cCggbmFtZSwgJihmb250LT5wcm9wdGJsKSApICkgPT0gTlVMTCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggKnByb3BpZCA+PSBfbnVtX2JkZl9wcm9wZXJ0aWVzICkKLSAgICAgIHJldHVybiBmb250LT51c2VyX3Byb3BzICsgKCAqcHJvcGlkIC0gX251bV9iZGZfcHJvcGVydGllcyApOwotCi0gICAgcmV0dXJuIChiZGZfcHJvcGVydHlfdCopX2JkZl9wcm9wZXJ0aWVzICsgKnByb3BpZDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCREYgZm9udCBmaWxlIHBhcnNpbmcgZmxhZ3MgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogUGFyc2UgZmxhZ3MuICovCi0KLSNkZWZpbmUgQkRGX1NUQVJUXyAgICAgIDB4MDAwMVUKLSNkZWZpbmUgQkRGX0ZPTlRfTkFNRV8gIDB4MDAwMlUKLSNkZWZpbmUgQkRGX1NJWkVfICAgICAgIDB4MDAwNFUKLSNkZWZpbmUgQkRGX0ZPTlRfQkJYXyAgIDB4MDAwOFUKLSNkZWZpbmUgQkRGX1BST1BTXyAgICAgIDB4MDAxMFUKLSNkZWZpbmUgQkRGX0dMWVBIU18gICAgIDB4MDAyMFUKLSNkZWZpbmUgQkRGX0dMWVBIXyAgICAgIDB4MDA0MFUKLSNkZWZpbmUgQkRGX0VOQ09ESU5HXyAgIDB4MDA4MFUKLSNkZWZpbmUgQkRGX1NXSURUSF8gICAgIDB4MDEwMFUKLSNkZWZpbmUgQkRGX0RXSURUSF8gICAgIDB4MDIwMFUKLSNkZWZpbmUgQkRGX0JCWF8gICAgICAgIDB4MDQwMFUKLSNkZWZpbmUgQkRGX0JJVE1BUF8gICAgIDB4MDgwMFUKLQotI2RlZmluZSBCREZfU1dJRFRIX0FESl8gIDB4MTAwMFUKLQotI2RlZmluZSBCREZfR0xZUEhfQklUU18gKCBCREZfR0xZUEhfICAgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBCREZfRU5DT0RJTkdfIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBCREZfU1dJRFRIXyAgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBCREZfRFdJRFRIXyAgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBCREZfQkJYXyAgICAgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBCREZfQklUTUFQXyAgICkKLQotI2RlZmluZSBCREZfR0xZUEhfV0lEVEhfQ0hFQ0tfICAgMHg0MDAwMDAwMFVMCi0jZGVmaW5lIEJERl9HTFlQSF9IRUlHSFRfQ0hFQ0tfICAweDgwMDAwMDAwVUwKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBfYmRmX2FkZF9jb21tZW50KCBiZGZfZm9udF90KiAgICBmb250LAotICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgICBjb21tZW50LAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBsZW4gKQotICB7Ci0gICAgY2hhciogICAgICBjcDsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZvbnQtPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBGVF9SRU5FV19BUlJBWSggZm9udC0+Y29tbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+Y29tbWVudHNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmNvbW1lbnRzX2xlbiArIGxlbiArIDEgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBjcCA9IGZvbnQtPmNvbW1lbnRzICsgZm9udC0+Y29tbWVudHNfbGVuOwotCi0gICAgRlRfTUVNX0NPUFkoIGNwLCBjb21tZW50LCBsZW4gKTsKLSAgICBjcFtsZW5dID0gJ1xuJzsKLQotICAgIGZvbnQtPmNvbW1lbnRzX2xlbiArPSBsZW4gKyAxOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBTZXQgdGhlIHNwYWNpbmcgZnJvbSB0aGUgZm9udCBuYW1lIGlmIGl0IGV4aXN0cywgb3Igc2V0IGl0IHRvIHRoZSAqLwotICAvKiBkZWZhdWx0IHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgX2JkZl9zZXRfZGVmYXVsdF9zcGFjaW5nKCBiZGZfZm9udF90KiAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGZfb3B0aW9uc190KiAgb3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgbGluZW5vICkKLSAgewotICAgIHNpemVfdCAgICAgICBsZW47Ci0gICAgY2hhciAgICAgICAgIG5hbWVbMjU2XTsKLSAgICBfYmRmX2xpc3RfdCAgbGlzdDsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotICAgIEZUX0Vycm9yICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIEZUX1VOVVNFRCggbGluZW5vICk7ICAgICAgICAvKiBvbmx5IHVzZWQgaW4gZGVidWcgbW9kZSAqLwotCi0KLSAgICBpZiAoIGZvbnQgPT0gMCB8fCBmb250LT5uYW1lID09IDAgfHwgZm9udC0+bmFtZVswXSA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgbWVtb3J5ID0gZm9udC0+bWVtb3J5OwotCi0gICAgX2JkZl9saXN0X2luaXQoICZsaXN0LCBtZW1vcnkgKTsKLQotICAgIGZvbnQtPnNwYWNpbmcgPSBvcHRzLT5mb250X3NwYWNpbmc7Ci0KLSAgICBsZW4gPSBmdF9zdHJsZW4oIGZvbnQtPm5hbWUgKSArIDE7Ci0gICAgLyogTGltaXQgb3Vyc2VsdmVzIHRvIDI1NiBjaGFyYWN0ZXJzIGluIHRoZSBmb250IG5hbWUuICovCi0gICAgaWYgKCBsZW4gPj0gMjU2ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJfYmRmX3NldF9kZWZhdWx0X3NwYWNpbmc6ICIgRVJSTVNHNywgbGluZW5vICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIEZUX01FTV9DT1BZKCBuYW1lLCBmb250LT5uYW1lLCBsZW4gKTsKLQotICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmbGlzdCwgKGNoYXIgKikiLSIsIG5hbWUsICh1bnNpZ25lZCBsb25nKWxlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgaWYgKCBsaXN0LnVzZWQgPT0gMTUgKQotICAgIHsKLSAgICAgIHN3aXRjaCAoIGxpc3QuZmllbGRbMTFdWzBdICkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ0MnOgotICAgICAgY2FzZSAnYyc6Ci0gICAgICAgIGZvbnQtPnNwYWNpbmcgPSBCREZfQ0hBUkNFTEw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnTSc6Ci0gICAgICBjYXNlICdtJzoKLSAgICAgICAgZm9udC0+c3BhY2luZyA9IEJERl9NT05PV0lEVEg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUCc6Ci0gICAgICBjYXNlICdwJzoKLSAgICAgICAgZm9udC0+c3BhY2luZyA9IEJERl9QUk9QT1JUSU9OQUw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIF9iZGZfbGlzdF9kb25lKCAmbGlzdCApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgYW4gYXRvbSBvciBub3QuICBJZiBpdCBpcywgdGhlbiAqLwotICAvKiBjbGVhbiBpdCB1cCBzbyB0aGUgZG91YmxlIHF1b3RlcyBhcmUgcmVtb3ZlZCBpZiB0aGV5IGV4aXN0LiAgICAgICAqLwotICBzdGF0aWMgaW50Ci0gIF9iZGZfaXNfYXRvbSggY2hhciogICAgICAgICAgbGluZSwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBsaW5lbGVuLAotICAgICAgICAgICAgICAgIGNoYXIqKiAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgY2hhcioqICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgYmRmX2ZvbnRfdCogICAgZm9udCApCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgIGhvbGQ7Ci0gICAgY2hhciAgICAgICAgICAgICAqc3AsICplcDsKLSAgICBiZGZfcHJvcGVydHlfdCogIHA7Ci0KLQotICAgICpuYW1lID0gc3AgPSBlcCA9IGxpbmU7Ci0KLSAgICB3aGlsZSAoICplcCAmJiAqZXAgIT0gJyAnICYmICplcCAhPSAnXHQnICkKLSAgICAgIGVwKys7Ci0KLSAgICBob2xkID0gLTE7Ci0gICAgaWYgKCAqZXAgKQotICAgIHsKLSAgICAgIGhvbGQgPSAqZXA7Ci0gICAgICAqZXAgID0gMDsKLSAgICB9Ci0KLSAgICBwID0gYmRmX2dldF9wcm9wZXJ0eSggc3AsIGZvbnQgKTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIGNoYXJhY3RlciB0aGF0IHdhcyBzYXZlZCBiZWZvcmUgYW55IHJldHVybiBjYW4gaGFwcGVuLiAqLwotICAgIGlmICggaG9sZCAhPSAtMSApCi0gICAgICAqZXAgPSAoY2hhcilob2xkOwotCi0gICAgLyogSWYgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgaXMgbm90IGFuIGF0b20sIGp1c3QgcmV0dXJuIGhlcmUuICovCi0gICAgaWYgKCBwICYmIHAtPmZvcm1hdCAhPSBCREZfQVRPTSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIFRoZSBwcm9wZXJ0eSBpcyBhbiBhdG9tLiAgVHJpbSBhbGwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotICAgIC8qIGFuZCBkb3VibGUgcXVvdGVzIGZvciB0aGUgYXRvbSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHNwID0gZXA7Ci0gICAgZXAgPSBsaW5lICsgbGluZWxlbjsKLQotICAgIC8qIFRyaW0gdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBpZiBpdCBleGlzdHMuICovCi0gICAgaWYgKCAqc3AgKQotICAgICAgKnNwKysgPSAwOwotICAgIHdoaWxlICggKnNwICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICggKnNwID09ICcgJyB8fCAqc3AgPT0gJ1x0JyApICkKLSAgICAgIHNwKys7Ci0KLSAgICAvKiBUcmltIHRoZSBsZWFkaW5nIGRvdWJsZSBxdW90ZSBpZiBpdCBleGlzdHMuICovCi0gICAgaWYgKCAqc3AgPT0gJyInICkKLSAgICAgIHNwKys7Ci0gICAgKnZhbHVlID0gc3A7Ci0KLSAgICAvKiBUcmltIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGlmIGl0IGV4aXN0cy4gKi8KLSAgICB3aGlsZSAoIGVwID4gc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgKCAqKCBlcCAtIDEgKSA9PSAnICcgfHwgKiggZXAgLSAxICkgPT0gJ1x0JyApICkKLSAgICAgICotLWVwID0gMDsKLQotICAgIC8qIFRyaW0gdGhlIHRyYWlsaW5nIGRvdWJsZSBxdW90ZSBpZiBpdCBleGlzdHMuICovCi0gICAgaWYgKCBlcCA+IHNwICYmICooIGVwIC0gMSApID09ICciJyApCi0gICAgICAqLS1lcCA9IDA7Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIF9iZGZfYWRkX3Byb3BlcnR5KCBiZGZfZm9udF90KiAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgbGluZW5vICkKLSAgewotICAgIHNpemVfdCogICAgICAgICBwcm9waWQ7Ci0gICAgYmRmX3Byb3BlcnR5X3QgICpwcm9wLCAqZnA7Ci0gICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSA9IGZvbnQtPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotCi0gICAgRlRfVU5VU0VEKCBsaW5lbm8gKTsgICAgICAgIC8qIG9ubHkgdXNlZCBpbiBkZWJ1ZyBtb2RlICovCi0KLQotICAgIC8qIEZpcnN0LCBjaGVjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZm9udC4gKi8KLSAgICBpZiAoICggcHJvcGlkID0gZnRfaGFzaF9zdHJfbG9va3VwKCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9IYXNoKWZvbnQtPmludGVybmFsICkgKSAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAvKiBUaGUgcHJvcGVydHkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGZvbnQsIHNvIHNpbXBseSByZXBsYWNlICovCi0gICAgICAvKiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1cnJlbnQgdmFsdWUuICAgICAgICAgICovCi0gICAgICBmcCA9IGZvbnQtPnByb3BzICsgKnByb3BpZDsKLQotICAgICAgc3dpdGNoICggZnAtPmZvcm1hdCApCi0gICAgICB7Ci0gICAgICBjYXNlIEJERl9BVE9NOgotICAgICAgICAvKiBEZWxldGUgdGhlIGN1cnJlbnQgYXRvbSBpZiBpdCBleGlzdHMuICovCi0gICAgICAgIEZUX0ZSRUUoIGZwLT52YWx1ZS5hdG9tICk7Ci0KLSAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZVswXSAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggRlRfU1RSRFVQKCBmcC0+dmFsdWUuYXRvbSwgdmFsdWUgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQkRGX0lOVEVHRVI6Ci0gICAgICAgIGZwLT52YWx1ZS5sID0gX2JkZl9hdG9sKCB2YWx1ZSApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCREZfQ0FSRElOQUw6Ci0gICAgICAgIGZwLT52YWx1ZS51bCA9IF9iZGZfYXRvdWwoIHZhbHVlICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICA7Ci0gICAgICB9Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBTZWUgd2hldGhlciB0aGlzIHByb3BlcnR5IHR5cGUgZXhpc3RzIHlldCBvciBub3QuICovCi0gICAgLyogSWYgbm90LCBjcmVhdGUgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHByb3BpZCA9IGZ0X2hhc2hfc3RyX2xvb2t1cCggbmFtZSwgJihmb250LT5wcm9wdGJsKSApOwotICAgIGlmICggIXByb3BpZCApCi0gICAgewotICAgICAgZXJyb3IgPSBiZGZfY3JlYXRlX3Byb3BlcnR5KCBuYW1lLCBCREZfQVRPTSwgZm9udCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIHByb3BpZCA9IGZ0X2hhc2hfc3RyX2xvb2t1cCggbmFtZSwgJihmb250LT5wcm9wdGJsKSApOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIGFub3RoZXIgcHJvcGVydHkgaWYgdGhpcyBpcyBvdmVyZmxvd2luZy4gKi8KLSAgICBpZiAoIGZvbnQtPnByb3BzX3VzZWQgPT0gZm9udC0+cHJvcHNfc2l6ZSApCi0gICAgewotICAgICAgaWYgKCBmb250LT5wcm9wc19zaXplID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggZm9udC0+cHJvcHMsIDEgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBmb250LT5wcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+cHJvcHNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+cHJvcHNfc2l6ZSArIDEgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBmcCA9IGZvbnQtPnByb3BzICsgZm9udC0+cHJvcHNfc2l6ZTsKLSAgICAgIEZUX1pFUk8oIGZwICk7Ci0gICAgICBmb250LT5wcm9wc19zaXplKys7Ci0gICAgfQotCi0gICAgaWYgKCAqcHJvcGlkID49IF9udW1fYmRmX3Byb3BlcnRpZXMgKQotICAgICAgcHJvcCA9IGZvbnQtPnVzZXJfcHJvcHMgKyAoICpwcm9waWQgLSBfbnVtX2JkZl9wcm9wZXJ0aWVzICk7Ci0gICAgZWxzZQotICAgICAgcHJvcCA9IChiZGZfcHJvcGVydHlfdCopX2JkZl9wcm9wZXJ0aWVzICsgKnByb3BpZDsKLQotICAgIGZwID0gZm9udC0+cHJvcHMgKyBmb250LT5wcm9wc191c2VkOwotCi0gICAgZnAtPm5hbWUgICAgPSBwcm9wLT5uYW1lOwotICAgIGZwLT5mb3JtYXQgID0gcHJvcC0+Zm9ybWF0OwotICAgIGZwLT5idWlsdGluID0gcHJvcC0+YnVpbHRpbjsKLQotICAgIHN3aXRjaCAoIHByb3AtPmZvcm1hdCApCi0gICAgewotICAgIGNhc2UgQkRGX0FUT006Ci0gICAgICBmcC0+dmFsdWUuYXRvbSA9IDA7Ci0gICAgICBpZiAoIHZhbHVlICE9IDAgJiYgdmFsdWVbMF0gKQotICAgICAgewotICAgICAgICBpZiAoIEZUX1NUUkRVUCggZnAtPnZhbHVlLmF0b20sIHZhbHVlICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCREZfSU5URUdFUjoKLSAgICAgIGZwLT52YWx1ZS5sID0gX2JkZl9hdG9sKCB2YWx1ZSApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJERl9DQVJESU5BTDoKLSAgICAgIGZwLT52YWx1ZS51bCA9IF9iZGZfYXRvdWwoIHZhbHVlICk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBJZiB0aGUgcHJvcGVydHkgaGFwcGVucyB0byBiZSBhIGNvbW1lbnQsIHRoZW4gaXQgZG9lc24ndCBuZWVkICovCi0gICAgLyogdG8gYmUgYWRkZWQgdG8gdGhlIGludGVybmFsIGhhc2ggdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggX2JkZl9zdHJuY21wKCBuYW1lLCAiQ09NTUVOVCIsIDcgKSAhPSAwICkKLSAgICB7Ci0gICAgICAvKiBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSBmb250IHByb3BlcnR5IHRhYmxlLiAqLwotICAgICAgZXJyb3IgPSBmdF9oYXNoX3N0cl9pbnNlcnQoIGZwLT5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPnByb3BzX3VzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0hhc2gpZm9udC0+aW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGZvbnQtPnByb3BzX3VzZWQrKzsKLQotICAgIC8qIFNvbWUgc3BlY2lhbCBjYXNlcyBuZWVkIHRvIGJlIGhhbmRsZWQgaGVyZS4gIFRoZSBERUZBVUxUX0NIQVIgICAgICAgKi8KLSAgICAvKiBwcm9wZXJ0eSBuZWVkcyB0byBiZSBsb2NhdGVkIGlmIGl0IGV4aXN0cyBpbiB0aGUgcHJvcGVydHkgbGlzdCwgdGhlICovCi0gICAgLyogRk9OVF9BU0NFTlQgYW5kIEZPTlRfREVTQ0VOVCBuZWVkIHRvIGJlIGFzc2lnbmVkIGlmIHRoZXkgYXJlICAgICAgICAqLwotICAgIC8qIHByZXNlbnQsIGFuZCB0aGUgU1BBQ0lORyBwcm9wZXJ0eSBzaG91bGQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgICAgICAgKi8KLSAgICAvKiBzcGFjaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIG5hbWUsICJERUZBVUxUX0NIQVIiLCAxMiApID09IDAgKQotICAgICAgZm9udC0+ZGVmYXVsdF9jaGFyID0gZnAtPnZhbHVlLmw7Ci0gICAgZWxzZSBpZiAoIF9iZGZfc3RybmNtcCggbmFtZSwgIkZPTlRfQVNDRU5UIiwgMTEgKSA9PSAwICkKLSAgICAgIGZvbnQtPmZvbnRfYXNjZW50ID0gZnAtPnZhbHVlLmw7Ci0gICAgZWxzZSBpZiAoIF9iZGZfc3RybmNtcCggbmFtZSwgIkZPTlRfREVTQ0VOVCIsIDEyICkgPT0gMCApCi0gICAgICBmb250LT5mb250X2Rlc2NlbnQgPSBmcC0+dmFsdWUubDsKLSAgICBlbHNlIGlmICggX2JkZl9zdHJuY21wKCBuYW1lLCAiU1BBQ0lORyIsIDcgKSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoICFmcC0+dmFsdWUuYXRvbSApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIl9iZGZfYWRkX3Byb3BlcnR5OiAiIEVSUk1TRzgsIGxpbmVubywgIlNQQUNJTkciICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBmcC0+dmFsdWUuYXRvbVswXSA9PSAncCcgfHwgZnAtPnZhbHVlLmF0b21bMF0gPT0gJ1AnICkKLSAgICAgICAgZm9udC0+c3BhY2luZyA9IEJERl9QUk9QT1JUSU9OQUw7Ci0gICAgICBlbHNlIGlmICggZnAtPnZhbHVlLmF0b21bMF0gPT0gJ20nIHx8IGZwLT52YWx1ZS5hdG9tWzBdID09ICdNJyApCi0gICAgICAgIGZvbnQtPnNwYWNpbmcgPSBCREZfTU9OT1dJRFRIOwotICAgICAgZWxzZSBpZiAoIGZwLT52YWx1ZS5hdG9tWzBdID09ICdjJyB8fCBmcC0+dmFsdWUuYXRvbVswXSA9PSAnQycgKQotICAgICAgICBmb250LT5zcGFjaW5nID0gQkRGX0NIQVJDRUxMOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmliYmxlX21hc2tbOF0gPQotICB7Ci0gICAgMHhGRiwgMHg4MCwgMHhDMCwgMHhFMCwgMHhGMCwgMHhGOCwgMHhGQywgMHhGRQotICB9OwotCi0KLSAgLyogQWN0dWFsbHkgcGFyc2UgdGhlIGdseXBoIGluZm8gYW5kIGJpdG1hcHMuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBfYmRmX3BhcnNlX2dseXBocyggY2hhciogICAgICAgICAgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGxpbmVsZW4sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBjYWxsX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBjbGllbnRfZGF0YSApCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgYywgbWFza19pbmRleDsKLSAgICBjaGFyKiAgICAgICAgICAgICAgczsKLSAgICB1bnNpZ25lZCBjaGFyKiAgICAgYnA7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgIGksIHNsZW4sIG5pYmJsZXM7Ci0KLSAgICBfYmRmX3BhcnNlX3QqICAgICAgcDsKLSAgICBiZGZfZ2x5cGhfdCogICAgICAgZ2x5cGg7Ci0gICAgYmRmX2ZvbnRfdCogICAgICAgIGZvbnQ7Ci0KLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIEZUX1VOVVNFRCggY2FsbF9kYXRhICk7Ci0gICAgRlRfVU5VU0VEKCBsaW5lbm8gKTsgICAgICAgIC8qIG9ubHkgdXNlZCBpbiBkZWJ1ZyBtb2RlICovCi0KLQotICAgIHAgPSAoX2JkZl9wYXJzZV90ICopY2xpZW50X2RhdGE7Ci0KLSAgICBmb250ICAgPSBwLT5mb250OwotICAgIG1lbW9yeSA9IGZvbnQtPm1lbW9yeTsKLQotICAgIC8qIENoZWNrIGZvciBhIGNvbW1lbnQuICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJDT01NRU5UIiwgNyApID09IDAgKQotICAgIHsKLSAgICAgIGxpbmVsZW4gLT0gNzsKLQotICAgICAgcyA9IGxpbmUgKyA3OwotICAgICAgaWYgKCAqcyAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgcysrOwotICAgICAgICBsaW5lbGVuLS07Ci0gICAgICB9Ci0gICAgICBlcnJvciA9IF9iZGZfYWRkX2NvbW1lbnQoIHAtPmZvbnQsIHMsIGxpbmVsZW4gKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBUaGUgdmVyeSBmaXJzdCB0aGluZyBleHBlY3RlZCBpcyB0aGUgbnVtYmVyIG9mIGdseXBocy4gKi8KLSAgICBpZiAoICEoIHAtPmZsYWdzICYgQkRGX0dMWVBIU18gKSApCi0gICAgewotICAgICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJDSEFSUyIsIDUgKSAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgRVJSTVNHMSwgbGluZW5vLCAiQ0hBUlMiICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX0NoYXJzX0ZpZWxkICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICBwLT5jbnQgPSBmb250LT5nbHlwaHNfc2l6ZSA9IF9iZGZfYXRvdWwoIHAtPmxpc3QuZmllbGRbMV0gKTsKLQotICAgICAgLyogV2UgbmVlZCBhdCBsZWFzdCAyMCBieXRlcyBwZXIgZ2x5cGguICovCi0gICAgICBpZiAoIHAtPmNudCA+IHAtPnNpemUgLyAyMCApCi0gICAgICB7Ci0gICAgICAgIHAtPmNudCA9IGZvbnQtPmdseXBoc19zaXplID0gcC0+c2l6ZSAvIDIwOwotICAgICAgICBGVF9UUkFDRTIoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgQUNNU0cxNywgcC0+Y250ICkpOwotICAgICAgfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIG51bWJlciBvZiBnbHlwaHMgaXMgbm9uLXplcm8uICovCi0gICAgICBpZiAoIHAtPmNudCA9PSAwICkKLSAgICAgICAgZm9udC0+Z2x5cGhzX3NpemUgPSA2NDsKLQotICAgICAgLyogTGltaXQgb3Vyc2VsdmVzIHRvIDEsMTE0LDExMiBnbHlwaHMgaW4gdGhlIGZvbnQgKHRoaXMgaXMgdGhlICovCi0gICAgICAvKiBudW1iZXIgb2YgY29kZSBwb2ludHMgYXZhaWxhYmxlIGluIFVuaWNvZGUpLiAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggcC0+Y250ID49IDB4MTEwMDAwVUwgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJfYmRmX3BhcnNlX2dseXBoczogIiBFUlJNU0c1LCBsaW5lbm8sICJDSEFSUyIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggZm9udC0+Z2x5cGhzLCBmb250LT5nbHlwaHNfc2l6ZSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwLT5mbGFncyB8PSBCREZfR0xZUEhTXzsKLQotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciB0aGUgRU5ERk9OVCBmaWVsZC4gKi8KLSAgICBpZiAoIF9iZGZfc3RybmNtcCggbGluZSwgIkVOREZPTlQiLCA3ICkgPT0gMCApCi0gICAgewotICAgICAgaWYgKCBwLT5mbGFncyAmIEJERl9HTFlQSF9CSVRTXyApCi0gICAgICB7Ci0gICAgICAgIC8qIE1pc3NpbmcgRU5EQ0hBUiBmaWVsZC4gKi8KLSAgICAgICAgRlRfRVJST1IoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgRVJSTVNHMSwgbGluZW5vLCAiRU5EQ0hBUiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIENvcnJ1cHRlZF9Gb250X0dseXBocyApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNvcnQgdGhlIGdseXBocyBieSBlbmNvZGluZy4gKi8KLSAgICAgIGZ0X3Fzb3J0KCAoY2hhciAqKWZvbnQtPmdseXBocywKLSAgICAgICAgICAgICAgICBmb250LT5nbHlwaHNfdXNlZCwKLSAgICAgICAgICAgICAgICBzaXplb2YgKCBiZGZfZ2x5cGhfdCApLAotICAgICAgICAgICAgICAgIGJ5X2VuY29kaW5nICk7Ci0KLSAgICAgIHAtPmZsYWdzICY9IH5CREZfU1RBUlRfOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBFTkRDSEFSIGZpZWxkLiAqLwotICAgIGlmICggX2JkZl9zdHJuY21wKCBsaW5lLCAiRU5EQ0hBUiIsIDcgKSA9PSAwICkKLSAgICB7Ci0gICAgICBwLT5nbHlwaF9lbmMgPSAwOwotICAgICAgcC0+ZmxhZ3MgICAgJj0gfkJERl9HTFlQSF9CSVRTXzsKLQotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIENoZWNrIHdoZXRoZXIgYSBnbHlwaCBpcyBiZWluZyBzY2FubmVkIGJ1dCBzaG91bGQgYmUgKi8KLSAgICAvKiBpZ25vcmVkIGJlY2F1c2UgaXQgaXMgYW4gdW5lbmNvZGVkIGdseXBoLiAgICAgICAgICAgICovCi0gICAgaWYgKCAoIHAtPmZsYWdzICYgQkRGX0dMWVBIXyApICAgICAmJgotICAgICAgICAgcC0+Z2x5cGhfZW5jICAgICAgICAgICAgPT0gLTEgJiYKLSAgICAgICAgIHAtPm9wdHMtPmtlZXBfdW5lbmNvZGVkID09IDAgICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgU1RBUlRDSEFSIGZpZWxkLiAqLwotICAgIGlmICggX2JkZl9zdHJuY21wKCBsaW5lLCAiU1RBUlRDSEFSIiwgOSApID09IDAgKQotICAgIHsKLSAgICAgIGlmICggcC0+ZmxhZ3MgJiBCREZfR0xZUEhfQklUU18gKQotICAgICAgewotICAgICAgICAvKiBNaXNzaW5nIEVORENIQVIgZmllbGQuICovCi0gICAgICAgIEZUX0VSUk9SKCggIl9iZGZfcGFyc2VfZ2x5cGhzOiAiIEVSUk1TRzEsIGxpbmVubywgIkVORENIQVIiICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX1N0YXJ0Y2hhcl9GaWVsZCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNldCB0aGUgY2hhcmFjdGVyIG5hbWUgaW4gdGhlIHBhcnNlIGluZm8gZmlyc3QgdW50aWwgdGhlICovCi0gICAgICAvKiBlbmNvZGluZyBjYW4gYmUgY2hlY2tlZCBmb3IgYW4gdW5lbmNvZGVkIGNoYXJhY3Rlci4gICAgICAqLwotICAgICAgRlRfRlJFRSggcC0+Z2x5cGhfbmFtZSApOwotCi0gICAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJnAtPmxpc3QsIChjaGFyICopIiArIiwgbGluZSwgbGluZWxlbiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgX2JkZl9saXN0X3NoaWZ0KCAmcC0+bGlzdCwgMSApOwotCi0gICAgICBzID0gX2JkZl9saXN0X2pvaW4oICZwLT5saXN0LCAnICcsICZzbGVuICk7Ci0KLSAgICAgIGlmICggIXMgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJfYmRmX3BhcnNlX2dseXBoczogIiBFUlJNU0c4LCBsaW5lbm8sICJTVEFSVENIQVIiICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHAtPmdseXBoX25hbWUsIHNsZW4gKyAxICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX01FTV9DT1BZKCBwLT5nbHlwaF9uYW1lLCBzLCBzbGVuICsgMSApOwotCi0gICAgICBwLT5mbGFncyB8PSBCREZfR0xZUEhfOwotCi0gICAgICBGVF9UUkFDRTQoKCBEQkdNU0cxLCBsaW5lbm8sIHMgKSk7Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIEVOQ09ESU5HIGZpZWxkLiAqLwotICAgIGlmICggX2JkZl9zdHJuY21wKCBsaW5lLCAiRU5DT0RJTkciLCA4ICkgPT0gMCApCi0gICAgewotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9HTFlQSF8gKSApCi0gICAgICB7Ci0gICAgICAgIC8qIE1pc3NpbmcgU1RBUlRDSEFSIGZpZWxkLiAqLwotICAgICAgICBGVF9FUlJPUigoICJfYmRmX3BhcnNlX2dseXBoczogIiBFUlJNU0cxLCBsaW5lbm8sICJTVEFSVENIQVIiICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX1N0YXJ0Y2hhcl9GaWVsZCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgKGNoYXIgKikiICsiLCBsaW5lLCBsaW5lbGVuICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwLT5nbHlwaF9lbmMgPSBfYmRmX2F0b2woIHAtPmxpc3QuZmllbGRbMV0gKTsKLQotICAgICAgLyogTm9ybWFsaXplIG5lZ2F0aXZlIGVuY29kaW5nIHZhbHVlcy4gIFRoZSBzcGVjaWZpY2F0aW9uIG9ubHkgKi8KLSAgICAgIC8qIGFsbG93cyAtMSwgYnV0IHdlIGNhbiBiZSBtb3JlIGdlbmVyb3VzIGhlcmUuICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHAtPmdseXBoX2VuYyA8IC0xICkKLSAgICAgICAgcC0+Z2x5cGhfZW5jID0gLTE7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBhbHRlcm5hdGl2ZSBlbmNvZGluZyBmb3JtYXQuICovCi0gICAgICBpZiAoIHAtPmdseXBoX2VuYyA9PSAtMSAmJiBwLT5saXN0LnVzZWQgPiAyICkKLSAgICAgICAgcC0+Z2x5cGhfZW5jID0gX2JkZl9hdG9sKCBwLT5saXN0LmZpZWxkWzJdICk7Ci0KLSAgICAgIGlmICggcC0+Z2x5cGhfZW5jIDwgLTEgKQotICAgICAgICBwLT5nbHlwaF9lbmMgPSAtMTsKLQotICAgICAgRlRfVFJBQ0U0KCggREJHTVNHMiwgcC0+Z2x5cGhfZW5jICkpOwotCi0gICAgICAvKiBDaGVjayB0aGF0IHRoZSBlbmNvZGluZyBpcyBpbiB0aGUgVW5pY29kZSByYW5nZSBiZWNhdXNlICAqLwotICAgICAgLyogb3RoZXJ3aXNlIHAtPmhhdmUgKGEgYml0bWFwIHdpdGggc3RhdGljIHNpemUpIG92ZXJmbG93cy4gKi8KLSAgICAgIGlmICggcC0+Z2x5cGhfZW5jID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKHNpemVfdClwLT5nbHlwaF9lbmMgPj0gc2l6ZW9mICggcC0+aGF2ZSApIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggdW5zaWduZWQgbG9uZyApICogMzIgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJfYmRmX3BhcnNlX2dseXBoczogIiBFUlJNU0c1LCBsaW5lbm8sICJFTkNPRElORyIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgZW5jb2RpbmcgaGFzIGFscmVhZHkgYmVlbiBlbmNvdW50ZXJlZC4gKi8KLSAgICAgIC8qIElmIGl0IGhhcyB0aGVuIGNoYW5nZSBpdCB0byB1bmVuY29kZWQgc28gaXQgZ2V0cyBhZGRlZCBpZiAqLwotICAgICAgLyogaW5kaWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHAtPmdseXBoX2VuYyA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBfYmRmX2dseXBoX21vZGlmaWVkKCBwLT5oYXZlLCBwLT5nbHlwaF9lbmMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBFbWl0IGEgbWVzc2FnZSBzYXlpbmcgYSBnbHlwaCBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgKi8KLSAgICAgICAgICAvKiB1bmVuY29kZWQgYXJlYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBGVF9UUkFDRTIoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgQUNNU0cxMiwKLSAgICAgICAgICAgICAgICAgICAgICBwLT5nbHlwaF9lbmMsIHAtPmdseXBoX25hbWUgKSk7Ci0gICAgICAgICAgcC0+Z2x5cGhfZW5jID0gLTE7Ci0gICAgICAgICAgZm9udC0+bW9kaWZpZWQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBfYmRmX3NldF9nbHlwaF9tb2RpZmllZCggcC0+aGF2ZSwgcC0+Z2x5cGhfZW5jICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcC0+Z2x5cGhfZW5jID49IDAgKQotICAgICAgewotICAgICAgICAvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBnbHlwaHMgYWxsb2NhdGVkIGluIGNhc2UgdGhlICovCi0gICAgICAgIC8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGhhcHBlbiB0byBiZSB3cm9uZy4gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBmb250LT5nbHlwaHNfdXNlZCA9PSBmb250LT5nbHlwaHNfc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBmb250LT5nbHlwaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+Z2x5cGhzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+Z2x5cGhzX3NpemUgKyA2NCApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIGZvbnQtPmdseXBoc19zaXplICs9IDY0OwotICAgICAgICB9Ci0KLSAgICAgICAgZ2x5cGggICAgICAgICAgID0gZm9udC0+Z2x5cGhzICsgZm9udC0+Z2x5cGhzX3VzZWQrKzsKLSAgICAgICAgZ2x5cGgtPm5hbWUgICAgID0gcC0+Z2x5cGhfbmFtZTsKLSAgICAgICAgZ2x5cGgtPmVuY29kaW5nID0gcC0+Z2x5cGhfZW5jOwotCi0gICAgICAgIC8qIFJlc2V0IHRoZSBpbml0aWFsIGdseXBoIGluZm8uICovCi0gICAgICAgIHAtPmdseXBoX25hbWUgPSBOVUxMOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBVbmVuY29kZWQgZ2x5cGguICBDaGVjayB3aGV0aGVyIGl0IHNob3VsZCAqLwotICAgICAgICAvKiBiZSBhZGRlZCBvciBub3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHAtPm9wdHMtPmtlZXBfdW5lbmNvZGVkICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogQWxsb2NhdGUgdGhlIG5leHQgdW5lbmNvZGVkIGdseXBoLiAqLwotICAgICAgICAgIGlmICggZm9udC0+dW5lbmNvZGVkX3VzZWQgPT0gZm9udC0+dW5lbmNvZGVkX3NpemUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGZvbnQtPnVuZW5jb2RlZCAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT51bmVuY29kZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPnVuZW5jb2RlZF9zaXplICsgNCApICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICBmb250LT51bmVuY29kZWRfc2l6ZSArPSA0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGdseXBoICAgICAgICAgICA9IGZvbnQtPnVuZW5jb2RlZCArIGZvbnQtPnVuZW5jb2RlZF91c2VkOwotICAgICAgICAgIGdseXBoLT5uYW1lICAgICA9IHAtPmdseXBoX25hbWU7Ci0gICAgICAgICAgZ2x5cGgtPmVuY29kaW5nID0gKGxvbmcpZm9udC0+dW5lbmNvZGVkX3VzZWQrKzsKLQotICAgICAgICAgIC8qIFJlc2V0IHRoZSBpbml0aWFsIGdseXBoIGluZm8uICovCi0gICAgICAgICAgcC0+Z2x5cGhfbmFtZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogRnJlZSB1cCB0aGUgZ2x5cGggbmFtZSBpZiB0aGUgdW5lbmNvZGVkIHNob3VsZG4ndCBiZSAqLwotICAgICAgICAgIC8qIGtlcHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBGVF9GUkVFKCBwLT5nbHlwaF9uYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwLT5nbHlwaF9uYW1lID0gTlVMTDsKLSAgICAgIH0KLQotICAgICAgLyogQ2xlYXIgdGhlIGZsYWdzIHRoYXQgbWlnaHQgYmUgYWRkZWQgd2hlbiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSAqLwotICAgICAgLyogY2hlY2tlZCBmb3IgY29uc2lzdGVuY3kuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgcC0+ZmxhZ3MgJj0gfiggQkRGX0dMWVBIX1dJRFRIX0NIRUNLXyB8IEJERl9HTFlQSF9IRUlHSFRfQ0hFQ0tfICk7Ci0KLSAgICAgIHAtPmZsYWdzIHw9IEJERl9FTkNPRElOR187Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBQb2ludCBhdCB0aGUgZ2x5cGggYmVpbmcgY29uc3RydWN0ZWQuICovCi0gICAgaWYgKCBwLT5nbHlwaF9lbmMgPT0gLTEgKQotICAgICAgZ2x5cGggPSBmb250LT51bmVuY29kZWQgKyAoIGZvbnQtPnVuZW5jb2RlZF91c2VkIC0gMSApOwotICAgIGVsc2UKLSAgICAgIGdseXBoID0gZm9udC0+Z2x5cGhzICsgKCBmb250LT5nbHlwaHNfdXNlZCAtIDEgKTsKLQotICAgIC8qIENoZWNrIHdoZXRoZXIgYSBiaXRtYXAgaXMgYmVpbmcgY29uc3RydWN0ZWQuICovCi0gICAgaWYgKCBwLT5mbGFncyAmIEJERl9CSVRNQVBfICkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSBhcmUgbW9yZSByb3dzIHRoYW4gYXJlIHNwZWNpZmllZCBpbiB0aGUgZ2x5cGggbWV0cmljcywgKi8KLSAgICAgIC8qIGlnbm9yZSB0aGUgcmVtYWluaW5nIGxpbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBwLT5yb3cgPj0gKHVuc2lnbmVkIGxvbmcpZ2x5cGgtPmJieC5oZWlnaHQgKQotICAgICAgewotICAgICAgICBpZiAoICEoIHAtPmZsYWdzICYgQkRGX0dMWVBIX0hFSUdIVF9DSEVDS18gKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTIoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgQUNNU0cxMywgZ2x5cGgtPmVuY29kaW5nICkpOwotICAgICAgICAgIHAtPmZsYWdzIHw9IEJERl9HTFlQSF9IRUlHSFRfQ0hFQ0tfOwotICAgICAgICAgIGZvbnQtPm1vZGlmaWVkID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyogT25seSBjb2xsZWN0IHRoZSBudW1iZXIgb2YgbmliYmxlcyBpbmRpY2F0ZWQgYnkgdGhlIGdseXBoICAgICAqLwotICAgICAgLyogbWV0cmljcy4gIElmIHRoZXJlIGFyZSBtb3JlIGNvbHVtbnMsIHRoZXkgYXJlIHNpbXBseSBpZ25vcmVkLiAqLwotICAgICAgbmliYmxlcyA9IGdseXBoLT5icHIgPDwgMTsKLSAgICAgIGJwICAgICAgPSBnbHlwaC0+Yml0bWFwICsgcC0+cm93ICogZ2x5cGgtPmJwcjsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBuaWJibGVzOyBpKysgKQotICAgICAgewotICAgICAgICBjID0gbGluZVtpXTsKLSAgICAgICAgaWYgKCAhc2JpdHNldCggaGRpZ2l0cywgYyApICkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgKmJwID0gKEZUX0J5dGUpKCAoICpicCA8PCA0ICkgKyBhMmlbY10gKTsKLSAgICAgICAgaWYgKCBpICsgMSA8IG5pYmJsZXMgJiYgKCBpICYgMSApICkKLSAgICAgICAgICAqKyticCA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIElmIGFueSBsaW5lIGhhcyBub3QgZW5vdWdoIGNvbHVtbnMsICAgICAgICAgICAgKi8KLSAgICAgIC8qIGluZGljYXRlIHRoZXkgaGF2ZSBiZWVuIHBhZGRlZCB3aXRoIHplcm8gYml0cy4gKi8KLSAgICAgIGlmICggaSA8IG5pYmJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgISggcC0+ZmxhZ3MgJiBCREZfR0xZUEhfV0lEVEhfQ0hFQ0tfICkgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgQUNNU0cxNiwgZ2x5cGgtPmVuY29kaW5nICkpOwotICAgICAgICBwLT5mbGFncyAgICAgICB8PSBCREZfR0xZUEhfV0lEVEhfQ0hFQ0tfOwotICAgICAgICBmb250LT5tb2RpZmllZCAgPSAxOwotICAgICAgfQotCi0gICAgICAvKiBSZW1vdmUgcG9zc2libGUgZ2FyYmFnZSBhdCB0aGUgcmlnaHQuICovCi0gICAgICBtYXNrX2luZGV4ID0gKCBnbHlwaC0+YmJ4LndpZHRoICogcC0+Zm9udC0+YnBwICkgJiA3OwotICAgICAgaWYgKCBnbHlwaC0+YmJ4LndpZHRoICkKLSAgICAgICAgKmJwICY9IG5pYmJsZV9tYXNrW21hc2tfaW5kZXhdOwotCi0gICAgICAvKiBJZiBhbnkgbGluZSBoYXMgZXh0cmEgY29sdW1ucywgaW5kaWNhdGUgdGhleSBoYXZlIGJlZW4gcmVtb3ZlZC4gKi8KLSAgICAgIGlmICggaSA9PSBuaWJibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgc2JpdHNldCggaGRpZ2l0cywgbGluZVtuaWJibGVzXSApICAgICAgJiYKLSAgICAgICAgICAgISggcC0+ZmxhZ3MgJiBCREZfR0xZUEhfV0lEVEhfQ0hFQ0tfICkgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgQUNNU0cxNCwgZ2x5cGgtPmVuY29kaW5nICkpOwotICAgICAgICBwLT5mbGFncyAgICAgICB8PSBCREZfR0xZUEhfV0lEVEhfQ0hFQ0tfOwotICAgICAgICBmb250LT5tb2RpZmllZCAgPSAxOwotICAgICAgfQotCi0gICAgICBwLT5yb3crKzsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBFeHBlY3QgdGhlIFNXSURUSCAoc2NhbGFibGUgd2lkdGgpIGZpZWxkIG5leHQuICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJTV0lEVEgiLCA2ICkgPT0gMCApCi0gICAgewotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9FTkNPRElOR18gKSApCi0gICAgICAgIGdvdG8gTWlzc2luZ19FbmNvZGluZzsKLQotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGdseXBoLT5zd2lkdGggPSAodW5zaWduZWQgc2hvcnQpX2JkZl9hdG91bCggcC0+bGlzdC5maWVsZFsxXSApOwotICAgICAgcC0+ZmxhZ3MgfD0gQkRGX1NXSURUSF87Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBFeHBlY3QgdGhlIERXSURUSCAoc2NhbGFibGUgd2lkdGgpIGZpZWxkIG5leHQuICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJEV0lEVEgiLCA2ICkgPT0gMCApCi0gICAgewotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9FTkNPRElOR18gKSApCi0gICAgICAgIGdvdG8gTWlzc2luZ19FbmNvZGluZzsKLQotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGdseXBoLT5kd2lkdGggPSAodW5zaWduZWQgc2hvcnQpX2JkZl9hdG91bCggcC0+bGlzdC5maWVsZFsxXSApOwotCi0gICAgICBpZiAoICEoIHAtPmZsYWdzICYgQkRGX1NXSURUSF8gKSApCi0gICAgICB7Ci0gICAgICAgIC8qIE1pc3NpbmcgU1dJRFRIIGZpZWxkLiAgRW1pdCBhbiBhdXRvIGNvcnJlY3Rpb24gbWVzc2FnZSBhbmQgc2V0ICovCi0gICAgICAgIC8qIHRoZSBzY2FsYWJsZSB3aWR0aCBmcm9tIHRoZSBkZXZpY2Ugd2lkdGguICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIEZUX1RSQUNFMigoICJfYmRmX3BhcnNlX2dseXBoczogIiBBQ01TRzksIGxpbmVubyApKTsKLQotICAgICAgICBnbHlwaC0+c3dpZHRoID0gKHVuc2lnbmVkIHNob3J0KUZUX011bERpdigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPmR3aWR0aCwgNzIwMDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoIGZvbnQtPnBvaW50X3NpemUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPnJlc29sdXRpb25feCApICk7Ci0gICAgICB9Ci0KLSAgICAgIHAtPmZsYWdzIHw9IEJERl9EV0lEVEhfOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIEV4cGVjdCB0aGUgQkJYIGZpZWxkIG5leHQuICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJCQlgiLCAzICkgPT0gMCApCi0gICAgewotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9FTkNPRElOR18gKSApCi0gICAgICAgIGdvdG8gTWlzc2luZ19FbmNvZGluZzsKLQotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGdseXBoLT5iYngud2lkdGggICAgPSBfYmRmX2F0b3VzKCBwLT5saXN0LmZpZWxkWzFdICk7Ci0gICAgICBnbHlwaC0+YmJ4LmhlaWdodCAgID0gX2JkZl9hdG91cyggcC0+bGlzdC5maWVsZFsyXSApOwotICAgICAgZ2x5cGgtPmJieC54X29mZnNldCA9IF9iZGZfYXRvcyggcC0+bGlzdC5maWVsZFszXSApOwotICAgICAgZ2x5cGgtPmJieC55X29mZnNldCA9IF9iZGZfYXRvcyggcC0+bGlzdC5maWVsZFs0XSApOwotCi0gICAgICAvKiBHZW5lcmF0ZSB0aGUgYXNjZW50IGFuZCBkZXNjZW50IG9mIHRoZSBjaGFyYWN0ZXIuICovCi0gICAgICBnbHlwaC0+YmJ4LmFzY2VudCAgPSAoc2hvcnQpKCBnbHlwaC0+YmJ4LmhlaWdodCArIGdseXBoLT5iYngueV9vZmZzZXQgKTsKLSAgICAgIGdseXBoLT5iYnguZGVzY2VudCA9IChzaG9ydCkoIC1nbHlwaC0+YmJ4Lnlfb2Zmc2V0ICk7Ci0KLSAgICAgIC8qIERldGVybWluZSB0aGUgb3ZlcmFsbCBmb250IGJvdW5kaW5nIGJveCBhcyB0aGUgY2hhcmFjdGVycyBhcmUgKi8KLSAgICAgIC8qIGxvYWRlZCBzbyBjb3JyZWN0aW9ucyBjYW4gYmUgZG9uZSBsYXRlciBpZiBpbmRpY2F0ZWQuICAgICAgICAgKi8KLSAgICAgIHAtPm1heGFzICAgID0gKHNob3J0KUZUX01BWCggZ2x5cGgtPmJieC5hc2NlbnQsIHAtPm1heGFzICk7Ci0gICAgICBwLT5tYXhkcyAgICA9IChzaG9ydClGVF9NQVgoIGdseXBoLT5iYnguZGVzY2VudCwgcC0+bWF4ZHMgKTsKLQotICAgICAgcC0+cmJlYXJpbmcgPSAoc2hvcnQpKCBnbHlwaC0+YmJ4LndpZHRoICsgZ2x5cGgtPmJieC54X29mZnNldCApOwotCi0gICAgICBwLT5tYXhyYiAgICA9IChzaG9ydClGVF9NQVgoIHAtPnJiZWFyaW5nLCBwLT5tYXhyYiApOwotICAgICAgcC0+bWlubGIgICAgPSAoc2hvcnQpRlRfTUlOKCBnbHlwaC0+YmJ4Lnhfb2Zmc2V0LCBwLT5taW5sYiApOwotICAgICAgcC0+bWF4bGIgICAgPSAoc2hvcnQpRlRfTUFYKCBnbHlwaC0+YmJ4Lnhfb2Zmc2V0LCBwLT5tYXhsYiApOwotCi0gICAgICBpZiAoICEoIHAtPmZsYWdzICYgQkRGX0RXSURUSF8gKSApCi0gICAgICB7Ci0gICAgICAgIC8qIE1pc3NpbmcgRFdJRFRIIGZpZWxkLiAgRW1pdCBhbiBhdXRvIGNvcnJlY3Rpb24gbWVzc2FnZSBhbmQgc2V0ICovCi0gICAgICAgIC8qIHRoZSBkZXZpY2Ugd2lkdGggdG8gdGhlIGdseXBoIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIEZUX1RSQUNFMigoICJfYmRmX3BhcnNlX2dseXBoczogIiBBQ01TRzEwLCBsaW5lbm8gKSk7Ci0gICAgICAgIGdseXBoLT5kd2lkdGggPSBnbHlwaC0+YmJ4LndpZHRoOwotICAgICAgfQotCi0gICAgICAvKiBJZiB0aGUgQkRGX0NPUlJFQ1RfTUVUUklDUyBmbGFnIGlzIHNldCwgdGhlbiBhZGp1c3QgdGhlIFNXSURUSCAqLwotICAgICAgLyogdmFsdWUgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggcC0+b3B0cy0+Y29ycmVjdF9tZXRyaWNzICE9IDAgKQotICAgICAgewotICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIHBvaW50IHNpemUgb2YgdGhlIGdseXBoLiAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgc3cgPSAodW5zaWduZWQgc2hvcnQpRlRfTXVsRGl2KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5kd2lkdGgsIDcyMDAwTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoIGZvbnQtPnBvaW50X3NpemUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+cmVzb2x1dGlvbl94ICkgKTsKLQotCi0gICAgICAgIGlmICggc3cgIT0gZ2x5cGgtPnN3aWR0aCApCi0gICAgICAgIHsKLSAgICAgICAgICBnbHlwaC0+c3dpZHRoID0gc3c7Ci0KLSAgICAgICAgICBpZiAoIHAtPmdseXBoX2VuYyA9PSAtMSApCi0gICAgICAgICAgICBfYmRmX3NldF9nbHlwaF9tb2RpZmllZCggZm9udC0+dW1vZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT51bmVuY29kZWRfdXNlZCAtIDEgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBfYmRmX3NldF9nbHlwaF9tb2RpZmllZCggZm9udC0+bm1vZCwgZ2x5cGgtPmVuY29kaW5nICk7Ci0KLSAgICAgICAgICBwLT5mbGFncyAgICAgICB8PSBCREZfU1dJRFRIX0FESl87Ci0gICAgICAgICAgZm9udC0+bW9kaWZpZWQgID0gMTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwLT5mbGFncyB8PSBCREZfQkJYXzsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBBbmQgZmluYWxseSwgZ2F0aGVyIHVwIHRoZSBiaXRtYXAuICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJCSVRNQVAiLCA2ICkgPT0gMCApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyAgYml0bWFwX3NpemU7Ci0KLQotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9CQlhfICkgKQotICAgICAgewotICAgICAgICAvKiBNaXNzaW5nIEJCWCBmaWVsZC4gKi8KLSAgICAgICAgRlRfRVJST1IoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgRVJSTVNHMSwgbGluZW5vLCAiQkJYIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggTWlzc2luZ19CYnhfRmllbGQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBiaXRtYXAuICovCi0gICAgICBnbHlwaC0+YnByID0gKCBnbHlwaC0+YmJ4LndpZHRoICogcC0+Zm9udC0+YnBwICsgNyApID4+IDM7Ci0KLSAgICAgIGJpdG1hcF9zaXplID0gZ2x5cGgtPmJwciAqIGdseXBoLT5iYnguaGVpZ2h0OwotICAgICAgaWYgKCBnbHlwaC0+YnByID4gMHhGRkZGVSB8fCBiaXRtYXBfc2l6ZSA+IDB4RkZGRlUgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJfYmRmX3BhcnNlX2dseXBoczogIiBFUlJNU0c0LCBsaW5lbm8gKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEJieF9Ub29fQmlnICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZ2x5cGgtPmJ5dGVzID0gKHVuc2lnbmVkIHNob3J0KWJpdG1hcF9zaXplOwotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggZ2x5cGgtPmJpdG1hcCwgZ2x5cGgtPmJ5dGVzICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHAtPnJvdyAgICA9IDA7Ci0gICAgICBwLT5mbGFncyB8PSBCREZfQklUTUFQXzsKLQotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIEZUX0VSUk9SKCggIl9iZGZfcGFyc2VfZ2x5cGhzOiAiIEVSUk1TRzksIGxpbmVubyApKTsKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgZ290byBFeGl0OwotCi0gIE1pc3NpbmdfRW5jb2Rpbmc6Ci0gICAgLyogTWlzc2luZyBFTkNPRElORyBmaWVsZC4gKi8KLSAgICBGVF9FUlJPUigoICJfYmRmX3BhcnNlX2dseXBoczogIiBFUlJNU0cxLCBsaW5lbm8sICJFTkNPRElORyIgKSk7Ci0gICAgZXJyb3IgPSBGVF9USFJPVyggTWlzc2luZ19FbmNvZGluZ19GaWVsZCApOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciAmJiAoIHAtPmZsYWdzICYgQkRGX0dMWVBIXyApICkKLSAgICAgIEZUX0ZSRUUoIHAtPmdseXBoX25hbWUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogTG9hZCB0aGUgZm9udCBwcm9wZXJ0aWVzLiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgX2JkZl9wYXJzZV9wcm9wZXJ0aWVzKCBjaGFyKiAgICAgICAgICBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGxpbmVsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgbGluZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIGNhbGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBjbGllbnRfZGF0YSApCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgdmxlbjsKLSAgICBfYmRmX2xpbmVfZnVuY190KiAgbmV4dDsKLSAgICBfYmRmX3BhcnNlX3QqICAgICAgcDsKLSAgICBjaGFyKiAgICAgICAgICAgICAgbmFtZTsKLSAgICBjaGFyKiAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgY2hhciAgICAgICAgICAgICAgIG5idWZbMTI4XTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICBGVF9VTlVTRUQoIGxpbmVubyApOwotCi0KLSAgICBuZXh0ID0gKF9iZGZfbGluZV9mdW5jX3QgKiljYWxsX2RhdGE7Ci0gICAgcCAgICA9IChfYmRmX3BhcnNlX3QgKikgICAgY2xpZW50X2RhdGE7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIGVuZCBvZiB0aGUgcHJvcGVydGllcy4gKi8KLSAgICBpZiAoIF9iZGZfc3RybmNtcCggbGluZSwgIkVORFBST1BFUlRJRVMiLCAxMyApID09IDAgKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBGT05UX0FTQ0VOVCBvciBGT05UX0RFU0NFTlQgcHJvcGVydGllcyBoYXZlIG5vdCBiZWVuICAgICAgKi8KLSAgICAgIC8qIGVuY291bnRlcmVkIHlldCwgdGhlbiBtYWtlIHN1cmUgdGhleSBhcmUgYWRkZWQgYXMgcHJvcGVydGllcyBhbmQgKi8KLSAgICAgIC8qIG1ha2Ugc3VyZSB0aGV5IGFyZSBzZXQgZnJvbSB0aGUgZm9udCBib3VuZGluZyBib3ggaW5mby4gICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFRoaXMgaXMgKmFsd2F5cyogZG9uZSByZWdhcmRsZXNzIG9mIHRoZSBvcHRpb25zLCBiZWNhdXNlIFgxMSAgICAgKi8KLSAgICAgIC8qIHJlcXVpcmVzIHRoZXNlIHR3byBmaWVsZHMgdG8gY29tcGlsZSBmb250cy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggYmRmX2dldF9mb250X3Byb3BlcnR5KCBwLT5mb250LCAiRk9OVF9BU0NFTlQiICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHAtPmZvbnQtPmZvbnRfYXNjZW50ID0gcC0+Zm9udC0+YmJ4LmFzY2VudDsKLSAgICAgICAgZnRfc3ByaW50ZiggbmJ1ZiwgIiVoZCIsIHAtPmZvbnQtPmJieC5hc2NlbnQgKTsKLSAgICAgICAgZXJyb3IgPSBfYmRmX2FkZF9wcm9wZXJ0eSggcC0+Zm9udCwgKGNoYXIgKikiRk9OVF9BU0NFTlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnVmLCBsaW5lbm8gKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIEZUX1RSQUNFMigoICJfYmRmX3BhcnNlX3Byb3BlcnRpZXM6ICIgQUNNU0cxLCBwLT5mb250LT5iYnguYXNjZW50ICkpOwotICAgICAgICBwLT5mb250LT5tb2RpZmllZCA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmRmX2dldF9mb250X3Byb3BlcnR5KCBwLT5mb250LCAiRk9OVF9ERVNDRU5UIiApID09IDAgKQotICAgICAgewotICAgICAgICBwLT5mb250LT5mb250X2Rlc2NlbnQgPSBwLT5mb250LT5iYnguZGVzY2VudDsKLSAgICAgICAgZnRfc3ByaW50ZiggbmJ1ZiwgIiVoZCIsIHAtPmZvbnQtPmJieC5kZXNjZW50ICk7Ci0gICAgICAgIGVycm9yID0gX2JkZl9hZGRfcHJvcGVydHkoIHAtPmZvbnQsIChjaGFyICopIkZPTlRfREVTQ0VOVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5idWYsIGxpbmVubyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgRlRfVFJBQ0UyKCggIl9iZGZfcGFyc2VfcHJvcGVydGllczogIiBBQ01TRzIsIHAtPmZvbnQtPmJieC5kZXNjZW50ICkpOwotICAgICAgICBwLT5mb250LT5tb2RpZmllZCA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIHAtPmZsYWdzICY9IH5CREZfUFJPUFNfOwotICAgICAgKm5leHQgICAgID0gX2JkZl9wYXJzZV9nbHlwaHM7Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBJZ25vcmUgdGhlIF9YRlJFRTg2X0dMWVBIX1JBTkdFUyBwcm9wZXJ0aWVzLiAqLwotICAgIGlmICggX2JkZl9zdHJuY21wKCBsaW5lLCAiX1hGUkVFODZfR0xZUEhfUkFOR0VTIiwgMjEgKSA9PSAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIEhhbmRsZSBDT01NRU5UIGZpZWxkcyBhbmQgcHJvcGVydGllcyBpbiBhIHNwZWNpYWwgd2F5IHRvIHByZXNlcnZlICovCi0gICAgLyogdGhlIHNwYWNpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIF9iZGZfc3RybmNtcCggbGluZSwgIkNPTU1FTlQiLCA3ICkgPT0gMCApCi0gICAgewotICAgICAgbmFtZSA9IHZhbHVlID0gbGluZTsKLSAgICAgIHZhbHVlICs9IDc7Ci0gICAgICBpZiAoICp2YWx1ZSApCi0gICAgICAgICp2YWx1ZSsrID0gMDsKLSAgICAgIGVycm9yID0gX2JkZl9hZGRfcHJvcGVydHkoIHAtPmZvbnQsIG5hbWUsIHZhbHVlLCBsaW5lbm8gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBfYmRmX2lzX2F0b20oIGxpbmUsIGxpbmVsZW4sICZuYW1lLCAmdmFsdWUsIHAtPmZvbnQgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBfYmRmX2FkZF9wcm9wZXJ0eSggcC0+Zm9udCwgbmFtZSwgdmFsdWUsIGxpbmVubyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgKGNoYXIgKikiICsiLCBsaW5lLCBsaW5lbGVuICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgbmFtZSA9IHAtPmxpc3QuZmllbGRbMF07Ci0KLSAgICAgIF9iZGZfbGlzdF9zaGlmdCggJnAtPmxpc3QsIDEgKTsKLSAgICAgIHZhbHVlID0gX2JkZl9saXN0X2pvaW4oICZwLT5saXN0LCAnICcsICZ2bGVuICk7Ci0KLSAgICAgIGVycm9yID0gX2JkZl9hZGRfcHJvcGVydHkoIHAtPmZvbnQsIG5hbWUsIHZhbHVlLCBsaW5lbm8gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBMb2FkIHRoZSBmb250IGhlYWRlci4gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIF9iZGZfcGFyc2Vfc3RhcnQoIGNoYXIqICAgICAgICAgIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGxpbmVsZW4sCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGxpbmVubywKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgY2FsbF9kYXRhLAotICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBjbGllbnRfZGF0YSApCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgc2xlbjsKLSAgICBfYmRmX2xpbmVfZnVuY190KiAgbmV4dDsKLSAgICBfYmRmX3BhcnNlX3QqICAgICAgcDsKLSAgICBiZGZfZm9udF90KiAgICAgICAgZm9udDsKLSAgICBjaGFyICAgICAgICAgICAgICAgKnM7Ci0KLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ID0gTlVMTDsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotCi0gICAgRlRfVU5VU0VEKCBsaW5lbm8gKTsgICAgICAgICAgICAvKiBvbmx5IHVzZWQgaW4gZGVidWcgbW9kZSAqLwotCi0KLSAgICBuZXh0ID0gKF9iZGZfbGluZV9mdW5jX3QgKiljYWxsX2RhdGE7Ci0gICAgcCAgICA9IChfYmRmX3BhcnNlX3QgKikgICAgY2xpZW50X2RhdGE7Ci0KLSAgICBpZiAoIHAtPmZvbnQgKQotICAgICAgbWVtb3J5ID0gcC0+Zm9udC0+bWVtb3J5OwotCi0gICAgLyogQ2hlY2sgZm9yIGEgY29tbWVudC4gIFRoaXMgaXMgZG9uZSB0byBoYW5kbGUgdGhvc2UgZm9udHMgdGhhdCBoYXZlICovCi0gICAgLyogY29tbWVudHMgYmVmb3JlIHRoZSBTVEFSVEZPTlQgbGluZSBmb3Igc29tZSByZWFzb24uICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJDT01NRU5UIiwgNyApID09IDAgKQotICAgIHsKLSAgICAgIGlmICggcC0+b3B0cy0+a2VlcF9jb21tZW50cyAhPSAwICYmIHAtPmZvbnQgIT0gMCApCi0gICAgICB7Ci0gICAgICAgIGxpbmVsZW4gLT0gNzsKLQotICAgICAgICBzID0gbGluZSArIDc7Ci0gICAgICAgIGlmICggKnMgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBzKys7Ci0gICAgICAgICAgbGluZWxlbi0tOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyb3IgPSBfYmRmX2FkZF9jb21tZW50KCBwLT5mb250LCBzLCBsaW5lbGVuICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgLyogaGVyZSBmb250IGlzIG5vdCBkZWZpbmVkISAqLwotICAgICAgfQotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9TVEFSVF8gKSApCi0gICAgewotICAgICAgbWVtb3J5ID0gcC0+bWVtb3J5OwotCi0gICAgICBpZiAoIF9iZGZfc3RybmNtcCggbGluZSwgIlNUQVJURk9OVCIsIDkgKSAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogd2UgZG9uJ3QgZW1pdCBhbiBlcnJvciBtZXNzYWdlIHNpbmNlIHRoaXMgY29kZSBnZXRzICovCi0gICAgICAgIC8qIGV4cGxpY2l0bHkgY2F1Z2h0IG9uZSBsZXZlbCBoaWdoZXIgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX1N0YXJ0Zm9udF9GaWVsZCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHAtPmZsYWdzID0gQkRGX1NUQVJUXzsKLSAgICAgIGZvbnQgPSBwLT5mb250ID0gMDsKLQotICAgICAgaWYgKCBGVF9ORVcoIGZvbnQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIHAtPmZvbnQgPSBmb250OwotCi0gICAgICBmb250LT5tZW1vcnkgPSBwLT5tZW1vcnk7Ci0gICAgICBwLT5tZW1vcnkgICAgPSAwOwotCi0gICAgICB7IC8qIHNldHVwICovCi0gICAgICAgIHNpemVfdCAgICAgICAgICAgaTsKLSAgICAgICAgYmRmX3Byb3BlcnR5X3QqICBwcm9wOwotCi0KLSAgICAgICAgZXJyb3IgPSBmdF9oYXNoX3N0cl9pbml0KCAmKGZvbnQtPnByb3B0YmwpLCBtZW1vcnkgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBmb3IgKCBpID0gMCwgcHJvcCA9IChiZGZfcHJvcGVydHlfdCopX2JkZl9wcm9wZXJ0aWVzOwotICAgICAgICAgICAgICBpIDwgX251bV9iZGZfcHJvcGVydGllczsgaSsrLCBwcm9wKysgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBmdF9oYXNoX3N0cl9pbnNlcnQoIHByb3AtPm5hbWUsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZm9udC0+cHJvcHRibCksIG1lbW9yeSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggRlRfQUxMT0MoIHAtPmZvbnQtPmludGVybmFsLCBzaXplb2YgKCBGVF9IYXNoUmVjICkgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGVycm9yID0gZnRfaGFzaF9zdHJfaW5pdCggKEZUX0hhc2gpcC0+Zm9udC0+aW50ZXJuYWwsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIHAtPmZvbnQtPnNwYWNpbmcgICAgICA9IHAtPm9wdHMtPmZvbnRfc3BhY2luZzsKLSAgICAgIHAtPmZvbnQtPmRlZmF1bHRfY2hhciA9IC0xOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBzdGFydCBvZiB0aGUgcHJvcGVydGllcy4gKi8KLSAgICBpZiAoIF9iZGZfc3RybmNtcCggbGluZSwgIlNUQVJUUFJPUEVSVElFUyIsIDE1ICkgPT0gMCApCi0gICAgewotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9GT05UX0JCWF8gKSApCi0gICAgICB7Ci0gICAgICAgIC8qIE1pc3NpbmcgdGhlIEZPTlRCT1VORElOR0JPWCBmaWVsZC4gKi8KLSAgICAgICAgRlRfRVJST1IoKCAiX2JkZl9wYXJzZV9zdGFydDogIiBFUlJNU0cxLCBsaW5lbm8sICJGT05UQk9VTkRJTkdCT1giICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX0ZvbnRib3VuZGluZ2JveF9GaWVsZCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgKGNoYXIgKikiICsiLCBsaW5lLCBsaW5lbGVuICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBhdCB0aGlzIHBvaW50LCBgcC0+Zm9udCcgY2FuJ3QgYmUgTlVMTCAqLwotICAgICAgcC0+Y250ID0gcC0+Zm9udC0+cHJvcHNfc2l6ZSA9IF9iZGZfYXRvdWwoIHAtPmxpc3QuZmllbGRbMV0gKTsKLSAgICAgIC8qIFdlIG5lZWQgYXQgbGVhc3QgNCBieXRlcyBwZXIgcHJvcGVydHkuICovCi0gICAgICBpZiAoIHAtPmNudCA+IHAtPnNpemUgLyA0ICkKLSAgICAgIHsKLSAgICAgICAgcC0+Zm9udC0+cHJvcHNfc2l6ZSA9IDA7Ci0KLSAgICAgICAgRlRfRVJST1IoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgRVJSTVNHNSwgbGluZW5vLCAiU1RBUlRQUk9QRVJUSUVTIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBwLT5mb250LT5wcm9wcywgcC0+Y250ICkgKQotICAgICAgewotICAgICAgICBwLT5mb250LT5wcm9wc19zaXplID0gMDsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBwLT5mbGFncyB8PSBCREZfUFJPUFNfOwotICAgICAgKm5leHQgICAgID0gX2JkZl9wYXJzZV9wcm9wZXJ0aWVzOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBGT05UQk9VTkRJTkdCT1ggZmllbGQuICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJGT05UQk9VTkRJTkdCT1giLCAxNSApID09IDAgKQotICAgIHsKLSAgICAgIGlmICggISggcC0+ZmxhZ3MgJiBCREZfU0laRV8gKSApCi0gICAgICB7Ci0gICAgICAgIC8qIE1pc3NpbmcgdGhlIFNJWkUgZmllbGQuICovCi0gICAgICAgIEZUX0VSUk9SKCggIl9iZGZfcGFyc2Vfc3RhcnQ6ICIgRVJSTVNHMSwgbGluZW5vLCAiU0laRSIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIE1pc3NpbmdfU2l6ZV9GaWVsZCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgKGNoYXIgKikiICsiLCBsaW5lLCBsaW5lbGVuICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwLT5mb250LT5iYngud2lkdGggID0gX2JkZl9hdG91cyggcC0+bGlzdC5maWVsZFsxXSApOwotICAgICAgcC0+Zm9udC0+YmJ4LmhlaWdodCA9IF9iZGZfYXRvdXMoIHAtPmxpc3QuZmllbGRbMl0gKTsKLQotICAgICAgcC0+Zm9udC0+YmJ4Lnhfb2Zmc2V0ID0gX2JkZl9hdG9zKCBwLT5saXN0LmZpZWxkWzNdICk7Ci0gICAgICBwLT5mb250LT5iYngueV9vZmZzZXQgPSBfYmRmX2F0b3MoIHAtPmxpc3QuZmllbGRbNF0gKTsKLQotICAgICAgcC0+Zm9udC0+YmJ4LmFzY2VudCAgPSAoc2hvcnQpKCBwLT5mb250LT5iYnguaGVpZ2h0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Zm9udC0+YmJ4Lnlfb2Zmc2V0ICk7Ci0KLSAgICAgIHAtPmZvbnQtPmJieC5kZXNjZW50ID0gKHNob3J0KSggLXAtPmZvbnQtPmJieC55X29mZnNldCApOwotCi0gICAgICBwLT5mbGFncyB8PSBCREZfRk9OVF9CQlhfOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogVGhlIG5leHQgdGhpbmcgdG8gY2hlY2sgZm9yIGlzIHRoZSBGT05UIGZpZWxkLiAqLwotICAgIGlmICggX2JkZl9zdHJuY21wKCBsaW5lLCAiRk9OVCIsIDQgKSA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJnAtPmxpc3QsIChjaGFyICopIiArIiwgbGluZSwgbGluZWxlbiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIF9iZGZfbGlzdF9zaGlmdCggJnAtPmxpc3QsIDEgKTsKLQotICAgICAgcyA9IF9iZGZfbGlzdF9qb2luKCAmcC0+bGlzdCwgJyAnLCAmc2xlbiApOwotCi0gICAgICBpZiAoICFzICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiX2JkZl9wYXJzZV9zdGFydDogIiBFUlJNU0c4LCBsaW5lbm8sICJGT05UIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEFsbG93aW5nIG11bHRpcGxlIGBGT05UJyBsaW5lcyAod2hpY2ggaXMgaW52YWxpZCkgZG9lc24ndCBodXJ0Li4uICovCi0gICAgICBGVF9GUkVFKCBwLT5mb250LT5uYW1lICk7Ci0KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBwLT5mb250LT5uYW1lLCBzbGVuICsgMSApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgRlRfTUVNX0NPUFkoIHAtPmZvbnQtPm5hbWUsIHMsIHNsZW4gKyAxICk7Ci0KLSAgICAgIC8qIElmIHRoZSBmb250IG5hbWUgaXMgYW4gWExGRCBuYW1lLCBzZXQgdGhlIHNwYWNpbmcgdG8gdGhlIG9uZSBpbiAgKi8KLSAgICAgIC8qIHRoZSBmb250IG5hbWUuICBJZiB0aGVyZSBpcyBubyBzcGFjaW5nIGZhbGwgYmFjayBvbiB0aGUgZGVmYXVsdC4gKi8KLSAgICAgIGVycm9yID0gX2JkZl9zZXRfZGVmYXVsdF9zcGFjaW5nKCBwLT5mb250LCBwLT5vcHRzLCBsaW5lbm8gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHAtPmZsYWdzIHw9IEJERl9GT05UX05BTUVfOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBTSVpFIGZpZWxkLiAqLwotICAgIGlmICggX2JkZl9zdHJuY21wKCBsaW5lLCAiU0laRSIsIDQgKSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoICEoIHAtPmZsYWdzICYgQkRGX0ZPTlRfTkFNRV8gKSApCi0gICAgICB7Ci0gICAgICAgIC8qIE1pc3NpbmcgdGhlIEZPTlQgZmllbGQuICovCi0gICAgICAgIEZUX0VSUk9SKCggIl9iZGZfcGFyc2Vfc3RhcnQ6ICIgRVJSTVNHMSwgbGluZW5vLCAiRk9OVCIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIE1pc3NpbmdfRm9udF9GaWVsZCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgKGNoYXIgKikiICsiLCBsaW5lLCBsaW5lbGVuICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwLT5mb250LT5wb2ludF9zaXplICAgPSBfYmRmX2F0b3VsKCBwLT5saXN0LmZpZWxkWzFdICk7Ci0gICAgICBwLT5mb250LT5yZXNvbHV0aW9uX3ggPSBfYmRmX2F0b3VsKCBwLT5saXN0LmZpZWxkWzJdICk7Ci0gICAgICBwLT5mb250LT5yZXNvbHV0aW9uX3kgPSBfYmRmX2F0b3VsKCBwLT5saXN0LmZpZWxkWzNdICk7Ci0KLSAgICAgIC8qIENoZWNrIGZvciB0aGUgYml0cyBwZXIgcGl4ZWwgZmllbGQuICovCi0gICAgICBpZiAoIHAtPmxpc3QudXNlZCA9PSA1ICkKLSAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgYnBwOwotCi0KLSAgICAgICAgYnBwID0gKHVuc2lnbmVkIHNob3J0KV9iZGZfYXRvcyggcC0+bGlzdC5maWVsZFs0XSApOwotCi0gICAgICAgIC8qIE9ubHkgdmFsdWVzIDEsIDIsIDQsIDggYXJlIGFsbG93ZWQgZm9yIGdyZXltYXAgZm9udHMuICovCi0gICAgICAgIGlmICggYnBwID4gNCApCi0gICAgICAgICAgcC0+Zm9udC0+YnBwID0gODsKLSAgICAgICAgZWxzZSBpZiAoIGJwcCA+IDIgKQotICAgICAgICAgIHAtPmZvbnQtPmJwcCA9IDQ7Ci0gICAgICAgIGVsc2UgaWYgKCBicHAgPiAxICkKLSAgICAgICAgICBwLT5mb250LT5icHAgPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcC0+Zm9udC0+YnBwID0gMTsKLQotICAgICAgICBpZiAoIHAtPmZvbnQtPmJwcCAhPSBicHAgKQotICAgICAgICAgIEZUX1RSQUNFMigoICJfYmRmX3BhcnNlX3N0YXJ0OiAiIEFDTVNHMTEsIHAtPmZvbnQtPmJwcCApKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcC0+Zm9udC0+YnBwID0gMTsKLQotICAgICAgcC0+ZmxhZ3MgfD0gQkRGX1NJWkVfOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBDSEFSUyBmaWVsZCAtLSBmb250IHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsICovCi0gICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJDSEFSUyIsIDUgKSA9PSAwICkKLSAgICB7Ci0gICAgICBjaGFyICBuYnVmWzEyOF07Ci0KLQotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9GT05UX0JCWF8gKSApCi0gICAgICB7Ci0gICAgICAgIC8qIE1pc3NpbmcgdGhlIEZPTlRCT1VORElOR0JPWCBmaWVsZC4gKi8KLSAgICAgICAgRlRfRVJST1IoKCAiX2JkZl9wYXJzZV9zdGFydDogIiBFUlJNU0cxLCBsaW5lbm8sICJGT05UQk9VTkRJTkdCT1giICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX0ZvbnRib3VuZGluZ2JveF9GaWVsZCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEFkZCB0aGUgdHdvIHN0YW5kYXJkIFgxMSBwcm9wZXJ0aWVzIHdoaWNoIGFyZSByZXF1aXJlZCAqLwotICAgICAgLyogZm9yIGNvbXBpbGluZyBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBwLT5mb250LT5mb250X2FzY2VudCA9IHAtPmZvbnQtPmJieC5hc2NlbnQ7Ci0gICAgICBmdF9zcHJpbnRmKCBuYnVmLCAiJWhkIiwgcC0+Zm9udC0+YmJ4LmFzY2VudCApOwotICAgICAgZXJyb3IgPSBfYmRmX2FkZF9wcm9wZXJ0eSggcC0+Zm9udCwgKGNoYXIgKikiRk9OVF9BU0NFTlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJ1ZiwgbGluZW5vICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgRlRfVFJBQ0UyKCggIl9iZGZfcGFyc2VfcHJvcGVydGllczogIiBBQ01TRzEsIHAtPmZvbnQtPmJieC5hc2NlbnQgKSk7Ci0KLSAgICAgIHAtPmZvbnQtPmZvbnRfZGVzY2VudCA9IHAtPmZvbnQtPmJieC5kZXNjZW50OwotICAgICAgZnRfc3ByaW50ZiggbmJ1ZiwgIiVoZCIsIHAtPmZvbnQtPmJieC5kZXNjZW50ICk7Ci0gICAgICBlcnJvciA9IF9iZGZfYWRkX3Byb3BlcnR5KCBwLT5mb250LCAoY2hhciAqKSJGT05UX0RFU0NFTlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJ1ZiwgbGluZW5vICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgRlRfVFJBQ0UyKCggIl9iZGZfcGFyc2VfcHJvcGVydGllczogIiBBQ01TRzIsIHAtPmZvbnQtPmJieC5kZXNjZW50ICkpOwotCi0gICAgICBwLT5mb250LT5tb2RpZmllZCA9IDE7Ci0KLSAgICAgICpuZXh0ID0gX2JkZl9wYXJzZV9nbHlwaHM7Ci0KLSAgICAgIC8qIEEgc3BlY2lhbCByZXR1cm4gdmFsdWUuICovCi0gICAgICBlcnJvciA9IC0xOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIEZUX0VSUk9SKCggIl9iZGZfcGFyc2Vfc3RhcnQ6ICIgRVJSTVNHOSwgbGluZW5vICkpOwotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGJkZl9sb2FkX2ZvbnQoIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICBleHRtZW1vcnksCi0gICAgICAgICAgICAgICAgIGJkZl9vcHRpb25zX3QqICBvcHRzLAotICAgICAgICAgICAgICAgICBiZGZfZm9udF90KiAgICAqZm9udCApCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nICBsaW5lbm8gPSAwOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgX2JkZl9wYXJzZV90ICAgKnAgICAgID0gTlVMTDsKLQotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZXh0bWVtb3J5OyAvKiBuZWVkZWQgZm9yIEZUX05FVyAqLwotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIEZUX05FVyggcCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG1lbW9yeSAgICA9IE5VTEw7Ci0gICAgcC0+b3B0cyAgID0gKGJkZl9vcHRpb25zX3QqKSggKCBvcHRzICE9IDAgKSA/IG9wdHMgOiAmX2JkZl9vcHRzICk7Ci0gICAgcC0+bWlubGIgID0gMzI3Njc7Ci0gICAgcC0+c2l6ZSAgID0gc3RyZWFtLT5zaXplOwotICAgIHAtPm1lbW9yeSA9IGV4dG1lbW9yeTsgIC8qIG9ubHkgZHVyaW5nIGZvbnQgY3JlYXRpb24gKi8KLQotICAgIF9iZGZfbGlzdF9pbml0KCAmcC0+bGlzdCwgZXh0bWVtb3J5ICk7Ci0KLSAgICBlcnJvciA9IF9iZGZfcmVhZHN0cmVhbSggc3RyZWFtLCBfYmRmX3BhcnNlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAsICZsaW5lbm8gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGlmICggcC0+Zm9udCAhPSAwICkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgZm9udCBpcyBub3QgcHJvcG9ydGlvbmFsLCBzZXQgdGhlIGZvbnQncyBtb25vd2lkdGggKi8KLSAgICAgIC8qIGZpZWxkIHRvIHRoZSB3aWR0aCBvZiB0aGUgZm9udCBib3VuZGluZyBib3guICAgICAgICAgICAgICAqLwotCi0gICAgICBpZiAoIHAtPmZvbnQtPnNwYWNpbmcgIT0gQkRGX1BST1BPUlRJT05BTCApCi0gICAgICAgIHAtPmZvbnQtPm1vbm93aWR0aCA9IHAtPmZvbnQtPmJieC53aWR0aDsKLQotICAgICAgLyogSWYgdGhlIG51bWJlciBvZiBnbHlwaHMgbG9hZGVkIGlzIG5vdCB0aGF0IG9mIHRoZSBvcmlnaW5hbCBjb3VudCwgKi8KLSAgICAgIC8qIGluZGljYXRlIHRoZSBkaWZmZXJlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHAtPmNudCAhPSBwLT5mb250LT5nbHlwaHNfdXNlZCArIHAtPmZvbnQtPnVuZW5jb2RlZF91c2VkICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggImJkZl9sb2FkX2ZvbnQ6ICIgQUNNU0cxNSwgcC0+Y250LAotICAgICAgICAgICAgICAgICAgICBwLT5mb250LT5nbHlwaHNfdXNlZCArIHAtPmZvbnQtPnVuZW5jb2RlZF91c2VkICkpOwotICAgICAgICBwLT5mb250LT5tb2RpZmllZCA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE9uY2UgdGhlIGZvbnQgaGFzIGJlZW4gbG9hZGVkLCBhZGp1c3QgdGhlIG92ZXJhbGwgZm9udCBtZXRyaWNzIGlmICovCi0gICAgICAvKiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBwLT5vcHRzLT5jb3JyZWN0X21ldHJpY3MgIT0gMCAmJgotICAgICAgICAgICAoIHAtPmZvbnQtPmdseXBoc191c2VkID4gMCB8fCBwLT5mb250LT51bmVuY29kZWRfdXNlZCA+IDAgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggcC0+bWF4cmIgLSBwLT5taW5sYiAhPSBwLT5mb250LT5iYngud2lkdGggKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UyKCggImJkZl9sb2FkX2ZvbnQ6ICIgQUNNU0czLAotICAgICAgICAgICAgICAgICAgICAgIHAtPmZvbnQtPmJieC53aWR0aCwgcC0+bWF4cmIgLSBwLT5taW5sYiApKTsKLSAgICAgICAgICBwLT5mb250LT5iYngud2lkdGggPSAodW5zaWduZWQgc2hvcnQpKCBwLT5tYXhyYiAtIHAtPm1pbmxiICk7Ci0gICAgICAgICAgcC0+Zm9udC0+bW9kaWZpZWQgID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcC0+Zm9udC0+YmJ4Lnhfb2Zmc2V0ICE9IHAtPm1pbmxiICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJiZGZfbG9hZF9mb250OiAiIEFDTVNHNCwKLSAgICAgICAgICAgICAgICAgICAgICBwLT5mb250LT5iYngueF9vZmZzZXQsIHAtPm1pbmxiICkpOwotICAgICAgICAgIHAtPmZvbnQtPmJieC54X29mZnNldCA9IHAtPm1pbmxiOwotICAgICAgICAgIHAtPmZvbnQtPm1vZGlmaWVkICAgICA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHAtPmZvbnQtPmJieC5hc2NlbnQgIT0gcC0+bWF4YXMgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UyKCggImJkZl9sb2FkX2ZvbnQ6ICIgQUNNU0c1LAotICAgICAgICAgICAgICAgICAgICAgIHAtPmZvbnQtPmJieC5hc2NlbnQsIHAtPm1heGFzICkpOwotICAgICAgICAgIHAtPmZvbnQtPmJieC5hc2NlbnQgPSBwLT5tYXhhczsKLSAgICAgICAgICBwLT5mb250LT5tb2RpZmllZCAgID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcC0+Zm9udC0+YmJ4LmRlc2NlbnQgIT0gcC0+bWF4ZHMgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UyKCggImJkZl9sb2FkX2ZvbnQ6ICIgQUNNU0c2LAotICAgICAgICAgICAgICAgICAgICAgIHAtPmZvbnQtPmJieC5kZXNjZW50LCBwLT5tYXhkcyApKTsKLSAgICAgICAgICBwLT5mb250LT5iYnguZGVzY2VudCAgPSBwLT5tYXhkczsKLSAgICAgICAgICBwLT5mb250LT5iYngueV9vZmZzZXQgPSAoc2hvcnQpKCAtcC0+bWF4ZHMgKTsKLSAgICAgICAgICBwLT5mb250LT5tb2RpZmllZCAgICAgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwLT5tYXhhcyArIHAtPm1heGRzICE9IHAtPmZvbnQtPmJieC5oZWlnaHQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UyKCggImJkZl9sb2FkX2ZvbnQ6ICIgQUNNU0c3LAotICAgICAgICAgICAgICAgICAgICAgIHAtPmZvbnQtPmJieC5oZWlnaHQsIHAtPm1heGFzICsgcC0+bWF4ZHMgKSk7Ci0gICAgICAgICAgcC0+Zm9udC0+YmJ4LmhlaWdodCA9ICh1bnNpZ25lZCBzaG9ydCkoIHAtPm1heGFzICsgcC0+bWF4ZHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcC0+ZmxhZ3MgJiBCREZfU1dJRFRIX0FESl8gKQotICAgICAgICAgIEZUX1RSQUNFMigoICJiZGZfbG9hZF9mb250OiAiIEFDTVNHOCApKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHAtPmZsYWdzICYgQkRGX1NUQVJUXyApCi0gICAgewotICAgICAgLyogVGhlIEVOREZPTlQgZmllbGQgd2FzIG5ldmVyIHJlYWNoZWQgb3IgZGlkIG5vdCBleGlzdC4gKi8KLSAgICAgIGlmICggISggcC0+ZmxhZ3MgJiBCREZfR0xZUEhTXyApICkKLSAgICAgIHsKLSAgICAgICAgLyogRXJyb3IgaGFwcGVuZWQgd2hpbGUgcGFyc2luZyBoZWFkZXIuICovCi0gICAgICAgIEZUX0VSUk9SKCggImJkZl9sb2FkX2ZvbnQ6ICIgRVJSTVNHMiwgbGluZW5vICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBDb3JydXB0ZWRfRm9udF9IZWFkZXIgKTsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBFcnJvciBoYXBwZW5lZCB3aGVuIHBhcnNpbmcgZ2x5cGhzLiAqLwotICAgICAgICBGVF9FUlJPUigoICJiZGZfbG9hZF9mb250OiAiIEVSUk1TRzMsIGxpbmVubyApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggQ29ycnVwdGVkX0ZvbnRfR2x5cGhzICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHAtPmZvbnQgIT0gMCApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZSBjb21tZW50cyBhcmUgTlVMTCB0ZXJtaW5hdGVkIGlmIHRoZXkgZXhpc3QuICovCi0gICAgICBtZW1vcnkgPSBwLT5mb250LT5tZW1vcnk7Ci0KLSAgICAgIGlmICggcC0+Zm9udC0+Y29tbWVudHNfbGVuID4gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIHAtPmZvbnQtPmNvbW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5mb250LT5jb21tZW50c19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmZvbnQtPmNvbW1lbnRzX2xlbiArIDEgKSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHAtPmZvbnQtPmNvbW1lbnRzW3AtPmZvbnQtPmNvbW1lbnRzX2xlbl0gPSAwOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggIWVycm9yICkKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgICpmb250ID0gcC0+Zm9udDsKLQotICBFeGl0OgotICAgIGlmICggcCApCi0gICAgewotICAgICAgX2JkZl9saXN0X2RvbmUoICZwLT5saXN0ICk7Ci0KLSAgICAgIG1lbW9yeSA9IGV4dG1lbW9yeTsKLQotICAgICAgRlRfRlJFRSggcC0+Z2x5cGhfbmFtZSApOwotICAgICAgRlRfRlJFRSggcCApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIGJkZl9mcmVlX2ZvbnQoIHAtPmZvbnQgKTsKLQotICAgIG1lbW9yeSA9IGV4dG1lbW9yeTsKLQotICAgIEZUX0ZSRUUoIHAtPmZvbnQgKTsKLQotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYmRmX2ZyZWVfZm9udCggYmRmX2ZvbnRfdCogIGZvbnQgKQotICB7Ci0gICAgYmRmX3Byb3BlcnR5X3QqICBwcm9wOwotICAgIHVuc2lnbmVkIGxvbmcgICAgaTsKLSAgICBiZGZfZ2x5cGhfdCogICAgIGdseXBoczsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeTsKLQotCi0gICAgaWYgKCBmb250ID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gICAgbWVtb3J5ID0gZm9udC0+bWVtb3J5OwotCi0gICAgRlRfRlJFRSggZm9udC0+bmFtZSApOwotCi0gICAgLyogRnJlZSB1cCB0aGUgaW50ZXJuYWwgaGFzaCB0YWJsZSBvZiBwcm9wZXJ0eSBuYW1lcy4gKi8KLSAgICBpZiAoIGZvbnQtPmludGVybmFsICkKLSAgICB7Ci0gICAgICBmdF9oYXNoX3N0cl9mcmVlKCAoRlRfSGFzaClmb250LT5pbnRlcm5hbCwgbWVtb3J5ICk7Ci0gICAgICBGVF9GUkVFKCBmb250LT5pbnRlcm5hbCApOwotICAgIH0KLQotICAgIC8qIEZyZWUgdXAgdGhlIGNvbW1lbnQgaW5mby4gKi8KLSAgICBGVF9GUkVFKCBmb250LT5jb21tZW50cyApOwotCi0gICAgLyogRnJlZSB1cCB0aGUgcHJvcGVydGllcy4gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IGZvbnQtPnByb3BzX3NpemU7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBmb250LT5wcm9wc1tpXS5mb3JtYXQgPT0gQkRGX0FUT00gKQotICAgICAgICBGVF9GUkVFKCBmb250LT5wcm9wc1tpXS52YWx1ZS5hdG9tICk7Ci0gICAgfQotCi0gICAgRlRfRlJFRSggZm9udC0+cHJvcHMgKTsKLQotICAgIC8qIEZyZWUgdXAgdGhlIGNoYXJhY3RlciBpbmZvLiAqLwotICAgIGZvciAoIGkgPSAwLCBnbHlwaHMgPSBmb250LT5nbHlwaHM7Ci0gICAgICAgICAgaSA8IGZvbnQtPmdseXBoc191c2VkOyBpKyssIGdseXBocysrICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBnbHlwaHMtPm5hbWUgKTsKLSAgICAgIEZUX0ZSRUUoIGdseXBocy0+Yml0bWFwICk7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDAsIGdseXBocyA9IGZvbnQtPnVuZW5jb2RlZDsgaSA8IGZvbnQtPnVuZW5jb2RlZF91c2VkOwotICAgICAgICAgIGkrKywgZ2x5cGhzKysgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGdseXBocy0+bmFtZSApOwotICAgICAgRlRfRlJFRSggZ2x5cGhzLT5iaXRtYXAgKTsKLSAgICB9Ci0KLSAgICBGVF9GUkVFKCBmb250LT5nbHlwaHMgKTsKLSAgICBGVF9GUkVFKCBmb250LT51bmVuY29kZWQgKTsKLQotICAgIC8qIEZyZWUgdXAgdGhlIG92ZXJmbG93IHN0b3JhZ2UgaWYgaXQgd2FzIHVzZWQuICovCi0gICAgZm9yICggaSA9IDAsIGdseXBocyA9IGZvbnQtPm92ZXJmbG93LmdseXBoczsKLSAgICAgICAgICBpIDwgZm9udC0+b3ZlcmZsb3cuZ2x5cGhzX3VzZWQ7IGkrKywgZ2x5cGhzKysgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGdseXBocy0+bmFtZSApOwotICAgICAgRlRfRlJFRSggZ2x5cGhzLT5iaXRtYXAgKTsKLSAgICB9Ci0KLSAgICBGVF9GUkVFKCBmb250LT5vdmVyZmxvdy5nbHlwaHMgKTsKLQotICAgIC8qIGJkZl9jbGVhbnVwICovCi0gICAgZnRfaGFzaF9zdHJfZnJlZSggJihmb250LT5wcm9wdGJsKSwgbWVtb3J5ICk7Ci0KLSAgICAvKiBGcmVlIHVwIHRoZSB1c2VyIGRlZmluZWQgcHJvcGVydGllcy4gKi8KLSAgICBmb3IgKCBwcm9wID0gZm9udC0+dXNlcl9wcm9wcywgaSA9IDA7Ci0gICAgICAgICAgaSA8IGZvbnQtPm51c2VyX3Byb3BzOyBpKyssIHByb3ArKyApCi0gICAgewotICAgICAgRlRfRlJFRSggcHJvcC0+bmFtZSApOwotICAgICAgaWYgKCBwcm9wLT5mb3JtYXQgPT0gQkRGX0FUT00gKQotICAgICAgICBGVF9GUkVFKCBwcm9wLT52YWx1ZS5hdG9tICk7Ci0gICAgfQotCi0gICAgRlRfRlJFRSggZm9udC0+dXNlcl9wcm9wcyApOwotCi0gICAgLyogRlJFRSggZm9udCApOyAqLyAvKiBYWFggRml4bWUgKi8KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBiZGZfcHJvcGVydHlfdCAqICkKLSAgYmRmX2dldF9mb250X3Byb3BlcnR5KCBiZGZfZm9udF90KiAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbmFtZSApCi0gIHsKLSAgICBzaXplX3QqICBwcm9waWQ7Ci0KLQotICAgIGlmICggZm9udCA9PSAwIHx8IGZvbnQtPnByb3BzX3NpemUgPT0gMCB8fCBuYW1lID09IDAgfHwgKm5hbWUgPT0gMCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIHByb3BpZCA9IGZ0X2hhc2hfc3RyX2xvb2t1cCggbmFtZSwgKEZUX0hhc2gpZm9udC0+aW50ZXJuYWwgKTsKLQotICAgIHJldHVybiBwcm9waWQgPyAoIGZvbnQtPnByb3BzICsgKnByb3BpZCApIDogMDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2JkZi9tb2R1bGUubWsgYi9zcmMvYmRmL21vZHVsZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwNmFlOC4uMDAwMDAwMAotLS0gYS9zcmMvYmRmL21vZHVsZS5taworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBCREYgbW9kdWxlIGRlZmluaXRpb24KLSMKLQotIyBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwNiBieQotIyBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLSMKLSMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi0jIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLSMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi0jIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0jCi0jIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0jIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi0jIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi0jIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KLSMgVEhFIFNPRlRXQVJFLgotCi0KLUZUTU9EVUxFX0hfQ09NTUFORFMgKz0gQkRGX0RSSVZFUgotCi1kZWZpbmUgQkRGX0RSSVZFUgotJChPUEVOX0RSSVZFUikgRlRfRHJpdmVyX0NsYXNzUmVjLCBiZGZfZHJpdmVyX2NsYXNzICQoQ0xPU0VfRFJJVkVSKQotJChFQ0hPX0RSSVZFUiliZGYgICAgICAgJChFQ0hPX0RSSVZFUl9ERVNDKWJkZiBiaXRtYXAgZm9udHMkKEVDSE9fRFJJVkVSX0RPTkUpCi1lbmRlZgotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL2JkZi9ydWxlcy5tayBiL3NyYy9iZGYvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZGQ3NmIuLjAwMDAwMDAKLS0tIGEvc3JjL2JkZi9ydWxlcy5taworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBiZGYgZHJpdmVyIGNvbmZpZ3VyYXRpb24gcnVsZXMKLSMKLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwOCBieQotIyBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLSMKLSMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi0jIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLSMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi0jIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0jCi0jIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0jIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi0jIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi0jIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KLSMgVEhFIFNPRlRXQVJFLgotCi0KLQotCi0jIGJkZiBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1CREZfRElSIDo9ICQoU1JDX0RJUikvYmRmCi0KLQotQkRGX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKEJERl9ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBiZGYgZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1CREZfRFJWX1NSQyA6PSAkKEJERl9ESVIpL2JkZmxpYi5jIFwKLSAgICAgICAgICAgICAgICQoQkRGX0RJUikvYmRmZHJpdnIuYwotCi0KLSMgYmRmIGRyaXZlciBoZWFkZXJzCi0jCi1CREZfRFJWX0ggOj0gJChCREZfRElSKS9iZGYuaCBcCi0gICAgICAgICAgICAgJChCREZfRElSKS9iZGZkcml2ci5oIFwKLSAgICAgICAgICAgICAkKEJERl9ESVIpL2JkZmVycm9yLmgKLQotIyBiZGYgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIEJERl9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMKLSMgICBCREZfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcwotIwotQkRGX0RSVl9PQkpfTSA6PSAkKEJERl9EUlZfU1JDOiQoQkRGX0RJUikvJS5jPSQoT0JKX0RJUikvJS4kTykKLUJERl9EUlZfT0JKX1MgOj0gJChPQkpfRElSKS9iZGYuJE8KLQotIyBiZGYgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLUJERl9EUlZfU1JDX1MgOj0gJChCREZfRElSKS9iZGYuYwotCi0KLSMgYmRmIGRyaXZlciAtIHNpbmdsZSBvYmplY3QKLSMKLSQoQkRGX0RSVl9PQkpfUyk6ICQoQkRGX0RSVl9TUkNfUykgJChCREZfRFJWX1NSQykgJChGUkVFVFlQRV9IKSAkKEJERl9EUlZfSCkKLQkkKEJERl9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChCREZfRFJWX1NSQ19TKSkKLQotCi0jIGJkZiBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCi0jCi0kKE9CSl9ESVIpLyUuJE86ICQoQkRGX0RJUikvJS5jICQoRlJFRVRZUEVfSCkgJChCREZfRFJWX0gpCi0JJChCREZfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQ8KQotCi0KLSMgdXBkYXRlIG1haW4gZHJpdmVyIG9iamVjdCBsaXN0cwotIwotRFJWX09CSlNfUyArPSAkKEJERl9EUlZfT0JKX1MpCi1EUlZfT0JKU19NICs9ICQoQkRGX0RSVl9PQkpfTSkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL2J6aXAyL0phbWZpbGUgYi9zcmMvYnppcDIvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2OWQ0YS4uMDAwMDAwMAotLS0gYS9zcmMvYnppcDIvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvYnppcDIgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAxMC0yMDE3IGJ5Ci0jIEpvZWwgS2xpbmdoZWQKLSMKLSMgYmFzZWQgb24gYHNyYy9sencvSmFtZmlsZScKLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIGJ6aXAyIDsKLQotTGlicmFyeSAgJChGVDJfTElCKSA6IGZ0YnppcDIuYyA7Ci0KLSMgZW5kIG9mIHNyYy9iemlwMiBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvYnppcDIvZnRiemlwMi5jIGIvc3JjL2J6aXAyL2Z0YnppcDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjNzFlNy4uMDAwMDAwMAotLS0gYS9zcmMvYnppcDIvZnRiemlwMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YnppcDIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzdXBwb3J0IGZvciAuYnoyIGNvbXByZXNzZWQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIG9wdGlvbmFsIGNvbXBvbmVudCByZWxpZXMgb24gbGliYnoyLiAgSXQgc2hvdWxkIG1haW5seSBiZSB1c2VkIHRvICovCi0vKiAgcGFyc2UgY29tcHJlc3NlZCBQQ0YgZm9udHMsIGFzIGZvdW5kIHdpdGggbWFueSBYMTEgc2VydmVyICAgICAgICAgICAgICAqLwotLyogIGRpc3RyaWJ1dGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEpvZWwgS2xpbmdoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYmFzZWQgb24gYHNyYy9nemlwL2Z0Z3ppcC5jJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0JaSVAyX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBCemlwMl9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfQnppcDIKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfQlpJUDIKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgImJ6aXAyIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLSNkZWZpbmUgQlpfTk9fU1RESU8gLyogRG8gbm90IG5lZWQgRklMRSAqLwotI2luY2x1ZGUgPGJ6bGliLmg+Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotLyoqKioqICAgICAgICAgICBCIFogSSBQIDIgICBNIEUgTSBPIFIgWSAgIE0gQSBOIEEgRyBFIE0gRSBOIFQgICAgICAgICAqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBpdCBpcyBiZXR0ZXIgdG8gdXNlIEZyZWVUeXBlIG1lbW9yeSByb3V0aW5lcyBpbnN0ZWFkIG9mIHJhdwotICAgICAnbWFsbG9jL2ZyZWUnICovCi0KLSAgdHlwZWRlZiB2b2lkICooKiBhbGxvY19mdW5jKSh2b2lkKiwgaW50LCBpbnQpOwotICB0eXBlZGVmIHZvaWQgKCogZnJlZV9mdW5jKSh2b2lkKiwgdm9pZCopOwotCi0gIHN0YXRpYyB2b2lkKgotICBmdF9iemlwMl9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGl0ZW1zLAotICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBzaXplICkKLSAgewotICAgIEZUX1VMb25nICAgIHN6ID0gKEZUX1VMb25nKXNpemUgKiAoRlRfVUxvbmcpaXRlbXM7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfUG9pbnRlciAgcCAgPSBOVUxMOwotCi0KLSAgICAodm9pZClGVF9BTExPQyggcCwgc3ogKTsKLSAgICByZXR1cm4gcDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfYnppcDJfZnJlZSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYWRkcmVzcyApCi0gIHsKLSAgICBGVF9NRU1fRlJFRSggYWRkcmVzcyApOwotICB9Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotLyoqKioqICAgICAgICAgICAgICBCIFogSSBQIDIgICBGIEkgTCBFICAgRCBFIFMgQyBSIEkgUCBUIE8gUiAgICAgICAgICAqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGVF9CWklQMl9CVUZGRVJfU0laRSAgNDA5NgotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9CWmlwMkZpbGVSZWNfCi0gIHsKLSAgICBGVF9TdHJlYW0gIHNvdXJjZTsgICAgICAgICAvKiBwYXJlbnQvc291cmNlIHN0cmVhbSAgICAgICAgKi8KLSAgICBGVF9TdHJlYW0gIHN0cmVhbTsgICAgICAgICAvKiBlbWJlZGRpbmcgc3RyZWFtICAgICAgICAgICAgKi8KLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsgICAgICAgICAvKiBtZW1vcnkgYWxsb2NhdG9yICAgICAgICAgICAgKi8KLSAgICBiel9zdHJlYW0gIGJ6c3RyZWFtOyAgICAgICAvKiBiemxpYiBpbnB1dCBzdHJlYW0gICAgICAgICAgKi8KLQotICAgIEZUX0J5dGUgICAgaW5wdXRbRlRfQlpJUDJfQlVGRkVSX1NJWkVdOyAgLyogaW5wdXQgcmVhZCBidWZmZXIgICovCi0KLSAgICBGVF9CeXRlICAgIGJ1ZmZlcltGVF9CWklQMl9CVUZGRVJfU0laRV07IC8qIG91dHB1dCBidWZmZXIgICAgICAqLwotICAgIEZUX1VMb25nICAgcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zaXRpb24gaW4gb3V0cHV0ICovCi0gICAgRlRfQnl0ZSogICBjdXJzb3I7Ci0gICAgRlRfQnl0ZSogICBsaW1pdDsKLQotICB9IEZUX0JaaXAyRmlsZVJlYywgKkZUX0JaaXAyRmlsZTsKLQotCi0gIC8qIGNoZWNrIGFuZCBza2lwIC5iejIgaGVhZGVyIC0gd2UgZG9uJ3Qgc3VwcG9ydCBgdHJhbnNwYXJlbnQnIGNvbXByZXNzaW9uICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9iemlwMl9jaGVja19oZWFkZXIoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9CeXRlICAgaGVhZFs0XTsKLQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMCApICAgICAgIHx8Ci0gICAgICAgICBGVF9TVFJFQU1fUkVBRCggaGVhZCwgNCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGhlYWRbMF0gJiYgaGVhZFsxXSBhcmUgdGhlIG1hZ2ljIG51bWJlcnM7ICAgICovCi0gICAgLyogaGVhZFsyXSBpcyB0aGUgdmVyc2lvbiwgYW5kIGhlYWRbM10gdGhlIGJsb2Nrc2l6ZSAqLwotICAgIGlmICggaGVhZFswXSAhPSAweDQyICB8fAotICAgICAgICAgaGVhZFsxXSAhPSAweDVBICB8fAotICAgICAgICAgaGVhZFsyXSAhPSAweDY4ICApICAvKiBvbmx5IHN1cHBvcnQgYnppcDIgKGh1ZmZtYW4pICovCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2J6aXAyX2ZpbGVfaW5pdCggRlRfQlppcDJGaWxlICB6aXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICBzb3VyY2UgKQotICB7Ci0gICAgYnpfc3RyZWFtKiAgYnpzdHJlYW0gPSAmemlwLT5ienN0cmVhbTsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgICA9IEZUX0Vycl9PazsKLQotCi0gICAgemlwLT5zdHJlYW0gPSBzdHJlYW07Ci0gICAgemlwLT5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgemlwLT5tZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotICAgIHppcC0+bGltaXQgID0gemlwLT5idWZmZXIgKyBGVF9CWklQMl9CVUZGRVJfU0laRTsKLSAgICB6aXAtPmN1cnNvciA9IHppcC0+bGltaXQ7Ci0gICAgemlwLT5wb3MgICAgPSAwOwotCi0gICAgLyogY2hlY2sgLmJ6MiBoZWFkZXIgKi8KLSAgICB7Ci0gICAgICBzdHJlYW0gPSBzb3VyY2U7Ci0KLSAgICAgIGVycm9yID0gZnRfYnppcDJfY2hlY2tfaGVhZGVyKCBzdHJlYW0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIGJ6bGliICovCi0gICAgYnpzdHJlYW0tPmJ6YWxsb2MgPSAoYWxsb2NfZnVuYylmdF9iemlwMl9hbGxvYzsKLSAgICBienN0cmVhbS0+YnpmcmVlICA9IChmcmVlX2Z1bmMpIGZ0X2J6aXAyX2ZyZWU7Ci0gICAgYnpzdHJlYW0tPm9wYXF1ZSAgPSB6aXAtPm1lbW9yeTsKLQotICAgIGJ6c3RyZWFtLT5hdmFpbF9pbiA9IDA7Ci0gICAgYnpzdHJlYW0tPm5leHRfaW4gID0gKGNoYXIqKXppcC0+YnVmZmVyOwotCi0gICAgaWYgKCBCWjJfYnpEZWNvbXByZXNzSW5pdCggYnpzdHJlYW0sIDAsIDAgKSAhPSBCWl9PSyB8fAotICAgICAgICAgIWJ6c3RyZWFtLT5uZXh0X2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9iemlwMl9maWxlX2RvbmUoIEZUX0JaaXAyRmlsZSAgemlwICkKLSAgewotICAgIGJ6X3N0cmVhbSogIGJ6c3RyZWFtID0gJnppcC0+YnpzdHJlYW07Ci0KLQotICAgIEJaMl9iekRlY29tcHJlc3NFbmQoIGJ6c3RyZWFtICk7Ci0KLSAgICAvKiBjbGVhciB0aGUgcmVzdCAqLwotICAgIGJ6c3RyZWFtLT5iemFsbG9jICAgPSBOVUxMOwotICAgIGJ6c3RyZWFtLT5iemZyZWUgICAgPSBOVUxMOwotICAgIGJ6c3RyZWFtLT5vcGFxdWUgICAgPSBOVUxMOwotICAgIGJ6c3RyZWFtLT5uZXh0X2luICAgPSBOVUxMOwotICAgIGJ6c3RyZWFtLT5uZXh0X291dCAgPSBOVUxMOwotICAgIGJ6c3RyZWFtLT5hdmFpbF9pbiAgPSAwOwotICAgIGJ6c3RyZWFtLT5hdmFpbF9vdXQgPSAwOwotCi0gICAgemlwLT5tZW1vcnkgPSBOVUxMOwotICAgIHppcC0+c291cmNlID0gTlVMTDsKLSAgICB6aXAtPnN0cmVhbSA9IE5VTEw7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9iemlwMl9maWxlX3Jlc2V0KCBGVF9CWmlwMkZpbGUgIHppcCApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IHppcC0+c291cmNlOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgIGlmICggIUZUX1NUUkVBTV9TRUVLKCAwICkgKQotICAgIHsKLSAgICAgIGJ6X3N0cmVhbSogIGJ6c3RyZWFtID0gJnppcC0+YnpzdHJlYW07Ci0KLQotICAgICAgQloyX2J6RGVjb21wcmVzc0VuZCggYnpzdHJlYW0gKTsKLQotICAgICAgYnpzdHJlYW0tPmF2YWlsX2luICA9IDA7Ci0gICAgICBienN0cmVhbS0+bmV4dF9pbiAgID0gKGNoYXIqKXppcC0+aW5wdXQ7Ci0gICAgICBienN0cmVhbS0+YXZhaWxfb3V0ID0gMDsKLSAgICAgIGJ6c3RyZWFtLT5uZXh0X291dCAgPSAoY2hhciopemlwLT5idWZmZXI7Ci0KLSAgICAgIHppcC0+bGltaXQgID0gemlwLT5idWZmZXIgKyBGVF9CWklQMl9CVUZGRVJfU0laRTsKLSAgICAgIHppcC0+Y3Vyc29yID0gemlwLT5saW1pdDsKLSAgICAgIHppcC0+cG9zICAgID0gMDsKLQotICAgICAgQloyX2J6RGVjb21wcmVzc0luaXQoIGJ6c3RyZWFtLCAwLCAwICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfYnppcDJfZmlsZV9maWxsX2lucHV0KCBGVF9CWmlwMkZpbGUgIHppcCApCi0gIHsKLSAgICBiel9zdHJlYW0qICBienN0cmVhbSA9ICZ6aXAtPmJ6c3RyZWFtOwotICAgIEZUX1N0cmVhbSAgIHN0cmVhbSAgICA9IHppcC0+c291cmNlOwotICAgIEZUX1VMb25nICAgIHNpemU7Ci0KLQotICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICB7Ci0gICAgICBzaXplID0gc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLCB6aXAtPmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQlpJUDJfQlVGRkVSX1NJWkUgKTsKLSAgICAgIGlmICggc2l6ZSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgemlwLT5saW1pdCA9IHppcC0+Y3Vyc29yOwotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2l6ZSA9IHN0cmVhbS0+c2l6ZSAtIHN0cmVhbS0+cG9zOwotICAgICAgaWYgKCBzaXplID4gRlRfQlpJUDJfQlVGRkVSX1NJWkUgKQotICAgICAgICBzaXplID0gRlRfQlpJUDJfQlVGRkVSX1NJWkU7Ci0KLSAgICAgIGlmICggc2l6ZSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgemlwLT5saW1pdCA9IHppcC0+Y3Vyc29yOwotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgICAgfQotCi0gICAgICBGVF9NRU1fQ09QWSggemlwLT5pbnB1dCwgc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3MsIHNpemUgKTsKLSAgICB9Ci0gICAgc3RyZWFtLT5wb3MgKz0gc2l6ZTsKLQotICAgIGJ6c3RyZWFtLT5uZXh0X2luICA9IChjaGFyKil6aXAtPmlucHV0OwotICAgIGJ6c3RyZWFtLT5hdmFpbF9pbiA9IHNpemU7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfYnppcDJfZmlsZV9maWxsX291dHB1dCggRlRfQlppcDJGaWxlICB6aXAgKQotICB7Ci0gICAgYnpfc3RyZWFtKiAgYnpzdHJlYW0gPSAmemlwLT5ienN0cmVhbTsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgICA9IEZUX0Vycl9PazsKLQotCi0gICAgemlwLT5jdXJzb3IgICAgICAgICA9IHppcC0+YnVmZmVyOwotICAgIGJ6c3RyZWFtLT5uZXh0X291dCAgPSAoY2hhciopemlwLT5jdXJzb3I7Ci0gICAgYnpzdHJlYW0tPmF2YWlsX291dCA9IEZUX0JaSVAyX0JVRkZFUl9TSVpFOwotCi0gICAgd2hpbGUgKCBienN0cmVhbS0+YXZhaWxfb3V0ID4gMCApCi0gICAgewotICAgICAgaW50ICBlcnI7Ci0KLQotICAgICAgaWYgKCBienN0cmVhbS0+YXZhaWxfaW4gPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gZnRfYnppcDJfZmlsZV9maWxsX2lucHV0KCB6aXAgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGVyciA9IEJaMl9iekRlY29tcHJlc3MoIGJ6c3RyZWFtICk7Ci0KLSAgICAgIGlmICggZXJyID09IEJaX1NUUkVBTV9FTkQgKQotICAgICAgewotICAgICAgICB6aXAtPmxpbWl0ID0gKEZUX0J5dGUqKWJ6c3RyZWFtLT5uZXh0X291dDsKLSAgICAgICAgaWYgKCB6aXAtPmxpbWl0ID09IHppcC0+Y3Vyc29yICkKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZXJyICE9IEJaX09LICkKLSAgICAgIHsKLSAgICAgICAgemlwLT5saW1pdCA9IHppcC0+Y3Vyc29yOwotICAgICAgICBlcnJvciAgICAgID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGZpbGwgb3V0cHV0IGJ1ZmZlcjsgYGNvdW50JyBtdXN0IGJlIDw9IEZUX0JaSVAyX0JVRkZFUl9TSVpFICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9iemlwMl9maWxlX3NraXBfb3V0cHV0KCBGVF9CWmlwMkZpbGUgIHppcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBjb3VudCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUxvbmcgIGRlbHRhOwotCi0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGRlbHRhID0gKEZUX1VMb25nKSggemlwLT5saW1pdCAtIHppcC0+Y3Vyc29yICk7Ci0gICAgICBpZiAoIGRlbHRhID49IGNvdW50ICkKLSAgICAgICAgZGVsdGEgPSBjb3VudDsKLQotICAgICAgemlwLT5jdXJzb3IgKz0gZGVsdGE7Ci0gICAgICB6aXAtPnBvcyAgICArPSBkZWx0YTsKLQotICAgICAgY291bnQgLT0gZGVsdGE7Ci0gICAgICBpZiAoIGNvdW50ID09IDAgKQotICAgICAgICBicmVhazsKLQotICAgICAgZXJyb3IgPSBmdF9iemlwMl9maWxlX2ZpbGxfb3V0cHV0KCB6aXAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VTG9uZwotICBmdF9iemlwMl9maWxlX2lvKCBGVF9CWmlwMkZpbGUgIHppcCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBwb3MsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIGNvdW50ICkKLSAgewotICAgIEZUX1VMb25nICByZXN1bHQgPSAwOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgLyogUmVzZXQgaW5mbGF0ZSBzdHJlYW0gaWYgd2UncmUgc2Vla2luZyBiYWNrd2FyZHMuICAgICAgICAqLwotICAgIC8qIFllcywgdGhhdCBpcyBub3QgdG9vIGVmZmljaWVudCwgYnV0IGl0IHNhdmVzIG1lbW9yeSA6LSkgKi8KLSAgICBpZiAoIHBvcyA8IHppcC0+cG9zICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGZ0X2J6aXAyX2ZpbGVfcmVzZXQoIHppcCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBza2lwIHVud2FudGVkIGJ5dGVzICovCi0gICAgaWYgKCBwb3MgPiB6aXAtPnBvcyApCi0gICAgewotICAgICAgZXJyb3IgPSBmdF9iemlwMl9maWxlX3NraXBfb3V0cHV0KCB6aXAsIChGVF9VTG9uZykoIHBvcyAtIHppcC0+cG9zICkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIG5vdyByZWFkIHRoZSBkYXRhICovCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgZGVsdGE7Ci0KLQotICAgICAgZGVsdGEgPSAoRlRfVUxvbmcpKCB6aXAtPmxpbWl0IC0gemlwLT5jdXJzb3IgKTsKLSAgICAgIGlmICggZGVsdGEgPj0gY291bnQgKQotICAgICAgICBkZWx0YSA9IGNvdW50OwotCi0gICAgICBGVF9NRU1fQ09QWSggYnVmZmVyLCB6aXAtPmN1cnNvciwgZGVsdGEgKTsKLSAgICAgIGJ1ZmZlciAgICAgICs9IGRlbHRhOwotICAgICAgcmVzdWx0ICAgICAgKz0gZGVsdGE7Ci0gICAgICB6aXAtPmN1cnNvciArPSBkZWx0YTsKLSAgICAgIHppcC0+cG9zICAgICs9IGRlbHRhOwotCi0gICAgICBjb3VudCAtPSBkZWx0YTsKLSAgICAgIGlmICggY291bnQgPT0gMCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBlcnJvciA9IGZ0X2J6aXAyX2ZpbGVfZmlsbF9vdXRwdXQoIHppcCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0vKioqKiogICAgICAgICAgICAgICBCIFogICBFIE0gQiBFIEQgRCBJIE4gRyAgIFMgVCBSIEUgQSBNICAgICAgICAgICAgICoqKioqLwotLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2J6aXAyX3N0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfQlppcDJGaWxlICB6aXAgICAgPSAoRlRfQlppcDJGaWxlKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgIGlmICggemlwICkKLSAgICB7Ci0gICAgICAvKiBmaW5hbGl6ZSBiemlwIGZpbGUgZGVzY3JpcHRvciAqLwotICAgICAgZnRfYnppcDJfZmlsZV9kb25lKCB6aXAgKTsKLQotICAgICAgRlRfRlJFRSggemlwICk7Ci0KLSAgICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB1bnNpZ25lZCBsb25nCi0gIGZ0X2J6aXAyX3N0cmVhbV9pbyggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIGNvdW50ICkKLSAgewotICAgIEZUX0JaaXAyRmlsZSAgemlwID0gKEZUX0JaaXAyRmlsZSlzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcjsKLQotCi0gICAgcmV0dXJuIGZ0X2J6aXAyX2ZpbGVfaW8oIHppcCwgb2Zmc2V0LCBidWZmZXIsIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5CemlwMiggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc291cmNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnk7Ci0gICAgRlRfQlppcDJGaWxlICB6aXAgPSBOVUxMOwotCi0KLSAgICBpZiAoICFzdHJlYW0gfHwgIXNvdXJjZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fSGFuZGxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgbWVtb3J5ID0gc291cmNlLT5tZW1vcnk7Ci0KLSAgICAvKgotICAgICAqICBjaGVjayB0aGUgaGVhZGVyIHJpZ2h0IG5vdzsgdGhpcyBwcmV2ZW50cyBhbGxvY2F0aW5nIHVubmVjZXNzYXJ5Ci0gICAgICogIG9iamVjdHMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0KLSAgICAgKi8KLSAgICBlcnJvciA9IGZ0X2J6aXAyX2NoZWNrX2hlYWRlciggc291cmNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9aRVJPKCBzdHJlYW0gKTsKLSAgICBzdHJlYW0tPm1lbW9yeSA9IG1lbW9yeTsKLQotICAgIGlmICggIUZUX1FORVcoIHppcCApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGZ0X2J6aXAyX2ZpbGVfaW5pdCggemlwLCBzdHJlYW0sIHNvdXJjZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZSRUUoIHppcCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gemlwOwotICAgIH0KLQotICAgIHN0cmVhbS0+c2l6ZSAgPSAweDdGRkZGRkZGTDsgIC8qIGRvbid0IGtub3cgdGhlIHJlYWwgc2l6ZSEgKi8KLSAgICBzdHJlYW0tPnBvcyAgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgID0gMDsKLSAgICBzdHJlYW0tPnJlYWQgID0gZnRfYnppcDJfc3RyZWFtX2lvOwotICAgIHN0cmVhbS0+Y2xvc2UgPSBmdF9iemlwMl9zdHJlYW1fY2xvc2U7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2Vsc2UgIC8qICFGVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMiAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5CemlwMiggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc291cmNlICkKLSAgewotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0gICAgRlRfVU5VU0VEKCBzb3VyY2UgKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gIH0KLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMiAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2J6aXAyL3J1bGVzLm1rIGIvc3JjL2J6aXAyL3J1bGVzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjNkZGM0Li4wMDAwMDAwCi0tLSBhL3NyYy9iemlwMi9ydWxlcy5taworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBCWklQMiBzdXBwb3J0IGNvbmZpZ3VyYXRpb24gcnVsZXMKLSMKLQotIyBDb3B5cmlnaHQgMjAxMC0yMDE3IGJ5Ci0jIEpvZWwgS2xpbmdoZWQuCi0jCi0jIGJhc2VkIG9uIGBzcmMvbHp3L3J1bGVzLm1rJwotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgQlpJUDIgZHJpdmVyIGRpcmVjdG9yeQotIwotQlpJUDJfRElSIDo9ICQoU1JDX0RJUikvYnppcDIKLQotCi0jIGNvbXBpbGF0aW9uIGZsYWdzIGZvciB0aGUgZHJpdmVyCi0jCi1CWklQMl9DT01QSUxFIDo9ICQoQ0MpICQoQU5TSUZMQUdTKSAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBCWklQMiBzdXBwb3J0IHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1CWklQMl9EUlZfU1JDIDo9ICQoQlpJUDJfRElSKS9mdGJ6aXAyLmMKLQotIyBCWklQMiBkcml2ZXIgb2JqZWN0KHMpCi0jCi0jICAgQlpJUDJfRFJWX09CSl9NIGlzIHVzZWQgZHVyaW5nIGBtdWx0aScgYnVpbGRzCi0jICAgQlpJUDJfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcwotIwotQlpJUDJfRFJWX09CSl9NIDo9ICQoT0JKX0RJUikvZnRiemlwMi4kTwotQlpJUDJfRFJWX09CSl9TIDo9ICQoT0JKX0RJUikvZnRiemlwMi4kTwotCi0jIEJaSVAyIHN1cHBvcnQgc291cmNlIGZpbGUgZm9yIHNpbmdsZSBidWlsZAotIwotQlpJUDJfRFJWX1NSQ19TIDo9ICQoQlpJUDJfRElSKS9mdGJ6aXAyLmMKLQotCi0jIEJaSVAyIHN1cHBvcnQgLSBzaW5nbGUgb2JqZWN0Ci0jCi0kKEJaSVAyX0RSVl9PQkpfUyk6ICQoQlpJUDJfRFJWX1NSQ19TKSAkKEJaSVAyX0RSVl9TUkMpICQoRlJFRVRZUEVfSCkgJChCWklQMl9EUlZfSCkKLQkkKEJaSVAyX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKEJaSVAyX0RSVl9TUkNfUykpCi0KLQotIyBCWklQMiBzdXBwb3J0IC0gbXVsdGlwbGUgb2JqZWN0cwotIwotJChPQkpfRElSKS8lLiRPOiAkKEJaSVAyX0RJUikvJS5jICQoRlJFRVRZUEVfSCkgJChCWklQMl9EUlZfSCkKLQkkKEJaSVAyX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkPCkKLQotCi0jIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKLSMKLURSVl9PQkpTX1MgKz0gJChCWklQMl9EUlZfT0JKX1MpCi1EUlZfT0JKU19NICs9ICQoQlpJUDJfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvSmFtZmlsZSBiL3NyYy9jYWNoZS9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODgwYWY4Li4wMDAwMDAwCi0tLSBhL3NyYy9jYWNoZS9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9jYWNoZSBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgY2FjaGUgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IGZ0Y2Jhc2ljCi0gICAgICAgICAgICAgICBmdGNjYWNoZQotICAgICAgICAgICAgICAgZnRjZ2x5cGgKLSAgICAgICAgICAgICAgIGZ0Y2ltYWdlCi0gICAgICAgICAgICAgICBmdGNtYW5hZwotICAgICAgICAgICAgICAgZnRjY21hcAotICAgICAgICAgICAgICAgZnRjbXJ1Ci0gICAgICAgICAgICAgICBmdGNzYml0cwotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gZnRjYWNoZSA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9jYWNoZSBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjYWNoZS5jIGIvc3JjL2NhY2hlL2Z0Y2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyNjE4OC4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjYWNoZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjYWNoZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBDYWNoaW5nIHN1Yi1zeXN0ZW0gKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAiZnRjYmFzaWMuYyIKLSNpbmNsdWRlICJmdGNjYWNoZS5jIgotI2luY2x1ZGUgImZ0Y2NtYXAuYyIKLSNpbmNsdWRlICJmdGNnbHlwaC5jIgotI2luY2x1ZGUgImZ0Y2ltYWdlLmMiCi0jaW5jbHVkZSAiZnRjbWFuYWcuYyIKLSNpbmNsdWRlICJmdGNtcnUuYyIKLSNpbmNsdWRlICJmdGNzYml0cy5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMgYi9zcmMvY2FjaGUvZnRjYmFzaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5YmQ1Yy4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjYmFzaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNiYXNpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGJhc2ljIGNhY2hlIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9DQUNIRV9ICi0jaW5jbHVkZSAiZnRjZ2x5cGguaCIKLSNpbmNsdWRlICJmdGNpbWFnZS5oIgotI2luY2x1ZGUgImZ0Y3NiaXRzLmgiCi0KLSNpbmNsdWRlICJmdGNjYmFjay5oIgotI2luY2x1ZGUgImZ0Y2Vycm9yLmgiCi0KLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jYWNoZQotCi0KLSAgLyoKLSAgICogIEJhc2ljIEZhbWlsaWVzCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRDX0Jhc2ljQXR0clJlY18KLSAgewotICAgIEZUQ19TY2FsZXJSZWMgIHNjYWxlcjsKLSAgICBGVF9VSW50ICAgICAgICBsb2FkX2ZsYWdzOwotCi0gIH0gRlRDX0Jhc2ljQXR0clJlYywgKkZUQ19CYXNpY0F0dHJzOwotCi0jZGVmaW5lIEZUQ19CQVNJQ19BVFRSX0NPTVBBUkUoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CT09MKCBGVENfU0NBTEVSX0NPTVBBUkUoICYoYSktPnNjYWxlciwgJihiKS0+c2NhbGVyICkgJiYgXAotICAgICAgICAgICAgICAgICAgIChhKS0+bG9hZF9mbGFncyA9PSAoYiktPmxvYWRfZmxhZ3MgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRlRDX0JBU0lDX0FUVFJfSEFTSCggYSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEZUQ19TQ0FMRVJfSEFTSCggJihhKS0+c2NhbGVyICkgKyAzMSAqIChhKS0+bG9hZF9mbGFncyApCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRDX0Jhc2ljUXVlcnlSZWNfCi0gIHsKLSAgICBGVENfR1F1ZXJ5UmVjICAgICBncXVlcnk7Ci0gICAgRlRDX0Jhc2ljQXR0clJlYyAgYXR0cnM7Ci0KLSAgfSBGVENfQmFzaWNRdWVyeVJlYywgKkZUQ19CYXNpY1F1ZXJ5OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19CYXNpY0ZhbWlseVJlY18KLSAgewotICAgIEZUQ19GYW1pbHlSZWMgICAgIGZhbWlseTsKLSAgICBGVENfQmFzaWNBdHRyUmVjICBhdHRyczsKLQotICB9IEZUQ19CYXNpY0ZhbWlseVJlYywgKkZUQ19CYXNpY0ZhbWlseTsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfQm9vbCApCi0gIGZ0Y19iYXNpY19mYW1pbHlfY29tcGFyZSggRlRDX01ydU5vZGUgIGZ0Y2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZnRjcXVlcnkgKQotICB7Ci0gICAgRlRDX0Jhc2ljRmFtaWx5ICBmYW1pbHkgPSAoRlRDX0Jhc2ljRmFtaWx5KWZ0Y2ZhbWlseTsKLSAgICBGVENfQmFzaWNRdWVyeSAgIHF1ZXJ5ICA9IChGVENfQmFzaWNRdWVyeSlmdGNxdWVyeTsKLQotCi0gICAgcmV0dXJuIEZUQ19CQVNJQ19BVFRSX0NPTVBBUkUoICZmYW1pbHktPmF0dHJzLCAmcXVlcnktPmF0dHJzICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdGNfYmFzaWNfZmFtaWx5X2luaXQoIEZUQ19NcnVOb2RlICBmdGNmYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGZ0Y3F1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBmdGNjYWNoZSApCi0gIHsKLSAgICBGVENfQmFzaWNGYW1pbHkgIGZhbWlseSA9IChGVENfQmFzaWNGYW1pbHkpZnRjZmFtaWx5OwotICAgIEZUQ19CYXNpY1F1ZXJ5ICAgcXVlcnkgID0gKEZUQ19CYXNpY1F1ZXJ5KWZ0Y3F1ZXJ5OwotICAgIEZUQ19DYWNoZSAgICAgICAgY2FjaGUgID0gKEZUQ19DYWNoZSlmdGNjYWNoZTsKLQotCi0gICAgRlRDX0ZhbWlseV9Jbml0KCBGVENfRkFNSUxZKCBmYW1pbHkgKSwgY2FjaGUgKTsKLSAgICBmYW1pbHktPmF0dHJzID0gcXVlcnktPmF0dHJzOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICBmdGNfYmFzaWNfZmFtaWx5X2dldF9jb3VudCggRlRDX0ZhbWlseSAgIGZ0Y2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICkKLSAgewotICAgIEZUQ19CYXNpY0ZhbWlseSAgZmFtaWx5ID0gKEZUQ19CYXNpY0ZhbWlseSlmdGNmYW1pbHk7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9GYWNlICAgICAgICAgIGZhY2U7Ci0gICAgRlRfVUludCAgICAgICAgICByZXN1bHQgPSAwOwotCi0KLSAgICBlcnJvciA9IEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UoIG1hbmFnZXIsIGZhbWlseS0+YXR0cnMuc2NhbGVyLmZhY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjZSApOwotCi0gICAgaWYgKCBlcnJvciB8fCAhZmFjZSApCi0gICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgaWYgKCAoRlRfVUxvbmcpZmFjZS0+bnVtX2dseXBocyA+IEZUX1VJTlRfTUFYIHx8IDAgPiBmYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgIEZUX1RSQUNFMSgoICJmdGNfYmFzaWNfZmFtaWx5X2dldF9jb3VudDoiCi0gICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoaXMgZmFjZSwgdHJ1bmNhdGVkXG4iLAotICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2dseXBocyApKTsKLQotICAgIGlmICggIWVycm9yICkKLSAgICAgIHJlc3VsdCA9IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHM7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgZnRjX2Jhc2ljX2ZhbWlseV9sb2FkX2JpdG1hcCggRlRDX0ZhbWlseSAgIGZ0Y2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApCi0gIHsKLSAgICBGVENfQmFzaWNGYW1pbHkgIGZhbWlseSA9IChGVENfQmFzaWNGYW1pbHkpZnRjZmFtaWx5OwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2l6ZSAgICAgICAgICBzaXplOwotCi0KLSAgICBlcnJvciA9IEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUoIG1hbmFnZXIsICZmYW1pbHktPmF0dHJzLnNjYWxlciwgJnNpemUgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfRmFjZSAgZmFjZSA9IHNpemUtPmZhY2U7Ci0KLQotICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKAotICAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgIChGVF9JbnQpZmFtaWx5LT5hdHRycy5sb2FkX2ZsYWdzIHwgRlRfTE9BRF9SRU5ERVIgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgKmFmYWNlID0gZmFjZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdGNfYmFzaWNfZmFtaWx5X2xvYWRfZ2x5cGgoIEZUQ19GYW1pbHkgIGZ0Y2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggICAqYWdseXBoICkKLSAgewotICAgIEZUQ19CYXNpY0ZhbWlseSAgZmFtaWx5ID0gKEZUQ19CYXNpY0ZhbWlseSlmdGNmYW1pbHk7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVENfU2NhbGVyICAgICAgIHNjYWxlciA9ICZmYW1pbHktPmF0dHJzLnNjYWxlcjsKLSAgICBGVF9GYWNlICAgICAgICAgIGZhY2U7Ci0gICAgRlRfU2l6ZSAgICAgICAgICBzaXplOwotCi0KLSAgICAvKiB3ZSB3aWxsIG5vdyBsb2FkIHRoZSBnbHlwaCBpbWFnZSAqLwotICAgIGVycm9yID0gRlRDX01hbmFnZXJfTG9va3VwU2l6ZSggY2FjaGUtPm1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBmYWNlID0gc2l6ZS0+ZmFjZTsKLQotICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpZmFtaWx5LT5hdHRycy5sb2FkX2ZsYWdzICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGlmICggZmFjZS0+Z2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICB8fAotICAgICAgICAgICAgIGZhY2UtPmdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogb2ssIGNvcHkgaXQgKi8KLSAgICAgICAgICBGVF9HbHlwaCAgZ2x5cGg7Ci0KLQotICAgICAgICAgIGVycm9yID0gRlRfR2V0X0dseXBoKCBmYWNlLT5nbHlwaCwgJmdseXBoICk7Ci0gICAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICphZ2x5cGggPSBnbHlwaDsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfQm9vbCApCi0gIGZ0Y19iYXNpY19nbm9kZV9jb21wYXJlX2ZhY2VpZCggRlRDX05vZGUgICAgZnRjZ25vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgZnRjZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgICBsaXN0X2NoYW5nZWQgKQotICB7Ci0gICAgRlRDX0dOb2RlICAgICAgICBnbm9kZSAgID0gKEZUQ19HTm9kZSlmdGNnbm9kZTsKLSAgICBGVENfRmFjZUlEICAgICAgIGZhY2VfaWQgPSAoRlRDX0ZhY2VJRClmdGNmYWNlX2lkOwotICAgIEZUQ19CYXNpY0ZhbWlseSAgZmFtaWx5ICA9IChGVENfQmFzaWNGYW1pbHkpZ25vZGUtPmZhbWlseTsKLSAgICBGVF9Cb29sICAgICAgICAgIHJlc3VsdDsKLQotCi0gICAgaWYgKCBsaXN0X2NoYW5nZWQgKQotICAgICAgKmxpc3RfY2hhbmdlZCA9IEZBTFNFOwotICAgIHJlc3VsdCA9IEZUX0JPT0woIGZhbWlseS0+YXR0cnMuc2NhbGVyLmZhY2VfaWQgPT0gZmFjZV9pZCApOwotICAgIGlmICggcmVzdWx0ICkKLSAgICB7Ci0gICAgICAvKiB3ZSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byBhdm9pZCB0aGlzIG5vZGUgZnJvbSBhcHBlYXJpbmcKLSAgICAgICAqIGluIGxhdGVyIGxvb2t1cHMgd2l0aCB0aGUgc2FtZSBmYWNlX2lkIQotICAgICAgICovCi0gICAgICBGVENfR05vZGVfVW5zZWxlY3RGYW1pbHkoIGdub2RlLCBjYWNoZSApOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotIC8qCi0gICoKLSAgKiBiYXNpYyBpbWFnZSBjYWNoZQotICAqCi0gICovCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUQ19JRmFtaWx5Q2xhc3NSZWMgIGZ0Y19iYXNpY19pbWFnZV9mYW1pbHlfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgc2l6ZW9mICggRlRDX0Jhc2ljRmFtaWx5UmVjICksCi0KLSAgICAgIGZ0Y19iYXNpY19mYW1pbHlfY29tcGFyZSwgLyogRlRDX01ydU5vZGVfQ29tcGFyZUZ1bmMgIG5vZGVfY29tcGFyZSAqLwotICAgICAgZnRjX2Jhc2ljX2ZhbWlseV9pbml0LCAgICAvKiBGVENfTXJ1Tm9kZV9Jbml0RnVuYyAgICAgbm9kZV9pbml0ICAgICovCi0gICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEZUQ19NcnVOb2RlX1Jlc2V0RnVuYyAgICBub2RlX3Jlc2V0ICAgKi8KLSAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgLyogRlRDX01ydU5vZGVfRG9uZUZ1bmMgICAgIG5vZGVfZG9uZSAgICAqLwotICAgIH0sCi0KLSAgICBmdGNfYmFzaWNfZmFtaWx5X2xvYWRfZ2x5cGggLyogRlRDX0lGYW1pbHlfTG9hZEdseXBoRnVuYyAgZmFtaWx5X2xvYWRfZ2x5cGggKi8KLSAgfTsKLQotCi0gIHN0YXRpYwotICBjb25zdCBGVENfR0NhY2hlQ2xhc3NSZWMgIGZ0Y19iYXNpY19pbWFnZV9jYWNoZV9jbGFzcyA9Ci0gIHsKLSAgICB7Ci0gICAgICBmdGNfaW5vZGVfbmV3LCAgICAgICAgICAgICAgICAgIC8qIEZUQ19Ob2RlX05ld0Z1bmMgICAgICBub2RlX25ldyAgICAgICAgICAgKi8KLSAgICAgIGZ0Y19pbm9kZV93ZWlnaHQsICAgICAgICAgICAgICAgLyogRlRDX05vZGVfV2VpZ2h0RnVuYyAgIG5vZGVfd2VpZ2h0ICAgICAgICAqLwotICAgICAgZnRjX2dub2RlX2NvbXBhcmUsICAgICAgICAgICAgICAvKiBGVENfTm9kZV9Db21wYXJlRnVuYyAgbm9kZV9jb21wYXJlICAgICAgICovCi0gICAgICBmdGNfYmFzaWNfZ25vZGVfY29tcGFyZV9mYWNlaWQsIC8qIEZUQ19Ob2RlX0NvbXBhcmVGdW5jICBub2RlX3JlbW92ZV9mYWNlaWQgKi8KLSAgICAgIGZ0Y19pbm9kZV9mcmVlLCAgICAgICAgICAgICAgICAgLyogRlRDX05vZGVfRnJlZUZ1bmMgICAgIG5vZGVfZnJlZSAgICAgICAgICAqLwotCi0gICAgICBzaXplb2YgKCBGVENfR0NhY2hlUmVjICksCi0gICAgICBmdGNfZ2NhY2hlX2luaXQsICAgICAgICAgICAgICAgIC8qIEZUQ19DYWNoZV9Jbml0RnVuYyAgICBjYWNoZV9pbml0ICAgICAgICAgKi8KLSAgICAgIGZ0Y19nY2FjaGVfZG9uZSAgICAgICAgICAgICAgICAgLyogRlRDX0NhY2hlX0RvbmVGdW5jICAgIGNhY2hlX2RvbmUgICAgICAgICAqLwotICAgIH0sCi0KLSAgICAoRlRDX01ydUxpc3RDbGFzcykmZnRjX2Jhc2ljX2ltYWdlX2ZhbWlseV9jbGFzcwotICB9OwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhY2hlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUQ19JbWFnZUNhY2hlX05ldyggRlRDX01hbmFnZXIgICAgICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUQ19JbWFnZUNhY2hlICAqYWNhY2hlICkKLSAgewotICAgIHJldHVybiBGVENfR0NhY2hlX05ldyggbWFuYWdlciwgJmZ0Y19iYXNpY19pbWFnZV9jYWNoZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVENfR0NhY2hlKilhY2FjaGUgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhY2hlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUQ19JbWFnZUNhY2hlX0xvb2t1cCggRlRDX0ltYWdlQ2FjaGUgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19JbWFnZVR5cGUgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICAgKmFnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICAqYW5vZGUgKQotICB7Ci0gICAgRlRDX0Jhc2ljUXVlcnlSZWMgIHF1ZXJ5OwotICAgIEZUQ19Ob2RlICAgICAgICAgICBub2RlID0gMDsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9PZmZzZXQgICAgICAgICAgaGFzaDsKLQotCi0gICAgLyogc29tZSBhcmd1bWVudCBjaGVja3MgYXJlIGRlbGF5ZWQgdG8gYEZUQ19DYWNoZV9Mb29rdXAnICovCi0gICAgaWYgKCAhYWdseXBoICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgKmFnbHlwaCA9IE5VTEw7Ci0gICAgaWYgKCBhbm9kZSApCi0gICAgICAqYW5vZGUgID0gTlVMTDsKLQotICAgIGlmICggKEZUX1VMb25nKSggdHlwZS0+ZmxhZ3MgLSBGVF9JTlRfTUlOICkgPiBGVF9VSU5UX01BWCApCi0gICAgICBGVF9UUkFDRTEoKCAiRlRDX0ltYWdlQ2FjaGVfTG9va3VwOiIKLSAgICAgICAgICAgICAgICAgICIgaGlnaGVyIGJpdHMgaW4gbG9hZF9mbGFncyAweCV4IGFyZSBkcm9wcGVkXG4iLAotICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKXR5cGUtPmZsYWdzICYgfigoRlRfVUxvbmcpRlRfVUlOVF9NQVgpICkpOwotCi0gICAgcXVlcnkuYXR0cnMuc2NhbGVyLmZhY2VfaWQgPSB0eXBlLT5mYWNlX2lkOwotICAgIHF1ZXJ5LmF0dHJzLnNjYWxlci53aWR0aCAgID0gdHlwZS0+d2lkdGg7Ci0gICAgcXVlcnkuYXR0cnMuc2NhbGVyLmhlaWdodCAgPSB0eXBlLT5oZWlnaHQ7Ci0gICAgcXVlcnkuYXR0cnMubG9hZF9mbGFncyAgICAgPSAoRlRfVUludCl0eXBlLT5mbGFnczsKLQotICAgIHF1ZXJ5LmF0dHJzLnNjYWxlci5waXhlbCA9IDE7Ci0gICAgcXVlcnkuYXR0cnMuc2NhbGVyLnhfcmVzID0gMDsgIC8qIG1ha2UgY29tcGlsZXJzIGhhcHB5ICovCi0gICAgcXVlcnkuYXR0cnMuc2NhbGVyLnlfcmVzID0gMDsKLQotICAgIGhhc2ggPSBGVENfQkFTSUNfQVRUUl9IQVNIKCAmcXVlcnkuYXR0cnMgKSArIGdpbmRleDsKLQotI2lmIDEgIC8qIGlubGluaW5nIGlzIGFib3V0IDUwJSBmYXN0ZXIhICovCi0gICAgRlRDX0dDQUNIRV9MT09LVVBfQ01QKCBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0Y19iYXNpY19mYW1pbHlfY29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19HTm9kZV9Db21wYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaCwgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICk7Ci0jZWxzZQotICAgIGVycm9yID0gRlRDX0dDYWNoZV9Mb29rdXAoIEZUQ19HQ0FDSEUoIGNhY2hlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaCwgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19HUVVFUlkoICZxdWVyeSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2RlICk7Ci0jZW5kaWYKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgKmFnbHlwaCA9IEZUQ19JTk9ERSggbm9kZSApLT5nbHlwaDsKLQotICAgICAgaWYgKCBhbm9kZSApCi0gICAgICB7Ci0gICAgICAgICphbm9kZSA9IG5vZGU7Ci0gICAgICAgIG5vZGUtPnJlZl9jb3VudCsrOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhY2hlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUQ19JbWFnZUNhY2hlX0xvb2t1cFNjYWxlciggRlRDX0ltYWdlQ2FjaGUgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TY2FsZXIgICAgICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgICAqYWdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgICphbm9kZSApCi0gIHsKLSAgICBGVENfQmFzaWNRdWVyeVJlYyAgcXVlcnk7Ci0gICAgRlRDX05vZGUgICAgICAgICAgIG5vZGUgPSAwOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIEZUX09mZnNldCAgICAgICAgICBoYXNoOwotCi0KLSAgICAvKiBzb21lIGFyZ3VtZW50IGNoZWNrcyBhcmUgZGVsYXllZCB0byBgRlRDX0NhY2hlX0xvb2t1cCcgKi8KLSAgICBpZiAoICFhZ2x5cGggfHwgIXNjYWxlciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgICphZ2x5cGggPSBOVUxMOwotICAgIGlmICggYW5vZGUgKQotICAgICAgKmFub2RlICA9IE5VTEw7Ci0KLSAgICAvKiBgRlRfTG9hZF9HbHlwaCcgYW5kIGBGVF9Mb2FkX0NoYXInIHRha2UgRlRfVUludCBmbGFncyAqLwotICAgIGlmICggbG9hZF9mbGFncyA+IEZUX1VJTlRfTUFYICkKLSAgICAgIEZUX1RSQUNFMSgoICJGVENfSW1hZ2VDYWNoZV9Mb29rdXBTY2FsZXI6IgotICAgICAgICAgICAgICAgICAgIiBoaWdoZXIgYml0cyBpbiBsb2FkX2ZsYWdzIDB4JXggYXJlIGRyb3BwZWRcbiIsCi0gICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzICYgfigoRlRfVUxvbmcpRlRfVUlOVF9NQVgpICkpOwotCi0gICAgcXVlcnkuYXR0cnMuc2NhbGVyICAgICA9IHNjYWxlclswXTsKLSAgICBxdWVyeS5hdHRycy5sb2FkX2ZsYWdzID0gKEZUX1VJbnQpbG9hZF9mbGFnczsKLQotICAgIGhhc2ggPSBGVENfQkFTSUNfQVRUUl9IQVNIKCAmcXVlcnkuYXR0cnMgKSArIGdpbmRleDsKLQotICAgIEZUQ19HQ0FDSEVfTE9PS1VQX0NNUCggY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmdGNfYmFzaWNfZmFtaWx5X2NvbXBhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfR05vZGVfQ29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gsIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWVyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICAqYWdseXBoID0gRlRDX0lOT0RFKCBub2RlICktPmdseXBoOwotCi0gICAgICBpZiAoIGFub2RlICkKLSAgICAgIHsKLSAgICAgICAgKmFub2RlID0gbm9kZTsKLSAgICAgICAgbm9kZS0+cmVmX2NvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKgotICAgKgotICAgKiBiYXNpYyBzbWFsbCBiaXRtYXAgY2FjaGUKLSAgICoKLSAgICovCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUQ19TRmFtaWx5Q2xhc3NSZWMgIGZ0Y19iYXNpY19zYml0X2ZhbWlseV9jbGFzcyA9Ci0gIHsKLSAgICB7Ci0gICAgICBzaXplb2YgKCBGVENfQmFzaWNGYW1pbHlSZWMgKSwKLSAgICAgIGZ0Y19iYXNpY19mYW1pbHlfY29tcGFyZSwgICAgIC8qIEZUQ19NcnVOb2RlX0NvbXBhcmVGdW5jICBub2RlX2NvbXBhcmUgKi8KLSAgICAgIGZ0Y19iYXNpY19mYW1pbHlfaW5pdCwgICAgICAgIC8qIEZUQ19NcnVOb2RlX0luaXRGdW5jICAgICBub2RlX2luaXQgICAgKi8KLSAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUQ19NcnVOb2RlX1Jlc2V0RnVuYyAgICBub2RlX3Jlc2V0ICAgKi8KLSAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUQ19NcnVOb2RlX0RvbmVGdW5jICAgICBub2RlX2RvbmUgICAgKi8KLSAgICB9LAotCi0gICAgZnRjX2Jhc2ljX2ZhbWlseV9nZXRfY291bnQsCi0gICAgZnRjX2Jhc2ljX2ZhbWlseV9sb2FkX2JpdG1hcAotICB9OwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUQ19HQ2FjaGVDbGFzc1JlYyAgZnRjX2Jhc2ljX3NiaXRfY2FjaGVfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgZnRjX3Nub2RlX25ldywgICAgICAgICAgICAgICAgICAvKiBGVENfTm9kZV9OZXdGdW5jICAgICAgbm9kZV9uZXcgICAgICAgICAgICovCi0gICAgICBmdGNfc25vZGVfd2VpZ2h0LCAgICAgICAgICAgICAgIC8qIEZUQ19Ob2RlX1dlaWdodEZ1bmMgICBub2RlX3dlaWdodCAgICAgICAgKi8KLSAgICAgIGZ0Y19zbm9kZV9jb21wYXJlLCAgICAgICAgICAgICAgLyogRlRDX05vZGVfQ29tcGFyZUZ1bmMgIG5vZGVfY29tcGFyZSAgICAgICAqLwotICAgICAgZnRjX2Jhc2ljX2dub2RlX2NvbXBhcmVfZmFjZWlkLCAvKiBGVENfTm9kZV9Db21wYXJlRnVuYyAgbm9kZV9yZW1vdmVfZmFjZWlkICovCi0gICAgICBmdGNfc25vZGVfZnJlZSwgICAgICAgICAgICAgICAgIC8qIEZUQ19Ob2RlX0ZyZWVGdW5jICAgICBub2RlX2ZyZWUgICAgICAgICAgKi8KLQotICAgICAgc2l6ZW9mICggRlRDX0dDYWNoZVJlYyApLAotICAgICAgZnRjX2djYWNoZV9pbml0LCAgICAgICAgICAgICAgICAvKiBGVENfQ2FjaGVfSW5pdEZ1bmMgICAgY2FjaGVfaW5pdCAgICAgICAgICovCi0gICAgICBmdGNfZ2NhY2hlX2RvbmUgICAgICAgICAgICAgICAgIC8qIEZUQ19DYWNoZV9Eb25lRnVuYyAgICBjYWNoZV9kb25lICAgICAgICAgKi8KLSAgICB9LAotCi0gICAgKEZUQ19NcnVMaXN0Q2xhc3MpJmZ0Y19iYXNpY19zYml0X2ZhbWlseV9jbGFzcwotICB9OwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhY2hlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUQ19TQml0Q2FjaGVfTmV3KCBGVENfTWFuYWdlciAgICAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUQ19TQml0Q2FjaGUgICphY2FjaGUgKQotICB7Ci0gICAgcmV0dXJuIEZUQ19HQ2FjaGVfTmV3KCBtYW5hZ2VyLCAmZnRjX2Jhc2ljX3NiaXRfY2FjaGVfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRDX0dDYWNoZSopYWNhY2hlICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWNoZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVENfU0JpdENhY2hlX0xvb2t1cCggRlRDX1NCaXRDYWNoZSAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfSW1hZ2VUeXBlICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NCaXQgICAgICAqYW5zYml0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAqYW5vZGUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIEZUQ19CYXNpY1F1ZXJ5UmVjICBxdWVyeTsKLSAgICBGVENfTm9kZSAgICAgICAgICAgbm9kZSA9IDA7IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICBGVF9PZmZzZXQgICAgICAgICAgaGFzaDsKLQotCi0gICAgaWYgKCBhbm9kZSApCi0gICAgICAqYW5vZGUgPSBOVUxMOwotCi0gICAgLyogb3RoZXIgYXJndW1lbnQgY2hlY2tzIGRlbGF5ZWQgdG8gYEZUQ19DYWNoZV9Mb29rdXAnICovCi0gICAgaWYgKCAhYW5zYml0ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgKmFuc2JpdCA9IE5VTEw7Ci0KLSAgICBpZiAoIChGVF9VTG9uZykoIHR5cGUtPmZsYWdzIC0gRlRfSU5UX01JTiApID4gRlRfVUlOVF9NQVggKQotICAgICAgRlRfVFJBQ0UxKCggIkZUQ19JbWFnZUNhY2hlX0xvb2t1cDoiCi0gICAgICAgICAgICAgICAgICAiIGhpZ2hlciBiaXRzIGluIGxvYWRfZmxhZ3MgMHgleCBhcmUgZHJvcHBlZFxuIiwKLSAgICAgICAgICAgICAgICAgIChGVF9VTG9uZyl0eXBlLT5mbGFncyAmIH4oKEZUX1VMb25nKUZUX1VJTlRfTUFYKSApKTsKLQotICAgIHF1ZXJ5LmF0dHJzLnNjYWxlci5mYWNlX2lkID0gdHlwZS0+ZmFjZV9pZDsKLSAgICBxdWVyeS5hdHRycy5zY2FsZXIud2lkdGggICA9IHR5cGUtPndpZHRoOwotICAgIHF1ZXJ5LmF0dHJzLnNjYWxlci5oZWlnaHQgID0gdHlwZS0+aGVpZ2h0OwotICAgIHF1ZXJ5LmF0dHJzLmxvYWRfZmxhZ3MgICAgID0gKEZUX1VJbnQpdHlwZS0+ZmxhZ3M7Ci0KLSAgICBxdWVyeS5hdHRycy5zY2FsZXIucGl4ZWwgPSAxOwotICAgIHF1ZXJ5LmF0dHJzLnNjYWxlci54X3JlcyA9IDA7ICAvKiBtYWtlIGNvbXBpbGVycyBoYXBweSAqLwotICAgIHF1ZXJ5LmF0dHJzLnNjYWxlci55X3JlcyA9IDA7Ci0KLSAgICAvKiBiZXdhcmUsIHRoZSBoYXNoIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBnbHlwaCByYW5nZXMhICovCi0gICAgaGFzaCA9IEZUQ19CQVNJQ19BVFRSX0hBU0goICZxdWVyeS5hdHRycyApICsKLSAgICAgICAgICAgZ2luZGV4IC8gRlRDX1NCSVRfSVRFTVNfUEVSX05PREU7Ci0KLSNpZiAxICAvKiBpbmxpbmluZyBpcyBhYm91dCA1MCUgZmFzdGVyISAqLwotICAgIEZUQ19HQ0FDSEVfTE9PS1VQX0NNUCggY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmdGNfYmFzaWNfZmFtaWx5X2NvbXBhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU05vZGVfQ29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gsIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWVyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciApOwotI2Vsc2UKLSAgICBlcnJvciA9IEZUQ19HQ2FjaGVfTG9va3VwKCBGVENfR0NBQ0hFKCBjYWNoZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19HUVVFUlkoICZxdWVyeSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2RlICk7Ci0jZW5kaWYKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgICphbnNiaXQgPSBGVENfU05PREUoIG5vZGUgKS0+c2JpdHMgKwotICAgICAgICAgICAgICAoIGdpbmRleCAtIEZUQ19HTk9ERSggbm9kZSApLT5naW5kZXggKTsKLQotICAgIGlmICggYW5vZGUgKQotICAgIHsKLSAgICAgICphbm9kZSA9IG5vZGU7Ci0gICAgICBub2RlLT5yZWZfY291bnQrKzsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWNoZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlciggRlRDX1NCaXRDYWNoZSAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NCaXQgICAgICAqYW5zYml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAqYW5vZGUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIEZUQ19CYXNpY1F1ZXJ5UmVjICBxdWVyeTsKLSAgICBGVENfTm9kZSAgICAgICAgICAgbm9kZSA9IDA7IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICBGVF9PZmZzZXQgICAgICAgICAgaGFzaDsKLQotCi0gICAgaWYgKCBhbm9kZSApCi0gICAgICAgICphbm9kZSA9IE5VTEw7Ci0KLSAgICAvKiBvdGhlciBhcmd1bWVudCBjaGVja3MgZGVsYXllZCB0byBgRlRDX0NhY2hlX0xvb2t1cCcgKi8KLSAgICBpZiAoICFhbnNiaXQgfHwgIXNjYWxlciApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgKmFuc2JpdCA9IE5VTEw7Ci0KLSAgICAvKiBgRlRfTG9hZF9HbHlwaCcgYW5kIGBGVF9Mb2FkX0NoYXInIHRha2UgRlRfVUludCBmbGFncyAqLwotICAgIGlmICggbG9hZF9mbGFncyA+IEZUX1VJTlRfTUFYICkKLSAgICAgIEZUX1RSQUNFMSgoICJGVENfSW1hZ2VDYWNoZV9Mb29rdXBTY2FsZXI6IgotICAgICAgICAgICAgICAgICAgIiBoaWdoZXIgYml0cyBpbiBsb2FkX2ZsYWdzIDB4JXggYXJlIGRyb3BwZWRcbiIsCi0gICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzICYgfigoRlRfVUxvbmcpRlRfVUlOVF9NQVgpICkpOwotCi0gICAgcXVlcnkuYXR0cnMuc2NhbGVyICAgICA9IHNjYWxlclswXTsKLSAgICBxdWVyeS5hdHRycy5sb2FkX2ZsYWdzID0gKEZUX1VJbnQpbG9hZF9mbGFnczsKLQotICAgIC8qIGJld2FyZSwgdGhlIGhhc2ggbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsIGdseXBoIHJhbmdlcyEgKi8KLSAgICBoYXNoID0gRlRDX0JBU0lDX0FUVFJfSEFTSCggJnF1ZXJ5LmF0dHJzICkgKwotICAgICAgICAgICAgIGdpbmRleCAvIEZUQ19TQklUX0lURU1TX1BFUl9OT0RFOwotCi0gICAgRlRDX0dDQUNIRV9MT09LVVBfQ01QKCBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0Y19iYXNpY19mYW1pbHlfY29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TTm9kZV9Db21wYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaCwgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAqYW5zYml0ID0gRlRDX1NOT0RFKCBub2RlICktPnNiaXRzICsKLSAgICAgICAgICAgICAgKCBnaW5kZXggLSBGVENfR05PREUoIG5vZGUgKS0+Z2luZGV4ICk7Ci0KLSAgICBpZiAoIGFub2RlICkKLSAgICB7Ci0gICAgICAqYW5vZGUgPSBub2RlOwotICAgICAgbm9kZS0+cmVmX2NvdW50Kys7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjY2FjaGUuYyBiL3NyYy9jYWNoZS9mdGNjYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2RjM2FiLi4wMDAwMDAwCi0tLSBhL3NyYy9jYWNoZS9mdGNjYWNoZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2NhY2hlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgaW50ZXJuYWwgY2FjaGUgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiZnRjbWFuYWcuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAiZnRjY2JhY2suaCIKLSNpbmNsdWRlICJmdGNlcnJvci5oIgotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NhY2hlCi0KLQotI2RlZmluZSBGVENfSEFTSF9NQVhfTE9BRCAgMgotI2RlZmluZSBGVENfSEFTSF9NSU5fTE9BRCAgMQotI2RlZmluZSBGVENfSEFTSF9TVUJfTE9BRCAgKCBGVENfSEFTSF9NQVhfTE9BRCAtIEZUQ19IQVNIX01JTl9MT0FEICkKLQotICAvKiB0aGlzIG9uZSBfbXVzdF8gYmUgYSBwb3dlciBvZiAyISAqLwotI2RlZmluZSBGVENfSEFTSF9JTklUSUFMX1NJWkUgIDgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICBDQUNIRSBOT0RFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGFkZCBhIG5ldyBub2RlIHRvIHRoZSBoZWFkIG9mIHRoZSBtYW5hZ2VyJ3MgY2lyY3VsYXIgTVJVIGxpc3QgKi8KLSAgc3RhdGljIHZvaWQKLSAgZnRjX25vZGVfbXJ1X2xpbmsoIEZUQ19Ob2RlICAgICBub2RlLAotICAgICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgIG1hbmFnZXIgKQotICB7Ci0gICAgdm9pZCAgKm5sID0gJm1hbmFnZXItPm5vZGVzX2xpc3Q7Ci0KLQotICAgIEZUQ19NcnVOb2RlX1ByZXBlbmQoIChGVENfTXJ1Tm9kZSopbmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKEZUQ19NcnVOb2RlKW5vZGUgKTsKLSAgICBtYW5hZ2VyLT5udW1fbm9kZXMrKzsKLSAgfQotCi0KLSAgLyogcmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBtYW5hZ2VyJ3MgTVJVIGxpc3QgKi8KLSAgc3RhdGljIHZvaWQKLSAgZnRjX25vZGVfbXJ1X3VubGluayggRlRDX05vZGUgICAgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICkKLSAgewotICAgIHZvaWQgICpubCA9ICZtYW5hZ2VyLT5ub2Rlc19saXN0OwotCi0KLSAgICBGVENfTXJ1Tm9kZV9SZW1vdmUoIChGVENfTXJ1Tm9kZSopbmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAoRlRDX01ydU5vZGUpbm9kZSApOwotICAgIG1hbmFnZXItPm51bV9ub2Rlcy0tOwotICB9Ci0KLQotI2lmbmRlZiBGVENfSU5MSU5FCi0KLSAgLyogbW92ZSBhIG5vZGUgdG8gdGhlIGhlYWQgb2YgdGhlIG1hbmFnZXIncyBNUlUgbGlzdCAqLwotICBzdGF0aWMgdm9pZAotICBmdGNfbm9kZV9tcnVfdXAoIEZUQ19Ob2RlICAgICBub2RlLAotICAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICkKLSAgewotICAgIEZUQ19NcnVOb2RlX1VwKCAoRlRDX01ydU5vZGUqKSZtYW5hZ2VyLT5ub2Rlc19saXN0LAotICAgICAgICAgICAgICAgICAgICAoRlRDX01ydU5vZGUpbm9kZSApOwotICB9Ci0KLQotICAvKiBnZXQgYSB0b3AgYnVja2V0IGZvciBzcGVjaWZpZWQgaGFzaCBmcm9tIGNhY2hlLAotICAgKiBib2R5IGZvciBGVENfTk9ERV9UT1BfRk9SX0hBU0goIGNhY2hlLCBoYXNoICkKLSAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRDX05vZGUqICkKLSAgZnRjX2dldF90b3Bfbm9kZV9mb3JfaGFzaCggRlRDX0NhY2hlICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBoYXNoICkKLSAgewotICAgIEZUQ19Ob2RlKiAgcG5vZGU7Ci0gICAgRlRfT2Zmc2V0ICBpZHg7Ci0KLQotICAgIGlkeCA9IGhhc2ggJiBjYWNoZS0+bWFzazsKLSAgICBpZiAoIGlkeCA8IGNhY2hlLT5wICkKLSAgICAgIGlkeCA9IGhhc2ggJiAoIDIgKiBjYWNoZS0+bWFzayArIDEgKTsKLSAgICBwbm9kZSA9IGNhY2hlLT5idWNrZXRzICsgaWR4OwotICAgIHJldHVybiBwbm9kZTsKLSAgfQotCi0jZW5kaWYgLyogIUZUQ19JTkxJTkUgKi8KLQotCi0gIC8qIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsLiAgSWYgd2UgY2Fubm90IHJlLXNpemUgdGhlCi0gICAqIGJ1Y2tldHMgYXJyYXkgYXBwcm9wcmlhdGVseSwgd2Ugc2ltcGx5IGRlZ3JhZGUgdGhlIGhhc2ggdGFibGUncwotICAgKiBwZXJmb3JtYW5jZSEKLSAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGZ0Y19jYWNoZV9yZXNpemUoIEZUQ19DYWNoZSAgY2FjaGUgKQotICB7Ci0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBGVENfTm9kZSAgbm9kZSwgKnBub2RlOwotICAgICAgRlRfVUZhc3QgIHAgICAgID0gY2FjaGUtPnA7Ci0gICAgICBGVF9VRmFzdCAgbWFzayAgPSBjYWNoZS0+bWFzazsKLSAgICAgIEZUX1VGYXN0ICBjb3VudCA9IG1hc2sgKyBwICsgMTsgICAgLyogbnVtYmVyIG9mIGJ1Y2tldHMgKi8KLQotCi0gICAgICAvKiBkbyB3ZSBuZWVkIHRvIHNocmluayB0aGUgYnVja2V0cyBhcnJheT8gKi8KLSAgICAgIGlmICggY2FjaGUtPnNsYWNrIDwgMCApCi0gICAgICB7Ci0gICAgICAgIEZUQ19Ob2RlICBuZXdfbGlzdCA9IE5VTEw7Ci0KLQotICAgICAgICAvKiB0cnkgdG8gZXhwYW5kIHRoZSBidWNrZXRzIGFycmF5IF9iZWZvcmVfIHNwbGl0dGluZwotICAgICAgICAgKiB0aGUgYnVja2V0IGxpc3RzCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIHAgPj0gbWFzayApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGNhY2hlLT5tZW1vcnk7Ci0gICAgICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLQotCi0gICAgICAgICAgLyogaWYgd2UgY2FuJ3QgZXhwYW5kIHRoZSBhcnJheSwgbGVhdmUgaW1tZWRpYXRlbHkgKi8KLSAgICAgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBjYWNoZS0+YnVja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIG1hc2sgKyAxICkgKiAyLCAoIG1hc2sgKyAxICkgKiA0ICkgKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzcGxpdCBhIHNpbmdsZSBidWNrZXQgKi8KLSAgICAgICAgcG5vZGUgPSBjYWNoZS0+YnVja2V0cyArIHA7Ci0KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIG5vZGUgPSAqcG5vZGU7Ci0gICAgICAgICAgaWYgKCAhbm9kZSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGlmICggbm9kZS0+aGFzaCAmICggbWFzayArIDEgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgKnBub2RlICAgICA9IG5vZGUtPmxpbms7Ci0gICAgICAgICAgICBub2RlLT5saW5rID0gbmV3X2xpc3Q7Ci0gICAgICAgICAgICBuZXdfbGlzdCAgID0gbm9kZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5vZGUgPSAmbm9kZS0+bGluazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhY2hlLT5idWNrZXRzW3AgKyBtYXNrICsgMV0gPSBuZXdfbGlzdDsKLQotICAgICAgICBjYWNoZS0+c2xhY2sgKz0gRlRDX0hBU0hfTUFYX0xPQUQ7Ci0KLSAgICAgICAgaWYgKCBwID49IG1hc2sgKQotICAgICAgICB7Ci0gICAgICAgICAgY2FjaGUtPm1hc2sgPSAyICogbWFzayArIDE7Ci0gICAgICAgICAgY2FjaGUtPnAgICAgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjYWNoZS0+cCA9IHAgKyAxOwotICAgICAgfQotCi0gICAgICAvKiBkbyB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgYnVja2V0cyBhcnJheT8gKi8KLSAgICAgIGVsc2UgaWYgKCBjYWNoZS0+c2xhY2sgPiAoRlRfTG9uZyljb3VudCAqIEZUQ19IQVNIX1NVQl9MT0FEICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUZhc3QgICBvbGRfaW5kZXggPSBwICsgbWFzazsKLSAgICAgICAgRlRDX05vZGUqICBwb2xkOwotCi0KLSAgICAgICAgaWYgKCBvbGRfaW5kZXggKyAxIDw9IEZUQ19IQVNIX0lOSVRJQUxfU0laRSApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCBwID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBjYWNoZS0+bWVtb3J5OwotICAgICAgICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgICAgICAgIC8qIGlmIHdlIGNhbid0IHNocmluayB0aGUgYXJyYXksIGxlYXZlIGltbWVkaWF0ZWx5ICovCi0gICAgICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggY2FjaGUtPmJ1Y2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBtYXNrICsgMSApICogMiwgbWFzayArIDEgKSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhY2hlLT5tYXNrID4+PSAxOwotICAgICAgICAgIHAgICAgICAgICAgICAgPSBjYWNoZS0+bWFzazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcC0tOwotCi0gICAgICAgIHBub2RlID0gY2FjaGUtPmJ1Y2tldHMgKyBwOwotICAgICAgICB3aGlsZSAoICpwbm9kZSApCi0gICAgICAgICAgcG5vZGUgPSAmKCpwbm9kZSktPmxpbms7Ci0KLSAgICAgICAgcG9sZCAgID0gY2FjaGUtPmJ1Y2tldHMgKyBvbGRfaW5kZXg7Ci0gICAgICAgICpwbm9kZSA9ICpwb2xkOwotICAgICAgICAqcG9sZCAgPSBOVUxMOwotCi0gICAgICAgIGNhY2hlLT5zbGFjayAtPSBGVENfSEFTSF9NQVhfTE9BRDsKLSAgICAgICAgY2FjaGUtPnAgICAgICA9IHA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG90aGVyd2lzZSwgdGhlIGhhc2ggdGFibGUgaXMgYmFsYW5jZWQgKi8KLSAgICAgIGVsc2UKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLQotICAvKiByZW1vdmUgYSBub2RlIGZyb20gaXRzIGNhY2hlJ3MgaGFzaCB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBmdGNfbm9kZV9oYXNoX3VubGluayggRlRDX05vZGUgICBub2RlMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgY2FjaGUgKQotICB7Ci0gICAgRlRDX05vZGUgICpwbm9kZSA9IEZUQ19OT0RFX1RPUF9GT1JfSEFTSCggY2FjaGUsIG5vZGUwLT5oYXNoICk7Ci0KLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgRlRDX05vZGUgIG5vZGUgPSAqcG5vZGU7Ci0KLQotICAgICAgaWYgKCAhbm9kZSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJmdGNfbm9kZV9oYXNoX3VubGluazogdW5rbm93biBub2RlXG4iICkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmICggbm9kZSA9PSBub2RlMCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBwbm9kZSA9ICYoKnBub2RlKS0+bGluazsKLSAgICB9Ci0KLSAgICAqcG5vZGUgICAgICA9IG5vZGUwLT5saW5rOwotICAgIG5vZGUwLT5saW5rID0gTlVMTDsKLQotICAgIGNhY2hlLT5zbGFjaysrOwotICAgIGZ0Y19jYWNoZV9yZXNpemUoIGNhY2hlICk7Ci0gIH0KLQotCi0gIC8qIGFkZCBhIG5vZGUgdG8gdGhlIGB0b3AnIG9mIGl0cyBjYWNoZSdzIGhhc2ggdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgZnRjX25vZGVfaGFzaF9saW5rKCBGVENfTm9kZSAgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApCi0gIHsKLSAgICBGVENfTm9kZSAgKnBub2RlID0gRlRDX05PREVfVE9QX0ZPUl9IQVNIKCBjYWNoZSwgbm9kZS0+aGFzaCApOwotCi0KLSAgICBub2RlLT5saW5rID0gKnBub2RlOwotICAgICpwbm9kZSAgICAgPSBub2RlOwotCi0gICAgY2FjaGUtPnNsYWNrLS07Ci0gICAgZnRjX2NhY2hlX3Jlc2l6ZSggY2FjaGUgKTsKLSAgfQotCi0KLSAgLyogcmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBjYWNoZSBtYW5hZ2VyICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGZ0Y19ub2RlX2Rlc3Ryb3koIEZUQ19Ob2RlICAgICBub2RlLAotICAgICAgICAgICAgICAgICAgICBGVENfTWFuYWdlciAgbWFuYWdlciApCi0gIHsKLSAgICBGVENfQ2FjaGUgIGNhY2hlOwotCi0KLSNpZmRlZiBGVF9ERUJVR19FUlJPUgotICAgIC8qIGZpbmQgbm9kZSdzIGNhY2hlICovCi0gICAgaWYgKCBub2RlLT5jYWNoZV9pbmRleCA+PSBtYW5hZ2VyLT5udW1fY2FjaGVzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTAoKCAiZnRjX25vZGVfZGVzdHJveTogaW52YWxpZCBub2RlIGhhbmRsZVxuIiApKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGNhY2hlID0gbWFuYWdlci0+Y2FjaGVzW25vZGUtPmNhY2hlX2luZGV4XTsKLQotI2lmZGVmIEZUX0RFQlVHX0VSUk9SCi0gICAgaWYgKCAhY2FjaGUgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMCgoICJmdGNfbm9kZV9kZXN0cm95OiBpbnZhbGlkIG5vZGUgaGFuZGxlXG4iICkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgbWFuYWdlci0+Y3VyX3dlaWdodCAtPSBjYWNoZS0+Y2xhenoubm9kZV93ZWlnaHQoIG5vZGUsIGNhY2hlICk7Ci0KLSAgICAvKiByZW1vdmUgbm9kZSBmcm9tIG1ydSBsaXN0ICovCi0gICAgZnRjX25vZGVfbXJ1X3VubGluayggbm9kZSwgbWFuYWdlciApOwotCi0gICAgLyogcmVtb3ZlIG5vZGUgZnJvbSBjYWNoZSdzIGhhc2ggdGFibGUgKi8KLSAgICBmdGNfbm9kZV9oYXNoX3VubGluayggbm9kZSwgY2FjaGUgKTsKLQotICAgIC8qIG5vdyBmaW5hbGl6ZSBpdCAqLwotICAgIGNhY2hlLT5jbGF6ei5ub2RlX2ZyZWUoIG5vZGUsIGNhY2hlICk7Ci0KLSNpZiAwCi0gICAgLyogY2hlY2ssIGp1c3QgaW4gY2FzZSBvZiBnZW5lcmFsIGNvcnJ1cHRpb24gOi0pICovCi0gICAgaWYgKCBtYW5hZ2VyLT5udW1fbm9kZXMgPT0gMCApCi0gICAgICBGVF9UUkFDRTAoKCAiZnRjX25vZGVfZGVzdHJveTogaW52YWxpZCBjYWNoZSBub2RlIGNvdW50ICglZClcbiIsCi0gICAgICAgICAgICAgICAgICBtYW5hZ2VyLT5udW1fbm9kZXMgKSk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBBQlNUUkFDVCBDQUNIRSBDTEFTUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgRlRDX0NhY2hlX0luaXQoIEZUQ19DYWNoZSAgY2FjaGUgKQotICB7Ci0gICAgcmV0dXJuIGZ0Y19jYWNoZV9pbml0KCBjYWNoZSApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgZnRjX2NhY2hlX2luaXQoIEZUQ19DYWNoZSAgY2FjaGUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBjYWNoZS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgIGNhY2hlLT5wICAgICA9IDA7Ci0gICAgY2FjaGUtPm1hc2sgID0gRlRDX0hBU0hfSU5JVElBTF9TSVpFIC0gMTsKLSAgICBjYWNoZS0+c2xhY2sgPSBGVENfSEFTSF9JTklUSUFMX1NJWkUgKiBGVENfSEFTSF9NQVhfTE9BRDsKLQotICAgICh2b2lkKUZUX05FV19BUlJBWSggY2FjaGUtPmJ1Y2tldHMsIEZUQ19IQVNIX0lOSVRJQUxfU0laRSAqIDIgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEZUQ19DYWNoZV9DbGVhciggRlRDX0NhY2hlICBjYWNoZSApCi0gIHsKLSAgICBpZiAoIGNhY2hlICYmIGNhY2hlLT5idWNrZXRzICkKLSAgICB7Ci0gICAgICBGVENfTWFuYWdlciAgbWFuYWdlciA9IGNhY2hlLT5tYW5hZ2VyOwotICAgICAgRlRfVUZhc3QgICAgIGk7Ci0gICAgICBGVF9VRmFzdCAgICAgY291bnQ7Ci0KLQotICAgICAgY291bnQgPSBjYWNoZS0+cCArIGNhY2hlLT5tYXNrICsgMTsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRDX05vZGUgICpwbm9kZSA9IGNhY2hlLT5idWNrZXRzICsgaSwgbmV4dCwgbm9kZSA9ICpwbm9kZTsKLQotCi0gICAgICAgIHdoaWxlICggbm9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICBuZXh0ICAgICAgICA9IG5vZGUtPmxpbms7Ci0gICAgICAgICAgbm9kZS0+bGluayAgPSBOVUxMOwotCi0gICAgICAgICAgLyogcmVtb3ZlIG5vZGUgZnJvbSBtcnUgbGlzdCAqLwotICAgICAgICAgIGZ0Y19ub2RlX21ydV91bmxpbmsoIG5vZGUsIG1hbmFnZXIgKTsKLQotICAgICAgICAgIC8qIG5vdyBmaW5hbGl6ZSBpdCAqLwotICAgICAgICAgIG1hbmFnZXItPmN1cl93ZWlnaHQgLT0gY2FjaGUtPmNsYXp6Lm5vZGVfd2VpZ2h0KCBub2RlLCBjYWNoZSApOwotCi0gICAgICAgICAgY2FjaGUtPmNsYXp6Lm5vZGVfZnJlZSggbm9kZSwgY2FjaGUgKTsKLSAgICAgICAgICBub2RlID0gbmV4dDsKLSAgICAgICAgfQotICAgICAgICBjYWNoZS0+YnVja2V0c1tpXSA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBmdGNfY2FjaGVfcmVzaXplKCBjYWNoZSApOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZnRjX2NhY2hlX2RvbmUoIEZUQ19DYWNoZSAgY2FjaGUgKQotICB7Ci0gICAgaWYgKCBjYWNoZS0+bWVtb3J5ICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGNhY2hlLT5tZW1vcnk7Ci0KLQotICAgICAgRlRDX0NhY2hlX0NsZWFyKCBjYWNoZSApOwotCi0gICAgICBGVF9GUkVFKCBjYWNoZS0+YnVja2V0cyApOwotICAgICAgY2FjaGUtPm1hc2sgID0gMDsKLSAgICAgIGNhY2hlLT5wICAgICA9IDA7Ci0gICAgICBjYWNoZS0+c2xhY2sgPSAwOwotCi0gICAgICBjYWNoZS0+bWVtb3J5ID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19DYWNoZV9Eb25lKCBGVENfQ2FjaGUgIGNhY2hlICkKLSAgewotICAgIGZ0Y19jYWNoZV9kb25lKCBjYWNoZSApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdGNfY2FjaGVfYWRkKCBGVENfQ2FjaGUgIGNhY2hlLAotICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIGhhc2gsCi0gICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgbm9kZSApCi0gIHsKLSAgICBub2RlLT5oYXNoICAgICAgICA9IGhhc2g7Ci0gICAgbm9kZS0+Y2FjaGVfaW5kZXggPSAoRlRfVUludDE2KWNhY2hlLT5pbmRleDsKLSAgICBub2RlLT5yZWZfY291bnQgICA9IDA7Ci0KLSAgICBmdGNfbm9kZV9oYXNoX2xpbmsoIG5vZGUsIGNhY2hlICk7Ci0gICAgZnRjX25vZGVfbXJ1X2xpbmsoIG5vZGUsIGNhY2hlLT5tYW5hZ2VyICk7Ci0KLSAgICB7Ci0gICAgICBGVENfTWFuYWdlciAgbWFuYWdlciA9IGNhY2hlLT5tYW5hZ2VyOwotCi0KLSAgICAgIG1hbmFnZXItPmN1cl93ZWlnaHQgKz0gY2FjaGUtPmNsYXp6Lm5vZGVfd2VpZ2h0KCBub2RlLCBjYWNoZSApOwotCi0gICAgICBpZiAoIG1hbmFnZXItPmN1cl93ZWlnaHQgPj0gbWFuYWdlci0+bWF4X3dlaWdodCApCi0gICAgICB7Ci0gICAgICAgIG5vZGUtPnJlZl9jb3VudCsrOwotICAgICAgICBGVENfTWFuYWdlcl9Db21wcmVzcyggbWFuYWdlciApOwotICAgICAgICBub2RlLT5yZWZfY291bnQtLTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBGVENfQ2FjaGVfTmV3Tm9kZSggRlRDX0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgICBoYXNoLAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICphbm9kZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgRlRDX05vZGUgIG5vZGU7Ci0KLQotICAgIC8qCi0gICAgICogV2UgdXNlIHRoZSBGVENfQ0FDSEVfVFJZTE9PUCBtYWNyb3MgdG8gc3VwcG9ydCBvdXQtb2YtbWVtb3J5Ci0gICAgICogZXJyb3JzIChPT00pIGNvcnJlY3RseSwgaS5lLiwgYnkgZmx1c2hpbmcgdGhlIGNhY2hlIHByb2dyZXNzaXZlbHkKLSAgICAgKiBpbiBvcmRlciB0byBtYWtlIG1vcmUgcm9vbS4KLSAgICAgKi8KLQotICAgIEZUQ19DQUNIRV9UUllMT09QKCBjYWNoZSApCi0gICAgewotICAgICAgZXJyb3IgPSBjYWNoZS0+Y2xhenoubm9kZV9uZXcoICZub2RlLCBxdWVyeSwgY2FjaGUgKTsKLSAgICB9Ci0gICAgRlRDX0NBQ0hFX1RSWUxPT1BfRU5EKCBOVUxMICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIG5vZGUgPSBOVUxMOwotICAgIGVsc2UKLSAgICB7Ci0gICAgIC8qIGRvbid0IGFzc3VtZSB0aGF0IHRoZSBjYWNoZSBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGJ1Y2tldHMsIHNpbmNlCi0gICAgICAqIG91ciBhbGxvY2F0aW9uIHJlcXVlc3QgbWlnaHQgaGF2ZSB0cmlnZ2VyZWQgZ2xvYmFsIGNhY2hlIGZsdXNoaW5nCi0gICAgICAqLwotICAgICAgZnRjX2NhY2hlX2FkZCggY2FjaGUsIGhhc2gsIG5vZGUgKTsKLSAgICB9Ci0KLSAgICAqYW5vZGUgPSBub2RlOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNpZm5kZWYgRlRDX0lOTElORQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBGVENfQ2FjaGVfTG9va3VwKCBGVENfQ2FjaGUgICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgKmFub2RlICkKLSAgewotICAgIEZUQ19Ob2RlKiAgYnVja2V0OwotICAgIEZUQ19Ob2RlKiAgcG5vZGU7Ci0gICAgRlRDX05vZGUgICBub2RlOwotICAgIEZUX0Vycm9yICAgZXJyb3IgICAgICAgID0gRlRfRXJyX09rOwotICAgIEZUX0Jvb2wgICAgbGlzdF9jaGFuZ2VkID0gRkFMU0U7Ci0KLSAgICBGVENfTm9kZV9Db21wYXJlRnVuYyAgY29tcGFyZSA9IGNhY2hlLT5jbGF6ei5ub2RlX2NvbXBhcmU7Ci0KLQotICAgIGlmICggIWNhY2hlIHx8ICFhbm9kZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIC8qIEdvIHRvIHRoZSBgdG9wJyBub2RlIG9mIHRoZSBsaXN0IHNoYXJpbmcgc2FtZSBtYXNrZWQgaGFzaCAqLwotICAgIGJ1Y2tldCA9IHBub2RlID0gRlRDX05PREVfVE9QX0ZPUl9IQVNIKCBjYWNoZSwgaGFzaCApOwotCi0gICAgLyogTG9va3VwIGEgbm9kZSB3aXRoIGV4YWN0bHkgc2FtZSBoYXNoIGFuZCBxdWVyaWVkIHByb3BlcnRpZXMuICAqLwotICAgIC8qIE5PVEU6IF9ub2Rjb21wKCkgbWF5IGNoYW5nZSB0aGUgbGlua2VkIGxpc3QgdG8gcmVkdWNlIG1lbW9yeS4gKi8KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIG5vZGUgPSAqcG5vZGU7Ci0gICAgICBpZiAoICFub2RlICkKLSAgICAgICAgZ290byBOZXdOb2RlOwotCi0gICAgICBpZiAoIG5vZGUtPmhhc2ggPT0gaGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGNvbXBhcmUoIG5vZGUsIHF1ZXJ5LCBjYWNoZSwgJmxpc3RfY2hhbmdlZCApICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHBub2RlID0gJm5vZGUtPmxpbms7Ci0gICAgfQotCi0gICAgaWYgKCBsaXN0X2NoYW5nZWQgKQotICAgIHsKLSAgICAgIC8qIFVwZGF0ZSBidWNrZXQgYnkgbW9kaWZpZWQgbGlua2VkIGxpc3QgKi8KLSAgICAgIGJ1Y2tldCA9IHBub2RlID0gRlRDX05PREVfVE9QX0ZPUl9IQVNIKCBjYWNoZSwgaGFzaCApOwotCi0gICAgICAvKiBVcGRhdGUgcG5vZGUgYnkgbW9kaWZpZWQgbGlua2VkIGxpc3QgKi8KLSAgICAgIHdoaWxlICggKnBub2RlICE9IG5vZGUgKQotICAgICAgewotICAgICAgICBpZiAoICEqcG5vZGUgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiRlRDX0NhY2hlX0xvb2t1cDogb29wcyEhISAgbm9kZSBtaXNzaW5nXG4iICkpOwotICAgICAgICAgIGdvdG8gTmV3Tm9kZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcG5vZGUgPSAmKCgqcG5vZGUpLT5saW5rKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZW9yZGVyIHRoZSBsaXN0IHRvIG1vdmUgdGhlIGZvdW5kIG5vZGUgdG8gdGhlIGB0b3AnICovCi0gICAgaWYgKCBub2RlICE9ICpidWNrZXQgKQotICAgIHsKLSAgICAgICpwbm9kZSAgICAgPSBub2RlLT5saW5rOwotICAgICAgbm9kZS0+bGluayA9ICpidWNrZXQ7Ci0gICAgICAqYnVja2V0ICAgID0gbm9kZTsKLSAgICB9Ci0KLSAgICAvKiBtb3ZlIHRvIGhlYWQgb2YgTVJVIGxpc3QgKi8KLSAgICB7Ci0gICAgICBGVENfTWFuYWdlciAgbWFuYWdlciA9IGNhY2hlLT5tYW5hZ2VyOwotCi0KLSAgICAgIGlmICggbm9kZSAhPSBtYW5hZ2VyLT5ub2Rlc19saXN0ICkKLSAgICAgICAgZnRjX25vZGVfbXJ1X3VwKCBub2RlLCBtYW5hZ2VyICk7Ci0gICAgfQotICAgICphbm9kZSA9IG5vZGU7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgTmV3Tm9kZToKLSAgICByZXR1cm4gRlRDX0NhY2hlX05ld05vZGUoIGNhY2hlLCBoYXNoLCBxdWVyeSwgYW5vZGUgKTsKLSAgfQotCi0jZW5kaWYgLyogIUZUQ19JTkxJTkUgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19DYWNoZV9SZW1vdmVGYWNlSUQoIEZUQ19DYWNoZSAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfRmFjZUlEICBmYWNlX2lkICkKLSAgewotICAgIEZUX1VGYXN0ICAgICBpLCBjb3VudDsKLSAgICBGVENfTWFuYWdlciAgbWFuYWdlciA9IGNhY2hlLT5tYW5hZ2VyOwotICAgIEZUQ19Ob2RlICAgICBmcmVlcyAgID0gTlVMTDsKLQotCi0gICAgY291bnQgPSBjYWNoZS0+cCArIGNhY2hlLT5tYXNrICsgMTsKLSAgICBmb3IgKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIEZUQ19Ob2RlKiAgYnVja2V0ID0gY2FjaGUtPmJ1Y2tldHMgKyBpOwotICAgICAgRlRDX05vZGUqICBwbm9kZSAgPSBidWNrZXQ7Ci0KLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgRlRDX05vZGUgIG5vZGUgPSAqcG5vZGU7Ci0gICAgICAgIEZUX0Jvb2wgICBsaXN0X2NoYW5nZWQgPSBGQUxTRTsKLQotCi0gICAgICAgIGlmICggIW5vZGUgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggY2FjaGUtPmNsYXp6Lm5vZGVfcmVtb3ZlX2ZhY2VpZCggbm9kZSwgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSwgJmxpc3RfY2hhbmdlZCApICkKLSAgICAgICAgewotICAgICAgICAgICpwbm9kZSAgICAgPSBub2RlLT5saW5rOwotICAgICAgICAgIG5vZGUtPmxpbmsgPSBmcmVlczsKLSAgICAgICAgICBmcmVlcyAgICAgID0gbm9kZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcG5vZGUgPSAmbm9kZS0+bGluazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZW1vdmUgYWxsIG5vZGVzIGluIHRoZSBmcmVlIGxpc3QgKi8KLSAgICB3aGlsZSAoIGZyZWVzICkKLSAgICB7Ci0gICAgICBGVENfTm9kZSAgbm9kZTsKLQotCi0gICAgICBub2RlICA9IGZyZWVzOwotICAgICAgZnJlZXMgPSBub2RlLT5saW5rOwotCi0gICAgICBtYW5hZ2VyLT5jdXJfd2VpZ2h0IC09IGNhY2hlLT5jbGF6ei5ub2RlX3dlaWdodCggbm9kZSwgY2FjaGUgKTsKLSAgICAgIGZ0Y19ub2RlX21ydV91bmxpbmsoIG5vZGUsIG1hbmFnZXIgKTsKLQotICAgICAgY2FjaGUtPmNsYXp6Lm5vZGVfZnJlZSggbm9kZSwgY2FjaGUgKTsKLQotICAgICAgY2FjaGUtPnNsYWNrKys7Ci0gICAgfQotCi0gICAgZnRjX2NhY2hlX3Jlc2l6ZSggY2FjaGUgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2NhY2hlLmggYi9zcmMvY2FjaGUvZnRjY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjMTFjZS4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNjYWNoZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgaW50ZXJuYWwgY2FjaGUgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRDQ0FDSEVfSF8KLSNkZWZpbmUgRlRDQ0FDSEVfSF8KLQotCi0jaW5jbHVkZSAiZnRjbXJ1LmgiCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jZGVmaW5lIEZUQ19GQUNFX0lEX0hBU0goIGkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAoICggKEZUX09mZnNldCkoaSkgPj4gMyApIF4gKCAoRlRfT2Zmc2V0KShpKSA8PCA3ICkgKQotCi0gIC8qIGhhbmRsZSB0byBjYWNoZSBvYmplY3QgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX0NhY2hlUmVjXyogIEZUQ19DYWNoZTsKLQotICAvKiBoYW5kbGUgdG8gY2FjaGUgY2xhc3MgKi8KLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgRlRDX0NhY2hlQ2xhc3NSZWNfKiAgRlRDX0NhY2hlQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgQ0FDSEUgTk9ERSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggY2FjaGUgY29udHJvbHMgb25lIG9yIG1vcmUgY2FjaGUgbm9kZXMuICBFYWNoIG5vZGUgaXMgcGFydCBvZiAgICAqLwotICAvKiB0aGUgZ2xvYmFsX2xydSBsaXN0IG9mIHRoZSBtYW5hZ2VyLiAgSXRzIGBkYXRhJyBmaWVsZCBob3dldmVyIGlzIHVzZWQgKi8KLSAgLyogYXMgYSByZWZlcmVuY2UgY291bnQgZm9yIG5vdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIG5vZGUgY2FuIGJlIGFueXRoaW5nLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgaW5mb3JtYXRpb24gaGVsZCBieSAgKi8KLSAgLyogdGhlIGNhY2hlLiAgSXQgY2FuIGJlIGFuIGluZGl2aWR1YWwgZ2x5cGggaW1hZ2UsIGEgc2V0IG9mIGJpdG1hcHMgICAgICovCi0gIC8qIGdseXBocyBmb3IgYSBnaXZlbiBzaXplLCBzb21lIG1ldHJpY3MsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogc3RydWN0dXJlIHNpemUgc2hvdWxkIGJlIDIwIGJ5dGVzIG9uIDMyLWJpdHMgbWFjaGluZXMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19Ob2RlUmVjXwotICB7Ci0gICAgRlRDX01ydU5vZGVSZWMgIG1ydTsgICAgICAgICAgLyogY2lyY3VsYXIgbXJ1IGxpc3QgcG9pbnRlciAgICAgICAgICAgKi8KLSAgICBGVENfTm9kZSAgICAgICAgbGluazsgICAgICAgICAvKiB1c2VkIGZvciBoYXNoaW5nICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX09mZnNldCAgICAgICBoYXNoOyAgICAgICAgIC8qIHVzZWQgZm9yIGhhc2hpbmcgdG9vICAgICAgICAgICAgICAgICovCi0gICAgRlRfVVNob3J0ICAgICAgIGNhY2hlX2luZGV4OyAgLyogaW5kZXggb2YgY2FjaGUgdGhlIG5vZGUgYmVsb25ncyB0byAgKi8KLSAgICBGVF9TaG9ydCAgICAgICAgcmVmX2NvdW50OyAgICAvKiByZWZlcmVuY2UgY291bnQgZm9yIHRoaXMgbm9kZSAgICAgICAqLwotCi0gIH0gRlRDX05vZGVSZWM7Ci0KLQotI2RlZmluZSBGVENfTk9ERSggeCApICAgICggKEZUQ19Ob2RlKSh4KSApCi0jZGVmaW5lIEZUQ19OT0RFX1AoIHggKSAgKCAoRlRDX05vZGUqKSh4KSApCi0KLSNkZWZpbmUgRlRDX05PREVfTkVYVCggeCApICBGVENfTk9ERSggKHgpLT5tcnUubmV4dCApCi0jZGVmaW5lIEZUQ19OT0RFX1BSRVYoIHggKSAgRlRDX05PREUoICh4KS0+bXJ1LnByZXYgKQotCi0jaWZkZWYgRlRDX0lOTElORQotI2RlZmluZSBGVENfTk9ERV9UT1BfRk9SX0hBU0goIGNhY2hlLCBoYXNoICkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoICggY2FjaGUgKS0+YnVja2V0cyArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKCAoICggKCBoYXNoICkgJiAgICggY2FjaGUgKS0+bWFzayApIDwgKCBjYWNoZSApLT5wICkgXAotICAgICAgICAgICAgICA/ICggKCBoYXNoICkgJiAoICggY2FjaGUgKS0+bWFzayAqIDIgKyAxICkgKSAgICAgICAgXAotICAgICAgICAgICAgICA6ICggKCBoYXNoICkgJiAgICggY2FjaGUgKS0+bWFzayApICkgKQotI2Vsc2UKLSAgRlRfTE9DQUwoIEZUQ19Ob2RlKiApCi0gIGZ0Y19nZXRfdG9wX25vZGVfZm9yX2hhc2goIEZUQ19DYWNoZSAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCAgaGFzaCApOwotI2RlZmluZSBGVENfTk9ERV9UT1BfRk9SX0hBU0goIGNhY2hlLCBoYXNoICkgICAgICAgICAgICAgXAotICAgICAgICBmdGNfZ2V0X3RvcF9ub2RlX2Zvcl9oYXNoKCAoIGNhY2hlICksICggaGFzaCApICkKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogaW5pdGlhbGl6ZSBhIG5ldyBjYWNoZSBub2RlICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVENfTm9kZV9OZXdGdW5jKSggRlRDX05vZGUgICAgKnBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgICBjYWNoZSApOwotCi0gIHR5cGVkZWYgRlRfT2Zmc2V0Ci0gICgqRlRDX05vZGVfV2VpZ2h0RnVuYykoIEZUQ19Ob2RlICAgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApOwotCi0gIC8qIGNvbXBhcmUgYSBub2RlIHRvIGEgZ2l2ZW4ga2V5IHBhaXIgKi8KLSAgdHlwZWRlZiBGVF9Cb29sCi0gICgqRlRDX05vZGVfQ29tcGFyZUZ1bmMpKCBGVENfTm9kZSAgICBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgICBsaXN0X2NoYW5nZWQgKTsKLQotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUQ19Ob2RlX0ZyZWVGdW5jKSggRlRDX05vZGUgICBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVENfQ2FjaGVfSW5pdEZ1bmMpKCBGVENfQ2FjaGUgIGNhY2hlICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRDX0NhY2hlX0RvbmVGdW5jKSggRlRDX0NhY2hlICBjYWNoZSApOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19DYWNoZUNsYXNzUmVjXwotICB7Ci0gICAgRlRDX05vZGVfTmV3RnVuYyAgICAgIG5vZGVfbmV3OwotICAgIEZUQ19Ob2RlX1dlaWdodEZ1bmMgICBub2RlX3dlaWdodDsKLSAgICBGVENfTm9kZV9Db21wYXJlRnVuYyAgbm9kZV9jb21wYXJlOwotICAgIEZUQ19Ob2RlX0NvbXBhcmVGdW5jICBub2RlX3JlbW92ZV9mYWNlaWQ7Ci0gICAgRlRDX05vZGVfRnJlZUZ1bmMgICAgIG5vZGVfZnJlZTsKLQotICAgIEZUX09mZnNldCAgICAgICAgICAgICBjYWNoZV9zaXplOwotICAgIEZUQ19DYWNoZV9Jbml0RnVuYyAgICBjYWNoZV9pbml0OwotICAgIEZUQ19DYWNoZV9Eb25lRnVuYyAgICBjYWNoZV9kb25lOwotCi0gIH0gRlRDX0NhY2hlQ2xhc3NSZWM7Ci0KLQotICAvKiBlYWNoIGNhY2hlIHJlYWxseSBpbXBsZW1lbnRzIGEgZHluYW1pYyBoYXNoIHRhYmxlIHRvIG1hbmFnZSBpdHMgbm9kZXMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19DYWNoZVJlY18KLSAgewotICAgIEZUX1VGYXN0ICAgICAgICAgICBwOwotICAgIEZUX1VGYXN0ICAgICAgICAgICBtYXNrOwotICAgIEZUX0xvbmcgICAgICAgICAgICBzbGFjazsKLSAgICBGVENfTm9kZSogICAgICAgICAgYnVja2V0czsKLQotICAgIEZUQ19DYWNoZUNsYXNzUmVjICBjbGF6ejsgICAgICAgLyogbG9jYWwgY29weSwgZm9yIHNwZWVkICAqLwotCi0gICAgRlRDX01hbmFnZXIgICAgICAgIG1hbmFnZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgaW5kZXg7ICAgICAgIC8qIGluIG1hbmFnZXIncyB0YWJsZSAgICAgKi8KLQotICAgIEZUQ19DYWNoZUNsYXNzICAgICBvcmdfY2xhc3M7ICAgLyogb3JpZ2luYWwgY2xhc3MgcG9pbnRlciAqLwotCi0gIH0gRlRDX0NhY2hlUmVjOwotCi0KLSNkZWZpbmUgRlRDX0NBQ0hFKCB4ICkgICAgKCAoRlRDX0NhY2hlKSh4KSApCi0jZGVmaW5lIEZUQ19DQUNIRV9QKCB4ICkgICggKEZUQ19DYWNoZSopKHgpICkKLQotCi0gIC8qIGRlZmF1bHQgY2FjaGUgaW5pdGlhbGl6ZSAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBGVENfQ2FjaGVfSW5pdCggRlRDX0NhY2hlICBjYWNoZSApOwotCi0gIC8qIGRlZmF1bHQgY2FjaGUgZmluYWxpemVyICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX0NhY2hlX0RvbmUoIEZUQ19DYWNoZSAgY2FjaGUgKTsKLQotICAvKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gbG9vayB1cCB0aGUgY2FjaGUuICBJZiBubyBjb3JyZXNwb25kaW5nCi0gICAqIG5vZGUgaXMgZm91bmQsIGEgbmV3IG9uZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuICBUaGlzIGZ1bmN0aW9uCi0gICAqIGlzIGNhcGFibGUgb2YgZmx1c2hpbmcgdGhlIGNhY2hlIGFkZXF1YXRlbHkgdG8gbWFrZSByb29tIGZvciB0aGUKLSAgICogbmV3IGNhY2hlIG9iamVjdC4KLSAgICovCi0KLSNpZm5kZWYgRlRDX0lOTElORQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBGVENfQ2FjaGVfTG9va3VwKCBGVENfQ2FjaGUgICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgKmFub2RlICk7Ci0jZW5kaWYKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBGVENfQ2FjaGVfTmV3Tm9kZSggRlRDX0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgICBoYXNoLAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICphbm9kZSApOwotCi0gIC8qIFJlbW92ZSBhbGwgbm9kZXMgdGhhdCByZWxhdGUgdG8gYSBnaXZlbiBmYWNlX2lkLiAgVGhpcyBpcyB1c2VmdWwKLSAgICogd2hlbiB1bi1pbnN0YWxsaW5nIGZvbnRzLiAgTm90ZSB0aGF0IGlmIGEgY2FjaGUgbm9kZSByZWxhdGVzIHRvCi0gICAqIHRoZSBmYWNlX2lkIGJ1dCBpcyBsb2NrZWQgKGkuZS4sIGhhcyBgcmVmX2NvdW50ID4gMCcpLCB0aGUgbm9kZQotICAgKiB3aWxsIF9ub3RfIGJlIGRlc3Ryb3llZCwgYnV0IGl0cyBpbnRlcm5hbCBmYWNlX2lkIHJlZmVyZW5jZSB3aWxsCi0gICAqIGJlIG1vZGlmaWVkLgotICAgKgotICAgKiBUaGUgZmluYWwgcmVzdWx0IHdpbGwgYmUgdGhhdCB0aGUgbm9kZSB3aWxsIG5ldmVyIGNvbWUgYmFjawotICAgKiBpbiBmdXJ0aGVyIGxvb2t1cCByZXF1ZXN0cywgYW5kIHdpbGwgYmUgZmx1c2hlZCBvbiBkZW1hbmQgZnJvbQotICAgKiB0aGUgY2FjaGUgbm9ybWFsbHkgd2hlbiBpdHMgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgMC4KLSAgICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX0NhY2hlX1JlbW92ZUZhY2VJRCggRlRDX0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlSUQgIGZhY2VfaWQgKTsKLQotCi0jaWZkZWYgRlRDX0lOTElORQotCi0jZGVmaW5lIEZUQ19DQUNIRV9MT09LVVBfQ01QKCBjYWNoZSwgbm9kZWNtcCwgaGFzaCwgcXVlcnksIG5vZGUsIGVycm9yICkgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVENfTm9kZSAgICAgICAgICAgICAqX2J1Y2tldCwgKl9wbm9kZSwgX25vZGU7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRDX0NhY2hlICAgICAgICAgICAgIF9jYWNoZSAgID0gRlRDX0NBQ0hFKGNhY2hlKTsgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX09mZnNldCAgICAgICAgICAgICBfaGFzaCAgICA9IChGVF9PZmZzZXQpKGhhc2gpOyAgICAgICAgICAgICAgICAgIFwKLSAgICBGVENfTm9kZV9Db21wYXJlRnVuYyAgX25vZGNvbXAgPSAoRlRDX05vZGVfQ29tcGFyZUZ1bmMpKG5vZGVjbXApOyAgICBcCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgIF9saXN0X2NoYW5nZWQgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG5vZGUgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLyogR28gdG8gdGhlIGB0b3AnIG5vZGUgb2YgdGhlIGxpc3Qgc2hhcmluZyBzYW1lIG1hc2tlZCBoYXNoICovICAgICAgXAotICAgIF9idWNrZXQgPSBfcG5vZGUgPSBGVENfTk9ERV9UT1BfRk9SX0hBU0goIF9jYWNoZSwgX2hhc2ggKTsgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLyogTG9vayB1cCBhIG5vZGUgd2l0aCBpZGVudGljYWwgaGFzaCBhbmQgcXVlcmllZCBwcm9wZXJ0aWVzLiAgICAqLyAgXAotICAgIC8qIE5PVEU6IF9ub2Rjb21wKCkgbWF5IGNoYW5nZSB0aGUgbGlua2VkIGxpc3QgdG8gcmVkdWNlIG1lbW9yeS4gKi8gIFwKLSAgICBmb3IgKDs7KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgX25vZGUgPSAqX3Bub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICggIV9ub2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdvdG8gTmV3Tm9kZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICggX25vZGUtPmhhc2ggPT0gX2hhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICAgICAgICAgICBcCi0gICAgICAgICAgIF9ub2Rjb21wKCBfbm9kZSwgcXVlcnksIF9jYWNoZSwgJl9saXN0X2NoYW5nZWQgKSApICAgICAgICAgICAgXAotICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBfcG5vZGUgPSAmX25vZGUtPmxpbms7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBfbGlzdF9jaGFuZ2VkICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIC8qIFVwZGF0ZSBfYnVja2V0IGJ5IHBvc3NpYmx5IG1vZGlmaWVkIGxpbmtlZCBsaXN0ICovICAgICAgICAgICAgICBcCi0gICAgICBfYnVja2V0ID0gX3Bub2RlID0gRlRDX05PREVfVE9QX0ZPUl9IQVNIKCBfY2FjaGUsIF9oYXNoICk7ICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIC8qIFVwZGF0ZSBfcG5vZGUgYnkgcG9zc2libHkgbW9kaWZpZWQgbGlua2VkIGxpc3QgKi8gICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAoICpfcG5vZGUgIT0gX25vZGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKCAhKl9wbm9kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VSUk9SKCggIkZUQ19DQUNIRV9MT09LVVBfQ01QOiBvb3BzISEhIG5vZGUgbWlzc2luZ1xuIiApKTsgIFwKLSAgICAgICAgICBnb3RvIE5ld05vZGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBfcG5vZGUgPSAmKCgqX3Bub2RlKS0+bGluayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLyogUmVvcmRlciB0aGUgbGlzdCB0byBtb3ZlIHRoZSBmb3VuZCBub2RlIHRvIHRoZSBgdG9wJyAqLyAgICAgICAgICAgXAotICAgIGlmICggX25vZGUgIT0gKl9idWNrZXQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAqX3Bub2RlICAgICA9IF9ub2RlLT5saW5rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgX25vZGUtPmxpbmsgPSAqX2J1Y2tldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpfYnVja2V0ICAgID0gX25vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvKiBVcGRhdGUgTVJVIGxpc3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRDX01hbmFnZXIgIF9tYW5hZ2VyID0gX2NhY2hlLT5tYW5hZ2VyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHZvaWQqICAgICAgICBfbmwgICAgICA9ICZfbWFuYWdlci0+bm9kZXNfbGlzdDsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICggX25vZGUgIT0gX21hbmFnZXItPm5vZGVzX2xpc3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEZUQ19NcnVOb2RlX1VwKCAoRlRDX01ydU5vZGUqKV9ubCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgKEZUQ19NcnVOb2RlKV9ub2RlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ290byBPa187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTmV3Tm9kZV86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBGVENfQ2FjaGVfTmV3Tm9kZSggX2NhY2hlLCBfaGFzaCwgcXVlcnksICZfbm9kZSApOyAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgT2tfOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbm9kZSA9IF9ub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2Vsc2UgLyogIUZUQ19JTkxJTkUgKi8KLQotI2RlZmluZSBGVENfQ0FDSEVfTE9PS1VQX0NNUCggY2FjaGUsIG5vZGVjbXAsIGhhc2gsIHF1ZXJ5LCBub2RlLCBlcnJvciApIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBGVENfQ2FjaGVfTG9va3VwKCBGVENfQ0FDSEUoIGNhY2hlICksIGhhc2gsIHF1ZXJ5LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUQ19Ob2RlKikmKG5vZGUpICk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLSNlbmRpZiAvKiAhRlRDX0lOTElORSAqLwotCi0KLSAgLyoKLSAgICogVGhpcyBtYWNybywgdG9nZXRoZXIgd2l0aCBGVENfQ0FDSEVfVFJZTE9PUF9FTkQsIGRlZmluZXMgYSByZXRyeQotICAgKiBsb29wIHRvIGZsdXNoIHRoZSBjYWNoZSByZXBlYXRlZGx5IGluIGNhc2Ugb2YgbWVtb3J5IG92ZXJmbG93cy4KLSAgICoKLSAgICogSXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IGNhY2hlIG5vZGUsIG9yIHdpdGhpbiBhIGxvb2t1cAotICAgKiB0aGF0IG5lZWRzIHRvIGFsbG9jYXRlIGRhdGEgKGUuZy4gdGhlIHNiaXQgY2FjaGUgbG9va3VwKS4KLSAgICoKLSAgICogRXhhbXBsZToKLSAgICoKLSAgICogICB7Ci0gICAqICAgICBGVENfQ0FDSEVfVFJZTE9PUCggY2FjaGUgKQotICAgKiAgICAgICBlcnJvciA9IGxvYWRfZGF0YSggLi4uICk7Ci0gICAqICAgICBGVENfQ0FDSEVfVFJZTE9PUF9FTkQoKQotICAgKiAgIH0KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUQ19DQUNIRV9UUllMT09QKCBjYWNoZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVENfTWFuYWdlciAgX3RyeV9tYW5hZ2VyID0gRlRDX0NBQ0hFKCBjYWNoZSApLT5tYW5hZ2VyOyBcCi0gICAgRlRfVUludCAgICAgIF90cnlfY291bnQgICA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yICg7OykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX1VJbnQgIF90cnlfZG9uZTsKLQotCi0jZGVmaW5lIEZUQ19DQUNIRV9UUllMT09QX0VORCggbGlzdF9jaGFuZ2VkICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoICFlcnJvciB8fCBGVF9FUlJfTkVRKCBlcnJvciwgT3V0X09mX01lbW9yeSApICkgICAgICAgICBcCi0gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBfdHJ5X2RvbmUgPSBGVENfTWFuYWdlcl9GbHVzaE4oIF90cnlfbWFuYWdlciwgX3RyeV9jb3VudCApOyBcCi0gICAgICBpZiAoIF90cnlfZG9uZSA+IDAgJiYgbGlzdF9jaGFuZ2VkICE9IE5VTEwgKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICooRlRfQm9vbCopKCBsaXN0X2NoYW5nZWQgKSA9IFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoIF90cnlfZG9uZSA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoIF90cnlfZG9uZSA9PSBfdHJ5X2NvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF90cnlfY291bnQgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICggX3RyeV9jb3VudCA8IF90cnlfZG9uZSAgICAgICAgICAgICAgfHwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfdHJ5X2NvdW50ID4gX3RyeV9tYW5hZ2VyLT5udW1fbm9kZXMgKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgX3RyeV9jb3VudCA9IF90cnlfbWFuYWdlci0+bnVtX25vZGVzOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogRlRDQ0FDSEVfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNjYmFjay5oIGIvc3JjL2NhY2hlL2Z0Y2NiYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ODFlOGMuLjAwMDAwMDAKLS0tIGEvc3JjL2NhY2hlL2Z0Y2NiYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNjYmFjay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ2FsbGJhY2sgZnVuY3Rpb25zIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gKHNwZWNpZmljYXRpb24gb25seSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEZUQ0NCQUNLX0hfCi0jZGVmaW5lIEZUQ0NCQUNLX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ0FDSEVfSAotI2luY2x1ZGUgImZ0Y21ydS5oIgotI2luY2x1ZGUgImZ0Y2ltYWdlLmgiCi0jaW5jbHVkZSAiZnRjbWFuYWcuaCIKLSNpbmNsdWRlICJmdGNnbHlwaC5oIgotI2luY2x1ZGUgImZ0Y3NiaXRzLmgiCi0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGZ0Y19pbm9kZV9mcmVlKCBGVENfTm9kZSAgIGlub2RlLAotICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGZ0Y19pbm9kZV9uZXcoIEZUQ19Ob2RlICAgKnBpbm9kZSwKLSAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgZ3F1ZXJ5LAotICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICBjYWNoZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9PZmZzZXQgKQotICBmdGNfaW5vZGVfd2VpZ2h0KCBGVENfTm9kZSAgIGlub2RlLAotICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgIGNhY2hlICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGZ0Y19zbm9kZV9mcmVlKCBGVENfTm9kZSAgIHNub2RlLAotICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGZ0Y19zbm9kZV9uZXcoIEZUQ19Ob2RlICAgKnBzbm9kZSwKLSAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgZ3F1ZXJ5LAotICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICBjYWNoZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9PZmZzZXQgKQotICBmdGNfc25vZGVfd2VpZ2h0KCBGVENfTm9kZSAgIHNub2RlLAotICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgIGNhY2hlICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Jvb2wgKQotICBmdGNfc25vZGVfY29tcGFyZSggRlRDX05vZGUgICAgc25vZGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBncXVlcnksCi0gICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgIGxpc3RfY2hhbmdlZCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Jvb2wgKQotICBmdGNfZ25vZGVfY29tcGFyZSggRlRDX05vZGUgICAgZ25vZGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBncXVlcnksCi0gICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgIGxpc3RfY2hhbmdlZCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgZnRjX2djYWNoZV9pbml0KCBGVENfQ2FjaGUgIGNhY2hlICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBmdGNfZ2NhY2hlX2RvbmUoIEZUQ19DYWNoZSAgY2FjaGUgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGZ0Y19jYWNoZV9pbml0KCBGVENfQ2FjaGUgIGNhY2hlICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBmdGNfY2FjaGVfZG9uZSggRlRDX0NhY2hlICBjYWNoZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZnRjX25vZGVfZGVzdHJveSggRlRDX05vZGUgICAgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICk7Ci0KLQotI2VuZGlmIC8qIEZUQ0NCQUNLX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjY21hcC5jIGIvc3JjL2NhY2hlL2Z0Y2NtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhODQ5Ny4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjY21hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2NtYXAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBDaGFyTWFwIGNhY2hlIChib2R5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9DQUNIRV9ICi0jaW5jbHVkZSAiZnRjbWFuYWcuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImZ0Y2NiYWNrLmgiCi0jaW5jbHVkZSAiZnRjZXJyb3IuaCIKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jYWNoZQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFYWNoIEZUQ19DTWFwTm9kZSBjb250YWlucyBhIHNpbXBsZSBhcnJheSB0byBtYXAgYSByYW5nZSBvZiBjaGFyYWN0ZXIgKi8KLSAgLyogY29kZXMgdG8gZXF1aXZhbGVudCBnbHlwaCBpbmRpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3Igbm93LCB0aGUgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYzogRWFjaCBub2RlIG1hcHMgYSByYW5nZSBvZiAgKi8KLSAgLyogMTI4IGNvbnNlY3V0aXZlIGNoYXJhY3RlciBjb2RlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGdseXBoIGluZGljZXMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBjb3VsZCBkbyBtb3JlIGNvbXBsZXggdGhpbmdzLCBidXQgSSBkb24ndCB0aGluayBpdCBpcyByZWFsbHkgdmVyeSAgKi8KLSAgLyogdXNlZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIG51bWJlciBvZiBnbHlwaCBpbmRpY2VzIC8gY2hhcmFjdGVyIGNvZGUgcGVyIG5vZGUgKi8KLSNkZWZpbmUgRlRDX0NNQVBfSU5ESUNFU19NQVggIDEyOAotCi0gIC8qIGNvbXB1dGUgYSBxdWVyeS9ub2RlIGhhc2ggKi8KLSNkZWZpbmUgRlRDX0NNQVBfSEFTSCggZmFjZWlkLCBpbmRleCwgY2hhcmNvZGUgKSAgICAgICAgIFwKLSAgICAgICAgICAoIEZUQ19GQUNFX0lEX0hBU0goIGZhY2VpZCApICsgMjExICogKGluZGV4KSArIFwKLSAgICAgICAgICAgICggKGNoYXJjb2RlKSAvIEZUQ19DTUFQX0lORElDRVNfTUFYICkgICAgICApCi0KLSAgLyogdGhlIGNoYXJtYXAgcXVlcnkgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19DTWFwUXVlcnlSZWNfCi0gIHsKLSAgICBGVENfRmFjZUlEICBmYWNlX2lkOwotICAgIEZUX1VJbnQgICAgIGNtYXBfaW5kZXg7Ci0gICAgRlRfVUludDMyICAgY2hhcl9jb2RlOwotCi0gIH0gRlRDX0NNYXBRdWVyeVJlYywgKkZUQ19DTWFwUXVlcnk7Ci0KLSNkZWZpbmUgRlRDX0NNQVBfUVVFUlkoIHggKSAgKChGVENfQ01hcFF1ZXJ5KSh4KSkKLQotICAvKiB0aGUgY21hcCBjYWNoZSBub2RlICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVENfQ01hcE5vZGVSZWNfCi0gIHsKLSAgICBGVENfTm9kZVJlYyAgbm9kZTsKLSAgICBGVENfRmFjZUlEICAgZmFjZV9pZDsKLSAgICBGVF9VSW50ICAgICAgY21hcF9pbmRleDsKLSAgICBGVF9VSW50MzIgICAgZmlyc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGNoYXJhY3RlciBpbiBub2RlICovCi0gICAgRlRfVUludDE2ICAgIGluZGljZXNbRlRDX0NNQVBfSU5ESUNFU19NQVhdOyAvKiBhcnJheSBvZiBnbHlwaCBpbmRpY2VzICAqLwotCi0gIH0gRlRDX0NNYXBOb2RlUmVjLCAqRlRDX0NNYXBOb2RlOwotCi0jZGVmaW5lIEZUQ19DTUFQX05PREUoIHggKSAoIChGVENfQ01hcE5vZGUpKCB4ICkgKQotCi0gIC8qIGlmIChpbmRpY2VzW25dID09IEZUQ19DTUFQX1VOS05PV04pLCB3ZSBhc3N1bWUgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAqLwotICAvKiBnbHlwaCBpbmRpY2VzIGhhdmVuJ3QgYmVlbiBxdWVyaWVkIHRocm91Z2ggRlRfR2V0X0dseXBoX0luZGV4KCkgeWV0ICAgKi8KLSNkZWZpbmUgRlRDX0NNQVBfVU5LTk9XTiAgKEZUX1VJbnQxNil+MAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUk1BUCBOT0RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdGNfY21hcF9ub2RlX2ZyZWUoIEZUQ19Ob2RlICAgZnRjbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgIGNhY2hlICkKLSAgewotICAgIEZUQ19DTWFwTm9kZSAgbm9kZSAgID0gKEZUQ19DTWFwTm9kZSlmdGNub2RlOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gY2FjaGUtPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggbm9kZSApOwotICB9Ci0KLQotICAvKiBpbml0aWFsaXplIGEgbmV3IGNtYXAgbm9kZSAqLwotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgZnRjX2NtYXBfbm9kZV9uZXcoIEZUQ19Ob2RlICAgKmZ0Y2Fub2RlLAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgZnRjcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICBjYWNoZSApCi0gIHsKLSAgICBGVENfQ01hcE5vZGUgICphbm9kZSAgPSAoRlRDX0NNYXBOb2RlKilmdGNhbm9kZTsKLSAgICBGVENfQ01hcFF1ZXJ5ICBxdWVyeSAgPSAoRlRDX0NNYXBRdWVyeSlmdGNxdWVyeTsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgPSBjYWNoZS0+bWVtb3J5OwotICAgIEZUQ19DTWFwTm9kZSAgIG5vZGUgICA9IE5VTEw7Ci0gICAgRlRfVUludCAgICAgICAgbm47Ci0KLQotICAgIGlmICggIUZUX05FVyggbm9kZSApICkKLSAgICB7Ci0gICAgICBub2RlLT5mYWNlX2lkICAgID0gcXVlcnktPmZhY2VfaWQ7Ci0gICAgICBub2RlLT5jbWFwX2luZGV4ID0gcXVlcnktPmNtYXBfaW5kZXg7Ci0gICAgICBub2RlLT5maXJzdCAgICAgID0gKHF1ZXJ5LT5jaGFyX2NvZGUgLyBGVENfQ01BUF9JTkRJQ0VTX01BWCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DTUFQX0lORElDRVNfTUFYOwotCi0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgRlRDX0NNQVBfSU5ESUNFU19NQVg7IG5uKysgKQotICAgICAgICBub2RlLT5pbmRpY2VzW25uXSA9IEZUQ19DTUFQX1VOS05PV047Ci0gICAgfQotCi0gICAgKmFub2RlID0gbm9kZTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGNvbXB1dGUgdGhlIHdlaWdodCBvZiBhIGdpdmVuIGNtYXAgbm9kZSAqLwotICBGVF9DQUxMQkFDS19ERUYoIEZUX09mZnNldCApCi0gIGZ0Y19jbWFwX25vZGVfd2VpZ2h0KCBGVENfTm9kZSAgIGNub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGNub2RlICk7Ci0gICAgRlRfVU5VU0VEKCBjYWNoZSApOwotCi0gICAgcmV0dXJuIHNpemVvZiAoICpjbm9kZSApOwotICB9Ci0KLQotICAvKiBjb21wYXJlIGEgY21hcCBub2RlIHRvIGEgZ2l2ZW4gcXVlcnkgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9Cb29sICkKLSAgZnRjX2NtYXBfbm9kZV9jb21wYXJlKCBGVENfTm9kZSAgICBmdGNub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGZ0Y3F1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgIGxpc3RfY2hhbmdlZCApCi0gIHsKLSAgICBGVENfQ01hcE5vZGUgICBub2RlICA9IChGVENfQ01hcE5vZGUpZnRjbm9kZTsKLSAgICBGVENfQ01hcFF1ZXJ5ICBxdWVyeSA9IChGVENfQ01hcFF1ZXJ5KWZ0Y3F1ZXJ5OwotICAgIEZUX1VOVVNFRCggY2FjaGUgKTsKLQotCi0gICAgaWYgKCBsaXN0X2NoYW5nZWQgKQotICAgICAgKmxpc3RfY2hhbmdlZCA9IEZBTFNFOwotICAgIGlmICggbm9kZS0+ZmFjZV9pZCAgICA9PSBxdWVyeS0+ZmFjZV9pZCAgICAmJgotICAgICAgICAgbm9kZS0+Y21hcF9pbmRleCA9PSBxdWVyeS0+Y21hcF9pbmRleCApCi0gICAgewotICAgICAgRlRfVUludDMyICBvZmZzZXQgPSAoRlRfVUludDMyKSggcXVlcnktPmNoYXJfY29kZSAtIG5vZGUtPmZpcnN0ICk7Ci0KLQotICAgICAgcmV0dXJuIEZUX0JPT0woIG9mZnNldCA8IEZUQ19DTUFQX0lORElDRVNfTUFYICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfQm9vbCApCi0gIGZ0Y19jbWFwX25vZGVfcmVtb3ZlX2ZhY2VpZCggRlRDX05vZGUgICAgZnRjbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBmdGNmYWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgIGxpc3RfY2hhbmdlZCApCi0gIHsKLSAgICBGVENfQ01hcE5vZGUgIG5vZGUgICAgPSAoRlRDX0NNYXBOb2RlKWZ0Y25vZGU7Ci0gICAgRlRDX0ZhY2VJRCAgICBmYWNlX2lkID0gKEZUQ19GYWNlSUQpZnRjZmFjZV9pZDsKLSAgICBGVF9VTlVTRUQoIGNhY2hlICk7Ci0KLQotICAgIGlmICggbGlzdF9jaGFuZ2VkICkKLSAgICAgICpsaXN0X2NoYW5nZWQgPSBGQUxTRTsKLSAgICByZXR1cm4gRlRfQk9PTCggbm9kZS0+ZmFjZV9pZCA9PSBmYWNlX2lkICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgR0xZUEggSU1BR0UgQ0FDSEUgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUQ19DYWNoZUNsYXNzUmVjICBmdGNfY21hcF9jYWNoZV9jbGFzcyA9Ci0gIHsKLSAgICBmdGNfY21hcF9ub2RlX25ldywgICAgICAgICAgIC8qIEZUQ19Ob2RlX05ld0Z1bmMgICAgICBub2RlX25ldyAgICAgICAgICAgKi8KLSAgICBmdGNfY21hcF9ub2RlX3dlaWdodCwgICAgICAgIC8qIEZUQ19Ob2RlX1dlaWdodEZ1bmMgICBub2RlX3dlaWdodCAgICAgICAgKi8KLSAgICBmdGNfY21hcF9ub2RlX2NvbXBhcmUsICAgICAgIC8qIEZUQ19Ob2RlX0NvbXBhcmVGdW5jICBub2RlX2NvbXBhcmUgICAgICAgKi8KLSAgICBmdGNfY21hcF9ub2RlX3JlbW92ZV9mYWNlaWQsIC8qIEZUQ19Ob2RlX0NvbXBhcmVGdW5jICBub2RlX3JlbW92ZV9mYWNlaWQgKi8KLSAgICBmdGNfY21hcF9ub2RlX2ZyZWUsICAgICAgICAgIC8qIEZUQ19Ob2RlX0ZyZWVGdW5jICAgICBub2RlX2ZyZWUgICAgICAgICAgKi8KLQotICAgIHNpemVvZiAoIEZUQ19DYWNoZVJlYyApLAotICAgIGZ0Y19jYWNoZV9pbml0LCAgICAgICAgICAgICAgLyogRlRDX0NhY2hlX0luaXRGdW5jICAgIGNhY2hlX2luaXQgICAgICAgICAqLwotICAgIGZ0Y19jYWNoZV9kb25lLCAgICAgICAgICAgICAgLyogRlRDX0NhY2hlX0RvbmVGdW5jICAgIGNhY2hlX2RvbmUgICAgICAgICAqLwotICB9OwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhY2hlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUQ19DTWFwQ2FjaGVfTmV3KCBGVENfTWFuYWdlciAgICAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUQ19DTWFwQ2FjaGUgICphY2FjaGUgKQotICB7Ci0gICAgcmV0dXJuIEZUQ19NYW5hZ2VyX1JlZ2lzdGVyQ2FjaGUoIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdGNfY21hcF9jYWNoZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0NBQ0hFX1AoIGFjYWNoZSApICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWNoZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludCApCi0gIEZUQ19DTWFwQ2FjaGVfTG9va3VwKCBGVENfQ01hcENhY2hlICBjbWFwX2NhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgICAgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGNtYXBfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRDX0NhY2hlICAgICAgICAgY2FjaGUgPSBGVENfQ0FDSEUoIGNtYXBfY2FjaGUgKTsKLSAgICBGVENfQ01hcFF1ZXJ5UmVjICBxdWVyeTsKLSAgICBGVENfTm9kZSAgICAgICAgICBub2RlOwotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yOwotICAgIEZUX1VJbnQgICAgICAgICAgIGdpbmRleCA9IDA7Ci0gICAgRlRfT2Zmc2V0ICAgICAgICAgaGFzaDsKLSAgICBGVF9JbnQgICAgICAgICAgICBub19jbWFwX2NoYW5nZSA9IDA7Ci0KLQotICAgIGlmICggY21hcF9pbmRleCA8IDAgKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IGEgbmVnYXRpdmUgY21hcCBpbmRleCBhcyBhIHNwZWNpYWwgdmFsdWUsIG1lYW5pbmcgdGhhdCB5b3UgKi8KLSAgICAgIC8qIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBGVF9GYWNlJ3MgY2hhcmFjdGVyIG1hcCB0aHJvdWdoIHRoaXMgICAgKi8KLSAgICAgIC8qIGNhbGwuICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgdGhlIGZhY2UgcmVxdWVzdGVyIGNhbGxiYWNrIGFscmVhZHkgKi8KLSAgICAgIC8qIHNldHMgdGhlIGZhY2UncyBjaGFybWFwIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4gICAgICAgICAgICAgICAgKi8KLQotICAgICAgbm9fY21hcF9jaGFuZ2UgPSAxOwotICAgICAgY21hcF9pbmRleCAgICAgPSAwOwotICAgIH0KLQotICAgIGlmICggIWNhY2hlICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTAoKCAiRlRDX0NNYXBDYWNoZV9Mb29rdXA6IGJhZCBhcmd1bWVudHMsIHJldHVybmluZyAwXG4iICkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcXVlcnkuZmFjZV9pZCAgICA9IGZhY2VfaWQ7Ci0gICAgcXVlcnkuY21hcF9pbmRleCA9IChGVF9VSW50KWNtYXBfaW5kZXg7Ci0gICAgcXVlcnkuY2hhcl9jb2RlICA9IGNoYXJfY29kZTsKLQotICAgIGhhc2ggPSBGVENfQ01BUF9IQVNIKCBmYWNlX2lkLCAoRlRfVUludCljbWFwX2luZGV4LCBjaGFyX2NvZGUgKTsKLQotI2lmIDEKLSAgICBGVENfQ0FDSEVfTE9PS1VQX0NNUCggY2FjaGUsIGZ0Y19jbWFwX25vZGVfY29tcGFyZSwgaGFzaCwgJnF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLCBlcnJvciApOwotI2Vsc2UKLSAgICBlcnJvciA9IEZUQ19DYWNoZV9Mb29rdXAoIGNhY2hlLCBoYXNoLCAmcXVlcnksICZub2RlICk7Ci0jZW5kaWYKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX0FTU0VSVCggKEZUX1VJbnQpKCBjaGFyX2NvZGUgLSBGVENfQ01BUF9OT0RFKCBub2RlICktPmZpcnN0ICkgPAotICAgICAgICAgICAgICAgIEZUQ19DTUFQX0lORElDRVNfTUFYICk7Ci0KLSAgICAvKiBzb21ldGhpbmcgcm90dGVuIGNhbiBoYXBwZW4gd2l0aCByb2d1ZSBjbGllbnRzICovCi0gICAgaWYgKCAoRlRfVUludCkoIGNoYXJfY29kZSAtIEZUQ19DTUFQX05PREUoIG5vZGUgKS0+Zmlyc3QgPj0KLSAgICAgICAgICAgICAgICAgICAgRlRDX0NNQVBfSU5ESUNFU19NQVggKSApCi0gICAgICByZXR1cm4gMDsgLyogWFhYOiBzaG91bGQgcmV0dXJuIGFwcHJvcHJpYXRlIGVycm9yICovCi0KLSAgICBnaW5kZXggPSBGVENfQ01BUF9OT0RFKCBub2RlICktPmluZGljZXNbY2hhcl9jb2RlIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0NNQVBfTk9ERSggbm9kZSApLT5maXJzdF07Ci0gICAgaWYgKCBnaW5kZXggPT0gRlRDX0NNQVBfVU5LTk9XTiApCi0gICAgewotICAgICAgRlRfRmFjZSAgZmFjZTsKLQotCi0gICAgICBnaW5kZXggPSAwOwotCi0gICAgICBlcnJvciA9IEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UoIGNhY2hlLT5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfQ01BUF9OT0RFKCBub2RlICktPmZhY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIChGVF9VSW50KWNtYXBfaW5kZXggPCAoRlRfVUludClmYWNlLT5udW1fY2hhcm1hcHMgKQotICAgICAgewotICAgICAgICBGVF9DaGFyTWFwICBvbGQsIGNtYXAgID0gTlVMTDsKLQotCi0gICAgICAgIG9sZCAgPSBmYWNlLT5jaGFybWFwOwotICAgICAgICBjbWFwID0gZmFjZS0+Y2hhcm1hcHNbY21hcF9pbmRleF07Ci0KLSAgICAgICAgaWYgKCBvbGQgIT0gY21hcCAmJiAhbm9fY21hcF9jaGFuZ2UgKQotICAgICAgICAgIEZUX1NldF9DaGFybWFwKCBmYWNlLCBjbWFwICk7Ci0KLSAgICAgICAgZ2luZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgoIGZhY2UsIGNoYXJfY29kZSApOwotCi0gICAgICAgIGlmICggb2xkICE9IGNtYXAgJiYgIW5vX2NtYXBfY2hhbmdlICkKLSAgICAgICAgICBGVF9TZXRfQ2hhcm1hcCggZmFjZSwgb2xkICk7Ci0gICAgICB9Ci0KLSAgICAgIEZUQ19DTUFQX05PREUoIG5vZGUgKS0+aW5kaWNlc1tjaGFyX2NvZGUgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DTUFQX05PREUoIG5vZGUgKS0+Zmlyc3RdCi0gICAgICAgID0gKEZUX1VTaG9ydClnaW5kZXg7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2Vycm9yLmggYi9zcmMvY2FjaGUvZnRjZXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmZTUyZi4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2Vycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDYWNoaW5nIHN1Yi1zeXN0ZW0gZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgY2FjaGluZyBzdWItc3lzdGVtIGVycm9yIGVudW1lcmF0aW9uICAqLwotICAvKiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEZUQ0VSUk9SX0hfCi0jZGVmaW5lIEZUQ0VSUk9SX0hfCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgRlRFUlJPUlNfSF8KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIEZUQ19FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfQ2FjaGUKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIEZUQ0VSUk9SX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjZ2x5cGguYyBiL3NyYy9jYWNoZS9mdGNnbHlwaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQ2OGYyLi4wMDAwMDAwCi0tLSBhL3NyYy9jYWNoZS9mdGNnbHlwaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2dseXBoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBHbHlwaCBJbWFnZSAoRlRfR2x5cGgpIGNhY2hlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0NBQ0hFX0gKLSNpbmNsdWRlICJmdGNnbHlwaC5oIgotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2luY2x1ZGUgImZ0Y2NiYWNrLmgiCi0jaW5jbHVkZSAiZnRjZXJyb3IuaCIKLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyBjaHVuayBub2RlLCBzZXR0aW5nIGl0cyBjYWNoZSBpbmRleCBhbmQgcmVmIGNvdW50ICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19HTm9kZV9Jbml0KCBGVENfR05vZGUgICBnbm9kZSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUQ19GYW1pbHkgIGZhbWlseSApCi0gIHsKLSAgICBnbm9kZS0+ZmFtaWx5ID0gZmFtaWx5OwotICAgIGdub2RlLT5naW5kZXggPSBnaW5kZXg7Ci0gICAgZmFtaWx5LT5udW1fbm9kZXMrKzsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgRlRDX0dOb2RlX1Vuc2VsZWN0RmFtaWx5KCBGVENfR05vZGUgIGdub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgY2FjaGUgKQotICB7Ci0gICAgRlRDX0ZhbWlseSAgZmFtaWx5ID0gZ25vZGUtPmZhbWlseTsKLQotCi0gICAgZ25vZGUtPmZhbWlseSA9IE5VTEw7Ci0gICAgaWYgKCBmYW1pbHkgJiYgLS1mYW1pbHktPm51bV9ub2RlcyA9PSAwICkKLSAgICAgIEZUQ19GQU1JTFlfRlJFRSggZmFtaWx5LCBjYWNoZSApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBGVENfR05vZGVfRG9uZSggRlRDX0dOb2RlICBnbm9kZSwKLSAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgY2FjaGUgKQotICB7Ci0gICAgLyogZmluYWxpemUgdGhlIG5vZGUgKi8KLSAgICBnbm9kZS0+Z2luZGV4ID0gMDsKLQotICAgIEZUQ19HTm9kZV9VbnNlbGVjdEZhbWlseSggZ25vZGUsIGNhY2hlICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIGZ0Y19nbm9kZV9jb21wYXJlKCBGVENfTm9kZSAgICBmdGNnbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGZ0Y2dxdWVyeSwKLSAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCogICAgbGlzdF9jaGFuZ2VkICkKLSAgewotICAgIEZUQ19HTm9kZSAgIGdub2RlICA9IChGVENfR05vZGUpZnRjZ25vZGU7Ci0gICAgRlRDX0dRdWVyeSAgZ3F1ZXJ5ID0gKEZUQ19HUXVlcnkpZnRjZ3F1ZXJ5OwotICAgIEZUX1VOVVNFRCggY2FjaGUgKTsKLQotCi0gICAgaWYgKCBsaXN0X2NoYW5nZWQgKQotICAgICAgKmxpc3RfY2hhbmdlZCA9IEZBTFNFOwotICAgIHJldHVybiBGVF9CT09MKCBnbm9kZS0+ZmFtaWx5ID09IGdxdWVyeS0+ZmFtaWx5ICYmCi0gICAgICAgICAgICAgICAgICAgIGdub2RlLT5naW5kZXggPT0gZ3F1ZXJ5LT5naW5kZXggKTsKLSAgfQotCi0KLSNpZmRlZiBGVENfSU5MSU5FCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgRlRDX0dOb2RlX0NvbXBhcmUoIEZUQ19HTm9kZSAgIGdub2RlLAotICAgICAgICAgICAgICAgICAgICAgRlRDX0dRdWVyeSAgZ3F1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgICBsaXN0X2NoYW5nZWQgKQotICB7Ci0gICAgcmV0dXJuIGZ0Y19nbm9kZV9jb21wYXJlKCBGVENfTk9ERSggZ25vZGUgKSwgZ3F1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUsIGxpc3RfY2hhbmdlZCApOwotICB9Ci0KLSNlbmRpZgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBDSFVOSyBTRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19GYW1pbHlfSW5pdCggRlRDX0ZhbWlseSAgZmFtaWx5LAotICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgIGNhY2hlICkKLSAgewotICAgIEZUQ19HQ2FjaGVDbGFzcyAgY2xhenogPSBGVENfQ0FDSEVfR0NBQ0hFX0NMQVNTKCBjYWNoZSApOwotCi0KLSAgICBmYW1pbHktPmNsYXp6ICAgICA9IGNsYXp6LT5mYW1pbHlfY2xhc3M7Ci0gICAgZmFtaWx5LT5udW1fbm9kZXMgPSAwOwotICAgIGZhbWlseS0+Y2FjaGUgICAgID0gY2FjaGU7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBmdGNfZ2NhY2hlX2luaXQoIEZUQ19DYWNoZSAgZnRjY2FjaGUgKQotICB7Ci0gICAgRlRDX0dDYWNoZSAgY2FjaGUgPSAoRlRDX0dDYWNoZSlmdGNjYWNoZTsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBGVENfQ2FjaGVfSW5pdCggRlRDX0NBQ0hFKCBjYWNoZSApICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUQ19HQ2FjaGVDbGFzcyAgIGNsYXp6ID0gKEZUQ19HQ2FjaGVDbGFzcylGVENfQ0FDSEUoIGNhY2hlICktPm9yZ19jbGFzczsKLQotICAgICAgRlRDX01ydUxpc3RfSW5pdCggJmNhY2hlLT5mYW1pbGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LT5mYW1pbHlfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAgLyogbm8gbWF4aW11bSBoZXJlISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfQ0FDSEUoIGNhY2hlICktPm1lbW9yeSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNpZiAwCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIEZUQ19HQ2FjaGVfSW5pdCggRlRDX0dDYWNoZSAgY2FjaGUgKQotICB7Ci0gICAgcmV0dXJuIGZ0Y19nY2FjaGVfaW5pdCggRlRDX0NBQ0hFKCBjYWNoZSApICk7Ci0gIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGZ0Y19nY2FjaGVfZG9uZSggRlRDX0NhY2hlICBmdGNjYWNoZSApCi0gIHsKLSAgICBGVENfR0NhY2hlICBjYWNoZSA9IChGVENfR0NhY2hlKWZ0Y2NhY2hlOwotCi0KLSAgICBGVENfQ2FjaGVfRG9uZSggKEZUQ19DYWNoZSljYWNoZSApOwotICAgIEZUQ19NcnVMaXN0X0RvbmUoICZjYWNoZS0+ZmFtaWxpZXMgKTsKLSAgfQotCi0KLSNpZiAwCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgRlRDX0dDYWNoZV9Eb25lKCBGVENfR0NhY2hlICBjYWNoZSApCi0gIHsKLSAgICBmdGNfZ2NhY2hlX2RvbmUoIEZUQ19DQUNIRSggY2FjaGUgKSApOwotICB9Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgRlRDX0dDYWNoZV9OZXcoIEZUQ19NYW5hZ2VyICAgICAgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICBGVENfR0NhY2hlQ2xhc3MgICBjbGF6eiwKLSAgICAgICAgICAgICAgICAgIEZUQ19HQ2FjaGUgICAgICAgKmFjYWNoZSApCi0gIHsKLSAgICByZXR1cm4gRlRDX01hbmFnZXJfUmVnaXN0ZXJDYWNoZSggbWFuYWdlciwgKEZUQ19DYWNoZUNsYXNzKWNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRDX0NhY2hlKilhY2FjaGUgKTsKLSAgfQotCi0KLSNpZm5kZWYgRlRDX0lOTElORQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBGVENfR0NhY2hlX0xvb2t1cCggRlRDX0dDYWNoZSAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgIGhhc2gsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgRlRDX0dRdWVyeSAgIHF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgKmFub2RlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgcXVlcnktPmdpbmRleCA9IGdpbmRleDsKLQotICAgIEZUQ19NUlVMSVNUX0xPT0tVUCggJmNhY2hlLT5mYW1pbGllcywgcXVlcnksIHF1ZXJ5LT5mYW1pbHksIGVycm9yICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUQ19GYW1pbHkgIGZhbWlseSA9IHF1ZXJ5LT5mYW1pbHk7Ci0KLQotICAgICAgLyogcHJldmVudCB0aGUgZmFtaWx5IGZyb20gYmVpbmcgZGVzdHJveWVkIHRvbyBlYXJseSB3aGVuIGFuICAgICAgICAqLwotICAgICAgLyogb3V0LW9mLW1lbW9yeSBjb25kaXRpb24gb2NjdXJzIGR1cmluZyBnbHlwaCBub2RlIGluaXRpYWxpemF0aW9uLiAqLwotICAgICAgZmFtaWx5LT5udW1fbm9kZXMrKzsKLQotICAgICAgZXJyb3IgPSBGVENfQ2FjaGVfTG9va3VwKCBGVENfQ0FDSEUoIGNhY2hlICksIGhhc2gsIHF1ZXJ5LCBhbm9kZSApOwotCi0gICAgICBpZiAoIC0tZmFtaWx5LT5udW1fbm9kZXMgPT0gMCApCi0gICAgICAgIEZUQ19GQU1JTFlfRlJFRSggZmFtaWx5LCBjYWNoZSApOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qICFGVENfSU5MSU5FICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjZ2x5cGguaCBiL3NyYy9jYWNoZS9mdGNnbHlwaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWI1OGVkLi4wMDAwMDAwCi0tLSBhL3NyYy9jYWNoZS9mdGNnbHlwaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2dseXBoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBhYnN0cmFjdCBnbHlwaCBjYWNoZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKgotICAgKiAgRlRDX0dDYWNoZSBpcyBhbiBfYWJzdHJhY3RfIGNhY2hlIG9iamVjdCBvcHRpbWl6ZWQgdG8gc3RvcmUgZ2x5cGgKLSAgICogIGRhdGEuICBJdCB3b3JrcyBhcyBmb2xsb3dzOgotICAgKgotICAgKiAgIC0gSXQgbWFuYWdlcyBGVENfR05vZGUgb2JqZWN0cy4gRWFjaCBvbmUgb2YgdGhlbSBjYW4gaG9sZCBvbmUgb3IgbW9yZQotICAgKiAgICAgZ2x5cGggYGl0ZW1zJy4gIEl0ZW0gdHlwZXMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIEZUQ19HQ2FjaGUgYnV0Ci0gICAqICAgICBpbiBjbGFzc2VzIHRoYXQgZXh0ZW5kIGl0LgotICAgKgotICAgKiAgIC0gR2x5cGggYXR0cmlidXRlcywgbGlrZSBmYWNlIElELCBjaGFyYWN0ZXIgc2l6ZSwgcmVuZGVyIG1vZGUsIGV0Yy4sCi0gICAqICAgICBjYW4gYmUgZ3JvdXBlZCBpbnRvIGFic3RyYWN0IGBnbHlwaCBmYW1pbGllcycuICBUaGlzIGF2b2lkcyBzdG9yaW5nCi0gICAqICAgICB0aGUgYXR0cmlidXRlcyB3aXRoaW4gdGhlIEZUQ19HQ2FjaGUsIHNpbmNlIGl0IGlzIGxpa2VseSB0aGF0IG1hbnkKLSAgICogICAgIEZUQ19HTm9kZXMgd2lsbCBiZWxvbmcgdG8gdGhlIHNhbWUgZmFtaWx5IGluIHR5cGljYWwgdXNlcy4KLSAgICoKLSAgICogICAtIEVhY2ggRlRDX0dOb2RlIGlzIHRodXMgYW4gRlRDX05vZGUgd2l0aCB0d28gYWRkaXRpb25hbCBmaWVsZHM6Ci0gICAqCi0gICAqICAgICAgICogZ2luZGV4OiBBIGdseXBoIGluZGV4LCBvciB0aGUgZmlyc3QgaW5kZXggaW4gYSBnbHlwaCByYW5nZS4KLSAgICogICAgICAgKiBmYW1pbHk6IEEgcG9pbnRlciB0byBhIGdseXBoIGBmYW1pbHknLgotICAgKgotICAgKiAgIC0gRmFtaWx5IHR5cGVzIGFyZSBub3QgZnVsbHkgc3BlY2lmaWMgaW4gdGhlIEZUQ19GYW1pbHkgdHlwZSwgYnV0Ci0gICAqICAgICBieSBjbGFzc2VzIHRoYXQgZXh0ZW5kIGl0LgotICAgKgotICAgKiAgTm90ZSB0aGF0IGJvdGggRlRDX0ltYWdlQ2FjaGUgYW5kIEZUQ19TQml0Q2FjaGUgZXh0ZW5kIEZUQ19HQ2FjaGUuCi0gICAqICBUaGV5IHNoYXJlIGFuIEZUQ19GYW1pbHkgc3ViLWNsYXNzIGNhbGxlZCBGVENfQmFzaWNGYW1pbHkgd2hpY2ggaXMKLSAgICogIHVzZWQgdG8gc3RvcmUgdGhlIGZvbGxvd2luZyBkYXRhOiBmYWNlIElELCBwaXhlbC9wb2ludCBzaXplcywgbG9hZAotICAgKiAgZmxhZ3MuICBGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgZmlsZSBgc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMnLgotICAgKgotICAgKiAgQ2xpZW50IGFwcGxpY2F0aW9ucyBjYW4gZXh0ZW5kIEZUQ19HTm9kZSB3aXRoIHRoZWlyIG93biBGVENfR05vZGUKLSAgICogIGFuZCBGVENfRmFtaWx5IHN1Yi1jbGFzc2VzIHRvIGltcGxlbWVudCBtb3JlIGNvbXBsZXggY2FjaGVzIChlLmcuLAotICAgKiAgaGFuZGxpbmcgYXV0b21hdGljIHN5bnRoZXNpcywgbGlrZSBvYmxpcXVpbmcgJiBlbWJvbGRlbmluZywgY29sb3JlZAotICAgKiAgZ2x5cGhzLCBldGMuKS4KLSAgICoKLSAgICogIFNlZSBhbHNvIHRoZSBGVENfSUNhY2hlICYgRlRDX1NDYWNoZSBjbGFzc2VzIGluIGBmdGNpbWFnZS5oJyBhbmQKLSAgICogIGBmdGNzYml0cy5oJywgd2hpY2ggYm90aCBleHRlbmQgRlRDX0dDYWNoZSB3aXRoIGFkZGl0aW9uYWwKLSAgICogIG9wdGltaXphdGlvbnMuCi0gICAqCi0gICAqICBBIHR5cGljYWwgRlRDX0dDYWNoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYXQgbGVhc3QgdGhlCi0gICAqICBmb2xsb3dpbmc6Ci0gICAqCi0gICAqICAtIEZUQ19HTm9kZSBzdWItY2xhc3MsIGUuZy4gTXlOb2RlLCB3aXRoIHJlbGV2YW50IG1ldGhvZHM6Ci0gICAqICAgICAgICBteV9ub2RlX25ldyAgICAgICAgICAgIChtdXN0IGNhbGwgRlRDX0dOb2RlX0luaXQpCi0gICAqICAgICAgICBteV9ub2RlX2ZyZWUgICAgICAgICAgIChtdXN0IGNhbGwgRlRDX0dOb2RlX0RvbmUpCi0gICAqICAgICAgICBteV9ub2RlX2NvbXBhcmUgICAgICAgIChtdXN0IGNhbGwgRlRDX0dOb2RlX0NvbXBhcmUpCi0gICAqICAgICAgICBteV9ub2RlX3JlbW92ZV9mYWNlaWQgIChtdXN0IGNhbGwgZnRjX2dub2RlX3Vuc2VsZWN0IGluIGNhc2UKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG1hdGNoKQotICAgKgotICAgKiAgLSBGVENfRmFtaWx5IHN1Yi1jbGFzcywgZS5nLiBNeUZhbWlseSwgd2l0aCByZWxldmFudCBtZXRob2RzOgotICAgKiAgICAgICAgbXlfZmFtaWx5X2NvbXBhcmUKLSAgICogICAgICAgIG15X2ZhbWlseV9pbml0Ci0gICAqICAgICAgICBteV9mYW1pbHlfcmVzZXQgKG9wdGlvbmFsKQotICAgKiAgICAgICAgbXlfZmFtaWx5X2RvbmUKLSAgICoKLSAgICogIC0gRlRDX0dRdWVyeSBzdWItY2xhc3MsIGUuZy4gTXlRdWVyeSwgdG8gaG9sZCBjYWNoZS1zcGVjaWZpYyBxdWVyeQotICAgKiAgICBkYXRhLgotICAgKgotICAgKiAgLSBDb25zdGFudCBzdHJ1Y3R1cmVzIGZvciBhIEZUQ19HTm9kZUNsYXNzLgotICAgKgotICAgKiAgLSBNeUNhY2hlTmV3KCkgY2FuIGJlIGltcGxlbWVudGVkIGVhc2lseSBhcyBhIGNhbGwgdG8gdGhlIGNvbnZlbmllbmNlCi0gICAqICAgIGZ1bmN0aW9uIEZUQ19HQ2FjaGVfTmV3LgotICAgKgotICAgKiAgLSBNeUNhY2hlTG9va3VwIHdpdGggYSBjYWxsIHRvIEZUQ19HQ2FjaGVfTG9va3VwLiAgVGhpcyBmdW5jdGlvbiB3aWxsCi0gICAqICAgIGF1dG9tYXRpY2FsbHk6Ci0gICAqCi0gICAqICAgIC0gU2VhcmNoIGZvciB0aGUgY29ycmVzcG9uZGluZyBmYW1pbHkgaW4gdGhlIGNhY2hlLCBvciBjcmVhdGUKLSAgICogICAgICBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LiAgUHV0IGl0IGluIEZUQ19HUVVFUlkobXlxdWVyeSkuZmFtaWx5Ci0gICAqCi0gICAqICAgIC0gQ2FsbCBGVENfQ2FjaGVfTG9va3VwLgotICAgKgotICAgKiAgICBJZiBpdCByZXR1cm5zIE5VTEwsIHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IG5vZGUsIHRoZW4gY2FsbAotICAgKiAgICBmdGNfY2FjaGVfYWRkIGFzIHVzdWFsLgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW1wb3J0YW50OiBUaGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBmaWxlIGFyZSBvbmx5IHVzZWQgdG8gICAgICAgICovCi0gIC8qICAgICAgICAgICAgaW1wbGVtZW50IGFuIGFic3RyYWN0IGdseXBoIGNhY2hlIGNsYXNzLiAgWW91IG5lZWQgdG8gICAgICAqLwotICAvKiAgICAgICAgICAgIHByb3ZpZGUgYWRkaXRpb25hbCBsb2dpYyB0byBpbXBsZW1lbnQgYSBjb21wbGV0ZSBjYWNoZS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiAgICAgICAgICAgICBXQVJOSU5HLCBUSElTIElTIEJFVEEgQ09ERS4gICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVENHTFlQSF9IXwotI2RlZmluZSBGVENHTFlQSF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImZ0Y21hbmFnLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotIC8qCi0gICogIFdlIGNhbiBncm91cCBnbHlwaHMgaW50byBgZmFtaWxpZXMnLiAgRWFjaCBmYW1pbHkgY29ycmVzcG9uZCB0byBhCi0gICogIGdpdmVuIGZhY2UgSUQsIGNoYXJhY3RlciBzaXplLCB0cmFuc2Zvcm0sIGV0Yy4KLSAgKgotICAqICBGYW1pbGllcyBhcmUgaW1wbGVtZW50ZWQgYXMgTVJVIGxpc3Qgbm9kZXMuICBUaGV5IGFyZQotICAqICByZWZlcmVuY2UtY291bnRlZC4KLSAgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRDX0ZhbWlseVJlY18KLSAgewotICAgIEZUQ19NcnVOb2RlUmVjICAgIG1ydW5vZGU7Ci0gICAgRlRfVUludCAgICAgICAgICAgbnVtX25vZGVzOyAvKiBjdXJyZW50IG51bWJlciBvZiBub2RlcyBpbiB0aGlzIGZhbWlseSAqLwotICAgIEZUQ19DYWNoZSAgICAgICAgIGNhY2hlOwotICAgIEZUQ19NcnVMaXN0Q2xhc3MgIGNsYXp6OwotCi0gIH0gRlRDX0ZhbWlseVJlYywgKkZUQ19GYW1pbHk7Ci0KLSNkZWZpbmUgIEZUQ19GQU1JTFkoeCkgICAgKCAoRlRDX0ZhbWlseSkoeCkgKQotI2RlZmluZSAgRlRDX0ZBTUlMWV9QKHgpICAoIChGVENfRmFtaWx5KikoeCkgKQotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19HTm9kZVJlY18KLSAgewotICAgIEZUQ19Ob2RlUmVjICAgICAgbm9kZTsKLSAgICBGVENfRmFtaWx5ICAgICAgIGZhbWlseTsKLSAgICBGVF9VSW50ICAgICAgICAgIGdpbmRleDsKLQotICB9IEZUQ19HTm9kZVJlYywgKkZUQ19HTm9kZTsKLQotI2RlZmluZSBGVENfR05PREUoIHggKSAgICAoIChGVENfR05vZGUpKHgpICkKLSNkZWZpbmUgRlRDX0dOT0RFX1AoIHggKSAgKCAoRlRDX0dOb2RlKikoeCkgKQotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19HUXVlcnlSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgZ2luZGV4OwotICAgIEZUQ19GYW1pbHkgICBmYW1pbHk7Ci0KLSAgfSBGVENfR1F1ZXJ5UmVjLCAqRlRDX0dRdWVyeTsKLQotI2RlZmluZSBGVENfR1FVRVJZKCB4ICkgICggKEZUQ19HUXVlcnkpKHgpICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNhbGxlZCBmcm9tICAgICAgICAgICovCi0gIC8qIHVzZXItcHJvdmlkZWQgY2FjaGUgY2xhc3Nlczsgb3RoZXJ3aXNlLCB0aGV5IGFyZSByZWFsbHkgcGFydCBvZiB0aGUgICAqLwotICAvKiBjYWNoZSBzdWItc3lzdGVtIGludGVybmFscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogbXVzdCBiZSBjYWxsZWQgYnkgZGVyaXZlZCBGVENfTm9kZV9Jbml0RnVuYyByb3V0aW5lcyAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIEZUQ19HTm9kZV9Jbml0KCBGVENfR05vZGUgICBub2RlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2luZGV4LCAgLyogZ2x5cGggaW5kZXggZm9yIG5vZGUgKi8KLSAgICAgICAgICAgICAgICAgIEZUQ19GYW1pbHkgIGZhbWlseSApOwotCi0jaWZkZWYgRlRDX0lOTElORQotCi0gIC8qIHJldHVybnMgVFJVRSBpZmYgdGhlIHF1ZXJ5J3MgZ2x5cGggaW5kZXggY29ycmVzcG9uZCB0byB0aGUgbm9kZTsgICovCi0gIC8qIHRoaXMgYXNzdW1lcyB0aGF0IHRoZSBgZmFtaWx5JyBhbmQgYGhhc2gnIGZpZWxkcyBvZiB0aGUgcXVlcnkgYXJlICovCi0gIC8qIGFscmVhZHkgY29ycmVjdGx5IHNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgRlRDX0dOb2RlX0NvbXBhcmUoIEZUQ19HTm9kZSAgIGdub2RlLAotICAgICAgICAgICAgICAgICAgICAgRlRDX0dRdWVyeSAgZ3F1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgICBsaXN0X2NoYW5nZWQgKTsKLQotI2VuZGlmCi0KLSAgLyogY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNsZWFyIGEgbm9kZSdzIGZhbWlseSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSAqLwotICAvKiB0byBpbXBsZW1lbnQgdGhlIGBub2RlX3JlbW92ZV9mYWNlaWQnIGNhY2hlIG1ldGhvZCBjb3JyZWN0bHkgICAgICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX0dOb2RlX1Vuc2VsZWN0RmFtaWx5KCBGVENfR05vZGUgIGdub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgY2FjaGUgKTsKLQotICAvKiBtdXN0IGJlIGNhbGxlZCBieSBkZXJpdmVkIEZUQ19Ob2RlX0RvbmVGdW5jIHJvdXRpbmVzICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX0dOb2RlX0RvbmUoIEZUQ19HTm9kZSAgbm9kZSwKLSAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgY2FjaGUgKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX0ZhbWlseV9Jbml0KCBGVENfRmFtaWx5ICBmYW1pbHksCi0gICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICAgY2FjaGUgKTsKLQotICB0eXBlZGVmIHN0cnVjdCBGVENfR0NhY2hlUmVjXwotICB7Ci0gICAgRlRDX0NhY2hlUmVjICAgIGNhY2hlOwotICAgIEZUQ19NcnVMaXN0UmVjICBmYW1pbGllczsKLQotICB9IEZUQ19HQ2FjaGVSZWMsICpGVENfR0NhY2hlOwotCi0jZGVmaW5lIEZUQ19HQ0FDSEUoIHggKSAgKChGVENfR0NhY2hlKSh4KSkKLQotCi0jaWYgMAotICAvKiBjYW4gYmUgdXNlZCBhcyBARlRDX0NhY2hlX0luaXRGdW5jICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIEZUQ19HQ2FjaGVfSW5pdCggRlRDX0dDYWNoZSAgY2FjaGUgKTsKLSNlbmRpZgotCi0KLSNpZiAwCi0gIC8qIGNhbiBiZSB1c2VkIGFzIEBGVENfQ2FjaGVfRG9uZUZ1bmMgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBGVENfR0NhY2hlX0RvbmUoIEZUQ19HQ2FjaGUgIGNhY2hlICk7Ci0jZW5kaWYKLQotCi0gIC8qIHRoZSBnbHlwaCBjYWNoZSBjbGFzcyBhZGRzIGZpZWxkcyBmb3IgdGhlIGZhbWlseSBpbXBsZW1lbnRhdGlvbiAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRDX0dDYWNoZUNsYXNzUmVjXwotICB7Ci0gICAgRlRDX0NhY2hlQ2xhc3NSZWMgIGNsYXp6OwotICAgIEZUQ19NcnVMaXN0Q2xhc3MgICBmYW1pbHlfY2xhc3M7Ci0KLSAgfSBGVENfR0NhY2hlQ2xhc3NSZWM7Ci0KLSAgdHlwZWRlZiBjb25zdCBGVENfR0NhY2hlQ2xhc3NSZWMqICAgRlRDX0dDYWNoZUNsYXNzOwotCi0jZGVmaW5lIEZUQ19HQ0FDSEVfQ0xBU1MoIHggKSAgKChGVENfR0NhY2hlQ2xhc3MpKHgpKQotCi0jZGVmaW5lIEZUQ19DQUNIRV9HQ0FDSEVfQ0xBU1MoIHggKSBcCi0gICAgICAgICAgRlRDX0dDQUNIRV9DTEFTUyggRlRDX0NBQ0hFKHgpLT5vcmdfY2xhc3MgKQotI2RlZmluZSBGVENfQ0FDSEVfRkFNSUxZX0NMQVNTKCB4ICkgXAotICAgICAgICAgICggKEZUQ19NcnVMaXN0Q2xhc3MpRlRDX0NBQ0hFX0dDQUNIRV9DTEFTUyggeCApLT5mYW1pbHlfY2xhc3MgKQotCi0KLSAgLyogY29udmVuaWVuY2UgZnVuY3Rpb247IHVzZSBpdCBpbnN0ZWFkIG9mIEZUQ19NYW5hZ2VyX1JlZ2lzdGVyX0NhY2hlICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIEZUQ19HQ2FjaGVfTmV3KCBGVENfTWFuYWdlciAgICAgICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgRlRDX0dDYWNoZUNsYXNzICAgY2xhenosCi0gICAgICAgICAgICAgICAgICBGVENfR0NhY2hlICAgICAgICphY2FjaGUgKTsKLQotI2lmbmRlZiBGVENfSU5MSU5FCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIEZUQ19HQ2FjaGVfTG9va3VwKCBGVENfR0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgICAgaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBGVENfR1F1ZXJ5ICAgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAqYW5vZGUgKTsKLSNlbmRpZgotCi0KLSAgLyogKi8KLQotCi0jZGVmaW5lIEZUQ19GQU1JTFlfRlJFRSggZmFtaWx5LCBjYWNoZSApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVENfTXJ1TGlzdF9SZW1vdmUoICZGVENfR0NBQ0hFKChjYWNoZSkpLT5mYW1pbGllcywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUQ19NcnVOb2RlKShmYW1pbHkpICkKLQotCi0jaWZkZWYgRlRDX0lOTElORQotCi0jZGVmaW5lIEZUQ19HQ0FDSEVfTE9PS1VQX0NNUCggY2FjaGUsIGZhbWNtcCwgbm9kZWNtcCwgaGFzaCwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbmRleCwgcXVlcnksIG5vZGUsIGVycm9yICkgICAgICAgICAgICAgICAgIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRDX0dDYWNoZSAgICAgICAgICAgICAgIF9nY2FjaGUgICA9IEZUQ19HQ0FDSEUoIGNhY2hlICk7ICAgICAgICAgICAgICAgXAotICAgIEZUQ19HUXVlcnkgICAgICAgICAgICAgICBfZ3F1ZXJ5ICAgPSAoRlRDX0dRdWVyeSkoIHF1ZXJ5ICk7ICAgICAgICAgICAgIFwKLSAgICBGVENfTXJ1Tm9kZV9Db21wYXJlRnVuYyAgX2Zjb21wYXJlID0gKEZUQ19NcnVOb2RlX0NvbXBhcmVGdW5jKShmYW1jbXApOyBcCi0gICAgRlRDX01ydU5vZGUgICAgICAgICAgICAgIF9tcnVub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX2dxdWVyeS0+Z2luZGV4ID0gKGdpbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVENfTVJVTElTVF9MT09LVVBfQ01QKCAmX2djYWNoZS0+ZmFtaWxpZXMsIF9ncXVlcnksIF9mY29tcGFyZSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX21ydW5vZGUsIGVycm9yICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9ncXVlcnktPmZhbWlseSA9IEZUQ19GQU1JTFkoIF9tcnVub2RlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoICFlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRDX0ZhbWlseSAgX2dxZmFtaWx5ID0gX2dxdWVyeS0+ZmFtaWx5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgX2dxZmFtaWx5LT5udW1fbm9kZXMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVENfQ0FDSEVfTE9PS1VQX0NNUCggY2FjaGUsIG5vZGVjbXAsIGhhc2gsIHF1ZXJ5LCBub2RlLCBlcnJvciApOyAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICggLS1fZ3FmYW1pbHktPm51bV9ub2RlcyA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEZUQ19GQU1JTFlfRlJFRSggX2dxZmFtaWx5LCBfZ2NhY2hlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0gIC8qICovCi0KLSNlbHNlIC8qICFGVENfSU5MSU5FICovCi0KLSNkZWZpbmUgRlRDX0dDQUNIRV9MT09LVVBfQ01QKCBjYWNoZSwgZmFtY21wLCBub2RlY21wLCBoYXNoLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2luZGV4LCBxdWVyeSwgbm9kZSwgZXJyb3IgKSAgICAgICAgICAgXAotICAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGVycm9yID0gRlRDX0dDYWNoZV9Mb29rdXAoIEZUQ19HQ0FDSEUoIGNhY2hlICksIGhhc2gsIGdpbmRleCwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfR1FVRVJZKCBxdWVyeSApLCAmbm9kZSApOyAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBGVF9FTkRfU1RNTlQKLQotI2VuZGlmIC8qICFGVENfSU5MSU5FICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBGVENHTFlQSF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2ltYWdlLmMgYi9zcmMvY2FjaGUvZnRjaW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5ZjgxOC4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjaW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNpbWFnZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgSW1hZ2UgY2FjaGUgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ0FDSEVfSAotI2luY2x1ZGUgImZ0Y2ltYWdlLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLSNpbmNsdWRlICJmdGNjYmFjay5oIgotI2luY2x1ZGUgImZ0Y2Vycm9yLmgiCi0KLQotICAvKiBmaW5hbGl6ZSBhIGdpdmVuIGdseXBoIGltYWdlIG5vZGUgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZnRjX2lub2RlX2ZyZWUoIEZUQ19Ob2RlICAgZnRjaW5vZGUsCi0gICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgIGNhY2hlICkKLSAgewotICAgIEZUQ19JTm9kZSAgaW5vZGUgPSAoRlRDX0lOb2RlKWZ0Y2lub2RlOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gY2FjaGUtPm1lbW9yeTsKLQotCi0gICAgaWYgKCBpbm9kZS0+Z2x5cGggKQotICAgIHsKLSAgICAgIEZUX0RvbmVfR2x5cGgoIGlub2RlLT5nbHlwaCApOwotICAgICAgaW5vZGUtPmdseXBoID0gTlVMTDsKLSAgICB9Ci0KLSAgICBGVENfR05vZGVfRG9uZSggRlRDX0dOT0RFKCBpbm9kZSApLCBjYWNoZSApOwotICAgIEZUX0ZSRUUoIGlub2RlICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19JTm9kZV9GcmVlKCBGVENfSU5vZGUgIGlub2RlLAotICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApCi0gIHsKLSAgICBmdGNfaW5vZGVfZnJlZSggRlRDX05PREUoIGlub2RlICksIGNhY2hlICk7Ci0gIH0KLQotCi0gIC8qIGluaXRpYWxpemUgYSBuZXcgZ2x5cGggaW1hZ2Ugbm9kZSAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgRlRDX0lOb2RlX05ldyggRlRDX0lOb2RlICAgKnBpbm9kZSwKLSAgICAgICAgICAgICAgICAgRlRDX0dRdWVyeSAgIGdxdWVyeSwKLSAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICAgIGNhY2hlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gY2FjaGUtPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUQ19JTm9kZSAgaW5vZGUgID0gTlVMTDsKLQotCi0gICAgaWYgKCAhRlRfTkVXKCBpbm9kZSApICkKLSAgICB7Ci0gICAgICBGVENfR05vZGUgICAgICAgICBnbm9kZSAgPSBGVENfR05PREUoIGlub2RlICk7Ci0gICAgICBGVENfRmFtaWx5ICAgICAgICBmYW1pbHkgPSBncXVlcnktPmZhbWlseTsKLSAgICAgIEZUX1VJbnQgICAgICAgICAgIGdpbmRleCA9IGdxdWVyeS0+Z2luZGV4OwotICAgICAgRlRDX0lGYW1pbHlDbGFzcyAgY2xhenogID0gRlRDX0NBQ0hFX0lGQU1JTFlfQ0xBU1MoIGNhY2hlICk7Ci0KLQotICAgICAgLyogaW5pdGlhbGl6ZSBpdHMgaW5uZXIgZmllbGRzICovCi0gICAgICBGVENfR05vZGVfSW5pdCggZ25vZGUsIGdpbmRleCwgZmFtaWx5ICk7Ci0KLSAgICAgIC8qIHdlIHdpbGwgbm93IGxvYWQgdGhlIGdseXBoIGltYWdlICovCi0gICAgICBlcnJvciA9IGNsYXp6LT5mYW1pbHlfbG9hZF9nbHlwaCggZmFtaWx5LCBnaW5kZXgsIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm9kZS0+Z2x5cGggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBGVENfSU5vZGVfRnJlZSggaW5vZGUsIGNhY2hlICk7Ci0gICAgICAgIGlub2RlID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAqcGlub2RlID0gaW5vZGU7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgZnRjX2lub2RlX25ldyggRlRDX05vZGUgICAqZnRjcGlub2RlLAotICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBmdGNncXVlcnksCi0gICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgIGNhY2hlICkKLSAgewotICAgIEZUQ19JTm9kZSAgKnBpbm9kZSA9IChGVENfSU5vZGUqKWZ0Y3Bpbm9kZTsKLSAgICBGVENfR1F1ZXJ5ICBncXVlcnkgPSAoRlRDX0dRdWVyeSlmdGNncXVlcnk7Ci0KLQotICAgIHJldHVybiBGVENfSU5vZGVfTmV3KCBwaW5vZGUsIGdxdWVyeSwgY2FjaGUgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9PZmZzZXQgKQotICBmdGNfaW5vZGVfd2VpZ2h0KCBGVENfTm9kZSAgIGZ0Y2lub2RlLAotICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgIGZ0Y2NhY2hlICkKLSAgewotICAgIEZUQ19JTm9kZSAgaW5vZGUgPSAoRlRDX0lOb2RlKWZ0Y2lub2RlOwotICAgIEZUX09mZnNldCAgc2l6ZSAgPSAwOwotICAgIEZUX0dseXBoICAgZ2x5cGggPSBpbm9kZS0+Z2x5cGg7Ci0KLSAgICBGVF9VTlVTRUQoIGZ0Y2NhY2hlICk7Ci0KLQotICAgIHN3aXRjaCAoIGdseXBoLT5mb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVA6Ci0gICAgICB7Ci0gICAgICAgIEZUX0JpdG1hcEdseXBoICBiaXRnOwotCi0KLSAgICAgICAgYml0ZyA9IChGVF9CaXRtYXBHbHlwaClnbHlwaDsKLSAgICAgICAgc2l6ZSA9IGJpdGctPmJpdG1hcC5yb3dzICogKEZUX09mZnNldClGVF9BQlMoIGJpdGctPmJpdG1hcC5waXRjaCApICsKLSAgICAgICAgICAgICAgIHNpemVvZiAoICpiaXRnICk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfR0xZUEhfRk9STUFUX09VVExJTkU6Ci0gICAgICB7Ci0gICAgICAgIEZUX091dGxpbmVHbHlwaCAgb3V0ZzsKLQotCi0gICAgICAgIG91dGcgPSAoRlRfT3V0bGluZUdseXBoKWdseXBoOwotICAgICAgICBzaXplID0gKEZUX09mZnNldClvdXRnLT5vdXRsaW5lLm5fcG9pbnRzICoKLSAgICAgICAgICAgICAgICAgKCBzaXplb2YgKCBGVF9WZWN0b3IgKSArIHNpemVvZiAoIEZUX0J5dGUgKSApICsKLSAgICAgICAgICAgICAgIChGVF9PZmZzZXQpb3V0Zy0+b3V0bGluZS5uX2NvbnRvdXJzICogc2l6ZW9mICggRlRfU2hvcnQgKSArCi0gICAgICAgICAgICAgICBzaXplb2YgKCAqb3V0ZyApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgOwotICAgIH0KLQotICAgIHNpemUgKz0gc2l6ZW9mICggKmlub2RlICk7Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotCi0jaWYgMAotCi0gIEZUX0xPQ0FMX0RFRiggRlRfT2Zmc2V0ICkKLSAgRlRDX0lOb2RlX1dlaWdodCggRlRDX0lOb2RlICBpbm9kZSApCi0gIHsKLSAgICByZXR1cm4gZnRjX2lub2RlX3dlaWdodCggRlRDX05PREUoIGlub2RlICksIE5VTEwgKTsKLSAgfQotCi0jZW5kaWYgLyogMCAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2ltYWdlLmggYi9zcmMvY2FjaGUvZnRjaW1hZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwNDlhZi4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjaW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNpbWFnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgR2VuZXJpYyBJbWFnZSBjYWNoZSAoc3BlY2lmaWNhdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAvKgotICAqICBGVENfSUNhY2hlIGlzIGFuIF9hYnN0cmFjdF8gY2FjaGUgdXNlZCB0byBzdG9yZSBhIHNpbmdsZSBGVF9HbHlwaAotICAqICBpbWFnZSBwZXIgY2FjaGUgbm9kZS4KLSAgKgotICAqICBGVENfSUNhY2hlIGV4dGVuZHMgRlRDX0dDYWNoZS4gIEZvciBhbiBpbXBsZW1lbnRhdGlvbiBleGFtcGxlLAotICAqICBzZWUgRlRDX0ltYWdlQ2FjaGUgaW4gYHNyYy9jYWNoZS9mdGJhc2ljLmMnLgotICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFYWNoIGltYWdlIGNhY2hlIHJlYWxseSBtYW5hZ2VzIEZUX0dseXBoIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRDSU1BR0VfSF8KLSNkZWZpbmUgRlRDSU1BR0VfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NBQ0hFX0gKLSNpbmNsdWRlICJmdGNnbHlwaC5oIgotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIHRoZSBGVF9HbHlwaCBpbWFnZSBub2RlIHR5cGUgLSB3ZSBzdG9yZSBvbmx5IDEgZ2x5cGggcGVyIG5vZGUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19JTm9kZVJlY18KLSAgewotICAgIEZUQ19HTm9kZVJlYyAgZ25vZGU7Ci0gICAgRlRfR2x5cGggICAgICBnbHlwaDsKLQotICB9IEZUQ19JTm9kZVJlYywgKkZUQ19JTm9kZTsKLQotI2RlZmluZSBGVENfSU5PREUoIHggKSAgICAgICAgICggKEZUQ19JTm9kZSkoIHggKSApCi0jZGVmaW5lIEZUQ19JTk9ERV9HSU5ERVgoIHggKSAgRlRDX0dOT0RFKHgpLT5naW5kZXgKLSNkZWZpbmUgRlRDX0lOT0RFX0ZBTUlMWSggeCApICBGVENfR05PREUoeCktPmZhbWlseQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVENfSUZhbWlseV9Mb2FkR2x5cGhGdW5jKSggRlRDX0ZhbWlseSAgZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICphZ2x5cGggKTsKLQotICB0eXBlZGVmIHN0cnVjdCAgRlRDX0lGYW1pbHlDbGFzc1JlY18KLSAgewotICAgIEZUQ19NcnVMaXN0Q2xhc3NSZWMgICAgICAgIGNsYXp6OwotICAgIEZUQ19JRmFtaWx5X0xvYWRHbHlwaEZ1bmMgIGZhbWlseV9sb2FkX2dseXBoOwotCi0gIH0gRlRDX0lGYW1pbHlDbGFzc1JlYzsKLQotICB0eXBlZGVmIGNvbnN0IEZUQ19JRmFtaWx5Q2xhc3NSZWMqICBGVENfSUZhbWlseUNsYXNzOwotCi0jZGVmaW5lIEZUQ19JRkFNSUxZX0NMQVNTKCB4ICkgICgoRlRDX0lGYW1pbHlDbGFzcykoeCkpCi0KLSNkZWZpbmUgRlRDX0NBQ0hFX0lGQU1JTFlfQ0xBU1MoIHggKSBcCi0gICAgICAgICAgRlRDX0lGQU1JTFlfQ0xBU1MoIEZUQ19DQUNIRV9HQ0FDSEVfQ0xBU1MoeCktPmZhbWlseV9jbGFzcyApCi0KLQotICAvKiBjYW4gYmUgdXNlZCBhcyBhIEBGVENfTm9kZV9GcmVlRnVuYyAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIEZUQ19JTm9kZV9GcmVlKCBGVENfSU5vZGUgIGlub2RlLAotICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApOwotCi0gIC8qIENhbiBiZSB1c2VkIGFzIEBGVENfTm9kZV9OZXdGdW5jLiAgYGdxdWVyeS5pbmRleCcgYW5kIGBncXVlcnkuZmFtaWx5JwotICAgKiBtdXN0IGJlIHNldCBjb3JyZWN0bHkuICBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYGZhbWlseV9sb2FkX2dseXBoJwotICAgKiBtZXRob2QgdG8gbG9hZCB0aGUgRlRfR2x5cGggaW50byB0aGUgY2FjaGUgbm9kZS4KLSAgICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIEZUQ19JTm9kZV9OZXcoIEZUQ19JTm9kZSAgICpwaW5vZGUsCi0gICAgICAgICAgICAgICAgIEZUQ19HUXVlcnkgICBncXVlcnksCi0gICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgICBjYWNoZSApOwotCi0jaWYgMAotICAvKiBjYW4gYmUgdXNlZCBhcyBARlRDX05vZGVfV2VpZ2h0RnVuYyAqLwotICBGVF9MT0NBTCggRlRfVUxvbmcgKQotICBGVENfSU5vZGVfV2VpZ2h0KCBGVENfSU5vZGUgIGlub2RlICk7Ci0jZW5kaWYKLQotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRDSU1BR0VfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNtYW5hZy5jIGIvc3JjL2NhY2hlL2Z0Y21hbmFnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWMyYjYuLjAwMDAwMDAKLS0tIGEvc3JjL2NhY2hlL2Z0Y21hbmFnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjbWFuYWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIENhY2hlIE1hbmFnZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NBQ0hFX0gKLSNpbmNsdWRlICJmdGNtYW5hZy5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9TSVpFU19ICi0KLSNpbmNsdWRlICJmdGNjYmFjay5oIgotI2luY2x1ZGUgImZ0Y2Vycm9yLmgiCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotI2Vycm9yICJjYWNoZSBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jYWNoZQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0Y19zY2FsZXJfbG9va3VwX3NpemUoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgc2NhbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAqYXNpemUgKQotICB7Ci0gICAgRlRfRmFjZSAgIGZhY2U7Ci0gICAgRlRfU2l6ZSAgIHNpemUgPSBOVUxMOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBGVENfTWFuYWdlcl9Mb29rdXBGYWNlKCBtYW5hZ2VyLCBzY2FsZXItPmZhY2VfaWQsICZmYWNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IEZUX05ld19TaXplKCBmYWNlLCAmc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfQWN0aXZhdGVfU2l6ZSggc2l6ZSApOwotCi0gICAgaWYgKCBzY2FsZXItPnBpeGVsICkKLSAgICAgIGVycm9yID0gRlRfU2V0X1BpeGVsX1NpemVzKCBmYWNlLCBzY2FsZXItPndpZHRoLCBzY2FsZXItPmhlaWdodCApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfU2V0X0NoYXJfU2l6ZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0YyNkRvdDYpc2NhbGVyLT53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0YyNkRvdDYpc2NhbGVyLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlci0+eF9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlci0+eV9yZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9Eb25lX1NpemUoIHNpemUgKTsKLSAgICAgIHNpemUgPSBOVUxMOwotICAgIH0KLQotICBFeGl0OgotICAgICphc2l6ZSA9IHNpemU7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRDX1NpemVOb2RlUmVjXwotICB7Ci0gICAgRlRDX01ydU5vZGVSZWMgIG5vZGU7Ci0gICAgRlRfU2l6ZSAgICAgICAgIHNpemU7Ci0gICAgRlRDX1NjYWxlclJlYyAgIHNjYWxlcjsKLQotICB9IEZUQ19TaXplTm9kZVJlYywgKkZUQ19TaXplTm9kZTsKLQotI2RlZmluZSBGVENfU0laRV9OT0RFKCB4ICkgKCAoRlRDX1NpemVOb2RlKSggeCApICkKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0Y19zaXplX25vZGVfZG9uZSggRlRDX01ydU5vZGUgIGZ0Y25vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGRhdGEgKQotICB7Ci0gICAgRlRDX1NpemVOb2RlICBub2RlID0gKEZUQ19TaXplTm9kZSlmdGNub2RlOwotICAgIEZUX1NpemUgICAgICAgc2l6ZSA9IG5vZGUtPnNpemU7Ci0gICAgRlRfVU5VU0VEKCBkYXRhICk7Ci0KLQotICAgIGlmICggc2l6ZSApCi0gICAgICBGVF9Eb25lX1NpemUoIHNpemUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9Cb29sICkKLSAgZnRjX3NpemVfbm9kZV9jb21wYXJlKCBGVENfTXJ1Tm9kZSAgZnRjbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZnRjc2NhbGVyICkKLSAgewotICAgIEZUQ19TaXplTm9kZSAgbm9kZSAgICA9IChGVENfU2l6ZU5vZGUpZnRjbm9kZTsKLSAgICBGVENfU2NhbGVyICAgIHNjYWxlciAgPSAoRlRDX1NjYWxlcilmdGNzY2FsZXI7Ci0gICAgRlRDX1NjYWxlciAgICBzY2FsZXIwID0gJm5vZGUtPnNjYWxlcjsKLQotCi0gICAgaWYgKCBGVENfU0NBTEVSX0NPTVBBUkUoIHNjYWxlcjAsIHNjYWxlciApICkKLSAgICB7Ci0gICAgICBGVF9BY3RpdmF0ZV9TaXplKCBub2RlLT5zaXplICk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdGNfc2l6ZV9ub2RlX2luaXQoIEZUQ19NcnVOb2RlICBmdGNub2RlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBmdGNzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGZ0Y21hbmFnZXIgKQotICB7Ci0gICAgRlRDX1NpemVOb2RlICBub2RlICAgID0gKEZUQ19TaXplTm9kZSlmdGNub2RlOwotICAgIEZUQ19TY2FsZXIgICAgc2NhbGVyICA9IChGVENfU2NhbGVyKWZ0Y3NjYWxlcjsKLSAgICBGVENfTWFuYWdlciAgIG1hbmFnZXIgPSAoRlRDX01hbmFnZXIpZnRjbWFuYWdlcjsKLQotCi0gICAgbm9kZS0+c2NhbGVyID0gc2NhbGVyWzBdOwotCi0gICAgcmV0dXJuIGZ0Y19zY2FsZXJfbG9va3VwX3NpemUoIG1hbmFnZXIsIHNjYWxlciwgJm5vZGUtPnNpemUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGZ0Y19zaXplX25vZGVfcmVzZXQoIEZUQ19NcnVOb2RlICBmdGNub2RlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZnRjc2NhbGVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZnRjbWFuYWdlciApCi0gIHsKLSAgICBGVENfU2l6ZU5vZGUgIG5vZGUgICAgPSAoRlRDX1NpemVOb2RlKWZ0Y25vZGU7Ci0gICAgRlRDX1NjYWxlciAgICBzY2FsZXIgID0gKEZUQ19TY2FsZXIpZnRjc2NhbGVyOwotICAgIEZUQ19NYW5hZ2VyICAgbWFuYWdlciA9IChGVENfTWFuYWdlcilmdGNtYW5hZ2VyOwotCi0KLSAgICBGVF9Eb25lX1NpemUoIG5vZGUtPnNpemUgKTsKLQotICAgIG5vZGUtPnNjYWxlciA9IHNjYWxlclswXTsKLQotICAgIHJldHVybiBmdGNfc2NhbGVyX2xvb2t1cF9zaXplKCBtYW5hZ2VyLCBzY2FsZXIsICZub2RlLT5zaXplICk7Ci0gIH0KLQotCi0gIHN0YXRpYwotICBjb25zdCBGVENfTXJ1TGlzdENsYXNzUmVjICBmdGNfc2l6ZV9saXN0X2NsYXNzID0KLSAgewotICAgIHNpemVvZiAoIEZUQ19TaXplTm9kZVJlYyApLAotCi0gICAgZnRjX3NpemVfbm9kZV9jb21wYXJlLCAgLyogRlRDX01ydU5vZGVfQ29tcGFyZUZ1bmMgIG5vZGVfY29tcGFyZSAqLwotICAgIGZ0Y19zaXplX25vZGVfaW5pdCwgICAgIC8qIEZUQ19NcnVOb2RlX0luaXRGdW5jICAgICBub2RlX2luaXQgICAgKi8KLSAgICBmdGNfc2l6ZV9ub2RlX3Jlc2V0LCAgICAvKiBGVENfTXJ1Tm9kZV9SZXNldEZ1bmMgICAgbm9kZV9yZXNldCAgICovCi0gICAgZnRjX3NpemVfbm9kZV9kb25lICAgICAgLyogRlRDX01ydU5vZGVfRG9uZUZ1bmMgICAgIG5vZGVfZG9uZSAgICAqLwotICB9OwotCi0KLSAgLyogaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZnRjX2ZhY2Vfbm9kZV9kb25lICovCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGZ0Y19zaXplX25vZGVfY29tcGFyZV9mYWNlaWQoIEZUQ19NcnVOb2RlICBmdGNub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZnRjZmFjZV9pZCApCi0gIHsKLSAgICBGVENfU2l6ZU5vZGUgIG5vZGUgICAgPSAoRlRDX1NpemVOb2RlKWZ0Y25vZGU7Ci0gICAgRlRDX0ZhY2VJRCAgICBmYWNlX2lkID0gKEZUQ19GYWNlSUQpZnRjZmFjZV9pZDsKLQotCi0gICAgcmV0dXJuIEZUX0JPT0woIG5vZGUtPnNjYWxlci5mYWNlX2lkID09IGZhY2VfaWQgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhY2hlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgc2NhbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAqYXNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUQ19NcnVOb2RlICBtcnVub2RlOwotCi0KLSAgICBpZiAoICFhc2l6ZSB8fCAhc2NhbGVyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgKmFzaXplID0gTlVMTDsKLQotICAgIGlmICggIW1hbmFnZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NhY2hlX0hhbmRsZSApOwotCi0jaWZkZWYgRlRDX0lOTElORQotCi0gICAgRlRDX01SVUxJU1RfTE9PS1VQX0NNUCggJm1hbmFnZXItPnNpemVzLCBzY2FsZXIsIGZ0Y19zaXplX25vZGVfY29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcnVub2RlLCBlcnJvciApOwotCi0jZWxzZQotICAgIGVycm9yID0gRlRDX01ydUxpc3RfTG9va3VwKCAmbWFuYWdlci0+c2l6ZXMsIHNjYWxlciwgJm1ydW5vZGUgKTsKLSNlbmRpZgotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgKmFzaXplID0gRlRDX1NJWkVfTk9ERSggbXJ1bm9kZSApLT5zaXplOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIEZBQ0UgTVJVIElNUExFTUVOVEFUSU9OICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRDX0ZhY2VOb2RlUmVjXwotICB7Ci0gICAgRlRDX01ydU5vZGVSZWMgIG5vZGU7Ci0gICAgRlRDX0ZhY2VJRCAgICAgIGZhY2VfaWQ7Ci0gICAgRlRfRmFjZSAgICAgICAgIGZhY2U7Ci0KLSAgfSBGVENfRmFjZU5vZGVSZWMsICpGVENfRmFjZU5vZGU7Ci0KLSNkZWZpbmUgRlRDX0ZBQ0VfTk9ERSggeCApICggKCBGVENfRmFjZU5vZGUgKSggeCApICkKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdGNfZmFjZV9ub2RlX2luaXQoIEZUQ19NcnVOb2RlICBmdGNub2RlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBmdGNmYWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBmdGNtYW5hZ2VyICkKLSAgewotICAgIEZUQ19GYWNlTm9kZSAgbm9kZSAgICA9IChGVENfRmFjZU5vZGUpZnRjbm9kZTsKLSAgICBGVENfRmFjZUlEICAgIGZhY2VfaWQgPSAoRlRDX0ZhY2VJRClmdGNmYWNlX2lkOwotICAgIEZUQ19NYW5hZ2VyICAgbWFuYWdlciA9IChGVENfTWFuYWdlcilmdGNtYW5hZ2VyOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0KLQotICAgIG5vZGUtPmZhY2VfaWQgPSBmYWNlX2lkOwotCi0gICAgZXJyb3IgPSBtYW5hZ2VyLT5yZXF1ZXN0X2ZhY2UoIGZhY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPmxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlcXVlc3RfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vZGUtPmZhY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgLyogZGVzdHJveSBpbml0aWFsIHNpemUgb2JqZWN0OyBpdCB3aWxsIGJlIHJlLWNyZWF0ZWQgbGF0ZXIgKi8KLSAgICAgIGlmICggbm9kZS0+ZmFjZS0+c2l6ZSApCi0gICAgICAgIEZUX0RvbmVfU2l6ZSggbm9kZS0+ZmFjZS0+c2l6ZSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRjX2ZhY2Vfbm9kZV9kb25lKCBGVENfTXJ1Tm9kZSAgZnRjbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZnRjbWFuYWdlciApCi0gIHsKLSAgICBGVENfRmFjZU5vZGUgIG5vZGUgICAgPSAoRlRDX0ZhY2VOb2RlKWZ0Y25vZGU7Ci0gICAgRlRDX01hbmFnZXIgICBtYW5hZ2VyID0gKEZUQ19NYW5hZ2VyKWZ0Y21hbmFnZXI7Ci0KLQotICAgIC8qIHdlIG11c3QgYmVnaW4gYnkgcmVtb3ZpbmcgYWxsIHNjYWxlcnMgZm9yIHRoZSB0YXJnZXQgZmFjZSAqLwotICAgIC8qIGZyb20gdGhlIG1hbmFnZXIncyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUQ19NcnVMaXN0X1JlbW92ZVNlbGVjdGlvbiggJm1hbmFnZXItPnNpemVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRjX3NpemVfbm9kZV9jb21wYXJlX2ZhY2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmZhY2VfaWQgKTsKLQotICAgIC8qIGFsbCByaWdodCwgd2UgY2FuIGRpc2NhcmQgdGhlIGZhY2Ugbm93ICovCi0gICAgRlRfRG9uZV9GYWNlKCBub2RlLT5mYWNlICk7Ci0gICAgbm9kZS0+ZmFjZSAgICA9IE5VTEw7Ci0gICAgbm9kZS0+ZmFjZV9pZCA9IE5VTEw7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfQm9vbCApCi0gIGZ0Y19mYWNlX25vZGVfY29tcGFyZSggRlRDX01ydU5vZGUgIGZ0Y25vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGZ0Y2ZhY2VfaWQgKQotICB7Ci0gICAgRlRDX0ZhY2VOb2RlICBub2RlICAgID0gKEZUQ19GYWNlTm9kZSlmdGNub2RlOwotICAgIEZUQ19GYWNlSUQgICAgZmFjZV9pZCA9IChGVENfRmFjZUlEKWZ0Y2ZhY2VfaWQ7Ci0KLQotICAgIHJldHVybiBGVF9CT09MKCBub2RlLT5mYWNlX2lkID09IGZhY2VfaWQgKTsKLSAgfQotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUQ19NcnVMaXN0Q2xhc3NSZWMgIGZ0Y19mYWNlX2xpc3RfY2xhc3MgPQotICB7Ci0gICAgc2l6ZW9mICggRlRDX0ZhY2VOb2RlUmVjKSwKLQotICAgIGZ0Y19mYWNlX25vZGVfY29tcGFyZSwgIC8qIEZUQ19NcnVOb2RlX0NvbXBhcmVGdW5jICBub2RlX2NvbXBhcmUgKi8KLSAgICBmdGNfZmFjZV9ub2RlX2luaXQsICAgICAvKiBGVENfTXJ1Tm9kZV9Jbml0RnVuYyAgICAgbm9kZV9pbml0ICAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogRlRDX01ydU5vZGVfUmVzZXRGdW5jICAgIG5vZGVfcmVzZXQgICAqLwotICAgIGZ0Y19mYWNlX25vZGVfZG9uZSAgICAgIC8qIEZUQ19NcnVOb2RlX0RvbmVGdW5jICAgICBub2RlX2RvbmUgICAgKi8KLSAgfTsKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWNoZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVENfTWFuYWdlcl9Mb29rdXBGYWNlKCBGVENfTWFuYWdlciAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgIGZhY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgRlRDX01ydU5vZGUgIG1ydW5vZGU7Ci0KLQotICAgIGlmICggIWFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgKmFmYWNlID0gTlVMTDsKLQotICAgIGlmICggIW1hbmFnZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NhY2hlX0hhbmRsZSApOwotCi0gICAgLyogd2UgYnJlYWsgZW5jYXBzdWxhdGlvbiBmb3IgdGhlIHNha2Ugb2Ygc3BlZWQgKi8KLSNpZmRlZiBGVENfSU5MSU5FCi0KLSAgICBGVENfTVJVTElTVF9MT09LVVBfQ01QKCAmbWFuYWdlci0+ZmFjZXMsIGZhY2VfaWQsIGZ0Y19mYWNlX25vZGVfY29tcGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcnVub2RlLCBlcnJvciApOwotCi0jZWxzZQotICAgIGVycm9yID0gRlRDX01ydUxpc3RfTG9va3VwKCAmbWFuYWdlci0+ZmFjZXMsIGZhY2VfaWQsICZtcnVub2RlICk7Ci0jZW5kaWYKLQotICAgIGlmICggIWVycm9yICkKLSAgICAgICphZmFjZSA9IEZUQ19GQUNFX05PREUoIG1ydW5vZGUgKS0+ZmFjZTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBDQUNIRSBNQU5BR0VSIFJPVVRJTkVTICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FjaGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRDX01hbmFnZXJfTmV3KCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICBtYXhfZmFjZXMsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICBtYXhfc2l6ZXMsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICBtYXhfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VfUmVxdWVzdGVyICByZXF1ZXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgICAgICByZXFfZGF0YSwKLSAgICAgICAgICAgICAgICAgICBGVENfTWFuYWdlciAgICAgICAgKmFtYW5hZ2VyICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotICAgIEZUQ19NYW5hZ2VyICBtYW5hZ2VyID0gMDsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFtYW5hZ2VyIHx8ICFyZXF1ZXN0ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBpZiAoIEZUX05FVyggbWFuYWdlciApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggbWF4X2ZhY2VzID09IDAgKQotICAgICAgbWF4X2ZhY2VzID0gRlRDX01BWF9GQUNFU19ERUZBVUxUOwotCi0gICAgaWYgKCBtYXhfc2l6ZXMgPT0gMCApCi0gICAgICBtYXhfc2l6ZXMgPSBGVENfTUFYX1NJWkVTX0RFRkFVTFQ7Ci0KLSAgICBpZiAoIG1heF9ieXRlcyA9PSAwICkKLSAgICAgIG1heF9ieXRlcyA9IEZUQ19NQVhfQllURVNfREVGQVVMVDsKLQotICAgIG1hbmFnZXItPmxpYnJhcnkgICAgICA9IGxpYnJhcnk7Ci0gICAgbWFuYWdlci0+bWVtb3J5ICAgICAgID0gbWVtb3J5OwotICAgIG1hbmFnZXItPm1heF93ZWlnaHQgICA9IG1heF9ieXRlczsKLQotICAgIG1hbmFnZXItPnJlcXVlc3RfZmFjZSA9IHJlcXVlc3RlcjsKLSAgICBtYW5hZ2VyLT5yZXF1ZXN0X2RhdGEgPSByZXFfZGF0YTsKLQotICAgIEZUQ19NcnVMaXN0X0luaXQoICZtYW5hZ2VyLT5mYWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAmZnRjX2ZhY2VfbGlzdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICBtYXhfZmFjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKTsKLQotICAgIEZUQ19NcnVMaXN0X0luaXQoICZtYW5hZ2VyLT5zaXplcywKLSAgICAgICAgICAgICAgICAgICAgICAmZnRjX3NpemVfbGlzdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKTsKLQotICAgICphbWFuYWdlciA9IG1hbmFnZXI7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWNoZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUQ19NYW5hZ2VyX0RvbmUoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX1VJbnQgICAgaWR4OwotCi0KLSAgICBpZiAoICFtYW5hZ2VyIHx8ICFtYW5hZ2VyLT5saWJyYXJ5ICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IG1hbmFnZXItPm1lbW9yeTsKLQotICAgIC8qIG5vdyBkaXNjYXJkIGFsbCBjYWNoZXMgKi8KLSAgICBmb3IgKGlkeCA9IG1hbmFnZXItPm51bV9jYWNoZXM7IGlkeC0tID4gMDsgKQotICAgIHsKLSAgICAgIEZUQ19DYWNoZSAgY2FjaGUgPSBtYW5hZ2VyLT5jYWNoZXNbaWR4XTsKLQotCi0gICAgICBpZiAoIGNhY2hlICkKLSAgICAgIHsKLSAgICAgICAgY2FjaGUtPmNsYXp6LmNhY2hlX2RvbmUoIGNhY2hlICk7Ci0gICAgICAgIEZUX0ZSRUUoIGNhY2hlICk7Ci0gICAgICAgIG1hbmFnZXItPmNhY2hlc1tpZHhdID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0gICAgbWFuYWdlci0+bnVtX2NhY2hlcyA9IDA7Ci0KLSAgICAvKiBkaXNjYXJkIGZhY2VzIGFuZCBzaXplcyAqLwotICAgIEZUQ19NcnVMaXN0X0RvbmUoICZtYW5hZ2VyLT5zaXplcyApOwotICAgIEZUQ19NcnVMaXN0X0RvbmUoICZtYW5hZ2VyLT5mYWNlcyApOwotCi0gICAgbWFuYWdlci0+bGlicmFyeSA9IE5VTEw7Ci0gICAgbWFuYWdlci0+bWVtb3J5ICA9IE5VTEw7Ci0KLSAgICBGVF9GUkVFKCBtYW5hZ2VyICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWNoZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUQ19NYW5hZ2VyX1Jlc2V0KCBGVENfTWFuYWdlciAgbWFuYWdlciApCi0gIHsKLSAgICBpZiAoICFtYW5hZ2VyICkKLSAgICAgIHJldHVybjsKLQotICAgIEZUQ19NcnVMaXN0X1Jlc2V0KCAmbWFuYWdlci0+c2l6ZXMgKTsKLSAgICBGVENfTXJ1TGlzdF9SZXNldCggJm1hbmFnZXItPmZhY2VzICk7Ci0KLSAgICBGVENfTWFuYWdlcl9GbHVzaE4oIG1hbmFnZXIsIG1hbmFnZXItPm51bV9ub2RlcyApOwotICB9Ci0KLQotI2lmZGVmIEZUX0RFQlVHX0VSUk9SCi0KLSAgc3RhdGljIHZvaWQKLSAgRlRDX01hbmFnZXJfQ2hlY2soIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICkKLSAgewotICAgIEZUQ19Ob2RlICBub2RlLCBmaXJzdDsKLQotCi0gICAgZmlyc3QgPSBtYW5hZ2VyLT5ub2Rlc19saXN0OwotCi0gICAgLyogY2hlY2sgbm9kZSB3ZWlnaHRzICovCi0gICAgaWYgKCBmaXJzdCApCi0gICAgewotICAgICAgRlRfT2Zmc2V0ICB3ZWlnaHQgPSAwOwotCi0KLSAgICAgIG5vZGUgPSBmaXJzdDsKLQotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgRlRDX0NhY2hlICBjYWNoZSA9IG1hbmFnZXItPmNhY2hlc1tub2RlLT5jYWNoZV9pbmRleF07Ci0KLQotICAgICAgICBpZiAoIChGVF9VSW50KW5vZGUtPmNhY2hlX2luZGV4ID49IG1hbmFnZXItPm51bV9jYWNoZXMgKQotICAgICAgICAgIEZUX1RSQUNFMCgoICJGVENfTWFuYWdlcl9DaGVjazogaW52YWxpZCBub2RlIChjYWNoZSBpbmRleCA9ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBub2RlLT5jYWNoZV9pbmRleCApKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHdlaWdodCArPSBjYWNoZS0+Y2xhenoubm9kZV93ZWlnaHQoIG5vZGUsIGNhY2hlICk7Ci0KLSAgICAgICAgbm9kZSA9IEZUQ19OT0RFX05FWFQoIG5vZGUgKTsKLQotICAgICAgfSB3aGlsZSAoIG5vZGUgIT0gZmlyc3QgKTsKLQotICAgICAgaWYgKCB3ZWlnaHQgIT0gbWFuYWdlci0+Y3VyX3dlaWdodCApCi0gICAgICAgIEZUX1RSQUNFMCgoICJGVENfTWFuYWdlcl9DaGVjazogaW52YWxpZCB3ZWlnaHQgJWxkIGluc3RlYWQgb2YgJWxkXG4iLAotICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLT5jdXJfd2VpZ2h0LCB3ZWlnaHQgKSk7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgY2lyY3VsYXIgbGlzdCAqLwotICAgIGlmICggZmlyc3QgKQotICAgIHsKLSAgICAgIEZUX1VGYXN0ICBjb3VudCA9IDA7Ci0KLQotICAgICAgbm9kZSA9IGZpcnN0OwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgY291bnQrKzsKLSAgICAgICAgbm9kZSA9IEZUQ19OT0RFX05FWFQoIG5vZGUgKTsKLQotICAgICAgfSB3aGlsZSAoIG5vZGUgIT0gZmlyc3QgKTsKLQotICAgICAgaWYgKCBjb3VudCAhPSBtYW5hZ2VyLT5udW1fbm9kZXMgKQotICAgICAgICBGVF9UUkFDRTAoKCAiRlRDX01hbmFnZXJfQ2hlY2s6IgotICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgY2FjaGUgbm9kZSBjb3VudCAlZCBpbnN0ZWFkIG9mICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLT5udW1fbm9kZXMsIGNvdW50ICkpOwotICAgIH0KLSAgfQotCi0jZW5kaWYgLyogRlRfREVCVUdfRVJST1IgKi8KLQotCi0gIC8qIGBDb21wcmVzcycgdGhlIG1hbmFnZXIncyBkYXRhLCBpLmUuLCBnZXQgcmlkIG9mIG9sZCBjYWNoZSBub2RlcyAqLwotICAvKiB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBhbnltb3JlIGluIG9yZGVyIHRvIGxpbWl0IHRoZSB0b3RhbCAgICAgKi8KLSAgLyogbWVtb3J5IHVzZWQgYnkgdGhlIGNhY2hlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNtYW5hZy5oICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgRlRDX01hbmFnZXJfQ29tcHJlc3MoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICkKLSAgewotICAgIEZUQ19Ob2RlICAgbm9kZSwgZmlyc3Q7Ci0KLQotICAgIGlmICggIW1hbmFnZXIgKQotICAgICAgcmV0dXJuOwotCi0gICAgZmlyc3QgPSBtYW5hZ2VyLT5ub2Rlc19saXN0OwotCi0jaWZkZWYgRlRfREVCVUdfRVJST1IKLSAgICBGVENfTWFuYWdlcl9DaGVjayggbWFuYWdlciApOwotCi0gICAgRlRfVFJBQ0UwKCggImNvbXByZXNzaW5nLCB3ZWlnaHQgPSAlbGQsIG1heCA9ICVsZCwgbm9kZXMgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLT5jdXJfd2VpZ2h0LCBtYW5hZ2VyLT5tYXhfd2VpZ2h0LAotICAgICAgICAgICAgICAgIG1hbmFnZXItPm51bV9ub2RlcyApKTsKLSNlbmRpZgotCi0gICAgaWYgKCBtYW5hZ2VyLT5jdXJfd2VpZ2h0IDwgbWFuYWdlci0+bWF4X3dlaWdodCB8fCAhZmlyc3QgKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogZ28gdG8gbGFzdCBub2RlIC0tIGl0J3MgYSBjaXJjdWxhciBsaXN0ICovCi0gICAgbm9kZSA9IEZUQ19OT0RFX1BSRVYoIGZpcnN0ICk7Ci0gICAgZG8KLSAgICB7Ci0gICAgICBGVENfTm9kZSAgcHJldjsKLQotCi0gICAgICBwcmV2ID0gKCBub2RlID09IGZpcnN0ICkgPyBOVUxMIDogRlRDX05PREVfUFJFViggbm9kZSApOwotCi0gICAgICBpZiAoIG5vZGUtPnJlZl9jb3VudCA8PSAwICkKLSAgICAgICAgZnRjX25vZGVfZGVzdHJveSggbm9kZSwgbWFuYWdlciApOwotCi0gICAgICBub2RlID0gcHJldjsKLQotICAgIH0gd2hpbGUgKCBub2RlICYmIG1hbmFnZXItPmN1cl93ZWlnaHQgPiBtYW5hZ2VyLT5tYXhfd2VpZ2h0ICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjbWFuYWcuaCAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBGVENfTWFuYWdlcl9SZWdpc3RlckNhY2hlKCBGVENfTWFuYWdlciAgICAgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZUNsYXNzICAgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgICAgICAqYWNhY2hlICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBGVENfQ2FjaGUgIGNhY2hlID0gTlVMTDsKLQotCi0gICAgaWYgKCBtYW5hZ2VyICYmIGNsYXp6ICYmIGFjYWNoZSApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBtYW5hZ2VyLT5tZW1vcnk7Ci0KLQotICAgICAgaWYgKCBtYW5hZ2VyLT5udW1fY2FjaGVzID49IEZUQ19NQVhfQ0FDSEVTICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVG9vX01hbnlfQ2FjaGVzICk7Ci0gICAgICAgIEZUX0VSUk9SKCggIkZUQ19NYW5hZ2VyX1JlZ2lzdGVyQ2FjaGU6IgotICAgICAgICAgICAgICAgICAgICIgdG9vIG1hbnkgcmVnaXN0ZXJlZCBjYWNoZXNcbiIgKSk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhRlRfQUxMT0MoIGNhY2hlLCBjbGF6ei0+Y2FjaGVfc2l6ZSApICkKLSAgICAgIHsKLSAgICAgICAgY2FjaGUtPm1hbmFnZXIgICA9IG1hbmFnZXI7Ci0gICAgICAgIGNhY2hlLT5tZW1vcnkgICAgPSBtZW1vcnk7Ci0gICAgICAgIGNhY2hlLT5jbGF6eiAgICAgPSBjbGF6elswXTsKLSAgICAgICAgY2FjaGUtPm9yZ19jbGFzcyA9IGNsYXp6OwotCi0gICAgICAgIC8qIFRISVMgSVMgVkVSWSBJTVBPUlRBTlQhICBJVCBXSUxMIFdSRVRDSCBUSEUgTUFOQUdFUiAqLwotICAgICAgICAvKiBJRiBJVCBJUyBOT1QgU0VUIENPUlJFQ1RMWSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgY2FjaGUtPmluZGV4ID0gbWFuYWdlci0+bnVtX2NhY2hlczsKLQotICAgICAgICBlcnJvciA9IGNsYXp6LT5jYWNoZV9pbml0KCBjYWNoZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgewotICAgICAgICAgIGNsYXp6LT5jYWNoZV9kb25lKCBjYWNoZSApOwotICAgICAgICAgIEZUX0ZSRUUoIGNhY2hlICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgbWFuYWdlci0+Y2FjaGVzW21hbmFnZXItPm51bV9jYWNoZXMrK10gPSBjYWNoZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGFjYWNoZSApCi0gICAgICAqYWNhY2hlID0gY2FjaGU7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1VJbnQgKQotICBGVENfTWFuYWdlcl9GbHVzaE4oIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBjb3VudCApCi0gIHsKLSAgICBGVENfTm9kZSAgZmlyc3QgPSBtYW5hZ2VyLT5ub2Rlc19saXN0OwotICAgIEZUQ19Ob2RlICBub2RlOwotICAgIEZUX1VJbnQgICByZXN1bHQ7Ci0KLQotICAgIC8qIHRyeSB0byByZW1vdmUgYGNvdW50JyBub2RlcyBmcm9tIHRoZSBsaXN0ICovCi0gICAgaWYgKCAhZmlyc3QgKSAgLyogZW1wdHkgbGlzdCEgKi8KLSAgICAgIHJldHVybiAwOwotCi0gICAgLyogZ28gdG8gbGFzdCBub2RlIC0gaXQncyBhIGNpcmN1bGFyIGxpc3QgKi8KLSAgICBub2RlID0gRlRDX05PREVfUFJFVihmaXJzdCk7Ci0gICAgZm9yICggcmVzdWx0ID0gMDsgcmVzdWx0IDwgY291bnQ7ICkKLSAgICB7Ci0gICAgICBGVENfTm9kZSAgcHJldiA9IEZUQ19OT0RFX1BSRVYoIG5vZGUgKTsKLQotCi0gICAgICAvKiBkb24ndCB0b3VjaCBsb2NrZWQgbm9kZXMgKi8KLSAgICAgIGlmICggbm9kZS0+cmVmX2NvdW50IDw9IDAgKQotICAgICAgewotICAgICAgICBmdGNfbm9kZV9kZXN0cm95KCBub2RlLCBtYW5hZ2VyICk7Ci0gICAgICAgIHJlc3VsdCsrOwotICAgICAgfQotCi0gICAgICBpZiAoIG5vZGUgPT0gZmlyc3QgKQotICAgICAgICBicmVhazsKLQotICAgICAgbm9kZSA9IHByZXY7Ci0gICAgfQotICAgIHJldHVybiAgcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FjaGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlSUQgICBmYWNlX2lkICkKLSAgewotICAgIEZUX1VJbnQgIG5uOwotCi0KLSAgICBpZiAoICFtYW5hZ2VyICkKLSAgICAgIHJldHVybjsKLQotICAgIC8qIHRoaXMgd2lsbCByZW1vdmUgYWxsIEZUQ19TaXplTm9kZSB0aGF0IGNvcnJlc3BvbmQgdG8KLSAgICAgKiB0aGUgZmFjZV9pZCBhcyB3ZWxsCi0gICAgICovCi0gICAgRlRDX01ydUxpc3RfUmVtb3ZlU2VsZWN0aW9uKCAmbWFuYWdlci0+ZmFjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGNfZmFjZV9ub2RlX2NvbXBhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2lkICk7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgbWFuYWdlci0+bnVtX2NhY2hlczsgbm4rKyApCi0gICAgICBGVENfQ2FjaGVfUmVtb3ZlRmFjZUlEKCBtYW5hZ2VyLT5jYWNoZXNbbm5dLCBmYWNlX2lkICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWNoZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUQ19Ob2RlX1VucmVmKCBGVENfTm9kZSAgICAgbm9kZSwKLSAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICkKLSAgewotICAgIGlmICggbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBtYW5hZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIChGVF9VSW50KW5vZGUtPmNhY2hlX2luZGV4IDwgbWFuYWdlci0+bnVtX2NhY2hlcyApCi0gICAgICBub2RlLT5yZWZfY291bnQtLTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y21hbmFnLmggYi9zcmMvY2FjaGUvZnRjbWFuYWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2ODQyZS4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjbWFuYWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNtYW5hZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQ2FjaGUgTWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIGNhY2hlIG1hbmFnZXIgaXMgaW4gY2hhcmdlIG9mIHRoZSBmb2xsb3dpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIE1haW50YWluIGEgbWFwcGluZyBiZXR3ZWVuIGdlbmVyaWMgRlRDX0ZhY2VJRHMgYW5kIGxpdmUgRlRfRmFjZSAgICAqLwotICAvKiAgICBvYmplY3RzLiAgVGhlIG1hcHBpbmcgaXRzZWxmIGlzIHBlcmZvcm1lZCB0aHJvdWdoIGEgdXNlci1wcm92aWRlZCAgKi8KLSAgLyogICAgY2FsbGJhY2suICBIb3dldmVyLCB0aGUgbWFuYWdlciBtYWludGFpbnMgYSBzbWFsbCBjYWNoZSBvZiBGVF9GYWNlICovCi0gIC8qICAgIGFuZCBGVF9TaXplIG9iamVjdHMgaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhpbmdzIGNvbnNpZGVyYWJseS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gTWFuYWdlIG9uZSBvciBtb3JlIGNhY2hlIG9iamVjdHMuICBFYWNoIGNhY2hlIGlzIGluIGNoYXJnZSBvZiAgICAgICovCi0gIC8qICAgIGhvbGRpbmcgYSB2YXJ5aW5nIG51bWJlciBvZiBgY2FjaGUgbm9kZXMnLiAgRWFjaCBjYWNoZSBub2RlICAgICAgICAqLwotICAvKiAgICByZXByZXNlbnRzIGEgbWluaW1hbCBhbW91bnQgb2YgaW5kaXZpZHVhbGx5IGFjY2Vzc2libGUgY2FjaGVkICAgICAgKi8KLSAgLyogICAgZGF0YS4gIEZvciBleGFtcGxlLCBhIGNhY2hlIG5vZGUgY2FuIGJlIGFuIEZUX0dseXBoIGltYWdlICAgICAgICAgICovCi0gIC8qICAgIGNvbnRhaW5pbmcgYSB2ZWN0b3Igb3V0bGluZSwgb3Igc29tZSBnbHlwaCBtZXRyaWNzLCBvciBhbnl0aGluZyAgICAqLwotICAvKiAgICBlbHNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVhY2ggY2FjaGUgbm9kZSBoYXMgYSBjZXJ0YWluIHNpemUgaW4gYnl0ZXMgdGhhdCBpcyBhZGRlZCB0byB0aGUgICAqLwotICAvKiAgICB0b3RhbCBhbW91bnQgb2YgYGNhY2hlIG1lbW9yeScgd2l0aGluIHRoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsbCBjYWNoZSBub2RlcyBhcmUgbG9jYXRlZCBpbiBhIGdsb2JhbCBMUlUgbGlzdCwgd2hlcmUgdGhlIG9sZGVzdCAqLwotICAvKiAgICBub2RlIGlzIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVhY2ggbm9kZSBiZWxvbmdzIHRvIGEgc2luZ2xlIGNhY2hlLCBhbmQgaW5jbHVkZXMgYSByZWZlcmVuY2UgICAgICAqLwotICAvKiAgICBjb3VudCB0byBhdm9pZCBkZXN0cm95aW5nIGl0IChkdWUgdG8gY2FjaGluZykuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiAgICAgICAgICAgICBXQVJOSU5HLCBUSElTIElTIEJFVEEgQ09ERS4gICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVENNQU5BR19IXwotI2RlZmluZSBGVENNQU5BR19IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ0FDSEVfSAotI2luY2x1ZGUgImZ0Y21ydS5oIgotI2luY2x1ZGUgImZ0Y2NhY2hlLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYWNoZV9zdWJzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRDX01BWF9GQUNFU19ERUZBVUxUICAyCi0jZGVmaW5lIEZUQ19NQVhfU0laRVNfREVGQVVMVCAgNAotI2RlZmluZSBGVENfTUFYX0JZVEVTX0RFRkFVTFQgIDIwMDAwMEwgIC8qIH4yMDBrQnl0ZSBieSBkZWZhdWx0ICovCi0KLSAgLyogbWF4aW11bSBudW1iZXIgb2YgY2FjaGVzIHJlZ2lzdGVyZWQgaW4gYSBzaW5nbGUgbWFuYWdlciAqLwotI2RlZmluZSBGVENfTUFYX0NBQ0hFUyAgICAgICAgIDE2Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRDX01hbmFnZXJSZWNfCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnk7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnk7Ci0KLSAgICBGVENfTm9kZSAgICAgICAgICAgIG5vZGVzX2xpc3Q7Ci0gICAgRlRfT2Zmc2V0ICAgICAgICAgICBtYXhfd2VpZ2h0OwotICAgIEZUX09mZnNldCAgICAgICAgICAgY3VyX3dlaWdodDsKLSAgICBGVF9VSW50ICAgICAgICAgICAgIG51bV9ub2RlczsKLQotICAgIEZUQ19DYWNoZSAgICAgICAgICAgY2FjaGVzW0ZUQ19NQVhfQ0FDSEVTXTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgIG51bV9jYWNoZXM7Ci0KLSAgICBGVENfTXJ1TGlzdFJlYyAgICAgIGZhY2VzOwotICAgIEZUQ19NcnVMaXN0UmVjICAgICAgc2l6ZXM7Ci0KLSAgICBGVF9Qb2ludGVyICAgICAgICAgIHJlcXVlc3RfZGF0YTsKLSAgICBGVENfRmFjZV9SZXF1ZXN0ZXIgIHJlcXVlc3RfZmFjZTsKLQotICB9IEZUQ19NYW5hZ2VyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfQ29tcHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgY2FjaGUgbWFuYWdlciBpZiAgICovCi0gIC8qICAgIGl0cyBgbnVtX2J5dGVzJyBmaWVsZCBpcyBncmVhdGVyIHRoYW4gaXRzIGBtYXhfYnl0ZXMnIGZpZWxkLiAgSXQgICAqLwotICAvKiAgICB3aWxsIGZsdXNoIGFzIG1hbnkgb2xkIGNhY2hlIG5vZGVzIGFzIHBvc3NpYmxlIChpZ25vcmluZyBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZXMgd2l0aCBhIG5vbi16ZXJvIHJlZmVyZW5jZSBjb3VudCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4gIEl0IGlzICovCi0gIC8qICAgIG5vcm1hbGx5IGludm9rZWQgYnkgc3BlY2lmaWMgY2FjaGUgaW1wbGVtZW50YXRpb25zLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlYXNvbiB0aGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGlzIHRvIGFsbG93IGNsaWVudC1zcGVjaWZpYyAgICovCi0gIC8qICAgIGNhY2hlIGNsYXNzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBGVENfTWFuYWdlcl9Db21wcmVzcyggRlRDX01hbmFnZXIgIG1hbmFnZXIgKTsKLQotCi0gIC8qIHRyeSB0byBmbHVzaCBgY291bnQnIG9sZCBub2RlcyBmcm9tIHRoZSBjYWNoZTsgcmV0dXJuIHRoZSBudW1iZXIKLSAgICogb2YgcmVhbGx5IGZsdXNoZWQgbm9kZXMKLSAgICovCi0gIEZUX0xPQ0FMKCBGVF9VSW50ICkKLSAgRlRDX01hbmFnZXJfRmx1c2hOKCBGVENfTWFuYWdlciAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgY291bnQgKTsKLQotCi0gIC8qIHRoaXMgbXVzdCBiZSB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBtb21lbnQgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgRlRDX01hbmFnZXJfUmVnaXN0ZXJDYWNoZSggRlRDX01hbmFnZXIgICAgICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGVDbGFzcyAgIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICAgICAgKmFjYWNoZSApOwotCi0gLyogKi8KLQotI2RlZmluZSBGVENfU0NBTEVSX0NPTVBBUkUoIGEsIGIgKSAgICAgICAgICAgICAgICBcCi0gICAgKCAoYSktPmZhY2VfaWQgICAgICA9PSAoYiktPmZhY2VfaWQgICAgICAmJiAgIFwKLSAgICAgIChhKS0+d2lkdGggICAgICAgID09IChiKS0+d2lkdGggICAgICAgICYmICAgXAotICAgICAgKGEpLT5oZWlnaHQgICAgICAgPT0gKGIpLT5oZWlnaHQgICAgICAgJiYgICBcCi0gICAgICAoKGEpLT5waXhlbCAhPSAwKSA9PSAoKGIpLT5waXhlbCAhPSAwKSAmJiAgIFwKLSAgICAgICggKGEpLT5waXhlbCB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoIChhKS0+eF9yZXMgPT0gKGIpLT54X3JlcyAmJiAgICAgICAgICAgICBcCi0gICAgICAgICAgKGEpLT55X3JlcyA9PSAoYiktPnlfcmVzICkgKSApCi0KLSNkZWZpbmUgRlRDX1NDQUxFUl9IQVNIKCBxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKCBGVENfRkFDRV9JRF9IQVNIKCAocSktPmZhY2VfaWQgKSArICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHEpLT53aWR0aCArIChxKS0+aGVpZ2h0KjcgKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICggKHEpLT5waXhlbCA/IDAgOiAoIChxKS0+eF9yZXMqMzMgXiAocSktPnlfcmVzKjYxICkgKSApCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVENNQU5BR19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y21ydS5jIGIvc3JjL2NhY2hlL2Z0Y21ydS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjkzMjY5Li4wMDAwMDAwCi0tLSBhL3NyYy9jYWNoZS9mdGNtcnUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNtcnUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgTVJVIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ0FDSEVfSAotI2luY2x1ZGUgImZ0Y21ydS5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJmdGNlcnJvci5oIgotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgRlRDX01ydU5vZGVfUHJlcGVuZCggRlRDX01ydU5vZGUgICpwbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRDX01ydU5vZGUgICBub2RlICkKLSAgewotICAgIEZUQ19NcnVOb2RlICBmaXJzdCA9ICpwbGlzdDsKLQotCi0gICAgaWYgKCBmaXJzdCApCi0gICAgewotICAgICAgRlRDX01ydU5vZGUgIGxhc3QgPSBmaXJzdC0+cHJldjsKLQotCi0jaWZkZWYgRlRfREVCVUdfRVJST1IKLSAgICAgIHsKLSAgICAgICAgRlRDX01ydU5vZGUgIGNub2RlID0gZmlyc3Q7Ci0KLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBjbm9kZSA9PSBub2RlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJGVENfTXJ1Tm9kZV9QcmVwZW5kOiBpbnZhbGlkIGFjdGlvblxuIiApOwotICAgICAgICAgICAgZXhpdCggMiApOwotICAgICAgICAgIH0KLSAgICAgICAgICBjbm9kZSA9IGNub2RlLT5uZXh0OwotCi0gICAgICAgIH0gd2hpbGUgKCBjbm9kZSAhPSBmaXJzdCApOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGZpcnN0LT5wcmV2ID0gbm9kZTsKLSAgICAgIGxhc3QtPm5leHQgID0gbm9kZTsKLSAgICAgIG5vZGUtPm5leHQgID0gZmlyc3Q7Ci0gICAgICBub2RlLT5wcmV2ICA9IGxhc3Q7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBub2RlLT5uZXh0ID0gbm9kZTsKLSAgICAgIG5vZGUtPnByZXYgPSBub2RlOwotICAgIH0KLSAgICAqcGxpc3QgPSBub2RlOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBGVENfTXJ1Tm9kZV9VcCggRlRDX01ydU5vZGUgICpwbGlzdCwKLSAgICAgICAgICAgICAgICAgIEZUQ19NcnVOb2RlICAgbm9kZSApCi0gIHsKLSAgICBGVENfTXJ1Tm9kZSAgZmlyc3QgPSAqcGxpc3Q7Ci0KLQotICAgIEZUX0FTU0VSVCggZmlyc3QgKTsKLQotICAgIGlmICggZmlyc3QgIT0gbm9kZSApCi0gICAgewotICAgICAgRlRDX01ydU5vZGUgIHByZXYsIG5leHQsIGxhc3Q7Ci0KLQotI2lmZGVmIEZUX0RFQlVHX0VSUk9SCi0gICAgICB7Ci0gICAgICAgIEZUQ19NcnVOb2RlICBjbm9kZSA9IGZpcnN0OwotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBjbm9kZSA9PSBub2RlICkKLSAgICAgICAgICAgIGdvdG8gT2s7Ci0gICAgICAgICAgY25vZGUgPSBjbm9kZS0+bmV4dDsKLQotICAgICAgICB9IHdoaWxlICggY25vZGUgIT0gZmlyc3QgKTsKLQotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJGVENfTXJ1Tm9kZV9VcDogaW52YWxpZCBhY3Rpb25cbiIgKTsKLSAgICAgICAgZXhpdCggMiApOwotICAgICAgT2s6Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIHByZXYgPSBub2RlLT5wcmV2OwotICAgICAgbmV4dCA9IG5vZGUtPm5leHQ7Ci0KLSAgICAgIHByZXYtPm5leHQgPSBuZXh0OwotICAgICAgbmV4dC0+cHJldiA9IHByZXY7Ci0KLSAgICAgIGxhc3QgPSBmaXJzdC0+cHJldjsKLQotICAgICAgbGFzdC0+bmV4dCAgPSBub2RlOwotICAgICAgZmlyc3QtPnByZXYgPSBub2RlOwotCi0gICAgICBub2RlLT5uZXh0ID0gZmlyc3Q7Ci0gICAgICBub2RlLT5wcmV2ID0gbGFzdDsKLQotICAgICAgKnBsaXN0ID0gbm9kZTsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19NcnVOb2RlX1JlbW92ZSggRlRDX01ydU5vZGUgICpwbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVENfTXJ1Tm9kZSAgIG5vZGUgKQotICB7Ci0gICAgRlRDX01ydU5vZGUgIGZpcnN0ID0gKnBsaXN0OwotICAgIEZUQ19NcnVOb2RlICBwcmV2LCBuZXh0OwotCi0KLSAgICBGVF9BU1NFUlQoIGZpcnN0ICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19FUlJPUgotICAgICAgewotICAgICAgICBGVENfTXJ1Tm9kZSAgY25vZGUgPSBmaXJzdDsKLQotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGNub2RlID09IG5vZGUgKQotICAgICAgICAgICAgZ290byBPazsKLSAgICAgICAgICBjbm9kZSA9IGNub2RlLT5uZXh0OwotCi0gICAgICAgIH0gd2hpbGUgKCBjbm9kZSAhPSBmaXJzdCApOwotCi0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkZUQ19NcnVOb2RlX1JlbW92ZTogaW52YWxpZCBhY3Rpb25cbiIgKTsKLSAgICAgICAgZXhpdCggMiApOwotICAgICAgT2s6Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgIHByZXYgPSBub2RlLT5wcmV2OwotICAgIG5leHQgPSBub2RlLT5uZXh0OwotCi0gICAgcHJldi0+bmV4dCA9IG5leHQ7Ci0gICAgbmV4dC0+cHJldiA9IHByZXY7Ci0KLSAgICBpZiAoIG5vZGUgPT0gbmV4dCApCi0gICAgewotICAgICAgRlRfQVNTRVJUKCBmaXJzdCA9PSBub2RlICk7Ci0gICAgICBGVF9BU1NFUlQoIHByZXYgID09IG5vZGUgKTsKLQotICAgICAgKnBsaXN0ID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG5vZGUgPT0gZmlyc3QgKQotICAgICAgKnBsaXN0ID0gbmV4dDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgRlRDX01ydUxpc3RfSW5pdCggRlRDX01ydUxpc3QgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgRlRDX01ydUxpc3RDbGFzcyAgY2xhenosCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIG1heF9ub2RlcywKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5ICkKLSAgewotICAgIGxpc3QtPm51bV9ub2RlcyA9IDA7Ci0gICAgbGlzdC0+bWF4X25vZGVzID0gbWF4X25vZGVzOwotICAgIGxpc3QtPm5vZGVzICAgICA9IE5VTEw7Ci0gICAgbGlzdC0+Y2xhenogICAgID0gKmNsYXp6OwotICAgIGxpc3QtPmRhdGEgICAgICA9IGRhdGE7Ci0gICAgbGlzdC0+bWVtb3J5ICAgID0gbWVtb3J5OwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBGVENfTXJ1TGlzdF9SZXNldCggRlRDX01ydUxpc3QgIGxpc3QgKQotICB7Ci0gICAgd2hpbGUgKCBsaXN0LT5ub2RlcyApCi0gICAgICBGVENfTXJ1TGlzdF9SZW1vdmUoIGxpc3QsIGxpc3QtPm5vZGVzICk7Ci0KLSAgICBGVF9BU1NFUlQoIGxpc3QtPm51bV9ub2RlcyA9PSAwICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19NcnVMaXN0X0RvbmUoIEZUQ19NcnVMaXN0ICBsaXN0ICkKLSAgewotICAgIEZUQ19NcnVMaXN0X1Jlc2V0KCBsaXN0ICk7Ci0gIH0KLQotCi0jaWZuZGVmIEZUQ19JTkxJTkUKLSAgRlRfTE9DQUxfREVGKCBGVENfTXJ1Tm9kZSApCi0gIEZUQ19NcnVMaXN0X0ZpbmQoIEZUQ19NcnVMaXN0ICBsaXN0LAotICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAga2V5ICkKLSAgewotICAgIEZUQ19NcnVOb2RlX0NvbXBhcmVGdW5jICBjb21wYXJlID0gbGlzdC0+Y2xhenoubm9kZV9jb21wYXJlOwotICAgIEZUQ19NcnVOb2RlICAgICAgICAgICAgICBmaXJzdCwgbm9kZTsKLQotCi0gICAgZmlyc3QgPSBsaXN0LT5ub2RlczsKLSAgICBub2RlICA9IE5VTEw7Ci0KLSAgICBpZiAoIGZpcnN0ICkKLSAgICB7Ci0gICAgICBub2RlID0gZmlyc3Q7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICBpZiAoIGNvbXBhcmUoIG5vZGUsIGtleSApICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggbm9kZSAhPSBmaXJzdCApCi0gICAgICAgICAgICBGVENfTXJ1Tm9kZV9VcCggJmxpc3QtPm5vZGVzLCBub2RlICk7Ci0KLSAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotCi0gICAgICB9IHdoaWxlICggbm9kZSAhPSBmaXJzdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSNlbmRpZgotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBGVENfTXJ1TGlzdF9OZXcoIEZUQ19NcnVMaXN0ICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgIGtleSwKLSAgICAgICAgICAgICAgICAgICBGVENfTXJ1Tm9kZSAgKmFub2RlICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVENfTXJ1Tm9kZSAgbm9kZSAgID0gTlVMTDsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5ID0gbGlzdC0+bWVtb3J5OwotCi0KLSAgICBpZiAoIGxpc3QtPm51bV9ub2RlcyA+PSBsaXN0LT5tYXhfbm9kZXMgJiYgbGlzdC0+bWF4X25vZGVzID4gMCApCi0gICAgewotICAgICAgbm9kZSA9IGxpc3QtPm5vZGVzLT5wcmV2OwotCi0gICAgICBGVF9BU1NFUlQoIG5vZGUgKTsKLQotICAgICAgaWYgKCBsaXN0LT5jbGF6ei5ub2RlX3Jlc2V0ICkKLSAgICAgIHsKLSAgICAgICAgRlRDX01ydU5vZGVfVXAoICZsaXN0LT5ub2Rlcywgbm9kZSApOwotCi0gICAgICAgIGVycm9yID0gbGlzdC0+Y2xhenoubm9kZV9yZXNldCggbm9kZSwga2V5LCBsaXN0LT5kYXRhICk7Ci0gICAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIEZUQ19NcnVOb2RlX1JlbW92ZSggJmxpc3QtPm5vZGVzLCBub2RlICk7Ci0gICAgICBsaXN0LT5udW1fbm9kZXMtLTsKLQotICAgICAgaWYgKCBsaXN0LT5jbGF6ei5ub2RlX2RvbmUgKQotICAgICAgICBsaXN0LT5jbGF6ei5ub2RlX2RvbmUoIG5vZGUsIGxpc3QtPmRhdGEgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIEZUX0FMTE9DKCBub2RlLCBsaXN0LT5jbGF6ei5ub2RlX3NpemUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IGxpc3QtPmNsYXp6Lm5vZGVfaW5pdCggbm9kZSwga2V5LCBsaXN0LT5kYXRhICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBGVENfTXJ1Tm9kZV9QcmVwZW5kKCAmbGlzdC0+bm9kZXMsIG5vZGUgKTsKLSAgICBsaXN0LT5udW1fbm9kZXMrKzsKLQotICBFeGl0OgotICAgICphbm9kZSA9IG5vZGU7Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEZhaWw6Ci0gICAgaWYgKCBsaXN0LT5jbGF6ei5ub2RlX2RvbmUgKQotICAgICAgbGlzdC0+Y2xhenoubm9kZV9kb25lKCBub2RlLCBsaXN0LT5kYXRhICk7Ci0KLSAgICBGVF9GUkVFKCBub2RlICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotI2lmbmRlZiBGVENfSU5MSU5FCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBGVENfTXJ1TGlzdF9Mb29rdXAoIEZUQ19NcnVMaXN0ICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICBGVENfTXJ1Tm9kZSAgKmFub2RlICkKLSAgewotICAgIEZUQ19NcnVOb2RlICBub2RlOwotCi0KLSAgICBub2RlID0gRlRDX01ydUxpc3RfRmluZCggbGlzdCwga2V5ICk7Ci0gICAgaWYgKCAhbm9kZSApCi0gICAgICByZXR1cm4gRlRDX01ydUxpc3RfTmV3KCBsaXN0LCBrZXksIGFub2RlICk7Ci0KLSAgICAqYW5vZGUgPSBub2RlOwotICAgIHJldHVybiAwOwotICB9Ci0jZW5kaWYgLyogRlRDX0lOTElORSAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19NcnVMaXN0X1JlbW92ZSggRlRDX01ydUxpc3QgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgRlRDX01ydU5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRDX01ydU5vZGVfUmVtb3ZlKCAmbGlzdC0+bm9kZXMsIG5vZGUgKTsKLSAgICBsaXN0LT5udW1fbm9kZXMtLTsKLQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlzdC0+bWVtb3J5OwotCi0KLSAgICAgIGlmICggbGlzdC0+Y2xhenoubm9kZV9kb25lICkKLSAgICAgICAgbGlzdC0+Y2xhenoubm9kZV9kb25lKCBub2RlLCBsaXN0LT5kYXRhICk7Ci0KLSAgICAgIEZUX0ZSRUUoIG5vZGUgKTsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19NcnVMaXN0X1JlbW92ZVNlbGVjdGlvbiggRlRDX01ydUxpc3QgICAgICAgICAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX01ydU5vZGVfQ29tcGFyZUZ1bmMgIHNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgICAgICAgICAga2V5ICkKLSAgewotICAgIEZUQ19NcnVOb2RlICBmaXJzdCwgbm9kZSwgbmV4dDsKLQotCi0gICAgZmlyc3QgPSBsaXN0LT5ub2RlczsKLSAgICB3aGlsZSAoIGZpcnN0ICYmICggIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24oIGZpcnN0LCBrZXkgKSApICkKLSAgICB7Ci0gICAgICBGVENfTXJ1TGlzdF9SZW1vdmUoIGxpc3QsIGZpcnN0ICk7Ci0gICAgICBmaXJzdCA9IGxpc3QtPm5vZGVzOwotICAgIH0KLQotICAgIGlmICggZmlyc3QgKQotICAgIHsKLSAgICAgIG5vZGUgPSBmaXJzdC0+bmV4dDsKLSAgICAgIHdoaWxlICggbm9kZSAhPSBmaXJzdCApCi0gICAgICB7Ci0gICAgICAgIG5leHQgPSBub2RlLT5uZXh0OwotCi0gICAgICAgIGlmICggc2VsZWN0aW9uKCBub2RlLCBrZXkgKSApCi0gICAgICAgICAgRlRDX01ydUxpc3RfUmVtb3ZlKCBsaXN0LCBub2RlICk7Ci0KLSAgICAgICAgbm9kZSA9IG5leHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjbXJ1LmggYi9zcmMvY2FjaGUvZnRjbXJ1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YzMzMGQuLjAwMDAwMDAKLS0tIGEvc3JjL2NhY2hlL2Z0Y21ydS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y21ydS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTaW1wbGUgTVJVIGxpc3QtY2FjaGUgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFuIE1SVSBpcyBhIGxpc3QgdGhhdCBjYW5ub3QgaG9sZCBtb3JlIHRoYW4gYSBjZXJ0YWluIG51bWJlciBvZiAgICAgICAqLwotICAvKiBlbGVtZW50cyAoYG1heF9lbGVtZW50cycpLiAgQWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFyZSBzb3J0ZWQgaW4gICAgKi8KLSAgLyogbGVhc3QtcmVjZW50bHktdXNlZCBvcmRlciwgaS5lLiwgdGhlIGBvbGRlc3QnIGVsZW1lbnQgaXMgYXQgdGhlIHRhaWwgICovCi0gIC8qIG9mIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2hlbiBkb2luZyBhIGxvb2t1cCAoZWl0aGVyIHRocm91Z2ggYExvb2t1cCgpJyBvciBgTG9va3VwX05vZGUoKScpLCAgICovCi0gIC8qIHRoZSBsaXN0IGlzIHNlYXJjaGVkIGZvciBhbiBlbGVtZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcga2V5LiAgSWYgICAqLwotICAvKiBpdCBpcyBmb3VuZCwgdGhlIGVsZW1lbnQgaXMgbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QgYW5kIGlzICAgICAgKi8KLSAgLyogcmV0dXJuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaXMgZm91bmQsIHRoZSBsb29rdXAgcm91dGluZSB3aWxsIHRyeSB0byAgKi8KLSAgLyogb2J0YWluIGEgbmV3IGVsZW1lbnQgd2l0aCB0aGUgcmVsZXZhbnQga2V5LiAgSWYgdGhlIGxpc3QgaXMgYWxyZWFkeSAgICovCi0gIC8qIGZ1bGwsIHRoZSBvbGRlc3QgZWxlbWVudCBmcm9tIHRoZSBsaXN0IGlzIGRpc2NhcmRlZCBhbmQgcmVwbGFjZWQgYnkgYSAqLwotICAvKiBuZXcgb25lOyBhIG5ldyBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBsaXN0IG90aGVyd2lzZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBwcmUtYWxsb2NhdGUgdGhlIGVsZW1lbnQgbGlzdCBub2Rlcy4gICAgICAqLwotICAvKiBUaGlzIGlzIGhhbmR5IGlmIGBtYXhfZWxlbWVudHMnIGlzIHN1ZmZpY2llbnRseSBzbWFsbCwgYXMgaXQgc2F2ZXMgICAgKi8KLSAgLyogYWxsb2NhdGlvbnMvcmVsZWFzZXMgZHVyaW5nIHRoZSBsb29rdXAgcHJvY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUQ01SVV9IXwotI2RlZmluZSBGVENNUlVfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLSNkZWZpbmUgIHh4RlRfREVCVUdfRVJST1IKLSNkZWZpbmUgIEZUQ19JTkxJTkUKLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX01ydU5vZGVSZWNfKiAgRlRDX01ydU5vZGU7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19NcnVOb2RlUmVjXwotICB7Ci0gICAgRlRDX01ydU5vZGUgIG5leHQ7Ci0gICAgRlRDX01ydU5vZGUgIHByZXY7Ci0KLSAgfSBGVENfTXJ1Tm9kZVJlYzsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX01ydU5vZGVfUHJlcGVuZCggRlRDX01ydU5vZGUgICpwbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRDX01ydU5vZGUgICBub2RlICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBGVENfTXJ1Tm9kZV9VcCggRlRDX01ydU5vZGUgICpwbGlzdCwKLSAgICAgICAgICAgICAgICAgIEZUQ19NcnVOb2RlICAgbm9kZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX01ydU5vZGVfUmVtb3ZlKCBGVENfTXJ1Tm9kZSAgKnBsaXN0LAotICAgICAgICAgICAgICAgICAgICAgIEZUQ19NcnVOb2RlICAgbm9kZSApOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX01ydUxpc3RSZWNfKiAgICAgICAgICAgICAgRlRDX01ydUxpc3Q7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX01ydUxpc3RDbGFzc1JlY18gY29uc3QgKiAgRlRDX01ydUxpc3RDbGFzczsKLQotCi0gIHR5cGVkZWYgRlRfQm9vbAotICAoKkZUQ19NcnVOb2RlX0NvbXBhcmVGdW5jKSggRlRDX01ydU5vZGUgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAga2V5ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUQ19NcnVOb2RlX0luaXRGdW5jKSggRlRDX01ydU5vZGUgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGRhdGEgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRDX01ydU5vZGVfUmVzZXRGdW5jKSggRlRDX01ydU5vZGUgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZGF0YSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUQ19NcnVOb2RlX0RvbmVGdW5jKSggRlRDX01ydU5vZGUgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZGF0YSApOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19NcnVMaXN0Q2xhc3NSZWNfCi0gIHsKLSAgICBGVF9PZmZzZXQgICAgICAgICAgICAgICAgbm9kZV9zaXplOwotCi0gICAgRlRDX01ydU5vZGVfQ29tcGFyZUZ1bmMgIG5vZGVfY29tcGFyZTsKLSAgICBGVENfTXJ1Tm9kZV9Jbml0RnVuYyAgICAgbm9kZV9pbml0OwotICAgIEZUQ19NcnVOb2RlX1Jlc2V0RnVuYyAgICBub2RlX3Jlc2V0OwotICAgIEZUQ19NcnVOb2RlX0RvbmVGdW5jICAgICBub2RlX2RvbmU7Ci0KLSAgfSBGVENfTXJ1TGlzdENsYXNzUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19NcnVMaXN0UmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgbnVtX25vZGVzOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIG1heF9ub2RlczsKLSAgICBGVENfTXJ1Tm9kZSAgICAgICAgICBub2RlczsKLSAgICBGVF9Qb2ludGVyICAgICAgICAgICBkYXRhOwotICAgIEZUQ19NcnVMaXN0Q2xhc3NSZWMgIGNsYXp6OwotICAgIEZUX01lbW9yeSAgICAgICAgICAgIG1lbW9yeTsKLQotICB9IEZUQ19NcnVMaXN0UmVjOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBGVENfTXJ1TGlzdF9Jbml0KCBGVENfTXJ1TGlzdCAgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgICBGVENfTXJ1TGlzdENsYXNzICBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgbWF4X25vZGVzLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnkgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIEZUQ19NcnVMaXN0X1Jlc2V0KCBGVENfTXJ1TGlzdCAgbGlzdCApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBGVENfTXJ1TGlzdF9Eb25lKCBGVENfTXJ1TGlzdCAgbGlzdCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgRlRDX01ydUxpc3RfTmV3KCBGVENfTXJ1TGlzdCAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICBrZXksCi0gICAgICAgICAgICAgICAgICAgRlRDX01ydU5vZGUgICphbm9kZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX01ydUxpc3RfUmVtb3ZlKCBGVENfTXJ1TGlzdCAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVENfTXJ1Tm9kZSAgbm9kZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgRlRDX01ydUxpc3RfUmVtb3ZlU2VsZWN0aW9uKCBGVENfTXJ1TGlzdCAgICAgICAgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTXJ1Tm9kZV9Db21wYXJlRnVuYyAgc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgICAgICAgICAgICBrZXkgKTsKLQotCi0jaWZkZWYgRlRDX0lOTElORQotCi0jZGVmaW5lIEZUQ19NUlVMSVNUX0xPT0tVUF9DTVAoIGxpc3QsIGtleSwgY29tcGFyZSwgbm9kZSwgZXJyb3IgKSAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVENfTXJ1Tm9kZSogICAgICAgICAgICAgX3BmaXJzdCAgPSAmKGxpc3QpLT5ub2RlczsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRDX01ydU5vZGVfQ29tcGFyZUZ1bmMgIF9jb21wYXJlID0gKEZUQ19NcnVOb2RlX0NvbXBhcmVGdW5jKShjb21wYXJlKTsgXAotICAgIEZUQ19NcnVOb2RlICAgICAgICAgICAgICBfZmlyc3QsIF9ub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVycm9yICA9IEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfZmlyc3QgPSAqKF9wZmlyc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX25vZGUgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIF9maXJzdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgX25vZGUgPSBfZmlyc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoIF9jb21wYXJlKCBfbm9kZSwgKGtleSkgKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKCBfbm9kZSAhPSBfZmlyc3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRDX01ydU5vZGVfVXAoIF9wZmlyc3QsIF9ub2RlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbm9kZSA9IF9ub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdvdG8gTXJ1T2tfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9ub2RlID0gX25vZGUtPm5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gd2hpbGUgKCBfbm9kZSAhPSBfZmlyc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlcnJvciA9IEZUQ19NcnVMaXN0X05ldyggKGxpc3QpLCAoa2V5KSwgKEZUQ19NcnVOb2RlKikodm9pZCopJihub2RlKSApOyBcCi0gIE1ydU9rXzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLSNkZWZpbmUgRlRDX01SVUxJU1RfTE9PS1VQKCBsaXN0LCBrZXksIG5vZGUsIGVycm9yICkgXAotICBGVENfTVJVTElTVF9MT09LVVBfQ01QKCBsaXN0LCBrZXksIChsaXN0KS0+Y2xhenoubm9kZV9jb21wYXJlLCBub2RlLCBlcnJvciApCi0KLSNlbHNlICAvKiAhRlRDX0lOTElORSAqLwotCi0gIEZUX0xPQ0FMKCBGVENfTXJ1Tm9kZSApCi0gIEZUQ19NcnVMaXN0X0ZpbmQoIEZUQ19NcnVMaXN0ICBsaXN0LAotICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAga2V5ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgRlRDX01ydUxpc3RfTG9va3VwKCBGVENfTXJ1TGlzdCAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgRlRDX01ydU5vZGUgICpwbm9kZSApOwotCi0jZGVmaW5lIEZUQ19NUlVMSVNUX0xPT0tVUCggbGlzdCwga2V5LCBub2RlLCBlcnJvciApIFwKLSAgZXJyb3IgPSBGVENfTXJ1TGlzdF9Mb29rdXAoIChsaXN0KSwgKGtleSksIChGVENfTXJ1Tm9kZSopJihub2RlKSApCi0KLSNlbmRpZiAvKiAhRlRDX0lOTElORSAqLwotCi0KLSNkZWZpbmUgRlRDX01SVUxJU1RfTE9PUCggbGlzdCwgbm9kZSApICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUQ19NcnVOb2RlICBfZmlyc3QgPSAobGlzdCktPm5vZGVzOyAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggX2ZpcnN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVENfTXJ1Tm9kZSAgX25vZGUgPSBfZmlyc3Q7ICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKihGVENfTXJ1Tm9kZSopJihub2RlKSA9IF9ub2RlOwotCi0KLSNkZWZpbmUgRlRDX01SVUxJU1RfTE9PUF9FTkQoKSAgICAgICAgICAgICAgIFwKLSAgICAgICAgX25vZGUgPSBfbm9kZS0+bmV4dDsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gd2hpbGUgKCBfbm9kZSAhPSBfZmlyc3QgKTsgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIEZUQ01SVV9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgYi9zcmMvY2FjaGUvZnRjc2JpdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5MzM2ZC4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvZnRjc2JpdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNzYml0cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc2JpdHMgbWFuYWdlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ0FDSEVfSAotI2luY2x1ZGUgImZ0Y3NiaXRzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNpbmNsdWRlICJmdGNjYmFjay5oIgotI2luY2x1ZGUgImZ0Y2Vycm9yLmgiCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2FjaGUKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIFNCSVQgQ0FDSEUgTk9ERVMgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0Y19zYml0X2NvcHlfYml0bWFwKCBGVENfU0JpdCAgICBzYml0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9JbnQgICAgcGl0Y2ggPSBiaXRtYXAtPnBpdGNoOwotICAgIEZUX1VMb25nICBzaXplOwotCi0KLSAgICBpZiAoIHBpdGNoIDwgMCApCi0gICAgICBwaXRjaCA9IC1waXRjaDsKLQotICAgIHNpemUgPSAoRlRfVUxvbmcpcGl0Y2ggKiBiaXRtYXAtPnJvd3M7Ci0gICAgaWYgKCAhc2l6ZSApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgaWYgKCAhRlRfQUxMT0MoIHNiaXQtPmJ1ZmZlciwgc2l6ZSApICkKLSAgICAgIEZUX01FTV9DT1BZKCBzYml0LT5idWZmZXIsIGJpdG1hcC0+YnVmZmVyLCBzaXplICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGZ0Y19zbm9kZV9mcmVlKCBGVENfTm9kZSAgIGZ0Y3Nub2RlLAotICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApCi0gIHsKLSAgICBGVENfU05vZGUgIHNub2RlICA9IChGVENfU05vZGUpZnRjc25vZGU7Ci0gICAgRlRDX1NCaXQgICBzYml0ICAgPSBzbm9kZS0+c2JpdHM7Ci0gICAgRlRfVUludCAgICBjb3VudCAgPSBzbm9kZS0+Y291bnQ7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBjYWNoZS0+bWVtb3J5OwotCi0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgc2JpdCsrLCBjb3VudC0tICkKLSAgICAgIEZUX0ZSRUUoIHNiaXQtPmJ1ZmZlciApOwotCi0gICAgRlRDX0dOb2RlX0RvbmUoIEZUQ19HTk9ERSggc25vZGUgKSwgY2FjaGUgKTsKLQotICAgIEZUX0ZSRUUoIHNub2RlICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIEZUQ19TTm9kZV9GcmVlKCBGVENfU05vZGUgIHNub2RlLAotICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICBjYWNoZSApCi0gIHsKLSAgICBmdGNfc25vZGVfZnJlZSggRlRDX05PREUoIHNub2RlICksIGNhY2hlICk7Ci0gIH0KLQotCi0gIC8qCi0gICAqICBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGxvYWQgYSBzbWFsbCBiaXRtYXAgd2l0aGluIGEgZ2l2ZW4gRlRDX1NOb2RlLgotICAgKiAgTm90ZSB0aGF0IGl0IHJldHVybnMgYSBub24temVybyBlcnJvciBjb2RlIF9vbmx5XyBpbiB0aGUgY2FzZSBvZgotICAgKiAgb3V0LW9mLW1lbW9yeSBjb25kaXRpb24uICBGb3IgYWxsIG90aGVyIGVycm9ycyAoZS5nLiwgY29ycmVzcG9uZGluZwotICAgKiAgdG8gYSBiYWQgZm9udCBmaWxlKSwgdGhpcyBmdW5jdGlvbiB3aWxsIG1hcmsgdGhlIHNiaXQgYXMgYHVuYXZhaWxhYmxlJwotICAgKiAgYW5kIHJldHVybiBhIHZhbHVlIG9mIDAuCi0gICAqCi0gICAqICBZb3Ugc2hvdWxkIGFsc28gcmVhZCB0aGUgY29tbWVudCB3aXRoaW4gdGhlIEBmdGNfc25vZGVfY29tcGFyZQotICAgKiAgZnVuY3Rpb24gYmVsb3cgdG8gc2VlIGhvdyBvdXQtb2YtbWVtb3J5IGlzIGhhbmRsZWQgZHVyaW5nIGEgbG9va3VwLgotICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0Y19zbm9kZV9sb2FkKCBGVENfU05vZGUgICAgc25vZGUsCi0gICAgICAgICAgICAgICAgICBGVENfTWFuYWdlciAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAqYXNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3I7Ci0gICAgRlRDX0dOb2RlICAgICAgICAgZ25vZGUgID0gRlRDX0dOT0RFKCBzbm9kZSApOwotICAgIEZUQ19GYW1pbHkgICAgICAgIGZhbWlseSA9IGdub2RlLT5mYW1pbHk7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5ID0gbWFuYWdlci0+bWVtb3J5OwotICAgIEZUX0ZhY2UgICAgICAgICAgIGZhY2U7Ci0gICAgRlRDX1NCaXQgICAgICAgICAgc2JpdDsKLSAgICBGVENfU0ZhbWlseUNsYXNzICBjbGF6ejsKLQotCi0gICAgaWYgKCAoRlRfVUludCkoZ2luZGV4IC0gZ25vZGUtPmdpbmRleCkgPj0gc25vZGUtPmNvdW50ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJmdGNfc25vZGVfbG9hZDogaW52YWxpZCBnbHlwaCBpbmRleCIgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICB9Ci0KLSAgICBzYml0ICA9IHNub2RlLT5zYml0cyArICggZ2luZGV4IC0gZ25vZGUtPmdpbmRleCApOwotICAgIGNsYXp6ID0gKEZUQ19TRmFtaWx5Q2xhc3MpZmFtaWx5LT5jbGF6ejsKLQotICAgIHNiaXQtPmJ1ZmZlciA9IDA7Ci0KLSAgICBlcnJvciA9IGNsYXp6LT5mYW1pbHlfbG9hZF9nbHlwaCggZmFtaWx5LCBnaW5kZXgsIG1hbmFnZXIsICZmYWNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEJhZEdseXBoOwotCi0gICAgewotICAgICAgRlRfSW50ICAgICAgICB0ZW1wOwotICAgICAgRlRfR2x5cGhTbG90ICBzbG90ICAgPSBmYWNlLT5nbHlwaDsKLSAgICAgIEZUX0JpdG1hcCogICAgYml0bWFwID0gJnNsb3QtPmJpdG1hcDsKLSAgICAgIEZUX1BvcyAgICAgICAgeGFkdmFuY2UsIHlhZHZhbmNlOyAvKiBGVF9HbHlwaFNsb3QtPmFkdmFuY2Uue3h8eX0gKi8KLQotCi0gICAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UwKCggImZ0Y19zbm9kZV9sb2FkOiIKLSAgICAgICAgICAgICAgICAgICAgIiBnbHlwaCBsb2FkZWQgZGlkbid0IHJldHVybiBhIGJpdG1hcFxuIiApKTsKLSAgICAgICAgZ290byBCYWRHbHlwaDsKLSAgICAgIH0KLQotICAgICAgLyogQ2hlY2sgd2hldGhlciBvdXIgdmFsdWVzIGZpdCBpbnRvIDgtYml0IGNvbnRhaW5lcnMhICAgICovCi0gICAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3VyIGJpdG1hcCBpcyB0b28gbGFyZ2UgICAgICAgKi8KLSAgICAgIC8qIGFuZCB3ZSB3aWxsIGxlYXZlIGl0IGFzIGBtaXNzaW5nJyB3aXRoIHNiaXQuYnVmZmVyID0gMCAqLwotCi0jZGVmaW5lIENIRUNLX0NIQVIoIGQgKSAgKCB0ZW1wID0gKEZUX0NoYXIpZCwgKEZUX0ludCkgdGVtcCA9PSAoRlRfSW50KSBkICkKLSNkZWZpbmUgQ0hFQ0tfQllURSggZCApICAoIHRlbXAgPSAoRlRfQnl0ZSlkLCAoRlRfVUludCl0ZW1wID09IChGVF9VSW50KWQgKQotCi0gICAgICAvKiBob3Jpem9udGFsIGFkdmFuY2UgaW4gcGl4ZWxzICovCi0gICAgICB4YWR2YW5jZSA9ICggc2xvdC0+YWR2YW5jZS54ICsgMzIgKSA+PiA2OwotICAgICAgeWFkdmFuY2UgPSAoIHNsb3QtPmFkdmFuY2UueSArIDMyICkgPj4gNjsKLQotICAgICAgaWYgKCAhQ0hFQ0tfQllURSggYml0bWFwLT5yb3dzICApICAgICB8fAotICAgICAgICAgICAhQ0hFQ0tfQllURSggYml0bWFwLT53aWR0aCApICAgICB8fAotICAgICAgICAgICAhQ0hFQ0tfQ0hBUiggYml0bWFwLT5waXRjaCApICAgICB8fAotICAgICAgICAgICAhQ0hFQ0tfQ0hBUiggc2xvdC0+Yml0bWFwX2xlZnQgKSB8fAotICAgICAgICAgICAhQ0hFQ0tfQ0hBUiggc2xvdC0+Yml0bWFwX3RvcCAgKSB8fAotICAgICAgICAgICAhQ0hFQ0tfQ0hBUiggeGFkdmFuY2UgKSAgICAgICAgICB8fAotICAgICAgICAgICAhQ0hFQ0tfQ0hBUiggeWFkdmFuY2UgKSAgICAgICAgICApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJmdGNfc25vZGVfbG9hZDoiCi0gICAgICAgICAgICAgICAgICAgICIgZ2x5cGggdG9vIGxhcmdlIGZvciBzbWFsbCBiaXRtYXAgY2FjaGVcbiIpKTsKLSAgICAgICAgZ290byBCYWRHbHlwaDsKLSAgICAgIH0KLQotICAgICAgc2JpdC0+d2lkdGggICAgID0gKEZUX0J5dGUpYml0bWFwLT53aWR0aDsKLSAgICAgIHNiaXQtPmhlaWdodCAgICA9IChGVF9CeXRlKWJpdG1hcC0+cm93czsKLSAgICAgIHNiaXQtPnBpdGNoICAgICA9IChGVF9DaGFyKWJpdG1hcC0+cGl0Y2g7Ci0gICAgICBzYml0LT5sZWZ0ICAgICAgPSAoRlRfQ2hhcilzbG90LT5iaXRtYXBfbGVmdDsKLSAgICAgIHNiaXQtPnRvcCAgICAgICA9IChGVF9DaGFyKXNsb3QtPmJpdG1hcF90b3A7Ci0gICAgICBzYml0LT54YWR2YW5jZSAgPSAoRlRfQ2hhcil4YWR2YW5jZTsKLSAgICAgIHNiaXQtPnlhZHZhbmNlICA9IChGVF9DaGFyKXlhZHZhbmNlOwotICAgICAgc2JpdC0+Zm9ybWF0ICAgID0gKEZUX0J5dGUpYml0bWFwLT5waXhlbF9tb2RlOwotICAgICAgc2JpdC0+bWF4X2dyYXlzID0gKEZUX0J5dGUpKGJpdG1hcC0+bnVtX2dyYXlzIC0gMSk7Ci0KLSAgICAgIC8qIGNvcHkgdGhlIGJpdG1hcCBpbnRvIGEgbmV3IGJ1ZmZlciAtLSBpZ25vcmUgZXJyb3IgKi8KLSAgICAgIGVycm9yID0gZnRjX3NiaXRfY29weV9iaXRtYXAoIHNiaXQsIGJpdG1hcCwgbWVtb3J5ICk7Ci0KLSAgICAgIC8qIG5vdywgY29tcHV0ZSBzaXplICovCi0gICAgICBpZiAoIGFzaXplICkKLSAgICAgICAgKmFzaXplID0gKEZUX1VMb25nKUZUX0FCUyggc2JpdC0+cGl0Y2ggKSAqIHNiaXQtPmhlaWdodDsKLQotICAgIH0gLyogZ2x5cGggbG9hZGluZyBzdWNjZXNzZnVsICovCi0KLSAgICAvKiBpZ25vcmUgdGhlIGVycm9ycyB0aGF0IG1pZ2h0IGhhdmUgb2NjdXJyZWQgLS0gICAqLwotICAgIC8qIHdlIG1hcmsgdW5sb2FkZWQgZ2x5cGhzIHdpdGggYHNiaXQuYnVmZmVyID09IDAnICovCi0gICAgLyogYW5kIGB3aWR0aCA9PSAyNTUnLCBgaGVpZ2h0ID09IDAnICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZXJyb3IgJiYgRlRfRVJSX05FUSggZXJyb3IsIE91dF9PZl9NZW1vcnkgKSApCi0gICAgewotICAgIEJhZEdseXBoOgotICAgICAgc2JpdC0+d2lkdGggID0gMjU1OwotICAgICAgc2JpdC0+aGVpZ2h0ID0gMDsKLSAgICAgIHNiaXQtPmJ1ZmZlciA9IE5VTEw7Ci0gICAgICBlcnJvciAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgICBpZiAoIGFzaXplICkKLSAgICAgICAgKmFzaXplID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBGVENfU05vZGVfTmV3KCBGVENfU05vZGUgICpwc25vZGUsCi0gICAgICAgICAgICAgICAgIEZUQ19HUXVlcnkgIGdxdWVyeSwKLSAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICAgY2FjaGUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gY2FjaGUtPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVENfU05vZGUgICBzbm9kZSAgPSBOVUxMOwotICAgIEZUX1VJbnQgICAgIGdpbmRleCA9IGdxdWVyeS0+Z2luZGV4OwotICAgIEZUQ19GYW1pbHkgIGZhbWlseSA9IGdxdWVyeS0+ZmFtaWx5OwotCi0gICAgRlRDX1NGYW1pbHlDbGFzcyAgY2xhenogPSBGVENfQ0FDSEVfU0ZBTUlMWV9DTEFTUyggY2FjaGUgKTsKLSAgICBGVF9VSW50ICAgICAgICAgICB0b3RhbDsKLSAgICBGVF9VSW50ICAgICAgICAgICBub2RlX2NvdW50OwotCi0KLSAgICB0b3RhbCA9IGNsYXp6LT5mYW1pbHlfZ2V0X2NvdW50KCBmYW1pbHksIGNhY2hlLT5tYW5hZ2VyICk7Ci0gICAgaWYgKCB0b3RhbCA9PSAwIHx8IGdpbmRleCA+PSB0b3RhbCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggIUZUX05FVyggc25vZGUgKSApCi0gICAgewotICAgICAgRlRfVUludCAgY291bnQsIHN0YXJ0OwotCi0KLSAgICAgIHN0YXJ0ID0gZ2luZGV4IC0gKCBnaW5kZXggJSBGVENfU0JJVF9JVEVNU19QRVJfTk9ERSApOwotICAgICAgY291bnQgPSB0b3RhbCAtIHN0YXJ0OwotICAgICAgaWYgKCBjb3VudCA+IEZUQ19TQklUX0lURU1TX1BFUl9OT0RFICkKLSAgICAgICAgY291bnQgPSBGVENfU0JJVF9JVEVNU19QRVJfTk9ERTsKLQotICAgICAgRlRDX0dOb2RlX0luaXQoIEZUQ19HTk9ERSggc25vZGUgKSwgc3RhcnQsIGZhbWlseSApOwotCi0gICAgICBzbm9kZS0+Y291bnQgPSBjb3VudDsKLSAgICAgIGZvciAoIG5vZGVfY291bnQgPSAwOyBub2RlX2NvdW50IDwgY291bnQ7IG5vZGVfY291bnQrKyApCi0gICAgICB7Ci0gICAgICAgIHNub2RlLT5zYml0c1tub2RlX2NvdW50XS53aWR0aCA9IDI1NTsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBmdGNfc25vZGVfbG9hZCggc25vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS0+bWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBGVENfU05vZGVfRnJlZSggc25vZGUsIGNhY2hlICk7Ci0gICAgICAgIHNub2RlID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICAqcHNub2RlID0gc25vZGU7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgZnRjX3Nub2RlX25ldyggRlRDX05vZGUgICAqZnRjcHNub2RlLAotICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBmdGNncXVlcnksCi0gICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgIGNhY2hlICkKLSAgewotICAgIEZUQ19TTm9kZSAgKnBzbm9kZSA9IChGVENfU05vZGUqKWZ0Y3Bzbm9kZTsKLSAgICBGVENfR1F1ZXJ5ICBncXVlcnkgPSAoRlRDX0dRdWVyeSlmdGNncXVlcnk7Ci0KLQotICAgIHJldHVybiBGVENfU05vZGVfTmV3KCBwc25vZGUsIGdxdWVyeSwgY2FjaGUgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9PZmZzZXQgKQotICBmdGNfc25vZGVfd2VpZ2h0KCBGVENfTm9kZSAgIGZ0Y3Nub2RlLAotICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgIGNhY2hlICkKLSAgewotICAgIEZUQ19TTm9kZSAgc25vZGUgPSAoRlRDX1NOb2RlKWZ0Y3Nub2RlOwotICAgIEZUX1VJbnQgICAgY291bnQgPSBzbm9kZS0+Y291bnQ7Ci0gICAgRlRDX1NCaXQgICBzYml0ICA9IHNub2RlLT5zYml0czsKLSAgICBGVF9JbnQgICAgIHBpdGNoOwotICAgIEZUX09mZnNldCAgc2l6ZTsKLQotICAgIEZUX1VOVVNFRCggY2FjaGUgKTsKLQotCi0gICAgRlRfQVNTRVJUKCBzbm9kZS0+Y291bnQgPD0gRlRDX1NCSVRfSVRFTVNfUEVSX05PREUgKTsKLQotICAgIC8qIHRoZSBub2RlIGl0c2VsZiAqLwotICAgIHNpemUgPSBzaXplb2YgKCAqc25vZGUgKTsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzYml0KysgKQotICAgIHsKLSAgICAgIGlmICggc2JpdC0+YnVmZmVyICkKLSAgICAgIHsKLSAgICAgICAgcGl0Y2ggPSBzYml0LT5waXRjaDsKLSAgICAgICAgaWYgKCBwaXRjaCA8IDAgKQotICAgICAgICAgIHBpdGNoID0gLXBpdGNoOwotCi0gICAgICAgIC8qIGFkZCB0aGUgc2l6ZSBvZiBhIGdpdmVuIGdseXBoIGltYWdlICovCi0gICAgICAgIHNpemUgKz0gKEZUX09mZnNldClwaXRjaCAqIHNiaXQtPmhlaWdodDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0KLSNpZiAwCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9PZmZzZXQgKQotICBGVENfU05vZGVfV2VpZ2h0KCBGVENfU05vZGUgIHNub2RlICkKLSAgewotICAgIHJldHVybiBmdGNfc25vZGVfd2VpZ2h0KCBGVENfTk9ERSggc25vZGUgKSwgTlVMTCApOwotICB9Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQotICBmdGNfc25vZGVfY29tcGFyZSggRlRDX05vZGUgICAgZnRjc25vZGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBmdGNncXVlcnksCi0gICAgICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgIGxpc3RfY2hhbmdlZCApCi0gIHsKLSAgICBGVENfU05vZGUgICBzbm9kZSAgPSAoRlRDX1NOb2RlKWZ0Y3Nub2RlOwotICAgIEZUQ19HUXVlcnkgIGdxdWVyeSA9IChGVENfR1F1ZXJ5KWZ0Y2dxdWVyeTsKLSAgICBGVENfR05vZGUgICBnbm9kZSAgPSBGVENfR05PREUoIHNub2RlICk7Ci0gICAgRlRfVUludCAgICAgZ2luZGV4ID0gZ3F1ZXJ5LT5naW5kZXg7Ci0gICAgRlRfQm9vbCAgICAgcmVzdWx0OwotCi0KLSAgICBpZiAobGlzdF9jaGFuZ2VkKQotICAgICAgKmxpc3RfY2hhbmdlZCA9IEZBTFNFOwotICAgIHJlc3VsdCA9IEZUX0JPT0woIGdub2RlLT5mYW1pbHkgPT0gZ3F1ZXJ5LT5mYW1pbHkgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpKCBnaW5kZXggLSBnbm9kZS0+Z2luZGV4ICkgPCBzbm9kZS0+Y291bnQgKTsKLSAgICBpZiAoIHJlc3VsdCApCi0gICAgewotICAgICAgLyogY2hlY2sgaWYgd2UgbmVlZCB0byBsb2FkIHRoZSBnbHlwaCBiaXRtYXAgbm93ICovCi0gICAgICBGVENfU0JpdCAgc2JpdCA9IHNub2RlLT5zYml0cyArICggZ2luZGV4IC0gZ25vZGUtPmdpbmRleCApOwotCi0KLSAgICAgIC8qCi0gICAgICAgKiAgVGhlIGZvbGxvd2luZyBjb2RlIGlsbHVzdHJhdGVzIHdoYXQgdG8gZG8gd2hlbiB5b3Ugd2FudCB0bwotICAgICAgICogIHBlcmZvcm0gb3BlcmF0aW9ucyB0aGF0IG1heSBmYWlsIHdpdGhpbiBhIGxvb2t1cCBmdW5jdGlvbi4KLSAgICAgICAqCi0gICAgICAgKiAgSGVyZSwgd2Ugd2FudCB0byBsb2FkIGEgc21hbGwgYml0bWFwIG9uLWRlbWFuZDsgd2UgdGh1cwotICAgICAgICogIG5lZWQgdG8gY2FsbCB0aGUgYGZ0Y19zbm9kZV9sb2FkJyBmdW5jdGlvbiB3aGljaCBtYXkgcmV0dXJuCi0gICAgICAgKiAgYSBub24temVybyBlcnJvciBjb2RlIG9ubHkgd2hlbiB3ZSBhcmUgb3V0IG9mIG1lbW9yeSAoT09NKS4KLSAgICAgICAqCi0gICAgICAgKiAgVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaXMgdG8gdXNlIEBGVENfQ0FDSEVfVFJZTE9PUCBhbmQKLSAgICAgICAqICBARlRDX0NBQ0hFX1RSWUxPT1BfRU5EIGluIG9yZGVyIHRvIGltcGxlbWVudCBhIHJldHJ5IGxvb3AKLSAgICAgICAqICB0aGF0IGlzIGNhcGFibGUgb2YgZmx1c2hpbmcgdGhlIGNhY2hlIGluY3JlbWVudGFsbHkgd2hlbgotICAgICAgICogIGFuIE9PTSBlcnJvcnMgb2NjdXIuCi0gICAgICAgKgotICAgICAgICogIEhvd2V2ZXIsIHdlIG5lZWQgdG8gYGxvY2snIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9wZXJhdGlvbiB0bwotICAgICAgICogIHByZXZlbnQgaXQgZnJvbSBiZWluZyBmbHVzaGVkIHdpdGhpbiB0aGUgbG9vcC4KLSAgICAgICAqCi0gICAgICAgKiAgV2hlbiB3ZSBleGl0IHRoZSBsb29wLCB3ZSB1bmxvY2sgdGhlIG5vZGUsIHRoZW4gY2hlY2sgdGhlIGBlcnJvcicKLSAgICAgICAqICB2YXJpYWJsZS4gIElmIGl0IGlzIG5vbi16ZXJvLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGNhY2hlIHdhcwotICAgICAgICogIGNvbXBsZXRlbHkgZmx1c2hlZCBhbmQgdGhhdCBubyB1c2FibGUgbWVtb3J5IHdhcyBmb3VuZCB0byBsb2FkCi0gICAgICAgKiAgdGhlIGJpdG1hcC4KLSAgICAgICAqCi0gICAgICAgKiAgV2UgdGhlbiBwcmVmZXIgdG8gcmV0dXJuIGEgdmFsdWUgb2YgMCAoaS5lLiwgTk8gTUFUQ0gpLiAgVGhpcwotICAgICAgICogIGVuc3VyZXMgdGhhdCB0aGUgY2FsbGVyIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IG5vZGUuCi0gICAgICAgKiAgVGhpcyBvcGVyYXRpb24gY29uc2VxdWVudGx5IF9mYWlsXyBhbmQgdGhlIGxvb2t1cCBmdW5jdGlvbgotICAgICAgICogIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIE9PTSBlcnJvciBjb2RlLgotICAgICAgICoKLSAgICAgICAqICBOb3RlIHRoYXQgYGJ1ZmZlciA9PSBOVUxMICYmIHdpZHRoID09IDI1NScgaXMgYSBoYWNrIHVzZWQgdG8KLSAgICAgICAqICB0YWcgYHVuYXZhaWxhYmxlJyBiaXRtYXBzIGluIHRoZSBhcnJheS4gIFdlIHNob3VsZCBuZXZlciB0cnkKLSAgICAgICAqICB0byBsb2FkIHRoZXNlLgotICAgICAgICoKLSAgICAgICAqLwotCi0gICAgICBpZiAoICFzYml0LT5idWZmZXIgJiYgc2JpdC0+d2lkdGggPT0gMjU1ICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUxvbmcgIHNpemU7Ci0gICAgICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgICAgIGZ0Y3Nub2RlLT5yZWZfY291bnQrKzsgIC8qIGxvY2sgbm9kZSB0byBwcmV2ZW50IGZsdXNoaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHJldHJ5IGxvb3AgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgRlRDX0NBQ0hFX1RSWUxPT1AoIGNhY2hlICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gZnRjX3Nub2RlX2xvYWQoIHNub2RlLCBjYWNoZS0+bWFuYWdlciwgZ2luZGV4LCAmc2l6ZSApOwotICAgICAgICB9Ci0gICAgICAgIEZUQ19DQUNIRV9UUllMT09QX0VORCggbGlzdF9jaGFuZ2VkICk7Ci0KLSAgICAgICAgZnRjc25vZGUtPnJlZl9jb3VudC0tOyAgLyogdW5sb2NrIHRoZSBub2RlICovCi0KLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGNhY2hlLT5tYW5hZ2VyLT5jdXJfd2VpZ2h0ICs9IHNpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSNpZmRlZiBGVENfSU5MSU5FCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgRlRDX1NOb2RlX0NvbXBhcmUoIEZUQ19TTm9kZSAgIHNub2RlLAotICAgICAgICAgICAgICAgICAgICAgRlRDX0dRdWVyeSAgZ3F1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRDX0NhY2hlICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgICBsaXN0X2NoYW5nZWQgKQotICB7Ci0gICAgcmV0dXJuIGZ0Y19zbm9kZV9jb21wYXJlKCBGVENfTk9ERSggc25vZGUgKSwgZ3F1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUsIGxpc3RfY2hhbmdlZCApOwotICB9Ci0KLSNlbmRpZgotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNzYml0cy5oIGIvc3JjL2NhY2hlL2Z0Y3NiaXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTVjZTkuLjAwMDAwMDAKLS0tIGEvc3JjL2NhY2hlL2Z0Y3NiaXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjc2JpdHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEEgc21hbGwtYml0bWFwIGNhY2hlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUQ1NCSVRTX0hfCi0jZGVmaW5lIEZUQ1NCSVRTX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DQUNIRV9ICi0jaW5jbHVkZSAiZnRjZ2x5cGguaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotI2RlZmluZSBGVENfU0JJVF9JVEVNU19QRVJfTk9ERSAgMTYKLQotICB0eXBlZGVmIHN0cnVjdCAgRlRDX1NOb2RlUmVjXwotICB7Ci0gICAgRlRDX0dOb2RlUmVjICBnbm9kZTsKLSAgICBGVF9VSW50ICAgICAgIGNvdW50OwotICAgIEZUQ19TQml0UmVjICAgc2JpdHNbRlRDX1NCSVRfSVRFTVNfUEVSX05PREVdOwotCi0gIH0gRlRDX1NOb2RlUmVjLCAqRlRDX1NOb2RlOwotCi0KLSNkZWZpbmUgRlRDX1NOT0RFKCB4ICkgICAgICAgICAoIChGVENfU05vZGUpKCB4ICkgKQotI2RlZmluZSBGVENfU05PREVfR0lOREVYKCB4ICkgIEZUQ19HTk9ERSggeCApLT5naW5kZXgKLSNkZWZpbmUgRlRDX1NOT0RFX0ZBTUlMWSggeCApICBGVENfR05PREUoIHggKS0+ZmFtaWx5Ci0KLSAgdHlwZWRlZiBGVF9VSW50Ci0gICgqRlRDX1NGYW1pbHlfR2V0Q291bnRGdW5jKSggRlRDX0ZhbWlseSAgIGZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTWFuYWdlciAgbWFuYWdlciApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVENfU0ZhbWlseV9Mb2FkR2x5cGhGdW5jKSggRlRDX0ZhbWlseSAgIGZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApOwotCi0gIHR5cGVkZWYgc3RydWN0ICBGVENfU0ZhbWlseUNsYXNzUmVjXwotICB7Ci0gICAgRlRDX01ydUxpc3RDbGFzc1JlYyAgICAgICAgY2xheno7Ci0gICAgRlRDX1NGYW1pbHlfR2V0Q291bnRGdW5jICAgZmFtaWx5X2dldF9jb3VudDsKLSAgICBGVENfU0ZhbWlseV9Mb2FkR2x5cGhGdW5jICBmYW1pbHlfbG9hZF9nbHlwaDsKLQotICB9IEZUQ19TRmFtaWx5Q2xhc3NSZWM7Ci0KLSAgdHlwZWRlZiBjb25zdCBGVENfU0ZhbWlseUNsYXNzUmVjKiAgRlRDX1NGYW1pbHlDbGFzczsKLQotI2RlZmluZSBGVENfU0ZBTUlMWV9DTEFTUyggeCApICAoKEZUQ19TRmFtaWx5Q2xhc3MpKHgpKQotCi0jZGVmaW5lIEZUQ19DQUNIRV9TRkFNSUxZX0NMQVNTKCB4ICkgIFwKLSAgICAgICAgICBGVENfU0ZBTUlMWV9DTEFTUyggRlRDX0NBQ0hFX0dDQUNIRV9DTEFTUyggeCApLT5mYW1pbHlfY2xhc3MgKQotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBGVENfU05vZGVfRnJlZSggRlRDX1NOb2RlICBzbm9kZSwKLSAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgY2FjaGUgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBGVENfU05vZGVfTmV3KCBGVENfU05vZGUgICAqcHNub2RlLAotICAgICAgICAgICAgICAgICBGVENfR1F1ZXJ5ICAgZ3F1ZXJ5LAotICAgICAgICAgICAgICAgICBGVENfQ2FjaGUgICAgY2FjaGUgKTsKLQotI2lmIDAKLSAgRlRfTE9DQUwoIEZUX1VMb25nICkKLSAgRlRDX1NOb2RlX1dlaWdodCggRlRDX1NOb2RlICBpbm9kZSApOwotI2VuZGlmCi0KLQotI2lmZGVmIEZUQ19JTkxJTkUKLQotICBGVF9MT0NBTCggRlRfQm9vbCApCi0gIEZUQ19TTm9kZV9Db21wYXJlKCBGVENfU05vZGUgICBzbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUQ19HUXVlcnkgIGdxdWVyeSwKLSAgICAgICAgICAgICAgICAgICAgIEZUQ19DYWNoZSAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCogICAgbGlzdF9jaGFuZ2VkKTsKLQotI2VuZGlmCi0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRDU0JJVFNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9ydWxlcy5tayBiL3NyYy9jYWNoZS9ydWxlcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwNDY4OS4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgQ2FjaGUgY29uZmlndXJhdGlvbiBydWxlcwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDAtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBDYWNoZSBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1DQUNIRV9ESVIgICA6PSAkKFNSQ19ESVIpL2NhY2hlCi0KLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotQ0FDSEVfQ09NUElMRSA6PSAkKENDKSAkKEFOU0lGTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKENBQ0hFX0RJUikpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAkKEZUX0NGTEFHUykKLQotCi0jIENhY2hlIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQotIwotQ0FDSEVfRFJWX1NSQyA6PSAkKENBQ0hFX0RJUikvZnRjYmFzaWMuYyBcCi0gICAgICAgICAgICAgICAgICQoQ0FDSEVfRElSKS9mdGNjYWNoZS5jIFwKLSAgICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y2NtYXAuYyAgXAotICAgICAgICAgICAgICAgICAkKENBQ0hFX0RJUikvZnRjZ2x5cGguYyBcCi0gICAgICAgICAgICAgICAgICQoQ0FDSEVfRElSKS9mdGNpbWFnZS5jIFwKLSAgICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y21hbmFnLmMgXAotICAgICAgICAgICAgICAgICAkKENBQ0hFX0RJUikvZnRjbXJ1LmMgICBcCi0gICAgICAgICAgICAgICAgICQoQ0FDSEVfRElSKS9mdGNzYml0cy5jCi0KLQotIyBDYWNoZSBkcml2ZXIgaGVhZGVycwotIwotQ0FDSEVfRFJWX0ggOj0gJChDQUNIRV9ESVIpL2Z0Y2NhY2hlLmggXAotICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y2NiYWNrLmggXAotICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y2Vycm9yLmggXAotICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y2dseXBoLmggXAotICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y2ltYWdlLmggXAotICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y21hbmFnLmggXAotICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y21ydS5oICAgXAotICAgICAgICAgICAgICAgJChDQUNIRV9ESVIpL2Z0Y3NiaXRzLmgKLQotCi0jIENhY2hlIGRyaXZlciBvYmplY3QocykKLSMKLSMgICBDQUNIRV9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMuCi0jICAgQ0FDSEVfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcy4KLSMKLUNBQ0hFX0RSVl9PQkpfTSA6PSAkKENBQ0hFX0RSVl9TUkM6JChDQUNIRV9ESVIpLyUuYz0kKE9CSl9ESVIpLyUuJE8pCi1DQUNIRV9EUlZfT0JKX1MgOj0gJChPQkpfRElSKS9mdGNhY2hlLiRPCi0KLSMgQ2FjaGUgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLUNBQ0hFX0RSVl9TUkNfUyA6PSAkKENBQ0hFX0RJUikvZnRjYWNoZS5jCi0KLQotIyBDYWNoZSBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0Ci0jCi0kKENBQ0hFX0RSVl9PQkpfUyk6ICQoQ0FDSEVfRFJWX1NSQ19TKSAkKENBQ0hFX0RSVl9TUkMpIFwKLSAgICAgICAgICAgICAgICAgICAkKEZSRUVUWVBFX0gpICQoQ0FDSEVfRFJWX0gpCi0JJChDQUNIRV9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChDQUNIRV9EUlZfU1JDX1MpKQotCi0KLSMgQ2FjaGUgZHJpdmVyIC0gbXVsdGlwbGUgb2JqZWN0cwotIwotJChPQkpfRElSKS8lLiRPOiAkKENBQ0hFX0RJUikvJS5jICQoRlJFRVRZUEVfSCkgJChDQUNIRV9EUlZfSCkKLQkkKENBQ0hFX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkPCkKLQotCi0jIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKLSMKLURSVl9PQkpTX1MgKz0gJChDQUNIRV9EUlZfT0JKX1MpCi1EUlZfT0JKU19NICs9ICQoQ0FDSEVfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvY2ZmL0phbWZpbGUgYi9zcmMvY2ZmL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZGQwNWYuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9jZmYgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIGNmZiA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gY2ZmY21hcAotICAgICAgICAgICAgICAgY2ZmZHJpdnIKLSAgICAgICAgICAgICAgIGNmZmdsb2FkCi0gICAgICAgICAgICAgICBjZmZsb2FkCi0gICAgICAgICAgICAgICBjZmZvYmpzCi0gICAgICAgICAgICAgICBjZmZwYXJzZQotICAgICAgICAgICAgICAgY2ZmcGljCi0gICAgICAgICAgICAgICBjZjJhcnJzdAotICAgICAgICAgICAgICAgY2YyYmx1ZXMKLSAgICAgICAgICAgICAgIGNmMmVycm9yCi0gICAgICAgICAgICAgICBjZjJmb250Ci0gICAgICAgICAgICAgICBjZjJmdAotICAgICAgICAgICAgICAgY2YyaGludHMKLSAgICAgICAgICAgICAgIGNmMmludHJwCi0gICAgICAgICAgICAgICBjZjJyZWFkCi0gICAgICAgICAgICAgICBjZjJzdGFjawotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gY2ZmIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL2NmZiBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmMmFycnN0LmMgYi9zcmMvY2ZmL2NmMmFycnN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTY0NTAuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJhcnJzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMmFycnN0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIEFycmF5IFN0YWNrcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImNmMmdsdWUuaCIKLSNpbmNsdWRlICJjZjJhcnJzdC5oIgotCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLQotCi0gIC8qCi0gICAqIENGMl9BcnJTdGFjayB1c2VzIGFuIGVycm9yIHBvaW50ZXIsIHRvIGVuYWJsZSBzaGFyZWQgZXJyb3JzLgotICAgKiBTaGFyZWQgZXJyb3JzIGFyZSBuZWNlc3Nhcnkgd2hlbiBtdWx0aXBsZSBvYmplY3RzIGFsbG93IHRoZSBwcm9ncmFtCi0gICAqIHRvIGNvbnRpbnVlIGFmdGVyIGRldGVjdGluZyBlcnJvcnMuICBPbmx5IHRoZSBmaXJzdCBlcnJvciBzaG91bGQgYmUKLSAgICogcmVjb3JkZWQuCi0gICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9hcnJzdGFja19pbml0KCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogICAgIGVycm9yLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBzaXplSXRlbSApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGFycnN0YWNrICk7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgKi8KLSAgICBhcnJzdGFjay0+bWVtb3J5ICAgID0gbWVtb3J5OwotICAgIGFycnN0YWNrLT5lcnJvciAgICAgPSBlcnJvcjsKLSAgICBhcnJzdGFjay0+c2l6ZUl0ZW0gID0gc2l6ZUl0ZW07Ci0gICAgYXJyc3RhY2stPmFsbG9jYXRlZCA9IDA7Ci0gICAgYXJyc3RhY2stPmNodW5rICAgICA9IDEwOyAgICAvKiBjaHVua3Mgb2YgMTAgaXRlbXMgKi8KLSAgICBhcnJzdGFjay0+Y291bnQgICAgID0gMDsKLSAgICBhcnJzdGFjay0+dG90YWxTaXplID0gMDsKLSAgICBhcnJzdGFjay0+cHRyICAgICAgID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2FycnN0YWNrX2ZpbmFsaXplKCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gYXJyc3RhY2stPm1lbW9yeTsgICAgIC8qIGZvciBGVF9GUkVFICovCi0KLQotICAgIEZUX0FTU0VSVCggYXJyc3RhY2sgKTsKLQotICAgIGFycnN0YWNrLT5hbGxvY2F0ZWQgPSAwOwotICAgIGFycnN0YWNrLT5jb3VudCAgICAgPSAwOwotICAgIGFycnN0YWNrLT50b3RhbFNpemUgPSAwOwotCi0gICAgLyogZnJlZSB0aGUgZGF0YSBidWZmZXIgKi8KLSAgICBGVF9GUkVFKCBhcnJzdGFjay0+cHRyICk7Ci0gIH0KLQotCi0gIC8qIGFsbG9jYXRlIG9yIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciBzaXplOyAqLwotICAvKiByZXR1cm4gZmFsc2Ugb24gbWVtb3J5IGVycm9yICovCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGNmMl9hcnJzdGFja19zZXROdW1FbGVtZW50cyggQ0YyX0FyclN0YWNrICBhcnJzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgIG51bUVsZW1lbnRzICkKLSAgewotICAgIEZUX0FTU0VSVCggYXJyc3RhY2sgKTsKLQotICAgIHsKLSAgICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOyAgICAgICAgLyogZm9yIEZUX1JFQUxMT0MgKi8KLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gYXJyc3RhY2stPm1lbW9yeTsgLyogZm9yIEZUX1JFQUxMT0MgKi8KLQotICAgICAgc2l6ZV90ICBuZXdTaXplID0gbnVtRWxlbWVudHMgKiBhcnJzdGFjay0+c2l6ZUl0ZW07Ci0KLQotICAgICAgaWYgKCBudW1FbGVtZW50cyA+IEZUX0xPTkdfTUFYIC8gYXJyc3RhY2stPnNpemVJdGVtICkKLSAgICAgICAgZ290byBleGl0OwotCi0KLSAgICAgIEZUX0FTU0VSVCggbmV3U2l6ZSA+IDAgKTsgICAvKiBhdm9pZCByZWFsbG9jIHdpdGggemVybyBzaXplICovCi0KLSAgICAgIGlmICggIUZUX1JFQUxMT0MoIGFycnN0YWNrLT5wdHIsIGFycnN0YWNrLT50b3RhbFNpemUsIG5ld1NpemUgKSApCi0gICAgICB7Ci0gICAgICAgIGFycnN0YWNrLT5hbGxvY2F0ZWQgPSBudW1FbGVtZW50czsKLSAgICAgICAgYXJyc3RhY2stPnRvdGFsU2l6ZSA9IG5ld1NpemU7Ci0KLSAgICAgICAgaWYgKCBhcnJzdGFjay0+Y291bnQgPiBudW1FbGVtZW50cyApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3ZSB0cnVuY2F0ZWQgdGhlIGxpc3QhICovCi0gICAgICAgICAgQ0YyX1NFVF9FUlJPUiggYXJyc3RhY2stPmVycm9yLCBTdGFja19PdmVyZmxvdyApOwotICAgICAgICAgIGFycnN0YWNrLT5jb3VudCA9IG51bUVsZW1lbnRzOwotICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAgLyogc3VjY2VzcyAqLwotICAgICAgfQotICAgIH0KLQotICBleGl0OgotICAgIC8qIGlmIHRoZXJlJ3Mgbm90IGFscmVhZHkgYW4gZXJyb3IsIHN0b3JlIHRoaXMgb25lICovCi0gICAgQ0YyX1NFVF9FUlJPUiggYXJyc3RhY2stPmVycm9yLCBPdXRfT2ZfTWVtb3J5ICk7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotCi0gIC8qIHNldCB0aGUgY291bnQsIGVuc3VyaW5nIGFsbG9jYXRpb24gaXMgc3VmZmljaWVudCAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfc2V0Q291bnQoIENGMl9BcnJTdGFjayAgYXJyc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBudW1FbGVtZW50cyApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGFycnN0YWNrICk7Ci0KLSAgICBpZiAoIG51bUVsZW1lbnRzID4gYXJyc3RhY2stPmFsbG9jYXRlZCApCi0gICAgewotICAgICAgLyogZXhwYW5kIHRoZSBhbGxvY2F0aW9uIGZpcnN0ICovCi0gICAgICBpZiAoICFjZjJfYXJyc3RhY2tfc2V0TnVtRWxlbWVudHMoIGFycnN0YWNrLCBudW1FbGVtZW50cyApICkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFycnN0YWNrLT5jb3VudCA9IG51bUVsZW1lbnRzOwotICB9Ci0KLQotICAvKiBjbGVhciB0aGUgY291bnQgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2FycnN0YWNrX2NsZWFyKCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrICkKLSAgewotICAgIEZUX0FTU0VSVCggYXJyc3RhY2sgKTsKLQotICAgIGFycnN0YWNrLT5jb3VudCA9IDA7Ci0gIH0KLQotCi0gIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGl0ZW1zICovCi0gIEZUX0xPQ0FMX0RFRiggc2l6ZV90ICkKLSAgY2YyX2FycnN0YWNrX3NpemUoIGNvbnN0IENGMl9BcnJTdGFjayAgYXJyc3RhY2sgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBhcnJzdGFjayApOwotCi0gICAgcmV0dXJuIGFycnN0YWNrLT5jb3VudDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkKiApCi0gIGNmMl9hcnJzdGFja19nZXRCdWZmZXIoIGNvbnN0IENGMl9BcnJTdGFjayAgYXJyc3RhY2sgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBhcnJzdGFjayApOwotCi0gICAgcmV0dXJuIGFycnN0YWNrLT5wdHI7Ci0gIH0KLQotCi0gIC8qIHJldHVybiBwb2ludGVyIHRvIHRoZSBnaXZlbiBlbGVtZW50ICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCogKQotICBjZjJfYXJyc3RhY2tfZ2V0UG9pbnRlciggY29uc3QgQ0YyX0FyclN0YWNrICBhcnJzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgaWR4ICkKLSAgewotICAgIHZvaWQqICBuZXdQdHI7Ci0KLQotICAgIEZUX0FTU0VSVCggYXJyc3RhY2sgKTsKLQotICAgIGlmICggaWR4ID49IGFycnN0YWNrLT5jb3VudCApCi0gICAgewotICAgICAgLyogb3ZlcmZsb3cgKi8KLSAgICAgIENGMl9TRVRfRVJST1IoIGFycnN0YWNrLT5lcnJvciwgU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgIGlkeCA9IDA7ICAgIC8qIGNob29zZSBzYWZlIGRlZmF1bHQgKi8KLSAgICB9Ci0KLSAgICBuZXdQdHIgPSAoRlRfQnl0ZSopYXJyc3RhY2stPnB0ciArIGlkeCAqIGFycnN0YWNrLT5zaXplSXRlbTsKLQotICAgIHJldHVybiBuZXdQdHI7Ci0gIH0KLQotCi0gIC8qIHB1c2ggKGFwcGVuZCkgYW4gZWxlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0OyAgICAgICAgICovCi0gIC8qIHJldHVybiBmYWxzZSBvbiBtZW1vcnkgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRPRE86IHNob3VsZCB0aGVyZSBiZSBhIGxlbmd0aCBwYXJhbSBmb3IgZXh0cmEgY2hlY2tpbmc/ICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9hcnJzdGFja19wdXNoKCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogICBwdHIgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBhcnJzdGFjayApOwotCi0gICAgaWYgKCBhcnJzdGFjay0+Y291bnQgPT0gYXJyc3RhY2stPmFsbG9jYXRlZCApCi0gICAgewotICAgICAgLyogZ3JvdyB0aGUgYnVmZmVyIGJ5IG9uZSBjaHVuayAqLwotICAgICAgaWYgKCAhY2YyX2FycnN0YWNrX3NldE51bUVsZW1lbnRzKAotICAgICAgICAgICAgIGFycnN0YWNrLCBhcnJzdGFjay0+YWxsb2NhdGVkICsgYXJyc3RhY2stPmNodW5rICkgKQotICAgICAgewotICAgICAgICAvKiBvbiBlcnJvciwgaWdub3JlIHRoZSBwdXNoICovCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGVF9BU1NFUlQoIHB0ciApOwotCi0gICAgewotICAgICAgc2l6ZV90ICBvZmZzZXQgPSBhcnJzdGFjay0+Y291bnQgKiBhcnJzdGFjay0+c2l6ZUl0ZW07Ci0gICAgICB2b2lkKiAgIG5ld1B0ciA9IChGVF9CeXRlKilhcnJzdGFjay0+cHRyICsgb2Zmc2V0OwotCi0KLSAgICAgIEZUX01FTV9DT1BZKCBuZXdQdHIsIHB0ciwgYXJyc3RhY2stPnNpemVJdGVtICk7Ci0gICAgICBhcnJzdGFjay0+Y291bnQgKz0gMTsKLSAgICB9Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2YyYXJyc3QuaCBiL3NyYy9jZmYvY2YyYXJyc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyMWEzYi4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmMmFycnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyYXJyc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgQXJyYXkgU3RhY2tzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQ0YyQVJSU1RfSF8KLSNkZWZpbmUgQ0YyQVJSU1RfSF8KLQotCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIG5lZWQgdG8gZGVmaW5lIHRoZSBzdHJ1Y3QgaGVyZSAobm90IG9wYXF1ZSkgc28gaXQgY2FuIGJlIGFsbG9jYXRlZCBieSAqLwotICAvKiBjbGllbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9BcnJTdGFja1JlY18KLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX0Vycm9yKiAgZXJyb3I7Ci0KLSAgICBzaXplX3QgIHNpemVJdGVtOyAgICAgICAvKiBieXRlcyBwZXIgZWxlbWVudCAgICAgICAgICAgICAqLwotICAgIHNpemVfdCAgYWxsb2NhdGVkOyAgICAgIC8qIGl0ZW1zIGFsbG9jYXRlZCAgICAgICAgICAgICAgICovCi0gICAgc2l6ZV90ICBjaHVuazsgICAgICAgICAgLyogYWxsb2NhdGlvbiBpbmNyZW1lbnQgaW4gaXRlbXMgKi8KLSAgICBzaXplX3QgIGNvdW50OyAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgYWxsb2NhdGVkICAqLwotICAgIHNpemVfdCAgdG90YWxTaXplOyAgICAgIC8qIHRvdGFsIGJ5dGVzIGFsbG9jYXRlZCAgICAgICAgICovCi0KLSAgICB2b2lkKiAgcHRyOyAgICAgICAgICAgICAvKiBwdHIgdG8gZGF0YSAgICAgICAgICAgICAgICAgICAqLwotCi0gIH0gQ0YyX0FyclN0YWNrUmVjLCAqQ0YyX0FyclN0YWNrOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfaW5pdCggQ0YyX0FyclN0YWNrICBhcnJzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICAgICBlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgc2l6ZUl0ZW0gKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfZmluYWxpemUoIENGMl9BcnJTdGFjayAgYXJyc3RhY2sgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9hcnJzdGFja19zZXRDb3VudCggQ0YyX0FyclN0YWNrICBhcnJzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgIG51bUVsZW1lbnRzICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2FycnN0YWNrX2NsZWFyKCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrICk7Ci0gIEZUX0xPQ0FMKCBzaXplX3QgKQotICBjZjJfYXJyc3RhY2tfc2l6ZSggY29uc3QgQ0YyX0FyclN0YWNrICBhcnJzdGFjayApOwotCi0gIEZUX0xPQ0FMKCB2b2lkKiApCi0gIGNmMl9hcnJzdGFja19nZXRCdWZmZXIoIGNvbnN0IENGMl9BcnJTdGFjayAgYXJyc3RhY2sgKTsKLSAgRlRfTE9DQUwoIHZvaWQqICkKLSAgY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoIGNvbnN0IENGMl9BcnJTdGFjayAgYXJyc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIGlkeCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2FycnN0YWNrX3B1c2goIENGMl9BcnJTdGFjayAgYXJyc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgIHB0ciApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogQ0YyQVJSU1RfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2YyYmx1ZXMuYyBiL3NyYy9jZmYvY2YyYmx1ZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViNDRiMi4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmMmJsdWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyYmx1ZXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgaGFuZGxpbmcgQmx1ZSBab25lcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTQgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJjZjJmdC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAiY2YyYmx1ZXMuaCIKLSNpbmNsdWRlICJjZjJoaW50cy5oIgotI2luY2x1ZGUgImNmMmZvbnQuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmMmJsdWVzCi0KLQotICAvKgotICAgKiBGb3IgYmx1ZSB2YWx1ZXMsIHRoZSBGcmVlVHlwZSBwYXJzZXIgcHJvZHVjZXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMsCi0gICAqIHdoaWxlIHRoZSBBZG9iZSBDRkYgZW5naW5lIHByb2R1Y2VzIGFuIGFycmF5IG9mIGZpeGVkLgotICAgKiBEZWZpbmUgYSBtYWNybyB0byBjb252ZXJ0IEZyZWVUeXBlIHRvIGZpeGVkLgotICAgKi8KLSNkZWZpbmUgY2YyX2JsdWVUb0ZpeGVkKCB4ICkgIGNmMl9pbnRUb0ZpeGVkKCB4ICkKLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9ibHVlc19pbml0KCBDRjJfQmx1ZXMgIGJsdWVzLAotICAgICAgICAgICAgICAgICAgQ0YyX0ZvbnQgICBmb250ICkKLSAgewotICAgIC8qIHBvaW50ZXIgdG8gcGFyc2VkIGZvbnQgb2JqZWN0ICovCi0gICAgQ0ZGX0RlY29kZXIqICBkZWNvZGVyID0gZm9udC0+ZGVjb2RlcjsKLQotICAgIENGMl9GaXhlZCAgem9uZUhlaWdodDsKLSAgICBDRjJfRml4ZWQgIG1heFpvbmVIZWlnaHQgPSAwOwotICAgIENGMl9GaXhlZCAgY3NVbml0c1BlclBpeGVsOwotCi0gICAgc2l6ZV90ICBudW1CbHVlVmFsdWVzOwotICAgIHNpemVfdCAgbnVtT3RoZXJCbHVlczsKLSAgICBzaXplX3QgIG51bUZhbWlseUJsdWVzOwotICAgIHNpemVfdCAgbnVtRmFtaWx5T3RoZXJCbHVlczsKLQotICAgIEZUX1BvcyogIGJsdWVWYWx1ZXM7Ci0gICAgRlRfUG9zKiAgb3RoZXJCbHVlczsKLSAgICBGVF9Qb3MqICBmYW1pbHlCbHVlczsKLSAgICBGVF9Qb3MqICBmYW1pbHlPdGhlckJsdWVzOwotCi0gICAgc2l6ZV90ICAgICBpOwotICAgIENGMl9GaXhlZCAgZW1Cb3hCb3R0b20sIGVtQm94VG9wOwotCi0jaWYgMAotICAgIENGMl9JbnQgIHVuaXRzUGVyRW0gPSBmb250LT51bml0c1BlckVtOwotCi0KLSAgICBpZiAoIHVuaXRzUGVyRW0gPT0gMCApCi0gICAgICB1bml0c1BlckVtID0gMTAwMDsKLSNlbmRpZgotCi0gICAgRlRfWkVSTyggYmx1ZXMgKTsKLSAgICBibHVlcy0+c2NhbGUgPSBmb250LT5pbm5lclRyYW5zZm9ybS5kOwotCi0gICAgY2YyX2dldEJsdWVNZXRyaWNzKCBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgJmJsdWVzLT5ibHVlU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmYmx1ZXMtPmJsdWVTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZibHVlcy0+Ymx1ZUZ1enogKTsKLQotICAgIGNmMl9nZXRCbHVlVmFsdWVzKCBkZWNvZGVyLCAmbnVtQmx1ZVZhbHVlcywgJmJsdWVWYWx1ZXMgKTsKLSAgICBjZjJfZ2V0T3RoZXJCbHVlcyggZGVjb2RlciwgJm51bU90aGVyQmx1ZXMsICZvdGhlckJsdWVzICk7Ci0gICAgY2YyX2dldEZhbWlseUJsdWVzKCBkZWNvZGVyLCAmbnVtRmFtaWx5Qmx1ZXMsICZmYW1pbHlCbHVlcyApOwotICAgIGNmMl9nZXRGYW1pbHlPdGhlckJsdWVzKCBkZWNvZGVyLCAmbnVtRmFtaWx5T3RoZXJCbHVlcywgJmZhbWlseU90aGVyQmx1ZXMgKTsKLQotICAgIC8qCi0gICAgICogc3ludGhldGljIGVtIGJveCBoaW50IGhldXJpc3RpYwotICAgICAqCi0gICAgICogQXBwbHkgdGhpcyB3aGVuIGlkZW9ncmFwaGljIGRpY3Rpb25hcnkgKExhbmd1YWdlR3JvdXAgMSkgaGFzIG5vCi0gICAgICogcmVhbCBhbGlnbm1lbnQgem9uZXMuICBBZG9iZSB0b29scyBnZW5lcmF0ZSBkdW1teSB6b25lcyBhdCAtMjUwIGFuZAotICAgICAqIDExMDAgZm9yIGEgMTAwMCB1bml0IGVtLiAgRm9udHMgd2l0aCBJQ0YtYmFzZWQgYWxpZ25tZW50IHpvbmVzCi0gICAgICogc2hvdWxkIG5vdCBlbmFibGUgdGhlIGhldXJpc3RpYy4gIFdoZW4gdGhlIGhldXJpc3RpYyBpcyBlbmFibGVkLAotICAgICAqIHRoZSBmb250J3MgYmx1ZSB6b25lcyBhcmUgaWdub3JlZC4KLSAgICAgKgotICAgICAqLwotCi0gICAgLyogZ2V0IGVtIGJveCBmcm9tIE9TLzIgdHlwb0FzY2VuZGVyL0Rlc2NlbmRlciAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRPRE86IEZyZWVUeXBlIGRvZXMgbm90IHBhcnNlIHRoZXNlIG1ldHJpY3MuICBTa2lwIHRoZW0gZm9yIG5vdy4gKi8KLSNpZiAwCi0gICAgRkNNX2dldEhvcml6b250YWxMaW5lTWV0cmljcyggJmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+Zm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGluZWdhcCApOwotICAgIGlmICggYXNjZW5kZXIgLSBkZXNjZW5kZXIgPT0gdW5pdHNQZXJFbSApCi0gICAgewotICAgICAgZW1Cb3hCb3R0b20gPSBjZjJfaW50VG9GaXhlZCggZGVzY2VuZGVyICk7Ci0gICAgICBlbUJveFRvcCAgICA9IGNmMl9pbnRUb0ZpeGVkKCBhc2NlbmRlciApOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICBlbUJveEJvdHRvbSA9IENGMl9JQ0ZfQm90dG9tOwotICAgICAgZW1Cb3hUb3AgICAgPSBDRjJfSUNGX1RvcDsKLSAgICB9Ci0KLSAgICBpZiAoIGNmMl9nZXRMYW5ndWFnZUdyb3VwKCBkZWNvZGVyICkgPT0gMSAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCBudW1CbHVlVmFsdWVzID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAoIG51bUJsdWVWYWx1ZXMgPT0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBjZjJfYmx1ZVRvRml4ZWQoIGJsdWVWYWx1ZXNbMF0gKSA8IGVtQm94Qm90dG9tICYmCi0gICAgICAgICAgICAgY2YyX2JsdWVUb0ZpeGVkKCBibHVlVmFsdWVzWzFdICkgPCBlbUJveEJvdHRvbSAmJgotICAgICAgICAgICAgIGNmMl9ibHVlVG9GaXhlZCggYmx1ZVZhbHVlc1syXSApID4gZW1Cb3hUb3AgICAgJiYKLSAgICAgICAgICAgICBjZjJfYmx1ZVRvRml4ZWQoIGJsdWVWYWx1ZXNbM10gKSA+IGVtQm94VG9wICAgICkgKSApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIENvbnN0cnVjdCBoaW50IGVkZ2VzIHN1aXRhYmxlIGZvciBzeW50aGV0aWMgZ2hvc3QgaGludHMgYXQgdG9wCi0gICAgICAgKiBhbmQgYm90dG9tIG9mIGVtIGJveC4gICstQ0YyX01JTl9DT1VOVEVSIGFsbG93cyBmb3IgdW5oaW50ZWQKLSAgICAgICAqIGZlYXR1cmVzIGFib3ZlIG9yIGJlbG93IHRoZSBsYXN0IGhpbnRlZCBlZGdlLiAgVGhpcyBhbHNvIGdpdmVzIGEKLSAgICAgICAqIG5ldCAxIHBpeGVsIGJvb3N0IHRvIHRoZSBoZWlnaHQgb2YgaWRlb2dyYXBoaWMgZ2x5cGhzLgotICAgICAgICoKLSAgICAgICAqIE5vdGU6IEFkanVzdCBzeW50aGV0aWMgaGludHMgb3V0d2FyZCBieSBlcHNpbG9uICgweC4wMDAxKSB0bwotICAgICAgICogICAgICAgYXZvaWQgaW50ZXJmZXJlbmNlLiAgRS5nLiwgc29tZSBmb250cyBoYXZlIHJlYWwgaGludHMgYXQKLSAgICAgICAqICAgICAgIDg4MCBhbmQgLTEyMC4KLSAgICAgICAqLwotCi0gICAgICBibHVlcy0+ZW1Cb3hCb3R0b21FZGdlLmNzQ29vcmQgPSBlbUJveEJvdHRvbSAtIENGMl9GSVhFRF9FUFNJTE9OOwotICAgICAgYmx1ZXMtPmVtQm94Qm90dG9tRWRnZS5kc0Nvb3JkID0gY2YyX2ZpeGVkUm91bmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+ZW1Cb3hCb3R0b21FZGdlLmNzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPnNjYWxlICkgKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfTUlOX0NPVU5URVI7Ci0gICAgICBibHVlcy0+ZW1Cb3hCb3R0b21FZGdlLnNjYWxlICAgPSBibHVlcy0+c2NhbGU7Ci0gICAgICBibHVlcy0+ZW1Cb3hCb3R0b21FZGdlLmZsYWdzICAgPSBDRjJfR2hvc3RCb3R0b20gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0xvY2tlZCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfU3ludGhldGljOwotCi0gICAgICBibHVlcy0+ZW1Cb3hUb3BFZGdlLmNzQ29vcmQgPSBlbUJveFRvcCArIENGMl9GSVhFRF9FUFNJTE9OICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBmb250LT5kYXJrZW5ZOwotICAgICAgYmx1ZXMtPmVtQm94VG9wRWRnZS5kc0Nvb3JkID0gY2YyX2ZpeGVkUm91bmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+ZW1Cb3hUb3BFZGdlLmNzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPnNjYWxlICkgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfTUlOX0NPVU5URVI7Ci0gICAgICBibHVlcy0+ZW1Cb3hUb3BFZGdlLnNjYWxlICAgPSBibHVlcy0+c2NhbGU7Ci0gICAgICBibHVlcy0+ZW1Cb3hUb3BFZGdlLmZsYWdzICAgPSBDRjJfR2hvc3RUb3AgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0xvY2tlZCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfU3ludGhldGljOwotCi0gICAgICBibHVlcy0+ZG9FbUJveEhpbnRzID0gVFJVRTsgICAgLyogZW5hYmxlIHRoZSBoZXVyaXN0aWMgKi8KLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGNvcHkgYEJsdWVWYWx1ZXMnIGFuZCBgT3RoZXJCbHVlcycgdG8gYSBjb21iaW5lZCBhcnJheSBvZiB0b3AgYW5kICovCi0gICAgLyogYm90dG9tIHpvbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bUJsdWVWYWx1ZXM7IGkgKz0gMiApCi0gICAgewotICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc0JvdHRvbUVkZ2UgPQotICAgICAgICBjZjJfYmx1ZVRvRml4ZWQoIGJsdWVWYWx1ZXNbaV0gKTsKLSAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NUb3BFZGdlID0KLSAgICAgICAgY2YyX2JsdWVUb0ZpeGVkKCBibHVlVmFsdWVzW2kgKyAxXSApOwotCi0gICAgICB6b25lSGVpZ2h0ID0gU1VCX0lOVDMyKCBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzVG9wRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NCb3R0b21FZGdlICk7Ci0KLSAgICAgIGlmICggem9uZUhlaWdodCA8IDAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiY2YyX2JsdWVzX2luaXQ6IGlnbm9yaW5nIG5lZ2F0aXZlIHpvbmUgaGVpZ2h0XG4iICkpOwotICAgICAgICBjb250aW51ZTsgICAvKiByZWplY3QgdGhpcyB6b25lICovCi0gICAgICB9Ci0KLSAgICAgIGlmICggem9uZUhlaWdodCA+IG1heFpvbmVIZWlnaHQgKQotICAgICAgewotICAgICAgICAvKiB0YWtlIG1heGltdW0gYmVmb3JlIGRhcmtlbmluZyBhZGp1c3RtZW50ICAgICAgKi8KLSAgICAgICAgLyogc28gb3ZlcnNob290IHN1cHByZXNzaW9uIHBvaW50IGRvZXNuJ3QgY2hhbmdlICovCi0gICAgICAgIG1heFpvbmVIZWlnaHQgPSB6b25lSGVpZ2h0OwotICAgICAgfQotCi0gICAgICAvKiBhZGp1c3QgYm90aCBlZGdlcyBvZiB0b3Agem9uZSB1cHdhcmQgYnkgdHdpY2UgZGFya2VuaW5nIGFtb3VudCAqLwotICAgICAgaWYgKCBpICE9IDAgKQotICAgICAgewotICAgICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzVG9wRWRnZSAgICArPSAyICogZm9udC0+ZGFya2VuWTsKLSAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc0JvdHRvbUVkZ2UgKz0gMiAqIGZvbnQtPmRhcmtlblk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGZpcnN0IGBCbHVlVmFsdWUnIGlzIGJvdHRvbSB6b25lOyBvdGhlcnMgYXJlIHRvcCAqLwotICAgICAgaWYgKCBpID09IDAgKQotICAgICAgewotICAgICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmJvdHRvbVpvbmUgPQotICAgICAgICAgIFRSVUU7Ci0gICAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NGbGF0RWRnZSA9Ci0gICAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc1RvcEVkZ2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uYm90dG9tWm9uZSA9Ci0gICAgICAgICAgRkFMU0U7Ci0gICAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NGbGF0RWRnZSA9Ci0gICAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc0JvdHRvbUVkZ2U7Ci0gICAgICB9Ci0KLSAgICAgIGJsdWVzLT5jb3VudCArPSAxOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtT3RoZXJCbHVlczsgaSArPSAyICkKLSAgICB7Ci0gICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzQm90dG9tRWRnZSA9Ci0gICAgICAgIGNmMl9ibHVlVG9GaXhlZCggb3RoZXJCbHVlc1tpXSApOwotICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc1RvcEVkZ2UgPQotICAgICAgICBjZjJfYmx1ZVRvRml4ZWQoIG90aGVyQmx1ZXNbaSArIDFdICk7Ci0KLSAgICAgIHpvbmVIZWlnaHQgPSBTVUJfSU5UMzIoIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NUb3BFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc0JvdHRvbUVkZ2UgKTsKLQotICAgICAgaWYgKCB6b25lSGVpZ2h0IDwgMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNCgoICJjZjJfYmx1ZXNfaW5pdDogaWdub3JpbmcgbmVnYXRpdmUgem9uZSBoZWlnaHRcbiIgKSk7Ci0gICAgICAgIGNvbnRpbnVlOyAgIC8qIHJlamVjdCB0aGlzIHpvbmUgKi8KLSAgICAgIH0KLQotICAgICAgaWYgKCB6b25lSGVpZ2h0ID4gbWF4Wm9uZUhlaWdodCApCi0gICAgICB7Ci0gICAgICAgIC8qIHRha2UgbWF4aW11bSBiZWZvcmUgZGFya2VuaW5nIGFkanVzdG1lbnQgICAgICAqLwotICAgICAgICAvKiBzbyBvdmVyc2hvb3Qgc3VwcHJlc3Npb24gcG9pbnQgZG9lc24ndCBjaGFuZ2UgKi8KLSAgICAgICAgbWF4Wm9uZUhlaWdodCA9IHpvbmVIZWlnaHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdGU6IGJvdHRvbSB6b25lcyBhcmUgbm90IGFkanVzdGVkIGZvciBkYXJrZW5pbmcgYW1vdW50ICovCi0KLSAgICAgIC8qIGFsbCBPdGhlckJsdWVzIGFyZSBib3R0b20gem9uZSAqLwotICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5ib3R0b21ab25lID0KLSAgICAgICAgVFJVRTsKLSAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NGbGF0RWRnZSA9Ci0gICAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NUb3BFZGdlOwotCi0gICAgICBibHVlcy0+Y291bnQgKz0gMTsKLSAgICB9Ci0KLSAgICAvKiBBZGp1c3QgZm9yIEZhbWlseUJsdWVzICovCi0KLSAgICAvKiBTZWFyY2ggZm9yIHRoZSBuZWFyZXN0IGZsYXQgZWRnZSBpbiBgRmFtaWx5Qmx1ZXMnIG9yICAgICAgICAgICAgICAgICovCi0gICAgLyogYEZhbWlseU90aGVyQmx1ZXMnLiAgQWNjb3JkaW5nIHRvIHRoZSBCbGFjayBCb29rLCBhbnkgbWF0Y2hpbmcgZWRnZSAqLwotICAgIC8qIG11c3QgYmUgd2l0aGluIG9uZSBkZXZpY2UgcGl4ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGNzVW5pdHNQZXJQaXhlbCA9IEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIDEgKSwgYmx1ZXMtPnNjYWxlICk7Ci0KLSAgICAvKiBsb29wIG9uIGFsbCB6b25lcyBpbiB0aGlzIGZvbnQgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IGJsdWVzLT5jb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBzaXplX3QgICAgIGo7Ci0gICAgICBDRjJfRml4ZWQgIG1pbkRpZmY7Ci0gICAgICBDRjJfRml4ZWQgIGZsYXRGYW1pbHlFZGdlLCBkaWZmOwotICAgICAgLyogdmFsdWUgZm9yIHRoaXMgZm9udCAqLwotICAgICAgQ0YyX0ZpeGVkICBmbGF0RWRnZSA9IGJsdWVzLT56b25lW2ldLmNzRmxhdEVkZ2U7Ci0KLQotICAgICAgaWYgKCBibHVlcy0+em9uZVtpXS5ib3R0b21ab25lICkKLSAgICAgIHsKLSAgICAgICAgLyogSW4gYSBib3R0b20gem9uZSwgdGhlIHRvcCBlZGdlIGlzIHRoZSBmbGF0IGVkZ2UuICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFNlYXJjaCBgRmFtaWx5T3RoZXJCbHVlcycgZm9yIGJvdHRvbSB6b25lczsgbG9vayBmb3IgY2xvc2VzdCAqLwotICAgICAgICAvKiBGYW1pbHkgZWRnZSB0aGF0IGlzIHdpdGhpbiB0aGUgb25lIHBpeGVsIHRocmVzaG9sZC4gICAgICAgICAgKi8KLQotICAgICAgICBtaW5EaWZmID0gQ0YyX0ZJWEVEX01BWDsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IG51bUZhbWlseU90aGVyQmx1ZXM7IGogKz0gMiApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB0b3AgZWRnZSAqLwotICAgICAgICAgIGZsYXRGYW1pbHlFZGdlID0gY2YyX2JsdWVUb0ZpeGVkKCBmYW1pbHlPdGhlckJsdWVzW2ogKyAxXSApOwotCi0gICAgICAgICAgZGlmZiA9IGNmMl9maXhlZEFicyggU1VCX0lOVDMyKCBmbGF0RWRnZSwgZmxhdEZhbWlseUVkZ2UgKSApOwotCi0gICAgICAgICAgaWYgKCBkaWZmIDwgbWluRGlmZiAmJiBkaWZmIDwgY3NVbml0c1BlclBpeGVsICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBibHVlcy0+em9uZVtpXS5jc0ZsYXRFZGdlID0gZmxhdEZhbWlseUVkZ2U7Ci0gICAgICAgICAgICBtaW5EaWZmICAgICAgICAgICAgICAgICAgID0gZGlmZjsKLQotICAgICAgICAgICAgaWYgKCBkaWZmID09IDAgKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjaGVjayB0aGUgZmlyc3QgbWVtYmVyIG9mIEZhbWlseUJsdWVzLCB3aGljaCBpcyBhIGJvdHRvbSB6b25lICovCi0gICAgICAgIGlmICggbnVtRmFtaWx5Qmx1ZXMgPj0gMiApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB0b3AgZWRnZSAqLwotICAgICAgICAgIGZsYXRGYW1pbHlFZGdlID0gY2YyX2JsdWVUb0ZpeGVkKCBmYW1pbHlCbHVlc1sxXSApOwotCi0gICAgICAgICAgZGlmZiA9IGNmMl9maXhlZEFicyggU1VCX0lOVDMyKCBmbGF0RWRnZSwgZmxhdEZhbWlseUVkZ2UgKSApOwotCi0gICAgICAgICAgaWYgKCBkaWZmIDwgbWluRGlmZiAmJiBkaWZmIDwgY3NVbml0c1BlclBpeGVsICkKLSAgICAgICAgICAgIGJsdWVzLT56b25lW2ldLmNzRmxhdEVkZ2UgPSBmbGF0RmFtaWx5RWRnZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBJbiBhIHRvcCB6b25lLCB0aGUgYm90dG9tIGVkZ2UgaXMgdGhlIGZsYXQgZWRnZS4gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogU2VhcmNoIGBGYW1pbHlCbHVlcycgZm9yIHRvcCB6b25lczsgc2tpcCBmaXJzdCB6b25lLCB3aGljaCBpcyBhICovCi0gICAgICAgIC8qIGJvdHRvbSB6b25lOyBsb29rIGZvciBjbG9zZXN0IEZhbWlseSBlZGdlIHRoYXQgaXMgd2l0aGluIHRoZSAgICAqLwotICAgICAgICAvKiBvbmUgcGl4ZWwgdGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBtaW5EaWZmID0gQ0YyX0ZJWEVEX01BWDsKLQotICAgICAgICBmb3IgKCBqID0gMjsgaiA8IG51bUZhbWlseUJsdWVzOyBqICs9IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogYm90dG9tIGVkZ2UgKi8KLSAgICAgICAgICBmbGF0RmFtaWx5RWRnZSA9IGNmMl9ibHVlVG9GaXhlZCggZmFtaWx5Qmx1ZXNbal0gKTsKLQotICAgICAgICAgIC8qIGFkanVzdCBlZGdlcyBvZiB0b3Agem9uZSB1cHdhcmQgYnkgdHdpY2UgZGFya2VuaW5nIGFtb3VudCAqLwotICAgICAgICAgIGZsYXRGYW1pbHlFZGdlICs9IDIgKiBmb250LT5kYXJrZW5ZOyAgICAgIC8qIGJvdHRvbSBlZGdlICovCi0KLSAgICAgICAgICBkaWZmID0gY2YyX2ZpeGVkQWJzKCBTVUJfSU5UMzIoIGZsYXRFZGdlLCBmbGF0RmFtaWx5RWRnZSApICk7Ci0KLSAgICAgICAgICBpZiAoIGRpZmYgPCBtaW5EaWZmICYmIGRpZmYgPCBjc1VuaXRzUGVyUGl4ZWwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJsdWVzLT56b25lW2ldLmNzRmxhdEVkZ2UgPSBmbGF0RmFtaWx5RWRnZTsKLSAgICAgICAgICAgIG1pbkRpZmYgICAgICAgICAgICAgICAgICAgPSBkaWZmOwotCi0gICAgICAgICAgICBpZiAoIGRpZmYgPT0gMCApCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIFRPRE86IGVuZm9yY2Ugc2VwYXJhdGlvbiBvZiB6b25lcywgaW5jbHVkaW5nIEJsdWVGdXp6ICovCi0KLSAgICAvKiBBZGp1c3QgQmx1ZVNjYWxlOyBzaW1pbGFyIHRvIEFkanVzdEJsdWVTY2FsZSgpIGluIGNvcmV0eXBlICovCi0gICAgLyogYGJjc2V0dXAuYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBtYXhab25lSGVpZ2h0ID4gMCApCi0gICAgewotICAgICAgaWYgKCBibHVlcy0+Ymx1ZVNjYWxlID4gRlRfRGl2Rml4KCBjZjJfaW50VG9GaXhlZCggMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhab25lSGVpZ2h0ICkgKQotICAgICAgewotICAgICAgICAvKiBjbGFtcCBhdCBtYXhpbXVtIHNjYWxlICovCi0gICAgICAgIGJsdWVzLT5ibHVlU2NhbGUgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCAxICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpvbmVIZWlnaHQgKTsKLSAgICAgIH0KLQotICAgICAgLyoKLSAgICAgICAqIFRPRE86IFJldmlzaXQgdGhlIGJ1ZyBmaXggZm9yIDYxMzQ0OC4gIFRoZSBtaW5pbXVtIHNjYWxlCi0gICAgICAgKiAgICAgICByZXF1aXJlbWVudCBjYXRjaGVzIGEgbnVtYmVyIG9mIGxpYnJhcnkgZm9udHMuICBGb3IKLSAgICAgICAqICAgICAgIGV4YW1wbGUsIHdpdGggZGVmYXVsdCBCbHVlU2NhbGUgKC4wMzk2MjUpIGFuZCAwLjQgbWluaW11bSwKLSAgICAgICAqICAgICAgIHRoZSB0ZXN0IGJlbG93IGNhdGNoZXMgYW55IGZvbnQgd2l0aCBtYXhab25lSGVpZ2h0IDwgMTAuMS4KLSAgICAgICAqICAgICAgIFRoZXJlIGFyZSBsaWJyYXJ5IGZvbnRzIHJhbmdpbmcgZnJvbSAyIHRvIDEwIHRoYXQgZ2V0Ci0gICAgICAgKiAgICAgICBjYXVnaHQsIGluY2x1ZGluZyBlLmcuLCBFdXJvc3RpbGUgTFQgU3RkIE1lZGl1bSB3aXRoCi0gICAgICAgKiAgICAgICBtYXhab25lSGVpZ2h0IG9mIDYuCi0gICAgICAgKgotICAgICAgICovCi0jaWYgMAotICAgICAgaWYgKCBibHVlU2NhbGUgPCAuNCAvIG1heFpvbmVIZWlnaHQgKQotICAgICAgewotICAgICAgICB0ZXRyYXBoaWxpYV9hc3NlcnQoIDAgKTsKLSAgICAgICAgLyogY2xhbXAgYXQgbWluaW11bSBzY2FsZSwgcGVyIGJ1ZyAwNjEzNDQ4IGZpeCAqLwotICAgICAgICBibHVlU2NhbGUgPSAuNCAvIG1heFpvbmVIZWlnaHQ7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogU3VwcHJlc3Mgb3ZlcnNob290IGFuZCBib29zdCBibHVlIHpvbmVzIGF0IHNtYWxsIHNpemVzLiAgQm9vc3QKLSAgICAgKiBhbW91bnQgdmFyaWVzIGxpbmVhcmx5IGZyb20gMC41IHBpeGVsIG5lYXIgMCB0byAwIHBpeGVsIGF0Ci0gICAgICogYmx1ZVNjYWxlIGN1dG9mZi4KLSAgICAgKiBOb3RlOiBUaGlzIGJvb3N0IGFtb3VudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY29yZXR5cGUgaGV1cmlzdGljLgotICAgICAqCi0gICAgICovCi0KLSAgICBpZiAoIGJsdWVzLT5zY2FsZSA8IGJsdWVzLT5ibHVlU2NhbGUgKQotICAgIHsKLSAgICAgIGJsdWVzLT5zdXBwcmVzc092ZXJzaG9vdCA9IFRSVUU7Ci0KLSAgICAgIC8qIENoYW5nZSByb3VuZGluZyB0aHJlc2hvbGQgZm9yIGBkc0ZsYXRFZGdlJy4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBOb3RlOiBjb25zdGFudCBjaGFuZ2VkIGZyb20gMC41IHRvIDAuNiB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCAqLwotICAgICAgLyogICAgICAgMTBwcGVtIEFyaWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgYmx1ZXMtPmJvb3N0ID0gY2YyX2RvdWJsZVRvRml4ZWQoIC42ICkgLQotICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGNmMl9kb3VibGVUb0ZpeGVkICggLjYgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+c2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPmJsdWVTY2FsZSApOwotICAgICAgaWYgKCBibHVlcy0+Ym9vc3QgPiAweDdGRkYgKQotICAgICAgewotICAgICAgICAvKiBib29zdCBtdXN0IHJlbWFpbiBsZXNzIHRoYW4gMC41LCBvciBiYXNlbGluZSBjb3VsZCBnbyBuZWdhdGl2ZSAqLwotICAgICAgICBibHVlcy0+Ym9vc3QgPSAweDdGRkY7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogYm9vc3QgYW5kIGRhcmtlbmluZyBoYXZlIHNpbWlsYXIgZWZmZWN0czsgZG9uJ3QgZG8gYm90aCAqLwotICAgIGlmICggZm9udC0+c3RlbURhcmtlbmVkICkKLSAgICAgIGJsdWVzLT5ib29zdCA9IDA7Ci0KLSAgICAvKiBzZXQgZGV2aWNlIHNwYWNlIGFsaWdubWVudCBmb3IgZWFjaCB6b25lOyAgICAqLwotICAgIC8qIGFwcGx5IGJvb3N0IGFtb3VudCBiZWZvcmUgcm91bmRpbmcgZmxhdCBlZGdlICovCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGJsdWVzLT5jb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIGJsdWVzLT56b25lW2ldLmJvdHRvbVpvbmUgKQotICAgICAgICBibHVlcy0+em9uZVtpXS5kc0ZsYXRFZGdlID0gY2YyX2ZpeGVkUm91bmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+em9uZVtpXS5jc0ZsYXRFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT5zY2FsZSApIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPmJvb3N0ICk7Ci0gICAgICBlbHNlCi0gICAgICAgIGJsdWVzLT56b25lW2ldLmRzRmxhdEVkZ2UgPSBjZjJfZml4ZWRSb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT56b25lW2ldLmNzRmxhdEVkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPnNjYWxlICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+Ym9vc3QgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qCi0gICAqIENoZWNrIHdoZXRoZXIgYHN0ZW1IaW50JyBpcyBjYXB0dXJlZCBieSBvbmUgb2YgdGhlIGJsdWUgem9uZXMuCi0gICAqCi0gICAqIFplcm8sIG9uZSBvciBib3RoIGVkZ2VzIG1heSBiZSB2YWxpZDsgb25seSB2YWxpZCBlZGdlcyBjYW4gYmUKLSAgICogY2FwdHVyZWQuICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIENvb2xUeXBlLCBzZWFyY2ggdG9wIGFuZCBib3R0b20KLSAgICogem9uZXMgaW4gdGhlIHNhbWUgcGFzcyAoc2VlIGBCbHVlTG9jaycpLiAgSWYgYSBoaW50IGlzIGNhcHR1cmVkLAotICAgKiByZXR1cm4gdHJ1ZSBhbmQgcG9zaXRpb24gdGhlIGVkZ2UocykgaW4gb25lIG9mIDMgd2F5czoKLSAgICoKLSAgICogIDEpIElmIGBCbHVlU2NhbGUnIHN1cHByZXNzZXMgb3ZlcnNob290LCBwb3NpdGlvbiB0aGUgY2FwdHVyZWQgZWRnZQotICAgKiAgICAgYXQgdGhlIGZsYXQgZWRnZSBvZiB0aGUgem9uZS4KLSAgICogIDIpIElmIG92ZXJzaG9vdCBpcyBub3Qgc3VwcHJlc3NlZCBhbmQgYEJsdWVTaGlmdCcgcmVxdWlyZXMKLSAgICogICAgIG92ZXJzaG9vdCwgcG9zaXRpb24gdGhlIGNhcHR1cmVkIGVkZ2UgYSBtaW5pbXVtIG9mIDEgZGV2aWNlIHBpeGVsCi0gICAqICAgICBmcm9tIHRoZSBmbGF0IGVkZ2UuCi0gICAqICAzKSBJZiBvdmVyc2hvb3QgaXMgbm90IHN1cHByZXNzZWQgb3IgcmVxdWlyZWQsIHBvc2l0aW9uIHRoZSBjYXB0dXJlZAotICAgKiAgICAgZWRnZSBhdCB0aGUgbmVhcmVzdCBkZXZpY2UgcGl4ZWwuCi0gICAqCi0gICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQotICBjZjJfYmx1ZXNfY2FwdHVyZSggY29uc3QgQ0YyX0JsdWVzICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgIENGMl9IaW50ICAgICAgICAgYm90dG9tSGludEVkZ2UsCi0gICAgICAgICAgICAgICAgICAgICBDRjJfSGludCAgICAgICAgIHRvcEhpbnRFZGdlICkKLSAgewotICAgIC8qIFRPRE86IHZhbGlkYXRlPyAqLwotICAgIENGMl9GaXhlZCAgY3NGdXp6ID0gYmx1ZXMtPmJsdWVGdXp6OwotCi0gICAgLyogbmV3IHBvc2l0aW9uIG9mIGNhcHR1cmVkIGVkZ2UgKi8KLSAgICBDRjJfRml4ZWQgIGRzTmV3OwotCi0gICAgLyogYW1vdW50IHRoYXQgaGludCBpcyBtb3ZlZCB3aGVuIHBvc2l0aW9uZWQgKi8KLSAgICBDRjJfRml4ZWQgIGRzTW92ZSA9IDA7Ci0KLSAgICBGVF9Cb29sICAgY2FwdHVyZWQgPSBGQUxTRTsKLSAgICBDRjJfVUludCAgaTsKLQotCi0gICAgLyogYXNzZXJ0IGVkZ2UgZmxhZ3MgYXJlIGNvbnNpc3RlbnQgKi8KLSAgICBGVF9BU1NFUlQoICFjZjJfaGludF9pc1RvcCggYm90dG9tSGludEVkZ2UgKSAmJgotICAgICAgICAgICAgICAgIWNmMl9oaW50X2lzQm90dG9tKCB0b3BIaW50RWRnZSApICk7Ci0KLSAgICAvKiBUT0RPOiBzZWFyY2ggb25jZSB3aXRob3V0IGJsdWUgZnV6eiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNvcmV0eXBlPyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgYmx1ZXMtPmNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIGlmICggYmx1ZXMtPnpvbmVbaV0uYm90dG9tWm9uZSAgICAgICAgICAgJiYKLSAgICAgICAgICAgY2YyX2hpbnRfaXNCb3R0b20oIGJvdHRvbUhpbnRFZGdlICkgKQotICAgICAgewotICAgICAgICBpZiAoIFNVQl9JTlQzMiggYmx1ZXMtPnpvbmVbaV0uY3NCb3R0b21FZGdlLCBjc0Z1enogKSA8PQotICAgICAgICAgICAgICAgYm90dG9tSGludEVkZ2UtPmNzQ29vcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGJvdHRvbUhpbnRFZGdlLT5jc0Nvb3JkIDw9Ci0gICAgICAgICAgICAgICBBRERfSU5UMzIoIGJsdWVzLT56b25lW2ldLmNzVG9wRWRnZSwgY3NGdXp6ICkgICAgICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGJvdHRvbSBlZGdlIGNhcHR1cmVkIGJ5IGJvdHRvbSB6b25lICovCi0KLSAgICAgICAgICBpZiAoIGJsdWVzLT5zdXBwcmVzc092ZXJzaG9vdCApCi0gICAgICAgICAgICBkc05ldyA9IGJsdWVzLT56b25lW2ldLmRzRmxhdEVkZ2U7Ci0KLSAgICAgICAgICBlbHNlIGlmICggU1VCX0lOVDMyKCBibHVlcy0+em9uZVtpXS5jc1RvcEVkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tSGludEVkZ2UtPmNzQ29vcmQgKSA+PQotICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT5ibHVlU2hpZnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGd1YXJhbnRlZSBtaW5pbXVtIG9mIDEgcGl4ZWwgb3ZlcnNob290ICovCi0gICAgICAgICAgICBkc05ldyA9IEZUX01JTigKLSAgICAgICAgICAgICAgICAgICAgICBjZjJfZml4ZWRSb3VuZCggYm90dG9tSGludEVkZ2UtPmRzQ29vcmQgKSwKLSAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+em9uZVtpXS5kc0ZsYXRFZGdlIC0gY2YyX2ludFRvRml4ZWQoIDEgKSApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzaW1wbHkgcm91bmQgY2FwdHVyZWQgZWRnZSAqLwotICAgICAgICAgICAgZHNOZXcgPSBjZjJfZml4ZWRSb3VuZCggYm90dG9tSGludEVkZ2UtPmRzQ29vcmQgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkc01vdmUgICA9IGRzTmV3IC0gYm90dG9tSGludEVkZ2UtPmRzQ29vcmQ7Ci0gICAgICAgICAgY2FwdHVyZWQgPSBUUlVFOwotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCAhYmx1ZXMtPnpvbmVbaV0uYm90dG9tWm9uZSAmJiBjZjJfaGludF9pc1RvcCggdG9wSGludEVkZ2UgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggKCBTVUJfSU5UMzIoIGJsdWVzLT56b25lW2ldLmNzQm90dG9tRWRnZSwgY3NGdXp6ICkgKSA8PQotICAgICAgICAgICAgICAgdG9wSGludEVkZ2UtPmNzQ29vcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICB0b3BIaW50RWRnZS0+Y3NDb29yZCA8PQotICAgICAgICAgICAgICAgQUREX0lOVDMyKCBibHVlcy0+em9uZVtpXS5jc1RvcEVkZ2UsIGNzRnV6eiApICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdG9wIGVkZ2UgY2FwdHVyZWQgYnkgdG9wIHpvbmUgKi8KLQotICAgICAgICAgIGlmICggYmx1ZXMtPnN1cHByZXNzT3ZlcnNob290ICkKLSAgICAgICAgICAgIGRzTmV3ID0gYmx1ZXMtPnpvbmVbaV0uZHNGbGF0RWRnZTsKLQotICAgICAgICAgIGVsc2UgaWYgKCAoIHRvcEhpbnRFZGdlLT5jc0Nvb3JkIC0gYmx1ZXMtPnpvbmVbaV0uY3NCb3R0b21FZGdlICkgPj0KLSAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+Ymx1ZVNoaWZ0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBndWFyYW50ZWUgbWluaW11bSBvZiAxIHBpeGVsIG92ZXJzaG9vdCAqLwotICAgICAgICAgICAgZHNOZXcgPSBGVF9NQVgoCi0gICAgICAgICAgICAgICAgICAgICAgY2YyX2ZpeGVkUm91bmQoIHRvcEhpbnRFZGdlLT5kc0Nvb3JkICksCi0gICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPnpvbmVbaV0uZHNGbGF0RWRnZSArIGNmMl9pbnRUb0ZpeGVkKCAxICkgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogc2ltcGx5IHJvdW5kIGNhcHR1cmVkIGVkZ2UgKi8KLSAgICAgICAgICAgIGRzTmV3ID0gY2YyX2ZpeGVkUm91bmQoIHRvcEhpbnRFZGdlLT5kc0Nvb3JkICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZHNNb3ZlICAgPSBkc05ldyAtIHRvcEhpbnRFZGdlLT5kc0Nvb3JkOwotICAgICAgICAgIGNhcHR1cmVkID0gVFJVRTsKLQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBjYXB0dXJlZCApCi0gICAgewotICAgICAgLyogbW92ZSBib3RoIGVkZ2VzIGFuZCBmbGFnIHRoZW0gYGxvY2tlZCcgKi8KLSAgICAgIGlmICggY2YyX2hpbnRfaXNWYWxpZCggYm90dG9tSGludEVkZ2UgKSApCi0gICAgICB7Ci0gICAgICAgIGJvdHRvbUhpbnRFZGdlLT5kc0Nvb3JkICs9IGRzTW92ZTsKLSAgICAgICAgY2YyX2hpbnRfbG9jayggYm90dG9tSGludEVkZ2UgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBjZjJfaGludF9pc1ZhbGlkKCB0b3BIaW50RWRnZSApICkKLSAgICAgIHsKLSAgICAgICAgdG9wSGludEVkZ2UtPmRzQ29vcmQgKz0gZHNNb3ZlOwotICAgICAgICBjZjJfaGludF9sb2NrKCB0b3BIaW50RWRnZSApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBjYXB0dXJlZDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZjJibHVlcy5oIGIvc3JjL2NmZi9jZjJibHVlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJjZDlkLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2YyYmx1ZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJibHVlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBoYW5kbGluZyBCbHVlIFpvbmVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiBBIGBDRjJfQmx1ZXMnIG9iamVjdCBzdG9yZXMgdGhlIGJsdWUgem9uZXMgKGhvcml6b250YWwgYWxpZ25tZW50Ci0gICAqIHpvbmVzKSBvZiBhIGZvbnQuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSBDRkYgcHJpdmF0ZSBkaWN0aW9uYXJ5Ci0gICAqIGJ5IGBCbHVlVmFsdWVzJywgYE90aGVyQmx1ZXMnLCBgRmFtaWx5Qmx1ZXMnLCBhbmQgYEZhbWlseU90aGVyQmx1ZXMnLgotICAgKiBFYWNoIHpvbmUgaXMgZGVmaW5lZCBieSBhIHRvcCBhbmQgYm90dG9tIGVkZ2UgaW4gY2hhcmFjdGVyIHNwYWNlLgotICAgKiBGdXJ0aGVyLCBlYWNoIHpvbmUgaXMgZWl0aGVyIGEgdG9wIHpvbmUgb3IgYSBib3R0b20gem9uZSwgYXMgcmVjb3JkZWQKLSAgICogYnkgYGJvdHRvbVpvbmUnLgotICAgKgotICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYEJsdWVWYWx1ZXMnIGFuZCBgRmFtaWx5Qmx1ZXMnIGlzIDcgZWFjaC4KLSAgICogSG93ZXZlciwgdGhlc2UgYXJlIGNvbWJpbmVkIHRvIHByb2R1Y2UgYSB0b3RhbCBvZiA3IHpvbmVzLgotICAgKiBTaW1pbGFybHksIHRoZSBtYXhpbXVtIG51bWJlciBvZiBgT3RoZXJCbHVlcycgYW5kIGBGYW1pbHlPdGhlckJsdWVzJwotICAgKiBpcyA1IGFuZCB0aGVzZSBhcmUgY29tYmluZWQgdG8gcHJvZHVjZSBhbiBhZGRpdGlvbmFsIDUgem9uZXMuCi0gICAqCi0gICAqIEJsdWUgem9uZXMgYXJlIHVzZWQgdG8gYGNhcHR1cmUnIGhpbnRzIGFuZCBmb3JjZSB0aGVtIHRvIGEgY29tbW9uCi0gICAqIGFsaWdubWVudCBwb2ludC4gIFRoaXMgYWxpZ25tZW50IGlzIHJlY29yZGVkIGluIGRldmljZSBzcGFjZSBpbgotICAgKiBgZHNGbGF0RWRnZScuICBFeGNlcHQgZm9yIHRoaXMgdmFsdWUsIGEgYENGMl9CbHVlcycgb2JqZWN0IGNvdWxkIGJlCi0gICAqIGNvbnN0cnVjdGVkIGluZGVwZW5kZW50bHkgb2Ygc2NhbGluZy4gIENvbnN0cnVjdGlvbiBtYXkgb2NjdXIgb25jZQotICAgKiB0aGUgbWF0cml4IGlzIGtub3duLiAgT3RoZXIgZmVhdHVyZXMgaW1wbGVtZW50ZWQgaW4gdGhlIENhcHR1cmUKLSAgICogbWV0aG9kIGFyZSBvdmVyc2hvb3Qgc3VwcHJlc3Npb24sIG92ZXJzaG9vdCBlbmZvcmNlbWVudCwgYW5kIEJsdWUKLSAgICogQm9vc3QuCi0gICAqCi0gICAqIENhcHR1cmUgaXMgZGV0ZXJtaW5lZCBieSBgQmx1ZVZhbHVlcycgYW5kIGBPdGhlckJsdWVzJywgYnV0IHRoZQotICAgKiBhbGlnbm1lbnQgcG9pbnQgbWF5IGJlIGFkanVzdGVkIHRvIHRoZSBzY2FsZWQgZmxhdCBlZGdlIG9mCi0gICAqIGBGYW1pbHlCbHVlcycgb3IgYEZhbWlseU90aGVyQmx1ZXMnLiAgTm8gYWxpZ25tZW50IGlzIGRvbmUgdG8gdGhlCi0gICAqIGN1cnZlZCBlZGdlIG9mIGEgem9uZS4KLSAgICoKLSAgICovCi0KLQotI2lmbmRlZiBDRjJCTFVFU19IXwotI2RlZmluZSBDRjJCTFVFU19IXwotCi0KLSNpbmNsdWRlICJjZjJnbHVlLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKgotICAgKiBgQ0YyX0hpbnQnIGlzIHNoYXJlZCBieSBgY2YyaGludHMuaCcgYW5kCi0gICAqIGBjZjJibHVlcy5oJywgYnV0IGBjZjJibHVlcy5oJyBkZXBlbmRzIG9uCi0gICAqIGBjZjJoaW50cy5oJywgc28gZGVmaW5lIGl0IGhlcmUuICBOb3RlOiBUaGUgdHlwZWRlZiBpcyBpbgotICAgKiBgY2YyZ2x1ZS5oJy4KLSAgICoKLSAgICovCi0gIGVudW0KLSAgewotICAgIENGMl9HaG9zdEJvdHRvbSA9IDB4MSwgIC8qIGEgc2luZ2xlIGJvdHRvbSBlZGdlICAgICAgICAgICAqLwotICAgIENGMl9HaG9zdFRvcCAgICA9IDB4MiwgIC8qIGEgc2luZ2xlIHRvcCBlZGdlICAgICAgICAgICAgICAqLwotICAgIENGMl9QYWlyQm90dG9tICA9IDB4NCwgIC8qIHRoZSBib3R0b20gZWRnZSBvZiBhIHN0ZW0gaGludCAqLwotICAgIENGMl9QYWlyVG9wICAgICA9IDB4OCwgIC8qIHRoZSB0b3AgZWRnZSBvZiBhIHN0ZW0gaGludCAgICAqLwotICAgIENGMl9Mb2NrZWQgICAgICA9IDB4MTAsIC8qIHRoaXMgZWRnZSBoYXMgYmVlbiBhbGlnbmVkICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5IGEgYmx1ZSB6b25lICAgICAgICAgICAgICAgICAqLwotICAgIENGMl9TeW50aGV0aWMgICA9IDB4MjAgIC8qIHRoaXMgZWRnZSB3YXMgc3ludGhlc2l6ZWQgICAgICAqLwotICB9OwotCi0KLSAgLyoKLSAgICogRGVmYXVsdCB2YWx1ZSBmb3IgT1MvMiB0eXBvQXNjZW5kZXIvRGVzY2VuZGVyIHdoZW4gdGhlaXIgZGlmZmVyZW5jZQotICAgKiBpcyBub3QgZXF1YWwgdG8gYHVuaXRzUGVyRW0nLiAgVGhlIGRlZmF1bHQgaXMgYmFzZWQgb24gLTI1MCBhbmQgMTEwMAotICAgKiBpbiBgQ0YyX0JsdWVzJywgYXNzdW1pbmcgMTAwMCB1bml0cyBwZXIgZW0gaGVyZS4KLSAgICoKLSAgICovCi0gIGVudW0KLSAgewotICAgIENGMl9JQ0ZfVG9wICAgID0gY2YyX2ludFRvRml4ZWQoICA4ODAgKSwKLSAgICBDRjJfSUNGX0JvdHRvbSA9IGNmMl9pbnRUb0ZpeGVkKCAtMTIwICkKLSAgfTsKLQotCi0gIC8qCi0gICAqIENvbnN0YW50IHVzZWQgZm9yIGhpbnQgYWRqdXN0bWVudCBhbmQgZm9yIHN5bnRoZXRpYyBlbSBib3ggaGludAotICAgKiBwbGFjZW1lbnQuCi0gICAqLwotI2RlZmluZSBDRjJfTUlOX0NPVU5URVIgIGNmMl9kb3VibGVUb0ZpeGVkKCAwLjUgKQotCi0KLSAgLyogc2hhcmVkIHR5cGVkZWYgaXMgaW4gY2YyZ2x1ZS5oICovCi0gIHN0cnVjdCAgQ0YyX0hpbnRSZWNfCi0gIHsKLSAgICBDRjJfVUludCAgZmxhZ3M7ICAvKiBhdHRyaWJ1dGVzIG9mIHRoZSBlZGdlICAgICAgICAgICAgKi8KLSAgICBzaXplX3QgICAgaW5kZXg7ICAvKiBpbmRleCBpbiBvcmlnaW5hbCBzdGVtIGhpbnQgYXJyYXkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAvKiAoaWYgbm90IHN5bnRoZXRpYykgICAgICAgICAgICAgICAgKi8KLSAgICBDRjJfRml4ZWQgIGNzQ29vcmQ7Ci0gICAgQ0YyX0ZpeGVkICBkc0Nvb3JkOwotICAgIENGMl9GaXhlZCAgc2NhbGU7Ci0gIH07Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX0JsdWVSZWNfCi0gIHsKLSAgICBDRjJfRml4ZWQgIGNzQm90dG9tRWRnZTsKLSAgICBDRjJfRml4ZWQgIGNzVG9wRWRnZTsKLSAgICBDRjJfRml4ZWQgIGNzRmxhdEVkZ2U7IC8qIG1heSBiZSBmcm9tIGVpdGhlciBsb2NhbCBvciBGYW1pbHkgem9uZXMgKi8KLSAgICBDRjJfRml4ZWQgIGRzRmxhdEVkZ2U7IC8qIHRvcCBlZGdlIG9mIGJvdHRvbSB6b25lIG9yIGJvdHRvbSBlZGdlICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mIHRvcCB6b25lIChyb3VuZGVkKSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICBib3R0b21ab25lOwotCi0gIH0gQ0YyX0JsdWVSZWM7Ci0KLQotICAvKiBtYXggdG90YWwgYmx1ZSB6b25lcyBpcyAxMiAqLwotICBlbnVtCi0gIHsKLSAgICBDRjJfTUFYX0JMVUVTICAgICAgPSA3LAotICAgIENGMl9NQVhfT1RIRVJCTFVFUyA9IDUKLSAgfTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfQmx1ZXNSZWNfCi0gIHsKLSAgICBDRjJfRml4ZWQgIHNjYWxlOwotICAgIENGMl9VSW50ICAgY291bnQ7Ci0gICAgRlRfQm9vbCAgICBzdXBwcmVzc092ZXJzaG9vdDsKLSAgICBGVF9Cb29sICAgIGRvRW1Cb3hIaW50czsKLQotICAgIENGMl9GaXhlZCAgYmx1ZVNjYWxlOwotICAgIENGMl9GaXhlZCAgYmx1ZVNoaWZ0OwotICAgIENGMl9GaXhlZCAgYmx1ZUZ1eno7Ci0KLSAgICBDRjJfRml4ZWQgIGJvb3N0OwotCi0gICAgQ0YyX0hpbnRSZWMgIGVtQm94VG9wRWRnZTsKLSAgICBDRjJfSGludFJlYyAgZW1Cb3hCb3R0b21FZGdlOwotCi0gICAgQ0YyX0JsdWVSZWMgIHpvbmVbQ0YyX01BWF9CTFVFUyArIENGMl9NQVhfT1RIRVJCTFVFU107Ci0KLSAgfSBDRjJfQmx1ZXNSZWMsICpDRjJfQmx1ZXM7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9ibHVlc19pbml0KCBDRjJfQmx1ZXMgIGJsdWVzLAotICAgICAgICAgICAgICAgICAgQ0YyX0ZvbnQgICBmb250ICk7Ci0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgY2YyX2JsdWVzX2NhcHR1cmUoIGNvbnN0IENGMl9CbHVlcyAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICBDRjJfSGludCAgICAgICAgIGJvdHRvbUhpbnRFZGdlLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0hpbnQgICAgICAgICB0b3BIaW50RWRnZSApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogQ0YyQkxVRVNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2YyZXJyb3IuYyBiL3NyYy9jZmYvY2YyZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkZDY5Zi4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmMmVycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJlcnJvci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBlcnJvciBoYW5kbGluZyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9zZXRFcnJvciggRlRfRXJyb3IqICBlcnJvciwKLSAgICAgICAgICAgICAgICBGVF9FcnJvciAgIHZhbHVlICkKLSAgewotICAgIGlmICggZXJyb3IgJiYgISplcnJvciApCi0gICAgICAqZXJyb3IgPSB2YWx1ZTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZjJlcnJvci5oIGIvc3JjL2NmZi9jZjJlcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmM3NzBkLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2YyZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJlcnJvci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBlcnJvciBoYW5kbGluZyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDRjJFUlJPUl9IXwotI2RlZmluZSBDRjJFUlJPUl9IXwotCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgRlRFUlJPUlNfSF8KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIENGMl9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfQ0YyCi0KLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLSNpbmNsdWRlICJjZjJmdC5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogQSBwb29yLW1hbiBlcnJvciBmYWNpbGl0eS4KLSAgICoKLSAgICogVGhpcyBjb2RlIGJlaW5nIHdyaXR0ZW4gaW4gdmFuaWxsYSBDLCBkb2Vzbid0IGhhdmUgdGhlIGx1eHVyeSBvZiBhCi0gICAqIGxhbmd1YWdlLXN1cHBvcnRlZCBleGNlcHRpb24gbWVjaGFuaXNtIHN1Y2ggYXMgdGhlIG9uZSBhdmFpbGFibGUgaW4KLSAgICogSmF2YS4gIEluc3RlYWQsIHdlIGFyZSBzdHVjayB3aXRoIHVzaW5nIGVycm9yIGNvZGVzIHRoYXQgbXVzdCBiZQotICAgKiBjYXJlZnVsbHkgbWFuYWdlZCBhbmQgcHJlc2VydmVkLiAgSG93ZXZlciwgaXQgaXMgY29udmVuaWVudCBmb3IgdXMgdG8KLSAgICogbW9kZWwgb3VyIGVycm9yIG1lY2hhbmlzbSBvbiBhIEphdmEtbGlrZSBleGNlcHRpb24gbWVjaGFuaXNtLgotICAgKiBXaGVuIHdlIGFzc2lnbiBhbiBlcnJvciBjb2RlIHdlIGFyZSB0aHVzIGB0aHJvd2luZycgYW4gZXJyb3IuCi0gICAqCi0gICAqIFRoZSBwcmVzZXJ2YXRpb24gb2YgYW4gZXJyb3IgY29kZSBpcyBkb25lIGJ5IGNvZGluZyBjb252ZW50aW9uLgotICAgKiBVcG9uIGEgZnVuY3Rpb24gY2FsbCBpZiB0aGUgZXJyb3IgY29kZSBpcyBhbnl0aGluZyBvdGhlciB0aGFuCi0gICAqIGBGVF9FcnJfT2snLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8sIHdlCi0gICAqIHdpbGwgcmV0dXJuIHdpdGhvdXQgYWx0ZXJpbmcgdGhhdCBlcnJvci4gIFRoaXMgd2lsbCBhbGxvdyB0aGUKLSAgICogZXJyb3IgdG8gcHJvcGFnYXRlIGFuZCBiZSBoYW5kbGVkIGF0IHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiBpbgotICAgKiB0aGUgY29kZS4KLSAgICoKLSAgICogVGhpcyBhbGxvd3MgYSBzdHlsZSBvZiBjb2RlIHdoZXJlIHRoZSBlcnJvciBjb2RlIGlzIGluaXRpYWxpemVkCi0gICAqIHVwIGZyb250IGFuZCBhIGJsb2NrIG9mIGNhbGxzIGFyZSBtYWRlIHdpdGggdGhlIGVycm9yIGNvZGUgb25seQotICAgKiBiZWluZyBjaGVja2VkIGFmdGVyIHRoZSBibG9jay4gIElmIGEgbmV3IGVycm9yIG9jY3VycywgdGhlIG9yaWdpbmFsCi0gICAqIGVycm9yIHdpbGwgYmUgcHJlc2VydmVkIGFuZCBhIGZ1bmN0aW9uYWwgbm8tb3Agc2hvdWxkIHJlc3VsdCBpbiBhbnkKLSAgICogc3Vic2VxdWVudCBmdW5jdGlvbiB0aGF0IGhhcyBhbiBpbml0aWFsIGVycm9yIGNvZGUgbm90IGVxdWFsIHRvCi0gICAqIGBGVF9FcnJfT2snLgotICAgKgotICAgKiBFcnJvcnMgYXJlIGVuY29kZWQgYnkgY2FsbGluZyB0aGUgYEZUX1RIUk9XJyBtYWNyby4gIEZvciBleGFtcGxlLAotICAgKgotICAgKiB7Ci0gICAqICAgRlRfRXJyb3IgIGU7Ci0gICAqCi0gICAqCi0gICAqICAgLi4uCi0gICAqICAgZSA9IEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0gICAqIH0KLSAgICoKLSAgICovCi0KLQotICAvKiBTZXQgZXJyb3IgY29kZSB0byBhIHBhcnRpY3VsYXIgdmFsdWUuICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX3NldEVycm9yKCBGVF9FcnJvciogIGVycm9yLAotICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgdmFsdWUgKTsKLQotCi0gIC8qCi0gICAqIEEgbWFjcm8gdGhhdCBjb25kaXRpb25hbGx5IHNldHMgYW4gZXJyb3IgY29kZS4KLSAgICoKLSAgICogVGhpcyBtYWNybyB3aWxsIGZpcnN0IGNoZWNrIHdoZXRoZXIgYGVycm9yJyBpcyBzZXQ7Ci0gICAqIGlmIG5vdCwgaXQgd2lsbCBzZXQgaXQgdG8gYGUnLgotICAgKgotICAqLwotI2RlZmluZSBDRjJfU0VUX0VSUk9SKCBlcnJvciwgZSApICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2YyX3NldEVycm9yKCBlcnJvciwgRlRfVEhST1coIGUgKSApCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBDRjJFUlJPUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZjJmaXhlZC5oIGIvc3JjL2NmZi9jZjJmaXhlZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQxMTg0Li4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2YyZml4ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMmZpeGVkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIEZpeGVkIFBvaW50IE1hdGhlbWF0aWNzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIENGMkZJWEVEX0hfCi0jZGVmaW5lIENGMkZJWEVEX0hfCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiByYXN0ZXJpemVyIGludGVnZXIgYW5kIGZpeGVkIHBvaW50IGFyaXRobWV0aWMgbXVzdCBiZSAzMi1iaXQgKi8KLQotI2RlZmluZSAgIENGMl9GaXhlZCAgQ0YyX0YxNkRvdDE2Ci0gIHR5cGVkZWYgRlRfSW50MzIgICBDRjJfRnJhYzsgICAvKiAyLjMwIGZpeGVkIHBvaW50ICovCi0KLQotI2RlZmluZSBDRjJfRklYRURfTUFYICAgICAgKCAoQ0YyX0ZpeGVkKTB4N0ZGRkZGRkZMICkKLSNkZWZpbmUgQ0YyX0ZJWEVEX01JTiAgICAgICggKENGMl9GaXhlZCkweDgwMDAwMDAwTCApCi0jZGVmaW5lIENGMl9GSVhFRF9PTkUgICAgICAoIChDRjJfRml4ZWQpMHgxMDAwMEwgKQotI2RlZmluZSBDRjJfRklYRURfRVBTSUxPTiAgKCAoQ0YyX0ZpeGVkKTB4MDAwMSApCi0KLSAgLyogaW4gQyA4OSwgbGVmdCBhbmQgcmlnaHQgc2hpZnQgb2YgbmVnYXRpdmUgbnVtYmVycyBpcyAgKi8KLSAgLyogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgYmVoYXZpb3VyIGluIHRoZSBnZW5lcmFsIGNhc2UgKi8KLQotI2RlZmluZSBjZjJfaW50VG9GaXhlZCggaSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChDRjJfRml4ZWQpKCAoRlRfVUludDMyKShpKSA8PCAxNiApICkKLSNkZWZpbmUgY2YyX2ZpeGVkVG9JbnQoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoRlRfU2hvcnQpKCAoIChGVF9VSW50MzIpKHgpICsgMHg4MDAwVSApID4+IDE2ICkgKQotI2RlZmluZSBjZjJfZml4ZWRSb3VuZCggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChDRjJfRml4ZWQpKCAoIChGVF9VSW50MzIpKHgpICsgMHg4MDAwVSApICYgMHhGRkZGMDAwMFVMICkgKQotI2RlZmluZSBjZjJfZG91YmxlVG9GaXhlZCggZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChDRjJfRml4ZWQpKCAoZikgKiA2NTUzNi4wICsgMC41ICkgKQotI2RlZmluZSBjZjJfZml4ZWRBYnMoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh4KSA8IDAgPyBORUdfSU5UMzIoIHggKSA6ICh4KSApCi0jZGVmaW5lIGNmMl9maXhlZEZsb29yKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKENGMl9GaXhlZCkoIChGVF9VSW50MzIpKHgpICYgMHhGRkZGMDAwMFVMICkgKQotI2RlZmluZSBjZjJfZml4ZWRGcmFjdGlvbiggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh4KSAtIGNmMl9maXhlZEZsb29yKCB4ICkgKQotI2RlZmluZSBjZjJfZnJhY1RvRml4ZWQoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh4KSA8IDAgPyAtKCAoIC0oeCkgKyAweDIwMDAgKSA+PiAxNCApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIDogICggKCAgKHgpICsgMHgyMDAwICkgPj4gMTQgKSApCi0KLQotICAvKiBzaWduZWQgbnVtZXJpYyB0eXBlcyAqLwotICB0eXBlZGVmIGVudW0gIENGMl9OdW1iZXJUeXBlXwotICB7Ci0gICAgQ0YyX051bWJlckZpeGVkLCAgICAvKiAxNi4xNiAqLwotICAgIENGMl9OdW1iZXJGcmFjLCAgICAgLyogIDIuMzAgKi8KLSAgICBDRjJfTnVtYmVySW50ICAgICAgIC8qIDMyLjAgICovCi0KLSAgfSBDRjJfTnVtYmVyVHlwZTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIENGMkZJWEVEX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmMmZvbnQuYyBiL3NyYy9jZmYvY2YyZm9udC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM3MWE4Li4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2YyZm9udC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMmZvbnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGZvbnQgaW5zdGFuY2VzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDE0IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLQotI2luY2x1ZGUgImNmMmdsdWUuaCIKLSNpbmNsdWRlICJjZjJmb250LmgiCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLSNpbmNsdWRlICJjZjJpbnRycC5oIgotCi0KLSAgLyogQ29tcHV0ZSBhIHN0ZW0gZGFya2VuaW5nIGFtb3VudCBpbiBjaGFyYWN0ZXIgc3BhY2UuICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9jb21wdXRlRGFya2VuaW5nKCBDRjJfRml4ZWQgICBlbVJhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgIHN0ZW1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCogIGRhcmtlbkFtb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgIGJvbGRlbkFtb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIHN0ZW1EYXJrZW5lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogICAgIGRhcmtlblBhcmFtcyApCi0gIHsKLSAgICAvKgotICAgICAqIFRvdGFsIGRhcmtlbmluZyBhbW91bnQgaXMgY29tcHV0ZWQgaW4gMTAwMCB1bml0IGNoYXJhY3RlciBzcGFjZQotICAgICAqIHVzaW5nIHRoZSBtb2RpZmllZCA1IHBhcnQgY3VydmUgYXMgQWRvYmUncyBBdmFsb24gcmFzdGVyaXplci4KLSAgICAgKiBUaGUgZGFya2VuaW5nIGFtb3VudCBpcyBzbWFsbGVyIGZvciB0aGlja2VyIHN0ZW1zLgotICAgICAqIEl0IGJlY29tZXMgemVybyB3aGVuIHRoZSBzdGVtIGlzIHRoaWNrZXIgdGhhbiAyLjMzMyBwaXhlbHMuCi0gICAgICoKLSAgICAgKiBCeSBkZWZhdWx0LCB3ZSB1c2UKLSAgICAgKgotICAgICAqICAgZGFya2VuQW1vdW50ID0gMC40IHBpeGVscyAgIGlmIHNjYWxlZFN0ZW0gPD0gMC41IHBpeGVscywKLSAgICAgKiAgIGRhcmtlbkFtb3VudCA9IDAuMjc1IHBpeGVscyBpZiAxIDw9IHNjYWxlZFN0ZW0gPD0gMS42NjcgcGl4ZWxzLAotICAgICAqICAgZGFya2VuQW1vdW50ID0gMCBwaXhlbCAgICAgIGlmIHNjYWxlZFN0ZW0gPj0gMi4zMzMgcGl4ZWxzLAotICAgICAqCi0gICAgICogYW5kIHBpZWNld2lzZSBsaW5lYXIgaW4tYmV0d2VlbjoKLSAgICAgKgotICAgICAqCi0gICAgICogICBkYXJrZW5pbmcKLSAgICAgKiAgICAgICBeCi0gICAgICogICAgICAgfAotICAgICAqICAgICAgIHwgICAgICAoeDEseTEpCi0gICAgICogICAgICAgfC0tLS0tLS0tKwotICAgICAqICAgICAgIHwgICAgICAgICBcCi0gICAgICogICAgICAgfCAgICAgICAgICBcCi0gICAgICogICAgICAgfCAgICAgICAgICAgXCAgICAgICAgICAoeDMseTMpCi0gICAgICogICAgICAgfCAgICAgICAgICAgICstLS0tLS0tLS0tKwotICAgICAqICAgICAgIHwgICAgICAgICh4Mix5MikgICAgICAgICBcCi0gICAgICogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICh4NCx5NCkKLSAgICAgKiAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgIHN0ZW0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3MKLSAgICAgKgotICAgICAqCi0gICAgICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgdGhlCi0gICAgICogYGRhcmtlbmluZy1wYXJhbWV0ZXJzJyBwcm9wZXJ0eToKLSAgICAgKgotICAgICAqICAgKHgxLCB5MSkgPSAoNTAwLCA0MDApCi0gICAgICogICAoeDIsIHkyKSA9ICgxMDAwLCAyNzUpCi0gICAgICogICAoeDMsIHkzKSA9ICgxNjY3LCAyNzUpCi0gICAgICogICAoeDQsIHk0KSA9ICgyMzMzLCAwKQotICAgICAqCi0gICAgICovCi0KLSAgICAvKiBJbnRlcm5hbCBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgaW4gdW5pdHMgcGVyIHRob3VzYW5kIGZvciAqLwotICAgIC8qIGNvbnZlbmllbmNlLiBUaGUgeCBheGlzIGlzIHNjYWxlZCBzdGVtIHdpZHRoIGluICAgICAgICAgICovCi0gICAgLyogdGhvdXNhbmR0aHMgb2YgYSBwaXhlbC4gVGhhdCBpcywgMTAwMCBpcyAxIHBpeGVsLiAgICAgICAgKi8KLSAgICAvKiBUaGUgeSBheGlzIGlzIGRhcmtlbmluZyBhbW91bnQgaW4gdGhvdXNhbmR0aHMgb2YgYSBwaXhlbC4qLwotICAgIC8qIEluIHRoZSBjb2RlLCBiZWxvdywgZGl2aWRpbmcgYnkgcHBlbSBhbmQgICAgICAgICAgICAgICAgICovCi0gICAgLyogYWRqdXN0aW5nIGZvciBlbVJhdGlvIGNvbnZlcnRzIGRhcmtlbkFtb3VudCB0byBjaGFyYWN0ZXIgKi8KLSAgICAvKiBzcGFjZSAoZm9udCB1bml0cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIENGMl9GaXhlZCAgc3RlbVdpZHRoUGVyMTAwMCwgc2NhbGVkU3RlbTsKLSAgICBGVF9JbnQgICAgIGxvZ0Jhc2UyOwotCi0KLSAgICAqZGFya2VuQW1vdW50ID0gMDsKLQotICAgIGlmICggYm9sZGVuQW1vdW50ID09IDAgJiYgIXN0ZW1EYXJrZW5lZCApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBwcm90ZWN0IGFnYWluc3QgcmFuZ2UgcHJvYmxlbXMgYW5kIGRpdmlkZSBieSB6ZXJvICovCi0gICAgaWYgKCBlbVJhdGlvIDwgY2YyX2RvdWJsZVRvRml4ZWQoIC4wMSApICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggc3RlbURhcmtlbmVkICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIHgxID0gZGFya2VuUGFyYW1zWzBdOwotICAgICAgRlRfSW50ICB5MSA9IGRhcmtlblBhcmFtc1sxXTsKLSAgICAgIEZUX0ludCAgeDIgPSBkYXJrZW5QYXJhbXNbMl07Ci0gICAgICBGVF9JbnQgIHkyID0gZGFya2VuUGFyYW1zWzNdOwotICAgICAgRlRfSW50ICB4MyA9IGRhcmtlblBhcmFtc1s0XTsKLSAgICAgIEZUX0ludCAgeTMgPSBkYXJrZW5QYXJhbXNbNV07Ci0gICAgICBGVF9JbnQgIHg0ID0gZGFya2VuUGFyYW1zWzZdOwotICAgICAgRlRfSW50ICB5NCA9IGRhcmtlblBhcmFtc1s3XTsKLQotCi0gICAgICAvKiBjb252ZXJ0IGZyb20gdHJ1ZSBjaGFyYWN0ZXIgc3BhY2UgdG8gMTAwMCB1bml0IGNoYXJhY3RlciBzcGFjZTsgKi8KLSAgICAgIC8qIGFkZCBzeW50aGV0aWMgZW1ib2xkZW5pbmcgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBgc3RlbVdpZHRoUGVyMTAwMCcgd2lsbCBub3Qgb3ZlcmZsb3cgZm9yIGEgbGVnaXRpbWF0ZSBmb250ICAgICAgKi8KLQotICAgICAgc3RlbVdpZHRoUGVyMTAwMCA9IEZUX011bEZpeCggc3RlbVdpZHRoICsgYm9sZGVuQW1vdW50LCBlbVJhdGlvICk7Ci0KLSAgICAgIC8qIGBzY2FsZWRTdGVtJyBjYW4gZWFzaWx5IG92ZXJmbG93LCBzbyB3ZSBtdXN0IGNsYW1wIGl0cyBtYXhpbXVtICAqLwotICAgICAgLyogdmFsdWU7IHRoZSB0ZXN0IGRvZXNuJ3QgbmVlZCB0byBiZSBwcmVjaXNlLCBidXQgbXVzdCBiZSAgICAgICAgICovCi0gICAgICAvKiBjb25zZXJ2YXRpdmUuICBUaGUgY2xhbXAgdmFsdWUgKGRlZmF1bHQgMjMzMykgd2hlcmUgICAgICAgICAgICAgKi8KLSAgICAgIC8qIGBkYXJrZW5BbW91bnQnIGlzIHplcm8gaXMgd2VsbCBiZWxvdyB0aGUgb3ZlcmZsb3cgdmFsdWUgb2YgICAgICAqLwotICAgICAgLyogMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIEZUX01TQiBjb21wdXRlcyB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBiYXNlIDIgbG9nYXJpdGhtLiAgVGhlICAqLwotICAgICAgLyogbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBwcm9kdWN0IGlzIDEgb3IgMiBtb3JlIHRoYW4gdGhlIHN1bSBvZiAgICovCi0gICAgICAvKiBsb2dhcml0aG1zOyByZW1lbWJlcmluZyB0aGF0IHRoZSAxNiBsb3dlc3QgYml0cyBvZiB0aGUgZnJhY3Rpb24gKi8KLSAgICAgIC8qIGFyZSBkcm9wcGVkIHRoaXMgaXMgY29ycmVjdCB0byB3aXRoaW4gYSBmYWN0b3Igb2YgYWxtb3N0IDQuICAgICAqLwotICAgICAgLyogRm9yIGV4YW1wbGUsIDB4ODAuMDAwMCAqIDB4ODAuMDAwMCA9IDB4NDAwMC4wMDAwIGlzIDIzKzIzIGFuZCAgICovCi0gICAgICAvKiBpcyBmbGFnZ2VkIGFzIHBvc3NpYmxlIG92ZXJmbG93IGJlY2F1c2UgMHhGRi5GRkZGICogMHhGRi5GRkZGID0gKi8KLSAgICAgIC8qIDB4RkZGRi5GRTAwIGlzIGFsc28gMjMrMjMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBsb2dCYXNlMiA9IEZUX01TQiggKEZUX1VJbnQzMilzdGVtV2lkdGhQZXIxMDAwICkgKwotICAgICAgICAgICAgICAgICAgIEZUX01TQiggKEZUX1VJbnQzMilwcGVtICk7Ci0KLSAgICAgIGlmICggbG9nQmFzZTIgPj0gNDYgKQotICAgICAgICAvKiBwb3NzaWJsZSBvdmVyZmxvdyAqLwotICAgICAgICBzY2FsZWRTdGVtID0gY2YyX2ludFRvRml4ZWQoIHg0ICk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNjYWxlZFN0ZW0gPSBGVF9NdWxGaXgoIHN0ZW1XaWR0aFBlcjEwMDAsIHBwZW0gKTsKLQotICAgICAgLyogbm93IGFwcGx5IHRoZSBkYXJrZW5pbmcgcGFyYW1ldGVycyAqLwotCi0gICAgICBpZiAoIHNjYWxlZFN0ZW0gPCBjZjJfaW50VG9GaXhlZCggeDEgKSApCi0gICAgICAgICpkYXJrZW5BbW91bnQgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCB5MSApLCBwcGVtICk7Ci0KLSAgICAgIGVsc2UgaWYgKCBzY2FsZWRTdGVtIDwgY2YyX2ludFRvRml4ZWQoIHgyICkgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIHhkZWx0YSA9IHgyIC0geDE7Ci0gICAgICAgIEZUX0ludCAgeWRlbHRhID0geTIgLSB5MTsKLSAgICAgICAgRlRfSW50ICB4ICAgICAgPSBzdGVtV2lkdGhQZXIxMDAwIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHgxICksIHBwZW0gKTsKLQotCi0gICAgICAgIGlmICggIXhkZWx0YSApCi0gICAgICAgICAgZ290byBUcnlfeDM7Ci0KLSAgICAgICAgKmRhcmtlbkFtb3VudCA9IEZUX011bERpdiggeCwgeWRlbHRhLCB4ZGVsdGEgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHkxICksIHBwZW0gKTsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoIHNjYWxlZFN0ZW0gPCBjZjJfaW50VG9GaXhlZCggeDMgKSApCi0gICAgICB7Ci0gICAgICBUcnlfeDM6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIHhkZWx0YSA9IHgzIC0geDI7Ci0gICAgICAgICAgRlRfSW50ICB5ZGVsdGEgPSB5MyAtIHkyOwotICAgICAgICAgIEZUX0ludCAgeCAgICAgID0gc3RlbVdpZHRoUGVyMTAwMCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHgyICksIHBwZW0gKTsKLQotCi0gICAgICAgICAgaWYgKCAheGRlbHRhICkKLSAgICAgICAgICAgIGdvdG8gVHJ5X3g0OwotCi0gICAgICAgICAgKmRhcmtlbkFtb3VudCA9IEZUX011bERpdiggeCwgeWRlbHRhLCB4ZGVsdGEgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGl2Rml4KCBjZjJfaW50VG9GaXhlZCggeTIgKSwgcHBlbSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCBzY2FsZWRTdGVtIDwgY2YyX2ludFRvRml4ZWQoIHg0ICkgKQotICAgICAgewotICAgICAgVHJ5X3g0OgotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICB4ZGVsdGEgPSB4NCAtIHgzOwotICAgICAgICAgIEZUX0ludCAgeWRlbHRhID0geTQgLSB5MzsKLSAgICAgICAgICBGVF9JbnQgIHggICAgICA9IHN0ZW1XaWR0aFBlcjEwMDAgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCB4MyApLCBwcGVtICk7Ci0KLQotICAgICAgICAgIGlmICggIXhkZWx0YSApCi0gICAgICAgICAgICBnb3RvIFVzZV95NDsKLQotICAgICAgICAgICpkYXJrZW5BbW91bnQgPSBGVF9NdWxEaXYoIHgsIHlkZWx0YSwgeGRlbHRhICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHkzICksIHBwZW0gKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICBVc2VfeTQ6Ci0gICAgICAgICpkYXJrZW5BbW91bnQgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCB5NCApLCBwcGVtICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHVzZSBoYWxmIHRoZSBhbW91bnQgb24gZWFjaCBzaWRlIGFuZCBjb252ZXJ0IGJhY2sgdG8gdHJ1ZSAqLwotICAgICAgLyogY2hhcmFjdGVyIHNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAqZGFya2VuQW1vdW50ID0gRlRfRGl2Rml4KCAqZGFya2VuQW1vdW50LCAyICogZW1SYXRpbyApOwotICAgIH0KLQotICAgIC8qIGFkZCBzeW50aGV0aWMgZW1ib2xkZW5pbmcgZWZmZWN0IGluIGNoYXJhY3RlciBzcGFjZSAqLwotICAgICpkYXJrZW5BbW91bnQgKz0gYm9sZGVuQW1vdW50IC8gMjsKLSAgfQotCi0KLSAgLyogc2V0IHVwIHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgRm9udERpY3QgYW5kIG1hdHJpeDsgKi8KLSAgLyogY2FsbGVkIGZvciBlYWNoIGdseXBoIHRvIGJlIHJlbmRlcmVkICAgICAgICAgICAgICAgKi8KLQotICAvKiBjYWxsZXIncyB0cmFuc2Zvcm0gaXMgYWRqdXN0ZWQgZm9yIHN1YnBpeGVsIHBvc2l0aW9uaW5nICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9mb250X3NldHVwKCBDRjJfRm9udCAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGMl9NYXRyaXgqICB0cmFuc2Zvcm0gKQotICB7Ci0gICAgLyogcG9pbnRlciB0byBwYXJzZWQgZm9udCBvYmplY3QgKi8KLSAgICBDRkZfRGVjb2RlciogIGRlY29kZXIgPSBmb250LT5kZWNvZGVyOwotCi0gICAgRlRfQm9vbCAgbmVlZEV4dHJhU2V0dXAgPSBGQUxTRTsKLQotICAgIENGRl9WU3RvcmVSZWMqICB2c3RvcmU7Ci0gICAgRlRfQm9vbCAgICAgICAgIGhhc1ZhcmlhdGlvbnMgPSBGQUxTRTsKLQotICAgIC8qIGNoYXJhY3RlciBzcGFjZSB1bml0cyAqLwotICAgIENGMl9GaXhlZCAgYm9sZGVuWCA9IGZvbnQtPnN5bnRoZXRpY0VtYm9sZGVuaW5nQW1vdW50WDsKLSAgICBDRjJfRml4ZWQgIGJvbGRlblkgPSBmb250LT5zeW50aGV0aWNFbWJvbGRlbmluZ0Ftb3VudFk7Ci0KLSAgICBDRkZfU3ViRm9udCAgc3ViRm9udDsKLSAgICBDRjJfRml4ZWQgICAgcHBlbTsKLQotICAgIENGMl9VSW50ICAgbGVuTm9ybWFsaXplZFYgPSAwOwotICAgIEZUX0ZpeGVkKiAgbm9ybWFsaXplZFYgICAgPSBOVUxMOwotCi0KLSAgICAvKiBjbGVhciBwcmV2aW91cyBlcnJvciAqLwotICAgIGZvbnQtPmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgLyogaWYgYSBDSUQgZm9udERpY3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVjb21wdXRlIHNvbWUgY2FjaGVkICovCi0gICAgLyogZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc3ViRm9udCA9IGNmMl9nZXRTdWJmb250KCBkZWNvZGVyICk7Ci0gICAgaWYgKCBmb250LT5sYXN0U3ViZm9udCAhPSBzdWJGb250ICkKLSAgICB7Ci0gICAgICBmb250LT5sYXN0U3ViZm9udCA9IHN1YkZvbnQ7Ci0gICAgICBuZWVkRXh0cmFTZXR1cCAgICA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgZm9yIHZhcmlhdGlvbiB2ZWN0b3JzICovCi0gICAgdnN0b3JlICAgICAgICA9IGNmMl9nZXRWU3RvcmUoIGRlY29kZXIgKTsKLSAgICBoYXNWYXJpYXRpb25zID0gKCB2c3RvcmUtPmRhdGFDb3VudCAhPSAwICk7Ci0KLSAgICBpZiAoIGhhc1ZhcmlhdGlvbnMgKQotICAgIHsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIFByaXZhdGUgRElDVCBpbiB0aGlzIHN1YmZvbnQgbmVlZHMgdG8gYmUgcmVwYXJzZWQgKi8KLSAgICAgIGZvbnQtPmVycm9yID0gY2YyX2dldE5vcm1hbGl6ZWRWZWN0b3IoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuTm9ybWFsaXplZFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9ybWFsaXplZFYgKTsKLSAgICAgIGlmICggZm9udC0+ZXJyb3IgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIGlmICggY2ZmX2JsZW5kX2NoZWNrX3ZlY3RvciggJnN1YkZvbnQtPmJsZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGb250LT5wcml2YXRlX2RpY3QudnNpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuTm9ybWFsaXplZFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWICkgKQotICAgICAgewotICAgICAgICAvKiBibGVuZCBoYXMgY2hhbmdlZCwgcmVwYXJzZSAqLwotICAgICAgICBjZmZfbG9hZF9wcml2YXRlX2RpY3QoIGRlY29kZXItPmNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbk5vcm1hbGl6ZWRWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWICk7Ci0gICAgICAgIG5lZWRFeHRyYVNldHVwID0gVFJVRTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICAvKiBjb3B5IGZyb20gc3ViZm9udCAqLwotICAgICAgZm9udC0+YmxlbmQuZm9udCA9IHN1YkZvbnQtPmJsZW5kLmZvbnQ7Ci0KLSAgICAgIC8qIGNsZWFyIHN0YXRlIG9mIGNoYXJzdHJpbmcgYmxlbmQgKi8KLSAgICAgIGZvbnQtPmJsZW5kLnVzZWRCViA9IEZBTFNFOwotCi0gICAgICAvKiBpbml0aWFsaXplIHZhbHVlIGZvciBjaGFyc3RyaW5nICovCi0gICAgICBmb250LT52c2luZGV4ID0gc3ViRm9udC0+cHJpdmF0ZV9kaWN0LnZzaW5kZXg7Ci0KLSAgICAgIC8qIHN0b3JlIHZlY3RvciBpbnB1dHMgZm9yIGJsZW5kcyBpbiBjaGFyc3RyaW5nICovCi0gICAgICBmb250LT5sZW5ORFYgPSBsZW5Ob3JtYWxpemVkVjsKLSAgICAgIGZvbnQtPk5EViAgICA9IG5vcm1hbGl6ZWRWOwotICAgIH0KLQotICAgIC8qIGlmIHBwZW0gaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVjb21wdXRlIHNvbWUgY2FjaGVkIGRhdGEgICAgICAgICAqLwotICAgIC8qIG5vdGU6IGJlY2F1c2Ugb2YgQ0lEIGZvbnQgbWF0cml4IGNvbmNhdGVuYXRpb24sIHBwZW0gYW5kIHRyYW5zZm9ybSAqLwotICAgIC8qICAgICAgIGRvIG5vdCBuZWNlc3NhcmlseSB0cmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHBwZW0gPSBjZjJfZ2V0UHBlbVkoIGRlY29kZXIgKTsKLSAgICBpZiAoIGZvbnQtPnBwZW0gIT0gcHBlbSApCi0gICAgewotICAgICAgZm9udC0+cHBlbSAgICAgPSBwcGVtOwotICAgICAgbmVlZEV4dHJhU2V0dXAgPSBUUlVFOwotICAgIH0KLQotICAgIC8qIGNvcHkgaGludGVkIGZsYWcgb24gZWFjaCBjYWxsICovCi0gICAgZm9udC0+aGludGVkID0gKEZUX0Jvb2wpKCBmb250LT5yZW5kZXJpbmdGbGFncyAmIENGMl9GbGFnc0hpbnRlZCApOwotCi0gICAgLyogZGV0ZXJtaW5lIGlmIHRyYW5zZm9ybSBoYXMgY2hhbmdlZDsgICAgICAgKi8KLSAgICAvKiBpbmNsdWRlIEZvbnRtYXRyaXggYnV0IGlnbm9yZSB0cmFuc2xhdGlvbiAqLwotICAgIGlmICggZnRfbWVtY21wKCB0cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICZmb250LT5jdXJyZW50VHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICA0ICogc2l6ZW9mICggQ0YyX0ZpeGVkICkgKSAhPSAwICkKLSAgICB7Ci0gICAgICAvKiBzYXZlIGBrZXknIGluZm9ybWF0aW9uIGZvciBgY2FjaGUgb2Ygb25lJyBtYXRyaXggZGF0YTsgKi8KLSAgICAgIC8qIHNhdmUgY2xpZW50IHRyYW5zZm9ybSwgd2l0aG91dCB0aGUgdHJhbnNsYXRpb24gICAgICAgICAqLwotICAgICAgZm9udC0+Y3VycmVudFRyYW5zZm9ybSAgICA9ICp0cmFuc2Zvcm07Ci0gICAgICBmb250LT5jdXJyZW50VHJhbnNmb3JtLnR4ID0KLSAgICAgIGZvbnQtPmN1cnJlbnRUcmFuc2Zvcm0udHkgPSBjZjJfaW50VG9GaXhlZCggMCApOwotCi0gICAgICAvKiBUT0RPOiBGcmVlVHlwZSB0cmFuc2Zvcm0gaXMgc2ltcGxlIHNjYWxhcjsgZm9yIG5vdywgdXNlIGlkZW50aXR5ICovCi0gICAgICAvKiAgICAgICBmb3Igb3V0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBmb250LT5pbm5lclRyYW5zZm9ybSAgID0gKnRyYW5zZm9ybTsKLSAgICAgIGZvbnQtPm91dGVyVHJhbnNmb3JtLmEgPQotICAgICAgZm9udC0+b3V0ZXJUcmFuc2Zvcm0uZCA9IGNmMl9pbnRUb0ZpeGVkKCAxICk7Ci0gICAgICBmb250LT5vdXRlclRyYW5zZm9ybS5iID0KLSAgICAgIGZvbnQtPm91dGVyVHJhbnNmb3JtLmMgPSBjZjJfaW50VG9GaXhlZCggMCApOwotCi0gICAgICBuZWVkRXh0cmFTZXR1cCA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBmb250LT5kYXJrZW5lZCBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBhIHN0ZW0gZGFya2VuaW5nIHJlcXVlc3Qgb3IKLSAgICAgKiB0aGUgZm9udCBpcyBzeW50aGV0aWMgZW1ib2xkZW5lZC4KLSAgICAgKiBmb250LT5kYXJrZW5lZCBjb250cm9scyB3aGV0aGVyIHRvIGFkanVzdCBibHVlIHpvbmVzLCB3aW5kaW5nIG9yZGVyLAotICAgICAqIGFuZCBoaW50aW5nLgotICAgICAqCi0gICAgICovCi0gICAgaWYgKCBmb250LT5zdGVtRGFya2VuZWQgIT0gKCBmb250LT5yZW5kZXJpbmdGbGFncyAmIENGMl9GbGFnc0RhcmtlbmVkICkgKQotICAgIHsKLSAgICAgIGZvbnQtPnN0ZW1EYXJrZW5lZCA9Ci0gICAgICAgIChGVF9Cb29sKSggZm9udC0+cmVuZGVyaW5nRmxhZ3MgJiBDRjJfRmxhZ3NEYXJrZW5lZCApOwotCi0gICAgICAvKiBibHVlIHpvbmVzIGRlcGVuZCBvbiBkYXJrZW5lZCBmbGFnICovCi0gICAgICBuZWVkRXh0cmFTZXR1cCA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyogcmVjb21wdXRlIHZhcmlhYmxlcyB0aGF0IGFyZSBkZXBlbmRlbnQgb24gdHJhbnNmb3JtIG9yIEZvbnREaWN0IG9yICovCi0gICAgLyogZGFya2VuIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBuZWVkRXh0cmFTZXR1cCApCi0gICAgewotICAgICAgLyogU3RkVlcgaXMgZm91bmQgaW4gdGhlIHByaXZhdGUgZGljdGlvbmFyeTsgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiByZWNvbXB1dGUgZGFya2VuaW5nIGFtb3VudHMgd2hlbmV2ZXIgcHJpdmF0ZSBkaWN0aW9uYXJ5IG9yICAgICAgKi8KLSAgICAgIC8qIHRyYW5zZm9ybSBjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogTm90ZTogYSByZW5kZXJpbmcgZmxhZyB0dXJucyBkYXJrZW5pbmcgb24gb3Igb2ZmLCBzbyB3ZSB3YW50IHRvICovCi0gICAgICAvKiAgICAgICBzdG9yZSB0aGUgYG9uJyBhbW91bnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgIGRhcmtlbmluZyBhbW91bnQgaXMgY29tcHV0ZWQgaW4gY2hhcmFjdGVyIHNwYWNlICAgICAgICAgICAqLwotICAgICAgLyogVE9ETzogdGVzdGluZyBzaXplLWRlcGVuZGVudCBkYXJrZW5pbmcgaGVyZTsgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICB3aGF0IHRvIGRvIGZvciByb3RhdGlvbnM/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgQ0YyX0ZpeGVkICBlbVJhdGlvOwotICAgICAgQ0YyX0ZpeGVkICBzdGRIVzsKLSAgICAgIENGMl9JbnQgICAgdW5pdHNQZXJFbSA9IGZvbnQtPnVuaXRzUGVyRW07Ci0KLQotICAgICAgaWYgKCB1bml0c1BlckVtID09IDAgKQotICAgICAgICB1bml0c1BlckVtID0gMTAwMDsKLQotICAgICAgcHBlbSA9IEZUX01BWCggY2YyX2ludFRvRml4ZWQoIDQgKSwKLSAgICAgICAgICAgICAgICAgICAgIGZvbnQtPnBwZW0gKTsgLyogdXNlIG1pbmltdW0gcHBlbSBvZiA0ICovCi0KLSNpZiAwCi0gICAgICAvKiBzaW5jZSB2c3RlbSBpcyBtZWFzdXJlZCBpbiB0aGUgeC1kaXJlY3Rpb24sIHdlIHVzZSB0aGUgYGEnIG1lbWJlciAqLwotICAgICAgLyogb2YgdGhlIGZvbnRNYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGVtUmF0aW8gPSBjZjJfZml4ZWRGcmFjTXVsKCBjZjJfaW50VG9GaXhlZCggMTAwMCApLCBmb250TWF0cml4LT5hICk7Ci0jZW5kaWYKLQotICAgICAgLyogRnJlZXR5cGUgZG9lcyBub3QgcHJlc2VydmUgdGhlIGZvbnRNYXRyaXggd2hlbiBwYXJzaW5nOyB1c2UgKi8KLSAgICAgIC8qIHVuaXRzUGVyRW0gaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBUT0RPOiBjaGVjayBwcmVjaXNpb24gb2YgdGhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZW1SYXRpbyAgICAgPSBjZjJfaW50VG9GaXhlZCggMTAwMCApIC8gdW5pdHNQZXJFbTsKLSAgICAgIGZvbnQtPnN0ZFZXID0gY2YyX2dldFN0ZFZXKCBkZWNvZGVyICk7Ci0KLSAgICAgIGlmICggZm9udC0+c3RkVlcgPD0gMCApCi0gICAgICAgIGZvbnQtPnN0ZFZXID0gRlRfRGl2Rml4KCBjZjJfaW50VG9GaXhlZCggNzUgKSwgZW1SYXRpbyApOwotCi0gICAgICBpZiAoIGJvbGRlblggPiAwICkKLSAgICAgIHsKLSAgICAgICAgLyogRW5zdXJlIHRoYXQgYm9sZGVuWCBpcyBhdCBsZWFzdCAxIHBpeGVsIGZvciBzeW50aGV0aWMgYm9sZCBmb250ICovCi0gICAgICAgIC8qIChzaW1pbGFyIHRvIHdoYXQgQXZhbG9uIGRvZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBib2xkZW5YID0gRlRfTUFYKCBib2xkZW5YLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCB1bml0c1BlckVtICksIHBwZW0gKSApOwotCi0gICAgICAgIC8qIFN5bnRoZXRpYyBlbWJvbGRlbmluZyBhZGRzIGF0IGxlYXN0IDEgcGl4ZWwgdG8gZGFya2VuWCwgd2hpbGUgKi8KLSAgICAgICAgLyogc3RlbSBkYXJrZW5pbmcgYWRkcyBhdCBtb3N0IGhhbGYgcGl4ZWwuICBTaW5jZSB0aGUgcHVycG9zZSBvZiAqLwotICAgICAgICAvKiBzdGVtIGRhcmtlbmluZyAocmVhZGFiaWxpdHkgYXQgc21hbGwgc2l6ZXMpIGlzIG1ldCB3aXRoICAgICAgICovCi0gICAgICAgIC8qIHN5bnRoZXRpYyBlbWJvbGRlbmluZywgbm8gbmVlZCB0byBhZGQgc3RlbSBkYXJrZW5pbmcgZm9yIGEgICAgKi8KLSAgICAgICAgLyogc3ludGhldGljIGJvbGQgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBjZjJfY29tcHV0ZURhcmtlbmluZyggZW1SYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5zdGRWVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5kYXJrZW5YLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZGVuWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+ZGFya2VuUGFyYW1zICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGNmMl9jb21wdXRlRGFya2VuaW5nKCBlbVJhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPnN0ZFZXLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmRhcmtlblgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+c3RlbURhcmtlbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+ZGFya2VuUGFyYW1zICk7Ci0KLSNpZiAwCi0gICAgICAvKiBzaW5jZSBoc3RlbSBpcyBtZWFzdXJlZCBpbiB0aGUgeS1kaXJlY3Rpb24sIHdlIHVzZSB0aGUgYGQnIG1lbWJlciAqLwotICAgICAgLyogb2YgdGhlIGZvbnRNYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFRPRE86IHVzZSB0aGUgc2FtZSB1bml0cyBwZXIgZW0gYXMgYWJvdmU7IGNoZWNrIHRoaXMgICAgICAgICAgICAgICovCi0gICAgICBlbVJhdGlvID0gY2YyX2ZpeGVkRnJhY011bCggY2YyX2ludFRvRml4ZWQoIDEwMDAgKSwgZm9udE1hdHJpeC0+ZCApOwotI2VuZGlmCi0KLSAgICAgIC8qIHNldCB0aGUgZGVmYXVsdCBzdGVtIHdpZHRoLCBiZWNhdXNlIGl0IG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCAqLwotICAgICAgLyogZmFtaWx5IG1lbWJlcnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBjaG9vc2UgYSBjb25zdGFudCBmb3IgU3RkSFcgdGhhdCBkZXBlbmRzIG9uIGZvbnQgY29udHJhc3QgICAgICAgKi8KLSAgICAgIHN0ZEhXID0gY2YyX2dldFN0ZEhXKCBkZWNvZGVyICk7Ci0KLSAgICAgIGlmICggc3RkSFcgPiAwICYmIGZvbnQtPnN0ZFZXID4gTVVMX0lOVDMyKCAyLCBzdGRIVyApICkKLSAgICAgICAgZm9udC0+c3RkSFcgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCA3NSApLCBlbVJhdGlvICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGxvdyBjb250cmFzdCBmb250IGdldHMgbGVzcyBoc3RlbSBkYXJrZW5pbmcgKi8KLSAgICAgICAgZm9udC0+c3RkSFcgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCAxMTAgKSwgZW1SYXRpbyApOwotICAgICAgfQotCi0gICAgICBjZjJfY29tcHV0ZURhcmtlbmluZyggZW1SYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPnN0ZEhXLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5kYXJrZW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGRlblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+c3RlbURhcmtlbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmRhcmtlblBhcmFtcyApOwotCi0gICAgICBpZiAoIGZvbnQtPmRhcmtlblggIT0gMCB8fCBmb250LT5kYXJrZW5ZICE9IDAgKQotICAgICAgICBmb250LT5kYXJrZW5lZCA9IFRSVUU7Ci0gICAgICBlbHNlCi0gICAgICAgIGZvbnQtPmRhcmtlbmVkID0gRkFMU0U7Ci0KLSAgICAgIGZvbnQtPnJldmVyc2VXaW5kaW5nID0gRkFMU0U7IC8qIGluaXRpYWwgZXhwZWN0YXRpb24gaXMgQ0NXICovCi0KLSAgICAgIC8qIGNvbXB1dGUgYmx1ZSB6b25lcyBmb3IgdGhpcyBpbnN0YW5jZSAqLwotICAgICAgY2YyX2JsdWVzX2luaXQoICZmb250LT5ibHVlcywgZm9udCApOwotCi0gICAgfSAvKiBuZWVkRXh0cmFTZXR1cCAqLwotICB9Ci0KLQotICAvKiBlcXVpdmFsZW50IHRvIEFkb2JlR2V0T3V0bGluZSAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2YyX2dldEdseXBoT3V0bGluZSggQ0YyX0ZvbnQgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgICAgICBjaGFyc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRjJfTWF0cml4KiAgdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYqICAgICAgZ2x5cGhXaWR0aCApCi0gIHsKLSAgICBGVF9FcnJvciAgbGFzdEVycm9yID0gRlRfRXJyX09rOwotCi0gICAgRlRfVmVjdG9yICB0cmFuc2xhdGlvbjsKLQotI2lmIDAKLSAgICBGVF9WZWN0b3IgIGFkdmFuY2VQb2ludDsKLSNlbmRpZgotCi0gICAgQ0YyX0ZpeGVkICBhZHZXaWR0aCA9IDA7Ci0gICAgRlRfQm9vbCAgICBuZWVkV2luZGluZzsKLQotCi0gICAgLyogTm90ZTogdXNlIGJvdGggaW50ZWdlciBhbmQgZnJhY3Rpb24gZm9yIG91dGxpbmVzLiAgVGhpcyBhbGxvd3MgYmJveCAqLwotICAgIC8qICAgICAgIHRvIGNvbWUgb3V0IGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHRyYW5zbGF0aW9uLnggPSB0cmFuc2Zvcm0tPnR4OwotICAgIHRyYW5zbGF0aW9uLnkgPSB0cmFuc2Zvcm0tPnR5OwotCi0gICAgLyogc2V0IHVwIHZhbHVlcyBiYXNlZCBvbiB0cmFuc2Zvcm0gKi8KLSAgICBjZjJfZm9udF9zZXR1cCggZm9udCwgdHJhbnNmb3JtICk7Ci0gICAgaWYgKCBmb250LT5lcnJvciApCi0gICAgICBnb3RvIGV4aXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNldHVwIGVuY291bnRlcmVkIGFuIGVycm9yICovCi0KLSAgICAvKiByZXNldCBkYXJrZW4gZGlyZWN0aW9uICovCi0gICAgZm9udC0+cmV2ZXJzZVdpbmRpbmcgPSBGQUxTRTsKLQotICAgIC8qIHdpbmRpbmcgb3JkZXIgb25seSBhZmZlY3RzIGRhcmtlbmluZyAqLwotICAgIG5lZWRXaW5kaW5nID0gZm9udC0+ZGFya2VuZWQ7Ci0KLSAgICB3aGlsZSAoIDEgKQotICAgIHsKLSAgICAgIC8qIHJlc2V0IG91dHB1dCBidWZmZXIgKi8KLSAgICAgIGNmMl9vdXRsaW5lX3Jlc2V0KCAmZm9udC0+b3V0bGluZSApOwotCi0gICAgICAvKiBidWlsZCB0aGUgb3V0bGluZSwgcGFzc2luZyB0aGUgZnVsbCB0cmFuc2xhdGlvbiAqLwotICAgICAgY2YyX2ludGVycFQyQ2hhclN0cmluZyggZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0YyX091dGxpbmVDYWxsYmFja3MpJmZvbnQtPm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNsYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkdldpZHRoICk7Ci0KLSAgICAgIGlmICggZm9udC0+ZXJyb3IgKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgIGlmICggIW5lZWRXaW5kaW5nICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNoZWNrIHdpbmRpbmcgb3JkZXIgKi8KLSAgICAgIGlmICggZm9udC0+b3V0bGluZS5yb290LndpbmRpbmdNb21lbnR1bSA+PSAwICkgLyogQ0ZGIGlzIENDVyAqLwotICAgICAgICBicmVhazsKLQotICAgICAgLyogaW52ZXJ0IGRhcmtlbmluZyBhbmQgcmVuZGVyIGFnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBUT0RPOiB0aGlzIHNob3VsZCBiZSBhIHBhcmFtZXRlciB0byBnZXRPdXRsaW5lLWNvbXB1dGVPZmZzZXQgKi8KLSAgICAgIGZvbnQtPnJldmVyc2VXaW5kaW5nID0gVFJVRTsKLQotICAgICAgbmVlZFdpbmRpbmcgPSBGQUxTRTsgICAgLyogZXhpdCBhZnRlciBuZXh0IGl0ZXJhdGlvbiAqLwotICAgIH0KLQotICAgIC8qIGZpbmlzaCBzdG9yaW5nIGNsaWVudCBvdXRsaW5lICovCi0gICAgY2YyX291dGxpbmVfY2xvc2UoICZmb250LT5vdXRsaW5lICk7Ci0KLSAgZXhpdDoKLSAgICAvKiBGcmVlVHlwZSBqdXN0IHdhbnRzIHRoZSBhZHZhbmNlIHdpZHRoOyB0aGVyZSBpcyBubyB0cmFuc2xhdGlvbiAqLwotICAgICpnbHlwaFdpZHRoID0gYWR2V2lkdGg7Ci0KLSAgICAvKiBmcmVlIHJlc291cmNlcyBhbmQgY29sbGVjdCBlcnJvcnMgZnJvbSBvYmplY3RzIHdlJ3ZlIHVzZWQgKi8KLSAgICBjZjJfc2V0RXJyb3IoICZmb250LT5lcnJvciwgbGFzdEVycm9yICk7Ci0KLSAgICByZXR1cm4gZm9udC0+ZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2YyZm9udC5oIGIvc3JjL2NmZi9jZjJmb250LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZWNkMTcuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJmb250LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyZm9udC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgZm9udCBpbnN0YW5jZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQ0YyRk9OVF9IXwotI2RlZmluZSBDRjJGT05UX0hfCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSAiY2YyYmx1ZXMuaCIKLSNpbmNsdWRlICJjZmZsb2FkLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBDRjJfT1BFUkFORF9TVEFDS19TSVpFICA0OAotI2RlZmluZSBDRjJfTUFYX1NVQlIgICAgICAgICAgICAxNiAvKiBtYXhpbXVtIHN1YnJvdXRpbmUgbmVzdGluZzsgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmx5IDEwIGFyZSBhbGxvd2VkIGJ1dCB0aGVyZSBleGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb250cyBsaWtlIGBIaXJhS2FrdVByb04tVzMudHRmJyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoSGlyYWdpbm8gS2FrdSBHb3RoaWMgUHJvTiBXMzsgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4LjJkNmUxOyAyMDE0LTEyLTE5KSB0aGF0IGV4Y2VlZCAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDRjJfU1RPUkFHRV9TSVpFICAgICAgICAzMgotCi0KLSAgLyogdHlwZWRlZiBpcyBpbiBgY2YyZ2x1ZS5oJyAqLwotICBzdHJ1Y3QgIENGMl9Gb250UmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsgICAgIC8qIHNoYXJlZCBlcnJvciBmb3IgdGhpcyBpbnN0YW5jZSAqLwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgICBpc0NGRjI7Ci0gICAgQ0YyX1JlbmRlcmluZ0ZsYWdzICByZW5kZXJpbmdGbGFnczsKLQotICAgIC8qIHZhcmlhYmxlcyB0aGF0IGRlcGVuZCBvbiBUcmFuc2Zvcm06ICAqLwotICAgIC8qIHRoZSBmb2xsb3dpbmcgaGF2ZSB6ZXJvIHRyYW5zbGF0aW9uOyAqLwotICAgIC8qIGlubmVyICogb3V0ZXIgPSBmb250ICogb3JpZ2luYWwgICAgICAqLwotCi0gICAgQ0YyX01hdHJpeCAgY3VycmVudFRyYW5zZm9ybTsgIC8qIG9yaWdpbmFsIGNsaWVudCBtYXRyaXggICAgICAgICAgICovCi0gICAgQ0YyX01hdHJpeCAgaW5uZXJUcmFuc2Zvcm07ICAgIC8qIGZvciBoaW50aW5nOyBlcmVjdCwgc2NhbGVkICAgICAgICovCi0gICAgQ0YyX01hdHJpeCAgb3V0ZXJUcmFuc2Zvcm07ICAgIC8qIHBvc3QgaGludGluZzsgaW5jbHVkZXMgcm90YXRpb25zICovCi0gICAgQ0YyX0ZpeGVkICAgcHBlbTsgICAgICAgICAgICAgIC8qIHRyYW5zZm9ybS1kZXBlbmRlbnQgICAgICAgICAgICAgICovCi0KLSAgICAvKiB2YXJpYXRpb24gZGF0YSAqLwotICAgIENGRl9CbGVuZFJlYyAgYmxlbmQ7ICAgICAgICAgICAgLyogY2FjaGVkIGNoYXJzdHJpbmcgYmxlbmQgdmVjdG9yICAqLwotICAgIENGMl9VSW50ICAgICAgdnNpbmRleDsgICAgICAgICAgLyogY3VycmVudCB2c2luZGV4ICAgICAgICAgICAgICAgICAqLwotICAgIENGMl9VSW50ICAgICAgbGVuTkRWOyAgICAgICAgICAgLyogY3VycmVudCBsZW5ndGggTkRWIG9yIHplcm8gICAgICAqLwotICAgIEZUX0ZpeGVkKiAgICAgTkRWOyAgICAgICAgICAgICAgLyogcHRyIHRvIGN1cnJlbnQgTkRWIG9yIE5VTEwgICAgICAqLwotCi0gICAgQ0YyX0ludCAgdW5pdHNQZXJFbTsKLQotICAgIENGMl9GaXhlZCAgc3ludGhldGljRW1ib2xkZW5pbmdBbW91bnRYOyAgIC8qIGNoYXJhY3RlciBzcGFjZSB1bml0cyAqLwotICAgIENGMl9GaXhlZCAgc3ludGhldGljRW1ib2xkZW5pbmdBbW91bnRZOyAgIC8qIGNoYXJhY3RlciBzcGFjZSB1bml0cyAqLwotCi0gICAgLyogRnJlZVR5cGUgcmVsYXRlZCBtZW1iZXJzICovCi0gICAgQ0YyX091dGxpbmVSZWMgIG91dGxpbmU7ICAgICAgIC8qIGZyZWV0eXBlIGdseXBoIG91dGxpbmUgZnVuY3Rpb25zICovCi0gICAgQ0ZGX0RlY29kZXIqICAgIGRlY29kZXI7Ci0gICAgQ0ZGX1N1YkZvbnQgICAgIGxhc3RTdWJmb250OyAgICAgICAgICAgICAgLyogRnJlZVR5cGUgcGFyc2VkIGRhdGE7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9wIGZvbnQgb3Igc3ViZm9udCAgICovCi0KLSAgICAvKiB0aGVzZSBmbGFncyBjYW4gdmFyeSBmcm9tIG9uZSBjYWxsIHRvIHRoZSBuZXh0ICovCi0gICAgRlRfQm9vbCAgaGludGVkOwotICAgIEZUX0Jvb2wgIGRhcmtlbmVkOyAgICAgICAvKiB0cnVlIGlmIHN0ZW1EYXJrZW5lZCBvciBzeW50aGV0aWMgYm9sZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpLmUuIGRhcmtlblggIT0gMCB8fCBkYXJrZW5ZICE9IDAgICAgICAqLwotICAgIEZUX0Jvb2wgIHN0ZW1EYXJrZW5lZDsKLQotICAgIEZUX0ludCAgZGFya2VuUGFyYW1zWzhdOyAgICAgICAgICAgICAgLyogMTAwMCB1bml0IGNoYXJhY3RlciBzcGFjZSAqLwotCi0gICAgLyogdmFyaWFibGVzIHRoYXQgZGVwZW5kIG9uIGJvdGggRm9udERpY3QgYW5kIFRyYW5zZm9ybSAqLwotICAgIENGMl9GaXhlZCAgc3RkVlc7ICAgICAvKiBpbiBjaGFyYWN0ZXIgc3BhY2U7IGRlcGVuZHMgb24gZGljdCBlbnRyeSAqLwotICAgIENGMl9GaXhlZCAgc3RkSFc7ICAgICAvKiBpbiBjaGFyYWN0ZXIgc3BhY2U7IGRlcGVuZHMgb24gZGljdCBlbnRyeSAqLwotICAgIENGMl9GaXhlZCAgZGFya2VuWDsgICAgICAgICAgICAgICAgICAgIC8qIGNoYXJhY3RlciBzcGFjZSB1bml0cyAgICAqLwotICAgIENGMl9GaXhlZCAgZGFya2VuWTsgICAgICAgICAgICAgICAgICAgIC8qIGRlcGVuZHMgb24gdHJhbnNmb3JtICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBwcml2YXRlIGRpY3QgKFN0ZFZXKSAqLwotICAgIEZUX0Jvb2wgIHJldmVyc2VXaW5kaW5nOyAgICAgICAgICAgICAgIC8qIGRhcmtlbiBhc3N1bWluZyAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50ZXJjbG9ja3dpc2Ugd2luZGluZyAqLwotCi0gICAgQ0YyX0JsdWVzUmVjICBibHVlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZWQgem9uZSBkYXRhICovCi0gIH07Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZjJfZ2V0R2x5cGhPdXRsaW5lKCBDRjJfRm9udCAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICAgICAgIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGMl9NYXRyaXgqICB0cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgIENGMl9GMTZEb3QxNiogICAgICBnbHlwaFdpZHRoICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBDRjJGT05UX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmMmZ0LmMgYi9zcmMvY2ZmL2NmMmZ0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzAwZDEuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJmdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMmZ0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBHbHVlIENvbXBvbmVudCB0byBBZG9iZSdzIEludGVycHJldGVyIChib2R5KS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE0IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImNmMmZvbnQuaCIKLSNpbmNsdWRlICJjZjJlcnJvci5oIgotCi0KLSNkZWZpbmUgQ0YyX01BWF9TSVpFICBjZjJfaW50VG9GaXhlZCggMjAwMCApICAgIC8qIG1heCBwcGVtICovCi0KLQotICAvKgotICAgKiBUaGlzIGNoZWNrIHNob3VsZCBhdm9pZCBtb3N0IGludGVybmFsIG92ZXJmbG93IGNhc2VzLiAgQ2xpZW50cyBzaG91bGQKLSAgICogZ2VuZXJhbGx5IHJlc3BvbmQgdG8gYEdseXBoX1Rvb19CaWcnIGJ5IGdldHRpbmcgYSBnbHlwaCBvdXRsaW5lCi0gICAqIGF0IEVNIHNpemUsIHNjYWxpbmcgaXQgYW5kIGZpbGxpbmcgaXQgYXMgYSBncmFwaGljcyBvcGVyYXRpb24uCi0gICAqCi0gICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2YyX2NoZWNrVHJhbnNmb3JtKCBjb25zdCBDRjJfTWF0cml4KiAgdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgIENGMl9JbnQgICAgICAgICAgICB1bml0c1BlckVtICkKLSAgewotICAgIENGMl9GaXhlZCAgbWF4U2NhbGU7Ci0KLQotICAgIEZUX0FTU0VSVCggdW5pdHNQZXJFbSA+IDAgKTsKLQotICAgIGlmICggdHJhbnNmb3JtLT5hIDw9IDAgfHwgdHJhbnNmb3JtLT5kIDw9IDAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1NpemVfSGFuZGxlICk7Ci0KLSAgICBGVF9BU1NFUlQoIHRyYW5zZm9ybS0+YiA9PSAwICYmIHRyYW5zZm9ybS0+YyA9PSAwICk7Ci0gICAgRlRfQVNTRVJUKCB0cmFuc2Zvcm0tPnR4ID09IDAgJiYgdHJhbnNmb3JtLT50eSA9PSAwICk7Ci0KLSAgICBpZiAoIHVuaXRzUGVyRW0gPiAweDdGRkYgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBHbHlwaF9Ub29fQmlnICk7Ci0KLSAgICBtYXhTY2FsZSA9IEZUX0RpdkZpeCggQ0YyX01BWF9TSVpFLCBjZjJfaW50VG9GaXhlZCggdW5pdHNQZXJFbSApICk7Ci0KLSAgICBpZiAoIHRyYW5zZm9ybS0+YSA+IG1heFNjYWxlIHx8IHRyYW5zZm9ybS0+ZCA+IG1heFNjYWxlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggR2x5cGhfVG9vX0JpZyApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2YyX3NldEdseXBoV2lkdGgoIENGMl9PdXRsaW5lICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgIHdpZHRoICkKLSAgewotICAgIENGRl9EZWNvZGVyKiAgZGVjb2RlciA9IG91dGxpbmUtPmRlY29kZXI7Ci0KLQotICAgIEZUX0FTU0VSVCggZGVjb2RlciApOwotCi0gICAgZGVjb2Rlci0+Z2x5cGhfd2lkdGggPSBjZjJfZml4ZWRUb0ludCggd2lkdGggKTsKLSAgfQotCi0KLSAgLyogQ2xlYW4gdXAgZm9udCBpbnN0YW5jZS4gKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2ZyZWVfaW5zdGFuY2UoIHZvaWQqICBwdHIgKQotICB7Ci0gICAgQ0YyX0ZvbnQgIGZvbnQgPSAoQ0YyX0ZvbnQpcHRyOwotCi0KLSAgICBpZiAoIGZvbnQgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZm9udC0+bWVtb3J5OwotCi0KLSAgICAgIEZUX0ZSRUUoIGZvbnQtPmJsZW5kLmxhc3RORFYgKTsKLSAgICAgIEZUX0ZSRUUoIGZvbnQtPmJsZW5kLkJWICk7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjbGllbnQgb3V0bGluZTsgICAqLwotICAvKiBGcmVlVHlwZSB1c2VzIGNvb3JkaW5hdGVzIGluIDI2LjYgZm9ybWF0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9idWlsZGVyX21vdmVUbyggQ0YyX091dGxpbmVDYWxsYmFja3MgICAgICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0YyX0NhbGxiYWNrUGFyYW1zICBwYXJhbXMgKQotICB7Ci0gICAgLyogZG93bmNhc3QgdGhlIG9iamVjdCBwb2ludGVyICovCi0gICAgQ0YyX091dGxpbmUgICBvdXRsaW5lID0gKENGMl9PdXRsaW5lKWNhbGxiYWNrczsKLSAgICBDRkZfQnVpbGRlciogIGJ1aWxkZXI7Ci0KLSAgICAodm9pZClwYXJhbXM7ICAgICAgICAvKiBvbmx5IHVzZWQgaW4gZGVidWcgbW9kZSAqLwotCi0KLSAgICBGVF9BU1NFUlQoIG91dGxpbmUgJiYgb3V0bGluZS0+ZGVjb2RlciApOwotICAgIEZUX0FTU0VSVCggcGFyYW1zLT5vcCA9PSBDRjJfUGF0aE9wTW92ZVRvICk7Ci0KLSAgICBidWlsZGVyID0gJm91dGxpbmUtPmRlY29kZXItPmJ1aWxkZXI7Ci0KLSAgICAvKiBub3RlOiB0d28gc3VjY2Vzc2l2ZSBtb3ZlcyBzaW1wbHkgY2xvc2UgdGhlIGNvbnRvdXIgdHdpY2UgKi8KLSAgICBjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBidWlsZGVyICk7Ci0gICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9idWlsZGVyX2xpbmVUbyggQ0YyX091dGxpbmVDYWxsYmFja3MgICAgICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0YyX0NhbGxiYWNrUGFyYW1zICBwYXJhbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0gICAgLyogZG93bmNhc3QgdGhlIG9iamVjdCBwb2ludGVyICovCi0gICAgQ0YyX091dGxpbmUgICBvdXRsaW5lID0gKENGMl9PdXRsaW5lKWNhbGxiYWNrczsKLSAgICBDRkZfQnVpbGRlciogIGJ1aWxkZXI7Ci0KLQotICAgIEZUX0FTU0VSVCggb3V0bGluZSAmJiBvdXRsaW5lLT5kZWNvZGVyICk7Ci0gICAgRlRfQVNTRVJUKCBwYXJhbXMtPm9wID09IENGMl9QYXRoT3BMaW5lVG8gKTsKLQotICAgIGJ1aWxkZXIgPSAmb3V0bGluZS0+ZGVjb2Rlci0+YnVpbGRlcjsKLQotICAgIGlmICggIWJ1aWxkZXItPnBhdGhfYmVndW4gKQotICAgIHsKLSAgICAgIC8qIHJlY29yZCB0aGUgbW92ZSBiZWZvcmUgdGhlIGxpbmU7IGFsc28gY2hlY2sgcG9pbnRzIGFuZCBzZXQgKi8KLSAgICAgIC8qIGBwYXRoX2JlZ3VuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnB0MC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDAueSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGlmICggISpjYWxsYmFja3MtPmVycm9yICkKLSAgICAgICAgICAqY2FsbGJhY2tzLT5lcnJvciA9ICBlcnJvcjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGBjZmZfYnVpbGRlcl9hZGRfcG9pbnQxJyBpbmNsdWRlcyBhIGNoZWNrX3BvaW50cyBjYWxsIGZvciBvbmUgcG9pbnQgKi8KLSAgICBlcnJvciA9IGNmZl9idWlsZGVyX2FkZF9wb2ludDEoIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnB0MS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDEueSApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggISpjYWxsYmFja3MtPmVycm9yICkKLSAgICAgICAgKmNhbGxiYWNrcy0+ZXJyb3IgPSAgZXJyb3I7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZjJfYnVpbGRlcl9jdWJlVG8oIENGMl9PdXRsaW5lQ2FsbGJhY2tzICAgICAgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGMl9DYWxsYmFja1BhcmFtcyAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIC8qIGRvd25jYXN0IHRoZSBvYmplY3QgcG9pbnRlciAqLwotICAgIENGMl9PdXRsaW5lICAgb3V0bGluZSA9IChDRjJfT3V0bGluZSljYWxsYmFja3M7Ci0gICAgQ0ZGX0J1aWxkZXIqICBidWlsZGVyOwotCi0KLSAgICBGVF9BU1NFUlQoIG91dGxpbmUgJiYgb3V0bGluZS0+ZGVjb2RlciApOwotICAgIEZUX0FTU0VSVCggcGFyYW1zLT5vcCA9PSBDRjJfUGF0aE9wQ3ViZVRvICk7Ci0KLSAgICBidWlsZGVyID0gJm91dGxpbmUtPmRlY29kZXItPmJ1aWxkZXI7Ci0KLSAgICBpZiAoICFidWlsZGVyLT5wYXRoX2JlZ3VuICkKLSAgICB7Ci0gICAgICAvKiByZWNvcmQgdGhlIG1vdmUgYmVmb3JlIHRoZSBsaW5lOyBhbHNvIGNoZWNrIHBvaW50cyBhbmQgc2V0ICovCi0gICAgICAvKiBgcGF0aF9iZWd1bicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBlcnJvciA9IGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDAueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+cHQwLnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBpZiAoICEqY2FsbGJhY2tzLT5lcnJvciApCi0gICAgICAgICAgKmNhbGxiYWNrcy0+ZXJyb3IgPSAgZXJyb3I7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwcmVwYXJlIHJvb20gZm9yIDMgcG9pbnRzOiAyIG9mZi1jdXJ2ZSwgMSBvbi1jdXJ2ZSAqLwotICAgIGVycm9yID0gY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgMyApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggISpjYWxsYmFja3MtPmVycm9yICkKLSAgICAgICAgKmNhbGxiYWNrcy0+ZXJyb3IgPSAgZXJyb3I7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDEueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+cHQxLnksIDAgKTsKLSAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnB0Mi54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDIueSwgMCApOwotICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+cHQzLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnB0My55LCAxICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9vdXRsaW5lX2luaXQoIENGMl9PdXRsaW5lICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogICAgZXJyb3IgKQotICB7Ci0gICAgRlRfWkVSTyggb3V0bGluZSApOwotCi0gICAgb3V0bGluZS0+cm9vdC5tZW1vcnkgPSBtZW1vcnk7Ci0gICAgb3V0bGluZS0+cm9vdC5lcnJvciAgPSBlcnJvcjsKLQotICAgIG91dGxpbmUtPnJvb3QubW92ZVRvID0gY2YyX2J1aWxkZXJfbW92ZVRvOwotICAgIG91dGxpbmUtPnJvb3QubGluZVRvID0gY2YyX2J1aWxkZXJfbGluZVRvOwotICAgIG91dGxpbmUtPnJvb3QuY3ViZVRvID0gY2YyX2J1aWxkZXJfY3ViZVRvOwotICB9Ci0KLQotICAvKiBnZXQgc2NhbGluZyBhbmQgaGludCBmbGFnIGZyb20gR2x5cGhTbG90ICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9nZXRTY2FsZUFuZEhpbnRGbGFnKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIHhfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIHlfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgICAgIGhpbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgICAgc2NhbGVkICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5idWlsZGVyLmdseXBoICk7Ci0KLSAgICAvKiBub3RlOiBGcmVlVHlwZSBzY2FsZSBpbmNsdWRlcyBhIGZhY3RvciBvZiA2NCAqLwotICAgICpoaW50ZWQgPSBkZWNvZGVyLT5idWlsZGVyLmdseXBoLT5oaW50OwotICAgICpzY2FsZWQgPSBkZWNvZGVyLT5idWlsZGVyLmdseXBoLT5zY2FsZWQ7Ci0KLSAgICBpZiAoICpoaW50ZWQgKQotICAgIHsKLSAgICAgICp4X3NjYWxlID0gQUREX0lOVDMyKCBkZWNvZGVyLT5idWlsZGVyLmdseXBoLT54X3NjYWxlLCAzMiApIC8gNjQ7Ci0gICAgICAqeV9zY2FsZSA9IEFERF9JTlQzMiggZGVjb2Rlci0+YnVpbGRlci5nbHlwaC0+eV9zY2FsZSwgMzIgKSAvIDY0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogZm9yIHVuaGludGVkIG91dGxpbmVzLCBgY2ZmX3Nsb3RfbG9hZCcgZG9lcyB0aGUgc2NhbGluZywgKi8KLSAgICAgIC8qIHRodXMgcmVuZGVyIGF0IGB1bml0eScgc2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICp4X3NjYWxlID0gMHgwNDAwOyAgIC8qIDEvNjQgYXMgMTYuMTYgKi8KLSAgICAgICp5X3NjYWxlID0gMHgwNDAwOwotICAgIH0KLSAgfQotCi0KLSAgLyogZ2V0IHVuaXRzIHBlciBlbSBmcm9tIGBGVF9GYWNlJyAqLwotICAvKiBUT0RPOiBzaG91bGQgaGFuZGxlIGZvbnQgbWF0cml4IGNvbmNhdGVuYXRpb24/ICovCi0gIHN0YXRpYyBGVF9VU2hvcnQKLSAgY2YyX2dldFVuaXRzUGVyRW0oIENGRl9EZWNvZGVyKiAgZGVjb2RlciApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+YnVpbGRlci5mYWNlICk7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyLT5idWlsZGVyLmZhY2UtPnJvb3QudW5pdHNfcGVyX0VNICk7Ci0KLSAgICByZXR1cm4gZGVjb2Rlci0+YnVpbGRlci5mYWNlLT5yb290LnVuaXRzX3Blcl9FTTsKLSAgfQotCi0KLSAgLyogTWFpbiBlbnRyeSBwb2ludDogUmVuZGVyIG9uZSBnbHlwaC4gKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmMl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgIGNoYXJzdHJpbmdfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgY2hhcnN0cmluZ19sZW4gKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBDRjJfRm9udCAgIGZvbnQ7Ci0KLQotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jZmYgKTsKLQotICAgIG1lbW9yeSA9IGRlY29kZXItPmJ1aWxkZXIubWVtb3J5OwotCi0gICAgLyogQ0YyIGRhdGEgaXMgc2F2ZWQgaGVyZSBhY3Jvc3MgZ2x5cGhzICovCi0gICAgZm9udCA9IChDRjJfRm9udClkZWNvZGVyLT5jZmYtPmNmMl9pbnN0YW5jZS5kYXRhOwotCi0gICAgLyogb24gZmlyc3QgZ2x5cGgsIGFsbG9jYXRlIGluc3RhbmNlIHN0cnVjdHVyZSAqLwotICAgIGlmICggIWRlY29kZXItPmNmZi0+Y2YyX2luc3RhbmNlLmRhdGEgKQotICAgIHsKLSAgICAgIGRlY29kZXItPmNmZi0+Y2YyX2luc3RhbmNlLmZpbmFsaXplciA9Ci0gICAgICAgIChGVF9HZW5lcmljX0ZpbmFsaXplciljZjJfZnJlZV9pbnN0YW5jZTsKLQotICAgICAgaWYgKCBGVF9BTExPQyggZGVjb2Rlci0+Y2ZmLT5jZjJfaW5zdGFuY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIENGMl9Gb250UmVjICkgKSApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotCi0gICAgICBmb250ID0gKENGMl9Gb250KWRlY29kZXItPmNmZi0+Y2YyX2luc3RhbmNlLmRhdGE7Ci0KLSAgICAgIGZvbnQtPm1lbW9yeSA9IG1lbW9yeTsKLQotICAgICAgLyogaW5pdGlhbGl6ZSBhIGNsaWVudCBvdXRsaW5lLCB0byBiZSBzaGFyZWQgYnkgZWFjaCBnbHlwaCByZW5kZXJlZCAqLwotICAgICAgY2YyX291dGxpbmVfaW5pdCggJmZvbnQtPm91dGxpbmUsIGZvbnQtPm1lbW9yeSwgJmZvbnQtPmVycm9yICk7Ci0gICAgfQotCi0gICAgLyogc2F2ZSBkZWNvZGVyOyBpdCBpcyBhIHN0YWNrIHZhcmlhYmxlIGFuZCB3aWxsIGJlIGRpZmZlcmVudCBvbiBlYWNoICovCi0gICAgLyogY2FsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9udC0+ZGVjb2RlciAgICAgICAgID0gZGVjb2RlcjsKLSAgICBmb250LT5vdXRsaW5lLmRlY29kZXIgPSBkZWNvZGVyOwotCi0gICAgewotICAgICAgLyogYnVpbGQgcGFyYW1ldGVycyBmb3IgQWRvYmUgZW5naW5lICovCi0KLSAgICAgIENGRl9CdWlsZGVyKiAgYnVpbGRlciA9ICZkZWNvZGVyLT5idWlsZGVyOwotICAgICAgQ0ZGX0RyaXZlciAgICBkcml2ZXIgID0gKENGRl9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGJ1aWxkZXItPmZhY2UgKTsKLQotICAgICAgRlRfQm9vbCAgbm9fc3RlbV9kYXJrZW5pbmdfZHJpdmVyID0KLSAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub19zdGVtX2RhcmtlbmluZzsKLSAgICAgIEZUX0NoYXIgIG5vX3N0ZW1fZGFya2VuaW5nX2ZvbnQgPQotICAgICAgICAgICAgICAgICBidWlsZGVyLT5mYWNlLT5yb290LmludGVybmFsLT5ub19zdGVtX2RhcmtlbmluZzsKLQotICAgICAgLyogbG9jYWwgZXJyb3IgKi8KLSAgICAgIEZUX0Vycm9yICAgICAgIGVycm9yMiA9IEZUX0Vycl9PazsKLSAgICAgIENGMl9CdWZmZXJSZWMgIGJ1ZjsKLSAgICAgIENGMl9NYXRyaXggICAgIHRyYW5zZm9ybTsKLSAgICAgIENGMl9GMTZEb3QxNiAgIGdseXBoV2lkdGg7Ci0KLSAgICAgIEZUX0Jvb2wgIGhpbnRlZDsKLSAgICAgIEZUX0Jvb2wgIHNjYWxlZDsKLQotCi0gICAgICAvKiBGcmVlVHlwZSBoYXMgYWxyZWFkeSBsb29rZWQgdXAgdGhlIEdJRDsgY29udmVydCB0byAgICAgICAgICovCi0gICAgICAvKiBgUmVnaW9uQnVmZmVyJywgYXNzdW1pbmcgdGhhdCB0aGUgaW5wdXQgaGFzIGJlZW4gdmFsaWRhdGVkICovCi0gICAgICBGVF9BU1NFUlQoIGNoYXJzdHJpbmdfYmFzZSArIGNoYXJzdHJpbmdfbGVuID49IGNoYXJzdHJpbmdfYmFzZSApOwotCi0gICAgICBGVF9aRVJPKCAmYnVmICk7Ci0gICAgICBidWYuc3RhcnQgPQotICAgICAgYnVmLnB0ciAgID0gY2hhcnN0cmluZ19iYXNlOwotICAgICAgYnVmLmVuZCAgID0gY2hhcnN0cmluZ19iYXNlICsgY2hhcnN0cmluZ19sZW47Ci0KLSAgICAgIEZUX1pFUk8oICZ0cmFuc2Zvcm0gKTsKLQotICAgICAgY2YyX2dldFNjYWxlQW5kSGludEZsYWcoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybS5hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGludGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZWQgKTsKLQotICAgICAgLyogY29weSBpc0NGRjIgYm9vbGVhbiBmcm9tIFRUX0ZhY2UgdG8gQ0YyX0ZvbnQgKi8KLSAgICAgIGZvbnQtPmlzQ0ZGMiA9IGJ1aWxkZXItPmZhY2UtPmlzX2NmZjI7Ci0KLSAgICAgIGZvbnQtPnJlbmRlcmluZ0ZsYWdzID0gMDsKLSAgICAgIGlmICggaGludGVkICkKLSAgICAgICAgZm9udC0+cmVuZGVyaW5nRmxhZ3MgfD0gQ0YyX0ZsYWdzSGludGVkOwotICAgICAgaWYgKCBzY2FsZWQgJiYgKCAhbm9fc3RlbV9kYXJrZW5pbmdfZm9udCAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgKCBub19zdGVtX2RhcmtlbmluZ19mb250IDwgMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICFub19zdGVtX2RhcmtlbmluZ19kcml2ZXIgICkgKSApCi0gICAgICAgIGZvbnQtPnJlbmRlcmluZ0ZsYWdzIHw9IENGMl9GbGFnc0RhcmtlbmVkOwotCi0gICAgICBmb250LT5kYXJrZW5QYXJhbXNbMF0gPSBkcml2ZXItPmRhcmtlbl9wYXJhbXNbMF07Ci0gICAgICBmb250LT5kYXJrZW5QYXJhbXNbMV0gPSBkcml2ZXItPmRhcmtlbl9wYXJhbXNbMV07Ci0gICAgICBmb250LT5kYXJrZW5QYXJhbXNbMl0gPSBkcml2ZXItPmRhcmtlbl9wYXJhbXNbMl07Ci0gICAgICBmb250LT5kYXJrZW5QYXJhbXNbM10gPSBkcml2ZXItPmRhcmtlbl9wYXJhbXNbM107Ci0gICAgICBmb250LT5kYXJrZW5QYXJhbXNbNF0gPSBkcml2ZXItPmRhcmtlbl9wYXJhbXNbNF07Ci0gICAgICBmb250LT5kYXJrZW5QYXJhbXNbNV0gPSBkcml2ZXItPmRhcmtlbl9wYXJhbXNbNV07Ci0gICAgICBmb250LT5kYXJrZW5QYXJhbXNbNl0gPSBkcml2ZXItPmRhcmtlbl9wYXJhbXNbNl07Ci0gICAgICBmb250LT5kYXJrZW5QYXJhbXNbN10gPSBkcml2ZXItPmRhcmtlbl9wYXJhbXNbN107Ci0KLSAgICAgIC8qIG5vdyBnZXQgYW4gb3V0bGluZSBmb3IgdGhpcyBnbHlwaDsgICAgICAqLwotICAgICAgLyogYWxzbyBnZXQgdW5pdHMgcGVyIGVtIHRvIHZhbGlkYXRlIHNjYWxlICovCi0gICAgICBmb250LT51bml0c1BlckVtID0gKENGMl9JbnQpY2YyX2dldFVuaXRzUGVyRW0oIGRlY29kZXIgKTsKLQotICAgICAgaWYgKCBzY2FsZWQgKQotICAgICAgewotICAgICAgICBlcnJvcjIgPSBjZjJfY2hlY2tUcmFuc2Zvcm0oICZ0cmFuc2Zvcm0sIGZvbnQtPnVuaXRzUGVyRW0gKTsKLSAgICAgICAgaWYgKCBlcnJvcjIgKQotICAgICAgICAgIHJldHVybiBlcnJvcjI7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yMiA9IGNmMl9nZXRHbHlwaE91dGxpbmUoIGZvbnQsICZidWYsICZ0cmFuc2Zvcm0sICZnbHlwaFdpZHRoICk7Ci0gICAgICBpZiAoIGVycm9yMiApCi0gICAgICAgIHJldHVybiBGVF9FUlIoIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgICAgY2YyX3NldEdseXBoV2lkdGgoICZmb250LT5vdXRsaW5lLCBnbHlwaFdpZHRoICk7Ci0KLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgfQotICB9Ci0KLQotICAvKiBnZXQgcG9pbnRlciB0byBjdXJyZW50IEZyZWVUeXBlIHN1YmZvbnQgKGJhc2VkIG9uIGN1cnJlbnQgZ2x5cGhJRCkgKi8KLSAgRlRfTE9DQUxfREVGKCBDRkZfU3ViRm9udCApCi0gIGNmMl9nZXRTdWJmb250KCBDRkZfRGVjb2RlciogIGRlY29kZXIgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICYmIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udCApOwotCi0gICAgcmV0dXJuIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udDsKLSAgfQotCi0KLSAgLyogZ2V0IHBvaW50ZXIgdG8gVlN0b3JlIHN0cnVjdHVyZSAqLwotICBGVF9MT0NBTF9ERUYoIENGRl9WU3RvcmUgKQotICBjZjJfZ2V0VlN0b3JlKCBDRkZfRGVjb2RlciogIGRlY29kZXIgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICYmIGRlY29kZXItPmNmZiApOwotCi0gICAgcmV0dXJuICZkZWNvZGVyLT5jZmYtPnZzdG9yZTsKLSAgfQotCi0KLSAgLyogZ2V0IG1heHN0YWNrIHZhbHVlIGZyb20gQ0ZGMiBUb3AgRElDVCAqLwotICBGVF9MT0NBTF9ERUYoIEZUX1VJbnQgKQotICBjZjJfZ2V0TWF4c3RhY2soIENGRl9EZWNvZGVyKiAgZGVjb2RlciApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+Y2ZmICk7Ci0KLSAgICByZXR1cm4gZGVjb2Rlci0+Y2ZmLT50b3BfZm9udC5mb250X2RpY3QubWF4c3RhY2s7Ci0gIH0KLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAvKiBHZXQgbm9ybWFsaXplZCBkZXNpZ24gdmVjdG9yIGZvciBjdXJyZW50IHJlbmRlciByZXF1ZXN0OyAqLwotICAvKiByZXR1cm4gcG9pbnRlciBhbmQgbGVuZ3RoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlOiBVc2VzIEZUX0ZpeGVkIG5vdCBDRjJfRml4ZWQgZm9yIHRoZSB2ZWN0b3IuICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2YyX2dldE5vcm1hbGl6ZWRWZWN0b3IoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9VSW50ICAgICAqbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICAgICp2ZWMgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICYmIGRlY29kZXItPmJ1aWxkZXIuZmFjZSApOwotICAgIEZUX0FTU0VSVCggdmVjICYmIGxlbiApOwotCi0gICAgcmV0dXJuIGNmZl9nZXRfdmFyX2JsZW5kKCBkZWNvZGVyLT5idWlsZGVyLmZhY2UsIGxlbiwgTlVMTCwgdmVjLCBOVUxMICk7Ci0gIH0KLSNlbmRpZgotCi0KLSAgLyogZ2V0IGB5X3BwZW0nIGZyb20gYENGRl9TaXplJyAqLwotICBGVF9MT0NBTF9ERUYoIENGMl9GaXhlZCApCi0gIGNmMl9nZXRQcGVtWSggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIuZmFjZSAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBkZWNvZGVyLT5idWlsZGVyLmZhY2UtPnJvb3Quc2l6ZSApOwotCi0gICAgLyoKLSAgICAgKiBOb3RlIHRoYXQgYHlfcHBlbScgY2FuIGJlIHplcm8gaWYgdGhlcmUgd2Fzbid0IGEgY2FsbCB0bwotICAgICAqIGBGVF9TZXRfQ2hhcl9TaXplJyBvciBzb21ldGhpbmcgc2ltaWxhci4gIEhvd2V2ZXIsIHRoaXMgaXNuJ3QgYQotICAgICAqIHByb2JsZW0gc2luY2Ugd2UgY29tZSB0byB0aGlzIHBsYWNlIGluIHRoZSBjb2RlIG9ubHkgaWYKLSAgICAgKiBGVF9MT0FEX05PX1NDQUxFIGlzIHNldCAodGhlIG90aGVyIGNhc2UgZ2V0cyBjYXVnaHQgYnkKLSAgICAgKiBgY2YyX2NoZWNrVHJhbnNmb3JtJykuICBUaGUgcHBlbSB2YWx1ZSBpcyBuZWVkZWQgdG8gY29tcHV0ZSB0aGUgc3RlbQotICAgICAqIGRhcmtlbmluZywgd2hpY2ggaXMgZGlzYWJsZWQgZm9yIGdldHRpbmcgdGhlIHVuc2NhbGVkIG91dGxpbmUuCi0gICAgICoKLSAgICAgKi8KLSAgICByZXR1cm4gY2YyX2ludFRvRml4ZWQoCi0gICAgICAgICAgICAgZGVjb2Rlci0+YnVpbGRlci5mYWNlLT5yb290LnNpemUtPm1ldHJpY3MueV9wcGVtICk7Ci0gIH0KLQotCi0gIC8qIGdldCBzdGFuZGFyZCBzdGVtIHdpZHRocyBmb3IgdGhlIGN1cnJlbnQgc3ViZm9udDsgKi8KLSAgLyogRnJlZVR5cGUgc3RvcmVzIHRoZXNlIGFzIGludGVnZXIgZm9udCB1bml0cyAgICAgICAqLwotICAvKiAobm90ZTogdmFyaWFibGUgbmFtZXMgc2VlbSBzd2FwcGVkKSAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggQ0YyX0ZpeGVkICkKLSAgY2YyX2dldFN0ZFZXKCBDRkZfRGVjb2RlciogIGRlY29kZXIgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICYmIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udCApOwotCi0gICAgcmV0dXJuIGNmMl9pbnRUb0ZpeGVkKAotICAgICAgICAgICAgIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0LnN0YW5kYXJkX2hlaWdodCApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIENGMl9GaXhlZCApCi0gIGNmMl9nZXRTdGRIVyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgIHJldHVybiBjZjJfaW50VG9GaXhlZCgKLSAgICAgICAgICAgICBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5zdGFuZGFyZF93aWR0aCApOwotICB9Ci0KLQotICAvKiBub3RlOiBGcmVlVHlwZSBzdG9yZXMgMTAwMCB0aW1lcyB0aGUgYWN0dWFsIHZhbHVlIGZvciBgQmx1ZVNjYWxlJyAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfZ2V0Qmx1ZU1ldHJpY3MoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVGdXp6ICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgICpibHVlU2NhbGUgPSBGVF9EaXZGaXgoCi0gICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3QuYmx1ZV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICBjZjJfaW50VG9GaXhlZCggMTAwMCApICk7Ci0gICAgKmJsdWVTaGlmdCA9IGNmMl9pbnRUb0ZpeGVkKAotICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0LmJsdWVfc2hpZnQgKTsKLSAgICAqYmx1ZUZ1enogID0gY2YyX2ludFRvRml4ZWQoCi0gICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3QuYmx1ZV9mdXp6ICk7Ci0gIH0KLQotCi0gIC8qIGdldCBibHVlIHZhbHVlcyBjb3VudHMgYW5kIGFycmF5czsgdGhlIEZyZWVUeXBlIHBhcnNlciBoYXMgdmFsaWRhdGVkICovCi0gIC8qIHRoZSBjb3VudHMgYW5kIHZlcmlmaWVkIHRoYXQgZWFjaCBpcyBhbiBldmVuIG51bWJlciAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9nZXRCbHVlVmFsdWVzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgICpkYXRhICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgICpjb3VudCA9IGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0Lm51bV9ibHVlX3ZhbHVlczsKLSAgICAqZGF0YSAgPSAoRlRfUG9zKikKLSAgICAgICAgICAgICAgICZkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5ibHVlX3ZhbHVlczsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2dldE90aGVyQmx1ZXMoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgKmRhdGEgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICYmIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udCApOwotCi0gICAgKmNvdW50ID0gZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3QubnVtX290aGVyX2JsdWVzOwotICAgICpkYXRhICA9IChGVF9Qb3MqKQotICAgICAgICAgICAgICAgJmRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0Lm90aGVyX2JsdWVzOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfZ2V0RmFtaWx5Qmx1ZXMoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAqZGF0YSApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250ICk7Ci0KLSAgICAqY291bnQgPSBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5udW1fZmFtaWx5X2JsdWVzOwotICAgICpkYXRhICA9IChGVF9Qb3MqKQotICAgICAgICAgICAgICAgJmRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0LmZhbWlseV9ibHVlczsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2dldEZhbWlseU90aGVyQmx1ZXMoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgKmRhdGEgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICYmIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udCApOwotCi0gICAgKmNvdW50ID0gZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3QubnVtX2ZhbWlseV9vdGhlcl9ibHVlczsKLSAgICAqZGF0YSAgPSAoRlRfUG9zKikKLSAgICAgICAgICAgICAgICZkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5mYW1pbHlfb3RoZXJfYmx1ZXM7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggQ0YyX0ludCApCi0gIGNmMl9nZXRMYW5ndWFnZUdyb3VwKCBDRkZfRGVjb2RlciogIGRlY29kZXIgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICYmIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udCApOwotCi0gICAgcmV0dXJuIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0Lmxhbmd1YWdlX2dyb3VwOwotICB9Ci0KLQotICAvKiBjb252ZXJ0IHVuYmlhc2VkIHN1YnJvdXRpbmUgaW5kZXggdG8gYENGMl9CdWZmZXInIGFuZCAqLwotICAvKiByZXR1cm4gMCBvbiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIENGMl9JbnQgKQotICBjZjJfaW5pdEdsb2JhbFJlZ2lvbkJ1ZmZlciggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgICAgICBzdWJyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBidWYgKQotICB7Ci0gICAgQ0YyX1VJbnQgIGlkeDsKLQotCi0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICk7Ci0KLSAgICBGVF9aRVJPKCBidWYgKTsKLQotICAgIGlkeCA9IChDRjJfVUludCkoIHN1YnJOdW0gKyBkZWNvZGVyLT5nbG9iYWxzX2JpYXMgKTsKLSAgICBpZiAoIGlkeCA+PSBkZWNvZGVyLT5udW1fZ2xvYmFscyApCi0gICAgICByZXR1cm4gVFJVRTsgICAgIC8qIGVycm9yICovCi0KLSAgICBGVF9BU1NFUlQoIGRlY29kZXItPmdsb2JhbHMgKTsKLQotICAgIGJ1Zi0+c3RhcnQgPQotICAgIGJ1Zi0+cHRyICAgPSBkZWNvZGVyLT5nbG9iYWxzW2lkeF07Ci0gICAgYnVmLT5lbmQgICA9IGRlY29kZXItPmdsb2JhbHNbaWR4ICsgMV07Ci0KLSAgICByZXR1cm4gRkFMU0U7ICAgICAgLyogc3VjY2VzcyAqLwotICB9Ci0KLQotICAvKiBjb252ZXJ0IEFkb2JlU3RhbmRhcmRFbmNvZGluZyBjb2RlIHRvIENGMl9CdWZmZXI7ICovCi0gIC8qIHVzZWQgZm9yIHNlYWMgY29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmMl9nZXRTZWFjQ29tcG9uZW50KCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfSW50ICAgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfQnVmZmVyICAgIGJ1ZiApCi0gIHsKLSAgICBDRjJfSW50ICAgZ2lkOwotICAgIEZUX0J5dGUqICBjaGFyc3RyaW5nOwotICAgIEZUX1VMb25nICBsZW47Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgKTsKLQotICAgIEZUX1pFUk8oIGJ1ZiApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIC8qIEluY3JlbWVudGFsIGZvbnRzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgdmFsaWQgY2hhcnNldHMuICAgICAgICAqLwotICAgIC8qIFRoZXkgdXNlIHRoZSBjaGFyYWN0ZXIgY29kZSwgbm90IHRoZSBnbHlwaCBpbmRleCwgaW4gdGhpcyBjYXNlLiAqLwotICAgIGlmICggZGVjb2Rlci0+YnVpbGRlci5mYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgICAgZ2lkID0gY29kZTsKLSAgICBlbHNlCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotICAgIHsKLSAgICAgIGdpZCA9IGNmZl9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGRlY29kZXItPmNmZiwgY29kZSApOwotICAgICAgaWYgKCBnaWQgPCAwICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0dseXBoX0Zvcm1hdCApOwotICAgIH0KLQotICAgIGVycm9yID0gY2ZmX2dldF9nbHlwaF9kYXRhKCBkZWNvZGVyLT5idWlsZGVyLmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRjJfVUludClnaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuICk7Ci0gICAgLyogVE9ETzogZm9yIG5vdywganVzdCBwYXNzIHRoZSBGcmVlVHlwZSBlcnJvciB0aHJvdWdoICovCi0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBhc3N1bWUgaW5wdXQgaGFzIGJlZW4gdmFsaWRhdGVkICovCi0gICAgRlRfQVNTRVJUKCBjaGFyc3RyaW5nICsgbGVuID49IGNoYXJzdHJpbmcgKTsKLQotICAgIGJ1Zi0+c3RhcnQgPSBjaGFyc3RyaW5nOwotICAgIGJ1Zi0+ZW5kICAgPSBjaGFyc3RyaW5nICsgbGVuOwotICAgIGJ1Zi0+cHRyICAgPSBidWYtPnN0YXJ0OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2ZyZWVTZWFjQ29tcG9uZW50KCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBidWYgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICk7Ci0KLSAgICBjZmZfZnJlZV9nbHlwaF9kYXRhKCBkZWNvZGVyLT5idWlsZGVyLmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKikmYnVmLT5zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpKCBidWYtPmVuZCAtIGJ1Zi0+c3RhcnQgKSApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIENGMl9JbnQgKQotICBjZjJfaW5pdExvY2FsUmVnaW9uQnVmZmVyKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9JbnQgICAgICAgc3Vick51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBidWYgKQotICB7Ci0gICAgQ0YyX1VJbnQgIGlkeDsKLQotCi0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICk7Ci0KLSAgICBGVF9aRVJPKCBidWYgKTsKLQotICAgIGlkeCA9IChDRjJfVUludCkoIHN1YnJOdW0gKyBkZWNvZGVyLT5sb2NhbHNfYmlhcyApOwotICAgIGlmICggaWR4ID49IGRlY29kZXItPm51bV9sb2NhbHMgKQotICAgICAgcmV0dXJuIFRSVUU7ICAgICAvKiBlcnJvciAqLwotCi0gICAgRlRfQVNTRVJUKCBkZWNvZGVyLT5sb2NhbHMgKTsKLQotICAgIGJ1Zi0+c3RhcnQgPQotICAgIGJ1Zi0+cHRyICAgPSBkZWNvZGVyLT5sb2NhbHNbaWR4XTsKLSAgICBidWYtPmVuZCAgID0gZGVjb2Rlci0+bG9jYWxzW2lkeCArIDFdOwotCi0gICAgcmV0dXJuIEZBTFNFOyAgICAgIC8qIHN1Y2Nlc3MgKi8KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBDRjJfRml4ZWQgKQotICBjZjJfZ2V0RGVmYXVsdFdpZHRoWCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgIHJldHVybiBjZjJfaW50VG9GaXhlZCgKLSAgICAgICAgICAgICBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5kZWZhdWx0X3dpZHRoICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggQ0YyX0ZpeGVkICkKLSAgY2YyX2dldE5vbWluYWxXaWR0aFgoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250ICk7Ci0KLSAgICByZXR1cm4gY2YyX2ludFRvRml4ZWQoCi0gICAgICAgICAgICAgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3Qubm9taW5hbF93aWR0aCApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfb3V0bGluZV9yZXNldCggQ0YyX091dGxpbmUgIG91dGxpbmUgKQotICB7Ci0gICAgQ0ZGX0RlY29kZXIqICBkZWNvZGVyID0gb3V0bGluZS0+ZGVjb2RlcjsKLQotCi0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICk7Ci0KLSAgICBvdXRsaW5lLT5yb290LndpbmRpbmdNb21lbnR1bSA9IDA7Ci0KLSAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGRlY29kZXItPmJ1aWxkZXIubG9hZGVyICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9vdXRsaW5lX2Nsb3NlKCBDRjJfT3V0bGluZSAgb3V0bGluZSApCi0gIHsKLSAgICBDRkZfRGVjb2RlciogIGRlY29kZXIgPSBvdXRsaW5lLT5kZWNvZGVyOwotCi0KLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgKTsKLQotICAgIGNmZl9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoICZkZWNvZGVyLT5idWlsZGVyICk7Ci0KLSAgICBGVF9HbHlwaExvYWRlcl9BZGQoIGRlY29kZXItPmJ1aWxkZXIubG9hZGVyICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2YyZnQuaCBiL3NyYy9jZmYvY2YyZnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1NGE2ZS4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmMmZ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyZnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEdsdWUgQ29tcG9uZW50IHRvIEFkb2JlJ3MgSW50ZXJwcmV0ZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQ0YyRlRfSF8KLSNkZWZpbmUgQ0YyRlRfSF8KLQotCi0jaW5jbHVkZSAiY2YydHlwZXMuaCIKLQotCi0gIC8qIFRPRE86IGRpc2FibGUgYXNzZXJ0cyBmb3Igbm93ICovCi0jZGVmaW5lIENGMl9OREVCVUcKLQotCi0jaW5jbHVkZSBGVF9TWVNURU1fSAotCi0jaW5jbHVkZSAiY2YyZ2x1ZS5oIgotI2luY2x1ZGUgImNmZmdsb2FkLmgiICAgIC8qIGZvciBDRkZfRGVjb2RlciAqLwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2YyX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgY2hhcnN0cmluZ19iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBjaGFyc3RyaW5nX2xlbiApOwotCi0gIEZUX0xPQ0FMKCBDRkZfU3ViRm9udCApCi0gIGNmMl9nZXRTdWJmb250KCBDRkZfRGVjb2RlciogIGRlY29kZXIgKTsKLQotICBGVF9MT0NBTCggQ0ZGX1ZTdG9yZSApCi0gIGNmMl9nZXRWU3RvcmUoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApOwotCi0gIEZUX0xPQ0FMKCBGVF9VSW50ICkKLSAgY2YyX2dldE1heHN0YWNrKCBDRkZfRGVjb2RlciogIGRlY29kZXIgKTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2YyX2dldE5vcm1hbGl6ZWRWZWN0b3IoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9VSW50ICAgICAqbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICAgICp2ZWMgKTsKLSNlbmRpZgotCi0gIEZUX0xPQ0FMKCBDRjJfRml4ZWQgKQotICBjZjJfZ2V0UHBlbVkoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApOwotICBGVF9MT0NBTCggQ0YyX0ZpeGVkICkKLSAgY2YyX2dldFN0ZFZXKCBDRkZfRGVjb2RlciogIGRlY29kZXIgKTsKLSAgRlRfTE9DQUwoIENGMl9GaXhlZCApCi0gIGNmMl9nZXRTdGRIVyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfZ2V0Qmx1ZU1ldHJpY3MoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVGdXp6ICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2dldEJsdWVWYWx1ZXMoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgKmRhdGEgKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfZ2V0T3RoZXJCbHVlcyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAqZGF0YSApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9nZXRGYW1pbHlCbHVlcyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgICpkYXRhICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2dldEZhbWlseU90aGVyQmx1ZXMoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgKmRhdGEgKTsKLQotICBGVF9MT0NBTCggQ0YyX0ludCApCi0gIGNmMl9nZXRMYW5ndWFnZUdyb3VwKCBDRkZfRGVjb2RlciogIGRlY29kZXIgKTsKLQotICBGVF9MT0NBTCggQ0YyX0ludCApCi0gIGNmMl9pbml0R2xvYmFsUmVnaW9uQnVmZmVyKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfSW50ICAgICAgIHN1YnJOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfQnVmZmVyICAgIGJ1ZiApOwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZjJfZ2V0U2VhY0NvbXBvbmVudCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgICAgICBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBidWYgKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfZnJlZVNlYWNDb21wb25lbnQoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfQnVmZmVyICAgIGJ1ZiApOwotICBGVF9MT0NBTCggQ0YyX0ludCApCi0gIGNmMl9pbml0TG9jYWxSZWdpb25CdWZmZXIoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgICAgICBzdWJyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfQnVmZmVyICAgIGJ1ZiApOwotCi0gIEZUX0xPQ0FMKCBDRjJfRml4ZWQgKQotICBjZjJfZ2V0RGVmYXVsdFdpZHRoWCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICk7Ci0gIEZUX0xPQ0FMKCBDRjJfRml4ZWQgKQotICBjZjJfZ2V0Tm9taW5hbFdpZHRoWCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICk7Ci0KLQotICAvKgotICAgKiBGcmVlVHlwZSBjbGllbnQgb3V0bGluZQotICAgKgotICAgKiBwcm9jZXNzIG91dHB1dCBmcm9tIHRoZSBjaGFyc3RyaW5nIGludGVycHJldGVyCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX091dGxpbmVSZWNfCi0gIHsKLSAgICBDRjJfT3V0bGluZUNhbGxiYWNrc1JlYyAgcm9vdDsgICAgICAgIC8qIGJhc2UgY2xhc3MgbXVzdCBiZSBmaXJzdCAqLwotICAgIENGRl9EZWNvZGVyKiAgICAgICAgICAgICBkZWNvZGVyOwotCi0gIH0gQ0YyX091dGxpbmVSZWMsICpDRjJfT3V0bGluZTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX291dGxpbmVfcmVzZXQoIENGMl9PdXRsaW5lICBvdXRsaW5lICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX291dGxpbmVfY2xvc2UoIENGMl9PdXRsaW5lICBvdXRsaW5lICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBDRjJGVF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZjJnbHVlLmggYi9zcmMvY2ZmL2NmMmdsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhN2MyNC4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmMmdsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJnbHVlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBzaGFyZWQgc3R1ZmYgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDRjJHTFVFX0hfCi0jZGVmaW5lIENGMkdMVUVfSF8KLQotCi0vKiBjb21tb24gaW5jbHVkZXMgZm9yIG90aGVyIG1vZHVsZXMgKi8KLSNpbmNsdWRlICJjZjJlcnJvci5oIgotI2luY2x1ZGUgImNmMmZpeGVkLmgiCi0jaW5jbHVkZSAiY2YyYXJyc3QuaCIKLSNpbmNsdWRlICJjZjJyZWFkLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiByZW5kZXJpbmcgcGFyYW1ldGVycyAqLwotCi0gIC8qIGFwcGx5IGhpbnRzIHRvIHJlbmRlcmVkIGdseXBocyAqLwotI2RlZmluZSBDRjJfRmxhZ3NIaW50ZWQgICAgMQotICAvKiBmb3IgdGVzdGluZyAqLwotI2RlZmluZSBDRjJfRmxhZ3NEYXJrZW5lZCAgMgotCi0gIC8qIHR5cGUgZm9yIGhvbGRpbmcgdGhlIGZsYWdzICovCi0gIHR5cGVkZWYgQ0YyX0ludCAgQ0YyX1JlbmRlcmluZ0ZsYWdzOwotCi0KLSAgLyogZWxlbWVudHMgb2YgYSBnbHlwaCBvdXRsaW5lICovCi0gIHR5cGVkZWYgZW51bSAgQ0YyX1BhdGhPcF8KLSAgewotICAgIENGMl9QYXRoT3BNb3ZlVG8gPSAxLCAgICAgLyogY2hhbmdlIHRoZSBjdXJyZW50IHBvaW50ICovCi0gICAgQ0YyX1BhdGhPcExpbmVUbyA9IDIsICAgICAvKiBsaW5lICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBDRjJfUGF0aE9wUXVhZFRvID0gMywgICAgIC8qIHF1YWRyYXRpYyBjdXJ2ZSAgICAgICAgICAqLwotICAgIENGMl9QYXRoT3BDdWJlVG8gPSA0ICAgICAgLyogY3ViaWMgY3VydmUgICAgICAgICAgICAgICovCi0KLSAgfSBDRjJfUGF0aE9wOwotCi0KLSAgLyogYSBtYXRyaXggb2YgZml4ZWQgcG9pbnQgdmFsdWVzICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfTWF0cml4XwotICB7Ci0gICAgQ0YyX0YxNkRvdDE2ICBhOwotICAgIENGMl9GMTZEb3QxNiAgYjsKLSAgICBDRjJfRjE2RG90MTYgIGM7Ci0gICAgQ0YyX0YxNkRvdDE2ICBkOwotICAgIENGMl9GMTZEb3QxNiAgdHg7Ci0gICAgQ0YyX0YxNkRvdDE2ICB0eTsKLQotICB9IENGMl9NYXRyaXg7Ci0KLQotICAvKiB0aGVzZSB0eXBlZGVmcyBhcmUgbmVlZGVkIGJ5IG1vcmUgdGhhbiBvbmUgaGVhZGVyIGZpbGUgKi8KLSAgLyogYW5kIGdjYyBjb21waWxlciBkb2Vzbid0IGFsbG93IHJlZGVmaW5pdGlvbiAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IENGMl9Gb250UmVjXyAgQ0YyX0ZvbnRSZWMsICpDRjJfRm9udDsKLSAgdHlwZWRlZiBzdHJ1Y3QgQ0YyX0hpbnRSZWNfICBDRjJfSGludFJlYywgKkNGMl9IaW50OwotCi0KLSAgLyogQSBjb21tb24gc3RydWN0dXJlIGZvciBhbGwgY2FsbGJhY2sgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIG1lbWJlcnMgbWF5IGJlIHVudXNlZC4gIEZvciBleGFtcGxlLCBgcHQwJyBpcyBub3QgdXNlZCBmb3IgICAgICAgKi8KLSAgLyogYG1vdmVUbycgYW5kIGBwdDMnIGlzIG5vdCB1c2VkIGZvciBgcXVhZFRvJy4gIFRoZSBpbml0aWFsIHBvaW50IGBwdDAnICovCi0gIC8qIGlzIGluY2x1ZGVkIGZvciBlYWNoIHBhdGggZWxlbWVudCBmb3IgZ2VuZXJhbGl0eTsgY3VydmUgY29udmVyc2lvbnMgICAqLwotICAvKiBuZWVkIGl0LiAgVGhlIGBvcCcgcGFyYW1ldGVyIGFsbG93cyBvbmUgZnVuY3Rpb24gdG8gaGFuZGxlIG11bHRpcGxlICAgKi8KLSAgLyogZWxlbWVudCB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9DYWxsYmFja1BhcmFtc1JlY18KLSAgewotICAgIEZUX1ZlY3RvciAgcHQwOwotICAgIEZUX1ZlY3RvciAgcHQxOwotICAgIEZUX1ZlY3RvciAgcHQyOwotICAgIEZUX1ZlY3RvciAgcHQzOwotCi0gICAgQ0YyX0ludCAgb3A7Ci0KLSAgfSBDRjJfQ2FsbGJhY2tQYXJhbXNSZWMsICpDRjJfQ2FsbGJhY2tQYXJhbXM7Ci0KLQotICAvKiBmb3J3YXJkIHJlZmVyZW5jZSAqLwotICB0eXBlZGVmIHN0cnVjdCBDRjJfT3V0bGluZUNhbGxiYWNrc1JlY18gIENGMl9PdXRsaW5lQ2FsbGJhY2tzUmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpDRjJfT3V0bGluZUNhbGxiYWNrczsKLQotICAvKiBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVycyAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpDRjJfQ2FsbGJhY2tfVHlwZSkoIENGMl9PdXRsaW5lQ2FsbGJhY2tzICAgICAgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0YyX0NhbGxiYWNrUGFyYW1zICBwYXJhbXMgKTsKLQotCi0gIHN0cnVjdCAgQ0YyX091dGxpbmVDYWxsYmFja3NSZWNfCi0gIHsKLSAgICBDRjJfQ2FsbGJhY2tfVHlwZSAgbW92ZVRvOwotICAgIENGMl9DYWxsYmFja19UeXBlICBsaW5lVG87Ci0gICAgQ0YyX0NhbGxiYWNrX1R5cGUgIHF1YWRUbzsKLSAgICBDRjJfQ2FsbGJhY2tfVHlwZSAgY3ViZVRvOwotCi0gICAgQ0YyX0ludCAgd2luZGluZ01vbWVudHVtOyAgICAvKiBmb3Igd2luZGluZyBvcmRlciBkZXRlY3Rpb24gKi8KLQotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX0Vycm9yKiAgZXJyb3I7Ci0gIH07Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBDRjJHTFVFX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmMmhpbnRzLmMgYi9zcmMvY2ZmL2NmMmhpbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjJjYzkuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJoaW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJoaW50cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBoYW5kbGluZyBDRkYgaGludHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJjZjJnbHVlLmgiCi0jaW5jbHVkZSAiY2YyZm9udC5oIgotI2luY2x1ZGUgImNmMmhpbnRzLmgiCi0jaW5jbHVkZSAiY2YyaW50cnAuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmMmhpbnRzCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX0hpbnRNb3ZlUmVjXwotICB7Ci0gICAgc2l6ZV90ICAgICBqOyAgICAgICAgICAvKiBpbmRleCBvZiB1cHBlciBoaW50IG1hcCBlZGdlICAgKi8KLSAgICBDRjJfRml4ZWQgIG1vdmVVcDsgICAgIC8qIGFkanVzdG1lbnQgdG8gb3B0aW11bSBwb3NpdGlvbiAqLwotCi0gIH0gQ0YyX0hpbnRNb3ZlUmVjLCAqQ0YyX0hpbnRNb3ZlOwotCi0KLSAgLyogQ29tcHV0ZSBhbmd1bGFyIG1vbWVudHVtIGZvciB3aW5kaW5nIG9yZGVyIGRldGVjdGlvbi4gIEl0IGlzIGNhbGxlZCAqLwotICAvKiBmb3IgYWxsIGxpbmVzIGFuZCBjdXJ2ZXMsIGJ1dCBub3QgbmVjZXNzYXJpbHkgaW4gZWxlbWVudCBvcmRlci4gICAgICovCi0gIHN0YXRpYyBDRjJfSW50Ci0gIGNmMl9nZXRXaW5kaW5nTW9tZW50dW0oIENGMl9GaXhlZCAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgeTIgKQotICB7Ci0gICAgLyogY3Jvc3MgcHJvZHVjdCBvZiBwdDEgcG9zaXRpb24gZnJvbSBvcmlnaW4gd2l0aCBwdDIgcG9zaXRpb24gZnJvbSAgKi8KLSAgICAvKiBwdDE7IHdlIHJlZHVjZSB0aGUgcHJlY2lzaW9uIHNvIHRoYXQgdGhlIHJlc3VsdCBmaXRzIGludG8gMzIgYml0cyAqLwotCi0gICAgcmV0dXJuICggeDEgPj4gMTYgKSAqICggU1VCX0lOVDMyKCB5MiwgeTEgKSA+PiAxNiApIC0KLSAgICAgICAgICAgKCB5MSA+PiAxNiApICogKCBTVUJfSU5UMzIoIHgyLCB4MSApID4+IDE2ICk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIENvbnN0cnVjdCBmcm9tIGEgU3RlbUhpbnQ7IHRoaXMgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0bwotICAgKiBgY2YyX2JsdWVzX2NhcHR1cmUnLgotICAgKiBgaGludE9yaWdpbicgaXMgdGhlIGNoYXJhY3RlciBzcGFjZSBkaXNwbGFjZW1lbnQgb2YgYSBzZWFjIGFjY2VudC4KLSAgICogQWRqdXN0IHN0ZW0gaGludCBmb3IgZGFya2VuaW5nIGhlcmUuCi0gICAqCi0gICAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfaGludF9pbml0KCBDRjJfSGludCAgICAgICAgICAgIGhpbnQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGMl9BcnJTdGFjayAgc3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBpbmRleFN0ZW1IaW50LAotICAgICAgICAgICAgICAgICBjb25zdCBDRjJfRm9udCAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgICAgICAgaGludE9yaWdpbiwKLSAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgICAgICBzY2FsZSwKLSAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgICBib3R0b20gKQotICB7Ci0gICAgQ0YyX0ZpeGVkICAgICAgICAgICAgICAgd2lkdGg7Ci0gICAgY29uc3QgQ0YyX1N0ZW1IaW50UmVjKiAgc3RlbUhpbnQ7Ci0KLQotICAgIEZUX1pFUk8oIGhpbnQgKTsKLQotICAgIHN0ZW1IaW50ID0gKGNvbnN0IENGMl9TdGVtSGludFJlYyopY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U3RlbUhpbnQgKTsKLQotICAgIHdpZHRoID0gU1VCX0lOVDMyKCBzdGVtSGludC0+bWF4LCBzdGVtSGludC0+bWluICk7Ci0KLSAgICBpZiAoIHdpZHRoID09IGNmMl9pbnRUb0ZpeGVkKCAtMjEgKSApCi0gICAgewotICAgICAgLyogZ2hvc3QgYm90dG9tICovCi0KLSAgICAgIGlmICggYm90dG9tICkKLSAgICAgIHsKLSAgICAgICAgaGludC0+Y3NDb29yZCA9IHN0ZW1IaW50LT5tYXg7Ci0gICAgICAgIGhpbnQtPmZsYWdzICAgPSBDRjJfR2hvc3RCb3R0b207Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGhpbnQtPmZsYWdzID0gMDsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICggd2lkdGggPT0gY2YyX2ludFRvRml4ZWQoIC0yMCApICkKLSAgICB7Ci0gICAgICAvKiBnaG9zdCB0b3AgKi8KLQotICAgICAgaWYgKCBib3R0b20gKQotICAgICAgICBoaW50LT5mbGFncyA9IDA7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhpbnQtPmNzQ29vcmQgPSBzdGVtSGludC0+bWluOwotICAgICAgICBoaW50LT5mbGFncyAgID0gQ0YyX0dob3N0VG9wOwotICAgICAgfQotICAgIH0KLQotICAgIGVsc2UgaWYgKCB3aWR0aCA8IDAgKQotICAgIHsKLSAgICAgIC8qIGludmVydGVkIHBhaXIgKi8KLQotICAgICAgLyoKLSAgICAgICAqIEhpbnRzIHdpdGggbmVnYXRpdmUgd2lkdGhzIHdlcmUgcHJvZHVjZWQgYnkgYW4gZWFybHkgdmVyc2lvbiBvZiBhCi0gICAgICAgKiBub24tQWRvYmUgZm9udCB0b29sLiAgVGhlIFR5cGUgMiBzcGVjIGFsbG93cyBlZGdlIChnaG9zdCkgaGludHMKLSAgICAgICAqIHdpdGggbmVnYXRpdmUgd2lkdGhzLCBidXQgc2F5cwotICAgICAgICoKLSAgICAgICAqICAgQWxsIG90aGVyIG5lZ2F0aXZlIHdpZHRocyBoYXZlIHVuZGVmaW5lZCBtZWFuaW5nLgotICAgICAgICoKLSAgICAgICAqIENvb2xUeXBlIGhhcyBhIHNpbGVudCB3b3JrYXJvdW5kIHRoYXQgbmVnYXRlcyB0aGUgaGludCB3aWR0aDsgZm9yCi0gICAgICAgKiBwZXJtaXNzaXZlIG1vZGUsIHdlIGRvIHRoZSBzYW1lIGhlcmUuCi0gICAgICAgKgotICAgICAgICogTm90ZTogU3VjaCBmb250cyBjYW5ub3QgdXNlIGdob3N0IGhpbnRzLCBidXQgc2hvdWxkIG90aGVyd2lzZSB3b3JrLgotICAgICAgICogTm90ZTogU29tZSBwb29yIGhpbnRzIGluIG91ciBmYXV4IGZvbnRzIGNhbiBwcm9kdWNlIG5lZ2F0aXZlCi0gICAgICAgKiAgICAgICB3aWR0aHMgYXQgc29tZSBibGVuZHMuICBGb3IgZXhhbXBsZSwgc2VlIGEgbGlnaHQgd2VpZ2h0IG9mCi0gICAgICAgKiAgICAgICBgdScgaW4gQVNlcmlmTU0uCi0gICAgICAgKgotICAgICAgICovCi0gICAgICBpZiAoIGJvdHRvbSApCi0gICAgICB7Ci0gICAgICAgIGhpbnQtPmNzQ29vcmQgPSBzdGVtSGludC0+bWF4OwotICAgICAgICBoaW50LT5mbGFncyAgID0gQ0YyX1BhaXJCb3R0b207Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhpbnQtPmNzQ29vcmQgPSBzdGVtSGludC0+bWluOwotICAgICAgICBoaW50LT5mbGFncyAgID0gQ0YyX1BhaXJUb3A7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIG5vcm1hbCBwYWlyICovCi0KLSAgICAgIGlmICggYm90dG9tICkKLSAgICAgIHsKLSAgICAgICAgaGludC0+Y3NDb29yZCA9IHN0ZW1IaW50LT5taW47Ci0gICAgICAgIGhpbnQtPmZsYWdzICAgPSBDRjJfUGFpckJvdHRvbTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaGludC0+Y3NDb29yZCA9IHN0ZW1IaW50LT5tYXg7Ci0gICAgICAgIGhpbnQtPmZsYWdzICAgPSBDRjJfUGFpclRvcDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBOb3cgdGhhdCBnaG9zdCBoaW50cyBoYXZlIGJlZW4gZGV0ZWN0ZWQsIGFkanVzdCB0aGlzIGVkZ2UgZm9yICAgICAgKi8KLSAgICAvKiBkYXJrZW5pbmcuICBCb3R0b21zIGFyZSBub3QgY2hhbmdlZDsgdG9wcyBhcmUgaW5jcmVtZW50ZWQgYnkgdHdpY2UgKi8KLSAgICAvKiBgZGFya2VuWScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGNmMl9oaW50X2lzVG9wKCBoaW50ICkgKQotICAgICAgaGludC0+Y3NDb29yZCA9IEFERF9JTlQzMiggaGludC0+Y3NDb29yZCwgMiAqIGZvbnQtPmRhcmtlblkgKTsKLQotICAgIGhpbnQtPmNzQ29vcmQgPSBBRERfSU5UMzIoIGhpbnQtPmNzQ29vcmQsIGhpbnRPcmlnaW4gKTsKLSAgICBoaW50LT5zY2FsZSAgID0gc2NhbGU7Ci0gICAgaGludC0+aW5kZXggICA9IGluZGV4U3RlbUhpbnQ7ICAgLyogaW5kZXggaW4gb3JpZ2luYWwgc3RlbSBoaW50IGFycmF5ICovCi0KLSAgICAvKiBpZiBvcmlnaW5hbCBzdGVtIGhpbnQgaGFzIGJlZW4gdXNlZCwgdXNlIHRoZSBzYW1lIHBvc2l0aW9uICovCi0gICAgaWYgKCBoaW50LT5mbGFncyAhPSAwICYmIHN0ZW1IaW50LT51c2VkICkKLSAgICB7Ci0gICAgICBpZiAoIGNmMl9oaW50X2lzVG9wKCBoaW50ICkgKQotICAgICAgICBoaW50LT5kc0Nvb3JkID0gc3RlbUhpbnQtPm1heERTOwotICAgICAgZWxzZQotICAgICAgICBoaW50LT5kc0Nvb3JkID0gc3RlbUhpbnQtPm1pbkRTOwotCi0gICAgICBjZjJfaGludF9sb2NrKCBoaW50ICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGhpbnQtPmRzQ29vcmQgPSBGVF9NdWxGaXgoIGhpbnQtPmNzQ29vcmQsIHNjYWxlICk7Ci0gIH0KLQotCi0gIC8qIGluaXRpYWxpemUgYW4gaW52YWxpZCBoaW50IG1hcCBlbGVtZW50ICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9oaW50X2luaXRaZXJvKCBDRjJfSGludCAgaGludCApCi0gIHsKLSAgICBGVF9aRVJPKCBoaW50ICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIGNmMl9oaW50X2lzVmFsaWQoIGNvbnN0IENGMl9IaW50ICBoaW50ICkKLSAgewotICAgIHJldHVybiAoRlRfQm9vbCkoIGhpbnQtPmZsYWdzICE9IDAgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgY2YyX2hpbnRfaXNQYWlyKCBjb25zdCBDRjJfSGludCAgaGludCApCi0gIHsKLSAgICByZXR1cm4gKEZUX0Jvb2wpKCAoIGhpbnQtPmZsYWdzICAgICAgICAgICAgICAgICAgICAgICYKLSAgICAgICAgICAgICAgICAgICAgICAgICggQ0YyX1BhaXJCb3R0b20gfCBDRjJfUGFpclRvcCApICkgIT0gMCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBjZjJfaGludF9pc1BhaXJUb3AoIGNvbnN0IENGMl9IaW50ICBoaW50ICkKLSAgewotICAgIHJldHVybiAoRlRfQm9vbCkoICggaGludC0+ZmxhZ3MgJiBDRjJfUGFpclRvcCApICE9IDAgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgY2YyX2hpbnRfaXNUb3AoIGNvbnN0IENGMl9IaW50ICBoaW50ICkKLSAgewotICAgIHJldHVybiAoRlRfQm9vbCkoICggaGludC0+ZmxhZ3MgICAgICAgICAgICAgICAgICAgICYKLSAgICAgICAgICAgICAgICAgICAgICAgICggQ0YyX1BhaXJUb3AgfCBDRjJfR2hvc3RUb3AgKSApICE9IDAgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgY2YyX2hpbnRfaXNCb3R0b20oIGNvbnN0IENGMl9IaW50ICBoaW50ICkKLSAgewotICAgIHJldHVybiAoRlRfQm9vbCkoICggaGludC0+ZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICYKLSAgICAgICAgICAgICAgICAgICAgICAgICggQ0YyX1BhaXJCb3R0b20gfCBDRjJfR2hvc3RCb3R0b20gKSApICE9IDAgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgY2YyX2hpbnRfaXNMb2NrZWQoIGNvbnN0IENGMl9IaW50ICBoaW50ICkKLSAgewotICAgIHJldHVybiAoRlRfQm9vbCkoICggaGludC0+ZmxhZ3MgJiBDRjJfTG9ja2VkICkgIT0gMCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBjZjJfaGludF9pc1N5bnRoZXRpYyggY29uc3QgQ0YyX0hpbnQgIGhpbnQgKQotICB7Ci0gICAgcmV0dXJuIChGVF9Cb29sKSggKCBoaW50LT5mbGFncyAmIENGMl9TeW50aGV0aWMgKSAhPSAwICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9oaW50X2xvY2soIENGMl9IaW50ICBoaW50ICkKLSAgewotICAgIGhpbnQtPmZsYWdzIHw9IENGMl9Mb2NrZWQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9oaW50bWFwX2luaXQoIENGMl9IaW50TWFwICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0ZvbnQgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICBDRjJfSGludE1hcCAgIGluaXRpYWxNYXAsCi0gICAgICAgICAgICAgICAgICAgIENGMl9BcnJTdGFjayAgaGludE1vdmVzLAotICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgIHNjYWxlICkKLSAgewotICAgIEZUX1pFUk8oIGhpbnRtYXAgKTsKLQotICAgIC8qIGNvcHkgcGFyYW1ldGVycyBmcm9tIGZvbnQgaW5zdGFuY2UgKi8KLSAgICBoaW50bWFwLT5oaW50ZWQgICAgICAgICA9IGZvbnQtPmhpbnRlZDsKLSAgICBoaW50bWFwLT5zY2FsZSAgICAgICAgICA9IHNjYWxlOwotICAgIGhpbnRtYXAtPmZvbnQgICAgICAgICAgID0gZm9udDsKLSAgICBoaW50bWFwLT5pbml0aWFsSGludE1hcCA9IGluaXRpYWxNYXA7Ci0gICAgLyogd2lsbCBjbGVhciBpbiBgY2YyX2hpbnRtYXBfYWRqdXN0SGludHMnICovCi0gICAgaGludG1hcC0+aGludE1vdmVzICAgICAgPSBoaW50TW92ZXM7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGNmMl9oaW50bWFwX2lzVmFsaWQoIGNvbnN0IENGMl9IaW50TWFwICBoaW50bWFwICkKLSAgewotICAgIHJldHVybiBoaW50bWFwLT5pc1ZhbGlkOwotICB9Ci0KLQotICAvKiB0cmFuc2Zvcm0gY2hhcmFjdGVyIHNwYWNlIGNvb3JkaW5hdGUgdG8gZGV2aWNlIHNwYWNlIHVzaW5nIGhpbnQgbWFwICovCi0gIHN0YXRpYyBDRjJfRml4ZWQKLSAgY2YyX2hpbnRtYXBfbWFwKCBDRjJfSGludE1hcCAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgY3NDb29yZCApCi0gIHsKLSAgICBpZiAoIGhpbnRtYXAtPmNvdW50ID09IDAgfHwgISBoaW50bWFwLT5oaW50ZWQgKQotICAgIHsKLSAgICAgIC8qIHRoZXJlIGFyZSBubyBoaW50czsgdXNlIHVuaWZvcm0gc2NhbGUgYW5kIHplcm8gb2Zmc2V0ICovCi0gICAgICByZXR1cm4gRlRfTXVsRml4KCBjc0Nvb3JkLCBoaW50bWFwLT5zY2FsZSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogc3RhcnQgbGluZWFyIHNlYXJjaCBmcm9tIGxhc3QgaGl0ICovCi0gICAgICBDRjJfVUludCAgaSA9IGhpbnRtYXAtPmxhc3RJbmRleDsKLQotCi0gICAgICBGVF9BU1NFUlQoIGhpbnRtYXAtPmxhc3RJbmRleCA8IENGMl9NQVhfSElOVF9FREdFUyApOwotCi0gICAgICAvKiBzZWFyY2ggdXAgKi8KLSAgICAgIHdoaWxlICggaSA8IGhpbnRtYXAtPmNvdW50IC0gMSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgIGNzQ29vcmQgPj0gaGludG1hcC0+ZWRnZVtpICsgMV0uY3NDb29yZCApCi0gICAgICAgIGkgKz0gMTsKLQotICAgICAgLyogc2VhcmNoIGRvd24gKi8KLSAgICAgIHdoaWxlICggaSA+IDAgJiYgY3NDb29yZCA8IGhpbnRtYXAtPmVkZ2VbaV0uY3NDb29yZCApCi0gICAgICAgIGkgLT0gMTsKLQotICAgICAgaGludG1hcC0+bGFzdEluZGV4ID0gaTsKLQotICAgICAgaWYgKCBpID09IDAgJiYgY3NDb29yZCA8IGhpbnRtYXAtPmVkZ2VbMF0uY3NDb29yZCApCi0gICAgICB7Ci0gICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgcG9pbnRzIGJlbG93IGZpcnN0IGVkZ2U6IHVzZSB1bmlmb3JtIHNjYWxlICovCi0gICAgICAgIHJldHVybiBBRERfSU5UMzIoIEZUX011bEZpeCggU1VCX0lOVDMyKCBjc0Nvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVswXS5jc0Nvb3JkICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+c2NhbGUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVswXS5kc0Nvb3JkICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE5vdGU6IGVudHJpZXMgd2l0aCBkdXBsaWNhdGUgY3NDb29yZCBhcmUgYWxsb3dlZC4KLSAgICAgICAgICogVXNlIGVkZ2VbaV0sIHRoZSBoaWdoZXN0IGVudHJ5IHdoZXJlIGNzQ29vcmQgPj0gZW50cnlbaV0uY3NDb29yZAotICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIEFERF9JTlQzMiggRlRfTXVsRml4KCBTVUJfSU5UMzIoIGNzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2ldLmNzQ29vcmQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2ldLnNjYWxlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbaV0uZHNDb29yZCApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoKLSAgICogVGhpcyBoaW50aW5nIHBvbGljeSBtb3ZlcyBhIGhpbnQgcGFpciBpbiBkZXZpY2Ugc3BhY2Ugc28gdGhhdCBvbmUgb2YKLSAgICogaXRzIHR3byBlZGdlcyBpcyBvbiBhIGRldmljZSBwaXhlbCBib3VuZGFyeSAoaXRzIGZyYWN0aW9uYWwgcGFydCBpcwotICAgKiB6ZXJvKS4gIGBjZjJfaGludG1hcF9pbnNlcnRIaW50JyBndWFyYW50ZWVzIG5vIG92ZXJsYXAgaW4gQ1MKLSAgICogc3BhY2UuICBFbnN1cmUgaGVyZSB0aGF0IHRoZXJlIGlzIG5vIG92ZXJsYXAgaW4gRFMuCi0gICAqCi0gICAqIEluIHRoZSBmaXJzdCBwYXNzLCBlZGdlcyBhcmUgYWRqdXN0ZWQgcmVsYXRpdmUgdG8gYWRqYWNlbnQgaGludHMuCi0gICAqIFRob3NlIHRoYXQgYXJlIGJlbG93IGhhdmUgYWxyZWFkeSBiZWVuIGFkanVzdGVkLiAgVGhvc2UgdGhhdCBhcmUKLSAgICogYWJvdmUgaGF2ZSBub3QgeWV0IGJlZW4gYWRqdXN0ZWQuICBJZiBhIGhpbnQgYWJvdmUgYmxvY2tzIGFuCi0gICAqIGFkanVzdG1lbnQgdG8gYW4gb3B0aW1hbCBwb3NpdGlvbiwgd2Ugd2lsbCB0cnkgYWdhaW4gaW4gYSBzZWNvbmQKLSAgICogcGFzcy4gIFRoZSBzZWNvbmQgcGFzcyBpcyB0b3AtZG93bi4KLSAgICoKLSAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2hpbnRtYXBfYWRqdXN0SGludHMoIENGMl9IaW50TWFwICBoaW50bWFwICkKLSAgewotICAgIHNpemVfdCAgaSwgajsKLQotCi0gICAgY2YyX2FycnN0YWNrX2NsZWFyKCBoaW50bWFwLT5oaW50TW92ZXMgKTsgICAgICAvKiB3b3JraW5nIHN0b3JhZ2UgKi8KLQotICAgIC8qCi0gICAgICogRmlyc3QgcGFzcyBpcyBib3R0b20tdXAgKGZvbnQgaGludCBvcmRlcikgd2l0aG91dCBsb29rLWFoZWFkLgotICAgICAqIExvY2tlZCBlZGdlcyBhcmUgYWxyZWFkeSBhZGp1c3RlZC4KLSAgICAgKiBVbmxvY2tlZCBlZGdlcyBiZWdpbiB3aXRoIGRzQ29vcmQgZnJvbSBgaW5pdGlhbEhpbnRNYXAnLgotICAgICAqIFNhdmUgZWRnZXMgdGhhdCBhcmUgbm90IG9wdGltYWxseSBhZGp1c3RlZCBpbiBgaGludE1vdmVzJyBhcnJheSwKLSAgICAgKiBhbmQgcHJvY2VzcyB0aGVtIGluIHNlY29uZCBwYXNzLgotICAgICAqLwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBoaW50bWFwLT5jb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9Cb29sICBpc1BhaXIgPSBjZjJfaGludF9pc1BhaXIoICZoaW50bWFwLT5lZGdlW2ldICk7Ci0KLQotICAgICAgLyogaW5kZXggb2YgdXBwZXIgZWRnZSAoc2FtZSB2YWx1ZSBmb3IgZ2hvc3QgaGludCkgKi8KLSAgICAgIGogPSBpc1BhaXIgPyBpICsgMSA6IGk7Ci0KLSAgICAgIEZUX0FTU0VSVCggaiA8IGhpbnRtYXAtPmNvdW50ICk7Ci0gICAgICBGVF9BU1NFUlQoIGNmMl9oaW50X2lzVmFsaWQoICZoaW50bWFwLT5lZGdlW2ldICkgKTsKLSAgICAgIEZUX0FTU0VSVCggY2YyX2hpbnRfaXNWYWxpZCggJmhpbnRtYXAtPmVkZ2Vbal0gKSApOwotICAgICAgRlRfQVNTRVJUKCBjZjJfaGludF9pc0xvY2tlZCggJmhpbnRtYXAtPmVkZ2VbaV0gKSA9PQotICAgICAgICAgICAgICAgICAgIGNmMl9oaW50X2lzTG9ja2VkKCAmaGludG1hcC0+ZWRnZVtqXSApICk7Ci0KLSAgICAgIGlmICggIWNmMl9oaW50X2lzTG9ja2VkKCAmaGludG1hcC0+ZWRnZVtpXSApICkKLSAgICAgIHsKLSAgICAgICAgLyogaGludCBlZGdlIGlzIG5vdCBsb2NrZWQsIHdlIGNhbiBhZGp1c3QgaXQgKi8KLSAgICAgICAgQ0YyX0ZpeGVkICBmcmFjRG93biA9IGNmMl9maXhlZEZyYWN0aW9uKCBoaW50bWFwLT5lZGdlW2ldLmRzQ29vcmQgKTsKLSAgICAgICAgQ0YyX0ZpeGVkICBmcmFjVXAgICA9IGNmMl9maXhlZEZyYWN0aW9uKCBoaW50bWFwLT5lZGdlW2pdLmRzQ29vcmQgKTsKLQotICAgICAgICAvKiBjYWxjdWxhdGUgYWxsIGZvdXIgcG9zc2liaWxpdGllczsgbW92ZXMgZG93biBhcmUgbmVnYXRpdmUgKi8KLSAgICAgICAgQ0YyX0ZpeGVkICBkb3duTW92ZURvd24gPSAwIC0gZnJhY0Rvd247Ci0gICAgICAgIENGMl9GaXhlZCAgdXBNb3ZlRG93biAgID0gMCAtIGZyYWNVcDsKLSAgICAgICAgQ0YyX0ZpeGVkICBkb3duTW92ZVVwICAgPSAoIGZyYWNEb3duID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNmMl9pbnRUb0ZpeGVkKCAxICkgLSBmcmFjRG93bjsKLSAgICAgICAgQ0YyX0ZpeGVkICB1cE1vdmVVcCAgICAgPSAoIGZyYWNVcCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjZjJfaW50VG9GaXhlZCggMSApIC0gZnJhY1VwOwotCi0gICAgICAgIC8qIHNtYWxsZXN0IG1vdmUgdXAgKi8KLSAgICAgICAgQ0YyX0ZpeGVkICBtb3ZlVXAgICA9IEZUX01JTiggZG93bk1vdmVVcCwgdXBNb3ZlVXAgKTsKLSAgICAgICAgLyogc21hbGxlc3QgbW92ZSBkb3duICovCi0gICAgICAgIENGMl9GaXhlZCAgbW92ZURvd24gPSBGVF9NQVgoIGRvd25Nb3ZlRG93biwgdXBNb3ZlRG93biApOwotCi0gICAgICAgIC8qIGZpbmFsIGFtb3VudCB0byBtb3ZlIGVkZ2Ugb3IgZWRnZSBwYWlyICovCi0gICAgICAgIENGMl9GaXhlZCAgbW92ZTsKLQotICAgICAgICBDRjJfRml4ZWQgIGRvd25NaW5Db3VudGVyID0gQ0YyX01JTl9DT1VOVEVSOwotICAgICAgICBDRjJfRml4ZWQgIHVwTWluQ291bnRlciAgID0gQ0YyX01JTl9DT1VOVEVSOwotICAgICAgICBGVF9Cb29sICAgIHNhdmVFZGdlICAgICAgID0gRkFMU0U7Ci0KLQotICAgICAgICAvKiBtaW5pbXVtIGNvdW50ZXIgY29uc3RyYWludCBkb2Vzbid0IGFwcGx5IHdoZW4gYWRqYWNlbnQgZWRnZXMgKi8KLSAgICAgICAgLyogYXJlIHN5bnRoZXRpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRPRE86IGRvZXNuJ3Qgc2VlbSBhIGJpZyBlZmZlY3Q7IGZvciBub3csIHJlZHVjZSB0aGUgY29kZSAgICAqLwotI2lmIDAKLSAgICAgICAgaWYgKCBpID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICBjZjJfaGludF9pc1N5bnRoZXRpYyggJmhpbnRtYXAtPmVkZ2VbaSAtIDFdICkgKQotICAgICAgICAgIGRvd25NaW5Db3VudGVyID0gMDsKLQotICAgICAgICBpZiAoIGogPj0gaGludG1hcC0+Y291bnQgLSAxICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIGNmMl9oaW50X2lzU3ludGhldGljKCAmaGludG1hcC0+ZWRnZVtqICsgMV0gKSApCi0gICAgICAgICAgdXBNaW5Db3VudGVyID0gMDsKLSNlbmRpZgotCi0gICAgICAgIC8qIGlzIHRoZXJlIHJvb20gdG8gbW92ZSB1cD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiB0aGVyZSBpcyBpZiB3ZSBhcmUgYXQgdG9wIG9mIGFycmF5IG9yIHRoZSBuZXh0IGVkZ2UgaXMgYXQgb3IgKi8KLSAgICAgICAgLyogYmV5b25kIHByb3Bvc2VkIG1vdmUgdXA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggaiA+PSBoaW50bWFwLT5jb3VudCAtIDEgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2ogKyAxXS5kc0Nvb3JkID49Ci0gICAgICAgICAgICAgICBBRERfSU5UMzIoIGhpbnRtYXAtPmVkZ2Vbal0uZHNDb29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVVwICsgdXBNaW5Db3VudGVyICkgICApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB0aGVyZSBpcyByb29tIHRvIG1vdmUgdXA7IGlzIHRoZXJlIGFsc28gcm9vbSB0byBtb3ZlIGRvd24/ICovCi0gICAgICAgICAgaWYgKCBpID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2kgLSAxXS5kc0Nvb3JkIDw9Ci0gICAgICAgICAgICAgICAgIEFERF9JTlQzMiggaGludG1hcC0+ZWRnZVtpXS5kc0Nvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVEb3duIC0gZG93bk1pbkNvdW50ZXIgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogbW92ZSBzbWFsbGVyIGFic29sdXRlIGFtb3VudCAqLwotICAgICAgICAgICAgbW92ZSA9ICggLW1vdmVEb3duIDwgbW92ZVVwICkgPyBtb3ZlRG93biA6IG1vdmVVcDsgIC8qIG9wdGltdW0gKi8KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbW92ZSA9IG1vdmVVcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBpcyB0aGVyZSByb29tIHRvIG1vdmUgZG93bj8gKi8KLSAgICAgICAgICBpZiAoIGkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbaSAtIDFdLmRzQ29vcmQgPD0KLSAgICAgICAgICAgICAgICAgQUREX0lOVDMyKCBoaW50bWFwLT5lZGdlW2ldLmRzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZURvd24gLSBkb3duTWluQ291bnRlciApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtb3ZlICAgICA9IG1vdmVEb3duOwotICAgICAgICAgICAgLyogdHJ1ZSBpZiBub24tb3B0aW11bSBtb3ZlICovCi0gICAgICAgICAgICBzYXZlRWRnZSA9IChGVF9Cb29sKSggbW92ZVVwIDwgLW1vdmVEb3duICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBubyByb29tIHRvIG1vdmUgZWl0aGVyIHdheSB3aXRob3V0IG92ZXJsYXBwaW5nIG9yIHJlZHVjaW5nICovCi0gICAgICAgICAgICAvKiB0aGUgY291bnRlciB0b28gbXVjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtb3ZlICAgICA9IDA7Ci0gICAgICAgICAgICBzYXZlRWRnZSA9IFRSVUU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWRlbnRpZnkgbm9uLW1vdmVzIGFuZCBtb3ZlcyBkb3duIHRoYXQgYXJlbid0IG9wdGltYWwsIGFuZCBzYXZlICovCi0gICAgICAgIC8qIHRoZW0gZm9yIHNlY29uZCBwYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBEbyB0aGlzIG9ubHkgaWYgdGhlcmUgaXMgYW4gdW5sb2NrZWQgZWRnZSBhYm92ZSAod2hpY2ggY291bGQgICAgKi8KLSAgICAgICAgLyogcG9zc2libHkgbW92ZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggc2F2ZUVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGogPCBoaW50bWFwLT5jb3VudCAtIDEgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAhY2YyX2hpbnRfaXNMb2NrZWQoICZoaW50bWFwLT5lZGdlW2ogKyAxXSApICkKLSAgICAgICAgewotICAgICAgICAgIENGMl9IaW50TW92ZVJlYyAgc2F2ZWRNb3ZlOwotCi0KLSAgICAgICAgICBzYXZlZE1vdmUuaiAgICAgID0gajsKLSAgICAgICAgICAvKiBkZXNpcmVkIGFkanVzdG1lbnQgaW4gc2Vjb25kIHBhc3MgKi8KLSAgICAgICAgICBzYXZlZE1vdmUubW92ZVVwID0gbW92ZVVwIC0gbW92ZTsKLQotICAgICAgICAgIGNmMl9hcnJzdGFja19wdXNoKCBoaW50bWFwLT5oaW50TW92ZXMsICZzYXZlZE1vdmUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG1vdmUgdGhlIGVkZ2UocykgKi8KLSAgICAgICAgaGludG1hcC0+ZWRnZVtpXS5kc0Nvb3JkID0gQUREX0lOVDMyKCBoaW50bWFwLT5lZGdlW2ldLmRzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZSApOwotICAgICAgICBpZiAoIGlzUGFpciApCi0gICAgICAgICAgaGludG1hcC0+ZWRnZVtqXS5kc0Nvb3JkID0gQUREX0lOVDMyKCBoaW50bWFwLT5lZGdlW2pdLmRzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGFzc2VydCB0aGVyZSBhcmUgbm8gb3ZlcmxhcHMgaW4gZGV2aWNlIHNwYWNlICovCi0gICAgICBGVF9BU1NFUlQoIGkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbaSAtIDFdLmRzQ29vcmQgPD0gaGludG1hcC0+ZWRnZVtpXS5kc0Nvb3JkICk7Ci0gICAgICBGVF9BU1NFUlQoIGkgPCBqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtpXS5kc0Nvb3JkIDw9IGhpbnRtYXAtPmVkZ2Vbal0uZHNDb29yZCApOwotCi0gICAgICAvKiBhZGp1c3QgdGhlIHNjYWxlcywgYXZvaWRpbmcgZGl2aWRlIGJ5IHplcm8gKi8KLSAgICAgIGlmICggaSA+IDAgKQotICAgICAgewotICAgICAgICBpZiAoIGhpbnRtYXAtPmVkZ2VbaV0uY3NDb29yZCAhPSBoaW50bWFwLT5lZGdlW2kgLSAxXS5jc0Nvb3JkICkKLSAgICAgICAgICBoaW50bWFwLT5lZGdlW2kgLSAxXS5zY2FsZSA9Ci0gICAgICAgICAgICBGVF9EaXZGaXgoIFNVQl9JTlQzMiggaGludG1hcC0+ZWRnZVtpXS5kc0Nvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbaSAtIDFdLmRzQ29vcmQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU1VCX0lOVDMyKCBoaW50bWFwLT5lZGdlW2ldLmNzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtpIC0gMV0uY3NDb29yZCApICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggaXNQYWlyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBoaW50bWFwLT5lZGdlW2pdLmNzQ29vcmQgIT0gaGludG1hcC0+ZWRnZVtqIC0gMV0uY3NDb29yZCApCi0gICAgICAgICAgaGludG1hcC0+ZWRnZVtqIC0gMV0uc2NhbGUgPQotICAgICAgICAgICAgRlRfRGl2Rml4KCBTVUJfSU5UMzIoIGhpbnRtYXAtPmVkZ2Vbal0uZHNDb29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2ogLSAxXS5kc0Nvb3JkICksCi0gICAgICAgICAgICAgICAgICAgICAgIFNVQl9JTlQzMiggaGludG1hcC0+ZWRnZVtqXS5jc0Nvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbaiAtIDFdLmNzQ29vcmQgKSApOwotCi0gICAgICAgIGkgKz0gMTsgICAgIC8qIHNraXAgdXBwZXIgZWRnZSBvbiBuZXh0IGxvb3AgKi8KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzZWNvbmQgcGFzcyB0cmllcyB0byBtb3ZlIG5vbi1vcHRpbWFsIGhpbnRzIHVwLCBpbiBjYXNlIHRoZXJlIGlzICovCi0gICAgLyogcm9vbSBub3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGkgPSBjZjJfYXJyc3RhY2tfc2l6ZSggaGludG1hcC0+aGludE1vdmVzICk7IGkgPiAwOyBpLS0gKQotICAgIHsKLSAgICAgIENGMl9IaW50TW92ZSAgaGludE1vdmUgPSAoQ0YyX0hpbnRNb3ZlKQotICAgICAgICAgICAgICAgICAgICAgIGNmMl9hcnJzdGFja19nZXRQb2ludGVyKCBoaW50bWFwLT5oaW50TW92ZXMsIGkgLSAxICk7Ci0KLQotICAgICAgaiA9IGhpbnRNb3ZlLT5qOwotCi0gICAgICAvKiB0aGlzIHdhcyB0ZXN0ZWQgYmVmb3JlIHRoZSBwdXNoLCBhYm92ZSAqLwotICAgICAgRlRfQVNTRVJUKCBqIDwgaGludG1hcC0+Y291bnQgLSAxICk7Ci0KLSAgICAgIC8qIGlzIHRoZXJlIHJvb20gdG8gbW92ZSB1cD8gKi8KLSAgICAgIGlmICggaGludG1hcC0+ZWRnZVtqICsgMV0uZHNDb29yZCA+PQotICAgICAgICAgICAgIEFERF9JTlQzMiggaGludG1hcC0+ZWRnZVtqXS5kc0Nvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgaGludE1vdmUtPm1vdmVVcCArIENGMl9NSU5fQ09VTlRFUiApICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhlcmUgaXMgbW9yZSByb29tIG5vdywgbW92ZSBlZGdlIHVwICovCi0gICAgICAgIGhpbnRtYXAtPmVkZ2Vbal0uZHNDb29yZCA9IEFERF9JTlQzMiggaGludG1hcC0+ZWRnZVtqXS5kc0Nvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRNb3ZlLT5tb3ZlVXAgKTsKLQotICAgICAgICBpZiAoIGNmMl9oaW50X2lzUGFpciggJmhpbnRtYXAtPmVkZ2Vbal0gKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9BU1NFUlQoIGogPiAwICk7Ci0gICAgICAgICAgaGludG1hcC0+ZWRnZVtqIC0gMV0uZHNDb29yZCA9Ci0gICAgICAgICAgICBBRERfSU5UMzIoIGhpbnRtYXAtPmVkZ2VbaiAtIDFdLmRzQ29vcmQsIGhpbnRNb3ZlLT5tb3ZlVXAgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogaW5zZXJ0IGhpbnQgZWRnZXMgaW50byBtYXAsIHNvcnRlZCBieSBjc0Nvb3JkICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9oaW50bWFwX2luc2VydEhpbnQoIENGMl9IaW50TWFwICBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfSGludCAgICAgYm90dG9tSGludEVkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9IaW50ICAgICB0b3BIaW50RWRnZSApCi0gIHsKLSAgICBDRjJfVUludCAgaW5kZXhJbnNlcnQ7Ci0KLSAgICAvKiBzZXQgZGVmYXVsdCB2YWx1ZXMsIHRoZW4gY2hlY2sgZm9yIGVkZ2UgaGludHMgKi8KLSAgICBGVF9Cb29sICAgaXNQYWlyICAgICAgICAgPSBUUlVFOwotICAgIENGMl9IaW50ICBmaXJzdEhpbnRFZGdlICA9IGJvdHRvbUhpbnRFZGdlOwotICAgIENGMl9IaW50ICBzZWNvbmRIaW50RWRnZSA9IHRvcEhpbnRFZGdlOwotCi0KLSAgICAvKiBvbmUgb3Igbm9uZSBvZiB0aGUgaW5wdXQgcGFyYW1zIG1heSBiZSBpbnZhbGlkIHdoZW4gZGVhbGluZyB3aXRoICovCi0gICAgLyogZWRnZSBoaW50czsgYXQgbGVhc3Qgb25lIGVkZ2UgbXVzdCBiZSB2YWxpZCAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0FTU0VSVCggY2YyX2hpbnRfaXNWYWxpZCggYm90dG9tSGludEVkZ2UgKSB8fAotICAgICAgICAgICAgICAgY2YyX2hpbnRfaXNWYWxpZCggdG9wSGludEVkZ2UgKSAgICApOwotCi0gICAgLyogZGV0ZXJtaW5lIGhvdyBtYW55IGFuZCB3aGljaCBlZGdlcyB0byBpbnNlcnQgKi8KLSAgICBpZiAoICFjZjJfaGludF9pc1ZhbGlkKCBib3R0b21IaW50RWRnZSApICkKLSAgICB7Ci0gICAgICAvKiBpbnNlcnQgb25seSB0aGUgdG9wIGVkZ2UgKi8KLSAgICAgIGZpcnN0SGludEVkZ2UgPSB0b3BIaW50RWRnZTsKLSAgICAgIGlzUGFpciAgICAgICAgPSBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICFjZjJfaGludF9pc1ZhbGlkKCB0b3BIaW50RWRnZSApICkKLSAgICB7Ci0gICAgICAvKiBpbnNlcnQgb25seSB0aGUgYm90dG9tIGVkZ2UgKi8KLSAgICAgIGlzUGFpciA9IEZBTFNFOwotICAgIH0KLQotICAgIC8qIHBhaXJlZCBlZGdlcyBtdXN0IGJlIGluIHByb3BlciBvcmRlciAqLwotICAgIGlmICggaXNQYWlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdG9wSGludEVkZ2UtPmNzQ29vcmQgPCBib3R0b21IaW50RWRnZS0+Y3NDb29yZCApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBsaW5lYXIgc2VhcmNoIHRvIGZpbmQgaW5kZXggdmFsdWUgb2YgaW5zZXJ0aW9uIHBvaW50ICovCi0gICAgaW5kZXhJbnNlcnQgPSAwOwotICAgIGZvciAoIDsgaW5kZXhJbnNlcnQgPCBoaW50bWFwLT5jb3VudDsgaW5kZXhJbnNlcnQrKyApCi0gICAgewotICAgICAgaWYgKCBoaW50bWFwLT5lZGdlW2luZGV4SW5zZXJ0XS5jc0Nvb3JkID49IGZpcnN0SGludEVkZ2UtPmNzQ29vcmQgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIERpc2NhcmQgYW55IGhpbnRzIHRoYXQgb3ZlcmxhcCBpbiBjaGFyYWN0ZXIgc3BhY2UuICBNb3N0IG9mdGVuLCB0aGlzCi0gICAgICogaXMgd2hpbGUgYnVpbGRpbmcgdGhlIGluaXRpYWwgbWFwLCB3aGVyZSBjYXB0dXJlZCBoaW50cyBmcm9tIGFsbAotICAgICAqIHpvbmVzIGFyZSBjb21iaW5lZC4gIERlZmluZSBvdmVybGFwIHRvIGluY2x1ZGUgaGludHMgdGhhdCBgdG91Y2gnCi0gICAgICogKG92ZXJsYXAgemVybykuICBIaXJhZ2lubyBTYW5zL0dvdGhpYyBmb250cyBoYXZlIG51bWVyb3VzIGhpbnRzIHRoYXQKLSAgICAgKiB0b3VjaC4gIFNvbWUgZm9udHMgaGF2ZSBub24taWRlb2dyYXBoaWMgZ2x5cGhzIHRoYXQgb3ZlcmxhcCBvdXIKLSAgICAgKiBzeW50aGV0aWMgaGludHMuCi0gICAgICoKLSAgICAgKiBPdmVybGFwIGFsc28gb2NjdXJzIHdoZW4gZGFya2VuaW5nIHN0ZW0gaGludHMgdGhhdCBhcmUgY2xvc2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBpZiAoIGluZGV4SW5zZXJ0IDwgaGludG1hcC0+Y291bnQgKQotICAgIHsKLSAgICAgIC8qIHdlIGFyZSBpbnNlcnRpbmcgYmVmb3JlIGFuIGV4aXN0aW5nIGVkZ2U6ICAgICovCi0gICAgICAvKiB2ZXJpZnkgdGhhdCBhbiBleGlzdGluZyBlZGdlIGlzIG5vdCB0aGUgc2FtZSAqLwotICAgICAgaWYgKCBoaW50bWFwLT5lZGdlW2luZGV4SW5zZXJ0XS5jc0Nvb3JkID09IGZpcnN0SGludEVkZ2UtPmNzQ29vcmQgKQotICAgICAgICByZXR1cm47IC8qIGlnbm9yZSBvdmVybGFwcGluZyBzdGVtIGhpbnQgKi8KLQotICAgICAgLyogdmVyaWZ5IHRoYXQgYSBuZXcgcGFpciBkb2VzIG5vdCBzdHJhZGRsZSB0aGUgbmV4dCBlZGdlICovCi0gICAgICBpZiAoIGlzUGFpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgaGludG1hcC0+ZWRnZVtpbmRleEluc2VydF0uY3NDb29yZCA8PSBzZWNvbmRIaW50RWRnZS0+Y3NDb29yZCApCi0gICAgICAgIHJldHVybjsgLyogaWdub3JlIG92ZXJsYXBwaW5nIHN0ZW0gaGludCAqLwotCi0gICAgICAvKiB2ZXJpZnkgdGhhdCB3ZSBhcmUgbm90IGluc2VydGluZyBiZXR3ZWVuIHBhaXJlZCBlZGdlcyAqLwotICAgICAgaWYgKCBjZjJfaGludF9pc1BhaXJUb3AoICZoaW50bWFwLT5lZGdlW2luZGV4SW5zZXJ0XSApICkKLSAgICAgICAgcmV0dXJuOyAvKiBpZ25vcmUgb3ZlcmxhcHBpbmcgc3RlbSBoaW50ICovCi0gICAgfQotCi0gICAgLyogcmVjb21wdXRlIGRldmljZSBzcGFjZSBsb2NhdGlvbnMgdXNpbmcgaW5pdGlhbCBoaW50IG1hcCAqLwotICAgIGlmICggY2YyX2hpbnRtYXBfaXNWYWxpZCggaGludG1hcC0+aW5pdGlhbEhpbnRNYXAgKSAmJgotICAgICAgICAgIWNmMl9oaW50X2lzTG9ja2VkKCBmaXJzdEhpbnRFZGdlICkgICAgICAgICAgICApCi0gICAgewotICAgICAgaWYgKCBpc1BhaXIgKQotICAgICAgewotICAgICAgICAvKiBVc2UgaGludCBtYXAgdG8gcG9zaXRpb24gdGhlIGNlbnRlciBvZiBzdGVtLCBhbmQgbm9taW5hbCBzY2FsZSAqLwotICAgICAgICAvKiB0byBwb3NpdGlvbiB0aGUgdHdvIGVkZ2VzLiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHN0ZW0gd2lkdGguICAgICAqLwotICAgICAgICBDRjJfRml4ZWQgIG1pZHBvaW50ID0KLSAgICAgICAgICAgICAgICAgICAgIGNmMl9oaW50bWFwX21hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+aW5pdGlhbEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEFERF9JTlQzMiggc2Vjb25kSGludEVkZ2UtPmNzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RIaW50RWRnZS0+Y3NDb29yZCApIC8gMiApOwotICAgICAgICBDRjJfRml4ZWQgIGhhbGZXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIFNVQl9JTlQzMiggc2Vjb25kSGludEVkZ2UtPmNzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RIaW50RWRnZS0+Y3NDb29yZCApIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+c2NhbGUgKTsKLQotCi0gICAgICAgIGZpcnN0SGludEVkZ2UtPmRzQ29vcmQgID0gU1VCX0lOVDMyKCBtaWRwb2ludCwgaGFsZldpZHRoICk7Ci0gICAgICAgIHNlY29uZEhpbnRFZGdlLT5kc0Nvb3JkID0gQUREX0lOVDMyKCBtaWRwb2ludCwgaGFsZldpZHRoICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGZpcnN0SGludEVkZ2UtPmRzQ29vcmQgPSBjZjJfaGludG1hcF9tYXAoIGhpbnRtYXAtPmluaXRpYWxIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEhpbnRFZGdlLT5jc0Nvb3JkICk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEaXNjYXJkIGFueSBoaW50cyB0aGF0IG92ZXJsYXAgaW4gZGV2aWNlIHNwYWNlOyB0aGlzIGNhbiBvY2N1cgotICAgICAqIGJlY2F1c2UgbG9ja2VkIGhpbnRzIGhhdmUgYmVlbiBtb3ZlZCB0byBhbGlnbiB3aXRoIGJsdWUgem9uZXMuCi0gICAgICoKLSAgICAgKiBUT0RPOiBBbHRob3VnaCB3ZSBtaWdodCBjb3JyZWN0IHRoaXMgbGF0ZXIgZHVyaW5nIGFkanVzdG1lbnQsIHdlCi0gICAgICogZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gZGVsZXRlIGEgY29uZmxpY3RpbmcgaGludCBvbmNlIGl0IGhhcwotICAgICAqIGJlZW4gaW5zZXJ0ZWQuICBTZWUgdjIuMDMwIE1pbmlvblByby1SZWd1bGFyLCAxMiBwcGVtIGRhcmtlbmVkLAotICAgICAqIGluaXRpYWwgaGludCBtYXAgZm9yIHNlY29uZCBwYXRoLCBnbHlwaCA5NDUgKHRoZSBwZXJpc3BvbWVuaSAodGlsZGUpCi0gICAgICogaW4gVSsxRjZFLCBHcmVlayBvbWVnYSB3aXRoIHBzaWxpIGFuZCBwZXJpc3BvbWVuaSkuICBEYXJrZW5pbmcgaXMKLSAgICAgKiAyNS4gIFBhaXIgNjY3LDc0NyBpbml0aWFsbHkgY29uZmxpY3RzIGluIGRlc2lnbiBzcGFjZSB3aXRoIHRvcCBlZGdlCi0gICAgICogNjYwLiAgVGhpcyBpcyBiZWNhdXNlIDY2NyBtYXBzIHRvIDcuODcsIGFuZCB0aGUgdG9wIGVkZ2Ugd2FzCi0gICAgICogY2FwdHVyZWQgYnkgYSB6b25lIGF0IDguMC4gIFRoZSBwYWlyIGlzIGxhdGVyIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZAotICAgICAqIGluIGEgem9uZSB3aXRob3V0IHRoZSB0b3AgZWRnZS4gIEluIHRoaXMgem9uZSBpdCBpcyBhZGp1c3RlZCB0byA4LjAsCi0gICAgICogYW5kIG5vIGxvbmdlciBjb25mbGljdHMgd2l0aCB0aGUgdG9wIGVkZ2UgaW4gZGVzaWduIHNwYWNlLiAgVGhpcwotICAgICAqIG1lYW5zIGl0IGNhbiBiZSBpbmNsdWRlZCBpbiB5ZXQgYSBsYXRlciB6b25lIHdoaWNoIGRvZXMgaGF2ZSB0aGUgdG9wCi0gICAgICogZWRnZSBoaW50LiAgVGhpcyBwcm9kdWNlcyBhIHNtYWxsIG1pc21hdGNoIGJldHdlZW4gdGhlIGZpcnN0IGFuZAotICAgICAqIGxhc3QgcG9pbnRzIG9mIHRoaXMgcGF0aCwgZXZlbiB0aG91Z2ggdGhlIGhpbnQgbWFza3MgYXJlIHRoZSBzYW1lLgotICAgICAqIFRoZSBkZW5zaXR5IG1hcCBkaWZmZXJlbmNlIGlzIHRpbnkgKDEvMjU2KS4KLSAgICAgKgotICAgICAqLwotCi0gICAgaWYgKCBpbmRleEluc2VydCA+IDAgKQotICAgIHsKLSAgICAgIC8qIHdlIGFyZSBpbnNlcnRpbmcgYWZ0ZXIgYW4gZXhpc3RpbmcgZWRnZSAqLwotICAgICAgaWYgKCBmaXJzdEhpbnRFZGdlLT5kc0Nvb3JkIDwgaGludG1hcC0+ZWRnZVtpbmRleEluc2VydCAtIDFdLmRzQ29vcmQgKQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBpbmRleEluc2VydCA8IGhpbnRtYXAtPmNvdW50ICkKLSAgICB7Ci0gICAgICAvKiB3ZSBhcmUgaW5zZXJ0aW5nIGJlZm9yZSBhbiBleGlzdGluZyBlZGdlICovCi0gICAgICBpZiAoIGlzUGFpciApCi0gICAgICB7Ci0gICAgICAgIGlmICggc2Vjb25kSGludEVkZ2UtPmRzQ29vcmQgPiBoaW50bWFwLT5lZGdlW2luZGV4SW5zZXJ0XS5kc0Nvb3JkICkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggZmlyc3RIaW50RWRnZS0+ZHNDb29yZCA+IGhpbnRtYXAtPmVkZ2VbaW5kZXhJbnNlcnRdLmRzQ29vcmQgKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBtYWtlIHJvb20gdG8gaW5zZXJ0ICovCi0gICAgewotICAgICAgQ0YyX1VJbnQgIGlTcmMgPSBoaW50bWFwLT5jb3VudCAtIDE7Ci0gICAgICBDRjJfVUludCAgaURzdCA9IGlzUGFpciA/IGhpbnRtYXAtPmNvdW50ICsgMSA6IGhpbnRtYXAtPmNvdW50OwotCi0gICAgICBDRjJfVUludCAgY291bnQgPSBoaW50bWFwLT5jb3VudCAtIGluZGV4SW5zZXJ0OwotCi0KLSAgICAgIGlmICggaURzdCA+PSBDRjJfTUFYX0hJTlRfRURHRVMgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiY2YyX2hpbnRtYXBfaW5zZXJ0SGludDogdG9vIG1hbnkgaGludG1hcHNcbiIgKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgd2hpbGUgKCBjb3VudC0tICkKLSAgICAgICAgaGludG1hcC0+ZWRnZVtpRHN0LS1dID0gaGludG1hcC0+ZWRnZVtpU3JjLS1dOwotCi0gICAgICAvKiBpbnNlcnQgZmlyc3QgZWRnZSAqLwotICAgICAgaGludG1hcC0+ZWRnZVtpbmRleEluc2VydF0gPSAqZmlyc3RIaW50RWRnZTsgICAgICAgICAvKiBjb3B5IHN0cnVjdCAqLwotICAgICAgaGludG1hcC0+Y291bnQgICAgICAgICAgICArPSAxOwotCi0gICAgICBpZiAoIGlzUGFpciApCi0gICAgICB7Ci0gICAgICAgIC8qIGluc2VydCBzZWNvbmQgZWRnZSAqLwotICAgICAgICBoaW50bWFwLT5lZGdlW2luZGV4SW5zZXJ0ICsgMV0gPSAqc2Vjb25kSGludEVkZ2U7ICAvKiBjb3B5IHN0cnVjdCAqLwotICAgICAgICBoaW50bWFwLT5jb3VudCAgICAgICAgICAgICAgICArPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotCi0KLSAgLyoKLSAgICogQnVpbGQgYSBtYXAgZnJvbSBoaW50cyBhbmQgbWFzay4KLSAgICoKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgcmVjdXIgb25lIGxldmVsIGlmIGBoaW50bWFwLT5pbml0aWFsSGludE1hcCcgaXMgbm90IHlldAotICAgKiB2YWxpZC4KLSAgICogSWYgYGluaXRpYWxNYXAnIGlzIHRydWUsIHNpbXBseSBidWlsZCBpbml0aWFsIG1hcC4KLSAgICoKLSAgICogU3ludGhldGljIGhpbnRzIGFyZSB1c2VkIGluIHR3byB3YXlzLiAgQSBoaW50IGF0IHplcm8gaXMgaW5zZXJ0ZWQsIGlmCi0gICAqIG5lZWRlZCwgaW4gdGhlIGluaXRpYWwgaGludCBtYXAsIHRvIHByZXZlbnQgdHJhbnNsYXRpb25zIGZyb20KLSAgICogcHJvcGFnYXRpbmcgYWNyb3NzIHRoZSBvcmlnaW4uICBJZiBzeW50aGV0aWMgZW0gYm94IGhpbnRzIGFyZSBlbmFibGVkCi0gICAqIGZvciBpZGVvZ3JhcGhpYyBkaWN0aW9uYXJpZXMsIHRoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW4gYWxsIGhpbnQKLSAgICogbWFwcywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIG9uZS4KLSAgICoKLSAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9oaW50bWFwX2J1aWxkKCBDRjJfSGludE1hcCAgIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICBDRjJfQXJyU3RhY2sgIGhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICB2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9IaW50TWFzayAgaGludE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgIGhpbnRPcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgIGluaXRpYWxNYXAgKQotICB7Ci0gICAgRlRfQnl0ZSogIG1hc2tQdHI7Ci0KLSAgICBDRjJfRm9udCAgICAgICAgIGZvbnQgPSBoaW50bWFwLT5mb250OwotICAgIENGMl9IaW50TWFza1JlYyAgdGVtcEhpbnRNYXNrOwotCi0gICAgc2l6ZV90ICAgYml0Q291bnQsIGk7Ci0gICAgRlRfQnl0ZSAgbWFza0J5dGU7Ci0KLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgaW5pdGlhbCBtYXAgaXMgY29uc3RydWN0ZWQgKi8KLSAgICBpZiAoICFpbml0aWFsTWFwICYmICFjZjJfaGludG1hcF9pc1ZhbGlkKCBoaW50bWFwLT5pbml0aWFsSGludE1hcCApICkKLSAgICB7Ci0gICAgICAvKiBtYWtlIHJlY3Vyc2l2ZSBjYWxsIHdpdGggaW5pdGlhbEhpbnRNYXAgYW5kIHRlbXBvcmFyeSBtYXNrOyAqLwotICAgICAgLyogdGVtcG9yYXJ5IG1hc2sgd2lsbCBnZXQgYWxsIGJpdHMgc2V0LCBiZWxvdyAqLwotICAgICAgY2YyX2hpbnRtYXNrX2luaXQoICZ0ZW1wSGludE1hc2ssIGhpbnRNYXNrLT5lcnJvciApOwotICAgICAgY2YyX2hpbnRtYXBfYnVpbGQoIGhpbnRtYXAtPmluaXRpYWxIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHZTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wSGludE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGludE9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICk7Ci0gICAgfQotCi0gICAgaWYgKCAhY2YyX2hpbnRtYXNrX2lzVmFsaWQoIGhpbnRNYXNrICkgKQotICAgIHsKLSAgICAgIC8qIHdpdGhvdXQgYSBoaW50IG1hc2ssIGFzc3VtZSBhbGwgaGludHMgYXJlIGFjdGl2ZSAqLwotICAgICAgY2YyX2hpbnRtYXNrX3NldEFsbCggaGludE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfYXJyc3RhY2tfc2l6ZSggaFN0ZW1IaW50QXJyYXkgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9hcnJzdGFja19zaXplKCB2U3RlbUhpbnRBcnJheSApICk7Ci0gICAgICBpZiAoICFjZjJfaGludG1hc2tfaXNWYWxpZCggaGludE1hc2sgKSApCi0gICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgLyogdG9vIG1hbnkgc3RlbSBoaW50cyAqLwotICAgIH0KLQotICAgIC8qIGJlZ2luIGJ5IGNsZWFyaW5nIHRoZSBtYXAgKi8KLSAgICBoaW50bWFwLT5jb3VudCAgICAgPSAwOwotICAgIGhpbnRtYXAtPmxhc3RJbmRleCA9IDA7Ci0KLSAgICAvKiBtYWtlIGEgY29weSBvZiB0aGUgaGludCBtYXNrIHNvIHdlIGNhbiBtb2RpZnkgaXQgKi8KLSAgICB0ZW1wSGludE1hc2sgPSAqaGludE1hc2s7Ci0gICAgbWFza1B0ciAgICAgID0gY2YyX2hpbnRtYXNrX2dldE1hc2tQdHIoICZ0ZW1wSGludE1hc2sgKTsKLQotICAgIC8qIHVzZSB0aGUgaFN0ZW0gaGludHMgb25seSwgd2hpY2ggYXJlIGZpcnN0IGluIHRoZSBtYXNrICovCi0gICAgYml0Q291bnQgPSBjZjJfYXJyc3RhY2tfc2l6ZSggaFN0ZW1IaW50QXJyYXkgKTsKLQotICAgIC8qIERlZmVuc2UtaW4tZGVwdGguICBTaG91bGQgbmV2ZXIgcmV0dXJuIGhlcmUuICovCi0gICAgaWYgKCBiaXRDb3VudCA+IGhpbnRNYXNrLT5iaXRDb3VudCApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBzeW50aGV0aWMgZW1ib3ggaGludHMgZ2V0IGhpZ2hlc3QgcHJpb3JpdHkgKi8KLSAgICBpZiAoIGZvbnQtPmJsdWVzLmRvRW1Cb3hIaW50cyApCi0gICAgewotICAgICAgQ0YyX0hpbnRSZWMgIGR1bW15OwotCi0KLSAgICAgIGNmMl9oaW50X2luaXRaZXJvKCAmZHVtbXkgKTsgICAvKiBpbnZhbGlkIGhpbnQgbWFwIGVsZW1lbnQgKi8KLQotICAgICAgLyogZ2hvc3QgYm90dG9tICovCi0gICAgICBjZjJfaGludG1hcF9pbnNlcnRIaW50KCBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmJsdWVzLmVtQm94Qm90dG9tRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teSApOwotICAgICAgLyogZ2hvc3QgdG9wICovCi0gICAgICBjZjJfaGludG1hcF9pbnNlcnRIaW50KCBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmJsdWVzLmVtQm94VG9wRWRnZSApOwotICAgIH0KLQotICAgIC8qIGluc2VydCBoaW50cyBjYXB0dXJlZCBieSBhIGJsdWUgem9uZSBvciBhbHJlYWR5IGxvY2tlZCAoaGlnaGVyICovCi0gICAgLyogcHJpb3JpdHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmb3IgKCBpID0gMCwgbWFza0J5dGUgPSAweDgwOyBpIDwgYml0Q291bnQ7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBtYXNrQnl0ZSAmICptYXNrUHRyICkKLSAgICAgIHsKLSAgICAgICAgLyogZXhwYW5kIFN0ZW1IaW50IGludG8gdHdvIGBDRjJfSGludCcgZWxlbWVudHMgKi8KLSAgICAgICAgQ0YyX0hpbnRSZWMgIGJvdHRvbUhpbnRFZGdlLCB0b3BIaW50RWRnZTsKLQotCi0gICAgICAgIGNmMl9oaW50X2luaXQoICZib3R0b21IaW50RWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhpbnRPcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICBUUlVFIC8qIGJvdHRvbSAqLyApOwotICAgICAgICBjZjJfaGludF9pbml0KCAmdG9wSGludEVkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICBoaW50T3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLT5zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgLyogdG9wICovICk7Ci0KLSAgICAgICAgaWYgKCBjZjJfaGludF9pc0xvY2tlZCggJmJvdHRvbUhpbnRFZGdlICkgfHwKLSAgICAgICAgICAgICBjZjJfaGludF9pc0xvY2tlZCggJnRvcEhpbnRFZGdlICkgICAgfHwKLSAgICAgICAgICAgICBjZjJfYmx1ZXNfY2FwdHVyZSggJmZvbnQtPmJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tSGludEVkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3BIaW50RWRnZSApICAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogaW5zZXJ0IGNhcHR1cmVkIGhpbnQgaW50byBtYXAgKi8KLSAgICAgICAgICBjZjJfaGludG1hcF9pbnNlcnRIaW50KCBoaW50bWFwLCAmYm90dG9tSGludEVkZ2UsICZ0b3BIaW50RWRnZSApOwotCi0gICAgICAgICAgKm1hc2tQdHIgJj0gfm1hc2tCeXRlOyAgICAgIC8qIHR1cm4gb2ZmIHRoZSBiaXQgZm9yIHRoaXMgaGludCAqLwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggKCBpICYgNyApID09IDcgKQotICAgICAgewotICAgICAgICAvKiBtb3ZlIHRvIG5leHQgbWFzayBieXRlICovCi0gICAgICAgIG1hc2tQdHIrKzsKLSAgICAgICAgbWFza0J5dGUgPSAweDgwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBtYXNrQnl0ZSA+Pj0gMTsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsIGhpbnQgbWFwIGluY2x1ZGVzIG9ubHkgY2FwdHVyZWQgaGludHMgcGx1cyBtYXliZSBvbmUgYXQgMCAqLwotCi0gICAgLyoKLSAgICAgKiBUT0RPOiBUaGVyZSBpcyBhIHByb2JsZW0gaGVyZSBiZWNhdXNlIHdlIGFyZSB0cnlpbmcgdG8gYnVpbGQgYQotICAgICAqICAgICAgIHNpbmdsZSBoaW50IG1hcCBjb250YWluaW5nIGFsbCBjYXB0dXJlZCBoaW50cy4gIEl0IGlzCi0gICAgICogICAgICAgcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIGNvbmZsaWN0cyBiZXR3ZWVuIGNhcHR1cmVkIGhpbnRzLAotICAgICAqICAgICAgIGVpdGhlciBiZWNhdXNlIG9mIGRhcmtlbmluZyBvciBiZWNhdXNlIHRoZSBoaW50cyBhcmUgaW4KLSAgICAgKiAgICAgICBzZXBhcmF0ZSBoaW50IHpvbmVzICh3ZSBhcmUgaWdub3JpbmcgaGludCB6b25lcyBmb3IgdGhlCi0gICAgICogICAgICAgaW5pdGlhbCBtYXApLiAgQW4gZXhhbXBsZSBvZiB0aGUgbGF0dGVyIGlzIE1pbmlvblByby1SZWd1bGFyCi0gICAgICogICAgICAgdjIuMDMwIGdseXBoIDg4MyAoR3JlZWsgQ2FwaXRhbCBBbHBoYSB3aXRoIFBzaWxpKSBhdCAxNXBwZW0uCi0gICAgICogICAgICAgQSBzdGVtIGhpbnQgZm9yIHRoZSBwc2lsaSBjb25mbGljdHMgd2l0aCB0aGUgdG9wIGVkZ2UgaGludAotICAgICAqICAgICAgIGZvciB0aGUgYmFzZSBjaGFyYWN0ZXIuICBUaGUgc3RlbSBoaW50IGdldHMgcHJpb3JpdHkgYmVjYXVzZQotICAgICAqICAgICAgIG9mIGl0cyBzb3J0IG9yZGVyLiAgSW4gZ2x5cGggODg0IChHcmVlayBDYXBpdGFsIEFscGhhIHdpdGgKLSAgICAgKiAgICAgICBQc2lsaSBhbmQgT3hpYSksIHRoZSB0b3Agb2YgdGhlIGJhc2UgY2hhcmFjdGVyIGdldHMgYSBzdGVtCi0gICAgICogICAgICAgaGludCwgYW5kIHRoZSBwc2lsaSBkb2VzIG5vdC4gIFRoaXMgY3JlYXRlcyBkaWZmZXJlbnQgaW5pdGlhbAotICAgICAqICAgICAgIG1hcHMgZm9yIHRoZSB0d28gZ2x5cGhzIHJlc3VsdGluZyBpbiBkaWZmZXJlbnQgcmVuZGVyaW5ncyBvZgotICAgICAqICAgICAgIHRoZSBiYXNlIGNoYXJhY3Rlci4gIFdpbGwgcHJvYmFibHkgZGVmZXIgdGhpcyBlaXRoZXIgYXMgbm90Ci0gICAgICogICAgICAgd29ydGggdGhlIGNvc3Qgb3IgYXMgYSBmb250IGJ1Zy4gIEkgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYW55Ci0gICAgICogICAgICAgZ29vZCByZWFzb24gZm9yIGFuIGFjY2VudCB0byBiZSBjYXB0dXJlZCBieSBhbiBhbGlnbm1lbnQKLSAgICAgKiAgICAgICB6b25lLiAgLWRhcm5vbGQgMi8xMi8xMAotICAgICAqLwotCi0gICAgaWYgKCBpbml0aWFsTWFwICkKLSAgICB7Ci0gICAgICAvKiBBcHBseSBhIGhldXJpc3RpYyB0aGF0IGluc2VydHMgYSBwb2ludCBmb3IgKDAsMCksIHVubGVzcyBpdCdzICAgICAqLwotICAgICAgLyogYWxyZWFkeSBjb3ZlcmVkIGJ5IGEgbWFwcGluZy4gIFRoaXMgbG9ja3MgdGhlIGJhc2VsaW5lIGZvciBnbHlwaHMgKi8KLSAgICAgIC8qIHRoYXQgaGF2ZSBubyBiYXNlbGluZSBoaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGlmICggaGludG1hcC0+Y291bnQgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbMF0uY3NDb29yZCA+IDAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBoaW50bWFwLT5lZGdlW2hpbnRtYXAtPmNvdW50IC0gMV0uY3NDb29yZCA8IDAgKQotICAgICAgewotICAgICAgICAvKiBhbGwgZWRnZXMgYXJlIGFib3ZlIDAgb3IgYWxsIGVkZ2VzIGFyZSBiZWxvdyAwOyAqLwotICAgICAgICAvKiBjb25zdHJ1Y3QgYSBsb2NrZWQgZWRnZSBoaW50IGF0IDAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIENGMl9IaW50UmVjICBlZGdlLCBpbnZhbGlkOwotCi0KLSAgICAgICAgY2YyX2hpbnRfaW5pdFplcm8oICZlZGdlICk7Ci0KLSAgICAgICAgZWRnZS5mbGFncyA9IENGMl9HaG9zdEJvdHRvbSB8Ci0gICAgICAgICAgICAgICAgICAgICBDRjJfTG9ja2VkICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgQ0YyX1N5bnRoZXRpYzsKLSAgICAgICAgZWRnZS5zY2FsZSA9IGhpbnRtYXAtPnNjYWxlOwotCi0gICAgICAgIGNmMl9oaW50X2luaXRaZXJvKCAmaW52YWxpZCApOwotICAgICAgICBjZjJfaGludG1hcF9pbnNlcnRIaW50KCBoaW50bWFwLCAmZWRnZSwgJmludmFsaWQgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGluc2VydCByZW1haW5pbmcgaGludHMgKi8KLQotICAgICAgbWFza1B0ciA9IGNmMl9oaW50bWFza19nZXRNYXNrUHRyKCAmdGVtcEhpbnRNYXNrICk7Ci0KLSAgICAgIGZvciAoIGkgPSAwLCBtYXNrQnl0ZSA9IDB4ODA7IGkgPCBiaXRDb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBtYXNrQnl0ZSAmICptYXNrUHRyICkKLSAgICAgICAgewotICAgICAgICAgIENGMl9IaW50UmVjICBib3R0b21IaW50RWRnZSwgdG9wSGludEVkZ2U7Ci0KLQotICAgICAgICAgIGNmMl9oaW50X2luaXQoICZib3R0b21IaW50RWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGludE9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLT5zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIC8qIGJvdHRvbSAqLyApOwotICAgICAgICAgIGNmMl9oaW50X2luaXQoICZ0b3BIaW50RWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGludE9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLT5zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSAvKiB0b3AgKi8gKTsKLQotICAgICAgICAgIGNmMl9oaW50bWFwX2luc2VydEhpbnQoIGhpbnRtYXAsICZib3R0b21IaW50RWRnZSwgJnRvcEhpbnRFZGdlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICggaSAmIDcgKSA9PSA3ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIG1vdmUgdG8gbmV4dCBtYXNrIGJ5dGUgKi8KLSAgICAgICAgICBtYXNrUHRyKys7Ci0gICAgICAgICAgbWFza0J5dGUgPSAweDgwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtYXNrQnl0ZSA+Pj0gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE5vdGU6IFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gYnJlYWsgd2hlbgotICAgICAqICAgICAgIGRlYnVnZ2luZyBoaW50aW5nLiAgRXhhbWluZSBgaGludG1hcC0+ZWRnZScgZm9yIHRoZSBsaXN0IG9mCi0gICAgICogICAgICAgZW5hYmxlZCBoaW50cywgdGhlbiBzdGVwIG92ZXIgdGhlIGNhbGwgdG8gc2VlIHRoZSBlZmZlY3Qgb2YKLSAgICAgKiAgICAgICBhZGp1c3RtZW50LiAgV2Ugc3RvcCBoZXJlIGZpcnN0IG9uIHRoZSByZWN1cnNpdmUgY2FsbCB0aGF0Ci0gICAgICogICAgICAgY3JlYXRlcyB0aGUgaW5pdGlhbCBtYXAsIGFuZCB0aGVuIG9uIGVhY2ggY291bnRlciBncm91cCBhbmQKLSAgICAgKiAgICAgICBoaW50IHpvbmUuCi0gICAgICovCi0KLSAgICAvKiBhZGp1c3QgcG9zaXRpb25zIG9mIGhpbnQgZWRnZXMgdGhhdCBhcmUgbm90IGxvY2tlZCB0byBibHVlIHpvbmVzICovCi0gICAgY2YyX2hpbnRtYXBfYWRqdXN0SGludHMoIGhpbnRtYXAgKTsKLQotICAgIC8qIHNhdmUgdGhlIHBvc2l0aW9uIG9mIGFsbCBoaW50cyB0aGF0IHdlcmUgdXNlZCBpbiB0aGlzIGhpbnQgbWFwOyAqLwotICAgIC8qIGlmIHdlIHVzZSB0aGVtIGFnYWluLCB3ZSdsbCBsb2NhdGUgdGhlbSBpbiB0aGUgc2FtZSBwb3NpdGlvbiAgICAqLwotICAgIGlmICggIWluaXRpYWxNYXAgKQotICAgIHsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgaGludG1hcC0+Y291bnQ7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggIWNmMl9oaW50X2lzU3ludGhldGljKCAmaGludG1hcC0+ZWRnZVtpXSApICkKLSAgICAgICAgewotICAgICAgICAgIC8qIE5vdGU6IGluY2x1ZGUgYm90aCB2YWxpZCBhbmQgaW52YWxpZCBlZGdlcyAgICAgICAgICAgICovCi0gICAgICAgICAgLyogTm90ZTogdG9wIGFuZCBib3R0b20gZWRnZXMgYXJlIGNvcGllZCBiYWNrIHNlcGFyYXRlbHkgKi8KLSAgICAgICAgICBDRjJfU3RlbUhpbnQgIHN0ZW1oaW50ID0gKENGMl9TdGVtSGludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoIGhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtpXS5pbmRleCApOwotCi0KLSAgICAgICAgICBpZiAoIGNmMl9oaW50X2lzVG9wKCAmaGludG1hcC0+ZWRnZVtpXSApICkKLSAgICAgICAgICAgIHN0ZW1oaW50LT5tYXhEUyA9IGhpbnRtYXAtPmVkZ2VbaV0uZHNDb29yZDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGVtaGludC0+bWluRFMgPSBoaW50bWFwLT5lZGdlW2ldLmRzQ29vcmQ7Ci0KLSAgICAgICAgICBzdGVtaGludC0+dXNlZCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBoaW50IG1hcCBpcyByZWFkeSB0byB1c2UgKi8KLSAgICBoaW50bWFwLT5pc1ZhbGlkID0gVFJVRTsKLQotICAgIC8qIHJlbWVtYmVyIHRoaXMgbWFzayBoYXMgYmVlbiB1c2VkICovCi0gICAgY2YyX2hpbnRtYXNrX3NldE5ldyggaGludE1hc2ssIEZBTFNFICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfaW5pdCggQ0YyX0dseXBoUGF0aCAgICAgICAgIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRm9udCAgICAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfT3V0bGluZUNhbGxiYWNrcyAgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgICAgICAgICBzY2FsZVksCi0gICAgICAgICAgICAgICAgICAgICAgLyogQ0YyX0ZpeGVkICBoU2hpZnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICAgICAgICAgIGhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgIENGMl9BcnJTdGFjayAgICAgICAgICB2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfSGludE1hc2sgICAgICAgICAgaGludE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgICAgICAgIGhpbnRPcmlnaW5ZLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGMl9CbHVlcyAgICAgICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICAgICAgZnJhY3Rpb25hbFRyYW5zbGF0aW9uICkKLSAgewotICAgIEZUX1pFUk8oIGdseXBocGF0aCApOwotCi0gICAgZ2x5cGhwYXRoLT5mb250ICAgICAgPSBmb250OwotICAgIGdseXBocGF0aC0+Y2FsbGJhY2tzID0gY2FsbGJhY2tzOwotCi0gICAgY2YyX2FycnN0YWNrX2luaXQoICZnbHlwaHBhdGgtPmhpbnRNb3ZlcywKLSAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+bWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+ZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIENGMl9IaW50TW92ZVJlYyApICk7Ci0KLSAgICBjZjJfaGludG1hcF9pbml0KCAmZ2x5cGhwYXRoLT5pbml0aWFsSGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmluaXRpYWxIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmhpbnRNb3ZlcywKLSAgICAgICAgICAgICAgICAgICAgICBzY2FsZVkgKTsKLSAgICBjZjJfaGludG1hcF9pbml0KCAmZ2x5cGhwYXRoLT5maXJzdEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5pbml0aWFsSGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5oaW50TW92ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgc2NhbGVZICk7Ci0gICAgY2YyX2hpbnRtYXBfaW5pdCggJmdseXBocGF0aC0+aGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmluaXRpYWxIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmhpbnRNb3ZlcywKLSAgICAgICAgICAgICAgICAgICAgICBzY2FsZVkgKTsKLQotICAgIGdseXBocGF0aC0+c2NhbGVYID0gZm9udC0+aW5uZXJUcmFuc2Zvcm0uYTsKLSAgICBnbHlwaHBhdGgtPnNjYWxlQyA9IGZvbnQtPmlubmVyVHJhbnNmb3JtLmM7Ci0gICAgZ2x5cGhwYXRoLT5zY2FsZVkgPSBmb250LT5pbm5lclRyYW5zZm9ybS5kOwotCi0gICAgZ2x5cGhwYXRoLT5mcmFjdGlvbmFsVHJhbnNsYXRpb24gPSAqZnJhY3Rpb25hbFRyYW5zbGF0aW9uOwotCi0jaWYgMAotICAgIGdseXBocGF0aC0+aFNoaWZ0ID0gaFNoaWZ0OyAgICAgICAvKiBmb3IgZmF1eGluZyAqLwotI2VuZGlmCi0KLSAgICBnbHlwaHBhdGgtPmhTdGVtSGludEFycmF5ID0gaFN0ZW1IaW50QXJyYXk7Ci0gICAgZ2x5cGhwYXRoLT52U3RlbUhpbnRBcnJheSA9IHZTdGVtSGludEFycmF5OwotICAgIGdseXBocGF0aC0+aGludE1hc2sgICAgICAgPSBoaW50TWFzazsgICAgICAvKiBwdHIgdG8gY3VycmVudCBtYXNrICovCi0gICAgZ2x5cGhwYXRoLT5oaW50T3JpZ2luWSAgICA9IGhpbnRPcmlnaW5ZOwotICAgIGdseXBocGF0aC0+Ymx1ZXMgICAgICAgICAgPSBibHVlczsKLSAgICBnbHlwaHBhdGgtPmRhcmtlbiAgICAgICAgID0gZm9udC0+ZGFya2VuZWQ7IC8qIFRPRE86IHNob3VsZCB3ZSBtYWtlIGNvcGllcz8gKi8KLSAgICBnbHlwaHBhdGgtPnhPZmZzZXQgICAgICAgID0gZm9udC0+ZGFya2VuWDsKLSAgICBnbHlwaHBhdGgtPnlPZmZzZXQgICAgICAgID0gZm9udC0+ZGFya2VuWTsKLSAgICBnbHlwaHBhdGgtPm1pdGVyTGltaXQgICAgID0gMiAqIEZUX01BWCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfZml4ZWRBYnMoIGdseXBocGF0aC0+eE9mZnNldCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9maXhlZEFicyggZ2x5cGhwYXRoLT55T2Zmc2V0ICkgKTsKLQotICAgIC8qIC4xIGNoYXJhY3RlciBzcGFjZSB1bml0ICovCi0gICAgZ2x5cGhwYXRoLT5zbmFwVGhyZXNob2xkID0gY2YyX2RvdWJsZVRvRml4ZWQoIDAuMSApOwotCi0gICAgZ2x5cGhwYXRoLT5tb3ZlSXNQZW5kaW5nID0gVFJVRTsKLSAgICBnbHlwaHBhdGgtPnBhdGhJc09wZW4gICAgPSBGQUxTRTsKLSAgICBnbHlwaHBhdGgtPnBhdGhJc0Nsb3NpbmcgPSBGQUxTRTsKLSAgICBnbHlwaHBhdGgtPmVsZW1Jc1F1ZXVlZCAgPSBGQUxTRTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2dseXBocGF0aF9maW5hbGl6ZSggQ0YyX0dseXBoUGF0aCAgZ2x5cGhwYXRoICkKLSAgewotICAgIGNmMl9hcnJzdGFja19maW5hbGl6ZSggJmdseXBocGF0aC0+aGludE1vdmVzICk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIEhpbnQgcG9pbnQgaW4geS1kaXJlY3Rpb24gYW5kIGFwcGx5IG91dGVyVHJhbnNmb3JtLgotICAgKiBJbnB1dCBgY3VycmVudCcgaGludCBtYXAgKHdoaWNoIGlzIGFjdHVhbGx5IGRlbGF5ZWQgYnkgb25lIGVsZW1lbnQpLgotICAgKiBJbnB1dCB4LHkgcG9pbnQgaW4gQ2hhcmFjdGVyIFNwYWNlLgotICAgKiBPdXRwdXQgeCx5IHBvaW50IGluIERldmljZSBTcGFjZSwgaW5jbHVkaW5nIHRyYW5zbGF0aW9uLgotICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2dseXBocGF0aF9oaW50UG9pbnQoIENGMl9HbHlwaFBhdGggIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9IaW50TWFwICAgIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICBwcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeSApCi0gIHsKLSAgICBGVF9WZWN0b3IgIHB0OyAgIC8qIGhpbnRlZCBwb2ludCBpbiB1cHJpZ2h0IERTICovCi0KLQotICAgIHB0LnggPSBBRERfSU5UMzIoIEZUX011bEZpeCggZ2x5cGhwYXRoLT5zY2FsZVgsIHggKSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGdseXBocGF0aC0+c2NhbGVDLCB5ICkgKTsKLSAgICBwdC55ID0gY2YyX2hpbnRtYXBfbWFwKCBoaW50bWFwLCB5ICk7Ci0KLSAgICBwcHQtPnggPSBBRERfSU5UMzIoCi0gICAgICAgICAgICAgICBGVF9NdWxGaXgoIGdseXBocGF0aC0+Zm9udC0+b3V0ZXJUcmFuc2Zvcm0uYSwgcHQueCApLAotICAgICAgICAgICAgICAgQUREX0lOVDMyKAotICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGdseXBocGF0aC0+Zm9udC0+b3V0ZXJUcmFuc2Zvcm0uYywgcHQueSApLAotICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmZyYWN0aW9uYWxUcmFuc2xhdGlvbi54ICkgKTsKLSAgICBwcHQtPnkgPSBBRERfSU5UMzIoCi0gICAgICAgICAgICAgICBGVF9NdWxGaXgoIGdseXBocGF0aC0+Zm9udC0+b3V0ZXJUcmFuc2Zvcm0uYiwgcHQueCApLAotICAgICAgICAgICAgICAgQUREX0lOVDMyKAotICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGdseXBocGF0aC0+Zm9udC0+b3V0ZXJUcmFuc2Zvcm0uZCwgcHQueSApLAotICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmZyYWN0aW9uYWxUcmFuc2xhdGlvbi55ICkgKTsKLSAgfQotCi0KLSAgLyoKLSAgICogRnJvbSB0d28gbGluZSBzZWdtZW50cywgKHUxLHUyKSBhbmQgKHYxLHYyKSwgY29tcHV0ZSBhIHBvaW50IG9mCi0gICAqIGludGVyc2VjdGlvbiBvbiB0aGUgY29ycmVzcG9uZGluZyBsaW5lcy4KLSAgICogUmV0dXJuIGZhbHNlIGlmIG5vIGludGVyc2VjdGlvbiBpcyBmb3VuZCwgb3IgaWYgdGhlIGludGVyc2VjdGlvbiBpcwotICAgKiB0b28gZmFyIGF3YXkgZnJvbSB0aGUgZW5kcyBvZiB0aGUgbGluZSBzZWdtZW50cywgdTIgYW5kIHYxLgotICAgKgotICAgKi8KLSAgc3RhdGljIEZUX0Jvb2wKLSAgY2YyX2dseXBocGF0aF9jb21wdXRlSW50ZXJzZWN0aW9uKCBDRjJfR2x5cGhQYXRoICAgICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICAgaW50ZXJzZWN0aW9uICkKLSAgewotICAgIC8qCi0gICAgICogTGV0IGB1JyBiZSBhIHplcm8tYmFzZWQgdmVjdG9yIGZyb20gdGhlIGZpcnN0IHNlZ21lbnQsIGB2JyBmcm9tIHRoZQotICAgICAqIHNlY29uZCBzZWdtZW50LgotICAgICAqIExldCBgdyAnYmUgdGhlIHplcm8tYmFzZWQgdmVjdG9yIGZyb20gYHUxJyB0byBgdjEnLgotICAgICAqIGBwZXJwJyBpcyB0aGUgYHBlcnBlbmRpY3VsYXIgZG90IHByb2R1Y3QnOyBzZWUKLSAgICAgKiBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL1BlcnBEb3RQcm9kdWN0Lmh0bWwuCi0gICAgICogYHMnIGlzIHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBwYXJhbWV0cmljIGxpbmUgZm9yIHRoZSBmaXJzdCBzZWdtZW50Ci0gICAgICogKGB1JykuCi0gICAgICoKLSAgICAgKiBTZWUgbm90YXRpb24gaW4KLSAgICAgKiBodHRwOi8vc29mdHN1cmZlci5jb20vQXJjaGl2ZS9hbGdvcml0aG1fMDEwNC9hbGdvcml0aG1fMDEwNEIuaHRtLgotICAgICAqIENhbGN1bGF0aW9ucyBhcmUgZG9uZSBpbiAxNi4xNiwgYnV0IG11c3QgaGFuZGxlIHRoZSBzcXVhcmluZyBvZgotICAgICAqIGxpbmUgbGVuZ3RocyBpbiBjaGFyYWN0ZXIgc3BhY2UuICBXZSBzY2FsZSBhbGwgdmVjdG9ycyBieSAxLzMyIHRvCi0gICAgICogYXZvaWQgb3ZlcmZsb3cuICBUaGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8gNDA5NSB0byBiZSBzcXVhcmVkLiAgVGhlCi0gICAgICogc2NhbGUgZmFjdG9yIGNhbmNlbHMgaW4gdGhlIGRpdmlkZS4KLSAgICAgKgotICAgICAqIFRPRE86IHRoZSBzY2FsZSBmYWN0b3IgY291bGQgYmUgY29tcHV0ZWQgZnJvbSBVbml0c1BlckVtLgotICAgICAqCi0gICAgICovCi0KLSNkZWZpbmUgY2YyX3BlcnAoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEZUX011bEZpeCggYS54LCBiLnkgKSAtIEZUX011bEZpeCggYS55LCBiLnggKSApCi0KLSAgLyogcm91bmQgYW5kIGRpdmlkZSBieSAzMiAqLwotI2RlZmluZSBDRjJfQ1NfU0NBTEUoIHggKSAgICAgICAgIFwKLSAgICAgICAgICAoICggKHgpICsgMHgxMCApID4+IDUgKQotCi0gICAgRlRfVmVjdG9yICB1LCB2LCB3OyAgICAgIC8qIHNjYWxlZCB2ZWN0b3JzICovCi0gICAgQ0YyX0ZpeGVkICBkZW5vbWluYXRvciwgczsKLQotCi0gICAgdS54ID0gQ0YyX0NTX1NDQUxFKCBTVUJfSU5UMzIoIHUyLT54LCB1MS0+eCApICk7Ci0gICAgdS55ID0gQ0YyX0NTX1NDQUxFKCBTVUJfSU5UMzIoIHUyLT55LCB1MS0+eSApICk7Ci0gICAgdi54ID0gQ0YyX0NTX1NDQUxFKCBTVUJfSU5UMzIoIHYyLT54LCB2MS0+eCApICk7Ci0gICAgdi55ID0gQ0YyX0NTX1NDQUxFKCBTVUJfSU5UMzIoIHYyLT55LCB2MS0+eSApICk7Ci0gICAgdy54ID0gQ0YyX0NTX1NDQUxFKCBTVUJfSU5UMzIoIHYxLT54LCB1MS0+eCApICk7Ci0gICAgdy55ID0gQ0YyX0NTX1NDQUxFKCBTVUJfSU5UMzIoIHYxLT55LCB1MS0+eSApICk7Ci0KLSAgICBkZW5vbWluYXRvciA9IGNmMl9wZXJwKCB1LCB2ICk7Ci0KLSAgICBpZiAoIGRlbm9taW5hdG9yID09IDAgKQotICAgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgLyogcGFyYWxsZWwgb3IgY29pbmNpZGVudCBsaW5lcyAqLwotCi0gICAgcyA9IEZUX0RpdkZpeCggY2YyX3BlcnAoIHcsIHYgKSwgZGVub21pbmF0b3IgKTsKLQotICAgIGludGVyc2VjdGlvbi0+eCA9IEFERF9JTlQzMiggdTEtPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIHMsIFNVQl9JTlQzMiggdTItPngsIHUxLT54ICkgKSApOwotICAgIGludGVyc2VjdGlvbi0+eSA9IEFERF9JTlQzMiggdTEtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIHMsIFNVQl9JTlQzMiggdTItPnksIHUxLT55ICkgKSApOwotCi0KLSAgICAvKgotICAgICAqIFNwZWNpYWwgY2FzZSBzbmFwcGluZyBmb3IgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgbGluZXMuCi0gICAgICogVGhpcyBjbGVhbnMgdXAgaW50ZXJzZWN0aW9ucyBhbmQgcmVkdWNlcyBwcm9ibGVtcyB3aXRoIHdpbmRpbmcKLSAgICAgKiBvcmRlciBkZXRlY3Rpb24uCi0gICAgICogU2FtcGxlIGNhc2UgaXMgc2JjIGNkIEtvekdvUHI2Ti1NZWRpdW0ub3RmIDIwIDE2Njg1LgotICAgICAqIE5vdGU6IHRoZXNlIGNhbGN1bGF0aW9ucyBhcmUgaW4gY2hhcmFjdGVyIHNwYWNlLgotICAgICAqCi0gICAgICovCi0KLSAgICBpZiAoIHUxLT54ID09IHUyLT54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGNmMl9maXhlZEFicyggU1VCX0lOVDMyKCBpbnRlcnNlY3Rpb24tPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEtPnggKSApIDwgZ2x5cGhwYXRoLT5zbmFwVGhyZXNob2xkICkKLSAgICAgIGludGVyc2VjdGlvbi0+eCA9IHUxLT54OwotICAgIGlmICggdTEtPnkgPT0gdTItPnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgY2YyX2ZpeGVkQWJzKCBTVUJfSU5UMzIoIGludGVyc2VjdGlvbi0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MS0+eSApICkgPCBnbHlwaHBhdGgtPnNuYXBUaHJlc2hvbGQgKQotICAgICAgaW50ZXJzZWN0aW9uLT55ID0gdTEtPnk7Ci0KLSAgICBpZiAoIHYxLT54ID09IHYyLT54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGNmMl9maXhlZEFicyggU1VCX0lOVDMyKCBpbnRlcnNlY3Rpb24tPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEtPnggKSApIDwgZ2x5cGhwYXRoLT5zbmFwVGhyZXNob2xkICkKLSAgICAgIGludGVyc2VjdGlvbi0+eCA9IHYxLT54OwotICAgIGlmICggdjEtPnkgPT0gdjItPnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgY2YyX2ZpeGVkQWJzKCBTVUJfSU5UMzIoIGludGVyc2VjdGlvbi0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MS0+eSApICkgPCBnbHlwaHBhdGgtPnNuYXBUaHJlc2hvbGQgKQotICAgICAgaW50ZXJzZWN0aW9uLT55ID0gdjEtPnk7Ci0KLSAgICAvKiBsaW1pdCB0aGUgaW50ZXJzZWN0aW9uIGRpc3RhbmNlIGZyb20gbWlkcG9pbnQgb2YgdTIgYW5kIHYxICovCi0gICAgaWYgKCBjZjJfZml4ZWRBYnMoIGludGVyc2VjdGlvbi0+eCAtIEFERF9JTlQzMiggdTItPngsIHYxLT54ICkgLyAyICkgPgotICAgICAgICAgICBnbHlwaHBhdGgtPm1pdGVyTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGNmMl9maXhlZEFicyggaW50ZXJzZWN0aW9uLT55IC0gQUREX0lOVDMyKCB1Mi0+eSwgdjEtPnkgKSAvIDIgKSA+Ci0gICAgICAgICAgIGdseXBocGF0aC0+bWl0ZXJMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKLSAgfQotCi0KLSAgLyoKLSAgICogUHVzaCB0aGUgY2FjaGVkIGVsZW1lbnQgKGdseXBocGF0aC0+cHJldkVsZW0qKSB0byB0aGUgb3V0bGluZQotICAgKiBjb25zdW1lci4gIFdoZW4gYSBkYXJrZW5pbmcgb2Zmc2V0IGlzIHVzZWQsIHRoZSBlbmQgcG9pbnQgb2YgdGhlCi0gICAqIGNhY2hlZCBlbGVtZW50IG1heSBiZSBhZGp1c3RlZCB0byBhbiBpbnRlcnNlY3Rpb24gcG9pbnQgb3Igd2UgbWF5Ci0gICAqIHN5bnRoZXNpemUgYSBjb25uZWN0aW5nIGxpbmUgdG8gdGhlIGN1cnJlbnQgZWxlbWVudC4gIElmIHdlIGFyZQotICAgKiBjbG9zaW5nIGEgc3VicGF0aCwgd2UgbWF5IGFsc28gZ2VuZXJhdGUgYSBjb25uZWN0aW5nIGxpbmUgdG8gdGhlIHN0YXJ0Ci0gICAqIHBvaW50LgotICAgKgotICAgKiBUaGlzIGlzIHdoZXJlIENoYXJhY3RlciBTcGFjZSAoQ1MpIGlzIGNvbnZlcnRlZCB0byBEZXZpY2UgU3BhY2UgKERTKQotICAgKiB1c2luZyBhIGhpbnQgbWFwLiAgVGhpcyBjYWxjdWxhdGlvbiBtdXN0IHVzZSBhIEhpbnRNYXAgdGhhdCB3YXMgdmFsaWQKLSAgICogYXQgdGhlIHRpbWUgdGhlIGVsZW1lbnQgd2FzIHNhdmVkLiAgRm9yIHRoZSBmaXJzdCBwb2ludCBpbiBhIHN1YnBhdGgsCi0gICAqIHRoYXQgaXMgYSBzYXZlZCBIaW50TWFwLiAgRm9yIG1vc3QgZWxlbWVudHMsIGl0IGp1c3QgbWVhbnMgdGhlIGNhbGxlcgotICAgKiBoYXMgZGVsYXllZCBidWlsZGluZyBhIEhpbnRNYXAgZnJvbSB0aGUgY3VycmVudCBIaW50TWFzay4KLSAgICoKLSAgICogVHJhbnNmb3JtIGVhY2ggcG9pbnQgd2l0aCBvdXRlclRyYW5zZm9ybSBhbmQgY2FsbCB0aGUgb3V0bGluZQotICAgKiBjYWxsYmFja3MuICBUaGlzIGlzIGEgZ2VuZXJhbCAzeDMgdHJhbnNmb3JtOgotICAgKgotICAgKiAgIHgnID0gYSp4ICsgYyp5ICsgdHgsIHknID0gYip4ICsgZCp5ICsgdHkKLSAgICoKLSAgICogYnV0IGl0IHVzZXMgNCBlbGVtZW50cyBmcm9tIENGMl9Gb250IGFuZCB0aGUgdHJhbnNsYXRpb24gcGFydAotICAgKiBmcm9tIENGMl9HbHlwaFBhdGguCi0gICAqCi0gICAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfZ2x5cGhwYXRoX3B1c2hQcmV2RWxlbSggQ0YyX0dseXBoUGF0aCAgZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0hpbnRNYXAgICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgIG5leHRQMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgICAgIG5leHRQMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIGNsb3NlICkKLSAgewotICAgIENGMl9DYWxsYmFja1BhcmFtc1JlYyAgcGFyYW1zOwotCi0gICAgRlRfVmVjdG9yKiAgcHJldlAwOwotICAgIEZUX1ZlY3RvciogIHByZXZQMTsKLQotICAgIEZUX1ZlY3RvciAgaW50ZXJzZWN0aW9uICAgID0geyAwLCAwIH07Ci0gICAgRlRfQm9vbCAgICB1c2VJbnRlcnNlY3Rpb24gPSBGQUxTRTsKLQotCi0gICAgRlRfQVNTRVJUKCBnbHlwaHBhdGgtPnByZXZFbGVtT3AgPT0gQ0YyX1BhdGhPcExpbmVUbyB8fAotICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbU9wID09IENGMl9QYXRoT3BDdWJlVG8gKTsKLQotICAgIGlmICggZ2x5cGhwYXRoLT5wcmV2RWxlbU9wID09IENGMl9QYXRoT3BMaW5lVG8gKQotICAgIHsKLSAgICAgIHByZXZQMCA9ICZnbHlwaHBhdGgtPnByZXZFbGVtUDA7Ci0gICAgICBwcmV2UDEgPSAmZ2x5cGhwYXRoLT5wcmV2RWxlbVAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJldlAwID0gJmdseXBocGF0aC0+cHJldkVsZW1QMjsKLSAgICAgIHByZXZQMSA9ICZnbHlwaHBhdGgtPnByZXZFbGVtUDM7Ci0gICAgfQotCi0gICAgLyogb3B0aW1pemF0aW9uOiBpZiBwcmV2aW91cyBhbmQgbmV4dCBlbGVtZW50cyBhcmUgb2Zmc2V0IGJ5IHRoZSBzYW1lICovCi0gICAgLyogYW1vdW50LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gZ2FwLCBhbmQgbm8gbmVlZCB0byBjb21wdXRlIGFuICAgICAgICovCi0gICAgLyogaW50ZXJzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBwcmV2UDEtPnggIT0gbmV4dFAwLT54IHx8IHByZXZQMS0+eSAhPSBuZXh0UDAtPnkgKQotICAgIHsKLSAgICAgIC8qIHByZXZpb3VzIGVsZW1lbnQgZG9lcyBub3Qgam9pbiBuZXh0IGVsZW1lbnQ6ICAgICAgICAgICAgICovCi0gICAgICAvKiBhZGp1c3QgZW5kIHBvaW50IG9mIHByZXZpb3VzIGVsZW1lbnQgdG8gdGhlIGludGVyc2VjdGlvbiAqLwotICAgICAgdXNlSW50ZXJzZWN0aW9uID0gY2YyX2dseXBocGF0aF9jb21wdXRlSW50ZXJzZWN0aW9uKCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZQMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0UDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcnNlY3Rpb24gKTsKLSAgICAgIGlmICggdXNlSW50ZXJzZWN0aW9uICkKLSAgICAgIHsKLSAgICAgICAgLyogbW9kaWZ5IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBjYWNoZWQgZWxlbWVudCAoZWl0aGVyIGxpbmUgb3IgKi8KLSAgICAgICAgLyogY3VydmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgKnByZXZQMSA9IGludGVyc2VjdGlvbjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwYXJhbXMucHQwID0gZ2x5cGhwYXRoLT5jdXJyZW50RFM7Ci0KLSAgICBzd2l0Y2goIGdseXBocGF0aC0+cHJldkVsZW1PcCApCi0gICAgewotICAgIGNhc2UgQ0YyX1BhdGhPcExpbmVUbzoKLSAgICAgIHBhcmFtcy5vcCA9IENGMl9QYXRoT3BMaW5lVG87Ci0KLSAgICAgIC8qIG5vdGU6IHB0MiBhbmQgcHQzIGFyZSB1bnVzZWQgKi8KLQotICAgICAgaWYgKCBjbG9zZSApCi0gICAgICB7Ci0gICAgICAgIC8qIHVzZSBmaXJzdCBoaW50IG1hcCBpZiBjbG9zaW5nICovCi0gICAgICAgIGNmMl9nbHlwaHBhdGhfaGludFBvaW50KCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5maXJzdEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+cHJldkVsZW1QMS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAxLnkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2YyX2dseXBocGF0aF9oaW50UG9pbnQoIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+cHJldkVsZW1QMS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAxLnkgKTsKLSAgICAgIH0KLQotICAgICAgLyogb3V0cHV0IG9ubHkgbm9uLXplcm8gbGVuZ3RoIGxpbmVzICovCi0gICAgICBpZiAoIHBhcmFtcy5wdDAueCAhPSBwYXJhbXMucHQxLnggfHwgcGFyYW1zLnB0MC55ICE9IHBhcmFtcy5wdDEueSApCi0gICAgICB7Ci0gICAgICAgIGdseXBocGF0aC0+Y2FsbGJhY2tzLT5saW5lVG8oIGdseXBocGF0aC0+Y2FsbGJhY2tzLCAmcGFyYW1zICk7Ci0KLSAgICAgICAgZ2x5cGhwYXRoLT5jdXJyZW50RFMgPSBwYXJhbXMucHQxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENGMl9QYXRoT3BDdWJlVG86Ci0gICAgICBwYXJhbXMub3AgPSBDRjJfUGF0aE9wQ3ViZVRvOwotCi0gICAgICAvKiBUT0RPOiBzaG91bGQgd2UgaW50ZXJzZWN0IHRoZSBpbnRlcmlvciBqb2lucyAocDEtcDIgYW5kIHAyLXAzKT8gKi8KLSAgICAgIGNmMl9nbHlwaHBhdGhfaGludFBvaW50KCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnByZXZFbGVtUDEueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnByZXZFbGVtUDEueSApOwotICAgICAgY2YyX2dseXBocGF0aF9oaW50UG9pbnQoIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMucHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+cHJldkVsZW1QMi54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+cHJldkVsZW1QMi55ICk7Ci0gICAgICBjZjJfZ2x5cGhwYXRoX2hpbnRQb2ludCggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcy5wdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAzLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAzLnkgKTsKLQotICAgICAgZ2x5cGhwYXRoLT5jYWxsYmFja3MtPmN1YmVUbyggZ2x5cGhwYXRoLT5jYWxsYmFja3MsICZwYXJhbXMgKTsKLQotICAgICAgZ2x5cGhwYXRoLT5jdXJyZW50RFMgPSBwYXJhbXMucHQzOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoICF1c2VJbnRlcnNlY3Rpb24gfHwgY2xvc2UgKQotICAgIHsKLSAgICAgIC8qIGluc2VydCBjb25uZWN0aW5nIGxpbmUgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZWxlbWVudCBhbmQgc3RhcnQgKi8KLSAgICAgIC8qIG9mIGN1cnJlbnQgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIG5vdGU6IGF0IHRoZSBlbmQgb2YgYSBzdWJwYXRoLCB3ZSBtaWdodCBkbyBib3RoLCBzbyB1c2UgYG5leHRQMCcgKi8KLSAgICAgIC8qIGJlZm9yZSB3ZSBjaGFuZ2UgaXQsIGJlbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBjbG9zZSApCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIHdlIGFyZSBjbG9zaW5nIHRoZSBzdWJwYXRoLCB0aGVuIG5leHRQMCBpcyBpbiB0aGUgZmlyc3QgICAgICovCi0gICAgICAgIC8qIGhpbnQgem9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGNmMl9nbHlwaHBhdGhfaGludFBvaW50KCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5maXJzdEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQMC0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQMC0+eSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjZjJfZ2x5cGhwYXRoX2hpbnRQb2ludCggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMucHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFAwLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFAwLT55ICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcGFyYW1zLnB0MS54ICE9IGdseXBocGF0aC0+Y3VycmVudERTLnggfHwKLSAgICAgICAgICAgcGFyYW1zLnB0MS55ICE9IGdseXBocGF0aC0+Y3VycmVudERTLnkgKQotICAgICAgewotICAgICAgICAvKiBsZW5ndGggaXMgbm9uemVybyAqLwotICAgICAgICBwYXJhbXMub3AgID0gQ0YyX1BhdGhPcExpbmVUbzsKLSAgICAgICAgcGFyYW1zLnB0MCA9IGdseXBocGF0aC0+Y3VycmVudERTOwotCi0gICAgICAgIC8qIG5vdGU6IHB0MiBhbmQgcHQzIGFyZSB1bnVzZWQgKi8KLSAgICAgICAgZ2x5cGhwYXRoLT5jYWxsYmFja3MtPmxpbmVUbyggZ2x5cGhwYXRoLT5jYWxsYmFja3MsICZwYXJhbXMgKTsKLQotICAgICAgICBnbHlwaHBhdGgtPmN1cnJlbnREUyA9IHBhcmFtcy5wdDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCB1c2VJbnRlcnNlY3Rpb24gKQotICAgIHsKLSAgICAgIC8qIHJldHVybiBpbnRlcnNlY3Rpb24gcG9pbnQgdG8gY2FsbGVyICovCi0gICAgICAqbmV4dFAwID0gaW50ZXJzZWN0aW9uOwotICAgIH0KLSAgfQotCi0KLSAgLyogcHVzaCBhIE1vdmVUbyBlbGVtZW50IGJhc2VkIG9uIGN1cnJlbnQgcG9pbnQgYW5kIG9mZnNldCBvZiBjdXJyZW50ICovCi0gIC8qIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfZ2x5cGhwYXRoX3B1c2hNb3ZlKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgICAgIHN0YXJ0ICkKLSAgewotICAgIENGMl9DYWxsYmFja1BhcmFtc1JlYyAgcGFyYW1zOwotCi0KLSAgICBwYXJhbXMub3AgID0gQ0YyX1BhdGhPcE1vdmVUbzsKLSAgICBwYXJhbXMucHQwID0gZ2x5cGhwYXRoLT5jdXJyZW50RFM7Ci0KLSAgICAvKiBUZXN0IGlmIG1vdmUgaGFzIHJlYWxseSBoYXBwZW5lZCB5ZXQ7IGl0IHdvdWxkIGhhdmUgY2FsbGVkICovCi0gICAgLyogYGNmMl9oaW50bWFwX2J1aWxkJyB0byBzZXQgYGlzVmFsaWQnLiAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWNmMl9oaW50bWFwX2lzVmFsaWQoICZnbHlwaHBhdGgtPmhpbnRNYXAgKSApCi0gICAgewotICAgICAgLyogd2UgYXJlIGhlcmUgaWZmIGZpcnN0IHN1YnBhdGggaXMgbWlzc2luZyBhIG1vdmV0byBvcGVyYXRvcjogKi8KLSAgICAgIC8qIHN5bnRoZXNpemUgZmlyc3QgbW92ZVRvIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBoaW50TWFwICovCi0gICAgICBjZjJfZ2x5cGhwYXRoX21vdmVUbyggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+c3RhcnQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnN0YXJ0LnkgKTsKLSAgICB9Ci0KLSAgICBjZjJfZ2x5cGhwYXRoX2hpbnRQb2ludCggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5oaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQueSApOwotCi0gICAgLyogbm90ZTogcHQyIGFuZCBwdDMgYXJlIHVudXNlZCAqLwotICAgIGdseXBocGF0aC0+Y2FsbGJhY2tzLT5tb3ZlVG8oIGdseXBocGF0aC0+Y2FsbGJhY2tzLCAmcGFyYW1zICk7Ci0KLSAgICBnbHlwaHBhdGgtPmN1cnJlbnREUyAgICA9IHBhcmFtcy5wdDE7Ci0gICAgZ2x5cGhwYXRoLT5vZmZzZXRTdGFydDAgPSBzdGFydDsKLSAgfQotCi0KLSAgLyoKLSAgICogQWxsIGNvb3JkaW5hdGVzIGFyZSBpbiBjaGFyYWN0ZXIgc3BhY2UuCi0gICAqIE9uIGlucHV0LCAoeDEsIHkxKSBhbmQgKHgyLCB5MikgZ2l2ZSBsaW5lIHNlZ21lbnQuCi0gICAqIE9uIG91dHB1dCwgKHgsIHkpIGdpdmUgb2Zmc2V0IHZlY3Rvci4KLSAgICogV2UgdXNlIGEgcGllY2V3aXNlIGFwcHJveGltYXRpb24gdG8gdHJpZyBmdW5jdGlvbnMuCi0gICAqCi0gICAqIFRPRE86IE9mZnNldCB0cnVlIHBlcnBlbmRpY3VsYXIgYW5kIHByb3BlciBsZW5ndGgKLSAgICogICAgICAgc3VwcGx5IHRoZSB5LXRyYW5zbGF0aW9uIGZvciBoaW50aW5nIGhlcmUsIHRvbywKLSAgICogICAgICAgdGhhdCBhZGRzIHlPZmZzZXQgdW5jb25kaXRpb25hbGx5IHRvICp5LgotICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2dseXBocGF0aF9jb21wdXRlT2Zmc2V0KCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgICB5ICkKLSAgewotICAgIENGMl9GaXhlZCAgZHggPSBTVUJfSU5UMzIoIHgyLCB4MSApOwotICAgIENGMl9GaXhlZCAgZHkgPSBTVUJfSU5UMzIoIHkyLCB5MSApOwotCi0KLSAgICAvKiBub3RlOiBuZWdhdGl2ZSBvZmZzZXRzIGRvbid0IHdvcmsgaGVyZTsgbmVnYXRlIGRlbHRhcyB0byBjaGFuZ2UgKi8KLSAgICAvKiBxdWFkcmFudHMsIGJlbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGdseXBocGF0aC0+Zm9udC0+cmV2ZXJzZVdpbmRpbmcgKQotICAgIHsKLSAgICAgIGR4ID0gTkVHX0lOVDMyKCBkeCApOwotICAgICAgZHkgPSBORUdfSU5UMzIoIGR5ICk7Ci0gICAgfQotCi0gICAgKnggPSAqeSA9IDA7Ci0KLSAgICBpZiAoICFnbHlwaHBhdGgtPmRhcmtlbiApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIGFkZCBtb21lbnR1bSBmb3IgdGhpcyBwYXRoIGVsZW1lbnQgKi8KLSAgICBnbHlwaHBhdGgtPmNhbGxiYWNrcy0+d2luZGluZ01vbWVudHVtICs9Ci0gICAgICBjZjJfZ2V0V2luZGluZ01vbWVudHVtKCB4MSwgeTEsIHgyLCB5MiApOwotCi0gICAgLyogbm90ZTogYWxsb3cgbWl4ZWQgaW50ZWdlciBhbmQgZml4ZWQgbXVsdGlwbGljYXRpb24gaGVyZSAqLwotICAgIGlmICggZHggPj0gMCApCi0gICAgewotICAgICAgaWYgKCBkeSA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogZmlyc3QgcXVhZHJhbnQsICt4ICt5ICovCi0KLSAgICAgICAgaWYgKCBkeCA+IE1VTF9JTlQzMiggMiwgZHkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiAreCAqLwotICAgICAgICAgICp4ID0gMDsKLSAgICAgICAgICAqeSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGR5ID4gTVVMX0lOVDMyKCAyLCBkeCApICkKLSAgICAgICAgewotICAgICAgICAgIC8qICt5ICovCi0gICAgICAgICAgKnggPSBnbHlwaHBhdGgtPnhPZmZzZXQ7Ci0gICAgICAgICAgKnkgPSBnbHlwaHBhdGgtPnlPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogK3ggK3kgKi8KLSAgICAgICAgICAqeCA9IEZUX011bEZpeCggY2YyX2RvdWJsZVRvRml4ZWQoIDAuNyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnhPZmZzZXQgKTsKLSAgICAgICAgICAqeSA9IEZUX011bEZpeCggY2YyX2RvdWJsZVRvRml4ZWQoIDEuMCAtIDAuNyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnlPZmZzZXQgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBmb3VydGggcXVhZHJhbnQsICt4IC15ICovCi0KLSAgICAgICAgaWYgKCBkeCA+IE1VTF9JTlQzMiggLTIsIGR5ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogK3ggKi8KLSAgICAgICAgICAqeCA9IDA7Ci0gICAgICAgICAgKnkgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBORUdfSU5UMzIoIGR5ICkgPiBNVUxfSU5UMzIoIDIsIGR4ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogLXkgKi8KLSAgICAgICAgICAqeCA9IE5FR19JTlQzMiggZ2x5cGhwYXRoLT54T2Zmc2V0ICk7Ci0gICAgICAgICAgKnkgPSBnbHlwaHBhdGgtPnlPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogK3ggLXkgKi8KLSAgICAgICAgICAqeCA9IEZUX011bEZpeCggY2YyX2RvdWJsZVRvRml4ZWQoIC0wLjcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT54T2Zmc2V0ICk7Ci0gICAgICAgICAgKnkgPSBGVF9NdWxGaXgoIGNmMl9kb3VibGVUb0ZpeGVkKCAxLjAgLSAwLjcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT55T2Zmc2V0ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggZHkgPj0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIHNlY29uZCBxdWFkcmFudCwgLXggK3kgKi8KLQotICAgICAgICBpZiAoIE5FR19JTlQzMiggZHggKSA+IE1VTF9JTlQzMiggMiwgZHkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiAteCAqLwotICAgICAgICAgICp4ID0gMDsKLSAgICAgICAgICAqeSA9IE1VTF9JTlQzMiggMiwgZ2x5cGhwYXRoLT55T2Zmc2V0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGR5ID4gTVVMX0lOVDMyKCAtMiwgZHggKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiAreSAqLwotICAgICAgICAgICp4ID0gZ2x5cGhwYXRoLT54T2Zmc2V0OwotICAgICAgICAgICp5ID0gZ2x5cGhwYXRoLT55T2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIC14ICt5ICovCi0gICAgICAgICAgKnggPSBGVF9NdWxGaXgoIGNmMl9kb3VibGVUb0ZpeGVkKCAwLjcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT54T2Zmc2V0ICk7Ci0gICAgICAgICAgKnkgPSBGVF9NdWxGaXgoIGNmMl9kb3VibGVUb0ZpeGVkKCAxLjAgKyAwLjcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT55T2Zmc2V0ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcmQgcXVhZHJhbnQsIC14IC15ICovCi0KLSAgICAgICAgaWYgKCBORUdfSU5UMzIoIGR4ICkgPiBNVUxfSU5UMzIoIC0yLCBkeSApICkKLSAgICAgICAgewotICAgICAgICAgIC8qIC14ICovCi0gICAgICAgICAgKnggPSAwOwotICAgICAgICAgICp5ID0gTVVMX0lOVDMyKCAyLCBnbHlwaHBhdGgtPnlPZmZzZXQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggTkVHX0lOVDMyKCBkeSApID4gTVVMX0lOVDMyKCAtMiwgZHggKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiAteSAqLwotICAgICAgICAgICp4ID0gTkVHX0lOVDMyKCBnbHlwaHBhdGgtPnhPZmZzZXQgKTsKLSAgICAgICAgICAqeSA9IGdseXBocGF0aC0+eU9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiAteCAteSAqLwotICAgICAgICAgICp4ID0gRlRfTXVsRml4KCBjZjJfZG91YmxlVG9GaXhlZCggLTAuNyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnhPZmZzZXQgKTsKLSAgICAgICAgICAqeSA9IEZUX011bEZpeCggY2YyX2RvdWJsZVRvRml4ZWQoIDEuMCArIDAuNyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnlPZmZzZXQgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoKLSAgICogVGhlIGZ1bmN0aW9ucyBjZjJfZ2x5cGhwYXRoX3ttb3ZlVG8sbGluZVRvLGN1cnZlVG8sY2xvc2VPcGVuUGF0aH0gYXJlCi0gICAqIGNhbGxlZCBieSB0aGUgaW50ZXJwcmV0ZXIgd2l0aCBDaGFyYWN0ZXIgU3BhY2UgKENTKSBjb29yZGluYXRlcy4gIEVhY2gKLSAgICogcGF0aCBlbGVtZW50IGlzIHBsYWNlZCBpbnRvIGEgcXVldWUgb2YgbGVuZ3RoIG9uZSB0byBhd2FpdCB0aGUKLSAgICogY2FsY3VsYXRpb24gb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50LiAgQXQgdGhhdCB0aW1lLCB0aGUgZGFya2VuaW5nCi0gICAqIG9mZnNldCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgaXMga25vd24gYW5kIGpvaW5zIGNhbiBiZSBjb21wdXRlZCwKLSAgICogaW5jbHVkaW5nIHBvc3NpYmxlIG1vZGlmaWNhdGlvbiBvZiB0aGlzIGVsZW1lbnQsIGJlZm9yZSBtYXBwaW5nIHRvCi0gICAqIERldmljZSBTcGFjZSAoRFMpIGFuZCBwYXNzaW5nIGl0IG9uIHRvIHRoZSBvdXRsaW5lIGNvbnN1bWVyLgotICAgKgotICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2dseXBocGF0aF9tb3ZlVG8oIENGMl9HbHlwaFBhdGggIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB5ICkKLSAgewotICAgIGNmMl9nbHlwaHBhdGhfY2xvc2VPcGVuUGF0aCggZ2x5cGhwYXRoICk7Ci0KLSAgICAvKiBzYXZlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtb3ZlIGZvciBsYXRlciwgd2hlbiB3ZSdsbCBrbm93IGhvdyB0byAqLwotICAgIC8qIG9mZnNldCBpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogYWxzbyBzYXZlIGxhc3QgbW92ZSBwb2ludCAqLwotICAgIGdseXBocGF0aC0+Y3VycmVudENTLnggPSBnbHlwaHBhdGgtPnN0YXJ0LnggPSB4OwotICAgIGdseXBocGF0aC0+Y3VycmVudENTLnkgPSBnbHlwaHBhdGgtPnN0YXJ0LnkgPSB5OwotCi0gICAgZ2x5cGhwYXRoLT5tb3ZlSXNQZW5kaW5nID0gVFJVRTsKLQotICAgIC8qIGVuc3VyZSB3ZSBoYXZlIGEgdmFsaWQgbWFwIHdpdGggY3VycmVudCBtYXNrICovCi0gICAgaWYgKCAhY2YyX2hpbnRtYXBfaXNWYWxpZCggJmdseXBocGF0aC0+aGludE1hcCApIHx8Ci0gICAgICAgICBjZjJfaGludG1hc2tfaXNOZXcoIGdseXBocGF0aC0+aGludE1hc2sgKSAgICkKLSAgICAgIGNmMl9oaW50bWFwX2J1aWxkKCAmZ2x5cGhwYXRoLT5oaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT52U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmhpbnRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aGludE9yaWdpblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLQotICAgIC8qIHNhdmUgYSBjb3B5IG9mIGN1cnJlbnQgSGludE1hcCB0byB1c2Ugd2hlbiBkcmF3aW5nIGluaXRpYWwgcG9pbnQgKi8KLSAgICBnbHlwaHBhdGgtPmZpcnN0SGludE1hcCA9IGdseXBocGF0aC0+aGludE1hcDsgICAgIC8qIHN0cnVjdHVyZSBjb3B5ICovCi0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfbGluZVRvKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeSApCi0gIHsKLSAgICBDRjJfRml4ZWQgIHhPZmZzZXQsIHlPZmZzZXQ7Ci0gICAgRlRfVmVjdG9yICBQMCwgUDE7Ci0gICAgRlRfQm9vbCAgICBuZXdIaW50TWFwOwotCi0gICAgLyoKLSAgICAgKiBOZXcgaGludHMgd2lsbCBiZSBhcHBsaWVkIGFmdGVyIGNmMl9nbHlwaHBhdGhfcHVzaFByZXZFbGVtIGhhcyBydW4uCi0gICAgICogSW4gY2FzZSB0aGlzIGlzIGEgc3ludGhlc2l6ZWQgY2xvc2luZyBsaW5lLCBhbnkgbmV3IGhpbnRzIHNob3VsZCBiZQotICAgICAqIGRlbGF5ZWQgdW50aWwgdGhpcyBwYXRoIGlzIGNsb3NlZCAoYGNmMl9oaW50bWFza19pc05ldycgd2lsbCBiZQotICAgICAqIGNhbGxlZCBhZ2FpbiBiZWZvcmUgdGhlIG5leHQgbGluZSBvciBjdXJ2ZSkuCi0gICAgICovCi0KLSAgICAvKiB0cnVlIGlmIG5ldyBoaW50IG1hcCBub3Qgb24gY2xvc2UgKi8KLSAgICBuZXdIaW50TWFwID0gY2YyX2hpbnRtYXNrX2lzTmV3KCBnbHlwaHBhdGgtPmhpbnRNYXNrICkgJiYKLSAgICAgICAgICAgICAgICAgIWdseXBocGF0aC0+cGF0aElzQ2xvc2luZzsKLQotICAgIC8qCi0gICAgICogWmVyby1sZW5ndGggbGluZXMgbWF5IG9jY3VyIGluIHRoZSBjaGFyc3RyaW5nLiAgQmVjYXVzZSB3ZSBjYW5ub3QKLSAgICAgKiBjb21wdXRlIGRhcmtlbmluZyBvZmZzZXRzIG9yIGludGVyc2VjdGlvbnMgZnJvbSB6ZXJvLWxlbmd0aCBsaW5lcywKLSAgICAgKiBpdCBpcyBiZXN0IHRvIHJlbW92ZSB0aGVtIGFuZCBhdm9pZCBhcnRpZmFjdHMuICBIb3dldmVyLCB6ZXJvLWxlbmd0aAotICAgICAqIGxpbmVzIGluIENTIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBoaW50IG1hcCBjYW4gZ2VuZXJhdGUgbm9uLXplcm8KLSAgICAgKiBsaW5lcyBpbiBEUyBkdWUgdG8gaGludCBzdWJzdGl0dXRpb24uICBXZSBkZXRlY3QgYSBjaGFuZ2UgaW4gaGludAotICAgICAqIG1hcCBoZXJlIGFuZCBwYXNzIHRob3NlIHplcm8tbGVuZ3RoIGxpbmVzIGFsb25nLgotICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBOb3RlOiBGaW5kIGV4cGxpY2l0bHkgY2xvc2VkIHBhdGhzIGhlcmUgd2l0aCBhIGNvbmRpdGlvbmFsCi0gICAgICogICAgICAgYnJlYWtwb2ludCB1c2luZwotICAgICAqCi0gICAgICogICAgICAgICAhZ3AtPnBhdGhJc0Nsb3NpbmcgJiYgZ3AtPnN0YXJ0LnggPT0geCAmJiBncC0+c3RhcnQueSA9PSB5Ci0gICAgICoKLSAgICAgKi8KLQotICAgIGlmICggZ2x5cGhwYXRoLT5jdXJyZW50Q1MueCA9PSB4ICYmCi0gICAgICAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy55ID09IHkgJiYKLSAgICAgICAgICFuZXdIaW50TWFwICAgICAgICAgICAgICAgICApCi0gICAgICAvKgotICAgICAgICogSWdub3JlIHplcm8tbGVuZ3RoIGxpbmVzIGluIENTIHdoZXJlIHRoZSBoaW50IG1hcCBpcyB0aGUgc2FtZQotICAgICAgICogYmVjYXVzZSB0aGUgbGluZSBpbiBEUyB3aWxsIGFsc28gYmUgemVybyBsZW5ndGguCi0gICAgICAgKgotICAgICAgICogSWdub3JlIHplcm8tbGVuZ3RoIGxpbmVzIHdoZW4gd2Ugc3ludGhlc2l6ZSBhIGNsb3NpbmcgbGluZSBiZWNhdXNlCi0gICAgICAgKiB0aGUgY2xvc2Ugd2lsbCBiZSBoYW5kbGVkIGluIGNmMl9nbHlwaFBhdGhfcHVzaFByZXZFbGVtLgotICAgICAgICovCi0gICAgICByZXR1cm47Ci0KLSAgICBjZjJfZ2x5cGhwYXRoX2NvbXB1dGVPZmZzZXQoIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+Y3VycmVudENTLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5T2Zmc2V0ICk7Ci0KLSAgICAvKiBjb25zdHJ1Y3Qgb2Zmc2V0IHBvaW50cyAqLwotICAgIFAwLnggPSBBRERfSU5UMzIoIGdseXBocGF0aC0+Y3VycmVudENTLngsIHhPZmZzZXQgKTsKLSAgICBQMC55ID0gQUREX0lOVDMyKCBnbHlwaHBhdGgtPmN1cnJlbnRDUy55LCB5T2Zmc2V0ICk7Ci0gICAgUDEueCA9IEFERF9JTlQzMiggeCwgeE9mZnNldCApOwotICAgIFAxLnkgPSBBRERfSU5UMzIoIHksIHlPZmZzZXQgKTsKLQotICAgIGlmICggZ2x5cGhwYXRoLT5tb3ZlSXNQZW5kaW5nICkKLSAgICB7Ci0gICAgICAvKiBlbWl0IG9mZnNldCAxc3QgcG9pbnQgYXMgTW92ZVRvICovCi0gICAgICBjZjJfZ2x5cGhwYXRoX3B1c2hNb3ZlKCBnbHlwaHBhdGgsIFAwICk7Ci0KLSAgICAgIGdseXBocGF0aC0+bW92ZUlzUGVuZGluZyA9IEZBTFNFOyAgLyogYWRqdXN0IHN0YXRlIG1hY2hpbmUgKi8KLSAgICAgIGdseXBocGF0aC0+cGF0aElzT3BlbiAgICA9IFRSVUU7Ci0KLSAgICAgIGdseXBocGF0aC0+b2Zmc2V0U3RhcnQxID0gUDE7ICAgICAgICAgICAgICAvKiByZWNvcmQgc2Vjb25kIHBvaW50ICovCi0gICAgfQotCi0gICAgaWYgKCBnbHlwaHBhdGgtPmVsZW1Jc1F1ZXVlZCApCi0gICAgewotICAgICAgRlRfQVNTRVJUKCBjZjJfaGludG1hcF9pc1ZhbGlkKCAmZ2x5cGhwYXRoLT5oaW50TWFwICkgfHwKLSAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5oaW50TWFwLmNvdW50ID09IDAgICAgICAgICAgICAgICk7Ci0KLSAgICAgIGNmMl9nbHlwaHBhdGhfcHVzaFByZXZFbGVtKCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBocGF0aC0+aGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLSAgICB9Ci0KLSAgICAvKiBxdWV1ZSB0aGUgY3VycmVudCBlbGVtZW50IHdpdGggb2Zmc2V0IHBvaW50cyAqLwotICAgIGdseXBocGF0aC0+ZWxlbUlzUXVldWVkID0gVFJVRTsKLSAgICBnbHlwaHBhdGgtPnByZXZFbGVtT3AgICA9IENGMl9QYXRoT3BMaW5lVG87Ci0gICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAwICAgPSBQMDsKLSAgICBnbHlwaHBhdGgtPnByZXZFbGVtUDEgICA9IFAxOwotCi0gICAgLyogdXBkYXRlIGN1cnJlbnQgbWFwICovCi0gICAgaWYgKCBuZXdIaW50TWFwICkKLSAgICAgIGNmMl9oaW50bWFwX2J1aWxkKCAmZ2x5cGhwYXRoLT5oaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT52U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmhpbnRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aGludE9yaWdpblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLQotICAgIGdseXBocGF0aC0+Y3VycmVudENTLnggPSB4OyAgICAgLyogcHJlLW9mZnNldCBjdXJyZW50IHBvaW50ICovCi0gICAgZ2x5cGhwYXRoLT5jdXJyZW50Q1MueSA9IHk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfY3VydmVUbyggQ0YyX0dseXBoUGF0aCAgZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHkzICkKLSAgewotICAgIENGMl9GaXhlZCAgeE9mZnNldDEsIHlPZmZzZXQxLCB4T2Zmc2V0MywgeU9mZnNldDM7Ci0gICAgRlRfVmVjdG9yICBQMCwgUDEsIFAyLCBQMzsKLQotCi0gICAgLyogVE9ETzogaWdub3JlIHplcm8gbGVuZ3RoIHBvcnRpb25zIG9mIGN1cnZlPz8gKi8KLSAgICBjZjJfZ2x5cGhwYXRoX2NvbXB1dGVPZmZzZXQoIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+Y3VycmVudENTLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4T2Zmc2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5T2Zmc2V0MSApOwotICAgIGNmMl9nbHlwaHBhdGhfY29tcHV0ZU9mZnNldCggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeE9mZnNldDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeU9mZnNldDMgKTsKLQotICAgIC8qIGFkZCBtb21lbnR1bSBmcm9tIHRoZSBtaWRkbGUgc2VnbWVudCAqLwotICAgIGdseXBocGF0aC0+Y2FsbGJhY2tzLT53aW5kaW5nTW9tZW50dW0gKz0KLSAgICAgIGNmMl9nZXRXaW5kaW5nTW9tZW50dW0oIHgxLCB5MSwgeDIsIHkyICk7Ci0KLSAgICAvKiBjb25zdHJ1Y3Qgb2Zmc2V0IHBvaW50cyAqLwotICAgIFAwLnggPSBBRERfSU5UMzIoIGdseXBocGF0aC0+Y3VycmVudENTLngsIHhPZmZzZXQxICk7Ci0gICAgUDAueSA9IEFERF9JTlQzMiggZ2x5cGhwYXRoLT5jdXJyZW50Q1MueSwgeU9mZnNldDEgKTsKLSAgICBQMS54ID0gQUREX0lOVDMyKCB4MSwgeE9mZnNldDEgKTsKLSAgICBQMS55ID0gQUREX0lOVDMyKCB5MSwgeU9mZnNldDEgKTsKLSAgICAvKiBub3RlOiBwcmVzZXJ2ZSBhbmdsZSBvZiBmaW5hbCBzZWdtZW50IGJ5IHVzaW5nIG9mZnNldDMgYXQgYm90aCBlbmRzICovCi0gICAgUDIueCA9IEFERF9JTlQzMiggeDIsIHhPZmZzZXQzICk7Ci0gICAgUDIueSA9IEFERF9JTlQzMiggeTIsIHlPZmZzZXQzICk7Ci0gICAgUDMueCA9IEFERF9JTlQzMiggeDMsIHhPZmZzZXQzICk7Ci0gICAgUDMueSA9IEFERF9JTlQzMiggeTMsIHlPZmZzZXQzICk7Ci0KLSAgICBpZiAoIGdseXBocGF0aC0+bW92ZUlzUGVuZGluZyApCi0gICAgewotICAgICAgLyogZW1pdCBvZmZzZXQgMXN0IHBvaW50IGFzIE1vdmVUbyAqLwotICAgICAgY2YyX2dseXBocGF0aF9wdXNoTW92ZSggZ2x5cGhwYXRoLCBQMCApOwotCi0gICAgICBnbHlwaHBhdGgtPm1vdmVJc1BlbmRpbmcgPSBGQUxTRTsKLSAgICAgIGdseXBocGF0aC0+cGF0aElzT3BlbiAgICA9IFRSVUU7Ci0KLSAgICAgIGdseXBocGF0aC0+b2Zmc2V0U3RhcnQxID0gUDE7ICAgICAgICAgICAgICAvKiByZWNvcmQgc2Vjb25kIHBvaW50ICovCi0gICAgfQotCi0gICAgaWYgKCBnbHlwaHBhdGgtPmVsZW1Jc1F1ZXVlZCApCi0gICAgewotICAgICAgRlRfQVNTRVJUKCBjZjJfaGludG1hcF9pc1ZhbGlkKCAmZ2x5cGhwYXRoLT5oaW50TWFwICkgfHwKLSAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5oaW50TWFwLmNvdW50ID09IDAgICAgICAgICAgICAgICk7Ci0KLSAgICAgIGNmMl9nbHlwaHBhdGhfcHVzaFByZXZFbGVtKCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBocGF0aC0+aGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLSAgICB9Ci0KLSAgICAvKiBxdWV1ZSB0aGUgY3VycmVudCBlbGVtZW50IHdpdGggb2Zmc2V0IHBvaW50cyAqLwotICAgIGdseXBocGF0aC0+ZWxlbUlzUXVldWVkID0gVFJVRTsKLSAgICBnbHlwaHBhdGgtPnByZXZFbGVtT3AgICA9IENGMl9QYXRoT3BDdWJlVG87Ci0gICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAwICAgPSBQMDsKLSAgICBnbHlwaHBhdGgtPnByZXZFbGVtUDEgICA9IFAxOwotICAgIGdseXBocGF0aC0+cHJldkVsZW1QMiAgID0gUDI7Ci0gICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAzICAgPSBQMzsKLQotICAgIC8qIHVwZGF0ZSBjdXJyZW50IG1hcCAqLwotICAgIGlmICggY2YyX2hpbnRtYXNrX2lzTmV3KCBnbHlwaHBhdGgtPmhpbnRNYXNrICkgKQotICAgICAgY2YyX2hpbnRtYXBfYnVpbGQoICZnbHlwaHBhdGgtPmhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5oU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnZTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aGludE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5oaW50T3JpZ2luWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSApOwotCi0gICAgZ2x5cGhwYXRoLT5jdXJyZW50Q1MueCA9IHgzOyAgICAgICAvKiBwcmUtb2Zmc2V0IGN1cnJlbnQgcG9pbnQgKi8KLSAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy55ID0geTM7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfY2xvc2VPcGVuUGF0aCggQ0YyX0dseXBoUGF0aCAgZ2x5cGhwYXRoICkKLSAgewotICAgIGlmICggZ2x5cGhwYXRoLT5wYXRoSXNPcGVuICkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQSBjbG9zaW5nIGxpbmUgaW4gQ2hhcmFjdGVyIFNwYWNlIGxpbmUgaXMgYWx3YXlzIGdlbmVyYXRlZCBiZWxvdwotICAgICAgICogd2l0aCBgY2YyX2dseXBoUGF0aF9saW5lVG8nLiAgSXQgbWF5IGJlIGlnbm9yZWQgbGF0ZXIgaWYgaXQgdHVybnMKLSAgICAgICAqIG91dCB0byBiZSB6ZXJvIGxlbmd0aCBpbiBEZXZpY2UgU3BhY2UuCi0gICAgICAgKi8KLSAgICAgIGdseXBocGF0aC0+cGF0aElzQ2xvc2luZyA9IFRSVUU7Ci0KLSAgICAgIGNmMl9nbHlwaHBhdGhfbGluZVRvKCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5zdGFydC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+c3RhcnQueSApOwotCi0gICAgICAvKiBlbXB0eSB0aGUgZmluYWwgZWxlbWVudCBmcm9tIHRoZSBxdWV1ZSBhbmQgY2xvc2UgdGhlIHBhdGggKi8KLSAgICAgIGlmICggZ2x5cGhwYXRoLT5lbGVtSXNRdWV1ZWQgKQotICAgICAgICBjZjJfZ2x5cGhwYXRoX3B1c2hQcmV2RWxlbSggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBocGF0aC0+aGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPm9mZnNldFN0YXJ0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+b2Zmc2V0U3RhcnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSApOwotCi0gICAgICAvKiByZXNldCBzdGF0ZSBtYWNoaW5lICovCi0gICAgICBnbHlwaHBhdGgtPm1vdmVJc1BlbmRpbmcgPSBUUlVFOwotICAgICAgZ2x5cGhwYXRoLT5wYXRoSXNPcGVuICAgID0gRkFMU0U7Ci0gICAgICBnbHlwaHBhdGgtPnBhdGhJc0Nsb3NpbmcgPSBGQUxTRTsKLSAgICAgIGdseXBocGF0aC0+ZWxlbUlzUXVldWVkICA9IEZBTFNFOwotICAgIH0KLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZjJoaW50cy5oIGIvc3JjL2NmZi9jZjJoaW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODk4NDU0Li4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2YyaGludHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJoaW50cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBoYW5kbGluZyBDRkYgaGludHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDRjJISU5UU19IXwotI2RlZmluZSBDRjJISU5UU19IXwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgZW51bQotICB7Ci0gICAgQ0YyX01BWF9ISU5UUyA9IDk2ICAgIC8qIG1heGltdW0gIyBvZiBoaW50cyAqLwotICB9OwotCi0KLSAgLyoKLSAgICogQSBIaW50TWFzayBvYmplY3Qgc3RvcmVzIGEgYml0IG1hc2sgdGhhdCBzcGVjaWZpZXMgd2hpY2ggaGludHMgaW4gdGhlCi0gICAqIGNoYXJzdHJpbmcgYXJlIGFjdGl2ZSBhdCBhIGdpdmVuIHRpbWUuICBIaW50cyBpbiBDRkYgbXVzdCBiZSBkZWNsYXJlZAotICAgKiBhdCB0aGUgc3RhcnQsIGJlZm9yZSBhbnkgZHJhd2luZyBvcGVyYXRvcnMsIHdpdGggaG9yaXpvbnRhbCBoaW50cwotICAgKiBwcmVjZWRpbmcgdmVydGljYWwgaGludHMuICBUaGUgSGludE1hc2sgaXMgb3JkZXJlZCB0aGUgc2FtZSB3YXksIHdpdGgKLSAgICogaG9yaXpvbnRhbCBoaW50cyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB2ZXJ0aWNhbCBoaW50cy4gIENsaWVudHMgYXJlCi0gICAqIHJlc3BvbnNpYmxlIGZvciBrbm93aW5nIGhvdyBtYW55IG9mIGVhY2ggdHlwZSBhcmUgcHJlc2VudC4KLSAgICoKLSAgICogVGhlIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIGhpbnRzIGlzIDk2LCBhcyBzcGVjaWZpZWQgYnkgdGhlIENGRgotICAgKiBzcGVjaWZpY2F0aW9uLgotICAgKgotICAgKiBBIEhpbnRNYXNrIGlzIGJ1aWx0IDAgb3IgbW9yZSB0aW1lcyB3aGlsZSBpbnRlcnByZXRpbmcgYSBjaGFyc3RyaW5nLCBieQotICAgKiB0aGUgSGludE1hc2sgb3BlcmF0b3IuICBUaGVyZSBpcyBvbmx5IG9uZSBIaW50TWFzaywgYnV0IGl0IGlzIGJ1aWx0IG9yCi0gICAqIHJlYnVpbHQgZWFjaCB0aW1lIHRoZXJlIGlzIGEgaGludCBzdWJzdGl0dXRpb24gKEhpbnRNYXNrIG9wZXJhdG9yKSBpbgotICAgKiB0aGUgY2hhcnN0cmluZy4gIEEgZGVmYXVsdCBIaW50TWFzayB3aXRoIGFsbCBiaXRzIHNldCBpcyBidWlsdCBpZiB0aGVyZQotICAgKiBoYXMgYmVlbiBubyBIaW50TWFzayBvcGVyYXRvciBwcmlvciB0byB0aGUgZmlyc3QgZHJhd2luZyBvcGVyYXRvci4KLSAgICoKLSAgICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9IaW50TWFza1JlY18KLSAgewotICAgIEZUX0Vycm9yKiAgZXJyb3I7Ci0KLSAgICBGVF9Cb29sICBpc1ZhbGlkOwotICAgIEZUX0Jvb2wgIGlzTmV3OwotCi0gICAgc2l6ZV90ICBiaXRDb3VudDsKLSAgICBzaXplX3QgIGJ5dGVDb3VudDsKLQotICAgIEZUX0J5dGUgIG1hc2tbKCBDRjJfTUFYX0hJTlRTICsgNyApIC8gOF07Ci0KLSAgfSBDRjJfSGludE1hc2tSZWMsICpDRjJfSGludE1hc2s7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX1N0ZW1IaW50UmVjXwotICB7Ci0gICAgRlRfQm9vbCAgdXNlZDsgICAgIC8qIERTIHBvc2l0aW9ucyBhcmUgdmFsaWQgICAgICAgICAqLwotCi0gICAgQ0YyX0ZpeGVkICBtaW47ICAgIC8qIG9yaWdpbmFsIGNoYXJhY3RlciBzcGFjZSB2YWx1ZSAqLwotICAgIENGMl9GaXhlZCAgbWF4OwotCi0gICAgQ0YyX0ZpeGVkICBtaW5EUzsgIC8qIERTIHBvc2l0aW9uIGFmdGVyIGZpcnN0IHVzZSAgICAqLwotICAgIENGMl9GaXhlZCAgbWF4RFM7Ci0KLSAgfSBDRjJfU3RlbUhpbnRSZWMsICpDRjJfU3RlbUhpbnQ7Ci0KLQotICAvKgotICAgKiBBIEhpbnRNYXAgb2JqZWN0IHN0b3JlcyBhIHBpZWNld2lzZSBsaW5lYXIgZnVuY3Rpb24gZm9yIG1hcHBpbmcKLSAgICogeS1jb29yZGluYXRlcyBmcm9tIGNoYXJhY3RlciBzcGFjZSB0byBkZXZpY2Ugc3BhY2UsIHByb3ZpZGluZwotICAgKiBhcHByb3ByaWF0ZSBwaXhlbCBhbGlnbm1lbnQgdG8gc3RlbSBlZGdlcy4KLSAgICoKLSAgICogVGhlIG1hcCBpcyBpbXBsZW1lbnRlZCBhcyBhbiBhcnJheSBvZiBgQ0YyX0hpbnQnIGVsZW1lbnRzLCBlYWNoCi0gICAqIHJlcHJlc2VudGluZyBhbiBlZGdlLiAgV2hlbiBlZGdlcyBhcmUgcGFpcmVkLCBhcyBmcm9tIHN0ZW0gaGludHMsIHRoZQotICAgKiBib3R0b20gZWRnZSBtdXN0IGltbWVkaWF0ZWx5IHByZWNlZGUgdGhlIHRvcCBlZGdlIGluIHRoZSBhcnJheS4KLSAgICogRWxlbWVudCBjaGFyYWN0ZXIgc3BhY2UgQU5EIGRldmljZSBzcGFjZSBwb3NpdGlvbnMgbXVzdCBib3RoIGluY3JlYXNlCi0gICAqIG1vbm90b25pY2FsbHkgaW4gdGhlIGFycmF5LiAgYENGMl9IaW50JyBlbGVtZW50cyBhcmUgYWxzbyB1c2VkIGFzCi0gICAqIHBhcmFtZXRlcnMgdG8gYGNmMl9ibHVlc19jYXB0dXJlJy4KLSAgICoKLSAgICogVGhlIGBjZjJfaGludG1hcF9idWlsZCcgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgZHJhd2luZwotICAgKiBvcGVyYXRpb24gKGJlZ2lubmluZyB3aXRoIGEgTW92ZSBvcGVyYXRvcikgYW5kIGF0IGVhY2ggaGludAotICAgKiBzdWJzdGl0dXRpb24gKEhpbnRNYXNrIG9wZXJhdG9yKS4KLSAgICoKLSAgICogVGhlIGBjZjJfaGludG1hcF9tYXAnIG1ldGhvZCBpcyBjYWxsZWQgdG8gdHJhbnNmb3JtIHktY29vcmRpbmF0ZXMgYXQKLSAgICogZWFjaCBkcmF3aW5nIG9wZXJhdGlvbiAobW92ZSwgbGluZSwgY3VydmUpLgotICAgKgotICAgKi8KLQotICAvKiBUT0RPOiBtYWtlIHRoaXMgYSBDRjJfQXJyU3RhY2sgYW5kIGFkZCBhIGRlZXAgY29weSBtZXRob2QgKi8KLSAgZW51bQotICB7Ci0gICAgQ0YyX01BWF9ISU5UX0VER0VTID0gQ0YyX01BWF9ISU5UUyAqIDIKLSAgfTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfSGludE1hcFJlY18KLSAgewotICAgIENGMl9Gb250ICBmb250OwotCi0gICAgLyogaW5pdGlhbCBtYXAgYmFzZWQgb24gYmx1ZSB6b25lcyAqLwotICAgIHN0cnVjdCBDRjJfSGludE1hcFJlY18qICBpbml0aWFsSGludE1hcDsKLQotICAgIC8qIHdvcmtpbmcgc3RvcmFnZSBmb3IgMm5kIHBhc3MgYWRqdXN0SGludHMgKi8KLSAgICBDRjJfQXJyU3RhY2sgIGhpbnRNb3ZlczsKLQotICAgIEZUX0Jvb2wgIGlzVmFsaWQ7Ci0gICAgRlRfQm9vbCAgaGludGVkOwotCi0gICAgQ0YyX0ZpeGVkICBzY2FsZTsKLSAgICBDRjJfVUludCAgIGNvdW50OwotCi0gICAgLyogc3RhcnQgc2VhcmNoIGZyb20gdGhpcyBpbmRleCAqLwotICAgIENGMl9VSW50ICBsYXN0SW5kZXg7Ci0KLSAgICBDRjJfSGludFJlYyAgZWRnZVtDRjJfTUFYX0hJTlRfRURHRVNdOyAvKiAxOTIgKi8KLQotICB9IENGMl9IaW50TWFwUmVjLCAqQ0YyX0hpbnRNYXA7Ci0KLQotICBGVF9MT0NBTCggRlRfQm9vbCApCi0gIGNmMl9oaW50X2lzVmFsaWQoIGNvbnN0IENGMl9IaW50ICBoaW50ICk7Ci0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgY2YyX2hpbnRfaXNUb3AoIGNvbnN0IENGMl9IaW50ICBoaW50ICk7Ci0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgY2YyX2hpbnRfaXNCb3R0b20oIGNvbnN0IENGMl9IaW50ICBoaW50ICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2hpbnRfbG9jayggQ0YyX0hpbnQgIGhpbnQgKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2hpbnRtYXBfaW5pdCggQ0YyX0hpbnRNYXAgICBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICBDRjJfRm9udCAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgIENGMl9IaW50TWFwICAgaW5pdGlhbE1hcCwKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICBoaW50TW92ZXMsCi0gICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgc2NhbGUgKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfaGludG1hcF9idWlsZCggQ0YyX0hpbnRNYXAgICBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICBoU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9BcnJTdGFjayAgdlN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICBDRjJfSGludE1hc2sgIGhpbnRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICBoaW50T3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICBpbml0aWFsTWFwICk7Ci0KLQotICAvKgotICAgKiBHbHlwaFBhdGggaXMgYSB3cmFwcGVyIGZvciBkcmF3aW5nIG9wZXJhdGlvbnMgdGhhdCBzY2FsZXMgdGhlCi0gICAqIGNvb3JkaW5hdGVzIGFjY29yZGluZyB0byB0aGUgcmVuZGVyIG1hdHJpeCBhbmQgSGludE1hcC4gIEl0IGFsc28gdHJhY2tzCi0gICAqIG9wZW4gcGF0aHMgdG8gY29udHJvbCBDbG9zZVBhdGggYW5kIHRvIGluc2VydCBNb3ZlVG8gZm9yIGJyb2tlbiBmb250cy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfR2x5cGhQYXRoUmVjXwotICB7Ci0gICAgLyogVE9ETzogZ2F0aGVyIHNvbWUgb2YgdGhlc2UgaW50byBhIGhpbnRpbmcgY29udGV4dCAqLwotCi0gICAgQ0YyX0ZvbnQgICAgICAgICAgICAgIGZvbnQ7ICAgICAgICAgICAvKiBmb250IGluc3RhbmNlICAgICovCi0gICAgQ0YyX091dGxpbmVDYWxsYmFja3MgIGNhbGxiYWNrczsgICAgICAvKiBvdXRsaW5lIGNvbnN1bWVyICovCi0KLQotICAgIENGMl9IaW50TWFwUmVjICBoaW50TWFwOyAgICAgICAgLyogY3VycmVudCBoaW50IG1hcCAgICAgICAgICAgICovCi0gICAgQ0YyX0hpbnRNYXBSZWMgIGZpcnN0SGludE1hcDsgICAvKiBzYXZlZCBjb3B5ICAgICAgICAgICAgICAgICAgKi8KLSAgICBDRjJfSGludE1hcFJlYyAgaW5pdGlhbEhpbnRNYXA7IC8qIGJhc2VkIG9uIGFsbCBjYXB0dXJlZCBoaW50cyAqLwotCi0gICAgQ0YyX0FyclN0YWNrUmVjICBoaW50TW92ZXM7ICAvKiBsaXN0IG9mIGhpbnQgbW92ZXMgZm9yIDJuZCBwYXNzICovCi0KLSAgICBDRjJfRml4ZWQgIHNjYWxlWDsgICAgICAgICAvKiBtYXRyaXggYSAqLwotICAgIENGMl9GaXhlZCAgc2NhbGVDOyAgICAgICAgIC8qIG1hdHJpeCBjICovCi0gICAgQ0YyX0ZpeGVkICBzY2FsZVk7ICAgICAgICAgLyogbWF0cml4IGQgKi8KLQotICAgIEZUX1ZlY3RvciAgZnJhY3Rpb25hbFRyYW5zbGF0aW9uOyAgLyogaW5jbHVkaW5nIGRldmljZVhTY2FsZSAqLwotI2lmIDAKLSAgICBDRjJfRml4ZWQgIGhTaGlmdDsgICAgLyogY2hhcmFjdGVyIHNwYWNlIGhvcml6b250YWwgc2hpZnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGZvciBmYXV4aW5nKSAgICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZgotCi0gICAgRlRfQm9vbCAgcGF0aElzT3BlbjsgICAgIC8qIHRydWUgYWZ0ZXIgTW92ZVRvICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICBwYXRoSXNDbG9zaW5nOyAgLyogdHJ1ZSB3aGVuIHN5bnRoZXNpemluZyBjbG9zZXBhdGggbGluZSAqLwotICAgIEZUX0Jvb2wgIGRhcmtlbjsgICAgICAgICAvKiB0cnVlIGlmIHN0ZW0gZGFya2VuaW5nICAgICAgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgbW92ZUlzUGVuZGluZzsgIC8qIHRydWUgYmV0d2VlbiBNb3ZlVG8gYW5kIG9mZnNldCBNb3ZlVG8gKi8KLQotICAgIC8qIHJlZmVyZW5jZXMgdXNlZCB0byBjYWxsIGBjZjJfaGludG1hcF9idWlsZCcsIGlmIG5lY2Vzc2FyeSAqLwotICAgIENGMl9BcnJTdGFjayAgICAgICAgIGhTdGVtSGludEFycmF5OwotICAgIENGMl9BcnJTdGFjayAgICAgICAgIHZTdGVtSGludEFycmF5OwotICAgIENGMl9IaW50TWFzayAgICAgICAgIGhpbnRNYXNrOyAgICAgLyogcHRyIHRvIHRoZSBjdXJyZW50IG1hc2sgKi8KLSAgICBDRjJfRml4ZWQgICAgICAgICAgICBoaW50T3JpZ2luWTsgIC8qIGNvcHkgb2YgY3VycmVudCBvcmlnaW4gICovCi0gICAgY29uc3QgQ0YyX0JsdWVzUmVjKiAgYmx1ZXM7Ci0KLSAgICBDRjJfRml4ZWQgIHhPZmZzZXQ7ICAgICAgICAvKiBjaGFyYWN0ZXIgc3BhY2Ugb2Zmc2V0cyAqLwotICAgIENGMl9GaXhlZCAgeU9mZnNldDsKLQotICAgIC8qIGNoYXJhY3RlciBzcGFjZSBtaXRlciBsaW1pdCB0aHJlc2hvbGQgKi8KLSAgICBDRjJfRml4ZWQgIG1pdGVyTGltaXQ7Ci0gICAgLyogdmVydGljYWwvaG9yaXpvbnRhbCBzbmFwIGRpc3RhbmNlIGluIGNoYXJhY3RlciBzcGFjZSAqLwotICAgIENGMl9GaXhlZCAgc25hcFRocmVzaG9sZDsKLQotICAgIEZUX1ZlY3RvciAgb2Zmc2V0U3RhcnQwOyAgLyogZmlyc3QgYW5kIHNlY29uZCBwb2ludHMgb2YgZmlyc3QgKi8KLSAgICBGVF9WZWN0b3IgIG9mZnNldFN0YXJ0MTsgIC8qIGVsZW1lbnQgd2l0aCBvZmZzZXQgYXBwbGllZCAgICAgICovCi0KLSAgICAvKiBjdXJyZW50IHBvaW50LCBjaGFyYWN0ZXIgc3BhY2UsIGJlZm9yZSBvZmZzZXQgKi8KLSAgICBGVF9WZWN0b3IgIGN1cnJlbnRDUzsKLSAgICAvKiBjdXJyZW50IHBvaW50LCBkZXZpY2Ugc3BhY2UgKi8KLSAgICBGVF9WZWN0b3IgIGN1cnJlbnREUzsKLSAgICAvKiBzdGFydCBwb2ludCBvZiBzdWJwYXRoLCBjaGFyYWN0ZXIgc3BhY2UgKi8KLSAgICBGVF9WZWN0b3IgIHN0YXJ0OwotCi0gICAgLyogdGhlIGZvbGxvd2luZyBtZW1iZXJzIGNvbnN0aXR1dGUgdGhlIGBxdWV1ZScgb2Ygb25lIGVsZW1lbnQgKi8KLSAgICBGVF9Cb29sICBlbGVtSXNRdWV1ZWQ7Ci0gICAgQ0YyX0ludCAgcHJldkVsZW1PcDsKLQotICAgIEZUX1ZlY3RvciAgcHJldkVsZW1QMDsKLSAgICBGVF9WZWN0b3IgIHByZXZFbGVtUDE7Ci0gICAgRlRfVmVjdG9yICBwcmV2RWxlbVAyOwotICAgIEZUX1ZlY3RvciAgcHJldkVsZW1QMzsKLQotICB9IENGMl9HbHlwaFBhdGhSZWMsICpDRjJfR2x5cGhQYXRoOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfZ2x5cGhwYXRoX2luaXQoIENGMl9HbHlwaFBhdGggICAgICAgICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZvbnQgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX091dGxpbmVDYWxsYmFja3MgIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICAgICAgICAgc2NhbGVZLAotICAgICAgICAgICAgICAgICAgICAgIC8qIENGMl9GaXhlZCBoU2hpZnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICAgICAgICAgIGhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgIENGMl9BcnJTdGFjayAgICAgICAgICB2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfSGludE1hc2sgICAgICAgICAgaGludE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgICAgICAgIGhpbnRPcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0YyX0JsdWVzICAgICAgIGJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogICAgICBmcmFjdGlvbmFsVHJhbnNsYXRpb24gKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfZ2x5cGhwYXRoX2ZpbmFsaXplKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGggKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfbW92ZVRvKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeSApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfbGluZVRvKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeSApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfY3VydmVUbyggQ0YyX0dseXBoUGF0aCAgZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHkzICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2dseXBocGF0aF9jbG9zZU9wZW5QYXRoKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGggKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIENGMkhJTlRTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmMmludHJwLmMgYi9zcmMvY2ZmL2NmMmludHJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTYyODAuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJpbnRycC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJpbnRycC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBDRkYgSW50ZXJwcmV0ZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJjZjJnbHVlLmgiCi0jaW5jbHVkZSAiY2YyZm9udC5oIgotI2luY2x1ZGUgImNmMnN0YWNrLmgiCi0jaW5jbHVkZSAiY2YyaGludHMuaCIKLSNpbmNsdWRlICJjZjJpbnRycC5oIgotCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLQotI2luY2x1ZGUgImNmZmxvYWQuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmMmludGVycAotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2hpbnRtYXNrX2luaXQoIENGMl9IaW50TWFzayAgaGludG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogICAgIGVycm9yICkKLSAgewotICAgIEZUX1pFUk8oIGhpbnRtYXNrICk7Ci0KLSAgICBoaW50bWFzay0+ZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgY2YyX2hpbnRtYXNrX2lzVmFsaWQoIGNvbnN0IENGMl9IaW50TWFzayAgaGludG1hc2sgKQotICB7Ci0gICAgcmV0dXJuIGhpbnRtYXNrLT5pc1ZhbGlkOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQotICBjZjJfaGludG1hc2tfaXNOZXcoIGNvbnN0IENGMl9IaW50TWFzayAgaGludG1hc2sgKQotICB7Ci0gICAgcmV0dXJuIGhpbnRtYXNrLT5pc05ldzsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2hpbnRtYXNrX3NldE5ldyggQ0YyX0hpbnRNYXNrICBoaW50bWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICB2YWwgKQotICB7Ci0gICAgaGludG1hc2stPmlzTmV3ID0gdmFsOwotICB9Ci0KLQotICAvKiBjbGllbnRzIGNhbGwgYGdldE1hc2tQdHInIGluIG9yZGVyIHRvIGl0ZXJhdGUgKi8KLSAgLyogdGhyb3VnaCBoaW50IG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9CeXRlKiApCi0gIGNmMl9oaW50bWFza19nZXRNYXNrUHRyKCBDRjJfSGludE1hc2sgIGhpbnRtYXNrICkKLSAgewotICAgIHJldHVybiBoaW50bWFzay0+bWFzazsKLSAgfQotCi0KLSAgc3RhdGljIHNpemVfdAotICBjZjJfaGludG1hc2tfc2V0Q291bnRzKCBDRjJfSGludE1hc2sgIGhpbnRtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgIGJpdENvdW50ICkKLSAgewotICAgIGlmICggYml0Q291bnQgPiBDRjJfTUFYX0hJTlRTICkKLSAgICB7Ci0gICAgICAvKiB0b3RhbCBvZiBoIGFuZCB2IHN0ZW1zIG11c3QgYmUgPD0gOTYgKi8KLSAgICAgIENGMl9TRVRfRVJST1IoIGhpbnRtYXNrLT5lcnJvciwgSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGhpbnRtYXNrLT5iaXRDb3VudCAgPSBiaXRDb3VudDsKLSAgICBoaW50bWFzay0+Ynl0ZUNvdW50ID0gKCBoaW50bWFzay0+Yml0Q291bnQgKyA3ICkgLyA4OwotCi0gICAgaGludG1hc2stPmlzVmFsaWQgPSBUUlVFOwotICAgIGhpbnRtYXNrLT5pc05ldyAgID0gVFJVRTsKLQotICAgIHJldHVybiBiaXRDb3VudDsKLSAgfQotCi0KLSAgLyogY29uc3VtZSB0aGUgaGludG1hc2sgYnl0ZXMgZnJvbSB0aGUgY2hhcnN0cmluZywgYWR2YW5jaW5nIHRoZSBzcmMgKi8KLSAgLyogcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2hpbnRtYXNrX3JlYWQoIENGMl9IaW50TWFzayAgaGludG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICBDRjJfQnVmZmVyICAgIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgIGJpdENvdW50ICkKLSAgewotICAgIHNpemVfdCAgaTsKLQotI2lmbmRlZiBDRjJfTkRFQlVHCi0gICAgLyogdGhlc2UgYXJlIHRoZSBiaXRzIGluIHRoZSBmaW5hbCBtYXNrIGJ5dGUgdGhhdCBzaG91bGQgYmUgemVybyAgKi8KLSAgICAvKiBOb3RlOiB0aGlzIHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBpbiBhbiBhc3NlcnQgZXhwcmVzc2lvbiBiZWxvdyAqLwotICAgIC8qIGFuZCB0aGVuIG9ubHkgaWYgQ0YyX05ERUJVRyBpcyBub3QgZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQ0YyX1VJbnQgIG1hc2sgPSAoIDEgPDwgKCAtKENGMl9JbnQpYml0Q291bnQgJiA3ICkgKSAtIDE7Ci0jZW5kaWYKLQotCi0gICAgLyogaW5pdGlhbGl6ZSBjb3VudHMgYW5kIGlzVmFsaWQgKi8KLSAgICBpZiAoIGNmMl9oaW50bWFza19zZXRDb3VudHMoIGhpbnRtYXNrLCBiaXRDb3VudCApID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gICAgRlRfQVNTRVJUKCBoaW50bWFzay0+Ynl0ZUNvdW50ID4gMCApOwotCi0gICAgRlRfVFJBQ0U0KCggIiAobWFza2J5dGVzOiIgKSk7Ci0KLSAgICAvKiBzZXQgbWFzayBhbmQgYWR2YW5jZSBpbnRlcnByZXRlcidzIGNoYXJzdHJpbmcgcG9pbnRlciAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgaGludG1hc2stPmJ5dGVDb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBoaW50bWFzay0+bWFza1tpXSA9IChGVF9CeXRlKWNmMl9idWZfcmVhZEJ5dGUoIGNoYXJzdHJpbmcgKTsKLSAgICAgIEZUX1RSQUNFNCgoICIgMHglMDJYIiwgaGludG1hc2stPm1hc2tbaV0gKSk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U0KCggIilcbiIgKSk7Ci0KLSAgICAvKiBhc3NlcnQgYW55IHVudXNlZCBiaXRzIGluIGxhc3QgYnl0ZSBhcmUgemVybyB1bmxlc3MgdGhlcmUncyBhIHByaW9yICovCi0gICAgLyogZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIGJpdENvdW50IC0+IG1hc2ssIDAgLT4gMCwgMSAtPiA3ZiwgMiAtPiAzZiwgLi4uIDYgLT4gMywgNyAtPiAxICAgICAgKi8KLSNpZm5kZWYgQ0YyX05ERUJVRwotICAgIEZUX0FTU0VSVCggKCBoaW50bWFzay0+bWFza1toaW50bWFzay0+Ynl0ZUNvdW50IC0gMV0gJiBtYXNrICkgPT0gMCB8fAotICAgICAgICAgICAgICAgKmhpbnRtYXNrLT5lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotI2VuZGlmCi0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9oaW50bWFza19zZXRBbGwoIENGMl9IaW50TWFzayAgaGludG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgYml0Q291bnQgKQotICB7Ci0gICAgc2l6ZV90ICAgIGk7Ci0gICAgQ0YyX1VJbnQgIG1hc2sgPSAoIDEgPDwgKCAtKENGMl9JbnQpYml0Q291bnQgJiA3ICkgKSAtIDE7Ci0KLQotICAgIC8qIGluaXRpYWxpemUgY291bnRzIGFuZCBpc1ZhbGlkICovCi0gICAgaWYgKCBjZjJfaGludG1hc2tfc2V0Q291bnRzKCBoaW50bWFzaywgYml0Q291bnQgKSA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIEZUX0FTU0VSVCggaGludG1hc2stPmJ5dGVDb3VudCA+IDAgKTsKLSAgICBGVF9BU1NFUlQoIGhpbnRtYXNrLT5ieXRlQ291bnQgPD0KLSAgICAgICAgICAgICAgICAgc2l6ZW9mICggaGludG1hc2stPm1hc2sgKSAvIHNpemVvZiAoIGhpbnRtYXNrLT5tYXNrWzBdICkgKTsKLQotICAgIC8qIHNldCBtYXNrIHRvIGFsbCBvbmVzICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBoaW50bWFzay0+Ynl0ZUNvdW50OyBpKysgKQotICAgICAgaGludG1hc2stPm1hc2tbaV0gPSAweEZGOwotCi0gICAgLyogY2xlYXIgdW51c2VkIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBiaXRDb3VudCAtPiBtYXNrLCAwIC0+IDAsIDEgLT4gN2YsIDIgLT4gM2YsIC4uLiA2IC0+IDMsIDcgLT4gMSAqLwotICAgIGhpbnRtYXNrLT5tYXNrW2hpbnRtYXNrLT5ieXRlQ291bnQgLSAxXSAmPSB+bWFzazsKLSAgfQotCi0KLSAgLyogVHlwZTIgY2hhcnN0cmluZyBvcGNvZGVzICovCi0gIGVudW0KLSAgewotICAgIGNmMl9jbWRSRVNFUlZFRF8wLCAgIC8qIDAgKi8KLSAgICBjZjJfY21kSFNURU0sICAgICAgICAvKiAxICovCi0gICAgY2YyX2NtZFJFU0VSVkVEXzIsICAgLyogMiAqLwotICAgIGNmMl9jbWRWU1RFTSwgICAgICAgIC8qIDMgKi8KLSAgICBjZjJfY21kVk1PVkVUTywgICAgICAvKiA0ICovCi0gICAgY2YyX2NtZFJMSU5FVE8sICAgICAgLyogNSAqLwotICAgIGNmMl9jbWRITElORVRPLCAgICAgIC8qIDYgKi8KLSAgICBjZjJfY21kVkxJTkVUTywgICAgICAvKiA3ICovCi0gICAgY2YyX2NtZFJSQ1VSVkVUTywgICAgLyogOCAqLwotICAgIGNmMl9jbWRSRVNFUlZFRF85LCAgIC8qIDkgKi8KLSAgICBjZjJfY21kQ0FMTFNVQlIsICAgICAvKiAxMCAqLwotICAgIGNmMl9jbWRSRVRVUk4sICAgICAgIC8qIDExICovCi0gICAgY2YyX2NtZEVTQywgICAgICAgICAgLyogMTIgKi8KLSAgICBjZjJfY21kUkVTRVJWRURfMTMsICAvKiAxMyAqLwotICAgIGNmMl9jbWRFTkRDSEFSLCAgICAgIC8qIDE0ICovCi0gICAgY2YyX2NtZFZTSU5ERVgsICAgICAgLyogMTUgKi8KLSAgICBjZjJfY21kQkxFTkQsICAgICAgICAvKiAxNiAqLwotICAgIGNmMl9jbWRSRVNFUlZFRF8xNywgIC8qIDE3ICovCi0gICAgY2YyX2NtZEhTVEVNSE0sICAgICAgLyogMTggKi8KLSAgICBjZjJfY21kSElOVE1BU0ssICAgICAvKiAxOSAqLwotICAgIGNmMl9jbWRDTlRSTUFTSywgICAgIC8qIDIwICovCi0gICAgY2YyX2NtZFJNT1ZFVE8sICAgICAgLyogMjEgKi8KLSAgICBjZjJfY21kSE1PVkVUTywgICAgICAvKiAyMiAqLwotICAgIGNmMl9jbWRWU1RFTUhNLCAgICAgIC8qIDIzICovCi0gICAgY2YyX2NtZFJDVVJWRUxJTkUsICAgLyogMjQgKi8KLSAgICBjZjJfY21kUkxJTkVDVVJWRSwgICAvKiAyNSAqLwotICAgIGNmMl9jbWRWVkNVUlZFVE8sICAgIC8qIDI2ICovCi0gICAgY2YyX2NtZEhIQ1VSVkVUTywgICAgLyogMjcgKi8KLSAgICBjZjJfY21kRVhURU5ERUROTUJSLCAvKiAyOCAqLwotICAgIGNmMl9jbWRDQUxMR1NVQlIsICAgIC8qIDI5ICovCi0gICAgY2YyX2NtZFZIQ1VSVkVUTywgICAgLyogMzAgKi8KLSAgICBjZjJfY21kSFZDVVJWRVRPICAgICAvKiAzMSAqLwotICB9OwotCi0gIGVudW0KLSAgewotICAgIGNmMl9lc2NET1RTRUNUSU9OLCAgIC8qIDAgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMSwgICAvKiAxICovCi0gICAgY2YyX2VzY1JFU0VSVkVEXzIsICAgLyogMiAqLwotICAgIGNmMl9lc2NBTkQsICAgICAgICAgIC8qIDMgKi8KLSAgICBjZjJfZXNjT1IsICAgICAgICAgICAvKiA0ICovCi0gICAgY2YyX2VzY05PVCwgICAgICAgICAgLyogNSAqLwotICAgIGNmMl9lc2NSRVNFUlZFRF82LCAgIC8qIDYgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfNywgICAvKiA3ICovCi0gICAgY2YyX2VzY1JFU0VSVkVEXzgsICAgLyogOCAqLwotICAgIGNmMl9lc2NBQlMsICAgICAgICAgIC8qIDkgKi8KLSAgICBjZjJfZXNjQURELCAgICAgICAgICAvKiAxMCAgICAgbGlrZSBvdGhlckFERCAqLwotICAgIGNmMl9lc2NTVUIsICAgICAgICAgIC8qIDExICAgICBsaWtlIG90aGVyU1VCICovCi0gICAgY2YyX2VzY0RJViwgICAgICAgICAgLyogMTIgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMTMsICAvKiAxMyAqLwotICAgIGNmMl9lc2NORUcsICAgICAgICAgIC8qIDE0ICovCi0gICAgY2YyX2VzY0VRLCAgICAgICAgICAgLyogMTUgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMTYsICAvKiAxNiAqLwotICAgIGNmMl9lc2NSRVNFUlZFRF8xNywgIC8qIDE3ICovCi0gICAgY2YyX2VzY0RST1AsICAgICAgICAgLyogMTggKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMTksICAvKiAxOSAqLwotICAgIGNmMl9lc2NQVVQsICAgICAgICAgIC8qIDIwICAgICBsaWtlIG90aGVyUFVUICAgICovCi0gICAgY2YyX2VzY0dFVCwgICAgICAgICAgLyogMjEgICAgIGxpa2Ugb3RoZXJHRVQgICAgKi8KLSAgICBjZjJfZXNjSUZFTFNFLCAgICAgICAvKiAyMiAgICAgbGlrZSBvdGhlcklGRUxTRSAqLwotICAgIGNmMl9lc2NSQU5ET00sICAgICAgIC8qIDIzICAgICBsaWtlIG90aGVyUkFORE9NICovCi0gICAgY2YyX2VzY01VTCwgICAgICAgICAgLyogMjQgICAgIGxpa2Ugb3RoZXJNVUwgICAgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMjUsICAvKiAyNSAqLwotICAgIGNmMl9lc2NTUVJULCAgICAgICAgIC8qIDI2ICovCi0gICAgY2YyX2VzY0RVUCwgICAgICAgICAgLyogMjcgICAgIGxpa2Ugb3RoZXJEVVAgICAgKi8KLSAgICBjZjJfZXNjRVhDSCwgICAgICAgICAvKiAyOCAgICAgbGlrZSBvdGhlckVYQ0ggICAqLwotICAgIGNmMl9lc2NJTkRFWCwgICAgICAgIC8qIDI5ICovCi0gICAgY2YyX2VzY1JPTEwsICAgICAgICAgLyogMzAgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMzEsICAvKiAzMSAqLwotICAgIGNmMl9lc2NSRVNFUlZFRF8zMiwgIC8qIDMyICovCi0gICAgY2YyX2VzY1JFU0VSVkVEXzMzLCAgLyogMzMgKi8KLSAgICBjZjJfZXNjSEZMRVgsICAgICAgICAvKiAzNCAqLwotICAgIGNmMl9lc2NGTEVYLCAgICAgICAgIC8qIDM1ICovCi0gICAgY2YyX2VzY0hGTEVYMSwgICAgICAgLyogMzYgKi8KLSAgICBjZjJfZXNjRkxFWDEsICAgICAgICAvKiAzNyAqLwotICAgIGNmMl9lc2NSRVNFUlZFRF8zOCAgIC8qIDM4ICAgICAmIGFsbCBoaWdoZXIgICAgICovCi0gIH07Ci0KLQotICAvKiBgc3RlbUhpbnRBcnJheScgZG9lcyBub3QgY2hhbmdlIG9uY2Ugd2Ugc3RhcnQgZHJhd2luZyB0aGUgb3V0bGluZS4gKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2RvU3RlbXMoIGNvbnN0IENGMl9Gb250ICBmb250LAotICAgICAgICAgICAgICAgQ0YyX1N0YWNrICAgICAgIG9wU3RhY2ssCi0gICAgICAgICAgICAgICBDRjJfQXJyU3RhY2sgICAgc3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgIENGMl9GaXhlZCogICAgICB3aWR0aCwKLSAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgICAgICBoYXZlV2lkdGgsCi0gICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICAgaGludE9mZnNldCApCi0gIHsKLSAgICBDRjJfVUludCAgaTsKLSAgICBDRjJfVUludCAgY291bnQgICAgICAgPSBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKTsKLSAgICBGVF9Cb29sICAgaGFzV2lkdGhBcmcgPSAoRlRfQm9vbCkoIGNvdW50ICYgMSApOwotCi0gICAgLyogdmFyaWFibGUgYWNjdW11bGF0ZXMgZGVsdGEgdmFsdWVzIGZyb20gb3BlcmFuZCBzdGFjayAqLwotICAgIENGMl9GaXhlZCAgcG9zaXRpb24gPSBoaW50T2Zmc2V0OwotCi0KLSAgICBpZiAoIGhhc1dpZHRoQXJnICYmICEqaGF2ZVdpZHRoICkKLSAgICAgICp3aWR0aCA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCAwICkgKwotICAgICAgICAgICAgICAgICBjZjJfZ2V0Tm9taW5hbFdpZHRoWCggZm9udC0+ZGVjb2RlciApOwotCi0gICAgaWYgKCBmb250LT5kZWNvZGVyLT53aWR0aF9vbmx5ICkKLSAgICAgIGdvdG8gZXhpdDsKLQotICAgIGZvciAoIGkgPSBoYXNXaWR0aEFyZyA/IDEgOiAwOyBpIDwgY291bnQ7IGkgKz0gMiApCi0gICAgewotICAgICAgLyogY29uc3RydWN0IGEgQ0YyX1N0ZW1IaW50IGFuZCBwdXNoIGl0IG9udG8gdGhlIGxpc3QgKi8KLSAgICAgIENGMl9TdGVtSGludFJlYyAgc3RlbWhpbnQ7Ci0KLQotICAgICAgc3RlbWhpbnQubWluID0KLSAgICAgIHBvc2l0aW9uICAgICA9IEFERF9JTlQzMiggcG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpICkgKTsKLSAgICAgIHN0ZW1oaW50Lm1heCA9Ci0gICAgICBwb3NpdGlvbiAgICAgPSBBRERfSU5UMzIoIHBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaSArIDEgKSApOwotCi0gICAgICBzdGVtaGludC51c2VkICA9IEZBTFNFOwotICAgICAgc3RlbWhpbnQubWF4RFMgPQotICAgICAgc3RlbWhpbnQubWluRFMgPSAwOwotCi0gICAgICBjZjJfYXJyc3RhY2tfcHVzaCggc3RlbUhpbnRBcnJheSwgJnN0ZW1oaW50ICk7IC8qIGRlZmVyIGVycm9yIGNoZWNrICovCi0gICAgfQotCi0gICAgY2YyX3N0YWNrX2NsZWFyKCBvcFN0YWNrICk7Ci0KLSAgZXhpdDoKLSAgICAvKiBjZjJfZG9TdGVtcyBtdXN0IGRlZmluZSBhIHdpZHRoIChtYXkgYmUgZGVmYXVsdCkgKi8KLSAgICAqaGF2ZVdpZHRoID0gVFJVRTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2RvRmxleCggQ0YyX1N0YWNrICAgICAgIG9wU3RhY2ssCi0gICAgICAgICAgICAgIENGMl9GaXhlZCogICAgICBjdXJYLAotICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgICAgY3VyWSwKLSAgICAgICAgICAgICAgQ0YyX0dseXBoUGF0aCAgIGdseXBoUGF0aCwKLSAgICAgICAgICAgICAgY29uc3QgRlRfQm9vbCogIHJlYWRGcm9tU3RhY2ssCi0gICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkb0NvbmRpdGlvbmFsTGFzdFJlYWQgKQotICB7Ci0gICAgQ0YyX0ZpeGVkICB2YWxzWzE0XTsKLSAgICBDRjJfVUludCAgIGlkeDsKLSAgICBGVF9Cb29sICAgIGlzSEZsZXg7Ci0gICAgQ0YyX0ludCAgICB0b3AsIGksIGo7Ci0KLQotICAgIHZhbHNbMF0gPSAqY3VyWDsKLSAgICB2YWxzWzFdID0gKmN1clk7Ci0gICAgaWR4ICAgICA9IDA7Ci0gICAgaXNIRmxleCA9IEZUX0JPT0woIHJlYWRGcm9tU3RhY2tbOV0gPT0gRkFMU0UgKTsKLSAgICB0b3AgICAgID0gaXNIRmxleCA/IDkgOiAxMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgdG9wOyBpKysgKQotICAgIHsKLSAgICAgIHZhbHNbaSArIDJdID0gdmFsc1tpXTsKLSAgICAgIGlmICggcmVhZEZyb21TdGFja1tpXSApCi0gICAgICAgIHZhbHNbaSArIDJdID0gQUREX0lOVDMyKCB2YWxzW2kgKyAyXSwgY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrICkgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGlzSEZsZXggKQotICAgICAgdmFsc1s5ICsgMl0gPSAqY3VyWTsKLQotICAgIGlmICggZG9Db25kaXRpb25hbExhc3RSZWFkICkKLSAgICB7Ci0gICAgICBGVF9Cb29sICAgIGxhc3RJc1ggPSAoRlRfQm9vbCkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9maXhlZEFicyggU1VCX0lOVDMyKCB2YWxzWzEwXSwgKmN1clggKSApID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2ZpeGVkQWJzKCBTVUJfSU5UMzIoIHZhbHNbMTFdLCAqY3VyWSApICkgKTsKLSAgICAgIENGMl9GaXhlZCAgbGFzdFZhbCA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKTsKLQotCi0gICAgICBpZiAoIGxhc3RJc1ggKQotICAgICAgewotICAgICAgICB2YWxzWzEyXSA9IEFERF9JTlQzMiggdmFsc1sxMF0sIGxhc3RWYWwgKTsKLSAgICAgICAgdmFsc1sxM10gPSAqY3VyWTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmFsc1sxMl0gPSAqY3VyWDsKLSAgICAgICAgdmFsc1sxM10gPSBBRERfSU5UMzIoIHZhbHNbMTFdLCBsYXN0VmFsICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIHJlYWRGcm9tU3RhY2tbMTBdICkKLSAgICAgICAgdmFsc1sxMl0gPSBBRERfSU5UMzIoIHZhbHNbMTBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCsrICkgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgdmFsc1sxMl0gPSAqY3VyWDsKLQotICAgICAgaWYgKCByZWFkRnJvbVN0YWNrWzExXSApCi0gICAgICAgIHZhbHNbMTNdID0gQUREX0lOVDMyKCB2YWxzWzExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKSApOwotICAgICAgZWxzZQotICAgICAgICB2YWxzWzEzXSA9ICpjdXJZOwotICAgIH0KLQotICAgIGZvciAoIGogPSAwOyBqIDwgMjsgaisrICkKLSAgICAgIGNmMl9nbHlwaHBhdGhfY3VydmVUbyggZ2x5cGhQYXRoLCB2YWxzW2ogKiA2ICsgMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsc1tqICogNiArIDNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNbaiAqIDYgKyA0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzW2ogKiA2ICsgNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsc1tqICogNiArIDZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNbaiAqIDYgKyA3XSApOwotCi0gICAgY2YyX3N0YWNrX2NsZWFyKCBvcFN0YWNrICk7Ci0KLSAgICAqY3VyWCA9IHZhbHNbMTJdOwotICAgICpjdXJZID0gdmFsc1sxM107Ci0gIH0KLQotCi0gIC8qIEJsZW5kIG51bU9wZXJhbmRzIG9uIHRoZSBzdGFjaywgICAgICAgICAgICAgICAgKi8KLSAgLyogc3RvcmUgcmVzdWx0cyBpbnRvIHRoZSBmaXJzdCBudW1CbGVuZHMgdmFsdWVzLCAqLwotICAvKiB0aGVuIHBvcCByZW1haW5pbmcgYXJndW1lbnRzLiAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9kb0JsZW5kKCBjb25zdCBDRkZfQmxlbmQgIGJsZW5kLAotICAgICAgICAgICAgICAgQ0YyX1N0YWNrICAgICAgICBvcFN0YWNrLAotICAgICAgICAgICAgICAgQ0YyX1VJbnQgICAgICAgICBudW1CbGVuZHMgKQotICB7Ci0gICAgQ0YyX1VJbnQgIGRlbHRhOwotICAgIENGMl9VSW50ICBiYXNlOwotICAgIENGMl9VSW50ICBpLCBqOwotICAgIENGMl9VSW50ICBudW1PcGVyYW5kcyA9IChDRjJfVUludCkoIG51bUJsZW5kcyAqIGJsZW5kLT5sZW5CViApOwotCi0KLSAgICBiYXNlICA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApIC0gbnVtT3BlcmFuZHM7Ci0gICAgZGVsdGEgPSBiYXNlICsgbnVtQmxlbmRzOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1CbGVuZHM7IGkrKyApCi0gICAgewotICAgICAgY29uc3QgQ0YyX0ZpeGVkKiAgd2VpZ2h0ID0gJmJsZW5kLT5CVlsxXTsKLQotICAgICAgLyogc3RhcnQgd2l0aCBmaXJzdCB0ZXJtICovCi0gICAgICBDRjJfRml4ZWQgIHN1bSA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpICsgYmFzZSApOwotCi0KLSAgICAgIGZvciAoIGogPSAxOyBqIDwgYmxlbmQtPmxlbkJWOyBqKysgKQotICAgICAgICBzdW0gPSBBRERfSU5UMzIoIHN1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoICp3ZWlnaHQrKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhKysgKSApICk7Ci0KLSAgICAgIC8qIHN0b3JlIGJsZW5kZWQgcmVzdWx0ICAqLwotICAgICAgY2YyX3N0YWNrX3NldFJlYWwoIG9wU3RhY2ssIGkgKyBiYXNlLCBzdW0gKTsKLSAgICB9Ci0KLSAgICAvKiBsZWF2ZSBvbmx5IGBudW1CbGVuZHMnIHJlc3VsdHMgb24gc3RhY2sgKi8KLSAgICBjZjJfc3RhY2tfcG9wKCBvcFN0YWNrLCBudW1PcGVyYW5kcyAtIG51bUJsZW5kcyApOwotICB9Ci0KLQotICAvKgotICAgKiBgZXJyb3InIGlzIGEgc2hhcmVkIGVycm9yIGNvZGUgdXNlZCBieSBtYW55IG9iamVjdHMgaW4gdGhpcwotICAgKiByb3V0aW5lLiAgQmVmb3JlIHRoZSBjb2RlIGNvbnRpbnVlcyBmcm9tIGFuIGVycm9yLCBpdCBtdXN0IGNoZWNrIGFuZAotICAgKiByZWNvcmQgdGhlIGVycm9yIGluIGAqZXJyb3InLiAgVGhlIGlkZWEgaXMgdGhhdCB0aGlzIHNoYXJlZAotICAgKiBlcnJvciBjb2RlIHdpbGwgcmVjb3JkIHRoZSBmaXJzdCBlcnJvciBlbmNvdW50ZXJlZC4gIElmIHRlc3RpbmcKLSAgICogZm9yIGFuIGVycm9yIGFueXdheSwgdGhlIGNvc3Qgb2YgYGdvdG8gZXhpdCcgaXMgc21hbGwsIHNvIHdlIGRvIGl0LAotICAgKiBldmVuIGlmIGNvbnRpbnVpbmcgd291bGQgYmUgc2FmZS4gIEluIHRoaXMgY2FzZSwgYGxhc3RFcnJvcicgaXMKLSAgICogc2V0LCBzbyB0aGUgdGVzdGluZyBhbmQgc3RvcmluZyBjYW4gYmUgZG9uZSBpbiBvbmUgcGxhY2UsIGF0IGBleGl0Jy4KLSAgICoKLSAgICogQ29udGludWluZyBhZnRlciBhbiBlcnJvciBpcyBpbnRlbmRlZCBmb3Igb2JqZWN0cyB3aGljaCBkbyB0aGVpciBvd24KLSAgICogdGVzdGluZyBvZiBgKmVycm9yJywgZS5nLiwgYXJyYXkgc3RhY2sgZnVuY3Rpb25zLiAgVGhpcyBhbGxvd3MgdXMgdG8KLSAgICogYXZvaWQgYW4gZXh0cmEgdGVzdCBhZnRlciB0aGUgY2FsbC4KLSAgICoKLSAgICogVW5pbXBsZW1lbnRlZCBvcGNvZGVzIGFyZSBpZ25vcmVkLgotICAgKgotICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2ludGVycFQyQ2hhclN0cmluZyggQ0YyX0ZvbnQgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgICAgICAgICBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9PdXRsaW5lQ2FsbGJhY2tzICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogICAgICB0cmFuc2xhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgICAgIGRvaW5nU2VhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgICAgICAgIGN1clgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgICAgICAgICBjdXJZLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgICAgICAgICAgd2lkdGggKQotICB7Ci0gICAgLyogbGFzdEVycm9yIGlzIHVzZWQgZm9yIGVycm9ycyB0aGF0IGFyZSBpbW1lZGlhdGVseSB0ZXN0ZWQgKi8KLSAgICBGVF9FcnJvciAgbGFzdEVycm9yID0gRlRfRXJyX09rOwotCi0gICAgLyogcG9pbnRlciB0byBwYXJzZWQgZm9udCBvYmplY3QgKi8KLSAgICBDRkZfRGVjb2RlciogIGRlY29kZXIgPSBmb250LT5kZWNvZGVyOwotCi0gICAgRlRfRXJyb3IqICBlcnJvciAgPSAmZm9udC0+ZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmb250LT5tZW1vcnk7Ci0KLSAgICBDRjJfRml4ZWQgIHNjYWxlWSAgICAgICAgPSBmb250LT5pbm5lclRyYW5zZm9ybS5kOwotICAgIENGMl9GaXhlZCAgbm9taW5hbFdpZHRoWCA9IGNmMl9nZXROb21pbmFsV2lkdGhYKCBkZWNvZGVyICk7Ci0KLSAgICAvKiBzYXZlIHRoaXMgZm9yIGhpbnRpbmcgc2VhYyBhY2NlbnRzICovCi0gICAgQ0YyX0ZpeGVkICBoaW50T3JpZ2luWSA9IGN1clk7Ci0KLSAgICBDRjJfU3RhY2sgIG9wU3RhY2sgPSBOVUxMOwotICAgIEZUX1VJbnQgICAgc3RhY2tTaXplOwotICAgIEZUX0J5dGUgICAgb3AxOyAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3Qgb3Bjb2RlIGJ5dGUgKi8KLQotICAgIENGMl9GMTZEb3QxNiAgc3RvcmFnZVtDRjJfU1RPUkFHRV9TSVpFXTsgICAgLyogZm9yIGBwdXQnIGFuZCBgZ2V0JyAqLwotCi0gICAgLyogaW5zdHJ1Y3Rpb24gbGltaXQ7IDIwLDAwMCwwMDAgbWF0Y2hlcyBBdmFsb24gKi8KLSAgICBGVF9VSW50MzIgIGluc3RydWN0aW9uTGltaXQgPSAyMDAwMDAwMFVMOwotCi0gICAgQ0YyX0FyclN0YWNrUmVjICBzdWJyU3RhY2s7Ci0KLSAgICBGVF9Cb29sICAgICBoYXZlV2lkdGg7Ci0gICAgQ0YyX0J1ZmZlciAgY2hhcnN0cmluZyA9IE5VTEw7Ci0KLSAgICBDRjJfSW50ICBjaGFyc3RyaW5nSW5kZXggPSAtMTsgICAgICAgLyogaW5pdGlhbGl6ZSB0byBlbXB0eSAqLwotCi0gICAgLyogVE9ETzogcGxhY2Vob2xkZXJzIGZvciBoaW50IHN0cnVjdHVyZXMgKi8KLQotICAgIC8qIG9iamVjdHMgdXNlZCBmb3IgaGludGluZyAqLwotICAgIENGMl9BcnJTdGFja1JlYyAgaFN0ZW1IaW50QXJyYXk7Ci0gICAgQ0YyX0FyclN0YWNrUmVjICB2U3RlbUhpbnRBcnJheTsKLQotICAgIENGMl9IaW50TWFza1JlYyAgIGhpbnRNYXNrOwotICAgIENGMl9HbHlwaFBhdGhSZWMgIGdseXBoUGF0aDsKLQotCi0gICAgRlRfWkVSTyggJnN0b3JhZ2UgKTsKLQotICAgIC8qIGluaXRpYWxpemUgdGhlIHJlbWFpbmluZyBvYmplY3RzICovCi0gICAgY2YyX2FycnN0YWNrX2luaXQoICZzdWJyU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIENGMl9CdWZmZXJSZWMgKSApOwotICAgIGNmMl9hcnJzdGFja19pbml0KCAmaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIENGMl9TdGVtSGludFJlYyApICk7Ci0gICAgY2YyX2FycnN0YWNrX2luaXQoICZ2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggQ0YyX1N0ZW1IaW50UmVjICkgKTsKLQotICAgIC8qIGluaXRpYWxpemUgQ0YyX1N0ZW1IaW50IGFycmF5cyAqLwotICAgIGNmMl9oaW50bWFza19pbml0KCAmaGludE1hc2ssIGVycm9yICk7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBhdGggbWFwIHRvIG1hbmFnZSBkcmF3aW5nIG9wZXJhdGlvbnMgKi8KLQotICAgIC8qIE5vdGU6IGxhc3QgNCBwYXJhbXMgYXJlIHVzZWQgdG8gaGFuZGxlIGBNb3ZlVG9QZXJtaXNzaXZlJywgd2hpY2ggKi8KLSAgICAvKiAgICAgICBtYXkgbmVlZCB0byBjYWxsIGBoaW50TWFwLkJ1aWxkJyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVE9ETzogTW92ZVRvUGVybWlzc2l2ZSBpcyBnb25lOyBhcmUgdGhlc2Ugc3RpbGwgbmVlZGVkPyAgICAgICAgICAqLwotICAgIGNmMl9nbHlwaHBhdGhfaW5pdCggJmdseXBoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBoU2hpZnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAmaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAmdlN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAmaGludE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBoaW50T3JpZ2luWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uICk7Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgc3RhdGUgZm9yIHdpZHRoIHBhcnNpbmcuICBGcm9tIHRoZSBDRkYgU3BlYzoKLSAgICAgKgotICAgICAqICAgVGhlIGZpcnN0IHN0YWNrLWNsZWFyaW5nIG9wZXJhdG9yLCB3aGljaCBtdXN0IGJlIG9uZSBvZiBoc3RlbSwKLSAgICAgKiAgIGhzdGVtaG0sIHZzdGVtLCB2c3RlbWhtLCBjbnRybWFzaywgaGludG1hc2ssIGhtb3ZldG8sIHZtb3ZldG8sCi0gICAgICogICBybW92ZXRvLCBvciBlbmRjaGFyLCB0YWtlcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IC0gdGhlIHdpZHRoIChhcwotICAgICAqICAgZGVzY3JpYmVkIGVhcmxpZXIpLCB3aGljaCBtYXkgYmUgZXhwcmVzc2VkIGFzIHplcm8gb3Igb25lIG51bWVyaWMKLSAgICAgKiAgIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogV2hhdCB3ZSBpbXBsZW1lbnQgaGVyZSB1c2VzIHRoZSBmaXJzdCB2YWxpZGx5IHNwZWNpZmllZCB3aWR0aCwgYnV0Ci0gICAgICogZG9lcyBub3QgZGV0ZWN0IGVycm9ycyBmb3Igc3BlY2lmeWluZyBtb3JlIHRoYW4gb25lIHdpZHRoLgotICAgICAqCi0gICAgICogSWYgb25lIG9mIHRoZSBhYm92ZSBvcGVyYXRvcnMgb2NjdXJzIHdpdGhvdXQgZXhwbGljaXRseSBzcGVjaWZ5aW5nCi0gICAgICogYSB3aWR0aCwgd2UgYXNzdW1lIHRoZSBkZWZhdWx0IHdpZHRoLgotICAgICAqCi0gICAgICogQ0ZGMiBjaGFyc3RyaW5ncyBhbHdheXMgcmV0dXJuIHRoZSBkZWZhdWx0IHdpZHRoICgwKS4KLSAgICAgKgotICAgICAqLwotICAgIGhhdmVXaWR0aCA9IGZvbnQtPmlzQ0ZGMiA/IFRSVUUgOiBGQUxTRTsKLSAgICAqd2lkdGggICAgPSBjZjJfZ2V0RGVmYXVsdFdpZHRoWCggZGVjb2RlciApOwotCi0gICAgLyoKLSAgICAgKiBOb3RlOiBBdCB0aGlzIHBvaW50LCBhbGwgcG9pbnRlcnMgdG8gcmVzb3VyY2VzIG11c3QgYmUgTlVMTAotICAgICAqICAgICAgIGFuZCBhbGwgbG9jYWwgb2JqZWN0cyBtdXN0IGJlIGluaXRpYWxpemVkLgotICAgICAqICAgICAgIFRoZXJlIG11c3QgYmUgbm8gYnJhbmNoZXMgdG8gYGV4aXQ6JyBhYm92ZSB0aGlzIHBvaW50LgotICAgICAqCi0gICAgICovCi0KLSAgICAvKiBhbGxvY2F0ZSBhbiBvcGVyYW5kIHN0YWNrICovCi0gICAgc3RhY2tTaXplID0gZm9udC0+aXNDRkYyID8gY2YyX2dldE1heHN0YWNrKCBkZWNvZGVyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRjJfT1BFUkFORF9TVEFDS19TSVpFOwotICAgIG9wU3RhY2sgICA9IGNmMl9zdGFja19pbml0KCBtZW1vcnksIGVycm9yLCBzdGFja1NpemUgKTsKLQotICAgIGlmICggIW9wU3RhY2sgKQotICAgIHsKLSAgICAgIGxhc3RFcnJvciA9IEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0gICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBzdWJyb3V0aW5lIHN0YWNrIGJ5IHBsYWNpbmcgdG9wIGxldmVsIGNoYXJzdHJpbmcgYXMgKi8KLSAgICAvKiBmaXJzdCBlbGVtZW50IChtYXggZGVwdGggcGx1cyBvbmUgZm9yIHRoZSBjaGFyc3RyaW5nKSAgICAgICAgICAqLwotICAgIC8qIE5vdGU6IENhbGxlciBvd25zIGFuZCBtdXN0IGZpbmFsaXplIHRoZSBmaXJzdCBjaGFyc3RyaW5nLiAgICAgICovCi0gICAgLyogICAgICAgT3VyIGNvcHkgb2YgaXQgZG9lcyBub3QgY2hhbmdlIHRoYXQgcmVxdWlyZW1lbnQuICAgICAgICAgKi8KLSAgICBjZjJfYXJyc3RhY2tfc2V0Q291bnQoICZzdWJyU3RhY2ssIENGMl9NQVhfU1VCUiArIDEgKTsKLQotICAgIGNoYXJzdHJpbmcgID0gKENGMl9CdWZmZXIpY2YyX2FycnN0YWNrX2dldEJ1ZmZlciggJnN1YnJTdGFjayApOwotICAgICpjaGFyc3RyaW5nID0gKmJ1ZjsgICAgLyogc3RydWN0dXJlIGNvcHkgKi8KLQotICAgIGNoYXJzdHJpbmdJbmRleCA9IDA7ICAgICAgIC8qIGVudHJ5IGlzIHZhbGlkIG5vdyAqLwotCi0gICAgLyogY2F0Y2ggZXJyb3JzIHNvIGZhciAqLwotICAgIGlmICggKmVycm9yICkKLSAgICAgIGdvdG8gZXhpdDsKLQotICAgIC8qIG1haW4gaW50ZXJwcmV0ZXIgbG9vcCAqLwotICAgIHdoaWxlICggMSApCi0gICAgewotICAgICAgaWYgKCBjZjJfYnVmX2lzRW5kKCBjaGFyc3RyaW5nICkgKQotICAgICAgewotICAgICAgICAvKiBJZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGNoYXJzdHJpbmcsIHNpbXVsYXRlIGEgKi8KLSAgICAgICAgLyogY2YyX2NtZFJFVFVSTiBvciBjZjJfY21kRU5EQ0hBUi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFdlIGRvIHRoaXMgZm9yIGJvdGggQ0ZGIGFuZCBDRkYyLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGNoYXJzdHJpbmdJbmRleCApCi0gICAgICAgICAgb3AxID0gY2YyX2NtZFJFVFVSTjsgIC8qIGVuZCBvZiBidWZmZXIgZm9yIHN1YnJvdXRpbmUgKi8KLSAgICAgICAgZWxzZQotICAgICAgICAgIG9wMSA9IGNmMl9jbWRFTkRDSEFSOyAvKiBlbmQgb2YgYnVmZmVyIGZvciB0b3AgbGV2ZWwgY2hhcnN0cmluZyAqLwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvcDEgPSAoRlRfQnl0ZSljZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICk7Ci0KLSAgICAgICAgLyogRXhwbGljaXQgUkVUVVJOIGFuZCBFTkRDSEFSIGluIENGRjIgc2hvdWxkIGJlIGlnbm9yZWQuICovCi0gICAgICAgIC8qIE5vdGU6IFRyYWNlIG1lc3NhZ2Ugd2lsbCByZXBvcnQgMCBpbnN0ZWFkIG9mIDExIG9yIDE0LiAqLwotICAgICAgICBpZiAoICggb3AxID09IGNmMl9jbWRSRVRVUk4gfHwgb3AxID09IGNmMl9jbWRFTkRDSEFSICkgJiYKLSAgICAgICAgICAgICBmb250LT5pc0NGRjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICBvcDEgPSBjZjJfY21kUkVTRVJWRURfMDsKLSAgICAgIH0KLQotICAgICAgLyogY2hlY2sgZm9yIGVycm9ycyBvbmNlIHBlciBsb29wICovCi0gICAgICBpZiAoICplcnJvciApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgICAgaW5zdHJ1Y3Rpb25MaW1pdC0tOwotICAgICAgaWYgKCBpbnN0cnVjdGlvbkxpbWl0ID09IDAgKQotICAgICAgewotICAgICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBleGl0OwotICAgICAgfQotCi0gICAgICBzd2l0Y2goIG9wMSApCi0gICAgICB7Ci0gICAgICBjYXNlIGNmMl9jbWRSRVNFUlZFRF8wOgotICAgICAgY2FzZSBjZjJfY21kUkVTRVJWRURfMjoKLSAgICAgIGNhc2UgY2YyX2NtZFJFU0VSVkVEXzk6Ci0gICAgICBjYXNlIGNmMl9jbWRSRVNFUlZFRF8xMzoKLSAgICAgIGNhc2UgY2YyX2NtZFJFU0VSVkVEXzE3OgotICAgICAgICAvKiB3ZSBtYXkgZ2V0IGhlcmUgaWYgd2UgaGF2ZSBhIHByaW9yIGVycm9yICovCi0gICAgICAgIEZUX1RSQUNFNCgoICIgdW5rbm93biBvcCAoJWQpXG4iLCBvcDEgKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGNmMl9jbWRWU0lOREVYOgotICAgICAgICBGVF9UUkFDRTQoKCAiIHZzaW5kZXhcbiIgKSk7Ci0KLSAgICAgICAgaWYgKCAhZm9udC0+aXNDRkYyICkKLSAgICAgICAgICBicmVhazsgICAgLyogY2xlYXIgc3RhY2sgJiBpZ25vcmUgKi8KLQotICAgICAgICBpZiAoIGZvbnQtPmJsZW5kLnVzZWRCViApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB2c2luZGV4IG5vdCBhbGxvd2VkIGFmdGVyIGJsZW5kICovCi0gICAgICAgICAgbGFzdEVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAgIEZUX0ludCAgdGVtcCA9IGNmMl9zdGFja19wb3BJbnQoIG9wU3RhY2sgKTsKLQotCi0gICAgICAgICAgaWYgKCB0ZW1wID49IDAgKQotICAgICAgICAgICAgZm9udC0+dnNpbmRleCA9IChGVF9VSW50KXRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgY2YyX2NtZEJMRU5EOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgbnVtQmxlbmRzOwotCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGJsZW5kXG4iICkpOwotCi0gICAgICAgICAgaWYgKCAhZm9udC0+aXNDRkYyICkKLSAgICAgICAgICAgIGJyZWFrOyAgICAvKiBjbGVhciBzdGFjayAmIGlnbm9yZSAqLwotCi0gICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIGBibGVuZCcgb3AgaW4gYSBub24tdmFyaWFudCBmb250PyAqLwotICAgICAgICAgIGlmICggIWZvbnQtPmJsZW5kLmZvbnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxhc3RFcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0dseXBoX0Zvcm1hdCApOwotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGNoZWNrIGNhY2hlZCBibGVuZCB2ZWN0b3IgKi8KLSAgICAgICAgICBpZiAoIGNmZl9ibGVuZF9jaGVja192ZWN0b3IoICZmb250LT5ibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPnZzaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5sZW5ORFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5ORFYgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgbGFzdEVycm9yID0gY2ZmX2JsZW5kX2J1aWxkX3ZlY3RvciggJmZvbnQtPmJsZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+dnNpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmxlbk5EViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPk5EViApOwotICAgICAgICAgICAgaWYgKCBsYXN0RXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogZG8gdGhlIGJsZW5kICovCi0gICAgICAgICAgbnVtQmxlbmRzID0gKEZUX1VJbnQpY2YyX3N0YWNrX3BvcEludCggb3BTdGFjayApOwotICAgICAgICAgIGlmICggbnVtQmxlbmRzID4gc3RhY2tTaXplICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjZjJfZG9CbGVuZCggJmZvbnQtPmJsZW5kLCBvcFN0YWNrLCBudW1CbGVuZHMgKTsKLQotICAgICAgICAgIGZvbnQtPmJsZW5kLnVzZWRCViA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7ICAgICAvKiBkbyBub3QgY2xlYXIgdGhlIHN0YWNrICovCi0KLSAgICAgIGNhc2UgY2YyX2NtZEhTVEVNSE06Ci0gICAgICBjYXNlIGNmMl9jbWRIU1RFTToKLSAgICAgICAgRlRfVFJBQ0U0KCggb3AxID09IGNmMl9jbWRIU1RFTUhNID8gIiBoc3RlbWhtXG4iIDogIiBoc3RlbVxuIiApKTsKLQotICAgICAgICAvKiBuZXZlciBhZGQgaGludHMgYWZ0ZXIgdGhlIG1hc2sgaXMgY29tcHV0ZWQgKi8KLSAgICAgICAgaWYgKCBjZjJfaGludG1hc2tfaXNWYWxpZCggJmhpbnRNYXNrICkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggImNmMl9pbnRlcnBUMkNoYXJTdHJpbmc6IgotICAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBob3Jpem9udGFsIGhpbnQgbWFza1xuIiApKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNmMl9kb1N0ZW1zKCBmb250LAotICAgICAgICAgICAgICAgICAgICAgb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICZoU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgJmhhdmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIDAgKTsKLQotICAgICAgICBpZiAoIGZvbnQtPmRlY29kZXItPndpZHRoX29ubHkgKQotICAgICAgICAgIGdvdG8gZXhpdDsKLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBjZjJfY21kVlNURU1ITToKLSAgICAgIGNhc2UgY2YyX2NtZFZTVEVNOgotICAgICAgICBGVF9UUkFDRTQoKCBvcDEgPT0gY2YyX2NtZFZTVEVNSE0gPyAiIHZzdGVtaG1cbiIgOiAiIHZzdGVtXG4iICkpOwotCi0gICAgICAgIC8qIG5ldmVyIGFkZCBoaW50cyBhZnRlciB0aGUgbWFzayBpcyBjb21wdXRlZCAqLwotICAgICAgICBpZiAoIGNmMl9oaW50bWFza19pc1ZhbGlkKCAmaGludE1hc2sgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiY2YyX2ludGVycFQyQ2hhclN0cmluZzoiCi0gICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHZlcnRpY2FsIGhpbnQgbWFza1xuIiApKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNmMl9kb1N0ZW1zKCBmb250LAotICAgICAgICAgICAgICAgICAgICAgb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICZ2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgJmhhdmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIDAgKTsKLQotICAgICAgICBpZiAoIGZvbnQtPmRlY29kZXItPndpZHRoX29ubHkgKQotICAgICAgICAgIGdvdG8gZXhpdDsKLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBjZjJfY21kVk1PVkVUTzoKLSAgICAgICAgRlRfVFJBQ0U0KCggIiB2bW92ZXRvXG4iICkpOwotCi0gICAgICAgIGlmICggY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICkgPiAxICYmICFoYXZlV2lkdGggKQotICAgICAgICAgICp3aWR0aCA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIDAgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbWluYWxXaWR0aFggKTsKLQotICAgICAgICAvKiB3aWR0aCBpcyBkZWZpbmVkIG9yIGRlZmF1bHQgYWZ0ZXIgdGhpcyAqLwotICAgICAgICBoYXZlV2lkdGggPSBUUlVFOwotCi0gICAgICAgIGlmICggZm9udC0+ZGVjb2Rlci0+d2lkdGhfb25seSApCi0gICAgICAgICAgZ290byBleGl0OwotCi0gICAgICAgIGN1clkgPSBBRERfSU5UMzIoIGN1clksIGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApICk7Ci0KLSAgICAgICAgY2YyX2dseXBocGF0aF9tb3ZlVG8oICZnbHlwaFBhdGgsIGN1clgsIGN1clkgKTsKLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBjZjJfY21kUkxJTkVUTzoKLSAgICAgICAgewotICAgICAgICAgIENGMl9VSW50ICBpZHg7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGNvdW50ID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7Ci0KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmxpbmV0b1xuIiApKTsKLQotICAgICAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHggKz0gMiApCi0gICAgICAgICAgewotICAgICAgICAgICAgY3VyWCA9IEFERF9JTlQzMiggY3VyWCwgY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ICsgMCApICk7Ci0gICAgICAgICAgICBjdXJZID0gQUREX0lOVDMyKCBjdXJZLCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggKyAxICkgKTsKLQotICAgICAgICAgICAgY2YyX2dseXBocGF0aF9saW5lVG8oICZnbHlwaFBhdGgsIGN1clgsIGN1clkgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjZjJfc3RhY2tfY2xlYXIoIG9wU3RhY2sgKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsgLyogbm8gbmVlZCB0byBjbGVhciBzdGFjayBhZ2FpbiAqLwotCi0gICAgICBjYXNlIGNmMl9jbWRITElORVRPOgotICAgICAgY2FzZSBjZjJfY21kVkxJTkVUTzoKLSAgICAgICAgewotICAgICAgICAgIENGMl9VSW50ICBpZHg7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGNvdW50ID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICBGVF9Cb29sICBpc1ggPSBGVF9CT09MKCBvcDEgPT0gY2YyX2NtZEhMSU5FVE8gKTsKLQotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggaXNYID8gIiBobGluZXRvXG4iIDogIiB2bGluZXRvXG4iICkpOwotCi0gICAgICAgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCsrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHYgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICk7Ci0KLQotICAgICAgICAgICAgaWYgKCBpc1ggKQotICAgICAgICAgICAgICBjdXJYID0gQUREX0lOVDMyKCBjdXJYLCB2ICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGN1clkgPSBBRERfSU5UMzIoIGN1clksIHYgKTsKLQotICAgICAgICAgICAgaXNYID0gIWlzWDsKLQotICAgICAgICAgICAgY2YyX2dseXBocGF0aF9saW5lVG8oICZnbHlwaFBhdGgsIGN1clgsIGN1clkgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjZjJfc3RhY2tfY2xlYXIoIG9wU3RhY2sgKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgY2FzZSBjZjJfY21kUkNVUlZFTElORToKLSAgICAgIGNhc2UgY2YyX2NtZFJSQ1VSVkVUTzoKLSAgICAgICAgewotICAgICAgICAgIENGMl9VSW50ICBjb3VudCA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwotICAgICAgICAgIENGMl9VSW50ICBpZHggICA9IDA7Ci0KLQotICAgICAgICAgIEZUX1RSQUNFNCgoIG9wMSA9PSBjZjJfY21kUkNVUlZFTElORSA/ICIgcmN1cnZlbGluZVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgcnJjdXJ2ZXRvXG4iICkpOwotCi0gICAgICAgICAgd2hpbGUgKCBpZHggKyA2IDw9IGNvdW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHgxLCB5MSwgeDIsIHkyLCB4MywgeTM7Ci0KLQotICAgICAgICAgICAgeDEgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAwICksIGN1clggKTsKLSAgICAgICAgICAgIHkxID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMSApLCBjdXJZICk7Ci0gICAgICAgICAgICB4MiA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCArIDIgKSwgeDEgKTsKLSAgICAgICAgICAgIHkyID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMyApLCB5MSApOwotICAgICAgICAgICAgeDMgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyA0ICksIHgyICk7Ci0gICAgICAgICAgICB5MyA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCArIDUgKSwgeTIgKTsKLQotICAgICAgICAgICAgY2YyX2dseXBocGF0aF9jdXJ2ZVRvKCAmZ2x5cGhQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzICk7Ci0KLSAgICAgICAgICAgIGN1clggID0geDM7Ci0gICAgICAgICAgICBjdXJZICA9IHkzOwotICAgICAgICAgICAgaWR4ICArPSA2OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggb3AxID09IGNmMl9jbWRSQ1VSVkVMSU5FICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjdXJYID0gQUREX0lOVDMyKCBjdXJYLCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggKyAwICkgKTsKLSAgICAgICAgICAgIGN1clkgPSBBRERfSU5UMzIoIGN1clksIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCArIDEgKSApOwotCi0gICAgICAgICAgICBjZjJfZ2x5cGhwYXRoX2xpbmVUbyggJmdseXBoUGF0aCwgY3VyWCwgY3VyWSApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNmMl9zdGFja19jbGVhciggb3BTdGFjayApOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOyAvKiBubyBuZWVkIHRvIGNsZWFyIHN0YWNrIGFnYWluICovCi0KLSAgICAgIGNhc2UgY2YyX2NtZENBTExHU1VCUjoKLSAgICAgIGNhc2UgY2YyX2NtZENBTExTVUJSOgotICAgICAgICB7Ci0gICAgICAgICAgQ0YyX0ludCAgc3Vick51bTsKLQotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggb3AxID09IGNmMl9jbWRDQUxMR1NVQlIgPyAiIGNhbGxnc3ViciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgY2FsbHN1YnIiICkpOwotCi0gICAgICAgICAgaWYgKCBjaGFyc3RyaW5nSW5kZXggPiBDRjJfTUFYX1NVQlIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIG1heCBzdWJyIHBsdXMgb25lIGZvciBjaGFyc3RyaW5nICovCi0gICAgICAgICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsgICAgICAgICAgICAgICAgICAgICAgLyogb3ZlcmZsb3cgb2Ygc3RhY2sgKi8KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBwdXNoIG91ciBjdXJyZW50IENGRiBjaGFyc3RyaW5nIHJlZ2lvbiBvbiBzdWJyU3RhY2sgKi8KLSAgICAgICAgICBjaGFyc3RyaW5nID0gKENGMl9CdWZmZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViclN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCljaGFyc3RyaW5nSW5kZXggKyAxICk7Ci0KLSAgICAgICAgICAvKiBzZXQgdXAgdGhlIG5ldyBDRkYgcmVnaW9uIGFuZCBwb2ludGVyICovCi0gICAgICAgICAgc3Vick51bSA9IGNmMl9zdGFja19wb3BJbnQoIG9wU3RhY2sgKTsKLQotICAgICAgICAgIHN3aXRjaCAoIG9wMSApCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgY2YyX2NtZENBTExHU1VCUjoKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgKGlkeCAlZCwgZW50ZXJpbmcgbGV2ZWwgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3Vick51bSArIGRlY29kZXItPmdsb2JhbHNfYmlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmdJbmRleCArIDEgKSk7Ci0KLSAgICAgICAgICAgIGlmICggY2YyX2luaXRHbG9iYWxSZWdpb25CdWZmZXIoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGFzdEVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICAgICAgICAgIGdvdG8gZXhpdDsgIC8qIHN1YnJvdXRpbmUgbG9va3VwIG9yIHN0cmVhbSBlcnJvciAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogY2YyX2NtZENBTExTVUJSICovCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIChpZHggJWQsIGVudGVyaW5nIGxldmVsICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJOdW0gKyBkZWNvZGVyLT5sb2NhbHNfYmlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmdJbmRleCArIDEgKSk7Ci0KLSAgICAgICAgICAgIGlmICggY2YyX2luaXRMb2NhbFJlZ2lvbkJ1ZmZlciggZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vick51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGFzdEVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICAgICAgICAgIGdvdG8gZXhpdDsgIC8qIHN1YnJvdXRpbmUgbG9va3VwIG9yIHN0cmVhbSBlcnJvciAqLwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGNoYXJzdHJpbmdJbmRleCArPSAxOyAgICAgICAvKiBlbnRyeSBpcyB2YWxpZCBub3cgKi8KLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICBjYXNlIGNmMl9jbWRSRVRVUk46Ci0gICAgICAgIEZUX1RSQUNFNCgoICIgcmV0dXJuIChsZWF2aW5nIGxldmVsICVkKVxuIiwgY2hhcnN0cmluZ0luZGV4ICkpOwotCi0gICAgICAgIGlmICggY2hhcnN0cmluZ0luZGV4IDwgMSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBOb3RlOiBjYW5ub3QgcmV0dXJuIGZyb20gdG9wIGNoYXJzdHJpbmcgKi8KLSAgICAgICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIGV4aXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVyZmxvdyBvZiBzdGFjayAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcmVzdG9yZSBwb3NpdGlvbiBpbiBwcmV2aW91cyBjaGFyc3RyaW5nICovCi0gICAgICAgIGNoYXJzdHJpbmcgPSAoQ0YyX0J1ZmZlcikKLSAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnN1YnJTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAoQ0YyX1VJbnQpLS1jaGFyc3RyaW5nSW5kZXggKTsKLSAgICAgICAgY29udGludWU7ICAgICAvKiBkbyBub3QgY2xlYXIgdGhlIHN0YWNrICovCi0KLSAgICAgIGNhc2UgY2YyX2NtZEVTQzoKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUgIG9wMiA9IChGVF9CeXRlKWNmMl9idWZfcmVhZEJ5dGUoIGNoYXJzdHJpbmcgKTsKLQotCi0gICAgICAgICAgLyogZmlyc3Qgc3dpdGNoIGZvciAyLWJ5dGUgb3BlcmF0b3JzIGhhbmRsZXMgQ0ZGMiAgICAgICovCi0gICAgICAgICAgLyogYW5kIG9wY29kZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgZm9yIGJvdGggQ0ZGIGFuZCBDRkYyICovCi0gICAgICAgICAgc3dpdGNoICggb3AyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBjZjJfZXNjSEZMRVg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBGVF9Cb29sICByZWFkRnJvbVN0YWNrWzEyXSA9Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4MSAqLywgRkFMU0UgLyogZHkxICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHgyICovLCBUUlVFICAvKiBkeTIgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDMgKi8sIEZBTFNFIC8qIGR5MyAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4NCAqLywgRkFMU0UgLyogZHk0ICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHg1ICovLCBGQUxTRSAvKiBkeTUgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDYgKi8sIEZBTFNFIC8qIGR5NiAqLwotICAgICAgICAgICAgICB9OwotCi0KLSAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBoZmxleFxuIiApKTsKLQotICAgICAgICAgICAgICBjZjJfZG9GbGV4KCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1clksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRGcm9tU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIC8qIGRvQ29uZGl0aW9uYWxMYXN0UmVhZCAqLyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBjYXNlIGNmMl9lc2NGTEVYOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgRlRfQm9vbCAgcmVhZEZyb21TdGFja1sxMl0gPQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDEgKi8sIFRSVUUgLyogZHkxICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHgyICovLCBUUlVFIC8qIGR5MiAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4MyAqLywgVFJVRSAvKiBkeTMgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDQgKi8sIFRSVUUgLyogZHk0ICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHg1ICovLCBUUlVFIC8qIGR5NSAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4NiAqLywgVFJVRSAvKiBkeTYgKi8KLSAgICAgICAgICAgICAgfTsKLQotCi0gICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZmxleFxuIiApKTsKLQotICAgICAgICAgICAgICBjZjJfZG9GbGV4KCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1clksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRGcm9tU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIC8qIGRvQ29uZGl0aW9uYWxMYXN0UmVhZCAqLyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7ICAgICAgLyogVE9ETzogd2h5IGlzIHRoaXMgbm90IGEgY29udGludWU/ICovCi0KLSAgICAgICAgICBjYXNlIGNmMl9lc2NIRkxFWDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBGVF9Cb29sICByZWFkRnJvbVN0YWNrWzEyXSA9Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4MSAqLywgVFJVRSAgLyogZHkxICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHgyICovLCBUUlVFICAvKiBkeTIgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDMgKi8sIEZBTFNFIC8qIGR5MyAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4NCAqLywgRkFMU0UgLyogZHk0ICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHg1ICovLCBUUlVFICAvKiBkeTUgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDYgKi8sIEZBTFNFIC8qIGR5NiAqLwotICAgICAgICAgICAgICB9OwotCi0KLSAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBoZmxleDFcbiIgKSk7Ci0KLSAgICAgICAgICAgICAgY2YyX2RvRmxleCggb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1clgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRnJvbVN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSAvKiBkb0NvbmRpdGlvbmFsTGFzdFJlYWQgKi8gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgY2FzZSBjZjJfZXNjRkxFWDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBGVF9Cb29sICByZWFkRnJvbVN0YWNrWzEyXSA9Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUUlVFICAvKiBkeDEgKi8sIFRSVUUgIC8qIGR5MSAqLywKLSAgICAgICAgICAgICAgICBUUlVFICAvKiBkeDIgKi8sIFRSVUUgIC8qIGR5MiAqLywKLSAgICAgICAgICAgICAgICBUUlVFICAvKiBkeDMgKi8sIFRSVUUgIC8qIGR5MyAqLywKLSAgICAgICAgICAgICAgICBUUlVFICAvKiBkeDQgKi8sIFRSVUUgIC8qIGR5NCAqLywKLSAgICAgICAgICAgICAgICBUUlVFICAvKiBkeDUgKi8sIFRSVUUgIC8qIGR5NSAqLywKLSAgICAgICAgICAgICAgICBGQUxTRSAvKiBkeDYgKi8sIEZBTFNFIC8qIGR5NiAqLwotICAgICAgICAgICAgICB9OwotCi0KLSAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBmbGV4MVxuIiApKTsKLQotICAgICAgICAgICAgICBjZjJfZG9GbGV4KCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1clksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRGcm9tU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgLyogZG9Db25kaXRpb25hbExhc3RSZWFkICovICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIC8qIHRoZXNlIG9wY29kZXMgYXJlIHJlc2VydmVkIGluIGJvdGggQ0ZGICYgQ0ZGMiAqLwotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzE6Ci0gICAgICAgICAgY2FzZSBjZjJfZXNjUkVTRVJWRURfMjoKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF82OgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzc6Ci0gICAgICAgICAgY2FzZSBjZjJfZXNjUkVTRVJWRURfODoKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8xMzoKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8xNjoKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8xNzoKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8xOToKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8yNToKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8zMToKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8zMjoKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8zMzoKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgdW5rbm93biBvcCAoMTIsICVkKVxuIiwgb3AyICkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIGZvbnQtPmlzQ0ZGMiB8fCBvcDIgPj0gY2YyX2VzY1JFU0VSVkVEXzM4ICkKLSAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHVua25vd24gb3AgKDEyLCAlZClcbiIsIG9wMiApKTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2Vjb25kIHN3aXRjaCBmb3IgMi1ieXRlIG9wZXJhdG9ycyBoYW5kbGVzIGp1c3QgQ0ZGICovCi0gICAgICAgICAgICAgICAgc3dpdGNoICggb3AyICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGNmMl9lc2NET1RTRUNUSU9OOgotICAgICAgICAgICAgICAgICAgLyogc29tZXRoaW5nIGFib3V0IGBmbGlwIHR5cGUgb2YgbG9ja2luZycgLS0gaWdub3JlIGl0ICovCi0gICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGRvdHNlY3Rpb25cbiIgKSk7Ci0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjQU5EOgotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIGFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9GMTZEb3QxNiAgYXJnMjsKLQotCi0gICAgICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgYW5kXG4iICkpOwotCi0gICAgICAgICAgICAgICAgICAgIGFyZzIgPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLSAgICAgICAgICAgICAgICAgICAgYXJnMSA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotCi0gICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19wdXNoSW50KCBvcFN0YWNrLCBhcmcxICYmIGFyZzIgKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBkbyBub3QgY2xlYXIgdGhlIHN0YWNrICovCi0KLSAgICAgICAgICAgICAgICBjYXNlIGNmMl9lc2NPUjoKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBhcmcxOwotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIGFyZzI7Ci0KLQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIG9yXG4iICkpOwotCi0gICAgICAgICAgICAgICAgICAgIGFyZzIgPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLSAgICAgICAgICAgICAgICAgICAgYXJnMSA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotCi0gICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19wdXNoSW50KCBvcFN0YWNrLCBhcmcxIHx8IGFyZzIgKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBkbyBub3QgY2xlYXIgdGhlIHN0YWNrICovCi0KLSAgICAgICAgICAgICAgICBjYXNlIGNmMl9lc2NOT1Q6Ci0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9GMTZEb3QxNiAgYXJnOwotCi0KLSAgICAgICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBub3RcbiIgKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXJnID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hJbnQoIG9wU3RhY2ssICFhcmcgKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBkbyBub3QgY2xlYXIgdGhlIHN0YWNrICovCi0KLSAgICAgICAgICAgICAgICBjYXNlIGNmMl9lc2NBQlM6Ci0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9GMTZEb3QxNiAgYXJnOwotCi0KLSAgICAgICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBhYnNcbiIgKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXJnID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBhcmcgPCAtQ0YyX0ZJWEVEX01BWCApCi0gICAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hGaXhlZCggb3BTdGFjaywgQ0YyX0ZJWEVEX01BWCApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hGaXhlZCggb3BTdGFjaywgRlRfQUJTKCBhcmcgKSApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIGRvIG5vdCBjbGVhciB0aGUgc3RhY2sgKi8KLQotICAgICAgICAgICAgICAgIGNhc2UgY2YyX2VzY0FERDoKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBzdW1tYW5kMTsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBzdW1tYW5kMjsKLQotCi0gICAgICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgYWRkXG4iICkpOwotCi0gICAgICAgICAgICAgICAgICAgIHN1bW1hbmQyID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0gICAgICAgICAgICAgICAgICAgIHN1bW1hbmQxID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hGaXhlZCggb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUREX0lOVDMyKCBzdW1tYW5kMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYW5kMiApICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjU1VCOgotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIG1pbnVlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9GMTZEb3QxNiAgc3VidHJhaGVuZDsKLQotCi0gICAgICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgc3ViXG4iICkpOwotCi0gICAgICAgICAgICAgICAgICAgIHN1YnRyYWhlbmQgPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLSAgICAgICAgICAgICAgICAgICAgbWludWVuZCAgICA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotCi0gICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19wdXNoRml4ZWQoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQl9JTlQzMiggbWludWVuZCwgc3VidHJhaGVuZCApICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjRElWOgotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIGRpdmlkZW5kOwotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIGRpdmlzb3I7Ci0KLQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGRpdlxuIiApKTsKLQotICAgICAgICAgICAgICAgICAgICBkaXZpc29yICA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotICAgICAgICAgICAgICAgICAgICBkaXZpZGVuZCA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotCi0gICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19wdXNoRml4ZWQoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggZGl2aWRlbmQsIGRpdmlzb3IgKSApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIGRvIG5vdCBjbGVhciB0aGUgc3RhY2sgKi8KLQotICAgICAgICAgICAgICAgIGNhc2UgY2YyX2VzY05FRzoKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBhcmc7Ci0KLQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIG5lZ1xuIiApKTsKLQotICAgICAgICAgICAgICAgICAgICBhcmcgPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIGFyZyA8IC1DRjJfRklYRURfTUFYICkKLSAgICAgICAgICAgICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEZpeGVkKCBvcFN0YWNrLCBDRjJfRklYRURfTUFYICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEZpeGVkKCBvcFN0YWNrLCAtYXJnICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjRVE6Ci0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9GMTZEb3QxNiAgYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBhcmcyOwotCi0KLSAgICAgICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBlcVxuIiApKTsKLQotICAgICAgICAgICAgICAgICAgICBhcmcyID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0gICAgICAgICAgICAgICAgICAgIGFyZzEgPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLQotICAgICAgICAgICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEludCggb3BTdGFjaywgYXJnMSA9PSBhcmcyICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjRFJPUDoKLSAgICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZHJvcFxuIiApKTsKLQotICAgICAgICAgICAgICAgICAgKHZvaWQpY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjUFVUOgotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIHZhbDsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgICAgICBpZHg7Ci0KLQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHB1dFxuIiApKTsKLQotICAgICAgICAgICAgICAgICAgICBpZHggPSBjZjJfc3RhY2tfcG9wSW50KCBvcFN0YWNrICk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggaWR4ID49IDAgJiYgaWR4IDwgQ0YyX1NUT1JBR0VfU0laRSApCi0gICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVtpZHhdID0gdmFsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIGRvIG5vdCBjbGVhciB0aGUgc3RhY2sgKi8KLQotICAgICAgICAgICAgICAgIGNhc2UgY2YyX2VzY0dFVDoKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgaWR4OwotCi0KLSAgICAgICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBnZXRcbiIgKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWR4ID0gY2YyX3N0YWNrX3BvcEludCggb3BTdGFjayApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggaWR4ID49IDAgJiYgaWR4IDwgQ0YyX1NUT1JBR0VfU0laRSApCi0gICAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hGaXhlZCggb3BTdGFjaywgc3RvcmFnZVtpZHhdICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjSUZFTFNFOgotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIGFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9GMTZEb3QxNiAgYXJnMjsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBjb25kMTsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBjb25kMjsKLQotCi0gICAgICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgaWZlbHNlXG4iICkpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbmQyID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmQxID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0gICAgICAgICAgICAgICAgICAgIGFyZzIgID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0gICAgICAgICAgICAgICAgICAgIGFyZzEgID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hGaXhlZCggb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZDEgPD0gY29uZDIgPyBhcmcxIDogYXJnMiApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIGRvIG5vdCBjbGVhciB0aGUgc3RhY2sgKi8KLQotICAgICAgICAgICAgICAgIGNhc2UgY2YyX2VzY1JBTkRPTTogLyogaW4gc3BlYyAqLwotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIHI7Ci0KLQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJhbmRvbVxuIiApKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBvbmx5IHVzZSB0aGUgbG93ZXIgMTYgYml0cyBvZiBgcmFuZG9tJyAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogdG8gZ2VuZXJhdGUgYSBudW1iZXIgaW4gdGhlIHJhbmdlICgwOzFdICovCi0gICAgICAgICAgICAgICAgICAgIHIgPSAoQ0YyX0YxNkRvdDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAoICggZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5yYW5kb20gJiAweEZGRkYgKSArIDEgKTsKLQotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnJhbmRvbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgY2ZmX3JhbmRvbSggZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5yYW5kb20gKTsKLQotICAgICAgICAgICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEZpeGVkKCBvcFN0YWNrLCByICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjTVVMOgotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIGZhY3RvcjE7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9GMTZEb3QxNiAgZmFjdG9yMjsKLQotCi0gICAgICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgbXVsXG4iICkpOwotCi0gICAgICAgICAgICAgICAgICAgIGZhY3RvcjIgPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yMSA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotCi0gICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19wdXNoRml4ZWQoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZmFjdG9yMSwgZmFjdG9yMiApICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjU1FSVDoKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBhcmc7Ci0KLQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHNxcnRcbiIgKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXJnID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggYXJnID4gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYSBzdGFydCB2YWx1ZSB0aGF0IGRvZXNuJ3QgbWFrZSAqLwotICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBhbGdvcml0aG0ncyBhZGRpdGlvbiBvdmVyZmxvdyAgICovCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgIHJvb3QgPSBhcmcgPCAxMCA/IGFyZyA6IGFyZyA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICBuZXdfcm9vdDsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgLyogQmFieWxvbmlhbiBtZXRob2QgKi8KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19yb290ID0gKCByb290ICsgRlRfRGl2Rml4KCBhcmcsIHJvb3QgKSArIDEgKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBuZXdfcm9vdCA9PSByb290ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb290ID0gbmV3X3Jvb3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IG5ld19yb290OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19wdXNoRml4ZWQoIG9wU3RhY2ssIGFyZyApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIGRvIG5vdCBjbGVhciB0aGUgc3RhY2sgKi8KLQotICAgICAgICAgICAgICAgIGNhc2UgY2YyX2VzY0RVUDoKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBhcmc7Ci0KLQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGR1cFxuIiApKTsKLQotICAgICAgICAgICAgICAgICAgICBhcmcgPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLQotICAgICAgICAgICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEZpeGVkKCBvcFN0YWNrLCBhcmcgKTsKLSAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hGaXhlZCggb3BTdGFjaywgYXJnICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjRVhDSDoKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0YxNkRvdDE2ICBhcmcxOwotICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYgIGFyZzI7Ci0KLQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGV4Y2hcbiIgKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXJnMiA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotICAgICAgICAgICAgICAgICAgICBhcmcxID0gY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hGaXhlZCggb3BTdGFjaywgYXJnMiApOwotICAgICAgICAgICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEZpeGVkKCBvcFN0YWNrLCBhcmcxICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjSU5ERVg6Ci0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9JbnQgICBpZHg7Ci0gICAgICAgICAgICAgICAgICAgIENGMl9VSW50ICBzaXplOwotCi0KLSAgICAgICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBpbmRleFxuIiApKTsKLQotICAgICAgICAgICAgICAgICAgICBpZHggID0gY2YyX3N0YWNrX3BvcEludCggb3BTdGFjayApOwotICAgICAgICAgICAgICAgICAgICBzaXplID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBzaXplID4gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgYGNmMl9zdGFja19nZXRSZWFsJywgICAqLwotICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IDAgaXMgYm90dG9tIG9mIHN0YWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX1VJbnQgIGdyX2lkeDsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKCBpZHggPCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyX2lkeCA9IHNpemUgLSAxOwotICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoQ0YyX1VJbnQpaWR4ID49IHNpemUgKQotICAgICAgICAgICAgICAgICAgICAgICAgZ3JfaWR4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBncl9pZHggPSBzaXplIC0gMSAtIChDRjJfVUludClpZHg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEZpeGVkKCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncl9pZHggKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICAgICAgICAgICAgY2FzZSBjZjJfZXNjUk9MTDoKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgaWR4OwotICAgICAgICAgICAgICAgICAgICBDRjJfSW50ICBjb3VudDsKLQotCi0gICAgICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcm9sbFxuIiApKTsKLQotICAgICAgICAgICAgICAgICAgICBpZHggICA9IGNmMl9zdGFja19wb3BJbnQoIG9wU3RhY2sgKTsKLSAgICAgICAgICAgICAgICAgICAgY291bnQgPSBjZjJfc3RhY2tfcG9wSW50KCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2YyX3N0YWNrX3JvbGwoIG9wU3RhY2ssIGNvdW50LCBpZHggKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBkbyBub3QgY2xlYXIgdGhlIHN0YWNrICovCi0KLSAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiAybmQgc3dpdGNoIGNoZWNraW5nIG9wMiAqLwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAvKiBlbmQgb2YgMXN0IHN3aXRjaCBjaGVja2luZyBvcDIgKi8KLSAgICAgICAgfSAvKiBjYXNlIGNmMl9jbWRFU0MgKi8KLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBjZjJfY21kRU5EQ0hBUjoKLSAgICAgICAgRlRfVFJBQ0U0KCggIiBlbmRjaGFyXG4iICkpOwotCi0gICAgICAgIGlmICggY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICkgPT0gMSB8fAotICAgICAgICAgICAgIGNmMl9zdGFja19jb3VudCggb3BTdGFjayApID09IDUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAhaGF2ZVdpZHRoICkKLSAgICAgICAgICAgICp3aWR0aCA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIDAgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9taW5hbFdpZHRoWCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogd2lkdGggaXMgZGVmaW5lZCBvciBkZWZhdWx0IGFmdGVyIHRoaXMgKi8KLSAgICAgICAgaGF2ZVdpZHRoID0gVFJVRTsKLQotICAgICAgICBpZiAoIGZvbnQtPmRlY29kZXItPndpZHRoX29ubHkgKQotICAgICAgICAgIGdvdG8gZXhpdDsKLQotICAgICAgICAvKiBjbG9zZSBwYXRoIGlmIHN0aWxsIG9wZW4gKi8KLSAgICAgICAgY2YyX2dseXBocGF0aF9jbG9zZU9wZW5QYXRoKCAmZ2x5cGhQYXRoICk7Ci0KLSAgICAgICAgLyogZGlzYWJsZSBzZWFjIGZvciBDRkYyIChjaGFyc3RyaW5nIGVuZGluZyB3aXRoIGFyZ3Mgb24gc3RhY2spICovCi0gICAgICAgIGlmICggIWZvbnQtPmlzQ0ZGMiAmJiBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKSA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogbXVzdCBiZSBlaXRoZXIgNCBvciA1IC0tICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIHRoaXMgaXMgYSAoZGVwcmVjYXRlZCkgaW1wbGllZCBgc2VhYycgb3BlcmF0b3IgKi8KLQotICAgICAgICAgIENGMl9JbnQgICAgICAgIGFjaGFyOwotICAgICAgICAgIENGMl9JbnQgICAgICAgIGJjaGFyOwotICAgICAgICAgIENGMl9CdWZmZXJSZWMgIGNvbXBvbmVudDsKLSAgICAgICAgICBDRjJfRml4ZWQgICAgICBkdW1teVdpZHRoOyAgIC8qIGlnbm9yZSBjb21wb25lbnQgd2lkdGggKi8KLSAgICAgICAgICBGVF9FcnJvciAgICAgICBlcnJvcjI7Ci0KLQotICAgICAgICAgIGlmICggZG9pbmdTZWFjICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsgICAgICAvKiBuZXN0ZWQgc2VhYyAqLwotICAgICAgICAgIH0KLQotICAgICAgICAgIGFjaGFyID0gY2YyX3N0YWNrX3BvcEludCggb3BTdGFjayApOwotICAgICAgICAgIGJjaGFyID0gY2YyX3N0YWNrX3BvcEludCggb3BTdGFjayApOwotCi0gICAgICAgICAgY3VyWSA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotICAgICAgICAgIGN1clggPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLQotICAgICAgICAgIGVycm9yMiA9IGNmMl9nZXRTZWFjQ29tcG9uZW50KCBkZWNvZGVyLCBhY2hhciwgJmNvbXBvbmVudCApOwotICAgICAgICAgIGlmICggZXJyb3IyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjI7ICAgICAgLyogcGFzcyBGcmVlVHlwZSBlcnJvciB0aHJvdWdoICovCi0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcoIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15V2lkdGggKTsKLSAgICAgICAgICBjZjJfZnJlZVNlYWNDb21wb25lbnQoIGRlY29kZXIsICZjb21wb25lbnQgKTsKLQotICAgICAgICAgIGVycm9yMiA9IGNmMl9nZXRTZWFjQ29tcG9uZW50KCBkZWNvZGVyLCBiY2hhciwgJmNvbXBvbmVudCApOwotICAgICAgICAgIGlmICggZXJyb3IyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjI7ICAgICAgLyogcGFzcyBGcmVlVHlwZSBlcnJvciB0aHJvdWdoICovCi0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcoIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15V2lkdGggKTsKLSAgICAgICAgICBjZjJfZnJlZVNlYWNDb21wb25lbnQoIGRlY29kZXIsICZjb21wb25lbnQgKTsKLSAgICAgICAgfQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgIGNhc2UgY2YyX2NtZENOVFJNQVNLOgotICAgICAgY2FzZSBjZjJfY21kSElOVE1BU0s6Ci0gICAgICAgIC8qIHRoZSBmaW5hbCBcbiBpbiB0aGUgdHJhY2luZyBtZXNzYWdlIGdldHMgYWRkZWQgaW4gICAgICAqLwotICAgICAgICAvKiBgY2YyX2hpbnRtYXNrX3JlYWQnICh3aGljaCBhbHNvIHRyYWNlcyB0aGUgbWFzayBieXRlcykgKi8KLSAgICAgICAgRlRfVFJBQ0U0KCggb3AxID09IGNmMl9jbWRDTlRSTUFTSyA/ICIgY250cm1hc2siIDogIiBoaW50bWFzayIgKSk7Ci0KLSAgICAgICAgLyogbmV2ZXIgYWRkIGhpbnRzIGFmdGVyIHRoZSBtYXNrIGlzIGNvbXB1dGVkICovCi0gICAgICAgIGlmICggY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICkgPiAxICAgICYmCi0gICAgICAgICAgICAgY2YyX2hpbnRtYXNrX2lzVmFsaWQoICZoaW50TWFzayApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNCgoICJjZjJfaW50ZXJwVDJDaGFyU3RyaW5nOiBpbnZhbGlkIGhpbnQgbWFza1xuIiApKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlmIHRoZXJlIGFyZSBhcmd1bWVudHMgb24gdGhlIHN0YWNrLCB0aGVyZSB0aGlzIGlzIGFuICovCi0gICAgICAgIC8qIGltcGxpZWQgY2YyX2NtZFZTVEVNSE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGNmMl9kb1N0ZW1zKCBmb250LAotICAgICAgICAgICAgICAgICAgICAgb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICZ2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgJmhhdmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIDAgKTsKLQotICAgICAgICBpZiAoIGZvbnQtPmRlY29kZXItPndpZHRoX29ubHkgKQotICAgICAgICAgIGdvdG8gZXhpdDsKLQotICAgICAgICBpZiAoIG9wMSA9PSBjZjJfY21kSElOVE1BU0sgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogY29uc3VtZSB0aGUgaGludCBtYXNrIGJ5dGVzIHdoaWNoIGZvbGxvdyB0aGUgb3BlcmF0b3IgKi8KLSAgICAgICAgICBjZjJfaGludG1hc2tfcmVhZCggJmhpbnRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfYXJyc3RhY2tfc2l6ZSggJmhTdGVtSGludEFycmF5ICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9hcnJzdGFja19zaXplKCAmdlN0ZW1IaW50QXJyYXkgKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qCi0gICAgICAgICAgICogQ29uc3VtZSB0aGUgY291bnRlciBtYXNrIGJ5dGVzIHdoaWNoIGZvbGxvdyB0aGUgb3BlcmF0b3I6Ci0gICAgICAgICAgICogQnVpbGQgYSB0ZW1wb3JhcnkgaGludCBtYXAsIGp1c3QgdG8gcGxhY2UgYW5kIGxvY2sgdGhvc2UKLSAgICAgICAgICAgKiBzdGVtcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBjb3VudGVyIG1hc2suICBUaGVzZSBhcmUgbW9zdAotICAgICAgICAgICAqIGxpa2VseSB0aGUgZG9taW5hbnQgaHN0ZW1zLCBhbmQgYXJlIGdyb3VwZWQgdG9nZXRoZXIgaW4gYQotICAgICAgICAgICAqIGZldyBjb3VudGVyIGdyb3Vwcywgbm90IG5lY2Vzc2FyaWx5IGluIGNvcnJlc3BvbmRlbmNlCi0gICAgICAgICAgICogd2l0aCB0aGUgaGludCBncm91cHMuICBUaGlzIHJlZHVjZXMgdGhlIGNoYW5jZXMgb2YKLSAgICAgICAgICAgKiBjb25mbGljdHMgYmV0d2VlbiBoc3RlbXMgdGhhdCBhcmUgaW5pdGlhbGx5IHBsYWNlZCBpbgotICAgICAgICAgICAqIHNlcGFyYXRlIGhpbnQgZ3JvdXBzIGFuZCB0aGVuIGJyb3VnaHQgdG9nZXRoZXIuICBUaGUKLSAgICAgICAgICAgKiBwb3NpdGlvbnMgYXJlIGNvcGllZCBiYWNrIHRvIGBoU3RlbUhpbnRBcnJheScsIHNvIHdlIGNhbgotICAgICAgICAgICAqIGRpc2NhcmQgYGNvdW50ZXJNYXNrJyBhbmQgYGNvdW50ZXJIaW50TWFwJy4KLSAgICAgICAgICAgKgotICAgICAgICAgICAqLwotICAgICAgICAgIENGMl9IaW50TWFwUmVjICAgY291bnRlckhpbnRNYXA7Ci0gICAgICAgICAgQ0YyX0hpbnRNYXNrUmVjICBjb3VudGVyTWFzazsKLQotCi0gICAgICAgICAgY2YyX2hpbnRtYXBfaW5pdCggJmNvdW50ZXJIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoUGF0aC5pbml0aWFsSGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhQYXRoLmhpbnRNb3ZlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVkgKTsKLSAgICAgICAgICBjZjJfaGludG1hc2tfaW5pdCggJmNvdW50ZXJNYXNrLCBlcnJvciApOwotCi0gICAgICAgICAgY2YyX2hpbnRtYXNrX3JlYWQoICZjb3VudGVyTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX3NpemUoICZoU3RlbUhpbnRBcnJheSApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfYXJyc3RhY2tfc2l6ZSggJnZTdGVtSGludEFycmF5ICkgKTsKLSAgICAgICAgICBjZjJfaGludG1hcF9idWlsZCggJmNvdW50ZXJIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50ZXJNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGNmMl9jbWRSTU9WRVRPOgotICAgICAgICBGVF9UUkFDRTQoKCAiIHJtb3ZldG9cbiIgKSk7Ci0KLSAgICAgICAgaWYgKCBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKSA+IDIgJiYgIWhhdmVXaWR0aCApCi0gICAgICAgICAgKndpZHRoID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgMCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9taW5hbFdpZHRoWCApOwotCi0gICAgICAgIC8qIHdpZHRoIGlzIGRlZmluZWQgb3IgZGVmYXVsdCBhZnRlciB0aGlzICovCi0gICAgICAgIGhhdmVXaWR0aCA9IFRSVUU7Ci0KLSAgICAgICAgaWYgKCBmb250LT5kZWNvZGVyLT53aWR0aF9vbmx5ICkKLSAgICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgICAgY3VyWSA9IEFERF9JTlQzMiggY3VyWSwgY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICkgKTsKLSAgICAgICAgY3VyWCA9IEFERF9JTlQzMiggY3VyWCwgY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICkgKTsKLQotICAgICAgICBjZjJfZ2x5cGhwYXRoX21vdmVUbyggJmdseXBoUGF0aCwgY3VyWCwgY3VyWSApOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGNmMl9jbWRITU9WRVRPOgotICAgICAgICBGVF9UUkFDRTQoKCAiIGhtb3ZldG9cbiIgKSk7Ci0KLSAgICAgICAgaWYgKCBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKSA+IDEgJiYgIWhhdmVXaWR0aCApCi0gICAgICAgICAgKndpZHRoID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgMCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9taW5hbFdpZHRoWCApOwotCi0gICAgICAgIC8qIHdpZHRoIGlzIGRlZmluZWQgb3IgZGVmYXVsdCBhZnRlciB0aGlzICovCi0gICAgICAgIGhhdmVXaWR0aCA9IFRSVUU7Ci0KLSAgICAgICAgaWYgKCBmb250LT5kZWNvZGVyLT53aWR0aF9vbmx5ICkKLSAgICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgICAgY3VyWCA9IEFERF9JTlQzMiggY3VyWCwgY2YyX3N0YWNrX3BvcEZpeGVkKCBvcFN0YWNrICkgKTsKLQotICAgICAgICBjZjJfZ2x5cGhwYXRoX21vdmVUbyggJmdseXBoUGF0aCwgY3VyWCwgY3VyWSApOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGNmMl9jbWRSTElORUNVUlZFOgotICAgICAgICB7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGNvdW50ID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGlkeCAgID0gMDsKLQotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBybGluZWN1cnZlXG4iICkpOwotCi0gICAgICAgICAgd2hpbGUgKCBpZHggKyA2IDwgY291bnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGN1clggPSBBRERfSU5UMzIoIGN1clgsIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCArIDAgKSApOwotICAgICAgICAgICAgY3VyWSA9IEFERF9JTlQzMiggY3VyWSwgY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ICsgMSApICk7Ci0KLSAgICAgICAgICAgIGNmMl9nbHlwaHBhdGhfbGluZVRvKCAmZ2x5cGhQYXRoLCBjdXJYLCBjdXJZICk7Ci0gICAgICAgICAgICBpZHggKz0gMjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB3aGlsZSAoIGlkeCA8IGNvdW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHgxLCB5MSwgeDIsIHkyLCB4MywgeTM7Ci0KLQotICAgICAgICAgICAgeDEgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAwICksIGN1clggKTsKLSAgICAgICAgICAgIHkxID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMSApLCBjdXJZICk7Ci0gICAgICAgICAgICB4MiA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCArIDIgKSwgeDEgKTsKLSAgICAgICAgICAgIHkyID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMyApLCB5MSApOwotICAgICAgICAgICAgeDMgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyA0ICksIHgyICk7Ci0gICAgICAgICAgICB5MyA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCArIDUgKSwgeTIgKTsKLQotICAgICAgICAgICAgY2YyX2dseXBocGF0aF9jdXJ2ZVRvKCAmZ2x5cGhQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzICk7Ci0KLSAgICAgICAgICAgIGN1clggID0geDM7Ci0gICAgICAgICAgICBjdXJZICA9IHkzOwotICAgICAgICAgICAgaWR4ICArPSA2OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNmMl9zdGFja19jbGVhciggb3BTdGFjayApOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOyAvKiBubyBuZWVkIHRvIGNsZWFyIHN0YWNrIGFnYWluICovCi0KLSAgICAgIGNhc2UgY2YyX2NtZFZWQ1VSVkVUTzoKLSAgICAgICAgewotICAgICAgICAgIENGMl9VSW50ICBjb3VudCwgY291bnQxID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGlkeCA9IDA7Ci0KLQotICAgICAgICAgIC8qIGlmIGBjZjJfc3RhY2tfY291bnQnIGlzbid0IG9mIHRoZSBmb3JtIDRuIG9yIDRuKzEsICovCi0gICAgICAgICAgLyogd2UgZW5mb3JjZSBpdCBieSBjbGVhcmluZyB0aGUgc2Vjb25kIGJpdCAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAoYW5kIHNvcnRpbmcgdGhlIHN0YWNrIGluZGV4aW5nIHRvIHN1aXQpICAgICAgICAgICAqLwotICAgICAgICAgIGNvdW50ID0gY291bnQxICYgfjJVOwotICAgICAgICAgIGlkeCAgKz0gY291bnQxIC0gY291bnQ7Ci0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHZ2Y3VydmV0b1xuIiApKTsKLQotICAgICAgICAgIHdoaWxlICggaWR4IDwgY291bnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENGMl9GaXhlZCAgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MzsKLQotCi0gICAgICAgICAgICBpZiAoICggY291bnQgLSBpZHggKSAmIDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4MSA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCApLCBjdXJYICk7Ci0KLSAgICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHgxID0gY3VyWDsKLQotICAgICAgICAgICAgeTEgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAwICksIGN1clkgKTsKLSAgICAgICAgICAgIHgyID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMSApLCB4MSApOwotICAgICAgICAgICAgeTIgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAyICksIHkxICk7Ci0gICAgICAgICAgICB4MyA9IHgyOwotICAgICAgICAgICAgeTMgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAzICksIHkyICk7Ci0KLSAgICAgICAgICAgIGNmMl9nbHlwaHBhdGhfY3VydmVUbyggJmdseXBoUGF0aCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MyApOwotCi0gICAgICAgICAgICBjdXJYICA9IHgzOwotICAgICAgICAgICAgY3VyWSAgPSB5MzsKLSAgICAgICAgICAgIGlkeCAgKz0gNDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjZjJfc3RhY2tfY2xlYXIoIG9wU3RhY2sgKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsgLyogbm8gbmVlZCB0byBjbGVhciBzdGFjayBhZ2FpbiAqLwotCi0gICAgICBjYXNlIGNmMl9jbWRISENVUlZFVE86Ci0gICAgICAgIHsKLSAgICAgICAgICBDRjJfVUludCAgY291bnQsIGNvdW50MSA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwotICAgICAgICAgIENGMl9VSW50ICBpZHggPSAwOwotCi0KLSAgICAgICAgICAvKiBpZiBgY2YyX3N0YWNrX2NvdW50JyBpc24ndCBvZiB0aGUgZm9ybSA0biBvciA0bisxLCAqLwotICAgICAgICAgIC8qIHdlIGVuZm9yY2UgaXQgYnkgY2xlYXJpbmcgdGhlIHNlY29uZCBiaXQgICAgICAgICAgICovCi0gICAgICAgICAgLyogKGFuZCBzb3J0aW5nIHRoZSBzdGFjayBpbmRleGluZyB0byBzdWl0KSAgICAgICAgICAgKi8KLSAgICAgICAgICBjb3VudCA9IGNvdW50MSAmIH4yVTsKLSAgICAgICAgICBpZHggICs9IGNvdW50MSAtIGNvdW50OwotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBoaGN1cnZldG9cbiIgKSk7Ci0KLSAgICAgICAgICB3aGlsZSAoIGlkeCA8IGNvdW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHgxLCB5MSwgeDIsIHkyLCB4MywgeTM7Ci0KLQotICAgICAgICAgICAgaWYgKCAoIGNvdW50IC0gaWR4ICkgJiAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeTEgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKSwgY3VyWSApOwotCi0gICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB5MSA9IGN1clk7Ci0KLSAgICAgICAgICAgIHgxID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMCApLCBjdXJYICk7Ci0gICAgICAgICAgICB4MiA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCArIDEgKSwgeDEgKTsKLSAgICAgICAgICAgIHkyID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMiApLCB5MSApOwotICAgICAgICAgICAgeDMgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAzICksIHgyICk7Ci0gICAgICAgICAgICB5MyA9IHkyOwotCi0gICAgICAgICAgICBjZjJfZ2x5cGhwYXRoX2N1cnZlVG8oICZnbHlwaFBhdGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMgKTsKLQotICAgICAgICAgICAgY3VyWCAgPSB4MzsKLSAgICAgICAgICAgIGN1clkgID0geTM7Ci0gICAgICAgICAgICBpZHggICs9IDQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2YyX3N0YWNrX2NsZWFyKCBvcFN0YWNrICk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7IC8qIG5vIG5lZWQgdG8gY2xlYXIgc3RhY2sgYWdhaW4gKi8KLQotICAgICAgY2FzZSBjZjJfY21kVkhDVVJWRVRPOgotICAgICAgY2FzZSBjZjJfY21kSFZDVVJWRVRPOgotICAgICAgICB7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGNvdW50LCBjb3VudDEgPSBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKTsKLSAgICAgICAgICBDRjJfVUludCAgaWR4ID0gMDsKLQotICAgICAgICAgIEZUX0Jvb2wgIGFsdGVybmF0ZSA9IEZUX0JPT0woIG9wMSA9PSBjZjJfY21kSFZDVVJWRVRPICk7Ci0KLQotICAgICAgICAgIC8qIGlmIGBjZjJfc3RhY2tfY291bnQnIGlzbid0IG9mIHRoZSBmb3JtIDhuLCA4bisxLCAqLwotICAgICAgICAgIC8qIDhuKzQsIG9yIDhuKzUsIHdlIGVuZm9yY2UgaXQgYnkgY2xlYXJpbmcgdGhlICAgICAqLwotICAgICAgICAgIC8qIHNlY29uZCBiaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIChhbmQgc29ydGluZyB0aGUgc3RhY2sgaW5kZXhpbmcgdG8gc3VpdCkgICAgICAgICAqLwotICAgICAgICAgIGNvdW50ID0gY291bnQxICYgfjJVOwotICAgICAgICAgIGlkeCAgKz0gY291bnQxIC0gY291bnQ7Ci0KLSAgICAgICAgICBGVF9UUkFDRTQoKCBhbHRlcm5hdGUgPyAiIGh2Y3VydmV0b1xuIiA6ICIgdmhjdXJ2ZXRvXG4iICkpOwotCi0gICAgICAgICAgd2hpbGUgKCBpZHggPCBjb3VudCApCi0gICAgICAgICAgewotICAgICAgICAgICAgQ0YyX0ZpeGVkIHgxLCB4MiwgeDMsIHkxLCB5MiwgeTM7Ci0KLQotICAgICAgICAgICAgaWYgKCBhbHRlcm5hdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4MSA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCArIDAgKSwgY3VyWCApOwotICAgICAgICAgICAgICB5MSA9IGN1clk7Ci0gICAgICAgICAgICAgIHgyID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMSApLCB4MSApOwotICAgICAgICAgICAgICB5MiA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCArIDIgKSwgeTEgKTsKLSAgICAgICAgICAgICAgeTMgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAzICksIHkyICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBjb3VudCAtIGlkeCA9PSA1ICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHgzID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgNCApLCB4MiApOwotCi0gICAgICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHgzID0geDI7Ci0KLSAgICAgICAgICAgICAgYWx0ZXJuYXRlID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHgxID0gY3VyWDsKLSAgICAgICAgICAgICAgeTEgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAwICksIGN1clkgKTsKLSAgICAgICAgICAgICAgeDIgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyAxICksIHgxICk7Ci0gICAgICAgICAgICAgIHkyID0gQUREX0lOVDMyKCBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICsgMiApLCB5MSApOwotICAgICAgICAgICAgICB4MyA9IEFERF9JTlQzMiggY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGlkeCArIDMgKSwgeDIgKTsKLQotICAgICAgICAgICAgICBpZiAoIGNvdW50IC0gaWR4ID09IDUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeTMgPSBBRERfSU5UMzIoIGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpZHggKyA0ICksIHkyICk7Ci0KLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeTMgPSB5MjsKLQotICAgICAgICAgICAgICBhbHRlcm5hdGUgPSBUUlVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjZjJfZ2x5cGhwYXRoX2N1cnZlVG8oICZnbHlwaFBhdGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMgKTsKLQotICAgICAgICAgICAgY3VyWCAgPSB4MzsKLSAgICAgICAgICAgIGN1clkgID0geTM7Ci0gICAgICAgICAgICBpZHggICs9IDQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2YyX3N0YWNrX2NsZWFyKCBvcFN0YWNrICk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7ICAgICAvKiBubyBuZWVkIHRvIGNsZWFyIHN0YWNrIGFnYWluICovCi0KLSAgICAgIGNhc2UgY2YyX2NtZEVYVEVOREVETk1CUjoKLSAgICAgICAgewotICAgICAgICAgIENGMl9JbnQgIHY7Ci0KLSAgICAgICAgICBDRjJfSW50ICBieXRlMSA9IGNmMl9idWZfcmVhZEJ5dGUoIGNoYXJzdHJpbmcgKTsKLSAgICAgICAgICBDRjJfSW50ICBieXRlMiA9IGNmMl9idWZfcmVhZEJ5dGUoIGNoYXJzdHJpbmcgKTsKLQotCi0gICAgICAgICAgdiA9IChGVF9TaG9ydCkoICggYnl0ZTEgPDwgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlMiAgICAgICAgKTsKLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgJWQiLCB2ICkpOwotCi0gICAgICAgICAgY2YyX3N0YWNrX3B1c2hJbnQoIG9wU3RhY2ssIHYgKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLyogbnVtYmVycyAqLwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAvKiBvcDEgPj0gMzIgJiYgKi8gb3AxIDw9IDI0NiApCi0gICAgICAgICAgewotICAgICAgICAgICAgQ0YyX0ludCAgdjsKLQotCi0gICAgICAgICAgICB2ID0gb3AxIC0gMTM5OwotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgdiApKTsKLQotICAgICAgICAgICAgLyogLTEwNyAuLiAxMDcgKi8KLSAgICAgICAgICAgIGNmMl9zdGFja19wdXNoSW50KCBvcFN0YWNrLCB2ICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZWxzZSBpZiAoIC8qIG9wMSA+PSAyNDcgJiYgKi8gb3AxIDw9IDI1MCApCi0gICAgICAgICAgewotICAgICAgICAgICAgQ0YyX0ludCAgdjsKLQotCi0gICAgICAgICAgICB2ICA9IG9wMTsKLSAgICAgICAgICAgIHYgLT0gMjQ3OwotICAgICAgICAgICAgdiAqPSAyNTY7Ci0gICAgICAgICAgICB2ICs9IGNmMl9idWZfcmVhZEJ5dGUoIGNoYXJzdHJpbmcgKTsKLSAgICAgICAgICAgIHYgKz0gMTA4OwotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgdiApKTsKLQotICAgICAgICAgICAgLyogMTA4IC4uIDExMzEgKi8KLSAgICAgICAgICAgIGNmMl9zdGFja19wdXNoSW50KCBvcFN0YWNrLCB2ICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZWxzZSBpZiAoIC8qIG9wMSA+PSAyNTEgJiYgKi8gb3AxIDw9IDI1NCApCi0gICAgICAgICAgewotICAgICAgICAgICAgQ0YyX0ludCAgdjsKLQotCi0gICAgICAgICAgICB2ICA9IG9wMTsKLSAgICAgICAgICAgIHYgLT0gMjUxOwotICAgICAgICAgICAgdiAqPSAyNTY7Ci0gICAgICAgICAgICB2ICs9IGNmMl9idWZfcmVhZEJ5dGUoIGNoYXJzdHJpbmcgKTsKLSAgICAgICAgICAgIHYgID0gLXYgLSAxMDg7Ci0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgJWQiLCB2ICkpOwotCi0gICAgICAgICAgICAvKiAtMTEzMSAuLiAtMTA4ICovCi0gICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEludCggb3BTdGFjaywgdiApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGVsc2UgLyogb3AxID09IDI1NSAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIENGMl9GaXhlZCAgdjsKLQotICAgICAgICAgICAgRlRfVUludDMyICBieXRlMSA9IChGVF9VSW50MzIpY2YyX2J1Zl9yZWFkQnl0ZSggY2hhcnN0cmluZyApOwotICAgICAgICAgICAgRlRfVUludDMyICBieXRlMiA9IChGVF9VSW50MzIpY2YyX2J1Zl9yZWFkQnl0ZSggY2hhcnN0cmluZyApOwotICAgICAgICAgICAgRlRfVUludDMyICBieXRlMyA9IChGVF9VSW50MzIpY2YyX2J1Zl9yZWFkQnl0ZSggY2hhcnN0cmluZyApOwotICAgICAgICAgICAgRlRfVUludDMyICBieXRlNCA9IChGVF9VSW50MzIpY2YyX2J1Zl9yZWFkQnl0ZSggY2hhcnN0cmluZyApOwotCi0KLSAgICAgICAgICAgIHYgPSAoQ0YyX0ZpeGVkKSggKCBieXRlMSA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBieXRlMiA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBieXRlMyA8PCAgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlNCAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgJS41ZiIsIHYgLyA2NTUzNi4wICkpOwotCi0gICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEZpeGVkKCBvcFN0YWNrLCB2ICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOyAgIC8qIGRvbid0IGNsZWFyIHN0YWNrICovCi0KLSAgICAgIH0gLyogZW5kIG9mIHN3aXRjaCBzdGF0ZW1lbnQgY2hlY2tpbmcgYG9wMScgKi8KLQotICAgICAgY2YyX3N0YWNrX2NsZWFyKCBvcFN0YWNrICk7Ci0KLSAgICB9IC8qIGVuZCBvZiBtYWluIGludGVycHJldGVyIGxvb3AgKi8KLQotICAgIC8qIHdlIGdldCBoZXJlIGlmIHRoZSBjaGFyc3RyaW5nIGVuZHMgd2l0aG91dCBjZjJfY21kRU5EQ0hBUiAqLwotICAgIEZUX1RSQUNFNCgoICJjZjJfaW50ZXJwVDJDaGFyU3RyaW5nOiIKLSAgICAgICAgICAgICAgICAiICBjaGFyc3RyaW5nIGVuZHMgd2l0aG91dCBFTkRDSEFSXG4iICkpOwotCi0gIGV4aXQ6Ci0gICAgLyogY2hlY2sgd2hldGhlciBsYXN0IGVycm9yIHNlZW4gaXMgYWxzbyB0aGUgZmlyc3Qgb25lICovCi0gICAgY2YyX3NldEVycm9yKCBlcnJvciwgbGFzdEVycm9yICk7Ci0KLSAgICBpZiAoICplcnJvciApCi0gICAgICBGVF9UUkFDRTQoKCAiY2hhcnN0cmluZyBlcnJvciAlZFxuIiwgKmVycm9yICkpOwotCi0gICAgLyogZnJlZSByZXNvdXJjZXMgZnJvbSBvYmplY3RzIHdlJ3ZlIHVzZWQgKi8KLSAgICBjZjJfZ2x5cGhwYXRoX2ZpbmFsaXplKCAmZ2x5cGhQYXRoICk7Ci0gICAgY2YyX2FycnN0YWNrX2ZpbmFsaXplKCAmdlN0ZW1IaW50QXJyYXkgKTsKLSAgICBjZjJfYXJyc3RhY2tfZmluYWxpemUoICZoU3RlbUhpbnRBcnJheSApOwotICAgIGNmMl9hcnJzdGFja19maW5hbGl6ZSggJnN1YnJTdGFjayApOwotICAgIGNmMl9zdGFja19mcmVlKCBvcFN0YWNrICk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmMmludHJwLmggYi9zcmMvY2ZmL2NmMmludHJwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDMwZTguLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJpbnRycC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyZm9udC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgQ0ZGIEludGVycHJldGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQ0YySU5UUlBfSF8KLSNkZWZpbmUgQ0YySU5UUlBfSF8KLQotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLSNpbmNsdWRlICJjZjJoaW50cy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfaGludG1hc2tfaW5pdCggQ0YyX0hpbnRNYXNrICBoaW50bWFzaywKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgICAgZXJyb3IgKTsKLSAgRlRfTE9DQUwoIEZUX0Jvb2wgKQotICBjZjJfaGludG1hc2tfaXNWYWxpZCggY29uc3QgQ0YyX0hpbnRNYXNrICBoaW50bWFzayApOwotICBGVF9MT0NBTCggRlRfQm9vbCApCi0gIGNmMl9oaW50bWFza19pc05ldyggY29uc3QgQ0YyX0hpbnRNYXNrICBoaW50bWFzayApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9oaW50bWFza19zZXROZXcoIENGMl9IaW50TWFzayAgaGludG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgdmFsICk7Ci0gIEZUX0xPQ0FMKCBGVF9CeXRlKiApCi0gIGNmMl9oaW50bWFza19nZXRNYXNrUHRyKCBDRjJfSGludE1hc2sgIGhpbnRtYXNrICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2hpbnRtYXNrX3NldEFsbCggQ0YyX0hpbnRNYXNrICBoaW50bWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBiaXRDb3VudCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2ludGVycFQyQ2hhclN0cmluZyggQ0YyX0ZvbnQgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgICAgICAgICBjaGFyc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfT3V0bGluZUNhbGxiYWNrcyAgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICAgICAgdHJhbnNsYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgICBkb2luZ1NlYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgICAgICAgICBjdXJYLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICAgICAgICAgY3VyWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICAgICAgICAgIHdpZHRoICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBDRjJJTlRSUF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZjJyZWFkLmMgYi9zcmMvY2ZmL2NmMnJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0MjllMy4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmMnJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJyZWFkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBzdHJlYW0gaGFuZGxpbmcgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJjZjJnbHVlLmgiCi0KLSNpbmNsdWRlICJjZjJlcnJvci5oIgotCi0KLSAgLyogRGVmaW5lIENGMl9JT19GQUlMIGFzIDEgdG8gZW5hYmxlIHJhbmRvbSBlcnJvcnMgYW5kIHJhbmRvbSAqLwotICAvKiB2YWx1ZSBlcnJvcnMgaW4gSS9PLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENGMl9JT19GQUlMICAwCi0KLQotI2lmIENGMl9JT19GQUlMCi0KLSAgLyogc2V0IHRoZSAuMDAgdmFsdWUgdG8gYSBub256ZXJvIHByb2JhYmlsaXR5ICovCi0gIHN0YXRpYyBpbnQKLSAgcmFuZG9tRXJyb3IyKCB2b2lkICkKLSAgewotICAgIC8qIGZvciByZWdpb24gYnVmZmVyIFJlYWRCeXRlIChpbnRlcnApIGZ1bmN0aW9uICovCi0gICAgcmV0dXJuIChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVggPCAuMDA7Ci0gIH0KLQotICAvKiBzZXQgdGhlIC4wMCB2YWx1ZSB0byBhIG5vbnplcm8gcHJvYmFiaWxpdHkgKi8KLSAgc3RhdGljIENGMl9JbnQKLSAgcmFuZG9tVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVggPCAuMDAgPyByYW5kKCkgOiAwOwotICB9Ci0KLSNlbmRpZiAvKiBDRjJfSU9fRkFJTCAqLwotCi0KLSAgLyogUmVnaW9uIEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYSBjb3BpZWQgYnVmZmVyIG1hbmFnZWQgYnkgKi8KLSAgLyogYEZDTV9nZXREYXRhYmxvY2snLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmVhZHMgYnl0ZXMgd2l0aCBjaGVjayBmb3IgZW5kIG9mIGJ1ZmZlci4gICAgICAgICAgKi8KLQotICAvKiByZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHNldHMgZXJyb3IgYW5kIHJldHVybnMgemVybyAqLwotICBGVF9MT0NBTF9ERUYoIENGMl9JbnQgKQotICBjZjJfYnVmX3JlYWRCeXRlKCBDRjJfQnVmZmVyICBidWYgKQotICB7Ci0gICAgaWYgKCBidWYtPnB0ciA8IGJ1Zi0+ZW5kICkKLSAgICB7Ci0jaWYgQ0YyX0lPX0ZBSUwKLSAgICAgIGlmICggcmFuZG9tRXJyb3IyKCkgKQotICAgICAgewotICAgICAgICBDRjJfU0VUX0VSUk9SKCBidWYtPmVycm9yLCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiAqKGJ1Zi0+cHRyKSsrICsgcmFuZG9tVmFsdWUoKTsKLSNlbHNlCi0gICAgICByZXR1cm4gKihidWYtPnB0cikrKzsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgQ0YyX1NFVF9FUlJPUiggYnVmLT5lcnJvciwgSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIG5vdGU6IGVuZCBjb25kaXRpb24gY2FuIG9jY3VyIHdpdGhvdXQgZXJyb3IgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgY2YyX2J1Zl9pc0VuZCggQ0YyX0J1ZmZlciAgYnVmICkKLSAgewotICAgIHJldHVybiAoRlRfQm9vbCkoIGJ1Zi0+cHRyID49IGJ1Zi0+ZW5kICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2YycmVhZC5oIGIvc3JjL2NmZi9jZjJyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjBkYjguLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJyZWFkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBzdHJlYW0gaGFuZGxpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDRjJSRUFEX0hfCi0jZGVmaW5lIENGMlJFQURfSF8KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfQnVmZmVyUmVjXwotICB7Ci0gICAgRlRfRXJyb3IqICAgICAgIGVycm9yOwotICAgIGNvbnN0IEZUX0J5dGUqICBzdGFydDsKLSAgICBjb25zdCBGVF9CeXRlKiAgZW5kOwotICAgIGNvbnN0IEZUX0J5dGUqICBwdHI7Ci0KLSAgfSBDRjJfQnVmZmVyUmVjLCAqQ0YyX0J1ZmZlcjsKLQotCi0gIEZUX0xPQ0FMKCBDRjJfSW50ICkKLSAgY2YyX2J1Zl9yZWFkQnl0ZSggQ0YyX0J1ZmZlciAgYnVmICk7Ci0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgY2YyX2J1Zl9pc0VuZCggQ0YyX0J1ZmZlciAgYnVmICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBDRjJSRUFEX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmMnN0YWNrLmMgYi9zcmMvY2ZmL2NmMnN0YWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTAyNmQuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJzdGFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMnN0YWNrLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGVtdWxhdGluZyBhIENGRiBzdGFjayAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImNmMmdsdWUuaCIKLSNpbmNsdWRlICJjZjJmb250LmgiCi0jaW5jbHVkZSAiY2Yyc3RhY2suaCIKLQotI2luY2x1ZGUgImNmMmVycm9yLmgiCi0KLQotICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBDRjJfU3RhY2suICAgICAgICovCi0gIC8qIE5vdGU6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMIG9uIGVycm9yIChkb2VzIG5vdCBzZXQgKi8KLSAgLyogYGVycm9yJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIENGMl9TdGFjayApCi0gIGNmMl9zdGFja19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhY2tTaXplICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsgICAgIC8qIGZvciBGVF9ORVcgKi8KLQotICAgIENGMl9TdGFjayAgc3RhY2sgPSBOVUxMOwotCi0KLSAgICBpZiAoICFGVF9ORVcoIHN0YWNrICkgKQotICAgIHsKLSAgICAgIC8qIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZTsgRlRfTkVXIHplcm9lcyBpdCAqLwotICAgICAgc3RhY2stPm1lbW9yeSA9IG1lbW9yeTsKLSAgICAgIHN0YWNrLT5lcnJvciAgPSBlOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIHRoZSBzdGFjayBidWZmZXIgKi8KLSAgICBpZiAoIEZUX05FV19BUlJBWSggc3RhY2stPmJ1ZmZlciwgc3RhY2tTaXplICkgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIHN0YWNrICk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzdGFjay0+c3RhY2tTaXplID0gc3RhY2tTaXplOwotICAgIHN0YWNrLT50b3AgICAgICAgPSBzdGFjay0+YnVmZmVyOyAgICAgLyogZW1wdHkgc3RhY2sgKi8KLQotICAgIHJldHVybiBzdGFjazsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX3N0YWNrX2ZyZWUoIENGMl9TdGFjayAgc3RhY2sgKQotICB7Ci0gICAgaWYgKCBzdGFjayApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdGFjay0+bWVtb3J5OwotCi0gICAgICAvKiBmcmVlIHRoZSBidWZmZXIgKi8KLSAgICAgIEZUX0ZSRUUoIHN0YWNrLT5idWZmZXIgKTsKLQotICAgICAgLyogZnJlZSB0aGUgbWFpbiBzdHJ1Y3R1cmUgKi8KLSAgICAgIEZUX0ZSRUUoIHN0YWNrICk7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIENGMl9VSW50ICkKLSAgY2YyX3N0YWNrX2NvdW50KCBDRjJfU3RhY2sgIHN0YWNrICkKLSAgewotICAgIHJldHVybiAoQ0YyX1VJbnQpKCBzdGFjay0+dG9wIC0gc3RhY2stPmJ1ZmZlciApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfc3RhY2tfcHVzaEludCggQ0YyX1N0YWNrICBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgIENGMl9JbnQgICAgdmFsICkKLSAgewotICAgIGlmICggc3RhY2stPnRvcCA9PSBzdGFjay0+YnVmZmVyICsgc3RhY2stPnN0YWNrU2l6ZSApCi0gICAgewotICAgICAgQ0YyX1NFVF9FUlJPUiggc3RhY2stPmVycm9yLCBTdGFja19PdmVyZmxvdyApOwotICAgICAgcmV0dXJuOyAgICAgLyogc3RhY2sgb3ZlcmZsb3cgKi8KLSAgICB9Ci0KLSAgICBzdGFjay0+dG9wLT51LmkgID0gdmFsOwotICAgIHN0YWNrLT50b3AtPnR5cGUgPSBDRjJfTnVtYmVySW50OwotICAgIHN0YWNrLT50b3ArKzsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX3N0YWNrX3B1c2hGaXhlZCggQ0YyX1N0YWNrICBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICB2YWwgKQotICB7Ci0gICAgaWYgKCBzdGFjay0+dG9wID09IHN0YWNrLT5idWZmZXIgKyBzdGFjay0+c3RhY2tTaXplICkKLSAgICB7Ci0gICAgICBDRjJfU0VUX0VSUk9SKCBzdGFjay0+ZXJyb3IsIFN0YWNrX092ZXJmbG93ICk7Ci0gICAgICByZXR1cm47ICAgICAvKiBzdGFjayBvdmVyZmxvdyAqLwotICAgIH0KLQotICAgIHN0YWNrLT50b3AtPnUuciAgPSB2YWw7Ci0gICAgc3RhY2stPnRvcC0+dHlwZSA9IENGMl9OdW1iZXJGaXhlZDsKLSAgICBzdGFjay0+dG9wKys7Ci0gIH0KLQotCi0gIC8qIHRoaXMgZnVuY3Rpb24gaXMgb25seSBhbGxvd2VkIHRvIHBvcCBhbiBpbnRlZ2VyIHR5cGUgKi8KLSAgRlRfTE9DQUxfREVGKCBDRjJfSW50ICkKLSAgY2YyX3N0YWNrX3BvcEludCggQ0YyX1N0YWNrICBzdGFjayApCi0gIHsKLSAgICBpZiAoIHN0YWNrLT50b3AgPT0gc3RhY2stPmJ1ZmZlciApCi0gICAgewotICAgICAgQ0YyX1NFVF9FUlJPUiggc3RhY2stPmVycm9yLCBTdGFja19VbmRlcmZsb3cgKTsKLSAgICAgIHJldHVybiAwOyAgIC8qIHVuZGVyZmxvdyAqLwotICAgIH0KLSAgICBpZiAoIHN0YWNrLT50b3BbLTFdLnR5cGUgIT0gQ0YyX051bWJlckludCApCi0gICAgewotICAgICAgQ0YyX1NFVF9FUlJPUiggc3RhY2stPmVycm9yLCBTeW50YXhfRXJyb3IgKTsKLSAgICAgIHJldHVybiAwOyAgIC8qIHR5cGUgbWlzbWF0Y2ggKi8KLSAgICB9Ci0KLSAgICBzdGFjay0+dG9wLS07Ci0KLSAgICByZXR1cm4gc3RhY2stPnRvcC0+dS5pOwotICB9Ci0KLQotICAvKiBOb3RlOiB0eXBlIG1pc21hdGNoIGlzIHNpbGVudGx5IGNhc3QgKi8KLSAgLyogVE9ETzogY2hlY2sgdGhpcyAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggQ0YyX0ZpeGVkICkKLSAgY2YyX3N0YWNrX3BvcEZpeGVkKCBDRjJfU3RhY2sgIHN0YWNrICkKLSAgewotICAgIGlmICggc3RhY2stPnRvcCA9PSBzdGFjay0+YnVmZmVyICkKLSAgICB7Ci0gICAgICBDRjJfU0VUX0VSUk9SKCBzdGFjay0+ZXJyb3IsIFN0YWNrX1VuZGVyZmxvdyApOwotICAgICAgcmV0dXJuIGNmMl9pbnRUb0ZpeGVkKCAwICk7ICAgIC8qIHVuZGVyZmxvdyAqLwotICAgIH0KLQotICAgIHN0YWNrLT50b3AtLTsKLQotICAgIHN3aXRjaCAoIHN0YWNrLT50b3AtPnR5cGUgKQotICAgIHsKLSAgICBjYXNlIENGMl9OdW1iZXJJbnQ6Ci0gICAgICByZXR1cm4gY2YyX2ludFRvRml4ZWQoIHN0YWNrLT50b3AtPnUuaSApOwotICAgIGNhc2UgQ0YyX051bWJlckZyYWM6Ci0gICAgICByZXR1cm4gY2YyX2ZyYWNUb0ZpeGVkKCBzdGFjay0+dG9wLT51LmYgKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0YWNrLT50b3AtPnUucjsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIE5vdGU6IHR5cGUgbWlzbWF0Y2ggaXMgc2lsZW50bHkgY2FzdCAqLwotICAvKiBUT0RPOiBjaGVjayB0aGlzICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBDRjJfRml4ZWQgKQotICBjZjJfc3RhY2tfZ2V0UmVhbCggQ0YyX1N0YWNrICBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgIENGMl9VSW50ICAgaWR4ICkKLSAgewotICAgIEZUX0FTU0VSVCggY2YyX3N0YWNrX2NvdW50KCBzdGFjayApIDw9IHN0YWNrLT5zdGFja1NpemUgKTsKLQotICAgIGlmICggaWR4ID49IGNmMl9zdGFja19jb3VudCggc3RhY2sgKSApCi0gICAgewotICAgICAgQ0YyX1NFVF9FUlJPUiggc3RhY2stPmVycm9yLCBTdGFja19PdmVyZmxvdyApOwotICAgICAgcmV0dXJuIGNmMl9pbnRUb0ZpeGVkKCAwICk7ICAgIC8qIGJvdW5kcyBlcnJvciAqLwotICAgIH0KLQotICAgIHN3aXRjaCAoIHN0YWNrLT5idWZmZXJbaWR4XS50eXBlICkKLSAgICB7Ci0gICAgY2FzZSBDRjJfTnVtYmVySW50OgotICAgICAgcmV0dXJuIGNmMl9pbnRUb0ZpeGVkKCBzdGFjay0+YnVmZmVyW2lkeF0udS5pICk7Ci0gICAgY2FzZSBDRjJfTnVtYmVyRnJhYzoKLSAgICAgIHJldHVybiBjZjJfZnJhY1RvRml4ZWQoIHN0YWNrLT5idWZmZXJbaWR4XS51LmYgKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0YWNrLT5idWZmZXJbaWR4XS51LnI7Ci0gICAgfQotICB9Ci0KLQotICAvKiBwcm92aWRlIHJhbmRvbSBhY2Nlc3MgdG8gc3RhY2sgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX3N0YWNrX3NldFJlYWwoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICBDRjJfVUludCAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgdmFsICkKLSAgewotICAgIGlmICggaWR4ID4gY2YyX3N0YWNrX2NvdW50KCBzdGFjayApICkKLSAgICB7Ci0gICAgICBDRjJfU0VUX0VSUk9SKCBzdGFjay0+ZXJyb3IsIFN0YWNrX092ZXJmbG93ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RhY2stPmJ1ZmZlcltpZHhdLnUuciAgPSB2YWw7Ci0gICAgc3RhY2stPmJ1ZmZlcltpZHhdLnR5cGUgPSBDRjJfTnVtYmVyRml4ZWQ7Ci0gIH0KLQotCi0gIC8qIGRpc2NhcmQgKHBvcCkgbnVtIHZhbHVlcyBmcm9tIHN0YWNrICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9zdGFja19wb3AoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgIENGMl9VSW50ICAgbnVtICkKLSAgewotICAgIGlmICggbnVtID4gY2YyX3N0YWNrX2NvdW50KCBzdGFjayApICkKLSAgICB7Ci0gICAgICBDRjJfU0VUX0VSUk9SKCBzdGFjay0+ZXJyb3IsIFN0YWNrX1VuZGVyZmxvdyApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGFjay0+dG9wIC09IG51bTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX3N0YWNrX3JvbGwoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgICBDRjJfSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgICBzaGlmdCApCi0gIHsKLSAgICAvKiB3ZSBpbml0aWFsaXplIHRoaXMgdmFyaWFibGUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgKi8KLSAgICBDRjJfU3RhY2tOdW1iZXIgIGxhc3QgPSB7IHsgMCB9LCBDRjJfTnVtYmVySW50IH07Ci0KLSAgICBDRjJfSW50ICBzdGFydF9pZHgsIGlkeCwgaTsKLQotCi0gICAgaWYgKCBjb3VudCA8IDIgKQotICAgICAgcmV0dXJuOyAvKiBub3RoaW5nIHRvIGRvICh2YWx1ZXMgMCBhbmQgMSksIG9yIHVuZGVmaW5lZCB2YWx1ZSAqLwotCi0gICAgaWYgKCAoQ0YyX1VJbnQpY291bnQgPiBjZjJfc3RhY2tfY291bnQoIHN0YWNrICkgKQotICAgIHsKLSAgICAgIENGMl9TRVRfRVJST1IoIHN0YWNrLT5lcnJvciwgU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIHNoaWZ0IDwgMCApCi0gICAgICBzaGlmdCA9IC0oICggLXNoaWZ0ICkgJSBjb3VudCApOwotICAgIGVsc2UKLSAgICAgIHNoaWZ0ICU9IGNvdW50OwotCi0gICAgaWYgKCBzaGlmdCA9PSAwICkKLSAgICAgIHJldHVybjsgLyogbm90aGluZyB0byBkbyAqLwotCi0gICAgLyogV2UgdXNlIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIHRvIGRvIHRoZSByb2xsaW5nLCAqLwotICAgIC8qIHdoaWNoIG5lZWRzIHR3byB0ZW1wb3JhcnkgdmFyaWFibGVzIG9ubHkuICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIGNvdW50ID0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBzaGlmdCA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIHN0YWNrIGluZGljZXMgYmVmb3JlIHJvbGw6ICA3IDYgNSA0IDMgMiAxIDAgICAgICovCi0gICAgLyogICBzdGFjayBpbmRpY2VzIGFmdGVyIHJvbGw6ICAgMSAwIDcgNiA1IDQgMyAyICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGUgdmFsdWUgb2YgaW5kZXggMCBnZXRzIG1vdmVkIHRvIGluZGV4IDIsIHdoaWxlICovCi0gICAgLyogdGhlIG9sZCB2YWx1ZSBvZiBpbmRleCAyIGdldHMgbW92ZWQgdG8gaW5kZXggNCwgICAqLwotICAgIC8qIGFuZCBzbyBvbi4gIFdlIHRodXMgaGF2ZSB0aGUgZm9sbG93aW5nIGNvcHlpbmcgICAgKi8KLSAgICAvKiBjaGFpbnMgZm9yIHNoaWZ0IHZhbHVlIDIuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgMCAtPiAyIC0+IDQgLT4gNiAtPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIDEgLT4gMyAtPiA1IC0+IDcgLT4gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIElmIGBjb3VudCcgYW5kIGBzaGlmdCcgYXJlIGluY29tbWVuc3VyYWJsZSwgd2UgICAgKi8KLSAgICAvKiBoYXZlIGEgc2luZ2xlIGNoYWluIG9ubHkuICBPdGhlcndpc2UsIGluY3JlYXNlICAgICovCi0gICAgLyogdGhlIHN0YXJ0IGluZGV4IGJ5IDEgYWZ0ZXIgdGhlIGZpcnN0IGNoYWluLCB0aGVuICAqLwotICAgIC8qIGRvIHRoZSBuZXh0IGNoYWluIHVudGlsIGFsbCBlbGVtZW50cyBpbiBhbGwgICAgICAgKi8KLSAgICAvKiBjaGFpbnMgYXJlIGhhbmRsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBzdGFydF9pZHggPSAtMTsKLSAgICBpZHggICAgICAgPSAtMTsKLSAgICBmb3IgKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIENGMl9TdGFja051bWJlciAgdG1wOwotCi0KLSAgICAgIGlmICggc3RhcnRfaWR4ID09IGlkeCApCi0gICAgICB7Ci0gICAgICAgIHN0YXJ0X2lkeCsrOwotICAgICAgICBpZHggID0gc3RhcnRfaWR4OwotICAgICAgICBsYXN0ID0gc3RhY2stPmJ1ZmZlcltpZHhdOwotICAgICAgfQotCi0gICAgICBpZHggKz0gc2hpZnQ7Ci0gICAgICBpZiAoIGlkeCA+PSBjb3VudCApCi0gICAgICAgIGlkeCAtPSBjb3VudDsKLSAgICAgIGVsc2UgaWYgKCBpZHggPCAwICkKLSAgICAgICAgaWR4ICs9IGNvdW50OwotCi0gICAgICB0bXAgICAgICAgICAgICAgICAgPSBzdGFjay0+YnVmZmVyW2lkeF07Ci0gICAgICBzdGFjay0+YnVmZmVyW2lkeF0gPSBsYXN0OwotICAgICAgbGFzdCAgICAgICAgICAgICAgID0gdG1wOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX3N0YWNrX2NsZWFyKCBDRjJfU3RhY2sgIHN0YWNrICkKLSAgewotICAgIHN0YWNrLT50b3AgPSBzdGFjay0+YnVmZmVyOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmMnN0YWNrLmggYi9zcmMvY2ZmL2NmMnN0YWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDhlZWYuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZjJzdGFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMnN0YWNrLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGVtdWxhdGluZyBhIENGRiBzdGFjayAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIENGMlNUQUNLX0hfCi0jZGVmaW5lIENGMlNUQUNLX0hfCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiBDRkYgb3BlcmFuZCBzdGFjazsgc3BlY2lmaWVkIG1heGltdW0gb2YgNDggb3IgMTkyIHZhbHVlcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX1N0YWNrTnVtYmVyXwotICB7Ci0gICAgdW5pb24KLSAgICB7Ci0gICAgICBDRjJfRml4ZWQgIHI7ICAgICAgLyogMTYuMTYgZml4ZWQgcG9pbnQgKi8KLSAgICAgIENGMl9GcmFjICAgZjsgICAgICAvKiAyLjMwIGZpeGVkIHBvaW50IChmb3IgZm9udCBtYXRyaXgpICovCi0gICAgICBDRjJfSW50ICAgIGk7Ci0gICAgfSB1OwotCi0gICAgQ0YyX051bWJlclR5cGUgIHR5cGU7Ci0KLSAgfSBDRjJfU3RhY2tOdW1iZXI7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX1N0YWNrUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5OwotICAgIEZUX0Vycm9yKiAgICAgICAgIGVycm9yOwotICAgIENGMl9TdGFja051bWJlciogIGJ1ZmZlcjsKLSAgICBDRjJfU3RhY2tOdW1iZXIqICB0b3A7Ci0gICAgRlRfVUludCAgICAgICAgICAgc3RhY2tTaXplOwotCi0gIH0gQ0YyX1N0YWNrUmVjLCAqQ0YyX1N0YWNrOwotCi0KLSAgRlRfTE9DQUwoIENGMl9TdGFjayApCi0gIGNmMl9zdGFja19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHN0YWNrU2l6ZSApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9zdGFja19mcmVlKCBDRjJfU3RhY2sgIHN0YWNrICk7Ci0KLSAgRlRfTE9DQUwoIENGMl9VSW50ICkKLSAgY2YyX3N0YWNrX2NvdW50KCBDRjJfU3RhY2sgIHN0YWNrICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfc3RhY2tfcHVzaEludCggQ0YyX1N0YWNrICBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgIENGMl9JbnQgICAgdmFsICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX3N0YWNrX3B1c2hGaXhlZCggQ0YyX1N0YWNrICBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICB2YWwgKTsKLQotICBGVF9MT0NBTCggQ0YyX0ludCApCi0gIGNmMl9zdGFja19wb3BJbnQoIENGMl9TdGFjayAgc3RhY2sgKTsKLSAgRlRfTE9DQUwoIENGMl9GaXhlZCApCi0gIGNmMl9zdGFja19wb3BGaXhlZCggQ0YyX1N0YWNrICBzdGFjayApOwotCi0gIEZUX0xPQ0FMKCBDRjJfRml4ZWQgKQotICBjZjJfc3RhY2tfZ2V0UmVhbCggQ0YyX1N0YWNrICBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgIENGMl9VSW50ICAgaWR4ICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX3N0YWNrX3NldFJlYWwoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICBDRjJfVUludCAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgdmFsICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfc3RhY2tfcG9wKCBDRjJfU3RhY2sgIHN0YWNrLAotICAgICAgICAgICAgICAgICBDRjJfVUludCAgIG51bSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX3N0YWNrX3JvbGwoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgICBDRjJfSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgICBpZHggKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9zdGFja19jbGVhciggQ0YyX1N0YWNrICBzdGFjayApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogQ0YyU1RBQ0tfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2YydHlwZXMuaCBiL3NyYy9jZmYvY2YydHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3ZTEyMy4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmMnR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJ0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBkZWZpbmluZyBkYXRhIHR5cGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTEtMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDRjJUWVBFU19IXwotI2RlZmluZSBDRjJUWVBFU19IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qCi0gICAqIFRoZSBkYXRhIG1vZGVscyB0aGF0IHdlIGV4cGVjdCB0byBzdXBwb3J0IGFyZSBhcyBmb2xsb3dzOgotICAgKgotICAgKiAgIG5hbWUgIGNoYXIgc2hvcnQgaW50IGxvbmcgbG9uZy1sb25nIHBvaW50ZXIgZXhhbXBsZQotICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICogICBJTFAzMiAgOCAgICAxNiAgICAzMiAgMzIgICAgIDY0KiAgICAgIDMyICAgIDMyLWJpdCBNYWNPUywgeDg2Ci0gICAqICAgTExQNjQgIDggICAgMTYgICAgMzIgIDMyICAgICA2NCAgICAgICA2NCAgICB4NjQKLSAgICogICBMUDY0ICAgOCAgICAxNiAgICAzMiAgNjQgICAgIDY0ICAgICAgIDY0ICAgIDY0LWJpdCBNYWNPUwotICAgKgotICAgKiAgICAqKSB0eXBlIG1heSBiZSBzdXBwb3J0ZWQgYnkgZW11bGF0aW9uIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZQotICAgKgotICAgKi8KLQotCi0gIC8qIGludGVnZXJzIGF0IGxlYXN0IDMyIGJpdHMgd2lkZSAqLwotI2RlZmluZSBDRjJfVUludCAgRlRfVUZhc3QKLSNkZWZpbmUgQ0YyX0ludCAgIEZUX0Zhc3QKLQotCi0gIC8qIGZpeGVkLWZsb2F0IG51bWJlcnMgKi8KLSAgdHlwZWRlZiBGVF9JbnQzMiAgQ0YyX0YxNkRvdDE2OwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogQ0YyVFlQRVNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmLmMgYi9zcmMvY2ZmL2NmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTdmNmRmLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgT3BlblR5cGUgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNpbmNsdWRlICJjZmZjbWFwLmMiCi0jaW5jbHVkZSAiY2ZmZHJpdnIuYyIKLSNpbmNsdWRlICJjZmZnbG9hZC5jIgotI2luY2x1ZGUgImNmZnBhcnNlLmMiCi0jaW5jbHVkZSAiY2ZmcGljLmMiCi0jaW5jbHVkZSAiY2ZmbG9hZC5jIgotI2luY2x1ZGUgImNmZm9ianMuYyIKLQotI2luY2x1ZGUgImNmMmFycnN0LmMiCi0jaW5jbHVkZSAiY2YyYmx1ZXMuYyIKLSNpbmNsdWRlICJjZjJlcnJvci5jIgotI2luY2x1ZGUgImNmMmZvbnQuYyIKLSNpbmNsdWRlICJjZjJmdC5jIgotI2luY2x1ZGUgImNmMmhpbnRzLmMiCi0jaW5jbHVkZSAiY2YyaW50cnAuYyIKLSNpbmNsdWRlICJjZjJyZWFkLmMiCi0jaW5jbHVkZSAiY2Yyc3RhY2suYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmY21hcC5jIGIvc3JjL2NmZi9jZmZjbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZGNlN2EuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZjbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmY21hcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENGRiBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSAoY21hcCkgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlICJjZmZjbWFwLmgiCi0jaW5jbHVkZSAiY2ZmbG9hZC5oIgotCi0jaW5jbHVkZSAiY2ZmZXJycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICBDRkYgU1RBTkRBUkQgKEFORCBFWFBFUlQpIEVOQ09ESU5HIENNQVBTICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGNmZl9jbWFwX2VuY29kaW5nX2luaXQoIENGRl9DTWFwU3RkICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgcG9pbnRlciApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgIGZhY2UgICAgID0gKFRUX0ZhY2UpRlRfQ01BUF9GQUNFKCBjbWFwICk7Ci0gICAgQ0ZGX0ZvbnQgICAgICBjZmYgICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIENGRl9FbmNvZGluZyAgZW5jb2RpbmcgPSAmY2ZmLT5lbmNvZGluZzsKLQotICAgIEZUX1VOVVNFRCggcG9pbnRlciApOwotCi0KLSAgICBjbWFwLT5naWRzICA9IGVuY29kaW5nLT5jb2RlczsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBjZmZfY21hcF9lbmNvZGluZ19kb25lKCBDRkZfQ01hcFN0ZCAgY21hcCApCi0gIHsKLSAgICBjbWFwLT5naWRzICA9IE5VTEw7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIGNmZl9jbWFwX2VuY29kaW5nX2NoYXJfaW5kZXgoIENGRl9DTWFwU3RkICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VJbnQgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggY2hhcl9jb2RlIDwgMjU2ICkKLSAgICAgIHJlc3VsdCA9IGNtYXAtPmdpZHNbY2hhcl9jb2RlXTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgY2ZmX2NtYXBfZW5jb2RpbmdfY2hhcl9uZXh0KCBDRkZfQ01hcFN0ZCAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgICpwY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VJbnQgICAgcmVzdWx0ICAgID0gMDsKLSAgICBGVF9VSW50MzIgIGNoYXJfY29kZSA9ICpwY2hhcl9jb2RlOwotCi0KLSAgICAqcGNoYXJfY29kZSA9IDA7Ci0KLSAgICBpZiAoIGNoYXJfY29kZSA8IDI1NSApCi0gICAgewotICAgICAgRlRfVUludCAgY29kZSA9IChGVF9VSW50KShjaGFyX2NvZGUgKyAxKTsKLQotCi0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICBpZiAoIGNvZGUgPj0gMjU2ICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICByZXN1bHQgPSBjbWFwLT5naWRzW2NvZGVdOwotICAgICAgICBpZiAoIHJlc3VsdCAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgICpwY2hhcl9jb2RlID0gY29kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNvZGUrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfREVGSU5FX0NNQVBfQ0xBU1MoCi0gICAgY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjLAotCi0gICAgc2l6ZW9mICggQ0ZGX0NNYXBTdGRSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgY2ZmX2NtYXBfZW5jb2RpbmdfaW5pdCwgICAgICAgIC8qIGluaXQgICAgICAgKi8KLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIGNmZl9jbWFwX2VuY29kaW5nX2RvbmUsICAgICAgICAvKiBkb25lICAgICAgICovCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyljZmZfY21hcF9lbmNvZGluZ19jaGFyX2luZGV4LCAgLyogY2hhcl9pbmRleCAqLwotICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgY2ZmX2NtYXBfZW5jb2RpbmdfY2hhcl9uZXh0LCAgIC8qIGNoYXJfbmV4dCAgKi8KLQotICAgIChGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpICAgIE5VTEwsICAvKiBjaGFyX3Zhcl9pbmRleCAgICovCi0gICAgKEZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMpTlVMTCwgIC8qIGNoYXJfdmFyX2RlZmF1bHQgKi8KLSAgICAoRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMpICAgICBOVUxMLCAgLyogdmFyaWFudF9saXN0ICAgICAqLwotICAgIChGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMpIE5VTEwsICAvKiBjaGFydmFyaWFudF9saXN0ICovCi0gICAgKEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYykgTlVMTCAgIC8qIHZhcmlhbnRjaGFyX2xpc3QgKi8KLSAgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICBDRkYgU1lOVEhFVElDIFVOSUNPREUgRU5DT0RJTkcgQ01BUCAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBjb25zdCBjaGFyKiApCi0gIGNmZl9zaWRfdG9fZ2x5cGhfbmFtZSggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBpZHggKQotICB7Ci0gICAgQ0ZGX0ZvbnQgICAgIGNmZiAgICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBDRkZfQ2hhcnNldCAgY2hhcnNldCA9ICZjZmYtPmNoYXJzZXQ7Ci0gICAgRlRfVUludCAgICAgIHNpZCAgICAgPSBjaGFyc2V0LT5zaWRzW2lkeF07Ci0KLQotICAgIHJldHVybiBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwgc2lkICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBjZmZfY21hcF91bmljb2RlX2luaXQoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgcG9pbnRlciApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgICAgIGZhY2UgICAgPSAoVFRfRmFjZSlGVF9DTUFQX0ZBQ0UoIHVuaWNvZGVzICk7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLSAgICBDRkZfRm9udCAgICAgICAgICAgIGNmZiAgICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBDRkZfQ2hhcnNldCAgICAgICAgIGNoYXJzZXQgPSAmY2ZmLT5jaGFyc2V0OwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpY2ZmLT5wc25hbWVzOwotCi0gICAgRlRfVU5VU0VEKCBwb2ludGVyICk7Ci0KLQotICAgIC8qIGNhbid0IGJ1aWxkIFVuaWNvZGUgbWFwIGZvciBDSUQta2V5ZWQgZm9udCAqLwotICAgIC8qIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBnbHlwaCBuYW1lcy4gICAgICAgICAqLwotICAgIGlmICggIWNoYXJzZXQtPnNpZHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBOb19Vbmljb2RlX0dseXBoX05hbWUgKTsKLQotICAgIHJldHVybiBwc25hbWVzLT51bmljb2Rlc19pbml0KCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmYtPm51bV9nbHlwaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19HZXRHbHlwaE5hbWVGdW5jKSZjZmZfc2lkX3RvX2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19GcmVlR2x5cGhOYW1lRnVuYylOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfUG9pbnRlcilmYWNlICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGNmZl9jbWFwX3VuaWNvZGVfZG9uZSggUFNfVW5pY29kZXMgIHVuaWNvZGVzICkKLSAgewotICAgIEZUX0ZhY2UgICAgZmFjZSAgID0gRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotCi0gICAgRlRfRlJFRSggdW5pY29kZXMtPm1hcHMgKTsKLSAgICB1bmljb2Rlcy0+bnVtX21hcHMgPSAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICBjZmZfY21hcF91bmljb2RlX2NoYXJfaW5kZXgoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgY2hhcl9jb2RlICkKLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgICAgZmFjZSAgICA9IChUVF9GYWNlKUZUX0NNQVBfRkFDRSggdW5pY29kZXMgKTsKLSAgICBDRkZfRm9udCAgICAgICAgICAgIGNmZiAgICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXMgPSAoRlRfU2VydmljZV9Qc0NNYXBzKWNmZi0+cHNuYW1lczsKLQotCi0gICAgcmV0dXJuIHBzbmFtZXMtPnVuaWNvZGVzX2NoYXJfaW5kZXgoIHVuaWNvZGVzLCBjaGFyX2NvZGUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICBjZmZfY21hcF91bmljb2RlX2NoYXJfbmV4dCggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFRUX0ZhY2UpRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIENGRl9Gb250ICAgICAgICAgICAgY2ZmICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpY2ZmLT5wc25hbWVzOwotCi0KLSAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfY2hhcl9uZXh0KCB1bmljb2RlcywgcGNoYXJfY29kZSApOwotICB9Ci0KLQotICBGVF9ERUZJTkVfQ01BUF9DTEFTUygKLSAgICBjZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYywKLQotICAgIHNpemVvZiAoIFBTX1VuaWNvZGVzUmVjICksCi0KLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIGNmZl9jbWFwX3VuaWNvZGVfaW5pdCwgICAgICAgIC8qIGluaXQgICAgICAgKi8KLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIGNmZl9jbWFwX3VuaWNvZGVfZG9uZSwgICAgICAgIC8qIGRvbmUgICAgICAgKi8KLSAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKWNmZl9jbWFwX3VuaWNvZGVfY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIGNmZl9jbWFwX3VuaWNvZGVfY2hhcl9uZXh0LCAgIC8qIGNoYXJfbmV4dCAgKi8KLQotICAgIChGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpICAgIE5VTEwsICAvKiBjaGFyX3Zhcl9pbmRleCAgICovCi0gICAgKEZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMpTlVMTCwgIC8qIGNoYXJfdmFyX2RlZmF1bHQgKi8KLSAgICAoRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMpICAgICBOVUxMLCAgLyogdmFyaWFudF9saXN0ICAgICAqLwotICAgIChGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMpIE5VTEwsICAvKiBjaGFydmFyaWFudF9saXN0ICovCi0gICAgKEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYykgTlVMTCAgIC8qIHZhcmlhbnRjaGFyX2xpc3QgKi8KLSAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZjbWFwLmggYi9zcmMvY2ZmL2NmZmNtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MmUwNC4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZmNtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgKGNtYXApIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDRkZDTUFQX0hfCi0jZGVmaW5lIENGRkNNQVBfSF8KLQotI2luY2x1ZGUgImNmZm9ianMuaCIKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgVFlQRTEgU1RBTkRBUkQgKEFORCBFWFBFUlQpIEVOQ09ESU5HIENNQVBTICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBzdGFuZGFyZCAoYW5kIGV4cGVydCkgZW5jb2RpbmcgY21hcHMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0ZGX0NNYXBTdGRSZWNfKiAgQ0ZGX0NNYXBTdGQ7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9DTWFwU3RkUmVjXwotICB7Ci0gICAgRlRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VU2hvcnQqICBnaWRzOyAgIC8qIHVwIHRvIDI1NiBlbGVtZW50cyAqLwotCi0gIH0gQ0ZGX0NNYXBTdGRSZWM7Ci0KLQotICBGVF9ERUNMQVJFX0NNQVBfQ0xBU1MoY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgQ0ZGIFNZTlRIRVRJQyBVTklDT0RFIEVOQ09ESU5HIENNQVAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogdW5pY29kZSAoc3ludGhldGljKSBjbWFwcyAqLwotCi0gIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyhjZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYykKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBDRkZDTUFQX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZmRyaXZyLmMgYi9zcmMvY2ZmL2NmZmRyaXZyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmZjMmMuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZkcml2ci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZkcml2ci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgZm9udCBkcml2ZXIgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9DSURfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0lORk9fSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UVF9DTUFQX0gKLQotI2luY2x1ZGUgImNmZmRyaXZyLmgiCi0jaW5jbHVkZSAiY2ZmZ2xvYWQuaCIKLSNpbmNsdWRlICJjZmZsb2FkLmgiCi0jaW5jbHVkZSAiY2ZmY21hcC5oIgotI2luY2x1ZGUgImNmZnBhcnNlLmgiCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSAotI2VuZGlmCi0KLSNpbmNsdWRlICJjZmZlcnJzLmgiCi0jaW5jbHVkZSAiY2ZmcGljLmgiCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfRk9OVF9GT1JNQVRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ICi0jaW5jbHVkZSBGVF9DRkZfRFJJVkVSX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmZmRyaXZlcgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgRiBBIEMgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2dldF9rZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gcmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBiZXR3ZWVuIHR3byAgICAgICovCi0gIC8qICAgIGdseXBocyBvZiB0aGUgc2FtZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVmdF9nbHlwaCAgOjogVGhlIGluZGV4IG9mIHRoZSBsZWZ0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByaWdodF9nbHlwaCA6OiBUaGUgaW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBrZXJuaW5nICAgICA6OiBUaGUga2VybmluZyB2ZWN0b3IuICBUaGlzIGlzIGluIGZvbnQgdW5pdHMgZm9yICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2NhbGFibGUgZm9ybWF0cywgYW5kIGluIHBpeGVscyBmb3IgZml4ZWQtc2l6ZXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgaG9yaXpvbnRhbCBsYXlvdXRzIChsZWZ0LXRvLXJpZ2h0ICYgcmlnaHQtdG8tbGVmdCkgYXJlICAgICAgICAqLwotICAvKiAgICBzdXBwb3J0ZWQgYnkgdGhpcyBmdW5jdGlvbi4gIE90aGVyIGxheW91dHMsIG9yIG1vcmUgc29waGlzdGljYXRlZCAgKi8KLSAgLyogICAga2VybmluZ3MsIGFyZSBvdXQgb2Ygc2NvcGUgb2YgdGhpcyBtZXRob2QgKHRoZSBiYXNpYyBkcml2ZXIgICAgICAgICovCi0gIC8qICAgIGludGVyZmFjZSBpcyBtZWFudCB0byBiZSBzaW1wbGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhleSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgZm9ybWF0LXNwZWNpZmljIGludGVyZmFjZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2dldF9rZXJuaW5nKCBGVF9GYWNlICAgICB0dGZhY2UsICAgICAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0X2dseXBoLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGtlcm5pbmcgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICBmYWNlID0gKFRUX0ZhY2UpdHRmYWNlOwotICAgIFNGTlRfU2VydmljZSAgc2ZudCA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotCi0gICAga2VybmluZy0+eCA9IDA7Ci0gICAga2VybmluZy0+eSA9IDA7Ci0KLSAgICBpZiAoIHNmbnQgKQotICAgICAga2VybmluZy0+eCA9IHNmbnQtPmdldF9rZXJuaW5nKCBmYWNlLCBsZWZ0X2dseXBoLCByaWdodF9nbHlwaCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2dseXBoX2xvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gbG9hZCBhIGdseXBoIHdpdGhpbiBhIGdpdmVuIGdseXBoIHNsb3QuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2xvdCAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzbG90IG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIHNpemUgYXQgd2hpY2ggdGhlIGdseXBoICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG11c3QgYmUgc2NhbGVkLCBsb2FkZWQsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCBpbiB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgRlRfTE9BRF8/Pz8gY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2dseXBoX2xvYWQoIEZUX0dseXBoU2xvdCAgY2Zmc2xvdCwgICAgICAvKiBDRkZfR2x5cGhTbG90ICovCi0gICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIGNmZnNpemUsICAgICAgLyogQ0ZGX1NpemUgICAgICAqLwotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLSAgICBDRkZfR2x5cGhTbG90ICBzbG90ID0gKENGRl9HbHlwaFNsb3QpY2Zmc2xvdDsKLSAgICBDRkZfU2l6ZSAgICAgICBzaXplID0gKENGRl9TaXplKWNmZnNpemU7Ci0KLQotICAgIGlmICggIXNsb3QgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1Nsb3RfSGFuZGxlICk7Ci0KLSAgICBGVF9UUkFDRTEoKCAiY2ZmX2dseXBoX2xvYWQ6IGdseXBoIGluZGV4ICVkXG4iLCBnbHlwaF9pbmRleCApKTsKLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgd2Ugd2FudCBhIHNjYWxlZCBvdXRsaW5lIG9yIGJpdG1hcCAqLwotICAgIGlmICggIXNpemUgKQotICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19ISU5USU5HOwotCi0gICAgLyogcmVzZXQgdGhlIHNpemUgb2JqZWN0IGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKQotICAgICAgc2l6ZSA9IE5VTEw7Ci0KLSAgICBpZiAoIHNpemUgKQotICAgIHsKLSAgICAgIC8qIHRoZXNlIHR3byBvYmplY3RzIG11c3QgaGF2ZSB0aGUgc2FtZSBwYXJlbnQgKi8KLSAgICAgIGlmICggY2Zmc2l6ZS0+ZmFjZSAhPSBjZmZzbG90LT5mYWNlICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0gICAgfQotCi0gICAgLyogbm93IGxvYWQgdGhlIGdseXBoIG91dGxpbmUgaWYgbmVjZXNzYXJ5ICovCi0gICAgZXJyb3IgPSBjZmZfc2xvdF9sb2FkKCBzbG90LCBzaXplLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotCi0gICAgLyogZm9yY2UgZHJvcC1vdXQgbW9kZSB0byAyIC0gaXJyZWxldmFudCBub3cgKi8KLSAgICAvKiBzbG90LT5vdXRsaW5lLmRyb3BvdXRfbW9kZSA9IDI7ICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZ2V0X2FkdmFuY2VzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWR2YW5jZXMgKQotICB7Ci0gICAgRlRfVUludCAgICAgICBubjsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0dseXBoU2xvdCAgc2xvdCAgPSBmYWNlLT5nbHlwaDsKLQotCi0gICAgaWYgKCBGVF9JU19TRk5UKCBmYWNlICkgKQotICAgIHsKLSAgICAgIC8qIE9wZW5UeXBlIDEuNyBtYW5kYXRlcyB0aGF0IHRoZSBkYXRhIGZyb20gYGhtdHgnIHRhYmxlIGJlIHVzZWQ7ICovCi0gICAgICAvKiBpdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRoYXQgdGhvc2UgdmFsdWVzIGFyZSBpZGVudGljYWwgdG8gICAqLwotICAgICAgLyogdGhlIHZhbHVlcyBpbiB0aGUgYENGRicgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgVFRfRmFjZSAgIHR0ZmFjZSA9IChUVF9GYWNlKWZhY2U7Ci0gICAgICBGVF9TaG9ydCAgZHVtbXk7Ci0KLQotICAgICAgaWYgKCBmbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICAgIHsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgICAgIC8qIG5vIGZhc3QgcmV0cmlldmFsIGZvciBibGVuZGVkIE1NIGZvbnRzIHdpdGhvdXQgVlZBUiB0YWJsZSAqLwotICAgICAgICBpZiAoICF0dGZhY2UtPmlzX2RlZmF1bHRfaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAhKCB0dGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9WQURWQU5DRSApICkKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotI2VuZGlmCi0KLSAgICAgICAgLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGRhdGEgZnJvbSB0aGUgYHZtdHgnIHRhYmxlIGF0IGFsbDsgKi8KLSAgICAgICAgLyogb3RoZXJ3aXNlIHdlIGV4dHJhY3QgdGhlIGluZm8gZnJvbSB0aGUgQ0ZGIGdseXBoc3RyaW5ncyAgKi8KLSAgICAgICAgLyogKGluc3RlYWQgb2Ygc3ludGhlc2l6aW5nIGEgZ2xvYmFsIHZhbHVlIHVzaW5nIHRoZSBgT1MvMicgKi8KLSAgICAgICAgLyogdGFibGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAhdHRmYWNlLT52ZXJ0aWNhbF9pbmZvICkKLSAgICAgICAgICBnb3RvIE1pc3NpbmdfVGFibGU7Ci0KLSAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IGNvdW50OyBubisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VTaG9ydCAgYWg7Ci0KLQotICAgICAgICAgICggKFNGTlRfU2VydmljZSl0dGZhY2UtPnNmbnQgKS0+Z2V0X21ldHJpY3MoIHR0ZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhaCApOwotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgaWR4ICVkOiBhZHZhbmNlIGhlaWdodCAlZCBmb250IHVuaXRzXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgbm4sIGFoICkpOwotICAgICAgICAgIGFkdmFuY2VzW25uXSA9IGFoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgICAgICAvKiBubyBmYXN0IHJldHJpZXZhbCBmb3IgYmxlbmRlZCBNTSBmb250cyB3aXRob3V0IEhWQVIgdGFibGUgKi8KLSAgICAgICAgaWYgKCAhdHRmYWNlLT5pc19kZWZhdWx0X2luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgISggdHRmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfSEFEVkFOQ0UgKSApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSNlbmRpZgotCi0gICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBkYXRhIGZyb20gdGhlIGBobXR4JyB0YWJsZSBhdCBhbGwgKi8KLSAgICAgICAgaWYgKCAhdHRmYWNlLT5ob3Jpem9udGFsLm51bWJlcl9PZl9ITWV0cmljcyApCi0gICAgICAgICAgZ290byBNaXNzaW5nX1RhYmxlOwotCi0gICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VU2hvcnQgIGF3OwotCi0KLSAgICAgICAgICAoIChTRk5UX1NlcnZpY2UpdHRmYWNlLT5zZm50ICktPmdldF9tZXRyaWNzKCB0dGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIG5uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXcgKTsKLQotICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGlkeCAlZDogYWR2YW5jZSB3aWR0aCAlZCBmb250IHVuaXRzXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgbm4sIGF3ICkpOwotICAgICAgICAgIGFkdmFuY2VzW25uXSA9IGF3OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgTWlzc2luZ19UYWJsZToKLSAgICBmbGFncyB8PSAoRlRfVUludDMyKUZUX0xPQURfQURWQU5DRV9PTkxZOwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IGNvdW50OyBubisrICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGNmZl9nbHlwaF9sb2FkKCBzbG90LCBmYWNlLT5zaXplLCBzdGFydCArIG5uLCBmbGFncyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBhZHZhbmNlc1tubl0gPSAoIGZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKQotICAgICAgICAgICAgICAgICAgICAgPyBzbG90LT5saW5lYXJWZXJ0QWR2YW5jZQotICAgICAgICAgICAgICAgICAgICAgOiBzbG90LT5saW5lYXJIb3JpQWR2YW5jZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qCi0gICAqICBHTFlQSCBESUNUIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfZ2x5cGhfbmFtZSggQ0ZGX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApCi0gIHsKLSAgICBDRkZfRm9udCAgICBmb250ICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBGVF9TdHJpbmcqICBnbmFtZTsKLSAgICBGVF9VU2hvcnQgICBzaWQ7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0KLQotICAgIC8qIENGRjIgdGFibGUgZG9lcyBub3QgaGF2ZSBnbHlwaCBuYW1lczsgKi8KLSAgICAvKiB3ZSBuZWVkIHRvIHVzZSBgcG9zdCcgdGFibGUgbWV0aG9kICAgICovCi0gICAgaWYgKCBmb250LT52ZXJzaW9uX21ham9yID09IDIgKQotICAgIHsKLSAgICAgIEZUX0xpYnJhcnkgICAgICAgICAgICBsaWJyYXJ5ICAgICA9IEZUX0ZBQ0VfTElCUkFSWSggZmFjZSApOwotICAgICAgRlRfTW9kdWxlICAgICAgICAgICAgIHNmbnRfbW9kdWxlID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgInNmbnQiICk7Ci0gICAgICBGVF9TZXJ2aWNlX0dseXBoRGljdCAgc2VydmljZSAgICAgPQotICAgICAgICAoRlRfU2VydmljZV9HbHlwaERpY3QpZnRfbW9kdWxlX2dldF9zZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZudF9tb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0KLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPmdldF9uYW1lICkKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UtPmdldF9uYW1lKCBGVF9GQUNFKCBmYWNlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9tYXggKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2dldF9nbHlwaF9uYW1lOiIKLSAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBnZXQgZ2x5cGggbmFtZSBmcm9tIGEgQ0ZGMiBmb250XG4iCi0gICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgIiB3aXRob3V0IHRoZSBgUFNOYW1lcycgbW9kdWxlXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX01vZHVsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAhZm9udC0+cHNuYW1lcyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiY2ZmX2dldF9nbHlwaF9uYW1lOiIKLSAgICAgICAgICAgICAgICAgIiBjYW5ub3QgZ2V0IGdseXBoIG5hbWUgZnJvbSBDRkYgJiBDRUYgZm9udHNcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICIgd2l0aG91dCB0aGUgYFBTTmFtZXMnIG1vZHVsZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE1pc3NpbmdfTW9kdWxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogZmlyc3QsIGxvY2F0ZSB0aGUgc2lkIGluIHRoZSBjaGFyc2V0IHRhYmxlICovCi0gICAgc2lkID0gZm9udC0+Y2hhcnNldC5zaWRzW2dseXBoX2luZGV4XTsKLQotICAgIC8qIG5vdywgbG9va3VwIHRoZSBuYW1lIGl0c2VsZiAqLwotICAgIGduYW1lID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBmb250LCBzaWQgKTsKLQotICAgIGlmICggZ25hbWUgKQotICAgICAgRlRfU1RSQ1BZTiggYnVmZmVyLCBnbmFtZSwgYnVmZmVyX21heCApOwotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIGNmZl9nZXRfbmFtZV9pbmRleCggQ0ZGX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKLSAgewotICAgIENGRl9Gb250ICAgICAgICAgICAgY2ZmOwotICAgIENGRl9DaGFyc2V0ICAgICAgICAgY2hhcnNldDsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0gICAgRlRfU3RyaW5nKiAgICAgICAgICBuYW1lOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgc2lkOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgaTsKLQotCi0gICAgY2ZmICAgICA9IChDRkZfRm9udFJlYyAqKWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgY2hhcnNldCA9ICZjZmYtPmNoYXJzZXQ7Ci0KLSAgICAvKiBDRkYyIHRhYmxlIGRvZXMgbm90IGhhdmUgZ2x5cGggbmFtZXM7ICovCi0gICAgLyogd2UgbmVlZCB0byB1c2UgYHBvc3QnIHRhYmxlIG1ldGhvZCAgICAqLwotICAgIGlmICggY2ZmLT52ZXJzaW9uX21ham9yID09IDIgKQotICAgIHsKLSAgICAgIEZUX0xpYnJhcnkgICAgICAgICAgICBsaWJyYXJ5ICAgICA9IEZUX0ZBQ0VfTElCUkFSWSggZmFjZSApOwotICAgICAgRlRfTW9kdWxlICAgICAgICAgICAgIHNmbnRfbW9kdWxlID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgInNmbnQiICk7Ci0gICAgICBGVF9TZXJ2aWNlX0dseXBoRGljdCAgc2VydmljZSAgICAgPQotICAgICAgICAoRlRfU2VydmljZV9HbHlwaERpY3QpZnRfbW9kdWxlX2dldF9zZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZudF9tb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0KLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPm5hbWVfaW5kZXggKQotICAgICAgICByZXR1cm4gc2VydmljZS0+bmFtZV9pbmRleCggRlRfRkFDRSggZmFjZSApLCBnbHlwaF9uYW1lICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9nZXRfbmFtZV9pbmRleDoiCi0gICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgZ2V0IGdseXBoIGluZGV4IGZyb20gYSBDRkYyIGZvbnRcbiIKLSAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAiIHdpdGhvdXQgdGhlIGBQU05hbWVzJyBtb2R1bGVcbiIgKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLQotICAgIEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSggZmFjZSwgcHNuYW1lcywgUE9TVFNDUklQVF9DTUFQUyApOwotICAgIGlmICggIXBzbmFtZXMgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGNmZi0+bnVtX2dseXBoczsgaSsrICkKLSAgICB7Ci0gICAgICBzaWQgPSBjaGFyc2V0LT5zaWRzW2ldOwotCi0gICAgICBpZiAoIHNpZCA+IDM5MCApCi0gICAgICAgIG5hbWUgPSBjZmZfaW5kZXhfZ2V0X3N0cmluZyggY2ZmLCBzaWQgLSAzOTEgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgbmFtZSA9IChGVF9TdHJpbmcgKilwc25hbWVzLT5hZG9iZV9zdGRfc3RyaW5ncyggc2lkICk7Ci0KLSAgICAgIGlmICggIW5hbWUgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCAhZnRfc3RyY21wKCBnbHlwaF9uYW1lLCBuYW1lICkgKQotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0VfR0xZUEhESUNUUkVDKAotICAgIGNmZl9zZXJ2aWNlX2dseXBoX2RpY3QsCi0KLSAgICAoRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jKSAgY2ZmX2dldF9nbHlwaF9uYW1lLCAgICAgIC8qIGdldF9uYW1lICAgKi8KLSAgICAoRlRfR2x5cGhEaWN0X05hbWVJbmRleEZ1bmMpY2ZmX2dldF9uYW1lX2luZGV4ICAgICAgIC8qIG5hbWVfaW5kZXggKi8KLSAgKQotCi0KLSAgLyoKLSAgICogIFBPU1RTQ1JJUFQgSU5GTyBTRVJWSUNFCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9JbnQKLSAgY2ZmX3BzX2hhc19nbHlwaF9uYW1lcyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICByZXR1cm4gKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTICkgPiAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3BzX2dldF9mb250X2luZm8oIENGRl9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvUmVjKiAgYWZvbnRfaW5mbyApCi0gIHsKLSAgICBDRkZfRm9udCAgY2ZmICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggY2ZmICYmICFjZmYtPmZvbnRfaW5mbyApCi0gICAgewotICAgICAgQ0ZGX0ZvbnRSZWNEaWN0ICBkaWN0ICAgICAgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7Ci0gICAgICBQU19Gb250SW5mb1JlYyAgKmZvbnRfaW5mbyA9IE5VTEw7Ci0gICAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSAgICA9IGZhY2UtPnJvb3QubWVtb3J5OwotCi0KLSAgICAgIGlmICggRlRfQUxMT0MoIGZvbnRfaW5mbywgc2l6ZW9mICggKmZvbnRfaW5mbyApICkgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGZvbnRfaW5mby0+dmVyc2lvbiAgICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPnZlcnNpb24gKTsKLSAgICAgIGZvbnRfaW5mby0+bm90aWNlICAgICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPm5vdGljZSApOwotICAgICAgZm9udF9pbmZvLT5mdWxsX25hbWUgICA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+ZnVsbF9uYW1lICk7Ci0gICAgICBmb250X2luZm8tPmZhbWlseV9uYW1lID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5mYW1pbHlfbmFtZSApOwotICAgICAgZm9udF9pbmZvLT53ZWlnaHQgICAgICA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+d2VpZ2h0ICk7Ci0gICAgICBmb250X2luZm8tPml0YWxpY19hbmdsZSAgICAgICAgPSBkaWN0LT5pdGFsaWNfYW5nbGU7Ci0gICAgICBmb250X2luZm8tPmlzX2ZpeGVkX3BpdGNoICAgICAgPSBkaWN0LT5pc19maXhlZF9waXRjaDsKLSAgICAgIGZvbnRfaW5mby0+dW5kZXJsaW5lX3Bvc2l0aW9uICA9IChGVF9TaG9ydClkaWN0LT51bmRlcmxpbmVfcG9zaXRpb247Ci0gICAgICBmb250X2luZm8tPnVuZGVybGluZV90aGlja25lc3MgPSAoRlRfVVNob3J0KWRpY3QtPnVuZGVybGluZV90aGlja25lc3M7Ci0KLSAgICAgIGNmZi0+Zm9udF9pbmZvID0gZm9udF9pbmZvOwotICAgIH0KLQotICAgIGlmICggY2ZmICkKLSAgICAgICphZm9udF9pbmZvID0gKmNmZi0+Zm9udF9pbmZvOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9QU0lORk9SRUMoCi0gICAgY2ZmX3NlcnZpY2VfcHNfaW5mbywKLQotICAgIChQU19HZXRGb250SW5mb0Z1bmMpICAgY2ZmX3BzX2dldF9mb250X2luZm8sICAgIC8qIHBzX2dldF9mb250X2luZm8gICAgKi8KLSAgICAoUFNfR2V0Rm9udEV4dHJhRnVuYykgIE5VTEwsICAgICAgICAgICAgICAgICAgICAvKiBwc19nZXRfZm9udF9leHRyYSAgICovCi0gICAgKFBTX0hhc0dseXBoTmFtZXNGdW5jKSBjZmZfcHNfaGFzX2dseXBoX25hbWVzLCAgLyogcHNfaGFzX2dseXBoX25hbWVzICAqLwotICAgIC8qIHVuc3VwcG9ydGVkIHdpdGggQ0ZGIGZvbnRzICovCi0gICAgKFBTX0dldEZvbnRQcml2YXRlRnVuYylOVUxMLCAgICAgICAgICAgICAgICAgICAgLyogcHNfZ2V0X2ZvbnRfcHJpdmF0ZSAqLwotICAgIC8qIG5vdCBpbXBsZW1lbnRlZCAgICAgICAgICAgICovCi0gICAgKFBTX0dldEZvbnRWYWx1ZUZ1bmMpICBOVUxMICAgICAgICAgICAgICAgICAgICAgLyogcHNfZ2V0X2ZvbnRfdmFsdWUgICAqLwotICApCi0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIGNmZl9nZXRfcHNfbmFtZSggQ0ZGX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgQ0ZGX0ZvbnQgICAgICBjZmYgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgU0ZOVF9TZXJ2aWNlICBzZm50ID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotCi0KLSAgICAvKiBmb2xsb3dpbmcgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gMS43LCB3ZSByZXR1cm4gdGhlIG5hbWUgc3RvcmVkICovCi0gICAgLyogaW4gdGhlIGBuYW1lJyB0YWJsZSBmb3IgYSBDRkYgd3JhcHBlZCBpbnRvIGFuIFNGTlQgY29udGFpbmVyICAgICAgICAqLwotCi0gICAgaWYgKCBGVF9JU19TRk5UKCBGVF9GQUNFKCBmYWNlICkgKSAmJiBzZm50ICkKLSAgICB7Ci0gICAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgIGxpYnJhcnkgICAgID0gRlRfRkFDRV9MSUJSQVJZKCBmYWNlICk7Ci0gICAgICBGVF9Nb2R1bGUgICAgICAgICAgICAgIHNmbnRfbW9kdWxlID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgInNmbnQiICk7Ci0gICAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWUgIHNlcnZpY2UgICAgID0KLSAgICAgICAgKEZUX1NlcnZpY2VfUHNGb250TmFtZSlmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0KLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPmdldF9wc19mb250X25hbWUgKQotICAgICAgICByZXR1cm4gc2VydmljZS0+Z2V0X3BzX2ZvbnRfbmFtZSggRlRfRkFDRSggZmFjZSApICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChjb25zdCBjaGFyKiljZmYtPmZvbnRfbmFtZTsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0VfUFNGT05UTkFNRVJFQygKLSAgICBjZmZfc2VydmljZV9wc19uYW1lLAotCi0gICAgKEZUX1BzTmFtZV9HZXRGdW5jKWNmZl9nZXRfcHNfbmFtZSAgICAgIC8qIGdldF9wc19mb250X25hbWUgKi8KLSAgKQotCi0KLSAgLyoKLSAgICogVFQgQ01BUCBJTkZPCi0gICAqCi0gICAqIElmIHRoZSBjaGFybWFwIGlzIGEgc3ludGhldGljIFVuaWNvZGUgZW5jb2RpbmcgY21hcCBvcgotICAgKiBhIFR5cGUgMSBzdGFuZGFyZCAob3IgZXhwZXJ0KSBlbmNvZGluZyBjbWFwLCBoaWRlIFRUIENNQVAgSU5GTwotICAgKiBzZXJ2aWNlIGRlZmluZWQgaW4gU0ZOVCBtb2R1bGUuCi0gICAqCi0gICAqIE90aGVyd2lzZSBjYWxsIHRoZSBzZXJ2aWNlIGZ1bmN0aW9uIGluIHRoZSBzZm50IG1vZHVsZS4KLSAgICoKLSAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfZ2V0X2NtYXBfaW5mbyggRlRfQ2hhck1hcCAgICBjaGFybWFwLAotICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQ01hcCAgIGNtYXAgID0gRlRfQ01BUCggY2hhcm1hcCApOwotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIEZUX0ZhY2UgICAgIGZhY2UgICAgPSBGVF9DTUFQX0ZBQ0UoIGNtYXAgKTsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gRlRfRkFDRV9MSUJSQVJZKCBmYWNlICk7Ci0KLQotICAgIGlmICggY21hcC0+Y2xhenogIT0gJkNGRl9DTUFQX0VOQ09ESU5HX0NMQVNTX1JFQ19HRVQgJiYKLSAgICAgICAgIGNtYXAtPmNsYXp6ICE9ICZDRkZfQ01BUF9VTklDT0RFX0NMQVNTX1JFQ19HRVQgICkKLSAgICB7Ci0gICAgICBGVF9Nb2R1bGUgICAgICAgICAgIHNmbnQgICAgPSBGVF9HZXRfTW9kdWxlKCBsaWJyYXJ5LCAic2ZudCIgKTsKLSAgICAgIEZUX1NlcnZpY2VfVFRDTWFwcyAgc2VydmljZSA9Ci0gICAgICAgIChGVF9TZXJ2aWNlX1RUQ01hcHMpZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBzZm50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOwotCi0KLSAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5nZXRfY21hcF9pbmZvICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfY21hcF9pbmZvKCBjaGFybWFwLCBjbWFwX2luZm8gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9DaGFyTWFwX0Zvcm1hdCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9UVENNQVBTUkVDKAotICAgIGNmZl9zZXJ2aWNlX2dldF9jbWFwX2luZm8sCi0KLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpY2ZmX2dldF9jbWFwX2luZm8gICAgLyogZ2V0X2NtYXBfaW5mbyAqLwotICApCi0KLQotICAvKgotICAgKiAgQ0lEIElORk8gU0VSVklDRQotICAgKgotICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfcm9zKCBDRkZfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKnJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpvcmRlcmluZywKLSAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqc3VwcGxlbWVudCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgQ0ZGX0ZvbnQgIGNmZiAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0KLQotICAgIGlmICggY2ZmICkKLSAgICB7Ci0gICAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3QgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7Ci0KLQotICAgICAgaWYgKCBkaWN0LT5jaWRfcmVnaXN0cnkgPT0gMHhGRkZGVSApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICBpZiAoIHJlZ2lzdHJ5ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAhY2ZmLT5yZWdpc3RyeSApCi0gICAgICAgICAgY2ZmLT5yZWdpc3RyeSA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9yZWdpc3RyeSApOwotICAgICAgICAqcmVnaXN0cnkgPSBjZmYtPnJlZ2lzdHJ5OwotICAgICAgfQotCi0gICAgICBpZiAoIG9yZGVyaW5nICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAhY2ZmLT5vcmRlcmluZyApCi0gICAgICAgICAgY2ZmLT5vcmRlcmluZyA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9vcmRlcmluZyApOwotICAgICAgICAqb3JkZXJpbmcgPSBjZmYtPm9yZGVyaW5nOwotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogWFhYOiBBY2NvcmRpbmcgdG8gQWRvYmUgVGVjaE5vdGUgIzUxNzYsIHRoZSBzdXBwbGVtZW50IGluIENGRgotICAgICAgICogICAgICBjYW4gYmUgYSByZWFsIG51bWJlci4gV2UgdHJ1bmNhdGUgaXQgdG8gZml0IHB1YmxpYyBBUEkKLSAgICAgICAqICAgICAgc2luY2UgZnJlZXR5cGUtMi4zLjYuCi0gICAgICAgKi8KLSAgICAgIGlmICggc3VwcGxlbWVudCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZGljdC0+Y2lkX3N1cHBsZW1lbnQgPCBGVF9JTlRfTUlOIHx8Ci0gICAgICAgICAgICAgZGljdC0+Y2lkX3N1cHBsZW1lbnQgPiBGVF9JTlRfTUFYICkKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiY2ZmX2dldF9yb3M6IHRvbyBsYXJnZSBzdXBwbGVtZW50ICVkIGlzIHRydW5jYXRlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfc3VwcGxlbWVudCApKTsKLSAgICAgICAgKnN1cHBsZW1lbnQgPSAoRlRfSW50KWRpY3QtPmNpZF9zdXBwbGVtZW50OwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfaXNfY2lkKCBDRkZfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICppc19jaWQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIENGRl9Gb250ICBjZmYgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0KLSAgICAqaXNfY2lkID0gMDsKLQotICAgIGlmICggY2ZmICkKLSAgICB7Ci0gICAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3QgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7Ci0KLQotICAgICAgaWYgKCBkaWN0LT5jaWRfcmVnaXN0cnkgIT0gMHhGRkZGVSApCi0gICAgICAgICppc19jaWQgPSAxOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXgoIENGRl9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICpjaWQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIENGRl9Gb250ICBjZmY7Ci0KLQotICAgIGNmZiA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0gICAgaWYgKCBjZmYgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgICAgICAgYzsKLSAgICAgIENGRl9Gb250UmVjRGljdCAgZGljdCA9ICZjZmYtPnRvcF9mb250LmZvbnRfZGljdDsKLQotCi0gICAgICBpZiAoIGRpY3QtPmNpZF9yZWdpc3RyeSA9PSAweEZGRkZVICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZ2x5cGhfaW5kZXggPiBjZmYtPm51bV9nbHlwaHMgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgYyA9IGNmZi0+Y2hhcnNldC5zaWRzW2dseXBoX2luZGV4XTsKLQotICAgICAgaWYgKCBjaWQgKQotICAgICAgICAqY2lkID0gYzsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX0NJRFJFQygKLSAgICBjZmZfc2VydmljZV9jaWRfaW5mbywKLQotICAgIChGVF9DSURfR2V0UmVnaXN0cnlPcmRlcmluZ1N1cHBsZW1lbnRGdW5jKQotICAgICAgY2ZmX2dldF9yb3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXRfcm9zICAgICAgICAgICAgICAgICAgKi8KLSAgICAoRlRfQ0lEX0dldElzSW50ZXJuYWxseUNJREtleWVkRnVuYykKLSAgICAgIGNmZl9nZXRfaXNfY2lkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0X2lzX2NpZCAgICAgICAgICAgICAgICovCi0gICAgKEZUX0NJRF9HZXRDSURGcm9tR2x5cGhJbmRleEZ1bmMpCi0gICAgICBjZmZfZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4ICAgICAgICAgICAgIC8qIGdldF9jaWRfZnJvbV9nbHlwaF9pbmRleCAqLwotICApCi0KLQotICAvKgotICAgKiAgUFJPUEVSVFkgU0VSVklDRQotICAgKgotICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9wcm9wZXJ0eV9zZXQoIEZUX01vZHVsZSAgICBtb2R1bGUsICAgICAgICAgLyogQ0ZGX0RyaXZlciAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgdmFsdWVfaXNfc3RyaW5nICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBDRkZfRHJpdmVyICBkcml2ZXIgPSAoQ0ZGX0RyaXZlciltb2R1bGU7Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTCi0gICAgRlRfVU5VU0VEKCB2YWx1ZV9pc19zdHJpbmcgKTsKLSNlbmRpZgotCi0KLSAgICBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJkYXJrZW5pbmctcGFyYW1ldGVycyIgKSApCi0gICAgewotICAgICAgRlRfSW50KiAgZGFya2VuX3BhcmFtczsKLSAgICAgIEZUX0ludCAgIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUwotICAgICAgRlRfSW50ICAgZHBbOF07Ci0KLQotICAgICAgaWYgKCB2YWx1ZV9pc19zdHJpbmcgKQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiAgcyA9IChjb25zdCBjaGFyKil2YWx1ZTsKLSAgICAgICAgY2hhciogICAgICAgIGVwOwotICAgICAgICBpbnQgICAgICAgICAgaTsKLQotCi0gICAgICAgIC8qIGVpZ2h0IGNvbW1hLXNlcGFyYXRlZCBudW1iZXJzICovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgNzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgIGRwW2ldID0gKEZUX0ludClmdF9zdHJ0b2woIHMsICZlcCwgMTAgKTsKLSAgICAgICAgICBpZiAoICplcCAhPSAnLCcgfHwgcyA9PSBlcCApCi0gICAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgICAgICAgIHMgPSBlcCArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBkcFs3XSA9IChGVF9JbnQpZnRfc3RydG9sKCBzLCAmZXAsIDEwICk7Ci0gICAgICAgIGlmICggISggKmVwID09ICdcMCcgfHwgKmVwID09ICcgJyApIHx8IHMgPT0gZXAgKQotICAgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgICAgIGRhcmtlbl9wYXJhbXMgPSBkcDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBkYXJrZW5fcGFyYW1zID0gKEZUX0ludCopdmFsdWU7Ci0KLSAgICAgIHgxID0gZGFya2VuX3BhcmFtc1swXTsKLSAgICAgIHkxID0gZGFya2VuX3BhcmFtc1sxXTsKLSAgICAgIHgyID0gZGFya2VuX3BhcmFtc1syXTsKLSAgICAgIHkyID0gZGFya2VuX3BhcmFtc1szXTsKLSAgICAgIHgzID0gZGFya2VuX3BhcmFtc1s0XTsKLSAgICAgIHkzID0gZGFya2VuX3BhcmFtc1s1XTsKLSAgICAgIHg0ID0gZGFya2VuX3BhcmFtc1s2XTsKLSAgICAgIHk0ID0gZGFya2VuX3BhcmFtc1s3XTsKLQotICAgICAgaWYgKCB4MSA8IDAgICB8fCB4MiA8IDAgICB8fCB4MyA8IDAgICB8fCB4NCA8IDAgICB8fAotICAgICAgICAgICB5MSA8IDAgICB8fCB5MiA8IDAgICB8fCB5MyA8IDAgICB8fCB5NCA8IDAgICB8fAotICAgICAgICAgICB4MSA+IHgyICB8fCB4MiA+IHgzICB8fCB4MyA+IHg0ICAgICAgICAgICAgICB8fAotICAgICAgICAgICB5MSA+IDUwMCB8fCB5MiA+IDUwMCB8fCB5MyA+IDUwMCB8fCB5NCA+IDUwMCApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbMF0gPSB4MTsKLSAgICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1sxXSA9IHkxOwotICAgICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzJdID0geDI7Ci0gICAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbM10gPSB5MjsKLSAgICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1s0XSA9IHgzOwotICAgICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzVdID0geTM7Ci0gICAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbNl0gPSB4NDsKLSAgICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1s3XSA9IHk0OwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiaGludGluZy1lbmdpbmUiICkgKQotICAgIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLSAgICAgIGlmICggdmFsdWVfaXNfc3RyaW5nICkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogIHMgPSAoY29uc3QgY2hhciopdmFsdWU7Ci0KLQotICAgICAgICBpZiAoICFmdF9zdHJjbXAoIHMsICJhZG9iZSIgKSApCi0gICAgICAgICAgZHJpdmVyLT5oaW50aW5nX2VuZ2luZSA9IEZUX0NGRl9ISU5USU5HX0FET0JFOwotI2lmZGVmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKLSAgICAgICAgZWxzZSBpZiAoICFmdF9zdHJjbXAoIHMsICJmcmVldHlwZSIgKSApCi0gICAgICAgICAgZHJpdmVyLT5oaW50aW5nX2VuZ2luZSA9IEZUX0NGRl9ISU5USU5HX0ZSRUVUWVBFOwotI2VuZGlmCi0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgICBGVF9VSW50KiAgaGludGluZ19lbmdpbmUgPSAoRlRfVUludCopdmFsdWU7Ci0KLQotICAgICAgICBpZiAoICpoaW50aW5nX2VuZ2luZSA9PSBGVF9DRkZfSElOVElOR19BRE9CRQotI2lmZGVmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKLSAgICAgICAgICAgICB8fCAqaGludGluZ19lbmdpbmUgPT0gRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEUKLSNlbmRpZgotICAgICAgICAgICApCi0gICAgICAgICAgZHJpdmVyLT5oaW50aW5nX2VuZ2luZSA9ICpoaW50aW5nX2VuZ2luZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGVycm9yID0gRlRfRVJSKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAibm8tc3RlbS1kYXJrZW5pbmciICkgKQotICAgIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLSAgICAgIGlmICggdmFsdWVfaXNfc3RyaW5nICkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogIHMgICA9IChjb25zdCBjaGFyKil2YWx1ZTsKLSAgICAgICAgbG9uZyAgICAgICAgIG5zZCA9IGZ0X3N0cnRvbCggcywgTlVMTCwgMTAgKTsKLQotCi0gICAgICAgIGlmICggIW5zZCApCi0gICAgICAgICAgZHJpdmVyLT5ub19zdGVtX2RhcmtlbmluZyA9IEZBTFNFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZHJpdmVyLT5ub19zdGVtX2RhcmtlbmluZyA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIHsKLSAgICAgICAgRlRfQm9vbCogIG5vX3N0ZW1fZGFya2VuaW5nID0gKEZUX0Jvb2wqKXZhbHVlOwotCi0KLSAgICAgICAgZHJpdmVyLT5ub19zdGVtX2RhcmtlbmluZyA9ICpub19zdGVtX2RhcmtlbmluZzsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLSAgICBlbHNlIGlmICggIWZ0X3N0cmNtcCggcHJvcGVydHlfbmFtZSwgInJhbmRvbS1zZWVkIiApICkKLSAgICB7Ci0gICAgICBGVF9JbnQzMiAgcmFuZG9tX3NlZWQ7Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUwotICAgICAgaWYgKCB2YWx1ZV9pc19zdHJpbmcgKQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiAgcyA9IChjb25zdCBjaGFyKil2YWx1ZTsKLQotCi0gICAgICAgIHJhbmRvbV9zZWVkID0gKEZUX0ludDMyKWZ0X3N0cnRvbCggcywgTlVMTCwgMTAgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICByYW5kb21fc2VlZCA9ICooRlRfSW50MzIqKXZhbHVlOwotCi0gICAgICBpZiAoIHJhbmRvbV9zZWVkIDwgMCApCi0gICAgICAgIHJhbmRvbV9zZWVkID0gMDsKLQotICAgICAgZHJpdmVyLT5yYW5kb21fc2VlZCA9IHJhbmRvbV9zZWVkOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UwKCggImNmZl9wcm9wZXJ0eV9zZXQ6IG1pc3NpbmcgcHJvcGVydHkgYCVzJ1xuIiwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eV9uYW1lICkpOwotICAgIHJldHVybiBGVF9USFJPVyggTWlzc2luZ19Qcm9wZXJ0eSApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3Byb3BlcnR5X2dldCggRlRfTW9kdWxlICAgIG1vZHVsZSwgICAgICAgICAvKiBDRkZfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgdmFsdWUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIENGRl9Ecml2ZXIgIGRyaXZlciA9IChDRkZfRHJpdmVyKW1vZHVsZTsKLQotCi0gICAgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiZGFya2VuaW5nLXBhcmFtZXRlcnMiICkgKQotICAgIHsKLSAgICAgIEZUX0ludCogIGRhcmtlbl9wYXJhbXMgPSBkcml2ZXItPmRhcmtlbl9wYXJhbXM7Ci0gICAgICBGVF9JbnQqICB2YWwgICAgICAgICAgID0gKEZUX0ludCopdmFsdWU7Ci0KLQotICAgICAgdmFsWzBdID0gZGFya2VuX3BhcmFtc1swXTsKLSAgICAgIHZhbFsxXSA9IGRhcmtlbl9wYXJhbXNbMV07Ci0gICAgICB2YWxbMl0gPSBkYXJrZW5fcGFyYW1zWzJdOwotICAgICAgdmFsWzNdID0gZGFya2VuX3BhcmFtc1szXTsKLSAgICAgIHZhbFs0XSA9IGRhcmtlbl9wYXJhbXNbNF07Ci0gICAgICB2YWxbNV0gPSBkYXJrZW5fcGFyYW1zWzVdOwotICAgICAgdmFsWzZdID0gZGFya2VuX3BhcmFtc1s2XTsKLSAgICAgIHZhbFs3XSA9IGRhcmtlbl9wYXJhbXNbN107Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJoaW50aW5nLWVuZ2luZSIgKSApCi0gICAgewotICAgICAgRlRfVUludCAgIGhpbnRpbmdfZW5naW5lICAgID0gZHJpdmVyLT5oaW50aW5nX2VuZ2luZTsKLSAgICAgIEZUX1VJbnQqICB2YWwgICAgICAgICAgICAgICA9IChGVF9VSW50Kil2YWx1ZTsKLQotCi0gICAgICAqdmFsID0gaGludGluZ19lbmdpbmU7Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJuby1zdGVtLWRhcmtlbmluZyIgKSApCi0gICAgewotICAgICAgRlRfQm9vbCAgIG5vX3N0ZW1fZGFya2VuaW5nID0gZHJpdmVyLT5ub19zdGVtX2RhcmtlbmluZzsKLSAgICAgIEZUX0Jvb2wqICB2YWwgICAgICAgICAgICAgICA9IChGVF9Cb29sKil2YWx1ZTsKLQotCi0gICAgICAqdmFsID0gbm9fc3RlbV9kYXJrZW5pbmc7Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTAoKCAiY2ZmX3Byb3BlcnR5X2dldDogbWlzc2luZyBwcm9wZXJ0eSBgJXMnXG4iLAotICAgICAgICAgICAgICAgIHByb3BlcnR5X25hbWUgKSk7Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBNaXNzaW5nX1Byb3BlcnR5ICk7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX1BST1BFUlRJRVNSRUMoCi0gICAgY2ZmX3NlcnZpY2VfcHJvcGVydGllcywKLQotICAgIChGVF9Qcm9wZXJ0aWVzX1NldEZ1bmMpY2ZmX3Byb3BlcnR5X3NldCwgICAgICAvKiBzZXRfcHJvcGVydHkgKi8KLSAgICAoRlRfUHJvcGVydGllc19HZXRGdW5jKWNmZl9wcm9wZXJ0eV9nZXQgKSAgICAgLyogZ2V0X3Byb3BlcnR5ICovCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotICAvKgotICAgKiAgTVVMVElQTEUgTUFTVEVSIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9zZXRfbW1fYmxlbmQoIENGRl9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgbW0gPSAoRlRfU2VydmljZV9NdWx0aU1hc3RlcnMpZmFjZS0+bW07Ci0KLQotICAgIHJldHVybiBtbS0+c2V0X21tX2JsZW5kKCBGVF9GQUNFKCBmYWNlICksIG51bV9jb29yZHMsIGNvb3JkcyApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX2dldF9tbV9ibGVuZCggQ0ZGX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBtbSA9IChGVF9TZXJ2aWNlX011bHRpTWFzdGVycylmYWNlLT5tbTsKLQotCi0gICAgcmV0dXJuIG1tLT5nZXRfbW1fYmxlbmQoIEZUX0ZBQ0UoIGZhY2UgKSwgbnVtX2Nvb3JkcywgY29vcmRzICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfZ2V0X21tX3ZhciggQ0ZGX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICkKLSAgewotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBtbSA9IChGVF9TZXJ2aWNlX011bHRpTWFzdGVycylmYWNlLT5tbTsKLQotCi0gICAgcmV0dXJuIG1tLT5nZXRfbW1fdmFyKCBGVF9GQUNFKCBmYWNlICksIG1hc3RlciApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3NldF92YXJfZGVzaWduKCBDRkZfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBtbSA9IChGVF9TZXJ2aWNlX011bHRpTWFzdGVycylmYWNlLT5tbTsKLQotCi0gICAgcmV0dXJuIG1tLT5zZXRfdmFyX2Rlc2lnbiggRlRfRkFDRSggZmFjZSApLCBudW1fY29vcmRzLCBjb29yZHMgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfdmFyX2Rlc2lnbiggQ0ZGX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgbW0gPSAoRlRfU2VydmljZV9NdWx0aU1hc3RlcnMpZmFjZS0+bW07Ci0KLQotICAgIHJldHVybiBtbS0+Z2V0X3Zhcl9kZXNpZ24oIEZUX0ZBQ0UoIGZhY2UgKSwgbnVtX2Nvb3JkcywgY29vcmRzICk7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQygKLSAgICBjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzLAotCi0gICAgKEZUX0dldF9NTV9GdW5jKSAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogZ2V0X21tICAgICAgICAgKi8KLSAgICAoRlRfU2V0X01NX0Rlc2lnbl9GdW5jKSBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBzZXRfbW1fZGVzaWduICAqLwotICAgIChGVF9TZXRfTU1fQmxlbmRfRnVuYykgIGNmZl9zZXRfbW1fYmxlbmQsICAgICAgIC8qIHNldF9tbV9ibGVuZCAgICovCi0gICAgKEZUX0dldF9NTV9CbGVuZF9GdW5jKSAgY2ZmX2dldF9tbV9ibGVuZCwgICAgICAgLyogZ2V0X21tX2JsZW5kICAgKi8KLSAgICAoRlRfR2V0X01NX1Zhcl9GdW5jKSAgICBjZmZfZ2V0X21tX3ZhciwgICAgICAgICAvKiBnZXRfbW1fdmFyICAgICAqLwotICAgIChGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jKWNmZl9zZXRfdmFyX2Rlc2lnbiwgICAgIC8qIHNldF92YXJfZGVzaWduICovCi0gICAgKEZUX0dldF9WYXJfRGVzaWduX0Z1bmMpY2ZmX2dldF92YXJfZGVzaWduLCAgICAgLyogZ2V0X3Zhcl9kZXNpZ24gKi8KLQotICAgIChGVF9HZXRfVmFyX0JsZW5kX0Z1bmMpIGNmZl9nZXRfdmFyX2JsZW5kLCAgICAgIC8qIGdldF92YXJfYmxlbmQgICovCi0gICAgKEZUX0RvbmVfQmxlbmRfRnVuYykgICAgY2ZmX2RvbmVfYmxlbmQgICAgICAgICAgLyogZG9uZV9ibGVuZCAgICAgKi8KLSAgKQotCi0KLSAgLyoKLSAgICogIE1FVFJJQ1MgVkFSSUFUSU9OUyBTRVJWSUNFCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfaGFkdmFuY2VfYWRqdXN0KCBDRkZfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgKmF2YWx1ZSApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zICB2YXIgPSAoRlRfU2VydmljZV9NZXRyaWNzVmFyaWF0aW9ucylmYWNlLT52YXI7Ci0KLQotICAgIHJldHVybiB2YXItPmhhZHZhbmNlX2FkanVzdCggRlRfRkFDRSggZmFjZSApLCBnaW5kZXgsIGF2YWx1ZSApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfbWV0cmljc19hZGp1c3QoIENGRl9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1NlcnZpY2VfTWV0cmljc1ZhcmlhdGlvbnMgIHZhciA9IChGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zKWZhY2UtPnZhcjsKLQotCi0gICAgdmFyLT5tZXRyaWNzX2FkanVzdCggRlRfRkFDRSggZmFjZSApICk7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX01FVFJJQ1NWQVJJQVRJT05TUkVDKAotICAgIGNmZl9zZXJ2aWNlX21ldHJpY3NfdmFyaWF0aW9ucywKLQotICAgIChGVF9IQWR2YW5jZV9BZGp1c3RfRnVuYyljZmZfaGFkdmFuY2VfYWRqdXN0LCAgICAvKiBoYWR2YW5jZV9hZGp1c3QgKi8KLSAgICAoRlRfTFNCX0FkanVzdF9GdW5jKSAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogbHNiX2FkanVzdCAgICAgICovCi0gICAgKEZUX1JTQl9BZGp1c3RfRnVuYykgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIHJzYl9hZGp1c3QgICAgICAqLwotCi0gICAgKEZUX1ZBZHZhbmNlX0FkanVzdF9GdW5jKU5VTEwsICAgICAgICAgICAgICAgICAgIC8qIHZhZHZhbmNlX2FkanVzdCAqLwotICAgIChGVF9UU0JfQWRqdXN0X0Z1bmMpICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiB0c2JfYWRqdXN0ICAgICAgKi8KLSAgICAoRlRfQlNCX0FkanVzdF9GdW5jKSAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogYnNiX2FkanVzdCAgICAgICovCi0gICAgKEZUX1ZPcmdfQWRqdXN0X0Z1bmMpICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIHZvcmdfYWRqdXN0ICAgICAqLwotCi0gICAgKEZUX01ldHJpY3NfQWRqdXN0X0Z1bmMpIGNmZl9tZXRyaWNzX2FkanVzdCAgICAgIC8qIG1ldHJpY3NfYWRqdXN0ICAqLwotICApCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgRCBSIEkgViBFIFIgIEkgTiBUIEUgUiBGIEEgQyBFICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkIEZUX0NPTkZJR19PUFRJT05fTk9fR0xZUEhfTkFNRVMgJiYgXAotICAgICBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDOSgKLSAgICBjZmZfc2VydmljZXMsCi0KLSAgICBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgICAgICBGVF9GT05UX0ZPUk1BVF9DRkYsCi0gICAgRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTLCAgICAgICAgJkNGRl9TRVJWSUNFX01VTFRJX01BU1RFUlNfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfTUVUUklDU19WQVJJQVRJT05TLCAgICZDRkZfU0VSVklDRV9NRVRSSUNTX1ZBUl9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJkNGRl9TRVJWSUNFX1BTX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZDRkZfU0VSVklDRV9QU19OQU1FX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QsICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJkNGRl9TRVJWSUNFX0dFVF9DTUFQX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfQ0lELCAgICAgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9DSURfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAgICAgICAgICAgJkNGRl9TRVJWSUNFX1BST1BFUlRJRVNfR0VUCi0gICkKLSNlbGlmICFkZWZpbmVkIEZUX0NPTkZJR19PUFRJT05fTk9fR0xZUEhfTkFNRVMKLSAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNygKLSAgICBjZmZfc2VydmljZXMsCi0KLSAgICBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgICAgICBGVF9GT05UX0ZPUk1BVF9DRkYsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJkNGRl9TRVJWSUNFX1BTX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZDRkZfU0VSVklDRV9QU19OQU1FX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QsICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJkNGRl9TRVJWSUNFX0dFVF9DTUFQX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfQ0lELCAgICAgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9DSURfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAgICAgICAgICAgJkNGRl9TRVJWSUNFX1BST1BFUlRJRVNfR0VUCi0gICkKLSNlbGlmIGRlZmluZWQgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM4KAotICAgIGNmZl9zZXJ2aWNlcywKLQotICAgIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX0NGRiwKLSAgICBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMsICAgICAgICAmQ0ZGX1NFUlZJQ0VfTVVMVElfTUFTVEVSU19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9NRVRSSUNTX1ZBUklBVElPTlMsICAgJkNGRl9TRVJWSUNFX01FVFJJQ1NfVkFSX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmQ0ZGX1NFUlZJQ0VfUFNfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJkNGRl9TRVJWSUNFX1BTX05BTUVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9HRVRfQ01BUF9JTkZPX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0NJRCwgICAgICAgICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfQ0lEX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAgICAgICZDRkZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVAotICApCi0jZWxzZQotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM2KAotICAgIGNmZl9zZXJ2aWNlcywKLQotICAgIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX0NGRiwKLSAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmQ0ZGX1NFUlZJQ0VfUFNfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJkNGRl9TRVJWSUNFX1BTX05BTUVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9HRVRfQ01BUF9JTkZPX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0NJRCwgICAgICAgICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfQ0lEX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAgICAgICZDRkZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVAotICApCi0jZW5kaWYKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfTW9kdWxlX0ludGVyZmFjZSApCi0gIGNmZl9nZXRfaW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgZHJpdmVyLCAgICAgICAvKiBDRkZfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX2ludGVyZmFjZSApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5OwotICAgIEZUX01vZHVsZSAgICAgICAgICAgIHNmbnQ7Ci0gICAgRlRfTW9kdWxlX0ludGVyZmFjZSAgcmVzdWx0OwotCi0KLSAgICAvKiBDRkZfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIGlmICggIWRyaXZlciApCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBsaWJyYXJ5ID0gZHJpdmVyLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLQotICAgIHJlc3VsdCA9IGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIENGRl9TRVJWSUNFU19HRVQsIG1vZHVsZV9pbnRlcmZhY2UgKTsKLSAgICBpZiAoIHJlc3VsdCApCi0gICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgLyogYGRyaXZlcicgaXMgbm90IHlldCBldmFsdWF0ZWQgaW4gbm9uLVBJQyBtb2RlICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgaWYgKCAhZHJpdmVyICkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGxpYnJhcnkgPSBkcml2ZXItPmxpYnJhcnk7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gTlVMTDsKLSNlbmRpZgotCi0gICAgLyogd2UgcGFzcyBvdXIgcmVxdWVzdCB0byB0aGUgYHNmbnQnIG1vZHVsZSAqLwotICAgIHNmbnQgPSBGVF9HZXRfTW9kdWxlKCBsaWJyYXJ5LCAic2ZudCIgKTsKLQotICAgIHJldHVybiBzZm50ID8gc2ZudC0+Y2xhenotPmdldF9pbnRlcmZhY2UoIHNmbnQsIG1vZHVsZV9pbnRlcmZhY2UgKSA6IDA7Ci0gIH0KLQotCi0gIC8qIFRoZSBGVF9Ecml2ZXJJbnRlcmZhY2Ugc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gZnRkcml2ZXIuaC4gKi8KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotI2RlZmluZSBDRkZfU0laRV9TRUxFQ1QgY2ZmX3NpemVfc2VsZWN0Ci0jZWxzZQotI2RlZmluZSBDRkZfU0laRV9TRUxFQ1QgMAotI2VuZGlmCi0KLSAgRlRfREVGSU5FX0RSSVZFUigKLSAgICBjZmZfZHJpdmVyX2NsYXNzLAotCi0gICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIgICAgICAgICAgfAotICAgICAgRlRfTU9EVUxFX0RSSVZFUl9TQ0FMQUJMRSAgICAgIHwKLSAgICAgIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiAgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX0hJTlRTX0xJR0hUTFksCi0KLSAgICAgIHNpemVvZiAoIENGRl9Ecml2ZXJSZWMgKSwKLSAgICAgICJjZmYiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgTlVMTCwgICAvKiBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIGNmZl9kcml2ZXJfaW5pdCwgICAgICAgICAgLyogRlRfTW9kdWxlX0NvbnN0cnVjdG9yICBtb2R1bGVfaW5pdCAgICovCi0gICAgICBjZmZfZHJpdmVyX2RvbmUsICAgICAgICAgIC8qIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgbW9kdWxlX2RvbmUgICAqLwotICAgICAgY2ZmX2dldF9pbnRlcmZhY2UsICAgICAgICAvKiBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgIGdldF9pbnRlcmZhY2UgKi8KLQotICAgIHNpemVvZiAoIFRUX0ZhY2VSZWMgKSwKLSAgICBzaXplb2YgKCBDRkZfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIENGRl9HbHlwaFNsb3RSZWMgKSwKLQotICAgIGNmZl9mYWNlX2luaXQsICAgICAgICAgICAgICAvKiBGVF9GYWNlX0luaXRGdW5jICBpbml0X2ZhY2UgKi8KLSAgICBjZmZfZmFjZV9kb25lLCAgICAgICAgICAgICAgLyogRlRfRmFjZV9Eb25lRnVuYyAgZG9uZV9mYWNlICovCi0gICAgY2ZmX3NpemVfaW5pdCwgICAgICAgICAgICAgIC8qIEZUX1NpemVfSW5pdEZ1bmMgIGluaXRfc2l6ZSAqLwotICAgIGNmZl9zaXplX2RvbmUsICAgICAgICAgICAgICAvKiBGVF9TaXplX0RvbmVGdW5jICBkb25lX3NpemUgKi8KLSAgICBjZmZfc2xvdF9pbml0LCAgICAgICAgICAgICAgLyogRlRfU2xvdF9Jbml0RnVuYyAgaW5pdF9zbG90ICovCi0gICAgY2ZmX3Nsb3RfZG9uZSwgICAgICAgICAgICAgIC8qIEZUX1Nsb3RfRG9uZUZ1bmMgIGRvbmVfc2xvdCAqLwotCi0gICAgY2ZmX2dseXBoX2xvYWQsICAgICAgICAgICAgIC8qIEZUX1Nsb3RfTG9hZEZ1bmMgIGxvYWRfZ2x5cGggKi8KLQotICAgIGNmZl9nZXRfa2VybmluZywgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEtlcm5pbmdGdW5jICAgZ2V0X2tlcm5pbmcgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfQXR0YWNoRnVuYyAgICAgICBhdHRhY2hfZmlsZSAgKi8KLSAgICBjZmZfZ2V0X2FkdmFuY2VzLCAgICAgICAgICAgLyogRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMgIGdldF9hZHZhbmNlcyAqLwotCi0gICAgY2ZmX3NpemVfcmVxdWVzdCwgICAgICAgICAgIC8qIEZUX1NpemVfUmVxdWVzdEZ1bmMgIHJlcXVlc3Rfc2l6ZSAqLwotICAgIENGRl9TSVpFX1NFTEVDVCAgICAgICAgICAgICAvKiBGVF9TaXplX1NlbGVjdEZ1bmMgICBzZWxlY3Rfc2l6ZSAgKi8KLSAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZkcml2ci5oIGIvc3JjL2NmZi9jZmZkcml2ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTM4MWU2Li4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmZHJpdnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmRyaXZyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIE9wZW5UeXBlIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDRkZEUklWRVJfSF8KLSNkZWZpbmUgQ0ZGRFJJVkVSX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfREVDTEFSRV9EUklWRVIoIGNmZl9kcml2ZXJfY2xhc3MgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIENGRkRSSVZFUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZlcnJzLmggYi9zcmMvY2ZmL2NmZmVycnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4MDhjMS4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZmVycnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmVycnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgQ0ZGIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQ0ZGRVJSU19IXwotI2RlZmluZSBDRkZFUlJTX0hfCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgRlRFUlJPUlNfSF8KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIENGRl9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfQ0ZGCi0KLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIENGRkVSUlNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmZ2xvYWQuYyBiL3NyYy9jZmYvY2ZmZ2xvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmM2EyYy4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZmdsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmdsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfQ0ZGX0RSSVZFUl9ICi0KLSNpbmNsdWRlICJjZmZvYmpzLmgiCi0jaW5jbHVkZSAiY2ZmbG9hZC5oIgotI2luY2x1ZGUgImNmZmdsb2FkLmgiCi0jaW5jbHVkZSAiY2YyZnQuaCIgICAgICAvKiBmb3IgY2YyX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MgKi8KLQotI2luY2x1ZGUgImNmZmVycnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmZmdsb2FkCi0KLQotI2lmZGVmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKLQotICB0eXBlZGVmIGVudW0gIENGRl9PcGVyYXRvcl8KLSAgewotICAgIGNmZl9vcF91bmtub3duID0gMCwKLQotICAgIGNmZl9vcF9ybW92ZXRvLAotICAgIGNmZl9vcF9obW92ZXRvLAotICAgIGNmZl9vcF92bW92ZXRvLAotCi0gICAgY2ZmX29wX3JsaW5ldG8sCi0gICAgY2ZmX29wX2hsaW5ldG8sCi0gICAgY2ZmX29wX3ZsaW5ldG8sCi0KLSAgICBjZmZfb3BfcnJjdXJ2ZXRvLAotICAgIGNmZl9vcF9oaGN1cnZldG8sCi0gICAgY2ZmX29wX2h2Y3VydmV0bywKLSAgICBjZmZfb3BfcmN1cnZlbGluZSwKLSAgICBjZmZfb3BfcmxpbmVjdXJ2ZSwKLSAgICBjZmZfb3BfdmhjdXJ2ZXRvLAotICAgIGNmZl9vcF92dmN1cnZldG8sCi0KLSAgICBjZmZfb3BfZmxleCwKLSAgICBjZmZfb3BfaGZsZXgsCi0gICAgY2ZmX29wX2hmbGV4MSwKLSAgICBjZmZfb3BfZmxleDEsCi0KLSAgICBjZmZfb3BfZW5kY2hhciwKLQotICAgIGNmZl9vcF9oc3RlbSwKLSAgICBjZmZfb3BfdnN0ZW0sCi0gICAgY2ZmX29wX2hzdGVtaG0sCi0gICAgY2ZmX29wX3ZzdGVtaG0sCi0KLSAgICBjZmZfb3BfaGludG1hc2ssCi0gICAgY2ZmX29wX2NudHJtYXNrLAotICAgIGNmZl9vcF9kb3RzZWN0aW9uLCAgLyogZGVwcmVjYXRlZCwgYWN0cyBhcyBuby1vcCAqLwotCi0gICAgY2ZmX29wX2FicywKLSAgICBjZmZfb3BfYWRkLAotICAgIGNmZl9vcF9zdWIsCi0gICAgY2ZmX29wX2RpdiwKLSAgICBjZmZfb3BfbmVnLAotICAgIGNmZl9vcF9yYW5kb20sCi0gICAgY2ZmX29wX211bCwKLSAgICBjZmZfb3Bfc3FydCwKLQotICAgIGNmZl9vcF9ibGVuZCwKLQotICAgIGNmZl9vcF9kcm9wLAotICAgIGNmZl9vcF9leGNoLAotICAgIGNmZl9vcF9pbmRleCwKLSAgICBjZmZfb3Bfcm9sbCwKLSAgICBjZmZfb3BfZHVwLAotCi0gICAgY2ZmX29wX3B1dCwKLSAgICBjZmZfb3BfZ2V0LAotICAgIGNmZl9vcF9zdG9yZSwKLSAgICBjZmZfb3BfbG9hZCwKLQotICAgIGNmZl9vcF9hbmQsCi0gICAgY2ZmX29wX29yLAotICAgIGNmZl9vcF9ub3QsCi0gICAgY2ZmX29wX2VxLAotICAgIGNmZl9vcF9pZmVsc2UsCi0KLSAgICBjZmZfb3BfY2FsbHN1YnIsCi0gICAgY2ZmX29wX2NhbGxnc3ViciwKLSAgICBjZmZfb3BfcmV0dXJuLAotCi0gICAgLyogVHlwZSAxIG9wY29kZXM6IGludmFsaWQgYnV0IHNlZW4gaW4gcmVhbCBsaWZlICovCi0gICAgY2ZmX29wX2hzYncsCi0gICAgY2ZmX29wX2Nsb3NlcGF0aCwKLSAgICBjZmZfb3BfY2FsbG90aGVyc3ViciwKLSAgICBjZmZfb3BfcG9wLAotICAgIGNmZl9vcF9zZWFjLAotICAgIGNmZl9vcF9zYncsCi0gICAgY2ZmX29wX3NldGN1cnJlbnRwb2ludCwKLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBjZmZfb3BfbWF4Ci0KLSAgfSBDRkZfT3BlcmF0b3I7Ci0KLQotI2RlZmluZSBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEggIDB4ODAKLSNkZWZpbmUgQ0ZGX0NPVU5UX0VYQUNUICAgICAgICAweDQwCi0jZGVmaW5lIENGRl9DT1VOVF9DTEVBUl9TVEFDSyAgMHgyMAotCi0gIC8qIGNvdW50IHZhbHVlcyB3aGljaCBoYXZlIHRoZSBgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRIJyBmbGFnIHNldCBhcmUgICovCi0gIC8qIHVzZWQgZm9yIGNoZWNraW5nIHRoZSB3aWR0aCBhbmQgcmVxdWVzdGVkIG51bWJlcnMgb2YgYXJndW1lbnRzICAgICovCi0gIC8qIG9ubHk7IHRoZXkgYXJlIHNldCB0byB6ZXJvIGFmdGVyd2FyZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogdGhlIG90aGVyIHR3byBmbGFncyBhcmUgaW5mb3JtYXRpdmUgb25seSBhbmQgdW51c2VkIGN1cnJlbnRseSAgICAgKi8KLQotICBzdGF0aWMgY29uc3QgRlRfQnl0ZSAgY2ZmX2FyZ3VtZW50X2NvdW50c1tdID0KLSAgewotICAgIDAsICAvKiB1bmtub3duICovCi0KLSAgICAyIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRIIHwgQ0ZGX0NPVU5UX0VYQUNULCAvKiBybW92ZXRvICovCi0gICAgMSB8IENGRl9DT1VOVF9DSEVDS19XSURUSCB8IENGRl9DT1VOVF9FWEFDVCwKLSAgICAxIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRIIHwgQ0ZGX0NPVU5UX0VYQUNULAotCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywgLyogcmxpbmV0byAqLwotICAgIDAgfCBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0ssCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLQotICAgIDAgfCBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0ssIC8qIHJyY3VydmV0byAqLwotICAgIDAgfCBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0ssCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLAotICAgIDAgfCBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0ssCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLAotCi0gICAgMTMsIC8qIGZsZXggKi8KLSAgICA3LAotICAgIDksCi0gICAgMTEsCi0KLSAgICAwIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRILCAvKiBlbmRjaGFyICovCi0KLSAgICAyIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRILCAvKiBoc3RlbSAqLwotICAgIDIgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsCi0gICAgMiB8IENGRl9DT1VOVF9DSEVDS19XSURUSCwKLSAgICAyIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRILAotCi0gICAgMCB8IENGRl9DT1VOVF9DSEVDS19XSURUSCwgLyogaGludG1hc2sgKi8KLSAgICAwIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRILCAvKiBjbnRybWFzayAqLwotICAgIDAsIC8qIGRvdHNlY3Rpb24gKi8KLQotICAgIDEsIC8qIGFicyAqLwotICAgIDIsCi0gICAgMiwKLSAgICAyLAotICAgIDEsCi0gICAgMCwKLSAgICAyLAotICAgIDEsCi0KLSAgICAxLCAvKiBibGVuZCAqLwotCi0gICAgMSwgLyogZHJvcCAqLwotICAgIDIsCi0gICAgMSwKLSAgICAyLAotICAgIDEsCi0KLSAgICAyLCAvKiBwdXQgKi8KLSAgICAxLAotICAgIDQsCi0gICAgMywKLQotICAgIDIsIC8qIGFuZCAqLwotICAgIDIsCi0gICAgMSwKLSAgICAyLAotICAgIDQsCi0KLSAgICAxLCAvKiBjYWxsc3ViciAqLwotICAgIDEsCi0gICAgMCwKLQotICAgIDIsIC8qIGhzYncgKi8KLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICA1LCAvKiBzZWFjICovCi0gICAgNCwgLyogc2J3ICovCi0gICAgMiAgLyogc2V0Y3VycmVudHBvaW50ICovCi0gIH07Ci0KLSNlbmRpZiAvKiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgIEdFTkVSSUMgQ0hBUlNUUklORyBQQVJTSU5HICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfYnVpbGRlcl9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIGdseXBoIGJ1aWxkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWlsZGVyIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggYnVpbGRlciB0byBpbml0aWFsaXplLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgOjogVGhlIGN1cnJlbnQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggICA6OiBUaGUgY3VycmVudCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50aW5nIDo6IFdoZXRoZXIgaGludGluZyBpcyBhY3RpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmZl9idWlsZGVyX2luaXQoIENGRl9CdWlsZGVyKiAgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIENGRl9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICBoaW50aW5nICkKLSAgewotICAgIGJ1aWxkZXItPnBhdGhfYmVndW4gID0gMDsKLSAgICBidWlsZGVyLT5sb2FkX3BvaW50cyA9IDE7Ci0KLSAgICBidWlsZGVyLT5mYWNlICAgPSBmYWNlOwotICAgIGJ1aWxkZXItPmdseXBoICA9IGdseXBoOwotICAgIGJ1aWxkZXItPm1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotCi0gICAgaWYgKCBnbHlwaCApCi0gICAgewotICAgICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlciA9IGdseXBoLT5yb290LmludGVybmFsLT5sb2FkZXI7Ci0KLQotICAgICAgYnVpbGRlci0+bG9hZGVyICA9IGxvYWRlcjsKLSAgICAgIGJ1aWxkZXItPmJhc2UgICAgPSAmbG9hZGVyLT5iYXNlLm91dGxpbmU7Ci0gICAgICBidWlsZGVyLT5jdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudC5vdXRsaW5lOwotICAgICAgRlRfR2x5cGhMb2FkZXJfUmV3aW5kKCBsb2FkZXIgKTsKLQotICAgICAgYnVpbGRlci0+aGludHNfZ2xvYmFscyA9IE5VTEw7Ci0gICAgICBidWlsZGVyLT5oaW50c19mdW5jcyAgID0gTlVMTDsKLQotICAgICAgaWYgKCBoaW50aW5nICYmIHNpemUgKQotICAgICAgewotICAgICAgICBGVF9TaXplICAgICAgIGZ0c2l6ZSAgID0gRlRfU0laRSggc2l6ZSApOwotICAgICAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsID0gKENGRl9JbnRlcm5hbClmdHNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YTsKLQotCi0gICAgICAgIGlmICggaW50ZXJuYWwgKQotICAgICAgICB7Ci0gICAgICAgICAgYnVpbGRlci0+aGludHNfZ2xvYmFscyA9ICh2b2lkICopaW50ZXJuYWwtPnRvcGZvbnQ7Ci0gICAgICAgICAgYnVpbGRlci0+aGludHNfZnVuY3MgICA9IGdseXBoLT5yb290LmludGVybmFsLT5nbHlwaF9oaW50czsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGJ1aWxkZXItPnBvc194ID0gMDsKLSAgICBidWlsZGVyLT5wb3NfeSA9IDA7Ci0KLSAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCA9IDA7Ci0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnkgPSAwOwotICAgIGJ1aWxkZXItPmFkdmFuY2UueCAgICAgID0gMDsKLSAgICBidWlsZGVyLT5hZHZhbmNlLnkgICAgICA9IDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNmZl9idWlsZGVyX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIGdseXBoIGJ1aWxkZXIuICBJdHMgY29udGVudHMgY2FuIHN0aWxsIGJlIHVzZWQgICAqLwotICAvKiAgICBhZnRlciB0aGUgY2FsbCwgYnV0IHRoZSBmdW5jdGlvbiBzYXZlcyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gICAgICAgKi8KLSAgLyogICAgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVpbGRlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gZmluYWxpemUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBjZmZfYnVpbGRlcl9kb25lKCBDRkZfQnVpbGRlciogIGJ1aWxkZXIgKQotICB7Ci0gICAgQ0ZGX0dseXBoU2xvdCAgZ2x5cGggPSBidWlsZGVyLT5nbHlwaDsKLQotCi0gICAgaWYgKCBnbHlwaCApCi0gICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lID0gKmJ1aWxkZXItPmJhc2U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNmZl9jb21wdXRlX2JpYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGVzIHRoZSBiaWFzIHZhbHVlIGluIGRlcGVuZGVuY2Ugb2YgdGhlIG51bWJlciBvZiBnbHlwaCAgICAgICAqLwotICAvKiAgICBzdWJyb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbl9jaGFyc3RyaW5nX3R5cGUgOjogVGhlIGBDaGFyc3RyaW5nVHlwZScgdmFsdWUgb2YgdGhlIHRvcCBESUNUICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fc3VicnMgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBnbHlwaCBzdWJyb3V0aW5lcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYmlhcyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0ludAotICBjZmZfY29tcHV0ZV9iaWFzKCBGVF9JbnQgICBpbl9jaGFyc3RyaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIG51bV9zdWJycyApCi0gIHsKLSAgICBGVF9JbnQgIHJlc3VsdDsKLQotCi0gICAgaWYgKCBpbl9jaGFyc3RyaW5nX3R5cGUgPT0gMSApCi0gICAgICByZXN1bHQgPSAwOwotICAgIGVsc2UgaWYgKCBudW1fc3VicnMgPCAxMjQwICkKLSAgICAgIHJlc3VsdCA9IDEwNzsKLSAgICBlbHNlIGlmICggbnVtX3N1YnJzIDwgMzM5MDBVICkKLSAgICAgIHJlc3VsdCA9IDExMzE7Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gMzI3NjhVOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2RlY29kZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBnbHlwaCBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVjb2RlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGl6ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgOjogVGhlIGN1cnJlbnQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludGluZyAgIDo6IFdoZXRoZXIgaGludGluZyBpcyBhY3RpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50X21vZGUgOjogVGhlIGhpbnRpbmcgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmZl9kZWNvZGVyX2luaXQoIENGRl9EZWNvZGVyKiAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX1NpemUgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIENGRl9HbHlwaFNsb3QgICBzbG90LAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgaGludGluZywKLSAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApCi0gIHsKLSAgICBDRkZfRm9udCAgY2ZmID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0KLQotICAgIC8qIGNsZWFyIGV2ZXJ5dGhpbmcgKi8KLSAgICBGVF9aRVJPKCBkZWNvZGVyICk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGJ1aWxkZXIgKi8KLSAgICBjZmZfYnVpbGRlcl9pbml0KCAmZGVjb2Rlci0+YnVpbGRlciwgZmFjZSwgc2l6ZSwgc2xvdCwgaGludGluZyApOwotCi0gICAgLyogaW5pdGlhbGl6ZSBUeXBlMiBkZWNvZGVyICovCi0gICAgZGVjb2Rlci0+Y2ZmICAgICAgICAgID0gY2ZmOwotICAgIGRlY29kZXItPm51bV9nbG9iYWxzICA9IGNmZi0+Z2xvYmFsX3N1YnJzX2luZGV4LmNvdW50OwotICAgIGRlY29kZXItPmdsb2JhbHMgICAgICA9IGNmZi0+Z2xvYmFsX3N1YnJzOwotICAgIGRlY29kZXItPmdsb2JhbHNfYmlhcyA9IGNmZl9jb21wdXRlX2JpYXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmYtPnRvcF9mb250LmZvbnRfZGljdC5jaGFyc3RyaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5udW1fZ2xvYmFscyApOwotCi0gICAgZGVjb2Rlci0+aGludF9tb2RlICAgID0gaGludF9tb2RlOwotICB9Ci0KLQotICAvKiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBzdWJmb250ICovCi0gIC8qIGFuZCB0aGUgbG9jYWxzIHN1YnJzIGFycmF5ICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9kZWNvZGVyX3ByZXBhcmUoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZGX1NpemUgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4ICkKLSAgewotICAgIENGRl9CdWlsZGVyICAqYnVpbGRlciA9ICZkZWNvZGVyLT5idWlsZGVyOwotICAgIENGRl9Gb250ICAgICAgY2ZmICAgICA9IChDRkZfRm9udClidWlsZGVyLT5mYWNlLT5leHRyYS5kYXRhOwotICAgIENGRl9TdWJGb250ICAgc3ViICAgICA9ICZjZmYtPnRvcF9mb250OwotICAgIEZUX0Vycm9yICAgICAgZXJyb3IgICA9IEZUX0Vycl9PazsKLQotCi0gICAgLyogbWFuYWdlIENJRCBmb250cyAqLwotICAgIGlmICggY2ZmLT5udW1fc3ViZm9udHMgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgIGZkX2luZGV4ID0gY2ZmX2ZkX3NlbGVjdF9nZXQoICZjZmYtPmZkX3NlbGVjdCwgZ2x5cGhfaW5kZXggKTsKLQotCi0gICAgICBpZiAoIGZkX2luZGV4ID49IGNmZi0+bnVtX3N1YmZvbnRzICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U0KCggImNmZl9kZWNvZGVyX3ByZXBhcmU6IGludmFsaWQgQ0lEIHN1YmZvbnQgaW5kZXhcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBGVF9UUkFDRTMoKCAiICBpbiBzdWJmb250ICVkOlxuIiwgZmRfaW5kZXggKSk7Ci0KLSAgICAgIHN1YiA9IGNmZi0+c3ViZm9udHNbZmRfaW5kZXhdOwotCi0gICAgICBpZiAoIGJ1aWxkZXItPmhpbnRzX2Z1bmNzICYmIHNpemUgKQotICAgICAgewotICAgICAgICBGVF9TaXplICAgICAgIGZ0c2l6ZSAgID0gRlRfU0laRSggc2l6ZSApOwotICAgICAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsID0gKENGRl9JbnRlcm5hbClmdHNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YTsKLQotCi0gICAgICAgIC8qIGZvciBDRkZzIHdpdGhvdXQgc3ViZm9udHMsIHRoaXMgdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBzZXQgKi8KLSAgICAgICAgYnVpbGRlci0+aGludHNfZ2xvYmFscyA9ICh2b2lkICopaW50ZXJuYWwtPnN1YmZvbnRzW2ZkX2luZGV4XTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWNvZGVyLT5udW1fbG9jYWxzICAgID0gc3ViLT5sb2NhbF9zdWJyc19pbmRleC5jb3VudDsKLSAgICBkZWNvZGVyLT5sb2NhbHMgICAgICAgID0gc3ViLT5sb2NhbF9zdWJyczsKLSAgICBkZWNvZGVyLT5sb2NhbHNfYmlhcyAgID0gY2ZmX2NvbXB1dGVfYmlhcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5jZmYtPnRvcF9mb250LmZvbnRfZGljdC5jaGFyc3RyaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+bnVtX2xvY2FscyApOwotCi0gICAgZGVjb2Rlci0+Z2x5cGhfd2lkdGggICA9IHN1Yi0+cHJpdmF0ZV9kaWN0LmRlZmF1bHRfd2lkdGg7Ci0gICAgZGVjb2Rlci0+bm9taW5hbF93aWR0aCA9IHN1Yi0+cHJpdmF0ZV9kaWN0Lm5vbWluYWxfd2lkdGg7Ci0KLSAgICBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgPSBzdWI7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciBgY291bnQnIG1vcmUgcG9pbnRzICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfY2hlY2tfcG9pbnRzKCBDRkZfQnVpbGRlciogIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggYnVpbGRlci0+bG9hZGVyLCBjb3VudCwgMCApOwotICB9Ci0KLQotICAvKiBhZGQgYSBuZXcgcG9pbnQsIGRvIG5vdCBjaGVjayBzcGFjZSAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIENGRl9CdWlsZGVyKiAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgICAgZmxhZyApCi0gIHsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSA9IGJ1aWxkZXItPmN1cnJlbnQ7Ci0KLQotICAgIGlmICggYnVpbGRlci0+bG9hZF9wb2ludHMgKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHBvaW50ICAgPSBvdXRsaW5lLT5wb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICAgIGNvbnRyb2wgPSAoRlRfQnl0ZSopb3V0bGluZS0+dGFncyArIG91dGxpbmUtPm5fcG9pbnRzOwotCi0jaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotICAgICAgQ0ZGX0RyaXZlciAgZHJpdmVyICA9IChDRkZfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBidWlsZGVyLT5mYWNlICk7Ci0KLQotICAgICAgaWYgKCBkcml2ZXItPmhpbnRpbmdfZW5naW5lID09IEZUX0NGRl9ISU5USU5HX0ZSRUVUWVBFICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPnggPSB4ID4+IDE2OwotICAgICAgICBwb2ludC0+eSA9IHkgPj4gMTY7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIHsKLSAgICAgICAgLyogY2YyX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MgdXNlcyAxNi4xNiBjb29yZGluYXRlcyAqLwotICAgICAgICBwb2ludC0+eCA9IHggPj4gMTA7Ci0gICAgICAgIHBvaW50LT55ID0geSA+PiAxMDsKLSAgICAgIH0KLSAgICAgICpjb250cm9sID0gKEZUX0J5dGUpKCBmbGFnID8gRlRfQ1VSVkVfVEFHX09OIDogRlRfQ1VSVkVfVEFHX0NVQklDICk7Ci0gICAgfQotCi0gICAgb3V0bGluZS0+bl9wb2ludHMrKzsKLSAgfQotCi0KLSAgLyogY2hlY2sgc3BhY2UgZm9yIGEgbmV3IG9uLWN1cnZlIHBvaW50LCB0aGVuIGFkZCBpdCAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50MSggQ0ZGX0J1aWxkZXIqICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgMSApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBjaGVjayBzcGFjZSBmb3IgYSBuZXcgY29udG91ciwgdGhlbiBhZGQgaXQgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9idWlsZGVyX2FkZF9jb250b3VyKCBDRkZfQnVpbGRlciogIGJ1aWxkZXIgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSBidWlsZGVyLT5jdXJyZW50OwotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhYnVpbGRlci0+bG9hZF9wb2ludHMgKQotICAgIHsKLSAgICAgIG91dGxpbmUtPm5fY29udG91cnMrKzsKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGJ1aWxkZXItPmxvYWRlciwgMCwgMSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBpZiAoIG91dGxpbmUtPm5fY29udG91cnMgPiAwICkKLSAgICAgICAgb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDFdID0KLSAgICAgICAgICAoc2hvcnQpKCBvdXRsaW5lLT5uX3BvaW50cyAtIDEgKTsKLQotICAgICAgb3V0bGluZS0+bl9jb250b3VycysrOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogaWYgYSBwYXRoIHdhcyBiZWd1biwgYWRkIGl0cyBmaXJzdCBvbi1jdXJ2ZSBwb2ludCAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIENGRl9CdWlsZGVyKiAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIC8qIHRlc3Qgd2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgYSBuZXcgY29udG91ciAqLwotICAgIGlmICggIWJ1aWxkZXItPnBhdGhfYmVndW4gKQotICAgIHsKLSAgICAgIGJ1aWxkZXItPnBhdGhfYmVndW4gPSAxOwotICAgICAgZXJyb3IgPSBjZmZfYnVpbGRlcl9hZGRfY29udG91ciggYnVpbGRlciApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IGNmZl9idWlsZGVyX2FkZF9wb2ludDEoIGJ1aWxkZXIsIHgsIHkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGNsb3NlIHRoZSBjdXJyZW50IGNvbnRvdXIgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX2J1aWxkZXJfY2xvc2VfY29udG91ciggQ0ZGX0J1aWxkZXIqICBidWlsZGVyICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLSAgICBGVF9JbnQgICAgICAgZmlyc3Q7Ci0KLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuOwotCi0gICAgZmlyc3QgPSBvdXRsaW5lLT5uX2NvbnRvdXJzIDw9IDEKLSAgICAgICAgICAgID8gMCA6IG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAyXSArIDE7Ci0KLSAgICAvKiBXZSBtdXN0IG5vdCBpbmNsdWRlIHRoZSBsYXN0IHBvaW50IGluIHRoZSBwYXRoIGlmIGl0ICovCi0gICAgLyogaXMgbG9jYXRlZCBvbiB0aGUgZmlyc3QgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPiAxICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICBwMSAgICAgID0gb3V0bGluZS0+cG9pbnRzICsgZmlyc3Q7Ci0gICAgICBGVF9WZWN0b3IqICBwMiAgICAgID0gb3V0bGluZS0+cG9pbnRzICsgb3V0bGluZS0+bl9wb2ludHMgLSAxOwotICAgICAgRlRfQnl0ZSogICAgY29udHJvbCA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHMgLSAxOwotCi0KLSAgICAgIC8qIGBkZWxldGUnIGxhc3QgcG9pbnQgb25seSBpZiBpdCBjb2luY2lkZXMgd2l0aCB0aGUgZmlyc3QgICAgKi8KLSAgICAgIC8qIHBvaW50IGFuZCBpZiBpdCBpcyBub3QgYSBjb250cm9sIHBvaW50ICh3aGljaCBjYW4gaGFwcGVuKS4gKi8KLSAgICAgIGlmICggcDEtPnggPT0gcDItPnggJiYgcDEtPnkgPT0gcDItPnkgKQotICAgICAgICBpZiAoICpjb250cm9sID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgb3V0bGluZS0+bl9wb2ludHMtLTsKLSAgICB9Ci0KLSAgICBpZiAoIG91dGxpbmUtPm5fY29udG91cnMgPiAwICkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBhZGQgY29udG91cnMgb25seSBjb25zaXN0aW5nIG9mIG9uZSBwb2ludCwgaS5lLiwgKi8KLSAgICAgIC8qIGNoZWNrIHdoZXRoZXIgYmVnaW4gcG9pbnQgYW5kIGxhc3QgcG9pbnQgYXJlIHRoZSBzYW1lLiAqLwotICAgICAgaWYgKCBmaXJzdCA9PSBvdXRsaW5lLT5uX3BvaW50cyAtIDEgKQotICAgICAgewotICAgICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzLS07Ci0gICAgICAgIG91dGxpbmUtPm5fcG9pbnRzLS07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAxXSA9Ci0gICAgICAgICAgKHNob3J0KSggb3V0bGluZS0+bl9wb2ludHMgLSAxICk7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCi0gIGNmZl9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIENGRl9Gb250ICBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICBjaGFyY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIG47Ci0gICAgRlRfVVNob3J0ICBnbHlwaF9zaWQ7Ci0KLQotICAgIC8qIENJRC1rZXllZCBmb250cyBkb24ndCBoYXZlIGdseXBoIG5hbWVzICovCi0gICAgaWYgKCAhY2ZmLT5jaGFyc2V0LnNpZHMgKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogY2hlY2sgcmFuZ2Ugb2Ygc3RhbmRhcmQgY2hhciBjb2RlICovCi0gICAgaWYgKCBjaGFyY29kZSA8IDAgfHwgY2hhcmNvZGUgPiAyNTUgKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogR2V0IGNvZGUgdG8gU0lEIG1hcHBpbmcgZnJvbSBgY2ZmX3N0YW5kYXJkX2VuY29kaW5nJy4gKi8KLSAgICBnbHlwaF9zaWQgPSBjZmZfZ2V0X3N0YW5kYXJkX2VuY29kaW5nKCAoRlRfVUludCljaGFyY29kZSApOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBjZmYtPm51bV9nbHlwaHM7IG4rKyApCi0gICAgewotICAgICAgaWYgKCBjZmYtPmNoYXJzZXQuc2lkc1tuXSA9PSBnbHlwaF9zaWQgKQotICAgICAgICByZXR1cm4gKEZUX0ludCluOwotICAgIH0KLQotICAgIHJldHVybiAtMTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9nZXRfZ2x5cGhfZGF0YSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICkKLSAgewotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAvKiBGb3IgaW5jcmVtZW50YWwgZm9udHMgZ2V0IHRoZSBjaGFyYWN0ZXIgZGF0YSB1c2luZyB0aGUgKi8KLSAgICAvKiBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgewotICAgICAgRlRfRGF0YSAgIGRhdGE7Ci0gICAgICBGVF9FcnJvciAgZXJyb3IgPQotICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5mdW5jcy0+Z2V0X2dseXBoX2RhdGEoCi0gICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgJmRhdGEgKTsKLQotCi0gICAgICAqcG9pbnRlciA9IChGVF9CeXRlKilkYXRhLnBvaW50ZXI7Ci0gICAgICAqbGVuZ3RoICA9IChGVF9VTG9uZylkYXRhLmxlbmd0aDsKLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gICAgewotICAgICAgQ0ZGX0ZvbnQgIGNmZiA9IChDRkZfRm9udCkoZmFjZS0+ZXh0cmEuZGF0YSk7Ci0KLQotICAgICAgcmV0dXJuIGNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudCggJmNmZi0+Y2hhcnN0cmluZ3NfaW5kZXgsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciwgbGVuZ3RoICk7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZnJlZV9nbHlwaF9kYXRhKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBsZW5ndGggKQotICB7Ci0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBGVF9VTlVTRUQoIGxlbmd0aCApOwotI2VuZGlmCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgLyogRm9yIGluY3JlbWVudGFsIGZvbnRzIGdldCB0aGUgY2hhcmFjdGVyIGRhdGEgdXNpbmcgdGhlICovCi0gICAgLyogY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgIHsKLSAgICAgIEZUX0RhdGEgIGRhdGE7Ci0KLQotICAgICAgZGF0YS5wb2ludGVyID0gKnBvaW50ZXI7Ci0gICAgICBkYXRhLmxlbmd0aCAgPSAoRlRfSW50KWxlbmd0aDsKLQotICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5mdW5jcy0+ZnJlZV9nbHlwaF9kYXRhKAotICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwgJmRhdGEgKTsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotICAgIHsKLSAgICAgIENGRl9Gb250ICBjZmYgPSAoQ0ZGX0ZvbnQpKGZhY2UtPmV4dHJhLmRhdGEpOwotCi0KLSAgICAgIGNmZl9pbmRleF9mb3JnZXRfZWxlbWVudCggJmNmZi0+Y2hhcnN0cmluZ3NfaW5kZXgsIHBvaW50ZXIgKTsKLSAgICB9Ci0gIH0KLQotCi0jaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfb3BlcmF0b3Jfc2VhYyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICBhc2IsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIGFkeCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgYWR5LAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBiY2hhciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgYWNoYXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBDRkZfQnVpbGRlciogIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKLSAgICBGVF9JbnQgICAgICAgIGJjaGFyX2luZGV4LCBhY2hhcl9pbmRleDsKLSAgICBUVF9GYWNlICAgICAgIGZhY2UgPSBkZWNvZGVyLT5idWlsZGVyLmZhY2U7Ci0gICAgRlRfVmVjdG9yICAgICBsZWZ0X2JlYXJpbmcsIGFkdmFuY2U7Ci0gICAgRlRfQnl0ZSogICAgICBjaGFyc3RyaW5nOwotICAgIEZUX1VMb25nICAgICAgY2hhcnN0cmluZ19sZW47Ci0gICAgRlRfUG9zICAgICAgICBnbHlwaF93aWR0aDsKLQotCi0gICAgaWYgKCBkZWNvZGVyLT5zZWFjICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJjZmZfb3BlcmF0b3Jfc2VhYzogaW52YWxpZCBuZXN0ZWQgc2VhY1xuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgfQotCi0gICAgYWR4ICs9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLng7Ci0gICAgYWR5ICs9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnk7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgLyogSW5jcmVtZW50YWwgZm9udHMgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB2YWxpZCBjaGFyc2V0cy4gICAgICAgICovCi0gICAgLyogVGhleSB1c2UgdGhlIGNoYXJhY3RlciBjb2RlLCBub3QgdGhlIGdseXBoIGluZGV4LCBpbiB0aGlzIGNhc2UuICovCi0gICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgIHsKLSAgICAgIGJjaGFyX2luZGV4ID0gYmNoYXI7Ci0gICAgICBhY2hhcl9pbmRleCA9IGFjaGFyOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotICAgIHsKLSAgICAgIENGRl9Gb250IGNmZiA9IChDRkZfRm9udCkoZmFjZS0+ZXh0cmEuZGF0YSk7Ci0KLQotICAgICAgYmNoYXJfaW5kZXggPSBjZmZfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlKCBjZmYsIGJjaGFyICk7Ci0gICAgICBhY2hhcl9pbmRleCA9IGNmZl9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGNmZiwgYWNoYXIgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGJjaGFyX2luZGV4IDwgMCB8fCBhY2hhcl9pbmRleCA8IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNmZl9vcGVyYXRvcl9zZWFjOiIKLSAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHNlYWMgY2hhcmFjdGVyIGNvZGUgYXJndW1lbnRzXG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgICB9Ci0KLSAgICAvKiBJZiB3ZSBhcmUgdHJ5aW5nIHRvIGxvYWQgYSBjb21wb3NpdGUgZ2x5cGgsIGRvIG5vdCBsb2FkIHRoZSAqLwotICAgIC8qIGFjY2VudCBjaGFyYWN0ZXIgYW5kIHJldHVybiB0aGUgYXJyYXkgb2Ygc3ViZ2x5cGhzLiAgICAgICAgICovCi0gICAgaWYgKCBidWlsZGVyLT5ub19yZWN1cnNlICkKLSAgICB7Ci0gICAgICBGVF9HbHlwaFNsb3QgICAgZ2x5cGggID0gKEZUX0dseXBoU2xvdClidWlsZGVyLT5nbHlwaDsKLSAgICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgPSBnbHlwaC0+aW50ZXJuYWwtPmxvYWRlcjsKLSAgICAgIEZUX1N1YkdseXBoICAgICBzdWJnOwotCi0KLSAgICAgIC8qIHJlYWxsb2NhdGUgc3ViZ2x5cGggYXJyYXkgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NoZWNrU3ViR2x5cGhzKCBsb2FkZXIsIDIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHN1YmcgPSBsb2FkZXItPmN1cnJlbnQuc3ViZ2x5cGhzOwotCi0gICAgICAvKiBzdWJnbHlwaCAwID0gYmFzZSBjaGFyYWN0ZXIgKi8KLSAgICAgIHN1YmctPmluZGV4ID0gYmNoYXJfaW5kZXg7Ci0gICAgICBzdWJnLT5mbGFncyA9IEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTIHwKLSAgICAgICAgICAgICAgICAgICAgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUzsKLSAgICAgIHN1YmctPmFyZzEgID0gMDsKLSAgICAgIHN1YmctPmFyZzIgID0gMDsKLSAgICAgIHN1YmcrKzsKLQotICAgICAgLyogc3ViZ2x5cGggMSA9IGFjY2VudCBjaGFyYWN0ZXIgKi8KLSAgICAgIHN1YmctPmluZGV4ID0gYWNoYXJfaW5kZXg7Ci0gICAgICBzdWJnLT5mbGFncyA9IEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTOwotICAgICAgc3ViZy0+YXJnMSAgPSAoRlRfSW50KSggYWR4ID4+IDE2ICk7Ci0gICAgICBzdWJnLT5hcmcyICA9IChGVF9JbnQpKCBhZHkgPj4gMTYgKTsKLQotICAgICAgLyogc2V0IHVwIHJlbWFpbmluZyBnbHlwaCBmaWVsZHMgKi8KLSAgICAgIGdseXBoLT5udW1fc3ViZ2x5cGhzID0gMjsKLSAgICAgIGdseXBoLT5zdWJnbHlwaHMgICAgID0gbG9hZGVyLT5iYXNlLnN1YmdseXBoczsKLSAgICAgIGdseXBoLT5mb3JtYXQgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURTsKLQotICAgICAgbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHMgPSAyOwotICAgIH0KLQotICAgIEZUX0dseXBoTG9hZGVyX1ByZXBhcmUoIGJ1aWxkZXItPmxvYWRlciApOwotCi0gICAgLyogRmlyc3QgbG9hZCBgYmNoYXInIGluIGJ1aWxkZXIgKi8KLSAgICBlcnJvciA9IGNmZl9nZXRfZ2x5cGhfZGF0YSggZmFjZSwgKEZUX1VJbnQpYmNoYXJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc3RyaW5nLCAmY2hhcnN0cmluZ19sZW4gKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgLyogdGhlIHNlYWMgb3BlcmF0b3IgbXVzdCBub3QgYmUgbmVzdGVkICovCi0gICAgICBkZWNvZGVyLT5zZWFjID0gVFJVRTsKLSAgICAgIGVycm9yID0gY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIGRlY29kZXIsIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiwgMCApOwotICAgICAgZGVjb2Rlci0+c2VhYyA9IEZBTFNFOwotCi0gICAgICBjZmZfZnJlZV9nbHlwaF9kYXRhKCBmYWNlLCAmY2hhcnN0cmluZywgY2hhcnN0cmluZ19sZW4gKTsKLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIHRoZSBsZWZ0IGJlYXJpbmcsIGFkdmFuY2UgYW5kIGdseXBoIHdpZHRoIG9mIHRoZSBiYXNlICovCi0gICAgLyogY2hhcmFjdGVyIGFzIHRoZXkgd2lsbCBiZSBlcmFzZWQgYnkgdGhlIG5leHQgbG9hZC4gICAgICAgICAqLwotCi0gICAgbGVmdF9iZWFyaW5nID0gYnVpbGRlci0+bGVmdF9iZWFyaW5nOwotICAgIGFkdmFuY2UgICAgICA9IGJ1aWxkZXItPmFkdmFuY2U7Ci0gICAgZ2x5cGhfd2lkdGggID0gZGVjb2Rlci0+Z2x5cGhfd2lkdGg7Ci0KLSAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCA9IDA7Ci0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnkgPSAwOwotCi0gICAgYnVpbGRlci0+cG9zX3ggPSBhZHggLSBhc2I7Ci0gICAgYnVpbGRlci0+cG9zX3kgPSBhZHk7Ci0KLSAgICAvKiBOb3cgbG9hZCBgYWNoYXInIG9uIHRvcCBvZiB0aGUgYmFzZSBvdXRsaW5lLiAqLwotICAgIGVycm9yID0gY2ZmX2dldF9nbHlwaF9kYXRhKCBmYWNlLCAoRlRfVUludClhY2hhcl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzdHJpbmcsICZjaGFyc3RyaW5nX2xlbiApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICAvKiB0aGUgc2VhYyBvcGVyYXRvciBtdXN0IG5vdCBiZSBuZXN0ZWQgKi8KLSAgICAgIGRlY29kZXItPnNlYWMgPSBUUlVFOwotICAgICAgZXJyb3IgPSBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggZGVjb2RlciwgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmdfbGVuLCAwICk7Ci0gICAgICBkZWNvZGVyLT5zZWFjID0gRkFMU0U7Ci0KLSAgICAgIGNmZl9mcmVlX2dseXBoX2RhdGEoIGZhY2UsICZjaGFyc3RyaW5nLCBjaGFyc3RyaW5nX2xlbiApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIFJlc3RvcmUgdGhlIGxlZnQgc2lkZSBiZWFyaW5nLCBhZHZhbmNlIGFuZCBnbHlwaCB3aWR0aCAqLwotICAgIC8qIG9mIHRoZSBiYXNlIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZyA9IGxlZnRfYmVhcmluZzsKLSAgICBidWlsZGVyLT5hZHZhbmNlICAgICAgPSBhZHZhbmNlOwotICAgIGRlY29kZXItPmdseXBoX3dpZHRoICA9IGdseXBoX3dpZHRoOwotCi0gICAgYnVpbGRlci0+cG9zX3ggPSAwOwotICAgIGJ1aWxkZXItPnBvc195ID0gMDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2VzIGEgZ2l2ZW4gVHlwZSAyIGNoYXJzdHJpbmdzIHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVjb2RlciAgICAgICAgIDo6IFRoZSBjdXJyZW50IFR5cGUgMSBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcnN0cmluZ19iYXNlIDo6IFRoZSBiYXNlIG9mIHRoZSBjaGFyc3RyaW5nIHN0cmVhbS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluX2RpY3QgICAgICAgICA6OiBTZXQgdG8gMSBpZiBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0b3Agb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBESUNUIChuZWVkZWQgZm9yIE11bHRpcGxlIE1hc3RlciBDRkZzKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICBjaGFyc3RyaW5nX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIGNoYXJzdHJpbmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICBpbl9kaWN0ICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsKLSAgICBDRkZfRGVjb2Rlcl9ab25lKiAgem9uZTsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgaXA7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIGxpbWl0OwotICAgIENGRl9CdWlsZGVyKiAgICAgICBidWlsZGVyID0gJmRlY29kZXItPmJ1aWxkZXI7Ci0gICAgRlRfUG9zICAgICAgICAgICAgIHgsIHk7Ci0gICAgRlRfRml4ZWQqICAgICAgICAgIHN0YWNrOwotICAgIEZUX0ludCAgICAgICAgICAgICBjaGFyc3RyaW5nX3R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0LmNoYXJzdHJpbmdfdHlwZTsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgbnVtX2Rlc2lnbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0Lm51bV9kZXNpZ25zOwotICAgIEZUX1VTaG9ydCAgICAgICAgICBudW1fYXhlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+Y2ZmLT50b3BfZm9udC5mb250X2RpY3QubnVtX2F4ZXM7Ci0KLSAgICBUMl9IaW50c19GdW5jcyAgICAgaGludGVyOwotCi0KLSAgICAvKiBzZXQgZGVmYXVsdCB3aWR0aCAqLwotICAgIGRlY29kZXItPm51bV9oaW50cyAgPSAwOwotICAgIGRlY29kZXItPnJlYWRfd2lkdGggPSAxOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZGVjb2RlciAqLwotICAgIGRlY29kZXItPnRvcCAgPSBkZWNvZGVyLT5zdGFjazsKLSAgICBkZWNvZGVyLT56b25lID0gZGVjb2Rlci0+em9uZXM7Ci0gICAgem9uZSAgICAgICAgICA9IGRlY29kZXItPnpvbmVzOwotICAgIHN0YWNrICAgICAgICAgPSBkZWNvZGVyLT50b3A7Ci0KLSAgICBoaW50ZXIgPSAoVDJfSGludHNfRnVuY3MpYnVpbGRlci0+aGludHNfZnVuY3M7Ci0KLSAgICBidWlsZGVyLT5wYXRoX2JlZ3VuID0gMDsKLQotICAgIHpvbmUtPmJhc2UgICAgICAgICAgID0gY2hhcnN0cmluZ19iYXNlOwotICAgIGxpbWl0ID0gem9uZS0+bGltaXQgID0gY2hhcnN0cmluZ19iYXNlICsgY2hhcnN0cmluZ19sZW47Ci0gICAgaXAgICAgPSB6b25lLT5jdXJzb3IgPSB6b25lLT5iYXNlOwotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICB4ID0gYnVpbGRlci0+cG9zX3g7Ci0gICAgeSA9IGJ1aWxkZXItPnBvc195OwotCi0gICAgLyogYmVnaW4gaGludHMgcmVjb3JkaW5nIHNlc3Npb24sIGlmIGFueSAqLwotICAgIGlmICggaGludGVyICkKLSAgICAgIGhpbnRlci0+b3BlbiggaGludGVyLT5oaW50cyApOwotCi0gICAgLyogbm93IGV4ZWN1dGUgbG9vcCAqLwotICAgIHdoaWxlICggaXAgPCBsaW1pdCApCi0gICAgewotICAgICAgQ0ZGX09wZXJhdG9yICBvcDsKLSAgICAgIEZUX0J5dGUgICAgICAgdjsKLQotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBEZWNvZGUgb3BlcmF0b3Igb3Igb3BlcmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB2ID0gKmlwKys7Ci0gICAgICBpZiAoIHYgPj0gMzIgfHwgdiA9PSAyOCApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgICBzaGlmdCA9IDE2OwotICAgICAgICBGVF9JbnQzMiAgdmFsOwotCi0KLSAgICAgICAgLyogdGhpcyBpcyBhbiBvcGVyYW5kLCBwdXNoIGl0IG9uIHRoZSBzdGFjayAqLwotCi0gICAgICAgIC8qIGlmIHdlIHVzZSBzaGlmdHMsIGFsbCBjb21wdXRhdGlvbnMgYXJlIGRvbmUgd2l0aCB1bnNpZ25lZCAqLwotICAgICAgICAvKiB2YWx1ZXM7IHRoZSBjb252ZXJzaW9uIHRvIGEgc2lnbmVkIHZhbHVlIGlzIHRoZSBsYXN0IHN0ZXAgKi8KLSAgICAgICAgaWYgKCB2ID09IDI4ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggaXAgKyAxID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgIHZhbCA9IChGVF9TaG9ydCkoICggKEZUX1VTaG9ydClpcFswXSA8PCA4ICkgfCBpcFsxXSApOwotICAgICAgICAgIGlwICs9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHYgPCAyNDcgKQotICAgICAgICAgIHZhbCA9IChGVF9JbnQzMil2IC0gMTM5OwotICAgICAgICBlbHNlIGlmICggdiA8IDI1MSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGlwID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgIHZhbCA9ICggKEZUX0ludDMyKXYgLSAyNDcgKSAqIDI1NiArICppcCsrICsgMTA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCB2IDwgMjU1ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggaXAgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgdmFsID0gLSggKEZUX0ludDMyKXYgLSAyNTEgKSAqIDI1NiAtICppcCsrIC0gMTA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggaXAgKyAzID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgIHZhbCA9IChGVF9JbnQzMikoICggKEZUX1VJbnQzMilpcFswXSA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpaXBbMV0gPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUludDMyKWlwWzJdIDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMilpcFszXSAgICAgICAgICk7Ci0gICAgICAgICAgaXAgICAgKz0gNDsKLSAgICAgICAgICBpZiAoIGNoYXJzdHJpbmdfdHlwZSA9PSAyICkKLSAgICAgICAgICAgIHNoaWZ0ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGRlY29kZXItPnRvcCAtIHN0YWNrID49IENGRl9NQVhfT1BFUkFORFMgKQotICAgICAgICAgIGdvdG8gU3RhY2tfT3ZlcmZsb3c7Ci0KLSAgICAgICAgdmFsICAgICAgICAgICAgID0gKEZUX0ludDMyKSggKEZUX1VJbnQzMil2YWwgPDwgc2hpZnQgKTsKLSAgICAgICAgKmRlY29kZXItPnRvcCsrID0gdmFsOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgaWYgKCAhKCB2YWwgJiAweEZGRkZMICkgKQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgJWhkIiwgKEZUX1Nob3J0KSggKEZUX1VJbnQzMil2YWwgPj4gMTYgKSApKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgJS41ZiIsIHZhbCAvIDY1NTM2LjAgKSk7Ci0jZW5kaWYKLQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBUaGUgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgbm9ybWFsbHkgYXJndW1lbnRzIGFyZSB0byBiZSB0YWtlbiAqLwotICAgICAgICAvKiBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLiAgSG93ZXZlciwgdGhpcyBzZWVtcyBub3QgdG8gYmUgICAqLwotICAgICAgICAvKiBjb3JyZWN0LCBhdCBsZWFzdCBmb3IgQWNyb3JlYWQgNy4wLjggb24gR05VL0xpbnV4OiBJdCBwb3BzIHRoZSAqLwotICAgICAgICAvKiBhcmd1bWVudHMgc2ltaWxhciB0byBhIFBTIGludGVycHJldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIEZUX0ZpeGVkKiAgYXJncyAgICAgPSBkZWNvZGVyLT50b3A7Ci0gICAgICAgIEZUX0ludCAgICAgbnVtX2FyZ3MgPSAoRlRfSW50KSggYXJncyAtIGRlY29kZXItPnN0YWNrICk7Ci0gICAgICAgIEZUX0ludCAgICAgcmVxX2FyZ3M7Ci0KLQotICAgICAgICAvKiBmaW5kIG9wZXJhdG9yICovCi0gICAgICAgIG9wID0gY2ZmX29wX3Vua25vd247Ci0KLSAgICAgICAgc3dpdGNoICggdiApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIG9wID0gY2ZmX29wX2hzdGVtOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfdnN0ZW07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICBvcCA9IGNmZl9vcF92bW92ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfcmxpbmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgIG9wID0gY2ZmX29wX2hsaW5ldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICBvcCA9IGNmZl9vcF92bGluZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfcnJjdXJ2ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfY2xvc2VwYXRoOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgIG9wID0gY2ZmX29wX2NhbGxzdWJyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgotICAgICAgICAgIG9wID0gY2ZmX29wX3JldHVybjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGlwID49IGxpbWl0ICkKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB2ID0gKmlwKys7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoIHYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9kb3RzZWN0aW9uOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogLyogdGhpcyBpcyBhY3R1YWxseSB0aGUgVHlwZTEgdnN0ZW0zIG9wZXJhdG9yICovCi0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3ZzdGVtOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogLyogdGhpcyBpcyBhY3R1YWxseSB0aGUgVHlwZTEgaHN0ZW0zIG9wZXJhdG9yICovCi0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2hzdGVtOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfYW5kOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfb3I7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9ub3Q7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9zZWFjOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfc2J3OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfc3RvcmU7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9hYnM7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfYWRkOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3N1YjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9kaXY7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfbG9hZDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9uZWc7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfZXE7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfY2FsbG90aGVyc3VicjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9wb3A7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfZHJvcDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9wdXQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfZ2V0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2lmZWxzZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9yYW5kb207Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfbXVsOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3NxcnQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfZHVwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2V4Y2g7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfaW5kZXg7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfcm9sbDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9zZXRjdXJyZW50cG9pbnQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfaGZsZXg7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfZmxleDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9oZmxleDE7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfZmxleDE7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiB1bmtub3duIG9wICgxMiwgJWQpXG4iLCB2ICkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfaHNidzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9lbmRjaGFyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgIG9wID0gY2ZmX29wX2JsZW5kOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4OgotICAgICAgICAgIG9wID0gY2ZmX29wX2hzdGVtaG07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfaGludG1hc2s7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfY250cm1hc2s7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgb3AgPSBjZmZfb3Bfcm1vdmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9obW92ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIzOgotICAgICAgICAgIG9wID0gY2ZmX29wX3ZzdGVtaG07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfcmN1cnZlbGluZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9ybGluZWN1cnZlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgIG9wID0gY2ZmX29wX3Z2Y3VydmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9oaGN1cnZldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfY2FsbGdzdWJyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMwOgotICAgICAgICAgIG9wID0gY2ZmX29wX3ZoY3VydmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9odmN1cnZldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiB1bmtub3duIG9wICglZClcbiIsIHYgKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG9wID09IGNmZl9vcF91bmtub3duICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBpbiBNdWx0aXBsZSBNYXN0ZXIgQ0ZGcywgVDIgY2hhcnN0cmluZ3MgY2FuIGFwcGVhciBpbiAqLwotICAgICAgICAvKiBkaWN0aW9uYXJpZXMsIGJ1dCBzb21lIG9wZXJhdG9ycyBhcmUgcHJvaGliaXRlZCAgICAgICAqLwotICAgICAgICBpZiAoIGluX2RpY3QgKQotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoICggb3AgKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGNmZl9vcF9oc3RlbToKLSAgICAgICAgICBjYXNlIGNmZl9vcF92c3RlbToKLSAgICAgICAgICBjYXNlIGNmZl9vcF92bW92ZXRvOgotICAgICAgICAgIGNhc2UgY2ZmX29wX3JsaW5ldG86Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfaGxpbmV0bzoKLSAgICAgICAgICBjYXNlIGNmZl9vcF92bGluZXRvOgotICAgICAgICAgIGNhc2UgY2ZmX29wX3JyY3VydmV0bzoKLSAgICAgICAgICBjYXNlIGNmZl9vcF9oc3RlbWhtOgotICAgICAgICAgIGNhc2UgY2ZmX29wX2hpbnRtYXNrOgotICAgICAgICAgIGNhc2UgY2ZmX29wX2NudHJtYXNrOgotICAgICAgICAgIGNhc2UgY2ZmX29wX3Jtb3ZldG86Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfaG1vdmV0bzoKLSAgICAgICAgICBjYXNlIGNmZl9vcF92c3RlbWhtOgotICAgICAgICAgIGNhc2UgY2ZmX29wX3JjdXJ2ZWxpbmU6Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfcmxpbmVjdXJ2ZToKLSAgICAgICAgICBjYXNlIGNmZl9vcF92dmN1cnZldG86Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfaGhjdXJ2ZXRvOgotICAgICAgICAgIGNhc2UgY2ZmX29wX3ZoY3VydmV0bzoKLSAgICAgICAgICBjYXNlIGNmZl9vcF9odmN1cnZldG86Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfaGZsZXg6Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfZmxleDoKLSAgICAgICAgICBjYXNlIGNmZl9vcF9oZmxleDE6Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfZmxleDE6Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfY2FsbHN1YnI6Ci0gICAgICAgICAgY2FzZSBjZmZfb3BfY2FsbGdzdWJyOgotICAgICAgICAgICAgZ290byBNTV9FcnJvcjsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjaGVjayBhcmd1bWVudHMgKi8KLSAgICAgICAgcmVxX2FyZ3MgPSBjZmZfYXJndW1lbnRfY291bnRzW29wXTsKLSAgICAgICAgaWYgKCByZXFfYXJncyAmIENGRl9DT1VOVF9DSEVDS19XSURUSCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIG51bV9hcmdzID4gMCAmJiBkZWNvZGVyLT5yZWFkX3dpZHRoICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiBgbm9taW5hbF93aWR0aCcgaXMgbm9uLXplcm8sIHRoZSBudW1iZXIgaXMgcmVhbGx5IGEgICAgICAqLwotICAgICAgICAgICAgLyogZGlmZmVyZW5jZSBhZ2FpbnN0IGBub21pbmFsX3dpZHRoJy4gIEVsc2UsIHRoZSBudW1iZXIgaGVyZSAgKi8KLSAgICAgICAgICAgIC8qIGlzIHRydWx5IGEgd2lkdGgsIG5vdCBhIGRpZmZlcmVuY2UgYWdhaW5zdCBgbm9taW5hbF93aWR0aCcuICovCi0gICAgICAgICAgICAvKiBJZiB0aGUgZm9udCBkb2VzIG5vdCBzZXQgYG5vbWluYWxfd2lkdGgnLCB0aGVuICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogYG5vbWluYWxfd2lkdGgnIGRlZmF1bHRzIHRvIHplcm8sIGFuZCBzbyB3ZSBjYW4gc2V0ICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIGBnbHlwaF93aWR0aCcgdG8gYG5vbWluYWxfd2lkdGgnIHBsdXMgbnVtYmVyIG9uIHRoZSBzdGFjayAgICovCi0gICAgICAgICAgICAvKiAtLSBmb3IgZWl0aGVyIGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBGVF9JbnQgIHNldF93aWR0aF9vazsKLQotCi0gICAgICAgICAgICBzd2l0Y2ggKCBvcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF9obW92ZXRvOgotICAgICAgICAgICAgY2FzZSBjZmZfb3Bfdm1vdmV0bzoKLSAgICAgICAgICAgICAgc2V0X3dpZHRoX29rID0gbnVtX2FyZ3MgJiAyOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBjZmZfb3BfaHN0ZW06Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF92c3RlbToKLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX2hzdGVtaG06Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF92c3RlbWhtOgotICAgICAgICAgICAgY2FzZSBjZmZfb3Bfcm1vdmV0bzoKLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX2hpbnRtYXNrOgotICAgICAgICAgICAgY2FzZSBjZmZfb3BfY250cm1hc2s6Ci0gICAgICAgICAgICAgIHNldF93aWR0aF9vayA9IG51bV9hcmdzICYgMTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX2VuZGNoYXI6Ci0gICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgd2lkdGggc3BlY2lmaWVkIGZvciBlbmRjaGFyLCB3ZSBlaXRoZXIgaGF2ZSAqLwotICAgICAgICAgICAgICAvKiAxIGFyZ3VtZW50IG9yIDUgYXJndW1lbnRzLiAgV2UgbGlrZSB0byBhcmd1ZS4gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgc2V0X3dpZHRoX29rID0gaW5fZGljdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCAoIG51bV9hcmdzID09IDUgKSB8fCAoIG51bV9hcmdzID09IDEgKSApOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgc2V0X3dpZHRoX29rID0gMDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggc2V0X3dpZHRoX29rICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVjb2Rlci0+Z2x5cGhfd2lkdGggPSBkZWNvZGVyLT5ub21pbmFsX3dpZHRoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggc3RhY2tbMF0gPj4gMTYgKTsKLQotICAgICAgICAgICAgICBpZiAoIGRlY29kZXItPndpZHRoX29ubHkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2Ugb25seSB3YW50IHRoZSBhZHZhbmNlIHdpZHRoOyBzdG9wIGhlcmUgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8qIENvbnN1bWVkIGFuIGFyZ3VtZW50LiAqLwotICAgICAgICAgICAgICBudW1fYXJncy0tOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGRlY29kZXItPnJlYWRfd2lkdGggPSAwOwotICAgICAgICAgIHJlcV9hcmdzICAgICAgICAgICAgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVxX2FyZ3MgJj0gMHgwMDBGOwotICAgICAgICBpZiAoIG51bV9hcmdzIDwgcmVxX2FyZ3MgKQotICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotICAgICAgICBhcmdzICAgICAtPSByZXFfYXJnczsKLSAgICAgICAgbnVtX2FyZ3MgLT0gcmVxX2FyZ3M7Ci0KLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgYGFyZ3MnIHBvaW50cyB0byB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlICAqLwotICAgICAgICAvKiBvcGVyYW5kIGluIGNhc2UgYHJlcV9hcmdzJyBpc24ndCB6ZXJvLiAgT3RoZXJ3aXNlLCB3ZSBoYXZlICovCi0gICAgICAgIC8qIHRvIGFkanVzdCBgYXJncycgbWFudWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAvKiBOb3RlIHRoYXQgd2Ugb25seSBwb3AgYXJndW1lbnRzIGZyb20gdGhlIHN0YWNrIHdoaWNoIHdlICAgICovCi0gICAgICAgIC8qIHJlYWxseSBuZWVkIGFuZCBjYW4gZGlnZXN0IHNvIHRoYXQgd2UgY2FuIGNvbnRpbnVlIGluIGNhc2UgKi8KLSAgICAgICAgLyogb2Ygc3VwZXJmbHVvdXMgc3RhY2sgZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIHN3aXRjaCAoIG9wICkKLSAgICAgICAgewotICAgICAgICBjYXNlIGNmZl9vcF9oc3RlbToKLSAgICAgICAgY2FzZSBjZmZfb3BfdnN0ZW06Ci0gICAgICAgIGNhc2UgY2ZmX29wX2hzdGVtaG06Ci0gICAgICAgIGNhc2UgY2ZmX29wX3ZzdGVtaG06Ci0gICAgICAgICAgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaXMgYWx3YXlzIGV2ZW4gaGVyZSAqLwotICAgICAgICAgIEZUX1RSQUNFNCgoCi0gICAgICAgICAgICAgIG9wID09IGNmZl9vcF9oc3RlbSAgID8gIiBoc3RlbVxuIiAgIDoKLSAgICAgICAgICAgICggb3AgPT0gY2ZmX29wX3ZzdGVtICAgPyAiIHZzdGVtXG4iICAgOgotICAgICAgICAgICAgKCBvcCA9PSBjZmZfb3BfaHN0ZW1obSA/ICIgaHN0ZW1obVxuIiA6ICIgdnN0ZW1obVxuIiApICkgKSk7Ci0KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgICBoaW50ZXItPnN0ZW1zKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBvcCA9PSBjZmZfb3BfaHN0ZW0gfHwgb3AgPT0gY2ZmX29wX2hzdGVtaG0gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hcmdzIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgLSAoIG51bV9hcmdzICYgfjEgKSApOwotCi0gICAgICAgICAgZGVjb2Rlci0+bnVtX2hpbnRzICs9IG51bV9hcmdzIC8gMjsKLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaGludG1hc2s6Ci0gICAgICAgIGNhc2UgY2ZmX29wX2NudHJtYXNrOgotICAgICAgICAgIEZUX1RSQUNFNCgoIG9wID09IGNmZl9vcF9oaW50bWFzayA/ICIgaGludG1hc2siIDogIiBjbnRybWFzayIgKSk7Ci0KLSAgICAgICAgICAvKiBpbXBsZW1lbnQgdnN0ZW0gd2hlbiBuZWVkZWQgLS0gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIHRoZSBzcGVjaWZpY2F0aW9uIGRvZXNuJ3Qgc2F5IGl0LCBidXQgdGhpcyBhbHNvIHdvcmtzICovCi0gICAgICAgICAgLyogd2l0aCB0aGUgJ2NudHJtYXNrJyBvcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggbnVtX2FyZ3MgPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgICAgIGhpbnRlci0+c3RlbXMoIGhpbnRlci0+aGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hcmdzIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyAtICggbnVtX2FyZ3MgJiB+MSApICk7Ci0KLSAgICAgICAgICAgIGRlY29kZXItPm51bV9oaW50cyArPSBudW1fYXJncyAvIDI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogSW4gYSB2YWxpZCBjaGFyc3RyaW5nIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGJ5dGUgKi8KLSAgICAgICAgICAvKiBhZnRlciBgaGludG1hc2snIG9yIGBjbnRybWFzaycgKGUuZy4sIGZvciBhIGByZXR1cm4nICAqLwotICAgICAgICAgIC8qIGluc3RydWN0aW9uKS4gIEFkZGl0aW9uYWxseSwgdGhlcmUgbXVzdCBiZSBzcGFjZSBmb3IgICovCi0gICAgICAgICAgLyogYG51bV9oaW50cycgYml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIGlmICggKCBpcCArICggKCBkZWNvZGVyLT5udW1faGludHMgKyA3ICkgPj4gMyApICkgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBvcCA9PSBjZmZfb3BfaGludG1hc2sgKQotICAgICAgICAgICAgICBoaW50ZXItPmhpbnRtYXNrKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpZGVjb2Rlci0+bnVtX2hpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBoaW50ZXItPmNvdW50ZXIoIGhpbnRlci0+aGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpZGVjb2Rlci0+bnVtX2hpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwICk7Ci0gICAgICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50IG1hc2tieXRlOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgKG1hc2tieXRlczoiICkpOwotCi0gICAgICAgICAgICBmb3IgKCBtYXNrYnl0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICBtYXNrYnl0ZSA8IChGVF9VSW50KSggKCBkZWNvZGVyLT5udW1faGludHMgKyA3ICkgPj4gMyApOwotICAgICAgICAgICAgICAgICAgbWFza2J5dGUrKywgaXArKyApCi0gICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgMHglMDJYIiwgKmlwICkpOwotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiKVxuIiApKTsKLSAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgIGlwICs9ICggZGVjb2Rlci0+bnVtX2hpbnRzICsgNyApID4+IDM7Ci0jZW5kaWYKLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfcm1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJtb3ZldG9cbiIgKSk7Ci0KLSAgICAgICAgICBjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBidWlsZGVyICk7Ci0gICAgICAgICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDA7Ci0gICAgICAgICAgeCAgICA9IEFERF9MT05HKCB4LCBhcmdzWy0yXSApOwotICAgICAgICAgIHkgICAgPSBBRERfTE9ORyggeSwgYXJnc1stMV0gKTsKLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfdm1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHZtb3ZldG9cbiIgKSk7Ci0KLSAgICAgICAgICBjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBidWlsZGVyICk7Ci0gICAgICAgICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDA7Ci0gICAgICAgICAgeSAgICA9IEFERF9MT05HKCB5LCBhcmdzWy0xXSApOwotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9obW92ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaG1vdmV0b1xuIiApKTsKLQotICAgICAgICAgIGNmZl9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIGJ1aWxkZXIgKTsKLSAgICAgICAgICBidWlsZGVyLT5wYXRoX2JlZ3VuID0gMDsKLSAgICAgICAgICB4ICAgID0gQUREX0xPTkcoIHgsIGFyZ3NbLTFdICk7Ci0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3JsaW5ldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBybGluZXRvXG4iICkpOwotCi0gICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICB8fAotICAgICAgICAgICAgICAgY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgbnVtX2FyZ3MgLyAyICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgaWYgKCBudW1fYXJncyA8IDIgKQotICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICBhcmdzIC09IG51bV9hcmdzICYgfjE7Ci0gICAgICAgICAgd2hpbGUgKCBhcmdzIDwgZGVjb2Rlci0+dG9wICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMF0gKTsKLSAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1sxXSApOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgICBhcmdzICs9IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9obGluZXRvOgotICAgICAgICBjYXNlIGNmZl9vcF92bGluZXRvOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgcGhhc2UgPSAoIG9wID09IGNmZl9vcF9obGluZXRvICk7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggb3AgPT0gY2ZmX29wX2hsaW5ldG8gPyAiIGhsaW5ldG9cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiB2bGluZXRvXG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzIDwgMCApCi0gICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgICAvKiB0aGVyZSBleGlzdCBzdWJzZXR0ZWQgZm9udHMgKGZvdW5kIGluIFBERnMpICovCi0gICAgICAgICAgICAvKiB3aGljaCBjYWxsIGBobGluZXRvJyB3aXRob3V0IGFyZ3VtZW50cyAgICAgICovCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzID09IDAgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApIHx8Ci0gICAgICAgICAgICAgICAgIGNmZl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIG51bV9hcmdzICkgICAgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1swXSApOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzBdICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9hZGRfcG9pbnQxKCBidWlsZGVyLCB4LCB5ICkgKQotICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICAgIHBoYXNlIF49IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3JyY3VydmV0bzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG5hcmdzOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcnJjdXJ2ZXRvXG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzIDwgNiApCi0gICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgICBuYXJncyA9IG51bV9hcmdzIC0gbnVtX2FyZ3MgJSA2OwotCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgfHwKLSAgICAgICAgICAgICAgICAgY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgbmFyZ3MgLyAyICkgICApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgYXJncyAtPSBuYXJnczsKLSAgICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1swXSApOwotICAgICAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIGFyZ3NbMV0gKTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzJdICk7Ci0gICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1szXSApOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbNF0gKTsKLSAgICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzVdICk7Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICAgIGFyZ3MgKz0gNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfdnZjdXJ2ZXRvOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgbmFyZ3M7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiB2dmN1cnZldG9cbiIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggbnVtX2FyZ3MgPCA0ICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIC8qIGlmIG51bV9hcmdzIGlzbid0IG9mIHRoZSBmb3JtIDRuIG9yIDRuKzEsICovCi0gICAgICAgICAgICAvKiB3ZSBlbmZvcmNlIGl0IGJ5IGNsZWFyaW5nIHRoZSBzZWNvbmQgYml0ICAqLwotCi0gICAgICAgICAgICBuYXJncyA9IG51bV9hcmdzICYgfjI7Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgYXJncyAtPSBuYXJnczsKLQotICAgICAgICAgICAgaWYgKCBuYXJncyAmIDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMF0gKTsKLSAgICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgICBuYXJncy0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGNmZl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIDMgKiAoIG5hcmdzIC8gNCApICkgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1swXSApOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMV0gKTsKLSAgICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzJdICk7Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1szXSApOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLQotICAgICAgICAgICAgICBhcmdzICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2hoY3VydmV0bzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG5hcmdzOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgaGhjdXJ2ZXRvXG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzIDwgNCApCi0gICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgICAvKiBpZiBudW1fYXJncyBpc24ndCBvZiB0aGUgZm9ybSA0biBvciA0bisxLCAqLwotICAgICAgICAgICAgLyogd2UgZW5mb3JjZSBpdCBieSBjbGVhcmluZyB0aGUgc2Vjb25kIGJpdCAgKi8KLQotICAgICAgICAgICAgbmFyZ3MgPSBudW1fYXJncyAmIH4yOwotCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIGFyZ3MgLT0gbmFyZ3M7Ci0gICAgICAgICAgICBpZiAoIG5hcmdzICYgMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1swXSApOwotICAgICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICAgIG5hcmdzLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgMyAqICggbmFyZ3MgLyA0ICkgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgd2hpbGUgKCBhcmdzIDwgZGVjb2Rlci0+dG9wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzBdICk7Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1sxXSApOwotICAgICAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIGFyZ3NbMl0gKTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzNdICk7Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICAgIGFyZ3MgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfdmhjdXJ2ZXRvOgotICAgICAgICBjYXNlIGNmZl9vcF9odmN1cnZldG86Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBwaGFzZTsKLSAgICAgICAgICAgIEZUX0ludCAgbmFyZ3M7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggb3AgPT0gY2ZmX29wX3ZoY3VydmV0byA/ICIgdmhjdXJ2ZXRvXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBodmN1cnZldG9cbiIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgaWYgKCBudW1fYXJncyA8IDQgKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgLyogaWYgbnVtX2FyZ3MgaXNuJ3Qgb2YgdGhlIGZvcm0gOG4sIDhuKzEsIDhuKzQsIG9yIDhuKzUsICovCi0gICAgICAgICAgICAvKiB3ZSBlbmZvcmNlIGl0IGJ5IGNsZWFyaW5nIHRoZSBzZWNvbmQgYml0ICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgbmFyZ3MgPSBudW1fYXJncyAmIH4yOwotCi0gICAgICAgICAgICBhcmdzIC09IG5hcmdzOwotICAgICAgICAgICAgaWYgKCBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAoIG5hcmdzIC8gNCApICogMyApICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIHBoYXNlID0gKCBvcCA9PSBjZmZfb3BfaHZjdXJ2ZXRvICk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggbmFyZ3MgPj0gNCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hcmdzIC09IDQ7Ci0gICAgICAgICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzBdICk7Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMV0gKTsKLSAgICAgICAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIGFyZ3NbMl0gKTsKLSAgICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1szXSApOwotICAgICAgICAgICAgICAgIGlmICggbmFyZ3MgPT0gMSApCi0gICAgICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbNF0gKTsKLSAgICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIGFyZ3NbMF0gKTsKLSAgICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1sxXSApOwotICAgICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1syXSApOwotICAgICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzNdICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBuYXJncyA9PSAxICkKLSAgICAgICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1s0XSApOwotICAgICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGFyZ3MgICs9IDQ7Ci0gICAgICAgICAgICAgIHBoYXNlIF49IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3JsaW5lY3VydmU6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBudW1fbGluZXM7Ci0gICAgICAgICAgICBGVF9JbnQgIG5hcmdzOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmxpbmVjdXJ2ZVxuIiApKTsKLQotICAgICAgICAgICAgaWYgKCBudW1fYXJncyA8IDggKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgbmFyZ3MgICAgID0gbnVtX2FyZ3MgJiB+MTsKLSAgICAgICAgICAgIG51bV9saW5lcyA9ICggbmFyZ3MgLSA2ICkgLyAyOwotCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgICB8fAotICAgICAgICAgICAgICAgICBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCBudW1fbGluZXMgKyAzICkgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIGFyZ3MgLT0gbmFyZ3M7Ci0KLSAgICAgICAgICAgIC8qIGZpcnN0LCBhZGQgdGhlIGxpbmUgc2VnbWVudHMgKi8KLSAgICAgICAgICAgIHdoaWxlICggbnVtX2xpbmVzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1swXSApOwotICAgICAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIGFyZ3NbMV0gKTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgICAgYXJncyArPSAyOwotICAgICAgICAgICAgICBudW1fbGluZXMtLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogdGhlbiB0aGUgY3VydmUgKi8KLSAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1swXSApOwotICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzFdICk7Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzJdICk7Ci0gICAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIGFyZ3NbM10gKTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbNF0gKTsKLSAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1s1XSApOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcmN1cnZlbGluZToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG51bV9jdXJ2ZXM7Ci0gICAgICAgICAgICBGVF9JbnQgIG5hcmdzOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmN1cnZlbGluZVxuIiApKTsKLQotICAgICAgICAgICAgaWYgKCBudW1fYXJncyA8IDggKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgbmFyZ3MgICAgICA9IG51bV9hcmdzIC0gMjsKLSAgICAgICAgICAgIG5hcmdzICAgICAgPSBuYXJncyAtIG5hcmdzICUgNiArIDI7Ci0gICAgICAgICAgICBudW1fY3VydmVzID0gKCBuYXJncyAtIDIgKSAvIDY7Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgbnVtX2N1cnZlcyAqIDMgKyAyICkgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIGFyZ3MgLT0gbmFyZ3M7Ci0KLSAgICAgICAgICAgIC8qIGZpcnN0LCBhZGQgdGhlIGN1cnZlcyAqLwotICAgICAgICAgICAgd2hpbGUgKCBudW1fY3VydmVzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1swXSApOwotICAgICAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIGFyZ3NbMV0gKTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzJdICk7Ci0gICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1szXSApOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbNF0gKTsKLSAgICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzVdICk7Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICAgIGFyZ3MgKz0gNjsKLSAgICAgICAgICAgICAgbnVtX2N1cnZlcy0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB0aGVuIHRoZSBmaW5hbCBsaW5lICovCi0gICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMF0gKTsKLSAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1sxXSApOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaGZsZXgxOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyBzdGFydF95OwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgaGZsZXgxXG4iICkpOwotCi0gICAgICAgICAgICAvKiBhZGRpbmcgZml2ZSBtb3JlIHBvaW50czogNCBjb250cm9sIHBvaW50cywgMSBvbi1jdXJ2ZSBwb2ludCAqLwotICAgICAgICAgICAgLyogLS0gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgc3RhcnQgcG9pbnQgaWYgaXQgKi8KLSAgICAgICAgICAgIC8qIG5lZWRzIHRvIGJlIGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgfHwKLSAgICAgICAgICAgICAgICAgY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgNiApICAgICAgICAgICApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgLyogcmVjb3JkIHRoZSBzdGFydGluZyBwb2ludCdzIHkgcG9zaXRpb24gZm9yIGxhdGVyIHVzZSAqLwotICAgICAgICAgICAgc3RhcnRfeSA9IHk7Ci0KLSAgICAgICAgICAgIC8qIGZpcnN0IGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1swXSApOwotICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzFdICk7Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogc2Vjb25kIGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1syXSApOwotICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzNdICk7Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogam9pbiBwb2ludDsgb24gY3VydmUsIHdpdGggeS12YWx1ZSB0aGUgc2FtZSBhcyB0aGUgbGFzdCAqLwotICAgICAgICAgICAgLyogY29udHJvbCBwb2ludCdzIHktdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzRdICk7Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLQotICAgICAgICAgICAgLyogdGhpcmQgY29udHJvbCBwb2ludCwgd2l0aCB5LXZhbHVlIHRoZSBzYW1lIGFzIHRoZSBqb2luICovCi0gICAgICAgICAgICAvKiBwb2ludCdzIHktdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1s1XSApOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgIC8qIGZvdXJ0aCBjb250cm9sIHBvaW50ICovCi0gICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbNl0gKTsKLSAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1s3XSApOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgIC8qIGVuZGluZyBwb2ludCwgd2l0aCB5LXZhbHVlIHRoZSBzYW1lIGFzIHRoZSBzdGFydCAgICovCi0gICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbOF0gKTsKLSAgICAgICAgICAgIHkgPSBzdGFydF95OwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIGNmZl9vcF9oZmxleDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3Mgc3RhcnRfeTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhmbGV4XG4iICkpOwotCi0gICAgICAgICAgICAvKiBhZGRpbmcgc2l4IG1vcmUgcG9pbnRzOyA0IGNvbnRyb2wgcG9pbnRzLCAyIG9uLWN1cnZlIHBvaW50cyAqLwotICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApIHx8Ci0gICAgICAgICAgICAgICAgIGNmZl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIDYgKSAgICAgICAgICAgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIC8qIHJlY29yZCB0aGUgc3RhcnRpbmcgcG9pbnQncyB5LXBvc2l0aW9uIGZvciBsYXRlciB1c2UgKi8KLSAgICAgICAgICAgIHN0YXJ0X3kgPSB5OwotCi0gICAgICAgICAgICAvKiBmaXJzdCBjb250cm9sIHBvaW50ICovCi0gICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMF0gKTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAvKiBzZWNvbmQgY29udHJvbCBwb2ludCAqLwotICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzFdICk7Ci0gICAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIGFyZ3NbMl0gKTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAvKiBqb2luIHBvaW50OyBvbiBjdXJ2ZSwgd2l0aCB5LXZhbHVlIHRoZSBzYW1lIGFzIHRoZSBsYXN0ICovCi0gICAgICAgICAgICAvKiBjb250cm9sIHBvaW50J3MgeS12YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbM10gKTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICAvKiB0aGlyZCBjb250cm9sIHBvaW50LCB3aXRoIHktdmFsdWUgdGhlIHNhbWUgYXMgdGhlIGpvaW4gKi8KLSAgICAgICAgICAgIC8qIHBvaW50J3MgeS12YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzRdICk7Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogZm91cnRoIGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgYXJnc1s1XSApOwotICAgICAgICAgICAgeSA9IHN0YXJ0X3k7Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogZW5kaW5nIHBvaW50LCB3aXRoIHktdmFsdWUgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IHBvaW50J3MgKi8KLSAgICAgICAgICAgIC8qIHktdmFsdWUgLS0gd2UgZG9uJ3QgYWRkIHRoaXMgcG9pbnQsIHRob3VnaCAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbNl0gKTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZmxleDE6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICAgICBzdGFydF94LCBzdGFydF95OyAvKiByZWNvcmQgc3RhcnQgeCwgeSB2YWx1ZXMgZm9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsdGVyIHVzZSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZUX0ZpeGVkICAgZHggPSAwLCBkeSA9IDA7ICAgLyogdXNlZCBpbiBob3Jpem9udGFsL3ZlcnRpY2FsICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGdvcml0aG0gYmVsb3cgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGVF9JbnQgICAgIGhvcml6b250YWwsIGNvdW50OwotICAgICAgICAgICAgRlRfRml4ZWQqICB0ZW1wOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZmxleDFcbiIgKSk7Ci0KLSAgICAgICAgICAgIC8qIGFkZGluZyBzaXggbW9yZSBwb2ludHM7IDQgY29udHJvbCBwb2ludHMsIDIgb24tY3VydmUgcG9pbnRzICovCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgfHwKLSAgICAgICAgICAgICAgICAgY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgNiApICAgICAgICAgICApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgLyogcmVjb3JkIHRoZSBzdGFydGluZyBwb2ludCdzIHgsIHkgcG9zaXRpb24gZm9yIGxhdGVyIHVzZSAqLwotICAgICAgICAgICAgc3RhcnRfeCA9IHg7Ci0gICAgICAgICAgICBzdGFydF95ID0geTsKLQotICAgICAgICAgICAgLyogWFhYOiBmaWd1cmUgb3V0IHdoZXRoZXIgdGhpcyBpcyBzdXBwb3NlZCB0byBiZSBhIGhvcml6b250YWwgKi8KLSAgICAgICAgICAgIC8qICAgICAgb3IgdmVydGljYWwgZmxleDsgdGhlIFR5cGUgMiBzcGVjaWZpY2F0aW9uIGlzIHZhZ3VlLi4uICovCi0KLSAgICAgICAgICAgIHRlbXAgPSBhcmdzOwotCi0gICAgICAgICAgICAvKiBncmFiIHVwIHRvIHRoZSBsYXN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICBmb3IgKCBjb3VudCA9IDU7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGR4ICAgID0gQUREX0xPTkcoIGR4LCB0ZW1wWzBdICk7Ci0gICAgICAgICAgICAgIGR5ICAgID0gQUREX0xPTkcoIGR5LCB0ZW1wWzFdICk7Ci0gICAgICAgICAgICAgIHRlbXAgKz0gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBkeCA8IDAgKQotICAgICAgICAgICAgICBkeCA9IC1keDsKLSAgICAgICAgICAgIGlmICggZHkgPCAwICkKLSAgICAgICAgICAgICAgZHkgPSAtZHk7Ci0KLSAgICAgICAgICAgIC8qIHN0cmFuZ2UgdGVzdCwgYnV0IGhlcmUgaXQgaXMuLi4gKi8KLSAgICAgICAgICAgIGhvcml6b250YWwgPSAoIGR4ID4gZHkgKTsKLQotICAgICAgICAgICAgZm9yICggY291bnQgPSA1OyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMF0gKTsKLSAgICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzFdICk7Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQm9vbCkoIGNvdW50ID09IDMgKSApOwotICAgICAgICAgICAgICBhcmdzICs9IDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGlzIGxhc3Qgb3BlcmFuZCBhbiB4LSBvciB5LWRlbHRhPyAqLwotICAgICAgICAgICAgaWYgKCBob3Jpem9udGFsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzBdICk7Ci0gICAgICAgICAgICAgIHkgPSBzdGFydF95OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4ID0gc3RhcnRfeDsKLSAgICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzBdICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgY2ZmX29wX2ZsZXg6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgY291bnQ7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBmbGV4XG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgfHwKLSAgICAgICAgICAgICAgICAgY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgNiApICAgICAgICAgICApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgZm9yICggY291bnQgPSA2OyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMF0gKTsKLSAgICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzFdICk7Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQm9vbCkoIGNvdW50ID09IDQgfHwgY291bnQgPT0gMSApICk7Ci0gICAgICAgICAgICAgIGFyZ3MgKz0gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9zZWFjOgotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBzZWFjXG4iICkpOwotCi0gICAgICAgICAgICBlcnJvciA9IGNmZl9vcGVyYXRvcl9zZWFjKCBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpKCBhcmdzWzNdID4+IDE2ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KSggYXJnc1s0XSA+PiAxNiApICk7Ci0KLSAgICAgICAgICAgIC8qIGFkZCBjdXJyZW50IG91dGxpbmUgdG8gdGhlIGdseXBoIHNsb3QgKi8KLSAgICAgICAgICAgIEZUX0dseXBoTG9hZGVyX0FkZCggYnVpbGRlci0+bG9hZGVyICk7Ci0KLSAgICAgICAgICAgIC8qIHJldHVybiBub3chICovCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2VuZGNoYXI6Ci0gICAgICAgICAgLyogaW4gZGljdGlvbmFyaWVzLCBgZW5kY2hhcicgc2ltcGx5IGluZGljYXRlcyBlbmQgb2YgZGF0YSAqLwotICAgICAgICAgIGlmICggaW5fZGljdCApCi0gICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGVuZGNoYXJcbiIgKSk7Ci0KLSAgICAgICAgICAvKiBXZSBhcmUgZ29pbmcgdG8gZW11bGF0ZSB0aGUgc2VhYyBvcGVyYXRvci4gKi8KLSAgICAgICAgICBpZiAoIG51bV9hcmdzID49IDQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNhdmUgZ2x5cGggd2lkdGggc28gdGhhdCB0aGUgc3ViZ2x5cGhzIGRvbid0IG92ZXJ3cml0ZSBpdC4gKi8KLSAgICAgICAgICAgIEZUX1BvcyAgZ2x5cGhfd2lkdGggPSBkZWNvZGVyLT5nbHlwaF93aWR0aDsKLQotCi0gICAgICAgICAgICBlcnJvciA9IGNmZl9vcGVyYXRvcl9zZWFjKCBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwsIGFyZ3NbLTRdLCBhcmdzWy0zXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpKCBhcmdzWy0yXSA+PiAxNiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludCkoIGFyZ3NbLTFdID4+IDE2ICkgKTsKLQotICAgICAgICAgICAgZGVjb2Rlci0+Z2x5cGhfd2lkdGggPSBnbHlwaF93aWR0aDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIGJ1aWxkZXIgKTsKLQotICAgICAgICAgICAgLyogY2xvc2UgaGludHMgcmVjb3JkaW5nIHNlc3Npb24gKi8KLSAgICAgICAgICAgIGlmICggaGludGVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCBoaW50ZXItPmNsb3NlKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWJ1aWxkZXItPmN1cnJlbnQtPm5fcG9pbnRzICkgKQotICAgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotCi0gICAgICAgICAgICAgIC8qIGFwcGx5IGhpbnRzIHRvIHRoZSBsb2FkZWQgZ2x5cGggb3V0bGluZSBub3cgKi8KLSAgICAgICAgICAgICAgZXJyb3IgPSBoaW50ZXItPmFwcGx5KCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXItPmN1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTSF9HbG9iYWxzKWJ1aWxkZXItPmhpbnRzX2dsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+aGludF9tb2RlICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogYWRkIGN1cnJlbnQgb3V0bGluZSB0byB0aGUgZ2x5cGggc2xvdCAqLwotICAgICAgICAgICAgRlRfR2x5cGhMb2FkZXJfQWRkKCBidWlsZGVyLT5sb2FkZXIgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiByZXR1cm4gbm93ISAqLwotICAgICAgICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0gICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2FiczoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGFic1xuIiApKTsKLQotICAgICAgICAgIGlmICggYXJnc1swXSA8IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggYXJnc1swXSA9PSBGVF9MT05HX01JTiApCi0gICAgICAgICAgICAgIGFyZ3NbMF0gPSBGVF9MT05HX01BWDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgYXJnc1swXSA9IC1hcmdzWzBdOwotICAgICAgICAgIH0KLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfYWRkOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgYWRkXG4iICkpOwotCi0gICAgICAgICAgYXJnc1swXSA9IEFERF9MT05HKCBhcmdzWzBdLCBhcmdzWzFdICk7Ci0gICAgICAgICAgYXJncysrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3N1YjoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHN1YlxuIiApKTsKLQotICAgICAgICAgIGFyZ3NbMF0gPSBTVUJfTE9ORyggYXJnc1swXSwgYXJnc1sxXSApOwotICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9kaXY6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBkaXZcbiIgKSk7Ci0KLSAgICAgICAgICBhcmdzWzBdID0gRlRfRGl2Rml4KCBhcmdzWzBdLCBhcmdzWzFdICk7Ci0gICAgICAgICAgYXJncysrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX25lZzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIG5lZ1xuIiApKTsKLQotICAgICAgICAgIGlmICggYXJnc1swXSA9PSBGVF9MT05HX01JTiApCi0gICAgICAgICAgICBhcmdzWzBdID0gRlRfTE9OR19NQVg7Ci0gICAgICAgICAgYXJnc1swXSA9IC1hcmdzWzBdOwotICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9yYW5kb206Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiByYW5kb21cbiIgKSk7Ci0KLSAgICAgICAgICAvKiBvbmx5IHVzZSB0aGUgbG93ZXIgMTYgYml0cyBvZiBgcmFuZG9tJyAgKi8KLSAgICAgICAgICAvKiB0byBnZW5lcmF0ZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgKDA7MV0gKi8KLSAgICAgICAgICBhcmdzWzBdID0gKEZUX0ZpeGVkKQotICAgICAgICAgICAgICAgICAgICAgICggKCBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnJhbmRvbSAmIDB4RkZGRiApICsgMSApOwotICAgICAgICAgIGFyZ3MrKzsKLQotICAgICAgICAgIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cmFuZG9tID0KLSAgICAgICAgICAgIGNmZl9yYW5kb20oIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cmFuZG9tICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfbXVsOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgbXVsXG4iICkpOwotCi0gICAgICAgICAgYXJnc1swXSA9IEZUX011bEZpeCggYXJnc1swXSwgYXJnc1sxXSApOwotICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9zcXJ0OgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgc3FydFxuIiApKTsKLQotICAgICAgICAgIGlmICggYXJnc1swXSA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ZpeGVkICByb290ID0gYXJnc1swXTsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBuZXdfcm9vdDsKLQotCi0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXdfcm9vdCA9ICggcm9vdCArIEZUX0RpdkZpeCggYXJnc1swXSwgcm9vdCApICsgMSApID4+IDE7Ci0gICAgICAgICAgICAgIGlmICggbmV3X3Jvb3QgPT0gcm9vdCApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIHJvb3QgPSBuZXdfcm9vdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3NbMF0gPSBuZXdfcm9vdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXJnc1swXSA9IDA7Ci0gICAgICAgICAgYXJncysrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2Ryb3A6Ci0gICAgICAgICAgLyogbm90aGluZyAqLwotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZHJvcFxuIiApKTsKLQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2V4Y2g6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIHRtcDsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGV4Y2hcbiIgKSk7Ci0KLSAgICAgICAgICAgIHRtcCAgICAgPSBhcmdzWzBdOwotICAgICAgICAgICAgYXJnc1swXSA9IGFyZ3NbMV07Ci0gICAgICAgICAgICBhcmdzWzFdID0gdG1wOwotICAgICAgICAgICAgYXJncyAgICs9IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2luZGV4OgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgaWR4ID0gKEZUX0ludCkoIGFyZ3NbMF0gPj4gMTYgKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGluZGV4XG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIGlkeCA8IDAgKQotICAgICAgICAgICAgICBpZHggPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAoIGlkeCA+IG51bV9hcmdzIC0gMiApCi0gICAgICAgICAgICAgIGlkeCA9IG51bV9hcmdzIC0gMjsKLSAgICAgICAgICAgIGFyZ3NbMF0gPSBhcmdzWy0oIGlkeCArIDEgKV07Ci0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3JvbGw6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBjb3VudCA9IChGVF9JbnQpKCBhcmdzWzBdID4+IDE2ICk7Ci0gICAgICAgICAgICBGVF9JbnQgIGlkeCAgID0gKEZUX0ludCkoIGFyZ3NbMV0gPj4gMTYgKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJvbGxcbiIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggY291bnQgPD0gMCApCi0gICAgICAgICAgICAgIGNvdW50ID0gMTsKLQotICAgICAgICAgICAgYXJncyAtPSBjb3VudDsKLSAgICAgICAgICAgIGlmICggYXJncyA8IHN0YWNrICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIGlmICggaWR4ID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB3aGlsZSAoIGlkeCA+IDAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlRfRml4ZWQgIHRtcCA9IGFyZ3NbY291bnQgLSAxXTsKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgaTsKLQotCi0gICAgICAgICAgICAgICAgZm9yICggaSA9IGNvdW50IC0gMjsgaSA+PSAwOyBpLS0gKQotICAgICAgICAgICAgICAgICAgYXJnc1tpICsgMV0gPSBhcmdzW2ldOwotICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgaWR4LS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgd2hpbGUgKCBpZHggPCAwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZUX0ZpeGVkICB0bXAgPSBhcmdzWzBdOwotICAgICAgICAgICAgICAgIEZUX0ludCAgICBpOwotCi0KLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGNvdW50IC0gMTsgaSsrICkKLSAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmdzW2kgKyAxXTsKLSAgICAgICAgICAgICAgICBhcmdzW2NvdW50IC0gMV0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MgKz0gY291bnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2R1cDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGR1cFxuIiApKTsKLQotICAgICAgICAgIGFyZ3NbMV0gPSBhcmdzWzBdOwotICAgICAgICAgIGFyZ3MgKz0gMjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9wdXQ6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIHZhbCA9IGFyZ3NbMF07Ci0gICAgICAgICAgICBGVF9JbnQgICAgaWR4ID0gKEZUX0ludCkoIGFyZ3NbMV0gPj4gMTYgKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHB1dFxuIiApKTsKLQotICAgICAgICAgICAgLyogdGhlIFR5cGUyIHNwZWNpZmljYXRpb24gYmVmb3JlIHZlcnNpb24gMTYtTWFyY2gtMjAwMCAqLwotICAgICAgICAgICAgLyogZGlkbid0IGdpdmUgYSBoYXJkLWNvZGVkIHNpemUgbGltaXQgb2YgdGhlIHRlbXBvcmFyeSAqLwotICAgICAgICAgICAgLyogc3RvcmFnZSBhcnJheTsgaW5zdGVhZCwgYW4gYXJndW1lbnQgb2YgdGhlICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogYE11bHRpcGxlTWFzdGVyJyBvcGVyYXRvciBzZXQgdGhlIHNpemUgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBpZHggPj0gMCAmJiBpZHggPCBDRkZfTUFYX1RSQU5TX0VMRU1FTlRTICkKLSAgICAgICAgICAgICAgZGVjb2Rlci0+YnVpbGRjaGFyW2lkeF0gPSB2YWw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2dldDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgICAgaWR4ID0gKEZUX0ludCkoIGFyZ3NbMF0gPj4gMTYgKTsKLSAgICAgICAgICAgIEZUX0ZpeGVkICB2YWwgPSAwOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZ2V0XG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIGlkeCA+PSAwICYmIGlkeCA8IENGRl9NQVhfVFJBTlNfRUxFTUVOVFMgKQotICAgICAgICAgICAgICB2YWwgPSBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XTsKLQotICAgICAgICAgICAgYXJnc1swXSA9IHZhbDsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfc3RvcmU6Ci0gICAgICAgICAgLyogdGhpcyBvcGVyYXRvciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBUeXBlMiBzcGVjaWZpY2F0aW9uICovCi0gICAgICAgICAgLyogaW4gdmVyc2lvbiAxNi1NYXJjaC0yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAvKiBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3QgaGFuZGxlIGludGVycG9sYXRpb24gb2YgbXVsdGlwbGUgKi8KLSAgICAgICAgICAvKiBtYXN0ZXIgZm9udHMsIHRoaXMgaXMgYSBuby1vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHN0b3JlXG4iKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfbG9hZDoKLSAgICAgICAgICAvKiB0aGlzIG9wZXJhdG9yIHdhcyByZW1vdmVkIGZyb20gdGhlIFR5cGUyIHNwZWNpZmljYXRpb24gKi8KLSAgICAgICAgICAvKiBpbiB2ZXJzaW9uIDE2LU1hcmNoLTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIHJlZ19pZHggPSAoRlRfSW50KWFyZ3NbMF07Ci0gICAgICAgICAgICBGVF9JbnQgIGlkeCAgICAgPSAoRlRfSW50KWFyZ3NbMV07Ci0gICAgICAgICAgICBGVF9JbnQgIGNvdW50ICAgPSAoRlRfSW50KWFyZ3NbMl07Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBsb2FkXG4iICkpOwotCi0gICAgICAgICAgICAvKiBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3QgaGFuZGxlIGludGVycG9sYXRpb24gb2YgbXVsdGlwbGUgKi8KLSAgICAgICAgICAgIC8qIG1hc3RlciBmb250cywgd2Ugc3RvcmUgYSB2ZWN0b3IgWzEgMCAwIC4uLl0gaW4gdGhlICAgICAgICAqLwotICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgYXJyYXkgcmVnYXJkbGVzcyBvZiB0aGUgUmVnaXN0cnkgaW5kZXggICovCi0gICAgICAgICAgICBpZiAoIHJlZ19pZHggPj0gMCAmJiByZWdfaWR4IDw9IDIgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgaWR4ID49IDAgJiYgaWR4IDwgQ0ZGX01BWF9UUkFOU19FTEVNRU5UUyAmJgotICAgICAgICAgICAgICAgICBjb3VudCA+PSAwICYmIGNvdW50IDw9IG51bV9heGVzICAgICAgICAgICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfSW50ICBlbmQsIGk7Ci0KLQotICAgICAgICAgICAgICBlbmQgPSBGVF9NSU4oIGlkeCArIGNvdW50LCBDRkZfTUFYX1RSQU5TX0VMRU1FTlRTICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBpZHggPCBlbmQgKQotICAgICAgICAgICAgICAgIGRlY29kZXItPmJ1aWxkY2hhcltpZHhdID0gMSA8PCAxNjsKLQotICAgICAgICAgICAgICBmb3IgKCBpID0gaWR4ICsgMTsgaSA8IGVuZDsgaSsrICkKLSAgICAgICAgICAgICAgICBkZWNvZGVyLT5idWlsZGNoYXJbaV0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9ibGVuZDoKLSAgICAgICAgICAvKiB0aGlzIG9wZXJhdG9yIHdhcyByZW1vdmVkIGZyb20gdGhlIFR5cGUyIHNwZWNpZmljYXRpb24gKi8KLSAgICAgICAgICAvKiBpbiB2ZXJzaW9uIDE2LU1hcmNoLTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG51bV9yZXN1bHRzID0gKEZUX0ludCkoIGFyZ3NbMF0gPj4gMTYgKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGJsZW5kXG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIG51bV9yZXN1bHRzIDwgMCApCi0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotCi0gICAgICAgICAgICBpZiAoIG51bV9yZXN1bHRzICogKEZUX0ludCludW1fZGVzaWducyA+IG51bV9hcmdzICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIC8qIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgaW50ZXJwb2xhdGlvbiBvZiBtdWx0aXBsZSAqLwotICAgICAgICAgICAgLyogbWFzdGVyIGZvbnRzLCByZXR1cm4gdGhlIGBudW1fcmVzdWx0cycgdmFsdWVzIG9mIHRoZSAgICAgICovCi0gICAgICAgICAgICAvKiBmaXJzdCBtYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGFyZ3MgICAgIC09IG51bV9yZXN1bHRzICogKCBudW1fZGVzaWducyAtIDEgKTsKLSAgICAgICAgICAgIG51bV9hcmdzIC09IG51bV9yZXN1bHRzICogKCBudW1fZGVzaWducyAtIDEgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZG90c2VjdGlvbjoKLSAgICAgICAgICAvKiB0aGlzIG9wZXJhdG9yIGlzIGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQgYnkgdGhlIHBhcnNlciAqLwotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZG90c2VjdGlvblxuIiApKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9jbG9zZXBhdGg6Ci0gICAgICAgICAgLyogdGhpcyBpcyBhbiBpbnZhbGlkIFR5cGUgMiBvcGVyYXRvcjsgaG93ZXZlciwgdGhlcmUgICAgICAgICovCi0gICAgICAgICAgLyogZXhpc3QgZm9udHMgd2hpY2ggYXJlIGluY29ycmVjdGx5IGNvbnZlcnRlZCBmcm9tIHByb2JhYmx5ICovCi0gICAgICAgICAgLyogVHlwZSAxIHRvIENGRiwgYW5kIHNvbWUgcGFyc2VycyBzZWVtIHRvIGFjY2VwdCBpdCAgICAgICAgICovCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNsb3NlcGF0aCAoaW52YWxpZCBvcClcbiIgKSk7Ci0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaHNidzoKLSAgICAgICAgICAvKiB0aGlzIGlzIGFuIGludmFsaWQgVHlwZSAyIG9wZXJhdG9yOyBob3dldmVyLCB0aGVyZSAgICAgICAgKi8KLSAgICAgICAgICAvKiBleGlzdCBmb250cyB3aGljaCBhcmUgaW5jb3JyZWN0bHkgY29udmVydGVkIGZyb20gcHJvYmFibHkgKi8KLSAgICAgICAgICAvKiBUeXBlIDEgdG8gQ0ZGLCBhbmQgc29tZSBwYXJzZXJzIHNlZW0gdG8gYWNjZXB0IGl0ICAgICAgICAgKi8KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaHNidyAoaW52YWxpZCBvcClcbiIgKSk7Ci0KLSAgICAgICAgICBkZWNvZGVyLT5nbHlwaF93aWR0aCA9Ci0gICAgICAgICAgICBBRERfTE9ORyggZGVjb2Rlci0+bm9taW5hbF93aWR0aCwgKCBhcmdzWzFdID4+IDE2ICkgKTsKLQotICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnggPSBhcmdzWzBdOwotICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnkgPSAwOwotCi0gICAgICAgICAgeCAgICA9IEFERF9MT05HKCBkZWNvZGVyLT5idWlsZGVyLnBvc194LCBhcmdzWzBdICk7Ci0gICAgICAgICAgeSAgICA9IGRlY29kZXItPmJ1aWxkZXIucG9zX3k7Ci0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3NidzoKLSAgICAgICAgICAvKiB0aGlzIGlzIGFuIGludmFsaWQgVHlwZSAyIG9wZXJhdG9yOyBob3dldmVyLCB0aGVyZSAgICAgICAgKi8KLSAgICAgICAgICAvKiBleGlzdCBmb250cyB3aGljaCBhcmUgaW5jb3JyZWN0bHkgY29udmVydGVkIGZyb20gcHJvYmFibHkgKi8KLSAgICAgICAgICAvKiBUeXBlIDEgdG8gQ0ZGLCBhbmQgc29tZSBwYXJzZXJzIHNlZW0gdG8gYWNjZXB0IGl0ICAgICAgICAgKi8KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgc2J3IChpbnZhbGlkIG9wKVxuIiApKTsKLQotICAgICAgICAgIGRlY29kZXItPmdseXBoX3dpZHRoID0KLSAgICAgICAgICAgIEFERF9MT05HKCBkZWNvZGVyLT5ub21pbmFsX3dpZHRoLCAoIGFyZ3NbMl0gPj4gMTYgKSApOwotCi0gICAgICAgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IGFyZ3NbMF07Ci0gICAgICAgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueSA9IGFyZ3NbMV07Ci0KLSAgICAgICAgICB4ICAgID0gQUREX0xPTkcoIGRlY29kZXItPmJ1aWxkZXIucG9zX3gsIGFyZ3NbMF0gKTsKLSAgICAgICAgICB5ICAgID0gQUREX0xPTkcoIGRlY29kZXItPmJ1aWxkZXIucG9zX3ksIGFyZ3NbMV0gKTsKLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfc2V0Y3VycmVudHBvaW50OgotICAgICAgICAgIC8qIHRoaXMgaXMgYW4gaW52YWxpZCBUeXBlIDIgb3BlcmF0b3I7IGhvd2V2ZXIsIHRoZXJlICAgICAgICAqLwotICAgICAgICAgIC8qIGV4aXN0IGZvbnRzIHdoaWNoIGFyZSBpbmNvcnJlY3RseSBjb252ZXJ0ZWQgZnJvbSBwcm9iYWJseSAqLwotICAgICAgICAgIC8qIFR5cGUgMSB0byBDRkYsIGFuZCBzb21lIHBhcnNlcnMgc2VlbSB0byBhY2NlcHQgaXQgICAgICAgICAqLwotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBzZXRjdXJyZW50cG9pbnQgKGludmFsaWQgb3ApXG4iICkpOwotCi0gICAgICAgICAgeCAgICA9IEFERF9MT05HKCBkZWNvZGVyLT5idWlsZGVyLnBvc194LCBhcmdzWzBdICk7Ci0gICAgICAgICAgeSAgICA9IEFERF9MT05HKCBkZWNvZGVyLT5idWlsZGVyLnBvc195LCBhcmdzWzFdICk7Ci0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2NhbGxvdGhlcnN1YnI6Ci0gICAgICAgICAgLyogdGhpcyBpcyBhbiBpbnZhbGlkIFR5cGUgMiBvcGVyYXRvcjsgaG93ZXZlciwgdGhlcmUgICAgICAgICovCi0gICAgICAgICAgLyogZXhpc3QgZm9udHMgd2hpY2ggYXJlIGluY29ycmVjdGx5IGNvbnZlcnRlZCBmcm9tIHByb2JhYmx5ICovCi0gICAgICAgICAgLyogVHlwZSAxIHRvIENGRiwgYW5kIHNvbWUgcGFyc2VycyBzZWVtIHRvIGFjY2VwdCBpdCAgICAgICAgICovCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNhbGxvdGhlcnN1YnIgKGludmFsaWQgb3ApXG4iICkpOwotCi0gICAgICAgICAgLyogc3Vic2VxdWVudCBgcG9wJyBvcGVyYW5kcyBzaG91bGQgYWRkIHRoZSBhcmd1bWVudHMsICAgICAgICovCi0gICAgICAgICAgLyogdGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGZvciBgdW5rbm93bicgb3RoZXIgICovCi0gICAgICAgICAgLyogc3Vicm91dGluZXMgaW4gdGhlIFR5cGUxIHNwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogWFhYIEZpeCByZXR1cm4gYXJndW1lbnRzIChzZWUgZGlzY3Vzc2lvbiBiZWxvdykuICAgICAgICAgICovCi0gICAgICAgICAgYXJncyAtPSAyICsgKCBhcmdzWy0yXSA+PiAxNiApOwotICAgICAgICAgIGlmICggYXJncyA8IHN0YWNrICkKLSAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3BvcDoKLSAgICAgICAgICAvKiB0aGlzIGlzIGFuIGludmFsaWQgVHlwZSAyIG9wZXJhdG9yOyBob3dldmVyLCB0aGVyZSAgICAgICAgKi8KLSAgICAgICAgICAvKiBleGlzdCBmb250cyB3aGljaCBhcmUgaW5jb3JyZWN0bHkgY29udmVydGVkIGZyb20gcHJvYmFibHkgKi8KLSAgICAgICAgICAvKiBUeXBlIDEgdG8gQ0ZGLCBhbmQgc29tZSBwYXJzZXJzIHNlZW0gdG8gYWNjZXB0IGl0ICAgICAgICAgKi8KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcG9wIChpbnZhbGlkIG9wKVxuIiApKTsKLQotICAgICAgICAgIC8qIFhYWCBJbmNyZWFzaW5nIGBhcmdzJyBpcyB3cm9uZzogQWZ0ZXIgYSBjZXJ0YWluIG51bWJlciBvZiAqLwotICAgICAgICAgIC8qIGBwb3AncyB3ZSBnZXQgYSBzdGFjayBvdmVyZmxvdy4gIFJlYXNvbiBmb3IgZG9pbmcgaXQgaXMgICAqLwotICAgICAgICAgIC8qIGNvZGUgbGlrZSB0aGlzIChhY3R1YWxseSBmb3VuZCBpbiBhIENGRiBmb250KTogICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgMTcgMSAzIGNhbGxvdGhlcnN1YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgY2FsbHN1YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFNpbmNlIHdlIGhhbmRsZSBgY2FsbG90aGVyc3VicicgYXMgYSBuby1vcCwgYW5kICAgICAgICAgICAqLwotICAgICAgICAgIC8qIGBjYWxsc3VicicgbmVlZHMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LCBgcG9wJyBjYW4ndCBiZSBhICAqLwotICAgICAgICAgIC8qIG5vLW9wIHRvbyBhcyBpdCBiYXNpY2FsbHkgc2hvdWxkIGJlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFRoZSByaWdodCBzb2x1dGlvbiB3b3VsZCBiZSB0byBwcm92aWRlIHJlYWwgc3VwcG9ydCBmb3IgICAqLwotICAgICAgICAgIC8qIGBjYWxsb3RoZXJzdWJyJyBhcyBkb25lIGluIGB0MWRlY29kZS5jJywgaG93ZXZlciwgZ2l2ZW4gICAqLwotICAgICAgICAgIC8qIHRoZSBmYWN0IHRoYXQgQ0ZGIGZvbnRzIHdpdGggYHBvcCcgYXJlIGludmFsaWQsIGl0IGlzICAgICAqLwotICAgICAgICAgIC8qIHF1ZXN0aW9uYWJsZSB3aGV0aGVyIGl0IGlzIHdvcnRoIHRoZSB0aW1lLiAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9hbmQ6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIGNvbmQgPSAoIGFyZ3NbMF0gJiYgYXJnc1sxXSApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgYW5kXG4iICkpOwotCi0gICAgICAgICAgICBhcmdzWzBdID0gY29uZCA/IDB4MTAwMDBMIDogMDsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfb3I6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIGNvbmQgPSAoIGFyZ3NbMF0gfHwgYXJnc1sxXSApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgb3JcbiIgKSk7Ci0KLSAgICAgICAgICAgIGFyZ3NbMF0gPSBjb25kID8gMHgxMDAwMEwgOiAwOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9ub3Q6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIGNvbmQgPSAhYXJnc1swXTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIG5vdFxuIiApKTsKLQotICAgICAgICAgICAgYXJnc1swXSA9IGNvbmQgPyAweDEwMDAwTCA6IDA7Ci0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2VxOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBjb25kID0gKCBhcmdzWzBdID09IGFyZ3NbMV0gKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGVxXG4iICkpOwotCi0gICAgICAgICAgICBhcmdzWzBdID0gY29uZCA/IDB4MTAwMDBMIDogMDsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaWZlbHNlOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBjb25kID0gKCBhcmdzWzJdIDw9IGFyZ3NbM10gKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGlmZWxzZVxuIiApKTsKLQotICAgICAgICAgICAgaWYgKCAhY29uZCApCi0gICAgICAgICAgICAgIGFyZ3NbMF0gPSBhcmdzWzFdOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9jYWxsc3VicjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBpZHggPSAoRlRfVUludCkoICggYXJnc1swXSA+PiAxNiApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+bG9jYWxzX2JpYXMgKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNhbGxzdWJyIChpZHggJWQsIGVudGVyaW5nIGxldmVsICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHpvbmUgLSBkZWNvZGVyLT56b25lcyArIDEgKSk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4ID49IGRlY29kZXItPm51bV9sb2NhbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGxvY2FsIHN1YnIgaW5kZXhcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHpvbmUgLSBkZWNvZGVyLT56b25lcyA+PSBDRkZfTUFYX1NVQlJTX0NBTExTICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgdG9vIG1hbnkgbmVzdGVkIHN1YnJzXG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgem9uZS0+Y3Vyc29yID0gaXA7ICAvKiBzYXZlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLwotCi0gICAgICAgICAgICB6b25lKys7Ci0gICAgICAgICAgICB6b25lLT5iYXNlICAgPSBkZWNvZGVyLT5sb2NhbHNbaWR4XTsKLSAgICAgICAgICAgIHpvbmUtPmxpbWl0ICA9IGRlY29kZXItPmxvY2Fsc1tpZHggKyAxXTsKLSAgICAgICAgICAgIHpvbmUtPmN1cnNvciA9IHpvbmUtPmJhc2U7Ci0KLSAgICAgICAgICAgIGlmICggIXpvbmUtPmJhc2UgfHwgem9uZS0+bGltaXQgPT0gem9uZS0+YmFzZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggImNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGludm9raW5nIGVtcHR5IHN1YnJzXG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVjb2Rlci0+em9uZSA9IHpvbmU7Ci0gICAgICAgICAgICBpcCAgICAgICAgICAgID0gem9uZS0+YmFzZTsKLSAgICAgICAgICAgIGxpbWl0ICAgICAgICAgPSB6b25lLT5saW1pdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfY2FsbGdzdWJyOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgIGlkeCA9IChGVF9VSW50KSggKCBhcmdzWzBdID4+IDE2ICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5nbG9iYWxzX2JpYXMgKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNhbGxnc3ViciAoaWR4ICVkLCBlbnRlcmluZyBsZXZlbCAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICB6b25lIC0gZGVjb2Rlci0+em9uZXMgKyAxICkpOwotCi0gICAgICAgICAgICBpZiAoIGlkeCA+PSBkZWNvZGVyLT5udW1fZ2xvYmFscyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggImNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgZ2xvYmFsIHN1YnIgaW5kZXhcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHpvbmUgLSBkZWNvZGVyLT56b25lcyA+PSBDRkZfTUFYX1NVQlJTX0NBTExTICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgdG9vIG1hbnkgbmVzdGVkIHN1YnJzXG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgem9uZS0+Y3Vyc29yID0gaXA7ICAvKiBzYXZlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLwotCi0gICAgICAgICAgICB6b25lKys7Ci0gICAgICAgICAgICB6b25lLT5iYXNlICAgPSBkZWNvZGVyLT5nbG9iYWxzW2lkeF07Ci0gICAgICAgICAgICB6b25lLT5saW1pdCAgPSBkZWNvZGVyLT5nbG9iYWxzW2lkeCArIDFdOwotICAgICAgICAgICAgem9uZS0+Y3Vyc29yID0gem9uZS0+YmFzZTsKLQotICAgICAgICAgICAgaWYgKCAhem9uZS0+YmFzZSB8fCB6b25lLT5saW1pdCA9PSB6b25lLT5iYXNlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgaW52b2tpbmcgZW1wdHkgc3VicnNcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWNvZGVyLT56b25lID0gem9uZTsKLSAgICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5iYXNlOwotICAgICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9yZXR1cm46Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiByZXR1cm4gKGxlYXZpbmcgbGV2ZWwgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPnpvbmUgLSBkZWNvZGVyLT56b25lcyApKTsKLQotICAgICAgICAgIGlmICggZGVjb2Rlci0+em9uZSA8PSBkZWNvZGVyLT56b25lcyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAiIHVuZXhwZWN0ZWQgcmV0dXJuXG4iICkpOwotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZGVjb2Rlci0+em9uZS0tOwotICAgICAgICAgIHpvbmUgID0gZGVjb2Rlci0+em9uZTsKLSAgICAgICAgICBpcCAgICA9IHpvbmUtPmN1cnNvcjsKLSAgICAgICAgICBsaW1pdCA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRlRfRVJST1IoKCAiVW5pbXBsZW1lbnRlZCBvcGNvZGU6ICVkIiwgaXBbLTFdICkpOwotCi0gICAgICAgICAgaWYgKCBpcFstMV0gPT0gMTIgKQotICAgICAgICAgICAgRlRfRVJST1IoKCAiICVkIiwgaXBbMF0gKSk7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiXG4iICkpOwotCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlY29kZXItPnRvcCA9IGFyZ3M7Ci0KLSAgICAgICAgaWYgKCBkZWNvZGVyLT50b3AgLSBzdGFjayA+PSBDRkZfTUFYX09QRVJBTkRTICkKLSAgICAgICAgICBnb3RvIFN0YWNrX092ZXJmbG93OwotCi0gICAgICB9IC8qIGdlbmVyYWwgb3BlcmF0b3IgcHJvY2Vzc2luZyAqLwotCi0gICAgfSAvKiB3aGlsZSBpcCA8IGxpbWl0ICovCi0KLSAgICBGVF9UUkFDRTQoKCAiLi5lbmQuLlxuXG4iICkpOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIE1NX0Vycm9yOgotICAgIEZUX1RSQUNFNCgoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgIiBpbnZhbGlkIG9wY29kZSBmb3VuZCBpbiB0b3AgRElDVCBjaGFyc3RyaW5nXG4iKSk7Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgU3ludGF4X0Vycm9yOgotICAgIEZUX1RSQUNFNCgoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogc3ludGF4IGVycm9yXG4iICkpOwotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gIFN0YWNrX1VuZGVyZmxvdzoKLSAgICBGVF9UUkFDRTQoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IHN0YWNrIHVuZGVyZmxvd1xuIiApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7Ci0KLSAgU3RhY2tfT3ZlcmZsb3c6Ci0gICAgRlRfVFJBQ0U0KCggImNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiBzdGFjayBvdmVyZmxvd1xuIiApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7Ci0gIH0KLQotI2VuZGlmIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICBDT01QVVRFIFRIRSBNQVhJTVVNIEFEVkFOQ0UgV0lEVEggICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgaW4gY2hhcmdlIG9mIGNvbXB1dGluZyAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgdGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBvZiB0aGUgZm9udC4gIEl0ICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIHF1aWNrbHkgcHJvY2Vzc2VzIGVhY2ggZ2x5cGggY2hhcnN0cmluZyB0byAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tIGVpdGhlciBhIGBzYncnIG9yIGBzZWFjJyAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgb3BlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZiAwIC8qIHVudXNlZCB1bnRpbCB3ZSBzdXBwb3J0IHB1cmUgQ0ZGIGZvbnRzICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2NvbXB1dGVfbWF4X2FkdmFuY2UoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICBtYXhfYWR2YW5jZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgQ0ZGX0RlY29kZXIgIGRlY29kZXI7Ci0gICAgRlRfSW50ICAgICAgIGdseXBoX2luZGV4OwotICAgIENGRl9Gb250ICAgICBjZmYgPSAoQ0ZGX0ZvbnQpZmFjZS0+b3RoZXI7Ci0KLQotICAgICptYXhfYWR2YW5jZSA9IDA7Ci0KLSAgICAvKiBJbml0aWFsaXplIGxvYWQgZGVjb2RlciAqLwotICAgIGNmZl9kZWNvZGVyX2luaXQoICZkZWNvZGVyLCBmYWNlLCAwLCAwLCAwLCAwICk7Ci0KLSAgICBkZWNvZGVyLmJ1aWxkZXIubWV0cmljc19vbmx5ID0gMTsKLSAgICBkZWNvZGVyLmJ1aWxkZXIubG9hZF9wb2ludHMgID0gMDsKLQotICAgIC8qIEZvciBlYWNoIGdseXBoLCBwYXJzZSB0aGUgZ2x5cGggY2hhcnN0cmluZyBhbmQgZXh0cmFjdCAqLwotICAgIC8qIHRoZSBhZHZhbmNlIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGdseXBoX2luZGV4ID0gMDsgZ2x5cGhfaW5kZXggPCBmYWNlLT5yb290Lm51bV9nbHlwaHM7Ci0gICAgICAgICAgZ2x5cGhfaW5kZXgrKyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGNoYXJzdHJpbmc7Ci0gICAgICBGVF9VTG9uZyAgY2hhcnN0cmluZ19sZW47Ci0KLQotICAgICAgLyogbm93IGdldCBsb2FkIHRoZSB1bnNjYWxlZCBvdXRsaW5lICovCi0gICAgICBlcnJvciA9IGNmZl9nZXRfZ2x5cGhfZGF0YSggZmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzdHJpbmcsICZjaGFyc3RyaW5nX2xlbiApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGNmZl9kZWNvZGVyX3ByZXBhcmUoICZkZWNvZGVyLCBzaXplLCBnbHlwaF9pbmRleCApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgZXJyb3IgPSBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggJmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0KLSAgICAgICAgY2ZmX2ZyZWVfZ2x5cGhfZGF0YSggZmFjZSwgJmNoYXJzdHJpbmcsICZjaGFyc3RyaW5nX2xlbiApOwotICAgICAgfQotCi0gICAgICAvKiBpZ25vcmUgdGhlIGVycm9yIGlmIG9uZSBoYXMgb2NjdXJyZWQgLS0gc2tpcCB0byBuZXh0IGdseXBoICovCi0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICAqbWF4X2FkdmFuY2UgPSBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSNlbmRpZiAvKiAwICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX3Nsb3RfbG9hZCggQ0ZGX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgICBsb2FkX2ZsYWdzICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBDRkZfRGVjb2RlciAgZGVjb2RlcjsKLSAgICBUVF9GYWNlICAgICAgZmFjZSA9IChUVF9GYWNlKWdseXBoLT5yb290LmZhY2U7Ci0gICAgRlRfQm9vbCAgICAgIGhpbnRpbmcsIHNjYWxlZCwgZm9yY2Vfc2NhbGluZzsKLSAgICBDRkZfRm9udCAgICAgY2ZmICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0gICAgRlRfTWF0cml4ICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICBmb250X29mZnNldDsKLQotCi0gICAgZm9yY2Vfc2NhbGluZyA9IEZBTFNFOwotCi0gICAgLyogaW4gYSBDSUQta2V5ZWQgZm9udCwgY29uc2lkZXIgYGdseXBoX2luZGV4JyBhcyBhIENJRCBhbmQgbWFwICovCi0gICAgLyogaXQgaW1tZWRpYXRlbHkgdG8gdGhlIHJlYWwgZ2x5cGhfaW5kZXggLS0gaWYgaXQgaXNuJ3QgYSAgICAgICovCi0gICAgLyogc3Vic2V0dGVkIGZvbnQsIGdseXBoX2luZGljZXMgYW5kIENJRHMgYXJlIGlkZW50aWNhbCwgdGhvdWdoICovCi0gICAgaWYgKCBjZmYtPnRvcF9mb250LmZvbnRfZGljdC5jaWRfcmVnaXN0cnkgIT0gMHhGRkZGVSAmJgotICAgICAgICAgY2ZmLT5jaGFyc2V0LmNpZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgIC8qIGRvbid0IGhhbmRsZSBDSUQgMCAoLm5vdGRlZikgd2hpY2ggaXMgZGlyZWN0bHkgbWFwcGVkIHRvIEdJRCAwICovCi0gICAgICBpZiAoIGdseXBoX2luZGV4ICE9IDAgKQotICAgICAgewotICAgICAgICBnbHlwaF9pbmRleCA9IGNmZl9jaGFyc2V0X2NpZF90b19naW5kZXgoICZjZmYtPmNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXggKTsKLSAgICAgICAgaWYgKCBnbHlwaF9pbmRleCA9PSAwICkKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIGdseXBoX2luZGV4ID49IGNmZi0+bnVtX2dseXBocyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fUkVDVVJTRSApCi0gICAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fU0NBTEUgfCBGVF9MT0FEX05PX0hJTlRJTkc7Ci0KLSAgICBnbHlwaC0+eF9zY2FsZSA9IDB4MTAwMDBMOwotICAgIGdseXBoLT55X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgaWYgKCBzaXplICkKLSAgICB7Ci0gICAgICBnbHlwaC0+eF9zY2FsZSA9IHNpemUtPnJvb3QubWV0cmljcy54X3NjYWxlOwotICAgICAgZ2x5cGgtPnlfc2NhbGUgPSBzaXplLT5yb290Lm1ldHJpY3MueV9zY2FsZTsKLSAgICB9Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICAgIC8qIHRyeSB0byBsb2FkIGVtYmVkZGVkIGJpdG1hcCBpZiBhbnkgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBYWFg6IFRoZSBjb252ZW50aW9uIHNob3VsZCBiZSBlbXBoYXNpemVkIGluICAgICAqLwotICAgIC8qICAgICAgdGhlIGRvY3VtZW50cyBiZWNhdXNlIGl0IGNhbiBiZSBjb25mdXNpbmcuICovCi0gICAgaWYgKCBzaXplICkKLSAgICB7Ci0gICAgICBDRkZfRmFjZSAgICAgIGNmZl9mYWNlID0gKENGRl9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICAgIFNGTlRfU2VydmljZSAgc2ZudCAgICAgPSAoU0ZOVF9TZXJ2aWNlKWNmZl9mYWNlLT5zZm50OwotICAgICAgRlRfU3RyZWFtICAgICBzdHJlYW0gICA9IGNmZl9mYWNlLT5yb290LnN0cmVhbTsKLQotCi0gICAgICBpZiAoIHNpemUtPnN0cmlrZV9pbmRleCAhPSAweEZGRkZGRkZGVUwgICAgICAmJgotICAgICAgICAgICBzZm50LT5sb2FkX2VibGMgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19CSVRNQVAgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgVFRfU0JpdF9NZXRyaWNzUmVjICBtZXRyaWNzOwotCi0KLSAgICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX3NiaXRfaW1hZ2UoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLT5zdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgtPnJvb3QuYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldHJpY3MgKTsKLQotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Cb29sICAgIGhhc192ZXJ0aWNhbF9pbmZvOwotICAgICAgICAgIEZUX1VTaG9ydCAgYWR2YW5jZTsKLSAgICAgICAgICBGVF9TaG9ydCAgIGR1bW15OwotCi0KLSAgICAgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLm5fcG9pbnRzICAgPSAwOwotICAgICAgICAgIGdseXBoLT5yb290Lm91dGxpbmUubl9jb250b3VycyA9IDA7Ci0KLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLndpZHRoICA9IChGVF9Qb3MpbWV0cmljcy53aWR0aCAgPDwgNjsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhlaWdodCA9IChGVF9Qb3MpbWV0cmljcy5oZWlnaHQgPDwgNjsKLQotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWCA8PCA2OwotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWSA8PCA2OwotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLmhvcmlBZHZhbmNlICA8PCA2OwotCi0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy52ZXJ0QmVhcmluZ1ggPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdYIDw8IDY7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy52ZXJ0QmVhcmluZ1kgPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdZIDw8IDY7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy52ZXJ0QWR2YW5jZSAgPSAoRlRfUG9zKW1ldHJpY3MudmVydEFkdmFuY2UgIDw8IDY7Ci0KLSAgICAgICAgICBnbHlwaC0+cm9vdC5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQOwotCi0gICAgICAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdseXBoLT5yb290LmJpdG1hcF9sZWZ0ID0gbWV0cmljcy52ZXJ0QmVhcmluZ1g7Ci0gICAgICAgICAgICBnbHlwaC0+cm9vdC5iaXRtYXBfdG9wICA9IG1ldHJpY3MudmVydEJlYXJpbmdZOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2x5cGgtPnJvb3QuYml0bWFwX2xlZnQgPSBtZXRyaWNzLmhvcmlCZWFyaW5nWDsKLSAgICAgICAgICAgIGdseXBoLT5yb290LmJpdG1hcF90b3AgID0gbWV0cmljcy5ob3JpQmVhcmluZ1k7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogY29tcHV0ZSBsaW5lYXIgYWR2YW5jZSB3aWR0aHMgKi8KLQotICAgICAgICAgICh2b2lkKSggKFNGTlRfU2VydmljZSlmYWNlLT5zZm50ICktPmdldF9tZXRyaWNzKCBmYWNlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWR2YW5jZSApOwotICAgICAgICAgIGdseXBoLT5yb290LmxpbmVhckhvcmlBZHZhbmNlID0gYWR2YW5jZTsKLQotICAgICAgICAgIGhhc192ZXJ0aWNhbF9pbmZvID0gRlRfQk9PTCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+dmVydGljYWxfaW5mbyAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT52ZXJ0aWNhbC5udW1iZXJfT2ZfVk1ldHJpY3MgPiAwICk7Ci0KLSAgICAgICAgICAvKiBnZXQgdGhlIHZlcnRpY2FsIG1ldHJpY3MgZnJvbSB0aGUgdm10eCB0YWJsZSBpZiB3ZSBoYXZlIG9uZSAqLwotICAgICAgICAgIGlmICggaGFzX3ZlcnRpY2FsX2luZm8gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICh2b2lkKSggKFNGTlRfU2VydmljZSlmYWNlLT5zZm50ICktPmdldF9tZXRyaWNzKCBmYWNlLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWR2YW5jZSApOwotICAgICAgICAgICAgZ2x5cGgtPnJvb3QubGluZWFyVmVydEFkdmFuY2UgPSBhZHZhbmNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogbWFrZSB1cCB2ZXJ0aWNhbCBvbmVzICovCi0gICAgICAgICAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgKQotICAgICAgICAgICAgICBnbHlwaC0+cm9vdC5saW5lYXJWZXJ0QWR2YW5jZSA9IChGVF9Qb3MpCi0gICAgICAgICAgICAgICAgKCBmYWNlLT5vczIuc1R5cG9Bc2NlbmRlciAtIGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlciApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBnbHlwaC0+cm9vdC5saW5lYXJWZXJ0QWR2YW5jZSA9IChGVF9Qb3MpCi0gICAgICAgICAgICAgICAgKCBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyIC0gZmFjZS0+aG9yaXpvbnRhbC5EZXNjZW5kZXIgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotICAgIC8qIHJldHVybiBpbW1lZGlhdGVseSBpZiB3ZSBvbmx5IHdhbnQgdGhlIGVtYmVkZGVkIGJpdG1hcHMgKi8KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1NCSVRTX09OTFkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBpZiB3ZSBoYXZlIGEgQ0lEIHN1YmZvbnQsIHVzZSBpdHMgbWF0cml4ICh3aGljaCBoYXMgYWxyZWFkeSAqLwotICAgIC8qIGJlZW4gbXVsdGlwbGllZCB3aXRoIHRoZSByb290IG1hdHJpeCkgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiB0aGlzIHNjYWxpbmcgaXMgb25seSByZWxldmFudCBpZiB0aGUgUFMgaGludGVyIGlzbid0IGFjdGl2ZSAqLwotICAgIGlmICggY2ZmLT5udW1fc3ViZm9udHMgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgIHRvcF91cG0sIHN1Yl91cG07Ci0gICAgICBGVF9CeXRlICBmZF9pbmRleCA9IGNmZl9mZF9zZWxlY3RfZ2V0KCAmY2ZmLT5mZF9zZWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCApOwotCi0KLSAgICAgIGlmICggZmRfaW5kZXggPj0gY2ZmLT5udW1fc3ViZm9udHMgKQotICAgICAgICBmZF9pbmRleCA9IChGVF9CeXRlKSggY2ZmLT5udW1fc3ViZm9udHMgLSAxICk7Ci0KLSAgICAgIHRvcF91cG0gPSAoRlRfTG9uZyljZmYtPnRvcF9mb250LmZvbnRfZGljdC51bml0c19wZXJfZW07Ci0gICAgICBzdWJfdXBtID0gKEZUX0xvbmcpY2ZmLT5zdWJmb250c1tmZF9pbmRleF0tPmZvbnRfZGljdC51bml0c19wZXJfZW07Ci0KLQotICAgICAgZm9udF9tYXRyaXggPSBjZmYtPnN1YmZvbnRzW2ZkX2luZGV4XS0+Zm9udF9kaWN0LmZvbnRfbWF0cml4OwotICAgICAgZm9udF9vZmZzZXQgPSBjZmYtPnN1YmZvbnRzW2ZkX2luZGV4XS0+Zm9udF9kaWN0LmZvbnRfb2Zmc2V0OwotCi0gICAgICBpZiAoIHRvcF91cG0gIT0gc3ViX3VwbSApCi0gICAgICB7Ci0gICAgICAgIGdseXBoLT54X3NjYWxlID0gRlRfTXVsRGl2KCBnbHlwaC0+eF9zY2FsZSwgdG9wX3VwbSwgc3ViX3VwbSApOwotICAgICAgICBnbHlwaC0+eV9zY2FsZSA9IEZUX011bERpdiggZ2x5cGgtPnlfc2NhbGUsIHRvcF91cG0sIHN1Yl91cG0gKTsKLQotICAgICAgICBmb3JjZV9zY2FsaW5nID0gVFJVRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvbnRfbWF0cml4ID0gY2ZmLT50b3BfZm9udC5mb250X2RpY3QuZm9udF9tYXRyaXg7Ci0gICAgICBmb250X29mZnNldCA9IGNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0LmZvbnRfb2Zmc2V0OwotICAgIH0KLQotICAgIGdseXBoLT5yb290Lm91dGxpbmUubl9wb2ludHMgICA9IDA7Ci0gICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5uX2NvbnRvdXJzID0gMDsKLQotICAgIC8qIHRvcC1sZXZlbCBjb2RlIGVuc3VyZXMgdGhhdCBGVF9MT0FEX05PX0hJTlRJTkcgaXMgc2V0ICovCi0gICAgLyogaWYgRlRfTE9BRF9OT19TQ0FMRSBpcyBhY3RpdmUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBoaW50aW5nID0gRlRfQk9PTCggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HICkgPT0gMCApOwotICAgIHNjYWxlZCAgPSBGVF9CT09MKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICAgKSA9PSAwICk7Ci0KLSAgICBnbHlwaC0+aGludCAgICAgICAgPSBoaW50aW5nOwotICAgIGdseXBoLT5zY2FsZWQgICAgICA9IHNjYWxlZDsKLSAgICBnbHlwaC0+cm9vdC5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsgIC8qIGJ5IGRlZmF1bHQgKi8KLQotICAgIHsKLSNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FCi0gICAgICBDRkZfRHJpdmVyICBkcml2ZXIgPSAoQ0ZGX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZmFjZSApOwotI2VuZGlmCi0KLQotICAgICAgRlRfQnl0ZSogIGNoYXJzdHJpbmc7Ci0gICAgICBGVF9VTG9uZyAgY2hhcnN0cmluZ19sZW47Ci0KLQotICAgICAgY2ZmX2RlY29kZXJfaW5pdCggJmRlY29kZXIsIGZhY2UsIHNpemUsIGdseXBoLCBoaW50aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICk7Ci0KLSAgICAgIC8qIHRoaXMgaXMgZm9yIHB1cmUgQ0ZGcyAqLwotICAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9BRFZBTkNFX09OTFkgKQotICAgICAgICBkZWNvZGVyLndpZHRoX29ubHkgPSBUUlVFOwotCi0gICAgICBkZWNvZGVyLmJ1aWxkZXIubm9fcmVjdXJzZSA9Ci0gICAgICAgIChGVF9Cb29sKSggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fUkVDVVJTRSApOwotCi0gICAgICAvKiBub3cgbG9hZCB0aGUgdW5zY2FsZWQgb3V0bGluZSAqLwotICAgICAgZXJyb3IgPSBjZmZfZ2V0X2dseXBoX2RhdGEoIGZhY2UsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc3RyaW5nLCAmY2hhcnN0cmluZ19sZW4gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEdseXBoX0J1aWxkX0ZpbmlzaGVkOwotCi0gICAgICBlcnJvciA9IGNmZl9kZWNvZGVyX3ByZXBhcmUoICZkZWNvZGVyLCBzaXplLCBnbHlwaF9pbmRleCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gR2x5cGhfQnVpbGRfRmluaXNoZWQ7Ci0KLSNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FCi0gICAgICAvKiBjaG9vc2Ugd2hpY2ggQ0ZGIHJlbmRlcmVyIHRvIHVzZSAqLwotICAgICAgaWYgKCBkcml2ZXItPmhpbnRpbmdfZW5naW5lID09IEZUX0NGRl9ISU5USU5HX0ZSRUVUWVBFICkKLSAgICAgICAgZXJyb3IgPSBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggJmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggJmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmdfbGVuICk7Ci0KLSAgICAgICAgLyogQWRvYmUncyBlbmdpbmUgdXNlcyAxNi4xNiBudW1iZXJzIGV2ZXJ5d2hlcmU7ICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBhcyBhIGNvbnNlcXVlbmNlLCBnbHlwaHMgbGFyZ2VyIHRoYW4gMjAwMHBwZW0gZ2V0IHJlamVjdGVkICovCi0gICAgICAgIGlmICggRlRfRVJSX0VRKCBlcnJvciwgR2x5cGhfVG9vX0JpZyApICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgdGltZSwgd2UgcmV0cnkgdW5oaW50ZWQgYW5kIHNjYWxlIHVwIHRoZSBnbHlwaCBsYXRlciBvbiAqLwotICAgICAgICAgIC8qICh0aGUgZW5naW5lIHVzZXMgYW5kIHNldHMgdGhlIGhhcmRjb2RlZCB2YWx1ZSAweDEwMDAwIC8gNjQgPSAqLwotICAgICAgICAgIC8qIDB4NDAwIGZvciBib3RoIGB4X3NjYWxlJyBhbmQgYHlfc2NhbGUnIGluIHRoaXMgY2FzZSkgICAgICAgICAqLwotICAgICAgICAgIGhpbnRpbmcgICAgICAgPSBGQUxTRTsKLSAgICAgICAgICBmb3JjZV9zY2FsaW5nID0gVFJVRTsKLSAgICAgICAgICBnbHlwaC0+aGludCAgID0gaGludGluZzsKLQotICAgICAgICAgIGVycm9yID0gY2YyX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoICZkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZ19sZW4gKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBjZmZfZnJlZV9nbHlwaF9kYXRhKCBmYWNlLCAmY2hhcnN0cmluZywgY2hhcnN0cmluZ19sZW4gKTsKLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gR2x5cGhfQnVpbGRfRmluaXNoZWQ7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgICAvKiBDb250cm9sIGRhdGEgYW5kIGxlbmd0aCBtYXkgbm90IGJlIGF2YWlsYWJsZSBmb3IgaW5jcmVtZW50YWwgKi8KLSAgICAgIC8qIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgICAgewotICAgICAgICBnbHlwaC0+cm9vdC5jb250cm9sX2RhdGEgPSBOVUxMOwotICAgICAgICBnbHlwaC0+cm9vdC5jb250cm9sX2xlbiA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gICAgICAvKiBXZSBzZXQgY29udHJvbF9kYXRhIGFuZCBjb250cm9sX2xlbiBpZiBjaGFyc3RyaW5ncyBpcyBsb2FkZWQuICovCi0gICAgICAvKiBTZWUgaG93IGNoYXJzdHJpbmcgbG9hZHMgYXQgY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50KCkgaW4gICAgICovCi0gICAgICAvKiBjZmZsb2FkLmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIENGRl9JbmRleCAgY3NpbmRleCA9ICZjZmYtPmNoYXJzdHJpbmdzX2luZGV4OwotCi0KLSAgICAgICAgaWYgKCBjc2luZGV4LT5vZmZzZXRzICkKLSAgICAgICAgewotICAgICAgICAgIGdseXBoLT5yb290LmNvbnRyb2xfZGF0YSA9IGNzaW5kZXgtPmJ5dGVzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2luZGV4LT5vZmZzZXRzW2dseXBoX2luZGV4XSAtIDE7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QuY29udHJvbF9sZW4gID0gKEZUX0xvbmcpY2hhcnN0cmluZ19sZW47Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICBHbHlwaF9CdWlsZF9GaW5pc2hlZDoKLSAgICAgIC8qIHNhdmUgbmV3IGdseXBoIHRhYmxlcywgaWYgbm8gZXJyb3IgKi8KLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgY2ZmX2J1aWxkZXJfZG9uZSggJmRlY29kZXIuYnVpbGRlciApOwotICAgICAgLyogWFhYOiBhbnl0aGluZyB0byBkbyBmb3IgYnJva2VuIGdseXBoIGVudHJ5PyAqLwotICAgIH0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotICAgIC8qIEluY3JlbWVudGFsIGZvbnRzIGNhbiBvcHRpb25hbGx5IG92ZXJyaWRlIHRoZSBtZXRyaWNzLiAqLwotICAgIGlmICggIWVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcyApCi0gICAgewotICAgICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYyAgbWV0cmljczsKLQotCi0gICAgICBtZXRyaWNzLmJlYXJpbmdfeCA9IGRlY29kZXIuYnVpbGRlci5sZWZ0X2JlYXJpbmcueDsKLSAgICAgIG1ldHJpY3MuYmVhcmluZ195ID0gMDsKLSAgICAgIG1ldHJpY3MuYWR2YW5jZSAgID0gZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueDsKLSAgICAgIG1ldHJpY3MuYWR2YW5jZV92ID0gZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueTsKLQotICAgICAgZXJyb3IgPSBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcygKLSAgICAgICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwKLSAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgRkFMU0UsICZtZXRyaWNzICk7Ci0KLSAgICAgIGRlY29kZXIuYnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IG1ldHJpY3MuYmVhcmluZ194OwotICAgICAgZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueCAgICAgID0gbWV0cmljcy5hZHZhbmNlOwotICAgICAgZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueSAgICAgID0gbWV0cmljcy5hZHZhbmNlX3Y7Ci0gICAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIC8qIE5vdywgc2V0IHRoZSBtZXRyaWNzIC0tIHRoaXMgaXMgcmF0aGVyIHNpbXBsZSwgYXMgICAqLwotICAgICAgLyogdGhlIGxlZnQgc2lkZSBiZWFyaW5nIGlzIHRoZSB4TWluLCBhbmQgdGhlIHRvcCBzaWRlICovCi0gICAgICAvKiBiZWFyaW5nIHRoZSB5TWF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgLyogRm9yIGNvbXBvc2l0ZSBnbHlwaHMsIHJldHVybiBvbmx5IGxlZnQgc2lkZSBiZWFyaW5nIGFuZCAqLwotICAgICAgLyogYWR2YW5jZSB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICAgIHsKLSAgICAgICAgRlRfU2xvdF9JbnRlcm5hbCAgaW50ZXJuYWwgPSBnbHlwaC0+cm9vdC5pbnRlcm5hbDsKLQotCi0gICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gZGVjb2Rlci5idWlsZGVyLmxlZnRfYmVhcmluZy54OwotICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IGRlY29kZXIuZ2x5cGhfd2lkdGg7Ci0gICAgICAgIGludGVybmFsLT5nbHlwaF9tYXRyaXggICAgICAgICAgID0gZm9udF9tYXRyaXg7Ci0gICAgICAgIGludGVybmFsLT5nbHlwaF9kZWx0YSAgICAgICAgICAgID0gZm9udF9vZmZzZXQ7Ci0gICAgICAgIGludGVybmFsLT5nbHlwaF90cmFuc2Zvcm1lZCAgICAgID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfQkJveCAgICAgICAgICAgIGNib3g7Ci0gICAgICAgIEZUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzID0gJmdseXBoLT5yb290Lm1ldHJpY3M7Ci0gICAgICAgIEZUX0Jvb2wgICAgICAgICAgICBoYXNfdmVydGljYWxfaW5mbzsKLQotCi0gICAgICAgIGlmICggZmFjZS0+aG9yaXpvbnRhbC5udW1iZXJfT2ZfSE1ldHJpY3MgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfU2hvcnQgICBob3JpQmVhcmluZ1ggPSAwOwotICAgICAgICAgIEZUX1VTaG9ydCAgaG9yaUFkdmFuY2UgID0gMDsKLQotCi0gICAgICAgICAgKCAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQgKS0+Z2V0X21ldHJpY3MoIGZhY2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaUJlYXJpbmdYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaUFkdmFuY2UgKTsKLSAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSAgICAgICAgICA9IGhvcmlBZHZhbmNlOwotICAgICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCAgICAgICAgID0gaG9yaUJlYXJpbmdYOwotICAgICAgICAgIGdseXBoLT5yb290LmxpbmVhckhvcmlBZHZhbmNlID0gaG9yaUFkdmFuY2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogY29weSB0aGUgX3Vuc2NhbGVkXyBhZHZhbmNlIHdpZHRoICovCi0gICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgICAgICAgICAgPSBkZWNvZGVyLmdseXBoX3dpZHRoOwotICAgICAgICAgIGdseXBoLT5yb290LmxpbmVhckhvcmlBZHZhbmNlID0gZGVjb2Rlci5nbHlwaF93aWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGdseXBoLT5yb290LmludGVybmFsLT5nbHlwaF90cmFuc2Zvcm1lZCA9IDA7Ci0KLSAgICAgICAgaGFzX3ZlcnRpY2FsX2luZm8gPSBGVF9CT09MKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID4gMCApOwotCi0gICAgICAgIC8qIGdldCB0aGUgdmVydGljYWwgbWV0cmljcyBmcm9tIHRoZSB2bXR4IHRhYmxlIGlmIHdlIGhhdmUgb25lICovCi0gICAgICAgIGlmICggaGFzX3ZlcnRpY2FsX2luZm8gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfU2hvcnQgICB2ZXJ0QmVhcmluZ1kgPSAwOwotICAgICAgICAgIEZUX1VTaG9ydCAgdmVydEFkdmFuY2UgID0gMDsKLQotCi0gICAgICAgICAgKCAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQgKS0+Z2V0X21ldHJpY3MoIGZhY2UsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydEJlYXJpbmdZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydEFkdmFuY2UgKTsKLSAgICAgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSB2ZXJ0QmVhcmluZ1k7Ci0gICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgID0gdmVydEFkdmFuY2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogbWFrZSB1cCB2ZXJ0aWNhbCBvbmVzICovCi0gICAgICAgICAgaWYgKCBmYWNlLT5vczIudmVyc2lvbiAhPSAweEZGRkZVICkKLSAgICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gKEZUX1BvcykoIGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlciApOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gKEZUX1BvcykoIGZhY2UtPmhvcml6b250YWwuQXNjZW5kZXIgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5EZXNjZW5kZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdseXBoLT5yb290LmxpbmVhclZlcnRBZHZhbmNlID0gbWV0cmljcy0+dmVydEFkdmFuY2U7Ci0KLSAgICAgICAgZ2x5cGgtPnJvb3QuZm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX09VVExJTkU7Ci0KLSAgICAgICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5mbGFncyA9IDA7Ci0gICAgICAgIGlmICggc2l6ZSAmJiBzaXplLT5yb290Lm1ldHJpY3MueV9wcGVtIDwgMjQgKQotICAgICAgICAgIGdseXBoLT5yb290Lm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTjsKLQotICAgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLmZsYWdzIHw9IEZUX09VVExJTkVfUkVWRVJTRV9GSUxMOwotCi0gICAgICAgIC8qIGFwcGx5IHRoZSBmb250IG1hdHJpeCwgaWYgYW55ICovCi0gICAgICAgIGlmICggZm9udF9tYXRyaXgueHggIT0gMHgxMDAwMEwgfHwgZm9udF9tYXRyaXgueXkgIT0gMHgxMDAwMEwgfHwKLSAgICAgICAgICAgICBmb250X21hdHJpeC54eSAhPSAwICAgICAgICB8fCBmb250X21hdHJpeC55eCAhPSAwICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggJmdseXBoLT5yb290Lm91dGxpbmUsICZmb250X21hdHJpeCApOwotCi0gICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X21hdHJpeC54eCApOwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9tYXRyaXgueXkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZm9udF9vZmZzZXQueCB8fCBmb250X29mZnNldC55ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmZ2x5cGgtPnJvb3Qub3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9vZmZzZXQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9vZmZzZXQueSApOwotCi0gICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgKz0gZm9udF9vZmZzZXQueDsKLSAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSArPSBmb250X29mZnNldC55OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCB8fCBmb3JjZV9zY2FsaW5nICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHNjYWxlIHRoZSBvdXRsaW5lIGFuZCB0aGUgbWV0cmljcyAqLwotICAgICAgICAgIEZUX0ludCAgICAgICBuOwotICAgICAgICAgIEZUX091dGxpbmUqICBjdXIgICAgID0gJmdseXBoLT5yb290Lm91dGxpbmU7Ci0gICAgICAgICAgRlRfVmVjdG9yKiAgIHZlYyAgICAgPSBjdXItPnBvaW50czsKLSAgICAgICAgICBGVF9GaXhlZCAgICAgeF9zY2FsZSA9IGdseXBoLT54X3NjYWxlOwotICAgICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlID0gZ2x5cGgtPnlfc2NhbGU7Ci0KLQotICAgICAgICAgIC8qIEZpcnN0IG9mIGFsbCwgc2NhbGUgdGhlIHBvaW50cyAqLwotICAgICAgICAgIGlmICggIWhpbnRpbmcgfHwgIWRlY29kZXIuYnVpbGRlci5oaW50c19mdW5jcyApCi0gICAgICAgICAgICBmb3IgKCBuID0gY3VyLT5uX3BvaW50czsgbiA+IDA7IG4tLSwgdmVjKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2ZWMtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApOwotICAgICAgICAgICAgICB2ZWMtPnkgPSBGVF9NdWxGaXgoIHZlYy0+eSwgeV9zY2FsZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgLyogVGhlbiBzY2FsZSB0aGUgbWV0cmljcyAqLwotICAgICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT5ob3JpQWR2YW5jZSwgeF9zY2FsZSApOwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwgeV9zY2FsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgb3RoZXIgbWV0cmljcyAqLwotICAgICAgICBGVF9PdXRsaW5lX0dldF9DQm94KCAmZ2x5cGgtPnJvb3Qub3V0bGluZSwgJmNib3ggKTsKLQotICAgICAgICBtZXRyaWNzLT53aWR0aCAgPSBjYm94LnhNYXggLSBjYm94LnhNaW47Ci0gICAgICAgIG1ldHJpY3MtPmhlaWdodCA9IGNib3gueU1heCAtIGNib3gueU1pbjsKLQotICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBjYm94LnhNaW47Ci0gICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IGNib3gueU1heDsKLQotICAgICAgICBpZiAoIGhhc192ZXJ0aWNhbF9pbmZvICkKLSAgICAgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgLyAyOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgICAgICAgICBmdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MoIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmZ2xvYWQuaCBiL3NyYy9jZmYvY2ZmZ2xvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhOTNiNC4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZmdsb2FkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmZ2xvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdseXBoIExvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIENGRkdMT0FEX0hfCi0jZGVmaW5lIENGRkdMT0FEX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSAiY2Zmb2Jqcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgQ0ZGX01BWF9PUEVSQU5EUyAgICAgICAgNDgKLSNkZWZpbmUgQ0ZGX01BWF9TVUJSU19DQUxMUyAgICAgMTYgIC8qIG1heGltdW0gc3Vicm91dGluZSBuZXN0aW5nOyAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmx5IDEwIGFyZSBhbGxvd2VkIGJ1dCB0aGVyZSBleGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9udHMgbGlrZSBgSGlyYUtha3VQcm9OLVczLnR0ZicgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChIaXJhZ2lubyBLYWt1IEdvdGhpYyBQcm9OIFczOyAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4LjJkNmUxOyAyMDE0LTEyLTE5KSB0aGF0IGV4Y2VlZCAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0ZGX01BWF9UUkFOU19FTEVNRU5UUyAgMzIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdHVyZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENGRl9CdWlsZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBBIHN0cnVjdHVyZSB1c2VkIGR1cmluZyBnbHlwaCBsb2FkaW5nIHRvIHN0b3JlIGl0cyBvdXRsaW5lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgICAgOjogVGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgICAgICAgIDo6IFRoZSBjdXJyZW50IGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciAgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggbG9hZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZSAgICAgICAgICA6OiBUaGUgYmFzZSBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJyZW50ICAgICAgIDo6IFRoZSBjdXJyZW50IGdseXBoIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc194ICAgICAgICAgOjogVGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zX3kgICAgICAgICA6OiBUaGUgdmVydGljYWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0X2JlYXJpbmcgIDo6IFRoZSBsZWZ0IHNpZGUgYmVhcmluZyBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgICAgICAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZSB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmJveCAgICAgICAgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRoX2JlZ3VuICAgIDo6IEEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhIG5ldyBwYXRoIGhhcyBiZWd1bi4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfcG9pbnRzICAgOjogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIG5vIHBvaW50cyBhcmUgbG9hZGVkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9fcmVjdXJzZSAgICA6OiBTZXQgYnV0IG5vdCB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNzX29ubHkgIDo6IEEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICB0aGUgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoLCBub3QgbG9hZCBhbGwgb2YgaXRzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludHNfZnVuY3MgICA6OiBBdXhpbGlhcnkgcG9pbnRlciBmb3IgaGludGluZy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50c19nbG9iYWxzIDo6IEF1eGlsaWFyeSBwb2ludGVyIGZvciBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfQnVpbGRlcl8KLSAgewotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnk7Ci0gICAgVFRfRmFjZSAgICAgICAgIGZhY2U7Ci0gICAgQ0ZGX0dseXBoU2xvdCAgIGdseXBoOwotICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXI7Ci0gICAgRlRfT3V0bGluZSogICAgIGJhc2U7Ci0gICAgRlRfT3V0bGluZSogICAgIGN1cnJlbnQ7Ci0KLSAgICBGVF9Qb3MgICAgICAgICAgcG9zX3g7Ci0gICAgRlRfUG9zICAgICAgICAgIHBvc195OwotCi0gICAgRlRfVmVjdG9yICAgICAgIGxlZnRfYmVhcmluZzsKLSAgICBGVF9WZWN0b3IgICAgICAgYWR2YW5jZTsKLQotICAgIEZUX0JCb3ggICAgICAgICBiYm94OyAgICAgICAgICAvKiBib3VuZGluZyBib3ggKi8KLSAgICBGVF9Cb29sICAgICAgICAgcGF0aF9iZWd1bjsKLSAgICBGVF9Cb29sICAgICAgICAgbG9hZF9wb2ludHM7Ci0gICAgRlRfQm9vbCAgICAgICAgIG5vX3JlY3Vyc2U7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgbWV0cmljc19vbmx5OwotCi0gICAgdm9pZCogICAgICAgICAgIGhpbnRzX2Z1bmNzOyAgICAvKiBoaW50ZXItc3BlY2lmaWMgKi8KLSAgICB2b2lkKiAgICAgICAgICAgaGludHNfZ2xvYmFsczsgIC8qIGhpbnRlci1zcGVjaWZpYyAqLwotCi0gIH0gQ0ZGX0J1aWxkZXI7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfY2hlY2tfcG9pbnRzKCBDRkZfQnVpbGRlciogIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgY291bnQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9idWlsZGVyX2FkZF9wb2ludCggQ0ZGX0J1aWxkZXIqICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgICBmbGFnICk7Ci0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9idWlsZGVyX2FkZF9wb2ludDEoIENGRl9CdWlsZGVyKiAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHkgKTsKLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIENGRl9CdWlsZGVyKiAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeSApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIENGRl9CdWlsZGVyKiAgYnVpbGRlciApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0ludCApCi0gIGNmZl9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIENGRl9Gb250ICBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICBjaGFyY29kZSApOwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfZ2V0X2dseXBoX2RhdGEoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9mcmVlX2dseXBoX2RhdGEoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGxlbmd0aCApOwotCi0KLSAgLyogZXhlY3V0aW9uIGNvbnRleHQgY2hhcnN0cmluZyB6b25lICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9EZWNvZGVyX1pvbmVfCi0gIHsKLSAgICBGVF9CeXRlKiAgYmFzZTsKLSAgICBGVF9CeXRlKiAgbGltaXQ7Ci0gICAgRlRfQnl0ZSogIGN1cnNvcjsKLQotICB9IENGRl9EZWNvZGVyX1pvbmU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0RlY29kZXJfCi0gIHsKLSAgICBDRkZfQnVpbGRlciAgICAgICAgYnVpbGRlcjsKLSAgICBDRkZfRm9udCAgICAgICAgICAgY2ZmOwotCi0gICAgRlRfRml4ZWQgICAgICAgICAgIHN0YWNrW0NGRl9NQVhfT1BFUkFORFMgKyAxXTsKLSAgICBGVF9GaXhlZCogICAgICAgICAgdG9wOwotCi0gICAgQ0ZGX0RlY29kZXJfWm9uZSAgIHpvbmVzW0NGRl9NQVhfU1VCUlNfQ0FMTFMgKyAxXTsKLSAgICBDRkZfRGVjb2Rlcl9ab25lKiAgem9uZTsKLQotICAgIEZUX0ludCAgICAgICAgICAgICBmbGV4X3N0YXRlOwotICAgIEZUX0ludCAgICAgICAgICAgICBudW1fZmxleF92ZWN0b3JzOwotICAgIEZUX1ZlY3RvciAgICAgICAgICBmbGV4X3ZlY3RvcnNbN107Ci0KLSAgICBGVF9Qb3MgICAgICAgICAgICAgZ2x5cGhfd2lkdGg7Ci0gICAgRlRfUG9zICAgICAgICAgICAgIG5vbWluYWxfd2lkdGg7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgICAgcmVhZF93aWR0aDsKLSAgICBGVF9Cb29sICAgICAgICAgICAgd2lkdGhfb25seTsKLSAgICBGVF9JbnQgICAgICAgICAgICAgbnVtX2hpbnRzOwotICAgIEZUX0ZpeGVkICAgICAgICAgICBidWlsZGNoYXJbQ0ZGX01BWF9UUkFOU19FTEVNRU5UU107Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX2xvY2FsczsKLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX2dsb2JhbHM7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICAgbG9jYWxzX2JpYXM7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIGdsb2JhbHNfYmlhczsKLQotICAgIEZUX0J5dGUqKiAgICAgICAgICBsb2NhbHM7Ci0gICAgRlRfQnl0ZSoqICAgICAgICAgIGdsb2JhbHM7Ci0KLSAgICBGVF9CeXRlKiogICAgICAgICAgZ2x5cGhfbmFtZXM7ICAgLyogZm9yIHB1cmUgQ0ZGIGZvbnRzIG9ubHkgICovCi0gICAgRlRfVUludCAgICAgICAgICAgIG51bV9nbHlwaHM7ICAgIC8qIG51bWJlciBvZiBnbHlwaHMgaW4gZm9udCAqLwotCi0gICAgRlRfUmVuZGVyX01vZGUgICAgIGhpbnRfbW9kZTsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICBzZWFjOwotCi0gICAgQ0ZGX1N1YkZvbnQgICAgICAgIGN1cnJlbnRfc3ViZm9udDsgLyogZm9yIGN1cnJlbnQgZ2x5cGhfaW5kZXggKi8KLQotICB9IENGRl9EZWNvZGVyOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfZGVjb2Rlcl9pbml0KCBDRkZfRGVjb2RlciogICAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICBDRkZfR2x5cGhTbG90ICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGhpbnRpbmcsCi0gICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfZGVjb2Rlcl9wcmVwYXJlKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCApOwotCi0jaWYgMCAgLyogdW51c2VkIHVudGlsIHdlIHN1cHBvcnQgcHVyZSBDRkYgZm9udHMgKi8KLQotICAvKiBDb21wdXRlIHRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggb2YgYSBmb250IHRocm91Z2ggcXVpY2sgcGFyc2luZyAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfY29tcHV0ZV9tYXhfYWR2YW5jZSggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogIG1heF9hZHZhbmNlICk7Ci0KLSNlbmRpZiAvKiAwICovCi0KLSNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgIGNoYXJzdHJpbmdfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgY2hhcnN0cmluZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgIGluX2RpY3QgKTsKLSNlbmRpZgotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9zbG90X2xvYWQoIENGRl9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICBDRkZfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICAgbG9hZF9mbGFncyApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIENGRkdMT0FEX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZmxvYWQuYyBiL3NyYy9jZmYvY2ZmbG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjQyMDM4Li4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgYW5kIENGRiBkYXRhL3Byb2dyYW0gdGFibGVzIGxvYWRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2VuZGlmCi0KLSNpbmNsdWRlICJjZmZsb2FkLmgiCi0jaW5jbHVkZSAiY2ZmcGFyc2UuaCIKLQotI2luY2x1ZGUgImNmZmVycnMuaCIKLQotCi0jZGVmaW5lIEZUX0ZJWEVEX09ORSAgKCAoRlRfRml4ZWQpMHgxMDAwMCApCi0KLQotI2lmIDEKLQotICBzdGF0aWMgY29uc3QgRlRfVVNob3J0ICBjZmZfaXNvYWRvYmVfY2hhcnNldFsyMjldID0KLSAgewotICAgICAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LAotICAgICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAotICAgICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLAotICAgICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAotICAgICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LAotICAgICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAotICAgICA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LAotICAgICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAotICAgICA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLAotICAgICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAotICAgICA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LAotICAgICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAotICAgICA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLAotICAgIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAotICAgIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LAotICAgIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAotICAgIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LAotICAgIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAotICAgIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLAotICAgIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAotICAgIDE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LAotICAgIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LAotICAgIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLAotICAgIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLAotICAgIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LAotICAgIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LAotICAgIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LAotICAgIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLAotICAgIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4Ci0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX1VTaG9ydCAgY2ZmX2V4cGVydF9jaGFyc2V0WzE2Nl0gPQotICB7Ci0gICAgICAwLCAgIDEsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsCi0gICAgMjM1LCAyMzYsIDIzNywgMjM4LCAgMTMsICAxNCwgIDE1LCAgOTksCi0gICAgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsCi0gICAgMjQ3LCAyNDgsICAyNywgIDI4LCAyNDksIDI1MCwgMjUxLCAyNTIsCi0gICAgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsCi0gICAgMjYxLCAyNjIsIDI2MywgMjY0LCAyNjUsIDI2NiwgMTA5LCAxMTAsCi0gICAgMjY3LCAyNjgsIDI2OSwgMjcwLCAyNzEsIDI3MiwgMjczLCAyNzQsCi0gICAgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsCi0gICAgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsCi0gICAgMjkxLCAyOTIsIDI5MywgMjk0LCAyOTUsIDI5NiwgMjk3LCAyOTgsCi0gICAgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsCi0gICAgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsCi0gICAgMzE1LCAzMTYsIDMxNywgMzE4LCAxNTgsIDE1NSwgMTYzLCAzMTksCi0gICAgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAxNTAsCi0gICAgMTY0LCAxNjksIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsCi0gICAgMzMzLCAzMzQsIDMzNSwgMzM2LCAzMzcsIDMzOCwgMzM5LCAzNDAsCi0gICAgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsCi0gICAgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsCi0gICAgMzU3LCAzNTgsIDM1OSwgMzYwLCAzNjEsIDM2MiwgMzYzLCAzNjQsCi0gICAgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsCi0gICAgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OAotICB9OwotCi0gIHN0YXRpYyBjb25zdCBGVF9VU2hvcnQgIGNmZl9leHBlcnRzdWJzZXRfY2hhcnNldFs4N10gPQotICB7Ci0gICAgICAwLCAgIDEsIDIzMSwgMjMyLCAyMzUsIDIzNiwgMjM3LCAyMzgsCi0gICAgIDEzLCAgMTQsICAxNSwgIDk5LCAyMzksIDI0MCwgMjQxLCAyNDIsCi0gICAgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgIDI3LCAgMjgsCi0gICAgMjQ5LCAyNTAsIDI1MSwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsCi0gICAgMjU4LCAyNTksIDI2MCwgMjYxLCAyNjIsIDI2MywgMjY0LCAyNjUsCi0gICAgMjY2LCAxMDksIDExMCwgMjY3LCAyNjgsIDI2OSwgMjcwLCAyNzIsCi0gICAgMzAwLCAzMDEsIDMwMiwgMzA1LCAzMTQsIDMxNSwgMTU4LCAxNTUsCi0gICAgMTYzLCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsCi0gICAgMTUwLCAxNjQsIDE2OSwgMzI3LCAzMjgsIDMyOSwgMzMwLCAzMzEsCi0gICAgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksCi0gICAgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2Ci0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX1VTaG9ydCAgY2ZmX3N0YW5kYXJkX2VuY29kaW5nWzI1Nl0gPQotICB7Ci0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsCi0gICAgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsCi0gICAgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsCi0gICAgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsCi0gICAgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsCi0gICAgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsCi0gICAgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsCi0gICAgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsCi0gICAgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsCi0gICAgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsCi0gICAgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsCi0gICAgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsCi0gICAgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsCi0gICAgICAwLCAxMTEsIDExMiwgMTEzLCAxMTQsICAgMCwgMTE1LCAxMTYsCi0gICAgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgICAwLCAxMjMsCi0gICAgICAwLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCi0gICAgMTMxLCAgIDAsIDEzMiwgMTMzLCAgIDAsIDEzNCwgMTM1LCAxMzYsCi0gICAgMTM3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAxMzgsICAgMCwgMTM5LCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMTQwLCAxNDEsIDE0MiwgMTQzLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAxNDQsICAgMCwgICAwLCAgIDAsIDE0NSwgICAwLCAgIDAsCi0gICAgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAgIDAsICAgMCwgICAwLCAgIDAKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRlRfVVNob3J0ICBjZmZfZXhwZXJ0X2VuY29kaW5nWzI1Nl0gPQotICB7Ci0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAxLCAyMjksIDIzMCwgICAwLCAyMzEsIDIzMiwgMjMzLCAyMzQsCi0gICAgMjM1LCAyMzYsIDIzNywgMjM4LCAgMTMsICAxNCwgIDE1LCAgOTksCi0gICAgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsCi0gICAgMjQ3LCAyNDgsICAyNywgIDI4LCAyNDksIDI1MCwgMjUxLCAyNTIsCi0gICAgICAwLCAyNTMsIDI1NCwgMjU1LCAyNTYsIDI1NywgICAwLCAgIDAsCi0gICAgICAwLCAyNTgsICAgMCwgICAwLCAyNTksIDI2MCwgMjYxLCAyNjIsCi0gICAgICAwLCAgIDAsIDI2MywgMjY0LCAyNjUsICAgMCwgMjY2LCAxMDksCi0gICAgMTEwLCAyNjcsIDI2OCwgMjY5LCAgIDAsIDI3MCwgMjcxLCAyNzIsCi0gICAgMjczLCAyNzQsIDI3NSwgMjc2LCAyNzcsIDI3OCwgMjc5LCAyODAsCi0gICAgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsCi0gICAgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsCi0gICAgMjk3LCAyOTgsIDI5OSwgMzAwLCAzMDEsIDMwMiwgMzAzLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgICAwLCAzMDQsIDMwNSwgMzA2LCAgIDAsICAgMCwgMzA3LCAzMDgsCi0gICAgMzA5LCAzMTAsIDMxMSwgICAwLCAzMTIsICAgMCwgICAwLCAzMTIsCi0gICAgICAwLCAgIDAsIDMxNCwgMzE1LCAgIDAsICAgMCwgMzE2LCAzMTcsCi0gICAgMzE4LCAgIDAsICAgMCwgICAwLCAxNTgsIDE1NSwgMTYzLCAzMTksCi0gICAgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgICAwLCAgIDAsCi0gICAgMzI2LCAxNTAsIDE2NCwgMTY5LCAzMjcsIDMyOCwgMzI5LCAzMzAsCi0gICAgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsCi0gICAgMzM5LCAzNDAsIDM0MSwgMzQyLCAzNDMsIDM0NCwgMzQ1LCAzNDYsCi0gICAgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsCi0gICAgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsCi0gICAgMzYzLCAzNjQsIDM2NSwgMzY2LCAzNjcsIDM2OCwgMzY5LCAzNzAsCi0gICAgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgKLSAgfTsKLQotI2VuZGlmIC8qIDEgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfVVNob3J0ICkKLSAgY2ZmX2dldF9zdGFuZGFyZF9lbmNvZGluZyggRlRfVUludCAgY2hhcmNvZGUgKQotICB7Ci0gICAgcmV0dXJuIChGVF9VU2hvcnQpKCBjaGFyY29kZSA8IDI1NiA/IGNmZl9zdGFuZGFyZF9lbmNvZGluZ1tjaGFyY29kZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jZmZsb2FkCi0KLQotICAvKiByZWFkIGFuIG9mZnNldCBmcm9tIHRoZSBpbmRleCdzIHN0cmVhbSBjdXJyZW50IHBvc2l0aW9uICovCi0gIHN0YXRpYyBGVF9VTG9uZwotICBjZmZfaW5kZXhfcmVhZF9vZmZzZXQoIENGRl9JbmRleCAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqZXJyb3JwICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBpZHgtPnN0cmVhbTsKLSAgICBGVF9CeXRlICAgIHRtcFs0XTsKLSAgICBGVF9VTG9uZyAgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggIUZUX1NUUkVBTV9SRUFEKCB0bXAsIGlkeC0+b2ZmX3NpemUgKSApCi0gICAgewotICAgICAgRlRfSW50ICBubjsKLQotCi0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgaWR4LT5vZmZfc2l6ZTsgbm4rKyApCi0gICAgICAgIHJlc3VsdCA9ICggcmVzdWx0IDw8IDggKSB8IHRtcFtubl07Ci0gICAgfQotCi0gICAgKmVycm9ycCA9IGVycm9yOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfaW5kZXhfaW5pdCggQ0ZGX0luZGV4ICBpZHgsCi0gICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgbG9hZCwKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgY2ZmMiApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfVUludCAgICBjb3VudDsKLQotCi0gICAgRlRfWkVSTyggaWR4ICk7Ci0KLSAgICBpZHgtPnN0cmVhbSA9IHN0cmVhbTsKLSAgICBpZHgtPnN0YXJ0ICA9IEZUX1NUUkVBTV9QT1MoKTsKLQotICAgIGlmICggY2ZmMiApCi0gICAgewotICAgICAgaWYgKCBGVF9SRUFEX1VMT05HKCBjb3VudCApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgaWR4LT5oZHJfc2l6ZSA9IDU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBjb3VudCApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgaWR4LT5oZHJfc2l6ZSA9IDM7Ci0gICAgfQotCi0gICAgaWYgKCBjb3VudCA+IDAgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgICBvZmZzaXplOwotICAgICAgRlRfVUxvbmcgIHNpemU7Ci0KLQotICAgICAgLyogdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQ7IHJlYWQgdGhlIG9mZnNldCBzaXplLCAgICAgICAgICAgKi8KLSAgICAgIC8qIHRoZW4gYWNjZXNzIHRoZSBvZmZzZXQgdGFibGUgdG8gY29tcHV0ZSB0aGUgaW5kZXgncyB0b3RhbCBzaXplICovCi0gICAgICBpZiAoIEZUX1JFQURfQllURSggb2Zmc2l6ZSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIG9mZnNpemUgPCAxIHx8IG9mZnNpemUgPiA0ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlkeC0+Y291bnQgICAgPSBjb3VudDsKLSAgICAgIGlkeC0+b2ZmX3NpemUgPSBvZmZzaXplOwotICAgICAgc2l6ZSAgICAgICAgICA9IChGVF9VTG9uZykoIGNvdW50ICsgMSApICogb2Zmc2l6ZTsKLQotICAgICAgaWR4LT5kYXRhX29mZnNldCA9IGlkeC0+c3RhcnQgKyBpZHgtPmhkcl9zaXplICsgc2l6ZTsKLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggc2l6ZSAtIG9mZnNpemUgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgc2l6ZSA9IGNmZl9pbmRleF9yZWFkX29mZnNldCggaWR4LCAmZXJyb3IgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggc2l6ZSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlkeC0+ZGF0YV9zaXplID0gLS1zaXplOwotCi0gICAgICBpZiAoIGxvYWQgKQotICAgICAgewotICAgICAgICAvKiBsb2FkIHRoZSBkYXRhICovCi0gICAgICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggc2l6ZSwgaWR4LT5ieXRlcyApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHNraXAgdGhlIGRhdGEgKi8KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggc2l6ZSApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9GUkVFKCBpZHgtPm9mZnNldHMgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX2luZGV4X2RvbmUoIENGRl9JbmRleCAgaWR4ICkKLSAgewotICAgIGlmICggaWR4LT5zdHJlYW0gKQotICAgIHsKLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gaWR4LT5zdHJlYW07Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICAgIGlmICggaWR4LT5ieXRlcyApCi0gICAgICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGlkeC0+Ynl0ZXMgKTsKLQotICAgICAgRlRfRlJFRSggaWR4LT5vZmZzZXRzICk7Ci0gICAgICBGVF9aRVJPKCBpZHggKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfaW5kZXhfbG9hZF9vZmZzZXRzKCBDRkZfSW5kZXggIGlkeCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGlkeC0+c3RyZWFtOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgIGlmICggaWR4LT5jb3VudCA+IDAgJiYgIWlkeC0+b2Zmc2V0cyApCi0gICAgewotICAgICAgRlRfQnl0ZSAgICBvZmZzaXplID0gaWR4LT5vZmZfc2l6ZTsKLSAgICAgIEZUX1VMb25nICAgZGF0YV9zaXplOwotICAgICAgRlRfQnl0ZSogICBwOwotICAgICAgRlRfQnl0ZSogICBwX2VuZDsKLSAgICAgIEZUX1VMb25nKiAgcG9mZjsKLQotCi0gICAgICBkYXRhX3NpemUgPSAoRlRfVUxvbmcpKCBpZHgtPmNvdW50ICsgMSApICogb2Zmc2l6ZTsKLQotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGlkeC0+b2Zmc2V0cywgaWR4LT5jb3VudCArIDEgKSB8fAotICAgICAgICAgICBGVF9TVFJFQU1fU0VFSyggaWR4LT5zdGFydCArIGlkeC0+aGRyX3NpemUgKSB8fAotICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggZGF0YV9zaXplICkgICAgICAgICAgICAgICAgICApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgcG9mZiAgID0gaWR4LT5vZmZzZXRzOwotICAgICAgcCAgICAgID0gKEZUX0J5dGUqKXN0cmVhbS0+Y3Vyc29yOwotICAgICAgcF9lbmQgID0gcCArIGRhdGFfc2l6ZTsKLQotICAgICAgc3dpdGNoICggb2Zmc2l6ZSApCi0gICAgICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGZvciAoIDsgcCA8IHBfZW5kOyBwKyssIHBvZmYrKyApCi0gICAgICAgICAgcG9mZlswXSA9IHBbMF07Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICAgIGZvciAoIDsgcCA8IHBfZW5kOyBwICs9IDIsIHBvZmYrKyApCi0gICAgICAgICAgcG9mZlswXSA9IEZUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDM6Ci0gICAgICAgIGZvciAoIDsgcCA8IHBfZW5kOyBwICs9IDMsIHBvZmYrKyApCi0gICAgICAgICAgcG9mZlswXSA9IEZUX1BFRUtfVU9GRjMoIHAgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZvciAoIDsgcCA8IHBfZW5kOyBwICs9IDQsIHBvZmYrKyApCi0gICAgICAgICAgcG9mZlswXSA9IEZUX1BFRUtfVUxPTkcoIHAgKTsKLSAgICAgIH0KLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIH0KLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfRlJFRSggaWR4LT5vZmZzZXRzICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIEFsbG9jYXRlIGEgdGFibGUgY29udGFpbmluZyBwb2ludGVycyB0byBhbiBpbmRleCdzIGVsZW1lbnRzLiAqLwotICAvKiBUaGUgYHBvb2wnIGFyZ3VtZW50IG1ha2VzIHRoaXMgZnVuY3Rpb24gY29udmVydCB0aGUgaW5kZXggICAgKi8KLSAgLyogZW50cmllcyB0byBDLXN0eWxlIHN0cmluZ3MgKHRoaXMgaXMsIE5VTEwtdGVybWluYXRlZCkuICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKCBDRkZfSW5kZXggICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiogIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogICBwb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICBwb29sX3NpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgICAgPSBpZHgtPnN0cmVhbS0+bWVtb3J5OwotCi0gICAgRlRfQnl0ZSoqICB0ICAgICAgICAgPSBOVUxMOwotICAgIEZUX0J5dGUqICAgbmV3X2J5dGVzID0gTlVMTDsKLSAgICBGVF9VTG9uZyAgIG5ld19zaXplOwotCi0KLSAgICAqdGFibGUgPSBOVUxMOwotCi0gICAgaWYgKCAhaWR4LT5vZmZzZXRzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGNmZl9pbmRleF9sb2FkX29mZnNldHMoIGlkeCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBuZXdfc2l6ZSA9IGlkeC0+ZGF0YV9zaXplICsgaWR4LT5jb3VudDsKLQotICAgIGlmICggaWR4LT5jb3VudCA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAhRlRfTkVXX0FSUkFZKCB0LCBpZHgtPmNvdW50ICsgMSApICAgICAgICAgICAgJiYKLSAgICAgICAgICggIXBvb2wgfHwgIUZUX0FMTE9DKCBuZXdfYnl0ZXMsIG5ld19zaXplICkgKSApCi0gICAgewotICAgICAgRlRfVUxvbmcgIG4sIGN1cl9vZmZzZXQ7Ci0gICAgICBGVF9VTG9uZyAgZXh0cmEgPSAwOwotICAgICAgRlRfQnl0ZSogIG9yZ19ieXRlcyA9IGlkeC0+Ynl0ZXM7Ci0KLQotICAgICAgLyogYXQgdGhpcyBwb2ludCwgYGlkeC0+b2Zmc2V0cycgY2FuJ3QgYmUgTlVMTCAqLwotICAgICAgY3VyX29mZnNldCA9IGlkeC0+b2Zmc2V0c1swXSAtIDE7Ci0KLSAgICAgIC8qIHNhbml0eSBjaGVjayAqLwotICAgICAgaWYgKCBjdXJfb2Zmc2V0ICE9IDAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAiY2ZmX2luZGV4X2dldF9wb2ludGVyczoiCi0gICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBmaXJzdCBvZmZzZXQgdmFsdWUgJWQgc2V0IHRvIHplcm9cbiIsCi0gICAgICAgICAgICAgICAgICAgIGN1cl9vZmZzZXQgKSk7Ci0gICAgICAgIGN1cl9vZmZzZXQgPSAwOwotICAgICAgfQotCi0gICAgICBpZiAoICFwb29sICkKLSAgICAgICAgdFswXSA9IG9yZ19ieXRlcyArIGN1cl9vZmZzZXQ7Ci0gICAgICBlbHNlCi0gICAgICAgIHRbMF0gPSBuZXdfYnl0ZXMgKyBjdXJfb2Zmc2V0OwotCi0gICAgICBmb3IgKCBuID0gMTsgbiA8PSBpZHgtPmNvdW50OyBuKysgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgbmV4dF9vZmZzZXQgPSBpZHgtPm9mZnNldHNbbl0gLSAxOwotCi0KLSAgICAgICAgLyogdHdvIHNhbml0eSBjaGVja3MgZm9yIGludmFsaWQgb2Zmc2V0IHRhYmxlcyAqLwotICAgICAgICBpZiAoIG5leHRfb2Zmc2V0IDwgY3VyX29mZnNldCApCi0gICAgICAgICAgbmV4dF9vZmZzZXQgPSBjdXJfb2Zmc2V0OwotICAgICAgICBlbHNlIGlmICggbmV4dF9vZmZzZXQgPiBpZHgtPmRhdGFfc2l6ZSApCi0gICAgICAgICAgbmV4dF9vZmZzZXQgPSBpZHgtPmRhdGFfc2l6ZTsKLQotICAgICAgICBpZiAoICFwb29sICkKLSAgICAgICAgICB0W25dID0gb3JnX2J5dGVzICsgbmV4dF9vZmZzZXQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRbbl0gPSBuZXdfYnl0ZXMgKyBuZXh0X29mZnNldCArIGV4dHJhOwotCi0gICAgICAgICAgaWYgKCBuZXh0X29mZnNldCAhPSBjdXJfb2Zmc2V0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9NRU1fQ09QWSggdFtuIC0gMV0sIG9yZ19ieXRlcyArIGN1cl9vZmZzZXQsIHRbbl0gLSB0W24gLSAxXSApOwotICAgICAgICAgICAgdFtuXVswXSA9ICdcMCc7Ci0gICAgICAgICAgICB0W25dICAgKz0gMTsKLSAgICAgICAgICAgIGV4dHJhKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY3VyX29mZnNldCA9IG5leHRfb2Zmc2V0OwotICAgICAgfQotICAgICAgKnRhYmxlID0gdDsKLQotICAgICAgaWYgKCBwb29sICkKLSAgICAgICAgKnBvb2wgPSBuZXdfYnl0ZXM7Ci0gICAgICBpZiAoIHBvb2xfc2l6ZSApCi0gICAgICAgICpwb29sX3NpemUgPSBuZXdfc2l6ZTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoIENGRl9JbmRleCAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHBieXRlX2xlbiApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggaWR4ICYmIGlkeC0+Y291bnQgPiBlbGVtZW50ICkKLSAgICB7Ci0gICAgICAvKiBjb21wdXRlIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0cyAqLwotICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBpZHgtPnN0cmVhbTsKLSAgICAgIEZUX1VMb25nICAgb2ZmMSwgb2ZmMiA9IDA7Ci0KLQotICAgICAgLyogbG9hZCBvZmZzZXRzIGZyb20gZmlsZSBvciB0aGUgb2Zmc2V0IHRhYmxlICovCi0gICAgICBpZiAoICFpZHgtPm9mZnNldHMgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgcG9zID0gZWxlbWVudCAqIGlkeC0+b2ZmX3NpemU7Ci0KLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBpZHgtPnN0YXJ0ICsgaWR4LT5oZHJfc2l6ZSArIHBvcyApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgb2ZmMSA9IGNmZl9pbmRleF9yZWFkX29mZnNldCggaWR4LCAmZXJyb3IgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggb2ZmMSAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudCsrOwotICAgICAgICAgICAgb2ZmMiA9IGNmZl9pbmRleF9yZWFkX29mZnNldCggaWR4LCAmZXJyb3IgKTsKLQotICAgICAgICAgIH0gd2hpbGUgKCBvZmYyID09IDAgJiYgZWxlbWVudCA8IGlkeC0+Y291bnQgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAgIC8qIHVzZSBvZmZzZXRzIHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIG9mZjEgPSBpZHgtPm9mZnNldHNbZWxlbWVudF07Ci0gICAgICAgIGlmICggb2ZmMSApCi0gICAgICAgIHsKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQrKzsKLSAgICAgICAgICAgIG9mZjIgPSBpZHgtPm9mZnNldHNbZWxlbWVudF07Ci0KLSAgICAgICAgICB9IHdoaWxlICggb2ZmMiA9PSAwICYmIGVsZW1lbnQgPCBpZHgtPmNvdW50ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogWFhYOiBzaG91bGQgY2hlY2sgb2ZmMiBkb2VzIG5vdCBleGNlZWQgdGhlIGVuZCBvZiB0aGlzIGVudHJ5OyAqLwotICAgICAgLyogICAgICBhdCBwcmVzZW50LCBvbmx5IHRydW5jYXRlIG9mZjIgYXQgdGhlIGVuZCBvZiB0aGlzIHN0cmVhbSAqLwotICAgICAgaWYgKCBvZmYyID4gc3RyZWFtLT5zaXplICsgMSAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgaWR4LT5kYXRhX29mZnNldCA+IHN0cmVhbS0+c2l6ZSAtIG9mZjIgKyAxICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50OiIKLSAgICAgICAgICAgICAgICAgICAiIG9mZnNldCB0byBuZXh0IGVudHJ5ICglZCkiCi0gICAgICAgICAgICAgICAgICAgIiBleGNlZWRzIHRoZSBlbmQgb2Ygc3RyZWFtICglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgb2ZmMiwgc3RyZWFtLT5zaXplIC0gaWR4LT5kYXRhX29mZnNldCArIDEgKSk7Ci0gICAgICAgIG9mZjIgPSBzdHJlYW0tPnNpemUgLSBpZHgtPmRhdGFfb2Zmc2V0ICsgMTsKLSAgICAgIH0KLQotICAgICAgLyogYWNjZXNzIGVsZW1lbnQgKi8KLSAgICAgIGlmICggb2ZmMSAmJiBvZmYyID4gb2ZmMSApCi0gICAgICB7Ci0gICAgICAgICpwYnl0ZV9sZW4gPSBvZmYyIC0gb2ZmMTsKLQotICAgICAgICBpZiAoIGlkeC0+Ynl0ZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhpcyBpbmRleCB3YXMgY29tcGxldGVseSBsb2FkZWQgaW4gbWVtb3J5LCB0aGF0J3MgZWFzeSAqLwotICAgICAgICAgICpwYnl0ZXMgPSBpZHgtPmJ5dGVzICsgb2ZmMSAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhpcyBpbmRleCBpcyBzdGlsbCBvbiBkaXNrL2ZpbGUsIGFjY2VzcyBpdCB0aHJvdWdoIGEgZnJhbWUgKi8KLSAgICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBpZHgtPmRhdGFfb2Zmc2V0ICsgb2ZmMSAtIDEgKSB8fAotICAgICAgICAgICAgICAgRlRfRlJBTUVfRVhUUkFDVCggb2ZmMiAtIG9mZjEsICpwYnl0ZXMgKSAgICAgICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBlbXB0eSBpbmRleCBlbGVtZW50ICovCi0gICAgICAgICpwYnl0ZXMgICAgPSAwOwotICAgICAgICAqcGJ5dGVfbGVuID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfaW5kZXhfZm9yZ2V0X2VsZW1lbnQoIENGRl9JbmRleCAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICkKLSAgewotICAgIGlmICggaWR4LT5ieXRlcyA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGlkeC0+c3RyZWFtOwotCi0KLSAgICAgIEZUX0ZSQU1FX1JFTEVBU0UoICpwYnl0ZXMgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGdldCBhbiBlbnRyeSBmcm9tIE5hbWUgSU5ERVggKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9TdHJpbmcqICkKLSAgY2ZmX2luZGV4X2dldF9uYW1lKCBDRkZfRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZWxlbWVudCApCi0gIHsKLSAgICBDRkZfSW5kZXggICBpZHggPSAmZm9udC0+bmFtZV9pbmRleDsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnk7Ci0gICAgRlRfQnl0ZSogICAgYnl0ZXM7Ci0gICAgRlRfVUxvbmcgICAgYnl0ZV9sZW47Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfU3RyaW5nKiAgbmFtZSA9IDA7Ci0KLQotICAgIGlmICggIWlkeC0+c3RyZWFtICkgIC8qIENGRjIgZG9lcyBub3QgaW5jbHVkZSBhIG5hbWUgaW5kZXggKi8KLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG1lbW9yeSA9IGlkeC0+c3RyZWFtLT5tZW1vcnk7Ci0KLSAgICBlcnJvciA9IGNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudCggaWR4LCBlbGVtZW50LCAmYnl0ZXMsICZieXRlX2xlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCAhRlRfQUxMT0MoIG5hbWUsIGJ5dGVfbGVuICsgMSApICkKLSAgICB7Ci0gICAgICBpZiAoIGJ5dGVfbGVuICkKLSAgICAgICAgRlRfTUVNX0NPUFkoIG5hbWUsIGJ5dGVzLCBieXRlX2xlbiApOwotICAgICAgbmFtZVtieXRlX2xlbl0gPSAwOwotICAgIH0KLSAgICBjZmZfaW5kZXhfZm9yZ2V0X2VsZW1lbnQoIGlkeCwgJmJ5dGVzICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0KLSAgLyogZ2V0IGFuIGVudHJ5IGZyb20gU3RyaW5nIElOREVYICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfU3RyaW5nKiApCi0gIGNmZl9pbmRleF9nZXRfc3RyaW5nKCBDRkZfRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBlbGVtZW50ICkKLSAgewotICAgIHJldHVybiAoIGVsZW1lbnQgPCBmb250LT5udW1fc3RyaW5ncyApCi0gICAgICAgICAgICAgPyAoRlRfU3RyaW5nKilmb250LT5zdHJpbmdzW2VsZW1lbnRdCi0gICAgICAgICAgICAgOiBOVUxMOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1N0cmluZyogKQotICBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIENGRl9Gb250ICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBzaWQgKQotICB7Ci0gICAgLyogdmFsdWUgMHhGRkZGVSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGRpY3Rpb25hcnkgZW50cnkgKi8KLSAgICBpZiAoIHNpZCA9PSAweEZGRkZVICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogaWYgaXQgaXMgbm90IGEgc3RhbmRhcmQgc3RyaW5nLCByZXR1cm4gaXQgKi8KLSAgICBpZiAoIHNpZCA+IDM5MCApCi0gICAgICByZXR1cm4gY2ZmX2luZGV4X2dldF9zdHJpbmcoIGZvbnQsIHNpZCAtIDM5MSApOwotCi0gICAgLyogQ0lELWtleWVkIENGRiBmb250cyBkb24ndCBoYXZlIGdseXBoIG5hbWVzICovCi0gICAgaWYgKCAhZm9udC0+cHNuYW1lcyApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIHRoaXMgaXMgYSBzdGFuZGFyZCBzdHJpbmcgKi8KLSAgICByZXR1cm4gKEZUX1N0cmluZyAqKWZvbnQtPnBzbmFtZXMtPmFkb2JlX3N0ZF9zdHJpbmdzKCBzaWQgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgIEZEIFNlbGVjdCB0YWJsZSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgdm9pZAotICBDRkZfRG9uZV9GRF9TZWxlY3QoIENGRl9GRFNlbGVjdCAgZmRzZWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICBzdHJlYW0gKQotICB7Ci0gICAgaWYgKCBmZHNlbGVjdC0+ZGF0YSApCi0gICAgICBGVF9GUkFNRV9SRUxFQVNFKCBmZHNlbGVjdC0+ZGF0YSApOwotCi0gICAgZmRzZWxlY3QtPmRhdGFfc2l6ZSAgID0gMDsKLSAgICBmZHNlbGVjdC0+Zm9ybWF0ICAgICAgPSAwOwotICAgIGZkc2VsZWN0LT5yYW5nZV9jb3VudCA9IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBDRkZfTG9hZF9GRF9TZWxlY3QoIENGRl9GRFNlbGVjdCAgZmRzZWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBudW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgb2Zmc2V0ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9CeXRlICAgZm9ybWF0OwotICAgIEZUX1VJbnQgICBudW1fcmFuZ2VzOwotCi0KLSAgICAvKiByZWFkIGZvcm1hdCAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG9mZnNldCApIHx8IEZUX1JFQURfQllURSggZm9ybWF0ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZmRzZWxlY3QtPmZvcm1hdCAgICAgID0gZm9ybWF0OwotICAgIGZkc2VsZWN0LT5jYWNoZV9jb3VudCA9IDA7ICAgLyogY2xlYXIgY2FjaGUgKi8KLQotICAgIHN3aXRjaCAoIGZvcm1hdCApCi0gICAgewotICAgIGNhc2UgMDogICAgIC8qIGZvcm1hdCAwLCB0aGF0J3Mgc2ltcGxlICovCi0gICAgICBmZHNlbGVjdC0+ZGF0YV9zaXplID0gbnVtX2dseXBoczsKLSAgICAgIGdvdG8gTG9hZF9EYXRhOwotCi0gICAgY2FzZSAzOiAgICAgLyogZm9ybWF0IDMsIGEgdGFkIG1vcmUgY29tcGxleCAqLwotICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbnVtX3JhbmdlcyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoICFudW1fcmFuZ2VzICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UwKCggIkNGRl9Mb2FkX0ZEX1NlbGVjdDogZW1wdHkgRkRTZWxlY3QgYXJyYXlcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBmZHNlbGVjdC0+ZGF0YV9zaXplID0gbnVtX3JhbmdlcyAqIDMgKyAyOwotCi0gICAgTG9hZF9EYXRhOgotICAgICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCBmZHNlbGVjdC0+ZGF0YV9zaXplLCBmZHNlbGVjdC0+ZGF0YSApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OiAgICAvKiBobW0uLi4gdGhhdCdzIHdyb25nICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0J5dGUgKQotICBjZmZfZmRfc2VsZWN0X2dldCggQ0ZGX0ZEU2VsZWN0ICBmZHNlbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXggKQotICB7Ci0gICAgRlRfQnl0ZSAgZmQgPSAwOwotCi0KLSAgICAvKiBpZiB0aGVyZSBpcyBubyBGRFNlbGVjdCwgcmV0dXJuIHplcm8gICAgICAgICAgICAgICAqLwotICAgIC8qIE5vdGU6IENGRjIgd2l0aCBqdXN0IG9uZSBGb250IERpY3QgaGFzIG5vIEZEU2VsZWN0ICovCi0gICAgaWYgKCAhZmRzZWxlY3QtPmRhdGEgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc3dpdGNoICggZmRzZWxlY3QtPmZvcm1hdCApCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGZkID0gZmRzZWxlY3QtPmRhdGFbZ2x5cGhfaW5kZXhdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBmaXJzdCwgY29tcGFyZSB0byB0aGUgY2FjaGUgKi8KLSAgICAgIGlmICggKEZUX1VJbnQpKCBnbHlwaF9pbmRleCAtIGZkc2VsZWN0LT5jYWNoZV9maXJzdCApIDwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZkc2VsZWN0LT5jYWNoZV9jb3VudCApCi0gICAgICB7Ci0gICAgICAgIGZkID0gZmRzZWxlY3QtPmNhY2hlX2ZkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLyogdGhlbiwgbG9vayB1cCB0aGUgcmFuZ2VzIGFycmF5ICovCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBwICAgICAgID0gZmRzZWxlY3QtPmRhdGE7Ci0gICAgICAgIEZUX0J5dGUqICBwX2xpbWl0ID0gcCArIGZkc2VsZWN0LT5kYXRhX3NpemU7Ci0gICAgICAgIEZUX0J5dGUgICBmZDI7Ci0gICAgICAgIEZUX1VJbnQgICBmaXJzdCwgbGltaXQ7Ci0KLQotICAgICAgICBmaXJzdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGdseXBoX2luZGV4IDwgZmlyc3QgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBmZDIgICA9ICpwKys7Ci0gICAgICAgICAgbGltaXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAgICAgaWYgKCBnbHlwaF9pbmRleCA8IGxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmZCA9IGZkMjsKLQotICAgICAgICAgICAgLyogdXBkYXRlIGNhY2hlICovCi0gICAgICAgICAgICBmZHNlbGVjdC0+Y2FjaGVfZmlyc3QgPSBmaXJzdDsKLSAgICAgICAgICAgIGZkc2VsZWN0LT5jYWNoZV9jb3VudCA9IGxpbWl0IC0gZmlyc3Q7Ci0gICAgICAgICAgICBmZHNlbGVjdC0+Y2FjaGVfZmQgICAgPSBmZDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmlyc3QgPSBsaW1pdDsKLQotICAgICAgICB9IHdoaWxlICggcCA8IHBfbGltaXQgKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZmQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICBDRkYgZm9udCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfY2hhcnNldF9jb21wdXRlX2NpZHMoIENGRl9DaGFyc2V0ICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEZUX1VJbnQgICAgaTsKLSAgICBGVF9Mb25nICAgIGo7Ci0gICAgRlRfVVNob3J0ICBtYXhfY2lkID0gMDsKLQotCi0gICAgaWYgKCBjaGFyc2V0LT5tYXhfY2lkID4gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9nbHlwaHM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBjaGFyc2V0LT5zaWRzW2ldID4gbWF4X2NpZCApCi0gICAgICAgIG1heF9jaWQgPSBjaGFyc2V0LT5zaWRzW2ldOwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBjaGFyc2V0LT5jaWRzLCAoRlRfVUxvbmcpbWF4X2NpZCArIDEgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBXaGVuIG11bHRpcGxlIEdJRHMgbWFwIHRvIHRoZSBzYW1lIENJRCwgd2UgY2hvb3NlIHRoZSBsb3dlc3QgKi8KLSAgICAvKiBHSUQuICBUaGlzIGlzIG5vdCBkZXNjcmliZWQgaW4gYW55IHNwZWMsIGJ1dCBpdCBtYXRjaGVzIHRoZSAgKi8KLSAgICAvKiBiZWhhdmlvdXIgb2YgcmVjZW50IEFjcm9yZWFkIHZlcnNpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmb3IgKCBqID0gKEZUX0xvbmcpbnVtX2dseXBocyAtIDE7IGogPj0gMDsgai0tICkKLSAgICAgIGNoYXJzZXQtPmNpZHNbY2hhcnNldC0+c2lkc1tqXV0gPSAoRlRfVVNob3J0KWo7Ci0KLSAgICBjaGFyc2V0LT5tYXhfY2lkICAgID0gbWF4X2NpZDsKLSAgICBjaGFyc2V0LT5udW1fZ2x5cGhzID0gbnVtX2dseXBoczsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VSW50ICkKLSAgY2ZmX2NoYXJzZXRfY2lkX3RvX2dpbmRleCggQ0ZGX0NoYXJzZXQgIGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBjaWQgKQotICB7Ci0gICAgRlRfVUludCAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCBjaWQgPD0gY2hhcnNldC0+bWF4X2NpZCApCi0gICAgICByZXN1bHQgPSBjaGFyc2V0LT5jaWRzW2NpZF07Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfY2hhcnNldF9mcmVlX2NpZHMoIENGRl9DaGFyc2V0ICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRlJFRSggY2hhcnNldC0+Y2lkcyApOwotICAgIGNoYXJzZXQtPm1heF9jaWQgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfY2hhcnNldF9kb25lKCBDRkZfQ2hhcnNldCAgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICBjZmZfY2hhcnNldF9mcmVlX2NpZHMoIGNoYXJzZXQsIG1lbW9yeSApOwotCi0gICAgRlRfRlJFRSggY2hhcnNldC0+c2lkcyApOwotICAgIGNoYXJzZXQtPmZvcm1hdCA9IDA7Ci0gICAgY2hhcnNldC0+b2Zmc2V0ID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9jaGFyc2V0X2xvYWQoIENGRl9DaGFyc2V0ICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgaW52ZXJ0ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVVNob3J0ICBnbHlwaF9zaWQ7Ci0KLQotICAgIC8qIElmIHRoZSBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIDIsIHdlIGhhdmUgdG8gcGFyc2UgdGhlIGNoYXJzZXQgKi8KLSAgICAvKiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBvZmZzZXQgPiAyICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBqOwotCi0KLSAgICAgIGNoYXJzZXQtPm9mZnNldCA9IGJhc2Vfb2Zmc2V0ICsgb2Zmc2V0OwotCi0gICAgICAvKiBHZXQgdGhlIGZvcm1hdCBvZiB0aGUgdGFibGUuICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBjaGFyc2V0LT5vZmZzZXQgKSB8fAotICAgICAgICAgICBGVF9SRUFEX0JZVEUoIGNoYXJzZXQtPmZvcm1hdCApICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc2lkcy4gKi8KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBjaGFyc2V0LT5zaWRzLCBudW1fZ2x5cGhzICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIGFzc2lnbiB0aGUgLm5vdGRlZiBnbHlwaCAqLwotICAgICAgY2hhcnNldC0+c2lkc1swXSA9IDA7Ci0KLSAgICAgIHN3aXRjaCAoIGNoYXJzZXQtPmZvcm1hdCApCi0gICAgICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIGlmICggbnVtX2dseXBocyA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggKCBudW1fZ2x5cGhzIC0gMSApICogMiApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIGZvciAoIGogPSAxOyBqIDwgbnVtX2dseXBoczsgaisrICkKLSAgICAgICAgICAgIGNoYXJzZXQtPnNpZHNbal0gPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMToKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIG5sZWZ0OwotICAgICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICAgIGogPSAxOwotCi0gICAgICAgICAgd2hpbGUgKCBqIDwgbnVtX2dseXBocyApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogUmVhZCB0aGUgZmlyc3QgZ2x5cGggc2lkIG9mIHRoZSByYW5nZS4gKi8KLSAgICAgICAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIGdseXBoX3NpZCApICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAvKiBSZWFkIHRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSByYW5nZS4gICovCi0gICAgICAgICAgICBpZiAoIGNoYXJzZXQtPmZvcm1hdCA9PSAyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbmxlZnQgKSApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIEZUX1JFQURfQllURSggbmxlZnQgKSApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB0cnkgdG8gcmVzY3VlIHNvbWUgb2YgdGhlIFNJRHMgaWYgYG5sZWZ0JyBpcyB0b28gbGFyZ2UgKi8KLSAgICAgICAgICAgIGlmICggZ2x5cGhfc2lkID4gMHhGRkZGTCAtIG5sZWZ0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2NoYXJzZXRfbG9hZDogaW52YWxpZCBTSUQgcmFuZ2UgdHJpbW1lZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIG5sZWZ0PSVkIC0+ICVkXG4iLCBubGVmdCwgMHhGRkZGTCAtIGdseXBoX3NpZCApKTsKLSAgICAgICAgICAgICAgbmxlZnQgPSAoIEZUX1VJbnQgKSggMHhGRkZGTCAtIGdseXBoX3NpZCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBGaWxsIGluIHRoZSByYW5nZSBvZiBzaWRzIC0tIGBubGVmdCArIDEnIGdseXBocy4gKi8KLSAgICAgICAgICAgIGZvciAoIGkgPSAwOyBqIDwgbnVtX2dseXBocyAmJiBpIDw9IG5sZWZ0OyBpKyssIGorKywgZ2x5cGhfc2lkKysgKQotICAgICAgICAgICAgICBjaGFyc2V0LT5zaWRzW2pdID0gZ2x5cGhfc2lkOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2NoYXJzZXRfbG9hZDogaW52YWxpZCB0YWJsZSBmb3JtYXRcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogUGFyc2UgZGVmYXVsdCB0YWJsZXMgY29ycmVzcG9uZGluZyB0byBvZmZzZXQgPT0gMCwgMSwgb3IgMi4gICovCi0gICAgICAvKiBDRkYgc3BlY2lmaWNhdGlvbiBpbnRpbWF0ZXMgdGhlIGZvbGxvd2luZzogICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogSW4gb3JkZXIgdG8gdXNlIGEgcHJlZGVmaW5lZCBjaGFyc2V0LCB0aGUgZm9sbG93aW5nIG11c3QgYmUgICovCi0gICAgICAvKiB0cnVlOiBUaGUgY2hhcnNldCBjb25zdHJ1Y3RlZCBmb3IgdGhlIGdseXBocyBpbiB0aGUgZm9udCdzICAgKi8KLSAgICAgIC8qIGNoYXJzdHJpbmdzIGRpY3Rpb25hcnkgbXVzdCBtYXRjaCB0aGUgcHJlZGVmaW5lZCBjaGFyc2V0IGluICAqLwotICAgICAgLyogdGhlIGZpcnN0IG51bV9nbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGNoYXJzZXQtPm9mZnNldCA9IG9mZnNldDsgIC8qIHJlY29yZCBjaGFyc2V0IHR5cGUgKi8KLQotICAgICAgc3dpdGNoICggKEZUX1VJbnQpb2Zmc2V0ICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgaWYgKCBudW1fZ2x5cGhzID4gMjI5ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggImNmZl9jaGFyc2V0X2xvYWQ6IGltcGxpY2l0IGNoYXJzZXQgbGFyZ2VyIHRoYW5cbiIKLSAgICAgICAgICAgICAgICAgICAgICJwcmVkZWZpbmVkIGNoYXJzZXQgKEFkb2JlIElTTy1MYXRpbilcbiIgKSk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc2lkcy4gKi8KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGNoYXJzZXQtPnNpZHMsIG51bV9nbHlwaHMgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIC8qIENvcHkgdGhlIHByZWRlZmluZWQgY2hhcnNldCBpbnRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAqLwotICAgICAgICBGVF9BUlJBWV9DT1BZKCBjaGFyc2V0LT5zaWRzLCBjZmZfaXNvYWRvYmVfY2hhcnNldCwgbnVtX2dseXBocyApOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmICggbnVtX2dseXBocyA+IDE2NiApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJjZmZfY2hhcnNldF9sb2FkOiBpbXBsaWNpdCBjaGFyc2V0IGxhcmdlciB0aGFuXG4iCi0gICAgICAgICAgICAgICAgICAgICAicHJlZGVmaW5lZCBjaGFyc2V0IChBZG9iZSBFeHBlcnQpXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHNpZHMuICovCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBjaGFyc2V0LT5zaWRzLCBudW1fZ2x5cGhzICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBDb3B5IHRoZSBwcmVkZWZpbmVkIGNoYXJzZXQgaW50byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gICAgICovCi0gICAgICAgIEZUX0FSUkFZX0NPUFkoIGNoYXJzZXQtPnNpZHMsIGNmZl9leHBlcnRfY2hhcnNldCwgbnVtX2dseXBocyApOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICAgIGlmICggbnVtX2dseXBocyA+IDg3ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggImNmZl9jaGFyc2V0X2xvYWQ6IGltcGxpY2l0IGNoYXJzZXQgbGFyZ2VyIHRoYW5cbiIKLSAgICAgICAgICAgICAgICAgICAgICJwcmVkZWZpbmVkIGNoYXJzZXQgKEFkb2JlIEV4cGVydCBTdWJzZXQpXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHNpZHMuICovCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBjaGFyc2V0LT5zaWRzLCBudW1fZ2x5cGhzICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBDb3B5IHRoZSBwcmVkZWZpbmVkIGNoYXJzZXQgaW50byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gICAgICovCi0gICAgICAgIEZUX0FSUkFZX0NPUFkoIGNoYXJzZXQtPnNpZHMsIGNmZl9leHBlcnRzdWJzZXRfY2hhcnNldCwgbnVtX2dseXBocyApOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB3ZSBoYXZlIHRvIGludmVydCB0aGUgYHNpZHMnIGFycmF5IGZvciBzdWJzZXR0ZWQgQ0lELWtleWVkIGZvbnRzICovCi0gICAgaWYgKCBpbnZlcnQgKQotICAgICAgZXJyb3IgPSBjZmZfY2hhcnNldF9jb21wdXRlX2NpZHMoIGNoYXJzZXQsIG51bV9nbHlwaHMsIG1lbW9yeSApOwotCi0gIEV4aXQ6Ci0gICAgLyogQ2xlYW4gdXAgaWYgdGhlcmUgd2FzIGFuIGVycm9yLiAqLwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGNoYXJzZXQtPnNpZHMgKTsKLSAgICAgIEZUX0ZSRUUoIGNoYXJzZXQtPmNpZHMgKTsKLSAgICAgIGNoYXJzZXQtPmZvcm1hdCA9IDA7Ci0gICAgICBjaGFyc2V0LT5vZmZzZXQgPSAwOwotICAgICAgY2hhcnNldC0+c2lkcyAgID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmZl92c3RvcmVfZG9uZSggQ0ZGX1ZTdG9yZVJlYyogIHZzdG9yZSwKLSAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgIC8qIGZyZWUgcmVnaW9uTGlzdCBhbmQgYXhpc0xpc3RzICovCi0gICAgaWYgKCB2c3RvcmUtPnZhclJlZ2lvbkxpc3QgKQotICAgIHsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgdnN0b3JlLT5yZWdpb25Db3VudDsgaSsrICkKLSAgICAgICAgRlRfRlJFRSggdnN0b3JlLT52YXJSZWdpb25MaXN0W2ldLmF4aXNMaXN0ICk7Ci0gICAgfQotICAgIEZUX0ZSRUUoIHZzdG9yZS0+dmFyUmVnaW9uTGlzdCApOwotCi0gICAgLyogZnJlZSB2YXJEYXRhIGFuZCBpbmRpY2VzICovCi0gICAgaWYgKCB2c3RvcmUtPnZhckRhdGEgKQotICAgIHsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgdnN0b3JlLT5kYXRhQ291bnQ7IGkrKyApCi0gICAgICAgIEZUX0ZSRUUoIHZzdG9yZS0+dmFyRGF0YVtpXS5yZWdpb25JbmRpY2VzICk7Ci0gICAgfQotICAgIEZUX0ZSRUUoIHZzdG9yZS0+dmFyRGF0YSApOwotICB9Ci0KLQotICAvKiBjb252ZXJ0IDIuMTQgdG8gRml4ZWQgKi8KLSAgI2RlZmluZSBGVF9mZG90MTRUb0ZpeGVkKCB4ICkgICggKEZUX0ZpeGVkKSggKEZUX1VMb25nKSh4KSA8PCAyICkgKQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl92c3RvcmVfbG9hZCggQ0ZGX1ZTdG9yZVJlYyogIHZzdG9yZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBiYXNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgb2Zmc2V0ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FUlIoIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgIEZUX1VMb25nKiAgZGF0YU9mZnNldEFycmF5ID0gTlVMTDsKLSAgICBGVF9VSW50ICAgIGksIGo7Ci0KLQotICAgIC8qIG5vIG9mZnNldCBtZWFucyBubyB2c3RvcmUgdG8gcGFyc2UgKi8KLSAgICBpZiAoIG9mZnNldCApCi0gICAgewotICAgICAgRlRfVUludCAgIHZzT2Zmc2V0OwotICAgICAgRlRfVUludCAgIGZvcm1hdDsKLSAgICAgIEZUX1VMb25nICByZWdpb25MaXN0T2Zmc2V0OwotCi0KLSAgICAgIC8qIHdlIG5lZWQgdG8gcGFyc2UgdGhlIHRhYmxlIHRvIGRldGVybWluZSBpdHMgc2l6ZTsgKi8KLSAgICAgIC8qIHNraXAgdGFibGUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGJhc2Vfb2Zmc2V0ICsgb2Zmc2V0ICkgfHwKLSAgICAgICAgICAgRlRfU1RSRUFNX1NLSVAoIDIgKSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIGFjdHVhbCB2YXJpYXRpb24gc3RvcmUgYmVnaW5zIGFmdGVyIHRoZSBsZW5ndGggKi8KLSAgICAgIHZzT2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgICAvKiBjaGVjayB0aGUgaGVhZGVyICovCi0gICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBmb3JtYXQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGlmICggZm9ybWF0ICE9IDEgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyogcmVhZCB0b3AgbGV2ZWwgZmllbGRzICovCi0gICAgICBpZiAoIEZUX1JFQURfVUxPTkcoIHJlZ2lvbkxpc3RPZmZzZXQgKSAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCB2c3RvcmUtPmRhdGFDb3VudCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBtYWtlIHRlbXBvcmFyeSBjb3B5IG9mIGl0ZW0gdmFyaWF0aW9uIGRhdGEgb2Zmc2V0czsgKi8KLSAgICAgIC8qIHdlJ2xsIHBhcnNlIHJlZ2lvbiBsaXN0IGZpcnN0LCB0aGVuIGNvbWUgYmFjayAgICAgICAqLwotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGRhdGFPZmZzZXRBcnJheSwgdnN0b3JlLT5kYXRhQ291bnQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCB2c3RvcmUtPmRhdGFDb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9SRUFEX1VMT05HKCBkYXRhT2Zmc2V0QXJyYXlbaV0gKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBwYXJzZSByZWdpb25MaXN0IGFuZCBheGlzTGlzdHMgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHZzT2Zmc2V0ICsgcmVnaW9uTGlzdE9mZnNldCApIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCB2c3RvcmUtPmF4aXNDb3VudCApICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggdnN0b3JlLT5yZWdpb25Db3VudCApICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCB2c3RvcmUtPnZhclJlZ2lvbkxpc3QsIHZzdG9yZS0+cmVnaW9uQ291bnQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCB2c3RvcmUtPnJlZ2lvbkNvdW50OyBpKysgKQotICAgICAgewotICAgICAgICBDRkZfVmFyUmVnaW9uKiAgcmVnaW9uID0gJnZzdG9yZS0+dmFyUmVnaW9uTGlzdFtpXTsKLQotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCByZWdpb24tPmF4aXNMaXN0LCB2c3RvcmUtPmF4aXNDb3VudCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCB2c3RvcmUtPmF4aXNDb3VudDsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIENGRl9BeGlzQ29vcmRzKiAgYXhpcyA9ICZyZWdpb24tPmF4aXNMaXN0W2pdOwotCi0gICAgICAgICAgRlRfSW50MTYgIHN0YXJ0MTQsIHBlYWsxNCwgZW5kMTQ7Ci0KLQotICAgICAgICAgIGlmICggRlRfUkVBRF9TSE9SVCggc3RhcnQxNCApIHx8Ci0gICAgICAgICAgICAgICBGVF9SRUFEX1NIT1JUKCBwZWFrMTQgKSAgfHwKLSAgICAgICAgICAgICAgIEZUX1JFQURfU0hPUlQoIGVuZDE0ICkgICApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBheGlzLT5zdGFydENvb3JkID0gRlRfZmRvdDE0VG9GaXhlZCggc3RhcnQxNCApOwotICAgICAgICAgIGF4aXMtPnBlYWtDb29yZCAgPSBGVF9mZG90MTRUb0ZpeGVkKCBwZWFrMTQgKTsKLSAgICAgICAgICBheGlzLT5lbmRDb29yZCAgID0gRlRfZmRvdDE0VG9GaXhlZCggZW5kMTQgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiB1c2UgZGF0YU9mZnNldEFycmF5IG5vdyB0byBwYXJzZSB2YXJEYXRhIGl0ZW1zICovCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggdnN0b3JlLT52YXJEYXRhLCB2c3RvcmUtPmRhdGFDb3VudCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IHZzdG9yZS0+ZGF0YUNvdW50OyBpKysgKQotICAgICAgewotICAgICAgICBDRkZfVmFyRGF0YSogIGRhdGEgPSAmdnN0b3JlLT52YXJEYXRhW2ldOwotCi0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggdnNPZmZzZXQgKyBkYXRhT2Zmc2V0QXJyYXlbaV0gKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIC8qIGlnbm9yZSBgaXRlbUNvdW50JyBhbmQgYHNob3J0RGVsdGFDb3VudCcgKi8KLSAgICAgICAgLyogYmVjYXVzZSBDRkYyIGhhcyBubyBkZWx0YSBzZXRzICAgICAgICAgICAqLwotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCA0ICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBOb3RlOiBqdXN0IHJlY29yZCB2YWx1ZXM7IGNvbnNpc3RlbmN5IGlzIGNoZWNrZWQgbGF0ZXIgICAgKi8KLSAgICAgICAgLyogICAgICAgYnkgY2ZmX2JsZW5kX2J1aWxkX3ZlY3RvciB3aGVuIGl0IGNvbnN1bWVzIGB2c3RvcmUnICovCi0KLSAgICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggZGF0YS0+cmVnaW9uSWR4Q291bnQgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBkYXRhLT5yZWdpb25JbmRpY2VzLCBkYXRhLT5yZWdpb25JZHhDb3VudCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBkYXRhLT5yZWdpb25JZHhDb3VudDsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIGRhdGEtPnJlZ2lvbkluZGljZXNbal0gKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICBFeGl0OgotICAgIEZUX0ZSRUUoIGRhdGFPZmZzZXRBcnJheSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgY2ZmX3ZzdG9yZV9kb25lKCB2c3RvcmUsIG1lbW9yeSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDbGVhciBibGVuZCBzdGFjayAoYWZ0ZXIgYmxlbmQgdmFsdWVzIGFyZSBjb25zdW1lZCkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVE9ETzogU2hvdWxkIGRvIHRoaXMgaW4gY2ZmX3J1bl9wYXJzZSwgYnV0IHN1YkZvbnQgICAqLwotICAvKiAgICAgICByZWYgaXMgbm90IGF2YWlsYWJsZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWxsb2NhdGlvbiBpcyBub3QgY2hhbmdlZCB3aGVuIHN0YWNrIGlzIGNsZWFyZWQuICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfYmxlbmRfY2xlYXIoIENGRl9TdWJGb250ICBzdWJGb250ICkKLSAgewotICAgIHN1YkZvbnQtPmJsZW5kX3RvcCAgPSBzdWJGb250LT5ibGVuZF9zdGFjazsKLSAgICBzdWJGb250LT5ibGVuZF91c2VkID0gMDsKLSAgfQotCi0KLSAgLyogQmxlbmQgbnVtT3BlcmFuZHMgb24gdGhlIHN0YWNrLCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogc3RvcmUgcmVzdWx0cyBpbnRvIHRoZSBmaXJzdCBudW1CbGVuZHMgdmFsdWVzLCAgICAgICAgKi8KLSAgLyogdGhlbiBwb3AgcmVtYWluaW5nIGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyBjb21wYXJhYmxlIHRvIGBjZjJfZG9CbGVuZCcgYnV0ICAgICAgICAgICAgICAgKi8KLSAgLyogdGhlIGNmZnBhcnNlIHN0YWNrIGlzIGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgd3JpdHRlbi4gKi8KLSAgLyogQmxlbmRlZCB2YWx1ZXMgYXJlIHdyaXR0ZW4gdG8gYSBkaWZmZXJlbnQgYnVmZmVyLCAgICAgKi8KLSAgLyogdXNpbmcgcmVzZXJ2ZWQgb3BlcmF0b3IgMjU1LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQmxlbmQgY2FsY3VsYXRpb24gaXMgZG9uZSBpbiAxNi4xNiBmaXhlZCBwb2ludC4gICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9ibGVuZF9kb0JsZW5kKCBDRkZfU3ViRm9udCAgc3ViRm9udCwKLSAgICAgICAgICAgICAgICAgICAgIENGRl9QYXJzZXIgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtQmxlbmRzICkKLSAgewotICAgIEZUX1VJbnQgIGRlbHRhOwotICAgIEZUX1VJbnQgIGJhc2U7Ci0gICAgRlRfVUludCAgaSwgajsKLSAgICBGVF9VSW50ICBzaXplOwotCi0gICAgQ0ZGX0JsZW5kICBibGVuZCA9ICZzdWJGb250LT5ibGVuZDsKLQotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3ViRm9udC0+YmxlbmQuZm9udC0+bWVtb3J5OyAvKiBmb3IgRlRfUkVBTExPQyAqLwotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAvKiBmb3IgRlRfUkVBTExPQyAqLwotCi0gICAgLyogY29tcHV0ZSBleHBlY3RlZCBudW1iZXIgb2Ygb3BlcmFuZHMgZm9yIHRoaXMgYmxlbmQgKi8KLSAgICBGVF9VSW50ICBudW1PcGVyYW5kcyA9IChGVF9VSW50KSggbnVtQmxlbmRzICogYmxlbmQtPmxlbkJWICk7Ci0gICAgRlRfVUludCAgY291bnQgICAgICAgPSAoRlRfVUludCkoIHBhcnNlci0+dG9wIC0gMSAtIHBhcnNlci0+c3RhY2sgKTsKLQotCi0gICAgaWYgKCBudW1PcGVyYW5kcyA+IGNvdW50ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTQoKCAiIGNmZl9ibGVuZF9kb0JsZW5kOiBTdGFjayB1bmRlcmZsb3cgJWQgYXJnc1xuIiwgY291bnQgKSk7Ci0KLSAgICAgIGVycm9yID0gRlRfVEhST1coIFN0YWNrX1VuZGVyZmxvdyApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSByb29tIGZvciBgbnVtQmxlbmRzJyB2YWx1ZXMgYXQgYGJsZW5kX3RvcCcgKi8KLSAgICBzaXplID0gNSAqIG51bUJsZW5kczsgICAgICAgICAgIC8qIGFkZCA1IGJ5dGVzIHBlciBlbnRyeSAgICAqLwotICAgIGlmICggc3ViRm9udC0+YmxlbmRfdXNlZCArIHNpemUgPiBzdWJGb250LT5ibGVuZF9hbGxvYyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGJsZW5kX3N0YWNrX29sZCA9IHN1YkZvbnQtPmJsZW5kX3N0YWNrOwotICAgICAgRlRfQnl0ZSogIGJsZW5kX3RvcF9vbGQgICA9IHN1YkZvbnQtPmJsZW5kX3RvcDsKLQotCi0gICAgICAvKiBpbmNyZWFzZSBvciBhbGxvY2F0ZSBgYmxlbmRfc3RhY2snIGFuZCByZXNldCBgYmxlbmRfdG9wJzsgKi8KLSAgICAgIC8qIHByZXBhcmUgdG8gYXBwZW5kIGBudW1CbGVuZHMnIHZhbHVlcyB0byB0aGUgYnVmZmVyICAgICAgICAqLwotICAgICAgaWYgKCBGVF9SRUFMTE9DKCBzdWJGb250LT5ibGVuZF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgc3ViRm9udC0+YmxlbmRfYWxsb2MsCi0gICAgICAgICAgICAgICAgICAgICAgIHN1YkZvbnQtPmJsZW5kX2FsbG9jICsgc2l6ZSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBzdWJGb250LT5ibGVuZF90b3AgICAgPSBzdWJGb250LT5ibGVuZF9zdGFjayArIHN1YkZvbnQtPmJsZW5kX3VzZWQ7Ci0gICAgICBzdWJGb250LT5ibGVuZF9hbGxvYyArPSBzaXplOwotCi0gICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHBhcnNlciBzdGFjayBhbmQgYWRqdXN0IHBvaW50ZXJzICovCi0gICAgICAvKiBpZiB0aGUgcmVhbGxvY2F0ZWQgYnVmZmVyIGhhcyBhIGRpZmZlcmVudCBhZGRyZXNzICovCi0gICAgICBpZiAoIGJsZW5kX3N0YWNrX29sZCAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBzdWJGb250LT5ibGVuZF9zdGFjayAhPSBibGVuZF9zdGFja19vbGQgKQotICAgICAgewotICAgICAgICBGVF9QdHJEaXN0ICBvZmZzZXQgPSBzdWJGb250LT5ibGVuZF9zdGFjayAtIGJsZW5kX3N0YWNrX29sZDsKLSAgICAgICAgRlRfQnl0ZSoqICAgcDsKLQotCi0gICAgICAgIGZvciAoIHAgPSBwYXJzZXItPnN0YWNrOyBwIDwgcGFyc2VyLT50b3A7IHArKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICpwID49IGJsZW5kX3N0YWNrX29sZCAmJiAqcCA8IGJsZW5kX3RvcF9vbGQgKQotICAgICAgICAgICAgKnAgKz0gb2Zmc2V0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHN1YkZvbnQtPmJsZW5kX3VzZWQgKz0gc2l6ZTsKLQotICAgIGJhc2UgID0gY291bnQgLSBudW1PcGVyYW5kczsgICAgIC8qIGluZGV4IG9mIGZpcnN0IGJsZW5kIGFyZyAqLwotICAgIGRlbHRhID0gYmFzZSArIG51bUJsZW5kczsgICAgICAgIC8qIGluZGV4IG9mIGZpcnN0IGRlbHRhIGFyZyAqLwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1CbGVuZHM7IGkrKyApCi0gICAgewotICAgICAgY29uc3QgRlRfSW50MzIqICB3ZWlnaHQgPSAmYmxlbmQtPkJWWzFdOwotICAgICAgRlRfSW50MzIgICAgICAgICBzdW07Ci0KLQotICAgICAgLyogY29udmVydCBpbnB1dHMgdG8gMTYuMTYgZml4ZWQgcG9pbnQgKi8KLSAgICAgIHN1bSA9IGNmZl9wYXJzZV9udW0oIHBhcnNlciwgJnBhcnNlci0+c3RhY2tbaSArIGJhc2VdICkgKiA2NTUzNjsKLQotICAgICAgZm9yICggaiA9IDE7IGogPCBibGVuZC0+bGVuQlY7IGorKyApCi0gICAgICAgIHN1bSA9IEFERF9JTlQzMigKLSAgICAgICAgICAgICAgICBzdW0sCi0gICAgICAgICAgICAgICAgRlRfTXVsRml4KAotICAgICAgICAgICAgICAgICAgKndlaWdodCsrLAotICAgICAgICAgICAgICAgICAgY2ZmX3BhcnNlX251bSggcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNlci0+c3RhY2tbZGVsdGErK10gKSAqIDY1NTM2ICkgKTsKLQotICAgICAgLyogcG9pbnQgcGFyc2VyIHN0YWNrIHRvIG5ldyB2YWx1ZSBvbiBibGVuZF9zdGFjayAqLwotICAgICAgcGFyc2VyLT5zdGFja1tpICsgYmFzZV0gPSBzdWJGb250LT5ibGVuZF90b3A7Ci0KLSAgICAgIC8qIFB1c2ggYmxlbmRlZCByZXN1bHQgYXMgVHlwZSAyIDUtYnl0ZSBmaXhlZCBwb2ludCBudW1iZXIuICBUaGlzICovCi0gICAgICAvKiB3aWxsIG5vdCBjb25mbGljdCB3aXRoIGFjdHVhbCBESUNUcyBiZWNhdXNlIDI1NSBpcyBhIHJlc2VydmVkICAqLwotICAgICAgLyogb3Bjb2RlIGluIGJvdGggQ0ZGIGFuZCBDRkYyIERJQ1RzLiAgU2VlIGBjZmZfcGFyc2VfbnVtJyBmb3IgICAgKi8KLSAgICAgIC8qIGRlY29kZSBvZiB0aGlzLCB3aGljaCByb3VuZHMgdG8gYW4gaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAqc3ViRm9udC0+YmxlbmRfdG9wKysgPSAyNTU7Ci0gICAgICAqc3ViRm9udC0+YmxlbmRfdG9wKysgPSAoIChGVF9VSW50MzIpc3VtICYgMHhGRjAwMDAwMFUgKSA+PiAyNDsKLSAgICAgICpzdWJGb250LT5ibGVuZF90b3ArKyA9ICggKEZUX1VJbnQzMilzdW0gJiAweDAwRkYwMDAwVSApID4+IDE2OwotICAgICAgKnN1YkZvbnQtPmJsZW5kX3RvcCsrID0gKCAoRlRfVUludDMyKXN1bSAmIDB4MDAwMEZGMDBVICkgPj4gIDg7Ci0gICAgICAqc3ViRm9udC0+YmxlbmRfdG9wKysgPSAgIChGVF9VSW50MzIpc3VtICYgMHgwMDAwMDBGRlU7Ci0gICAgfQotCi0gICAgLyogbGVhdmUgb25seSBudW1CbGVuZHMgcmVzdWx0cyBvbiBwYXJzZXIgc3RhY2sgKi8KLSAgICBwYXJzZXItPnRvcCA9ICZwYXJzZXItPnN0YWNrW2Jhc2UgKyBudW1CbGVuZHNdOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDb21wdXRlIGEgYmxlbmQgdmVjdG9yIGZyb20gdmFyaWF0aW9uIHN0b3JlIGluZGV4IGFuZCBub3JtYWxpemVkICAqLwotICAvKiB2ZWN0b3IgYmFzZWQgb24gcHNldWRvLWNvZGUgaW4gT3BlblR5cGUgRm9udCBWYXJpYXRpb25zIE92ZXJ2aWV3LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlOiBsZW5ORFYgPT0gMCBwcm9kdWNlcyBhIGRlZmF1bHQgYmxlbmQgdmVjdG9yLCAoMSwwLDAsLi4uKS4gICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2JsZW5kX2J1aWxkX3ZlY3RvciggQ0ZGX0JsZW5kICBibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICB2c2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGxlbk5EViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBORFYgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7ICAgICAgICAgICAgLyogZm9yIEZUX1JFQUxMT0MgKi8KLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGJsZW5kLT5mb250LT5tZW1vcnk7ICAvKiBmb3IgRlRfUkVBTExPQyAqLwotCi0gICAgRlRfVUludCAgICAgICBsZW47Ci0gICAgQ0ZGX1ZTdG9yZSAgICB2czsKLSAgICBDRkZfVmFyRGF0YSogIHZhckRhdGE7Ci0gICAgRlRfVUludCAgICAgICBtYXN0ZXI7Ci0KLQotICAgIEZUX0FTU0VSVCggbGVuTkRWID09IDAgfHwgTkRWICk7Ci0KLSAgICBibGVuZC0+YnVpbHRCViA9IEZBTFNFOwotCi0gICAgdnMgPSAmYmxlbmQtPmZvbnQtPnZzdG9yZTsKLQotICAgIC8qIFZTdG9yZSBhbmQgZnZhciBtdXN0IGJlIGNvbnNpc3RlbnQgKi8KLSAgICBpZiAoIGxlbk5EViAhPSAwICYmIGxlbk5EViAhPSB2cy0+YXhpc0NvdW50ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTQoKCAiIGNmZl9ibGVuZF9idWlsZF92ZWN0b3I6IEF4aXMgY291bnQgbWlzbWF0Y2hcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCB2c2luZGV4ID49IHZzLT5kYXRhQ291bnQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNCgoICIgY2ZmX2JsZW5kX2J1aWxkX3ZlY3RvcjogdnNpbmRleCBvdXQgb2YgcmFuZ2VcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogc2VsZWN0IHRoZSBpdGVtIHZhcmlhdGlvbiBkYXRhIHN0cnVjdHVyZSAqLwotICAgIHZhckRhdGEgPSAmdnMtPnZhckRhdGFbdnNpbmRleF07Ci0KLSAgICAvKiBwcmVwYXJlIGJ1ZmZlciBmb3IgdGhlIGJsZW5kIHZlY3RvciAqLwotICAgIGxlbiA9IHZhckRhdGEtPnJlZ2lvbklkeENvdW50ICsgMTsgICAgLyogYWRkIDEgZm9yIGRlZmF1bHQgY29tcG9uZW50ICovCi0gICAgaWYgKCBGVF9SRUFMTE9DKCBibGVuZC0+QlYsCi0gICAgICAgICAgICAgICAgICAgICBibGVuZC0+bGVuQlYgKiBzaXplb2YoICpibGVuZC0+QlYgKSwKLSAgICAgICAgICAgICAgICAgICAgIGxlbiAqIHNpemVvZiggKmJsZW5kLT5CViApICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgYmxlbmQtPmxlbkJWID0gbGVuOwotCi0gICAgLyogb3V0ZXIgbG9vcCBzdGVwcyB0aHJvdWdoIG1hc3RlciBkZXNpZ25zIHRvIGJlIGJsZW5kZWQgKi8KLSAgICBmb3IgKCBtYXN0ZXIgPSAwOyBtYXN0ZXIgPCBsZW47IG1hc3RlcisrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICAgICAgajsKLSAgICAgIEZUX1VJbnQgICAgICAgICBpZHg7Ci0gICAgICBDRkZfVmFyUmVnaW9uKiAgdmFyUmVnaW9uOwotCi0KLSAgICAgIC8qIGRlZmF1bHQgZmFjdG9yIGlzIGFsd2F5cyBvbmUgKi8KLSAgICAgIGlmICggbWFzdGVyID09IDAgKQotICAgICAgewotICAgICAgICBibGVuZC0+QlZbbWFzdGVyXSA9IEZUX0ZJWEVEX09ORTsKLSAgICAgICAgRlRfVFJBQ0U0KCggIiAgIGJ1aWxkIGJsZW5kIHZlY3RvciBsZW4gJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgIFsgJWYgIiwKLSAgICAgICAgICAgICAgICAgICAgbGVuLAotICAgICAgICAgICAgICAgICAgICBibGVuZC0+QlZbbWFzdGVyXSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiBWU3RvcmUgYXJyYXkgZG9lcyBub3QgaW5jbHVkZSBkZWZhdWx0IG1hc3Rlciwgc28gc3VidHJhY3Qgb25lICovCi0gICAgICBpZHggICAgICAgPSB2YXJEYXRhLT5yZWdpb25JbmRpY2VzW21hc3RlciAtIDFdOwotICAgICAgdmFyUmVnaW9uID0gJnZzLT52YXJSZWdpb25MaXN0W2lkeF07Ci0KLSAgICAgIGlmICggaWR4ID49IHZzLT5yZWdpb25Db3VudCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNCgoICIgY2ZmX2JsZW5kX2J1aWxkX3ZlY3RvcjoiCi0gICAgICAgICAgICAgICAgICAgICIgcmVnaW9uIGluZGV4IG91dCBvZiByYW5nZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdGU6IGBsZW5ORFYnIGNvdWxkIGJlIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgIEluIHRoYXQgY2FzZSwgYnVpbGQgZGVmYXVsdCBibGVuZCB2ZWN0b3IgKDEsMCwwLi4uKS4gKi8KLSAgICAgIGlmICggIWxlbk5EViApCi0gICAgICB7Ci0gICAgICAgIGJsZW5kLT5CVlttYXN0ZXJdID0gMDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEluIHRoZSBub3JtYWwgY2FzZSwgaW5pdGlhbGl6ZSBlYWNoIGNvbXBvbmVudCB0byAxICovCi0gICAgICAvKiBiZWZvcmUgaW5uZXIgbG9vcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgYmxlbmQtPkJWW21hc3Rlcl0gPSBGVF9GSVhFRF9PTkU7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgLyogaW5uZXIgbG9vcCBzdGVwcyB0aHJvdWdoIGF4ZXMgaW4gdGhpcyByZWdpb24gKi8KLSAgICAgIGZvciAoIGogPSAwOyBqIDwgbGVuTkRWOyBqKysgKQotICAgICAgewotICAgICAgICBDRkZfQXhpc0Nvb3JkcyogIGF4aXMgPSAmdmFyUmVnaW9uLT5heGlzTGlzdFtqXTsKLSAgICAgICAgRlRfRml4ZWQgICAgICAgICBheGlzU2NhbGFyOwotCi0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgc2NhbGFyIGNvbnRyaWJ1dGlvbiBvZiB0aGlzIGF4aXM7ICovCi0gICAgICAgIC8qIGlnbm9yZSBpbnZhbGlkIHJhbmdlcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGF4aXMtPnN0YXJ0Q29vcmQgPiBheGlzLT5wZWFrQ29vcmQgfHwKLSAgICAgICAgICAgICBheGlzLT5wZWFrQ29vcmQgPiBheGlzLT5lbmRDb29yZCAgICkKLSAgICAgICAgICBheGlzU2NhbGFyID0gRlRfRklYRURfT05FOwotCi0gICAgICAgIGVsc2UgaWYgKCBheGlzLT5zdGFydENvb3JkIDwgMCAmJgotICAgICAgICAgICAgICAgICAgYXhpcy0+ZW5kQ29vcmQgPiAwICAgJiYKLSAgICAgICAgICAgICAgICAgIGF4aXMtPnBlYWtDb29yZCAhPSAwICkKLSAgICAgICAgICBheGlzU2NhbGFyID0gRlRfRklYRURfT05FOwotCi0gICAgICAgIC8qIHBlYWsgb2YgMCBtZWFucyBpZ25vcmUgdGhpcyBheGlzICovCi0gICAgICAgIGVsc2UgaWYgKCBheGlzLT5wZWFrQ29vcmQgPT0gMCApCi0gICAgICAgICAgYXhpc1NjYWxhciA9IEZUX0ZJWEVEX09ORTsKLQotICAgICAgICAvKiBpZ25vcmUgdGhpcyByZWdpb24gaWYgY29vcmRzIGFyZSBvdXQgb2YgcmFuZ2UgKi8KLSAgICAgICAgZWxzZSBpZiAoIE5EVltqXSA8IGF4aXMtPnN0YXJ0Q29vcmQgfHwKLSAgICAgICAgICAgICAgICAgIE5EVltqXSA+IGF4aXMtPmVuZENvb3JkICAgKQotICAgICAgICAgIGF4aXNTY2FsYXIgPSAwOwotCi0gICAgICAgIC8qIGNhbGN1bGF0ZSBhIHByb3BvcnRpb25hbCBmYWN0b3IgKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBORFZbal0gPT0gYXhpcy0+cGVha0Nvb3JkICkKLSAgICAgICAgICAgIGF4aXNTY2FsYXIgPSBGVF9GSVhFRF9PTkU7Ci0gICAgICAgICAgZWxzZSBpZiAoIE5EVltqXSA8IGF4aXMtPnBlYWtDb29yZCApCi0gICAgICAgICAgICBheGlzU2NhbGFyID0gRlRfRGl2Rml4KCBORFZbal0gLSBheGlzLT5zdGFydENvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy0+cGVha0Nvb3JkIC0gYXhpcy0+c3RhcnRDb29yZCApOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF4aXNTY2FsYXIgPSBGVF9EaXZGaXgoIGF4aXMtPmVuZENvb3JkIC0gTkRWW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy0+ZW5kQ29vcmQgLSBheGlzLT5wZWFrQ29vcmQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRha2UgcHJvZHVjdCBvZiBhbGwgdGhlIGF4aXMgc2NhbGFycyAqLwotICAgICAgICBibGVuZC0+QlZbbWFzdGVyXSA9IEZUX011bEZpeCggYmxlbmQtPkJWW21hc3Rlcl0sIGF4aXNTY2FsYXIgKTsKLSAgICAgIH0KLQotICAgICAgRlRfVFJBQ0U0KCggIiwgJWYgIiwKLSAgICAgICAgICAgICAgICAgIGJsZW5kLT5CVlttYXN0ZXJdIC8gNjU1MzYuMCApKTsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTQoKCAiXVxuIiApKTsKLQotICAgIC8qIHJlY29yZCB0aGUgcGFyYW1ldGVycyB1c2VkIHRvIGJ1aWxkIHRoZSBibGVuZCB2ZWN0b3IgKi8KLSAgICBibGVuZC0+bGFzdFZzaW5kZXggPSB2c2luZGV4OwotCi0gICAgaWYgKCBsZW5ORFYgIT0gMCApCi0gICAgewotICAgICAgLyogdXNlciBoYXMgc2V0IGEgbm9ybWFsaXplZCB2ZWN0b3IgKi8KLSAgICAgIGlmICggRlRfUkVBTExPQyggYmxlbmQtPmxhc3RORFYsCi0gICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT5sZW5ORFYgKiBzaXplb2YgKCAqTkRWICksCi0gICAgICAgICAgICAgICAgICAgICAgIGxlbk5EViAqIHNpemVvZiAoICpORFYgKSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBGVF9NRU1fQ09QWSggYmxlbmQtPmxhc3RORFYsCi0gICAgICAgICAgICAgICAgICAgTkRWLAotICAgICAgICAgICAgICAgICAgIGxlbk5EViAqIHNpemVvZiAoICpORFYgKSApOwotICAgIH0KLQotICAgIGJsZW5kLT5sZW5ORFYgID0gbGVuTkRWOwotICAgIGJsZW5kLT5idWlsdEJWID0gVFJVRTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogYGxlbk5EVicgaXMgemVybyBmb3IgZGVmYXVsdCB2ZWN0b3I7ICAgICAgICAgICAqLwotICAvKiByZXR1cm4gVFJVRSBpZiBibGVuZCB2ZWN0b3IgbmVlZHMgdG8gYmUgYnVpbHQuICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIGNmZl9ibGVuZF9jaGVja192ZWN0b3IoIENGRl9CbGVuZCAgYmxlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdnNpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBsZW5ORFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgTkRWICkKLSAgewotICAgIGlmICggIWJsZW5kLT5idWlsdEJWICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgYmxlbmQtPmxhc3RWc2luZGV4ICE9IHZzaW5kZXggICAgICAgICAgICAgICB8fAotICAgICAgICAgYmxlbmQtPmxlbk5EViAhPSBsZW5ORFYgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgKCBsZW5ORFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgbWVtY21wKCBORFYsCi0gICAgICAgICAgICAgICAgICAgYmxlbmQtPmxhc3RORFYsCi0gICAgICAgICAgICAgICAgICAgbGVuTkRWICogc2l6ZW9mICggKk5EViApICkgIT0gMCApICkKLSAgICB7Ci0gICAgICAvKiBuZWVkIHRvIGJ1aWxkIGJsZW5kIHZlY3RvciAqLwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2dldF92YXJfYmxlbmQoIENGRl9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgKm51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogICAqY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICAgKm5vcm1hbGl6ZWRjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbW1fdmFyICkKLSAgewotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBtbSA9IChGVF9TZXJ2aWNlX011bHRpTWFzdGVycylmYWNlLT5tbTsKLQotCi0gICAgcmV0dXJuIG1tLT5nZXRfdmFyX2JsZW5kKCBGVF9GQUNFKCBmYWNlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZGNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX3ZhciApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZG9uZV9ibGVuZCggQ0ZGX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIG1tID0gKEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzKWZhY2UtPm1tOwotCi0KLSAgICBtbS0+ZG9uZV9ibGVuZCggRlRfRkFDRSggZmFjZSApICk7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmZl9lbmNvZGluZ19kb25lKCBDRkZfRW5jb2RpbmcgIGVuY29kaW5nICkKLSAgewotICAgIGVuY29kaW5nLT5mb3JtYXQgPSAwOwotICAgIGVuY29kaW5nLT5vZmZzZXQgPSAwOwotICAgIGVuY29kaW5nLT5jb3VudCAgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX2VuY29kaW5nX2xvYWQoIENGRl9FbmNvZGluZyAgZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICBDRkZfQ2hhcnNldCAgIGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIG51bV9nbHlwaHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgYmFzZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIG9mZnNldCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1VJbnQgICAgY291bnQ7Ci0gICAgRlRfVUludCAgICBqOwotICAgIEZUX1VTaG9ydCAgZ2x5cGhfc2lkOwotICAgIEZUX1VJbnQgICAgZ2x5cGhfY29kZTsKLQotCi0gICAgLyogQ2hlY2sgZm9yIGNoYXJzZXQtPnNpZHMuICBJZiB3ZSBkbyBub3QgaGF2ZSB0aGlzLCB3ZSBmYWlsLiAqLwotICAgIGlmICggIWNoYXJzZXQtPnNpZHMgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBaZXJvIG91dCB0aGUgY29kZSB0byBnaWQvc2lkIG1hcHBpbmdzLiAqLwotICAgIGZvciAoIGogPSAwOyBqIDwgMjU2OyBqKysgKQotICAgIHsKLSAgICAgIGVuY29kaW5nLT5zaWRzIFtqXSA9IDA7Ci0gICAgICBlbmNvZGluZy0+Y29kZXNbal0gPSAwOwotICAgIH0KLQotICAgIC8qIE5vdGU6IFRoZSBlbmNvZGluZyB0YWJsZSBpbiBhIENGRiBmb250IGlzIGluZGV4ZWQgYnkgZ2x5cGggaW5kZXg7ICAqLwotICAgIC8qIHRoZSBmaXJzdCBlbmNvZGVkIGdseXBoIGluZGV4IGlzIDEuICBIZW5jZSwgd2UgcmVhZCB0aGUgY2hhcmFjdGVyICAqLwotICAgIC8qIGNvZGUgKGBnbHlwaF9jb2RlJykgYXQgaW5kZXggaiBhbmQgbWFrZSB0aGUgYXNzaWdubWVudDogICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIGVuY29kaW5nLT5jb2Rlc1tnbHlwaF9jb2RlXSA9IGogKyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIGFsc28gbWFrZSB0aGUgYXNzaWdubWVudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIGVuY29kaW5nLT5zaWRzW2dseXBoX2NvZGVdID0gY2hhcnNldC0+c2lkc1tqICsgMV0gICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoaXMgZ2l2ZXMgdXMgYm90aCBhIGNvZGUgdG8gR0lEIGFuZCBhIGNvZGUgdG8gU0lEIG1hcHBpbmcuICAgICAgICAqLwotCi0gICAgaWYgKCBvZmZzZXQgPiAxICkKLSAgICB7Ci0gICAgICBlbmNvZGluZy0+b2Zmc2V0ID0gYmFzZV9vZmZzZXQgKyBvZmZzZXQ7Ci0KLSAgICAgIC8qIHdlIG5lZWQgdG8gcGFyc2UgdGhlIHRhYmxlIHRvIGRldGVybWluZSBpdHMgc2l6ZSAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZW5jb2RpbmctPm9mZnNldCApIHx8Ci0gICAgICAgICAgIEZUX1JFQURfQllURSggZW5jb2RpbmctPmZvcm1hdCApICAgfHwKLSAgICAgICAgICAgRlRfUkVBRF9CWVRFKCBjb3VudCApICAgICAgICAgICAgICApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgc3dpdGNoICggZW5jb2RpbmctPmZvcm1hdCAmIDB4N0YgKQotICAgICAgewotICAgICAgY2FzZSAwOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIHA7Ci0KLQotICAgICAgICAgIC8qIEJ5IGNvbnZlbnRpb24sIEdJRCAwIGlzIGFsd2F5cyAiLm5vdGRlZiIgYW5kIGlzIG5ldmVyICovCi0gICAgICAgICAgLyogY29kZWQgaW4gdGhlIGZvbnQuICBIZW5jZSwgdGhlIG51bWJlciBvZiBjb2RlcyBmb3VuZCAgKi8KLSAgICAgICAgICAvKiBpbiB0aGUgdGFibGUgaXMgYGNvdW50KzEnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgZW5jb2RpbmctPmNvdW50ID0gY291bnQgKyAxOwotCi0gICAgICAgICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggY291bnQgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBwID0gKEZUX0J5dGUqKXN0cmVhbS0+Y3Vyc29yOwotCi0gICAgICAgICAgZm9yICggaiA9IDE7IGogPD0gY291bnQ7IGorKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2x5cGhfY29kZSA9ICpwKys7Ci0KLSAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSBqIGlzIG5vdCB0b28gYmlnLiAqLwotICAgICAgICAgICAgaWYgKCBqIDwgbnVtX2dseXBocyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIEFzc2lnbiBjb2RlIHRvIEdJRCBtYXBwaW5nLiAqLwotICAgICAgICAgICAgICBlbmNvZGluZy0+Y29kZXNbZ2x5cGhfY29kZV0gPSAoRlRfVVNob3J0KWo7Ci0KLSAgICAgICAgICAgICAgLyogQXNzaWduIGNvZGUgdG8gU0lEIG1hcHBpbmcuICovCi0gICAgICAgICAgICAgIGVuY29kaW5nLT5zaWRzW2dseXBoX2NvZGVdID0gY2hhcnNldC0+c2lkc1tqXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMToKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIG5sZWZ0OwotICAgICAgICAgIEZUX1VJbnQgIGkgPSAxOwotICAgICAgICAgIEZUX1VJbnQgIGs7Ci0KLQotICAgICAgICAgIGVuY29kaW5nLT5jb3VudCA9IDA7Ci0KLSAgICAgICAgICAvKiBQYXJzZSB0aGUgRm9ybWF0MSByYW5nZXMuICovCi0gICAgICAgICAgZm9yICggaiA9IDA7ICBqIDwgY291bnQ7IGorKywgaSArPSBubGVmdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogUmVhZCB0aGUgZmlyc3QgZ2x5cGggY29kZSBvZiB0aGUgcmFuZ2UuICovCi0gICAgICAgICAgICBpZiAoIEZUX1JFQURfQllURSggZ2x5cGhfY29kZSApICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAvKiBSZWFkIHRoZSBudW1iZXIgb2YgY29kZXMgaW4gdGhlIHJhbmdlLiAqLwotICAgICAgICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIG5sZWZ0ICkgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIC8qIEluY3JlbWVudCBubGVmdCwgc28gd2UgcmVhZCBgbmxlZnQgKyAxJyBjb2Rlcy9zaWRzLiAqLwotICAgICAgICAgICAgbmxlZnQrKzsKLQotICAgICAgICAgICAgLyogY29tcHV0ZSBtYXggbnVtYmVyIG9mIGNoYXJhY3RlciBjb2RlcyAqLwotICAgICAgICAgICAgaWYgKCAoRlRfVUludClubGVmdCA+IGVuY29kaW5nLT5jb3VudCApCi0gICAgICAgICAgICAgIGVuY29kaW5nLT5jb3VudCA9IG5sZWZ0OwotCi0gICAgICAgICAgICAvKiBGaWxsIGluIHRoZSByYW5nZSBvZiBjb2Rlcy9zaWRzLiAqLwotICAgICAgICAgICAgZm9yICggayA9IGk7IGsgPCBubGVmdCArIGk7IGsrKywgZ2x5cGhfY29kZSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGsgaXMgbm90IHRvbyBiaWcuICovCi0gICAgICAgICAgICAgIGlmICggayA8IG51bV9nbHlwaHMgJiYgZ2x5cGhfY29kZSA8IDI1NiApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBBc3NpZ24gY29kZSB0byBHSUQgbWFwcGluZy4gKi8KLSAgICAgICAgICAgICAgICBlbmNvZGluZy0+Y29kZXNbZ2x5cGhfY29kZV0gPSAoRlRfVVNob3J0KWs7Ci0KLSAgICAgICAgICAgICAgICAvKiBBc3NpZ24gY29kZSB0byBTSUQgbWFwcGluZy4gKi8KLSAgICAgICAgICAgICAgICBlbmNvZGluZy0+c2lkc1tnbHlwaF9jb2RlXSA9IGNoYXJzZXQtPnNpZHNba107Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBzaW1wbGUgY2hlY2s7IG9uZSBuZXZlciBrbm93cyB3aGF0IGNhbiBiZSBmb3VuZCBpbiBhIGZvbnQgKi8KLSAgICAgICAgICBpZiAoIGVuY29kaW5nLT5jb3VudCA+IDI1NiApCi0gICAgICAgICAgICBlbmNvZGluZy0+Y291bnQgPSAyNTY7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9lbmNvZGluZ19sb2FkOiBpbnZhbGlkIHRhYmxlIGZvcm1hdFxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFBhcnNlIHN1cHBsZW1lbnRhbCBlbmNvZGluZ3MsIGlmIGFueS4gKi8KLSAgICAgIGlmICggZW5jb2RpbmctPmZvcm1hdCAmIDB4ODAgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBnaW5kZXg7Ci0KLQotICAgICAgICAvKiBjb3VudCBzdXBwbGVtZW50cyAqLwotICAgICAgICBpZiAoIEZUX1JFQURfQllURSggY291bnQgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBSZWFkIHN1cHBsZW1lbnRhbCBnbHlwaCBjb2RlLiAqLwotICAgICAgICAgIGlmICggRlRfUkVBRF9CWVRFKCBnbHlwaF9jb2RlICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogUmVhZCB0aGUgU0lEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdseXBoIGNvZGUuICovCi0gICAgICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggZ2x5cGhfc2lkICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogQXNzaWduIGNvZGUgdG8gU0lEIG1hcHBpbmcuICovCi0gICAgICAgICAgZW5jb2RpbmctPnNpZHNbZ2x5cGhfY29kZV0gPSBnbHlwaF9zaWQ7Ci0KLSAgICAgICAgICAvKiBGaXJzdCwgbG9vayB1cCBHSUQgd2hpY2ggaGFzIGJlZW4gYXNzaWduZWQgdG8gKi8KLSAgICAgICAgICAvKiBTSUQgZ2x5cGhfc2lkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBmb3IgKCBnaW5kZXggPSAwOyBnaW5kZXggPCBudW1fZ2x5cGhzOyBnaW5kZXgrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBjaGFyc2V0LT5zaWRzW2dpbmRleF0gPT0gZ2x5cGhfc2lkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZW5jb2RpbmctPmNvZGVzW2dseXBoX2NvZGVdID0gKEZUX1VTaG9ydClnaW5kZXg7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogV2UgdGFrZSBpbnRvIGFjY291bnQgdGhlIGZhY3QgYSBDRkYgZm9udCBjYW4gdXNlIGEgcHJlZGVmaW5lZCAqLwotICAgICAgLyogZW5jb2Rpbmcgd2l0aG91dCBjb250YWluaW5nIGFsbCBvZiB0aGUgZ2x5cGhzIGVuY29kZWQgYnkgdGhpcyAqLwotICAgICAgLyogZW5jb2RpbmcgKHNlZSB0aGUgbm90ZSBhdCB0aGUgZW5kIG9mIHNlY3Rpb24gMTIgaW4gdGhlIENGRiAgICAqLwotICAgICAgLyogc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBzd2l0Y2ggKCAoRlRfVUludClvZmZzZXQgKQotICAgICAgewotICAgICAgY2FzZSAwOgotICAgICAgICAvKiBGaXJzdCwgY29weSB0aGUgY29kZSB0byBTSUQgbWFwcGluZy4gKi8KLSAgICAgICAgRlRfQVJSQVlfQ09QWSggZW5jb2RpbmctPnNpZHMsIGNmZl9zdGFuZGFyZF9lbmNvZGluZywgMjU2ICk7Ci0gICAgICAgIGdvdG8gUG9wdWxhdGU7Ci0KLSAgICAgIGNhc2UgMToKLSAgICAgICAgLyogRmlyc3QsIGNvcHkgdGhlIGNvZGUgdG8gU0lEIG1hcHBpbmcuICovCi0gICAgICAgIEZUX0FSUkFZX0NPUFkoIGVuY29kaW5nLT5zaWRzLCBjZmZfZXhwZXJ0X2VuY29kaW5nLCAyNTYgKTsKLQotICAgICAgUG9wdWxhdGU6Ci0gICAgICAgIC8qIENvbnN0cnVjdCBjb2RlIHRvIEdJRCBtYXBwaW5nIGZyb20gY29kZSB0byBTSUQgbWFwcGluZyAqLwotICAgICAgICAvKiBhbmQgY2hhcnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBlbmNvZGluZy0+Y291bnQgPSAwOwotCi0gICAgICAgIGVycm9yID0gY2ZmX2NoYXJzZXRfY29tcHV0ZV9jaWRzKCBjaGFyc2V0LCBudW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5tZW1vcnkgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgMjU2OyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgc2lkID0gZW5jb2RpbmctPnNpZHNbal07Ci0gICAgICAgICAgRlRfVUludCAgZ2lkID0gMDsKLQotCi0gICAgICAgICAgaWYgKCBzaWQgKQotICAgICAgICAgICAgZ2lkID0gY2ZmX2NoYXJzZXRfY2lkX3RvX2dpbmRleCggY2hhcnNldCwgc2lkICk7Ci0KLSAgICAgICAgICBpZiAoIGdpZCAhPSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGluZy0+Y29kZXNbal0gPSAoRlRfVVNob3J0KWdpZDsKLSAgICAgICAgICAgIGVuY29kaW5nLT5jb3VudCAgICA9IGogKyAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZW5jb2RpbmctPmNvZGVzW2pdID0gMDsKLSAgICAgICAgICAgIGVuY29kaW5nLT5zaWRzIFtqXSA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBGVF9FUlJPUigoICJjZmZfZW5jb2RpbmdfbG9hZDogaW52YWxpZCB0YWJsZSBmb3JtYXRcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotCi0gICAgLyogQ2xlYW4gdXAgaWYgdGhlcmUgd2FzIGFuIGVycm9yLiAqLwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogUGFyc2UgcHJpdmF0ZSBkaWN0aW9uYXJ5OyBmaXJzdCBjYWxsIGlzIGFsd2F5cyBmcm9tIGBjZmZfZmFjZV9pbml0JywgKi8KLSAgLyogc28gTkRWIGhhcyBub3QgYmVlbiBzZXQgZm9yIENGRjIgdmFyaWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYGNmZl9zbG90X2xvYWQnIG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGVhY2ggdGltZSBORFYgY2hhbmdlcy4gICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9sb2FkX3ByaXZhdGVfZGljdCggQ0ZGX0ZvbnQgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZGX1N1YkZvbnQgIHN1YmZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGxlbk5EViwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogICAgTkRWICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIENGRl9QYXJzZXJSZWMgICAgcGFyc2VyOwotICAgIENGRl9Gb250UmVjRGljdCAgdG9wICAgID0gJnN1YmZvbnQtPmZvbnRfZGljdDsKLSAgICBDRkZfUHJpdmF0ZSAgICAgIHByaXYgICA9ICZzdWJmb250LT5wcml2YXRlX2RpY3Q7Ci0gICAgRlRfU3RyZWFtICAgICAgICBzdHJlYW0gPSBmb250LT5zdHJlYW07Ci0gICAgRlRfVUludCAgICAgICAgICBzdGFja1NpemU7Ci0KLQotICAgIC8qIHN0b3JlIGhhbmRsZSBuZWVkZWQgdG8gYWNjZXNzIG1lbW9yeSwgdnN0b3JlIGZvciBibGVuZDsgICAgKi8KLSAgICAvKiB3ZSBuZWVkIHRoaXMgZm9yIGNsZWFuLXVwIGV2ZW4gaWYgdGhlcmUgaXMgbm8gcHJpdmF0ZSBESUNUICovCi0gICAgc3ViZm9udC0+YmxlbmQuZm9udCAgID0gZm9udDsKLSAgICBzdWJmb250LT5ibGVuZC51c2VkQlYgPSBGQUxTRTsgIC8qIGNsZWFyIHN0YXRlICovCi0KLSAgICBpZiAoICF0b3AtPnByaXZhdGVfb2Zmc2V0IHx8ICF0b3AtPnByaXZhdGVfc2l6ZSApCi0gICAgICBnb3RvIEV4aXQyOyAgICAgICAvKiBubyBwcml2YXRlIERJQ1QsIGRvIG5vdGhpbmcgKi8KLQotICAgIC8qIHNldCBkZWZhdWx0cyAqLwotICAgIEZUX1pFUk8oIHByaXYgKTsKLQotICAgIHByaXYtPmJsdWVfc2hpZnQgICAgICAgPSA3OwotICAgIHByaXYtPmJsdWVfZnV6eiAgICAgICAgPSAxOwotICAgIHByaXYtPmxlbklWICAgICAgICAgICAgPSAtMTsKLSAgICBwcml2LT5leHBhbnNpb25fZmFjdG9yID0gKEZUX0ZpeGVkKSggMC4wNiAqIDB4MTAwMDBMICk7Ci0gICAgcHJpdi0+Ymx1ZV9zY2FsZSAgICAgICA9IChGVF9GaXhlZCkoIDAuMDM5NjI1ICogMHgxMDAwMEwgKiAxMDAwICk7Ci0KLSAgICAvKiBwcm92aWRlIGlucHV0cyBmb3IgYmxlbmQgY2FsY3VsYXRpb25zICovCi0gICAgcHJpdi0+c3ViZm9udCAgID0gc3ViZm9udDsKLSAgICBzdWJmb250LT5sZW5ORFYgPSBsZW5ORFY7Ci0gICAgc3ViZm9udC0+TkRWICAgID0gTkRWOwotCi0gICAgLyogYWRkIDEgZm9yIHRoZSBvcGVyYXRvciAqLwotICAgIHN0YWNrU2l6ZSA9IGZvbnQtPmNmZjIgPyBmb250LT50b3BfZm9udC5mb250X2RpY3QubWF4c3RhY2sgKyAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGRl9NQVhfU1RBQ0tfREVQVEggKyAxOwotCi0gICAgaWYgKCBjZmZfcGFyc2VyX2luaXQoICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmNmZjIgPyBDRkYyX0NPREVfUFJJVkFURSA6IENGRl9DT0RFX1BSSVZBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLT5udW1fZGVzaWducywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLT5udW1fYXhlcyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGZvbnQtPmJhc2Vfb2Zmc2V0ICsgdG9wLT5wcml2YXRlX29mZnNldCApIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggdG9wLT5wcml2YXRlX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfVFJBQ0U0KCggIiBwcml2YXRlIGRpY3Rpb25hcnk6XG4iICkpOwotICAgIGVycm9yID0gY2ZmX3BhcnNlcl9ydW4oICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKXN0cmVhbS0+Y3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9CeXRlKilzdHJlYW0tPmxpbWl0ICk7Ci0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBlbnN1cmUgdGhhdCBgbnVtX2JsdWVfdmFsdWVzJyBpcyBldmVuICovCi0gICAgcHJpdi0+bnVtX2JsdWVfdmFsdWVzICY9IH4xOwotCi0gICAgLyogc2FuaXRpemUgYGluaXRpYWxSYW5kb21TZWVkJyB0byBiZSBhIHBvc2l0aXZlIHZhbHVlLCBpZiBuZWNlc3Nhcnk7ICAqLwotICAgIC8qIHRoaXMgaXMgbm90IG1hbmRhdGVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uIGJ1dCBieSBvdXIgaW1wbGVtZW50YXRpb24gKi8KLSAgICBpZiAoIHByaXYtPmluaXRpYWxfcmFuZG9tX3NlZWQgPCAwICkKLSAgICAgIHByaXYtPmluaXRpYWxfcmFuZG9tX3NlZWQgPSAtcHJpdi0+aW5pdGlhbF9yYW5kb21fc2VlZDsKLSAgICBlbHNlIGlmICggcHJpdi0+aW5pdGlhbF9yYW5kb21fc2VlZCA9PSAwICkKLSAgICAgIHByaXYtPmluaXRpYWxfcmFuZG9tX3NlZWQgPSA5ODc2NTQzMjE7Ci0KLSAgRXhpdDoKLSAgICAvKiBjbGVhbiB1cCAqLwotICAgIGNmZl9ibGVuZF9jbGVhciggc3ViZm9udCApOyAvKiBjbGVhciBibGVuZCBzdGFjayAqLwotICAgIGNmZl9wYXJzZXJfZG9uZSggJnBhcnNlciApOyAvKiBmcmVlIHBhcnNlciBzdGFjayAqLwotCi0gIEV4aXQyOgotICAgIC8qIG5vIGNsZWFuIHVwIChwYXJzZXIgbm90IGluaXRpYWxpemVkKSAqLwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VSW50MzIgKQotICBjZmZfcmFuZG9tKCBGVF9VSW50MzIgIHIgKQotICB7Ci0gICAgLyogYSAzMmJpdCB2ZXJzaW9uIG9mIHRoZSBgeG9yc2hpZnQnIGFsZ29yaXRobSAqLwotICAgIHIgXj0gciA8PCAxMzsKLSAgICByIF49IHIgPj4gMTc7Ci0gICAgciBePSByIDw8IDU7Ci0KLSAgICByZXR1cm4gcjsKLSAgfQotCi0KLSAgLyogVGhlcmUgYXJlIDMgd2F5cyB0byBjYWxsIHRoaXMgZnVuY3Rpb24sIGRpc3Rpbmd1aXNoZWQgYnkgY29kZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAuIENGRl9DT0RFX1RPUERJQ1QgZm9yIGVpdGhlciBhIENGRiBUb3AgRElDVCBvciBhIENGRiBGb250IERJQ1QgKi8KLSAgLyogLiBDRkYyX0NPREVfVE9QRElDVCBmb3IgQ0ZGMiBUb3AgRElDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC4gQ0ZGMl9DT0RFX0ZPTlRESUNUIGZvciBDRkYyIEZvbnQgRElDVCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfc3ViZm9udF9sb2FkKCBDRkZfU3ViRm9udCAgc3ViZm9udCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX0luZGV4ICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGZvbnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBiYXNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgIENGRl9Gb250ICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICBDRkZfRmFjZSAgICAgZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIENGRl9QYXJzZXJSZWMgICAgcGFyc2VyOwotICAgIEZUX0J5dGUqICAgICAgICAgZGljdCA9IE5VTEw7Ci0gICAgRlRfVUxvbmcgICAgICAgICBkaWN0X2xlbjsKLSAgICBDRkZfRm9udFJlY0RpY3QgIHRvcCAgPSAmc3ViZm9udC0+Zm9udF9kaWN0OwotICAgIENGRl9Qcml2YXRlICAgICAgcHJpdiA9ICZzdWJmb250LT5wcml2YXRlX2RpY3Q7Ci0KLSAgICBGVF9Cb29sICBjZmYyICAgICAgPSBGVF9CT09MKCBjb2RlID09IENGRjJfQ09ERV9UT1BESUNUICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQ0ZGMl9DT0RFX0ZPTlRESUNUICk7Ci0gICAgRlRfVUludCAgc3RhY2tTaXplID0gY2ZmMiA/IENGRjJfREVGQVVMVF9TVEFDSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRkZfTUFYX1NUQUNLX0RFUFRIOwotCi0KLSAgICAvKiBOb3RlOiBXZSB1c2UgZGVmYXVsdCBzdGFjayBzaXplIGZvciBDRkYyIEZvbnQgRElDVCBiZWNhdXNlICAgICAgICAqLwotICAgIC8qICAgICAgIFRvcCBhbmQgRm9udCBESUNUcyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBibGVuZCBvcGVyYXRvcnMuICovCi0gICAgZXJyb3IgPSBjZmZfcGFyc2VyX2luaXQoICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJmb250LT5mb250X2RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2V0IGRlZmF1bHRzICovCi0gICAgRlRfWkVSTyggdG9wICk7Ci0KLSAgICB0b3AtPnVuZGVybGluZV9wb3NpdGlvbiAgPSAtKCAxMDBMIDw8IDE2ICk7Ci0gICAgdG9wLT51bmRlcmxpbmVfdGhpY2tuZXNzID0gNTBMIDw8IDE2OwotICAgIHRvcC0+Y2hhcnN0cmluZ190eXBlICAgICA9IDI7Ci0gICAgdG9wLT5mb250X21hdHJpeC54eCAgICAgID0gMHgxMDAwMEw7Ci0gICAgdG9wLT5mb250X21hdHJpeC55eSAgICAgID0gMHgxMDAwMEw7Ci0gICAgdG9wLT5jaWRfY291bnQgICAgICAgICAgID0gODcyMDsKLQotICAgIC8qIHdlIHVzZSB0aGUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgU0lEIHZhbHVlIDB4RkZGRiB0byBpbmRpY2F0ZSAqLwotICAgIC8qIG1pc3NpbmcgZW50cmllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHRvcC0+dmVyc2lvbiAgICAgICAgICAgICA9IDB4RkZGRlU7Ci0gICAgdG9wLT5ub3RpY2UgICAgICAgICAgICAgID0gMHhGRkZGVTsKLSAgICB0b3AtPmNvcHlyaWdodCAgICAgICAgICAgPSAweEZGRkZVOwotICAgIHRvcC0+ZnVsbF9uYW1lICAgICAgICAgICA9IDB4RkZGRlU7Ci0gICAgdG9wLT5mYW1pbHlfbmFtZSAgICAgICAgID0gMHhGRkZGVTsKLSAgICB0b3AtPndlaWdodCAgICAgICAgICAgICAgPSAweEZGRkZVOwotICAgIHRvcC0+ZW1iZWRkZWRfcG9zdHNjcmlwdCA9IDB4RkZGRlU7Ci0KLSAgICB0b3AtPmNpZF9yZWdpc3RyeSAgICAgICAgPSAweEZGRkZVOwotICAgIHRvcC0+Y2lkX29yZGVyaW5nICAgICAgICA9IDB4RkZGRlU7Ci0gICAgdG9wLT5jaWRfZm9udF9uYW1lICAgICAgID0gMHhGRkZGVTsKLQotICAgIC8qIHNldCBkZWZhdWx0IHN0YWNrIHNpemUgKi8KLSAgICB0b3AtPm1heHN0YWNrICAgICAgICAgICAgPSBjZmYyID8gQ0ZGMl9ERUZBVUxUX1NUQUNLIDogNDg7Ci0KLSAgICBpZiAoIGlkeC0+Y291bnQgKSAgIC8qIGNvdW50IGlzIG5vbnplcm8gZm9yIGEgcmVhbCBpbmRleCAqLwotICAgICAgZXJyb3IgPSBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoIGlkeCwgZm9udF9pbmRleCwgJmRpY3QsICZkaWN0X2xlbiApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDRkYyIGhhcyBhIGZha2UgdG9wIGRpY3QgaW5kZXg7ICAgICAqLwotICAgICAgLyogc2ltdWxhdGUgYGNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudCcgKi8KLQotICAgICAgLyogTm90ZTogbWFjcm9zIGltcGxpY2l0bHkgdXNlIGBzdHJlYW0nIGFuZCBzZXQgYGVycm9yJyAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggaWR4LT5kYXRhX29mZnNldCApICAgICAgIHx8Ci0gICAgICAgICAgIEZUX0ZSQU1FX0VYVFJBQ1QoIGlkeC0+ZGF0YV9zaXplLCBkaWN0ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGRpY3RfbGVuID0gaWR4LT5kYXRhX3NpemU7Ci0gICAgfQotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNCgoICIgdG9wIGRpY3Rpb25hcnk6XG4iICkpOwotICAgICAgZXJyb3IgPSBjZmZfcGFyc2VyX3J1biggJnBhcnNlciwgZGljdCwgZGljdCArIGRpY3RfbGVuICk7Ci0gICAgfQotCi0gICAgLyogY2xlYW4gdXAgcmVnYXJkbGVzcyBvZiBlcnJvciAqLwotICAgIGlmICggaWR4LT5jb3VudCApCi0gICAgICBjZmZfaW5kZXhfZm9yZ2V0X2VsZW1lbnQoIGlkeCwgJmRpY3QgKTsKLSAgICBlbHNlCi0gICAgICBGVF9GUkFNRV9SRUxFQVNFKCBkaWN0ICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGlmIGl0IGlzIGEgQ0lEIGZvbnQsIHdlIHN0b3AgdGhlcmUgKi8KLSAgICBpZiAoIHRvcC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogUGFyc2UgdGhlIHByaXZhdGUgZGljdGlvbmFyeSwgaWYgYW55LiAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBDRkYyIGRvZXMgbm90IGhhdmUgYSBwcml2YXRlIGRpY3Rpb25hcnkgaW4gdGhlIFRvcCBESUNUICovCi0gICAgLyogYnV0IG1heSBoYXZlIG9uZSBpbiBhIEZvbnQgRElDVC4gIFdlIG5lZWQgdG8gcGFyc2UgICAgICAqLwotICAgIC8qIHRoZSBsYXR0ZXIgaGVyZSBpbiBvcmRlciB0byBsb2FkIGFueSBsb2NhbCBzdWJycy4gICAgICAgKi8KLSAgICBlcnJvciA9IGNmZl9sb2FkX3ByaXZhdGVfZGljdCggZm9udCwgc3ViZm9udCwgMCwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCAhY2ZmMiApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEluaXRpYWxpemUgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgotICAgICAgICoKLSAgICAgICAqIC4gSWYgd2UgaGF2ZSBhIGZhY2Utc3BlY2lmaWMgc2VlZCwgdXNlIGl0LgotICAgICAgICogICBJZiBub24temVybywgdXBkYXRlIGl0IHRvIGEgcG9zaXRpdmUgdmFsdWUuCi0gICAgICAgKgotICAgICAgICogLiBPdGhlcndpc2UsIHVzZSB0aGUgc2VlZCBmcm9tIHRoZSBDRkYgZHJpdmVyLgotICAgICAgICogICBJZiBub24temVybywgdXBkYXRlIGl0IHRvIGEgcG9zaXRpdmUgdmFsdWUuCi0gICAgICAgKgotICAgICAgICogLiBJZiB0aGUgcmFuZG9tIHZhbHVlIGlzIHplcm8sIHVzZSB0aGUgc2VlZCBnaXZlbiBieSB0aGUgc3ViZm9udCdzCi0gICAgICAgKiAgIGBpbml0aWFsUmFuZG9tU2VlZCcgdmFsdWUuCi0gICAgICAgKgotICAgICAgICovCi0gICAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPnJhbmRvbV9zZWVkID09IC0xICkKLSAgICAgIHsKLSAgICAgICAgQ0ZGX0RyaXZlciAgZHJpdmVyID0gKENGRl9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKLQotCi0gICAgICAgIHN1YmZvbnQtPnJhbmRvbSA9IChGVF9VSW50MzIpZHJpdmVyLT5yYW5kb21fc2VlZDsKLSAgICAgICAgaWYgKCBkcml2ZXItPnJhbmRvbV9zZWVkICkKLSAgICAgICAgewotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgZHJpdmVyLT5yYW5kb21fc2VlZCA9Ci0gICAgICAgICAgICAgIChGVF9JbnQzMiljZmZfcmFuZG9tKCAoRlRfVUludDMyKWRyaXZlci0+cmFuZG9tX3NlZWQgKTsKLQotICAgICAgICAgIH0gd2hpbGUgKCBkcml2ZXItPnJhbmRvbV9zZWVkIDwgMCApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN1YmZvbnQtPnJhbmRvbSA9IChGVF9VSW50MzIpZmFjZS0+cm9vdC5pbnRlcm5hbC0+cmFuZG9tX3NlZWQ7Ci0gICAgICAgIGlmICggZmFjZS0+cm9vdC5pbnRlcm5hbC0+cmFuZG9tX3NlZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5yYW5kb21fc2VlZCA9Ci0gICAgICAgICAgICAgIChGVF9JbnQzMiljZmZfcmFuZG9tKCAoRlRfVUludDMyKWZhY2UtPnJvb3QuaW50ZXJuYWwtPnJhbmRvbV9zZWVkICk7Ci0KLSAgICAgICAgICB9IHdoaWxlICggZmFjZS0+cm9vdC5pbnRlcm5hbC0+cmFuZG9tX3NlZWQgPCAwICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCAhc3ViZm9udC0+cmFuZG9tICkKLSAgICAgICAgc3ViZm9udC0+cmFuZG9tID0gKEZUX1VJbnQzMilwcml2LT5pbml0aWFsX3JhbmRvbV9zZWVkOwotICAgIH0KLQotICAgIC8qIHJlYWQgdGhlIGxvY2FsIHN1YnJzLCBpZiBhbnkgKi8KLSAgICBpZiAoIHByaXYtPmxvY2FsX3N1YnJzX29mZnNldCApCi0gICAgewotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmFzZV9vZmZzZXQgKyB0b3AtPnByaXZhdGVfb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmxvY2FsX3N1YnJzX29mZnNldCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IGNmZl9pbmRleF9pbml0KCAmc3ViZm9udC0+bG9jYWxfc3VicnNfaW5kZXgsIHN0cmVhbSwgMSwgY2ZmMiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZXJyb3IgPSBjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKCAmc3ViZm9udC0+bG9jYWxfc3VicnNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJmb250LT5sb2NhbF9zdWJycywgTlVMTCwgTlVMTCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBjZmZfcGFyc2VyX2RvbmUoICZwYXJzZXIgKTsgLyogZnJlZSBwYXJzZXIgc3RhY2sgKi8KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX3N1YmZvbnRfZG9uZSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX1N1YkZvbnQgIHN1YmZvbnQgKQotICB7Ci0gICAgaWYgKCBzdWJmb250ICkKLSAgICB7Ci0gICAgICBjZmZfaW5kZXhfZG9uZSggJnN1YmZvbnQtPmxvY2FsX3N1YnJzX2luZGV4ICk7Ci0gICAgICBGVF9GUkVFKCBzdWJmb250LT5sb2NhbF9zdWJycyApOwotCi0gICAgICBGVF9GUkVFKCBzdWJmb250LT5ibGVuZC5sYXN0TkRWICk7Ci0gICAgICBGVF9GUkVFKCBzdWJmb250LT5ibGVuZC5CViApOwotICAgICAgRlRfRlJFRSggc3ViZm9udC0+YmxlbmRfc3RhY2sgKTsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZm9udF9sb2FkKCBGVF9MaWJyYXJ5IGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIENGRl9Gb250ICAgZm9udCwKLSAgICAgICAgICAgICAgICAgQ0ZGX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHB1cmVfY2ZmLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGNmZjIgKQotICB7Ci0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBjZmZfaGVhZGVyX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIENGRl9Gb250UmVjCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCAzICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUoIHZlcnNpb25fbWFqb3IgKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSggdmVyc2lvbl9taW5vciApLAotICAgICAgICBGVF9GUkFNRV9CWVRFKCBoZWFkZXJfc2l6ZSApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VTG9uZyAgICAgICAgIGJhc2Vfb2Zmc2V0OwotICAgIENGRl9Gb250UmVjRGljdCAgZGljdDsKLSAgICBDRkZfSW5kZXhSZWMgICAgIHN0cmluZ19pbmRleDsKLSAgICBGVF9VSW50ICAgICAgICAgIHN1YmZvbnRfaW5kZXg7Ci0KLQotICAgIEZUX1pFUk8oIGZvbnQgKTsKLSAgICBGVF9aRVJPKCAmc3RyaW5nX2luZGV4ICk7Ci0KLSAgICBkaWN0ICAgICAgICA9ICZmb250LT50b3BfZm9udC5mb250X2RpY3Q7Ci0gICAgYmFzZV9vZmZzZXQgPSBGVF9TVFJFQU1fUE9TKCk7Ci0KLSAgICBmb250LT5saWJyYXJ5ICAgICA9IGxpYnJhcnk7Ci0gICAgZm9udC0+c3RyZWFtICAgICAgPSBzdHJlYW07Ci0gICAgZm9udC0+bWVtb3J5ICAgICAgPSBtZW1vcnk7Ci0gICAgZm9udC0+Y2ZmMiAgICAgICAgPSBjZmYyOwotICAgIGZvbnQtPmJhc2Vfb2Zmc2V0ID0gYmFzZV9vZmZzZXQ7Ci0KLSAgICAvKiByZWFkIENGRiBmb250IGhlYWRlciAqLwotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBjZmZfaGVhZGVyX2ZpZWxkcywgZm9udCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggY2ZmMiApCi0gICAgewotICAgICAgaWYgKCBmb250LT52ZXJzaW9uX21ham9yICE9IDIgfHwKLSAgICAgICAgICAgZm9udC0+aGVhZGVyX3NpemUgPCA1ICAgICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgQ0ZGMiBmb250IGhlYWRlclxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIGZvbnQtPnRvcF9kaWN0X2xlbmd0aCApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfQnl0ZSAgYWJzb2x1dGVfb2Zmc2V0OwotCi0KLSAgICAgIGlmICggRlRfUkVBRF9CWVRFKCBhYnNvbHV0ZV9vZmZzZXQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCBmb250LT52ZXJzaW9uX21ham9yICE9IDEgfHwKLSAgICAgICAgICAgZm9udC0+aGVhZGVyX3NpemUgPCA0ICAgIHx8Ci0gICAgICAgICAgIGFic29sdXRlX29mZnNldCA+IDQgICAgICApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICIgIG5vdCBhIENGRiBmb250IGhlYWRlclxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogc2tpcCB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyICovCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmFzZV9vZmZzZXQgKyBmb250LT5oZWFkZXJfc2l6ZSApICkKLSAgICB7Ci0gICAgICAvKiBGb3IgcHVyZSBDRkZzIHdlIGhhdmUgcmVhZCBvbmx5IGZvdXIgYnl0ZXMgc28gZmFyLiAgQ29udHJhcnkgdG8gKi8KLSAgICAgIC8qIG90aGVyIGZvcm1hdHMgbGlrZSBTRk5UIHRob3NlIGJ5dGVzIGRvZXNuJ3QgZGVmaW5lIGEgc2lnbmF0dXJlOyAqLwotICAgICAgLyogaXQgaXMgdGh1cyBwb3NzaWJsZSB0aGF0IHRoZSBmb250IGlzbid0IGEgQ0ZGIGF0IGFsbC4gICAgICAgICAgICovCi0gICAgICBpZiAoIHB1cmVfY2ZmICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgQ0ZGIGZpbGVcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIH0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGNmZjIgKQotICAgIHsKLSAgICAgIC8qIEZvciBDRkYyLCB0aGUgdG9wIGRpY3QgZGF0YSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGhlYWRlciAgICAqLwotICAgICAgLyogYW5kIHRoZSBsZW5ndGggaXMgc3RvcmVkIGluIHRoZSBoZWFkZXIgYG9mZlNpemUnIGZpZWxkOyAgICAgICovCi0gICAgICAvKiB0aGVyZSBpcyBubyBpbmRleCBmb3IgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogVXNlIHRoZSBgZm9udF9kaWN0X2luZGV4JyB0byBzYXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uICAgICAgICovCi0gICAgICAvKiBhbmQgbGVuZ3RoIG9mIGRhdGEsIGJ1dCBsZWF2ZSBjb3VudCBhdCB6ZXJvIGFzIGFuIGluZGljYXRvci4gKi8KLSAgICAgIEZUX1pFUk8oICZmb250LT5mb250X2RpY3RfaW5kZXggKTsKLQotICAgICAgZm9udC0+Zm9udF9kaWN0X2luZGV4LmRhdGFfb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotICAgICAgZm9udC0+Zm9udF9kaWN0X2luZGV4LmRhdGFfc2l6ZSAgID0gZm9udC0+dG9wX2RpY3RfbGVuZ3RoOwotCi0gICAgICAvKiBza2lwIHRoZSB0b3AgZGljdCBkYXRhIGZvciBub3csIHdlIHdpbGwgcGFyc2UgaXQgbGF0ZXIgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIGZvbnQtPnRvcF9kaWN0X2xlbmd0aCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBuZXh0LCByZWFkIHRoZSBnbG9iYWwgc3VicnMgaW5kZXggKi8KLSAgICAgIGlmICggRlRfU0VUX0VSUk9SKCBjZmZfaW5kZXhfaW5pdCggJmZvbnQtPmdsb2JhbF9zdWJyc19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCAxLCBjZmYyICkgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGZvciBDRkYsIHJlYWQgdGhlIG5hbWUsIHRvcCBkaWN0LCBzdHJpbmcgYW5kIGdsb2JhbCBzdWJycyBpbmRleCAqLwotICAgICAgaWYgKCBGVF9TRVRfRVJST1IoIGNmZl9pbmRleF9pbml0KCAmZm9udC0+bmFtZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCAwLCBjZmYyICkgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggcHVyZV9jZmYgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgQ0ZGIGZpbGVcbiIgKSk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgICAgICB9Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyogaWYgd2UgaGF2ZSBhbiBlbXB0eSBmb250IG5hbWUsICAgICAgKi8KLSAgICAgIC8qIGl0IG11c3QgYmUgdGhlIG9ubHkgZm9udCBpbiB0aGUgQ0ZGICovCi0gICAgICBpZiAoIGZvbnQtPm5hbWVfaW5kZXguY291bnQgPiAxICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBmb250LT5uYW1lX2luZGV4LmRhdGFfc2l6ZSA8IGZvbnQtPm5hbWVfaW5kZXguY291bnQgKQotICAgICAgewotICAgICAgICAvKiBmb3IgcHVyZSBDRkZzLCB3ZSBzdGlsbCBoYXZlbid0IGNoZWNrZWQgZW5vdWdoIGJ5dGVzICovCi0gICAgICAgIC8qIHRvIGJlIHN1cmUgdGhhdCBpdCBpcyBhIENGRiBhdCBhbGwgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgZXJyb3IgPSBwdXJlX2NmZiA/IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBGVF9TRVRfRVJST1IoIGNmZl9pbmRleF9pbml0KCAmZm9udC0+Zm9udF9kaWN0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIDAsIGNmZjIgKSApICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9TRVRfRVJST1IoIGNmZl9pbmRleF9pbml0KCAmc3RyaW5nX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIDEsIGNmZjIgKSApICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9TRVRfRVJST1IoIGNmZl9pbmRleF9pbml0KCAmZm9udC0+Z2xvYmFsX3N1YnJzX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIDEsIGNmZjIgKSApICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9TRVRfRVJST1IoIGNmZl9pbmRleF9nZXRfcG9pbnRlcnMoICZzdHJpbmdfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPnN0cmluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPnN0cmluZ19wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5zdHJpbmdfcG9vbF9zaXplICkgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogdGhlcmUgbXVzdCBiZSBhIFRvcCBESUNUIGluZGV4IGVudHJ5IGZvciBlYWNoIG5hbWUgaW5kZXggZW50cnkgKi8KLSAgICAgIGlmICggZm9udC0+bmFtZV9pbmRleC5jb3VudCA+IGZvbnQtPmZvbnRfZGljdF9pbmRleC5jb3VudCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9mb250X2xvYWQ6IgotICAgICAgICAgICAgICAgICAgICIgbm90IGVub3VnaCBlbnRyaWVzIGluIFRvcCBESUNUIGluZGV4XG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb250LT5udW1fc3RyaW5ncyA9IHN0cmluZ19pbmRleC5jb3VudDsKLQotICAgIGlmICggcHVyZV9jZmYgKQotICAgIHsKLSAgICAgIC8qIHdlbGwsIHdlIGRvbid0IHJlYWxseSBmb3JnZXQgdGhlIGBkaXNhYmxlZCcgZm9udHMuLi4gKi8KLSAgICAgIHN1YmZvbnRfaW5kZXggPSAoRlRfVUludCkoIGZhY2VfaW5kZXggJiAweEZGRkYgKTsKLQotICAgICAgaWYgKCBmYWNlX2luZGV4ID4gMCAmJiBzdWJmb250X2luZGV4ID49IGZvbnQtPm5hbWVfaW5kZXguY291bnQgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfZm9udF9sb2FkOiIKLSAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgc3ViZm9udCBpbmRleCBmb3IgcHVyZSBDRkYgZm9udCAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgIHN1YmZvbnRfaW5kZXggKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBmb250LT5udW1fZmFjZXMgPSBmb250LT5uYW1lX2luZGV4LmNvdW50OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3ViZm9udF9pbmRleCA9IDA7Ci0KLSAgICAgIGlmICggZm9udC0+bmFtZV9pbmRleC5jb3VudCA+IDEgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfZm9udF9sb2FkOiIKLSAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgQ0ZGIGZvbnQgd2l0aCBtdWx0aXBsZSBzdWJmb250c1xuIgotICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAiIGluIFNGTlQgd3JhcHBlclxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogaW4gY2FzZSBvZiBhIGZvbnQgZm9ybWF0IGNoZWNrLCBzaW1wbHkgZXhpdCBub3cgKi8KLSAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIG5vdywgcGFyc2UgdGhlIHRvcC1sZXZlbCBmb250IGRpY3Rpb25hcnkgKi8KLSAgICBGVF9UUkFDRTQoKCAicGFyc2luZyB0b3AtbGV2ZWxcbiIgKSk7Ci0gICAgZXJyb3IgPSBjZmZfc3ViZm9udF9sb2FkKCAmZm9udC0+dG9wX2ZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+Zm9udF9kaWN0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZm9udF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZmMiA/IENGRjJfQ09ERV9UT1BESUNUIDogQ0ZGX0NPREVfVE9QRElDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBiYXNlX29mZnNldCArIGRpY3QtPmNoYXJzdHJpbmdzX29mZnNldCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gY2ZmX2luZGV4X2luaXQoICZmb250LT5jaGFyc3RyaW5nc19pbmRleCwgc3RyZWFtLCAwLCBjZmYyICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBub3csIGNoZWNrIGZvciBhIENJRCBvciBDRkYyIGZvbnQgKi8KLSAgICBpZiAoIGRpY3QtPmNpZF9yZWdpc3RyeSAhPSAweEZGRkZVIHx8Ci0gICAgICAgICBjZmYyICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgewotICAgICAgQ0ZGX0luZGV4UmVjICBmZF9pbmRleDsKLSAgICAgIENGRl9TdWJGb250ICAgc3ViID0gTlVMTDsKLSAgICAgIEZUX1VJbnQgICAgICAgaWR4OwotCi0KLSAgICAgIC8qIGZvciBDRkYyLCByZWFkIHRoZSBWYXJpYXRpb24gU3RvcmUgaWYgYXZhaWxhYmxlOyAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIHRoaXMgbXVzdCBmb2xsb3cgdGhlIFRvcCBESUNUIHBhcnNlIGFuZCBwcmVjZWRlIGFueSBQcml2YXRlIERJQ1QgKi8KLSAgICAgIGVycm9yID0gY2ZmX3ZzdG9yZV9sb2FkKCAmZm9udC0+dnN0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT52c3RvcmVfb2Zmc2V0ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiB0aGlzIGlzIGEgQ0lELWtleWVkIGZvbnQsIHdlIG11c3Qgbm93IGFsbG9jYXRlIGEgdGFibGUgb2YgKi8KLSAgICAgIC8qIHN1Yi1mb250cywgdGhlbiBsb2FkIGVhY2ggb2YgdGhlbSBzZXBhcmF0ZWx5ICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmFzZV9vZmZzZXQgKyBkaWN0LT5jaWRfZmRfYXJyYXlfb2Zmc2V0ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGVycm9yID0gY2ZmX2luZGV4X2luaXQoICZmZF9pbmRleCwgc3RyZWFtLCAwLCBjZmYyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBGb250IERpY3RzIGFyZSBub3QgbGltaXRlZCB0byAyNTYgZm9yIENGRjIuICovCi0gICAgICAvKiBUT0RPOiBzdXBwb3J0IHRoaXMgZm9yIENGRjIgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGZkX2luZGV4LmNvdW50ID4gQ0ZGX01BWF9DSURfRk9OVFMgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAiY2ZmX2ZvbnRfbG9hZDogRkQgYXJyYXkgdG9vIGxhcmdlIGluIENJRCBmb250XG4iICkpOwotICAgICAgICBnb3RvIEZhaWxfQ0lEOwotICAgICAgfQotCi0gICAgICAvKiBhbGxvY2F0ZSAmIHJlYWQgZWFjaCBmb250IGRpY3QgaW5kZXBlbmRlbnRseSAqLwotICAgICAgZm9udC0+bnVtX3N1YmZvbnRzID0gZmRfaW5kZXguY291bnQ7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggc3ViLCBmZF9pbmRleC5jb3VudCApICkKLSAgICAgICAgZ290byBGYWlsX0NJRDsKLQotICAgICAgLyogc2V0IHVwIHBvaW50ZXIgdGFibGUgKi8KLSAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGZkX2luZGV4LmNvdW50OyBpZHgrKyApCi0gICAgICAgIGZvbnQtPnN1YmZvbnRzW2lkeF0gPSBzdWIgKyBpZHg7Ci0KLSAgICAgIC8qIG5vdyBsb2FkIGVhY2ggc3ViZm9udCBpbmRlcGVuZGVudGx5ICovCi0gICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBmZF9pbmRleC5jb3VudDsgaWR4KysgKQotICAgICAgewotICAgICAgICBzdWIgPSBmb250LT5zdWJmb250c1tpZHhdOwotICAgICAgICBGVF9UUkFDRTQoKCAicGFyc2luZyBzdWJmb250ICV1XG4iLCBpZHggKSk7Ci0gICAgICAgIGVycm9yID0gY2ZmX3N1YmZvbnRfbG9hZCggc3ViLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZjIgPyBDRkYyX0NPREVfRk9OVERJQ1QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZGX0NPREVfVE9QRElDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsX0NJRDsKLSAgICAgIH0KLQotICAgICAgLyogbm93IGxvYWQgdGhlIEZEIFNlbGVjdCBhcnJheTsgICAgICAgICAgICAgICAqLwotICAgICAgLyogQ0ZGMiBvbWl0cyBGRFNlbGVjdCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBGRCAqLwotICAgICAgaWYgKCAhY2ZmMiB8fCBmZF9pbmRleC5jb3VudCA+IDEgKQotICAgICAgICBlcnJvciA9IENGRl9Mb2FkX0ZEX1NlbGVjdCggJmZvbnQtPmZkX3NlbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmNoYXJzdHJpbmdzX2luZGV4LmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9vZmZzZXQgKyBkaWN0LT5jaWRfZmRfc2VsZWN0X29mZnNldCApOwotCi0gICAgRmFpbF9DSUQ6Ci0gICAgICBjZmZfaW5kZXhfZG9uZSggJmZkX2luZGV4ICk7Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGZvbnQtPm51bV9zdWJmb250cyA9IDA7Ci0KLSAgICAvKiByZWFkIHRoZSBjaGFyc3RyaW5ncyBpbmRleCBub3cgKi8KLSAgICBpZiAoIGRpY3QtPmNoYXJzdHJpbmdzX29mZnNldCA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJjZmZfZm9udF9sb2FkOiBubyBjaGFyc3RyaW5ncyBvZmZzZXRcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZm9udC0+bnVtX2dseXBocyA9IGZvbnQtPmNoYXJzdHJpbmdzX2luZGV4LmNvdW50OwotCi0gICAgZXJyb3IgPSBjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKCAmZm9udC0+Z2xvYmFsX3N1YnJzX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmdsb2JhbF9zdWJycywgTlVMTCwgTlVMTCApOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiByZWFkIHRoZSBDaGFyc2V0IGFuZCBFbmNvZGluZyB0YWJsZXMgaWYgYXZhaWxhYmxlICovCi0gICAgaWYgKCAhY2ZmMiAmJiBmb250LT5udW1fZ2x5cGhzID4gMCApCi0gICAgewotICAgICAgRlRfQm9vbCAgaW52ZXJ0ID0gRlRfQk9PTCggZGljdC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgJiYgcHVyZV9jZmYgKTsKLQotCi0gICAgICBlcnJvciA9IGNmZl9jaGFyc2V0X2xvYWQoICZmb250LT5jaGFyc2V0LCBmb250LT5udW1fZ2x5cGhzLCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfb2Zmc2V0LCBkaWN0LT5jaGFyc2V0X29mZnNldCwgaW52ZXJ0ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBDSUQta2V5ZWQgQ0ZGcyBkb24ndCBoYXZlIGFuIGVuY29kaW5nICovCi0gICAgICBpZiAoIGRpY3QtPmNpZF9yZWdpc3RyeSA9PSAweEZGRkZVICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBjZmZfZW5jb2RpbmdfbG9hZCggJmZvbnQtPmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+Y2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+bnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+ZW5jb2Rpbmdfb2Zmc2V0ICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBnZXQgdGhlIGZvbnQgbmFtZSAoL0NJREZvbnROYW1lIGZvciBDSUQta2V5ZWQgZm9udHMsICovCi0gICAgLyogL0ZvbnROYW1lIG90aGVyd2lzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvbnQtPmZvbnRfbmFtZSA9IGNmZl9pbmRleF9nZXRfbmFtZSggZm9udCwgc3ViZm9udF9pbmRleCApOwotCi0gIEV4aXQ6Ci0gICAgY2ZmX2luZGV4X2RvbmUoICZzdHJpbmdfaW5kZXggKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX2ZvbnRfZG9uZSggQ0ZGX0ZvbnQgIGZvbnQgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmb250LT5tZW1vcnk7Ci0gICAgRlRfVUludCAgICBpZHg7Ci0KLQotICAgIGNmZl9pbmRleF9kb25lKCAmZm9udC0+Z2xvYmFsX3N1YnJzX2luZGV4ICk7Ci0gICAgY2ZmX2luZGV4X2RvbmUoICZmb250LT5mb250X2RpY3RfaW5kZXggKTsKLSAgICBjZmZfaW5kZXhfZG9uZSggJmZvbnQtPm5hbWVfaW5kZXggKTsKLSAgICBjZmZfaW5kZXhfZG9uZSggJmZvbnQtPmNoYXJzdHJpbmdzX2luZGV4ICk7Ci0KLSAgICAvKiByZWxlYXNlIGZvbnQgZGljdGlvbmFyaWVzLCBidXQgb25seSBpZiB3b3JraW5nIHdpdGggKi8KLSAgICAvKiBhIENJRCBrZXllZCBDRkYgZm9udCBvciBhIENGRjIgZm9udCAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZvbnQtPm51bV9zdWJmb250cyA+IDAgKQotICAgIHsKLSAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGZvbnQtPm51bV9zdWJmb250czsgaWR4KysgKQotICAgICAgICBjZmZfc3ViZm9udF9kb25lKCBtZW1vcnksIGZvbnQtPnN1YmZvbnRzW2lkeF0gKTsKLQotICAgICAgLyogdGhlIHN1YmZvbnRzIGFycmF5IGhhcyBiZWVuIGFsbG9jYXRlZCBhcyBhIHNpbmdsZSBibG9jayAqLwotICAgICAgRlRfRlJFRSggZm9udC0+c3ViZm9udHNbMF0gKTsKLSAgICB9Ci0KLSAgICBjZmZfZW5jb2RpbmdfZG9uZSggJmZvbnQtPmVuY29kaW5nICk7Ci0gICAgY2ZmX2NoYXJzZXRfZG9uZSggJmZvbnQtPmNoYXJzZXQsIGZvbnQtPnN0cmVhbSApOwotICAgIGNmZl92c3RvcmVfZG9uZSggJmZvbnQtPnZzdG9yZSwgbWVtb3J5ICk7Ci0KLSAgICBjZmZfc3ViZm9udF9kb25lKCBtZW1vcnksICZmb250LT50b3BfZm9udCApOwotCi0gICAgQ0ZGX0RvbmVfRkRfU2VsZWN0KCAmZm9udC0+ZmRfc2VsZWN0LCBmb250LT5zdHJlYW0gKTsKLQotICAgIEZUX0ZSRUUoIGZvbnQtPmZvbnRfaW5mbyApOwotCi0gICAgRlRfRlJFRSggZm9udC0+Zm9udF9uYW1lICk7Ci0gICAgRlRfRlJFRSggZm9udC0+Z2xvYmFsX3N1YnJzICk7Ci0gICAgRlRfRlJFRSggZm9udC0+c3RyaW5ncyApOwotICAgIEZUX0ZSRUUoIGZvbnQtPnN0cmluZ19wb29sICk7Ci0KLSAgICBpZiAoIGZvbnQtPmNmMl9pbnN0YW5jZS5maW5hbGl6ZXIgKQotICAgIHsKLSAgICAgIGZvbnQtPmNmMl9pbnN0YW5jZS5maW5hbGl6ZXIoIGZvbnQtPmNmMl9pbnN0YW5jZS5kYXRhICk7Ci0gICAgICBGVF9GUkVFKCBmb250LT5jZjJfaW5zdGFuY2UuZGF0YSApOwotICAgIH0KLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZsb2FkLmggYi9zcmMvY2ZmL2NmZmxvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0NWU4MS4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZmxvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgJiBDRkYgZGF0YS9wcm9ncmFtIHRhYmxlcyBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQ0ZGTE9BRF9IXwotI2RlZmluZSBDRkZMT0FEX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiY2ZmdHlwZXMuaCIKLSNpbmNsdWRlICJjZmZwYXJzZS5oIgotI2luY2x1ZGUgImNmZm9ianMuaCIgIC8qIGZvciBDRkZfRmFjZSAqLwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIEZUX0xPQ0FMKCBGVF9VU2hvcnQgKQotICBjZmZfZ2V0X3N0YW5kYXJkX2VuY29kaW5nKCBGVF9VSW50ICBjaGFyY29kZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX1N0cmluZyogKQotICBjZmZfaW5kZXhfZ2V0X3N0cmluZyggQ0ZGX0ZvbnQgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZWxlbWVudCApOwotCi0gIEZUX0xPQ0FMKCBGVF9TdHJpbmcqICkKLSAgY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBDRkZfRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgc2lkICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoIENGRl9JbmRleCAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHBieXRlX2xlbiApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2luZGV4X2ZvcmdldF9lbGVtZW50KCBDRkZfSW5kZXggIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9TdHJpbmcqICkKLSAgY2ZmX2luZGV4X2dldF9uYW1lKCBDRkZfRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZWxlbWVudCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBjZmZfY2hhcnNldF9jaWRfdG9fZ2luZGV4KCBDRkZfQ2hhcnNldCAgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGNpZCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX1VJbnQzMiApCi0gIGNmZl9yYW5kb20oIEZUX1VJbnQzMiAgciApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9mb250X2xvYWQoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgQ0ZGX0ZvbnQgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgQ0ZGX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgcHVyZV9jZmYsCi0gICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIGNmZjIgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9mb250X2RvbmUoIENGRl9Gb250ICBmb250ICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfbG9hZF9wcml2YXRlX2RpY3QoIENGRl9Gb250ICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgIENGRl9TdWJGb250ICBzdWJmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBsZW5ORFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICAgIE5EViApOwotCi0gIEZUX0xPQ0FMKCBGVF9CeXRlICkKLSAgY2ZmX2ZkX3NlbGVjdF9nZXQoIENGRl9GRFNlbGVjdCAgZmRzZWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Jvb2wgKQotICBjZmZfYmxlbmRfY2hlY2tfdmVjdG9yKCBDRkZfQmxlbmQgIGJsZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHZzaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbGVuTkRWLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIE5EViApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9ibGVuZF9idWlsZF92ZWN0b3IoIENGRl9CbGVuZCAgYmxlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdnNpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBsZW5ORFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgTkRWICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfYmxlbmRfY2xlYXIoIENGRl9TdWJGb250ICBzdWJGb250ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2JsZW5kX2RvQmxlbmQoIENGRl9TdWJGb250ICBzdWJmb250LAotICAgICAgICAgICAgICAgICAgICAgQ0ZGX1BhcnNlciAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1CbGVuZHMgKTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2dldF92YXJfYmxlbmQoIENGRl9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgKm51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogICAqY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICAgKm5vcm1hbGl6ZWRjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbW1fdmFyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfZG9uZV9ibGVuZCggQ0ZGX0ZhY2UgIGZhY2UgKTsKLSNlbmRpZgotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIENGRkxPQURfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2Zmb2Jqcy5jIGIvc3JjL2NmZi9jZmZvYmpzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjEzOTMuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZvYmpzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZm9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBvYmplY3RzIG1hbmFnZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX0NGRl9EUklWRVJfSAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2VuZGlmCi0KLSNpbmNsdWRlICJjZmZvYmpzLmgiCi0jaW5jbHVkZSAiY2ZmbG9hZC5oIgotI2luY2x1ZGUgImNmZmNtYXAuaCIKLSNpbmNsdWRlICJjZmZwaWMuaCIKLQotI2luY2x1ZGUgImNmZmVycnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmZm9ianMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBQU0hfR2xvYmFsc19GdW5jcwotICBjZmZfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggQ0ZGX1NpemUgIHNpemUgKQotICB7Ci0gICAgQ0ZGX0ZhY2UgICAgICAgICAgZmFjZSAgICAgPSAoQ0ZGX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotICAgIENGRl9Gb250ICAgICAgICAgIGZvbnQgICAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgUFNIaW50ZXJfU2VydmljZSAgcHNoaW50ZXIgPSBmb250LT5wc2hpbnRlcjsKLSAgICBGVF9Nb2R1bGUgICAgICAgICBtb2R1bGU7Ci0KLQotICAgIG1vZHVsZSA9IEZUX0dldF9Nb2R1bGUoIHNpemUtPnJvb3QuZmFjZS0+ZHJpdmVyLT5yb290LmxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzaGludGVyIiApOwotICAgIHJldHVybiAoIG1vZHVsZSAmJiBwc2hpbnRlciAmJiBwc2hpbnRlci0+Z2V0X2dsb2JhbHNfZnVuY3MgKQotICAgICAgICAgICA/IHBzaGludGVyLT5nZXRfZ2xvYmFsc19mdW5jcyggbW9kdWxlICkKLSAgICAgICAgICAgOiAwOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfc2l6ZV9kb25lKCBGVF9TaXplICBjZmZzaXplICkgICAgICAgIC8qIENGRl9TaXplICovCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSAgID0gY2Zmc2l6ZS0+ZmFjZS0+bWVtb3J5OwotICAgIENGRl9TaXplICAgICAgc2l6ZSAgICAgPSAoQ0ZGX1NpemUpY2Zmc2l6ZTsKLSAgICBDRkZfRmFjZSAgICAgIGZhY2UgICAgID0gKENGRl9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBDRkZfRm9udCAgICAgIGZvbnQgICAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgQ0ZGX0ludGVybmFsICBpbnRlcm5hbCA9IChDRkZfSW50ZXJuYWwpY2Zmc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhOwotCi0KLSAgICBpZiAoIGludGVybmFsICkKLSAgICB7Ci0gICAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3M7Ci0KLQotICAgICAgZnVuY3MgPSBjZmZfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggc2l6ZSApOwotICAgICAgaWYgKCBmdW5jcyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICBmdW5jcy0+ZGVzdHJveSggaW50ZXJuYWwtPnRvcGZvbnQgKTsKLQotICAgICAgICBmb3IgKCBpID0gZm9udC0+bnVtX3N1YmZvbnRzOyBpID4gMDsgaS0tICkKLSAgICAgICAgICBmdW5jcy0+ZGVzdHJveSggaW50ZXJuYWwtPnN1YmZvbnRzW2kgLSAxXSApOwotICAgICAgfQotCi0gICAgICBGVF9GUkVFKCBpbnRlcm5hbCApOwotICAgIH0KLSAgfQotCi0KLSAgLyogQ0ZGIGFuZCBUeXBlIDEgcHJpdmF0ZSBkaWN0aW9uYXJpZXMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgICAgICAqLwotICAvKiBzdHJ1Y3R1cmVzOyB3ZSBuZWVkIHRvIHN5bnRoZXNpemUgYSBUeXBlIDEgZGljdGlvbmFyeSBvbiB0aGUgZmx5ICovCi0KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX21ha2VfcHJpdmF0ZV9kaWN0KCBDRkZfU3ViRm9udCAgc3ViZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlICAgcHJpdiApCi0gIHsKLSAgICBDRkZfUHJpdmF0ZSAgY3ByaXYgPSAmc3ViZm9udC0+cHJpdmF0ZV9kaWN0OwotICAgIEZUX1VJbnQgICAgICBuLCBjb3VudDsKLQotCi0gICAgRlRfWkVSTyggcHJpdiApOwotCi0gICAgY291bnQgPSBwcml2LT5udW1fYmx1ZV92YWx1ZXMgPSBjcHJpdi0+bnVtX2JsdWVfdmFsdWVzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCi0gICAgICBwcml2LT5ibHVlX3ZhbHVlc1tuXSA9IChGVF9TaG9ydCljcHJpdi0+Ymx1ZV92YWx1ZXNbbl07Ci0KLSAgICBjb3VudCA9IHByaXYtPm51bV9vdGhlcl9ibHVlcyA9IGNwcml2LT5udW1fb3RoZXJfYmx1ZXM7Ci0gICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHByaXYtPm90aGVyX2JsdWVzW25dID0gKEZUX1Nob3J0KWNwcml2LT5vdGhlcl9ibHVlc1tuXTsKLQotICAgIGNvdW50ID0gcHJpdi0+bnVtX2ZhbWlseV9ibHVlcyA9IGNwcml2LT5udW1fZmFtaWx5X2JsdWVzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCi0gICAgICBwcml2LT5mYW1pbHlfYmx1ZXNbbl0gPSAoRlRfU2hvcnQpY3ByaXYtPmZhbWlseV9ibHVlc1tuXTsKLQotICAgIGNvdW50ID0gcHJpdi0+bnVtX2ZhbWlseV9vdGhlcl9ibHVlcyA9IGNwcml2LT5udW1fZmFtaWx5X290aGVyX2JsdWVzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCi0gICAgICBwcml2LT5mYW1pbHlfb3RoZXJfYmx1ZXNbbl0gPSAoRlRfU2hvcnQpY3ByaXYtPmZhbWlseV9vdGhlcl9ibHVlc1tuXTsKLQotICAgIHByaXYtPmJsdWVfc2NhbGUgPSBjcHJpdi0+Ymx1ZV9zY2FsZTsKLSAgICBwcml2LT5ibHVlX3NoaWZ0ID0gKEZUX0ludCljcHJpdi0+Ymx1ZV9zaGlmdDsKLSAgICBwcml2LT5ibHVlX2Z1enogID0gKEZUX0ludCljcHJpdi0+Ymx1ZV9mdXp6OwotCi0gICAgcHJpdi0+c3RhbmRhcmRfd2lkdGhbMF0gID0gKEZUX1VTaG9ydCljcHJpdi0+c3RhbmRhcmRfd2lkdGg7Ci0gICAgcHJpdi0+c3RhbmRhcmRfaGVpZ2h0WzBdID0gKEZUX1VTaG9ydCljcHJpdi0+c3RhbmRhcmRfaGVpZ2h0OwotCi0gICAgY291bnQgPSBwcml2LT5udW1fc25hcF93aWR0aHMgPSBjcHJpdi0+bnVtX3NuYXBfd2lkdGhzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCi0gICAgICBwcml2LT5zbmFwX3dpZHRoc1tuXSA9IChGVF9TaG9ydCljcHJpdi0+c25hcF93aWR0aHNbbl07Ci0KLSAgICBjb3VudCA9IHByaXYtPm51bV9zbmFwX2hlaWdodHMgPSBjcHJpdi0+bnVtX3NuYXBfaGVpZ2h0czsKLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgcHJpdi0+c25hcF9oZWlnaHRzW25dID0gKEZUX1Nob3J0KWNwcml2LT5zbmFwX2hlaWdodHNbbl07Ci0KLSAgICBwcml2LT5mb3JjZV9ib2xkICAgICA9IGNwcml2LT5mb3JjZV9ib2xkOwotICAgIHByaXYtPmxhbmd1YWdlX2dyb3VwID0gY3ByaXYtPmxhbmd1YWdlX2dyb3VwOwotICAgIHByaXYtPmxlbklWICAgICAgICAgID0gY3ByaXYtPmxlbklWOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfaW5pdCggRlRfU2l6ZSAgY2Zmc2l6ZSApICAgICAgICAgLyogQ0ZGX1NpemUgKi8KLSAgewotICAgIENGRl9TaXplICAgICAgICAgICBzaXplICA9IChDRkZfU2l6ZSljZmZzaXplOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3MgPSBjZmZfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggc2l6ZSApOwotCi0KLSAgICBpZiAoIGZ1bmNzICkKLSAgICB7Ci0gICAgICBDRkZfRmFjZSAgICAgIGZhY2UgICAgID0gKENGRl9GYWNlKWNmZnNpemUtPmZhY2U7Ci0gICAgICBDRkZfRm9udCAgICAgIGZvbnQgICAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsID0gTlVMTDsKLQotICAgICAgUFNfUHJpdmF0ZVJlYyAgcHJpdjsKLSAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSA9IGNmZnNpemUtPmZhY2UtPm1lbW9yeTsKLQotICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICBpZiAoIEZUX05FVyggaW50ZXJuYWwgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgY2ZmX21ha2VfcHJpdmF0ZV9kaWN0KCAmZm9udC0+dG9wX2ZvbnQsICZwcml2ICk7Ci0gICAgICBlcnJvciA9IGZ1bmNzLT5jcmVhdGUoIGNmZnNpemUtPmZhY2UtPm1lbW9yeSwgJnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm5hbC0+dG9wZm9udCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggaSA9IGZvbnQtPm51bV9zdWJmb250czsgaSA+IDA7IGktLSApCi0gICAgICB7Ci0gICAgICAgIENGRl9TdWJGb250ICBzdWIgPSBmb250LT5zdWJmb250c1tpIC0gMV07Ci0KLQotICAgICAgICBjZmZfbWFrZV9wcml2YXRlX2RpY3QoIHN1YiwgJnByaXYgKTsKLSAgICAgICAgZXJyb3IgPSBmdW5jcy0+Y3JlYXRlKCBjZmZzaXplLT5mYWNlLT5tZW1vcnksICZwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm5hbC0+c3ViZm9udHNbaSAtIDFdICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgY2Zmc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhID0gaW50ZXJuYWw7Ci0gICAgfQotCi0gICAgc2l6ZS0+c3RyaWtlX2luZGV4ID0gMHhGRkZGRkZGRlVMOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfc2l6ZV9zZWxlY3QoIEZUX1NpemUgICBzaXplLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBzdHJpa2VfaW5kZXggKQotICB7Ci0gICAgQ0ZGX1NpemUgICAgICAgICAgIGNmZnNpemUgPSAoQ0ZGX1NpemUpc2l6ZTsKLSAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3M7Ci0KLQotICAgIGNmZnNpemUtPnN0cmlrZV9pbmRleCA9IHN0cmlrZV9pbmRleDsKLQotICAgIEZUX1NlbGVjdF9NZXRyaWNzKCBzaXplLT5mYWNlLCBzdHJpa2VfaW5kZXggKTsKLQotICAgIGZ1bmNzID0gY2ZmX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MoIGNmZnNpemUgKTsKLQotICAgIGlmICggZnVuY3MgKQotICAgIHsKLSAgICAgIENGRl9GYWNlICAgICAgZmFjZSAgICAgPSAoQ0ZGX0ZhY2Upc2l6ZS0+ZmFjZTsKLSAgICAgIENGRl9Gb250ICAgICAgZm9udCAgICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICAgIENGRl9JbnRlcm5hbCAgaW50ZXJuYWwgPSAoQ0ZGX0ludGVybmFsKXNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YTsKLQotICAgICAgRlRfTG9uZyAgdG9wX3VwbSAgPSAoRlRfTG9uZylmb250LT50b3BfZm9udC5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICBmdW5jcy0+c2V0X3NjYWxlKCBpbnRlcm5hbC0+dG9wZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPm1ldHJpY3MueF9zY2FsZSwgc2l6ZS0+bWV0cmljcy55X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCApOwotCi0gICAgICBmb3IgKCBpID0gZm9udC0+bnVtX3N1YmZvbnRzOyBpID4gMDsgaS0tICkKLSAgICAgIHsKLSAgICAgICAgQ0ZGX1N1YkZvbnQgIHN1YiAgICAgPSBmb250LT5zdWJmb250c1tpIC0gMV07Ci0gICAgICAgIEZUX0xvbmcgICAgICBzdWJfdXBtID0gKEZUX0xvbmcpc3ViLT5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotICAgICAgICBGVF9Qb3MgICAgICAgeF9zY2FsZSwgeV9zY2FsZTsKLQotCi0gICAgICAgIGlmICggdG9wX3VwbSAhPSBzdWJfdXBtICkKLSAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSBGVF9NdWxEaXYoIHNpemUtPm1ldHJpY3MueF9zY2FsZSwgdG9wX3VwbSwgc3ViX3VwbSApOwotICAgICAgICAgIHlfc2NhbGUgPSBGVF9NdWxEaXYoIHNpemUtPm1ldHJpY3MueV9zY2FsZSwgdG9wX3VwbSwgc3ViX3VwbSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSBzaXplLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICAgICAgeV9zY2FsZSA9IHNpemUtPm1ldHJpY3MueV9zY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmNzLT5zZXRfc2NhbGUoIGludGVybmFsLT5zdWJmb250c1tpIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHhfc2NhbGUsIHlfc2NhbGUsIDAsIDAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfc2l6ZV9yZXF1ZXN0KCBGVF9TaXplICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICkKLSAgewotICAgIENGRl9TaXplICAgICAgICAgICBjZmZzaXplID0gKENGRl9TaXplKXNpemU7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzOwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICAgIGlmICggRlRfSEFTX0ZJWEVEX1NJWkVTKCBzaXplLT5mYWNlICkgKQotICAgIHsKLSAgICAgIENGRl9GYWNlICAgICAgY2ZmZmFjZSA9IChDRkZfRmFjZSlzaXplLT5mYWNlOwotICAgICAgU0ZOVF9TZXJ2aWNlICBzZm50ICAgID0gKFNGTlRfU2VydmljZSljZmZmYWNlLT5zZm50OwotICAgICAgRlRfVUxvbmcgICAgICBzdHJpa2VfaW5kZXg7Ci0KLQotICAgICAgaWYgKCBzZm50LT5zZXRfc2JpdF9zdHJpa2UoIGNmZmZhY2UsIHJlcSwgJnN0cmlrZV9pbmRleCApICkKLSAgICAgICAgY2Zmc2l6ZS0+c3RyaWtlX2luZGV4ID0gMHhGRkZGRkZGRlVMOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gY2ZmX3NpemVfc2VsZWN0KCBzaXplLCBzdHJpa2VfaW5kZXggKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotICAgIEZUX1JlcXVlc3RfTWV0cmljcyggc2l6ZS0+ZmFjZSwgcmVxICk7Ci0KLSAgICBmdW5jcyA9IGNmZl9zaXplX2dldF9nbG9iYWxzX2Z1bmNzKCBjZmZzaXplICk7Ci0KLSAgICBpZiAoIGZ1bmNzICkKLSAgICB7Ci0gICAgICBDRkZfRmFjZSAgICAgIGNmZmZhY2UgID0gKENGRl9GYWNlKXNpemUtPmZhY2U7Ci0gICAgICBDRkZfRm9udCAgICAgIGZvbnQgICAgID0gKENGRl9Gb250KWNmZmZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsID0gKENGRl9JbnRlcm5hbClzaXplLT5pbnRlcm5hbC0+bW9kdWxlX2RhdGE7Ci0KLSAgICAgIEZUX0xvbmcgIHRvcF91cG0gID0gKEZUX0xvbmcpZm9udC0+dG9wX2ZvbnQuZm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKLSAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgZnVuY3MtPnNldF9zY2FsZSggaW50ZXJuYWwtPnRvcGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplLT5tZXRyaWNzLnhfc2NhbGUsIHNpemUtPm1ldHJpY3MueV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAgKTsKLQotICAgICAgZm9yICggaSA9IGZvbnQtPm51bV9zdWJmb250czsgaSA+IDA7IGktLSApCi0gICAgICB7Ci0gICAgICAgIENGRl9TdWJGb250ICBzdWIgICAgID0gZm9udC0+c3ViZm9udHNbaSAtIDFdOwotICAgICAgICBGVF9Mb25nICAgICAgc3ViX3VwbSA9IChGVF9Mb25nKXN1Yi0+Zm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKLSAgICAgICAgRlRfUG9zICAgICAgIHhfc2NhbGUsIHlfc2NhbGU7Ci0KLQotICAgICAgICBpZiAoIHRvcF91cG0gIT0gc3ViX3VwbSApCi0gICAgICAgIHsKLSAgICAgICAgICB4X3NjYWxlID0gRlRfTXVsRGl2KCBzaXplLT5tZXRyaWNzLnhfc2NhbGUsIHRvcF91cG0sIHN1Yl91cG0gKTsKLSAgICAgICAgICB5X3NjYWxlID0gRlRfTXVsRGl2KCBzaXplLT5tZXRyaWNzLnlfc2NhbGUsIHRvcF91cG0sIHN1Yl91cG0gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB4X3NjYWxlID0gc2l6ZS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgICAgIHlfc2NhbGUgPSBzaXplLT5tZXRyaWNzLnlfc2NhbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jcy0+c2V0X3NjYWxlKCBpbnRlcm5hbC0+c3ViZm9udHNbaSAtIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4X3NjYWxlLCB5X3NjYWxlLCAwLCAwICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTE9UICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmZl9zbG90X2RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSBOVUxMOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX3Nsb3RfaW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIENGRl9GYWNlICAgICAgICAgIGZhY2UgICAgID0gKENGRl9GYWNlKXNsb3QtPmZhY2U7Ci0gICAgQ0ZGX0ZvbnQgICAgICAgICAgZm9udCAgICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBQU0hpbnRlcl9TZXJ2aWNlICBwc2hpbnRlciA9IGZvbnQtPnBzaGludGVyOwotCi0KLSAgICBpZiAoIHBzaGludGVyICkKLSAgICB7Ci0gICAgICBGVF9Nb2R1bGUgIG1vZHVsZTsKLQotCi0gICAgICBtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBzbG90LT5mYWNlLT5kcml2ZXItPnJvb3QubGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2hpbnRlciIgKTsKLSAgICAgIGlmICggbW9kdWxlICkKLSAgICAgIHsKLSAgICAgICAgVDJfSGludHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICAgICAgZnVuY3MgPSBwc2hpbnRlci0+Z2V0X3QyX2Z1bmNzKCBtb2R1bGUgKTsKLSAgICAgICAgc2xvdC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzID0gKHZvaWQqKWZ1bmNzOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgRlRfU3RyaW5nKgotICBjZmZfc3RyY3B5KCBGVF9NZW1vcnkgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHNvdXJjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9TdHJpbmcqICByZXN1bHQ7Ci0KLQotICAgICh2b2lkKUZUX1NUUkRVUCggcmVzdWx0LCBzb3VyY2UgKTsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIFN0cmlwIGFsbCBzdWJzZXQgcHJlZml4ZXMgb2YgdGhlIGZvcm0gYEFCQ0RFRisnLiAgVXN1YWxseSwgdGhlcmUgKi8KLSAgLyogaXMgb25seSBvbmUsIGJ1dCBmb250IG5hbWVzIGxpa2UgYEFQQ09PRytKRkFCVEQrRnV0dXJhQlEtQm9sZCcgICAqLwotICAvKiBoYXZlIGJlZW4gc2VlbiBpbiB0aGUgd2lsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgcmVtb3ZlX3N1YnNldF9wcmVmaXgoIEZUX1N0cmluZyogIG5hbWUgKQotICB7Ci0gICAgRlRfSW50MzIgIGlkeCAgICAgICAgICAgICA9IDA7Ci0gICAgRlRfSW50MzIgIGxlbmd0aCAgICAgICAgICA9IChGVF9JbnQzMilzdHJsZW4oIG5hbWUgKSArIDE7Ci0gICAgRlRfQm9vbCAgIGNvbnRpbnVlX3NlYXJjaCA9IDE7Ci0KLQotICAgIHdoaWxlICggY29udGludWVfc2VhcmNoICkKLSAgICB7Ci0gICAgICBpZiAoIGxlbmd0aCA+PSA3ICYmIG5hbWVbNl0gPT0gJysnICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgNjsgaWR4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogQVNDSUkgdXBwZXJjYXNlIGxldHRlcnMgKi8KLSAgICAgICAgICBpZiAoICEoICdBJyA8PSBuYW1lW2lkeF0gJiYgbmFtZVtpZHhdIDw9ICdaJyApICkKLSAgICAgICAgICAgIGNvbnRpbnVlX3NlYXJjaCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGNvbnRpbnVlX3NlYXJjaCApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKCBpZHggPSA3OyBpZHggPCBsZW5ndGg7IGlkeCsrICkKLSAgICAgICAgICAgIG5hbWVbaWR4IC0gN10gPSBuYW1lW2lkeF07Ci0gICAgICAgICAgbGVuZ3RoIC09IDc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgY29udGludWVfc2VhcmNoID0gMDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIFJlbW92ZSB0aGUgc3R5bGUgcGFydCBmcm9tIHRoZSBmYW1pbHkgbmFtZSAoaWYgcHJlc2VudCkuICovCi0KLSAgc3RhdGljIHZvaWQKLSAgcmVtb3ZlX3N0eWxlKCBGVF9TdHJpbmcqICAgICAgICBmYW1pbHlfbmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBzdHlsZV9uYW1lICkKLSAgewotICAgIEZUX0ludDMyICBmYW1pbHlfbmFtZV9sZW5ndGgsIHN0eWxlX25hbWVfbGVuZ3RoOwotCi0KLSAgICBmYW1pbHlfbmFtZV9sZW5ndGggPSAoRlRfSW50MzIpc3RybGVuKCBmYW1pbHlfbmFtZSApOwotICAgIHN0eWxlX25hbWVfbGVuZ3RoICA9IChGVF9JbnQzMilzdHJsZW4oIHN0eWxlX25hbWUgKTsKLQotICAgIGlmICggZmFtaWx5X25hbWVfbGVuZ3RoID4gc3R5bGVfbmFtZV9sZW5ndGggKQotICAgIHsKLSAgICAgIEZUX0ludCAgaWR4OwotCi0KLSAgICAgIGZvciAoIGlkeCA9IDE7IGlkeCA8PSBzdHlsZV9uYW1lX2xlbmd0aDsgaWR4KysgKQotICAgICAgewotICAgICAgICBpZiAoIGZhbWlseV9uYW1lW2ZhbWlseV9uYW1lX2xlbmd0aCAtIGlkeF0gIT0KLSAgICAgICAgICAgICBzdHlsZV9uYW1lW3N0eWxlX25hbWVfbGVuZ3RoIC0gaWR4XSApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggaWR4ID4gc3R5bGVfbmFtZV9sZW5ndGggKQotICAgICAgewotICAgICAgICAvKiBmYW1pbHlfbmFtZSBlbmRzIHdpdGggc3R5bGVfbmFtZTsgcmVtb3ZlIGl0ICovCi0gICAgICAgIGlkeCA9IGZhbWlseV9uYW1lX2xlbmd0aCAtIHN0eWxlX25hbWVfbGVuZ3RoIC0gMTsKLQotICAgICAgICAvKiBhbHNvIHJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMgICAgICovCi0gICAgICAgIC8qIGJldHdlZW4gcmVhbCBmYW1pbHkgbmFtZSBhbmQgc3R5bGUgKi8KLSAgICAgICAgd2hpbGUgKCBpZHggPiAwICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAoIGZhbWlseV9uYW1lW2lkeF0gPT0gJy0nIHx8Ci0gICAgICAgICAgICAgICAgICBmYW1pbHlfbmFtZVtpZHhdID09ICcgJyB8fAotICAgICAgICAgICAgICAgICAgZmFtaWx5X25hbWVbaWR4XSA9PSAnXycgfHwKLSAgICAgICAgICAgICAgICAgIGZhbWlseV9uYW1lW2lkeF0gPT0gJysnICkgKQotICAgICAgICAgIGlkeC0tOwotCi0gICAgICAgIGlmICggaWR4ID4gMCApCi0gICAgICAgICAgZmFtaWx5X25hbWVbaWR4ICsgMV0gPSAnXDAnOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9mYWNlX2luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgY2ZmZmFjZSwgICAgICAgIC8qIENGRl9GYWNlICovCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCi0gIHsKLSAgICBDRkZfRmFjZSAgICAgICAgICAgIGZhY2UgICAgICAgID0gKENGRl9GYWNlKWNmZmZhY2U7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsKLSAgICBTRk5UX1NlcnZpY2UgICAgICAgIHNmbnQ7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzOwotICAgIFBTSGludGVyX1NlcnZpY2UgICAgcHNoaW50ZXI7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICBwdXJlX2NmZiAgICA9IDE7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICBjZmYyICAgICAgICA9IDA7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICBzZm50X2Zvcm1hdCA9IDA7Ci0gICAgRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5ICAgICA9IGNmZmZhY2UtPmRyaXZlci0+cm9vdC5saWJyYXJ5OwotCi0KLSAgICBzZm50ID0gKFNGTlRfU2VydmljZSlGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSgKLSAgICAgICAgICAgICBsaWJyYXJ5LCAic2ZudCIgKTsKLSAgICBpZiAoICFzZm50ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJjZmZfZmFjZV9pbml0OiBjYW5ub3QgYWNjZXNzIGBzZm50JyBtb2R1bGVcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX01vZHVsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSggZmFjZSwgcHNuYW1lcywgUE9TVFNDUklQVF9DTUFQUyApOwotCi0gICAgcHNoaW50ZXIgPSAoUFNIaW50ZXJfU2VydmljZSlGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICAgbGlicmFyeSwgInBzaGludGVyIiApOwotCi0gICAgRlRfVFJBQ0UyKCggIkNGRiBkcml2ZXJcbiIgKSk7Ci0KLSAgICAvKiBjcmVhdGUgaW5wdXQgc3RyZWFtIGZyb20gcmVzb3VyY2UgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCAwICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgdmFsaWQgT3BlblR5cGUgZmlsZSAqLwotICAgIEZUX1RSQUNFMigoICIgICIgKSk7Ci0gICAgZXJyb3IgPSBzZm50LT5pbml0X2ZhY2UoIHN0cmVhbSwgZmFjZSwgZmFjZV9pbmRleCwgbnVtX3BhcmFtcywgcGFyYW1zICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggZmFjZS0+Zm9ybWF0X3RhZyAhPSBUVEFHX09UVE8gKSAgLyogYE9UVE8nOyBPcGVuVHlwZS9DRkYgZm9udCAqLwotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiICBub3QgYW4gT3BlblR5cGUvQ0ZGIGZvbnRcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBpZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHNpbXBsZSBmb250IGZvcm1hdCBjaGVjaywgZXhpdCBpbW1lZGlhdGVseSAqLwotICAgICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICAgIHNmbnRfZm9ybWF0ID0gMTsKLQotICAgICAgLyogbm93LCB0aGUgZm9udCBjYW4gYmUgZWl0aGVyIGFuIE9wZW5UeXBlL0NGRiBmb250LCBvciBhbiBTVkcgQ0VGICovCi0gICAgICAvKiBmb250OyBpbiB0aGUgbGF0dGVyIGNhc2UgaXQgZG9lc24ndCBoYXZlIGEgYGhlYWQnIHRhYmxlICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19oZWFkLCBzdHJlYW0sIDAgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgcHVyZV9jZmYgPSAwOwotCi0gICAgICAgIC8qIGxvYWQgZm9udCBkaXJlY3RvcnkgKi8KLSAgICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX2ZhY2UoIHN0cmVhbSwgZmFjZSwgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXMsIHBhcmFtcyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGxvYWQgdGhlIGBjbWFwJyB0YWJsZSBleHBsaWNpdGx5ICovCi0gICAgICAgIGVycm9yID0gc2ZudC0+bG9hZF9jbWFwKCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBub3cgbG9hZCB0aGUgQ0ZGIHBhcnQgb2YgdGhlIGZpbGU7ICovCi0gICAgICAvKiBnaXZlIHByaW9yaXR5IHRvIENGRjIgICAgICAgICAgICAgICovCi0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfQ0ZGMiwgc3RyZWFtLCAwICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGNmZjIgICAgICAgICAgPSAxOwotICAgICAgICBmYWNlLT5pc19jZmYyID0gY2ZmMjsKLSAgICAgIH0KLQotICAgICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgKQotICAgICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfQ0ZGLCBzdHJlYW0sIDAgKTsKLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJld2luZCB0byBzdGFydCBvZiBmaWxlOyB3ZSBhcmUgZ29pbmcgdG8gbG9hZCBhIHB1cmUtQ0ZGIGZvbnQgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIH0KLQotICAgIC8qIG5vdyBsb2FkIGFuZCBwYXJzZSB0aGUgQ0ZGIHRhYmxlIGluIHRoZSBmaWxlICovCi0gICAgewotICAgICAgQ0ZGX0ZvbnQgICAgICAgICBjZmYgPSBOVUxMOwotICAgICAgQ0ZGX0ZvbnRSZWNEaWN0ICBkaWN0OwotICAgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgPSBjZmZmYWNlLT5tZW1vcnk7Ci0gICAgICBGVF9JbnQzMiAgICAgICAgIGZsYWdzOwotICAgICAgRlRfVUludCAgICAgICAgICBpOwotCi0KLSAgICAgIGlmICggRlRfTkVXKCBjZmYgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZmFjZS0+ZXh0cmEuZGF0YSA9IGNmZjsKLSAgICAgIGVycm9yID0gY2ZmX2ZvbnRfbG9hZCggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmVfY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmYyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBpZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHNpbXBsZSBmb250IGZvcm1hdCBjaGVjaywgZXhpdCBpbW1lZGlhdGVseSAqLwotICAgICAgLyogKHRoaXMgaXMgaGVyZSBmb3IgcHVyZSBDRkYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgewotICAgICAgICBjZmZmYWNlLT5udW1fZmFjZXMgPSAoRlRfTG9uZyljZmYtPm51bV9mYWNlczsKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgIH0KLQotICAgICAgY2ZmLT5wc2hpbnRlciA9IHBzaGludGVyOwotICAgICAgY2ZmLT5wc25hbWVzICA9IHBzbmFtZXM7Ci0KLSAgICAgIGNmZmZhY2UtPmZhY2VfaW5kZXggPSBmYWNlX2luZGV4ICYgMHhGRkZGOwotCi0gICAgICAvKiBDb21wbGVtZW50IHRoZSByb290IGZsYWdzIHdpdGggc29tZSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbi4gKi8KLSAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBwdXJlIENGRiBhbmQgQ0VGIGZvbnRzOyAqLwotICAgICAgLyogU0ZOVCBiYXNlZCBmb250cyB1c2UgdGhlIGBuYW1lJyB0YWJsZSBpbnN0ZWFkLiAgICAgICAgICAgICAgICovCi0KLSAgICAgIGNmZmZhY2UtPm51bV9nbHlwaHMgPSAoRlRfTG9uZyljZmYtPm51bV9nbHlwaHM7Ci0KLSAgICAgIGRpY3QgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7Ci0KLSAgICAgIC8qIHdlIG5lZWQgdGhlIGBQU05hbWVzJyBtb2R1bGUgZm9yIENGRiBhbmQgQ0VGIGZvcm1hdHMgKi8KLSAgICAgIC8qIHdoaWNoIGFyZW4ndCBDSUQta2V5ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgJiYgIXBzbmFtZXMgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfZmFjZV9pbml0OiIKLSAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBvcGVuIENGRiAmIENFRiBmb250c1xuIgotICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAiIHdpdGhvdXQgdGhlIGBQU05hbWVzJyBtb2R1bGVcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIE1pc3NpbmdfTW9kdWxlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgICAgIGlkeDsKLSAgICAgICAgRlRfU3RyaW5nKiAgczsKLQotCi0gICAgICAgIEZUX1RSQUNFNCgoICJTSURzXG4iICkpOwotCi0gICAgICAgIC8qIGR1bXAgc3RyaW5nIGluZGV4LCBpbmNsdWRpbmcgZGVmYXVsdCBzdHJpbmdzIGZvciBjb252ZW5pZW5jZSAqLwotICAgICAgICBmb3IgKCBpZHggPSAwOyBpZHggPD0gMzkwOyBpZHgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBzID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBjZmYsIGlkeCApOwotICAgICAgICAgIGlmICggcyApCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiICAlNWQgJXNcbiIsIGlkeCwgcyApKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluIE11bHRpcGxlIE1hc3RlciBDRkZzLCB0d28gU0lEcyBob2xkIHRoZSBOb3JtYWxpemUgRGVzaWduICAqLwotICAgICAgICAvKiBWZWN0b3IgKE5EVikgYW5kIENvbnZlcnQgRGVzaWduIFZlY3RvciAoQ0RWKSBjaGFyc3RyaW5ncywgICAgKi8KLSAgICAgICAgLyogd2hpY2ggbWF5IGNvbnRhaW4gTlVMTCBieXRlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBkYXRhLCB0b28uICovCi0gICAgICAgIC8qIFdlIHRodXMgYWNjZXNzIGBjZmYtPnN0cmluZ3MnIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBmb3IgKCBpZHggPSAxOyBpZHggPCBjZmYtPm51bV9zdHJpbmdzOyBpZHgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgICBzMSAgICA9IGNmZi0+c3RyaW5nc1tpZHggLSAxXTsKLSAgICAgICAgICBGVF9CeXRlKiAgICBzMiAgICA9IGNmZi0+c3RyaW5nc1tpZHhdOwotICAgICAgICAgIEZUX1B0ckRpc3QgIHMxbGVuID0gczIgLSBzMSAtIDE7IC8qIHdpdGhvdXQgdGhlIGZpbmFsIE5VTEwgYnl0ZSAqLwotICAgICAgICAgIEZUX1B0ckRpc3QgIGw7Ci0KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgICU1ZCAiLCBpZHggKyAzOTAgKSk7Ci0gICAgICAgICAgZm9yICggbCA9IDA7IGwgPCBzMWxlbjsgbCsrICkKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIlYyIsIHMxW2xdICkpOwotICAgICAgICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwcmludCBsYXN0IGVsZW1lbnQgKi8KLSAgICAgICAgaWYgKCBjZmYtPm51bV9zdHJpbmdzICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICAgIHMxICAgID0gY2ZmLT5zdHJpbmdzW2NmZi0+bnVtX3N0cmluZ3MgLSAxXTsKLSAgICAgICAgICBGVF9CeXRlKiAgICBzMiAgICA9IGNmZi0+c3RyaW5nX3Bvb2wgKyBjZmYtPnN0cmluZ19wb29sX3NpemU7Ci0gICAgICAgICAgRlRfUHRyRGlzdCAgczFsZW4gPSBzMiAtIHMxIC0gMTsKLSAgICAgICAgICBGVF9QdHJEaXN0ICBsOwotCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiICAlNWQgIiwgY2ZmLT5udW1fc3RyaW5ncyArIDM5MCApKTsKLSAgICAgICAgICBmb3IgKCBsID0gMDsgbCA8IHMxbGVuOyBsKysgKQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiVjIiwgczFbbF0gKSk7Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgICAgICAgfQotICAgICAgfQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgICB7Ci0gICAgICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBtbSA9IChGVF9TZXJ2aWNlX011bHRpTWFzdGVycylmYWNlLT5tbTsKLQotICAgICAgICBGVF9JbnQgIGluc3RhbmNlX2luZGV4ID0gZmFjZV9pbmRleCA+PiAxNjsKLQotCi0gICAgICAgIGlmICggRlRfSEFTX01VTFRJUExFX01BU1RFUlMoIGNmZmZhY2UgKSAmJgotICAgICAgICAgICAgIG1tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBpbnN0YW5jZV9pbmRleCA+IDAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIEZUX01NX1ZhciogIG1tX3ZhcjsKLQotCi0gICAgICAgICAgZXJyb3IgPSBtbS0+Z2V0X21tX3ZhciggY2ZmZmFjZSwgTlVMTCApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgbW0tPmdldF92YXJfYmxlbmQoIGNmZmZhY2UsIE5VTEwsIE5VTEwsIE5VTEwsICZtbV92YXIgKTsKLQotICAgICAgICAgIGlmICggbW1fdmFyLT5uYW1lZHN0eWxlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WYXJfTmFtZWRfU3R5bGUqICBuYW1lZF9zdHlsZTsKLSAgICAgICAgICAgIEZUX1N0cmluZyogICAgICAgICAgIHN0eWxlX25hbWU7Ci0KLQotICAgICAgICAgICAgLyogaW4gYGZhY2VfaW5kZXgnLCB0aGUgaW5zdGFuY2UgaW5kZXggc3RhcnRzIHdpdGggdmFsdWUgMSAqLwotICAgICAgICAgICAgbmFtZWRfc3R5bGUgPSBtbV92YXItPm5hbWVkc3R5bGUgKyBpbnN0YW5jZV9pbmRleCAtIDE7Ci0gICAgICAgICAgICBlcnJvciA9IHNmbnQtPmdldF9uYW1lKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydCluYW1lZF9zdHlsZS0+c3RyaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGVfbmFtZSApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgICAgLyogc2V0IHN0eWxlIG5hbWU7IGlmIGFscmVhZHkgc2V0LCByZXBsYWNlIGl0ICovCi0gICAgICAgICAgICBpZiAoIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSApCi0gICAgICAgICAgICAgIEZUX0ZSRUUoIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSApOwotICAgICAgICAgICAgZmFjZS0+cm9vdC5zdHlsZV9uYW1lID0gc3R5bGVfbmFtZTsKLQotICAgICAgICAgICAgLyogZmluYWxseSwgc2VsZWN0IHRoZSBuYW1lZCBpbnN0YW5jZSAqLwotICAgICAgICAgICAgZXJyb3IgPSBtbS0+c2V0X3Zhcl9kZXNpZ24oIGNmZmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fdmFyLT5udW1fYXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZF9zdHlsZS0+Y29vcmRzICk7Ci0gICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotICAgICAgaWYgKCAhZGljdC0+aGFzX2ZvbnRfbWF0cml4ICkKLSAgICAgICAgZGljdC0+dW5pdHNfcGVyX2VtID0gcHVyZV9jZmYgPyAxMDAwIDogZmFjZS0+cm9vdC51bml0c19wZXJfRU07Ci0KLSAgICAgIC8qIE5vcm1hbGl6ZSB0aGUgZm9udCBtYXRyaXggc28gdGhhdCBgbWF0cml4LT55eScgaXMgMTsgaWYgICovCi0gICAgICAvKiBpdCBpcyB6ZXJvLCB3ZSB1c2UgYG1hdHJpeC0+eXgnIGluc3RlYWQuICBUaGUgc2NhbGluZyBpcyAqLwotICAgICAgLyogZG9uZSB3aXRoIGB1bml0c19wZXJfZW0nIHRoZW4gKGF0IHRoaXMgcG9pbnQsIGl0IGFscmVhZHkgKi8KLSAgICAgIC8qIGNvbnRhaW5zIHRoZSBzY2FsaW5nIGZhY3RvciwgYnV0IHdpdGhvdXQgbm9ybWFsaXphdGlvbiAgICovCi0gICAgICAvKiBvZiB0aGUgbWF0cml4KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgb2Zmc2V0cyBtdXN0IGJlIGV4cHJlc3NlZCBpbiBpbnRlZ2VyIGZvbnQgICovCi0gICAgICAvKiB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICB7Ci0gICAgICAgIEZUX01hdHJpeCogIG1hdHJpeCA9ICZkaWN0LT5mb250X21hdHJpeDsKLSAgICAgICAgRlRfVmVjdG9yKiAgb2Zmc2V0ID0gJmRpY3QtPmZvbnRfb2Zmc2V0OwotICAgICAgICBGVF9VTG9uZyogICB1cG0gICAgPSAmZGljdC0+dW5pdHNfcGVyX2VtOwotICAgICAgICBGVF9GaXhlZCAgICB0ZW1wOwotCi0KLSAgICAgICAgdGVtcCA9IG1hdHJpeC0+eXkgPyBGVF9BQlMoIG1hdHJpeC0+eXkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX0FCUyggbWF0cml4LT55eCApOwotCi0gICAgICAgIGlmICggdGVtcCAhPSAweDEwMDAwTCApCi0gICAgICAgIHsKLSAgICAgICAgICAqdXBtID0gKEZUX1VMb25nKUZUX0RpdkZpeCggKEZUX0xvbmcpKnVwbSwgdGVtcCApOwotCi0gICAgICAgICAgbWF0cml4LT54eCA9IEZUX0RpdkZpeCggbWF0cml4LT54eCwgdGVtcCApOwotICAgICAgICAgIG1hdHJpeC0+eXggPSBGVF9EaXZGaXgoIG1hdHJpeC0+eXgsIHRlbXAgKTsKLSAgICAgICAgICBtYXRyaXgtPnh5ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnh5LCB0ZW1wICk7Ci0gICAgICAgICAgbWF0cml4LT55eSA9IEZUX0RpdkZpeCggbWF0cml4LT55eSwgdGVtcCApOwotICAgICAgICAgIG9mZnNldC0+eCAgPSBGVF9EaXZGaXgoIG9mZnNldC0+eCwgIHRlbXAgKTsKLSAgICAgICAgICBvZmZzZXQtPnkgID0gRlRfRGl2Rml4KCBvZmZzZXQtPnksICB0ZW1wICk7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQtPnggPj49IDE2OwotICAgICAgICBvZmZzZXQtPnkgPj49IDE2OwotICAgICAgfQotCi0gICAgICBmb3IgKCBpID0gY2ZmLT5udW1fc3ViZm9udHM7IGkgPiAwOyBpLS0gKQotICAgICAgewotICAgICAgICBDRkZfRm9udFJlY0RpY3QgIHN1YiA9ICZjZmYtPnN1YmZvbnRzW2kgLSAxXS0+Zm9udF9kaWN0OwotICAgICAgICBDRkZfRm9udFJlY0RpY3QgIHRvcCA9ICZjZmYtPnRvcF9mb250LmZvbnRfZGljdDsKLQotICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXg7Ci0gICAgICAgIEZUX1ZlY3RvciogIG9mZnNldDsKLSAgICAgICAgRlRfVUxvbmcqICAgdXBtOwotICAgICAgICBGVF9GaXhlZCAgICB0ZW1wOwotCi0KLSAgICAgICAgaWYgKCBzdWItPmhhc19mb250X21hdHJpeCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Mb25nICBzY2FsaW5nOwotCi0KLSAgICAgICAgICAvKiBpZiB3ZSBoYXZlIGEgdG9wLWxldmVsIG1hdHJpeCwgKi8KLSAgICAgICAgICAvKiBjb25jYXRlbmF0ZSB0aGUgc3ViZm9udCBtYXRyaXggKi8KLQotICAgICAgICAgIGlmICggdG9wLT5oYXNfZm9udF9tYXRyaXggKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggdG9wLT51bml0c19wZXJfZW0gPiAxICYmIHN1Yi0+dW5pdHNfcGVyX2VtID4gMSApCi0gICAgICAgICAgICAgIHNjYWxpbmcgPSAoRlRfTG9uZylGVF9NSU4oIHRvcC0+dW5pdHNfcGVyX2VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnVuaXRzX3Blcl9lbSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBzY2FsaW5nID0gMTsKLQotICAgICAgICAgICAgRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZCggJnRvcC0+Zm9udF9tYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViLT5mb250X21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcgKTsKLSAgICAgICAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm1fU2NhbGVkKCAmc3ViLT5mb250X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLT5mb250X21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nICk7Ci0KLSAgICAgICAgICAgIHN1Yi0+dW5pdHNfcGVyX2VtID0gKEZUX1VMb25nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggKEZUX0xvbmcpc3ViLT51bml0c19wZXJfZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZyl0b3AtPnVuaXRzX3Blcl9lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3ViLT5mb250X21hdHJpeCA9IHRvcC0+Zm9udF9tYXRyaXg7Ci0gICAgICAgICAgc3ViLT5mb250X29mZnNldCA9IHRvcC0+Zm9udF9vZmZzZXQ7Ci0KLSAgICAgICAgICBzdWItPnVuaXRzX3Blcl9lbSA9IHRvcC0+dW5pdHNfcGVyX2VtOwotICAgICAgICB9Ci0KLSAgICAgICAgbWF0cml4ID0gJnN1Yi0+Zm9udF9tYXRyaXg7Ci0gICAgICAgIG9mZnNldCA9ICZzdWItPmZvbnRfb2Zmc2V0OwotICAgICAgICB1cG0gICAgPSAmc3ViLT51bml0c19wZXJfZW07Ci0KLSAgICAgICAgdGVtcCA9IG1hdHJpeC0+eXkgPyBGVF9BQlMoIG1hdHJpeC0+eXkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX0FCUyggbWF0cml4LT55eCApOwotCi0KLSAgICAgICAgaWYgKCB0ZW1wICE9IDB4MTAwMDBMICkKLSAgICAgICAgewotICAgICAgICAgICp1cG0gPSAoRlRfVUxvbmcpRlRfRGl2Rml4KCAoRlRfTG9uZykqdXBtLCB0ZW1wICk7Ci0KLSAgICAgICAgICBtYXRyaXgtPnh4ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnh4LCB0ZW1wICk7Ci0gICAgICAgICAgbWF0cml4LT55eCA9IEZUX0RpdkZpeCggbWF0cml4LT55eCwgdGVtcCApOwotICAgICAgICAgIG1hdHJpeC0+eHkgPSBGVF9EaXZGaXgoIG1hdHJpeC0+eHksIHRlbXAgKTsKLSAgICAgICAgICBtYXRyaXgtPnl5ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnl5LCB0ZW1wICk7Ci0gICAgICAgICAgb2Zmc2V0LT54ICA9IEZUX0RpdkZpeCggb2Zmc2V0LT54LCAgdGVtcCApOwotICAgICAgICAgIG9mZnNldC0+eSAgPSBGVF9EaXZGaXgoIG9mZnNldC0+eSwgIHRlbXAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZnNldC0+eCA+Pj0gMTY7Ci0gICAgICAgIG9mZnNldC0+eSA+Pj0gMTY7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcHVyZV9jZmYgKQotICAgICAgewotICAgICAgICBjaGFyKiAgc3R5bGVfbmFtZSA9IE5VTEw7Ci0KLQotICAgICAgICAvKiBzZXQgdXAgbnVtX2ZhY2VzICovCi0gICAgICAgIGNmZmZhY2UtPm51bV9mYWNlcyA9IChGVF9Mb25nKWNmZi0+bnVtX2ZhY2VzOwotCi0gICAgICAgIC8qIGNvbXB1dGUgbnVtYmVyIG9mIGdseXBocyAqLwotICAgICAgICBpZiAoIGRpY3QtPmNpZF9yZWdpc3RyeSAhPSAweEZGRkZVICkKLSAgICAgICAgICBjZmZmYWNlLT5udW1fZ2x5cGhzID0gKEZUX0xvbmcpKCBjZmYtPmNoYXJzZXQubWF4X2NpZCArIDEgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGNmZmZhY2UtPm51bV9nbHlwaHMgPSAoRlRfTG9uZyljZmYtPmNoYXJzdHJpbmdzX2luZGV4LmNvdW50OwotCi0gICAgICAgIC8qIHNldCBnbG9iYWwgYmJveCwgYXMgd2VsbCBhcyBFTSBzaXplICovCi0gICAgICAgIGNmZmZhY2UtPmJib3gueE1pbiA9ICAgZGljdC0+Zm9udF9iYm94LnhNaW4gICAgICAgICAgICA+PiAxNjsKLSAgICAgICAgY2ZmZmFjZS0+YmJveC55TWluID0gICBkaWN0LT5mb250X2Jib3gueU1pbiAgICAgICAgICAgID4+IDE2OwotICAgICAgICAvKiBubyBgVScgc3VmZml4IGhlcmUgdG8gMHhGRkZGISAqLwotICAgICAgICBjZmZmYWNlLT5iYm94LnhNYXggPSAoIGRpY3QtPmZvbnRfYmJveC54TWF4ICsgMHhGRkZGICkgPj4gMTY7Ci0gICAgICAgIGNmZmZhY2UtPmJib3gueU1heCA9ICggZGljdC0+Zm9udF9iYm94LnlNYXggKyAweEZGRkYgKSA+PiAxNjsKLQotICAgICAgICBjZmZmYWNlLT51bml0c19wZXJfRU0gPSAoRlRfVVNob3J0KSggZGljdC0+dW5pdHNfcGVyX2VtICk7Ci0KLSAgICAgICAgY2ZmZmFjZS0+YXNjZW5kZXIgID0gKEZUX1Nob3J0KSggY2ZmZmFjZS0+YmJveC55TWF4ICk7Ci0gICAgICAgIGNmZmZhY2UtPmRlc2NlbmRlciA9IChGVF9TaG9ydCkoIGNmZmZhY2UtPmJib3gueU1pbiApOwotCi0gICAgICAgIGNmZmZhY2UtPmhlaWdodCA9IChGVF9TaG9ydCkoICggY2ZmZmFjZS0+dW5pdHNfcGVyX0VNICogMTIgKSAvIDEwICk7Ci0gICAgICAgIGlmICggY2ZmZmFjZS0+aGVpZ2h0IDwgY2ZmZmFjZS0+YXNjZW5kZXIgLSBjZmZmYWNlLT5kZXNjZW5kZXIgKQotICAgICAgICAgIGNmZmZhY2UtPmhlaWdodCA9IChGVF9TaG9ydCkoIGNmZmZhY2UtPmFzY2VuZGVyIC0gY2ZmZmFjZS0+ZGVzY2VuZGVyICk7Ci0KLSAgICAgICAgY2ZmZmFjZS0+dW5kZXJsaW5lX3Bvc2l0aW9uICA9Ci0gICAgICAgICAgKEZUX1Nob3J0KSggZGljdC0+dW5kZXJsaW5lX3Bvc2l0aW9uID4+IDE2ICk7Ci0gICAgICAgIGNmZmZhY2UtPnVuZGVybGluZV90aGlja25lc3MgPQotICAgICAgICAgIChGVF9TaG9ydCkoIGRpY3QtPnVuZGVybGluZV90aGlja25lc3MgPj4gMTYgKTsKLQotICAgICAgICAvKiByZXRyaWV2ZSBmb250IGZhbWlseSAmIHN0eWxlIG5hbWUgKi8KLSAgICAgICAgY2ZmZmFjZS0+ZmFtaWx5X25hbWUgPSBjZmZfaW5kZXhfZ2V0X25hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCkoIGZhY2VfaW5kZXggJiAweEZGRkYgKSApOwotICAgICAgICBpZiAoIGNmZmZhY2UtPmZhbWlseV9uYW1lICkKLSAgICAgICAgewotICAgICAgICAgIGNoYXIqICBmdWxsICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5mdWxsX25hbWUgKTsKLSAgICAgICAgICBjaGFyKiAgZnVsbHAgID0gZnVsbDsKLSAgICAgICAgICBjaGFyKiAgZmFtaWx5ID0gY2ZmZmFjZS0+ZmFtaWx5X25hbWU7Ci0gICAgICAgICAgY2hhciogIGZhbWlseV9uYW1lID0gTlVMTDsKLQotCi0gICAgICAgICAgcmVtb3ZlX3N1YnNldF9wcmVmaXgoIGNmZmZhY2UtPmZhbWlseV9uYW1lICk7Ci0KLSAgICAgICAgICBpZiAoIGRpY3QtPmZhbWlseV9uYW1lICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYW1pbHlfbmFtZSA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmZhbWlseV9uYW1lICk7Ci0gICAgICAgICAgICBpZiAoIGZhbWlseV9uYW1lICkKLSAgICAgICAgICAgICAgZmFtaWx5ID0gZmFtaWx5X25hbWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogV2UgdHJ5IHRvIGV4dHJhY3QgdGhlIHN0eWxlIG5hbWUgZnJvbSB0aGUgZnVsbCBuYW1lLiAgICovCi0gICAgICAgICAgLyogV2UgbmVlZCB0byBpZ25vcmUgc3BhY2VzIGFuZCBkYXNoZXMgZHVyaW5nIHRoZSBzZWFyY2guICovCi0gICAgICAgICAgaWYgKCBmdWxsICYmIGZhbWlseSApCi0gICAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKCAqZnVsbHAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBza2lwIGNvbW1vbiBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZiBib3RoIHN0cmluZ3MgKi8KLSAgICAgICAgICAgICAgaWYgKCAqZnVsbHAgPT0gKmZhbWlseSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYW1pbHkrKzsKLSAgICAgICAgICAgICAgICBmdWxscCsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLyogaWdub3JlIHNwYWNlcyBhbmQgZGFzaGVzIGluIGZ1bGwgbmFtZSBkdXJpbmcgY29tcGFyaXNvbiAqLwotICAgICAgICAgICAgICBpZiAoICpmdWxscCA9PSAnICcgfHwgKmZ1bGxwID09ICctJyApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmdWxscCsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLyogaWdub3JlIHNwYWNlcyBhbmQgZGFzaGVzIGluIGZhbWlseSBuYW1lIGR1cmluZyBjb21wYXJpc29uICovCi0gICAgICAgICAgICAgIGlmICggKmZhbWlseSA9PSAnICcgfHwgKmZhbWlseSA9PSAnLScgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFtaWx5Kys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAoICEqZmFtaWx5ICYmICpmdWxscCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGUgZnVsbCBuYW1lIGJlZ2lucyB3aXRoIHRoZSBzYW1lIGNoYXJhY3RlcnMgYXMgdGhlICAqLwotICAgICAgICAgICAgICAgIC8qIGZhbWlseSBuYW1lLCB3aXRoIHNwYWNlcyBhbmQgZGFzaGVzIHJlbW92ZWQuICBJbiB0aGlzICovCi0gICAgICAgICAgICAgICAgLyogY2FzZSwgdGhlIHJlbWFpbmluZyBzdHJpbmcgaW4gYGZ1bGxwJyB3aWxsIGJlIHVzZWQgYXMgKi8KLSAgICAgICAgICAgICAgICAvKiB0aGUgc3R5bGUgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHN0eWxlX25hbWUgPSBjZmZfc3RyY3B5KCBtZW1vcnksIGZ1bGxwICk7Ci0KLSAgICAgICAgICAgICAgICAvKiByZW1vdmUgdGhlIHN0eWxlIHBhcnQgZnJvbSB0aGUgZmFtaWx5IG5hbWUgKGlmIHByZXNlbnQpICovCi0gICAgICAgICAgICAgICAgcmVtb3ZlX3N0eWxlKCBjZmZmYWNlLT5mYW1pbHlfbmFtZSwgc3R5bGVfbmFtZSApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICAqY2lkX2ZvbnRfbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfZm9udF9uYW1lICk7Ci0KLQotICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBgL0ZvbnROYW1lJyBmb3IgYSBDSUQta2V5ZWQgZm9udD8gKi8KLSAgICAgICAgICBpZiAoIGNpZF9mb250X25hbWUgKQotICAgICAgICAgICAgY2ZmZmFjZS0+ZmFtaWx5X25hbWUgPSBjZmZfc3RyY3B5KCBtZW1vcnksIGNpZF9mb250X25hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggc3R5bGVfbmFtZSApCi0gICAgICAgICAgY2ZmZmFjZS0+c3R5bGVfbmFtZSA9IHN0eWxlX25hbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAvKiBhc3N1bWUgIlJlZ3VsYXIiIHN0eWxlIGlmIHdlIGRvbid0IGtub3cgYmV0dGVyICovCi0gICAgICAgICAgY2ZmZmFjZS0+c3R5bGVfbmFtZSA9IGNmZl9zdHJjcHkoIG1lbW9yeSwgKGNoYXIgKikiUmVndWxhciIgKTsKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIENvbXB1dGUgZmFjZSBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgZmxhZ3MgPSBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgICB8IC8qIHNjYWxhYmxlIG91dGxpbmVzICovCi0gICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgfCAvKiBob3Jpem9udGFsIGRhdGEgICAqLwotICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19ISU5URVI7ICAgICAgLyogaGFzIG5hdGl2ZSBoaW50ZXIgKi8KLQotICAgICAgICBpZiAoIHNmbnRfZm9ybWF0ICkKLSAgICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfU0ZOVDsKLQotICAgICAgICAvKiBmaXhlZCB3aWR0aCBmb250PyAqLwotICAgICAgICBpZiAoIGRpY3QtPmlzX2ZpeGVkX3BpdGNoICkKLSAgICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEg7Ci0KLSAgLyogWFhYOiBXRSBETyBOT1QgU1VQUE9SVCBLRVJOSU5HIE1FVFJJQ1MgSU4gVEhFIEdQT1MgVEFCTEUgRk9SIE5PVyAqLwotI2lmIDAKLSAgICAgICAgLyoga2VybmluZyBhdmFpbGFibGU/ICovCi0gICAgICAgIGlmICggZmFjZS0+a2Vybl9wYWlycyApCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0tFUk5JTkc7Ci0jZW5kaWYKLQotICAgICAgICBjZmZmYWNlLT5mYWNlX2ZsYWdzIHw9IGZsYWdzOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogQ29tcHV0ZSBzdHlsZSBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBmbGFncyA9IDA7Ci0KLSAgICAgICAgaWYgKCBkaWN0LT5pdGFsaWNfYW5nbGUgKQotICAgICAgICAgIGZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfSVRBTElDOwotCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICAqd2VpZ2h0ID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+d2VpZ2h0ICk7Ci0KLQotICAgICAgICAgIGlmICggd2VpZ2h0ICkKLSAgICAgICAgICAgIGlmICggIWZ0X3N0cmNtcCggd2VpZ2h0LCAiQm9sZCIgICkgfHwKLSAgICAgICAgICAgICAgICAgIWZ0X3N0cmNtcCggd2VpZ2h0LCAiQmxhY2siICkgKQotICAgICAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBkb3VibGUgY2hlY2sgKi8KLSAgICAgICAgaWYgKCAhKGZsYWdzICYgRlRfU1RZTEVfRkxBR19CT0xEKSAmJiBjZmZmYWNlLT5zdHlsZV9uYW1lICkKLSAgICAgICAgICBpZiAoICFmdF9zdHJuY21wKCBjZmZmYWNlLT5zdHlsZV9uYW1lLCAiQm9sZCIsIDQgKSAgfHwKLSAgICAgICAgICAgICAgICFmdF9zdHJuY21wKCBjZmZmYWNlLT5zdHlsZV9uYW1lLCAiQmxhY2siLCA1ICkgKQotICAgICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotCi0gICAgICAgIGNmZmZhY2UtPnN0eWxlX2ZsYWdzID0gZmxhZ3M7Ci0gICAgICB9Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19HTFlQSF9OQU1FUwotICAgICAgLyogQ0lELWtleWVkIENGRiBmb250cyBkb24ndCBoYXZlIGdseXBoIG5hbWVzIC0tIHRoZSBTRk5UIGxvYWRlciAqLwotICAgICAgLyogaGFzIHVuc2V0IHRoaXMgZmxhZyBiZWNhdXNlIG9mIHRoZSAzLjAgYHBvc3QnIHRhYmxlLiAgICAgICAgICAqLwotICAgICAgaWYgKCBkaWN0LT5jaWRfcmVnaXN0cnkgPT0gMHhGRkZGVSApCi0gICAgICAgIGNmZmZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTOwotI2VuZGlmCi0KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgJiYgcHVyZV9jZmYgKQotICAgICAgICBjZmZmYWNlLT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQ7Ci0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBDb21wdXRlIGNoYXIgbWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBUcnkgdG8gc3ludGhlc2l6ZSBhIFVuaWNvZGUgY2hhcm1hcCBpZiB0aGVyZSBpcyBub25lIGF2YWlsYWJsZSAqLwotICAgICAgLyogYWxyZWFkeS4gIElmIGFuIE9wZW5UeXBlIGZvbnQgY29udGFpbnMgYSBVbmljb2RlICJjbWFwIiwgd2UgICAgKi8KLSAgICAgIC8qIHdpbGwgdXNlIGl0LCB3aGF0ZXZlciBiZSBpbiB0aGUgQ0ZGIHBhcnQgb2YgdGhlIGZpbGUuICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX0NoYXJNYXBSZWMgIGNtYXByZWM7Ci0gICAgICAgIEZUX0NoYXJNYXAgICAgIGNtYXA7Ci0gICAgICAgIEZUX1VJbnQgICAgICAgIG5uOwotICAgICAgICBDRkZfRW5jb2RpbmcgICBlbmNvZGluZyA9ICZjZmYtPmVuY29kaW5nOwotCi0KLSAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IChGVF9VSW50KWNmZmZhY2UtPm51bV9jaGFybWFwczsgbm4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBjbWFwID0gY2ZmZmFjZS0+Y2hhcm1hcHNbbm5dOwotCi0gICAgICAgICAgLyogV2luZG93cyBVbmljb2RlPyAqLwotICAgICAgICAgIGlmICggY21hcC0+cGxhdGZvcm1faWQgPT0gVFRfUExBVEZPUk1fTUlDUk9TT0ZUICYmCi0gICAgICAgICAgICAgICBjbWFwLT5lbmNvZGluZ19pZCA9PSBUVF9NU19JRF9VTklDT0RFX0NTICAgKQotICAgICAgICAgICAgZ290byBTa2lwX1VuaWNvZGU7Ci0KLSAgICAgICAgICAvKiBBcHBsZSBVbmljb2RlIHBsYXRmb3JtIGlkPyAqLwotICAgICAgICAgIGlmICggY21hcC0+cGxhdGZvcm1faWQgPT0gVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERSApCi0gICAgICAgICAgICBnb3RvIFNraXBfVW5pY29kZTsgLyogQXBwbGUgVW5pY29kZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2luY2UgQ0lELWtleWVkIGZvbnRzIGRvbid0IGNvbnRhaW4gZ2x5cGggbmFtZXMsIHdlIGNhbid0ICovCi0gICAgICAgIC8qIGNvbnN0cnVjdCBhIGNtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHB1cmVfY2ZmICYmIGNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0LmNpZF9yZWdpc3RyeSAhPSAweEZGRkZVICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogd2UgZGlkbid0IGZpbmQgYSBVbmljb2RlIGNoYXJtYXAgLS0gc3ludGhlc2l6ZSBvbmUgKi8KLSAgICAgICAgY21hcHJlYy5mYWNlICAgICAgICA9IGNmZmZhY2U7Ci0gICAgICAgIGNtYXByZWMucGxhdGZvcm1faWQgPSBUVF9QTEFURk9STV9NSUNST1NPRlQ7Ci0gICAgICAgIGNtYXByZWMuZW5jb2RpbmdfaWQgPSBUVF9NU19JRF9VTklDT0RFX0NTOwotICAgICAgICBjbWFwcmVjLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfVU5JQ09ERTsKLQotICAgICAgICBubiA9IChGVF9VSW50KWNmZmZhY2UtPm51bV9jaGFybWFwczsKLQotICAgICAgICBlcnJvciA9IEZUX0NNYXBfTmV3KCAmQ0ZGX0NNQVBfVU5JQ09ERV9DTEFTU19SRUNfR0VULCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21hcHJlYywgTlVMTCApOwotICAgICAgICBpZiAoIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBOb19Vbmljb2RlX0dseXBoX05hbWUgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgICAgICAvKiBpZiBubyBVbmljb2RlIGNoYXJtYXAgd2FzIHByZXZpb3VzbHkgc2VsZWN0ZWQsIHNlbGVjdCB0aGlzIG9uZSAqLwotICAgICAgICBpZiAoICFjZmZmYWNlLT5jaGFybWFwICYmIG5uICE9IChGVF9VSW50KWNmZmZhY2UtPm51bV9jaGFybWFwcyApCi0gICAgICAgICAgY2ZmZmFjZS0+Y2hhcm1hcCA9IGNmZmZhY2UtPmNoYXJtYXBzW25uXTsKLQotICAgICAgU2tpcF9Vbmljb2RlOgotICAgICAgICBpZiAoIGVuY29kaW5nLT5jb3VudCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQ01hcF9DbGFzcyAgY2xheno7Ci0KLQotICAgICAgICAgIGNtYXByZWMuZmFjZSAgICAgICAgPSBjZmZmYWNlOwotICAgICAgICAgIGNtYXByZWMucGxhdGZvcm1faWQgPSBUVF9QTEFURk9STV9BRE9CRTsgIC8qIEFkb2JlIHBsYXRmb3JtIGlkICovCi0KLSAgICAgICAgICBpZiAoIGVuY29kaW5nLT5vZmZzZXQgPT0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgY21hcHJlYy5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX1NUQU5EQVJEOwotICAgICAgICAgICAgY21hcHJlYy5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEOwotICAgICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9ICZDRkZfQ01BUF9FTkNPRElOR19DTEFTU19SRUNfR0VUOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggZW5jb2RpbmctPm9mZnNldCA9PSAxICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nX2lkID0gVFRfQURPQkVfSURfRVhQRVJUOwotICAgICAgICAgICAgY21hcHJlYy5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVDsKLSAgICAgICAgICAgIGNsYXp6ICAgICAgICAgICAgICAgPSAmQ0ZGX0NNQVBfRU5DT0RJTkdfQ0xBU1NfUkVDX0dFVDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNtYXByZWMuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9DVVNUT007Ci0gICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NOwotICAgICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9ICZDRkZfQ01BUF9FTkNPRElOR19DTEFTU19SRUNfR0VUOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGVycm9yID0gRlRfQ01hcF9OZXcoIGNsYXp6LCBOVUxMLCAmY21hcHJlYywgTlVMTCApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZmFjZV9kb25lKCBGVF9GYWNlICBjZmZmYWNlICkgICAgICAgICAvKiBDRkZfRmFjZSAqLwotICB7Ci0gICAgQ0ZGX0ZhY2UgICAgICBmYWNlID0gKENGRl9GYWNlKWNmZmZhY2U7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnk7Ci0gICAgU0ZOVF9TZXJ2aWNlICBzZm50OwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IGNmZmZhY2UtPm1lbW9yeTsKLSAgICBzZm50ICAgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0KLSAgICBpZiAoIHNmbnQgKQotICAgICAgc2ZudC0+ZG9uZV9mYWNlKCBmYWNlICk7Ci0KLSAgICB7Ci0gICAgICBDRkZfRm9udCAgY2ZmID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0KLQotICAgICAgaWYgKCBjZmYgKQotICAgICAgewotICAgICAgICBjZmZfZm9udF9kb25lKCBjZmYgKTsKLSAgICAgICAgRlRfRlJFRSggZmFjZS0+ZXh0cmEuZGF0YSApOwotICAgICAgfQotICAgIH0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBjZmZfZG9uZV9ibGVuZCggZmFjZSApOwotICAgIGZhY2UtPmJsZW5kID0gTlVMTDsKLSNlbmRpZgotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2RyaXZlcl9pbml0KCBGVF9Nb2R1bGUgIG1vZHVsZSApICAgICAgICAvKiBDRkZfRHJpdmVyICovCi0gIHsKLSAgICBDRkZfRHJpdmVyICBkcml2ZXIgPSAoQ0ZGX0RyaXZlciltb2R1bGU7Ci0KLSAgICBGVF9VSW50MzIgIHNlZWQ7Ci0KLQotICAgIC8qIHNldCBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcywgY2YuIGBmdGNmZmRydi5oJyAqLwotI2lmZGVmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKLSAgICBkcml2ZXItPmhpbnRpbmdfZW5naW5lID0gRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEU7Ci0jZWxzZQotICAgIGRyaXZlci0+aGludGluZ19lbmdpbmUgPSBGVF9DRkZfSElOVElOR19BRE9CRTsKLSNlbmRpZgotCi0gICAgZHJpdmVyLT5ub19zdGVtX2RhcmtlbmluZyA9IFRSVUU7Ci0KLSAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbMF0gPSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxOwotICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1sxXSA9IENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTE7Ci0gICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzJdID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMjsKLSAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbM10gPSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyOwotICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1s0XSA9IENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDM7Ci0gICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzVdID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMzsKLSAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbNl0gPSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1g0OwotICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1s3XSA9IENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQ7Ci0KLSAgICAvKiBjb21wdXRlIHJhbmRvbSBzZWVkIGZyb20gc29tZSBtZW1vcnkgYWRkcmVzc2VzICovCi0gICAgc2VlZCA9IChGVF9VSW50MzIpKCAoRlRfT2Zmc2V0KShjaGFyKikmc2VlZCAgICAgICAgICBeCi0gICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjaGFyKikmbW9kdWxlICAgICAgICBeCi0gICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjaGFyKiltb2R1bGUtPm1lbW9yeSApOwotICAgIHNlZWQgPSBzZWVkIF4gKCBzZWVkID4+IDEwICkgXiAoIHNlZWQgPj4gMjAgKTsKLQotICAgIGRyaXZlci0+cmFuZG9tX3NlZWQgPSAoRlRfSW50MzIpc2VlZDsKLSAgICBpZiAoIGRyaXZlci0+cmFuZG9tX3NlZWQgPCAwICkKLSAgICAgIGRyaXZlci0+cmFuZG9tX3NlZWQgPSAtZHJpdmVyLT5yYW5kb21fc2VlZDsKLSAgICBlbHNlIGlmICggZHJpdmVyLT5yYW5kb21fc2VlZCA9PSAwICkKLSAgICAgIGRyaXZlci0+cmFuZG9tX3NlZWQgPSAxMjM0NTY3ODk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgbW9kdWxlICkgICAgICAgIC8qIENGRl9Ecml2ZXIgKi8KLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2Zmb2Jqcy5oIGIvc3JjL2NmZi9jZmZvYmpzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmE2OTQuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZvYmpzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2Zmb2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIENGRk9CSlNfSF8KLSNkZWZpbmUgQ0ZGT0JKU19IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAiY2ZmdHlwZXMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENGRl9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIE9wZW5UeXBlIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0ZGX0RyaXZlclJlY18qICBDRkZfRHJpdmVyOwotCi0gIHR5cGVkZWYgVFRfRmFjZSAgQ0ZGX0ZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDRkZfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBPcGVuVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfU2l6ZVJlY18KLSAgewotICAgIEZUX1NpemVSZWMgIHJvb3Q7Ci0gICAgRlRfVUxvbmcgICAgc3RyaWtlX2luZGV4OyAgICAvKiAweEZGRkZGRkZGIHRvIGluZGljYXRlIGludmFsaWQgKi8KLQotICB9IENGRl9TaXplUmVjLCAqQ0ZGX1NpemU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDRkZfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBPcGVuVHlwZSBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfR2x5cGhTbG90UmVjXwotICB7Ci0gICAgRlRfR2x5cGhTbG90UmVjICByb290OwotCi0gICAgRlRfQm9vbCAgICAgICAgICBoaW50OwotICAgIEZUX0Jvb2wgICAgICAgICAgc2NhbGVkOwotCi0gICAgRlRfRml4ZWQgICAgICAgICB4X3NjYWxlOwotICAgIEZUX0ZpeGVkICAgICAgICAgeV9zY2FsZTsKLQotICB9IENGRl9HbHlwaFNsb3RSZWMsICpDRkZfR2x5cGhTbG90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0ZGX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGludGVyZmFjZSB0byB0aGUgYGludGVybmFsJyBmaWVsZCBvZiBgRlRfU2l6ZScuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0ludGVybmFsUmVjXwotICB7Ci0gICAgUFNIX0dsb2JhbHMgIHRvcGZvbnQ7Ci0gICAgUFNIX0dsb2JhbHMgIHN1YmZvbnRzW0NGRl9NQVhfQ0lEX0ZPTlRTXTsKLQotICB9IENGRl9JbnRlcm5hbFJlYywgKkNGRl9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3ViZ2x5cGggdHJhbnNmb3JtYXRpb24gcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX1RyYW5zZm9ybV8KLSAgewotICAgIEZUX0ZpeGVkICAgIHh4LCB4eTsgICAgIC8qIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBjb2VmZmljaWVudHMgKi8KLSAgICBGVF9GaXhlZCAgICB5eCwgeXk7Ci0gICAgRlRfRjI2RG90NiAgb3gsIG95OyAgICAgLyogb2Zmc2V0cyAgICAgICAgKi8KLQotICB9IENGRl9UcmFuc2Zvcm07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0ZGIGRyaXZlciBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRHJpdmVyUmVjXwotICB7Ci0gICAgRlRfRHJpdmVyUmVjICByb290OwotCi0gICAgRlRfVUludCAgIGhpbnRpbmdfZW5naW5lOwotICAgIEZUX0Jvb2wgICBub19zdGVtX2RhcmtlbmluZzsKLSAgICBGVF9JbnQgICAgZGFya2VuX3BhcmFtc1s4XTsKLSAgICBGVF9JbnQzMiAgcmFuZG9tX3NlZWQ7Ci0KLSAgfSBDRkZfRHJpdmVyUmVjOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfaW5pdCggRlRfU2l6ZSAgc2l6ZSApOyAgICAgICAgICAgLyogQ0ZGX1NpemUgKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9zaXplX2RvbmUoIEZUX1NpemUgIHNpemUgKTsgICAgICAgICAgIC8qIENGRl9TaXplICovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfcmVxdWVzdCggRlRfU2l6ZSAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfc2VsZWN0KCBGVF9TaXplICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICk7Ci0KLSNlbmRpZgotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX3Nsb3RfZG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3Nsb3RfaW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2ZhY2VfaW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLCAgICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfZmFjZV9kb25lKCBGVF9GYWNlICBmYWNlICk7ICAgICAgICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRHJpdmVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgbW9kdWxlICk7ICAgICAgICAgLyogQ0ZGX0RyaXZlciAqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2RyaXZlcl9kb25lKCBGVF9Nb2R1bGUgIG1vZHVsZSApOyAgICAgICAgIC8qIENGRl9Ecml2ZXIgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBDRkZPQkpTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZnBhcnNlLmMgYi9zcmMvY2ZmL2NmZnBhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNTViYmIuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZwYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZwYXJzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIHRva2VuIHN0cmVhbSBwYXJzZXIgKGJvZHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImNmZnBhcnNlLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0KLSNpbmNsdWRlICJjZmZlcnJzLmgiCi0jaW5jbHVkZSAiY2ZmcGljLmgiCi0jaW5jbHVkZSAiY2ZmZ2xvYWQuaCIKLSNpbmNsdWRlICJjZmZsb2FkLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jZmZwYXJzZQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9wYXJzZXJfaW5pdCggQ0ZGX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgc3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgIG51bV9kZXNpZ25zLAotICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgIG51bV9heGVzICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAvKiBmb3IgRlRfTkVXX0FSUkFZICovCi0gICAgRlRfRXJyb3IgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBGVF9ORVdfQVJSQVkgKi8KLQotCi0gICAgRlRfWkVSTyggcGFyc2VyICk7Ci0KLSNpZiAwCi0gICAgcGFyc2VyLT50b3AgICAgICAgICA9IHBhcnNlci0+c3RhY2s7Ci0jZW5kaWYKLSAgICBwYXJzZXItPm9iamVjdF9jb2RlID0gY29kZTsKLSAgICBwYXJzZXItPm9iamVjdCAgICAgID0gb2JqZWN0OwotICAgIHBhcnNlci0+bGlicmFyeSAgICAgPSBsaWJyYXJ5OwotICAgIHBhcnNlci0+bnVtX2Rlc2lnbnMgPSBudW1fZGVzaWduczsKLSAgICBwYXJzZXItPm51bV9heGVzICAgID0gbnVtX2F4ZXM7Ci0KLSAgICAvKiBhbGxvY2F0ZSB0aGUgc3RhY2sgYnVmZmVyICovCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHBhcnNlci0+c3RhY2ssIHN0YWNrU2l6ZSApICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBwYXJzZXItPnN0YWNrICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5zdGFja1NpemUgPSBzdGFja1NpemU7Ci0gICAgcGFyc2VyLT50b3AgICAgICAgPSBwYXJzZXItPnN0YWNrOyAgICAvKiBlbXB0eSBzdGFjayAqLwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfcGFyc2VyX2RvbmUoIENGRl9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+bGlicmFyeS0+bWVtb3J5OyAgICAvKiBmb3IgRlRfRlJFRSAqLwotCi0KLSAgICBGVF9GUkVFKCBwYXJzZXItPnN0YWNrICk7Ci0gIH0KLQotCi0gIC8qIHJlYWQgYW4gaW50ZWdlciAqLwotICBzdGF0aWMgRlRfTG9uZwotICBjZmZfcGFyc2VfaW50ZWdlciggRlRfQnl0ZSogIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogIGxpbWl0ICkKLSAgewotICAgIEZUX0J5dGUqICBwICAgPSBzdGFydDsKLSAgICBGVF9JbnQgICAgdiAgID0gKnArKzsKLSAgICBGVF9Mb25nICAgdmFsID0gMDsKLQotCi0gICAgaWYgKCB2ID09IDI4ICkKLSAgICB7Ci0gICAgICBpZiAoIHAgKyAyID4gbGltaXQgKQotICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgdmFsID0gKEZUX1Nob3J0KSggKCAoRlRfVVNob3J0KXBbMF0gPDwgOCApIHwgcFsxXSApOwotICAgIH0KLSAgICBlbHNlIGlmICggdiA9PSAyOSApCi0gICAgewotICAgICAgaWYgKCBwICsgNCA+IGxpbWl0ICkKLSAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgIHZhbCA9IChGVF9Mb25nKSggKCAoRlRfVUxvbmcpcFswXSA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUxvbmcpcFsxXSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUxvbmcpcFsyXSA8PCAgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpcFszXSAgICAgICAgICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2IDwgMjQ3ICkKLSAgICB7Ci0gICAgICB2YWwgPSB2IC0gMTM5OwotICAgIH0KLSAgICBlbHNlIGlmICggdiA8IDI1MSApCi0gICAgewotICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKLSAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgIHZhbCA9ICggdiAtIDI0NyApICogMjU2ICsgcFswXSArIDEwODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggcCArIDEgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gQmFkOwotCi0gICAgICB2YWwgPSAtKCB2IC0gMjUxICkgKiAyNTYgLSBwWzBdIC0gMTA4OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiB2YWw7Ci0KLSAgQmFkOgotICAgIHZhbCA9IDA7Ci0gICAgRlRfVFJBQ0U0KCggIiEhIUVORCBPRiBEQVRBOiEhISIgKSk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfTG9uZyBwb3dlcl90ZW5zW10gPQotICB7Ci0gICAgMUwsCi0gICAgMTBMLAotICAgIDEwMEwsCi0gICAgMTAwMEwsCi0gICAgMTAwMDBMLAotICAgIDEwMDAwMEwsCi0gICAgMTAwMDAwMEwsCi0gICAgMTAwMDAwMDBMLAotICAgIDEwMDAwMDAwMEwsCi0gICAgMTAwMDAwMDAwMEwKLSAgfTsKLQotICAvKiBtYXhpbXVtIHZhbHVlcyBhbGxvd2VkIGZvciBtdWx0aXBseWluZyAgICAgICovCi0gIC8qIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYHBvd2VyX3RlbnMnIGVsZW1lbnQgKi8KLSAgc3RhdGljIGNvbnN0IEZUX0xvbmcgcG93ZXJfdGVuX2xpbWl0c1tdID0KLSAgewotICAgIEZUX0xPTkdfTUFYIC8gMUwsCi0gICAgRlRfTE9OR19NQVggLyAxMEwsCi0gICAgRlRfTE9OR19NQVggLyAxMDBMLAotICAgIEZUX0xPTkdfTUFYIC8gMTAwMEwsCi0gICAgRlRfTE9OR19NQVggLyAxMDAwMEwsCi0gICAgRlRfTE9OR19NQVggLyAxMDAwMDBMLAotICAgIEZUX0xPTkdfTUFYIC8gMTAwMDAwMEwsCi0gICAgRlRfTE9OR19NQVggLyAxMDAwMDAwMEwsCi0gICAgRlRfTE9OR19NQVggLyAxMDAwMDAwMDBMLAotICAgIEZUX0xPTkdfTUFYIC8gMTAwMDAwMDAwMEwsCi0gIH07Ci0KLQotICAvKiByZWFkIGEgcmVhbCAqLwotICBzdGF0aWMgRlRfRml4ZWQKLSAgY2ZmX3BhcnNlX3JlYWwoIEZUX0J5dGUqICBzdGFydCwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICBwb3dlcl90ZW4sCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgc2NhbGluZyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IHN0YXJ0OwotICAgIEZUX0ludCAgICBuaWI7Ci0gICAgRlRfVUludCAgIHBoYXNlOwotCi0gICAgRlRfTG9uZyAgIHJlc3VsdCwgbnVtYmVyLCBleHBvbmVudDsKLSAgICBGVF9JbnQgICAgc2lnbiA9IDAsIGV4cG9uZW50X3NpZ24gPSAwLCBoYXZlX292ZXJmbG93ID0gMDsKLSAgICBGVF9Mb25nICAgZXhwb25lbnRfYWRkLCBpbnRlZ2VyX2xlbmd0aCwgZnJhY3Rpb25fbGVuZ3RoOwotCi0KLSAgICBpZiAoIHNjYWxpbmcgKQotICAgICAgKnNjYWxpbmcgPSAwOwotCi0gICAgcmVzdWx0ID0gMDsKLQotICAgIG51bWJlciAgID0gMDsKLSAgICBleHBvbmVudCA9IDA7Ci0KLSAgICBleHBvbmVudF9hZGQgICAgPSAwOwotICAgIGludGVnZXJfbGVuZ3RoICA9IDA7Ci0gICAgZnJhY3Rpb25fbGVuZ3RoID0gMDsKLQotICAgIC8qIEZpcnN0IG9mIGFsbCwgcmVhZCB0aGUgaW50ZWdlciBwYXJ0LiAqLwotICAgIHBoYXNlID0gNDsKLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgLyogSWYgd2UgZW50ZXJlZCB0aGlzIGl0ZXJhdGlvbiB3aXRoIHBoYXNlID09IDQsIHdlIG5lZWQgdG8gKi8KLSAgICAgIC8qIHJlYWQgYSBuZXcgYnl0ZS4gIFRoaXMgYWxzbyBza2lwcyBwYXN0IHRoZSBpbml0aWFsIDB4MUUuICovCi0gICAgICBpZiAoIHBoYXNlICkKLSAgICAgIHsKLSAgICAgICAgcCsrOwotCi0gICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIHBhc3QgdGhlIGVuZC4gKi8KLSAgICAgICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgICAgICBnb3RvIEJhZDsKLSAgICAgIH0KLQotICAgICAgLyogR2V0IHRoZSBuaWJibGUuICovCi0gICAgICBuaWIgICA9IChGVF9JbnQpKCBwWzBdID4+IHBoYXNlICkgJiAweEY7Ci0gICAgICBwaGFzZSA9IDQgLSBwaGFzZTsKLQotICAgICAgaWYgKCBuaWIgPT0gMHhFICkKLSAgICAgICAgc2lnbiA9IDE7Ci0gICAgICBlbHNlIGlmICggbmliID4gOSApCi0gICAgICAgIGJyZWFrOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBJbmNyZWFzZSBleHBvbmVudCBpZiB3ZSBjYW4ndCBhZGQgdGhlIGRpZ2l0LiAqLwotICAgICAgICBpZiAoIG51bWJlciA+PSAweENDQ0NDQ0NMICkKLSAgICAgICAgICBleHBvbmVudF9hZGQrKzsKLSAgICAgICAgLyogU2tpcCBsZWFkaW5nIHplcm9zLiAqLwotICAgICAgICBlbHNlIGlmICggbmliIHx8IG51bWJlciApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnRlZ2VyX2xlbmd0aCsrOwotICAgICAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgbmliOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogUmVhZCBmcmFjdGlvbiBwYXJ0LCBpZiBhbnkuICovCi0gICAgaWYgKCBuaWIgPT0gMHhBICkKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIC8qIElmIHdlIGVudGVyZWQgdGhpcyBpdGVyYXRpb24gd2l0aCBwaGFzZSA9PSA0LCB3ZSBuZWVkICovCi0gICAgICAgIC8qIHRvIHJlYWQgYSBuZXcgYnl0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICB7Ci0gICAgICAgICAgcCsrOwotCi0gICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgcGFzdCB0aGUgZW5kLiAqLwotICAgICAgICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICAgICAgICBnb3RvIEJhZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdldCB0aGUgbmliYmxlLiAqLwotICAgICAgICBuaWIgICA9ICggcFswXSA+PiBwaGFzZSApICYgMHhGOwotICAgICAgICBwaGFzZSA9IDQgLSBwaGFzZTsKLSAgICAgICAgaWYgKCBuaWIgPj0gMTAgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIFNraXAgbGVhZGluZyB6ZXJvcyBpZiBwb3NzaWJsZS4gKi8KLSAgICAgICAgaWYgKCAhbmliICYmICFudW1iZXIgKQotICAgICAgICAgIGV4cG9uZW50X2FkZC0tOwotICAgICAgICAvKiBPbmx5IGFkZCBkaWdpdCBpZiB3ZSBkb24ndCBvdmVyZmxvdy4gKi8KLSAgICAgICAgZWxzZSBpZiAoIG51bWJlciA8IDB4Q0NDQ0NDQ0wgJiYgZnJhY3Rpb25fbGVuZ3RoIDwgOSApCi0gICAgICAgIHsKLSAgICAgICAgICBmcmFjdGlvbl9sZW5ndGgrKzsKLSAgICAgICAgICBudW1iZXIgPSBudW1iZXIgKiAxMCArIG5pYjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgLyogUmVhZCBleHBvbmVudCwgaWYgYW55LiAqLwotICAgIGlmICggbmliID09IDEyICkKLSAgICB7Ci0gICAgICBleHBvbmVudF9zaWduID0gMTsKLSAgICAgIG5pYiAgICAgICAgICAgPSAxMTsKLSAgICB9Ci0KLSAgICBpZiAoIG5pYiA9PSAxMSApCi0gICAgewotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgLyogSWYgd2UgZW50ZXJlZCB0aGlzIGl0ZXJhdGlvbiB3aXRoIHBoYXNlID09IDQsICovCi0gICAgICAgIC8qIHdlIG5lZWQgdG8gcmVhZCBhIG5ldyBieXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHBoYXNlICkKLSAgICAgICAgewotICAgICAgICAgIHArKzsKLQotICAgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIHBhc3QgdGhlIGVuZC4gKi8KLSAgICAgICAgICBpZiAoIHAgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBCYWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBHZXQgdGhlIG5pYmJsZS4gKi8KLSAgICAgICAgbmliICAgPSAoIHBbMF0gPj4gcGhhc2UgKSAmIDB4RjsKLSAgICAgICAgcGhhc2UgPSA0IC0gcGhhc2U7Ci0gICAgICAgIGlmICggbmliID49IDEwICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBBcmJpdHJhcmlseSBsaW1pdCBleHBvbmVudC4gKi8KLSAgICAgICAgaWYgKCBleHBvbmVudCA+IDEwMDAgKQotICAgICAgICAgIGhhdmVfb3ZlcmZsb3cgPSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZXhwb25lbnQgPSBleHBvbmVudCAqIDEwICsgbmliOwotICAgICAgfQotCi0gICAgICBpZiAoIGV4cG9uZW50X3NpZ24gKQotICAgICAgICBleHBvbmVudCA9IC1leHBvbmVudDsKLSAgICB9Ci0KLSAgICBpZiAoICFudW1iZXIgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBoYXZlX292ZXJmbG93ICkKLSAgICB7Ci0gICAgICBpZiAoIGV4cG9uZW50X3NpZ24gKQotICAgICAgICBnb3RvIFVuZGVyZmxvdzsKLSAgICAgIGVsc2UKLSAgICAgICAgZ290byBPdmVyZmxvdzsKLSAgICB9Ci0KLSAgICAvKiBXZSBkb24ndCBjaGVjayBgcG93ZXJfdGVuJyBhbmQgYGV4cG9uZW50X2FkZCcuICovCi0gICAgZXhwb25lbnQgKz0gcG93ZXJfdGVuICsgZXhwb25lbnRfYWRkOwotCi0gICAgaWYgKCBzY2FsaW5nICkKLSAgICB7Ci0gICAgICAvKiBPbmx5IHVzZSBgZnJhY3Rpb25fbGVuZ3RoJy4gKi8KLSAgICAgIGZyYWN0aW9uX2xlbmd0aCArPSBpbnRlZ2VyX2xlbmd0aDsKLSAgICAgIGV4cG9uZW50ICAgICAgICArPSBpbnRlZ2VyX2xlbmd0aDsKLQotICAgICAgaWYgKCBmcmFjdGlvbl9sZW5ndGggPD0gNSApCi0gICAgICB7Ci0gICAgICAgIGlmICggbnVtYmVyID4gMHg3RkZGTCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgICA9IEZUX0RpdkZpeCggbnVtYmVyLCAxMCApOwotICAgICAgICAgICpzY2FsaW5nID0gZXhwb25lbnQgLSBmcmFjdGlvbl9sZW5ndGggKyAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggZXhwb25lbnQgPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Mb25nICBuZXdfZnJhY3Rpb25fbGVuZ3RoLCBzaGlmdDsKLQotCi0gICAgICAgICAgICAvKiBNYWtlIGBzY2FsaW5nJyBhcyBzbWFsbCBhcyBwb3NzaWJsZS4gKi8KLSAgICAgICAgICAgIG5ld19mcmFjdGlvbl9sZW5ndGggPSBGVF9NSU4oIGV4cG9uZW50LCA1ICk7Ci0gICAgICAgICAgICBzaGlmdCAgICAgICAgICAgICAgID0gbmV3X2ZyYWN0aW9uX2xlbmd0aCAtIGZyYWN0aW9uX2xlbmd0aDsKLQotICAgICAgICAgICAgaWYgKCBzaGlmdCA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBleHBvbmVudCAtPSBuZXdfZnJhY3Rpb25fbGVuZ3RoOwotICAgICAgICAgICAgICBudW1iZXIgICAqPSBwb3dlcl90ZW5zW3NoaWZ0XTsKLSAgICAgICAgICAgICAgaWYgKCBudW1iZXIgPiAweDdGRkZMICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG51bWJlciAgIC89IDEwOwotICAgICAgICAgICAgICAgIGV4cG9uZW50ICs9IDE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZXhwb25lbnQgLT0gZnJhY3Rpb25fbGVuZ3RoOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBleHBvbmVudCAtPSBmcmFjdGlvbl9sZW5ndGg7Ci0KLSAgICAgICAgICByZXN1bHQgICA9IChGVF9Mb25nKSggKEZUX1VMb25nKW51bWJlciA8PCAxNiApOwotICAgICAgICAgICpzY2FsaW5nID0gZXhwb25lbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCAoIG51bWJlciAvIHBvd2VyX3RlbnNbZnJhY3Rpb25fbGVuZ3RoIC0gNV0gKSA+IDB4N0ZGRkwgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICAgPSBGVF9EaXZGaXgoIG51bWJlciwgcG93ZXJfdGVuc1tmcmFjdGlvbl9sZW5ndGggLSA0XSApOwotICAgICAgICAgICpzY2FsaW5nID0gZXhwb25lbnQgLSA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCAgID0gRlRfRGl2Rml4KCBudW1iZXIsIHBvd2VyX3RlbnNbZnJhY3Rpb25fbGVuZ3RoIC0gNV0gKTsKLSAgICAgICAgICAqc2NhbGluZyA9IGV4cG9uZW50IC0gNTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW50ZWdlcl9sZW5ndGggICs9IGV4cG9uZW50OwotICAgICAgZnJhY3Rpb25fbGVuZ3RoIC09IGV4cG9uZW50OwotCi0gICAgICBpZiAoIGludGVnZXJfbGVuZ3RoID4gNSApCi0gICAgICAgIGdvdG8gT3ZlcmZsb3c7Ci0gICAgICBpZiAoIGludGVnZXJfbGVuZ3RoIDwgLTUgKQotICAgICAgICBnb3RvIFVuZGVyZmxvdzsKLQotICAgICAgLyogUmVtb3ZlIG5vbi1zaWduaWZpY2FudCBkaWdpdHMuICovCi0gICAgICBpZiAoIGludGVnZXJfbGVuZ3RoIDwgMCApCi0gICAgICB7Ci0gICAgICAgIG51bWJlciAgICAgICAgICAvPSBwb3dlcl90ZW5zWy1pbnRlZ2VyX2xlbmd0aF07Ci0gICAgICAgIGZyYWN0aW9uX2xlbmd0aCArPSBpbnRlZ2VyX2xlbmd0aDsKLSAgICAgIH0KLQotICAgICAgLyogdGhpcyBjYW4gb25seSBoYXBwZW4gaWYgZXhwb25lbnQgd2FzIG5vbi16ZXJvICovCi0gICAgICBpZiAoIGZyYWN0aW9uX2xlbmd0aCA9PSAxMCApCi0gICAgICB7Ci0gICAgICAgIG51bWJlciAgICAgICAgICAvPSAxMDsKLSAgICAgICAgZnJhY3Rpb25fbGVuZ3RoIC09IDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIENvbnZlcnQgaW50byAxNi4xNiBmb3JtYXQuICovCi0gICAgICBpZiAoIGZyYWN0aW9uX2xlbmd0aCA+IDAgKQotICAgICAgewotICAgICAgICBpZiAoICggbnVtYmVyIC8gcG93ZXJfdGVuc1tmcmFjdGlvbl9sZW5ndGhdICkgPiAweDdGRkZMICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgcmVzdWx0ID0gRlRfRGl2Rml4KCBudW1iZXIsIHBvd2VyX3RlbnNbZnJhY3Rpb25fbGVuZ3RoXSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBudW1iZXIgKj0gcG93ZXJfdGVuc1stZnJhY3Rpb25fbGVuZ3RoXTsKLQotICAgICAgICBpZiAoIG51bWJlciA+IDB4N0ZGRkwgKQotICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7Ci0KLSAgICAgICAgcmVzdWx0ID0gKEZUX0xvbmcpKCAoRlRfVUxvbmcpbnVtYmVyIDw8IDE2ICk7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgaWYgKCBzaWduICkKLSAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIE92ZXJmbG93OgotICAgIHJlc3VsdCA9IDB4N0ZGRkZGRkZMOwotICAgIEZUX1RSQUNFNCgoICIhISFPVkVSRkxPVzohISEiICkpOwotICAgIGdvdG8gRXhpdDsKLQotICBVbmRlcmZsb3c6Ci0gICAgcmVzdWx0ID0gMDsKLSAgICBGVF9UUkFDRTQoKCAiISEhVU5ERVJGTE9XOiEhISIgKSk7Ci0gICAgZ290byBFeGl0OwotCi0gIEJhZDoKLSAgICByZXN1bHQgPSAwOwotICAgIEZUX1RSQUNFNCgoICIhISFFTkQgT0YgREFUQTohISEiICkpOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgLyogcmVhZCBhIG51bWJlciwgZWl0aGVyIGludGVnZXIgb3IgcmVhbCAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0xvbmcgKQotICBjZmZfcGFyc2VfbnVtKCBDRkZfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgIGQgKQotICB7Ci0gICAgaWYgKCAqKmQgPT0gMzAgKQotICAgIHsKLSAgICAgIC8qIGJpbmFyeS1jb2RlZCBkZWNpbWFsIGlzIHRydW5jYXRlZCB0byBpbnRlZ2VyICovCi0gICAgICByZXR1cm4gY2ZmX3BhcnNlX3JlYWwoICpkLCBwYXJzZXItPmxpbWl0LCAwLCBOVUxMICkgPj4gMTY7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoICoqZCA9PSAyNTUgKQotICAgIHsKLSAgICAgIC8qIDE2LjE2IGZpeGVkIHBvaW50IGlzIHVzZWQgaW50ZXJuYWxseSBmb3IgQ0ZGMiBibGVuZCByZXN1bHRzLiAqLwotICAgICAgLyogU2luY2UgdGhlc2UgYXJlIHRydXN0ZWQgdmFsdWVzLCBhIGxpbWl0IGNoZWNrIGlzIG5vdCBuZWVkZWQuICovCi0KLSAgICAgIC8qIEFmdGVyIHRoZSAyNTUsIDQgYnl0ZXMgZ2l2ZSB0aGUgbnVtYmVyLiAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFRoZSBibGVuZCB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gaW50ZWdlciwgd2l0aCByb3VuZGluZzsgKi8KLSAgICAgIC8qIGR1ZSB0byB0aGUgcmlnaHQtc2hpZnQgd2UgZG9uJ3QgbmVlZCB0aGUgbG93ZXN0IGJ5dGUuICAgKi8KLSNpZiAwCi0gICAgICByZXR1cm4gKEZUX1Nob3J0KSgKLSAgICAgICAgICAgICAgICggKCAoIChGVF9VSW50MzIpKiggZFswXSArIDEgKSA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpKiggZFswXSArIDIgKSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpKiggZFswXSArIDMgKSA8PCAgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50MzIpKiggZFswXSArIDQgKSAgICAgICAgICkgKyAweDgwMDBVICkgPj4gMTYgKTsKLSNlbHNlCi0gICAgICByZXR1cm4gKEZUX1Nob3J0KSgKLSAgICAgICAgICAgICAgICggKCAoIChGVF9VSW50MzIpKiggZFswXSArIDEgKSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpKiggZFswXSArIDIgKSA8PCAgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50MzIpKiggZFswXSArIDMgKSAgICAgICAgICkgKyAweDgwVSApID4+IDggKTsKLSNlbmRpZgotICAgIH0KLQotICAgIGVsc2UKLSAgICAgIHJldHVybiBjZmZfcGFyc2VfaW50ZWdlciggKmQsIHBhcnNlci0+bGltaXQgKTsKLSAgfQotCi0KLSAgLyogcmVhZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgZWl0aGVyIGludGVnZXIgb3IgcmVhbCAqLwotICBzdGF0aWMgRlRfRml4ZWQKLSAgZG9fZml4ZWQoIENGRl9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgIEZUX0J5dGUqKiAgIGQsCi0gICAgICAgICAgICBGVF9Mb25nICAgICBzY2FsaW5nICkKLSAgewotICAgIGlmICggKipkID09IDMwICkKLSAgICAgIHJldHVybiBjZmZfcGFyc2VfcmVhbCggKmQsIHBhcnNlci0+bGltaXQsIHNjYWxpbmcsIE5VTEwgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfTG9uZyAgdmFsID0gY2ZmX3BhcnNlX2ludGVnZXIoICpkLCBwYXJzZXItPmxpbWl0ICk7Ci0KLQotICAgICAgaWYgKCBzY2FsaW5nICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9BQlMoIHZhbCApID4gcG93ZXJfdGVuX2xpbWl0c1tzY2FsaW5nXSApCi0gICAgICAgIHsKLSAgICAgICAgICB2YWwgPSB2YWwgPiAwID8gMHg3RkZGRkZGRkwgOiAtMHg3RkZGRkZGRkZMOwotICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgKj0gcG93ZXJfdGVuc1tzY2FsaW5nXTsKLSAgICAgIH0KLQotICAgICAgaWYgKCB2YWwgPiAweDdGRkYgKQotICAgICAgewotICAgICAgICB2YWwgPSAweDdGRkZGRkZGTDsKLSAgICAgICAgZ290byBPdmVyZmxvdzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCB2YWwgPCAtMHg3RkZGICkKLSAgICAgIHsKLSAgICAgICAgdmFsID0gLTB4N0ZGRkZGRkZMOwotICAgICAgICBnb3RvIE92ZXJmbG93OwotICAgICAgfQotCi0gICAgICByZXR1cm4gKEZUX0xvbmcpKCAoRlRfVUxvbmcpdmFsIDw8IDE2ICk7Ci0KLSAgICBPdmVyZmxvdzoKLSAgICAgIEZUX1RSQUNFNCgoICIhISFPVkVSRkxPVzohISEiICkpOwotICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIHJlYWQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGVpdGhlciBpbnRlZ2VyIG9yIHJlYWwgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGNmZl9wYXJzZV9maXhlZCggQ0ZGX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgIGQgKQotICB7Ci0gICAgcmV0dXJuIGRvX2ZpeGVkKCBwYXJzZXIsIGQsIDAgKTsKLSAgfQotCi0KLSAgLyogcmVhZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgZWl0aGVyIGludGVnZXIgb3IgcmVhbCwgKi8KLSAgLyogYnV0IHJldHVybiBgMTBec2NhbGluZycgdGltZXMgdGhlIG51bWJlciByZWFkIGluICAgICAgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGNmZl9wYXJzZV9maXhlZF9zY2FsZWQoIENGRl9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICAgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgc2NhbGluZyApCi0gIHsKLSAgICByZXR1cm4gZG9fZml4ZWQoIHBhcnNlciwgZCwgc2NhbGluZyApOwotICB9Ci0KLQotICAvKiByZWFkIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBlaXRoZXIgaW50ZWdlciBvciByZWFsLCAgICAgKi8KLSAgLyogYW5kIHJldHVybiBpdCBhcyBwcmVjaXNlIGFzIHBvc3NpYmxlIC0tIGBzY2FsaW5nJyByZXR1cm5zICovCi0gIC8qIHRoZSBzY2FsaW5nIGZhY3RvciAoYXMgYSBwb3dlciBvZiAxMCkgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRml4ZWQKLSAgY2ZmX3BhcnNlX2ZpeGVkX2R5bmFtaWMoIENGRl9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICBzY2FsaW5nICkKLSAgewotICAgIEZUX0FTU0VSVCggc2NhbGluZyApOwotCi0gICAgaWYgKCAqKmQgPT0gMzAgKQotICAgICAgcmV0dXJuIGNmZl9wYXJzZV9yZWFsKCAqZCwgcGFyc2VyLT5saW1pdCwgMCwgc2NhbGluZyApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9Mb25nICBudW1iZXI7Ci0gICAgICBGVF9JbnQgICBpbnRlZ2VyX2xlbmd0aDsKLQotCi0gICAgICBudW1iZXIgPSBjZmZfcGFyc2VfaW50ZWdlciggZFswXSwgZFsxXSApOwotCi0gICAgICBpZiAoIG51bWJlciA+IDB4N0ZGRkwgKQotICAgICAgewotICAgICAgICBmb3IgKCBpbnRlZ2VyX2xlbmd0aCA9IDU7IGludGVnZXJfbGVuZ3RoIDwgMTA7IGludGVnZXJfbGVuZ3RoKysgKQotICAgICAgICAgIGlmICggbnVtYmVyIDwgcG93ZXJfdGVuc1tpbnRlZ2VyX2xlbmd0aF0gKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCAoIG51bWJlciAvIHBvd2VyX3RlbnNbaW50ZWdlcl9sZW5ndGggLSA1XSApID4gMHg3RkZGTCApCi0gICAgICAgIHsKLSAgICAgICAgICAqc2NhbGluZyA9IGludGVnZXJfbGVuZ3RoIC0gNDsKLSAgICAgICAgICByZXR1cm4gRlRfRGl2Rml4KCBudW1iZXIsIHBvd2VyX3RlbnNbaW50ZWdlcl9sZW5ndGggLSA0XSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICpzY2FsaW5nID0gaW50ZWdlcl9sZW5ndGggLSA1OwotICAgICAgICAgIHJldHVybiBGVF9EaXZGaXgoIG51bWJlciwgcG93ZXJfdGVuc1tpbnRlZ2VyX2xlbmd0aCAtIDVdICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKnNjYWxpbmcgPSAwOwotICAgICAgICByZXR1cm4gKEZUX0xvbmcpKCAoRlRfVUxvbmcpbnVtYmVyIDw8IDE2ICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3BhcnNlX2ZvbnRfbWF0cml4KCBDRkZfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgQ0ZGX0ZvbnRSZWNEaWN0ICBkaWN0ICAgPSAoQ0ZGX0ZvbnRSZWNEaWN0KXBhcnNlci0+b2JqZWN0OwotICAgIEZUX01hdHJpeCogICAgICAgbWF0cml4ID0gJmRpY3QtPmZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciogICAgICAgb2Zmc2V0ID0gJmRpY3QtPmZvbnRfb2Zmc2V0OwotICAgIEZUX1VMb25nKiAgICAgICAgdXBtICAgID0gJmRpY3QtPnVuaXRzX3Blcl9lbTsKLSAgICBGVF9CeXRlKiogICAgICAgIGRhdGEgICA9IHBhcnNlci0+c3RhY2s7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvciAgPSBGVF9FUlIoIFN0YWNrX1VuZGVyZmxvdyApOwotCi0KLSAgICBpZiAoIHBhcnNlci0+dG9wID49IHBhcnNlci0+c3RhY2sgKyA2ICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgdmFsdWVzWzZdOwotICAgICAgRlRfTG9uZyAgIHNjYWxpbmdzWzZdOwotCi0gICAgICBGVF9Mb25nICBtaW5fc2NhbGluZywgbWF4X3NjYWxpbmc7Ci0gICAgICBpbnQgICAgICBpOwotCi0KLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgICBkaWN0LT5oYXNfZm9udF9tYXRyaXggPSBUUlVFOwotCi0gICAgICAvKiBXZSBleHBlY3QgYSB3ZWxsLWZvcm1lZCBmb250IG1hdHJpeCwgdGhpcyBpcywgdGhlIG1hdHJpeCBlbGVtZW50cyAqLwotICAgICAgLyogYHh4JyBhbmQgYHl5JyBhcmUgb2YgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBtYWduaXR1ZGUuICBUbyBhdm9pZCAgKi8KLSAgICAgIC8qIGxvc3Mgb2YgcHJlY2lzaW9uLCB3ZSB1c2UgdGhlIG1hZ25pdHVkZSBvZiB0aGUgbGFyZ2VzdCBtYXRyaXggICAgICovCi0gICAgICAvKiBlbGVtZW50IHRvIHNjYWxlIGFsbCBvdGhlciBlbGVtZW50cy4gIFRoZSBzY2FsaW5nIGZhY3RvciBpcyB0aGVuICAqLwotICAgICAgLyogY29udGFpbmVkIGluIHRoZSBgdW5pdHNfcGVyX2VtJyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgbWF4X3NjYWxpbmcgPSBGVF9MT05HX01JTjsKLSAgICAgIG1pbl9zY2FsaW5nID0gRlRfTE9OR19NQVg7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzW2ldID0gY2ZmX3BhcnNlX2ZpeGVkX2R5bmFtaWMoIHBhcnNlciwgZGF0YSsrLCAmc2NhbGluZ3NbaV0gKTsKLSAgICAgICAgaWYgKCB2YWx1ZXNbaV0gKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBzY2FsaW5nc1tpXSA+IG1heF9zY2FsaW5nICkKLSAgICAgICAgICAgIG1heF9zY2FsaW5nID0gc2NhbGluZ3NbaV07Ci0gICAgICAgICAgaWYgKCBzY2FsaW5nc1tpXSA8IG1pbl9zY2FsaW5nICkKLSAgICAgICAgICAgIG1pbl9zY2FsaW5nID0gc2NhbGluZ3NbaV07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBtYXhfc2NhbGluZyA8IC05ICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgbWF4X3NjYWxpbmcgPiAwICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICggbWF4X3NjYWxpbmcgLSBtaW5fc2NhbGluZyApIDwgMCB8fAotICAgICAgICAgICAoIG1heF9zY2FsaW5nIC0gbWluX3NjYWxpbmcgKSA+IDkgKQotICAgICAgewotICAgICAgICAvKiBSZXR1cm4gZGVmYXVsdCBtYXRyaXggaW4gY2FzZSBvZiB1bmxpa2VseSB2YWx1ZXMuICovCi0KLSAgICAgICAgRlRfVFJBQ0UxKCggImNmZl9wYXJzZV9mb250X21hdHJpeDoiCi0gICAgICAgICAgICAgICAgICAgICIgc3RyYW5nZSBzY2FsaW5nIHZhbHVlcyAobWluaW11bSAlZCwgbWF4aW11bSAlZCksXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAiIHVzaW5nIGRlZmF1bHQgbWF0cml4XG4iLCBtaW5fc2NhbGluZywgbWF4X3NjYWxpbmcgKSk7Ci0KLSAgICAgICAgbWF0cml4LT54eCA9IDB4MTAwMDBMOwotICAgICAgICBtYXRyaXgtPnl4ID0gMDsKLSAgICAgICAgbWF0cml4LT54eSA9IDA7Ci0gICAgICAgIG1hdHJpeC0+eXkgPSAweDEwMDAwTDsKLSAgICAgICAgb2Zmc2V0LT54ICA9IDA7Ci0gICAgICAgIG9mZnNldC0+eSAgPSAwOwotICAgICAgICAqdXBtICAgICAgID0gMTsKLQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfRml4ZWQgIHZhbHVlID0gdmFsdWVzW2ldOwotICAgICAgICBGVF9Mb25nICAgZGl2aXNvciwgaGFsZl9kaXZpc29yOwotCi0KLSAgICAgICAgaWYgKCAhdmFsdWUgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGRpdmlzb3IgICAgICA9IHBvd2VyX3RlbnNbbWF4X3NjYWxpbmcgLSBzY2FsaW5nc1tpXV07Ci0gICAgICAgIGhhbGZfZGl2aXNvciA9IGRpdmlzb3IgPj4gMTsKLQotICAgICAgICBpZiAoIHZhbHVlIDwgMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIEZUX0xPTkdfTUlOICsgaGFsZl9kaXZpc29yIDwgdmFsdWUgKQotICAgICAgICAgICAgdmFsdWVzW2ldID0gKCB2YWx1ZSAtIGhhbGZfZGl2aXNvciApIC8gZGl2aXNvcjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB2YWx1ZXNbaV0gPSBGVF9MT05HX01JTiAvIGRpdmlzb3I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBGVF9MT05HX01BWCAtIGhhbGZfZGl2aXNvciA+IHZhbHVlICkKLSAgICAgICAgICAgIHZhbHVlc1tpXSA9ICggdmFsdWUgKyBoYWxmX2Rpdmlzb3IgKSAvIGRpdmlzb3I7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFsdWVzW2ldID0gRlRfTE9OR19NQVggLyBkaXZpc29yOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIG1hdHJpeC0+eHggPSB2YWx1ZXNbMF07Ci0gICAgICBtYXRyaXgtPnl4ID0gdmFsdWVzWzFdOwotICAgICAgbWF0cml4LT54eSA9IHZhbHVlc1syXTsKLSAgICAgIG1hdHJpeC0+eXkgPSB2YWx1ZXNbM107Ci0gICAgICBvZmZzZXQtPnggID0gdmFsdWVzWzRdOwotICAgICAgb2Zmc2V0LT55ICA9IHZhbHVlc1s1XTsKLQotICAgICAgKnVwbSA9IChGVF9VTG9uZylwb3dlcl90ZW5zWy1tYXhfc2NhbGluZ107Ci0KLSAgICAgIEZUX1RSQUNFNCgoICIgWyVmICVmICVmICVmICVmICVmXVxuIiwKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpbWF0cml4LT54eCAvICp1cG0gLyA2NTUzNiwKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpbWF0cml4LT54eSAvICp1cG0gLyA2NTUzNiwKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpbWF0cml4LT55eCAvICp1cG0gLyA2NTUzNiwKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpbWF0cml4LT55eSAvICp1cG0gLyA2NTUzNiwKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpb2Zmc2V0LT54ICAvICp1cG0gLyA2NTUzNiwKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpb2Zmc2V0LT55ICAvICp1cG0gLyA2NTUzNiApKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfcGFyc2VfZm9udF9iYm94KCBDRkZfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgQ0ZGX0ZvbnRSZWNEaWN0ICBkaWN0ID0gKENGRl9Gb250UmVjRGljdClwYXJzZXItPm9iamVjdDsKLSAgICBGVF9CQm94KiAgICAgICAgIGJib3ggPSAmZGljdC0+Zm9udF9iYm94OwotICAgIEZUX0J5dGUqKiAgICAgICAgZGF0YSA9IHBhcnNlci0+c3RhY2s7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBGVF9FUlIoIFN0YWNrX1VuZGVyZmxvdyApOwotCi0gICAgaWYgKCBwYXJzZXItPnRvcCA+PSBwYXJzZXItPnN0YWNrICsgNCApCi0gICAgewotICAgICAgYmJveC0+eE1pbiA9IEZUX1JvdW5kRml4KCBjZmZfcGFyc2VfZml4ZWQoIHBhcnNlciwgZGF0YSsrICkgKTsKLSAgICAgIGJib3gtPnlNaW4gPSBGVF9Sb3VuZEZpeCggY2ZmX3BhcnNlX2ZpeGVkKCBwYXJzZXIsIGRhdGErKyApICk7Ci0gICAgICBiYm94LT54TWF4ID0gRlRfUm91bmRGaXgoIGNmZl9wYXJzZV9maXhlZCggcGFyc2VyLCBkYXRhKysgKSApOwotICAgICAgYmJveC0+eU1heCA9IEZUX1JvdW5kRml4KCBjZmZfcGFyc2VfZml4ZWQoIHBhcnNlciwgZGF0YSAgICkgKTsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgICBGVF9UUkFDRTQoKCAiIFslZCAlZCAlZCAlZF1cbiIsCi0gICAgICAgICAgICAgICAgICBiYm94LT54TWluIC8gNjU1MzYsCi0gICAgICAgICAgICAgICAgICBiYm94LT55TWluIC8gNjU1MzYsCi0gICAgICAgICAgICAgICAgICBiYm94LT54TWF4IC8gNjU1MzYsCi0gICAgICAgICAgICAgICAgICBiYm94LT55TWF4IC8gNjU1MzYgKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3BhcnNlX3ByaXZhdGVfZGljdCggQ0ZGX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIENGRl9Gb250UmVjRGljdCAgZGljdCA9IChDRkZfRm9udFJlY0RpY3QpcGFyc2VyLT5vYmplY3Q7Ci0gICAgRlRfQnl0ZSoqICAgICAgICBkYXRhID0gcGFyc2VyLT5zdGFjazsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IEZUX0VSUiggU3RhY2tfVW5kZXJmbG93ICk7Ci0KLSAgICBpZiAoIHBhcnNlci0+dG9wID49IHBhcnNlci0+c3RhY2sgKyAyICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICB0bXA7Ci0KLQotICAgICAgdG1wID0gY2ZmX3BhcnNlX251bSggcGFyc2VyLCBkYXRhKysgKTsKLSAgICAgIGlmICggdG1wIDwgMCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9wYXJzZV9wcml2YXRlX2RpY3Q6IEludmFsaWQgZGljdGlvbmFyeSBzaXplXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICAgIGRpY3QtPnByaXZhdGVfc2l6ZSA9IChGVF9VTG9uZyl0bXA7Ci0KLSAgICAgIHRtcCA9IGNmZl9wYXJzZV9udW0oIHBhcnNlciwgZGF0YSApOwotICAgICAgaWYgKCB0bXAgPCAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2ZmX3BhcnNlX3ByaXZhdGVfZGljdDogSW52YWxpZCBkaWN0aW9uYXJ5IG9mZnNldFxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBkaWN0LT5wcml2YXRlX29mZnNldCA9IChGVF9VTG9uZyl0bXA7Ci0KLSAgICAgIEZUX1RSQUNFNCgoICIgJWx1ICVsdVxuIiwKLSAgICAgICAgICAgICAgICAgIGRpY3QtPnByaXZhdGVfc2l6ZSwgZGljdC0+cHJpdmF0ZV9vZmZzZXQgKSk7Ci0KLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogVGhlIGBNdWx0aXBsZU1hc3Rlcicgb3BlcmF0b3IgY29tZXMgYmVmb3JlIGFueSAgKi8KLSAgLyogdG9wIERJQ1Qgb3BlcmF0b3JzIHRoYXQgY29udGFpbiBUMiBjaGFyc3RyaW5ncy4gKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3BhcnNlX211bHRpcGxlX21hc3RlciggQ0ZGX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIENGRl9Gb250UmVjRGljdCAgZGljdCA9IChDRkZfRm9udFJlY0RpY3QpcGFyc2VyLT5vYmplY3Q7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAvKiBiZWF1dGlmeSB0cmFjaW5nIG1lc3NhZ2UgKi8KLSAgICBpZiAoIGZ0X3RyYWNlX2xldmVsc1tGVF9DT01QT05FTlRdIDwgNCApCi0gICAgICBGVF9UUkFDRTEoKCAiTXVsdGlwbGUgTWFzdGVyIENGRnMgbm90IHN1cHBvcnRlZCB5ZXQsIgotICAgICAgICAgICAgICAgICAgIiBoYW5kbGluZyBmaXJzdCBtYXN0ZXIgZGVzaWduIG9ubHlcbiIgKSk7Ci0gICAgZWxzZQotICAgICAgRlRfVFJBQ0UxKCggIiAobm90IHN1cHBvcnRlZCB5ZXQsIgotICAgICAgICAgICAgICAgICAgIiBoYW5kbGluZyBmaXJzdCBtYXN0ZXIgZGVzaWduIG9ubHkpXG4iICkpOwotI2VuZGlmCi0KLSAgICBlcnJvciA9IEZUX0VSUiggU3RhY2tfVW5kZXJmbG93ICk7Ci0KLSAgICAvKiBjdXJyZW50bHksIHdlIGhhbmRsZSBvbmx5IHRoZSBmaXJzdCBhcmd1bWVudCAqLwotICAgIGlmICggcGFyc2VyLT50b3AgPj0gcGFyc2VyLT5zdGFjayArIDUgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgIG51bV9kZXNpZ25zID0gY2ZmX3BhcnNlX251bSggcGFyc2VyLCBwYXJzZXItPnN0YWNrICk7Ci0KLQotICAgICAgaWYgKCBudW1fZGVzaWducyA+IDE2IHx8IG51bV9kZXNpZ25zIDwgMiApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9wYXJzZV9tdWx0aXBsZV9tYXN0ZXI6IgotICAgICAgICAgICAgICAgICAgICIgSW52YWxpZCBudW1iZXIgb2YgZGVzaWduc1xuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkaWN0LT5udW1fZGVzaWducyAgID0gKEZUX1VTaG9ydCludW1fZGVzaWduczsKLSAgICAgICAgZGljdC0+bnVtX2F4ZXMgICAgICA9IChGVF9VU2hvcnQpKCBwYXJzZXItPnRvcCAtIHBhcnNlci0+c3RhY2sgLSA0ICk7Ci0KLSAgICAgICAgcGFyc2VyLT5udW1fZGVzaWducyA9IGRpY3QtPm51bV9kZXNpZ25zOwotICAgICAgICBwYXJzZXItPm51bV9heGVzICAgID0gZGljdC0+bnVtX2F4ZXM7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3BhcnNlX2NpZF9yb3MoIENGRl9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3QgPSAoQ0ZGX0ZvbnRSZWNEaWN0KXBhcnNlci0+b2JqZWN0OwotICAgIEZUX0J5dGUqKiAgICAgICAgZGF0YSA9IHBhcnNlci0+c3RhY2s7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBGVF9FUlIoIFN0YWNrX1VuZGVyZmxvdyApOwotCi0gICAgaWYgKCBwYXJzZXItPnRvcCA+PSBwYXJzZXItPnN0YWNrICsgMyApCi0gICAgewotICAgICAgZGljdC0+Y2lkX3JlZ2lzdHJ5ID0gKEZUX1VJbnQpY2ZmX3BhcnNlX251bSggcGFyc2VyLCBkYXRhKysgKTsKLSAgICAgIGRpY3QtPmNpZF9vcmRlcmluZyA9IChGVF9VSW50KWNmZl9wYXJzZV9udW0oIHBhcnNlciwgZGF0YSsrICk7Ci0gICAgICBpZiAoICoqZGF0YSA9PSAzMCApCi0gICAgICAgIEZUX1RSQUNFMSgoICJjZmZfcGFyc2VfY2lkX3JvczogcmVhbCBzdXBwbGVtZW50IGlzIHJvdW5kZWRcbiIgKSk7Ci0gICAgICBkaWN0LT5jaWRfc3VwcGxlbWVudCA9IGNmZl9wYXJzZV9udW0oIHBhcnNlciwgZGF0YSApOwotICAgICAgaWYgKCBkaWN0LT5jaWRfc3VwcGxlbWVudCA8IDAgKQotICAgICAgICBGVF9UUkFDRTEoKCAiY2ZmX3BhcnNlX2NpZF9yb3M6IG5lZ2F0aXZlIHN1cHBsZW1lbnQgJWQgaXMgZm91bmRcbiIsCi0gICAgICAgICAgICAgICAgICAgZGljdC0+Y2lkX3N1cHBsZW1lbnQgKSk7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgICAgRlRfVFJBQ0U0KCggIiAlZCAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9yZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9vcmRlcmluZywKLSAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9zdXBwbGVtZW50ICkpOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9wYXJzZV92c2luZGV4KCBDRkZfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgLyogdnNpbmRleCBvcGVyYXRvciBjYW4gb25seSBiZSB1c2VkIGluIGEgUHJpdmF0ZSBESUNUICovCi0gICAgQ0ZGX1ByaXZhdGUgIHByaXYgPSAoQ0ZGX1ByaXZhdGUpcGFyc2VyLT5vYmplY3Q7Ci0gICAgRlRfQnl0ZSoqICAgIGRhdGEgPSBwYXJzZXItPnN0YWNrOwotICAgIENGRl9CbGVuZCAgICBibGVuZDsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIXByaXYgfHwgIXByaXYtPnN1YmZvbnQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBibGVuZCA9ICZwcml2LT5zdWJmb250LT5ibGVuZDsKLQotICAgIGlmICggYmxlbmQtPnVzZWRCViApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiIGNmZl9wYXJzZV92c2luZGV4OiB2c2luZGV4IG5vdCBhbGxvd2VkIGFmdGVyIGJsZW5kXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgcHJpdi0+dnNpbmRleCA9IChGVF9VSW50KWNmZl9wYXJzZV9udW0oIHBhcnNlciwgZGF0YSsrICk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiICVkXG4iLCBwcml2LT52c2luZGV4ICkpOwotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfcGFyc2VfYmxlbmQoIENGRl9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICAvKiBibGVuZCBvcGVyYXRvciBjYW4gb25seSBiZSB1c2VkIGluIGEgUHJpdmF0ZSBESUNUICovCi0gICAgQ0ZGX1ByaXZhdGUgIHByaXYgPSAoQ0ZGX1ByaXZhdGUpcGFyc2VyLT5vYmplY3Q7Ci0gICAgQ0ZGX1N1YkZvbnQgIHN1YkZvbnQ7Ci0gICAgQ0ZGX0JsZW5kICAgIGJsZW5kOwotICAgIEZUX1VJbnQgICAgICBudW1CbGVuZHM7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFwcml2IHx8ICFwcml2LT5zdWJmb250ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgc3ViRm9udCA9IHByaXYtPnN1YmZvbnQ7Ci0gICAgYmxlbmQgICA9ICZzdWJGb250LT5ibGVuZDsKLQotICAgIGlmICggY2ZmX2JsZW5kX2NoZWNrX3ZlY3RvciggYmxlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT52c2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRm9udC0+bGVuTkRWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRm9udC0+TkRWICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gY2ZmX2JsZW5kX2J1aWxkX3ZlY3RvciggYmxlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPnZzaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkZvbnQtPmxlbk5EViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRm9udC0+TkRWICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIG51bUJsZW5kcyA9IChGVF9VSW50KWNmZl9wYXJzZV9udW0oIHBhcnNlciwgcGFyc2VyLT50b3AgLSAxICk7Ci0gICAgaWYgKCBudW1CbGVuZHMgPiBwYXJzZXItPnN0YWNrU2l6ZSApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiY2ZmX3BhcnNlX2JsZW5kOiBJbnZhbGlkIG51bWJlciBvZiBibGVuZHNcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U0KCggIiAgICVkIHZhbHVlcyBibGVuZGVkXG4iLCBudW1CbGVuZHMgKSk7Ci0KLSAgICBlcnJvciA9IGNmZl9ibGVuZF9kb0JsZW5kKCBzdWJGb250LCBwYXJzZXIsIG51bUJsZW5kcyApOwotCi0gICAgYmxlbmQtPnVzZWRCViA9IFRSVUU7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIG1heHN0YWNrIG9wZXJhdG9yIGluY3JlYXNlcyBwYXJzZXIgYW5kIG9wZXJhbmQgc3RhY2tzIGZvciBDRkYyICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfcGFyc2VfbWF4c3RhY2soIENGRl9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICAvKiBtYXhzdGFjayBvcGVyYXRvciBjYW4gb25seSBiZSB1c2VkIGluIGEgVG9wIERJQ1QgKi8KLSAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3QgID0gKENGRl9Gb250UmVjRGljdClwYXJzZXItPm9iamVjdDsKLSAgICBGVF9CeXRlKiogICAgICAgIGRhdGEgID0gcGFyc2VyLT5zdGFjazsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFkaWN0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZGljdC0+bWF4c3RhY2sgPSAoRlRfVUludCljZmZfcGFyc2VfbnVtKCBwYXJzZXIsIGRhdGErKyApOwotICAgIGlmICggZGljdC0+bWF4c3RhY2sgPiBDRkYyX01BWF9TVEFDSyApCi0gICAgICBkaWN0LT5tYXhzdGFjayA9IENGRjJfTUFYX1NUQUNLOwotICAgIGlmICggZGljdC0+bWF4c3RhY2sgPCBDRkYyX0RFRkFVTFRfU1RBQ0sgKQotICAgICAgZGljdC0+bWF4c3RhY2sgPSBDRkYyX0RFRkFVTFRfU1RBQ0s7Ci0KLSAgICBGVF9UUkFDRTQoKCAiICVkXG4iLCBkaWN0LT5tYXhzdGFjayApKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNkZWZpbmUgQ0ZGX0ZJRUxEX05VTSggY29kZSwgbmFtZSwgaWQgKSAgICAgICAgICAgICBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBpZCwgY2ZmX2tpbmRfbnVtICkKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0ZJWEVEKCBjb2RlLCBuYW1lLCBpZCApICAgICAgICAgICAgIFwKLSAgICAgICAgICBDRkZfRklFTEQoIGNvZGUsIG5hbWUsIGlkLCBjZmZfa2luZF9maXhlZCApCi0jZGVmaW5lIENGRl9GSUVMRF9GSVhFRF8xMDAwKCBjb2RlLCBuYW1lLCBpZCApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBpZCwgY2ZmX2tpbmRfZml4ZWRfdGhvdXNhbmQgKQotI2RlZmluZSBDRkZfRklFTERfU1RSSU5HKCBjb2RlLCBuYW1lLCBpZCApICAgICAgICAgICAgIFwKLSAgICAgICAgICBDRkZfRklFTEQoIGNvZGUsIG5hbWUsIGlkLCBjZmZfa2luZF9zdHJpbmcgKQotI2RlZmluZSBDRkZfRklFTERfQk9PTCggY29kZSwgbmFtZSwgaWQgKSAgICAgICAgICAgICBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBpZCwgY2ZmX2tpbmRfYm9vbCApCi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0KLSN1bmRlZiAgQ0ZGX0ZJRUxECi0jdW5kZWYgIENGRl9GSUVMRF9ERUxUQQotCi0KLSNpZm5kZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotCi0jZGVmaW5lIENGRl9GSUVMRF9DQUxMQkFDSyggY29kZSwgbmFtZSwgaWQgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfa2luZF9jYWxsYmFjaywgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb2RlIHwgQ0ZGQ09ERSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfcGFyc2VfICMjIG5hbWUsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSwKLQotI2RlZmluZSBDRkZfRklFTERfQkxFTkQoIGNvZGUsIGlkICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY2ZmX2tpbmRfYmxlbmQsICAgICAgICAgXAotICAgICAgICAgICAgY29kZSB8IENGRkNPREUsICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY2ZmX3BhcnNlX2JsZW5kLCAgICAgICAgXAotICAgICAgICAgICAgMCwgMCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBpZCwga2luZCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGtpbmQsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvZGUgfCBDRkZDT0RFLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggbmFtZSApLCAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX1NJWkUoIG5hbWUgKSwgICAgICAgIFwKLSAgICAgICAgICAgIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jZGVmaW5lIENGRl9GSUVMRF9ERUxUQSggY29kZSwgbmFtZSwgbWF4LCBpZCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY2ZmX2tpbmRfZGVsdGEsICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb2RlIHwgQ0ZGQ09ERSwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggbmFtZSApLCAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRV9ERUxUQSggbmFtZSApLCAgICAgICBcCi0gICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1heCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBudW1fICMjIG5hbWUgKSAgICBcCi0gICAgICAgICAgfSwKLQotICBzdGF0aWMgY29uc3QgQ0ZGX0ZpZWxkX0hhbmRsZXIgIGNmZl9maWVsZF9oYW5kbGVyc1tdID0KLSAgewotCi0jaW5jbHVkZSAiY2ZmdG9rZW4uaCIKLQotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9Ci0gIH07Ci0KLQotI2Vsc2UgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0KLSNkZWZpbmUgQ0ZGX0ZJRUxEX0NBTExCQUNLKCBjb2RlLCBuYW1lLCBpZCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNmZl9raW5kX2NhbGxiYWNrLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvZGUgfCBDRkZDT0RFLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNmZl9wYXJzZV8gIyMgbmFtZSwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jZGVmaW5lIENGRl9GSUVMRF9CTEVORCggY29kZSwgaWQgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfa2luZF9ibGVuZCwgICAgICAgICBcCi0gICAgICAgICAgICBjb2RlIHwgQ0ZGQ09ERSwgICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfcGFyc2VfYmxlbmQsICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSwKLQotI2RlZmluZSBDRkZfRklFTEQoIGNvZGUsIG5hbWUsIGlkLCBraW5kICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAga2luZCwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29kZSB8IENGRkNPREUsICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBuYW1lICksICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRSggbmFtZSApLCAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgQ0ZGX0ZJRUxEX0RFTFRBKCBjb2RlLCBuYW1lLCBtYXgsIGlkICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfa2luZF9kZWx0YSwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvZGUgfCBDRkZDT0RFLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBuYW1lICksICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFX0RFTFRBKCBuYW1lICksICAgICAgIFwKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIG51bV8gIyMgbmFtZSApLCAgIFwKLSAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSAgc3RhdGljIGNvbnN0IENGRl9GaWVsZF9IYW5kbGVyICBjZmZfZmllbGRfaGFuZGxlcnNbXSA9Ci0gIHsKLQotI2luY2x1ZGUgImNmZnRva2VuLmgiCi0KLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQotICB9OwotCi0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfY2ZmX2ZpZWxkX2hhbmRsZXJzKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkZfRmllbGRfSGFuZGxlciogIGNsYXp6ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIGNsYXp6ICkKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc19jZmZfZmllbGRfaGFuZGxlcnMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGRl9GaWVsZF9IYW5kbGVyKiogIG91dHB1dF9jbGFzcyApCi0gIHsKLSAgICBDRkZfRmllbGRfSGFuZGxlciogIGNsYXp6ICA9IE5VTEw7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIGludCAgaSA9IDA7Ci0KLQotI3VuZGVmIENGRl9GSUVMRAotI2RlZmluZSBDRkZfRklFTEQoIGNvZGUsIG5hbWUsIGlkLCBraW5kICkgaSsrOwotI3VuZGVmIENGRl9GSUVMRF9ERUxUQQotI2RlZmluZSBDRkZfRklFTERfREVMVEEoIGNvZGUsIG5hbWUsIG1heCwgaWQgKSBpKys7Ci0jdW5kZWYgQ0ZGX0ZJRUxEX0NBTExCQUNLCi0jZGVmaW5lIENGRl9GSUVMRF9DQUxMQkFDSyggY29kZSwgbmFtZSwgaWQgKSBpKys7Ci0jdW5kZWYgQ0ZGX0ZJRUxEX0JMRU5ECi0jZGVmaW5lIENGRl9GSUVMRF9CTEVORCggY29kZSwgaWQgKSBpKys7Ci0KLSNpbmNsdWRlICJjZmZ0b2tlbi5oIgotCi0gICAgaSsrOyAvKiB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfSAqLwotCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoIENGRl9GaWVsZF9IYW5kbGVyICkgKiBpICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgaSA9IDA7Ci0KLQotI2lmbmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0KLSN1bmRlZiBDRkZfRklFTERfQ0FMTEJBQ0sKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0NBTExCQUNLKCBjb2RlXywgbmFtZV8sIGlkXyApICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ua2luZCAgICAgICAgID0gY2ZmX2tpbmRfY2FsbGJhY2s7ICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvZGUgICAgICAgICA9IGNvZGVfIHwgQ0ZGQ09ERTsgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uc2l6ZSAgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnJlYWRlciAgICAgICA9IGNmZl9wYXJzZV8gIyMgbmFtZV87IFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY291bnRfb2Zmc2V0ID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsKLQotI3VuZGVmICBDRkZfRklFTEQKLSNkZWZpbmUgQ0ZGX0ZJRUxEKCBjb2RlXywgbmFtZV8sIGlkXywga2luZF8gKSAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5raW5kICAgICAgICAgPSBraW5kXzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7ICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSBGVF9GSUVMRF9PRkZTRVQoIG5hbWVfICk7IFwKLSAgICAgICAgICBjbGF6eltpXS5zaXplICAgICAgICAgPSBGVF9GSUVMRF9TSVpFKCBuYW1lXyApOyAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb3VudF9vZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotI3VuZGVmICBDRkZfRklFTERfREVMVEEKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0RFTFRBKCBjb2RlXywgbmFtZV8sIG1heF8sIGlkXyApICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGNmZl9raW5kX2RlbHRhOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gY29kZV8gfCBDRkZDT0RFOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSBGVF9GSUVMRF9PRkZTRVQoIG5hbWVfICk7ICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IEZUX0ZJRUxEX1NJWkVfREVMVEEoIG5hbWVfICk7ICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSBtYXhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IEZUX0ZJRUxEX09GRlNFVCggbnVtXyAjIyBuYW1lXyApOyBcCi0gICAgICAgICAgaSsrOwotCi0jdW5kZWYgIENGRl9GSUVMRF9CTEVORAotI2RlZmluZSBDRkZfRklFTERfQkxFTkQoIGNvZGVfLCBpZF8gKSAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGNmZl9raW5kX2JsZW5kOyAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvZGUgICAgICAgICA9IGNvZGVfIHwgQ0ZGQ09ERTsgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IDA7ICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnJlYWRlciAgICAgICA9IGNmZl9wYXJzZV9ibGVuZDsgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IDA7ICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7ICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsKLQotI2luY2x1ZGUgImNmZnRva2VuLmgiCi0KLSAgICBjbGF6eltpXS5raW5kICAgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLmNvZGUgICAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0ub2Zmc2V0ICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5zaXplICAgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLnJlYWRlciAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0uYXJyYXlfbWF4ICAgID0gMDsKLSAgICBjbGF6eltpXS5jb3VudF9vZmZzZXQgPSAwOwotCi0KLSNlbHNlIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotI3VuZGVmIENGRl9GSUVMRF9DQUxMQkFDSwotI2RlZmluZSBDRkZfRklFTERfQ0FMTEJBQ0soIGNvZGVfLCBuYW1lXywgaWRfICkgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5raW5kICAgICAgICAgPSBjZmZfa2luZF9jYWxsYmFjazsgICBcCi0gICAgICAgICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gY29kZV8gfCBDRkZDT0RFOyAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5zaXplICAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gY2ZmX3BhcnNlXyAjIyBuYW1lXzsgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb3VudF9vZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uaWQgICAgICAgICAgID0gaWRfOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsKLQotI3VuZGVmICBDRkZfRklFTEQKLSNkZWZpbmUgQ0ZGX0ZJRUxEKCBjb2RlXywgbmFtZV8sIGlkXywga2luZF8gKSAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5raW5kICAgICAgICAgPSBraW5kXzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7ICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSBGVF9GSUVMRF9PRkZTRVQoIG5hbWVfICk7IFwKLSAgICAgICAgICBjbGF6eltpXS5zaXplICAgICAgICAgPSBGVF9GSUVMRF9TSVpFKCBuYW1lXyApOyAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb3VudF9vZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5pZCAgICAgICAgICAgPSBpZF87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotI3VuZGVmICBDRkZfRklFTERfREVMVEEKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0RFTFRBKCBjb2RlXywgbmFtZV8sIG1heF8sIGlkXyApICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGNmZl9raW5kX2RlbHRhOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gY29kZV8gfCBDRkZDT0RFOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSBGVF9GSUVMRF9PRkZTRVQoIG5hbWVfICk7ICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IEZUX0ZJRUxEX1NJWkVfREVMVEEoIG5hbWVfICk7ICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSBtYXhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IEZUX0ZJRUxEX09GRlNFVCggbnVtXyAjIyBuYW1lXyApOyBcCi0gICAgICAgICAgY2xhenpbaV0uaWQgICAgICAgICAgID0gaWRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpKys7Ci0KLSN1bmRlZiAgQ0ZGX0ZJRUxEX0JMRU5ECi0jZGVmaW5lIENGRl9GSUVMRF9CTEVORCggY29kZV8sIGlkXyApICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ua2luZCAgICAgICAgID0gY2ZmX2tpbmRfYmxlbmQ7ICBcCi0gICAgICAgICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gY29kZV8gfCBDRkZDT0RFOyBcCi0gICAgICAgICAgY2xhenpbaV0ub2Zmc2V0ICAgICAgID0gMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uc2l6ZSAgICAgICAgID0gMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gY2ZmX3BhcnNlX2JsZW5kOyBcCi0gICAgICAgICAgY2xhenpbaV0uYXJyYXlfbWF4ICAgID0gMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY291bnRfb2Zmc2V0ID0gMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uaWQgICAgICAgICAgID0gaWRfOyAgICAgICAgICAgICBcCi0gICAgICAgICAgaSsrOwotCi0jaW5jbHVkZSAiY2ZmdG9rZW4uaCIKLQotICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOwotICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7Ci0gICAgY2xhenpbaV0uaWQgICAgICAgICAgID0gMDsKLQotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9wYXJzZXJfcnVuKCBDRkZfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGxpbWl0ICkKLSAgewotICAgIEZUX0J5dGUqICAgIHAgICAgICAgPSBzdGFydDsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBwYXJzZXItPmxpYnJhcnk7Ci0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0KLQotICAgIHBhcnNlci0+dG9wICAgID0gcGFyc2VyLT5zdGFjazsKLSAgICBwYXJzZXItPnN0YXJ0ICA9IHN0YXJ0OwotICAgIHBhcnNlci0+bGltaXQgID0gbGltaXQ7Ci0gICAgcGFyc2VyLT5jdXJzb3IgPSBzdGFydDsKLQotICAgIHdoaWxlICggcCA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICB2ID0gKnA7Ci0KLSAgICAgIC8qIE9wY29kZSAzMSBpcyBsZWdhY3kgTU0gVDIgb3BlcmF0b3IsIG5vdCBhIG51bWJlci4gICAgICAqLwotICAgICAgLyogT3Bjb2RlIDI1NSBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIG5vdCBhcHBlYXIgaW4gZm9udHM7ICovCi0gICAgICAvKiBpdCBpcyB1c2VkIGludGVybmFsbHkgZm9yIENGRjIgYmxlbmRzLiAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggdiA+PSAyNyAmJiB2ICE9IDMxICYmIHYgIT0gMjU1ICkKLSAgICAgIHsKLSAgICAgICAgLyogaXQncyBhIG51bWJlcjsgd2Ugd2lsbCBwdXNoIGl0cyBwb3NpdGlvbiBvbiB0aGUgc3RhY2sgKi8KLSAgICAgICAgaWYgKCAoRlRfVUludCkoIHBhcnNlci0+dG9wIC0gcGFyc2VyLT5zdGFjayApID49IHBhcnNlci0+c3RhY2tTaXplICkKLSAgICAgICAgICBnb3RvIFN0YWNrX092ZXJmbG93OwotCi0gICAgICAgICpwYXJzZXItPnRvcCsrID0gcDsKLQotICAgICAgICAvKiBub3csIHNraXAgaXQgKi8KLSAgICAgICAgaWYgKCB2ID09IDMwICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHNraXAgcmVhbCBudW1iZXIgKi8KLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBBbiB1bnRlcm1pbmF0ZWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGF0IHRoZSAqLwotICAgICAgICAgICAgLyogZW5kIG9mIGEgZGljdGlvbmFyeSBpcyBpbnZhbGlkIGJ1dCBoYXJtbGVzcy4gKi8KLSAgICAgICAgICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIHYgPSBwWzBdID4+IDQ7Ci0gICAgICAgICAgICBpZiAoIHYgPT0gMTUgKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHYgPSBwWzBdICYgMHhGOwotICAgICAgICAgICAgaWYgKCB2ID09IDE1ICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCB2ID09IDI4ICkKLSAgICAgICAgICBwICs9IDI7Ci0gICAgICAgIGVsc2UgaWYgKCB2ID09IDI5ICkKLSAgICAgICAgICBwICs9IDQ7Ci0gICAgICAgIGVsc2UgaWYgKCB2ID4gMjQ2ICkKLSAgICAgICAgICBwICs9IDE7Ci0gICAgICB9Ci0jaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotICAgICAgZWxzZSBpZiAoIHYgPT0gMzEgKQotICAgICAgewotICAgICAgICAvKiBhIFR5cGUgMiBjaGFyc3RyaW5nICovCi0KLSAgICAgICAgQ0ZGX0RlY29kZXIgIGRlY29kZXI7Ci0gICAgICAgIENGRl9Gb250UmVjICBjZmZfcmVjOwotICAgICAgICBGVF9CeXRlKiAgICAgY2hhcnN0cmluZ19iYXNlOwotICAgICAgICBGVF9VTG9uZyAgICAgY2hhcnN0cmluZ19sZW47Ci0KLSAgICAgICAgRlRfRml4ZWQqICBzdGFjazsKLSAgICAgICAgRlRfQnl0ZSogICBxOwotCi0KLSAgICAgICAgY2hhcnN0cmluZ19iYXNlID0gKytwOwotCi0gICAgICAgIC8qIHNlYXJjaCBgZW5kY2hhcicgb3BlcmF0b3IgKi8KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgaWYgKCAqcCA9PSAxNCApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBwKys7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyc3RyaW5nX2xlbiA9IChGVF9VTG9uZykoIHAgLSBjaGFyc3RyaW5nX2Jhc2UgKSArIDE7Ci0KLSAgICAgICAgLyogY29uc3RydWN0IENGRl9EZWNvZGVyIG9iamVjdCAqLwotICAgICAgICBGVF9aRVJPKCAmZGVjb2RlciApOwotICAgICAgICBGVF9aRVJPKCAmY2ZmX3JlYyApOwotCi0gICAgICAgIGNmZl9yZWMudG9wX2ZvbnQuZm9udF9kaWN0Lm51bV9kZXNpZ25zID0gcGFyc2VyLT5udW1fZGVzaWduczsKLSAgICAgICAgY2ZmX3JlYy50b3BfZm9udC5mb250X2RpY3QubnVtX2F4ZXMgICAgPSBwYXJzZXItPm51bV9heGVzOwotICAgICAgICBkZWNvZGVyLmNmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZjZmZfcmVjOwotCi0gICAgICAgIGVycm9yID0gY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoICZkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICk7Ci0KLSAgICAgICAgLyogTm93IGNvcHkgdGhlIHN0YWNrIGRhdGEgaW4gdGhlIHRlbXBvcmFyeSBkZWNvZGVyIG9iamVjdCwgICAgKi8KLSAgICAgICAgLyogY29udmVydGluZyBpdCBiYWNrIHRvIGNoYXJzdHJpbmcgbnVtYmVyIHJlcHJlc2VudGF0aW9ucyAgICAgKi8KLSAgICAgICAgLyogKHRoaXMgaXMgdWdseSwgSSBrbm93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogV2Ugb3ZlcndyaXRlIHRoZSBvcmlnaW5hbCB0b3AgRElDVCBjaGFyc3RyaW5nIHVuZGVyIHRoZSAgICAgKi8KLSAgICAgICAgLyogYXNzdW1wdGlvbiB0aGF0IHRoZSBjaGFyc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHQgKi8KLSAgICAgICAgLyogb2YgYGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzJyBpcyBzaG9ydGVyLCB3aGljaCBzaG91bGQgKi8KLSAgICAgICAgLyogYmUgYWx3YXlzIHRydWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBxICAgICA9IGNoYXJzdHJpbmdfYmFzZSAtIDE7Ci0gICAgICAgIHN0YWNrID0gZGVjb2Rlci5zdGFjazsKLQotICAgICAgICB3aGlsZSAoIHN0YWNrIDwgZGVjb2Rlci50b3AgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUxvbmcgIG51bTsKLSAgICAgICAgICBGVF9Cb29sICAgbmVnOwotCi0KLSAgICAgICAgICBpZiAoIChGVF9VSW50KSggcGFyc2VyLT50b3AgLSBwYXJzZXItPnN0YWNrICkgPj0gcGFyc2VyLT5zdGFja1NpemUgKQotICAgICAgICAgICAgZ290byBTdGFja19PdmVyZmxvdzsKLQotICAgICAgICAgICpwYXJzZXItPnRvcCsrID0gcTsKLQotICAgICAgICAgIGlmICggKnN0YWNrIDwgMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbnVtID0gKEZUX1VMb25nKS0qc3RhY2s7Ci0gICAgICAgICAgICBuZWcgPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgbnVtID0gKEZUX1VMb25nKSpzdGFjazsKLSAgICAgICAgICAgIG5lZyA9IDA7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBudW0gJiAweEZGRkZVICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIG5lZyApCi0gICAgICAgICAgICAgIG51bSA9IChGVF9VTG9uZyktbnVtOwotCi0gICAgICAgICAgICAqcSsrID0gMjU1OwotICAgICAgICAgICAgKnErKyA9ICggbnVtICYgMHhGRjAwMDAwMFUgKSA+PiAyNDsKLSAgICAgICAgICAgICpxKysgPSAoIG51bSAmIDB4MDBGRjAwMDBVICkgPj4gMTY7Ci0gICAgICAgICAgICAqcSsrID0gKCBudW0gJiAweDAwMDBGRjAwVSApID4+ICA4OwotICAgICAgICAgICAgKnErKyA9ICAgbnVtICYgMHgwMDAwMDBGRlU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBudW0gPj49IDE2OwotCi0gICAgICAgICAgICBpZiAoIG5lZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggbnVtIDw9IDEwNyApCi0gICAgICAgICAgICAgICAgKnErKyA9IChGVF9CeXRlKSggMTM5IC0gbnVtICk7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKCBudW0gPD0gMTEzMSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcSsrID0gKEZUX0J5dGUpKCAoICggbnVtIC0gMTA4ICkgPj4gOCApICsgMjUxICk7Ci0gICAgICAgICAgICAgICAgKnErKyA9IChGVF9CeXRlKSggKCBudW0gLSAxMDggKSAmIDB4RkYgKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBudW0gPSAoRlRfVUxvbmcpLW51bTsKLQotICAgICAgICAgICAgICAgICpxKysgPSAyODsKLSAgICAgICAgICAgICAgICAqcSsrID0gKEZUX0J5dGUpKCBudW0gPj4gOCApOwotICAgICAgICAgICAgICAgICpxKysgPSAoRlRfQnl0ZSkoIG51bSAmIDB4RkYgKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIG51bSA8PSAxMDcgKQotICAgICAgICAgICAgICAgICpxKysgPSAoRlRfQnl0ZSkoIG51bSArIDEzOSApOwotICAgICAgICAgICAgICBlbHNlIGlmICggbnVtIDw9IDExMzEgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnErKyA9IChGVF9CeXRlKSggKCAoIG51bSAtIDEwOCApID4+IDggKSArIDI0NyApOwotICAgICAgICAgICAgICAgICpxKysgPSAoRlRfQnl0ZSkoICggbnVtIC0gMTA4ICkgJiAweEZGICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnErKyA9IDI4OwotICAgICAgICAgICAgICAgICpxKysgPSAoRlRfQnl0ZSkoIG51bSA+PiA4ICk7Ci0gICAgICAgICAgICAgICAgKnErKyA9IChGVF9CeXRlKSggbnVtICYgMHhGRiApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3RhY2srKzsKLSAgICAgICAgfQotICAgICAgfQotI2VuZGlmIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogVGhpcyBpcyBub3QgYSBudW1iZXIsIGhlbmNlIGl0J3MgYW4gb3BlcmF0b3IuICBDb21wdXRlIGl0cyBjb2RlICovCi0gICAgICAgIC8qIGFuZCBsb29rIGZvciBpdCBpbiBvdXIgY3VycmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgY29kZTsKLSAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgICAgICBudW1fYXJnczsKLSAgICAgICAgY29uc3QgQ0ZGX0ZpZWxkX0hhbmRsZXIqICBmaWVsZDsKLQotCi0gICAgICAgIGlmICggKEZUX1VJbnQpKCBwYXJzZXItPnRvcCAtIHBhcnNlci0+c3RhY2sgKSA+PSBwYXJzZXItPnN0YWNrU2l6ZSApCi0gICAgICAgICAgZ290byBTdGFja19PdmVyZmxvdzsKLQotICAgICAgICBudW1fYXJncyAgICAgPSAoRlRfVUludCkoIHBhcnNlci0+dG9wIC0gcGFyc2VyLT5zdGFjayApOwotICAgICAgICAqcGFyc2VyLT50b3AgPSBwOwotICAgICAgICBjb2RlICAgICAgICAgPSB2OwotCi0gICAgICAgIGlmICggdiA9PSAxMiApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB0d28gYnl0ZSBvcGVyYXRvciAqLwotICAgICAgICAgIHArKzsKLSAgICAgICAgICBpZiAoIHAgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0KLSAgICAgICAgICBjb2RlID0gMHgxMDAgfCBwWzBdOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgPSBjb2RlIHwgcGFyc2VyLT5vYmplY3RfY29kZTsKLQotICAgICAgICBmb3IgKCBmaWVsZCA9IENGRl9GSUVMRF9IQU5ETEVSU19HRVQ7IGZpZWxkLT5raW5kOyBmaWVsZCsrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggZmllbGQtPmNvZGUgPT0gKEZUX0ludCljb2RlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiB3ZSBmb3VuZCBvdXIgZmllbGQncyBoYW5kbGVyOyByZWFkIGl0ICovCi0gICAgICAgICAgICBGVF9Mb25nICAgdmFsOwotICAgICAgICAgICAgRlRfQnl0ZSogIHEgPSAoRlRfQnl0ZSopcGFyc2VyLT5vYmplY3QgKyBmaWVsZC0+b2Zmc2V0OwotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAgJXMiLCBmaWVsZC0+aWQgKSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGVub3VnaCBhcmd1bWVudHMgLS0gZXhjZXB0IGZvciAqLwotICAgICAgICAgICAgLyogZGVsdGEgZW5jb2RlZCBhcnJheXMsIHdoaWNoIGNhbiBiZSBlbXB0eSAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBmaWVsZC0+a2luZCAhPSBjZmZfa2luZF9kZWx0YSAmJiBudW1fYXJncyA8IDEgKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgc3dpdGNoICggZmllbGQtPmtpbmQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9ib29sOgotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9zdHJpbmc6Ci0gICAgICAgICAgICBjYXNlIGNmZl9raW5kX251bToKLSAgICAgICAgICAgICAgdmFsID0gY2ZmX3BhcnNlX251bSggcGFyc2VyLCBwYXJzZXItPnN0YWNrICk7Ci0gICAgICAgICAgICAgIGdvdG8gU3RvcmVfTnVtYmVyOwotCi0gICAgICAgICAgICBjYXNlIGNmZl9raW5kX2ZpeGVkOgotICAgICAgICAgICAgICB2YWwgPSBjZmZfcGFyc2VfZml4ZWQoIHBhcnNlciwgcGFyc2VyLT5zdGFjayApOwotICAgICAgICAgICAgICBnb3RvIFN0b3JlX051bWJlcjsKLQotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9maXhlZF90aG91c2FuZDoKLSAgICAgICAgICAgICAgdmFsID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggcGFyc2VyLCBwYXJzZXItPnN0YWNrLCAzICk7Ci0KLSAgICAgICAgICAgIFN0b3JlX051bWJlcjoKLSAgICAgICAgICAgICAgc3dpdGNoICggZmllbGQtPnNpemUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgKDggLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgICAgICAgKihGVF9CeXRlKilxID0gKEZUX0J5dGUpdmFsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgKDE2IC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICAgICAgICooRlRfU2hvcnQqKXEgPSAoRlRfU2hvcnQpdmFsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgKDMyIC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICAgICAgICooRlRfSW50MzIqKXEgPSAoRlRfSW50KXZhbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBkZWZhdWx0OiAgLyogZm9yIDY0LWJpdCBzeXN0ZW1zICovCi0gICAgICAgICAgICAgICAgKihGVF9Mb25nKilxID0gdmFsOwotICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgICAgICBzd2l0Y2ggKCBmaWVsZC0+a2luZCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9ib29sOgotICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgJXNcbiIsIHZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIgKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9zdHJpbmc6Ci0gICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAlbGQgKFNJRClcbiIsIHZhbCApKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIGNmZl9raW5kX251bToKLSAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiICVsZFxuIiwgdmFsICkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgY2ZmX2tpbmRfZml4ZWQ6Ci0gICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAlZlxuIiwgKGRvdWJsZSl2YWwgLyA2NTUzNiApKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIGNmZl9raW5kX2ZpeGVkX3Rob3VzYW5kOgotICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgJWZcbiIsIChkb3VibGUpdmFsIC8gNjU1MzYgLyAxMDAwICkpOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgOyAvKiBuZXZlciByZWFjaGVkICovCi0gICAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIGNmZl9raW5kX2RlbHRhOgotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlRfQnl0ZSogICBxY291bnQgPSAoRlRfQnl0ZSopcGFyc2VyLT5vYmplY3QgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y291bnRfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBkYXRhID0gcGFyc2VyLT5zdGFjazsKLQotCi0gICAgICAgICAgICAgICAgaWYgKCBudW1fYXJncyA+IGZpZWxkLT5hcnJheV9tYXggKQotICAgICAgICAgICAgICAgICAgbnVtX2FyZ3MgPSBmaWVsZC0+YXJyYXlfbWF4OwotCi0gICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBbIiApKTsKLQotICAgICAgICAgICAgICAgIC8qIHN0b3JlIGNvdW50ICovCi0gICAgICAgICAgICAgICAgKnFjb3VudCA9IChGVF9CeXRlKW51bV9hcmdzOwotCi0gICAgICAgICAgICAgICAgdmFsID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIG51bV9hcmdzID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdmFsID0gQUREX0xPTkcoIHZhbCwgY2ZmX3BhcnNlX251bSggcGFyc2VyLCBkYXRhKysgKSApOwotICAgICAgICAgICAgICAgICAgc3dpdGNoICggZmllbGQtPnNpemUgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2FzZSAoOCAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAgICAgICAgICAgKihGVF9CeXRlKilxID0gKEZUX0J5dGUpdmFsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSAoMTYgLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgICAgICAgICAgICooRlRfU2hvcnQqKXEgPSAoRlRfU2hvcnQpdmFsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSAoMzIgLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgICAgICAgICAgICooRlRfSW50MzIqKXEgPSAoRlRfSW50KXZhbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAvKiBmb3IgNjQtYml0IHN5c3RlbXMgKi8KLSAgICAgICAgICAgICAgICAgICAgKihGVF9Mb25nKilxID0gdmFsOwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiICVsZCIsIHZhbCApKTsKLQotICAgICAgICAgICAgICAgICAgcSArPSBmaWVsZC0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgIG51bV9hcmdzLS07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIl1cbiIgKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6ICAvKiBjYWxsYmFjayBvciBibGVuZCAqLwotICAgICAgICAgICAgICBlcnJvciA9IGZpZWxkLT5yZWFkZXIoIHBhcnNlciApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIEZvdW5kOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRoaXMgaXMgYW4gdW5rbm93biBvcGVyYXRvciwgb3IgaXQgaXMgdW5zdXBwb3J0ZWQ7ICovCi0gICAgICAgIC8qIHdlIHdpbGwgaWdub3JlIGl0IGZvciBub3cuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIEZvdW5kOgotICAgICAgICAvKiBjbGVhciBzdGFjayAqLwotICAgICAgICAvKiBUT0RPOiBjb3VsZCBjbGVhciBibGVuZCBzdGFjayBoZXJlLCAgICAgICAqLwotICAgICAgICAvKiAgICAgICBidXQgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gc3ViRm9udCAqLwotICAgICAgICBpZiAoIGZpZWxkLT5raW5kICE9IGNmZl9raW5kX2JsZW5kICkKLSAgICAgICAgICBwYXJzZXItPnRvcCA9IHBhcnNlci0+c3RhY2s7Ci0gICAgICB9Ci0gICAgICBwKys7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIFN0YWNrX092ZXJmbG93OgotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBnb3RvIEV4aXQ7Ci0KLSAgU3RhY2tfVW5kZXJmbG93OgotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBnb3RvIEV4aXQ7Ci0KLSAgU3ludGF4X0Vycm9yOgotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmcGFyc2UuaCBiL3NyYy9jZmYvY2ZmcGFyc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkMWJiYS4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZnBhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmcGFyc2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENGRiB0b2tlbiBzdHJlYW0gcGFyc2VyIChzcGVjaWZpY2F0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIENGRlBBUlNFX0hfCi0jZGVmaW5lIENGRlBBUlNFX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiY2ZmdHlwZXMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogQ0ZGIHVzZXMgY29uc3RhbnQgcGFyc2VyIHN0YWNrIHNpemU7ICovCi0gIC8qIENGRjIgY2FuIGluY3JlYXNlIGZyb20gZGVmYXVsdCAxOTMgICAqLwotI2RlZmluZSBDRkZfTUFYX1NUQUNLX0RFUFRIICA5NgotCi0gIC8qCi0gICAqICBUaGVyZSBhcmUgcGxhbnMgdG8gcmVtb3ZlIHRoZSBgbWF4c3RhY2snIG9wZXJhdG9yIGluIGEgZm9ydGhjb21pbmcKLSAgICogIHJldmlzaW9uIG9mIHRoZSBDRkYyIHNwZWNpZmljYXRpb24sIGluY3JlYXNpbmcgdGhlICh0aGVuIHN0YXRpYykgc3RhY2sKLSAgICogIHNpemUgdG8gNTEzLiAgQnkgbWFraW5nIHRoZSBkZWZhdWx0IHN0YWNrIHNpemUgZXF1YWwgdG8gdGhlIG1heGltdW0KLSAgICogIHN0YWNrIHNpemUsIHRoZSBvcGVyYXRvciBpcyBlc3NlbnRpYWxseSBkaXNhYmxlZCwgd2hpY2ggaGFzIHRoZQotICAgKiAgZGVzaXJlZCBlZmZlY3QgaW4gRnJlZVR5cGUuCi0gICAqLwotI2RlZmluZSBDRkYyX01BWF9TVEFDSyAgICAgIDUxMwotI2RlZmluZSBDRkYyX0RFRkFVTFRfU1RBQ0sgIDUxMwotCi0jZGVmaW5lIENGRl9DT0RFX1RPUERJQ1QgICAgMHgxMDAwCi0jZGVmaW5lIENGRl9DT0RFX1BSSVZBVEUgICAgMHgyMDAwCi0jZGVmaW5lIENGRjJfQ09ERV9UT1BESUNUICAgMHgzMDAwCi0jZGVmaW5lIENGRjJfQ09ERV9GT05URElDVCAgMHg0MDAwCi0jZGVmaW5lIENGRjJfQ09ERV9QUklWQVRFICAgMHg1MDAwCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX1BhcnNlclJlY18KLSAgewotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAgRlRfQnl0ZSogICAgc3RhcnQ7Ci0gICAgRlRfQnl0ZSogICAgbGltaXQ7Ci0gICAgRlRfQnl0ZSogICAgY3Vyc29yOwotCi0gICAgRlRfQnl0ZSoqICAgc3RhY2s7Ci0gICAgRlRfQnl0ZSoqICAgdG9wOwotICAgIEZUX1VJbnQgICAgIHN0YWNrU2l6ZTsgIC8qIGFsbG9jYXRlZCBzaXplICovCi0KLSAgICBGVF9VSW50ICAgICBvYmplY3RfY29kZTsKLSAgICB2b2lkKiAgICAgICBvYmplY3Q7Ci0KLSAgICBGVF9VU2hvcnQgICBudW1fZGVzaWduczsgLyogYSBjb3B5IG9mIGBDRkZfRm9udFJlY0RpY3QtPm51bV9kZXNpZ25zJyAqLwotICAgIEZUX1VTaG9ydCAgIG51bV9heGVzOyAgICAvKiBhIGNvcHkgb2YgYENGRl9Gb250UmVjRGljdC0+bnVtX2F4ZXMnICAgICovCi0KLSAgfSBDRkZfUGFyc2VyUmVjLCAqQ0ZGX1BhcnNlcjsKLQotCi0gIEZUX0xPQ0FMKCBGVF9Mb25nICkKLSAgY2ZmX3BhcnNlX251bSggQ0ZGX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiogICBkICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3BhcnNlcl9pbml0KCBDRkZfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgY29kZSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBzdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgbnVtX2Rlc2lnbnMsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgbnVtX2F4ZXMgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9wYXJzZXJfZG9uZSggQ0ZGX1BhcnNlciAgcGFyc2VyICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3BhcnNlcl9ydW4oIENGRl9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKTsKLQotCi0gIGVudW0KLSAgewotICAgIGNmZl9raW5kX25vbmUgPSAwLAotICAgIGNmZl9raW5kX251bSwKLSAgICBjZmZfa2luZF9maXhlZCwKLSAgICBjZmZfa2luZF9maXhlZF90aG91c2FuZCwKLSAgICBjZmZfa2luZF9zdHJpbmcsCi0gICAgY2ZmX2tpbmRfYm9vbCwKLSAgICBjZmZfa2luZF9kZWx0YSwKLSAgICBjZmZfa2luZF9jYWxsYmFjaywKLSAgICBjZmZfa2luZF9ibGVuZCwKLQotICAgIGNmZl9raW5kX21heCAgLyogZG8gbm90IHJlbW92ZSAqLwotICB9OwotCi0KLSAgLyogbm93IGdlbmVyYXRlIGhhbmRsZXJzIGZvciB0aGUgbW9zdCBzaW1wbGUgZmllbGRzICovCi0gIHR5cGVkZWYgRlRfRXJyb3IgICgqQ0ZGX0ZpZWxkX1JlYWRlcikoIENGRl9QYXJzZXIgIHBhcnNlciApOwotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRmllbGRfSGFuZGxlcl8KLSAgewotICAgIGludCAgICAgICAgICAgICAgIGtpbmQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgY29kZTsKLSAgICBGVF9VSW50ICAgICAgICAgICBvZmZzZXQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgICAgc2l6ZTsKLSAgICBDRkZfRmllbGRfUmVhZGVyICByZWFkZXI7Ci0gICAgRlRfVUludCAgICAgICAgICAgYXJyYXlfbWF4OwotICAgIEZUX1VJbnQgICAgICAgICAgIGNvdW50X29mZnNldDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgY29uc3QgY2hhciogICAgICAgaWQ7Ci0jZW5kaWYKLQotICB9IENGRl9GaWVsZF9IYW5kbGVyOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogQ0ZGUEFSU0VfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmcGljLmMgYi9zcmMvY2ZmL2NmZnBpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTliYTEyLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmcGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmcGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBjZmYgbW9kdWxlLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgImNmZmNtYXAuaCIKLSNpbmNsdWRlICJjZmZwaWMuaCIKLSNpbmNsdWRlICJjZmZlcnJzLmgiCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSBjZmZkcml2ci5jICovCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc19jZmZfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApOwotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfY2ZmX3NlcnZpY2VzKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9wc19pbmZvKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9Qc0luZm9SZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfZ2x5cGhfZGljdCggRlRfTGlicmFyeSAgICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX3BzX25hbWUoIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9Qc0ZvbnROYW1lUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX2dldF9jbWFwX2luZm8oIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9UVENNYXBzUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX2NpZF9pbmZvKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfQ0lEUmVjKiAgY2xhenogKTsKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIGNmZnBhcnNlLmMgKi8KLSAgRlRfRXJyb3IKLSAgRlRfQ3JlYXRlX0NsYXNzX2NmZl9maWVsZF9oYW5kbGVycyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZGX0ZpZWxkX0hhbmRsZXIqKiAgb3V0cHV0X2NsYXNzICk7Ci0gIHZvaWQKLSAgRlRfRGVzdHJveV9DbGFzc19jZmZfZmllbGRfaGFuZGxlcnMoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGRl9GaWVsZF9IYW5kbGVyKiAgY2xhenogKTsKLQotCi0gIHZvaWQKLSAgY2ZmX2RyaXZlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPmNmZiApCi0gICAgewotICAgICAgQ2ZmTW9kdWxlUElDKiAgY29udGFpbmVyID0gKENmZk1vZHVsZVBJQyopcGljX2NvbnRhaW5lci0+Y2ZmOwotCi0KLSAgICAgIGlmICggY29udGFpbmVyLT5jZmZfc2VydmljZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX2NmZl9zZXJ2aWNlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VzICk7Ci0gICAgICBjb250YWluZXItPmNmZl9zZXJ2aWNlcyA9IE5VTEw7Ci0gICAgICBpZiAoIGNvbnRhaW5lci0+Y2ZmX2ZpZWxkX2hhbmRsZXJzICkKLSAgICAgICAgRlRfRGVzdHJveV9DbGFzc19jZmZfZmllbGRfaGFuZGxlcnMoCi0gICAgICAgICAgbGlicmFyeSwgY29udGFpbmVyLT5jZmZfZmllbGRfaGFuZGxlcnMgKTsKLSAgICAgIGNvbnRhaW5lci0+Y2ZmX2ZpZWxkX2hhbmRsZXJzID0gTlVMTDsKLSAgICAgIEZUX0ZSRUUoIGNvbnRhaW5lciApOwotICAgICAgcGljX2NvbnRhaW5lci0+Y2ZmID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGNmZl9kcml2ZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBDZmZNb2R1bGVQSUMqICAgICAgY29udGFpbmVyICAgICA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIC8qIGFsbG9jYXRlIHBvaW50ZXIsIGNsZWFyIGFuZCBzZXQgZ2xvYmFsIGNvbnRhaW5lciBwb2ludGVyICovCi0gICAgaWYgKCBGVF9BTExPQyAoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+Y2ZmID0gY29udGFpbmVyOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgZXJyb3IgPSBGVF9DcmVhdGVfQ2xhc3NfY2ZmX3NlcnZpY2VzKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IEZUX0NyZWF0ZV9DbGFzc19jZmZfZmllbGRfaGFuZGxlcnMoCi0gICAgICAgICAgICAgIGxpYnJhcnksICZjb250YWluZXItPmNmZl9maWVsZF9oYW5kbGVycyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9wc19pbmZvKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VfcHNfaW5mbyApOwotICAgIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfZ2x5cGhfZGljdCgKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPmNmZl9zZXJ2aWNlX2dseXBoX2RpY3QgKTsKLSAgICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX3BzX25hbWUoCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5jZmZfc2VydmljZV9wc19uYW1lICk7Ci0gICAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9nZXRfY21hcF9pbmZvKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyApOwotICAgIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfY2lkX2luZm8oCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5jZmZfc2VydmljZV9jaWRfaW5mbyApOwotICAgIEZUX0luaXRfQ2xhc3NfY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+Y2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjICk7Ci0gICAgRlRfSW5pdF9DbGFzc19jZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYygKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPmNmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGNmZl9kcml2ZXJfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZnBpYy5oIGIvc3JjL2NmZi9jZmZwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiMzljZC4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZnBpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZnBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgY2ZmIG1vZHVsZS4gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDRkZQSUNfSF8KLSNkZWZpbmUgQ0ZGUElDX0hfCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfUFNfSU5GT19HRVQgICAgICAgICAgY2ZmX3NlcnZpY2VfcHNfaW5mbwotI2RlZmluZSBDRkZfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCAgICAgICBjZmZfc2VydmljZV9nbHlwaF9kaWN0Ci0jZGVmaW5lIENGRl9TRVJWSUNFX1BTX05BTUVfR0VUICAgICAgICAgIGNmZl9zZXJ2aWNlX3BzX25hbWUKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfR0VUX0NNQVBfSU5GT19HRVQgICAgY2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbwotI2RlZmluZSBDRkZfU0VSVklDRV9DSURfSU5GT19HRVQgICAgICAgICBjZmZfc2VydmljZV9jaWRfaW5mbwotI2RlZmluZSBDRkZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCAgICAgICBjZmZfc2VydmljZV9wcm9wZXJ0aWVzCi0jZGVmaW5lIENGRl9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgIGNmZl9zZXJ2aWNlcwotI2RlZmluZSBDRkZfU0VSVklDRV9NVUxUSV9NQVNURVJTX0dFVCAgICBjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzCi0jZGVmaW5lIENGRl9TRVJWSUNFX01FVFJJQ1NfVkFSX0dFVCAgICAgIGNmZl9zZXJ2aWNlX21ldHJpY3NfdmFyaWF0aW9ucwotI2RlZmluZSBDRkZfQ01BUF9FTkNPRElOR19DTEFTU19SRUNfR0VUICBjZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMKLSNkZWZpbmUgQ0ZGX0NNQVBfVU5JQ09ERV9DTEFTU19SRUNfR0VUICAgY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0hBTkRMRVJTX0dFVCAgICAgICAgICAgY2ZmX2ZpZWxkX2hhbmRsZXJzCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICi0jaW5jbHVkZSAiY2ZmcGFyc2UuaCIKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0NJRF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgQ2ZmTW9kdWxlUElDXwotICB7Ci0gICAgRlRfU2VydmljZURlc2NSZWMqICAgICAgICAgICAgICAgY2ZmX3NlcnZpY2VzOwotICAgIENGRl9GaWVsZF9IYW5kbGVyKiAgICAgICAgICAgICAgIGNmZl9maWVsZF9oYW5kbGVyczsKLSAgICBGVF9TZXJ2aWNlX1BzSW5mb1JlYyAgICAgICAgICAgICBjZmZfc2VydmljZV9wc19pbmZvOwotICAgIEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjICAgICAgICAgIGNmZl9zZXJ2aWNlX2dseXBoX2RpY3Q7Ci0gICAgRlRfU2VydmljZV9Qc0ZvbnROYW1lUmVjICAgICAgICAgY2ZmX3NlcnZpY2VfcHNfbmFtZTsKLSAgICBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMgICAgICAgICAgICBjZmZfc2VydmljZV9nZXRfY21hcF9pbmZvOwotICAgIEZUX1NlcnZpY2VfQ0lEUmVjICAgICAgICAgICAgICAgIGNmZl9zZXJ2aWNlX2NpZF9pbmZvOwotICAgIEZUX1NlcnZpY2VfUHJvcGVydGllc1JlYyAgICAgICAgIGNmZl9zZXJ2aWNlX3Byb3BlcnRpZXM7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnNSZWMgICAgICAgY2ZmX3NlcnZpY2VfbXVsdGlfbWFzdGVyczsKLSAgICBGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zUmVjICBjZmZfc2VydmljZV9tZXRyaWNzX3ZhcmlhdGlvbnM7Ci0gICAgRlRfQ01hcF9DbGFzc1JlYyAgICAgICAgICAgICAgICAgY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjOwotICAgIEZUX0NNYXBfQ2xhc3NSZWMgICAgICAgICAgICAgICAgIGNmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjOwotCi0gIH0gQ2ZmTW9kdWxlUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoQ2ZmTW9kdWxlUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLmNmZiApICkKLQotI2RlZmluZSBDRkZfU0VSVklDRV9QU19JTkZPX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfc2VydmljZV9wc19pbmZvICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfZ2x5cGhfZGljdCApCi0jZGVmaW5lIENGRl9TRVJWSUNFX1BTX05BTUVfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9zZXJ2aWNlX3BzX25hbWUgKQotI2RlZmluZSBDRkZfU0VSVklDRV9HRVRfQ01BUF9JTkZPX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfc2VydmljZV9nZXRfY21hcF9pbmZvICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfQ0lEX0lORk9fR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9zZXJ2aWNlX2NpZF9pbmZvICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfcHJvcGVydGllcyApCi0jZGVmaW5lIENGRl9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VzICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfTVVMVElfTUFTVEVSU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfbXVsdGlfbWFzdGVycyApCi0jZGVmaW5lIENGRl9TRVJWSUNFX01FVFJJQ1NfVkFSX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfbWV0cmljc192YXJpYXRpb25zICkKLSNkZWZpbmUgQ0ZGX0NNQVBfRU5DT0RJTkdfQ0xBU1NfUkVDX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMgKQotI2RlZmluZSBDRkZfQ01BUF9VTklDT0RFX0NMQVNTX1JFQ19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMgKQotI2RlZmluZSBDRkZfRklFTERfSEFORExFUlNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9maWVsZF9oYW5kbGVycyApCi0KLSAgLyogc2VlIGNmZnBpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICBjZmZfZHJpdmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgY2ZmX2RyaXZlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotI2VuZGlmIC8qIENGRlBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZ0b2tlbi5oIGIvc3JjL2NmZi9jZmZ0b2tlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjIyZTkzLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmdG9rZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZ0b2tlbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIHRva2VuIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgQ0ZGX0ZvbnRSZWNEaWN0UmVjCi0KLSN1bmRlZiAgQ0ZGQ09ERQotI2RlZmluZSBDRkZDT0RFICAgICAgIENGRl9DT0RFX1RPUERJQ1QKLQotICBDRkZfRklFTERfU1RSSU5HICAoIDAsICAgICB2ZXJzaW9uLCAgICAgICAgICAgICAiVmVyc2lvbiIgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDEsICAgICBub3RpY2UsICAgICAgICAgICAgICAiTm90aWNlIiApCi0gIENGRl9GSUVMRF9TVFJJTkcgICggMHgxMDAsIGNvcHlyaWdodCwgICAgICAgICAgICJDb3B5cmlnaHQiICkKLSAgQ0ZGX0ZJRUxEX1NUUklORyAgKCAyLCAgICAgZnVsbF9uYW1lLCAgICAgICAgICAgIkZ1bGxOYW1lIiApCi0gIENGRl9GSUVMRF9TVFJJTkcgICggMywgICAgIGZhbWlseV9uYW1lLCAgICAgICAgICJGYW1pbHlOYW1lIiApCi0gIENGRl9GSUVMRF9TVFJJTkcgICggNCwgICAgIHdlaWdodCwgICAgICAgICAgICAgICJXZWlnaHQiICkKLSAgQ0ZGX0ZJRUxEX0JPT0wgICAgKCAweDEwMSwgaXNfZml4ZWRfcGl0Y2gsICAgICAgImlzRml4ZWRQaXRjaCIgKQotICBDRkZfRklFTERfRklYRUQgICAoIDB4MTAyLCBpdGFsaWNfYW5nbGUsICAgICAgICAiSXRhbGljQW5nbGUiICkKLSAgQ0ZGX0ZJRUxEX0ZJWEVEICAgKCAweDEwMywgdW5kZXJsaW5lX3Bvc2l0aW9uLCAgIlVuZGVybGluZVBvc2l0aW9uIiApCi0gIENGRl9GSUVMRF9GSVhFRCAgICggMHgxMDQsIHVuZGVybGluZV90aGlja25lc3MsICJVbmRlcmxpbmVUaGlja25lc3MiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEwNSwgcGFpbnRfdHlwZSwgICAgICAgICAgIlBhaW50VHlwZSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTA2LCBjaGFyc3RyaW5nX3R5cGUsICAgICAiQ2hhcnN0cmluZ1R5cGUiICkKLSAgQ0ZGX0ZJRUxEX0NBTExCQUNLKCAweDEwNywgZm9udF9tYXRyaXgsICAgICAgICAgIkZvbnRNYXRyaXgiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAxMywgICAgdW5pcXVlX2lkLCAgICAgICAgICAgIlVuaXF1ZUlEIiApCi0gIENGRl9GSUVMRF9DQUxMQkFDSyggNSwgICAgIGZvbnRfYmJveCwgICAgICAgICAgICJGb250QkJveCIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTA4LCBzdHJva2Vfd2lkdGgsICAgICAgICAiU3Ryb2tlV2lkdGgiICkKLSNpZiAwCi0gIENGRl9GSUVMRF9ERUxUQSAgICggMTQsICAgIHh1aWQsIDE2LCAgICAgICAgICAgICJYVUlEIiApCi0jZW5kaWYKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAxNSwgICAgY2hhcnNldF9vZmZzZXQsICAgICAgImNoYXJzZXQiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAxNiwgICAgZW5jb2Rpbmdfb2Zmc2V0LCAgICAgIkVuY29kaW5nIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMTcsICAgIGNoYXJzdHJpbmdzX29mZnNldCwgICJDaGFyU3RyaW5ncyIgKQotICBDRkZfRklFTERfQ0FMTEJBQ0soIDE4LCAgICBwcml2YXRlX2RpY3QsICAgICAgICAiUHJpdmF0ZSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTE0LCBzeW50aGV0aWNfYmFzZSwgICAgICAiU3ludGhldGljQmFzZSIgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDB4MTE1LCBlbWJlZGRlZF9wb3N0c2NyaXB0LCAiUG9zdFNjcmlwdCIgKQotCi0jaWYgMAotICBDRkZfRklFTERfU1RSSU5HICAoIDB4MTE2LCBiYXNlX2ZvbnRfbmFtZSwgICAgICAiQmFzZUZvbnROYW1lIiApCi0gIENGRl9GSUVMRF9ERUxUQSAgICggMHgxMTcsIGJhc2VfZm9udF9ibGVuZCwgMTYsICJCYXNlRm9udEJsZW5kIiApCi0jZW5kaWYKLQotICAvKiB0aGUgbmV4dCB0d28gb3BlcmF0b3JzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBUeXBlMiBzcGVjaWZpY2F0aW9uICovCi0gIC8qIGluIHZlcnNpb24gMTYtTWFyY2gtMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQ0ZGX0ZJRUxEX0NBTExCQUNLKCAweDExOCwgbXVsdGlwbGVfbWFzdGVyLCAgICAgIk11bHRpcGxlTWFzdGVyIiApCi0jaWYgMAotICBDRkZfRklFTERfQ0FMTEJBQ0soIDB4MTFBLCBibGVuZF9heGlzX3R5cGVzLCAgICAiQmxlbmRBeGlzVHlwZXMiICkKLSNlbmRpZgotCi0gIENGRl9GSUVMRF9DQUxMQkFDSyggMHgxMUUsIGNpZF9yb3MsICAgICAgICAgICAgICAiUk9TIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMUYsIGNpZF9mb250X3ZlcnNpb24sICAgICAiQ0lERm9udFZlcnNpb24iICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEyMCwgY2lkX2ZvbnRfcmV2aXNpb24sICAgICJDSURGb250UmV2aXNpb24iICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEyMSwgY2lkX2ZvbnRfdHlwZSwgICAgICAgICJDSURGb250VHlwZSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTIyLCBjaWRfY291bnQsICAgICAgICAgICAgIkNJRENvdW50IiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjMsIGNpZF91aWRfYmFzZSwgICAgICAgICAiVUlEQmFzZSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTI0LCBjaWRfZmRfYXJyYXlfb2Zmc2V0LCAgIkZEQXJyYXkiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEyNSwgY2lkX2ZkX3NlbGVjdF9vZmZzZXQsICJGRFNlbGVjdCIgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDB4MTI2LCBjaWRfZm9udF9uYW1lLCAgICAgICAgIkZvbnROYW1lIiApCi0KLSNpZiAwCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjcsIGNoYW1lbGVvbiwgIkNoYW1lbGVvbiIgKQotI2VuZGlmCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBDRkZfUHJpdmF0ZVJlYwotI3VuZGVmICBDRkZDT0RFCi0jZGVmaW5lIENGRkNPREUgICAgICAgQ0ZGX0NPREVfUFJJVkFURQotCi0gIENGRl9GSUVMRF9ERUxUQSAgICAgKCA2LCAgICAgYmx1ZV92YWx1ZXMsIDE0LCAgICAgICAgIkJsdWVWYWx1ZXMiICkKLSAgQ0ZGX0ZJRUxEX0RFTFRBICAgICAoIDcsICAgICBvdGhlcl9ibHVlcywgMTAsICAgICAgICAiT3RoZXJCbHVlcyIgKQotICBDRkZfRklFTERfREVMVEEgICAgICggOCwgICAgIGZhbWlseV9ibHVlcywgMTQsICAgICAgICJGYW1pbHlCbHVlcyIgKQotICBDRkZfRklFTERfREVMVEEgICAgICggOSwgICAgIGZhbWlseV9vdGhlcl9ibHVlcywgMTAsICJGYW1pbHlPdGhlckJsdWVzIiApCi0gIENGRl9GSUVMRF9GSVhFRF8xMDAwKCAweDEwOSwgYmx1ZV9zY2FsZSwgICAgICAgICAgICAgIkJsdWVTY2FsZSIgKQotICBDRkZfRklFTERfTlVNICAgICAgICggMHgxMEEsIGJsdWVfc2hpZnQsICAgICAgICAgICAgICJCbHVlU2hpZnQiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDB4MTBCLCBibHVlX2Z1enosICAgICAgICAgICAgICAiQmx1ZUZ1enoiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDEwLCAgICBzdGFuZGFyZF93aWR0aCwgICAgICAgICAiU3RkSFciICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDExLCAgICBzdGFuZGFyZF9oZWlnaHQsICAgICAgICAiU3RkVlciICkKLSAgQ0ZGX0ZJRUxEX0RFTFRBICAgICAoIDB4MTBDLCBzbmFwX3dpZHRocywgMTMsICAgICAgICAiU3RlbVNuYXBIIiApCi0gIENGRl9GSUVMRF9ERUxUQSAgICAgKCAweDEwRCwgc25hcF9oZWlnaHRzLCAxMywgICAgICAgIlN0ZW1TbmFwViIgKQotICBDRkZfRklFTERfQk9PTCAgICAgICggMHgxMEUsIGZvcmNlX2JvbGQsICAgICAgICAgICAgICJGb3JjZUJvbGQiICkKLSAgQ0ZGX0ZJRUxEX0ZJWEVEICAgICAoIDB4MTBGLCBmb3JjZV9ib2xkX3RocmVzaG9sZCwgICAiRm9yY2VCb2xkVGhyZXNob2xkIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAweDExMCwgbGVuSVYsICAgICAgICAgICAgICAgICAgImxlbklWIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAweDExMSwgbGFuZ3VhZ2VfZ3JvdXAsICAgICAgICAgIkxhbmd1YWdlR3JvdXAiICkKLSAgQ0ZGX0ZJRUxEX0ZJWEVEICAgICAoIDB4MTEyLCBleHBhbnNpb25fZmFjdG9yLCAgICAgICAiRXhwYW5zaW9uRmFjdG9yIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAweDExMywgaW5pdGlhbF9yYW5kb21fc2VlZCwgICAgImluaXRpYWxSYW5kb21TZWVkIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAxOSwgICAgbG9jYWxfc3VicnNfb2Zmc2V0LCAgICAgIlN1YnJzIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAyMCwgICAgZGVmYXVsdF93aWR0aCwgICAgICAgICAgImRlZmF1bHRXaWR0aFgiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDIxLCAgICBub21pbmFsX3dpZHRoLCAgICAgICAgICAibm9taW5hbFdpZHRoWCIgKQotCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgQ0ZGX0ZvbnRSZWNEaWN0UmVjCi0jdW5kZWYgIENGRkNPREUKLSNkZWZpbmUgQ0ZGQ09ERSAgICAgICBDRkYyX0NPREVfVE9QRElDVAotCi0gIENGRl9GSUVMRF9DQUxMQkFDSyggMHgxMDcsIGZvbnRfbWF0cml4LCAgICAgICAgICAiRm9udE1hdHJpeCIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDE3LCAgICBjaGFyc3RyaW5nc19vZmZzZXQsICAgIkNoYXJTdHJpbmdzIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjQsIGNpZF9mZF9hcnJheV9vZmZzZXQsICAiRkRBcnJheSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTI1LCBjaWRfZmRfc2VsZWN0X29mZnNldCwgIkZEU2VsZWN0IiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMjQsICAgIHZzdG9yZV9vZmZzZXQsICAgICAgICAidnN0b3JlIiApCi0gIENGRl9GSUVMRF9DQUxMQkFDSyggMjUsICAgIG1heHN0YWNrLCAgICAgICAgICAgICAibWF4c3RhY2siICkKLQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIENGRl9Gb250UmVjRGljdFJlYwotI3VuZGVmICBDRkZDT0RFCi0jZGVmaW5lIENGRkNPREUgICAgICAgQ0ZGMl9DT0RFX0ZPTlRESUNUCi0KLSAgQ0ZGX0ZJRUxEX0NBTExCQUNLKCAxOCwgICAgcHJpdmF0ZV9kaWN0LCAiUHJpdmF0ZSIgKQotICBDRkZfRklFTERfQ0FMTEJBQ0soIDB4MTA3LCBmb250X21hdHJpeCwgICJGb250TWF0cml4IiApCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBDRkZfUHJpdmF0ZVJlYwotI3VuZGVmICBDRkZDT0RFCi0jZGVmaW5lIENGRkNPREUgICAgICAgQ0ZGMl9DT0RFX1BSSVZBVEUKLQotICBDRkZfRklFTERfREVMVEEgICAgICggNiwgICAgIGJsdWVfdmFsdWVzLCAxNCwgICAgICAgICJCbHVlVmFsdWVzIiApCi0gIENGRl9GSUVMRF9ERUxUQSAgICAgKCA3LCAgICAgb3RoZXJfYmx1ZXMsIDEwLCAgICAgICAgIk90aGVyQmx1ZXMiICkKLSAgQ0ZGX0ZJRUxEX0RFTFRBICAgICAoIDgsICAgICBmYW1pbHlfYmx1ZXMsIDE0LCAgICAgICAiRmFtaWx5Qmx1ZXMiICkKLSAgQ0ZGX0ZJRUxEX0RFTFRBICAgICAoIDksICAgICBmYW1pbHlfb3RoZXJfYmx1ZXMsIDEwLCAiRmFtaWx5T3RoZXJCbHVlcyIgKQotICBDRkZfRklFTERfRklYRURfMTAwMCggMHgxMDksIGJsdWVfc2NhbGUsICAgICAgICAgICAgICJCbHVlU2NhbGUiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDB4MTBBLCBibHVlX3NoaWZ0LCAgICAgICAgICAgICAiQmx1ZVNoaWZ0IiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAweDEwQiwgYmx1ZV9mdXp6LCAgICAgICAgICAgICAgIkJsdWVGdXp6IiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAxMCwgICAgc3RhbmRhcmRfd2lkdGgsICAgICAgICAgIlN0ZEhXIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAxMSwgICAgc3RhbmRhcmRfaGVpZ2h0LCAgICAgICAgIlN0ZFZXIiApCi0gIENGRl9GSUVMRF9ERUxUQSAgICAgKCAweDEwQywgc25hcF93aWR0aHMsIDEzLCAgICAgICAgIlN0ZW1TbmFwSCIgKQotICBDRkZfRklFTERfREVMVEEgICAgICggMHgxMEQsIHNuYXBfaGVpZ2h0cywgMTMsICAgICAgICJTdGVtU25hcFYiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDB4MTExLCBsYW5ndWFnZV9ncm91cCwgICAgICAgICAiTGFuZ3VhZ2VHcm91cCIgKQotICBDRkZfRklFTERfRklYRUQgICAgICggMHgxMTIsIGV4cGFuc2lvbl9mYWN0b3IsICAgICAgICJFeHBhbnNpb25GYWN0b3IiICkKLSAgQ0ZGX0ZJRUxEX0NBTExCQUNLICAoIDIyLCAgICB2c2luZGV4LCAgICAgICAgICAgICAgICAidnNpbmRleCIgKQotICBDRkZfRklFTERfQkxFTkQgICAgICggMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibGVuZCIgKQotICBDRkZfRklFTERfTlVNICAgICAgICggMTksICAgIGxvY2FsX3N1YnJzX29mZnNldCwgICAgICJTdWJycyIgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZ0eXBlcy5oIGIvc3JjL2NmZi9jZmZ0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGY1NjlmLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZ0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgT3BlblR5cGUvQ0ZGIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgICAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIENGRlRZUEVTX0hfCi0jZGVmaW5lIENGRlRZUEVTX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDRkZfSW5kZXhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgQ0ZGIEluZGV4IHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICA6OiBUaGUgc291cmNlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0YXJ0ICAgICAgIDo6IFRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgaW5kZXggYnl0ZSBpbiB0aGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGV4LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2ZmX3NpemUgICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2Ygb2JqZWN0IG9mZnNldHMgaW4gaW5kZXguICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhX29mZnNldCA6OiBUaGUgcG9zaXRpb24gb2YgZmlyc3QgZGF0YSBieXRlIGluIHRoZSBpbmRleCdzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhX3NpemUgICA6OiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSB0YWJsZSBpbiB0aGlzIGluZGV4LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldHMgICAgIDo6IEEgdGFibGUgb2YgZWxlbWVudCBvZmZzZXRzIGluIHRoZSBpbmRleC4gIE11c3QgYmUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBsb2FkZWQgZXhwbGljaXRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ5dGVzICAgICAgIDo6IElmIHRoZSBpbmRleCBpcyBsb2FkZWQgaW4gbWVtb3J5LCBpdHMgYnl0ZXMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9JbmRleFJlY18KLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotICAgIEZUX1VMb25nICAgc3RhcnQ7Ci0gICAgRlRfVUludCAgICBoZHJfc2l6ZTsKLSAgICBGVF9VSW50ICAgIGNvdW50OwotICAgIEZUX0J5dGUgICAgb2ZmX3NpemU7Ci0gICAgRlRfVUxvbmcgICBkYXRhX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGRhdGFfc2l6ZTsKLQotICAgIEZUX1VMb25nKiAgb2Zmc2V0czsKLSAgICBGVF9CeXRlKiAgIGJ5dGVzOwotCi0gIH0gQ0ZGX0luZGV4UmVjLCAqQ0ZGX0luZGV4OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9FbmNvZGluZ1JlY18KLSAgewotICAgIEZUX1VJbnQgICAgIGZvcm1hdDsKLSAgICBGVF9VTG9uZyAgICBvZmZzZXQ7Ci0KLSAgICBGVF9VSW50ICAgICBjb3VudDsKLSAgICBGVF9VU2hvcnQgICBzaWRzIFsyNTZdOyAgLyogYXZvaWQgZHluYW1pYyBhbGxvY2F0aW9ucyAqLwotICAgIEZUX1VTaG9ydCAgIGNvZGVzWzI1Nl07Ci0KLSAgfSBDRkZfRW5jb2RpbmdSZWMsICpDRkZfRW5jb2Rpbmc7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0NoYXJzZXRSZWNfCi0gIHsKLQotICAgIEZUX1VJbnQgICAgIGZvcm1hdDsKLSAgICBGVF9VTG9uZyAgICBvZmZzZXQ7Ci0KLSAgICBGVF9VU2hvcnQqICBzaWRzOwotICAgIEZUX1VTaG9ydCogIGNpZHM7ICAgICAgIC8qIHRoZSBpbnZlcnNlIG1hcHBpbmcgb2YgYHNpZHMnOyBvbmx5IG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBDSUQta2V5ZWQgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgIG1heF9jaWQ7Ci0gICAgRlRfVUludCAgICAgbnVtX2dseXBoczsKLQotICB9IENGRl9DaGFyc2V0UmVjLCAqQ0ZGX0NoYXJzZXQ7Ci0KLQotICAvKiBjZi4gc2ltaWxhciBmaWVsZHMgaW4gZmlsZSBgdHRneHZhci5oJyBmcm9tIHRoZSBgdHJ1ZXR5cGUnIG1vZHVsZSAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfVmFyRGF0YV8KLSAgewotI2lmIDAKLSAgICBGVF9VSW50ICBpdGVtQ291bnQ7ICAgICAgIC8qIG5vdCB1c2VkOyBhbHdheXMgemVybyAqLwotICAgIEZUX1VJbnQgIHNob3J0RGVsdGFDb3VudDsgLyogbm90IHVzZWQ7IGFsd2F5cyB6ZXJvICovCi0jZW5kaWYKLQotICAgIEZUX1VJbnQgICByZWdpb25JZHhDb3VudDsgLyogbnVtYmVyIG9mIHJlZ2lvbiBpbmRleGVzICAgICAgICAgICAqLwotICAgIEZUX1VJbnQqICByZWdpb25JbmRpY2VzOyAgLyogYXJyYXkgb2YgYHJlZ2lvbklkeENvdW50JyBpbmRpY2VzOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlc2UgaW5kZXggYHZhclJlZ2lvbkxpc3QnICAgICAgICAqLwotICB9IENGRl9WYXJEYXRhOwotCi0KLSAgLyogY29udHJpYnV0aW9uIG9mIG9uZSBheGlzIHRvIGEgcmVnaW9uICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfQXhpc0Nvb3Jkc18KLSAgewotICAgIEZUX0ZpeGVkICBzdGFydENvb3JkOwotICAgIEZUX0ZpeGVkICBwZWFrQ29vcmQ7ICAgICAgLyogemVybyBwZWFrIG1lYW5zIG5vIGVmZmVjdCAoZmFjdG9yID0gMSkgKi8KLSAgICBGVF9GaXhlZCAgZW5kQ29vcmQ7Ci0KLSAgfSBDRkZfQXhpc0Nvb3JkczsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfVmFyUmVnaW9uXwotICB7Ci0gICAgQ0ZGX0F4aXNDb29yZHMqICBheGlzTGlzdDsgICAgICAvKiBhcnJheSBvZiBheGlzQ291bnQgcmVjb3JkcyAqLwotCi0gIH0gQ0ZGX1ZhclJlZ2lvbjsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfVlN0b3JlUmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgIGRhdGFDb3VudDsKLSAgICBDRkZfVmFyRGF0YSogICAgdmFyRGF0YTsgICAgICAgIC8qIGFycmF5IG9mIGRhdGFDb3VudCByZWNvcmRzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzaW5kZXggaW5kZXhlcyB0aGlzIGFycmF5ICAgICAgKi8KLSAgICBGVF9VU2hvcnQgICAgICAgYXhpc0NvdW50OwotICAgIEZUX1VJbnQgICAgICAgICByZWdpb25Db3VudDsgICAgLyogdG90YWwgbnVtYmVyIG9mIHJlZ2lvbnMgZGVmaW5lZCAqLwotICAgIENGRl9WYXJSZWdpb24qICB2YXJSZWdpb25MaXN0OwotCi0gIH0gQ0ZGX1ZTdG9yZVJlYywgKkNGRl9WU3RvcmU7Ci0KLQotICAvKiBmb3J3YXJkIHJlZmVyZW5jZSAqLwotICB0eXBlZGVmIHN0cnVjdCBDRkZfRm9udFJlY18qICBDRkZfRm9udDsKLQotCi0gIC8qIFRoaXMgb2JqZWN0IG1hbmFnZXMgb25lIGNhY2hlZCBibGVuZCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBpcyBhIEJsZW5kUmVjIGZvciBQcml2YXRlIERJQ1QgcGFyc2luZyBpbiBlYWNoIHN1YmZvbnQgICovCi0gIC8qIGFuZCBhIEJsZW5kUmVjIGZvciBjaGFyc3RyaW5ncyBpbiBDRjJfRm9udCBpbnN0YW5jZSBkYXRhLiAgICAgKi8KLSAgLyogQSBjYWNoZWQgQlYgbWF5IGJlIHVzZWQgYWNyb3NzIERJQ1RzIG9yIENoYXJzdHJpbmdzIGlmIGlucHV0cyAqLwotICAvKiBoYXZlIG5vdCBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYHVzZWRCVicgaXMgcmVzZXQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggcGFyc2Ugb3IgY2hhcnN0cmluZy4gICAqLwotICAvKiB2c2luZGV4IGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGEgQlYgaXMgdXNlZC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZTogTkRWIGlzIGxvbmcgKDMyLzY0IGJpdCksIHdoaWxlIEJWIGlzIDE2LjE2IChGVF9JbnQzMikuICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0JsZW5kUmVjXwotICB7Ci0gICAgRlRfQm9vbCAgICBidWlsdEJWOyAgICAgICAgLyogYmxlbmRWIGhhcyBiZWVuIGJ1aWx0ICAgICAgICAgICAqLwotICAgIEZUX0Jvb2wgICAgdXNlZEJWOyAgICAgICAgIC8qIGJsZW5kViBoYXMgYmVlbiB1c2VkICAgICAgICAgICAgKi8KLSAgICBDRkZfRm9udCAgIGZvbnQ7ICAgICAgICAgICAvKiB0b3AgbGV2ZWwgZm9udCBzdHJ1Y3QgICAgICAgICAgICovCi0gICAgRlRfVUludCAgICBsYXN0VnNpbmRleDsgICAgLyogbGFzdCB2c2luZGV4IHVzZWQgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgbGVuTkRWOyAgICAgICAgIC8qIG5vcm1EViBsZW5ndGggKGFrYSBudW1BeGVzKSAgICAgKi8KLSAgICBGVF9GaXhlZCogIGxhc3RORFY7ICAgICAgICAvKiBsYXN0IE5EViB1c2VkICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVUludCAgICBsZW5CVjsgICAgICAgICAgLyogQmxlbmRWIGxlbmd0aCAoYWthIG51bU1hc3RlcnMpICAqLwotICAgIEZUX0ludDMyKiAgQlY7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgYmxlbmRWIChwZXIgRElDVC9nbHlwaCkgKi8KLQotICB9IENGRl9CbGVuZFJlYywgKkNGRl9CbGVuZDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRm9udFJlY0RpY3RSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgIHZlcnNpb247Ci0gICAgRlRfVUludCAgICBub3RpY2U7Ci0gICAgRlRfVUludCAgICBjb3B5cmlnaHQ7Ci0gICAgRlRfVUludCAgICBmdWxsX25hbWU7Ci0gICAgRlRfVUludCAgICBmYW1pbHlfbmFtZTsKLSAgICBGVF9VSW50ICAgIHdlaWdodDsKLSAgICBGVF9Cb29sICAgIGlzX2ZpeGVkX3BpdGNoOwotICAgIEZUX0ZpeGVkICAgaXRhbGljX2FuZ2xlOwotICAgIEZUX0ZpeGVkICAgdW5kZXJsaW5lX3Bvc2l0aW9uOwotICAgIEZUX0ZpeGVkICAgdW5kZXJsaW5lX3RoaWNrbmVzczsKLSAgICBGVF9JbnQgICAgIHBhaW50X3R5cGU7Ci0gICAgRlRfSW50ICAgICBjaGFyc3RyaW5nX3R5cGU7Ci0gICAgRlRfTWF0cml4ICBmb250X21hdHJpeDsKLSAgICBGVF9Cb29sICAgIGhhc19mb250X21hdHJpeDsKLSAgICBGVF9VTG9uZyAgIHVuaXRzX3Blcl9lbTsgIC8qIHRlbXBvcmFyaWx5IHVzZWQgYXMgc2NhbGluZyB2YWx1ZSBhbHNvICovCi0gICAgRlRfVmVjdG9yICBmb250X29mZnNldDsKLSAgICBGVF9VTG9uZyAgIHVuaXF1ZV9pZDsKLSAgICBGVF9CQm94ICAgIGZvbnRfYmJveDsKLSAgICBGVF9Qb3MgICAgIHN0cm9rZV93aWR0aDsKLSAgICBGVF9VTG9uZyAgIGNoYXJzZXRfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgZW5jb2Rpbmdfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgY2hhcnN0cmluZ3Nfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgcHJpdmF0ZV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBwcml2YXRlX3NpemU7Ci0gICAgRlRfTG9uZyAgICBzeW50aGV0aWNfYmFzZTsKLSAgICBGVF9VSW50ICAgIGVtYmVkZGVkX3Bvc3RzY3JpcHQ7Ci0KLSAgICAvKiB0aGVzZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0aGUgdG9wLWxldmVsIGZvbnQgZGljdGlvbmFyeSAqLwotICAgIEZUX1VJbnQgICAgY2lkX3JlZ2lzdHJ5OwotICAgIEZUX1VJbnQgICAgY2lkX29yZGVyaW5nOwotICAgIEZUX0xvbmcgICAgY2lkX3N1cHBsZW1lbnQ7Ci0KLSAgICBGVF9Mb25nICAgIGNpZF9mb250X3ZlcnNpb247Ci0gICAgRlRfTG9uZyAgICBjaWRfZm9udF9yZXZpc2lvbjsKLSAgICBGVF9Mb25nICAgIGNpZF9mb250X3R5cGU7Ci0gICAgRlRfVUxvbmcgICBjaWRfY291bnQ7Ci0gICAgRlRfVUxvbmcgICBjaWRfdWlkX2Jhc2U7Ci0gICAgRlRfVUxvbmcgICBjaWRfZmRfYXJyYXlfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgY2lkX2ZkX3NlbGVjdF9vZmZzZXQ7Ci0gICAgRlRfVUludCAgICBjaWRfZm9udF9uYW1lOwotCi0gICAgLyogdGhlIG5leHQgZmllbGRzIGNvbWUgZnJvbSB0aGUgZGF0YSBvZiB0aGUgZGVwcmVjYXRlZCAgICAgICAgICAqLwotICAgIC8qIGBNdWx0aXBsZU1hc3Rlcicgb3BlcmF0b3I7IHRoZXkgYXJlIG5lZWRlZCB0byBwYXJzZSB0aGUgKGFsc28gKi8KLSAgICAvKiBkZXByZWNhdGVkKSBgYmxlbmQnIG9wZXJhdG9yIGluIFR5cGUgMiBjaGFyc3RyaW5ncyAgICAgICAgICAgICovCi0gICAgRlRfVVNob3J0ICBudW1fZGVzaWduczsKLSAgICBGVF9VU2hvcnQgIG51bV9heGVzOwotCi0gICAgLyogZmllbGRzIGZvciBDRkYyICovCi0gICAgRlRfVUxvbmcgICB2c3RvcmVfb2Zmc2V0OwotICAgIEZUX1VJbnQgICAgbWF4c3RhY2s7Ci0KLSAgfSBDRkZfRm9udFJlY0RpY3RSZWMsICpDRkZfRm9udFJlY0RpY3Q7Ci0KLQotICAvKiBmb3J3YXJkIHJlZmVyZW5jZSAqLwotICB0eXBlZGVmIHN0cnVjdCBDRkZfU3ViRm9udFJlY18qICBDRkZfU3ViRm9udDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfUHJpdmF0ZVJlY18KLSAgewotICAgIEZUX0J5dGUgICBudW1fYmx1ZV92YWx1ZXM7Ci0gICAgRlRfQnl0ZSAgIG51bV9vdGhlcl9ibHVlczsKLSAgICBGVF9CeXRlICAgbnVtX2ZhbWlseV9ibHVlczsKLSAgICBGVF9CeXRlICAgbnVtX2ZhbWlseV9vdGhlcl9ibHVlczsKLQotICAgIEZUX1BvcyAgICBibHVlX3ZhbHVlc1sxNF07Ci0gICAgRlRfUG9zICAgIG90aGVyX2JsdWVzWzEwXTsKLSAgICBGVF9Qb3MgICAgZmFtaWx5X2JsdWVzWzE0XTsKLSAgICBGVF9Qb3MgICAgZmFtaWx5X290aGVyX2JsdWVzWzEwXTsKLQotICAgIEZUX0ZpeGVkICBibHVlX3NjYWxlOwotICAgIEZUX1BvcyAgICBibHVlX3NoaWZ0OwotICAgIEZUX1BvcyAgICBibHVlX2Z1eno7Ci0gICAgRlRfUG9zICAgIHN0YW5kYXJkX3dpZHRoOwotICAgIEZUX1BvcyAgICBzdGFuZGFyZF9oZWlnaHQ7Ci0KLSAgICBGVF9CeXRlICAgbnVtX3NuYXBfd2lkdGhzOwotICAgIEZUX0J5dGUgICBudW1fc25hcF9oZWlnaHRzOwotICAgIEZUX1BvcyAgICBzbmFwX3dpZHRoc1sxM107Ci0gICAgRlRfUG9zICAgIHNuYXBfaGVpZ2h0c1sxM107Ci0gICAgRlRfQm9vbCAgIGZvcmNlX2JvbGQ7Ci0gICAgRlRfRml4ZWQgIGZvcmNlX2JvbGRfdGhyZXNob2xkOwotICAgIEZUX0ludCAgICBsZW5JVjsKLSAgICBGVF9JbnQgICAgbGFuZ3VhZ2VfZ3JvdXA7Ci0gICAgRlRfRml4ZWQgIGV4cGFuc2lvbl9mYWN0b3I7Ci0gICAgRlRfTG9uZyAgIGluaXRpYWxfcmFuZG9tX3NlZWQ7Ci0gICAgRlRfVUxvbmcgIGxvY2FsX3N1YnJzX29mZnNldDsKLSAgICBGVF9Qb3MgICAgZGVmYXVsdF93aWR0aDsKLSAgICBGVF9Qb3MgICAgbm9taW5hbF93aWR0aDsKLQotICAgIC8qIGZpZWxkcyBmb3IgQ0ZGMiAqLwotICAgIEZUX1VJbnQgICAgICB2c2luZGV4OwotICAgIENGRl9TdWJGb250ICBzdWJmb250OwotCi0gIH0gQ0ZGX1ByaXZhdGVSZWMsICpDRkZfUHJpdmF0ZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRkRTZWxlY3RSZWNfCi0gIHsKLSAgICBGVF9CeXRlICAgZm9ybWF0OwotICAgIEZUX1VJbnQgICByYW5nZV9jb3VudDsKLQotICAgIC8qIHRoYXQncyB0aGUgdGFibGUsIHRha2VuIGZyb20gdGhlIGZpbGUgYGFzIGlzJyAqLwotICAgIEZUX0J5dGUqICBkYXRhOwotICAgIEZUX1VJbnQgICBkYXRhX3NpemU7Ci0KLSAgICAvKiBzbWFsbCBjYWNoZSBmb3IgZm9ybWF0IDMgb25seSAqLwotICAgIEZUX1VJbnQgICBjYWNoZV9maXJzdDsKLSAgICBGVF9VSW50ICAgY2FjaGVfY291bnQ7Ci0gICAgRlRfQnl0ZSAgIGNhY2hlX2ZkOwotCi0gIH0gQ0ZGX0ZEU2VsZWN0UmVjLCAqQ0ZGX0ZEU2VsZWN0OwotCi0KLSAgLyogQSBTdWJGb250IHBhY2tzIGEgZm9udCBkaWN0IGFuZCBhIHByaXZhdGUgZGljdCB0b2dldGhlci4gIFRoZXkgYXJlICovCi0gIC8qIG5lZWRlZCB0byBzdXBwb3J0IENJRC1rZXllZCBDRkYgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX1N1YkZvbnRSZWNfCi0gIHsKLSAgICBDRkZfRm9udFJlY0RpY3RSZWMgIGZvbnRfZGljdDsKLSAgICBDRkZfUHJpdmF0ZVJlYyAgICAgIHByaXZhdGVfZGljdDsKLQotICAgIC8qIGZpZWxkcyBmb3IgQ0ZGMiAqLwotICAgIENGRl9CbGVuZFJlYyAgYmxlbmQ7ICAgICAgLyogY3VycmVudCBibGVuZCB2ZWN0b3IgICAgICAgKi8KLSAgICBGVF9VSW50ICAgICAgIGxlbk5EVjsgICAgIC8qIGN1cnJlbnQgbGVuZ3RoIE5EViBvciB6ZXJvICovCi0gICAgRlRfRml4ZWQqICAgICBORFY7ICAgICAgICAvKiBwdHIgdG8gY3VycmVudCBORFYgb3IgTlVMTCAqLwotCi0gICAgLyogYGJsZW5kX3N0YWNrJyBpcyBhIHdyaXRhYmxlIGJ1ZmZlciB0byBob2xkIGJsZW5kIHJlc3VsdHMuICAgICAgICAgICovCi0gICAgLyogVGhpcyBidWZmZXIgaXMgdG8gdGhlIHNpZGUgb2YgdGhlIG5vcm1hbCBjZmYgcGFyc2VyIHN0YWNrOyAgICAgICAgICovCi0gICAgLyogYGNmZl9wYXJzZV9ibGVuZCcgYW5kIGBjZmZfYmxlbmRfZG9CbGVuZCcgcHVzaCBibGVuZCByZXN1bHRzIGhlcmUuICovCi0gICAgLyogVGhlIG5vcm1hbCBzdGFjayB0aGVuIHBvaW50cyB0byB0aGVzZSB2YWx1ZXMgaW5zdGVhZCBvZiB0aGUgRElDVCAgICovCi0gICAgLyogYmVjYXVzZSBhbGwgb3RoZXIgb3BlcmF0b3JzIGluIFByaXZhdGUgRElDVCBjbGVhciB0aGUgc3RhY2suICAgICAgICovCi0gICAgLyogYGJsZW5kX3N0YWNrJyBjb3VsZCBiZSBjbGVhcmVkIGF0IGVhY2ggb3BlcmF0b3Igb3RoZXIgdGhhbiBibGVuZC4gICovCi0gICAgLyogQmxlbmRlZCB2YWx1ZXMgYXJlIHN0b3JlZCBhcyA1LWJ5dGUgZml4ZWQgcG9pbnQgdmFsdWVzLiAgICAgICAgICAgICovCi0KLSAgICBGVF9CeXRlKiAgYmxlbmRfc3RhY2s7ICAgIC8qIGJhc2Ugb2Ygc3RhY2sgYWxsb2NhdGlvbiAgICAgKi8KLSAgICBGVF9CeXRlKiAgYmxlbmRfdG9wOyAgICAgIC8qIGZpcnN0IGVtcHR5IHNsb3QgICAgICAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgYmxlbmRfdXNlZDsgICAgIC8qIG51bWJlciBvZiBieXRlcyBpbiB1c2UgICAgICAgKi8KLSAgICBGVF9VSW50ICAgYmxlbmRfYWxsb2M7ICAgIC8qIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgICAgKi8KLQotICAgIENGRl9JbmRleFJlYyAgbG9jYWxfc3VicnNfaW5kZXg7Ci0gICAgRlRfQnl0ZSoqICAgICBsb2NhbF9zdWJyczsgLyogYXJyYXkgb2YgcG9pbnRlcnMgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50byBMb2NhbCBTdWJycyBJTkRFWCBkYXRhICovCi0KLSAgICBGVF9VSW50MzIgIHJhbmRvbTsKLQotICB9IENGRl9TdWJGb250UmVjOwotCi0KLSNkZWZpbmUgQ0ZGX01BWF9DSURfRk9OVFMgIDI1NgotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9Gb250UmVjXwotICB7Ci0gICAgRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5OwotICAgIEZUX1N0cmVhbSAgICAgICAgc3RyZWFtOwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OyAgICAgICAgLyogVE9ETzogdGFrZSB0aGlzIGZyb20gc3RyZWFtLT5tZW1vcnk/ICovCi0gICAgRlRfVUxvbmcgICAgICAgICBiYXNlX29mZnNldDsgICAvKiBvZmZzZXQgdG8gc3RhcnQgb2YgQ0ZGICovCi0gICAgRlRfVUludCAgICAgICAgICBudW1fZmFjZXM7Ci0gICAgRlRfVUludCAgICAgICAgICBudW1fZ2x5cGhzOwotCi0gICAgRlRfQnl0ZSAgICAgICAgICB2ZXJzaW9uX21ham9yOwotICAgIEZUX0J5dGUgICAgICAgICAgdmVyc2lvbl9taW5vcjsKLSAgICBGVF9CeXRlICAgICAgICAgIGhlYWRlcl9zaXplOwotCi0gICAgRlRfVUludCAgICAgICAgICB0b3BfZGljdF9sZW5ndGg7ICAgLyogY2ZmMiBvbmx5ICovCi0KLSAgICBGVF9Cb29sICAgICAgICAgIGNmZjI7Ci0KLSAgICBDRkZfSW5kZXhSZWMgICAgIG5hbWVfaW5kZXg7Ci0gICAgQ0ZGX0luZGV4UmVjICAgICB0b3BfZGljdF9pbmRleDsKLSAgICBDRkZfSW5kZXhSZWMgICAgIGdsb2JhbF9zdWJyc19pbmRleDsKLQotICAgIENGRl9FbmNvZGluZ1JlYyAgZW5jb2Rpbmc7Ci0gICAgQ0ZGX0NoYXJzZXRSZWMgICBjaGFyc2V0OwotCi0gICAgQ0ZGX0luZGV4UmVjICAgICBjaGFyc3RyaW5nc19pbmRleDsKLSAgICBDRkZfSW5kZXhSZWMgICAgIGZvbnRfZGljdF9pbmRleDsKLSAgICBDRkZfSW5kZXhSZWMgICAgIHByaXZhdGVfaW5kZXg7Ci0gICAgQ0ZGX0luZGV4UmVjICAgICBsb2NhbF9zdWJyc19pbmRleDsKLQotICAgIEZUX1N0cmluZyogICAgICAgZm9udF9uYW1lOwotCi0gICAgLyogYXJyYXkgb2YgcG9pbnRlcnMgaW50byBHbG9iYWwgU3VicnMgSU5ERVggZGF0YSAqLwotICAgIEZUX0J5dGUqKiAgICAgICAgZ2xvYmFsX3N1YnJzOwotCi0gICAgLyogYXJyYXkgb2YgcG9pbnRlcnMgaW50byBTdHJpbmcgSU5ERVggZGF0YSBzdG9yZWQgYXQgc3RyaW5nX3Bvb2wgKi8KLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9zdHJpbmdzOwotICAgIEZUX0J5dGUqKiAgICAgICAgc3RyaW5nczsKLSAgICBGVF9CeXRlKiAgICAgICAgIHN0cmluZ19wb29sOwotICAgIEZUX1VMb25nICAgICAgICAgc3RyaW5nX3Bvb2xfc2l6ZTsKLQotICAgIENGRl9TdWJGb250UmVjICAgdG9wX2ZvbnQ7Ci0gICAgRlRfVUludCAgICAgICAgICBudW1fc3ViZm9udHM7Ci0gICAgQ0ZGX1N1YkZvbnQgICAgICBzdWJmb250c1tDRkZfTUFYX0NJRF9GT05UU107Ci0KLSAgICBDRkZfRkRTZWxlY3RSZWMgIGZkX3NlbGVjdDsKLQotICAgIC8qIGludGVyZmFjZSB0byBQb3N0U2NyaXB0IGhpbnRlciAqLwotICAgIFBTSGludGVyX1NlcnZpY2UgIHBzaGludGVyOwotCi0gICAgLyogaW50ZXJmYWNlIHRvIFBvc3RzY3JpcHQgTmFtZXMgc2VydmljZSAqLwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lczsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4zLjAgKi8KLSAgICBQU19Gb250SW5mb1JlYyogIGZvbnRfaW5mbzsgICAvKiBmb250IGluZm8gZGljdGlvbmFyeSAqLwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjMuNiAqLwotICAgIEZUX1N0cmluZyogICAgICAgcmVnaXN0cnk7Ci0gICAgRlRfU3RyaW5nKiAgICAgICBvcmRlcmluZzsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi40LjEyICovCi0gICAgRlRfR2VuZXJpYyAgICAgICBjZjJfaW5zdGFuY2U7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuNy4xICovCi0gICAgQ0ZGX1ZTdG9yZVJlYyAgICB2c3RvcmU7ICAgICAgICAvKiBwYXJzZWQgdnN0b3JlIHN0cnVjdHVyZSAqLwotCi0gIH0gQ0ZGX0ZvbnRSZWM7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogQ0ZGVFlQRVNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvbW9kdWxlLm1rIGIvc3JjL2NmZi9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzVhZWUuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9tb2R1bGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgQ0ZGIG1vZHVsZSBkZWZpbml0aW9uCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1GVE1PRFVMRV9IX0NPTU1BTkRTICs9IENGRl9EUklWRVIKLQotZGVmaW5lIENGRl9EUklWRVIKLSQoT1BFTl9EUklWRVIpIEZUX0RyaXZlcl9DbGFzc1JlYywgY2ZmX2RyaXZlcl9jbGFzcyAkKENMT1NFX0RSSVZFUikKLSQoRUNIT19EUklWRVIpY2ZmICAgICAgICQoRUNIT19EUklWRVJfREVTQylPcGVuVHlwZSBmb250cyB3aXRoIGV4dGVuc2lvbiAqLm90ZiQoRUNIT19EUklWRVJfRE9ORSkKLWVuZGVmCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvY2ZmL3J1bGVzLm1rIGIvc3JjL2NmZi9ydWxlcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4NDBiZi4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIE9wZW5UeXBlL0NGRiBkcml2ZXIgY29uZmlndXJhdGlvbiBydWxlcwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBPcGVuVHlwZSBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1DRkZfRElSIDo9ICQoU1JDX0RJUikvY2ZmCi0KLQotQ0ZGX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKENGRl9ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBDRkYgZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1DRkZfRFJWX1NSQyA6PSAkKENGRl9ESVIpL2NmZmNtYXAuYyAgXAotICAgICAgICAgICAgICAgJChDRkZfRElSKS9jZmZkcml2ci5jIFwKLSAgICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2ZmZ2xvYWQuYyBcCi0gICAgICAgICAgICAgICAkKENGRl9ESVIpL2NmZmxvYWQuYyAgXAotICAgICAgICAgICAgICAgJChDRkZfRElSKS9jZmZvYmpzLmMgIFwKLSAgICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2ZmcGFyc2UuYyBcCi0gICAgICAgICAgICAgICAkKENGRl9ESVIpL2NmZnBpYy5jICAgXAotICAgICAgICAgICAgICAgJChDRkZfRElSKS9jZjJhcnJzdC5jIFwKLSAgICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2YyYmx1ZXMuYyBcCi0gICAgICAgICAgICAgICAkKENGRl9ESVIpL2NmMmVycm9yLmMgXAotICAgICAgICAgICAgICAgJChDRkZfRElSKS9jZjJmb250LmMgIFwKLSAgICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2YyZnQuYyAgICBcCi0gICAgICAgICAgICAgICAkKENGRl9ESVIpL2NmMmhpbnRzLmMgXAotICAgICAgICAgICAgICAgJChDRkZfRElSKS9jZjJpbnRycC5jIFwKLSAgICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2YycmVhZC5jICBcCi0gICAgICAgICAgICAgICAkKENGRl9ESVIpL2NmMnN0YWNrLmMKLQotCi0jIENGRiBkcml2ZXIgaGVhZGVycwotIwotQ0ZGX0RSVl9IIDo9ICQoQ0ZGX0RSVl9TUkM6JS5jPSUuaCkgXAotICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2ZmZXJycy5oICAgXAotICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2ZmdG9rZW4uaCAgXAotICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2ZmdHlwZXMuaCAgXAotICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2YyZml4ZWQuaCAgXAotICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2YyZ2x1ZS5oICAgXAotICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2YydHlwZXMuaAotCi0KLSMgQ0ZGIGRyaXZlciBvYmplY3QocykKLSMKLSMgICBDRkZfRFJWX09CSl9NIGlzIHVzZWQgZHVyaW5nIGBtdWx0aScgYnVpbGRzCi0jICAgQ0ZGX0RSVl9PQkpfUyBpcyB1c2VkIGR1cmluZyBgc2luZ2xlJyBidWlsZHMKLSMKLUNGRl9EUlZfT0JKX00gOj0gJChDRkZfRFJWX1NSQzokKENGRl9ESVIpLyUuYz0kKE9CSl9ESVIpLyUuJE8pCi1DRkZfRFJWX09CSl9TIDo9ICQoT0JKX0RJUikvY2ZmLiRPCi0KLSMgQ0ZGIGRyaXZlciBzb3VyY2UgZmlsZSBmb3Igc2luZ2xlIGJ1aWxkCi0jCi1DRkZfRFJWX1NSQ19TIDo9ICQoQ0ZGX0RJUikvY2ZmLmMKLQotCi0jIENGRiBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0Ci0jCi0kKENGRl9EUlZfT0JKX1MpOiAkKENGRl9EUlZfU1JDX1MpICQoQ0ZGX0RSVl9TUkMpICQoRlJFRVRZUEVfSCkgJChDRkZfRFJWX0gpCi0JJChDRkZfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQoQ0ZGX0RSVl9TUkNfUykpCi0KLQotIyBDRkYgZHJpdmVyIC0gbXVsdGlwbGUgb2JqZWN0cwotIwotJChPQkpfRElSKS8lLiRPOiAkKENGRl9ESVIpLyUuYyAkKEZSRUVUWVBFX0gpICQoQ0ZGX0RSVl9IKQotCSQoQ0ZGX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkPCkKLQotCi0jIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKLSMKLURSVl9PQkpTX1MgKz0gJChDRkZfRFJWX09CSl9TKQotRFJWX09CSlNfTSArPSAkKENGRl9EUlZfT0JKX00pCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9jaWQvSmFtZmlsZSBiL3NyYy9jaWQvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzYmE2YS4uMDAwMDAwMAotLS0gYS9zcmMvY2lkL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL2NpZCBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgY2lkIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBjaWRnbG9hZAotICAgICAgICAgICAgICAgY2lkbG9hZAotICAgICAgICAgICAgICAgY2lkb2JqcwotICAgICAgICAgICAgICAgY2lkcGFyc2UKLSAgICAgICAgICAgICAgIGNpZHJpdmVyCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSB0eXBlMWNpZCA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9jaWQgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWRlcnJzLmggYi9zcmMvY2lkL2NpZGVycnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5ZGM4Yy4uMDAwMDAwMAotLS0gYS9zcmMvY2lkL2NpZGVycnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZGVycnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgQ0lEIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQ0lERVJSU19IXwotI2RlZmluZSBDSURFUlJTX0hfCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgRlRFUlJPUlNfSF8KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIENJRF9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfQ0lECi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBDSURFUlJTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2lkL2NpZGdsb2FkLmMgYi9zcmMvY2lkL2NpZGdsb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmMzMzMuLjAwMDAwMDAKLS0tIGEvc3JjL2NpZC9jaWRnbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZGdsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQta2V5ZWQgVHlwZTEgR2x5cGggTG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiY2lkbG9hZC5oIgotI2luY2x1ZGUgImNpZGdsb2FkLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLQotI2luY2x1ZGUgImNpZGVycnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NpZGdsb2FkCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgY2lkX2xvYWRfZ2x5cGgoIFQxX0RlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCApCi0gIHsKLSAgICBDSURfRmFjZSAgICAgICBmYWNlID0gKENJRF9GYWNlKWRlY29kZXItPmJ1aWxkZXIuZmFjZTsKLSAgICBDSURfRmFjZUluZm8gICBjaWQgID0gJmZhY2UtPmNpZDsKLSAgICBGVF9CeXRlKiAgICAgICBwOwotICAgIEZUX1VMb25nICAgICAgIGZkX3NlbGVjdDsKLSAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0gICAgICAgPSBmYWNlLT5jaWRfc3RyZWFtOwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBGVF9CeXRlKiAgICAgICBjaGFyc3RyaW5nICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSAgICAgICA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgIEZUX1VMb25nICAgICAgIGdseXBoX2xlbmd0aCA9IDA7Ci0gICAgUFNBdXhfU2VydmljZSAgcHNhdXggICAgICAgID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjICppbmMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZTsKLSNlbmRpZgotCi0KLSAgICBGVF9UUkFDRTEoKCAiY2lkX2xvYWRfZ2x5cGg6IGdseXBoIGluZGV4ICVkXG4iLCBnbHlwaF9pbmRleCApKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotICAgIC8qIEZvciBpbmNyZW1lbnRhbCBmb250cyBnZXQgdGhlIGNoYXJhY3RlciBkYXRhIHVzaW5nICovCi0gICAgLyogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGluYyApCi0gICAgewotICAgICAgRlRfRGF0YSAgZ2x5cGhfZGF0YTsKLQotCi0gICAgICBlcnJvciA9IGluYy0+ZnVuY3MtPmdldF9nbHlwaF9kYXRhKCBpbmMtPm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCAmZ2x5cGhfZGF0YSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgcCAgICAgICAgID0gKEZUX0J5dGUqKWdseXBoX2RhdGEucG9pbnRlcjsKLSAgICAgIGZkX3NlbGVjdCA9IGNpZF9nZXRfb2Zmc2V0KCAmcCwgKEZUX0J5dGUpY2lkLT5mZF9ieXRlcyApOwotCi0gICAgICBpZiAoIGdseXBoX2RhdGEubGVuZ3RoICE9IDAgKQotICAgICAgewotICAgICAgICBnbHlwaF9sZW5ndGggPSAoRlRfVUxvbmcpKCBnbHlwaF9kYXRhLmxlbmd0aCAtIGNpZC0+ZmRfYnl0ZXMgKTsKLSAgICAgICAgKHZvaWQpRlRfQUxMT0MoIGNoYXJzdHJpbmcsIGdseXBoX2xlbmd0aCApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgZnRfbWVtY3B5KCBjaGFyc3RyaW5nLCBnbHlwaF9kYXRhLnBvaW50ZXIgKyBjaWQtPmZkX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfbGVuZ3RoICk7Ci0gICAgICB9Ci0KLSAgICAgIGluYy0+ZnVuY3MtPmZyZWVfZ2x5cGhfZGF0YSggaW5jLT5vYmplY3QsICZnbHlwaF9kYXRhICk7Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZWxzZQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gICAgLyogRm9yIG9yZGluYXJ5IGZvbnRzIHJlYWQgdGhlIENJRCBmb250IGRpY3Rpb25hcnkgaW5kZXggKi8KLSAgICAvKiBhbmQgY2hhcnN0cmluZyBvZmZzZXQgZnJvbSB0aGUgQ0lETWFwLiAgICAgICAgICAgICAgICAqLwotICAgIHsKLSAgICAgIEZUX1VJbnQgICBlbnRyeV9sZW4gPSAoRlRfVUludCkoIGNpZC0+ZmRfYnl0ZXMgKyBjaWQtPmdkX2J5dGVzICk7Ci0gICAgICBGVF9VTG9uZyAgb2ZmMSwgb2ZmMjsKLQotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBjaWQtPmRhdGFfb2Zmc2V0ICsgY2lkLT5jaWRtYXBfb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4ICogZW50cnlfbGVuICkgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggMiAqIGVudHJ5X2xlbiApICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwICAgICAgICAgPSAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3I7Ci0gICAgICBmZF9zZWxlY3QgPSBjaWRfZ2V0X29mZnNldCggJnAsIChGVF9CeXRlKWNpZC0+ZmRfYnl0ZXMgKTsKLSAgICAgIG9mZjEgICAgICA9IGNpZF9nZXRfb2Zmc2V0KCAmcCwgKEZUX0J5dGUpY2lkLT5nZF9ieXRlcyApOwotICAgICAgcCAgICAgICAgKz0gY2lkLT5mZF9ieXRlczsKLSAgICAgIG9mZjIgICAgICA9IGNpZF9nZXRfb2Zmc2V0KCAmcCwgKEZUX0J5dGUpY2lkLT5nZF9ieXRlcyApOwotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgICBpZiAoIGZkX3NlbGVjdCA+PSAoRlRfVUxvbmcpY2lkLT5udW1fZGljdHMgfHwKLSAgICAgICAgICAgb2ZmMiA+IHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBvZmYxID4gb2ZmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UwKCggImNpZF9sb2FkX2dseXBoOiBpbnZhbGlkIGdseXBoIHN0cmVhbSBvZmZzZXRzXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX09mZnNldCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGdseXBoX2xlbmd0aCA9IG9mZjIgLSBvZmYxOwotICAgICAgaWYgKCBnbHlwaF9sZW5ndGggPT0gMCApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGlmICggRlRfQUxMT0MoIGNoYXJzdHJpbmcsIGdseXBoX2xlbmd0aCApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9BVCggY2lkLT5kYXRhX29mZnNldCArIG9mZjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nLCBnbHlwaF9sZW5ndGggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBOb3cgc2V0IHVwIHRoZSBzdWJycyBhcnJheSBhbmQgcGFyc2UgdGhlIGNoYXJzdHJpbmdzLiAqLwotICAgIHsKLSAgICAgIENJRF9GYWNlRGljdCAgZGljdDsKLSAgICAgIENJRF9TdWJycyAgICAgY2lkX3N1YnJzID0gZmFjZS0+c3VicnMgKyBmZF9zZWxlY3Q7Ci0gICAgICBGVF9VSW50ICAgICAgIGNzX29mZnNldDsKLQotCi0gICAgICAvKiBTZXQgdXAgc3VicnMgKi8KLSAgICAgIGRlY29kZXItPm51bV9zdWJycyAgPSBjaWRfc3VicnMtPm51bV9zdWJyczsKLSAgICAgIGRlY29kZXItPnN1YnJzICAgICAgPSBjaWRfc3VicnMtPmNvZGU7Ci0gICAgICBkZWNvZGVyLT5zdWJyc19sZW4gID0gMDsKLSAgICAgIGRlY29kZXItPnN1YnJzX2hhc2ggPSBOVUxMOwotCi0gICAgICAvKiBTZXQgdXAgZm9udCBtYXRyaXggKi8KLSAgICAgIGRpY3QgICAgICAgICAgICAgICAgID0gY2lkLT5mb250X2RpY3RzICsgZmRfc2VsZWN0OwotCi0gICAgICBkZWNvZGVyLT5mb250X21hdHJpeCA9IGRpY3QtPmZvbnRfbWF0cml4OwotICAgICAgZGVjb2Rlci0+Zm9udF9vZmZzZXQgPSBkaWN0LT5mb250X29mZnNldDsKLSAgICAgIGRlY29kZXItPmxlbklWICAgICAgID0gZGljdC0+cHJpdmF0ZV9kaWN0LmxlbklWOwotCi0gICAgICAvKiBEZWNvZGUgdGhlIGNoYXJzdHJpbmcuICovCi0KLSAgICAgIC8qIEFkanVzdG1lbnQgZm9yIHNlZWQgYnl0ZXMuICovCi0gICAgICBjc19vZmZzZXQgPSBkZWNvZGVyLT5sZW5JViA+PSAwID8gKEZUX1VJbnQpZGVjb2Rlci0+bGVuSVYgOiAwOwotICAgICAgaWYgKCBjc19vZmZzZXQgPiBnbHlwaF9sZW5ndGggKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAiY2lkX2xvYWRfZ2x5cGg6IGludmFsaWQgZ2x5cGggc3RyZWFtIG9mZnNldHNcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfT2Zmc2V0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyogRGVjcnlwdCBvbmx5IGlmIGxlbklWID49IDAuICovCi0gICAgICBpZiAoIGRlY29kZXItPmxlbklWID49IDAgKQotICAgICAgICBwc2F1eC0+dDFfZGVjcnlwdCggY2hhcnN0cmluZywgZ2x5cGhfbGVuZ3RoLCA0MzMwICk7Ci0KLSAgICAgIGVycm9yID0gZGVjb2Rlci0+ZnVuY3MucGFyc2VfY2hhcnN0cmluZ3MoCi0gICAgICAgICAgICAgICAgZGVjb2RlciwgY2hhcnN0cmluZyArIGNzX29mZnNldCwKLSAgICAgICAgICAgICAgICBnbHlwaF9sZW5ndGggLSBjc19vZmZzZXQgKTsKLSAgICB9Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0KLSAgICAvKiBJbmNyZW1lbnRhbCBmb250cyBjYW4gb3B0aW9uYWxseSBvdmVycmlkZSB0aGUgbWV0cmljcy4gKi8KLSAgICBpZiAoICFlcnJvciAmJiBpbmMgJiYgaW5jLT5mdW5jcy0+Z2V0X2dseXBoX21ldHJpY3MgKQotICAgIHsKLSAgICAgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWMgIG1ldHJpY3M7Ci0KLQotICAgICAgbWV0cmljcy5iZWFyaW5nX3ggPSBGSVhFRF9UT19JTlQoIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnggKTsKLSAgICAgIG1ldHJpY3MuYmVhcmluZ195ID0gMDsKLSAgICAgIG1ldHJpY3MuYWR2YW5jZSAgID0gRklYRURfVE9fSU5UKCBkZWNvZGVyLT5idWlsZGVyLmFkdmFuY2UueCApOwotICAgICAgbWV0cmljcy5hZHZhbmNlX3YgPSBGSVhFRF9UT19JTlQoIGRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZS55ICk7Ci0KLSAgICAgIGVycm9yID0gaW5jLT5mdW5jcy0+Z2V0X2dseXBoX21ldHJpY3MoIGluYy0+b2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsIEZBTFNFLCAmbWV0cmljcyApOwotCi0gICAgICBkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZy54ID0gSU5UX1RPX0ZJWEVEKCBtZXRyaWNzLmJlYXJpbmdfeCApOwotICAgICAgZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlLnggICAgICA9IElOVF9UT19GSVhFRCggbWV0cmljcy5hZHZhbmNlICk7Ci0gICAgICBkZWNvZGVyLT5idWlsZGVyLmFkdmFuY2UueSAgICAgID0gSU5UX1RPX0ZJWEVEKCBtZXRyaWNzLmFkdmFuY2VfdiApOwotICAgIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotICBFeGl0OgotICAgIEZUX0ZSRUUoIGNoYXJzdHJpbmcgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNpZiAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgQ09NUFVURSBUSEUgTUFYSU1VTSBBRFZBTkNFIFdJRFRIICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGluIGNoYXJnZSBvZiBjb21wdXRpbmcgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIHRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGZvbnQuICBJdCAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBxdWlja2x5IHByb2Nlc3NlcyBlYWNoIGdseXBoIGNoYXJzdHJpbmcgdG8gICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSBlaXRoZXIgYSBgc2J3JyBvciBgc2VhYycgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIG9wZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjaWRfZmFjZV9jb21wdXRlX21heF9hZHZhbmNlKCBDSURfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgIG1heF9hZHZhbmNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotICAgIFQxX0RlY29kZXJSZWMgIGRlY29kZXI7Ci0gICAgRlRfSW50ICAgICAgICAgZ2x5cGhfaW5kZXg7Ci0KLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotCi0KLSAgICAqbWF4X2FkdmFuY2UgPSAwOwotCi0gICAgLyogSW5pdGlhbGl6ZSBsb2FkIGRlY29kZXIgKi8KLSAgICBlcnJvciA9IHBzYXV4LT50MV9kZWNvZGVyX2Z1bmNzLT5pbml0KCAmZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfRmFjZSlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHNpemUgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBnbHlwaCBzbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZ2x5cGggbmFtZXMhIFhYWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGJsZW5kID09IDAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBoaW50aW5nID09IDAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWRfbG9hZF9nbHlwaCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogVE9ETzogaW5pdGlhbGl6ZSBkZWNvZGVyLmxlbl9idWlsZGNoYXIgYW5kIGRlY29kZXIuYnVpbGRjaGFyICovCi0gICAgLyogICAgICAgaWYgd2UgZXZlciBzdXBwb3J0IENJRC1rZXllZCBtdWx0aXBsZSBtYXN0ZXIgZm9udHMgICAgICovCi0KLSAgICBkZWNvZGVyLmJ1aWxkZXIubWV0cmljc19vbmx5ID0gMTsKLSAgICBkZWNvZGVyLmJ1aWxkZXIubG9hZF9wb2ludHMgID0gMDsKLQotICAgIC8qIGZvciBlYWNoIGdseXBoLCBwYXJzZSB0aGUgZ2x5cGggY2hhcnN0cmluZyBhbmQgZXh0cmFjdCAqLwotICAgIC8qIHRoZSBhZHZhbmNlIHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGdseXBoX2luZGV4ID0gMDsgZ2x5cGhfaW5kZXggPCBmYWNlLT5yb290Lm51bV9nbHlwaHM7Ci0gICAgICAgICAgZ2x5cGhfaW5kZXgrKyApCi0gICAgewotICAgICAgLyogbm93IGdldCBsb2FkIHRoZSB1bnNjYWxlZCBvdXRsaW5lICovCi0gICAgICBlcnJvciA9IGNpZF9sb2FkX2dseXBoKCAmZGVjb2RlciwgZ2x5cGhfaW5kZXggKTsKLSAgICAgIC8qIGlnbm9yZSB0aGUgZXJyb3IgaWYgb25lIG9jY3VycmVkIC0gc2tpcCB0byBuZXh0IGdseXBoICovCi0gICAgfQotCi0gICAgKm1heF9hZHZhbmNlID0gRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ICk7Ci0KLSAgICBwc2F1eC0+dDFfZGVjb2Rlcl9mdW5jcy0+ZG9uZSggJmRlY29kZXIgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9zbG90X2xvYWRfZ2x5cGgoIEZUX0dseXBoU2xvdCAgY2lkZ2x5cGgsICAgICAgLyogQ0lEX0dseXBoU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIGNpZHNpemUsICAgICAgIC8qIENJRF9TaXplICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICkKLSAgewotICAgIENJRF9HbHlwaFNsb3QgIGdseXBoID0gKENJRF9HbHlwaFNsb3QpY2lkZ2x5cGg7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgVDFfRGVjb2RlclJlYyAgZGVjb2RlcjsKLSAgICBDSURfRmFjZSAgICAgICBmYWNlID0gKENJRF9GYWNlKWNpZGdseXBoLT5mYWNlOwotICAgIEZUX0Jvb2wgICAgICAgIGhpbnRpbmc7Ci0KLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotICAgIEZUX01hdHJpeCAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgIGZvbnRfb2Zmc2V0OwotCi0KLSAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fUkVDVVJTRSApCi0gICAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fU0NBTEUgfCBGVF9MT0FEX05PX0hJTlRJTkc7Ci0KLSAgICBnbHlwaC0+eF9zY2FsZSA9IGNpZHNpemUtPm1ldHJpY3MueF9zY2FsZTsKLSAgICBnbHlwaC0+eV9zY2FsZSA9IGNpZHNpemUtPm1ldHJpY3MueV9zY2FsZTsKLQotICAgIGNpZGdseXBoLT5vdXRsaW5lLm5fcG9pbnRzICAgPSAwOwotICAgIGNpZGdseXBoLT5vdXRsaW5lLm5fY29udG91cnMgPSAwOwotCi0gICAgaGludGluZyA9IEZUX0JPT0woICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgICApID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HICkgPT0gMCApOwotCi0gICAgY2lkZ2x5cGgtPmZvcm1hdCA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotCi0gICAgZXJyb3IgPSBwc2F1eC0+dDFfZGVjb2Rlcl9mdW5jcy0+aW5pdCggJmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkZ2x5cGgtPmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWRnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBnbHlwaCBuYW1lcyAtLSBYWFggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBibGVuZCA9PSAwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkX2xvYWRfZ2x5cGggKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIFRPRE86IGluaXRpYWxpemUgZGVjb2Rlci5sZW5fYnVpbGRjaGFyIGFuZCBkZWNvZGVyLmJ1aWxkY2hhciAqLwotICAgIC8qICAgICAgIGlmIHdlIGV2ZXIgc3VwcG9ydCBDSUQta2V5ZWQgbXVsdGlwbGUgbWFzdGVyIGZvbnRzICAgICAqLwotCi0gICAgLyogc2V0IHVwIHRoZSBkZWNvZGVyICovCi0gICAgZGVjb2Rlci5idWlsZGVyLm5vX3JlY3Vyc2UgPSBGVF9CT09MKAotICAgICAgKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKSAhPSAwICkgKTsKLQotICAgIGVycm9yID0gY2lkX2xvYWRfZ2x5cGgoICZkZWNvZGVyLCBnbHlwaF9pbmRleCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9udF9tYXRyaXggPSBkZWNvZGVyLmZvbnRfbWF0cml4OwotICAgIGZvbnRfb2Zmc2V0ID0gZGVjb2Rlci5mb250X29mZnNldDsKLQotICAgIC8qIHNhdmUgbmV3IGdseXBoIHRhYmxlcyAqLwotICAgIHBzYXV4LT50MV9kZWNvZGVyX2Z1bmNzLT5kb25lKCAmZGVjb2RlciApOwotCi0gICAgLyogbm93IHNldCB0aGUgbWV0cmljcyAtLSB0aGlzIGlzIHJhdGhlciBzaW1wbGUsIGFzICAgICovCi0gICAgLyogdGhlIGxlZnQgc2lkZSBiZWFyaW5nIGlzIHRoZSB4TWluLCBhbmQgdGhlIHRvcCBzaWRlICovCi0gICAgLyogYmVhcmluZyB0aGUgeU1heCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgY2lkZ2x5cGgtPm91dGxpbmUuZmxhZ3MgJj0gRlRfT1VUTElORV9PV05FUjsKLSAgICBjaWRnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTDsKLQotICAgIC8qIGZvciBjb21wb3NpdGUgZ2x5cGhzLCByZXR1cm4gb25seSBsZWZ0IHNpZGUgYmVhcmluZyBhbmQgKi8KLSAgICAvKiBhZHZhbmNlIHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICB7Ci0gICAgICBGVF9TbG90X0ludGVybmFsICBpbnRlcm5hbCA9IGNpZGdseXBoLT5pbnRlcm5hbDsKLQotCi0gICAgICBjaWRnbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1ggPQotICAgICAgICBGSVhFRF9UT19JTlQoIGRlY29kZXIuYnVpbGRlci5sZWZ0X2JlYXJpbmcueCApOwotICAgICAgY2lkZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPQotICAgICAgICBGSVhFRF9UT19JTlQoIGRlY29kZXIuYnVpbGRlci5hZHZhbmNlLnggKTsKLQotICAgICAgaW50ZXJuYWwtPmdseXBoX21hdHJpeCAgICAgID0gZm9udF9tYXRyaXg7Ci0gICAgICBpbnRlcm5hbC0+Z2x5cGhfZGVsdGEgICAgICAgPSBmb250X29mZnNldDsKLSAgICAgIGludGVybmFsLT5nbHlwaF90cmFuc2Zvcm1lZCA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9CQm94ICAgICAgICAgICAgY2JveDsKLSAgICAgIEZUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzID0gJmNpZGdseXBoLT5tZXRyaWNzOwotCi0KLSAgICAgIC8qIGNvcHkgdGhlIF91bnNjYWxlZF8gYWR2YW5jZSB3aWR0aCAqLwotICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPQotICAgICAgICBGSVhFRF9UT19JTlQoIGRlY29kZXIuYnVpbGRlci5hZHZhbmNlLnggKTsKLSAgICAgIGNpZGdseXBoLT5saW5lYXJIb3JpQWR2YW5jZSA9Ci0gICAgICAgIEZJWEVEX1RPX0lOVCggZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueCApOwotICAgICAgY2lkZ2x5cGgtPmludGVybmFsLT5nbHlwaF90cmFuc2Zvcm1lZCA9IDA7Ci0KLSAgICAgIC8qIG1ha2UgdXAgdmVydGljYWwgb25lcyAqLwotICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgICAgICAgID0gKCBmYWNlLT5jaWQuZm9udF9iYm94LnlNYXggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5jaWQuZm9udF9iYm94LnlNaW4gKSA+PiAxNjsKLSAgICAgIGNpZGdseXBoLT5saW5lYXJWZXJ0QWR2YW5jZSA9IG1ldHJpY3MtPnZlcnRBZHZhbmNlOwotCi0gICAgICBjaWRnbHlwaC0+Zm9ybWF0ICAgICAgICAgICAgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsKLQotICAgICAgaWYgKCBjaWRzaXplLT5tZXRyaWNzLnlfcHBlbSA8IDI0ICkKLSAgICAgICAgY2lkZ2x5cGgtPm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTjsKLQotICAgICAgLyogYXBwbHkgdGhlIGZvbnQgbWF0cml4LCBpZiBhbnkgKi8KLSAgICAgIGlmICggZm9udF9tYXRyaXgueHggIT0gMHgxMDAwMEwgfHwgZm9udF9tYXRyaXgueXkgIT0gMHgxMDAwMEwgfHwKLSAgICAgICAgICAgZm9udF9tYXRyaXgueHkgIT0gMCAgICAgICAgfHwgZm9udF9tYXRyaXgueXggIT0gMCAgICAgICAgKQotICAgICAgewotICAgICAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggJmNpZGdseXBoLT5vdXRsaW5lLCAmZm9udF9tYXRyaXggKTsKLQotICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9IEZUX011bEZpeCggbWV0cmljcy0+aG9yaUFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X21hdHJpeC54eCApOwotICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSA9IEZUX011bEZpeCggbWV0cmljcy0+dmVydEFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X21hdHJpeC55eSApOwotICAgICAgfQotCi0gICAgICBpZiAoIGZvbnRfb2Zmc2V0LnggfHwgZm9udF9vZmZzZXQueSApCi0gICAgICB7Ci0gICAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmY2lkZ2x5cGgtPm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9vZmZzZXQueSApOwotCi0gICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICs9IGZvbnRfb2Zmc2V0Lng7Ci0gICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICs9IGZvbnRfb2Zmc2V0Lnk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKQotICAgICAgewotICAgICAgICAvKiBzY2FsZSB0aGUgb3V0bGluZSBhbmQgdGhlIG1ldHJpY3MgKi8KLSAgICAgICAgRlRfSW50ICAgICAgIG47Ci0gICAgICAgIEZUX091dGxpbmUqICBjdXIgPSBkZWNvZGVyLmJ1aWxkZXIuYmFzZTsKLSAgICAgICAgRlRfVmVjdG9yKiAgIHZlYyA9IGN1ci0+cG9pbnRzOwotICAgICAgICBGVF9GaXhlZCAgICAgeF9zY2FsZSA9IGdseXBoLT54X3NjYWxlOwotICAgICAgICBGVF9GaXhlZCAgICAgeV9zY2FsZSA9IGdseXBoLT55X3NjYWxlOwotCi0KLSAgICAgICAgLyogRmlyc3Qgb2YgYWxsLCBzY2FsZSB0aGUgcG9pbnRzICovCi0gICAgICAgIGlmICggIWhpbnRpbmcgfHwgIWRlY29kZXIuYnVpbGRlci5oaW50c19mdW5jcyApCi0gICAgICAgICAgZm9yICggbiA9IGN1ci0+bl9wb2ludHM7IG4gPiAwOyBuLS0sIHZlYysrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2ZWMtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApOwotICAgICAgICAgICAgdmVjLT55ID0gRlRfTXVsRml4KCB2ZWMtPnksIHlfc2NhbGUgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgLyogVGhlbiBzY2FsZSB0aGUgbWV0cmljcyAqLwotICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9IEZUX011bEZpeCggbWV0cmljcy0+aG9yaUFkdmFuY2UsIHhfc2NhbGUgKTsKLSAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPnZlcnRBZHZhbmNlLCB5X3NjYWxlICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvbXB1dGUgdGhlIG90aGVyIG1ldHJpY3MgKi8KLSAgICAgIEZUX091dGxpbmVfR2V0X0NCb3goICZjaWRnbHlwaC0+b3V0bGluZSwgJmNib3ggKTsKLQotICAgICAgbWV0cmljcy0+d2lkdGggID0gY2JveC54TWF4IC0gY2JveC54TWluOwotICAgICAgbWV0cmljcy0+aGVpZ2h0ID0gY2JveC55TWF4IC0gY2JveC55TWluOwotCi0gICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBjYm94LnhNaW47Ci0gICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBjYm94LnlNYXg7Ci0KLSAgICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICAgIHsKLSAgICAgICAgLyogbWFrZSB1cCB2ZXJ0aWNhbCBvbmVzICovCi0gICAgICAgIGZ0X3N5bnRoZXNpemVfdmVydGljYWxfbWV0cmljcyggbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSApOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWRnbG9hZC5oIGIvc3JjL2NpZC9jaWRnbG9hZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjgxNmI1Li4wMDAwMDAwCi0tLSBhL3NyYy9jaWQvY2lkZ2xvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZGdsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDSURHTE9BRF9IXwotI2RlZmluZSBDSURHTE9BRF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImNpZG9ianMuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jaWYgMAotCi0gIC8qIENvbXB1dGUgdGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBvZiBhIGZvbnQgdGhyb3VnaCBxdWljayBwYXJzaW5nICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNpZF9mYWNlX2NvbXB1dGVfbWF4X2FkdmFuY2UoIENJRF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgbWF4X2FkdmFuY2UgKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjaWRfc2xvdF9sb2FkX2dseXBoKCBGVF9HbHlwaFNsb3QgIGdseXBoLCAgICAgICAgIC8qIENJRF9HbHlwaF9TbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwgICAgICAgICAgLyogQ0lEX1NpemUgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogQ0lER0xPQURfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkbG9hZC5jIGIvc3JjL2NpZC9jaWRsb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDcyMjEuLjAwMDAwMDAKLS0tIGEvc3JjL2NpZC9jaWRsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkbG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENJRC1rZXllZCBUeXBlMSBmb250IGxvYWRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0KLSNpbmNsdWRlICJjaWRsb2FkLmgiCi0KLSNpbmNsdWRlICJjaWRlcnJzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jaWRsb2FkCi0KLQotICAvKiByZWFkIGEgc2luZ2xlIG9mZnNldCAqLwotICBGVF9MT0NBTF9ERUYoIEZUX1VMb25nICkKLSAgY2lkX2dldF9vZmZzZXQoIEZUX0J5dGUqICAqc3RhcnQsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlICAgIG9mZnNpemUgKQotICB7Ci0gICAgRlRfVUxvbmcgIHJlc3VsdDsKLSAgICBGVF9CeXRlKiAgcCA9ICpzdGFydDsKLQotCi0gICAgZm9yICggcmVzdWx0ID0gMDsgb2Zmc2l6ZSA+IDA7IG9mZnNpemUtLSApCi0gICAgewotICAgICAgcmVzdWx0IDw8PSA4OwotICAgICAgcmVzdWx0ICB8PSAqcCsrOwotICAgIH0KLQotICAgICpzdGFydCA9IHA7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBUWVBFIDEgU1lNQk9MIFBBUlNJTkcgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2lkX2xvYWRfa2V5d29yZCggQ0lEX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIENJRF9Mb2FkZXIqICAgICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBrZXl3b3JkICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgQ0lEX1BhcnNlciogICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0gICAgRlRfQnl0ZSogICAgICBvYmplY3Q7Ci0gICAgdm9pZCogICAgICAgICBkdW1teV9vYmplY3Q7Ci0gICAgQ0lEX0ZhY2VJbmZvICBjaWQgPSAmZmFjZS0+Y2lkOwotCi0KLSAgICAvKiBpZiB0aGUga2V5d29yZCBoYXMgYSBkZWRpY2F0ZWQgY2FsbGJhY2ssIGNhbGwgaXQgKi8KLSAgICBpZiAoIGtleXdvcmQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9DQUxMQkFDSyApCi0gICAgewotICAgICAga2V5d29yZC0+cmVhZGVyKCAoRlRfRmFjZSlmYWNlLCBwYXJzZXIgKTsKLSAgICAgIGVycm9yID0gcGFyc2VyLT5yb290LmVycm9yOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHdlIG11c3Qgbm93IGNvbXB1dGUgdGhlIGFkZHJlc3Mgb2Ygb3VyIHRhcmdldCBvYmplY3QgKi8KLSAgICBzd2l0Y2ggKCBrZXl3b3JkLT5sb2NhdGlvbiApCi0gICAgewotICAgIGNhc2UgVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk86Ci0gICAgICBvYmplY3QgPSAoRlRfQnl0ZSopY2lkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfSU5GTzoKLSAgICAgIG9iamVjdCA9IChGVF9CeXRlKikmY2lkLT5mb250X2luZm87Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVDFfRklFTERfTE9DQVRJT05fRk9OVF9FWFRSQToKLSAgICAgIG9iamVjdCA9IChGVF9CeXRlKikmZmFjZS0+Zm9udF9leHRyYTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9CQk9YOgotICAgICAgb2JqZWN0ID0gKEZUX0J5dGUqKSZjaWQtPmZvbnRfYmJveDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgQ0lEX0ZhY2VEaWN0ICBkaWN0OwotCi0KLSAgICAgICAgaWYgKCBwYXJzZXItPm51bV9kaWN0IDwgMCB8fCBwYXJzZXItPm51bV9kaWN0ID49IGNpZC0+bnVtX2RpY3RzICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggImNpZF9sb2FkX2tleXdvcmQ6IGludmFsaWQgdXNlIG9mIGAlcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLT5pZGVudCApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBkaWN0ID0gY2lkLT5mb250X2RpY3RzICsgcGFyc2VyLT5udW1fZGljdDsKLSAgICAgICAgc3dpdGNoICgga2V5d29yZC0+bG9jYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgVDFfRklFTERfTE9DQVRJT05fUFJJVkFURToKLSAgICAgICAgICBvYmplY3QgPSAoRlRfQnl0ZSopJmRpY3QtPnByaXZhdGVfZGljdDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIG9iamVjdCA9IChGVF9CeXRlKilkaWN0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZHVtbXlfb2JqZWN0ID0gb2JqZWN0OwotCi0gICAgLyogbm93LCBsb2FkIHRoZSBrZXl3b3JkIGRhdGEgaW4gdGhlIG9iamVjdCdzIGZpZWxkKHMpICovCi0gICAgaWYgKCBrZXl3b3JkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSB8fAotICAgICAgICAga2V5d29yZC0+dHlwZSA9PSBUMV9GSUVMRF9UWVBFX0ZJWEVEX0FSUkFZICAgKQotICAgICAgZXJyb3IgPSBjaWRfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUoICZsb2FkZXItPnBhcnNlciwga2V5d29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXlfb2JqZWN0ICk7Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBjaWRfcGFyc2VyX2xvYWRfZmllbGQoICZsb2FkZXItPnBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCAmZHVtbXlfb2JqZWN0ICk7Ci0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgY2lkX3BhcnNlX2ZvbnRfbWF0cml4KCBDSURfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDSURfUGFyc2VyKiAgcGFyc2VyICkKLSAgewotICAgIENJRF9GYWNlRGljdCAgZGljdDsKLSAgICBGVF9GYWNlICAgICAgIHJvb3QgPSAoRlRfRmFjZSkmZmFjZS0+cm9vdDsKLSAgICBGVF9GaXhlZCAgICAgIHRlbXBbNl07Ci0gICAgRlRfRml4ZWQgICAgICB0ZW1wX3NjYWxlOwotCi0KLSAgICBpZiAoIHBhcnNlci0+bnVtX2RpY3QgPj0gMCAmJiBwYXJzZXItPm51bV9kaWN0IDwgZmFjZS0+Y2lkLm51bV9kaWN0cyApCi0gICAgewotICAgICAgRlRfTWF0cml4KiAgbWF0cml4OwotICAgICAgRlRfVmVjdG9yKiAgb2Zmc2V0OwotICAgICAgRlRfSW50ICAgICAgcmVzdWx0OwotCi0KLSAgICAgIGRpY3QgICA9IGZhY2UtPmNpZC5mb250X2RpY3RzICsgcGFyc2VyLT5udW1fZGljdDsKLSAgICAgIG1hdHJpeCA9ICZkaWN0LT5mb250X21hdHJpeDsKLSAgICAgIG9mZnNldCA9ICZkaWN0LT5mb250X29mZnNldDsKLQotICAgICAgLyogaW5wdXQgaXMgc2NhbGVkIGJ5IDEwMDAgdG8gYWNjb21tb2RhdGUgZGVmYXVsdCBGb250TWF0cml4ICovCi0gICAgICByZXN1bHQgPSBjaWRfcGFyc2VyX3RvX2ZpeGVkX2FycmF5KCBwYXJzZXIsIDYsIHRlbXAsIDMgKTsKLQotICAgICAgaWYgKCByZXN1bHQgPCA2ICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAgIHRlbXBfc2NhbGUgPSBGVF9BQlMoIHRlbXBbM10gKTsKLQotICAgICAgaWYgKCB0ZW1wX3NjYWxlID09IDAgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjaWRfcGFyc2VfZm9udF9tYXRyaXg6IGludmFsaWQgZm9udCBtYXRyaXhcbiIgKSk7Ci0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgfQotCi0gICAgICAvKiBhdHlwaWNhbCBjYXNlICovCi0gICAgICBpZiAoIHRlbXBfc2NhbGUgIT0gMHgxMDAwMEwgKQotICAgICAgewotICAgICAgICAvKiBzZXQgdW5pdHMgcGVyIEVNIGJhc2VkIG9uIEZvbnRNYXRyaXggdmFsdWVzICovCi0gICAgICAgIHJvb3QtPnVuaXRzX3Blcl9FTSA9IChGVF9VU2hvcnQpRlRfRGl2Rml4KCAxMDAwLCB0ZW1wX3NjYWxlICk7Ci0KLSAgICAgICAgdGVtcFswXSA9IEZUX0RpdkZpeCggdGVtcFswXSwgdGVtcF9zY2FsZSApOwotICAgICAgICB0ZW1wWzFdID0gRlRfRGl2Rml4KCB0ZW1wWzFdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICAgIHRlbXBbMl0gPSBGVF9EaXZGaXgoIHRlbXBbMl0sIHRlbXBfc2NhbGUgKTsKLSAgICAgICAgdGVtcFs0XSA9IEZUX0RpdkZpeCggdGVtcFs0XSwgdGVtcF9zY2FsZSApOwotICAgICAgICB0ZW1wWzVdID0gRlRfRGl2Rml4KCB0ZW1wWzVdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICAgIHRlbXBbM10gPSB0ZW1wWzNdIDwgMCA/IC0weDEwMDAwTCA6IDB4MTAwMDBMOwotICAgICAgfQotCi0gICAgICBtYXRyaXgtPnh4ID0gdGVtcFswXTsKLSAgICAgIG1hdHJpeC0+eXggPSB0ZW1wWzFdOwotICAgICAgbWF0cml4LT54eSA9IHRlbXBbMl07Ci0gICAgICBtYXRyaXgtPnl5ID0gdGVtcFszXTsKLQotICAgICAgLyogbm90ZSB0aGF0IHRoZSBmb250IG9mZnNldHMgYXJlIGV4cHJlc3NlZCBpbiBpbnRlZ2VyIGZvbnQgdW5pdHMgKi8KLSAgICAgIG9mZnNldC0+eCAgPSB0ZW1wWzRdID4+IDE2OwotICAgICAgb2Zmc2V0LT55ICA9IHRlbXBbNV0gPj4gMTY7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHBhcnNlX2ZkX2FycmF5KCBDSURfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIENJRF9QYXJzZXIqICBwYXJzZXIgKQotICB7Ci0gICAgQ0lEX0ZhY2VJbmZvICBjaWQgICAgPSAmZmFjZS0+Y2lkOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfU3RyZWFtICAgICBzdHJlYW0gPSBwYXJzZXItPnN0cmVhbTsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9Mb25nICAgICAgIG51bV9kaWN0czsKLQotCi0gICAgbnVtX2RpY3RzID0gY2lkX3BhcnNlcl90b19pbnQoIHBhcnNlciApOwotICAgIGlmICggbnVtX2RpY3RzIDwgMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicGFyc2VfZmRfYXJyYXk6IGludmFsaWQgbnVtYmVyIG9mIGRpY3Rpb25hcmllc1xuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBGREFycmF5IG11c3QgKGF0IGxlYXN0KSBjb250YWluIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBzdHJ1Y3R1cmUgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiAgICVBRE9CZWdpbkZvbnREaWN0ICAgICAgICAgICAgICAxOAotICAgICAqICAgWCBkaWN0IGJlZ2luICAgICAgICAgICAgICAgICAgIDEzCi0gICAgICogICAgIC9Gb250TWF0cml4IFtYIFggWCBYXSAgICAgICAgMjIKLSAgICAgKiAgICAgL1ByaXZhdGUgWCBkaWN0IGJlZ2luICAgICAgICAyMgotICAgICAqICAgICBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0gICAgICogICBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSAgICAgKiAgICVBRE9FbmRGb250RGljdCAgICAgICAgICAgICAgICAxNgotICAgICAqCi0gICAgICogVGhpcyBuZWVkcyAxOCsxMysyMisyMis0KzQrMTY9OTkgYnl0ZXMgb3IgbW9yZS4gIE5vcm1hbGx5LCB5b3UgYWxzbwotICAgICAqIG5lZWQgYSBgZHVwIFgnIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBhbmQgYSBgcHV0JyBhdCB0aGUgZW5kLCBzbyBhCi0gICAgICogcm91Z2ggZ3Vlc3MgdXNpbmcgMTAwIGJ5dGVzIGFzIHRoZSBtaW5pbXVtIGlzIGp1c3RpZmllZC4KLSAgICAgKi8KLSAgICBpZiAoIChGVF9VTG9uZyludW1fZGljdHMgPiBzdHJlYW0tPnNpemUgLyAxMDAgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMCgoICJwYXJzZV9mZF9hcnJheTogYWRqdXN0aW5nIEZEQXJyYXkgc2l6ZSIKLSAgICAgICAgICAgICAgICAgICIgKGZyb20gJWQgdG8gJWQpXG4iLAotICAgICAgICAgICAgICAgICAgbnVtX2RpY3RzLAotICAgICAgICAgICAgICAgICAgc3RyZWFtLT5zaXplIC8gMTAwICkpOwotICAgICAgbnVtX2RpY3RzID0gKEZUX0xvbmcpKCBzdHJlYW0tPnNpemUgLyAxMDAgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFjaWQtPmZvbnRfZGljdHMgKQotICAgIHsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggY2lkLT5mb250X2RpY3RzLCBudW1fZGljdHMgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgY2lkLT5udW1fZGljdHMgPSBudW1fZGljdHM7Ci0KLSAgICAgIC8qIGRvbid0IGZvcmdldCB0byBzZXQgYSBmZXcgZGVmYXVsdHMgKi8KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgY2lkLT5udW1fZGljdHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIENJRF9GYWNlRGljdCAgZGljdCA9IGNpZC0+Zm9udF9kaWN0cyArIG47Ci0KLQotICAgICAgICAvKiBkZWZhdWx0IHZhbHVlIGZvciBsZW5JViAqLwotICAgICAgICBkaWN0LT5wcml2YXRlX2RpY3QubGVuSVYgPSA0OwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogYnkgbWlzdGFrZSwgYGV4cGFuc2lvbl9mYWN0b3InIGFwcGVhcnMgYm90aCBpbiBQU19Qcml2YXRlUmVjICovCi0gIC8qIGFuZCBDSURfRmFjZURpY3RSZWMgKGJvdGggYXJlIHB1YmxpYyBoZWFkZXIgZmlsZXMgYW5kIGNhbid0ICAqLwotICAvKiBjaGFuZ2VkKTsgd2Ugc2ltcGx5IGNvcHkgdGhlIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgcGFyc2VfZXhwYW5zaW9uX2ZhY3RvciggQ0lEX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENJRF9QYXJzZXIqICBwYXJzZXIgKQotICB7Ci0gICAgQ0lEX0ZhY2VEaWN0ICBkaWN0OwotCi0KLSAgICBpZiAoIHBhcnNlci0+bnVtX2RpY3QgPj0gMCAmJiBwYXJzZXItPm51bV9kaWN0IDwgZmFjZS0+Y2lkLm51bV9kaWN0cyApCi0gICAgewotICAgICAgZGljdCA9IGZhY2UtPmNpZC5mb250X2RpY3RzICsgcGFyc2VyLT5udW1fZGljdDsKLQotICAgICAgZGljdC0+ZXhwYW5zaW9uX2ZhY3RvciAgICAgICAgICAgICAgPSBjaWRfcGFyc2VyX3RvX2ZpeGVkKCBwYXJzZXIsIDAgKTsKLSAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5leHBhbnNpb25fZmFjdG9yID0gZGljdC0+ZXhwYW5zaW9uX2ZhY3RvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMKLSAgY29uc3QgVDFfRmllbGRSZWMgIGNpZF9maWVsZF9yZWNvcmRzW10gPQotICB7Ci0KLSNpbmNsdWRlICJjaWR0b2tlbi5oIgotCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJGREFycmF5IiwgICAgICAgICBwYXJzZV9mZF9hcnJheSwgMCApCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJGb250TWF0cml4IiwgICAgICBjaWRfcGFyc2VfZm9udF9tYXRyaXgsIDAgKQotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiRXhwYW5zaW9uRmFjdG9yIiwgcGFyc2VfZXhwYW5zaW9uX2ZhY3RvciwgMCApCi0KLSAgICB7IDAsIFQxX0ZJRUxEX0xPQ0FUSU9OX0NJRF9JTkZPLCBUMV9GSUVMRF9UWVBFX05PTkUsIDAsIDAsIDAsIDAsIDAsIDAgfQotICB9OwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNpZF9wYXJzZV9kaWN0KCBDSURfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIENJRF9Mb2FkZXIqICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplICkKLSAgewotICAgIENJRF9QYXJzZXIqICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0KLQotICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBiYXNlOwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBiYXNlICsgc2l6ZTsKLSAgICBwYXJzZXItPnJvb3QuZXJyb3IgID0gRlRfRXJyX09rOwotCi0gICAgewotICAgICAgRlRfQnl0ZSogIGN1ciAgID0gYmFzZTsKLSAgICAgIEZUX0J5dGUqICBsaW1pdCA9IGN1ciArIHNpemU7Ci0KLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIG5ld2xpbWl0OwotCi0KLSAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IGN1cjsKLSAgICAgICAgY2lkX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuY3Vyc29yID49IGxpbWl0ICkKLSAgICAgICAgICBuZXdsaW1pdCA9IGxpbWl0IC0gMSAtIDE3OwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3bGltaXQgPSBwYXJzZXItPnJvb3QuY3Vyc29yIC0gMTc7Ci0KLSAgICAgICAgLyogbG9vayBmb3IgYCVBRE9CZWdpbkZvbnREaWN0JyAqLwotICAgICAgICBmb3IgKCA7IGN1ciA8IG5ld2xpbWl0OyBjdXIrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICpjdXIgPT0gJyUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgZnRfc3RybmNtcCggKGNoYXIqKWN1ciwgIiVBRE9CZWdpbkZvbnREaWN0IiwgMTcgKSA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpZiAvRkRBcnJheSB3YXMgZm91bmQsIHRoZW4gY2lkLT5udW1fZGljdHMgaXMgPiAwLCBhbmQgKi8KLSAgICAgICAgICAgIC8qIHdlIGNhbiBzdGFydCBpbmNyZWFzaW5nIHBhcnNlci0+bnVtX2RpY3QgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBmYWNlLT5jaWQubnVtX2RpY3RzID4gMCApCi0gICAgICAgICAgICAgIHBhcnNlci0+bnVtX2RpY3QrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgICAgICAvKiBubyBlcnJvciBjYW4gb2NjdXIgaW4gY2lkX3BhcnNlcl9za2lwX3NwYWNlcyAqLwotICAgICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2lkX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBwYXJzZXIgKTsKLSAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuY3Vyc29yID49IGxpbWl0IHx8IHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogbG9vayBmb3IgaW1tZWRpYXRlcyAqLwotICAgICAgICBpZiAoICpjdXIgPT0gJy8nICYmIGN1ciArIDIgPCBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBsZW47Ci0KLQotICAgICAgICAgIGN1cisrOwotICAgICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwotCi0gICAgICAgICAgaWYgKCBsZW4gPiAwICYmIGxlbiA8IDIyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBub3cgY29tcGFyZSB0aGUgaW1tZWRpYXRlIG5hbWUgdG8gdGhlIGtleXdvcmQgdGFibGUgKi8KLSAgICAgICAgICAgIFQxX0ZpZWxkICBrZXl3b3JkID0gKFQxX0ZpZWxkKWNpZF9maWVsZF9yZWNvcmRzOwotCi0KLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0J5dGUqICBuYW1lOwotCi0KLSAgICAgICAgICAgICAgbmFtZSA9IChGVF9CeXRlKilrZXl3b3JkLT5pZGVudDsKLSAgICAgICAgICAgICAgaWYgKCAhbmFtZSApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgaWYgKCBjdXJbMF0gPT0gbmFtZVswXSAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgbGVuID09IGZ0X3N0cmxlbiggKGNvbnN0IGNoYXIqKW5hbWUgKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGVF9VSW50ICBuOwotCi0KLSAgICAgICAgICAgICAgICBmb3IgKCBuID0gMTsgbiA8IGxlbjsgbisrICkKLSAgICAgICAgICAgICAgICAgIGlmICggY3VyW25dICE9IG5hbWVbbl0gKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGlmICggbiA+PSBsZW4gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIHdlIGZvdW5kIGl0IC0gcnVuIHRoZSBwYXJzaW5nIGNhbGxiYWNrICovCi0gICAgICAgICAgICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBjaWRfbG9hZF9rZXl3b3JkKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCApOwotICAgICAgICAgICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLT5yb290LmVycm9yOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGtleXdvcmQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgICAgfQotCi0gICAgICBpZiAoICFmYWNlLT5jaWQubnVtX2RpY3RzICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2lkX3BhcnNlX2RpY3Q6IE5vIGZvbnQgZGljdGlvbmFyeSBmb3VuZFxuIiApKTsKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhcnNlci0+cm9vdC5lcnJvcjsKLSAgfQotCi0KLSAgLyogcmVhZCB0aGUgc3Vicm1hcCBhbmQgdGhlIHN1YnJzIG9mIGVhY2ggZm9udCBkaWN0ICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfcmVhZF9zdWJycyggQ0lEX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgQ0lEX0ZhY2VJbmZvICAgY2lkICAgID0gJmZhY2UtPmNpZDsKLSAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0gPSBmYWNlLT5jaWRfc3RyZWFtOwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotICAgIEZUX0ludCAgICAgICAgIG47Ci0gICAgQ0lEX1N1YnJzICAgICAgc3VicjsKLSAgICBGVF9VSW50ICAgICAgICBtYXhfb2Zmc2V0cyA9IDA7Ci0gICAgRlRfVUxvbmcqICAgICAgb2Zmc2V0cyA9IE5VTEw7Ci0gICAgUFNBdXhfU2VydmljZSAgcHNhdXggPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGZhY2UtPnN1YnJzLCBjaWQtPm51bV9kaWN0cyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHN1YnIgPSBmYWNlLT5zdWJyczsKLSAgICBmb3IgKCBuID0gMDsgbiA8IGNpZC0+bnVtX2RpY3RzOyBuKyssIHN1YnIrKyApCi0gICAgewotICAgICAgQ0lEX0ZhY2VEaWN0ICBkaWN0ICA9IGNpZC0+Zm9udF9kaWN0cyArIG47Ci0gICAgICBGVF9JbnQgICAgICAgIGxlbklWID0gZGljdC0+cHJpdmF0ZV9kaWN0LmxlbklWOwotICAgICAgRlRfVUludCAgICAgICBjb3VudCwgbnVtX3N1YnJzID0gZGljdC0+bnVtX3N1YnJzOwotICAgICAgRlRfVUxvbmcgICAgICBkYXRhX2xlbjsKLSAgICAgIEZUX0J5dGUqICAgICAgcDsKLQotCi0gICAgICBpZiAoICFudW1fc3VicnMgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyogcmVhbGxvY2F0ZSBvZmZzZXRzIGFycmF5IGlmIG5lZWRlZCAqLwotICAgICAgaWYgKCBudW1fc3VicnMgKyAxID4gbWF4X29mZnNldHMgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG51bV9zdWJycyArIDEsIDQgKTsKLQotCi0gICAgICAgIGlmICggbmV3X21heCA8PSBtYXhfb2Zmc2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBvZmZzZXRzLCBtYXhfb2Zmc2V0cywgbmV3X21heCApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgbWF4X29mZnNldHMgPSBuZXdfbWF4OwotICAgICAgfQotCi0gICAgICAvKiByZWFkIHRoZSBzdWJybWFwJ3Mgb2Zmc2V0cyAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggY2lkLT5kYXRhX29mZnNldCArIGRpY3QtPnN1YnJtYXBfb2Zmc2V0ICkgICAgIHx8Ci0gICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCAoIG51bV9zdWJycyArIDEgKSAqIChGVF9VSW50KWRpY3QtPnNkX2J5dGVzICkgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIHAgPSAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3I7Ci0gICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDw9IG51bV9zdWJyczsgY291bnQrKyApCi0gICAgICAgIG9mZnNldHNbY291bnRdID0gY2lkX2dldF9vZmZzZXQoICZwLCAoRlRfQnl0ZSlkaWN0LT5zZF9ieXRlcyApOwotCi0gICAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAgIC8qIG9mZnNldHMgbXVzdCBiZSBvcmRlcmVkICovCi0gICAgICBmb3IgKCBjb3VudCA9IDE7IGNvdW50IDw9IG51bV9zdWJyczsgY291bnQrKyApCi0gICAgICAgIGlmICggb2Zmc2V0c1tjb3VudCAtIDFdID4gb2Zmc2V0c1tjb3VudF0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiY2lkX3JlYWRfc3VicnM6IG9mZnNldHMgYXJlIG5vdCBvcmRlcmVkXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKCBvZmZzZXRzW251bV9zdWJyc10gPiBzdHJlYW0tPnNpemUgLSBjaWQtPmRhdGFfb2Zmc2V0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2lkX3JlYWRfc3VicnM6IHRvbyBsYXJnZSBgc3VicnMnIG9mZnNldHNcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICAvKiBub3csIGNvbXB1dGUgdGhlIHNpemUgb2Ygc3VicnMgY2hhcnN0cmluZ3MsICovCi0gICAgICAvKiBhbGxvY2F0ZSwgYW5kIHJlYWQgdGhlbSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBkYXRhX2xlbiA9IG9mZnNldHNbbnVtX3N1YnJzXSAtIG9mZnNldHNbMF07Ci0KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBzdWJyLT5jb2RlLCBudW1fc3VicnMgKyAxICkgfHwKLSAgICAgICAgICAgRlRfQUxMT0MoIHN1YnItPmNvZGVbMF0sIGRhdGFfbGVuICkgICAgICAgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGNpZC0+ZGF0YV9vZmZzZXQgKyBvZmZzZXRzWzBdICkgfHwKLSAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIHN1YnItPmNvZGVbMF0sIGRhdGFfbGVuICkgICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBzZXQgdXAgcG9pbnRlcnMgKi8KLSAgICAgIGZvciAoIGNvdW50ID0gMTsgY291bnQgPD0gbnVtX3N1YnJzOyBjb3VudCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUxvbmcgIGxlbjsKLQotCi0gICAgICAgIGxlbiAgICAgICAgICAgICAgID0gb2Zmc2V0c1tjb3VudF0gLSBvZmZzZXRzW2NvdW50IC0gMV07Ci0gICAgICAgIHN1YnItPmNvZGVbY291bnRdID0gc3Vici0+Y29kZVtjb3VudCAtIDFdICsgbGVuOwotICAgICAgfQotCi0gICAgICAvKiBkZWNyeXB0IHN1YnJvdXRpbmVzLCBidXQgb25seSBpZiBsZW5JViA+PSAwICovCi0gICAgICBpZiAoIGxlbklWID49IDAgKQotICAgICAgewotICAgICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgbnVtX3N1YnJzOyBjb3VudCsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VMb25nICBsZW47Ci0KLQotICAgICAgICAgIGxlbiA9IG9mZnNldHNbY291bnQgKyAxXSAtIG9mZnNldHNbY291bnRdOwotICAgICAgICAgIHBzYXV4LT50MV9kZWNyeXB0KCBzdWJyLT5jb2RlW2NvdW50XSwgbGVuLCA0MzMwICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc3Vici0+bnVtX3N1YnJzID0gKEZUX0ludCludW1fc3VicnM7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgRlRfRlJFRSggb2Zmc2V0cyApOwotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIGlmICggZmFjZS0+c3VicnMgKQotICAgIHsKLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgY2lkLT5udW1fZGljdHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggZmFjZS0+c3VicnNbbl0uY29kZSApCi0gICAgICAgICAgRlRfRlJFRSggZmFjZS0+c3VicnNbbl0uY29kZVswXSApOwotCi0gICAgICAgIEZUX0ZSRUUoIGZhY2UtPnN1YnJzW25dLmNvZGUgKTsKLSAgICAgIH0KLSAgICAgIEZUX0ZSRUUoIGZhY2UtPnN1YnJzICk7Ci0gICAgfQotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2lkX2luaXRfbG9hZGVyKCBDSURfTG9hZGVyKiAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgIENJRF9GYWNlICAgICBmYWNlICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotCi0gICAgRlRfWkVSTyggbG9hZGVyICk7Ci0gIH0KLQotCi0gIHN0YXRpYyAgdm9pZAotICBjaWRfZG9uZV9sb2FkZXIoIENJRF9Mb2FkZXIqICBsb2FkZXIgKQotICB7Ci0gICAgQ0lEX1BhcnNlciogIHBhcnNlciA9ICZsb2FkZXItPnBhcnNlcjsKLQotCi0gICAgLyogZmluYWxpemUgcGFyc2VyICovCi0gICAgY2lkX3BhcnNlcl9kb25lKCBwYXJzZXIgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNpZF9oZXhfdG9fYmluYXJ5KCBGVF9CeXRlKiAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBkYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBDSURfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLSAgICBGVF9CeXRlICAgIGJ1ZmZlclsyNTZdOwotICAgIEZUX0J5dGUgICAqcCwgKnBsaW1pdDsKLSAgICBGVF9CeXRlICAgKmQsICpkbGltaXQ7Ci0gICAgRlRfQnl0ZSAgICB2YWw7Ci0KLSAgICBGVF9Cb29sICAgIHVwcGVyX25pYmJsZSwgZG9uZTsKLQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZCAgICAgID0gZGF0YTsKLSAgICBkbGltaXQgPSBkICsgZGF0YV9sZW47Ci0gICAgcCAgICAgID0gYnVmZmVyOwotICAgIHBsaW1pdCA9IHA7Ci0KLSAgICB1cHBlcl9uaWJibGUgPSAxOwotICAgIGRvbmUgICAgICAgICA9IDA7Ci0KLSAgICB3aGlsZSAoIGQgPCBkbGltaXQgKQotICAgIHsKLSAgICAgIGlmICggcCA+PSBwbGltaXQgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgb2xkcG9zID0gRlRfU1RSRUFNX1BPUygpOwotICAgICAgICBGVF9VTG9uZyAgc2l6ZSAgID0gc3RyZWFtLT5zaXplIC0gb2xkcG9zOwotCi0KLSAgICAgICAgaWYgKCBzaXplID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRCggYnVmZmVyLCAyNTYgPiBzaXplID8gc2l6ZSA6IDI1NiApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIHAgICAgICA9IGJ1ZmZlcjsKLSAgICAgICAgcGxpbWl0ID0gcCArIEZUX1NUUkVBTV9QT1MoKSAtIG9sZHBvczsKLSAgICAgIH0KLQotICAgICAgaWYgKCBmdF9pc2RpZ2l0KCAqcCApICkKLSAgICAgICAgdmFsID0gKEZUX0J5dGUpKCAqcCAtICcwJyApOwotICAgICAgZWxzZSBpZiAoICpwID49ICdhJyAmJiAqcCA8PSAnZicgKQotICAgICAgICB2YWwgPSAoRlRfQnl0ZSkoICpwIC0gJ2EnICk7Ci0gICAgICBlbHNlIGlmICggKnAgPj0gJ0EnICYmICpwIDw9ICdGJyApCi0gICAgICAgIHZhbCA9IChGVF9CeXRlKSggKnAgLSAnQScgKyAxMCApOwotICAgICAgZWxzZSBpZiAoICpwID09ICcgJyAgfHwKLSAgICAgICAgICAgICAgICAqcCA9PSAnXHQnIHx8Ci0gICAgICAgICAgICAgICAgKnAgPT0gJ1xyJyB8fAotICAgICAgICAgICAgICAgICpwID09ICdcbicgfHwKLSAgICAgICAgICAgICAgICAqcCA9PSAnXGYnIHx8Ci0gICAgICAgICAgICAgICAgKnAgPT0gJ1wwJyApCi0gICAgICB7Ci0gICAgICAgIHArKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggKnAgPT0gJz4nICkKLSAgICAgIHsKLSAgICAgICAgdmFsICA9IDA7Ci0gICAgICAgIGRvbmUgPSAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIHVwcGVyX25pYmJsZSApCi0gICAgICAgICpkID0gKEZUX0J5dGUpKCB2YWwgPDwgNCApOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAqZCA9IChGVF9CeXRlKSggKmQgKyB2YWwgKTsKLSAgICAgICAgZCsrOwotICAgICAgfQotCi0gICAgICB1cHBlcl9uaWJibGUgPSAoRlRfQnl0ZSkoIDEgLSB1cHBlcl9uaWJibGUgKTsKLQotICAgICAgaWYgKCBkb25lICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9mYWNlX29wZW4oIENJRF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgZmFjZV9pbmRleCApCi0gIHsKLSAgICBDSURfTG9hZGVyICAgbG9hZGVyOwotICAgIENJRF9QYXJzZXIqICBwYXJzZXI7Ci0gICAgRlRfTWVtb3J5ICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9JbnQgICAgICAgbjsKLQotICAgIENJRF9GYWNlSW5mbyAgY2lkID0gJmZhY2UtPmNpZDsKLQotICAgIEZUX1VMb25nICBiaW5hcnlfbGVuZ3RoOwotICAgIEZUX1VMb25nICBlbnRyeV9sZW47Ci0KLQotICAgIGNpZF9pbml0X2xvYWRlciggJmxvYWRlciwgZmFjZSApOwotCi0gICAgcGFyc2VyID0gJmxvYWRlci5wYXJzZXI7Ci0gICAgZXJyb3IgPSBjaWRfcGFyc2VyX25ldyggcGFyc2VyLCBmYWNlLT5yb290LnN0cmVhbSwgZmFjZS0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXggKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gY2lkX3BhcnNlX2RpY3QoIGZhY2UsICZsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5wb3N0c2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+cG9zdHNjcmlwdF9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9ORVcoIGZhY2UtPmNpZF9zdHJlYW0gKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIHBhcnNlci0+YmluYXJ5X2xlbmd0aCApCi0gICAgewotICAgICAgaWYgKCBwYXJzZXItPmJpbmFyeV9sZW5ndGggPgotICAgICAgICAgICAgIGZhY2UtPnJvb3Quc3RyZWFtLT5zaXplIC0gcGFyc2VyLT5kYXRhX29mZnNldCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJjaWRfZmFjZV9vcGVuOiBhZGp1c3RpbmcgbGVuZ3RoIG9mIGJpbmFyeSBkYXRhXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAoZnJvbSAlZCB0byAlZCBieXRlcylcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlci0+YmluYXJ5X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5zdHJlYW0tPnNpemUgLSBwYXJzZXItPmRhdGFfb2Zmc2V0ICkpOwotICAgICAgICBwYXJzZXItPmJpbmFyeV9sZW5ndGggPSBmYWNlLT5yb290LnN0cmVhbS0+c2l6ZSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+ZGF0YV9vZmZzZXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIG11c3QgY29udmVydCB0aGUgZGF0YSBzZWN0aW9uIGZyb20gaGV4YWRlY2ltYWwgdG8gYmluYXJ5ICovCi0gICAgICBpZiAoIEZUX0FMTE9DKCBmYWNlLT5iaW5hcnlfZGF0YSwgcGFyc2VyLT5iaW5hcnlfbGVuZ3RoICkgICAgfHwKLSAgICAgICAgICAgRlRfU0VUX0VSUk9SKCBjaWRfaGV4X3RvX2JpbmFyeSggZmFjZS0+YmluYXJ5X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+YmluYXJ5X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5kYXRhX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSApICkgICAgICAgICAgICAgICApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfU3RyZWFtX09wZW5NZW1vcnkoIGZhY2UtPmNpZF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+YmluYXJ5X2RhdGEsIHBhcnNlci0+YmluYXJ5X2xlbmd0aCApOwotICAgICAgY2lkLT5kYXRhX29mZnNldCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAqZmFjZS0+Y2lkX3N0cmVhbSA9ICpmYWNlLT5yb290LnN0cmVhbTsKLSAgICAgIGNpZC0+ZGF0YV9vZmZzZXQgID0gbG9hZGVyLnBhcnNlci5kYXRhX29mZnNldDsKLSAgICB9Ci0KLSAgICAvKiBzYW5pdHkgdGVzdHMgKi8KLQotICAgIGlmICggY2lkLT5mZF9ieXRlcyA8IDAgfHwgY2lkLT5nZF9ieXRlcyA8IDEgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiIKLSAgICAgICAgICAgICAgICAgIiBJbnZhbGlkIGBGREJ5dGVzJyBvciBgR0RCeXRlcycgdmFsdWVcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogYWxsb3cgYXQgbW9zdCAzMmJpdCBvZmZzZXRzICovCi0gICAgaWYgKCBjaWQtPmZkX2J5dGVzID4gNCB8fCBjaWQtPmdkX2J5dGVzID4gNCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiY2lkX3BhcnNlX2RpY3Q6IgotICAgICAgICAgICAgICAgICAiIFZhbHVlcyBvZiBgRkRCeXRlcycgb3IgYEdEQnl0ZXMnIGxhcmdlciB0aGFuIDRcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgIiBhcmUgbm90IHN1cHBvcnRlZFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBiaW5hcnlfbGVuZ3RoID0gZmFjZS0+Y2lkX3N0cmVhbS0+c2l6ZSAtIGNpZC0+ZGF0YV9vZmZzZXQ7Ci0gICAgZW50cnlfbGVuICAgICA9IChGVF9VTG9uZykoIGNpZC0+ZmRfYnl0ZXMgKyBjaWQtPmdkX2J5dGVzICk7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGNpZC0+bnVtX2RpY3RzOyBuKysgKQotICAgIHsKLSAgICAgIENJRF9GYWNlRGljdCAgZGljdCA9IGNpZC0+Zm9udF9kaWN0cyArIG47Ci0KLQotICAgICAgaWYgKCBkaWN0LT5zZF9ieXRlcyA8IDAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAoIGRpY3QtPm51bV9zdWJycyAmJiBkaWN0LT5zZF9ieXRlcyA8IDEgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiBJbnZhbGlkIGBTREJ5dGVzJyB2YWx1ZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZGljdC0+c2RfYnl0ZXMgPiA0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2lkX3BhcnNlX2RpY3Q6IgotICAgICAgICAgICAgICAgICAgICIgVmFsdWVzIG9mIGBTREJ5dGVzJyBsYXJnZXIgdGhhbiA0IgotICAgICAgICAgICAgICAgICAgICIgYXJlIG5vdCBzdXBwb3J0ZWRcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIGRpY3QtPnN1YnJtYXBfb2Zmc2V0ID4gYmluYXJ5X2xlbmd0aCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiBJbnZhbGlkIGBTdWJyTWFwT2Zmc2V0JyB2YWx1ZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGBudW1fc3VicnMnIGlzIHNjYW5uZWQgYXMgYSBzaWduZWQgaW50ZWdlciAqLwotICAgICAgaWYgKCAoRlRfSW50KWRpY3QtPm51bV9zdWJycyA8IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgKCBkaWN0LT5zZF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGRpY3QtPm51bV9zdWJycyA+ICggYmluYXJ5X2xlbmd0aCAtIGRpY3QtPnN1YnJtYXBfb2Zmc2V0ICkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpZGljdC0+c2RfYnl0ZXMgICAgICAgICAgICAgICAgICkgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjaWRfcGFyc2VfZGljdDogSW52YWxpZCBgU3VickNvdW50JyB2YWx1ZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBjaWQtPmNpZG1hcF9vZmZzZXQgPiBiaW5hcnlfbGVuZ3RoICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJjaWRfcGFyc2VfZGljdDogSW52YWxpZCBgQ0lETWFwT2Zmc2V0JyB2YWx1ZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGVudHJ5X2xlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGNpZC0+Y2lkX2NvdW50ID4KLSAgICAgICAgICAgKCBiaW5hcnlfbGVuZ3RoIC0gY2lkLT5jaWRtYXBfb2Zmc2V0ICkgLyBlbnRyeV9sZW4gKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiBJbnZhbGlkIGBDSURDb3VudCcgdmFsdWVcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogd2UgY2FuIG5vdyBzYWZlbHkgcHJvY2VlZCAqLwotICAgIGVycm9yID0gY2lkX3JlYWRfc3VicnMoIGZhY2UgKTsKLQotICBFeGl0OgotICAgIGNpZF9kb25lX2xvYWRlciggJmxvYWRlciApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWRsb2FkLmggYi9zcmMvY2lkL2NpZGxvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhMGU2ZC4uMDAwMDAwMAotLS0gYS9zcmMvY2lkL2NpZGxvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZGxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQta2V5ZWQgVHlwZTEgZm9udCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBDSURMT0FEX0hfCi0jZGVmaW5lIENJRExPQURfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSAiY2lkcGFyc2UuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfTG9hZGVyXwotICB7Ci0gICAgQ0lEX1BhcnNlciAgcGFyc2VyOyAgICAgICAgICAvKiBwYXJzZXIgdXNlZCB0byByZWFkIHRoZSBzdHJlYW0gKi8KLSAgICBGVF9JbnQgICAgICBudW1fY2hhcnM7ICAgICAgIC8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGVuY29kaW5nICovCi0KLSAgfSBDSURfTG9hZGVyOwotCi0KLSAgRlRfTE9DQUwoIEZUX1VMb25nICkKLSAgY2lkX2dldF9vZmZzZXQoIEZUX0J5dGUqKiAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlICAgIG9mZnNpemUgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjaWRfZmFjZV9vcGVuKCBDSURfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGZhY2VfaW5kZXggKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBDSURMT0FEX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2lkL2NpZG9ianMuYyBiL3NyYy9jaWQvY2lkb2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRhOGZmLi4wMDAwMDAwCi0tLSBhL3NyYy9jaWQvY2lkb2Jqcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZG9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgb2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotCi0jaW5jbHVkZSAiY2lkZ2xvYWQuaCIKLSNpbmNsdWRlICJjaWRsb2FkLmgiCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotI2luY2x1ZGUgImNpZGVycnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NpZG9ianMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xPVCAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjaWRfc2xvdF9kb25lKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgc2xvdC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBDSURfRmFjZSAgICAgICAgICBmYWNlOwotICAgIFBTSGludGVyX1NlcnZpY2UgIHBzaGludGVyOwotCi0KLSAgICBmYWNlICAgICA9IChDSURfRmFjZSlzbG90LT5mYWNlOwotICAgIHBzaGludGVyID0gKFBTSGludGVyX1NlcnZpY2UpZmFjZS0+cHNoaW50ZXI7Ci0KLSAgICBpZiAoIHBzaGludGVyICkKLSAgICB7Ci0gICAgICBGVF9Nb2R1bGUgIG1vZHVsZTsKLQotCi0gICAgICBtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBzbG90LT5mYWNlLT5kcml2ZXItPnJvb3QubGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2hpbnRlciIgKTsKLSAgICAgIGlmICggbW9kdWxlICkKLSAgICAgIHsKLSAgICAgICAgVDFfSGludHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICAgICAgZnVuY3MgPSBwc2hpbnRlci0+Z2V0X3QxX2Z1bmNzKCBtb2R1bGUgKTsKLSAgICAgICAgc2xvdC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzID0gKHZvaWQqKWZ1bmNzOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgUFNIX0dsb2JhbHNfRnVuY3MKLSAgY2lkX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MoIENJRF9TaXplICBzaXplICkKLSAgewotICAgIENJRF9GYWNlICAgICAgICAgIGZhY2UgICAgID0gKENJRF9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBQU0hpbnRlcl9TZXJ2aWNlICBwc2hpbnRlciA9IChQU0hpbnRlcl9TZXJ2aWNlKWZhY2UtPnBzaGludGVyOwotICAgIEZUX01vZHVsZSAgICAgICAgIG1vZHVsZTsKLQotCi0gICAgbW9kdWxlID0gRlRfR2V0X01vZHVsZSggc2l6ZS0+cm9vdC5mYWNlLT5kcml2ZXItPnJvb3QubGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNoaW50ZXIiICk7Ci0gICAgcmV0dXJuICggbW9kdWxlICYmIHBzaGludGVyICYmIHBzaGludGVyLT5nZXRfZ2xvYmFsc19mdW5jcyApCi0gICAgICAgICAgID8gcHNoaW50ZXItPmdldF9nbG9iYWxzX2Z1bmNzKCBtb2R1bGUgKQotICAgICAgICAgICA6IDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNpZF9zaXplX2RvbmUoIEZUX1NpemUgIGNpZHNpemUgKSAgICAgICAgIC8qIENJRF9TaXplICovCi0gIHsKLSAgICBDSURfU2l6ZSAgc2l6ZSA9IChDSURfU2l6ZSljaWRzaXplOwotCi0KLSAgICBpZiAoIGNpZHNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YSApCi0gICAgewotICAgICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICAgIGZ1bmNzID0gY2lkX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MoIHNpemUgKTsKLSAgICAgIGlmICggZnVuY3MgKQotICAgICAgICBmdW5jcy0+ZGVzdHJveSggKFBTSF9HbG9iYWxzKWNpZHNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YSApOwotCi0gICAgICBjaWRzaXplLT5pbnRlcm5hbC0+bW9kdWxlX2RhdGEgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9zaXplX2luaXQoIEZUX1NpemUgIGNpZHNpemUgKSAgICAgLyogQ0lEX1NpemUgKi8KLSAgewotICAgIENJRF9TaXplICAgICAgICAgICBzaXplICA9IChDSURfU2l6ZSljaWRzaXplOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3MgPSBjaWRfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggc2l6ZSApOwotCi0KLSAgICBpZiAoIGZ1bmNzICkKLSAgICB7Ci0gICAgICBQU0hfR2xvYmFscyAgIGdsb2JhbHM7Ci0gICAgICBDSURfRmFjZSAgICAgIGZhY2UgPSAoQ0lEX0ZhY2UpY2lkc2l6ZS0+ZmFjZTsKLSAgICAgIENJRF9GYWNlRGljdCAgZGljdCA9IGZhY2UtPmNpZC5mb250X2RpY3RzICsgZmFjZS0+cm9vdC5mYWNlX2luZGV4OwotICAgICAgUFNfUHJpdmF0ZSAgICBwcml2ID0gJmRpY3QtPnByaXZhdGVfZGljdDsKLQotCi0gICAgICBlcnJvciA9IGZ1bmNzLT5jcmVhdGUoIGNpZHNpemUtPmZhY2UtPm1lbW9yeSwgcHJpdiwgJmdsb2JhbHMgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgY2lkc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhID0gZ2xvYmFsczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNpZF9zaXplX3JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICBGVF9SZXF1ZXN0X01ldHJpY3MoIHNpemUtPmZhY2UsIHJlcSApOwotCi0gICAgZnVuY3MgPSBjaWRfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggKENJRF9TaXplKXNpemUgKTsKLQotICAgIGlmICggZnVuY3MgKQotICAgICAgZnVuY3MtPnNldF9zY2FsZSggKFBTSF9HbG9iYWxzKXNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPm1ldHJpY3MueF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPm1ldHJpY3MueV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaWRfZmFjZV9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZXMgYSBnaXZlbiBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgcG9pbnRlciB0byB0aGUgZmFjZSBvYmplY3QgdG8gZGVzdHJveS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNpZF9mYWNlX2RvbmUoIEZUX0ZhY2UgIGNpZGZhY2UgKSAgICAgICAgIC8qIENJRF9GYWNlICovCi0gIHsKLSAgICBDSURfRmFjZSAgICAgIGZhY2UgPSAoQ0lEX0ZhY2UpY2lkZmFjZTsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeTsKLSAgICBDSURfRmFjZUluZm8gIGNpZDsKLSAgICBQU19Gb250SW5mbyAgIGluZm87Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuOwotCi0gICAgY2lkICAgID0gJmZhY2UtPmNpZDsKLSAgICBpbmZvICAgPSAmY2lkLT5mb250X2luZm87Ci0gICAgbWVtb3J5ID0gY2lkZmFjZS0+bWVtb3J5OwotCi0gICAgLyogcmVsZWFzZSBzdWJycyAqLwotICAgIGlmICggZmFjZS0+c3VicnMgKQotICAgIHsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNpZC0+bnVtX2RpY3RzOyBuKysgKQotICAgICAgewotICAgICAgICBDSURfU3VicnMgIHN1YnIgPSBmYWNlLT5zdWJycyArIG47Ci0KLQotICAgICAgICBpZiAoIHN1YnItPmNvZGUgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRlJFRSggc3Vici0+Y29kZVswXSApOwotICAgICAgICAgIEZUX0ZSRUUoIHN1YnItPmNvZGUgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBGVF9GUkVFKCBmYWNlLT5zdWJycyApOwotICAgIH0KLQotICAgIC8qIHJlbGVhc2UgRm9udEluZm8gc3RyaW5ncyAqLwotICAgIEZUX0ZSRUUoIGluZm8tPnZlcnNpb24gKTsKLSAgICBGVF9GUkVFKCBpbmZvLT5ub3RpY2UgKTsKLSAgICBGVF9GUkVFKCBpbmZvLT5mdWxsX25hbWUgKTsKLSAgICBGVF9GUkVFKCBpbmZvLT5mYW1pbHlfbmFtZSApOwotICAgIEZUX0ZSRUUoIGluZm8tPndlaWdodCApOwotCi0gICAgLyogcmVsZWFzZSBmb250IGRpY3Rpb25hcmllcyAqLwotICAgIEZUX0ZSRUUoIGNpZC0+Zm9udF9kaWN0cyApOwotICAgIGNpZC0+bnVtX2RpY3RzID0gMDsKLQotICAgIC8qIHJlbGVhc2Ugb3RoZXIgc3RyaW5ncyAqLwotICAgIEZUX0ZSRUUoIGNpZC0+Y2lkX2ZvbnRfbmFtZSApOwotICAgIEZUX0ZSRUUoIGNpZC0+cmVnaXN0cnkgKTsKLSAgICBGVF9GUkVFKCBjaWQtPm9yZGVyaW5nICk7Ci0KLSAgICBjaWRmYWNlLT5mYW1pbHlfbmFtZSA9IE5VTEw7Ci0gICAgY2lkZmFjZS0+c3R5bGVfbmFtZSAgPSBOVUxMOwotCi0gICAgRlRfRlJFRSggZmFjZS0+YmluYXJ5X2RhdGEgKTsKLSAgICBGVF9GUkVFKCBmYWNlLT5jaWRfc3RyZWFtICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9mYWNlX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gQ0lEIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogVGhlIHNvdXJjZSBmb250IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZvbnQgZmFjZSBpbiB0aGUgcmVzb3VyY2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IE51bWJlciBvZiBhZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogQWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIG5ld2x5IGJ1aWx0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9mYWNlX2luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgY2lkZmFjZSwgICAgICAgIC8qIENJRF9GYWNlICovCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCi0gIHsKLSAgICBDSURfRmFjZSAgICAgICAgICBmYWNlID0gKENJRF9GYWNlKWNpZGZhY2U7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3I7Ci0gICAgUFNBdXhfU2VydmljZSAgICAgcHNhdXg7Ci0gICAgUFNIaW50ZXJfU2VydmljZSAgcHNoaW50ZXI7Ci0KLSAgICBGVF9VTlVTRUQoIG51bV9wYXJhbXMgKTsKLSAgICBGVF9VTlVTRUQoIHBhcmFtcyApOwotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIGNpZGZhY2UtPm51bV9mYWNlcyA9IDE7Ci0KLSAgICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotICAgIGlmICggIXBzYXV4ICkKLSAgICB7Ci0gICAgICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKUZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKAotICAgICAgICAgICAgICAgIEZUX0ZBQ0VfTElCUkFSWSggZmFjZSApLCAicHNhdXgiICk7Ci0KLSAgICAgIGlmICggIXBzYXV4ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2lkX2ZhY2VfaW5pdDogY2Fubm90IGFjY2VzcyBgcHNhdXgnIG1vZHVsZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggTWlzc2luZ19Nb2R1bGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBmYWNlLT5wc2F1eCA9IHBzYXV4OwotICAgIH0KLQotICAgIHBzaGludGVyID0gKFBTSGludGVyX1NlcnZpY2UpZmFjZS0+cHNoaW50ZXI7Ci0gICAgaWYgKCAhcHNoaW50ZXIgKQotICAgIHsKLSAgICAgIHBzaGludGVyID0gKFBTSGludGVyX1NlcnZpY2UpRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgICAgRlRfRkFDRV9MSUJSQVJZKCBmYWNlICksICJwc2hpbnRlciIgKTsKLQotICAgICAgZmFjZS0+cHNoaW50ZXIgPSBwc2hpbnRlcjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTIoKCAiQ0lEIGRyaXZlclxuIiApKTsKLQotICAgIC8qIG9wZW4gdGhlIHRva2VuaXplcjsgdGhpcyB3aWxsIGFsc28gY2hlY2sgdGhlIGZvbnQgZm9ybWF0ICovCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gY2lkX2ZhY2Vfb3BlbiggZmFjZSwgZmFjZV9pbmRleCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogaWYgd2UganVzdCB3YW50ZWQgdG8gY2hlY2sgdGhlIGZvcm1hdCwgbGVhdmUgc3VjY2Vzc2Z1bGx5IG5vdyAqLwotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY2hlY2sgdGhlIGZhY2UgaW5kZXggKi8KLSAgICAvKiBYWFg6IGhhbmRsZSBDSUQgZm9udHMgd2l0aCBtb3JlIHRoYW4gYSBzaW5nbGUgZmFjZSAqLwotICAgIGlmICggKCBmYWNlX2luZGV4ICYgMHhGRkZGICkgIT0gMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiY2lkX2ZhY2VfaW5pdDogaW52YWxpZCBmYWNlIGluZGV4XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIG5vdyBsb2FkIHRoZSBmb250IHByb2dyYW0gaW50byB0aGUgZmFjZSBvYmplY3QgKi8KLQotICAgIC8qIGluaXRpYWxpemUgdGhlIGZhY2Ugb2JqZWN0IGZpZWxkcyAqLwotCi0gICAgLyogc2V0IHVwIHJvb3QgZmFjZSBmaWVsZHMgKi8KLSAgICB7Ci0gICAgICBDSURfRmFjZUluZm8gIGNpZCAgPSAmZmFjZS0+Y2lkOwotICAgICAgUFNfRm9udEluZm8gICBpbmZvID0gJmNpZC0+Zm9udF9pbmZvOwotCi0KLSAgICAgIGNpZGZhY2UtPm51bV9nbHlwaHMgICA9IChGVF9Mb25nKWNpZC0+Y2lkX2NvdW50OwotICAgICAgY2lkZmFjZS0+bnVtX2NoYXJtYXBzID0gMDsKLQotICAgICAgY2lkZmFjZS0+ZmFjZV9pbmRleCA9IGZhY2VfaW5kZXggJiAweEZGRkY7Ci0KLSAgICAgIGNpZGZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgfCAvKiBzY2FsYWJsZSBvdXRsaW5lcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCB8IC8qIGhvcml6b250YWwgZGF0YSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19ISU5URVI7ICAgICAgLyogaGFzIG5hdGl2ZSBoaW50ZXIgKi8KLQotICAgICAgaWYgKCBpbmZvLT5pc19maXhlZF9waXRjaCApCi0gICAgICAgIGNpZGZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIOwotCi0gICAgICAvKiBYWFg6IFRPRE86IGFkZCBrZXJuaW5nIHdpdGggLmFmbSBzdXBwb3J0ICovCi0KLSAgICAgIC8qIGdldCBzdHlsZSBuYW1lIC0tIGJlIGNhcmVmdWwsIHNvbWUgYnJva2VuIGZvbnRzIG9ubHkgKi8KLSAgICAgIC8qIGhhdmUgYSAvRm9udE5hbWUgZGljdGlvbmFyeSBlbnRyeSEgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGNpZGZhY2UtPmZhbWlseV9uYW1lID0gaW5mby0+ZmFtaWx5X25hbWU7Ci0gICAgICAvKiBhc3N1bWUgIlJlZ3VsYXIiIHN0eWxlIGlmIHdlIGRvbid0IGtub3cgYmV0dGVyICovCi0gICAgICBjaWRmYWNlLT5zdHlsZV9uYW1lID0gKGNoYXIgKikiUmVndWxhciI7Ci0gICAgICBpZiAoIGNpZGZhY2UtPmZhbWlseV9uYW1lICkKLSAgICAgIHsKLSAgICAgICAgY2hhciogIGZ1bGwgICA9IGluZm8tPmZ1bGxfbmFtZTsKLSAgICAgICAgY2hhciogIGZhbWlseSA9IGNpZGZhY2UtPmZhbWlseV9uYW1lOwotCi0KLSAgICAgICAgaWYgKCBmdWxsICkKLSAgICAgICAgewotICAgICAgICAgIHdoaWxlICggKmZ1bGwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKmZ1bGwgPT0gKmZhbWlseSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZhbWlseSsrOwotICAgICAgICAgICAgICBmdWxsKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggKmZ1bGwgPT0gJyAnIHx8ICpmdWxsID09ICctJyApCi0gICAgICAgICAgICAgICAgZnVsbCsrOwotICAgICAgICAgICAgICBlbHNlIGlmICggKmZhbWlseSA9PSAnICcgfHwgKmZhbWlseSA9PSAnLScgKQotICAgICAgICAgICAgICAgIGZhbWlseSsrOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoICEqZmFtaWx5ICkKLSAgICAgICAgICAgICAgICAgIGNpZGZhY2UtPnN0eWxlX25hbWUgPSBmdWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGRvIHdlIGhhdmUgYSBgL0ZvbnROYW1lJz8gKi8KLSAgICAgICAgaWYgKCBjaWQtPmNpZF9mb250X25hbWUgKQotICAgICAgICAgIGNpZGZhY2UtPmZhbWlseV9uYW1lID0gY2lkLT5jaWRfZm9udF9uYW1lOwotICAgICAgfQotCi0gICAgICAvKiBjb21wdXRlIHN0eWxlIGZsYWdzICovCi0gICAgICBjaWRmYWNlLT5zdHlsZV9mbGFncyA9IDA7Ci0gICAgICBpZiAoIGluZm8tPml0YWxpY19hbmdsZSApCi0gICAgICAgIGNpZGZhY2UtPnN0eWxlX2ZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfSVRBTElDOwotICAgICAgaWYgKCBpbmZvLT53ZWlnaHQgKQotICAgICAgewotICAgICAgICBpZiAoICFmdF9zdHJjbXAoIGluZm8tPndlaWdodCwgIkJvbGQiICApIHx8Ci0gICAgICAgICAgICAgIWZ0X3N0cmNtcCggaW5mby0+d2VpZ2h0LCAiQmxhY2siICkgKQotICAgICAgICAgIGNpZGZhY2UtPnN0eWxlX2ZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfQk9MRDsKLSAgICAgIH0KLQotICAgICAgLyogbm8gZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKi8KLSAgICAgIGNpZGZhY2UtPm51bV9maXhlZF9zaXplcyA9IDA7Ci0gICAgICBjaWRmYWNlLT5hdmFpbGFibGVfc2l6ZXMgPSBOVUxMOwotCi0gICAgICBjaWRmYWNlLT5iYm94LnhNaW4gPSAgIGNpZC0+Zm9udF9iYm94LnhNaW4gICAgICAgICAgICA+PiAxNjsKLSAgICAgIGNpZGZhY2UtPmJib3gueU1pbiA9ICAgY2lkLT5mb250X2Jib3gueU1pbiAgICAgICAgICAgID4+IDE2OwotICAgICAgLyogbm8gYFUnIHN1ZmZpeCBoZXJlIHRvIDB4RkZGRiEgKi8KLSAgICAgIGNpZGZhY2UtPmJib3gueE1heCA9ICggY2lkLT5mb250X2Jib3gueE1heCArIDB4RkZGRiApID4+IDE2OwotICAgICAgY2lkZmFjZS0+YmJveC55TWF4ID0gKCBjaWQtPmZvbnRfYmJveC55TWF4ICsgMHhGRkZGICkgPj4gMTY7Ci0KLSAgICAgIGlmICggIWNpZGZhY2UtPnVuaXRzX3Blcl9FTSApCi0gICAgICAgIGNpZGZhY2UtPnVuaXRzX3Blcl9FTSA9IDEwMDA7Ci0KLSAgICAgIGNpZGZhY2UtPmFzY2VuZGVyICA9IChGVF9TaG9ydCkoIGNpZGZhY2UtPmJib3gueU1heCApOwotICAgICAgY2lkZmFjZS0+ZGVzY2VuZGVyID0gKEZUX1Nob3J0KSggY2lkZmFjZS0+YmJveC55TWluICk7Ci0KLSAgICAgIGNpZGZhY2UtPmhlaWdodCA9IChGVF9TaG9ydCkoICggY2lkZmFjZS0+dW5pdHNfcGVyX0VNICogMTIgKSAvIDEwICk7Ci0gICAgICBpZiAoIGNpZGZhY2UtPmhlaWdodCA8IGNpZGZhY2UtPmFzY2VuZGVyIC0gY2lkZmFjZS0+ZGVzY2VuZGVyICkKLSAgICAgICAgY2lkZmFjZS0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggY2lkZmFjZS0+YXNjZW5kZXIgLSBjaWRmYWNlLT5kZXNjZW5kZXIgKTsKLQotICAgICAgY2lkZmFjZS0+dW5kZXJsaW5lX3Bvc2l0aW9uICA9IChGVF9TaG9ydClpbmZvLT51bmRlcmxpbmVfcG9zaXRpb247Ci0gICAgICBjaWRmYWNlLT51bmRlcmxpbmVfdGhpY2tuZXNzID0gKEZUX1Nob3J0KWluZm8tPnVuZGVybGluZV90aGlja25lc3M7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaWRfZHJpdmVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIENJRCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjaWRfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgZHJpdmVyICkKLSAgewotICAgIEZUX1VOVVNFRCggZHJpdmVyICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaWRfZHJpdmVyX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZXMgYSBnaXZlbiBDSUQgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBDSUQgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNpZF9kcml2ZXJfZG9uZSggRlRfTW9kdWxlICBkcml2ZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBkcml2ZXIgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWRvYmpzLmggYi9zcmMvY2lkL2NpZG9ianMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjZjg4Ni4uMDAwMDAwMAotLS0gYS9zcmMvY2lkL2NpZG9ianMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRvYmpzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lEIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQ0lET0JKU19IXwotI2RlZmluZSBDSURPQkpTX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIG11c3QgYmUgZGVmaW5lZCBieSB0aGUgaGludGVyICovCi0gIHR5cGVkZWYgc3RydWN0IENJRF9TaXplX0hpbnRzXyAgIENJRF9TaXplX0hpbnRzOwotICB0eXBlZGVmIHN0cnVjdCBDSURfR2x5cGhfSGludHNfICBDSURfR2x5cGhfSGludHM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFR5cGUgMSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IENJRF9Ecml2ZXJSZWNfKiAgQ0lEX0RyaXZlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX1NpemVSZWNfKiAgQ0lEX1NpemU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFR5cGUgMSBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IENJRF9HbHlwaFNsb3RSZWNfKiAgQ0lEX0dseXBoU2xvdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9DaGFyTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGNoYXJhY3RlciBtYXBwaW5nIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUeXBlIDEgZm9ybWF0IGRvZXNuJ3QgdXNlIGEgY2hhcm1hcCBidXQgYW4gZW5jb2RpbmcgdGFibGUuICAgICAqLwotICAvKiAgICBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdXAgY2hhcm1hcCBvYmplY3RzICAgICAgICAgICAgKi8KLSAgLyogICAgY29ycmVzcG9uZGluZyB0byB0aGVzZSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfQ2hhck1hcFJlY18qICBDSURfQ2hhck1hcDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSEVSRSBCRUdJTlMgVEhFIFRZUEUgMSBTUEVDSUZJQyBTVFVGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfU2l6ZVJlY18KLSAgewotICAgIEZUX1NpemVSZWMgIHJvb3Q7Ci0gICAgRlRfQm9vbCAgICAgdmFsaWQ7Ci0KLSAgfSBDSURfU2l6ZVJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfR2x5cGhTbG90UmVjXwotICB7Ci0gICAgRlRfR2x5cGhTbG90UmVjICByb290OwotCi0gICAgRlRfQm9vbCAgICAgICAgICBoaW50OwotICAgIEZUX0Jvb2wgICAgICAgICAgc2NhbGVkOwotCi0gICAgRlRfRml4ZWQgICAgICAgICB4X3NjYWxlOwotICAgIEZUX0ZpeGVkICAgICAgICAgeV9zY2FsZTsKLQotICB9IENJRF9HbHlwaFNsb3RSZWM7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNpZF9zbG90X2RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNpZF9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjaWRfc2l6ZV9kb25lKCBGVF9TaXplICBzaXplICk7ICAgICAgIC8qIENJRF9TaXplICovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2lkX3NpemVfaW5pdCggRlRfU2l6ZSAgc2l6ZSApOyAgICAgICAvKiBDSURfU2l6ZSAqLwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNpZF9zaXplX3JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwgICAgICAvKiBDSURfU2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNpZF9mYWNlX2luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSwgICAgICAgICAgIC8qIENJRF9GYWNlICovCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2lkX2ZhY2VfZG9uZSggRlRfRmFjZSAgZmFjZSApOyAgICAgICAgICAgICAgIC8qIENJRF9GYWNlICovCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjaWRfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgZHJpdmVyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjaWRfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgZHJpdmVyICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogQ0lET0JKU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWRwYXJzZS5jIGIvc3JjL2NpZC9jaWRwYXJzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc2MDliLi4wMDAwMDAwCi0tLSBhL3NyYy9jaWQvY2lkcGFyc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRwYXJzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lELWtleWVkIFR5cGUxIHBhcnNlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotCi0jaW5jbHVkZSAiY2lkcGFyc2UuaCIKLQotI2luY2x1ZGUgImNpZGVycnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NpZHBhcnNlCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBJTlBVVCBTVFJFQU0gUEFSU0VSICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgU1RBUlREQVRBICAgICAgIlN0YXJ0RGF0YSIKLSNkZWZpbmUgU1RBUlREQVRBX0xFTiAgKCBzaXplb2YgKCBTVEFSVERBVEEgKSAtIDEgKQotI2RlZmluZSBTRk5UUyAgICAgICAgICAiL3NmbnRzIgotI2RlZmluZSBTRk5UU19MRU4gICAgICAoIHNpemVvZiAoIFNGTlRTICkgLSAxICkKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjaWRfcGFyc2VyX25ldyggQ0lEX1BhcnNlciogICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgUFNBdXhfU2VydmljZSAgcHNhdXggKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX1VMb25nICBiYXNlX29mZnNldCwgb2Zmc2V0LCBwc19sZW47Ci0gICAgRlRfQnl0ZSAgICpjdXIsICpsaW1pdDsKLSAgICBGVF9CeXRlICAgKmFyZzEsICphcmcyOwotCi0KLSAgICBGVF9aRVJPKCBwYXJzZXIgKTsKLSAgICBwc2F1eC0+cHNfcGFyc2VyX2Z1bmNzLT5pbml0KCAmcGFyc2VyLT5yb290LCAwLCAwLCBtZW1vcnkgKTsKLQotICAgIHBhcnNlci0+c3RyZWFtID0gc3RyZWFtOwotCi0gICAgYmFzZV9vZmZzZXQgPSBGVF9TVFJFQU1fUE9TKCk7Ci0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIGNoZWNrIHRoZSBmb250IGZvcm1hdCBpbiB0aGUgaGVhZGVyICovCi0gICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggMzEgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGZ0X3N0cm5jbXAoIChjaGFyICopc3RyZWFtLT5jdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAiJSFQUy1BZG9iZS0zLjAgUmVzb3VyY2UtQ0lERm9udCIsIDMxICkgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICIgIG5vdCBhIENJRC1rZXllZCBmb250XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICBBZ2FpbjoKLSAgICAvKiBub3csIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgdW50aWwgd2UgZmluZCAqLwotICAgIC8qIGBTdGFydERhdGEnIG9yIGAvc2ZudHMnICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93cyAob21pdHRpbmcgdGhlIGNhc2Ugd2l0aCBsZXNzIHRoYW4gMjU2Ci0gICAgICAgKiBieXRlcyB0byBmaWxsIGZvciBzaW1wbGljaXR5KS4KLSAgICAgICAqCi0gICAgICAgKiAxLiBGaWxsIHRoZSBidWZmZXIgd2l0aCAyNTYgKyBTVEFSVERBVEFfTEVOIGJ5dGVzLgotICAgICAgICoKLSAgICAgICAqIDIuIFNlYXJjaCBmb3IgdGhlIFNUQVJUREFUQSBhbmQgU0ZOVFMgc3RyaW5ncyBhdCBwb3NpdGlvbnMKLSAgICAgICAqICAgIGJ1ZmZlclswXSwgYnVmZmVyWzFdLCAuLi4sCi0gICAgICAgKiAgICBidWZmZXJbMjU1ICsgU1RBUlREQVRBX0xFTiAtIFNGTlRTX0xFTl0uCi0gICAgICAgKgotICAgICAgICogMy4gTW92ZSB0aGUgbGFzdCBTVEFSVERBVEFfTEVOIGJ5dGVzIHRvIGJ1ZmZlclswXS4KLSAgICAgICAqCi0gICAgICAgKiA0LiBGaWxsIHRoZSBidWZmZXIgd2l0aCAyNTYgYnl0ZXMsIHN0YXJ0aW5nIGF0IFNUQVJUREFUQV9MRU4uCi0gICAgICAgKgotICAgICAgICogNS4gUmVwZWF0IHdpdGggc3RlcCAyLgotICAgICAgICoKLSAgICAgICAqLwotICAgICAgRlRfQnl0ZSAgYnVmZmVyWzI1NiArIFNUQVJUREFUQV9MRU4gKyAxXTsKLQotICAgICAgLyogdmFsdWVzIGZvciB0aGUgZmlyc3QgbG9vcCAqLwotICAgICAgRlRfVUxvbmcgIHJlYWRfbGVuICAgID0gMjU2ICsgU1RBUlREQVRBX0xFTjsKLSAgICAgIEZUX1VMb25nICByZWFkX29mZnNldCA9IDA7Ci0gICAgICBGVF9CeXRlKiAgcCAgICAgICAgICAgPSBidWZmZXI7Ci0KLQotICAgICAgZm9yICggb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOyA7IG9mZnNldCArPSAyNTYgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgc3RyZWFtX2xlbjsKLQotCi0gICAgICAgIHN0cmVhbV9sZW4gPSBzdHJlYW0tPnNpemUgLSBGVF9TVFJFQU1fUE9TKCk7Ci0KLSAgICAgICAgcmVhZF9sZW4gPSBGVF9NSU4oIHJlYWRfbGVuLCBzdHJlYW1fbGVuICk7Ci0gICAgICAgIGlmICggRlRfU1RSRUFNX1JFQUQoIHAsIHJlYWRfbGVuICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgY29tcGFyZSB3aXRoIGRhdGEgYmV5b25kIHRoZSBidWZmZXIgKi8KLSAgICAgICAgcFtyZWFkX2xlbl0gPSAnXDAnOwotCi0gICAgICAgIGxpbWl0ID0gcCArIHJlYWRfbGVuIC0gU0ZOVFNfTEVOOwotCi0gICAgICAgIGZvciAoIHAgPSBidWZmZXI7IHAgPCBsaW1pdDsgcCsrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggcFswXSA9PSAnUycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIChjaGFyKilwLCBTVEFSVERBVEEsIFNUQVJUREFUQV9MRU4gKSA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzYXZlIG9mZnNldCBvZiBiaW5hcnkgZGF0YSBhZnRlciBgU3RhcnREYXRhJyAqLwotICAgICAgICAgICAgb2Zmc2V0ICs9IChGVF9VTG9uZykoIHAgLSBidWZmZXIgKSArIFNUQVJUREFUQV9MRU4gKyAxOwotICAgICAgICAgICAgZ290byBGb3VuZDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIHBbMV0gPT0gJ3MnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICBmdF9zdHJuY21wKCAoY2hhciopcCwgU0ZOVFMsIFNGTlRTX0xFTiApID09IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9mZnNldCArPSAoRlRfVUxvbmcpKCBwIC0gYnVmZmVyICkgKyBTRk5UU19MRU4gKyAxOwotICAgICAgICAgICAgZ290byBGb3VuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHJlYWRfb2Zmc2V0ICsgcmVhZF9sZW4gPCBTVEFSVERBVEFfTEVOICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJjaWRfcGFyc2VyX25ldzogbm8gYFN0YXJ0RGF0YScga2V5d29yZCBmb3VuZFxuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgRlRfTUVNX01PVkUoIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArIHJlYWRfb2Zmc2V0ICsgcmVhZF9sZW4gLSBTVEFSVERBVEFfTEVOLAotICAgICAgICAgICAgICAgICAgICAgU1RBUlREQVRBX0xFTiApOwotCi0gICAgICAgIC8qIHZhbHVlcyBmb3IgdGhlIG5leHQgbG9vcCAqLwotICAgICAgICByZWFkX2xlbiAgICA9IDI1NjsKLSAgICAgICAgcmVhZF9vZmZzZXQgPSBTVEFSVERBVEFfTEVOOwotICAgICAgICBwICAgICAgICAgICA9IGJ1ZmZlciArIHJlYWRfb2Zmc2V0OwotICAgICAgfQotICAgIH0KLQotICBGb3VuZDoKLSAgICAvKiBXZSBoYXZlIGZvdW5kIHRoZSBzdGFydCBvZiB0aGUgYmluYXJ5IGRhdGEgb3IgdGhlIGAvc2ZudHMnIHRva2VuLiAqLwotICAgIC8qIE5vdyByZXdpbmQgYW5kIGV4dHJhY3QgdGhlIGZyYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBQb3N0U2NyaXB0ICovCi0gICAgLyogc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHBzX2xlbiA9IG9mZnNldCAtIGJhc2Vfb2Zmc2V0OwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGJhc2Vfb2Zmc2V0ICkgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfRlJBTUVfRVhUUkFDVCggcHNfbGVuLCBwYXJzZXItPnBvc3RzY3JpcHQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBwYXJzZXItPmRhdGFfb2Zmc2V0ICAgID0gb2Zmc2V0OwotICAgIHBhcnNlci0+cG9zdHNjcmlwdF9sZW4gPSBwc19sZW47Ci0gICAgcGFyc2VyLT5yb290LmJhc2UgICAgICA9IHBhcnNlci0+cG9zdHNjcmlwdDsKLSAgICBwYXJzZXItPnJvb3QuY3Vyc29yICAgID0gcGFyc2VyLT5wb3N0c2NyaXB0OwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgICAgPSBwYXJzZXItPnJvb3QuY3Vyc29yICsgcHNfbGVuOwotICAgIHBhcnNlci0+bnVtX2RpY3QgICAgICAgPSAtMTsKLQotICAgIC8qIEZpbmFsbHksIHdlIGNoZWNrIHdoZXRoZXIgYFN0YXJ0RGF0YScgb3IgYC9zZm50cycgd2FzIHJlYWwgLS0gICovCi0gICAgLyogaXQgY291bGQgYmUgaW4gYSBjb21tZW50IG9yIHN0cmluZy4gIFdlIGFsc28gZ2V0IHRoZSBhcmd1bWVudHMgKi8KLSAgICAvKiBvZiBgU3RhcnREYXRhJyB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBkYXRhIGlzIHJlcHJlc2VudGVkIGluICAqLwotICAgIC8qIGJpbmFyeSBvciBoZXggZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBhcmcxID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICBjaWRfcGFyc2VyX3NraXBfUFNfdG9rZW4oIHBhcnNlciApOwotICAgIGNpZF9wYXJzZXJfc2tpcF9zcGFjZXMgICggcGFyc2VyICk7Ci0gICAgYXJnMiA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgY2lkX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBwYXJzZXIgKTsKLSAgICBjaWRfcGFyc2VyX3NraXBfc3BhY2VzICAoIHBhcnNlciApOwotCi0gICAgbGltaXQgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0gICAgY3VyICAgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotCi0gICAgd2hpbGUgKCBjdXIgPD0gbGltaXQgLSBTRk5UU19MRU4gKQotICAgIHsKLSAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBwYXJzZXItPnJvb3QuZXJyb3I7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBjdXJbMF0gPT0gJ1MnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGN1ciA8PSBsaW1pdCAtIFNUQVJUREFUQV9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZnRfc3RybmNtcCggKGNoYXIqKWN1ciwgU1RBUlREQVRBLCBTVEFSVERBVEFfTEVOICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZnRfc3RybmNtcCggKGNoYXIqKWFyZzEsICIoSGV4KSIsIDUgKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0xvbmcgIHRtcCA9IGZ0X3N0cnRvbCggKGNvbnN0IGNoYXIgKilhcmcyLCBOVUxMLCAxMCApOwotCi0KLSAgICAgICAgICBpZiAoIHRtcCA8IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZXJfbmV3OiBpbnZhbGlkIGxlbmd0aCBvZiBoZXggZGF0YVxuIiApKTsKLSAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcGFyc2VyLT5iaW5hcnlfbGVuZ3RoID0gKEZUX1VMb25nKXRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBjdXJbMV0gPT0gJ3MnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIChjaGFyKiljdXIsIFNGTlRTLCBTRk5UU19MRU4gKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggImNpZF9wYXJzZXJfbmV3OiBjYW5ub3QgaGFuZGxlIFR5cGUgMTEgZm9udHNcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBjaWRfcGFyc2VyX3NraXBfUFNfdG9rZW4oIHBhcnNlciApOwotICAgICAgY2lkX3BhcnNlcl9za2lwX3NwYWNlcyAgKCBwYXJzZXIgKTsKLSAgICAgIGFyZzEgPSBhcmcyOwotICAgICAgYXJnMiA9IGN1cjsKLSAgICAgIGN1ciAgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgIH0KLQotICAgIC8qIHdlIGhhdmVuJ3QgZm91bmQgdGhlIGNvcnJlY3QgYFN0YXJ0RGF0YSc7IGdvIGJhY2sgYW5kIGNvbnRpbnVlICovCi0gICAgLyogc2VhcmNoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBwYXJzZXItPnBvc3RzY3JpcHQgKTsKLSAgICBpZiAoICFGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgKQotICAgICAgZ290byBBZ2FpbjsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSN1bmRlZiBTVEFSVERBVEEKLSN1bmRlZiBTVEFSVERBVEFfTEVOCi0jdW5kZWYgU0ZOVFMKLSN1bmRlZiBTRk5UU19MRU4KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNpZF9wYXJzZXJfZG9uZSggQ0lEX1BhcnNlciogIHBhcnNlciApCi0gIHsKLSAgICAvKiBhbHdheXMgZnJlZSB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5ICovCi0gICAgaWYgKCBwYXJzZXItPnBvc3RzY3JpcHQgKQotICAgIHsKLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gcGFyc2VyLT5zdHJlYW07Ci0KLQotICAgICAgRlRfRlJBTUVfUkVMRUFTRSggcGFyc2VyLT5wb3N0c2NyaXB0ICk7Ci0gICAgfQotICAgIHBhcnNlci0+cm9vdC5mdW5jcy5kb25lKCAmcGFyc2VyLT5yb290ICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkcGFyc2UuaCBiL3NyYy9jaWQvY2lkcGFyc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiZWJiOS4uMDAwMDAwMAotLS0gYS9zcmMvY2lkL2NpZHBhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkcGFyc2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENJRC1rZXllZCBUeXBlMSBwYXJzZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIENJRFBBUlNFX0hfCi0jZGVmaW5lIENJRFBBUlNFX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX1BhcnNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBDSURfUGFyc2VyIGlzIGFuIG9iamVjdCB1c2VkIHRvIHBhcnNlIGEgVHlwZSAxIGZvbnRzIHZlcnkgICAgICAgICovCi0gIC8qICAgIHF1aWNrbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICAgICAgICAgIDo6IFRoZSByb290IFBTX1BhcnNlclJlYyBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICAgICAgOjogVGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0ICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgcGFyc2VkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc3RzY3JpcHRfbGVuIDo6IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgcGFyc2VkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YV9vZmZzZXQgICAgOjogVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBiaW5hcnkgZGF0YSAoaS5lLiwgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGVuZCBvZiB0aGUgZGF0YSB0byBiZSBwYXJzZWQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmluYXJ5X2xlbmd0aCAgOjogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBhZnRlciB0aGUgYFN0YXJ0RGF0YScgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgaWYgdGhlIGRhdGEgZm9ybWF0IGlzIGhleGFkZWNpbWFsLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2lkICAgICAgICAgICAgOjogQSBzdHJ1Y3R1cmUgd2hpY2ggaG9sZHMgdGhlIGluZm9ybWF0aW9uIGFib3V0ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2RpY3QgICAgICAgOjogVGhlIG51bWJlciBvZiBmb250IGRpY3Rpb25hcmllcy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0lEX1BhcnNlcl8KLSAgewotICAgIFBTX1BhcnNlclJlYyAgcm9vdDsKLSAgICBGVF9TdHJlYW0gICAgIHN0cmVhbTsKLQotICAgIEZUX0J5dGUqICAgICAgcG9zdHNjcmlwdDsKLSAgICBGVF9VTG9uZyAgICAgIHBvc3RzY3JpcHRfbGVuOwotCi0gICAgRlRfVUxvbmcgICAgICBkYXRhX29mZnNldDsKLQotICAgIEZUX1VMb25nICAgICAgYmluYXJ5X2xlbmd0aDsKLQotICAgIENJRF9GYWNlSW5mbyAgY2lkOwotICAgIEZUX0ludCAgICAgICAgbnVtX2RpY3Q7Ci0KLSAgfSBDSURfUGFyc2VyOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2lkX3BhcnNlcl9uZXcoIENJRF9QYXJzZXIqICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjaWRfcGFyc2VyX2RvbmUoIENJRF9QYXJzZXIqICBwYXJzZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0lORyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBjaWRfcGFyc2VyX3NraXBfc3BhY2VzKCBwICkgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3Muc2tpcF9zcGFjZXMoICYocCktPnJvb3QgKQotI2RlZmluZSBjaWRfcGFyc2VyX3NraXBfUFNfdG9rZW4oIHAgKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy5za2lwX1BTX3Rva2VuKCAmKHApLT5yb290ICkKLQotI2RlZmluZSBjaWRfcGFyc2VyX3RvX2ludCggcCApICAgICAgIChwKS0+cm9vdC5mdW5jcy50b19pbnQoICYocCktPnJvb3QgKQotI2RlZmluZSBjaWRfcGFyc2VyX3RvX2ZpeGVkKCBwLCB0ICkgIChwKS0+cm9vdC5mdW5jcy50b19maXhlZCggJihwKS0+cm9vdCwgdCApCi0KLSNkZWZpbmUgY2lkX3BhcnNlcl90b19jb29yZF9hcnJheSggcCwgbSwgYyApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLnRvX2Nvb3JkX2FycmF5KCAmKHApLT5yb290LCBtLCBjICkKLSNkZWZpbmUgY2lkX3BhcnNlcl90b19maXhlZF9hcnJheSggcCwgbSwgZiwgdCApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLnRvX2ZpeGVkX2FycmF5KCAmKHApLT5yb290LCBtLCBmLCB0ICkKLSNkZWZpbmUgY2lkX3BhcnNlcl90b190b2tlbiggcCwgdCApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLnRvX3Rva2VuKCAmKHApLT5yb290LCB0ICkKLSNkZWZpbmUgY2lkX3BhcnNlcl90b190b2tlbl9hcnJheSggcCwgdCwgbSwgYyApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLnRvX3Rva2VuX2FycmF5KCAmKHApLT5yb290LCB0LCBtLCBjICkKLQotI2RlZmluZSBjaWRfcGFyc2VyX2xvYWRfZmllbGQoIHAsIGYsIG8gKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy5sb2FkX2ZpZWxkKCAmKHApLT5yb290LCBmLCBvLCAwLCAwICkKLSNkZWZpbmUgY2lkX3BhcnNlcl9sb2FkX2ZpZWxkX3RhYmxlKCBwLCBmLCBvICkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MubG9hZF9maWVsZF90YWJsZSggJihwKS0+cm9vdCwgZiwgbywgMCwgMCApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogQ0lEUEFSU0VfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkcml2ZXIuYyBiL3NyYy9jaWQvY2lkcml2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2MTFhOS4uMDAwMDAwMAotLS0gYS9zcmMvY2lkL2NpZHJpdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkcml2ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENJRCBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJjaWRyaXZlci5oIgotI2luY2x1ZGUgImNpZGdsb2FkLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJjaWRlcnJzLmgiCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfRk9OVF9GT1JNQVRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0lORk9fSAotI2luY2x1ZGUgRlRfU0VSVklDRV9DSURfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2lkZHJpdmVyCi0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIGNpZF9nZXRfcG9zdHNjcmlwdF9uYW1lKCBDSURfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBjb25zdCBjaGFyKiAgcmVzdWx0ID0gZmFjZS0+Y2lkLmNpZF9mb250X25hbWU7Ci0KLQotICAgIGlmICggcmVzdWx0ICYmIHJlc3VsdFswXSA9PSAnLycgKQotICAgICAgcmVzdWx0Kys7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9Qc0ZvbnROYW1lUmVjICBjaWRfc2VydmljZV9wc19uYW1lID0KLSAgewotICAgIChGVF9Qc05hbWVfR2V0RnVuYyljaWRfZ2V0X3Bvc3RzY3JpcHRfbmFtZSAgICAvKiBnZXRfcHNfZm9udF9uYW1lICovCi0gIH07Ci0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBJTkZPIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNpZF9wc19nZXRfZm9udF9pbmZvKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBQU19Gb250SW5mb1JlYyogIGFmb250X2luZm8gKQotICB7Ci0gICAgKmFmb250X2luZm8gPSAoKENJRF9GYWNlKWZhY2UpLT5jaWQuZm9udF9pbmZvOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfcHNfZ2V0X2ZvbnRfZXh0cmEoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRFeHRyYVJlYyogIGFmb250X2V4dHJhICkKLSAgewotICAgICphZm9udF9leHRyYSA9ICgoQ0lEX0ZhY2UpZmFjZSktPmZvbnRfZXh0cmE7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNJbmZvUmVjICBjaWRfc2VydmljZV9wc19pbmZvID0KLSAgewotICAgIChQU19HZXRGb250SW5mb0Z1bmMpICAgY2lkX3BzX2dldF9mb250X2luZm8sICAgLyogcHNfZ2V0X2ZvbnRfaW5mbyAgICAqLwotICAgIChQU19HZXRGb250RXh0cmFGdW5jKSAgY2lkX3BzX2dldF9mb250X2V4dHJhLCAgLyogcHNfZ2V0X2ZvbnRfZXh0cmEgICAqLwotICAgIC8qIHVuc3VwcG9ydGVkIHdpdGggQ0lEIGZvbnRzICovCi0gICAgKFBTX0hhc0dseXBoTmFtZXNGdW5jKSBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBwc19oYXNfZ2x5cGhfbmFtZXMgICovCi0gICAgLyogdW5zdXBwb3J0ZWQgICAgICAgICAgICAgICAgKi8KLSAgICAoUFNfR2V0Rm9udFByaXZhdGVGdW5jKU5VTEwsICAgICAgICAgICAgICAgICAgIC8qIHBzX2dldF9mb250X3ByaXZhdGUgKi8KLSAgICAvKiBub3QgaW1wbGVtZW50ZWQgICAgICAgICAgICAqLwotICAgIChQU19HZXRGb250VmFsdWVGdW5jKSAgTlVMTCAgICAgICAgICAgICAgICAgICAgLyogcHNfZ2V0X2ZvbnRfdmFsdWUgICAqLwotICB9OwotCi0KLSAgLyoKLSAgICogIENJRCBJTkZPIFNFUlZJQ0UKLSAgICoKLSAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfZ2V0X3JvcyggQ0lEX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqb3JkZXJpbmcsCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQgKQotICB7Ci0gICAgQ0lEX0ZhY2VJbmZvICBjaWQgPSAmZmFjZS0+Y2lkOwotCi0KLSAgICBpZiAoIHJlZ2lzdHJ5ICkKLSAgICAgICpyZWdpc3RyeSA9IGNpZC0+cmVnaXN0cnk7Ci0KLSAgICBpZiAoIG9yZGVyaW5nICkKLSAgICAgICpvcmRlcmluZyA9IGNpZC0+b3JkZXJpbmc7Ci0KLSAgICBpZiAoIHN1cHBsZW1lbnQgKQotICAgICAgKnN1cHBsZW1lbnQgPSBjaWQtPnN1cHBsZW1lbnQ7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2lkX2dldF9pc19jaWQoIENJRF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgKmlzX2NpZCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVU5VU0VEKCBmYWNlICk7Ci0KLQotICAgIGlmICggaXNfY2lkICkKLSAgICAgICppc19jaWQgPSAxOyAvKiBjaWQgZHJpdmVyIGlzIG9ubHkgdXNlZCBmb3IgQ0lEIGtleWVkIGZvbnRzICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4KCBDSURfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqY2lkICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLQotCi0gICAgaWYgKCBjaWQgKQotICAgICAgKmNpZCA9IGdseXBoX2luZGV4OyAvKiBpZGVudGl0eSBtYXBwaW5nICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX0NJRFJlYyAgY2lkX3NlcnZpY2VfY2lkX2luZm8gPQotICB7Ci0gICAgKEZUX0NJRF9HZXRSZWdpc3RyeU9yZGVyaW5nU3VwcGxlbWVudEZ1bmMpCi0gICAgICBjaWRfZ2V0X3JvcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldF9yb3MgICAgICAgICAgICAgICAgICAqLwotICAgIChGVF9DSURfR2V0SXNJbnRlcm5hbGx5Q0lES2V5ZWRGdW5jKQotICAgICAgY2lkX2dldF9pc19jaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXRfaXNfY2lkICAgICAgICAgICAgICAgKi8KLSAgICAoRlRfQ0lEX0dldENJREZyb21HbHlwaEluZGV4RnVuYykKLSAgICAgIGNpZF9nZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXggICAgICAgICAgICAgLyogZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4ICovCi0gIH07Ci0KLQotICAvKgotICAgKiAgU0VSVklDRSBMSVNUCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2lkX3NlcnZpY2VzW10gPQotICB7Ci0gICAgeyBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgICAgICBGVF9GT05UX0ZPUk1BVF9DSUQgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZjaWRfc2VydmljZV9wc19uYW1lIH0sCi0gICAgeyBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmY2lkX3NlcnZpY2VfcHNfaW5mbyB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9DSUQsICAgICAgICAgICAgICAgICAgJmNpZF9zZXJ2aWNlX2NpZF9pbmZvIH0sCi0gICAgeyBOVUxMLCBOVUxMIH0KLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfTW9kdWxlX0ludGVyZmFjZSApCi0gIGNpZF9nZXRfaW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGNpZF9pbnRlcmZhY2UgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBtb2R1bGUgKTsKLQotICAgIHJldHVybiBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBjaWRfc2VydmljZXMsIGNpZF9pbnRlcmZhY2UgKTsKLSAgfQotCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICB0MWNpZF9kcml2ZXJfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICAgIHwKLSAgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIsCi0gICAgICBzaXplb2YgKCBGVF9Ecml2ZXJSZWMgKSwKLQotICAgICAgInQxY2lkIiwgICAvKiBtb2R1bGUgbmFtZSAgICAgICAgICAgKi8KLSAgICAgIDB4MTAwMDBMLCAgLyogdmVyc2lvbiAxLjAgb2YgZHJpdmVyICovCi0gICAgICAweDIwMDAwTCwgIC8qIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCAqLwotCi0gICAgICBOVUxMLCAgICAvKiBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIGNpZF9kcml2ZXJfaW5pdCwgICAgICAgICAgLyogRlRfTW9kdWxlX0NvbnN0cnVjdG9yICBtb2R1bGVfaW5pdCAgICovCi0gICAgICBjaWRfZHJpdmVyX2RvbmUsICAgICAgICAgIC8qIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgbW9kdWxlX2RvbmUgICAqLwotICAgICAgY2lkX2dldF9pbnRlcmZhY2UgICAgICAgICAvKiBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgIGdldF9pbnRlcmZhY2UgKi8KLSAgICB9LAotCi0gICAgc2l6ZW9mICggQ0lEX0ZhY2VSZWMgKSwKLSAgICBzaXplb2YgKCBDSURfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIENJRF9HbHlwaFNsb3RSZWMgKSwKLQotICAgIGNpZF9mYWNlX2luaXQsICAgICAgICAgICAgICAvKiBGVF9GYWNlX0luaXRGdW5jICBpbml0X2ZhY2UgKi8KLSAgICBjaWRfZmFjZV9kb25lLCAgICAgICAgICAgICAgLyogRlRfRmFjZV9Eb25lRnVuYyAgZG9uZV9mYWNlICovCi0gICAgY2lkX3NpemVfaW5pdCwgICAgICAgICAgICAgIC8qIEZUX1NpemVfSW5pdEZ1bmMgIGluaXRfc2l6ZSAqLwotICAgIGNpZF9zaXplX2RvbmUsICAgICAgICAgICAgICAvKiBGVF9TaXplX0RvbmVGdW5jICBkb25lX3NpemUgKi8KLSAgICBjaWRfc2xvdF9pbml0LCAgICAgICAgICAgICAgLyogRlRfU2xvdF9Jbml0RnVuYyAgaW5pdF9zbG90ICovCi0gICAgY2lkX3Nsb3RfZG9uZSwgICAgICAgICAgICAgIC8qIEZUX1Nsb3RfRG9uZUZ1bmMgIGRvbmVfc2xvdCAqLwotCi0gICAgY2lkX3Nsb3RfbG9hZF9nbHlwaCwgICAgICAgIC8qIEZUX1Nsb3RfTG9hZEZ1bmMgIGxvYWRfZ2x5cGggKi8KLQotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEtlcm5pbmdGdW5jICAgZ2V0X2tlcm5pbmcgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfQXR0YWNoRnVuYyAgICAgICBhdHRhY2hfZmlsZSAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMgIGdldF9hZHZhbmNlcyAqLwotCi0gICAgY2lkX3NpemVfcmVxdWVzdCwgICAgICAgICAgIC8qIEZUX1NpemVfUmVxdWVzdEZ1bmMgIHJlcXVlc3Rfc2l6ZSAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TaXplX1NlbGVjdEZ1bmMgICBzZWxlY3Rfc2l6ZSAgKi8KLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkcml2ZXIuaCBiL3NyYy9jaWQvY2lkcml2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2NDBjNS4uMDAwMDAwMAotLS0gYS9zcmMvY2lkL2NpZHJpdmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRyaXZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBDSUQgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQ0lEUklWRVJfSF8KLSNkZWZpbmUgQ0lEUklWRVJfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotI2Vycm9yICJ0aGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFBJQyB5ZXQiCi0jZW5kaWYKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFCi0gIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyAgdDFjaWRfZHJpdmVyX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIENJRFJJVkVSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2lkL2NpZHRva2VuLmggYi9zcmMvY2lkL2NpZHRva2VuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1M2NjNTUuLjAwMDAwMDAKLS0tIGEvc3JjL2NpZC9jaWR0b2tlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZHRva2VuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgdG9rZW4gZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBDSURfRmFjZUluZm9SZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk8KLQotICBUMV9GSUVMRF9LRVkgICAoICJDSURGb250TmFtZSIsICAgIGNpZF9mb250X25hbWUsIDAgKQotICBUMV9GSUVMRF9GSVhFRCAoICJDSURGb250VmVyc2lvbiIsIGNpZF92ZXJzaW9uLCAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJDSURGb250VHlwZSIsICAgIGNpZF9mb250X3R5cGUsIDAgKQotICBUMV9GSUVMRF9TVFJJTkcoICJSZWdpc3RyeSIsICAgICAgIHJlZ2lzdHJ5LCAgICAgIDAgKQotICBUMV9GSUVMRF9TVFJJTkcoICJPcmRlcmluZyIsICAgICAgIG9yZGVyaW5nLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJTdXBwbGVtZW50IiwgICAgIHN1cHBsZW1lbnQsICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJVSURCYXNlIiwgICAgICAgIHVpZF9iYXNlLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJDSURNYXBPZmZzZXQiLCAgIGNpZG1hcF9vZmZzZXQsIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJGREJ5dGVzIiwgICAgICAgIGZkX2J5dGVzLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJHREJ5dGVzIiwgICAgICAgIGdkX2J5dGVzLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJDSURDb3VudCIsICAgICAgIGNpZF9jb3VudCwgICAgIDAgKQotCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUFNfRm9udEluZm9SZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9JTkZPCi0KLSAgVDFfRklFTERfU1RSSU5HKCAidmVyc2lvbiIsICAgICAgICAgICAgdmVyc2lvbiwgICAgICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX1NUUklORyggIk5vdGljZSIsICAgICAgICAgICAgIG5vdGljZSwgICAgICAgICAgICAgIDAgKQotICBUMV9GSUVMRF9TVFJJTkcoICJGdWxsTmFtZSIsICAgICAgICAgICBmdWxsX25hbWUsICAgICAgICAgICAwICkKLSAgVDFfRklFTERfU1RSSU5HKCAiRmFtaWx5TmFtZSIsICAgICAgICAgZmFtaWx5X25hbWUsICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX1NUUklORyggIldlaWdodCIsICAgICAgICAgICAgIHdlaWdodCwgICAgICAgICAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJJdGFsaWNBbmdsZSIsICAgICAgICBpdGFsaWNfYW5nbGUsICAgICAgICAwICkKLSAgVDFfRklFTERfQk9PTCAgKCAiaXNGaXhlZFBpdGNoIiwgICAgICAgaXNfZml4ZWRfcGl0Y2gsICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIlVuZGVybGluZVBvc2l0aW9uIiwgIHVuZGVybGluZV9wb3NpdGlvbiwgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJVbmRlcmxpbmVUaGlja25lc3MiLCB1bmRlcmxpbmVfdGhpY2tuZXNzLCAwICkKLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBQU19Gb250RXh0cmFSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9FWFRSQQotCi0gIFQxX0ZJRUxEX05VTSAgICggIkZTVHlwZSIsICAgICAgICAgICAgIGZzX3R5cGUsICAgICAgICAgICAgIDAgKQotCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgQ0lEX0ZhY2VEaWN0UmVjCi0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRElDVAotCi0gIFQxX0ZJRUxEX05VTSAgKCAiUGFpbnRUeXBlIiwgICAgICAgICAgcGFpbnRfdHlwZSwgICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgKCAiRm9udFR5cGUiLCAgICAgICAgICAgZm9udF90eXBlLCAgICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgKCAiU3Vick1hcE9mZnNldCIsICAgICAgc3Vicm1hcF9vZmZzZXQsICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgKCAiU0RCeXRlcyIsICAgICAgICAgICAgc2RfYnl0ZXMsICAgICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgKCAiU3VickNvdW50IiwgICAgICAgICAgbnVtX3N1YnJzLCAgICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgKCAibGVuQnVpbGRDaGFyQXJyYXkiLCAgbGVuX2J1aWxkY2hhciwgICAgICAgMCApCi0gIFQxX0ZJRUxEX0ZJWEVEKCAiRm9yY2VCb2xkVGhyZXNob2xkIiwgZm9yY2Vib2xkX3RocmVzaG9sZCwgMCApCi0gIFQxX0ZJRUxEX0ZJWEVEKCAiU3Ryb2tlV2lkdGgiLCAgICAgICAgc3Ryb2tlX3dpZHRoLCAgICAgICAgMCApCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBQU19Qcml2YXRlUmVjCi0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX1BSSVZBVEUKLQotICBUMV9GSUVMRF9OVU0gICAgICAgKCAiVW5pcXVlSUQiLCAgICAgICAgIHVuaXF1ZV9pZCwgICAgICAwICkKLSAgVDFfRklFTERfTlVNICAgICAgICggImxlbklWIiwgICAgICAgICAgICBsZW5JViwgICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICAgICAoICJMYW5ndWFnZUdyb3VwIiwgICAgbGFuZ3VhZ2VfZ3JvdXAsIDAgKQotICBUMV9GSUVMRF9OVU0gICAgICAgKCAicGFzc3dvcmQiLCAgICAgICAgIHBhc3N3b3JkLCAgICAgICAwICkKLQotICBUMV9GSUVMRF9GSVhFRF8xMDAwKCAiQmx1ZVNjYWxlIiwgICAgICAgIGJsdWVfc2NhbGUsICAgICAwICkKLSAgVDFfRklFTERfTlVNICAgICAgICggIkJsdWVTaGlmdCIsICAgICAgICBibHVlX3NoaWZ0LCAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICAgICAoICJCbHVlRnV6eiIsICAgICAgICAgYmx1ZV9mdXp6LCAgICAgIDAgKQotCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJCbHVlVmFsdWVzIiwgICAgICAgYmx1ZV92YWx1ZXMsICAgICAgICAxNCwgMCApCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJPdGhlckJsdWVzIiwgICAgICAgb3RoZXJfYmx1ZXMsICAgICAgICAxMCwgMCApCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJGYW1pbHlCbHVlcyIsICAgICAgZmFtaWx5X2JsdWVzLCAgICAgICAxNCwgMCApCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJGYW1pbHlPdGhlckJsdWVzIiwgZmFtaWx5X290aGVyX2JsdWVzLCAxMCwgMCApCi0KLSAgVDFfRklFTERfTlVNX1RBQkxFMiggIlN0ZEhXIiwgICAgICAgICAgICBzdGFuZGFyZF93aWR0aCwgICAgICAxLCAwICkKLSAgVDFfRklFTERfTlVNX1RBQkxFMiggIlN0ZFZXIiwgICAgICAgICAgICBzdGFuZGFyZF9oZWlnaHQsICAgICAxLCAwICkKLSAgVDFfRklFTERfTlVNX1RBQkxFMiggIk1pbkZlYXR1cmUiLCAgICAgICBtaW5fZmVhdHVyZSwgICAgICAgICAyLCAwICkKLQotICBUMV9GSUVMRF9OVU1fVEFCTEUgKCAiU3RlbVNuYXBIIiwgICAgICAgIHNuYXBfd2lkdGhzLCAgICAgICAgMTIsIDAgKQotICBUMV9GSUVMRF9OVU1fVEFCTEUgKCAiU3RlbVNuYXBWIiwgICAgICAgIHNuYXBfaGVpZ2h0cywgICAgICAgMTIsIDAgKQotCi0gIFQxX0ZJRUxEX0JPT0wgICAgICAoICJGb3JjZUJvbGQiLCAgICAgICAgZm9yY2VfYm9sZCwgICAgICAgICAgMCApCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBGVF9CQm94Ci0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1gKLQotICBUMV9GSUVMRF9CQk9YKCAiRm9udEJCb3giLCB4TWluLCAwICkKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jaWQvbW9kdWxlLm1rIGIvc3JjL2NpZC9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMGI4NjcuLjAwMDAwMDAKLS0tIGEvc3JjL2NpZC9tb2R1bGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgQ0lEIG1vZHVsZSBkZWZpbml0aW9uCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1GVE1PRFVMRV9IX0NPTU1BTkRTICs9IFRZUEUxQ0lEX0RSSVZFUgotCi1kZWZpbmUgVFlQRTFDSURfRFJJVkVSCi0kKE9QRU5fRFJJVkVSKSBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHQxY2lkX2RyaXZlcl9jbGFzcyAkKENMT1NFX0RSSVZFUikKLSQoRUNIT19EUklWRVIpY2lkICAgICAgICQoRUNIT19EUklWRVJfREVTQylQb3N0c2NyaXB0IENJRC1rZXllZCBmb250cywgbm8ga25vd24gZXh0ZW5zaW9uJChFQ0hPX0RSSVZFUl9ET05FKQotZW5kZWYKLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9jaWQvcnVsZXMubWsgYi9zcmMvY2lkL3J1bGVzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2RkZDkyLi4wMDAwMDAwCi0tLSBhL3NyYy9jaWQvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgQ0lEIGRyaXZlciBjb25maWd1cmF0aW9uIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIENJRCBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1DSURfRElSIDo9ICQoU1JDX0RJUikvY2lkCi0KLQotQ0lEX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKENJRF9ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBDSUQgZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1DSURfRFJWX1NSQyA6PSAkKENJRF9ESVIpL2NpZHBhcnNlLmMgXAotICAgICAgICAgICAgICAgJChDSURfRElSKS9jaWRsb2FkLmMgIFwKLSAgICAgICAgICAgICAgICQoQ0lEX0RJUikvY2lkcml2ZXIuYyBcCi0gICAgICAgICAgICAgICAkKENJRF9ESVIpL2NpZGdsb2FkLmMgXAotICAgICAgICAgICAgICAgJChDSURfRElSKS9jaWRvYmpzLmMKLQotIyBDSUQgZHJpdmVyIGhlYWRlcnMKLSMKLUNJRF9EUlZfSCA6PSAkKENJRF9EUlZfU1JDOiUuYz0lLmgpIFwKLSAgICAgICAgICAgICAkKENJRF9ESVIpL2NpZHRva2VuLmggIFwKLSAgICAgICAgICAgICAkKENJRF9ESVIpL2NpZGVycnMuaAotCi0KLSMgQ0lEIGRyaXZlciBvYmplY3QocykKLSMKLSMgICBDSURfRFJWX09CSl9NIGlzIHVzZWQgZHVyaW5nIGBtdWx0aScgYnVpbGRzCi0jICAgQ0lEX0RSVl9PQkpfUyBpcyB1c2VkIGR1cmluZyBgc2luZ2xlJyBidWlsZHMKLSMKLUNJRF9EUlZfT0JKX00gOj0gJChDSURfRFJWX1NSQzokKENJRF9ESVIpLyUuYz0kKE9CSl9ESVIpLyUuJE8pCi1DSURfRFJWX09CSl9TIDo9ICQoT0JKX0RJUikvdHlwZTFjaWQuJE8KLQotIyBDSUQgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLUNJRF9EUlZfU1JDX1MgOj0gJChDSURfRElSKS90eXBlMWNpZC5jCi0KLQotIyBDSUQgZHJpdmVyIC0gc2luZ2xlIG9iamVjdAotIwotJChDSURfRFJWX09CSl9TKTogJChDSURfRFJWX1NSQ19TKSAkKENJRF9EUlZfU1JDKSAkKEZSRUVUWVBFX0gpICQoQ0lEX0RSVl9IKQotCSQoQ0lEX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKENJRF9EUlZfU1JDX1MpKQotCi0KLSMgQ0lEIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChDSURfRElSKS8lLmMgJChGUkVFVFlQRV9IKSAkKENJRF9EUlZfSCkKLQkkKENJRF9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoQ0lEX0RSVl9PQkpfUykKLURSVl9PQkpTX00gKz0gJChDSURfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvY2lkL3R5cGUxY2lkLmMgYi9zcmMvY2lkL3R5cGUxY2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTZmODEuLjAwMDAwMDAKLS0tIGEvc3JjL2NpZC90eXBlMWNpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHlwZTFjaWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIE9wZW5UeXBlIGRyaXZlciBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAiY2lkZ2xvYWQuYyIKLSNpbmNsdWRlICJjaWRsb2FkLmMiCi0jaW5jbHVkZSAiY2lkb2Jqcy5jIgotI2luY2x1ZGUgImNpZHBhcnNlLmMiCi0jaW5jbHVkZSAiY2lkcml2ZXIuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL0phbWZpbGUgYi9zcmMvZ3h2YWxpZC9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTIwMTI4Li4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL2d4dmFsaWQgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5Ci0jIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8gYW5kIFJlZCBIYXQgSy5LLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgZ3h2YWxpZCA7Ci0KLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBneHZic2xuCi0gICAgICAgICAgICAgICBneHZjb21tbgotICAgICAgICAgICAgICAgZ3h2ZmVhdAotICAgICAgICAgICAgICAgZ3h2anVzdAotICAgICAgICAgICAgICAgZ3h2a2VybgotICAgICAgICAgICAgICAgZ3h2bGNhcgotICAgICAgICAgICAgICAgZ3h2bW9kCi0gICAgICAgICAgICAgICBneHZtb3J0Ci0gICAgICAgICAgICAgICBneHZtb3J0MAotICAgICAgICAgICAgICAgZ3h2bW9ydDEKLSAgICAgICAgICAgICAgIGd4dm1vcnQyCi0gICAgICAgICAgICAgICBneHZtb3J0NAotICAgICAgICAgICAgICAgZ3h2bW9ydDUKLSAgICAgICAgICAgICAgIGd4dm1vcngKLSAgICAgICAgICAgICAgIGd4dm1vcngwCi0gICAgICAgICAgICAgICBneHZtb3J4MQotICAgICAgICAgICAgICAgZ3h2bW9yeDIKLSAgICAgICAgICAgICAgIGd4dm1vcng0Ci0gICAgICAgICAgICAgICBneHZtb3J4NQotICAgICAgICAgICAgICAgZ3h2b3BiZAotICAgICAgICAgICAgICAgZ3h2cHJvcAotICAgICAgICAgICAgICAgZ3h2dHJhawotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gZ3h2YWxpZCA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9neHZhbGlkIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL1JFQURNRSBiL3NyYy9neHZhbGlkL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMTQ1OS4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw1MzIgKzAsMCBAQAotZ3h2YWxpZDogVHJ1ZVR5cGUgR1ggdmFsaWRhdG9yCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0xLiBXaGF0IGlzIHRoaXMKLS0tLS0tLS0tLS0tLS0tLQotCi0gIGBneHZhbGlkJyBpcyBhIG1vZHVsZSB0byAgdmFsaWRhdGUgVHJ1ZVR5cGUgR1ggdGFibGVzOiBhIGNvbGxlY3Rpb24gb2YKLSAgYWRkaXRpb25hbCB0YWJsZXMgIGluIFRydWVUeXBlICBmb250IHdoaWNoIGFyZSAgdXNlZCBieSAgYFF1aWNrRHJhdyBHWAotICBUZXh0JywgIEFwcGxlIEFkdmFuY2VkICBUeXBvZ3JhcGh5ICAoQUFUKS4gIEluICBhZGRpdGlvbiwgZ3h2YWxpZCAgY2FuCi0gIHZhbGlkYXRlcyBga2VybicgIHRhYmxlcyB3aGljaCBoYXZlICBiZWVuIGV4dGVuZGVkIGZvciBBQVQuICAgTGlrZSB0aGUKLSAgb3R2YWxpZCAgbW9kdWxlLCAgIGd4dmFsaWQgIHVzZXMgIEZyZWV0eXBlICAgMidzICB2YWxpZGF0b3IgIGZyYW1ld29yawotICAoZnR2YWxpZCkuCi0KLSAgWW91IGNhbiBsaW5rIGd4dmFsaWQgd2l0aCB5b3VyIHByb2dyYW07IGJlZm9yZSBydW5uaW5nIHlvdXIgb3duIGxheW91dAotICBlbmdpbmUsIGd4dmFsaWQgdmFsaWRhdGVzIGEgZm9udCAgZmlsZS4gIEFzIHRoZSByZXN1bHQsIHlvdSBjYW4gcmVtb3ZlCi0gIGVycm9yLWNoZWNraW5nIGNvZGUgIGZyb20gdGhlIGxheW91dCAgZW5naW5lLiAgSXQgaXMgYWxzbyAgcG9zc2libGUgdG8KLSAgdXNlICBneHZhbGlkICBhcyBhICBzdGFuZC1hbG9uZSAgZm9udCAgdmFsaWRhdG9yOyAgdGhlIGBmdHZhbGlkJyAgdGVzdAotICBwcm9ncmFtICBpbmNsdWRlZCAgaW4gdGhlICBmdDJkZW1vICBidW5kbGUgIGNhbGxzIGd4dmFsaWQgIGludGVybmFsbHkuCi0gIEEgc3RhbmQtYWxvbmUgZm9udCB2YWxpZGF0b3IgbWF5IGJlIHVzZWZ1bCBmb3IgZm9udCBkZXZlbG9wZXJzLgotCi0gIFRoaXMgZG9jdW1lbnRzIGRvY3VtZW50cyB0aGUgZm9sbG93aW5nIGlzc3Vlcy4KLQotICAtIHN1cHBvcnRlZCBUcnVlVHlwZSBHWCB0YWJsZXMKLSAgLSBmdW5kYW1lbnRhbCB2YWxpZGF0aW9uIGxpbWl0YXRpb25zCi0gIC0gcGVybWlzc2l2ZSBlcnJvciBoYW5kbGluZyBvZiBicm9rZW4gR1ggdGFibGVzCi0gIC0gYGtlcm4nIHRhYmxlIGlzc3VlLgotCi0KLTIuIFN1cHBvcnRlZCB0YWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBUaGUgZm9sbG93aW5nIEdYIHRhYmxlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4KLQotICAgIGJzbG4KLSAgICBmZWF0Ci0gICAganVzdAotICAgIGtlcm4oKikKLSAgICBsY2FyCi0gICAgbW9ydAotICAgIG1vcngKLSAgICBvcGJkCi0gICAgcHJvcAotICAgIHRyYWsKLQotICBUaGUgZm9sbG93aW5nIEdYIHRhYmxlcyBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkLgotCi0gICAgY3ZhcgotICAgIGZkc2MKLSAgICBmbXR4Ci0gICAgZnZhcgotICAgIGd2YXIKLSAgICBaYXBmCi0KLSAgVGhlIGZvbGxvd2luZyBHWCB0YWJsZXMgd29uJ3QgYmUgc3VwcG9ydGVkLgotCi0gICAgYWNudCgqKikKLSAgICBoc3R5KCoqKikKLQotICBUaGUgZm9sbG93aW5nIHVuZG9jdW1lbnRlZCB0YWJsZXMgaW4gVHJ1ZVR5cGUgZm9udHMgZGVzaWduZWQgZm9yIEFwcGxlCi0gIHBsYXRmb3JtIGFyZW4ndCBoYW5kbGVkIGVpdGhlci4KLQotICAgIGFkZGcKLSAgICBDVlRNCi0gICAgVFBOTQotICAgIHVtaWYKLQotCi0gICopICAgVGhlIGBrZXJuJyAgdmFsaWRhdG9yIGhhbmRsZXMgYm90aCAgdGhlIGNsYXNzaWMgYW5kIHRoZSAgbmV3IGtlcm4KLSAgICAgICBmb3JtYXRzOyAgdGhlIGZvcm1lciAgaXMgc3VwcG9ydGVkICBvbiBib3RoICBNaWNyb3NvZnQgIGFuZCBBcHBsZQotICAgICAgIHBsYXRmb3Jtcywgd2hpbGUgdGhlIGxhdHRlciBpcyBzdXBwb3J0ZWQgb24gQXBwbGUgcGxhdGZvcm1zLgotCi0gICoqKSAgYGFjbnQnIHRhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50bHkgYXZhaWxhYmxlIEFwcGxlIGZvbnQKLSAgICAgICB0b29scy4KLQotICAqKiopIFRoZXJlICBpcyAgb25lIG1vcmUgIEFwcGxlICBleHRlbnNpb24sICBgaHN0eScsICBidXQgIGl0ICBpcyAgZm9yCi0gICAgICAgTmV3dG9uLU9TLCBub3QgR1ggIChOZXd0b24tT1MgaXMgYSBwbGF0Zm9ybSBieSAgQXBwbGUsIGJ1dCBpdCBjYW4KLSAgICAgICB1c2UgIHNmbnQtIGhvdXNlZCBiaXRtYXAgIGZvbnRzIG9ubHkpLiAgIFRoZXJlZm9yZSwgaXQgIHNob3VsZCBiZQotICAgICAgIGV4Y2x1ZGVkICBmcm9tICBgQXBwbGUgIHBsYXRmb3JtJyAgaW4gdGhlICBjb250ZXh0ICBvZiAgVHJ1ZVR5cGUuCi0gICAgICAgZ3h2YWxpZCBpZ25vcmVzIGl0IGFzIEFwcGxlIGZvbnQgdG9vbHMgZG8gc28uCi0KLQotICBXZSBoYXZlICBjaGVja2VkIDE4MyAgZm9udHMgYnVuZGxlZCB3aXRoICBNYWNPUyA5LjEsIE1hY09TICA5LjIsIE1hY09TCi0gIDEwLjAsIE1hY09TIFggMTAuMSwgTVNJRSAgZm9yIE1hY09TLCBhbmQgQXBwbGVXb3JrcyA2LjAuICBJbiBhZGRpdGlvbiwKLSAgd2UgaGF2ZSAgY2hlY2tlZCA2NyBEeW5hbGFiIGZvbnRzICAoZGVzaWduZWQgZm9yIE1hY09TKSAgYW5kIDE4OSBSaWNvaAotICBmb250cyAoZGVzaWduZWQgZm9yIFdpbmRvd3MgYW5kICBNYWNPUyBkdWFsIHBsYXRmb3JtcykuICBUaGUgbnVtYmVyIG9mCi0gIGZvbnRzIGluY2x1ZGluZyBUcnVlVHlwZSBHWCB0YWJsZXMgYXJlIGFzIGZvbGxvd3MuCi0KLSAgICBic2xuOiAgNzYKLSAgICBmZWF0OiAxOTEKLSAgICBqdXN0OiAgODQKLSAgICBrZXJuOiAgNTkKLSAgICBsY2FyOiAgIDQKLSAgICBtb3J0OiAzMjYKLSAgICBtb3J4OiAgMTkKLSAgICBvcGJkOiAgIDQKLSAgICBwcm9wOiAxMTQKLSAgICB0cmFrOiAgMTYKLQotICBEeW5hbGFiICBhbmQgUmljb2ggZm9udHMgIGRvbid0IGhhdmUgIEdYIHRhYmxlcyAgZXhjZXB0IG9mICBgZmVhdCcgYW5kCi0gIGBtb3J0Jy4KLQotCi0zLiBGdW5kYW1lbnRhbCB2YWxpZGF0aW9uIGxpbWl0YXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgVHJ1ZVR5cGUgIEdYICBwcm92aWRlcyAgbGF5b3V0ICAgaW5mb3JtYXRpb24gIHRvICBsaWJyYXJpZXMgIGZvciAgZm9udAotICByYXN0ZXJpemVycyAgYW5kIHRleHQgbGF5b3V0LiAgIGd4dmFsaWQgY2FuICBjaGVjayB3aGV0aGVyICB0aGUgbGF5b3V0Ci0gIGRhdGEgaW4gIGEgZm9udCBpcyBjb25mb3JtYW50ICB0byB0aGUgVHJ1ZVR5cGUgR1ggIGZvcm1hdCBzcGVjaWZpZWQgYnkKLSAgQXBwbGUuICBCdXQgZ3h2YWxpZCBjYW5ub3QgY2hlY2sgIGEgaG93IFF1aWNrRHJhdyBHWC9BQVQgcmVuZGVyZXIgdXNlcwotICB0aGUgc3RvcmVkIGluZm9ybWF0aW9uLgotCi0gIDMtMS4gVmFsaWRhdGlvbiBvZiBTdGF0ZSBNYWNoaW5lIGFjdGl2aXR5Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBRdWlja0RyYXcgR1gvQUFUIHVzZXMgYSBgU3RhdGUgTWFjaGluZScgdG8gcHJvdmlkZSBgc3RhdGVmdWwnIGxheW91dAotICAgIGZlYXR1cmVzLCAgYW5kIFRydWVUeXBlIEdYICBzdG9yZXMgdGhlICBzdGF0ZSB0cmFuc2l0aW9uICBkaWFncmFtIG9mCi0gICAgdGhpcyBgU3RhdGUgIE1hY2hpbmUnIGluIGEgIGBTdGF0ZVRhYmxlJyBkYXRhIHN0cnVjdHVyZS4gICBXaGlsZSB0aGUKLSAgICBTdGF0ZSAgTWFjaGluZSByZWNlaXZlcyAgYSBzZXJpZXMgIG9mIGdseXBoICBJRHMsIHRoZSAgU3RhdGUgTWFjaGluZQotICAgIHN0YXJ0cyB3aXRoIGBzdGFydCAgb2YgdGV4dCcgc3RhdGUsIHdhbGtzIGFyb3VuZCAgdmFyaW91cyBzdGF0ZXMgYW5kCi0gICAgZ2VuZXJhdGVzIHZhcmlvdXMgIGxheW91dCBpbmZvcm1hdGlvbiAgdG8gdGhlICByZW5kZXJlciwgYW5kIGZpbmFsbHkKLSAgICByZWFjaGVzIHRoZSBgZW5kIG9mIHRleHQnIHN0YXRlLgotCi0gICAgZ3h2YWxpZCBjYW4gY2hlY2sgZXNzZW50aWFsIGVycm9ycyBsaWtlOgotCi0gICAgICAtIHBvc3NpYmlsaXR5IG9mIHN0YXRlIHRyYW5zaXRpb25zIHRvIHVuZGVmaW5lZCBzdGF0ZXMKLSAgICAgIC0gZXhpc3RlbmNlIG9mIGdseXBoICBJRHMgdGhhdCB0aGUgU3RhdGUgTWFjaGluZSAgZG9lc24ndCBrbm93IGhvdwotICAgICAgICB0byBoYW5kbGUKLSAgICAgIC0gdGhlICBTdGF0ZSBNYWNoaW5lICBjYW5ub3QgY29tcHV0ZSAgdGhlIGxheW91dCAgaW5mb3JtYXRpb24gZnJvbQotICAgICAgICBnaXZlbiBkaWFncmFtCi0KLSAgICBUaGVzZSBlcnJvcnMgIGNhbiBiZSAgY2hlY2tlZCB3aXRoaW4gZmluaXRlICBzdGVwcywgYW5kICB3aXRob3V0IHRoZQotICAgIFN0YXRlIE1hY2hpbmUgaXRzZWxmLCBiZWNhdXNlIHRoZXNlIGFyZSBgZXhwcmVzc2lvbicgZXJyb3JzIG9mIHN0YXRlCi0gICAgdHJhbnNpdGlvbiBkaWFncmFtLgotCi0gICAgVGhlcmUgIGlzIG5vICBsaW1pdGF0aW9uICBhYm91dCAgaG93IGxvbmcgIHRoZSAgU3RhdGUgTWFjaGluZSAgd2Fsa3MKLSAgICBhcm91bmQsICBzbyB2YWxpZGF0aW9uICBvZiAgdGhlIGFsZ29yaXRobSAgaW4gIHRoZSBzdGF0ZSAgdHJhbnNpdGlvbgotICAgIGRpYWdyYW0gcmVxdWlyZXMgaW5maW5pdGUgIHN0ZXBzLCBldmVuIGlmIHdlIGhhZCAgYSBTdGF0ZSBNYWNoaW5lIGluCi0gICAgZ3h2YWxpZC4gICBUaGVyZWZvcmUsIHRoZSAgZm9sbG93aW5nIGVycm9ycyAgYW5kIHByb2JsZW1zICBjYW5ub3QgYmUKLSAgICBjaGVja2VkLgotCi0gICAgICAtIGV4aXN0ZW5jZSBvZiBzdGF0ZXMgd2hpY2ggdGhlIFN0YXRlIE1hY2hpbmUgbmV2ZXIgdHJhbnNpdHMgdG8KLSAgICAgIC0gdGhlICBwb3NzaWJpbGl0eSB0aGF0IHRoZSAgU3RhdGUgTWFjaGluZSAgbmV2ZXIgcmVhY2hlcyAgYGVuZCBvZgotICAgICAgICB0ZXh0JwotICAgICAgLSB0aGUgcG9zc2liaWxpdHkgb2Ygc3RhY2sgdW5kZXJmbG93L292ZXJmbG93IGluIHRoZSBTdGF0ZSBNYWNoaW5lCi0gICAgICAgIChpbiAgbGlnYXR1cmUgIGFuZCAgY29udGV4dHVhbCAgZ2x5cGggc3Vic3RpdHV0aW9ucywgIHRoZSAgU3RhdGUKLSAgICAgICAgTWFjaGluZSBjYW4gc3RvcmUgMTYgZ2x5cGhzIG9udG8gaXRzIHN0YWNrKQotCi0gICAgSW4gYWRkaXRpb24sIGd4dmFsaWQgZG9lc24ndCBjaGVjayBgdGVtcG9yYXJ5IGdseXBoIElEcycgdXNlZCBpbiB0aGUKLSAgICBjaGFpbmVkIFN0YXRlIE1hY2hpbmVzICAoaW4gYG1vcnQnIGFuZCBgbW9yeCcgdGFibGVzKS4gICBJZiBhIGxheW91dAotICAgIGZlYXR1cmUgIGlzICBpbXBsZW1lbnRlZCBieSAgYSAgc2luZ2xlICBTdGF0ZSAgTWFjaGluZSwgYSAgZ2x5cGggIElECi0gICAgY29udmVydGVkIGJ5IHRoZSBTdGF0ZSBNYWNoaW5lIGlzIHBhc3NlZCB0byB0aGUgZ2x5cGggcmVuZGVyZXIsIHRodXMKLSAgICBpdCAgc2hvdWxkIG5vdCAgcG9pbnQgdG8gIGFuIHVuZGVmaW5lZCAgZ2x5cGggSUQuICAgQnV0IGlmICBhIGxheW91dAotICAgIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQgYnkgIGNoYWluZWQgU3RhdGUgTWFjaGluZXMsIGEgY29tcG9uZW50IFN0YXRlCi0gICAgTWFjaGluZSAgKGlmIGl0ICBpcyAgbm90IHRoZSAgZmluYWwgIG9uZSkgaXMgIHBlcm1pdHRlZCB0byAgZ2VuZXJhdGUKLSAgICB1bmRlZmluZWQgZ2x5cGggSURzIGZvciB0ZW1wb3JhcnkgdXNlLCBiZWNhdXNlIGl0IGlzIGhhbmRsZWQgYnkgbmV4dAotICAgIGNvbXBvbmVudCBTdGF0ZSBNYWNoaW5lIGFuZCBub3QgIGJ5IHRoZSBnbHlwaCByZW5kZXJlci4gIFRvIHZhbGlkYXRlCi0gICAgc3VjaCB0ZW1wb3JhcnkgZ2x5cGggSURzLCBneHZhbGlkIG11c3Qgc3RhY2sgYWxsIHVuZGVmaW5lZCBnbHlwaCBJRHMKLSAgICB3aGljaCAgY2FuIG9jY3VyIGluICB0aGUgb3V0cHV0ICBvZiB0aGUgIHByZXZpb3VzIFN0YXRlICBNYWNoaW5lIGFuZAotICAgIHNlYXJjaCAgdGhlbSBpbiAgdGhlICBgQ2xhc3NUYWJsZScgc3RydWN0dXJlICBvZiAgdGhlIGN1cnJlbnQgIFN0YXRlCi0gICAgTWFjaGluZS4gIEl0IGlzIHRvbyBjb21wbGV4IHRvICBsaXN0IGFsbCBwb3NzaWJsZSBnbHlwaCBJRHMgZnJvbSB0aGUKLSAgICBTdGF0ZVRhYmxlLCBlc3BlY2lhbGx5IGZyb20gYSBsaWdhdHVyZSBzdWJzdGl0dXRpb24gdGFibGUuCi0KLSAgMy0yLiBWYWxpZGF0aW9uIG9mIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG11bHRpcGxlIGxheW91dCBmZWF0dXJlcwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBneHZhbGlkIGRvZXMgIG5vdCB2YWxpZGF0ZSB0aGUgcmVsYXRpb25zaGlwICBiZXR3ZWVuIG11bHRpcGxlIGxheW91dAotICAgIGZlYXR1cmVzIGF0IGFsbC4KLQotICAgIElmICBtdWx0aXBsZSBsYXlvdXQgIGZlYXR1cmVzICBhcmUgZGVmaW5lZCAgaW4gIFRydWVUeXBlIEdYICB0YWJsZXMsCi0gICAgcG9zc2libGUgIGludGVyYWN0aW9ucywgIG92ZXJyaWRlcywgIGFuZCAgY29uZmxpY3RzICBiZXR3ZWVuICBsYXlvdXQKLSAgICBmZWF0dXJlcyBhcmUgaW1wbGljaXRseSAgZ2l2ZW4gaW4gdGhlIGZvbnQgdG9vLiAgIEZvciBleGFtcGxlLCB0aGVyZQotICAgIGFyZSBzZXZlcmFsIHByZWRlZmluZWQgc3BhY2luZyBjb250cm9sIGZlYXR1cmVzOgotCi0gICAgICAtIFRleHQgU3BhY2luZyAgICAgICAgICAoUHJvcG9ydGlvbmFsL01vbm9zcGFjZS9IYWxmLXdpZHRoL05vcm1hbCkKLSAgICAgIC0gTnVtYmVyIFNwYWNpbmcgICAgICAgIChNb25vc3BhY2VkLW51bWJlcnMvUHJvcG9ydGlvbmFsLW51bWJlcnMpCi0gICAgICAtIEthbmEgU3BhY2luZyAgICAgICAgICAoRnVsbC13aWR0aC9Qcm9wb3J0aW9uYWwpCi0gICAgICAtIElkZW9ncmFwaGljIFNwYWNpbmcgICAoRnVsbC13aWR0aC9Qcm9wb3J0aW9uYWwpCi0gICAgICAtIENKSyBSb21hbiBTcGFjaW5nICAgICAoSGFsZi13aWR0aC9Qcm9wb3J0aW9uYWwvRGVmYXVsdC1yb21hbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9GdWxsLXdpZHRoLXJvbWFuL1Byb3BvcnRpb25hbCkKLQotICAgIElmIGFsbCAgbGF5b3V0IGZlYXR1cmVzIGFyZSAgaW5kZXBlbmRlbnRseSBtYW5hZ2VkLCB3ZSAgY2FuIGFjdGl2YXRlCi0gICAgaW5jb25zaXN0ZW50ICB0eXBvZ3JhcGhpYyBydWxlcyAgbGlrZSAgYFRleHQgU3BhY2luZz1Nb25vc3BhY2UnICBhbmQKLSAgICBgSWRlb2dyYXBoaWMgU3BhY2luZz1Qcm9wb3J0aW9uYWwnIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgICBUaGUgY29tYmluYXRpb25zICBvZiBsYXlvdXQgZmVhdHVyZXMgIGlzIG1hbmFnZWQgYnkgYSAgMzJiaXQgaW50ZWdlcgotICAgIChvbmUgYml0IGVhY2ggZm9yIHNlbGVjdG9yICBzZXR0aW5nKSwgc28gd2UgY2FuIGRlZmluZSByZWxhdGlvbnNoaXBzCi0gICAgYmV0d2VlbiAgdXAgIHRvIDMyICBmZWF0dXJlcywgIHRoZW9yZXRpY2FsbHkuICAgQnV0ICBpZiBvbmUgIGZlYXR1cmUKLSAgICBzZXR0aW5nICBhZmZlY3RzICBhbm90aGVyICAgZmVhdHVyZSAgc2V0dGluZywgIHdlICBuZWVkICB0eXBvZ3JhcGhpYwotICAgIHByaW9yaXR5ICBydWxlcyB0byAgdmFsaWRhdGUgdGhlICByZWxhdGlvbnNoaXAuICAgVW5mb3J0dW5hdGVseSwgdGhlCi0gICAgVHJ1ZVR5cGUgR1ggZm9ybWF0IHNwZWNpZmljYXRpb24gZG9lcyBub3QgZ2l2ZSBzdWNoIGluZm9ybWF0aW9uIGV2ZW4KLSAgICBmb3IgcHJlZGVmaW5lZCBmZWF0dXJlcy4KLQotCi00LiBQZXJtaXNzaXZlIGVycm9yIGhhbmRsaW5nIG9mIGJyb2tlbiBHWCB0YWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFdoZW4gIEFwcGxlJ3MgZm9udCAgcmVuZGVyaW5nIHN5c3RlbSAgZmluZHMgYW4gIGluY29uc2lzdGVuY3ksICBsaWtlIGEKLSAgc3BlY2lmaWNhdGlvbiAgdmlvbGF0aW9uIG9yICBhbiAgdW5zcGVjaWZpZWQgdmFsdWUgIGluICBhIFRydWVUeXBlICBHWAotICB0YWJsZSwgaXQgZG9lcyBub3QgYWx3YXlzICByZXR1cm4gZXJyb3IuICBJbiBtb3N0IGNhc2VzLCB0aGUgcmVuZGVyaW5nCi0gIGVuZ2luZSBzaWxlbnRseSAgaWdub3JlcyBzdWNoIHdyb25nICB2YWx1ZXMgb3IgZXZlbiB3aG9sZSAgdGFibGVzLiAgSW4KLSAgZmFjdCwgTWFjT1MgaXMgc2hpcHBlZCB3aXRoICBmb250cyBpbmNsdWRpbmcgYnJva2VuIEdYL0FBVCB0YWJsZXMsIGJ1dAotICBubyBoYXJtZnVsICBlZmZlY3RzIGR1ZSB0byAgYG9mZmljaWFsbHkgYnJva2VuJyBmb250cyBhcmUgIG9ic2VydmVkIGJ5Ci0gIGVuZC11c2Vycy4KLQotICBneHZhbGlkICBpcyBkZXNpZ25lZCAgdG8gY29udGludWUgIHRoZSB2YWxpZGF0aW9uICBwcm9jZXNzIGFzICBsb25nIGFzCi0gIHBvc3NpYmxlLiAgV2hlbiBneHZhbGlkIGZpbmQgd3JvbmcgIHZhbHVlcywgZ3h2YWxpZCB3YXJucyBpdCBhdCBsZWFzdCwKLSAgYW5kIHRha2VzICBhIGZhbGxiYWNrIHByb2NlZHVyZSAgaWYgcG9zc2libGUuICBUaGUgIGZhbGxiYWNrIHByb2NlZHVyZQotICBkZXBlbmRzIG9uIHRoZSBkZWJ1ZyBsZXZlbC4KLQotICBXZSB1c2VkIHRoZSBmb2xsb3dpbmcgdGhyZWUgdG9vbHMgdG8gaW52ZXN0aWdhdGUgQXBwbGUncyBlcnJvciBoYW5kbGluZy4KLQotICAgIC0gRm9udFZhbGlkYXRvciAgKGZvciBNYWNPUyA4LjUgLSA5LjIpICByZXNvdXJjZSBmb3JrIGZvbnQKLSAgICAtIGZ0eHZhbGlkYXRvciAgIChmb3IgTWFjT1MgWCAxMC4xIC0pICAgZGZvbnQgb3IgbmFrZWQtc2ZudAotICAgIC0gZnR4ZHVtcGVyZnVzZXIgKGZvciBNYWNPUyBYIDEwLjEgLSkgICBkZm9udCBvciBuYWtlZC1zZm50Ci0KLSAgSG93ZXZlciwgYWxsIHRlc3RzIHdlcmUgZG9uZSBvbiBhIFBvd2VyUEMgYmFzZWQgTWFjaW50b3NoOyBhdCBwcmVzZW50LAotICB3ZSBoYXZlIG5vdCBjaGVja2VkIHRob3NlIHRvb2xzIG9uIGEgbTY4ay1iYXNlZCBNYWNpbnRvc2guCi0KLSAgSW4gdG90YWwsIHdlIGNoZWNrZWQgMTgzIGZvbnRzICBidW5kbGVkIHRvIE1hY09TIDkuMSwgTWFjT1MgOS4yLCBNYWNPUwotICAxMC4wLCBNYWNPUyBYICAxMC4xLCBNU0lFIGZvciBNYWNPUywgYW5kICBBcHBsZVdvcmtzIDYuMC4gIFRoZXNlIGZvbnRzCi0gIGFyZSBkaXN0cmlidXRlZCAgb2ZmaWNpYWxseSwgYnV0IG1hbnkgYnJva2VuIEdYL0FBVCAgdGFibGVzIHdlcmUgZm91bmQKLSAgYnkgQXBwbGUncyBmb250IHRvb2xzLiAgSW4gdGhlIGZvbGxvd2luZywgd2UgbGlzdCB0eXBpY2FsIHZpb2xhdGlvbiBvZgotICB0aGUgR1ggc3BlY2lmaWNhdGlvbiwgaW4gZm9udHMgb2ZmaWNpYWxseSBkaXN0cmlidXRlZCB3aXRoIHRob3NlIEFwcGxlCi0gIHN5c3RlbXMuCi0KLSAgNC0xLiBicm9rZW4gQmluU3JjaEhlYWRlciAoMTkvMTgzKQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBgQmluU3JjaEhlYWRlcicgaXMgIGEgaGVhZGVyIG9mIGEgIGRhdGEgYXJyYXkgZm9yICBtNjhrIHBsYXRmb3JtcyB0bwotICAgIGFjY2VzcyBtZW1vcnkgZWZmaWNpZW50bHkuICBBbHRob3VnaCAgdGhlcmUgYXJlIG9ubHkgdHdvIGluZGVwZW5kZW50Ci0gICAgcGFyYW1ldGVycyAgZm9yIHJlYWwgIChgdW5pdFNpemUnIGFuZCAgYG5Vbml0cycpLCAgQmluU3JjaEhlYWRlciBoYXMKLSAgICB0aHJlZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgd2hpY2ggIGNhbiBiZSBjYWxjdWxhdGVkIGZyb20gYHVuaXRTaXplJwotICAgIGFuZCAgYG5Vbml0cycsICBmb3IgIGZhc3QgIHNldHVwLiAgIEFwcGxlICBmb250ICB0b29scyAgaWdub3JlICB0aGVtCi0gICAgc2lsZW50bHksIHNvIGd4dmFsaWQgd2FybnMgaWYgaXQgZmluZHMgYW5kIGluY29uc2lzdGVuY3ksIGFuZCBhbHdheXMKLSAgICBjb250aW51ZXMgIHZhbGlkYXRpb24uICAgIFRoZSAgYWRkaXRpb25hbCAgcGFyYW1ldGVycyAgIGFyZSAgaWdub3JlZAotICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbnNpc3RlbmN5LgotCi0gICAgICAxOSAgZm9udHMgaW5jbHVkZSAgc3VjaCAgaW5jb25zaXN0ZW5jaWVzOyBhbGwgIGJyZWFrcyAgYXJlIGluICB0aGUKLSAgICAgIEJpblNyY2hIZWFkZXIgc3RydWN0dXJlIG9mIHRoZSBga2VybicgdGFibGUuCi0KLSAgNC0yLiB0b28tc2hvcnQgTG9va3VwVGFibGUgKDUvMTgzKQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBMb29rdXBUYWJsZSBmb3JtYXQgMCAgaXMgYSBzaW1wbGUgYXJyYXkgdG8gZ2V0IGEgIHZhbHVlIGZyb20gYSBnaXZlbgotICAgIEdJRCAoZ2x5cGggIElEKTsgdGhlIGluZGV4IG9mICB0aGlzIGFycmF5IGlzIGEgIEdJRCB0b28uICBUaGVyZWZvcmUsCi0gICAgdGhlIGxlbmd0aCAgb2YgdGhlIGFycmF5IGlzIGV4cGVjdGVkICB0byBiZSBzYW1lIGFzICB0aGUgbWF4aW11bSBHSUQKLSAgICB2YWx1ZSBkZWZpbmVkICBpbiB0aGUgYG1heHAnIHRhYmxlLCAgYnV0IHRoZXJlIGFyZSAgc29tZSBmb250cyB3aG9zZQotICAgIExvb2t1cFRhYmxlIGZvcm1hdCAwIGlzIHRvbyAgc2hvcnQgdG8gY292ZXIgYWxsIEdJRHMuICBGb250VmFsaWRhdG9yCi0gICAgaWdub3JlcyAgdGhpcyBlcnJvciBzaWxlbnRseSwgIGZ0eHZhbGlkYXRvciBhbmQgIGZ0eGR1bXBlcmZ1c2VyIGJvdGgKLSAgICB3YXJuIGFuZCBjb250aW51ZS4gIFNpbWlsYXIgcHJvYmxlbXMgYXJlIGZvdW5kIGluIGZvcm1hdCAzIHN1YnRhYmxlcwotICAgIG9mIGBrZXJuJy4gIGd4dmFsaWQgIHdhcm5zIGFsd2F5cyBhbmQgYWJvcnQgaWYgIHRoZSB2YWxpZGF0aW9uIGxldmVsCi0gICAgaXMgc2V0IHRvIEZUX1ZBTElEQVRFX1BBUkFOT0lELgotCi0gICAgICA1IGZvbnRzIGluY2x1ZGUgdG9vLXNob3J0IGtlcm4gZm9ybWF0IDAgc3VidGFibGVzLgotICAgICAgMSBmb250IGluY2x1ZGVzIHRvby1zaG9ydCBrZXJuIGZvcm1hdCAzIHN1YnRhYmxlLgotCi0gIDQtMy4gYnJva2VuIExvb2t1cFRhYmxlIGZvcm1hdCAyICgxLzE4MykKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTG9va3VwVGFibGUgIGZvcm1hdCAgMiwgIHN1YmZvcm1hdCAgNCAgY292ZXJzIHRoZSAgR0lEICBzcGFjZSAgYnkgIGEKLSAgICBjb2xsZWN0aW9uICBvZiAgc2VnbWVudHMgd2hpY2ggIGFyZSAgc3BlY2lmaWVkICBieSBgZmlyc3RHbHlwaCcgIGFuZAotICAgIGBsYXN0R2x5cGgnLiAgIFNvbWUgIGZvbnRzICBzdG9yZSAgYGZpcnN0R2x5cGgnIGFuZCAgYGxhc3RHbHlwaCcgIGluCi0gICAgcmV2ZXJzZSBvcmRlciwgIHNvIHRoZSBzZWdtZW50IHNwZWNpZmljYXRpb24gaXMgIGJyb2tlbi4gIEFwcGxlIGZvbnQKLSAgICB0b29scyBpZ25vcmUgdGhpcyBlcnJvciBzaWxlbnRseTsgIGEgYnJva2VuIHNlZ21lbnQgaXMgaWdub3JlZCBhcyBpZgotICAgIGl0ICBkaWQgbm90ICBleGlzdC4gICBneHZhbGlkICB3YXJucyBhbmQgIG5vcm1hbGl6ZSAgdGhlIHNlZ21lbnQgIGF0Ci0gICAgRlRfVkFMSURBVEVfREVGQVVMVCwgb3IgaWdub3JlICB0aGUgc2VnbWVudCBhdCBGVF9WQUxJREFURV9USUdIVCwgb3IKLSAgICBhYm9ydCBhdCBGVF9WQUxJREFURV9QQVJBTk9JRC4KLQotICAgICAgMSBmb250IGluY2x1ZGVzIGJyb2tlbiBMb29rdXBUYWJsZSBmb3JtYXQgMiwgaW4gdGhlIGBqdXN0JyB0YWJsZS4KLQotICAgICopIEl0IHNlZW1zICB0aGF0IGFsbCBmb250cyBtYW51ZmFjdHVyZWQgYnkgIElUQyBmb3IgQXBwbGVXb3JrcyBoYXZlCi0gICAgICAgdGhpcyBlcnJvci4KLQotICA0LTQuIGJhZCBicmFja2V0aW5nIGluIGdseXBoIHByb3BlcnR5ICgxNC8xODMpCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEdYL0FBVCBkZWZpbmVzIGEgIGBicmFja2V0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgZ2x5cGhzICBpbiB0aGUgYHByb3AnCi0gICAgdGFibGUsICB0byBjb250cm9sIGxheW91dCAgZmVhdHVyZXMgb2YgIHN0cmluZ3MgZW5jbG9zZWQgIGluc2lkZSBhbmQKLSAgICBvdXRzaWRlICBvZiAgIGJyYWNrZXRzLiAgIFNvbWUgIGZvbnRzICAgZ2l2ZSAgaW5hcHByb3ByaWF0ZSAgYnJhY2tldAotICAgIHByb3BlcnRpZXMgIHRvIGdseXBocy4gICBBcHBsZSAgZm9udCB0b29scyAgd2FybiAgYWJvdXQgdGhpcyAgZXJyb3I7Ci0gICAgZ3h2YWxpZCB3YXJucyB0b28gYW5kIGFib3J0cyBhdCBGVF9WQUxJREFURV9QQVJBTk9JRC4KLQotICAgICAgMTQgZm9udHMgaW5jbHVkZSB3cm9uZyBicmFja2V0IHByb3BlcnRpZXMuCi0KLQotICA0LTUuIGludmFsaWQgZmVhdHVyZSBudW1iZXIgKDExNy8xODMpCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRoZSBHWC9BQVQgZXh0ZW5zaW9uIGNhbiAgaW5jbHVkZSAyNTUgZGlmZmVyZW50IGxheW91dCBmZWF0dXJlcywgYnV0Ci0gICAgcG9wdWxhciAgICAgIGxheW91dCAgICAgIGZlYXR1cmVzICAgICAgYXJlICAgICAgcHJlZGVmaW5lZCAgICAgIChzZWUKLSAgICBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9SZWdpc3RyeS9pbmRleC5odG1sKS4gICBTb21lICBmb250cwotICAgIGluY2x1ZGUgZmVhdHVyZSAgbnVtYmVycyB3aGljaCBhcmUgaW5jb21wYXRpYmxlICB3aXRoIHRoZSBwcmVkZWZpbmVkCi0gICAgZmVhdHVyZSByZWdpc3RyeS4KLQotICAgIEluIG91ciBzdXJ2ZXksIHRoZXJlIGFyZSAxNDAgZm9udHMgaW5jbHVkaW5nIGBmZWF0JyB0YWJsZS4KLQotICAgIGEpIDY3IGZvbnRzIHVzZSBhIGZlYXR1cmUgbnVtYmVyIHdoaWNoIHNob3VsZCBub3QgYmUgdXNlZC4KLSAgICBiKSAxMTcgZm9udHMgc2V0IHRoZSB3cm9uZyBmZWF0dXJlIHJhbmdlIChuU2V0dGluZykuICBUaGlzIGlzIG1vc3RseQotICAgICAgIGZvdW5kIGluIHRoZSBgbW9ydCcgYW5kIGBtb3J4JyB0YWJsZXMuCi0KLSAgICBBcHBsZSAgZm9udCB0b29scyBnaXZlICBubyB3YXJuaW5nLCAgYWx0aG91Z2ggdGhleSAgY2Fubm90IHJlY29nbml6ZQotICAgIHdoYXQgIHRoZSBmZWF0dXJlICBpcy4gICBBdCBGVF9WQUxJREFURV9ERUZBVUxULCAgZ3h2YWxpZCB3YXJucyAgYnV0Ci0gICAgY29udGludWVzIGluIGJvdGggY2FzZXMgKGEsIGIpLiAgQXQgRlRfVkFMSURBVEVfVElHSFQsIGd4dmFsaWQgd2FybnMKLSAgICBhbmQgYWJvcnRzIGZvciAoYSksIGJ1dCBjb250aW51ZXMgZm9yIChiKS4gIEF0IEZUX1ZBTElEQVRFX1BBUkFOT0lELAotICAgIGd4dmFsaWQgd2FybnMgYW5kIGFib3J0cyBpbiBib3RoIGNhc2VzIChhLCBiKS4KLQotICA0LTYuIGludmFsaWQgcHJvcCB2ZXJzaW9uICgxMC8xODMpCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEFzIG1vc3QgVHJ1ZVR5cGUgR1ggdGFibGVzLCB0aGUgYHByb3AnIHRhYmxlIG11c3Qgc3RhcnQgd2l0aCBhIDMyYml0Ci0gICAgdmVyc2lvbiBpZGVudGlmaWVyOiAweDAwMDEwMDAwLCAgMHgwMDAyMDAwMCBvciAweDAwMDMwMDAwLiAgQnV0IHNvbWUKLSAgICBmb250cyAgc3RvcmUgbm9uc2Vuc2UgYmluYXJ5ICBkYXRhIGluc3RlYWQuICAgV2hlbiBBcHBsZSAgZm9udCB0b29scwotICAgIGZpbmQgdGhlbSwgdGhleSBhYm9ydCB0aGUgcHJvY2Vzc2luZyBpbW1lZGlhdGVseSwgYW5kIHRoZSBkYXRhIHdoaWNoCi0gICAgZm9sbG93cyBpcyB1bmhhbmRsZWQuICBneHZhbGlkIGRvZXMgdGhlIHNhbWUuCi0KLSAgICAgIDEwIGZvbnRzIGluY2x1ZGUgYnJva2VuIGBwcm9wJyB2ZXJzaW9uLgotCi0gICAgQWxsICBvZiB0aGVzZSAgZm9udHMgYXJlICBjbGFzc2ljICBUcnVlVHlwZSBmb250cyAgZm9yIHRoZSAgSmFwYW5lc2UKLSAgICBzY3JpcHQsIG1hbnVmYWN0dXJlZCBieSBBcHBsZS4KLQotICA0LTcuIHVua25vd24gcmVzb3VyY2UgbmFtZSAoMi8xODMpCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTk9URTogVEhJUyBJUyBOT1QgQSBUUlVFVFlQRSBHWCBFUlJPUi4KLQotICAgIElmICBhIFRydWVUeXBlICBmb250IGlzICBzdG9yZWQgIGluIHRoZSAgcmVzb3VyY2UgZm9yayAgb3IgaW4gIGRmb250Ci0gICAgZm9ybWF0LCB0aGUgZGF0YSBtdXN0IGJlIHRhZ2dlZCBhcyBgc2ZudCcgaW4gdGhlIHJlc291cmNlIGZvcmsgaW5kZXgKLSAgICB0byBpbnZva2UgVHJ1ZVR5cGUgZm9udCBoYW5kbGVyIGZvciB0aGUgZGF0YS4gIEJ1dCB0aGUgVHJ1ZVR5cGUgZm9udAotICAgIGRhdGEgIGluICAgYEtleWJvYXJkLmRmb250JyAgaXMgIHRhZ2dlZCAgIGFzICBga2JkJywgIGFuZCAgIHRoYXQgIGluCi0gICAgYExhc3RSZXNvcnQuZGZvbnQnIGlzIHRhZ2dlZCBhcyAgYGxzdCcuICBBcHBsZSBmb250IHRvb2xzIGNhbiBkZXRlY3QKLSAgICB0aGF0IHRoZSBkYXRhIGlzIGluICBUcnVlVHlwZSBmb3JtYXQgYW5kIHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZSB0aGVtLgotICAgIE1heWJlICB0aGlzIGlzIHBvc3NpYmxlICBiZWNhdXNlIHRoZXkgIGFyZSBrbm93biAgdG8gYmUgIGRmb250LiAgVGhlCi0gICAgY3VycmVudCAgaW1wbGVtZW50YXRpb24gIG9mIHRoZSAgcmVzb3VyY2UgIGZvcmsgIGRyaXZlciBvZiAgRnJlZVR5cGUKLSAgICBjYW5ub3QgZG8gdGhhdCwgdGh1cyBneHZhbGlkIGNhbm5vdCB2YWxpZGF0ZSB0aGVtLgotCi0gICAgICAyIGZvbnRzIHVzZSBhbiB1bmtub3duIHRhZyBmb3IgdGhlIFRydWVUeXBlIGZvbnQgcmVzb3VyY2UuCi0KLTUuIGBrZXJuJyB0YWJsZSBpc3N1ZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBJbiBjb21tb24gdGVybWlub2xvZ3kgb2YgVHJ1ZVR5cGUsIGBrZXJuJyBpcyBjbGFzc2lmaWVkIGFzIGEgYmFzaWMgYW5kCi0gIHBsYXRmb3JtLWluZGVwZW5kZW50IHRhYmxlLiAgQnV0IHRoZXJlIGFyZSBBcHBsZSBleHRlbnNpb25zIG9mIGBrZXJuJywKLSAgYW5kICB0aGVyZSBpcyAgYW4gIGV4dGVuc2lvbiB3aGljaCAgcmVxdWlyZXMgIGEgR1ggIHN0YXRlIG1hY2hpbmUgIGZvcgotICBjb250ZXh0dWFsIGtlcm5pbmcuICAgVGhlcmVmb3JlLCBneHZhbGlkIGluY2x1ZGVzICBhIHNwZWNpYWwgdmFsaWRhdG9yCi0gIGZvciAgYGtlcm4nIHRhYmxlcy4gICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSAgaXMgbm8gIGV4YWN0ICBhbGdvcml0aG0gdG8KLSAgY2hlY2sgQXBwbGUncyBleHRlbnNpb24sIHNvICBneHZhbGlkIGluY2x1ZGVzIGEgaGV1cmlzdGljIGFsZ29yaXRobSB0bwotICBmaW5kICB0aGUgcHJvcGVyIHZhbGlkYXRpb24gIHJvdXRpbmVzIGZvciAgYWxsIHBvc3NpYmxlICBkYXRhIGZvcm1hdHMsCi0gIGluY2x1ZGluZyAgICB0aGUgICBkYXRhICAgIGZvcm1hdCAgIGZvciAgICBNaWNyb3NvZnQuICAgICBCeSAgIGNhbGxpbmcKLSAgY2xhc3NpY19rZXJuX3ZhbGlkYXRlKCkgaW5zdGVhZCBvZiBneHZfdmFsaWRhdGUoKSwgeW91IGNhbiBzcGVjaWZ5IHRoZQotICBga2VybicgZm9ybWF0ICBleHBsaWNpdGx5LiAgSG93ZXZlciwgY3VycmVudCAgRnJlZVR5cGUyIHVzZXMgTWljcm9zb2Z0Ci0gIGBrZXJuJyBmb3JtYXQgIG9ubHksIG90aGVycyAgYXJlIGlnbm9yZWQgKGFuZCAgc2hvdWxkIGJlIGhhbmRsZWQgIGluIGEKLSAgbGlicmFyeSBvbmUgbGV2ZWwgaGlnaGVyIHRoYW4gRnJlZVR5cGUpLgotCi0gIDUtMS4gSGlzdG9yeQotICAtLS0tLS0tLS0tLS0KLQotICAgIFRoZSBvcmlnaW5hbCAgMTZiaXQgdmVyc2lvbiBvZiBga2VybicgIHdhcyBkZXNpZ25lZCBieSAgQXBwbGUgaW4gdGhlCi0gICAgcHJlLUdYICBlcmEsIGFuZCAgaXQgd2FzICBhbHNvIGFwcHJvdmVkICBieSAgTWljcm9zb2Z0LiAgQWZ0ZXJ3YXJkcywKLSAgICBBcHBsZSBkZXNpZ25lZCBhICBuZXcgMzJiaXQgdmVyc2lvbiBvZiB0aGUgIGBrZXJuJyB0YWJsZS4gIEFjY29yZGluZwotICAgIHRvICB0aGUgZG9jdW1lbnRhdGlvbiwgdGhlICBkaWZmZXJlbmNlIGJldHdlZW4gIHRoZSAxNmJpdCAgYW5kIDMyYml0Ci0gICAgdmVyc2lvbiBpcyBvbmx5IHRoZSBzaXplIG9mICB2YXJpYWJsZXMgaW4gdGhlIGBrZXJuJyBoZWFkZXIuICBJbiB0aGUKLSAgICBmb2xsb3dpbmcsICB3ZSBjYWxsICB0aGUgb3JpZ2luYWwgIDE2Yml0IHZlcnNpb24gIGFzICBgY2xhc3NpYycsIGFuZAotICAgIDMyYml0IHZlcnNpb24gYXMgYG5ldycuCi0KLSAgNS0yLiBWZXJzaW9ucyBhbmQgZGlhbGVjdHMgd2hpY2ggc2hvdWxkIGJlIGRpZmZlcmVudGlhdGVkCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGhlIGBrZXJuJyB0YWJsZSAgY29uc2lzdHMgb2YgYSB0YWJsZSBoZWFkZXIgIGFuZCBzZXZlcmFsIHN1YnRhYmxlcy4KLSAgICBUaGUgdmVyc2lvbiBudW1iZXIgIHdoaWNoIGlkZW50aWZpZXMgYSBgY2xhc3NpYycgb3IgIGEgYG5ldycgdmVyc2lvbgotICAgIGlzICBleHBsaWNpdGx5ICAgd3JpdHRlbiAgaW4gIHRoZSAgIHRhYmxlICBoZWFkZXIsICBidXQgICB0aGVyZSAgYXJlCi0gICAgdW5kb2N1bWVudGVkICBkaWZmZXJlbmNlcyBiZXR3ZWVuICBNaWNyb3NvZnQncyBhbmQgIEFwcGxlJ3MgZm9ybWF0cy4KLSAgICBJdCBpcyAgY2FsbGVkIGEgYGRpYWxlY3QnIGluICB0aGUgZm9sbG93aW5nLiAgVGhlcmUgIGFyZSB0aHJlZSBjYXNlcwotICAgIHdoaWNoICBzaG91bGQgIGJlICBoYW5kbGVkOiAgIHRoZSAgbmV3ICBBcHBsZS1kaWFsZWN0LCAgdGhlICBjbGFzc2ljCi0gICAgQXBwbGUtZGlhbGVjdCwgIGFuZCB0aGUgY2xhc3NpYyAgTWljcm9zb2Z0LWRpYWxlY3QuICBBbiAgYW5hbHlzaXMgb2YKLSAgICB0aGUgZm9ybWF0cyBhbmQgdGhlIGF1dG8gZGV0ZWN0aW9uIGFsZ29yaXRobSBvZiBneHZhbGlkIGlzIGRlc2NyaWJlZAotICAgIGluIHRoZSBmb2xsb3dpbmcuCi0KLSAgICA1LTItMS4gVmVyc2lvbiBkZXRlY3Rpb246IGNsYXNzaWMgYW5kIG5ldyBrZXJuCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBBY2NvcmRpbmcgIHRvIEFwcGxlICBUcnVlVHlwZSAgc3BlY2lmaWNhdGlvbiwgdGhlcmUgIGFyZSBvbmx5ICB0d28KLSAgICAgIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGNsYXNzaWMgYW5kIHRoZSBuZXc6Ci0KLSAgICAgICAgLSBUaGUgYGtlcm4nIHRhYmxlIGhlYWRlciBzdGFydHMgd2l0aCB0aGUgdmVyc2lvbiBudW1iZXIuCi0gICAgICAgICAgVGhlIGNsYXNzaWMgdmVyc2lvbiBzdGFydHMgd2l0aCAweDAwMDAgKDE2Yml0KSwKLSAgICAgICAgICB0aGUgbmV3IHZlcnNpb24gc3RhcnRzIHdpdGggMHgwMDAxMDAwMCAoMzJiaXQpLgotCi0gICAgICAgIC0gSW4gdGhlICBga2VybicgdGFibGUgaGVhZGVyLCAgdGhlIG51bWJlciBvZiAgc3VidGFibGVzIGZvbGxvd3MKLSAgICAgICAgICB0aGUgdmVyc2lvbiBudW1iZXIuCi0gICAgICAgICAgSW4gdGhlIGNsYXNzaWMgdmVyc2lvbiwgaXQgaXMgc3RvcmVkIGFzIGEgMTZiaXQgdmFsdWUuCi0gICAgICAgICAgSW4gdGhlIG5ldyB2ZXJzaW9uLCBpdCBpcyBzdG9yZWQgYXMgYSAzMmJpdCB2YWx1ZS4KLQotICAgICAgRnJvbSBBcHBsZSBmb250IHRvb2wncyBvdXRwdXQgKER1bXBLRVJOIGlzIGFsc28gdGVzdGVkIGluIGFkZGl0aW9uCi0gICAgICB0byAgdGhlICB0aHJlZSAgQXBwbGUgIGZvbnQgIHRvb2xzIGluICBhYm92ZSksICB0aGVyZSAgaXMgIGFub3RoZXIKLSAgICAgIHVuZG9jdW1lbnRlZCBkaWZmZXJlbmNlLiAgSW4gdGhlICBuZXcgdmVyc2lvbiwgdGhlIHN1YnRhYmxlIGhlYWRlcgotICAgICAgaW5jbHVkZXMgYSAxNmJpdCB2YXJpYWJsZSAgbmFtZWQgYHR1cGxlSW5kZXgnIHdoaWNoIGRvZXMgbm90IGV4aXN0Ci0gICAgICBpbiB0aGUgY2xhc3NpYyB2ZXJzaW9uLgotCi0gICAgICBUaGUgbmV3IHZlcnNpb24gIGNhbiBzdG9yZSBhbGwgc3VidGFibGUgZm9ybWF0cyAoMCwgIDEsIDIsIGFuZCAzKSwKLSAgICAgIGJ1dCB0aGUgQXBwbGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBtZW50aW9uIHRoZSBzdWJ0YWJsZQotICAgICAgZm9ybWF0cyBhdmFpbGFibGUgaW4gdGhlIGNsYXNzaWMgdmVyc2lvbi4KLQotICAgIDUtMi0yLiBBdmFpbGFibGUgc3VidGFibGUgZm9ybWF0cyBpbiBjbGFzc2ljIHZlcnNpb24KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIEFsdGhvdWdoIHRoZSAgQXBwbGUgVHJ1ZVR5cGUgIHNwZWNpZmljYXRpb24gcmVjb21tZW5kcyB0byAgdXNlIHRoZQotICAgICAgY2xhc3NpYyB2ZXJzaW9uIGluICB0aGUgY2FzZSBpZiB0aGUgZm9udCBpcyAgZGVzaWduZWQgZm9yIGJvdGggdGhlCi0gICAgICBBcHBsZSBhbmQgTWljcm9zb2Z0IHBsYXRmb3JtcywgIGl0IGRvZXMgbm90IGRvY3VtZW50IHRoZSBhdmFpbGFibGUKLSAgICAgIHN1YnRhYmxlIGZvcm1hdHMgaW4gdGhlIGNsYXNzaWMgdmVyc2lvbi4KLQotICAgICAgQWNjb3JkaW5nICB0byB0aGUgTWljcm9zb2Z0ICBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLCAgdGhlIHN1YnRhYmxlCi0gICAgICBmb3JtYXQgIGFzc3VyZWQgZm9yICBXaW5kb3dzICBhbmQgT1MvMiAgc3VwcG9ydCAgaXMgb25seSAgc3VidGFibGUKLSAgICAgIGZvcm1hdCAgMC4gIFRoZSAgTWljcm9zb2Z0IFRydWVUeXBlICBzcGVjaWZpY2F0aW9uICBhbHNvIGRlc2NyaWJlcwotICAgICAgc3VidGFibGUgZm9ybWF0ICAyLCBidXQgZG9lcyAgbm90IG1lbnRpb24gd2hpY2ggIHBsYXRmb3JtcyBzdXBwb3J0Ci0gICAgICBpdC4gIFN1YnRhYmxlIGZvcm1hdHMgMSwgMywgIGFuZCBoaWdoZXIgYXJlIGRvY3VtZW50ZWQgYXMgcmVzZXJ2ZWQKLSAgICAgIGZvciBmdXR1cmUgdXNlLiAgVGhlcmVmb3JlLCB0aGUgY2xhc3NpYyB2ZXJzaW9uIGNhbiBzdG9yZSBzdWJ0YWJsZQotICAgICAgZm9ybWF0cyAwIGFuZCAyLCBhdCBsZWFzdC4gIGB0dGZkdW1wLmV4ZScsIGEgZm9udCB0b29sIHByb3ZpZGVkIGJ5Ci0gICAgICBNaWNyb3NvZnQsICBpZ25vcmVzIHRoZSAgc3VidGFibGUgZm9ybWF0ICB3cml0dGVuIGluICB0aGUgc3VidGFibGUKLSAgICAgIGhlYWRlciwgYW5kIHBhcnNlcyB0aGUgdGFibGUgYXMgaWYgYWxsIHN1YnRhYmxlcyBhcmUgaW4gZm9ybWF0IDAuCi0KLSAgICAgIGBrZXJuJyAgc3VidGFibGUgZm9ybWF0ICAxICB1c2VzICBhIFN0YXRlVGFibGUsICBzbyAgaXQgY2Fubm90ICBiZQotICAgICAgdXRpbGl6ZWQgd2l0aG91dCBhIEdYICBTdGF0ZSBNYWNoaW5lLiAgVGhlcmVmb3JlLCBpdCBpcyByZWFzb25hYmxlCi0gICAgICB0byBhc3N1bWUgIHRoYXQgZm9ybWF0IDEgKGFuZCAgMykgd2VyZSBpbnRyb2R1Y2VkICBhZnRlciBBcHBsZSBoYWQKLSAgICAgIGludHJvZHVjZWQgR1ggYW5kIG1vdmVkIHRvIHRoZSBuZXcgMzJiaXQgdmVyc2lvbi4KLQotICAgIDUtMi0zLiBBcHBsZSBhbmQgTWljcm9zb2Z0IGRpYWxlY3RzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgVGhlICBga2Vybicgc3VidGFibGUgIGhhcyAgYSAxNmJpdCAgYGNvdmVyYWdlJyAgZmllbGQgdG8gIGRlc2NyaWJlCi0gICAgICBrZXJuaW5nIGF0dHJpYnV0ZXMsIGJ1dCBiaXQgaW50ZXJwcmV0YXRpb25zIGJ5IEFwcGxlIGFuZCBNaWNyb3NvZnQKLSAgICAgIGFyZSBkaWZmZXJlbnQ6ICBGb3IgZXhhbXBsZSwgQXBwbGUgIHVzZXMgYml0cyAwLTcgdG8gIGlkZW50aWZ5IHRoZQotICAgICAgc3VidGFibGUsIHdoaWxlIE1pY3Jvc29mdCB1c2VzIGJpdHMgOC0xNS4KLQotICAgICAgSW4gIGFkZGl0aW9uLCBkdWUgIHRvIHRoZSAgb3V0cHV0IG9mICBEdW1wS0VSTiAgYW5kIEZvbnRWYWxpZGF0b3IsCi0gICAgICBBcHBsZSdzIGJpdCBpbnRlcnByZXRhdGlvbnMgb2YgY292ZXJhZ2UgaW4gY2xhc3NpYyBhbmQgbmV3IHZlcnNpb24KLSAgICAgIGFyZSAgaW5jb21wYXRpYmxlIGFsc28uICAgSW4gIHN1bW1hcnksIHRoZXJlICBhcmUgdGhyZWUgIGRpYWxlY3RzOgotICAgICAgY2xhc3NpYyBBcHBsZSAgZGlhbGVjdCwgY2xhc3NpYyAgTWljcm9zb2Z0IGRpYWxlY3QsIGFuZCAgbmV3IEFwcGxlCi0gICAgICBkaWFsZWN0LiAgVGhlIGNsYXNzaWMgTWljcm9zb2Z0ICBkaWFsZWN0IGFuZCB0aGUgbmV3IEFwcGxlIGRpYWxlY3QKLSAgICAgIGFyZSBkb2N1bWVudGVkICBieSBlYWNoIHZlbmRvcnMnIFRydWVUeXBlICBmb250IHNwZWNpZmljYXRpb24sIGJ1dAotICAgICAgdGhlIGRvY3VtZW50YXRpb24gZm9yIGNsYXNzaWMgQXBwbGUgZGlhbGVjdCBpcyBub3QgYXZhaWxhYmxlLgotCi0gICAgICBGb3IgZXhhbXBsZSwgIGluIHRoZSAgbmV3IEFwcGxlIGRpYWxlY3QsICBiaXQgMTUgaXMgIGRvY3VtZW50ZWQgYXMKLSAgICAgIGBzZXQgdG8gIDEgaWYgIHRoZSBrZXJuaW5nICBpcyB2ZXJ0aWNhbCcuICBPbiAgdGhlIG90aGVyICBoYW5kLCBpbgotICAgICAgY2xhc3NpYyBNaWNyb3NvZnQgZGlhbGVjdCwgYml0IDEgaXMgZG9jdW1lbnRlZCBhcyBgc2V0IHRvIDEgaWYgdGhlCi0gICAgICBrZXJuaW5nICBpcyAgaG9yaXpvbnRhbCcuICAgRnJvbSAgIHRoZSAgb3V0cHV0cyAgb2YgIER1bXBLRVJOICBhbmQKLSAgICAgIEZvbnRWYWxpZGF0b3IsIGNsYXNzaWMgIEFwcGxlIGRpYWxlY3QgcmVjb2duaXplcyAgMTUgYXMgYHNldCAgdG8gMQotICAgICAgd2hlbiAgdGhlIGtlcm5pbmcgIGlzIGhvcml6b250YWwnLiAgIEZyb20gdGhlICByZXN1bHRzICBvZiBzaW1pbGFyCi0gICAgICBleHBlcmltZW50cywgY2xhc3NpYyBBcHBsZSBkaWFsZWN0ICBzZWVtcyB0byBiZSB0aGUgRW5kaWFuIHJldmVyc2UKLSAgICAgIG9mIHRoZSBjbGFzc2ljIE1pY3Jvc29mdCBkaWFsZWN0LgotCi0gICAgICBBcyBhICBjb25jbHVzaW9uIGl0IG11c3QgYmUgIG5vdGVkIHRoYXQgbm8gZm9udCAgdG9vbCBjYW4gaWRlbnRpZnkKLSAgICAgIGNsYXNzaWMgQXBwbGUgZGlhbGVjdCBvciBjbGFzc2ljIE1pY3Jvc29mdCBkaWFsZWN0IGF1dG9tYXRpY2FsbHkuCi0KLSAgICA1LTItNC4gZ3h2YWxpZCBhdXRvIGRpYWxlY3QgZGV0ZWN0aW9uIGFsZ29yaXRobQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIFRoZSBmaXJzdCAxNiAgYml0cyBvZiB0aGUgYGtlcm4nIHRhYmxlIGFyZSAgZW5vdWdoIHRvIGlkZW50aWZ5IHRoZQotICAgICAgdmVyc2lvbjoKLQotICAgICAgICAtIGlmICB0aGUgZmlyc3QgIDE2ICBiaXRzIGFyZSAgMHgwMDAwLCAgdGhlIGBrZXJuJyAgdGFibGUgaXMgIGluCi0gICAgICAgICAgY2xhc3NpYyBBcHBsZSBkaWFsZWN0IG9yIGNsYXNzaWMgTWljcm9zb2Z0IGRpYWxlY3QKLSAgICAgICAgLSBpZiB0aGUgZmlyc3QgMTYgYml0cyBhcmUgIDB4MDAwMSwgYW5kIG5leHQgMTYgYml0cyBhcmUgMHgwMDAwLAotICAgICAgICAgIHRoZSBrZXJuIHRhYmxlIGlzIGluIG5ldyBBcHBsZSBkaWFsZWN0LgotCi0gICAgICBJZiB0aGUgYGtlcm4nICB0YWJsZSBpcyBhIGNsYXNzaWMgb25lLCAgdGhlIDE2Yml0IGBjb3ZlcmFnZScgZmllbGQKLSAgICAgIGlzIGNoZWNrZWQgbmV4dC4gICBGaXJzdGx5LCB0aGUgY292ZXJhZ2UgYml0cyBhcmUgIGRlY29kZWQgZm9yIHRoZQotICAgICAgY2xhc3NpYyBBcHBsZSBkaWFsZWN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgYml0IG1hc2tzICh0aGlzIGlzIGJhc2VkCi0gICAgICBvbiBEdW1wS0VSTiBvdXRwdXQpOgotCi0gICAgICAgIDB4ODAwMDogMT1ob3Jpem9udGFsLCAwPXZlcnRpY2FsCi0gICAgICAgIDB4NDAwMDogbm90IHVzZWQKLSAgICAgICAgMHgyMDAwOiAxPWNyb3NzLXN0cmVhbSwgMD1ub3JtYWwKLSAgICAgICAgMHgxRkYwOiByZXNlcnZlZAotICAgICAgICAweDAwMEY6IHN1YnRhYmxlIGZvcm1hdAotCi0gICAgICBJZiAgYW55ICBvZiAgcmVzZXJ2ZWQgIGJpdHMgIGFyZSAgc2V0ICBvciAgdGhlICBzdWJ0YWJsZSAgYml0cyAgaXMKLSAgICAgIGludGVycHJldGVkIGFzIGZvcm1hdCAxIG9yIDMsIHdlIHRha2UgaXQgYXMgYGltcG9zc2libGUgaW4gY2xhc3NpYwotICAgICAgQXBwbGUgZGlhbGVjdCcgYW5kIHJldHJ5LCB1c2luZyB0aGUgY2xhc3NpYyBNaWNyb3NvZnQgZGlhbGVjdC4KLQotICAgICAgICBUaGUgbW9zdCBwb3B1bGFyIGNvdmVyYWdlIGluIG5ldyBBcHBsZS1kaWFsZWN0OiAgICAgICAgIDB4ODAwMCwKLSAgICAgICAgVGhlIG1vc3QgcG9wdWxhciBjb3ZlcmFnZSBpbiBjbGFzc2ljIEFwcGxlLWRpYWxlY3Q6ICAgICAweDAwMDAsCi0gICAgICAgIFRoZSBtb3N0IHBvcHVsYXIgY292ZXJhZ2UgaW4gY2xhc3NpYyBNaWNyb3NvZnQgZGlhbGVjdDogMHgwMDAxLgotCi0gIDUtMy4gVGVzdGVkIGZvbnRzCi0gIC0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBXZSBjaGVja2VkICA1OSBmb250cyAgYnVuZGxlZCB3aXRoIE1hY09TICBhbmQgMzggZm9udHMgIGJ1bmRsZWQgd2l0aAotICAgIFdpbmRvd3MsIHdoZXJlIGFsbCBmb250IGluY2x1ZGUgYSBga2VybicgdGFibGUuCi0KLSAgICAgIC0gZm9udHMgYnVuZGxlZCB3aXRoIE1hY09TCi0gICAgICAgICogbmV3IEFwcGxlIGRpYWxlY3QKLSAgICAgICAgICBmb3JtYXQgMDogMTgKLSAgICAgICAgICBmb3JtYXQgMjogIDEKLSAgICAgICAgICBmb3JtYXQgMzogIDEKLSAgICAgICAgKiBjbGFzc2ljIEFwcGxlIGRpYWxlY3QKLSAgICAgICAgICBmb3JtYXQgMDogMTQKLSAgICAgICAgKiBjbGFzc2ljIE1pY3Jvc29mdCBkaWFsZWN0Ci0gICAgICAgICAgZm9ybWF0IDA6IDE1Ci0KLSAgICAgIC0gZm9udHMgYnVuZGxlZCB3aXRoIFdpbmRvd3MKLSAgICAgICAgKiBjbGFzc2ljIE1pY3Jvc29mdCBkaWFsZWN0Ci0gICAgICAgICAgZm9ybWF0IDA6IDM4Ci0KLSAgICBJdCBsb29rcyBzdHJhbmdlIHRoYXQgY2xhc3NpYyBNaWNyb3NvZnQtZGlhbGVjdCBmb250cyBhcmUgYnVuZGxlZCB0bwotICAgIE1hY09TOiB0aGV5IGNvbWUgZnJvbSBNU0lFIGZvciBNYWNPUywgZXhjZXB0IG9mIE1hcmtlckZlbHQuZGZvbnQuCi0KLQotICBBQ0tOT1dMRURHRU1FTlQKLSAgLS0tLS0tLS0tLS0tLS0tCi0KLSAgU29tZSBwYXJ0cyBvZiBneHZhbGlkIGFyZSAgZGVyaXZlZCBmcm9tIGJvdGggdGhlIGBneGxheW91dCcgbW9kdWxlIGFuZAotICB0aGUgYG90dmFsaWQnICBtb2R1bGUuICBEZXZlbG9wbWVudCBvZiAgZ3hsYXlvdXQgd2FzIHN1cHBvcnRlZCAgYnkgdGhlCi0gIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KLQotICBUaGUgZGV0YWlsZWQgYW5hbHlzaXMgb2YgdW5kZWZpbmVkICBnbHlwaCBJRCB1dGlsaXphdGlvbiBpbiBgbW9ydCcgYW5kCi0gIGBtb3J4JyB0YWJsZXMgaXMgcHJvdmlkZWQgYnkgR2VvcmdlIFdpbGxpYW1zLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDQtMjAxNyBieQotc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIGhhdCBLLksuLAotRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotCi1UaGlzICBmaWxlIGlzICBwYXJ0ICBvZiB0aGUgIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSAgb25seSBiZSAgdXNlZCwKLW1vZGlmaWVkLCAgYW5kICBkaXN0cmlidXRlZCB1bmRlciAgdGhlICB0ZXJtcyAgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdAotbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nICB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzCi1maWxlICB5b3UgaW5kaWNhdGUgdGhhdCAgeW91IGhhdmUgIHJlYWQgdGhlICBsaWNlbnNlIGFuZCAgdW5kZXJzdGFuZCBhbmQKLWFjY2VwdCBpdCBmdWxseS4KLQotCi0tLS0gZW5kIG9mIFJFQURNRSAtLS0KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dmFsaWQuYyBiL3NyYy9neHZhbGlkL2d4dmFsaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0ODUxNC4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZhbGlkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZhbGlkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdmFsaWRhdG9yIGZvciBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKGJvZHkgb25seSkuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAiZ3h2YnNsbi5jIgotI2luY2x1ZGUgImd4dmNvbW1uLmMiCi0jaW5jbHVkZSAiZ3h2ZmVhdC5jIgotI2luY2x1ZGUgImd4dmp1c3QuYyIKLSNpbmNsdWRlICJneHZrZXJuLmMiCi0jaW5jbHVkZSAiZ3h2bGNhci5jIgotI2luY2x1ZGUgImd4dm1vZC5jIgotI2luY2x1ZGUgImd4dm1vcnQuYyIKLSNpbmNsdWRlICJneHZtb3J0MC5jIgotI2luY2x1ZGUgImd4dm1vcnQxLmMiCi0jaW5jbHVkZSAiZ3h2bW9ydDIuYyIKLSNpbmNsdWRlICJneHZtb3J0NC5jIgotI2luY2x1ZGUgImd4dm1vcnQ1LmMiCi0jaW5jbHVkZSAiZ3h2bW9yeC5jIgotI2luY2x1ZGUgImd4dm1vcngwLmMiCi0jaW5jbHVkZSAiZ3h2bW9yeDEuYyIKLSNpbmNsdWRlICJneHZtb3J4Mi5jIgotI2luY2x1ZGUgImd4dm1vcng0LmMiCi0jaW5jbHVkZSAiZ3h2bW9yeDUuYyIKLSNpbmNsdWRlICJneHZvcGJkLmMiCi0jaW5jbHVkZSAiZ3h2cHJvcC5jIgotI2luY2x1ZGUgImd4dnRyYWsuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dmFsaWQuaCBiL3NyYy9neHZhbGlkL2d4dmFsaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxMTZlZi4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZhbGlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2YWxpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIHRhYmxlIHZhbGlkYXRpb24gKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBHWFZBTElEX0hfCi0jZGVmaW5lIEdYVkFMSURfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpbmNsdWRlICJneHZlcnJvci5oIiAgICAgICAgICAvKiBtdXN0IGNvbWUgYmVmb3JlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0ggKi8KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfVkFMSURBVEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X2ZlYXRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9ic2xuX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBneHZfdHJha192YWxpZGF0ZSggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9qdXN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X21vcnRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBneHZfbW9yeF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9rZXJuX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X2tlcm5fdmFsaWRhdGVfY2xhc3NpYyggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGRpYWxlY3RfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9vcGJkX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X3Byb3BfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBneHZfbGNhcl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIEdYVkFMSURfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dmJzbG4uYyBiL3NyYy9neHZhbGlkL2d4dmJzbG4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkZmY3My4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZic2xuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2YnNsbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIGJzbG4gdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImd4dmFsaWQuaCIKLSNpbmNsdWRlICJneHZjb21tbi5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2YnNsbgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIERhdGEgYW5kIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgR1hWX0JTTE5fVkFMVUVfQ09VTlQgIDMyCi0jZGVmaW5lIEdYVl9CU0xOX1ZBTFVFX0VNUFRZICAweEZGRkZVCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX2JzbG5fRGF0YVJlY18KLSAgewotICAgIEZUX0J5dGVzICAgY3RsUG9pbnRzX3A7Ci0gICAgRlRfVVNob3J0ICBkZWZhdWx0QmFzZWxpbmU7Ci0KLSAgfSBHWFZfYnNsbl9EYXRhUmVjLCAqR1hWX2JzbG5fRGF0YTsKLQotCi0jZGVmaW5lIEdYVl9CU0xOX0RBVEEoIGZpZWxkICkgIEdYVl9UQUJMRV9EQVRBKCBic2xuLCBmaWVsZCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgVVRJTElUWSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfYnNsbl9Mb29rdXBWYWx1ZV92YWxpZGF0ZSggRlRfVVNob3J0ICAgICAgICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfTG9va3VwVmFsdWVDUHRyICB2YWx1ZV9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VU2hvcnQgICAgIHYgPSB2YWx1ZV9wLT51OwotICAgIEZUX1VTaG9ydCogICAgY3RsUG9pbnRzOwotCi0gICAgRlRfVU5VU0VEKCBnbHlwaCApOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggImxvb2t1cCB2YWx1ZSIgKTsKLQotICAgIGlmICggdiA+PSBHWFZfQlNMTl9WQUxVRV9DT1VOVCApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBjdGxQb2ludHMgPSAoRlRfVVNob3J0KilHWFZfQlNMTl9EQVRBKCBjdGxQb2ludHNfcCApOwotICAgIGlmICggY3RsUG9pbnRzICYmIGN0bFBvaW50c1t2XSA9PSBHWFZfQlNMTl9WQUxVRV9FTVBUWSApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyoKLSAgICArPT09PT09PT09PT09PT09KyAtLS0tLS0tLSsKLSAgICB8IGxvb2t1cCBoZWFkZXIgfCAgICAgICAgIHwKLSAgICArPT09PT09PT09PT09PT09KyAgICAgICAgIHwKLSAgICB8IEJpblNyY2hIZWFkZXIgfCAgICAgICAgIHwKLSAgICArPT09PT09PT09PT09PT09KyAgICAgICAgIHwKLSAgICB8IGxhc3RHbHlwaFswXSAgfCAgICAgICAgIHwKLSAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgIHwKLSAgICB8IGZpcnN0R2x5cGhbMF0gfCAgICAgICAgIHwgICAgaGVhZCBvZiBsb29rdXAgdGFibGUKLSAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgICAgICAgKwotICAgIHwgb2Zmc2V0WzBdICAgICB8ICAgIC0+ICAgfCAgICAgICAgICBvZmZzZXQgICAgICAgICAgICBbYnl0ZV0KLSAgICArPT09PT09PT09PT09PT09KyAgICAgICAgIHwgICAgICAgICAgICAgKwotICAgIHwgbGFzdEdseXBoWzFdICB8ICAgICAgICAgfCAoZ2x5cGhJRCAtIGZpcnN0R2x5cGgpICogMiBbYnl0ZV0KLSAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgIHwKLSAgICB8IGZpcnN0R2x5cGhbMV0gfCAgICAgICAgIHwKLSAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgIHwKLSAgICB8IG9mZnNldFsxXSAgICAgfCAgICAgICAgIHwKLSAgICArPT09PT09PT09PT09PT09KyAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAxNmJpdCB2YWx1ZSBhcnJheSAgICAgICAgIHwKLSAgICArPT09PT09PT09PT09PT09KyAgICAgICAgIHwKLSAgICB8ICAgICB2YWx1ZSAgICAgfCA8LS0tLS0tLSsKLSAgICAuLi4KLSAgKi8KLQotICBzdGF0aWMgR1hWX0xvb2t1cFZhbHVlRGVzYwotICBneHZfYnNsbl9Mb29rdXBGbXQ0X3RyYW5zaXQoIEZUX1VTaG9ydCAgICAgICAgICAgIHJlbGF0aXZlX2dpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfTG9va3VwVmFsdWVDUHRyICBiYXNlX3ZhbHVlX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAgICAgbG9va3VwdGJsX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgICAgICAgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgcDsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBsaW1pdDsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICBvZmZzZXQ7Ci0gICAgR1hWX0xvb2t1cFZhbHVlRGVzYyAgdmFsdWU7Ci0KLSAgICAvKiBYWFg6IGNoZWNrIHJhbmdlID8gKi8KLSAgICBvZmZzZXQgPSAoRlRfVVNob3J0KSggYmFzZV92YWx1ZV9wLT51ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCByZWxhdGl2ZV9naW5kZXggKiBzaXplb2YgKCBGVF9VU2hvcnQgKSApICk7Ci0KLSAgICBwICAgICA9IGd4dmFsaWQtPmxvb2t1cHRibF9oZWFkICsgb2Zmc2V0OwotICAgIGxpbWl0ID0gbG9va3VwdGJsX2xpbWl0OwotICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotCi0gICAgdmFsdWUudSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9ic2xuX3BhcnRzX2ZtdDBfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZXM7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAicGFydHMgZm9ybWF0IDAiICk7Ci0KLSAgICAvKiBkZWx0YXMgKi8KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKiBHWFZfQlNMTl9WQUxVRV9DT1VOVCApOwotCi0gICAgZ3h2YWxpZC0+dGFibGVfZGF0YSA9IE5VTEw7ICAgICAgLyogTm8gY3RsUG9pbnRzIGhlcmUuICovCi0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2JzbG5fcGFydHNfZm10MV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlczsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJwYXJ0cyBmb3JtYXQgMSIgKTsKLQotICAgIC8qIGRlbHRhcyAqLwotICAgIGd4dl9ic2xuX3BhcnRzX2ZtdDBfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICAvKiBtYXBwaW5nRGF0YSAqLwotICAgIGd4dmFsaWQtPmxvb2t1cHZhbF9zaWduICAgPSBHWFZfTE9PS1VQVkFMVUVfVU5TSUdORUQ7Ci0gICAgZ3h2YWxpZC0+bG9va3VwdmFsX2Z1bmMgICA9IGd4dl9ic2xuX0xvb2t1cFZhbHVlX3ZhbGlkYXRlOwotICAgIGd4dmFsaWQtPmxvb2t1cGZtdDRfdHJhbnMgPSBneHZfYnNsbl9Mb29rdXBGbXQ0X3RyYW5zaXQ7Ci0gICAgZ3h2X0xvb2t1cFRhYmxlX3ZhbGlkYXRlKCBwICsgMiAqIEdYVl9CU0xOX1ZBTFVFX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2JzbG5fcGFydHNfZm10Ml92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZXM7Ci0KLSAgICBGVF9VU2hvcnQgIHN0ZEdseXBoOwotICAgIEZUX1VTaG9ydCAgY3RsUG9pbnQ7Ci0gICAgRlRfSW50ICAgICBpOwotCi0gICAgRlRfVVNob3J0ICBkZWZhdWx0QmFzZWxpbmUgPSBHWFZfQlNMTl9EQVRBKCBkZWZhdWx0QmFzZWxpbmUgKTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJwYXJ0cyBmb3JtYXQgMiIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiArICggMiAqIEdYVl9CU0xOX1ZBTFVFX0NPVU5UICkgKTsKLQotICAgIC8qIHN0ZEdseXBoICovCi0gICAgc3RkR2x5cGggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEdYVl9UUkFDRSgoICIgKHN0ZEdseXBoID0gJXUpXG4iLCBzdGRHbHlwaCApKTsKLQotICAgIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCBzdGRHbHlwaCwgZ3h2YWxpZCApOwotCi0gICAgLyogUmVjb3JkIHRoZSBwb3NpdGlvbiBvZiBjdGxQb2ludHMgKi8KLSAgICBHWFZfQlNMTl9EQVRBKCBjdGxQb2ludHNfcCApID0gcDsKLQotICAgIC8qIGN0bFBvaW50cyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgR1hWX0JTTE5fVkFMVUVfQ09VTlQ7IGkrKyApCi0gICAgewotICAgICAgY3RsUG9pbnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgaWYgKCBjdGxQb2ludCA9PSBHWFZfQlNMTl9WQUxVRV9FTVBUWSApCi0gICAgICB7Ci0gICAgICAgIGlmICggaSA9PSBkZWZhdWx0QmFzZWxpbmUgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZ3h2X2N0bFBvaW50X3ZhbGlkYXRlKCBzdGRHbHlwaCwgY3RsUG9pbnQsIGd4dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2JzbG5fcGFydHNfZm10M192YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGVzOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggInBhcnRzIGZvcm1hdCAzIiApOwotCi0gICAgLyogc3RkR2x5cGggKyBjdGxQb2ludHMgKi8KLSAgICBneHZfYnNsbl9wYXJ0c19mbXQyX3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0gICAgLyogbWFwcGluZ0RhdGEgKi8KLSAgICBneHZhbGlkLT5sb29rdXB2YWxfc2lnbiAgID0gR1hWX0xPT0tVUFZBTFVFX1VOU0lHTkVEOwotICAgIGd4dmFsaWQtPmxvb2t1cHZhbF9mdW5jICAgPSBneHZfYnNsbl9Mb29rdXBWYWx1ZV92YWxpZGF0ZTsKLSAgICBneHZhbGlkLT5sb29rdXBmbXQ0X3RyYW5zID0gZ3h2X2JzbG5fTG9va3VwRm10NF90cmFuc2l0OwotICAgIGd4dl9Mb29rdXBUYWJsZV92YWxpZGF0ZSggcCArICggMiArIDIgKiBHWFZfQlNMTl9WQUxVRV9DT1VOVCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIGJzbG4gVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X2JzbG5fdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIGZ0dmFsaWQgKQotICB7Ci0gICAgR1hWX1ZhbGlkYXRvclJlYyAgZ3h2YWxpZHJlYzsKLSAgICBHWFZfVmFsaWRhdG9yICAgICBneHZhbGlkID0gJmd4dmFsaWRyZWM7Ci0KLSAgICBHWFZfYnNsbl9EYXRhUmVjICBic2xucmVjOwotICAgIEdYVl9ic2xuX0RhdGEgICAgIGJzbG4gPSAmYnNsbnJlYzsKLQotICAgIEZUX0J5dGVzICBwICAgICA9IHRhYmxlOwotICAgIEZUX0J5dGVzICBsaW1pdCA9IDA7Ci0KLSAgICBGVF9VTG9uZyAgIHZlcnNpb247Ci0gICAgRlRfVVNob3J0ICBmb3JtYXQ7Ci0gICAgRlRfVVNob3J0ICBkZWZhdWx0QmFzZWxpbmU7Ci0KLSAgICBHWFZfVmFsaWRhdGVfRnVuYyAgZm10X2Z1bmNzX3RhYmxlIFtdID0KLSAgICB7Ci0gICAgICBneHZfYnNsbl9wYXJ0c19mbXQwX3ZhbGlkYXRlLAotICAgICAgZ3h2X2JzbG5fcGFydHNfZm10MV92YWxpZGF0ZSwKLSAgICAgIGd4dl9ic2xuX3BhcnRzX2ZtdDJfdmFsaWRhdGUsCi0gICAgICBneHZfYnNsbl9wYXJ0c19mbXQzX3ZhbGlkYXRlLAotICAgIH07Ci0KLQotICAgIGd4dmFsaWQtPnJvb3QgICAgICAgPSBmdHZhbGlkOwotICAgIGd4dmFsaWQtPnRhYmxlX2RhdGEgPSBic2xuOwotICAgIGd4dmFsaWQtPmZhY2UgICAgICAgPSBmYWNlOwotCi0gICAgRlRfVFJBQ0UzKCggInZhbGlkYXRpbmcgYGJzbG4nIHRhYmxlXG4iICkpOwotICAgIEdYVl9JTklUOwotCi0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDQgKyAyICsgMiApOwotICAgIHZlcnNpb24gICAgICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBmb3JtYXQgICAgICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGRlZmF1bHRCYXNlbGluZSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAvKiBvbmx5IHZlcnNpb24gMS4wIGlzIGRlZmluZWQgKDE5OTYpICovCi0gICAgaWYgKCB2ZXJzaW9uICE9IDB4MDAwMTAwMDBVTCApCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIC8qIG9ubHkgZm9ybWF0IDEsIDIsIDMgYXJlIGRlZmluZWQgKDE5OTYpICovCi0gICAgR1hWX1RSQUNFKCggIiAoZm9ybWF0ID0gJWQpXG4iLCBmb3JtYXQgKSk7Ci0gICAgaWYgKCBmb3JtYXQgPiAzICkKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgaWYgKCBkZWZhdWx0QmFzZWxpbmUgPiAzMSApCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIGJzbG4tPmRlZmF1bHRCYXNlbGluZSA9IGRlZmF1bHRCYXNlbGluZTsKLQotICAgIGZtdF9mdW5jc190YWJsZVtmb3JtYXRdKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgfQotCi0KLS8qIGFyY2gtdGFnOiBlYmU4MTE0My1mZGFhLTRjNjgtYTRkMS1iNTcyMjdkYWEzYmMKLSAgIChkbyBub3QgY2hhbmdlIHRoaXMgY29tbWVudCkgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dmNvbW1uLmMgYi9zcmMvZ3h2YWxpZC9neHZjb21tbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBhOTFlLi4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dmNvbW1uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmNvbW1uLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBjb21tb24gdGFibGVzIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZjb21tbi5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2Y29tbW9uCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIDE2Yml0IG9mZnNldCBzb3J0ZXIgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgaW50Ci0gIGd4dl9jb21wYXJlX3VzaG9ydF9vZmZzZXQoIEZUX1VTaG9ydCogIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIGIgKQotICB7Ci0gICAgaWYgKCAqYSA8ICpiICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlIGlmICggKmEgPiAqYiApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X3NldF9sZW5ndGhfYnlfdXNob3J0X29mZnNldCggRlRfVVNob3J0KiAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqKiAgICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIG5tZW1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VSW50ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG5tZW1iOyBpKysgKQotICAgICAgKihsZW5ndGhbaV0pID0gMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbm1lbWI7IGkrKyApCi0gICAgICBidWZmW2ldID0gb2Zmc2V0W2ldOwotICAgIGJ1ZmZbbm1lbWJdID0gbGltaXQ7Ci0KLSAgICBmdF9xc29ydCggYnVmZiwgKCBubWVtYiArIDEgKSwgc2l6ZW9mICggRlRfVVNob3J0ICksCi0gICAgICAgICAgICAgICggaW50KCopKGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKikgKWd4dl9jb21wYXJlX3VzaG9ydF9vZmZzZXQgKTsKLQotICAgIGlmICggYnVmZltubWVtYl0gPiBsaW1pdCApCi0gICAgICBGVF9JTlZBTElEX09GRlNFVDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbm1lbWI7IGkrKyApCi0gICAgewotICAgICAgRlRfVUludCAgajsKLQotCi0gICAgICBmb3IgKCBqID0gMDsgaiA8IG5tZW1iOyBqKysgKQotICAgICAgICBpZiAoIGJ1ZmZbal0gPT0gb2Zmc2V0W2ldICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBqID09IG5tZW1iICkKLSAgICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0KLSAgICAgICoobGVuZ3RoW2ldKSA9IChGVF9VU2hvcnQpKCBidWZmW2ogKyAxXSAtIGJ1ZmZbal0gKTsKLQotICAgICAgaWYgKCAwICE9IG9mZnNldFtpXSAmJiAwID09ICoobGVuZ3RoW2ldKSApCi0gICAgICAgIEZUX0lOVkFMSURfT0ZGU0VUOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAzMmJpdCBvZmZzZXQgc29ydGVyICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIGludAotICBneHZfY29tcGFyZV91bG9uZ19vZmZzZXQoIEZUX1VMb25nKiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGIgKQotICB7Ci0gICAgaWYgKCAqYSA8ICpiICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlIGlmICggKmEgPiAqYiApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X3NldF9sZW5ndGhfYnlfdWxvbmdfb2Zmc2V0KCBGVF9VTG9uZyogICAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqKiAgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgbm1lbWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCkKLSAgewotICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbm1lbWI7IGkrKyApCi0gICAgICAqKGxlbmd0aFtpXSkgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBubWVtYjsgaSsrICkKLSAgICAgIGJ1ZmZbaV0gPSBvZmZzZXRbaV07Ci0gICAgYnVmZltubWVtYl0gPSBsaW1pdDsKLQotICAgIGZ0X3Fzb3J0KCBidWZmLCAoIG5tZW1iICsgMSApLCBzaXplb2YgKCBGVF9VTG9uZyApLAotICAgICAgICAgICAgICAoIGludCgqKShjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopIClneHZfY29tcGFyZV91bG9uZ19vZmZzZXQgKTsKLQotICAgIGlmICggYnVmZltubWVtYl0gPiBsaW1pdCApCi0gICAgICBGVF9JTlZBTElEX09GRlNFVDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbm1lbWI7IGkrKyApCi0gICAgewotICAgICAgRlRfVUludCAgajsKLQotCi0gICAgICBmb3IgKCBqID0gMDsgaiA8IG5tZW1iOyBqKysgKQotICAgICAgICBpZiAoIGJ1ZmZbal0gPT0gb2Zmc2V0W2ldICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBqID09IG5tZW1iICkKLSAgICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0KLSAgICAgICoobGVuZ3RoW2ldKSA9IGJ1ZmZbaiArIDFdIC0gYnVmZltqXTsKLQotICAgICAgaWYgKCAwICE9IG9mZnNldFtpXSAmJiAwID09ICoobGVuZ3RoW2ldKSApCi0gICAgICAgIEZUX0lOVkFMSURfT0ZGU0VUOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgc2NhbiB2YWx1ZSBhcnJheSBhbmQgZ2V0IG1pbiAmIG1heCAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBneHZfYXJyYXlfZ2V0bGltaXRzX2J5dGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICBtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0KLSAgICAqbWluID0gMHhGRjsKLSAgICAqbWF4ID0gMHgwMDsKLQotICAgIHdoaWxlICggcCA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9CeXRlICB2YWw7Ci0KLQotICAgICAgR1hWX0xJTUlUX0NIRUNLKCAxICk7Ci0gICAgICB2YWwgPSBGVF9ORVhUX0JZVEUoIHAgKTsKLQotICAgICAgKm1pbiA9IChGVF9CeXRlKUZUX01JTiggKm1pbiwgdmFsICk7Ci0gICAgICAqbWF4ID0gKEZUX0J5dGUpRlRfTUFYKCAqbWF4LCB2YWwgKTsKLSAgICB9Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X2FycmF5X2dldGxpbWl0c191c2hvcnQoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLQotICAgICptaW4gPSAweEZGRkZVOwotICAgICptYXggPSAweDAwMDA7Ci0KLSAgICB3aGlsZSAoIHAgPCBsaW1pdCApCi0gICAgewotICAgICAgRlRfVVNob3J0ICB2YWw7Ci0KLQotICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICB2YWwgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAqbWluID0gKEZUX0J5dGUpRlRfTUlOKCAqbWluLCB2YWwgKTsKLSAgICAgICptYXggPSAoRlRfQnl0ZSlGVF9NQVgoICptYXgsIHZhbCApOwotICAgIH0KLQotICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCA9IChGVF9VTG9uZykoIHAgLSB0YWJsZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIEJJTlNFQVJDSEhFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX0JpblNyY2hIZWFkZXJfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHVuaXRTaXplOwotICAgIEZUX1VTaG9ydCAgblVuaXRzOwotICAgIEZUX1VTaG9ydCAgc2VhcmNoUmFuZ2U7Ci0gICAgRlRfVVNob3J0ICBlbnRyeVNlbGVjdG9yOwotICAgIEZUX1VTaG9ydCAgcmFuZ2VTaGlmdDsKLQotICB9IEdYVl9CaW5TcmNoSGVhZGVyOwotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X0JpblNyY2hIZWFkZXJfY2hlY2tfY29uc2lzdGVuY3koIEdYVl9CaW5TcmNoSGVhZGVyKiAgYmluU3JjaEhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgICAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VU2hvcnQgIHNlYXJjaFJhbmdlOwotICAgIEZUX1VTaG9ydCAgZW50cnlTZWxlY3RvcjsKLSAgICBGVF9VU2hvcnQgIHJhbmdlU2hpZnQ7Ci0KLQotICAgIGlmICggYmluU3JjaEhlYWRlci0+dW5pdFNpemUgPT0gMCApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBpZiAoIGJpblNyY2hIZWFkZXItPm5Vbml0cyA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIGJpblNyY2hIZWFkZXItPnNlYXJjaFJhbmdlICAgPT0gMCAmJgotICAgICAgICAgICBiaW5TcmNoSGVhZGVyLT5lbnRyeVNlbGVjdG9yID09IDAgJiYKLSAgICAgICAgICAgYmluU3JjaEhlYWRlci0+cmFuZ2VTaGlmdCAgICA9PSAwICkKLSAgICAgICAgcmV0dXJuOwotICAgICAgZWxzZQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gICAgZm9yICggc2VhcmNoUmFuZ2UgPSAxLCBlbnRyeVNlbGVjdG9yID0gMTsKLSAgICAgICAgICAoIHNlYXJjaFJhbmdlICogMiApIDw9IGJpblNyY2hIZWFkZXItPm5Vbml0cyAmJgotICAgICAgICAgICAgc2VhcmNoUmFuZ2UgPCAweDgwMDBVOwotICAgICAgICAgIHNlYXJjaFJhbmdlICo9IDIsIGVudHJ5U2VsZWN0b3IrKyApCi0gICAgICA7Ci0KLSAgICBlbnRyeVNlbGVjdG9yLS07Ci0gICAgc2VhcmNoUmFuZ2UgPSAoRlRfVVNob3J0KSggc2VhcmNoUmFuZ2UgKiBiaW5TcmNoSGVhZGVyLT51bml0U2l6ZSApOwotICAgIHJhbmdlU2hpZnQgID0gKEZUX1VTaG9ydCkoIGJpblNyY2hIZWFkZXItPm5Vbml0cyAqIGJpblNyY2hIZWFkZXItPnVuaXRTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzZWFyY2hSYW5nZSApOwotCi0gICAgaWYgKCBzZWFyY2hSYW5nZSAgICE9IGJpblNyY2hIZWFkZXItPnNlYXJjaFJhbmdlICAgfHwKLSAgICAgICAgIGVudHJ5U2VsZWN0b3IgIT0gYmluU3JjaEhlYWRlci0+ZW50cnlTZWxlY3RvciB8fAotICAgICAgICAgcmFuZ2VTaGlmdCAgICAhPSBiaW5TcmNoSGVhZGVyLT5yYW5nZVNoaWZ0ICAgICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAiSW5jb25zaXN0ZW5jeSBmb3VuZCBpbiBCaW5TcmNoSGVhZGVyXG4iICkpOwotICAgICAgR1hWX1RSQUNFKCggIm9yaWdpbmFsbHk6IHVuaXRTaXplPSVkLCBuVW5pdHM9JWQsICIKLSAgICAgICAgICAgICAgICAgICJzZWFyY2hSYW5nZT0lZCwgZW50cnlTZWxlY3Rvcj0lZCwgIgotICAgICAgICAgICAgICAgICAgInJhbmdlU2hpZnQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgICBiaW5TcmNoSGVhZGVyLT51bml0U2l6ZSwgYmluU3JjaEhlYWRlci0+blVuaXRzLAotICAgICAgICAgICAgICAgICAgYmluU3JjaEhlYWRlci0+c2VhcmNoUmFuZ2UsIGJpblNyY2hIZWFkZXItPmVudHJ5U2VsZWN0b3IsCi0gICAgICAgICAgICAgICAgICBiaW5TcmNoSGVhZGVyLT5yYW5nZVNoaWZ0ICkpOwotICAgICAgR1hWX1RSQUNFKCggImNhbGN1bGF0ZWQ6IHVuaXRTaXplPSVkLCBuVW5pdHM9JWQsICIKLSAgICAgICAgICAgICAgICAgICJzZWFyY2hSYW5nZT0lZCwgZW50cnlTZWxlY3Rvcj0lZCwgIgotICAgICAgICAgICAgICAgICAgInJhbmdlU2hpZnQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgICBiaW5TcmNoSGVhZGVyLT51bml0U2l6ZSwgYmluU3JjaEhlYWRlci0+blVuaXRzLAotICAgICAgICAgICAgICAgICAgc2VhcmNoUmFuZ2UsIGVudHJ5U2VsZWN0b3IsIHJhbmdlU2hpZnQgKSk7Ci0KLSAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0RBVEEgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qCi0gICAqIHBhcnNlciAmIHZhbGlkYXRvciBvZiBCaW5TcmNoSGVhZGVyCi0gICAqIHdoaWNoIGlzIHVzZWQgaW4gTG9va3VwVGFibGUgZm9ybWF0IDIsIDQsIDYuCi0gICAqCi0gICAqIEVzc2VudGlhbCBwYXJhbWV0ZXJzICh1bml0U2l6ZSwgblVuaXRzKSBhcmUgcmV0dXJuZWQgYnkKLSAgICogZ2l2ZW4gcG9pbnRlciwgb3RoZXJzIChzZWFyY2hSYW5nZSwgZW50cnlTZWxlY3RvciwgcmFuZ2VTaGlmdCkKLSAgICogY2FuIGJlIGNhbGN1bGF0ZWQgYnkgZXNzZW50aWFsIHBhcmFtZXRlcnMsIHNvIHRoZXkgYXJlIGp1c3QKLSAgICogdmFsaWRhdGVkIGFuZCBkaXNjYXJkZWQuCi0gICAqCi0gICAqIEhvd2V2ZXIsIHdyb25nIHZhbHVlcyBpbiBzZWFyY2hSYW5nZSwgZW50cnlTZWxlY3RvciwgcmFuZ2VTaGlmdAotICAgKiB3b24ndCBjYXVzZSBmYXRhbCBlcnJvcnMsIGJlY2F1c2UgdGhlc2UgcGFyYW1ldGVycyBtaWdodCBiZQotICAgKiBvbmx5IHVzZWQgaW4gb2xkIG02OGsgZm9udCBkcml2ZXIgaW4gTWFjT1MuCi0gICAqICAgLS0gc3V6dWtpIHRvc2hpeWEgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBneHZfQmluU3JjaEhlYWRlcl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIHVuaXRTaXplX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBuVW5pdHNfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgIHAgPSB0YWJsZTsKLSAgICBHWFZfQmluU3JjaEhlYWRlciAgYmluU3JjaEhlYWRlcjsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJCaW5TcmNoSGVhZGVyIHZhbGlkYXRlIiApOwotCi0gICAgaWYgKCAqdW5pdFNpemVfcCA9PSAwICkKLSAgICB7Ci0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICAgIGJpblNyY2hIZWFkZXIudW5pdFNpemUgPSAgRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYmluU3JjaEhlYWRlci51bml0U2l6ZSA9ICp1bml0U2l6ZV9wOwotCi0gICAgaWYgKCAqblVuaXRzX3AgPT0gMCApCi0gICAgewotICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICBiaW5TcmNoSGVhZGVyLm5Vbml0cyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGJpblNyY2hIZWFkZXIublVuaXRzID0gKm5Vbml0c19wOwotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCAyICsgMiArIDIgKTsKLSAgICBiaW5TcmNoSGVhZGVyLnNlYXJjaFJhbmdlICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGJpblNyY2hIZWFkZXIuZW50cnlTZWxlY3RvciA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgYmluU3JjaEhlYWRlci5yYW5nZVNoaWZ0ICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBHWFZfVFJBQ0UoKCAiblVuaXRzICVkXG4iLCBiaW5TcmNoSGVhZGVyLm5Vbml0cyApKTsKLQotICAgIGd4dl9CaW5TcmNoSGVhZGVyX2NoZWNrX2NvbnNpc3RlbmN5KCAmYmluU3JjaEhlYWRlciwgZ3h2YWxpZCApOwotCi0gICAgaWYgKCAqdW5pdFNpemVfcCA9PSAwICkKLSAgICAgICp1bml0U2l6ZV9wID0gYmluU3JjaEhlYWRlci51bml0U2l6ZTsKLQotICAgIGlmICggKm5Vbml0c19wID09IDAgKQotICAgICAgKm5Vbml0c19wID0gYmluU3JjaEhlYWRlci5uVW5pdHM7Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIExPT0tVUCBUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgR1hWX0xPT0tVUF9WQUxVRV9MT0FEKCBQLCBTSUdOU1BFQyApICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIFAgKz0gMiwgZ3h2X2xvb2t1cF92YWx1ZV9sb2FkKCBQIC0gMiwgU0lHTlNQRUMgKSApCi0KLSAgc3RhdGljIEdYVl9Mb29rdXBWYWx1ZURlc2MKLSAgZ3h2X2xvb2t1cF92YWx1ZV9sb2FkKCBGVF9CeXRlcyAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc2lnbnNwZWMgKQotICB7Ci0gICAgR1hWX0xvb2t1cFZhbHVlRGVzYyAgdjsKLQotCi0gICAgaWYgKCBzaWduc3BlYyA9PSBHWFZfTE9PS1VQVkFMVUVfVU5TSUdORUQgKQotICAgICAgdi51ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBlbHNlCi0gICAgICB2LnMgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gdjsKLSAgfQotCi0KLSNkZWZpbmUgR1hWX1VOSVRTSVpFX1ZBTElEQVRFKCBGT1JNQVQsIFVOSVRTSVpFLCBOVU5JVFMsIENPUlJFQ1RTSVpFICkgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoIFVOSVRTSVpFICE9IENPUlJFQ1RTSVpFICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBGVF9FUlJPUigoICJ1bml0U2l6ZT0lZCBkaWZmZXJzIGZyb20iICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBleHBlY3RlZCB1bml0U2l6ZT0lZCIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIExvb2t1cFRhYmxlICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBVTklUU0laRSwgQ09SUkVDVFNJWkUsIEZPUk1BVCApKTsgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIGlmICggVU5JVFNJWkUgIT0gMCAmJiBOVU5JVFMgIT0gMCApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIiBjYW5ub3QgdmFsaWRhdGUgYW55bW9yZVxuIiApKTsgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiIGZvcmNpYmx5IGNvbnRpbnVlc1xuIiApKTsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0KLSAgLyogPT09PT09PT09PT09PT09PT0gU2ltcGxlIEFycmF5IEZvcm1hdCAwIExvb2t1cCBUYWJsZSA9PT09PT09PT09PT09PT09ICovCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9Mb29rdXBUYWJsZV9mbXQwX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSAgICBGVF9VU2hvcnQgIGk7Ci0KLSAgICBHWFZfTG9va3VwVmFsdWVEZXNjICB2YWx1ZTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJMb29rdXBUYWJsZSBmb3JtYXQgMCIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiAqIGd4dmFsaWQtPmZhY2UtPm51bV9nbHlwaHMgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgZ3h2YWxpZC0+ZmFjZS0+bnVtX2dseXBoczsgaSsrICkKLSAgICB7Ci0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICAgIGlmICggcCArIDIgPj0gbGltaXQgKSAgICAgLyogc29tZSBmb250cyBoYXZlIHRvby1zaG9ydCBmbXQwIGFycmF5ICovCi0gICAgICB7Ci0gICAgICAgIEdYVl9UUkFDRSgoICJ0b28gc2hvcnQsIGdseXBocyAlZCAtICVkIGFyZSBtaXNzaW5nXG4iLAotICAgICAgICAgICAgICAgICAgICBpLCBneHZhbGlkLT5mYWNlLT5udW1fZ2x5cGhzICkpOwotICAgICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9HTFlQSF9JRCApOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgdmFsdWUgPSBHWFZfTE9PS1VQX1ZBTFVFX0xPQUQoIHAsIGd4dmFsaWQtPmxvb2t1cHZhbF9zaWduICk7Ci0gICAgICBneHZhbGlkLT5sb29rdXB2YWxfZnVuYyggaSwgJnZhbHVlLCBneHZhbGlkICk7Ci0gICAgfQotCi0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gKEZUX1VMb25nKSggcCAtIHRhYmxlICk7Ci0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qID09PT09PT09PT09PT09PT09IFNlZ21lbnQgU2luZ2xlIEZvcm1hdCAyIExvb2t1cCBUYWJsZSA9PT09PT09PT09PT09PSAqLwotICAvKgotICAgKiBBcHBsZSBzcGVjIHNheXM6Ci0gICAqCi0gICAqICAgVG8gZ3VhcmFudGVlIHRoYXQgYSBiaW5hcnkgc2VhcmNoIHRlcm1pbmF0ZXMsIHlvdSBtdXN0IGluY2x1ZGUgb25lIG9yCi0gICAqICAgbW9yZSBzcGVjaWFsIGBlbmQgb2Ygc2VhcmNoIHRhYmxlJyB2YWx1ZXMgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSB0bwotICAgKiAgIGJlIHNlYXJjaGVkLiAgVGhlIG51bWJlciBvZiB0ZXJtaW5hdGlvbiB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlCi0gICAqICAgaW5jbHVkZWQgaXMgdGFibGUtc3BlY2lmaWMuICBUaGUgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgYmluYXJ5IHNlYXJjaAotICAgKiAgIHRlcm1pbmF0aW9uIGlzIDB4RkZGRi4KLSAgICoKLSAgICogVGhlIHByb2JsZW0gaXMgdGhhdCBuVW5pdHMgZG9lcyBub3QgaW5jbHVkZSB0aGlzIGVuZC1tYXJrZXIuICBJdCdzCi0gICAqIHF1aXRlIGRpZmZpY3VsdCB0byBkaXNjcmltaW5hdGUgd2hldGhlciB0aGUgZm9sbG93aW5nIDB4RkZGRiBjb21lcyBmcm9tCi0gICAqIHRoZSBlbmQtbWFya2VyIG9yIHNvbWUgbmV4dCBkYXRhLgotICAgKgotICAgKiAgIC0tIHN1enVraSB0b3NoaXlhIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4KLSAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9Mb29rdXBUYWJsZV9mbXQyX3NraXBfZW5kbWFya2VycyggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgdW5pdFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0KLSAgICB3aGlsZSAoICggcCArIDQgKSA8IGd4dmFsaWQtPnJvb3QtPmxpbWl0ICkKLSAgICB7Ci0gICAgICBpZiAoIHBbMF0gIT0gMHhGRiB8fCBwWzFdICE9IDB4RkYgfHwgLyogbGFzdEdseXBoICovCi0gICAgICAgICAgIHBbMl0gIT0gMHhGRiB8fCBwWzNdICE9IDB4RkYgKSAgLyogZmlyc3RHbHlwaCAqLwotICAgICAgICBicmVhazsKLSAgICAgIHAgKz0gdW5pdFNpemU7Ci0gICAgfQotCi0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gKEZUX1VMb25nKSggcCAtIHRhYmxlICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9Mb29rdXBUYWJsZV9mbXQyX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBwID0gdGFibGU7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgZ2lkOwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgdW5pdFNpemU7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgblVuaXRzOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIHVuaXQ7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgbGFzdEdseXBoOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIGZpcnN0R2x5cGg7Ci0gICAgR1hWX0xvb2t1cFZhbHVlRGVzYyAgdmFsdWU7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAiTG9va3VwVGFibGUgZm9ybWF0IDIiICk7Ci0KLSAgICB1bml0U2l6ZSA9IG5Vbml0cyA9IDA7Ci0gICAgZ3h2X0JpblNyY2hIZWFkZXJfdmFsaWRhdGUoIHAsIGxpbWl0LCAmdW5pdFNpemUsICZuVW5pdHMsIGd4dmFsaWQgKTsKLSAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLQotICAgIEdYVl9VTklUU0laRV9WQUxJREFURSggImZvcm1hdDIiLCB1bml0U2l6ZSwgblVuaXRzLCA2ICk7Ci0KLSAgICBmb3IgKCB1bml0ID0gMCwgZ2lkID0gMDsgdW5pdCA8IG5Vbml0czsgdW5pdCsrICkKLSAgICB7Ci0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICsgMiApOwotICAgICAgbGFzdEdseXBoICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBmaXJzdEdseXBoID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIHZhbHVlICAgICAgPSBHWFZfTE9PS1VQX1ZBTFVFX0xPQUQoIHAsIGd4dmFsaWQtPmxvb2t1cHZhbF9zaWduICk7Ci0KLSAgICAgIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCBmaXJzdEdseXBoLCBneHZhbGlkICk7Ci0gICAgICBneHZfZ2x5cGhpZF92YWxpZGF0ZSggbGFzdEdseXBoLCBneHZhbGlkICk7Ci0KLSAgICAgIGlmICggbGFzdEdseXBoIDwgZ2lkICkKLSAgICAgIHsKLSAgICAgICAgR1hWX1RSQUNFKCggInJldmVyc2Ugb3JkZXJlZCBzZWdtZW50IHNwZWNpZmljYXRpb246IgotICAgICAgICAgICAgICAgICAgICAiIGxhc3RHbHlwaFslZF09JWQgPCBsYXN0R2x5cGhbJWRdPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICB1bml0LCBsYXN0R2x5cGgsIHVuaXQgLSAxICwgZ2lkICkpOwotICAgICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9HTFlQSF9JRCApOwotICAgICAgfQotCi0gICAgICBpZiAoIGxhc3RHbHlwaCA8IGZpcnN0R2x5cGggKQotICAgICAgewotICAgICAgICBHWFZfVFJBQ0UoKCAicmV2ZXJzZSBvcmRlcmVkIHJhbmdlIHNwZWNpZmljYXRpb24gYXQgdW5pdCAlZDoiLAotICAgICAgICAgICAgICAgICAgICAiIGxhc3RHbHlwaCAlZCA8IGZpcnN0R2x5cGggJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgdW5pdCwgbGFzdEdseXBoLCBmaXJzdEdseXBoICkpOwotICAgICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9HTFlQSF9JRCApOwotCi0gICAgICAgIGlmICggZ3h2YWxpZC0+cm9vdC0+bGV2ZWwgPT0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICAgIGNvbnRpbnVlOyAgICAgLyogZnR4dmFsaWRhdG9yIHNpbGVudGx5IHNraXBzIHN1Y2ggYW4gZW50cnkgKi8KLQotICAgICAgICBGVF9UUkFDRTQoKCAiY29udGludWluZyB3aXRoIGV4Y2hhbmdlZCB2YWx1ZXNcbiIgKSk7Ci0gICAgICAgIGdpZCAgICAgICAgPSBmaXJzdEdseXBoOwotICAgICAgICBmaXJzdEdseXBoID0gbGFzdEdseXBoOwotICAgICAgICBsYXN0R2x5cGggID0gZ2lkOwotICAgICAgfQotCi0gICAgICBmb3IgKCBnaWQgPSBmaXJzdEdseXBoOyBnaWQgPD0gbGFzdEdseXBoOyBnaWQrKyApCi0gICAgICAgIGd4dmFsaWQtPmxvb2t1cHZhbF9mdW5jKCBnaWQsICZ2YWx1ZSwgZ3h2YWxpZCApOwotICAgIH0KLQotICAgIGd4dl9Mb29rdXBUYWJsZV9mbXQyX3NraXBfZW5kbWFya2VycyggcCwgdW5pdFNpemUsIGd4dmFsaWQgKTsKLSAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLQotICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCA9IChGVF9VTG9uZykoIHAgLSB0YWJsZSApOwotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICAvKiA9PT09PT09PT09PT09PT09PSBTZWdtZW50IEFycmF5IEZvcm1hdCA0IExvb2t1cCBUYWJsZSA9PT09PT09PT09PT09PT0gKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X0xvb2t1cFRhYmxlX2ZtdDRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgICAgICAgICAgIHAgPSB0YWJsZTsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICB1bml0OwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIGdpZDsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIHVuaXRTaXplOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIG5Vbml0czsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICBsYXN0R2x5cGg7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgZmlyc3RHbHlwaDsKLSAgICBHWFZfTG9va3VwVmFsdWVEZXNjICBiYXNlX3ZhbHVlOwotICAgIEdYVl9Mb29rdXBWYWx1ZURlc2MgIHZhbHVlOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIkxvb2t1cFRhYmxlIGZvcm1hdCA0IiApOwotCi0gICAgdW5pdFNpemUgPSBuVW5pdHMgPSAwOwotICAgIGd4dl9CaW5TcmNoSGVhZGVyX3ZhbGlkYXRlKCBwLCBsaW1pdCwgJnVuaXRTaXplLCAmblVuaXRzLCBneHZhbGlkICk7Ci0gICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0KLSAgICBHWFZfVU5JVFNJWkVfVkFMSURBVEUoICJmb3JtYXQ0IiwgdW5pdFNpemUsIG5Vbml0cywgNiApOwotCi0gICAgZm9yICggdW5pdCA9IDAsIGdpZCA9IDA7IHVuaXQgPCBuVW5pdHM7IHVuaXQrKyApCi0gICAgewotICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICsgMiApOwotICAgICAgbGFzdEdseXBoICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBmaXJzdEdseXBoID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgZ3h2X2dseXBoaWRfdmFsaWRhdGUoIGZpcnN0R2x5cGgsIGd4dmFsaWQgKTsKLSAgICAgIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCBsYXN0R2x5cGgsIGd4dmFsaWQgKTsKLQotICAgICAgaWYgKCBsYXN0R2x5cGggPCBnaWQgKQotICAgICAgewotICAgICAgICBHWFZfVFJBQ0UoKCAicmV2ZXJzZSBvcmRlcmVkIHNlZ21lbnQgc3BlY2lmaWNhdGlvbjoiCi0gICAgICAgICAgICAgICAgICAgICIgbGFzdEdseXBoWyVkXT0lZCA8IGxhc3RHbHlwaFslZF09JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIHVuaXQsIGxhc3RHbHlwaCwgdW5pdCAtIDEgLCBnaWQgKSk7Ci0gICAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0dMWVBIX0lEICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggbGFzdEdseXBoIDwgZmlyc3RHbHlwaCApCi0gICAgICB7Ci0gICAgICAgIEdYVl9UUkFDRSgoICJyZXZlcnNlIG9yZGVyZWQgcmFuZ2Ugc3BlY2lmaWNhdGlvbiBhdCB1bml0ICVkOiIsCi0gICAgICAgICAgICAgICAgICAgICIgbGFzdEdseXBoICVkIDwgZmlyc3RHbHlwaCAlZCAiLAotICAgICAgICAgICAgICAgICAgICB1bml0LCBsYXN0R2x5cGgsIGZpcnN0R2x5cGggKSk7Ci0gICAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0dMWVBIX0lEICk7Ci0KLSAgICAgICAgaWYgKCBneHZhbGlkLT5yb290LT5sZXZlbCA9PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgICAgY29udGludWU7IC8qIGZ0eHZhbGlkYXRvciBzaWxlbnRseSBza2lwcyBzdWNoIGFuIGVudHJ5ICovCi0KLSAgICAgICAgRlRfVFJBQ0U0KCggImNvbnRpbnVpbmcgd2l0aCBleGNoYW5nZWQgdmFsdWVzXG4iICkpOwotICAgICAgICBnaWQgICAgICAgID0gZmlyc3RHbHlwaDsKLSAgICAgICAgZmlyc3RHbHlwaCA9IGxhc3RHbHlwaDsKLSAgICAgICAgbGFzdEdseXBoICA9IGdpZDsKLSAgICAgIH0KLQotICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICBiYXNlX3ZhbHVlID0gR1hWX0xPT0tVUF9WQUxVRV9MT0FEKCBwLCBHWFZfTE9PS1VQVkFMVUVfVU5TSUdORUQgKTsKLQotICAgICAgZm9yICggZ2lkID0gZmlyc3RHbHlwaDsgZ2lkIDw9IGxhc3RHbHlwaDsgZ2lkKysgKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IGd4dmFsaWQtPmxvb2t1cGZtdDRfdHJhbnMoIChGVF9VU2hvcnQpKCBnaWQgLSBmaXJzdEdseXBoICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotCi0gICAgICAgIGd4dmFsaWQtPmxvb2t1cHZhbF9mdW5jKCBnaWQsICZ2YWx1ZSwgZ3h2YWxpZCApOwotICAgICAgfQotICAgIH0KLQotICAgIGd4dl9Mb29rdXBUYWJsZV9mbXQyX3NraXBfZW5kbWFya2VycyggcCwgdW5pdFNpemUsIGd4dmFsaWQgKTsKLSAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLQotICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCA9IChGVF9VTG9uZykoIHAgLSB0YWJsZSApOwotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICAvKiA9PT09PT09PT09PT09PT09PSBTZWdtZW50IFRhYmxlIEZvcm1hdCA2IExvb2t1cCBUYWJsZSA9PT09PT09PT09PT09PT0gKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X0xvb2t1cFRhYmxlX2ZtdDZfc2tpcF9lbmRtYXJrZXJzKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICB1bml0U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLQotICAgIHdoaWxlICggcCA8IGd4dmFsaWQtPnJvb3QtPmxpbWl0ICkKLSAgICB7Ci0gICAgICBpZiAoIHBbMF0gIT0gMHhGRiB8fCBwWzFdICE9IDB4RkYgKQotICAgICAgICBicmVhazsKLSAgICAgIHAgKz0gdW5pdFNpemU7Ci0gICAgfQotCi0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gKEZUX1VMb25nKSggcCAtIHRhYmxlICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9Mb29rdXBUYWJsZV9mbXQ2X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBwID0gdGFibGU7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgdW5pdDsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICBwcmV2X2dseXBoOwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgdW5pdFNpemU7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgblVuaXRzOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIGdseXBoOwotICAgIEdYVl9Mb29rdXBWYWx1ZURlc2MgIHZhbHVlOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIkxvb2t1cFRhYmxlIGZvcm1hdCA2IiApOwotCi0gICAgdW5pdFNpemUgPSBuVW5pdHMgPSAwOwotICAgIGd4dl9CaW5TcmNoSGVhZGVyX3ZhbGlkYXRlKCBwLCBsaW1pdCwgJnVuaXRTaXplLCAmblVuaXRzLCBneHZhbGlkICk7Ci0gICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0KLSAgICBHWFZfVU5JVFNJWkVfVkFMSURBVEUoICJmb3JtYXQ2IiwgdW5pdFNpemUsIG5Vbml0cywgNCApOwotCi0gICAgZm9yICggdW5pdCA9IDAsIHByZXZfZ2x5cGggPSAwOyB1bml0IDwgblVuaXRzOyB1bml0KysgKQotICAgIHsKLSAgICAgIEdYVl9MSU1JVF9DSEVDSyggMiArIDIgKTsKLSAgICAgIGdseXBoID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIHZhbHVlID0gR1hWX0xPT0tVUF9WQUxVRV9MT0FEKCBwLCBneHZhbGlkLT5sb29rdXB2YWxfc2lnbiApOwotCi0gICAgICBpZiAoIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCBnbHlwaCwgZ3h2YWxpZCApICkKLSAgICAgICAgR1hWX1RSQUNFKCggIiBlbmRtYXJrZXIgZm91bmQgd2l0aGluIGRlZmluZWQgcmFuZ2UiCi0gICAgICAgICAgICAgICAgICAgICIgKGVudHJ5ICVkIDwgblVuaXRzPSVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgdW5pdCwgblVuaXRzICkpOwotCi0gICAgICBpZiAoIHByZXZfZ2x5cGggPiBnbHlwaCApCi0gICAgICB7Ci0gICAgICAgIEdYVl9UUkFDRSgoICJjdXJyZW50IGdpZCAweCUwNHggPCBwcmV2aW91cyBnaWQgMHglMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICBnbHlwaCwgcHJldl9nbHlwaCApKTsKLSAgICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfR0xZUEhfSUQgKTsKLSAgICAgIH0KLSAgICAgIHByZXZfZ2x5cGggPSBnbHlwaDsKLQotICAgICAgZ3h2YWxpZC0+bG9va3VwdmFsX2Z1bmMoIGdseXBoLCAmdmFsdWUsIGd4dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBneHZfTG9va3VwVGFibGVfZm10Nl9za2lwX2VuZG1hcmtlcnMoIHAsIHVuaXRTaXplLCBneHZhbGlkICk7Ci0gICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyogPT09PT09PT09PT09PT09PT0gVHJpbW1lZCBBcnJheSBGb3JtYXQgOCBMb29rdXAgVGFibGUgPT09PT09PT09PT09PT09ICovCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9Mb29rdXBUYWJsZV9mbXQ4X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgcCA9IHRhYmxlOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBpOwotCi0gICAgR1hWX0xvb2t1cFZhbHVlRGVzYyAgIHZhbHVlOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBmaXJzdEdseXBoOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBnbHlwaENvdW50OwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIkxvb2t1cFRhYmxlIGZvcm1hdCA4IiApOwotCi0gICAgLyogZmlyc3RHbHlwaCArIGdseXBoQ291bnQgKi8KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICk7Ci0gICAgZmlyc3RHbHlwaCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgZ2x5cGhDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBneHZfZ2x5cGhpZF92YWxpZGF0ZSggZmlyc3RHbHlwaCwgZ3h2YWxpZCApOwotICAgIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCAoRlRfVVNob3J0KSggZmlyc3RHbHlwaCArIGdseXBoQ291bnQgKSwgZ3h2YWxpZCApOwotCi0gICAgLyogdmFsdWVBcnJheSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgZ2x5cGhDb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICAgIHZhbHVlID0gR1hWX0xPT0tVUF9WQUxVRV9MT0FEKCBwLCBneHZhbGlkLT5sb29rdXB2YWxfc2lnbiApOwotICAgICAgZ3h2YWxpZC0+bG9va3VwdmFsX2Z1bmMoIChGVF9VU2hvcnQpKCBmaXJzdEdseXBoICsgaSApLCAmdmFsdWUsIGd4dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X0xvb2t1cFRhYmxlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgcCA9IHRhYmxlOwotICAgIEZUX1VTaG9ydCAgZm9ybWF0OwotCi0gICAgR1hWX1ZhbGlkYXRlX0Z1bmMgIGZtdF9mdW5jc190YWJsZVtdID0KLSAgICB7Ci0gICAgICBneHZfTG9va3VwVGFibGVfZm10MF92YWxpZGF0ZSwgLyogMCAqLwotICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgKi8KLSAgICAgIGd4dl9Mb29rdXBUYWJsZV9mbXQyX3ZhbGlkYXRlLCAvKiAyICovCi0gICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMyAqLwotICAgICAgZ3h2X0xvb2t1cFRhYmxlX2ZtdDRfdmFsaWRhdGUsIC8qIDQgKi8KLSAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1ICovCi0gICAgICBneHZfTG9va3VwVGFibGVfZm10Nl92YWxpZGF0ZSwgLyogNiAqLwotICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcgKi8KLSAgICAgIGd4dl9Mb29rdXBUYWJsZV9mbXQ4X3ZhbGlkYXRlLCAvKiA4ICovCi0gICAgfTsKLQotICAgIEdYVl9WYWxpZGF0ZV9GdW5jICBmdW5jOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIkxvb2t1cFRhYmxlIiApOwotCi0gICAgLyogbG9va3VwdGJsX2hlYWQgbWF5IGJlIHVzZWQgaW4gZm10NCB0cmFuc2l0IGZ1bmN0aW9uLiAqLwotICAgIGd4dmFsaWQtPmxvb2t1cHRibF9oZWFkID0gdGFibGU7Ci0KLSAgICAvKiBmb3JtYXQgKi8KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBmb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEdYVl9UUkFDRSgoICIgKGZvcm1hdCAlZClcbiIsIGZvcm1hdCApKTsKLQotICAgIGlmICggZm9ybWF0ID4gOCApCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIGZ1bmMgPSBmbXRfZnVuY3NfdGFibGVbZm9ybWF0XTsKLSAgICBpZiAoICFmdW5jICkKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgZnVuYyggcCwgbGltaXQsIGd4dmFsaWQgKTsKLSAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLQotICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCA9IChGVF9VTG9uZykoIHAgLSB0YWJsZSApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2x5cGggSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfSW50ICkKLSAgZ3h2X2dseXBoaWRfdmFsaWRhdGUoIEZUX1VTaG9ydCAgICAgIGdpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfRmFjZSAgZmFjZTsKLQotCi0gICAgaWYgKCBnaWQgPT0gMHhGRkZGVSApCi0gICAgewotICAgICAgR1hWX0VYSVQ7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBmYWNlID0gZ3h2YWxpZC0+ZmFjZTsKLSAgICBpZiAoIGZhY2UtPm51bV9nbHlwaHMgPCBnaWQgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICIgZ3h2X2dseXBoaWRfY2hlY2soKSBnaWQgb3ZlcmZsb3c6IG51bV9nbHlwaHMgJWQgPCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9nbHlwaHMsIGdpZCApKTsKLSAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0dMWVBIX0lEICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIENPTlRST0wgUE9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9jdGxQb2ludF92YWxpZGF0ZSggRlRfVVNob3J0ICAgICAgZ2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIGN0bF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0ZhY2UgICAgICAgZmFjZTsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotCi0gICAgRlRfR2x5cGhTbG90ICBnbHlwaDsKLSAgICBGVF9PdXRsaW5lICAgIG91dGxpbmU7Ci0gICAgRlRfVVNob3J0ICAgICBuX3BvaW50czsKLQotCi0gICAgZmFjZSA9IGd4dmFsaWQtPmZhY2U7Ci0KLSAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX0JJVE1BUCB8IEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLQotICAgIGdseXBoICAgID0gZmFjZS0+Z2x5cGg7Ci0gICAgb3V0bGluZSAgPSBnbHlwaC0+b3V0bGluZTsKLSAgICBuX3BvaW50cyA9IChGVF9VU2hvcnQpb3V0bGluZS5uX3BvaW50czsKLQotICAgIGlmICggISggY3RsX3BvaW50IDwgbl9wb2ludHMgKSApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZOVCBOQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9zZm50TmFtZV92YWxpZGF0ZSggRlRfVVNob3J0ICAgICAgbmFtZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBtaW5faW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgbWF4X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfU2ZudE5hbWUgIG5hbWU7Ci0gICAgRlRfVUludCAgICAgIGk7Ci0gICAgRlRfVUludCAgICAgIG5uYW1lczsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJzZm50TmFtZSIgKTsKLQotICAgIGlmICggbmFtZV9pbmRleCA8IG1pbl9pbmRleCB8fCBtYXhfaW5kZXggPCBuYW1lX2luZGV4ICkKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgbm5hbWVzID0gRlRfR2V0X1NmbnRfTmFtZV9Db3VudCggZ3h2YWxpZC0+ZmFjZSApOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbm5hbWVzOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggRlRfR2V0X1NmbnRfTmFtZSggZ3h2YWxpZC0+ZmFjZSwgaSwgJm5hbWUgKSAhPSBGVF9FcnJfT2sgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBuYW1lLm5hbWVfaWQgPT0gbmFtZV9pbmRleCApCi0gICAgICAgIGdvdG8gT3V0OwotICAgIH0KLQotICAgIEdYVl9UUkFDRSgoICIgIG5hbWVJbmRleCA9ICVkIChVTlRJVExFRClcbiIsIG5hbWVfaW5kZXggKSk7Ci0gICAgRlRfSU5WQUxJRF9EQVRBOwotICAgIGdvdG8gRXhpdDsgIC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLQotICBPdXQ6Ci0gICAgRlRfVFJBQ0UxKCggIiAgbmFtZUluZGV4ID0gJWQgKCIsIG5hbWVfaW5kZXggKSk7Ci0gICAgR1hWX1RSQUNFX0hFWERVTVBfU0ZOVE5BTUUoIG5hbWUgKTsKLSAgICBGVF9UUkFDRTEoKCAiKVxuIiApKTsKLQotICBFeGl0OgotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbGFzcyBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAvKgotICAgKiBoaWdoZXN0Q2xhc3Mgc3BlY2lmaWVzIGhvdyBtYW55IGNsYXNzZXMgYXJlIGRlZmluZWQgaW4gdGhpcwotICAgKiBDbGFzcyBTdWJ0YWJsZS4gIEFwcGxlIHNwZWMgZG9lcyBub3QgbWVudGlvbiB3aGV0aGVyIHVuZGVmaW5lZAotICAgKiBob2xlcyBpbiB0aGUgY2xhc3MgKGUuZy46IDAtMyBhcmUgcHJlZGVmaW5lZCwgNCBpcyB1bnVzZWQsIDUgaXMgdXNlZCkKLSAgICogYXJlIHBlcm1pdHRlZC4gIEF0IHByZXNlbnQsIGhvbGVzIGluIGEgZGVmaW5lZCBjbGFzcyBhcmUgbm90IGNoZWNrZWQuCi0gICAqICAgLS0gc3V6dWtpIHRvc2hpeWEgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgotICAgKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfQ2xhc3NUYWJsZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBsZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIHN0YXRlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgIG1heENsYXNzSURfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICBwICAgICA9IHRhYmxlOwotICAgIEZUX0J5dGVzICAgbGltaXQgPSB0YWJsZSArICpsZW5ndGhfcDsKLSAgICBGVF9VU2hvcnQgIGZpcnN0R2x5cGg7Ci0gICAgRlRfVVNob3J0ICBuR2x5cGhzOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIkNsYXNzVGFibGUiICk7Ci0KLSAgICAqbWF4Q2xhc3NJRF9wID0gMzsgIC8qIENsYXNzZXMgMCwgMiwgYW5kIDMgYXJlIHByZWRlZmluZWQgKi8KLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiArIDIgKTsKLSAgICBmaXJzdEdseXBoID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBuR2x5cGhzICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIEdYVl9UUkFDRSgoICIgKGZpcnN0R2x5cGggPSAlZCwgbkdseXBocyA9ICVkKVxuIiwgZmlyc3RHbHlwaCwgbkdseXBocyApKTsKLQotICAgIGlmICggIW5HbHlwaHMgKQotICAgICAgZ290byBPdXQ7Ci0KLSAgICBneHZfZ2x5cGhpZF92YWxpZGF0ZSggKEZUX1VTaG9ydCkoIGZpcnN0R2x5cGggKyBuR2x5cGhzICksIGd4dmFsaWQgKTsKLQotICAgIHsKLSAgICAgIEZUX0J5dGUgICAgbkdseXBoSW5DbGFzc1syNTZdOwotICAgICAgRlRfQnl0ZSAgICBjbGFzc0lEOwotICAgICAgRlRfVVNob3J0ICBpOwotCi0KLSAgICAgIEZUX01FTV9aRVJPKCBuR2x5cGhJbkNsYXNzLCAyNTYgKTsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IG5HbHlwaHM7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEdYVl9MSU1JVF9DSEVDSyggMSApOwotICAgICAgICBjbGFzc0lEID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICAgIHN3aXRjaCAoIGNsYXNzSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogZm9sbG93aW5nIGNsYXNzZXMgc2hvdWxkIG5vdCBhcHBlYXIgaW4gY2xhc3MgYXJyYXkgKi8KLSAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAvKiBlbmQgb2YgdGV4dCAqLwotICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgIC8qIG91dCBvZiBib3VuZHMgKi8KLSAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAvKiBlbmQgb2YgbGluZSAqLwotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgIC8qIG91dCBvZiBib3VuZHMgKi8KLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiB1c2VyLWRlZmluZWQ6IDQgLSAoIHN0YXRlU2l6ZSAtIDEgKSAqLwotICAgICAgICAgIGlmICggY2xhc3NJRCA+PSBzdGF0ZVNpemUgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOyAgIC8qIGFzc2lnbiBnbHlwaCB0byB1bmRlZmluZWQgc3RhdGUgKi8KLQotICAgICAgICAgIG5HbHlwaEluQ2xhc3NbY2xhc3NJRF0rKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgKmxlbmd0aF9wID0gKEZUX1VTaG9ydCkoIHAgLSB0YWJsZSApOwotCi0gICAgICAvKiBzY2FuIG1heCBDbGFzc0lEIGluIHVzZSAqLwotICAgICAgZm9yICggaSA9IDA7IGkgPCBzdGF0ZVNpemU7IGkrKyApCi0gICAgICAgIGlmICggKCAzIDwgaSApICYmICggbkdseXBoSW5DbGFzc1tpXSA+IDAgKSApCi0gICAgICAgICAgKm1heENsYXNzSURfcCA9IChGVF9CeXRlKWk7ICAvKiBYWFg6IENoZWNrIFJhbmdlPyAqLwotICAgIH0KLQotICBPdXQ6Ci0gICAgR1hWX1RSQUNFKCggIkRlY2xhcmVkIHN0YXRlU2l6ZT0weCUwMngsIFVzZWQgbWF4Q2xhc3NJRD0weCUwMnhcbiIsCi0gICAgICAgICAgICAgICAgc3RhdGVTaXplLCAqbWF4Q2xhc3NJRF9wICkpOwotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGUgQXJyYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfU3RhdGVBcnJheV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBsZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgICAgIG1heENsYXNzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBzdGF0ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICBtYXhTdGF0ZV9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgbWF4RW50cnlfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgICAgID0gdGFibGU7Ci0gICAgRlRfQnl0ZXMgIGxpbWl0ID0gdGFibGUgKyAqbGVuZ3RoX3A7Ci0gICAgRlRfQnl0ZSAgIGNsYXp6OwotICAgIEZUX0J5dGUgICBlbnRyeTsKLQotICAgIEZUX1VOVVNFRCggc3RhdGVTaXplICk7IC8qIGZvciB0aGUgbm9uLWRlYnVnZ2luZyBjYXNlICovCi0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAiU3RhdGVBcnJheSIgKTsKLQotICAgIEdYVl9UUkFDRSgoICJwYXJzZSAlZCBieXRlcyBieSBzdGF0ZVNpemU9JWQgbWF4Q2xhc3NJRD0lZFxuIiwKLSAgICAgICAgICAgICAgICAoaW50KSgqbGVuZ3RoX3ApLCBzdGF0ZVNpemUsIChpbnQpKG1heENsYXNzSUQpICkpOwotCi0gICAgLyoKLSAgICAgKiAyIHN0YXRlcyBhcmUgcHJlZGVmaW5lZCBhbmQgbXVzdCBiZSBkZXNjcmliZWQgaW4gU3RhdGVBcnJheToKLSAgICAgKiBzdGF0ZSAwIChzdGFydCBvZiB0ZXh0KSwgMSAoc3RhcnQgb2YgbGluZSkKLSAgICAgKi8KLSAgICBHWFZfTElNSVRfQ0hFQ0soICggMSArIG1heENsYXNzSUQgKSAqIDIgKTsKLQotICAgICptYXhTdGF0ZV9wID0gMDsKLSAgICAqbWF4RW50cnlfcCA9IDA7Ci0KLSAgICAvKiByZWFkIGlmIGVub3VnaCB0byByZWFkIGFub3RoZXIgc3RhdGUgKi8KLSAgICB3aGlsZSAoIHAgKyAoIDEgKyBtYXhDbGFzc0lEICkgPD0gbGltaXQgKQotICAgIHsKLSAgICAgICgqbWF4U3RhdGVfcCkrKzsKLSAgICAgIGZvciAoIGNsYXp6ID0gMDsgY2xhenogPD0gbWF4Q2xhc3NJRDsgY2xhenorKyApCi0gICAgICB7Ci0gICAgICAgIGVudHJ5ID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICAgICptYXhFbnRyeV9wID0gKEZUX0J5dGUpRlRfTUFYKCAqbWF4RW50cnlfcCwgZW50cnkgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgR1hWX1RSQUNFKCggInBhcnNlZDogbWF4U3RhdGU9JWQsIG1heEVudHJ5PSVkXG4iLAotICAgICAgICAgICAgICAgICptYXhTdGF0ZV9wLCAqbWF4RW50cnlfcCApKTsKLQotICAgICpsZW5ndGhfcCA9IChGVF9VU2hvcnQpKCBwIC0gdGFibGUgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW50cnkgVGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfRW50cnlUYWJsZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBsZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgICAgIG1heEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgc3RhdGVBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIHN0YXRlQXJyYXlfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgICAgbWF4Q2xhc3NJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIHN0YXRldGFibGVfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBzdGF0ZXRhYmxlX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCAgICAgPSB0YWJsZTsKLSAgICBGVF9CeXRlcyAgbGltaXQgPSB0YWJsZSArICpsZW5ndGhfcDsKLSAgICBGVF9CeXRlICAgZW50cnk7Ci0gICAgRlRfQnl0ZSAgIHN0YXRlOwotICAgIEZUX0ludCAgICBlbnRyeVNpemUgPSAyICsgMiArIEdYVl9HTFlQSE9GRlNFVF9TSVpFKCBzdGF0ZXRhYmxlICk7Ci0KLSAgICBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXREZXNjICBnbHlwaE9mZnNldDsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJFbnRyeVRhYmxlIiApOwotCi0gICAgR1hWX1RSQUNFKCggIm1heEVudHJ5PSVkIGVudHJ5U2l6ZT0lZFxuIiwgbWF4RW50cnksIGVudHJ5U2l6ZSApKTsKLQotICAgIGlmICggKCBtYXhFbnRyeSArIDEgKSAqIGVudHJ5U2l6ZSA+ICpsZW5ndGhfcCApCi0gICAgewotICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfVE9PX1NIT1JUICk7Ci0KLSAgICAgIC8qIGZ0eHZhbGlkYXRvciBhbmQgRm9udFZhbGlkYXRvciBib3RoIHdhcm4gYW5kIGNvbnRpbnVlICovCi0gICAgICBtYXhFbnRyeSA9IChGVF9CeXRlKSggKmxlbmd0aF9wIC8gZW50cnlTaXplIC0gMSApOwotICAgICAgR1hWX1RSQUNFKCggInRvbyBsYXJnZSBtYXhFbnRyeSwgc2hyaW5raW5nIHRvICVkIGZpdCBFbnRyeVRhYmxlIGxlbmd0aFxuIiwKLSAgICAgICAgICAgICAgICAgIG1heEVudHJ5ICkpOwotICAgIH0KLQotICAgIGZvciAoIGVudHJ5ID0gMDsgZW50cnkgPD0gbWF4RW50cnk7IGVudHJ5KysgKQotICAgIHsKLSAgICAgIEZUX1VTaG9ydCAgbmV3U3RhdGU7Ci0gICAgICBGVF9VU2hvcnQgIGZsYWdzOwotCi0KLSAgICAgIEdYVl9MSU1JVF9DSEVDSyggMiArIDIgKTsKLSAgICAgIG5ld1N0YXRlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGZsYWdzICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotCi0gICAgICBpZiAoIG5ld1N0YXRlIDwgc3RhdGVBcnJheSAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHN0YXRlQXJyYXkgKyBzdGF0ZUFycmF5X2xlbmd0aCA8IG5ld1N0YXRlICkKLSAgICAgIHsKLSAgICAgICAgR1hWX1RSQUNFKCggIiBuZXdTdGF0ZSBvZmZzZXQgMHglMDR4IGlzIG91dCBvZiBzdGF0ZUFycmF5XG4iLAotICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSApKTsKLSAgICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfT0ZGU0VUICk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIDAgIT0gKCAoIG5ld1N0YXRlIC0gc3RhdGVBcnJheSApICUgKCAxICsgbWF4Q2xhc3NJRCApICkgKQotICAgICAgewotICAgICAgICBHWFZfVFJBQ0UoKCAiIG5ld1N0YXRlIG9mZnNldCAweCUwNHggaXMgbm90IGFsaWduZWQgdG8gJWQtY2xhc3Nlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUsICAxICsgbWF4Q2xhc3NJRCApKTsKLSAgICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfT0ZGU0VUICk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBzdGF0ZSA9IChGVF9CeXRlKSggKCBuZXdTdGF0ZSAtIHN0YXRlQXJyYXkgKSAvICggMSArIG1heENsYXNzSUQgKSApOwotCi0gICAgICBzd2l0Y2ggKCBHWFZfR0xZUEhPRkZTRVRfRk1UKCBzdGF0ZXRhYmxlICkgKQotICAgICAgewotICAgICAgY2FzZSBHWFZfR0xZUEhPRkZTRVRfTk9ORToKLSAgICAgICAgZ2x5cGhPZmZzZXQudWMgPSAwOyAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHWFZfR0xZUEhPRkZTRVRfVUNIQVI6Ci0gICAgICAgIGdseXBoT2Zmc2V0LnVjID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdYVl9HTFlQSE9GRlNFVF9DSEFSOgotICAgICAgICBnbHlwaE9mZnNldC5jID0gRlRfTkVYVF9DSEFSKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdYVl9HTFlQSE9GRlNFVF9VU0hPUlQ6Ci0gICAgICAgIGdseXBoT2Zmc2V0LnUgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHWFZfR0xZUEhPRkZTRVRfU0hPUlQ6Ci0gICAgICAgIGdseXBoT2Zmc2V0LnMgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdYVl9HTFlQSE9GRlNFVF9VTE9ORzoKLSAgICAgICAgZ2x5cGhPZmZzZXQudWwgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdYVl9HTFlQSE9GRlNFVF9MT05HOgotICAgICAgICBnbHlwaE9mZnNldC5sID0gRlRfTkVYVF9MT05HKCBwICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZiAoIGd4dmFsaWQtPnN0YXRldGFibGUuZW50cnlfdmFsaWRhdGVfZnVuYyApCi0gICAgICAgIGd4dmFsaWQtPnN0YXRldGFibGUuZW50cnlfdmFsaWRhdGVfZnVuYyggc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRldGFibGVfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGV0YWJsZV9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0gICAgfQotCi0gICAgKmxlbmd0aF9wID0gKEZUX1VTaG9ydCkoIHAgLSB0YWJsZSApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdGF0ZSBUYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9TdGF0ZVRhYmxlX3N1YnRhYmxlX3NldHVwKCBGVF9VU2hvcnQgICAgICB0YWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgY2xhc3NUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIHN0YXRlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBlbnRyeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgY2xhc3NUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIHN0YXRlQXJyYXlfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBlbnRyeVRhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VU2hvcnQgICBvWzNdOwotICAgIEZUX1VTaG9ydCogIGxbM107Ci0gICAgRlRfVVNob3J0ICAgYnVmZls0XTsKLQotCi0gICAgb1swXSA9IGNsYXNzVGFibGU7Ci0gICAgb1sxXSA9IHN0YXRlQXJyYXk7Ci0gICAgb1syXSA9IGVudHJ5VGFibGU7Ci0gICAgbFswXSA9IGNsYXNzVGFibGVfbGVuZ3RoX3A7Ci0gICAgbFsxXSA9IHN0YXRlQXJyYXlfbGVuZ3RoX3A7Ci0gICAgbFsyXSA9IGVudHJ5VGFibGVfbGVuZ3RoX3A7Ci0KLSAgICBneHZfc2V0X2xlbmd0aF9ieV91c2hvcnRfb2Zmc2V0KCBvLCBsLCBidWZmLCAzLCB0YWJsZV9zaXplLCBneHZhbGlkICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9TdGF0ZVRhYmxlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VU2hvcnQgICBzdGF0ZVNpemU7Ci0gICAgRlRfVVNob3J0ICAgY2xhc3NUYWJsZTsgICAgIC8qIG9mZnNldCB0byBDbGFzcyhTdWIpVGFibGUgKi8KLSAgICBGVF9VU2hvcnQgICBzdGF0ZUFycmF5OyAgICAgLyogb2Zmc2V0IHRvIFN0YXRlQXJyYXkgKi8KLSAgICBGVF9VU2hvcnQgICBlbnRyeVRhYmxlOyAgICAgLyogb2Zmc2V0IHRvIEVudHJ5VGFibGUgKi8KLQotICAgIEZUX1VTaG9ydCAgIGNsYXNzVGFibGVfbGVuZ3RoOwotICAgIEZUX1VTaG9ydCAgIHN0YXRlQXJyYXlfbGVuZ3RoOwotICAgIEZUX1VTaG9ydCAgIGVudHJ5VGFibGVfbGVuZ3RoOwotICAgIEZUX0J5dGUgICAgIG1heENsYXNzSUQ7Ci0gICAgRlRfQnl0ZSAgICAgbWF4U3RhdGU7Ci0gICAgRlRfQnl0ZSAgICAgbWF4RW50cnk7Ci0KLSAgICBHWFZfU3RhdGVUYWJsZV9TdWJ0YWJsZV9TZXR1cF9GdW5jICBzZXR1cF9mdW5jOwotCi0gICAgRlRfQnl0ZXMgICAgcCA9IHRhYmxlOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIlN0YXRlVGFibGUiICk7Ci0KLSAgICBHWFZfVFJBQ0UoKCAiU3RhdGVUYWJsZSBoZWFkZXJcbiIgKSk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICsgMiArIDIgKTsKLSAgICBzdGF0ZVNpemUgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBjbGFzc1RhYmxlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBzdGF0ZUFycmF5ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBlbnRyeVRhYmxlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIEdYVl9UUkFDRSgoICJzdGF0ZVNpemU9MHglMDR4XG4iLCBzdGF0ZVNpemUgKSk7Ci0gICAgR1hWX1RSQUNFKCggIm9mZnNldCB0byBjbGFzc1RhYmxlPTB4JTA0eFxuIiwgY2xhc3NUYWJsZSApKTsKLSAgICBHWFZfVFJBQ0UoKCAib2Zmc2V0IHRvIHN0YXRlQXJyYXk9MHglMDR4XG4iLCBzdGF0ZUFycmF5ICkpOwotICAgIEdYVl9UUkFDRSgoICJvZmZzZXQgdG8gZW50cnlUYWJsZT0weCUwNHhcbiIsIGVudHJ5VGFibGUgKSk7Ci0KLSAgICBpZiAoIHN0YXRlU2l6ZSA+IDB4RkYgKQotICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgaWYgKCBneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGFfbG9hZF9mdW5jICkKLSAgICAgIGd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YV9sb2FkX2Z1bmMoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICBpZiAoIGd4dmFsaWQtPnN0YXRldGFibGUuc3VidGFibGVfc2V0dXBfZnVuYyApCi0gICAgICBzZXR1cF9mdW5jID0gZ3h2YWxpZC0+c3RhdGV0YWJsZS5zdWJ0YWJsZV9zZXR1cF9mdW5jOwotICAgIGVsc2UKLSAgICAgIHNldHVwX2Z1bmMgPSBneHZfU3RhdGVUYWJsZV9zdWJ0YWJsZV9zZXR1cDsKLQotICAgIHNldHVwX2Z1bmMoIChGVF9VU2hvcnQpKCBsaW1pdCAtIHRhYmxlICksCi0gICAgICAgICAgICAgICAgY2xhc3NUYWJsZSwKLSAgICAgICAgICAgICAgICBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgIGVudHJ5VGFibGUsCi0gICAgICAgICAgICAgICAgJmNsYXNzVGFibGVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICZzdGF0ZUFycmF5X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAmZW50cnlUYWJsZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotCi0gICAgR1hWX1RSQUNFKCggIlN0YXRlVGFibGUgU3VidGFibGVzXG4iICkpOwotCi0gICAgaWYgKCBjbGFzc1RhYmxlICE9IDAgKQotICAgICAgZ3h2X0NsYXNzVGFibGVfdmFsaWRhdGUoIHRhYmxlICsgY2xhc3NUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xhc3NUYWJsZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhDbGFzc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQgKTsKLSAgICBlbHNlCi0gICAgICBtYXhDbGFzc0lEID0gKEZUX0J5dGUpKCBzdGF0ZVNpemUgLSAxICk7Ci0KLSAgICBpZiAoIHN0YXRlQXJyYXkgIT0gMCApCi0gICAgICBneHZfU3RhdGVBcnJheV92YWxpZGF0ZSggdGFibGUgKyBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZUFycmF5X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDbGFzc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQgKTsKLSAgICBlbHNlCi0gICAgewotI2lmIDAKLSAgICAgIG1heFN0YXRlID0gMTsgICAgIC8qIDA6c3RhcnQgb2YgdGV4dCwgMTpzdGFydCBvZiBsaW5lIGFyZSBwcmVkZWZpbmVkICovCi0jZW5kaWYKLSAgICAgIG1heEVudHJ5ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoIG1heEVudHJ5ID4gMCAmJiBlbnRyeVRhYmxlID09IDAgKQotICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0KLSAgICBpZiAoIGVudHJ5VGFibGUgIT0gMCApCi0gICAgICBneHZfRW50cnlUYWJsZV92YWxpZGF0ZSggdGFibGUgKyBlbnRyeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnRyeVRhYmxlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQXJyYXlfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENsYXNzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qID09PT09PT09PT09PT09PT09IGVYdGVuZGVkIFN0YXRlIFRhYmxlIChmb3IgbW9yeCkgPT09PT09PT09PT09PT09PT09PSAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9YU3RhdGVUYWJsZV9zdWJ0YWJsZV9zZXR1cCggRlRfVUxvbmcgICAgICAgdGFibGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBjbGFzc1RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIHN0YXRlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgZW50cnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICBjbGFzc1RhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIHN0YXRlQXJyYXlfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgZW50cnlUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX1VMb25nICAgb1szXTsKLSAgICBGVF9VTG9uZyogIGxbM107Ci0gICAgRlRfVUxvbmcgICBidWZmWzRdOwotCi0KLSAgICBvWzBdID0gY2xhc3NUYWJsZTsKLSAgICBvWzFdID0gc3RhdGVBcnJheTsKLSAgICBvWzJdID0gZW50cnlUYWJsZTsKLSAgICBsWzBdID0gY2xhc3NUYWJsZV9sZW5ndGhfcDsKLSAgICBsWzFdID0gc3RhdGVBcnJheV9sZW5ndGhfcDsKLSAgICBsWzJdID0gZW50cnlUYWJsZV9sZW5ndGhfcDsKLQotICAgIGd4dl9zZXRfbGVuZ3RoX2J5X3Vsb25nX29mZnNldCggbywgbCwgYnVmZiwgMywgdGFibGVfc2l6ZSwgZ3h2YWxpZCApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfWENsYXNzVGFibGVfbG9va3VwdmFsX3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0xvb2t1cFZhbHVlQ1B0ciAgdmFsdWVfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGdseXBoICk7Ci0KLSAgICBpZiAoIHZhbHVlX3AtPnUgPj0gZ3h2YWxpZC0+eHN0YXRldGFibGUubkNsYXNzZXMgKQotICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgIGlmICggdmFsdWVfcC0+dSA+IGd4dmFsaWQtPnhzdGF0ZXRhYmxlLm1heENsYXNzSUQgKQotICAgICAgZ3h2YWxpZC0+eHN0YXRldGFibGUubWF4Q2xhc3NJRCA9IHZhbHVlX3AtPnU7Ci0gIH0KLQotCi0gIC8qCi0gICAgKz09PT09PT09PT09PT09PSsgLS0tLS0tLS0rCi0gICAgfCBsb29rdXAgaGVhZGVyIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCBCaW5TcmNoSGVhZGVyIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCBsYXN0R2x5cGhbMF0gIHwgICAgICAgICB8Ci0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBmaXJzdEdseXBoWzBdIHwgICAgICAgICB8ICAgIGhlYWQgb2YgbG9va3VwIHRhYmxlCi0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICAgICAgICsKLSAgICB8IG9mZnNldFswXSAgICAgfCAgICAtPiAgIHwgICAgICAgICAgb2Zmc2V0ICAgICAgICAgICAgW2J5dGVdCi0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8ICAgICAgICAgICAgICsKLSAgICB8IGxhc3RHbHlwaFsxXSAgfCAgICAgICAgIHwgKGdseXBoSUQgLSBmaXJzdEdseXBoKSAqIDIgW2J5dGVdCi0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBmaXJzdEdseXBoWzFdIHwgICAgICAgICB8Ci0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBvZmZzZXRbMV0gICAgIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIC4uLi4gICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgMTZiaXQgdmFsdWUgYXJyYXkgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCAgICAgdmFsdWUgICAgIHwgPC0tLS0tLS0rCi0gICAgIC4uLi4KLSAgKi8KLSAgc3RhdGljIEdYVl9Mb29rdXBWYWx1ZURlc2MKLSAgZ3h2X1hDbGFzc1RhYmxlX2xvb2t1cGZtdDRfdHJhbnNpdCggRlRfVVNob3J0ICAgICAgICAgICAgcmVsYXRpdmVfZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfTG9va3VwVmFsdWVDUHRyICBiYXNlX3ZhbHVlX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgICAgIGxvb2t1cHRibF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBwOwotICAgIEZUX0J5dGVzICAgICAgICAgICAgIGxpbWl0OwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIG9mZnNldDsKLSAgICBHWFZfTG9va3VwVmFsdWVEZXNjICB2YWx1ZTsKLQotICAgIC8qIFhYWDogY2hlY2sgcmFuZ2U/ICovCi0gICAgb2Zmc2V0ID0gKEZUX1VTaG9ydCkoIGJhc2VfdmFsdWVfcC0+dSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlX2dpbmRleCAqIHNpemVvZiAoIEZUX1VTaG9ydCApICk7Ci0KLSAgICBwICAgICA9IGd4dmFsaWQtPmxvb2t1cHRibF9oZWFkICsgb2Zmc2V0OwotICAgIGxpbWl0ID0gbG9va3VwdGJsX2xpbWl0OwotCi0gICAgR1hWX0xJTUlUX0NIRUNLICggMiApOwotICAgIHZhbHVlLnUgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfWFN0YXRlQXJyYXlfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIGxlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIG1heENsYXNzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgc3RhdGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIG1heFN0YXRlX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgbWF4RW50cnlfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgcCA9IHRhYmxlOwotICAgIEZUX0J5dGVzICAgbGltaXQgPSB0YWJsZSArICpsZW5ndGhfcDsKLSAgICBGVF9VU2hvcnQgIGNsYXp6OwotICAgIEZUX1VTaG9ydCAgZW50cnk7Ci0KLSAgICBGVF9VTlVTRUQoIHN0YXRlU2l6ZSApOyAvKiBmb3IgdGhlIG5vbi1kZWJ1Z2dpbmcgY2FzZSAqLwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIlhTdGF0ZUFycmF5IiApOwotCi0gICAgR1hWX1RSQUNFKCggInBhcnNlICUgM2QgYnl0ZXMgYnkgc3RhdGVTaXplPSUgM2QgbWF4Q2xhc3NJRD0lIDNkXG4iLAotICAgICAgICAgICAgICAgIChpbnQpKCpsZW5ndGhfcCksIHN0YXRlU2l6ZSwgKGludCkobWF4Q2xhc3NJRCkgKSk7Ci0KLSAgICAvKgotICAgICAqIDIgc3RhdGVzIGFyZSBwcmVkZWZpbmVkIGFuZCBtdXN0IGJlIGRlc2NyaWJlZDoKLSAgICAgKiBzdGF0ZSAwIChzdGFydCBvZiB0ZXh0KSwgMSAoc3RhcnQgb2YgbGluZSkKLSAgICAgKi8KLSAgICBHWFZfTElNSVRfQ0hFQ0soICggMSArIG1heENsYXNzSUQgKSAqIDIgKiAyICk7Ci0KLSAgICAqbWF4U3RhdGVfcCA9IDA7Ci0gICAgKm1heEVudHJ5X3AgPSAwOwotCi0gICAgLyogcmVhZCBpZiBlbm91Z2ggdG8gcmVhZCBhbm90aGVyIHN0YXRlICovCi0gICAgd2hpbGUgKCBwICsgKCAoIDEgKyBtYXhDbGFzc0lEICkgKiAyICkgPD0gbGltaXQgKQotICAgIHsKLSAgICAgICgqbWF4U3RhdGVfcCkrKzsKLSAgICAgIGZvciAoIGNsYXp6ID0gMDsgY2xhenogPD0gbWF4Q2xhc3NJRDsgY2xhenorKyApCi0gICAgICB7Ci0gICAgICAgIGVudHJ5ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgKm1heEVudHJ5X3AgPSAoRlRfVVNob3J0KUZUX01BWCggKm1heEVudHJ5X3AsIGVudHJ5ICk7Ci0gICAgICB9Ci0gICAgfQotICAgIEdYVl9UUkFDRSgoICJwYXJzZWQ6IG1heFN0YXRlPSVkLCBtYXhFbnRyeT0lZFxuIiwKLSAgICAgICAgICAgICAgICAqbWF4U3RhdGVfcCwgKm1heEVudHJ5X3AgKSk7Ci0KLSAgICAqbGVuZ3RoX3AgPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfWEVudHJ5VGFibGVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIGxlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIG1heEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIHN0YXRlQXJyYXlfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIG1heENsYXNzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgeHN0YXRldGFibGVfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgeHN0YXRldGFibGVfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSAgICBGVF9CeXRlcyAgIGxpbWl0ID0gdGFibGUgKyAqbGVuZ3RoX3A7Ci0gICAgRlRfVVNob3J0ICBlbnRyeTsKLSAgICBGVF9VU2hvcnQgIHN0YXRlOwotICAgIEZUX0ludCAgICAgZW50cnlTaXplID0gMiArIDIgKyBHWFZfR0xZUEhPRkZTRVRfU0laRSggeHN0YXRldGFibGUgKTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJYRW50cnlUYWJsZSIgKTsKLSAgICBHWFZfVFJBQ0UoKCAibWF4RW50cnk9JWQgZW50cnlTaXplPSVkXG4iLCBtYXhFbnRyeSwgZW50cnlTaXplICkpOwotCi0gICAgaWYgKCAoIHAgKyAoIG1heEVudHJ5ICsgMSApICogZW50cnlTaXplICkgPiBsaW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIGZvciAoZW50cnkgPSAwOyBlbnRyeSA8PSBtYXhFbnRyeTsgZW50cnkrKyApCi0gICAgewotICAgICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGVfaWR4OwotICAgICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgICBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXREZXNjICBnbHlwaE9mZnNldDsKLQotCi0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICk7Ci0gICAgICBuZXdTdGF0ZV9pZHggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgZmxhZ3MgICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBzdGF0ZUFycmF5X2xlbmd0aCA8IChGVF9VTG9uZykoIG5ld1N0YXRlX2lkeCAqIDIgKSApCi0gICAgICB7Ci0gICAgICAgIEdYVl9UUkFDRSgoICIgIG5ld1N0YXRlIGluZGV4IDB4JTA0eCBwb2ludHMgb3V0IG9mIHN0YXRlQXJyYXlcbiIsCi0gICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlX2lkeCApKTsKLSAgICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfT0ZGU0VUICk7Ci0gICAgICB9Ci0KLSAgICAgIHN0YXRlID0gKEZUX1VTaG9ydCkoIG5ld1N0YXRlX2lkeCAvICggMSArIG1heENsYXNzSUQgKSApOwotICAgICAgaWYgKCAwICE9ICggbmV3U3RhdGVfaWR4ICUgKCAxICsgbWF4Q2xhc3NJRCApICkgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiLT4gbmV3IHN0YXRlID0gJWQgKHN1cHBvc2VkKVxuIgotICAgICAgICAgICAgICAgICAgICAiYnV0IG5ld1N0YXRlIGluZGV4IDB4JTA0eCBpcyBub3QgYWxpZ25lZCB0byAlZC1jbGFzc2VzXG4iLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgbmV3U3RhdGVfaWR4LCAgMSArIG1heENsYXNzSUQgKSk7Ci0gICAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX09GRlNFVCApOwotICAgICAgfQotCi0gICAgICBzd2l0Y2ggKCBHWFZfR0xZUEhPRkZTRVRfRk1UKCB4c3RhdGV0YWJsZSApICkKLSAgICAgIHsKLSAgICAgIGNhc2UgR1hWX0dMWVBIT0ZGU0VUX05PTkU6Ci0gICAgICAgIGdseXBoT2Zmc2V0LnVjID0gMDsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHWFZfR0xZUEhPRkZTRVRfVUNIQVI6Ci0gICAgICAgIGdseXBoT2Zmc2V0LnVjID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdYVl9HTFlQSE9GRlNFVF9DSEFSOgotICAgICAgICBnbHlwaE9mZnNldC5jID0gRlRfTkVYVF9DSEFSKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdYVl9HTFlQSE9GRlNFVF9VU0hPUlQ6Ci0gICAgICAgIGdseXBoT2Zmc2V0LnUgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHWFZfR0xZUEhPRkZTRVRfU0hPUlQ6Ci0gICAgICAgIGdseXBoT2Zmc2V0LnMgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdYVl9HTFlQSE9GRlNFVF9VTE9ORzoKLSAgICAgICAgZ2x5cGhPZmZzZXQudWwgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdYVl9HTFlQSE9GRlNFVF9MT05HOgotICAgICAgICBnbHlwaE9mZnNldC5sID0gRlRfTkVYVF9MT05HKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9GT1JNQVQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLmVudHJ5X3ZhbGlkYXRlX2Z1bmMgKQotICAgICAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5lbnRyeV92YWxpZGF0ZV9mdW5jKCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHN0YXRldGFibGVfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdGF0ZXRhYmxlX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKmxlbmd0aF9wID0gKEZUX1VMb25nKSggcCAtIHRhYmxlICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X1hTdGF0ZVRhYmxlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIC8qIFN0YXRlSGVhZGVyIG1lbWJlcnMgKi8KLSAgICBGVF9VTG9uZyAgIGNsYXNzVGFibGU7ICAgICAgLyogb2Zmc2V0IHRvIENsYXNzKFN1YilUYWJsZSAqLwotICAgIEZUX1VMb25nICAgc3RhdGVBcnJheTsgICAgICAvKiBvZmZzZXQgdG8gU3RhdGVBcnJheSAqLwotICAgIEZUX1VMb25nICAgZW50cnlUYWJsZTsgICAgICAvKiBvZmZzZXQgdG8gRW50cnlUYWJsZSAqLwotCi0gICAgRlRfVUxvbmcgICBjbGFzc1RhYmxlX2xlbmd0aDsKLSAgICBGVF9VTG9uZyAgIHN0YXRlQXJyYXlfbGVuZ3RoOwotICAgIEZUX1VMb25nICAgZW50cnlUYWJsZV9sZW5ndGg7Ci0gICAgRlRfVVNob3J0ICBtYXhTdGF0ZTsKLSAgICBGVF9VU2hvcnQgIG1heEVudHJ5OwotCi0gICAgR1hWX1hTdGF0ZVRhYmxlX1N1YnRhYmxlX1NldHVwX0Z1bmMgIHNldHVwX2Z1bmM7Ci0KLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJYU3RhdGVUYWJsZSIgKTsKLQotICAgIEdYVl9UUkFDRSgoICJYU3RhdGVUYWJsZSBoZWFkZXJcbiIgKSk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDQgKyA0ICsgNCArIDQgKTsKLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5uQ2xhc3NlcyA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBjbGFzc1RhYmxlID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgIHN0YXRlQXJyYXkgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgZW50cnlUYWJsZSA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIEdYVl9UUkFDRSgoICJuQ2xhc3NlcyA9MHglMDh4XG4iLCBneHZhbGlkLT54c3RhdGV0YWJsZS5uQ2xhc3NlcyApKTsKLSAgICBHWFZfVFJBQ0UoKCAib2Zmc2V0IHRvIGNsYXNzVGFibGU9MHglMDh4XG4iLCBjbGFzc1RhYmxlICkpOwotICAgIEdYVl9UUkFDRSgoICJvZmZzZXQgdG8gc3RhdGVBcnJheT0weCUwOHhcbiIsIHN0YXRlQXJyYXkgKSk7Ci0gICAgR1hWX1RSQUNFKCggIm9mZnNldCB0byBlbnRyeVRhYmxlPTB4JTA4eFxuIiwgZW50cnlUYWJsZSApKTsKLQotICAgIGlmICggZ3h2YWxpZC0+eHN0YXRldGFibGUubkNsYXNzZXMgPiAweEZGRkZVICkKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgIEdYVl9UUkFDRSgoICJTdGF0ZVRhYmxlIFN1YnRhYmxlc1xuIiApKTsKLQotICAgIGlmICggZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YV9sb2FkX2Z1bmMgKQotICAgICAgZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YV9sb2FkX2Z1bmMoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICBpZiAoIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLnN1YnRhYmxlX3NldHVwX2Z1bmMgKQotICAgICAgc2V0dXBfZnVuYyA9IGd4dmFsaWQtPnhzdGF0ZXRhYmxlLnN1YnRhYmxlX3NldHVwX2Z1bmM7Ci0gICAgZWxzZQotICAgICAgc2V0dXBfZnVuYyA9IGd4dl9YU3RhdGVUYWJsZV9zdWJ0YWJsZV9zZXR1cDsKLQotICAgIHNldHVwX2Z1bmMoIChGVF9VTG9uZykoIGxpbWl0IC0gdGFibGUgKSwKLSAgICAgICAgICAgICAgICBjbGFzc1RhYmxlLAotICAgICAgICAgICAgICAgIHN0YXRlQXJyYXksCi0gICAgICAgICAgICAgICAgZW50cnlUYWJsZSwKLSAgICAgICAgICAgICAgICAmY2xhc3NUYWJsZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgJnN0YXRlQXJyYXlfbGVuZ3RoLAotICAgICAgICAgICAgICAgICZlbnRyeVRhYmxlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0KLSAgICBpZiAoIGNsYXNzVGFibGUgIT0gMCApCi0gICAgewotICAgICAgZ3h2YWxpZC0+eHN0YXRldGFibGUubWF4Q2xhc3NJRCA9IDA7Ci0gICAgICBneHZhbGlkLT5sb29rdXB2YWxfc2lnbiAgICAgICAgID0gR1hWX0xPT0tVUFZBTFVFX1VOU0lHTkVEOwotICAgICAgZ3h2YWxpZC0+bG9va3VwdmFsX2Z1bmMgICAgICAgICA9IGd4dl9YQ2xhc3NUYWJsZV9sb29rdXB2YWxfdmFsaWRhdGU7Ci0gICAgICBneHZhbGlkLT5sb29rdXBmbXQ0X3RyYW5zICAgICAgID0gZ3h2X1hDbGFzc1RhYmxlX2xvb2t1cGZtdDRfdHJhbnNpdDsKLSAgICAgIGd4dl9Mb29rdXBUYWJsZV92YWxpZGF0ZSggdGFibGUgKyBjbGFzc1RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArIGNsYXNzVGFibGUgKyBjbGFzc1RhYmxlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotI2lmIDAKLSAgICAgIGlmICggZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoIDwgY2xhc3NUYWJsZV9sZW5ndGggKQotICAgICAgICBjbGFzc1RhYmxlX2xlbmd0aCA9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogWFhYOiBjaGVjayByYW5nZT8gKi8KLSAgICAgIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLm1heENsYXNzSUQgPQotICAgICAgICAoRlRfVVNob3J0KSggZ3h2YWxpZC0+eHN0YXRldGFibGUubkNsYXNzZXMgLSAxICk7Ci0gICAgfQotCi0gICAgaWYgKCBzdGF0ZUFycmF5ICE9IDAgKQotICAgICAgZ3h2X1hTdGF0ZUFycmF5X3ZhbGlkYXRlKCB0YWJsZSArIHN0YXRlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZUFycmF5X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZC0+eHN0YXRldGFibGUubWF4Q2xhc3NJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZC0+eHN0YXRldGFibGUubkNsYXNzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0gICAgZWxzZQotICAgIHsKLSNpZiAwCi0gICAgICBtYXhTdGF0ZSA9IDE7IC8qIDA6c3RhcnQgb2YgdGV4dCwgMTpzdGFydCBvZiBsaW5lIGFyZSBwcmVkZWZpbmVkICovCi0jZW5kaWYKLSAgICAgIG1heEVudHJ5ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoIG1heEVudHJ5ID4gMCAmJiBlbnRyeVRhYmxlID09IDAgKQotICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0KLSAgICBpZiAoIGVudHJ5VGFibGUgIT0gMCApCi0gICAgICBneHZfWEVudHJ5VGFibGVfdmFsaWRhdGUoIHRhYmxlICsgZW50cnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5VGFibGVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVBcnJheV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLm1heENsYXNzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG92ZXJsYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyBpbnQKLSAgZ3h2X2NvbXBhcmVfcmFuZ2VzKCBGVF9CeXRlcyAgdGFibGUxX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB0YWJsZTFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZTJfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHRhYmxlMl9sZW5ndGggKQotICB7Ci0gICAgaWYgKCB0YWJsZTFfc3RhcnQgPT0gdGFibGUyX3N0YXJ0ICkKLSAgICB7Ci0gICAgICBpZiAoICggdGFibGUxX2xlbmd0aCA9PSAwIHx8IHRhYmxlMl9sZW5ndGggPT0gMCApICkKLSAgICAgICAgZ290byBPdXQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB0YWJsZTFfc3RhcnQgPCB0YWJsZTJfc3RhcnQgKQotICAgIHsKLSAgICAgIGlmICggKCB0YWJsZTFfc3RhcnQgKyB0YWJsZTFfbGVuZ3RoICkgPD0gdGFibGUyX3N0YXJ0ICkKLSAgICAgICAgZ290byBPdXQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB0YWJsZTFfc3RhcnQgPiB0YWJsZTJfc3RhcnQgKQotICAgIHsKLSAgICAgIGlmICggKCB0YWJsZTFfc3RhcnQgPj0gdGFibGUyX3N0YXJ0ICsgdGFibGUyX2xlbmd0aCApICkKLSAgICAgICAgZ290byBPdXQ7Ci0gICAgfQotICAgIHJldHVybiAxOwotCi0gIE91dDoKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X29kdGVjdF9hZGRfcmFuZ2UoIEZUX0J5dGVzICAgICAgICAgIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9vZHRlY3RfUmFuZ2UgIG9kdGVjdCApCi0gIHsKLSAgICBvZHRlY3QtPnJhbmdlW29kdGVjdC0+blJhbmdlc10uc3RhcnQgID0gc3RhcnQ7Ci0gICAgb2R0ZWN0LT5yYW5nZVtvZHRlY3QtPm5SYW5nZXNdLmxlbmd0aCA9IGxlbmd0aDsKLSAgICBvZHRlY3QtPnJhbmdlW29kdGVjdC0+blJhbmdlc10ubmFtZSAgID0gKEZUX1N0cmluZyopbmFtZTsKLSAgICBvZHRlY3QtPm5SYW5nZXMrKzsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X29kdGVjdF92YWxpZGF0ZSggR1hWX29kdGVjdF9SYW5nZSAgb2R0ZWN0LAotICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICAgICBneHZhbGlkICkKLSAgewotICAgIEZUX1VJbnQgIGksIGo7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAiY2hlY2sgb3ZlcmxhcCBhbW9uZyBtdWx0aSByYW5nZXMiICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG9kdGVjdC0+blJhbmdlczsgaSsrICkKLSAgICAgIGZvciAoIGogPSAwOyBqIDwgaTsgaisrICkKLSAgICAgICAgaWYgKCAwICE9IGd4dl9jb21wYXJlX3Jhbmdlcyggb2R0ZWN0LT5yYW5nZVtpXS5zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2R0ZWN0LT5yYW5nZVtpXS5sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kdGVjdC0+cmFuZ2Vbal0uc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kdGVjdC0+cmFuZ2Vbal0ubGVuZ3RoICkgKQotICAgICAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBpZiAoIG9kdGVjdC0+cmFuZ2VbaV0ubmFtZSB8fCBvZHRlY3QtPnJhbmdlW2pdLm5hbWUgKQotICAgICAgICAgICAgR1hWX1RSQUNFKCggImZvdW5kIG92ZXJsYXAgYmV0d2VlbiByYW5nZSAlZCBhbmQgcmFuZ2UgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpLCBqICkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIEdYVl9UUkFDRSgoICJmb3VuZCBvdmVybGFwIGJldHdlZW4gYCVzJyBhbmQgYCVzXCdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvZHRlY3QtPnJhbmdlW2ldLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBvZHRlY3QtPnJhbmdlW2pdLm5hbWUgKSk7Ci0jZW5kaWYKLSAgICAgICAgICBGVF9JTlZBTElEX09GRlNFVDsKLSAgICAgICAgfQotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dmNvbW1uLmggYi9zcmMvZ3h2YWxpZC9neHZjb21tbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIxYzgwLi4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dmNvbW1uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2Y29tbW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIGNvbW1vbiB0YWJsZXMgdmFsaWRhdGlvbiAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiBrZXl3b3JkcyBpbiB2YXJpYWJsZSBuYW1pbmcKLSAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAqICB0YWJsZTogT2YgdHlwZSBGVF9CeXRlcywgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgdGFibGUvc3VidGFibGUuCi0gICAqICBsaW1pdDogT2YgdHlwZSBGVF9CeXRlcywgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGlzIHRhYmxlL3N1YnRhYmxlLAotICAgKiAgICAgICAgIGluY2x1ZGluZyBwYWRkaW5nIGZvciBhbGlnbm1lbnQuCi0gICAqICBvZmZzZXQ6IE9mIHR5cGUgRlRfVUludCwgdGhlIG51bWJlciBvZiBvY3RldHMgZnJvbSB0aGUgc3RhcnQgdG8gdGFyZ2V0LgotICAgKiAgbGVuZ3RoOiBPZiB0eXBlIEZUX1VJbnQsIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGZyb20gdGhlIHN0YXJ0IHRvIHRoZQotICAgKiAgICAgICAgICBlbmQgaW4gdGhpcyB0YWJsZS9zdWJ0YWJsZSwgaW5jbHVkaW5nIHBhZGRpbmcgZm9yIGFsaWdubWVudC4KLSAgICoKLSAgICogIF9NSU4sIF9NQVg6IFNob3VsZCBiZSBhZGRlZCB0byB0aGUgdGFpbCBvZiBtYWNyb3MsIGFzIElOVF9NSU4sIGV0Yy4KLSAgICovCi0KLQotI2lmbmRlZiBHWFZDT01NTl9IXwotI2RlZmluZSBHWFZDT01NTl9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImd4dmFsaWQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX1NGTlRfTkFNRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogc29tZSB2YXJpYWJsZXMgYXJlIG5vdCBldmFsdWF0ZWQgb3Igb25seSB1c2VkIGluIHRyYWNlICovCi0KLSNpZmRlZiAgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSNkZWZpbmUgR1hWX0xPQURfVFJBQ0VfVkFSUwotI2Vsc2UKLSN1bmRlZiAgR1hWX0xPQURfVFJBQ0VfVkFSUwotI2VuZGlmCi0KLSN1bmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUyAvKiBkZWJ1ZyBwdXJwb3NlICovCi0KLSNkZWZpbmUgSVNfUEFSQU5PSURfVkFMSURBVElPTiAgICAgICAgICAoIGd4dmFsaWQtPnJvb3QtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICkKLSNkZWZpbmUgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIGVyciApICB7IGlmICggSVNfUEFSQU5PSURfVkFMSURBVElPTiApICggZXJyICk7IH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCBHWFZfVmFsaWRhdG9yUmVjXyogIEdYVl9WYWxpZGF0b3I7Ci0KLQotI2RlZmluZSBEVU1NWV9MSU1JVCAwCi0KLSAgdHlwZWRlZiB2b2lkCi0gICgqR1hWX1ZhbGlkYXRlX0Z1bmMpKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApOwotCi0KLSAgLyogPT09PT09PT09PT09PT09PT09PT09PSBMb29rdXBUYWJsZSBWYWxpZGF0b3IgPT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSAgdHlwZWRlZiB1bmlvbiAgR1hWX0xvb2t1cFZhbHVlRGVzY18KLSAgewotICAgIEZUX1VTaG9ydCB1OwotICAgIEZUX1Nob3J0ICBzOwotCi0gIH0gR1hWX0xvb2t1cFZhbHVlRGVzYzsKLQotICB0eXBlZGVmIGNvbnN0IEdYVl9Mb29rdXBWYWx1ZURlc2MqIEdYVl9Mb29rdXBWYWx1ZUNQdHI7Ci0KLSAgdHlwZWRlZiBlbnVtICBHWFZfTG9va3VwVmFsdWVfU2lnblNwZWNfCi0gIHsKLSAgICBHWFZfTE9PS1VQVkFMVUVfVU5TSUdORUQgPSAwLAotICAgIEdYVl9MT09LVVBWQUxVRV9TSUdORUQKLQotICB9IEdYVl9Mb29rdXBWYWx1ZV9TaWduU3BlYzsKLQotCi0gIHR5cGVkZWYgdm9pZAotICAoKkdYVl9Mb29rdXBfVmFsdWVfVmFsaWRhdGVfRnVuYykoIEZUX1VTaG9ydCAgICAgICAgICAgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9Mb29rdXBWYWx1ZUNQdHIgIHZhbHVlX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgICAgZ3h2YWxpZCApOwotCi0gIHR5cGVkZWYgR1hWX0xvb2t1cFZhbHVlRGVzYwotICAoKkdYVl9Mb29rdXBfRm10NF9UcmFuc2l0X0Z1bmMpKCBGVF9VU2hvcnQgICAgICAgICAgICByZWxhdGl2ZV9naW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9Mb29rdXBWYWx1ZUNQdHIgIGJhc2VfdmFsdWVfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAgICAgbG9va3VwdGJsX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICAgICAgICBneHZhbGlkICk7Ci0KLQotICAvKiA9PT09PT09PT09PT09PT09PT09PT09IFN0YXRlVGFibGUgVmFsaWRhdG9yID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotICB0eXBlZGVmIGVudW0gIEdYVl9HbHlwaE9mZnNldF9Gb3JtYXRfCi0gIHsKLSAgICBHWFZfR0xZUEhPRkZTRVRfTk9ORSAgID0gLTEsCi0gICAgR1hWX0dMWVBIT0ZGU0VUX1VDSEFSICA9IDIsCi0gICAgR1hWX0dMWVBIT0ZGU0VUX0NIQVIsCi0gICAgR1hWX0dMWVBIT0ZGU0VUX1VTSE9SVCA9IDQsCi0gICAgR1hWX0dMWVBIT0ZGU0VUX1NIT1JULAotICAgIEdYVl9HTFlQSE9GRlNFVF9VTE9ORyAgPSA4LAotICAgIEdYVl9HTFlQSE9GRlNFVF9MT05HCi0KLSAgfSBHWFZfR2x5cGhPZmZzZXRfRm9ybWF0OwotCi0KLSNkZWZpbmUgR1hWX0dMWVBIT0ZGU0VUX0ZNVCggdGFibGUgKSAgICAgICAgICAgXAotICAgICAgICAoIGd4dmFsaWQtPnRhYmxlLmVudHJ5X2dseXBob2Zmc2V0X2ZtdCApCi0KLSNkZWZpbmUgR1hWX0dMWVBIT0ZGU0VUX1NJWkUoIHRhYmxlICkgICAgICAgICAgICAgIFwKLSAgICAgICAgKCBneHZhbGlkLT50YWJsZS5lbnRyeV9nbHlwaG9mZnNldF9mbXQgLyAyICkKLQotCi0gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDE2Yml0IFN0YXRlVGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gIHR5cGVkZWYgdW5pb24gIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0RGVzY18KLSAgewotICAgIEZUX0J5dGUgICAgdWM7Ci0gICAgRlRfVVNob3J0ICB1OyAgICAgICAvKiBzYW1lIGFzIEdYVl9Mb29rdXBWYWx1ZURlc2MgKi8KLSAgICBGVF9VTG9uZyAgIHVsOwotICAgIEZUX0NoYXIgICAgYzsKLSAgICBGVF9TaG9ydCAgIHM7ICAgICAgIC8qIHNhbWUgYXMgR1hWX0xvb2t1cFZhbHVlRGVzYyAqLwotICAgIEZUX0xvbmcgICAgbDsKLQotICB9IEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0RGVzYzsKLQotICB0eXBlZGVmIGNvbnN0IEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0RGVzYyogR1hWX1N0YXRlVGFibGVfR2x5cGhPZmZzZXRDUHRyOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkdYVl9TdGF0ZVRhYmxlX1N1YnRhYmxlX1NldHVwX0Z1bmMpKCBGVF9VU2hvcnQgICAgICB0YWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBjbGFzc1RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBlbnRyeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBjbGFzc1RhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBzdGF0ZUFycmF5X2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBlbnRyeVRhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqR1hWX1N0YXRlVGFibGVfRW50cnlfVmFsaWRhdGVfRnVuYykoCi0gICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0gICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ciAgZ2x5cGhPZmZzZXRfcCwKLSAgICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXRhYmxlX3RhYmxlLAotICAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRldGFibGVfbGltaXQsCi0gICAgIEdYVl9WYWxpZGF0b3IgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkdYVl9TdGF0ZVRhYmxlX09wdERhdGFfTG9hZF9GdW5jKSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX1N0YXRlVGFibGVfVmFsaWRhdG9yUmVjXwotICB7Ci0gICAgR1hWX0dseXBoT2Zmc2V0X0Zvcm1hdCAgICAgICAgICAgICAgZW50cnlfZ2x5cGhvZmZzZXRfZm10OwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGRhdGE7Ci0KLSAgICBHWFZfU3RhdGVUYWJsZV9TdWJ0YWJsZV9TZXR1cF9GdW5jICBzdWJ0YWJsZV9zZXR1cF9mdW5jOwotICAgIEdYVl9TdGF0ZVRhYmxlX0VudHJ5X1ZhbGlkYXRlX0Z1bmMgIGVudHJ5X3ZhbGlkYXRlX2Z1bmM7Ci0gICAgR1hWX1N0YXRlVGFibGVfT3B0RGF0YV9Mb2FkX0Z1bmMgICAgb3B0ZGF0YV9sb2FkX2Z1bmM7Ci0KLSAgfSBHWFZfU3RhdGVUYWJsZV9WYWxpZGF0b3JSZWMsICpHWFZfU3RhdGVUYWJsZV9WYWxpZGF0b3JSZWNEYXRhOwotCi0KLSAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAzMmJpdCBYU3RhdGVUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgdHlwZWRlZiBHWFZfU3RhdGVUYWJsZV9HbHlwaE9mZnNldERlc2MgIEdYVl9YU3RhdGVUYWJsZV9HbHlwaE9mZnNldERlc2M7Ci0KLSAgdHlwZWRlZiBjb25zdCBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXREZXNjKiBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXRDUHRyOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkdYVl9YU3RhdGVUYWJsZV9TdWJ0YWJsZV9TZXR1cF9GdW5jKSggRlRfVUxvbmcgICAgICAgdGFibGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIGNsYXNzVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgZW50cnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIGNsYXNzVGFibGVfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICBzdGF0ZUFycmF5X2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgZW50cnlUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpHWFZfWFN0YXRlVGFibGVfRW50cnlfVmFsaWRhdGVfRnVuYykoCi0gICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0gICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ciAgZ2x5cGhPZmZzZXRfcCwKLSAgICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICB4c3RhdGV0YWJsZV90YWJsZSwKLSAgICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICB4c3RhdGV0YWJsZV9saW1pdCwKLSAgICAgR1hWX1ZhbGlkYXRvciAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0KLQotICB0eXBlZGVmIEdYVl9TdGF0ZVRhYmxlX09wdERhdGFfTG9hZF9GdW5jICBHWFZfWFN0YXRlVGFibGVfT3B0RGF0YV9Mb2FkX0Z1bmM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX1hTdGF0ZVRhYmxlX1ZhbGlkYXRvclJlY18KLSAgewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9nbHlwaG9mZnNldF9mbXQ7Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGRhdGE7Ci0KLSAgICBHWFZfWFN0YXRlVGFibGVfU3VidGFibGVfU2V0dXBfRnVuYyAgc3VidGFibGVfc2V0dXBfZnVuYzsKLSAgICBHWFZfWFN0YXRlVGFibGVfRW50cnlfVmFsaWRhdGVfRnVuYyAgZW50cnlfdmFsaWRhdGVfZnVuYzsKLSAgICBHWFZfWFN0YXRlVGFibGVfT3B0RGF0YV9Mb2FkX0Z1bmMgICAgb3B0ZGF0YV9sb2FkX2Z1bmM7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNsYXNzZXM7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENsYXNzSUQ7Ci0KLSAgfSBHWFZfWFN0YXRlVGFibGVfVmFsaWRhdG9yUmVjLCAqR1hWX1hTdGF0ZVRhYmxlX1ZhbGlkYXRvclJlY0RhdGE7Ci0KLQotICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX1ZhbGlkYXRvclJlY18KLSAgewotICAgIEZUX1ZhbGlkYXRvciAgcm9vdDsKLQotICAgIEZUX0ZhY2UgICAgICAgZmFjZTsKLSAgICB2b2lkKiAgICAgICAgIHRhYmxlX2RhdGE7Ci0KLSAgICBGVF9VTG9uZyAgICAgIHN1YnRhYmxlX2xlbmd0aDsKLQotICAgIEdYVl9Mb29rdXBWYWx1ZV9TaWduU3BlYyAgICAgICAgbG9va3VwdmFsX3NpZ247Ci0gICAgR1hWX0xvb2t1cF9WYWx1ZV9WYWxpZGF0ZV9GdW5jICBsb29rdXB2YWxfZnVuYzsKLSAgICBHWFZfTG9va3VwX0ZtdDRfVHJhbnNpdF9GdW5jICAgIGxvb2t1cGZtdDRfdHJhbnM7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXB0YmxfaGVhZDsKLQotICAgIEZUX1VTaG9ydCAgbWluX2dpZDsKLSAgICBGVF9VU2hvcnQgIG1heF9naWQ7Ci0KLSAgICBHWFZfU3RhdGVUYWJsZV9WYWxpZGF0b3JSZWMgICAgIHN0YXRldGFibGU7Ci0gICAgR1hWX1hTdGF0ZVRhYmxlX1ZhbGlkYXRvclJlYyAgICB4c3RhdGV0YWJsZTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgRlRfVUludCAgICAgICAgICAgICBkZWJ1Z19pbmRlbnQ7Ci0gICAgY29uc3QgRlRfU3RyaW5nKiAgICBkZWJ1Z19mdW5jdGlvbl9uYW1lWzNdOwotI2VuZGlmCi0KLSAgfSBHWFZfVmFsaWRhdG9yUmVjOwotCi0KLSNkZWZpbmUgR1hWX1RBQkxFX0RBVEEoIHRhZywgZmllbGQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCAoIChHWFZfICMjIHRhZyAjIyBfRGF0YSlneHZhbGlkLT50YWJsZV9kYXRhICktPmZpZWxkICkKLQotI3VuZGVmICBGVF9JTlZBTElEXwotI2RlZmluZSBGVF9JTlZBTElEXyggX2Vycm9yICkgXAotICAgICAgICAgIGZ0X3ZhbGlkYXRvcl9lcnJvciggZ3h2YWxpZC0+cm9vdCwgRlRfVEhST1coIF9lcnJvciApICkKLQotI2RlZmluZSBHWFZfTElNSVRfQ0hFQ0soIF9jb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoIHAgKyBfY291bnQgPiAoIGxpbWl0PyBsaW1pdCA6IGd4dmFsaWQtPnJvb3QtPmxpbWl0ICkgKSBcCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0jZGVmaW5lIEdYVl9JTklUICBneHZhbGlkLT5kZWJ1Z19pbmRlbnQgPSAwCi0KLSNkZWZpbmUgR1hWX05BTUVfRU5URVIoIG5hbWUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBneHZhbGlkLT5kZWJ1Z19pbmRlbnQgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiUqLnMiLCBneHZhbGlkLT5kZWJ1Z19pbmRlbnQsIDAgKSk7IFwKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIlcyB0YWJsZVxuIiwgbmFtZSApKTsgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0jZGVmaW5lIEdYVl9FWElUICBneHZhbGlkLT5kZWJ1Z19pbmRlbnQgLT0gMgotCi0jZGVmaW5lIEdYVl9UUkFDRSggcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiUqLnMiLCBneHZhbGlkLT5kZWJ1Z19pbmRlbnQsIDAgKSk7IFwKLSAgICAgICAgICAgIEZUX1RSQUNFNCggcyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0jZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotI2RlZmluZSBHWFZfSU5JVCAgICAgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKCAwICkKLSNkZWZpbmUgR1hWX05BTUVfRU5URVIoIG5hbWUgKSAgZG8geyB9IHdoaWxlICggMCApCi0jZGVmaW5lIEdYVl9FWElUICAgICAgICAgICAgICAgIGRvIHsgfSB3aGlsZSAoIDAgKQotCi0jZGVmaW5lIEdYVl9UUkFDRSggcyApICAgICAgICAgIGRvIHsgfSB3aGlsZSAoIDAgKQotCi0jZW5kaWYgIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAzMmJpdCBhbGlnbm1lbnQgY2hlY2tpbmcgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgR1hWXzMyQklUX0FMSUdOTUVOVF9WQUxJREFURSggYSApIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgaWYgKCAoYSkgJiAzICkgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBGVF9JTlZBTElEX09GRlNFVDsgICAgICAgIFwKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgRHVtcGluZyBCaW5hcnkgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEdYVl9UUkFDRV9IRVhEVU1QKCBwLCBsZW4gKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIEZUX0J5dGVzICBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIGZvciAoIGIgPSBwOyBiIDwgKEZUX0J5dGVzKXAgKyBsZW47IGIrKyApIFwKLSAgICAgICAgICAgICAgICBGVF9UUkFDRTEoKCJcXHglMDJ4IiwgKmIpKTsgICAgICAgICAgICAgXAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfRU5EX1NUTU5UCi0KLSNkZWZpbmUgR1hWX1RSQUNFX0hFWERVTVBfQyggcCwgbGVuICkgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgRlRfQnl0ZXMgIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgZm9yICggYiA9IHA7IGIgPCAoRlRfQnl0ZXMpcCArIGxlbjsgYisrICkgXAotICAgICAgICAgICAgICAgIGlmICggMHg0MCA8ICpiICYmICpiIDwgMHg3RSApICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBGVF9UUkFDRTEoKCIlYyIsICpiKSk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgRlRfVFJBQ0UxKCgiXFx4JTAyeCIsICpiKSk7ICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotI2RlZmluZSBHWFZfVFJBQ0VfSEVYRFVNUF9TRk5UTkFNRSggbiApICAgICAgICAgICAgICAgXAotICAgICAgICAgIEdYVl9UUkFDRV9IRVhEVU1QKCBuLnN0cmluZywgbi5zdHJpbmdfbGVuICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBMT09LVVAgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X0JpblNyY2hIZWFkZXJfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIHVuaXRTaXplX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBuVW5pdHNfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9Mb29rdXBUYWJsZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIEZUX0ludCApCi0gIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICBnaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBDT05UUk9MIFBPSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9jdGxQb2ludF92YWxpZGF0ZSggRlRfVVNob3J0ICAgICAgZ2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIGN0bF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIFNGTlQgTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9zZm50TmFtZV92YWxpZGF0ZSggRlRfVVNob3J0ICAgICAgbmFtZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBtaW5faW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgbWF4X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEUgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X1N0YXRlVGFibGVfc3VidGFibGVfc2V0dXAoIEZUX1VTaG9ydCAgICAgIHRhYmxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBjbGFzc1RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgc3RhdGVBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIGVudHJ5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBjbGFzc1RhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgc3RhdGVBcnJheV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIGVudHJ5VGFibGVfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBneHZfWFN0YXRlVGFibGVfc3VidGFibGVfc2V0dXAoIEZUX1VMb25nICAgICAgIHRhYmxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgY2xhc3NUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIGVudHJ5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgY2xhc3NUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICBzdGF0ZUFycmF5X2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIGVudHJ5VGFibGVfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X1N0YXRlVGFibGVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBneHZfWFN0YXRlVGFibGVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgVVRJTElUWSBNQUNST1MgQU5EIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X2FycmF5X2dldGxpbWl0c19ieXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9hcnJheV9nZXRsaW1pdHNfdXNob3J0KCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X3NldF9sZW5ndGhfYnlfdXNob3J0X29mZnNldCggRlRfVVNob3J0KiAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqKiAgICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIG5tZW1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X3NldF9sZW5ndGhfYnlfdWxvbmdfb2Zmc2V0KCBGVF9VTG9uZyogICAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqKiAgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgbm1lbWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCk7Ci0KLQotI2RlZmluZSBHWFZfU1VCVEFCTEVfT0ZGU0VUX0NIRUNLKCBfb2Zmc2V0ICkgICAgICAgICAgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCAoX29mZnNldCkgPiBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggKSBcCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfT0ZGU0VUOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfRU5EX1NUTU5UCi0KLSNkZWZpbmUgR1hWX1NVQlRBQkxFX0xJTUlUX0NIRUNLKCBfY291bnQgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICggKCBwICsgKF9jb3VudCkgLSBneHZhbGlkLT5zdWJ0YWJsZV9zdGFydCApID4gXAotICAgICAgICAgICAgICAgICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfRU5EX1NUTU5UCi0KLSNkZWZpbmUgR1hWX1VTSE9SVF9UT19TSE9SVCggX3VzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoIDB4ODAwMFUgPCAoIF91cyApICkgPyAoICggX3VzICkgLSAweDgwMDBVICkgOiAoIF91cyApICkKLQotI2RlZmluZSBHWFZfU1RBVEVUQUJMRV9IRUFERVJfU0laRSAgKCAyICsgMiArIDIgKyAyICkKLSNkZWZpbmUgR1hWX1NUQVRFSEVBREVSX1NJWkUgICAgICAgIEdYVl9TVEFURVRBQkxFX0hFQURFUl9TSVpFCi0KLSNkZWZpbmUgR1hWX1hTVEFURVRBQkxFX0hFQURFUl9TSVpFICAoIDQgKyA0ICsgNCArIDQgKQotI2RlZmluZSBHWFZfWFNUQVRFSEVBREVSX1NJWkUgICAgICAgIEdYVl9YU1RBVEVUQUJMRV9IRUFERVJfU0laRQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgb3ZlcmxhcHBpbmcgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYVl9vZHRlY3RfRGF0YVJlY18KLSAgewotICAgIEZUX0J5dGVzICAgIHN0YXJ0OwotICAgIEZUX1VMb25nICAgIGxlbmd0aDsKLSAgICBGVF9TdHJpbmcqICBuYW1lOwotCi0gIH0gR1hWX29kdGVjdF9EYXRhUmVjLCAgKkdYVl9vZHRlY3RfRGF0YTsKLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX29kdGVjdF9SYW5nZVJlY18KLSAgewotICAgIEZUX1VJbnQgICAgICAgICAgblJhbmdlczsKLSAgICBHWFZfb2R0ZWN0X0RhdGEgIHJhbmdlOwotCi0gIH0gR1hWX29kdGVjdF9SYW5nZVJlYywgKkdYVl9vZHRlY3RfUmFuZ2U7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9vZHRlY3RfYWRkX3JhbmdlKCBGVF9CeXRlcyAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBHWFZfb2R0ZWN0X1JhbmdlICBvZHRlY3QgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9vZHRlY3RfdmFsaWRhdGUoIEdYVl9vZHRlY3RfUmFuZ2UgIG9kdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgZ3h2YWxpZCApOwotCi0KLSNkZWZpbmUgR1hWX09EVEVDVCggbiwgb2R0ZWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgR1hWX29kdGVjdF9EYXRhUmVjICAgb2R0ZWN0ICMjIF9yYW5nZVtuXTsgICAgICAgICAgXAotICAgICAgICAgIEdYVl9vZHRlY3RfUmFuZ2VSZWMgIG9kdGVjdCAjIyBfcmVjID0geyAwLCBOVUxMIH07IFwKLSAgICAgICAgICBHWFZfb2R0ZWN0X1JhbmdlICAgICBvZHRlY3QgPSBOVUxMCi0KLSNkZWZpbmUgR1hWX09EVEVDVF9JTklUKCBvZHRlY3QgKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgb2R0ZWN0ICMjIF9yZWMublJhbmdlcyA9IDA7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG9kdGVjdCAjIyBfcmVjLnJhbmdlICAgPSBvZHRlY3QgIyMgX3JhbmdlOyBcCi0gICAgICAgICAgICBvZHRlY3QgICAgICAgICAgICAgICAgID0gJiBvZHRlY3QgIyMgX3JlYzsgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBHWFZDT01NTl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2ZXJyb3IuaCBiL3NyYy9neHZhbGlkL2d4dmVycm9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTJiOGEuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2ZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCB2YWxpZGF0aW9uIG1vZHVsZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIE9wZW5UeXBlIHZhbGlkYXRpb24gbW9kdWxlIGVycm9yICAgICAgKi8KLSAgLyogZW51bWVyYXRpb24gY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBHWFZFUlJPUl9IXwotI2RlZmluZSBHWFZFUlJPUl9IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBHWFZfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0dYdmFsaWQKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIEdYVkVSUk9SX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZmZWF0LmMgYi9zcmMvZ3h2YWxpZC9neHZmZWF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlM2VjNmYuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2ZmVhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmZlYXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBmZWF0IHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZhbGlkLmgiCi0jaW5jbHVkZSAiZ3h2Y29tbW4uaCIKLSNpbmNsdWRlICJneHZmZWF0LmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZmZWF0Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgRGF0YSBhbmQgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX2ZlYXRfRGF0YVJlY18KLSAgewotICAgIEZUX1VJbnQgICAgcmVzZXJ2ZWRfc2l6ZTsKLSAgICBGVF9VU2hvcnQgIGZlYXR1cmU7Ci0gICAgRlRfVVNob3J0ICBzZXR0aW5nOwotCi0gIH0gR1hWX2ZlYXRfRGF0YVJlYywgKkdYVl9mZWF0X0RhdGE7Ci0KLQotI2RlZmluZSBHWFZfRkVBVF9EQVRBKCBmaWVsZCApICBHWFZfVEFCTEVfREFUQSggZmVhdCwgZmllbGQgKQotCi0KLSAgdHlwZWRlZiBlbnVtICBHWFZfRmVhdHVyZUZsYWdzTWFza18KLSAgewotICAgIEdYVl9GRUFUX01BU0tfRVhDTFVTSVZFX1NFVFRJTkdTID0gMHg4MDAwVSwKLSAgICBHWFZfRkVBVF9NQVNLX0RZTkFNSUNfREVGQVVMVCAgICA9IDB4NDAwMCwKLSAgICBHWFZfRkVBVF9NQVNLX1VOVVNFRCAgICAgICAgICAgICA9IDB4M0YwMCwKLSAgICBHWFZfRkVBVF9NQVNLX0RFRkFVTFRfU0VUVElORyAgICA9IDB4MDBGRgotCi0gIH0gR1hWX0ZlYXR1cmVGbGFnc01hc2s7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgVVRJTElUWSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfZmVhdF9yZWdpc3RyeV92YWxpZGF0ZSggRlRfVVNob3J0ICAgICAgZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIG5TZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIGV4Y2x1c2l2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgR1hWX05BTUVfRU5URVIoICJmZWF0dXJlIGluIHJlZ2lzdHJ5IiApOwotCi0gICAgR1hWX1RSQUNFKCggIiAoZmVhdHVyZSA9ICV1KVxuIiwgZmVhdHVyZSApKTsKLQotICAgIGlmICggZmVhdHVyZSA+PSBneHZfZmVhdF9yZWdpc3RyeV9sZW5ndGggKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICJmZWF0dXJlIG51bWJlciAlZCBpcyBvdXQgb2YgcmFuZ2UgJWRcbiIsCi0gICAgICAgICAgICAgICAgICBmZWF0dXJlLCBneHZfZmVhdF9yZWdpc3RyeV9sZW5ndGggKSk7Ci0gICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9EQVRBICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBneHZfZmVhdF9yZWdpc3RyeVtmZWF0dXJlXS5leGlzdGVuY2UgPT0gMCApCi0gICAgewotICAgICAgR1hWX1RSQUNFKCggImZlYXR1cmUgbnVtYmVyICVkIGlzIGluIGRlZmluZWQgcmFuZ2UgYnV0IGRvZXNuJ3QgZXhpc3RcbiIsCi0gICAgICAgICAgICAgICAgICBmZWF0dXJlICkpOwotICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfREFUQSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggZ3h2X2ZlYXRfcmVnaXN0cnlbZmVhdHVyZV0uYXBwbGVfcmVzZXJ2ZWQgKQotICAgIHsKLSAgICAgIC8qIERvbid0IHVzZSBoZXJlLiBBcHBsZSBpcyByZXNlcnZlZC4gKi8KLSAgICAgIEdYVl9UUkFDRSgoICJmZWF0dXJlIG51bWJlciAlZCBpcyByZXNlcnZlZCBieSBBcHBsZVxuIiwgZmVhdHVyZSApKTsKLSAgICAgIGlmICggZ3h2YWxpZC0+cm9vdC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gICAgaWYgKCBuU2V0dGluZ3MgIT0gZ3h2X2ZlYXRfcmVnaXN0cnlbZmVhdHVyZV0ublNldHRpbmdzICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAiZmVhdHVyZSAlZDogblNldHRpbmdzICVkICE9IGRlZmluZWQgblNldHRpbmdzICVkXG4iLAotICAgICAgICAgICAgICAgICAgZmVhdHVyZSwgblNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgZ3h2X2ZlYXRfcmVnaXN0cnlbZmVhdHVyZV0ublNldHRpbmdzICkpOwotICAgICAgaWYgKCBneHZhbGlkLT5yb290LT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBpZiAoIGV4Y2x1c2l2ZSAhPSBneHZfZmVhdF9yZWdpc3RyeVtmZWF0dXJlXS5leGNsdXNpdmUgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICJleGNsdXNpdmUgZmxhZyAlZCBkaWZmZXJzIGZyb20gcHJlZGVmaW5lZCB2YWx1ZVxuIiwKLSAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZSApKTsKLSAgICAgIGlmICggZ3h2YWxpZC0+cm9vdC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9mZWF0X25hbWVfaW5kZXhfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0gICAgRlRfU2hvcnQgIG5hbWVJbmRleDsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJuYW1lSW5kZXgiICk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBuYW1lSW5kZXggPSBGVF9ORVhUX1NIT1JUICggcCApOwotICAgIEdYVl9UUkFDRSgoICIgKG5hbWVJbmRleCA9ICVkKVxuIiwgbmFtZUluZGV4ICkpOwotCi0gICAgZ3h2X3NmbnROYW1lX3ZhbGlkYXRlKCAoRlRfVVNob3J0KW5hbWVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNzY4VSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfZmVhdF9zZXR0aW5nX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIGV4Y2x1c2l2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSAgICBGVF9VU2hvcnQgIHNldHRpbmc7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAic2V0dGluZyIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotCi0gICAgc2V0dGluZyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAvKiBJZiB3ZSBoYXZlIGV4Y2x1c2l2ZSBzZXR0aW5nLCB0aGUgc2V0dGluZyBzaG91bGQgYmUgb2RkLiAqLwotICAgIGlmICggZXhjbHVzaXZlICYmICggc2V0dGluZyAmIDEgKSA9PSAwICkKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgIGd4dl9mZWF0X25hbWVfaW5kZXhfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICBHWFZfRkVBVF9EQVRBKCBzZXR0aW5nICkgPSBzZXR0aW5nOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9mZWF0X25hbWVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgICAgICAgICAgICAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgIHJlc2VydmVkX3NpemUgPSBHWFZfRkVBVF9EQVRBKCByZXNlcnZlZF9zaXplICk7Ci0KLSAgICBGVF9VU2hvcnQgIGZlYXR1cmU7Ci0gICAgRlRfVVNob3J0ICBuU2V0dGluZ3M7Ci0gICAgRlRfVUxvbmcgICBzZXR0aW5nVGFibGU7Ci0gICAgRlRfVVNob3J0ICBmZWF0dXJlRmxhZ3M7Ci0KLSAgICBGVF9Cb29sICAgIGV4Y2x1c2l2ZTsKLSAgICBGVF9JbnQgICAgIGxhc3Rfc2V0dGluZzsKLSAgICBGVF9VSW50ICAgIGk7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAibmFtZSIgKTsKLQotICAgIC8qIGZlYXR1cmUgKyBuU2V0dGluZ3MgKyBzZXR0aW5nVGFibGUgKyBmZWF0dXJlRmxhZ3MgKi8KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICsgNCArIDIgKTsKLQotICAgIGZlYXR1cmUgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEdYVl9GRUFUX0RBVEEoIGZlYXR1cmUgKSA9IGZlYXR1cmU7Ci0KLSAgICBuU2V0dGluZ3MgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIHNldHRpbmdUYWJsZSA9IEZUX05FWFRfVUxPTkcgKCBwICk7Ci0gICAgZmVhdHVyZUZsYWdzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIGlmICggc2V0dGluZ1RhYmxlIDwgcmVzZXJ2ZWRfc2l6ZSApCi0gICAgICBGVF9JTlZBTElEX09GRlNFVDsKLQotICAgIGlmICggKCBmZWF0dXJlRmxhZ3MgJiBHWFZfRkVBVF9NQVNLX1VOVVNFRCApID09IDAgKQotICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfREFUQSApOwotCi0gICAgZXhjbHVzaXZlID0gRlRfQk9PTCggZmVhdHVyZUZsYWdzICYgR1hWX0ZFQVRfTUFTS19FWENMVVNJVkVfU0VUVElOR1MgKTsKLSAgICBpZiAoIGV4Y2x1c2l2ZSApCi0gICAgewotICAgICAgRlRfQnl0ZSAgZHluYW1pY19kZWZhdWx0OwotCi0KLSAgICAgIGlmICggZmVhdHVyZUZsYWdzICYgR1hWX0ZFQVRfTUFTS19EWU5BTUlDX0RFRkFVTFQgKQotICAgICAgICBkeW5hbWljX2RlZmF1bHQgPSAoRlRfQnl0ZSkoIGZlYXR1cmVGbGFncyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0ZFQVRfTUFTS19ERUZBVUxUX1NFVFRJTkcgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZHluYW1pY19kZWZhdWx0ID0gMDsKLQotICAgICAgLyogSWYgZXhjbHVzaXZlLCBjaGVjayB3aGV0aGVyIGRlZmF1bHQgc2V0dGluZyBpcyBpbiB0aGUgcmFuZ2UuICovCi0gICAgICBpZiAoICEoIGR5bmFtaWNfZGVmYXVsdCA8IG5TZXR0aW5ncyApICkKLSAgICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgZ3h2X2ZlYXRfcmVnaXN0cnlfdmFsaWRhdGUoIGZlYXR1cmUsIG5TZXR0aW5ncywgZXhjbHVzaXZlLCBneHZhbGlkICk7Ci0KLSAgICBneHZfZmVhdF9uYW1lX2luZGV4X3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0gICAgcCA9IGd4dmFsaWQtPnJvb3QtPmJhc2UgKyBzZXR0aW5nVGFibGU7Ci0gICAgZm9yICggbGFzdF9zZXR0aW5nID0gLTEsIGkgPSAwOyBpIDwgblNldHRpbmdzOyBpKysgKQotICAgIHsKLSAgICAgIGd4dl9mZWF0X3NldHRpbmdfdmFsaWRhdGUoIHAsIGxpbWl0LCBleGNsdXNpdmUsIGd4dmFsaWQgKTsKLQotICAgICAgaWYgKCAoRlRfSW50KUdYVl9GRUFUX0RBVEEoIHNldHRpbmcgKSA8PSBsYXN0X3NldHRpbmcgKQotICAgICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9GT1JNQVQgKTsKLQotICAgICAgbGFzdF9zZXR0aW5nID0gKEZUX0ludClHWFZfRkVBVF9EQVRBKCBzZXR0aW5nICk7Ci0gICAgICAvKiBzZXR0aW5nICsgbmFtZUluZGV4ICovCi0gICAgICBwICs9ICggMiArIDIgKTsKLSAgICB9Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXQgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X2ZlYXRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIGZ0dmFsaWQgKQotICB7Ci0gICAgR1hWX1ZhbGlkYXRvclJlYyAgZ3h2YWxpZHJlYzsKLSAgICBHWFZfVmFsaWRhdG9yICAgICBneHZhbGlkID0gJmd4dmFsaWRyZWM7Ci0KLSAgICBHWFZfZmVhdF9EYXRhUmVjICBmZWF0cmVjOwotICAgIEdYVl9mZWF0X0RhdGEgICAgIGZlYXQgPSAmZmVhdHJlYzsKLQotICAgIEZUX0J5dGVzICAgICAgICAgIHAgICAgID0gdGFibGU7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgbGltaXQgPSAwOwotCi0gICAgRlRfVUludCAgICAgICAgICAgZmVhdHVyZU5hbWVDb3VudDsKLQotICAgIEZUX1VJbnQgICAgICAgICAgIGk7Ci0gICAgRlRfSW50ICAgICAgICAgICAgbGFzdF9mZWF0dXJlOwotCi0KLSAgICBneHZhbGlkLT5yb290ICAgICAgID0gZnR2YWxpZDsKLSAgICBneHZhbGlkLT50YWJsZV9kYXRhID0gZmVhdDsKLSAgICBneHZhbGlkLT5mYWNlICAgICAgID0gZmFjZTsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIGBmZWF0JyB0YWJsZVxuIiApKTsKLSAgICBHWFZfSU5JVDsKLQotICAgIGZlYXQtPnJlc2VydmVkX3NpemUgPSAwOwotCi0gICAgLyogdmVyc2lvbiArIGZlYXR1cmVOYW1lQ291bnQgKyBub25lXzAgKyBub25lXzEgICovCi0gICAgR1hWX0xJTUlUX0NIRUNLKCA0ICsgMiArIDIgKyA0ICk7Ci0gICAgZmVhdC0+cmVzZXJ2ZWRfc2l6ZSArPSA0ICsgMiArIDIgKyA0OwotCi0gICAgaWYgKCBGVF9ORVhUX1VMT05HKCBwICkgIT0gMHgwMDAxMDAwMFVMICkgLyogVmVyc2lvbiAqLwotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICBmZWF0dXJlTmFtZUNvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBHWFZfVFJBQ0UoKCAiIChmZWF0dXJlTmFtZUNvdW50ID0gJWQpXG4iLCBmZWF0dXJlTmFtZUNvdW50ICkpOwotCi0gICAgaWYgKCAhKCBJU19QQVJBTk9JRF9WQUxJREFUSU9OICkgKQotICAgICAgcCArPSA2OyAvKiBza2lwIChub25lKSBhbmQgKG5vbmUpICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggRlRfTkVYVF9VU0hPUlQoIHAgKSAhPSAwICkKLSAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICBpZiAoIEZUX05FWFRfVUxPTkcoIHAgKSAgIT0gMCApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBmZWF0LT5yZXNlcnZlZF9zaXplICs9IGZlYXR1cmVOYW1lQ291bnQgKiAoIDIgKyAyICsgNCArIDIgKyAyICk7Ci0KLSAgICBmb3IgKCBsYXN0X2ZlYXR1cmUgPSAtMSwgaSA9IDA7IGkgPCBmZWF0dXJlTmFtZUNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIGd4dl9mZWF0X25hbWVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICAgIGlmICggKEZUX0ludClHWFZfRkVBVF9EQVRBKCBmZWF0dXJlICkgPD0gbGFzdF9mZWF0dXJlICkKLSAgICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfRk9STUFUICk7Ci0KLSAgICAgIGxhc3RfZmVhdHVyZSA9IEdYVl9GRUFUX0RBVEEoIGZlYXR1cmUgKTsKLSAgICAgIHAgKz0gMiArIDIgKyA0ICsgMiArIDI7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2ZmVhdC5oIGIvc3JjL2d4dmFsaWQvZ3h2ZmVhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBlODQ3Li4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dmZlYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZmZWF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgZmVhdCB0YWJsZSB2YWxpZGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEdYVkZFQVRfSF8KLSNkZWZpbmUgR1hWRkVBVF9IXwotCi0KLSNpbmNsdWRlICJneHZhbGlkLmgiCi0jaW5jbHVkZSAiZ3h2Y29tbW4uaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICBSZWdpc3RyeSBwcmVkZWZpbmVkIGJ5IEFwcGxlICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIFRPRE86IE1vcmUgY29tcGFjdCBmb3JtYXQgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYVl9GZWF0dXJlX1JlZ2lzdHJ5UmVjXwotICB7Ci0gICAgRlRfQm9vbCAgZXhpc3RlbmNlOwotICAgIEZUX0Jvb2wgIGFwcGxlX3Jlc2VydmVkOwotICAgIEZUX0Jvb2wgIGV4Y2x1c2l2ZTsKLSAgICBGVF9CeXRlICBuU2V0dGluZ3M7Ci0KLSAgfSBHWF9GZWF0dXJlX1JlZ2lzdHJ5UmVjOwotCi0KLSNkZWZpbmUgZ3h2X2ZlYXRfcmVnaXN0cnlfbGVuZ3RoICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggc2l6ZW9mICggZ3h2X2ZlYXRfcmVnaXN0cnkgKSAvICAgICAgICBcCi0gICAgICAgICAgICAgIHNpemVvZiAoIEdYX0ZlYXR1cmVfUmVnaXN0cnlSZWMgKSApCi0KLQotICBzdGF0aWMgR1hfRmVhdHVyZV9SZWdpc3RyeVJlYyAgZ3h2X2ZlYXRfcmVnaXN0cnlbXSA9Ci0gIHsKLSAgICAvKiBHZW5lcmF0ZWQgZnJvbSBneHZmZ2VuLmMgKi8KLSAgICB7MSwgMCwgMCwgIDF9LCAgIC8qIEFsbCBUeXBvZ3JhcGhpYyBGZWF0dXJlcyAqLwotICAgIHsxLCAwLCAwLCAgOH0sICAgLyogTGlnYXR1cmVzICovCi0gICAgezEsIDAsIDEsICAzfSwgICAvKiBDdXJzaXZlIENvbm5lY3Rpb24gKi8KLSAgICB7MSwgMCwgMSwgIDZ9LCAgIC8qIExldHRlciBDYXNlICovCi0gICAgezEsIDAsIDAsICAxfSwgICAvKiBWZXJ0aWNhbCBTdWJzdGl0dXRpb24gKi8KLSAgICB7MSwgMCwgMCwgIDF9LCAgIC8qIExpbmd1aXN0aWMgUmVhcnJhbmdlbWVudCAqLwotICAgIHsxLCAwLCAxLCAgMn0sICAgLyogTnVtYmVyIFNwYWNpbmcgKi8KLSAgICB7MSwgMSwgMCwgIDB9LCAgIC8qIEFwcGxlIFJlc2VydmVkIDEgKi8KLSAgICB7MSwgMCwgMCwgIDV9LCAgIC8qIFNtYXJ0IFN3YXNoZXMgKi8KLSAgICB7MSwgMCwgMSwgIDN9LCAgIC8qIERpYWNyaXRpY3MgKi8KLSAgICB7MSwgMCwgMSwgIDR9LCAgIC8qIFZlcnRpY2FsIFBvc2l0aW9uICovCi0gICAgezEsIDAsIDEsICAzfSwgICAvKiBGcmFjdGlvbnMgKi8KLSAgICB7MSwgMSwgMCwgIDB9LCAgIC8qIEFwcGxlIFJlc2VydmVkIDIgKi8KLSAgICB7MSwgMCwgMCwgIDF9LCAgIC8qIE92ZXJsYXBwaW5nIENoYXJhY3RlcnMgKi8KLSAgICB7MSwgMCwgMCwgIDZ9LCAgIC8qIFR5cG9ncmFwaGljIEV4dHJhcyAqLwotICAgIHsxLCAwLCAwLCAgNX0sICAgLyogTWF0aGVtYXRpY2FsIEV4dHJhcyAqLwotICAgIHsxLCAwLCAxLCAgN30sICAgLyogT3JuYW1lbnQgU2V0cyAqLwotICAgIHsxLCAwLCAxLCAgMX0sICAgLyogQ2hhcmFjdGVyIEFsdGVybmF0aXZlcyAqLwotICAgIHsxLCAwLCAxLCAgNX0sICAgLyogRGVzaWduIENvbXBsZXhpdHkgKi8KLSAgICB7MSwgMCwgMSwgIDZ9LCAgIC8qIFN0eWxlIE9wdGlvbnMgKi8KLSAgICB7MSwgMCwgMSwgMTF9LCAgIC8qIENoYXJhY3RlciBTaGFwZSAqLwotICAgIHsxLCAwLCAxLCAgMn0sICAgLyogTnVtYmVyIENhc2UgKi8KLSAgICB7MSwgMCwgMSwgIDR9LCAgIC8qIFRleHQgU3BhY2luZyAqLwotICAgIHsxLCAwLCAxLCAxMH0sICAgLyogVHJhbnNsaXRlcmF0aW9uICovCi0gICAgezEsIDAsIDEsICA5fSwgICAvKiBBbm5vdGF0aW9uICovCi0gICAgezEsIDAsIDEsICAyfSwgICAvKiBLYW5hIFNwYWNpbmcgKi8KLSAgICB7MSwgMCwgMSwgIDJ9LCAgIC8qIElkZW9ncmFwaGljIFNwYWNpbmcgKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHswLCAwLCAwLCAgMH0sICAgLyogX19FTVBUWV9fICovCi0gICAgezAsIDAsIDAsICAwfSwgICAvKiBfX0VNUFRZX18gKi8KLSAgICB7MCwgMCwgMCwgIDB9LCAgIC8qIF9fRU1QVFlfXyAqLwotICAgIHsxLCAwLCAxLCAgNH0sICAgLyogVGV4dCBTcGFjaW5nICovCi0gICAgezEsIDAsIDEsICAyfSwgICAvKiBLYW5hIFNwYWNpbmcgKi8KLSAgICB7MSwgMCwgMSwgIDJ9LCAgIC8qIElkZW9ncmFwaGljIFNwYWNpbmcgKi8KLSAgICB7MSwgMCwgMSwgIDR9LCAgIC8qIENKSyBSb21hbiBTcGFjaW5nICovCi0gIH07Ci0KLQotI2VuZGlmIC8qIEdYVkZFQVRfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dmZnZW4uYyBiL3NyYy9neHZhbGlkL2d4dmZnZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMDhjZC4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZmZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3hmZ2VuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEdlbmVyYXRlIGZlYXR1cmUgcmVnaXN0cnkgZGF0YSBmb3IgZ3h2IGBmZWF0JyB2YWxpZGF0b3IuICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIHByb2dyYW0gaXMgZGVyaXZlZCBmcm9tIGd4ZmVhdHJlZy5jIGluIGd4bGF5b3V0LiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4ZmVhdHJlZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBEYXRhYmFzZSBvZiBmb250IGZlYXR1cmVzIHByZS1kZWZpbmVkIGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICAgICAgICAqLwotLyogICAgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvUmVnaXN0cnkvICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8gYW5kIFJlZGhhdCBLLksuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBtYXkgb25seSBiZSB1c2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGZlYXRyZWcuYyBpcyBzdXBwb3J0ZWQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFzIGEgc3RhbmQtYWxvbmUgZXhlY3V0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgZmlsZSBpcyBuZXZlciBjb21waWxlZCBpbnRvIGBsaWJmcmVldHlwZTInLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgb3V0cHV0IG9mIHRoaXMgZmlsZSBpcyB1c2VkIGluIGBneHZmZWF0LmMnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIENvbXBpbGU6IGdjYyBgcGtnLWNvbmZpZyAtLWNmbGFncyBmcmVldHlwZTJgIGd4dmZnZW4uYyAtbyBneHZmZ2VuICAgICAgICovCi0vKiBSdW46IC4vZ3h2ZmdlbiA+IHRtcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiBJZiB5b3UgYWRkIGEgbmV3IHNldHRpbmcgdG8gYSBmZWF0dXJlLCBjaGVjayB0aGUgbnVtYmVyIG9mIHNldHRpbmdzCi0gICAqIGluIHRoZSBmZWF0dXJlLiAgSWYgdGhlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIGRlZmluZWQgYXMKLSAgICogRkVBVFJFR19NQVhfU0VUVElORywgdXBkYXRlIHRoZSB2YWx1ZS4KLSAgICovCi0jZGVmaW5lIEZFQVRSRUdfTUFYX1NFVFRJTkcgIDEyCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBEYXRhIGFuZCBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEFQUExFX1JFU0VSVkVEICAgICAgICAgIkFwcGxlIFJlc2VydmVkIgotI2RlZmluZSBBUFBMRV9SRVNFUlZFRF9MRU5HVEggIDE0Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0ZlYXR1cmVfUmVnaXN0cnlSZWNfCi0gIHsKLSAgICBjb25zdCBjaGFyKiAgZmVhdF9uYW1lOwotICAgIGNoYXIgICAgICAgICBleGNsdXNpdmU7Ci0gICAgY2hhciogICAgICAgIHNldHRpbmdfbmFtZVtGRUFUUkVHX01BWF9TRVRUSU5HXTsKLQotICB9IEdYX0ZlYXR1cmVfUmVnaXN0cnlSZWM7Ci0KLQotI2RlZmluZSBFTVBUWUZFQVQgezAsIDAsIHtOVUxMfX0KLQotCi0gIHN0YXRpYyBHWF9GZWF0dXJlX1JlZ2lzdHJ5UmVjIGZlYXRyZWdfdGFibGVbXSA9IHsKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLwotICAgICAgIkFsbCBUeXBvZ3JhcGhpYyBGZWF0dXJlcyIsCi0gICAgICAwLAotICAgICAgewotICAgICAgICAiQWxsIFR5cGUgRmVhdHVyZXMiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgKi8KLSAgICAgICJMaWdhdHVyZXMiLAotICAgICAgMCwKLSAgICAgIHsKLSAgICAgICAgIlJlcXVpcmVkIExpZ2F0dXJlcyIsCi0gICAgICAgICJDb21tb24gTGlnYXR1cmVzIiwKLSAgICAgICAgIlJhcmUgTGlnYXR1cmVzIiwKLSAgICAgICAgIkxvZ29zIiwKLSAgICAgICAgIlJlYnVzIFBpY3R1cmVzIiwKLSAgICAgICAgIkRpcGh0aG9uZyBMaWdhdHVyZXMiLAotICAgICAgICAiU3F1YXJlZCBMaWdhdHVyZXMiLAotICAgICAgICAiU3F1YXJlZCBMaWdhdHVyZXMsIEFiYnJldmlhdGVkIiwKLSAgICAgICAgTlVMTAotICAgICAgfQotICAgIH0sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyICovCi0gICAgICAiQ3Vyc2l2ZSBDb25uZWN0aW9uIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJVbmNvbm5lY3RlZCIsCi0gICAgICAgICJQYXJ0aWFsbHkgQ29ubmVjdGVkIiwKLSAgICAgICAgIkN1cnNpdmUiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgKi8KLSAgICAgICJMZXR0ZXIgQ2FzZSIsCi0gICAgICAxLAotICAgICAgewotICAgICAgICAiVXBwZXIgJiBMb3dlciBDYXNlIiwKLSAgICAgICAgIkFsbCBDYXBzIiwKLSAgICAgICAgIkFsbCBMb3dlciBDYXNlIiwKLSAgICAgICAgIlNtYWxsIENhcHMiLAotICAgICAgICAiSW5pdGlhbCBDYXBzIiwKLSAgICAgICAgIkluaXRpYWwgQ2FwcyAmIFNtYWxsIENhcHMiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgKi8KLSAgICAgICJWZXJ0aWNhbCBTdWJzdGl0dXRpb24iLAotICAgICAgMCwKLSAgICAgIHsKLSAgICAgICAgLyogIlN1YnN0aXR1dGUgVmVydGljYWwgRm9ybXMiLCAqLwotICAgICAgICAiVHVybnMgb24gdGhlIGZlYXR1cmUiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUgKi8KLSAgICAgICJMaW5ndWlzdGljIFJlYXJyYW5nZW1lbnQiLAotICAgICAgMCwKLSAgICAgIHsKLSAgICAgICAgLyogIkxpbmd1aXN0aWMgUmVhcnJhbmdlbWVudCIsICovCi0gICAgICAgICJUdXJucyBvbiB0aGUgZmVhdHVyZSIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNiAqLwotICAgICAgIk51bWJlciBTcGFjaW5nIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJNb25vc3BhY2VkIE51bWJlcnMiLAotICAgICAgICAiUHJvcG9ydGlvbmFsIE51bWJlcnMiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcgKi8KLSAgICAgIEFQUExFX1JFU0VSVkVEICIgMSIsCi0gICAgICAwLAotICAgICAge05VTEx9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDggKi8KLSAgICAgICJTbWFydCBTd2FzaGVzIiwKLSAgICAgIDAsCi0gICAgICB7Ci0gICAgICAgICJXb3JkIEluaXRpYWwgU3dhc2hlcyIsCi0gICAgICAgICJXb3JkIEZpbmFsIFN3YXNoZXMiLAotICAgICAgICAiTGluZSBJbml0aWFsIFN3YXNoZXMiLAotICAgICAgICAiTGluZSBGaW5hbCBTd2FzaGVzIiwKLSAgICAgICAgIk5vbi1GaW5hbCBTd2FzaGVzIiwKLSAgICAgICAgTlVMTAotICAgICAgfQotICAgIH0sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA5ICovCi0gICAgICAiRGlhY3JpdGljcyIsCi0gICAgICAxLAotICAgICAgewotICAgICAgICAiU2hvdyBEaWFjcml0aWNzIiwKLSAgICAgICAgIkhpZGUgRGlhY3JpdGljcyIsCi0gICAgICAgICJEZWNvbXBvc2UgRGlhY3JpdGljcyIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgKi8KLSAgICAgICJWZXJ0aWNhbCBQb3NpdGlvbiIsCi0gICAgICAxLAotICAgICAgewotICAgICAgICAvKiAiTm9ybWFsIFBvc2l0aW9uIiwgKi8KLSAgICAgICAgIk5vIFZlcnRpY2FsIFBvc2l0aW9uIiwKLSAgICAgICAgIlN1cGVyaW9ycyIsCi0gICAgICAgICJJbmZlcmlvcnMiLAotICAgICAgICAiT3JkaW5hbHMiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExICovCi0gICAgICAiRnJhY3Rpb25zIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJObyBGcmFjdGlvbnMiLAotICAgICAgICAiVmVydGljYWwgRnJhY3Rpb25zIiwKLSAgICAgICAgIkRpYWdvbmFsIEZyYWN0aW9ucyIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTIgKi8KLSAgICAgIEFQUExFX1JFU0VSVkVEICIgMiIsCi0gICAgICAwLAotICAgICAge05VTEx9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzICovCi0gICAgICAiT3ZlcmxhcHBpbmcgQ2hhcmFjdGVycyIsCi0gICAgICAwLAotICAgICAgewotICAgICAgICAvKiAiUHJldmVudCBPdmVybGFwIiwgKi8KLSAgICAgICAgIlR1cm5zIG9uIHRoZSBmZWF0dXJlIiwKLSAgICAgICAgTlVMTAotICAgICAgfQotICAgIH0sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNCAqLwotICAgICAgIlR5cG9ncmFwaGljIEV4dHJhcyIsCi0gICAgICAwLAotICAgICAgewotICAgICAgICAiSHlwaGVucyB0byBFbSBEYXNoIiwKLSAgICAgICAgIkh5cGhlbnMgdG8gRW4gRGFzaCIsCi0gICAgICAgICJVbnNsYXNoZWQgWmVybyIsCi0gICAgICAgICJGb3JtIEludGVycm9iYW5nIiwKLSAgICAgICAgIlNtYXJ0IFF1b3RlcyIsCi0gICAgICAgICJQZXJpb2RzIHRvIEVsbGlwc2lzIiwKLSAgICAgICAgTlVMTAotICAgICAgfQotICAgIH0sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNSAqLwotICAgICAgIk1hdGhlbWF0aWNhbCBFeHRyYXMiLAotICAgICAgMCwKLSAgICAgIHsKLSAgICAgICAgIkh5cGhlbnMgdG8gTWludXMiLAotICAgICAgICAiQXN0ZXJpc2sgdG8gTXVsdGlwbHkiLAotICAgICAgICAiU2xhc2ggdG8gRGl2aWRlIiwKLSAgICAgICAgIkluZXF1YWxpdHkgTGlnYXR1cmVzIiwKLSAgICAgICAgIkV4cG9uZW50cyIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgKi8KLSAgICAgICJPcm5hbWVudCBTZXRzIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJObyBPcm5hbWVudHMiLAotICAgICAgICAiRGluZ2JhdHMiLAotICAgICAgICAiUGkgQ2hhcmFjdGVycyIsCi0gICAgICAgICJGbGV1cm9ucyIsCi0gICAgICAgICJEZWNvcmF0aXZlIEJvcmRlcnMiLAotICAgICAgICAiSW50ZXJuYXRpb25hbCBTeW1ib2xzIiwKLSAgICAgICAgIk1hdGggU3ltYm9scyIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTcgKi8KLSAgICAgICJDaGFyYWN0ZXIgQWx0ZXJuYXRpdmVzIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJObyBBbHRlcm5hdGVzIiwKLSAgICAgICAgLyogVE9ETyAqLwotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4ICovCi0gICAgICAiRGVzaWduIENvbXBsZXhpdHkiLAotICAgICAgMSwKLSAgICAgIHsKLSAgICAgICAgIkRlc2lnbiBMZXZlbCAxIiwKLSAgICAgICAgIkRlc2lnbiBMZXZlbCAyIiwKLSAgICAgICAgIkRlc2lnbiBMZXZlbCAzIiwKLSAgICAgICAgIkRlc2lnbiBMZXZlbCA0IiwKLSAgICAgICAgIkRlc2lnbiBMZXZlbCA1IiwKLSAgICAgICAgLyogVE9ETyAqLwotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5ICovCi0gICAgICAiU3R5bGUgT3B0aW9ucyIsCi0gICAgICAxLAotICAgICAgewotICAgICAgICAiTm8gU3R5bGUgT3B0aW9ucyIsCi0gICAgICAgICJEaXNwbGF5IFRleHQiLAotICAgICAgICAiRW5ncmF2ZWQgVGV4dCIsCi0gICAgICAgICJJbGx1bWluYXRlZCBDYXBzIiwKLSAgICAgICAgIlRpbGxpbmcgQ2FwcyIsCi0gICAgICAgICJUYWxsIENhcHMiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwICovCi0gICAgICAiQ2hhcmFjdGVyIFNoYXBlIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJUcmFkaXRpb25hbCBDaGFyYWN0ZXJzIiwKLSAgICAgICAgIlNpbXBsaWZpZWQgQ2hhcmFjdGVycyIsCi0gICAgICAgICJKSVMgMTk3OCBDaGFyYWN0ZXJzIiwKLSAgICAgICAgIkpJUyAxOTgzIENoYXJhY3RlcnMiLAotICAgICAgICAiSklTIDE5OTAgQ2hhcmFjdGVycyIsCi0gICAgICAgICJUcmFkaXRpb25hbCBDaGFyYWN0ZXJzLCBBbHRlcm5hdGl2ZSBTZXQgMSIsCi0gICAgICAgICJUcmFkaXRpb25hbCBDaGFyYWN0ZXJzLCBBbHRlcm5hdGl2ZSBTZXQgMiIsCi0gICAgICAgICJUcmFkaXRpb25hbCBDaGFyYWN0ZXJzLCBBbHRlcm5hdGl2ZSBTZXQgMyIsCi0gICAgICAgICJUcmFkaXRpb25hbCBDaGFyYWN0ZXJzLCBBbHRlcm5hdGl2ZSBTZXQgNCIsCi0gICAgICAgICJUcmFkaXRpb25hbCBDaGFyYWN0ZXJzLCBBbHRlcm5hdGl2ZSBTZXQgNSIsCi0gICAgICAgICJFeHBlcnQgQ2hhcmFjdGVycyIsCi0gICAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudCA9PiAxMiAqLwotICAgICAgfQotICAgIH0sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMSAqLwotICAgICAgIk51bWJlciBDYXNlIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJMb3dlciBDYXNlIE51bWJlcnMiLAotICAgICAgICAiVXBwZXIgQ2FzZSBOdW1iZXJzIiwKLSAgICAgICAgTlVMTAotICAgICAgfQotICAgIH0sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMiAqLwotICAgICAgIlRleHQgU3BhY2luZyIsCi0gICAgICAxLAotICAgICAgewotICAgICAgICAiUHJvcG9ydGlvbmFsIiwKLSAgICAgICAgIk1vbm9zcGFjZWQiLAotICAgICAgICAiSGFsZi13aWR0aCIsCi0gICAgICAgICJOb3JtYWwiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgLyogSGVyZSBhZnRlciBOZXdlciAqLyAgeyAvKiAyMyAqLwotICAgICAgIlRyYW5zbGl0ZXJhdGlvbiIsCi0gICAgICAxLAotICAgICAgewotICAgICAgICAiTm8gVHJhbnNsaXRlcmF0aW9uIiwKLSAgICAgICAgIkhhbmphIFRvIEhhbmd1bCIsCi0gICAgICAgICJIaXJhZ2FuYSB0byBLYXRha2FuYSIsCi0gICAgICAgICJLYXRha2FuYSB0byBIaXJhZ2FuYSIsCi0gICAgICAgICJLYW5hIHRvIFJvbWFuaXphdGlvbiIsCi0gICAgICAgICJSb21hbml6YXRpb24gdG8gSGlyYWdhbmEiLAotICAgICAgICAiUm9tYW5pemF0aW9uIHRvIEthdGFrYW5hIiwKLSAgICAgICAgIkhhbmphIHRvIEhhbmd1bCwgQWx0ZXJuYXRpdmUgU2V0IDEiLAotICAgICAgICAiSGFuamEgdG8gSGFuZ3VsLCBBbHRlcm5hdGl2ZSBTZXQgMiIsCi0gICAgICAgICJIYW5qYSB0byBIYW5ndWwsIEFsdGVybmF0aXZlIFNldCAzIiwKLSAgICAgICAgTlVMTAotICAgICAgfQotICAgIH0sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNCAqLwotICAgICAgIkFubm90YXRpb24iLAotICAgICAgMSwKLSAgICAgIHsKLSAgICAgICAgIk5vIEFubm90YXRpb24iLAotICAgICAgICAiQm94IEFubm90YXRpb24iLAotICAgICAgICAiUm91bmRlZCBCb3ggQW5ub3RhdGlvbiIsCi0gICAgICAgICJDaXJjbGUgQW5ub3RhdGlvbiIsCi0gICAgICAgICJJbnZlcnRlZCBDaXJjbGUgQW5ub3RhdGlvbiIsCi0gICAgICAgICJQYXJlbnRoZXNpcyBBbm5vdGF0aW9uIiwKLSAgICAgICAgIlBlcmlvZCBBbm5vdGF0aW9uIiwKLSAgICAgICAgIlJvbWFuIE51bWVyYWwgQW5ub3RhdGlvbiIsCi0gICAgICAgICJEaWFtb25kIEFubm90YXRpb24iLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI1ICovCi0gICAgICAiS2FuYSBTcGFjaW5nIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJGdWxsIFdpZHRoIiwKLSAgICAgICAgIlByb3BvcnRpb25hbCIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYgKi8KLSAgICAgICJJZGVvZ3JhcGhpYyBTcGFjaW5nIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJGdWxsIFdpZHRoIiwKLSAgICAgICAgIlByb3BvcnRpb25hbCIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsICAgICAgICAgLyogMjctMzAgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogMzEtMzUgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogMzYtNDAgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogNDAtNDUgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogNDYtNTAgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogNTEtNTUgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogNTYtNjAgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogNjEtNjUgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogNjYtNzAgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogNzEtNzUgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogNzYtODAgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogODEtODUgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogODYtOTAgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgLyogOTEtOTUgKi8KLSAgICBFTVBUWUZFQVQsIEVNUFRZRkVBVCwgRU1QVFlGRUFULCAgICAgICAgICAgICAgICAgICAgICAgLyogOTYtOTggKi8KLSAgICBFTVBUWUZFQVQsIC8qIDk5ICovIHsgICAgICAgICAgICAgICAgICAgLyogMTAwID0+IDIyICovCi0gICAgICAiVGV4dCBTcGFjaW5nIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJQcm9wb3J0aW9uYWwiLAotICAgICAgICAiTW9ub3NwYWNlZCIsCi0gICAgICAgICJIYWxmLXdpZHRoIiwKLSAgICAgICAgIk5vcm1hbCIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAxID0+IDI1ICovCi0gICAgICAiS2FuYSBTcGFjaW5nIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJGdWxsIFdpZHRoIiwKLSAgICAgICAgIlByb3BvcnRpb25hbCIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAyID0+IDI2ICovCi0gICAgICAiSWRlb2dyYXBoaWMgU3BhY2luZyIsCi0gICAgICAxLAotICAgICAgewotICAgICAgICAiRnVsbCBXaWR0aCIsCi0gICAgICAgICJQcm9wb3J0aW9uYWwiLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMyAqLwotICAgICAgIkNKSyBSb21hbiBTcGFjaW5nIiwKLSAgICAgIDEsCi0gICAgICB7Ci0gICAgICAgICJIYWxmLXdpZHRoIiwKLSAgICAgICAgIlByb3BvcnRpb25hbCIsCi0gICAgICAgICJEZWZhdWx0IFJvbWFuIiwKLSAgICAgICAgIkZ1bGwtd2lkdGggUm9tYW4iLAotICAgICAgICBOVUxMCi0gICAgICB9Ci0gICAgfSwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwNCA9PiAxICovCi0gICAgICAiQWxsIFR5cG9ncmFwaGljIEZlYXR1cmVzIiwKLSAgICAgIDAsCi0gICAgICB7Ci0gICAgICAgICJBbGwgVHlwZSBGZWF0dXJlcyIsCi0gICAgICAgIE5VTEwKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBpbnQKLSAgbWFpbiggdm9pZCApCi0gIHsKLSAgICBpbnQgIGk7Ci0KLQotICAgIHByaW50ZiggIiAge1xuIiApOwotICAgIHByaW50ZiggIiAgIC8qIEdlbmVyYXRlZCBmcm9tICVzICovXG4iLCBfX0ZJTEVfXyApOwotCi0gICAgZm9yICggaSA9IDA7Ci0gICAgICAgICAgaSA8IHNpemVvZiAoIGZlYXRyZWdfdGFibGUgKSAvIHNpemVvZiAoIEdYX0ZlYXR1cmVfUmVnaXN0cnlSZWMgKTsKLSAgICAgICAgICBpKysgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqICBmZWF0X25hbWU7Ci0gICAgICBpbnQgICAgICAgICAgblNldHRpbmdzOwotCi0KLSAgICAgIGZlYXRfbmFtZSA9IGZlYXRyZWdfdGFibGVbaV0uZmVhdF9uYW1lOwotICAgICAgZm9yICggblNldHRpbmdzID0gMDsKLSAgICAgICAgICAgIGZlYXRyZWdfdGFibGVbaV0uc2V0dGluZ19uYW1lW25TZXR0aW5nc107Ci0gICAgICAgICAgICBuU2V0dGluZ3MrKykKLSAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG8gbm90aGluZyAqLwotCi0gICAgICBwcmludGYoICIgICAgeyUxZCwgJTFkLCAlMWQsICUyZH0sICAgLyogJXMgKi9cbiIsCi0gICAgICAgICAgICAgIGZlYXRfbmFtZSA/IDEgOiAwLAotICAgICAgICAgICAgICAoIGZlYXRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAoIGZ0X3N0cm5jbXAoIGZlYXRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUExFX1JFU0VSVkVELCBBUFBMRV9SRVNFUlZFRF9MRU5HVEggKSA9PSAwICkKLSAgICAgICAgICAgICAgKSA/IDEgOiAwLAotICAgICAgICAgICAgICBmZWF0cmVnX3RhYmxlW2ldLmV4Y2x1c2l2ZSA/IDEgOiAwLAotICAgICAgICAgICAgICBuU2V0dGluZ3MsCi0gICAgICAgICAgICAgIGZlYXRfbmFtZSA/IGZlYXRfbmFtZSA6ICJfX0VNUFRZX18iICk7Ci0gICAgfQotCi0gICAgcHJpbnRmKCAiICB9O1xuIiApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dmp1c3QuYyBiL3NyYy9neHZhbGlkL2d4dmp1c3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjZmQ4My4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZqdXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2anVzdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIGp1c3QgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImd4dmFsaWQuaCIKLSNpbmNsdWRlICJneHZjb21tbi5oIgotCi0jaW5jbHVkZSBGVF9TRk5UX05BTUVTX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dmp1c3QKLQotICAvKgotICAgKiByZWZlcnJlZCBganVzdCcgdGFibGUgZm9ybWF0IHNwZWNpZmljYXRpb246Ci0gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZqdXN0Lmh0bWwKLSAgICogbGFzdCB1cGRhdGVkIDIwMDAuCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICogW0pVU1QgSEVBREVSXTogR1hWX0pVU1RfSEVBREVSX1NJWkUKLSAgICogdmVyc2lvbiAgICAgKGZpeGVkOiAgMzJiaXQpID0gMHgwMDAxMDAwMAotICAgKiBmb3JtYXQgICAgICAodWludDE2OiAxNmJpdCkgPSAwIGlzIG9ubHkgZGVmaW5lZCAoMjAwMCkKLSAgICogaG9yaXpPZmZzZXQgKHVpbnQxNjogMTZiaXQpCi0gICAqIHZlcnRPZmZzZXQgICh1aW50MTY6IDE2Yml0KQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBHWFZfanVzdF9EYXRhUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICB3ZGNfb2Zmc2V0X21heDsKLSAgICBGVF9VU2hvcnQgIHdkY19vZmZzZXRfbWluOwotICAgIEZUX1VTaG9ydCAgcGNfb2Zmc2V0X21heDsKLSAgICBGVF9VU2hvcnQgIHBjX29mZnNldF9taW47Ci0KLSAgfSBHWFZfanVzdF9EYXRhUmVjLCAqR1hWX2p1c3RfRGF0YTsKLQotCi0jZGVmaW5lICBHWFZfSlVTVF9EQVRBKCBhICkgIEdYVl9UQUJMRV9EQVRBKCBqdXN0LCBhICkKLQotCi0gIC8qIEdYIGp1c3QgdGFibGUgZG9lcyBub3QgZGVmaW5lIHRoZWlyIHN1YnNldCBvZiBHSUQgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2p1c3RfY2hlY2tfbWF4X2dpZCggRlRfVVNob3J0ICAgICAgICAgZ2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtc2dfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICAgICBneHZhbGlkICkKLSAgewotICAgIGlmICggZ2lkIDwgZ3h2YWxpZC0+ZmFjZS0+bnVtX2dseXBocyApCi0gICAgICByZXR1cm47Ci0KLSAgICBHWFZfVFJBQ0UoKCAianVzdCB0YWJsZSBpbmNsdWRlcyB0b28gbGFyZ2UgJXMiCi0gICAgICAgICAgICAgICAgIiBHSUQ9JWQgPiAlZCAoaW4gbWF4cClcbiIsCi0gICAgICAgICAgICAgICAgbXNnX3RhZywgZ2lkLCBneHZhbGlkLT5mYWNlLT5udW1fZ2x5cGhzICkpOwotICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0dMWVBIX0lEICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X3dkcF9lbnRyeV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSAgICBGVF9VTG9uZyAgIGp1c3RDbGFzczsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgIEZUX0ZpeGVkICAgYmVmb3JlR3Jvd0xpbWl0OwotICAgIEZUX0ZpeGVkICAgYmVmb3JlU2hyaW5rR3Jvd0xpbWl0OwotICAgIEZUX0ZpeGVkICAgYWZ0ZXJHcm93TGltaXQ7Ci0gICAgRlRfRml4ZWQgICBhZnRlclNocmlua0dyb3dMaW1pdDsKLSAgICBGVF9VU2hvcnQgIGdyb3dGbGFnczsKLSAgICBGVF9VU2hvcnQgIHNocmlua0ZsYWdzOwotI2VuZGlmCi0KLQotICAgIEdYVl9MSU1JVF9DSEVDSyggNCArIDQgKyA0ICsgNCArIDQgKyAyICsgMiApOwotICAgIGp1c3RDbGFzcyAgICAgICAgICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSNpZm5kZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBwICs9IDQgKyA0ICsgNCArIDQgKyAyICsgMjsKLSNlbHNlCi0gICAgYmVmb3JlR3Jvd0xpbWl0ICAgICAgID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgIGJlZm9yZVNocmlua0dyb3dMaW1pdCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBhZnRlckdyb3dMaW1pdCAgICAgICAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgYWZ0ZXJTaHJpbmtHcm93TGltaXQgID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgIGdyb3dGbGFncyAgICAgICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgc2hyaW5rRmxhZ3MgICAgICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSNlbmRpZgotCi0gICAgLyogQWNjb3JkaW5nIHRvIEFwcGxlIHNwZWMsIG9ubHkgN2JpdHMgaW4ganVzdENsYXNzIGlzIHVzZWQgKi8KLSAgICBpZiAoICgganVzdENsYXNzICYgMHhGRkZGRkY4MFVMICkgIT0gMCApCi0gICAgewotICAgICAgR1hWX1RSQUNFKCggImp1c3QgdGFibGUgaW5jbHVkZXMgbm9uLXplcm8gdmFsdWUiCi0gICAgICAgICAgICAgICAgICAiIGluIHVudXNlZCBqdXN0Q2xhc3MgaGlnaGVyIGJpdHMiCi0gICAgICAgICAgICAgICAgICAiIG9mIFdpZHRoRGVsdGFQYWlyIiApKTsKLSAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0RBVEEgKTsKLSAgICB9Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2p1c3Rfd2RjX2VudHJ5X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUxvbmcgIGNvdW50LCBpOwotCi0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICBjb3VudCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBmb3IgKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICJ2YWxpZGF0aW5nIHdkYyBwYWlyICVkLyVkXG4iLCBpICsgMSwgY291bnQgKSk7Ci0gICAgICBneHZfanVzdF93ZHBfZW50cnlfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLSAgICB9Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2p1c3Rfd2lkdGhEZWx0YUNsdXN0ZXJzX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwICAgICAgICAgPSB0YWJsZTsKLSAgICBGVF9CeXRlcyAgd2RjX2VuZCAgID0gdGFibGUgKyBHWFZfSlVTVF9EQVRBKCB3ZGNfb2Zmc2V0X21heCApOwotICAgIEZUX1VJbnQgICBpOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggImp1c3QganVzdERlbHRhQ2x1c3RlcnMiICk7Ci0KLSAgICBpZiAoIGxpbWl0IDw9IHdkY19lbmQgKQotICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgcCA8PSB3ZGNfZW5kOyBpKysgKQotICAgIHsKLSAgICAgIGd4dl9qdXN0X3dkY19lbnRyeV92YWxpZGF0ZSggcCwgbGltaXQsIGd4dmFsaWQgKTsKLSAgICAgIHAgKz0gZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoOwotICAgIH0KLQotICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCA9IChGVF9VTG9uZykoIHAgLSB0YWJsZSApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X2FjdFN1YnJlY29yZF90eXBlMF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLQotICAgIEZUX0ZpeGVkICAgbG93ZXJMaW1pdDsKLSAgICBGVF9GaXhlZCAgIHVwcGVyTGltaXQ7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBGVF9VU2hvcnQgIG9yZGVyOwotI2VuZGlmCi0gICAgRlRfVVNob3J0ICBkZWNvbXBvc2VkQ291bnQ7Ci0KLSAgICBGVF9VSW50ICAgIGk7Ci0KLQotICAgIEdYVl9MSU1JVF9DSEVDSyggNCArIDQgKyAyICsgMiApOwotICAgIGxvd2VyTGltaXQgICAgICA9IEZUX05FWFRfTE9ORyggcCApOwotICAgIHVwcGVyTGltaXQgICAgICA9IEZUX05FWFRfTE9ORyggcCApOwotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgb3JkZXIgICAgICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSNlbHNlCi0gICAgcCArPSAyOwotI2VuZGlmCi0gICAgZGVjb21wb3NlZENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIGlmICggbG93ZXJMaW1pdCA+PSB1cHBlckxpbWl0ICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAianVzdCB0YWJsZSBpbmNsdWRlcyBpbnZhbGlkIHJhbmdlIHNwZWM6IgotICAgICAgICAgICAgICAgICAgIiBsb3dlckxpbWl0KCVkKSA+IHVwcGVyTGltaXQoJWQpXG4iICAgICApKTsKLSAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0RBVEEgKTsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGRlY29tcG9zZWRDb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9VU2hvcnQgZ2x5cGhzOwotCi0KLSAgICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotICAgICAgZ2x5cGhzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGd4dl9qdXN0X2NoZWNrX21heF9naWQoIGdseXBocywgInR5cGUwOmdseXBocyIsIGd4dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2p1c3RfYWN0U3VicmVjb3JkX3R5cGUxX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgcCA9IHRhYmxlOwotICAgIEZUX1VTaG9ydCAgYWRkR2x5cGg7Ci0KLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotICAgIGFkZEdseXBoID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIGd4dl9qdXN0X2NoZWNrX21heF9naWQoIGFkZEdseXBoLCAidHlwZTE6YWRkR2x5cGgiLCBneHZhbGlkICk7Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2p1c3RfYWN0U3VicmVjb3JkX3R5cGUyX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgcCA9IHRhYmxlOwotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgRlRfRml4ZWQgICAgICBzdWJzdFRocmVzaGhvbGQ7IC8qIEFwcGxlIG1pc3NwZWxsZWQgIlRocmVzaGhvbGQiICovCi0jZW5kaWYKLSAgICBGVF9VU2hvcnQgIGFkZEdseXBoOwotICAgIEZUX1VTaG9ydCAgc3Vic3RHbHlwaDsKLQotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCA0ICsgMiArIDIgKTsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgIHN1YnN0VGhyZXNoaG9sZCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSNlbHNlCi0gICAgcCArPSA0OwotI2VuZGlmCi0gICAgYWRkR2x5cGggICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBzdWJzdEdseXBoICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgaWYgKCBhZGRHbHlwaCAhPSAweEZGRkYgKQotICAgICAgZ3h2X2p1c3RfY2hlY2tfbWF4X2dpZCggYWRkR2x5cGgsICJ0eXBlMjphZGRHbHlwaCIsIGd4dmFsaWQgKTsKLQotICAgIGd4dl9qdXN0X2NoZWNrX21heF9naWQoIHN1YnN0R2x5cGgsICJ0eXBlMjpzdWJzdEdseXBoIiwgZ3h2YWxpZCApOwotCi0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gKEZUX1VMb25nKSggcCAtIHRhYmxlICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X2FjdFN1YnJlY29yZF90eXBlNF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VMb25nICB2YXJpYW50c0F4aXM7Ci0gICAgRlRfRml4ZWQgIG1pbmltdW1MaW1pdDsKLSAgICBGVF9GaXhlZCAgbm9TdHJldGNoVmFsdWU7Ci0gICAgRlRfRml4ZWQgIG1heGltdW1MaW1pdDsKLQotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCA0ICsgNCArIDQgKyA0ICk7Ci0gICAgdmFyaWFudHNBeGlzICAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbWluaW11bUxpbWl0ICAgPSBGVF9ORVhUX0xPTkcoIHAgKTsKLSAgICBub1N0cmV0Y2hWYWx1ZSA9IEZUX05FWFRfTE9ORyggcCApOwotICAgIG1heGltdW1MaW1pdCAgID0gRlRfTkVYVF9MT05HKCBwICk7Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLQotICAgIGlmICggdmFyaWFudHNBeGlzICE9IDB4NjQ3NTYzNzRMICkgLyogJ2R1Y3QnICovCi0gICAgICBHWFZfVFJBQ0UoKCAidmFyaWFudHNBeGlzIDB4JTA4eCBpcyBub24gZGVmYXVsdCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgdmFyaWFudHNBeGlzICkpOwotCi0gICAgaWYgKCBtaW5pbXVtTGltaXQgPiBub1N0cmV0Y2hWYWx1ZSApCi0gICAgICBHWFZfVFJBQ0UoKCAidHlwZTQ6bWluaW11bUxpbWl0IDB4JTA4eCA+IG5vU3RyZXRjaFZhbHVlIDB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgIG1pbmltdW1MaW1pdCwgbm9TdHJldGNoVmFsdWUgKSk7Ci0gICAgZWxzZSBpZiAoIG5vU3RyZXRjaFZhbHVlID4gbWF4aW11bUxpbWl0ICkKLSAgICAgIEdYVl9UUkFDRSgoICJ0eXBlNDpub1N0cmV0Y2hWYWx1ZSAweCUwOHggPiBtYXhpbXVtTGltaXQgMHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgbm9TdHJldGNoVmFsdWUsIG1heGltdW1MaW1pdCApKTsKLSAgICBlbHNlIGlmICggIUlTX1BBUkFOT0lEX1ZBTElEQVRJT04gKQotICAgICAgcmV0dXJuOwotCi0gICAgRlRfSU5WQUxJRF9EQVRBOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfanVzdF9hY3RTdWJyZWNvcmRfdHlwZTVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICBwID0gdGFibGU7Ci0gICAgRlRfVVNob3J0ICBmbGFnczsKLSAgICBGVF9VU2hvcnQgIGdseXBoOwotCi0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICk7Ci0gICAgZmxhZ3MgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGdseXBoID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIGlmICggZmxhZ3MgKQotICAgICAgR1hWX1RSQUNFKCggInR5cGU1OiBub256ZXJvIHZhbHVlIDB4JTA0eCBpbiB1bnVzZWQgZmxhZ3NcbiIsCi0gICAgICAgICAgICAgICAgICAgZmxhZ3MgKSk7Ci0gICAgZ3h2X2p1c3RfY2hlY2tfbWF4X2dpZCggZ2x5cGgsICJ0eXBlNTpnbHlwaCIsIGd4dmFsaWQgKTsKLQotICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCA9IChGVF9VTG9uZykoIHAgLSB0YWJsZSApOwotICB9Ci0KLQotICAvKiBwYXJzZSBzaW5nbGUgYWN0U3VicmVjb3JkICovCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X2FjdFN1YnJlY29yZF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSAgICBGVF9VU2hvcnQgIGFjdGlvbkNsYXNzOwotICAgIEZUX1VTaG9ydCAgYWN0aW9uVHlwZTsKLSAgICBGVF9VTG9uZyAgIGFjdGlvbkxlbmd0aDsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJqdXN0IGFjdFN1YnJlY29yZCIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiArIDIgKyA0ICk7Ci0gICAgYWN0aW9uQ2xhc3MgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBhY3Rpb25UeXBlICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGFjdGlvbkxlbmd0aCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIC8qIGFjdGlvbkNsYXNzIGlzIHJlbGF0ZWQgd2l0aCBqdXN0Q2xhc3MgdXNpbmcgN2JpdCBvbmx5ICovCi0gICAgaWYgKCAoIGFjdGlvbkNsYXNzICYgMHhGRjgwICkgIT0gMCApCi0gICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9EQVRBICk7Ci0KLSAgICBpZiAoIGFjdGlvblR5cGUgPT0gMCApCi0gICAgICBneHZfanVzdF9hY3RTdWJyZWNvcmRfdHlwZTBfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgZWxzZSBpZiAoIGFjdGlvblR5cGUgPT0gMSApCi0gICAgICBneHZfanVzdF9hY3RTdWJyZWNvcmRfdHlwZTFfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgZWxzZSBpZiAoIGFjdGlvblR5cGUgPT0gMiApCi0gICAgICBneHZfanVzdF9hY3RTdWJyZWNvcmRfdHlwZTJfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgZWxzZSBpZiAoIGFjdGlvblR5cGUgPT0gMyApCi0gICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0cmV0Y2ggZ2x5cGggYWN0aW9uOiBubyBhY3Rpb25EYXRhICovCi0gICAgZWxzZSBpZiAoIGFjdGlvblR5cGUgPT0gNCApCi0gICAgICBneHZfanVzdF9hY3RTdWJyZWNvcmRfdHlwZTRfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgZWxzZSBpZiAoIGFjdGlvblR5cGUgPT0gNSApCi0gICAgICBneHZfanVzdF9hY3RTdWJyZWNvcmRfdHlwZTVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgZWxzZQotICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gYWN0aW9uTGVuZ3RoOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X3BjQWN0aW9uUmVjb3JkX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VMb25nICBhY3Rpb25Db3VudDsKLSAgICBGVF9VTG9uZyAgaTsKLQotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgYWN0aW9uQ291bnQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgR1hWX1RSQUNFKCggImFjdGlvbkNvdW50ID0gJWRcbiIsIGFjdGlvbkNvdW50ICkpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBhY3Rpb25Db3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBneHZfanVzdF9hY3RTdWJyZWNvcmRfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLSAgICB9Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfanVzdF9wY1RhYmxlX0xvb2t1cFZhbHVlX2VudHJ5X3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0xvb2t1cFZhbHVlQ1B0ciAgdmFsdWVfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGdseXBoICk7Ci0KLSAgICBpZiAoIHZhbHVlX3AtPnUgPiBHWFZfSlVTVF9EQVRBKCBwY19vZmZzZXRfbWF4ICkgKQotICAgICAgR1hWX0pVU1RfREFUQSggcGNfb2Zmc2V0X21heCApID0gdmFsdWVfcC0+dTsKLSAgICBpZiAoIHZhbHVlX3AtPnUgPCBHWFZfSlVTVF9EQVRBKCBwY19vZmZzZXRfbWF4ICkgKQotICAgICAgR1hWX0pVU1RfREFUQSggcGNfb2Zmc2V0X21pbiApID0gdmFsdWVfcC0+dTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2p1c3RfcGNMb29rdXBUYWJsZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAianVzdCBwY0xvb2t1cFRhYmxlIiApOwotICAgIEdYVl9KVVNUX0RBVEEoIHBjX29mZnNldF9tYXggKSA9IDB4MDAwMDsKLSAgICBHWFZfSlVTVF9EQVRBKCBwY19vZmZzZXRfbWluICkgPSAweEZGRkZVOwotCi0gICAgZ3h2YWxpZC0+bG9va3VwdmFsX3NpZ24gPSBHWFZfTE9PS1VQVkFMVUVfVU5TSUdORUQ7Ci0gICAgZ3h2YWxpZC0+bG9va3VwdmFsX2Z1bmMgPSBneHZfanVzdF9wY1RhYmxlX0xvb2t1cFZhbHVlX2VudHJ5X3ZhbGlkYXRlOwotCi0gICAgZ3h2X0xvb2t1cFRhYmxlX3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0gICAgLyogc3VidGFibGVfbGVuZ3RoIGlzIHNldCBieSBneHZfTG9va3VwVGFibGVfdmFsaWRhdGUoKSAqLwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X3Bvc3Rjb21wVGFibGVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggImp1c3QgcG9zdGNvbXBUYWJsZSIgKTsKLQotICAgIGd4dl9qdXN0X3BjTG9va3VwVGFibGVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0KLSAgICBneHZfanVzdF9wY0FjdGlvblJlY29yZF92YWxpZGF0ZSggcCwgbGltaXQsIGd4dmFsaWQgKTsKLSAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLQotICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCA9IChGVF9VTG9uZykoIHAgLSB0YWJsZSApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X2NsYXNzVGFibGVfZW50cnlfdmFsaWRhdGUoCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ciAgZ2x5cGhPZmZzZXRfcCwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAotICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgICAgICAgICAgICAgICAgICBneHZhbGlkICkKLSAgewotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgLyogVE9ETzogdmFsaWRhdGUgbWFya0NsYXNzICYgY3VycmVudENsYXNzICovCi0gICAgRlRfVVNob3J0ICBzZXRNYXJrOwotICAgIEZUX1VTaG9ydCAgZG9udEFkdmFuY2U7Ci0gICAgRlRfVVNob3J0ICBtYXJrQ2xhc3M7Ci0gICAgRlRfVVNob3J0ICBjdXJyZW50Q2xhc3M7Ci0jZW5kaWYKLQotICAgIEZUX1VOVVNFRCggc3RhdGUgKTsKLSAgICBGVF9VTlVTRUQoIGdseXBoT2Zmc2V0X3AgKTsKLSAgICBGVF9VTlVTRUQoIHRhYmxlICk7Ci0gICAgRlRfVU5VU0VEKCBsaW1pdCApOwotICAgIEZUX1VOVVNFRCggZ3h2YWxpZCApOwotCi0jaWZuZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgRlRfVU5VU0VEKCBmbGFncyApOwotI2Vsc2UKLSAgICBzZXRNYXJrICAgICAgPSAoRlRfVVNob3J0KSggKCBmbGFncyA+PiAxNSApICYgMSAgICApOwotICAgIGRvbnRBZHZhbmNlICA9IChGVF9VU2hvcnQpKCAoIGZsYWdzID4+IDE0ICkgJiAxICAgICk7Ci0gICAgbWFya0NsYXNzICAgID0gKEZUX1VTaG9ydCkoICggZmxhZ3MgPj4gNyAgKSAmIDB4N0YgKTsKLSAgICBjdXJyZW50Q2xhc3MgPSAoRlRfVVNob3J0KSggICBmbGFncyAgICAgICAgICYgMHg3RiApOwotI2VuZGlmCi0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X2p1c3RDbGFzc1RhYmxlX3ZhbGlkYXRlICggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSAgICBGVF9VU2hvcnQgIGxlbmd0aDsKLSAgICBGVF9VU2hvcnQgIGNvdmVyYWdlOwotICAgIEZUX1VMb25nICAgc3ViRmVhdHVyZUZsYWdzOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggImp1c3QganVzdENsYXNzVGFibGUiICk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICsgNCApOwotICAgIGxlbmd0aCAgICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgY292ZXJhZ2UgICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBzdWJGZWF0dXJlRmxhZ3MgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBHWFZfVFJBQ0UoKCAiICBqdXN0Q2xhc3NUYWJsZTogY292ZXJhZ2UgPSAweCUwNHggKCVzKSAiLCBjb3ZlcmFnZSApKTsKLSAgICBpZiAoICggY292ZXJhZ2UgJiAweDQwMDAgKSA9PSAwICApCi0gICAgICBHWFZfVFJBQ0UoKCAiYXNjZW5kaW5nXG4iICkpOwotICAgIGVsc2UKLSAgICAgIEdYVl9UUkFDRSgoICJkZXNjZW5kaW5nXG4iICkpOwotCi0gICAgaWYgKCBzdWJGZWF0dXJlRmxhZ3MgKQotICAgICAgR1hWX1RSQUNFKCggIiAganVzdENsYXNzVGFibGU6IG5vbnplcm8gdmFsdWUgKDB4JTA4eCkiCi0gICAgICAgICAgICAgICAgICAiIGluIHVudXNlZCBzdWJGZWF0dXJlRmxhZ3NcbiIsIHN1YkZlYXR1cmVGbGFncyApKTsKLQotICAgIGd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YSAgICAgICAgICAgICAgID0gTlVMTDsKLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGFfbG9hZF9mdW5jICAgICA9IE5VTEw7Ci0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5zdWJ0YWJsZV9zZXR1cF9mdW5jICAgPSBOVUxMOwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUuZW50cnlfZ2x5cGhvZmZzZXRfZm10ID0gR1hWX0dMWVBIT0ZGU0VUX05PTkU7Ci0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5lbnRyeV92YWxpZGF0ZV9mdW5jICAgPQotICAgICAgZ3h2X2p1c3RfY2xhc3NUYWJsZV9lbnRyeV92YWxpZGF0ZTsKLQotICAgIGd4dl9TdGF0ZVRhYmxlX3ZhbGlkYXRlKCBwLCB0YWJsZSArIGxlbmd0aCwgZ3h2YWxpZCApOwotCi0gICAgLyogc3VidGFibGVfbGVuZ3RoIGlzIHNldCBieSBneHZfTG9va3VwVGFibGVfdmFsaWRhdGUoKSAqLwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X3dkY1RhYmxlX0xvb2t1cFZhbHVlX3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9Mb29rdXBWYWx1ZUNQdHIgIHZhbHVlX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICAgICAgICBneHZhbGlkICkKLSAgewotICAgIEZUX1VOVVNFRCggZ2x5cGggKTsKLQotICAgIGlmICggdmFsdWVfcC0+dSA+IEdYVl9KVVNUX0RBVEEoIHdkY19vZmZzZXRfbWF4ICkgKQotICAgICAgR1hWX0pVU1RfREFUQSggd2RjX29mZnNldF9tYXggKSA9IHZhbHVlX3AtPnU7Ci0gICAgaWYgKCB2YWx1ZV9wLT51IDwgR1hWX0pVU1RfREFUQSggd2RjX29mZnNldF9taW4gKSApCi0gICAgICBHWFZfSlVTVF9EQVRBKCB3ZGNfb2Zmc2V0X21pbiApID0gdmFsdWVfcC0+dTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2p1c3RfanVzdERhdGFfbG9va3VwdGFibGVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLQotICAgIEdYVl9KVVNUX0RBVEEoIHdkY19vZmZzZXRfbWF4ICkgPSAweDAwMDA7Ci0gICAgR1hWX0pVU1RfREFUQSggd2RjX29mZnNldF9taW4gKSA9IDB4RkZGRlU7Ci0KLSAgICBneHZhbGlkLT5sb29rdXB2YWxfc2lnbiA9IEdYVl9MT09LVVBWQUxVRV9VTlNJR05FRDsKLSAgICBneHZhbGlkLT5sb29rdXB2YWxfZnVuYyA9IGd4dl9qdXN0X3dkY1RhYmxlX0xvb2t1cFZhbHVlX3ZhbGlkYXRlOwotCi0gICAgZ3h2X0xvb2t1cFRhYmxlX3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0gICAgLyogc3VidGFibGVfbGVuZ3RoIGlzIHNldCBieSBneHZfTG9va3VwVGFibGVfdmFsaWRhdGUoKSAqLwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qCi0gICAqIGd4dl9qdXN0X2p1c3REYXRhX3ZhbGlkYXRlKCkgcGFyc2VzIGFuZCB2YWxpZGF0ZXMgaG9yaXpEYXRhLCB2ZXJ0RGF0YS4KLSAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9qdXN0X2p1c3REYXRhX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICAvKgotICAgICAqIGZvbGxvd2luZyAzIG9mZnNldHMgYXJlIG1lYXN1cmVkIGZyb20gdGhlIHN0YXJ0IG9mIGBqdXN0JwotICAgICAqICh3aGljaCB0YWJsZSBwb2ludHMgdG8pLCBub3QganVzdERhdGEKLSAgICAgKi8KLSAgICBGVF9VU2hvcnQgIGp1c3RDbGFzc1RhYmxlT2Zmc2V0OwotICAgIEZUX1VTaG9ydCAgd2RjVGFibGVPZmZzZXQ7Ci0gICAgRlRfVVNob3J0ICBwY1RhYmxlT2Zmc2V0OwotICAgIEZUX0J5dGVzICAgcCA9IHRhYmxlOwotCi0gICAgR1hWX09EVEVDVCggNCwgb2R0ZWN0ICk7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAianVzdCBqdXN0RGF0YSIgKTsKLQotICAgIEdYVl9PRFRFQ1RfSU5JVCggb2R0ZWN0ICk7Ci0gICAgR1hWX0xJTUlUX0NIRUNLKCAyICsgMiArIDIgKTsKLSAgICBqdXN0Q2xhc3NUYWJsZU9mZnNldCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgd2RjVGFibGVPZmZzZXQgICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIHBjVGFibGVPZmZzZXQgICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIEdYVl9UUkFDRSgoICIgKGp1c3RDbGFzc1RhYmxlT2Zmc2V0ID0gMHglMDR4KVxuIiwganVzdENsYXNzVGFibGVPZmZzZXQgKSk7Ci0gICAgR1hWX1RSQUNFKCggIiAod2RjVGFibGVPZmZzZXQgPSAweCUwNHgpXG4iLCB3ZGNUYWJsZU9mZnNldCApKTsKLSAgICBHWFZfVFJBQ0UoKCAiIChwY1RhYmxlT2Zmc2V0ID0gMHglMDR4KVxuIiwgcGNUYWJsZU9mZnNldCApKTsKLQotICAgIGd4dl9qdXN0X2p1c3REYXRhX2xvb2t1cHRhYmxlX3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotICAgIGd4dl9vZHRlY3RfYWRkX3JhbmdlKCBwLCBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJqdXN0X0xvb2t1cFRhYmxlIiwgb2R0ZWN0ICk7Ci0KLSAgICBpZiAoIHdkY1RhYmxlT2Zmc2V0ICkKLSAgICB7Ci0gICAgICBneHZfanVzdF93aWR0aERlbHRhQ2x1c3RlcnNfdmFsaWRhdGUoCi0gICAgICAgIGd4dmFsaWQtPnJvb3QtPmJhc2UgKyB3ZGNUYWJsZU9mZnNldCwgbGltaXQsIGd4dmFsaWQgKTsKLSAgICAgIGd4dl9vZHRlY3RfYWRkX3JhbmdlKCBneHZhbGlkLT5yb290LT5iYXNlICsgd2RjVGFibGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoLCAianVzdF93ZGNUYWJsZSIsIG9kdGVjdCApOwotICAgIH0KLQotICAgIGlmICggcGNUYWJsZU9mZnNldCApCi0gICAgewotICAgICAgZ3h2X2p1c3RfcG9zdGNvbXBUYWJsZV92YWxpZGF0ZSggZ3h2YWxpZC0+cm9vdC0+YmFzZSArIHBjVGFibGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCwgZ3h2YWxpZCApOwotICAgICAgZ3h2X29kdGVjdF9hZGRfcmFuZ2UoIGd4dmFsaWQtPnJvb3QtPmJhc2UgKyBwY1RhYmxlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCwgImp1c3RfcGNUYWJsZSIsIG9kdGVjdCApOwotICAgIH0KLQotICAgIGlmICgganVzdENsYXNzVGFibGVPZmZzZXQgKQotICAgIHsKLSAgICAgIGd4dl9qdXN0X2p1c3RDbGFzc1RhYmxlX3ZhbGlkYXRlKAotICAgICAgICBneHZhbGlkLT5yb290LT5iYXNlICsganVzdENsYXNzVGFibGVPZmZzZXQsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgICBneHZfb2R0ZWN0X2FkZF9yYW5nZSggZ3h2YWxpZC0+cm9vdC0+YmFzZSArIGp1c3RDbGFzc1RhYmxlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCwgImp1c3RfanVzdENsYXNzVGFibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kdGVjdCApOwotICAgIH0KLQotICAgIGd4dl9vZHRlY3RfdmFsaWRhdGUoIG9kdGVjdCwgZ3h2YWxpZCApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9qdXN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICBmdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgICAgICAgICBwICAgICA9IHRhYmxlOwotICAgIEZUX0J5dGVzICAgICAgICAgICBsaW1pdCA9IDA7Ci0KLSAgICBHWFZfVmFsaWRhdG9yUmVjICAgZ3h2YWxpZHJlYzsKLSAgICBHWFZfVmFsaWRhdG9yICAgICAgZ3h2YWxpZCA9ICZneHZhbGlkcmVjOwotICAgIEdYVl9qdXN0X0RhdGFSZWMgICBqdXN0cmVjOwotICAgIEdYVl9qdXN0X0RhdGEgICAgICBqdXN0ID0gJmp1c3RyZWM7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgdmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgZm9ybWF0OwotICAgIEZUX1VTaG9ydCAgICAgICAgICBob3Jpek9mZnNldDsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgdmVydE9mZnNldDsKLQotICAgIEdYVl9PRFRFQ1QoIDMsIG9kdGVjdCApOwotCi0KLSAgICBHWFZfT0RURUNUX0lOSVQoIG9kdGVjdCApOwotCi0gICAgZ3h2YWxpZC0+cm9vdCAgICAgICA9IGZ0dmFsaWQ7Ci0gICAgZ3h2YWxpZC0+dGFibGVfZGF0YSA9IGp1c3Q7Ci0gICAgZ3h2YWxpZC0+ZmFjZSAgICAgICA9IGZhY2U7Ci0KLSAgICBGVF9UUkFDRTMoKCAidmFsaWRhdGluZyBganVzdCcgdGFibGVcbiIgKSk7Ci0gICAgR1hWX0lOSVQ7Ci0KLSAgICBsaW1pdCAgICAgID0gZ3h2YWxpZC0+cm9vdC0+bGltaXQ7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDQgKyAyICsgMiArIDIgKTsKLSAgICB2ZXJzaW9uICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBmb3JtYXQgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgaG9yaXpPZmZzZXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIHZlcnRPZmZzZXQgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBneHZfb2R0ZWN0X2FkZF9yYW5nZSggdGFibGUsIChGVF9VTG9uZykoIHAgLSB0YWJsZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAianVzdCBoZWFkZXIiLCBvZHRlY3QgKTsKLQotCi0gICAgLyogVmVyc2lvbiAxLjAgKGFsd2F5czoyMDAwKSAqLwotICAgIEdYVl9UUkFDRSgoICIgKHZlcnNpb24gPSAweCUwOHgpXG4iLCB2ZXJzaW9uICkpOwotICAgIGlmICggdmVyc2lvbiAhPSAweDAwMDEwMDAwVUwgKQotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICAvKiBmb3JtYXQgMCAoYWx3YXlzOjIwMDApICovCi0gICAgR1hWX1RSQUNFKCggIiAoZm9ybWF0ID0gMHglMDR4KVxuIiwgZm9ybWF0ICkpOwotICAgIGlmICggZm9ybWF0ICE9IDB4MDAwMCApCi0gICAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgR1hWX1RSQUNFKCggIiAoaG9yaXpPZmZzZXQgPSAlZClcbiIsIGhvcml6T2Zmc2V0ICApKTsKLSAgICBHWFZfVFJBQ0UoKCAiICh2ZXJ0T2Zmc2V0ID0gJWQpXG4iLCB2ZXJ0T2Zmc2V0ICApKTsKLQotCi0gICAgLyogdmFsaWRhdGUganVzdERhdGEgKi8KLSAgICBpZiAoIDAgPCBob3Jpek9mZnNldCApCi0gICAgewotICAgICAgZ3h2X2p1c3RfanVzdERhdGFfdmFsaWRhdGUoIHRhYmxlICsgaG9yaXpPZmZzZXQsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgICBneHZfb2R0ZWN0X2FkZF9yYW5nZSggdGFibGUgKyBob3Jpek9mZnNldCwgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpekp1c3REYXRhIiwgb2R0ZWN0ICk7Ci0gICAgfQotCi0gICAgaWYgKCAwIDwgdmVydE9mZnNldCApCi0gICAgewotICAgICAgZ3h2X2p1c3RfanVzdERhdGFfdmFsaWRhdGUoIHRhYmxlICsgdmVydE9mZnNldCwgbGltaXQsIGd4dmFsaWQgKTsKLSAgICAgIGd4dl9vZHRlY3RfYWRkX3JhbmdlKCB0YWJsZSArIHZlcnRPZmZzZXQsIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVydEp1c3REYXRhIiwgb2R0ZWN0ICk7Ci0gICAgfQotCi0gICAgZ3h2X29kdGVjdF92YWxpZGF0ZSggb2R0ZWN0LCBneHZhbGlkICk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZrZXJuLmMgYi9zcmMvZ3h2YWxpZC9neHZrZXJuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTAzNzMuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2a2Vybi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmtlcm4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBrZXJuIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZhbGlkLmgiCi0jaW5jbHVkZSAiZ3h2Y29tbW4uaCIKLQotI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dYX1ZBTElEQVRFX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dmtlcm4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBEYXRhIGFuZCBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgZW51bSAgR1hWX2tlcm5fVmVyc2lvbl8KLSAgewotICAgIEtFUk5fVkVSU0lPTl9DTEFTU0lDID0gMHgwMDAwLAotICAgIEtFUk5fVkVSU0lPTl9ORVcgICAgID0gMHgwMDAxCi0KLSAgfSBHWFZfa2Vybl9WZXJzaW9uOwotCi0KLSAgdHlwZWRlZiBlbnVtIEdYVl9rZXJuX0RpYWxlY3RfCi0gIHsKLSAgICBLRVJOX0RJQUxFQ1RfVU5LTk9XTiA9IDAsCi0gICAgS0VSTl9ESUFMRUNUX01TICAgICAgPSBGVF9WQUxJREFURV9NUywKLSAgICBLRVJOX0RJQUxFQ1RfQVBQTEUgICA9IEZUX1ZBTElEQVRFX0FQUExFLAotICAgIEtFUk5fRElBTEVDVF9BTlkgICAgID0gRlRfVkFMSURBVEVfQ0tFUk4KLQotICB9IEdYVl9rZXJuX0RpYWxlY3Q7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX2tlcm5fRGF0YVJlY18KLSAgewotICAgIEdYVl9rZXJuX1ZlcnNpb24gIHZlcnNpb247Ci0gICAgdm9pZCAgICAgICAgICAgICAqc3VidGFibGVfZGF0YTsKLSAgICBHWFZfa2Vybl9EaWFsZWN0ICBkaWFsZWN0X3JlcXVlc3Q7Ci0KLSAgfSBHWFZfa2Vybl9EYXRhUmVjLCAqR1hWX2tlcm5fRGF0YTsKLQotCi0jZGVmaW5lIEdYVl9LRVJOX0RBVEEoIGZpZWxkICkgIEdYVl9UQUJMRV9EQVRBKCBrZXJuLCBmaWVsZCApCi0KLSNkZWZpbmUgS0VSTl9JU19DTEFTU0lDKCBneHZhbGlkICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggS0VSTl9WRVJTSU9OX0NMQVNTSUMgPT0gR1hWX0tFUk5fREFUQSggdmVyc2lvbiApICkKLSNkZWZpbmUgS0VSTl9JU19ORVcoIGd4dmFsaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggS0VSTl9WRVJTSU9OX05FVyAgICAgPT0gR1hWX0tFUk5fREFUQSggdmVyc2lvbiApICkKLQotI2RlZmluZSBLRVJOX0RJQUxFQ1QoIGd4dmFsaWQgKSAgICAgICAgICAgICAgXAotICAgICAgICAgIEdYVl9LRVJOX0RBVEEoIGRpYWxlY3RfcmVxdWVzdCApCi0jZGVmaW5lIEtFUk5fQUxMT1dTX01TKCBneHZhbGlkICkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEtFUk5fRElBTEVDVCggZ3h2YWxpZCApICYgS0VSTl9ESUFMRUNUX01TICkKLSNkZWZpbmUgS0VSTl9BTExPV1NfQVBQTEUoIGd4dmFsaWQgKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggS0VSTl9ESUFMRUNUKCBneHZhbGlkICkgJiBLRVJOX0RJQUxFQ1RfQVBQTEUgKQotCi0jZGVmaW5lIEdYVl9LRVJOX0hFQURFUl9TSVpFICAgICAgICAgICAoIEtFUk5fSVNfTkVXKCBneHZhbGlkICkgPyA4IDogNCApCi0jZGVmaW5lIEdYVl9LRVJOX1NVQlRBQkxFX0hFQURFUl9TSVpFICAoIEtFUk5fSVNfTkVXKCBneHZhbGlkICkgPyA4IDogNiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgU1VCVEFCTEUgVkFMSURBVE9SUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IGZvcm1hdCAwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDBfcGFpcnNfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgblBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgcCA9IHRhYmxlOwotICAgIEZUX1VTaG9ydCAgaTsKLQotICAgIEZUX1VTaG9ydCAgbGFzdF9naWRfbGVmdCAgPSAwOwotICAgIEZUX1VTaG9ydCAgbGFzdF9naWRfcmlnaHQgPSAwOwotCi0gICAgRlRfVU5VU0VEKCBsaW1pdCApOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggImtlcm4gZm9ybWF0IDAgcGFpcnMiICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG5QYWlyczsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9VU2hvcnQgIGdpZF9sZWZ0OwotICAgICAgRlRfVVNob3J0ICBnaWRfcmlnaHQ7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICAgIEZUX1Nob3J0ICAga2VyblZhbHVlOwotI2VuZGlmCi0KLQotICAgICAgLyogbGVmdCAqLwotICAgICAgZ2lkX2xlZnQgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCBnaWRfbGVmdCwgZ3h2YWxpZCApOwotCi0gICAgICAvKiByaWdodCAqLwotICAgICAgZ2lkX3JpZ2h0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCBnaWRfcmlnaHQsIGd4dmFsaWQgKTsKLQotICAgICAgLyogUGFpcnMgb2YgbGVmdCBhbmQgcmlnaHQgR0lEcyBtdXN0IGJlIHVuaXF1ZSBhbmQgc29ydGVkLiAqLwotICAgICAgR1hWX1RSQUNFKCggImxlZnQgZ2lkID0gJXUsIHJpZ2h0IGdpZCA9ICV1XG4iLCBnaWRfbGVmdCwgZ2lkX3JpZ2h0ICkpOwotICAgICAgaWYgKCBnaWRfbGVmdCA9PSBsYXN0X2dpZF9sZWZ0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBsYXN0X2dpZF9yaWdodCA8IGdpZF9yaWdodCApCi0gICAgICAgICAgbGFzdF9naWRfcmlnaHQgPSBnaWRfcmlnaHQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggbGFzdF9naWRfbGVmdCA8IGdpZF9sZWZ0ICkKLSAgICAgIHsKLSAgICAgICAgbGFzdF9naWRfbGVmdCAgPSBnaWRfbGVmdDsKLSAgICAgICAgbGFzdF9naWRfcmlnaHQgPSBnaWRfcmlnaHQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgLyogc2tpcCB0aGUga2VybiB2YWx1ZSAqLwotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgICBrZXJuVmFsdWUgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0jZWxzZQotICAgICAgcCArPSAyOwotI2VuZGlmCi0gICAgfQotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotICBzdGF0aWMgdm9pZAotICBneHZfa2Vybl9zdWJ0YWJsZV9mbXQwX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICBwID0gdGFibGUgKyBHWFZfS0VSTl9TVUJUQUJMRV9IRUFERVJfU0laRTsKLQotICAgIEZUX1VTaG9ydCAgblBhaXJzOwotICAgIEZUX1VTaG9ydCAgdW5pdFNpemU7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAia2VybiBzdWJ0YWJsZSBmb3JtYXQgMCIgKTsKLQotICAgIHVuaXRTaXplID0gMiArIDIgKyAyOwotICAgIG5QYWlycyAgID0gMDsKLQotICAgIC8qIG5QYWlycywgc2VhcmNoUmFuZ2UsIGVudHJ5U2VsZWN0b3IsIHJhbmdlU2hpZnQgKi8KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICsgMiArIDIgKTsKLSAgICBneHZfQmluU3JjaEhlYWRlcl92YWxpZGF0ZSggcCwgbGltaXQsICZ1bml0U2l6ZSwgJm5QYWlycywgZ3h2YWxpZCApOwotICAgIHAgKz0gMiArIDIgKyAyICsgMjsKLQotICAgIGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDBfcGFpcnNfdmFsaWRhdGUoIHAsIGxpbWl0LCBuUGFpcnMsIGd4dmFsaWQgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBmb3JtYXQgMSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBHWFZfa2Vybl9mbXQxX1N0YXRlT3B0UmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICB2YWx1ZVRhYmxlOwotICAgIEZUX1VTaG9ydCAgdmFsdWVUYWJsZV9sZW5ndGg7Ci0KLSAgfSBHWFZfa2Vybl9mbXQxX1N0YXRlT3B0UmVjLCAqR1hWX2tlcm5fZm10MV9TdGF0ZU9wdFJlY0RhdGE7Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfa2Vybl9zdWJ0YWJsZV9mbXQxX3ZhbHVlVGFibGVfbG9hZCggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgIHAgPSB0YWJsZTsKLSAgICBHWFZfa2Vybl9mbXQxX1N0YXRlT3B0UmVjRGF0YSAgb3B0ZGF0YSA9Ci0gICAgICAoR1hWX2tlcm5fZm10MV9TdGF0ZU9wdFJlY0RhdGEpZ3h2YWxpZC0+c3RhdGV0YWJsZS5vcHRkYXRhOwotCi0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBvcHRkYXRhLT52YWx1ZVRhYmxlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgfQotCi0KLSAgLyoKLSAgICogcGFzc2VkIHRhYmxlc19zaXplIGNvdmVycyB3aG9sZSBTdGF0ZVRhYmxlLCBpbmNsdWRpbmcga2VybiBmbXQxIGhlYWRlcgotICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2tlcm5fc3VidGFibGVfZm10MV9zdWJ0YWJsZV9zZXR1cCggRlRfVVNob3J0ICAgICAgdGFibGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgY2xhc3NUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgc3RhdGVBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgZW50cnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgY2xhc3NUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgc3RhdGVBcnJheV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgZW50cnlUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VU2hvcnQgIG9bNF07Ci0gICAgRlRfVVNob3J0ICAqbFs0XTsKLSAgICBGVF9VU2hvcnQgIGJ1ZmZbNV07Ci0KLSAgICBHWFZfa2Vybl9mbXQxX1N0YXRlT3B0UmVjRGF0YSAgb3B0ZGF0YSA9Ci0gICAgICAoR1hWX2tlcm5fZm10MV9TdGF0ZU9wdFJlY0RhdGEpZ3h2YWxpZC0+c3RhdGV0YWJsZS5vcHRkYXRhOwotCi0KLSAgICBvWzBdID0gY2xhc3NUYWJsZTsKLSAgICBvWzFdID0gc3RhdGVBcnJheTsKLSAgICBvWzJdID0gZW50cnlUYWJsZTsKLSAgICBvWzNdID0gb3B0ZGF0YS0+dmFsdWVUYWJsZTsKLSAgICBsWzBdID0gY2xhc3NUYWJsZV9sZW5ndGhfcDsKLSAgICBsWzFdID0gc3RhdGVBcnJheV9sZW5ndGhfcDsKLSAgICBsWzJdID0gZW50cnlUYWJsZV9sZW5ndGhfcDsKLSAgICBsWzNdID0gJihvcHRkYXRhLT52YWx1ZVRhYmxlX2xlbmd0aCk7Ci0KLSAgICBneHZfc2V0X2xlbmd0aF9ieV91c2hvcnRfb2Zmc2V0KCBvLCBsLCBidWZmLCA0LCB0YWJsZV9zaXplLCBneHZhbGlkICk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIHBhc3NlZCB0YWJsZSAmIGxpbWl0IGFyZSBvZiB3aG9sZSBTdGF0ZVRhYmxlLCBub3QgaW5jbHVkaW5nIHN1YnRhYmxlcwotICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2tlcm5fc3VidGFibGVfZm10MV9lbnRyeV92YWxpZGF0ZSgKLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgR1hWX1N0YXRlVGFibGVfR2x5cGhPZmZzZXRDUHRyICBnbHlwaE9mZnNldF9wLAotICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsCi0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCwKLSAgICBHWFZfVmFsaWRhdG9yICAgICAgICAgICAgICAgICAgIGd4dmFsaWQgKQotICB7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBGVF9VU2hvcnQgIHB1c2g7Ci0gICAgRlRfVVNob3J0ICBkb250QWR2YW5jZTsKLSNlbmRpZgotICAgIEZUX1VTaG9ydCAgdmFsdWVPZmZzZXQ7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBGVF9VU2hvcnQgIGtlcm5BY3Rpb247Ci0gICAgRlRfVVNob3J0ICBrZXJuVmFsdWU7Ci0jZW5kaWYKLQotICAgIEZUX1VOVVNFRCggc3RhdGUgKTsKLSAgICBGVF9VTlVTRUQoIGdseXBoT2Zmc2V0X3AgKTsKLQotCi0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBwdXNoICAgICAgICA9IChGVF9VU2hvcnQpKCAoIGZsYWdzID4+IDE1ICkgJiAxICAgICAgKTsKLSAgICBkb250QWR2YW5jZSA9IChGVF9VU2hvcnQpKCAoIGZsYWdzID4+IDE0ICkgJiAxICAgICAgKTsKLSNlbmRpZgotICAgIHZhbHVlT2Zmc2V0ID0gKEZUX1VTaG9ydCkoICAgZmxhZ3MgICAgICAgICAmIDB4M0ZGRiApOwotCi0gICAgewotICAgICAgR1hWX2tlcm5fZm10MV9TdGF0ZU9wdFJlY0RhdGEgIHZ0X3JlYyA9Ci0gICAgICAgIChHWFZfa2Vybl9mbXQxX1N0YXRlT3B0UmVjRGF0YSlneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGE7Ci0gICAgICBGVF9CeXRlcyAgcDsKLQotCi0gICAgICBpZiAoIHZhbHVlT2Zmc2V0IDwgdnRfcmVjLT52YWx1ZVRhYmxlICkKLSAgICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0KLSAgICAgIHAgICAgID0gdGFibGUgKyB2YWx1ZU9mZnNldDsKLSAgICAgIGxpbWl0ID0gdGFibGUgKyB2dF9yZWMtPnZhbHVlVGFibGUgKyB2dF9yZWMtPnZhbHVlVGFibGVfbGVuZ3RoOwotCi0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICk7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICAgIGtlcm5BY3Rpb24gPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAga2VyblZhbHVlICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDFfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICBwID0gdGFibGU7Ci0gICAgR1hWX2tlcm5fZm10MV9TdGF0ZU9wdFJlYyAgdnRfcmVjOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggImtlcm4gc3VidGFibGUgZm9ybWF0IDEiICk7Ci0KLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGEgPQotICAgICAgJnZ0X3JlYzsKLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGFfbG9hZF9mdW5jID0KLSAgICAgIGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDFfdmFsdWVUYWJsZV9sb2FkOwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUuc3VidGFibGVfc2V0dXBfZnVuYyA9Ci0gICAgICBneHZfa2Vybl9zdWJ0YWJsZV9mbXQxX3N1YnRhYmxlX3NldHVwOwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUuZW50cnlfZ2x5cGhvZmZzZXRfZm10ID0KLSAgICAgIEdYVl9HTFlQSE9GRlNFVF9OT05FOwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUuZW50cnlfdmFsaWRhdGVfZnVuYyA9Ci0gICAgICBneHZfa2Vybl9zdWJ0YWJsZV9mbXQxX2VudHJ5X3ZhbGlkYXRlOwotCi0gICAgZ3h2X1N0YXRlVGFibGVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyogPT09PT09PT09PT09PT09PSBEYXRhIGZvciBDbGFzcy1CYXNlZCBTdWJ0YWJsZXMgMiwgMyA9PT09PT09PT09PT09PT09ICovCi0KLSAgdHlwZWRlZiBlbnVtICBHWFZfa2Vybl9DbGFzc1NwZWNfCi0gIHsKLSAgICBHWFZfS0VSTl9DTFNfTCA9IDAsCi0gICAgR1hWX0tFUk5fQ0xTX1IKLQotICB9IEdYVl9rZXJuX0NsYXNzU3BlYzsKLQotCi0gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IGZvcm1hdCAyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZm9ybWF0IDIgc3BlY2lmaWMgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBHWFZfa2Vybl9zdWJ0YWJsZV9mbXQyX0RhdGFSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgICAgICAgICByb3dXaWR0aDsKLSAgICBGVF9VU2hvcnQgICAgICAgICBhcnJheTsKLSAgICBGVF9VU2hvcnQgICAgICAgICBvZmZzZXRfbWluWzJdOwotICAgIEZUX1VTaG9ydCAgICAgICAgIG9mZnNldF9tYXhbMl07Ci0gICAgY29uc3QgRlRfU3RyaW5nKiAgY2xhc3NfdGFnWzJdOwotICAgIEdYVl9vZHRlY3RfUmFuZ2UgIG9kdGVjdDsKLQotICB9IEdYVl9rZXJuX3N1YnRhYmxlX2ZtdDJfRGF0YVJlYywgKkdYVl9rZXJuX3N1YnRhYmxlX2ZtdDJfRGF0YTsKLQotCi0jZGVmaW5lIEdYVl9LRVJOX0ZNVDJfREFUQSggZmllbGQgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICggKCAoR1hWX2tlcm5fc3VidGFibGVfZm10Ml9EYXRhUmVjICopICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICggR1hWX0tFUk5fREFUQSggc3VidGFibGVfZGF0YSApICkgKS0+ZmllbGQgKQotCi0KLSAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdXRpbGl0eSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfa2Vybl9zdWJ0YWJsZV9mbXQyX2Nsc3RibF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfa2Vybl9DbGFzc1NwZWMgIHNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICAgICAgIGd4dmFsaWQgKQotICB7Ci0gICAgY29uc3QgRlRfU3RyaW5nKiAgdGFnICAgID0gR1hWX0tFUk5fRk1UMl9EQVRBKCBjbGFzc190YWdbc3BlY10gKTsKLSAgICBHWFZfb2R0ZWN0X1JhbmdlICBvZHRlY3QgPSBHWFZfS0VSTl9GTVQyX0RBVEEoIG9kdGVjdCApOwotCi0gICAgRlRfQnl0ZXMgICBwID0gdGFibGU7Ci0gICAgRlRfVVNob3J0ICBmaXJzdEdseXBoOwotICAgIEZUX1VTaG9ydCAgbkdseXBoczsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJrZXJuIGZvcm1hdCAyIGNsYXNzVGFibGUiICk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKyAyICk7Ci0gICAgZmlyc3RHbHlwaCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgbkdseXBocyAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgR1hWX1RSQUNFKCggIiAlcyBmaXJzdEdseXBoPSVkLCBuR2x5cGhzPSVkXG4iLAotICAgICAgICAgICAgICAgIHRhZywgZmlyc3RHbHlwaCwgbkdseXBocyApKTsKLQotICAgIGd4dl9nbHlwaGlkX3ZhbGlkYXRlKCBmaXJzdEdseXBoLCBneHZhbGlkICk7Ci0gICAgZ3h2X2dseXBoaWRfdmFsaWRhdGUoIChGVF9VU2hvcnQpKCBmaXJzdEdseXBoICsgbkdseXBocyAtIDEgKSwgZ3h2YWxpZCApOwotCi0gICAgZ3h2X2FycmF5X2dldGxpbWl0c191c2hvcnQoIHAsIHAgKyAoIDIgKiBuR2x5cGhzICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoIEdYVl9LRVJOX0ZNVDJfREFUQSggb2Zmc2V0X21pbltzcGVjXSApICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoIEdYVl9LRVJOX0ZNVDJfREFUQSggb2Zmc2V0X21heFtzcGVjXSApICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQgKTsKLQotICAgIGd4dl9vZHRlY3RfYWRkX3JhbmdlKCB0YWJsZSwgMiAqIG5HbHlwaHMsIHRhZywgb2R0ZWN0ICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2tlcm5fc3VidGFibGVfZm10Ml92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEdYVl9PRFRFQ1QoIDMsIG9kdGVjdCApOwotICAgIEdYVl9rZXJuX3N1YnRhYmxlX2ZtdDJfRGF0YVJlYyAgZm10Ml9yZWMgPQotICAgICAgeyAwLCAwLCB7IDAsIDAgfSwgeyAwLCAwIH0sIHsgImxlZnRDbGFzcyIsICJyaWdodENsYXNzIiB9LCBOVUxMIH07Ci0KLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZSArIEdYVl9LRVJOX1NVQlRBQkxFX0hFQURFUl9TSVpFOwotICAgIEZUX1VTaG9ydCAgbGVmdE9mZnNldFRhYmxlOwotICAgIEZUX1VTaG9ydCAgcmlnaHRPZmZzZXRUYWJsZTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJrZXJuIHN1YnRhYmxlIGZvcm1hdCAyIiApOwotCi0gICAgR1hWX09EVEVDVF9JTklUKCBvZHRlY3QgKTsKLSAgICBmbXQyX3JlYy5vZHRlY3QgPSBvZHRlY3Q7Ci0gICAgR1hWX0tFUk5fREFUQSggc3VidGFibGVfZGF0YSApID0gJmZtdDJfcmVjOwotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCAyICsgMiArIDIgKyAyICk7Ci0gICAgR1hWX0tFUk5fRk1UMl9EQVRBKCByb3dXaWR0aCApID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBsZWZ0T2Zmc2V0VGFibGUgICAgICAgICAgICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIHJpZ2h0T2Zmc2V0VGFibGUgICAgICAgICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgR1hWX0tFUk5fRk1UMl9EQVRBKCBhcnJheSApICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIEdYVl9UUkFDRSgoICJyb3dXaWR0aCA9ICVkXG4iLCBHWFZfS0VSTl9GTVQyX0RBVEEoIHJvd1dpZHRoICkgKSk7Ci0KLQotICAgIEdYVl9MSU1JVF9DSEVDSyggbGVmdE9mZnNldFRhYmxlICk7Ci0gICAgR1hWX0xJTUlUX0NIRUNLKCByaWdodE9mZnNldFRhYmxlICk7Ci0gICAgR1hWX0xJTUlUX0NIRUNLKCBHWFZfS0VSTl9GTVQyX0RBVEEoIGFycmF5ICkgKTsKLQotICAgIGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDJfY2xzdGJsX3ZhbGlkYXRlKCB0YWJsZSArIGxlZnRPZmZzZXRUYWJsZSwgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9LRVJOX0NMU19MLCBneHZhbGlkICk7Ci0KLSAgICBneHZfa2Vybl9zdWJ0YWJsZV9mbXQyX2Nsc3RibF92YWxpZGF0ZSggdGFibGUgKyByaWdodE9mZnNldFRhYmxlLCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0tFUk5fQ0xTX1IsIGd4dmFsaWQgKTsKLQotICAgIGlmICggR1hWX0tFUk5fRk1UMl9EQVRBKCBvZmZzZXRfbWluW0dYVl9LRVJOX0NMU19MXSApICsKLSAgICAgICAgICAgR1hWX0tFUk5fRk1UMl9EQVRBKCBvZmZzZXRfbWluW0dYVl9LRVJOX0NMU19SXSApCi0gICAgICAgICA8IEdYVl9LRVJOX0ZNVDJfREFUQSggYXJyYXkgKSAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICBGVF9JTlZBTElEX09GRlNFVDsKLQotICAgIGd4dl9vZHRlY3RfYWRkX3JhbmdlKCB0YWJsZSArIEdYVl9LRVJOX0ZNVDJfREFUQSggYXJyYXkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0tFUk5fRk1UMl9EQVRBKCBvZmZzZXRfbWF4W0dYVl9LRVJOX0NMU19MXSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBHWFZfS0VSTl9GTVQyX0RBVEEoIG9mZnNldF9tYXhbR1hWX0tFUk5fQ0xTX1JdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEdYVl9LRVJOX0ZNVDJfREFUQSggYXJyYXkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5Iiwgb2R0ZWN0ICk7Ci0KLSAgICBneHZfb2R0ZWN0X3ZhbGlkYXRlKCBvZHRlY3QsIGd4dmFsaWQgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBmb3JtYXQgMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfa2Vybl9zdWJ0YWJsZV9mbXQzX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICBwID0gdGFibGUgKyBHWFZfS0VSTl9TVUJUQUJMRV9IRUFERVJfU0laRTsKLSAgICBGVF9VU2hvcnQgIGdseXBoQ291bnQ7Ci0gICAgRlRfQnl0ZSAgICBrZXJuVmFsdWVDb3VudDsKLSAgICBGVF9CeXRlICAgIGxlZnRDbGFzc0NvdW50OwotICAgIEZUX0J5dGUgICAgcmlnaHRDbGFzc0NvdW50OwotICAgIEZUX0J5dGUgICAgZmxhZ3M7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAia2VybiBzdWJ0YWJsZSBmb3JtYXQgMyIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiArIDEgKyAxICsgMSArIDEgKTsKLSAgICBnbHlwaENvdW50ICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGtlcm5WYWx1ZUNvdW50ICA9IEZUX05FWFRfQllURSggcCApOwotICAgIGxlZnRDbGFzc0NvdW50ICA9IEZUX05FWFRfQllURSggcCApOwotICAgIHJpZ2h0Q2xhc3NDb3VudCA9IEZUX05FWFRfQllURSggcCApOwotICAgIGZsYWdzICAgICAgICAgICA9IEZUX05FWFRfQllURSggcCApOwotCi0gICAgaWYgKCBneHZhbGlkLT5mYWNlLT5udW1fZ2x5cGhzICE9IGdseXBoQ291bnQgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICJtYXhHSUQ9JWQsIGJ1dCBnbHlwaENvdW50PSVkXG4iLAotICAgICAgICAgICAgICAgICAgZ3h2YWxpZC0+ZmFjZS0+bnVtX2dseXBocywgZ2x5cGhDb3VudCApKTsKLSAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0dMWVBIX0lEICk7Ci0gICAgfQotCi0gICAgaWYgKCBmbGFncyAhPSAwICkKLSAgICAgIEdYVl9UUkFDRSgoICJrZXJuIHN1YnRhYmxlIGZtdDMgaGFzIG5vbnplcm8gdmFsdWUiCi0gICAgICAgICAgICAgICAgICAiICglZCkgaW4gdW51c2VkIGZsYWdcbiIsIGZsYWdzICkpOwotICAgIC8qCi0gICAgICoganVzdCBza2lwIGtlcm5WYWx1ZVtrZXJuVmFsdWVDb3VudF0KLSAgICAgKi8KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKiBrZXJuVmFsdWVDb3VudCApOwotICAgIHAgKz0gMiAqIGtlcm5WYWx1ZUNvdW50OwotCi0gICAgLyoKLSAgICAgKiBjaGVjayBsZWZ0Q2xhc3NbZ2lkXSA8IGxlZnRDbGFzc0NvdW50Ci0gICAgICovCi0gICAgewotICAgICAgRlRfQnl0ZSAgbWluLCBtYXg7Ci0KLQotICAgICAgR1hWX0xJTUlUX0NIRUNLKCBnbHlwaENvdW50ICk7Ci0gICAgICBneHZfYXJyYXlfZ2V0bGltaXRzX2J5dGUoIHAsIHAgKyBnbHlwaENvdW50LCAmbWluLCAmbWF4LCBneHZhbGlkICk7Ci0gICAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLQotICAgICAgaWYgKCBsZWZ0Q2xhc3NDb3VudCA8IG1heCApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNoZWNrIHJpZ2h0Q2xhc3NbZ2lkXSA8IHJpZ2h0Q2xhc3NDb3VudAotICAgICAqLwotICAgIHsKLSAgICAgIEZUX0J5dGUgIG1pbiwgbWF4OwotCi0KLSAgICAgIEdYVl9MSU1JVF9DSEVDSyggZ2x5cGhDb3VudCApOwotICAgICAgZ3h2X2FycmF5X2dldGxpbWl0c19ieXRlKCBwLCBwICsgZ2x5cGhDb3VudCwgJm1pbiwgJm1heCwgZ3h2YWxpZCApOwotICAgICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0KLSAgICAgIGlmICggcmlnaHRDbGFzc0NvdW50IDwgbWF4ICkKLSAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2hlY2sga2VybkluZGV4W2ksIGpdIDwga2VyblZhbHVlQ291bnQKLSAgICAgKi8KLSAgICB7Ci0gICAgICBGVF9VU2hvcnQgIGksIGo7Ci0KLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBsZWZ0Q2xhc3NDb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCByaWdodENsYXNzQ291bnQ7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBHWFZfTElNSVRfQ0hFQ0soIDEgKTsKLSAgICAgICAgICBpZiAoIGtlcm5WYWx1ZUNvdW50IDwgRlRfTkVYVF9CWVRFKCBwICkgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBneHZfa2Vybl9jb3ZlcmFnZV9uZXdfYXBwbGVfdmFsaWRhdGUoIEZUX1VTaG9ydCAgICAgIGNvdmVyYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIC8qIG5ldyBBcHBsZS1kaWFsZWN0ICovCi0jaWZkZWYgR1hWX0xPQURfVFJBQ0VfVkFSUwotICAgIEZUX0Jvb2wgIGtlcm5WZXJ0aWNhbDsKLSAgICBGVF9Cb29sICBrZXJuQ3Jvc3NTdHJlYW07Ci0gICAgRlRfQm9vbCAga2VyblZhcmlhdGlvbjsKLSNlbmRpZgotCi0gICAgRlRfVU5VU0VEKCBneHZhbGlkICk7Ci0KLQotICAgIC8qIHJlc2VydmVkIGJpdHMgPSAwICovCi0gICAgaWYgKCBjb3ZlcmFnZSAmIDB4MUZGQyApCi0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSNpZmRlZiBHWFZfTE9BRF9UUkFDRV9WQVJTCi0gICAga2VyblZlcnRpY2FsICAgID0gRlRfQk9PTCggKCBjb3ZlcmFnZSA+PiAxNSApICYgMSApOwotICAgIGtlcm5Dcm9zc1N0cmVhbSA9IEZUX0JPT0woICggY292ZXJhZ2UgPj4gMTQgKSAmIDEgKTsKLSAgICBrZXJuVmFyaWF0aW9uICAgPSBGVF9CT09MKCAoIGNvdmVyYWdlID4+IDEzICkgJiAxICk7Ci0jZW5kaWYKLQotICAgICpmb3JtYXQgPSAoRlRfVVNob3J0KSggY292ZXJhZ2UgJiAweDAwMDMgKTsKLQotICAgIEdYVl9UUkFDRSgoICJuZXcgQXBwbGUtZGlhbGVjdDogIgotICAgICAgICAgICAgICAgICJob3Jpem9udGFsPSVkLCBjcm9zcy1zdHJlYW09JWQsIHZhcmlhdGlvbj0lZCwgZm9ybWF0PSVkXG4iLAotICAgICAgICAgICAgICAgICAha2VyblZlcnRpY2FsLCBrZXJuQ3Jvc3NTdHJlYW0sIGtlcm5WYXJpYXRpb24sICpmb3JtYXQgKSk7Ci0KLSAgICBHWFZfVFJBQ0UoKCAia2VybmluZyB2YWx1ZXMgaW4gQXBwbGUgZm9ybWF0IHN1YnRhYmxlIGFyZSBpZ25vcmVkXG4iICkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGd4dl9rZXJuX2NvdmVyYWdlX2NsYXNzaWNfYXBwbGVfdmFsaWRhdGUoIEZUX1VTaG9ydCAgICAgIGNvdmVyYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgLyogY2xhc3NpYyBBcHBsZS1kaWFsZWN0ICovCi0jaWZkZWYgR1hWX0xPQURfVFJBQ0VfVkFSUwotICAgIEZUX0Jvb2wgIGhvcml6b250YWw7Ci0gICAgRlRfQm9vbCAgY3Jvc3Nfc3RyZWFtOwotI2VuZGlmCi0KLQotICAgIC8qIGNoZWNrIGV4cGVjdGVkIGZsYWdzLCBidXQgZG9uJ3QgY2hlY2sgaWYgTVMtZGlhbGVjdCBpcyBpbXBvc3NpYmxlICovCi0gICAgaWYgKCAhKCBjb3ZlcmFnZSAmIDB4RkQwMCApICYmIEtFUk5fQUxMT1dTX01TKCBneHZhbGlkICkgKQotICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLyogcmVzZXJ2ZWQgYml0cyA9IDAgKi8KLSAgICBpZiAoIGNvdmVyYWdlICYgMHgwMkZDICkKLSAgICAgIHJldHVybiBGQUxTRTsKLQotI2lmZGVmIEdYVl9MT0FEX1RSQUNFX1ZBUlMKLSAgICBob3Jpem9udGFsICAgPSBGVF9CT09MKCAoIGNvdmVyYWdlID4+IDE1ICkgJiAxICk7Ci0gICAgY3Jvc3Nfc3RyZWFtID0gRlRfQk9PTCggKCBjb3ZlcmFnZSA+PiAxMyApICYgMSApOwotI2VuZGlmCi0KLSAgICAqZm9ybWF0ID0gKEZUX1VTaG9ydCkoIGNvdmVyYWdlICYgMHgwMDAzICk7Ci0KLSAgICBHWFZfVFJBQ0UoKCAiY2xhc3NpYyBBcHBsZS1kaWFsZWN0OiAiCi0gICAgICAgICAgICAgICAgImhvcml6b250YWw9JWQsIGNyb3NzLXN0cmVhbT0lZCwgZm9ybWF0PSVkXG4iLAotICAgICAgICAgICAgICAgICBob3Jpem9udGFsLCBjcm9zc19zdHJlYW0sICpmb3JtYXQgKSk7Ci0KLSAgICAvKiBmb3JtYXQgMSByZXF1aXJlcyBHWCBTdGF0ZSBNYWNoaW5lLCB0b28gbmV3IGZvciBjbGFzc2ljICovCi0gICAgaWYgKCAqZm9ybWF0ID09IDEgKQotICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgR1hWX1RSQUNFKCggImtlcm5pbmcgdmFsdWVzIGluIEFwcGxlIGZvcm1hdCBzdWJ0YWJsZSBhcmUgaWdub3JlZFxuIiApKTsKLQotICAgIHJldHVybiBUUlVFOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBneHZfa2Vybl9jb3ZlcmFnZV9jbGFzc2ljX21pY3Jvc29mdF92YWxpZGF0ZSggRlRfVVNob3J0ICAgICAgY292ZXJhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIC8qIGNsYXNzaWMgTWljcm9zb2Z0LWRpYWxlY3QgKi8KLSNpZmRlZiBHWFZfTE9BRF9UUkFDRV9WQVJTCi0gICAgRlRfQm9vbCAgaG9yaXpvbnRhbDsKLSAgICBGVF9Cb29sICBtaW5pbXVtOwotICAgIEZUX0Jvb2wgIGNyb3NzX3N0cmVhbTsKLSAgICBGVF9Cb29sICBvdmVycmlkZTsKLSNlbmRpZgotCi0gICAgRlRfVU5VU0VEKCBneHZhbGlkICk7Ci0KLQotICAgIC8qIHJlc2VydmVkIGJpdHMgPSAwICovCi0gICAgaWYgKCBjb3ZlcmFnZSAmIDB4RkRGMCApCi0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSNpZmRlZiBHWFZfTE9BRF9UUkFDRV9WQVJTCi0gICAgaG9yaXpvbnRhbCAgID0gRlRfQk9PTCggICBjb3ZlcmFnZSAgICAgICAgJiAxICk7Ci0gICAgbWluaW11bSAgICAgID0gRlRfQk9PTCggKCBjb3ZlcmFnZSA+PiAxICkgJiAxICk7Ci0gICAgY3Jvc3Nfc3RyZWFtID0gRlRfQk9PTCggKCBjb3ZlcmFnZSA+PiAyICkgJiAxICk7Ci0gICAgb3ZlcnJpZGUgICAgID0gRlRfQk9PTCggKCBjb3ZlcmFnZSA+PiAzICkgJiAxICk7Ci0jZW5kaWYKLQotICAgICpmb3JtYXQgPSAoRlRfVVNob3J0KSggKCBjb3ZlcmFnZSA+PiA4ICkgJiAweDAwMDMgKTsKLQotICAgIEdYVl9UUkFDRSgoICJjbGFzc2ljIE1pY3Jvc29mdC1kaWFsZWN0OiAiCi0gICAgICAgICAgICAgICAgImhvcml6b250YWw9JWQsIG1pbmltdW09JWQsIGNyb3NzLXN0cmVhbT0lZCwgIgotICAgICAgICAgICAgICAgICJvdmVycmlkZT0lZCwgZm9ybWF0PSVkXG4iLAotICAgICAgICAgICAgICAgIGhvcml6b250YWwsIG1pbmltdW0sIGNyb3NzX3N0cmVhbSwgb3ZlcnJpZGUsICpmb3JtYXQgKSk7Ci0KLSAgICBpZiAoICpmb3JtYXQgPT0gMiApCi0gICAgICBHWFZfVFJBQ0UoKAotICAgICAgICAia2VybmluZyB2YWx1ZXMgaW4gTWljcm9zb2Z0IGZvcm1hdCAyIHN1YnRhYmxlIGFyZSBpZ25vcmVkXG4iICkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyBHWFZfa2Vybl9EaWFsZWN0Ci0gIGd4dl9rZXJuX2NvdmVyYWdlX3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICBjb3ZlcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgR1hWX2tlcm5fRGlhbGVjdCAgcmVzdWx0ID0gS0VSTl9ESUFMRUNUX1VOS05PV047Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAidmFsaWRhdGluZyBjb3ZlcmFnZSIgKTsKLQotICAgIEdYVl9UUkFDRSgoICJpbnRlcnByZXQgY292ZXJhZ2UgMHglMDR4IGJ5IEFwcGxlIHN0eWxlXG4iLCBjb3ZlcmFnZSApKTsKLQotICAgIGlmICggS0VSTl9JU19ORVcoIGd4dmFsaWQgKSApCi0gICAgewotICAgICAgaWYgKCBneHZfa2Vybl9jb3ZlcmFnZV9uZXdfYXBwbGVfdmFsaWRhdGUoIGNvdmVyYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICkgKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBLRVJOX0RJQUxFQ1RfQVBQTEU7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIEtFUk5fSVNfQ0xBU1NJQyggZ3h2YWxpZCApICYmIEtFUk5fQUxMT1dTX0FQUExFKCBneHZhbGlkICkgKQotICAgIHsKLSAgICAgIGlmICggZ3h2X2tlcm5fY292ZXJhZ2VfY2xhc3NpY19hcHBsZV92YWxpZGF0ZSggY292ZXJhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gS0VSTl9ESUFMRUNUX0FQUExFOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBLRVJOX0lTX0NMQVNTSUMoIGd4dmFsaWQgKSAmJiBLRVJOX0FMTE9XU19NUyggZ3h2YWxpZCApICkKLSAgICB7Ci0gICAgICBpZiAoIGd4dl9rZXJuX2NvdmVyYWdlX2NsYXNzaWNfbWljcm9zb2Z0X3ZhbGlkYXRlKCBjb3ZlcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQgKSApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEtFUk5fRElBTEVDVF9NUzsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgIH0KLQotICAgIEdYVl9UUkFDRSgoICJjYW5ub3QgaW50ZXJwcmV0IGNvdmVyYWdlLCBicm9rZW4ga2VybiBzdWJ0YWJsZVxuIiApKTsKLQotICBFeGl0OgotICAgIEdYVl9FWElUOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9rZXJuX3N1YnRhYmxlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSNpZmRlZiBHWFZfTE9BRF9UUkFDRV9WQVJTCi0gICAgRlRfVVNob3J0ICB2ZXJzaW9uID0gMDsgICAgLyogTVMgb25seTogc3VidGFibGUgdmVyc2lvbiwgdW51c2VkICovCi0jZW5kaWYKLSAgICBGVF9VTG9uZyAgIGxlbmd0aDsgICAgICAgICAvKiBNUzogMTZiaXQsIEFwcGxlOiAzMmJpdCovCi0gICAgRlRfVVNob3J0ICBjb3ZlcmFnZTsKLSNpZmRlZiBHWFZfTE9BRF9UUkFDRV9WQVJTCi0gICAgRlRfVVNob3J0ICB0dXBsZUluZGV4ID0gMDsgLyogQXBwbGUgb25seSAqLwotI2VuZGlmCi0gICAgRlRfVVNob3J0ICB1MTZbMl07Ci0gICAgRlRfVVNob3J0ICBmb3JtYXQgPSAyNTU7ICAgLyogc3VidGFibGUgZm9ybWF0ICovCi0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAia2VybiBzdWJ0YWJsZSIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiArIDIgKyAyICk7Ci0gICAgdTE2WzBdICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOyAvKiBBcHBsZTogbGVuZ3RoX2hpIE1TOiB2ZXJzaW9uICovCi0gICAgdTE2WzFdICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOyAvKiBBcHBsZTogbGVuZ3RoX2xvIE1TOiBsZW5ndGggKi8KLSAgICBjb3ZlcmFnZSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBzd2l0Y2ggKCBneHZfa2Vybl9jb3ZlcmFnZV92YWxpZGF0ZSggY292ZXJhZ2UsICZmb3JtYXQsIGd4dmFsaWQgKSApCi0gICAgewotICAgIGNhc2UgS0VSTl9ESUFMRUNUX01TOgotI2lmZGVmIEdYVl9MT0FEX1RSQUNFX1ZBUlMKLSAgICAgIHZlcnNpb24gICAgPSB1MTZbMF07Ci0jZW5kaWYKLSAgICAgIGxlbmd0aCAgICAgPSB1MTZbMV07Ci0jaWZkZWYgR1hWX0xPQURfVFJBQ0VfVkFSUwotICAgICAgdHVwbGVJbmRleCA9IDA7Ci0jZW5kaWYKLSAgICAgIEdYVl9UUkFDRSgoICJTdWJ0YWJsZSB2ZXJzaW9uID0gJWRcbiIsIHZlcnNpb24gKSk7Ci0gICAgICBHWFZfVFJBQ0UoKCAiU3VidGFibGUgbGVuZ3RoID0gJWRcbiIsIGxlbmd0aCApKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBLRVJOX0RJQUxFQ1RfQVBQTEU6Ci0jaWZkZWYgR1hWX0xPQURfVFJBQ0VfVkFSUwotICAgICAgdmVyc2lvbiAgICA9IDA7Ci0jZW5kaWYKLSAgICAgIGxlbmd0aCAgICAgPSAoIChGVF9VTG9uZyl1MTZbMF0gPDwgMTYgKSArIHUxNlsxXTsKLSNpZmRlZiBHWFZfTE9BRF9UUkFDRV9WQVJTCi0gICAgICB0dXBsZUluZGV4ID0gMDsKLSNlbmRpZgotICAgICAgR1hWX1RSQUNFKCggIlN1YnRhYmxlIGxlbmd0aCA9ICVkXG4iLCBsZW5ndGggKSk7Ci0KLSAgICAgIGlmICggS0VSTl9JU19ORVcoIGd4dmFsaWQgKSApCi0gICAgICB7Ci0gICAgICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotI2lmZGVmIEdYVl9MT0FEX1RSQUNFX1ZBUlMKLSAgICAgICAgdHVwbGVJbmRleCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0jZWxzZQotICAgICAgICBwICs9IDI7Ci0jZW5kaWYKLSAgICAgICAgR1hWX1RSQUNFKCggIlN1YnRhYmxlIHR1cGxlSW5kZXggPSAlZFxuIiwgdHVwbGVJbmRleCApKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGxlbmd0aCA9IHUxNlsxXTsKLSAgICAgIEdYVl9UUkFDRSgoICJjYW5ub3QgZGV0ZWN0IHN1YnRhYmxlIGRpYWxlY3QsICIKLSAgICAgICAgICAgICAgICAgICJqdXN0IHNraXAgJWQgYnl0ZVxuIiwgbGVuZ3RoICkpOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGZvcm1hdHMgMSwgMiwgMyByZXF1aXJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhpcyBzdWJ0YWJsZSAqLwotICAgIGlmICggZm9ybWF0ID09IDAgKQotICAgICAgZ3h2X2tlcm5fc3VidGFibGVfZm10MF92YWxpZGF0ZSggdGFibGUsIHRhYmxlICsgbGVuZ3RoLCBneHZhbGlkICk7Ci0gICAgZWxzZSBpZiAoIGZvcm1hdCA9PSAxICkKLSAgICAgIGd4dl9rZXJuX3N1YnRhYmxlX2ZtdDFfdmFsaWRhdGUoIHRhYmxlLCB0YWJsZSArIGxlbmd0aCwgZ3h2YWxpZCApOwotICAgIGVsc2UgaWYgKCBmb3JtYXQgPT0gMiApCi0gICAgICBneHZfa2Vybl9zdWJ0YWJsZV9mbXQyX3ZhbGlkYXRlKCB0YWJsZSwgdGFibGUgKyBsZW5ndGgsIGd4dmFsaWQgKTsKLSAgICBlbHNlIGlmICggZm9ybWF0ID09IDMgKQotICAgICAgZ3h2X2tlcm5fc3VidGFibGVfZm10M192YWxpZGF0ZSggdGFibGUsIHRhYmxlICsgbGVuZ3RoLCBneHZhbGlkICk7Ci0gICAgZWxzZQotICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gIEV4aXQ6Ci0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gbGVuZ3RoOwotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAga2VybiBUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfa2Vybl92YWxpZGF0ZV9nZW5lcmljKCBGVF9CeXRlcyAgICAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgY2xhc3NpY19vbmx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfa2Vybl9EaWFsZWN0ICBkaWFsZWN0X3JlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgICAgIGZ0dmFsaWQgKQotICB7Ci0gICAgR1hWX1ZhbGlkYXRvclJlYyAgIGd4dmFsaWRyZWM7Ci0gICAgR1hWX1ZhbGlkYXRvciAgICAgIGd4dmFsaWQgPSAmZ3h2YWxpZHJlYzsKLQotICAgIEdYVl9rZXJuX0RhdGFSZWMgICBrZXJucmVjOwotICAgIEdYVl9rZXJuX0RhdGEgICAgICBrZXJuID0gJmtlcm5yZWM7Ci0KLSAgICBGVF9CeXRlcyAgICAgICAgICAgcCAgICAgPSB0YWJsZTsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgbGltaXQgPSAwOwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgIG5UYWJsZXMgPSAwOwotICAgIEZUX1VJbnQgICAgICAgICAgICBpOwotCi0KLSAgICBneHZhbGlkLT5yb290ICAgICAgID0gZnR2YWxpZDsKLSAgICBneHZhbGlkLT50YWJsZV9kYXRhID0ga2VybjsKLSAgICBneHZhbGlkLT5mYWNlICAgICAgID0gZmFjZTsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIGBrZXJuJyB0YWJsZVxuIiApKTsKLSAgICBHWFZfSU5JVDsKLSAgICBLRVJOX0RJQUxFQ1QoIGd4dmFsaWQgKSA9IGRpYWxlY3RfcmVxdWVzdDsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotICAgIEdYVl9LRVJOX0RBVEEoIHZlcnNpb24gKSA9IChHWFZfa2Vybl9WZXJzaW9uKUZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgR1hWX1RSQUNFKCggInZlcnNpb24gMHglMDR4IChoaWdoZXIgMTZiaXQpXG4iLAotICAgICAgICAgICAgICAgIEdYVl9LRVJOX0RBVEEoIHZlcnNpb24gKSApKTsKLQotICAgIGlmICggMHgwMDAxIDwgR1hWX0tFUk5fREFUQSggdmVyc2lvbiApICkKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotICAgIGVsc2UgaWYgKCBLRVJOX0lTX0NMQVNTSUMoIGd4dmFsaWQgKSApCi0gICAgewotICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICBuVGFibGVzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIEtFUk5fSVNfTkVXKCBneHZhbGlkICkgKQotICAgIHsKLSAgICAgIGlmICggY2xhc3NpY19vbmx5ICkKLSAgICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICAgIGlmICggMHgwMDAwICE9IEZUX05FWFRfVVNIT1JUKCBwICkgKQotICAgICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgICAgR1hWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgICBuVGFibGVzID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgblRhYmxlczsgaSsrICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAidmFsaWRhdGluZyBzdWJ0YWJsZSAlZC8lZFxuIiwgaSwgblRhYmxlcyApKTsKLSAgICAgIC8qIHAgc2hvdWxkIGJlIDMyYml0LWFsaWduZWQ/ICovCi0gICAgICBneHZfa2Vybl9zdWJ0YWJsZV92YWxpZGF0ZSggcCwgMCwgZ3h2YWxpZCApOwotICAgICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X2tlcm5fdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIGZ0dmFsaWQgKQotICB7Ci0gICAgZ3h2X2tlcm5fdmFsaWRhdGVfZ2VuZXJpYyggdGFibGUsIGZhY2UsIDAsIEtFUk5fRElBTEVDVF9BTlksIGZ0dmFsaWQgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X2tlcm5fdmFsaWRhdGVfY2xhc3NpYyggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGRpYWxlY3RfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgZnR2YWxpZCApCi0gIHsKLSAgICBHWFZfa2Vybl9EaWFsZWN0ICBkaWFsZWN0X3JlcXVlc3Q7Ci0KLQotICAgIGRpYWxlY3RfcmVxdWVzdCA9IChHWFZfa2Vybl9EaWFsZWN0KWRpYWxlY3RfZmxhZ3M7Ci0gICAgZ3h2X2tlcm5fdmFsaWRhdGVfZ2VuZXJpYyggdGFibGUsIGZhY2UsIDEsIGRpYWxlY3RfcmVxdWVzdCwgZnR2YWxpZCApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZsY2FyLmMgYi9zcmMvZ3h2YWxpZC9neHZsY2FyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NWQ1MjIuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bGNhci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmxjYXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBsY2FyIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZhbGlkLmgiCi0jaW5jbHVkZSAiZ3h2Y29tbW4uaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dmxjYXIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBEYXRhIGFuZCBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBHWFZfbGNhcl9EYXRhUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICBmb3JtYXQ7Ci0KLSAgfSBHWFZfbGNhcl9EYXRhUmVjLCAqR1hWX2xjYXJfRGF0YTsKLQotCi0jZGVmaW5lIEdYVl9MQ0FSX0RBVEEoIEZJRUxEICkgIEdYVl9UQUJMRV9EQVRBKCBsY2FyLCBGSUVMRCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgVVRJTElUWSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfbGNhcl9wYXJ0aWFsX3ZhbGlkYXRlKCBGVF9TaG9ydCAgICAgICBwYXJ0aWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBHWFZfTkFNRV9FTlRFUiggInBhcnRpYWwiICk7Ci0KLSAgICBpZiAoIEdYVl9MQ0FSX0RBVEEoIGZvcm1hdCApICE9IDEgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ3h2X2N0bFBvaW50X3ZhbGlkYXRlKCBnbHlwaCwgKEZUX1VTaG9ydClwYXJ0aWFsLCBneHZhbGlkICk7Ci0KLSAgRXhpdDoKLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X2xjYXJfTG9va3VwVmFsdWVfdmFsaWRhdGUoIEZUX1VTaG9ydCAgICAgICAgICAgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0xvb2t1cFZhbHVlQ1B0ciAgdmFsdWVfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgICAgICAgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICBwICAgICA9IGd4dmFsaWQtPnJvb3QtPmJhc2UgKyB2YWx1ZV9wLT51OwotICAgIEZUX0J5dGVzICAgbGltaXQgPSBneHZhbGlkLT5yb290LT5saW1pdDsKLSAgICBGVF9VU2hvcnQgIGNvdW50OwotICAgIEZUX1Nob3J0ICAgcGFydGlhbDsKLSAgICBGVF9VU2hvcnQgIGk7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAiZWxlbWVudCBpbiBsb29rdXBUYWJsZSIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotICAgIGNvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiAqIGNvdW50ICk7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBwYXJ0aWFsID0gRlRfTkVYVF9TSE9SVCggcCApOwotICAgICAgZ3h2X2xjYXJfcGFydGlhbF92YWxpZGF0ZSggcGFydGlhbCwgZ2x5cGgsIGd4dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyoKLSAgICArLS0tLS0tIGxjYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgIHwgICAgICArPT09PT09PT09PT09PT09KyAgICAgICAgIHwKLSAgICB8ICAgICAgfCBsb29rdXAgaGVhZGVyIHwgICAgICAgICB8Ci0gICAgfCAgICAgICs9PT09PT09PT09PT09PT0rICAgICAgICAgfAotICAgIHwgICAgICB8IEJpblNyY2hIZWFkZXIgfCAgICAgICAgIHwKLSAgICB8ICAgICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCAgICAgIHwgbGFzdEdseXBoWzBdICB8ICAgICAgICAgfAotICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgIHwKLSAgICB8ICAgICAgfCBmaXJzdEdseXBoWzBdIHwgICAgICAgICB8ICBoZWFkIG9mIGxjYXIgc2ZudCB0YWJsZQotICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgICAgICAgKwotICAgIHwgICAgICB8IG9mZnNldFswXSAgICAgfCAgICAtPiAgIHwgICAgICAgICAgb2Zmc2V0ICAgICAgICAgICAgW2J5dGVdCi0gICAgfCAgICAgICs9PT09PT09PT09PT09PT0rICAgICAgICAgfCAgICAgICAgICAgICArCi0gICAgfCAgICAgIHwgbGFzdEdseXBoWzFdICB8ICAgICAgICAgfCAoZ2x5cGhJRCAtIGZpcnN0R2x5cGgpICogMiBbYnl0ZV0KLSAgICB8ICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCAgICAgIHwgZmlyc3RHbHlwaFsxXSB8ICAgICAgICAgfAotICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgIHwKLSAgICB8ICAgICAgfCBvZmZzZXRbMV0gICAgIHwgICAgICAgICB8Ci0gICAgfCAgICAgICs9PT09PT09PT09PT09PT0rICAgICAgICAgfAotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICB8ICAgICAgIC4uLi4gICAgICAgICAgICAgICAgICAgICB8Ci0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgIHwgICAgICAxNmJpdCB2YWx1ZSBhcnJheSAgICAgICAgIHwKLSAgICB8ICAgICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgKy0tLS0tLXwgICAgIHZhbHVlICAgICB8IDwtLS0tLS0tKwotICAgIHwgICAgICAgLi4uLgotICAgIHwKLSAgICB8Ci0gICAgfAotICAgIHwKLSAgICB8Ci0gICAgKy0tLS0+ICBsY2FyIHZhbHVlcy4uLmhhbmRsZWQgYnkgbGNhciBjYWxsYmFjayBmdW5jdGlvbgotICAqLwotCi0gIHN0YXRpYyBHWFZfTG9va3VwVmFsdWVEZXNjCi0gIGd4dl9sY2FyX0xvb2t1cEZtdDRfdHJhbnNpdCggRlRfVVNob3J0ICAgICAgICAgICAgcmVsYXRpdmVfZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9Mb29rdXBWYWx1ZUNQdHIgIGJhc2VfdmFsdWVfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICAgICBsb29rdXB0YmxfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBwOwotICAgIEZUX0J5dGVzICAgICAgICAgICAgIGxpbWl0OwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIG9mZnNldDsKLSAgICBHWFZfTG9va3VwVmFsdWVEZXNjICB2YWx1ZTsKLQotICAgIEZUX1VOVVNFRCggbG9va3VwdGJsX2xpbWl0ICk7Ci0KLSAgICAvKiBYWFg6IGNoZWNrIHJhbmdlPyAqLwotICAgIG9mZnNldCA9IChGVF9VU2hvcnQpKCBiYXNlX3ZhbHVlX3AtPnUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZV9naW5kZXggKiBzaXplb2YgKCBGVF9VU2hvcnQgKSApOwotICAgIHAgICAgICA9IGd4dmFsaWQtPnJvb3QtPmJhc2UgKyBvZmZzZXQ7Ci0gICAgbGltaXQgID0gZ3h2YWxpZC0+cm9vdC0+bGltaXQ7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0sgKCAyICk7Ci0gICAgdmFsdWUudSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGNhciBUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9sY2FyX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICBmdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgICAgICAgIHAgICAgID0gdGFibGU7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgbGltaXQgPSAwOwotICAgIEdYVl9WYWxpZGF0b3JSZWMgIGd4dmFsaWRyZWM7Ci0gICAgR1hWX1ZhbGlkYXRvciAgICAgZ3h2YWxpZCA9ICZneHZhbGlkcmVjOwotCi0gICAgR1hWX2xjYXJfRGF0YVJlYyAgbGNhcnJlYzsKLSAgICBHWFZfbGNhcl9EYXRhICAgICBsY2FyID0gJmxjYXJyZWM7Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgICB2ZXJzaW9uOwotCi0KLSAgICBneHZhbGlkLT5yb290ICAgICAgID0gZnR2YWxpZDsKLSAgICBneHZhbGlkLT50YWJsZV9kYXRhID0gbGNhcjsKLSAgICBneHZhbGlkLT5mYWNlICAgICAgID0gZmFjZTsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIGBsY2FyJyB0YWJsZVxuIiApKTsKLSAgICBHWFZfSU5JVDsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggNCArIDIgKTsKLSAgICB2ZXJzaW9uID0gRlRfTkVYVF9MT05HKCBwICk7Ci0gICAgR1hWX0xDQVJfREFUQSggZm9ybWF0ICkgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgaWYgKCB2ZXJzaW9uICE9IDB4MDAwMTAwMDBVTCkKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgaWYgKCBHWFZfTENBUl9EQVRBKCBmb3JtYXQgKSA+IDEgKQotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICBneHZhbGlkLT5sb29rdXB2YWxfc2lnbiAgID0gR1hWX0xPT0tVUFZBTFVFX1VOU0lHTkVEOwotICAgIGd4dmFsaWQtPmxvb2t1cHZhbF9mdW5jICAgPSBneHZfbGNhcl9Mb29rdXBWYWx1ZV92YWxpZGF0ZTsKLSAgICBneHZhbGlkLT5sb29rdXBmbXQ0X3RyYW5zID0gZ3h2X2xjYXJfTG9va3VwRm10NF90cmFuc2l0OwotICAgIGd4dl9Mb29rdXBUYWJsZV92YWxpZGF0ZSggcCwgbGltaXQsIGd4dmFsaWQgKTsKLQotICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vZC5jIGIvc3JjL2d4dmFsaWQvZ3h2bW9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZTkyNzUuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlJ3MgVHJ1ZVR5cGVHWC9BQVQgdmFsaWRhdGlvbiBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9HWF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR1hfVkFMSURBVEVfSAotCi0jaW5jbHVkZSAiZ3h2bW9kLmgiCi0jaW5jbHVkZSAiZ3h2YWxpZC5oIgotI2luY2x1ZGUgImd4dmNvbW1uLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb2R1bGUKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBneHZfbG9hZF90YWJsZSggRlRfRmFjZSAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVGFnICAgICAgICAgICAgICB0YWcsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiB2b2xhdGlsZSogIHRhYmxlLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICAgICB0YWJsZV9sZW4gKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLQotICAgIGVycm9yID0gRlRfTG9hZF9TZm50X1RhYmxlKCBmYWNlLCB0YWcsIDAsIE5VTEwsIHRhYmxlX2xlbiApOwotICAgIGlmICggRlRfRVJSX0VRKCBlcnJvciwgVGFibGVfTWlzc2luZyApICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX0FMTE9DKCAqdGFibGUsICp0YWJsZV9sZW4gKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IEZUX0xvYWRfU2ZudF9UYWJsZSggZmFjZSwgdGFnLCAwLCAqdGFibGUsIHRhYmxlX2xlbiApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2RlZmluZSBHWFZfVEFCTEVfREVDTCggX3NmbnQgKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CeXRlKiB2b2xhdGlsZSAgX3NmbnQgICAgICAgICAgPSBOVUxMOyBcCi0gICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICBsZW5fICMjIF9zZm50ID0gMAotCi0jZGVmaW5lIEdYVl9UQUJMRV9MT0FEKCBfc2ZudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpZiAoICggRlRfVkFMSURBVEVfICMjIF9zZm50ICMjIF9JTkRFWCA8IHRhYmxlX2NvdW50ICkgJiYgXAotICAgICAgICAgICAgICAgKCBneF9mbGFncyAmIEZUX1ZBTElEQVRFXyAjIyBfc2ZudCApICAgICAgICAgICAgKSAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGVycm9yID0gZ3h2X2xvYWRfdGFibGUoIGZhY2UsIFRUQUdfICMjIF9zZm50LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9zZm50LCAmbGVuXyAjIyBfc2ZudCApOyAgICAgICBcCi0gICAgICAgICAgICBpZiAoIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgZ290byBFeGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0KLQotI2RlZmluZSBHWFZfVEFCTEVfVkFMSURBVEUoIF9zZm50ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmICggX3NmbnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnRfdmFsaWRhdG9yX2luaXQoICZ2YWxpZCwgX3NmbnQsIF9zZm50ICsgbGVuXyAjIyBfc2ZudCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0RFRkFVTFQgKTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCBmdF9zZXRqbXAoIHZhbGlkLmp1bXBfYnVmZmVyICkgPT0gMCApICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBneHZfICMjIF9zZm50ICMjIF92YWxpZGF0ZSggX3NmbnQsIGZhY2UsICZ2YWxpZCApOyAgICAgXAotICAgICAgICAgICAgZXJyb3IgPSB2YWxpZC5lcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBnb3RvIEV4aXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0KLQotI2RlZmluZSBHWFZfVEFCTEVfU0VUKCBfc2ZudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpZiAoIEZUX1ZBTElEQVRFXyAjIyBfc2ZudCAjIyBfSU5ERVggPCB0YWJsZV9jb3VudCApICAgICAgICBcCi0gICAgICAgICAgICB0YWJsZXNbRlRfVkFMSURBVEVfICMjIF9zZm50ICMjIF9JTkRFWF0gPSAoRlRfQnl0ZXMpX3NmbnQKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBneHZfdmFsaWRhdGUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgIEZUX1VJbnQgICBneF9mbGFncywKLSAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGVzW0ZUX1ZBTElEQVRFX0dYX0xFTkdUSF0sCi0gICAgICAgICAgICAgICAgRlRfVUludCAgIHRhYmxlX2NvdW50ICkKLSAgewotICAgIEZUX01lbW9yeSB2b2xhdGlsZSAgICAgICAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVmFsaWRhdG9yUmVjIHZvbGF0aWxlICB2YWxpZDsKLQotICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgIEdYVl9UQUJMRV9ERUNMKCBmZWF0ICk7Ci0gICAgR1hWX1RBQkxFX0RFQ0woIGJzbG4gKTsKLSAgICBHWFZfVEFCTEVfREVDTCggdHJhayApOwotICAgIEdYVl9UQUJMRV9ERUNMKCBqdXN0ICk7Ci0gICAgR1hWX1RBQkxFX0RFQ0woIG1vcnQgKTsKLSAgICBHWFZfVEFCTEVfREVDTCggbW9yeCApOwotICAgIEdYVl9UQUJMRV9ERUNMKCBrZXJuICk7Ci0gICAgR1hWX1RBQkxFX0RFQ0woIG9wYmQgKTsKLSAgICBHWFZfVEFCTEVfREVDTCggcHJvcCApOwotICAgIEdYVl9UQUJMRV9ERUNMKCBsY2FyICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHRhYmxlX2NvdW50OyBpKysgKQotICAgICAgdGFibGVzW2ldID0gMDsKLQotICAgIC8qIGxvYWQgdGFibGVzICovCi0gICAgR1hWX1RBQkxFX0xPQUQoIGZlYXQgKTsKLSAgICBHWFZfVEFCTEVfTE9BRCggYnNsbiApOwotICAgIEdYVl9UQUJMRV9MT0FEKCB0cmFrICk7Ci0gICAgR1hWX1RBQkxFX0xPQUQoIGp1c3QgKTsKLSAgICBHWFZfVEFCTEVfTE9BRCggbW9ydCApOwotICAgIEdYVl9UQUJMRV9MT0FEKCBtb3J4ICk7Ci0gICAgR1hWX1RBQkxFX0xPQUQoIGtlcm4gKTsKLSAgICBHWFZfVEFCTEVfTE9BRCggb3BiZCApOwotICAgIEdYVl9UQUJMRV9MT0FEKCBwcm9wICk7Ci0gICAgR1hWX1RBQkxFX0xPQUQoIGxjYXIgKTsKLQotICAgIC8qIHZhbGlkYXRlIHRhYmxlcyAqLwotICAgIEdYVl9UQUJMRV9WQUxJREFURSggZmVhdCApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSggYnNsbiApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSggdHJhayApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSgganVzdCApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSggbW9ydCApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSggbW9yeCApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSgga2VybiApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSggb3BiZCApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSggcHJvcCApOwotICAgIEdYVl9UQUJMRV9WQUxJREFURSggbGNhciApOwotCi0gICAgLyogU2V0IHJlc3VsdHMgKi8KLSAgICBHWFZfVEFCTEVfU0VUKCBmZWF0ICk7Ci0gICAgR1hWX1RBQkxFX1NFVCggbW9ydCApOwotICAgIEdYVl9UQUJMRV9TRVQoIG1vcnggKTsKLSAgICBHWFZfVEFCTEVfU0VUKCBic2xuICk7Ci0gICAgR1hWX1RBQkxFX1NFVCgganVzdCApOwotICAgIEdYVl9UQUJMRV9TRVQoIGtlcm4gKTsKLSAgICBHWFZfVEFCTEVfU0VUKCBvcGJkICk7Ci0gICAgR1hWX1RBQkxFX1NFVCggdHJhayApOwotICAgIEdYVl9UQUJMRV9TRVQoIHByb3AgKTsKLSAgICBHWFZfVEFCTEVfU0VUKCBsY2FyICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBmZWF0ICk7Ci0gICAgICBGVF9GUkVFKCBic2xuICk7Ci0gICAgICBGVF9GUkVFKCB0cmFrICk7Ci0gICAgICBGVF9GUkVFKCBqdXN0ICk7Ci0gICAgICBGVF9GUkVFKCBtb3J0ICk7Ci0gICAgICBGVF9GUkVFKCBtb3J4ICk7Ci0gICAgICBGVF9GUkVFKCBrZXJuICk7Ci0gICAgICBGVF9GUkVFKCBvcGJkICk7Ci0gICAgICBGVF9GUkVFKCBwcm9wICk7Ci0gICAgICBGVF9GUkVFKCBsY2FyICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2xhc3NpY19rZXJuX3ZhbGlkYXRlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBja2Vybl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyogIGNrZXJuX3RhYmxlICkKLSAgewotICAgIEZUX01lbW9yeSB2b2xhdGlsZSAgICAgICAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotICAgIEZUX0J5dGUqIHZvbGF0aWxlICAgICAgICAgY2tlcm4gICAgID0gTlVMTDsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgIGxlbl9ja2VybiA9IDA7Ci0KLSAgICAvKiB3aXRob3V0IHZvbGF0aWxlIG9uIGBlcnJvcicgR0NDIDQuMS4xLiBlbWl0czogICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgd2FybmluZzogdmFyaWFibGUgJ2Vycm9yJyBtaWdodCBiZSBjbG9iYmVyZWQgYnkgJ2xvbmdqbXAnIG9yICd2Zm9yaycgKi8KLSAgICAvKiB0aGlzIHdhcm5pbmcgc2VlbXMgc3B1cmlvdXMgYnV0IC0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9FcnJvciB2b2xhdGlsZSAgICAgICAgIGVycm9yOwotICAgIEZUX1ZhbGlkYXRvclJlYyB2b2xhdGlsZSAgdmFsaWQ7Ci0KLQotICAgICpja2Vybl90YWJsZSA9IE5VTEw7Ci0KLSAgICBlcnJvciA9IGd4dl9sb2FkX3RhYmxlKCBmYWNlLCBUVEFHX2tlcm4sICZja2VybiwgJmxlbl9ja2VybiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBja2VybiApCi0gICAgewotICAgICAgZnRfdmFsaWRhdG9yX2luaXQoICZ2YWxpZCwgY2tlcm4sIGNrZXJuICsgbGVuX2NrZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0RFRkFVTFQgKTsKLSAgICAgIGlmICggZnRfc2V0am1wKCB2YWxpZC5qdW1wX2J1ZmZlciApID09IDAgKQotICAgICAgICBneHZfa2Vybl92YWxpZGF0ZV9jbGFzc2ljKCBja2VybiwgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tlcm5fZmxhZ3MgJiBGVF9WQUxJREFURV9DS0VSTiwgJnZhbGlkICk7Ci0gICAgICBlcnJvciA9IHZhbGlkLmVycm9yOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAqY2tlcm5fdGFibGUgPSBja2VybjsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfRlJFRSggY2tlcm4gKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX1NlcnZpY2VfR1h2YWxpZGF0ZVJlYyAgZ3h2YWxpZF9pbnRlcmZhY2UgPQotICB7Ci0gICAgZ3h2X3ZhbGlkYXRlICAgICAgICAgICAgICAvKiB2YWxpZGF0ZSAqLwotICB9OwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX1NlcnZpY2VfQ0tFUk52YWxpZGF0ZVJlYyAgY2tlcm52YWxpZF9pbnRlcmZhY2UgPQotICB7Ci0gICAgY2xhc3NpY19rZXJuX3ZhbGlkYXRlICAgICAvKiB2YWxpZGF0ZSAqLwotICB9OwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBneHZhbGlkX3NlcnZpY2VzW10gPQotICB7Ci0gICAgeyBGVF9TRVJWSUNFX0lEX0dYX1ZBTElEQVRFLCAgICAgICAgICAmZ3h2YWxpZF9pbnRlcmZhY2UgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfQ0xBU1NJQ0tFUk5fVkFMSURBVEUsICZja2VybnZhbGlkX2ludGVyZmFjZSB9LAotICAgIHsgTlVMTCwgTlVMTCB9Ci0gIH07Ci0KLQotICBzdGF0aWMgRlRfUG9pbnRlcgotICBneHZhbGlkX2dldF9zZXJ2aWNlKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgc2VydmljZV9pZCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1vZHVsZSApOwotCi0gICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIGd4dmFsaWRfc2VydmljZXMsIHNlcnZpY2VfaWQgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX01vZHVsZV9DbGFzcyAgZ3h2X21vZHVsZV9jbGFzcyA9Ci0gIHsKLSAgICAwLAotICAgIHNpemVvZiAoIEZUX01vZHVsZVJlYyApLAotICAgICJneHZhbGlkIiwKLSAgICAweDEwMDAwTCwKLSAgICAweDIwMDAwTCwKLQotICAgIE5VTEwsICAgICAgICAgICAgICAvKiBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKU5VTEwsICAgICAgICAgICAgICAgIC8qIG1vZHVsZV9pbml0ICAgKi8KLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIE5VTEwsICAgICAgICAgICAgICAgIC8qIG1vZHVsZV9kb25lICAgKi8KLSAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIGd4dmFsaWRfZ2V0X3NlcnZpY2UgIC8qIGdldF9pbnRlcmZhY2UgKi8KLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vZC5oIGIvc3JjL2d4dmFsaWQvZ3h2bW9kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjVlNjAuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb2QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUncyBUcnVlVHlwZUdYL0FBVCB2YWxpZGF0aW9uIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBHWFZNT0RfSF8KLSNkZWZpbmUgR1hWTU9EX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgInRoaXMgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCi0KLSAgRlRfRVhQT1JUX1ZBUiggY29uc3QgRlRfTW9kdWxlX0NsYXNzICkgIGd4dl9tb2R1bGVfY2xhc3M7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogR1hWTU9EX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J0LmMgYi9zcmMvZ3h2YWxpZC9neHZtb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NGE2MzEuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vcnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBtb3J0IHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZtb3J0LmgiCi0jaW5jbHVkZSAiZ3h2ZmVhdC5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2bW9ydAotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfZmVhdHVyZV92YWxpZGF0ZSggR1hWX21vcnRfZmVhdHVyZSAgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBpZiAoIGYtPmZlYXR1cmVUeXBlID49IGd4dl9mZWF0X3JlZ2lzdHJ5X2xlbmd0aCApCi0gICAgewotICAgICAgR1hWX1RSQUNFKCggImZlYXR1cmVUeXBlICVkIGlzIG91dCBvZiByZWdpc3RlcmVkIHJhbmdlLCAiCi0gICAgICAgICAgICAgICAgICAic2V0dGluZyAlZCBpcyB1bmNoZWNrZWRcbiIsCi0gICAgICAgICAgICAgICAgICBmLT5mZWF0dXJlVHlwZSwgZi0+ZmVhdHVyZVNldHRpbmcgKSk7Ci0gICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9EQVRBICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZ3h2X2ZlYXRfcmVnaXN0cnlbZi0+ZmVhdHVyZVR5cGVdLmV4aXN0ZW5jZSApCi0gICAgewotICAgICAgR1hWX1RSQUNFKCggImZlYXR1cmVUeXBlICVkIGlzIHdpdGhpbiByZWdpc3RlcmVkIGFyZWEgIgotICAgICAgICAgICAgICAgICAgImJ1dCB1bmRlZmluZWQsIHNldHRpbmcgJWQgaXMgdW5jaGVja2VkXG4iLAotICAgICAgICAgICAgICAgICAgZi0+ZmVhdHVyZVR5cGUsIGYtPmZlYXR1cmVTZXR0aW5nICkpOwotICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfREFUQSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfQnl0ZSAgblNldHRpbmdzX21heDsKLQotCi0gICAgICAvKiBuU2V0dGluZ3MgaW4gZ3h2ZmVhdC5jIGlzIGhhbHZlZCBmb3IgZXhjbHVzaXZlIG9uL29mZiBzZXR0aW5ncyAqLwotICAgICAgblNldHRpbmdzX21heCA9IGd4dl9mZWF0X3JlZ2lzdHJ5W2YtPmZlYXR1cmVUeXBlXS5uU2V0dGluZ3M7Ci0gICAgICBpZiAoIGd4dl9mZWF0X3JlZ2lzdHJ5W2YtPmZlYXR1cmVUeXBlXS5leGNsdXNpdmUgKQotICAgICAgICBuU2V0dGluZ3NfbWF4ID0gKEZUX0J5dGUpKCAyICogblNldHRpbmdzX21heCApOwotCi0gICAgICBHWFZfVFJBQ0UoKCAiZmVhdHVyZVR5cGUgJWQgaXMgcmVnaXN0ZXJlZCIsIGYtPmZlYXR1cmVUeXBlICkpOwotICAgICAgR1hWX1RSQUNFKCggInNldHRpbmcgJWQiLCBmLT5mZWF0dXJlU2V0dGluZyApKTsKLQotICAgICAgaWYgKCBmLT5mZWF0dXJlU2V0dGluZyA+IG5TZXR0aW5nc19tYXggKQotICAgICAgewotICAgICAgICBHWFZfVFJBQ0UoKCAib3V0IG9mIGRlZmluZWQgcmFuZ2UgJWQiLCBuU2V0dGluZ3NfbWF4ICkpOwotICAgICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9EQVRBICk7Ci0gICAgICB9Ci0gICAgICBHWFZfVFJBQ0UoKCAiXG4iICkpOwotICAgIH0KLQotICAgIC8qIFRPRE86IGVuYWJsZUZsYWdzIG11c3QgYmUgdW5pcXVlIHZhbHVlIGluIHNwZWNpZmllZCBjaGFpbj8gICovCi0gIH0KLQotCi0gIC8qCi0gICAqIG5GZWF0dXJlRmxhZ3MgaXMgdHlwZWQgdG8gRlRfVUxvbmcgdG8gYWNjZXB0IHRoYXQgaW4KLSAgICogbW9ydCAodHlwZWQgRlRfVVNob3J0KSBhbmQgbW9yeCAodHlwZWQgRlRfVUxvbmcpLgotICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X21vcnRfZmVhdHVyZWFycmF5X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBuRmVhdHVyZUZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VTG9uZyAgaTsKLQotICAgIEdYVl9tb3J0X2ZlYXR1cmVSZWMgIGYgPSBHWFZfTU9SVF9GRUFUVVJFX09GRjsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJtb3J0IGZlYXR1cmUgbGlzdCIgKTsKLSAgICBmb3IgKCBpID0gMDsgaSA8IG5GZWF0dXJlRmxhZ3M7IGkrKyApCi0gICAgewotICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICsgMiArIDQgKyA0ICk7Ci0gICAgICBmLmZlYXR1cmVUeXBlICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGYuZmVhdHVyZVNldHRpbmcgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgZi5lbmFibGVGbGFncyAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGYuZGlzYWJsZUZsYWdzICAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGd4dl9tb3J0X2ZlYXR1cmVfdmFsaWRhdGUoICZmLCBneHZhbGlkICk7Ci0gICAgfQotCi0gICAgaWYgKCAhSVNfR1hWX01PUlRfRkVBVFVSRV9PRkYoIGYgKSApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X21vcnRfY292ZXJhZ2VfdmFsaWRhdGUoIEZUX1VTaG9ydCAgICAgIGNvdmVyYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGd4dmFsaWQgKTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgaWYgKCBjb3ZlcmFnZSAmIDB4ODAwMFUgKQotICAgICAgR1hWX1RSQUNFKCggIiB0aGlzIHN1YnRhYmxlIGlzIGZvciB2ZXJ0aWNhbCB0ZXh0IG9ubHlcbiIgKSk7Ci0gICAgZWxzZQotICAgICAgR1hWX1RSQUNFKCggIiB0aGlzIHN1YnRhYmxlIGlzIGZvciBob3Jpem9udGFsIHRleHQgb25seVxuIiApKTsKLQotICAgIGlmICggY292ZXJhZ2UgJiAweDQwMDAgKQotICAgICAgR1hWX1RSQUNFKCggIiB0aGlzIHN1YnRhYmxlIGlzIGFwcGxpZWQgdG8gZ2x5cGggYXJyYXkgIgotICAgICAgICAgICAgICAgICAgImluIGRlc2NlbmRpbmcgb3JkZXJcbiIgKSk7Ci0gICAgZWxzZQotICAgICAgR1hWX1RSQUNFKCggIiB0aGlzIHN1YnRhYmxlIGlzIGFwcGxpZWQgdG8gZ2x5cGggYXJyYXkgIgotICAgICAgICAgICAgICAgICAgImluIGFzY2VuZGluZyBvcmRlclxuIiApKTsKLQotICAgIGlmICggY292ZXJhZ2UgJiAweDIwMDAgKQotICAgICAgR1hWX1RSQUNFKCggIiB0aGlzIHN1YnRhYmxlIGlzIGZvcmNpYmx5IGFwcGxpZWQgdG8gIgotICAgICAgICAgICAgICAgICAgInZlcnRpY2FsL2hvcml6b250YWwgdGV4dFxuIiApKTsKLQotICAgIGlmICggY292ZXJhZ2UgJiAweDFGRjggKQotICAgICAgR1hWX1RSQUNFKCggIiBjb3ZlcmFnZSBoYXMgbm9uLXplcm8gYml0cyBpbiByZXNlcnZlZCBhcmVhXG4iICkpOwotI2VuZGlmCi0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J0X3N1YnRhYmxlc192YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgblN1YnRhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLSAgICBHWFZfVmFsaWRhdGVfRnVuYyBmbXRfZnVuY3NfdGFibGVbXSA9Ci0gICAgewotICAgICAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTBfdmFsaWRhdGUsIC8qIDAgKi8KLSAgICAgIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX3ZhbGlkYXRlLCAvKiAxICovCi0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl92YWxpZGF0ZSwgLyogMiAqLwotICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgKi8KLSAgICAgIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU0X3ZhbGlkYXRlLCAvKiA0ICovCi0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlNV92YWxpZGF0ZSwgLyogNSAqLwotCi0gICAgfTsKLQotICAgIEZUX1VTaG9ydCAgaTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJzdWJ0YWJsZXMgaW4gYSBjaGFpbiIgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgblN1YnRhYmxlczsgaSsrICkKLSAgICB7Ci0gICAgICBHWFZfVmFsaWRhdGVfRnVuYyAgZnVuYzsKLQotICAgICAgRlRfVVNob3J0ICBsZW5ndGg7Ci0gICAgICBGVF9VU2hvcnQgIGNvdmVyYWdlOwotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgICBGVF9VTG9uZyAgIHN1YkZlYXR1cmVGbGFnczsKLSNlbmRpZgotICAgICAgRlRfVUludCAgICB0eXBlOwotICAgICAgRlRfVUludCAgICByZXN0OwotCi0KLSAgICAgIEdYVl9MSU1JVF9DSEVDSyggMiArIDIgKyA0ICk7Ci0gICAgICBsZW5ndGggICAgICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgY292ZXJhZ2UgICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgICAgc3ViRmVhdHVyZUZsYWdzID0gRlRfTkVYVF9VTE9ORyggcCApOwotI2Vsc2UKLSAgICAgIHAgKz0gNDsKLSNlbmRpZgotCi0gICAgICBHWFZfVFJBQ0UoKCAidmFsaWRhdGluZyBjaGFpbiBzdWJ0YWJsZSAlZC8lZCAoJWQgYnl0ZXMpXG4iLAotICAgICAgICAgICAgICAgICAgaSArIDEsIG5TdWJ0YWJsZXMsIGxlbmd0aCApKTsKLSAgICAgIHR5cGUgPSBjb3ZlcmFnZSAmIDB4MDAwNzsKLSAgICAgIHJlc3QgPSBsZW5ndGggLSAoIDIgKyAyICsgNCApOwotCi0gICAgICBHWFZfTElNSVRfQ0hFQ0soIHJlc3QgKTsKLSAgICAgIGd4dl9tb3J0X2NvdmVyYWdlX3ZhbGlkYXRlKCBjb3ZlcmFnZSwgZ3h2YWxpZCApOwotCi0gICAgICBpZiAoIHR5cGUgPiA1ICkKLSAgICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICAgIGZ1bmMgPSBmbXRfZnVuY3NfdGFibGVbdHlwZV07Ci0gICAgICBpZiAoICFmdW5jICkKLSAgICAgICAgR1hWX1RSQUNFKCggIm1vcnggdHlwZSAlZCBpcyByZXNlcnZlZFxuIiwgdHlwZSApKTsKLQotICAgICAgZnVuYyggcCwgcCArIHJlc3QsIGd4dmFsaWQgKTsKLQotICAgICAgcCArPSByZXN0OwotICAgICAgLyogVE9ETzogdmFsaWRhdGUgc3ViRmVhdHVyZUZsYWdzICovCi0gICAgfQotCi0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gKEZUX1VMb25nKSggcCAtIHRhYmxlICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfY2hhaW5fdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgcCA9IHRhYmxlOwotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgRlRfVUxvbmcgICBkZWZhdWx0RmxhZ3M7Ci0jZW5kaWYKLSAgICBGVF9VTG9uZyAgIGNoYWluTGVuZ3RoOwotICAgIEZUX1VTaG9ydCAgbkZlYXR1cmVGbGFnczsKLSAgICBGVF9VU2hvcnQgIG5TdWJ0YWJsZXM7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAibW9ydCBjaGFpbiBoZWFkZXIiICk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDQgKyA0ICsgMiArIDIgKTsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgIGRlZmF1bHRGbGFncyAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0jZWxzZQotICAgIHAgKz0gNDsKLSNlbmRpZgotICAgIGNoYWluTGVuZ3RoICAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbkZlYXR1cmVGbGFncyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgblN1YnRhYmxlcyAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBneHZfbW9ydF9mZWF0dXJlYXJyYXlfdmFsaWRhdGUoIHAsIHRhYmxlICsgY2hhaW5MZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRmVhdHVyZUZsYWdzLCBneHZhbGlkICk7Ci0gICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0gICAgZ3h2X21vcnRfc3VidGFibGVzX3ZhbGlkYXRlKCBwLCB0YWJsZSArIGNoYWluTGVuZ3RoLCBuU3VidGFibGVzLCBneHZhbGlkICk7Ci0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gY2hhaW5MZW5ndGg7Ci0KLSAgICAvKiBUT0RPOiB2YWxpZGF0ZSBkZWZhdWx0RmxhZ3MgKi8KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X21vcnRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIGZ0dmFsaWQgKQotICB7Ci0gICAgR1hWX1ZhbGlkYXRvclJlYyAgZ3h2YWxpZHJlYzsKLSAgICBHWFZfVmFsaWRhdG9yICAgICBneHZhbGlkID0gJmd4dmFsaWRyZWM7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgcCAgICAgPSB0YWJsZTsKLSAgICBGVF9CeXRlcyAgICAgICAgICBsaW1pdCA9IDA7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgdmVyc2lvbjsKLSAgICBGVF9VTG9uZyAgICAgICAgICBuQ2hhaW5zOwotICAgIEZUX1VMb25nICAgICAgICAgIGk7Ci0KLQotICAgIGd4dmFsaWQtPnJvb3QgPSBmdHZhbGlkOwotICAgIGd4dmFsaWQtPmZhY2UgPSBmYWNlOwotICAgIGxpbWl0ICAgICAgICAgPSBneHZhbGlkLT5yb290LT5saW1pdDsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIGBtb3J0JyB0YWJsZVxuIiApKTsKLSAgICBHWFZfSU5JVDsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggNCArIDQgKTsKLSAgICB2ZXJzaW9uID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgIG5DaGFpbnMgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBpZiAodmVyc2lvbiAhPSAweDAwMDEwMDAwVUwpCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbkNoYWluczsgaSsrICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAidmFsaWRhdGluZyBjaGFpbiAlZC8lZFxuIiwgaSArIDEsIG5DaGFpbnMgKSk7Ci0gICAgICBHWFZfMzJCSVRfQUxJR05NRU5UX1ZBTElEQVRFKCBwIC0gdGFibGUgKTsKLSAgICAgIGd4dl9tb3J0X2NoYWluX3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotICAgICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9ydC5oIGIvc3JjL2d4dmFsaWQvZ3h2bW9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU0M2FkLi4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dm1vcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vcnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBjb21tb24gZGVmaW5pdGlvbiBmb3IgbW9ydCB0YWJsZSAoc3BlY2lmaWNhdGlvbikuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgR1hWTU9SVF9IXwotI2RlZmluZSBHWFZNT1JUX0hfCi0KLSNpbmNsdWRlICJneHZhbGlkLmgiCi0jaW5jbHVkZSAiZ3h2Y29tbW4uaCIKLQotI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICi0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX21vcnRfZmVhdHVyZVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgZmVhdHVyZVR5cGU7Ci0gICAgRlRfVVNob3J0ICBmZWF0dXJlU2V0dGluZzsKLSAgICBGVF9VTG9uZyAgIGVuYWJsZUZsYWdzOwotICAgIEZUX1VMb25nICAgZGlzYWJsZUZsYWdzOwotCi0gIH0gR1hWX21vcnRfZmVhdHVyZVJlYywgKkdYVl9tb3J0X2ZlYXR1cmU7Ci0KLSNkZWZpbmUgR1hWX01PUlRfRkVBVFVSRV9PRkYgIHswLCAxLCAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTH0KLQotI2RlZmluZSBJU19HWFZfTU9SVF9GRUFUVVJFX09GRiggZiApICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoZikuZmVhdHVyZVR5cGUgICAgPT0gMCAgICAgICAgICAgIHx8IFwKLSAgICAgICAgICAgIChmKS5mZWF0dXJlU2V0dGluZyA9PSAxICAgICAgICAgICAgfHwgXAotICAgICAgICAgICAgKGYpLmVuYWJsZUZsYWdzICAgID09IDB4MDAwMDAwMDBVTCB8fCBcCi0gICAgICAgICAgICAoZikuZGlzYWJsZUZsYWdzICAgPT0gMHgwMDAwMDAwMFVMICkKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X21vcnRfZmVhdHVyZWFycmF5X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBuRmVhdHVyZUZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9tb3J0X2NvdmVyYWdlX3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICBjb3ZlcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUwX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLQotI2VuZGlmIC8qIEdYVk1PUlRfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vcnQwLmMgYi9zcmMvZ3h2YWxpZC9neHZtb3J0MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzVmYWQ3Li4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dm1vcnQwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9ydDAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnQgdGFibGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBib2R5IGZvciB0eXBlMCAoSW5kaWMgU2NyaXB0IFJlYXJyYW5nZW1lbnQpIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZtb3J0LmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb3J0Ci0KLQotICBzdGF0aWMgY29uc3QgY2hhciogR1hWX01vcnRfSW5kaWNTY3JpcHRfTXNnW10gPQotICB7Ci0gICAgIm5vIGNoYW5nZSIsCi0gICAgIkF4ID0+IHhBIiwKLSAgICAieEQgPT4gRHgiLAotICAgICJBeEQgPT4gRHhBIiwKLSAgICAiQUJ4ID0+IHhBQiIsCi0gICAgIkFCeCA9PiB4QkEiLAotICAgICJ4Q0QgPT4gQ0R4IiwKLSAgICAieENEID0+IERDeCIsCi0gICAgIkF4Q0QgPT4gQ0R4QSIsCi0gICAgIkF4Q0QgPT4gREN4QSIsCi0gICAgIkFCeEQgPT4gRHhBQiIsCi0gICAgIkFCeEQgPT4gRHhCQSIsCi0gICAgIkFCeENEID0+IENEeEFCIiwKLSAgICAiQUJ4Q0QgPT4gQ0R4QkEiLAotICAgICJBQnhDRCA9PiBEQ3hBQiIsCi0gICAgIkFCeENEID0+IERDeEJBIiwKLQotICB9OwotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTBfZW50cnlfdmFsaWRhdGUoCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ciAgZ2x5cGhPZmZzZXRfcCwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAotICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgICAgICAgICAgICAgICAgICBneHZhbGlkICkKLSAgewotICAgIEZUX1VTaG9ydCAgbWFya0ZpcnN0OwotICAgIEZUX1VTaG9ydCAgZG9udEFkdmFuY2U7Ci0gICAgRlRfVVNob3J0ICBtYXJrTGFzdDsKLSAgICBGVF9VU2hvcnQgIHJlc2VydmVkOwotICAgIEZUX1VTaG9ydCAgdmVyYiA9IDA7Ci0KLSAgICBGVF9VTlVTRUQoIHN0YXRlICk7Ci0gICAgRlRfVU5VU0VEKCB0YWJsZSApOwotICAgIEZUX1VOVVNFRCggbGltaXQgKTsKLQotICAgIEZUX1VOVVNFRCggR1hWX01vcnRfSW5kaWNTY3JpcHRfTXNnW3ZlcmJdICk7IC8qIGZvciB0aGUgbm9uLWRlYnVnZ2luZyAqLwotICAgIEZUX1VOVVNFRCggZ2x5cGhPZmZzZXRfcCApOyAgICAgICAgICAgICAgICAgIC8qIGNhc2UgICAgICAgICAgICAgICAgICAqLwotCi0KLSAgICBtYXJrRmlyc3QgICA9IChGVF9VU2hvcnQpKCAoIGZsYWdzID4+IDE1ICkgJiAxICk7Ci0gICAgZG9udEFkdmFuY2UgPSAoRlRfVVNob3J0KSggKCBmbGFncyA+PiAxNCApICYgMSApOwotICAgIG1hcmtMYXN0ICAgID0gKEZUX1VTaG9ydCkoICggZmxhZ3MgPj4gMTMgKSAmIDEgKTsKLQotICAgIHJlc2VydmVkID0gKEZUX1VTaG9ydCkoIGZsYWdzICYgMHgxRkYwICk7Ci0gICAgdmVyYiAgICAgPSAoRlRfVVNob3J0KSggZmxhZ3MgJiAweDAwMEYgKTsKLQotICAgIEdYVl9UUkFDRSgoICIgIEluZGljU2NyaXB0IE1vcnBoUnVsZSBmb3IgZ2x5cGhPZmZzZXQgMHglMDR4IiwKLSAgICAgICAgICAgICAgICBnbHlwaE9mZnNldF9wLT51ICkpOwotICAgIEdYVl9UUkFDRSgoICIgbWFya0ZpcnN0PSUwMWQiLCBtYXJrRmlyc3QgKSk7Ci0gICAgR1hWX1RSQUNFKCggIiBkb250QWR2YW5jZT0lMDFkIiwgZG9udEFkdmFuY2UgKSk7Ci0gICAgR1hWX1RSQUNFKCggIiBtYXJrTGFzdD0lMDFkIiwgbWFya0xhc3QgKSk7Ci0gICAgR1hWX1RSQUNFKCggIiAlMDJkIiwgdmVyYiApKTsKLSAgICBHWFZfVFJBQ0UoKCAiICVzXG4iLCBHWFZfTW9ydF9JbmRpY1NjcmlwdF9Nc2dbdmVyYl0gKSk7Ci0KLSAgICBpZiAoIG1hcmtGaXJzdCA+IDAgJiYgbWFya0xhc3QgPiAwICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAiICBbb2RkXSBhIGdseXBoIGlzIG1hcmtlZCBhcyB0aGUgZmlyc3QgYW5kIGxhc3QiCi0gICAgICAgICAgICAgICAgICAiICBpbiBJbmRpYyByZWFycmFuZ2VtZW50XG4iICkpOwotICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfREFUQSApOwotICAgIH0KLQotICAgIGlmICggbWFya0ZpcnN0ID4gMCAmJiBkb250QWR2YW5jZSA+IDAgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICIgIFtvZGRdIHRoZSBmaXJzdCBnbHlwaCBpcyBtYXJrZWQgYXMgZG9udEFkdmFuY2UiCi0gICAgICAgICAgICAgICAgICAiIGluIEluZGljIHJlYXJyYW5nZW1lbnRcbiIgKSk7Ci0gICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9EQVRBICk7Ci0gICAgfQotCi0gICAgaWYgKCAwIDwgcmVzZXJ2ZWQgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICIgbm9uLXplcm8gYml0cyBmb3VuZCBpbiByZXNlcnZlZCByYW5nZVxuIiApKTsKLSAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0RBVEEgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgR1hWX1RSQUNFKCggIlxuIiApKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTBfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKAotICAgICAgIm1vcnQgY2hhaW4gc3VidGFibGUgdHlwZTAgKEluZGljLVNjcmlwdCBSZWFycmFuZ2VtZW50KSIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggR1hWX1NUQVRFVEFCTEVfSEVBREVSX1NJWkUgKTsKLQotICAgIGd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YSAgICAgICAgICAgICAgID0gTlVMTDsKLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGFfbG9hZF9mdW5jICAgICA9IE5VTEw7Ci0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5zdWJ0YWJsZV9zZXR1cF9mdW5jICAgPSBOVUxMOwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUuZW50cnlfZ2x5cGhvZmZzZXRfZm10ID0gR1hWX0dMWVBIT0ZGU0VUX05PTkU7Ci0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5lbnRyeV92YWxpZGF0ZV9mdW5jID0KLSAgICAgIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlOwotCi0gICAgZ3h2X1N0YXRlVGFibGVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDEuYyBiL3NyYy9neHZhbGlkL2d4dm1vcnQxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MWVmMjIuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDEuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb3J0MS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgbW9ydCB0YWJsZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJvZHkgZm9yIHR5cGUxIChDb250ZXh0dWFsIFN1YnN0aXR1dGlvbikgc3VidGFibGUuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImd4dm1vcnQuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcnQKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgc3Vic3RpdHV0aW9uVGFibGU7Ci0gICAgRlRfVVNob3J0ICBzdWJzdGl0dXRpb25UYWJsZV9sZW5ndGg7Ci0KLSAgfSAgR1hWX21vcnRfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWMsCi0gICAgKkdYVl9tb3J0X3N1YnRhYmxlX3R5cGUxX1N0YXRlT3B0UmVjRGF0YTsKLQotI2RlZmluZSBHWFZfTU9SVF9TVUJUQUJMRV9UWVBFMV9IRUFERVJfU0laRSBcCi0gICAgICAgICAgKCBHWFZfU1RBVEVUQUJMRV9IRUFERVJfU0laRSArIDIgKQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfc3Vic3RpdHV0aW9uVGFibGVfbG9hZCggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLSAgICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlY0RhdGEgIG9wdGRhdGEgPQotICAgICAgKEdYVl9tb3J0X3N1YnRhYmxlX3R5cGUxX1N0YXRlT3B0UmVjRGF0YSlneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGE7Ci0KLQotICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotICAgIG9wdGRhdGEtPnN1YnN0aXR1dGlvblRhYmxlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfc3VidGFibGVfc2V0dXAoIEZUX1VTaG9ydCAgICAgIHRhYmxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBjbGFzc1RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgc3RhdGVBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIGVudHJ5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBjbGFzc1RhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgc3RhdGVBcnJheV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIGVudHJ5VGFibGVfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX1VTaG9ydCAgb1s0XTsKLSAgICBGVF9VU2hvcnQgICpsWzRdOwotICAgIEZUX1VTaG9ydCAgYnVmZls1XTsKLQotICAgIEdYVl9tb3J0X3N1YnRhYmxlX3R5cGUxX1N0YXRlT3B0UmVjRGF0YSAgb3B0ZGF0YSA9Ci0gICAgICAoR1hWX21vcnRfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWNEYXRhKWd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YTsKLQotCi0gICAgb1swXSA9IGNsYXNzVGFibGU7Ci0gICAgb1sxXSA9IHN0YXRlQXJyYXk7Ci0gICAgb1syXSA9IGVudHJ5VGFibGU7Ci0gICAgb1szXSA9IG9wdGRhdGEtPnN1YnN0aXR1dGlvblRhYmxlOwotICAgIGxbMF0gPSBjbGFzc1RhYmxlX2xlbmd0aF9wOwotICAgIGxbMV0gPSBzdGF0ZUFycmF5X2xlbmd0aF9wOwotICAgIGxbMl0gPSBlbnRyeVRhYmxlX2xlbmd0aF9wOwotICAgIGxbM10gPSAmKCBvcHRkYXRhLT5zdWJzdGl0dXRpb25UYWJsZV9sZW5ndGggKTsKLQotICAgIGd4dl9zZXRfbGVuZ3RoX2J5X3VzaG9ydF9vZmZzZXQoIG8sIGwsIGJ1ZmYsIDQsIHRhYmxlX3NpemUsIGd4dmFsaWQgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfb2Zmc2V0X3RvX3N1YnN0X3ZhbGlkYXRlKAotICAgIEZUX1Nob3J0ICAgICAgICAgIHdvcmRPZmZzZXQsCi0gICAgY29uc3QgRlRfU3RyaW5nKiAgdGFnLAotICAgIEZUX0J5dGUgICAgICAgICAgIHN0YXRlLAotICAgIEdYVl9WYWxpZGF0b3IgICAgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfVVNob3J0ICBzdWJzdFRhYmxlOwotICAgIEZUX1VTaG9ydCAgc3Vic3RUYWJsZV9saW1pdDsKLQotICAgIEZUX1VOVVNFRCggdGFnICk7Ci0gICAgRlRfVU5VU0VEKCBzdGF0ZSApOwotCi0KLSAgICBzdWJzdFRhYmxlID0KLSAgICAgICgoR1hWX21vcnRfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWMgKikKLSAgICAgICAoZ3h2YWxpZC0+c3RhdGV0YWJsZS5vcHRkYXRhKSktPnN1YnN0aXR1dGlvblRhYmxlOwotICAgIHN1YnN0VGFibGVfbGltaXQgPQotICAgICAgKEZUX1VTaG9ydCkoIHN1YnN0VGFibGUgKwotICAgICAgICAgICAgICAgICAgICgoR1hWX21vcnRfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWMgKikKLSAgICAgICAgICAgICAgICAgICAgKGd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YSkpLT5zdWJzdGl0dXRpb25UYWJsZV9sZW5ndGggKTsKLQotICAgIGd4dmFsaWQtPm1pbl9naWQgPSAoRlRfVVNob3J0KSggKCBzdWJzdFRhYmxlICAgICAgIC0gd29yZE9mZnNldCAqIDIgKSAvIDIgKTsKLSAgICBneHZhbGlkLT5tYXhfZ2lkID0gKEZUX1VTaG9ydCkoICggc3Vic3RUYWJsZV9saW1pdCAtIHdvcmRPZmZzZXQgKiAyICkgLyAyICk7Ci0gICAgZ3h2YWxpZC0+bWF4X2dpZCA9IChGVF9VU2hvcnQpKCBGVF9NQVgoIGd4dmFsaWQtPm1heF9naWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQtPmZhY2UtPm51bV9nbHlwaHMgKSApOwotCi0gICAgLyogWFhYOiBjaGVjayByYW5nZT8gKi8KLQotICAgIC8qIFRPRE86IG1pbl9naWQgJiBtYXhfZ2lkIGNvbXBhcmlzb24gd2l0aCBDbGFzc1RhYmxlIGNvbnRlbnRzICovCi0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX2VudHJ5X3ZhbGlkYXRlKAotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICBHWFZfU3RhdGVUYWJsZV9HbHlwaE9mZnNldENQdHIgIGdseXBoT2Zmc2V0X3AsCi0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0LAotICAgIEdYVl9WYWxpZGF0b3IgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgIEZUX1VTaG9ydCAgc2V0TWFyazsKLSAgICBGVF9VU2hvcnQgIGRvbnRBZHZhbmNlOwotI2VuZGlmCi0gICAgRlRfVVNob3J0ICByZXNlcnZlZDsKLSAgICBGVF9TaG9ydCAgIG1hcmtPZmZzZXQ7Ci0gICAgRlRfU2hvcnQgICBjdXJyZW50T2Zmc2V0OwotCi0gICAgRlRfVU5VU0VEKCB0YWJsZSApOwotICAgIEZUX1VOVVNFRCggbGltaXQgKTsKLQotCi0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBzZXRNYXJrICAgICAgID0gKEZUX1VTaG9ydCkoICAgZmxhZ3MgPj4gMTUgICAgICAgICAgICApOwotICAgIGRvbnRBZHZhbmNlICAgPSAoRlRfVVNob3J0KSggKCBmbGFncyA+PiAxNCApICYgMSAgICAgICk7Ci0jZW5kaWYKLSAgICByZXNlcnZlZCAgICAgID0gKEZUX1VTaG9ydCkoICAgIGZsYWdzICAgICAgICAmIDB4M0ZGRiApOwotCi0gICAgbWFya09mZnNldCAgICA9IChGVF9TaG9ydCkoIGdseXBoT2Zmc2V0X3AtPnVsID4+IDE2ICk7Ci0gICAgY3VycmVudE9mZnNldCA9IChGVF9TaG9ydCkoIGdseXBoT2Zmc2V0X3AtPnVsICAgICAgICk7Ci0KLSAgICBpZiAoIDAgPCByZXNlcnZlZCApCi0gICAgewotICAgICAgR1hWX1RSQUNFKCggIiBub24temVybyBiaXRzIGZvdW5kIGluIHJlc2VydmVkIHJhbmdlXG4iICkpOwotICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfREFUQSApOwotICAgIH0KLQotICAgIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX29mZnNldF90b19zdWJzdF92YWxpZGF0ZSggbWFya09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXJrT2Zmc2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotCi0gICAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfb2Zmc2V0X3RvX3N1YnN0X3ZhbGlkYXRlKCBjdXJyZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1cnJlbnRPZmZzZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUxX3N1YnN0VGFibGVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSAgICBGVF9VU2hvcnQgIG51bV9naWRzID0gKEZUX1VTaG9ydCkoCi0gICAgICAgICAgICAgICAgICgoR1hWX21vcnRfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWMgKikKLSAgICAgICAgICAgICAgICAgIChneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGEpKS0+c3Vic3RpdHV0aW9uVGFibGVfbGVuZ3RoIC8gMiApOwotICAgIEZUX1VTaG9ydCAgaTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJ2YWxpZGF0aW5nIGNvbnRlbnRzIG9mIHN1YnN0aXR1dGlvblRhYmxlIiApOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2dpZHM7IGkrKyApCi0gICAgewotICAgICAgRlRfVVNob3J0ICBkc3RfZ2lkOwotCi0KLSAgICAgIEdYVl9MSU1JVF9DSEVDSyggMiApOwotICAgICAgZHN0X2dpZCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIGlmICggZHN0X2dpZCA+PSAweEZGRkZVICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggZHN0X2dpZCA8IGd4dmFsaWQtPm1pbl9naWQgfHwgZ3h2YWxpZC0+bWF4X2dpZCA8IGRzdF9naWQgKQotICAgICAgewotICAgICAgICBHWFZfVFJBQ0UoKCAic3Vic3RUYWJsZSBpbmNsdWRlIGEgc3RyYW5nZSBnaWRbJWRdPSVkID4iCi0gICAgICAgICAgICAgICAgICAgICIgb3V0IG9mIGRlZmluZSByYW5nZSAoJWQuLiVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgZHN0X2dpZCwgZ3h2YWxpZC0+bWluX2dpZCwgZ3h2YWxpZC0+bWF4X2dpZCApKTsKLSAgICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfR0xZUEhfSUQgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyoKLSAgICogc3VidGFibGUgZm9yIENvbnRleHR1YWwgZ2x5cGggc3Vic3RpdHV0aW9uIGlzIGEgbW9kaWZpZWQgU3RhdGVUYWJsZS4KLSAgICogSW4gYWRkaXRpb24gdG8gY2xhc3NUYWJsZSwgc3RhdGVBcnJheSwgYW5kIGVudHJ5VGFibGUsIHRoZSBmaWVsZAotICAgKiBgc3Vic3RpdHV0aW9uVGFibGUnIGlzIGFkZGVkLgotICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLSAgICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlYyAgc3RfcmVjOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIm1vcnQgY2hhaW4gc3VidGFibGUgdHlwZTEgKENvbnRleHR1YWwgR2x5cGggU3Vic3QpIiApOwotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCBHWFZfTU9SVF9TVUJUQUJMRV9UWVBFMV9IRUFERVJfU0laRSApOwotCi0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5vcHRkYXRhID0KLSAgICAgICZzdF9yZWM7Ci0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5vcHRkYXRhX2xvYWRfZnVuYyA9Ci0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMV9zdWJzdGl0dXRpb25UYWJsZV9sb2FkOwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUuc3VidGFibGVfc2V0dXBfZnVuYyA9Ci0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMV9zdWJ0YWJsZV9zZXR1cDsKLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLmVudHJ5X2dseXBob2Zmc2V0X2ZtdCA9Ci0gICAgICBHWFZfR0xZUEhPRkZTRVRfVUxPTkc7Ci0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5lbnRyeV92YWxpZGF0ZV9mdW5jID0KLQotICAgICAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfZW50cnlfdmFsaWRhdGU7Ci0gICAgZ3h2X1N0YXRlVGFibGVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMV9zdWJzdFRhYmxlX3ZhbGlkYXRlKAotICAgICAgdGFibGUgKyBzdF9yZWMuc3Vic3RpdHV0aW9uVGFibGUsCi0gICAgICB0YWJsZSArIHN0X3JlYy5zdWJzdGl0dXRpb25UYWJsZSArIHN0X3JlYy5zdWJzdGl0dXRpb25UYWJsZV9sZW5ndGgsCi0gICAgICBneHZhbGlkICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDIuYyBiL3NyYy9neHZhbGlkL2d4dm1vcnQyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxN2U1MWUuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDIuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb3J0Mi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgbW9ydCB0YWJsZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJvZHkgZm9yIHR5cGUyIChMaWdhdHVyZSBTdWJzdGl0dXRpb24pIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImd4dm1vcnQuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcnQKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlMl9TdGF0ZU9wdFJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgbGlnQWN0aW9uVGFibGU7Ci0gICAgRlRfVVNob3J0ICBjb21wb25lbnRUYWJsZTsKLSAgICBGVF9VU2hvcnQgIGxpZ2F0dXJlVGFibGU7Ci0gICAgRlRfVVNob3J0ICBsaWdBY3Rpb25UYWJsZV9sZW5ndGg7Ci0gICAgRlRfVVNob3J0ICBjb21wb25lbnRUYWJsZV9sZW5ndGg7Ci0gICAgRlRfVVNob3J0ICBsaWdhdHVyZVRhYmxlX2xlbmd0aDsKLQotICB9ICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlMl9TdGF0ZU9wdFJlYywKLSAgICAqR1hWX21vcnRfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNEYXRhOwotCi0jZGVmaW5lIEdYVl9NT1JUX1NVQlRBQkxFX1RZUEUyX0hFQURFUl9TSVpFIFwKLSAgICAgICAgICAoIEdYVl9TVEFURVRBQkxFX0hFQURFUl9TSVpFICsgMiArIDIgKyAyICkKLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUyX29wdHRhYmxlX2xvYWQoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEdYVl9tb3J0X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjRGF0YSAgb3B0ZGF0YSA9Ci0gICAgICAoR1hWX21vcnRfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNEYXRhKWd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YTsKLQotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCAyICsgMiArIDIgKTsKLSAgICBvcHRkYXRhLT5saWdBY3Rpb25UYWJsZSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgb3B0ZGF0YS0+Y29tcG9uZW50VGFibGUgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGUgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIEdYVl9UUkFDRSgoICJvZmZzZXQgdG8gbGlnQWN0aW9uVGFibGU9MHglMDR4XG4iLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmxpZ0FjdGlvblRhYmxlICkpOwotICAgIEdYVl9UUkFDRSgoICJvZmZzZXQgdG8gY29tcG9uZW50VGFibGU9MHglMDR4XG4iLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmNvbXBvbmVudFRhYmxlICkpOwotICAgIEdYVl9UUkFDRSgoICJvZmZzZXQgdG8gbGlnYXR1cmVUYWJsZT0weCUwNHhcbiIsCi0gICAgICAgICAgICAgICAgb3B0ZGF0YS0+bGlnYXR1cmVUYWJsZSApKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTJfc3VidGFibGVfc2V0dXAoIEZUX1VTaG9ydCAgICAgIHRhYmxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBjbGFzc1RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgc3RhdGVBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIGVudHJ5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAqY2xhc3NUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgICpzdGF0ZUFycmF5X2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgKmVudHJ5VGFibGVfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX1VTaG9ydCAgb1s2XTsKLSAgICBGVF9VU2hvcnQgICpsWzZdOwotICAgIEZUX1VTaG9ydCAgYnVmZls3XTsKLQotICAgIEdYVl9tb3J0X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjRGF0YSAgb3B0ZGF0YSA9Ci0gICAgICAoR1hWX21vcnRfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNEYXRhKWd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJzdWJ0YWJsZSBib3VuZGFyaWVzIHNldHVwIiApOwotCi0gICAgb1swXSA9IGNsYXNzVGFibGU7Ci0gICAgb1sxXSA9IHN0YXRlQXJyYXk7Ci0gICAgb1syXSA9IGVudHJ5VGFibGU7Ci0gICAgb1szXSA9IG9wdGRhdGEtPmxpZ0FjdGlvblRhYmxlOwotICAgIG9bNF0gPSBvcHRkYXRhLT5jb21wb25lbnRUYWJsZTsKLSAgICBvWzVdID0gb3B0ZGF0YS0+bGlnYXR1cmVUYWJsZTsKLSAgICBsWzBdID0gY2xhc3NUYWJsZV9sZW5ndGhfcDsKLSAgICBsWzFdID0gc3RhdGVBcnJheV9sZW5ndGhfcDsKLSAgICBsWzJdID0gZW50cnlUYWJsZV9sZW5ndGhfcDsKLSAgICBsWzNdID0gJihvcHRkYXRhLT5saWdBY3Rpb25UYWJsZV9sZW5ndGgpOwotICAgIGxbNF0gPSAmKG9wdGRhdGEtPmNvbXBvbmVudFRhYmxlX2xlbmd0aCk7Ci0gICAgbFs1XSA9ICYob3B0ZGF0YS0+bGlnYXR1cmVUYWJsZV9sZW5ndGgpOwotCi0gICAgZ3h2X3NldF9sZW5ndGhfYnlfdXNob3J0X29mZnNldCggbywgbCwgYnVmZiwgNiwgdGFibGVfc2l6ZSwgZ3h2YWxpZCApOwotCi0gICAgR1hWX1RSQUNFKCggImNsYXNzVGFibGU6IG9mZnNldD0weCUwNHggbGVuZ3RoPTB4JTA0eFxuIiwKLSAgICAgICAgICAgICAgICBjbGFzc1RhYmxlLCAqY2xhc3NUYWJsZV9sZW5ndGhfcCApKTsKLSAgICBHWFZfVFJBQ0UoKCAic3RhdGVBcnJheTogb2Zmc2V0PTB4JTA0eCBsZW5ndGg9MHglMDR4XG4iLAotICAgICAgICAgICAgICAgIHN0YXRlQXJyYXksICpzdGF0ZUFycmF5X2xlbmd0aF9wICkpOwotICAgIEdYVl9UUkFDRSgoICJlbnRyeVRhYmxlOiBvZmZzZXQ9MHglMDR4IGxlbmd0aD0weCUwNHhcbiIsCi0gICAgICAgICAgICAgICAgZW50cnlUYWJsZSwgKmVudHJ5VGFibGVfbGVuZ3RoX3AgKSk7Ci0gICAgR1hWX1RSQUNFKCggImxpZ0FjdGlvblRhYmxlOiBvZmZzZXQ9MHglMDR4IGxlbmd0aD0weCUwNHhcbiIsCi0gICAgICAgICAgICAgICAgb3B0ZGF0YS0+bGlnQWN0aW9uVGFibGUsCi0gICAgICAgICAgICAgICAgb3B0ZGF0YS0+bGlnQWN0aW9uVGFibGVfbGVuZ3RoICkpOwotICAgIEdYVl9UUkFDRSgoICJjb21wb25lbnRUYWJsZTogb2Zmc2V0PTB4JTA0eCBsZW5ndGg9MHglMDR4XG4iLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmNvbXBvbmVudFRhYmxlLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmNvbXBvbmVudFRhYmxlX2xlbmd0aCApKTsKLSAgICBHWFZfVFJBQ0UoKCAibGlnYXR1cmVUYWJsZTogIG9mZnNldD0weCUwNHggbGVuZ3RoPTB4JTA0eFxuIiwKLSAgICAgICAgICAgICAgICBvcHRkYXRhLT5saWdhdHVyZVRhYmxlLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGVfbGVuZ3RoICkpOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUyX2xpZ0FjdGlvbk9mZnNldF92YWxpZGF0ZSgKLSAgICBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICBGVF9VU2hvcnQgICAgICBsaWdBY3Rpb25PZmZzZXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICAvKiBhY2Nlc3MgbGlnQWN0aW9uVGFibGUgKi8KLSAgICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlMl9TdGF0ZU9wdFJlY0RhdGEgIG9wdGRhdGEgPQotICAgICAgKEdYVl9tb3J0X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjRGF0YSlneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGE7Ci0KLSAgICBGVF9CeXRlcyBsYXRfYmFzZSAgPSB0YWJsZSArIG9wdGRhdGEtPmxpZ0FjdGlvblRhYmxlOwotICAgIEZUX0J5dGVzIHAgICAgICAgICA9IHRhYmxlICsgbGlnQWN0aW9uT2Zmc2V0OwotICAgIEZUX0J5dGVzIGxhdF9saW1pdCA9IGxhdF9iYXNlICsgb3B0ZGF0YS0+bGlnQWN0aW9uVGFibGU7Ci0KLQotICAgIEdYVl8zMkJJVF9BTElHTk1FTlRfVkFMSURBVEUoIGxpZ0FjdGlvbk9mZnNldCApOwotICAgIGlmICggcCA8IGxhdF9iYXNlICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAidG9vIHNob3J0IG9mZnNldCAweCUwNHg6IHAgPCBsYXRfYmFzZSAoJWQgYnl0ZSByZXdpbmQpXG4iLAotICAgICAgICAgICAgICAgICAgbGlnQWN0aW9uT2Zmc2V0LCBsYXRfYmFzZSAtIHAgKSk7Ci0KLSAgICAgIC8qIEZvbnRWYWxpZGF0b3IsIGZ0eHZhbGlkYXRvciwgZnR4ZHVtcGVyZnVzZXIgd2FybiBidXQgY29udGludWUgKi8KLSAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX09GRlNFVCApOwotICAgIH0KLSAgICBlbHNlIGlmICggbGF0X2xpbWl0IDwgcCApCi0gICAgewotICAgICAgR1hWX1RSQUNFKCggInRvbyBsYXJnZSBvZmZzZXQgMHglMDR4OiBsYXRfbGltaXQgPCBwICglZCBieXRlIG92ZXJydW4pXG4iLAotICAgICAgICAgICAgICAgICAgbGlnQWN0aW9uT2Zmc2V0LCBwIC0gbGF0X2xpbWl0ICkpOwotCi0gICAgICAvKiBGb250VmFsaWRhdG9yLCBmdHh2YWxpZGF0b3IsIGZ0eGR1bXBlcmZ1c2VyIHdhcm4gYnV0IGNvbnRpbnVlICovCi0gICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9PRkZTRVQgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHZhbGlkYXRlIGVudHJ5IGluIGxpZ0FjdGlvblRhYmxlICovCi0gICAgICBGVF9VTG9uZyAgIGxpZ19hY3Rpb247Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICAgIEZUX1VTaG9ydCAgbGFzdDsKLSAgICAgIEZUX1VTaG9ydCAgc3RvcmU7Ci0jZW5kaWYKLSAgICAgIEZUX1VMb25nICAgb2Zmc2V0OwotCi0KLSAgICAgIGxpZ19hY3Rpb24gPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICAgIGxhc3QgICA9IChGVF9VU2hvcnQpKCAoIGxpZ19hY3Rpb24gPj4gMzEgKSAmIDEgKTsKLSAgICAgIHN0b3JlICA9IChGVF9VU2hvcnQpKCAoIGxpZ19hY3Rpb24gPj4gMzAgKSAmIDEgKTsKLSNlbmRpZgotCi0gICAgICAvKiBBcHBsZSBzcGVjIGRlZmluZXMgdGhpcyBvZmZzZXQgYXMgYSB3b3JkIG9mZnNldCAqLwotICAgICAgb2Zmc2V0ID0gbGlnX2FjdGlvbiAmIDB4M0ZGRkZGRkZVTDsKLSAgICAgIGlmICggb2Zmc2V0ICogMiA8IG9wdGRhdGEtPmxpZ2F0dXJlVGFibGUgKQotICAgICAgewotICAgICAgICBHWFZfVFJBQ0UoKCAidG9vIHNob3J0IG9mZnNldCAweCUwOHg6IgotICAgICAgICAgICAgICAgICAgICAiIDIgeCBvZmZzZXQgPCBsaWdhdHVyZVRhYmxlICglZCBieXRlIHJld2luZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGUgLSBvZmZzZXQgKiAyICkpOwotCi0gICAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX09GRlNFVCApOwotICAgICAgfSBlbHNlIGlmICggb2Zmc2V0ICogMiA+Ci0gICAgICAgICAgICAgICAgICBvcHRkYXRhLT5saWdhdHVyZVRhYmxlICsgb3B0ZGF0YS0+bGlnYXR1cmVUYWJsZV9sZW5ndGggKQotICAgICAgewotICAgICAgICBHWFZfVFJBQ0UoKCAidG9vIGxvbmcgb2Zmc2V0IDB4JTA4eDoiCi0gICAgICAgICAgICAgICAgICAgICIgMiB4IG9mZnNldCA+IGxpZ2F0dXJlVGFibGUgKyBsaWdhdHVyZVRhYmxlX2xlbmd0aCIKLSAgICAgICAgICAgICAgICAgICAgIiAoJWQgYnl0ZSBvdmVycnVuKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGUgKyBvcHRkYXRhLT5saWdhdHVyZVRhYmxlX2xlbmd0aAotICAgICAgICAgICAgICAgICAgICAgLSBvZmZzZXQgKiAyICkpOwotCi0gICAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX09GRlNFVCApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTJfZW50cnlfdmFsaWRhdGUoCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ciAgZ2x5cGhPZmZzZXRfcCwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAotICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgICAgICAgICAgICAgICAgICBneHZhbGlkICkKLSAgewotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgRlRfVVNob3J0IHNldENvbXBvbmVudDsKLSAgICBGVF9VU2hvcnQgZG9udEFkdmFuY2U7Ci0jZW5kaWYKLSAgICBGVF9VU2hvcnQgb2Zmc2V0OwotCi0gICAgRlRfVU5VU0VEKCBzdGF0ZSApOwotICAgIEZUX1VOVVNFRCggZ2x5cGhPZmZzZXRfcCApOwotICAgIEZUX1VOVVNFRCggbGltaXQgKTsKLQotCi0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBzZXRDb21wb25lbnQgPSAoRlRfVVNob3J0KSggKCBmbGFncyA+PiAxNSApICYgMSApOwotICAgIGRvbnRBZHZhbmNlICA9IChGVF9VU2hvcnQpKCAoIGZsYWdzID4+IDE0ICkgJiAxICk7Ci0jZW5kaWYKLQotICAgIG9mZnNldCA9IChGVF9VU2hvcnQpKCBmbGFncyAmIDB4M0ZGRlUgKTsKLQotICAgIGlmICggMCA8IG9mZnNldCApCi0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl9saWdBY3Rpb25PZmZzZXRfdmFsaWRhdGUoIHRhYmxlLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTJfbGlnYXR1cmVUYWJsZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgR1hWX21vcnRfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNEYXRhICBvcHRkYXRhID0KLSAgICAgIChHWFZfbW9ydF9zdWJ0YWJsZV90eXBlMl9TdGF0ZU9wdFJlY0RhdGEpZ3h2YWxpZC0+c3RhdGV0YWJsZS5vcHRkYXRhOwotCi0gICAgRlRfQnl0ZXMgcCAgICAgPSB0YWJsZSArIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGU7Ci0gICAgRlRfQnl0ZXMgbGltaXQgPSB0YWJsZSArIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3B0ZGF0YS0+bGlnYXR1cmVUYWJsZV9sZW5ndGg7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAibW9ydCBjaGFpbiBzdWJ0YWJsZSB0eXBlMiAtIHN1YnN0aXR1dGlvblRhYmxlIiApOwotICAgIGlmICggMCAhPSBvcHRkYXRhLT5saWdhdHVyZVRhYmxlICkKLSAgICB7Ci0gICAgICAvKiBBcHBsZSBkb2VzIG5vdCBnaXZlIHNwZWNpZmljYXRpb24gb2YgbGlnYXR1cmVUYWJsZSBmb3JtYXQgKi8KLSAgICAgIHdoaWxlICggcCA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfVVNob3J0ICBsaWdfZ2lkOwotCi0KLSAgICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICAgIGxpZ19naWQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAgIGlmICggZ3h2YWxpZC0+ZmFjZS0+bnVtX2dseXBocyA8IGxpZ19naWQgKQotICAgICAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0dMWVBIX0lEICk7Ci0gICAgICB9Ci0gICAgfQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLQotICAgIEdYVl9tb3J0X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjICBsaWdfcmVjOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIm1vcnQgY2hhaW4gc3VidGFibGUgdHlwZTIgKExpZ2F0dXJlIFN1YnN0aXR1dGlvbikiICk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIEdYVl9NT1JUX1NVQlRBQkxFX1RZUEUyX0hFQURFUl9TSVpFICk7Ci0KLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGEgPQotICAgICAgJmxpZ19yZWM7Ci0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5vcHRkYXRhX2xvYWRfZnVuYyA9Ci0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl9vcHR0YWJsZV9sb2FkOwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUuc3VidGFibGVfc2V0dXBfZnVuYyA9Ci0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl9zdWJ0YWJsZV9zZXR1cDsKLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLmVudHJ5X2dseXBob2Zmc2V0X2ZtdCA9Ci0gICAgICBHWFZfR0xZUEhPRkZTRVRfTk9ORTsKLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLmVudHJ5X3ZhbGlkYXRlX2Z1bmMgPQotICAgICAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTJfZW50cnlfdmFsaWRhdGU7Ci0KLSAgICBneHZfU3RhdGVUYWJsZV92YWxpZGF0ZSggcCwgbGltaXQsIGd4dmFsaWQgKTsKLQotICAgIHAgKz0gZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoOwotICAgIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUyX2xpZ2F0dXJlVGFibGVfdmFsaWRhdGUoIHRhYmxlLCBneHZhbGlkICk7Ci0KLSAgICBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGggPSAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J0NC5jIGIvc3JjL2d4dmFsaWQvZ3h2bW9ydDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxYmFiMy4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZtb3J0NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vcnQ0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBtb3J0IHRhYmxlIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYm9keSBmb3IgdHlwZTQgKE5vbi1Db250ZXh0dWFsIEdseXBoIFN1YnN0aXR1dGlvbikgc3VidGFibGUuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiZ3h2bW9ydC5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2bW9ydAotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTRfbG9va3VwdmFsX3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfTG9va3VwVmFsdWVDUHRyICB2YWx1ZV9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgICAgICAgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBnbHlwaCApOwotCi0gICAgZ3h2X2dseXBoaWRfdmFsaWRhdGUoIHZhbHVlX3AtPnUsIGd4dmFsaWQgKTsKLSAgfQotCi0gIC8qCi0gICAgKz09PT09PT09PT09PT09PSsgLS0tLS0tLS0rCi0gICAgfCBsb29rdXAgaGVhZGVyIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCBCaW5TcmNoSGVhZGVyIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCBsYXN0R2x5cGhbMF0gIHwgICAgICAgICB8Ci0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBmaXJzdEdseXBoWzBdIHwgICAgICAgICB8ICAgIGhlYWQgb2YgbG9va3VwIHRhYmxlCi0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICAgICAgICsKLSAgICB8IG9mZnNldFswXSAgICAgfCAgICAtPiAgIHwgICAgICAgICAgb2Zmc2V0ICAgICAgICAgICAgW2J5dGVdCi0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8ICAgICAgICAgICAgICsKLSAgICB8IGxhc3RHbHlwaFsxXSAgfCAgICAgICAgIHwgKGdseXBoSUQgLSBmaXJzdEdseXBoKSAqIDIgW2J5dGVdCi0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBmaXJzdEdseXBoWzFdIHwgICAgICAgICB8Ci0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBvZmZzZXRbMV0gICAgIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIC4uLi4gICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgMTZiaXQgdmFsdWUgYXJyYXkgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCAgICAgdmFsdWUgICAgIHwgPC0tLS0tLS0rCi0gICAgIC4uLi4KLSAgKi8KLQotICBzdGF0aWMgR1hWX0xvb2t1cFZhbHVlRGVzYwotICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlNF9sb29rdXBmbXQ0X3RyYW5zaXQoCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgcmVsYXRpdmVfZ2luZGV4LAotICAgIEdYVl9Mb29rdXBWYWx1ZUNQdHIgIGJhc2VfdmFsdWVfcCwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBsb29rdXB0YmxfbGltaXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBwOwotICAgIEZUX0J5dGVzICAgICAgICAgICAgIGxpbWl0OwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIG9mZnNldDsKLSAgICBHWFZfTG9va3VwVmFsdWVEZXNjICB2YWx1ZTsKLQotICAgIC8qIFhYWDogY2hlY2sgcmFuZ2U/ICovCi0gICAgb2Zmc2V0ID0gKEZUX1VTaG9ydCkoIGJhc2VfdmFsdWVfcC0+dSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlX2dpbmRleCAqIHNpemVvZiAoIEZUX1VTaG9ydCApICk7Ci0KLSAgICBwICAgICA9IGd4dmFsaWQtPmxvb2t1cHRibF9oZWFkICsgb2Zmc2V0OwotICAgIGxpbWl0ID0gbG9va3VwdGJsX2xpbWl0OwotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgdmFsdWUudSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIm1vcnQgY2hhaW4gc3VidGFibGUgdHlwZTQgIgotICAgICAgICAgICAgICAgICAgICAiKE5vbi1Db250ZXh0dWFsIEdseXBoIFN1YnN0aXR1dGlvbikiICk7Ci0KLSAgICBneHZhbGlkLT5sb29rdXB2YWxfc2lnbiAgID0gR1hWX0xPT0tVUFZBTFVFX1VOU0lHTkVEOwotICAgIGd4dmFsaWQtPmxvb2t1cHZhbF9mdW5jICAgPSBneHZfbW9ydF9zdWJ0YWJsZV90eXBlNF9sb29rdXB2YWxfdmFsaWRhdGU7Ci0gICAgZ3h2YWxpZC0+bG9va3VwZm10NF90cmFucyA9IGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU0X2xvb2t1cGZtdDRfdHJhbnNpdDsKLQotICAgIGd4dl9Mb29rdXBUYWJsZV92YWxpZGF0ZSggcCwgbGltaXQsIGd4dmFsaWQgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J0NS5jIGIvc3JjL2d4dmFsaWQvZ3h2bW9ydDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1MWVjZS4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZtb3J0NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vcnQ1LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBtb3J0IHRhYmxlIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYm9keSBmb3IgdHlwZTUgKENvbnRleHR1YWwgR2x5cGggSW5zZXJ0aW9uKSBzdWJ0YWJsZS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiZ3h2bW9ydC5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2bW9ydAotCi0KLSAgLyoKLSAgICogbW9ydCBzdWJ0YWJsZSB0eXBlNSAoQ29udGV4dHVhbCBHbHlwaCBJbnNlcnRpb24pCi0gICAqIGhhcyB0aGUgZm9ybWF0IG9mIFN0YXRlVGFibGUgd2l0aCBpbnNlcnRpb24tZ2x5cGgtbGlzdCwKLSAgICogYnV0IHdpdGhvdXQgbmFtZS4gIFRoZSBvZmZzZXQgaXMgZ2l2ZW4gYnkgZ2x5cGhPZmZzZXQgaW4KLSAgICogZW50cnlUYWJsZS4gIFRoZXJlIGlzIG5vIHRhYmxlIGxvY2F0aW9uIGRlY2xhcmF0aW9uCi0gICAqIGxpa2UgeHh4VGFibGUuCi0gICAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlNV9TdGF0ZU9wdFJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgIGNsYXNzVGFibGU7Ci0gICAgRlRfVVNob3J0ICAgc3RhdGVBcnJheTsKLSAgICBGVF9VU2hvcnQgICBlbnRyeVRhYmxlOwotCi0jZGVmaW5lIEdYVl9NT1JUX1NVQlRBQkxFX1RZUEU1X0hFQURFUl9TSVpFICBHWFZfU1RBVEVUQUJMRV9IRUFERVJfU0laRQotCi0gICAgRlRfVVNob3J0KiAgY2xhc3NUYWJsZV9sZW5ndGhfcDsKLSAgICBGVF9VU2hvcnQqICBzdGF0ZUFycmF5X2xlbmd0aF9wOwotICAgIEZUX1VTaG9ydCogIGVudHJ5VGFibGVfbGVuZ3RoX3A7Ci0KLSAgfSAgR1hWX21vcnRfc3VidGFibGVfdHlwZTVfU3RhdGVPcHRSZWMsCi0gICAgKkdYVl9tb3J0X3N1YnRhYmxlX3R5cGU1X1N0YXRlT3B0UmVjRGF0YTsKLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU1X3N1YnRhYmxlX3NldHVwKCBGVF9VU2hvcnQgICAgICB0YWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgY2xhc3NUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIHN0YXRlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBlbnRyeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgY2xhc3NUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgIHN0YXRlQXJyYXlfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICBlbnRyeVRhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlNV9TdGF0ZU9wdFJlY0RhdGEgIG9wdGRhdGEgPQotICAgICAgKEdYVl9tb3J0X3N1YnRhYmxlX3R5cGU1X1N0YXRlT3B0UmVjRGF0YSlneHZhbGlkLT5zdGF0ZXRhYmxlLm9wdGRhdGE7Ci0KLQotICAgIGd4dl9TdGF0ZVRhYmxlX3N1YnRhYmxlX3NldHVwKCB0YWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1RhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUFycmF5X2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVRhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0KLSAgICBvcHRkYXRhLT5jbGFzc1RhYmxlID0gY2xhc3NUYWJsZTsKLSAgICBvcHRkYXRhLT5zdGF0ZUFycmF5ID0gc3RhdGVBcnJheTsKLSAgICBvcHRkYXRhLT5lbnRyeVRhYmxlID0gZW50cnlUYWJsZTsKLQotICAgIG9wdGRhdGEtPmNsYXNzVGFibGVfbGVuZ3RoX3AgPSBjbGFzc1RhYmxlX2xlbmd0aF9wOwotICAgIG9wdGRhdGEtPnN0YXRlQXJyYXlfbGVuZ3RoX3AgPSBzdGF0ZUFycmF5X2xlbmd0aF9wOwotICAgIG9wdGRhdGEtPmVudHJ5VGFibGVfbGVuZ3RoX3AgPSBlbnRyeVRhYmxlX2xlbmd0aF9wOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlNV9JbnNlcnRMaXN0X3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgLyoKLSAgICAgKiBXZSBkb24ndCBrbm93IHRoZSByYW5nZSBvZiBpbnNlcnRpb24tZ2x5cGgtbGlzdC4KLSAgICAgKiBTZXQgcmFuZ2UgYnkgd2hvbGUgb2Ygc3RhdGUgdGFibGUuCi0gICAgICovCi0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZSArIG9mZnNldDsKLQotICAgIEdYVl9tb3J0X3N1YnRhYmxlX3R5cGU1X1N0YXRlT3B0UmVjRGF0YSAgb3B0ZGF0YSA9Ci0gICAgICAoR1hWX21vcnRfc3VidGFibGVfdHlwZTVfU3RhdGVPcHRSZWNEYXRhKWd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YTsKLQotICAgIGlmICggb3B0ZGF0YS0+Y2xhc3NUYWJsZSA8IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIG9mZnNldCA8IG9wdGRhdGEtPmNsYXNzVGFibGUgKyAqKG9wdGRhdGEtPmNsYXNzVGFibGVfbGVuZ3RoX3ApICkKLSAgICAgIEdYVl9UUkFDRSgoICIgb2Zmc2V0IHJ1bnMgaW50byBDbGFzc1RhYmxlIiApKTsKLSAgICBpZiAoIG9wdGRhdGEtPnN0YXRlQXJyYXkgPCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBvZmZzZXQgPCBvcHRkYXRhLT5zdGF0ZUFycmF5ICsgKihvcHRkYXRhLT5zdGF0ZUFycmF5X2xlbmd0aF9wKSApCi0gICAgICBHWFZfVFJBQ0UoKCAiIG9mZnNldCBydW5zIGludG8gU3RhdGVBcnJheSIgKSk7Ci0gICAgaWYgKCBvcHRkYXRhLT5lbnRyeVRhYmxlIDwgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgb2Zmc2V0IDwgb3B0ZGF0YS0+ZW50cnlUYWJsZSArICoob3B0ZGF0YS0+ZW50cnlUYWJsZV9sZW5ndGhfcCkgKQotICAgICAgR1hWX1RSQUNFKCggIiBvZmZzZXQgcnVucyBpbnRvIEVudHJ5VGFibGUiICkpOwotCi0jaWZuZGVmIEdYVl9MT0FEX1RSQUNFX1ZBUlMKLSAgICBHWFZfTElNSVRfQ0hFQ0soIGNvdW50ICogMiApOwotI2Vsc2UKLSAgICB3aGlsZSAoIHAgPCB0YWJsZSArIG9mZnNldCArICggY291bnQgKiAyICkgKQotICAgIHsKLSAgICAgIEZUX1VTaG9ydCBpbnNlcnRfZ2x5cGhJRDsKLQotCi0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICAgIGluc2VydF9nbHlwaElEID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEdYVl9UUkFDRSgoICIgMHglMDR4IiwgaW5zZXJ0X2dseXBoSUQgKSk7Ci0gICAgfQotICAgIEdYVl9UUkFDRSgoICJcbiIgKSk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTVfZW50cnlfdmFsaWRhdGUoCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ciAgZ2x5cGhPZmZzZXQsCi0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0LAotICAgIEdYVl9WYWxpZGF0b3IgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgIEZUX0Jvb2wgICAgc2V0TWFyazsKLSAgICBGVF9Cb29sICAgIGRvbnRBZHZhbmNlOwotICAgIEZUX0Jvb2wgICAgY3VycmVudElzS2FzaGlkYUxpa2U7Ci0gICAgRlRfQm9vbCAgICBtYXJrZWRJc0thc2hpZGFMaWtlOwotICAgIEZUX0Jvb2wgICAgY3VycmVudEluc2VydEJlZm9yZTsKLSAgICBGVF9Cb29sICAgIG1hcmtlZEluc2VydEJlZm9yZTsKLSNlbmRpZgotICAgIEZUX0J5dGUgICAgY3VycmVudEluc2VydENvdW50OwotICAgIEZUX0J5dGUgICAgbWFya2VkSW5zZXJ0Q291bnQ7Ci0gICAgRlRfVVNob3J0ICBjdXJyZW50SW5zZXJ0TGlzdDsKLSAgICBGVF9VU2hvcnQgIG1hcmtlZEluc2VydExpc3Q7Ci0KLSAgICBGVF9VTlVTRUQoIHN0YXRlICk7Ci0KLQotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgc2V0TWFyayAgICAgICAgICAgICAgPSBGVF9CT09MKCAoIGZsYWdzID4+IDE1ICkgJiAxICk7Ci0gICAgZG9udEFkdmFuY2UgICAgICAgICAgPSBGVF9CT09MKCAoIGZsYWdzID4+IDE0ICkgJiAxICk7Ci0gICAgY3VycmVudElzS2FzaGlkYUxpa2UgPSBGVF9CT09MKCAoIGZsYWdzID4+IDEzICkgJiAxICk7Ci0gICAgbWFya2VkSXNLYXNoaWRhTGlrZSAgPSBGVF9CT09MKCAoIGZsYWdzID4+IDEyICkgJiAxICk7Ci0gICAgY3VycmVudEluc2VydEJlZm9yZSAgPSBGVF9CT09MKCAoIGZsYWdzID4+IDExICkgJiAxICk7Ci0gICAgbWFya2VkSW5zZXJ0QmVmb3JlICAgPSBGVF9CT09MKCAoIGZsYWdzID4+IDEwICkgJiAxICk7Ci0jZW5kaWYKLQotICAgIGN1cnJlbnRJbnNlcnRDb3VudCAgID0gKEZUX0J5dGUpKCAoIGZsYWdzID4+IDUgKSAmIDB4MUYgICApOwotICAgIG1hcmtlZEluc2VydENvdW50ICAgID0gKEZUX0J5dGUpKCAgIGZsYWdzICAgICAgICAmIDB4MDAxRiApOwotCi0gICAgY3VycmVudEluc2VydExpc3QgICAgPSAoRlRfVVNob3J0KSggZ2x5cGhPZmZzZXQtPnVsID4+IDE2ICk7Ci0gICAgbWFya2VkSW5zZXJ0TGlzdCAgICAgPSAoRlRfVVNob3J0KSggZ2x5cGhPZmZzZXQtPnVsICAgICAgICk7Ci0KLSAgICBpZiAoIDAgIT0gY3VycmVudEluc2VydExpc3QgJiYgMCAhPSBjdXJyZW50SW5zZXJ0Q291bnQgKQotICAgIHsKLSAgICAgIGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU1X0luc2VydExpc3RfdmFsaWRhdGUoIGN1cnJlbnRJbnNlcnRMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluc2VydENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBpZiAoIDAgIT0gbWFya2VkSW5zZXJ0TGlzdCAmJiAwICE9IG1hcmtlZEluc2VydENvdW50ICkKLSAgICB7Ci0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlNV9JbnNlcnRMaXN0X3ZhbGlkYXRlKCBtYXJrZWRJbnNlcnRMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VkSW5zZXJ0Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLSAgICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlNV9TdGF0ZU9wdFJlYyAgICAgIGV0X3JlYzsKLSAgICBHWFZfbW9ydF9zdWJ0YWJsZV90eXBlNV9TdGF0ZU9wdFJlY0RhdGEgIGV0ID0gJmV0X3JlYzsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJtb3J0IGNoYWluIHN1YnRhYmxlIHR5cGU1IChHbHlwaCBJbnNlcnRpb24pIiApOwotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCBHWFZfTU9SVF9TVUJUQUJMRV9UWVBFNV9IRUFERVJfU0laRSApOwotCi0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5vcHRkYXRhID0KLSAgICAgIGV0OwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUub3B0ZGF0YV9sb2FkX2Z1bmMgPQotICAgICAgTlVMTDsKLSAgICBneHZhbGlkLT5zdGF0ZXRhYmxlLnN1YnRhYmxlX3NldHVwX2Z1bmMgPQotICAgICAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTVfc3VidGFibGVfc2V0dXA7Ci0gICAgZ3h2YWxpZC0+c3RhdGV0YWJsZS5lbnRyeV9nbHlwaG9mZnNldF9mbXQgPQotICAgICAgR1hWX0dMWVBIT0ZGU0VUX1VMT05HOwotICAgIGd4dmFsaWQtPnN0YXRldGFibGUuZW50cnlfdmFsaWRhdGVfZnVuYyA9Ci0gICAgICBneHZfbW9ydF9zdWJ0YWJsZV90eXBlNV9lbnRyeV92YWxpZGF0ZTsKLQotICAgIGd4dl9TdGF0ZVRhYmxlX3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vcnguYyBiL3NyYy9neHZhbGlkL2d4dm1vcnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiNGYzYi4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZtb3J4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImd4dm1vcnguaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcngKLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlc192YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgblN1YnRhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLSAgICBHWFZfVmFsaWRhdGVfRnVuYyBmbXRfZnVuY3NfdGFibGVbXSA9Ci0gICAgewotICAgICAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTBfdmFsaWRhdGUsIC8qIDAgKi8KLSAgICAgIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX3ZhbGlkYXRlLCAvKiAxICovCi0gICAgICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMl92YWxpZGF0ZSwgLyogMiAqLwotICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgKi8KLSAgICAgIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGU0X3ZhbGlkYXRlLCAvKiA0ICovCi0gICAgICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV92YWxpZGF0ZSwgLyogNSAqLwotCi0gICAgfTsKLQotICAgIEZUX1VTaG9ydCAgaTsKLQotCi0gICAgR1hWX05BTUVfRU5URVIoICJzdWJ0YWJsZXMgaW4gYSBjaGFpbiIgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgblN1YnRhYmxlczsgaSsrICkKLSAgICB7Ci0gICAgICBHWFZfVmFsaWRhdGVfRnVuYyAgZnVuYzsKLQotICAgICAgRlRfVUxvbmcgIGxlbmd0aDsKLSAgICAgIEZUX1VMb25nICBjb3ZlcmFnZTsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgICAgRlRfVUxvbmcgIHN1YkZlYXR1cmVGbGFnczsKLSNlbmRpZgotICAgICAgRlRfVUxvbmcgIHR5cGU7Ci0gICAgICBGVF9VTG9uZyAgcmVzdDsKLQotCi0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDQgKyA0ICsgNCApOwotICAgICAgbGVuZ3RoICAgICAgICAgID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgICAgY292ZXJhZ2UgICAgICAgID0gRlRfTkVYVF9VTE9ORyggcCApOwotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgICBzdWJGZWF0dXJlRmxhZ3MgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0jZWxzZQotICAgICAgcCArPSA0OwotI2VuZGlmCi0KLSAgICAgIEdYVl9UUkFDRSgoICJ2YWxpZGF0aW5nIGNoYWluIHN1YnRhYmxlICVkLyVkICglZCBieXRlcylcbiIsCi0gICAgICAgICAgICAgICAgICBpICsgMSwgblN1YnRhYmxlcywgbGVuZ3RoICkpOwotCi0gICAgICB0eXBlID0gY292ZXJhZ2UgJiAweDAwMDc7Ci0gICAgICByZXN0ID0gbGVuZ3RoIC0gKCA0ICsgNCArIDQgKTsKLSAgICAgIEdYVl9MSU1JVF9DSEVDSyggcmVzdCApOwotCi0gICAgICAvKiBtb3J4IGNvdmVyYWdlIGNvbnNpc3RzIG9mIG1vcnRfY292ZXJhZ2UgJiAxNmJpdCBwYWRkaW5nICovCi0gICAgICBneHZfbW9ydF9jb3ZlcmFnZV92YWxpZGF0ZSggKEZUX1VTaG9ydCkoICggY292ZXJhZ2UgPj4gMTYgKSB8IGNvdmVyYWdlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApOwotICAgICAgaWYgKCB0eXBlID4gNSApCi0gICAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgICBmdW5jID0gZm10X2Z1bmNzX3RhYmxlW3R5cGVdOwotICAgICAgaWYgKCAhZnVuYyApCi0gICAgICAgIEdYVl9UUkFDRSgoICJtb3J4IHR5cGUgJWQgaXMgcmVzZXJ2ZWRcbiIsIHR5cGUgKSk7Ci0KLSAgICAgIGZ1bmMoIHAsIHAgKyByZXN0LCBneHZhbGlkICk7Ci0KLSAgICAgIC8qIFRPRE86IHN1YkZlYXR1cmVGbGFncyBzaG91bGQgYmUgdW5pcXVlIGluIGEgdGFibGU/ICovCi0gICAgICBwICs9IHJlc3Q7Ci0gICAgfQotCi0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gKEZUX1VMb25nKSggcCAtIHRhYmxlICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnhfY2hhaW5fdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBGVF9VTG9uZyAgZGVmYXVsdEZsYWdzOwotI2VuZGlmCi0gICAgRlRfVUxvbmcgIGNoYWluTGVuZ3RoOwotICAgIEZUX1VMb25nICBuRmVhdHVyZUZsYWdzOwotICAgIEZUX1VMb25nICBuU3VidGFibGVzOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIm1vcnggY2hhaW4gaGVhZGVyIiApOwotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCA0ICsgNCArIDQgKyA0ICk7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBkZWZhdWx0RmxhZ3MgID0gRlRfTkVYVF9VTE9ORyggcCApOwotI2Vsc2UKLSAgICBwICs9IDQ7Ci0jZW5kaWYKLSAgICBjaGFpbkxlbmd0aCAgID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgIG5GZWF0dXJlRmxhZ3MgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgblN1YnRhYmxlcyAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIC8qIGZlYXR1cmUtYXJyYXkgb2YgbW9yeCBpcyBzYW1lIHdpdGggdGhhdCBvZiBtb3J0ICovCi0gICAgZ3h2X21vcnRfZmVhdHVyZWFycmF5X3ZhbGlkYXRlKCBwLCBsaW1pdCwgbkZlYXR1cmVGbGFncywgZ3h2YWxpZCApOwotICAgIHAgKz0gZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoOwotCi0gICAgaWYgKCBuU3VidGFibGVzID49IDB4MTAwMDBMICkKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgIGd4dl9tb3J4X3N1YnRhYmxlc192YWxpZGF0ZSggcCwgdGFibGUgKyBjaGFpbkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VU2hvcnQpblN1YnRhYmxlcywgZ3h2YWxpZCApOwotCi0gICAgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoID0gY2hhaW5MZW5ndGg7Ci0KLSAgICAvKiBUT0RPOiBkZWZhdWx0RmxhZ3Mgc2hvdWxkIGJlIGNvbXBhcmVkIHdpdGggdGhlIGZsYWdzIGluIHRhYmxlcyAqLwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9tb3J4X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICBmdHZhbGlkICkKLSAgewotICAgIEdYVl9WYWxpZGF0b3JSZWMgIGd4dmFsaWRyZWM7Ci0gICAgR1hWX1ZhbGlkYXRvciAgICAgZ3h2YWxpZCA9ICZneHZhbGlkcmVjOwotICAgIEZUX0J5dGVzICAgICAgICAgIHAgICAgID0gdGFibGU7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgbGltaXQgPSAwOwotICAgIEZUX1VMb25nICAgICAgICAgIHZlcnNpb247Ci0gICAgRlRfVUxvbmcgICAgICAgICAgbkNoYWluczsKLSAgICBGVF9VTG9uZyAgICAgICAgICBpOwotCi0KLSAgICBneHZhbGlkLT5yb290ID0gZnR2YWxpZDsKLSAgICBneHZhbGlkLT5mYWNlID0gZmFjZTsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIGBtb3J4JyB0YWJsZVxuIiApKTsKLSAgICBHWFZfSU5JVDsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggNCArIDQgKTsKLSAgICB2ZXJzaW9uID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgIG5DaGFpbnMgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIHZlcnNpb24gIT0gMHgwMDAyMDAwMFVMICkKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBuQ2hhaW5zOyBpKysgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICJ2YWxpZGF0aW5nIGNoYWluICVkLyVkXG4iLCBpICsgMSwgbkNoYWlucyApKTsKLSAgICAgIEdYVl8zMkJJVF9BTElHTk1FTlRfVkFMSURBVEUoIHAgLSB0YWJsZSApOwotICAgICAgZ3h2X21vcnhfY2hhaW5fdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgICBwICs9IGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J4LmggYi9zcmMvZ3h2YWxpZC9neHZtb3J4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwY2VjNTguLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9yeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIGNvbW1vbiBkZWZpbml0aW9uIGZvciBtb3J4IHRhYmxlIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBHWFZNT1JYX0hfCi0jZGVmaW5lIEdYVk1PUlhfSF8KLQotCi0jaW5jbHVkZSAiZ3h2YWxpZC5oIgotI2luY2x1ZGUgImd4dmNvbW1uLmgiCi0jaW5jbHVkZSAiZ3h2bW9ydC5oIgotCi0jaW5jbHVkZSBGVF9TRk5UX05BTUVTX0gKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTBfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKLQotCi0jZW5kaWYgLyogR1hWTU9SWF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9yeDAuYyBiL3NyYy9neHZhbGlkL2d4dm1vcngwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTBhOTIuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9yeDAuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb3J4MC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgbW9yeCB0YWJsZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJvZHkgZm9yIHR5cGUwIChJbmRpYyBTY3JpcHQgUmVhcnJhbmdlbWVudCkgc3VidGFibGUuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImd4dm1vcnguaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcngKLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlKAotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgIEdYVl9YU3RhdGVUYWJsZV9HbHlwaE9mZnNldENQdHIgIGdseXBoT2Zmc2V0X3AsCi0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsCi0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgIEZUX1VTaG9ydCAgbWFya0ZpcnN0OwotICAgIEZUX1VTaG9ydCAgZG9udEFkdmFuY2U7Ci0gICAgRlRfVVNob3J0ICBtYXJrTGFzdDsKLSNlbmRpZgotICAgIEZUX1VTaG9ydCAgcmVzZXJ2ZWQ7Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBGVF9VU2hvcnQgIHZlcmI7Ci0jZW5kaWYKLQotICAgIEZUX1VOVVNFRCggc3RhdGUgKTsKLSAgICBGVF9VTlVTRUQoIGdseXBoT2Zmc2V0X3AgKTsKLSAgICBGVF9VTlVTRUQoIHRhYmxlICk7Ci0gICAgRlRfVU5VU0VEKCBsaW1pdCApOwotCi0KLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgIG1hcmtGaXJzdCAgID0gKEZUX1VTaG9ydCkoICggZmxhZ3MgPj4gMTUgKSAmIDEgKTsKLSAgICBkb250QWR2YW5jZSA9IChGVF9VU2hvcnQpKCAoIGZsYWdzID4+IDE0ICkgJiAxICk7Ci0gICAgbWFya0xhc3QgICAgPSAoRlRfVVNob3J0KSggKCBmbGFncyA+PiAxMyApICYgMSApOwotI2VuZGlmCi0KLSAgICByZXNlcnZlZCA9IChGVF9VU2hvcnQpKCBmbGFncyAmIDB4MUZGMCApOwotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgdmVyYiAgICAgPSAoRlRfVVNob3J0KSggZmxhZ3MgJiAweDAwMEYgKTsKLSNlbmRpZgotCi0gICAgaWYgKCAwIDwgcmVzZXJ2ZWQgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICIgbm9uLXplcm8gYml0cyBmb3VuZCBpbiByZXNlcnZlZCByYW5nZVxuIiApKTsKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUwX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUigKLSAgICAgICJtb3J4IGNoYWluIHN1YnRhYmxlIHR5cGUwIChJbmRpYy1TY3JpcHQgUmVhcnJhbmdlbWVudCkiICk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIEdYVl9TVEFURVRBQkxFX0hFQURFUl9TSVpFICk7Ci0KLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5vcHRkYXRhICAgICAgICAgICAgICAgPSBOVUxMOwotICAgIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLm9wdGRhdGFfbG9hZF9mdW5jICAgICA9IE5VTEw7Ci0gICAgZ3h2YWxpZC0+eHN0YXRldGFibGUuc3VidGFibGVfc2V0dXBfZnVuYyAgID0gTlVMTDsKLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5lbnRyeV9nbHlwaG9mZnNldF9mbXQgPSBHWFZfR0xZUEhPRkZTRVRfTk9ORTsKLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5lbnRyeV92YWxpZGF0ZV9mdW5jID0KLSAgICAgIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlOwotCi0gICAgZ3h2X1hTdGF0ZVRhYmxlX3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vcngxLmMgYi9zcmMvZ3h2YWxpZC9neHZtb3J4MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZlYmRiLi4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dm1vcngxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeDEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBib2R5IGZvciB0eXBlMSAoQ29udGV4dHVhbCBTdWJzdGl0dXRpb24pIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZtb3J4LmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb3J4Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX21vcnhfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWNfCi0gIHsKLSAgICBGVF9VTG9uZyAgIHN1YnN0aXR1dGlvblRhYmxlOwotICAgIEZUX1VMb25nICAgc3Vic3RpdHV0aW9uVGFibGVfbGVuZ3RoOwotICAgIEZUX1VTaG9ydCAgc3Vic3RpdHV0aW9uVGFibGVfbnVtX2xvb2t1cFRhYmxlczsKLQotICB9ICBHWFZfbW9yeF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlYywKLSAgICAqR1hWX21vcnhfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWNEYXRhOwotCi0KLSNkZWZpbmUgR1hWX01PUlhfU1VCVEFCTEVfVFlQRTFfSEVBREVSX1NJWkUgXAotICAgICAgICAgICggR1hWX1NUQVRFVEFCTEVfSEVBREVSX1NJWkUgKyAyICkKLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX3N1YnN0aXR1dGlvblRhYmxlX2xvYWQoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0gICAgR1hWX21vcnhfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWNEYXRhICBvcHRkYXRhID0KLSAgICAgIChHWFZfbW9yeF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlY0RhdGEpZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YTsKLQotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgb3B0ZGF0YS0+c3Vic3RpdHV0aW9uVGFibGUgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMV9zdWJ0YWJsZV9zZXR1cCggRlRfVUxvbmcgICAgICAgdGFibGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIGNsYXNzVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgZW50cnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIGNsYXNzVGFibGVfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICBzdGF0ZUFycmF5X2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgZW50cnlUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfVUxvbmcgIG9bNF07Ci0gICAgRlRfVUxvbmcgICpsWzRdOwotICAgIEZUX1VMb25nICBidWZmWzVdOwotCi0gICAgR1hWX21vcnhfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWNEYXRhICBvcHRkYXRhID0KLSAgICAgIChHWFZfbW9yeF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlY0RhdGEpZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YTsKLQotCi0gICAgb1swXSA9IGNsYXNzVGFibGU7Ci0gICAgb1sxXSA9IHN0YXRlQXJyYXk7Ci0gICAgb1syXSA9IGVudHJ5VGFibGU7Ci0gICAgb1szXSA9IG9wdGRhdGEtPnN1YnN0aXR1dGlvblRhYmxlOwotICAgIGxbMF0gPSBjbGFzc1RhYmxlX2xlbmd0aF9wOwotICAgIGxbMV0gPSBzdGF0ZUFycmF5X2xlbmd0aF9wOwotICAgIGxbMl0gPSBlbnRyeVRhYmxlX2xlbmd0aF9wOwotICAgIGxbM10gPSAmKG9wdGRhdGEtPnN1YnN0aXR1dGlvblRhYmxlX2xlbmd0aCk7Ci0KLSAgICBneHZfc2V0X2xlbmd0aF9ieV91bG9uZ19vZmZzZXQoIG8sIGwsIGJ1ZmYsIDQsIHRhYmxlX3NpemUsIGd4dmFsaWQgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTFfZW50cnlfdmFsaWRhdGUoCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ciAgZ2x5cGhPZmZzZXRfcCwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAotICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgICAgICAgICAgICAgICAgICBneHZhbGlkICkKLSAgewotI2lmZGVmIEdYVl9MT0FEX1RSQUNFX1ZBUlMKLSAgICBGVF9VU2hvcnQgIHNldE1hcms7Ci0gICAgRlRfVVNob3J0ICBkb250QWR2YW5jZTsKLSNlbmRpZgotICAgIEZUX1VTaG9ydCAgcmVzZXJ2ZWQ7Ci0gICAgRlRfU2hvcnQgICBtYXJrSW5kZXg7Ci0gICAgRlRfU2hvcnQgICBjdXJyZW50SW5kZXg7Ci0KLSAgICBHWFZfbW9yeF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlY0RhdGEgIG9wdGRhdGEgPQotICAgICAgKEdYVl9tb3J4X3N1YnRhYmxlX3R5cGUxX1N0YXRlT3B0UmVjRGF0YSlneHZhbGlkLT54c3RhdGV0YWJsZS5vcHRkYXRhOwotCi0gICAgRlRfVU5VU0VEKCBzdGF0ZSApOwotICAgIEZUX1VOVVNFRCggdGFibGUgKTsKLSAgICBGVF9VTlVTRUQoIGxpbWl0ICk7Ci0KLQotI2lmZGVmIEdYVl9MT0FEX1RSQUNFX1ZBUlMKLSAgICBzZXRNYXJrICAgICAgPSAoRlRfVVNob3J0KSggKCBmbGFncyA+PiAxNSApICYgMSApOwotICAgIGRvbnRBZHZhbmNlICA9IChGVF9VU2hvcnQpKCAoIGZsYWdzID4+IDE0ICkgJiAxICk7Ci0jZW5kaWYKLQotICAgIHJlc2VydmVkID0gKEZUX1VTaG9ydCkoIGZsYWdzICYgMHgzRkZGICk7Ci0KLSAgICBtYXJrSW5kZXggICAgPSAoRlRfU2hvcnQpKCBnbHlwaE9mZnNldF9wLT51bCA+PiAxNiApOwotICAgIGN1cnJlbnRJbmRleCA9IChGVF9TaG9ydCkoIGdseXBoT2Zmc2V0X3AtPnVsICAgICAgICk7Ci0KLSAgICBHWFZfVFJBQ0UoKCAiIHNldE1hcms9JTAxZCBkb250QWR2YW5jZT0lMDFkXG4iLAotICAgICAgICAgICAgICAgIHNldE1hcmssIGRvbnRBZHZhbmNlICkpOwotCi0gICAgaWYgKCAwIDwgcmVzZXJ2ZWQgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICIgbm9uLXplcm8gYml0cyBmb3VuZCBpbiByZXNlcnZlZCByYW5nZVxuIiApKTsKLSAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX0RBVEEgKTsKLSAgICB9Ci0KLSAgICBHWFZfVFJBQ0UoKCAibWFya0luZGV4ID0gJWQsIGN1cnJlbnRJbmRleCA9ICVkXG4iLAotICAgICAgICAgICAgICAgIG1hcmtJbmRleCwgY3VycmVudEluZGV4ICkpOwotCi0gICAgaWYgKCBvcHRkYXRhLT5zdWJzdGl0dXRpb25UYWJsZV9udW1fbG9va3VwVGFibGVzIDwgbWFya0luZGV4ICsgMSApCi0gICAgICBvcHRkYXRhLT5zdWJzdGl0dXRpb25UYWJsZV9udW1fbG9va3VwVGFibGVzID0KLSAgICAgICAgKEZUX1VTaG9ydCkoIG1hcmtJbmRleCArIDEgKTsKLQotICAgIGlmICggb3B0ZGF0YS0+c3Vic3RpdHV0aW9uVGFibGVfbnVtX2xvb2t1cFRhYmxlcyA8IGN1cnJlbnRJbmRleCArIDEgKQotICAgICAgb3B0ZGF0YS0+c3Vic3RpdHV0aW9uVGFibGVfbnVtX2xvb2t1cFRhYmxlcyA9Ci0gICAgICAgIChGVF9VU2hvcnQpKCBjdXJyZW50SW5kZXggKyAxICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX0xvb2t1cFZhbHVlX3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9Mb29rdXBWYWx1ZUNQdHIgIHZhbHVlX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICAgICAgICBneHZhbGlkICkKLSAgewotICAgIEZUX1VOVVNFRCggZ2x5cGggKTsgLyogZm9yIHRoZSBub24tZGVidWdnaW5nIGNhc2UgKi8KLQotICAgIEdYVl9UUkFDRSgoICJtb3J4IHN1YnRhYmxlIHR5cGUxIHN1YnN0LjogJWQgLT4gJWRcbiIsIGdseXBoLCB2YWx1ZV9wLT51ICkpOwotCi0gICAgaWYgKCB2YWx1ZV9wLT51ID4gZ3h2YWxpZC0+ZmFjZS0+bnVtX2dseXBocyApCi0gICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICB9Ci0KLQotICBzdGF0aWMgR1hWX0xvb2t1cFZhbHVlRGVzYwotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMV9Mb29rdXBGbXQ0X3RyYW5zaXQoCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgcmVsYXRpdmVfZ2luZGV4LAotICAgIEdYVl9Mb29rdXBWYWx1ZUNQdHIgIGJhc2VfdmFsdWVfcCwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBsb29rdXB0YmxfbGltaXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICBwOwotICAgIEZUX0J5dGVzICAgICAgICAgICAgIGxpbWl0OwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgIG9mZnNldDsKLSAgICBHWFZfTG9va3VwVmFsdWVEZXNjICB2YWx1ZTsKLQotICAgIC8qIFhYWDogY2hlY2sgcmFuZ2U/ICovCi0gICAgb2Zmc2V0ID0gKEZUX1VTaG9ydCkoIGJhc2VfdmFsdWVfcC0+dSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlX2dpbmRleCAqIHNpemVvZiAoIEZUX1VTaG9ydCApICk7Ci0KLSAgICBwICAgICA9IGd4dmFsaWQtPmxvb2t1cHRibF9oZWFkICsgb2Zmc2V0OwotICAgIGxpbWl0ID0gbG9va3VwdGJsX2xpbWl0OwotCi0gICAgR1hWX0xJTUlUX0NIRUNLICggMiApOwotICAgIHZhbHVlLnUgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLQotICAvKgotICAgKiBUT0RPOiBsZW5ndGggc2hvdWxkIGJlIGxpbWl0PwotICAgKiovCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX3N1YnN0aXR1dGlvblRhYmxlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgIHAgPSB0YWJsZTsKLSAgICBGVF9VU2hvcnQgIGk7Ci0KLSAgICBHWFZfbW9yeF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlY0RhdGEgIG9wdGRhdGEgPQotICAgICAgKEdYVl9tb3J4X3N1YnRhYmxlX3R5cGUxX1N0YXRlT3B0UmVjRGF0YSlneHZhbGlkLT54c3RhdGV0YWJsZS5vcHRkYXRhOwotCi0KLSAgICAvKiBUT0RPOiBjYWxjdWxhdGUgb2Zmc2V0L2xlbmd0aCBmb3IgZWFjaCBsb29rdXBUYWJsZXMgKi8KLSAgICBneHZhbGlkLT5sb29rdXB2YWxfc2lnbiAgID0gR1hWX0xPT0tVUFZBTFVFX1VOU0lHTkVEOwotICAgIGd4dmFsaWQtPmxvb2t1cHZhbF9mdW5jICAgPSBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMV9Mb29rdXBWYWx1ZV92YWxpZGF0ZTsKLSAgICBneHZhbGlkLT5sb29rdXBmbXQ0X3RyYW5zID0gZ3h2X21vcnhfc3VidGFibGVfdHlwZTFfTG9va3VwRm10NF90cmFuc2l0OwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBvcHRkYXRhLT5zdWJzdGl0dXRpb25UYWJsZV9udW1fbG9va3VwVGFibGVzOyBpKysgKQotICAgIHsKLSAgICAgIEZUX1VMb25nICBvZmZzZXQ7Ci0KLQotICAgICAgR1hWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgICBvZmZzZXQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGd4dl9Mb29rdXBUYWJsZV92YWxpZGF0ZSggdGFibGUgKyBvZmZzZXQsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgfQotCi0gICAgLyogVE9ETzogb3ZlcmxhcHBpbmcgb2YgbG9va3VwVGFibGVzIGluIHN1YnN0aXR1dGlvblRhYmxlICovCi0gIH0KLQotCi0gIC8qCi0gICAqIHN1YnRhYmxlIGZvciBDb250ZXh0dWFsIGdseXBoIHN1YnN0aXR1dGlvbiBpcyBhIG1vZGlmaWVkIFN0YXRlVGFibGUuCi0gICAqIEluIGFkZGl0aW9uIHRvIGNsYXNzVGFibGUsIHN0YXRlQXJyYXksIGVudHJ5VGFibGUsIHRoZSBmaWVsZAotICAgKiBgc3Vic3RpdHV0aW9uVGFibGUnIGlzIGFkZGVkLgotICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTFfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLSAgICBHWFZfbW9yeF9zdWJ0YWJsZV90eXBlMV9TdGF0ZU9wdFJlYyAgc3RfcmVjOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIm1vcnggY2hhaW4gc3VidGFibGUgdHlwZTEgKENvbnRleHR1YWwgR2x5cGggU3Vic3QpIiApOwotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCBHWFZfTU9SWF9TVUJUQUJMRV9UWVBFMV9IRUFERVJfU0laRSApOwotCi0gICAgc3RfcmVjLnN1YnN0aXR1dGlvblRhYmxlX251bV9sb29rdXBUYWJsZXMgPSAwOwotCi0gICAgZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YSA9Ci0gICAgICAmc3RfcmVjOwotICAgIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLm9wdGRhdGFfbG9hZF9mdW5jID0KLSAgICAgIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX3N1YnN0aXR1dGlvblRhYmxlX2xvYWQ7Ci0gICAgZ3h2YWxpZC0+eHN0YXRldGFibGUuc3VidGFibGVfc2V0dXBfZnVuYyA9Ci0gICAgICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMV9zdWJ0YWJsZV9zZXR1cDsKLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5lbnRyeV9nbHlwaG9mZnNldF9mbXQgPQotICAgICAgR1hWX0dMWVBIT0ZGU0VUX1VMT05HOwotICAgIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLmVudHJ5X3ZhbGlkYXRlX2Z1bmMgPQotICAgICAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTFfZW50cnlfdmFsaWRhdGU7Ci0KLSAgICBneHZfWFN0YXRlVGFibGVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMV9zdWJzdGl0dXRpb25UYWJsZV92YWxpZGF0ZSgKLSAgICAgIHRhYmxlICsgc3RfcmVjLnN1YnN0aXR1dGlvblRhYmxlLAotICAgICAgdGFibGUgKyBzdF9yZWMuc3Vic3RpdHV0aW9uVGFibGUgKyBzdF9yZWMuc3Vic3RpdHV0aW9uVGFibGVfbGVuZ3RoLAotICAgICAgZ3h2YWxpZCApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vcngyLmMgYi9zcmMvZ3h2YWxpZC9neHZtb3J4Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTYwY2Y2Li4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dm1vcngyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeDIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBib2R5IGZvciB0eXBlMiAoTGlnYXR1cmUgU3Vic3RpdHV0aW9uKSBzdWJ0YWJsZS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZtb3J4LmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb3J4Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX21vcnhfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNfCi0gIHsKLSAgICBGVF9VTG9uZyAgbGlnQWN0aW9uVGFibGU7Ci0gICAgRlRfVUxvbmcgIGNvbXBvbmVudFRhYmxlOwotICAgIEZUX1VMb25nICBsaWdhdHVyZVRhYmxlOwotICAgIEZUX1VMb25nICBsaWdBY3Rpb25UYWJsZV9sZW5ndGg7Ci0gICAgRlRfVUxvbmcgIGNvbXBvbmVudFRhYmxlX2xlbmd0aDsKLSAgICBGVF9VTG9uZyAgbGlnYXR1cmVUYWJsZV9sZW5ndGg7Ci0KLSAgfSAgR1hWX21vcnhfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWMsCi0gICAgKkdYVl9tb3J4X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjRGF0YTsKLQotCi0jZGVmaW5lIEdYVl9NT1JYX1NVQlRBQkxFX1RZUEUyX0hFQURFUl9TSVpFIFwKLSAgICAgICAgICAoIEdYVl9YU1RBVEVUQUJMRV9IRUFERVJfU0laRSArIDQgKyA0ICsgNCApCi0KLQotICBzdGF0aWMgdm9pZAotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMl9vcHR0YWJsZV9sb2FkKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLQotICAgIEdYVl9tb3J4X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjRGF0YSAgb3B0ZGF0YSA9Ci0gICAgICAoR1hWX21vcnhfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNEYXRhKWd4dmFsaWQtPnhzdGF0ZXRhYmxlLm9wdGRhdGE7Ci0KLQotICAgIEdYVl9MSU1JVF9DSEVDSyggNCArIDQgKyA0ICk7Ci0gICAgb3B0ZGF0YS0+bGlnQWN0aW9uVGFibGUgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgb3B0ZGF0YS0+Y29tcG9uZW50VGFibGUgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgb3B0ZGF0YS0+bGlnYXR1cmVUYWJsZSAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBHWFZfVFJBQ0UoKCAib2Zmc2V0IHRvIGxpZ0FjdGlvblRhYmxlPTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICBvcHRkYXRhLT5saWdBY3Rpb25UYWJsZSApKTsKLSAgICBHWFZfVFJBQ0UoKCAib2Zmc2V0IHRvIGNvbXBvbmVudFRhYmxlPTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICBvcHRkYXRhLT5jb21wb25lbnRUYWJsZSApKTsKLSAgICBHWFZfVFJBQ0UoKCAib2Zmc2V0IHRvIGxpZ2F0dXJlVGFibGU9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGUgKSk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX3N1YnRhYmxlX3NldHVwKCBGVF9VTG9uZyAgICAgICB0YWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgY2xhc3NUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIHN0YXRlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBlbnRyeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgY2xhc3NUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIHN0YXRlQXJyYXlfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICBlbnRyeVRhYmxlX2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9VTG9uZyAgIG9bNl07Ci0gICAgRlRfVUxvbmcqICBsWzZdOwotICAgIEZUX1VMb25nICAgYnVmZls3XTsKLQotICAgIEdYVl9tb3J4X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjRGF0YSAgb3B0ZGF0YSA9Ci0gICAgICAoR1hWX21vcnhfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNEYXRhKWd4dmFsaWQtPnhzdGF0ZXRhYmxlLm9wdGRhdGE7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAic3VidGFibGUgYm91bmRhcmllcyBzZXR1cCIgKTsKLQotICAgIG9bMF0gPSBjbGFzc1RhYmxlOwotICAgIG9bMV0gPSBzdGF0ZUFycmF5OwotICAgIG9bMl0gPSBlbnRyeVRhYmxlOwotICAgIG9bM10gPSBvcHRkYXRhLT5saWdBY3Rpb25UYWJsZTsKLSAgICBvWzRdID0gb3B0ZGF0YS0+Y29tcG9uZW50VGFibGU7Ci0gICAgb1s1XSA9IG9wdGRhdGEtPmxpZ2F0dXJlVGFibGU7Ci0gICAgbFswXSA9IGNsYXNzVGFibGVfbGVuZ3RoX3A7Ci0gICAgbFsxXSA9IHN0YXRlQXJyYXlfbGVuZ3RoX3A7Ci0gICAgbFsyXSA9IGVudHJ5VGFibGVfbGVuZ3RoX3A7Ci0gICAgbFszXSA9ICYob3B0ZGF0YS0+bGlnQWN0aW9uVGFibGVfbGVuZ3RoKTsKLSAgICBsWzRdID0gJihvcHRkYXRhLT5jb21wb25lbnRUYWJsZV9sZW5ndGgpOwotICAgIGxbNV0gPSAmKG9wdGRhdGEtPmxpZ2F0dXJlVGFibGVfbGVuZ3RoKTsKLQotICAgIGd4dl9zZXRfbGVuZ3RoX2J5X3Vsb25nX29mZnNldCggbywgbCwgYnVmZiwgNiwgdGFibGVfc2l6ZSwgZ3h2YWxpZCApOwotCi0gICAgR1hWX1RSQUNFKCggImNsYXNzVGFibGU6IG9mZnNldD0weCUwOHggbGVuZ3RoPTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICBjbGFzc1RhYmxlLCAqY2xhc3NUYWJsZV9sZW5ndGhfcCApKTsKLSAgICBHWFZfVFJBQ0UoKCAic3RhdGVBcnJheTogb2Zmc2V0PTB4JTA4eCBsZW5ndGg9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgIHN0YXRlQXJyYXksICpzdGF0ZUFycmF5X2xlbmd0aF9wICkpOwotICAgIEdYVl9UUkFDRSgoICJlbnRyeVRhYmxlOiBvZmZzZXQ9MHglMDh4IGxlbmd0aD0weCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgZW50cnlUYWJsZSwgKmVudHJ5VGFibGVfbGVuZ3RoX3AgKSk7Ci0gICAgR1hWX1RSQUNFKCggImxpZ0FjdGlvblRhYmxlOiBvZmZzZXQ9MHglMDh4IGxlbmd0aD0weCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgb3B0ZGF0YS0+bGlnQWN0aW9uVGFibGUsCi0gICAgICAgICAgICAgICAgb3B0ZGF0YS0+bGlnQWN0aW9uVGFibGVfbGVuZ3RoICkpOwotICAgIEdYVl9UUkFDRSgoICJjb21wb25lbnRUYWJsZTogb2Zmc2V0PTB4JTA4eCBsZW5ndGg9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmNvbXBvbmVudFRhYmxlLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmNvbXBvbmVudFRhYmxlX2xlbmd0aCApKTsKLSAgICBHWFZfVFJBQ0UoKCAibGlnYXR1cmVUYWJsZTogIG9mZnNldD0weCUwOHggbGVuZ3RoPTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICBvcHRkYXRhLT5saWdhdHVyZVRhYmxlLAotICAgICAgICAgICAgICAgIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGVfbGVuZ3RoICkpOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0jZGVmaW5lIEdYVl9NT1JYX0xJR0FDVElPTl9FTlRSWV9TSVpFICA0Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMl9saWdBY3Rpb25JbmRleF92YWxpZGF0ZSgKLSAgICBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICBGVF9VU2hvcnQgICAgICBsaWdBY3Rpb25JbmRleCwKLSAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIC8qIGFjY2VzcyBsaWdBY3Rpb25UYWJsZSAqLwotICAgIEdYVl9tb3J4X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjRGF0YSBvcHRkYXRhID0KLSAgICAgIChHWFZfbW9yeF9zdWJ0YWJsZV90eXBlMl9TdGF0ZU9wdFJlY0RhdGEpZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YTsKLQotICAgIEZUX0J5dGVzIGxhdF9iYXNlICA9IHRhYmxlICsgb3B0ZGF0YS0+bGlnQWN0aW9uVGFibGU7Ci0gICAgRlRfQnl0ZXMgcCAgICAgICAgID0gbGF0X2Jhc2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ0FjdGlvbkluZGV4ICogR1hWX01PUlhfTElHQUNUSU9OX0VOVFJZX1NJWkU7Ci0gICAgRlRfQnl0ZXMgbGF0X2xpbWl0ID0gbGF0X2Jhc2UgKyBvcHRkYXRhLT5saWdBY3Rpb25UYWJsZTsKLQotCi0gICAgaWYgKCBwIDwgbGF0X2Jhc2UgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICJwIDwgbGF0X2Jhc2UgKCVkIGJ5dGUgcmV3aW5kKVxuIiwgbGF0X2Jhc2UgLSBwICkpOwotICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBsYXRfbGltaXQgPCBwICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAibGF0X2xpbWl0IDwgcCAoJWQgYnl0ZSBvdmVycnVuKVxuIiwgcCAtIGxhdF9saW1pdCApKTsKLSAgICAgIEZUX0lOVkFMSURfT0ZGU0VUOwotICAgIH0KLQotICAgIHsKLSAgICAgIC8qIHZhbGlkYXRlIGVudHJ5IGluIGxpZ0FjdGlvblRhYmxlICovCi0gICAgICBGVF9VTG9uZyAgIGxpZ19hY3Rpb247Ci0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICAgIEZUX1VTaG9ydCAgbGFzdDsKLSAgICAgIEZUX1VTaG9ydCAgc3RvcmU7Ci0jZW5kaWYKLSAgICAgIEZUX1VMb25nICAgb2Zmc2V0OwotICAgICAgRlRfTG9uZyAgICBnaWRfbGltaXQ7Ci0KLQotICAgICAgbGlnX2FjdGlvbiA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgICAgbGFzdCAgICAgICA9IChGVF9VU2hvcnQpKCAoIGxpZ19hY3Rpb24gPj4gMzEgKSAmIDEgKTsKLSAgICAgIHN0b3JlICAgICAgPSAoRlRfVVNob3J0KSggKCBsaWdfYWN0aW9uID4+IDMwICkgJiAxICk7Ci0jZW5kaWYKLQotICAgICAgb2Zmc2V0ID0gbGlnX2FjdGlvbiAmIDB4M0ZGRkZGRkZVTDsKLQotICAgICAgLyogdGhpcyBvZmZzZXQgaXMgMzAtYml0IHNpZ25lZCB2YWx1ZSB0byBhZGQgdG8gR0lEICovCi0gICAgICAvKiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbG9jYXRpb24gb2Zmc2V0IGluIG1vcnQgKi8KLSAgICAgIGlmICggKCBvZmZzZXQgJiAweDNGRkYwMDAwVUwgKSA9PSAweDNGRkYwMDAwVUwgKQotICAgICAgeyAvKiBuZWdhdGl2ZSBvZmZzZXQgKi8KLSAgICAgICAgZ2lkX2xpbWl0ID0gZ3h2YWxpZC0+ZmFjZS0+bnVtX2dseXBocyAtCi0gICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKSggb2Zmc2V0ICYgMHgwMDAwRkZGRlVMICk7Ci0gICAgICAgIGlmICggZ2lkX2xpbWl0ID4gMCApCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEdYVl9UUkFDRSgoICJsaWdhdHVyZSBhY3Rpb24gdGFibGUgaW5jbHVkZXMiCi0gICAgICAgICAgICAgICAgICAgICIgdG9vIG5lZ2F0aXZlIG9mZnNldCBtb3ZpbmcgYWxsIEdJRCIKLSAgICAgICAgICAgICAgICAgICAgIiBiZWxvdyBkZWZpbmVkIHJhbmdlOiAweCUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgIG9mZnNldCAmIDB4RkZGRlUgKSk7Ci0gICAgICAgIEdYVl9TRVRfRVJSX0lGX1BBUkFOT0lEKCBGVF9JTlZBTElEX09GRlNFVCApOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoICggb2Zmc2V0ICYgMHgzRkZGMDAwMFVMICkgPT0gMHgwMDAwMDAwMFVMICkKLSAgICAgIHsgLyogcG9zaXRpdmUgb2Zmc2V0ICovCi0gICAgICAgIGlmICggKEZUX0xvbmcpb2Zmc2V0IDwgZ3h2YWxpZC0+ZmFjZS0+bnVtX2dseXBocyApCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEdYVl9UUkFDRSgoICJsaWdhdHVyZSBhY3Rpb24gdGFibGUgaW5jbHVkZXMiCi0gICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIG9mZnNldCBtb3ZpbmcgYWxsIEdJRCIKLSAgICAgICAgICAgICAgICAgICAgIiBvdmVyIGRlZmluZWQgcmFuZ2U6IDB4JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICYgMHhGRkZGVSApKTsKLSAgICAgICAgR1hWX1NFVF9FUlJfSUZfUEFSQU5PSUQoIEZUX0lOVkFMSURfT0ZGU0VUICk7Ci0gICAgICB9Ci0KLSAgICAgIEdYVl9UUkFDRSgoICJsaWdhdHVyZSBhY3Rpb24gdGFibGUgaW5jbHVkZXMiCi0gICAgICAgICAgICAgICAgICAiIGludmFsaWQgb2Zmc2V0IHRvIGFkZCB0byAxNi1iaXQgR0lEOiIKLSAgICAgICAgICAgICAgICAgICIgMHglMDh4XG4iLCBvZmZzZXQgKSk7Ci0gICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9PRkZTRVQgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX2VudHJ5X3ZhbGlkYXRlKAotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICBHWFZfU3RhdGVUYWJsZV9HbHlwaE9mZnNldENQdHIgIGdseXBoT2Zmc2V0X3AsCi0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0LAotICAgIEdYVl9WYWxpZGF0b3IgICAgICAgICAgICAgICAgICAgZ3h2YWxpZCApCi0gIHsKLSNpZmRlZiBHWFZfTE9BRF9VTlVTRURfVkFSUwotICAgIEZUX1VTaG9ydCAgc2V0Q29tcG9uZW50OwotICAgIEZUX1VTaG9ydCAgZG9udEFkdmFuY2U7Ci0gICAgRlRfVVNob3J0ICBwZXJmb3JtQWN0aW9uOwotI2VuZGlmCi0gICAgRlRfVVNob3J0ICByZXNlcnZlZDsKLSAgICBGVF9VU2hvcnQgIGxpZ0FjdGlvbkluZGV4OwotCi0gICAgRlRfVU5VU0VEKCBzdGF0ZSApOwotICAgIEZUX1VOVVNFRCggbGltaXQgKTsKLQotCi0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBzZXRDb21wb25lbnQgICA9IChGVF9VU2hvcnQpKCAoIGZsYWdzID4+IDE1ICkgJiAxICk7Ci0gICAgZG9udEFkdmFuY2UgICAgPSAoRlRfVVNob3J0KSggKCBmbGFncyA+PiAxNCApICYgMSApOwotICAgIHBlcmZvcm1BY3Rpb24gID0gKEZUX1VTaG9ydCkoICggZmxhZ3MgPj4gMTMgKSAmIDEgKTsKLSNlbmRpZgotCi0gICAgcmVzZXJ2ZWQgICAgICAgPSAoRlRfVVNob3J0KSggZmxhZ3MgJiAweDFGRkYgKTsKLSAgICBsaWdBY3Rpb25JbmRleCA9IGdseXBoT2Zmc2V0X3AtPnU7Ci0KLSAgICBpZiAoIHJlc2VydmVkID4gMCApCi0gICAgICBHWFZfVFJBQ0UoKCAiICByZXNlcnZlZCAxNGJpdCBpcyBub24temVyb1xuIiApKTsKLQotICAgIGlmICggMCA8IGxpZ0FjdGlvbkluZGV4ICkKLSAgICAgIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX2xpZ0FjdGlvbkluZGV4X3ZhbGlkYXRlKAotICAgICAgICB0YWJsZSwgbGlnQWN0aW9uSW5kZXgsIGd4dmFsaWQgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTJfbGlnYXR1cmVUYWJsZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgR1hWX21vcnhfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNEYXRhICBvcHRkYXRhID0KLSAgICAgIChHWFZfbW9yeF9zdWJ0YWJsZV90eXBlMl9TdGF0ZU9wdFJlY0RhdGEpZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YTsKLQotICAgIEZUX0J5dGVzIHAgICAgID0gdGFibGUgKyBvcHRkYXRhLT5saWdhdHVyZVRhYmxlOwotICAgIEZUX0J5dGVzIGxpbWl0ID0gdGFibGUgKyBvcHRkYXRhLT5saWdhdHVyZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIG9wdGRhdGEtPmxpZ2F0dXJlVGFibGVfbGVuZ3RoOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIm1vcnggY2hhaW4gc3VidGFibGUgdHlwZTIgLSBzdWJzdGl0dXRpb25UYWJsZSIgKTsKLQotICAgIGlmICggMCAhPSBvcHRkYXRhLT5saWdhdHVyZVRhYmxlICkKLSAgICB7Ci0gICAgICAvKiBBcHBsZSBkb2VzIG5vdCBnaXZlIHNwZWNpZmljYXRpb24gb2YgbGlnYXR1cmVUYWJsZSBmb3JtYXQgKi8KLSAgICAgIHdoaWxlICggcCA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfVVNob3J0ICBsaWdfZ2lkOwotCi0KLSAgICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICAgIGxpZ19naWQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBpZiAoIGxpZ19naWQgPCBneHZhbGlkLT5mYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgICAgICBHWFZfU0VUX0VSUl9JRl9QQVJBTk9JRCggRlRfSU5WQUxJRF9HTFlQSF9JRCApOwotICAgICAgfQotICAgIH0KLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLQotICAgIEdYVl9tb3J4X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjICBsaWdfcmVjOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggIm1vcnggY2hhaW4gc3VidGFibGUgdHlwZTIgKExpZ2F0dXJlIFN1YnN0aXR1dGlvbikiICk7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIEdYVl9NT1JYX1NVQlRBQkxFX1RZUEUyX0hFQURFUl9TSVpFICk7Ci0KLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5vcHRkYXRhID0KLSAgICAgICZsaWdfcmVjOwotICAgIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLm9wdGRhdGFfbG9hZF9mdW5jID0KLSAgICAgIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX29wdHRhYmxlX2xvYWQ7Ci0gICAgZ3h2YWxpZC0+eHN0YXRldGFibGUuc3VidGFibGVfc2V0dXBfZnVuYyA9Ci0gICAgICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlMl9zdWJ0YWJsZV9zZXR1cDsKLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5lbnRyeV9nbHlwaG9mZnNldF9mbXQgPQotICAgICAgR1hWX0dMWVBIT0ZGU0VUX1VTSE9SVDsKLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5lbnRyeV92YWxpZGF0ZV9mdW5jID0KLSAgICAgIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUyX2VudHJ5X3ZhbGlkYXRlOwotCi0gICAgZ3h2X1hTdGF0ZVRhYmxlX3ZhbGlkYXRlKCBwLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0jaWYgMAotICAgIHAgKz0gZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoOwotI2VuZGlmCi0gICAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTJfbGlnYXR1cmVUYWJsZV92YWxpZGF0ZSggdGFibGUsIGd4dmFsaWQgKTsKLQotICAgIEdYVl9FWElUOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J4NC5jIGIvc3JjL2d4dmFsaWQvZ3h2bW9yeDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1NTU2OC4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZtb3J4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeDQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBib2R5IGZvciAibW9yeCIgdHlwZTQgKE5vbi1Db250ZXh0dWFsIEdseXBoIFN1YnN0aXR1dGlvbikgc3VidGFibGUuICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZtb3J4LmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb3J4Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlNF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgR1hWX05BTUVfRU5URVIoICJtb3J4IGNoYWluIHN1YnRhYmxlIHR5cGU0ICIKLSAgICAgICAgICAgICAgICAgICAgIihOb24tQ29udGV4dHVhbCBHbHlwaCBTdWJzdGl0dXRpb24pIiApOwotCi0gICAgZ3h2X21vcnRfc3VidGFibGVfdHlwZTRfdmFsaWRhdGUoIHRhYmxlLCBsaW1pdCwgZ3h2YWxpZCApOwotCi0gICAgR1hWX0VYSVQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vcng1LmMgYi9zcmMvZ3h2YWxpZC9neHZtb3J4NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWMxMTQxLi4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dm1vcng1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeDUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBib2R5IGZvciB0eXBlNSAoQ29udGV4dHVhbCBHbHlwaCBJbnNlcnRpb24pIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJneHZtb3J4LmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb3J4Ci0KLQotICAvKgotICAgKiBgbW9yeCcgc3VidGFibGUgdHlwZTUgKENvbnRleHR1YWwgR2x5cGggSW5zZXJ0aW9uKQotICAgKiBoYXMgZm9ybWF0IG9mIGEgU3RhdGVUYWJsZSB3aXRoIGluc2VydGlvbi1nbHlwaC1saXN0Ci0gICAqIHdpdGhvdXQgbmFtZS4gIEhvd2V2ZXIsIHRoZSAzMmJpdCBvZmZzZXQgZnJvbSB0aGUgaGVhZAotICAgKiBvZiBzdWJ0YWJsZSB0byB0aGUgaS1nLWwgaXMgZ2l2ZW4gYWZ0ZXIgYGVudHJ5VGFibGUnLAotICAgKiB3aXRob3V0IHZhcmlhYmxlIG5hbWUgc3BlY2lmaWNhdGlvbiAodGhlIGV4aXN0ZW5jZSBvZgotICAgKiB0aGlzIG9mZnNldCB0byB0aGUgdGFibGUgaXMgZGlmZmVyZW50IGZyb20gbW9ydCB0eXBlNSkuCi0gICAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYVl9tb3J4X3N1YnRhYmxlX3R5cGU1X1N0YXRlT3B0UmVjXwotICB7Ci0gICAgRlRfVUxvbmcgIGluc2VydGlvbkdseXBoTGlzdDsKLSAgICBGVF9VTG9uZyAgaW5zZXJ0aW9uR2x5cGhMaXN0X2xlbmd0aDsKLQotICB9ICBHWFZfbW9yeF9zdWJ0YWJsZV90eXBlNV9TdGF0ZU9wdFJlYywKLSAgICAqR1hWX21vcnhfc3VidGFibGVfdHlwZTVfU3RhdGVPcHRSZWNEYXRhOwotCi0KLSNkZWZpbmUgR1hWX01PUlhfU1VCVEFCTEVfVFlQRTVfSEVBREVSX1NJWkUgXAotICAgICAgICAgICggR1hWX1NUQVRFVEFCTEVfSEVBREVSX1NJWkUgKyA0ICkKLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGU1X2luc2VydGlvbkdseXBoTGlzdF9sb2FkKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0gICAgR1hWX21vcnhfc3VidGFibGVfdHlwZTVfU3RhdGVPcHRSZWNEYXRhICBvcHRkYXRhID0KLSAgICAgIChHWFZfbW9yeF9zdWJ0YWJsZV90eXBlNV9TdGF0ZU9wdFJlY0RhdGEpZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YTsKLQotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgb3B0ZGF0YS0+aW5zZXJ0aW9uR2x5cGhMaXN0ID0gRlRfTkVYVF9VTE9ORyggcCApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV9zdWJ0YWJsZV9zZXR1cCggRlRfVUxvbmcgICAgICAgdGFibGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIGNsYXNzVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBzdGF0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgZW50cnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgIGNsYXNzVGFibGVfbGVuZ3RoX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICBzdGF0ZUFycmF5X2xlbmd0aF9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgZW50cnlUYWJsZV9sZW5ndGhfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfVUxvbmcgICBvWzRdOwotICAgIEZUX1VMb25nKiAgbFs0XTsKLSAgICBGVF9VTG9uZyAgIGJ1ZmZbNV07Ci0KLSAgICBHWFZfbW9yeF9zdWJ0YWJsZV90eXBlNV9TdGF0ZU9wdFJlY0RhdGEgIG9wdGRhdGEgPQotICAgICAgKEdYVl9tb3J4X3N1YnRhYmxlX3R5cGU1X1N0YXRlT3B0UmVjRGF0YSlneHZhbGlkLT54c3RhdGV0YWJsZS5vcHRkYXRhOwotCi0KLSAgICBvWzBdID0gY2xhc3NUYWJsZTsKLSAgICBvWzFdID0gc3RhdGVBcnJheTsKLSAgICBvWzJdID0gZW50cnlUYWJsZTsKLSAgICBvWzNdID0gb3B0ZGF0YS0+aW5zZXJ0aW9uR2x5cGhMaXN0OwotICAgIGxbMF0gPSBjbGFzc1RhYmxlX2xlbmd0aF9wOwotICAgIGxbMV0gPSBzdGF0ZUFycmF5X2xlbmd0aF9wOwotICAgIGxbMl0gPSBlbnRyeVRhYmxlX2xlbmd0aF9wOwotICAgIGxbM10gPSAmKG9wdGRhdGEtPmluc2VydGlvbkdseXBoTGlzdF9sZW5ndGgpOwotCi0gICAgZ3h2X3NldF9sZW5ndGhfYnlfdWxvbmdfb2Zmc2V0KCBvLCBsLCBidWZmLCA0LCB0YWJsZV9zaXplLCBneHZhbGlkICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGU1X0luc2VydExpc3RfdmFsaWRhdGUoIEZUX1VTaG9ydCAgICAgIHRhYmxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGUgKyB0YWJsZV9pbmRleCAqIDI7Ci0KLQotI2lmbmRlZiBHWFZfTE9BRF9UUkFDRV9WQVJTCi0gICAgR1hWX0xJTUlUX0NIRUNLKCBjb3VudCAqIDIgKTsKLSNlbHNlCi0gICAgd2hpbGUgKCBwIDwgdGFibGUgKyBjb3VudCAqIDIgKyB0YWJsZV9pbmRleCAqIDIgKQotICAgIHsKLSAgICAgIEZUX1VTaG9ydCAgaW5zZXJ0X2dseXBoSUQ7Ci0KLQotICAgICAgR1hWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICBpbnNlcnRfZ2x5cGhJRCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBHWFZfVFJBQ0UoKCAiIDB4JTA0eCIsIGluc2VydF9nbHlwaElEICkpOwotICAgIH0KLQotICAgIEdYVl9UUkFDRSgoICJcbiIgKSk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTVfZW50cnlfdmFsaWRhdGUoCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgIEdYVl9TdGF0ZVRhYmxlX0dseXBoT2Zmc2V0Q1B0ciAgZ2x5cGhPZmZzZXRfcCwKLSAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAotICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQsCi0gICAgR1hWX1ZhbGlkYXRvciAgICAgICAgICAgICAgICAgICBneHZhbGlkICkKLSAgewotI2lmZGVmIEdYVl9MT0FEX1VOVVNFRF9WQVJTCi0gICAgRlRfQm9vbCAgICBzZXRNYXJrOwotICAgIEZUX0Jvb2wgICAgZG9udEFkdmFuY2U7Ci0gICAgRlRfQm9vbCAgICBjdXJyZW50SXNLYXNoaWRhTGlrZTsKLSAgICBGVF9Cb29sICAgIG1hcmtlZElzS2FzaGlkYUxpa2U7Ci0gICAgRlRfQm9vbCAgICBjdXJyZW50SW5zZXJ0QmVmb3JlOwotICAgIEZUX0Jvb2wgICAgbWFya2VkSW5zZXJ0QmVmb3JlOwotI2VuZGlmCi0gICAgRlRfQnl0ZSAgICBjdXJyZW50SW5zZXJ0Q291bnQ7Ci0gICAgRlRfQnl0ZSAgICBtYXJrZWRJbnNlcnRDb3VudDsKLSAgICBGVF9CeXRlICAgIGN1cnJlbnRJbnNlcnRMaXN0OwotICAgIEZUX1VTaG9ydCAgbWFya2VkSW5zZXJ0TGlzdDsKLQotICAgIEZUX1VOVVNFRCggc3RhdGUgKTsKLQotCi0jaWZkZWYgR1hWX0xPQURfVU5VU0VEX1ZBUlMKLSAgICBzZXRNYXJrICAgICAgICAgICAgICA9IEZUX0JPT0woICggZmxhZ3MgPj4gMTUgKSAmIDEgKTsKLSAgICBkb250QWR2YW5jZSAgICAgICAgICA9IEZUX0JPT0woICggZmxhZ3MgPj4gMTQgKSAmIDEgKTsKLSAgICBjdXJyZW50SXNLYXNoaWRhTGlrZSA9IEZUX0JPT0woICggZmxhZ3MgPj4gMTMgKSAmIDEgKTsKLSAgICBtYXJrZWRJc0thc2hpZGFMaWtlICA9IEZUX0JPT0woICggZmxhZ3MgPj4gMTIgKSAmIDEgKTsKLSAgICBjdXJyZW50SW5zZXJ0QmVmb3JlICA9IEZUX0JPT0woICggZmxhZ3MgPj4gMTEgKSAmIDEgKTsKLSAgICBtYXJrZWRJbnNlcnRCZWZvcmUgICA9IEZUX0JPT0woICggZmxhZ3MgPj4gMTAgKSAmIDEgKTsKLSNlbmRpZgotCi0gICAgY3VycmVudEluc2VydENvdW50ID0gKEZUX0J5dGUpKCAoIGZsYWdzID4+IDUgKSAmIDB4MUYgICApOwotICAgIG1hcmtlZEluc2VydENvdW50ICA9IChGVF9CeXRlKSggICBmbGFncyAgICAgICAgJiAweDAwMUYgKTsKLQotICAgIGN1cnJlbnRJbnNlcnRMaXN0ID0gKEZUX0J5dGUpICAoIGdseXBoT2Zmc2V0X3AtPnVsID4+IDE2ICk7Ci0gICAgbWFya2VkSW5zZXJ0TGlzdCAgPSAoRlRfVVNob3J0KSggZ2x5cGhPZmZzZXRfcC0+dWwgICAgICAgKTsKLQotICAgIGlmICggY3VycmVudEluc2VydExpc3QgJiYgMCAhPSBjdXJyZW50SW5zZXJ0Q291bnQgKQotICAgICAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTVfSW5zZXJ0TGlzdF92YWxpZGF0ZSggY3VycmVudEluc2VydExpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5zZXJ0Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0KLSAgICBpZiAoIG1hcmtlZEluc2VydExpc3QgJiYgMCAhPSBtYXJrZWRJbnNlcnRDb3VudCApCi0gICAgICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV9JbnNlcnRMaXN0X3ZhbGlkYXRlKCBtYXJrZWRJbnNlcnRMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VkSW5zZXJ0Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneHZhbGlkICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9tb3J4X3N1YnRhYmxlX3R5cGU1X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotCi0gICAgR1hWX21vcnhfc3VidGFibGVfdHlwZTVfU3RhdGVPcHRSZWMgICAgICBldF9yZWM7Ci0gICAgR1hWX21vcnhfc3VidGFibGVfdHlwZTVfU3RhdGVPcHRSZWNEYXRhICBldCA9ICZldF9yZWM7Ci0KLQotICAgIEdYVl9OQU1FX0VOVEVSKCAibW9yeCBjaGFpbiBzdWJ0YWJsZSB0eXBlNSAoR2x5cGggSW5zZXJ0aW9uKSIgKTsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggR1hWX01PUlhfU1VCVEFCTEVfVFlQRTVfSEVBREVSX1NJWkUgKTsKLQotICAgIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLm9wdGRhdGEgPQotICAgICAgZXQ7Ci0gICAgZ3h2YWxpZC0+eHN0YXRldGFibGUub3B0ZGF0YV9sb2FkX2Z1bmMgPQotICAgICAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTVfaW5zZXJ0aW9uR2x5cGhMaXN0X2xvYWQ7Ci0gICAgZ3h2YWxpZC0+eHN0YXRldGFibGUuc3VidGFibGVfc2V0dXBfZnVuYyA9Ci0gICAgICBneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV9zdWJ0YWJsZV9zZXR1cDsKLSAgICBneHZhbGlkLT54c3RhdGV0YWJsZS5lbnRyeV9nbHlwaG9mZnNldF9mbXQgPQotICAgICAgR1hWX0dMWVBIT0ZGU0VUX1VMT05HOwotICAgIGd4dmFsaWQtPnhzdGF0ZXRhYmxlLmVudHJ5X3ZhbGlkYXRlX2Z1bmMgPQotICAgICAgZ3h2X21vcnhfc3VidGFibGVfdHlwZTVfZW50cnlfdmFsaWRhdGU7Ci0KLSAgICBneHZfWFN0YXRlVGFibGVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2b3BiZC5jIGIvc3JjL2d4dmFsaWQvZ3h2b3BiZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU4MGQ4Li4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dm9wYmQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZvcGJkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgb3BiZCB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiZ3h2YWxpZC5oIgotI2luY2x1ZGUgImd4dmNvbW1uLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZvcGJkCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgRGF0YSBhbmQgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX29wYmRfRGF0YVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgZm9ybWF0OwotICAgIEZUX1VTaG9ydCAgdmFsdWVPZmZzZXRfbWluOwotCi0gIH0gR1hWX29wYmRfRGF0YVJlYywgKkdYVl9vcGJkX0RhdGE7Ci0KLQotI2RlZmluZSBHWFZfT1BCRF9EQVRBKCBGSUVMRCApICBHWFZfVEFCTEVfREFUQSggb3BiZCwgRklFTEQgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIFVUSUxJVFkgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X29wYmRfTG9va3VwVmFsdWVfdmFsaWRhdGUoIEZUX1VTaG9ydCAgICAgICAgICAgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0xvb2t1cFZhbHVlQ1B0ciAgdmFsdWVfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgICAgICAgIGd4dmFsaWQgKQotICB7Ci0gICAgLyogb2Zmc2V0IGluIExvb2t1cFRhYmxlIGlzIG1lYXN1cmVkIGZyb20gdGhlIGhlYWQgb2Ygb3BiZCB0YWJsZSAqLwotICAgIEZUX0J5dGVzICAgcCAgICAgPSBneHZhbGlkLT5yb290LT5iYXNlICsgdmFsdWVfcC0+dTsKLSAgICBGVF9CeXRlcyAgIGxpbWl0ID0gZ3h2YWxpZC0+cm9vdC0+bGltaXQ7Ci0gICAgRlRfU2hvcnQgICBkZWx0YV92YWx1ZTsKLSAgICBpbnQgICAgICAgIGk7Ci0KLQotICAgIGlmICggdmFsdWVfcC0+dSA8IEdYVl9PUEJEX0RBVEEoIHZhbHVlT2Zmc2V0X21pbiApICkKLSAgICAgIEdYVl9PUEJEX0RBVEEoIHZhbHVlT2Zmc2V0X21pbiApID0gdmFsdWVfcC0+dTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgNDsgaSsrICkKLSAgICB7Ci0gICAgICBHWFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICAgIGRlbHRhX3ZhbHVlID0gRlRfTkVYVF9TSE9SVCggcCApOwotCi0gICAgICBpZiAoIEdYVl9PUEJEX0RBVEEoIGZvcm1hdCApICkgICAgLyogZm9ybWF0IDEsIHZhbHVlIGlzIGN0cmwgcHQuICovCi0gICAgICB7Ci0gICAgICAgIGlmICggZGVsdGFfdmFsdWUgPT0gLTEgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGd4dl9jdGxQb2ludF92YWxpZGF0ZSggZ2x5cGgsIChGVF9VU2hvcnQpZGVsdGFfdmFsdWUsIGd4dmFsaWQgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JtYXQgMCwgdmFsdWUgaXMgZGlzdGFuY2UgKi8KLSAgICAgICAgY29udGludWU7Ci0gICAgfQotICB9Ci0KLQotICAvKgotICAgIG9wYmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICs9PT09PT09PT09PT09PT0rICAgICAgICAgfAotICAgIHwgbG9va3VwIGhlYWRlciB8ICAgICAgICAgfAotICAgICs9PT09PT09PT09PT09PT0rICAgICAgICAgfAotICAgIHwgQmluU3JjaEhlYWRlciB8ICAgICAgICAgfAotICAgICs9PT09PT09PT09PT09PT0rICAgICAgICAgfAotICAgIHwgbGFzdEdseXBoWzBdICB8ICAgICAgICAgfAotICAgICstLS0tLS0tLS0tLS0tLS0rICAgICAgICAgfAotICAgIHwgZmlyc3RHbHlwaFswXSB8ICAgICAgICAgfCAgaGVhZCBvZiBvcGJkIHNmbnQgdGFibGUKLSAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgICAgICAgKwotICAgIHwgb2Zmc2V0WzBdICAgICB8ICAgIC0+ICAgfCAgICAgICAgICBvZmZzZXQgICAgICAgICAgICBbYnl0ZV0KLSAgICArPT09PT09PT09PT09PT09KyAgICAgICAgIHwgICAgICAgICAgICAgKwotICAgIHwgbGFzdEdseXBoWzFdICB8ICAgICAgICAgfCAoZ2x5cGhJRCAtIGZpcnN0R2x5cGgpICogNCAqIHNpemVvZihGVF9TaG9ydCkgW2J5dGVdCi0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBmaXJzdEdseXBoWzFdIHwgICAgICAgICB8Ci0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBvZmZzZXRbMV0gICAgIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIC4uLi4gICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgNDhiaXQgdmFsdWUgYXJyYXkgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCAgICAgdmFsdWUgICAgIHwgPC0tLS0tLS0rCi0gICAgfCAgICAgICAgICAgICAgIHwKLSAgICB8ICAgICAgICAgICAgICAgfAotICAgIHwgICAgICAgICAgICAgICB8Ci0gICAgKy0tLS0tLS0tLS0tLS0tLSsKLSAgICAuLi4uICovCi0KLSAgc3RhdGljIEdYVl9Mb29rdXBWYWx1ZURlc2MKLSAgZ3h2X29wYmRfTG9va3VwRm10NF90cmFuc2l0KCBGVF9VU2hvcnQgICAgICAgICAgICByZWxhdGl2ZV9naW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0xvb2t1cFZhbHVlQ1B0ciAgYmFzZV92YWx1ZV9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgICAgIGxvb2t1cHRibF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICAgICAgICBneHZhbGlkICkKLSAgewotICAgIEdYVl9Mb29rdXBWYWx1ZURlc2MgIHZhbHVlOwotCi0gICAgRlRfVU5VU0VEKCBsb29rdXB0YmxfbGltaXQgKTsKLSAgICBGVF9VTlVTRUQoIGd4dmFsaWQgKTsKLQotICAgIC8qIFhYWDogY2hlY2sgcmFuZ2U/ICovCi0gICAgdmFsdWUudSA9IChGVF9VU2hvcnQpKCBiYXNlX3ZhbHVlX3AtPnUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfZ2luZGV4ICogNCAqIHNpemVvZiAoIEZUX1Nob3J0ICkgKTsKLQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIG9wYmQgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X29wYmRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIGZ0dmFsaWQgKQotICB7Ci0gICAgR1hWX1ZhbGlkYXRvclJlYyAgZ3h2YWxpZHJlYzsKLSAgICBHWFZfVmFsaWRhdG9yICAgICBneHZhbGlkID0gJmd4dmFsaWRyZWM7Ci0gICAgR1hWX29wYmRfRGF0YVJlYyAgb3BiZHJlYzsKLSAgICBHWFZfb3BiZF9EYXRhICAgICBvcGJkICA9ICZvcGJkcmVjOwotICAgIEZUX0J5dGVzICAgICAgICAgIHAgICAgID0gdGFibGU7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgbGltaXQgPSAwOwotCi0gICAgRlRfVUxvbmcgIHZlcnNpb247Ci0KLQotICAgIGd4dmFsaWQtPnJvb3QgICAgICAgPSBmdHZhbGlkOwotICAgIGd4dmFsaWQtPnRhYmxlX2RhdGEgPSBvcGJkOwotICAgIGd4dmFsaWQtPmZhY2UgICAgICAgPSBmYWNlOwotCi0gICAgRlRfVFJBQ0UzKCggInZhbGlkYXRpbmcgYG9wYmQnIHRhYmxlXG4iICkpOwotICAgIEdYVl9JTklUOwotICAgIEdYVl9PUEJEX0RBVEEoIHZhbHVlT2Zmc2V0X21pbiApID0gMHhGRkZGVTsKLQotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCA0ICsgMiApOwotICAgIHZlcnNpb24gICAgICAgICAgICAgICAgID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgIEdYVl9PUEJEX0RBVEEoIGZvcm1hdCApID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotCi0gICAgLyogb25seSAweDAwMDEwMDAwIGlzIGRlZmluZWQgKDE5OTYpICovCi0gICAgR1hWX1RSQUNFKCggIih2ZXJzaW9uPTB4JTA4eClcbiIsIHZlcnNpb24gKSk7Ci0gICAgaWYgKCAweDAwMDEwMDAwVUwgIT0gdmVyc2lvbiApCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIC8qIG9ubHkgdmFsdWVzIDAgYW5kIDEgYXJlIGRlZmluZWQgKDE5OTYpICovCi0gICAgR1hWX1RSQUNFKCggIihmb3JtYXQ9MHglMDR4KVxuIiwgR1hWX09QQkRfREFUQSggZm9ybWF0ICkgKSk7Ci0gICAgaWYgKCAweDAwMDEgPCBHWFZfT1BCRF9EQVRBKCBmb3JtYXQgKSApCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIGd4dmFsaWQtPmxvb2t1cHZhbF9zaWduICAgPSBHWFZfTE9PS1VQVkFMVUVfVU5TSUdORUQ7Ci0gICAgZ3h2YWxpZC0+bG9va3VwdmFsX2Z1bmMgICA9IGd4dl9vcGJkX0xvb2t1cFZhbHVlX3ZhbGlkYXRlOwotICAgIGd4dmFsaWQtPmxvb2t1cGZtdDRfdHJhbnMgPSBneHZfb3BiZF9Mb29rdXBGbXQ0X3RyYW5zaXQ7Ci0KLSAgICBneHZfTG9va3VwVGFibGVfdmFsaWRhdGUoIHAsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgcCArPSBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGg7Ci0KLSAgICBpZiAoIHAgPiB0YWJsZSArIEdYVl9PUEJEX0RBVEEoIHZhbHVlT2Zmc2V0X21pbiApICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKAotICAgICAgICAiZm91bmQgb3ZlcmxhcCBiZXR3ZWVuIExvb2t1cFRhYmxlIGFuZCBvcGJkX3ZhbHVlIGFycmF5XG4iICkpOwotICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2cHJvcC5jIGIvc3JjL2d4dmFsaWQvZ3h2cHJvcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM5OGI3Li4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL2d4dnByb3AuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZwcm9wLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgcHJvcCB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiZ3h2YWxpZC5oIgotI2luY2x1ZGUgImd4dmNvbW1uLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZwcm9wCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgRGF0YSBhbmQgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBHWFZfUFJPUF9IRUFERVJfU0laRSAgKCA0ICsgMiArIDIgKQotI2RlZmluZSBHWFZfUFJPUF9TSVpFX01JTiAgICAgR1hWX1BST1BfSEVBREVSX1NJWkUKLQotICB0eXBlZGVmIHN0cnVjdCAgR1hWX3Byb3BfRGF0YVJlY18KLSAgewotICAgIEZUX0ZpeGVkICB2ZXJzaW9uOwotCi0gIH0gR1hWX3Byb3BfRGF0YVJlYywgKkdYVl9wcm9wX0RhdGE7Ci0KLSNkZWZpbmUgR1hWX1BST1BfREFUQSggZmllbGQgKSAgR1hWX1RBQkxFX0RBVEEoIHByb3AsIGZpZWxkICkKLQotI2RlZmluZSBHWFZfUFJPUF9GTE9BVEVSICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMFUKLSNkZWZpbmUgR1hWX1BST1BfVVNFX0NPTVBMRU1FTlRBUllfQlJBQ0tFVCAgICAweDEwMDBVCi0jZGVmaW5lIEdYVl9QUk9QX0NPTVBMRU1FTlRBUllfQlJBQ0tFVF9PRkZTRVQgMHgwRjAwVQotI2RlZmluZSBHWFZfUFJPUF9BVFRBQ0hJTkdfVE9fUklHSFQgICAgICAgICAgIDB4MDA4MFUKLSNkZWZpbmUgR1hWX1BST1BfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAweDAwNjBVCi0jZGVmaW5lIEdYVl9QUk9QX0RJUkVDVElPTkFMSVRZX0NMQVNTICAgICAgICAgMHgwMDFGVQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIFVUSUxJVFkgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X3Byb3BfemVyb19hZHZhbmNlX3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICBnaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBGVF9GYWNlICAgICAgIGZhY2U7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBGVF9HbHlwaFNsb3QgIGdseXBoOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggInplcm8gYWR2YW5jZSIgKTsKLQotICAgIGZhY2UgPSBneHZhbGlkLT5mYWNlOwotCi0gICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotCi0gICAgZ2x5cGggPSBmYWNlLT5nbHlwaDsKLQotICAgIGlmICggZ2x5cGgtPmFkdmFuY2UueCAhPSAoRlRfUG9zKTAgfHwKLSAgICAgICAgIGdseXBoLT5hZHZhbmNlLnkgIT0gKEZUX1BvcykwICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAiICBmb3VuZCBub24temVybyBhZHZhbmNlIGluIHplcm8tYWR2YW5jZSBnbHlwaFxuIiApKTsKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyogUGFzcyAwIGFzIEdMWVBIIHRvIGNoZWNrIHRoZSBkZWZhdWx0IHByb3BlcnR5ICovCi0gIHN0YXRpYyB2b2lkCi0gIGd4dl9wcm9wX3Byb3BlcnR5X3ZhbGlkYXRlKCBGVF9VU2hvcnQgICAgICBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgZ3h2YWxpZCApCi0gIHsKLSAgICBpZiAoIGdseXBoICE9IDAgJiYgKCBwcm9wZXJ0eSAmIEdYVl9QUk9QX0ZMT0FURVIgKSApCi0gICAgICBneHZfcHJvcF96ZXJvX2FkdmFuY2VfdmFsaWRhdGUoIGdseXBoLCBneHZhbGlkICk7Ci0KLSAgICBpZiAoIHByb3BlcnR5ICYgR1hWX1BST1BfVVNFX0NPTVBMRU1FTlRBUllfQlJBQ0tFVCApCi0gICAgewotICAgICAgRlRfVVNob3J0ICBvZmZzZXQ7Ci0gICAgICBjaGFyICAgICAgIGNvbXBsZW1lbnQ7Ci0KLQotICAgICAgb2Zmc2V0ID0gKEZUX1VTaG9ydCkoIHByb3BlcnR5ICYgR1hWX1BST1BfQ09NUExFTUVOVEFSWV9CUkFDS0VUX09GRlNFVCApOwotICAgICAgaWYgKCBvZmZzZXQgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIEdYVl9UUkFDRSgoICIgIGZvdW5kIHplcm8gb2Zmc2V0IHRvIHByb3BlcnR5XG4iICkpOwotICAgICAgICBGVF9JTlZBTElEX09GRlNFVDsKLSAgICAgIH0KLQotICAgICAgY29tcGxlbWVudCA9IChjaGFyKSggb2Zmc2V0ID4+IDggKTsKLSAgICAgIGlmICggY29tcGxlbWVudCAmIDB4MDggKQotICAgICAgewotICAgICAgICAvKiBUb3AgYml0IGlzIHNldDogbmVnYXRpdmUgKi8KLQotICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGFic29sdXRlIG9mZnNldCAqLwotICAgICAgICBjb21wbGVtZW50ID0gKGNoYXIpKCAoIGNvbXBsZW1lbnQgJiAweDA3ICkgKyAxICk7Ci0KLSAgICAgICAgLyogVGhlIGdpZCBmb3IgY29tcGxlbWVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwICovCi0gICAgICAgIGlmICggZ2x5cGggPD0gY29tcGxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICBHWFZfVFJBQ0UoKCAiICBmb3VuZCBub24tcG9zaXRpdmUgZ2x5cGggY29tcGxlbWVudFxuIiApKTsKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogVGhlIGdpZCBmb3IgY29tcGxlbWVudCBtdXN0IGJlIHRoZSBmYWNlLiAqLwotICAgICAgICBneHZfZ2x5cGhpZF92YWxpZGF0ZSggKEZUX1VTaG9ydCkoIGdseXBoICsgY29tcGxlbWVudCApLCBneHZhbGlkICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIHByb3BlcnR5ICYgR1hWX1BST1BfQ09NUExFTUVOVEFSWV9CUkFDS0VUX09GRlNFVCApCi0gICAgICAgIEdYVl9UUkFDRSgoICJnbHlwaCAlZCBjYW5ub3QgaGF2ZSBjb21wbGVtZW50YXJ5IGJyYWNrZXRpbmdcbiIsCi0gICAgICAgICAgICAgICAgICAgIGdseXBoICkpOwotICAgIH0KLQotICAgIC8qIHRoaXMgaXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDIuMCAqLwotICAgIGlmICggcHJvcGVydHkgJiBHWFZfUFJPUF9BVFRBQ0hJTkdfVE9fUklHSFQgKQotICAgIHsKLSAgICAgIGlmICggR1hWX1BST1BfREFUQSggdmVyc2lvbiApID09IDB4MDAwMTAwMDBVTCApCi0gICAgICB7Ci0gICAgICAgIEdYVl9UUkFDRSgoICIgIGZvdW5kIG9sZGVyIHZlcnNpb24gKDEuMCkgaW4gbmV3IHZlcnNpb24gdGFibGVcbiIgKSk7Ci0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHByb3BlcnR5ICYgR1hWX1BST1BfUkVTRVJWRUQgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICIgIGZvdW5kIG5vbi16ZXJvIGJpdHMgaW4gcmVzZXJ2ZWQgYml0c1xuIiApKTsKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBpZiAoICggcHJvcGVydHkgJiBHWFZfUFJPUF9ESVJFQ1RJT05BTElUWV9DTEFTUyApID4gMTEgKQotICAgIHsKLSAgICAgIC8qIFRPRE86IFRvbyByZXN0cmljdGVkLiBVc2UgdGhlIHZhbGlkYXRpb24gbGV2ZWwuICovCi0gICAgICBpZiAoIEdYVl9QUk9QX0RBVEEoIHZlcnNpb24gKSA9PSAweDAwMDEwMDAwVUwgfHwKLSAgICAgICAgICAgR1hWX1BST1BfREFUQSggdmVyc2lvbiApID09IDB4MDAwMjAwMDBVTCApCi0gICAgICB7Ci0gICAgICAgIEdYVl9UUkFDRSgoICIgIGZvdW5kIHRvbyBvbGQgdmVyc2lvbiBpbiBkaXJlY3Rpb25hbGl0eSBjbGFzc1xuIiApKTsKLSAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3h2X3Byb3BfTG9va3VwVmFsdWVfdmFsaWRhdGUoIEZUX1VTaG9ydCAgICAgICAgICAgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0xvb2t1cFZhbHVlQ1B0ciAgdmFsdWVfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgICAgICAgIGd4dmFsaWQgKQotICB7Ci0gICAgZ3h2X3Byb3BfcHJvcGVydHlfdmFsaWRhdGUoIHZhbHVlX3AtPnUsIGdseXBoLCBneHZhbGlkICk7Ci0gIH0KLQotCi0gIC8qCi0gICAgKz09PT09PT09PT09PT09PSsgLS0tLS0tLS0rCi0gICAgfCBsb29rdXAgaGVhZGVyIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCBCaW5TcmNoSGVhZGVyIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCBsYXN0R2x5cGhbMF0gIHwgICAgICAgICB8Ci0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBmaXJzdEdseXBoWzBdIHwgICAgICAgICB8ICAgIGhlYWQgb2YgbG9va3VwIHRhYmxlCi0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICAgICAgICsKLSAgICB8IG9mZnNldFswXSAgICAgfCAgICAtPiAgIHwgICAgICAgICAgb2Zmc2V0ICAgICAgICAgICAgW2J5dGVdCi0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8ICAgICAgICAgICAgICsKLSAgICB8IGxhc3RHbHlwaFsxXSAgfCAgICAgICAgIHwgKGdseXBoSUQgLSBmaXJzdEdseXBoKSAqIDIgW2J5dGVdCi0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBmaXJzdEdseXBoWzFdIHwgICAgICAgICB8Ci0gICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICB8Ci0gICAgfCBvZmZzZXRbMV0gICAgIHwgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgMTZiaXQgdmFsdWUgYXJyYXkgICAgICAgICB8Ci0gICAgKz09PT09PT09PT09PT09PSsgICAgICAgICB8Ci0gICAgfCAgICAgdmFsdWUgICAgIHwgPC0tLS0tLS0rCi0gICAgLi4uCi0gICovCi0KLSAgc3RhdGljIEdYVl9Mb29rdXBWYWx1ZURlc2MKLSAgZ3h2X3Byb3BfTG9va3VwRm10NF90cmFuc2l0KCBGVF9VU2hvcnQgICAgICAgICAgICByZWxhdGl2ZV9naW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0xvb2t1cFZhbHVlQ1B0ciAgYmFzZV92YWx1ZV9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgICAgIGxvb2t1cHRibF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICAgICAgICBneHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgICAgICAgICAgIHA7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgICAgbGltaXQ7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgb2Zmc2V0OwotICAgIEdYVl9Mb29rdXBWYWx1ZURlc2MgIHZhbHVlOwotCi0gICAgLyogWFhYOiBjaGVjayByYW5nZT8gKi8KLSAgICBvZmZzZXQgPSAoRlRfVVNob3J0KSggYmFzZV92YWx1ZV9wLT51ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfZ2luZGV4ICogc2l6ZW9mICggRlRfVVNob3J0ICkgKTsKLSAgICBwICAgICAgPSBneHZhbGlkLT5sb29rdXB0YmxfaGVhZCArIG9mZnNldDsKLSAgICBsaW1pdCAgPSBsb29rdXB0YmxfbGltaXQ7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0sgKCAyICk7Ci0gICAgdmFsdWUudSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGd4dl9wcm9wX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICBmdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgICAgICAgIHAgICAgID0gdGFibGU7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgbGltaXQgPSAwOwotICAgIEdYVl9WYWxpZGF0b3JSZWMgIGd4dmFsaWRyZWM7Ci0gICAgR1hWX1ZhbGlkYXRvciAgICAgZ3h2YWxpZCA9ICZneHZhbGlkcmVjOwotCi0gICAgR1hWX3Byb3BfRGF0YVJlYyAgcHJvcHJlYzsKLSAgICBHWFZfcHJvcF9EYXRhICAgICBwcm9wID0gJnByb3ByZWM7Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgICB2ZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgICAgICAgIGZvcm1hdDsKLSAgICBGVF9VU2hvcnQgICAgICAgICBkZWZhdWx0UHJvcDsKLQotCi0gICAgZ3h2YWxpZC0+cm9vdCAgICAgICA9IGZ0dmFsaWQ7Ci0gICAgZ3h2YWxpZC0+dGFibGVfZGF0YSA9IHByb3A7Ci0gICAgZ3h2YWxpZC0+ZmFjZSAgICAgICA9IGZhY2U7Ci0KLSAgICBGVF9UUkFDRTMoKCAidmFsaWRhdGluZyBgcHJvcCcgdGFibGVcbiIgKSk7Ci0gICAgR1hWX0lOSVQ7Ci0KLSAgICBHWFZfTElNSVRfQ0hFQ0soIDQgKyAyICsgMiApOwotICAgIHZlcnNpb24gICAgID0gRlRfTkVYVF9MT05HKCBwICk7Ci0gICAgZm9ybWF0ICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGRlZmF1bHRQcm9wID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIEdYVl9UUkFDRSgoICIgIHZlcnNpb24gMHglMDh4XG4iLCB2ZXJzaW9uICkpOwotICAgIEdYVl9UUkFDRSgoICIgIGZvcm1hdCAgMHglMDR4XG4iLCBmb3JtYXQgKSk7Ci0gICAgR1hWX1RSQUNFKCggIiAgZGVmYXVsdFByb3AgIDB4JTA0eFxuIiwgZGVmYXVsdFByb3AgKSk7Ci0KLSAgICAvKiBvbmx5IHZlcnNpb25zIDEuMCwgMi4wLCAzLjAgYXJlIGRlZmluZWQgKDE5OTYpICovCi0gICAgaWYgKCB2ZXJzaW9uICE9IDB4MDAwMTAwMDBVTCAmJgotICAgICAgICAgdmVyc2lvbiAhPSAweDAwMDIwMDAwVUwgJiYKLSAgICAgICAgIHZlcnNpb24gIT0gMHgwMDAzMDAwMFVMICkKLSAgICB7Ci0gICAgICBHWFZfVFJBQ0UoKCAiICBmb3VuZCB1bmtub3duIHZlcnNpb25cbiIgKSk7Ci0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLSAgICB9Ci0KLQotICAgIC8qIG9ubHkgZm9ybWF0cyAweDAwMDAsIDB4MDAwMSBhcmUgZGVmaW5lZCAoMTk5NikgKi8KLSAgICBpZiAoIGZvcm1hdCA+IDEgKQotICAgIHsKLSAgICAgIEdYVl9UUkFDRSgoICIgIGZvdW5kIHVua25vd24gZm9ybWF0XG4iICkpOwotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgZ3h2X3Byb3BfcHJvcGVydHlfdmFsaWRhdGUoIGRlZmF1bHRQcm9wLCAwLCBneHZhbGlkICk7Ci0KLSAgICBpZiAoIGZvcm1hdCA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTMoKCAiKGZvcm1hdCAwLCBubyBwZXItZ2x5cGggcHJvcGVydGllcywgIgotICAgICAgICAgICAgICAgICAgInJlbWFpbmluZyAlZCBieXRlcyBhcmUgc2tpcHBlZCkiLCBsaW1pdCAtIHAgKSk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogZm9ybWF0ID09IDEgKi8KLSAgICBHWFZfUFJPUF9EQVRBKCB2ZXJzaW9uICkgPSB2ZXJzaW9uOwotCi0gICAgZ3h2YWxpZC0+bG9va3VwdmFsX3NpZ24gICA9IEdYVl9MT09LVVBWQUxVRV9VTlNJR05FRDsKLSAgICBneHZhbGlkLT5sb29rdXB2YWxfZnVuYyAgID0gZ3h2X3Byb3BfTG9va3VwVmFsdWVfdmFsaWRhdGU7Ci0gICAgZ3h2YWxpZC0+bG9va3VwZm10NF90cmFucyA9IGd4dl9wcm9wX0xvb2t1cEZtdDRfdHJhbnNpdDsKLQotICAgIGd4dl9Mb29rdXBUYWJsZV92YWxpZGF0ZSggcCwgbGltaXQsIGd4dmFsaWQgKTsKLQotICBFeGl0OgotICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dnRyYWsuYyBiL3NyYy9neHZhbGlkL2d4dnRyYWsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0OTgyNS4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9neHZ0cmFrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2dHJhay5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIHRyYWsgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImd4dmFsaWQuaCIKLSNpbmNsdWRlICJneHZjb21tbi5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2dHJhawotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIERhdGEgYW5kIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKgotICAgICAqIHJlZmVycmVkIHRyYWNrIHRhYmxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uOgotICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZ0cmFrLmh0bWwKLSAgICAgKiBsYXN0IHVwZGF0ZSB3YXMgMTk5Ni4KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogW01JTklNVU0gSEVBREVSXTogR1hWX1RSQUtfU0laRV9NSU4KLSAgICAgKiB2ZXJzaW9uICAgICAgICAgIChmaXhlZDogIDMyYml0KSA9IDB4MDAwMTAwMDAKLSAgICAgKiBmb3JtYXQgICAgICAgICAgICh1aW50MTY6IDE2Yml0KSA9IDAgaXMgb25seSBkZWZpbmVkICgxOTk2KQotICAgICAqIGhvcml6T2Zmc2V0ICAgICAgKHVpbnQxNjogMTZiaXQpCi0gICAgICogdmVydE9mZnNldCAgICAgICAodWludDE2OiAxNmJpdCkKLSAgICAgKiByZXNlcnZlZCAgICAgICAgICh1aW50MTY6IDE2Yml0KSA9IDAKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogW1ZBUklBQkxFIEJPRFldOgotICAgICAqIGhvcml6RGF0YQotICAgICAqICAgaGVhZGVyICAgICAgICAgKCAyICsgMiArIDQKLSAgICAgKiAgIHRyYWNrVGFibGUgICAgICAgKyBuVHJhY2tzICogKCA0ICsgMiArIDIgKQotICAgICAqICAgc2l6ZVRhYmxlICAgICAgICArIG5TaXplcyAqIDQgKQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiB2ZXJ0RGF0YQotICAgICAqICAgaGVhZGVyICAgICAgICAgKCAyICsgMiArIDQKLSAgICAgKiAgIHRyYWNrVGFibGUgICAgICAgKyBuVHJhY2tzICogKCA0ICsgMiArIDIgKQotICAgICAqICAgc2l6ZVRhYmxlICAgICAgICArIG5TaXplcyAqIDQgKQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYVl90cmFrX0RhdGFSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHRyYWNrVmFsdWVPZmZzZXRfbWluOwotICAgIEZUX1VTaG9ydCAgdHJhY2tWYWx1ZU9mZnNldF9tYXg7Ci0KLSAgfSBHWFZfdHJha19EYXRhUmVjLCAqR1hWX3RyYWtfRGF0YTsKLQotCi0jZGVmaW5lIEdYVl9UUkFLX0RBVEEoIEZJRUxEICkgIEdYVl9UQUJMRV9EQVRBKCB0cmFrLCBGSUVMRCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgVVRJTElUWSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBneHZfdHJha190cmFja1RhYmxlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgIG5UcmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLQotICAgIEZUX0ZpeGVkICAgdHJhY2ssIHQ7Ci0gICAgRlRfVVNob3J0ICBuYW1lSW5kZXg7Ci0gICAgRlRfVVNob3J0ICBvZmZzZXQ7Ci0gICAgRlRfVVNob3J0ICBpLCBqOwotCi0KLSAgICBHWFZfTkFNRV9FTlRFUiggInRyYWNrVGFibGUiICk7Ci0KLSAgICBHWFZfVFJBS19EQVRBKCB0cmFja1ZhbHVlT2Zmc2V0X21pbiApID0gMHhGRkZGVTsKLSAgICBHWFZfVFJBS19EQVRBKCB0cmFja1ZhbHVlT2Zmc2V0X21heCApID0gMHgwMDAwOwotCi0gICAgR1hWX0xJTUlUX0NIRUNLKCBuVHJhY2tzICogKCA0ICsgMiArIDIgKSApOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBuVHJhY2tzOyBpKysgKQotICAgIHsKLSAgICAgIHAgPSB0YWJsZSArIGkgKiAoIDQgKyAyICsgMiApOwotICAgICAgdHJhY2sgICAgID0gRlRfTkVYVF9MT05HKCBwICk7Ci0gICAgICBuYW1lSW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgb2Zmc2V0ICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBvZmZzZXQgPCBHWFZfVFJBS19EQVRBKCB0cmFja1ZhbHVlT2Zmc2V0X21pbiApICkKLSAgICAgICAgR1hWX1RSQUtfREFUQSggdHJhY2tWYWx1ZU9mZnNldF9taW4gKSA9IG9mZnNldDsKLSAgICAgIGlmICggb2Zmc2V0ID4gR1hWX1RSQUtfREFUQSggdHJhY2tWYWx1ZU9mZnNldF9tYXggKSApCi0gICAgICAgIEdYVl9UUkFLX0RBVEEoIHRyYWNrVmFsdWVPZmZzZXRfbWF4ICkgPSBvZmZzZXQ7Ci0KLSAgICAgIGd4dl9zZm50TmFtZV92YWxpZGF0ZSggbmFtZUluZGV4LCAyNTYsIDMyNzY3LCBneHZhbGlkICk7Ci0KLSAgICAgIGZvciAoIGogPSBpOyBqIDwgblRyYWNrczsgaisrICkKLSAgICAgIHsKLSAgICAgICAgIHAgPSB0YWJsZSArIGogKiAoIDQgKyAyICsgMiApOwotICAgICAgICAgdCA9IEZUX05FWFRfTE9ORyggcCApOwotICAgICAgICAgaWYgKCB0ID09IHRyYWNrICkKLSAgICAgICAgICAgR1hWX1RSQUNFKCggImR1cGxpY2F0ZWQgZW50cmllcyBmb3VuZCBmb3IgdHJhY2sgdmFsdWUgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrICkpOwotICAgICAgfQotICAgIH0KLQotICAgIGd4dmFsaWQtPnN1YnRhYmxlX2xlbmd0aCA9IChGVF9VTG9uZykoIHAgLSB0YWJsZSApOwotICAgIEdYVl9FWElUOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBneHZfdHJha190cmFja0RhdGFfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICBwID0gdGFibGU7Ci0gICAgRlRfVVNob3J0ICBuVHJhY2tzOwotICAgIEZUX1VTaG9ydCAgblNpemVzOwotICAgIEZUX1VMb25nICAgc2l6ZVRhYmxlT2Zmc2V0OwotCi0gICAgR1hWX09EVEVDVCggNCwgb2R0ZWN0ICk7Ci0KLQotICAgIEdYVl9PRFRFQ1RfSU5JVCggb2R0ZWN0ICk7Ci0gICAgR1hWX05BTUVfRU5URVIoICJ0cmFja0RhdGEiICk7Ci0KLSAgICAvKiByZWFkIHRoZSBoZWFkZXIgb2YgdHJhY2tEYXRhICovCi0gICAgR1hWX0xJTUlUX0NIRUNLKCAyICsgMiArIDQgKTsKLSAgICBuVHJhY2tzICAgICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIG5TaXplcyAgICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgc2l6ZVRhYmxlT2Zmc2V0ID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgZ3h2X29kdGVjdF9hZGRfcmFuZ2UoIHRhYmxlLCAoRlRfVUxvbmcpKCBwIC0gdGFibGUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNrRGF0YSBoZWFkZXIiLCBvZHRlY3QgKTsKLQotICAgIC8qIHZhbGlkYXRlIHRyYWNrVGFibGUgKi8KLSAgICBneHZfdHJha190cmFja1RhYmxlX3ZhbGlkYXRlKCBwLCBsaW1pdCwgblRyYWNrcywgZ3h2YWxpZCApOwotICAgIGd4dl9vZHRlY3RfYWRkX3JhbmdlKCBwLCBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFja1RhYmxlIiwgb2R0ZWN0ICk7Ci0KLSAgICAvKiBzaXplVGFibGUgaXMgYXJyYXkgb2YgRlRfRml4ZWQsIGRvbid0IGNoZWNrIGNvbnRlbnRzICovCi0gICAgcCA9IGd4dmFsaWQtPnJvb3QtPmJhc2UgKyBzaXplVGFibGVPZmZzZXQ7Ci0gICAgR1hWX0xJTUlUX0NIRUNLKCBuU2l6ZXMgKiA0ICk7Ci0gICAgZ3h2X29kdGVjdF9hZGRfcmFuZ2UoIHAsIG5TaXplcyAqIDQsICJzaXplVGFibGUiLCBvZHRlY3QgKTsKLQotICAgIC8qIHZhbGlkYXRlIHRyYWNrVmFsdWVPZmZldCAqLwotICAgIHAgPSBneHZhbGlkLT5yb290LT5iYXNlICsgR1hWX1RSQUtfREFUQSggdHJhY2tWYWx1ZU9mZnNldF9taW4gKTsKLSAgICBpZiAoIGxpbWl0IC0gcCA8IG5UcmFja3MgKiBuU2l6ZXMgKiAyICkKLSAgICAgIEdYVl9UUkFDRSgoICJ0b28gc2hvcnQgdHJhY2tWYWx1ZSBhcnJheVxuIiApKTsKLQotICAgIHAgPSBneHZhbGlkLT5yb290LT5iYXNlICsgR1hWX1RSQUtfREFUQSggdHJhY2tWYWx1ZU9mZnNldF9tYXggKTsKLSAgICBHWFZfTElNSVRfQ0hFQ0soIG5TaXplcyAqIDIgKTsKLQotICAgIGd4dl9vZHRlY3RfYWRkX3JhbmdlKCBneHZhbGlkLT5yb290LT5iYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBHWFZfVFJBS19EQVRBKCB0cmFja1ZhbHVlT2Zmc2V0X21pbiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVFJBS19EQVRBKCB0cmFja1ZhbHVlT2Zmc2V0X21heCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBHWFZfVFJBS19EQVRBKCB0cmFja1ZhbHVlT2Zmc2V0X21pbiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuU2l6ZXMgKiAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2tWYWx1ZSBhcnJheSIsIG9kdGVjdCApOwotCi0gICAgZ3h2X29kdGVjdF92YWxpZGF0ZSggb2R0ZWN0LCBneHZhbGlkICk7Ci0KLSAgICBHWFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFrIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgZ3h2X3RyYWtfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIGZ0dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgcCA9IHRhYmxlOwotICAgIEZUX0J5dGVzICAgICAgICAgIGxpbWl0ID0gMDsKLQotICAgIEdYVl9WYWxpZGF0b3JSZWMgIGd4dmFsaWRyZWM7Ci0gICAgR1hWX1ZhbGlkYXRvciAgICAgZ3h2YWxpZCA9ICZneHZhbGlkcmVjOwotICAgIEdYVl90cmFrX0RhdGFSZWMgIHRyYWtyZWM7Ci0gICAgR1hWX3RyYWtfRGF0YSAgICAgdHJhayA9ICZ0cmFrcmVjOwotCi0gICAgRlRfVUxvbmcgICB2ZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgZm9ybWF0OwotICAgIEZUX1VTaG9ydCAgaG9yaXpPZmZzZXQ7Ci0gICAgRlRfVVNob3J0ICB2ZXJ0T2Zmc2V0OwotICAgIEZUX1VTaG9ydCAgcmVzZXJ2ZWQ7Ci0KLQotICAgIEdYVl9PRFRFQ1QoIDMsIG9kdGVjdCApOwotCi0gICAgR1hWX09EVEVDVF9JTklUKCBvZHRlY3QgKTsKLSAgICBneHZhbGlkLT5yb290ICAgICAgID0gZnR2YWxpZDsKLSAgICBneHZhbGlkLT50YWJsZV9kYXRhID0gdHJhazsKLSAgICBneHZhbGlkLT5mYWNlICAgICAgID0gZmFjZTsKLQotICAgIGxpbWl0ICAgICAgPSBneHZhbGlkLT5yb290LT5saW1pdDsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIGB0cmFrJyB0YWJsZVxuIiApKTsKLSAgICBHWFZfSU5JVDsKLQotICAgIEdYVl9MSU1JVF9DSEVDSyggNCArIDIgKyAyICsgMiArIDIgKTsKLSAgICB2ZXJzaW9uICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBmb3JtYXQgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgaG9yaXpPZmZzZXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIHZlcnRPZmZzZXQgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICByZXNlcnZlZCAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBHWFZfVFJBQ0UoKCAiICh2ZXJzaW9uID0gMHglMDh4KVxuIiwgdmVyc2lvbiApKTsKLSAgICBHWFZfVFJBQ0UoKCAiIChmb3JtYXQgPSAweCUwNHgpXG4iLCBmb3JtYXQgKSk7Ci0gICAgR1hWX1RSQUNFKCggIiAoaG9yaXpPZmZzZXQgPSAweCUwNHgpXG4iLCBob3Jpek9mZnNldCApKTsKLSAgICBHWFZfVFJBQ0UoKCAiICh2ZXJ0T2Zmc2V0ID0gMHglMDR4KVxuIiwgdmVydE9mZnNldCApKTsKLSAgICBHWFZfVFJBQ0UoKCAiIChyZXNlcnZlZCA9IDB4JTA0eClcbiIsIHJlc2VydmVkICkpOwotCi0gICAgLyogVmVyc2lvbiAxLjAgKGFsd2F5czoxOTk2KSAqLwotICAgIGlmICggdmVyc2lvbiAhPSAweDAwMDEwMDAwVUwgKQotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICAvKiBmb3JtYXQgMCAoYWx3YXlzOjE5OTYpICovCi0gICAgaWYgKCBmb3JtYXQgIT0gMHgwMDAwICkKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgR1hWXzMyQklUX0FMSUdOTUVOVF9WQUxJREFURSggaG9yaXpPZmZzZXQgKTsKLSAgICBHWFZfMzJCSVRfQUxJR05NRU5UX1ZBTElEQVRFKCB2ZXJ0T2Zmc2V0ICk7Ci0KLSAgICAvKiBSZXNlcnZlZCBGaXhlZCBWYWx1ZSAoYWx3YXlzKSAqLwotICAgIGlmICggcmVzZXJ2ZWQgIT0gMHgwMDAwICkKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgIC8qIHZhbGlkYXRlIHRyYWNrRGF0YSAqLwotICAgIGlmICggMCA8IGhvcml6T2Zmc2V0ICkKLSAgICB7Ci0gICAgICBneHZfdHJha190cmFja0RhdGFfdmFsaWRhdGUoIHRhYmxlICsgaG9yaXpPZmZzZXQsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgICBneHZfb2R0ZWN0X2FkZF9yYW5nZSggdGFibGUgKyBob3Jpek9mZnNldCwgZ3h2YWxpZC0+c3VidGFibGVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpekp1c3REYXRhIiwgb2R0ZWN0ICk7Ci0gICAgfQotCi0gICAgaWYgKCAwIDwgdmVydE9mZnNldCApCi0gICAgewotICAgICAgZ3h2X3RyYWtfdHJhY2tEYXRhX3ZhbGlkYXRlKCB0YWJsZSArIHZlcnRPZmZzZXQsIGxpbWl0LCBneHZhbGlkICk7Ci0gICAgICBneHZfb2R0ZWN0X2FkZF9yYW5nZSggdGFibGUgKyB2ZXJ0T2Zmc2V0LCBneHZhbGlkLT5zdWJ0YWJsZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnRKdXN0RGF0YSIsIG9kdGVjdCApOwotICAgIH0KLQotICAgIGd4dl9vZHRlY3RfdmFsaWRhdGUoIG9kdGVjdCwgZ3h2YWxpZCApOwotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvbW9kdWxlLm1rIGIvc3JjL2d4dmFsaWQvbW9kdWxlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjg3ZTEwLi4wMDAwMDAwCi0tLSBhL3NyYy9neHZhbGlkL21vZHVsZS5taworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBneHZhbGlkIG1vZHVsZSBkZWZpbml0aW9uCi0jCi0KLSMgQ29weXJpZ2h0IDIwMDQtMjAxNyBieQotIyBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCi0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1GVE1PRFVMRV9IX0NPTU1BTkRTICs9IEdYVkFMSURfTU9EVUxFCi0KLWRlZmluZSBHWFZBTElEX01PRFVMRQotJChPUEVOX0RSSVZFUikgRlRfTW9kdWxlX0NsYXNzLCBneHZfbW9kdWxlX2NsYXNzICQoQ0xPU0VfRFJJVkVSKQotJChFQ0hPX0RSSVZFUilneHZhbGlkICAgJChFQ0hPX0RSSVZFUl9ERVNDKVRydWVUeXBlR1gvQUFUIHZhbGlkYXRpb24gbW9kdWxlJChFQ0hPX0RSSVZFUl9ET05FKQotZW5kZWYKLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL3J1bGVzLm1rIGIvc3JjL2d4dmFsaWQvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWMwOGMuLjAwMDAwMDAKLS0tIGEvc3JjL2d4dmFsaWQvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgVHJ1ZVR5cGVHWC9BQVQgdmFsaWRhdGlvbiBkcml2ZXIgY29uZmlndXJhdGlvbiBydWxlcwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDQtMjAxNyBieQotIyBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCi0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIEdYViBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1HWFZfRElSIDo9ICQoU1JDX0RJUikvZ3h2YWxpZAotCi0KLSMgY29tcGlsYXRpb24gZmxhZ3MgZm9yIHRoZSBkcml2ZXIKLSMKLUdYVl9DT01QSUxFIDo9ICQoQ0MpICQoQU5TSUZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAkSSQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJChHWFZfRElSKSkgXAotICAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICQoRlRfQ0ZMQUdTKQotCi0KLSMgR1hWIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQotIwotR1hWX0RSVl9TUkMgOj0gJChHWFZfRElSKS9neHZjb21tbi5jIFwKLSAgICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2ZmVhdC5jICBcCi0gICAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dmJzbG4uYyAgXAotICAgICAgICAgICAgICAgJChHWFZfRElSKS9neHZ0cmFrLmMgIFwKLSAgICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2b3BiZC5jICBcCi0gICAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dnByb3AuYyAgXAotICAgICAgICAgICAgICAgJChHWFZfRElSKS9neHZqdXN0LmMgIFwKLSAgICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2bW9ydC5jICBcCi0gICAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dm1vcnQwLmMgXAotICAgICAgICAgICAgICAgJChHWFZfRElSKS9neHZtb3J0MS5jIFwKLSAgICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2bW9ydDIuYyBcCi0gICAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dm1vcnQ0LmMgXAotICAgICAgICAgICAgICAgJChHWFZfRElSKS9neHZtb3J0NS5jIFwKLSAgICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2bW9yeC5jICBcCi0gICAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dm1vcngwLmMgXAotICAgICAgICAgICAgICAgJChHWFZfRElSKS9neHZtb3J4MS5jIFwKLSAgICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2bW9yeDIuYyBcCi0gICAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dm1vcng0LmMgXAotICAgICAgICAgICAgICAgJChHWFZfRElSKS9neHZtb3J4NS5jIFwKLSAgICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2bGNhci5jICBcCi0gICAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dmtlcm4uYyAgXAotICAgICAgICAgICAgICAgJChHWFZfRElSKS9neHZtb2QuYwotCi0jIEdYViBkcml2ZXIgaGVhZGVycwotIwotR1hWX0RSVl9IIDo9ICQoR1hWX0RJUikvZ3h2YWxpZC5oICBcCi0gICAgICAgICAgICAgJChHWFZfRElSKS9neHZlcnJvci5oIFwKLSAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dmNvbW1uLmggXAotICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2ZmVhdC5oICBcCi0gICAgICAgICAgICAgJChHWFZfRElSKS9neHZtb2QuaCAgIFwKLSAgICAgICAgICAgICAkKEdYVl9ESVIpL2d4dm1vcnQuaCAgXAotICAgICAgICAgICAgICQoR1hWX0RJUikvZ3h2bW9yeC5oCi0KLQotIyBHWFYgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIEdYVl9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMuCi0jICAgR1hWX0RSVl9PQkpfUyBpcyB1c2VkIGR1cmluZyBgc2luZ2xlJyBidWlsZHMuCi0jCi1HWFZfRFJWX09CSl9NIDo9ICQoR1hWX0RSVl9TUkM6JChHWFZfRElSKS8lLmM9JChPQkpfRElSKS8lLiRPKQotR1hWX0RSVl9PQkpfUyA6PSAkKE9CSl9ESVIpL2d4dmFsaWQuJE8KLQotIyBHWFYgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLUdYVl9EUlZfU1JDX1MgOj0gJChHWFZfRElSKS9neHZhbGlkLmMKLQotCi0jIEdYViBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0Ci0jCi0kKEdYVl9EUlZfT0JKX1MpOiAkKEdYVl9EUlZfU1JDX1MpICQoR1hWX0RSVl9TUkMpIFwKLSAgICAgICAgICAgICAgICAgICAkKEZSRUVUWVBFX0gpICQoR1hWX0RSVl9IKQotCSQoR1hWX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKEdYVl9EUlZfU1JDX1MpKQotCi0KLSMgR1hWIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChHWFZfRElSKS8lLmMgJChGUkVFVFlQRV9IKSAkKEdYVl9EUlZfSCkKLQkkKEdYVl9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoR1hWX0RSVl9PQkpfUykKLURSVl9PQkpTX00gKz0gJChHWFZfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC9KYW1maWxlIGIvc3JjL2d6aXAvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwYzEzYS4uMDAwMDAwMAotLS0gYS9zcmMvZ3ppcC9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9nemlwIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBnemlwIDsKLQotTGlicmFyeSAgJChGVDJfTElCKSA6IGZ0Z3ppcC5jIDsKLQotIyBlbmQgb2Ygc3JjL3BjZiBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC9hZGxlcjMyLmMgYi9zcmMvZ3ppcC9hZGxlcjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2Y5ZGQuLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvYWRsZXIzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogYWRsZXIzMi5jIC0tIGNvbXB1dGUgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGEgZGF0YSBzdHJlYW0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2luY2x1ZGUgInpsaWIuaCIKLQotI2RlZmluZSBCQVNFIDY1NTIxTCAvKiBsYXJnZXN0IHByaW1lIHNtYWxsZXIgdGhhbiA2NTUzNiAqLwotI2RlZmluZSBOTUFYIDU1NTIKLS8qIE5NQVggaXMgdGhlIGxhcmdlc3QgbiBzdWNoIHRoYXQgMjU1bihuKzEpLzIgKyAobisxKShCQVNFLTEpIDw9IDJeMzItMSAqLwotCi0jZGVmaW5lIERPMShidWYsaSkgIHtzMSArPSBidWZbaV07IHMyICs9IHMxO30KLSNkZWZpbmUgRE8yKGJ1ZixpKSAgRE8xKGJ1ZixpKTsgRE8xKGJ1ZixpKzEpOwotI2RlZmluZSBETzQoYnVmLGkpICBETzIoYnVmLGkpOyBETzIoYnVmLGkrMik7Ci0jZGVmaW5lIERPOChidWYsaSkgIERPNChidWYsaSk7IERPNChidWYsaSs0KTsKLSNkZWZpbmUgRE8xNihidWYpICAgRE84KGJ1ZiwwKTsgRE84KGJ1Ziw4KTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotWkVYUE9SVCh1TG9uZykgYWRsZXIzMiggLyogYWRsZXIsIGJ1ZiwgbGVuKSAqLwotICAgIHVMb25nIGFkbGVyLAotICAgIGNvbnN0IEJ5dGVmICpidWYsCi0gICAgdUludCBsZW4gKQotewotICAgIHVuc2lnbmVkIGxvbmcgczEgPSBhZGxlciAmIDB4ZmZmZjsKLSAgICB1bnNpZ25lZCBsb25nIHMyID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKLSAgICBpbnQgazsKLQotICAgIGlmIChidWYgPT0gWl9OVUxMKSByZXR1cm4gMUw7Ci0KLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBrID0gbGVuIDwgTk1BWCA/IGxlbiA6IE5NQVg7Ci0gICAgICAgIGxlbiAtPSBrOwotICAgICAgICB3aGlsZSAoayA+PSAxNikgewotICAgICAgICAgICAgRE8xNihidWYpOwotICAgICAgICAgICAgYnVmICs9IDE2OwotICAgICAgICAgICAgayAtPSAxNjsKLSAgICAgICAgfQotICAgICAgICBpZiAoayAhPSAwKSBkbyB7Ci0gICAgICAgICAgICBzMSArPSAqYnVmKys7Ci0gICAgICAgICAgICBzMiArPSBzMTsKLSAgICAgICAgfSB3aGlsZSAoLS1rKTsKLSAgICAgICAgczEgJT0gQkFTRTsKLSAgICAgICAgczIgJT0gQkFTRTsKLSAgICB9Ci0gICAgcmV0dXJuIChzMiA8PCAxNikgfCBzMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9nemlwL2Z0Z3ppcC5jIGIvc3JjL2d6aXAvZnRnemlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODc3ODYuLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvZnRnemlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnemlwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN1cHBvcnQgZm9yIC5neiBjb21wcmVzc2VkIGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgb3B0aW9uYWwgY29tcG9uZW50IHJlbGllcyBvbiB6bGliLiAgSXQgc2hvdWxkIG1haW5seSBiZSB1c2VkIHRvICAgKi8KLS8qICBwYXJzZSBjb21wcmVzc2VkIFBDRiBmb250cywgYXMgZm91bmQgd2l0aCBtYW55IFgxMSBzZXJ2ZXIgICAgICAgICAgICAgICovCi0vKiAgZGlzdHJpYnV0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0daSVBfSAotI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAotCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgRlRFUlJPUlNfSF8KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIEd6aXBfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0d6aXAKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAiZ3ppcCBjb2RlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQgotCi0jaW5jbHVkZSA8emxpYi5oPgotCi0jZWxzZSAvKiAhRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQiAqLwotCi0gIC8qIEluIHRoaXMgY2FzZSwgd2UgaW5jbHVkZSBvdXIgb3duIG1vZGlmaWVkIHNvdXJjZXMgb2YgdGhlIFpMaWIgICovCi0gIC8qIHdpdGhpbiB0aGUgYGd6aXAnIGNvbXBvbmVudC4gIFRoZSBtb2RpZmljYXRpb25zIHdlcmUgbmVjZXNzYXJ5ICovCi0gIC8qIHRvICNpbmNsdWRlIGFsbCBmaWxlcyB3aXRob3V0IGNvbmZsaWN0cywgYXMgd2VsbCBhcyBwcmV2ZW50aW5nICovCi0gIC8qIHRoZSBkZWZpbml0aW9uIG9mIGBleHRlcm4nIGZ1bmN0aW9ucyB0aGF0IG1heSBjYXVzZSBsaW5raW5nICAgICovCi0gIC8qIGNvbmZsaWN0cyB3aGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBib3RoIEZyZWVUeXBlIGFuZCB0aGUgICovCi0gIC8qIG9yaWdpbmFsIFpMaWIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZm5kZWYgVVNFX1pMSUJfWkNBTExPQwotI2RlZmluZSBNWV9aQ0FMTE9DIC8qIHByZXZlbnQgYWxsIHpjYWxsb2MoKSAmIHpmcmVlKCkgaW4genV0aWwuYyAqLwotI2VuZGlmCi0KLSAgLyogTm90ZSB0aGF0IG91ciBgemxpYi5oJyBpbmNsdWRlcyBgZnR6Y29uZi5oJyBpbnN0ZWFkIG9mIGB6Y29uZi5oJzsgKi8KLSAgLyogdGhlIG1haW4gcmVhc29uIGlzIHRoYXQgZXZlbiBhIGdsb2JhbCBgemxpYi5oJyBpbmNsdWRlcyBgemNvbmYuaCcgKi8KLSAgLyogd2l0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAjaW5jbHVkZSAiemNvbmYuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogaW5zdGVhZCBvZiB0aGUgZXhwZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAjaW5jbHVkZSA8emNvbmYuaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogc28gdGhhdCBjb25maWd1cmF0aW9uIHdpdGggYEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUInIG1pZ2h0ICAgKi8KLSAgLyogaW5jbHVkZSB0aGUgd3JvbmcgYHpjb25mLmgnIGZpbGUsIGxlYWRpbmcgdG8gZXJyb3JzLiAgICAgICAgICAgICAgKi8KLSNpbmNsdWRlICJ6bGliLmgiCi0KLSN1bmRlZiAgU0xPVwotI2RlZmluZSBTTE9XICAxICAvKiB3ZSBjYW4ndCB1c2UgYXNtLW9wdGltaXplZCBzb3VyY2VzIGhlcmUhICovCi0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICAgICAgLyogVmlzdWFsIEMrKyAoYW5kIEludGVsIEMrKykgICAqLwotICAvKiBXZSBkaXNhYmxlIHRoZSB3YXJuaW5nIGBjb252ZXJzaW9uIGZyb20gWFhYIHRvIFlZWSwgICAgICovCi0gIC8qIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YScgaW4gb3JkZXIgdG8gY29tcGlsZSBjbGVhbmx5IHdpdGggKi8KLSAgLyogdGhlIG1heGltdW0gbGV2ZWwgb2Ygd2FybmluZ3M6IHpsaWIgaXMgbm9uLUZyZWVUeXBlICAgICAqLwotICAvKiBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQotI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI0NCApCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotICAvKiBVcmdoLiAgYGluZmxhdGVfbWFzaycgbXVzdCBub3QgYmUgZGVjbGFyZWQgdHdpY2UgLS0gQysrIGRvZXNuJ3QgbGlrZQotICAgICB0aGlzLiAgV2UgdGVtcG9yYXJpbHkgZGlzYWJsZSBpdCBhbmQgbG9hZCBhbGwgbmVjZXNzYXJ5IGhlYWRlciBmaWxlcy4gKi8KLSNkZWZpbmUgTk9fSU5GTEFURV9NQVNLCi0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZmJsb2NrLmgiCi0jaW5jbHVkZSAiaW5mY29kZXMuaCIKLSNpbmNsdWRlICJpbmZ1dGlsLmgiCi0jdW5kZWYgIE5PX0lORkxBVEVfTUFTSwotCi0gIC8qIGluZnV0aWwuYyBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSBpbmZjb2Rlcy5jICovCi0jaW5jbHVkZSAienV0aWwuYyIKLSNpbmNsdWRlICJpbmZ0cmVlcy5jIgotI2luY2x1ZGUgImluZnV0aWwuYyIKLSNpbmNsdWRlICJpbmZjb2Rlcy5jIgotI2luY2x1ZGUgImluZmJsb2NrLmMiCi0jaW5jbHVkZSAiaW5mbGF0ZS5jIgotI2luY2x1ZGUgImFkbGVyMzIuYyIKLQotI2lmIGRlZmluZWQoIF9NU0NfVkVSICkKLSNwcmFnbWEgd2FybmluZyggcG9wICkKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0vKioqKiogICAgICAgICAgICBaIEwgSSBCICAgTSBFIE0gTyBSIFkgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICoqKioqLwotLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGl0IGlzIGJldHRlciB0byB1c2UgRnJlZVR5cGUgbWVtb3J5IHJvdXRpbmVzIGluc3RlYWQgb2YgcmF3Ci0gICAgICdtYWxsb2MvZnJlZScgKi8KLQotICBzdGF0aWMgdm9pZHBmCi0gIGZ0X2d6aXBfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICB1SW50ICAgICAgIGl0ZW1zLAotICAgICAgICAgICAgICAgICB1SW50ICAgICAgIHNpemUgKQotICB7Ci0gICAgRlRfVUxvbmcgICAgc3ogPSAoRlRfVUxvbmcpc2l6ZSAqIGl0ZW1zOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX1BvaW50ZXIgIHAgID0gTlVMTDsKLQotCi0gICAgKHZvaWQpRlRfQUxMT0MoIHAsIHN6ICk7Ci0gICAgcmV0dXJuIHA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2d6aXBfZnJlZSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgdm9pZHBmICAgICBhZGRyZXNzICkKLSAgewotICAgIEZUX01FTV9GUkVFKCBhZGRyZXNzICk7Ci0gIH0KLQotCi0jaWYgIWRlZmluZWQoIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgKSAmJiAhZGVmaW5lZCggVVNFX1pMSUJfWkNBTExPQyApCi0KLSAgbG9jYWwgdm9pZHBmCi0gIHpjYWxsb2MgKCB2b2lkcGYgICAgb3BhcXVlLAotICAgICAgICAgICAgdW5zaWduZWQgIGl0ZW1zLAotICAgICAgICAgICAgdW5zaWduZWQgIHNpemUgKQotICB7Ci0gICAgcmV0dXJuIGZ0X2d6aXBfYWxsb2MoIChGVF9NZW1vcnkpb3BhcXVlLCBpdGVtcywgc2l6ZSApOwotICB9Ci0KLSAgbG9jYWwgdm9pZAotICB6Y2ZyZWUoIHZvaWRwZiAgb3BhcXVlLAotICAgICAgICAgIHZvaWRwZiAgcHRyICkKLSAgewotICAgIGZ0X2d6aXBfZnJlZSggKEZUX01lbW9yeSlvcGFxdWUsIHB0ciApOwotICB9Ci0KLSNlbmRpZiAvKiAhU1lTVEVNX1pMSUIgJiYgIVVTRV9aTElCX1pDQUxMT0MgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0vKioqKiogICAgICAgICAgICAgICBaIEwgSSBCICAgRiBJIEwgRSAgIEQgRSBTIEMgUiBJIFAgVCBPIFIgICAgICAgICAgICoqKioqLwotLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEZUX0daSVBfQlVGRkVSX1NJWkUgIDQwOTYKLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfR1ppcEZpbGVSZWNfCi0gIHsKLSAgICBGVF9TdHJlYW0gIHNvdXJjZTsgICAgICAgICAvKiBwYXJlbnQvc291cmNlIHN0cmVhbSAgICAgICAgKi8KLSAgICBGVF9TdHJlYW0gIHN0cmVhbTsgICAgICAgICAvKiBlbWJlZGRpbmcgc3RyZWFtICAgICAgICAgICAgKi8KLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsgICAgICAgICAvKiBtZW1vcnkgYWxsb2NhdG9yICAgICAgICAgICAgKi8KLSAgICB6X3N0cmVhbSAgIHpzdHJlYW07ICAgICAgICAvKiB6bGliIGlucHV0IHN0cmVhbSAgICAgICAgICAgKi8KLQotICAgIEZUX1VMb25nICAgc3RhcnQ7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHBvc2l0aW9uLCBhZnRlciAuZ3ogaGVhZGVyICovCi0gICAgRlRfQnl0ZSAgICBpbnB1dFtGVF9HWklQX0JVRkZFUl9TSVpFXTsgICAvKiBpbnB1dCByZWFkIGJ1ZmZlciAgKi8KLQotICAgIEZUX0J5dGUgICAgYnVmZmVyW0ZUX0daSVBfQlVGRkVSX1NJWkVdOyAgLyogb3V0cHV0IGJ1ZmZlciAgICAgICovCi0gICAgRlRfVUxvbmcgICBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3NpdGlvbiBpbiBvdXRwdXQgKi8KLSAgICBGVF9CeXRlKiAgIGN1cnNvcjsKLSAgICBGVF9CeXRlKiAgIGxpbWl0OwotCi0gIH0gRlRfR1ppcEZpbGVSZWMsICpGVF9HWmlwRmlsZTsKLQotCi0gIC8qIGd6aXAgZmxhZyBieXRlICovCi0jZGVmaW5lIEZUX0daSVBfQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IGFzY2lpIHRleHQgKi8KLSNkZWZpbmUgRlRfR1pJUF9IRUFEX0NSQyAgICAgMHgwMiAvKiBiaXQgMSBzZXQ6IGhlYWRlciBDUkMgcHJlc2VudCAqLwotI2RlZmluZSBGVF9HWklQX0VYVFJBX0ZJRUxEICAweDA0IC8qIGJpdCAyIHNldDogZXh0cmEgZmllbGQgcHJlc2VudCAqLwotI2RlZmluZSBGVF9HWklQX09SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KLSNkZWZpbmUgRlRfR1pJUF9DT01NRU5UICAgICAgMHgxMCAvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCi0jZGVmaW5lIEZUX0daSVBfUkVTRVJWRUQgICAgIDB4RTAgLyogYml0cyA1Li43OiByZXNlcnZlZCAqLwotCi0KLSAgLyogY2hlY2sgYW5kIHNraXAgLmd6IGhlYWRlciAtIHdlIGRvbid0IHN1cHBvcnQgYHRyYW5zcGFyZW50JyBjb21wcmVzc2lvbiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfZ3ppcF9jaGVja19oZWFkZXIoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9CeXRlICAgaGVhZFs0XTsKLQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMCApICAgICAgIHx8Ci0gICAgICAgICBGVF9TVFJFQU1fUkVBRCggaGVhZCwgNCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGhlYWRbMF0gJiYgaGVhZFsxXSBhcmUgdGhlIG1hZ2ljIG51bWJlcnM7ICAgICovCi0gICAgLyogaGVhZFsyXSBpcyB0aGUgbWV0aG9kLCBhbmQgaGVhZFszXSB0aGUgZmxhZ3MgKi8KLSAgICBpZiAoIGhlYWRbMF0gIT0gMHgxRiAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGhlYWRbMV0gIT0gMHg4QiAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGhlYWRbMl0gIT0gWl9ERUZMQVRFRCAgICAgICAgfHwKLSAgICAgICAgKGhlYWRbM10gJiBGVF9HWklQX1JFU0VSVkVEKSAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBza2lwIHRpbWUsIHhmbGFncyBhbmQgb3MgY29kZSAqLwotICAgICh2b2lkKUZUX1NUUkVBTV9TS0lQKCA2ICk7Ci0KLSAgICAvKiBza2lwIHRoZSBleHRyYSBmaWVsZCAqLwotICAgIGlmICggaGVhZFszXSAmIEZUX0daSVBfRVhUUkFfRklFTEQgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGxlbjsKLQotCi0gICAgICBpZiAoIEZUX1JFQURfVVNIT1JUX0xFKCBsZW4gKSB8fAotICAgICAgICAgICBGVF9TVFJFQU1fU0tJUCggbGVuICkgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogc2tpcCBvcmlnaW5hbCBmaWxlIG5hbWUgKi8KLSAgICBpZiAoIGhlYWRbM10gJiBGVF9HWklQX09SSUdfTkFNRSApCi0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICBGVF9VSW50ICBjOwotCi0KLSAgICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIGMgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggYyA9PSAwICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIC8qIHNraXAgLmd6IGNvbW1lbnQgKi8KLSAgICBpZiAoIGhlYWRbM10gJiBGVF9HWklQX0NPTU1FTlQgKQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgYzsKLQotCi0gICAgICAgIGlmICggRlRfUkVBRF9CWVRFKCBjICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIGMgPT0gMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAvKiBza2lwIENSQyAqLwotICAgIGlmICggaGVhZFszXSAmIEZUX0daSVBfSEVBRF9DUkMgKQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggMiApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfZ3ppcF9maWxlX2luaXQoIEZUX0daaXBGaWxlICB6aXAsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHNvdXJjZSApCi0gIHsKLSAgICB6X3N0cmVhbSogIHpzdHJlYW0gPSAmemlwLT56c3RyZWFtOwotICAgIEZUX0Vycm9yICAgZXJyb3IgICA9IEZUX0Vycl9PazsKLQotCi0gICAgemlwLT5zdHJlYW0gPSBzdHJlYW07Ci0gICAgemlwLT5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgemlwLT5tZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotICAgIHppcC0+bGltaXQgID0gemlwLT5idWZmZXIgKyBGVF9HWklQX0JVRkZFUl9TSVpFOwotICAgIHppcC0+Y3Vyc29yID0gemlwLT5saW1pdDsKLSAgICB6aXAtPnBvcyAgICA9IDA7Ci0KLSAgICAvKiBjaGVjayBhbmQgc2tpcCAuZ3ogaGVhZGVyICovCi0gICAgewotICAgICAgc3RyZWFtID0gc291cmNlOwotCi0gICAgICBlcnJvciA9IGZ0X2d6aXBfY2hlY2tfaGVhZGVyKCBzdHJlYW0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHppcC0+c3RhcnQgPSBGVF9TVFJFQU1fUE9TKCk7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSB6bGliIC0tIHRoZXJlIGlzIG5vIHpsaWIgaGVhZGVyIGluIHRoZSBjb21wcmVzc2VkIHN0cmVhbSAqLwotICAgIHpzdHJlYW0tPnphbGxvYyA9IChhbGxvY19mdW5jKWZ0X2d6aXBfYWxsb2M7Ci0gICAgenN0cmVhbS0+emZyZWUgID0gKGZyZWVfZnVuYykgZnRfZ3ppcF9mcmVlOwotICAgIHpzdHJlYW0tPm9wYXF1ZSA9IHN0cmVhbS0+bWVtb3J5OwotCi0gICAgenN0cmVhbS0+YXZhaWxfaW4gPSAwOwotICAgIHpzdHJlYW0tPm5leHRfaW4gID0gemlwLT5idWZmZXI7Ci0KLSAgICBpZiAoIGluZmxhdGVJbml0MiggenN0cmVhbSwgLU1BWF9XQklUUyApICE9IFpfT0sgfHwKLSAgICAgICAgICF6c3RyZWFtLT5uZXh0X2luICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9nemlwX2ZpbGVfZG9uZSggRlRfR1ppcEZpbGUgIHppcCApCi0gIHsKLSAgICB6X3N0cmVhbSogIHpzdHJlYW0gPSAmemlwLT56c3RyZWFtOwotCi0KLSAgICBpbmZsYXRlRW5kKCB6c3RyZWFtICk7Ci0KLSAgICAvKiBjbGVhciB0aGUgcmVzdCAqLwotICAgIHpzdHJlYW0tPnphbGxvYyAgICA9IE5VTEw7Ci0gICAgenN0cmVhbS0+emZyZWUgICAgID0gTlVMTDsKLSAgICB6c3RyZWFtLT5vcGFxdWUgICAgPSBOVUxMOwotICAgIHpzdHJlYW0tPm5leHRfaW4gICA9IE5VTEw7Ci0gICAgenN0cmVhbS0+bmV4dF9vdXQgID0gTlVMTDsKLSAgICB6c3RyZWFtLT5hdmFpbF9pbiAgPSAwOwotICAgIHpzdHJlYW0tPmF2YWlsX291dCA9IDA7Ci0KLSAgICB6aXAtPm1lbW9yeSA9IE5VTEw7Ci0gICAgemlwLT5zb3VyY2UgPSBOVUxMOwotICAgIHppcC0+c3RyZWFtID0gTlVMTDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2d6aXBfZmlsZV9yZXNldCggRlRfR1ppcEZpbGUgIHppcCApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IHppcC0+c291cmNlOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgIGlmICggIUZUX1NUUkVBTV9TRUVLKCB6aXAtPnN0YXJ0ICkgKQotICAgIHsKLSAgICAgIHpfc3RyZWFtKiAgenN0cmVhbSA9ICZ6aXAtPnpzdHJlYW07Ci0KLQotICAgICAgaW5mbGF0ZVJlc2V0KCB6c3RyZWFtICk7Ci0KLSAgICAgIHpzdHJlYW0tPmF2YWlsX2luICA9IDA7Ci0gICAgICB6c3RyZWFtLT5uZXh0X2luICAgPSB6aXAtPmlucHV0OwotICAgICAgenN0cmVhbS0+YXZhaWxfb3V0ID0gMDsKLSAgICAgIHpzdHJlYW0tPm5leHRfb3V0ICA9IHppcC0+YnVmZmVyOwotCi0gICAgICB6aXAtPmxpbWl0ICA9IHppcC0+YnVmZmVyICsgRlRfR1pJUF9CVUZGRVJfU0laRTsKLSAgICAgIHppcC0+Y3Vyc29yID0gemlwLT5saW1pdDsKLSAgICAgIHppcC0+cG9zICAgID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9nemlwX2ZpbGVfZmlsbF9pbnB1dCggRlRfR1ppcEZpbGUgIHppcCApCi0gIHsKLSAgICB6X3N0cmVhbSogIHpzdHJlYW0gPSAmemlwLT56c3RyZWFtOwotICAgIEZUX1N0cmVhbSAgc3RyZWFtICA9IHppcC0+c291cmNlOwotICAgIEZUX1VMb25nICAgc2l6ZTsKLQotCi0gICAgaWYgKCBzdHJlYW0tPnJlYWQgKQotICAgIHsKLSAgICAgIHNpemUgPSBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIHppcC0+aW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HWklQX0JVRkZFUl9TSVpFICk7Ci0gICAgICBpZiAoIHNpemUgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHppcC0+bGltaXQgPSB6aXAtPmN1cnNvcjsKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpemUgPSBzdHJlYW0tPnNpemUgLSBzdHJlYW0tPnBvczsKLSAgICAgIGlmICggc2l6ZSA+IEZUX0daSVBfQlVGRkVSX1NJWkUgKQotICAgICAgICBzaXplID0gRlRfR1pJUF9CVUZGRVJfU0laRTsKLQotICAgICAgaWYgKCBzaXplID09IDAgKQotICAgICAgewotICAgICAgICB6aXAtPmxpbWl0ID0gemlwLT5jdXJzb3I7Ci0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgICB9Ci0KLSAgICAgIEZUX01FTV9DT1BZKCB6aXAtPmlucHV0LCBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvcywgc2l6ZSApOwotICAgIH0KLSAgICBzdHJlYW0tPnBvcyArPSBzaXplOwotCi0gICAgenN0cmVhbS0+bmV4dF9pbiAgPSB6aXAtPmlucHV0OwotICAgIHpzdHJlYW0tPmF2YWlsX2luID0gc2l6ZTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9nemlwX2ZpbGVfZmlsbF9vdXRwdXQoIEZUX0daaXBGaWxlICB6aXAgKQotICB7Ci0gICAgel9zdHJlYW0qICB6c3RyZWFtID0gJnppcC0+enN0cmVhbTsKLSAgICBGVF9FcnJvciAgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0KLQotICAgIHppcC0+Y3Vyc29yICAgICAgICA9IHppcC0+YnVmZmVyOwotICAgIHpzdHJlYW0tPm5leHRfb3V0ICA9IHppcC0+Y3Vyc29yOwotICAgIHpzdHJlYW0tPmF2YWlsX291dCA9IEZUX0daSVBfQlVGRkVSX1NJWkU7Ci0KLSAgICB3aGlsZSAoIHpzdHJlYW0tPmF2YWlsX291dCA+IDAgKQotICAgIHsKLSAgICAgIGludCAgZXJyOwotCi0KLSAgICAgIGlmICggenN0cmVhbS0+YXZhaWxfaW4gPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gZnRfZ3ppcF9maWxlX2ZpbGxfaW5wdXQoIHppcCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZXJyID0gaW5mbGF0ZSggenN0cmVhbSwgWl9OT19GTFVTSCApOwotCi0gICAgICBpZiAoIGVyciA9PSBaX1NUUkVBTV9FTkQgKQotICAgICAgewotICAgICAgICB6aXAtPmxpbWl0ID0genN0cmVhbS0+bmV4dF9vdXQ7Ci0gICAgICAgIGlmICggemlwLT5saW1pdCA9PSB6aXAtPmN1cnNvciApCi0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGVyciAhPSBaX09LICkKLSAgICAgIHsKLSAgICAgICAgemlwLT5saW1pdCA9IHppcC0+Y3Vyc29yOwotICAgICAgICBlcnJvciAgICAgID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGZpbGwgb3V0cHV0IGJ1ZmZlcjsgYGNvdW50JyBtdXN0IGJlIDw9IEZUX0daSVBfQlVGRkVSX1NJWkUgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2d6aXBfZmlsZV9za2lwX291dHB1dCggRlRfR1ppcEZpbGUgIHppcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgY291bnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1VMb25nICBkZWx0YTsKLQotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBkZWx0YSA9IChGVF9VTG9uZykoIHppcC0+bGltaXQgLSB6aXAtPmN1cnNvciApOwotICAgICAgaWYgKCBkZWx0YSA+PSBjb3VudCApCi0gICAgICAgIGRlbHRhID0gY291bnQ7Ci0KLSAgICAgIHppcC0+Y3Vyc29yICs9IGRlbHRhOwotICAgICAgemlwLT5wb3MgICAgKz0gZGVsdGE7Ci0KLSAgICAgIGNvdW50IC09IGRlbHRhOwotICAgICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGVycm9yID0gZnRfZ3ppcF9maWxlX2ZpbGxfb3V0cHV0KCB6aXAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VTG9uZwotICBmdF9nemlwX2ZpbGVfaW8oIEZUX0daaXBGaWxlICB6aXAsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIHBvcywKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBjb3VudCApCi0gIHsKLSAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIC8qIFJlc2V0IGluZmxhdGUgc3RyZWFtIGlmIHdlJ3JlIHNlZWtpbmcgYmFja3dhcmRzLiAgICAgICAgKi8KLSAgICAvKiBZZXMsIHRoYXQgaXMgbm90IHRvbyBlZmZpY2llbnQsIGJ1dCBpdCBzYXZlcyBtZW1vcnkgOi0pICovCi0gICAgaWYgKCBwb3MgPCB6aXAtPnBvcyApCi0gICAgewotICAgICAgZXJyb3IgPSBmdF9nemlwX2ZpbGVfcmVzZXQoIHppcCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBza2lwIHVud2FudGVkIGJ5dGVzICovCi0gICAgaWYgKCBwb3MgPiB6aXAtPnBvcyApCi0gICAgewotICAgICAgZXJyb3IgPSBmdF9nemlwX2ZpbGVfc2tpcF9vdXRwdXQoIHppcCwgKEZUX1VMb25nKSggcG9zIC0gemlwLT5wb3MgKSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGNvdW50ID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbm93IHJlYWQgdGhlIGRhdGEgKi8KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIEZUX1VMb25nICBkZWx0YTsKLQotCi0gICAgICBkZWx0YSA9IChGVF9VTG9uZykoIHppcC0+bGltaXQgLSB6aXAtPmN1cnNvciApOwotICAgICAgaWYgKCBkZWx0YSA+PSBjb3VudCApCi0gICAgICAgIGRlbHRhID0gY291bnQ7Ci0KLSAgICAgIEZUX01FTV9DT1BZKCBidWZmZXIsIHppcC0+Y3Vyc29yLCBkZWx0YSApOwotICAgICAgYnVmZmVyICAgICAgKz0gZGVsdGE7Ci0gICAgICByZXN1bHQgICAgICArPSBkZWx0YTsKLSAgICAgIHppcC0+Y3Vyc29yICs9IGRlbHRhOwotICAgICAgemlwLT5wb3MgICAgKz0gZGVsdGE7Ci0KLSAgICAgIGNvdW50IC09IGRlbHRhOwotICAgICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGVycm9yID0gZnRfZ3ppcF9maWxlX2ZpbGxfb3V0cHV0KCB6aXAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotLyoqKioqICAgICAgICAgICAgICAgRyBaICAgRSBNIEIgRSBEIEQgSSBOIEcgICBTIFQgUiBFIEEgTSAgICAgICAgICAgICAqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBmdF9nemlwX3N0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfR1ppcEZpbGUgIHppcCAgICA9IChGVF9HWmlwRmlsZSlzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcjsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgIGlmICggemlwICkKLSAgICB7Ci0gICAgICAvKiBmaW5hbGl6ZSBnemlwIGZpbGUgZGVzY3JpcHRvciAqLwotICAgICAgZnRfZ3ppcF9maWxlX2RvbmUoIHppcCApOwotCi0gICAgICBGVF9GUkVFKCB6aXAgKTsKLQotICAgICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmICggIXN0cmVhbS0+cmVhZCApCi0gICAgICBGVF9GUkVFKCBzdHJlYW0tPmJhc2UgKTsKLSAgfQotCi0KLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcKLSAgZnRfZ3ppcF9zdHJlYW1faW8oIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBjb3VudCApCi0gIHsKLSAgICBGVF9HWmlwRmlsZSAgemlwID0gKEZUX0daaXBGaWxlKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyOwotCi0KLSAgICByZXR1cm4gZnRfZ3ppcF9maWxlX2lvKCB6aXAsIG9mZnNldCwgYnVmZmVyLCBjb3VudCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUxvbmcKLSAgZnRfZ3ppcF9nZXRfdW5jb21wcmVzc2VkX3NpemUoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgb2xkX3BvczsKLSAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKLQotCi0gICAgb2xkX3BvcyA9IHN0cmVhbS0+cG9zOwotICAgIGlmICggIUZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIHN0cmVhbS0+c2l6ZSAtIDQgKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gRlRfU3RyZWFtX1JlYWRVTG9uZ0xFKCBzdHJlYW0sICZlcnJvciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHJlc3VsdCA9IDA7Ci0KLSAgICAgICh2b2lkKUZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIG9sZF9wb3MgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z3ppcC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3Blbkd6aXAoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc291cmNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotICAgIEZUX0daaXBGaWxlICB6aXAgPSBOVUxMOwotCi0KLSAgICBpZiAoICFzdHJlYW0gfHwgIXNvdXJjZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fSGFuZGxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgbWVtb3J5ID0gc291cmNlLT5tZW1vcnk7Ci0KLSAgICAvKgotICAgICAqICBjaGVjayB0aGUgaGVhZGVyIHJpZ2h0IG5vdzsgdGhpcyBwcmV2ZW50cyBhbGxvY2F0aW5nIHVuLW5lY2Vzc2FyeQotICAgICAqICBvYmplY3RzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtCi0gICAgICovCi0gICAgZXJyb3IgPSBmdF9nemlwX2NoZWNrX2hlYWRlciggc291cmNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9aRVJPKCBzdHJlYW0gKTsKLSAgICBzdHJlYW0tPm1lbW9yeSA9IG1lbW9yeTsKLQotICAgIGlmICggIUZUX1FORVcoIHppcCApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGZ0X2d6aXBfZmlsZV9pbml0KCB6aXAsIHN0cmVhbSwgc291cmNlICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgRlRfRlJFRSggemlwICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSB6aXA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgV2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2sgdG8gdHJ5IHRvIGRyYW1hdGljYWxseSBpbXByb3ZlIHRoZQotICAgICAqICBwZXJmb3JtYW5jZSB3aGlsZSBkZWFsaW5nIHdpdGggc21hbGwgZmlsZXMuICBJZiB0aGUgb3JpZ2luYWwgc3RyZWFtCi0gICAgICogIHNpemUgaXMgbGVzcyB0aGFuIGEgY2VydGFpbiB0aHJlc2hvbGQsIHdlIHRyeSB0byBsb2FkIHRoZSB3aG9sZSBmb250Ci0gICAgICogIGZpbGUgaW50byBtZW1vcnkuICBUaGlzIHNhdmVzIHVzIGZyb20gdXNpbmcgdGhlIDMyS0IgYnVmZmVyIG5lZWRlZAotICAgICAqICB0byBpbmZsYXRlIHRoZSBmaWxlLCBwbHVzIHRoZSB0d28gNEtCIGludGVybWVkaWF0ZSBpbnB1dC9vdXRwdXQKLSAgICAgKiAgYnVmZmVycyB1c2VkIGluIHRoZSBgRlRfR1ppcEZpbGUnIHN0cnVjdHVyZS4KLSAgICAgKi8KLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgemlwX3NpemUgPSBmdF9nemlwX2dldF91bmNvbXByZXNzZWRfc2l6ZSggc291cmNlICk7Ci0KLQotICAgICAgaWYgKCB6aXBfc2l6ZSAhPSAwICYmIHppcF9zaXplIDwgNDAgKiAxMDI0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIHppcF9idWZmID0gTlVMTDsKLQotCi0gICAgICAgIGlmICggIUZUX0FMTE9DKCB6aXBfYnVmZiwgemlwX3NpemUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VTG9uZyAgY291bnQ7Ci0KLQotICAgICAgICAgIGNvdW50ID0gZnRfZ3ppcF9maWxlX2lvKCB6aXAsIDAsIHppcF9idWZmLCB6aXBfc2l6ZSApOwotICAgICAgICAgIGlmICggY291bnQgPT0gemlwX3NpemUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZ0X2d6aXBfZmlsZV9kb25lKCB6aXAgKTsKLSAgICAgICAgICAgIEZUX0ZSRUUoIHppcCApOwotCi0gICAgICAgICAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHN0cmVhbS0+c2l6ZSAgPSB6aXBfc2l6ZTsKLSAgICAgICAgICAgIHN0cmVhbS0+cG9zICAgPSAwOwotICAgICAgICAgICAgc3RyZWFtLT5iYXNlICA9IHppcF9idWZmOwotICAgICAgICAgICAgc3RyZWFtLT5yZWFkICA9IE5VTEw7Ci0gICAgICAgICAgICBzdHJlYW0tPmNsb3NlID0gZnRfZ3ppcF9zdHJlYW1fY2xvc2U7Ci0KLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBmdF9nemlwX2ZpbGVfaW8oIHppcCwgMCwgTlVMTCwgMCApOwotICAgICAgICAgIEZUX0ZSRUUoIHppcF9idWZmICk7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggemlwX3NpemUgKQotICAgICAgICBzdHJlYW0tPnNpemUgPSB6aXBfc2l6ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyZWFtLT5zaXplICA9IDB4N0ZGRkZGRkZMOyAgLyogZG9uJ3Qga25vdyB0aGUgcmVhbCBzaXplISAqLwotICAgIH0KLQotICAgIHN0cmVhbS0+cG9zICAgPSAwOwotICAgIHN0cmVhbS0+YmFzZSAgPSBOVUxMOwotICAgIHN0cmVhbS0+cmVhZCAgPSBmdF9nemlwX3N0cmVhbV9pbzsKLSAgICBzdHJlYW0tPmNsb3NlID0gZnRfZ3ppcF9zdHJlYW1fY2xvc2U7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnemlwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0d6aXBfVW5jb21wcmVzcyggRlRfTWVtb3J5ICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICBvdXRwdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaW5wdXRfbGVuICkKLSAgewotICAgIHpfc3RyZWFtICBzdHJlYW07Ci0gICAgaW50ICAgICAgIGVycjsKLQotCi0gICAgLyogY2hlY2sgZm9yIGBpbnB1dCcgZGVsYXllZCB0byBgaW5mbGF0ZScgKi8KLQotICAgIGlmICggIW1lbW9yeSB8fCAhIG91dHB1dF9sZW4gfHwgIW91dHB1dCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIC8qIHRoaXMgZnVuY3Rpb24gaXMgbW9kZWxlZCBhZnRlciB6bGliJ3MgYHVuY29tcHJlc3MnIGZ1bmN0aW9uICovCi0KLSAgICBzdHJlYW0ubmV4dF9pbiAgPSAoQnl0ZWYqKWlucHV0OwotICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWlucHV0X2xlbjsKLQotICAgIHN0cmVhbS5uZXh0X291dCAgPSBvdXRwdXQ7Ci0gICAgc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSpvdXRwdXRfbGVuOwotCi0gICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKWZ0X2d6aXBfYWxsb2M7Ci0gICAgc3RyZWFtLnpmcmVlICA9IChmcmVlX2Z1bmMpIGZ0X2d6aXBfZnJlZTsKLSAgICBzdHJlYW0ub3BhcXVlID0gbWVtb3J5OwotCi0gICAgZXJyID0gaW5mbGF0ZUluaXQyKCAmc3RyZWFtLCBNQVhfV0JJVFMgKTsKLSAgICBpZiAoIGVyciAhPSBaX09LICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyID0gaW5mbGF0ZSggJnN0cmVhbSwgWl9GSU5JU0ggKTsKLSAgICBpZiAoIGVyciAhPSBaX1NUUkVBTV9FTkQgKQotICAgIHsKLSAgICAgIGluZmxhdGVFbmQoICZzdHJlYW0gKTsKLSAgICAgIGlmICggZXJyID09IFpfT0sgKQotICAgICAgICBlcnIgPSBaX0JVRl9FUlJPUjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICpvdXRwdXRfbGVuID0gc3RyZWFtLnRvdGFsX291dDsKLQotICAgICAgZXJyID0gaW5mbGF0ZUVuZCggJnN0cmVhbSApOwotICAgIH0KLQotICAgIGlmICggZXJyID09IFpfTUVNX0VSUk9SICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotCi0gICAgaWYgKCBlcnIgPT0gWl9CVUZfRVJST1IgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBBcnJheV9Ub29fTGFyZ2UgKTsKLQotICAgIGlmICggZXJyID09IFpfREFUQV9FUlJPUiApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0jZWxzZSAvKiAhRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQiAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5HemlwKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHNvdXJjZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotICAgIEZUX1VOVVNFRCggc291cmNlICk7Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0d6aXBfVW5jb21wcmVzcyggRlRfTWVtb3J5ICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICBvdXRwdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaW5wdXRfbGVuICkKLSAgewotICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0gICAgRlRfVU5VU0VEKCBvdXRwdXQgKTsKLSAgICBGVF9VTlVTRUQoIG91dHB1dF9sZW4gKTsKLSAgICBGVF9VTlVTRUQoIGlucHV0ICk7Ci0gICAgRlRfVU5VU0VEKCBpbnB1dF9sZW4gKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gIH0KLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC9mdHpjb25mLmggYi9zcmMvZ3ppcC9mdHpjb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmYwYmEuLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvZnR6Y29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaWZuZGVmIF9aQ09ORl9ICi0jZGVmaW5lIF9aQ09ORl9ICi0KLS8qCi0gKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCi0gKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KLSAqLwotI2lmZGVmIFpfUFJFRklYCi0jICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgel9kZWZsYXRlSW5pdF8KLSMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICB6X2RlZmxhdGUKLSMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICB6X2RlZmxhdGVFbmQKLSMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICB6X2luZmxhdGVJbml0XwotIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgIHpfaW5mbGF0ZQotIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgIHpfaW5mbGF0ZUVuZAotIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgIHpfZGVmbGF0ZUluaXQyXwotIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5IHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKLSMgIGRlZmluZSBkZWZsYXRlQ29weSAgICAgICAgICB6X2RlZmxhdGVDb3B5Ci0jICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgel9kZWZsYXRlUmVzZXQKLSMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICB6X2RlZmxhdGVQYXJhbXMKLSMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICB6X2luZmxhdGVJbml0Ml8KLSMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSB6X2luZmxhdGVTZXREaWN0aW9uYXJ5Ci0jICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgel9pbmZsYXRlU3luYwotIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAotIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgIHpfaW5mbGF0ZVJlc2V0Ci0jICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgel9jb21wcmVzcwotIyAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgIHpfY29tcHJlc3MyCi0jICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgel91bmNvbXByZXNzCi0jICBkZWZpbmUgYWRsZXIzMiAgICAgICAgICAgICAgel9hZGxlcjMyCi0jICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgel9jcmMzMgotIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgIHpfZ2V0X2NyY190YWJsZQotCi0jICBkZWZpbmUgQnl0ZSAgIHpfQnl0ZQotIyAgZGVmaW5lIHVJbnQgICB6X3VJbnQKLSMgIGRlZmluZSB1TG9uZyAgel91TG9uZwotIyAgZGVmaW5lIEJ5dGVmICB6X0J5dGVmCi0jICBkZWZpbmUgY2hhcmYgIHpfY2hhcmYKLSMgIGRlZmluZSBpbnRmICAgel9pbnRmCi0jICBkZWZpbmUgdUludGYgIHpfdUludGYKLSMgIGRlZmluZSB1TG9uZ2Ygel91TG9uZ2YKLSMgIGRlZmluZSB2b2lkcGYgel92b2lkcGYKLSMgIGRlZmluZSB2b2lkcCAgel92b2lkcAotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkgJiYgIWRlZmluZWQoV0lOMzIpCi0jICBkZWZpbmUgV0lOMzIKLSNlbmRpZgotI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX18zODZfXykgfHwgZGVmaW5lZChpMzg2KQotIyAgaWZuZGVmIF9fMzJCSVRfXwotIyAgICBkZWZpbmUgX18zMkJJVF9fCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQotIyAgZGVmaW5lIE1TRE9TCi0jZW5kaWYKLQotLyogV2luQ0UgZG9lc24ndCBoYXZlIGVycm5vLmggKi8KLSNpZmRlZiBfV0lOMzJfV0NFCi0jICBkZWZpbmUgTk9fRVJSTk9fSAotI2VuZGlmCi0KLQotLyoKLSAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCi0gKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCi0gKi8KLSNpZiBkZWZpbmVkKE1TRE9TKSAmJiAhZGVmaW5lZChfXzMyQklUX18pCi0jICBkZWZpbmUgTUFYU0VHXzY0SwotI2VuZGlmCi0jaWZkZWYgTVNET1MKLSMgIGRlZmluZSBVTkFMSUdORURfT0sKLSNlbmRpZgotCi0jaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKSAgJiYgIWRlZmluZWQoU1REQykKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fT1MyX18pCi0jICBpZm5kZWYgU1REQwotIyAgICBkZWZpbmUgU1REQwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFNUREMKLSMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KLSMgICAgZGVmaW5lIGNvbnN0Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCi0jaWYgZGVmaW5lZChfX01XRVJLU19fKSB8fCBkZWZpbmVkKGFwcGxlYykgfHxkZWZpbmVkKFRISU5LX0MpIHx8ZGVmaW5lZChfX1NDX18pCi0jICBkZWZpbmUgTk9fRFVNTVlfREVDTAotI2VuZGlmCi0KLS8qIE9sZCBCb3JsYW5kIEMgYW5kIExDQyBpbmNvcnJlY3RseSBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyByZXR1cm5zOiAqLwotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1MDApCi0jICBkZWZpbmUgTkVFRF9EVU1NWV9SRVRVUk4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0xDQ19fKQotIyAgZGVmaW5lICBORUVEX0RVTU1ZX1JFVFVSTgotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLwotI2lmbmRlZiBNQVhfTUVNX0xFVkVMCi0jICBpZmRlZiBNQVhTRUdfNjRLCi0jICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgotICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcwotICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5Ci0gKiBnemlwLikKLSAqLwotI2lmbmRlZiBNQVhfV0JJVFMKLSMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KLSNlbmRpZgotCi0vKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKLSAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCi0gdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCi0gcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKLSB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKLSAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgotIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCi0KLSAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cwotIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKLSBmb3Igc21hbGwgb2JqZWN0cy4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotIyAgaWZkZWYgU1REQwotIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAotICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KLSAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQotICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAotICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgotICovCi0jaWYgKGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKSkgJiYgIWRlZmluZWQoX18zMkJJVF9fKQotICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgZGVmaW5lIFNNQUxMX01FRElVTQotIyAgaWZkZWYgX01TQ19WRVIKLSMgICAgZGVmaW5lIEZBUiBfZmFyCi0jICBlbHNlCi0jICAgIGRlZmluZSBGQVIgZmFyCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKLSMgIGlmbmRlZiBfXzMyQklUX18KLSMgICAgZGVmaW5lIFNNQUxMX01FRElVTQotIyAgICBkZWZpbmUgRkFSIF9mYXIKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogQ29tcGlsZSB3aXRoIC1EWkxJQl9ETEwgZm9yIFdpbmRvd3MgRExMIHN1cHBvcnQgKi8KLSNpZiBkZWZpbmVkKFpMSUJfRExMKQotIyAgaWYgZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChXSU5ET1dTKQotIyAgICBpZmRlZiBGQVIKLSMgICAgICB1bmRlZiBGQVIKLSMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSA8d2luZG93cy5oPgotIyAgICBkZWZpbmUgWkVYUE9SVCh4KSAgeCBXSU5BUEkKLSMgICAgaWZkZWYgV0lOMzIKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBKHgpICB4IFdJTkFQSVYKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBaRVhQT1JUVkEoeCkgIHggRkFSIF9jZGVjbCBfZXhwb3J0Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQotIyAgICBpZiAoX19CT1JMQU5EQ19fID49IDB4MDUwMCkgJiYgZGVmaW5lZCAoV0lOMzIpCi0jICAgICAgaW5jbHVkZSA8d2luZG93cy5oPgotIyAgICAgIGRlZmluZSBaRVhQT1JUKHgpIHggX19kZWNsc3BlYyhkbGxleHBvcnQpIFdJTkFQSQotIyAgICAgIGRlZmluZSBaRVhQT1JUUlZBKHgpICB4IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBXSU5BUElWCi0jICAgIGVsc2UKLSMgICAgICBpZiBkZWZpbmVkIChfV2luZG93cykgJiYgZGVmaW5lZCAoX19ETExfXykKLSMgICAgICAgIGRlZmluZSBaRVhQT1JUKHgpIHggX2V4cG9ydAotIyAgICAgICAgZGVmaW5lIFpFWFBPUlRWQSh4KSB4IF9leHBvcnQKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0KLSNpZm5kZWYgWkVYUE9SVAotIyAgZGVmaW5lIFpFWFBPUlQoeCkgICBzdGF0aWMgeAotI2VuZGlmCi0jaWZuZGVmIFpFWFBPUlRWQQotIyAgZGVmaW5lIFpFWFBPUlRWQSh4KSAgIHN0YXRpYyB4Ci0jZW5kaWYKLSNpZm5kZWYgWkVYVEVSTgotIyAgZGVmaW5lIFpFWFRFUk4oeCkgc3RhdGljIHgKLSNlbmRpZgotI2lmbmRlZiBaRVhURVJOREVGCi0jICBkZWZpbmUgWkVYVEVSTkRFRih4KSAgc3RhdGljIHgKLSNlbmRpZgotCi0jaWZuZGVmIEZBUgotIyAgIGRlZmluZSBGQVIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKFRBUkdFVF9PU19NQUMpCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KLQotI2lmZGVmIFNNQUxMX01FRElVTQotICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KLSMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgotI2Vsc2UKLSAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOwotI2VuZGlmCi10eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKLXR5cGVkZWYgaW50ICAgRkFSIGludGY7Ci10eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKLXR5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKLQotI2lmZGVmIFNUREMKLSAgIHR5cGVkZWYgdm9pZCBGQVIgKnZvaWRwZjsKLSAgIHR5cGVkZWYgdm9pZCAgICAgKnZvaWRwOwotI2Vsc2UKLSAgIHR5cGVkZWYgQnl0ZSBGQVIgKnZvaWRwZjsKLSAgIHR5cGVkZWYgQnl0ZSAgICAgKnZvaWRwOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KLSMgIGRlZmluZSB6X29mZl90ICBvZmZfdAotI2VuZGlmCi0jaWZuZGVmIFNFRUtfU0VUCi0jICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KLSMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCi0jICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLwotI2VuZGlmCi0jaWZuZGVmIHpfb2ZmX3QKLSMgIGRlZmluZSAgel9vZmZfdCBsb25nCi0jZW5kaWYKLQotLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KLSNpZiBkZWZpbmVkKF9fTVZTX18pCi0jICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9ibG9ja3MsIklOQkwiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9ibG9ja3NfbmV3LCJJTkJMTkUiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9ibG9ja3NfZnJlZSwiSU5CTEZSIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVfYmxvY2tzX3Jlc2V0LCJJTkJMUkUiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb2Rlc19mcmVlLCJJTkNPRlIiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb2RlcywiSU5DTyIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mbHVzaCwiSU5GTFUiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9tYXNrLCJJTk1BIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVfc2V0X2RpY3Rpb25hcnksIklOU0VESTIiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2JpdHMsIklOVFJCSSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2R5bmFtaWMsIklOVFJEWSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2ZpeGVkLCJJTlRSRkkiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90cmVlc19mcmVlLCJJTlRSRlIiKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvaW5mYmxvY2suYyBiL3NyYy9nemlwL2luZmJsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTJkYzIuLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvaW5mYmxvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKiBpbmZibG9jay5jIC0tIGludGVycHJldCBhbmQgcHJvY2VzcyBibG9jayB0eXBlcyB0byBsYXN0IGJsb2NrCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mYmxvY2suaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZmNvZGVzLmgiCi0jaW5jbHVkZSAiaW5mdXRpbC5oIgotCi0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi0vKiBUYWJsZSBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCi1sb2NhbCBjb25zdCB1SW50IGJvcmRlcltdID0geyAvKiBPcmRlciBvZiB0aGUgYml0IGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07Ci0KLS8qCi0gICBOb3RlcyBiZXlvbmQgdGhlIDEuOTNhIGFwcG5vdGUudHh0OgotCi0gICAxLiBEaXN0YW5jZSBwb2ludGVycyBuZXZlciBwb2ludCBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0Ci0gICAgICBzdHJlYW0uCi0gICAyLiBEaXN0YW5jZSBwb2ludGVycyBjYW4gcG9pbnQgYmFjayBhY3Jvc3MgYmxvY2tzLCB1cCB0byAzMmsgYXdheS4KLSAgIDMuIFRoZXJlIGlzIGFuIGltcGxpZWQgbWF4aW11bSBvZiA3IGJpdHMgZm9yIHRoZSBiaXQgbGVuZ3RoIHRhYmxlIGFuZAotICAgICAgMTUgYml0cyBmb3IgdGhlIGFjdHVhbCBkYXRhLgotICAgNC4gSWYgb25seSBvbmUgY29kZSBleGlzdHMsIHRoZW4gaXQgaXMgZW5jb2RlZCB1c2luZyBvbmUgYml0LiAgKFplcm8KLSAgICAgIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgcGVyaGFwcyBhIGxpdHRsZSBjb25mdXNpbmcuKSAgSWYgdHdvCi0gICAgICBjb2RlcyBleGlzdCwgdGhleSBhcmUgY29kZWQgdXNpbmcgb25lIGJpdCBlYWNoICgwIGFuZCAxKS4KLSAgIDUuIFRoZXJlIGlzIG5vIHdheSBvZiBzZW5kaW5nIHplcm8gZGlzdGFuY2UgY29kZXMtLWEgZHVtbXkgbXVzdCBiZQotICAgICAgc2VudCBpZiB0aGVyZSBhcmUgbm9uZS4gIChIaXN0b3J5OiBhIHByZSAyLjAgdmVyc2lvbiBvZiBQS1pJUCB3b3VsZAotICAgICAgc3RvcmUgYmxvY2tzIHdpdGggbm8gZGlzdGFuY2UgY29kZXMsIGJ1dCB0aGlzIHdhcyBkaXNjb3ZlcmVkIHRvIGJlCi0gICAgICB0b28gaGFyc2ggYSBjcml0ZXJpb24uKSAgVmFsaWQgb25seSBmb3IgMS45M2EuICAyLjA0YyBkb2VzIGFsbG93Ci0gICAgICB6ZXJvIGRpc3RhbmNlIGNvZGVzLCB3aGljaCBpcyBzZW50IGFzIG9uZSBjb2RlIG9mIHplcm8gYml0cyBpbgotICAgICAgbGVuZ3RoLgotICAgNi4gVGhlcmUgYXJlIHVwIHRvIDI4NiBsaXRlcmFsL2xlbmd0aCBjb2Rlcy4gIENvZGUgMjU2IHJlcHJlc2VudHMgdGhlCi0gICAgICBlbmQtb2YtYmxvY2suICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgc3RhdGljIGxlbmd0aCB0cmVlIGRlZmluZXMKLSAgICAgIDI4OCBjb2RlcyBqdXN0IHRvIGZpbGwgb3V0IHRoZSBIdWZmbWFuIGNvZGVzLiAgQ29kZXMgMjg2IGFuZCAyODcKLSAgICAgIGNhbm5vdCBiZSB1c2VkIHRob3VnaCwgc2luY2UgdGhlcmUgaXMgbm8gbGVuZ3RoIGJhc2Ugb3IgZXh0cmEgYml0cwotICAgICAgZGVmaW5lZCBmb3IgdGhlbS4gIFNpbWlsYXJpbHksIHRoZXJlIGFyZSB1cCB0byAzMCBkaXN0YW5jZSBjb2Rlcy4KLSAgICAgIEhvd2V2ZXIsIHN0YXRpYyB0cmVlcyBkZWZpbmUgMzIgY29kZXMgKGFsbCA1IGJpdHMpIHRvIGZpbGwgb3V0IHRoZQotICAgICAgSHVmZm1hbiBjb2RlcywgYnV0IHRoZSBsYXN0IHR3byBoYWQgYmV0dGVyIG5vdCBzaG93IHVwIGluIHRoZSBkYXRhLgotICAgNy4gVW56aXAgY2FuIGNoZWNrIGR5bmFtaWMgSHVmZm1hbiBibG9ja3MgZm9yIGNvbXBsZXRlIGNvZGUgc2V0cy4KLSAgICAgIFRoZSBleGNlcHRpb24gaXMgdGhhdCBhIHNpbmdsZSBjb2RlIHdvdWxkIG5vdCBiZSBjb21wbGV0ZSAoc2VlICM0KS4KLSAgIDguIFRoZSBmaXZlIGJpdHMgZm9sbG93aW5nIHRoZSBibG9jayB0eXBlIGlzIHJlYWxseSB0aGUgbnVtYmVyIG9mCi0gICAgICBsaXRlcmFsIGNvZGVzIHNlbnQgbWludXMgMjU3LgotICAgOS4gTGVuZ3RoIGNvZGVzIDgsMTYsMTYgYXJlIGludGVycHJldGVkIGFzIDEzIGxlbmd0aCBjb2RlcyBvZiA4IGJpdHMKLSAgICAgICgxKzYrNikuICBUaGVyZWZvcmUsIHRvIG91dHB1dCB0aHJlZSB0aW1lcyB0aGUgbGVuZ3RoLCB5b3Ugb3V0cHV0Ci0gICAgICB0aHJlZSBjb2RlcyAoMSsxKzEpLCB3aGVyZWFzIHRvIG91dHB1dCBmb3VyIHRpbWVzIHRoZSBzYW1lIGxlbmd0aCwKLSAgICAgIHlvdSBvbmx5IG5lZWQgdHdvIGNvZGVzICgxKzMpLiAgSG1tLgotICAxMC4gSW4gdGhlIHRyZWUgcmVjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLCBDb2RlID0gQ29kZSArIEluY3JlbWVudAotICAgICAgb25seSBpZiBCaXRMZW5ndGgoaSkgaXMgbm90IHplcm8uICAoUHJldHR5IG9idmlvdXMuKQotICAxMS4gQ29ycmVjdGlvbjogNCBCaXRzOiAjIG9mIEJpdCBMZW5ndGggY29kZXMgLSA0ICAgICAoNCAtIDE5KQotICAxMi4gTm90ZTogbGVuZ3RoIGNvZGUgMjg0IGNhbiByZXByZXNlbnQgMjI3LTI1OCwgYnV0IGxlbmd0aCBjb2RlIDI4NQotICAgICAgcmVhbGx5IGlzIDI1OC4gIFRoZSBsYXN0IGxlbmd0aCBkZXNlcnZlcyBpdHMgb3duLCBzaG9ydCBjb2RlCi0gICAgICBzaW5jZSBpdCBnZXRzIHVzZWQgYSBsb3QgaW4gdmVyeSByZWR1bmRhbnQgZmlsZXMuICBUaGUgbGVuZ3RoCi0gICAgICAyNTggaXMgc3BlY2lhbCBzaW5jZSAyNTggLSAzICh0aGUgbWluIG1hdGNoIGxlbmd0aCkgaXMgMjU1LgotICAxMy4gVGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGJpdCBsZW5ndGhzIGFyZSByZWFkIGFzIGEKLSAgICAgIHNpbmdsZSBzdHJlYW0gb2YgbGVuZ3Rocy4gIEl0IGlzIHBvc3NpYmxlIChhbmQgYWR2YW50YWdlb3VzKSBmb3IKLSAgICAgIGEgcmVwZWF0IGNvZGUgKDE2LCAxNywgb3IgMTgpIHRvIGdvIGFjcm9zcyB0aGUgYm91bmRhcnkgYmV0d2VlbgotICAgICAgdGhlIHR3byBzZXRzIG9mIGxlbmd0aHMuCi0gKi8KLQotCi1sb2NhbCB2b2lkIGluZmxhdGVfYmxvY2tzX3Jlc2V0KCAvKiBzLCB6LCBjKSAqLwotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzLAotel9zdHJlYW1wIHosCi11TG9uZ2YgKmMgKQotewotICBpZiAoYyAhPSBaX05VTEwpCi0gICAgKmMgPSBzLT5jaGVjazsKLSAgaWYgKHMtPm1vZGUgPT0gQlRSRUUgfHwgcy0+bW9kZSA9PSBEVFJFRSkKLSAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOwotICBpZiAocy0+bW9kZSA9PSBDT0RFUykKLSAgICBpbmZsYXRlX2NvZGVzX2ZyZWUocy0+c3ViLmRlY29kZS5jb2Rlcywgeik7Ci0gIHMtPm1vZGUgPSBUWVBFOwotICBzLT5iaXRrID0gMDsKLSAgcy0+Yml0YiA9IDA7Ci0gIHMtPnJlYWQgPSBzLT53cml0ZSA9IHMtPndpbmRvdzsKLSAgaWYgKHMtPmNoZWNrZm4gIT0gWl9OVUxMKQotICAgIHotPmFkbGVyID0gcy0+Y2hlY2sgPSAoKnMtPmNoZWNrZm4pKDBMLCAoY29uc3QgQnl0ZWYgKilaX05VTEwsIDApOwotICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgYmxvY2tzIHJlc2V0XG4iKSk7Ci19Ci0KLQotbG9jYWwgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICppbmZsYXRlX2Jsb2Nrc19uZXcoIC8qIHosIGMsIHcpICovCi16X3N0cmVhbXAgeiwKLWNoZWNrX2Z1bmMgYywKLXVJbnQgdyApCi17Ci0gIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKLQotICBpZiAoKHMgPSAoaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICopWkFMTE9DCi0gICAgICAgKHosMSxzaXplb2Yoc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlKSkpID09IFpfTlVMTCkKLSAgICByZXR1cm4gczsKLSAgaWYgKChzLT5odWZ0cyA9Ci0gICAgICAgKGluZmxhdGVfaHVmdCAqKVpBTExPQyh6LCBzaXplb2YoaW5mbGF0ZV9odWZ0KSwgTUFOWSkpID09IFpfTlVMTCkKLSAgewotICAgIFpGUkVFKHosIHMpOwotICAgIHJldHVybiBaX05VTEw7Ci0gIH0KLSAgaWYgKChzLT53aW5kb3cgPSAoQnl0ZWYgKilaQUxMT0MoeiwgMSwgdykpID09IFpfTlVMTCkKLSAgewotICAgIFpGUkVFKHosIHMtPmh1ZnRzKTsKLSAgICBaRlJFRSh6LCBzKTsKLSAgICByZXR1cm4gWl9OVUxMOwotICB9Ci0gIHMtPmVuZCA9IHMtPndpbmRvdyArIHc7Ci0gIHMtPmNoZWNrZm4gPSBjOwotICBzLT5tb2RlID0gVFlQRTsKLSAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGJsb2NrcyBhbGxvY2F0ZWRcbiIpKTsKLSAgaW5mbGF0ZV9ibG9ja3NfcmVzZXQocywgeiwgWl9OVUxMKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLQotbG9jYWwgaW50IGluZmxhdGVfYmxvY2tzKCAvKiBzLCB6LCByKSAqLwotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzLAotel9zdHJlYW1wIHosCi1pbnQgciApCi17Ci0gIHVJbnQgdDsgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSAqLwotICB1TG9uZyBiOyAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwotICB1SW50IGs7ICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCi0gIEJ5dGVmICpwOyAgICAgICAgICAgICAvKiBpbnB1dCBkYXRhIHBvaW50ZXIgKi8KLSAgdUludCBuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIGF2YWlsYWJsZSB0aGVyZSAqLwotICBCeXRlZiAqcTsgICAgICAgICAgICAgLyogb3V0cHV0IHdpbmRvdyB3cml0ZSBwb2ludGVyICovCi0gIHVJbnQgbTsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBlbmQgb2Ygd2luZG93IG9yIHJlYWQgcG9pbnRlciAqLwotCi0gIC8qIGNvcHkgaW5wdXQvb3V0cHV0IGluZm9ybWF0aW9uIHRvIGxvY2FscyAoVVBEQVRFIG1hY3JvIHJlc3RvcmVzKSAqLwotICBMT0FECi0KLSAgLyogcHJvY2VzcyBpbnB1dCBiYXNlZCBvbiBjdXJyZW50IHN0YXRlICovCi0gIHdoaWxlICgxKSBzd2l0Y2ggKHMtPm1vZGUpCi0gIHsKLSAgICBjYXNlIFRZUEU6Ci0gICAgICBORUVEQklUUygzKQotICAgICAgdCA9ICh1SW50KWIgJiA3OwotICAgICAgcy0+bGFzdCA9IHQgJiAxOwotICAgICAgc3dpdGNoICh0ID4+IDEpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkICovCi0gICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgIHMtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgIERVTVBCSVRTKDMpCi0gICAgICAgICAgdCA9IGsgJiA3OyAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLwotICAgICAgICAgIERVTVBCSVRTKHQpCi0gICAgICAgICAgcy0+bW9kZSA9IExFTlM7ICAgICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBvZiBzdG9yZWQgYmxvY2sgKi8KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCAqLwotICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgIHMtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVJbnQgYmwsIGJkOwotICAgICAgICAgICAgaW5mbGF0ZV9odWZ0ICp0bCwgKnRkOwotCi0gICAgICAgICAgICBpbmZsYXRlX3RyZWVzX2ZpeGVkKCZibCwgJmJkLCAoY29uc3QgaW5mbGF0ZV9odWZ0KiopJnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGluZmxhdGVfaHVmdCoqKSZ0ZCwgeik7Ci0gICAgICAgICAgICBzLT5zdWIuZGVjb2RlLmNvZGVzID0gaW5mbGF0ZV9jb2Rlc19uZXcoYmwsIGJkLCB0bCwgdGQsIHopOwotICAgICAgICAgICAgaWYgKHMtPnN1Yi5kZWNvZGUuY29kZXMgPT0gWl9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByID0gWl9NRU1fRVJST1I7Ci0gICAgICAgICAgICAgIExFQVZFCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIERVTVBCSVRTKDMpCi0gICAgICAgICAgcy0+bW9kZSA9IENPREVTOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgKi8KLSAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgIHMtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgIERVTVBCSVRTKDMpCi0gICAgICAgICAgcy0+bW9kZSA9IFRBQkxFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlsbGVnYWwgKi8KLSAgICAgICAgICBEVU1QQklUUygzKQotICAgICAgICAgIHMtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOwotICAgICAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgTEVBVkUKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTEVOUzoKLSAgICAgIE5FRURCSVRTKDMyKQotICAgICAgaWYgKCgoKH5iKSA+PiAxNikgJiAweGZmZmYpICE9IChiICYgMHhmZmZmKSkKLSAgICAgIHsKLSAgICAgICAgcy0+bW9kZSA9IEJBRDsKLSAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKLSAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgTEVBVkUKLSAgICAgIH0KLSAgICAgIHMtPnN1Yi5sZWZ0ID0gKHVJbnQpYiAmIDB4ZmZmZjsKLSAgICAgIGIgPSBrID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogZHVtcCBiaXRzICovCi0gICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsIHMtPnN1Yi5sZWZ0KSk7Ci0gICAgICBzLT5tb2RlID0gcy0+c3ViLmxlZnQgPyBTVE9SRUQgOiAocy0+bGFzdCA/IERSWSA6IFRZUEUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVE9SRUQ6Ci0gICAgICBpZiAobiA9PSAwKQotICAgICAgICBMRUFWRQotICAgICAgTkVFRE9VVAotICAgICAgdCA9IHMtPnN1Yi5sZWZ0OwotICAgICAgaWYgKHQgPiBuKSB0ID0gbjsKLSAgICAgIGlmICh0ID4gbSkgdCA9IG07Ci0gICAgICB6bWVtY3B5KHEsIHAsIHQpOwotICAgICAgcCArPSB0OyAgbiAtPSB0OwotICAgICAgcSArPSB0OyAgbSAtPSB0OwotICAgICAgaWYgKChzLT5zdWIubGVmdCAtPSB0KSAhPSAwKQotICAgICAgICBicmVhazsKLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZCwgJWx1IHRvdGFsIG91dFxuIiwKLSAgICAgICAgICAgICAgei0+dG90YWxfb3V0ICsgKHEgPj0gcy0+cmVhZCA/IHEgLSBzLT5yZWFkIDoKLSAgICAgICAgICAgICAgKHMtPmVuZCAtIHMtPnJlYWQpICsgKHEgLSBzLT53aW5kb3cpKSkpOwotICAgICAgcy0+bW9kZSA9IHMtPmxhc3QgPyBEUlkgOiBUWVBFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUJMRToKLSAgICAgIE5FRURCSVRTKDE0KQotICAgICAgcy0+c3ViLnRyZWVzLnRhYmxlID0gdCA9ICh1SW50KWIgJiAweDNmZmY7Ci0jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECi0gICAgICBpZiAoKHQgJiAweDFmKSA+IDI5IHx8ICgodCA+PiA1KSAmIDB4MWYpID4gMjkpCi0gICAgICB7Ci0gICAgICAgIHMtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOwotICAgICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgICBMRUFWRQotICAgICAgfQotI2VuZGlmCi0gICAgICB0ID0gMjU4ICsgKHQgJiAweDFmKSArICgodCA+PiA1KSAmIDB4MWYpOwotICAgICAgaWYgKChzLT5zdWIudHJlZXMuYmxlbnMgPSAodUludGYqKVpBTExPQyh6LCB0LCBzaXplb2YodUludCkpKSA9PSBaX05VTEwpCi0gICAgICB7Ci0gICAgICAgIHIgPSBaX01FTV9FUlJPUjsKLSAgICAgICAgTEVBVkUKLSAgICAgIH0KLSAgICAgIERVTVBCSVRTKDE0KQotICAgICAgcy0+c3ViLnRyZWVzLmluZGV4ID0gMDsKLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKLSAgICAgIHMtPm1vZGUgPSBCVFJFRTsKLSAgICBjYXNlIEJUUkVFOgotICAgICAgd2hpbGUgKHMtPnN1Yi50cmVlcy5pbmRleCA8IDQgKyAocy0+c3ViLnRyZWVzLnRhYmxlID4+IDEwKSkKLSAgICAgIHsKLSAgICAgICAgTkVFREJJVFMoMykKLSAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW2JvcmRlcltzLT5zdWIudHJlZXMuaW5kZXgrK11dID0gKHVJbnQpYiAmIDc7Ci0gICAgICAgIERVTVBCSVRTKDMpCi0gICAgICB9Ci0gICAgICB3aGlsZSAocy0+c3ViLnRyZWVzLmluZGV4IDwgMTkpCi0gICAgICAgIHMtPnN1Yi50cmVlcy5ibGVuc1tib3JkZXJbcy0+c3ViLnRyZWVzLmluZGV4KytdXSA9IDA7Ci0gICAgICBzLT5zdWIudHJlZXMuYmIgPSA3OwotICAgICAgdCA9IGluZmxhdGVfdHJlZXNfYml0cyhzLT5zdWIudHJlZXMuYmxlbnMsICZzLT5zdWIudHJlZXMuYmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5zdWIudHJlZXMudGIsIHMtPmh1ZnRzLCB6KTsKLSAgICAgIGlmICh0ICE9IFpfT0spCi0gICAgICB7Ci0gICAgICAgIHIgPSB0OwotICAgICAgICBpZiAociA9PSBaX0RBVEFfRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOwotICAgICAgICAgIHMtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIH0KLSAgICAgICAgTEVBVkUKLSAgICAgIH0KLSAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA9IDA7Ci0gICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGJpdHMgdHJlZSBva1xuIikpOwotICAgICAgcy0+bW9kZSA9IERUUkVFOwotICAgIGNhc2UgRFRSRUU6Ci0gICAgICB3aGlsZSAodCA9IHMtPnN1Yi50cmVlcy50YWJsZSwKLSAgICAgICAgICAgICBzLT5zdWIudHJlZXMuaW5kZXggPCAyNTggKyAodCAmIDB4MWYpICsgKCh0ID4+IDUpICYgMHgxZikpCi0gICAgICB7Ci0gICAgICAgIGluZmxhdGVfaHVmdCAqaDsKLSAgICAgICAgdUludCBpLCBqLCBjOwotCi0gICAgICAgIHQgPSBzLT5zdWIudHJlZXMuYmI7Ci0gICAgICAgIE5FRURCSVRTKHQpCi0gICAgICAgIGggPSBzLT5zdWIudHJlZXMudGIgKyAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1t0XSk7Ci0gICAgICAgIHQgPSBoLT5iaXRzOwotICAgICAgICBjID0gaC0+YmFzZTsKLSAgICAgICAgaWYgKGMgPCAxNikKLSAgICAgICAgewotICAgICAgICAgIERVTVBCSVRTKHQpCi0gICAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW3MtPnN1Yi50cmVlcy5pbmRleCsrXSA9IGM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBjID09IDE2Li4xOCAqLwotICAgICAgICB7Ci0gICAgICAgICAgaSA9IGMgPT0gMTggPyA3IDogYyAtIDE0OwotICAgICAgICAgIGogPSBjID09IDE4ID8gMTEgOiAzOwotICAgICAgICAgIE5FRURCSVRTKHQgKyBpKQotICAgICAgICAgIERVTVBCSVRTKHQpCi0gICAgICAgICAgaiArPSAodUludCliICYgaW5mbGF0ZV9tYXNrW2ldOwotICAgICAgICAgIERVTVBCSVRTKGkpCi0gICAgICAgICAgaSA9IHMtPnN1Yi50cmVlcy5pbmRleDsKLSAgICAgICAgICB0ID0gcy0+c3ViLnRyZWVzLnRhYmxlOwotICAgICAgICAgIGlmIChpICsgaiA+IDI1OCArICh0ICYgMHgxZikgKyAoKHQgPj4gNSkgJiAweDFmKSB8fAotICAgICAgICAgICAgICAoYyA9PSAxNiAmJiBpIDwgMSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgWkZSRUUoeiwgcy0+c3ViLnRyZWVzLmJsZW5zKTsKLSAgICAgICAgICAgIHMtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOwotICAgICAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIExFQVZFCi0gICAgICAgICAgfQotICAgICAgICAgIGMgPSBjID09IDE2ID8gcy0+c3ViLnRyZWVzLmJsZW5zW2kgLSAxXSA6IDA7Ci0gICAgICAgICAgZG8gewotICAgICAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW2krK10gPSBjOwotICAgICAgICAgIH0gd2hpbGUgKC0taik7Ci0gICAgICAgICAgcy0+c3ViLnRyZWVzLmluZGV4ID0gaTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcy0+c3ViLnRyZWVzLnRiID0gWl9OVUxMOwotICAgICAgewotICAgICAgICB1SW50IGJsLCBiZDsKLSAgICAgICAgaW5mbGF0ZV9odWZ0ICp0bCwgKnRkOwotICAgICAgICBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqYzsKLQotICAgICAgICBibCA9IDk7ICAgICAgICAgLyogbXVzdCBiZSA8PSA5IGZvciBsb29rYWhlYWQgYXNzdW1wdGlvbnMgKi8KLSAgICAgICAgYmQgPSA2OyAgICAgICAgIC8qIG11c3QgYmUgPD0gOSBmb3IgbG9va2FoZWFkIGFzc3VtcHRpb25zICovCi0gICAgICAgIHQgPSBzLT5zdWIudHJlZXMudGFibGU7Ci0gICAgICAgIHQgPSBpbmZsYXRlX3RyZWVzX2R5bmFtaWMoMjU3ICsgKHQgJiAweDFmKSwgMSArICgodCA+PiA1KSAmIDB4MWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5ibGVucywgJmJsLCAmYmQsICZ0bCwgJnRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmh1ZnRzLCB6KTsKLSAgICAgICAgaWYgKHQgIT0gWl9PSykKLSAgICAgICAgewotICAgICAgICAgIGlmICh0ID09ICh1SW50KVpfREFUQV9FUlJPUikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOwotICAgICAgICAgICAgcy0+bW9kZSA9IEJBRDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgciA9IHQ7Ci0gICAgICAgICAgTEVBVkUKLSAgICAgICAgfQotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHRyZWVzIG9rXG4iKSk7Ci0gICAgICAgIGlmICgoYyA9IGluZmxhdGVfY29kZXNfbmV3KGJsLCBiZCwgdGwsIHRkLCB6KSkgPT0gWl9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgciA9IFpfTUVNX0VSUk9SOwotICAgICAgICAgIExFQVZFCi0gICAgICAgIH0KLSAgICAgICAgcy0+c3ViLmRlY29kZS5jb2RlcyA9IGM7Ci0gICAgICB9Ci0gICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOwotICAgICAgcy0+bW9kZSA9IENPREVTOwotICAgIGNhc2UgQ09ERVM6Ci0gICAgICBVUERBVEUKLSAgICAgIGlmICgociA9IGluZmxhdGVfY29kZXMocywgeiwgcikpICE9IFpfU1RSRUFNX0VORCkKLSAgICAgICAgcmV0dXJuIGluZmxhdGVfZmx1c2gocywgeiwgcik7Ci0gICAgICByID0gWl9PSzsKLSAgICAgIGluZmxhdGVfY29kZXNfZnJlZShzLT5zdWIuZGVjb2RlLmNvZGVzLCB6KTsKLSAgICAgIExPQUQKLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgZW5kLCAlbHUgdG90YWwgb3V0XG4iLAotICAgICAgICAgICAgICB6LT50b3RhbF9vdXQgKyAocSA+PSBzLT5yZWFkID8gcSAtIHMtPnJlYWQgOgotICAgICAgICAgICAgICAocy0+ZW5kIC0gcy0+cmVhZCkgKyAocSAtIHMtPndpbmRvdykpKSk7Ci0gICAgICBpZiAoIXMtPmxhc3QpCi0gICAgICB7Ci0gICAgICAgIHMtPm1vZGUgPSBUWVBFOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHMtPm1vZGUgPSBEUlk7Ci0gICAgY2FzZSBEUlk6Ci0gICAgICBGTFVTSAotICAgICAgaWYgKHMtPnJlYWQgIT0gcy0+d3JpdGUpCi0gICAgICAgIExFQVZFCi0gICAgICBzLT5tb2RlID0gRE9ORTsKLSAgICBjYXNlIERPTkU6Ci0gICAgICByID0gWl9TVFJFQU1fRU5EOwotICAgICAgTEVBVkUKLSAgICBjYXNlIEJBRDoKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICBMRUFWRQotICAgIGRlZmF1bHQ6Ci0gICAgICByID0gWl9TVFJFQU1fRVJST1I7Ci0gICAgICBMRUFWRQotICB9Ci0jaWZkZWYgTkVFRF9EVU1NWV9SRVRVUk4KLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotCi1sb2NhbCBpbnQgaW5mbGF0ZV9ibG9ja3NfZnJlZSggLyogcywgeikgKi8KLWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKLXpfc3RyZWFtcCB6ICkKLXsKLSAgaW5mbGF0ZV9ibG9ja3NfcmVzZXQocywgeiwgWl9OVUxMKTsKLSAgWkZSRUUoeiwgcy0+d2luZG93KTsKLSAgWkZSRUUoeiwgcy0+aHVmdHMpOwotICBaRlJFRSh6LCBzKTsKLSAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGJsb2NrcyBmcmVlZFxuIikpOwotICByZXR1cm4gWl9PSzsKLX0KLQotCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC9pbmZibG9jay5oIGIvc3JjL2d6aXAvaW5mYmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1MzVhMS4uMDAwMDAwMAotLS0gYS9zcmMvZ3ppcC9pbmZibG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogaW5mYmxvY2suaCAtLSBoZWFkZXIgdG8gdXNlIGluZmJsb2NrLmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotI2lmbmRlZiBfSU5GQkxPQ0tfSAotI2RlZmluZSBfSU5GQkxPQ0tfSAotCi1zdHJ1Y3QgaW5mbGF0ZV9ibG9ja3Nfc3RhdGU7Ci10eXBlZGVmIHN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSBGQVIgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmOwotCi1sb2NhbCAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICogaW5mbGF0ZV9ibG9ja3NfbmV3IE9GKCgKLSAgICB6X3N0cmVhbXAgeiwKLSAgICBjaGVja19mdW5jIGMsICAgICAgICAgICAgICAgLyogY2hlY2sgZnVuY3Rpb24gKi8KLSAgICB1SW50IHcpKTsgICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgKi8KLQotbG9jYWwgIGludCBpbmZsYXRlX2Jsb2NrcyBPRigoCi0gICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCi0gICAgel9zdHJlYW1wICwKLSAgICBpbnQpKTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCByZXR1cm4gY29kZSAqLwotCi1sb2NhbCAgdm9pZCBpbmZsYXRlX2Jsb2Nrc19yZXNldCBPRigoCi0gICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCi0gICAgel9zdHJlYW1wICwKLSAgICB1TG9uZ2YgKikpOyAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHZhbHVlIG9uIG91dHB1dCAqLwotCi1sb2NhbCAgaW50IGluZmxhdGVfYmxvY2tzX2ZyZWUgT0YoKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtcCkpOwotCi0jZW5kaWYgLyogX0lORkJMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9nemlwL2luZmNvZGVzLmMgYi9zcmMvZ3ppcC9pbmZjb2Rlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2JmZDU4Li4wMDAwMDAwCi0tLSBhL3NyYy9nemlwL2luZmNvZGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyogaW5mY29kZXMuYyAtLSBwcm9jZXNzIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZmJsb2NrLmgiCi0jaW5jbHVkZSAiaW5mY29kZXMuaCIKLSNpbmNsdWRlICJpbmZ1dGlsLmgiCi0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi10eXBlZGVmIGVudW0geyAgICAgICAgLyogd2FpdGluZyBmb3IgImk6Ij1pbnB1dCwgIm86Ij1vdXRwdXQsICJ4OiI9bm90aGluZyAqLwotICAgICAgU1RBUlQsICAgIC8qIHg6IHNldCB1cCBmb3IgTEVOICovCi0gICAgICBMRU4sICAgICAgLyogaTogZ2V0IGxlbmd0aC9saXRlcmFsL2VvYiBuZXh0ICovCi0gICAgICBMRU5FWFQsICAgLyogaTogZ2V0dGluZyBsZW5ndGggZXh0cmEgKGhhdmUgYmFzZSkgKi8KLSAgICAgIERJU1QsICAgICAvKiBpOiBnZXQgZGlzdGFuY2UgbmV4dCAqLwotICAgICAgRElTVEVYVCwgIC8qIGk6IGdldHRpbmcgZGlzdGFuY2UgZXh0cmEgKi8KLSAgICAgIENPUFksICAgICAvKiBvOiBjb3B5aW5nIGJ5dGVzIGluIHdpbmRvdywgd2FpdGluZyBmb3Igc3BhY2UgKi8KLSAgICAgIExJVCwgICAgICAvKiBvOiBnb3QgbGl0ZXJhbCwgd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlICovCi0gICAgICBXQVNILCAgICAgLyogbzogZ290IGVvYiwgcG9zc2libHkgc3RpbGwgb3V0cHV0IHdhaXRpbmcgKi8KLSAgICAgIEVORCwgICAgICAvKiB4OiBnb3QgZW9iIGFuZCBhbGwgZGF0YSBmbHVzaGVkICovCi0gICAgICBCQURDT0RFfSAgLyogeDogZ290IGVycm9yICovCi1pbmZsYXRlX2NvZGVzX21vZGU7Ci0KLS8qIGluZmxhdGUgY29kZXMgcHJpdmF0ZSBzdGF0ZSAqLwotc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGUgewotCi0gIC8qIG1vZGUgKi8KLSAgaW5mbGF0ZV9jb2Rlc19tb2RlIG1vZGU7ICAgICAgLyogY3VycmVudCBpbmZsYXRlX2NvZGVzIG1vZGUgKi8KLQotICAvKiBtb2RlIGRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICB1SW50IGxlbjsKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBpbmZsYXRlX2h1ZnQgKnRyZWU7ICAgICAgIC8qIHBvaW50ZXIgaW50byB0cmVlICovCi0gICAgICB1SW50IG5lZWQ7ICAgICAgICAgICAgICAgIC8qIGJpdHMgbmVlZGVkICovCi0gICAgfSBjb2RlOyAgICAgICAgICAgICAvKiBpZiBMRU4gb3IgRElTVCwgd2hlcmUgaW4gdHJlZSAqLwotICAgIHVJbnQgbGl0OyAgICAgICAgICAgLyogaWYgTElULCBsaXRlcmFsICovCi0gICAgc3RydWN0IHsKLSAgICAgIHVJbnQgZ2V0OyAgICAgICAgICAgICAgICAgLyogYml0cyB0byBnZXQgZm9yIGV4dHJhICovCi0gICAgICB1SW50IGRpc3Q7ICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBmcm9tICovCi0gICAgfSBjb3B5OyAgICAgICAgICAgICAvKiBpZiBFWFQgb3IgQ09QWSwgd2hlcmUgYW5kIGhvdyBtdWNoICovCi0gIH0gc3ViOyAgICAgICAgICAgICAgICAvKiBzdWJtb2RlICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICBCeXRlIGxiaXRzOyAgICAgICAgICAgLyogbHRyZWUgYml0cyBkZWNvZGVkIHBlciBicmFuY2ggKi8KLSAgQnl0ZSBkYml0czsgICAgICAgICAgIC8qIGR0cmVlIGJpdHMgZGVjb2RlciBwZXIgYnJhbmNoICovCi0gIGluZmxhdGVfaHVmdCAqbHRyZWU7ICAgICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoL2VvYiB0cmVlICovCi0gIGluZmxhdGVfaHVmdCAqZHRyZWU7ICAgICAgICAgIC8qIGRpc3RhbmNlIHRyZWUgKi8KLQotfTsKLQotCi1sb2NhbCBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqaW5mbGF0ZV9jb2Rlc19uZXcoIC8qIGJsLCBiZCwgdGwsIHRkLCB6KSAqLwotdUludCBibCwgdUludCBiZCwKLWluZmxhdGVfaHVmdCAqdGwsCi1pbmZsYXRlX2h1ZnQgKnRkLCAvKiBuZWVkIHNlcGFyYXRlIGRlY2xhcmF0aW9uIGZvciBCb3JsYW5kIEMrKyAqLwotel9zdHJlYW1wIHogKQotewotICBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqYzsKLQotICBpZiAoKGMgPSAoaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKikKLSAgICAgICBaQUxMT0MoeiwxLHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSkpKSAhPSBaX05VTEwpCi0gIHsKLSAgICBjLT5tb2RlID0gU1RBUlQ7Ci0gICAgYy0+bGJpdHMgPSAoQnl0ZSlibDsKLSAgICBjLT5kYml0cyA9IChCeXRlKWJkOwotICAgIGMtPmx0cmVlID0gdGw7Ci0gICAgYy0+ZHRyZWUgPSB0ZDsKLSAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG5ld1xuIikpOwotICB9Ci0gIHJldHVybiBjOwotfQotCi0KLWxvY2FsIGludCBpbmZsYXRlX2NvZGVzKCAvKiBzLCB6LCByKSAqLwotaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzLAotel9zdHJlYW1wIHosCi1pbnQgciApCi17Ci0gIHVJbnQgajsgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSAqLwotICBpbmZsYXRlX2h1ZnQgKnQ7ICAgICAgLyogdGVtcG9yYXJ5IHBvaW50ZXIgKi8KLSAgdUludCBlOyAgICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCi0gIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgQnl0ZWYgKnA7ICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLwotICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCi0gIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KLSAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCi0gIEJ5dGVmICpmOyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGNvcHkgc3RyaW5ncyBmcm9tICovCi0gIGluZmxhdGVfY29kZXNfc3RhdGVmICpjID0gcy0+c3ViLmRlY29kZS5jb2RlczsgIC8qIGNvZGVzIHN0YXRlICovCi0KLSAgLyogY29weSBpbnB1dC9vdXRwdXQgaW5mb3JtYXRpb24gdG8gbG9jYWxzIChVUERBVEUgbWFjcm8gcmVzdG9yZXMpICovCi0gIExPQUQKLQotICAvKiBwcm9jZXNzIGlucHV0IGFuZCBvdXRwdXQgYmFzZWQgb24gY3VycmVudCBzdGF0ZSAqLwotICB3aGlsZSAoMSkgc3dpdGNoIChjLT5tb2RlKQotICB7ICAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yICJpOiI9aW5wdXQsICJvOiI9b3V0cHV0LCAieDoiPW5vdGhpbmcgKi8KLSAgICBjYXNlIFNUQVJUOiAgICAgICAgIC8qIHg6IHNldCB1cCBmb3IgTEVOICovCi0jaWZuZGVmIFNMT1cKLSAgICAgIGlmIChtID49IDI1OCAmJiBuID49IDEwKQotICAgICAgewotICAgICAgICBVUERBVEUKLSAgICAgICAgciA9IGluZmxhdGVfZmFzdChjLT5sYml0cywgYy0+ZGJpdHMsIGMtPmx0cmVlLCBjLT5kdHJlZSwgcywgeik7Ci0gICAgICAgIExPQUQKLSAgICAgICAgaWYgKHIgIT0gWl9PSykKLSAgICAgICAgewotICAgICAgICAgIGMtPm1vZGUgPSByID09IFpfU1RSRUFNX0VORCA/IFdBU0ggOiBCQURDT0RFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYgLyogIVNMT1cgKi8KLSAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBjLT5sYml0czsKLSAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSBjLT5sdHJlZTsKLSAgICAgIGMtPm1vZGUgPSBMRU47Ci0gICAgY2FzZSBMRU46ICAgICAgICAgICAvKiBpOiBnZXQgbGVuZ3RoL2xpdGVyYWwvZW9iIG5leHQgKi8KLSAgICAgIGogPSBjLT5zdWIuY29kZS5uZWVkOwotICAgICAgTkVFREJJVFMoaikKLSAgICAgIHQgPSBjLT5zdWIuY29kZS50cmVlICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbal0pOwotICAgICAgRFVNUEJJVFModC0+Yml0cykKLSAgICAgIGUgPSAodUludCkodC0+ZXhvcCk7Ci0gICAgICBpZiAoZSA9PSAwKSAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KLSAgICAgIHsKLSAgICAgICAgYy0+c3ViLmxpdCA9IHQtPmJhc2U7Ci0gICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdC0+YmFzZSA+PSAweDIwICYmIHQtPmJhc2UgPCAweDdmID8KLSAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKLSAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIHQtPmJhc2UpKTsKLSAgICAgICAgYy0+bW9kZSA9IExJVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoZSAmIDE2KSAgICAgICAgICAgICAgIC8qIGxlbmd0aCAqLwotICAgICAgewotICAgICAgICBjLT5zdWIuY29weS5nZXQgPSBlICYgMTU7Ci0gICAgICAgIGMtPmxlbiA9IHQtPmJhc2U7Ci0gICAgICAgIGMtPm1vZGUgPSBMRU5FWFQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKChlICYgNjQpID09IDApICAgICAgICAvKiBuZXh0IHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBlOwotICAgICAgICBjLT5zdWIuY29kZS50cmVlID0gdCArIHQtPmJhc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGUgJiAzMikgICAgICAgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi8KLSAgICAgIHsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKLSAgICAgICAgYy0+bW9kZSA9IFdBU0g7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IEJBRENPREU7ICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KLSAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgTEVORVhUOiAgICAgICAgLyogaTogZ2V0dGluZyBsZW5ndGggZXh0cmEgKGhhdmUgYmFzZSkgKi8KLSAgICAgIGogPSBjLT5zdWIuY29weS5nZXQ7Ci0gICAgICBORUVEQklUUyhqKQotICAgICAgYy0+bGVuICs9ICh1SW50KWIgJiBpbmZsYXRlX21hc2tbal07Ci0gICAgICBEVU1QQklUUyhqKQotICAgICAgYy0+c3ViLmNvZGUubmVlZCA9IGMtPmRiaXRzOwotICAgICAgYy0+c3ViLmNvZGUudHJlZSA9IGMtPmR0cmVlOwotICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcbiIsIGMtPmxlbikpOwotICAgICAgYy0+bW9kZSA9IERJU1Q7Ci0gICAgY2FzZSBESVNUOiAgICAgICAgICAvKiBpOiBnZXQgZGlzdGFuY2UgbmV4dCAqLwotICAgICAgaiA9IGMtPnN1Yi5jb2RlLm5lZWQ7Ci0gICAgICBORUVEQklUUyhqKQotICAgICAgdCA9IGMtPnN1Yi5jb2RlLnRyZWUgKyAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1tqXSk7Ci0gICAgICBEVU1QQklUUyh0LT5iaXRzKQotICAgICAgZSA9ICh1SW50KSh0LT5leG9wKTsKLSAgICAgIGlmIChlICYgMTYpICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgKi8KLSAgICAgIHsKLSAgICAgICAgYy0+c3ViLmNvcHkuZ2V0ID0gZSAmIDE1OwotICAgICAgICBjLT5zdWIuY29weS5kaXN0ID0gdC0+YmFzZTsKLSAgICAgICAgYy0+bW9kZSA9IERJU1RFWFQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKChlICYgNjQpID09IDApICAgICAgICAvKiBuZXh0IHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBlOwotICAgICAgICBjLT5zdWIuY29kZS50cmVlID0gdCArIHQtPmJhc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IEJBRENPREU7ICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KLSAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgRElTVEVYVDogICAgICAgLyogaTogZ2V0dGluZyBkaXN0YW5jZSBleHRyYSAqLwotICAgICAgaiA9IGMtPnN1Yi5jb3B5LmdldDsKLSAgICAgIE5FRURCSVRTKGopCi0gICAgICBjLT5zdWIuY29weS5kaXN0ICs9ICh1SW50KWIgJiBpbmZsYXRlX21hc2tbal07Ci0gICAgICBEVU1QQklUUyhqKQotICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgYy0+c3ViLmNvcHkuZGlzdCkpOwotICAgICAgYy0+bW9kZSA9IENPUFk7Ci0gICAgY2FzZSBDT1BZOiAgICAgICAgICAvKiBvOiBjb3B5aW5nIGJ5dGVzIGluIHdpbmRvdywgd2FpdGluZyBmb3Igc3BhY2UgKi8KLSAgICAgIGYgPSBxIC0gYy0+c3ViLmNvcHkuZGlzdDsKLSAgICAgIHdoaWxlIChmIDwgcy0+d2luZG93KSAgICAgICAgICAgICAvKiBtb2R1bG8gd2luZG93IHNpemUtIndoaWxlIiBpbnN0ZWFkICovCi0gICAgICAgIGYgKz0gcy0+ZW5kIC0gcy0+d2luZG93OyAgICAgICAgLyogb2YgImlmIiBoYW5kbGVzIGludmFsaWQgZGlzdGFuY2VzICovCi0gICAgICB3aGlsZSAoYy0+bGVuKQotICAgICAgewotICAgICAgICBORUVET1VUCi0gICAgICAgIE9VVEJZVEUoKmYrKykKLSAgICAgICAgaWYgKGYgPT0gcy0+ZW5kKQotICAgICAgICAgIGYgPSBzLT53aW5kb3c7Ci0gICAgICAgIGMtPmxlbi0tOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IFNUQVJUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMSVQ6ICAgICAgICAgICAvKiBvOiBnb3QgbGl0ZXJhbCwgd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlICovCi0gICAgICBORUVET1VUCi0gICAgICBPVVRCWVRFKGMtPnN1Yi5saXQpCi0gICAgICBjLT5tb2RlID0gU1RBUlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdBU0g6ICAgICAgICAgIC8qIG86IGdvdCBlb2IsIHBvc3NpYmx5IG1vcmUgb3V0cHV0ICovCi0gICAgICBpZiAoayA+IDcpICAgICAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGUsIGlmIGFueSAqLwotICAgICAgewotICAgICAgICBBc3NlcnQoayA8IDE2LCAiaW5mbGF0ZV9jb2RlcyBncmFiYmVkIHRvbyBtYW55IGJ5dGVzIikKLSAgICAgICAgayAtPSA4OwotICAgICAgICBuKys7Ci0gICAgICAgIHAtLTsgICAgICAgICAgICAvKiBjYW4gYWx3YXlzIHJldHVybiBvbmUgKi8KLSAgICAgIH0KLSAgICAgIEZMVVNICi0gICAgICBpZiAocy0+cmVhZCAhPSBzLT53cml0ZSkKLSAgICAgICAgTEVBVkUKLSAgICAgIGMtPm1vZGUgPSBFTkQ7Ci0gICAgY2FzZSBFTkQ6Ci0gICAgICByID0gWl9TVFJFQU1fRU5EOwotICAgICAgTEVBVkUKLSAgICBjYXNlIEJBRENPREU6ICAgICAgIC8qIHg6IGdvdCBlcnJvciAqLwotICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgIExFQVZFCi0gICAgZGVmYXVsdDoKLSAgICAgIHIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgIExFQVZFCi0gIH0KLSNpZmRlZiBORUVEX0RVTU1ZX1JFVFVSTgotICByZXR1cm4gWl9TVFJFQU1fRVJST1I7ICAvKiBTb21lIGR1bWIgY29tcGlsZXJzIGNvbXBsYWluIHdpdGhvdXQgdGhpcyAqLwotI2VuZGlmCi19Ci0KLQotbG9jYWwgdm9pZCBpbmZsYXRlX2NvZGVzX2ZyZWUoIC8qIGMsIHopICovCi1pbmZsYXRlX2NvZGVzX3N0YXRlZiAqYywKLXpfc3RyZWFtcCB6ICkKLXsKLSAgWkZSRUUoeiwgYyk7Ci0gIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgZnJlZVxuIikpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvaW5mY29kZXMuaCBiL3NyYy9nemlwL2luZmNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NGQ3ZjguLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvaW5mY29kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIGluZmNvZGVzLmggLS0gaGVhZGVyIHRvIHVzZSBpbmZjb2Rlcy5jCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLSNpZm5kZWYgX0lORkNPREVTX0gKLSNkZWZpbmUgX0lORkNPREVTX0gKLQotc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGU7Ci10eXBlZGVmIHN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlIEZBUiBpbmZsYXRlX2NvZGVzX3N0YXRlZjsKLQotbG9jYWwgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKmluZmxhdGVfY29kZXNfbmV3IE9GKCgKLSAgICB1SW50LCB1SW50LAotICAgIGluZmxhdGVfaHVmdCAqLCBpbmZsYXRlX2h1ZnQgKiwKLSAgICB6X3N0cmVhbXAgKSk7Ci0KLWxvY2FsIGludCBpbmZsYXRlX2NvZGVzIE9GKCgKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgLAotICAgIGludCkpOwotCi1sb2NhbCB2b2lkIGluZmxhdGVfY29kZXNfZnJlZSBPRigoCi0gICAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgKSk7Ci0KLSNlbmRpZiAvKiBfSU5GQ09ERVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvaW5mZml4ZWQuaCBiL3NyYy9nemlwL2luZmZpeGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDc2MGUuLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvaW5mZml4ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcwotICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIG1ha2V0cmVlLmMgcHJvZ3JhbQotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi1sb2NhbCBjb25zdCB1SW50IGZpeGVkX2JsID0gOTsKLWxvY2FsIGNvbnN0IHVJbnQgZml4ZWRfYmQgPSA1OwotbG9jYWwgY29uc3QgaW5mbGF0ZV9odWZ0IGZpeGVkX3RsW10gPSB7Ci0gICAge3t7OTYsN319LDI1Nn0sIHt7ezAsOH19LDgwfSwge3t7MCw4fX0sMTZ9LCB7e3s4NCw4fX0sMTE1fSwKLSAgICB7e3s4Miw3fX0sMzF9LCB7e3swLDh9fSwxMTJ9LCB7e3swLDh9fSw0OH0sIHt7ezAsOX19LDE5Mn0sCi0gICAge3t7ODAsN319LDEwfSwge3t7MCw4fX0sOTZ9LCB7e3swLDh9fSwzMn0sIHt7ezAsOX19LDE2MH0sCi0gICAge3t7MCw4fX0sMH0sIHt7ezAsOH19LDEyOH0sIHt7ezAsOH19LDY0fSwge3t7MCw5fX0sMjI0fSwKLSAgICB7e3s4MCw3fX0sNn0sIHt7ezAsOH19LDg4fSwge3t7MCw4fX0sMjR9LCB7e3swLDl9fSwxNDR9LAotICAgIHt7ezgzLDd9fSw1OX0sIHt7ezAsOH19LDEyMH0sIHt7ezAsOH19LDU2fSwge3t7MCw5fX0sMjA4fSwKLSAgICB7e3s4MSw3fX0sMTd9LCB7e3swLDh9fSwxMDR9LCB7e3swLDh9fSw0MH0sIHt7ezAsOX19LDE3Nn0sCi0gICAge3t7MCw4fX0sOH0sIHt7ezAsOH19LDEzNn0sIHt7ezAsOH19LDcyfSwge3t7MCw5fX0sMjQwfSwKLSAgICB7e3s4MCw3fX0sNH0sIHt7ezAsOH19LDg0fSwge3t7MCw4fX0sMjB9LCB7e3s4NSw4fX0sMjI3fSwKLSAgICB7e3s4Myw3fX0sNDN9LCB7e3swLDh9fSwxMTZ9LCB7e3swLDh9fSw1Mn0sIHt7ezAsOX19LDIwMH0sCi0gICAge3t7ODEsN319LDEzfSwge3t7MCw4fX0sMTAwfSwge3t7MCw4fX0sMzZ9LCB7e3swLDl9fSwxNjh9LAotICAgIHt7ezAsOH19LDR9LCB7e3swLDh9fSwxMzJ9LCB7e3swLDh9fSw2OH0sIHt7ezAsOX19LDIzMn0sCi0gICAge3t7ODAsN319LDh9LCB7e3swLDh9fSw5Mn0sIHt7ezAsOH19LDI4fSwge3t7MCw5fX0sMTUyfSwKLSAgICB7e3s4NCw3fX0sODN9LCB7e3swLDh9fSwxMjR9LCB7e3swLDh9fSw2MH0sIHt7ezAsOX19LDIxNn0sCi0gICAge3t7ODIsN319LDIzfSwge3t7MCw4fX0sMTA4fSwge3t7MCw4fX0sNDR9LCB7e3swLDl9fSwxODR9LAotICAgIHt7ezAsOH19LDEyfSwge3t7MCw4fX0sMTQwfSwge3t7MCw4fX0sNzZ9LCB7e3swLDl9fSwyNDh9LAotICAgIHt7ezgwLDd9fSwzfSwge3t7MCw4fX0sODJ9LCB7e3swLDh9fSwxOH0sIHt7ezg1LDh9fSwxNjN9LAotICAgIHt7ezgzLDd9fSwzNX0sIHt7ezAsOH19LDExNH0sIHt7ezAsOH19LDUwfSwge3t7MCw5fX0sMTk2fSwKLSAgICB7e3s4MSw3fX0sMTF9LCB7e3swLDh9fSw5OH0sIHt7ezAsOH19LDM0fSwge3t7MCw5fX0sMTY0fSwKLSAgICB7e3swLDh9fSwyfSwge3t7MCw4fX0sMTMwfSwge3t7MCw4fX0sNjZ9LCB7e3swLDl9fSwyMjh9LAotICAgIHt7ezgwLDd9fSw3fSwge3t7MCw4fX0sOTB9LCB7e3swLDh9fSwyNn0sIHt7ezAsOX19LDE0OH0sCi0gICAge3t7ODQsN319LDY3fSwge3t7MCw4fX0sMTIyfSwge3t7MCw4fX0sNTh9LCB7e3swLDl9fSwyMTJ9LAotICAgIHt7ezgyLDd9fSwxOX0sIHt7ezAsOH19LDEwNn0sIHt7ezAsOH19LDQyfSwge3t7MCw5fX0sMTgwfSwKLSAgICB7e3swLDh9fSwxMH0sIHt7ezAsOH19LDEzOH0sIHt7ezAsOH19LDc0fSwge3t7MCw5fX0sMjQ0fSwKLSAgICB7e3s4MCw3fX0sNX0sIHt7ezAsOH19LDg2fSwge3t7MCw4fX0sMjJ9LCB7e3sxOTIsOH19LDB9LAotICAgIHt7ezgzLDd9fSw1MX0sIHt7ezAsOH19LDExOH0sIHt7ezAsOH19LDU0fSwge3t7MCw5fX0sMjA0fSwKLSAgICB7e3s4MSw3fX0sMTV9LCB7e3swLDh9fSwxMDJ9LCB7e3swLDh9fSwzOH0sIHt7ezAsOX19LDE3Mn0sCi0gICAge3t7MCw4fX0sNn0sIHt7ezAsOH19LDEzNH0sIHt7ezAsOH19LDcwfSwge3t7MCw5fX0sMjM2fSwKLSAgICB7e3s4MCw3fX0sOX0sIHt7ezAsOH19LDk0fSwge3t7MCw4fX0sMzB9LCB7e3swLDl9fSwxNTZ9LAotICAgIHt7ezg0LDd9fSw5OX0sIHt7ezAsOH19LDEyNn0sIHt7ezAsOH19LDYyfSwge3t7MCw5fX0sMjIwfSwKLSAgICB7e3s4Miw3fX0sMjd9LCB7e3swLDh9fSwxMTB9LCB7e3swLDh9fSw0Nn0sIHt7ezAsOX19LDE4OH0sCi0gICAge3t7MCw4fX0sMTR9LCB7e3swLDh9fSwxNDJ9LCB7e3swLDh9fSw3OH0sIHt7ezAsOX19LDI1Mn0sCi0gICAge3t7OTYsN319LDI1Nn0sIHt7ezAsOH19LDgxfSwge3t7MCw4fX0sMTd9LCB7e3s4NSw4fX0sMTMxfSwKLSAgICB7e3s4Miw3fX0sMzF9LCB7e3swLDh9fSwxMTN9LCB7e3swLDh9fSw0OX0sIHt7ezAsOX19LDE5NH0sCi0gICAge3t7ODAsN319LDEwfSwge3t7MCw4fX0sOTd9LCB7e3swLDh9fSwzM30sIHt7ezAsOX19LDE2Mn0sCi0gICAge3t7MCw4fX0sMX0sIHt7ezAsOH19LDEyOX0sIHt7ezAsOH19LDY1fSwge3t7MCw5fX0sMjI2fSwKLSAgICB7e3s4MCw3fX0sNn0sIHt7ezAsOH19LDg5fSwge3t7MCw4fX0sMjV9LCB7e3swLDl9fSwxNDZ9LAotICAgIHt7ezgzLDd9fSw1OX0sIHt7ezAsOH19LDEyMX0sIHt7ezAsOH19LDU3fSwge3t7MCw5fX0sMjEwfSwKLSAgICB7e3s4MSw3fX0sMTd9LCB7e3swLDh9fSwxMDV9LCB7e3swLDh9fSw0MX0sIHt7ezAsOX19LDE3OH0sCi0gICAge3t7MCw4fX0sOX0sIHt7ezAsOH19LDEzN30sIHt7ezAsOH19LDczfSwge3t7MCw5fX0sMjQyfSwKLSAgICB7e3s4MCw3fX0sNH0sIHt7ezAsOH19LDg1fSwge3t7MCw4fX0sMjF9LCB7e3s4MCw4fX0sMjU4fSwKLSAgICB7e3s4Myw3fX0sNDN9LCB7e3swLDh9fSwxMTd9LCB7e3swLDh9fSw1M30sIHt7ezAsOX19LDIwMn0sCi0gICAge3t7ODEsN319LDEzfSwge3t7MCw4fX0sMTAxfSwge3t7MCw4fX0sMzd9LCB7e3swLDl9fSwxNzB9LAotICAgIHt7ezAsOH19LDV9LCB7e3swLDh9fSwxMzN9LCB7e3swLDh9fSw2OX0sIHt7ezAsOX19LDIzNH0sCi0gICAge3t7ODAsN319LDh9LCB7e3swLDh9fSw5M30sIHt7ezAsOH19LDI5fSwge3t7MCw5fX0sMTU0fSwKLSAgICB7e3s4NCw3fX0sODN9LCB7e3swLDh9fSwxMjV9LCB7e3swLDh9fSw2MX0sIHt7ezAsOX19LDIxOH0sCi0gICAge3t7ODIsN319LDIzfSwge3t7MCw4fX0sMTA5fSwge3t7MCw4fX0sNDV9LCB7e3swLDl9fSwxODZ9LAotICAgIHt7ezAsOH19LDEzfSwge3t7MCw4fX0sMTQxfSwge3t7MCw4fX0sNzd9LCB7e3swLDl9fSwyNTB9LAotICAgIHt7ezgwLDd9fSwzfSwge3t7MCw4fX0sODN9LCB7e3swLDh9fSwxOX0sIHt7ezg1LDh9fSwxOTV9LAotICAgIHt7ezgzLDd9fSwzNX0sIHt7ezAsOH19LDExNX0sIHt7ezAsOH19LDUxfSwge3t7MCw5fX0sMTk4fSwKLSAgICB7e3s4MSw3fX0sMTF9LCB7e3swLDh9fSw5OX0sIHt7ezAsOH19LDM1fSwge3t7MCw5fX0sMTY2fSwKLSAgICB7e3swLDh9fSwzfSwge3t7MCw4fX0sMTMxfSwge3t7MCw4fX0sNjd9LCB7e3swLDl9fSwyMzB9LAotICAgIHt7ezgwLDd9fSw3fSwge3t7MCw4fX0sOTF9LCB7e3swLDh9fSwyN30sIHt7ezAsOX19LDE1MH0sCi0gICAge3t7ODQsN319LDY3fSwge3t7MCw4fX0sMTIzfSwge3t7MCw4fX0sNTl9LCB7e3swLDl9fSwyMTR9LAotICAgIHt7ezgyLDd9fSwxOX0sIHt7ezAsOH19LDEwN30sIHt7ezAsOH19LDQzfSwge3t7MCw5fX0sMTgyfSwKLSAgICB7e3swLDh9fSwxMX0sIHt7ezAsOH19LDEzOX0sIHt7ezAsOH19LDc1fSwge3t7MCw5fX0sMjQ2fSwKLSAgICB7e3s4MCw3fX0sNX0sIHt7ezAsOH19LDg3fSwge3t7MCw4fX0sMjN9LCB7e3sxOTIsOH19LDB9LAotICAgIHt7ezgzLDd9fSw1MX0sIHt7ezAsOH19LDExOX0sIHt7ezAsOH19LDU1fSwge3t7MCw5fX0sMjA2fSwKLSAgICB7e3s4MSw3fX0sMTV9LCB7e3swLDh9fSwxMDN9LCB7e3swLDh9fSwzOX0sIHt7ezAsOX19LDE3NH0sCi0gICAge3t7MCw4fX0sN30sIHt7ezAsOH19LDEzNX0sIHt7ezAsOH19LDcxfSwge3t7MCw5fX0sMjM4fSwKLSAgICB7e3s4MCw3fX0sOX0sIHt7ezAsOH19LDk1fSwge3t7MCw4fX0sMzF9LCB7e3swLDl9fSwxNTh9LAotICAgIHt7ezg0LDd9fSw5OX0sIHt7ezAsOH19LDEyN30sIHt7ezAsOH19LDYzfSwge3t7MCw5fX0sMjIyfSwKLSAgICB7e3s4Miw3fX0sMjd9LCB7e3swLDh9fSwxMTF9LCB7e3swLDh9fSw0N30sIHt7ezAsOX19LDE5MH0sCi0gICAge3t7MCw4fX0sMTV9LCB7e3swLDh9fSwxNDN9LCB7e3swLDh9fSw3OX0sIHt7ezAsOX19LDI1NH0sCi0gICAge3t7OTYsN319LDI1Nn0sIHt7ezAsOH19LDgwfSwge3t7MCw4fX0sMTZ9LCB7e3s4NCw4fX0sMTE1fSwKLSAgICB7e3s4Miw3fX0sMzF9LCB7e3swLDh9fSwxMTJ9LCB7e3swLDh9fSw0OH0sIHt7ezAsOX19LDE5M30sCi0gICAge3t7ODAsN319LDEwfSwge3t7MCw4fX0sOTZ9LCB7e3swLDh9fSwzMn0sIHt7ezAsOX19LDE2MX0sCi0gICAge3t7MCw4fX0sMH0sIHt7ezAsOH19LDEyOH0sIHt7ezAsOH19LDY0fSwge3t7MCw5fX0sMjI1fSwKLSAgICB7e3s4MCw3fX0sNn0sIHt7ezAsOH19LDg4fSwge3t7MCw4fX0sMjR9LCB7e3swLDl9fSwxNDV9LAotICAgIHt7ezgzLDd9fSw1OX0sIHt7ezAsOH19LDEyMH0sIHt7ezAsOH19LDU2fSwge3t7MCw5fX0sMjA5fSwKLSAgICB7e3s4MSw3fX0sMTd9LCB7e3swLDh9fSwxMDR9LCB7e3swLDh9fSw0MH0sIHt7ezAsOX19LDE3N30sCi0gICAge3t7MCw4fX0sOH0sIHt7ezAsOH19LDEzNn0sIHt7ezAsOH19LDcyfSwge3t7MCw5fX0sMjQxfSwKLSAgICB7e3s4MCw3fX0sNH0sIHt7ezAsOH19LDg0fSwge3t7MCw4fX0sMjB9LCB7e3s4NSw4fX0sMjI3fSwKLSAgICB7e3s4Myw3fX0sNDN9LCB7e3swLDh9fSwxMTZ9LCB7e3swLDh9fSw1Mn0sIHt7ezAsOX19LDIwMX0sCi0gICAge3t7ODEsN319LDEzfSwge3t7MCw4fX0sMTAwfSwge3t7MCw4fX0sMzZ9LCB7e3swLDl9fSwxNjl9LAotICAgIHt7ezAsOH19LDR9LCB7e3swLDh9fSwxMzJ9LCB7e3swLDh9fSw2OH0sIHt7ezAsOX19LDIzM30sCi0gICAge3t7ODAsN319LDh9LCB7e3swLDh9fSw5Mn0sIHt7ezAsOH19LDI4fSwge3t7MCw5fX0sMTUzfSwKLSAgICB7e3s4NCw3fX0sODN9LCB7e3swLDh9fSwxMjR9LCB7e3swLDh9fSw2MH0sIHt7ezAsOX19LDIxN30sCi0gICAge3t7ODIsN319LDIzfSwge3t7MCw4fX0sMTA4fSwge3t7MCw4fX0sNDR9LCB7e3swLDl9fSwxODV9LAotICAgIHt7ezAsOH19LDEyfSwge3t7MCw4fX0sMTQwfSwge3t7MCw4fX0sNzZ9LCB7e3swLDl9fSwyNDl9LAotICAgIHt7ezgwLDd9fSwzfSwge3t7MCw4fX0sODJ9LCB7e3swLDh9fSwxOH0sIHt7ezg1LDh9fSwxNjN9LAotICAgIHt7ezgzLDd9fSwzNX0sIHt7ezAsOH19LDExNH0sIHt7ezAsOH19LDUwfSwge3t7MCw5fX0sMTk3fSwKLSAgICB7e3s4MSw3fX0sMTF9LCB7e3swLDh9fSw5OH0sIHt7ezAsOH19LDM0fSwge3t7MCw5fX0sMTY1fSwKLSAgICB7e3swLDh9fSwyfSwge3t7MCw4fX0sMTMwfSwge3t7MCw4fX0sNjZ9LCB7e3swLDl9fSwyMjl9LAotICAgIHt7ezgwLDd9fSw3fSwge3t7MCw4fX0sOTB9LCB7e3swLDh9fSwyNn0sIHt7ezAsOX19LDE0OX0sCi0gICAge3t7ODQsN319LDY3fSwge3t7MCw4fX0sMTIyfSwge3t7MCw4fX0sNTh9LCB7e3swLDl9fSwyMTN9LAotICAgIHt7ezgyLDd9fSwxOX0sIHt7ezAsOH19LDEwNn0sIHt7ezAsOH19LDQyfSwge3t7MCw5fX0sMTgxfSwKLSAgICB7e3swLDh9fSwxMH0sIHt7ezAsOH19LDEzOH0sIHt7ezAsOH19LDc0fSwge3t7MCw5fX0sMjQ1fSwKLSAgICB7e3s4MCw3fX0sNX0sIHt7ezAsOH19LDg2fSwge3t7MCw4fX0sMjJ9LCB7e3sxOTIsOH19LDB9LAotICAgIHt7ezgzLDd9fSw1MX0sIHt7ezAsOH19LDExOH0sIHt7ezAsOH19LDU0fSwge3t7MCw5fX0sMjA1fSwKLSAgICB7e3s4MSw3fX0sMTV9LCB7e3swLDh9fSwxMDJ9LCB7e3swLDh9fSwzOH0sIHt7ezAsOX19LDE3M30sCi0gICAge3t7MCw4fX0sNn0sIHt7ezAsOH19LDEzNH0sIHt7ezAsOH19LDcwfSwge3t7MCw5fX0sMjM3fSwKLSAgICB7e3s4MCw3fX0sOX0sIHt7ezAsOH19LDk0fSwge3t7MCw4fX0sMzB9LCB7e3swLDl9fSwxNTd9LAotICAgIHt7ezg0LDd9fSw5OX0sIHt7ezAsOH19LDEyNn0sIHt7ezAsOH19LDYyfSwge3t7MCw5fX0sMjIxfSwKLSAgICB7e3s4Miw3fX0sMjd9LCB7e3swLDh9fSwxMTB9LCB7e3swLDh9fSw0Nn0sIHt7ezAsOX19LDE4OX0sCi0gICAge3t7MCw4fX0sMTR9LCB7e3swLDh9fSwxNDJ9LCB7e3swLDh9fSw3OH0sIHt7ezAsOX19LDI1M30sCi0gICAge3t7OTYsN319LDI1Nn0sIHt7ezAsOH19LDgxfSwge3t7MCw4fX0sMTd9LCB7e3s4NSw4fX0sMTMxfSwKLSAgICB7e3s4Miw3fX0sMzF9LCB7e3swLDh9fSwxMTN9LCB7e3swLDh9fSw0OX0sIHt7ezAsOX19LDE5NX0sCi0gICAge3t7ODAsN319LDEwfSwge3t7MCw4fX0sOTd9LCB7e3swLDh9fSwzM30sIHt7ezAsOX19LDE2M30sCi0gICAge3t7MCw4fX0sMX0sIHt7ezAsOH19LDEyOX0sIHt7ezAsOH19LDY1fSwge3t7MCw5fX0sMjI3fSwKLSAgICB7e3s4MCw3fX0sNn0sIHt7ezAsOH19LDg5fSwge3t7MCw4fX0sMjV9LCB7e3swLDl9fSwxNDd9LAotICAgIHt7ezgzLDd9fSw1OX0sIHt7ezAsOH19LDEyMX0sIHt7ezAsOH19LDU3fSwge3t7MCw5fX0sMjExfSwKLSAgICB7e3s4MSw3fX0sMTd9LCB7e3swLDh9fSwxMDV9LCB7e3swLDh9fSw0MX0sIHt7ezAsOX19LDE3OX0sCi0gICAge3t7MCw4fX0sOX0sIHt7ezAsOH19LDEzN30sIHt7ezAsOH19LDczfSwge3t7MCw5fX0sMjQzfSwKLSAgICB7e3s4MCw3fX0sNH0sIHt7ezAsOH19LDg1fSwge3t7MCw4fX0sMjF9LCB7e3s4MCw4fX0sMjU4fSwKLSAgICB7e3s4Myw3fX0sNDN9LCB7e3swLDh9fSwxMTd9LCB7e3swLDh9fSw1M30sIHt7ezAsOX19LDIwM30sCi0gICAge3t7ODEsN319LDEzfSwge3t7MCw4fX0sMTAxfSwge3t7MCw4fX0sMzd9LCB7e3swLDl9fSwxNzF9LAotICAgIHt7ezAsOH19LDV9LCB7e3swLDh9fSwxMzN9LCB7e3swLDh9fSw2OX0sIHt7ezAsOX19LDIzNX0sCi0gICAge3t7ODAsN319LDh9LCB7e3swLDh9fSw5M30sIHt7ezAsOH19LDI5fSwge3t7MCw5fX0sMTU1fSwKLSAgICB7e3s4NCw3fX0sODN9LCB7e3swLDh9fSwxMjV9LCB7e3swLDh9fSw2MX0sIHt7ezAsOX19LDIxOX0sCi0gICAge3t7ODIsN319LDIzfSwge3t7MCw4fX0sMTA5fSwge3t7MCw4fX0sNDV9LCB7e3swLDl9fSwxODd9LAotICAgIHt7ezAsOH19LDEzfSwge3t7MCw4fX0sMTQxfSwge3t7MCw4fX0sNzd9LCB7e3swLDl9fSwyNTF9LAotICAgIHt7ezgwLDd9fSwzfSwge3t7MCw4fX0sODN9LCB7e3swLDh9fSwxOX0sIHt7ezg1LDh9fSwxOTV9LAotICAgIHt7ezgzLDd9fSwzNX0sIHt7ezAsOH19LDExNX0sIHt7ezAsOH19LDUxfSwge3t7MCw5fX0sMTk5fSwKLSAgICB7e3s4MSw3fX0sMTF9LCB7e3swLDh9fSw5OX0sIHt7ezAsOH19LDM1fSwge3t7MCw5fX0sMTY3fSwKLSAgICB7e3swLDh9fSwzfSwge3t7MCw4fX0sMTMxfSwge3t7MCw4fX0sNjd9LCB7e3swLDl9fSwyMzF9LAotICAgIHt7ezgwLDd9fSw3fSwge3t7MCw4fX0sOTF9LCB7e3swLDh9fSwyN30sIHt7ezAsOX19LDE1MX0sCi0gICAge3t7ODQsN319LDY3fSwge3t7MCw4fX0sMTIzfSwge3t7MCw4fX0sNTl9LCB7e3swLDl9fSwyMTV9LAotICAgIHt7ezgyLDd9fSwxOX0sIHt7ezAsOH19LDEwN30sIHt7ezAsOH19LDQzfSwge3t7MCw5fX0sMTgzfSwKLSAgICB7e3swLDh9fSwxMX0sIHt7ezAsOH19LDEzOX0sIHt7ezAsOH19LDc1fSwge3t7MCw5fX0sMjQ3fSwKLSAgICB7e3s4MCw3fX0sNX0sIHt7ezAsOH19LDg3fSwge3t7MCw4fX0sMjN9LCB7e3sxOTIsOH19LDB9LAotICAgIHt7ezgzLDd9fSw1MX0sIHt7ezAsOH19LDExOX0sIHt7ezAsOH19LDU1fSwge3t7MCw5fX0sMjA3fSwKLSAgICB7e3s4MSw3fX0sMTV9LCB7e3swLDh9fSwxMDN9LCB7e3swLDh9fSwzOX0sIHt7ezAsOX19LDE3NX0sCi0gICAge3t7MCw4fX0sN30sIHt7ezAsOH19LDEzNX0sIHt7ezAsOH19LDcxfSwge3t7MCw5fX0sMjM5fSwKLSAgICB7e3s4MCw3fX0sOX0sIHt7ezAsOH19LDk1fSwge3t7MCw4fX0sMzF9LCB7e3swLDl9fSwxNTl9LAotICAgIHt7ezg0LDd9fSw5OX0sIHt7ezAsOH19LDEyN30sIHt7ezAsOH19LDYzfSwge3t7MCw5fX0sMjIzfSwKLSAgICB7e3s4Miw3fX0sMjd9LCB7e3swLDh9fSwxMTF9LCB7e3swLDh9fSw0N30sIHt7ezAsOX19LDE5MX0sCi0gICAge3t7MCw4fX0sMTV9LCB7e3swLDh9fSwxNDN9LCB7e3swLDh9fSw3OX0sIHt7ezAsOX19LDI1NX0KLSAgfTsKLWxvY2FsIGNvbnN0IGluZmxhdGVfaHVmdCBmaXhlZF90ZFtdID0gewotICAgIHt7ezgwLDV9fSwxfSwge3t7ODcsNX19LDI1N30sIHt7ezgzLDV9fSwxN30sIHt7ezkxLDV9fSw0MDk3fSwKLSAgICB7e3s4MSw1fX0sNX0sIHt7ezg5LDV9fSwxMDI1fSwge3t7ODUsNX19LDY1fSwge3t7OTMsNX19LDE2Mzg1fSwKLSAgICB7e3s4MCw1fX0sM30sIHt7ezg4LDV9fSw1MTN9LCB7e3s4NCw1fX0sMzN9LCB7e3s5Miw1fX0sODE5M30sCi0gICAge3t7ODIsNX19LDl9LCB7e3s5MCw1fX0sMjA0OX0sIHt7ezg2LDV9fSwxMjl9LCB7e3sxOTIsNX19LDI0NTc3fSwKLSAgICB7e3s4MCw1fX0sMn0sIHt7ezg3LDV9fSwzODV9LCB7e3s4Myw1fX0sMjV9LCB7e3s5MSw1fX0sNjE0NX0sCi0gICAge3t7ODEsNX19LDd9LCB7e3s4OSw1fX0sMTUzN30sIHt7ezg1LDV9fSw5N30sIHt7ezkzLDV9fSwyNDU3N30sCi0gICAge3t7ODAsNX19LDR9LCB7e3s4OCw1fX0sNzY5fSwge3t7ODQsNX19LDQ5fSwge3t7OTIsNX19LDEyMjg5fSwKLSAgICB7e3s4Miw1fX0sMTN9LCB7e3s5MCw1fX0sMzA3M30sIHt7ezg2LDV9fSwxOTN9LCB7e3sxOTIsNX19LDI0NTc3fQotICB9OwpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvaW5mbGF0ZS5jIGIvc3JjL2d6aXAvaW5mbGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODc3ZmEzLi4wMDAwMDAwCi0tLSBhL3NyYy9nemlwL2luZmxhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKiBpbmZsYXRlLmMgLS0gemxpYiBpbnRlcmZhY2UgdG8gaW5mbGF0ZSBtb2R1bGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mYmxvY2suaCIKLQotI2RlZmluZSAgRE9ORSAgSU5GTEFURV9ET05FCi0jZGVmaW5lICBCQUQgICBJTkZMQVRFX0JBRAotCi10eXBlZGVmIGVudW0gewotICAgICAgTUVUSE9ELCAgIC8qIHdhaXRpbmcgZm9yIG1ldGhvZCBieXRlICovCi0gICAgICBGTEFHLCAgICAgLyogd2FpdGluZyBmb3IgZmxhZyBieXRlICovCi0gICAgICBESUNUNCwgICAgLyogZm91ciBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBESUNUMywgICAgLyogdGhyZWUgZGljdGlvbmFyeSBjaGVjayBieXRlcyB0byBnbyAqLwotICAgICAgRElDVDIsICAgIC8qIHR3byBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBESUNUMSwgICAgLyogb25lIGRpY3Rpb25hcnkgY2hlY2sgYnl0ZSB0byBnbyAqLwotICAgICAgRElDVDAsICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5ICovCi0gICAgICBCTE9DS1MsICAgLyogZGVjb21wcmVzc2luZyBibG9ja3MgKi8KLSAgICAgIENIRUNLNCwgICAvKiBmb3VyIGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBDSEVDSzMsICAgLyogdGhyZWUgY2hlY2sgYnl0ZXMgdG8gZ28gKi8KLSAgICAgIENIRUNLMiwgICAvKiB0d28gY2hlY2sgYnl0ZXMgdG8gZ28gKi8KLSAgICAgIENIRUNLMSwgICAvKiBvbmUgY2hlY2sgYnl0ZSB0byBnbyAqLwotICAgICAgRE9ORSwgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lICovCi0gICAgICBCQUR9ICAgICAgLyogZ290IGFuIGVycm9yLS1zdGF5IGhlcmUgKi8KLWluZmxhdGVfbW9kZTsKLQotLyogaW5mbGF0ZSBwcml2YXRlIHN0YXRlICovCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgewotCi0gIC8qIG1vZGUgKi8KLSAgaW5mbGF0ZV9tb2RlICBtb2RlOyAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCi0KLSAgLyogbW9kZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KLSAgdW5pb24gewotICAgIHVJbnQgbWV0aG9kOyAgICAgICAgLyogaWYgRkxBR1MsIG1ldGhvZCBieXRlICovCi0gICAgc3RydWN0IHsKLSAgICAgIHVMb25nIHdhczsgICAgICAgICAgICAgICAgLyogY29tcHV0ZWQgY2hlY2sgdmFsdWUgKi8KLSAgICAgIHVMb25nIG5lZWQ7ICAgICAgICAgICAgICAgLyogc3RyZWFtIGNoZWNrIHZhbHVlICovCi0gICAgfSBjaGVjazsgICAgICAgICAgICAvKiBpZiBDSEVDSywgY2hlY2sgdmFsdWVzIHRvIGNvbXBhcmUgKi8KLSAgICB1SW50IG1hcmtlcjsgICAgICAgIC8qIGlmIEJBRCwgaW5mbGF0ZVN5bmMncyBtYXJrZXIgYnl0ZXMgY291bnQgKi8KLSAgfSBzdWI7ICAgICAgICAvKiBzdWJtb2RlICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICBpbnQgIG5vd3JhcDsgICAgICAgICAgLyogZmxhZyBmb3Igbm8gd3JhcHBlciAqLwotICB1SW50IHdiaXRzOyAgICAgICAgICAgLyogbG9nMih3aW5kb3cgc2l6ZSkgICg4Li4xNSwgZGVmYXVsdHMgdG8gMTUpICovCi0gIGluZmxhdGVfYmxvY2tzX3N0YXRlZgotICAgICpibG9ja3M7ICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlX2Jsb2NrcyBzdGF0ZSAqLwotCi19OwotCi0KLVpFWFBPUlQoaW50KSBpbmZsYXRlUmVzZXQoIC8qIHopICovCi16X3N0cmVhbXAgeiApCi17Ci0gIGlmICh6ID09IFpfTlVMTCB8fCB6LT5zdGF0ZSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICB6LT50b3RhbF9pbiA9IHotPnRvdGFsX291dCA9IDA7Ci0gIHotPm1zZyA9IFpfTlVMTDsKLSAgei0+c3RhdGUtPm1vZGUgPSB6LT5zdGF0ZS0+bm93cmFwID8gQkxPQ0tTIDogTUVUSE9EOwotICBpbmZsYXRlX2Jsb2Nrc19yZXNldCh6LT5zdGF0ZS0+YmxvY2tzLCB6LCBaX05VTEwpOwotICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IHJlc2V0XG4iKSk7Ci0gIHJldHVybiBaX09LOwotfQotCi0KLVpFWFBPUlQoaW50KSBpbmZsYXRlRW5kKCAvKiB6KSAqLwotel9zdHJlYW1wIHogKQotewotICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPnpmcmVlID09IFpfTlVMTCkKLSAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gIGlmICh6LT5zdGF0ZS0+YmxvY2tzICE9IFpfTlVMTCkKLSAgICBpbmZsYXRlX2Jsb2Nrc19mcmVlKHotPnN0YXRlLT5ibG9ja3MsIHopOwotICBaRlJFRSh6LCB6LT5zdGF0ZSk7Ci0gIHotPnN0YXRlID0gWl9OVUxMOwotICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOwotICByZXR1cm4gWl9PSzsKLX0KLQotCi1aRVhQT1JUKGludCkgaW5mbGF0ZUluaXQyXyggLyogeiwgdywgdmVyc2lvbiwgc3RyZWFtX3NpemUpICovCi16X3N0cmVhbXAgeiwKLWludCB3LAotY29uc3QgY2hhciAqdmVyc2lvbiwKLWludCBzdHJlYW1fc2l6ZSApCi17Ci0gIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAotICAgICAgc3RyZWFtX3NpemUgIT0gc2l6ZW9mKHpfc3RyZWFtKSkKLSAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7Ci0KLSAgLyogaW5pdGlhbGl6ZSBzdGF0ZSAqLwotICBpZiAoeiA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICB6LT5tc2cgPSBaX05VTEw7Ci0gIGlmICh6LT56YWxsb2MgPT0gWl9OVUxMKQotICB7Ci0gICAgei0+emFsbG9jID0gemNhbGxvYzsKLSAgICB6LT5vcGFxdWUgPSAodm9pZHBmKTA7Ci0gIH0KLSAgaWYgKHotPnpmcmVlID09IFpfTlVMTCkgei0+emZyZWUgPSB6Y2ZyZWU7Ci0gIGlmICgoei0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKQotICAgICAgIFpBTExPQyh6LDEsc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSkpKSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICB6LT5zdGF0ZS0+YmxvY2tzID0gWl9OVUxMOwotCi0gIC8qIGhhbmRsZSB1bmRvY3VtZW50ZWQgbm93cmFwIG9wdGlvbiAobm8gemxpYiBoZWFkZXIgb3IgY2hlY2spICovCi0gIHotPnN0YXRlLT5ub3dyYXAgPSAwOwotICBpZiAodyA8IDApCi0gIHsKLSAgICB3ID0gLSB3OwotICAgIHotPnN0YXRlLT5ub3dyYXAgPSAxOwotICB9Ci0KLSAgLyogc2V0IHdpbmRvdyBzaXplICovCi0gIGlmICh3IDwgOCB8fCB3ID4gMTUpCi0gIHsKLSAgICBpbmZsYXRlRW5kKHopOwotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgfQotICB6LT5zdGF0ZS0+d2JpdHMgPSAodUludCl3OwotCi0gIC8qIGNyZWF0ZSBpbmZsYXRlX2Jsb2NrcyBzdGF0ZSAqLwotICBpZiAoKHotPnN0YXRlLT5ibG9ja3MgPQotICAgICAgaW5mbGF0ZV9ibG9ja3NfbmV3KHosIHotPnN0YXRlLT5ub3dyYXAgPyBaX05VTEwgOiBhZGxlcjMyLCAodUludCkxIDw8IHcpKQotICAgICAgPT0gWl9OVUxMKQotICB7Ci0gICAgaW5mbGF0ZUVuZCh6KTsKLSAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gIH0KLSAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKLQotICAvKiByZXNldCBzdGF0ZSAqLwotICBpbmZsYXRlUmVzZXQoeik7Ci0gIHJldHVybiBaX09LOwotfQotCi0KLQotI3VuZGVmICBORUVEQllURQotI2RlZmluZSBORUVEQllURSB7aWYoei0+YXZhaWxfaW49PTApcmV0dXJuIHI7cj1mO30KLQotI3VuZGVmICBORVhUQllURQotI2RlZmluZSBORVhUQllURSAoei0+YXZhaWxfaW4tLSx6LT50b3RhbF9pbisrLCp6LT5uZXh0X2luKyspCi0KLQotWkVYUE9SVChpbnQpIGluZmxhdGUoIC8qIHosIGYpICovCi16X3N0cmVhbXAgeiwKLWludCBmICkKLXsKLSAgaW50IHI7Ci0gIHVJbnQgYjsKLQotICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPm5leHRfaW4gPT0gWl9OVUxMKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgZiA9IGYgPT0gWl9GSU5JU0ggPyBaX0JVRl9FUlJPUiA6IFpfT0s7Ci0gIHIgPSBaX0JVRl9FUlJPUjsKLSAgd2hpbGUgKDEpIHN3aXRjaCAoei0+c3RhdGUtPm1vZGUpCi0gIHsKLSAgICBjYXNlIE1FVEhPRDoKLSAgICAgIE5FRURCWVRFCi0gICAgICBpZiAoKCh6LT5zdGF0ZS0+c3ViLm1ldGhvZCA9IE5FWFRCWVRFKSAmIDB4ZikgIT0gWl9ERUZMQVRFRCkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOwotICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgoei0+c3RhdGUtPnN1Yi5tZXRob2QgPj4gNCkgKyA4ID4gei0+c3RhdGUtPndiaXRzKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIHdpbmRvdyBzaXplIjsKLSAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IEZMQUc7Ci0gICAgY2FzZSBGTEFHOgotICAgICAgTkVFREJZVEUKLSAgICAgIGIgPSBORVhUQllURTsKLSAgICAgIGlmICgoKHotPnN0YXRlLT5zdWIubWV0aG9kIDw8IDgpICsgYikgJSAzMSkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb3JyZWN0IGhlYWRlciBjaGVjayI7Ci0gICAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gNTsgICAgICAgLyogY2FuJ3QgdHJ5IGluZmxhdGVTeW5jICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiB6bGliIGhlYWRlciBva1xuIikpOwotICAgICAgaWYgKCEoYiAmIFBSRVNFVF9ESUNUKSkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCTE9DS1M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUNDsKLSAgICBjYXNlIERJQ1Q0OgotICAgICAgTkVFREJZVEUKLSAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCA9ICh1TG9uZylORVhUQllURSA8PCAyNDsKLSAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDM7Ci0gICAgY2FzZSBESUNUMzoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDE2OwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUMjsKLSAgICBjYXNlIERJQ1QyOgotICAgICAgTkVFREJZVEUKLSAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEUgPDwgODsKLSAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDE7Ci0gICAgY2FzZSBESUNUMToKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFOwotICAgICAgei0+YWRsZXIgPSB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQ7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IERJQ1QwOwotICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUOwotICAgIGNhc2UgRElDVDA6Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgIHotPm1zZyA9IChjaGFyKikibmVlZCBkaWN0aW9uYXJ5IjsKLSAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsgICAgICAgLyogY2FuIHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIGNhc2UgQkxPQ0tTOgotICAgICAgciA9IGluZmxhdGVfYmxvY2tzKHotPnN0YXRlLT5ibG9ja3MsIHosIHIpOwotICAgICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSAwOyAgICAgICAvKiBjYW4gdHJ5IGluZmxhdGVTeW5jICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKHIgPT0gWl9PSykKLSAgICAgICAgciA9IGY7Ci0gICAgICBpZiAociAhPSBaX1NUUkVBTV9FTkQpCi0gICAgICAgIHJldHVybiByOwotICAgICAgciA9IGY7Ci0gICAgICBpbmZsYXRlX2Jsb2Nrc19yZXNldCh6LT5zdGF0ZS0+YmxvY2tzLCB6LCAmei0+c3RhdGUtPnN1Yi5jaGVjay53YXMpOwotICAgICAgaWYgKHotPnN0YXRlLT5ub3dyYXApCi0gICAgICB7Ci0gICAgICAgIHotPnN0YXRlLT5tb2RlID0gRE9ORTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLNDsKLSAgICBjYXNlIENIRUNLNDoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgPSAodUxvbmcpTkVYVEJZVEUgPDwgMjQ7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMzsKLSAgICBjYXNlIENIRUNLMzoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDE2OwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzI7Ci0gICAgY2FzZSBDSEVDSzI6Ci0gICAgICBORUVEQllURQotICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURSA8PCA4OwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzE7Ci0gICAgY2FzZSBDSEVDSzE6Ci0gICAgICBORUVEQllURQotICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURTsKLQotICAgICAgaWYgKHotPnN0YXRlLT5zdWIuY2hlY2sud2FzICE9IHotPnN0YXRlLT5zdWIuY2hlY2submVlZCkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb3JyZWN0IGRhdGEgY2hlY2siOwotICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogemxpYiBjaGVjayBva1xuIikpOwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBET05FOwotICAgIGNhc2UgRE9ORToKLSAgICAgIHJldHVybiBaX1NUUkVBTV9FTkQ7Ci0gICAgY2FzZSBCQUQ6Ci0gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gIH0KLSNpZmRlZiBORUVEX0RVTU1ZX1JFVFVSTgotICByZXR1cm4gWl9TVFJFQU1fRVJST1I7ICAvKiBTb21lIGR1bWIgY29tcGlsZXJzIGNvbXBsYWluIHdpdGhvdXQgdGhpcyAqLwotI2VuZGlmCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9nemlwL2luZnRyZWVzLmMgYi9zcmMvZ3ppcC9pbmZ0cmVlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmY1MmIxLi4wMDAwMDAwCi0tLSBhL3NyYy9nemlwL2luZnRyZWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyogaW5mdHJlZXMuYyAtLSBnZW5lcmF0ZSBIdWZmbWFuIHRyZWVzIGZvciBlZmZpY2llbnQgZGVjb2RpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotCi0jaWYgIWRlZmluZWQoQlVJTERGSVhFRCkgJiYgIWRlZmluZWQoU1REQykKLSMgIGRlZmluZSBCVUlMREZJWEVEICAgLyogbm9uIEFOU0kgY29tcGlsZXJzIG1heSBub3QgYWNjZXB0IGluZmZpeGVkLmggKi8KLSNlbmRpZgotCi0KLSNpZiAwCi1sb2NhbCBjb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBpbmZsYXRlIDEuMS40IENvcHlyaWdodCAxOTk1LTIwMDIgTWFyayBBZGxlciAiOwotI2VuZGlmCi0vKgotICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCi0gIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKLSAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCi0gIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgotICovCi0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi0KLWxvY2FsIGludCBodWZ0X2J1aWxkIE9GKCgKLSAgICB1SW50ZiAqLCAgICAgICAgICAgIC8qIGNvZGUgbGVuZ3RocyBpbiBiaXRzICovCi0gICAgdUludCwgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgKi8KLSAgICB1SW50LCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiAic2ltcGxlIiBjb2RlcyAqLwotICAgIGNvbnN0IHVJbnRmICosICAgICAgLyogbGlzdCBvZiBiYXNlIHZhbHVlcyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLwotICAgIGNvbnN0IHVJbnRmICosICAgICAgLyogbGlzdCBvZiBleHRyYSBiaXRzIGZvciBub24tc2ltcGxlIGNvZGVzICovCi0gICAgaW5mbGF0ZV9odWZ0ICogRkFSKiwvKiByZXN1bHQ6IHN0YXJ0aW5nIHRhYmxlICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAvKiBtYXhpbXVtIGxvb2t1cCBiaXRzIChyZXR1cm5zIGFjdHVhbCkgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiwgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLwotICAgIHVJbnQgKiwgICAgICAgICAgICAgLyogaHVmdHMgdXNlZCBpbiBzcGFjZSAqLwotICAgIHVJbnRmICogKSk7ICAgICAgICAgLyogc3BhY2UgZm9yIHZhbHVlcyAqLwotCi0vKiBUYWJsZXMgZm9yIGRlZmxhdGUgZnJvbSBQS1pJUCdzIGFwcG5vdGUudHh0LiAqLwotbG9jYWwgY29uc3QgdUludCBjcGxlbnNbMzFdID0geyAvKiBDb3B5IGxlbmd0aHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KLSAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKLSAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDB9OwotICAgICAgICAvKiBzZWUgbm90ZSAjMTMgYWJvdmUgYWJvdXQgMjU4ICovCi1sb2NhbCBjb25zdCB1SW50IGNwbGV4dFszMV0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKLSAgICAgICAgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgMCwgMTEyLCAxMTJ9OyAvKiAxMTI9PWludmFsaWQgKi8KLWxvY2FsIGNvbnN0IHVJbnQgY3BkaXN0WzMwXSA9IHsgLyogQ29weSBvZmZzZXRzIGZvciBkaXN0YW5jZSBjb2RlcyAwLi4yOSAqLwotICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCi0gICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKLSAgICAgICAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3N307Ci1sb2NhbCBjb25zdCB1SW50IGNwZGV4dFszMF0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlIGNvZGVzICovCi0gICAgICAgIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsCi0gICAgICAgIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLAotICAgICAgICAxMiwgMTIsIDEzLCAxM307Ci0KLS8qCi0gICBIdWZmbWFuIGNvZGUgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIGEgbXVsdGktbGV2ZWwgdGFibGUgbG9va3VwLgotICAgVGhlIGZhc3Rlc3Qgd2F5IHRvIGRlY29kZSBpcyB0byBzaW1wbHkgYnVpbGQgYSBsb29rdXAgdGFibGUgd2hvc2UKLSAgIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwgdGhlIHRpbWUgaXQgdGFrZXMKLSAgIHRvIGJ1aWxkIHRoaXMgdGFibGUgY2FuIGFsc28gYmUgYSBmYWN0b3IgaWYgdGhlIGRhdGEgYmVpbmcgZGVjb2RlZAotICAgaXMgbm90IHZlcnkgbG9uZy4gIFRoZSBtb3N0IGNvbW1vbiBjb2RlcyBhcmUgbmVjZXNzYXJpbHkgdGhlCi0gICBzaG9ydGVzdCBjb2Rlcywgc28gdGhvc2UgY29kZXMgZG9taW5hdGUgdGhlIGRlY29kaW5nIHRpbWUsIGFuZCBoZW5jZQotICAgdGhlIHNwZWVkLiAgVGhlIGlkZWEgaXMgeW91IGNhbiBoYXZlIGEgc2hvcnRlciB0YWJsZSB0aGF0IGRlY29kZXMgdGhlCi0gICBzaG9ydGVyLCBtb3JlIHByb2JhYmxlIGNvZGVzLCBhbmQgdGhlbiBwb2ludCB0byBzdWJzaWRpYXJ5IHRhYmxlcyBmb3IKLSAgIHRoZSBsb25nZXIgY29kZXMuICBUaGUgdGltZSBpdCBjb3N0cyB0byBkZWNvZGUgdGhlIGxvbmdlciBjb2RlcyBpcwotICAgdGhlbiB0cmFkZWQgYWdhaW5zdCB0aGUgdGltZSBpdCB0YWtlcyB0byBtYWtlIGxvbmdlciB0YWJsZXMuCi0KLSAgIFRoaXMgcmVzdWx0cyBvZiB0aGlzIHRyYWRlIGFyZSBpbiB0aGUgdmFyaWFibGVzIGxiaXRzIGFuZCBkYml0cwotICAgYmVsb3cuICBsYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhlIGZpcnN0IGxldmVsIHRhYmxlIGZvciBsaXRlcmFsLwotICAgbGVuZ3RoIGNvZGVzIGNhbiBkZWNvZGUgaW4gb25lIHN0ZXAsIGFuZCBkYml0cyBpcyB0aGUgc2FtZSB0aGluZyBmb3IKLSAgIHRoZSBkaXN0YW5jZSBjb2Rlcy4gIFN1YnNlcXVlbnQgdGFibGVzIGFyZSBhbHNvIGxlc3MgdGhhbiBvciBlcXVhbCB0bwotICAgdGhvc2Ugc2l6ZXMuICBUaGVzZSB2YWx1ZXMgbWF5IGJlIGFkanVzdGVkIGVpdGhlciB3aGVuIGFsbCBvZiB0aGUKLSAgIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gdGhhdCwgaW4gd2hpY2ggY2FzZSB0aGUgbG9uZ2VzdCBjb2RlIGxlbmd0aCBpbgotICAgYml0cyBpcyB1c2VkLCBvciB3aGVuIHRoZSBzaG9ydGVzdCBjb2RlIGlzICpsb25nZXIqIHRoYW4gdGhlIHJlcXVlc3RlZAotICAgdGFibGUgc2l6ZSwgaW4gd2hpY2ggY2FzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBjb2RlIGluIGJpdHMgaXMKLSAgIHVzZWQuCi0KLSAgIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIHR3byB0YWJsZXMsIHNpbmNlIHRoZXkgY29kZSBhCi0gICBkaWZmZXJlbnQgbnVtYmVyIG9mIHBvc3NpYmlsaXRpZXMgZWFjaC4gIFRoZSBsaXRlcmFsL2xlbmd0aCB0YWJsZQotICAgY29kZXMgMjg2IHBvc3NpYmxlIHZhbHVlcywgb3IgaW4gYSBmbGF0IGNvZGUsIGEgbGl0dGxlIG92ZXIgZWlnaHQKLSAgIGJpdHMuICBUaGUgZGlzdGFuY2UgdGFibGUgY29kZXMgMzAgcG9zc2libGUgdmFsdWVzLCBvciBhIGxpdHRsZSBsZXNzCi0gICB0aGFuIGZpdmUgYml0cywgZmxhdC4gIFRoZSBvcHRpbXVtIHZhbHVlcyBmb3Igc3BlZWQgZW5kIHVwIGJlaW5nCi0gICBhYm91dCBvbmUgYml0IG1vcmUgdGhhbiB0aG9zZSwgc28gbGJpdHMgaXMgOCsxIGFuZCBkYml0cyBpcyA1KzEuCi0gICBUaGUgb3B0aW11bSB2YWx1ZXMgbWF5IGRpZmZlciB0aG91Z2ggZnJvbSBtYWNoaW5lIHRvIG1hY2hpbmUsIGFuZAotICAgcG9zc2libHkgZXZlbiBiZXR3ZWVuIGNvbXBpbGVycy4gIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KLSAqLwotCi0KLS8qIElmIEJNQVggbmVlZHMgdG8gYmUgbGFyZ2VyIHRoYW4gMTYsIHRoZW4gaCBhbmQgeFtdIHNob3VsZCBiZSB1TG9uZy4gKi8KLSNkZWZpbmUgQk1BWCAxNSAgICAgICAgIC8qIG1heGltdW0gYml0IGxlbmd0aCBvZiBhbnkgY29kZSAqLwotCi1sb2NhbCBpbnQgaHVmdF9idWlsZCggLyogYiwgbiwgcywgZCwgZSwgdCwgbSwgaHAsIGhuLCB2KSAqLwotdUludGYgKmIsICAgICAgICAgICAgICAgLyogY29kZSBsZW5ndGhzIGluIGJpdHMgKGFsbCBhc3N1bWVkIDw9IEJNQVgpICovCi11SW50IG4sICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgKGFzc3VtZWQgPD0gMjg4KSAqLwotdUludCBzLCAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHNpbXBsZS12YWx1ZWQgY29kZXMgKDAuLnMtMSkgKi8KLWNvbnN0IHVJbnRmICpkLCAgICAgICAgIC8qIGxpc3Qgb2YgYmFzZSB2YWx1ZXMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KLWNvbnN0IHVJbnRmICplLCAgICAgICAgIC8qIGxpc3Qgb2YgZXh0cmEgYml0cyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLwotaW5mbGF0ZV9odWZ0ICogRkFSICp0LCAgLyogcmVzdWx0OiBzdGFydGluZyB0YWJsZSAqLwotdUludGYgKm0sICAgICAgICAgICAgICAgLyogbWF4aW11bSBsb29rdXAgYml0cywgcmV0dXJucyBhY3R1YWwgKi8KLWluZmxhdGVfaHVmdCAqaHAsICAgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLwotdUludCAqaG4sICAgICAgICAgICAgICAgLyogaHVmdHMgdXNlZCBpbiBzcGFjZSAqLwotdUludGYgKnYgICAgICAgICAgICAgICAgLyogd29ya2luZyBhcmVhOiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aCAqLwotLyogR2l2ZW4gYSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBhbmQgYSBtYXhpbXVtIHRhYmxlIHNpemUsIG1ha2UgYSBzZXQgb2YKLSAgIHRhYmxlcyB0byBkZWNvZGUgdGhhdCBzZXQgb2YgY29kZXMuICBSZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX0JVRl9FUlJPUgotICAgaWYgdGhlIGdpdmVuIGNvZGUgc2V0IGlzIGluY29tcGxldGUgKHRoZSB0YWJsZXMgYXJlIHN0aWxsIGJ1aWx0IGluIHRoaXMKLSAgIGNhc2UpLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGlzIGludmFsaWQuICovCi0pCi17Ci0KLSAgdUludCBhOyAgICAgICAgICAgICAgICAgICAgICAgLyogY291bnRlciBmb3IgY29kZXMgb2YgbGVuZ3RoIGsgKi8KLSAgdUludCBjW0JNQVgrMV07ICAgICAgICAgICAgICAgLyogYml0IGxlbmd0aCBjb3VudCB0YWJsZSAqLwotICB1SW50IGY7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpIHJlcGVhdHMgaW4gdGFibGUgZXZlcnkgZiBlbnRyaWVzICovCi0gIGludCBnOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gY29kZSBsZW5ndGggKi8KLSAgaW50IGg7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFibGUgbGV2ZWwgKi8KLSAgdUludCBpOyAgICAgICAgICAgICAgICAgICAgICAgLyogY291bnRlciwgY3VycmVudCBjb2RlICovCi0gIHVJbnQgajsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50ZXIgKi8KLSAgaW50IGs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gY3VycmVudCBjb2RlICovCi0gIGludCBsOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgcGVyIHRhYmxlIChyZXR1cm5lZCBpbiBtKSAqLwotICB1SW50IG1hc2s7ICAgICAgICAgICAgICAgICAgICAvKiAoMSA8PCB3KSAtIDEsIHRvIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUCAqLwotICB1SW50ZiAqcDsgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIGludG8gY1tdLCBiW10sIG9yIHZbXSAqLwotICBpbmZsYXRlX2h1ZnQgKnE7ICAgICAgICAgICAgICAvKiBwb2ludHMgdG8gY3VycmVudCB0YWJsZSAqLwotICBzdHJ1Y3QgaW5mbGF0ZV9odWZ0X3MgcjsgICAgICAvKiB0YWJsZSBlbnRyeSBmb3Igc3RydWN0dXJlIGFzc2lnbm1lbnQgKi8KLSAgaW5mbGF0ZV9odWZ0ICp1W0JNQVhdOyAgICAgICAgLyogdGFibGUgc3RhY2sgKi8KLSAgaW50IHc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0cyBiZWZvcmUgdGhpcyB0YWJsZSA9PSAobCAqIGgpICovCi0gIHVJbnQgeFtCTUFYKzFdOyAgICAgICAgICAgICAgIC8qIGJpdCBvZmZzZXRzLCB0aGVuIGNvZGUgc3RhY2sgKi8KLSAgdUludGYgKnhwOyAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciBpbnRvIHggKi8KLSAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGR1bW15IGNvZGVzIGFkZGVkICovCi0gIHVJbnQgejsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGN1cnJlbnQgdGFibGUgKi8KLQotCi0gIC8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgci5iYXNlID0gMDsKLQotICAvKiBHZW5lcmF0ZSBjb3VudHMgZm9yIGVhY2ggYml0IGxlbmd0aCAqLwotICBwID0gYzsKLSNkZWZpbmUgQzAgKnArKyA9IDA7Ci0jZGVmaW5lIEMyIEMwIEMwIEMwIEMwCi0jZGVmaW5lIEM0IEMyIEMyIEMyIEMyCi0gIEM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGNbXS0tYXNzdW1lIEJNQVgrMSBpcyAxNiAqLwotICBwID0gYjsgIGkgPSBuOwotICBkbyB7Ci0gICAgY1sqcCsrXSsrOyAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSBhbGwgZW50cmllcyA8PSBCTUFYICovCi0gIH0gd2hpbGUgKC0taSk7Ci0gIGlmIChjWzBdID09IG4pICAgICAgICAgICAgICAgIC8qIG51bGwgaW5wdXQtLWFsbCB6ZXJvIGxlbmd0aCBjb2RlcyAqLwotICB7Ci0gICAgKnQgPSAoaW5mbGF0ZV9odWZ0ICopWl9OVUxMOwotICAgICptID0gMDsKLSAgICByZXR1cm4gWl9PSzsKLSAgfQotCi0KLSAgLyogRmluZCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCwgYm91bmQgKm0gYnkgdGhvc2UgKi8KLSAgbCA9ICptOwotICBmb3IgKGogPSAxOyBqIDw9IEJNQVg7IGorKykKLSAgICBpZiAoY1tqXSkKLSAgICAgIGJyZWFrOwotICBrID0gajsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGNvZGUgbGVuZ3RoICovCi0gIGlmICgodUludClsIDwgaikKLSAgICBsID0gajsKLSAgZm9yIChpID0gQk1BWDsgaTsgaS0tKQotICAgIGlmIChjW2ldKQotICAgICAgYnJlYWs7Ci0gIGcgPSBpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gY29kZSBsZW5ndGggKi8KLSAgaWYgKCh1SW50KWwgPiBpKQotICAgIGwgPSBpOwotICAqbSA9IGw7Ci0KLQotICAvKiBBZGp1c3QgbGFzdCBsZW5ndGggY291bnQgdG8gZmlsbCBvdXQgY29kZXMsIGlmIG5lZWRlZCAqLwotICBmb3IgKHkgPSAxIDw8IGo7IGogPCBpOyBqKyssIHkgPDw9IDEpCi0gICAgaWYgKCh5IC09IGNbal0pIDwgMCkKLSAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gIGlmICgoeSAtPSBjW2ldKSA8IDApCi0gICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgY1tpXSArPSB5OwotCi0KLSAgLyogR2VuZXJhdGUgc3RhcnRpbmcgb2Zmc2V0cyBpbnRvIHRoZSB2YWx1ZSB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KLSAgeFsxXSA9IGogPSAwOwotICBwID0gYyArIDE7ICB4cCA9IHggKyAyOwotICB3aGlsZSAoLS1pKSB7ICAgICAgICAgICAgICAgICAvKiBub3RlIHRoYXQgaSA9PSBnIGZyb20gYWJvdmUgKi8KLSAgICAqeHArKyA9IChqICs9ICpwKyspOwotICB9Ci0KLQotICAvKiBNYWtlIGEgdGFibGUgb2YgdmFsdWVzIGluIG9yZGVyIG9mIGJpdCBsZW5ndGhzICovCi0gIHAgPSBiOyAgaSA9IDA7Ci0gIGRvIHsKLSAgICBpZiAoKGogPSAqcCsrKSAhPSAwKQotICAgICAgdlt4W2pdKytdID0gaTsKLSAgfSB3aGlsZSAoKytpIDwgbik7Ci0gIG4gPSB4W2ddOyAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBuIHRvIGxlbmd0aCBvZiB2ICovCi0KLQotICAvKiBHZW5lcmF0ZSB0aGUgSHVmZm1hbiBjb2RlcyBhbmQgZm9yIGVhY2gsIG1ha2UgdGhlIHRhYmxlIGVudHJpZXMgKi8KLSAgeFswXSA9IGkgPSAwOyAgICAgICAgICAgICAgICAgLyogZmlyc3QgSHVmZm1hbiBjb2RlIGlzIHplcm8gKi8KLSAgcCA9IHY7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JhYiB2YWx1ZXMgaW4gYml0IG9yZGVyICovCi0gIGggPSAtMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHRhYmxlcyB5ZXQtLWxldmVsIC0xICovCi0gIHcgPSAtbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgZGVjb2RlZCA9PSAobCAqIGgpICovCi0gIHVbMF0gPSAoaW5mbGF0ZV9odWZ0ICopWl9OVUxMOyAgICAgICAgLyoganVzdCB0byBrZWVwIGNvbXBpbGVycyBoYXBweSAqLwotICBxID0gKGluZmxhdGVfaHVmdCAqKVpfTlVMTDsgICAvKiBkaXR0byAqLwotICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXR0byAqLwotCi0gIC8qIGdvIHRocm91Z2ggdGhlIGJpdCBsZW5ndGhzIChrIGFscmVhZHkgaXMgYml0cyBpbiBzaG9ydGVzdCBjb2RlKSAqLwotICBmb3IgKDsgayA8PSBnOyBrKyspCi0gIHsKLSAgICBhID0gY1trXTsKLSAgICB3aGlsZSAoYS0tKQotICAgIHsKLSAgICAgIC8qIGhlcmUgaSBpcyB0aGUgSHVmZm1hbiBjb2RlIG9mIGxlbmd0aCBrIGJpdHMgZm9yIHZhbHVlICpwICovCi0gICAgICAvKiBtYWtlIHRhYmxlcyB1cCB0byByZXF1aXJlZCBsZXZlbCAqLwotICAgICAgd2hpbGUgKGsgPiB3ICsgbCkKLSAgICAgIHsKLSAgICAgICAgaCsrOwotICAgICAgICB3ICs9IGw7ICAgICAgICAgICAgICAgICAvKiBwcmV2aW91cyB0YWJsZSBhbHdheXMgbCBiaXRzICovCi0KLSAgICAgICAgLyogY29tcHV0ZSBtaW5pbXVtIHNpemUgdGFibGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGwgYml0cyAqLwotICAgICAgICB6ID0gZyAtIHc7Ci0gICAgICAgIHogPSB6ID4gKHVJbnQpbCA/ICh1SW50KWwgOiB6OyAgICAgICAgLyogdGFibGUgc2l6ZSB1cHBlciBsaW1pdCAqLwotICAgICAgICBpZiAoKGYgPSAxIDw8IChqID0gayAtIHcpKSA+IGEgKyAxKSAgICAgLyogdHJ5IGEgay13IGJpdCB0YWJsZSAqLwotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0b28gZmV3IGNvZGVzIGZvciBrLXcgYml0IHRhYmxlICovCi0gICAgICAgICAgZiAtPSBhICsgMTsgICAgICAgICAgIC8qIGRlZHVjdCBjb2RlcyBmcm9tIHBhdHRlcm5zIGxlZnQgKi8KLSAgICAgICAgICB4cCA9IGMgKyBrOwotICAgICAgICAgIGlmIChqIDwgeikKLSAgICAgICAgICAgIHdoaWxlICgrK2ogPCB6KSAgICAgLyogdHJ5IHNtYWxsZXIgdGFibGVzIHVwIHRvIHogYml0cyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoKGYgPDw9IDEpIDw9ICorK3hwKQotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBlbm91Z2ggY29kZXMgdG8gdXNlIHVwIGogYml0cyAqLwotICAgICAgICAgICAgICBmIC09ICp4cDsgICAgICAgICAvKiBlbHNlIGRlZHVjdCBjb2RlcyBmcm9tIHBhdHRlcm5zICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgeiA9IDEgPDwgajsgICAgICAgICAgICAgLyogdGFibGUgZW50cmllcyBmb3Igai1iaXQgdGFibGUgKi8KLQotICAgICAgICAvKiBhbGxvY2F0ZSBuZXcgdGFibGUgKi8KLSAgICAgICAgaWYgKCpobiArIHogPiBNQU5ZKSAgICAgLyogKG5vdGU6IGRvZXNuJ3QgbWF0dGVyIGZvciBmaXhlZCkgKi8KLSAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOyAgLyogb3ZlcmZsb3cgb2YgTUFOWSAqLwotICAgICAgICB1W2hdID0gcSA9IGhwICsgKmhuOwotICAgICAgICAqaG4gKz0gejsKLQotICAgICAgICAvKiBjb25uZWN0IHRvIGxhc3QgdGFibGUsIGlmIHRoZXJlIGlzIG9uZSAqLwotICAgICAgICBpZiAoaCkKLSAgICAgICAgewotICAgICAgICAgIHhbaF0gPSBpOyAgICAgICAgICAgICAvKiBzYXZlIHBhdHRlcm4gZm9yIGJhY2tpbmcgdXAgKi8KLSAgICAgICAgICByLmJpdHMgPSAoQnl0ZSlsOyAgICAgLyogYml0cyB0byBkdW1wIGJlZm9yZSB0aGlzIHRhYmxlICovCi0gICAgICAgICAgci5leG9wID0gKEJ5dGUpajsgICAgIC8qIGJpdHMgaW4gdGhpcyB0YWJsZSAqLwotICAgICAgICAgIGogPSBpID4+ICh3IC0gbCk7Ci0gICAgICAgICAgci5iYXNlID0gKHVJbnQpKHEgLSB1W2gtMV0gLSBqKTsgICAvKiBvZmZzZXQgdG8gdGhpcyB0YWJsZSAqLwotICAgICAgICAgIHVbaC0xXVtqXSA9IHI7ICAgICAgICAvKiBjb25uZWN0IHRvIGxhc3QgdGFibGUgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgKnQgPSBxOyAgICAgICAgICAgICAgIC8qIGZpcnN0IHRhYmxlIGlzIHJldHVybmVkIHJlc3VsdCAqLwotICAgICAgfQotCi0gICAgICAvKiBzZXQgdXAgdGFibGUgZW50cnkgaW4gciAqLwotICAgICAgci5iaXRzID0gKEJ5dGUpKGsgLSB3KTsKLSAgICAgIGlmIChwID49IHYgKyBuKQotICAgICAgICByLmV4b3AgPSAxMjggKyA2NDsgICAgICAvKiBvdXQgb2YgdmFsdWVzLS1pbnZhbGlkIGNvZGUgKi8KLSAgICAgIGVsc2UgaWYgKCpwIDwgcykKLSAgICAgIHsKLSAgICAgICAgci5leG9wID0gKEJ5dGUpKCpwIDwgMjU2ID8gMCA6IDMyICsgNjQpOyAgICAgLyogMjU2IGlzIGVuZC1vZi1ibG9jayAqLwotICAgICAgICByLmJhc2UgPSAqcCsrOyAgICAgICAgICAvKiBzaW1wbGUgY29kZSBpcyBqdXN0IHRoZSB2YWx1ZSAqLwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByLmV4b3AgPSAoQnl0ZSkoZVsqcCAtIHNdICsgMTYgKyA2NCk7Lyogbm9uLXNpbXBsZS0tbG9vayB1cCBpbiBsaXN0cyAqLwotICAgICAgICByLmJhc2UgPSBkWypwKysgLSBzXTsKLSAgICAgIH0KLQotICAgICAgLyogZmlsbCBjb2RlLWxpa2UgZW50cmllcyB3aXRoIHIgKi8KLSAgICAgIGYgPSAxIDw8IChrIC0gdyk7Ci0gICAgICBmb3IgKGogPSBpID4+IHc7IGogPCB6OyBqICs9IGYpCi0gICAgICAgIHFbal0gPSByOwotCi0gICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBrLWJpdCBjb2RlIGkgKi8KLSAgICAgIGZvciAoaiA9IDEgPDwgKGsgLSAxKTsgaSAmIGo7IGogPj49IDEpCi0gICAgICAgIGkgXj0gajsKLSAgICAgIGkgXj0gajsKLQotICAgICAgLyogYmFja3VwIG92ZXIgZmluaXNoZWQgdGFibGVzICovCi0gICAgICBtYXNrID0gKDEgPDwgdykgLSAxOyAgICAgIC8qIG5lZWRlZCBvbiBIUCwgY2MgLU8gYnVnICovCi0gICAgICB3aGlsZSAoKGkgJiBtYXNrKSAhPSB4W2hdKQotICAgICAgewotICAgICAgICBoLS07ICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBuZWVkIHRvIHVwZGF0ZSBxICovCi0gICAgICAgIHcgLT0gbDsKLSAgICAgICAgbWFzayA9ICgxIDw8IHcpIC0gMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIFJldHVybiBaX0JVRl9FUlJPUiBpZiB3ZSB3ZXJlIGdpdmVuIGFuIGluY29tcGxldGUgdGFibGUgKi8KLSAgcmV0dXJuIHkgIT0gMCAmJiBnICE9IDEgPyBaX0JVRl9FUlJPUiA6IFpfT0s7Ci19Ci0KLQotbG9jYWwgaW50IGluZmxhdGVfdHJlZXNfYml0cyggLyogYywgYmIsIHRiLCBocCwgeikgKi8KLXVJbnRmICpjLCAgICAgICAgICAgICAgIC8qIDE5IGNvZGUgbGVuZ3RocyAqLwotdUludGYgKmJiLCAgICAgICAgICAgICAgLyogYml0cyB0cmVlIGRlc2lyZWQvYWN0dWFsIGRlcHRoICovCi1pbmZsYXRlX2h1ZnQgKiBGQVIgKnRiLCAvKiBiaXRzIHRyZWUgcmVzdWx0ICovCi1pbmZsYXRlX2h1ZnQgKmhwLCAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KLXpfc3RyZWFtcCB6ICAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLwotKQotewotICBpbnQgcjsKLSAgdUludCBobiA9IDA7ICAgICAgICAgIC8qIGh1ZnRzIHVzZWQgaW4gc3BhY2UgKi8KLSAgdUludGYgKnY7ICAgICAgICAgICAgIC8qIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAqLwotCi0gIGlmICgodiA9ICh1SW50ZiopWkFMTE9DKHosIDE5LCBzaXplb2YodUludCkpKSA9PSBaX05VTEwpCi0gICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICByID0gaHVmdF9idWlsZChjLCAxOSwgMTksICh1SW50ZiopWl9OVUxMLCAodUludGYqKVpfTlVMTCwKLSAgICAgICAgICAgICAgICAgdGIsIGJiLCBocCwgJmhuLCB2KTsKLSAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgZHluYW1pYyBiaXQgbGVuZ3RocyB0cmVlIjsKLSAgZWxzZSBpZiAociA9PSBaX0JVRl9FUlJPUiB8fCAqYmIgPT0gMCkKLSAgewotICAgIHotPm1zZyA9IChjaGFyKikiaW5jb21wbGV0ZSBkeW5hbWljIGJpdCBsZW5ndGhzIHRyZWUiOwotICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gIH0KLSAgWkZSRUUoeiwgdik7Ci0gIHJldHVybiByOwotfQotCi0KLWxvY2FsIGludCBpbmZsYXRlX3RyZWVzX2R5bmFtaWMoIC8qIG5sLCBuZCwgYywgYmwsIGJkLCB0bCwgdGQsIGhwLCB6KSAqLwotdUludCBubCwgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCi11SW50IG5kLCAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KLXVJbnRmICpjLCAgICAgICAgICAgICAgIC8qIHRoYXQgbWFueSAodG90YWwpIGNvZGUgbGVuZ3RocyAqLwotdUludGYgKmJsLCAgICAgICAgICAgICAgLyogbGl0ZXJhbCBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KLXVJbnRmICpiZCwgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotaW5mbGF0ZV9odWZ0ICogRkFSICp0bCwgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KLWluZmxhdGVfaHVmdCAqIEZBUiAqdGQsIC8qIGRpc3RhbmNlIHRyZWUgcmVzdWx0ICovCi1pbmZsYXRlX2h1ZnQgKmhwLCAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KLXpfc3RyZWFtcCB6ICAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLwotKQotewotICBpbnQgcjsKLSAgdUludCBobiA9IDA7ICAgICAgICAgIC8qIGh1ZnRzIHVzZWQgaW4gc3BhY2UgKi8KLSAgdUludGYgKnY7ICAgICAgICAgICAgIC8qIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAqLwotCi0gIC8qIGFsbG9jYXRlIHdvcmsgYXJlYSAqLwotICBpZiAoKHYgPSAodUludGYqKVpBTExPQyh6LCAyODgsIHNpemVvZih1SW50KSkpID09IFpfTlVMTCkKLSAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0KLSAgLyogYnVpbGQgbGl0ZXJhbC9sZW5ndGggdHJlZSAqLwotICByID0gaHVmdF9idWlsZChjLCBubCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgdGwsIGJsLCBocCwgJmhuLCB2KTsKLSAgaWYgKHIgIT0gWl9PSyB8fCAqYmwgPT0gMCkKLSAgewotICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKLSAgICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgbGl0ZXJhbC9sZW5ndGggdHJlZSI7Ci0gICAgZWxzZSBpZiAociAhPSBaX01FTV9FUlJPUikKLSAgICB7Ci0gICAgICB6LT5tc2cgPSAoY2hhciopImluY29tcGxldGUgbGl0ZXJhbC9sZW5ndGggdHJlZSI7Ci0gICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgIH0KLSAgICBaRlJFRSh6LCB2KTsKLSAgICByZXR1cm4gcjsKLSAgfQotCi0gIC8qIGJ1aWxkIGRpc3RhbmNlIHRyZWUgKi8KLSAgciA9IGh1ZnRfYnVpbGQoYyArIG5sLCBuZCwgMCwgY3BkaXN0LCBjcGRleHQsIHRkLCBiZCwgaHAsICZobiwgdik7Ci0gIGlmIChyICE9IFpfT0sgfHwgKCpiZCA9PSAwICYmIG5sID4gMjU3KSkKLSAgewotICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKLSAgICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgZGlzdGFuY2UgdHJlZSI7Ci0gICAgZWxzZSBpZiAociA9PSBaX0JVRl9FUlJPUikgewotI2lmIDAKLSAgICB7Ci0jZW5kaWYKLSNpZmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAotICAgICAgciA9IFpfT0s7Ci0gICAgfQotI2Vsc2UKLSAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb21wbGV0ZSBkaXN0YW5jZSB0cmVlIjsKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgfQotICAgIGVsc2UgaWYgKHIgIT0gWl9NRU1fRVJST1IpCi0gICAgewotICAgICAgei0+bXNnID0gKGNoYXIqKSJlbXB0eSBkaXN0YW5jZSB0cmVlIHdpdGggbGVuZ3RocyI7Ci0gICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgIH0KLSAgICBaRlJFRSh6LCB2KTsKLSAgICByZXR1cm4gcjsKLSNlbmRpZgotICB9Ci0KLSAgLyogZG9uZSAqLwotICBaRlJFRSh6LCB2KTsKLSAgcmV0dXJuIFpfT0s7Ci19Ci0KLQotLyogYnVpbGQgZml4ZWQgdGFibGVzIG9ubHkgb25jZS0ta2VlcCB0aGVtIGhlcmUgKi8KLSNpZmRlZiBCVUlMREZJWEVECi1sb2NhbCBpbnQgZml4ZWRfYnVpbHQgPSAwOwotI2RlZmluZSBGSVhFREggNTQ0ICAgICAgLyogbnVtYmVyIG9mIGh1ZnRzIHVzZWQgYnkgZml4ZWQgdGFibGVzICovCi1sb2NhbCBpbmZsYXRlX2h1ZnQgZml4ZWRfbWVtW0ZJWEVESF07Ci1sb2NhbCB1SW50IGZpeGVkX2JsOwotbG9jYWwgdUludCBmaXhlZF9iZDsKLWxvY2FsIGluZmxhdGVfaHVmdCAqZml4ZWRfdGw7Ci1sb2NhbCBpbmZsYXRlX2h1ZnQgKmZpeGVkX3RkOwotI2Vsc2UKLSNpbmNsdWRlICJpbmZmaXhlZC5oIgotI2VuZGlmCi0KLQotbG9jYWwgaW50IGluZmxhdGVfdHJlZXNfZml4ZWQoIC8qIGJsLCBiZCwgdGwsIHRkLCB6KSAqLwotdUludGYgKmJsLCAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotdUludGYgKmJkLCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KLWNvbnN0IGluZmxhdGVfaHVmdCAqIEZBUiAqdGwsICAgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KLWNvbnN0IGluZmxhdGVfaHVmdCAqIEZBUiAqdGQsICAgLyogZGlzdGFuY2UgdHJlZSByZXN1bHQgKi8KLXpfc3RyZWFtcCB6ICAgICAgICAgICAgICAgICAgICAgLyogZm9yIG1lbW9yeSBhbGxvY2F0aW9uICovCi0pCi17Ci0jaWZkZWYgQlVJTERGSVhFRAotICAvKiBidWlsZCBmaXhlZCB0YWJsZXMgaWYgbm90IGFscmVhZHkgKi8KLSAgaWYgKCFmaXhlZF9idWlsdCkKLSAgewotICAgIGludCBrOyAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCi0gICAgdUludCBmID0gMDsgICAgICAgICAvKiBudW1iZXIgb2YgaHVmdHMgdXNlZCBpbiBmaXhlZF9tZW0gKi8KLSAgICB1SW50ZiAqYzsgICAgICAgICAgIC8qIGxlbmd0aCBsaXN0IGZvciBodWZ0X2J1aWxkICovCi0gICAgdUludGYgKnY7ICAgICAgICAgICAvKiB3b3JrIGFyZWEgZm9yIGh1ZnRfYnVpbGQgKi8KLQotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGlmICgoYyA9ICh1SW50ZiopWkFMTE9DKHosIDI4OCwgc2l6ZW9mKHVJbnQpKSkgPT0gWl9OVUxMKQotICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIGlmICgodiA9ICh1SW50ZiopWkFMTE9DKHosIDI4OCwgc2l6ZW9mKHVJbnQpKSkgPT0gWl9OVUxMKQotICAgIHsKLSAgICAgIFpGUkVFKHosIGMpOwotICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIH0KLQotICAgIC8qIGxpdGVyYWwgdGFibGUgKi8KLSAgICBmb3IgKGsgPSAwOyBrIDwgMTQ0OyBrKyspCi0gICAgICBjW2tdID0gODsKLSAgICBmb3IgKDsgayA8IDI1NjsgaysrKQotICAgICAgY1trXSA9IDk7Ci0gICAgZm9yICg7IGsgPCAyODA7IGsrKykKLSAgICAgIGNba10gPSA3OwotICAgIGZvciAoOyBrIDwgMjg4OyBrKyspCi0gICAgICBjW2tdID0gODsKLSAgICBmaXhlZF9ibCA9IDk7Ci0gICAgaHVmdF9idWlsZChjLCAyODgsIDI1NywgY3BsZW5zLCBjcGxleHQsICZmaXhlZF90bCwgJmZpeGVkX2JsLAotICAgICAgICAgICAgICAgZml4ZWRfbWVtLCAmZiwgdik7Ci0KLSAgICAvKiBkaXN0YW5jZSB0YWJsZSAqLwotICAgIGZvciAoayA9IDA7IGsgPCAzMDsgaysrKQotICAgICAgY1trXSA9IDU7Ci0gICAgZml4ZWRfYmQgPSA1OwotICAgIGh1ZnRfYnVpbGQoYywgMzAsIDAsIGNwZGlzdCwgY3BkZXh0LCAmZml4ZWRfdGQsICZmaXhlZF9iZCwKLSAgICAgICAgICAgICAgIGZpeGVkX21lbSwgJmYsIHYpOwotCi0gICAgLyogZG9uZSAqLwotICAgIFpGUkVFKHosIHYpOwotICAgIFpGUkVFKHosIGMpOwotICAgIGZpeGVkX2J1aWx0ID0gMTsKLSAgfQotI2Vsc2UKLSAgRlRfVU5VU0VEKHopOwotI2VuZGlmCi0gICpibCA9IGZpeGVkX2JsOwotICAqYmQgPSBmaXhlZF9iZDsKLSAgKnRsID0gZml4ZWRfdGw7Ci0gICp0ZCA9IGZpeGVkX3RkOwotICByZXR1cm4gWl9PSzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9nemlwL2luZnRyZWVzLmggYi9zcmMvZ3ppcC9pbmZ0cmVlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JmMmFhLi4wMDAwMDAwCi0tLSBhL3NyYy9nemlwL2luZnRyZWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBpbmZ0cmVlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mdHJlZXMuYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBIdWZmbWFuIGNvZGUgbG9va3VwIHRhYmxlIGVudHJ5LS10aGlzIGVudHJ5IGlzIGZvdXIgYnl0ZXMgZm9yIG1hY2hpbmVzCi0gICB0aGF0IGhhdmUgMTYtYml0IHBvaW50ZXJzIChlLmcuIFBDJ3MgaW4gdGhlIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCkuICovCi0KLSNpZm5kZWYgX0lORlRSRUVTX0gKLSNkZWZpbmUgX0lORlRSRUVTX0gKLQotdHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9odWZ0X3MgRkFSIGluZmxhdGVfaHVmdDsKLQotc3RydWN0IGluZmxhdGVfaHVmdF9zIHsKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBCeXRlIEV4b3A7ICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KLSAgICAgIEJ5dGUgQml0czsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBzdWJjb2RlICovCi0gICAgfSB3aGF0OwotICAgIHVJbnQgcGFkOyAgICAgICAgICAgLyogcGFkIHN0cnVjdHVyZSB0byBhIHBvd2VyIG9mIDIgKDQgYnl0ZXMgZm9yICovCi0gIH0gd29yZDsgICAgICAgICAgICAgICAvKiAgMTYtYml0LCA4IGJ5dGVzIGZvciAzMi1iaXQgaW50J3MpICovCi0gIHVJbnQgYmFzZTsgICAgICAgICAgICAvKiBsaXRlcmFsLCBsZW5ndGggYmFzZSwgZGlzdGFuY2UgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRhYmxlIG9mZnNldCAqLwotfTsKLQotLyogTWF4aW11bSBzaXplIG9mIGR5bmFtaWMgdHJlZS4gIFRoZSBtYXhpbXVtIGZvdW5kIGluIGEgbG9uZyBidXQgbm9uLQotICAgZXhoYXVzdGl2ZSBzZWFyY2ggd2FzIDEwMDQgaHVmdCBzdHJ1Y3R1cmVzICg4NTAgZm9yIGxlbmd0aC9saXRlcmFscwotICAgYW5kIDE1NCBmb3IgZGlzdGFuY2VzLCB0aGUgbGF0dGVyIGFjdHVhbGx5IHRoZSByZXN1bHQgb2YgYW4KLSAgIGV4aGF1c3RpdmUgc2VhcmNoKS4gIFRoZSBhY3R1YWwgbWF4aW11bSBpcyBub3Qga25vd24sIGJ1dCB0aGUKLSAgIHZhbHVlIGJlbG93IGlzIG1vcmUgdGhhbiBzYWZlLiAqLwotI2RlZmluZSBNQU5ZIDE0NDAKLQotbG9jYWwgIGludCBpbmZsYXRlX3RyZWVzX2JpdHMgT0YoKAotICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiAxOSBjb2RlIGxlbmd0aHMgKi8KLSAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogYml0cyB0cmVlIGRlc2lyZWQvYWN0dWFsIGRlcHRoICovCi0gICAgaW5mbGF0ZV9odWZ0ICogRkFSICosICAgICAgIC8qIGJpdHMgdHJlZSByZXN1bHQgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiwgICAgICAgICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCi0gICAgel9zdHJlYW1wKSk7ICAgICAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLwotCi1sb2NhbCAgaW50IGluZmxhdGVfdHJlZXNfZHluYW1pYyBPRigoCi0gICAgdUludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLwotICAgIHVJbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KLSAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogdGhhdCBtYW55ICh0b3RhbCkgY29kZSBsZW5ndGhzICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqLCAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLwotICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqLCAgICAgICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotICAgIGluZmxhdGVfaHVmdCAqLCAgICAgICAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KLSAgICB6X3N0cmVhbXApKTsgICAgICAgICAgICAgICAgLyogZm9yIG1lc3NhZ2VzICovCi0KLWxvY2FsICBpbnQgaW5mbGF0ZV90cmVlc19maXhlZCBPRigoCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi0gICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotICAgIGNvbnN0IGluZmxhdGVfaHVmdCAqIEZBUiAqLCAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLwotICAgIGNvbnN0IGluZmxhdGVfaHVmdCAqIEZBUiAqLCAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotICAgIHpfc3RyZWFtcCkpOyAgICAgICAgICAgICAgICAvKiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKi8KLQotI2VuZGlmIC8qIF9JTkZUUkVFU19IICovCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC9pbmZ1dGlsLmMgYi9zcmMvZ3ppcC9pbmZ1dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwODdiNDAuLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvaW5mdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogaW5mbGF0ZV91dGlsLmMgLS0gZGF0YSBhbmQgcm91dGluZXMgY29tbW9uIHRvIGJsb2NrcyBhbmQgY29kZXMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZibG9jay5oIgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0jaW5jbHVkZSAiaW5mY29kZXMuaCIKLSNpbmNsdWRlICJpbmZ1dGlsLmgiCi0KLQotLyogQW5kJ2luZyB3aXRoIG1hc2tbbl0gbWFza3MgdGhlIGxvd2VyIG4gYml0cyAqLwotbG9jYWwgY29uc3QgdUludCBpbmZsYXRlX21hc2tbMTddID0gewotICAgIDB4MDAwMCwKLSAgICAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMGYsIDB4MDAxZiwgMHgwMDNmLCAweDAwN2YsIDB4MDBmZiwKLSAgICAweDAxZmYsIDB4MDNmZiwgMHgwN2ZmLCAweDBmZmYsIDB4MWZmZiwgMHgzZmZmLCAweDdmZmYsIDB4ZmZmZgotfTsKLQotCi0vKiBjb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgc2xpZGluZyB3aW5kb3cgdG8gdGhlIG91dHB1dCBhcmVhICovCi1sb2NhbCBpbnQgaW5mbGF0ZV9mbHVzaCggLyogcywgeiwgcikgKi8KLWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKLXpfc3RyZWFtcCB6LAotaW50IHIgKQotewotICB1SW50IG47Ci0gIEJ5dGVmICpwOwotICBCeXRlZiAqcTsKLQotICAvKiBsb2NhbCBjb3BpZXMgb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVycyAqLwotICBwID0gei0+bmV4dF9vdXQ7Ci0gIHEgPSBzLT5yZWFkOwotCi0gIC8qIGNvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgYXMgZmFyIGFzIGVuZCBvZiB3aW5kb3cgKi8KLSAgbiA9ICh1SW50KSgocSA8PSBzLT53cml0ZSA/IHMtPndyaXRlIDogcy0+ZW5kKSAtIHEpOwotICBpZiAobiA+IHotPmF2YWlsX291dCkgbiA9IHotPmF2YWlsX291dDsKLSAgaWYgKG4gJiYgciA9PSBaX0JVRl9FUlJPUikgciA9IFpfT0s7Ci0KLSAgLyogdXBkYXRlIGNvdW50ZXJzICovCi0gIHotPmF2YWlsX291dCAtPSBuOwotICB6LT50b3RhbF9vdXQgKz0gbjsKLQotICAvKiB1cGRhdGUgY2hlY2sgaW5mb3JtYXRpb24gKi8KLSAgaWYgKHMtPmNoZWNrZm4gIT0gWl9OVUxMKQotICAgIHotPmFkbGVyID0gcy0+Y2hlY2sgPSAoKnMtPmNoZWNrZm4pKHMtPmNoZWNrLCBxLCBuKTsKLQotICAvKiBjb3B5IGFzIGZhciBhcyBlbmQgb2Ygd2luZG93ICovCi0gIHptZW1jcHkocCwgcSwgbik7Ci0gIHAgKz0gbjsKLSAgcSArPSBuOwotCi0gIC8qIHNlZSBpZiBtb3JlIHRvIGNvcHkgYXQgYmVnaW5uaW5nIG9mIHdpbmRvdyAqLwotICBpZiAocSA9PSBzLT5lbmQpCi0gIHsKLSAgICAvKiB3cmFwIHBvaW50ZXJzICovCi0gICAgcSA9IHMtPndpbmRvdzsKLSAgICBpZiAocy0+d3JpdGUgPT0gcy0+ZW5kKQotICAgICAgcy0+d3JpdGUgPSBzLT53aW5kb3c7Ci0KLSAgICAvKiBjb21wdXRlIGJ5dGVzIHRvIGNvcHkgKi8KLSAgICBuID0gKHVJbnQpKHMtPndyaXRlIC0gcSk7Ci0gICAgaWYgKG4gPiB6LT5hdmFpbF9vdXQpIG4gPSB6LT5hdmFpbF9vdXQ7Ci0gICAgaWYgKG4gJiYgciA9PSBaX0JVRl9FUlJPUikgciA9IFpfT0s7Ci0KLSAgICAvKiB1cGRhdGUgY291bnRlcnMgKi8KLSAgICB6LT5hdmFpbF9vdXQgLT0gbjsKLSAgICB6LT50b3RhbF9vdXQgKz0gbjsKLQotICAgIC8qIHVwZGF0ZSBjaGVjayBpbmZvcm1hdGlvbiAqLwotICAgIGlmIChzLT5jaGVja2ZuICE9IFpfTlVMTCkKLSAgICAgIHotPmFkbGVyID0gcy0+Y2hlY2sgPSAoKnMtPmNoZWNrZm4pKHMtPmNoZWNrLCBxLCBuKTsKLQotICAgIC8qIGNvcHkgKi8KLSAgICB6bWVtY3B5KHAsIHEsIG4pOwotICAgIHAgKz0gbjsKLSAgICBxICs9IG47Ci0gIH0KLQotICAvKiB1cGRhdGUgcG9pbnRlcnMgKi8KLSAgei0+bmV4dF9vdXQgPSBwOwotICBzLT5yZWFkID0gcTsKLQotICAvKiBkb25lICovCi0gIHJldHVybiByOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvaW5mdXRpbC5oIGIvc3JjL2d6aXAvaW5mdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTc0YjZkLi4wMDAwMDAwCi0tLSBhL3NyYy9nemlwL2luZnV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qIGluZnV0aWwuaCAtLSB0eXBlcyBhbmQgbWFjcm9zIGNvbW1vbiB0byBibG9ja3MgYW5kIGNvZGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLSNpZm5kZWYgX0lORlVUSUxfSAotI2RlZmluZSBfSU5GVVRJTF9ICi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgICBUWVBFLCAgICAgLyogZ2V0IHR5cGUgYml0cyAoMywgaW5jbHVkaW5nIGVuZCBiaXQpICovCi0gICAgICBMRU5TLCAgICAgLyogZ2V0IGxlbmd0aHMgZm9yIHN0b3JlZCAqLwotICAgICAgU1RPUkVELCAgIC8qIHByb2Nlc3Npbmcgc3RvcmVkIGJsb2NrICovCi0gICAgICBUQUJMRSwgICAgLyogZ2V0IHRhYmxlIGxlbmd0aHMgKi8KLSAgICAgIEJUUkVFLCAgICAvKiBnZXQgYml0IGxlbmd0aHMgdHJlZSBmb3IgYSBkeW5hbWljIGJsb2NrICovCi0gICAgICBEVFJFRSwgICAgLyogZ2V0IGxlbmd0aCwgZGlzdGFuY2UgdHJlZXMgZm9yIGEgZHluYW1pYyBibG9jayAqLwotICAgICAgQ09ERVMsICAgIC8qIHByb2Nlc3NpbmcgZml4ZWQgb3IgZHluYW1pYyBibG9jayAqLwotICAgICAgRFJZLCAgICAgIC8qIG91dHB1dCByZW1haW5pbmcgd2luZG93IGJ5dGVzICovCi0gICAgICBET05FLCAgICAgLyogZmluaXNoZWQgbGFzdCBibG9jaywgZG9uZSAqLwotICAgICAgQkFEfSAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3ItLXN0dWNrIGhlcmUgKi8KLWluZmxhdGVfYmxvY2tfbW9kZTsKLQotLyogaW5mbGF0ZSBibG9ja3Mgc2VtaS1wcml2YXRlIHN0YXRlICovCi1zdHJ1Y3QgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgewotCi0gIC8qIG1vZGUgKi8KLSAgaW5mbGF0ZV9ibG9ja19tb2RlICBtb2RlOyAgICAgLyogY3VycmVudCBpbmZsYXRlX2Jsb2NrIG1vZGUgKi8KLQotICAvKiBtb2RlIGRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICB1bmlvbiB7Ci0gICAgdUludCBsZWZ0OyAgICAgICAgICAvKiBpZiBTVE9SRUQsIGJ5dGVzIGxlZnQgdG8gY29weSAqLwotICAgIHN0cnVjdCB7Ci0gICAgICB1SW50IHRhYmxlOyAgICAgICAgICAgICAgIC8qIHRhYmxlIGxlbmd0aHMgKDE0IGJpdHMpICovCi0gICAgICB1SW50IGluZGV4OyAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gYmxlbnMgKG9yIGJvcmRlcikgKi8KLSAgICAgIHVJbnRmICpibGVuczsgICAgICAgICAgICAgLyogYml0IGxlbmd0aHMgb2YgY29kZXMgKi8KLSAgICAgIHVJbnQgYmI7ICAgICAgICAgICAgICAgICAgLyogYml0IGxlbmd0aCB0cmVlIGRlcHRoICovCi0gICAgICBpbmZsYXRlX2h1ZnQgKnRiOyAgICAgICAgIC8qIGJpdCBsZW5ndGggZGVjb2RpbmcgdHJlZSAqLwotICAgIH0gdHJlZXM7ICAgICAgICAgICAgLyogaWYgRFRSRUUsIGRlY29kaW5nIGluZm8gZm9yIHRyZWVzICovCi0gICAgc3RydWN0IHsKLSAgICAgIGluZmxhdGVfY29kZXNfc3RhdGVmCi0gICAgICAgICAqY29kZXM7Ci0gICAgfSBkZWNvZGU7ICAgICAgICAgICAvKiBpZiBDT0RFUywgY3VycmVudCBzdGF0ZSAqLwotICB9IHN1YjsgICAgICAgICAgICAgICAgLyogc3VibW9kZSAqLwotICB1SW50IGxhc3Q7ICAgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICB1SW50IGJpdGs7ICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCi0gIHVMb25nIGJpdGI7ICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIGluZmxhdGVfaHVmdCAqaHVmdHM7ICAvKiBzaW5nbGUgbWFsbG9jIGZvciB0cmVlIHNwYWNlICovCi0gIEJ5dGVmICp3aW5kb3c7ICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLwotICBCeXRlZiAqZW5kOyAgICAgICAgICAgLyogb25lIGJ5dGUgYWZ0ZXIgc2xpZGluZyB3aW5kb3cgKi8KLSAgQnl0ZWYgKnJlYWQ7ICAgICAgICAgIC8qIHdpbmRvdyByZWFkIHBvaW50ZXIgKi8KLSAgQnl0ZWYgKndyaXRlOyAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBwb2ludGVyICovCi0gIGNoZWNrX2Z1bmMgY2hlY2tmbjsgICAvKiBjaGVjayBmdW5jdGlvbiAqLwotICB1TG9uZyBjaGVjazsgICAgICAgICAgLyogY2hlY2sgb24gb3V0cHV0ICovCi0KLX07Ci0KLQotLyogZGVmaW5lcyBmb3IgaW5mbGF0ZSBpbnB1dC9vdXRwdXQgKi8KLS8qICAgdXBkYXRlIHBvaW50ZXJzIGFuZCByZXR1cm4gKi8KLSNkZWZpbmUgVVBEQklUUyB7cy0+Yml0Yj1iO3MtPmJpdGs9azt9Ci0jZGVmaW5lIFVQRElOIHt6LT5hdmFpbF9pbj1uO3otPnRvdGFsX2luKz1wLXotPm5leHRfaW47ei0+bmV4dF9pbj1wO30KLSNkZWZpbmUgVVBET1VUIHtzLT53cml0ZT1xO30KLSNkZWZpbmUgVVBEQVRFIHtVUERCSVRTIFVQRElOIFVQRE9VVH0KLSNkZWZpbmUgTEVBVkUge1VQREFURSByZXR1cm4gaW5mbGF0ZV9mbHVzaChzLHoscik7fQotLyogICBnZXQgYnl0ZXMgYW5kIGJpdHMgKi8KLSNkZWZpbmUgTE9BRElOIHtwPXotPm5leHRfaW47bj16LT5hdmFpbF9pbjtiPXMtPmJpdGI7az1zLT5iaXRrO30KLSNkZWZpbmUgTkVFREJZVEUge2lmKG4pcj1aX09LO2Vsc2UgTEVBVkV9Ci0jZGVmaW5lIE5FWFRCWVRFIChuLS0sKnArKykKLSNkZWZpbmUgTkVFREJJVFMoaikge3doaWxlKGs8KGopKXtORUVEQllURTtifD0oKHVMb25nKU5FWFRCWVRFKTw8aztrKz04O319Ci0jZGVmaW5lIERVTVBCSVRTKGopIHtiPj49KGopO2stPShqKTt9Ci0vKiAgIG91dHB1dCBieXRlcyAqLwotI2RlZmluZSBXQVZBSUwgKHVJbnQpKHE8cy0+cmVhZD9zLT5yZWFkLXEtMTpzLT5lbmQtcSkKLSNkZWZpbmUgTE9BRE9VVCB7cT1zLT53cml0ZTttPSh1SW50KVdBVkFJTDt9Ci0jZGVmaW5lIFdSQVAge2lmKHE9PXMtPmVuZCYmcy0+cmVhZCE9cy0+d2luZG93KXtxPXMtPndpbmRvdzttPSh1SW50KVdBVkFJTDt9fQotI2RlZmluZSBGTFVTSCB7VVBET1VUIHI9aW5mbGF0ZV9mbHVzaChzLHoscik7IExPQURPVVR9Ci0jZGVmaW5lIE5FRURPVVQge2lmKG09PTApe1dSQVAgaWYobT09MCl7RkxVU0ggV1JBUCBpZihtPT0wKSBMRUFWRX19cj1aX09LO30KLSNkZWZpbmUgT1VUQllURShhKSB7KnErKz0oQnl0ZSkoYSk7bS0tO30KLS8qICAgbG9hZCBsb2NhbCBwb2ludGVycyAqLwotI2RlZmluZSBMT0FEIHtMT0FESU4gTE9BRE9VVH0KLQotLyogbWFza3MgZm9yIGxvd2VyIGJpdHMgKHNpemUgZ2l2ZW4gdG8gYXZvaWQgc2lsbHkgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrKSAqLwotI2lmbmRlZiBOT19JTkZMQVRFX01BU0sKLWxvY2FsIHVJbnQgaW5mbGF0ZV9tYXNrWzE3XTsKLSNlbmRpZgotCi0vKiBjb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgc2xpZGluZyB3aW5kb3cgdG8gdGhlIG91dHB1dCBhcmVhICovCi1sb2NhbCBpbnQgaW5mbGF0ZV9mbHVzaCBPRigoCi0gICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCi0gICAgel9zdHJlYW1wICwKLSAgICBpbnQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC9ydWxlcy5tayBiL3NyYy9nemlwL3J1bGVzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdkNWZhLi4wMDAwMDAwCi0tLSBhL3NyYy9nemlwL3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIEdaaXAgc3VwcG9ydCBjb25maWd1cmF0aW9uIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIGd6aXAgZHJpdmVyIGRpcmVjdG9yeQotIwotR1pJUF9ESVIgOj0gJChTUkNfRElSKS9nemlwCi0KLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotaWZlcSAoJChTWVNURU1fWkxJQiksKQotICBHWklQX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAkSSQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJChHWklQX0RJUikpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICQoSU5DTFVERV9GTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi1lbHNlCi0gIEdaSVBfQ09NUElMRSA6PSAkKENDKSAkKEFOU0lGTEFHUykgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICQoSU5DTFVERV9GTEFHUykgXAotICAgICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi1lbmRpZgotCi0KLSMgZ3ppcCBzdXBwb3J0IHNvdXJjZXMKLSMKLSMgQWxsIHNvdXJjZSBhbmQgaGVhZGVyIGZpbGVzIGdldCBsb2FkZWQgYnkgYGZ0Z3ppcC5jJyBvbmx5IGlmIFNZU1RFTV9aTElCCi0jIGlzIG5vdCBkZWZpbmVkIChyZWdhcmRsZXNzIHdoZXRoZXIgd2UgaGF2ZSBhIGBzaW5nbGUnIG9yIGEgYG11bHRpJyBidWlsZCkuCi0jIEhvd2V2ZXIsIGl0IGRvZXNuJ3QgaGFybSBpZiB3ZSBhZGQgZXZlcnl0aGluZyBhcyBhIGRlcGVuZGVuY3kKLSMgdW5jb25kaXRpb25hbGx5LgotIwotR1pJUF9EUlZfU1JDUyA6PSAkKEdaSVBfRElSKS9hZGxlcjMyLmMgIFwKLSAgICAgICAgICAgICAgICAgJChHWklQX0RJUikvZnR6Y29uZi5oICBcCi0gICAgICAgICAgICAgICAgICQoR1pJUF9ESVIpL2luZmJsb2NrLmMgXAotICAgICAgICAgICAgICAgICAkKEdaSVBfRElSKS9pbmZibG9jay5oIFwKLSAgICAgICAgICAgICAgICAgJChHWklQX0RJUikvaW5mY29kZXMuYyBcCi0gICAgICAgICAgICAgICAgICQoR1pJUF9ESVIpL2luZmNvZGVzLmggXAotICAgICAgICAgICAgICAgICAkKEdaSVBfRElSKS9pbmZmaXhlZC5oIFwKLSAgICAgICAgICAgICAgICAgJChHWklQX0RJUikvaW5mbGF0ZS5jICBcCi0gICAgICAgICAgICAgICAgICQoR1pJUF9ESVIpL2luZnRyZWVzLmMgXAotICAgICAgICAgICAgICAgICAkKEdaSVBfRElSKS9pbmZ0cmVlcy5oIFwKLSAgICAgICAgICAgICAgICAgJChHWklQX0RJUikvaW5mdXRpbC5jICBcCi0gICAgICAgICAgICAgICAgICQoR1pJUF9ESVIpL2luZnV0aWwuaCAgXAotICAgICAgICAgICAgICAgICAkKEdaSVBfRElSKS96bGliLmggICAgIFwKLSAgICAgICAgICAgICAgICAgJChHWklQX0RJUikvenV0aWwuYyAgICBcCi0gICAgICAgICAgICAgICAgICQoR1pJUF9ESVIpL3p1dGlsLmgKLQotCi0jIGd6aXAgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIEdaSVBfRFJWX09CSiBpcyB1c2VkIGR1cmluZyBib3RoIGBzaW5nbGUnIGFuZCBgbXVsdGknIGJ1aWxkcwotIwotR1pJUF9EUlZfT0JKIDo9ICQoT0JKX0RJUikvZnRnemlwLiRPCi0KLQotIyBnemlwIG1haW4gc291cmNlIGZpbGUKLSMKLUdaSVBfRFJWX1NSQyA6PSAkKEdaSVBfRElSKS9mdGd6aXAuYwotCi0KLSMgZ3ppcCBzdXBwb3J0IC0gb2JqZWN0Ci0jCi0kKEdaSVBfRFJWX09CSik6ICQoR1pJUF9EUlZfU1JDKSAkKEdaSVBfRFJWX1NSQ1MpICQoRlJFRVRZUEVfSCkKLQkkKEdaSVBfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQoR1pJUF9EUlZfU1JDKSkKLQotCi0jIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKLSMKLURSVl9PQkpTX1MgKz0gJChHWklQX0RSVl9PQkopCi1EUlZfT0JKU19NICs9ICQoR1pJUF9EUlZfT0JKKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC96bGliLmggYi9zcmMvZ3ppcC96bGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTgyYzYuLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvemxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsODMwICswLDAgQEAKLS8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQotICB2ZXJzaW9uIDEuMS40LCBNYXJjaCAxMXRoLCAyMDAyCi0KLSAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCi0gIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKLQotCi0gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCi0gIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQKLSAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4KLSovCi0KLSNpZm5kZWYgX1pMSUJfSAotI2RlZmluZSBfWkxJQl9ICi0KLSNpbmNsdWRlICJmdHpjb25mLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBaTElCX1ZFUlNJT04gIjEuMS40IgotCi0vKgotICAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAotICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZAotICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAotICAoZGVmbGF0aW9uKSBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUKLSAgc3RyZWFtIGludGVyZmFjZS4KLQotICAgICBDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZQotICBlbm91Z2ggKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksIG9yIGNhbiBiZSBkb25lIGJ5Ci0gIHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCi0gIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKLSAgKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KLQotICAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKLSAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLgotCi0gICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKLSAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgotICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgotKi8KLQotdHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7Ci10eXBlZGVmIHZvaWQgICAoKmZyZWVfZnVuYykgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgYWRkcmVzcykpOwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgewotICAgIEJ5dGVmICAgICpuZXh0X2luOyAgLyogbmV4dCBpbnB1dCBieXRlICovCi0gICAgdUludCAgICAgYXZhaWxfaW47ICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KLSAgICB1TG9uZyAgICB0b3RhbF9pbjsgIC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCi0KLSAgICBCeXRlZiAgICAqbmV4dF9vdXQ7IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLwotICAgIHVJbnQgICAgIGF2YWlsX291dDsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKi8KLSAgICB1TG9uZyAgICB0b3RhbF9vdXQ7IC8qIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KLQotICAgIGNoYXIgICAgICptc2c7ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLwotCi0gICAgYWxsb2NfZnVuYyB6YWxsb2M7ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIGZyZWVfZnVuYyAgemZyZWU7ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIHZvaWRwZiAgICAgb3BhcXVlOyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLwotCi0gICAgaW50ICAgICBkYXRhX3R5cGU7ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGFzY2lpIG9yIGJpbmFyeSAqLwotICAgIHVMb25nICAgYWRsZXI7ICAgICAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgICB1TG9uZyAgIHJlc2VydmVkOyAgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi19IHpfc3RyZWFtOwotCi10eXBlZGVmIHpfc3RyZWFtIEZBUiAqel9zdHJlYW1wOwotCi0vKgotICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luIHdoZW4gYXZhaWxfaW4gaGFzCi0gICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQKLSAgIGhhcyBkcm9wcGVkIHRvIHplcm8uIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQKLSAgIG9wYXF1ZSBiZWZvcmUgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZQotICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uCi0KLSAgIFRoZSBvcGFxdWUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAotICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiB6YWxsb2MgYW5kIHpmcmVlLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQotICAgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCi0gICBvcGFxdWUgdmFsdWUuCi0KLSAgIHphbGxvYyBtdXN0IHJldHVybiBaX05VTEwgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvYmplY3QuCi0gICBJZiB6bGliIGlzIHVzZWQgaW4gYSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbiwgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlCi0gICB0aHJlYWQgc2FmZS4KLQotICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKLSAgIGV4YWN0bHkgNjU1MzYgYnl0ZXMsIGJ1dCB3aWxsIG5vdCBiZSByZXF1aXJlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhpcwotICAgaWYgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gV0FSTklORzogT24gTVNET1MsCi0gICBwb2ludGVycyByZXR1cm5lZCBieSB6YWxsb2MgZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCoKLSAgIGhhdmUgdGhlaXIgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbgotICAgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5IGVuc3VyZXMgdGhpcyAoc2VlIHp1dGlsLmMpLiBUbyByZWR1Y2UgbWVtb3J5Ci0gICByZXF1aXJlbWVudHMgYW5kIGF2b2lkIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZgotICAgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgotCi0gICBUaGUgZmllbGRzIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IKLSAgIHByb2dyZXNzIHJlcG9ydHMuIEFmdGVyIGNvbXByZXNzaW9uLCB0b3RhbF9pbiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZgotICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yCi0gICAocGFydGljdWxhcmx5IGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluCi0gICBhIHNpbmdsZSBzdGVwKS4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLwotCi0jZGVmaW5lIFpfTk9fRkxVU0ggICAgICAwCi0jZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxIC8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIFpfU1lOQ19GTFVTSCBpbnN0ZWFkICovCi0jZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAyCi0jZGVmaW5lIFpfRlVMTF9GTFVTSCAgICAzCi0jZGVmaW5lIFpfRklOSVNIICAgICAgICA0Ci0vKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqLwotCi0jZGVmaW5lIFpfT0sgICAgICAgICAgICAwCi0jZGVmaW5lIFpfU1RSRUFNX0VORCAgICAxCi0jZGVmaW5lIFpfTkVFRF9ESUNUICAgICAyCi0jZGVmaW5lIFpfRVJSTk8gICAgICAgICgtMSkKLSNkZWZpbmUgWl9TVFJFQU1fRVJST1IgKC0yKQotI2RlZmluZSBaX0RBVEFfRVJST1IgICAoLTMpCi0jZGVmaW5lIFpfTUVNX0VSUk9SICAgICgtNCkKLSNkZWZpbmUgWl9CVUZfRVJST1IgICAgKC01KQotI2RlZmluZSBaX1ZFUlNJT05fRVJST1IgKC02KQotLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlCi0gKiB2YWx1ZXMgYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLgotICovCi0KLSNkZWZpbmUgWl9OT19DT01QUkVTU0lPTiAgICAgICAgIDAKLSNkZWZpbmUgWl9CRVNUX1NQRUVEICAgICAgICAgICAgIDEKLSNkZWZpbmUgWl9CRVNUX0NPTVBSRVNTSU9OICAgICAgIDkKLSNkZWZpbmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICAoLTEpCi0vKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KLQotI2RlZmluZSBaX0ZJTFRFUkVEICAgICAgICAgICAgMQotI2RlZmluZSBaX0hVRkZNQU5fT05MWSAgICAgICAgMgotI2RlZmluZSBaX0RFRkFVTFRfU1RSQVRFR1kgICAgMAotLyogY29tcHJlc3Npb24gc3RyYXRlZ3k7IHNlZSBkZWZsYXRlSW5pdDIoKSBiZWxvdyBmb3IgZGV0YWlscyAqLwotCi0jZGVmaW5lIFpfQklOQVJZICAgMAotI2RlZmluZSBaX0FTQ0lJICAgIDEKLSNkZWZpbmUgWl9VTktOT1dOICAyCi0vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lIFpfREVGTEFURUQgICA4Ci0vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uKSAqLwotCi0jZGVmaW5lIFpfTlVMTCAgMCAgLyogZm9yIGluaXRpYWxpemluZyB6YWxsb2MsIHpmcmVlLCBvcGFxdWUgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KLQotLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgotICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMKLSAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgIFRoaXMgY2hlY2sgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KLSAqLwotCi0vKgotWkVYVEVSTihpbnQpICBkZWZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCkpOwotCi0gICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGNvbXByZXNzaW9uLiBUaGUgZmllbGRzCi0gICB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4KLSAgIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGRlZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bwotICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCi0KLSAgICAgVGhlIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBvciBiZXR3ZWVuIDAgYW5kIDk6Ci0gICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdAotICAgYWxsICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4KLSAgIFpfREVGQVVMVF9DT01QUkVTU0lPTiByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZAotICAgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgotCi0gICAgIGRlZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwKLSAgIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMgaW5jb21wYXRpYmxlCi0gICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4KLSAgIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQgZG9lcyBub3QKLSAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCi0qLwotCi0KLS8qCi0gICAgZGVmbGF0ZSBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZSBzb21lCi0gIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCi0gIGZvcmNlZCB0byBmbHVzaC4KLQotICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCi0gIGZvbGxvd2luZyBhY3Rpb25zOgotCi0gIC0gQ29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KLSAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAotICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCi0gICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KLQotICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0Ci0gICAgYWNjb3JkaW5nbHkuIFRoaXMgYWN0aW9uIGlzIGZvcmNlZCBpZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIG5vbiB6ZXJvLgotICAgIEZvcmNpbmcgZmx1c2ggZnJlcXVlbnRseSBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8sIHNvIHRoaXMgcGFyYW1ldGVyCi0gICAgc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4gbmVjZXNzYXJ5IChpbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMpLgotICAgIFNvbWUgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCi0KLSAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAotICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKLSAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dAotICBzaG91bGQgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUKLSAgY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCi0gIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiBkZWZsYXRlKCkuIElmIGRlZmxhdGUgcmV0dXJucyBaX09LCi0gIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKLSAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCi0KLSAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX1NZTkNfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcwotICBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0IGlzIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBzbwotICB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAoSW4gcGFydGljdWxhcgotICBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4gcHJvdmlkZWQKLSAgYmVmb3JlIHRoZSBjYWxsLikgIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lIGNvbXByZXNzaW9uCi0gIGFsZ29yaXRobXMgYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCi0KLSAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9GVUxMX0ZMVVNILCBhbGwgb3V0cHV0IGlzIGZsdXNoZWQgYXMgd2l0aAotICBaX1NZTkNfRkxVU0gsIGFuZCB0aGUgY29tcHJlc3Npb24gc3RhdGUgaXMgcmVzZXQgc28gdGhhdCBkZWNvbXByZXNzaW9uIGNhbgotICByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZgotICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuIFVzaW5nIFpfRlVMTF9GTFVTSCB0b28gb2Z0ZW4gY2FuIHNlcmlvdXNseSBkZWdyYWRlCi0gIHRoZSBjb21wcmVzc2lvbi4KLQotICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCi0gIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKLSAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybwotICBhdmFpbF9vdXQpLgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9GSU5JU0gsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLAotICBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIGFuZCBkZWZsYXRlIHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgaWYgdGhlcmUKLSAgd2FzIGVub3VnaCBvdXRwdXQgc3BhY2U7IGlmIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfT0ssIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQotICBjYWxsZWQgYWdhaW4gd2l0aCBaX0ZJTklTSCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQgYXZhaWxfb3V0KSBidXQgbm8KLSAgbW9yZSBpbnB1dCBkYXRhLCB1bnRpbCBpdCByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yLiBBZnRlcgotICBkZWZsYXRlIGhhcyByZXR1cm5lZCBaX1NUUkVBTV9FTkQsIHRoZSBvbmx5IHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gdGhlCi0gIHN0cmVhbSBhcmUgZGVmbGF0ZVJlc2V0IG9yIGRlZmxhdGVFbmQuCi0KLSAgICBaX0ZJTklTSCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCBpZiBhbGwgdGhlIGNvbXByZXNzaW9uCi0gIGlzIHRvIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcC4gSW4gdGhpcyBjYXNlLCBhdmFpbF9vdXQgbXVzdCBiZSBhdCBsZWFzdAotICAwLjElIGxhcmdlciB0aGFuIGF2YWlsX2luIHBsdXMgMTIgYnl0ZXMuICBJZiBkZWZsYXRlIGRvZXMgbm90IHJldHVybgotICBaX1NUUkVBTV9FTkQsIHRoZW4gaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgotCi0gICAgZGVmbGF0ZSgpIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIGlucHV0IHJlYWQKLSAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9pbiBieXRlcykuCi0KLSAgICBkZWZsYXRlKCkgbWF5IHVwZGF0ZSBkYXRhX3R5cGUgaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0Ci0gIHRoZSBpbnB1dCBkYXRhIHR5cGUgKFpfQVNDSUkgb3IgWl9CSU5BUlkpLiBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAotICBiaW5hcnkuIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdAotICB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluIGFueSBtYW5uZXIuCi0KLSAgICBkZWZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAotICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgYWxsIGlucHV0IGhhcyBiZWVuCi0gIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCi0gIFpfRklOSVNIKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQotICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKLSAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuCi0qLwotCi0KLS8qCi0gICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCi0gICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55Ci0gICBwZW5kaW5nIG91dHB1dC4KLQotICAgICBkZWZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIHN0cmVhbSB3YXMgZnJlZWQKLSAgIHByZW1hdHVyZWx5IChzb21lIGlucHV0IG9yIG91dHB1dCB3YXMgZGlzY2FyZGVkKS4gSW4gdGhlIGVycm9yIGNhc2UsCi0gICBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQotICAgZGVhbGxvY2F0ZWQpLgotKi8KLQotCi0vKgotWkVYVEVSTihpbnQpICBpbmZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLQotICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiBUaGUgZmllbGRzCi0gICBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5Ci0gICB0aGUgY2FsbGVyLiBJZiBuZXh0X2luIGlzIG5vdCBaX05VTEwgYW5kIGF2YWlsX2luIGlzIGxhcmdlIGVub3VnaCAodGhlIGV4YWN0Ci0gICB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCBpbmZsYXRlSW5pdCBkZXRlcm1pbmVzIHRoZQotICAgY29tcHJlc3Npb24gbWV0aG9kIGZyb20gdGhlIHpsaWIgaGVhZGVyIGFuZCBhbGxvY2F0ZXMgYWxsIGRhdGEgc3RydWN0dXJlcwotICAgYWNjb3JkaW5nbHk7IG90aGVyd2lzZSB0aGUgYWxsb2NhdGlvbiB3aWxsIGJlIGRlZmVycmVkIHRvIHRoZSBmaXJzdCBjYWxsIG9mCi0gICBpbmZsYXRlLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgaW5mbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvCi0gICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLQotICAgICBpbmZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLiAgbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yCi0gICBtZXNzYWdlLiBpbmZsYXRlSW5pdCBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZwotICAgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZAotICAgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW5jaGFuZ2VkLikKLSovCi0KLQotWkVYVEVSTihpbnQpIGluZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKLS8qCi0gICAgaW5mbGF0ZSBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKLSAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgc29tZQotICBpbnRyb2R1Y2Ugc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KQotICBleGNlcHQgd2hlbiBmb3JjZWQgdG8gZmx1c2guCi0KLSAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gaW5mbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKLSAgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgLSBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCi0gICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKLSAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZwotICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgotCi0gIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKLSAgICBhY2NvcmRpbmdseS4gIGluZmxhdGUoKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgdW50aWwgdGhlcmUKLSAgICBpcyBubyBtb3JlIGlucHV0IGRhdGEgb3Igbm8gbW9yZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAoc2VlIGJlbG93Ci0gICAgYWJvdXQgdGhlIGZsdXNoIHBhcmFtZXRlcikuCi0KLSAgQmVmb3JlIHRoZSBjYWxsIG9mIGluZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAotICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKLSAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4KLSAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvcgotICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoCi0gIGNhbGwgb2YgaW5mbGF0ZSgpLiBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQKLSAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQotICBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBpbmZsYXRlIGZsdXNoZXMgYXMgbXVjaAotICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFRoZSBmbHVzaGluZyBiZWhhdmlvciBvZiBpbmZsYXRlIGlzCi0gIG5vdCBzcGVjaWZpZWQgZm9yIHZhbHVlcyBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIG90aGVyIHRoYW4gWl9TWU5DX0ZMVVNICi0gIGFuZCBaX0ZJTklTSCwgYnV0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQKLSAgYXMgcG9zc2libGUgYW55d2F5LgotCi0gICAgaW5mbGF0ZSgpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb3IgYW4KLSAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKLSAgKGEgc2luZ2xlIGNhbGwgb2YgaW5mbGF0ZSksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwotICBaX0ZJTklTSC4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKLSAgb3V0cHV0IGlzIGZsdXNoZWQ7IGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKLSAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAotICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKLSAgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgdXNlIG9mIFpfRklOSVNICi0gIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciByb3V0aW5lCi0gIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKSBjYWxsLgotCi0gICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeQotICBiZWxvdyksIGluZmxhdGUgc2V0cyBzdHJtLWFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIHRoZQotICBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlCi0gIGl0IHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZAotICBzbyBmYXIgKHRoYXQgaXMsIHRvdGFsX291dCBieXRlcykgYW5kIHJldHVybnMgWl9PSywgWl9TVFJFQU1fRU5EIG9yCi0gIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKQotICBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMiBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZQotICBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORCBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgotCi0gICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCi0gIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKLSAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQotICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcwotICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0Ci0gIGFkbGVyMzIgY2hlY2tzdW0pLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50Ci0gIChmb3IgZXhhbXBsZSBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90Ci0gIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gSW4gdGhlIFpfREFUQV9FUlJPUgotICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4gY2FsbCBpbmZsYXRlU3luYyB0byBsb29rIGZvciBhIGdvb2QKLSAgY29tcHJlc3Npb24gYmxvY2suCi0qLwotCi0KLVpFWFRFUk4oaW50KSAgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCi0gICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55Ci0gICBwZW5kaW5nIG91dHB1dC4KLQotICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCi0gICB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKLSAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgb25seSBpbiBzb21lIHNwZWNpYWwgYXBwbGljYXRpb25zLgotKi8KLQotLyoKLVpFWFRFUk4oaW50KSAgZGVmbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1lbUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc3RyYXRlZ3kpKTsKLQotICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gVGhlCi0gICBmaWVsZHMgbmV4dF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5Ci0gICB0aGUgY2FsbGVyLgotCi0gICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgotICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQotICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCi0gICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBMYXJnZXIgdmFsdWVzIG9mIHRoaXMgcGFyYW1ldGVyIHJlc3VsdCBpbiBiZXR0ZXIKLSAgIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYKLSAgIGRlZmxhdGVJbml0IGlzIHVzZWQgaW5zdGVhZC4KLQotICAgICBUaGUgbWVtTGV2ZWwgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZAotICAgZm9yIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4gbWVtTGV2ZWw9MSB1c2VzIG1pbmltdW0gbWVtb3J5IGJ1dAotICAgaXMgc2xvdyBhbmQgcmVkdWNlcyBjb21wcmVzc2lvbiByYXRpbzsgbWVtTGV2ZWw9OSB1c2VzIG1heGltdW0gbWVtb3J5Ci0gICBmb3Igb3B0aW1hbCBzcGVlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4gU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeQotICAgdXNhZ2UgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4KLQotICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlCi0gICB2YWx1ZSBaX0RFRkFVTFRfU1RSQVRFR1kgZm9yIG5vcm1hbCBkYXRhLCBaX0ZJTFRFUkVEIGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKLSAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgb3IgWl9IVUZGTUFOX09OTFkgdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubwotICAgc3RyaW5nIG1hdGNoKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEKLSAgIHNvbWV3aGF0IHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcwotICAgdHVuZWQgdG8gY29tcHJlc3MgdGhlbSBiZXR0ZXIuIFRoZSBlZmZlY3Qgb2YgWl9GSUxURVJFRCBpcyB0byBmb3JjZSBtb3JlCi0gICBIdWZmbWFuIGNvZGluZyBhbmQgbGVzcyBzdHJpbmcgbWF0Y2hpbmc7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZQotICAgYmV0d2VlbiBaX0RFRkFVTFQgYW5kIFpfSFVGRk1BTl9PTkxZLiBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cwotICAgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBjb21wcmVzc2VkIG91dHB1dCBldmVuCi0gICBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuCi0KLSAgICAgIGRlZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCi0gICBtZXRob2QpLiBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0MiBkb2VzCi0gICBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KLSovCi0KLS8qCi0gICAgIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGUgc2VxdWVuY2UKLSAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZAotICAgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQsIGRlZmxhdGVJbml0MiBvciBkZWZsYXRlUmVzZXQsIGJlZm9yZSBhbnkKLSAgIGNhbGwgb2YgZGVmbGF0ZS4gVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCi0gICBkaWN0aW9uYXJ5IChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkpLgotCi0gICAgIFRoZSBkaWN0aW9uYXJ5IHNob3VsZCBjb25zaXN0IG9mIHN0cmluZ3MgKGJ5dGUgc2VxdWVuY2VzKSB0aGF0IGFyZSBsaWtlbHkKLSAgIHRvIGJlIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkKLSAgIHVzZWQgc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuIFVzaW5nIGEKLSAgIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4gYmUKLSAgIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KLSAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KLQotICAgICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGRhdGEgc3RydWN0dXJlcyBzZWxlY3RlZCBieQotICAgZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLCBhIHBhcnQgb2YgdGhlIGRpY3Rpb25hcnkgbWF5IGluIGVmZmVjdCBiZQotICAgZGlzY2FyZGVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGljdGlvbmFyeSBpcyBsYXJnZXIgdGhhbiB0aGUgd2luZG93IHNpemUgaW4KLSAgIGRlZmxhdGUgb3IgZGVmbGF0ZTIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIHNob3VsZCBiZQotICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuCi0KLSAgICAgVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgc3RybS0+YWRsZXIgaXMgc2V0IHRvIHRoZSBBZGxlcjMyIHZhbHVlCi0gICBvZiB0aGUgZGljdGlvbmFyeTsgdGhlIGRlY29tcHJlc3NvciBtYXkgbGF0ZXIgdXNlIHRoaXMgdmFsdWUgdG8gZGV0ZXJtaW5lCi0gICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuIChUaGUgQWRsZXIzMiB2YWx1ZQotICAgYXBwbGllcyB0byB0aGUgd2hvbGUgZGljdGlvbmFyeSBldmVuIGlmIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGRpY3Rpb25hcnkgaXMKLSAgIGFjdHVhbGx5IHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuKQotCi0gICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiBhCi0gICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKLSAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgZGVmbGF0ZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzdHJlYW0KLSAgIG9yIGlmIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaXMgYnNvcnQpLiBkZWZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KLSovCi0KLS8qCi0gICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCi0KLSAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gc2V2ZXJhbCBjb21wcmVzc2lvbiBzdHJhdGVnaWVzIHdpbGwgYmUKLSAgIHRyaWVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YgcHJlLXByb2Nlc3NpbmcgdGhlIGlucHV0Ci0gICBkYXRhIHdpdGggYSBmaWx0ZXIuIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKLSAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAotICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCi0gICBjYW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KLQotICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAotICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIE5VTEwpLiBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCi0gICBkZXN0aW5hdGlvbi4KLSovCi0KLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBkZWZsYXRlRW5kIGZvbGxvd2VkIGJ5IGRlZmxhdGVJbml0LAotICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KLSAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcwotICAgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCi0KLSAgICAgIGRlZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIE5VTEwpLgotKi8KLQotLyoKLSAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuICBUaGUKLSAgIGludGVycHJldGF0aW9uIG9mIGxldmVsIGFuZCBzdHJhdGVneSBpcyBhcyBpbiBkZWZsYXRlSW5pdDIuICBUaGlzIGNhbiBiZQotICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKLSAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50Ci0gICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCi0gICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCi0gICB0YWtlIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgotCi0gICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlUGFyYW1zLCB0aGUgc3RyZWFtIHN0YXRlIG11c3QgYmUgc2V0IGFzIGZvcgotICAgYSBjYWxsIG9mIGRlZmxhdGUoKSwgc2luY2UgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgaW5wdXQgbWF5IGhhdmUgdG8KLSAgIGJlIGNvbXByZXNzZWQgYW5kIGZsdXNoZWQuIEluIHBhcnRpY3VsYXIsIHN0cm0tPmF2YWlsX291dCBtdXN0IGJlIG5vbi16ZXJvLgotCi0gICAgIGRlZmxhdGVQYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCBaX0JVRl9FUlJPUgotICAgaWYgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgotKi8KLQotLyoKLVpFWFRFUk4oaW50KSAgaW5mbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMpKTsKLQotICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBpbmZsYXRlSW5pdCB3aXRoIGFuIGV4dHJhIHBhcmFtZXRlci4gVGhlCi0gICBmaWVsZHMgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkCi0gICBiZWZvcmUgYnkgdGhlIGNhbGxlci4KLQotICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgbWF4aW11bSB3aW5kb3cKLSAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgotICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCi0gICBpbnN0ZWFkLiBJZiBhIGNvbXByZXNzZWQgc3RyZWFtIHdpdGggYSBsYXJnZXIgd2luZG93IHNpemUgaXMgZ2l2ZW4gYXMKLSAgIGlucHV0LCBpbmZsYXRlKCkgd2lsbCByZXR1cm4gd2l0aCB0aGUgZXJyb3IgY29kZSBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZgotICAgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIHdpbmRvdy4KLQotICAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGEgbmVnYXRpdmUKLSAgIG1lbUxldmVsKS4gbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBpbmZsYXRlSW5pdDIKLSAgIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24gYXBhcnQgZnJvbSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZgotICAgcHJlc2VudDogdGhpcyB3aWxsIGJlIGRvbmUgYnkgaW5mbGF0ZSgpLiAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlCi0gICBtb2RpZmllZCwgYnV0IG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVuY2hhbmdlZC4pCi0qLwotCi0vKgotICAgICBJbml0aWFsaXplcyB0aGUgZGVjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBieXRlCi0gICBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZQotICAgaWYgdGhpcyBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKLSAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIEFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsIG9mCi0gICBpbmZsYXRlLiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKLSAgIGRpY3Rpb25hcnkgKHNlZSBkZWZsYXRlU2V0RGljdGlvbmFyeSkuCi0KLSAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGEKLSAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcwotICAgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKLSAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IEFkbGVyMzIgdmFsdWUpLiBpbmZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgotICAgaW5mbGF0ZSgpLgotKi8KLQotLyoKLSAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKLSAgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKLSAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC4KLQotICAgIGluZmxhdGVTeW5jIHJldHVybnMgWl9PSyBpZiBhIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsIFpfQlVGX0VSUk9SCi0gIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCi0gIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCi0gIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0b3RhbF9pbiB3aGljaAotICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQotICBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZSBpbnB1dCBlYWNoIHRpbWUsCi0gIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLgotKi8KLQotWkVYVEVSTihpbnQpICBpbmZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0vKgotICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5mbGF0ZUVuZCBmb2xsb3dlZCBieSBpbmZsYXRlSW5pdCwKLSAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiBzdGF0ZS4KLSAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIGF0dHJpYnV0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBpbmZsYXRlSW5pdDIuCi0KLSAgICAgIGluZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIE5VTEwpLgotKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGUgZm9sbG93aW5nIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlCi0gICBiYXNpYyBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25zLiBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lCi0gICBkZWZhdWx0IG9wdGlvbnMgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsCi0gICBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMpLiBUaGUgc291cmNlIGNvZGUgb2YgdGhlc2UKLSAgIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBlYXNpbHkgYmUgbW9kaWZpZWQgaWYgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgotKi8KLQotLyoKLSAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKLSAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKLSAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuCi0gICBzb3VyY2VMZW4gcGx1cyAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKLSAgIGNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQotICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgotICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuCi0qLwotCi0vKgotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCi0gICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKLSAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKLSAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuIHNvdXJjZUxlbiBwbHVzCi0gICAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0KLSAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAotICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgotKi8KLQotLyoKLSAgICAgRGVjb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcwotICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAotICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQotICAgZW50aXJlIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZQotICAgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yCi0gICBieSBzb21lIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKQotICAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0gICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKLSAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC4KLQotICAgICB1bmNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciwgb3IgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQuCi0qLwotCi0KLS8qCi0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgotICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikgYnV0IGNhbiBhbHNvIGluY2x1ZGUgYSBjb21wcmVzc2lvbiBsZXZlbAotICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCi0gICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLiAoU2VlIHRoZSBkZXNjcmlwdGlvbgotICAgb2YgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKQotCi0gICAgIGd6b3BlbiBjYW4gYmUgdXNlZCB0byByZWFkIGEgZmlsZSB3aGljaCBpcyBub3QgaW4gZ3ppcCBmb3JtYXQ7IGluIHRoaXMKLSAgIGNhc2UgZ3pyZWFkIHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQgZGVjb21wcmVzc2lvbi4KLQotICAgICBnem9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCi0gICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGU7IGVycm5vCi0gICBjYW4gYmUgY2hlY2tlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUKLSAgIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLiAgKi8KLQotLyoKLSAgICAgZ3pkb3BlbigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQotICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCi0gICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgotICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KLSAgICAgVGhlIG5leHQgY2FsbCBvZiBnemNsb3NlIG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZQotICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQotICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZ3pkb3BlbihkdXAoZmQpLCBtb2RlKS4KLSAgICAgZ3pkb3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKLSAgIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCi0qLwotCi0vKgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCi0gICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCi0gICAgIGd6c2V0cGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgZmlsZSB3YXMgbm90Ci0gICBvcGVuZWQgZm9yIHdyaXRpbmcuCi0qLwotCi0vKgotICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCBnenJlYWQgY29waWVzIHRoZSBnaXZlbiBudW1iZXIKLSAgIG9mIGJ5dGVzIGludG8gdGhlIGJ1ZmZlci4KLSAgICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgcmVhZCAoMCBmb3IKLSAgIGVuZCBvZiBmaWxlLCAtMSBmb3IgZXJyb3IpLiAqLwotCi0vKgotICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgotICAgZ3p3cml0ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4KLSAgICgwIGluIGNhc2Ugb2YgZXJyb3IpLgotKi8KLQotLyoKLSAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3MgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSB1bmRlcgotICAgY29udHJvbCBvZiB0aGUgZm9ybWF0IHN0cmluZywgYXMgaW4gZnByaW50Zi4gZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAoMCBpbiBjYXNlIG9mIGVycm9yKS4KLSovCi0KLS8qCi0gICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCi0gICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCi0gICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KLSovCi0KLS8qCi0gICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUgcmVhZCwgb3IKLSAgIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQotICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwKLSAgIGNoYXJhY3Rlci4KLSAgICAgIGd6Z2V0cyByZXR1cm5zIGJ1Ziwgb3IgWl9OVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi0qLwotCi0vKgotICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBnenB1dGMgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KLSovCi0KLS8qCi0gICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZQotICAgb3IgLTEgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4KLSovCi0KLS8qCi0gICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHBhcmFtZXRlcgotICAgZmx1c2ggaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgotICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gZ3plcnJvciBiZWxvdykuIGd6Zmx1c2ggcmV0dXJucyBaX09LIGlmCi0gICB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIFpfRklOSVNIIGFuZCBhbGwgb3V0cHV0IGNvdWxkIGJlIGZsdXNoZWQuCi0gICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgY2FuCi0gICBkZWdyYWRlIGNvbXByZXNzaW9uLgotKi8KLQotLyoKLSAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKLSAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiBUaGUgd2hlbmNlIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGluIGxzZWVrKDIpOwotICAgdGhlIHZhbHVlIFNFRUtfRU5EIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCi0gICBleHRyZW1lbHkgc2xvdy4gSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nLCBvbmx5IGZvcndhcmQgc2Vla3MgYXJlCi0gICBzdXBwb3J0ZWQ7IGd6c2VlayB0aGVuIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiB6ZXJvZXMgdXAgdG8gdGhlIG5ldwotICAgc3RhcnRpbmcgcG9zaXRpb24uCi0KLSAgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCi0gICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgotICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotKi8KLQotLyoKLSAgICAgUmV3aW5kcyB0aGUgZ2l2ZW4gZmlsZS4gVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgb25seSBmb3IgcmVhZGluZy4KLQotICAgZ3pyZXdpbmQoZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KWd6c2VlayhmaWxlLCAwTCwgU0VFS19TRVQpCi0qLwotCi0vKgotICAgICBSZXR1cm5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlCi0gICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIFRoaXMgcG9zaXRpb24gcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4KLQotICAgZ3p0ZWxsKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX0NVUikKLSovCi0KLS8qCi0gICAgIFJldHVybnMgMSB3aGVuIEVPRiBoYXMgcHJldmlvdXNseSBiZWVuIGRldGVjdGVkIHJlYWRpbmcgdGhlIGdpdmVuCi0gICBpbnB1dCBzdHJlYW0sIG90aGVyd2lzZSB6ZXJvLgotKi8KLQotLyoKLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQotICAgYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCi0gICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4KLSovCi0KLS8qCi0gICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgotICAgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCi0gICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubwotICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tzdW0gZnVuY3Rpb25zICovCi0KLS8qCi0gICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHJlbGF0ZWQgdG8gY29tcHJlc3Npb24gYnV0IGFyZSBleHBvcnRlZAotICAgYW55d2F5IGJlY2F1c2UgdGhleSBtaWdodCBiZSB1c2VmdWwgaW4gYXBwbGljYXRpb25zIHVzaW5nIHRoZQotICAgY29tcHJlc3Npb24gbGlicmFyeS4KLSovCi0KLVpFWFRFUk4odUxvbmcpICBhZGxlcjMyIE9GKCh1TG9uZyBhZGxlciwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKLQotLyoKLSAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAotICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgotICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAotICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6Ci0KLSAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOwotKi8KLQotLyoKLSAgICAgVXBkYXRlIGEgcnVubmluZyBjcmMgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkCi0gICBjcmMuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUKLSAgIGZvciB0aGUgY3JjLiBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MgY29tcGxlbWVudCkgaXMgcGVyZm9ybWVkCi0gICB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUgYXBwbGljYXRpb24uCi0gICBVc2FnZSBleGFtcGxlOgotCi0gICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7Ci0qLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KLQotLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgotICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06Ci0gKi8KLVpFWFRFUk4oaW50KSAgaW5mbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgd2luZG93Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7Ci0jZGVmaW5lIGRlZmxhdGVJbml0KHN0cm0sIGxldmVsKSBcCi0gICAgICAgIGRlZmxhdGVJbml0Xygoc3RybSksIChsZXZlbCksICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAotICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCi0jZGVmaW5lIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpIFwKLSAgICAgICAgZGVmbGF0ZUluaXQyXygoc3RybSksKGxldmVsKSwobWV0aG9kKSwod2luZG93Qml0cyksKG1lbUxldmVsKSxcCi0gICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5KSwgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKLSAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfWkxJQl9IICovCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC96dXRpbC5jIGIvc3JjL2d6aXAvenV0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkMGMxZi4uMDAwMDAwMAotLS0gYS9zcmMvZ3ppcC96dXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qIHp1dGlsLmMgLS0gdGFyZ2V0IGRlcGVuZGVudCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotCi0jaWZuZGVmIFNUREMKLWV4dGVybiB2b2lkIGV4aXQgT0YoKGludCkpOwotI2VuZGlmCi0KLQotI2lmbmRlZiBIQVZFX01FTUNQWQotCi12b2lkIHptZW1jcHkoZGVzdCwgc291cmNlLCBsZW4pCi0gICAgQnl0ZWYqIGRlc3Q7Ci0gICAgY29uc3QgQnl0ZWYqIHNvdXJjZTsKLSAgICB1SW50ICBsZW47Ci17Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0gICAgZG8gewotICAgICAgICAqZGVzdCsrID0gKnNvdXJjZSsrOyAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KLSAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKLX0KLQotaW50IHptZW1jbXAoczEsIHMyLCBsZW4pCi0gICAgY29uc3QgQnl0ZWYqIHMxOwotICAgIGNvbnN0IEJ5dGVmKiBzMjsKLSAgICB1SW50ICBsZW47Ci17Ci0gICAgdUludCBqOwotCi0gICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0gICAgICAgIGlmIChzMVtqXSAhPSBzMltqXSkgcmV0dXJuIDIqKHMxW2pdID4gczJbal0pLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIHptZW16ZXJvKGRlc3QsIGxlbikKLSAgICBCeXRlZiogZGVzdDsKLSAgICB1SW50ICBsZW47Ci17Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0gICAgZG8gewotICAgICAgICAqZGVzdCsrID0gMDsgIC8qID8/PyB0byBiZSB1bnJvbGxlZCAqLwotICAgIH0gd2hpbGUgKC0tbGVuICE9IDApOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKCBNU0RPUyApICYmIGRlZmluZWQoIF9fVFVSQk9DX18gKSAmJiAhZGVmaW5lZCggTVlfWkNBTExPQyApCi0jaWYgKGRlZmluZWQoIF9fQk9STEFORENfXykgfHwgIWRlZmluZWQoU01BTExfTUVESVVNKSkgJiYgIWRlZmluZWQoX18zMkJJVF9fKQotLyogU21hbGwgYW5kIG1lZGl1bSBtb2RlbCBpbiBUdXJibyBDIGFyZSBmb3Igbm93IGxpbWl0ZWQgdG8gbmVhciBhbGxvY2F0aW9uCi0gKiB3aXRoIHJlZHVjZWQgTUFYX1dCSVRTIGFuZCBNQVhfTUVNX0xFVkVMCi0gKi8KLSMgIGRlZmluZSBNWV9aQ0FMTE9DCi0KLS8qIFR1cmJvIEMgbWFsbG9jKCkgZG9lcyBub3QgYWxsb3cgZHluYW1pYyBhbGxvY2F0aW9uIG9mIDY0SyBieXRlcwotICogYW5kIGZhcm1hbGxvYyg2NEspIHJldHVybnMgYSBwb2ludGVyIHdpdGggYW4gb2Zmc2V0IG9mIDgsIHNvIHdlCi0gKiBtdXN0IGZpeCB0aGUgcG9pbnRlci4gV2FybmluZzogdGhlIHBvaW50ZXIgbXVzdCBiZSBwdXQgYmFjayB0byBpdHMKLSAqIG9yaWdpbmFsIGZvcm0gaW4gb3JkZXIgdG8gZnJlZSBpdCwgdXNlIHpjZnJlZSgpLgotICovCi0KLSNkZWZpbmUgTUFYX1BUUiAxMAotLyogMTAqNjRLID0gNjQwSyAqLwotCi1sb2NhbCBpbnQgbmV4dF9wdHIgPSAwOwotCi10eXBlZGVmIHN0cnVjdCBwdHJfdGFibGVfcyB7Ci0gICAgdm9pZHBmIG9yZ19wdHI7Ci0gICAgdm9pZHBmIG5ld19wdHI7Ci19IHB0cl90YWJsZTsKLQotbG9jYWwgcHRyX3RhYmxlIHRhYmxlW01BWF9QVFJdOwotLyogVGhpcyB0YWJsZSBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCBmb3JtIG9mIHBvaW50ZXJzCi0gKiB0byBsYXJnZSBidWZmZXJzICg2NEspLiBTdWNoIHBvaW50ZXJzIGFyZSBub3JtYWxpemVkIHdpdGggYSB6ZXJvIG9mZnNldC4KLSAqIFNpbmNlIE1TRE9TIGlzIG5vdCBhIHByZWVtcHRpdmUgbXVsdGl0YXNraW5nIE9TLCB0aGlzIHRhYmxlIGlzIG5vdAotICogcHJvdGVjdGVkIGZyb20gY29uY3VycmVudCBhY2Nlc3MuIFRoaXMgaGFjayBkb2Vzbid0IHdvcmsgYW55d2F5IG9uCi0gKiBhIHByb3RlY3RlZCBzeXN0ZW0gbGlrZSBPUy8yLiBVc2UgTWljcm9zb2Z0IEMgaW5zdGVhZC4KLSAqLwotCi12b2lkcGYgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCi17Ci0gICAgdm9pZHBmIGJ1ZiA9IG9wYXF1ZTsgLyoganVzdCB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCi0gICAgdWxnIGJzaXplID0gKHVsZylpdGVtcypzaXplOwotCi0gICAgLyogSWYgd2UgYWxsb2NhdGUgbGVzcyB0aGFuIDY1NTIwIGJ5dGVzLCB3ZSBhc3N1bWUgdGhhdCBmYXJtYWxsb2MKLSAgICAgKiB3aWxsIHJldHVybiBhIHVzYWJsZSBwb2ludGVyIHdoaWNoIGRvZXNuJ3QgaGF2ZSB0byBiZSBub3JtYWxpemVkLgotICAgICAqLwotICAgIGlmIChic2l6ZSA8IDY1NTIwTCkgewotICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUpOwotICAgICAgICBpZiAoKih1c2gqKSZidWYgIT0gMCkgcmV0dXJuIGJ1ZjsKLSAgICB9IGVsc2UgewotICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUgKyAxNkwpOwotICAgIH0KLSAgICBpZiAoYnVmID09IE5VTEwgfHwgbmV4dF9wdHIgPj0gTUFYX1BUUikgcmV0dXJuIE5VTEw7Ci0gICAgdGFibGVbbmV4dF9wdHJdLm9yZ19wdHIgPSBidWY7Ci0KLSAgICAvKiBOb3JtYWxpemUgdGhlIHBvaW50ZXIgdG8gc2VnOjAgKi8KLSAgICAqKCh1c2gqKSZidWYrMSkgKz0gKCh1c2gpKCh1Y2gqKWJ1Zi0wKSArIDE1KSA+PiA0OwotICAgICoodXNoKikmYnVmID0gMDsKLSAgICB0YWJsZVtuZXh0X3B0cisrXS5uZXdfcHRyID0gYnVmOwotICAgIHJldHVybiBidWY7Ci19Ci0KLXZvaWQgIHpjZnJlZSAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikKLXsKLSAgICBpbnQgbjsKLSAgICBpZiAoKih1c2gqKSZwdHIgIT0gMCkgeyAvKiBvYmplY3QgPCA2NEsgKi8KLSAgICAgICAgZmFyZnJlZShwdHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIEZpbmQgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KLSAgICBmb3IgKG4gPSAwOyBuIDwgbmV4dF9wdHI7IG4rKykgewotICAgICAgICBpZiAocHRyICE9IHRhYmxlW25dLm5ld19wdHIpIGNvbnRpbnVlOwotCi0gICAgICAgIGZhcmZyZWUodGFibGVbbl0ub3JnX3B0cik7Ci0gICAgICAgIHdoaWxlICgrK24gPCBuZXh0X3B0cikgewotICAgICAgICAgICAgdGFibGVbbi0xXSA9IHRhYmxlW25dOwotICAgICAgICB9Ci0gICAgICAgIG5leHRfcHRyLS07Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcHRyID0gb3BhcXVlOyAvKiBqdXN0IHRvIG1ha2Ugc29tZSBjb21waWxlcnMgaGFwcHkgKi8KLSAgICBBc3NlcnQoMCwgInpjZnJlZTogcHRyIG5vdCBmb3VuZCIpOwotfQotI2VuZGlmCi0jZW5kaWYgLyogTVNET1MgJiYgX19UVVJCT0NfXyAqLwotCi0KLSNpZiBkZWZpbmVkKE1fSTg2KSAmJiAhZGVmaW5lZChfXzMyQklUX18pICYmICFkZWZpbmVkKCBNWV9aQ0FMTE9DICkKLS8qIE1pY3Jvc29mdCBDIGluIDE2LWJpdCBtb2RlICovCi0KLSMgIGRlZmluZSBNWV9aQ0FMTE9DCi0KLSNpZiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA8PSA2MDApKQotIyAgZGVmaW5lIF9oYWxsb2MgIGhhbGxvYwotIyAgZGVmaW5lIF9oZnJlZSAgIGhmcmVlCi0jZW5kaWYKLQotdm9pZHBmIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKQotewotICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICByZXR1cm4gX2hhbGxvYygobG9uZylpdGVtcywgc2l6ZSk7Ci19Ci0KLXZvaWQgIHpjZnJlZSAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikKLXsKLSAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgX2hmcmVlKHB0cik7Ci19Ci0KLSNlbmRpZiAvKiBNU0MgKi8KLQotCi0jaWZuZGVmIE1ZX1pDQUxMT0MgLyogQW55IHN5c3RlbSB3aXRob3V0IGEgc3BlY2lhbCBhbGxvYyBmdW5jdGlvbiAqLwotCi0jaWZuZGVmIFNUREMKLWV4dGVybiB2b2lkcCAgZnRfc2NhbGxvYyBPRigodUludCBpdGVtcywgdUludCBzaXplKSk7Ci1leHRlcm4gdm9pZCAgIGZ0X3NmcmVlICAgT0YoKHZvaWRwZiBwdHIpKTsKLSNlbmRpZgotCi12b2lkcGYgemNhbGxvYyAob3BhcXVlLCBpdGVtcywgc2l6ZSkKLSAgICB2b2lkcGYgb3BhcXVlOwotICAgIHVuc2lnbmVkIGl0ZW1zOwotICAgIHVuc2lnbmVkIHNpemU7Ci17Ci0gICAgaWYgKG9wYXF1ZSkgaXRlbXMgKz0gc2l6ZSAtIHNpemU7IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICByZXR1cm4gKHZvaWRwZilmdF9zY2FsbG9jKGl0ZW1zLCBzaXplKTsKLX0KLQotdm9pZCAgemNmcmVlIChvcGFxdWUsIHB0cikKLSAgICB2b2lkcGYgb3BhcXVlOwotICAgIHZvaWRwZiBwdHI7Ci17Ci0gICAgZnRfc2ZyZWUocHRyKTsKLSAgICBpZiAob3BhcXVlKSByZXR1cm47IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLX0KLQotI2VuZGlmIC8qIE1ZX1pDQUxMT0MgKi8KZGlmZiAtLWdpdCBhL3NyYy9nemlwL3p1dGlsLmggYi9zcmMvZ3ppcC96dXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTY4OGNkLi4wMDAwMDAwCi0tLSBhL3NyYy9nemlwL3p1dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyogenV0aWwuaCAtLSBpbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaWZuZGVmIF9aX1VUSUxfSAotI2RlZmluZSBfWl9VVElMX0gKLQotI2luY2x1ZGUgInpsaWIuaCIKLQotI2lmZGVmIFNUREMKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPgotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIE5PX0VSUk5PX0gKLSAgICBleHRlcm4gaW50IGVycm5vOwotI2Vsc2UKLSMgICBpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi0KLSNpZm5kZWYgbG9jYWwKLSMgIGRlZmluZSBsb2NhbCBzdGF0aWMKLSNlbmRpZgotLyogY29tcGlsZSB3aXRoIC1EbG9jYWwgaWYgeW91ciBkZWJ1Z2dlciBjYW4ndCBmaW5kIHN0YXRpYyBzeW1ib2xzICovCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgdWNoOwotdHlwZWRlZiB1Y2ggRkFSIHVjaGY7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaDsKLXR5cGVkZWYgdXNoIEZBUiB1c2hmOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1bGc7Ci0KLQotI2RlZmluZSBFUlJfUkVUVVJOKHN0cm0sZXJyKSBcCi0gIHJldHVybiAoc3RybS0+bXNnID0gKGNoYXIqKUVSUl9NU0coZXJyKSwgKGVycikpCi0vKiBUbyBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgc3RhdGUgaXMga25vd24gdG8gYmUgdmFsaWQgKi8KLQotICAgICAgICAvKiBjb21tb24gY29uc3RhbnRzICovCi0KLSNpZm5kZWYgREVGX1dCSVRTCi0jICBkZWZpbmUgREVGX1dCSVRTIE1BWF9XQklUUwotI2VuZGlmCi0vKiBkZWZhdWx0IHdpbmRvd0JpdHMgZm9yIGRlY29tcHJlc3Npb24uIE1BWF9XQklUUyBpcyBmb3IgY29tcHJlc3Npb24gb25seSAqLwotCi0jaWYgTUFYX01FTV9MRVZFTCA+PSA4Ci0jICBkZWZpbmUgREVGX01FTV9MRVZFTCA4Ci0jZWxzZQotIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKLSNlbmRpZgotLyogZGVmYXVsdCBtZW1MZXZlbCAqLwotCi0jZGVmaW5lIFNUT1JFRF9CTE9DSyAwCi0jZGVmaW5lIFNUQVRJQ19UUkVFUyAxCi0jZGVmaW5lIERZTl9UUkVFUyAgICAyCi0vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqLwotCi0jZGVmaW5lIE1JTl9NQVRDSCAgMwotI2RlZmluZSBNQVhfTUFUQ0ggIDI1OAotLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqLwotCi0jZGVmaW5lIFBSRVNFVF9ESUNUIDB4MjAgLyogcHJlc2V0IGRpY3Rpb25hcnkgZmxhZyBpbiB6bGliIGhlYWRlciAqLwotCi0gICAgICAgIC8qIHRhcmdldCBkZXBlbmRlbmNpZXMgKi8KLQotI2lmZGVmIE1TRE9TCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwMAotIyAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLSMgICAgaWYoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKLSAgICAgICAvKiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkICovCi0gICAgICAgdm9pZCBfQ2RlY2wgZmFyZnJlZSggdm9pZCAqYmxvY2sgKTsKLSAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOwotIyAgICBlbHNlCi0jICAgICBpbmNsdWRlIDxhbGxvYy5oPgotIyAgICBlbmRpZgotIyAgZWxzZSAvKiBNU0Mgb3IgREpHUFAgKi8KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9TMgotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDYKLSNlbmRpZgotCi0jaWZkZWYgV0lOMzIgLyogV2luZG93IDk1ICYgV2luZG93cyBOVCAqLwotIyAgZGVmaW5lIE9TX0NPREUgIDB4MGIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChWQVhDKSB8fCBkZWZpbmVkKFZNUykKLSMgIGRlZmluZSBPU19DT0RFICAweDAyCi0jICBkZWZpbmUgRl9PUEVOKG5hbWUsIG1vZGUpIFwKLSAgICAgZnRfZm9wZW4oKG5hbWUpLCAobW9kZSksICJtYmM9NjAiLCAiY3R4PXN0bSIsICJyZm09Zml4IiwgIm1ycz01MTIiKQotI2VuZGlmCi0KLSNpZmRlZiBBTUlHQQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBVEFSSSkgfHwgZGVmaW5lZChhdGFyaXN0KQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDUKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNQUNPUykgfHwgZGVmaW5lZChUQVJHRVRfT1NfTUFDKQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDcKLSMgIGlmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKLSMgICAgaW5jbHVkZSA8dW5peC5oPiAvKiBmb3IgZmRvcGVuICovCi0jICBlbHNlCi0jICAgIGlmbmRlZiBmZG9wZW4KLSMgICAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fNTBTRVJJRVMgLyogUHJpbWUvUFJJTU9TICovCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwRgotI2VuZGlmCi0KLSNpZmRlZiBUT1BTMjAKLSMgIGRlZmluZSBPU19DT0RFICAweDBhCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0JFT1NfKSB8fCBkZWZpbmVkKFJJU0NPUykKLSMgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLwotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gNjAwKSkKLSMgIGRlZmluZSBmZG9wZW4oZmQsdHlwZSkgIF9mZG9wZW4oZmQsdHlwZSkKLSNlbmRpZgotCi0KLSAgICAgICAgLyogQ29tbW9uIGRlZmF1bHRzICovCi0KLSNpZm5kZWYgT1NfQ09ERQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCi0jZW5kaWYKLQotI2lmbmRlZiBGX09QRU4KLSMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgZnRfZm9wZW4oKG5hbWUpLCAobW9kZSkpCi0jZW5kaWYKLQotICAgICAgICAgLyogZnVuY3Rpb25zICovCi0KLSNpZmRlZiBIQVZFX1NUUkVSUk9SCi0gICBleHRlcm4gY2hhciAqc3RyZXJyb3IgT0YoKGludCkpOwotIyAgZGVmaW5lIHpzdHJlcnJvcihlcnJudW0pIHN0cmVycm9yKGVycm51bSkKLSNlbHNlCi0jICBkZWZpbmUgenN0cmVycm9yKGVycm51bSkgIiIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChweXIpCi0jICBkZWZpbmUgTk9fTUVNQ1BZCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFNNQUxMX01FRElVTSkgJiYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykKLSAvKiBVc2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgd2l0aCBNU0MgPD0gNS4wLgotICAqIFlvdSBtYXkgaGF2ZSB0byB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgZm9yIEJvcmxhbmQgQyAodW50ZXN0ZWQpLgotICAqIFRoZSBfX1NDX18gY2hlY2sgaXMgZm9yIFN5bWFudGVjLgotICAqLwotIyAgZGVmaW5lIE5PX01FTUNQWQotI2VuZGlmCi0jaWYgZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChIQVZFX01FTUNQWSkgJiYgIWRlZmluZWQoTk9fTUVNQ1BZKQotIyAgZGVmaW5lIEhBVkVfTUVNQ1BZCi0jZW5kaWYKLSNpZmRlZiBIQVZFX01FTUNQWQotIyAgaWZkZWYgU01BTExfTUVESVVNIC8qIE1TRE9TIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgem1lbWNweSBfZm1lbWNweQotIyAgICBkZWZpbmUgem1lbWNtcCBfZm1lbWNtcAotIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBfZm1lbXNldChkZXN0LCAwLCBsZW4pCi0jICBlbHNlCi0jICAgIGRlZmluZSB6bWVtY3B5IGZ0X21lbWNweQotIyAgICBkZWZpbmUgem1lbWNtcCBmdF9tZW1jbXAKLSMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgZnRfbWVtc2V0KGRlc3QsIDAsIGxlbikKLSMgIGVuZGlmCi0jZWxzZQotICAgZXh0ZXJuIHZvaWQgem1lbWNweSAgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOwotICAgZXh0ZXJuIGludCAgem1lbWNtcCAgT0YoKGNvbnN0IEJ5dGVmKiBzMSwgY29uc3QgQnl0ZWYqIHMyLCB1SW50IGxlbikpOwotICAgZXh0ZXJuIHZvaWQgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOwotI2VuZGlmCi0KLS8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCi0jaWZkZWYgREVCVUcKLSMgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0gICBleHRlcm4gaW50IHpfdmVyYm9zZTsKLSAgIGV4dGVybiB2b2lkIHpfZXJyb3IgICAgT0YoKGNoYXIgKm0pKTsKLSMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSB6X2Vycm9yKG1zZyk7fQotIyAgZGVmaW5lIFRyYWNlKHgpIHtpZiAoel92ZXJib3NlPj0wKSBmcHJpbnRmIHggO30KLSMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh6X3ZlcmJvc2U+MCkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHpfdmVyYm9zZT4xKSBmcHJpbnRmIHggO30KLSMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHpfdmVyYm9zZT4wICYmIChjKSkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAoel92ZXJib3NlPjEgJiYgKGMpKSBmcHJpbnRmIHggO30KLSNlbHNlCi0jICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQotIyAgZGVmaW5lIFRyYWNlKHgpCi0jICBkZWZpbmUgVHJhY2V2KHgpCi0jICBkZWZpbmUgVHJhY2V2dih4KQotIyAgZGVmaW5lIFRyYWNlYyhjLHgpCi0jICBkZWZpbmUgVHJhY2VjdihjLHgpCi0jZW5kaWYKLQotCi10eXBlZGVmIHVMb25nICgqY2hlY2tfZnVuYykgT0YoKHVMb25nIGNoZWNrLCBjb25zdCBCeXRlZiAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IGxlbikpOwotbG9jYWwgdm9pZHBmIHpjYWxsb2MgT0YoKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKSk7Ci1sb2NhbCB2b2lkICAgemNmcmVlICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikpOwotCi0jZGVmaW5lIFpBTExPQyhzdHJtLCBpdGVtcywgc2l6ZSkgXAotICAgICAgICAgICAoKigoc3RybSktPnphbGxvYykpKChzdHJtKS0+b3BhcXVlLCAoaXRlbXMpLCAoc2l6ZSkpCi0jZGVmaW5lIFpGUkVFKHN0cm0sIGFkZHIpICAoKigoc3RybSktPnpmcmVlKSkoKHN0cm0pLT5vcGFxdWUsICh2b2lkcGYpKGFkZHIpKQotI2RlZmluZSBUUllfRlJFRShzLCBwKSB7aWYgKHApIFpGUkVFKHMsIHApO30KLQotI2VuZGlmIC8qIF9aX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2x6dy9KYW1maWxlIGIvc3JjL2x6dy9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTYxZjA4Li4wMDAwMDAwCi0tLSBhL3NyYy9sencvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvbHp3IEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDQtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBsencgOwotCi1MaWJyYXJ5ICAkKEZUMl9MSUIpIDogZnRsencuYyA7Ci0KLSMgZW5kIG9mIHNyYy9sencgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2x6dy9mdGx6dy5jIGIvc3JjL2x6dy9mdGx6dy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFmNmNlLi4wMDAwMDAwCi0tLSBhL3NyYy9sencvZnRsencuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGx6dy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc3VwcG9ydCBmb3IgLlogY29tcHJlc3NlZCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBvcHRpb25hbCBjb21wb25lbnQgcmVsaWVzIG9uIE5ldEJTRCdzIHpvcGVuKCkuICBJdCBzaG91bGQgbWFpbmx5ICAqLwotLyogIGJlIHVzZWQgdG8gcGFyc2UgY29tcHJlc3NlZCBQQ0YgZm9udHMsIGFzIGZvdW5kIHdpdGggbWFueSBYMTEgc2VydmVyICAgKi8KLS8qICBkaXN0cmlidXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBBbGJlcnQgQ2hpbi1BLVlvdW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJhc2VkIG9uIGNvZGUgaW4gYHNyYy9nemlwL2Z0Z3ppcC5jJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfTFpXX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBMWldfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0xaVwotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9MWlcKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgImx6dyBjb2RlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCi0jaW5jbHVkZSAiZnR6b3Blbi5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgIE0gRSBNIE8gUiBZICAgTSBBIE4gQSBHIEUgTSBFIE4gVCAgICAgICAgICAgICAgKioqKiovCi0vKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgICBGIEkgTCBFICAgRCBFIFMgQyBSIEkgUCBUIE8gUiAgICAgICAgICAgICAgICAgKioqKiovCi0vKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRlRfTFpXX0JVRkZFUl9TSVpFICA0MDk2Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0xaV0ZpbGVSZWNfCi0gIHsKLSAgICBGVF9TdHJlYW0gICAgICAgc291cmNlOyAgICAgICAgIC8qIHBhcmVudC9zb3VyY2Ugc3RyZWFtICAgICAgICAqLwotICAgIEZUX1N0cmVhbSAgICAgICBzdHJlYW07ICAgICAgICAgLyogZW1iZWRkaW5nIHN0cmVhbSAgICAgICAgICAgICovCi0gICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeTsgICAgICAgICAvKiBtZW1vcnkgYWxsb2NhdG9yICAgICAgICAgICAgKi8KLSAgICBGVF9MendTdGF0ZVJlYyAgbHp3OyAgICAgICAgICAgIC8qIGx6dyBkZWNvbXByZXNzb3Igc3RhdGUgICAgICAqLwotCi0gICAgRlRfQnl0ZSAgICAgICAgIGJ1ZmZlcltGVF9MWldfQlVGRkVSX1NJWkVdOyAvKiBvdXRwdXQgYnVmZmVyICAgICAgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgcG9zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc2l0aW9uIGluIG91dHB1dCAqLwotICAgIEZUX0J5dGUqICAgICAgICBjdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgIGxpbWl0OwotCi0gIH0gRlRfTFpXRmlsZVJlYywgKkZUX0xaV0ZpbGU7Ci0KLQotICAvKiBjaGVjayBhbmQgc2tpcCAuWiBoZWFkZXIgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2x6d19jaGVja19oZWFkZXIoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9CeXRlICAgaGVhZFsyXTsKLQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMCApICAgICAgIHx8Ci0gICAgICAgICBGVF9TVFJFQU1fUkVBRCggaGVhZCwgMiApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGhlYWRbMF0gJiYgaGVhZFsxXSBhcmUgdGhlIG1hZ2ljIG51bWJlcnMgKi8KLSAgICBpZiAoIGhlYWRbMF0gIT0gMHgxRiB8fAotICAgICAgICAgaGVhZFsxXSAhPSAweDlEICkKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2x6d19maWxlX2luaXQoIEZUX0xaV0ZpbGUgIHppcCwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzb3VyY2UgKQotICB7Ci0gICAgRlRfTHp3U3RhdGUgIGx6dyAgID0gJnppcC0+bHp3OwotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLQotCi0gICAgemlwLT5zdHJlYW0gPSBzdHJlYW07Ci0gICAgemlwLT5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgemlwLT5tZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotICAgIHppcC0+bGltaXQgID0gemlwLT5idWZmZXIgKyBGVF9MWldfQlVGRkVSX1NJWkU7Ci0gICAgemlwLT5jdXJzb3IgPSB6aXAtPmxpbWl0OwotICAgIHppcC0+cG9zICAgID0gMDsKLQotICAgIC8qIGNoZWNrIGFuZCBza2lwIC5aIGhlYWRlciAqLwotICAgIGVycm9yID0gZnRfbHp3X2NoZWNrX2hlYWRlciggc291cmNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBpbml0aWFsaXplIGludGVybmFsIGx6dyB2YXJpYWJsZSAqLwotICAgIGZ0X2x6d3N0YXRlX2luaXQoIGx6dywgc291cmNlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2x6d19maWxlX2RvbmUoIEZUX0xaV0ZpbGUgIHppcCApCi0gIHsKLSAgICAvKiBjbGVhciB0aGUgcmVzdCAqLwotICAgIGZ0X2x6d3N0YXRlX2RvbmUoICZ6aXAtPmx6dyApOwotCi0gICAgemlwLT5tZW1vcnkgPSBOVUxMOwotICAgIHppcC0+c291cmNlID0gTlVMTDsKLSAgICB6aXAtPnN0cmVhbSA9IE5VTEw7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9sendfZmlsZV9yZXNldCggRlRfTFpXRmlsZSAgemlwICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gemlwLT5zb3VyY2U7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgewotICAgICAgZnRfbHp3c3RhdGVfcmVzZXQoICZ6aXAtPmx6dyApOwotCi0gICAgICB6aXAtPmxpbWl0ICA9IHppcC0+YnVmZmVyICsgRlRfTFpXX0JVRkZFUl9TSVpFOwotICAgICAgemlwLT5jdXJzb3IgPSB6aXAtPmxpbWl0OwotICAgICAgemlwLT5wb3MgICAgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2x6d19maWxlX2ZpbGxfb3V0cHV0KCBGVF9MWldGaWxlICB6aXAgKQotICB7Ci0gICAgRlRfTHp3U3RhdGUgIGx6dyA9ICZ6aXAtPmx6dzsKLSAgICBGVF9VTG9uZyAgICAgY291bnQ7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICB6aXAtPmN1cnNvciA9IHppcC0+YnVmZmVyOwotCi0gICAgY291bnQgPSBmdF9sendzdGF0ZV9pbyggbHp3LCB6aXAtPmJ1ZmZlciwgRlRfTFpXX0JVRkZFUl9TSVpFICk7Ci0KLSAgICB6aXAtPmxpbWl0ID0gemlwLT5jdXJzb3IgKyBjb3VudDsKLQotICAgIGlmICggY291bnQgPT0gMCApCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZmlsbCBvdXRwdXQgYnVmZmVyOyBgY291bnQnIG11c3QgYmUgPD0gRlRfTFpXX0JVRkZFUl9TSVpFICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9sendfZmlsZV9za2lwX291dHB1dCggRlRfTFpXRmlsZSAgemlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgY291bnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICAvKiBmaXJzdCwgd2Ugc2tpcCB3aGF0IHdlIGNhbiBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgewotICAgICAgRlRfVUxvbmcgIGRlbHRhID0gKEZUX1VMb25nKSggemlwLT5saW1pdCAtIHppcC0+Y3Vyc29yICk7Ci0KLQotICAgICAgaWYgKCBkZWx0YSA+PSBjb3VudCApCi0gICAgICAgIGRlbHRhID0gY291bnQ7Ci0KLSAgICAgIHppcC0+Y3Vyc29yICs9IGRlbHRhOwotICAgICAgemlwLT5wb3MgICAgKz0gZGVsdGE7Ci0KLSAgICAgIGNvdW50IC09IGRlbHRhOwotICAgIH0KLQotICAgIC8qIG5leHQsIHdlIHNraXAgYXMgbWFueSBieXRlcyByZW1haW5pbmcgYXMgcG9zc2libGUgKi8KLSAgICB3aGlsZSAoIGNvdW50ID4gMCApCi0gICAgewotICAgICAgRlRfVUxvbmcgIGRlbHRhID0gRlRfTFpXX0JVRkZFUl9TSVpFOwotICAgICAgRlRfVUxvbmcgIG51bXJlYWQ7Ci0KLQotICAgICAgaWYgKCBkZWx0YSA+IGNvdW50ICkKLSAgICAgICAgZGVsdGEgPSBjb3VudDsKLQotICAgICAgbnVtcmVhZCA9IGZ0X2x6d3N0YXRlX2lvKCAmemlwLT5sencsIE5VTEwsIGRlbHRhICk7Ci0gICAgICBpZiAoIG51bXJlYWQgPCBkZWx0YSApCi0gICAgICB7Ci0gICAgICAgIC8qIG5vdCBlbm91Z2ggYnl0ZXMgKi8KLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICB6aXAtPnBvcyArPSBkZWx0YTsKLSAgICAgIGNvdW50ICAgIC09IGRlbHRhOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VMb25nCi0gIGZ0X2x6d19maWxlX2lvKCBGVF9MWldGaWxlICB6aXAsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICBwb3MsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICBjb3VudCApCi0gIHsKLSAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIC8qIHNlZWtpbmcgYmFja3dhcmRzLiAqLwotICAgIGlmICggcG9zIDwgemlwLT5wb3MgKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBuZXcgcG9zaXRpb24gaXMgd2l0aGluIHRoZSBvdXRwdXQgYnVmZmVyLCBzaW1wbHkgICAgICAgKi8KLSAgICAgIC8qIGRlY3JlbWVudCBwb2ludGVycywgb3RoZXJ3aXNlIHdlIHJlc2V0IHRoZSBzdHJlYW0gY29tcGxldGVseSEgKi8KLSAgICAgIGlmICggKCB6aXAtPnBvcyAtIHBvcyApIDw9IChGVF9VTG9uZykoIHppcC0+Y3Vyc29yIC0gemlwLT5idWZmZXIgKSApCi0gICAgICB7Ci0gICAgICAgIHppcC0+Y3Vyc29yIC09IHppcC0+cG9zIC0gcG9zOwotICAgICAgICB6aXAtPnBvcyAgICAgPSBwb3M7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gZnRfbHp3X2ZpbGVfcmVzZXQoIHppcCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogc2tpcCB1bndhbnRlZCBieXRlcyAqLwotICAgIGlmICggcG9zID4gemlwLT5wb3MgKQotICAgIHsKLSAgICAgIGVycm9yID0gZnRfbHp3X2ZpbGVfc2tpcF9vdXRwdXQoIHppcCwgKEZUX1VMb25nKSggcG9zIC0gemlwLT5wb3MgKSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGNvdW50ID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbm93IHJlYWQgdGhlIGRhdGEgKi8KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIEZUX1VMb25nICBkZWx0YTsKLQotCi0gICAgICBkZWx0YSA9IChGVF9VTG9uZykoIHppcC0+bGltaXQgLSB6aXAtPmN1cnNvciApOwotICAgICAgaWYgKCBkZWx0YSA+PSBjb3VudCApCi0gICAgICAgIGRlbHRhID0gY291bnQ7Ci0KLSAgICAgIEZUX01FTV9DT1BZKCBidWZmZXIgKyByZXN1bHQsIHppcC0+Y3Vyc29yLCBkZWx0YSApOwotICAgICAgcmVzdWx0ICAgICAgKz0gZGVsdGE7Ci0gICAgICB6aXAtPmN1cnNvciArPSBkZWx0YTsKLSAgICAgIHppcC0+cG9zICAgICs9IGRlbHRhOwotCi0gICAgICBjb3VudCAtPSBkZWx0YTsKLSAgICAgIGlmICggY291bnQgPT0gMCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBlcnJvciA9IGZ0X2x6d19maWxlX2ZpbGxfb3V0cHV0KCB6aXAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotLyoqKioqICAgICAgICAgICAgTCBaIFcgICBFIE0gQiBFIEQgRCBJIE4gRyAgIFMgVCBSIEUgQSBNICAgICAgICAgICAgICAqKioqKi8KLS8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBmdF9sendfc3RyZWFtX2Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9MWldGaWxlICB6aXAgICAgPSAoRlRfTFpXRmlsZSlzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcjsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotCi0gICAgaWYgKCB6aXAgKQotICAgIHsKLSAgICAgIC8qIGZpbmFsaXplIGx6dyBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICAgIGZ0X2x6d19maWxlX2RvbmUoIHppcCApOwotCi0gICAgICBGVF9GUkVFKCB6aXAgKTsKLQotICAgICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcKLSAgZnRfbHp3X3N0cmVhbV9pbyggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIGNvdW50ICkKLSAgewotICAgIEZUX0xaV0ZpbGUgIHppcCA9IChGVF9MWldGaWxlKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyOwotCi0KLSAgICByZXR1cm4gZnRfbHp3X2ZpbGVfaW8oIHppcCwgb2Zmc2V0LCBidWZmZXIsIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5MWlcoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzb3VyY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5OwotICAgIEZUX0xaV0ZpbGUgIHppcCA9IE5VTEw7Ci0KLQotICAgIGlmICggIXN0cmVhbSB8fCAhc291cmNlICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9IYW5kbGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBtZW1vcnkgPSBzb3VyY2UtPm1lbW9yeTsKLQotICAgIC8qCi0gICAgICogIENoZWNrIHRoZSBoZWFkZXIgcmlnaHQgbm93OyB0aGlzIHByZXZlbnRzIGFsbG9jYXRpb24gb2YgYSBodWdlCi0gICAgICogIExaV0ZpbGUgb2JqZWN0ICg0MDAgS0J5dGUgb2YgaGVhcCBtZW1vcnkpIGlmIG5vdCBuZWNlc3NhcnkuCi0gICAgICoKLSAgICAgKiAgRGlkIEkgbWVudGlvbiB0aGF0IHlvdSBzaG91bGQgbmV2ZXIgdXNlIC5aIGNvbXByZXNzZWQgZm9udAotICAgICAqICBmaWxlcz8KLSAgICAgKi8KLSAgICBlcnJvciA9IGZ0X2x6d19jaGVja19oZWFkZXIoIHNvdXJjZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfWkVSTyggc3RyZWFtICk7Ci0gICAgc3RyZWFtLT5tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgICBpZiAoICFGVF9ORVcoIHppcCApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGZ0X2x6d19maWxlX2luaXQoIHppcCwgc3RyZWFtLCBzb3VyY2UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBGVF9GUkVFKCB6aXAgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IHppcDsKLSAgICB9Ci0KLSAgICBzdHJlYW0tPnNpemUgID0gMHg3RkZGRkZGRkw7ICAvKiBkb24ndCBrbm93IHRoZSByZWFsIHNpemUhICovCi0gICAgc3RyZWFtLT5wb3MgICA9IDA7Ci0gICAgc3RyZWFtLT5iYXNlICA9IDA7Ci0gICAgc3RyZWFtLT5yZWFkICA9IGZ0X2x6d19zdHJlYW1faW87Ci0gICAgc3RyZWFtLT5jbG9zZSA9IGZ0X2x6d19zdHJlYW1fY2xvc2U7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jaW5jbHVkZSAiZnR6b3Blbi5jIgotCi0KLSNlbHNlICAvKiAhRlRfQ09ORklHX09QVElPTl9VU0VfTFpXICovCi0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9PcGVuTFpXKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc291cmNlICkKLSAgewotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0gICAgRlRfVU5VU0VEKCBzb3VyY2UgKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gIH0KLQotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fVVNFX0xaVyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2x6dy9mdHpvcGVuLmMgYi9zcmMvbHp3L2Z0em9wZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2YzU0Ni4uMDAwMDAwMAotLS0gYS9zcmMvbHp3L2Z0em9wZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHpvcGVuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc3VwcG9ydCBmb3IgLlogY29tcHJlc3NlZCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBvcHRpb25hbCBjb21wb25lbnQgcmVsaWVzIG9uIE5ldEJTRCdzIHpvcGVuKCkuICBJdCBzaG91bGQgbWFpbmx5ICAqLwotLyogIGJlIHVzZWQgdG8gcGFyc2UgY29tcHJlc3NlZCBQQ0YgZm9udHMsIGFzIGZvdW5kIHdpdGggbWFueSBYMTEgc2VydmVyICAgKi8KLS8qICBkaXN0cmlidXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImZ0em9wZW4uaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0KLSAgc3RhdGljIGludAotICBmdF9sendzdGF0ZV9yZWZpbGwoIEZUX0x6d1N0YXRlICBzdGF0ZSApCi0gIHsKLSAgICBGVF9VTG9uZyAgY291bnQ7Ci0KLQotICAgIGlmICggc3RhdGUtPmluX2VvZiApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBjb3VudCA9IEZUX1N0cmVhbV9UcnlSZWFkKCBzdGF0ZS0+c291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5idWZfdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5udW1fYml0cyApOyAgLyogV0hZPyAqLwotCi0gICAgc3RhdGUtPmJ1Zl9zaXplICAgPSAoRlRfVUludCljb3VudDsKLSAgICBzdGF0ZS0+YnVmX3RvdGFsICs9IGNvdW50OwotICAgIHN0YXRlLT5pbl9lb2YgICAgID0gRlRfQk9PTCggY291bnQgPCBzdGF0ZS0+bnVtX2JpdHMgKTsKLSAgICBzdGF0ZS0+YnVmX29mZnNldCA9IDA7Ci0KLSAgICBzdGF0ZS0+YnVmX3NpemUgPDw9IDM7Ci0gICAgaWYgKCBzdGF0ZS0+YnVmX3NpemUgPiBzdGF0ZS0+bnVtX2JpdHMgKQotICAgICAgc3RhdGUtPmJ1Zl9zaXplIC09IHN0YXRlLT5udW1fYml0cyAtIDE7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIC0xOyAvKiBub3QgZW5vdWdoIGRhdGEgKi8KLQotICAgIGlmICggY291bnQgPT0gMCApICAvKiBlbmQgb2YgZmlsZSAqLwotICAgICAgcmV0dXJuIC0xOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9JbnQzMgotICBmdF9sendzdGF0ZV9nZXRfY29kZSggRlRfTHp3U3RhdGUgIHN0YXRlICkKLSAgewotICAgIEZUX1VJbnQgICBudW1fYml0cyA9IHN0YXRlLT5udW1fYml0czsKLSAgICBGVF9VSW50ICAgb2Zmc2V0ICAgPSBzdGF0ZS0+YnVmX29mZnNldDsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9JbnQgICAgcmVzdWx0OwotCi0KLSAgICBpZiAoIHN0YXRlLT5idWZfY2xlYXIgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBvZmZzZXQgPj0gc3RhdGUtPmJ1Zl9zaXplICAgICAgICAgICB8fAotICAgICAgICAgc3RhdGUtPmZyZWVfZW50ID49IHN0YXRlLT5mcmVlX2JpdHMgKQotICAgIHsKLSAgICAgIGlmICggc3RhdGUtPmZyZWVfZW50ID49IHN0YXRlLT5mcmVlX2JpdHMgKQotICAgICAgewotICAgICAgICBzdGF0ZS0+bnVtX2JpdHMgPSArK251bV9iaXRzOwotICAgICAgICBpZiAoIG51bV9iaXRzID4gTFpXX01BWF9CSVRTICkKLSAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgc3RhdGUtPmZyZWVfYml0cyA9IHN0YXRlLT5udW1fYml0cyA8IHN0YXRlLT5tYXhfYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlRfVUludCkoICggMVVMIDw8IG51bV9iaXRzICkgLSAyNTYgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGF0ZS0+bWF4X2ZyZWUgKyAxOwotICAgICAgfQotCi0gICAgICBpZiAoIHN0YXRlLT5idWZfY2xlYXIgKQotICAgICAgewotICAgICAgICBzdGF0ZS0+bnVtX2JpdHMgID0gbnVtX2JpdHMgPSBMWldfSU5JVF9CSVRTOwotICAgICAgICBzdGF0ZS0+ZnJlZV9iaXRzID0gKEZUX1VJbnQpKCAoIDFVTCA8PCBudW1fYml0cyApIC0gMjU2ICk7Ci0gICAgICAgIHN0YXRlLT5idWZfY2xlYXIgPSAwOwotICAgICAgfQotCi0gICAgICBpZiAoIGZ0X2x6d3N0YXRlX3JlZmlsbCggc3RhdGUgKSA8IDAgKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgIG9mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgc3RhdGUtPmJ1Zl9vZmZzZXQgPSBvZmZzZXQgKyBudW1fYml0czsKLQotICAgIHAgICAgICAgICA9ICZzdGF0ZS0+YnVmX3RhYltvZmZzZXQgPj4gM107Ci0gICAgb2Zmc2V0ICAgJj0gNzsKLSAgICByZXN1bHQgICAgPSAqcCsrID4+IG9mZnNldDsKLSAgICBvZmZzZXQgICAgPSA4IC0gb2Zmc2V0OwotICAgIG51bV9iaXRzIC09IG9mZnNldDsKLQotICAgIGlmICggbnVtX2JpdHMgPj0gOCApCi0gICAgewotICAgICAgcmVzdWx0ICAgfD0gKnArKyA8PCBvZmZzZXQ7Ci0gICAgICBvZmZzZXQgICArPSA4OwotICAgICAgbnVtX2JpdHMgLT0gODsKLSAgICB9Ci0gICAgaWYgKCBudW1fYml0cyA+IDAgKQotICAgICAgcmVzdWx0IHw9ICggKnAgJiBMWldfTUFTSyggbnVtX2JpdHMgKSApIDw8IG9mZnNldDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGdyb3cgdGhlIGNoYXJhY3RlciBzdGFjayAqLwotICBzdGF0aWMgaW50Ci0gIGZ0X2x6d3N0YXRlX3N0YWNrX2dyb3coIEZUX0x6d1N0YXRlICBzdGF0ZSApCi0gIHsKLSAgICBpZiAoIHN0YXRlLT5zdGFja190b3AgPj0gc3RhdGUtPnN0YWNrX3NpemUgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RhdGUtPm1lbW9yeTsKLSAgICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgICBGVF9PZmZzZXQgIG9sZF9zaXplID0gc3RhdGUtPnN0YWNrX3NpemU7Ci0gICAgICBGVF9PZmZzZXQgIG5ld19zaXplID0gb2xkX3NpemU7Ci0KLSAgICAgIG5ld19zaXplID0gbmV3X3NpemUgKyAoIG5ld19zaXplID4+IDEgKSArIDQ7Ci0KLSAgICAgIGlmICggc3RhdGUtPnN0YWNrID09IHN0YXRlLT5zdGFja18wICkKLSAgICAgIHsKLSAgICAgICAgc3RhdGUtPnN0YWNrID0gTlVMTDsKLSAgICAgICAgb2xkX3NpemUgICAgID0gMDsKLSAgICAgIH0KLQotICAgICAgLyogcmVxdWlyZW1lbnQgb2YgdGhlIGNoYXJhY3RlciBzdGFjayBsYXJnZXIgdGhhbiAxPDxMWldfTUFYX0JJVFMgKi8KLSAgICAgIC8qIGltcGxpZXMgYnVnIGluIHRoZSBkZWNvbXByZXNzaW9uIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIG5ld19zaXplID4gKCAxIDw8IExaV19NQVhfQklUUyApICkKLSAgICAgIHsKLSAgICAgICAgbmV3X3NpemUgPSAxIDw8IExaV19NQVhfQklUUzsKLSAgICAgICAgaWYgKCBuZXdfc2l6ZSA9PSBvbGRfc2l6ZSApCi0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBzdGF0ZS0+c3RhY2ssIG9sZF9zaXplLCBuZXdfc2l6ZSApICkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICBzdGF0ZS0+c3RhY2tfc2l6ZSA9IG5ld19zaXplOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogZ3JvdyB0aGUgcHJlZml4L3N1ZmZpeCBhcnJheXMgKi8KLSAgc3RhdGljIGludAotICBmdF9sendzdGF0ZV9wcmVmaXhfZ3JvdyggRlRfTHp3U3RhdGUgIHN0YXRlICkKLSAgewotICAgIEZUX1VJbnQgICAgb2xkX3NpemUgPSBzdGF0ZS0+cHJlZml4X3NpemU7Ci0gICAgRlRfVUludCAgICBuZXdfc2l6ZSA9IG9sZF9zaXplOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ICAgPSBzdGF0ZS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgIGlmICggbmV3X3NpemUgPT0gMCApICAvKiBmaXJzdCBhbGxvY2F0aW9uIC0+IDkgYml0cyAqLwotICAgICAgbmV3X3NpemUgPSA1MTI7Ci0gICAgZWxzZQotICAgICAgbmV3X3NpemUgKz0gbmV3X3NpemUgPj4gMjsgIC8qIGRvbid0IGdyb3cgdG9vIGZhc3QgKi8KLQotICAgIC8qCi0gICAgICogIE5vdGUgdGhhdCB0aGUgYHN1ZmZpeCcgYXJyYXkgaXMgbG9jYXRlZCBpbiB0aGUgc2FtZSBtZW1vcnkgYmxvY2sKLSAgICAgKiAgcG9pbnRlZCB0byBieSBgcHJlZml4Jy4KLSAgICAgKgotICAgICAqICBJIGtub3cgdGhhdCBzaXplb2YoRlRfQnl0ZSkgPT0gMSBieSBkZWZpbml0aW9uLCBidXQgaXQgaXMgY2xlYXJlcgotICAgICAqICB0byB3cml0ZSBpdCBsaXRlcmFsbHkuCi0gICAgICoKLSAgICAgKi8KLSAgICBpZiAoIEZUX1JFQUxMT0NfTVVMVCggc3RhdGUtPnByZWZpeCwgb2xkX3NpemUsIG5ld19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGVF9VU2hvcnQgKSArIHNpemVvZiAoIEZUX0J5dGUgKSApICkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIG5vdyBhZGp1c3QgYHN1ZmZpeCcgYW5kIG1vdmUgdGhlIGRhdGEgYWNjb3JkaW5nbHkgKi8KLSAgICBzdGF0ZS0+c3VmZml4ID0gKEZUX0J5dGUqKSggc3RhdGUtPnByZWZpeCArIG5ld19zaXplICk7Ci0KLSAgICBGVF9NRU1fTU9WRSggc3RhdGUtPnN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgc3RhdGUtPnByZWZpeCArIG9sZF9zaXplLAotICAgICAgICAgICAgICAgICBvbGRfc2l6ZSAqIHNpemVvZiAoIEZUX0J5dGUgKSApOwotCi0gICAgc3RhdGUtPnByZWZpeF9zaXplID0gbmV3X3NpemU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGZ0X2x6d3N0YXRlX3Jlc2V0KCBGVF9MendTdGF0ZSAgc3RhdGUgKQotICB7Ci0gICAgc3RhdGUtPmluX2VvZiAgICAgPSAwOwotICAgIHN0YXRlLT5idWZfb2Zmc2V0ID0gMDsKLSAgICBzdGF0ZS0+YnVmX3NpemUgICA9IDA7Ci0gICAgc3RhdGUtPmJ1Zl9jbGVhciAgPSAwOwotICAgIHN0YXRlLT5idWZfdG90YWwgID0gMDsKLSAgICBzdGF0ZS0+c3RhY2tfdG9wICA9IDA7Ci0gICAgc3RhdGUtPm51bV9iaXRzICAgPSBMWldfSU5JVF9CSVRTOwotICAgIHN0YXRlLT5waGFzZSAgICAgID0gRlRfTFpXX1BIQVNFX1NUQVJUOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBmdF9sendzdGF0ZV9pbml0KCBGVF9MendTdGF0ZSAgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzb3VyY2UgKQotICB7Ci0gICAgRlRfWkVSTyggc3RhdGUgKTsKLQotICAgIHN0YXRlLT5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgc3RhdGUtPm1lbW9yeSA9IHNvdXJjZS0+bWVtb3J5OwotCi0gICAgc3RhdGUtPnByZWZpeCAgICAgID0gTlVMTDsKLSAgICBzdGF0ZS0+c3VmZml4ICAgICAgPSBOVUxMOwotICAgIHN0YXRlLT5wcmVmaXhfc2l6ZSA9IDA7Ci0KLSAgICBzdGF0ZS0+c3RhY2sgICAgICA9IHN0YXRlLT5zdGFja18wOwotICAgIHN0YXRlLT5zdGFja19zaXplID0gc2l6ZW9mICggc3RhdGUtPnN0YWNrXzAgKTsKLQotICAgIGZ0X2x6d3N0YXRlX3Jlc2V0KCBzdGF0ZSApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBmdF9sendzdGF0ZV9kb25lKCBGVF9MendTdGF0ZSAgc3RhdGUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdGF0ZS0+bWVtb3J5OwotCi0KLSAgICBmdF9sendzdGF0ZV9yZXNldCggc3RhdGUgKTsKLQotICAgIGlmICggc3RhdGUtPnN0YWNrICE9IHN0YXRlLT5zdGFja18wICkKLSAgICAgIEZUX0ZSRUUoIHN0YXRlLT5zdGFjayApOwotCi0gICAgRlRfRlJFRSggc3RhdGUtPnByZWZpeCApOwotICAgIHN0YXRlLT5zdWZmaXggPSBOVUxMOwotCi0gICAgRlRfWkVSTyggc3RhdGUgKTsKLSAgfQotCi0KLSNkZWZpbmUgRlRMWldfU1RBQ0tfUFVTSCggYyApICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBzdGF0ZS0+c3RhY2tfdG9wID49IHN0YXRlLT5zdGFja19zaXplICYmICAgIFwKLSAgICAgICAgIGZ0X2x6d3N0YXRlX3N0YWNrX2dyb3coIHN0YXRlICkgPCAwICAgKSAgICAgXAotICAgICAgZ290byBFb2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0ZS0+c3RhY2tbc3RhdGUtPnN0YWNrX3RvcCsrXSA9IChGVF9CeXRlKShjKTsgXAotICBGVF9FTkRfU1RNTlQKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUxvbmcgKQotICBmdF9sendzdGF0ZV9pbyggRlRfTHp3U3RhdGUgIHN0YXRlLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBvdXRfc2l6ZSApCi0gIHsKLSAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKLQotICAgIEZUX1VJbnQgIG9sZF9jaGFyID0gc3RhdGUtPm9sZF9jaGFyOwotICAgIEZUX1VJbnQgIG9sZF9jb2RlID0gc3RhdGUtPm9sZF9jb2RlOwotICAgIEZUX1VJbnQgIGluX2NvZGUgID0gc3RhdGUtPmluX2NvZGU7Ci0KLQotICAgIGlmICggb3V0X3NpemUgPT0gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzd2l0Y2ggKCBzdGF0ZS0+cGhhc2UgKQotICAgIHsKLSAgICBjYXNlIEZUX0xaV19QSEFTRV9TVEFSVDoKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSAgIG1heF9iaXRzOwotICAgICAgICBGVF9JbnQzMiAgYzsKLQotCi0gICAgICAgIC8qIHNraXAgbWFnaWMgYnl0ZXMsIGFuZCByZWFkIG1heF9iaXRzICsgYmxvY2tfZmxhZyAqLwotICAgICAgICBpZiAoIEZUX1N0cmVhbV9TZWVrKCBzdGF0ZS0+c291cmNlLCAyICkgIT0gMCAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgRlRfU3RyZWFtX1RyeVJlYWQoIHN0YXRlLT5zb3VyY2UsICZtYXhfYml0cywgMSApICE9IDEgKQotICAgICAgICAgIGdvdG8gRW9mOwotCi0gICAgICAgIHN0YXRlLT5tYXhfYml0cyAgID0gbWF4X2JpdHMgJiBMWldfQklUX01BU0s7Ci0gICAgICAgIHN0YXRlLT5ibG9ja19tb2RlID0gbWF4X2JpdHMgJiBMWldfQkxPQ0tfTUFTSzsKLSAgICAgICAgc3RhdGUtPm1heF9mcmVlICAgPSAoRlRfVUludCkoICggMVVMIDw8IHN0YXRlLT5tYXhfYml0cyApIC0gMjU2ICk7Ci0KLSAgICAgICAgaWYgKCBzdGF0ZS0+bWF4X2JpdHMgPiBMWldfTUFYX0JJVFMgKQotICAgICAgICAgIGdvdG8gRW9mOwotCi0gICAgICAgIHN0YXRlLT5udW1fYml0cyA9IExaV19JTklUX0JJVFM7Ci0gICAgICAgIHN0YXRlLT5mcmVlX2VudCA9ICggc3RhdGUtPmJsb2NrX21vZGUgPyBMWldfRklSU1QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExaV19DTEVBUiApIC0gMjU2OwotICAgICAgICBpbl9jb2RlICA9IDA7Ci0KLSAgICAgICAgc3RhdGUtPmZyZWVfYml0cyA9IHN0YXRlLT5udW1fYml0cyA8IHN0YXRlLT5tYXhfYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlRfVUludCkoICggMVVMIDw8IHN0YXRlLT5udW1fYml0cyApIC0gMjU2ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhdGUtPm1heF9mcmVlICsgMTsKLQotICAgICAgICBjID0gZnRfbHp3c3RhdGVfZ2V0X2NvZGUoIHN0YXRlICk7Ci0gICAgICAgIGlmICggYyA8IDAgfHwgYyA+IDI1NSApCi0gICAgICAgICAgZ290byBFb2Y7Ci0KLSAgICAgICAgb2xkX2NvZGUgPSBvbGRfY2hhciA9IChGVF9VSW50KWM7Ci0KLSAgICAgICAgaWYgKCBidWZmZXIgKQotICAgICAgICAgIGJ1ZmZlcltyZXN1bHRdID0gKEZUX0J5dGUpb2xkX2NoYXI7Ci0KLSAgICAgICAgaWYgKCArK3Jlc3VsdCA+PSBvdXRfc2l6ZSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIHN0YXRlLT5waGFzZSA9IEZUX0xaV19QSEFTRV9DT0RFOwotICAgICAgfQotICAgICAgLyogZmFsbC10aHJvdWdoICovCi0KLSAgICBjYXNlIEZUX0xaV19QSEFTRV9DT0RFOgotICAgICAgewotICAgICAgICBGVF9JbnQzMiAgYzsKLSAgICAgICAgRlRfVUludCAgIGNvZGU7Ci0KLQotICAgICAgTmV4dENvZGU6Ci0gICAgICAgIGMgPSBmdF9sendzdGF0ZV9nZXRfY29kZSggc3RhdGUgKTsKLSAgICAgICAgaWYgKCBjIDwgMCApCi0gICAgICAgICAgZ290byBFb2Y7Ci0KLSAgICAgICAgY29kZSA9IChGVF9VSW50KWM7Ci0KLSAgICAgICAgaWYgKCBjb2RlID09IExaV19DTEVBUiAmJiBzdGF0ZS0+YmxvY2tfbW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3aHkgbm90IExaV19GSVJTVC0yNTYgPyAqLwotICAgICAgICAgIHN0YXRlLT5mcmVlX2VudCAgPSAoIExaV19GSVJTVCAtIDEgKSAtIDI1NjsKLSAgICAgICAgICBzdGF0ZS0+YnVmX2NsZWFyID0gMTsKLQotICAgICAgICAgIC8qIG5vdCBxdWl0ZSByaWdodCwgYnV0IGF0IGxlYXN0IG1vcmUgcHJlZGljdGFibGUgKi8KLSAgICAgICAgICBvbGRfY29kZSA9IDA7Ci0gICAgICAgICAgb2xkX2NoYXIgPSAwOwotCi0gICAgICAgICAgZ290byBOZXh0Q29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIGluX2NvZGUgPSBjb2RlOyAvKiBzYXZlIGNvZGUgZm9yIGxhdGVyICovCi0KLSAgICAgICAgaWYgKCBjb2RlID49IDI1NlUgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBLd0t3S3dLICovCi0gICAgICAgICAgaWYgKCBjb2RlIC0gMjU2VSA+PSBzdGF0ZS0+ZnJlZV9lbnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNvcnJ1cHRlZCBMWlcgc3RyZWFtICovCi0gICAgICAgICAgICBpZiAoIGNvZGUgLSAyNTZVID4gc3RhdGUtPmZyZWVfZW50ICkKLSAgICAgICAgICAgICAgZ290byBFb2Y7Ci0KLSAgICAgICAgICAgIEZUTFpXX1NUQUNLX1BVU0goIG9sZF9jaGFyICk7Ci0gICAgICAgICAgICBjb2RlID0gb2xkX2NvZGU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgd2hpbGUgKCBjb2RlID49IDI1NlUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggIXN0YXRlLT5wcmVmaXggKQotICAgICAgICAgICAgICBnb3RvIEVvZjsKLQotICAgICAgICAgICAgRlRMWldfU1RBQ0tfUFVTSCggc3RhdGUtPnN1ZmZpeFtjb2RlIC0gMjU2XSApOwotICAgICAgICAgICAgY29kZSA9IHN0YXRlLT5wcmVmaXhbY29kZSAtIDI1Nl07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb2xkX2NoYXIgPSBjb2RlOwotICAgICAgICBGVExaV19TVEFDS19QVVNIKCBvbGRfY2hhciApOwotCi0gICAgICAgIHN0YXRlLT5waGFzZSA9IEZUX0xaV19QSEFTRV9TVEFDSzsKLSAgICAgIH0KLSAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLwotCi0gICAgY2FzZSBGVF9MWldfUEhBU0VfU1RBQ0s6Ci0gICAgICB7Ci0gICAgICAgIHdoaWxlICggc3RhdGUtPnN0YWNrX3RvcCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdGUtPnN0YWNrX3RvcC0tOwotCi0gICAgICAgICAgaWYgKCBidWZmZXIgKQotICAgICAgICAgICAgYnVmZmVyW3Jlc3VsdF0gPSBzdGF0ZS0+c3RhY2tbc3RhdGUtPnN0YWNrX3RvcF07Ci0KLSAgICAgICAgICBpZiAoICsrcmVzdWx0ID09IG91dF9zaXplICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdyBjcmVhdGUgbmV3IGVudHJ5ICovCi0gICAgICAgIGlmICggc3RhdGUtPmZyZWVfZW50IDwgc3RhdGUtPm1heF9mcmVlICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggc3RhdGUtPmZyZWVfZW50ID49IHN0YXRlLT5wcmVmaXhfc2l6ZSAmJgotICAgICAgICAgICAgICAgZnRfbHp3c3RhdGVfcHJlZml4X2dyb3coIHN0YXRlICkgPCAwICApCi0gICAgICAgICAgICBnb3RvIEVvZjsKLQotICAgICAgICAgIEZUX0FTU0VSVCggc3RhdGUtPmZyZWVfZW50IDwgc3RhdGUtPnByZWZpeF9zaXplICk7Ci0KLSAgICAgICAgICBzdGF0ZS0+cHJlZml4W3N0YXRlLT5mcmVlX2VudF0gPSAoRlRfVVNob3J0KW9sZF9jb2RlOwotICAgICAgICAgIHN0YXRlLT5zdWZmaXhbc3RhdGUtPmZyZWVfZW50XSA9IChGVF9CeXRlKSAgb2xkX2NoYXI7Ci0KLSAgICAgICAgICBzdGF0ZS0+ZnJlZV9lbnQgKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIG9sZF9jb2RlID0gaW5fY29kZTsKLQotICAgICAgICBzdGF0ZS0+cGhhc2UgPSBGVF9MWldfUEhBU0VfQ09ERTsKLSAgICAgICAgZ290byBOZXh0Q29kZTsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6ICAvKiBzdGF0ZSA9PSBFT0YgKi8KLSAgICAgIDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBzdGF0ZS0+b2xkX2NvZGUgPSBvbGRfY29kZTsKLSAgICBzdGF0ZS0+b2xkX2NoYXIgPSBvbGRfY2hhcjsKLSAgICBzdGF0ZS0+aW5fY29kZSAgPSBpbl9jb2RlOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBFb2Y6Ci0gICAgc3RhdGUtPnBoYXNlID0gRlRfTFpXX1BIQVNFX0VPRjsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9sencvZnR6b3Blbi5oIGIvc3JjL2x6dy9mdHpvcGVuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMDg4NjIuLjAwMDAwMDAKLS0tIGEvc3JjL2x6dy9mdHpvcGVuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR6b3Blbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN1cHBvcnQgZm9yIC5aIGNvbXByZXNzZWQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgb3B0aW9uYWwgY29tcG9uZW50IHJlbGllcyBvbiBOZXRCU0QncyB6b3BlbigpLiAgSXQgc2hvdWxkIG1haW5seSAgKi8KLS8qICBiZSB1c2VkIHRvIHBhcnNlIGNvbXByZXNzZWQgUENGIGZvbnRzLCBhcyBmb3VuZCB3aXRoIG1hbnkgWDExIHNlcnZlciAgICovCi0vKiAgZGlzdHJpYnV0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgRlRaT1BFTl9IXwotI2RlZmluZSBGVFpPUEVOX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0KLSAgLyoKLSAgICogIFRoaXMgaXMgYSBjb21wbGV0ZSByZS1pbXBsZW1lbnRhdGlvbiBvZiB0aGUgTFpXIGZpbGUgcmVhZGVyLAotICAgKiAgc2luY2UgdGhlIG9sZCBvbmUgd2FzIGluY3JlZGlibHkgYmFkbHkgd3JpdHRlbiwgdXNpbmcKLSAgICogIDQwMCBLQnl0ZSBvZiBoZWFwIG1lbW9yeSBiZWZvcmUgZGVjb21wcmVzc2luZyBhbnl0aGluZy4KLSAgICoKLSAgICovCi0KLSNkZWZpbmUgRlRfTFpXX0lOX0JVRkZfU0laRSAgICAgICAgNjQKLSNkZWZpbmUgRlRfTFpXX0RFRkFVTFRfU1RBQ0tfU0laRSAgNjQKLQotI2RlZmluZSBMWldfSU5JVF9CSVRTICAgICA5Ci0jZGVmaW5lIExaV19NQVhfQklUUyAgICAgIDE2Ci0KLSNkZWZpbmUgTFpXX0NMRUFSICAgICAgICAgMjU2Ci0jZGVmaW5lIExaV19GSVJTVCAgICAgICAgIDI1NwotCi0jZGVmaW5lIExaV19CSVRfTUFTSyAgICAgIDB4MUYKLSNkZWZpbmUgTFpXX0JMT0NLX01BU0sgICAgMHg4MAotI2RlZmluZSBMWldfTUFTSyggbiApICAgICAoICggMVUgPDwgKG4pICkgLSAxVSApCi0KLQotICB0eXBlZGVmIGVudW0gIEZUX0x6d1BoYXNlXwotICB7Ci0gICAgRlRfTFpXX1BIQVNFX1NUQVJUID0gMCwKLSAgICBGVF9MWldfUEhBU0VfQ09ERSwKLSAgICBGVF9MWldfUEhBU0VfU1RBQ0ssCi0gICAgRlRfTFpXX1BIQVNFX0VPRgotCi0gIH0gRlRfTHp3UGhhc2U7Ci0KLQotICAvKgotICAgKiAgc3RhdGUgb2YgTFpXIGRlY29tcHJlc3NvcgotICAgKgotICAgKiAgc21hbGwgdGVjaG5pY2FsIG5vdGUKLSAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAqCi0gICAqICBXZSB1c2UgYSBmZXcgdHJpY2tzIGluIHRoaXMgaW1wbGVtZW50YXRpb24gdGhhdCBhcmUgZXhwbGFpbmVkIGhlcmUgdG8KLSAgICogIGVhc2UgZGVidWdnaW5nIGFuZCBtYWludGVuYW5jZS4KLSAgICoKLSAgICogIC0gRmlyc3Qgb2YgYWxsLCB0aGUgYHByZWZpeCcgYW5kIGBzdWZmaXgnIGFycmF5cyBjb250YWluIHRoZSBzdWZmaXgKLSAgICogICAgYW5kIHByZWZpeCBmb3IgY29kZXMgb3ZlciAyNTY7IHRoaXMgbWVhbnMgdGhhdAotICAgKgotICAgKiAgICAgIHByZWZpeF9vZihjb2RlKSA9PSBzdGF0ZS0+cHJlZml4W2NvZGUtMjU2XQotICAgKiAgICAgIHN1ZmZpeF9vZihjb2RlKSA9PSBzdGF0ZS0+c3VmZml4W2NvZGUtMjU2XQotICAgKgotICAgKiAgICBFYWNoIHByZWZpeCBpcyBhIDE2LWJpdCBjb2RlLCBhbmQgZWFjaCBzdWZmaXggYW4gOC1iaXQgYnl0ZS4KLSAgICoKLSAgICogICAgQm90aCBhcnJheXMgYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBtZW1vcnkgYmxvY2ssIHBvaW50ZWQgdG8gYnkKLSAgICogICAgYHN0YXRlLT5wcmVmaXgnLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgZXF1YWxpdHkgaXMgYWx3YXlzCi0gICAqICAgIHRydWU6Ci0gICAqCi0gICAqICAgICAgc3RhdGUtPnN1ZmZpeCA9PSAoRlRfQnl0ZSopKHN0YXRlLT5wcmVmaXggKyBzdGF0ZS0+cHJlZml4X3NpemUpCi0gICAqCi0gICAqICAgIE9mIGNvdXJzZSwgc3RhdGUtPnByZWZpeF9zaXplIGlzIHRoZSBudW1iZXIgb2YgcHJlZml4L3N1ZmZpeCBzbG90cwotICAgKiAgICBpbiB0aGUgYXJyYXlzLCBjb3JyZXNwb25kaW5nIHRvIGNvZGVzIDI1Ni4uMjU1K3ByZWZpeF9zaXplLgotICAgKgotICAgKiAgLSBgZnJlZV9lbnQnIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBmcmVlIGVudHJ5IGluIHRoZSBgcHJlZml4JwotICAgKiAgICBhbmQgYHN1ZmZpeCcgYXJyYXlzLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGBuZXh0IGZyZWUKLSAgICogICAgY29kZScgaXMgcmVhbGx5IGAyNTYrZnJlZV9lbnQnLgotICAgKgotICAgKiAgICBNb3Jlb3ZlciwgYG1heF9mcmVlJyBpcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGBmcmVlX2VudCcgY2FuIHJlYWNoLgotICAgKgotICAgKiAgICBgbWF4X2ZyZWUnIGNvcnJlc3BvbmRzIHRvIGAoMSA8PCBtYXhfYml0cykgLSAyNTYnLiAgTm90ZSB0aGF0IHRoaXMKLSAgICogICAgdmFsdWUgaXMgYWx3YXlzIDw9IDB4RkYwMCwgd2hpY2ggbWVhbnMgdGhhdCBib3RoIGBmcmVlX2VudCcgYW5kCi0gICAqICAgIGBtYXhfZnJlZScgY2FuIGJlIHN0b3JlZCBpbiBhbiBGVF9VSW50IHZhcmlhYmxlLCBldmVuIG9uIDE2LWJpdAotICAgKiAgICBtYWNoaW5lcy4KLSAgICoKLSAgICogICAgSWYgYGZyZWVfZW50ID09IG1heF9mcmVlJywgeW91IGNhbm5vdCBhZGQgbmV3IGNvZGVzIHRvIHRoZQotICAgKiAgICBwcmVmaXgvc3VmZml4IHRhYmxlLgotICAgKgotICAgKiAgLSBgbnVtX2JpdHMnIGlzIHRoZSBjdXJyZW50IG51bWJlciBvZiBjb2RlIGJpdHMsIHN0YXJ0aW5nIGF0IDkgYW5kCi0gICAqICAgIGdyb3dpbmcgZWFjaCB0aW1lIGBmcmVlX2VudCcgcmVhY2hlcyB0aGUgdmFsdWUgb2YgYGZyZWVfYml0cycuICBUaGUKLSAgICogICAgbGF0dGVyIGlzIGNvbXB1dGVkIGFzIGZvbGxvd3MKLSAgICoKLSAgICogICAgICBpZiBudW1fYml0cyA8IG1heF9iaXRzOgotICAgKiAgICAgICAgIGZyZWVfYml0cyA9ICgxIDw8IG51bV9iaXRzKS0yNTYKLSAgICogICAgICBlbHNlOgotICAgKiAgICAgICAgIGZyZWVfYml0cyA9IG1heF9mcmVlICsgMQotICAgKgotICAgKiAgICBTaW5jZSB0aGUgdmFsdWUgb2YgYG1heF9mcmVlICsgMScgY2FuIG5ldmVyIGJlIHJlYWNoZWQgYnkKLSAgICogICAgYGZyZWVfZW50JywgYG51bV9iaXRzJyBjYW5ub3QgZ3JvdyBsYXJnZXIgdGhhbiBgbWF4X2JpdHMnLgotICAgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfTHp3U3RhdGVSZWNfCi0gIHsKLSAgICBGVF9MendQaGFzZSAgcGhhc2U7Ci0gICAgRlRfSW50ICAgICAgIGluX2VvZjsKLQotICAgIEZUX0J5dGUgICAgICBidWZfdGFiWzE2XTsKLSAgICBGVF9VSW50ICAgICAgYnVmX29mZnNldDsKLSAgICBGVF9VSW50ICAgICAgYnVmX3NpemU7Ci0gICAgRlRfQm9vbCAgICAgIGJ1Zl9jbGVhcjsKLSAgICBGVF9PZmZzZXQgICAgYnVmX3RvdGFsOwotCi0gICAgRlRfVUludCAgICAgIG1heF9iaXRzOyAgICAvKiBtYXggY29kZSBiaXRzLCBmcm9tIGZpbGUgaGVhZGVyICAgKi8KLSAgICBGVF9JbnQgICAgICAgYmxvY2tfbW9kZTsgIC8qIGJsb2NrIG1vZGUgZmxhZywgZnJvbSBmaWxlIGhlYWRlciAqLwotICAgIEZUX1VJbnQgICAgICBtYXhfZnJlZTsgICAgLyogKDEgPDwgbWF4X2JpdHMpIC0gMjU2ICAgICAgICAgICAgICovCi0KLSAgICBGVF9VSW50ICAgICAgbnVtX2JpdHM7ICAgIC8qIGN1cnJlbnQgY29kZSBiaXQgbnVtYmVyICovCi0gICAgRlRfVUludCAgICAgIGZyZWVfZW50OyAgICAvKiBpbmRleCBvZiBuZXh0IGZyZWUgZW50cnkgKi8KLSAgICBGVF9VSW50ICAgICAgZnJlZV9iaXRzOyAgIC8qIGlmIHJlYWNoZWQgYnkgZnJlZV9lbnQsIGluY3JlbWVudCBudW1fYml0cyAqLwotICAgIEZUX1VJbnQgICAgICBvbGRfY29kZTsKLSAgICBGVF9VSW50ICAgICAgb2xkX2NoYXI7Ci0gICAgRlRfVUludCAgICAgIGluX2NvZGU7Ci0KLSAgICBGVF9VU2hvcnQqICAgcHJlZml4OyAgICAgIC8qIGFsd2F5cyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgLyByZWFsbG9jYXRlZCAqLwotICAgIEZUX0J5dGUqICAgICBzdWZmaXg7ICAgICAgLyogc3VmZml4ID0gKEZUX0J5dGUqKShwcmVmaXggKyBwcmVmaXhfc2l6ZSkgICovCi0gICAgRlRfVUludCAgICAgIHByZWZpeF9zaXplOyAvKiBudW1iZXIgb2Ygc2xvdHMgaW4gYHByZWZpeCcgb3IgYHN1ZmZpeCcgICAgKi8KLQotICAgIEZUX0J5dGUqICAgICBzdGFjazsgICAgICAgLyogY2hhcmFjdGVyIHN0YWNrICovCi0gICAgRlRfVUludCAgICAgIHN0YWNrX3RvcDsKLSAgICBGVF9PZmZzZXQgICAgc3RhY2tfc2l6ZTsKLSAgICBGVF9CeXRlICAgICAgc3RhY2tfMFtGVF9MWldfREVGQVVMVF9TVEFDS19TSVpFXTsgLyogbWluaW1pemUgaGVhcCBhbGxvYyAqLwotCi0gICAgRlRfU3RyZWFtICAgIHNvdXJjZTsgICAgICAvKiBzb3VyY2Ugc3RyZWFtICovCi0gICAgRlRfTWVtb3J5ICAgIG1lbW9yeTsKLQotICB9IEZUX0x6d1N0YXRlUmVjLCAqRlRfTHp3U3RhdGU7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGZ0X2x6d3N0YXRlX2luaXQoIEZUX0x6d1N0YXRlICBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHNvdXJjZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgZnRfbHp3c3RhdGVfZG9uZSggRlRfTHp3U3RhdGUgIHN0YXRlICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGZ0X2x6d3N0YXRlX3Jlc2V0KCBGVF9MendTdGF0ZSAgc3RhdGUgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9VTG9uZyApCi0gIGZ0X2x6d3N0YXRlX2lvKCBGVF9MendTdGF0ZSAgc3RhdGUsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIG91dF9zaXplICk7Ci0KLS8qICovCi0KLSNlbmRpZiAvKiBGVFpPUEVOX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvbHp3L3J1bGVzLm1rIGIvc3JjL2x6dy9ydWxlcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiZjY4YS4uMDAwMDAwMAotLS0gYS9zcmMvbHp3L3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIExaVyBzdXBwb3J0IGNvbmZpZ3VyYXRpb24gcnVsZXMKLSMKLQotCi0jIENvcHlyaWdodCAyMDA0LTIwMTcgYnkKLSMgQWxiZXJ0IENoaW4tQS1Zb3VuZy4KLSMKLSMgYmFzZWQgb24gYHNyYy9sencvcnVsZXMubWsnCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBMWlcgZHJpdmVyIGRpcmVjdG9yeQotIwotTFpXX0RJUiA6PSAkKFNSQ19ESVIpL2x6dwotCi0KLSMgY29tcGlsYXRpb24gZmxhZ3MgZm9yIHRoZSBkcml2ZXIKLSMKLUxaV19DT01QSUxFIDo9ICQoQ0MpICQoQU5TSUZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAkSSQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJChMWldfRElSKSkgXAotICAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICQoRlRfQ0ZMQUdTKQotCi0KLSMgTFpXIHN1cHBvcnQgc291cmNlcyAoaS5lLiwgQyBmaWxlcykKLSMKLUxaV19EUlZfU1JDIDo9ICQoTFpXX0RJUikvZnRsencuYwotCi0jIExaVyBzdXBwb3J0IGhlYWRlcnMKLSMKLUxaV19EUlZfSCA6PSAkKExaV19ESVIpL2Z0em9wZW4uaCBcCi0gICAgICAgICAgICAgJChMWldfRElSKS9mdHpvcGVuLmMKLQotCi0jIExaVyBkcml2ZXIgb2JqZWN0KHMpCi0jCi0jICAgTFpXX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcwotIyAgIExaV19EUlZfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHNpbmdsZScgYnVpbGRzCi0jCi1MWldfRFJWX09CSl9NIDo9ICQoT0JKX0RJUikvZnRsencuJE8KLUxaV19EUlZfT0JKX1MgOj0gJChPQkpfRElSKS9mdGx6dy4kTwotCi0jIExaVyBzdXBwb3J0IHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLUxaV19EUlZfU1JDX1MgOj0gJChMWldfRElSKS9mdGx6dy5jCi0KLQotIyBMWlcgc3VwcG9ydCAtIHNpbmdsZSBvYmplY3QKLSMKLSQoTFpXX0RSVl9PQkpfUyk6ICQoTFpXX0RSVl9TUkNfUykgJChMWldfRFJWX1NSQykgJChGUkVFVFlQRV9IKSAkKExaV19EUlZfSCkKLQkkKExaV19DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChMWldfRFJWX1NSQ19TKSkKLQotCi0jIExaVyBzdXBwb3J0IC0gbXVsdGlwbGUgb2JqZWN0cwotIwotJChPQkpfRElSKS8lLiRPOiAkKExaV19ESVIpLyUuYyAkKEZSRUVUWVBFX0gpICQoTFpXX0RSVl9IKQotCSQoTFpXX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkPCkKLQotCi0jIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKLSMKLURSVl9PQkpTX1MgKz0gJChMWldfRFJWX09CSl9TKQotRFJWX09CSlNfTSArPSAkKExaV19EUlZfT0JKX00pCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL0phbWZpbGUgYi9zcmMvb3R2YWxpZC9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzU1ZjJiLi4wMDAwMDAwCi0tLSBhL3NyYy9vdHZhbGlkL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL290dmFsaWQgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIG90dmFsaWQgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IG90dmJhc2UKLSAgICAgICAgICAgICAgIG90dmNvbW1uCi0gICAgICAgICAgICAgICBvdHZnZGVmCi0gICAgICAgICAgICAgICBvdHZncG9zCi0gICAgICAgICAgICAgICBvdHZnc3ViCi0gICAgICAgICAgICAgICBvdHZqc3RmCi0gICAgICAgICAgICAgICBvdHZtYXRoCi0gICAgICAgICAgICAgICBvdHZtb2QKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IG90dmFsaWQgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvb3R2YWxpZCBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9tb2R1bGUubWsgYi9zcmMvb3R2YWxpZC9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTEyNjUuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvbW9kdWxlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIG90dmFsaWQgbW9kdWxlIGRlZmluaXRpb24KLSMKLQotCi0jIENvcHlyaWdodCAyMDA0LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLUZUTU9EVUxFX0hfQ09NTUFORFMgKz0gT1RWQUxJRF9NT0RVTEUKLQotZGVmaW5lIE9UVkFMSURfTU9EVUxFCi0kKE9QRU5fRFJJVkVSKSBGVF9Nb2R1bGVfQ2xhc3MsIG90dl9tb2R1bGVfY2xhc3MgJChDTE9TRV9EUklWRVIpCi0kKEVDSE9fRFJJVkVSKW90dmFsaWQgICAkKEVDSE9fRFJJVkVSX0RFU0MpT3BlblR5cGUgdmFsaWRhdGlvbiBtb2R1bGUkKEVDSE9fRFJJVkVSX0RPTkUpCi1lbmRlZgotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvb3R2YWxpZC5jIGIvc3JjL290dmFsaWQvb3R2YWxpZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTI3NTFhLi4wMDAwMDAwCi0tLSBhL3NyYy9vdHZhbGlkL290dmFsaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90dmFsaWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB2YWxpZGF0b3IgZm9yIE9wZW5UeXBlIHRhYmxlcyAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgIm90dmJhc2UuYyIKLSNpbmNsdWRlICJvdHZjb21tbi5jIgotI2luY2x1ZGUgIm90dmdkZWYuYyIKLSNpbmNsdWRlICJvdHZncG9zLmMiCi0jaW5jbHVkZSAib3R2Z3N1Yi5jIgotI2luY2x1ZGUgIm90dmpzdGYuYyIKLSNpbmNsdWRlICJvdHZtYXRoLmMiCi0jaW5jbHVkZSAib3R2bW9kLmMiCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZhbGlkLmggYi9zcmMvb3R2YWxpZC9vdHZhbGlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTY5Y2MuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvb3R2YWxpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2YWxpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIHRhYmxlIHZhbGlkYXRpb24gKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIE9UVkFMSURfSF8KLSNkZWZpbmUgT1RWQUxJRF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaW5jbHVkZSAib3R2ZXJyb3IuaCIgICAgICAgICAgIC8qIG11c3QgY29tZSBiZWZvcmUgRlRfSU5URVJOQUxfVkFMSURBVEVfSCAqLwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfQkFTRV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKTsKLQotICAvKiBHU1VCIGFuZCBHUE9TIHRhYmxlcyBzaG91bGQgYWxyZWFkeSBiZSB2YWxpZGF0ZWQ7ICovCi0gIC8qIGlmIG1pc3NpbmcsIHNldCBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IHRvIDAgICAgICAgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfR0RFRl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgZ3N1YiwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgZ3BvcywKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfR1BPU192YWxpZGF0ZSggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfR1NVQl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgLyogR1NVQiBhbmQgR1BPUyB0YWJsZXMgc2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkOyAqLwotICAvKiBpZiBtaXNzaW5nLCBzZXQgY29ycmVzcG9uZGluZyBhcmd1bWVudCB0byAwICAgICAgICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X0pTVEZfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgIGdzdWIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgIGdwb3MsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X01BVEhfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICBmdHZhbGlkICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogT1RWQUxJRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvb3R2YmFzZS5jIGIvc3JjL290dmFsaWQvb3R2YmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWRhZDg0Li4wMDAwMDAwCi0tLSBhL3NyYy9vdHZhbGlkL290dmJhc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdHZiYXNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgQkFTRSB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJvdHZhbGlkLmgiCi0jaW5jbHVkZSAib3R2Y29tbW4uaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dmJhc2UKLQotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9CYXNlQ29vcmRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIEJhc2VDb29yZEZvcm1hdDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJCYXNlQ29vcmQiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICBCYXNlQ29vcmRGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIHAgKz0gMjsgICAgIC8qIHNraXAgQ29vcmRpbmF0ZSAqLwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgQmFzZUNvb3JkRm9ybWF0ICkpOwotCi0gICAgc3dpdGNoICggQmFzZUNvb3JkRm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOiAgICAgLyogQmFzZUNvb3JkRm9ybWF0MSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6ICAgICAvKiBCYXNlQ29vcmRGb3JtYXQyICovCi0gICAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsgICAvKiBSZWZlcmVuY2VHbHlwaCwgQmFzZUNvb3JkUG9pbnQgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOiAgICAgLyogQmFzZUNvb3JkRm9ybWF0MyAqLwotICAgICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICAvKiBEZXZpY2VUYWJsZSAqLwotICAgICAgb3R2X0RldmljZV92YWxpZGF0ZSggdGFibGUgKyBGVF9ORVhUX1VTSE9SVCggcCApLCBvdHZhbGlkICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0Jhc2VUYWdMaXN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIEJhc2VUYWdDb3VudDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJCYXNlVGFnTGlzdCIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotCi0gICAgQmFzZVRhZ0NvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKEJhc2VUYWdDb3VudCA9ICVkKVxuIiwgQmFzZVRhZ0NvdW50ICkpOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBCYXNlVGFnQ291bnQgKiA0ICk7ICAgICAgICAgIC8qIEJhc2VsaW5lVGFnICovCi0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0Jhc2VWYWx1ZXNfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBCYXNlQ29vcmRDb3VudDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJCYXNlVmFsdWVzIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0KLSAgICBwICAgICAgICAgICAgICs9IDI7ICAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBEZWZhdWx0SW5kZXggKi8KLSAgICBCYXNlQ29vcmRDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChCYXNlQ29vcmRDb3VudCA9ICVkKVxuIiwgQmFzZUNvb3JkQ291bnQgKSk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIEJhc2VDb29yZENvdW50ICogMiApOwotCi0gICAgLyogQmFzZUNvb3JkICovCi0gICAgZm9yICggOyBCYXNlQ29vcmRDb3VudCA+IDA7IEJhc2VDb29yZENvdW50LS0gKQotICAgICAgb3R2X0Jhc2VDb29yZF92YWxpZGF0ZSggdGFibGUgKyBGVF9ORVhUX1VTSE9SVCggcCApLCBvdHZhbGlkICk7Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X01pbk1heF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgdGFibGVfc2l6ZTsKLSAgICBGVF9VSW50ICAgRmVhdE1pbk1heENvdW50OwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBNaW5Db29yZCApOwotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggTWF4Q29vcmQgKTsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJNaW5NYXgiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDYgKTsKLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIE1pbkNvb3JkICk7Ci0gICAgT1RWX09QVElPTkFMX09GRlNFVCggTWF4Q29vcmQgKTsKLSAgICBGZWF0TWluTWF4Q291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoRmVhdE1pbk1heENvdW50ID0gJWQpXG4iLCBGZWF0TWluTWF4Q291bnQgKSk7Ci0KLSAgICB0YWJsZV9zaXplID0gRmVhdE1pbk1heENvdW50ICogOCArIDY7Ci0KLSAgICBPVFZfU0laRV9DSEVDSyggTWluQ29vcmQgKTsKLSAgICBpZiAoIE1pbkNvb3JkICkKLSAgICAgIG90dl9CYXNlQ29vcmRfdmFsaWRhdGUoIHRhYmxlICsgTWluQ29vcmQsIG90dmFsaWQgKTsKLQotICAgIE9UVl9TSVpFX0NIRUNLKCBNYXhDb29yZCApOwotICAgIGlmICggTWF4Q29vcmQgKQotICAgICAgb3R2X0Jhc2VDb29yZF92YWxpZGF0ZSggdGFibGUgKyBNYXhDb29yZCwgb3R2YWxpZCApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBGZWF0TWluTWF4Q291bnQgKiA4ICk7Ci0KLSAgICAvKiBGZWF0TWluTWF4UmVjb3JkICovCi0gICAgZm9yICggOyBGZWF0TWluTWF4Q291bnQgPiAwOyBGZWF0TWluTWF4Q291bnQtLSApCi0gICAgewotICAgICAgcCArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgRmVhdHVyZVRhYmxlVGFnICovCi0KLSAgICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIE1pbkNvb3JkICk7Ci0gICAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBNYXhDb29yZCApOwotCi0gICAgICBPVFZfU0laRV9DSEVDSyggTWluQ29vcmQgKTsKLSAgICAgIGlmICggTWluQ29vcmQgKQotICAgICAgICBvdHZfQmFzZUNvb3JkX3ZhbGlkYXRlKCB0YWJsZSArIE1pbkNvb3JkLCBvdHZhbGlkICk7Ci0KLSAgICAgIE9UVl9TSVpFX0NIRUNLKCBNYXhDb29yZCApOwotICAgICAgaWYgKCBNYXhDb29yZCApCi0gICAgICAgIG90dl9CYXNlQ29vcmRfdmFsaWRhdGUoIHRhYmxlICsgTWF4Q29vcmQsIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0Jhc2VTY3JpcHRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICB0YWJsZV9zaXplOwotICAgIEZUX1VJbnQgICBCYXNlTGFuZ1N5c0NvdW50OwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBCYXNlVmFsdWVzICAgICk7Ci0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBEZWZhdWx0TWluTWF4ICk7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiQmFzZVNjcmlwdCIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggNiApOwotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIEJhc2VWYWx1ZXMgICAgKTsKLSAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBEZWZhdWx0TWluTWF4ICk7Ci0gICAgQmFzZUxhbmdTeXNDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChCYXNlTGFuZ1N5c0NvdW50ID0gJWQpXG4iLCBCYXNlTGFuZ1N5c0NvdW50ICkpOwotCi0gICAgdGFibGVfc2l6ZSA9IEJhc2VMYW5nU3lzQ291bnQgKiA2ICsgNjsKLQotICAgIE9UVl9TSVpFX0NIRUNLKCBCYXNlVmFsdWVzICk7Ci0gICAgaWYgKCBCYXNlVmFsdWVzICkKLSAgICAgIG90dl9CYXNlVmFsdWVzX3ZhbGlkYXRlKCB0YWJsZSArIEJhc2VWYWx1ZXMsIG90dmFsaWQgKTsKLQotICAgIE9UVl9TSVpFX0NIRUNLKCBEZWZhdWx0TWluTWF4ICk7Ci0gICAgaWYgKCBEZWZhdWx0TWluTWF4ICkKLSAgICAgIG90dl9NaW5NYXhfdmFsaWRhdGUoIHRhYmxlICsgRGVmYXVsdE1pbk1heCwgb3R2YWxpZCApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBCYXNlTGFuZ1N5c0NvdW50ICogNiApOwotCi0gICAgLyogQmFzZUxhbmdTeXNSZWNvcmQgKi8KLSAgICBmb3IgKCA7IEJhc2VMYW5nU3lzQ291bnQgPiAwOyBCYXNlTGFuZ1N5c0NvdW50LS0gKQotICAgIHsKLSAgICAgIHAgKz0gNDsgICAgICAgLyogc2tpcCBCYXNlTGFuZ1N5c1RhZyAqLwotCi0gICAgICBvdHZfTWluTWF4X3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0Jhc2VTY3JpcHRMaXN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIEJhc2VTY3JpcHRDb3VudDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJCYXNlU2NyaXB0TGlzdCIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIEJhc2VTY3JpcHRDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChCYXNlU2NyaXB0Q291bnQgPSAlZClcbiIsIEJhc2VTY3JpcHRDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggQmFzZVNjcmlwdENvdW50ICogNiApOwotCi0gICAgLyogQmFzZVNjcmlwdFJlY29yZCAqLwotICAgIGZvciAoIDsgQmFzZVNjcmlwdENvdW50ID4gMDsgQmFzZVNjcmlwdENvdW50LS0gKQotICAgIHsKLSAgICAgIHAgKz0gNDsgICAgICAgLyogc2tpcCBCYXNlU2NyaXB0VGFnICovCi0KLSAgICAgIC8qIEJhc2VTY3JpcHQgKi8KLSAgICAgIG90dl9CYXNlU2NyaXB0X3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0F4aXNfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICB0YWJsZV9zaXplOwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBCYXNlVGFnTGlzdCApOwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIkF4aXMiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBCYXNlVGFnTGlzdCApOwotCi0gICAgdGFibGVfc2l6ZSA9IDQ7Ci0KLSAgICBPVFZfU0laRV9DSEVDSyggQmFzZVRhZ0xpc3QgKTsKLSAgICBpZiAoIEJhc2VUYWdMaXN0ICkKLSAgICAgIG90dl9CYXNlVGFnTGlzdF92YWxpZGF0ZSggdGFibGUgKyBCYXNlVGFnTGlzdCwgb3R2YWxpZCApOwotCi0gICAgLyogQmFzZVNjcmlwdExpc3QgKi8KLSAgICBvdHZfQmFzZVNjcmlwdExpc3RfdmFsaWRhdGUoIHRhYmxlICsgRlRfTkVYVF9VU0hPUlQoIHAgKSwgb3R2YWxpZCApOwotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl9CQVNFX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICBmdHZhbGlkICkKLSAgewotICAgIE9UVl9WYWxpZGF0b3JSZWMgIG90dmFsaWRyZWM7Ci0gICAgT1RWX1ZhbGlkYXRvciAgICAgb3R2YWxpZCA9ICZvdHZhbGlkcmVjOwotICAgIEZUX0J5dGVzICAgICAgICAgIHAgICAgICAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgICB0YWJsZV9zaXplOwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBIb3JpekF4aXMgKTsKLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIFZlcnRBeGlzICApOwotCi0KLSAgICBvdHZhbGlkLT5yb290ID0gZnR2YWxpZDsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIEJBU0UgdGFibGVcbiIgKSk7Ci0gICAgT1RWX0lOSVQ7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDYgKTsKLQotICAgIGlmICggRlRfTkVYVF9VTE9ORyggcCApICE9IDB4MTAwMDBVTCApICAgICAgLyogVmVyc2lvbiAqLwotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICB0YWJsZV9zaXplID0gNjsKLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIEhvcml6QXhpcyApOwotICAgIE9UVl9TSVpFX0NIRUNLKCBIb3JpekF4aXMgKTsKLSAgICBpZiAoIEhvcml6QXhpcyApCi0gICAgICBvdHZfQXhpc192YWxpZGF0ZSggdGFibGUgKyBIb3JpekF4aXMsIG90dmFsaWQgKTsKLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIFZlcnRBeGlzICk7Ci0gICAgT1RWX1NJWkVfQ0hFQ0soIFZlcnRBeGlzICk7Ci0gICAgaWYgKCBWZXJ0QXhpcyApCi0gICAgICBvdHZfQXhpc192YWxpZGF0ZSggdGFibGUgKyBWZXJ0QXhpcywgb3R2YWxpZCApOwotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvb3R2Y29tbW4uYyBiL3NyYy9vdHZhbGlkL290dmNvbW1uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MDdkMmEuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvb3R2Y29tbW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEwODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Y29tbW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIGNvbW1vbiB0YWJsZXMgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAib3R2Y29tbW4uaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dmNvbW1vbgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBDT1ZFUkFHRSBUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGV4cGVjdGVkX2NvdW50ICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIENvdmVyYWdlRm9ybWF0OwotICAgIEZUX1VJbnQgICB0b3RhbCA9IDA7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiQ292ZXJhZ2UiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICBDb3ZlcmFnZUZvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChmb3JtYXQgJWQpXG4iLCBDb3ZlcmFnZUZvcm1hdCApKTsKLQotICAgIHN3aXRjaCAoIENvdmVyYWdlRm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOiAgICAgLyogQ292ZXJhZ2VGb3JtYXQxICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIEdseXBoQ291bnQ7Ci0gICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICBHbHlwaENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICBPVFZfVFJBQ0UoKCAiIChHbHlwaENvdW50ID0gJWQpXG4iLCBHbHlwaENvdW50ICkpOwotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggR2x5cGhDb3VudCAqIDIgKTsgICAgICAgIC8qIEdseXBoQXJyYXkgKi8KLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IEdseXBoQ291bnQ7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBnaWQ7Ci0KLQotICAgICAgICAgIGdpZCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgaWYgKCBnaWQgPj0gb3R2YWxpZC0+Z2x5cGhfY291bnQgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLSAgICAgICAgfQotCi0gICAgICAgIHRvdGFsID0gR2x5cGhDb3VudDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOiAgICAgLyogQ292ZXJhZ2VGb3JtYXQyICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIG4sIFJhbmdlQ291bnQ7Ci0gICAgICAgIEZUX1VJbnQgIFN0YXJ0LCBFbmQsIFN0YXJ0Q292ZXJhZ2VJbmRleCwgbGFzdCA9IDA7Ci0KLQotICAgICAgICBSYW5nZUNvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICBPVFZfVFJBQ0UoKCAiIChSYW5nZUNvdW50ID0gJWQpXG4iLCBSYW5nZUNvdW50ICkpOwotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggUmFuZ2VDb3VudCAqIDYgKTsKLQotICAgICAgICAvKiBSYW5nZVJlY29yZCAqLwotICAgICAgICBmb3IgKCBuID0gMDsgbiA8IFJhbmdlQ291bnQ7IG4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBTdGFydCAgICAgICAgICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICAgIEVuZCAgICAgICAgICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgU3RhcnRDb3ZlcmFnZUluZGV4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICAgIGlmICggU3RhcnQgPiBFbmQgfHwgU3RhcnRDb3ZlcmFnZUluZGV4ICE9IHRvdGFsICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICAgIGlmICggRW5kID49IG90dmFsaWQtPmdseXBoX2NvdW50ICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0KLSAgICAgICAgICBpZiAoIG4gPiAwICYmIFN0YXJ0IDw9IGxhc3QgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgICAgdG90YWwgKz0gRW5kIC0gU3RhcnQgKyAxOwotICAgICAgICAgIGxhc3QgICA9IEVuZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgLyogR2VuZXJhbGx5LCBhIGNvdmVyYWdlIHRhYmxlIG9mZnNldCBoYXMgYW4gYXNzb2NpYXRlZCBjb3VudCBmaWVsZC4gICovCi0gICAgLyogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIHRhYmxlIHNob3VsZCBtYXRjaCB0aGlzIGZpZWxkLiAgSWYgICAgICovCi0gICAgLyogdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBjb3VudCwgYSB2YWx1ZSBvZiAtMSB0ZWxscyB1cyBub3QgdG8gY2hlY2suICovCi0gICAgaWYgKCBleHBlY3RlZF9jb3VudCAhPSAtMSAmJiAoRlRfVUludClleHBlY3RlZF9jb3VudCAhPSB0b3RhbCApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VSW50ICkKLSAgb3R2X0NvdmVyYWdlX2dldF9maXJzdCggRlRfQnl0ZXMgIHRhYmxlICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLQotICAgIHAgKz0gNDsgICAgIC8qIHNraXAgQ292ZXJhZ2VGb3JtYXQgYW5kIEdseXBoL1JhbmdlQ291bnQgKi8KLQotICAgIHJldHVybiBGVF9ORVhUX1VTSE9SVCggcCApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1VJbnQgKQotICBvdHZfQ292ZXJhZ2VfZ2V0X2xhc3QoIEZUX0J5dGVzICB0YWJsZSApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBDb3ZlcmFnZUZvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRlRfVUludCAgIGNvdW50ICAgICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsgICAgIC8qIEdseXBoL1JhbmdlQ291bnQgKi8KLSAgICBGVF9VSW50ICAgcmVzdWx0ID0gMDsKLQotCi0gICAgc3dpdGNoICggQ292ZXJhZ2VGb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBwICs9ICggY291bnQgLSAxICkgKiAyOwotICAgICAgcmVzdWx0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgcCArPSAoIGNvdW50IC0gMSApICogNiArIDI7Ci0gICAgICByZXN1bHQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUludCApCi0gIG90dl9Db3ZlcmFnZV9nZXRfY291bnQoIEZUX0J5dGVzICB0YWJsZSApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCAgICAgICAgICAgICAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgQ292ZXJhZ2VGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEZUX1VJbnQgICBjb3VudCAgICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7ICAgICAvKiBHbHlwaC9SYW5nZUNvdW50ICovCi0gICAgRlRfVUludCAgIHJlc3VsdCAgICAgICAgID0gMDsKLQotCi0gICAgc3dpdGNoICggQ292ZXJhZ2VGb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gY291bnQ7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIFN0YXJ0LCBFbmQ7Ci0KLQotICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgIHsKLSAgICAgICAgICBTdGFydCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgRW5kICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICAgIHAgICAgKz0gMjsgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgU3RhcnRDb3ZlcmFnZUluZGV4ICovCi0KLSAgICAgICAgICByZXN1bHQgKz0gRW5kIC0gU3RhcnQgKyAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgIENMQVNTIERFRklOSVRJT04gVEFCTEUgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgb3R2X0NsYXNzRGVmX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIENsYXNzRm9ybWF0OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIkNsYXNzRGVmIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgQ2xhc3NGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgQ2xhc3NGb3JtYXQgKSk7Ci0KLSAgICBzd2l0Y2ggKCBDbGFzc0Zvcm1hdCApCi0gICAgewotICAgIGNhc2UgMTogICAgIC8qIENsYXNzRGVmRm9ybWF0MSAqLwotICAgICAgewotICAgICAgICBGVF9VSW50ICBTdGFydEdseXBoOwotICAgICAgICBGVF9VSW50ICBHbHlwaENvdW50OwotCi0KLSAgICAgICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0KLSAgICAgICAgU3RhcnRHbHlwaCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIEdseXBoQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAgIE9UVl9UUkFDRSgoICIgKEdseXBoQ291bnQgPSAlZClcbiIsIEdseXBoQ291bnQgKSk7Ci0KLSAgICAgICAgT1RWX0xJTUlUX0NIRUNLKCBHbHlwaENvdW50ICogMiApOyAgICAvKiBDbGFzc1ZhbHVlQXJyYXkgKi8KLQotICAgICAgICBpZiAoIFN0YXJ0R2x5cGggKyBHbHlwaENvdW50IC0gMSA+PSBvdHZhbGlkLT5nbHlwaF9jb3VudCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOiAgICAgLyogQ2xhc3NEZWZGb3JtYXQyICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIG4sIENsYXNzUmFuZ2VDb3VudDsKLSAgICAgICAgRlRfVUludCAgU3RhcnQsIEVuZCwgbGFzdCA9IDA7Ci0KLQotICAgICAgICBDbGFzc1JhbmdlQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAgIE9UVl9UUkFDRSgoICIgKENsYXNzUmFuZ2VDb3VudCA9ICVkKVxuIiwgQ2xhc3NSYW5nZUNvdW50ICkpOwotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggQ2xhc3NSYW5nZUNvdW50ICogNiApOwotCi0gICAgICAgIC8qIENsYXNzUmFuZ2VSZWNvcmQgKi8KLSAgICAgICAgZm9yICggbiA9IDA7IG4gPCBDbGFzc1JhbmdlQ291bnQ7IG4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBTdGFydCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgRW5kICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICAgIHAgICAgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIENsYXNzICovCi0KLSAgICAgICAgICBpZiAoIFN0YXJ0ID4gRW5kIHx8ICggbiA+IDAgJiYgU3RhcnQgPD0gbGFzdCApICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICAgIGlmICggRW5kID49IG90dmFsaWQtPmdseXBoX2NvdW50ICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0KLSAgICAgICAgICBsYXN0ID0gRW5kOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGdseXBoIGluZGljZXMgdXNlZCBhcyBpbnB1dCB0byBjbGFzcyBkZWZpbml0aW9uICAgKi8KLSAgICAvKiB0YWJsZXMgc2luY2UgZXZlbiBpbnZhbGlkIGdseXBoIGluZGljZXMgcmV0dXJuIGEgbWVhbmluZ2Z1bCByZXN1bHQgKi8KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgREVWSUNFIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfRGV2aWNlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBTdGFydFNpemUsIEVuZFNpemUsIERlbHRhRm9ybWF0LCBjb3VudDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJEZXZpY2UiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDggKTsKLSAgICBTdGFydFNpemUgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRW5kU2l6ZSAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIERlbHRhRm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIGlmICggRGVsdGFGb3JtYXQgPCAxIHx8IERlbHRhRm9ybWF0ID4gMyApCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIGlmICggRW5kU2l6ZSA8IFN0YXJ0U2l6ZSApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBjb3VudCA9IEVuZFNpemUgLSBTdGFydFNpemUgKyAxOwotICAgIE9UVl9MSU1JVF9DSEVDSyggKCAxIDw8IERlbHRhRm9ybWF0ICkgKiBjb3VudCAvIDggKTsgIC8qIERlbHRhVmFsdWUgKi8KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgTE9PS1VQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiB1c2VzIG90dmFsaWQtPnR5cGVfY291bnQgKi8KLSAgLyogdXNlcyBvdHZhbGlkLT50eXBlX2Z1bmNzICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgb3R2X0xvb2t1cF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgTG9va3VwVHlwZSwgU3ViVGFibGVDb3VudDsKLSAgICBPVFZfVmFsaWRhdGVfRnVuYyAgdmFsaWRhdGU7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiTG9va3VwIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA2ICk7Ci0gICAgTG9va3VwVHlwZSAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgcCAgICAgICAgICAgICs9IDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgTG9va3VwRmxhZyAqLwotICAgIFN1YlRhYmxlQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAodHlwZSAlZClcbiIsIExvb2t1cFR5cGUgKSk7Ci0KLSAgICBpZiAoIExvb2t1cFR5cGUgPT0gMCB8fCBMb29rdXBUeXBlID4gb3R2YWxpZC0+dHlwZV9jb3VudCApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICB2YWxpZGF0ZSA9IG90dmFsaWQtPnR5cGVfZnVuY3NbTG9va3VwVHlwZSAtIDFdOwotCi0gICAgT1RWX1RSQUNFKCggIiAoU3ViVGFibGVDb3VudCA9ICVkKVxuIiwgU3ViVGFibGVDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggU3ViVGFibGVDb3VudCAqIDIgKTsKLQotICAgIC8qIFN1YlRhYmxlICovCi0gICAgZm9yICggOyBTdWJUYWJsZUNvdW50ID4gMDsgU3ViVGFibGVDb3VudC0tICkKLSAgICAgIHZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKiB1c2VzIHZhbGlkLT5sb29rdXBfY291bnQgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfTG9va3VwTGlzdF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIExvb2t1cENvdW50OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIkxvb2t1cExpc3QiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBMb29rdXBDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChMb29rdXBDb3VudCA9ICVkKVxuIiwgTG9va3VwQ291bnQgKSk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIExvb2t1cENvdW50ICogMiApOwotCi0gICAgb3R2YWxpZC0+bG9va3VwX2NvdW50ID0gTG9va3VwQ291bnQ7Ci0KLSAgICAvKiBMb29rdXAgKi8KLSAgICBmb3IgKCA7IExvb2t1cENvdW50ID4gMDsgTG9va3VwQ291bnQtLSApCi0gICAgICBvdHZfTG9va3VwX3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICBvdHZfTG9va3VwTGlzdF9nZXRfY291bnQoIEZUX0J5dGVzICB0YWJsZSApCi0gIHsKLSAgICByZXR1cm4gRlRfTkVYVF9VU0hPUlQoIHRhYmxlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIEZFQVRVUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHVzZXMgb3R2YWxpZC0+bG9va3VwX2NvdW50ICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgb3R2X0ZlYXR1cmVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBMb29rdXBDb3VudDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJGZWF0dXJlIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgcCAgICAgICAgICAgKz0gMjsgICAgICAgICAgICAgICAgICAgLyogc2tpcCBGZWF0dXJlUGFyYW1zICh1bnVzZWQpICovCi0gICAgTG9va3VwQ291bnQgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKExvb2t1cENvdW50ID0gJWQpXG4iLCBMb29rdXBDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggTG9va3VwQ291bnQgKiAyICk7Ci0KLSAgICAvKiBMb29rdXBMaXN0SW5kZXggKi8KLSAgICBmb3IgKCA7IExvb2t1cENvdW50ID4gMDsgTG9va3VwQ291bnQtLSApCi0gICAgICBpZiAoIEZUX05FWFRfVVNIT1JUKCBwICkgPj0gb3R2YWxpZC0+bG9va3VwX2NvdW50ICkKLSAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIG90dl9GZWF0dXJlX2dldF9jb3VudCggRlRfQnl0ZXMgIHRhYmxlICkKLSAgewotICAgIHJldHVybiBGVF9ORVhUX1VTSE9SVCggdGFibGUgKTsKLSAgfQotCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5sb29rdXBfY291bnQgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfRmVhdHVyZUxpc3RfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgIGxvb2t1cHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBGZWF0dXJlQ291bnQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiRmVhdHVyZUxpc3QiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBGZWF0dXJlQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoRmVhdHVyZUNvdW50ID0gJWQpXG4iLCBGZWF0dXJlQ291bnQgKSk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIEZlYXR1cmVDb3VudCAqIDIgKTsKLQotICAgIG90dmFsaWQtPmxvb2t1cF9jb3VudCA9IG90dl9Mb29rdXBMaXN0X2dldF9jb3VudCggbG9va3VwcyApOwotCi0gICAgLyogRmVhdHVyZVJlY29yZCAqLwotICAgIGZvciAoIDsgRmVhdHVyZUNvdW50ID4gMDsgRmVhdHVyZUNvdW50LS0gKQotICAgIHsKLSAgICAgIHAgKz0gNDsgICAgICAgLyogc2tpcCBGZWF0dXJlVGFnICovCi0KLSAgICAgIC8qIEZlYXR1cmUgKi8KLSAgICAgIG90dl9GZWF0dXJlX3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBMQU5HVUFHRSBTWVNURU0gICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiB1c2VzIG90dmFsaWQtPmV4dHJhMSAobnVtYmVyIG9mIGZlYXR1cmVzKSAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl9MYW5nU3lzX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgUmVxRmVhdHVyZUluZGV4OwotICAgIEZUX1VJbnQgICBGZWF0dXJlQ291bnQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiTGFuZ1N5cyIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggNiApOwotICAgIHAgICAgICAgICAgICAgICs9IDI7ICAgICAgICAgICAgICAgICAgICAvKiBza2lwIExvb2t1cE9yZGVyICh1bnVzZWQpICovCi0gICAgUmVxRmVhdHVyZUluZGV4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBGZWF0dXJlQ291bnQgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoUmVxRmVhdHVyZUluZGV4ID0gJWQpXG4iLCBSZXFGZWF0dXJlSW5kZXggKSk7Ci0gICAgT1RWX1RSQUNFKCggIiAoRmVhdHVyZUNvdW50ID0gJWQpXG4iLCAgICBGZWF0dXJlQ291bnQgICAgKSk7Ci0KLSAgICBpZiAoIFJlcUZlYXR1cmVJbmRleCAhPSAweEZGRkZVICYmIFJlcUZlYXR1cmVJbmRleCA+PSBvdHZhbGlkLT5leHRyYTEgKQotICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBGZWF0dXJlQ291bnQgKiAyICk7Ci0KLSAgICAvKiBGZWF0dXJlSW5kZXggKi8KLSAgICBmb3IgKCA7IEZlYXR1cmVDb3VudCA+IDA7IEZlYXR1cmVDb3VudC0tICkKLSAgICAgIGlmICggRlRfTkVYVF9VU0hPUlQoIHAgKSA+PSBvdHZhbGlkLT5leHRyYTEgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NSSVBUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgb3R2X1NjcmlwdF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfVUludCAgIERlZmF1bHRMYW5nU3lzLCBMYW5nU3lzQ291bnQ7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJTY3JpcHQiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICBEZWZhdWx0TGFuZ1N5cyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgTGFuZ1N5c0NvdW50ICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoTGFuZ1N5c0NvdW50ID0gJWQpXG4iLCBMYW5nU3lzQ291bnQgKSk7Ci0KLSAgICBpZiAoIERlZmF1bHRMYW5nU3lzICE9IDAgKQotICAgICAgb3R2X0xhbmdTeXNfdmFsaWRhdGUoIHRhYmxlICsgRGVmYXVsdExhbmdTeXMsIG90dmFsaWQgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggTGFuZ1N5c0NvdW50ICogNiApOwotCi0gICAgLyogTGFuZ1N5c1JlY29yZCAqLwotICAgIGZvciAoIDsgTGFuZ1N5c0NvdW50ID4gMDsgTGFuZ1N5c0NvdW50LS0gKQotICAgIHsKLSAgICAgIHAgKz0gNDsgICAgICAgLyogc2tpcCBMYW5nU3lzVGFnICovCi0KLSAgICAgIC8qIExhbmdTeXMgKi8KLSAgICAgIG90dl9MYW5nU3lzX3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5leHRyYTEgKG51bWJlciBvZiBmZWF0dXJlcykgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfU2NyaXB0TGlzdF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfVUludCAgIFNjcmlwdENvdW50OwotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiU2NyaXB0TGlzdCIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIFNjcmlwdENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKFNjcmlwdENvdW50ID0gJWQpXG4iLCBTY3JpcHRDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggU2NyaXB0Q291bnQgKiA2ICk7Ci0KLSAgICBvdHZhbGlkLT5leHRyYTEgPSBvdHZfRmVhdHVyZV9nZXRfY291bnQoIGZlYXR1cmVzICk7Ci0KLSAgICAvKiBTY3JpcHRSZWNvcmQgKi8KLSAgICBmb3IgKCA7IFNjcmlwdENvdW50ID4gMDsgU2NyaXB0Q291bnQtLSApCi0gICAgewotICAgICAgcCArPSA0OyAgICAgICAvKiBza2lwIFNjcmlwdFRhZyAqLwotCi0gICAgICBvdHZfU2NyaXB0X3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsgLyogU2NyaXB0ICovCi0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBVVElMSVRZIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAgIHU6ICAgdWludDE2Ci0gICAgIHV4OiAgdW5pdDE2IFt4XQotCi0gICAgIHM6ICAgc3RydWN0Ci0gICAgIHN4OiAgc3RydWN0IFt4XQotICAgICBzeHk6IHN0cnVjdCBbeF0sIHVzaW5nIGV4dGVybmFsIHkgY291bnQKLQotICAgICB4OiAgIHVpbnQxNiB4Ci0KLSAgICAgQzogICBDb3ZlcmFnZQotCi0gICAgIE86ICAgT2Zmc2V0Ci0gICAgIE9uOiAgT2Zmc2V0IChOVUxMKQotICAgICBPeDogIE9mZnNldCBbeF0KLSAgICAgT254OiBPZmZzZXQgKE5VTEwpIFt4XQotICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl94X094KCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgQ291bnQ7Ci0gICAgT1RWX1ZhbGlkYXRlX0Z1bmMgIGZ1bmM7Ci0KLQotICAgIE9UVl9FTlRFUjsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKENvdW50ID0gJWQpXG4iLCBDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggQ291bnQgKiAyICk7Ci0KLSAgICBvdHZhbGlkLT5uZXN0aW5nX2xldmVsKys7Ci0gICAgZnVuYyA9IG90dmFsaWQtPmZ1bmNbb3R2YWxpZC0+bmVzdGluZ19sZXZlbF07Ci0KLSAgICBmb3IgKCA7IENvdW50ID4gMDsgQ291bnQtLSApCi0gICAgICBmdW5jKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLQotICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwtLTsKLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfdV9DX3hfT3goIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgQ291bnQsIENvdmVyYWdlOwotICAgIE9UVl9WYWxpZGF0ZV9GdW5jICBmdW5jOwotCi0KLSAgICBPVFZfRU5URVI7Ci0KLSAgICBwICs9IDI7ICAgICAvKiBza2lwIEZvcm1hdCAqLwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgQ292ZXJhZ2UgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIENvdW50ICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKENvdW50ID0gJWQpXG4iLCBDb3VudCApKTsKLQotICAgIG90dl9Db3ZlcmFnZV92YWxpZGF0ZSggdGFibGUgKyBDb3ZlcmFnZSwgb3R2YWxpZCwgKEZUX0ludClDb3VudCApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBDb3VudCAqIDIgKTsKLQotICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwrKzsKLSAgICBmdW5jID0gb3R2YWxpZC0+ZnVuY1tvdHZhbGlkLT5uZXN0aW5nX2xldmVsXTsKLQotICAgIGZvciAoIDsgQ291bnQgPiAwOyBDb3VudC0tICkKLSAgICAgIGZ1bmMoIHRhYmxlICsgRlRfTkVYVF9VU0hPUlQoIHAgKSwgb3R2YWxpZCApOwotCi0gICAgb3R2YWxpZC0+bmVzdGluZ19sZXZlbC0tOwotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qIHVzZXMgb3R2YWxpZC0+ZXh0cmExIChpZiA+IDA6IGFycmF5IHZhbHVlIGxpbWl0KSAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl94X3V4KCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgQ291bnQ7Ci0KLQotICAgIE9UVl9FTlRFUjsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKENvdW50ID0gJWQpXG4iLCBDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggQ291bnQgKiAyICk7Ci0KLSAgICBpZiAoIG90dmFsaWQtPmV4dHJhMSApCi0gICAgewotICAgICAgZm9yICggOyBDb3VudCA+IDA7IENvdW50LS0gKQotICAgICAgICBpZiAoIEZUX05FWFRfVVNIT1JUKCBwICkgPj0gb3R2YWxpZC0+ZXh0cmExICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qIGB1eCcgaW4gdGhlIGZ1bmN0aW9uJ3MgbmFtZSBpcyBub3QgcmVhbGx5IGNvcnJlY3Qgc2luY2Ugb25seSB4LTEgKi8KLSAgLyogZWxlbWVudHMgYXJlIHRlc3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIHVzZXMgb3R2YWxpZC0+ZXh0cmExIChhcnJheSB2YWx1ZSBsaW1pdCkgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfeF95X3V4X3N5KCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBDb3VudDEsIENvdW50MjsKLQotCi0gICAgT1RWX0VOVEVSOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgQ291bnQxID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBDb3VudDIgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoQ291bnQxID0gJWQpXG4iLCBDb3VudDEgKSk7Ci0gICAgT1RWX1RSQUNFKCggIiAoQ291bnQyID0gJWQpXG4iLCBDb3VudDIgKSk7Ci0KLSAgICBpZiAoIENvdW50MSA9PSAwICkKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggKCBDb3VudDEgLSAxICkgKiAyICsgQ291bnQyICogNCApOwotICAgIHAgKz0gKCBDb3VudDEgLSAxICkgKiAyOwotCi0gICAgZm9yICggOyBDb3VudDIgPiAwOyBDb3VudDItLSApCi0gICAgewotICAgICAgaWYgKCBGVF9ORVhUX1VTSE9SVCggcCApID49IENvdW50MSApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgaWYgKCBGVF9ORVhUX1VTSE9SVCggcCApID49IG90dmFsaWQtPmV4dHJhMSApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyogYHV5JyBpbiB0aGUgZnVuY3Rpb24ncyBuYW1lIGlzIG5vdCByZWFsbHkgY29ycmVjdCBzaW5jZSBvbmx5IHktMSAqLwotICAvKiBlbGVtZW50cyBhcmUgdGVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogdXNlcyBvdHZhbGlkLT5leHRyYTEgKGFycmF5IHZhbHVlIGxpbWl0KSAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl94X3V4X3lfdXlfel91el9wX3NwKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgQmFja3RyYWNrQ291bnQsIElucHV0Q291bnQsIExvb2thaGVhZENvdW50OwotICAgIEZUX1VJbnQgICBDb3VudDsKLQotCi0gICAgT1RWX0VOVEVSOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgQmFja3RyYWNrQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoQmFja3RyYWNrQ291bnQgPSAlZClcbiIsIEJhY2t0cmFja0NvdW50ICkpOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBCYWNrdHJhY2tDb3VudCAqIDIgKyAyICk7Ci0gICAgcCArPSBCYWNrdHJhY2tDb3VudCAqIDI7Ci0KLSAgICBJbnB1dENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBpZiAoIElucHV0Q291bnQgPT0gMCApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChJbnB1dENvdW50ID0gJWQpXG4iLCBJbnB1dENvdW50ICkpOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBJbnB1dENvdW50ICogMiApOwotICAgIHAgKz0gKCBJbnB1dENvdW50IC0gMSApICogMjsKLQotICAgIExvb2thaGVhZENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKExvb2thaGVhZENvdW50ID0gJWQpXG4iLCBMb29rYWhlYWRDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggTG9va2FoZWFkQ291bnQgKiAyICsgMiApOwotICAgIHAgKz0gTG9va2FoZWFkQ291bnQgKiAyOwotCi0gICAgQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoQ291bnQgPSAlZClcbiIsIENvdW50ICkpOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBDb3VudCAqIDQgKTsKLQotICAgIGZvciAoIDsgQ291bnQgPiAwOyBDb3VudC0tICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX05FWFRfVVNIT1JUKCBwICkgPj0gSW5wdXRDb3VudCApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgaWYgKCBGVF9ORVhUX1VTSE9SVCggcCApID49IG90dmFsaWQtPmV4dHJhMSApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5leHRyYTEgKHZhbGlkLT5sb29rdXBfY291bnQpICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgb3R2X3VfT19PX3hfT254KCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgICAgICAgICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgICAgICAgICAgIENvdmVyYWdlLCBDbGFzc0RlZiwgQ2xhc3NTZXRDb3VudDsKLSAgICBPVFZfVmFsaWRhdGVfRnVuYyAgZnVuYzsKLQotCi0gICAgT1RWX0VOVEVSOwotCi0gICAgcCArPSAyOyAgICAgLyogc2tpcCBGb3JtYXQgKi8KLQotICAgIE9UVl9MSU1JVF9DSEVDSyggNiApOwotICAgIENvdmVyYWdlICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIENsYXNzRGVmICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIENsYXNzU2V0Q291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoQ2xhc3NTZXRDb3VudCA9ICVkKVxuIiwgQ2xhc3NTZXRDb3VudCApKTsKLQotICAgIG90dl9Db3ZlcmFnZV92YWxpZGF0ZSggdGFibGUgKyBDb3ZlcmFnZSwgb3R2YWxpZCwgLTEgKTsKLSAgICBvdHZfQ2xhc3NEZWZfdmFsaWRhdGUoIHRhYmxlICsgQ2xhc3NEZWYsIG90dmFsaWQgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggQ2xhc3NTZXRDb3VudCAqIDIgKTsKLQotICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwrKzsKLSAgICBmdW5jICAgICAgICAgID0gb3R2YWxpZC0+ZnVuY1tvdHZhbGlkLT5uZXN0aW5nX2xldmVsXTsKLSAgICBvdHZhbGlkLT5leHRyYTEgPSBvdHZhbGlkLT5sb29rdXBfY291bnQ7Ci0KLSAgICBmb3IgKCA7IENsYXNzU2V0Q291bnQgPiAwOyBDbGFzc1NldENvdW50LS0gKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIG9mZnNldCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLQotICAgICAgaWYgKCBvZmZzZXQgKQotICAgICAgICBmdW5jKCB0YWJsZSArIG9mZnNldCwgb3R2YWxpZCApOwotICAgIH0KLQotICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwtLTsKLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKiB1c2VzIG90dmFsaWQtPmxvb2t1cF9jb3VudCAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl91X3hfeV9PeF9zeSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBHbHlwaENvdW50LCBDb3VudCwgY291bnQxOwotCi0KLSAgICBPVFZfRU5URVI7Ci0KLSAgICBwICs9IDI7ICAgICAvKiBza2lwIEZvcm1hdCAqLwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgR2x5cGhDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgQ291bnQgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChHbHlwaENvdW50ID0gJWQpXG4iLCBHbHlwaENvdW50ICkpOwotICAgIE9UVl9UUkFDRSgoICIgKENvdW50ID0gJWQpXG4iLCAgICAgIENvdW50ICAgICAgKSk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIEdseXBoQ291bnQgKiAyICsgQ291bnQgKiA0ICk7Ci0KLSAgICBmb3IgKCBjb3VudDEgPSBHbHlwaENvdW50OyBjb3VudDEgPiAwOyBjb3VudDEtLSApCi0gICAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgRlRfTkVYVF9VU0hPUlQoIHAgKSwgb3R2YWxpZCwgLTEgKTsKLQotICAgIGZvciAoIDsgQ291bnQgPiAwOyBDb3VudC0tICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX05FWFRfVVNIT1JUKCBwICkgPj0gR2x5cGhDb3VudCApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgaWYgKCBGVF9ORVhUX1VTSE9SVCggcCApID49IG90dmFsaWQtPmxvb2t1cF9jb3VudCApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5leHRyYTEgKHZhbGlkLT5sb29rdXBfY291bnQpICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgb3R2X3VfT19PX09fT194X09ueCggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgQ292ZXJhZ2U7Ci0gICAgRlRfVUludCAgICAgICAgICAgIEJhY2t0cmFja0NsYXNzRGVmLCBJbnB1dENsYXNzRGVmLCBMb29rYWhlYWRDbGFzc0RlZjsKLSAgICBGVF9VSW50ICAgICAgICAgICAgQ2hhaW5DbGFzc1NldENvdW50OwotICAgIE9UVl9WYWxpZGF0ZV9GdW5jICBmdW5jOwotCi0KLSAgICBPVFZfRU5URVI7Ci0KLSAgICBwICs9IDI7ICAgICAvKiBza2lwIEZvcm1hdCAqLwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAxMCApOwotICAgIENvdmVyYWdlICAgICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgQmFja3RyYWNrQ2xhc3NEZWYgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBJbnB1dENsYXNzRGVmICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIExvb2thaGVhZENsYXNzRGVmICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgQ2hhaW5DbGFzc1NldENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKENoYWluQ2xhc3NTZXRDb3VudCA9ICVkKVxuIiwgQ2hhaW5DbGFzc1NldENvdW50ICkpOwotCi0gICAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCB0YWJsZSArIENvdmVyYWdlLCBvdHZhbGlkLCAtMSApOwotCi0gICAgb3R2X0NsYXNzRGVmX3ZhbGlkYXRlKCB0YWJsZSArIEJhY2t0cmFja0NsYXNzRGVmLCAgb3R2YWxpZCApOwotICAgIG90dl9DbGFzc0RlZl92YWxpZGF0ZSggdGFibGUgKyBJbnB1dENsYXNzRGVmLCBvdHZhbGlkICk7Ci0gICAgb3R2X0NsYXNzRGVmX3ZhbGlkYXRlKCB0YWJsZSArIExvb2thaGVhZENsYXNzRGVmLCBvdHZhbGlkICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIENoYWluQ2xhc3NTZXRDb3VudCAqIDIgKTsKLQotICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwrKzsKLSAgICBmdW5jICAgICAgICAgID0gb3R2YWxpZC0+ZnVuY1tvdHZhbGlkLT5uZXN0aW5nX2xldmVsXTsKLSAgICBvdHZhbGlkLT5leHRyYTEgPSBvdHZhbGlkLT5sb29rdXBfY291bnQ7Ci0KLSAgICBmb3IgKCA7IENoYWluQ2xhc3NTZXRDb3VudCA+IDA7IENoYWluQ2xhc3NTZXRDb3VudC0tICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBvZmZzZXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgIGlmICggb2Zmc2V0ICkKLSAgICAgICAgZnVuYyggdGFibGUgKyBvZmZzZXQsIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBvdHZhbGlkLT5uZXN0aW5nX2xldmVsLS07Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyogdXNlcyBvdHZhbGlkLT5sb29rdXBfY291bnQgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfdV94X094X3lfT3lfel9Pel9wX3NwKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBCYWNrdHJhY2tHbHlwaENvdW50LCBJbnB1dEdseXBoQ291bnQsIExvb2thaGVhZEdseXBoQ291bnQ7Ci0gICAgRlRfVUludCAgIGNvdW50MSwgY291bnQyOwotCi0KLSAgICBPVFZfRU5URVI7Ci0KLSAgICBwICs9IDI7ICAgICAvKiBza2lwIEZvcm1hdCAqLwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgQmFja3RyYWNrR2x5cGhDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChCYWNrdHJhY2tHbHlwaENvdW50ID0gJWQpXG4iLCBCYWNrdHJhY2tHbHlwaENvdW50ICkpOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBCYWNrdHJhY2tHbHlwaENvdW50ICogMiArIDIgKTsKLQotICAgIGZvciAoIDsgQmFja3RyYWNrR2x5cGhDb3VudCA+IDA7IEJhY2t0cmFja0dseXBoQ291bnQtLSApCi0gICAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgRlRfTkVYVF9VU0hPUlQoIHAgKSwgb3R2YWxpZCwgLTEgKTsKLQotICAgIElucHV0R2x5cGhDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChJbnB1dEdseXBoQ291bnQgPSAlZClcbiIsIElucHV0R2x5cGhDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggSW5wdXRHbHlwaENvdW50ICogMiArIDIgKTsKLQotICAgIGZvciAoIGNvdW50MSA9IElucHV0R2x5cGhDb3VudDsgY291bnQxID4gMDsgY291bnQxLS0gKQotICAgICAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQsIC0xICk7Ci0KLSAgICBMb29rYWhlYWRHbHlwaENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKExvb2thaGVhZEdseXBoQ291bnQgPSAlZClcbiIsIExvb2thaGVhZEdseXBoQ291bnQgKSk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIExvb2thaGVhZEdseXBoQ291bnQgKiAyICsgMiApOwotCi0gICAgZm9yICggOyBMb29rYWhlYWRHbHlwaENvdW50ID4gMDsgTG9va2FoZWFkR2x5cGhDb3VudC0tICkKLSAgICAgIG90dl9Db3ZlcmFnZV92YWxpZGF0ZSggdGFibGUgKyBGVF9ORVhUX1VTSE9SVCggcCApLCBvdHZhbGlkLCAtMSApOwotCi0gICAgY291bnQyID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKENvdW50ID0gJWQpXG4iLCBjb3VudDIgKSk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIGNvdW50MiAqIDQgKTsKLQotICAgIGZvciAoIDsgY291bnQyID4gMDsgY291bnQyLS0gKQotICAgIHsKLSAgICAgIGlmICggRlRfTkVYVF9VU0hPUlQoIHAgKSA+PSBJbnB1dEdseXBoQ291bnQgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgIGlmICggRlRfTkVYVF9VU0hPUlQoIHAgKSA+PSBvdHZhbGlkLT5sb29rdXBfY291bnQgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUludCApCi0gIG90dl9HU1VCR1BPU19nZXRfTG9va3VwX2NvdW50KCBGVF9CeXRlcyAgdGFibGUgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZSArIDg7Ci0KLQotICAgIHJldHVybiBvdHZfTG9va3VwTGlzdF9nZXRfY291bnQoIHRhYmxlICsgRlRfTkVYVF9VU0hPUlQoIHAgKSApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1VJbnQgKQotICBvdHZfR1NVQkdQT1NfaGF2ZV9NYXJrQXR0YWNobWVudFR5cGVfZmxhZyggRlRfQnl0ZXMgIHRhYmxlICkKLSAgewotICAgIEZUX0J5dGVzICBwLCBsb29rdXA7Ci0gICAgRlRfVUludCAgIGNvdW50OwotCi0KLSAgICBpZiAoICF0YWJsZSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIExvb2t1cExpc3QgKi8KLSAgICBwICAgICAgPSB0YWJsZSArIDg7Ci0gICAgdGFibGUgKz0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIC8qIExvb2t1cENvdW50ICovCi0gICAgcCAgICAgPSB0YWJsZTsKLSAgICBjb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgewotICAgICAgRlRfQnl0ZXMgIG9sZHA7Ci0KLQotICAgICAgLyogTG9va3VwICovCi0gICAgICBsb29rdXAgPSB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIG9sZHAgPSBwOwotCi0gICAgICAvKiBMb29rdXBGbGFnICovCi0gICAgICBwID0gbG9va3VwICsgMjsKLSAgICAgIGlmICggRlRfTkVYVF9VU0hPUlQoIHAgKSAmIDB4RkYwMFUgKQotICAgICAgICByZXR1cm4gMTsKLQotICAgICAgcCA9IG9sZHA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dmNvbW1uLmggYi9zcmMvb3R2YWxpZC9vdHZjb21tbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGE2MDNlLi4wMDAwMDAwCi0tLSBhL3NyYy9vdHZhbGlkL290dmNvbW1uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Y29tbW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIGNvbW1vbiB0YWJsZXMgdmFsaWRhdGlvbiAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIE9UVkNPTU1OX0hfCi0jZGVmaW5lIE9UVkNPTU1OX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAib3R2YWxpZC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgT1RWX1ZhbGlkYXRvclJlY18qICBPVFZfVmFsaWRhdG9yOwotCi0gIHR5cGVkZWYgdm9pZCAgKCpPVFZfVmFsaWRhdGVfRnVuYykoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICk7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIE9UVl9WYWxpZGF0b3JSZWNfCi0gIHsKLSAgICBGVF9WYWxpZGF0b3IgICAgICAgIHJvb3Q7Ci0gICAgRlRfVUludCAgICAgICAgICAgICB0eXBlX2NvdW50OwotICAgIE9UVl9WYWxpZGF0ZV9GdW5jKiAgdHlwZV9mdW5jczsKLQotICAgIEZUX1VJbnQgICAgICAgICAgICAgbG9va3VwX2NvdW50OwotICAgIEZUX1VJbnQgICAgICAgICAgICAgZ2x5cGhfY291bnQ7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWw7Ci0KLSAgICBPVFZfVmFsaWRhdGVfRnVuYyAgIGZ1bmNbM107Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgIGV4dHJhMTsgICAgIC8qIGZvciBwYXNzaW5nIHBhcmFtZXRlcnMgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgIGV4dHJhMjsKLSAgICBGVF9CeXRlcyAgICAgICAgICAgIGV4dHJhMzsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgRlRfVUludCAgICAgICAgICAgICBkZWJ1Z19pbmRlbnQ7Ci0gICAgY29uc3QgRlRfU3RyaW5nKiAgICBkZWJ1Z19mdW5jdGlvbl9uYW1lWzNdOwotI2VuZGlmCi0KLSAgfSBPVFZfVmFsaWRhdG9yUmVjOwotCi0KLSN1bmRlZiAgRlRfSU5WQUxJRF8KLSNkZWZpbmUgRlRfSU5WQUxJRF8oIF9lcnJvciApIFwKLSAgICAgICAgICBmdF92YWxpZGF0b3JfZXJyb3IoIG90dmFsaWQtPnJvb3QsIEZUX1RIUk9XKCBfZXJyb3IgKSApCi0KLSNkZWZpbmUgT1RWX09QVElPTkFMX1RBQkxFKCBfdGFibGUgKSAgRlRfVVNob3J0ICBfdGFibGU7ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgIF90YWJsZSAjIyBfcAotCi0jZGVmaW5lIE9UVl9PUFRJT05BTF9PRkZTRVQoIF9vZmZzZXQgKSAgICAgICAgICAgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9vZmZzZXQgIyMgX3AgPSBwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfb2Zmc2V0ICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0jZGVmaW5lIE9UVl9MSU1JVF9DSEVDSyggX2NvdW50ICkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCBwICsgKF9jb3VudCkgPiBvdHZhbGlkLT5yb290LT5saW1pdCApIFwKLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0jZGVmaW5lIE9UVl9TSVpFX0NIRUNLKCBfc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCBfc2l6ZSA+IDAgJiYgX3NpemUgPCB0YWJsZV9zaXplICkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgaWYgKCBvdHZhbGlkLT5yb290LT5sZXZlbCA9PSBGVF9WQUxJREFURV9QQVJBTk9JRCApICAgICBcCi0gICAgICAgICAgICAgICAgRlRfSU5WQUxJRF9PRkZTRVQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgLyogc3RyaXAgb2ZmIGBjb25zdCcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBGVF9CeXRlKiAgcHAgPSAoRlRfQnl0ZSopX3NpemUgIyMgX3A7ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBGVF9UUkFDRTMoKCAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG9mZnNldCB0byBvcHRpb25hbCB0YWJsZSBgJXMnIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzZXQgdG8gemVyby5cbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iLCAjX3NpemUgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgLyogYWx3YXlzIGFzc3VtZSAxNmJpdCBlbnRpdGllcyAqLyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBfc2l6ZSA9IHBwWzBdID0gcHBbMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotCi0jZGVmaW5lICBPVFZfTkFNRV8oeCkgICN4Ci0jZGVmaW5lICBPVFZfTkFNRSh4KSAgIE9UVl9OQU1FXyh4KQotCi0jZGVmaW5lICBPVFZfRlVOQ18oeCkgIHgjI0Z1bmMKLSNkZWZpbmUgIE9UVl9GVU5DKHgpICAgT1RWX0ZVTkNfKHgpCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0jZGVmaW5lIE9UVl9ORVNUMSggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwgICAgICAgICAgPSAwOyAgICAgICAgICAgICBcCi0gICAgICAgICAgICBvdHZhbGlkLT5mdW5jWzBdICAgICAgICAgICAgICAgID0gT1RWX0ZVTkMoIHggKTsgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZGVidWdfZnVuY3Rpb25fbmFtZVswXSA9IE9UVl9OQU1FKCB4ICk7IFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotI2RlZmluZSBPVFZfTkVTVDIoIHgsIHkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBvdHZhbGlkLT5uZXN0aW5nX2xldmVsICAgICAgICAgID0gMDsgICAgICAgICAgICAgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZnVuY1swXSAgICAgICAgICAgICAgICA9IE9UVl9GVU5DKCB4ICk7IFwKLSAgICAgICAgICAgIG90dmFsaWQtPmZ1bmNbMV0gICAgICAgICAgICAgICAgPSBPVFZfRlVOQyggeSApOyBcCi0gICAgICAgICAgICBvdHZhbGlkLT5kZWJ1Z19mdW5jdGlvbl9uYW1lWzBdID0gT1RWX05BTUUoIHggKTsgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZGVidWdfZnVuY3Rpb25fbmFtZVsxXSA9IE9UVl9OQU1FKCB5ICk7IFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotI2RlZmluZSBPVFZfTkVTVDMoIHgsIHksIHogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBvdHZhbGlkLT5uZXN0aW5nX2xldmVsICAgICAgICAgID0gMDsgICAgICAgICAgICAgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZnVuY1swXSAgICAgICAgICAgICAgICA9IE9UVl9GVU5DKCB4ICk7IFwKLSAgICAgICAgICAgIG90dmFsaWQtPmZ1bmNbMV0gICAgICAgICAgICAgICAgPSBPVFZfRlVOQyggeSApOyBcCi0gICAgICAgICAgICBvdHZhbGlkLT5mdW5jWzJdICAgICAgICAgICAgICAgID0gT1RWX0ZVTkMoIHogKTsgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZGVidWdfZnVuY3Rpb25fbmFtZVswXSA9IE9UVl9OQU1FKCB4ICk7IFwKLSAgICAgICAgICAgIG90dmFsaWQtPmRlYnVnX2Z1bmN0aW9uX25hbWVbMV0gPSBPVFZfTkFNRSggeSApOyBcCi0gICAgICAgICAgICBvdHZhbGlkLT5kZWJ1Z19mdW5jdGlvbl9uYW1lWzJdID0gT1RWX05BTUUoIHogKTsgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0jZGVmaW5lIE9UVl9JTklUICBvdHZhbGlkLT5kZWJ1Z19pbmRlbnQgPSAwCi0KLSNkZWZpbmUgT1RWX0VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZGVidWdfaW5kZW50ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIlKi5zIiwgb3R2YWxpZC0+ZGVidWdfaW5kZW50LCAwICkpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiJXMgdGFibGVcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgb3R2YWxpZC0+ZGVidWdfZnVuY3Rpb25fbmFtZVtvdHZhbGlkLT5uZXN0aW5nX2xldmVsXSApKTsgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0jZGVmaW5lIE9UVl9OQU1FX0VOVEVSKCBuYW1lICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG90dmFsaWQtPmRlYnVnX2luZGVudCArPSAyOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiJSoucyIsIG90dmFsaWQtPmRlYnVnX2luZGVudCwgMCApKTsgXAotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiVzIHRhYmxlXG4iLCBuYW1lICkpOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotI2RlZmluZSBPVFZfRVhJVCAgb3R2YWxpZC0+ZGVidWdfaW5kZW50IC09IDIKLQotI2RlZmluZSBPVFZfVFJBQ0UoIHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiJSoucyIsIG90dmFsaWQtPmRlYnVnX2luZGVudCwgMCApKTsgXAotICAgICAgICAgICAgRlRfVFJBQ0U0KCBzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotI2Vsc2UgICAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotI2RlZmluZSBPVFZfTkVTVDEoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBvdHZhbGlkLT5uZXN0aW5nX2xldmVsID0gMDsgICAgICAgICAgICAgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZnVuY1swXSAgICAgICA9IE9UVl9GVU5DKCB4ICk7IFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotI2RlZmluZSBPVFZfTkVTVDIoIHgsIHkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBvdHZhbGlkLT5uZXN0aW5nX2xldmVsID0gMDsgICAgICAgICAgICAgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZnVuY1swXSAgICAgICA9IE9UVl9GVU5DKCB4ICk7IFwKLSAgICAgICAgICAgIG90dmFsaWQtPmZ1bmNbMV0gICAgICAgPSBPVFZfRlVOQyggeSApOyBcCi0gICAgICAgICAgRlRfRU5EX1NUTU5UCi0KLSNkZWZpbmUgT1RWX05FU1QzKCB4LCB5LCB6ICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgb3R2YWxpZC0+bmVzdGluZ19sZXZlbCA9IDA7ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG90dmFsaWQtPmZ1bmNbMF0gICAgICAgPSBPVFZfRlVOQyggeCApOyBcCi0gICAgICAgICAgICBvdHZhbGlkLT5mdW5jWzFdICAgICAgID0gT1RWX0ZVTkMoIHkgKTsgXAotICAgICAgICAgICAgb3R2YWxpZC0+ZnVuY1syXSAgICAgICA9IE9UVl9GVU5DKCB6ICk7IFwKLSAgICAgICAgICBGVF9FTkRfU1RNTlQKLQotI2RlZmluZSBPVFZfSU5JVCAgICAgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKCAwICkKLSNkZWZpbmUgT1RWX0VOVEVSICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICggMCApCi0jZGVmaW5lIE9UVl9OQU1FX0VOVEVSKCBuYW1lICkgIGRvIHsgfSB3aGlsZSAoIDAgKQotI2RlZmluZSBPVFZfRVhJVCAgICAgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKCAwICkKLQotI2RlZmluZSBPVFZfVFJBQ0UoIHMgKSAgICAgICAgICBkbyB7IH0gd2hpbGUgKCAwICkKLQotI2VuZGlmICAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0jZGVmaW5lIE9UVl9SVU4gIG90dmFsaWQtPmZ1bmNbMF0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgQ09WRVJBR0UgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGV4cGVjdGVkX2NvdW50ICk7Ci0KLSAgLyogcmV0dXJuIGZpcnN0IGNvdmVyZWQgZ2x5cGggKi8KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBvdHZfQ292ZXJhZ2VfZ2V0X2ZpcnN0KCBGVF9CeXRlcyAgdGFibGUgKTsKLQotICAvKiByZXR1cm4gbGFzdCBjb3ZlcmVkIGdseXBoICovCi0gIEZUX0xPQ0FMKCBGVF9VSW50ICkKLSAgb3R2X0NvdmVyYWdlX2dldF9sYXN0KCBGVF9CeXRlcyAgdGFibGUgKTsKLQotICAvKiByZXR1cm4gbnVtYmVyIG9mIGNvdmVyZWQgZ2x5cGhzICovCi0gIEZUX0xPQ0FMKCBGVF9VSW50ICkKLSAgb3R2X0NvdmVyYWdlX2dldF9jb3VudCggRlRfQnl0ZXMgIHRhYmxlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICBDTEFTUyBERUZJTklUSU9OIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIG90dl9DbGFzc0RlZl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIERFVklDRSBUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfRGV2aWNlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9PS1VQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfTG9va3VwX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X0xvb2t1cExpc3RfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgRkVBVFVSRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfRmVhdHVyZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICk7Ci0KLSAgLyogbG9va3VwcyBtdXN0IGFscmVhZHkgYmUgdmFsaWRhdGVkICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X0ZlYXR1cmVMaXN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBsb29rdXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgTEFOR1VBR0UgU1lTVEVNICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X0xhbmdTeXNfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NSSVBUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfU2NyaXB0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0gIC8qIGZlYXR1cmVzIG11c3QgYWxyZWFkeSBiZSB2YWxpZGF0ZWQgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfU2NyaXB0TGlzdF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBVVElMSVRZIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIENoYWluUG9zQ2xhc3NTZXRGdW5jICBvdHZfeF9PeAotI2RlZmluZSBDaGFpblBvc1J1bGVTZXRGdW5jICAgb3R2X3hfT3gKLSNkZWZpbmUgQ2hhaW5TdWJDbGFzc1NldEZ1bmMgIG90dl94X094Ci0jZGVmaW5lIENoYWluU3ViUnVsZVNldEZ1bmMgICBvdHZfeF9PeAotI2RlZmluZSBKc3RmTGFuZ1N5c0Z1bmMgICAgICAgb3R2X3hfT3gKLSNkZWZpbmUgSnN0Zk1heEZ1bmMgICAgICAgICAgIG90dl94X094Ci0jZGVmaW5lIExpZ0dseXBoRnVuYyAgICAgICAgICBvdHZfeF9PeAotI2RlZmluZSBMaWdhdHVyZUFycmF5RnVuYyAgICAgb3R2X3hfT3gKLSNkZWZpbmUgTGlnYXR1cmVTZXRGdW5jICAgICAgIG90dl94X094Ci0jZGVmaW5lIFBvc0NsYXNzU2V0RnVuYyAgICAgICBvdHZfeF9PeAotI2RlZmluZSBQb3NSdWxlU2V0RnVuYyAgICAgICAgb3R2X3hfT3gKLSNkZWZpbmUgU3ViQ2xhc3NTZXRGdW5jICAgICAgIG90dl94X094Ci0jZGVmaW5lIFN1YlJ1bGVTZXRGdW5jICAgICAgICBvdHZfeF9PeAotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X3hfT3ggKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICk7Ci0KLSNkZWZpbmUgQWx0ZXJuYXRlU3Vic3RGb3JtYXQxRnVuYyAgICAgb3R2X3VfQ194X094Ci0jZGVmaW5lIENoYWluQ29udGV4dFBvc0Zvcm1hdDFGdW5jICAgIG90dl91X0NfeF9PeAotI2RlZmluZSBDaGFpbkNvbnRleHRTdWJzdEZvcm1hdDFGdW5jICBvdHZfdV9DX3hfT3gKLSNkZWZpbmUgQ29udGV4dFBvc0Zvcm1hdDFGdW5jICAgICAgICAgb3R2X3VfQ194X094Ci0jZGVmaW5lIENvbnRleHRTdWJzdEZvcm1hdDFGdW5jICAgICAgIG90dl91X0NfeF9PeAotI2RlZmluZSBMaWdhdHVyZVN1YnN0Rm9ybWF0MUZ1bmMgICAgICBvdHZfdV9DX3hfT3gKLSNkZWZpbmUgTXVsdGlwbGVTdWJzdEZvcm1hdDFGdW5jICAgICAgb3R2X3VfQ194X094Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfdV9DX3hfT3goIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKTsKLQotI2RlZmluZSBBbHRlcm5hdGVTZXRGdW5jICAgICBvdHZfeF91eAotI2RlZmluZSBBdHRhY2hQb2ludEZ1bmMgICAgICBvdHZfeF91eAotI2RlZmluZSBFeHRlbmRlckdseXBoRnVuYyAgICBvdHZfeF91eAotI2RlZmluZSBKc3RmR1BPU01vZExpc3RGdW5jICBvdHZfeF91eAotI2RlZmluZSBKc3RmR1NVQk1vZExpc3RGdW5jICBvdHZfeF91eAotI2RlZmluZSBTZXF1ZW5jZUZ1bmMgICAgICAgICBvdHZfeF91eAotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X3hfdXgoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0jZGVmaW5lIFBvc0NsYXNzUnVsZUZ1bmMgIG90dl94X3lfdXhfc3kKLSNkZWZpbmUgUG9zUnVsZUZ1bmMgICAgICAgb3R2X3hfeV91eF9zeQotI2RlZmluZSBTdWJDbGFzc1J1bGVGdW5jICBvdHZfeF95X3V4X3N5Ci0jZGVmaW5lIFN1YlJ1bGVGdW5jICAgICAgIG90dl94X3lfdXhfc3kKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIG90dl94X3lfdXhfc3koIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICk7Ci0KLSNkZWZpbmUgQ2hhaW5Qb3NDbGFzc1J1bGVGdW5jICBvdHZfeF91eF95X3V5X3pfdXpfcF9zcAotI2RlZmluZSBDaGFpblBvc1J1bGVGdW5jICAgICAgIG90dl94X3V4X3lfdXlfel91el9wX3NwCi0jZGVmaW5lIENoYWluU3ViQ2xhc3NSdWxlRnVuYyAgb3R2X3hfdXhfeV91eV96X3V6X3Bfc3AKLSNkZWZpbmUgQ2hhaW5TdWJSdWxlRnVuYyAgICAgICBvdHZfeF91eF95X3V5X3pfdXpfcF9zcAotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X3hfdXhfeV91eV96X3V6X3Bfc3AoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0jZGVmaW5lIENvbnRleHRQb3NGb3JtYXQyRnVuYyAgICBvdHZfdV9PX09feF9PbngKLSNkZWZpbmUgQ29udGV4dFN1YnN0Rm9ybWF0MkZ1bmMgIG90dl91X09fT194X09ueAotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgb3R2X3VfT19PX3hfT254KCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICk7Ci0KLSNkZWZpbmUgQ29udGV4dFBvc0Zvcm1hdDNGdW5jICAgIG90dl91X3hfeV9PeF9zeQotI2RlZmluZSBDb250ZXh0U3Vic3RGb3JtYXQzRnVuYyAgb3R2X3VfeF95X094X3N5Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfdV94X3lfT3hfc3koIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKTsKLQotI2RlZmluZSBDaGFpbkNvbnRleHRQb3NGb3JtYXQyRnVuYyAgICBvdHZfdV9PX09fT19PX3hfT254Ci0jZGVmaW5lIENoYWluQ29udGV4dFN1YnN0Rm9ybWF0MkZ1bmMgIG90dl91X09fT19PX09feF9PbngKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIG90dl91X09fT19PX09feF9PbngoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICk7Ci0KLSNkZWZpbmUgQ2hhaW5Db250ZXh0UG9zRm9ybWF0M0Z1bmMgICAgb3R2X3VfeF9PeF95X095X3pfT3pfcF9zcAotI2RlZmluZSBDaGFpbkNvbnRleHRTdWJzdEZvcm1hdDNGdW5jICBvdHZfdV94X094X3lfT3lfel9Pel9wX3NwCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfdV94X094X3lfT3lfel9Pel9wX3NwKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBvdHZfR1NVQkdQT1NfZ2V0X0xvb2t1cF9jb3VudCggRlRfQnl0ZXMgIHRhYmxlICk7Ci0KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBvdHZfR1NVQkdQT1NfaGF2ZV9NYXJrQXR0YWNobWVudFR5cGVfZmxhZyggRlRfQnl0ZXMgIHRhYmxlICk7Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBPVFZDT01NTl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvb3R2ZXJyb3IuaCBiL3NyYy9vdHZhbGlkL290dmVycm9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTkwMzkuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvb3R2ZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90dmVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSB2YWxpZGF0aW9uIG1vZHVsZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgT3BlblR5cGUgdmFsaWRhdGlvbiBtb2R1bGUgZXJyb3IgICAgICAqLwotICAvKiBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIE9UVkVSUk9SX0hfCi0jZGVmaW5lIE9UVkVSUk9SX0hfCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgRlRFUlJPUlNfSF8KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIE9UVl9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfT1R2YWxpZAotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogT1RWRVJST1JfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dmdkZWYuYyBiL3NyYy9vdHZhbGlkL290dmdkZWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiOWE2OS4uMDAwMDAwMAotLS0gYS9zcmMvb3R2YWxpZC9vdHZnZGVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Z2RlZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdERUYgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAib3R2YWxpZC5oIgotI2luY2x1ZGUgIm90dmNvbW1uLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vdHZnZGVmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgVVRJTElUWSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBBdHRhY2hMaXN0RnVuYyAgICBvdHZfT194X094Ci0jZGVmaW5lIExpZ0NhcmV0TGlzdEZ1bmMgIG90dl9PX3hfT3gKLQotICAvKiBzZXRzIHZhbGlkLT5leHRyYTEgKDApICAgICAgICAgICAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9PX3hfT3goIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICAgICAgICAgICBwID0gdGFibGU7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgIENvdmVyYWdlOwotICAgIEZUX1VJbnQgICAgICAgICAgICBHbHlwaENvdW50OwotICAgIE9UVl9WYWxpZGF0ZV9GdW5jICBmdW5jOwotCi0KLSAgICBPVFZfRU5URVI7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICBDb3ZlcmFnZSAgID0gdGFibGUgKyBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEdseXBoQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoR2x5cGhDb3VudCA9ICVkKVxuIiwgR2x5cGhDb3VudCApKTsKLQotICAgIG90dl9Db3ZlcmFnZV92YWxpZGF0ZSggQ292ZXJhZ2UsIG90dmFsaWQsIChGVF9JbnQpR2x5cGhDb3VudCApOwotICAgIGlmICggR2x5cGhDb3VudCAhPSBvdHZfQ292ZXJhZ2VfZ2V0X2NvdW50KCBDb3ZlcmFnZSApICkKLSAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggR2x5cGhDb3VudCAqIDIgKTsKLQotICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwrKzsKLSAgICBmdW5jICAgICAgICAgID0gb3R2YWxpZC0+ZnVuY1tvdHZhbGlkLT5uZXN0aW5nX2xldmVsXTsKLSAgICBvdHZhbGlkLT5leHRyYTEgPSAwOwotCi0gICAgZm9yICggOyBHbHlwaENvdW50ID4gMDsgR2x5cGhDb3VudC0tICkKLSAgICAgIGZ1bmMoIHRhYmxlICsgRlRfTkVYVF9VU0hPUlQoIHAgKSwgb3R2YWxpZCApOwotCi0gICAgb3R2YWxpZC0+bmVzdGluZ19sZXZlbC0tOwotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgTElHQVRVUkUgQ0FSRVRTICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIENhcmV0VmFsdWVGdW5jICBvdHZfQ2FyZXRWYWx1ZV92YWxpZGF0ZQotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9DYXJldFZhbHVlX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgQ2FyZXRWYWx1ZUZvcm1hdDsKLQotCi0gICAgT1RWX0VOVEVSOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0KLSAgICBDYXJldFZhbHVlRm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKGZvcm1hdCA9ICVkKVxuIiwgQ2FyZXRWYWx1ZUZvcm1hdCApKTsKLQotICAgIHN3aXRjaCAoIENhcmV0VmFsdWVGb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6ICAgICAvKiBDYXJldFZhbHVlRm9ybWF0MSAqLwotICAgICAgLyogc2tpcCBDb29yZGluYXRlLCBubyB0ZXN0ICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjogICAgIC8qIENhcmV0VmFsdWVGb3JtYXQyICovCi0gICAgICAvKiBza2lwIENhcmV0VmFsdWVQb2ludCwgbm8gdGVzdCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6ICAgICAvKiBDYXJldFZhbHVlRm9ybWF0MyAqLwotICAgICAgcCArPSAyOyAgIC8qIHNraXAgQ29vcmRpbmF0ZSAqLwotCi0gICAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLQotICAgICAgLyogRGV2aWNlVGFibGUgKi8KLSAgICAgIG90dl9EZXZpY2VfdmFsaWRhdGUoIHRhYmxlICsgRlRfTkVYVF9VU0hPUlQoIHAgKSwgb3R2YWxpZCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBHREVGIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHNldHMgb3R2YWxpZC0+Z2x5cGhfY291bnQgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfR0RFRl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgZ3N1YiwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgZ3BvcywKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIGZ0dmFsaWQgKQotICB7Ci0gICAgT1RWX1ZhbGlkYXRvclJlYyAgb3R2YWxpZHJlYzsKLSAgICBPVFZfVmFsaWRhdG9yICAgICBvdHZhbGlkID0gJm90dmFsaWRyZWM7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgcCAgICAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgICB0YWJsZV9zaXplOwotICAgIEZUX0Jvb2wgICAgICAgICAgIG5lZWRfTWFya0F0dGFjaENsYXNzRGVmOwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBHbHlwaENsYXNzRGVmICk7Ci0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBBdHRhY2hMaXN0T2Zmc2V0ICk7Ci0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBMaWdDYXJldExpc3RPZmZzZXQgKTsKLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIE1hcmtBdHRhY2hDbGFzc0RlZiApOwotCi0KLSAgICBvdHZhbGlkLT5yb290ID0gZnR2YWxpZDsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIEdERUYgdGFibGVcbiIgKSk7Ci0gICAgT1RWX0lOSVQ7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDEyICk7Ci0KLSAgICBpZiAoIEZUX05FWFRfVUxPTkcoIHAgKSAhPSAweDEwMDAwVUwgKSAgICAgICAgICAvKiBWZXJzaW9uICovCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIC8qIE1hcmtBdHRhY2hDbGFzc0RlZiBoYXMgYmVlbiBhZGRlZCB0byB0aGUgT3BlblR5cGUgKi8KLSAgICAvKiBzcGVjaWZpY2F0aW9uIHdpdGhvdXQgaW5jcmVhc2luZyBHREVGJ3MgdmVyc2lvbiwgICovCi0gICAgLyogc28gd2UgdXNlIHRoaXMgdWdseSBoYWNrIHRvIGZpbmQgb3V0IHdoZXRoZXIgdGhlICAqLwotICAgIC8qIHRhYmxlIGlzIG5lZWRlZCBhY3R1YWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIG5lZWRfTWFya0F0dGFjaENsYXNzRGVmID0gRlRfQk9PTCgKLSAgICAgIG90dl9HU1VCR1BPU19oYXZlX01hcmtBdHRhY2htZW50VHlwZV9mbGFnKCBnc3ViICkgfHwKLSAgICAgIG90dl9HU1VCR1BPU19oYXZlX01hcmtBdHRhY2htZW50VHlwZV9mbGFnKCBncG9zICkgKTsKLQotICAgIGlmICggbmVlZF9NYXJrQXR0YWNoQ2xhc3NEZWYgKQotICAgICAgdGFibGVfc2l6ZSA9IDEyOyAgICAgICAgICAgICAgLyogT3BlblR5cGUgPj0gMS4yICovCi0gICAgZWxzZQotICAgICAgdGFibGVfc2l6ZSA9IDEwOyAgICAgICAgICAgICAgLyogT3BlblR5cGUgPCAxLjIgICovCi0KLSAgICBvdHZhbGlkLT5nbHlwaF9jb3VudCA9IGdseXBoX2NvdW50OwotCi0gICAgT1RWX09QVElPTkFMX09GRlNFVCggR2x5cGhDbGFzc0RlZiApOwotICAgIE9UVl9TSVpFX0NIRUNLKCBHbHlwaENsYXNzRGVmICk7Ci0gICAgaWYgKCBHbHlwaENsYXNzRGVmICkKLSAgICAgIG90dl9DbGFzc0RlZl92YWxpZGF0ZSggdGFibGUgKyBHbHlwaENsYXNzRGVmLCBvdHZhbGlkICk7Ci0KLSAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBBdHRhY2hMaXN0T2Zmc2V0ICk7Ci0gICAgT1RWX1NJWkVfQ0hFQ0soIEF0dGFjaExpc3RPZmZzZXQgKTsKLSAgICBpZiAoIEF0dGFjaExpc3RPZmZzZXQgKQotICAgIHsKLSAgICAgIE9UVl9ORVNUMiggQXR0YWNoTGlzdCwgQXR0YWNoUG9pbnQgKTsKLSAgICAgIE9UVl9SVU4oIHRhYmxlICsgQXR0YWNoTGlzdE9mZnNldCwgb3R2YWxpZCApOwotICAgIH0KLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIExpZ0NhcmV0TGlzdE9mZnNldCApOwotICAgIE9UVl9TSVpFX0NIRUNLKCBMaWdDYXJldExpc3RPZmZzZXQgKTsKLSAgICBpZiAoIExpZ0NhcmV0TGlzdE9mZnNldCApCi0gICAgewotICAgICAgT1RWX05FU1QzKCBMaWdDYXJldExpc3QsIExpZ0dseXBoLCBDYXJldFZhbHVlICk7Ci0gICAgICBPVFZfUlVOKCB0YWJsZSArIExpZ0NhcmV0TGlzdE9mZnNldCwgb3R2YWxpZCApOwotICAgIH0KLQotICAgIGlmICggbmVlZF9NYXJrQXR0YWNoQ2xhc3NEZWYgKQotICAgIHsKLSAgICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIE1hcmtBdHRhY2hDbGFzc0RlZiApOwotICAgICAgT1RWX1NJWkVfQ0hFQ0soIE1hcmtBdHRhY2hDbGFzc0RlZiApOwotICAgICAgaWYgKCBNYXJrQXR0YWNoQ2xhc3NEZWYgKQotICAgICAgICBvdHZfQ2xhc3NEZWZfdmFsaWRhdGUoIHRhYmxlICsgTWFya0F0dGFjaENsYXNzRGVmLCBvdHZhbGlkICk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvb3R2Z3Bvcy5jIGIvc3JjL290dmFsaWQvb3R2Z3Bvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmJjYzIwLi4wMDAwMDAwCi0tLSBhL3NyYy9vdHZhbGlkL290dmdwb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Z3Bvcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdQT1MgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAib3R2YWxpZC5oIgotI2luY2x1ZGUgIm90dmNvbW1uLmgiCi0jaW5jbHVkZSAib3R2Z3Bvcy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb3R2Z3BvcwotCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0FuY2hvcl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X01hcmtBcnJheV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgVVRJTElUWSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBCYXNlQXJyYXlGdW5jICAgICAgIG90dl94X3N4eQotI2RlZmluZSBMaWdhdHVyZUF0dGFjaEZ1bmMgIG90dl94X3N4eQotI2RlZmluZSBNYXJrMkFycmF5RnVuYyAgICAgIG90dl94X3N4eQotCi0gIC8qIHVzZXMgdmFsaWQtPmV4dHJhMSAoY291bnRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIHVzZXMgdmFsaWQtPmV4dHJhMiAoYm9vbGVhbiB0byBoYW5kbGUgTlVMTCBhbmNob3IgZmllbGQpICovCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X3hfc3h5KCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIENvdW50LCBjb3VudDEsIHRhYmxlX3NpemU7Ci0KLQotICAgIE9UVl9FTlRFUjsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotCi0gICAgQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoQ291bnQgPSAlZClcbiIsIENvdW50ICkpOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBDb3VudCAqIG90dmFsaWQtPmV4dHJhMSAqIDIgKTsKLQotICAgIHRhYmxlX3NpemUgPSBDb3VudCAqIG90dmFsaWQtPmV4dHJhMSAqIDIgKyAyOwotCi0gICAgZm9yICggOyBDb3VudCA+IDA7IENvdW50LS0gKQotICAgICAgZm9yICggY291bnQxID0gb3R2YWxpZC0+ZXh0cmExOyBjb3VudDEgPiAwOyBjb3VudDEtLSApCi0gICAgICB7Ci0gICAgICAgIE9UVl9PUFRJT05BTF9UQUJMRSggYW5jaG9yX29mZnNldCApOwotCi0KLSAgICAgICAgT1RWX09QVElPTkFMX09GRlNFVCggYW5jaG9yX29mZnNldCApOwotCi0gICAgICAgIGlmICggb3R2YWxpZC0+ZXh0cmEyICkKLSAgICAgICAgewotICAgICAgICAgIE9UVl9TSVpFX0NIRUNLKCBhbmNob3Jfb2Zmc2V0ICk7Ci0gICAgICAgICAgaWYgKCBhbmNob3Jfb2Zmc2V0ICkKLSAgICAgICAgICAgIG90dl9BbmNob3JfdmFsaWRhdGUoIHRhYmxlICsgYW5jaG9yX29mZnNldCwgb3R2YWxpZCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvdHZfQW5jaG9yX3ZhbGlkYXRlKCB0YWJsZSArIGFuY2hvcl9vZmZzZXQsIG90dmFsaWQgKTsKLSAgICAgIH0KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotI2RlZmluZSBNYXJrQmFzZVBvc0Zvcm1hdDFGdW5jICBvdHZfdV9PX09fdV9PX08KLSNkZWZpbmUgTWFya0xpZ1Bvc0Zvcm1hdDFGdW5jICAgb3R2X3VfT19PX3VfT19PCi0jZGVmaW5lIE1hcmtNYXJrUG9zRm9ybWF0MUZ1bmMgIG90dl91X09fT191X09fTwotCi0gIC8qIHNldHMgb3R2YWxpZC0+ZXh0cmExIChjbGFzcyBjb3VudCkgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfdV9PX09fdV9PX08oIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgICAgICAgICAgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgQ292ZXJhZ2UxLCBDb3ZlcmFnZTIsIENsYXNzQ291bnQ7Ci0gICAgRlRfVUludCAgICAgICAgICAgIEFycmF5MSwgQXJyYXkyOwotICAgIE9UVl9WYWxpZGF0ZV9GdW5jICBmdW5jOwotCi0KLSAgICBPVFZfRU5URVI7Ci0KLSAgICBwICs9IDI7ICAgICAvKiBza2lwIFBvc0Zvcm1hdCAqLwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAxMCApOwotICAgIENvdmVyYWdlMSAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIENvdmVyYWdlMiAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIENsYXNzQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEFycmF5MSAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEFycmF5MiAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCB0YWJsZSArIENvdmVyYWdlMSwgb3R2YWxpZCwgLTEgKTsKLSAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgQ292ZXJhZ2UyLCBvdHZhbGlkLCAtMSApOwotCi0gICAgb3R2X01hcmtBcnJheV92YWxpZGF0ZSggdGFibGUgKyBBcnJheTEsIG90dmFsaWQgKTsKLQotICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwrKzsKLSAgICBmdW5jICAgICAgICAgID0gb3R2YWxpZC0+ZnVuY1tvdHZhbGlkLT5uZXN0aW5nX2xldmVsXTsKLSAgICBvdHZhbGlkLT5leHRyYTEgPSBDbGFzc0NvdW50OwotCi0gICAgZnVuYyggdGFibGUgKyBBcnJheTIsIG90dmFsaWQgKTsKLQotICAgIG90dmFsaWQtPm5lc3RpbmdfbGV2ZWwtLTsKLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSBSRUNPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgRlRfVUludAotICBvdHZfdmFsdWVfbGVuZ3RoKCBGVF9VSW50ICBmb3JtYXQgKQotICB7Ci0gICAgRlRfVUludCAgY291bnQ7Ci0KLQotICAgIGNvdW50ID0gKCAoIGZvcm1hdCAmIDB4QUEgKSA+PiAxICkgKyAoIGZvcm1hdCAmIDB4NTUgKTsKLSAgICBjb3VudCA9ICggKCBjb3VudCAgJiAweENDICkgPj4gMiApICsgKCBjb3VudCAgJiAweDMzICk7Ci0gICAgY291bnQgPSAoICggY291bnQgICYgMHhGMCApID4+IDQgKSArICggY291bnQgICYgMHgwRiApOwotCi0gICAgcmV0dXJuIGNvdW50ICogMjsKLSAgfQotCi0KLSAgLyogdXNlcyBvdHZhbGlkLT5leHRyYTMgKHBvaW50ZXIgdG8gYmFzZSB0YWJsZSkgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfVmFsdWVSZWNvcmRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIGNvdW50OwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBGVF9JbnQgICAgbG9vcDsKLSAgICBGVF9VTG9uZyAgcmVzID0gMDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJWYWx1ZVJlY29yZCIgKTsKLQotICAgIC8qIGRpc3BsYXkgYGZvcm1hdCcgaW4gZHVhbCByZXByZXNlbnRhdGlvbiAqLwotICAgIGZvciAoIGxvb3AgPSA3OyBsb29wID49IDA7IGxvb3AtLSApCi0gICAgewotICAgICAgcmVzIDw8PSA0OwotICAgICAgcmVzICArPSAoIGZvcm1hdCA+PiBsb29wICkgJiAxOwotICAgIH0KLQotICAgIE9UVl9UUkFDRSgoICIgKGZvcm1hdCAwYiUwOGx4KVxuIiwgcmVzICkpOwotI2VuZGlmCi0KLSAgICBpZiAoIGZvcm1hdCA+PSAweDEwMCApCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIGZvciAoIGNvdW50ID0gNDsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICB7Ci0gICAgICBpZiAoIGZvcm1hdCAmIDEgKQotICAgICAgewotICAgICAgICAvKiBYUGxhY2VtZW50LCBZUGxhY2VtZW50LCBYQWR2YW5jZSwgWUFkdmFuY2UgKi8KLSAgICAgICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgICAgIHAgKz0gMjsKLSAgICAgIH0KLQotICAgICAgZm9ybWF0ID4+PSAxOwotICAgIH0KLQotICAgIGZvciAoIGNvdW50ID0gNDsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICB7Ci0gICAgICBpZiAoIGZvcm1hdCAmIDEgKQotICAgICAgewotICAgICAgICBGVF9QdHJEaXN0ICB0YWJsZV9zaXplOwotCi0gICAgICAgIE9UVl9PUFRJT05BTF9UQUJMRSggZGV2aWNlICk7Ci0KLQotICAgICAgICAvKiBYUGxhRGV2aWNlLCBZUGxhRGV2aWNlLCBYQWR2RGV2aWNlLCBZQWR2RGV2aWNlICovCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgICAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBkZXZpY2UgKTsKLQotICAgICAgICAvKiBYWFg6IHRoaXMgdmFsdWUgaXMgdXN1YWxseSB0b28gc21hbGwsIGVzcGVjaWFsbHkgaWYgdGhlIGN1cnJlbnQgKi8KLSAgICAgICAgLyogVmFsdWVSZWNvcmQgaXMgcGFydCBvZiBhbiBhcnJheSAtLSBnZXR0aW5nIHRoZSBjb3JyZWN0IHRhYmxlICAgICovCi0gICAgICAgIC8qIHNpemUgaXMgcHJvYmFibHkgbm90IHdvcnRoIHRoZSB0cm91YmxlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIHRhYmxlX3NpemUgPSBwIC0gb3R2YWxpZC0+ZXh0cmEzOwotCi0gICAgICAgIE9UVl9TSVpFX0NIRUNLKCBkZXZpY2UgKTsKLSAgICAgICAgaWYgKCBkZXZpY2UgKQotICAgICAgICAgIG90dl9EZXZpY2VfdmFsaWRhdGUoIG90dmFsaWQtPmV4dHJhMyArIGRldmljZSwgb3R2YWxpZCApOwotICAgICAgfQotICAgICAgZm9ybWF0ID4+PSAxOwotICAgIH0KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBBTkNIT1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfQW5jaG9yX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBBbmNob3JGb3JtYXQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiQW5jaG9yIik7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDYgKTsKLSAgICBBbmNob3JGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgQW5jaG9yRm9ybWF0ICkpOwotCi0gICAgcCArPSA0OyAgICAgLyogc2tpcCBYQ29vcmRpbmF0ZSBhbmQgWUNvb3JkaW5hdGUgKi8KLQotICAgIHN3aXRjaCAoIEFuY2hvckZvcm1hdCApCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7ICAvKiBBbmNob3JQb2ludCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgICB0YWJsZV9zaXplOwotCi0gICAgICAgIE9UVl9PUFRJT05BTF9UQUJMRSggWERldmljZVRhYmxlICk7Ci0gICAgICAgIE9UVl9PUFRJT05BTF9UQUJMRSggWURldmljZVRhYmxlICk7Ci0KLQotICAgICAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICAgICAgT1RWX09QVElPTkFMX09GRlNFVCggWERldmljZVRhYmxlICk7Ci0gICAgICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIFlEZXZpY2VUYWJsZSApOwotCi0gICAgICAgIHRhYmxlX3NpemUgPSA2ICsgNDsKLQotICAgICAgICBPVFZfU0laRV9DSEVDSyggWERldmljZVRhYmxlICk7Ci0gICAgICAgIGlmICggWERldmljZVRhYmxlICkKLSAgICAgICAgICBvdHZfRGV2aWNlX3ZhbGlkYXRlKCB0YWJsZSArIFhEZXZpY2VUYWJsZSwgb3R2YWxpZCApOwotCi0gICAgICAgIE9UVl9TSVpFX0NIRUNLKCBZRGV2aWNlVGFibGUgKTsKLSAgICAgICAgaWYgKCBZRGV2aWNlVGFibGUgKQotICAgICAgICAgIG90dl9EZXZpY2VfdmFsaWRhdGUoIHRhYmxlICsgWURldmljZVRhYmxlLCBvdHZhbGlkICk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIE1BUksgQVJSQVlTICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X01hcmtBcnJheV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgTWFya0NvdW50OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIk1hcmtBcnJheSIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIE1hcmtDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChNYXJrQ291bnQgPSAlZClcbiIsIE1hcmtDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggTWFya0NvdW50ICogNCApOwotCi0gICAgLyogTWFya1JlY29yZCAqLwotICAgIGZvciAoIDsgTWFya0NvdW50ID4gMDsgTWFya0NvdW50LS0gKQotICAgIHsKLSAgICAgIHAgKz0gMjsgICAvKiBza2lwIENsYXNzICovCi0gICAgICAvKiBNYXJrQW5jaG9yICovCi0gICAgICBvdHZfQW5jaG9yX3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgR1BPUyBMT09LVVAgVFlQRSAxICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5leHRyYTMgKHBvaW50ZXIgdG8gYmFzZSB0YWJsZSkgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfU2luZ2xlUG9zX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBQb3NGb3JtYXQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiU2luZ2xlUG9zIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgUG9zRm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKGZvcm1hdCAlZClcbiIsIFBvc0Zvcm1hdCApKTsKLQotICAgIG90dmFsaWQtPmV4dHJhMyA9IHRhYmxlOwotCi0gICAgc3dpdGNoICggUG9zRm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOiAgICAgLyogU2luZ2xlUG9zRm9ybWF0MSAqLwotICAgICAgewotICAgICAgICBGVF9VSW50ICBDb3ZlcmFnZSwgVmFsdWVGb3JtYXQ7Ci0KLQotICAgICAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICAgICAgQ292ZXJhZ2UgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBWYWx1ZUZvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCB0YWJsZSArIENvdmVyYWdlLCBvdHZhbGlkLCAtMSApOwotICAgICAgICBvdHZfVmFsdWVSZWNvcmRfdmFsaWRhdGUoIHAsIFZhbHVlRm9ybWF0LCBvdHZhbGlkICk7IC8qIFZhbHVlICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjogICAgIC8qIFNpbmdsZVBvc0Zvcm1hdDIgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgQ292ZXJhZ2UsIFZhbHVlRm9ybWF0LCBWYWx1ZUNvdW50LCBsZW5fdmFsdWU7Ci0KLQotICAgICAgICBPVFZfTElNSVRfQ0hFQ0soIDYgKTsKLSAgICAgICAgQ292ZXJhZ2UgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBWYWx1ZUZvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIFZhbHVlQ291bnQgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICBPVFZfVFJBQ0UoKCAiIChWYWx1ZUNvdW50ID0gJWQpXG4iLCBWYWx1ZUNvdW50ICkpOwotCi0gICAgICAgIGxlbl92YWx1ZSA9IG90dl92YWx1ZV9sZW5ndGgoIFZhbHVlRm9ybWF0ICk7Ci0KLSAgICAgICAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCB0YWJsZSArIENvdmVyYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90dmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludClWYWx1ZUNvdW50ICk7Ci0KLSAgICAgICAgT1RWX0xJTUlUX0NIRUNLKCBWYWx1ZUNvdW50ICogbGVuX3ZhbHVlICk7Ci0KLSAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgZm9yICggOyBWYWx1ZUNvdW50ID4gMDsgVmFsdWVDb3VudC0tICkKLSAgICAgICAgewotICAgICAgICAgIG90dl9WYWx1ZVJlY29yZF92YWxpZGF0ZSggcCwgVmFsdWVGb3JtYXQsIG90dmFsaWQgKTsKLSAgICAgICAgICBwICs9IGxlbl92YWx1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIEdQT1MgTE9PS1VQIFRZUEUgMiAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9QYWlyU2V0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGZvcm1hdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBmb3JtYXQyLAotICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICB2YWx1ZV9sZW4xLCB2YWx1ZV9sZW4yLCBQYWlyVmFsdWVDb3VudDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJQYWlyU2V0IiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgUGFpclZhbHVlQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoUGFpclZhbHVlQ291bnQgPSAlZClcbiIsIFBhaXJWYWx1ZUNvdW50ICkpOwotCi0gICAgdmFsdWVfbGVuMSA9IG90dl92YWx1ZV9sZW5ndGgoIGZvcm1hdDEgKTsKLSAgICB2YWx1ZV9sZW4yID0gb3R2X3ZhbHVlX2xlbmd0aCggZm9ybWF0MiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCBQYWlyVmFsdWVDb3VudCAqICggdmFsdWVfbGVuMSArIHZhbHVlX2xlbjIgKyAyICkgKTsKLQotICAgIC8qIFBhaXJWYWx1ZVJlY29yZCAqLwotICAgIGZvciAoIDsgUGFpclZhbHVlQ291bnQgPiAwOyBQYWlyVmFsdWVDb3VudC0tICkKLSAgICB7Ci0gICAgICBwICs9IDI7ICAgICAgIC8qIHNraXAgU2Vjb25kR2x5cGggKi8KLQotICAgICAgaWYgKCBmb3JtYXQxICkKLSAgICAgICAgb3R2X1ZhbHVlUmVjb3JkX3ZhbGlkYXRlKCBwLCBmb3JtYXQxLCBvdHZhbGlkICk7IC8qIFZhbHVlMSAqLwotICAgICAgcCArPSB2YWx1ZV9sZW4xOwotCi0gICAgICBpZiAoIGZvcm1hdDIgKQotICAgICAgICBvdHZfVmFsdWVSZWNvcmRfdmFsaWRhdGUoIHAsIGZvcm1hdDIsIG90dmFsaWQgKTsgLyogVmFsdWUyICovCi0gICAgICBwICs9IHZhbHVlX2xlbjI7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qIHNldHMgb3R2YWxpZC0+ZXh0cmEzIChwb2ludGVyIHRvIGJhc2UgdGFibGUpICovCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X1BhaXJQb3NfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBQb3NGb3JtYXQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiUGFpclBvcyIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIFBvc0Zvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChmb3JtYXQgJWQpXG4iLCBQb3NGb3JtYXQgKSk7Ci0KLSAgICBvdHZhbGlkLT5leHRyYTMgPSB0YWJsZTsKLQotICAgIHN3aXRjaCAoIFBvc0Zvcm1hdCApCi0gICAgewotICAgIGNhc2UgMTogICAgIC8qIFBhaXJQb3NGb3JtYXQxICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIENvdmVyYWdlLCBWYWx1ZUZvcm1hdDEsIFZhbHVlRm9ybWF0MiwgUGFpclNldENvdW50OwotCi0KLSAgICAgICAgT1RWX0xJTUlUX0NIRUNLKCA4ICk7Ci0gICAgICAgIENvdmVyYWdlICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIFZhbHVlRm9ybWF0MSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIFZhbHVlRm9ybWF0MiA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIFBhaXJTZXRDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgT1RWX1RSQUNFKCggIiAoUGFpclNldENvdW50ID0gJWQpXG4iLCBQYWlyU2V0Q291bnQgKSk7Ci0KLSAgICAgICAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCB0YWJsZSArIENvdmVyYWdlLCBvdHZhbGlkLCAtMSApOwotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggUGFpclNldENvdW50ICogMiApOwotCi0gICAgICAgIC8qIFBhaXJTZXRPZmZzZXQgKi8KLSAgICAgICAgZm9yICggOyBQYWlyU2V0Q291bnQgPiAwOyBQYWlyU2V0Q291bnQtLSApCi0gICAgICAgICAgb3R2X1BhaXJTZXRfdmFsaWRhdGUoIHRhYmxlICsgRlRfTkVYVF9VU0hPUlQoIHAgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVGb3JtYXQxLCBWYWx1ZUZvcm1hdDIsIG90dmFsaWQgKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOiAgICAgLyogUGFpclBvc0Zvcm1hdDIgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgQ292ZXJhZ2UsIFZhbHVlRm9ybWF0MSwgVmFsdWVGb3JtYXQyLCBDbGFzc0RlZjEsIENsYXNzRGVmMjsKLSAgICAgICAgRlRfVUludCAgQ2xhc3NDb3VudDEsIENsYXNzQ291bnQyLCBsZW5fdmFsdWUxLCBsZW5fdmFsdWUyLCBjb3VudDsKLQotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggMTQgKTsKLSAgICAgICAgQ292ZXJhZ2UgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgVmFsdWVGb3JtYXQxID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgVmFsdWVGb3JtYXQyID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgQ2xhc3NEZWYxICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgQ2xhc3NEZWYyICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgQ2xhc3NDb3VudDEgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgQ2xhc3NDb3VudDIgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICBPVFZfVFJBQ0UoKCAiIChDbGFzc0NvdW50MSA9ICVkKVxuIiwgQ2xhc3NDb3VudDEgKSk7Ci0gICAgICAgIE9UVl9UUkFDRSgoICIgKENsYXNzQ291bnQyID0gJWQpXG4iLCBDbGFzc0NvdW50MiApKTsKLQotICAgICAgICBsZW5fdmFsdWUxID0gb3R2X3ZhbHVlX2xlbmd0aCggVmFsdWVGb3JtYXQxICk7Ci0gICAgICAgIGxlbl92YWx1ZTIgPSBvdHZfdmFsdWVfbGVuZ3RoKCBWYWx1ZUZvcm1hdDIgKTsKLQotICAgICAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgQ292ZXJhZ2UsIG90dmFsaWQsIC0xICk7Ci0gICAgICAgIG90dl9DbGFzc0RlZl92YWxpZGF0ZSggdGFibGUgKyBDbGFzc0RlZjEsIG90dmFsaWQgKTsKLSAgICAgICAgb3R2X0NsYXNzRGVmX3ZhbGlkYXRlKCB0YWJsZSArIENsYXNzRGVmMiwgb3R2YWxpZCApOwotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggQ2xhc3NDb3VudDEgKiBDbGFzc0NvdW50MiAqCi0gICAgICAgICAgICAgICAgICAgICAoIGxlbl92YWx1ZTEgKyBsZW5fdmFsdWUyICkgKTsKLQotICAgICAgICAvKiBDbGFzczFSZWNvcmQgKi8KLSAgICAgICAgZm9yICggOyBDbGFzc0NvdW50MSA+IDA7IENsYXNzQ291bnQxLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgLyogQ2xhc3MyUmVjb3JkICovCi0gICAgICAgICAgZm9yICggY291bnQgPSBDbGFzc0NvdW50MjsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIFZhbHVlRm9ybWF0MSApCi0gICAgICAgICAgICAgIC8qIFZhbHVlMSAqLwotICAgICAgICAgICAgICBvdHZfVmFsdWVSZWNvcmRfdmFsaWRhdGUoIHAsIFZhbHVlRm9ybWF0MSwgb3R2YWxpZCApOwotICAgICAgICAgICAgcCArPSBsZW5fdmFsdWUxOwotCi0gICAgICAgICAgICBpZiAoIFZhbHVlRm9ybWF0MiApCi0gICAgICAgICAgICAgIC8qIFZhbHVlMiAqLwotICAgICAgICAgICAgICBvdHZfVmFsdWVSZWNvcmRfdmFsaWRhdGUoIHAsIFZhbHVlRm9ybWF0Miwgb3R2YWxpZCApOwotICAgICAgICAgICAgcCArPSBsZW5fdmFsdWUyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIEdQT1MgTE9PS1VQIFRZUEUgMyAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9DdXJzaXZlUG9zX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgUG9zRm9ybWF0OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIkN1cnNpdmVQb3MiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBQb3NGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgUG9zRm9ybWF0ICkpOwotCi0gICAgc3dpdGNoICggUG9zRm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOiAgICAgLyogQ3Vyc2l2ZVBvc0Zvcm1hdDEgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgIHRhYmxlX3NpemU7Ci0gICAgICAgIEZUX1VJbnQgICBDb3ZlcmFnZSwgRW50cnlFeGl0Q291bnQ7Ci0KLSAgICAgICAgT1RWX09QVElPTkFMX1RBQkxFKCBFbnRyeUFuY2hvciApOwotICAgICAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIEV4aXRBbmNob3IgICk7Ci0KLQotICAgICAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICAgICAgQ292ZXJhZ2UgICAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBFbnRyeUV4aXRDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgT1RWX1RSQUNFKCggIiAoRW50cnlFeGl0Q291bnQgPSAlZClcbiIsIEVudHJ5RXhpdENvdW50ICkpOwotCi0gICAgICAgIG90dl9Db3ZlcmFnZV92YWxpZGF0ZSggdGFibGUgKyBDb3ZlcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpRW50cnlFeGl0Q291bnQgKTsKLQotICAgICAgICBPVFZfTElNSVRfQ0hFQ0soIEVudHJ5RXhpdENvdW50ICogNCApOwotCi0gICAgICAgIHRhYmxlX3NpemUgPSBFbnRyeUV4aXRDb3VudCAqIDQgKyA0OwotCi0gICAgICAgIC8qIEVudHJ5RXhpdFJlY29yZCAqLwotICAgICAgICBmb3IgKCA7IEVudHJ5RXhpdENvdW50ID4gMDsgRW50cnlFeGl0Q291bnQtLSApCi0gICAgICAgIHsKLSAgICAgICAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBFbnRyeUFuY2hvciApOwotICAgICAgICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIEV4aXRBbmNob3IgICk7Ci0KLSAgICAgICAgICBPVFZfU0laRV9DSEVDSyggRW50cnlBbmNob3IgKTsKLSAgICAgICAgICBpZiAoIEVudHJ5QW5jaG9yICkKLSAgICAgICAgICAgIG90dl9BbmNob3JfdmFsaWRhdGUoIHRhYmxlICsgRW50cnlBbmNob3IsIG90dmFsaWQgKTsKLQotICAgICAgICAgIE9UVl9TSVpFX0NIRUNLKCBFeGl0QW5jaG9yICk7Ci0gICAgICAgICAgaWYgKCBFeGl0QW5jaG9yICkKLSAgICAgICAgICAgIG90dl9BbmNob3JfdmFsaWRhdGUoIHRhYmxlICsgRXhpdEFuY2hvciwgb3R2YWxpZCApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgR1BPUyBMT09LVVAgVFlQRSA0ICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogVU5ET0NVTUVOVEVEIChpbiBPcGVuVHlwZSAxLjUpOiAgICAgICAgICAgICAgKi8KLSAgLyogQmFzZVJlY29yZCB0YWJsZXMgY2FuIGNvbnRhaW4gTlVMTCBwb2ludGVycy4gKi8KLQotICAvKiBzZXRzIG90dmFsaWQtPmV4dHJhMiAoMSkgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfTWFya0Jhc2VQb3NfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgUG9zRm9ybWF0OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIk1hcmtCYXNlUG9zIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgUG9zRm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKGZvcm1hdCAlZClcbiIsIFBvc0Zvcm1hdCApKTsKLQotICAgIHN3aXRjaCAoIFBvc0Zvcm1hdCApCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIG90dmFsaWQtPmV4dHJhMiA9IDE7Ci0gICAgICBPVFZfTkVTVDIoIE1hcmtCYXNlUG9zRm9ybWF0MSwgQmFzZUFycmF5ICk7Ci0gICAgICBPVFZfUlVOKCB0YWJsZSwgb3R2YWxpZCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIEdQT1MgTE9PS1VQIFRZUEUgNSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHNldHMgb3R2YWxpZC0+ZXh0cmEyICgxKSAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9NYXJrTGlnUG9zX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgUG9zRm9ybWF0OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIk1hcmtMaWdQb3MiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBQb3NGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgUG9zRm9ybWF0ICkpOwotCi0gICAgc3dpdGNoICggUG9zRm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgb3R2YWxpZC0+ZXh0cmEyID0gMTsKLSAgICAgIE9UVl9ORVNUMyggTWFya0xpZ1Bvc0Zvcm1hdDEsIExpZ2F0dXJlQXJyYXksIExpZ2F0dXJlQXR0YWNoICk7Ci0gICAgICBPVFZfUlVOKCB0YWJsZSwgb3R2YWxpZCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIEdQT1MgTE9PS1VQIFRZUEUgNiAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHNldHMgb3R2YWxpZC0+ZXh0cmEyICgwKSAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9NYXJrTWFya1Bvc192YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBQb3NGb3JtYXQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiTWFya01hcmtQb3MiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBQb3NGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgUG9zRm9ybWF0ICkpOwotCi0gICAgc3dpdGNoICggUG9zRm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgb3R2YWxpZC0+ZXh0cmEyID0gMDsKLSAgICAgIE9UVl9ORVNUMiggTWFya01hcmtQb3NGb3JtYXQxLCBNYXJrMkFycmF5ICk7Ci0gICAgICBPVFZfUlVOKCB0YWJsZSwgb3R2YWxpZCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIEdQT1MgTE9PS1VQIFRZUEUgNyAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHNldHMgb3R2YWxpZC0+ZXh0cmExIChsb29rdXAgY291bnQpICovCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0NvbnRleHRQb3NfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBQb3NGb3JtYXQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiQ29udGV4dFBvcyIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIFBvc0Zvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChmb3JtYXQgJWQpXG4iLCBQb3NGb3JtYXQgKSk7Ci0KLSAgICBzd2l0Y2ggKCBQb3NGb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGdseXBoIGluZGljZXMvY2xhc3NlcyB1c2VkIGFzIGlucHV0IGZvciB0aGVzZSAqLwotICAgICAgLyogY29udGV4dCBydWxlcyBzaW5jZSBldmVuIGludmFsaWQgZ2x5cGggaW5kaWNlcy9jbGFzc2VzIHJldHVybiAgKi8KLSAgICAgIC8qIG1lYW5pbmdmdWwgcmVzdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIG90dmFsaWQtPmV4dHJhMSA9IG90dmFsaWQtPmxvb2t1cF9jb3VudDsKLSAgICAgIE9UVl9ORVNUMyggQ29udGV4dFBvc0Zvcm1hdDEsIFBvc1J1bGVTZXQsIFBvc1J1bGUgKTsKLSAgICAgIE9UVl9SVU4oIHRhYmxlLCBvdHZhbGlkICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIC8qIG5vIG5lZWQgdG8gY2hlY2sgZ2x5cGggaW5kaWNlcy9jbGFzc2VzIHVzZWQgYXMgaW5wdXQgZm9yIHRoZXNlICovCi0gICAgICAvKiBjb250ZXh0IHJ1bGVzIHNpbmNlIGV2ZW4gaW52YWxpZCBnbHlwaCBpbmRpY2VzL2NsYXNzZXMgcmV0dXJuICAqLwotICAgICAgLyogbWVhbmluZ2Z1bCByZXN1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgT1RWX05FU1QzKCBDb250ZXh0UG9zRm9ybWF0MiwgUG9zQ2xhc3NTZXQsIFBvc0NsYXNzUnVsZSApOwotICAgICAgT1RWX1JVTiggdGFibGUsIG90dmFsaWQgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgT1RWX05FU1QxKCBDb250ZXh0UG9zRm9ybWF0MyApOwotICAgICAgT1RWX1JVTiggdGFibGUsIG90dmFsaWQgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotICAgIH0KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICBHUE9TIExPT0tVUCBUWVBFIDggICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBzZXRzIG90dmFsaWQtPmV4dHJhMSAobG9va3VwIGNvdW50KSAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9DaGFpbkNvbnRleHRQb3NfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIFBvc0Zvcm1hdDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJDaGFpbkNvbnRleHRQb3MiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBQb3NGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgUG9zRm9ybWF0ICkpOwotCi0gICAgc3dpdGNoICggUG9zRm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgLyogbm8gbmVlZCB0byBjaGVjayBnbHlwaCBpbmRpY2VzL2NsYXNzZXMgdXNlZCBhcyBpbnB1dCBmb3IgdGhlc2UgKi8KLSAgICAgIC8qIGNvbnRleHQgcnVsZXMgc2luY2UgZXZlbiBpbnZhbGlkIGdseXBoIGluZGljZXMvY2xhc3NlcyByZXR1cm4gICovCi0gICAgICAvKiBtZWFuaW5nZnVsIHJlc3VsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBvdHZhbGlkLT5leHRyYTEgPSBvdHZhbGlkLT5sb29rdXBfY291bnQ7Ci0gICAgICBPVFZfTkVTVDMoIENoYWluQ29udGV4dFBvc0Zvcm1hdDEsCi0gICAgICAgICAgICAgICAgIENoYWluUG9zUnVsZVNldCwgQ2hhaW5Qb3NSdWxlICk7Ci0gICAgICBPVFZfUlVOKCB0YWJsZSwgb3R2YWxpZCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGdseXBoIGluZGljZXMvY2xhc3NlcyB1c2VkIGFzIGlucHV0IGZvciB0aGVzZSAqLwotICAgICAgLyogY29udGV4dCBydWxlcyBzaW5jZSBldmVuIGludmFsaWQgZ2x5cGggaW5kaWNlcy9jbGFzc2VzIHJldHVybiAgKi8KLSAgICAgIC8qIG1lYW5pbmdmdWwgcmVzdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIE9UVl9ORVNUMyggQ2hhaW5Db250ZXh0UG9zRm9ybWF0MiwKLSAgICAgICAgICAgICAgICAgQ2hhaW5Qb3NDbGFzc1NldCwgQ2hhaW5Qb3NDbGFzc1J1bGUgKTsKLSAgICAgIE9UVl9SVU4oIHRhYmxlLCBvdHZhbGlkICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIE9UVl9ORVNUMSggQ2hhaW5Db250ZXh0UG9zRm9ybWF0MyApOwotICAgICAgT1RWX1JVTiggdGFibGUsIG90dmFsaWQgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotICAgIH0KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICBHUE9TIExPT0tVUCBUWVBFIDkgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiB1c2VzIG90dmFsaWQtPnR5cGVfZnVuY3MgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfRXh0ZW5zaW9uUG9zX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBQb3NGb3JtYXQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiRXh0ZW5zaW9uUG9zIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgUG9zRm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKGZvcm1hdCAlZClcbiIsIFBvc0Zvcm1hdCApKTsKLQotICAgIHN3aXRjaCAoIFBvc0Zvcm1hdCApCi0gICAgewotICAgIGNhc2UgMTogICAgIC8qIEV4dGVuc2lvblBvc0Zvcm1hdDEgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgICAgICAgICAgIEV4dGVuc2lvbkxvb2t1cFR5cGU7Ci0gICAgICAgIEZUX1VMb25nICAgICAgICAgICBFeHRlbnNpb25PZmZzZXQ7Ci0gICAgICAgIE9UVl9WYWxpZGF0ZV9GdW5jICB2YWxpZGF0ZTsKLQotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggNiApOwotICAgICAgICBFeHRlbnNpb25Mb29rdXBUeXBlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgRXh0ZW5zaW9uT2Zmc2V0ICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICBpZiAoIEV4dGVuc2lvbkxvb2t1cFR5cGUgPT0gMCB8fCBFeHRlbnNpb25Mb29rdXBUeXBlID49IDkgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICB2YWxpZGF0ZSA9IG90dmFsaWQtPnR5cGVfZnVuY3NbRXh0ZW5zaW9uTG9va3VwVHlwZSAtIDFdOwotICAgICAgICB2YWxpZGF0ZSggdGFibGUgKyBFeHRlbnNpb25PZmZzZXQsIG90dmFsaWQgKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotICAgIH0KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgT1RWX1ZhbGlkYXRlX0Z1bmMgIG90dl9ncG9zX3ZhbGlkYXRlX2Z1bmNzWzldID0KLSAgewotICAgIG90dl9TaW5nbGVQb3NfdmFsaWRhdGUsCi0gICAgb3R2X1BhaXJQb3NfdmFsaWRhdGUsCi0gICAgb3R2X0N1cnNpdmVQb3NfdmFsaWRhdGUsCi0gICAgb3R2X01hcmtCYXNlUG9zX3ZhbGlkYXRlLAotICAgIG90dl9NYXJrTGlnUG9zX3ZhbGlkYXRlLAotICAgIG90dl9NYXJrTWFya1Bvc192YWxpZGF0ZSwKLSAgICBvdHZfQ29udGV4dFBvc192YWxpZGF0ZSwKLSAgICBvdHZfQ2hhaW5Db250ZXh0UG9zX3ZhbGlkYXRlLAotICAgIG90dl9FeHRlbnNpb25Qb3NfdmFsaWRhdGUKLSAgfTsKLQotCi0gIC8qIHNldHMgb3R2YWxpZC0+dHlwZV9jb3VudCAqLwotICAvKiBzZXRzIG90dmFsaWQtPnR5cGVfZnVuY3MgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBvdHZfR1BPU19zdWJ0YWJsZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIG90dmFsaWQtPnR5cGVfY291bnQgPSA5OwotICAgIG90dmFsaWQtPnR5cGVfZnVuY3MgPSAoT1RWX1ZhbGlkYXRlX0Z1bmMqKW90dl9ncG9zX3ZhbGlkYXRlX2Z1bmNzOwotCi0gICAgb3R2X0xvb2t1cF92YWxpZGF0ZSggdGFibGUsIG90dmFsaWQgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBHUE9TIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5nbHlwaF9jb3VudCAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl9HUE9TX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgZnR2YWxpZCApCi0gIHsKLSAgICBPVFZfVmFsaWRhdG9yUmVjICB2YWxpZHJlYzsKLSAgICBPVFZfVmFsaWRhdG9yICAgICBvdHZhbGlkID0gJnZhbGlkcmVjOwotICAgIEZUX0J5dGVzICAgICAgICAgIHAgICAgID0gdGFibGU7Ci0gICAgRlRfVUludCAgICAgICAgICAgU2NyaXB0TGlzdCwgRmVhdHVyZUxpc3QsIExvb2t1cExpc3Q7Ci0KLQotICAgIG90dmFsaWQtPnJvb3QgPSBmdHZhbGlkOwotCi0gICAgRlRfVFJBQ0UzKCggInZhbGlkYXRpbmcgR1BPUyB0YWJsZVxuIiApKTsKLSAgICBPVFZfSU5JVDsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMTAgKTsKLQotICAgIGlmICggRlRfTkVYVF9VTE9ORyggcCApICE9IDB4MTAwMDBVTCApICAgICAgLyogVmVyc2lvbiAqLwotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICBTY3JpcHRMaXN0ICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRmVhdHVyZUxpc3QgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIExvb2t1cExpc3QgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIG90dmFsaWQtPnR5cGVfY291bnQgID0gOTsKLSAgICBvdHZhbGlkLT50eXBlX2Z1bmNzICA9IChPVFZfVmFsaWRhdGVfRnVuYyopb3R2X2dwb3NfdmFsaWRhdGVfZnVuY3M7Ci0gICAgb3R2YWxpZC0+Z2x5cGhfY291bnQgPSBnbHlwaF9jb3VudDsKLQotICAgIG90dl9Mb29rdXBMaXN0X3ZhbGlkYXRlKCB0YWJsZSArIExvb2t1cExpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90dmFsaWQgKTsKLSAgICBvdHZfRmVhdHVyZUxpc3RfdmFsaWRhdGUoIHRhYmxlICsgRmVhdHVyZUxpc3QsIHRhYmxlICsgTG9va3VwTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90dmFsaWQgKTsKLSAgICBvdHZfU2NyaXB0TGlzdF92YWxpZGF0ZSggdGFibGUgKyBTY3JpcHRMaXN0LCB0YWJsZSArIEZlYXR1cmVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdHZhbGlkICk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZncG9zLmggYi9zcmMvb3R2YWxpZC9vdHZncG9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjBhZDMuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvb3R2Z3Bvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Z3Bvcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdQT1MgdGFibGUgdmFsaWRhdG9yIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIE9UVkdQT1NfSF8KLSNkZWZpbmUgT1RWR1BPU19IXwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBvdHZfR1BPU19zdWJ0YWJsZV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICB2YWxpZCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIE9UVkdQT1NfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dmdzdWIuYyBiL3NyYy9vdHZhbGlkL290dmdzdWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZDhkYy4uMDAwMDAwMAotLS0gYS9zcmMvb3R2YWxpZC9vdHZnc3ViLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Z3N1Yi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdTVUIgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAib3R2YWxpZC5oIgotI2luY2x1ZGUgIm90dmNvbW1uLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vdHZnc3ViCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICBHU1VCIExPT0tVUCBUWVBFIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiB1c2VzIG90dmFsaWQtPmdseXBoX2NvdW50ICovCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X1NpbmdsZVN1YnN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIFN1YnN0Rm9ybWF0OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIlNpbmdsZVN1YnN0IiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgU3Vic3RGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgU3Vic3RGb3JtYXQgKSk7Ci0KLSAgICBzd2l0Y2ggKCBTdWJzdEZvcm1hdCApCi0gICAgewotICAgIGNhc2UgMTogICAgIC8qIFNpbmdsZVN1YnN0Rm9ybWF0MSAqLwotICAgICAgewotICAgICAgICBGVF9CeXRlcyAgQ292ZXJhZ2U7Ci0gICAgICAgIEZUX0ludCAgICBEZWx0YUdseXBoSUQ7Ci0gICAgICAgIEZUX0xvbmcgICBpZHg7Ci0KLQotICAgICAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICAgICAgQ292ZXJhZ2UgICAgID0gdGFibGUgKyBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBEZWx0YUdseXBoSUQgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0KLSAgICAgICAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCBDb3ZlcmFnZSwgb3R2YWxpZCwgLTEgKTsKLQotICAgICAgICBpZHggPSAoRlRfTG9uZylvdHZfQ292ZXJhZ2VfZ2V0X2ZpcnN0KCBDb3ZlcmFnZSApICsgRGVsdGFHbHlwaElEOwotICAgICAgICBpZiAoIGlkeCA8IDAgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICBpZHggPSAoRlRfTG9uZylvdHZfQ292ZXJhZ2VfZ2V0X2xhc3QoIENvdmVyYWdlICkgKyBEZWx0YUdseXBoSUQ7Ci0gICAgICAgIGlmICggKEZUX1VJbnQpaWR4ID49IG90dmFsaWQtPmdseXBoX2NvdW50ICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjogICAgIC8qIFNpbmdsZVN1YnN0Rm9ybWF0MiAqLwotICAgICAgewotICAgICAgICBGVF9VSW50ICBDb3ZlcmFnZSwgR2x5cGhDb3VudDsKLQotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggNCApOwotICAgICAgICBDb3ZlcmFnZSAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgR2x5cGhDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgT1RWX1RSQUNFKCggIiAoR2x5cGhDb3VudCA9ICVkKVxuIiwgR2x5cGhDb3VudCApKTsKLQotICAgICAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgQ292ZXJhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3R2YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KUdseXBoQ291bnQgKTsKLQotICAgICAgICBPVFZfTElNSVRfQ0hFQ0soIEdseXBoQ291bnQgKiAyICk7Ci0KLSAgICAgICAgLyogU3Vic3RpdHV0ZSAqLwotICAgICAgICBmb3IgKCA7IEdseXBoQ291bnQgPiAwOyBHbHlwaENvdW50LS0gKQotICAgICAgICAgIGlmICggRlRfTkVYVF9VU0hPUlQoIHAgKSA+PSBvdHZhbGlkLT5nbHlwaF9jb3VudCApCi0gICAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgIEdTVUIgTE9PS1VQIFRZUEUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHNldHMgb3R2YWxpZC0+ZXh0cmExIChnbHlwaCBjb3VudCkgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfTXVsdGlwbGVTdWJzdF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIFN1YnN0Rm9ybWF0OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIk11bHRpcGxlU3Vic3QiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBTdWJzdEZvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChmb3JtYXQgJWQpXG4iLCBTdWJzdEZvcm1hdCApKTsKLQotICAgIHN3aXRjaCAoIFN1YnN0Rm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgb3R2YWxpZC0+ZXh0cmExID0gb3R2YWxpZC0+Z2x5cGhfY291bnQ7Ci0gICAgICBPVFZfTkVTVDIoIE11bHRpcGxlU3Vic3RGb3JtYXQxLCBTZXF1ZW5jZSApOwotICAgICAgT1RWX1JVTiggdGFibGUsIG90dmFsaWQgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotICAgIH0KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIEdTVUIgTE9PS1VQIFRZUEUgMyAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBzZXRzIG90dmFsaWQtPmV4dHJhMSAoZ2x5cGggY291bnQpICovCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0FsdGVybmF0ZVN1YnN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIFN1YnN0Rm9ybWF0OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIkFsdGVybmF0ZVN1YnN0IiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgU3Vic3RGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgU3Vic3RGb3JtYXQgKSk7Ci0KLSAgICBzd2l0Y2ggKCBTdWJzdEZvcm1hdCApCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIG90dmFsaWQtPmV4dHJhMSA9IG90dmFsaWQtPmdseXBoX2NvdW50OwotICAgICAgT1RWX05FU1QyKCBBbHRlcm5hdGVTdWJzdEZvcm1hdDEsIEFsdGVybmF0ZVNldCApOwotICAgICAgT1RWX1JVTiggdGFibGUsIG90dmFsaWQgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotICAgIH0KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIEdTVUIgTE9PS1VQIFRZUEUgNCAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMaWdhdHVyZUZ1bmMgIG90dl9MaWdhdHVyZV92YWxpZGF0ZQotCi0gIC8qIHVzZXMgb3R2YWxpZC0+Z2x5cGhfY291bnQgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfTGlnYXR1cmVfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgTGlnYXR1cmVHbHlwaCwgQ29tcENvdW50OwotCi0KLSAgICBPVFZfRU5URVI7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLSAgICBMaWdhdHVyZUdseXBoID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBpZiAoIExpZ2F0dXJlR2x5cGggPj0gb3R2YWxpZC0+Z2x5cGhfY291bnQgKQotICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgQ29tcENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKENvbXBDb3VudCA9ICVkKVxuIiwgQ29tcENvdW50ICkpOwotCi0gICAgaWYgKCBDb21wQ291bnQgPT0gMCApCi0gICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICBDb21wQ291bnQtLTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggQ29tcENvdW50ICogMiApOyAgICAgLyogQ29tcG9uZW50ICovCi0KLSAgICAvKiBubyBuZWVkIHRvIGNoZWNrIHRoZSBDb21wb25lbnQgZ2x5cGggaW5kaWNlcyAqLwotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9MaWdhdHVyZVN1YnN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgU3Vic3RGb3JtYXQ7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiTGlnYXR1cmVTdWJzdCIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIFN1YnN0Rm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKGZvcm1hdCAlZClcbiIsIFN1YnN0Rm9ybWF0ICkpOwotCi0gICAgc3dpdGNoICggU3Vic3RGb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBPVFZfTkVTVDMoIExpZ2F0dXJlU3Vic3RGb3JtYXQxLCBMaWdhdHVyZVNldCwgTGlnYXR1cmUgKTsKLSAgICAgIE9UVl9SVU4oIHRhYmxlLCBvdHZhbGlkICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgR1NVQiBMT09LVVAgVFlQRSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5leHRyYTEgKGxvb2t1cCBjb3VudCkgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfQ29udGV4dFN1YnN0X3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBTdWJzdEZvcm1hdDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJDb250ZXh0U3Vic3QiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLSAgICBTdWJzdEZvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfVFJBQ0UoKCAiIChmb3JtYXQgJWQpXG4iLCBTdWJzdEZvcm1hdCApKTsKLQotICAgIHN3aXRjaCAoIFN1YnN0Rm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgLyogbm8gbmVlZCB0byBjaGVjayBnbHlwaCBpbmRpY2VzL2NsYXNzZXMgdXNlZCBhcyBpbnB1dCBmb3IgdGhlc2UgKi8KLSAgICAgIC8qIGNvbnRleHQgcnVsZXMgc2luY2UgZXZlbiBpbnZhbGlkIGdseXBoIGluZGljZXMvY2xhc3NlcyByZXR1cm4gICovCi0gICAgICAvKiBtZWFuaW5nZnVsIHJlc3VsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBvdHZhbGlkLT5leHRyYTEgPSBvdHZhbGlkLT5sb29rdXBfY291bnQ7Ci0gICAgICBPVFZfTkVTVDMoIENvbnRleHRTdWJzdEZvcm1hdDEsIFN1YlJ1bGVTZXQsIFN1YlJ1bGUgKTsKLSAgICAgIE9UVl9SVU4oIHRhYmxlLCBvdHZhbGlkICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIC8qIG5vIG5lZWQgdG8gY2hlY2sgZ2x5cGggaW5kaWNlcy9jbGFzc2VzIHVzZWQgYXMgaW5wdXQgZm9yIHRoZXNlICovCi0gICAgICAvKiBjb250ZXh0IHJ1bGVzIHNpbmNlIGV2ZW4gaW52YWxpZCBnbHlwaCBpbmRpY2VzL2NsYXNzZXMgcmV0dXJuICAqLwotICAgICAgLyogbWVhbmluZ2Z1bCByZXN1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgT1RWX05FU1QzKCBDb250ZXh0U3Vic3RGb3JtYXQyLCBTdWJDbGFzc1NldCwgU3ViQ2xhc3NSdWxlICk7Ci0gICAgICBPVFZfUlVOKCB0YWJsZSwgb3R2YWxpZCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICBPVFZfTkVTVDEoIENvbnRleHRTdWJzdEZvcm1hdDMgKTsKLSAgICAgIE9UVl9SVU4oIHRhYmxlLCBvdHZhbGlkICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBHU1VCIExPT0tVUCBUWVBFIDYgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5leHRyYTEgKGxvb2t1cCBjb3VudCkgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9DaGFpbkNvbnRleHRTdWJzdF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBTdWJzdEZvcm1hdDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJDaGFpbkNvbnRleHRTdWJzdCIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIFN1YnN0Rm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKGZvcm1hdCAlZClcbiIsIFN1YnN0Rm9ybWF0ICkpOwotCi0gICAgc3dpdGNoICggU3Vic3RGb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGdseXBoIGluZGljZXMvY2xhc3NlcyB1c2VkIGFzIGlucHV0IGZvciB0aGVzZSAqLwotICAgICAgLyogY29udGV4dCBydWxlcyBzaW5jZSBldmVuIGludmFsaWQgZ2x5cGggaW5kaWNlcy9jbGFzc2VzIHJldHVybiAgKi8KLSAgICAgIC8qIG1lYW5pbmdmdWwgcmVzdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIG90dmFsaWQtPmV4dHJhMSA9IG90dmFsaWQtPmxvb2t1cF9jb3VudDsKLSAgICAgIE9UVl9ORVNUMyggQ2hhaW5Db250ZXh0U3Vic3RGb3JtYXQxLAotICAgICAgICAgICAgICAgICBDaGFpblN1YlJ1bGVTZXQsIENoYWluU3ViUnVsZSApOwotICAgICAgT1RWX1JVTiggdGFibGUsIG90dmFsaWQgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgLyogbm8gbmVlZCB0byBjaGVjayBnbHlwaCBpbmRpY2VzL2NsYXNzZXMgdXNlZCBhcyBpbnB1dCBmb3IgdGhlc2UgKi8KLSAgICAgIC8qIGNvbnRleHQgcnVsZXMgc2luY2UgZXZlbiBpbnZhbGlkIGdseXBoIGluZGljZXMvY2xhc3NlcyByZXR1cm4gICovCi0gICAgICAvKiBtZWFuaW5nZnVsIHJlc3VsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBPVFZfTkVTVDMoIENoYWluQ29udGV4dFN1YnN0Rm9ybWF0MiwKLSAgICAgICAgICAgICAgICAgQ2hhaW5TdWJDbGFzc1NldCwgQ2hhaW5TdWJDbGFzc1J1bGUgKTsKLSAgICAgIE9UVl9SVU4oIHRhYmxlLCBvdHZhbGlkICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIE9UVl9ORVNUMSggQ2hhaW5Db250ZXh0U3Vic3RGb3JtYXQzICk7Ci0gICAgICBPVFZfUlVOKCB0YWJsZSwgb3R2YWxpZCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgR1NVQiBMT09LVVAgVFlQRSA3ICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHVzZXMgb3R2YWxpZC0+dHlwZV9mdW5jcyAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9FeHRlbnNpb25TdWJzdF92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBTdWJzdEZvcm1hdDsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJFeHRlbnNpb25TdWJzdCIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMiApOwotICAgIFN1YnN0Rm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9UUkFDRSgoICIgKGZvcm1hdCAlZClcbiIsIFN1YnN0Rm9ybWF0ICkpOwotCi0gICAgc3dpdGNoICggU3Vic3RGb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6ICAgICAvKiBFeHRlbnNpb25TdWJzdEZvcm1hdDEgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgICAgICAgICAgIEV4dGVuc2lvbkxvb2t1cFR5cGU7Ci0gICAgICAgIEZUX1VMb25nICAgICAgICAgICBFeHRlbnNpb25PZmZzZXQ7Ci0gICAgICAgIE9UVl9WYWxpZGF0ZV9GdW5jICB2YWxpZGF0ZTsKLQotCi0gICAgICAgIE9UVl9MSU1JVF9DSEVDSyggNiApOwotICAgICAgICBFeHRlbnNpb25Mb29rdXBUeXBlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgRXh0ZW5zaW9uT2Zmc2V0ICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICBpZiAoIEV4dGVuc2lvbkxvb2t1cFR5cGUgPT0gMCB8fAotICAgICAgICAgICAgIEV4dGVuc2lvbkxvb2t1cFR5cGUgPT0gNyB8fAotICAgICAgICAgICAgIEV4dGVuc2lvbkxvb2t1cFR5cGUgPiA4ICApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgIHZhbGlkYXRlID0gb3R2YWxpZC0+dHlwZV9mdW5jc1tFeHRlbnNpb25Mb29rdXBUeXBlIC0gMV07Ci0gICAgICAgIHZhbGlkYXRlKCB0YWJsZSArIEV4dGVuc2lvbk9mZnNldCwgb3R2YWxpZCApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgR1NVQiBMT09LVVAgVFlQRSA4ICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHVzZXMgb3R2YWxpZC0+Z2x5cGhfY291bnQgKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfUmV2ZXJzZUNoYWluU2luZ2xlU3Vic3RfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZSwgQ292ZXJhZ2U7Ci0gICAgRlRfVUludCAgIFN1YnN0Rm9ybWF0OwotICAgIEZUX1VJbnQgICBCYWNrdHJhY2tHbHlwaENvdW50LCBMb29rYWhlYWRHbHlwaENvdW50LCBHbHlwaENvdW50OwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggIlJldmVyc2VDaGFpblNpbmdsZVN1YnN0IiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICk7Ci0gICAgU3Vic3RGb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoZm9ybWF0ICVkKVxuIiwgU3Vic3RGb3JtYXQgKSk7Ci0KLSAgICBzd2l0Y2ggKCBTdWJzdEZvcm1hdCApCi0gICAgewotICAgIGNhc2UgMTogICAgIC8qIFJldmVyc2VDaGFpblNpbmdsZVN1YnN0Rm9ybWF0MSAqLwotICAgICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0gICAgICBDb3ZlcmFnZSAgICAgICAgICAgID0gdGFibGUgKyBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgQmFja3RyYWNrR2x5cGhDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIE9UVl9UUkFDRSgoICIgKEJhY2t0cmFja0dseXBoQ291bnQgPSAlZClcbiIsIEJhY2t0cmFja0dseXBoQ291bnQgKSk7Ci0KLSAgICAgIG90dl9Db3ZlcmFnZV92YWxpZGF0ZSggQ292ZXJhZ2UsIG90dmFsaWQsIC0xICk7Ci0KLSAgICAgIE9UVl9MSU1JVF9DSEVDSyggQmFja3RyYWNrR2x5cGhDb3VudCAqIDIgKyAyICk7Ci0KLSAgICAgIGZvciAoIDsgQmFja3RyYWNrR2x5cGhDb3VudCA+IDA7IEJhY2t0cmFja0dseXBoQ291bnQtLSApCi0gICAgICAgIG90dl9Db3ZlcmFnZV92YWxpZGF0ZSggdGFibGUgKyBGVF9ORVhUX1VTSE9SVCggcCApLCBvdHZhbGlkLCAtMSApOwotCi0gICAgICBMb29rYWhlYWRHbHlwaENvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgT1RWX1RSQUNFKCggIiAoTG9va2FoZWFkR2x5cGhDb3VudCA9ICVkKVxuIiwgTG9va2FoZWFkR2x5cGhDb3VudCApKTsKLQotICAgICAgT1RWX0xJTUlUX0NIRUNLKCBMb29rYWhlYWRHbHlwaENvdW50ICogMiArIDIgKTsKLQotICAgICAgZm9yICggOyBMb29rYWhlYWRHbHlwaENvdW50ID4gMDsgTG9va2FoZWFkR2x5cGhDb3VudC0tICkKLSAgICAgICAgb3R2X0NvdmVyYWdlX3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQsIC0xICk7Ci0KLSAgICAgIEdseXBoQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICBPVFZfVFJBQ0UoKCAiIChHbHlwaENvdW50ID0gJWQpXG4iLCBHbHlwaENvdW50ICkpOwotCi0gICAgICBpZiAoIEdseXBoQ291bnQgIT0gb3R2X0NvdmVyYWdlX2dldF9jb3VudCggQ292ZXJhZ2UgKSApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgT1RWX0xJTUlUX0NIRUNLKCBHbHlwaENvdW50ICogMiApOwotCi0gICAgICAvKiBTdWJzdGl0dXRlICovCi0gICAgICBmb3IgKCA7IEdseXBoQ291bnQgPiAwOyBHbHlwaENvdW50LS0gKQotICAgICAgICBpZiAoIEZUX05FWFRfVVNIT1JUKCBwICkgPj0gb3R2YWxpZC0+Z2x5cGhfY291bnQgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBPVFZfVmFsaWRhdGVfRnVuYyAgb3R2X2dzdWJfdmFsaWRhdGVfZnVuY3NbOF0gPQotICB7Ci0gICAgb3R2X1NpbmdsZVN1YnN0X3ZhbGlkYXRlLAotICAgIG90dl9NdWx0aXBsZVN1YnN0X3ZhbGlkYXRlLAotICAgIG90dl9BbHRlcm5hdGVTdWJzdF92YWxpZGF0ZSwKLSAgICBvdHZfTGlnYXR1cmVTdWJzdF92YWxpZGF0ZSwKLSAgICBvdHZfQ29udGV4dFN1YnN0X3ZhbGlkYXRlLAotICAgIG90dl9DaGFpbkNvbnRleHRTdWJzdF92YWxpZGF0ZSwKLSAgICBvdHZfRXh0ZW5zaW9uU3Vic3RfdmFsaWRhdGUsCi0gICAgb3R2X1JldmVyc2VDaGFpblNpbmdsZVN1YnN0X3ZhbGlkYXRlCi0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEdTVUIgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBzZXRzIG90dmFsaWQtPnR5cGVfY291bnQgICovCi0gIC8qIHNldHMgb3R2YWxpZC0+dHlwZV9mdW5jcyAgKi8KLSAgLyogc2V0cyBvdHZhbGlkLT5nbHlwaF9jb3VudCAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl9HU1VCX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgZnR2YWxpZCApCi0gIHsKLSAgICBPVFZfVmFsaWRhdG9yUmVjICBvdHZhbGlkcmVjOwotICAgIE9UVl9WYWxpZGF0b3IgICAgIG90dmFsaWQgPSAmb3R2YWxpZHJlYzsKLSAgICBGVF9CeXRlcyAgICAgICAgICBwICAgICAgID0gdGFibGU7Ci0gICAgRlRfVUludCAgICAgICAgICAgU2NyaXB0TGlzdCwgRmVhdHVyZUxpc3QsIExvb2t1cExpc3Q7Ci0KLQotICAgIG90dmFsaWQtPnJvb3QgPSBmdHZhbGlkOwotCi0gICAgRlRfVFJBQ0UzKCggInZhbGlkYXRpbmcgR1NVQiB0YWJsZVxuIiApKTsKLSAgICBPVFZfSU5JVDsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggMTAgKTsKLQotICAgIGlmICggRlRfTkVYVF9VTE9ORyggcCApICE9IDB4MTAwMDBVTCApICAgICAgLyogVmVyc2lvbiAqLwotICAgICAgRlRfSU5WQUxJRF9GT1JNQVQ7Ci0KLSAgICBTY3JpcHRMaXN0ICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRmVhdHVyZUxpc3QgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIExvb2t1cExpc3QgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIG90dmFsaWQtPnR5cGVfY291bnQgID0gODsKLSAgICBvdHZhbGlkLT50eXBlX2Z1bmNzICA9IChPVFZfVmFsaWRhdGVfRnVuYyopb3R2X2dzdWJfdmFsaWRhdGVfZnVuY3M7Ci0gICAgb3R2YWxpZC0+Z2x5cGhfY291bnQgPSBnbHlwaF9jb3VudDsKLQotICAgIG90dl9Mb29rdXBMaXN0X3ZhbGlkYXRlKCB0YWJsZSArIExvb2t1cExpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90dmFsaWQgKTsKLSAgICBvdHZfRmVhdHVyZUxpc3RfdmFsaWRhdGUoIHRhYmxlICsgRmVhdHVyZUxpc3QsIHRhYmxlICsgTG9va3VwTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90dmFsaWQgKTsKLSAgICBvdHZfU2NyaXB0TGlzdF92YWxpZGF0ZSggdGFibGUgKyBTY3JpcHRMaXN0LCB0YWJsZSArIEZlYXR1cmVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdHZhbGlkICk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZqc3RmLmMgYi9zcmMvb3R2YWxpZC9vdHZqc3RmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YTM4ZjkuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvb3R2anN0Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90dmpzdGYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBKU1RGIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgIm90dmFsaWQuaCIKLSNpbmNsdWRlICJvdHZjb21tbi5oIgotI2luY2x1ZGUgIm90dmdwb3MuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dmpzdGYKLQotCi0jZGVmaW5lIEpzdGZQcmlvcml0eUZ1bmMgIG90dl9Kc3RmUHJpb3JpdHlfdmFsaWRhdGUKLSNkZWZpbmUgSnN0Zkxvb2t1cEZ1bmMgICAgb3R2X0dQT1Nfc3VidGFibGVfdmFsaWRhdGUKLQotICAvKiB1c2VzIG90dmFsaWQtPmV4dHJhMSAoR1NVQiBsb29rdXAgY291bnQpICovCi0gIC8qIHVzZXMgb3R2YWxpZC0+ZXh0cmEyIChHUE9TIGxvb2t1cCBjb3VudCkgKi8KLSAgLyogc2V0cyBvdHZhbGlkLT5leHRyYTEgKGNvdW50ZXIpICAgICAgICAgICAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9Kc3RmUHJpb3JpdHlfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIHRhYmxlX3NpemU7Ci0gICAgRlRfVUludCAgIGdzdWJfbG9va3VwX2NvdW50LCBncG9zX2xvb2t1cF9jb3VudDsKLQotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggU2hyaW5rYWdlRW5hYmxlR1NVQiAgKTsKLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIFNocmlua2FnZURpc2FibGVHU1VCICk7Ci0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBTaHJpbmthZ2VFbmFibGVHUE9TICApOwotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggU2hyaW5rYWdlRGlzYWJsZUdQT1MgKTsKLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIEV4dGVuc2lvbkVuYWJsZUdTVUIgICk7Ci0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBFeHRlbnNpb25EaXNhYmxlR1NVQiApOwotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggRXh0ZW5zaW9uRW5hYmxlR1BPUyAgKTsKLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIEV4dGVuc2lvbkRpc2FibGVHUE9TICk7Ci0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBTaHJpbmthZ2VKc3RmTWF4ICk7Ci0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBFeHRlbnNpb25Kc3RmTWF4ICk7Ci0KLQotICAgIE9UVl9FTlRFUjsKLSAgICBPVFZfVFJBQ0UoKCAiSnN0ZlByaW9yaXR5IHRhYmxlXG4iICkpOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyMCApOwotCi0gICAgZ3N1Yl9sb29rdXBfY291bnQgPSBvdHZhbGlkLT5leHRyYTE7Ci0gICAgZ3Bvc19sb29rdXBfY291bnQgPSBvdHZhbGlkLT5leHRyYTI7Ci0KLSAgICB0YWJsZV9zaXplID0gMjA7Ci0KLSAgICBvdHZhbGlkLT5leHRyYTEgPSBnc3ViX2xvb2t1cF9jb3VudDsKLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIFNocmlua2FnZUVuYWJsZUdTVUIgKTsKLSAgICBPVFZfU0laRV9DSEVDSyggU2hyaW5rYWdlRW5hYmxlR1NVQiApOwotICAgIGlmICggU2hyaW5rYWdlRW5hYmxlR1NVQiApCi0gICAgICBvdHZfeF91eCggdGFibGUgKyBTaHJpbmthZ2VFbmFibGVHU1VCLCBvdHZhbGlkICk7Ci0KLSAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBTaHJpbmthZ2VEaXNhYmxlR1NVQiApOwotICAgIE9UVl9TSVpFX0NIRUNLKCBTaHJpbmthZ2VEaXNhYmxlR1NVQiApOwotICAgIGlmICggU2hyaW5rYWdlRGlzYWJsZUdTVUIgKQotICAgICAgb3R2X3hfdXgoIHRhYmxlICsgU2hyaW5rYWdlRGlzYWJsZUdTVUIsIG90dmFsaWQgKTsKLQotICAgIG90dmFsaWQtPmV4dHJhMSA9IGdwb3NfbG9va3VwX2NvdW50OwotCi0gICAgT1RWX09QVElPTkFMX09GRlNFVCggU2hyaW5rYWdlRW5hYmxlR1BPUyApOwotICAgIE9UVl9TSVpFX0NIRUNLKCBTaHJpbmthZ2VFbmFibGVHUE9TICk7Ci0gICAgaWYgKCBTaHJpbmthZ2VFbmFibGVHUE9TICkKLSAgICAgIG90dl94X3V4KCB0YWJsZSArIFNocmlua2FnZUVuYWJsZUdQT1MsIG90dmFsaWQgKTsKLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIFNocmlua2FnZURpc2FibGVHUE9TICk7Ci0gICAgT1RWX1NJWkVfQ0hFQ0soIFNocmlua2FnZURpc2FibGVHUE9TICk7Ci0gICAgaWYgKCBTaHJpbmthZ2VEaXNhYmxlR1BPUyApCi0gICAgICBvdHZfeF91eCggdGFibGUgKyBTaHJpbmthZ2VEaXNhYmxlR1BPUywgb3R2YWxpZCApOwotCi0gICAgT1RWX09QVElPTkFMX09GRlNFVCggU2hyaW5rYWdlSnN0Zk1heCApOwotICAgIE9UVl9TSVpFX0NIRUNLKCBTaHJpbmthZ2VKc3RmTWF4ICk7Ci0gICAgaWYgKCBTaHJpbmthZ2VKc3RmTWF4ICkKLSAgICB7Ci0gICAgICAvKiBYWFg6IGNoZWNrIGxvb2t1cCB0eXBlcz8gKi8KLSAgICAgIE9UVl9ORVNUMiggSnN0Zk1heCwgSnN0Zkxvb2t1cCApOwotICAgICAgT1RWX1JVTiggdGFibGUgKyBTaHJpbmthZ2VKc3RmTWF4LCBvdHZhbGlkICk7Ci0gICAgfQotCi0gICAgb3R2YWxpZC0+ZXh0cmExID0gZ3N1Yl9sb29rdXBfY291bnQ7Ci0KLSAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBFeHRlbnNpb25FbmFibGVHU1VCICk7Ci0gICAgT1RWX1NJWkVfQ0hFQ0soIEV4dGVuc2lvbkVuYWJsZUdTVUIgKTsKLSAgICBpZiAoIEV4dGVuc2lvbkVuYWJsZUdTVUIgKQotICAgICAgb3R2X3hfdXgoIHRhYmxlICsgRXh0ZW5zaW9uRW5hYmxlR1NVQiwgb3R2YWxpZCApOwotCi0gICAgT1RWX09QVElPTkFMX09GRlNFVCggRXh0ZW5zaW9uRGlzYWJsZUdTVUIgKTsKLSAgICBPVFZfU0laRV9DSEVDSyggRXh0ZW5zaW9uRGlzYWJsZUdTVUIgKTsKLSAgICBpZiAoIEV4dGVuc2lvbkRpc2FibGVHU1VCICkKLSAgICAgIG90dl94X3V4KCB0YWJsZSArIEV4dGVuc2lvbkRpc2FibGVHU1VCLCBvdHZhbGlkICk7Ci0KLSAgICBvdHZhbGlkLT5leHRyYTEgPSBncG9zX2xvb2t1cF9jb3VudDsKLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIEV4dGVuc2lvbkVuYWJsZUdQT1MgKTsKLSAgICBPVFZfU0laRV9DSEVDSyggRXh0ZW5zaW9uRW5hYmxlR1BPUyApOwotICAgIGlmICggRXh0ZW5zaW9uRW5hYmxlR1BPUyApCi0gICAgICBvdHZfeF91eCggdGFibGUgKyBFeHRlbnNpb25FbmFibGVHUE9TLCBvdHZhbGlkICk7Ci0KLSAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBFeHRlbnNpb25EaXNhYmxlR1BPUyApOwotICAgIE9UVl9TSVpFX0NIRUNLKCBFeHRlbnNpb25EaXNhYmxlR1BPUyApOwotICAgIGlmICggRXh0ZW5zaW9uRGlzYWJsZUdQT1MgKQotICAgICAgb3R2X3hfdXgoIHRhYmxlICsgRXh0ZW5zaW9uRGlzYWJsZUdQT1MsIG90dmFsaWQgKTsKLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIEV4dGVuc2lvbkpzdGZNYXggKTsKLSAgICBPVFZfU0laRV9DSEVDSyggRXh0ZW5zaW9uSnN0Zk1heCApOwotICAgIGlmICggRXh0ZW5zaW9uSnN0Zk1heCApCi0gICAgewotICAgICAgLyogWFhYOiBjaGVjayBsb29rdXAgdHlwZXM/ICovCi0gICAgICBPVFZfTkVTVDIoIEpzdGZNYXgsIEpzdGZMb29rdXAgKTsKLSAgICAgIE9UVl9SVU4oIHRhYmxlICsgRXh0ZW5zaW9uSnN0Zk1heCwgb3R2YWxpZCApOwotICAgIH0KLQotICAgIG90dmFsaWQtPmV4dHJhMSA9IGdzdWJfbG9va3VwX2NvdW50OwotICAgIG90dmFsaWQtPmV4dHJhMiA9IGdwb3NfbG9va3VwX2NvdW50OwotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qIHNldHMgb3R2YWxpZC0+ZXh0cmEgKGdseXBoIGNvdW50KSAgICAgICAgICAgICAgICovCi0gIC8qIHNldHMgb3R2YWxpZC0+ZnVuYzEgKG90dl9Kc3RmUHJpb3JpdHlfdmFsaWRhdGUpICovCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X0pzdGZTY3JpcHRfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICB0YWJsZV9zaXplOwotICAgIEZUX1VJbnQgICBKc3RmTGFuZ1N5c0NvdW50OwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBFeHRHbHlwaCApOwotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggRGVmSnN0ZkxhbmdTeXMgKTsKLQotCi0gICAgT1RWX05BTUVfRU5URVIoICJKc3RmU2NyaXB0IiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA2ICk7Ci0gICAgT1RWX09QVElPTkFMX09GRlNFVCggRXh0R2x5cGggKTsKLSAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBEZWZKc3RmTGFuZ1N5cyApOwotICAgIEpzdGZMYW5nU3lzQ291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX1RSQUNFKCggIiAoSnN0ZkxhbmdTeXNDb3VudCA9ICVkKVxuIiwgSnN0ZkxhbmdTeXNDb3VudCApKTsKLQotICAgIHRhYmxlX3NpemUgPSBKc3RmTGFuZ1N5c0NvdW50ICogNiArIDY7Ci0KLSAgICBPVFZfU0laRV9DSEVDSyggRXh0R2x5cGggKTsKLSAgICBpZiAoIEV4dEdseXBoICkKLSAgICB7Ci0gICAgICBvdHZhbGlkLT5leHRyYTEgPSBvdHZhbGlkLT5nbHlwaF9jb3VudDsKLSAgICAgIE9UVl9ORVNUMSggRXh0ZW5kZXJHbHlwaCApOwotICAgICAgT1RWX1JVTiggdGFibGUgKyBFeHRHbHlwaCwgb3R2YWxpZCApOwotICAgIH0KLQotICAgIE9UVl9TSVpFX0NIRUNLKCBEZWZKc3RmTGFuZ1N5cyApOwotICAgIGlmICggRGVmSnN0ZkxhbmdTeXMgKQotICAgIHsKLSAgICAgIE9UVl9ORVNUMiggSnN0ZkxhbmdTeXMsIEpzdGZQcmlvcml0eSApOwotICAgICAgT1RWX1JVTiggdGFibGUgKyBEZWZKc3RmTGFuZ1N5cywgb3R2YWxpZCApOwotICAgIH0KLQotICAgIE9UVl9MSU1JVF9DSEVDSyggNiAqIEpzdGZMYW5nU3lzQ291bnQgKTsKLQotICAgIC8qIEpzdGZMYW5nU3lzUmVjb3JkICovCi0gICAgT1RWX05FU1QyKCBKc3RmTGFuZ1N5cywgSnN0ZlByaW9yaXR5ICk7Ci0gICAgZm9yICggOyBKc3RmTGFuZ1N5c0NvdW50ID4gMDsgSnN0ZkxhbmdTeXNDb3VudC0tICkKLSAgICB7Ci0gICAgICBwICs9IDQ7ICAgICAgIC8qIHNraXAgSnN0ZkxhbmdTeXNUYWcgKi8KLQotICAgICAgT1RWX1JVTiggdGFibGUgKyBGVF9ORVhUX1VTSE9SVCggcCApLCBvdHZhbGlkICk7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qIHNldHMgb3R2YWxpZC0+ZXh0cmExIChHU1VCIGxvb2t1cCBjb3VudCkgKi8KLSAgLyogc2V0cyBvdHZhbGlkLT5leHRyYTIgKEdQT1MgbG9va3VwIGNvdW50KSAqLwotICAvKiBzZXRzIG90dmFsaWQtPmdseXBoX2NvdW50ICAgICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgb3R2X0pTVEZfdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgIGdzdWIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgIGdwb3MsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICBmdHZhbGlkICkKLSAgewotICAgIE9UVl9WYWxpZGF0b3JSZWMgIG90dmFsaWRyZWM7Ci0gICAgT1RWX1ZhbGlkYXRvciAgICAgb3R2YWxpZCA9ICZvdHZhbGlkcmVjOwotICAgIEZUX0J5dGVzICAgICAgICAgIHAgICAgID0gdGFibGU7Ci0gICAgRlRfVUludCAgICAgICAgICAgSnN0ZlNjcmlwdENvdW50OwotCi0KLSAgICBvdHZhbGlkLT5yb290ID0gZnR2YWxpZDsKLQotCi0gICAgRlRfVFJBQ0UzKCggInZhbGlkYXRpbmcgSlNURiB0YWJsZVxuIiApKTsKLSAgICBPVFZfSU5JVDsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggNiApOwotCi0gICAgaWYgKCBGVF9ORVhUX1VMT05HKCBwICkgIT0gMHgxMDAwMFVMICkgICAgICAvKiBWZXJzaW9uICovCi0gICAgICBGVF9JTlZBTElEX0ZPUk1BVDsKLQotICAgIEpzdGZTY3JpcHRDb3VudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBGVF9UUkFDRTMoKCAiIChKc3RmU2NyaXB0Q291bnQgPSAlZClcbiIsIEpzdGZTY3JpcHRDb3VudCApKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggSnN0ZlNjcmlwdENvdW50ICogNiApOwotCi0gICAgaWYgKCBnc3ViICkKLSAgICAgIG90dmFsaWQtPmV4dHJhMSA9IG90dl9HU1VCR1BPU19nZXRfTG9va3VwX2NvdW50KCBnc3ViICk7Ci0gICAgZWxzZQotICAgICAgb3R2YWxpZC0+ZXh0cmExID0gMDsKLQotICAgIGlmICggZ3BvcyApCi0gICAgICBvdHZhbGlkLT5leHRyYTIgPSBvdHZfR1NVQkdQT1NfZ2V0X0xvb2t1cF9jb3VudCggZ3BvcyApOwotICAgIGVsc2UKLSAgICAgIG90dmFsaWQtPmV4dHJhMiA9IDA7Ci0KLSAgICBvdHZhbGlkLT5nbHlwaF9jb3VudCA9IGdseXBoX2NvdW50OwotCi0gICAgLyogSnN0ZlNjcmlwdFJlY29yZCAqLwotICAgIGZvciAoIDsgSnN0ZlNjcmlwdENvdW50ID4gMDsgSnN0ZlNjcmlwdENvdW50LS0gKQotICAgIHsKLSAgICAgIHAgKz0gNDsgICAgICAgLyogc2tpcCBKc3RmU2NyaXB0VGFnICovCi0KLSAgICAgIC8qIEpzdGZTY3JpcHQgKi8KLSAgICAgIG90dl9Kc3RmU2NyaXB0X3ZhbGlkYXRlKCB0YWJsZSArIEZUX05FWFRfVVNIT1JUKCBwICksIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZtYXRoLmMgYi9zcmMvb3R2YWxpZC9vdHZtYXRoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNGQzNjkuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvb3R2bWF0aC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90dm1hdGguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBNQVRIIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXcml0dGVuIGJ5IEdlb3JnZSBXaWxsaWFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAib3R2YWxpZC5oIgotI2luY2x1ZGUgIm90dmNvbW1uLmgiCi0jaW5jbHVkZSAib3R2Z3Bvcy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb3R2bWF0aAotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICBNQVRIIFRZUE9HUkFQSElDIENPTlNUQU5UUyAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfTWF0aENvbnN0YW50c192YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIGk7Ci0gICAgRlRfVUludCAgIHRhYmxlX3NpemU7Ci0KLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIERldmljZVRhYmxlT2Zmc2V0ICk7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiTWF0aENvbnN0YW50cyIgKTsKLQotICAgIC8qIDU2IGNvbnN0YW50cywgNTEgaGF2ZSBkZXZpY2UgdGFibGVzICovCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICogKCA1NiArIDUxICkgKTsKLSAgICB0YWJsZV9zaXplID0gMiAqICggNTYgKyA1MSApOwotCi0gICAgcCArPSA0ICogMjsgICAgICAgICAgICAgICAgIC8qIEZpcnN0IDQgY29uc3RhbnRzIGhhdmUgbm8gZGV2aWNlIHRhYmxlcyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgNTE7IGkrKyApCi0gICAgewotICAgICAgcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2tpcCB0aGUgdmFsdWUgKi8KLSAgICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIERldmljZVRhYmxlT2Zmc2V0ICk7Ci0gICAgICBPVFZfU0laRV9DSEVDSyggRGV2aWNlVGFibGVPZmZzZXQgKTsKLSAgICAgIGlmICggRGV2aWNlVGFibGVPZmZzZXQgKQotICAgICAgICBvdHZfRGV2aWNlX3ZhbGlkYXRlKCB0YWJsZSArIERldmljZVRhYmxlT2Zmc2V0LCBvdHZhbGlkICk7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICBNQVRIIElUQUxJQ1MgQ09SUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgIE1BVEggVE9QIEFDQ0VOVCBBVFRBQ0hNRU5UICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfTWF0aEl0YWxpY3NDb3JyZWN0aW9uSW5mb192YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgaXNJdGFsaWMgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgaSwgY250LCB0YWJsZV9zaXplOwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBDb3ZlcmFnZSApOwotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggRGV2aWNlVGFibGVPZmZzZXQgKTsKLQotICAgIEZUX1VOVVNFRCggaXNJdGFsaWMgKTsgIC8qIG9ubHkgdXNlZCBpZiB0cmFjaW5nIGlzIGFjdGl2ZSAqLwotCi0KLSAgICBPVFZfTkFNRV9FTlRFUiggaXNJdGFsaWMgPyAiTWF0aEl0YWxpY3NDb3JyZWN0aW9uSW5mbyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTWF0aFRvcEFjY2VudEF0dGFjaG1lbnQiICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKTsKLQotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIENvdmVyYWdlICk7Ci0gICAgY250ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggNCAqIGNudCApOwotICAgIHRhYmxlX3NpemUgPSA0ICsgNCAqIGNudDsKLQotICAgIE9UVl9TSVpFX0NIRUNLKCBDb3ZlcmFnZSApOwotICAgIG90dl9Db3ZlcmFnZV92YWxpZGF0ZSggdGFibGUgKyBDb3ZlcmFnZSwgb3R2YWxpZCwgKEZUX0ludCljbnQgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgY250OyBpKysgKQotICAgIHsKLSAgICAgIHAgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIHZhbHVlICovCi0gICAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBEZXZpY2VUYWJsZU9mZnNldCApOwotICAgICAgT1RWX1NJWkVfQ0hFQ0soIERldmljZVRhYmxlT2Zmc2V0ICk7Ci0gICAgICBpZiAoIERldmljZVRhYmxlT2Zmc2V0ICkKLSAgICAgICAgb3R2X0RldmljZV92YWxpZGF0ZSggdGFibGUgKyBEZXZpY2VUYWJsZU9mZnNldCwgb3R2YWxpZCApOwotICAgIH0KLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRIIEtFUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfTWF0aEtlcm5fdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgaSwgY250LCB0YWJsZV9zaXplOwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBEZXZpY2VUYWJsZU9mZnNldCApOwotCi0KLSAgICAvKiBPVFZfTkFNRV9FTlRFUiggIk1hdGhLZXJuIiApOyovCi0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDIgKTsKLQotICAgIGNudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDQgKiBjbnQgKyAyICk7Ci0gICAgdGFibGVfc2l6ZSA9IDQgKyA0ICogY250OwotCi0gICAgLyogSGVpZ2h0cyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgY250OyBpKysgKQotICAgIHsKLSAgICAgIHAgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIHZhbHVlICovCi0gICAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBEZXZpY2VUYWJsZU9mZnNldCApOwotICAgICAgT1RWX1NJWkVfQ0hFQ0soIERldmljZVRhYmxlT2Zmc2V0ICk7Ci0gICAgICBpZiAoIERldmljZVRhYmxlT2Zmc2V0ICkKLSAgICAgICAgb3R2X0RldmljZV92YWxpZGF0ZSggdGFibGUgKyBEZXZpY2VUYWJsZU9mZnNldCwgb3R2YWxpZCApOwotICAgIH0KLQotICAgIC8qIE9uZSBtb3JlIEtlcm5pbmcgdmFsdWUgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IGNudCArIDE7IGkrKyApCi0gICAgewotICAgICAgcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2tpcCB0aGUgdmFsdWUgKi8KLSAgICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIERldmljZVRhYmxlT2Zmc2V0ICk7Ci0gICAgICBPVFZfU0laRV9DSEVDSyggRGV2aWNlVGFibGVPZmZzZXQgKTsKLSAgICAgIGlmICggRGV2aWNlVGFibGVPZmZzZXQgKQotICAgICAgICBvdHZfRGV2aWNlX3ZhbGlkYXRlKCB0YWJsZSArIERldmljZVRhYmxlT2Zmc2V0LCBvdHZhbGlkICk7Ci0gICAgfQotCi0gICAgT1RWX0VYSVQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIG90dl9NYXRoS2VybkluZm9fdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIGksIGosIGNudCwgdGFibGVfc2l6ZTsKLQotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggQ292ZXJhZ2UgKTsKLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIE1LUmVjb3JkT2Zmc2V0ICk7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiTWF0aEtlcm5JbmZvIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICk7Ci0KLSAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBDb3ZlcmFnZSApOwotICAgIGNudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDggKiBjbnQgKTsKLSAgICB0YWJsZV9zaXplID0gNCArIDggKiBjbnQ7Ci0KLSAgICBPVFZfU0laRV9DSEVDSyggQ292ZXJhZ2UgKTsKLSAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgQ292ZXJhZ2UsIG90dmFsaWQsIChGVF9JbnQpY250ICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGNudDsgaSsrICkKLSAgICB7Ci0gICAgICBmb3IgKCBqID0gMDsgaiA8IDQ7IGorKyApCi0gICAgICB7Ci0gICAgICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIE1LUmVjb3JkT2Zmc2V0ICk7Ci0gICAgICAgIE9UVl9TSVpFX0NIRUNLKCBNS1JlY29yZE9mZnNldCApOwotICAgICAgICBpZiAoIE1LUmVjb3JkT2Zmc2V0ICkKLSAgICAgICAgICBvdHZfTWF0aEtlcm5fdmFsaWRhdGUoIHRhYmxlICsgTUtSZWNvcmRPZmZzZXQsIG90dmFsaWQgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIE1BVEggR0xZUEggSU5GTyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X01hdGhHbHlwaEluZm9fdmFsaWRhdGUoIEZUX0J5dGVzICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICBNYXRoSXRhbGljc0NvcnJlY3Rpb25JbmZvLCBNYXRoVG9wQWNjZW50QXR0YWNobWVudDsKLSAgICBGVF9VSW50ICAgRXh0ZW5kZWRTaGFwZUNvdmVyYWdlLCBNYXRoS2VybkluZm87Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiTWF0aEdseXBoSW5mbyIgKTsKLQotICAgIE9UVl9MSU1JVF9DSEVDSyggOCApOwotCi0gICAgTWF0aEl0YWxpY3NDb3JyZWN0aW9uSW5mbyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgTWF0aFRvcEFjY2VudEF0dGFjaG1lbnQgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRXh0ZW5kZWRTaGFwZUNvdmVyYWdlICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgTWF0aEtlcm5JbmZvICAgICAgICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBpZiAoIE1hdGhJdGFsaWNzQ29ycmVjdGlvbkluZm8gKQotICAgICAgb3R2X01hdGhJdGFsaWNzQ29ycmVjdGlvbkluZm9fdmFsaWRhdGUoCi0gICAgICAgIHRhYmxlICsgTWF0aEl0YWxpY3NDb3JyZWN0aW9uSW5mbywgb3R2YWxpZCwgVFJVRSApOwotCi0gICAgLyogSXRhbGljIGNvcnJlY3Rpb24gYW5kIFRvcCBBY2NlbnQgQXR0YWNobWVudCBoYXZlIHRoZSBzYW1lIGZvcm1hdCAqLwotICAgIGlmICggTWF0aFRvcEFjY2VudEF0dGFjaG1lbnQgKQotICAgICAgb3R2X01hdGhJdGFsaWNzQ29ycmVjdGlvbkluZm9fdmFsaWRhdGUoCi0gICAgICAgIHRhYmxlICsgTWF0aFRvcEFjY2VudEF0dGFjaG1lbnQsIG90dmFsaWQsIEZBTFNFICk7Ci0KLSAgICBpZiAoIEV4dGVuZGVkU2hhcGVDb3ZlcmFnZSApCi0gICAgewotICAgICAgT1RWX05BTUVfRU5URVIoICJFeHRlbmRlZFNoYXBlQ292ZXJhZ2UiICk7Ci0gICAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgRXh0ZW5kZWRTaGFwZUNvdmVyYWdlLCBvdHZhbGlkLCAtMSApOwotICAgICAgT1RWX0VYSVQ7Ci0gICAgfQotCi0gICAgaWYgKCBNYXRoS2VybkluZm8gKQotICAgICAgb3R2X01hdGhLZXJuSW5mb192YWxpZGF0ZSggdGFibGUgKyBNYXRoS2VybkluZm8sIG90dmFsaWQgKTsKLQotICAgIE9UVl9FWElUOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIE1BVEggR0xZUEggQ09OU1RSVUNUSU9OICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBvdHZfR2x5cGhBc3NlbWJseV92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVFZfVmFsaWRhdG9yICBvdHZhbGlkICkKLSAgewotICAgIEZUX0J5dGVzICBwID0gdGFibGU7Ci0gICAgRlRfVUludCAgIHBjbnQsIHRhYmxlX3NpemU7Ci0gICAgRlRfVUludCAgIGk7Ci0KLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIERldmljZVRhYmxlT2Zmc2V0ICk7Ci0KLQotICAgIC8qIE9UVl9OQU1FX0VOVEVSKCAiR2x5cGhBc3NlbWJseSIgKTsgKi8KLQotICAgIE9UVl9MSU1JVF9DSEVDSyggNiApOwotCi0gICAgcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIEl0YWxpY3MgQ29ycmVjdGlvbiB2YWx1ZSAqLwotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIERldmljZVRhYmxlT2Zmc2V0ICk7Ci0gICAgcGNudCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDggKiBwY250ICk7Ci0gICAgdGFibGVfc2l6ZSA9IDYgKyA4ICogcGNudDsKLQotICAgIE9UVl9TSVpFX0NIRUNLKCBEZXZpY2VUYWJsZU9mZnNldCApOwotICAgIGlmICggRGV2aWNlVGFibGVPZmZzZXQgKQotICAgICAgb3R2X0RldmljZV92YWxpZGF0ZSggdGFibGUgKyBEZXZpY2VUYWJsZU9mZnNldCwgb3R2YWxpZCApOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBwY250OyBpKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGdpZDsKLQotCi0gICAgICBnaWQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgaWYgKCBnaWQgPj0gb3R2YWxpZC0+Z2x5cGhfY291bnQgKQotICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgcCArPSAyKjQ7ICAgICAgICAgICAgIC8qIHNraXAgdGhlIFN0YXJ0LCBFbmQsIEZ1bGwsIGFuZCBGbGFncyBmaWVsZHMgKi8KLSAgICB9Ci0KLSAgICAvKiBPVFZfRVhJVDsgKi8KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgb3R2X01hdGhHbHlwaENvbnN0cnVjdGlvbl92YWxpZGF0ZSggRlRfQnl0ZXMgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UVl9WYWxpZGF0b3IgIG90dmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZXMgIHAgPSB0YWJsZTsKLSAgICBGVF9VSW50ICAgdmNudCwgdGFibGVfc2l6ZTsKLSAgICBGVF9VSW50ICAgaTsKLQotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggR2x5cGhBc3NlbWJseSApOwotCi0KLSAgICAvKiBPVFZfTkFNRV9FTlRFUiggIk1hdGhHbHlwaENvbnN0cnVjdGlvbiIgKTsgKi8KLQotICAgIE9UVl9MSU1JVF9DSEVDSyggNCApOwotCi0gICAgT1RWX09QVElPTkFMX09GRlNFVCggR2x5cGhBc3NlbWJseSApOwotICAgIHZjbnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCA0ICogdmNudCApOwotICAgIHRhYmxlX3NpemUgPSA0ICsgNCAqIHZjbnQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHZjbnQ7IGkrKyApCi0gICAgewotICAgICAgRlRfVUludCAgZ2lkOwotCi0KLSAgICAgIGdpZCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBpZiAoIGdpZCA+PSBvdHZhbGlkLT5nbHlwaF9jb3VudCApCi0gICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICBwICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHRoZSBzaXplICovCi0gICAgfQotCi0gICAgT1RWX1NJWkVfQ0hFQ0soIEdseXBoQXNzZW1ibHkgKTsKLSAgICBpZiAoIEdseXBoQXNzZW1ibHkgKQotICAgICAgb3R2X0dseXBoQXNzZW1ibHlfdmFsaWRhdGUoIHRhYmxlK0dseXBoQXNzZW1ibHksIG90dmFsaWQgKTsKLQotICAgIC8qIE9UVl9FWElUOyAqLwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBvdHZfTWF0aFZhcmlhbnRzX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RWX1ZhbGlkYXRvciAgb3R2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlcyAgcCA9IHRhYmxlOwotICAgIEZUX1VJbnQgICB2Y250LCBoY250LCBpLCB0YWJsZV9zaXplOwotCi0gICAgT1RWX09QVElPTkFMX1RBQkxFKCBWQ292ZXJhZ2UgKTsKLSAgICBPVFZfT1BUSU9OQUxfVEFCTEUoIEhDb3ZlcmFnZSApOwotICAgIE9UVl9PUFRJT05BTF9UQUJMRSggT2Zmc2V0ICk7Ci0KLQotICAgIE9UVl9OQU1FX0VOVEVSKCAiTWF0aFZhcmlhbnRzIiApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAxMCApOwotCi0gICAgcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgLyogU2tpcCB0aGUgTWluQ29ubmVjdG9yT3ZlcmxhcCBjb25zdGFudCAqLwotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIFZDb3ZlcmFnZSApOwotICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIEhDb3ZlcmFnZSApOwotICAgIHZjbnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGhjbnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgT1RWX0xJTUlUX0NIRUNLKCAyICogdmNudCArIDIgKiBoY250ICk7Ci0gICAgdGFibGVfc2l6ZSA9IDEwICsgMiAqIHZjbnQgKyAyICogaGNudDsKLQotICAgIE9UVl9TSVpFX0NIRUNLKCBWQ292ZXJhZ2UgKTsKLSAgICBpZiAoIFZDb3ZlcmFnZSApCi0gICAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgVkNvdmVyYWdlLCBvdHZhbGlkLCAoRlRfSW50KXZjbnQgKTsKLQotICAgIE9UVl9TSVpFX0NIRUNLKCBIQ292ZXJhZ2UgKTsKLSAgICBpZiAoIEhDb3ZlcmFnZSApCi0gICAgICBvdHZfQ292ZXJhZ2VfdmFsaWRhdGUoIHRhYmxlICsgSENvdmVyYWdlLCBvdHZhbGlkLCAoRlRfSW50KWhjbnQgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgdmNudDsgaSsrICkKLSAgICB7Ci0gICAgICBPVFZfT1BUSU9OQUxfT0ZGU0VUKCBPZmZzZXQgKTsKLSAgICAgIE9UVl9TSVpFX0NIRUNLKCBPZmZzZXQgKTsKLSAgICAgIG90dl9NYXRoR2x5cGhDb25zdHJ1Y3Rpb25fdmFsaWRhdGUoIHRhYmxlICsgT2Zmc2V0LCBvdHZhbGlkICk7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBoY250OyBpKysgKQotICAgIHsKLSAgICAgIE9UVl9PUFRJT05BTF9PRkZTRVQoIE9mZnNldCApOwotICAgICAgT1RWX1NJWkVfQ0hFQ0soIE9mZnNldCApOwotICAgICAgb3R2X01hdGhHbHlwaENvbnN0cnVjdGlvbl92YWxpZGF0ZSggdGFibGUgKyBPZmZzZXQsIG90dmFsaWQgKTsKLSAgICB9Ci0KLSAgICBPVFZfRVhJVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRIIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogc2V0cyBvdHZhbGlkLT5nbHlwaF9jb3VudCAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIG90dl9NQVRIX3ZhbGlkYXRlKCBGVF9CeXRlcyAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgZnR2YWxpZCApCi0gIHsKLSAgICBPVFZfVmFsaWRhdG9yUmVjICBvdHZhbGlkcmVjOwotICAgIE9UVl9WYWxpZGF0b3IgICAgIG90dmFsaWQgPSAmb3R2YWxpZHJlYzsKLSAgICBGVF9CeXRlcyAgICAgICAgICBwICAgICAgID0gdGFibGU7Ci0gICAgRlRfVUludCAgICAgICAgICAgTWF0aENvbnN0YW50cywgTWF0aEdseXBoSW5mbywgTWF0aFZhcmlhbnRzOwotCi0KLSAgICBvdHZhbGlkLT5yb290ID0gZnR2YWxpZDsKLQotICAgIEZUX1RSQUNFMygoICJ2YWxpZGF0aW5nIE1BVEggdGFibGVcbiIgKSk7Ci0gICAgT1RWX0lOSVQ7Ci0KLSAgICBPVFZfTElNSVRfQ0hFQ0soIDEwICk7Ci0KLSAgICBpZiAoIEZUX05FWFRfVUxPTkcoIHAgKSAhPSAweDEwMDAwVUwgKSAgICAgIC8qIFZlcnNpb24gKi8KLSAgICAgIEZUX0lOVkFMSURfRk9STUFUOwotCi0gICAgTWF0aENvbnN0YW50cyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgTWF0aEdseXBoSW5mbyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgTWF0aFZhcmlhbnRzICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBvdHZhbGlkLT5nbHlwaF9jb3VudCA9IGdseXBoX2NvdW50OwotCi0gICAgb3R2X01hdGhDb25zdGFudHNfdmFsaWRhdGUoIHRhYmxlICsgTWF0aENvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3R2YWxpZCApOwotICAgIG90dl9NYXRoR2x5cGhJbmZvX3ZhbGlkYXRlKCB0YWJsZSArIE1hdGhHbHlwaEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90dmFsaWQgKTsKLSAgICBvdHZfTWF0aFZhcmlhbnRzX3ZhbGlkYXRlICggdGFibGUgKyBNYXRoVmFyaWFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90dmFsaWQgKTsKLQotICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dm1vZC5jIGIvc3JjL290dmFsaWQvb3R2bW9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZmZjNDMuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvb3R2bW9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2bW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlJ3MgT3BlblR5cGUgdmFsaWRhdGlvbiBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX09QRU5UWVBFX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9PUEVOVFlQRV9WQUxJREFURV9ICi0KLSNpbmNsdWRlICJvdHZtb2QuaCIKLSNpbmNsdWRlICJvdHZhbGlkLmgiCi0jaW5jbHVkZSAib3R2Y29tbW4uaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dm1vZHVsZQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIG90dl9sb2FkX3RhYmxlKCBGVF9GYWNlICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9UYWcgICAgICAgICAgICAgIHRhZywKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqIHZvbGF0aWxlKiAgdGFibGUsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgICAgIHRhYmxlX2xlbiApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotCi0gICAgZXJyb3IgPSBGVF9Mb2FkX1NmbnRfVGFibGUoIGZhY2UsIHRhZywgMCwgTlVMTCwgdGFibGVfbGVuICk7Ci0gICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgKQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfQUxMT0MoICp0YWJsZSwgKnRhYmxlX2xlbiApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gRlRfTG9hZF9TZm50X1RhYmxlKCBmYWNlLCB0YWcsIDAsICp0YWJsZSwgdGFibGVfbGVuICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBvdHZfdmFsaWRhdGUoIEZUX0ZhY2Ugdm9sYXRpbGUgICBmYWNlLAotICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICBvdF9mbGFncywKLSAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICAqb3RfYmFzZSwKLSAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICAqb3RfZ2RlZiwKLSAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICAqb3RfZ3BvcywKLSAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICAqb3RfZ3N1YiwKLSAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICAqb3RfanN0ZiApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUqIHZvbGF0aWxlICAgICAgICAgYmFzZTsKLSAgICBGVF9CeXRlKiB2b2xhdGlsZSAgICAgICAgIGdkZWY7Ci0gICAgRlRfQnl0ZSogdm9sYXRpbGUgICAgICAgICBncG9zOwotICAgIEZUX0J5dGUqIHZvbGF0aWxlICAgICAgICAgZ3N1YjsKLSAgICBGVF9CeXRlKiB2b2xhdGlsZSAgICAgICAgIGpzdGY7Ci0gICAgRlRfQnl0ZSogdm9sYXRpbGUgICAgICAgICBtYXRoOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgICAgbGVuX2Jhc2UsIGxlbl9nZGVmLCBsZW5fZ3BvcywgbGVuX2dzdWIsIGxlbl9qc3RmOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgICAgbGVuX21hdGg7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgICAgICBudW1fZ2x5cGhzID0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBoczsKLSAgICBGVF9WYWxpZGF0b3JSZWMgdm9sYXRpbGUgIHZhbGlkOwotCi0KLSAgICBiYXNlICAgICA9IGdkZWYgICAgID0gZ3BvcyAgICAgPSBnc3ViICAgICA9IGpzdGYgICAgID0gbWF0aCAgICAgPSBOVUxMOwotICAgIGxlbl9iYXNlID0gbGVuX2dkZWYgPSBsZW5fZ3BvcyA9IGxlbl9nc3ViID0gbGVuX2pzdGYgPSBsZW5fbWF0aCA9IDA7Ci0KLSAgICAvKgotICAgICAqIFhYWDogT3BlblR5cGUgdGFibGVzIGNhbm5vdCBoYW5kbGUgMzItYml0IGdseXBoIGluZGV4LAotICAgICAqICAgICAgYWx0aG91Z2ggYnJva2VuIFRydWVUeXBlIGNhbiBoYXZlIDMyLWJpdCBnbHlwaCBpbmRleC4KLSAgICAgKi8KLSAgICBpZiAoIGZhY2UtPm51bV9nbHlwaHMgPiAweEZGRkZMICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAib3R2X3ZhbGlkYXRlOiBJbnZhbGlkIGdseXBocyBpbmRleCAoMHgwMDAwRkZGRiAtIDB4JTA4eCkgIiwKLSAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9nbHlwaHMgKSk7Ci0gICAgICBGVF9UUkFDRTEoKCAiYXJlIG5vdCBoYW5kbGVkIGJ5IE9wZW5UeXBlIHRhYmxlc1xuIiApKTsKLSAgICAgIG51bV9nbHlwaHMgPSAweEZGRkY7Ci0gICAgfQotCi0gICAgLyogbG9hZCB0YWJsZXMgKi8KLQotICAgIGlmICggb3RfZmxhZ3MgJiBGVF9WQUxJREFURV9CQVNFICkKLSAgICB7Ci0gICAgICBlcnJvciA9IG90dl9sb2FkX3RhYmxlKCBmYWNlLCBUVEFHX0JBU0UsICZiYXNlLCAmbGVuX2Jhc2UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBvdF9mbGFncyAmIEZUX1ZBTElEQVRFX0dERUYgKQotICAgIHsKLSAgICAgIGVycm9yID0gb3R2X2xvYWRfdGFibGUoIGZhY2UsIFRUQUdfR0RFRiwgJmdkZWYsICZsZW5fZ2RlZiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIG90X2ZsYWdzICYgRlRfVkFMSURBVEVfR1BPUyApCi0gICAgewotICAgICAgZXJyb3IgPSBvdHZfbG9hZF90YWJsZSggZmFjZSwgVFRBR19HUE9TLCAmZ3BvcywgJmxlbl9ncG9zICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggb3RfZmxhZ3MgJiBGVF9WQUxJREFURV9HU1VCICkKLSAgICB7Ci0gICAgICBlcnJvciA9IG90dl9sb2FkX3RhYmxlKCBmYWNlLCBUVEFHX0dTVUIsICZnc3ViLCAmbGVuX2dzdWIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBvdF9mbGFncyAmIEZUX1ZBTElEQVRFX0pTVEYgKQotICAgIHsKLSAgICAgIGVycm9yID0gb3R2X2xvYWRfdGFibGUoIGZhY2UsIFRUQUdfSlNURiwgJmpzdGYsICZsZW5fanN0ZiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIG90X2ZsYWdzICYgRlRfVkFMSURBVEVfTUFUSCApCi0gICAgewotICAgICAgZXJyb3IgPSBvdHZfbG9hZF90YWJsZSggZmFjZSwgVFRBR19NQVRILCAmbWF0aCwgJmxlbl9tYXRoICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHZhbGlkYXRlIHRhYmxlcyAqLwotCi0gICAgaWYgKCBiYXNlICkKLSAgICB7Ci0gICAgICBmdF92YWxpZGF0b3JfaW5pdCggJnZhbGlkLCBiYXNlLCBiYXNlICsgbGVuX2Jhc2UsIEZUX1ZBTElEQVRFX0RFRkFVTFQgKTsKLSAgICAgIGlmICggZnRfc2V0am1wKCB2YWxpZC5qdW1wX2J1ZmZlciApID09IDAgKQotICAgICAgICBvdHZfQkFTRV92YWxpZGF0ZSggYmFzZSwgJnZhbGlkICk7Ci0gICAgICBlcnJvciA9IHZhbGlkLmVycm9yOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGdwb3MgKQotICAgIHsKLSAgICAgIGZ0X3ZhbGlkYXRvcl9pbml0KCAmdmFsaWQsIGdwb3MsIGdwb3MgKyBsZW5fZ3BvcywgRlRfVkFMSURBVEVfREVGQVVMVCApOwotICAgICAgaWYgKCBmdF9zZXRqbXAoIHZhbGlkLmp1bXBfYnVmZmVyICkgPT0gMCApCi0gICAgICAgIG90dl9HUE9TX3ZhbGlkYXRlKCBncG9zLCBudW1fZ2x5cGhzLCAmdmFsaWQgKTsKLSAgICAgIGVycm9yID0gdmFsaWQuZXJyb3I7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggZ3N1YiApCi0gICAgewotICAgICAgZnRfdmFsaWRhdG9yX2luaXQoICZ2YWxpZCwgZ3N1YiwgZ3N1YiArIGxlbl9nc3ViLCBGVF9WQUxJREFURV9ERUZBVUxUICk7Ci0gICAgICBpZiAoIGZ0X3NldGptcCggdmFsaWQuanVtcF9idWZmZXIgKSA9PSAwICkKLSAgICAgICAgb3R2X0dTVUJfdmFsaWRhdGUoIGdzdWIsIG51bV9nbHlwaHMsICZ2YWxpZCApOwotICAgICAgZXJyb3IgPSB2YWxpZC5lcnJvcjsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBnZGVmICkKLSAgICB7Ci0gICAgICBmdF92YWxpZGF0b3JfaW5pdCggJnZhbGlkLCBnZGVmLCBnZGVmICsgbGVuX2dkZWYsIEZUX1ZBTElEQVRFX0RFRkFVTFQgKTsKLSAgICAgIGlmICggZnRfc2V0am1wKCB2YWxpZC5qdW1wX2J1ZmZlciApID09IDAgKQotICAgICAgICBvdHZfR0RFRl92YWxpZGF0ZSggZ2RlZiwgZ3N1YiwgZ3BvcywgbnVtX2dseXBocywgJnZhbGlkICk7Ci0gICAgICBlcnJvciA9IHZhbGlkLmVycm9yOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGpzdGYgKQotICAgIHsKLSAgICAgIGZ0X3ZhbGlkYXRvcl9pbml0KCAmdmFsaWQsIGpzdGYsIGpzdGYgKyBsZW5fanN0ZiwgRlRfVkFMSURBVEVfREVGQVVMVCApOwotICAgICAgaWYgKCBmdF9zZXRqbXAoIHZhbGlkLmp1bXBfYnVmZmVyICkgPT0gMCApCi0gICAgICAgIG90dl9KU1RGX3ZhbGlkYXRlKCBqc3RmLCBnc3ViLCBncG9zLCBudW1fZ2x5cGhzLCAmdmFsaWQgKTsKLSAgICAgIGVycm9yID0gdmFsaWQuZXJyb3I7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggbWF0aCApCi0gICAgewotICAgICAgZnRfdmFsaWRhdG9yX2luaXQoICZ2YWxpZCwgbWF0aCwgbWF0aCArIGxlbl9tYXRoLCBGVF9WQUxJREFURV9ERUZBVUxUICk7Ci0gICAgICBpZiAoIGZ0X3NldGptcCggdmFsaWQuanVtcF9idWZmZXIgKSA9PSAwICkKLSAgICAgICAgb3R2X01BVEhfdmFsaWRhdGUoIG1hdGgsIG51bV9nbHlwaHMsICZ2YWxpZCApOwotICAgICAgZXJyb3IgPSB2YWxpZC5lcnJvcjsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgKm90X2Jhc2UgPSAoRlRfQnl0ZXMpYmFzZTsKLSAgICAqb3RfZ2RlZiA9IChGVF9CeXRlcylnZGVmOwotICAgICpvdF9ncG9zID0gKEZUX0J5dGVzKWdwb3M7Ci0gICAgKm90X2dzdWIgPSAoRlRfQnl0ZXMpZ3N1YjsKLSAgICAqb3RfanN0ZiA9IChGVF9CeXRlcylqc3RmOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICAgIEZUX0ZSRUUoIGJhc2UgKTsKLSAgICAgIEZUX0ZSRUUoIGdkZWYgKTsKLSAgICAgIEZUX0ZSRUUoIGdwb3MgKTsKLSAgICAgIEZUX0ZSRUUoIGdzdWIgKTsKLSAgICAgIEZUX0ZSRUUoIGpzdGYgKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLQotICAgICAgRlRfRlJFRSggbWF0aCApOyAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgcmV0dXJuIHRoaXMgYXMgQVBJIGlzIGZyb3plbiAqLwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX1NlcnZpY2VfT1R2YWxpZGF0ZVJlYyAgb3R2YWxpZF9pbnRlcmZhY2UgPQotICB7Ci0gICAgb3R2X3ZhbGlkYXRlICAgICAgICAvKiB2YWxpZGF0ZSAqLwotICB9OwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBvdHZhbGlkX3NlcnZpY2VzW10gPQotICB7Ci0gICAgeyBGVF9TRVJWSUNFX0lEX09QRU5UWVBFX1ZBTElEQVRFLCAmb3R2YWxpZF9pbnRlcmZhY2UgfSwKLSAgICB7IE5VTEwsIE5VTEwgfQotICB9OwotCi0KLSAgc3RhdGljIEZUX1BvaW50ZXIKLSAgb3R2YWxpZF9nZXRfc2VydmljZSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNlcnZpY2VfaWQgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBtb2R1bGUgKTsKLQotICAgIHJldHVybiBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBvdHZhbGlkX3NlcnZpY2VzLCBzZXJ2aWNlX2lkICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgIG90dl9tb2R1bGVfY2xhc3MgPQotICB7Ci0gICAgMCwKLSAgICBzaXplb2YgKCBGVF9Nb2R1bGVSZWMgKSwKLSAgICAib3R2YWxpZCIsCi0gICAgMHgxMDAwMEwsCi0gICAgMHgyMDAwMEwsCi0KLSAgICBOVUxMLCAgICAgICAgICAgICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilOVUxMLCAgICAgICAgICAgICAgICAvKiBtb2R1bGVfaW5pdCAgICovCi0gICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSBOVUxMLCAgICAgICAgICAgICAgICAvKiBtb2R1bGVfZG9uZSAgICovCi0gICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICBvdHZhbGlkX2dldF9zZXJ2aWNlICAvKiBnZXRfaW50ZXJmYWNlICovCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZtb2QuaCBiL3NyYy9vdHZhbGlkL290dm1vZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ0MDFkLi4wMDAwMDAwCi0tLSBhL3NyYy9vdHZhbGlkL290dm1vZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2bW9kLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlJ3MgT3BlblR5cGUgdmFsaWRhdGlvbiBtb2R1bGUgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBPVFZNT0RfSF8KLSNkZWZpbmUgT1RWTU9EX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgKSAgb3R2X21vZHVsZV9jbGFzczsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBPVFZNT0RfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL3J1bGVzLm1rIGIvc3JjL290dmFsaWQvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzI5YTkuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgT3BlblR5cGUgdmFsaWRhdGlvbiBkcml2ZXIgY29uZmlndXJhdGlvbiBydWxlcwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDQtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBPVFYgZHJpdmVyIGRpcmVjdG9yeQotIwotT1RWX0RJUiA6PSAkKFNSQ19ESVIpL290dmFsaWQKLQotCi0jIGNvbXBpbGF0aW9uIGZsYWdzIGZvciB0aGUgZHJpdmVyCi0jCi1PVFZfQ09NUElMRSA6PSAkKENDKSAkKEFOU0lGTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgJEkkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCQoT1RWX0RJUikpIFwKLSAgICAgICAgICAgICAgICAgICAgICQoSU5DTFVERV9GTEFHUykgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAkKEZUX0NGTEFHUykKLQotCi0jIE9UViBkcml2ZXIgc291cmNlcyAoaS5lLiwgQyBmaWxlcykKLSMKLU9UVl9EUlZfU1JDIDo9ICQoT1RWX0RJUikvb3R2YmFzZS5jICBcCi0gICAgICAgICAgICAgICAkKE9UVl9ESVIpL290dmNvbW1uLmMgXAotICAgICAgICAgICAgICAgJChPVFZfRElSKS9vdHZnZGVmLmMgIFwKLSAgICAgICAgICAgICAgICQoT1RWX0RJUikvb3R2Z3Bvcy5jICBcCi0gICAgICAgICAgICAgICAkKE9UVl9ESVIpL290dmdzdWIuYyAgXAotICAgICAgICAgICAgICAgJChPVFZfRElSKS9vdHZqc3RmLmMgIFwKLSAgICAgICAgICAgICAgICQoT1RWX0RJUikvb3R2bWF0aC5jICBcCi0gICAgICAgICAgICAgICAkKE9UVl9ESVIpL290dm1vZC5jCi0KLSMgT1RWIGRyaXZlciBoZWFkZXJzCi0jCi1PVFZfRFJWX0ggOj0gJChPVFZfRElSKS9vdHZhbGlkLmggIFwKLSAgICAgICAgICAgICAkKE9UVl9ESVIpL290dmNvbW1uLmggXAotICAgICAgICAgICAgICQoT1RWX0RJUikvb3R2ZXJyb3IuaCBcCi0gICAgICAgICAgICAgJChPVFZfRElSKS9vdHZncG9zLmggIFwKLSAgICAgICAgICAgICAkKE9UVl9ESVIpL290dm1vZC5oCi0KLQotIyBPVFYgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIE9UVl9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMuCi0jICAgT1RWX0RSVl9PQkpfUyBpcyB1c2VkIGR1cmluZyBgc2luZ2xlJyBidWlsZHMuCi0jCi1PVFZfRFJWX09CSl9NIDo9ICQoT1RWX0RSVl9TUkM6JChPVFZfRElSKS8lLmM9JChPQkpfRElSKS8lLiRPKQotT1RWX0RSVl9PQkpfUyA6PSAkKE9CSl9ESVIpL290dmFsaWQuJE8KLQotIyBPVFYgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLU9UVl9EUlZfU1JDX1MgOj0gJChPVFZfRElSKS9vdHZhbGlkLmMKLQotCi0jIE9UViBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0Ci0jCi0kKE9UVl9EUlZfT0JKX1MpOiAkKE9UVl9EUlZfU1JDX1MpICQoT1RWX0RSVl9TUkMpIFwKLSAgICAgICAgICAgICAgICAgICAkKEZSRUVUWVBFX0gpICQoT1RWX0RSVl9IKQotCSQoT1RWX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKE9UVl9EUlZfU1JDX1MpKQotCi0KLSMgT1RWIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChPVFZfRElSKS8lLmMgJChGUkVFVFlQRV9IKSAkKE9UVl9EUlZfSCkKLQkkKE9UVl9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoT1RWX0RSVl9PQkpfUykKLURSVl9PQkpTX00gKz0gJChPVFZfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvcGNmL0phbWZpbGUgYi9zcmMvcGNmL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGYyN2QuLjAwMDAwMDAKLS0tIGEvc3JjL3BjZi9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9wY2YgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHBjZiA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gcGNmZHJpdnIKLSAgICAgICAgICAgICAgIHBjZnJlYWQKLSAgICAgICAgICAgICAgIHBjZnV0aWwKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHBjZiA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9wY2YgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3BjZi9SRUFETUUgYi9zcmMvcGNmL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlZmYxNS4uMDAwMDAwMAotLS0gYS9zcmMvcGNmL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgIEZyZWVUeXBlIGZvbnQgZHJpdmVyIGZvciBQQ0YgZm9udHMKLQotICAgICAgICAgICAgICAgICAgICAgICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLSAgICAgICAgICAgICAgICAgIDxmcmFuY2VzY28uemFwcGEubmFyZGVsbGlAZW5zLmZyPgotCi0KLUludHJvZHVjdGlvbgotKioqKioqKioqKioqCi0KLVBDRiAoUG9ydGFibGUgQ29tcGlsZWQgRm9ybWF0KSBpcyBhIGJpbmFyeSBiaXRtYXAgZm9udCBmb3JtYXQsIGxhcmdlbHkgdXNlZAotaW4gWCB3b3JsZC4gVGhpcyBjb2RlIGltcGxlbWVudHMgYSBQQ0YgZHJpdmVyIGZvciB0aGUgRnJlZVR5cGUgbGlicmFyeS4KLUdseXBoIGltYWdlcyBhcmUgbG9hZGVkIGludG8gbWVtb3J5IG9ubHkgb24gZGVtYW5kLCB0aHVzIGxlYWRpbmcgdG8gYSBzbWFsbAotbWVtb3J5IGZvb3RwcmludC4KLQotSW5mb3JtYXRpb24gb24gdGhlIFBDRiBmb250IGZvcm1hdCBjYW4gb25seSBiZSB3b3JrZWQgb3V0IGZyb20KLWBwY2ZyZWFkLmMnLCBhbmQgYHBjZndyaXRlLmMnLCB0byBiZSBmb3VuZCwgZm9yIGluc3RhbmNlLCBpbiB0aGUgWEZyZWU4NgotKHd3dy54ZnJlZTg2Lm9yZykgc291cmNlIHRyZWUgKHhjL2xpYi9mb250L2JpdG1hcC8pLgotCi1NYW55IGdvb2QgYml0bWFwIGZvbnRzIGluIGJkZiBmb3JtYXQgY29tZSB3aXRoIFhGcmVlODY6IHRoZXkgY2FuIGJlCi1jb21waWxlZCBpbnRvIHRoZSBwY2YgZm9ybWF0IHVzaW5nIHRoZSBgYmRmdG9wY2YnIHV0aWxpdHkuCi0KLQotU3VwcG9ydGVkIGhhcmR3YXJlCi0qKioqKioqKioqKioqKioqKioKLQotVGhlIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gbGludXgveDg2IGFuZCBzdW5vczUuNS9zcGFyYy4gIEluIGJvdGgKLWNhc2VzIHRoZSBjb21waWxlciB3YXMgZ2NjLiAgV2hlbiBiYWNrIGluIFBhcmlzLCBJIHdpbGwgdGVzdCBpdCBhbHNvCi1vbiBsaW51eC9hbHBoYS4KLQotCi1FbmNvZGluZ3MKLSoqKioqKioqKgotCi1Vc2UgYEZUX0dldF9CREZfQ2hhcnNldF9JRCcgdG8gYWNjZXNzIHRoZSBlbmNvZGluZyBhbmQgcmVnaXN0cnkuCi0KLVRoZSBkcml2ZXIgYWx3YXlzIGV4cG9ydHMgYGZ0X2VuY29kaW5nX25vbmUnIGFzIGZhY2UtPmNoYXJtYXAuZW5jb2RpbmcuCi1GVF9HZXRfQ2hhcl9JbmRleCgpIGJlaGF2aW9yIGlzIHVubW9kaWZpZWQsIHRoYXQgaXMsIGl0IGNvbnZlcnRzIHRoZSBVTG9uZwotdmFsdWUgZ2l2ZW4gYXMgYXJndW1lbnQgaW50byB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBudW1iZXIuCi0KLQotS25vd24gcHJvYmxlbXMKLSoqKioqKioqKioqKioqCi0KLS0gZGVhbGluZyBleHBsaWNpdGx5IHdpdGggZW5jb2RpbmdzIGJyZWFrcyB0aGUgdW5pZm9ybWl0eSBvZiBmcmVldHlwZTIKLSAgYXBpLgotCi0tIGV4Y2VwdCBmb3IgZW5jb2RpbmdzIHByb3BlcnRpZXMsIGNsaWVudCBhcHBsaWNhdGlvbnMgaGF2ZSBubwotICB2aXNpYmlsaXR5IG9mIHRoZSBQQ0ZfRmFjZSBvYmplY3QuICBUaGlzIG1lYW5zIHRoYXQgYXBwbGljYXRpb25zCi0gIGNhbm5vdCBkaXJlY3RseSBhY2Nlc3MgZm9udCB0YWJsZXMgYW5kIGFyZSBvYmxpZ2VkIHRvIHRydXN0Ci0gIEZyZWVUeXBlLgotCi0tIGN1cnJlbnRseSwgZ2x5cGggbmFtZXMgYW5kIGlua19tZXRyaWNzIGFyZSBpZ25vcmVkLgotCi1JIHBsYW4gdG8gZ2l2ZSBmdWxsIHZpc2liaWxpdHkgb2YgdGhlIFBDRl9GYWNlIG9iamVjdCBpbiB0aGUgbmV4dAotcmVsZWFzZSBvZiB0aGUgZHJpdmVyLCB0aHVzIGltcGxlbWVudGluZyBhbHNvIGdseXBoIG5hbWVzIGFuZAotaW5rX21ldHJpY3MuCi0KLS0gaGVpZ2h0IGlzIGRlZmluZWQgYXMgKGFzY2VudCAtIGRlc2NlbnQpLiAgSXMgdGhpcyBjb3JyZWN0PwotCi0tIGlmIHVuYWJsZSB0byByZWFkIHNpemUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZm9udCwgUENGX0luaXRfRmFjZQotICBzZXRzIGF2YWlsYWJsZV9zaXplLT53aWR0aCBhbmQgYXZhaWxhYmxlX3NpemUtPmhlaWdodCB0byAxMi4KLQotLSB0b28gbWFueSBlbmdsaXNoIGdyYW1tYXIgZXJyb3JzIGluIHRoZSByZWFkbWUgZmlsZSA6LSgKLQotCi1MaWNlbnNlCi0qKioqKioqCi0KLUNvcHlyaWdodCAoQykgMjAwMCBieSBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi1hIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLXdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLWRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi10aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCi1pbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi1FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLUlOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi1DTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLVNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0KLUNyZWRpdHMKLSoqKioqKioKLQotS2VpdGggUGFja2FyZCB3cm90ZSB0aGUgcGNmIGRyaXZlciBmb3VuZCBpbiBYRnJlZTg2LiAgSGlzIHdvcmsgaXMgYXQKLXRoZSBzYW1lIHRpbWUgdGhlIHNwZWNpZmljYXRpb24gYW5kIHRoZSBzYW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1QQ0YgZm9ybWF0LiAgVW5kb3VidGVkbHksIHRoaXMgZHJpdmVyIGlzIGluc3BpcmVkIGZyb20gaGlzIHdvcmsuCmRpZmYgLS1naXQgYS9zcmMvcGNmL21vZHVsZS5tayBiL3NyYy9wY2YvbW9kdWxlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjM4M2ZmLi4wMDAwMDAwCi0tLSBhL3NyYy9wY2YvbW9kdWxlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFBDRiBtb2R1bGUgZGVmaW5pdGlvbgotIwotCi0jIENvcHlyaWdodCAyMDAwLCAyMDA2IGJ5Ci0jIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotIwotIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci0jIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi0jIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLSMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSMKLSMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0jCi0jIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0jIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi0jIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLSMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLSMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotIyBUSEUgU09GVFdBUkUuCi0KLQotRlRNT0RVTEVfSF9DT01NQU5EUyArPSBQQ0ZfRFJJVkVSCi0KLWRlZmluZSBQQ0ZfRFJJVkVSCi0kKE9QRU5fRFJJVkVSKSBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHBjZl9kcml2ZXJfY2xhc3MgJChDTE9TRV9EUklWRVIpCi0kKEVDSE9fRFJJVkVSKXBjZiAgICAgICAkKEVDSE9fRFJJVkVSX0RFU0MpcGNmIGJpdG1hcCBmb250cyQoRUNIT19EUklWRVJfRE9ORSkKLWVuZGVmCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvcGNmL3BjZi5jIGIvc3JjL3BjZi9wY2YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmZDZlMi4uMDAwMDAwMAotLS0gYS9zcmMvcGNmL3BjZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogIHBjZi5jCi0KLSAgICBGcmVlVHlwZSBmb250IGRyaXZlciBmb3IgcGNmIGZvbnRzCi0KLSAgQ29weXJpZ2h0IDIwMDAtMjAwMSwgMjAwMyBieQotICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotVEhFIFNPRlRXQVJFLgotKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAicGNmZHJpdnIuYyIKLSNpbmNsdWRlICJwY2ZyZWFkLmMiCi0jaW5jbHVkZSAicGNmdXRpbC5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2YuaCBiL3NyYy9wY2YvcGNmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzkwY2IuLjAwMDAwMDAKLS0tIGEvc3JjL3BjZi9wY2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiAgcGNmLmgKLQotICBGcmVlVHlwZSBmb250IGRyaXZlciBmb3IgcGNmIGZvbnRzCi0KLSAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA2LCAyMDEwIGJ5Ci0gIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCi0qLwotCi0KLSNpZm5kZWYgUENGX0hfCi0jZGVmaW5lIFBDRl9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBDRl9UYWJsZVJlY18KLSAgewotICAgIEZUX1VMb25nICB0eXBlOwotICAgIEZUX1VMb25nICBmb3JtYXQ7Ci0gICAgRlRfVUxvbmcgIHNpemU7Ci0gICAgRlRfVUxvbmcgIG9mZnNldDsKLQotICB9IFBDRl9UYWJsZVJlYywgKlBDRl9UYWJsZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQQ0ZfVG9jUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICB2ZXJzaW9uOwotICAgIEZUX1VMb25nICAgY291bnQ7Ci0gICAgUENGX1RhYmxlICB0YWJsZXM7Ci0KLSAgfSBQQ0ZfVG9jUmVjLCAqUENGX1RvYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQQ0ZfUGFyc2VQcm9wZXJ0eVJlY18KLSAgewotICAgIEZUX0xvbmcgIG5hbWU7Ci0gICAgRlRfQnl0ZSAgaXNTdHJpbmc7Ci0gICAgRlRfTG9uZyAgdmFsdWU7Ci0KLSAgfSBQQ0ZfUGFyc2VQcm9wZXJ0eVJlYywgKlBDRl9QYXJzZVByb3BlcnR5OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBDRl9Qcm9wZXJ0eVJlY18KLSAgewotICAgIEZUX1N0cmluZyogIG5hbWU7Ci0gICAgRlRfQnl0ZSAgICAgaXNTdHJpbmc7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIEZUX1N0cmluZyogIGF0b207Ci0gICAgICBGVF9Mb25nICAgICBsOwotICAgICAgRlRfVUxvbmcgICAgdWw7Ci0KLSAgICB9IHZhbHVlOwotCi0gIH0gUENGX1Byb3BlcnR5UmVjLCAqUENGX1Byb3BlcnR5OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBDRl9Db21wcmVzc2VkX01ldHJpY1JlY18KLSAgewotICAgIEZUX0J5dGUgIGxlZnRTaWRlQmVhcmluZzsKLSAgICBGVF9CeXRlICByaWdodFNpZGVCZWFyaW5nOwotICAgIEZUX0J5dGUgIGNoYXJhY3RlcldpZHRoOwotICAgIEZUX0J5dGUgIGFzY2VudDsKLSAgICBGVF9CeXRlICBkZXNjZW50OwotCi0gIH0gUENGX0NvbXByZXNzZWRfTWV0cmljUmVjLCAqUENGX0NvbXByZXNzZWRfTWV0cmljOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBDRl9NZXRyaWNSZWNfCi0gIHsKLSAgICBGVF9TaG9ydCAgbGVmdFNpZGVCZWFyaW5nOwotICAgIEZUX1Nob3J0ICByaWdodFNpZGVCZWFyaW5nOwotICAgIEZUX1Nob3J0ICBjaGFyYWN0ZXJXaWR0aDsKLSAgICBGVF9TaG9ydCAgYXNjZW50OwotICAgIEZUX1Nob3J0ICBkZXNjZW50OwotICAgIEZUX1Nob3J0ICBhdHRyaWJ1dGVzOwotICAgIEZUX1VMb25nICBiaXRzOwotCi0gIH0gUENGX01ldHJpY1JlYywgKlBDRl9NZXRyaWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUENGX0FjY2VsUmVjXwotICB7Ci0gICAgRlRfQnl0ZSAgICAgICAgbm9PdmVybGFwOwotICAgIEZUX0J5dGUgICAgICAgIGNvbnN0YW50TWV0cmljczsKLSAgICBGVF9CeXRlICAgICAgICB0ZXJtaW5hbEZvbnQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgY29uc3RhbnRXaWR0aDsKLSAgICBGVF9CeXRlICAgICAgICBpbmtJbnNpZGU7Ci0gICAgRlRfQnl0ZSAgICAgICAgaW5rTWV0cmljczsKLSAgICBGVF9CeXRlICAgICAgICBkcmF3RGlyZWN0aW9uOwotICAgIEZUX0xvbmcgICAgICAgIGZvbnRBc2NlbnQ7Ci0gICAgRlRfTG9uZyAgICAgICAgZm9udERlc2NlbnQ7Ci0gICAgRlRfTG9uZyAgICAgICAgbWF4T3ZlcmxhcDsKLSAgICBQQ0ZfTWV0cmljUmVjICBtaW5ib3VuZHM7Ci0gICAgUENGX01ldHJpY1JlYyAgbWF4Ym91bmRzOwotICAgIFBDRl9NZXRyaWNSZWMgIGlua19taW5ib3VuZHM7Ci0gICAgUENGX01ldHJpY1JlYyAgaW5rX21heGJvdW5kczsKLQotICB9IFBDRl9BY2NlbFJlYywgKlBDRl9BY2NlbDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQQ0ZfRW5jb2RpbmdSZWNfCi0gIHsKLSAgICBGVF9Mb25nICAgIGVuYzsKLSAgICBGVF9VU2hvcnQgIGdseXBoOwotCi0gIH0gUENGX0VuY29kaW5nUmVjLCAqUENGX0VuY29kaW5nOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBDRl9GYWNlUmVjXwotICB7Ci0gICAgRlRfRmFjZVJlYyAgICAgcm9vdDsKLQotICAgIEZUX1N0cmVhbVJlYyAgIGNvbXBfc3RyZWFtOwotICAgIEZUX1N0cmVhbSAgICAgIGNvbXBfc291cmNlOwotCi0gICAgY2hhciogICAgICAgICAgY2hhcnNldF9lbmNvZGluZzsKLSAgICBjaGFyKiAgICAgICAgICBjaGFyc2V0X3JlZ2lzdHJ5OwotCi0gICAgUENGX1RvY1JlYyAgICAgdG9jOwotICAgIFBDRl9BY2NlbFJlYyAgIGFjY2VsOwotCi0gICAgaW50ICAgICAgICAgICAgbnByb3BzOwotICAgIFBDRl9Qcm9wZXJ0eSAgIHByb3BlcnRpZXM7Ci0KLSAgICBGVF9VTG9uZyAgICAgICBubWV0cmljczsKLSAgICBQQ0ZfTWV0cmljICAgICBtZXRyaWNzOwotICAgIEZUX1VMb25nICAgICAgIG5lbmNvZGluZ3M7Ci0gICAgUENGX0VuY29kaW5nICAgZW5jb2RpbmdzOwotCi0gICAgRlRfU2hvcnQgICAgICAgZGVmYXVsdENoYXI7Ci0KLSAgICBGVF9VTG9uZyAgICAgICBiaXRtYXBzRm9ybWF0OwotCi0gICAgRlRfQ2hhck1hcCAgICAgY2hhcm1hcF9oYW5kbGU7Ci0gICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsgIC8qIGEgc2luZ2xlIGNoYXJtYXAgcGVyIGZhY2UgKi8KLQotICB9IFBDRl9GYWNlUmVjLCAqUENGX0ZhY2U7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUENGX0RyaXZlclJlY18KLSAgewotICAgIEZUX0RyaXZlclJlYyAgcm9vdDsKLQotICAgIEZUX0Jvb2wgIG5vX2xvbmdfZmFtaWx5X25hbWVzOwotCi0gIH0gUENGX0RyaXZlclJlYywgKlBDRl9Ecml2ZXI7Ci0KLQotICAvKiBtYWNyb3MgZm9yIHBjZiBmb250IGZvcm1hdCAqLwotCi0jZGVmaW5lIExTQkZpcnN0ICAwCi0jZGVmaW5lIE1TQkZpcnN0ICAxCi0KLSNkZWZpbmUgUENGX0ZJTEVfVkVSU0lPTiAgICAgICAgKCAoICdwJyA8PCAyNCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ2MnIDw8IDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAnZicgPDwgIDggKSB8IDEgKQotI2RlZmluZSBQQ0ZfRk9STUFUX01BU0sgICAgICAgICAweEZGRkZGRjAwVUwKLQotI2RlZmluZSBQQ0ZfREVGQVVMVF9GT1JNQVQgICAgICAweDAwMDAwMDAwVUwKLSNkZWZpbmUgUENGX0lOS0JPVU5EUyAgICAgICAgICAgMHgwMDAwMDIwMFVMCi0jZGVmaW5lIFBDRl9BQ0NFTF9XX0lOS0JPVU5EUyAgIDB4MDAwMDAxMDBVTAotI2RlZmluZSBQQ0ZfQ09NUFJFU1NFRF9NRVRSSUNTICAweDAwMDAwMTAwVUwKLQotI2RlZmluZSBQQ0ZfRk9STUFUX01BVENIKCBhLCBiICkgXAotICAgICAgICAgICggKCAoYSkgJiBQQ0ZfRk9STUFUX01BU0sgKSA9PSAoIChiKSAmIFBDRl9GT1JNQVRfTUFTSyApICkKLQotI2RlZmluZSBQQ0ZfR0xZUEhfUEFEX01BU0sgICggMyA8PCAwICkKLSNkZWZpbmUgUENGX0JZVEVfTUFTSyAgICAgICAoIDEgPDwgMiApCi0jZGVmaW5lIFBDRl9CSVRfTUFTSyAgICAgICAgKCAxIDw8IDMgKQotI2RlZmluZSBQQ0ZfU0NBTl9VTklUX01BU0sgICggMyA8PCA0ICkKLQotI2RlZmluZSBQQ0ZfQllURV9PUkRFUiggZiApIFwKLSAgICAgICAgICAoICggKGYpICYgUENGX0JZVEVfTUFTSyApID8gTVNCRmlyc3QgOiBMU0JGaXJzdCApCi0jZGVmaW5lIFBDRl9CSVRfT1JERVIoIGYgKSBcCi0gICAgICAgICAgKCAoIChmKSAmIFBDRl9CSVRfTUFTSyApID8gTVNCRmlyc3QgOiBMU0JGaXJzdCApCi0jZGVmaW5lIFBDRl9HTFlQSF9QQURfSU5ERVgoIGYgKSBcCi0gICAgICAgICAgKCAoZikgJiBQQ0ZfR0xZUEhfUEFEX01BU0sgKQotI2RlZmluZSBQQ0ZfR0xZUEhfUEFEKCBmICkgXAotICAgICAgICAgICggMSA8PCBQQ0ZfR0xZUEhfUEFEX0lOREVYKCBmICkgKQotI2RlZmluZSBQQ0ZfU0NBTl9VTklUX0lOREVYKCBmICkgXAotICAgICAgICAgICggKCAoZikgJiBQQ0ZfU0NBTl9VTklUX01BU0sgKSA+PiA0ICkKLSNkZWZpbmUgUENGX1NDQU5fVU5JVCggZiApIFwKLSAgICAgICAgICAoIDEgPDwgUENGX1NDQU5fVU5JVF9JTkRFWCggZiApICkKLSNkZWZpbmUgUENGX0ZPUk1BVF9CSVRTKCBmICkgICAgICAgICAgICAgXAotICAgICAgICAgICggKGYpICYgKCBQQ0ZfR0xZUEhfUEFEX01BU0sgfCBcCi0gICAgICAgICAgICAgICAgICAgIFBDRl9CWVRFX01BU0sgICAgICB8IFwKLSAgICAgICAgICAgICAgICAgICAgUENGX0JJVF9NQVNLICAgICAgIHwgXAotICAgICAgICAgICAgICAgICAgICBQQ0ZfU0NBTl9VTklUX01BU0sgKSApCi0KLSNkZWZpbmUgUENGX1NJWkVfVE9fSU5ERVgoIHMgKSAgKCAocykgPT0gNCA/IDIgOiAocykgPT0gMiA/IDEgOiAwICkKLSNkZWZpbmUgUENGX0lOREVYX1RPX1NJWkUoIGIgKSAgKCAxIDw8IGIgKQotCi0jZGVmaW5lIFBDRl9GT1JNQVQoIGJpdCwgYnl0ZSwgZ2x5cGgsIHNjYW4gKSAgICAgICAgICBcCi0gICAgICAgICAgKCAoIFBDRl9TSVpFX1RPX0lOREVYKCBzY2FuICkgICAgICA8PCA0ICkgfCBcCi0gICAgICAgICAgICAoICggKGJpdCkgID09IE1TQkZpcnN0ID8gMSA6IDAgKSA8PCAzICkgfCBcCi0gICAgICAgICAgICAoICggKGJ5dGUpID09IE1TQkZpcnN0ID8gMSA6IDAgKSA8PCAyICkgfCBcCi0gICAgICAgICAgICAoIFBDRl9TSVpFX1RPX0lOREVYKCBnbHlwaCApICAgICA8PCAwICkgKQotCi0jZGVmaW5lIFBDRl9QUk9QRVJUSUVTICAgICAgICAoIDEgPDwgMCApCi0jZGVmaW5lIFBDRl9BQ0NFTEVSQVRPUlMgICAgICAoIDEgPDwgMSApCi0jZGVmaW5lIFBDRl9NRVRSSUNTICAgICAgICAgICAoIDEgPDwgMiApCi0jZGVmaW5lIFBDRl9CSVRNQVBTICAgICAgICAgICAoIDEgPDwgMyApCi0jZGVmaW5lIFBDRl9JTktfTUVUUklDUyAgICAgICAoIDEgPDwgNCApCi0jZGVmaW5lIFBDRl9CREZfRU5DT0RJTkdTICAgICAoIDEgPDwgNSApCi0jZGVmaW5lIFBDRl9TV0lEVEhTICAgICAgICAgICAoIDEgPDwgNiApCi0jZGVmaW5lIFBDRl9HTFlQSF9OQU1FUyAgICAgICAoIDEgPDwgNyApCi0jZGVmaW5lIFBDRl9CREZfQUNDRUxFUkFUT1JTICAoIDEgPDwgOCApCi0KLSNkZWZpbmUgR0xZUEhQQURPUFRJT05TICA0IC8qIEknbSBub3Qgc3VyZSBhYm91dCB0aGlzICovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcGNmX2xvYWRfZm9udCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIFBDRl9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBmYWNlX2luZGV4ICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFBDRl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2Zkcml2ci5jIGIvc3JjL3BjZi9wY2Zkcml2ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjlmNzVlLi4wMDAwMDAwCi0tLSBhL3NyYy9wY2YvcGNmZHJpdnIuYworKysgL2Rldi9udWxsCkBAIC0xLDg2OSArMCwwIEBACi0vKiAgcGNmZHJpdnIuYwotCi0gICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgZm9yIHBjZiBmaWxlcwotCi0gICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIDIwMDYtMjAxMSwgMjAxMywgMjAxNCBieQotICAgIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCi0qLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9HWklQX0gKLSNpbmNsdWRlIEZUX0xaV19ICi0jaW5jbHVkZSBGVF9CWklQMl9ICi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotI2luY2x1ZGUgRlRfQkRGX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICi0KLSNpbmNsdWRlICJwY2YuaCIKLSNpbmNsdWRlICJwY2Zkcml2ci5oIgotI2luY2x1ZGUgInBjZnJlYWQuaCIKLQotI2luY2x1ZGUgInBjZmVycm9yLmgiCi0jaW5jbHVkZSAicGNmdXRpbC5oIgotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3BjZnJlYWQKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9CREZfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAotI2luY2x1ZGUgRlRfUENGX0RSSVZFUl9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9wY2Zkcml2ZXIKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQQ0ZfQ01hcFJlY18KLSAgewotICAgIEZUX0NNYXBSZWMgICAgcm9vdDsKLSAgICBGVF9VTG9uZyAgICAgIG51bV9lbmNvZGluZ3M7Ci0gICAgUENGX0VuY29kaW5nICBlbmNvZGluZ3M7Ci0KLSAgfSBQQ0ZfQ01hcFJlYywgKlBDRl9DTWFwOwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHBjZl9jbWFwX2luaXQoIEZUX0NNYXAgICAgIHBjZmNtYXAsICAgLyogUENGX0NNYXAgKi8KLSAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgaW5pdF9kYXRhICkKLSAgewotICAgIFBDRl9DTWFwICBjbWFwID0gKFBDRl9DTWFwKXBjZmNtYXA7Ci0gICAgUENGX0ZhY2UgIGZhY2UgPSAoUENGX0ZhY2UpRlRfQ01BUF9GQUNFKCBwY2ZjbWFwICk7Ci0KLSAgICBGVF9VTlVTRUQoIGluaXRfZGF0YSApOwotCi0KLSAgICBjbWFwLT5udW1fZW5jb2RpbmdzID0gZmFjZS0+bmVuY29kaW5nczsKLSAgICBjbWFwLT5lbmNvZGluZ3MgICAgID0gZmFjZS0+ZW5jb2RpbmdzOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgcGNmX2NtYXBfZG9uZSggRlRfQ01hcCAgcGNmY21hcCApICAgICAgICAgLyogUENGX0NNYXAgKi8KLSAgewotICAgIFBDRl9DTWFwICBjbWFwID0gKFBDRl9DTWFwKXBjZmNtYXA7Ci0KLQotICAgIGNtYXAtPmVuY29kaW5ncyAgICAgPSBOVUxMOwotICAgIGNtYXAtPm51bV9lbmNvZGluZ3MgPSAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICBwY2ZfY21hcF9jaGFyX2luZGV4KCBGVF9DTWFwICAgIHBjZmNtYXAsICAvKiBQQ0ZfQ01hcCAqLwotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJjb2RlICkKLSAgewotICAgIFBDRl9DTWFwICAgICAgY21hcCAgICAgID0gKFBDRl9DTWFwKXBjZmNtYXA7Ci0gICAgUENGX0VuY29kaW5nICBlbmNvZGluZ3MgPSBjbWFwLT5lbmNvZGluZ3M7Ci0gICAgRlRfVUxvbmcgICAgICBtaW4sIG1heCwgbWlkOwotICAgIEZUX1VJbnQgICAgICAgcmVzdWx0ICAgID0gMDsKLQotCi0gICAgbWluID0gMDsKLSAgICBtYXggPSBjbWFwLT5udW1fZW5jb2RpbmdzOwotCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIEZUX1VMb25nICBjb2RlOwotCi0KLSAgICAgIG1pZCAgPSAoIG1pbiArIG1heCApID4+IDE7Ci0gICAgICBjb2RlID0gKEZUX1VMb25nKWVuY29kaW5nc1ttaWRdLmVuYzsKLQotICAgICAgaWYgKCBjaGFyY29kZSA9PSBjb2RlICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZW5jb2RpbmdzW21pZF0uZ2x5cGggKyAxOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCBjaGFyY29kZSA8IGNvZGUgKQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICBlbHNlCi0gICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgcGNmX2NtYXBfY2hhcl9uZXh0KCBGVF9DTWFwICAgIHBjZmNtYXAsICAgLyogUENGX0NNYXAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICphY2hhcmNvZGUgKQotICB7Ci0gICAgUENGX0NNYXAgICAgICBjbWFwICAgICAgPSAoUENGX0NNYXApcGNmY21hcDsKLSAgICBQQ0ZfRW5jb2RpbmcgIGVuY29kaW5ncyA9IGNtYXAtPmVuY29kaW5nczsKLSAgICBGVF9VTG9uZyAgICAgIG1pbiwgbWF4LCBtaWQ7Ci0gICAgRlRfVUxvbmcgICAgICBjaGFyY29kZSAgPSAqYWNoYXJjb2RlICsgMTsKLSAgICBGVF9VSW50ICAgICAgIHJlc3VsdCAgICA9IDA7Ci0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gY21hcC0+bnVtX2VuY29kaW5nczsKLQotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgY29kZTsKLQotCi0gICAgICBtaWQgID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgY29kZSA9IChGVF9VTG9uZyllbmNvZGluZ3NbbWlkXS5lbmM7Ci0KLSAgICAgIGlmICggY2hhcmNvZGUgPT0gY29kZSApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVuY29kaW5nc1ttaWRdLmdseXBoICsgMTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIGNoYXJjb2RlIDwgY29kZSApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICB9Ci0KLSAgICBjaGFyY29kZSA9IDA7Ci0gICAgaWYgKCBtaW4gPCBjbWFwLT5udW1fZW5jb2RpbmdzICkKLSAgICB7Ci0gICAgICBjaGFyY29kZSA9IChGVF9VTG9uZyllbmNvZGluZ3NbbWluXS5lbmM7Ci0gICAgICByZXN1bHQgICA9IGVuY29kaW5nc1ttaW5dLmdseXBoICsgMTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAicGNmX2NtYXBfY2hhcl9uZXh0OiBjaGFyY29kZSAweCV4ID4gMzJiaXQgQVBJIiApKTsKLSAgICAgICphY2hhcmNvZGUgPSAwOwotICAgICAgLyogWFhYOiByZXN1bHQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gaW5kaWNhdGUgYW4gb3ZlcmZsb3cgZXJyb3IgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgICAgKmFjaGFyY29kZSA9IChGVF9VSW50MzIpY2hhcmNvZGU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMgIHBjZl9jbWFwX2NsYXNzID0KLSAgewotICAgIHNpemVvZiAoIFBDRl9DTWFwUmVjICksCi0gICAgcGNmX2NtYXBfaW5pdCwKLSAgICBwY2ZfY21hcF9kb25lLAotICAgIHBjZl9jbWFwX2NoYXJfaW5kZXgsCi0gICAgcGNmX2NtYXBfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgUENGX0ZhY2VfRG9uZSggRlRfRmFjZSAgcGNmZmFjZSApICAgICAgICAgLyogUENGX0ZhY2UgKi8KLSAgewotICAgIFBDRl9GYWNlICAgZmFjZSA9IChQQ0ZfRmFjZSlwY2ZmYWNlOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLSAgICBGVF9GUkVFKCBmYWNlLT5lbmNvZGluZ3MgKTsKLSAgICBGVF9GUkVFKCBmYWNlLT5tZXRyaWNzICk7Ci0KLSAgICAvKiBmcmVlIHByb3BlcnRpZXMgKi8KLSAgICBpZiAoIGZhY2UtPnByb3BlcnRpZXMgKQotICAgIHsKLSAgICAgIEZUX0ludCAgaTsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2UtPm5wcm9wczsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgUENGX1Byb3BlcnR5ICBwcm9wID0gJmZhY2UtPnByb3BlcnRpZXNbaV07Ci0KLQotICAgICAgICBpZiAoIHByb3AgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRlJFRSggcHJvcC0+bmFtZSApOwotICAgICAgICAgIGlmICggcHJvcC0+aXNTdHJpbmcgKQotICAgICAgICAgICAgRlRfRlJFRSggcHJvcC0+dmFsdWUuYXRvbSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSRUUoIGZhY2UtPnByb3BlcnRpZXMgKTsKLSAgICB9Ci0KLSAgICBGVF9GUkVFKCBmYWNlLT50b2MudGFibGVzICk7Ci0gICAgRlRfRlJFRSggcGNmZmFjZS0+ZmFtaWx5X25hbWUgKTsKLSAgICBGVF9GUkVFKCBwY2ZmYWNlLT5zdHlsZV9uYW1lICk7Ci0gICAgRlRfRlJFRSggcGNmZmFjZS0+YXZhaWxhYmxlX3NpemVzICk7Ci0gICAgRlRfRlJFRSggZmFjZS0+Y2hhcnNldF9lbmNvZGluZyApOwotICAgIEZUX0ZSRUUoIGZhY2UtPmNoYXJzZXRfcmVnaXN0cnkgKTsKLQotICAgIC8qIGNsb3NlIGNvbXByZXNzZWQgc3RyZWFtIGlmIGFueSAqLwotICAgIGlmICggcGNmZmFjZS0+c3RyZWFtID09ICZmYWNlLT5jb21wX3N0cmVhbSApCi0gICAgewotICAgICAgRlRfU3RyZWFtX0Nsb3NlKCAmZmFjZS0+Y29tcF9zdHJlYW0gKTsKLSAgICAgIHBjZmZhY2UtPnN0cmVhbSA9IGZhY2UtPmNvbXBfc291cmNlOwotICAgIH0KLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIFBDRl9GYWNlX0luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgcGNmZmFjZSwgICAgICAgIC8qIFBDRl9GYWNlICovCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCi0gIHsKLSAgICBQQ0ZfRmFjZSAgZmFjZSAgPSAoUENGX0ZhY2UpcGNmZmFjZTsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICBGVF9VTlVTRUQoIG51bV9wYXJhbXMgKTsKLSAgICBGVF9VTlVTRUQoIHBhcmFtcyApOwotCi0KLSAgICBGVF9UUkFDRTIoKCAiUENGIGRyaXZlclxuIiApKTsKLQotICAgIGVycm9yID0gcGNmX2xvYWRfZm9udCggc3RyZWFtLCBmYWNlLCBmYWNlX2luZGV4ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgUENGX0ZhY2VfRG9uZSggcGNmZmFjZSApOwotCi0jaWYgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQiApICB8fCBcCi0gICAgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9VU0VfTFpXICkgICB8fCBcCi0gICAgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9VU0VfQlpJUDIgKQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQgotICAgICAgewotICAgICAgICBGVF9FcnJvciAgZXJyb3IyOwotCi0KLSAgICAgICAgLyogdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGd6aXAgc3VwcG9ydCEgKi8KLSAgICAgICAgRlRfVFJBQ0UyKCggIiAgLi4uIHRyeSBnemlwIHN0cmVhbVxuIiApKTsKLSAgICAgICAgZXJyb3IyID0gRlRfU3RyZWFtX09wZW5HemlwKCAmZmFjZS0+Y29tcF9zdHJlYW0sIHN0cmVhbSApOwotICAgICAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IyLCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGVycm9yID0gZXJyb3IyOwotICAgICAgfQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgKi8KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX0xaVwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX0Vycm9yICBlcnJvcjM7Ci0KLQotICAgICAgICAvKiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgTFpXIHN1cHBvcnQhICovCi0gICAgICAgIEZUX1RSQUNFMigoICIgIC4uLiB0cnkgTFpXIHN0cmVhbVxuIiApKTsKLSAgICAgICAgZXJyb3IzID0gRlRfU3RyZWFtX09wZW5MWlcoICZmYWNlLT5jb21wX3N0cmVhbSwgc3RyZWFtICk7Ci0gICAgICAgIGlmICggRlRfRVJSX0VRKCBlcnJvcjMsIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZXJyb3IgPSBlcnJvcjM7Ci0gICAgICB9Ci0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9VU0VfTFpXICovCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMgotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX0Vycm9yICBlcnJvcjQ7Ci0KLQotICAgICAgICAvKiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgQnppcDIgc3VwcG9ydCEgKi8KLSAgICAgICAgRlRfVFJBQ0UyKCggIiAgLi4uIHRyeSBCemlwMiBzdHJlYW1cbiIgKSk7Ci0gICAgICAgIGVycm9yNCA9IEZUX1N0cmVhbV9PcGVuQnppcDIoICZmYWNlLT5jb21wX3N0cmVhbSwgc3RyZWFtICk7Ci0gICAgICAgIGlmICggRlRfRVJSX0VRKCBlcnJvcjQsIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZXJyb3IgPSBlcnJvcjQ7Ci0gICAgICB9Ci0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9VU0VfQlpJUDIgKi8KLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZmFjZS0+Y29tcF9zb3VyY2UgPSBzdHJlYW07Ci0gICAgICBwY2ZmYWNlLT5zdHJlYW0gICA9ICZmYWNlLT5jb21wX3N0cmVhbTsKLQotICAgICAgc3RyZWFtID0gcGNmZmFjZS0+c3RyZWFtOwotCi0gICAgICBlcnJvciA9IHBjZl9sb2FkX2ZvbnQoIHN0cmVhbSwgZmFjZSwgZmFjZV9pbmRleCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotI2Vsc2UgLyogIShGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCIHx8Ci0gICAgICAgICAgIEZUX0NPTkZJR19PUFRJT05fVVNFX0xaVyB8fAotICAgICAgICAgICBGVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMikgKi8KLQotICAgICAgZ290byBGYWlsOwotCi0jZW5kaWYKLSAgICB9Ci0KLSAgICAvKiBQQ0YgY2Fubm90IGhhdmUgbXVsdGlwbGUgZmFjZXMgaW4gYSBzaW5nbGUgZm9udCBmaWxlLgotICAgICAqIFhYWDogQSBub24temVybyBmYWNlX2luZGV4IGlzIGFscmVhZHkgYW4gaW52YWxpZCBhcmd1bWVudCwgYnV0Ci0gICAgICogICAgICBUeXBlMSwgVHlwZTQyIGRyaXZlcnMgaGF2ZSBhIGNvbnZlbnRpb24gdG8gcmV0dXJuCi0gICAgICogICAgICBhbiBpbnZhbGlkIGFyZ3VtZW50IGVycm9yIHdoZW4gdGhlIGZvbnQgY291bGQgYmUKLSAgICAgKiAgICAgIG9wZW5lZCBieSB0aGUgc3BlY2lmaWVkIGRyaXZlci4KLSAgICAgKi8KLSAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBlbHNlIGlmICggZmFjZV9pbmRleCA+IDAgJiYgKCBmYWNlX2luZGV4ICYgMHhGRkZGICkgPiAwICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJQQ0ZfRmFjZV9Jbml0OiBpbnZhbGlkIGZhY2UgaW5kZXhcbiIgKSk7Ci0gICAgICBQQ0ZfRmFjZV9Eb25lKCBwY2ZmYWNlICk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgdXAgY2hhcm1hcCAqLwotICAgIHsKLSAgICAgIEZUX1N0cmluZyAgKmNoYXJzZXRfcmVnaXN0cnkgPSBmYWNlLT5jaGFyc2V0X3JlZ2lzdHJ5OwotICAgICAgRlRfU3RyaW5nICAqY2hhcnNldF9lbmNvZGluZyA9IGZhY2UtPmNoYXJzZXRfZW5jb2Rpbmc7Ci0gICAgICBGVF9Cb29sICAgICB1bmljb2RlX2NoYXJtYXAgID0gMDsKLQotCi0gICAgICBpZiAoIGNoYXJzZXRfcmVnaXN0cnkgJiYgY2hhcnNldF9lbmNvZGluZyApCi0gICAgICB7Ci0gICAgICAgIGNoYXIqICBzID0gY2hhcnNldF9yZWdpc3RyeTsKLQotCi0gICAgICAgIC8qIFVoLCBvaCwgY29tcGFyZSBmaXJzdCBsZXR0ZXJzIG1hbnVhbGx5IHRvIGF2b2lkIGRlcGVuZGVuY3kKLSAgICAgICAgICAgb24gbG9jYWxlcy4gKi8KLSAgICAgICAgaWYgKCAoIHNbMF0gPT0gJ2knIHx8IHNbMF0gPT0gJ0knICkgJiYKLSAgICAgICAgICAgICAoIHNbMV0gPT0gJ3MnIHx8IHNbMV0gPT0gJ1MnICkgJiYKLSAgICAgICAgICAgICAoIHNbMl0gPT0gJ28nIHx8IHNbMl0gPT0gJ08nICkgKQotICAgICAgICB7Ci0gICAgICAgICAgcyArPSAzOwotICAgICAgICAgIGlmICggIWZ0X3N0cmNtcCggcywgIjEwNjQ2IiApICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAoICFmdF9zdHJjbXAoIHMsICI4ODU5IiApICYmCi0gICAgICAgICAgICAgICAgICFmdF9zdHJjbXAoIGZhY2UtPmNoYXJzZXRfZW5jb2RpbmcsICIxIiApICkgKQotICAgICAgICAgICAgdW5pY29kZV9jaGFybWFwID0gMTsKLSAgICAgICAgICAvKiBhbm90aGVyIG5hbWUgZm9yIEFTQ0lJICovCi0gICAgICAgICAgZWxzZSBpZiAoICFmdF9zdHJjbXAoIHMsICI2NDYuMTk5MSIgKSAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgIWZ0X3N0cmNtcCggZmFjZS0+Y2hhcnNldF9lbmNvZGluZywgIklSViIgKSApCi0gICAgICAgICAgICB1bmljb2RlX2NoYXJtYXAgPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsKLQotCi0gICAgICAgIGNoYXJtYXAuZmFjZSAgICAgICAgPSBGVF9GQUNFKCBmYWNlICk7Ci0gICAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19OT05FOwotICAgICAgICAvKiBpbml0aWFsIHBsYXRmb3JtL2VuY29kaW5nIHNob3VsZCBpbmRpY2F0ZSB1bnNldCBzdGF0dXM/ICovCi0gICAgICAgIGNoYXJtYXAucGxhdGZvcm1faWQgPSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFOwotICAgICAgICBjaGFybWFwLmVuY29kaW5nX2lkID0gVFRfQVBQTEVfSURfREVGQVVMVDsKLQotICAgICAgICBpZiAoIHVuaWNvZGVfY2hhcm1hcCApCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfVU5JQ09ERTsKLSAgICAgICAgICBjaGFybWFwLnBsYXRmb3JtX2lkID0gVFRfUExBVEZPUk1fTUlDUk9TT0ZUOwotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9NU19JRF9VTklDT0RFX0NTOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9DTWFwX05ldyggJnBjZl9jbWFwX2NsYXNzLCBOVUxMLCAmY2hhcm1hcCwgTlVMTCApOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIEZUX1RSQUNFMigoICIgIG5vdCBhIFBDRiBmaWxlXG4iICkpOwotICAgIFBDRl9GYWNlX0RvbmUoIHBjZmZhY2UgKTsKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7ICAvKiBlcnJvciAqLwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIFBDRl9TaXplX1NlbGVjdCggRlRfU2l6ZSAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHN0cmlrZV9pbmRleCApCi0gIHsKLSAgICBQQ0ZfQWNjZWwgIGFjY2VsID0gJiggKFBDRl9GYWNlKXNpemUtPmZhY2UgKS0+YWNjZWw7Ci0KLQotICAgIEZUX1NlbGVjdF9NZXRyaWNzKCBzaXplLT5mYWNlLCBzdHJpa2VfaW5kZXggKTsKLQotICAgIHNpemUtPm1ldHJpY3MuYXNjZW5kZXIgICAgPSAgYWNjZWwtPmZvbnRBc2NlbnQgKiA2NDsKLSAgICBzaXplLT5tZXRyaWNzLmRlc2NlbmRlciAgID0gLWFjY2VsLT5mb250RGVzY2VudCAqIDY0OwotICAgIHNpemUtPm1ldHJpY3MubWF4X2FkdmFuY2UgPSAgYWNjZWwtPm1heGJvdW5kcy5jaGFyYWN0ZXJXaWR0aCAqIDY0OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIFBDRl9TaXplX1JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgUENGX0ZhY2UgICAgICAgICBmYWNlICA9IChQQ0ZfRmFjZSlzaXplLT5mYWNlOwotICAgIEZUX0JpdG1hcF9TaXplKiAgYnNpemUgPSBzaXplLT5mYWNlLT5hdmFpbGFibGVfc2l6ZXM7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9QaXhlbF9TaXplICk7Ci0gICAgRlRfTG9uZyAgICAgICAgICBoZWlnaHQ7Ci0KLQotICAgIGhlaWdodCA9IEZUX1JFUVVFU1RfSEVJR0hUKCByZXEgKTsKLSAgICBoZWlnaHQgPSAoIGhlaWdodCArIDMyICkgPj4gNjsKLQotICAgIHN3aXRjaCAoIHJlcS0+dHlwZSApCi0gICAgewotICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTDoKLSAgICAgIGlmICggaGVpZ2h0ID09ICggKCBic2l6ZS0+eV9wcGVtICsgMzIgKSA+PiA2ICkgKQotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTToKLSAgICAgIGlmICggaGVpZ2h0ID09ICggZmFjZS0+YWNjZWwuZm9udEFzY2VudCArCi0gICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmFjY2VsLmZvbnREZXNjZW50ICkgKQotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIFBDRl9TaXplX1NlbGVjdCggc2l6ZSwgMCApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgUENGX0dseXBoX0xvYWQoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgUENGX0ZhY2UgICAgZmFjZSAgID0gKFBDRl9GYWNlKUZUX1NJWkVfRkFDRSggc2l6ZSApOwotICAgIEZUX1N0cmVhbSAgIHN0cmVhbTsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfQml0bWFwKiAgYml0bWFwID0gJnNsb3QtPmJpdG1hcDsKLSAgICBQQ0ZfTWV0cmljICBtZXRyaWM7Ci0gICAgRlRfVUxvbmcgICAgYnl0ZXM7Ci0KLQotICAgIEZUX1RSQUNFMSgoICJQQ0ZfR2x5cGhfTG9hZDogZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggZ2x5cGhfaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0KLSAgICBpZiAoIGdseXBoX2luZGV4ID4gMCApCi0gICAgICBnbHlwaF9pbmRleC0tOwotCi0gICAgbWV0cmljID0gZmFjZS0+bWV0cmljcyArIGdseXBoX2luZGV4OwotCi0gICAgYml0bWFwLT5yb3dzICAgICAgID0gKHVuc2lnbmVkIGludCkoIG1ldHJpYy0+YXNjZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljLT5kZXNjZW50ICk7Ci0gICAgYml0bWFwLT53aWR0aCAgICAgID0gKHVuc2lnbmVkIGludCkoIG1ldHJpYy0+cmlnaHRTaWRlQmVhcmluZyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpYy0+bGVmdFNpZGVCZWFyaW5nICk7Ci0gICAgYml0bWFwLT5udW1fZ3JheXMgID0gMTsKLSAgICBiaXRtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX01PTk87Ci0KLSAgICBzd2l0Y2ggKCBQQ0ZfR0xZUEhfUEFEKCBmYWNlLT5iaXRtYXBzRm9ybWF0ICkgKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBiaXRtYXAtPnBpdGNoID0gKGludCkoICggYml0bWFwLT53aWR0aCArIDcgKSA+PiAzICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIGJpdG1hcC0+cGl0Y2ggPSAoaW50KSggKCAoIGJpdG1hcC0+d2lkdGggKyAxNSApID4+IDQgKSA8PCAxICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIGJpdG1hcC0+cGl0Y2ggPSAoaW50KSggKCAoIGJpdG1hcC0+d2lkdGggKyAzMSApID4+IDUgKSA8PCAyICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgODoKLSAgICAgIGJpdG1hcC0+cGl0Y2ggPSAoaW50KSggKCAoIGJpdG1hcC0+d2lkdGggKyA2MyApID4+IDYgKSA8PCAzICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICBzbG90LT5mb3JtYXQgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVA7Ci0gICAgc2xvdC0+Yml0bWFwX2xlZnQgPSBtZXRyaWMtPmxlZnRTaWRlQmVhcmluZzsKLSAgICBzbG90LT5iaXRtYXBfdG9wICA9IG1ldHJpYy0+YXNjZW50OwotCi0gICAgc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZSAgPSAoRlRfUG9zKSggbWV0cmljLT5jaGFyYWN0ZXJXaWR0aCAqIDY0ICk7Ci0gICAgc2xvdC0+bWV0cmljcy5ob3JpQmVhcmluZ1ggPSAoRlRfUG9zKSggbWV0cmljLT5sZWZ0U2lkZUJlYXJpbmcgKiA2NCApOwotICAgIHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gKEZUX1BvcykoIG1ldHJpYy0+YXNjZW50ICogNjQgKTsKLSAgICBzbG90LT5tZXRyaWNzLndpZHRoICAgICAgICA9IChGVF9Qb3MpKCAoIG1ldHJpYy0+cmlnaHRTaWRlQmVhcmluZyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMtPmxlZnRTaWRlQmVhcmluZyApICogNjQgKTsKLSAgICBzbG90LT5tZXRyaWNzLmhlaWdodCAgICAgICA9IChGVF9Qb3MpKCBiaXRtYXAtPnJvd3MgKiA2NCApOwotCi0gICAgZnRfc3ludGhlc2l6ZV92ZXJ0aWNhbF9tZXRyaWNzKCAmc2xvdC0+bWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggZmFjZS0+YWNjZWwuZm9udEFzY2VudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmFjY2VsLmZvbnREZXNjZW50ICkgKiA2NCApOwotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9CSVRNQVBfTUVUUklDU19PTkxZICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIFhYWDogdG8gZG86IGFyZSB0aGVyZSBjYXNlcyB0aGF0IG5lZWQgcmVwYWRkaW5nIHRoZSBiaXRtYXA/ICovCi0gICAgYnl0ZXMgPSAoRlRfVUxvbmcpYml0bWFwLT5waXRjaCAqIGJpdG1hcC0+cm93czsKLQotICAgIGVycm9yID0gZnRfZ2x5cGhzbG90X2FsbG9jX2JpdG1hcCggc2xvdCwgKEZUX1VMb25nKWJ5dGVzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBtZXRyaWMtPmJpdHMgKSAgICAgICAgICB8fAotICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIGJpdG1hcC0+YnVmZmVyLCBieXRlcyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggUENGX0JJVF9PUkRFUiggZmFjZS0+Yml0bWFwc0Zvcm1hdCApICE9IE1TQkZpcnN0ICkKLSAgICAgIEJpdE9yZGVySW52ZXJ0KCBiaXRtYXAtPmJ1ZmZlciwgYnl0ZXMgKTsKLQotICAgIGlmICggKCBQQ0ZfQllURV9PUkRFUiggZmFjZS0+Yml0bWFwc0Zvcm1hdCApICE9Ci0gICAgICAgICAgIFBDRl9CSVRfT1JERVIoIGZhY2UtPmJpdG1hcHNGb3JtYXQgKSAgKSApCi0gICAgewotICAgICAgc3dpdGNoICggUENGX1NDQU5fVU5JVCggZmFjZS0+Yml0bWFwc0Zvcm1hdCApICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgICAgVHdvQnl0ZVN3YXAoIGJpdG1hcC0+YnVmZmVyLCBieXRlcyApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSA0OgotICAgICAgICBGb3VyQnl0ZVN3YXAoIGJpdG1hcC0+YnVmZmVyLCBieXRlcyApOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gLyoKLSAgKgotICAqICBCREYgU0VSVklDRQotICAqCi0gICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBjZl9nZXRfYmRmX3Byb3BlcnR5KCBQQ0ZfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgICAgcHJvcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3BlcnR5ICkKLSAgewotICAgIFBDRl9Qcm9wZXJ0eSAgcHJvcDsKLQotCi0gICAgcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBmYWNlLCBwcm9wX25hbWUgKTsKLSAgICBpZiAoIHByb3AgKQotICAgIHsKLSAgICAgIGlmICggcHJvcC0+aXNTdHJpbmcgKQotICAgICAgewotICAgICAgICBhcHJvcGVydHktPnR5cGUgICA9IEJERl9QUk9QRVJUWV9UWVBFX0FUT007Ci0gICAgICAgIGFwcm9wZXJ0eS0+dS5hdG9tID0gcHJvcC0+dmFsdWUuYXRvbTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwcm9wLT52YWx1ZS5sID4gMHg3RkZGRkZGRkwgICAgICAgICAgfHwKLSAgICAgICAgICAgICBwcm9wLT52YWx1ZS5sIDwgKCAtMSAtIDB4N0ZGRkZGRkZMICkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggInBjZl9nZXRfYmRmX3Byb3BlcnR5OiIgKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIiB0b28gbGFyZ2UgaW50ZWdlciAweCV4IGlzIHRydW5jYXRlZFxuIiApKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqICBUaGUgUENGIGRyaXZlciBsb2FkcyBhbGwgcHJvcGVydGllcyBhcyBzaWduZWQgaW50ZWdlcnMuCi0gICAgICAgICAqICBUaGlzIHJlYWxseSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBwcm9ibGVtLCBiZWNhdXNlIHRoaXMgaXMKLSAgICAgICAgICogIHN1ZmZpY2llbnQgZm9yIGFueSBtZWFuaW5nZnVsIHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIGFwcm9wZXJ0eS0+dHlwZSAgICAgID0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUjsKLSAgICAgICAgYXByb3BlcnR5LT51LmludGVnZXIgPSAoRlRfSW50MzIpcHJvcC0+dmFsdWUubDsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBjZl9nZXRfY2hhcnNldF9pZCggUENGX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9yZWdpc3RyeSApCi0gIHsKLSAgICAqYWNoYXJzZXRfZW5jb2RpbmcgPSBmYWNlLT5jaGFyc2V0X2VuY29kaW5nOwotICAgICphY2hhcnNldF9yZWdpc3RyeSA9IGZhY2UtPmNoYXJzZXRfcmVnaXN0cnk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9CREZSZWMgIHBjZl9zZXJ2aWNlX2JkZiA9Ci0gIHsKLSAgICAoRlRfQkRGX0dldENoYXJzZXRJZEZ1bmMpcGNmX2dldF9jaGFyc2V0X2lkLCAgICAgLyogZ2V0X2NoYXJzZXRfaWQgKi8KLSAgICAoRlRfQkRGX0dldFByb3BlcnR5RnVuYykgcGNmX2dldF9iZGZfcHJvcGVydHkgICAgLyogZ2V0X3Byb3BlcnR5ICAgKi8KLSAgfTsKLQotCi0gIC8qCi0gICAqICBQUk9QRVJUWSBTRVJWSUNFCi0gICAqCi0gICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGNmX3Byb3BlcnR5X3NldCggRlRfTW9kdWxlICAgIG1vZHVsZSwgICAgICAgICAvKiBQQ0ZfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICB2YWx1ZV9pc19zdHJpbmcgKQotICB7Ci0jaWZkZWYgUENGX0NPTkZJR19PUFRJT05fTE9OR19GQU1JTFlfTkFNRVMKLQotICAgIEZUX0Vycm9yICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBQQ0ZfRHJpdmVyICBkcml2ZXIgPSAoUENGX0RyaXZlciltb2R1bGU7Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTCi0gICAgRlRfVU5VU0VEKCB2YWx1ZV9pc19zdHJpbmcgKTsKLSNlbmRpZgotCi0KLSAgICBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJuby1sb25nLWZhbWlseS1uYW1lcyIgKSApCi0gICAgewotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUwotICAgICAgaWYgKCB2YWx1ZV9pc19zdHJpbmcgKQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiAgcyAgID0gKGNvbnN0IGNoYXIqKXZhbHVlOwotICAgICAgICBsb25nICAgICAgICAgbGZuID0gZnRfc3RydG9sKCBzLCBOVUxMLCAxMCApOwotCi0KLSAgICAgICAgaWYgKCBsZm4gPT0gMCApCi0gICAgICAgICAgZHJpdmVyLT5ub19sb25nX2ZhbWlseV9uYW1lcyA9IDA7Ci0gICAgICAgIGVsc2UgaWYgKCBsZm4gPT0gMSApCi0gICAgICAgICAgZHJpdmVyLT5ub19sb25nX2ZhbWlseV9uYW1lcyA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgICBGVF9Cb29sKiAgbm9fbG9uZ19mYW1pbHlfbmFtZXMgPSAoRlRfQm9vbCopdmFsdWU7Ci0KLQotICAgICAgICBkcml2ZXItPm5vX2xvbmdfZmFtaWx5X25hbWVzID0gKm5vX2xvbmdfZmFtaWx5X25hbWVzOwotICAgICAgfQotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0jZWxzZSAvKiAhUENGX0NPTkZJR19PUFRJT05fTE9OR19GQU1JTFlfTkFNRVMgKi8KLQotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0gICAgRlRfVU5VU0VEKCB2YWx1ZSApOwotICAgIEZUX1VOVVNFRCggdmFsdWVfaXNfc3RyaW5nICk7Ci0jaWZuZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgRlRfVU5VU0VEKCBwcm9wZXJ0eV9uYW1lICk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUyAqLwotCi0gICAgRlRfVFJBQ0UwKCggInBjZl9wcm9wZXJ0eV9zZXQ6IG1pc3NpbmcgcHJvcGVydHkgYCVzJ1xuIiwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eV9uYW1lICkpOwotICAgIHJldHVybiBGVF9USFJPVyggTWlzc2luZ19Qcm9wZXJ0eSApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGNmX3Byb3BlcnR5X2dldCggRlRfTW9kdWxlICAgIG1vZHVsZSwgICAgICAgICAvKiBQQ0ZfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgdmFsdWUgKQotICB7Ci0jaWZkZWYgUENGX0NPTkZJR19PUFRJT05fTE9OR19GQU1JTFlfTkFNRVMKLQotICAgIEZUX0Vycm9yICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBQQ0ZfRHJpdmVyICBkcml2ZXIgPSAoUENGX0RyaXZlciltb2R1bGU7Ci0KLQotICAgIGlmICggIWZ0X3N0cmNtcCggcHJvcGVydHlfbmFtZSwgIm5vLWxvbmctZmFtaWx5LW5hbWVzIiApICkKLSAgICB7Ci0gICAgICBGVF9Cb29sICAgbm9fbG9uZ19mYW1pbHlfbmFtZXMgPSBkcml2ZXItPm5vX2xvbmdfZmFtaWx5X25hbWVzOwotICAgICAgRlRfQm9vbCogIHZhbCAgICAgICAgICAgICAgICAgID0gKEZUX0Jvb2wqKXZhbHVlOwotCi0KLSAgICAgICp2YWwgPSBub19sb25nX2ZhbWlseV9uYW1lczsKLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotI2Vsc2UgLyogIVBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTICovCi0KLSAgICBGVF9VTlVTRUQoIG1vZHVsZSApOwotICAgIEZUX1VOVVNFRCggdmFsdWUgKTsKLSNpZm5kZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBGVF9VTlVTRUQoIHByb3BlcnR5X25hbWUgKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogIVBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTICovCi0KLSAgICBGVF9UUkFDRTAoKCAicGNmX3Byb3BlcnR5X2dldDogbWlzc2luZyBwcm9wZXJ0eSBgJXMnXG4iLAotICAgICAgICAgICAgICAgIHByb3BlcnR5X25hbWUgKSk7Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBNaXNzaW5nX1Byb3BlcnR5ICk7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX1BST1BFUlRJRVNSRUMoCi0gICAgcGNmX3NlcnZpY2VfcHJvcGVydGllcywKLQotICAgIChGVF9Qcm9wZXJ0aWVzX1NldEZ1bmMpcGNmX3Byb3BlcnR5X3NldCwgICAgICAvKiBzZXRfcHJvcGVydHkgKi8KLSAgICAoRlRfUHJvcGVydGllc19HZXRGdW5jKXBjZl9wcm9wZXJ0eV9nZXQgKSAgICAgLyogZ2V0X3Byb3BlcnR5ICovCi0KLQotIC8qCi0gICoKLSAgKiAgU0VSVklDRSBMSVNUCi0gICoKLSAgKi8KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIHBjZl9zZXJ2aWNlc1tdID0KLSAgewotICAgIHsgRlRfU0VSVklDRV9JRF9CREYsICAgICAgICAgJnBjZl9zZXJ2aWNlX2JkZiB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCwgRlRfRk9OVF9GT1JNQVRfUENGIH0sCi0gICAgeyBGVF9TRVJWSUNFX0lEX1BST1BFUlRJRVMsICAmcGNmX3NlcnZpY2VfcHJvcGVydGllcyB9LAotICAgIHsgTlVMTCwgTlVMTCB9Ci0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX01vZHVsZV9JbnRlcmZhY2UgKQotICBwY2ZfZHJpdmVyX3JlcXVlc3RlciggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBuYW1lICkKLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0KLSAgICByZXR1cm4gZnRfc2VydmljZV9saXN0X2xvb2t1cCggcGNmX3NlcnZpY2VzLCBuYW1lICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBwY2ZfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgbW9kdWxlICkgICAgICAvKiBQQ0ZfRHJpdmVyICovCi0gIHsKLSNpZmRlZiBQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUwotICAgIFBDRl9Ecml2ZXIgIGRyaXZlciA9IChQQ0ZfRHJpdmVyKW1vZHVsZTsKLQotCi0gICAgZHJpdmVyLT5ub19sb25nX2ZhbWlseV9uYW1lcyA9IDA7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHBjZl9kcml2ZXJfZG9uZSggRlRfTW9kdWxlICBtb2R1bGUgKSAgICAgIC8qIFBDRl9Ecml2ZXIgKi8KLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgIHBjZl9kcml2ZXJfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICAgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX05PX09VVExJTkVTLAotCi0gICAgICBzaXplb2YgKCBQQ0ZfRHJpdmVyUmVjICksCi0gICAgICAicGNmIiwKLSAgICAgIDB4MTAwMDBMLAotICAgICAgMHgyMDAwMEwsCi0KLSAgICAgIE5VTEwsICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICBwY2ZfZHJpdmVyX2luaXQsICAgICAgICAgIC8qIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgbW9kdWxlX2luaXQgICAqLwotICAgICAgcGNmX2RyaXZlcl9kb25lLCAgICAgICAgICAvKiBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgIG1vZHVsZV9kb25lICAgKi8KLSAgICAgIHBjZl9kcml2ZXJfcmVxdWVzdGVyICAgICAgLyogRlRfTW9kdWxlX1JlcXVlc3RlciAgICBnZXRfaW50ZXJmYWNlICovCi0gICAgfSwKLQotICAgIHNpemVvZiAoIFBDRl9GYWNlUmVjICksCi0gICAgc2l6ZW9mICggRlRfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIEZUX0dseXBoU2xvdFJlYyApLAotCi0gICAgUENGX0ZhY2VfSW5pdCwgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfSW5pdEZ1bmMgIGluaXRfZmFjZSAqLwotICAgIFBDRl9GYWNlX0RvbmUsICAgICAgICAgICAgICAvKiBGVF9GYWNlX0RvbmVGdW5jICBkb25lX2ZhY2UgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9Jbml0RnVuYyAgaW5pdF9zaXplICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX1NpemVfRG9uZUZ1bmMgIGRvbmVfc2l6ZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TbG90X0luaXRGdW5jICBpbml0X3Nsb3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2xvdF9Eb25lRnVuYyAgZG9uZV9zbG90ICovCi0KLSAgICBQQ0ZfR2x5cGhfTG9hZCwgICAgICAgICAgICAgLyogRlRfU2xvdF9Mb2FkRnVuYyAgbG9hZF9nbHlwaCAqLwotCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfR2V0S2VybmluZ0Z1bmMgICBnZXRfa2VybmluZyAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfRmFjZV9BdHRhY2hGdW5jICAgICAgIGF0dGFjaF9maWxlICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAgZ2V0X2FkdmFuY2VzICovCi0KLSAgICBQQ0ZfU2l6ZV9SZXF1ZXN0LCAgICAgICAgICAgLyogRlRfU2l6ZV9SZXF1ZXN0RnVuYyAgcmVxdWVzdF9zaXplICovCi0gICAgUENGX1NpemVfU2VsZWN0ICAgICAgICAgICAgIC8qIEZUX1NpemVfU2VsZWN0RnVuYyAgIHNlbGVjdF9zaXplICAqLwotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2Zkcml2ci5oIGIvc3JjL3BjZi9wY2Zkcml2ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQzMDQ5Li4wMDAwMDAwCi0tLSBhL3NyYy9wY2YvcGNmZHJpdnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qICBwY2Zkcml2ci5oCi0KLSAgICBGcmVlVHlwZSBmb250IGRyaXZlciBmb3IgcGNmIGZvbnRzCi0KLSAgQ29weXJpZ2h0IDIwMDAtMjAwMSwgMjAwMiBieQotICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotVEhFIFNPRlRXQVJFLgotKi8KLQotCi0jaWZuZGVmIFBDRkRSSVZSX0hfCi0jZGVmaW5lIFBDRkRSSVZSX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotI2Vycm9yICJ0aGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFBJQyB5ZXQiCi0jZW5kaWYKLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgKSAgcGNmX2RyaXZlcl9jbGFzczsKLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBQQ0ZEUklWUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2ZlcnJvci5oIGIvc3JjL3BjZi9wY2ZlcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGQ4ZWYyLi4wMDAwMDAwCi0tLSBhL3NyYy9wY2YvcGNmZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBjZmVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQQ0YgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgUENGIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgUENGRVJST1JfSF8KLSNkZWZpbmUgUENGRVJST1JfSF8KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBGVEVSUk9SU19IXwotCi0jdW5kZWYgIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgUENGX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9QQ0YKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIFBDRkVSUk9SX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcGNmL3BjZnJlYWQuYyBiL3NyYy9wY2YvcGNmcmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTIxNmIwLi4wMDAwMDAwCi0tLSBhL3NyYy9wY2YvcGNmcmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY2MyArMCwwIEBACi0vKiAgcGNmcmVhZC5jCi0KLSAgICBGcmVlVHlwZSBmb250IGRyaXZlciBmb3IgcGNmIGZvbnRzCi0KLSAgQ29weXJpZ2h0IDIwMDAtMjAxMCwgMjAxMi0yMDE0IGJ5Ci0gIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCi0qLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLSNpbmNsdWRlICJwY2YuaCIKLSNpbmNsdWRlICJwY2ZyZWFkLmgiCi0KLSNpbmNsdWRlICJwY2ZlcnJvci5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcGNmcmVhZAotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgIHRhYmxlTmFtZXNbXSA9Ci0gIHsKLSAgICAicHJvcGVydGllcyIsCi0gICAgImFjY2VsZXJhdG9ycyIsCi0gICAgIm1ldHJpY3MiLAotICAgICJiaXRtYXBzIiwKLSAgICAiaW5rIG1ldHJpY3MiLAotICAgICJlbmNvZGluZ3MiLAotICAgICJzd2lkdGhzIiwKLSAgICAiZ2x5cGggbmFtZXMiLAotICAgICJCREYgYWNjZWxlcmF0b3JzIgotICB9OwotI2VuZGlmCi0KLQotICBzdGF0aWMKLSAgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBjZl90b2NfaGVhZGVyW10gPQotICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFBDRl9Ub2NSZWMKLQotICAgIEZUX0ZSQU1FX1NUQVJUKCA4ICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSggdmVyc2lvbiApLAotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUoIGNvdW50ICksCi0gICAgRlRfRlJBTUVfRU5ECi0gIH07Ci0KLQotICBzdGF0aWMKLSAgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBjZl90YWJsZV9oZWFkZXJbXSA9Ci0gIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUENGX1RhYmxlUmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggMTYgICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSggdHlwZSApLAotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUoIGZvcm1hdCApLAotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUoIHNpemUgKSwgICAvKiByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgNCAqLwotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUoIG9mZnNldCApLAotICAgIEZUX0ZSQU1FX0VORAotICB9OwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBjZl9yZWFkX1RPQyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgUENGX0ZhY2UgICBmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgUENGX1RvYyAgICB0b2MgPSAmZmFjZS0+dG9jOwotICAgIFBDRl9UYWJsZSAgdGFibGVzOwotCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFKCBmYWNlICktPm1lbW9yeTsKLSAgICBGVF9VSW50ICAgIG47Ci0KLSAgICBGVF9VTG9uZyAgIHNpemU7Ci0KLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggcGNmX3RvY19oZWFkZXIsIHRvYyApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIGlmICggdG9jLT52ZXJzaW9uICE9IFBDRl9GSUxFX1ZFUlNJT04gfHwKLSAgICAgICAgIHRvYy0+Y291bnQgICA9PSAwICAgICAgICAgICAgICAgICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gICAgaWYgKCBzdHJlYW0tPnNpemUgPCAxNiApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgIC8qIHdlIG5lZWQgMTYgYnl0ZXMgcGVyIFRPQyBlbnRyeSwgKi8KLSAgICAvKiBhbmQgdGhlcmUgY2FuIGJlIG1vc3QgOSB0YWJsZXMgICovCi0gICAgaWYgKCB0b2MtPmNvdW50ID4gKCBzdHJlYW0tPnNpemUgPj4gNCApIHx8Ci0gICAgICAgICB0b2MtPmNvdW50ID4gOSAgICAgICAgICAgICAgICAgICAgICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTAoKCAicGNmX3JlYWRfVE9DOiBhZGp1c3RpbmcgbnVtYmVyIG9mIHRhYmxlcyIKLSAgICAgICAgICAgICAgICAgICIgKGZyb20gJWQgdG8gJWQpXG4iLAotICAgICAgICAgICAgICAgICAgdG9jLT5jb3VudCwKLSAgICAgICAgICAgICAgICAgIEZUX01JTiggc3RyZWFtLT5zaXplID4+IDQsIDkgKSApKTsKLSAgICAgIHRvYy0+Y291bnQgPSBGVF9NSU4oIHN0cmVhbS0+c2l6ZSA+PiA0LCA5ICk7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGZhY2UtPnRvYy50YWJsZXMsIHRvYy0+Y291bnQgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICB0YWJsZXMgPSBmYWNlLT50b2MudGFibGVzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgdG9jLT5jb3VudDsgbisrICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggcGNmX3RhYmxlX2hlYWRlciwgdGFibGVzICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB0YWJsZXMrKzsKLSAgICB9Ci0KLSAgICAvKiBTb3J0IHRhYmxlcyBhbmQgY2hlY2sgZm9yIG92ZXJsYXBzLiAgQmVjYXVzZSB0aGV5IGFyZSBhbG1vc3QgICAgICAqLwotICAgIC8qIGFsd2F5cyBvcmRlcmVkIGFscmVhZHksIGFuIGluLXBsYWNlIGJ1YmJsZSBzb3J0IHdpdGggc2ltdWx0YW5lb3VzICovCi0gICAgLyogYm91bmRhcnkgY2hlY2tpbmcgc2VlbXMgYXBwcm9wcmlhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB0YWJsZXMgPSBmYWNlLT50b2MudGFibGVzOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCB0b2MtPmNvdW50IC0gMTsgbisrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBpLCBoYXZlX2NoYW5nZTsKLQotCi0gICAgICBoYXZlX2NoYW5nZSA9IDA7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgdG9jLT5jb3VudCAtIDEgLSBuOyBpKysgKQotICAgICAgewotICAgICAgICBQQ0ZfVGFibGVSZWMgIHRtcDsKLQotCi0gICAgICAgIGlmICggdGFibGVzW2ldLm9mZnNldCA+IHRhYmxlc1tpICsgMV0ub2Zmc2V0ICkKLSAgICAgICAgewotICAgICAgICAgIHRtcCAgICAgICAgICAgPSB0YWJsZXNbaV07Ci0gICAgICAgICAgdGFibGVzW2ldICAgICA9IHRhYmxlc1tpICsgMV07Ci0gICAgICAgICAgdGFibGVzW2kgKyAxXSA9IHRtcDsKLQotICAgICAgICAgIGhhdmVfY2hhbmdlID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKCB0YWJsZXNbaV0uc2l6ZSAgID4gdGFibGVzW2kgKyAxXS5vZmZzZXQgKSAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgKCB0YWJsZXNbaV0ub2Zmc2V0ID4gdGFibGVzW2kgKyAxXS5vZmZzZXQgLSB0YWJsZXNbaV0uc2l6ZSApICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfT2Zmc2V0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWhhdmVfY2hhbmdlICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgV2Ugbm93IGNoZWNrIHdoZXRoZXIgdGhlIGBzaXplJyBhbmQgYG9mZnNldCcgdmFsdWVzIGFyZSByZWFzb25hYmxlOgotICAgICAqICBgb2Zmc2V0JyArIGBzaXplJyBtdXN0IG5vdCBleGNlZWQgdGhlIHN0cmVhbSBzaXplLgotICAgICAqCi0gICAgICogIE5vdGUsIGhvd2V2ZXIsIHRoYXQgWDExJ3MgYHBjZldyaXRlRm9udCcgcm91dGluZSAodXNlZCBieSB0aGUKLSAgICAgKiAgYGJkZnRvcGNmJyBwcm9ncmFtIHRvIGNyZWF0ZSBQREYgZm9udCBmaWxlcykgaGFzIHR3byBzcGVjaWFsCi0gICAgICogIGZlYXR1cmVzLgotICAgICAqCi0gICAgICogIC0gSXQgYWx3YXlzIGFzc2lnbnMgdGhlIGFjY2VsZXJhdG9yIHRhYmxlIGEgc2l6ZSBvZiAxMDAgYnl0ZXMgaW4gdGhlCi0gICAgICogICAgVE9DLCByZWdhcmRsZXNzIG9mIGl0cyByZWFsIHNpemUsIHdoaWNoIGNhbiB2YXJ5IGJldHdlZW4gMzQgYW5kIDcyCi0gICAgICogICAgYnl0ZXMuCi0gICAgICoKLSAgICAgKiAgLSBEdWUgdG8gdGhlIHdheSB0aGUgcm91dGluZSBpcyBkZXNpZ25lZCwgaXQgc2hpcHMgb3V0IHRoZSBsYXN0IGZvbnQKLSAgICAgKiAgICB0YWJsZSB3aXRoIGl0cyByZWFsIHNpemUsIGlnbm9yaW5nIHRoZSBUT0MncyBzaXplIHZhbHVlLiAgU2luY2UKLSAgICAgKiAgICB0aGUgVE9DIHNpemUgdmFsdWVzIGFyZSBhbHdheXMgcm91bmRlZCB1cCB0byBhIG11bHRpcGxlIG9mIDQsIHRoZQotICAgICAqICAgIGRpZmZlcmVuY2UgY2FuIGJlIHVwIHRvIHRocmVlIGJ5dGVzIGZvciBhbGwgdGFibGVzIGV4Y2VwdCB0aGUKLSAgICAgKiAgICBhY2NlbGVyYXRvciB0YWJsZSwgZm9yIHdoaWNoIHRoZSBkaWZmZXJlbmNlIGNhbiBiZSBhcyBsYXJnZSBhcyA2NgotICAgICAqICAgIGJ5dGVzLgotICAgICAqCi0gICAgICovCi0KLSAgICB0YWJsZXMgPSBmYWNlLT50b2MudGFibGVzOwotICAgIHNpemUgICA9IHN0cmVhbS0+c2l6ZTsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgdG9jLT5jb3VudCAtIDE7IG4rKyApCi0gICAgewotICAgICAgLyogd2UgbmVlZCB0d28gY2hlY2tzIHRvIGF2b2lkIG92ZXJmbG93ICovCi0gICAgICBpZiAoICggdGFibGVzLT5zaXplICAgPiBzaXplICAgICAgICAgICAgICAgICkgfHwKLSAgICAgICAgICAgKCB0YWJsZXMtPm9mZnNldCA+IHNpemUgLSB0YWJsZXMtPnNpemUgKSApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgdGFibGVzKys7Ci0gICAgfQotCi0gICAgLyogb25seSBjaGVjayBgdGFibGVzLT5vZmZzZXQnIGZvciBsYXN0IHRhYmxlIGVsZW1lbnQgLi4uICovCi0gICAgaWYgKCAoIHRhYmxlcy0+b2Zmc2V0ID4gc2l6ZSApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIC8qIC4uLiBhbmQgYWRqdXN0IGB0YWJsZXMtPnNpemUnIHRvIHRoZSByZWFsIHZhbHVlIGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmICggdGFibGVzLT5zaXplID4gc2l6ZSAtIHRhYmxlcy0+b2Zmc2V0ICkKLSAgICAgIHRhYmxlcy0+c2l6ZSA9IHNpemUgLSB0YWJsZXMtPm9mZnNldDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICAgaSwgajsKLSAgICAgIGNvbnN0IGNoYXIqICBuYW1lID0gIj8iOwotCi0KLSAgICAgIEZUX1RSQUNFNCgoICJwY2ZfcmVhZF9UT0M6XG4iICkpOwotCi0gICAgICBGVF9UUkFDRTQoKCAiICBudW1iZXIgb2YgdGFibGVzOiAlbGRcbiIsIGZhY2UtPnRvYy5jb3VudCApKTsKLQotICAgICAgdGFibGVzID0gZmFjZS0+dG9jLnRhYmxlczsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgdG9jLT5jb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBzaXplb2YgKCB0YWJsZU5hbWVzICkgLyBzaXplb2YgKCB0YWJsZU5hbWVzWzBdICk7Ci0gICAgICAgICAgICAgIGorKyApCi0gICAgICAgICAgaWYgKCB0YWJsZXNbaV0udHlwZSA9PSAoRlRfVUludCkoIDEgPDwgaiApICkKLSAgICAgICAgICAgIG5hbWUgPSB0YWJsZU5hbWVzW2pdOwotCi0gICAgICAgIEZUX1RSQUNFNCgoICIgICVkOiB0eXBlPSVzLCBmb3JtYXQ9MHglWCwiCi0gICAgICAgICAgICAgICAgICAgICIgc2l6ZT0lbGQgKDB4JWxYKSwgb2Zmc2V0PSVsZCAoMHglbFgpXG4iLAotICAgICAgICAgICAgICAgICAgICBpLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICB0YWJsZXNbaV0uZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICB0YWJsZXNbaV0uc2l6ZSwgdGFibGVzW2ldLnNpemUsCi0gICAgICAgICAgICAgICAgICAgIHRhYmxlc1tpXS5vZmZzZXQsIHRhYmxlc1tpXS5vZmZzZXQgKSk7Ci0gICAgICB9Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgRXhpdDoKLSAgICBGVF9GUkVFKCBmYWNlLT50b2MudGFibGVzICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2RlZmluZSBQQ0ZfTUVUUklDX1NJWkUgIDEyCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBwY2ZfbWV0cmljX2hlYWRlcltdID0KLSAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBQQ0ZfTWV0cmljUmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggUENGX01FVFJJQ19TSVpFICksCi0gICAgICBGVF9GUkFNRV9TSE9SVF9MRSggbGVmdFNpZGVCZWFyaW5nICksCi0gICAgICBGVF9GUkFNRV9TSE9SVF9MRSggcmlnaHRTaWRlQmVhcmluZyApLAotICAgICAgRlRfRlJBTUVfU0hPUlRfTEUoIGNoYXJhY3RlcldpZHRoICksCi0gICAgICBGVF9GUkFNRV9TSE9SVF9MRSggYXNjZW50ICksCi0gICAgICBGVF9GUkFNRV9TSE9SVF9MRSggZGVzY2VudCApLAotICAgICAgRlRfRlJBTUVfU0hPUlRfTEUoIGF0dHJpYnV0ZXMgKSwKLSAgICBGVF9GUkFNRV9FTkQKLSAgfTsKLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9GcmFtZV9GaWVsZCAgcGNmX21ldHJpY19tc2JfaGVhZGVyW10gPQotICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFBDRl9NZXRyaWNSZWMKLQotICAgIEZUX0ZSQU1FX1NUQVJUKCBQQ0ZfTUVUUklDX1NJWkUgKSwKLSAgICAgIEZUX0ZSQU1FX1NIT1JUKCBsZWZ0U2lkZUJlYXJpbmcgKSwKLSAgICAgIEZUX0ZSQU1FX1NIT1JUKCByaWdodFNpZGVCZWFyaW5nICksCi0gICAgICBGVF9GUkFNRV9TSE9SVCggY2hhcmFjdGVyV2lkdGggKSwKLSAgICAgIEZUX0ZSQU1FX1NIT1JUKCBhc2NlbnQgKSwKLSAgICAgIEZUX0ZSQU1FX1NIT1JUKCBkZXNjZW50ICksCi0gICAgICBGVF9GUkFNRV9TSE9SVCggYXR0cmlidXRlcyApLAotICAgIEZUX0ZSQU1FX0VORAotICB9OwotCi0KLSNkZWZpbmUgUENGX0NPTVBSRVNTRURfTUVUUklDX1NJWkUgIDUKLQotICBzdGF0aWMKLSAgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBjZl9jb21wcmVzc2VkX21ldHJpY19oZWFkZXJbXSA9Ci0gIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUENGX0NvbXByZXNzZWRfTWV0cmljUmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggUENGX0NPTVBSRVNTRURfTUVUUklDX1NJWkUgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUoIGxlZnRTaWRlQmVhcmluZyApLAotICAgICAgRlRfRlJBTUVfQllURSggcmlnaHRTaWRlQmVhcmluZyApLAotICAgICAgRlRfRlJBTUVfQllURSggY2hhcmFjdGVyV2lkdGggKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUoIGFzY2VudCApLAotICAgICAgRlRfRlJBTUVfQllURSggZGVzY2VudCApLAotICAgIEZUX0ZSQU1FX0VORAotICB9OwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBjZl9nZXRfbWV0cmljKCBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBQQ0ZfTWV0cmljICBtZXRyaWMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIFBDRl9GT1JNQVRfTUFUQ0goIGZvcm1hdCwgUENGX0RFRkFVTFRfRk9STUFUICkgKQotICAgIHsKLSAgICAgIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkKiAgZmllbGRzOwotCi0KLSAgICAgIC8qIHBhcnNpbmcgbm9ybWFsIG1ldHJpY3MgKi8KLSAgICAgIGZpZWxkcyA9ICggUENGX0JZVEVfT1JERVIoIGZvcm1hdCApID09IE1TQkZpcnN0ICkKLSAgICAgICAgICAgICAgID8gcGNmX21ldHJpY19tc2JfaGVhZGVyCi0gICAgICAgICAgICAgICA6IHBjZl9tZXRyaWNfaGVhZGVyOwotCi0gICAgICAvKiB0aGUgZm9sbG93aW5nIHNldHMgYGVycm9yJyBidXQgZG9lc24ndCByZXR1cm4gaW4gY2FzZSBvZiBmYWlsdXJlICovCi0gICAgICAodm9pZClGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIGZpZWxkcywgbWV0cmljICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBQQ0ZfQ29tcHJlc3NlZF9NZXRyaWNSZWMgIGNvbXByOwotCi0KLSAgICAgIC8qIHBhcnNpbmcgY29tcHJlc3NlZCBtZXRyaWNzICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggcGNmX2NvbXByZXNzZWRfbWV0cmljX2hlYWRlciwgJmNvbXByICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIG1ldHJpYy0+bGVmdFNpZGVCZWFyaW5nICA9IChGVF9TaG9ydCkoIGNvbXByLmxlZnRTaWRlQmVhcmluZyAgLSAweDgwICk7Ci0gICAgICBtZXRyaWMtPnJpZ2h0U2lkZUJlYXJpbmcgPSAoRlRfU2hvcnQpKCBjb21wci5yaWdodFNpZGVCZWFyaW5nIC0gMHg4MCApOwotICAgICAgbWV0cmljLT5jaGFyYWN0ZXJXaWR0aCAgID0gKEZUX1Nob3J0KSggY29tcHIuY2hhcmFjdGVyV2lkdGggICAtIDB4ODAgKTsKLSAgICAgIG1ldHJpYy0+YXNjZW50ICAgICAgICAgICA9IChGVF9TaG9ydCkoIGNvbXByLmFzY2VudCAgICAgICAgICAgLSAweDgwICk7Ci0gICAgICBtZXRyaWMtPmRlc2NlbnQgICAgICAgICAgPSAoRlRfU2hvcnQpKCBjb21wci5kZXNjZW50ICAgICAgICAgIC0gMHg4MCApOwotICAgICAgbWV0cmljLT5hdHRyaWJ1dGVzICAgICAgID0gMDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTUoKCAiIHdpZHRoPSVkLCIKLSAgICAgICAgICAgICAgICAiIGxzYj0lZCwgcnNiPSVkLCIKLSAgICAgICAgICAgICAgICAiIGFzY2VudD0lZCwgZGVzY2VudD0lZCwiCi0gICAgICAgICAgICAgICAgIiBhdHRyaWJ1dGVzPSVkXG4iLAotICAgICAgICAgICAgICAgIG1ldHJpYy0+Y2hhcmFjdGVyV2lkdGgsCi0gICAgICAgICAgICAgICAgbWV0cmljLT5sZWZ0U2lkZUJlYXJpbmcsCi0gICAgICAgICAgICAgICAgbWV0cmljLT5yaWdodFNpZGVCZWFyaW5nLAotICAgICAgICAgICAgICAgIG1ldHJpYy0+YXNjZW50LAotICAgICAgICAgICAgICAgIG1ldHJpYy0+ZGVzY2VudCwKLSAgICAgICAgICAgICAgICBtZXRyaWMtPmF0dHJpYnV0ZXMgKSk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwY2Zfc2Vla190b190YWJsZV90eXBlKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUENGX1RhYmxlICB0YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgbnRhYmxlcywgLyogc2FtZSBhcyBQQ0ZfVG9jLT5jb3VudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqYWZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICphc2l6ZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICBGVF9VTG9uZyAgaTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBudGFibGVzOyBpKysgKQotICAgICAgaWYgKCB0YWJsZXNbaV0udHlwZSA9PSB0eXBlICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzdHJlYW0tPnBvcyA+IHRhYmxlc1tpXS5vZmZzZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fU2tpcCApOwotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIHRhYmxlc1tpXS5vZmZzZXQgLSBzdHJlYW0tPnBvcyApICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX1NraXAgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICAqYXNpemUgICA9IHRhYmxlc1tpXS5zaXplOwotICAgICAgICAqYWZvcm1hdCA9IHRhYmxlc1tpXS5mb3JtYXQ7Ci0KLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgIH0KLQotICBGYWlsOgotICAgICphc2l6ZSA9IDA7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBwY2ZfaGFzX3RhYmxlX3R5cGUoIFBDRl9UYWJsZSAgdGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgbnRhYmxlcywgLyogc2FtZSBhcyBQQ0ZfVG9jLT5jb3VudCAqLwotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdHlwZSApCi0gIHsKLSAgICBGVF9VTG9uZyAgaTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBudGFibGVzOyBpKysgKQotICAgICAgaWYgKCB0YWJsZXNbaV0udHlwZSA9PSB0eXBlICkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotCi0jZGVmaW5lIFBDRl9QUk9QRVJUWV9TSVpFICA5Ci0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBwY2ZfcHJvcGVydHlfaGVhZGVyW10gPQotICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFBDRl9QYXJzZVByb3BlcnR5UmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggUENGX1BST1BFUlRZX1NJWkUgKSwKLSAgICAgIEZUX0ZSQU1FX0xPTkdfTEUoIG5hbWUgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAoIGlzU3RyaW5nICksCi0gICAgICBGVF9GUkFNRV9MT05HX0xFKCB2YWx1ZSApLAotICAgIEZUX0ZSQU1FX0VORAotICB9OwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBwY2ZfcHJvcGVydHlfbXNiX2hlYWRlcltdID0KLSAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBQQ0ZfUGFyc2VQcm9wZXJ0eVJlYwotCi0gICAgRlRfRlJBTUVfU1RBUlQoIFBDRl9QUk9QRVJUWV9TSVpFICksCi0gICAgICBGVF9GUkFNRV9MT05HKCBuYW1lICksCi0gICAgICBGVF9GUkFNRV9CWVRFKCBpc1N0cmluZyApLAotICAgICAgRlRfRlJBTUVfTE9ORyggdmFsdWUgKSwKLSAgICBGVF9GUkFNRV9FTkQKLSAgfTsKLQotCi0gIEZUX0xPQ0FMX0RFRiggUENGX1Byb3BlcnR5ICkKLSAgcGNmX2ZpbmRfcHJvcGVydHkoIFBDRl9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBwcm9wICkKLSAgewotICAgIFBDRl9Qcm9wZXJ0eSAgcHJvcGVydGllcyA9IGZhY2UtPnByb3BlcnRpZXM7Ci0gICAgRlRfQm9vbCAgICAgICBmb3VuZCAgICAgID0gMDsKLSAgICBpbnQgICAgICAgICAgIGk7Ci0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZS0+bnByb3BzICYmICFmb3VuZDsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnRpZXNbaV0ubmFtZSwgcHJvcCApICkKLSAgICAgICAgZm91bmQgPSAxOwotICAgIH0KLQotICAgIGlmICggZm91bmQgKQotICAgICAgcmV0dXJuIHByb3BlcnRpZXMgKyBpIC0gMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBjZl9nZXRfcHJvcGVydGllcyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgUENGX0ZhY2UgICBmYWNlICkKLSAgewotICAgIFBDRl9QYXJzZVByb3BlcnR5ICBwcm9wcyAgICAgID0gTlVMTDsKLSAgICBQQ0ZfUHJvcGVydHkgICAgICAgcHJvcGVydGllcyA9IE5VTEw7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgIG5wcm9wcywgb3JpZ19ucHJvcHMsIGk7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgIGZvcm1hdCwgc2l6ZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgPSBGVF9GQUNFKCBmYWNlICktPm1lbW9yeTsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgc3RyaW5nX3NpemU7Ci0gICAgRlRfU3RyaW5nKiAgICAgICAgIHN0cmluZ3MgICAgPSBOVUxMOwotCi0KLSAgICBlcnJvciA9IHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnRvYy50YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50b2MuY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0ZfUFJPUEVSVElFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBCYWlsOwotCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HX0xFKCBmb3JtYXQgKSApCi0gICAgICBnb3RvIEJhaWw7Ci0KLSAgICBGVF9UUkFDRTQoKCAicGNmX2dldF9wcm9wZXJ0aWVzOlxuIgotICAgICAgICAgICAgICAgICIgIGZvcm1hdDogMHglbFggKCVzKVxuIiwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgUENGX0JZVEVfT1JERVIoIGZvcm1hdCApID09IE1TQkZpcnN0ID8gIk1TQiIgOiAiTFNCIiApKTsKLQotICAgIGlmICggIVBDRl9GT1JNQVRfTUFUQ0goIGZvcm1hdCwgUENGX0RFRkFVTFRfRk9STUFUICkgKQotICAgICAgZ290byBCYWlsOwotCi0gICAgaWYgKCBQQ0ZfQllURV9PUkRFUiggZm9ybWF0ICkgPT0gTVNCRmlyc3QgKQotICAgICAgKHZvaWQpRlRfUkVBRF9VTE9ORyggb3JpZ19ucHJvcHMgKTsKLSAgICBlbHNlCi0gICAgICAodm9pZClGVF9SRUFEX1VMT05HX0xFKCBvcmlnX25wcm9wcyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBCYWlsOwotCi0gICAgRlRfVFJBQ0U0KCggIiAgbnVtYmVyIG9mIHByb3BlcnRpZXM6ICVsZFxuIiwgb3JpZ19ucHJvcHMgKSk7Ci0KLSAgICAvKiByb3VnaCBlc3RpbWF0ZSAqLwotICAgIGlmICggb3JpZ19ucHJvcHMgPiBzaXplIC8gUENGX1BST1BFUlRZX1NJWkUgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgIGdvdG8gQmFpbDsKLSAgICB9Ci0KLSAgICAvKiBhcyBhIGhldXJpc3RpYyBsaW1pdCB0byBhdm9pZCBleGNlc3NpdmUgYWxsb2NhdGlvbiBpbiAqLwotICAgIC8qIGd6aXAgYm9tYnMgKGkuZS4sIHZlcnkgc21hbGwsIGludmFsaWQgaW5wdXQgZGF0YSB0aGF0ICovCi0gICAgLyogcHJldGVuZHMgdG8gZXhwYW5kIHRvIGFuIGluc2FuZWx5IGxhcmdlIGZpbGUpIHdlIG9ubHkgKi8KLSAgICAvKiBsb2FkIHRoZSBmaXJzdCAyNTYgcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggb3JpZ19ucHJvcHMgPiAyNTYgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X3Byb3BlcnRpZXM6IgotICAgICAgICAgICAgICAgICAgIiBvbmx5IGxvYWRpbmcgZmlyc3QgMjU2IHByb3BlcnRpZXNcbiIgKSk7Ci0gICAgICBucHJvcHMgPSAyNTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIG5wcm9wcyA9IG9yaWdfbnByb3BzOwotCi0gICAgZmFjZS0+bnByb3BzID0gKGludClucHJvcHM7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggcHJvcHMsIG5wcm9wcyApICkKLSAgICAgIGdvdG8gQmFpbDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbnByb3BzOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggUENGX0JZVEVfT1JERVIoIGZvcm1hdCApID09IE1TQkZpcnN0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHBjZl9wcm9wZXJ0eV9tc2JfaGVhZGVyLCBwcm9wcyArIGkgKSApCi0gICAgICAgICAgZ290byBCYWlsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggcGNmX3Byb3BlcnR5X2hlYWRlciwgcHJvcHMgKyBpICkgKQotICAgICAgICAgIGdvdG8gQmFpbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB0aGlzIHNraXAgd2lsbCBvbmx5IHdvcmsgaWYgd2UgcmVhbGx5IGhhdmUgYW4gZXh0cmVtZWx5IGxhcmdlICovCi0gICAgLyogbnVtYmVyIG9mIHByb3BlcnRpZXM7IGl0IHdpbGwgZmFpbCBmb3IgZmFrZSBkYXRhLCBhdm9pZGluZyBhbiAqLwotICAgIC8qIHVubmVjZXNzYXJpbHkgbGFyZ2UgYWxsb2NhdGlvbiBsYXRlciBvbiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCAoIG9yaWdfbnByb3BzIC0gbnByb3BzICkgKiBQQ0ZfUFJPUEVSVFlfU0laRSApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9Ta2lwICk7Ci0gICAgICBnb3RvIEJhaWw7Ci0gICAgfQotCi0gICAgLyogcGFkIHRoZSBwcm9wZXJ0eSBhcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIGNsZXZlciBoZXJlIC0gbnByb3BzIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2Ygb2RkLXVuaXRzIHJlYWQsICovCi0gICAgLyogYXMgb25seSBpc1N0cmluZ1Byb3AgYXJlIG9kZCBsZW5ndGggICAoS2VpdGggUGFja2FyZCkgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggb3JpZ19ucHJvcHMgJiAzICkKLSAgICB7Ci0gICAgICBpID0gNCAtICggb3JpZ19ucHJvcHMgJiAzICk7Ci0gICAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCBpICkgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9Ta2lwICk7Ci0gICAgICAgIGdvdG8gQmFpbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCApCi0gICAgICAodm9pZClGVF9SRUFEX1VMT05HKCBzdHJpbmdfc2l6ZSApOwotICAgIGVsc2UKLSAgICAgICh2b2lkKUZUX1JFQURfVUxPTkdfTEUoIHN0cmluZ19zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEJhaWw7Ci0KLSAgICBGVF9UUkFDRTQoKCAiICBzdHJpbmcgc2l6ZTogJWxkXG4iLCBzdHJpbmdfc2l6ZSApKTsKLQotICAgIC8qIHJvdWdoIGVzdGltYXRlICovCi0gICAgaWYgKCBzdHJpbmdfc2l6ZSA+IHNpemUgLSBvcmlnX25wcm9wcyAqIFBDRl9QUk9QRVJUWV9TSVpFICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEJhaWw7Ci0gICAgfQotCi0gICAgLyogdGhlIHN0cmluZ3MgaW4gdGhlIGBzdHJpbmdzJyBhcnJheSBhcmUgUG9zdFNjcmlwdCBzdHJpbmdzLCAqLwotICAgIC8qIHdoaWNoIGNhbiBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgNjU1MzYgY2hhcmFjdGVycyBlYWNoICAgKi8KLSAgICBpZiAoIHN0cmluZ19zaXplID4gMTY3Nzc0NzIgKSAgIC8qIDI1NiAqICg2NTUzNiArIDEpICovCi0gICAgewotICAgICAgRlRfVFJBQ0UwKCggInBjZl9nZXRfcHJvcGVydGllczoiCi0gICAgICAgICAgICAgICAgICAiIGxvYWRpbmcgb25seSAxNjc3NzQ3MiBieXRlcyBvZiBzdHJpbmdzIGFycmF5XG4iICkpOwotICAgICAgc3RyaW5nX3NpemUgPSAxNjc3NzQ3MjsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBvbmUgbW9yZSBieXRlIHNvIHRoYXQgd2UgaGF2ZSBhIGZpbmFsIG51bGwgYnl0ZSAqLwotICAgIGlmICggRlRfTkVXX0FSUkFZKCBzdHJpbmdzLCBzdHJpbmdfc2l6ZSArIDEgKSApCi0gICAgICBnb3RvIEJhaWw7Ci0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIChGVF9CeXRlKilzdHJpbmdzLCBzdHJpbmdfc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBCYWlsOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHByb3BlcnRpZXMsIG5wcm9wcyApICkKLSAgICAgIGdvdG8gQmFpbDsKLQotICAgIGZhY2UtPnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotCi0gICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgICBmb3IgKCBpID0gMDsgaSA8IG5wcm9wczsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICBuYW1lX29mZnNldCA9IHByb3BzW2ldLm5hbWU7Ci0KLQotICAgICAgaWYgKCAoIG5hbWVfb2Zmc2V0IDwgMCApICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgKCAoRlRfVUxvbmcpbmFtZV9vZmZzZXQgPiBzdHJpbmdfc2l6ZSApICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9PZmZzZXQgKTsKLSAgICAgICAgZ290byBCYWlsOwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX1NUUkRVUCggcHJvcGVydGllc1tpXS5uYW1lLCBzdHJpbmdzICsgbmFtZV9vZmZzZXQgKSApCi0gICAgICAgIGdvdG8gQmFpbDsKLQotICAgICAgRlRfVFJBQ0U0KCggIiAgJXM6IiwgcHJvcGVydGllc1tpXS5uYW1lICkpOwotCi0gICAgICBwcm9wZXJ0aWVzW2ldLmlzU3RyaW5nID0gcHJvcHNbaV0uaXNTdHJpbmc7Ci0KLSAgICAgIGlmICggcHJvcHNbaV0uaXNTdHJpbmcgKQotICAgICAgewotICAgICAgICBGVF9Mb25nICB2YWx1ZV9vZmZzZXQgPSBwcm9wc1tpXS52YWx1ZTsKLQotCi0gICAgICAgIGlmICggKCB2YWx1ZV9vZmZzZXQgPCAwICkgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICggKEZUX1VMb25nKXZhbHVlX29mZnNldCA+IHN0cmluZ19zaXplICkgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9PZmZzZXQgKTsKLSAgICAgICAgICBnb3RvIEJhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIEZUX1NUUkRVUCggcHJvcGVydGllc1tpXS52YWx1ZS5hdG9tLCBzdHJpbmdzICsgdmFsdWVfb2Zmc2V0ICkgKQotICAgICAgICAgIGdvdG8gQmFpbDsKLQotICAgICAgICBGVF9UUkFDRTQoKCAiIGAlcydcbiIsIHByb3BlcnRpZXNbaV0udmFsdWUuYXRvbSApKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydGllc1tpXS52YWx1ZS5sID0gcHJvcHNbaV0udmFsdWU7Ci0KLSAgICAgICAgRlRfVFJBQ0U0KCggIiAlZFxuIiwgcHJvcGVydGllc1tpXS52YWx1ZS5sICkpOwotICAgICAgfQotICAgIH0KLQotICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gIEJhaWw6Ci0gICAgRlRfRlJFRSggcHJvcHMgKTsKLSAgICBGVF9GUkVFKCBzdHJpbmdzICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwY2ZfZ2V0X21ldHJpY3MoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIFBDRl9GYWNlICAgZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgID0gRlRfRkFDRSggZmFjZSApLT5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgZm9ybWF0LCBzaXplOwotICAgIFBDRl9NZXRyaWMgIG1ldHJpY3MgPSBOVUxMOwotICAgIEZUX1VMb25nICAgIG5tZXRyaWNzLCBvcmlnX25tZXRyaWNzLCBpOwotCi0KLSAgICBlcnJvciA9IHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnRvYy50YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50b2MuY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0ZfTUVUUklDUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HX0xFKCBmb3JtYXQgKSApCi0gICAgICBnb3RvIEJhaWw7Ci0KLSAgICBGVF9UUkFDRTQoKCAicGNmX2dldF9tZXRyaWNzOlxuIgotICAgICAgICAgICAgICAgICIgIGZvcm1hdDogMHglbFggKCVzLCAlcylcbiIsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCA/ICJNU0IiIDogIkxTQiIsCi0gICAgICAgICAgICAgICAgUENGX0ZPUk1BVF9NQVRDSCggZm9ybWF0LCBQQ0ZfQ09NUFJFU1NFRF9NRVRSSUNTICkgPwotICAgICAgICAgICAgICAgICAgImNvbXByZXNzZWQiIDogInVuY29tcHJlc3NlZCIgKSk7Ci0KLSAgICBpZiAoICFQQ0ZfRk9STUFUX01BVENIKCBmb3JtYXQsIFBDRl9ERUZBVUxUX0ZPUk1BVCApICAgICAmJgotICAgICAgICAgIVBDRl9GT1JNQVRfTUFUQ0goIGZvcm1hdCwgUENGX0NPTVBSRVNTRURfTUVUUklDUyApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gICAgaWYgKCBQQ0ZfRk9STUFUX01BVENIKCBmb3JtYXQsIFBDRl9ERUZBVUxUX0ZPUk1BVCApICkKLSAgICB7Ci0gICAgICBpZiAoIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCApCi0gICAgICAgICh2b2lkKUZUX1JFQURfVUxPTkcoIG9yaWdfbm1ldHJpY3MgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgKHZvaWQpRlRfUkVBRF9VTE9OR19MRSggb3JpZ19ubWV0cmljcyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBQQ0ZfQllURV9PUkRFUiggZm9ybWF0ICkgPT0gTVNCRmlyc3QgKQotICAgICAgICAodm9pZClGVF9SRUFEX1VTSE9SVCggb3JpZ19ubWV0cmljcyApOwotICAgICAgZWxzZQotICAgICAgICAodm9pZClGVF9SRUFEX1VTSE9SVF9MRSggb3JpZ19ubWV0cmljcyApOwotICAgIH0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gICAgRlRfVFJBQ0U0KCggIiAgbnVtYmVyIG9mIG1ldHJpY3M6ICVsZFxuIiwgb3JpZ19ubWV0cmljcyApKTsKLQotICAgIC8qIHJvdWdoIGVzdGltYXRlICovCi0gICAgaWYgKCBQQ0ZfRk9STUFUX01BVENIKCBmb3JtYXQsIFBDRl9ERUZBVUxUX0ZPUk1BVCApICkKLSAgICB7Ci0gICAgICBpZiAoIG9yaWdfbm1ldHJpY3MgPiBzaXplIC8gUENGX01FVFJJQ19TSVpFICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIG9yaWdfbm1ldHJpY3MgPiBzaXplIC8gUENGX0NPTVBSRVNTRURfTUVUUklDX1NJWkUgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFvcmlnX25tZXRyaWNzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotCi0gICAgLyogUENGIGlzIGEgZm9ybWF0IGZyb20gYW5jaWVudCB0aW1lczsgVW5pY29kZSB3YXMgaW4gaXRzICAgICAgICovCi0gICAgLyogaW5mYW5jeSwgYW5kIHdpZGVseSB1c2VkIHR3by1ieXRlIGNoYXJhY3RlciBzZXRzIGZvciBDSksgICAgICovCi0gICAgLyogc2NyaXB0cyAoQmlnIDUsIEdCIDIzMTIsIEpJUyBYIDAyMDgsIGV0Yy4pIGRpZCBoYXZlIGF0IG1vc3QgICovCi0gICAgLyogMTUwMDAgY2hhcmFjdGVycy4gIEV2ZW4gdGhlIG1vcmUgZXhvdGljIENOUyAxMTY0MyBhbmQgQ0NDSUkgICovCi0gICAgLyogc3RhbmRhcmRzLCB3aGljaCB3ZXJlIGVzc2VudGlhbGx5IHRocmVlLWJ5dGUgY2hhcmFjdGVyIHNldHMsICovCi0gICAgLyogcHJvdmlkZWQgbGVzcyB0aGVuIDY1NTM2IGFzc2lnbmVkIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2hpbGUgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8gaGF2ZSBhIGxhcmdlciBudW1iZXIgb2YgZ2x5cGhzICovCi0gICAgLyogaW4gUENGIGZpbGVzLCB3ZSB0aHVzIGxpbWl0IHRoZSBudW1iZXIgdG8gNjU1MzYuICAgICAgICAgICAgICovCi0gICAgaWYgKCBvcmlnX25tZXRyaWNzID4gNjU1MzYgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X21ldHJpY3M6IgotICAgICAgICAgICAgICAgICAgIiBvbmx5IGxvYWRpbmcgZmlyc3QgNjU1MzYgbWV0cmljc1xuIiApKTsKLSAgICAgIG5tZXRyaWNzID0gNjU1MzY7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIG5tZXRyaWNzID0gb3JpZ19ubWV0cmljczsKLQotICAgIGZhY2UtPm5tZXRyaWNzID0gbm1ldHJpY3M7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggZmFjZS0+bWV0cmljcywgbm1ldHJpY3MgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBtZXRyaWNzID0gZmFjZS0+bWV0cmljczsKLQotICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBubWV0cmljczsgaSsrLCBtZXRyaWNzKysgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNSgoICIgIGlkeCAlbGQ6IiwgaSApKTsKLSAgICAgIGVycm9yID0gcGNmX2dldF9tZXRyaWMoIHN0cmVhbSwgZm9ybWF0LCBtZXRyaWNzICk7Ci0KLSAgICAgIG1ldHJpY3MtPmJpdHMgPSAwOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHNhbml0eSBjaGVja3MgLS0gdGhvc2UgdmFsdWVzIGFyZSB1c2VkIGluIGBQQ0ZfR2x5cGhfTG9hZCcgdG8gICAgICovCi0gICAgICAvKiBjb21wdXRlIGEgZ2x5cGgncyBiaXRtYXAgZGltZW5zaW9ucywgdGh1cyBzZXR0aW5nIHRoZW0gdG8gemVybyBpbiAqLwotICAgICAgLyogY2FzZSBvZiBhbiBlcnJvciBkaXNhYmxlcyB0aGlzIHBhcnRpY3VsYXIgZ2x5cGggb25seSAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggbWV0cmljcy0+cmlnaHRTaWRlQmVhcmluZyA8IG1ldHJpY3MtPmxlZnRTaWRlQmVhcmluZyB8fAotICAgICAgICAgICBtZXRyaWNzLT5hc2NlbnQgPCAtbWV0cmljcy0+ZGVzY2VudCAgICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgbWV0cmljcy0+Y2hhcmFjdGVyV2lkdGggICA9IDA7Ci0gICAgICAgIG1ldHJpY3MtPmxlZnRTaWRlQmVhcmluZyAgPSAwOwotICAgICAgICBtZXRyaWNzLT5yaWdodFNpZGVCZWFyaW5nID0gMDsKLSAgICAgICAgbWV0cmljcy0+YXNjZW50ICAgICAgICAgICA9IDA7Ci0gICAgICAgIG1ldHJpY3MtPmRlc2NlbnQgICAgICAgICAgPSAwOwotCi0gICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X21ldHJpY3M6IgotICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgbWV0cmljcyBmb3IgZ2x5cGggJWRcbiIsIGkgKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9GUkVFKCBmYWNlLT5tZXRyaWNzICk7Ci0KLSAgQmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwY2ZfZ2V0X2JpdG1hcHMoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIFBDRl9GYWNlICAgZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ICA9IEZUX0ZBQ0UoIGZhY2UgKS0+bWVtb3J5OwotICAgIEZUX0xvbmcqICAgb2Zmc2V0cyA9IE5VTEw7Ci0gICAgRlRfTG9uZyAgICBiaXRtYXBTaXplc1tHTFlQSFBBRE9QVElPTlNdOwotICAgIEZUX1VMb25nICAgZm9ybWF0LCBzaXplOwotICAgIEZUX1VMb25nICAgbmJpdG1hcHMsIG9yaWdfbmJpdG1hcHMsIGksIHNpemViaXRtYXBzID0gMDsKLQotCi0gICAgZXJyb3IgPSBwY2Zfc2Vla190b190YWJsZV90eXBlKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50b2MudGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+dG9jLmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENGX0JJVE1BUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX0VudGVyRnJhbWUoIHN0cmVhbSwgOCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZm9ybWF0ID0gRlRfR0VUX1VMT05HX0xFKCk7Ci0gICAgaWYgKCBQQ0ZfQllURV9PUkRFUiggZm9ybWF0ICkgPT0gTVNCRmlyc3QgKQotICAgICAgb3JpZ19uYml0bWFwcyA9IEZUX0dFVF9VTE9ORygpOwotICAgIGVsc2UKLSAgICAgIG9yaWdfbmJpdG1hcHMgPSBGVF9HRVRfVUxPTkdfTEUoKTsKLQotICAgIEZUX1N0cmVhbV9FeGl0RnJhbWUoIHN0cmVhbSApOwotCi0gICAgRlRfVFJBQ0U0KCggInBjZl9nZXRfYml0bWFwczpcbiIKLSAgICAgICAgICAgICAgICAiICBmb3JtYXQ6IDB4JWxYXG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAoJXMsICVzLFxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgIHBhZGRpbmc9JWQgYml0cywgc2Nhbm5pbmc9JWQgYml0cylcbiIsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdAotICAgICAgICAgICAgICAgICAgPyAibW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IgotICAgICAgICAgICAgICAgICAgOiAibGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCIsCi0gICAgICAgICAgICAgICAgUENGX0JJVF9PUkRFUiggZm9ybWF0ICkgPT0gTVNCRmlyc3QKLSAgICAgICAgICAgICAgICAgID8gIm1vc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0IgotICAgICAgICAgICAgICAgICAgOiAibGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0IiwKLSAgICAgICAgICAgICAgICA4IDw8IFBDRl9HTFlQSF9QQURfSU5ERVgoIGZvcm1hdCApLAotICAgICAgICAgICAgICAgIDggPDwgUENGX1NDQU5fVU5JVF9JTkRFWCggZm9ybWF0ICkgKSk7Ci0KLSAgICBpZiAoICFQQ0ZfRk9STUFUX01BVENIKCBmb3JtYXQsIFBDRl9ERUZBVUxUX0ZPUk1BVCApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gICAgRlRfVFJBQ0U0KCggIiAgbnVtYmVyIG9mIGJpdG1hcHM6ICVsZFxuIiwgb3JpZ19uYml0bWFwcyApKTsKLQotICAgIC8qIHNlZSBjb21tZW50IGluIGBwY2ZfZ2V0X21ldHJpY3MnICovCi0gICAgaWYgKCBvcmlnX25iaXRtYXBzID4gNjU1MzYgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X2JpdG1hcHM6IgotICAgICAgICAgICAgICAgICAgIiBvbmx5IGxvYWRpbmcgZmlyc3QgNjU1MzYgYml0bWFwc1xuIiApKTsKLSAgICAgIG5iaXRtYXBzID0gNjU1MzY7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIG5iaXRtYXBzID0gb3JpZ19uYml0bWFwczsKLQotICAgIGlmICggbmJpdG1hcHMgIT0gZmFjZS0+bm1ldHJpY3MgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggb2Zmc2V0cywgbmJpdG1hcHMgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbmJpdG1hcHM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBQQ0ZfQllURV9PUkRFUiggZm9ybWF0ICkgPT0gTVNCRmlyc3QgKQotICAgICAgICAodm9pZClGVF9SRUFEX0xPTkcoIG9mZnNldHNbaV0gKTsKLSAgICAgIGVsc2UKLSAgICAgICAgKHZvaWQpRlRfUkVBRF9MT05HX0xFKCBvZmZzZXRzW2ldICk7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgIGJpdG1hcCAlbGQ6IG9mZnNldCAlbGQgKDB4JWxYKVxuIiwKLSAgICAgICAgICAgICAgICAgIGksIG9mZnNldHNbaV0sIG9mZnNldHNbaV0gKSk7Ci0gICAgfQotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBCYWlsOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBHTFlQSFBBRE9QVElPTlM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBQQ0ZfQllURV9PUkRFUiggZm9ybWF0ICkgPT0gTVNCRmlyc3QgKQotICAgICAgICAodm9pZClGVF9SRUFEX0xPTkcoIGJpdG1hcFNpemVzW2ldICk7Ci0gICAgICBlbHNlCi0gICAgICAgICh2b2lkKUZUX1JFQURfTE9OR19MRSggYml0bWFwU2l6ZXNbaV0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEJhaWw7Ci0KLSAgICAgIHNpemViaXRtYXBzID0gKEZUX1VMb25nKWJpdG1hcFNpemVzW1BDRl9HTFlQSF9QQURfSU5ERVgoIGZvcm1hdCApXTsKLQotICAgICAgRlRfVFJBQ0U0KCggIiAgJWxkLWJpdCBwYWRkaW5nIGltcGxpZXMgYSBzaXplIG9mICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgIDggPDwgaSwgYml0bWFwU2l6ZXNbaV0gKSk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U0KCggIiAgJWxkIGJpdG1hcHMsIHVzaW5nICVsZC1iaXQgcGFkZGluZ1xuIiwKLSAgICAgICAgICAgICAgICBuYml0bWFwcywKLSAgICAgICAgICAgICAgICA4IDw8IFBDRl9HTFlQSF9QQURfSU5ERVgoIGZvcm1hdCApICkpOwotICAgIEZUX1RSQUNFNCgoICIgIGJpdG1hcCBzaXplOiAlbGRcbiIsIHNpemViaXRtYXBzICkpOwotCi0gICAgRlRfVU5VU0VEKCBzaXplYml0bWFwcyApOyAgICAgICAvKiBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyAqLwotCi0gICAgLyogcmlnaHQgbm93LCB3ZSBvbmx5IGNoZWNrIHRoZSBiaXRtYXAgb2Zmc2V0czsgKi8KLSAgICAvKiBhY3R1YWwgYml0bWFwcyBhcmUgb25seSBsb2FkZWQgb24gZGVtYW5kICAgICAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgbmJpdG1hcHM7IGkrKyApCi0gICAgewotICAgICAgLyogcm91Z2ggZXN0aW1hdGUgKi8KLSAgICAgIGlmICggKCBvZmZzZXRzW2ldIDwgMCApICAgICAgICAgICAgICB8fAotICAgICAgICAgICAoIChGVF9VTG9uZylvZmZzZXRzW2ldID4gc2l6ZSApICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UwKCggInBjZl9nZXRfYml0bWFwczoiCi0gICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBvZmZzZXQgdG8gYml0bWFwIGRhdGEgb2YgZ2x5cGggJWxkXG4iLCBpICkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBmYWNlLT5tZXRyaWNzW2ldLmJpdHMgPSBzdHJlYW0tPnBvcyArIChGVF9VTG9uZylvZmZzZXRzW2ldOwotICAgIH0KLQotICAgIGZhY2UtPmJpdG1hcHNGb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgQmFpbDoKLSAgICBGVF9GUkVFKCBvZmZzZXRzICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGNmX2dldF9lbmNvZGluZ3MoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgUENGX0ZhY2UgICBmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBGVF9GQUNFKCBmYWNlICktPm1lbW9yeTsKLSAgICBGVF9VTG9uZyAgICAgIGZvcm1hdCwgc2l6ZTsKLSAgICBpbnQgICAgICAgICAgIGZpcnN0Q29sLCBsYXN0Q29sOwotICAgIGludCAgICAgICAgICAgZmlyc3RSb3csIGxhc3RSb3c7Ci0gICAgRlRfVUxvbmcgICAgICBuZW5jb2Rpbmc7Ci0gICAgRlRfVVNob3J0ICAgICBlbmNvZGluZ09mZnNldDsKLSAgICBpbnQgICAgICAgICAgIGksIGo7Ci0gICAgRlRfVUxvbmcgICAgICBrOwotICAgIFBDRl9FbmNvZGluZyAgZW5jb2RpbmcgPSBOVUxMOwotCi0KLSAgICBlcnJvciA9IHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnRvYy50YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50b2MuY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0ZfQkRGX0VOQ09ESU5HUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fRW50ZXJGcmFtZSggc3RyZWFtLCAxNCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZm9ybWF0ID0gRlRfR0VUX1VMT05HX0xFKCk7Ci0KLSAgICBpZiAoIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCApCi0gICAgewotICAgICAgZmlyc3RDb2wgICAgICAgICAgPSBGVF9HRVRfU0hPUlQoKTsKLSAgICAgIGxhc3RDb2wgICAgICAgICAgID0gRlRfR0VUX1NIT1JUKCk7Ci0gICAgICBmaXJzdFJvdyAgICAgICAgICA9IEZUX0dFVF9TSE9SVCgpOwotICAgICAgbGFzdFJvdyAgICAgICAgICAgPSBGVF9HRVRfU0hPUlQoKTsKLSAgICAgIGZhY2UtPmRlZmF1bHRDaGFyID0gRlRfR0VUX1NIT1JUKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmaXJzdENvbCAgICAgICAgICA9IEZUX0dFVF9TSE9SVF9MRSgpOwotICAgICAgbGFzdENvbCAgICAgICAgICAgPSBGVF9HRVRfU0hPUlRfTEUoKTsKLSAgICAgIGZpcnN0Um93ICAgICAgICAgID0gRlRfR0VUX1NIT1JUX0xFKCk7Ci0gICAgICBsYXN0Um93ICAgICAgICAgICA9IEZUX0dFVF9TSE9SVF9MRSgpOwotICAgICAgZmFjZS0+ZGVmYXVsdENoYXIgPSBGVF9HRVRfU0hPUlRfTEUoKTsKLSAgICB9Ci0KLSAgICBGVF9TdHJlYW1fRXhpdEZyYW1lKCBzdHJlYW0gKTsKLQotICAgIEZUX1RSQUNFNCgoICJwY2ZfZ2V0X2VuY29kaW5nczpcbiIKLSAgICAgICAgICAgICAgICAiICBmb3JtYXQ6IDB4JWxYICglcylcbiIsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCA/ICJNU0IiIDogIkxTQiIgKSk7Ci0KLSAgICBpZiAoICFQQ0ZfRk9STUFUX01BVENIKCBmb3JtYXQsIFBDRl9ERUZBVUxUX0ZPUk1BVCApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gICAgRlRfVFJBQ0U0KCggIiAgZmlyc3RDb2wgMHglWCwgbGFzdENvbCAweCVYXG4iCi0gICAgICAgICAgICAgICAgIiAgZmlyc3RSb3cgMHglWCwgbGFzdFJvdyAweCVYXG4iLAotICAgICAgICAgICAgICAgIGZpcnN0Q29sLCBsYXN0Q29sLAotICAgICAgICAgICAgICAgIGZpcnN0Um93LCBsYXN0Um93ICkpOwotCi0gICAgLyogc2FuaXR5IGNoZWNrczsgd2UgbGltaXQgbnVtYmVycyBvZiByb3dzIGFuZCBjb2x1bW5zIHRvIDI1NiAqLwotICAgIGlmICggZmlyc3RDb2wgPCAwICAgICAgIHx8Ci0gICAgICAgICBmaXJzdENvbCA+IGxhc3RDb2wgfHwKLSAgICAgICAgIGxhc3RDb2wgID4gMHhGRiAgICB8fAotICAgICAgICAgZmlyc3RSb3cgPCAwICAgICAgIHx8Ci0gICAgICAgICBmaXJzdFJvdyA+IGxhc3RSb3cgfHwKLSAgICAgICAgIGxhc3RSb3cgID4gMHhGRiAgICApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICAgIG5lbmNvZGluZyA9IChGVF9VTG9uZykoIGxhc3RDb2wgLSBmaXJzdENvbCArIDEgKSAqCi0gICAgICAgICAgICAgICAgKEZUX1VMb25nKSggbGFzdFJvdyAtIGZpcnN0Um93ICsgMSApOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGVuY29kaW5nLCBuZW5jb2RpbmcgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9FbnRlckZyYW1lKCBzdHJlYW0sIDIgKiBuZW5jb2RpbmcgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gQmFpbDsKLQotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgICBrID0gMDsKLSAgICBmb3IgKCBpID0gZmlyc3RSb3c7IGkgPD0gbGFzdFJvdzsgaSsrICkKLSAgICB7Ci0gICAgICBmb3IgKCBqID0gZmlyc3RDb2w7IGogPD0gbGFzdENvbDsgaisrICkKLSAgICAgIHsKLSAgICAgICAgLyogWDExJ3MgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGVxdWl2YWxlbnQgdG8gICovCi0gICAgICAgIC8qIGBGVF9HRVRfU0hPUlQnLCBob3dldmVyIFBDRiBmb250cyB3aXRoIG1vcmUgdGhhbiAzMjc2OCAqLwotICAgICAgICAvKiBjaGFyYWN0ZXJzIChlLmcuIGB1bmlmb250LnBjZicpIGNsZWFybHkgc2hvdyB0aGF0IGFuICAgKi8KLSAgICAgICAgLyogdW5zaWduZWQgdmFsdWUgaXMgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggUENGX0JZVEVfT1JERVIoIGZvcm1hdCApID09IE1TQkZpcnN0ICkKLSAgICAgICAgICBlbmNvZGluZ09mZnNldCA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGVuY29kaW5nT2Zmc2V0ID0gRlRfR0VUX1VTSE9SVF9MRSgpOwotCi0gICAgICAgIGlmICggZW5jb2RpbmdPZmZzZXQgIT0gMHhGRkZGVSApCi0gICAgICAgIHsKLSAgICAgICAgICBlbmNvZGluZ1trXS5lbmMgICA9IGkgKiAyNTYgKyBqOwotICAgICAgICAgIGVuY29kaW5nW2tdLmdseXBoID0gZW5jb2RpbmdPZmZzZXQ7Ci0KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBjb2RlICVkICgweCUwNFgpOiBpZHggJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmdba10uZW5jLCBlbmNvZGluZ1trXS5lbmMsIGVuY29kaW5nW2tdLmdseXBoICkpOwotCi0gICAgICAgICAgaysrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIEZUX1N0cmVhbV9FeGl0RnJhbWUoIHN0cmVhbSApOwotCi0gICAgaWYgKCBGVF9SRU5FV19BUlJBWSggZW5jb2RpbmcsIG5lbmNvZGluZywgayApICkKLSAgICAgIGdvdG8gQmFpbDsKLQotICAgIGZhY2UtPm5lbmNvZGluZ3MgPSBrOwotICAgIGZhY2UtPmVuY29kaW5ncyAgPSBlbmNvZGluZzsKLQotICAgIHJldHVybiBlcnJvcjsKLQotICBCYWlsOgotICAgIEZUX0ZSRUUoIGVuY29kaW5nICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMKLSAgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBjZl9hY2NlbF9oZWFkZXJbXSA9Ci0gIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUENGX0FjY2VsUmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggMjAgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICAoIG5vT3ZlcmxhcCApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgICggY29uc3RhbnRNZXRyaWNzICksCi0gICAgICBGVF9GUkFNRV9CWVRFICAgICAgKCB0ZXJtaW5hbEZvbnQgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICAoIGNvbnN0YW50V2lkdGggKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICAoIGlua0luc2lkZSApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgICggaW5rTWV0cmljcyApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgICggZHJhd0RpcmVjdGlvbiApLAotICAgICAgRlRfRlJBTUVfU0tJUF9CWVRFUyggMSApLAotICAgICAgRlRfRlJBTUVfTE9OR19MRSAgICggZm9udEFzY2VudCApLAotICAgICAgRlRfRlJBTUVfTE9OR19MRSAgICggZm9udERlc2NlbnQgKSwKLSAgICAgIEZUX0ZSQU1FX0xPTkdfTEUgICAoIG1heE92ZXJsYXAgKSwKLSAgICBGVF9GUkFNRV9FTkQKLSAgfTsKLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9GcmFtZV9GaWVsZCAgcGNmX2FjY2VsX21zYl9oZWFkZXJbXSA9Ci0gIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUENGX0FjY2VsUmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggMjAgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICAoIG5vT3ZlcmxhcCApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgICggY29uc3RhbnRNZXRyaWNzICksCi0gICAgICBGVF9GUkFNRV9CWVRFICAgICAgKCB0ZXJtaW5hbEZvbnQgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICAoIGNvbnN0YW50V2lkdGggKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICAoIGlua0luc2lkZSApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgICggaW5rTWV0cmljcyApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgICggZHJhd0RpcmVjdGlvbiApLAotICAgICAgRlRfRlJBTUVfU0tJUF9CWVRFUyggMSApLAotICAgICAgRlRfRlJBTUVfTE9ORyAgICAgICggZm9udEFzY2VudCApLAotICAgICAgRlRfRlJBTUVfTE9ORyAgICAgICggZm9udERlc2NlbnQgKSwKLSAgICAgIEZUX0ZSQU1FX0xPTkcgICAgICAoIG1heE92ZXJsYXAgKSwKLSAgICBGVF9GUkFNRV9FTkQKLSAgfTsKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwY2ZfZ2V0X2FjY2VsKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgUENGX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHR5cGUgKQotICB7Ci0gICAgRlRfVUxvbmcgICBmb3JtYXQsIHNpemU7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBQQ0ZfQWNjZWwgIGFjY2VsID0gJmZhY2UtPmFjY2VsOwotCi0KLSAgICBlcnJvciA9IHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnRvYy50YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50b2MuY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEJhaWw7Ci0KLSAgICBpZiAoIEZUX1JFQURfVUxPTkdfTEUoIGZvcm1hdCApICkKLSAgICAgIGdvdG8gQmFpbDsKLQotICAgIEZUX1RSQUNFNCgoICJwY2ZfZ2V0X2FjY2VsJXM6XG4iCi0gICAgICAgICAgICAgICAgIiAgZm9ybWF0OiAweCVsWCAoJXMsICVzKVxuIiwKLSAgICAgICAgICAgICAgICB0eXBlID09IFBDRl9CREZfQUNDRUxFUkFUT1JTID8gIiAoZ2V0dGluZyBCREYgYWNjZWxlcmF0b3JzKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiIsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCA/ICJNU0IiIDogIkxTQiIsCi0gICAgICAgICAgICAgICAgUENGX0ZPUk1BVF9NQVRDSCggZm9ybWF0LCBQQ0ZfQUNDRUxfV19JTktCT1VORFMgKSA/Ci0gICAgICAgICAgICAgICAgICAiYWNjZWxlcmF0ZWQiIDogIm5vdCBhY2NlbGVyYXRlZCIgKSk7Ci0KLSAgICBpZiAoICFQQ0ZfRk9STUFUX01BVENIKCBmb3JtYXQsIFBDRl9ERUZBVUxUX0ZPUk1BVCApICAgICYmCi0gICAgICAgICAhUENGX0ZPUk1BVF9NQVRDSCggZm9ybWF0LCBQQ0ZfQUNDRUxfV19JTktCT1VORFMgKSApCi0gICAgICBnb3RvIEJhaWw7Ci0KLSAgICBpZiAoIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCApCi0gICAgewotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHBjZl9hY2NlbF9tc2JfaGVhZGVyLCBhY2NlbCApICkKLSAgICAgICAgZ290byBCYWlsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHBjZl9hY2NlbF9oZWFkZXIsIGFjY2VsICkgKQotICAgICAgICBnb3RvIEJhaWw7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIiAgbm9PdmVybGFwPSVzLCBjb25zdGFudE1ldHJpY3M9JXMsIgotICAgICAgICAgICAgICAgICIgdGVybWluYWxGb250PSVzLCBjb25zdGFudFdpZHRoPSVzXG4iCi0gICAgICAgICAgICAgICAgIiAgaW5rSW5zaWRlPSVzLCBpbmtNZXRyaWNzPSVzLCBkcmF3RGlyZWN0aW9uPSVzXG4iCi0gICAgICAgICAgICAgICAgIiAgZm9udEFzY2VudD0lbGQsIGZvbnREZXNjZW50PSVsZCwgbWF4T3ZlcmxhcD0lbGRcbiIsCi0gICAgICAgICAgICAgICAgYWNjZWwtPm5vT3ZlcmxhcCA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgICAgICBhY2NlbC0+Y29uc3RhbnRNZXRyaWNzID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgICAgIGFjY2VsLT50ZXJtaW5hbEZvbnQgPyAieWVzIiA6ICJubyIsCi0gICAgICAgICAgICAgICAgYWNjZWwtPmNvbnN0YW50V2lkdGggPyAieWVzIiA6ICJubyIsCi0gICAgICAgICAgICAgICAgYWNjZWwtPmlua0luc2lkZSA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgICAgICBhY2NlbC0+aW5rTWV0cmljcyA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgICAgICBhY2NlbC0+ZHJhd0RpcmVjdGlvbiA/ICJSVEwiIDogIkxUUiIsCi0gICAgICAgICAgICAgICAgYWNjZWwtPmZvbnRBc2NlbnQsCi0gICAgICAgICAgICAgICAgYWNjZWwtPmZvbnREZXNjZW50LAotICAgICAgICAgICAgICAgIGFjY2VsLT5tYXhPdmVybGFwICkpOwotCi0gICAgLyogc2FuaXR5IGNoZWNrcyAqLwotICAgIGlmICggRlRfQUJTKCBhY2NlbC0+Zm9udEFzY2VudCApID4gMHg3RkZGICkKLSAgICB7Ci0gICAgICBhY2NlbC0+Zm9udEFzY2VudCA9IGFjY2VsLT5mb250QXNjZW50IDwgMCA/IC0weDdGRkYgOiAweDdGRkY7Ci0gICAgICBGVF9UUkFDRTAoKCAicGZjX2dldF9hY2NlbDogY2xhbXBpbmcgZm9udCBhc2NlbnQgdG8gdmFsdWUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICBhY2NlbC0+Zm9udEFzY2VudCApKTsKLSAgICB9Ci0gICAgaWYgKCBGVF9BQlMoIGFjY2VsLT5mb250RGVzY2VudCApID4gMHg3RkZGICkKLSAgICB7Ci0gICAgICBhY2NlbC0+Zm9udERlc2NlbnQgPSBhY2NlbC0+Zm9udERlc2NlbnQgPCAwID8gLTB4N0ZGRiA6IDB4N0ZGRjsKLSAgICAgIEZUX1RSQUNFMCgoICJwZmNfZ2V0X2FjY2VsOiBjbGFtcGluZyBmb250IGRlc2NlbnQgdG8gdmFsdWUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICBhY2NlbC0+Zm9udERlc2NlbnQgKSk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIiAgbWluYm91bmRzOiIgKSk7Ci0gICAgZXJyb3IgPSBwY2ZfZ2V0X21ldHJpYyggc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCAmICggflBDRl9GT1JNQVRfTUFTSyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoYWNjZWwtPm1pbmJvdW5kcykgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gQmFpbDsKLQotICAgIEZUX1RSQUNFNSgoICIgIG1heGJvdW5kczoiICkpOwotICAgIGVycm9yID0gcGNmX2dldF9tZXRyaWMoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgJiAoIH5QQ0ZfRk9STUFUX01BU0sgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGFjY2VsLT5tYXhib3VuZHMpICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEJhaWw7Ci0KLSAgICBpZiAoIFBDRl9GT1JNQVRfTUFUQ0goIGZvcm1hdCwgUENGX0FDQ0VMX1dfSU5LQk9VTkRTICkgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNSgoICIgIGluayBtaW5ib3VuZHM6IiApKTsKLSAgICAgIGVycm9yID0gcGNmX2dldF9tZXRyaWMoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCAmICggflBDRl9GT1JNQVRfTUFTSyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihhY2NlbC0+aW5rX21pbmJvdW5kcykgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEJhaWw7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgIGluayBtYXhib3VuZHM6IiApKTsKLSAgICAgIGVycm9yID0gcGNmX2dldF9tZXRyaWMoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCAmICggflBDRl9GT1JNQVRfTUFTSyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihhY2NlbC0+aW5rX21heGJvdW5kcykgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEJhaWw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhY2NlbC0+aW5rX21pbmJvdW5kcyA9IGFjY2VsLT5taW5ib3VuZHM7Ci0gICAgICBhY2NlbC0+aW5rX21heGJvdW5kcyA9IGFjY2VsLT5tYXhib3VuZHM7Ci0gICAgfQotCi0gIEJhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGNmX2ludGVycHJldF9zdHlsZSggUENGX0ZhY2UgIHBjZiApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9GYWNlICAgIGZhY2UgICA9IEZUX0ZBQ0UoIHBjZiApOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+bWVtb3J5OwotCi0gICAgUENGX1Byb3BlcnR5ICBwcm9wOwotCi0gICAgc2l6ZV90ICBubiwgbGVuOwotICAgIGNoYXIqICAgc3RyaW5nc1s0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OwotICAgIHNpemVfdCAgbGVuZ3Roc1s0XTsKLQotCi0gICAgZmFjZS0+c3R5bGVfZmxhZ3MgPSAwOwotCi0gICAgcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBwY2YsICJTTEFOVCIgKTsKLSAgICBpZiAoIHByb3AgJiYgcHJvcC0+aXNTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdPJyB8fCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdvJyB8fAotICAgICAgICAgICAqKHByb3AtPnZhbHVlLmF0b20pID09ICdJJyB8fCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdpJyApICkKLSAgICB7Ci0gICAgICBmYWNlLT5zdHlsZV9mbGFncyB8PSBGVF9TVFlMRV9GTEFHX0lUQUxJQzsKLSAgICAgIHN0cmluZ3NbMl0gPSAoICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ08nIHx8Ci0gICAgICAgICAgICAgICAgICAgICAqKHByb3AtPnZhbHVlLmF0b20pID09ICdvJyApID8gKGNoYXIgKikiT2JsaXF1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoY2hhciAqKSJJdGFsaWMiOwotICAgIH0KLQotICAgIHByb3AgPSBwY2ZfZmluZF9wcm9wZXJ0eSggcGNmLCAiV0VJR0hUX05BTUUiICk7Ci0gICAgaWYgKCBwcm9wICYmIHByb3AtPmlzU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnQicgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnYicgKSApCi0gICAgewotICAgICAgZmFjZS0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotICAgICAgc3RyaW5nc1sxXSA9IChjaGFyKikiQm9sZCI7Ci0gICAgfQotCi0gICAgcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBwY2YsICJTRVRXSURUSF9OQU1FIiApOwotICAgIGlmICggcHJvcCAmJiBwcm9wLT5pc1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKihwcm9wLT52YWx1ZS5hdG9tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnTicgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnbicgKSApCi0gICAgICBzdHJpbmdzWzNdID0gKGNoYXIqKSggcHJvcC0+dmFsdWUuYXRvbSApOwotCi0gICAgcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBwY2YsICJBRERfU1RZTEVfTkFNRSIgKTsKLSAgICBpZiAoIHByb3AgJiYgcHJvcC0+aXNTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICoocHJvcC0+dmFsdWUuYXRvbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICEoICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ04nIHx8ICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ24nICkgKQotICAgICAgc3RyaW5nc1swXSA9IChjaGFyKikoIHByb3AtPnZhbHVlLmF0b20gKTsKLQotICAgIGZvciAoIGxlbiA9IDAsIG5uID0gMDsgbm4gPCA0OyBubisrICkKLSAgICB7Ci0gICAgICBsZW5ndGhzW25uXSA9IDA7Ci0gICAgICBpZiAoIHN0cmluZ3Nbbm5dICkKLSAgICAgIHsKLSAgICAgICAgbGVuZ3Roc1tubl0gPSBmdF9zdHJsZW4oIHN0cmluZ3Nbbm5dICk7Ci0gICAgICAgIGxlbiAgICAgICAgKz0gbGVuZ3Roc1tubl0gKyAxOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggbGVuID09IDAgKQotICAgIHsKLSAgICAgIHN0cmluZ3NbMF0gPSAoY2hhciopIlJlZ3VsYXIiOwotICAgICAgbGVuZ3Roc1swXSA9IGZ0X3N0cmxlbiggc3RyaW5nc1swXSApOwotICAgICAgbGVuICAgICAgICA9IGxlbmd0aHNbMF0gKyAxOwotICAgIH0KLQotICAgIHsKLSAgICAgIGNoYXIqICBzOwotCi0KLSAgICAgIGlmICggRlRfQUxMT0MoIGZhY2UtPnN0eWxlX25hbWUsIGxlbiApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBzID0gZmFjZS0+c3R5bGVfbmFtZTsKLQotICAgICAgZm9yICggbm4gPSAwOyBubiA8IDQ7IG5uKysgKQotICAgICAgewotICAgICAgICBjaGFyKiAgc3JjID0gc3RyaW5nc1tubl07Ci0KLQotICAgICAgICBsZW4gPSBsZW5ndGhzW25uXTsKLQotICAgICAgICBpZiAoICFzcmMgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIHNlcGFyYXRlIGVsZW1lbnRzIHdpdGggYSBzcGFjZSAqLwotICAgICAgICBpZiAoIHMgIT0gZmFjZS0+c3R5bGVfbmFtZSApCi0gICAgICAgICAgKnMrKyA9ICcgJzsKLQotICAgICAgICBmdF9tZW1jcHkoIHMsIHNyYywgbGVuICk7Ci0KLSAgICAgICAgLyogbmVlZCB0byBjb252ZXJ0IHNwYWNlcyB0byBkYXNoZXMgZm9yICovCi0gICAgICAgIC8qIGFkZF9zdHlsZV9uYW1lIGFuZCBzZXR3aWR0aF9uYW1lICAgICAqLwotICAgICAgICBpZiAoIG5uID09IDAgfHwgbm4gPT0gMyApCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3QgIG1tOwotCi0KLSAgICAgICAgICBmb3IgKCBtbSA9IDA7IG1tIDwgbGVuOyBtbSsrICkKLSAgICAgICAgICAgIGlmICggc1ttbV0gPT0gJyAnICkKLSAgICAgICAgICAgICAgc1ttbV0gPSAnLSc7Ci0gICAgICAgIH0KLQotICAgICAgICBzICs9IGxlbjsKLSAgICAgIH0KLSAgICAgICpzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwY2ZfbG9hZF9mb250KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgUENGX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgRlRfRmFjZSAgICByb290ICAgPSBGVF9GQUNFKCBmYWNlICk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0UoIGZhY2UgKS0+bWVtb3J5OwotICAgIEZUX0Jvb2wgICAgaGFzQkRGQWNjZWxlcmF0b3JzOwotCi0KLSAgICBlcnJvciA9IHBjZl9yZWFkX1RPQyggc3RyZWFtLCBmYWNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICByb290LT5udW1fZmFjZXMgID0gMTsKLSAgICByb290LT5mYWNlX2luZGV4ID0gMDsKLQotICAgIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgc2ltcGxlIGZvbnQgZm9ybWF0IGNoZWNrLCBleGl0IGltbWVkaWF0ZWx5LiAqLwotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgIGVycm9yID0gcGNmX2dldF9wcm9wZXJ0aWVzKCBzdHJlYW0sIGZhY2UgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIFVzZSB0aGUgb2xkIGFjY2VsZXJhdG9ycyBpZiBubyBCREYgYWNjZWxlcmF0b3JzIGFyZSBpbiB0aGUgZmlsZS4gKi8KLSAgICBoYXNCREZBY2NlbGVyYXRvcnMgPSBwY2ZfaGFzX3RhYmxlX3R5cGUoIGZhY2UtPnRvYy50YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50b2MuY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0ZfQkRGX0FDQ0VMRVJBVE9SUyApOwotICAgIGlmICggIWhhc0JERkFjY2VsZXJhdG9ycyApCi0gICAgewotICAgICAgZXJyb3IgPSBwY2ZfZ2V0X2FjY2VsKCBzdHJlYW0sIGZhY2UsIFBDRl9BQ0NFTEVSQVRPUlMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbWV0cmljcyAqLwotICAgIGVycm9yID0gcGNmX2dldF9tZXRyaWNzKCBzdHJlYW0sIGZhY2UgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGJpdG1hcHMgKi8KLSAgICBlcnJvciA9IHBjZl9nZXRfYml0bWFwcyggc3RyZWFtLCBmYWNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBlbmNvZGluZ3MgKi8KLSAgICBlcnJvciA9IHBjZl9nZXRfZW5jb2RpbmdzKCBzdHJlYW0sIGZhY2UgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIEJERiBzdHlsZSBhY2NlbGVyYXRvcnMgKGkuZS4gYm91bmRzIGJhc2VkIG9uIGVuY29kZWQgZ2x5cGhzKSAqLwotICAgIGlmICggaGFzQkRGQWNjZWxlcmF0b3JzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBjZl9nZXRfYWNjZWwoIHN0cmVhbSwgZmFjZSwgUENGX0JERl9BQ0NFTEVSQVRPUlMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogWFhYOiBUTyBETzogaW5rbWV0cmljcyBhbmQgZ2x5cGhfbmFtZXMgYXJlIG1pc3NpbmcgKi8KLQotICAgIC8qIG5vdyBjb25zdHJ1Y3QgdGhlIGZhY2Ugb2JqZWN0ICovCi0gICAgewotICAgICAgUENGX1Byb3BlcnR5ICBwcm9wOwotCi0KLSAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTOwotCi0gICAgICBpZiAoIGZhY2UtPmFjY2VsLmNvbnN0YW50V2lkdGggKQotICAgICAgICByb290LT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSDsKLQotICAgICAgaWYgKCBGVF9TRVRfRVJST1IoIHBjZl9pbnRlcnByZXRfc3R5bGUoIGZhY2UgKSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwcm9wID0gcGNmX2ZpbmRfcHJvcGVydHkoIGZhY2UsICJGQU1JTFlfTkFNRSIgKTsKLSAgICAgIGlmICggcHJvcCAmJiBwcm9wLT5pc1N0cmluZyApCi0gICAgICB7Ci0KLSNpZmRlZiBQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUwotCi0gICAgICAgIFBDRl9Ecml2ZXIgIGRyaXZlciA9IChQQ0ZfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBmYWNlICk7Ci0KLQotICAgICAgICBpZiAoICFkcml2ZXItPm5vX2xvbmdfZmFtaWx5X25hbWVzICkKLSAgICAgICAgewotICAgICAgICAgIC8qIFByZXBlbmQgdGhlIGZvdW5kcnkgbmFtZSBwbHVzIGEgc3BhY2UgdG8gdGhlIGZhbWlseSBuYW1lLiAgICAgKi8KLSAgICAgICAgICAvKiBUaGVyZSBhcmUgbWFueSBmb250cyBqdXN0IGNhbGxlZCBgRml4ZWQnIHdoaWNoIGxvb2sgICAgICAgICAgICovCi0gICAgICAgICAgLyogY29tcGxldGVseSBkaWZmZXJlbnQsIGFuZCB3aGljaCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBlYWNoICAqLwotICAgICAgICAgIC8qIG90aGVyLiAgV2hlbiBzZWxlY3RpbmcgYEZpeGVkJyBpbiBLREUgb3IgR25vbWUgb25lIGdldHMgICAgICAgKi8KLSAgICAgICAgICAvKiByZXN1bHRzIHRoYXQgYXBwZWFyIHJhdGhlciByYW5kb20sIHRoZSBzdHlsZSBjaGFuZ2VzIG9mdGVuIGlmICovCi0gICAgICAgICAgLyogb25lIGNoYW5nZXMgdGhlIHNpemUgYW5kIG9uZSBjYW5ub3Qgc2VsZWN0IHNvbWUgZm9udHMgYXQgYWxsLiAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBXZSBhbHNvIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBgd2lkZScgY2hhcmFjdGVyczsgYWxsIHB1dCAgICAgICovCi0gICAgICAgICAgLyogdG9nZXRoZXIsIHdlIGdldCBmYW1pbHkgbmFtZXMgbGlrZSBgU29ueSBGaXhlZCcgb3IgYE1pc2MgICAgICAqLwotICAgICAgICAgIC8qIEZpeGVkIFdpZGUnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIFBDRl9Qcm9wZXJ0eSAgZm91bmRyeV9wcm9wLCBwb2ludF9zaXplX3Byb3AsIGF2ZXJhZ2Vfd2lkdGhfcHJvcDsKLQotICAgICAgICAgIGludCAgbCAgICA9IGZ0X3N0cmxlbiggcHJvcC0+dmFsdWUuYXRvbSApICsgMTsKLSAgICAgICAgICBpbnQgIHdpZGUgPSAwOwotCi0KLSAgICAgICAgICBmb3VuZHJ5X3Byb3AgICAgICAgPSBwY2ZfZmluZF9wcm9wZXJ0eSggZmFjZSwgIkZPVU5EUlkiICk7Ci0gICAgICAgICAgcG9pbnRfc2l6ZV9wcm9wICAgID0gcGNmX2ZpbmRfcHJvcGVydHkoIGZhY2UsICJQT0lOVF9TSVpFIiApOwotICAgICAgICAgIGF2ZXJhZ2Vfd2lkdGhfcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBmYWNlLCAiQVZFUkFHRV9XSURUSCIgKTsKLQotICAgICAgICAgIGlmICggcG9pbnRfc2l6ZV9wcm9wICYmIGF2ZXJhZ2Vfd2lkdGhfcHJvcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBhdmVyYWdlX3dpZHRoX3Byb3AtPnZhbHVlLmwgPj0gcG9pbnRfc2l6ZV9wcm9wLT52YWx1ZS5sICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogVGhpcyBmb250IGlzIGF0IGxlYXN0IHNxdWFyZSBzaGFwZWQgb3IgZXZlbiB3aWRlciAqLwotICAgICAgICAgICAgICB3aWRlID0gMTsKLSAgICAgICAgICAgICAgbCAgICs9IGZ0X3N0cmxlbiggIiBXaWRlIiApOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggZm91bmRyeV9wcm9wICYmIGZvdW5kcnlfcHJvcC0+aXNTdHJpbmcgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGwgKz0gZnRfc3RybGVuKCBmb3VuZHJ5X3Byb3AtPnZhbHVlLmF0b20gKSArIDE7Ci0KLSAgICAgICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCByb290LT5mYW1pbHlfbmFtZSwgbCApICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICBmdF9zdHJjcHkoIHJvb3QtPmZhbWlseV9uYW1lLCBmb3VuZHJ5X3Byb3AtPnZhbHVlLmF0b20gKTsKLSAgICAgICAgICAgIGZ0X3N0cmNhdCggcm9vdC0+ZmFtaWx5X25hbWUsICIgIiApOwotICAgICAgICAgICAgZnRfc3RyY2F0KCByb290LT5mYW1pbHlfbmFtZSwgcHJvcC0+dmFsdWUuYXRvbSApOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHJvb3QtPmZhbWlseV9uYW1lLCBsICkgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIGZ0X3N0cmNweSggcm9vdC0+ZmFtaWx5X25hbWUsIHByb3AtPnZhbHVlLmF0b20gKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIHdpZGUgKQotICAgICAgICAgICAgZnRfc3RyY2F0KCByb290LT5mYW1pbHlfbmFtZSwgIiBXaWRlIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLQotI2VuZGlmIC8qIFBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTICovCi0KLSAgICAgICAgewotICAgICAgICAgIGlmICggRlRfU1RSRFVQKCByb290LT5mYW1pbHlfbmFtZSwgcHJvcC0+dmFsdWUuYXRvbSApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByb290LT5mYW1pbHlfbmFtZSA9IE5VTEw7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBOb3RlOiBXZSBzaGlmdCBhbGwgZ2x5cGggaW5kaWNlcyBieSArMSBzaW5jZSB3ZSBtdXN0Ci0gICAgICAgKiByZXNwZWN0IHRoZSBjb252ZW50aW9uIHRoYXQgZ2x5cGggMCBhbHdheXMgY29ycmVzcG9uZHMKLSAgICAgICAqIHRvIHRoZSBgbWlzc2luZyBnbHlwaCcuCi0gICAgICAgKgotICAgICAgICogVGhpcyBpbXBsaWVzIGJ1bXBpbmcgdGhlIG51bWJlciBvZiBgYXZhaWxhYmxlJyBnbHlwaHMgYnkgMS4KLSAgICAgICAqLwotICAgICAgcm9vdC0+bnVtX2dseXBocyA9IChGVF9Mb25nKSggZmFjZS0+bm1ldHJpY3MgKyAxICk7Ci0KLSAgICAgIHJvb3QtPm51bV9maXhlZF9zaXplcyA9IDE7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggcm9vdC0+YXZhaWxhYmxlX3NpemVzLCAxICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHsKLSAgICAgICAgRlRfQml0bWFwX1NpemUqICBic2l6ZSA9IHJvb3QtPmF2YWlsYWJsZV9zaXplczsKLSAgICAgICAgRlRfU2hvcnQgICAgICAgICByZXNvbHV0aW9uX3ggPSAwLCByZXNvbHV0aW9uX3kgPSAwOwotCi0KLSAgICAgICAgRlRfWkVSTyggYnNpemUgKTsKLQotICAgICAgICAvKiBmb3Igc2ltcGxpY2l0eSwgd2UgdGFrZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgaW50ZWdlciBwcm9wZXJ0aWVzICovCi0KLSNpZiAwCi0gICAgICAgIGJzaXplLT5oZWlnaHQgPSBmYWNlLT5hY2NlbC5tYXhib3VuZHMuYXNjZW50IDw8IDY7Ci0jZW5kaWYKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGlmICggZmFjZS0+YWNjZWwuZm9udEFzY2VudCArIGZhY2UtPmFjY2VsLmZvbnREZXNjZW50IDwgMCApCi0gICAgICAgICAgRlRfVFJBQ0UwKCggInBjZl9sb2FkX2ZvbnQ6IG5lZ2F0aXZlIGhlaWdodFxuIiApKTsKLSNlbmRpZgotICAgICAgICBpZiAoIEZUX0FCUyggZmFjZS0+YWNjZWwuZm9udEFzY2VudCArCi0gICAgICAgICAgICAgICAgICAgICBmYWNlLT5hY2NlbC5mb250RGVzY2VudCApID4gMHg3RkZGICkKLSAgICAgICAgewotICAgICAgICAgIGJzaXplLT5oZWlnaHQgPSAweDdGRkY7Ci0gICAgICAgICAgRlRfVFJBQ0UwKCggInBjZl9sb2FkX2ZvbnQ6IGNsYW1waW5nIGhlaWdodCB0byB2YWx1ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBic2l6ZS0+aGVpZ2h0ICkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBic2l6ZS0+aGVpZ2h0ID0gRlRfQUJTKCAoRlRfU2hvcnQpKCBmYWNlLT5hY2NlbC5mb250QXNjZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5hY2NlbC5mb250RGVzY2VudCApICk7Ci0KLSAgICAgICAgcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBmYWNlLCAiQVZFUkFHRV9XSURUSCIgKTsKLSAgICAgICAgaWYgKCBwcm9wICkKLSAgICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgaWYgKCBwcm9wLT52YWx1ZS5sIDwgMCApCi0gICAgICAgICAgICBGVF9UUkFDRTAoKCAicGNmX2xvYWRfZm9udDogbmVnYXRpdmUgYXZlcmFnZSB3aWR0aFxuIiApKTsKLSNlbmRpZgotICAgICAgICAgIGlmICggKCBGVF9BQlMoIHByb3AtPnZhbHVlLmwgKSA+IDB4N0ZGRkwgKiAxMCAtIDUgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgYnNpemUtPndpZHRoID0gMHg3RkZGOwotICAgICAgICAgICAgRlRfVFJBQ0UwKCggInBjZl9sb2FkX2ZvbnQ6IGNsYW1waW5nIGF2ZXJhZ2Ugd2lkdGggdG8gdmFsdWUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBic2l6ZS0+d2lkdGggKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJzaXplLT53aWR0aCA9IEZUX0FCUyggKEZUX1Nob3J0KSggKCBwcm9wLT52YWx1ZS5sICsgNSApIC8gMTAgKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgaXMgYSBoZXVyaXN0aWNhbCB2YWx1ZSAqLwotICAgICAgICAgIGJzaXplLT53aWR0aCA9IChGVF9TaG9ydClGVF9NdWxEaXYoIGJzaXplLT5oZWlnaHQsIDIsIDMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3AgPSBwY2ZfZmluZF9wcm9wZXJ0eSggZmFjZSwgIlBPSU5UX1NJWkUiICk7Ci0gICAgICAgIGlmICggcHJvcCApCi0gICAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA8IDAgKQotICAgICAgICAgICAgRlRfVFJBQ0UwKCggInBjZl9sb2FkX2ZvbnQ6IG5lZ2F0aXZlIHBvaW50IHNpemVcbiIgKSk7Ci0jZW5kaWYKLSAgICAgICAgICAvKiBjb252ZXJ0IGZyb20gNzIyLjcgZGVjaXBvaW50cyB0byA3MiBwb2ludHMgcGVyIGluY2ggKi8KLSAgICAgICAgICBpZiAoIEZUX0FCUyggcHJvcC0+dmFsdWUubCApID4gMHg1MDRDMkwgKSAvKiAweDdGRkYgKiA3MjI3MC83MjAwICovCi0gICAgICAgICAgewotICAgICAgICAgICAgYnNpemUtPnNpemUgPSAweDdGRkY7Ci0gICAgICAgICAgICBGVF9UUkFDRTAoKCAicGNmX2xvYWRfZm9udDogY2xhbXBpbmcgcG9pbnQgc2l6ZSB0byB2YWx1ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJzaXplLT5zaXplICkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBic2l6ZS0+c2l6ZSA9IEZUX011bERpdiggRlRfQUJTKCBwcm9wLT52YWx1ZS5sICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQgKiA3MjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMjcwTCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBmYWNlLCAiUElYRUxfU0laRSIgKTsKLSAgICAgICAgaWYgKCBwcm9wICkKLSAgICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgaWYgKCBwcm9wLT52YWx1ZS5sIDwgMCApCi0gICAgICAgICAgICBGVF9UUkFDRTAoKCAicGNmX2xvYWRfZm9udDogbmVnYXRpdmUgcGl4ZWwgc2l6ZVxuIiApKTsKLSNlbmRpZgotICAgICAgICAgIGlmICggRlRfQUJTKCBwcm9wLT52YWx1ZS5sICkgPiAweDdGRkYgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJzaXplLT55X3BwZW0gPSAweDdGRkYgPDwgNjsKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfbG9hZF9mb250OiBjbGFtcGluZyBwaXhlbCBzaXplIHRvIHZhbHVlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYnNpemUtPnlfcHBlbSApKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYnNpemUtPnlfcHBlbSA9IEZUX0FCUyggKEZUX1Nob3J0KXByb3AtPnZhbHVlLmwgKSA8PCA2OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBmYWNlLCAiUkVTT0xVVElPTl9YIiApOwotICAgICAgICBpZiAoIHByb3AgKQotICAgICAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBpZiAoIHByb3AtPnZhbHVlLmwgPCAwICkKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfbG9hZF9mb250OiBuZWdhdGl2ZSBYIHJlc29sdXRpb25cbiIgKSk7Ci0jZW5kaWYKLSAgICAgICAgICBpZiAoIEZUX0FCUyggcHJvcC0+dmFsdWUubCApID4gMHg3RkZGICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNvbHV0aW9uX3ggPSAweDdGRkY7Ci0gICAgICAgICAgICBGVF9UUkFDRTAoKCAicGNmX2xvYWRfZm9udDogY2xhbXBpbmcgWCByZXNvbHV0aW9uIHRvIHZhbHVlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbl94ICkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXNvbHV0aW9uX3ggPSBGVF9BQlMoIChGVF9TaG9ydClwcm9wLT52YWx1ZS5sICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wID0gcGNmX2ZpbmRfcHJvcGVydHkoIGZhY2UsICJSRVNPTFVUSU9OX1kiICk7Ci0gICAgICAgIGlmICggcHJvcCApCi0gICAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA8IDAgKQotICAgICAgICAgICAgRlRfVFJBQ0UwKCggInBjZl9sb2FkX2ZvbnQ6IG5lZ2F0aXZlIFkgcmVzb2x1dGlvblxuIiApKTsKLSNlbmRpZgotICAgICAgICAgIGlmICggRlRfQUJTKCBwcm9wLT52YWx1ZS5sICkgPiAweDdGRkYgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc29sdXRpb25feSA9IDB4N0ZGRjsKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfbG9hZF9mb250OiBjbGFtcGluZyBZIHJlc29sdXRpb24gdG8gdmFsdWUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uX3kgKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc29sdXRpb25feSA9IEZUX0FCUyggKEZUX1Nob3J0KXByb3AtPnZhbHVlLmwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggYnNpemUtPnlfcHBlbSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIGJzaXplLT55X3BwZW0gPSBic2l6ZS0+c2l6ZTsKLSAgICAgICAgICBpZiAoIHJlc29sdXRpb25feSApCi0gICAgICAgICAgICBic2l6ZS0+eV9wcGVtID0gRlRfTXVsRGl2KCBic2l6ZS0+eV9wcGVtLCByZXNvbHV0aW9uX3ksIDcyICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCByZXNvbHV0aW9uX3ggJiYgcmVzb2x1dGlvbl95ICkKLSAgICAgICAgICBic2l6ZS0+eF9wcGVtID0gRlRfTXVsRGl2KCBic2l6ZS0+eV9wcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb25feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uX3kgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGJzaXplLT54X3BwZW0gPSBic2l6ZS0+eV9wcGVtOwotICAgICAgfQotCi0gICAgICAvKiBzZXQgdXAgY2hhcnNldCAqLwotICAgICAgewotICAgICAgICBQQ0ZfUHJvcGVydHkgIGNoYXJzZXRfcmVnaXN0cnksIGNoYXJzZXRfZW5jb2Rpbmc7Ci0KLQotICAgICAgICBjaGFyc2V0X3JlZ2lzdHJ5ID0gcGNmX2ZpbmRfcHJvcGVydHkoIGZhY2UsICJDSEFSU0VUX1JFR0lTVFJZIiApOwotICAgICAgICBjaGFyc2V0X2VuY29kaW5nID0gcGNmX2ZpbmRfcHJvcGVydHkoIGZhY2UsICJDSEFSU0VUX0VOQ09ESU5HIiApOwotCi0gICAgICAgIGlmICggY2hhcnNldF9yZWdpc3RyeSAmJiBjaGFyc2V0X3JlZ2lzdHJ5LT5pc1N0cmluZyAmJgotICAgICAgICAgICAgIGNoYXJzZXRfZW5jb2RpbmcgJiYgY2hhcnNldF9lbmNvZGluZy0+aXNTdHJpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBGVF9TVFJEVVAoIGZhY2UtPmNoYXJzZXRfZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRfZW5jb2RpbmctPnZhbHVlLmF0b20gKSB8fAotICAgICAgICAgICAgICAgRlRfU1RSRFVQKCBmYWNlLT5jaGFyc2V0X3JlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0X3JlZ2lzdHJ5LT52YWx1ZS5hdG9tICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBkb25lIHRvIHJlc3BlY3QgdGhlIGJlaGF2aW91ciBvZiB0aGUgb3JpZ2luYWwgKi8KLSAgICAgIC8qIFBDRiBmb250IGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcGNmL3BjZnJlYWQuaCBiL3NyYy9wY2YvcGNmcmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQzMGU1Li4wMDAwMDAwCi0tLSBhL3NyYy9wY2YvcGNmcmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogIHBjZnJlYWQuaAotCi0gICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgZm9yIHBjZiBmb250cwotCi0gIENvcHlyaWdodCAyMDAzIGJ5Ci0gIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCi0qLwotCi0KLSNpZm5kZWYgUENGUkVBRF9IXwotI2RlZmluZSBQQ0ZSRUFEX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLUZUX0JFR0lOX0hFQURFUgotCi0gIEZUX0xPQ0FMKCBQQ0ZfUHJvcGVydHkgKQotICBwY2ZfZmluZF9wcm9wZXJ0eSggUENGX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHByb3AgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogUENGUkVBRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2Z1dGlsLmMgYi9zcmMvcGNmL3BjZnV0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MWVlOC4uMDAwMDAwMAotLS0gYS9zcmMvcGNmL3BjZnV0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgMTk5MCwgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci1jb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uLgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLU9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgotQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCi11c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKLWluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KLQotKi8KLS8qICRYRnJlZTg2OiB4Yy9saWIvZm9udC91dGlsL3V0aWxiaXRtYXAuYyx2IDEuMyAxOTk5LzA4LzIyIDA4OjU4OjU4IGRhd2VzIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6ICBLZWl0aCBQYWNrYXJkLCBNSVQgWCBDb25zb3J0aXVtCi0gKi8KLQotLyogTW9kaWZpZWQgZm9yIHVzZSB3aXRoIEZyZWVUeXBlICovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAicGNmdXRpbC5oIgotCi0KLSAgLyoKLSAgICogIEludmVydCBiaXQgb3JkZXIgd2l0aGluIGVhY2ggQllURSBvZiBhbiBhcnJheS4KLSAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgQml0T3JkZXJJbnZlcnQoIHVuc2lnbmVkIGNoYXIqICBidWYsCi0gICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbmJ5dGVzICkKLSAgewotICAgIGZvciAoIDsgbmJ5dGVzID4gMDsgbmJ5dGVzLS0sIGJ1ZisrICkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgIHZhbCA9ICpidWY7Ci0KLQotICAgICAgdmFsID0gKCAoIHZhbCA+PiAxICkgJiAweDU1ICkgfCAoICggdmFsIDw8IDEgKSAmIDB4QUEgKTsKLSAgICAgIHZhbCA9ICggKCB2YWwgPj4gMiApICYgMHgzMyApIHwgKCAoIHZhbCA8PCAyICkgJiAweENDICk7Ci0gICAgICB2YWwgPSAoICggdmFsID4+IDQgKSAmIDB4MEYgKSB8ICggKCB2YWwgPDwgNCApICYgMHhGMCApOwotCi0gICAgICAqYnVmID0gKHVuc2lnbmVkIGNoYXIpdmFsOwotICAgIH0KLSAgfQotCi0KLSAgLyoKLSAgICogIEludmVydCBieXRlIG9yZGVyIHdpdGhpbiBlYWNoIDE2LWJpdHMgb2YgYW4gYXJyYXkuCi0gICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFR3b0J5dGVTd2FwKCB1bnNpZ25lZCBjaGFyKiAgYnVmLAotICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG5ieXRlcyApCi0gIHsKLSAgICBmb3IgKCA7IG5ieXRlcyA+PSAyOyBuYnl0ZXMgLT0gMiwgYnVmICs9IDIgKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgIGM7Ci0KLQotICAgICAgYyAgICAgID0gYnVmWzBdOwotICAgICAgYnVmWzBdID0gYnVmWzFdOwotICAgICAgYnVmWzFdID0gYzsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAgSW52ZXJ0IGJ5dGUgb3JkZXIgd2l0aGluIGVhY2ggMzItYml0cyBvZiBhbiBhcnJheS4KLSAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgRm91ckJ5dGVTd2FwKCB1bnNpZ25lZCBjaGFyKiAgYnVmLAotICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBuYnl0ZXMgKQotICB7Ci0gICAgZm9yICggOyBuYnl0ZXMgPj0gNDsgbmJ5dGVzIC09IDQsIGJ1ZiArPSA0ICkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICBjOwotCi0KLSAgICAgIGMgICAgICA9IGJ1ZlswXTsKLSAgICAgIGJ1ZlswXSA9IGJ1ZlszXTsKLSAgICAgIGJ1ZlszXSA9IGM7Ci0KLSAgICAgIGMgICAgICA9IGJ1ZlsxXTsKLSAgICAgIGJ1ZlsxXSA9IGJ1ZlsyXTsKLSAgICAgIGJ1ZlsyXSA9IGM7Ci0gICAgfQotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcGNmL3BjZnV0aWwuaCBiL3NyYy9wY2YvcGNmdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk4NmU3Li4wMDAwMDAwCi0tLSBhL3NyYy9wY2YvcGNmdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogIHBjZnV0aWwuaAotCi0gICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgZm9yIHBjZiBmb250cwotCi0gIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDA0IGJ5Ci0gIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCi0qLwotCi0KLSNpZm5kZWYgUENGVVRJTF9IXwotI2RlZmluZSBQQ0ZVVElMX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIEJpdE9yZGVySW52ZXJ0KCB1bnNpZ25lZCBjaGFyKiAgYnVmLAotICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG5ieXRlcyApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVHdvQnl0ZVN3YXAoIHVuc2lnbmVkIGNoYXIqICBidWYsCi0gICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbmJ5dGVzICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBGb3VyQnl0ZVN3YXAoIHVuc2lnbmVkIGNoYXIqICBidWYsCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG5ieXRlcyApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBQQ0ZVVElMX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcGNmL3J1bGVzLm1rIGIvc3JjL3BjZi9ydWxlcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1NWRhZi4uMDAwMDAwMAotLS0gYS9zcmMvcGNmL3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIHBjZiBkcml2ZXIgY29uZmlndXJhdGlvbiBydWxlcwotIwotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAzLCAyMDA4IGJ5Ci0jIEZyYW5jZXNjbyBaYXBwYSBOYXJkZWxsaQotIwotIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci0jIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi0jIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLSMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSMKLSMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0jCi0jIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0jIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi0jIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLSMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLSMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotIyBUSEUgU09GVFdBUkUuCi0KLQotIyBwY2YgZHJpdmVyIGRpcmVjdG9yeQotIwotUENGX0RJUiA6PSAkKFNSQ19ESVIpL3BjZgotCi0KLVBDRl9DT01QSUxFIDo9ICQoQ0MpICQoQU5TSUZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAkSSQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJChQQ0ZfRElSKSkgXAotICAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICQoRlRfQ0ZMQUdTKQotCi0KLSMgcGNmIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQotIwotUENGX0RSVl9TUkMgOj0gJChQQ0ZfRElSKS9wY2Zkcml2ci5jIFwKLSAgICAgICAgICAgICAgICQoUENGX0RJUikvcGNmcmVhZC5jICBcCi0gICAgICAgICAgICAgICAkKFBDRl9ESVIpL3BjZnV0aWwuYwotCi0jIHBjZiBkcml2ZXIgaGVhZGVycwotIwotUENGX0RSVl9IIDo9ICQoUENGX0RSVl9TUkM6JS5jPSUuaCkgXAotICAgICAgICAgICAgICQoUENGX0RJUikvcGNmLmggICAgICAgXAotICAgICAgICAgICAgICQoUENGX0RJUikvcGNmZXJyb3IuaAotCi0jIHBjZiBkcml2ZXIgb2JqZWN0KHMpCi0jCi0jICAgUENGX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcwotIyAgIFBDRl9EUlZfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHNpbmdsZScgYnVpbGRzCi0jCi1QQ0ZfRFJWX09CSl9NIDo9ICQoUENGX0RSVl9TUkM6JChQQ0ZfRElSKS8lLmM9JChPQkpfRElSKS8lLiRPKQotUENGX0RSVl9PQkpfUyA6PSAkKE9CSl9ESVIpL3BjZi4kTwotCi0jIHBjZiBkcml2ZXIgc291cmNlIGZpbGUgZm9yIHNpbmdsZSBidWlsZAotIwotUENGX0RSVl9TUkNfUyA6PSAkKFBDRl9ESVIpL3BjZi5jCi0KLQotIyBwY2YgZHJpdmVyIC0gc2luZ2xlIG9iamVjdAotIwotJChQQ0ZfRFJWX09CSl9TKTogJChQQ0ZfRFJWX1NSQ19TKSAkKFBDRl9EUlZfU1JDKSAkKEZSRUVUWVBFX0gpICQoUENGX0RSVl9IKQotCSQoUENGX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKFBDRl9EUlZfU1JDX1MpKQotCi0KLSMgcGNmIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChQQ0ZfRElSKS8lLmMgJChGUkVFVFlQRV9IKSAkKFBDRl9EUlZfSCkKLQkkKFBDRl9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoUENGX0RSVl9PQkpfUykKLURSVl9PQkpTX00gKz0gJChQQ0ZfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvcGZyL0phbWZpbGUgYi9zcmMvcGZyL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODMxNzEuLjAwMDAwMDAKLS0tIGEvc3JjL3Bmci9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9wZnIgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHBmciA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gcGZyY21hcAotICAgICAgICAgICAgICAgcGZyZHJpdnIKLSAgICAgICAgICAgICAgIHBmcmdsb2FkCi0gICAgICAgICAgICAgICBwZnJsb2FkCi0gICAgICAgICAgICAgICBwZnJvYmpzCi0gICAgICAgICAgICAgICBwZnJzYml0Ci0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBwZnIgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvcGZyIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9wZnIvbW9kdWxlLm1rIGIvc3JjL3Bmci9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODRkYTkuLjAwMDAwMDAKLS0tIGEvc3JjL3Bmci9tb2R1bGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgUEZSIG1vZHVsZSBkZWZpbml0aW9uCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1GVE1PRFVMRV9IX0NPTU1BTkRTICs9IFBGUl9EUklWRVIKLQotZGVmaW5lIFBGUl9EUklWRVIKLSQoT1BFTl9EUklWRVIpIEZUX0RyaXZlcl9DbGFzc1JlYywgcGZyX2RyaXZlcl9jbGFzcyAkKENMT1NFX0RSSVZFUikKLSQoRUNIT19EUklWRVIpcGZyICAgICAgICQoRUNIT19EUklWRVJfREVTQylQRlIvVHJ1ZURvYyBmb250IGZpbGVzIHdpdGggZXh0ZW5zaW9uICoucGZyJChFQ0hPX0RSSVZFUl9ET05FKQotZW5kZWYKLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9wZnIvcGZyLmMgYi9zcmMvcGZyL3Bmci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMxZjVkLi4wMDAwMDAwCi0tLSBhL3NyYy9wZnIvcGZyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIGRyaXZlciBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNpbmNsdWRlICJwZnJjbWFwLmMiCi0jaW5jbHVkZSAicGZyZHJpdnIuYyIKLSNpbmNsdWRlICJwZnJnbG9hZC5jIgotI2luY2x1ZGUgInBmcmxvYWQuYyIKLSNpbmNsdWRlICJwZnJvYmpzLmMiCi0jaW5jbHVkZSAicGZyc2JpdC5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJjbWFwLmMgYi9zcmMvcGZyL3BmcmNtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ2YjE1Yi4uMDAwMDAwMAotLS0gYS9zcmMvcGZyL3BmcmNtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIGNtYXAgaGFuZGxpbmcgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgInBmcmNtYXAuaCIKLSNpbmNsdWRlICJwZnJvYmpzLmgiCi0KLSNpbmNsdWRlICJwZnJlcnJvci5oIgotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHBmcl9jbWFwX2luaXQoIFBGUl9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIHBvaW50ZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIFBGUl9GYWNlICBmYWNlICA9IChQRlJfRmFjZSlGVF9DTUFQX0ZBQ0UoIGNtYXAgKTsKLQotICAgIEZUX1VOVVNFRCggcG9pbnRlciApOwotCi0KLSAgICBjbWFwLT5udW1fY2hhcnMgPSBmYWNlLT5waHlfZm9udC5udW1fY2hhcnM7Ci0gICAgY21hcC0+Y2hhcnMgICAgID0gZmFjZS0+cGh5X2ZvbnQuY2hhcnM7Ci0KLSAgICAvKiBqdXN0IGZvciBzYWZldHksIGNoZWNrIHRoYXQgdGhlIGNoYXJhY3RlciBlbnRyaWVzIGFyZSBjb3JyZWN0bHkgKi8KLSAgICAvKiBzb3J0ZWQgaW4gaW5jcmVhc2luZyBjaGFyYWN0ZXIgY29kZSBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBGVF9VSW50ICBuOwotCi0KLSAgICAgIGZvciAoIG4gPSAxOyBuIDwgY21hcC0+bnVtX2NoYXJzOyBuKysgKQotICAgICAgewotICAgICAgICBpZiAoIGNtYXAtPmNoYXJzW24gLSAxXS5jaGFyX2NvZGUgPj0gY21hcC0+Y2hhcnNbbl0uY2hhcl9jb2RlICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHBmcl9jbWFwX2RvbmUoIFBGUl9DTWFwICBjbWFwICkKLSAgewotICAgIGNtYXAtPmNoYXJzICAgICA9IE5VTEw7Ci0gICAgY21hcC0+bnVtX2NoYXJzID0gMDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgcGZyX2NtYXBfY2hhcl9pbmRleCggUEZSX0NNYXAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICBtaW4gPSAwOwotICAgIEZUX1VJbnQgIG1heCA9IGNtYXAtPm51bV9jaGFyczsKLQotCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIFBGUl9DaGFyICBnY2hhcjsKLSAgICAgIEZUX1VJbnQgICBtaWQ7Ci0KLQotICAgICAgbWlkICAgPSBtaW4gKyAoIG1heCAtIG1pbiApIC8gMjsKLSAgICAgIGdjaGFyID0gY21hcC0+Y2hhcnMgKyBtaWQ7Ci0KLSAgICAgIGlmICggZ2NoYXItPmNoYXJfY29kZSA9PSBjaGFyX2NvZGUgKQotICAgICAgICByZXR1cm4gbWlkICsgMTsKLQotICAgICAgaWYgKCBnY2hhci0+Y2hhcl9jb2RlIDwgY2hhcl9jb2RlICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgICAgbWF4ID0gbWlkOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICBwZnJfY21hcF9jaGFyX25leHQoIFBGUl9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCAgICA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7Ci0KLQotICBSZXN0YXJ0OgotICAgIHsKLSAgICAgIEZUX1VJbnQgICBtaW4gPSAwOwotICAgICAgRlRfVUludCAgIG1heCA9IGNtYXAtPm51bV9jaGFyczsKLSAgICAgIEZUX1VJbnQgICBtaWQ7Ci0gICAgICBQRlJfQ2hhciAgZ2NoYXI7Ci0KLQotICAgICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgICAgewotICAgICAgICBtaWQgICA9IG1pbiArICggKCBtYXggLSBtaW4gKSA+PiAxICk7Ci0gICAgICAgIGdjaGFyID0gY21hcC0+Y2hhcnMgKyBtaWQ7Ci0KLSAgICAgICAgaWYgKCBnY2hhci0+Y2hhcl9jb2RlID09IGNoYXJfY29kZSApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBtaWQ7Ci0gICAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0Kys7Ci0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2hhcl9jb2RlKys7Ci0gICAgICAgICAgZ290byBSZXN0YXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBnY2hhci0+Y2hhcl9jb2RlIDwgY2hhcl9jb2RlICkKLSAgICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbWF4ID0gbWlkOwotICAgICAgfQotCi0gICAgICAvKiB3ZSBkaWRuJ3QgZmluZCBpdCwgYnV0IHdlIGhhdmUgYSBwYWlyIGp1c3QgYWJvdmUgaXQgKi8KLSAgICAgIGNoYXJfY29kZSA9IDA7Ci0KLSAgICAgIGlmICggbWluIDwgY21hcC0+bnVtX2NoYXJzICkKLSAgICAgIHsKLSAgICAgICAgZ2NoYXIgID0gY21hcC0+Y2hhcnMgKyBtaW47Ci0gICAgICAgIHJlc3VsdCA9IG1pbjsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQrKzsKLSAgICAgICAgICBjaGFyX2NvZGUgPSBnY2hhci0+Y2hhcl9jb2RlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKnBjaGFyX2NvZGUgPSBjaGFyX2NvZGU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgcGZyX2NtYXBfY2xhc3NfcmVjID0KLSAgewotICAgIHNpemVvZiAoIFBGUl9DTWFwUmVjICksCi0KLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHBmcl9jbWFwX2luaXQsICAgICAgICAvKiBpbml0ICAgICAgICovCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBwZnJfY21hcF9kb25lLCAgICAgICAgLyogZG9uZSAgICAgICAqLwotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpcGZyX2NtYXBfY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHBmcl9jbWFwX2NoYXJfbmV4dCwgICAvKiBjaGFyX25leHQgICovCi0KLSAgICAoRlRfQ01hcF9DaGFyVmFySW5kZXhGdW5jKSAgICBOVUxMLCAgLyogY2hhcl92YXJfaW5kZXggICAqLwotICAgIChGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jKU5VTEwsICAvKiBjaGFyX3Zhcl9kZWZhdWx0ICovCi0gICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgTlVMTCwgIC8qIHZhcmlhbnRfbGlzdCAgICAgKi8KLSAgICAoRlRfQ01hcF9DaGFyVmFyaWFudExpc3RGdW5jKSBOVUxMLCAgLyogY2hhcnZhcmlhbnRfbGlzdCAqLwotICAgIChGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpIE5VTEwgICAvKiB2YXJpYW50Y2hhcl9saXN0ICovCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcGZyL3BmcmNtYXAuaCBiL3NyYy9wZnIvcGZyY21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdiZjY1Li4wMDAwMDAwCi0tLSBhL3NyYy9wZnIvcGZyY21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyY21hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBjbWFwIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBGUkNNQVBfSF8KLSNkZWZpbmUgUEZSQ01BUF9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgInBmcnR5cGVzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBGUl9DTWFwUmVjXwotICB7Ci0gICAgRlRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VSW50ICAgICBudW1fY2hhcnM7Ci0gICAgUEZSX0NoYXIgICAgY2hhcnM7Ci0KLSAgfSBQRlJfQ01hcFJlYywgKlBGUl9DTWFwOwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYyAgcGZyX2NtYXBfY2xhc3NfcmVjOwotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFBGUkNNQVBfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wZnIvcGZyZHJpdnIuYyBiL3NyYy9wZnIvcGZyZHJpdnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1Y2RiNy4uMDAwMDAwMAotLS0gYS9zcmMvcGZyL3BmcmRyaXZyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyZHJpdnIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BGUl9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKLSNpbmNsdWRlICJwZnJkcml2ci5oIgotI2luY2x1ZGUgInBmcm9ianMuaCIKLQotI2luY2x1ZGUgInBmcmVycm9yLmgiCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgcGZyX2dldF9rZXJuaW5nKCBGVF9GYWNlICAgICBwZnJmYWNlLCAgICAgLyogUEZSX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgKmF2ZWN0b3IgKQotICB7Ci0gICAgUEZSX0ZhY2UgICAgIGZhY2UgPSAoUEZSX0ZhY2UpcGZyZmFjZTsKLSAgICBQRlJfUGh5Rm9udCAgcGh5cyA9ICZmYWNlLT5waHlfZm9udDsKLQotCi0gICAgKHZvaWQpcGZyX2ZhY2VfZ2V0X2tlcm5pbmcoIHBmcmZhY2UsIGxlZnQsIHJpZ2h0LCBhdmVjdG9yICk7Ci0KLSAgICAvKiBjb252ZXJ0IGZyb20gbWV0cmljcyB0byBvdXRsaW5lIHVuaXRzIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgaWYgKCBwaHlzLT5vdXRsaW5lX3Jlc29sdXRpb24gIT0gcGh5cy0+bWV0cmljc19yZXNvbHV0aW9uICkKLSAgICB7Ci0gICAgICBpZiAoIGF2ZWN0b3ItPnggIT0gMCApCi0gICAgICAgIGF2ZWN0b3ItPnggPSBGVF9NdWxEaXYoIGF2ZWN0b3ItPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKXBoeXMtPm91dGxpbmVfcmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpcGh5cy0+bWV0cmljc19yZXNvbHV0aW9uICk7Ci0KLSAgICAgIGlmICggYXZlY3Rvci0+eSAhPSAwICkKLSAgICAgICAgYXZlY3Rvci0+eSA9IEZUX011bERpdiggYXZlY3Rvci0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpcGh5cy0+b3V0bGluZV9yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylwaHlzLT5tZXRyaWNzX3Jlc29sdXRpb24gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotIC8qCi0gICogIFBGUiBNRVRSSUNTIFNFUlZJQ0UKLSAgKgotICAqLwotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBwZnJfZ2V0X2FkdmFuY2UoIEZUX0ZhY2UgICBwZnJmYWNlLCAgICAgICAvKiBQRlJfRmFjZSAqLwotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9zICAgKmFuYWR2YW5jZSApCi0gIHsKLSAgICBQRlJfRmFjZSAgZmFjZSAgPSAoUEZSX0ZhY2UpcGZyZmFjZTsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLQotCi0gICAgKmFuYWR2YW5jZSA9IDA7Ci0KLSAgICBpZiAoICFnaW5kZXggKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ2luZGV4LS07Ci0KLSAgICBpZiAoIGZhY2UgKQotICAgIHsKLSAgICAgIFBGUl9QaHlGb250ICBwaHlzID0gJmZhY2UtPnBoeV9mb250OwotCi0KLSAgICAgIGlmICggZ2luZGV4IDwgcGh5cy0+bnVtX2NoYXJzICkKLSAgICAgIHsKLSAgICAgICAgKmFuYWR2YW5jZSA9IHBoeXMtPmNoYXJzW2dpbmRleF0uYWR2YW5jZTsKLSAgICAgICAgZXJyb3IgICAgICA9IEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBwZnJfZ2V0X21ldHJpY3MoIEZUX0ZhY2UgICAgcGZyZmFjZSwgICAgICAvKiBQRlJfRmFjZSAqLwotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW5vdXRsaW5lX3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphbWV0cmljc19yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYW1ldHJpY3NfeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmFtZXRyaWNzX3lfc2NhbGUgKQotICB7Ci0gICAgUEZSX0ZhY2UgICAgIGZhY2UgPSAoUEZSX0ZhY2UpcGZyZmFjZTsKLSAgICBQRlJfUGh5Rm9udCAgcGh5cyA9ICZmYWNlLT5waHlfZm9udDsKLSAgICBGVF9GaXhlZCAgICAgeF9zY2FsZSwgeV9zY2FsZTsKLSAgICBGVF9TaXplICAgICAgc2l6ZSA9IGZhY2UtPnJvb3Quc2l6ZTsKLQotCi0gICAgaWYgKCBhbm91dGxpbmVfcmVzb2x1dGlvbiApCi0gICAgICAqYW5vdXRsaW5lX3Jlc29sdXRpb24gPSBwaHlzLT5vdXRsaW5lX3Jlc29sdXRpb247Ci0KLSAgICBpZiAoIGFtZXRyaWNzX3Jlc29sdXRpb24gKQotICAgICAgKmFtZXRyaWNzX3Jlc29sdXRpb24gPSBwaHlzLT5tZXRyaWNzX3Jlc29sdXRpb247Ci0KLSAgICB4X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgeV9zY2FsZSA9IDB4MTAwMDBMOwotCi0gICAgaWYgKCBzaXplICkKLSAgICB7Ci0gICAgICB4X3NjYWxlID0gRlRfRGl2Rml4KCBzaXplLT5tZXRyaWNzLnhfcHBlbSA8PCA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpcGh5cy0+bWV0cmljc19yZXNvbHV0aW9uICk7Ci0KLSAgICAgIHlfc2NhbGUgPSBGVF9EaXZGaXgoIHNpemUtPm1ldHJpY3MueV9wcGVtIDw8IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylwaHlzLT5tZXRyaWNzX3Jlc29sdXRpb24gKTsKLSAgICB9Ci0KLSAgICBpZiAoIGFtZXRyaWNzX3hfc2NhbGUgKQotICAgICAgKmFtZXRyaWNzX3hfc2NhbGUgPSB4X3NjYWxlOwotCi0gICAgaWYgKCBhbWV0cmljc195X3NjYWxlICkKLSAgICAgICphbWV0cmljc195X3NjYWxlID0geV9zY2FsZTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9TZXJ2aWNlX1Bmck1ldHJpY3NSZWMgIHBmcl9tZXRyaWNzX3NlcnZpY2VfcmVjID0KLSAgewotICAgIHBmcl9nZXRfbWV0cmljcywgICAgICAgICAgLyogZ2V0X21ldHJpY3MgKi8KLSAgICBwZnJfZmFjZV9nZXRfa2VybmluZywgICAgIC8qIGdldF9rZXJuaW5nICovCi0gICAgcGZyX2dldF9hZHZhbmNlICAgICAgICAgICAvKiBnZXRfYWR2YW5jZSAqLwotICB9OwotCi0KLSAvKgotICAqICBTRVJWSUNFIExJU1QKLSAgKgotICAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgcGZyX3NlcnZpY2VzW10gPQotICB7Ci0gICAgeyBGVF9TRVJWSUNFX0lEX1BGUl9NRVRSSUNTLCAmcGZyX21ldHJpY3Nfc2VydmljZV9yZWMgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsIEZUX0ZPTlRfRk9STUFUX1BGUiB9LAotICAgIHsgTlVMTCwgTlVMTCB9Ci0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX01vZHVsZV9JbnRlcmZhY2UgKQotICBwZnJfZ2V0X3NlcnZpY2UoIEZUX01vZHVsZSAgICAgICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBzZXJ2aWNlX2lkICkKLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0KLSAgICByZXR1cm4gZnRfc2VydmljZV9saXN0X2xvb2t1cCggcGZyX3NlcnZpY2VzLCBzZXJ2aWNlX2lkICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgIHBmcl9kcml2ZXJfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX1NDQUxBQkxFLAotCi0gICAgICBzaXplb2YgKCBGVF9Ecml2ZXJSZWMgKSwKLQotICAgICAgInBmciIsCi0gICAgICAweDEwMDAwTCwKLSAgICAgIDB4MjAwMDBMLAotCi0gICAgICBOVUxMLCAgICAvKiBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogRlRfTW9kdWxlX0NvbnN0cnVjdG9yICBtb2R1bGVfaW5pdCAgICovCi0gICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgbW9kdWxlX2RvbmUgICAqLwotICAgICAgcGZyX2dldF9zZXJ2aWNlICAgICAgICAgICAvKiBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgIGdldF9pbnRlcmZhY2UgKi8KLSAgICB9LAotCi0gICAgc2l6ZW9mICggUEZSX0ZhY2VSZWMgKSwKLSAgICBzaXplb2YgKCBQRlJfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIFBGUl9TbG90UmVjICksCi0KLSAgICBwZnJfZmFjZV9pbml0LCAgICAgICAgICAgICAgLyogRlRfRmFjZV9Jbml0RnVuYyAgaW5pdF9mYWNlICovCi0gICAgcGZyX2ZhY2VfZG9uZSwgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfRG9uZUZ1bmMgIGRvbmVfZmFjZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TaXplX0luaXRGdW5jICBpbml0X3NpemUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9Eb25lRnVuYyAgZG9uZV9zaXplICovCi0gICAgcGZyX3Nsb3RfaW5pdCwgICAgICAgICAgICAgIC8qIEZUX1Nsb3RfSW5pdEZ1bmMgIGluaXRfc2xvdCAqLwotICAgIHBmcl9zbG90X2RvbmUsICAgICAgICAgICAgICAvKiBGVF9TbG90X0RvbmVGdW5jICBkb25lX3Nsb3QgKi8KLQotICAgIHBmcl9zbG90X2xvYWQsICAgICAgICAgICAgICAvKiBGVF9TbG90X0xvYWRGdW5jICBsb2FkX2dseXBoICovCi0KLSAgICBwZnJfZ2V0X2tlcm5pbmcsICAgICAgICAgICAgLyogRlRfRmFjZV9HZXRLZXJuaW5nRnVuYyAgIGdldF9rZXJuaW5nICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0F0dGFjaEZ1bmMgICAgICAgYXR0YWNoX2ZpbGUgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jICBnZXRfYWR2YW5jZXMgKi8KLQotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TaXplX1JlcXVlc3RGdW5jICByZXF1ZXN0X3NpemUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9TZWxlY3RGdW5jICAgc2VsZWN0X3NpemUgICovCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcGZyL3BmcmRyaXZyLmggYi9zcmMvcGZyL3BmcmRyaXZyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWQ1NjAuLjAwMDAwMDAKLS0tIGEvc3JjL3Bmci9wZnJkcml2ci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyZHJpdnIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgVHlwZSBQRlIgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBGUkRSSVZSX0hfCi0jZGVmaW5lIFBGUkRSSVZSX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgKSAgcGZyX2RyaXZlcl9jbGFzczsKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFBGUkRSSVZSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcGZyL3BmcmVycm9yLmggYi9zcmMvcGZyL3BmcmVycm9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDQ0ZTMuLjAwMDAwMDAKLS0tIGEvc3JjL3Bmci9wZnJlcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyZXJyb3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBGUiBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBQRlIgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBQRlJFUlJPUl9IXwotI2RlZmluZSBQRlJFUlJPUl9IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBQRlJfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1BGUgotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogUEZSRVJST1JfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wZnIvcGZyZ2xvYWQuYyBiL3NyYy9wZnIvcGZyZ2xvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmNWZjNy4uMDAwMDAwMAotLS0gYS9zcmMvcGZyL3Bmcmdsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyZ2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBnbHlwaCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAicGZyZ2xvYWQuaCIKLSNpbmNsdWRlICJwZnJzYml0LmgiCi0jaW5jbHVkZSAicGZybG9hZC5oIiAgICAgICAgICAgIC8qIGZvciBtYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAicGZyZXJyb3IuaCIKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9wZnIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBQRlIgR0xZUEggQlVJTERFUiAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcGZyX2dseXBoX2luaXQoIFBGUl9HbHlwaCAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfWkVSTyggZ2x5cGggKTsKLQotICAgIGdseXBoLT5sb2FkZXIgICAgID0gbG9hZGVyOwotICAgIGdseXBoLT5wYXRoX2JlZ3VuID0gMDsKLQotICAgIEZUX0dseXBoTG9hZGVyX1Jld2luZCggbG9hZGVyICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBmcl9nbHlwaF9kb25lKCBQRlJfR2x5cGggIGdseXBoICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZ2x5cGgtPmxvYWRlci0+bWVtb3J5OwotCi0KLSAgICBGVF9GUkVFKCBnbHlwaC0+eF9jb250cm9sICk7Ci0gICAgZ2x5cGgtPnlfY29udHJvbCA9IE5VTEw7Ci0KLSAgICBnbHlwaC0+bWF4X3h5X2NvbnRyb2wgPSAwOwotI2lmIDAKLSAgICBnbHlwaC0+bnVtX3hfY29udHJvbCAgPSAwOwotICAgIGdseXBoLT5udW1feV9jb250cm9sICA9IDA7Ci0jZW5kaWYKLQotICAgIEZUX0ZSRUUoIGdseXBoLT5zdWJzICk7Ci0KLSAgICBnbHlwaC0+bWF4X3N1YnMgPSAwOwotICAgIGdseXBoLT5udW1fc3VicyA9IDA7Ci0KLSAgICBnbHlwaC0+bG9hZGVyICAgICA9IE5VTEw7Ci0gICAgZ2x5cGgtPnBhdGhfYmVndW4gPSAwOwotICB9Ci0KLQotICAvKiBjbG9zZSBjdXJyZW50IGNvbnRvdXIsIGlmIGFueSAqLwotICBzdGF0aWMgdm9pZAotICBwZnJfZ2x5cGhfY2xvc2VfY29udG91ciggUEZSX0dseXBoICBnbHlwaCApCi0gIHsKLSAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyICA9IGdseXBoLT5sb2FkZXI7Ci0gICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0gICAgRlRfSW50ICAgICAgICAgIGxhc3QsIGZpcnN0OwotCi0KLSAgICBpZiAoICFnbHlwaC0+cGF0aF9iZWd1biApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBjb21wdXRlIGZpcnN0IGFuZCBsYXN0IHBvaW50IGluZGljZXMgaW4gY3VycmVudCBnbHlwaCBvdXRsaW5lICovCi0gICAgbGFzdCAgPSBvdXRsaW5lLT5uX3BvaW50cyAtIDE7Ci0gICAgZmlyc3QgPSAwOwotICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyA+IDAgKQotICAgICAgZmlyc3QgPSBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV07Ci0KLSAgICAvKiBpZiB0aGUgbGFzdCBwb2ludCBmYWxscyBvbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgZmlyc3Qgb25lICovCi0gICAgLyogd2UgbmVlZCB0byBkZWxldGUgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggbGFzdCA+IGZpcnN0ICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICBwMSA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwotICAgICAgRlRfVmVjdG9yKiAgcDIgPSBvdXRsaW5lLT5wb2ludHMgKyBsYXN0OwotCi0KLSAgICAgIGlmICggcDEtPnggPT0gcDItPnggJiYgcDEtPnkgPT0gcDItPnkgKQotICAgICAgewotICAgICAgICBvdXRsaW5lLT5uX3BvaW50cy0tOwotICAgICAgICBsYXN0LS07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogZG9uJ3QgYWRkIGVtcHR5IGNvbnRvdXJzICovCi0gICAgaWYgKCBsYXN0ID49IGZpcnN0ICkKLSAgICAgIG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMrK10gPSAoc2hvcnQpbGFzdDsKLQotICAgIGdseXBoLT5wYXRoX2JlZ3VuID0gMDsKLSAgfQotCi0KLSAgLyogcmVzZXQgZ2x5cGggdG8gc3RhcnQgdGhlIGxvYWRpbmcgb2YgYSBuZXcgZ2x5cGggKi8KLSAgc3RhdGljIHZvaWQKLSAgcGZyX2dseXBoX3N0YXJ0KCBQRlJfR2x5cGggIGdseXBoICkKLSAgewotICAgIGdseXBoLT5wYXRoX2JlZ3VuID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBmcl9nbHlwaF9saW5lX3RvKCBQRlJfR2x5cGggICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICkKLSAgewotICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgID0gZ2x5cGgtPmxvYWRlcjsKLSAgICBGVF9PdXRsaW5lKiAgICAgb3V0bGluZSA9ICZsb2FkZXItPmN1cnJlbnQub3V0bGluZTsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIC8qIGNoZWNrIHRoYXQgd2UgaGF2ZSBiZWd1biBhIG5ldyBwYXRoICovCi0gICAgaWYgKCAhZ2x5cGgtPnBhdGhfYmVndW4gKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgIEZUX0VSUk9SKCggInBmcl9nbHlwaF9saW5lX3RvOiBpbnZhbGlkIGdseXBoIGRhdGFcbiIgKSk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGxvYWRlciwgMSwgMCApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIG4gPSBvdXRsaW5lLT5uX3BvaW50czsKLQotCi0gICAgICBvdXRsaW5lLT5wb2ludHNbbl0gPSAqdG87Ci0gICAgICBvdXRsaW5lLT50YWdzICBbbl0gPSBGVF9DVVJWRV9UQUdfT047Ci0KLSAgICAgIG91dGxpbmUtPm5fcG9pbnRzKys7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGZyX2dseXBoX2N1cnZlX3RvKCBQRlJfR2x5cGggICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0byApCi0gIHsKLSAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyICA9IGdseXBoLT5sb2FkZXI7Ci0gICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotCi0KLSAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYmVndW4gYSBuZXcgcGF0aCAqLwotICAgIGlmICggIWdseXBoLT5wYXRoX2JlZ3VuICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBGVF9FUlJPUigoICJwZnJfZ2x5cGhfbGluZV90bzogaW52YWxpZCBnbHlwaCBkYXRhXG4iICkpOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGVycm9yID0gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBsb2FkZXIsIDMsIDAgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjID0gb3V0bGluZS0+cG9pbnRzICAgICAgICAgKyBvdXRsaW5lLT5uX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICAgIHRhZyA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgdmVjWzBdID0gKmNvbnRyb2wxOwotICAgICAgdmVjWzFdID0gKmNvbnRyb2wyOwotICAgICAgdmVjWzJdID0gKnRvOwotICAgICAgdGFnWzBdID0gRlRfQ1VSVkVfVEFHX0NVQklDOwotICAgICAgdGFnWzFdID0gRlRfQ1VSVkVfVEFHX0NVQklDOwotICAgICAgdGFnWzJdID0gRlRfQ1VSVkVfVEFHX09OOwotCi0gICAgICBvdXRsaW5lLT5uX3BvaW50cyA9IChGVF9TaG9ydCkoIG91dGxpbmUtPm5fcG9pbnRzICsgMyApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBmcl9nbHlwaF9tb3ZlX3RvKCBQRlJfR2x5cGggICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICkKLSAgewotICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgID0gZ2x5cGgtPmxvYWRlcjsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIC8qIGNsb3NlIGN1cnJlbnQgY29udG91ciBpZiBhbnkgKi8KLSAgICBwZnJfZ2x5cGhfY2xvc2VfY29udG91ciggZ2x5cGggKTsKLQotICAgIC8qIGluZGljYXRlIHRoYXQgYSBuZXcgY29udG91ciBoYXMgc3RhcnRlZCAqLwotICAgIGdseXBoLT5wYXRoX2JlZ3VuID0gMTsKLQotICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgc3BhY2UgZm9yIGEgbmV3IGNvbnRvdXIgYW5kIGEgbmV3IHBvaW50ICovCi0gICAgZXJyb3IgPSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGxvYWRlciwgMSwgMSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICAvKiBhZGQgbmV3IHN0YXJ0IHBvaW50ICovCi0gICAgICBlcnJvciA9IHBmcl9nbHlwaF9saW5lX3RvKCBnbHlwaCwgdG8gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBmcl9nbHlwaF9lbmQoIFBGUl9HbHlwaCAgZ2x5cGggKQotICB7Ci0gICAgLyogY2xvc2UgY3VycmVudCBjb250b3VyIGlmIGFueSAqLwotICAgIHBmcl9nbHlwaF9jbG9zZV9jb250b3VyKCBnbHlwaCApOwotCi0gICAgLyogbWVyZ2UgdGhlIGN1cnJlbnQgZ2x5cGggaW50byB0aGUgc3RhY2sgKi8KLSAgICBGVF9HbHlwaExvYWRlcl9BZGQoIGdseXBoLT5sb2FkZXIgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIFBGUiBHTFlQSCBMT0FERVIgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBsb2FkIGEgc2ltcGxlIGdseXBoICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwZnJfZ2x5cGhfbG9hZF9zaW1wbGUoIFBGUl9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBnbHlwaC0+bG9hZGVyLT5tZW1vcnk7Ci0gICAgRlRfVUludCAgICBmbGFncywgeF9jb3VudCwgeV9jb3VudCwgaSwgY291bnQsIG1hc2s7Ci0gICAgRlRfSW50ICAgICB4OwotCi0KLSAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICBmbGFncyA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgIC8qIHRlc3QgZm9yIGNvbXBvc2l0ZSBnbHlwaHMgKi8KLSAgICBpZiAoIGZsYWdzICYgUEZSX0dMWVBIX0lTX0NPTVBPVU5EICkKLSAgICAgIGdvdG8gRmFpbHVyZTsKLQotICAgIHhfY291bnQgPSAwOwotICAgIHlfY291bnQgPSAwOwotCi0gICAgaWYgKCBmbGFncyAmIFBGUl9HTFlQSF8xQllURV9YWUNPVU5UICkKLSAgICB7Ci0gICAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICAgIGNvdW50ICAgPSBQRlJfTkVYVF9CWVRFKCBwICk7Ci0gICAgICB4X2NvdW50ID0gY291bnQgJiAxNTsKLSAgICAgIHlfY291bnQgPSBjb3VudCA+PiA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBmbGFncyAmIFBGUl9HTFlQSF9YQ09VTlQgKQotICAgICAgewotICAgICAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICAgICAgeF9jb3VudCA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBmbGFncyAmIFBGUl9HTFlQSF9ZQ09VTlQgKQotICAgICAgewotICAgICAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICAgICAgeV9jb3VudCA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjb3VudCA9IHhfY291bnQgKyB5X2NvdW50OwotCi0gICAgLyogcmUtYWxsb2NhdGUgYXJyYXkgd2hlbiBuZWNlc3NhcnkgKi8KLSAgICBpZiAoIGNvdW50ID4gZ2x5cGgtPm1heF94eV9jb250cm9sICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIGNvdW50LCA4ICk7Ci0KLQotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggZ2x5cGgtPnhfY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tYXhfeHlfY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19tYXggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZ2x5cGgtPm1heF94eV9jb250cm9sID0gbmV3X21heDsKLSAgICB9Ci0KLSAgICBnbHlwaC0+eV9jb250cm9sID0gZ2x5cGgtPnhfY29udHJvbCArIHhfY291bnQ7Ci0KLSAgICBtYXNrID0gMDsKLSAgICB4ICAgID0gMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCi0gICAgewotICAgICAgaWYgKCAoIGkgJiA3ICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIFBGUl9DSEVDSyggMSApOwotICAgICAgICBtYXNrID0gUEZSX05FWFRfQllURSggcCApOwotICAgICAgfQotCi0gICAgICBpZiAoIG1hc2sgJiAxICkKLSAgICAgIHsKLSAgICAgICAgUEZSX0NIRUNLKCAyICk7Ci0gICAgICAgIHggPSBQRlJfTkVYVF9TSE9SVCggcCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICAgICAgeCArPSBQRlJfTkVYVF9CWVRFKCBwICk7Ci0gICAgICB9Ci0KLSAgICAgIGdseXBoLT54X2NvbnRyb2xbaV0gPSB4OwotCi0gICAgICBtYXNrID4+PSAxOwotICAgIH0KLQotICAgIC8qIFhYWDogd2UgaWdub3JlIHRoZSBzZWNvbmRhcnkgc3Ryb2tlIGFuZCBlZGdlIGRlZmluaXRpb25zICovCi0gICAgLyogICAgICBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IG5hdGl2ZSBQRlIgaGludGluZyAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZmxhZ3MgJiBQRlJfR0xZUEhfU0lOR0xFX0VYVFJBX0lURU1TICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBmcl9leHRyYV9pdGVtc19za2lwKCAmcCwgbGltaXQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgcGZyX2dseXBoX3N0YXJ0KCBnbHlwaCApOwotCi0gICAgLyogbm93IGxvYWQgYSBzaW1wbGUgZ2x5cGggKi8KLSAgICB7Ci0gICAgICBGVF9WZWN0b3IgICBwb3NbNF07Ci0gICAgICBGVF9WZWN0b3IqICBjdXI7Ci0KLQotICAgICAgcG9zWzBdLnggPSBwb3NbMF0ueSA9IDA7Ci0gICAgICBwb3NbM10gICA9IHBvc1swXTsKLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgZm9ybWF0LCBmb3JtYXRfbG93LCBhcmdzX2Zvcm1hdCA9IDAsIGFyZ3NfY291bnQsIG47Ci0KLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgcmVhZCBpbnN0cnVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICAgICAgZm9ybWF0ICAgICA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLSAgICAgICAgZm9ybWF0X2xvdyA9IGZvcm1hdCAmIDE1OwotCi0gICAgICAgIHN3aXRjaCAoIGZvcm1hdCA+PiA0ICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgZ2x5cGggKi8KLSAgICAgICAgICBGVF9UUkFDRTYoKCAiLSBlbmQgZ2x5cGgiICkpOwotICAgICAgICAgIGFyZ3NfY291bnQgPSAwOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2VuZXJhbCBsaW5lIG9wZXJhdGlvbiAqLwotICAgICAgICAgIEZUX1RSQUNFNigoICItIGdlbmVyYWwgbGluZSIgKSk7Ci0gICAgICAgICAgZ290byBMaW5lMTsKLQotICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92ZSB0byBpbnNpZGUgY29udG91ciAgKi8KLSAgICAgICAgICBGVF9UUkFDRTYoKCAiLSBtb3ZlIHRvIGluc2lkZSIgKSk7Ci0gICAgICAgICAgZ290byBMaW5lMTsKLQotICAgICAgICBjYXNlIDU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92ZSB0byBvdXRzaWRlIGNvbnRvdXIgKi8KLSAgICAgICAgICBGVF9UUkFDRTYoKCAiLSBtb3ZlIHRvIG91dHNpZGUiICkpOwotICAgICAgICBMaW5lMToKLSAgICAgICAgICBhcmdzX2Zvcm1hdCA9IGZvcm1hdF9sb3c7Ci0gICAgICAgICAgYXJnc19jb3VudCAgPSAxOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgbGluZSB0byAqLwotICAgICAgICAgIEZUX1RSQUNFNigoICItIGhvcml6b250YWwgbGluZSB0byBjeC4lZCIsIGZvcm1hdF9sb3cgKSk7Ci0gICAgICAgICAgaWYgKCBmb3JtYXRfbG93ID49IHhfY291bnQgKQotICAgICAgICAgICAgZ290byBGYWlsdXJlOwotICAgICAgICAgIHBvc1swXS54ICAgPSBnbHlwaC0+eF9jb250cm9sW2Zvcm1hdF9sb3ddOwotICAgICAgICAgIHBvc1swXS55ICAgPSBwb3NbM10ueTsKLSAgICAgICAgICBwb3NbM10gICAgID0gcG9zWzBdOwotICAgICAgICAgIGFyZ3NfY291bnQgPSAwOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmVydGljYWwgbGluZSB0byAqLwotICAgICAgICAgIEZUX1RSQUNFNigoICItIHZlcnRpY2FsIGxpbmUgdG8gY3kuJWQiLCBmb3JtYXRfbG93ICkpOwotICAgICAgICAgIGlmICggZm9ybWF0X2xvdyA+PSB5X2NvdW50ICkKLSAgICAgICAgICAgIGdvdG8gRmFpbHVyZTsKLSAgICAgICAgICBwb3NbMF0ueCAgID0gcG9zWzNdLng7Ci0gICAgICAgICAgcG9zWzBdLnkgICA9IGdseXBoLT55X2NvbnRyb2xbZm9ybWF0X2xvd107Ci0gICAgICAgICAgcG9zWzNdICAgICA9IHBvc1swXTsKLSAgICAgICAgICBhcmdzX2NvdW50ID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgdG8gdmVydGljYWwgY3VydmUgKi8KLSAgICAgICAgICBGVF9UUkFDRTYoKCAiLSBodiBjdXJ2ZSAiICkpOwotICAgICAgICAgIGFyZ3NfZm9ybWF0ID0gMHhCOEU7Ci0gICAgICAgICAgYXJnc19jb3VudCAgPSAzOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNzogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmVydGljYWwgdG8gaG9yaXpvbnRhbCBjdXJ2ZSAqLwotICAgICAgICAgIEZUX1RSQUNFNigoICItIHZoIGN1cnZlIiApKTsKLSAgICAgICAgICBhcmdzX2Zvcm1hdCA9IDB4RTJCOwotICAgICAgICAgIGFyZ3NfY291bnQgID0gMzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdlbmVyYWwgY3VydmUgdG8gKi8KLSAgICAgICAgICBGVF9UUkFDRTYoKCAiLSBnZW5lcmFsIGN1cnZlIiApKTsKLSAgICAgICAgICBhcmdzX2NvdW50ICA9IDQ7Ci0gICAgICAgICAgYXJnc19mb3JtYXQgPSBmb3JtYXRfbG93OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgbm93IHJlYWQgYXJndW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgY3VyID0gcG9zOwotICAgICAgICBmb3IgKCBuID0gMDsgbiA8IGFyZ3NfY291bnQ7IG4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBpZHg7Ci0gICAgICAgICAgRlRfSW50ICAgZGVsdGE7Ci0KLQotICAgICAgICAgIC8qIHJlYWQgdGhlIFggYXJndW1lbnQgKi8KLSAgICAgICAgICBzd2l0Y2ggKCBhcmdzX2Zvcm1hdCAmIDMgKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOC1iaXQgaW5kZXggKi8KLSAgICAgICAgICAgIFBGUl9DSEVDSyggMSApOwotICAgICAgICAgICAgaWR4ID0gUEZSX05FWFRfQllURSggcCApOwotICAgICAgICAgICAgaWYgKCBpZHggPj0geF9jb3VudCApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbHVyZTsKLSAgICAgICAgICAgIGN1ci0+eCA9IGdseXBoLT54X2NvbnRyb2xbaWR4XTsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgY3gjJWQiLCBpZHggKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNi1iaXQgYWJzb2x1dGUgdmFsdWUgKi8KLSAgICAgICAgICAgIFBGUl9DSEVDSyggMiApOwotICAgICAgICAgICAgY3VyLT54ID0gUEZSX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgeC4lZCIsIGN1ci0+eCApKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDgtYml0IGRlbHRhICovCi0gICAgICAgICAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICAgICAgICAgIGRlbHRhICA9IFBGUl9ORVhUX0lOVDgoIHAgKTsKLSAgICAgICAgICAgIGN1ci0+eCA9IHBvc1szXS54ICsgZGVsdGE7Ci0gICAgICAgICAgICBGVF9UUkFDRTcoKCAiIGR4LiVkIiwgZGVsdGEgKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBGVF9UUkFDRTcoKCAiIHwiICkpOwotICAgICAgICAgICAgY3VyLT54ID0gcG9zWzNdLng7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogcmVhZCB0aGUgWSBhcmd1bWVudCAqLwotICAgICAgICAgIHN3aXRjaCAoICggYXJnc19mb3JtYXQgPj4gMiApICYgMyApCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBpbmRleCAqLwotICAgICAgICAgICAgUEZSX0NIRUNLKCAxICk7Ci0gICAgICAgICAgICBpZHggID0gUEZSX05FWFRfQllURSggcCApOwotICAgICAgICAgICAgaWYgKCBpZHggPj0geV9jb3VudCApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbHVyZTsKLSAgICAgICAgICAgIGN1ci0+eSA9IGdseXBoLT55X2NvbnRyb2xbaWR4XTsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgY3kjJWQiLCBpZHggKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNi1iaXQgYWJzb2x1dGUgdmFsdWUgKi8KLSAgICAgICAgICAgIFBGUl9DSEVDSyggMiApOwotICAgICAgICAgICAgY3VyLT55ID0gUEZSX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgeS4lZCIsIGN1ci0+eSApKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDgtYml0IGRlbHRhICovCi0gICAgICAgICAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICAgICAgICAgIGRlbHRhICA9IFBGUl9ORVhUX0lOVDgoIHAgKTsKLSAgICAgICAgICAgIGN1ci0+eSA9IHBvc1szXS55ICsgZGVsdGE7Ci0gICAgICAgICAgICBGVF9UUkFDRTcoKCAiIGR5LiVkIiwgZGVsdGEgKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBGVF9UUkFDRTcoKCAiIC0iICkpOwotICAgICAgICAgICAgY3VyLT55ID0gcG9zWzNdLnk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogcmVhZCB0aGUgYWRkaXRpb25hbCBmb3JtYXQgZmxhZyBmb3IgdGhlIGdlbmVyYWwgY3VydmUgKi8KLSAgICAgICAgICBpZiAoIG4gPT0gMCAmJiBhcmdzX2NvdW50ID09IDQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBGUl9DSEVDSyggMSApOwotICAgICAgICAgICAgYXJnc19mb3JtYXQgPSBQRlJfTkVYVF9CWVRFKCBwICk7Ci0gICAgICAgICAgICBhcmdzX2NvdW50LS07Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFyZ3NfZm9ybWF0ID4+PSA0OwotCi0gICAgICAgICAgLyogc2F2ZSB0aGUgcHJldmlvdXMgcG9pbnQgKi8KLSAgICAgICAgICBwb3NbM10gPSBjdXJbMF07Ci0gICAgICAgICAgY3VyKys7Ci0gICAgICAgIH0KLQotICAgICAgICBGVF9UUkFDRTcoKCAiXG4iICkpOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogIGZpbmFsbHksIGV4ZWN1dGUgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHN3aXRjaCAoIGZvcm1hdCA+PiA0ICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGdseXBoID0+IEVYSVQgKi8KLSAgICAgICAgICBwZnJfZ2x5cGhfZW5kKCBnbHlwaCApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW5lIG9wZXJhdGlvbnMgKi8KLSAgICAgICAgY2FzZSAyOgotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgZXJyb3IgPSBwZnJfZ2x5cGhfbGluZV90byggZ2x5cGgsIHBvcyApOwotICAgICAgICAgIGdvdG8gVGVzdF9FcnJvcjsKLQotICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92ZSB0byBpbnNpZGUgY29udG91ciAgKi8KLSAgICAgICAgY2FzZSA1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgdG8gb3V0c2lkZSBjb250b3VyICovCi0gICAgICAgICAgZXJyb3IgPSBwZnJfZ2x5cGhfbW92ZV90byggZ2x5cGgsIHBvcyApOwotICAgICAgICAgIGdvdG8gVGVzdF9FcnJvcjsKLQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnZlIG9wZXJhdGlvbnMgKi8KLSAgICAgICAgICBlcnJvciA9IHBmcl9nbHlwaF9jdXJ2ZV90byggZ2x5cGgsIHBvcywgcG9zICsgMSwgcG9zICsgMiApOwotCi0gICAgICAgIFRlc3RfRXJyb3I6ICAvKiB0ZXN0IGVycm9yIGNvbmRpdGlvbiAqLwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9IC8qIGZvciAoOzspICovCi0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEZhaWx1cmU6Ci0gIFRvb19TaG9ydDoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgRlRfRVJST1IoKCAicGZyX2dseXBoX2xvYWRfc2ltcGxlOiBpbnZhbGlkIGdseXBoIGRhdGFcbiIgKSk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICAvKiBsb2FkIGEgY29tcG9zaXRlL2NvbXBvdW5kIGdseXBoICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwZnJfZ2x5cGhfbG9hZF9jb21wb3VuZCggUEZSX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyID0gZ2x5cGgtPmxvYWRlcjsKLSAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ID0gbG9hZGVyLT5tZW1vcnk7Ci0gICAgUEZSX1N1YkdseXBoICAgIHN1YmdseXBoOwotICAgIEZUX1VJbnQgICAgICAgICBmbGFncywgaSwgY291bnQsIG9yZ19jb3VudDsKLSAgICBGVF9JbnQgICAgICAgICAgeF9wb3MsIHlfcG9zOwotCi0KLSAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICBmbGFncyA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgIC8qIHRlc3QgZm9yIGNvbXBvc2l0ZSBnbHlwaHMgKi8KLSAgICBpZiAoICEoIGZsYWdzICYgUEZSX0dMWVBIX0lTX0NPTVBPVU5EICkgKQotICAgICAgZ290byBGYWlsdXJlOwotCi0gICAgY291bnQgPSBmbGFncyAmIDB4M0Y7Ci0KLSAgICAvKiBpZ25vcmUgZXh0cmEgaXRlbXMgd2hlbiBwcmVzZW50ICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZmxhZ3MgJiBQRlJfR0xZUEhfQ09NUE9VTkRfRVhUUkFfSVRFTVMgKQotICAgIHsKLSAgICAgIGVycm9yID0gcGZyX2V4dHJhX2l0ZW1zX3NraXAoICZwLCBsaW1pdCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiB3ZSBjYW4ndCByZWx5IG9uIHRoZSBGVF9HbHlwaExvYWRlciB0byBsb2FkIHN1Yi1nbHlwaHMsIGJlY2F1c2UgICAqLwotICAgIC8qIHRoZSBQRlIgZm9ybWF0IGlzIGR1bWIsIHVzaW5nIGRpcmVjdCBmaWxlIG9mZnNldHMgdG8gcG9pbnQgdG8gdGhlICovCi0gICAgLyogc3ViLWdseXBocyAoaW5zdGVhZCBvZiBnbHlwaCBpbmRpY2VzKS4gIFNpZ2guICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEZvciBub3csIHdlIGxvYWQgdGhlIGxpc3Qgb2Ygc3ViLWdseXBocyBpbnRvIGEgZGlmZmVyZW50IGFycmF5ICAgICovCi0gICAgLyogYnV0IHRoaXMgd2lsbCBwcmV2ZW50IHVzIGZyb20gdXNpbmcgdGhlIGF1dG8taGludGVyIGF0IGl0cyBiZXN0ICAgKi8KLSAgICAvKiBxdWFsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgb3JnX2NvdW50ID0gZ2x5cGgtPm51bV9zdWJzOwotCi0gICAgaWYgKCBvcmdfY291bnQgKyBjb3VudCA+IGdseXBoLT5tYXhfc3VicyApCi0gICAgewotICAgICAgRlRfVUludCAgbmV3X21heCA9ICggb3JnX2NvdW50ICsgY291bnQgKyAzICkgJiAoRlRfVUludCktNDsKLQotCi0gICAgICAvKiB3ZSBhcmJpdHJhcmlseSBsaW1pdCB0aGUgbnVtYmVyIG9mIHN1YmdseXBocyAqLwotICAgICAgLyogdG8gYXZvaWQgZW5kbGVzcyByZWN1cnNpb24gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggbmV3X21heCA+IDY0ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBGVF9FUlJPUigoICJwZnJfZ2x5cGhfbG9hZF9jb21wb3VuZDoiCi0gICAgICAgICAgICAgICAgICAgIiB0b28gbWFueSBjb21wb3VuZCBnbHlwaHMgY29tcG9uZW50c1xuIiApKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBnbHlwaC0+c3VicywgZ2x5cGgtPm1heF9zdWJzLCBuZXdfbWF4ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGdseXBoLT5tYXhfc3VicyA9IG5ld19tYXg7Ci0gICAgfQotCi0gICAgc3ViZ2x5cGggPSBnbHlwaC0+c3VicyArIG9yZ19jb3VudDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ViZ2x5cGgrKyApCi0gICAgewotICAgICAgRlRfVUludCAgZm9ybWF0OwotCi0KLSAgICAgIHhfcG9zID0gMDsKLSAgICAgIHlfcG9zID0gMDsKLQotICAgICAgUEZSX0NIRUNLKCAxICk7Ci0gICAgICBmb3JtYXQgPSBQRlJfTkVYVF9CWVRFKCBwICk7Ci0KLSAgICAgIC8qIHJlYWQgc2NhbGUgd2hlbiBhdmFpbGFibGUgKi8KLSAgICAgIHN1YmdseXBoLT54X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBpZiAoIGZvcm1hdCAmIFBGUl9TVUJHTFlQSF9YU0NBTEUgKQotICAgICAgewotICAgICAgICBQRlJfQ0hFQ0soIDIgKTsKLSAgICAgICAgc3ViZ2x5cGgtPnhfc2NhbGUgPSBQRlJfTkVYVF9TSE9SVCggcCApICogMTY7Ci0gICAgICB9Ci0KLSAgICAgIHN1YmdseXBoLT55X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBpZiAoIGZvcm1hdCAmIFBGUl9TVUJHTFlQSF9ZU0NBTEUgKQotICAgICAgewotICAgICAgICBQRlJfQ0hFQ0soIDIgKTsKLSAgICAgICAgc3ViZ2x5cGgtPnlfc2NhbGUgPSBQRlJfTkVYVF9TSE9SVCggcCApICogMTY7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHJlYWQgb2Zmc2V0ICovCi0gICAgICBzd2l0Y2ggKCBmb3JtYXQgJiAzICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgUEZSX0NIRUNLKCAyICk7Ci0gICAgICAgIHhfcG9zID0gUEZSX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgICAgUEZSX0NIRUNLKCAxICk7Ci0gICAgICAgIHhfcG9zICs9IFBGUl9ORVhUX0lOVDgoIHAgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIDsKLSAgICAgIH0KLQotICAgICAgc3dpdGNoICggKCBmb3JtYXQgPj4gMiApICYgMyApCi0gICAgICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIFBGUl9DSEVDSyggMiApOwotICAgICAgICB5X3BvcyA9IFBGUl9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICAgIFBGUl9DSEVDSyggMSApOwotICAgICAgICB5X3BvcyArPSBQRlJfTkVYVF9JTlQ4KCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICA7Ci0gICAgICB9Ci0KLSAgICAgIHN1YmdseXBoLT54X2RlbHRhID0geF9wb3M7Ci0gICAgICBzdWJnbHlwaC0+eV9kZWx0YSA9IHlfcG9zOwotCi0gICAgICAvKiByZWFkIGdseXBoIHBvc2l0aW9uIGFuZCBzaXplIG5vdyAqLwotICAgICAgaWYgKCBmb3JtYXQgJiBQRlJfU1VCR0xZUEhfMkJZVEVfU0laRSApCi0gICAgICB7Ci0gICAgICAgIFBGUl9DSEVDSyggMiApOwotICAgICAgICBzdWJnbHlwaC0+Z3BzX3NpemUgPSBQRlJfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgUEZSX0NIRUNLKCAxICk7Ci0gICAgICAgIHN1YmdseXBoLT5ncHNfc2l6ZSA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBmb3JtYXQgJiBQRlJfU1VCR0xZUEhfM0JZVEVfT0ZGU0VUICkKLSAgICAgIHsKLSAgICAgICAgUEZSX0NIRUNLKCAzICk7Ci0gICAgICAgIHN1YmdseXBoLT5ncHNfb2Zmc2V0ID0gUEZSX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgUEZSX0NIRUNLKCAyICk7Ci0gICAgICAgIHN1YmdseXBoLT5ncHNfb2Zmc2V0ID0gUEZSX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICB9Ci0KLSAgICAgIGdseXBoLT5udW1fc3VicysrOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsdXJlOgotICBUb29fU2hvcnQ6Ci0gICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgIEZUX0VSUk9SKCggInBmcl9nbHlwaF9sb2FkX2NvbXBvdW5kOiBpbnZhbGlkIGdseXBoIGRhdGFcbiIgKSk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGZyX2dseXBoX2xvYWRfcmVjKCBQRlJfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgZ3BzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX0J5dGUqICBsaW1pdDsKLQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZ3BzX29mZnNldCArIG9mZnNldCApIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggc2l6ZSApICAgICAgICAgICAgICAgICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHAgICAgID0gKEZUX0J5dGUqKXN0cmVhbS0+Y3Vyc29yOwotICAgIGxpbWl0ID0gcCArIHNpemU7Ci0KLSAgICBpZiAoIHNpemUgPiAwICYmICpwICYgUEZSX0dMWVBIX0lTX0NPTVBPVU5EICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICAgICAgbiwgb2xkX2NvdW50LCBjb3VudDsKLSAgICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgPSBnbHlwaC0+bG9hZGVyOwotICAgICAgRlRfT3V0bGluZSogICAgIGJhc2UgICA9ICZsb2FkZXItPmJhc2Uub3V0bGluZTsKLQotCi0gICAgICBvbGRfY291bnQgPSBnbHlwaC0+bnVtX3N1YnM7Ci0KLSAgICAgIC8qIHRoaXMgaXMgYSBjb21wb3VuZCBnbHlwaCAtIGxvYWQgaXQgKi8KLSAgICAgIGVycm9yID0gcGZyX2dseXBoX2xvYWRfY29tcG91bmQoIGdseXBoLCBwLCBsaW1pdCApOwotCi0gICAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9zdWJzIC0gb2xkX2NvdW50OwotCi0gICAgICBGVF9UUkFDRTQoKCAiY29tcG91bmQgZ2x5cGggd2l0aCAlZCBlbGVtZW50cyAob2Zmc2V0ICVsdSk6XG4iLAotICAgICAgICAgICAgICAgICAgY291bnQsIG9mZnNldCApKTsKLQotICAgICAgLyogbm93LCBsb2FkIGVhY2ggaW5kaXZpZHVhbCBnbHlwaCAqLwotICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICAgICAgICBpLCBvbGRfcG9pbnRzLCBudW1fcG9pbnRzOwotICAgICAgICBQRlJfU3ViR2x5cGggIHN1YmdseXBoOwotCi0KLSAgICAgICAgRlRfVFJBQ0U0KCggIiAgc3ViZ2x5cGggJWQ6XG4iLCBuICkpOwotCi0gICAgICAgIHN1YmdseXBoICAgPSBnbHlwaC0+c3VicyArIG9sZF9jb3VudCArIG47Ci0gICAgICAgIG9sZF9wb2ludHMgPSBiYXNlLT5uX3BvaW50czsKLQotICAgICAgICBlcnJvciA9IHBmcl9nbHlwaF9sb2FkX3JlYyggZ2x5cGgsIHN0cmVhbSwgZ3BzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmdseXBoLT5ncHNfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgtPmdwc19zaXplICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIG5vdGUgdGhhdCBgZ2x5cGgtPnN1YnMnIG1pZ2h0IGhhdmUgYmVlbiByZS1hbGxvY2F0ZWQgKi8KLSAgICAgICAgc3ViZ2x5cGggICA9IGdseXBoLT5zdWJzICsgb2xkX2NvdW50ICsgbjsKLSAgICAgICAgbnVtX3BvaW50cyA9IGJhc2UtPm5fcG9pbnRzIC0gb2xkX3BvaW50czsKLQotICAgICAgICAvKiB0cmFuc2xhdGUgYW5kIGV2ZW50dWFsbHkgc2NhbGUgdGhlIG5ldyBnbHlwaCBwb2ludHMgKi8KLSAgICAgICAgaWYgKCBzdWJnbHlwaC0+eF9zY2FsZSAhPSAweDEwMDAwTCB8fCBzdWJnbHlwaC0+eV9zY2FsZSAhPSAweDEwMDAwTCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMgPSBiYXNlLT5wb2ludHMgKyBvbGRfcG9pbnRzOwotCi0KLSAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wb2ludHM7IGkrKywgdmVjKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZlYy0+eCA9IEZUX011bEZpeCggdmVjLT54LCBzdWJnbHlwaC0+eF9zY2FsZSApICsKLSAgICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgtPnhfZGVsdGE7Ci0gICAgICAgICAgICB2ZWMtPnkgPSBGVF9NdWxGaXgoIHZlYy0+eSwgc3ViZ2x5cGgtPnlfc2NhbGUgKSArCi0gICAgICAgICAgICAgICAgICAgICAgIHN1YmdseXBoLT55X2RlbHRhOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMgPSBsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKyBvbGRfcG9pbnRzOwotCi0KLSAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wb2ludHM7IGkrKywgdmVjKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZlYy0+eCArPSBzdWJnbHlwaC0+eF9kZWx0YTsKLSAgICAgICAgICAgIHZlYy0+eSArPSBzdWJnbHlwaC0+eV9kZWx0YTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwcm9jZWVkIHRvIG5leHQgc3ViLWdseXBoICovCi0gICAgICB9Ci0KLSAgICAgIEZUX1RSQUNFNCgoICJlbmQgY29tcG91bmQgZ2x5cGggd2l0aCAlZCBlbGVtZW50c1xuIiwgY291bnQgKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9UUkFDRTQoKCAic2ltcGxlIGdseXBoIChvZmZzZXQgJWx1KVxuIiwgb2Zmc2V0ICkpOwotCi0gICAgICAvKiBsb2FkIGEgc2ltcGxlIGdseXBoICovCi0gICAgICBlcnJvciA9IHBmcl9nbHlwaF9sb2FkX3NpbXBsZSggZ2x5cGgsIHAsIGxpbWl0ICk7Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwZnJfZ2x5cGhfbG9hZCggUEZSX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBncHNfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHNpemUgKQotICB7Ci0gICAgLyogaW5pdGlhbGl6ZSBnbHlwaCBsb2FkZXIgKi8KLSAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGdseXBoLT5sb2FkZXIgKTsKLQotICAgIGdseXBoLT5udW1fc3VicyA9IDA7Ci0KLSAgICAvKiBsb2FkIHRoZSBnbHlwaCwgcmVjdXJzaXZlbHkgd2hlbiBuZWVkZWQgKi8KLSAgICByZXR1cm4gcGZyX2dseXBoX2xvYWRfcmVjKCBnbHlwaCwgc3RyZWFtLCBncHNfb2Zmc2V0LCBvZmZzZXQsIHNpemUgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJnbG9hZC5oIGIvc3JjL3Bmci9wZnJnbG9hZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjEyMzIzLi4wMDAwMDAwCi0tLSBhL3NyYy9wZnIvcGZyZ2xvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBmcmdsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQRlIgZ2x5cGggbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBQRlJHTE9BRF9IXwotI2RlZmluZSBQRlJHTE9BRF9IXwotCi0jaW5jbHVkZSAicGZydHlwZXMuaCIKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBmcl9nbHlwaF9pbml0KCBQRlJfR2x5cGggICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwZnJfZ2x5cGhfZG9uZSggUEZSX0dseXBoICBnbHlwaCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcGZyX2dseXBoX2xvYWQoIFBGUl9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgZ3BzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBzaXplICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBQRlJHTE9BRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJsb2FkLmMgYi9zcmMvcGZyL3BmcmxvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4NDE2NS4uMDAwMDAwMAotLS0gYS9zcmMvcGZyL3BmcmxvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZybG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAicGZybG9hZC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLQotI2luY2x1ZGUgInBmcmVycm9yLmgiCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcGZyCi0KLQotICAvKgotICAgKiAgVGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGEgUEZSIGZpbGUgaXMgYXMgZm9sbG93cy4KLSAgICoKLSAgICogICAgUEZSIGhlYWRlcgotICAgKiAgICAgIDU4IGJ5dGVzIChjb250YWlucyBuUGh5c0ZvbnRzKQotICAgKgotICAgKiAgICBMb2dpY2FsIGZvbnQgZGlyZWN0b3J5IChzaXplIGF0IG1vc3QgMl4xNiBieXRlcykKLSAgICogICAgICAyIGJ5dGVzIChuTG9nRm9udHMpCi0gICAqICAgICAgKyBuTG9nRm9udHMgKiA1IGJ5dGVzCi0gICAqCi0gICAqICAgICAgICAgPT0+ICAgbkxvZ0ZvbnRzIDw9IDEzMTA2Ci0gICAqCi0gICAqICAgIExvZ2ljYWwgZm9udCBzZWN0aW9uIChzaXplIGF0IG1vc3QgMl4yNCBieXRlcykKLSAgICogICAgICBuTG9nRm9udHMgKiBsb2dGb250UmVjb3JkCi0gICAqCi0gICAqICAgICAgbG9nRm9udFJlY29yZCAoc2l6ZSBhdCBtb3N0IDJeMTYgYnl0ZXMpCi0gICAqICAgICAgICAxMiBieXRlcyAoZm9udE1hdHJpeCkKLSAgICogICAgICAgICsgMSBieXRlIChmbGFncykKLSAgICogICAgICAgICsgMC01IGJ5dGVzIChkZXBlbmRpbmcgb24gYGZsYWdzJykKLSAgICogICAgICAgICsgMC0oMSsyNTUqKDIrMjU1KSkgPSAwLTY1NTM2IChkZXBlbmRpbmcgb24gYGZsYWdzJykKLSAgICogICAgICAgICsgNSBieXRlcyAocGh5c2ljYWwgZm9udCBpbmZvKQotICAgKiAgICAgICAgKyAwLTEgYnl0ZXMgKGRlcGVuZGluZyBvbiBQRlIgaGVhZGVyKQotICAgKgotICAgKiAgICAgICAgID09PiAgIG1pbmltdW0gc2l6ZSAxOCBieXRlcwotICAgKgotICAgKiAgICBQaHlzaWNhbCBmb250IHNlY3Rpb24gKHNpemUgYXQgbW9zdCAyXjI0IGJ5dGVzKQotICAgKiAgICAgIG5QaHlzRm9udHMgKiAocGh5c0ZvbnRSZWNvcmQKLSAgICogICAgICAgICAgICAgICAgICAgICsgbkJpdG1hcFNpemVzICogbkJtYXBDaGFycyAqIGJtYXBDaGFyUmVjb3JkKQotICAgKgotICAgKiAgICAgIHBoeXNGb250UmVjb3JkIChzaXplIGF0IG1vc3QgMl4yNCBieXRlcykKLSAgICogICAgICAgIDE0IGJ5dGVzIChmb250IGluZm8pCi0gICAqICAgICAgICArIDEgYnl0ZSAoZmxhZ3MpCi0gICAqICAgICAgICArIDAtMiAoZGVwZW5kaW5nIG9uIGBmbGFncycpCi0gICAqICAgICAgICArIDAtPyAoc3RydWN0dXJlIHRvbyBjb21wbGljYXRlZCB0byBiZSBzaG93biBoZXJlOyBkZXBlbmRpbmcgb24KLSAgICogICAgICAgICAgICAgICBgZmxhZ3MnOyBjb250YWlucyBgbkJpdG1hcFNpemVzJyBhbmQgYG5CbWFwQ2hhcnMnKQotICAgKiAgICAgICAgKyAzIGJ5dGVzIChuQXV4Qnl0ZXMpCi0gICAqICAgICAgICArIG5BdXhCeXRlcwotICAgKiAgICAgICAgKyAxIGJ5dGUgKG5CbHVlVmFsdWVzKQotICAgKiAgICAgICAgKyAyICogbkJsdWVWYWx1ZXMKLSAgICogICAgICAgICsgNiBieXRlcyAoaGludGluZyBkYXRhKQotICAgKiAgICAgICAgKyAyIGJ5dGVzIChuQ2hhcmFjdGVycykKLSAgICogICAgICAgICsgbkNoYXJhY3RlcnMgKiAoNC0xMCBieXRlcykgKGRlcGVuZGluZyBvbiBgZmxhZ3MnKQotICAgKgotICAgKiAgICAgICAgID09PiAgIG1pbmltdW0gc2l6ZSAyNyBieXRlcwotICAgKgotICAgKiAgICAgIGJtYXBDaGFyUmVjb3JkCi0gICAqICAgICAgICA0LTcgYnl0ZXMKLSAgICoKLSAgICogICAgR2x5cGggcHJvZ3JhbSBzdHJpbmdzICh0aHJlZSBwb3NzaWJsZSB0eXBlczogc2ltcGxlR3BzLCBjb21wb3VuZEdwcywKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYml0bWFwR3BzOyBzaXplIGF0IG1vc3QgMl4yNCBieXRlcykKLSAgICogICAgICBzaW1wbGVHcHMgKHNpemUgYXQgbW9zdCAyXjE2IGJ5dGVzKQotICAgKiAgICAgICAgMSBieXRlIChmbGFncykKLSAgICogICAgICAgIDEtMiBieXRlcyAobltYWV1vcnVzLCBkZXBlbmRpbmcgb24gYGZsYWdzJykKLSAgICogICAgICAgIDAtKDY0KzUxMioyKSA9IDAtMTA4OCBieXRlcyAoZGVwZW5kaW5nIG9uIGBuW1hZXW9ydXMnKQotICAgKiAgICAgICAgMC0/IChzdHJ1Y3R1cmUgdG9vIGNvbXBsaWNhdGVkIHRvIGJlIHNob3duIGhlcmU7IGRlcGVuZGluZyBvbgotICAgKiAgICAgICAgICAgICBgZmxhZ3MnKQotICAgKiAgICAgICAgMS0/IGdseXBoIGRhdGEgKGZhaW50bHkgcmVzZW1ibGluZyBQUyBUeXBlIDEgY2hhcnN0cmluZ3MpCi0gICAqCi0gICAqICAgICAgICAgPT0+ICAgbWluaW11bSBzaXplIDMgYnl0ZXMKLSAgICoKLSAgICogICAgICBjb21wb3VuZEdwcyAoc2l6ZSBhdCBtb3N0IDJeMTYgYnl0ZXMpCi0gICAqICAgICAgICAxIGJ5dGUgKG5FbGVtZW50cyA8PSA2MywgZmxhZ3MpCi0gICAqICAgICAgICArIDAtKDErMjU1KigyKzI1NSkpID0gMC02NTUzNiAoZGVwZW5kaW5nIG9uIGBmbGFncycpCi0gICAqICAgICAgICArIG5FbGVtZW50cyAqICg2LTE0IGJ5dGVzKQotICAgKgotICAgKiAgICAgIGJpdG1hcEdwcyAoc2l6ZSBhdCBtb3N0IDJeMTYgYnl0ZXMpCi0gICAqICAgICAgICAxIGJ5dGUgKGZsYWdzKQotICAgKiAgICAgICAgMy0xMyBieXRlcyAocG9zaXRpb24gaW5mbywgZGVwZW5kaW5nIG9uIGBmbGFncycpCi0gICAqICAgICAgICAwLT8gYml0bWFwIGRhdGEKLSAgICoKLSAgICogICAgICAgICA9PT4gICBtaW5pbXVtIHNpemUgNCBieXRlcwotICAgKgotICAgKiAgICBQRlIgdHJhaWxlcgotICAgKiAgICAgICAgOCBieXRlcwotICAgKgotICAgKgotICAgKiA9PT4gICBtaW5pbXVtIHNpemUgb2YgYSB2YWxpZCBQRlI6Ci0gICAqICAgICAgICAgNTggKGhlYWRlcikKLSAgICogICAgICAgICArIDIgKG5Mb2dGb250cykKLSAgICogICAgICAgICArIDI3ICgxIHBoeXNGb250UmVjb3JkKQotICAgKiAgICAgICAgICsgOCAodHJhaWxlcikKLSAgICogICAgICAgIC0tLS0tCi0gICAqICAgICAgICAgOTUgYnl0ZXMKLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBIElURU1TICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwZnJfZXh0cmFfaXRlbXNfc2tpcCggRlRfQnl0ZSogICpwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgcmV0dXJuIHBmcl9leHRyYV9pdGVtc19wYXJzZSggcHAsIGxpbWl0LCBOVUxMLCBOVUxMICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwZnJfZXh0cmFfaXRlbXNfcGFyc2UoIEZUX0J5dGUqICAgICAgICpwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUEZSX0V4dHJhSXRlbSAgIGl0ZW1fbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgaXRlbV9kYXRhICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9CeXRlKiAgcCAgICAgPSAqcHA7Ci0gICAgRlRfVUludCAgIG51bV9pdGVtcywgaXRlbV90eXBlLCBpdGVtX3NpemU7Ci0KLQotICAgIFBGUl9DSEVDSyggMSApOwotICAgIG51bV9pdGVtcyA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgIGZvciAoIDsgbnVtX2l0ZW1zID4gMDsgbnVtX2l0ZW1zLS0gKQotICAgIHsKLSAgICAgIFBGUl9DSEVDSyggMiApOwotICAgICAgaXRlbV9zaXplID0gUEZSX05FWFRfQllURSggcCApOwotICAgICAgaXRlbV90eXBlID0gUEZSX05FWFRfQllURSggcCApOwotCi0gICAgICBQRlJfQ0hFQ0soIGl0ZW1fc2l6ZSApOwotCi0gICAgICBpZiAoIGl0ZW1fbGlzdCApCi0gICAgICB7Ci0gICAgICAgIFBGUl9FeHRyYUl0ZW0gIGV4dHJhID0gaXRlbV9saXN0OwotCi0KLSAgICAgICAgZm9yICggZXh0cmEgPSBpdGVtX2xpc3Q7IGV4dHJhLT5wYXJzZXIgIT0gTlVMTDsgZXh0cmErKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGV4dHJhLT50eXBlID09IGl0ZW1fdHlwZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgZXJyb3IgPSBleHRyYS0+cGFyc2VyKCBwLCBwICsgaXRlbV9zaXplLCBpdGVtX2RhdGEgKTsKLSAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwICs9IGl0ZW1fc2l6ZTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICAqcHAgPSBwOwotICAgIHJldHVybiBlcnJvcjsKLQotICBUb29fU2hvcnQ6Ci0gICAgRlRfRVJST1IoKCAicGZyX2V4dHJhX2l0ZW1zX3BhcnNlOiBpbnZhbGlkIGV4dHJhIGl0ZW1zIHRhYmxlXG4iICkpOwotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgUEZSIEhFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBmcl9oZWFkZXJfZmllbGRzW10gPQotICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBQRlJfSGVhZGVyUmVjCi0KLSAgICAgRlRfRlJBTUVfU1RBUlQoIDU4ICksCi0gICAgICAgRlRfRlJBTUVfVUxPTkcgKCBzaWduYXR1cmUgKSwKLSAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHZlcnNpb24gKSwKLSAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHNpZ25hdHVyZTIgKSwKLSAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGhlYWRlcl9zaXplICksCi0KLSAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGxvZ19kaXJfc2l6ZSApLAotICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbG9nX2Rpcl9vZmZzZXQgKSwKLQotICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbG9nX2ZvbnRfbWF4X3NpemUgKSwKLSAgICAgICBGVF9GUkFNRV9VT0ZGMyAoIGxvZ19mb250X3NlY3Rpb25fc2l6ZSApLAotICAgICAgIEZUX0ZSQU1FX1VPRkYzICggbG9nX2ZvbnRfc2VjdGlvbl9vZmZzZXQgKSwKLQotICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggcGh5X2ZvbnRfbWF4X3NpemUgKSwKLSAgICAgICBGVF9GUkFNRV9VT0ZGMyAoIHBoeV9mb250X3NlY3Rpb25fc2l6ZSApLAotICAgICAgIEZUX0ZSQU1FX1VPRkYzICggcGh5X2ZvbnRfc2VjdGlvbl9vZmZzZXQgKSwKLQotICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZ3BzX21heF9zaXplICksCi0gICAgICAgRlRfRlJBTUVfVU9GRjMgKCBncHNfc2VjdGlvbl9zaXplICksCi0gICAgICAgRlRfRlJBTUVfVU9GRjMgKCBncHNfc2VjdGlvbl9vZmZzZXQgKSwKLQotICAgICAgIEZUX0ZSQU1FX0JZVEUgICggbWF4X2JsdWVfdmFsdWVzICksCi0gICAgICAgRlRfRlJBTUVfQllURSAgKCBtYXhfeF9vcnVzICksCi0gICAgICAgRlRfRlJBTUVfQllURSAgKCBtYXhfeV9vcnVzICksCi0KLSAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBoeV9mb250X21heF9zaXplX2hpZ2ggKSwKLSAgICAgICBGVF9GUkFNRV9CWVRFICAoIGNvbG9yX2ZsYWdzICksCi0KLSAgICAgICBGVF9GUkFNRV9VT0ZGMyAoIGJjdF9tYXhfc2l6ZSApLAotICAgICAgIEZUX0ZSQU1FX1VPRkYzICggYmN0X3NldF9tYXhfc2l6ZSApLAotICAgICAgIEZUX0ZSQU1FX1VPRkYzICggcGh5X2JjdF9zZXRfbWF4X3NpemUgKSwKLQotICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbnVtX3BoeV9mb250cyApLAotICAgICAgIEZUX0ZSQU1FX0JZVEUgICggbWF4X3ZlcnRfc3RlbV9zbmFwICksCi0gICAgICAgRlRfRlJBTUVfQllURSAgKCBtYXhfaG9yel9zdGVtX3NuYXAgKSwKLSAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heF9jaGFycyApLAotICAgICBGVF9GUkFNRV9FTkQKLSAgIH07Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcGZyX2hlYWRlcl9sb2FkKCBQRlJfSGVhZGVyICBoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgLyogcmVhZCBoZWFkZXIgZGlyZWN0bHkgKi8KLSAgICBpZiAoICFGVF9TVFJFQU1fU0VFSyggMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgIUZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggcGZyX2hlYWRlcl9maWVsZHMsIGhlYWRlciApICkKLSAgICB7Ci0gICAgICAvKiBtYWtlIGEgZmV3IGFkanVzdG1lbnRzIHRvIHRoZSBoZWFkZXIgKi8KLSAgICAgIGhlYWRlci0+cGh5X2ZvbnRfbWF4X3NpemUgKz0KLSAgICAgICAgKEZUX1VJbnQzMiloZWFkZXItPnBoeV9mb250X21heF9zaXplX2hpZ2ggPDwgMTY7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQotICBwZnJfaGVhZGVyX2NoZWNrKCBQRlJfSGVhZGVyICBoZWFkZXIgKQotICB7Ci0gICAgRlRfQm9vbCAgcmVzdWx0ID0gMTsKLQotCi0gICAgLyogY2hlY2sgc2lnbmF0dXJlIGFuZCBoZWFkZXIgc2l6ZSAqLwotICAgIGlmICggaGVhZGVyLT5zaWduYXR1cmUgICE9IDB4NTA0NjUyMzBMIHx8ICAgLyogIlBGUjAiICovCi0gICAgICAgICBoZWFkZXItPnZlcnNpb24gICAgID4gNCAgICAgICAgICAgfHwKLSAgICAgICAgIGhlYWRlci0+aGVhZGVyX3NpemUgPCA1OCAgICAgICAgICB8fAotICAgICAgICAgaGVhZGVyLT5zaWduYXR1cmUyICE9IDB4MEQwQSAgICAgICkgICAgLyogQ1IvTEYgICovCi0gICAgewotICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIFBGUiBMT0dJQ0FMIEZPTlRTICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcGZyX2xvZ19mb250X2NvdW50KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIHNlY3Rpb25fb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAqYWNvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VSW50ICAgY291bnQ7Ci0gICAgRlRfVUludCAgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHNlY3Rpb25fb2Zmc2V0ICkgfHwKLSAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBjb3VudCApICAgICAgICAgICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNoZWNrIG1heGltdW0gdmFsdWUgYW5kIGEgcm91Z2ggbWluaW11bSBzaXplOiAgICAgKi8KLSAgICAvKiAtIG5vIG1vcmUgdGhhbiAxMzEwNiBsb2cgZm9udHMgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogLSB3ZSBuZWVkIDUgYnl0ZXMgZm9yIGEgbG9nIGhlYWRlciByZWNvcmQgICAgICAgICAqLwotICAgIC8qIC0gd2UgbmVlZCBhdCBsZWFzdCAxOCBieXRlcyBmb3IgYSBsb2cgZm9udCByZWNvcmQgKi8KLSAgICAvKiAtIHRoZSBvdmVyYWxsIHNpemUgaXMgYXQgbGVhc3QgOTUgYnl0ZXMgcGx1cyB0aGUgICovCi0gICAgLyogICBsb2cgaGVhZGVyIGFuZCBsb2cgZm9udCByZWNvcmRzICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggY291bnQgPiAoICggMSA8PCAxNiApIC0gMiApIC8gNSAgICAgICAgICAgICAgICB8fAotICAgICAgICAgMiArIGNvdW50ICogNSA+PSBzdHJlYW0tPnNpemUgLSBzZWN0aW9uX29mZnNldCB8fAotICAgICAgICAgOTUgKyBjb3VudCAqICggNSArIDE4ICkgPj0gc3RyZWFtLT5zaXplICAgICAgICApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicGZyX2xvZ19mb250X2NvdW50OiIKLSAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIG51bWJlciBvZiBsb2dpY2FsIGZvbnRzXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIHJlc3VsdCA9IGNvdW50OwotCi0gIEV4aXQ6Ci0gICAgKmFjb3VudCA9IChGVF9Mb25nKXJlc3VsdDsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwZnJfbG9nX2ZvbnRfbG9hZCggUEZSX0xvZ0ZvbnQgIGxvZ19mb250LAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgc2VjdGlvbl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgc2l6ZV9pbmNyZW1lbnQgKQotICB7Ci0gICAgRlRfVUludCAgICBudW1fbG9nX2ZvbnRzOwotICAgIEZUX1VJbnQgICAgZmxhZ3M7Ci0gICAgRlRfVUludDMyICBvZmZzZXQ7Ci0gICAgRlRfVUludDMyICBzaXplOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHNlY3Rpb25fb2Zmc2V0ICkgfHwKLSAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBudW1fbG9nX2ZvbnRzICkgICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggaWR4ID49IG51bV9sb2dfZm9udHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCBpZHggKiA1ICkgfHwKLSAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBzaXplICkgICAgfHwKLSAgICAgICAgIEZUX1JFQURfVU9GRjMgKCBvZmZzZXQgKSAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2F2ZSBsb2dpY2FsIGZvbnQgc2l6ZSBhbmQgb2Zmc2V0ICovCi0gICAgbG9nX2ZvbnQtPnNpemUgICA9IHNpemU7Ci0gICAgbG9nX2ZvbnQtPm9mZnNldCA9IG9mZnNldDsKLQotICAgIC8qIG5vdywgY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIHRhYmxlIGJlZm9yZSBsb2FkaW5nIGl0ICovCi0gICAgewotICAgICAgRlRfQnl0ZSogIHA7Ci0gICAgICBGVF9CeXRlKiAgbGltaXQ7Ci0gICAgICBGVF9VSW50ICAgbG9jYWw7Ci0KLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHNpemUgKSAgICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwICAgICA9IHN0cmVhbS0+Y3Vyc29yOwotICAgICAgbGltaXQgPSBwICsgc2l6ZTsKLQotICAgICAgUEZSX0NIRUNLKCAxMyApOwotCi0gICAgICBsb2dfZm9udC0+bWF0cml4WzBdID0gUEZSX05FWFRfTE9ORyggcCApOwotICAgICAgbG9nX2ZvbnQtPm1hdHJpeFsxXSA9IFBGUl9ORVhUX0xPTkcoIHAgKTsKLSAgICAgIGxvZ19mb250LT5tYXRyaXhbMl0gPSBQRlJfTkVYVF9MT05HKCBwICk7Ci0gICAgICBsb2dfZm9udC0+bWF0cml4WzNdID0gUEZSX05FWFRfTE9ORyggcCApOwotCi0gICAgICBmbGFncyA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgICAgbG9jYWwgPSAwOwotICAgICAgaWYgKCBmbGFncyAmIFBGUl9MT0dfU1RST0tFICkKLSAgICAgIHsKLSAgICAgICAgbG9jYWwrKzsKLSAgICAgICAgaWYgKCBmbGFncyAmIFBGUl9MT0dfMkJZVEVfU1RST0tFICkKLSAgICAgICAgICBsb2NhbCsrOwotCi0gICAgICAgIGlmICggKCBmbGFncyAmIFBGUl9MSU5FX0pPSU5fTUFTSyApID09IFBGUl9MSU5FX0pPSU5fTUlURVIgKQotICAgICAgICAgIGxvY2FsICs9IDM7Ci0gICAgICB9Ci0gICAgICBpZiAoIGZsYWdzICYgUEZSX0xPR19CT0xEICkKLSAgICAgIHsKLSAgICAgICAgbG9jYWwrKzsKLSAgICAgICAgaWYgKCBmbGFncyAmIFBGUl9MT0dfMkJZVEVfQk9MRCApCi0gICAgICAgICAgbG9jYWwrKzsKLSAgICAgIH0KLQotICAgICAgUEZSX0NIRUNLKCBsb2NhbCApOwotCi0gICAgICBpZiAoIGZsYWdzICYgUEZSX0xPR19TVFJPS0UgKQotICAgICAgewotICAgICAgICBsb2dfZm9udC0+c3Ryb2tlX3RoaWNrbmVzcyA9ICggZmxhZ3MgJiBQRlJfTE9HXzJCWVRFX1NUUk9LRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQRlJfTkVYVF9TSE9SVCggcCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQRlJfTkVYVF9CWVRFKCBwICk7Ci0KLSAgICAgICAgaWYgKCAoIGZsYWdzICYgUEZSX0xJTkVfSk9JTl9NQVNLICkgPT0gUEZSX0xJTkVfSk9JTl9NSVRFUiApCi0gICAgICAgICAgbG9nX2ZvbnQtPm1pdGVyX2xpbWl0ID0gUEZSX05FWFRfTE9ORyggcCApOwotICAgICAgfQotCi0gICAgICBpZiAoIGZsYWdzICYgUEZSX0xPR19CT0xEICkKLSAgICAgIHsKLSAgICAgICAgbG9nX2ZvbnQtPmJvbGRfdGhpY2tuZXNzID0gKCBmbGFncyAmIFBGUl9MT0dfMkJZVEVfQk9MRCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUEZSX05FWFRfU0hPUlQoIHAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBGUl9ORVhUX0JZVEUoIHAgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBmbGFncyAmIFBGUl9MT0dfRVhUUkFfSVRFTVMgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHBmcl9leHRyYV9pdGVtc19za2lwKCAmcCwgbGltaXQgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICBQRlJfQ0hFQ0soIDUgKTsKLSAgICAgIGxvZ19mb250LT5waHlzX3NpemUgICA9IFBGUl9ORVhUX1VTSE9SVCggcCApOwotICAgICAgbG9nX2ZvbnQtPnBoeXNfb2Zmc2V0ID0gUEZSX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGlmICggc2l6ZV9pbmNyZW1lbnQgKQotICAgICAgewotICAgICAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICAgICAgbG9nX2ZvbnQtPnBoeXNfc2l6ZSArPSAoRlRfVUludDMyKVBGUl9ORVhUX0JZVEUoIHAgKSA8PCAxNjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgVG9vX1Nob3J0OgotICAgIEZUX0VSUk9SKCggInBmcl9sb2dfZm9udF9sb2FkOiBpbnZhbGlkIGxvZ2ljYWwgZm9udCB0YWJsZVxuIiApKTsKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgZ290byBGYWlsOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIFBGUiBQSFlTSUNBTCBGT05UUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBsb2FkIGJpdG1hcCBzdHJpa2VzIGxpc3RzICovCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBwZnJfZXh0cmFfaXRlbV9sb2FkX2JpdG1hcF9pbmZvKCBGVF9CeXRlKiAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRlJfUGh5Rm9udCAgcGh5X2ZvbnQgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gcGh5X2ZvbnQtPm1lbW9yeTsKLSAgICBQRlJfU3RyaWtlICBzdHJpa2U7Ci0gICAgRlRfVUludCAgICAgZmxhZ3MwOwotICAgIEZUX1VJbnQgICAgIG4sIGNvdW50LCBzaXplMTsKLSAgICBGVF9FcnJvciAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgUEZSX0NIRUNLKCA1ICk7Ci0KLSAgICBwICAgICArPSAzOyAgLyogc2tpcCBiY3RTaXplICovCi0gICAgZmxhZ3MwID0gUEZSX05FWFRfQllURSggcCApOwotICAgIGNvdW50ICA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgIC8qIHJlLWFsbG9jYXRlIHdoZW4gbmVlZGVkICovCi0gICAgaWYgKCBwaHlfZm9udC0+bnVtX3N0cmlrZXMgKyBjb3VudCA+IHBoeV9mb250LT5tYXhfc3RyaWtlcyApCi0gICAgewotICAgICAgRlRfVUludCAgbmV3X21heCA9IEZUX1BBRF9DRUlMKCBwaHlfZm9udC0+bnVtX3N0cmlrZXMgKyBjb3VudCwgNCApOwotCi0KLSAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIHBoeV9mb250LT5zdHJpa2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2ZvbnQtPm51bV9zdHJpa2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwaHlfZm9udC0+bWF4X3N0cmlrZXMgPSBuZXdfbWF4OwotICAgIH0KLQotICAgIHNpemUxID0gMSArIDEgKyAxICsgMiArIDIgKyAxOwotICAgIGlmICggZmxhZ3MwICYgUEZSX1NUUklLRV8yQllURV9YUFBNICkKLSAgICAgIHNpemUxKys7Ci0KLSAgICBpZiAoIGZsYWdzMCAmIFBGUl9TVFJJS0VfMkJZVEVfWVBQTSApCi0gICAgICBzaXplMSsrOwotCi0gICAgaWYgKCBmbGFnczAgJiBQRlJfU1RSSUtFXzNCWVRFX1NJWkUgKQotICAgICAgc2l6ZTErKzsKLQotICAgIGlmICggZmxhZ3MwICYgUEZSX1NUUklLRV8zQllURV9PRkZTRVQgKQotICAgICAgc2l6ZTErKzsKLQotICAgIGlmICggZmxhZ3MwICYgUEZSX1NUUklLRV8yQllURV9DT1VOVCApCi0gICAgICBzaXplMSsrOwotCi0gICAgc3RyaWtlID0gcGh5X2ZvbnQtPnN0cmlrZXMgKyBwaHlfZm9udC0+bnVtX3N0cmlrZXM7Ci0KLSAgICBQRlJfQ0hFQ0soIGNvdW50ICogc2l6ZTEgKTsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKywgc3RyaWtlKysgKQotICAgIHsKLSAgICAgIHN0cmlrZS0+eF9wcG0gICAgICAgPSAoIGZsYWdzMCAmIFBGUl9TVFJJS0VfMkJZVEVfWFBQTSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQRlJfTkVYVF9VU0hPUlQoIHAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUEZSX05FWFRfQllURSggcCApOwotCi0gICAgICBzdHJpa2UtPnlfcHBtICAgICAgID0gKCBmbGFnczAgJiBQRlJfU1RSSUtFXzJCWVRFX1lQUE0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUEZSX05FWFRfVVNIT1JUKCBwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgICAgc3RyaWtlLT5mbGFncyAgICAgICA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgICAgc3RyaWtlLT5iY3Rfc2l6ZSAgICA9ICggZmxhZ3MwICYgUEZSX1NUUklLRV8zQllURV9TSVpFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBGUl9ORVhUX1VMT05HKCBwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBGUl9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICBzdHJpa2UtPmJjdF9vZmZzZXQgID0gKCBmbGFnczAgJiBQRlJfU1RSSUtFXzNCWVRFX09GRlNFVCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQRlJfTkVYVF9VTE9ORyggcCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQRlJfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgc3RyaWtlLT5udW1fYml0bWFwcyA9ICggZmxhZ3MwICYgUEZSX1NUUklLRV8yQllURV9DT1VOVCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQRlJfTkVYVF9VU0hPUlQoIHAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUEZSX05FWFRfQllURSggcCApOwotICAgIH0KLQotICAgIHBoeV9mb250LT5udW1fc3RyaWtlcyArPSBjb3VudDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBUb29fU2hvcnQ6Ci0gICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgIEZUX0VSUk9SKCggInBmcl9leHRyYV9pdGVtX2xvYWRfYml0bWFwX2luZm86IgotICAgICAgICAgICAgICAgIiBpbnZhbGlkIGJpdG1hcCBpbmZvIHRhYmxlXG4iICkpOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgLyogTG9hZCBmb250IElELiAgVGhpcyBpcyBhIHNvLWNhbGxlZCBgdW5pcXVlJyBuYW1lIHRoYXQgaXMgcmF0aGVyCi0gICAqIGxvbmcgYW5kIGRlc2NyaXB0aXZlIChsaWtlIGBUaXJlc2lhcyBTY3JlZW5Gb250IHY3LjUxJykuCi0gICAqCi0gICAqIE5vdGUgdGhhdCBhIFBGUiBmb250J3MgZmFtaWx5IG5hbWUgaXMgY29udGFpbmVkIGluIGFuICp1bmRvY3VtZW50ZWQqCi0gICAqIHN0cmluZyBvZiB0aGUgYGF1eGlsaWFyeSBkYXRhJyBwb3J0aW9uIG9mIGEgcGh5c2ljYWwgZm9udCByZWNvcmQuICBUaGlzCi0gICAqIG1heSBhbHNvIGNvbnRhaW4gdGhlIGByZWFsJyBzdHlsZSBuYW1lIQotICAgKgotICAgKiBJZiBubyBmYW1pbHkgbmFtZSBpcyBwcmVzZW50LCB0aGUgZm9udCBJRCBpcyB1c2VkIGluc3RlYWQgZm9yIHRoZQotICAgKiBmYW1pbHkuCi0gICAqLwotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgcGZyX2V4dHJhX2l0ZW1fbG9hZF9mb250X2lkKCBGVF9CeXRlKiAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZSX1BoeUZvbnQgIHBoeV9mb250ICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGh5X2ZvbnQtPm1lbW9yeTsKLSAgICBGVF9VSW50ICAgIGxlbiAgICA9IChGVF9VSW50KSggbGltaXQgLSBwICk7Ci0KLQotICAgIGlmICggcGh5X2ZvbnQtPmZvbnRfaWQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9BTExPQyggcGh5X2ZvbnQtPmZvbnRfaWQsIGxlbiArIDEgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjb3B5IGZvbnQgSUQgbmFtZSwgYW5kIHRlcm1pbmF0ZSBpdCBmb3Igc2FmZXR5ICovCi0gICAgRlRfTUVNX0NPUFkoIHBoeV9mb250LT5mb250X2lkLCBwLCBsZW4gKTsKLSAgICBwaHlfZm9udC0+Zm9udF9pZFtsZW5dID0gMDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogbG9hZCBzdGVtIHNuYXAgdGFibGVzICovCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBwZnJfZXh0cmFfaXRlbV9sb2FkX3N0ZW1fc25hcHMoIEZUX0J5dGUqICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRlJfUGh5Rm9udCAgcGh5X2ZvbnQgKQotICB7Ci0gICAgRlRfVUludCAgICBjb3VudCwgbnVtX3ZlcnQsIG51bV9ob3J6OwotICAgIEZUX0ludCogICAgc25hcHMgID0gTlVMTDsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBoeV9mb250LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGh5X2ZvbnQtPnZlcnRpY2FsLnN0ZW1fc25hcHMgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgUEZSX0NIRUNLKCAxICk7Ci0gICAgY291bnQgPSBQRlJfTkVYVF9CWVRFKCBwICk7Ci0KLSAgICBudW1fdmVydCA9IGNvdW50ICYgMTU7Ci0gICAgbnVtX2hvcnogPSBjb3VudCA+PiA0OwotICAgIGNvdW50ICAgID0gbnVtX3ZlcnQgKyBudW1faG9yejsKLQotICAgIFBGUl9DSEVDSyggY291bnQgKiAyICk7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggc25hcHMsIGNvdW50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcGh5X2ZvbnQtPnZlcnRpY2FsLnN0ZW1fc25hcHMgPSBzbmFwczsKLSAgICBwaHlfZm9udC0+aG9yaXpvbnRhbC5zdGVtX3NuYXBzID0gc25hcHMgKyBudW1fdmVydDsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzbmFwcysrICkKLSAgICAgICpzbmFwcyA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBUb29fU2hvcnQ6Ci0gICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgIEZUX0VSUk9SKCggInBmcl9leHRyYV9pdGVtX2xvYWRfc3RlbV9zbmFwczoiCi0gICAgICAgICAgICAgICAiIGludmFsaWQgc3RlbSBzbmFwcyB0YWJsZVxuIiApKTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0KLSAgLyogbG9hZCBrZXJuaW5nIHBhaXIgZGF0YSAqLwotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgcGZyX2V4dHJhX2l0ZW1fbG9hZF9rZXJuaW5nX3BhaXJzKCBGVF9CeXRlKiAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZSX1BoeUZvbnQgIHBoeV9mb250ICkKLSAgewotICAgIFBGUl9LZXJuSXRlbSAgaXRlbSAgID0gTlVMTDsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IHBoeV9mb250LT5tZW1vcnk7Ci0KLQotICAgIGlmICggRlRfTkVXKCBpdGVtICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgUEZSX0NIRUNLKCA0ICk7Ci0KLSAgICBpdGVtLT5wYWlyX2NvdW50ID0gUEZSX05FWFRfQllURSggcCApOwotICAgIGl0ZW0tPmJhc2VfYWRqICAgPSBQRlJfTkVYVF9TSE9SVCggcCApOwotICAgIGl0ZW0tPmZsYWdzICAgICAgPSBQRlJfTkVYVF9CWVRFKCBwICk7Ci0gICAgaXRlbS0+b2Zmc2V0ICAgICA9IHBoeV9mb250LT5vZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KSggcCAtIHBoeV9mb250LT5jdXJzb3IgKTsKLQotI2lmbmRlZiBQRlJfQ09ORklHX05PX0NIRUNLUwotICAgIGl0ZW0tPnBhaXJfc2l6ZSA9IDM7Ci0KLSAgICBpZiAoIGl0ZW0tPmZsYWdzICYgUEZSX0tFUk5fMkJZVEVfQ0hBUiApCi0gICAgICBpdGVtLT5wYWlyX3NpemUgKz0gMjsKLQotICAgIGlmICggaXRlbS0+ZmxhZ3MgJiBQRlJfS0VSTl8yQllURV9BREogKQotICAgICAgaXRlbS0+cGFpcl9zaXplICs9IDE7Ci0KLSAgICBQRlJfQ0hFQ0soIGl0ZW0tPnBhaXJfY291bnQgKiBpdGVtLT5wYWlyX3NpemUgKTsKLSNlbmRpZgotCi0gICAgLyogbG9hZCBmaXJzdCBhbmQgbGFzdCBwYWlycyBpbnRvIHRoZSBpdGVtIHRvIHNwZWVkIHVwICovCi0gICAgLyogbG9va3VwIGxhdGVyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBpdGVtLT5wYWlyX2NvdW50ID4gMCApCi0gICAgewotICAgICAgRlRfVUludCAgIGNoYXIxLCBjaGFyMjsKLSAgICAgIEZUX0J5dGUqICBxOwotCi0KLSAgICAgIGlmICggaXRlbS0+ZmxhZ3MgJiBQRlJfS0VSTl8yQllURV9DSEFSICkKLSAgICAgIHsKLSAgICAgICAgcSAgICAgPSBwOwotICAgICAgICBjaGFyMSA9IFBGUl9ORVhUX1VTSE9SVCggcSApOwotICAgICAgICBjaGFyMiA9IFBGUl9ORVhUX1VTSE9SVCggcSApOwotCi0gICAgICAgIGl0ZW0tPnBhaXIxID0gUEZSX0tFUk5fSU5ERVgoIGNoYXIxLCBjaGFyMiApOwotCi0gICAgICAgIHEgPSBwICsgaXRlbS0+cGFpcl9zaXplICogKCBpdGVtLT5wYWlyX2NvdW50IC0gMSApOwotICAgICAgICBjaGFyMSA9IFBGUl9ORVhUX1VTSE9SVCggcSApOwotICAgICAgICBjaGFyMiA9IFBGUl9ORVhUX1VTSE9SVCggcSApOwotCi0gICAgICAgIGl0ZW0tPnBhaXIyID0gUEZSX0tFUk5fSU5ERVgoIGNoYXIxLCBjaGFyMiApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBxICAgICA9IHA7Ci0gICAgICAgIGNoYXIxID0gUEZSX05FWFRfQllURSggcSApOwotICAgICAgICBjaGFyMiA9IFBGUl9ORVhUX0JZVEUoIHEgKTsKLQotICAgICAgICBpdGVtLT5wYWlyMSA9IFBGUl9LRVJOX0lOREVYKCBjaGFyMSwgY2hhcjIgKTsKLQotICAgICAgICBxID0gcCArIGl0ZW0tPnBhaXJfc2l6ZSAqICggaXRlbS0+cGFpcl9jb3VudCAtIDEgKTsKLSAgICAgICAgY2hhcjEgPSBQRlJfTkVYVF9CWVRFKCBxICk7Ci0gICAgICAgIGNoYXIyID0gUEZSX05FWFRfQllURSggcSApOwotCi0gICAgICAgIGl0ZW0tPnBhaXIyID0gUEZSX0tFUk5fSU5ERVgoIGNoYXIxLCBjaGFyMiApOwotICAgICAgfQotCi0gICAgICAvKiBhZGQgbmV3IGl0ZW0gdG8gdGhlIGN1cnJlbnQgbGlzdCAqLwotICAgICAgaXRlbS0+bmV4dCAgICAgICAgICAgICAgICAgPSBOVUxMOwotICAgICAgKnBoeV9mb250LT5rZXJuX2l0ZW1zX3RhaWwgPSBpdGVtOwotICAgICAgcGh5X2ZvbnQtPmtlcm5faXRlbXNfdGFpbCAgPSAmaXRlbS0+bmV4dDsKLSAgICAgIHBoeV9mb250LT5udW1fa2Vybl9wYWlycyAgKz0gaXRlbS0+cGFpcl9jb3VudDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGVtcHR5IGl0ZW0hICovCi0gICAgICBGVF9GUkVFKCBpdGVtICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIFRvb19TaG9ydDoKLSAgICBGVF9GUkVFKCBpdGVtICk7Ci0KLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgRlRfRVJST1IoKCAicGZyX2V4dHJhX2l0ZW1fbG9hZF9rZXJuaW5nX3BhaXJzOiIKLSAgICAgICAgICAgICAgICIgaW52YWxpZCBrZXJuaW5nIHBhaXJzIHRhYmxlXG4iICkpOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IFBGUl9FeHRyYUl0ZW1SZWMgIHBmcl9waHlfZm9udF9leHRyYV9pdGVtc1tdID0KLSAgewotICAgIHsgMSwgKFBGUl9FeHRyYUl0ZW1fUGFyc2VGdW5jKXBmcl9leHRyYV9pdGVtX2xvYWRfYml0bWFwX2luZm8gfSwKLSAgICB7IDIsIChQRlJfRXh0cmFJdGVtX1BhcnNlRnVuYylwZnJfZXh0cmFfaXRlbV9sb2FkX2ZvbnRfaWQgfSwKLSAgICB7IDMsIChQRlJfRXh0cmFJdGVtX1BhcnNlRnVuYylwZnJfZXh0cmFfaXRlbV9sb2FkX3N0ZW1fc25hcHMgfSwKLSAgICB7IDQsIChQRlJfRXh0cmFJdGVtX1BhcnNlRnVuYylwZnJfZXh0cmFfaXRlbV9sb2FkX2tlcm5pbmdfcGFpcnMgfSwKLSAgICB7IDAsIE5VTEwgfQotICB9OwotCi0KLSAgLyoKLSAgICogTG9hZCBhIG5hbWUgZnJvbSB0aGUgYXV4aWxpYXJ5IGRhdGEuICBTaW5jZSB0aGlzIGV4dHJhY3RzIHVuZG9jdW1lbnRlZAotICAgKiBzdHJpbmdzIGZyb20gdGhlIGZvbnQgZmlsZSwgd2UgbmVlZCB0byBiZSBjYXJlZnVsIGhlcmUuCi0gICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGZyX2F1eF9uYW1lX2xvYWQoIEZUX0J5dGUqICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICAqYXN0cmluZyApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfU3RyaW5nKiAgcmVzdWx0ID0gTlVMTDsKLSAgICBGVF9VSW50ICAgICBuLCBvazsKLQotCi0gICAgaWYgKCAqYXN0cmluZyApCi0gICAgICBGVF9GUkVFKCAqYXN0cmluZyApOwotCi0gICAgaWYgKCBsZW4gPiAwICYmIHBbbGVuIC0gMV0gPT0gMCApCi0gICAgICBsZW4tLTsKLQotICAgIC8qIGNoZWNrIHRoYXQgZWFjaCBjaGFyYWN0ZXIgaXMgQVNDSUkgICovCi0gICAgLyogZm9yIG1ha2luZyBzdXJlIG5vdCB0byBsb2FkIGdhcmJhZ2UgKi8KLSAgICBvayA9ICggbGVuID4gMCApOwotICAgIGZvciAoIG4gPSAwOyBuIDwgbGVuOyBuKysgKQotICAgICAgaWYgKCBwW25dIDwgMzIgfHwgcFtuXSA+IDEyNyApCi0gICAgICB7Ci0gICAgICAgIG9rID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBpZiAoIG9rICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX0FMTE9DKCByZXN1bHQsIGxlbiArIDEgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfTUVNX0NPUFkoIHJlc3VsdCwgcCwgbGVuICk7Ci0gICAgICByZXN1bHRbbGVuXSA9IDA7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKmFzdHJpbmcgPSByZXN1bHQ7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwZnJfcGh5X2ZvbnRfZG9uZSggUEZSX1BoeUZvbnQgIHBoeV9mb250LAotICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9GUkVFKCBwaHlfZm9udC0+Zm9udF9pZCApOwotICAgIEZUX0ZSRUUoIHBoeV9mb250LT5mYW1pbHlfbmFtZSApOwotICAgIEZUX0ZSRUUoIHBoeV9mb250LT5zdHlsZV9uYW1lICk7Ci0KLSAgICBGVF9GUkVFKCBwaHlfZm9udC0+dmVydGljYWwuc3RlbV9zbmFwcyApOwotICAgIHBoeV9mb250LT52ZXJ0aWNhbC5udW1fc3RlbV9zbmFwcyA9IDA7Ci0KLSAgICBwaHlfZm9udC0+aG9yaXpvbnRhbC5zdGVtX3NuYXBzICAgICA9IE5VTEw7Ci0gICAgcGh5X2ZvbnQtPmhvcml6b250YWwubnVtX3N0ZW1fc25hcHMgPSAwOwotCi0gICAgRlRfRlJFRSggcGh5X2ZvbnQtPnN0cmlrZXMgKTsKLSAgICBwaHlfZm9udC0+bnVtX3N0cmlrZXMgPSAwOwotICAgIHBoeV9mb250LT5tYXhfc3RyaWtlcyA9IDA7Ci0KLSAgICBGVF9GUkVFKCBwaHlfZm9udC0+Y2hhcnMgKTsKLSAgICBwaHlfZm9udC0+bnVtX2NoYXJzICAgID0gMDsKLSAgICBwaHlfZm9udC0+Y2hhcnNfb2Zmc2V0ID0gMDsKLQotICAgIEZUX0ZSRUUoIHBoeV9mb250LT5ibHVlX3ZhbHVlcyApOwotICAgIHBoeV9mb250LT5udW1fYmx1ZV92YWx1ZXMgPSAwOwotCi0gICAgewotICAgICAgUEZSX0tlcm5JdGVtICBpdGVtLCBuZXh0OwotCi0KLSAgICAgIGl0ZW0gPSBwaHlfZm9udC0+a2Vybl9pdGVtczsKLSAgICAgIHdoaWxlICggaXRlbSApCi0gICAgICB7Ci0gICAgICAgIG5leHQgPSBpdGVtLT5uZXh0OwotICAgICAgICBGVF9GUkVFKCBpdGVtICk7Ci0gICAgICAgIGl0ZW0gPSBuZXh0OwotICAgICAgfQotICAgICAgcGh5X2ZvbnQtPmtlcm5faXRlbXMgICAgICA9IE5VTEw7Ci0gICAgICBwaHlfZm9udC0+a2Vybl9pdGVtc190YWlsID0gTlVMTDsKLSAgICB9Ci0KLSAgICBwaHlfZm9udC0+bnVtX2tlcm5fcGFpcnMgPSAwOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcGZyX3BoeV9mb250X2xvYWQoIFBGUl9QaHlGb250ICBwaHlfZm9udCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgIHNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX1VJbnQgICAgZmxhZ3M7Ci0gICAgRlRfVUxvbmcgICBudW1fYXV4OwotICAgIEZUX0J5dGUqICAgcDsKLSAgICBGVF9CeXRlKiAgIGxpbWl0OwotCi0KLSAgICBwaHlfZm9udC0+bWVtb3J5ID0gbWVtb3J5OwotICAgIHBoeV9mb250LT5vZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICBwaHlfZm9udC0+a2Vybl9pdGVtcyAgICAgID0gTlVMTDsKLSAgICBwaHlfZm9udC0+a2Vybl9pdGVtc190YWlsID0gJnBoeV9mb250LT5rZXJuX2l0ZW1zOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBzaXplICkgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBwaHlfZm9udC0+Y3Vyc29yID0gc3RyZWFtLT5jdXJzb3I7Ci0KLSAgICBwICAgICA9IHN0cmVhbS0+Y3Vyc29yOwotICAgIGxpbWl0ID0gcCArIHNpemU7Ci0KLSAgICBQRlJfQ0hFQ0soIDE1ICk7Ci0gICAgcGh5X2ZvbnQtPmZvbnRfcmVmX251bWJlciAgICA9IFBGUl9ORVhUX1VTSE9SVCggcCApOwotICAgIHBoeV9mb250LT5vdXRsaW5lX3Jlc29sdXRpb24gPSBQRlJfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBwaHlfZm9udC0+bWV0cmljc19yZXNvbHV0aW9uID0gUEZSX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgcGh5X2ZvbnQtPmJib3gueE1pbiAgICAgICAgICA9IFBGUl9ORVhUX1NIT1JUKCBwICk7Ci0gICAgcGh5X2ZvbnQtPmJib3gueU1pbiAgICAgICAgICA9IFBGUl9ORVhUX1NIT1JUKCBwICk7Ci0gICAgcGh5X2ZvbnQtPmJib3gueE1heCAgICAgICAgICA9IFBGUl9ORVhUX1NIT1JUKCBwICk7Ci0gICAgcGh5X2ZvbnQtPmJib3gueU1heCAgICAgICAgICA9IFBGUl9ORVhUX1NIT1JUKCBwICk7Ci0gICAgcGh5X2ZvbnQtPmZsYWdzICAgICAgPSBmbGFncyA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgIC8qIGdldCB0aGUgc3RhbmRhcmQgYWR2YW5jZSBmb3Igbm9uLXByb3BvcnRpb25hbCBmb250cyAqLwotICAgIGlmICggIShmbGFncyAmIFBGUl9QSFlfUFJPUE9SVElPTkFMKSApCi0gICAgewotICAgICAgUEZSX0NIRUNLKCAyICk7Ci0gICAgICBwaHlfZm9udC0+c3RhbmRhcmRfYWR2YW5jZSA9IFBGUl9ORVhUX1NIT1JUKCBwICk7Ci0gICAgfQotCi0gICAgLyogbG9hZCB0aGUgZXh0cmEgaXRlbXMgd2hlbiBwcmVzZW50ICovCi0gICAgaWYgKCBmbGFncyAmIFBGUl9QSFlfRVhUUkFfSVRFTVMgKQotICAgIHsKLSAgICAgIGVycm9yID0gcGZyX2V4dHJhX2l0ZW1zX3BhcnNlKCAmcCwgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZyX3BoeV9mb250X2V4dHJhX2l0ZW1zLCBwaHlfZm9udCApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIEluIGNlcnRhaW4gZm9udHMsIHRoZSBhdXhpbGlhcnkgYnl0ZXMgY29udGFpbiBpbnRlcmVzdGluZyAgICovCi0gICAgLyogaW5mb3JtYXRpb24uICBUaGVzZSBhcmUgbm90IGluIHRoZSBzcGVjaWZpY2F0aW9uIGJ1dCBjYW4gYmUgKi8KLSAgICAvKiBndWVzc2VkIGJ5IGxvb2tpbmcgYXQgdGhlIGNvbnRlbnQgb2YgYSBmZXcgUEZSMCBmb250cy4gICAgICAqLwotICAgIFBGUl9DSEVDSyggMyApOwotICAgIG51bV9hdXggPSBQRlJfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCBudW1fYXV4ID4gMCApCi0gICAgewotICAgICAgRlRfQnl0ZSogIHEgPSBwOwotICAgICAgRlRfQnl0ZSogIHEyOwotCi0KLSAgICAgIFBGUl9DSEVDS19TSVpFKCBudW1fYXV4ICk7Ci0gICAgICBwICs9IG51bV9hdXg7Ci0KLSAgICAgIHdoaWxlICggbnVtX2F1eCA+IDAgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBsZW5ndGgsIHR5cGU7Ci0KLQotICAgICAgICBpZiAoIHEgKyA0ID4gcCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgbGVuZ3RoID0gUEZSX05FWFRfVVNIT1JUKCBxICk7Ci0gICAgICAgIGlmICggbGVuZ3RoIDwgNCB8fCBsZW5ndGggPiBudW1fYXV4ICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBxMiAgID0gcSArIGxlbmd0aCAtIDI7Ci0gICAgICAgIHR5cGUgPSBQRlJfTkVYVF9VU0hPUlQoIHEgKTsKLQotICAgICAgICBzd2l0Y2ggKCB0eXBlICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgLyogdGhpcyBzZWVtcyB0byBjb3JyZXNwb25kIHRvIHRoZSBmb250J3MgZmFtaWx5IG5hbWUsIHBhZGRlZCB0byAqLwotICAgICAgICAgIC8qIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzIHdpdGggYSB6ZXJvIGJ5dGUgYXBwZW5kZWQgaWYgbmVlZGVkICAgKi8KLSAgICAgICAgICBlcnJvciA9IHBmcl9hdXhfbmFtZV9sb2FkKCBxLCBsZW5ndGggLSA0VSwgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZm9udC0+ZmFtaWx5X25hbWUgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgaWYgKCBxICsgMzIgPiBxMiApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHEgKz0gMTA7Ci0gICAgICAgICAgcGh5X2ZvbnQtPmFzY2VudCAgPSBQRlJfTkVYVF9TSE9SVCggcSApOwotICAgICAgICAgIHBoeV9mb250LT5kZXNjZW50ID0gUEZSX05FWFRfU0hPUlQoIHEgKTsKLSAgICAgICAgICBwaHlfZm9udC0+bGVhZGluZyA9IFBGUl9ORVhUX1NIT1JUKCBxICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgIC8qIHRoaXMgc2VlbXMgdG8gY29ycmVzcG9uZCB0byB0aGUgZm9udCdzIHN0eWxlIG5hbWUsIHBhZGRlZCB0byAqLwotICAgICAgICAgIC8qIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzIHdpdGggYSB6ZXJvIGJ5dGUgYXBwZW5kZWQgaWYgbmVlZGVkICAqLwotICAgICAgICAgIGVycm9yID0gcGZyX2F1eF9uYW1lX2xvYWQoIHEsIGxlbmd0aCAtIDRVLCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9mb250LT5zdHlsZV9uYW1lICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLQotICAgICAgICBxICAgICAgICA9IHEyOwotICAgICAgICBudW1fYXV4IC09IGxlbmd0aDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZWFkIHRoZSBibHVlIHZhbHVlcyAqLwotICAgIHsKLSAgICAgIEZUX1VJbnQgIG4sIGNvdW50OwotCi0KLSAgICAgIFBGUl9DSEVDSyggMSApOwotICAgICAgcGh5X2ZvbnQtPm51bV9ibHVlX3ZhbHVlcyA9IGNvdW50ID0gUEZSX05FWFRfQllURSggcCApOwotCi0gICAgICBQRlJfQ0hFQ0soIGNvdW50ICogMiApOwotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggcGh5X2ZvbnQtPmJsdWVfdmFsdWVzLCBjb3VudCApICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgICBwaHlfZm9udC0+Ymx1ZV92YWx1ZXNbbl0gPSBQRlJfTkVYVF9TSE9SVCggcCApOwotICAgIH0KLQotICAgIFBGUl9DSEVDSyggOCApOwotICAgIHBoeV9mb250LT5ibHVlX2Z1enogID0gUEZSX05FWFRfQllURSggcCApOwotICAgIHBoeV9mb250LT5ibHVlX3NjYWxlID0gUEZSX05FWFRfQllURSggcCApOwotCi0gICAgcGh5X2ZvbnQtPnZlcnRpY2FsLnN0YW5kYXJkICAgPSBQRlJfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBwaHlfZm9udC0+aG9yaXpvbnRhbC5zdGFuZGFyZCA9IFBGUl9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgLyogcmVhZCB0aGUgY2hhcmFjdGVyIGRlc2NyaXB0b3JzICovCi0gICAgewotICAgICAgRlRfVUludCAgbiwgY291bnQsIFNpemU7Ci0KLQotICAgICAgcGh5X2ZvbnQtPm51bV9jaGFycyAgICA9IGNvdW50ID0gUEZSX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBwaHlfZm9udC0+Y2hhcnNfb2Zmc2V0ID0gb2Zmc2V0ICsgKEZUX09mZnNldCkoIHAgLSBzdHJlYW0tPmN1cnNvciApOwotCi0gICAgICBTaXplID0gMSArIDEgKyAyOwotICAgICAgaWYgKCBmbGFncyAmIFBGUl9QSFlfMkJZVEVfQ0hBUkNPREUgKQotICAgICAgICBTaXplICs9IDE7Ci0KLSAgICAgIGlmICggZmxhZ3MgJiBQRlJfUEhZX1BST1BPUlRJT05BTCApCi0gICAgICAgIFNpemUgKz0gMjsKLQotICAgICAgaWYgKCBmbGFncyAmIFBGUl9QSFlfQVNDSUlfQ09ERSApCi0gICAgICAgIFNpemUgKz0gMTsKLQotICAgICAgaWYgKCBmbGFncyAmIFBGUl9QSFlfMkJZVEVfR1BTX1NJWkUgKQotICAgICAgICBTaXplICs9IDE7Ci0KLSAgICAgIGlmICggZmxhZ3MgJiBQRlJfUEhZXzNCWVRFX0dQU19PRkZTRVQgKQotICAgICAgICBTaXplICs9IDE7Ci0KLSAgICAgIFBGUl9DSEVDS19TSVpFKCBjb3VudCAqIFNpemUgKTsKLQotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHBoeV9mb250LT5jaGFycywgY291bnQgKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHsKLSAgICAgICAgUEZSX0NoYXIgIGN1ciA9ICZwaHlfZm9udC0+Y2hhcnNbbl07Ci0KLQotICAgICAgICBjdXItPmNoYXJfY29kZSA9ICggZmxhZ3MgJiBQRlJfUEhZXzJCWVRFX0NIQVJDT0RFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IFBGUl9ORVhUX1VTSE9SVCggcCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiBQRlJfTkVYVF9CWVRFKCBwICk7Ci0KLSAgICAgICAgY3VyLT5hZHZhbmNlICAgPSAoIGZsYWdzICYgUEZSX1BIWV9QUk9QT1JUSU9OQUwgKQotICAgICAgICAgICAgICAgICAgICAgICAgID8gUEZSX05FWFRfU0hPUlQoIHAgKQotICAgICAgICAgICAgICAgICAgICAgICAgIDogcGh5X2ZvbnQtPnN0YW5kYXJkX2FkdmFuY2U7Ci0KLSNpZiAwCi0gICAgICAgIGN1ci0+YXNjaWkgICAgID0gKCBmbGFncyAmIFBGUl9QSFlfQVNDSUlfQ09ERSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgPyBQRlJfTkVYVF9CWVRFKCBwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7Ci0jZWxzZQotICAgICAgICBpZiAoIGZsYWdzICYgUEZSX1BIWV9BU0NJSV9DT0RFICkKLSAgICAgICAgICBwICs9IDE7Ci0jZW5kaWYKLSAgICAgICAgY3VyLT5ncHNfc2l6ZSAgPSAoIGZsYWdzICYgUEZSX1BIWV8yQllURV9HUFNfU0laRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgPyBQRlJfTkVYVF9VU0hPUlQoIHAgKQotICAgICAgICAgICAgICAgICAgICAgICAgIDogUEZSX05FWFRfQllURSggcCApOwotCi0gICAgICAgIGN1ci0+Z3BzX29mZnNldCA9ICggZmxhZ3MgJiBQRlJfUEhZXzNCWVRFX0dQU19PRkZTRVQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBGUl9ORVhUX1VMT05HKCBwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQRlJfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB0aGF0J3MgaXQhICovCi0KLSAgRmFpbDoKLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAvKiBzYXZlIHBvc2l0aW9uIG9mIGJpdG1hcCBpbmZvICovCi0gICAgcGh5X2ZvbnQtPmJjdF9vZmZzZXQgPSBGVF9TVFJFQU1fUE9TKCk7Ci0gICAgcGh5X2ZvbnQtPmN1cnNvciAgICAgPSBOVUxMOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIFRvb19TaG9ydDoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgRlRfRVJST1IoKCAicGZyX3BoeV9mb250X2xvYWQ6IGludmFsaWQgcGh5c2ljYWwgZm9udCB0YWJsZVxuIiApKTsKLSAgICBnb3RvIEZhaWw7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wZnIvcGZybG9hZC5oIGIvc3JjL3Bmci9wZnJsb2FkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDc1YWUuLjAwMDAwMDAKLS0tIGEvc3JjL3Bmci9wZnJsb2FkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZybG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBGUkxPQURfSF8KLSNkZWZpbmUgUEZSTE9BRF9IXwotCi0jaW5jbHVkZSAicGZyb2Jqcy5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKiBzb21lIHNpemUgY2hlY2tzIHNob3VsZCBiZSBhbHdheXMgZG9uZSAobWFpbmx5IHRvIHByZXZlbnQgKi8KLSAgLyogZXhjZXNzaXZlIGFsbG9jYXRpb24gZm9yIG1hbGZvcm1lZCBkYXRhKSwgLi4uICAgICAgICAgICAgICovCi0jZGVmaW5lIFBGUl9DSEVDS19TSVpFKCB4ICkgIGRvICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwICsgKHgpID4gbGltaXQgKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFRvb19TaG9ydDsgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotICAvKiAuLi4gYW5kIHNvbWUgb25seSBpZiBpbnRlbnNpdmUgY2hlY2tpbmcgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgKi8KLSNpZmRlZiBQRlJfQ09ORklHX05PX0NIRUNLUwotI2RlZmluZSBQRlJfQ0hFQ0soIHggKSAgZG8geyB9IHdoaWxlICggMCApCi0jZWxzZQotI2RlZmluZSBQRlJfQ0hFQ0sgIFBGUl9DSEVDS19TSVpFCi0jZW5kaWYKLQotI2RlZmluZSBQRlJfTkVYVF9CWVRFKCBwICkgICAgRlRfTkVYVF9CWVRFKCBwICkKLSNkZWZpbmUgUEZSX05FWFRfSU5UOCggcCApICAgIEZUX05FWFRfQ0hBUiggcCApCi0jZGVmaW5lIFBGUl9ORVhUX1NIT1JUKCBwICkgICBGVF9ORVhUX1NIT1JUKCBwICkKLSNkZWZpbmUgUEZSX05FWFRfVVNIT1JUKCBwICkgIEZUX05FWFRfVVNIT1JUKCBwICkKLSNkZWZpbmUgUEZSX05FWFRfTE9ORyggcCApICAgIEZUX05FWFRfT0ZGMyggcCApCi0jZGVmaW5lIFBGUl9ORVhUX1VMT05HKCBwICkgICBGVF9ORVhUX1VPRkYzKCBwICkKLQotCi0gLyogaGFuZGxpbmcgZXh0cmEgaXRlbXMgKi8KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqUEZSX0V4dHJhSXRlbV9QYXJzZUZ1bmMpKCBGVF9CeXRlKiAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBkYXRhICk7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBGUl9FeHRyYUl0ZW1SZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgICAgdHlwZTsKLSAgICBQRlJfRXh0cmFJdGVtX1BhcnNlRnVuYyAgcGFyc2VyOwotCi0gIH0gUEZSX0V4dHJhSXRlbVJlYzsKLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBQRlJfRXh0cmFJdGVtUmVjXyogIFBGUl9FeHRyYUl0ZW07Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwZnJfZXh0cmFfaXRlbXNfc2tpcCggRlRfQnl0ZSogICpwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICBsaW1pdCApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBmcl9leHRyYV9pdGVtc19wYXJzZSggRlRfQnl0ZSogICAgICAqcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUEZSX0V4dHJhSXRlbSAgaXRlbV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgIGl0ZW1fZGF0YSApOwotCi0KLSAgLyogbG9hZCBhIFBGUiBoZWFkZXIgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcGZyX2hlYWRlcl9sb2FkKCBQRlJfSGVhZGVyICBoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtICk7Ci0KLSAgLyogY2hlY2sgYSBQRlIgaGVhZGVyICovCi0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgcGZyX2hlYWRlcl9jaGVjayggUEZSX0hlYWRlciAgaGVhZGVyICk7Ci0KLQotICAvKiByZXR1cm4gbnVtYmVyIG9mIGxvZ2ljYWwgZm9udHMgaW4gdGhpcyBmaWxlICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBmcl9sb2dfZm9udF9jb3VudCggRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgIGxvZ19zZWN0aW9uX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICphY291bnQgKTsKLQotICAvKiBsb2FkIGEgcGZyIGxvZ2ljYWwgZm9udCBlbnRyeSAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwZnJfbG9nX2ZvbnRfbG9hZCggUEZSX0xvZ0ZvbnQgIGxvZ19mb250LAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgIHNlY3Rpb25fb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIHNpemVfaW5jcmVtZW50ICk7Ci0KLQotICAvKiBsb2FkIGEgcGh5c2ljYWwgZm9udCBlbnRyeSAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwZnJfcGh5X2ZvbnRfbG9hZCggUEZSX1BoeUZvbnQgIHBoeV9mb250LAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgc2l6ZSApOwotCi0gIC8qIGZpbmFsaXplIGEgcGh5c2ljYWwgZm9udCAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHBmcl9waHlfZm9udF9kb25lKCBQRlJfUGh5Rm9udCAgcGh5X2ZvbnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICk7Ci0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogUEZSTE9BRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJvYmpzLmMgYi9zcmMvcGZyL3Bmcm9ianMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0YWY4MC4uMDAwMDAwMAotLS0gYS9zcmMvcGZyL3Bmcm9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIG9iamVjdCBtZXRob2RzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJwZnJvYmpzLmgiCi0jaW5jbHVkZSAicGZybG9hZC5oIgotI2luY2x1ZGUgInBmcmdsb2FkLmgiCi0jaW5jbHVkZSAicGZyY21hcC5oIgotI2luY2x1ZGUgInBmcnNiaXQuaCIKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotCi0jaW5jbHVkZSAicGZyZXJyb3IuaCIKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9wZnIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIEZBQ0UgT0JKRUNUIE1FVEhPRFMgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBmcl9mYWNlX2RvbmUoIEZUX0ZhY2UgIHBmcmZhY2UgKSAgICAgLyogUEZSX0ZhY2UgKi8KLSAgewotICAgIFBGUl9GYWNlICAgZmFjZSA9IChQRlJfRmFjZSlwZnJmYWNlOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IHBmcmZhY2UtPmRyaXZlci0+cm9vdC5tZW1vcnk7Ci0KLSAgICAvKiB3ZSBkb24ndCB3YW50IGRhbmdsaW5nIHBvaW50ZXJzICovCi0gICAgcGZyZmFjZS0+ZmFtaWx5X25hbWUgPSBOVUxMOwotICAgIHBmcmZhY2UtPnN0eWxlX25hbWUgID0gTlVMTDsKLQotICAgIC8qIGZpbmFsaXplIHRoZSBwaHlzaWNhbCBmb250IHJlY29yZCAqLwotICAgIHBmcl9waHlfZm9udF9kb25lKCAmZmFjZS0+cGh5X2ZvbnQsIEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICkgKTsKLQotICAgIC8qIG5vIG5lZWQgdG8gZmluYWxpemUgdGhlIGxvZ2ljYWwgZm9udCBvciB0aGUgaGVhZGVyICovCi0gICAgRlRfRlJFRSggcGZyZmFjZS0+YXZhaWxhYmxlX3NpemVzICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwZnJfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIHBmcmZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCi0gIHsKLSAgICBQRlJfRmFjZSAgZmFjZSA9IChQRlJfRmFjZSlwZnJmYWNlOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIEZUX1VOVVNFRCggbnVtX3BhcmFtcyApOwotICAgIEZUX1VOVVNFRCggcGFyYW1zICk7Ci0KLQotICAgIEZUX1RSQUNFMigoICJQRlIgZHJpdmVyXG4iICkpOwotCi0gICAgLyogbG9hZCB0aGUgaGVhZGVyIGFuZCBjaGVjayBpdCAqLwotICAgIGVycm9yID0gcGZyX2hlYWRlcl9sb2FkKCAmZmFjZS0+aGVhZGVyLCBzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggIXBmcl9oZWFkZXJfY2hlY2soICZmYWNlLT5oZWFkZXIgKSApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgUEZSIGZvbnRcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgZmFjZSBpbmRleCAqLwotICAgIHsKLSAgICAgIEZUX0xvbmcgIG51bV9mYWNlczsKLQotCi0gICAgICBlcnJvciA9IHBmcl9sb2dfZm9udF9jb3VudCggc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmhlYWRlci5sb2dfZGlyX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2ZhY2VzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwZnJmYWNlLT5udW1fZmFjZXMgPSBudW1fZmFjZXM7Ci0gICAgfQotCi0gICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoICggZmFjZV9pbmRleCAmIDB4RkZGRiApID49IHBmcmZhY2UtPm51bV9mYWNlcyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicGZyX2ZhY2VfaW5pdDogaW52YWxpZCBmYWNlIGluZGV4XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGxvYWQgdGhlIGZhY2UgKi8KLSAgICBlcnJvciA9IHBmcl9sb2dfZm9udF9sb2FkKAotICAgICAgICAgICAgICAmZmFjZS0+bG9nX2ZvbnQsCi0gICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgKEZUX1VJbnQpKCBmYWNlX2luZGV4ICYgMHhGRkZGICksCi0gICAgICAgICAgICAgIGZhY2UtPmhlYWRlci5sb2dfZGlyX29mZnNldCwKLSAgICAgICAgICAgICAgRlRfQk9PTCggZmFjZS0+aGVhZGVyLnBoeV9mb250X21heF9zaXplX2hpZ2ggIT0gMCApICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBub3cgbG9hZCB0aGUgcGh5c2ljYWwgZm9udCBkZXNjcmlwdG9yICovCi0gICAgZXJyb3IgPSBwZnJfcGh5X2ZvbnRfbG9hZCggJmZhY2UtPnBoeV9mb250LCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bG9nX2ZvbnQucGh5c19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bG9nX2ZvbnQucGh5c19zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBub3cgc2V0IHVwIGFsbCByb290IGZhY2UgZmllbGRzICovCi0gICAgewotICAgICAgUEZSX1BoeUZvbnQgIHBoeV9mb250ID0gJmZhY2UtPnBoeV9mb250OwotCi0KLSAgICAgIHBmcmZhY2UtPmZhY2VfaW5kZXggPSBmYWNlX2luZGV4ICYgMHhGRkZGOwotICAgICAgcGZyZmFjZS0+bnVtX2dseXBocyA9IChGVF9Mb25nKXBoeV9mb250LT5udW1fY2hhcnMgKyAxOwotCi0gICAgICBwZnJmYWNlLT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRTsKLQotICAgICAgLyogaWYgZ3BzX29mZnNldCA9PSAwIGZvciBhbGwgY2hhcmFjdGVycywgd2UgICovCi0gICAgICAvKiBhc3N1bWUgdGhhdCB0aGUgZm9udCBvbmx5IGNvbnRhaW5zIGJpdG1hcHMgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgbm47Ci0KLQotICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgcGh5X2ZvbnQtPm51bV9jaGFyczsgbm4rKyApCi0gICAgICAgICAgaWYgKCBwaHlfZm9udC0+Y2hhcnNbbm5dLmdwc19vZmZzZXQgIT0gMCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIG5uID09IHBoeV9mb250LT5udW1fY2hhcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwaHlfZm9udC0+bnVtX3N0cmlrZXMgPiAwICkKLSAgICAgICAgICAgIHBmcmZhY2UtPmZhY2VfZmxhZ3MgPSAwOyAgICAgICAgLyogbm90IHNjYWxhYmxlICovCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInBmcl9mYWNlX2luaXQ6IGZvbnQgZG9lc24ndCBjb250YWluIGdseXBoc1xuIiApKTsKLSAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCAoIHBoeV9mb250LT5mbGFncyAmIFBGUl9QSFlfUFJPUE9SVElPTkFMICkgPT0gMCApCi0gICAgICAgIHBmcmZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIOwotCi0gICAgICBpZiAoIHBoeV9mb250LT5mbGFncyAmIFBGUl9QSFlfVkVSVElDQUwgKQotICAgICAgICBwZnJmYWNlLT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19WRVJUSUNBTDsKLSAgICAgIGVsc2UKLSAgICAgICAgcGZyZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTDsKLQotICAgICAgaWYgKCBwaHlfZm9udC0+bnVtX3N0cmlrZXMgPiAwICkKLSAgICAgICAgcGZyZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVM7Ci0KLSAgICAgIGlmICggcGh5X2ZvbnQtPm51bV9rZXJuX3BhaXJzID4gMCApCi0gICAgICAgIHBmcmZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0tFUk5JTkc7Ci0KLSAgICAgIC8qIElmIG5vIGZhbWlseSBuYW1lIHdhcyBmb3VuZCBpbiB0aGUgYHVuZG9jdW1lbnRlZCcgYXV4aWxpYXJ5Ci0gICAgICAgKiBkYXRhLCB1c2UgdGhlIGZvbnQgSUQgaW5zdGVhZC4gIFRoaXMgc3Vja3MgYnV0IGlzIGJldHRlciB0aGFuCi0gICAgICAgKiBub3RoaW5nLgotICAgICAgICovCi0gICAgICBwZnJmYWNlLT5mYW1pbHlfbmFtZSA9IHBoeV9mb250LT5mYW1pbHlfbmFtZTsKLSAgICAgIGlmICggIXBmcmZhY2UtPmZhbWlseV9uYW1lICkKLSAgICAgICAgcGZyZmFjZS0+ZmFtaWx5X25hbWUgPSBwaHlfZm9udC0+Zm9udF9pZDsKLQotICAgICAgLyogbm90ZSB0aGF0IHRoZSBzdHlsZSBuYW1lIGNhbiBiZSBOVUxMIGluIGNlcnRhaW4gUEZSIGZvbnRzLAotICAgICAgICogcHJvYmFibHkgbWVhbmluZyBgUmVndWxhcicKLSAgICAgICAqLwotICAgICAgcGZyZmFjZS0+c3R5bGVfbmFtZSA9IHBoeV9mb250LT5zdHlsZV9uYW1lOwotCi0gICAgICBwZnJmYWNlLT5udW1fZml4ZWRfc2l6ZXMgPSAwOwotICAgICAgcGZyZmFjZS0+YXZhaWxhYmxlX3NpemVzID0gTlVMTDsKLQotICAgICAgcGZyZmFjZS0+YmJveCAgICAgICAgID0gcGh5X2ZvbnQtPmJib3g7Ci0gICAgICBwZnJmYWNlLT51bml0c19wZXJfRU0gPSAoRlRfVVNob3J0KXBoeV9mb250LT5vdXRsaW5lX3Jlc29sdXRpb247Ci0gICAgICBwZnJmYWNlLT5hc2NlbmRlciAgICAgPSAoRlRfU2hvcnQpIHBoeV9mb250LT5iYm94LnlNYXg7Ci0gICAgICBwZnJmYWNlLT5kZXNjZW5kZXIgICAgPSAoRlRfU2hvcnQpIHBoeV9mb250LT5iYm94LnlNaW47Ci0KLSAgICAgIHBmcmZhY2UtPmhlaWdodCA9IChGVF9TaG9ydCkoICggcGZyZmFjZS0+dW5pdHNfcGVyX0VNICogMTIgKSAvIDEwICk7Ci0gICAgICBpZiAoIHBmcmZhY2UtPmhlaWdodCA8IHBmcmZhY2UtPmFzY2VuZGVyIC0gcGZyZmFjZS0+ZGVzY2VuZGVyICkKLSAgICAgICAgcGZyZmFjZS0+aGVpZ2h0ID0gKEZUX1Nob3J0KShwZnJmYWNlLT5hc2NlbmRlciAtIHBmcmZhY2UtPmRlc2NlbmRlcik7Ci0KLSAgICAgIGlmICggcGh5X2ZvbnQtPm51bV9zdHJpa2VzID4gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgICAgICAgICAgbiwgY291bnQgPSBwaHlfZm9udC0+bnVtX3N0cmlrZXM7Ci0gICAgICAgIEZUX0JpdG1hcF9TaXplKiAgc2l6ZTsKLSAgICAgICAgUEZSX1N0cmlrZSAgICAgICBzdHJpa2U7Ci0gICAgICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gcGZyZmFjZS0+c3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggcGZyZmFjZS0+YXZhaWxhYmxlX3NpemVzLCBjb3VudCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgc2l6ZSAgID0gcGZyZmFjZS0+YXZhaWxhYmxlX3NpemVzOwotICAgICAgICBzdHJpa2UgPSBwaHlfZm9udC0+c3RyaWtlczsKLSAgICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrLCBzaXplKyssIHN0cmlrZSsrICkKLSAgICAgICAgewotICAgICAgICAgIHNpemUtPmhlaWdodCA9IChGVF9TaG9ydClzdHJpa2UtPnlfcHBtOwotICAgICAgICAgIHNpemUtPndpZHRoICA9IChGVF9TaG9ydClzdHJpa2UtPnhfcHBtOwotICAgICAgICAgIHNpemUtPnNpemUgICA9IChGVF9Qb3MpKCBzdHJpa2UtPnlfcHBtIDw8IDYgKTsKLSAgICAgICAgICBzaXplLT54X3BwZW0gPSAoRlRfUG9zKSggc3RyaWtlLT54X3BwbSA8PCA2ICk7Ci0gICAgICAgICAgc2l6ZS0+eV9wcGVtID0gKEZUX1BvcykoIHN0cmlrZS0+eV9wcG0gPDwgNiApOwotICAgICAgICB9Ci0gICAgICAgIHBmcmZhY2UtPm51bV9maXhlZF9zaXplcyA9IChGVF9JbnQpY291bnQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBjb21wdXRlIG1heGltdW0gYWR2YW5jZSB3aWR0aCAqLwotICAgICAgaWYgKCAoIHBoeV9mb250LT5mbGFncyAmIFBGUl9QSFlfUFJPUE9SVElPTkFMICkgPT0gMCApCi0gICAgICAgIHBmcmZhY2UtPm1heF9hZHZhbmNlX3dpZHRoID0gKEZUX1Nob3J0KXBoeV9mb250LT5zdGFuZGFyZF9hZHZhbmNlOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9JbnQgICAgbWF4ID0gMDsKLSAgICAgICAgRlRfVUludCAgIGNvdW50ID0gcGh5X2ZvbnQtPm51bV9jaGFyczsKLSAgICAgICAgUEZSX0NoYXIgIGdjaGFyID0gcGh5X2ZvbnQtPmNoYXJzOwotCi0KLSAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGdjaGFyKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBtYXggPCBnY2hhci0+YWR2YW5jZSApCi0gICAgICAgICAgICBtYXggPSBnY2hhci0+YWR2YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBmcmZhY2UtPm1heF9hZHZhbmNlX3dpZHRoID0gKEZUX1Nob3J0KW1heDsKLSAgICAgIH0KLQotICAgICAgcGZyZmFjZS0+bWF4X2FkdmFuY2VfaGVpZ2h0ID0gcGZyZmFjZS0+aGVpZ2h0OwotCi0gICAgICBwZnJmYWNlLT51bmRlcmxpbmVfcG9zaXRpb24gID0gKEZUX1Nob3J0KSggLXBmcmZhY2UtPnVuaXRzX3Blcl9FTSAvIDEwICk7Ci0gICAgICBwZnJmYWNlLT51bmRlcmxpbmVfdGhpY2tuZXNzID0gKEZUX1Nob3J0KSggIHBmcmZhY2UtPnVuaXRzX3Blcl9FTSAvIDMwICk7Ci0KLSAgICAgIC8qIGNyZWF0ZSBjaGFybWFwICovCi0gICAgICB7Ci0gICAgICAgIEZUX0NoYXJNYXBSZWMgIGNoYXJtYXA7Ci0KLQotICAgICAgICBjaGFybWFwLmZhY2UgICAgICAgID0gcGZyZmFjZTsKLSAgICAgICAgY2hhcm1hcC5wbGF0Zm9ybV9pZCA9IFRUX1BMQVRGT1JNX01JQ1JPU09GVDsKLSAgICAgICAgY2hhcm1hcC5lbmNvZGluZ19pZCA9IFRUX01TX0lEX1VOSUNPREVfQ1M7Ci0gICAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19VTklDT0RFOwotCi0gICAgICAgIGVycm9yID0gRlRfQ01hcF9OZXcoICZwZnJfY21hcF9jbGFzc19yZWMsIE5VTEwsICZjaGFybWFwLCBOVUxMICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBsb2FkZWQgYW55IGtlcm5pbmcgcGFpcnMgKi8KLSAgICAgIGlmICggcGh5X2ZvbnQtPm51bV9rZXJuX3BhaXJzICkKLSAgICAgICAgcGZyZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfS0VSTklORzsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgU0xPVCBPQkpFQ1QgTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwZnJfc2xvdF9pbml0KCBGVF9HbHlwaFNsb3QgIHBmcnNsb3QgKSAgICAgICAgLyogUEZSX1Nsb3QgKi8KLSAgewotICAgIFBGUl9TbG90ICAgICAgICBzbG90ICAgPSAoUEZSX1Nsb3QpcGZyc2xvdDsKLSAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyID0gcGZyc2xvdC0+aW50ZXJuYWwtPmxvYWRlcjsKLQotCi0gICAgcGZyX2dseXBoX2luaXQoICZzbG90LT5nbHlwaCwgbG9hZGVyICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcGZyX3Nsb3RfZG9uZSggRlRfR2x5cGhTbG90ICBwZnJzbG90ICkgICAgICAgIC8qIFBGUl9TbG90ICovCi0gIHsKLSAgICBQRlJfU2xvdCAgc2xvdCA9IChQRlJfU2xvdClwZnJzbG90OwotCi0KLSAgICBwZnJfZ2x5cGhfZG9uZSggJnNsb3QtPmdseXBoICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwZnJfc2xvdF9sb2FkKCBGVF9HbHlwaFNsb3QgIHBmcnNsb3QsICAgICAgICAgLyogUEZSX1Nsb3QgKi8KLSAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBwZnJzaXplLCAgICAgICAgIC8qIFBGUl9TaXplICovCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgUEZSX1Nsb3QgICAgIHNsb3QgICAgPSAoUEZSX1Nsb3QpcGZyc2xvdDsKLSAgICBQRlJfU2l6ZSAgICAgc2l6ZSAgICA9IChQRlJfU2l6ZSlwZnJzaXplOwotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBQRlJfRmFjZSAgICAgZmFjZSAgICA9IChQRlJfRmFjZSlwZnJzbG90LT5mYWNlOwotICAgIFBGUl9DaGFyICAgICBnY2hhcjsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSA9ICZwZnJzbG90LT5vdXRsaW5lOwotICAgIEZUX1VMb25nICAgICBncHNfb2Zmc2V0OwotCi0KLSAgICBGVF9UUkFDRTEoKCAicGZyX3Nsb3RfbG9hZDogZ2x5cGggaW5kZXggJWRcbiIsIGdpbmRleCApKTsKLQotICAgIGlmICggZ2luZGV4ID4gMCApCi0gICAgICBnaW5kZXgtLTsKLQotICAgIGlmICggIWZhY2UgfHwgZ2luZGV4ID49IGZhY2UtPnBoeV9mb250Lm51bV9jaGFycyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHRyeSB0byBsb2FkIGFuIGVtYmVkZGVkIGJpdG1hcCAqLwotICAgIGlmICggKCBsb2FkX2ZsYWdzICYgKCBGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19CSVRNQVAgKSApID09IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gcGZyX3Nsb3RfbG9hZF9iaXRtYXAoCi0gICAgICAgICAgICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX0JJVE1BUF9NRVRSSUNTX09OTFkgKSAhPSAwICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1NCSVRTX09OTFkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBnY2hhciAgICAgICAgICAgICAgID0gZmFjZS0+cGh5X2ZvbnQuY2hhcnMgKyBnaW5kZXg7Ci0gICAgcGZyc2xvdC0+Zm9ybWF0ICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotICAgIG91dGxpbmUtPm5fcG9pbnRzICAgPSAwOwotICAgIG91dGxpbmUtPm5fY29udG91cnMgPSAwOwotICAgIGdwc19vZmZzZXQgICAgICAgICAgPSBmYWNlLT5oZWFkZXIuZ3BzX3NlY3Rpb25fb2Zmc2V0OwotCi0gICAgLyogbG9hZCB0aGUgZ2x5cGggb3V0bGluZSAoRlRfTE9BRF9OT19SRUNVUlNFIGlzbid0IHN1cHBvcnRlZCkgKi8KLSAgICBlcnJvciA9IHBmcl9nbHlwaF9sb2FkKCAmc2xvdC0+Z2x5cGgsIGZhY2UtPnJvb3Quc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwc19vZmZzZXQsIGdjaGFyLT5ncHNfb2Zmc2V0LCBnY2hhci0+Z3BzX3NpemUgKTsKLQotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBGVF9CQm94ICAgICAgICAgICAgY2JveDsKLSAgICAgIEZUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzID0gJnBmcnNsb3QtPm1ldHJpY3M7Ci0gICAgICBGVF9Qb3MgICAgICAgICAgICAgYWR2YW5jZTsKLSAgICAgIEZUX1VJbnQgICAgICAgICAgICBlbV9tZXRyaWNzLCBlbV9vdXRsaW5lOwotICAgICAgRlRfQm9vbCAgICAgICAgICAgIHNjYWxpbmc7Ci0KLQotICAgICAgc2NhbGluZyA9IEZUX0JPT0woICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwICk7Ci0KLSAgICAgIC8qIGNvcHkgb3V0bGluZSBkYXRhICovCi0gICAgICAqb3V0bGluZSA9IHNsb3QtPmdseXBoLmxvYWRlci0+YmFzZS5vdXRsaW5lOwotCi0gICAgICBvdXRsaW5lLT5mbGFncyAmPSB+RlRfT1VUTElORV9PV05FUjsKLSAgICAgIG91dGxpbmUtPmZsYWdzIHw9IEZUX09VVExJTkVfUkVWRVJTRV9GSUxMOwotCi0gICAgICBpZiAoIHNpemUgJiYgcGZyc2l6ZS0+bWV0cmljcy55X3BwZW0gPCAyNCApCi0gICAgICAgIG91dGxpbmUtPmZsYWdzIHw9IEZUX09VVExJTkVfSElHSF9QUkVDSVNJT047Ci0KLSAgICAgIC8qIGNvbXB1dGUgdGhlIGFkdmFuY2UgdmVjdG9yICovCi0gICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9IDA7Ci0gICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSA9IDA7Ci0KLSAgICAgIGFkdmFuY2UgICAgPSBnY2hhci0+YWR2YW5jZTsKLSAgICAgIGVtX21ldHJpY3MgPSBmYWNlLT5waHlfZm9udC5tZXRyaWNzX3Jlc29sdXRpb247Ci0gICAgICBlbV9vdXRsaW5lID0gZmFjZS0+cGh5X2ZvbnQub3V0bGluZV9yZXNvbHV0aW9uOwotCi0gICAgICBpZiAoIGVtX21ldHJpY3MgIT0gZW1fb3V0bGluZSApCi0gICAgICAgIGFkdmFuY2UgPSBGVF9NdWxEaXYoIGFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWVtX291dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWVtX21ldHJpY3MgKTsKLQotICAgICAgaWYgKCBmYWNlLT5waHlfZm9udC5mbGFncyAmIFBGUl9QSFlfVkVSVElDQUwgKQotICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSA9IGFkdmFuY2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gYWR2YW5jZTsKLQotICAgICAgcGZyc2xvdC0+bGluZWFySG9yaUFkdmFuY2UgPSBtZXRyaWNzLT5ob3JpQWR2YW5jZTsKLSAgICAgIHBmcnNsb3QtPmxpbmVhclZlcnRBZHZhbmNlID0gbWV0cmljcy0+dmVydEFkdmFuY2U7Ci0KLSAgICAgIC8qIG1ha2UgdXAgdmVydGljYWwgbWV0cmljcyg/KSAqLwotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gMDsKLSAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IDA7Ci0KLSNpZiAwIC8qIHNvbWUgZm9udHMgc2VlbSB0byBiZSBicm9rZW4gaGVyZSEgKi8KLQotICAgICAgLyogQXBwbHkgdGhlIGZvbnQgbWF0cml4LCBpZiBhbnkuICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogVE9ETzogVGVzdCBleGlzdGluZyBmb250cyB3aXRoIHVudXN1YWwgbWF0cml4ICAqLwotICAgICAgLyogd2hldGhlciB3ZSBoYXZlIHRvIGFkanVzdCBVbml0cyBwZXIgRU0uICAgICAgICAqLwotICAgICAgewotICAgICAgICBGVF9NYXRyaXggZm9udF9tYXRyaXg7Ci0KLQotICAgICAgICBmb250X21hdHJpeC54eCA9IGZhY2UtPmxvZ19mb250Lm1hdHJpeFswXSA8PCA4OwotICAgICAgICBmb250X21hdHJpeC55eCA9IGZhY2UtPmxvZ19mb250Lm1hdHJpeFsxXSA8PCA4OwotICAgICAgICBmb250X21hdHJpeC54eSA9IGZhY2UtPmxvZ19mb250Lm1hdHJpeFsyXSA8PCA4OwotICAgICAgICBmb250X21hdHJpeC55eSA9IGZhY2UtPmxvZ19mb250Lm1hdHJpeFszXSA8PCA4OwotCi0gICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCBvdXRsaW5lLCAmZm9udF9tYXRyaXggKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICAvKiBzY2FsZSB3aGVuIG5lZWRlZCAqLwotICAgICAgaWYgKCBzY2FsaW5nICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICAgICAgbjsKLSAgICAgICAgRlRfRml4ZWQgICAgeF9zY2FsZSA9IHBmcnNpemUtPm1ldHJpY3MueF9zY2FsZTsKLSAgICAgICAgRlRfRml4ZWQgICAgeV9zY2FsZSA9IHBmcnNpemUtPm1ldHJpY3MueV9zY2FsZTsKLSAgICAgICAgRlRfVmVjdG9yKiAgdmVjICAgICA9IG91dGxpbmUtPnBvaW50czsKLQotCi0gICAgICAgIC8qIHNjYWxlIG91dGxpbmUgcG9pbnRzICovCi0gICAgICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0bGluZS0+bl9wb2ludHM7IG4rKywgdmVjKysgKQotICAgICAgICB7Ci0gICAgICAgICAgdmVjLT54ID0gRlRfTXVsRml4KCB2ZWMtPngsIHhfc2NhbGUgKTsKLSAgICAgICAgICB2ZWMtPnkgPSBGVF9NdWxGaXgoIHZlYy0+eSwgeV9zY2FsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2NhbGUgdGhlIGFkdmFuY2UgKi8KLSAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlBZHZhbmNlLCB4X3NjYWxlICk7Ci0gICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwgeV9zY2FsZSApOwotICAgICAgfQotCi0gICAgICAvKiBjb21wdXRlIHRoZSByZXN0IG9mIHRoZSBtZXRyaWNzICovCi0gICAgICBGVF9PdXRsaW5lX0dldF9DQm94KCBvdXRsaW5lLCAmY2JveCApOwotCi0gICAgICBtZXRyaWNzLT53aWR0aCAgICAgICAgPSBjYm94LnhNYXggLSBjYm94LnhNaW47Ci0gICAgICBtZXRyaWNzLT5oZWlnaHQgICAgICAgPSBjYm94LnlNYXggLSBjYm94LnlNaW47Ci0gICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBjYm94LnhNaW47Ci0gICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBjYm94LnlNYXggLSBtZXRyaWNzLT5oZWlnaHQ7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgS0VSTklORyBNRVRIT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcGZyX2ZhY2VfZ2V0X2tlcm5pbmcoIEZUX0ZhY2UgICAgIHBmcmZhY2UsICAgICAgICAvKiBQRlJfRmFjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGgxLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGgyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAga2VybmluZyApCi0gIHsKLSAgICBQRlJfRmFjZSAgICAgZmFjZSAgICAgPSAoUEZSX0ZhY2UpcGZyZmFjZTsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgICAgPSBGVF9FcnJfT2s7Ci0gICAgUEZSX1BoeUZvbnQgIHBoeV9mb250ID0gJmZhY2UtPnBoeV9mb250OwotICAgIEZUX1VJbnQzMiAgICBjb2RlMSwgY29kZTIsIHBhaXI7Ci0KLQotICAgIGtlcm5pbmctPnggPSAwOwotICAgIGtlcm5pbmctPnkgPSAwOwotCi0gICAgaWYgKCBnbHlwaDEgPiAwICkKLSAgICAgIGdseXBoMS0tOwotCi0gICAgaWYgKCBnbHlwaDIgPiAwICkKLSAgICAgIGdseXBoMi0tOwotCi0gICAgLyogY29udmVydCBnbHlwaCBpbmRpY2VzIHRvIGNoYXJhY3RlciBjb2RlcyAqLwotICAgIGlmICggZ2x5cGgxID4gcGh5X2ZvbnQtPm51bV9jaGFycyB8fAotICAgICAgICAgZ2x5cGgyID4gcGh5X2ZvbnQtPm51bV9jaGFycyApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBjb2RlMSA9IHBoeV9mb250LT5jaGFyc1tnbHlwaDFdLmNoYXJfY29kZTsKLSAgICBjb2RlMiA9IHBoeV9mb250LT5jaGFyc1tnbHlwaDJdLmNoYXJfY29kZTsKLSAgICBwYWlyICA9IFBGUl9LRVJOX0lOREVYKCBjb2RlMSwgY29kZTIgKTsKLQotICAgIC8qIG5vdyBzZWFyY2ggdGhlIGxpc3Qgb2Yga2VybmluZyBpdGVtcyAqLwotICAgIHsKLSAgICAgIFBGUl9LZXJuSXRlbSAgaXRlbSAgID0gcGh5X2ZvbnQtPmtlcm5faXRlbXM7Ci0gICAgICBGVF9TdHJlYW0gICAgIHN0cmVhbSA9IHBmcmZhY2UtPnN0cmVhbTsKLQotCi0gICAgICBmb3IgKCA7IGl0ZW07IGl0ZW0gPSBpdGVtLT5uZXh0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwYWlyID49IGl0ZW0tPnBhaXIxICYmIHBhaXIgPD0gaXRlbS0+cGFpcjIgKQotICAgICAgICAgIGdvdG8gRm91bmRQYWlyOwotICAgICAgfQotICAgICAgZ290byBFeGl0OwotCi0gICAgRm91bmRQYWlyOiAvKiB3ZSBmb3VuZCBhbiBpdGVtLCBub3cgcGFyc2UgaXQgYW5kIGZpbmQgdGhlIHZhbHVlIGlmIGFueSAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggaXRlbS0+b2Zmc2V0ICkgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBpdGVtLT5wYWlyX2NvdW50ICogaXRlbS0+cGFpcl9zaXplICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgICBjb3VudCAgICAgICA9IGl0ZW0tPnBhaXJfY291bnQ7Ci0gICAgICAgIEZUX1VJbnQgICAgc2l6ZSAgICAgICAgPSBpdGVtLT5wYWlyX3NpemU7Ci0gICAgICAgIEZUX1VJbnQgICAgcG93ZXIgICAgICAgPSAxIDw8IEZUX01TQiggY291bnQgKTsKLSAgICAgICAgRlRfVUludCAgICBwcm9iZSAgICAgICA9IHBvd2VyICogc2l6ZTsKLSAgICAgICAgRlRfVUludCAgICBleHRyYSAgICAgICA9IGNvdW50IC0gcG93ZXI7Ci0gICAgICAgIEZUX0J5dGUqICAgYmFzZSAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICAgICAgRlRfQm9vbCAgICB0d29ieXRlcyAgICA9IEZUX0JPT0woIGl0ZW0tPmZsYWdzICYgUEZSX0tFUk5fMkJZVEVfQ0hBUiApOwotICAgICAgICBGVF9Cb29sICAgIHR3b2J5dGVfYWRqID0gRlRfQk9PTCggaXRlbS0+ZmxhZ3MgJiBQRlJfS0VSTl8yQllURV9BREogICk7Ci0gICAgICAgIEZUX0J5dGUqICAgcDsKLSAgICAgICAgRlRfVUludDMyICBjcGFpcjsKLQotCi0gICAgICAgIGlmICggZXh0cmEgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIHAgPSBiYXNlICsgZXh0cmEgKiBzaXplOwotCi0gICAgICAgICAgaWYgKCB0d29ieXRlcyApCi0gICAgICAgICAgICBjcGFpciA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjcGFpciA9IFBGUl9ORVhUX0tQQUlSKCBwICk7Ci0KLSAgICAgICAgICBpZiAoIGNwYWlyID09IHBhaXIgKQotICAgICAgICAgICAgZ290byBGb3VuZDsKLQotICAgICAgICAgIGlmICggY3BhaXIgPCBwYWlyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHR3b2J5dGVfYWRqICkKLSAgICAgICAgICAgICAgcCArPSAyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICBiYXNlID0gcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoIHByb2JlID4gc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICBwcm9iZSA+Pj0gMTsKLSAgICAgICAgICBwICAgICAgID0gYmFzZSArIHByb2JlOwotCi0gICAgICAgICAgaWYgKCB0d29ieXRlcyApCi0gICAgICAgICAgICBjcGFpciA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjcGFpciA9IFBGUl9ORVhUX0tQQUlSKCBwICk7Ci0KLSAgICAgICAgICBpZiAoIGNwYWlyID09IHBhaXIgKQotICAgICAgICAgICAgZ290byBGb3VuZDsKLQotICAgICAgICAgIGlmICggY3BhaXIgPCBwYWlyICkKLSAgICAgICAgICAgIGJhc2UgKz0gcHJvYmU7Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gYmFzZTsKLQotICAgICAgICBpZiAoIHR3b2J5dGVzICkKLSAgICAgICAgICBjcGFpciA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGNwYWlyID0gUEZSX05FWFRfS1BBSVIoIHAgKTsKLQotICAgICAgICBpZiAoIGNwYWlyID09IHBhaXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICB2YWx1ZTsKLQotCi0gICAgICAgIEZvdW5kOgotICAgICAgICAgIGlmICggdHdvYnl0ZV9hZGogKQotICAgICAgICAgICAgdmFsdWUgPSBGVF9QRUVLX1NIT1JUKCBwICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFsdWUgPSBwWzBdOwotCi0gICAgICAgICAga2VybmluZy0+eCA9IGl0ZW0tPmJhc2VfYWRqICsgdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJvYmpzLmggYi9zcmMvcGZyL3Bmcm9ianMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhZDY1Ni4uMDAwMDAwMAotLS0gYS9zcmMvcGZyL3Bmcm9ianMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBmcm9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQRlIgb2JqZWN0IG1ldGhvZHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBQRlJPQkpTX0hfCi0jZGVmaW5lIFBGUk9CSlNfSF8KLQotI2luY2x1ZGUgInBmcnR5cGVzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUEZSX0ZhY2VSZWNfKiAgUEZSX0ZhY2U7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgUEZSX1NpemVSZWNfKiAgUEZSX1NpemU7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgUEZSX1Nsb3RSZWNfKiAgUEZSX1Nsb3Q7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUEZSX0ZhY2VSZWNfCi0gIHsKLSAgICBGVF9GYWNlUmVjICAgICAgcm9vdDsKLSAgICBQRlJfSGVhZGVyUmVjICAgaGVhZGVyOwotICAgIFBGUl9Mb2dGb250UmVjICBsb2dfZm9udDsKLSAgICBQRlJfUGh5Rm9udFJlYyAgcGh5X2ZvbnQ7Ci0KLSAgfSBQRlJfRmFjZVJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQRlJfU2l6ZVJlY18KLSAgewotICAgIEZUX1NpemVSZWMgIHJvb3Q7Ci0KLSAgfSBQRlJfU2l6ZVJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQRlJfU2xvdFJlY18KLSAgewotICAgIEZUX0dseXBoU2xvdFJlYyAgcm9vdDsKLSAgICBQRlJfR2x5cGhSZWMgICAgIGdseXBoOwotCi0gIH0gUEZSX1Nsb3RSZWM7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwZnJfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGZhY2UsICAgICAgICAgICAvKiBQRlJfRmFjZSAqLwotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBmcl9mYWNlX2RvbmUoIEZUX0ZhY2UgIGZhY2UgKTsgICAgICAgICAgICAgICAvKiBQRlJfRmFjZSAqLwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcGZyX2ZhY2VfZ2V0X2tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsICAgICAgIC8qIFBGUl9GYWNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBrZXJuaW5nICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwZnJfc2xvdF9pbml0KCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsgICAgICAgICAgLyogUEZSX1Nsb3QgKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBmcl9zbG90X2RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApOyAgICAgICAgICAvKiBQRlJfU2xvdCAqLwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcGZyX3Nsb3RfbG9hZCggRlRfR2x5cGhTbG90ICBzbG90LCAgICAgICAgICAgIC8qIFBGUl9TbG90ICovCi0gICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwgICAgICAgICAgICAvKiBQRlJfU2l6ZSAqLwotICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogUEZST0JKU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJzYml0LmMgYi9zcmMvcGZyL3BmcnNiaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRlN2QwZS4uMDAwMDAwMAotLS0gYS9zcmMvcGZyL3BmcnNiaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDgwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJzYml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIGJpdG1hcCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJwZnJzYml0LmgiCi0jaW5jbHVkZSAicGZybG9hZC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLQotI2luY2x1ZGUgInBmcmVycm9yLmgiCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcGZyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgUEZSIEJJVCBXUklURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgUEZSX0JpdFdyaXRlcl8KLSAgewotICAgIEZUX0J5dGUqICBsaW5lOyAgICAgIC8qIGN1cnJlbnQgbGluZSBzdGFydCAgICAgICAgICAgICAgICovCi0gICAgRlRfSW50ICAgIHBpdGNoOyAgICAgLyogbGluZSBzaXplIGluIGJ5dGVzICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgd2lkdGg7ICAgICAvKiB3aWR0aCBpbiBwaXhlbHMvYml0cyAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICByb3dzOyAgICAgIC8qIG51bWJlciBvZiByZW1haW5pbmcgcm93cyB0byBzY2FuICovCi0gICAgRlRfVUludCAgIHRvdGFsOyAgICAgLyogdG90YWwgbnVtYmVyIG9mIGJpdHMgdG8gZHJhdyAgICAgKi8KLQotICB9IFBGUl9CaXRXcml0ZXJSZWMsICpQRlJfQml0V3JpdGVyOwotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGZyX2JpdHdyaXRlcl9pbml0KCBQRlJfQml0V3JpdGVyICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgICAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIGRlY3JlYXNpbmcgKQotICB7Ci0gICAgd3JpdGVyLT5saW5lICAgPSB0YXJnZXQtPmJ1ZmZlcjsKLSAgICB3cml0ZXItPnBpdGNoICA9IHRhcmdldC0+cGl0Y2g7Ci0gICAgd3JpdGVyLT53aWR0aCAgPSB0YXJnZXQtPndpZHRoOwotICAgIHdyaXRlci0+cm93cyAgID0gdGFyZ2V0LT5yb3dzOwotICAgIHdyaXRlci0+dG90YWwgID0gd3JpdGVyLT53aWR0aCAqIHdyaXRlci0+cm93czsKLQotICAgIGlmICggIWRlY3JlYXNpbmcgKQotICAgIHsKLSAgICAgIHdyaXRlci0+bGluZSArPSB3cml0ZXItPnBpdGNoICogKEZUX0ludCkoIHRhcmdldC0+cm93cyAtIDEgKTsKLSAgICAgIHdyaXRlci0+cGl0Y2ggPSAtd3JpdGVyLT5waXRjaDsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBmcl9iaXR3cml0ZXJfZGVjb2RlX2J5dGVzKCBQRlJfQml0V3JpdGVyICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgbGltaXQgKQotICB7Ci0gICAgRlRfVUludCAgIG4sIHJlbG9hZDsKLSAgICBGVF9VSW50ICAgbGVmdCA9IHdyaXRlci0+d2lkdGg7Ci0gICAgRlRfQnl0ZSogIGN1ciAgPSB3cml0ZXItPmxpbmU7Ci0gICAgRlRfVUludCAgIG1hc2sgPSAweDgwOwotICAgIEZUX1VJbnQgICB2YWwgID0gMDsKLSAgICBGVF9VSW50ICAgYyAgICA9IDA7Ci0KLQotICAgIG4gPSAoRlRfVUludCkoIGxpbWl0IC0gcCApICogODsKLSAgICBpZiAoIG4gPiB3cml0ZXItPnRvdGFsICkKLSAgICAgIG4gPSB3cml0ZXItPnRvdGFsOwotCi0gICAgcmVsb2FkID0gbiAmIDc7Ci0KLSAgICBmb3IgKCA7IG4gPiAwOyBuLS0gKQotICAgIHsKLSAgICAgIGlmICggKCBuICYgNyApID09IHJlbG9hZCApCi0gICAgICAgIHZhbCA9ICpwKys7Ci0KLSAgICAgIGlmICggdmFsICYgMHg4MCApCi0gICAgICAgIGMgfD0gbWFzazsKLQotICAgICAgdmFsICA8PD0gMTsKLSAgICAgIG1hc2sgPj49IDE7Ci0KLSAgICAgIGlmICggLS1sZWZ0IDw9IDAgKQotICAgICAgewotICAgICAgICBjdXJbMF0gPSAoRlRfQnl0ZSljOwotICAgICAgICBsZWZ0ICAgPSB3cml0ZXItPndpZHRoOwotICAgICAgICBtYXNrICAgPSAweDgwOwotCi0gICAgICAgIHdyaXRlci0+bGluZSArPSB3cml0ZXItPnBpdGNoOwotICAgICAgICBjdXIgICAgICAgICAgID0gd3JpdGVyLT5saW5lOwotICAgICAgICBjICAgICAgICAgICAgID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBtYXNrID09IDAgKQotICAgICAgewotICAgICAgICBjdXJbMF0gPSAoRlRfQnl0ZSljOwotICAgICAgICBtYXNrICAgPSAweDgwOwotICAgICAgICBjICAgICAgPSAwOwotICAgICAgICBjdXIrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIG1hc2sgIT0gMHg4MCApCi0gICAgICBjdXJbMF0gPSAoRlRfQnl0ZSljOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwZnJfYml0d3JpdGVyX2RlY29kZV9ybGUxKCBQRlJfQml0V3JpdGVyICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgIGxpbWl0ICkKLSAgewotICAgIEZUX0ludCAgICBwaGFzZSwgY291bnQsIGNvdW50c1syXTsKLSAgICBGVF9VSW50ICAgbiwgcmVsb2FkOwotICAgIEZUX1VJbnQgICBsZWZ0ID0gd3JpdGVyLT53aWR0aDsKLSAgICBGVF9CeXRlKiAgY3VyICA9IHdyaXRlci0+bGluZTsKLSAgICBGVF9VSW50ICAgbWFzayA9IDB4ODA7Ci0gICAgRlRfVUludCAgIGMgICAgPSAwOwotCi0KLSAgICBuID0gd3JpdGVyLT50b3RhbDsKLQotICAgIHBoYXNlICAgICA9IDE7Ci0gICAgY291bnRzWzBdID0gMDsKLSAgICBjb3VudHNbMV0gPSAwOwotICAgIGNvdW50ICAgICA9IDA7Ci0gICAgcmVsb2FkICAgID0gMTsKLQotICAgIGZvciAoIDsgbiA+IDA7IG4tLSApCi0gICAgewotICAgICAgaWYgKCByZWxvYWQgKQotICAgICAgewotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwaGFzZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICB2OwotCi0KLSAgICAgICAgICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB2ICAgICAgICAgPSAqcCsrOwotICAgICAgICAgICAgY291bnRzWzBdID0gdiA+PiA0OwotICAgICAgICAgICAgY291bnRzWzFdID0gdiAmIDE1OwotICAgICAgICAgICAgcGhhc2UgICAgID0gMDsKLSAgICAgICAgICAgIGNvdW50ICAgICA9IGNvdW50c1swXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBoYXNlID0gMTsKLSAgICAgICAgICAgIGNvdW50ID0gY291bnRzWzFdOwotICAgICAgICAgIH0KLQotICAgICAgICB9IHdoaWxlICggY291bnQgPT0gMCApOwotICAgICAgfQotCi0gICAgICBpZiAoIHBoYXNlICkKLSAgICAgICAgYyB8PSBtYXNrOwotCi0gICAgICBtYXNrID4+PSAxOwotCi0gICAgICBpZiAoIC0tbGVmdCA8PSAwICkKLSAgICAgIHsKLSAgICAgICAgY3VyWzBdID0gKEZUX0J5dGUpYzsKLSAgICAgICAgbGVmdCAgID0gd3JpdGVyLT53aWR0aDsKLSAgICAgICAgbWFzayAgID0gMHg4MDsKLQotICAgICAgICB3cml0ZXItPmxpbmUgKz0gd3JpdGVyLT5waXRjaDsKLSAgICAgICAgY3VyICAgICAgICAgICA9IHdyaXRlci0+bGluZTsKLSAgICAgICAgYyAgICAgICAgICAgICA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggbWFzayA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgY3VyWzBdID0gKEZUX0J5dGUpYzsKLSAgICAgICAgbWFzayAgID0gMHg4MDsKLSAgICAgICAgYyAgICAgID0gMDsKLSAgICAgICAgY3VyKys7Ci0gICAgICB9Ci0KLSAgICAgIHJlbG9hZCA9ICggLS1jb3VudCA8PSAwICk7Ci0gICAgfQotCi0gICAgaWYgKCBtYXNrICE9IDB4ODAgKQotICAgICAgY3VyWzBdID0gKEZUX0J5dGUpIGM7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBmcl9iaXR3cml0ZXJfZGVjb2RlX3JsZTIoIFBGUl9CaXRXcml0ZXIgIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgbGltaXQgKQotICB7Ci0gICAgRlRfSW50ICAgIHBoYXNlLCBjb3VudDsKLSAgICBGVF9VSW50ICAgbiwgcmVsb2FkOwotICAgIEZUX1VJbnQgICBsZWZ0ID0gd3JpdGVyLT53aWR0aDsKLSAgICBGVF9CeXRlKiAgY3VyICA9IHdyaXRlci0+bGluZTsKLSAgICBGVF9VSW50ICAgbWFzayA9IDB4ODA7Ci0gICAgRlRfVUludCAgIGMgICAgPSAwOwotCi0KLSAgICBuID0gd3JpdGVyLT50b3RhbDsKLQotICAgIHBoYXNlICA9IDE7Ci0gICAgY291bnQgID0gMDsKLSAgICByZWxvYWQgPSAxOwotCi0gICAgZm9yICggOyBuID4gMDsgbi0tICkKLSAgICB7Ci0gICAgICBpZiAoIHJlbG9hZCApCi0gICAgICB7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHAgPj0gbGltaXQgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjb3VudCA9ICpwKys7Ci0gICAgICAgICAgcGhhc2UgPSBwaGFzZSBeIDE7Ci0KLSAgICAgICAgfSB3aGlsZSAoIGNvdW50ID09IDAgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBwaGFzZSApCi0gICAgICAgIGMgfD0gbWFzazsKLQotICAgICAgbWFzayA+Pj0gMTsKLQotICAgICAgaWYgKCAtLWxlZnQgPD0gMCApCi0gICAgICB7Ci0gICAgICAgIGN1clswXSA9IChGVF9CeXRlKWM7Ci0gICAgICAgIGMgICAgICA9IDA7Ci0gICAgICAgIG1hc2sgICA9IDB4ODA7Ci0gICAgICAgIGxlZnQgICA9IHdyaXRlci0+d2lkdGg7Ci0KLSAgICAgICAgd3JpdGVyLT5saW5lICs9IHdyaXRlci0+cGl0Y2g7Ci0gICAgICAgIGN1ciAgICAgICAgICAgPSB3cml0ZXItPmxpbmU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggbWFzayA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgY3VyWzBdID0gKEZUX0J5dGUpYzsKLSAgICAgICAgYyAgICAgID0gMDsKLSAgICAgICAgbWFzayAgID0gMHg4MDsKLSAgICAgICAgY3VyKys7Ci0gICAgICB9Ci0KLSAgICAgIHJlbG9hZCA9ICggLS1jb3VudCA8PSAwICk7Ci0gICAgfQotCi0gICAgaWYgKCBtYXNrICE9IDB4ODAgKQotICAgICAgY3VyWzBdID0gKEZUX0J5dGUpIGM7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgIEJJVE1BUCBEQVRBIERFQ09ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHBmcl9sb29rdXBfYml0bWFwX2RhdGEoIEZUX0J5dGUqICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCogICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgZm91bmRfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGZvdW5kX3NpemUgKQotICB7Ci0gICAgRlRfVUludCAgIG1pbiwgbWF4LCBjaGFyX2xlbjsKLSAgICBGVF9Cb29sICAgdHdvID0gRlRfQk9PTCggKmZsYWdzICYgUEZSX0JJVE1BUF8yQllURV9DSEFSQ09ERSApOwotICAgIEZUX0J5dGUqICBidWZmOwotCi0KLSAgICBjaGFyX2xlbiA9IDQ7Ci0gICAgaWYgKCB0d28gKQotICAgICAgY2hhcl9sZW4gKz0gMTsKLSAgICBpZiAoICpmbGFncyAmIFBGUl9CSVRNQVBfMkJZVEVfU0laRSApCi0gICAgICBjaGFyX2xlbiArPSAxOwotICAgIGlmICggKmZsYWdzICYgUEZSX0JJVE1BUF8zQllURV9PRkZTRVQgKQotICAgICAgY2hhcl9sZW4gKz0gMTsKLQotICAgIGlmICggISggKmZsYWdzICYgUEZSX0JJVE1BUF9DSEFSQ09ERVNfVkFMSURBVEVEICkgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBwOwotICAgICAgRlRfQnl0ZSogIGxpbTsKLSAgICAgIEZUX1VJbnQgICBjb2RlOwotICAgICAgRlRfTG9uZyAgIHByZXZfY29kZTsKLQotCi0gICAgICAqZmxhZ3MgICAgfD0gUEZSX0JJVE1BUF9WQUxJRF9DSEFSQ09ERVM7Ci0gICAgICBwcmV2X2NvZGUgID0gLTE7Ci0gICAgICBsaW0gICAgICAgID0gYmFzZSArIGNvdW50ICogY2hhcl9sZW47Ci0KLSAgICAgIGlmICggbGltID4gbGltaXQgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAicGZyX2xvb2t1cF9iaXRtYXBfZGF0YToiCi0gICAgICAgICAgICAgICAgICAgICIgbnVtYmVyIG9mIGJpdG1hcCByZWNvcmRzIHRvbyBsYXJnZSxcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAiIHRodXMgaWdub3JpbmcgYWxsIGJpdG1hcHMgaW4gdGhpcyBzdHJpa2VcbiIgKSk7Ci0gICAgICAgICpmbGFncyAmPSB+UEZSX0JJVE1BUF9WQUxJRF9DSEFSQ09ERVM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgcmVjb3JkcyBhcmUgc29ydGVkIGJ5IGNvZGUgKi8KLSAgICAgICAgZm9yICggcCA9IGJhc2U7IHAgPCBsaW07IHAgKz0gY2hhcl9sZW4gKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCB0d28gKQotICAgICAgICAgICAgY29kZSA9IEZUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29kZSA9ICpwOwotCi0gICAgICAgICAgaWYgKCAoRlRfTG9uZyljb2RlIDw9IHByZXZfY29kZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0UwKCggInBmcl9sb29rdXBfYml0bWFwX2RhdGE6IgotICAgICAgICAgICAgICAgICAgICAgICAgIiBiaXRtYXAgcmVjb3JkcyBhcmUgbm90IHNvcnRlZCxcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgdGh1cyBpZ25vcmluZyBhbGwgYml0bWFwcyBpbiB0aGlzIHN0cmlrZVxuIiApKTsKLSAgICAgICAgICAgICpmbGFncyAmPSB+UEZSX0JJVE1BUF9WQUxJRF9DSEFSQ09ERVM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwcmV2X2NvZGUgPSBjb2RlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgICpmbGFncyB8PSBQRlJfQklUTUFQX0NIQVJDT0RFU19WQUxJREFURUQ7Ci0gICAgfQotCi0gICAgLyogaWdub3JlIGJpdG1hcHMgaW4gY2FzZSB0YWJsZSBpcyBub3QgdmFsaWQgICAgICovCi0gICAgLyogKHRoaXMgbWlnaHQgYmUgc2FuaXRpemVkLCBidXQgUEZSIGlzIGRlYWQuLi4pICovCi0gICAgaWYgKCAhKCAqZmxhZ3MgJiBQRlJfQklUTUFQX1ZBTElEX0NIQVJDT0RFUyApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gY291bnQ7Ci0KLSAgICAvKiBiaW5hcnkgc2VhcmNoICovCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIG1pZCwgY29kZTsKLQotCi0gICAgICBtaWQgID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgYnVmZiA9IGJhc2UgKyBtaWQgKiBjaGFyX2xlbjsKLQotICAgICAgaWYgKCB0d28gKQotICAgICAgICBjb2RlID0gUEZSX05FWFRfVVNIT1JUKCBidWZmICk7Ci0gICAgICBlbHNlCi0gICAgICAgIGNvZGUgPSBQRlJfTkVYVF9CWVRFKCBidWZmICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgY29kZSApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UgaWYgKCBjaGFyX2NvZGUgPiBjb2RlICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgICAgZ290byBGb3VuZF9JdDsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICAvKiBOb3QgZm91bmQgKi8KLSAgICAqZm91bmRfc2l6ZSAgID0gMDsKLSAgICAqZm91bmRfb2Zmc2V0ID0gMDsKLSAgICByZXR1cm47Ci0KLSAgRm91bmRfSXQ6Ci0gICAgaWYgKCAqZmxhZ3MgJiBQRlJfQklUTUFQXzJCWVRFX1NJWkUgKQotICAgICAgKmZvdW5kX3NpemUgPSBQRlJfTkVYVF9VU0hPUlQoIGJ1ZmYgKTsKLSAgICBlbHNlCi0gICAgICAqZm91bmRfc2l6ZSA9IFBGUl9ORVhUX0JZVEUoIGJ1ZmYgKTsKLQotICAgIGlmICggKmZsYWdzICYgUEZSX0JJVE1BUF8zQllURV9PRkZTRVQgKQotICAgICAgKmZvdW5kX29mZnNldCA9IFBGUl9ORVhUX1VMT05HKCBidWZmICk7Ci0gICAgZWxzZQotICAgICAgKmZvdW5kX29mZnNldCA9IFBGUl9ORVhUX1VTSE9SVCggYnVmZiApOwotICB9Ci0KLQotICAvKiBsb2FkIGJpdG1hcCBtZXRyaWNzLiAgYCpwYWR2YW5jZScgbXVzdCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgKi8KLSAgLyogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGZyX2xvYWRfYml0bWFwX21ldHJpY3MoIEZUX0J5dGUqKiAgcGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzY2FsZWRfYWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAqYXhwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgKmF5cG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICpheHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmF5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAqYWFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFmb3JtYXQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUgICBmbGFnczsKLSAgICBGVF9CeXRlICAgYjsKLSAgICBGVF9CeXRlKiAgcCA9ICpwZGF0YTsKLSAgICBGVF9Mb25nICAgeHBvcywgeXBvcywgYWR2YW5jZTsKLSAgICBGVF9VSW50ICAgeHNpemUsIHlzaXplOwotCi0KLSAgICBQRlJfQ0hFQ0soIDEgKTsKLSAgICBmbGFncyA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLQotICAgIHhwb3MgICAgPSAwOwotICAgIHlwb3MgICAgPSAwOwotICAgIHhzaXplICAgPSAwOwotICAgIHlzaXplICAgPSAwOwotICAgIGFkdmFuY2UgPSAwOwotCi0gICAgc3dpdGNoICggZmxhZ3MgJiAzICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgUEZSX0NIRUNLKCAxICk7Ci0gICAgICBiICAgID0gUEZSX05FWFRfQllURSggcCApOwotICAgICAgeHBvcyA9IChGVF9DaGFyKWIgPj4gNDsKLSAgICAgIHlwb3MgPSAoIChGVF9DaGFyKSggYiA8PCA0ICkgKSA+PiA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBQRlJfQ0hFQ0soIDIgKTsKLSAgICAgIHhwb3MgPSBQRlJfTkVYVF9JTlQ4KCBwICk7Ci0gICAgICB5cG9zID0gUEZSX05FWFRfSU5UOCggcCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBQRlJfQ0hFQ0soIDQgKTsKLSAgICAgIHhwb3MgPSBQRlJfTkVYVF9TSE9SVCggcCApOwotICAgICAgeXBvcyA9IFBGUl9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIFBGUl9DSEVDSyggNiApOwotICAgICAgeHBvcyA9IFBGUl9ORVhUX0xPTkcoIHAgKTsKLSAgICAgIHlwb3MgPSBQRlJfTkVYVF9MT05HKCBwICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gICAgfQotCi0gICAgZmxhZ3MgPj49IDI7Ci0gICAgc3dpdGNoICggZmxhZ3MgJiAzICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgLyogYmxhbmsgaW1hZ2UgKi8KLSAgICAgIHhzaXplID0gMDsKLSAgICAgIHlzaXplID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgUEZSX0NIRUNLKCAxICk7Ci0gICAgICBiICAgICA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLSAgICAgIHhzaXplID0gKCBiID4+IDQgKSAmIDB4RjsKLSAgICAgIHlzaXplID0gYiAmIDB4RjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgUEZSX0NIRUNLKCAyICk7Ci0gICAgICB4c2l6ZSA9IFBGUl9ORVhUX0JZVEUoIHAgKTsKLSAgICAgIHlzaXplID0gUEZSX05FWFRfQllURSggcCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICBQRlJfQ0hFQ0soIDQgKTsKLSAgICAgIHhzaXplID0gUEZSX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICB5c2l6ZSA9IFBGUl9ORVhUX1VTSE9SVCggcCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgOwotICAgIH0KLQotICAgIGZsYWdzID4+PSAyOwotICAgIHN3aXRjaCAoIGZsYWdzICYgMyApCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGFkdmFuY2UgPSBzY2FsZWRfYWR2YW5jZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgUEZSX0NIRUNLKCAxICk7Ci0gICAgICBhZHZhbmNlID0gUEZSX05FWFRfSU5UOCggcCApICogMjU2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBQRlJfQ0hFQ0soIDIgKTsKLSAgICAgIGFkdmFuY2UgPSBQRlJfTkVYVF9TSE9SVCggcCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICBQRlJfQ0hFQ0soIDMgKTsKLSAgICAgIGFkdmFuY2UgPSBQRlJfTkVYVF9MT05HKCBwICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gICAgfQotCi0gICAgKmF4cG9zICAgID0geHBvczsKLSAgICAqYXlwb3MgICAgPSB5cG9zOwotICAgICpheHNpemUgICA9IHhzaXplOwotICAgICpheXNpemUgICA9IHlzaXplOwotICAgICphYWR2YW5jZSA9IGFkdmFuY2U7Ci0gICAgKmFmb3JtYXQgID0gZmxhZ3MgPj4gMjsKLSAgICAqcGRhdGEgICAgPSBwOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIFRvb19TaG9ydDoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgRlRfRVJST1IoKCAicGZyX2xvYWRfYml0bWFwX21ldHJpY3M6IGludmFsaWQgZ2x5cGggZGF0YVxuIiApKTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwZnJfbG9hZF9iaXRtYXBfYml0cyggRlRfQnl0ZSogICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgZGVjcmVhc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogIHRhcmdldCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBQRlJfQml0V3JpdGVyUmVjICB3cml0ZXI7Ci0KLQotICAgIGlmICggdGFyZ2V0LT5yb3dzID4gMCAmJiB0YXJnZXQtPndpZHRoID4gMCApCi0gICAgewotICAgICAgcGZyX2JpdHdyaXRlcl9pbml0KCAmd3JpdGVyLCB0YXJnZXQsIGRlY3JlYXNpbmcgKTsKLQotICAgICAgc3dpdGNoICggZm9ybWF0ICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDogLyogcGFja2VkIGJpdHMgKi8KLSAgICAgICAgcGZyX2JpdHdyaXRlcl9kZWNvZGVfYnl0ZXMoICZ3cml0ZXIsIHAsIGxpbWl0ICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDE6IC8qIFJMRTEgKi8KLSAgICAgICAgcGZyX2JpdHdyaXRlcl9kZWNvZGVfcmxlMSggJndyaXRlciwgcCwgbGltaXQgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjogLyogUkxFMiAqLwotICAgICAgICBwZnJfYml0d3JpdGVyX2RlY29kZV9ybGUyKCAmd3JpdGVyLCBwLCBsaW1pdCApOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgQklUTUFQIExPQURJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcGZyX3Nsb3RfbG9hZF9iaXRtYXAoIFBGUl9TbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBGUl9TaXplICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgIG1ldHJpY3Nfb25seSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgUEZSX0ZhY2UgICAgIGZhY2UgICA9IChQRlJfRmFjZSkgZ2x5cGgtPnJvb3QuZmFjZTsKLSAgICBGVF9TdHJlYW0gICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgUEZSX1BoeUZvbnQgIHBoeXMgICA9ICZmYWNlLT5waHlfZm9udDsKLSAgICBGVF9VTG9uZyAgICAgZ3BzX29mZnNldDsKLSAgICBGVF9VTG9uZyAgICAgZ3BzX3NpemU7Ci0gICAgUEZSX0NoYXIgICAgIGNoYXJhY3RlcjsKLSAgICBQRlJfU3RyaWtlICAgc3RyaWtlOwotCi0KLSAgICBjaGFyYWN0ZXIgPSAmcGh5cy0+Y2hhcnNbZ2x5cGhfaW5kZXhdOwotCi0gICAgLyogbG9vayB1cCBhIGJpdG1hcCBzdHJpa2UgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCAqLwotICAgIC8qIGNoYXJhY3RlciBkaW1lbnNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBGVF9VSW50ICBuOwotCi0KLSAgICAgIHN0cmlrZSA9IHBoeXMtPnN0cmlrZXM7Ci0gICAgICBmb3IgKCBuID0gMDsgbiA8IHBoeXMtPm51bV9zdHJpa2VzOyBuKysgKQotICAgICAgewotICAgICAgICBpZiAoIHN0cmlrZS0+eF9wcG0gPT0gKEZUX1VJbnQpc2l6ZS0+cm9vdC5tZXRyaWNzLnhfcHBlbSAmJgotICAgICAgICAgICAgIHN0cmlrZS0+eV9wcG0gPT0gKEZUX1VJbnQpc2l6ZS0+cm9vdC5tZXRyaWNzLnlfcHBlbSApCi0gICAgICAgICAgZ290byBGb3VuZF9TdHJpa2U7Ci0KLSAgICAgICAgc3RyaWtlKys7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvdWxkbid0IGZpbmQgaXQgKi8KLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIH0KLQotICBGb3VuZF9TdHJpa2U6Ci0KLSAgICAvKiBub3cgbG9vayB1cCB0aGUgZ2x5cGgncyBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUgKi8KLSAgICB7Ci0gICAgICBGVF9VSW50ICBjaGFyX2xlbjsKLQotCi0gICAgICBjaGFyX2xlbiA9IDQ7Ci0gICAgICBpZiAoIHN0cmlrZS0+ZmxhZ3MgJiBQRlJfQklUTUFQXzJCWVRFX0NIQVJDT0RFICkKLSAgICAgICAgY2hhcl9sZW4gKz0gMTsKLSAgICAgIGlmICggc3RyaWtlLT5mbGFncyAmIFBGUl9CSVRNQVBfMkJZVEVfU0laRSApCi0gICAgICAgIGNoYXJfbGVuICs9IDE7Ci0gICAgICBpZiAoIHN0cmlrZS0+ZmxhZ3MgJiBQRlJfQklUTUFQXzNCWVRFX09GRlNFVCApCi0gICAgICAgIGNoYXJfbGVuICs9IDE7Ci0KLSAgICAgIC8qIGFjY2VzcyBkYXRhIGRpcmVjdGx5IGluIHRoZSBmcmFtZSB0byBzcGVlZCBsb29rdXBzICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBwaHlzLT5iY3Rfb2Zmc2V0ICsgc3RyaWtlLT5iY3Rfb2Zmc2V0ICkgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGNoYXJfbGVuICogc3RyaWtlLT5udW1fYml0bWFwcyApICAgICAgICApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgcGZyX2xvb2t1cF9iaXRtYXBfZGF0YSggc3RyZWFtLT5jdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlLT5udW1fYml0bWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpa2UtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyLT5jaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3BzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZncHNfc2l6ZSApOwotCi0gICAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAgIGlmICggZ3BzX3NpemUgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIGNvdWxkIG5vdCBmaW5kIGEgYml0bWFwIHByb2dyYW0gc3RyaW5nIGZvciB0aGlzIGdseXBoICovCi0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGdldCB0aGUgYml0bWFwIG1ldHJpY3MgKi8KLSAgICB7Ci0gICAgICBGVF9Mb25nICAgeHBvcyA9IDAsIHlwb3MgPSAwLCBhZHZhbmNlID0gMDsKLSAgICAgIEZUX1VJbnQgICB4c2l6ZSA9IDAsIHlzaXplID0gMCwgZm9ybWF0ID0gMDsKLSAgICAgIEZUX0J5dGUqICBwOwotCi0KLSAgICAgIC8qIGNvbXB1dGUgbGluZWFyIGFkdmFuY2UgKi8KLSAgICAgIGFkdmFuY2UgPSBjaGFyYWN0ZXItPmFkdmFuY2U7Ci0gICAgICBpZiAoIHBoeXMtPm1ldHJpY3NfcmVzb2x1dGlvbiAhPSBwaHlzLT5vdXRsaW5lX3Jlc29sdXRpb24gKQotICAgICAgICBhZHZhbmNlID0gRlRfTXVsRGl2KCBhZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylwaHlzLT5vdXRsaW5lX3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKXBoeXMtPm1ldHJpY3NfcmVzb2x1dGlvbiApOwotCi0gICAgICBnbHlwaC0+cm9vdC5saW5lYXJIb3JpQWR2YW5jZSA9IGFkdmFuY2U7Ci0KLSAgICAgIC8qIGNvbXB1dGUgZGVmYXVsdCBhZHZhbmNlLCBpLmUuLCBzY2FsZWQgYWR2YW5jZTsgdGhpcyBjYW4gYmUgKi8KLSAgICAgIC8qIG92ZXJyaWRkZW4gaW4gdGhlIGJpdG1hcCBoZWFkZXIgb2YgY2VydGFpbiBnbHlwaHMgICAgICAgICAgKi8KLSAgICAgIGFkdmFuY2UgPSBGVF9NdWxEaXYoIChGVF9GaXhlZClzaXplLT5yb290Lm1ldHJpY3MueF9wcGVtIDw8IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXItPmFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylwaHlzLT5tZXRyaWNzX3Jlc29sdXRpb24gKTsKLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZmFjZS0+aGVhZGVyLmdwc19zZWN0aW9uX29mZnNldCArIGdwc19vZmZzZXQgKSB8fAotICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggZ3BzX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgcCAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICAgIGVycm9yID0gcGZyX2xvYWRfYml0bWFwX21ldHJpY3MoICZwLCBzdHJlYW0tPmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4cG9zLCAmeXBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4c2l6ZSwgJnlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkdmFuY2UsICZmb3JtYXQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQxOwotCi0gICAgICAvKgotICAgICAgICogQmVmb3JlIGFsbG9jYXRpbmcgdGhlIHRhcmdldCBiaXRtYXAsIHdlIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuCi0gICAgICAgKiBiaXRtYXAgZGltZW5zaW9ucyBhcmUgdmFsaWQsIGRlcGVuZGluZyBvbiB0aGUgaW1hZ2UgZm9ybWF0LgotICAgICAgICoKLSAgICAgICAqIEZvcm1hdCAwOiBXZSBoYXZlIGEgc3RyZWFtIG9mIHBpeGVscyAod2l0aCA4IHBpeGVscyBwZXIgYnl0ZSkuCi0gICAgICAgKgotICAgICAgICogICAgICAgICAgICAgKHhzaXplICogeXNpemUgKyA3KSAvIDggPD0gZ3BzX3NpemUKLSAgICAgICAqCi0gICAgICAgKiBGb3JtYXQgMTogUnVuLWxlbmd0aCBlbmNvZGluZzsgdGhlIGhpZ2ggbmliYmxlIGhvbGRzIHRoZSBudW1iZXIgb2YKLSAgICAgICAqICAgICAgICAgICB3aGl0ZSBiaXRzLCB0aGUgbG93IG5pYmJsZSB0aGUgbnVtYmVyIG9mIGJsYWNrIGJpdHMuICBJbgotICAgICAgICogICAgICAgICAgIG90aGVyIHdvcmRzLCBhIHNpbmdsZSBieXRlIGNhbiByZXByZXNlbnQgYXQgbW9zdCAxNQotICAgICAgICogICAgICAgICAgIHBpeGVscy4KLSAgICAgICAqCi0gICAgICAgKiAgICAgICAgICAgICB4c2l6ZSAqIHlzaXplIDw9IDE1ICogZ3BzX3NpemUKLSAgICAgICAqCi0gICAgICAgKiBGb3JtYXQgMjogUnVuLWxlbmd0aCBlbmNvZGluZzsgdGhlIGhpZ2ggYnl0ZSBob2xkcyB0aGUgbnVtYmVyIG9mCi0gICAgICAgKiAgICAgICAgICAgd2hpdGUgYml0cywgdGhlIGxvdyBieXRlIHRoZSBudW1iZXIgb2YgYmxhY2sgYml0cy4gIEluCi0gICAgICAgKiAgICAgICAgICAgb3RoZXIgd29yZHMsIHR3byBieXRlcyBjYW4gcmVwcmVzZW50IGF0IG1vc3QgMjU1IHBpeGVscy4KLSAgICAgICAqCi0gICAgICAgKiAgICAgICAgICAgICB4c2l6ZSAqIHlzaXplIDw9IDI1NSAqIChncHNfc2l6ZSArIDEpIC8gMgotICAgICAgICovCi0gICAgICBzd2l0Y2ggKCBmb3JtYXQgKQotICAgICAgewotICAgICAgY2FzZSAwOgotICAgICAgICBpZiAoICggKEZUX1VMb25nKXhzaXplICogeXNpemUgKyA3ICkgLyA4ID4gZ3BzX3NpemUgKQotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmICggKEZUX1VMb25nKXhzaXplICogeXNpemUgPiAxNSAqIGdwc19zaXplICkKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBpZiAoIChGVF9VTG9uZyl4c2l6ZSAqIHlzaXplID4gMjU1ICogKCAoIGdwc19zaXplICsgMSApIC8gMiApICkKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgRlRfRVJST1IoKCAicGZyX3Nsb3RfbG9hZF9iaXRtYXA6IGludmFsaWQgaW1hZ2UgdHlwZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgfQotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBJbnZhbGlkX1RhYmxlICkgKQotICAgICAgICAgIEZUX0VSUk9SKCggInBmcl9zbG90X2xvYWRfYml0bWFwOiBpbnZhbGlkIGJpdG1hcCBkaW1lbnNpb25zXG4iICkpOwotICAgICAgICBnb3RvIEV4aXQxOwotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogWFhYOiBvbiAxNmJpdCBzeXN0ZW1zIHdlIHJldHVybiBhbiBlcnJvciBmb3IgaHVnZSBiaXRtYXBzCi0gICAgICAgKiAgICAgIHRoYXQgY2F1c2Ugc2l6ZSB0cnVuY2F0aW9uLCBiZWNhdXNlIHRydW5jYXRlZAotICAgICAgICogICAgICBzaXplIHByb3BlcnRpZXMgbWFrZSBiaXRtYXAgZ2x5cGhzIGJyb2tlbi4KLSAgICAgICAqLwotICAgICAgaWYgKCB4cG9zID4gRlRfSU5UX01BWCAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHhwb3MgPCBGVF9JTlRfTUlOICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgeXNpemUgPiBGVF9JTlRfTUFYICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICB5cG9zID4gRlRfSU5UX01BWCAtIChGVF9Mb25nKXlzaXplIHx8Ci0gICAgICAgICAgIHlwb3MgKyAoRlRfTG9uZyl5c2l6ZSA8IEZUX0lOVF9NSU4gKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTEoKCAicGZyX3Nsb3RfbG9hZF9iaXRtYXA6IiApKTsKLSAgICAgICAgRlRfVFJBQ0UxKCggImh1Z2UgYml0bWFwIGdseXBoICVkeCVkIG92ZXIgRlRfR2x5cGhTbG90XG4iLAotICAgICAgICAgICAgICAgICAgICAgeHBvcywgeXBvcyApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9QaXhlbF9TaXplICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgZ2x5cGgtPnJvb3QuZm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKLQotICAgICAgICAvKiBTZXQgdXAgZ2x5cGggYml0bWFwIGFuZCBtZXRyaWNzICovCi0KLSAgICAgICAgLyogWFhYOiBuZWVkcyBjYXN0cyB0byBmaXQgRlRfQml0bWFwLnt3aWR0aHxyb3dzfHBpdGNofSAqLwotICAgICAgICBnbHlwaC0+cm9vdC5iaXRtYXAud2lkdGggICAgICA9IHhzaXplOwotICAgICAgICBnbHlwaC0+cm9vdC5iaXRtYXAucm93cyAgICAgICA9IHlzaXplOwotICAgICAgICBnbHlwaC0+cm9vdC5iaXRtYXAucGl0Y2ggICAgICA9IChGVF9JbnQpKCB4c2l6ZSArIDcgKSA+PiAzOwotICAgICAgICBnbHlwaC0+cm9vdC5iaXRtYXAucGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTU9OTzsKLQotICAgICAgICAvKiBYWFg6IG5lZWRzIGNhc3RzIHRvIGZpdCBGVF9HbHlwaF9NZXRyaWNzLnt3aWR0aHxoZWlnaHR9ICovCi0gICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3Mud2lkdGggICAgICAgID0gKEZUX1Bvcyl4c2l6ZSA8PCA2OwotICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhlaWdodCAgICAgICA9IChGVF9Qb3MpeXNpemUgPDwgNjsKLSAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy5ob3JpQmVhcmluZ1ggPSB4cG9zICogNjQ7Ci0gICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUJlYXJpbmdZID0geXBvcyAqIDY0OwotICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IEZUX1BJWF9ST1VORCggKCBhZHZhbmNlID4+IDIgKSApOwotICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLnZlcnRCZWFyaW5nWCA9IC0gZ2x5cGgtPnJvb3QubWV0cmljcy53aWR0aCA+PiAxOwotICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLnZlcnRCZWFyaW5nWSA9IDA7Ci0gICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEFkdmFuY2UgID0gc2l6ZS0+cm9vdC5tZXRyaWNzLmhlaWdodDsKLQotICAgICAgICAvKiBYWFg6IG5lZWRzIGNhc3RzIGZpdCBGVF9HbHlwaFNsb3RSZWMuYml0bWFwX3tsZWZ0fHRvcH0gKi8KLSAgICAgICAgZ2x5cGgtPnJvb3QuYml0bWFwX2xlZnQgPSAoRlRfSW50KXhwb3M7Ci0gICAgICAgIGdseXBoLT5yb290LmJpdG1hcF90b3AgID0gKEZUX0ludCkoIHlwb3MgKyAoRlRfTG9uZyl5c2l6ZSApOwotCi0gICAgICAgIGlmICggbWV0cmljc19vbmx5ICkKLSAgICAgICAgICBnb3RvIEV4aXQxOwotCi0gICAgICAgIC8qIEFsbG9jYXRlIGFuZCByZWFkIGJpdG1hcCBkYXRhICovCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VTG9uZyAgbGVuID0gKEZUX1VMb25nKWdseXBoLT5yb290LmJpdG1hcC5waXRjaCAqIHlzaXplOwotCi0KLSAgICAgICAgICBlcnJvciA9IGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXAoICZnbHlwaC0+cm9vdCwgbGVuICk7Ci0gICAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgICAgZXJyb3IgPSBwZnJfbG9hZF9iaXRtYXBfYml0cygKLSAgICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0JPT0woIGZhY2UtPmhlYWRlci5jb2xvcl9mbGFncyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZSX0ZMQUdfSU5WRVJUX0JJVE1BUCAgICksCi0gICAgICAgICAgICAgICAgICAgICAgJmdseXBoLT5yb290LmJpdG1hcCApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICBFeGl0MToKLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wZnIvcGZyc2JpdC5oIGIvc3JjL3Bmci9wZnJzYml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjcwZjUuLjAwMDAwMDAKLS0tIGEvc3JjL3Bmci9wZnJzYml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJzYml0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIGJpdG1hcCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgUEZSU0JJVF9IXwotI2RlZmluZSBQRlJTQklUX0hfCi0KLSNpbmNsdWRlICJwZnJvYmpzLmgiCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBmcl9zbG90X2xvYWRfYml0bWFwKCBQRlJfU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBQRlJfU2l6ZSAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICBtZXRyaWNzX29ubHkgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogUEZSU0JJVF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJ0eXBlcy5oIGIvc3JjL3Bmci9wZnJ0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Q1NDJjLi4wMDAwMDAwCi0tLSBhL3NyYy9wZnIvcGZydHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJ0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIGRhdGEgc3RydWN0dXJlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgUEZSVFlQRVNfSF8KLSNkZWZpbmUgUEZSVFlQRVNfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiB0aGUgUEZSIEhlYWRlciBzdHJ1Y3R1cmUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBGUl9IZWFkZXJSZWNfCi0gIHsKLSAgICBGVF9VSW50MzIgIHNpZ25hdHVyZTsKLSAgICBGVF9VSW50ICAgIHZlcnNpb247Ci0gICAgRlRfVUludCAgICBzaWduYXR1cmUyOwotICAgIEZUX1VJbnQgICAgaGVhZGVyX3NpemU7Ci0KLSAgICBGVF9VSW50ICAgIGxvZ19kaXJfc2l6ZTsKLSAgICBGVF9VSW50ICAgIGxvZ19kaXJfb2Zmc2V0OwotCi0gICAgRlRfVUludCAgICBsb2dfZm9udF9tYXhfc2l6ZTsKLSAgICBGVF9VSW50MzIgIGxvZ19mb250X3NlY3Rpb25fc2l6ZTsKLSAgICBGVF9VSW50MzIgIGxvZ19mb250X3NlY3Rpb25fb2Zmc2V0OwotCi0gICAgRlRfVUludDMyICBwaHlfZm9udF9tYXhfc2l6ZTsKLSAgICBGVF9VSW50MzIgIHBoeV9mb250X3NlY3Rpb25fc2l6ZTsKLSAgICBGVF9VSW50MzIgIHBoeV9mb250X3NlY3Rpb25fb2Zmc2V0OwotCi0gICAgRlRfVUludCAgICBncHNfbWF4X3NpemU7Ci0gICAgRlRfVUludDMyICBncHNfc2VjdGlvbl9zaXplOwotICAgIEZUX1VJbnQzMiAgZ3BzX3NlY3Rpb25fb2Zmc2V0OwotCi0gICAgRlRfVUludCAgICBtYXhfYmx1ZV92YWx1ZXM7Ci0gICAgRlRfVUludCAgICBtYXhfeF9vcnVzOwotICAgIEZUX1VJbnQgICAgbWF4X3lfb3J1czsKLQotICAgIEZUX1VJbnQgICAgcGh5X2ZvbnRfbWF4X3NpemVfaGlnaDsKLSAgICBGVF9VSW50ICAgIGNvbG9yX2ZsYWdzOwotCi0gICAgRlRfVUludDMyICBiY3RfbWF4X3NpemU7Ci0gICAgRlRfVUludDMyICBiY3Rfc2V0X21heF9zaXplOwotICAgIEZUX1VJbnQzMiAgcGh5X2JjdF9zZXRfbWF4X3NpemU7Ci0KLSAgICBGVF9VSW50ICAgIG51bV9waHlfZm9udHM7Ci0gICAgRlRfVUludCAgICBtYXhfdmVydF9zdGVtX3NuYXA7Ci0gICAgRlRfVUludCAgICBtYXhfaG9yel9zdGVtX3NuYXA7Ci0gICAgRlRfVUludCAgICBtYXhfY2hhcnM7Ci0KLSAgfSBQRlJfSGVhZGVyUmVjLCAqUEZSX0hlYWRlcjsKLQotCi0gIC8qIHVzZWQgaW4gYGNvbG9yX2ZsYWdzJyBmaWVsZCBvZiB0aGUgUEZSX0hlYWRlciAqLwotI2RlZmluZSBQRlJfRkxBR19CTEFDS19QSVhFTCAgICAweDAxVQotI2RlZmluZSBQRlJfRkxBR19JTlZFUlRfQklUTUFQICAweDAyVQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgUEZSX0xvZ0ZvbnRSZWNfCi0gIHsKLSAgICBGVF9VSW50MzIgIHNpemU7Ci0gICAgRlRfVUludDMyICBvZmZzZXQ7Ci0KLSAgICBGVF9JbnQzMiAgIG1hdHJpeFs0XTsKLSAgICBGVF9VSW50ICAgIHN0cm9rZV9mbGFnczsKLSAgICBGVF9JbnQgICAgIHN0cm9rZV90aGlja25lc3M7Ci0gICAgRlRfSW50ICAgICBib2xkX3RoaWNrbmVzczsKLSAgICBGVF9JbnQzMiAgIG1pdGVyX2xpbWl0OwotCi0gICAgRlRfVUludDMyICBwaHlzX3NpemU7Ci0gICAgRlRfVUludDMyICBwaHlzX29mZnNldDsKLQotICB9IFBGUl9Mb2dGb250UmVjLCAqUEZSX0xvZ0ZvbnQ7Ci0KLQotI2RlZmluZSBQRlJfTElORV9KT0lOX01JVEVSICAgMHgwMFUKLSNkZWZpbmUgUEZSX0xJTkVfSk9JTl9ST1VORCAgIDB4MDFVCi0jZGVmaW5lIFBGUl9MSU5FX0pPSU5fQkVWRUwgICAweDAyVQotI2RlZmluZSBQRlJfTElORV9KT0lOX01BU0sgICAgKCBQRlJfTElORV9KT0lOX1JPVU5EIHwgUEZSX0xJTkVfSk9JTl9CRVZFTCApCi0KLSNkZWZpbmUgUEZSX0xPR19TVFJPS0UgICAgICAgIDB4MDRVCi0jZGVmaW5lIFBGUl9MT0dfMkJZVEVfU1RST0tFICAweDA4VQotI2RlZmluZSBQRlJfTE9HX0JPTEQgICAgICAgICAgMHgxMFUKLSNkZWZpbmUgUEZSX0xPR18yQllURV9CT0xEICAgIDB4MjBVCi0jZGVmaW5lIFBGUl9MT0dfRVhUUkFfSVRFTVMgICAweDQwVQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBQRlJfQklUTUFQXzJCWVRFX0NIQVJDT0RFICAweDAxVQotI2RlZmluZSBQRlJfQklUTUFQXzJCWVRFX1NJWkUgICAgICAweDAyVQotI2RlZmluZSBQRlJfQklUTUFQXzNCWVRFX09GRlNFVCAgICAweDA0VQotCi0gIC8qbm90IHBhcnQgb2YgdGhlIHNwZWNpZmljYXRpb24gYnV0IHVzZWQgZm9yIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIFBGUl9CSVRNQVBfQ0hBUkNPREVTX1ZBTElEQVRFRCAgMHg0MFUKLSNkZWZpbmUgUEZSX0JJVE1BUF9WQUxJRF9DSEFSQ09ERVMgICAgICAweDgwVQotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBGUl9CaXRtYXBDaGFyUmVjXwotICB7Ci0gICAgRlRfVUludCAgICBjaGFyX2NvZGU7Ci0gICAgRlRfVUludCAgICBncHNfc2l6ZTsKLSAgICBGVF9VSW50MzIgIGdwc19vZmZzZXQ7Ci0KLSAgfSBQRlJfQml0bWFwQ2hhclJlYywgKlBGUl9CaXRtYXBDaGFyOwotCi0KLSNkZWZpbmUgUEZSX1NUUklLRV8yQllURV9YUFBNICAgIDB4MDFVCi0jZGVmaW5lIFBGUl9TVFJJS0VfMkJZVEVfWVBQTSAgICAweDAyVQotI2RlZmluZSBQRlJfU1RSSUtFXzNCWVRFX1NJWkUgICAgMHgwNFUKLSNkZWZpbmUgUEZSX1NUUklLRV8zQllURV9PRkZTRVQgIDB4MDhVCi0jZGVmaW5lIFBGUl9TVFJJS0VfMkJZVEVfQ09VTlQgICAweDEwVQotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBGUl9TdHJpa2VSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgeF9wcG07Ci0gICAgRlRfVUludCAgICAgICAgIHlfcHBtOwotICAgIEZUX1VJbnQgICAgICAgICBmbGFnczsKLQotICAgIEZUX1VJbnQzMiAgICAgICBncHNfc2l6ZTsKLSAgICBGVF9VSW50MzIgICAgICAgZ3BzX29mZnNldDsKLQotICAgIEZUX1VJbnQzMiAgICAgICBiY3Rfc2l6ZTsKLSAgICBGVF9VSW50MzIgICAgICAgYmN0X29mZnNldDsKLQotICAgIC8qIG9wdGlvbmFsICovCi0gICAgRlRfVUludCAgICAgICAgIG51bV9iaXRtYXBzOwotICAgIFBGUl9CaXRtYXBDaGFyICBiaXRtYXBzOwotCi0gIH0gUEZSX1N0cmlrZVJlYywgKlBGUl9TdHJpa2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBQRlJfQ2hhclJlY18KLSAgewotICAgIEZUX1VJbnQgICAgY2hhcl9jb2RlOwotICAgIEZUX0ludCAgICAgYWR2YW5jZTsKLSAgICBGVF9VSW50ICAgIGdwc19zaXplOwotICAgIEZUX1VJbnQzMiAgZ3BzX29mZnNldDsKLQotICB9IFBGUl9DaGFyUmVjLCAqUEZSX0NoYXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBQRlJfRGltZW5zaW9uUmVjXwotICB7Ci0gICAgRlRfVUludCAgc3RhbmRhcmQ7Ci0gICAgRlRfVUludCAgbnVtX3N0ZW1fc25hcHM7Ci0gICAgRlRfSW50KiAgc3RlbV9zbmFwczsKLQotICB9IFBGUl9EaW1lbnNpb25SZWMsICpQRlJfRGltZW5zaW9uOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUEZSX0tlcm5JdGVtUmVjXyogIFBGUl9LZXJuSXRlbTsKLQotICB0eXBlZGVmIHN0cnVjdCAgUEZSX0tlcm5JdGVtUmVjXwotICB7Ci0gICAgUEZSX0tlcm5JdGVtICBuZXh0OwotICAgIEZUX0J5dGUgICAgICAgcGFpcl9jb3VudDsKLSAgICBGVF9CeXRlICAgICAgIGZsYWdzOwotICAgIEZUX1Nob3J0ICAgICAgYmFzZV9hZGo7Ci0gICAgRlRfVUludCAgICAgICBwYWlyX3NpemU7Ci0gICAgRlRfT2Zmc2V0ICAgICBvZmZzZXQ7Ci0gICAgRlRfVUludDMyICAgICBwYWlyMTsKLSAgICBGVF9VSW50MzIgICAgIHBhaXIyOwotCi0gIH0gUEZSX0tlcm5JdGVtUmVjOwotCi0KLSNkZWZpbmUgUEZSX0tFUk5fSU5ERVgoIGcxLCBnMiApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoIChGVF9VSW50MzIpKGcxKSA8PCAxNiApIHwgKEZUX1VJbnQxNikoZzIpICkKLQotI2RlZmluZSBQRlJfS0VSTl9QQUlSX0lOREVYKCBwYWlyICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgUEZSX0tFUk5fSU5ERVgoIChwYWlyKS0+Z2x5cGgxLCAocGFpciktPmdseXBoMiApCi0KLSNkZWZpbmUgUEZSX05FWFRfS1BBSVIoIHAgKSAgKCBwICs9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKEZUX1VJbnQzMilwWy0yXSA8PCAxNiApIHwgcFstMV0gKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgUEZSX1BoeUZvbnRSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OwotICAgIEZUX1VJbnQzMiAgICAgICAgICBvZmZzZXQ7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgZm9udF9yZWZfbnVtYmVyOwotICAgIEZUX1VJbnQgICAgICAgICAgICBvdXRsaW5lX3Jlc29sdXRpb247Ci0gICAgRlRfVUludCAgICAgICAgICAgIG1ldHJpY3NfcmVzb2x1dGlvbjsKLSAgICBGVF9CQm94ICAgICAgICAgICAgYmJveDsKLSAgICBGVF9VSW50ICAgICAgICAgICAgZmxhZ3M7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIHN0YW5kYXJkX2FkdmFuY2U7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICAgYXNjZW50OyAgIC8qIG9wdGlvbmFsLCBiYm94LnlNYXggaWYgbm90IHByZXNlbnQgKi8KLSAgICBGVF9JbnQgICAgICAgICAgICAgZGVzY2VudDsgIC8qIG9wdGlvbmFsLCBiYm94LnlNaW4gaWYgbm90IHByZXNlbnQgKi8KLSAgICBGVF9JbnQgICAgICAgICAgICAgbGVhZGluZzsgIC8qIG9wdGlvbmFsLCAwIGlmIG5vdCBwcmVzZW50ICAgICAgICAgKi8KLQotICAgIFBGUl9EaW1lbnNpb25SZWMgICBob3Jpem9udGFsOwotICAgIFBGUl9EaW1lbnNpb25SZWMgICB2ZXJ0aWNhbDsKLQotICAgIEZUX1N0cmluZyogICAgICAgICBmb250X2lkOwotICAgIEZUX1N0cmluZyogICAgICAgICBmYW1pbHlfbmFtZTsKLSAgICBGVF9TdHJpbmcqICAgICAgICAgc3R5bGVfbmFtZTsKLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fc3RyaWtlczsKLSAgICBGVF9VSW50ICAgICAgICAgICAgbWF4X3N0cmlrZXM7Ci0gICAgUEZSX1N0cmlrZVJlYyogICAgIHN0cmlrZXM7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX2JsdWVfdmFsdWVzOwotICAgIEZUX0ludCAgICAgICAgICAgICpibHVlX3ZhbHVlczsKLSAgICBGVF9VSW50ICAgICAgICAgICAgYmx1ZV9mdXp6OwotICAgIEZUX1VJbnQgICAgICAgICAgICBibHVlX3NjYWxlOwotCi0gICAgRlRfVUludCAgICAgICAgICAgIG51bV9jaGFyczsKLSAgICBGVF9PZmZzZXQgICAgICAgICAgY2hhcnNfb2Zmc2V0OwotICAgIFBGUl9DaGFyICAgICAgICAgICBjaGFyczsKLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fa2Vybl9wYWlyczsKLSAgICBQRlJfS2Vybkl0ZW0gICAgICAga2Vybl9pdGVtczsKLSAgICBQRlJfS2Vybkl0ZW0qICAgICAga2Vybl9pdGVtc190YWlsOwotCi0gICAgLyogbm90IHBhcnQgb2YgdGhlIHNwZWMsIGJ1dCB1c2VkIGR1cmluZyBsb2FkICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgIGJjdF9vZmZzZXQ7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIGN1cnNvcjsKLQotICB9IFBGUl9QaHlGb250UmVjLCAqUEZSX1BoeUZvbnQ7Ci0KLQotI2RlZmluZSBQRlJfUEhZX1ZFUlRJQ0FMICAgICAgICAgIDB4MDFVCi0jZGVmaW5lIFBGUl9QSFlfMkJZVEVfQ0hBUkNPREUgICAgMHgwMlUKLSNkZWZpbmUgUEZSX1BIWV9QUk9QT1JUSU9OQUwgICAgICAweDA0VQotI2RlZmluZSBQRlJfUEhZX0FTQ0lJX0NPREUgICAgICAgIDB4MDhVCi0jZGVmaW5lIFBGUl9QSFlfMkJZVEVfR1BTX1NJWkUgICAgMHgxMFUKLSNkZWZpbmUgUEZSX1BIWV8zQllURV9HUFNfT0ZGU0VUICAweDIwVQotI2RlZmluZSBQRlJfUEhZX0VYVFJBX0lURU1TICAgICAgIDB4ODBVCi0KLQotI2RlZmluZSBQRlJfS0VSTl8yQllURV9DSEFSICAweDAxVQotI2RlZmluZSBQRlJfS0VSTl8yQllURV9BREogICAweDAyVQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBQRlJfR0xZUEhfWUNPVU5UICAgICAgICAgMHgwMVUKLSNkZWZpbmUgUEZSX0dMWVBIX1hDT1VOVCAgICAgICAgIDB4MDJVCi0jZGVmaW5lIFBGUl9HTFlQSF8xQllURV9YWUNPVU5UICAweDA0VQotCi0jZGVmaW5lIFBGUl9HTFlQSF9TSU5HTEVfRVhUUkFfSVRFTVMgICAgMHgwOFUKLSNkZWZpbmUgUEZSX0dMWVBIX0NPTVBPVU5EX0VYVFJBX0lURU1TICAweDQwVQotCi0jZGVmaW5lIFBGUl9HTFlQSF9JU19DT01QT1VORCAgMHg4MFUKLQotCi0gIC8qIGNvbnRyb2xsZWQgY29vcmRpbmF0ZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgUEZSX0Nvb3JkUmVjXwotICB7Ci0gICAgRlRfVUludCAgb3JnOwotICAgIEZUX1VJbnQgIGN1cjsKLQotICB9IFBGUl9Db29yZFJlYywgKlBGUl9Db29yZDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQRlJfU3ViR2x5cGhSZWNfCi0gIHsKLSAgICBGVF9GaXhlZCAgIHhfc2NhbGU7Ci0gICAgRlRfRml4ZWQgICB5X3NjYWxlOwotICAgIEZUX0ludCAgICAgeF9kZWx0YTsKLSAgICBGVF9JbnQgICAgIHlfZGVsdGE7Ci0gICAgRlRfVUludDMyICBncHNfb2Zmc2V0OwotICAgIEZUX1VJbnQgICAgZ3BzX3NpemU7Ci0KLSAgfSBQRlJfU3ViR2x5cGhSZWMsICpQRlJfU3ViR2x5cGg7Ci0KLQotI2RlZmluZSBQRlJfU1VCR0xZUEhfWFNDQUxFICAgICAgICAweDEwVQotI2RlZmluZSBQRlJfU1VCR0xZUEhfWVNDQUxFICAgICAgICAweDIwVQotI2RlZmluZSBQRlJfU1VCR0xZUEhfMkJZVEVfU0laRSAgICAweDQwVQotI2RlZmluZSBQRlJfU1VCR0xZUEhfM0JZVEVfT0ZGU0VUICAweDgwVQotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBGUl9HbHlwaFJlY18KLSAgewotICAgIEZUX0J5dGUgICAgICAgICAgIGZvcm1hdDsKLQotI2lmIDAKLSAgICBGVF9VSW50ICAgICAgICAgICBudW1feF9jb250cm9sOwotICAgIEZUX1VJbnQgICAgICAgICAgIG51bV95X2NvbnRyb2w7Ci0jZW5kaWYKLSAgICBGVF9VSW50ICAgICAgICAgICBtYXhfeHlfY29udHJvbDsKLSAgICBGVF9Qb3MqICAgICAgICAgICB4X2NvbnRyb2w7Ci0gICAgRlRfUG9zKiAgICAgICAgICAgeV9jb250cm9sOwotCi0KLSAgICBGVF9VSW50ICAgICAgICAgICBudW1fc3ViczsKLSAgICBGVF9VSW50ICAgICAgICAgICBtYXhfc3ViczsKLSAgICBQRlJfU3ViR2x5cGhSZWMqICBzdWJzOwotCi0gICAgRlRfR2x5cGhMb2FkZXIgICAgbG9hZGVyOwotICAgIEZUX0Jvb2wgICAgICAgICAgIHBhdGhfYmVndW47Ci0KLSAgfSBQRlJfR2x5cGhSZWMsICpQRlJfR2x5cGg7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogUEZSVFlQRVNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wZnIvcnVsZXMubWsgYi9zcmMvcGZyL3J1bGVzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTQwZjYyLi4wMDAwMDAwCi0tLSBhL3NyYy9wZnIvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgUEZSIGRyaXZlciBjb25maWd1cmF0aW9uIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIHBmciBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1QRlJfRElSIDo9ICQoU1JDX0RJUikvcGZyCi0KLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotUEZSX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKFBGUl9ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBwZnIgZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1QRlJfRFJWX1NSQyA6PSAkKFBGUl9ESVIpL3BmcmxvYWQuYyAgXAotICAgICAgICAgICAgICAgJChQRlJfRElSKS9wZnJnbG9hZC5jIFwKLSAgICAgICAgICAgICAgICQoUEZSX0RJUikvcGZyY21hcC5jICBcCi0gICAgICAgICAgICAgICAkKFBGUl9ESVIpL3BmcmRyaXZyLmMgXAotICAgICAgICAgICAgICAgJChQRlJfRElSKS9wZnJzYml0LmMgIFwKLSAgICAgICAgICAgICAgICQoUEZSX0RJUikvcGZyb2Jqcy5jCi0KLSMgcGZyIGRyaXZlciBoZWFkZXJzCi0jCi1QRlJfRFJWX0ggOj0gJChQRlJfRFJWX1NSQzolLmM9JS5oKSBcCi0gICAgICAgICAgICAgJChQRlJfRElSKS9wZnJlcnJvci5oICBcCi0gICAgICAgICAgICAgJChQRlJfRElSKS9wZnJ0eXBlcy5oCi0KLQotIyBQZnIgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIFBGUl9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMKLSMgICBQRlJfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcwotIwotUEZSX0RSVl9PQkpfTSA6PSAkKFBGUl9EUlZfU1JDOiQoUEZSX0RJUikvJS5jPSQoT0JKX0RJUikvJS4kTykKLVBGUl9EUlZfT0JKX1MgOj0gJChPQkpfRElSKS9wZnIuJE8KLQotIyBwZnIgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLVBGUl9EUlZfU1JDX1MgOj0gJChQRlJfRElSKS9wZnIuYwotCi0KLSMgcGZyIGRyaXZlciAtIHNpbmdsZSBvYmplY3QKLSMKLSQoUEZSX0RSVl9PQkpfUyk6ICQoUEZSX0RSVl9TUkNfUykgJChQRlJfRFJWX1NSQykgJChGUkVFVFlQRV9IKSAkKFBGUl9EUlZfSCkKLQkkKFBGUl9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChQRlJfRFJWX1NSQ19TKSkKLQotCi0jIHBmciBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCi0jCi0kKE9CSl9ESVIpLyUuJE86ICQoUEZSX0RJUikvJS5jICQoRlJFRVRZUEVfSCkgJChQRlJfRFJWX0gpCi0JJChQRlJfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQ8KQotCi0KLSMgdXBkYXRlIG1haW4gZHJpdmVyIG9iamVjdCBsaXN0cwotIwotRFJWX09CSlNfUyArPSAkKFBGUl9EUlZfT0JKX1MpCi1EUlZfT0JKU19NICs9ICQoUEZSX0RSVl9PQkpfTSkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L0phbWZpbGUgYi9zcmMvcHNhdXgvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4YjczZC4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvcHNhdXggSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHBzYXV4IDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBhZm1wYXJzZQotICAgICAgICAgICAgICAgcHNhdXhtb2QKLSAgICAgICAgICAgICAgIHBzY29udgotICAgICAgICAgICAgICAgcHNvYmpzCi0gICAgICAgICAgICAgICB0MWNtYXAKLSAgICAgICAgICAgICAgIHQxZGVjb2RlCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBwc2F1eCA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9wc2F1eCBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvYWZtcGFyc2UuYyBiL3NyYy9wc2F1eC9hZm1wYXJzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJjYzhjLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC9hZm1wYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbXBhcnNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBRk0gcGFyc2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0KLSNpbmNsdWRlICJhZm1wYXJzZS5oIgotI2luY2x1ZGUgInBzY29udi5oIgotCi0jaW5jbHVkZSAicHNhdXhlcnIuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFGTV9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHVzZSBvZiBBRk1fU3RyZWFtIGlzIGxhcmdlbHkgaW5zcGlyZWQgYnkgcGFyc2VBRk0uW2NoXSBmcm9tIHQxbGliLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIGVudW0KLSAgewotICAgIEFGTV9TVFJFQU1fU1RBVFVTX05PUk1BTCwKLSAgICBBRk1fU1RSRUFNX1NUQVRVU19FT0MsCi0gICAgQUZNX1NUUkVBTV9TVEFUVVNfRU9MLAotICAgIEFGTV9TVFJFQU1fU1RBVFVTX0VPRgotICB9OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9TdHJlYW1SZWNfCi0gIHsKLSAgICBGVF9CeXRlKiAgY3Vyc29yOwotICAgIEZUX0J5dGUqICBiYXNlOwotICAgIEZUX0J5dGUqICBsaW1pdDsKLQotICAgIEZUX0ludCAgICBzdGF0dXM7Ci0KLSAgfSBBRk1fU3RyZWFtUmVjOwotCi0KLSNpZm5kZWYgRU9GCi0jZGVmaW5lIEVPRiAtMQotI2VuZGlmCi0KLQotICAvKiB0aGlzIHdvcmtzIGJlY2F1c2UgZW1wdHkgbGluZXMgYXJlIGlnbm9yZWQgKi8KLSNkZWZpbmUgQUZNX0lTX05FV0xJTkUoIGNoICkgICggKGNoKSA9PSAnXHInIHx8IChjaCkgPT0gJ1xuJyApCi0KLSNkZWZpbmUgQUZNX0lTX0VPRiggY2ggKSAgICAgICggKGNoKSA9PSBFT0YgIHx8IChjaCkgPT0gJ1x4MWEnICkKLSNkZWZpbmUgQUZNX0lTX1NQQUNFKCBjaCApICAgICggKGNoKSA9PSAnICcgIHx8IChjaCkgPT0gJ1x0JyApCi0KLSAgLyogY29sdW1uIHNlcGFyYXRvcjsgdGhlcmUgaXMgbm8gYGNvbHVtbicgaW4gdGhlIHNwZWMgYWN0dWFsbHkgKi8KLSNkZWZpbmUgQUZNX0lTX1NFUCggY2ggKSAgICAgICggKGNoKSA9PSAnOycgKQotCi0jZGVmaW5lIEFGTV9HRVRDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKCAoc3RyZWFtKS0+Y3Vyc29yIDwgKHN0cmVhbSktPmxpbWl0ICkgPyAqKHN0cmVhbSktPmN1cnNvcisrIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRU9GICkKLQotI2RlZmluZSBBRk1fU1RSRUFNX0tFWV9CRUdJTiggc3RyZWFtICkgICAgXAotICAgICAgICAgIChjaGFyKikoIChzdHJlYW0pLT5jdXJzb3IgLSAxICkKLQotI2RlZmluZSBBRk1fU1RSRUFNX0tFWV9MRU4oIHN0cmVhbSwga2V5ICkgICAgICAgICAgIFwKLSAgICAgICAgICAoRlRfT2Zmc2V0KSggKGNoYXIqKShzdHJlYW0pLT5jdXJzb3IgLSBrZXkgLSAxICkKLQotI2RlZmluZSBBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgXAotICAgICAgICAgICggKHN0cmVhbSktPnN0YXR1cyA+PSBBRk1fU1RSRUFNX1NUQVRVU19FT0MgKQotCi0jZGVmaW5lIEFGTV9TVEFUVVNfRU9MKCBzdHJlYW0gKSBcCi0gICAgICAgICAgKCAoc3RyZWFtKS0+c3RhdHVzID49IEFGTV9TVFJFQU1fU1RBVFVTX0VPTCApCi0KLSNkZWZpbmUgQUZNX1NUQVRVU19FT0YoIHN0cmVhbSApIFwKLSAgICAgICAgICAoIChzdHJlYW0pLT5zdGF0dXMgPj0gQUZNX1NUUkVBTV9TVEFUVVNfRU9GICkKLQotCi0gIHN0YXRpYyBpbnQKLSAgYWZtX3N0cmVhbV9za2lwX3NwYWNlcyggQUZNX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIGludCAgY2ggPSAwOyAgLyogbWFrZSBzdHVwaWQgY29tcGlsZXIgaGFwcHkgKi8KLQotCi0gICAgaWYgKCBBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgKQotICAgICAgcmV0dXJuICc7JzsKLQotICAgIHdoaWxlICggMSApCi0gICAgewotICAgICAgY2ggPSBBRk1fR0VUQygpOwotICAgICAgaWYgKCAhQUZNX0lTX1NQQUNFKCBjaCApICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCBBRk1fSVNfTkVXTElORSggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPTDsKLSAgICBlbHNlIGlmICggQUZNX0lTX1NFUCggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPQzsKLSAgICBlbHNlIGlmICggQUZNX0lTX0VPRiggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPRjsKLQotICAgIHJldHVybiBjaDsKLSAgfQotCi0KLSAgLyogcmVhZCBhIGtleSBvciB2YWx1ZSBpbiBjdXJyZW50IGNvbHVtbiAqLwotICBzdGF0aWMgY2hhcioKLSAgYWZtX3N0cmVhbV9yZWFkX29uZSggQUZNX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIGNoYXIqICBzdHI7Ci0KLQotICAgIGFmbV9zdHJlYW1fc2tpcF9zcGFjZXMoIHN0cmVhbSApOwotICAgIGlmICggQUZNX1NUQVRVU19FT0MoIHN0cmVhbSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgc3RyID0gQUZNX1NUUkVBTV9LRVlfQkVHSU4oIHN0cmVhbSApOwotCi0gICAgd2hpbGUgKCAxICkKLSAgICB7Ci0gICAgICBpbnQgIGNoID0gQUZNX0dFVEMoKTsKLQotCi0gICAgICBpZiAoIEFGTV9JU19TUEFDRSggY2ggKSApCi0gICAgICAgIGJyZWFrOwotICAgICAgZWxzZSBpZiAoIEFGTV9JU19ORVdMSU5FKCBjaCApICkKLSAgICAgIHsKLSAgICAgICAgc3RyZWFtLT5zdGF0dXMgPSBBRk1fU1RSRUFNX1NUQVRVU19FT0w7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIEFGTV9JU19TRVAoIGNoICkgKQotICAgICAgewotICAgICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPQzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggQUZNX0lTX0VPRiggY2ggKSApCi0gICAgICB7Ci0gICAgICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfRU9GOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLQotICAvKiByZWFkIGEgc3RyaW5nIChpLmUuLCByZWFkIHRvIEVPTCkgKi8KLSAgc3RhdGljIGNoYXIqCi0gIGFmbV9zdHJlYW1fcmVhZF9zdHJpbmcoIEFGTV9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBjaGFyKiAgc3RyOwotCi0KLSAgICBhZm1fc3RyZWFtX3NraXBfc3BhY2VzKCBzdHJlYW0gKTsKLSAgICBpZiAoIEFGTV9TVEFUVVNfRU9MKCBzdHJlYW0gKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIHN0ciA9IEFGTV9TVFJFQU1fS0VZX0JFR0lOKCBzdHJlYW0gKTsKLQotICAgIC8qIHNjYW4gdG8gZW9sICovCi0gICAgd2hpbGUgKCAxICkKLSAgICB7Ci0gICAgICBpbnQgIGNoID0gQUZNX0dFVEMoKTsKLQotCi0gICAgICBpZiAoIEFGTV9JU19ORVdMSU5FKCBjaCApICkKLSAgICAgIHsKLSAgICAgICAgc3RyZWFtLT5zdGF0dXMgPSBBRk1fU1RSRUFNX1NUQVRVU19FT0w7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIEFGTV9JU19FT0YoIGNoICkgKQotICAgICAgewotICAgICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPRjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0cjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBRk1fUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIGFsbCBrZXlzIGRlZmluZWQgaW4gQ2guIDctMTAgb2YgNTAwNC5BRk1fU3BlYy5wZGYgKi8KLSAgdHlwZWRlZiBlbnVtICBBRk1fVG9rZW5fCi0gIHsKLSAgICBBRk1fVE9LRU5fQVNDRU5ERVIsCi0gICAgQUZNX1RPS0VOX0FYSVNMQUJFTCwKLSAgICBBRk1fVE9LRU5fQVhJU1RZUEUsCi0gICAgQUZNX1RPS0VOX0IsCi0gICAgQUZNX1RPS0VOX0JMRU5EQVhJU1RZUEVTLAotICAgIEFGTV9UT0tFTl9CTEVORERFU0lHTk1BUCwKLSAgICBBRk1fVE9LRU5fQkxFTkRERVNJR05QT1NJVElPTlMsCi0gICAgQUZNX1RPS0VOX0MsCi0gICAgQUZNX1RPS0VOX0NDLAotICAgIEFGTV9UT0tFTl9DSCwKLSAgICBBRk1fVE9LRU5fQ0FQSEVJR0hULAotICAgIEFGTV9UT0tFTl9DSEFSV0lEVEgsCi0gICAgQUZNX1RPS0VOX0NIQVJBQ1RFUlNFVCwKLSAgICBBRk1fVE9LRU5fQ0hBUkFDVEVSUywKLSAgICBBRk1fVE9LRU5fREVTQ0VOREVSLAotICAgIEFGTV9UT0tFTl9FTkNPRElOR1NDSEVNRSwKLSAgICBBRk1fVE9LRU5fRU5EQVhJUywKLSAgICBBRk1fVE9LRU5fRU5EQ0hBUk1FVFJJQ1MsCi0gICAgQUZNX1RPS0VOX0VORENPTVBPU0lURVMsCi0gICAgQUZNX1RPS0VOX0VORERJUkVDVElPTiwKLSAgICBBRk1fVE9LRU5fRU5ERk9OVE1FVFJJQ1MsCi0gICAgQUZNX1RPS0VOX0VOREtFUk5EQVRBLAotICAgIEFGTV9UT0tFTl9FTkRLRVJOUEFJUlMsCi0gICAgQUZNX1RPS0VOX0VORFRSQUNLS0VSTiwKLSAgICBBRk1fVE9LRU5fRVNDQ0hBUiwKLSAgICBBRk1fVE9LRU5fRkFNSUxZTkFNRSwKLSAgICBBRk1fVE9LRU5fRk9OVEJCT1gsCi0gICAgQUZNX1RPS0VOX0ZPTlROQU1FLAotICAgIEFGTV9UT0tFTl9GVUxMTkFNRSwKLSAgICBBRk1fVE9LRU5fSVNCQVNFRk9OVCwKLSAgICBBRk1fVE9LRU5fSVNDSURGT05ULAotICAgIEFGTV9UT0tFTl9JU0ZJWEVEUElUQ0gsCi0gICAgQUZNX1RPS0VOX0lTRklYRURWLAotICAgIEFGTV9UT0tFTl9JVEFMSUNBTkdMRSwKLSAgICBBRk1fVE9LRU5fS1AsCi0gICAgQUZNX1RPS0VOX0tQSCwKLSAgICBBRk1fVE9LRU5fS1BYLAotICAgIEFGTV9UT0tFTl9LUFksCi0gICAgQUZNX1RPS0VOX0wsCi0gICAgQUZNX1RPS0VOX01BUFBJTkdTQ0hFTUUsCi0gICAgQUZNX1RPS0VOX01FVFJJQ1NTRVRTLAotICAgIEFGTV9UT0tFTl9OLAotICAgIEFGTV9UT0tFTl9OT1RJQ0UsCi0gICAgQUZNX1RPS0VOX1BDQywKLSAgICBBRk1fVE9LRU5fU1RBUlRBWElTLAotICAgIEFGTV9UT0tFTl9TVEFSVENIQVJNRVRSSUNTLAotICAgIEFGTV9UT0tFTl9TVEFSVENPTVBPU0lURVMsCi0gICAgQUZNX1RPS0VOX1NUQVJURElSRUNUSU9OLAotICAgIEFGTV9UT0tFTl9TVEFSVEZPTlRNRVRSSUNTLAotICAgIEFGTV9UT0tFTl9TVEFSVEtFUk5EQVRBLAotICAgIEFGTV9UT0tFTl9TVEFSVEtFUk5QQUlSUywKLSAgICBBRk1fVE9LRU5fU1RBUlRLRVJOUEFJUlMwLAotICAgIEFGTV9UT0tFTl9TVEFSVEtFUk5QQUlSUzEsCi0gICAgQUZNX1RPS0VOX1NUQVJUVFJBQ0tLRVJOLAotICAgIEFGTV9UT0tFTl9TVERIVywKLSAgICBBRk1fVE9LRU5fU1REVlcsCi0gICAgQUZNX1RPS0VOX1RSQUNLS0VSTiwKLSAgICBBRk1fVE9LRU5fVU5ERVJMSU5FUE9TSVRJT04sCi0gICAgQUZNX1RPS0VOX1VOREVSTElORVRISUNLTkVTUywKLSAgICBBRk1fVE9LRU5fVlYsCi0gICAgQUZNX1RPS0VOX1ZWRUNUT1IsCi0gICAgQUZNX1RPS0VOX1ZFUlNJT04sCi0gICAgQUZNX1RPS0VOX1csCi0gICAgQUZNX1RPS0VOX1cwLAotICAgIEFGTV9UT0tFTl9XMFgsCi0gICAgQUZNX1RPS0VOX1cwWSwKLSAgICBBRk1fVE9LRU5fVzEsCi0gICAgQUZNX1RPS0VOX1cxWCwKLSAgICBBRk1fVE9LRU5fVzFZLAotICAgIEFGTV9UT0tFTl9XWCwKLSAgICBBRk1fVE9LRU5fV1ksCi0gICAgQUZNX1RPS0VOX1dFSUdIVCwKLSAgICBBRk1fVE9LRU5fV0VJR0hUVkVDVE9SLAotICAgIEFGTV9UT0tFTl9YSEVJR0hULAotICAgIE5fQUZNX1RPS0VOUywKLSAgICBBRk1fVE9LRU5fVU5LTk9XTgotCi0gIH0gQUZNX1Rva2VuOwotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqICBjb25zdCBhZm1fa2V5X3RhYmxlW05fQUZNX1RPS0VOU10gPQotICB7Ci0gICAgIkFzY2VuZGVyIiwKLSAgICAiQXhpc0xhYmVsIiwKLSAgICAiQXhpc1R5cGUiLAotICAgICJCIiwKLSAgICAiQmxlbmRBeGlzVHlwZXMiLAotICAgICJCbGVuZERlc2lnbk1hcCIsCi0gICAgIkJsZW5kRGVzaWduUG9zaXRpb25zIiwKLSAgICAiQyIsCi0gICAgIkNDIiwKLSAgICAiQ0giLAotICAgICJDYXBIZWlnaHQiLAotICAgICJDaGFyV2lkdGgiLAotICAgICJDaGFyYWN0ZXJTZXQiLAotICAgICJDaGFyYWN0ZXJzIiwKLSAgICAiRGVzY2VuZGVyIiwKLSAgICAiRW5jb2RpbmdTY2hlbWUiLAotICAgICJFbmRBeGlzIiwKLSAgICAiRW5kQ2hhck1ldHJpY3MiLAotICAgICJFbmRDb21wb3NpdGVzIiwKLSAgICAiRW5kRGlyZWN0aW9uIiwKLSAgICAiRW5kRm9udE1ldHJpY3MiLAotICAgICJFbmRLZXJuRGF0YSIsCi0gICAgIkVuZEtlcm5QYWlycyIsCi0gICAgIkVuZFRyYWNrS2VybiIsCi0gICAgIkVzY0NoYXIiLAotICAgICJGYW1pbHlOYW1lIiwKLSAgICAiRm9udEJCb3giLAotICAgICJGb250TmFtZSIsCi0gICAgIkZ1bGxOYW1lIiwKLSAgICAiSXNCYXNlRm9udCIsCi0gICAgIklzQ0lERm9udCIsCi0gICAgIklzRml4ZWRQaXRjaCIsCi0gICAgIklzRml4ZWRWIiwKLSAgICAiSXRhbGljQW5nbGUiLAotICAgICJLUCIsCi0gICAgIktQSCIsCi0gICAgIktQWCIsCi0gICAgIktQWSIsCi0gICAgIkwiLAotICAgICJNYXBwaW5nU2NoZW1lIiwKLSAgICAiTWV0cmljc1NldHMiLAotICAgICJOIiwKLSAgICAiTm90aWNlIiwKLSAgICAiUENDIiwKLSAgICAiU3RhcnRBeGlzIiwKLSAgICAiU3RhcnRDaGFyTWV0cmljcyIsCi0gICAgIlN0YXJ0Q29tcG9zaXRlcyIsCi0gICAgIlN0YXJ0RGlyZWN0aW9uIiwKLSAgICAiU3RhcnRGb250TWV0cmljcyIsCi0gICAgIlN0YXJ0S2VybkRhdGEiLAotICAgICJTdGFydEtlcm5QYWlycyIsCi0gICAgIlN0YXJ0S2VyblBhaXJzMCIsCi0gICAgIlN0YXJ0S2VyblBhaXJzMSIsCi0gICAgIlN0YXJ0VHJhY2tLZXJuIiwKLSAgICAiU3RkSFciLAotICAgICJTdGRWVyIsCi0gICAgIlRyYWNrS2VybiIsCi0gICAgIlVuZGVybGluZVBvc2l0aW9uIiwKLSAgICAiVW5kZXJsaW5lVGhpY2tuZXNzIiwKLSAgICAiVlYiLAotICAgICJWVmVjdG9yIiwKLSAgICAiVmVyc2lvbiIsCi0gICAgIlciLAotICAgICJXMCIsCi0gICAgIlcwWCIsCi0gICAgIlcwWSIsCi0gICAgIlcxIiwKLSAgICAiVzFYIiwKLSAgICAiVzFZIiwKLSAgICAiV1giLAotICAgICJXWSIsCi0gICAgIldlaWdodCIsCi0gICAgIldlaWdodFZlY3RvciIsCi0gICAgIlhIZWlnaHQiCi0gIH07Ci0KLQotICAvKgotICAgKiBgYWZtX3BhcnNlcl9yZWFkX3ZhbHMnIGFuZCBgYWZtX3BhcnNlcl9uZXh0X2tleScgcHJvdmlkZQotICAgKiBoaWdoLWxldmVsIG9wZXJhdGlvbnMgdG8gYW4gQUZNX1N0cmVhbS4gIFRoZSByZXN0IG9mIHRoZQotICAgKiBwYXJzZXIgZnVuY3Rpb25zIHNob3VsZCB1c2UgdGhlbSB3aXRob3V0IGFjY2Vzc2luZyB0aGUKLSAgICogQUZNX1N0cmVhbSBkaXJlY3RseS4KLSAgICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9JbnQgKQotICBhZm1fcGFyc2VyX3JlYWRfdmFscyggQUZNX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgQUZNX1ZhbHVlICAgdmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIG4gKQotICB7Ci0gICAgQUZNX1N0cmVhbSAgc3RyZWFtID0gcGFyc2VyLT5zdHJlYW07Ci0gICAgY2hhciogICAgICAgc3RyOwotICAgIEZUX0ludCAgICAgIGk7Ci0KLQotICAgIGlmICggbiA+IEFGTV9NQVhfQVJHVU1FTlRTICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBuOyBpKysgKQotICAgIHsKLSAgICAgIEZUX09mZnNldCAgbGVuOwotICAgICAgQUZNX1ZhbHVlICB2YWwgPSB2YWxzICsgaTsKLQotCi0gICAgICBpZiAoIHZhbC0+dHlwZSA9PSBBRk1fVkFMVUVfVFlQRV9TVFJJTkcgKQotICAgICAgICBzdHIgPSBhZm1fc3RyZWFtX3JlYWRfc3RyaW5nKCBzdHJlYW0gKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyID0gYWZtX3N0cmVhbV9yZWFkX29uZSggc3RyZWFtICk7Ci0KLSAgICAgIGlmICggIXN0ciApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBsZW4gPSBBRk1fU1RSRUFNX0tFWV9MRU4oIHN0cmVhbSwgc3RyICk7Ci0KLSAgICAgIHN3aXRjaCAoIHZhbC0+dHlwZSApCi0gICAgICB7Ci0gICAgICBjYXNlIEFGTV9WQUxVRV9UWVBFX1NUUklORzoKLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfTkFNRToKLSAgICAgICAgewotICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5tZW1vcnk7Ci0gICAgICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLQotCi0gICAgICAgICAgaWYgKCAhRlRfUUFMTE9DKCB2YWwtPnUucywgbGVuICsgMSApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmdF9tZW1jcHkoIHZhbC0+dS5zLCBzdHIsIGxlbiApOwotICAgICAgICAgICAgdmFsLT51LnNbbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9WQUxVRV9UWVBFX0ZJWEVEOgotICAgICAgICB2YWwtPnUuZiA9IFBTX0NvbnZfVG9GaXhlZCggKEZUX0J5dGUqKikodm9pZCopJnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9CeXRlKilzdHIgKyBsZW4sIDAgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfSU5URUdFUjoKLSAgICAgICAgdmFsLT51LmkgPSBQU19Db252X1RvSW50KCAoRlRfQnl0ZSoqKSh2b2lkKikmc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9CeXRlKilzdHIgKyBsZW4gKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfQk9PTDoKLSAgICAgICAgdmFsLT51LmIgPSBGVF9CT09MKCBsZW4gPT0gNCAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdF9zdHJuY21wKCBzdHIsICJ0cnVlIiwgNCApICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9WQUxVRV9UWVBFX0lOREVYOgotICAgICAgICBpZiAoIHBhcnNlci0+Z2V0X2luZGV4ICkKLSAgICAgICAgICB2YWwtPnUuaSA9IHBhcnNlci0+Z2V0X2luZGV4KCBzdHIsIGxlbiwgcGFyc2VyLT51c2VyX2RhdGEgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHZhbC0+dS5pID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggY2hhciogKQotICBhZm1fcGFyc2VyX25leHRfa2V5KCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCogIGxlbiApCi0gIHsKLSAgICBBRk1fU3RyZWFtICBzdHJlYW0gPSBwYXJzZXItPnN0cmVhbTsKLSAgICBjaGFyKiAgICAgICBrZXkgICAgPSBOVUxMOyAgLyogbWFrZSBzdHVwaWQgY29tcGlsZXIgaGFwcHkgKi8KLQotCi0gICAgaWYgKCBsaW5lICkKLSAgICB7Ci0gICAgICB3aGlsZSAoIDEgKQotICAgICAgewotICAgICAgICAvKiBza2lwIGN1cnJlbnQgbGluZSAqLwotICAgICAgICBpZiAoICFBRk1fU1RBVFVTX0VPTCggc3RyZWFtICkgKQotICAgICAgICAgIGFmbV9zdHJlYW1fcmVhZF9zdHJpbmcoIHN0cmVhbSApOwotCi0gICAgICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfTk9STUFMOwotICAgICAgICBrZXkgPSBhZm1fc3RyZWFtX3JlYWRfb25lKCBzdHJlYW0gKTsKLQotICAgICAgICAvKiBza2lwIGVtcHR5IGxpbmUgKi8KLSAgICAgICAgaWYgKCAha2V5ICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgIUFGTV9TVEFUVVNfRU9GKCBzdHJlYW0gKSAmJgotICAgICAgICAgICAgIEFGTV9TVEFUVVNfRU9MKCBzdHJlYW0gKSAgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKCAxICkKLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCBjdXJyZW50IGNvbHVtbiAqLwotICAgICAgICB3aGlsZSAoICFBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgKQotICAgICAgICAgIGFmbV9zdHJlYW1fcmVhZF9vbmUoIHN0cmVhbSApOwotCi0gICAgICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfTk9STUFMOwotICAgICAgICBrZXkgPSBhZm1fc3RyZWFtX3JlYWRfb25lKCBzdHJlYW0gKTsKLQotICAgICAgICAvKiBza2lwIGVtcHR5IGNvbHVtbiAqLwotICAgICAgICBpZiAoICFrZXkgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAhQUZNX1NUQVRVU19FT0YoIHN0cmVhbSApICYmCi0gICAgICAgICAgICAgQUZNX1NUQVRVU19FT0MoIHN0cmVhbSApICApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBsZW4gKQotICAgICAgKmxlbiA9ICgga2V5ICkgPyAoRlRfT2Zmc2V0KUFGTV9TVFJFQU1fS0VZX0xFTiggc3RyZWFtLCBrZXkgKQotICAgICAgICAgICAgICAgICAgICAgOiAwOwotCi0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0KLSAgc3RhdGljIEFGTV9Ub2tlbgotICBhZm1fdG9rZW5pemUoIGNvbnN0IGNoYXIqICBrZXksCi0gICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgIGxlbiApCi0gIHsKLSAgICBpbnQgIG47Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgTl9BRk1fVE9LRU5TOyBuKysgKQotICAgIHsKLSAgICAgIGlmICggKiggYWZtX2tleV90YWJsZVtuXSApID09ICprZXkgKQotICAgICAgewotICAgICAgICBmb3IgKCA7IG4gPCBOX0FGTV9UT0tFTlM7IG4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICooIGFmbV9rZXlfdGFibGVbbl0gKSAhPSAqa2V5ICkKLSAgICAgICAgICAgIHJldHVybiBBRk1fVE9LRU5fVU5LTk9XTjsKLQotICAgICAgICAgIGlmICggZnRfc3RybmNtcCggYWZtX2tleV90YWJsZVtuXSwga2V5LCBsZW4gKSA9PSAwICkKLSAgICAgICAgICAgIHJldHVybiAoQUZNX1Rva2VuKSBuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEFGTV9UT0tFTl9VTktOT1dOOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZtX3BhcnNlcl9pbml0KCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKQotICB7Ci0gICAgQUZNX1N0cmVhbSAgc3RyZWFtID0gTlVMTDsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgaWYgKCBGVF9ORVcoIHN0cmVhbSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHN0cmVhbS0+Y3Vyc29yID0gc3RyZWFtLT5iYXNlID0gYmFzZTsKLSAgICBzdHJlYW0tPmxpbWl0ICA9IGxpbWl0OwotCi0gICAgLyogZG9uJ3Qgc2tpcCB0aGUgZmlyc3QgbGluZSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgKi8KLSAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPTDsKLQotICAgIHBhcnNlci0+bWVtb3J5ICAgID0gbWVtb3J5OwotICAgIHBhcnNlci0+c3RyZWFtICAgID0gc3RyZWFtOwotICAgIHBhcnNlci0+Rm9udEluZm8gID0gTlVMTDsKLSAgICBwYXJzZXItPmdldF9pbmRleCA9IE5VTEw7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmbV9wYXJzZXJfZG9uZSggQUZNX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIHBhcnNlci0+c3RyZWFtICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZm1fcGFyc2VyX3JlYWRfaW50KCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogICAgIGFpbnQgKQotICB7Ci0gICAgQUZNX1ZhbHVlUmVjICB2YWw7Ci0KLQotICAgIHZhbC50eXBlID0gQUZNX1ZBTFVFX1RZUEVfSU5URUdFUjsKLQotICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgJnZhbCwgMSApID09IDEgKQotICAgIHsKLSAgICAgICphaW50ID0gdmFsLnUuaTsKLQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmbV9wYXJzZV90cmFja19rZXJuKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgQUZNX0ZvbnRJbmZvICAgZmkgPSBwYXJzZXItPkZvbnRJbmZvOwotICAgIEFGTV9UcmFja0tlcm4gIHRrOwotICAgIGNoYXIqICAgICAgICAgIGtleTsKLSAgICBGVF9PZmZzZXQgICAgICBsZW47Ci0gICAgaW50ICAgICAgICAgICAgbiA9IC0xOwotICAgIEZUX0ludCAgICAgICAgIHRtcDsKLQotCi0gICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZ0bXAgKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgIGlmICggdG1wIDwgMCApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBmaS0+TnVtVHJhY2tLZXJuID0gKEZUX1VJbnQpdG1wOwotCi0gICAgaWYgKCBmaS0+TnVtVHJhY2tLZXJuICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+bWVtb3J5OwotICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLQotCi0gICAgICBpZiAoIEZUX1FORVdfQVJSQVkoIGZpLT5UcmFja0tlcm5zLCBmaS0+TnVtVHJhY2tLZXJuICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgd2hpbGUgKCAoIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgJmxlbiApICkgIT0gMCApCi0gICAgewotICAgICAgQUZNX1ZhbHVlUmVjICBzaGFyZWRfdmFsc1s1XTsKLQotCi0gICAgICBzd2l0Y2ggKCBhZm1fdG9rZW5pemUoIGtleSwgbGVuICkgKQotICAgICAgewotICAgICAgY2FzZSBBRk1fVE9LRU5fVFJBQ0tLRVJOOgotICAgICAgICBuKys7Ci0KLSAgICAgICAgaWYgKCBuID49IChpbnQpZmktPk51bVRyYWNrS2VybiApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHRrID0gZmktPlRyYWNrS2VybnMgKyBuOwotCi0gICAgICAgIHNoYXJlZF92YWxzWzBdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9JTlRFR0VSOwotICAgICAgICBzaGFyZWRfdmFsc1sxXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIHNoYXJlZF92YWxzWzJdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9GSVhFRDsKLSAgICAgICAgc2hhcmVkX3ZhbHNbM10udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBzaGFyZWRfdmFsc1s0XS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDUgKSAhPSA1ICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgdGstPmRlZ3JlZSAgICAgPSBzaGFyZWRfdmFsc1swXS51Lmk7Ci0gICAgICAgIHRrLT5taW5fcHRzaXplID0gc2hhcmVkX3ZhbHNbMV0udS5mOwotICAgICAgICB0ay0+bWluX2tlcm4gICA9IHNoYXJlZF92YWxzWzJdLnUuZjsKLSAgICAgICAgdGstPm1heF9wdHNpemUgPSBzaGFyZWRfdmFsc1szXS51LmY7Ci0gICAgICAgIHRrLT5tYXhfa2VybiAgID0gc2hhcmVkX3ZhbHNbNF0udS5mOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRUUkFDS0tFUk46Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRLRVJOREFUQToKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTOgotICAgICAgICBmaS0+TnVtVHJhY2tLZXJuID0gKEZUX1VJbnQpKCBuICsgMSApOwotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9VTktOT1dOOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gIH0KLQotCi0jdW5kZWYgIEtFUk5fSU5ERVgKLSNkZWZpbmUgS0VSTl9JTkRFWCggZzEsIGcyICkgICggKCAoRlRfVUxvbmcpZzEgPDwgMTYgKSB8IGcyICkKLQotCi0gIC8qIGNvbXBhcmUgdHdvIGtlcm5pbmcgcGFpcnMgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQotICBhZm1fY29tcGFyZV9rZXJuX3BhaXJzKCBjb25zdCB2b2lkKiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIGIgKQotICB7Ci0gICAgQUZNX0tlcm5QYWlyICBrcDEgPSAoQUZNX0tlcm5QYWlyKWE7Ci0gICAgQUZNX0tlcm5QYWlyICBrcDIgPSAoQUZNX0tlcm5QYWlyKWI7Ci0KLSAgICBGVF9VTG9uZyAgaW5kZXgxID0gS0VSTl9JTkRFWCgga3AxLT5pbmRleDEsIGtwMS0+aW5kZXgyICk7Ci0gICAgRlRfVUxvbmcgIGluZGV4MiA9IEtFUk5fSU5ERVgoIGtwMi0+aW5kZXgxLCBrcDItPmluZGV4MiApOwotCi0KLSAgICBpZiAoIGluZGV4MSA+IGluZGV4MiApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlIGlmICggaW5kZXgxIDwgaW5kZXgyICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmbV9wYXJzZV9rZXJuX3BhaXJzKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgQUZNX0ZvbnRJbmZvICBmaSA9IHBhcnNlci0+Rm9udEluZm87Ci0gICAgQUZNX0tlcm5QYWlyICBrcDsKLSAgICBjaGFyKiAgICAgICAgIGtleTsKLSAgICBGVF9PZmZzZXQgICAgIGxlbjsKLSAgICBpbnQgICAgICAgICAgIG4gPSAtMTsKLSAgICBGVF9JbnQgICAgICAgIHRtcDsKLQotCi0gICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZ0bXAgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBpZiAoIHRtcCA8IDAgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZmktPk51bUtlcm5QYWlyID0gKEZUX1VJbnQpdG1wOwotCi0gICAgaWYgKCBmaS0+TnVtS2VyblBhaXIgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5tZW1vcnk7Ci0gICAgICBGVF9FcnJvciAgIGVycm9yOwotCi0KLSAgICAgIGlmICggRlRfUU5FV19BUlJBWSggZmktPktlcm5QYWlycywgZmktPk51bUtlcm5QYWlyICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgd2hpbGUgKCAoIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgJmxlbiApICkgIT0gMCApCi0gICAgewotICAgICAgQUZNX1Rva2VuICB0b2tlbiA9IGFmbV90b2tlbml6ZSgga2V5LCBsZW4gKTsKLQotCi0gICAgICBzd2l0Y2ggKCB0b2tlbiApCi0gICAgICB7Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9LUDoKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0tQWDoKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0tQWToKLSAgICAgICAgewotICAgICAgICAgIEZUX0ludCAgICAgICAgcjsKLSAgICAgICAgICBBRk1fVmFsdWVSZWMgIHNoYXJlZF92YWxzWzRdOwotCi0KLSAgICAgICAgICBuKys7Ci0KLSAgICAgICAgICBpZiAoIG4gPj0gKGludClmaS0+TnVtS2VyblBhaXIgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAga3AgPSBmaS0+S2VyblBhaXJzICsgbjsKLQotICAgICAgICAgIHNoYXJlZF92YWxzWzBdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9JTkRFWDsKLSAgICAgICAgICBzaGFyZWRfdmFsc1sxXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfSU5ERVg7Ci0gICAgICAgICAgc2hhcmVkX3ZhbHNbMl0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0lOVEVHRVI7Ci0gICAgICAgICAgc2hhcmVkX3ZhbHNbM10udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0lOVEVHRVI7Ci0gICAgICAgICAgciA9IGFmbV9wYXJzZXJfcmVhZF92YWxzKCBwYXJzZXIsIHNoYXJlZF92YWxzLCA0ICk7Ci0gICAgICAgICAgaWYgKCByIDwgMyApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAvKiBpbmRleCB2YWx1ZXMgY2FuJ3QgYmUgbmVnYXRpdmUgKi8KLSAgICAgICAgICBrcC0+aW5kZXgxID0gc2hhcmVkX3ZhbHNbMF0udS51OwotICAgICAgICAgIGtwLT5pbmRleDIgPSBzaGFyZWRfdmFsc1sxXS51LnU7Ci0gICAgICAgICAgaWYgKCB0b2tlbiA9PSBBRk1fVE9LRU5fS1BZICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrcC0+eCA9IDA7Ci0gICAgICAgICAgICBrcC0+eSA9IHNoYXJlZF92YWxzWzJdLnUuaTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGtwLT54ID0gc2hhcmVkX3ZhbHNbMl0udS5pOwotICAgICAgICAgICAga3AtPnkgPSAoIHRva2VuID09IEFGTV9UT0tFTl9LUCAmJiByID09IDQgKQotICAgICAgICAgICAgICAgICAgICAgID8gc2hhcmVkX3ZhbHNbM10udS5pIDogMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREtFUk5QQUlSUzoKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREtFUk5EQVRBOgotICAgICAgY2FzZSBBRk1fVE9LRU5fRU5ERk9OVE1FVFJJQ1M6Ci0gICAgICAgIGZpLT5OdW1LZXJuUGFpciA9IChGVF9VSW50KSggbiArIDEgKTsKLSAgICAgICAgZnRfcXNvcnQoIGZpLT5LZXJuUGFpcnMsIGZpLT5OdW1LZXJuUGFpciwKLSAgICAgICAgICAgICAgICAgIHNpemVvZiAoIEFGTV9LZXJuUGFpclJlYyApLAotICAgICAgICAgICAgICAgICAgYWZtX2NvbXBhcmVfa2Vybl9wYWlycyApOwotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9VTktOT1dOOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZm1fcGFyc2Vfa2Vybl9kYXRhKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBjaGFyKiAgICAgIGtleTsKLSAgICBGVF9PZmZzZXQgIGxlbjsKLQotCi0gICAgd2hpbGUgKCAoIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgJmxlbiApICkgIT0gMCApCi0gICAgewotICAgICAgc3dpdGNoICggYWZtX3Rva2VuaXplKCBrZXksIGxlbiApICkKLSAgICAgIHsKLSAgICAgIGNhc2UgQUZNX1RPS0VOX1NUQVJUVFJBQ0tLRVJOOgotICAgICAgICBlcnJvciA9IGFmbV9wYXJzZV90cmFja19rZXJuKCBwYXJzZXIgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVE9LRU5fU1RBUlRLRVJOUEFJUlM6Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9TVEFSVEtFUk5QQUlSUzA6Ci0gICAgICAgIGVycm9yID0gYWZtX3BhcnNlX2tlcm5fcGFpcnMoIHBhcnNlciApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRLRVJOREFUQToKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTOgotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9VTktOT1dOOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZm1fcGFyc2VyX3NraXBfc2VjdGlvbiggQUZNX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGTV9Ub2tlbiAgIGVuZF9zZWN0aW9uICkKLSAgewotICAgIGNoYXIqICAgICAga2V5OwotICAgIEZUX09mZnNldCAgbGVuOwotCi0KLSAgICB3aGlsZSAoIG4tLSA+IDAgKQotICAgIHsKLSAgICAgIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgTlVMTCApOwotICAgICAgaWYgKCAha2V5ICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIHdoaWxlICggKCBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsICZsZW4gKSApICE9IDAgKQotICAgIHsKLSAgICAgIEFGTV9Ub2tlbiAgdG9rZW4gPSBhZm1fdG9rZW5pemUoIGtleSwgbGVuICk7Ci0KLQotICAgICAgaWYgKCB0b2tlbiA9PSBlbmRfc2VjdGlvbiB8fCB0b2tlbiA9PSBBRk1fVE9LRU5fRU5ERk9OVE1FVFJJQ1MgKQotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZm1fcGFyc2VyX3BhcnNlKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBwYXJzZXItPm1lbW9yeTsKLSAgICBBRk1fRm9udEluZm8gIGZpICAgICA9IHBhcnNlci0+Rm9udEluZm87Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgPSBGVF9FUlIoIFN5bnRheF9FcnJvciApOwotICAgIGNoYXIqICAgICAgICAga2V5OwotICAgIEZUX09mZnNldCAgICAgbGVuOwotICAgIEZUX0ludCAgICAgICAgbWV0cmljc19zZXRzID0gMDsKLQotCi0gICAgaWYgKCAhZmkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsICZsZW4gKTsKLSAgICBpZiAoICFrZXkgfHwgbGVuICE9IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGZ0X3N0cm5jbXAoIGtleSwgIlN0YXJ0Rm9udE1ldHJpY3MiLCAxNiApICE9IDAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICB3aGlsZSAoICgga2V5ID0gYWZtX3BhcnNlcl9uZXh0X2tleSggcGFyc2VyLCAxLCAmbGVuICkgKSAhPSAwICkKLSAgICB7Ci0gICAgICBBRk1fVmFsdWVSZWMgIHNoYXJlZF92YWxzWzRdOwotCi0KLSAgICAgIHN3aXRjaCAoIGFmbV90b2tlbml6ZSgga2V5LCBsZW4gKSApCi0gICAgICB7Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9NRVRSSUNTU0VUUzoKLSAgICAgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZtZXRyaWNzX3NldHMgKSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGlmICggbWV0cmljc19zZXRzICE9IDAgJiYgbWV0cmljc19zZXRzICE9IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0KLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0lTQ0lERk9OVDoKLSAgICAgICAgc2hhcmVkX3ZhbHNbMF0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0JPT0w7Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDEgKSAhPSAxICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZmktPklzQ0lERm9udCA9IHNoYXJlZF92YWxzWzBdLnUuYjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0ZPTlRCQk9YOgotICAgICAgICBzaGFyZWRfdmFsc1swXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIHNoYXJlZF92YWxzWzFdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9GSVhFRDsKLSAgICAgICAgc2hhcmVkX3ZhbHNbMl0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBzaGFyZWRfdmFsc1szXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDQgKSAhPSA0ICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZmktPkZvbnRCQm94LnhNaW4gPSBzaGFyZWRfdmFsc1swXS51LmY7Ci0gICAgICAgIGZpLT5Gb250QkJveC55TWluID0gc2hhcmVkX3ZhbHNbMV0udS5mOwotICAgICAgICBmaS0+Rm9udEJCb3gueE1heCA9IHNoYXJlZF92YWxzWzJdLnUuZjsKLSAgICAgICAgZmktPkZvbnRCQm94LnlNYXggPSBzaGFyZWRfdmFsc1szXS51LmY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9BU0NFTkRFUjoKLSAgICAgICAgc2hhcmVkX3ZhbHNbMF0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBpZiAoIGFmbV9wYXJzZXJfcmVhZF92YWxzKCBwYXJzZXIsIHNoYXJlZF92YWxzLCAxICkgIT0gMSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGZpLT5Bc2NlbmRlciA9IHNoYXJlZF92YWxzWzBdLnUuZjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0RFU0NFTkRFUjoKLSAgICAgICAgc2hhcmVkX3ZhbHNbMF0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBpZiAoIGFmbV9wYXJzZXJfcmVhZF92YWxzKCBwYXJzZXIsIHNoYXJlZF92YWxzLCAxICkgIT0gMSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGZpLT5EZXNjZW5kZXIgPSBzaGFyZWRfdmFsc1swXS51LmY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9TVEFSVENIQVJNRVRSSUNTOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBuID0gMDsKLQotCi0gICAgICAgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZuICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgZXJyb3IgPSBhZm1fcGFyc2VyX3NraXBfc2VjdGlvbiggcGFyc2VyLCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGTV9UT0tFTl9FTkRDSEFSTUVUUklDUyApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9TVEFSVEtFUk5EQVRBOgotICAgICAgICBlcnJvciA9IGFmbV9wYXJzZV9rZXJuX2RhdGEoIHBhcnNlciApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCBzaW5jZSB3ZSBvbmx5IHN1cHBvcnQga2VybiBkYXRhICovCi0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTOgotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBGVF9GUkVFKCBmaS0+VHJhY2tLZXJucyApOwotICAgIGZpLT5OdW1UcmFja0tlcm4gPSAwOwotCi0gICAgRlRfRlJFRSggZmktPktlcm5QYWlycyApOwotICAgIGZpLT5OdW1LZXJuUGFpciA9IDA7Ci0KLSAgICBmaS0+SXNDSURGb250ID0gMDsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZWxzZSAvKiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTSAqLwotCi0gIC8qIEFOU0kgQyBkb2Vzbid0IGxpa2UgZW1wdHkgc291cmNlIGZpbGVzICovCi0gIHR5cGVkZWYgaW50ICBfYWZtX3BhcnNlX2R1bW15OwotCi0jZW5kaWYgLyogVDFfQ09ORklHX09QVElPTl9OT19BRk0gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9hZm1wYXJzZS5oIGIvc3JjL3BzYXV4L2FmbXBhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmJlYjcuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L2FmbXBhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZm1wYXJzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQUZNIHBhcnNlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZNUEFSU0VfSF8KLSNkZWZpbmUgQUZNUEFSU0VfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmbV9wYXJzZXJfaW5pdCggQUZNX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGxpbWl0ICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmbV9wYXJzZXJfZG9uZSggQUZNX1BhcnNlciAgcGFyc2VyICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZm1fcGFyc2VyX3BhcnNlKCBBRk1fUGFyc2VyICBwYXJzZXIgKTsKLQotCi0gIGVudW0gIEFGTV9WYWx1ZVR5cGVfCi0gIHsKLSAgICBBRk1fVkFMVUVfVFlQRV9TVFJJTkcsCi0gICAgQUZNX1ZBTFVFX1RZUEVfTkFNRSwKLSAgICBBRk1fVkFMVUVfVFlQRV9GSVhFRCwgICAvKiByZWFsIG51bWJlciAqLwotICAgIEFGTV9WQUxVRV9UWVBFX0lOVEVHRVIsCi0gICAgQUZNX1ZBTFVFX1RZUEVfQk9PTCwKLSAgICBBRk1fVkFMVUVfVFlQRV9JTkRFWCAgICAvKiBnbHlwaCBpbmRleCAqLwotICB9OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9WYWx1ZVJlY18KLSAgewotICAgIGVudW0gQUZNX1ZhbHVlVHlwZV8gIHR5cGU7Ci0gICAgdW5pb24KLSAgICB7Ci0gICAgICBjaGFyKiAgICAgczsKLSAgICAgIEZUX0ZpeGVkICBmOwotICAgICAgRlRfSW50ICAgIGk7Ci0gICAgICBGVF9VSW50ICAgdTsKLSAgICAgIEZUX0Jvb2wgICBiOwotCi0gICAgfSB1OwotCi0gIH0gQUZNX1ZhbHVlUmVjLCAqQUZNX1ZhbHVlOwotCi0jZGVmaW5lICBBRk1fTUFYX0FSR1VNRU5UUyAgNQotCi0gIEZUX0xPQ0FMKCBGVF9JbnQgKQotICBhZm1fcGFyc2VyX3JlYWRfdmFscyggQUZNX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgQUZNX1ZhbHVlICAgdmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIG4gKTsKLQotICAvKiByZWFkIHRoZSBuZXh0IGtleSBmcm9tIHRoZSBuZXh0IGxpbmUgb3IgY29sdW1uICovCi0gIEZUX0xPQ0FMKCBjaGFyKiApCi0gIGFmbV9wYXJzZXJfbmV4dF9rZXkoIEFGTV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0KiAgbGVuICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEFGTVBBUlNFX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvbW9kdWxlLm1rIGIvc3JjL3BzYXV4L21vZHVsZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwYTIyNy4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvbW9kdWxlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFBTYXV4IG1vZHVsZSBkZWZpbml0aW9uCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1GVE1PRFVMRV9IX0NPTU1BTkRTICs9IFBTQVVYX01PRFVMRQotCi1kZWZpbmUgUFNBVVhfTU9EVUxFCi0kKE9QRU5fRFJJVkVSKSBGVF9Nb2R1bGVfQ2xhc3MsIHBzYXV4X21vZHVsZV9jbGFzcyAkKENMT1NFX0RSSVZFUikKLSQoRUNIT19EUklWRVIpcHNhdXggICAgICQoRUNIT19EUklWRVJfREVTQylQb3N0c2NyaXB0IFR5cGUgMSAmIFR5cGUgMiBoZWxwZXIgbW9kdWxlJChFQ0hPX0RSSVZFUl9ET05FKQotZW5kZWYKLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2F1eC5jIGIvc3JjL3BzYXV4L3BzYXV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzNhYTcuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L3BzYXV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2F1eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgYXV4aWxpYXJ5IFBvc3RTY3JpcHQgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNpbmNsdWRlICJhZm1wYXJzZS5jIgotI2luY2x1ZGUgInBzYXV4bW9kLmMiCi0jaW5jbHVkZSAicHNjb252LmMiCi0jaW5jbHVkZSAicHNvYmpzLmMiCi0jaW5jbHVkZSAidDFjbWFwLmMiCi0jaW5jbHVkZSAidDFkZWNvZGUuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2F1eGVyci5oIGIvc3JjL3BzYXV4L3BzYXV4ZXJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkN2FjNjAuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L3BzYXV4ZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2F1eGVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUFMgYXV4aWxpYXJ5IG1vZHVsZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTIGF1eGlsaWFyeSBtb2R1bGUgZXJyb3IgZW51bWVyYXRpb24gKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBQU0FVWEVSUl9IXwotI2RlZmluZSBQU0FVWEVSUl9IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBQU2F1eF9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfUFNhdXgKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIFBTQVVYRVJSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNhdXhtb2QuYyBiL3NyYy9wc2F1eC9wc2F1eG1vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjU4OWNlLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC9wc2F1eG1vZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYXV4bW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAicHNhdXhtb2QuaCIKLSNpbmNsdWRlICJwc29ianMuaCIKLSNpbmNsdWRlICJ0MWRlY29kZS5oIgotI2luY2x1ZGUgInQxY21hcC5oIgotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0jaW5jbHVkZSAiYWZtcGFyc2UuaCIKLSNlbmRpZgotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IFBTX1RhYmxlX0Z1bmNzUmVjICBwc190YWJsZV9mdW5jcyA9Ci0gIHsKLSAgICBwc190YWJsZV9uZXcsICAgICAvKiBpbml0ICAgICovCi0gICAgcHNfdGFibGVfZG9uZSwgICAgLyogZG9uZSAgICAqLwotICAgIHBzX3RhYmxlX2FkZCwgICAgIC8qIGFkZCAgICAgKi8KLSAgICBwc190YWJsZV9yZWxlYXNlICAvKiByZWxlYXNlICovCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgUFNfUGFyc2VyX0Z1bmNzUmVjICBwc19wYXJzZXJfZnVuY3MgPQotICB7Ci0gICAgcHNfcGFyc2VyX2luaXQsICAgICAgICAgICAgIC8qIGluaXQgICAgICAgICAgICAgKi8KLSAgICBwc19wYXJzZXJfZG9uZSwgICAgICAgICAgICAgLyogZG9uZSAgICAgICAgICAgICAqLwotCi0gICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzLCAgICAgIC8qIHNraXBfc3BhY2VzICAgICAgKi8KLSAgICBwc19wYXJzZXJfc2tpcF9QU190b2tlbiwgICAgLyogc2tpcF9QU190b2tlbiAgICAqLwotCi0gICAgcHNfcGFyc2VyX3RvX2ludCwgICAgICAgICAgIC8qIHRvX2ludCAgICAgICAgICAgKi8KLSAgICBwc19wYXJzZXJfdG9fZml4ZWQsICAgICAgICAgLyogdG9fZml4ZWQgICAgICAgICAqLwotICAgIHBzX3BhcnNlcl90b19ieXRlcywgICAgICAgICAvKiB0b19ieXRlcyAgICAgICAgICovCi0gICAgcHNfcGFyc2VyX3RvX2Nvb3JkX2FycmF5LCAgIC8qIHRvX2Nvb3JkX2FycmF5ICAgKi8KLSAgICBwc19wYXJzZXJfdG9fZml4ZWRfYXJyYXksICAgLyogdG9fZml4ZWRfYXJyYXkgICAqLwotICAgIHBzX3BhcnNlcl90b190b2tlbiwgICAgICAgICAvKiB0b190b2tlbiAgICAgICAgICovCi0gICAgcHNfcGFyc2VyX3RvX3Rva2VuX2FycmF5LCAgIC8qIHRvX3Rva2VuX2FycmF5ICAgKi8KLQotICAgIHBzX3BhcnNlcl9sb2FkX2ZpZWxkLCAgICAgICAvKiBsb2FkX2ZpZWxkICAgICAgICovCi0gICAgcHNfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUgIC8qIGxvYWRfZmllbGRfdGFibGUgKi8KLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBUMV9CdWlsZGVyX0Z1bmNzUmVjICB0MV9idWlsZGVyX2Z1bmNzID0KLSAgewotICAgIHQxX2J1aWxkZXJfaW5pdCwgICAgICAgICAgLyogaW5pdCAqLwotICAgIHQxX2J1aWxkZXJfZG9uZSwgICAgICAgICAgLyogZG9uZSAqLwotCi0gICAgdDFfYnVpbGRlcl9jaGVja19wb2ludHMsICAvKiBjaGVja19wb2ludHMgICovCi0gICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQsICAgICAvKiBhZGRfcG9pbnQgICAgICovCi0gICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQxLCAgICAvKiBhZGRfcG9pbnQxICAgICovCi0gICAgdDFfYnVpbGRlcl9hZGRfY29udG91ciwgICAvKiBhZGRfY29udG91ciAgICovCi0gICAgdDFfYnVpbGRlcl9zdGFydF9wb2ludCwgICAvKiBzdGFydF9wb2ludCAgICovCi0gICAgdDFfYnVpbGRlcl9jbG9zZV9jb250b3VyICAvKiBjbG9zZV9jb250b3VyICovCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgVDFfRGVjb2Rlcl9GdW5jc1JlYyAgdDFfZGVjb2Rlcl9mdW5jcyA9Ci0gIHsKLSAgICB0MV9kZWNvZGVyX2luaXQsICAgICAgICAgICAgICAvKiBpbml0ICAgICAgICAgICAgICAqLwotICAgIHQxX2RlY29kZXJfZG9uZSwgICAgICAgICAgICAgIC8qIGRvbmUgICAgICAgICAgICAgICovCi0gICAgdDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyAgLyogcGFyc2VfY2hhcnN0cmluZ3MgKi8KLSAgfTsKLQotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBBRk1fUGFyc2VyX0Z1bmNzUmVjICBhZm1fcGFyc2VyX2Z1bmNzID0KLSAgewotICAgIGFmbV9wYXJzZXJfaW5pdCwgIC8qIGluaXQgICovCi0gICAgYWZtX3BhcnNlcl9kb25lLCAgLyogZG9uZSAgKi8KLSAgICBhZm1fcGFyc2VyX3BhcnNlICAvKiBwYXJzZSAqLwotICB9OwotI2VuZGlmCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgVDFfQ01hcF9DbGFzc2VzUmVjICB0MV9jbWFwX2NsYXNzZXMgPQotICB7Ci0gICAgJnQxX2NtYXBfc3RhbmRhcmRfY2xhc3NfcmVjLAotICAgICZ0MV9jbWFwX2V4cGVydF9jbGFzc19yZWMsCi0gICAgJnQxX2NtYXBfY3VzdG9tX2NsYXNzX3JlYywKLSAgICAmdDFfY21hcF91bmljb2RlX2NsYXNzX3JlYwotICB9OwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IFBTQXV4X0ludGVyZmFjZSAgcHNhdXhfaW50ZXJmYWNlID0KLSAgewotICAgICZwc190YWJsZV9mdW5jcywKLSAgICAmcHNfcGFyc2VyX2Z1bmNzLAotICAgICZ0MV9idWlsZGVyX2Z1bmNzLAotICAgICZ0MV9kZWNvZGVyX2Z1bmNzLAotICAgIHQxX2RlY3J5cHQsCi0KLSAgICAoY29uc3QgVDFfQ01hcF9DbGFzc2VzUmVjKikgJnQxX2NtYXBfY2xhc3NlcywKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQotICAgICZhZm1fcGFyc2VyX2Z1bmNzLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgRlRfTW9kdWxlX0NsYXNzICBwc2F1eF9tb2R1bGVfY2xhc3MgPQotICB7Ci0gICAgMCwKLSAgICBzaXplb2YgKCBGVF9Nb2R1bGVSZWMgKSwKLSAgICAicHNhdXgiLAotICAgIDB4MjAwMDBMLAotICAgIDB4MjAwMDBMLAotCi0gICAgJnBzYXV4X2ludGVyZmFjZSwgIC8qIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpTlVMTCwgIC8qIG1vZHVsZV9pbml0ICAgKi8KLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIE5VTEwsICAvKiBtb2R1bGVfZG9uZSAgICovCi0gICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICBOVUxMICAgLyogZ2V0X2ludGVyZmFjZSAqLwotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3BzYXV4bW9kLmggYi9zcmMvcHNhdXgvcHNhdXhtb2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2ZjM3ZS4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvcHNhdXhtb2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYXV4bW9kLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBtb2R1bGUgaW1wbGVtZW50YXRpb24gKHNwZWNpZmljYXRpb24pLiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBQU0FVWE1PRF9IXwotI2RlZmluZSBQU0FVWE1PRF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgInRoaXMgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCi0KLSAgRlRfRVhQT1JUX1ZBUiggY29uc3QgRlRfTW9kdWxlX0NsYXNzICkgIHBzYXV4X2RyaXZlcl9jbGFzczsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBQU0FVWE1PRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3BzY29udi5jIGIvc3JjL3BzYXV4L3BzY29udi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTI1YjA4Li4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC9wc2NvbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2NvbnYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU29tZSBjb252ZW5pZW5jZSBjb252ZXJzaW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAicHNjb252LmgiCi0jaW5jbHVkZSAicHNhdXhlcnIuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3BzY29udgotCi0KLSAgLyogVGhlIGZvbGxvd2luZyBhcnJheSBpcyB1c2VkIGJ5IHZhcmlvdXMgZnVuY3Rpb25zIHRvIHF1aWNrbHkgY29udmVydCAqLwotICAvKiBkaWdpdHMgKGJvdGggZGVjaW1hbCBhbmQgbm9uLWRlY2ltYWwpIGludG8gbnVtYmVycy4gICAgICAgICAgICAgICAgICovCi0KLSNpZiAnQScgPT0gNjUKLSAgLyogQVNDSUkgKi8KLQotICBzdGF0aWMgY29uc3QgRlRfQ2hhciAgZnRfY2hhcl90YWJsZVsxMjhdID0KLSAgewotICAgIC8qIDB4MDAgKi8KLSAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAtMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKLSAgICAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAtMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKLSAgICAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgfTsKLQotICAvKiBubyBjaGFyYWN0ZXIgPj0gMHg4MCBjYW4gcmVwcmVzZW50IGEgdmFsaWQgbnVtYmVyICovCi0jZGVmaW5lIE9QICA+PQotCi0jZW5kaWYgLyogJ0EnID09IDY1ICovCi0KLSNpZiAnQScgPT0gMTkzCi0gIC8qIEVCQ0RJQyAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9DaGFyICBmdF9jaGFyX3RhYmxlWzEyOF0gPQotICB7Ci0gICAgLyogMHg4MCAqLwotICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAtMSwgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAtMSwgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICB9OwotCi0gIC8qIG5vIGNoYXJhY3RlciA8IDB4ODAgY2FuIHJlcHJlc2VudCBhIHZhbGlkIG51bWJlciAqLwotI2RlZmluZSBPUCAgPAotCi0jZW5kaWYgLyogJ0EnID09IDE5MyAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Mb25nICkKLSAgUFNfQ29udl9TdHJ0b2woIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgYmFzZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9ICpjdXJzb3I7Ci0KLSAgICBGVF9Mb25nICAgbnVtICAgICAgICAgICA9IDA7Ci0gICAgRlRfQm9vbCAgIHNpZ24gICAgICAgICAgPSAwOwotICAgIEZUX0Jvb2wgICBoYXZlX292ZXJmbG93ID0gMDsKLQotICAgIEZUX0xvbmcgICBudW1fbGltaXQ7Ci0gICAgRlRfQ2hhciAgIGNfbGltaXQ7Ci0KLQotICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICBnb3RvIEJhZDsKLQotICAgIGlmICggYmFzZSA8IDIgfHwgYmFzZSA+IDM2ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTQoKCAiISEhSU5WQUxJRCBCQVNFOiEhISIgKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoICpwID09ICctJyB8fCAqcCA9PSAnKycgKQotICAgIHsKLSAgICAgIHNpZ24gPSBGVF9CT09MKCAqcCA9PSAnLScgKTsKLQotICAgICAgcCsrOwotICAgICAgaWYgKCBwID09IGxpbWl0ICkKLSAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgIC8qIG9ubHkgYSBzaW5nbGUgc2lnbiBpcyBhbGxvd2VkICovCi0gICAgICBpZiAoICpwID09ICctJyB8fCAqcCA9PSAnKycgKQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBudW1fbGltaXQgPSAweDdGRkZGRkZGTCAvIGJhc2U7Ci0gICAgY19saW1pdCAgID0gKEZUX0NoYXIpKCAweDdGRkZGRkZGTCAlIGJhc2UgKTsKLQotICAgIGZvciAoIDsgcCA8IGxpbWl0OyBwKysgKQotICAgIHsKLSAgICAgIEZUX0NoYXIgIGM7Ci0KLQotICAgICAgaWYgKCBJU19QU19TUEFDRSggKnAgKSB8fCAqcCBPUCAweDgwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGMgPSBmdF9jaGFyX3RhYmxlWypwICYgMHg3Rl07Ci0KLSAgICAgIGlmICggYyA8IDAgfHwgYyA+PSBiYXNlICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggbnVtID4gbnVtX2xpbWl0IHx8ICggbnVtID09IG51bV9saW1pdCAmJiBjID4gY19saW1pdCApICkKLSAgICAgICAgaGF2ZV9vdmVyZmxvdyA9IDE7Ci0gICAgICBlbHNlCi0gICAgICAgIG51bSA9IG51bSAqIGJhc2UgKyBjOwotICAgIH0KLQotICAgICpjdXJzb3IgPSBwOwotCi0gICAgaWYgKCBoYXZlX292ZXJmbG93ICkKLSAgICB7Ci0gICAgICBudW0gPSAweDdGRkZGRkZGTDsKLSAgICAgIEZUX1RSQUNFNCgoICIhISFPVkVSRkxPVzohISEiICkpOwotICAgIH0KLQotICAgIGlmICggc2lnbiApCi0gICAgICBudW0gPSAtbnVtOwotCi0gICAgcmV0dXJuIG51bTsKLQotICBCYWQ6Ci0gICAgRlRfVFJBQ0U0KCggIiEhIUVORCBPRiBEQVRBOiEhISIgKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfTG9uZyApCi0gIFBTX0NvbnZfVG9JbnQoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0ICkKLQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSAqY3Vyc29yOwotICAgIEZUX0J5dGUqICBjdXJwOwotCi0gICAgRlRfTG9uZyAgIG51bTsKLQotCi0gICAgY3VycCA9IHA7Ci0gICAgbnVtICA9IFBTX0NvbnZfU3RydG9sKCAmcCwgbGltaXQsIDEwICk7Ci0KLSAgICBpZiAoIHAgPT0gY3VycCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggcCA8IGxpbWl0ICYmICpwID09ICcjJyApCi0gICAgewotICAgICAgcCsrOwotCi0gICAgICBjdXJwID0gcDsKLSAgICAgIG51bSAgPSBQU19Db252X1N0cnRvbCggJnAsIGxpbWl0LCBudW0gKTsKLQotICAgICAgaWYgKCBwID09IGN1cnAgKQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAqY3Vyc29yID0gcDsKLQotICAgIHJldHVybiBudW07Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRml4ZWQgKQotICBQU19Db252X1RvRml4ZWQoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBwb3dlcl90ZW4gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSAqY3Vyc29yOwotICAgIEZUX0J5dGUqICBjdXJwOwotCi0gICAgRlRfRml4ZWQgIGludGVncmFsID0gMDsKLSAgICBGVF9Mb25nICAgZGVjaW1hbCAgPSAwOwotICAgIEZUX0xvbmcgICBkaXZpZGVyICA9IDE7Ci0KLSAgICBGVF9Cb29sICAgc2lnbiAgICAgICAgICAgPSAwOwotICAgIEZUX0Jvb2wgICBoYXZlX292ZXJmbG93ICA9IDA7Ci0gICAgRlRfQm9vbCAgIGhhdmVfdW5kZXJmbG93ID0gMDsKLQotCi0gICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgIGdvdG8gQmFkOwotCi0gICAgaWYgKCAqcCA9PSAnLScgfHwgKnAgPT0gJysnICkKLSAgICB7Ci0gICAgICBzaWduID0gRlRfQk9PTCggKnAgPT0gJy0nICk7Ci0KLSAgICAgIHArKzsKLSAgICAgIGlmICggcCA9PSBsaW1pdCApCi0gICAgICAgIGdvdG8gQmFkOwotCi0gICAgICAvKiBvbmx5IGEgc2luZ2xlIHNpZ24gaXMgYWxsb3dlZCAqLwotICAgICAgaWYgKCAqcCA9PSAnLScgfHwgKnAgPT0gJysnICkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogcmVhZCB0aGUgaW50ZWdlciBwYXJ0ICovCi0gICAgaWYgKCAqcCAhPSAnLicgKQotICAgIHsKLSAgICAgIGN1cnAgICAgID0gcDsKLSAgICAgIGludGVncmFsID0gUFNfQ29udl9Ub0ludCggJnAsIGxpbWl0ICk7Ci0KLSAgICAgIGlmICggcCA9PSBjdXJwICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIGlmICggaW50ZWdyYWwgPiAweDdGRkYgKQotICAgICAgICBoYXZlX292ZXJmbG93ID0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgaW50ZWdyYWwgPSAoRlRfRml4ZWQpKCAoRlRfVUludDMyKWludGVncmFsIDw8IDE2ICk7Ci0gICAgfQotCi0gICAgLyogcmVhZCB0aGUgZGVjaW1hbCBwYXJ0ICovCi0gICAgaWYgKCBwIDwgbGltaXQgJiYgKnAgPT0gJy4nICkKLSAgICB7Ci0gICAgICBwKys7Ci0KLSAgICAgIGZvciAoIDsgcCA8IGxpbWl0OyBwKysgKQotICAgICAgewotICAgICAgICBGVF9DaGFyICBjOwotCi0KLSAgICAgICAgaWYgKCBJU19QU19TUEFDRSggKnAgKSB8fCAqcCBPUCAweDgwICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjID0gZnRfY2hhcl90YWJsZVsqcCAmIDB4N0ZdOwotCi0gICAgICAgIGlmICggYyA8IDAgfHwgYyA+PSAxMCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogb25seSBhZGQgZGlnaXQgaWYgd2UgZG9uJ3Qgb3ZlcmZsb3cgKi8KLSAgICAgICAgaWYgKCBkaXZpZGVyIDwgMHhDQ0NDQ0NDTCAmJiBkZWNpbWFsIDwgMHhDQ0NDQ0NDTCApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAqIDEwICsgYzsKLQotICAgICAgICAgIGlmICggIWludGVncmFsICYmIHBvd2VyX3RlbiA+IDAgKQotICAgICAgICAgICAgcG93ZXJfdGVuLS07Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGl2aWRlciAqPSAxMDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlYWQgZXhwb25lbnQsIGlmIGFueSAqLwotICAgIGlmICggcCArIDEgPCBsaW1pdCAmJiAoICpwID09ICdlJyB8fCAqcCA9PSAnRScgKSApCi0gICAgewotICAgICAgRlRfTG9uZyAgZXhwb25lbnQ7Ci0KLQotICAgICAgcCsrOwotCi0gICAgICBjdXJwICAgICA9IHA7Ci0gICAgICBleHBvbmVudCA9IFBTX0NvbnZfVG9JbnQoICZwLCBsaW1pdCApOwotCi0gICAgICBpZiAoIGN1cnAgPT0gcCApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICAvKiBhcmJpdHJhcmlseSBsaW1pdCBleHBvbmVudCAqLwotICAgICAgaWYgKCBleHBvbmVudCA+IDEwMDAgKQotICAgICAgICBoYXZlX292ZXJmbG93ID0gMTsKLSAgICAgIGVsc2UgaWYgKCBleHBvbmVudCA8IC0xMDAwICkKLSAgICAgICAgaGF2ZV91bmRlcmZsb3cgPSAxOwotICAgICAgZWxzZQotICAgICAgICBwb3dlcl90ZW4gKz0gZXhwb25lbnQ7Ci0gICAgfQotCi0gICAgKmN1cnNvciA9IHA7Ci0KLSAgICBpZiAoICFpbnRlZ3JhbCAmJiAhZGVjaW1hbCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggaGF2ZV9vdmVyZmxvdyApCi0gICAgICBnb3RvIE92ZXJmbG93OwotICAgIGlmICggaGF2ZV91bmRlcmZsb3cgKQotICAgICAgZ290byBVbmRlcmZsb3c7Ci0KLSAgICB3aGlsZSAoIHBvd2VyX3RlbiA+IDAgKQotICAgIHsKLSAgICAgIGlmICggaW50ZWdyYWwgPj0gMHhDQ0NDQ0NDTCApCi0gICAgICAgIGdvdG8gT3ZlcmZsb3c7Ci0gICAgICBpbnRlZ3JhbCAqPSAxMDsKLQotICAgICAgaWYgKCBkZWNpbWFsID49IDB4Q0NDQ0NDQ0wgKQotICAgICAgewotICAgICAgICBpZiAoIGRpdmlkZXIgPT0gMSApCi0gICAgICAgICAgZ290byBPdmVyZmxvdzsKLSAgICAgICAgZGl2aWRlciAvPSAxMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZGVjaW1hbCAqPSAxMDsKLQotICAgICAgcG93ZXJfdGVuLS07Ci0gICAgfQotCi0gICAgd2hpbGUgKCBwb3dlcl90ZW4gPCAwICkKLSAgICB7Ci0gICAgICBpbnRlZ3JhbCAvPSAxMDsKLSAgICAgIGlmICggZGl2aWRlciA8IDB4Q0NDQ0NDQ0wgKQotICAgICAgICBkaXZpZGVyICo9IDEwOwotICAgICAgZWxzZQotICAgICAgICBkZWNpbWFsIC89IDEwOwotCi0gICAgICBpZiAoICFpbnRlZ3JhbCAmJiAhZGVjaW1hbCApCi0gICAgICAgIGdvdG8gVW5kZXJmbG93OwotCi0gICAgICBwb3dlcl90ZW4rKzsKLSAgICB9Ci0KLSAgICBpZiAoIGRlY2ltYWwgKQotICAgIHsKLSAgICAgIGRlY2ltYWwgPSBGVF9EaXZGaXgoIGRlY2ltYWwsIGRpdmlkZXIgKTsKLSAgICAgIC8qIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBjaGVjayB0aGlzIGFkZGl0aW9uIGZvciBvdmVyZmxvdyAqLwotICAgICAgLyogZHVlIHRvIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJlYWwgbnVtYmVyIHJlcHJlc2VudGF0aW9uICovCi0gICAgICBpbnRlZ3JhbCArPSBkZWNpbWFsOwotICAgIH0KLQotICBFeGl0OgotICAgIGlmICggc2lnbiApCi0gICAgICBpbnRlZ3JhbCA9IC1pbnRlZ3JhbDsKLQotICAgIHJldHVybiBpbnRlZ3JhbDsKLQotICBCYWQ6Ci0gICAgRlRfVFJBQ0U0KCggIiEhIUVORCBPRiBEQVRBOiEhISIgKSk7Ci0gICAgcmV0dXJuIDA7Ci0KLSAgT3ZlcmZsb3c6Ci0gICAgaW50ZWdyYWwgPSAweDdGRkZGRkZGTDsKLSAgICBGVF9UUkFDRTQoKCAiISEhT1ZFUkZMT1c6ISEhIiApKTsKLSAgICBnb3RvIEV4aXQ7Ci0KLSAgVW5kZXJmbG93OgotICAgIEZUX1RSQUNFNCgoICIhISFVTkRFUkZMT1c6ISEhIiApKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSNpZiAwCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUludCApCi0gIFBTX0NvbnZfU3RyaW5nRGVjb2RlKCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCAgbiApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VSW50ICAgciA9IDA7Ci0KLQotICAgIGZvciAoIHAgPSAqY3Vyc29yOyByIDwgbiAmJiBwIDwgbGltaXQ7IHArKyApCi0gICAgewotICAgICAgRlRfQnl0ZSAgYjsKLQotCi0gICAgICBpZiAoICpwICE9ICdcXCcgKQotICAgICAgewotICAgICAgICBidWZmZXJbcisrXSA9ICpwOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBwKys7Ci0KLSAgICAgIHN3aXRjaCAoICpwICkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ24nOgotICAgICAgICBiID0gJ1xuJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdyJzoKLSAgICAgICAgYiA9ICdccic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAndCc6Ci0gICAgICAgIGIgPSAnXHQnOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2InOgotICAgICAgICBiID0gJ1xiJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdmJzoKLSAgICAgICAgYiA9ICdcZic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnXHInOgotICAgICAgICBwKys7Ci0gICAgICAgIGlmICggKnAgIT0gJ1xuJyApCi0gICAgICAgIHsKLSAgICAgICAgICBiID0gKnA7Ci0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvKiBubyBicmVhayAqLwotICAgICAgY2FzZSAnXG4nOgotICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoIElTX1BTX0RJR0lUKCAqcCApICkKLSAgICAgICAgewotICAgICAgICAgIGIgPSAqcCAtICcwJzsKLQotICAgICAgICAgIHArKzsKLQotICAgICAgICAgIGlmICggSVNfUFNfRElHSVQoICpwICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGIgPSBiICogOCArICpwIC0gJzAnOwotCi0gICAgICAgICAgICBwKys7Ci0KLSAgICAgICAgICAgIGlmICggSVNfUFNfRElHSVQoICpwICkgKQotICAgICAgICAgICAgICBiID0gYiAqIDggKyAqcCAtICcwJzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnVmZmVyW3IrK10gPSBiOwotICAgICAgICAgICAgICBiID0gKnA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXJbcisrXSA9IGI7Ci0gICAgICAgICAgICBiID0gKnA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBiID0gKnA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBidWZmZXJbcisrXSA9IGI7Ci0gICAgfQotCi0gICAgKmN1cnNvciA9IHA7Ci0KLSAgICByZXR1cm4gcjsKLSAgfQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUludCApCi0gIFBTX0NvbnZfQVNDSUlIZXhEZWNvZGUoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBuICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VJbnQgICByICAgPSAwOwotICAgIEZUX1VJbnQgICB3ICAgPSAwOwotICAgIEZUX1VJbnQgICBwYWQgPSAweDAxOwotCi0KLSAgICBuICo9IDI7Ci0KLSNpZiAxCi0KLSAgICBwID0gKmN1cnNvcjsKLQotICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggbiA+IChGVF9VSW50KSggbGltaXQgLSBwICkgKQotICAgICAgbiA9IChGVF9VSW50KSggbGltaXQgLSBwICk7Ci0KLSAgICAvKiB3ZSB0cnkgdG8gcHJvY2VzcyB0d28gbmliYmxlcyBhdCBhIHRpbWUgdG8gYmUgYXMgZmFzdCBhcyBwb3NzaWJsZSAqLwotICAgIGZvciAoIDsgciA8IG47IHIrKyApCi0gICAgewotICAgICAgRlRfVUludCAgYyA9IHBbcl07Ci0KLQotICAgICAgaWYgKCBJU19QU19TUEFDRSggYyApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggYyBPUCAweDgwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGMgPSAoRlRfVUludClmdF9jaGFyX3RhYmxlW2MgJiAweDdGXTsKLSAgICAgIGlmICggYyA+PSAxNiApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBwYWQgPSAoIHBhZCA8PCA0ICkgfCBjOwotICAgICAgaWYgKCBwYWQgJiAweDEwMCApCi0gICAgICB7Ci0gICAgICAgIGJ1ZmZlclt3KytdID0gKEZUX0J5dGUpcGFkOwotICAgICAgICBwYWQgICAgICAgICA9IDB4MDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBwYWQgIT0gMHgwMSApCi0gICAgICBidWZmZXJbdysrXSA9IChGVF9CeXRlKSggcGFkIDw8IDQgKTsKLQotICAgICpjdXJzb3IgPSBwICsgcjsKLQotICAgIHJldHVybiB3OwotCi0jZWxzZSAvKiAwICovCi0KLSAgICBmb3IgKCByID0gMDsgciA8IG47IHIrKyApCi0gICAgewotICAgICAgRlRfQ2hhciAgYzsKLQotCi0gICAgICBpZiAoIElTX1BTX1NQQUNFKCAqcCApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggKnAgT1AgMHg4MCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjID0gZnRfY2hhcl90YWJsZVsqcCAmIDB4N0ZdOwotCi0gICAgICBpZiAoICh1bnNpZ25lZCljID49IDE2ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggciAmIDEgKQotICAgICAgewotICAgICAgICAqYnVmZmVyID0gKEZUX0J5dGUpKCpidWZmZXIgKyBjKTsKLSAgICAgICAgYnVmZmVyKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICpidWZmZXIgPSAoRlRfQnl0ZSkoYyA8PCA0KTsKLQotICAgICAgcisrOwotICAgIH0KLQotICAgICpjdXJzb3IgPSBwOwotCi0gICAgcmV0dXJuICggciArIDEgKSAvIDI7Ci0KLSNlbmRpZiAvKiAwICovCi0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VSW50ICkKLSAgUFNfQ29udl9FZXhlY0RlY29kZSggRlRfQnl0ZSoqICAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgICBuLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBzZWVkICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VJbnQgICByOwotICAgIEZUX1VJbnQgICBzID0gKnNlZWQ7Ci0KLQotI2lmIDEKLQotICAgIHAgPSAqY3Vyc29yOwotCi0gICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCBuID4gKEZUX1VJbnQpKGxpbWl0IC0gcCkgKQotICAgICAgbiA9IChGVF9VSW50KShsaW1pdCAtIHApOwotCi0gICAgZm9yICggciA9IDA7IHIgPCBuOyByKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIHZhbCA9IHBbcl07Ci0gICAgICBGVF9VSW50ICBiICAgPSAoIHZhbCBeICggcyA+PiA4ICkgKTsKLQotCi0gICAgICBzICAgICAgICAgPSAoICh2YWwgKyBzKSo1Mjg0NVUgKyAyMjcxOSApICYgMHhGRkZGVTsKLSAgICAgIGJ1ZmZlcltyXSA9IChGVF9CeXRlKSBiOwotICAgIH0KLQotICAgICpjdXJzb3IgPSBwICsgbjsKLSAgICAqc2VlZCAgID0gKEZUX1VTaG9ydClzOwotCi0jZWxzZSAvKiAwICovCi0KLSAgICBmb3IgKCByID0gMCwgcCA9ICpjdXJzb3I7IHIgPCBuICYmIHAgPCBsaW1pdDsgcisrLCBwKysgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgIGIgPSAoRlRfQnl0ZSkoICpwIF4gKCBzID4+IDggKSApOwotCi0KLSAgICAgIHMgPSAoRlRfVVNob3J0KSggKCAqcCArIHMgKSAqIDUyODQ1VSArIDIyNzE5ICk7Ci0gICAgICAqYnVmZmVyKysgPSBiOwotICAgIH0KLSAgICAqY3Vyc29yID0gcDsKLSAgICAqc2VlZCAgID0gczsKLQotI2VuZGlmIC8qIDAgKi8KLQotICAgIHJldHVybiByOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNjb252LmggYi9zcmMvcHNhdXgvcHNjb252LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjI1NGEuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L3BzY29udi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNjb252LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNvbWUgY29udmVuaWVuY2UgY29udmVyc2lvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBTQ09OVl9IXwotI2RlZmluZSBQU0NPTlZfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfTG9uZyApCi0gIFBTX0NvbnZfU3RydG9sKCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGJhc2UgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9Mb25nICkKLSAgUFNfQ29udl9Ub0ludCggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKTsKLQotICBGVF9MT0NBTCggRlRfRml4ZWQgKQotICBQU19Db252X1RvRml4ZWQoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBwb3dlcl90ZW4gKTsKLQotI2lmIDAKLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBQU19Db252X1N0cmluZ0RlY29kZSggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIG4gKTsKLSNlbmRpZgotCi0gIEZUX0xPQ0FMKCBGVF9VSW50ICkKLSAgUFNfQ29udl9BU0NJSUhleERlY29kZSggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIG4gKTsKLQotICBGVF9MT0NBTCggRlRfVUludCApCi0gIFBTX0NvbnZfRWV4ZWNEZWNvZGUoIEZUX0J5dGUqKiAgIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgc2VlZCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFBTQ09OVl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3Bzb2Jqcy5jIGIvc3JjL3BzYXV4L3Bzb2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDRlZGVhLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC9wc29ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgZm9yIFBvc3RTY3JpcHQgZm9udHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotCi0jaW5jbHVkZSAicHNvYmpzLmgiCi0jaW5jbHVkZSAicHNjb252LmgiCi0KLSNpbmNsdWRlICJwc2F1eGVyci5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcHNvYmpzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc190YWJsZV9uZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIFBTX1RhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZSAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCAgOjogVGhlIHRhYmxlIHNpemUgPSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBUaGUgbWVtb3J5IG9iamVjdCB0byB1c2UgZm9yIGFsbCBzdWJzZXF1ZW50ICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgcmVhbGxvY2F0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwc190YWJsZV9uZXcoIFBTX1RhYmxlICAgdGFibGUsCi0gICAgICAgICAgICAgICAgRlRfSW50ICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIHRhYmxlLT5tZW1vcnkgPSBtZW1vcnk7Ci0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHRhYmxlLT5lbGVtZW50cywgY291bnQgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCB0YWJsZS0+bGVuZ3RocywgIGNvdW50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgdGFibGUtPm1heF9lbGVtcyA9IGNvdW50OwotICAgIHRhYmxlLT5pbml0ICAgICAgPSAweERFQURCRUVGVUw7Ci0gICAgdGFibGUtPm51bV9lbGVtcyA9IDA7Ci0gICAgdGFibGUtPmJsb2NrICAgICA9IE5VTEw7Ci0gICAgdGFibGUtPmNhcGFjaXR5ICA9IDA7Ci0gICAgdGFibGUtPmN1cnNvciAgICA9IDA7Ci0KLSAgICAqKFBTX1RhYmxlX0Z1bmNzUmVjKikmdGFibGUtPmZ1bmNzID0gcHNfdGFibGVfZnVuY3M7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0ZSRUUoIHRhYmxlLT5lbGVtZW50cyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBzaGlmdF9lbGVtZW50cyggUFNfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogIG9sZF9iYXNlICkKLSAgewotICAgIEZUX1B0ckRpc3QgIGRlbHRhICA9IHRhYmxlLT5ibG9jayAtIG9sZF9iYXNlOwotICAgIEZUX0J5dGUqKiAgIG9mZnNldCA9IHRhYmxlLT5lbGVtZW50czsKLSAgICBGVF9CeXRlKiogICBsaW1pdCAgPSBvZmZzZXQgKyB0YWJsZS0+bWF4X2VsZW1zOwotCi0KLSAgICBmb3IgKCA7IG9mZnNldCA8IGxpbWl0OyBvZmZzZXQrKyApCi0gICAgewotICAgICAgaWYgKCBvZmZzZXRbMF0gKQotICAgICAgICBvZmZzZXRbMF0gKz0gZGVsdGE7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmVhbGxvY2F0ZV90MV90YWJsZSggUFNfVGFibGUgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBuZXdfc2l6ZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSAgID0gdGFibGUtPm1lbW9yeTsKLSAgICBGVF9CeXRlKiAgIG9sZF9iYXNlID0gdGFibGUtPmJsb2NrOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgIC8qIGFsbG9jYXRlIG5ldyBiYXNlIGJsb2NrICovCi0gICAgaWYgKCBGVF9BTExPQyggdGFibGUtPmJsb2NrLCBuZXdfc2l6ZSApICkKLSAgICB7Ci0gICAgICB0YWJsZS0+YmxvY2sgPSBvbGRfYmFzZTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IGVsZW1lbnRzIGFuZCBzaGlmdCBvZmZzZXRzICovCi0gICAgaWYgKCBvbGRfYmFzZSApCi0gICAgewotICAgICAgRlRfTUVNX0NPUFkoIHRhYmxlLT5ibG9jaywgb2xkX2Jhc2UsIHRhYmxlLT5jYXBhY2l0eSApOwotICAgICAgc2hpZnRfZWxlbWVudHMoIHRhYmxlLCBvbGRfYmFzZSApOwotICAgICAgRlRfRlJFRSggb2xkX2Jhc2UgKTsKLSAgICB9Ci0KLSAgICB0YWJsZS0+Y2FwYWNpdHkgPSBuZXdfc2l6ZTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBzX3RhYmxlX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkZHMgYW4gb2JqZWN0IHRvIGEgUFNfVGFibGUsIHBvc3NpYmx5IGdyb3dpbmcgaXRzIG1lbW9yeSBibG9jay4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlICA6OiBUaGUgdGFyZ2V0IHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlkeCAgICA6OiBUaGUgaW5kZXggb2YgdGhlIG9iamVjdCBpbiB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2JqZWN0IDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QgdG8gY29weSBpbiBtZW1vcnkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgc291cmNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgYSAgKi8KLSAgLyogICAgcmVhbGxvY2F0aW9uIGZhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcHNfdGFibGVfYWRkKCBQU19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgRlRfSW50ICAgIGlkeCwKLSAgICAgICAgICAgICAgICB2b2lkKiAgICAgb2JqZWN0LAotICAgICAgICAgICAgICAgIEZUX1VJbnQgICBsZW5ndGggKQotICB7Ci0gICAgaWYgKCBpZHggPCAwIHx8IGlkeCA+PSB0YWJsZS0+bWF4X2VsZW1zICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJwc190YWJsZV9hZGQ6IGludmFsaWQgaW5kZXhcbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICB9Ci0KLSAgICAvKiBncm93IHRoZSBiYXNlIGJsb2NrIGlmIG5lZWRlZCAqLwotICAgIGlmICggdGFibGUtPmN1cnNvciArIGxlbmd0aCA+IHRhYmxlLT5jYXBhY2l0eSApCi0gICAgewotICAgICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgICBGVF9PZmZzZXQgICBuZXdfc2l6ZSA9IHRhYmxlLT5jYXBhY2l0eTsKLSAgICAgIEZUX1B0ckRpc3QgIGluX29mZnNldDsKLQotCi0gICAgICBpbl9vZmZzZXQgPSAoRlRfQnl0ZSopb2JqZWN0IC0gdGFibGUtPmJsb2NrOwotICAgICAgaWYgKCBpbl9vZmZzZXQgPCAwIHx8IChGVF9PZmZzZXQpaW5fb2Zmc2V0ID49IHRhYmxlLT5jYXBhY2l0eSApCi0gICAgICAgIGluX29mZnNldCA9IC0xOwotCi0gICAgICB3aGlsZSAoIG5ld19zaXplIDwgdGFibGUtPmN1cnNvciArIGxlbmd0aCApCi0gICAgICB7Ci0gICAgICAgIC8qIGluY3JlYXNlIHNpemUgYnkgMjUlIGFuZCByb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZQotICAgICAgICAgICBvZiAxMDI0ICovCi0gICAgICAgIG5ld19zaXplICs9ICggbmV3X3NpemUgPj4gMiApICsgMTsKLSAgICAgICAgbmV3X3NpemUgID0gRlRfUEFEX0NFSUwoIG5ld19zaXplLCAxMDI0ICk7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gcmVhbGxvY2F0ZV90MV90YWJsZSggdGFibGUsIG5ld19zaXplICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBpZiAoIGluX29mZnNldCA+PSAwICkKLSAgICAgICAgb2JqZWN0ID0gdGFibGUtPmJsb2NrICsgaW5fb2Zmc2V0OwotICAgIH0KLQotICAgIC8qIGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBiYXNlIGJsb2NrIGFuZCBhZGp1c3Qgb2Zmc2V0ICovCi0gICAgdGFibGUtPmVsZW1lbnRzW2lkeF0gPSB0YWJsZS0+YmxvY2sgKyB0YWJsZS0+Y3Vyc29yOwotICAgIHRhYmxlLT5sZW5ndGhzIFtpZHhdID0gbGVuZ3RoOwotICAgIEZUX01FTV9DT1BZKCB0YWJsZS0+YmxvY2sgKyB0YWJsZS0+Y3Vyc29yLCBvYmplY3QsIGxlbmd0aCApOwotCi0gICAgdGFibGUtPmN1cnNvciArPSBsZW5ndGg7Ci0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHNfdGFibGVfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluYWxpemVzIGEgUFNfVGFibGVSZWMgKGkuZS4sIHJlYWxsb2NhdGUgaXQgdG8gaXRzIGN1cnJlbnQgICAgICAgICovCi0gIC8qICAgIGN1cnNvcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlIDo6IFRoZSB0YXJnZXQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgcmVsZWFzZSB0aGUgaGVhcCdzIG1lbW9yeSBibG9jay4gIEl0IGlzIHVwICAqLwotICAvKiAgICB0byB0aGUgY2FsbGVyIHRvIGNsZWFuIGl0LCBvciByZWZlcmVuY2UgaXQgaW4gaXRzIG93biBzdHJ1Y3R1cmVzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3RhYmxlX2RvbmUoIFBTX1RhYmxlICB0YWJsZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHRhYmxlLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9CeXRlKiAgIG9sZF9iYXNlID0gdGFibGUtPmJsb2NrOwotCi0KLSAgICAvKiBzaG91bGQgbmV2ZXIgZmFpbCwgYmVjYXVzZSByZWMuY3Vyc29yIDw9IHJlYy5zaXplICovCi0gICAgaWYgKCAhb2xkX2Jhc2UgKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCBGVF9BTExPQyggdGFibGUtPmJsb2NrLCB0YWJsZS0+Y3Vyc29yICkgKQotICAgICAgcmV0dXJuOwotICAgIEZUX01FTV9DT1BZKCB0YWJsZS0+YmxvY2ssIG9sZF9iYXNlLCB0YWJsZS0+Y3Vyc29yICk7Ci0gICAgc2hpZnRfZWxlbWVudHMoIHRhYmxlLCBvbGRfYmFzZSApOwotCi0gICAgdGFibGUtPmNhcGFjaXR5ID0gdGFibGUtPmN1cnNvcjsKLSAgICBGVF9GUkVFKCBvbGRfYmFzZSApOwotCi0gICAgRlRfVU5VU0VEKCBlcnJvciApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc190YWJsZV9yZWxlYXNlKCBQU19UYWJsZSAgdGFibGUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSB0YWJsZS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIChGVF9VTG9uZyl0YWJsZS0+aW5pdCA9PSAweERFQURCRUVGVUwgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIHRhYmxlLT5ibG9jayApOwotICAgICAgRlRfRlJFRSggdGFibGUtPmVsZW1lbnRzICk7Ci0gICAgICBGVF9GUkVFKCB0YWJsZS0+bGVuZ3RocyApOwotICAgICAgdGFibGUtPmluaXQgPSAwOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFBBUlNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbW1lbnQgKi8KLQotICBzdGF0aWMgdm9pZAotICBza2lwX2NvbW1lbnQoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0ICkKLSAgewotICAgIEZUX0J5dGUqICBjdXIgPSAqYWN1cjsKLQotCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgaWYgKCBJU19QU19ORVdMSU5FKCAqY3VyICkgKQotICAgICAgICBicmVhazsKLSAgICAgIGN1cisrOwotICAgIH0KLQotICAgICphY3VyID0gY3VyOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBza2lwX3NwYWNlcyggRlRfQnl0ZSogICphY3VyLAotICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyID0gKmFjdXI7Ci0KLQotICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIGlmICggIUlTX1BTX1NQQUNFKCAqY3VyICkgKQotICAgICAgewotICAgICAgICBpZiAoICpjdXIgPT0gJyUnICkKLSAgICAgICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIFBMUk0sIGEgY29tbWVudCBpcyBlcXVhbCB0byBhIHNwYWNlLiAqLwotICAgICAgICAgIHNraXBfY29tbWVudCggJmN1ciwgbGltaXQgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY3VyKys7Ci0gICAgfQotCi0gICAgKmFjdXIgPSBjdXI7Ci0gIH0KLQotCi0jZGVmaW5lIElTX09DVEFMX0RJR0lUKCBjICkgKCAnMCcgPD0gKGMpICYmIChjKSA8PSAnNycgKQotCi0KLSAgLyogZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgYCgnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAqYWN1ciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGNsb3NpbmcgYCknICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHNraXBfbGl0ZXJhbF9zdHJpbmcoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgICAgIGN1ciAgID0gKmFjdXI7Ci0gICAgRlRfSW50ICAgICAgICBlbWJlZCA9IDA7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgIHVuc2lnbmVkIGludCAgaTsKLQotCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgRlRfQnl0ZSAgYyA9ICpjdXI7Ci0KLQotICAgICAgY3VyKys7Ci0KLSAgICAgIGlmICggYyA9PSAnXFwnICkKLSAgICAgIHsKLSAgICAgICAgLyogUmVkIEJvb2sgM3JkIGVkLiwgc2VjdGlvbiBgTGl0ZXJhbCBUZXh0IFN0cmluZ3MnLCBwLiAyOTogICAgICovCi0gICAgICAgIC8qIEEgYmFja3NsYXNoIGNhbiBpbnRyb2R1Y2UgdGhyZWUgZGlmZmVyZW50IHR5cGVzICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBvZiBlc2NhcGUgc2VxdWVuY2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAtIGEgc3BlY2lhbCBlc2NhcGVkIGNoYXIgbGlrZSBcciwgXG4sIGV0Yy4gICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgLSBhIG9uZS0sIHR3by0sIG9yIHRocmVlLWRpZ2l0IG9jdGFsIG51bWJlciAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgIC0gbm9uZSBvZiB0aGUgYWJvdmUgaW4gd2hpY2ggY2FzZSB0aGUgYmFja3NsYXNoIGlzIGlnbm9yZWQgKi8KLQotICAgICAgICBpZiAoIGN1ciA9PSBsaW1pdCApCi0gICAgICAgICAgLyogZXJyb3IgKG9yIHRvIGJlIGlnbm9yZWQ/KSAqLwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHN3aXRjaCAoICpjdXIgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc2tpcCBgc3BlY2lhbCcgZXNjYXBlICovCi0gICAgICAgIGNhc2UgJ24nOgotICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgIGNhc2UgJ2InOgotICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICBjYXNlICcoJzoKLSAgICAgICAgY2FzZSAnKSc6Ci0gICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAvKiBza2lwIG9jdGFsIGVzY2FwZSBvciBpZ25vcmUgYmFja3NsYXNoICovCi0gICAgICAgICAgZm9yICggaSA9IDA7IGkgPCAzICYmIGN1ciA8IGxpbWl0OyBpKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggIUlTX09DVEFMX0RJR0lUKCAqY3VyICkgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggYyA9PSAnKCcgKQotICAgICAgICBlbWJlZCsrOwotICAgICAgZWxzZSBpZiAoIGMgPT0gJyknICkKLSAgICAgIHsKLSAgICAgICAgZW1iZWQtLTsKLSAgICAgICAgaWYgKCBlbWJlZCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgKmFjdXIgPSBjdXI7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGA8JyAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBza2lwX3N0cmluZyggRlRfQnl0ZSogICphY3VyLAotICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyID0gKmFjdXI7Ci0gICAgRlRfRXJyb3IgIGVyciA9ICBGVF9FcnJfT2s7Ci0KLQotICAgIHdoaWxlICggKytjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgLyogQWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUgaWdub3JlZC4gKi8KLSAgICAgIHNraXBfc3BhY2VzKCAmY3VyLCBsaW1pdCApOwotICAgICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCAhSVNfUFNfWERJR0lUKCAqY3VyICkgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIGN1ciA8IGxpbWl0ICYmICpjdXIgIT0gJz4nICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJza2lwX3N0cmluZzogbWlzc2luZyBjbG9zaW5nIGRlbGltaXRlciBgPidcbiIgKSk7Ci0gICAgICBlcnIgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBjdXIrKzsKLQotICAgICphY3VyID0gY3VyOwotICAgIHJldHVybiBlcnI7Ci0gIH0KLQotCi0gIC8qIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIHRoZSBvcGVuaW5nIGJyYWNlIHRoYXQgKi8KLSAgLyogc3RhcnRzIHRoZSBwcm9jZWR1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIE5COiBbIGFuZCBdIG5lZWQgbm90IG1hdGNoOiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYC9mb28ge1t9IGRlZicgaXMgYSB2YWxpZCBQb3N0U2NyaXB0IGZyYWdtZW50LCAqLwotICAvKiBldmVuIHdpdGhpbiBhIFR5cGUxIGZvbnQgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHNraXBfcHJvY2VkdXJlKCBGVF9CeXRlKiAgKmFjdXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0ICkKLSAgewotICAgIEZUX0J5dGUqICBjdXI7Ci0gICAgRlRfSW50ICAgIGVtYmVkID0gMDsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIEZUX0FTU0VSVCggKiphY3VyID09ICd7JyApOwotCi0gICAgZm9yICggY3VyID0gKmFjdXI7IGN1ciA8IGxpbWl0ICYmIGVycm9yID09IEZUX0Vycl9PazsgY3VyKysgKQotICAgIHsKLSAgICAgIHN3aXRjaCAoICpjdXIgKQotICAgICAgewotICAgICAgY2FzZSAneyc6Ci0gICAgICAgIGVtYmVkKys7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlICd9JzoKLSAgICAgICAgZW1iZWQtLTsKLSAgICAgICAgaWYgKCBlbWJlZCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIGN1cisrOwotICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlICcoJzoKLSAgICAgICAgZXJyb3IgPSBza2lwX2xpdGVyYWxfc3RyaW5nKCAmY3VyLCBsaW1pdCApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAnPCc6Ci0gICAgICAgIGVycm9yID0gc2tpcF9zdHJpbmcoICZjdXIsIGxpbWl0ICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlICclJzoKLSAgICAgICAgc2tpcF9jb21tZW50KCAmY3VyLCBsaW1pdCApOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgZW5kOgotICAgIGlmICggZW1iZWQgIT0gMCApCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAqYWN1ciA9IGN1cjsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbCBleHBvcnRlZCBwYXJzaW5nIHJvdXRpbmVzIGhhbmRsZSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHN0b3AgYXQgKi8KLSAgLyogdGhlIGZpcnN0IGNoYXJhY3RlciB3aGljaCBpc24ndCBwYXJ0IG9mIHRoZSBqdXN0IGhhbmRsZWQgdG9rZW4uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBQU19QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICAvKiBOb3RlOiBQb3N0U2NyaXB0IGFsbG93cyBhbnkgbm9uLWRlbGltaXRpbmcsIG5vbi13aGl0ZXNwYWNlICAgICAgICAqLwotICAgIC8qICAgICAgIGNoYXJhY3RlciBpbiBhIG5hbWUgKFBTIFJlZiBNYW51YWwsIDNyZCBlZCwgcDMxKS4gICAgICAgICAgICovCi0gICAgLyogICAgICAgUG9zdFNjcmlwdCBkZWxpbWl0ZXJzIGFyZSAoLCApLCA8LCA+LCBbLCBdLCB7LCB9LCAvLCBhbmQgJS4gKi8KLQotICAgIEZUX0J5dGUqICBjdXIgICA9IHBhcnNlci0+Y3Vyc29yOwotICAgIEZUX0J5dGUqICBsaW1pdCA9IHBhcnNlci0+bGltaXQ7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBza2lwX3NwYWNlcyggJmN1ciwgbGltaXQgKTsgICAgICAgICAgICAgLyogdGhpcyBhbHNvIHNraXBzIGNvbW1lbnRzICovCi0gICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2VsZi1kZWxpbWl0aW5nLCBzaW5nbGUtY2hhcmFjdGVyIHRva2VucyAqLwotICAgIGlmICggKmN1ciA9PSAnWycgfHwgKmN1ciA9PSAnXScgKQotICAgIHsKLSAgICAgIGN1cisrOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHNraXAgYmFsYW5jZWQgZXhwcmVzc2lvbnMgKHByb2NlZHVyZXMgYW5kIHN0cmluZ3MpICovCi0KLSAgICBpZiAoICpjdXIgPT0gJ3snICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB7Li4ufSAqLwotICAgIHsKLSAgICAgIGVycm9yID0gc2tpcF9wcm9jZWR1cmUoICZjdXIsIGxpbWl0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAqY3VyID09ICcoJyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKC4uLikgKi8KLSAgICB7Ci0gICAgICBlcnJvciA9IHNraXBfbGl0ZXJhbF9zdHJpbmcoICZjdXIsIGxpbWl0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAqY3VyID09ICc8JyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPC4uLj4gKi8KLSAgICB7Ci0gICAgICBpZiAoIGN1ciArIDEgPCBsaW1pdCAmJiAqKGN1ciArIDEpID09ICc8JyApICAgLyogPDwgKi8KLSAgICAgIHsKLSAgICAgICAgY3VyKys7Ci0gICAgICAgIGN1cisrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IHNraXBfc3RyaW5nKCAmY3VyLCBsaW1pdCApOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAqY3VyID09ICc+JyApCi0gICAgewotICAgICAgY3VyKys7Ci0gICAgICBpZiAoIGN1ciA+PSBsaW1pdCB8fCAqY3VyICE9ICc+JyApICAgICAgICAgICAgIC8qID4+ICovCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX3BhcnNlcl9za2lwX1BTX3Rva2VuOiIKLSAgICAgICAgICAgICAgICAgICAiIHVuZXhwZWN0ZWQgY2xvc2luZyBkZWxpbWl0ZXIgYD4nXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGN1cisrOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggKmN1ciA9PSAnLycgKQotICAgICAgY3VyKys7Ci0KLSAgICAvKiBhbnl0aGluZyBlbHNlICovCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgLyogKmN1ciBtaWdodCBiZSBpbnZhbGlkIChlLmcuLCAnKScgb3IgJ30nKSwgYnV0IHRoaXMgICAqLwotICAgICAgLyogaXMgaGFuZGxlZCBieSB0aGUgdGVzdCBgY3VyID09IHBhcnNlci0+Y3Vyc29yJyBiZWxvdyAqLwotICAgICAgaWYgKCBJU19QU19ERUxJTSggKmN1ciApICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGN1cisrOwotICAgIH0KLQotICBFeGl0OgotICAgIGlmICggY3VyIDwgbGltaXQgJiYgY3VyID09IHBhcnNlci0+Y3Vyc29yICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJwc19wYXJzZXJfc2tpcF9QU190b2tlbjoiCi0gICAgICAgICAgICAgICAgICIgY3VycmVudCB0b2tlbiBpcyBgJWMnIHdoaWNoIGlzIHNlbGYtZGVsaW1pdGluZ1xuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAiIGJ1dCBpbnZhbGlkIGF0IHRoaXMgcG9pbnRcbiIsCi0gICAgICAgICAgICAgICAgICpjdXIgKSk7Ci0KLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGN1ciA+IGxpbWl0ICkKLSAgICAgIGN1ciA9IGxpbWl0OwotCi0gICAgcGFyc2VyLT5lcnJvciAgPSBlcnJvcjsKLSAgICBwYXJzZXItPmN1cnNvciA9IGN1cjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBQU19QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBza2lwX3NwYWNlcyggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0ICk7Ci0gIH0KLQotCi0gIC8qIGB0b2tlbicgaGVyZSBtZWFucyBlaXRoZXIgc29tZXRoaW5nIGJldHdlZW4gYmFsYW5jZWQgZGVsaW1pdGVycyAqLwotICAvKiBvciB0aGUgbmV4dCB0b2tlbjsgdGhlIGRlbGltaXRlcnMgYXJlIG5vdCByZW1vdmVkLiAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc19wYXJzZXJfdG9fdG9rZW4oIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuICAgdG9rZW4gKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1cjsKLSAgICBGVF9CeXRlKiAgbGltaXQ7Ci0gICAgRlRfSW50ICAgIGVtYmVkOwotCi0KLSAgICB0b2tlbi0+dHlwZSAgPSBUMV9UT0tFTl9UWVBFX05PTkU7Ci0gICAgdG9rZW4tPnN0YXJ0ID0gTlVMTDsKLSAgICB0b2tlbi0+bGltaXQgPSBOVUxMOwotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICBjdXIgICA9IHBhcnNlci0+Y3Vyc29yOwotICAgIGxpbWl0ID0gcGFyc2VyLT5saW1pdDsKLQotICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgIHJldHVybjsKLQotICAgIHN3aXRjaCAoICpjdXIgKQotICAgIHsKLSAgICAgIC8qKioqKioqKioqKioqIGNoZWNrIGZvciBsaXRlcmFsIHN0cmluZyAqKioqKioqKioqKioqKioqKi8KLSAgICBjYXNlICcoJzoKLSAgICAgIHRva2VuLT50eXBlICA9IFQxX1RPS0VOX1RZUEVfU1RSSU5HOwotICAgICAgdG9rZW4tPnN0YXJ0ID0gY3VyOwotCi0gICAgICBpZiAoIHNraXBfbGl0ZXJhbF9zdHJpbmcoICZjdXIsIGxpbWl0ICkgPT0gRlRfRXJyX09rICkKLSAgICAgICAgdG9rZW4tPmxpbWl0ID0gY3VyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qKioqKioqKioqKioqIGNoZWNrIGZvciBwcm9ncmFtcy9hcnJheSAqKioqKioqKioqKioqKioqKi8KLSAgICBjYXNlICd7JzoKLSAgICAgIHRva2VuLT50eXBlICA9IFQxX1RPS0VOX1RZUEVfQVJSQVk7Ci0gICAgICB0b2tlbi0+c3RhcnQgPSBjdXI7Ci0KLSAgICAgIGlmICggc2tpcF9wcm9jZWR1cmUoICZjdXIsIGxpbWl0ICkgPT0gRlRfRXJyX09rICkKLSAgICAgICAgdG9rZW4tPmxpbWl0ID0gY3VyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qKioqKioqKioqKioqIGNoZWNrIGZvciB0YWJsZS9hcnJheSAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qIFhYWDogaW4gdGhlb3J5IHdlIHNob3VsZCBhbHNvIGxvb2sgZm9yICI8PCIgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgc2luY2UgdGhpcyBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byAiWyI7ICAgKi8KLSAgICAgIC8qICAgICAgaW4gcHJhY3RpY2UgaXQgZG9lc24ndCBtYXR0ZXIgKD8pICAgICAgICAgICAgICAgKi8KLSAgICBjYXNlICdbJzoKLSAgICAgIHRva2VuLT50eXBlICA9IFQxX1RPS0VOX1RZUEVfQVJSQVk7Ci0gICAgICBlbWJlZCAgICAgICAgPSAxOwotICAgICAgdG9rZW4tPnN0YXJ0ID0gY3VyKys7Ci0KLSAgICAgIC8qIHdlIG5lZWQgdGhpcyB0byBjYXRjaCBgWyBdJyAqLwotICAgICAgcGFyc2VyLT5jdXJzb3IgPSBjdXI7Ci0gICAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIHBhcnNlciApOwotICAgICAgY3VyID0gcGFyc2VyLT5jdXJzb3I7Ci0KLSAgICAgIHdoaWxlICggY3VyIDwgbGltaXQgJiYgIXBhcnNlci0+ZXJyb3IgKQotICAgICAgewotICAgICAgICAvKiBYWFg6IHRoaXMgaXMgd3JvbmcgYmVjYXVzZSBpdCBkb2VzIG5vdCAgICAgICovCi0gICAgICAgIC8qICAgICAgc2tpcCBjb21tZW50cywgcHJvY2VkdXJlcywgYW5kIHN0cmluZ3MgKi8KLSAgICAgICAgaWYgKCAqY3VyID09ICdbJyApCi0gICAgICAgICAgZW1iZWQrKzsKLSAgICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJ10nICkKLSAgICAgICAgewotICAgICAgICAgIGVtYmVkLS07Ci0gICAgICAgICAgaWYgKCBlbWJlZCA8PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0b2tlbi0+bGltaXQgPSArK2N1cjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBhcnNlci0+Y3Vyc29yID0gY3VyOwotICAgICAgICBwc19wYXJzZXJfc2tpcF9QU190b2tlbiggcGFyc2VyICk7Ci0gICAgICAgIC8qIHdlIG5lZWQgdGhpcyB0byBjYXRjaCBgW1hYWCBdJyAqLwotICAgICAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMgICggcGFyc2VyICk7Ci0gICAgICAgIGN1ciA9IHBhcnNlci0+Y3Vyc29yOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qICoqKioqKioqKioqKiBvdGhlcndpc2UsIGl0IGlzIGFueSB0b2tlbiAqKioqKioqKioqKioqKi8KLSAgICBkZWZhdWx0OgotICAgICAgdG9rZW4tPnN0YXJ0ID0gY3VyOwotICAgICAgdG9rZW4tPnR5cGUgID0gKCAqY3VyID09ICcvJyApID8gVDFfVE9LRU5fVFlQRV9LRVkgOiBUMV9UT0tFTl9UWVBFX0FOWTsKLSAgICAgIHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBwYXJzZXIgKTsKLSAgICAgIGN1ciA9IHBhcnNlci0+Y3Vyc29yOwotICAgICAgaWYgKCAhcGFyc2VyLT5lcnJvciApCi0gICAgICAgIHRva2VuLT5saW1pdCA9IGN1cjsKLSAgICB9Ci0KLSAgICBpZiAoICF0b2tlbi0+bGltaXQgKQotICAgIHsKLSAgICAgIHRva2VuLT5zdGFydCA9IE5VTEw7Ci0gICAgICB0b2tlbi0+dHlwZSAgPSBUMV9UT0tFTl9UWVBFX05PTkU7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jdXJzb3IgPSBjdXI7Ci0gIH0KLQotCi0gIC8qIE5COiBgdG9rZW5zJyBjYW4gYmUgTlVMTCBpZiB3ZSBvbmx5IHdhbnQgdG8gY291bnQgKi8KLSAgLyogdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3BhcnNlcl90b190b2tlbl9hcnJheSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfVG9rZW4gICB0b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBtYXhfdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogICAgcG51bV90b2tlbnMgKQotICB7Ci0gICAgVDFfVG9rZW5SZWMgIG1hc3RlcjsKLQotCi0gICAgKnBudW1fdG9rZW5zID0gLTE7Ci0KLSAgICAvKiB0aGlzIGFsc28gaGFuZGxlcyBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgICBwc19wYXJzZXJfdG9fdG9rZW4oIHBhcnNlciwgJm1hc3RlciApOwotCi0gICAgaWYgKCBtYXN0ZXIudHlwZSA9PSBUMV9UT0tFTl9UWVBFX0FSUkFZICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgb2xkX2N1cnNvciA9IHBhcnNlci0+Y3Vyc29yOwotICAgICAgRlRfQnl0ZSogIG9sZF9saW1pdCAgPSBwYXJzZXItPmxpbWl0OwotICAgICAgVDFfVG9rZW4gIGN1ciAgICAgICAgPSB0b2tlbnM7Ci0gICAgICBUMV9Ub2tlbiAgbGltaXQgICAgICA9IGN1ciArIG1heF90b2tlbnM7Ci0KLQotICAgICAgLyogZG9uJ3QgaW5jbHVkZSBvdXRlcm1vc3QgZGVsaW1pdGVycyAqLwotICAgICAgcGFyc2VyLT5jdXJzb3IgPSBtYXN0ZXIuc3RhcnQgKyAxOwotICAgICAgcGFyc2VyLT5saW1pdCAgPSBtYXN0ZXIubGltaXQgLSAxOwotCi0gICAgICB3aGlsZSAoIHBhcnNlci0+Y3Vyc29yIDwgcGFyc2VyLT5saW1pdCApCi0gICAgICB7Ci0gICAgICAgIFQxX1Rva2VuUmVjICB0b2tlbjsKLQotCi0gICAgICAgIHBzX3BhcnNlcl90b190b2tlbiggcGFyc2VyLCAmdG9rZW4gKTsKLSAgICAgICAgaWYgKCAhdG9rZW4udHlwZSApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCB0b2tlbnMgJiYgY3VyIDwgbGltaXQgKQotICAgICAgICAgICpjdXIgPSB0b2tlbjsKLQotICAgICAgICBjdXIrKzsKLSAgICAgIH0KLQotICAgICAgKnBudW1fdG9rZW5zID0gKEZUX0ludCkoIGN1ciAtIHRva2VucyApOwotCi0gICAgICBwYXJzZXItPmN1cnNvciA9IG9sZF9jdXJzb3I7Ci0gICAgICBwYXJzZXItPmxpbWl0ICA9IG9sZF9saW1pdDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGEgZGVsaW1pdGVyIG9yIGEgcGFydCBvZiBhIG51bWJlciAqLwotICAvKiBOQjogYGNvb3JkcycgY2FuIGJlIE5VTEwgaWYgd2UganVzdCB3YW50IHRvIHNraXAgdGhlICAgICAgKi8KLSAgLyogICAgIGFycmF5OyBpbiB0aGlzIGNhc2Ugd2UgaWdub3JlIGBtYXhfY29vcmRzJyAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0ludAotICBwc190b2Nvb3JkYXJyYXkoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyICAgPSAqYWN1cjsKLSAgICBGVF9JbnQgICAgY291bnQgPSAwOwotICAgIEZUX0J5dGUgICBjLCBlbmRlcjsKLQotCi0gICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY2hlY2sgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYW4gYXJyYXk7IG90aGVyd2lzZSwgb25seSBvbmUgbnVtYmVyICovCi0gICAgLyogd2lsbCBiZSByZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgYyAgICAgPSAqY3VyOwotICAgIGVuZGVyID0gMDsKLQotICAgIGlmICggYyA9PSAnWycgKQotICAgICAgZW5kZXIgPSAnXSc7Ci0gICAgZWxzZSBpZiAoIGMgPT0gJ3snICkKLSAgICAgIGVuZGVyID0gJ30nOwotCi0gICAgaWYgKCBlbmRlciApCi0gICAgICBjdXIrKzsKLQotICAgIC8qIG5vdywgcmVhZCB0aGUgY29vcmRpbmF0ZXMgKi8KLSAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9TaG9ydCAgZHVtbXk7Ci0gICAgICBGVF9CeXRlKiAgb2xkX2N1cjsKLQotCi0gICAgICAvKiBza2lwIHdoaXRlc3BhY2UgaW4gZnJvbnQgb2YgZGF0YSAqLwotICAgICAgc2tpcF9zcGFjZXMoICZjdXIsIGxpbWl0ICk7Ci0gICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCAqY3VyID09IGVuZGVyICkKLSAgICAgIHsKLSAgICAgICAgY3VyKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBvbGRfY3VyID0gY3VyOwotCi0gICAgICBpZiAoIGNvb3JkcyAmJiBjb3VudCA+PSBtYXhfY29vcmRzICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNhbGwgUFNfQ29udl9Ub0ZpeGVkKCkgZXZlbiBpZiBjb29yZHMgPT0gTlVMTCAqLwotICAgICAgLyogdG8gcHJvcGVybHkgcGFyc2UgbnVtYmVyIGF0IGBjdXInICAgICAgICAgICAgICovCi0gICAgICAqKCBjb29yZHMgPyAmY29vcmRzW2NvdW50XSA6ICZkdW1teSApID0KLSAgICAgICAgKEZUX1Nob3J0KSggUFNfQ29udl9Ub0ZpeGVkKCAmY3VyLCBsaW1pdCwgMCApID4+IDE2ICk7Ci0KLSAgICAgIGlmICggb2xkX2N1ciA9PSBjdXIgKQotICAgICAgewotICAgICAgICBjb3VudCA9IC0xOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGNvdW50Kys7Ci0KLSAgICAgIGlmICggIWVuZGVyICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKmFjdXIgPSBjdXI7Ci0gICAgcmV0dXJuIGNvdW50OwotICB9Ci0KLQotICAvKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGRlbGltaXRlciBvciBhIHBhcnQgb2YgYSBudW1iZXIgKi8KLSAgLyogTkI6IGB2YWx1ZXMnIGNhbiBiZSBOVUxMIGlmIHdlIGp1c3Qgd2FudCB0byBza2lwIHRoZSAgICAgICovCi0gIC8qICAgICBhcnJheTsgaW4gdGhpcyBjYXNlIHdlIGlnbm9yZSBgbWF4X3ZhbHVlcycgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogcmV0dXJuIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgcGFyc2VkIHZhbHVlcyAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0ludAotICBwc190b2ZpeGVkYXJyYXkoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIHBvd2VyX3RlbiApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyICAgPSAqYWN1cjsKLSAgICBGVF9JbnQgICAgY291bnQgPSAwOwotICAgIEZUX0J5dGUgICBjLCBlbmRlcjsKLQotCi0gICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYW4gYXJyYXkuICBPdGhlcndpc2UsIG9ubHkgb25lIG51bWJlciAqLwotICAgIC8qIHdpbGwgYmUgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBjICAgICA9ICpjdXI7Ci0gICAgZW5kZXIgPSAwOwotCi0gICAgaWYgKCBjID09ICdbJyApCi0gICAgICBlbmRlciA9ICddJzsKLSAgICBlbHNlIGlmICggYyA9PSAneycgKQotICAgICAgZW5kZXIgPSAnfSc7Ci0KLSAgICBpZiAoIGVuZGVyICkKLSAgICAgIGN1cisrOwotCi0gICAgLyogbm93LCByZWFkIHRoZSB2YWx1ZXMgKi8KLSAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgZHVtbXk7Ci0gICAgICBGVF9CeXRlKiAgb2xkX2N1cjsKLQotCi0gICAgICAvKiBza2lwIHdoaXRlc3BhY2UgaW4gZnJvbnQgb2YgZGF0YSAqLwotICAgICAgc2tpcF9zcGFjZXMoICZjdXIsIGxpbWl0ICk7Ci0gICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCAqY3VyID09IGVuZGVyICkKLSAgICAgIHsKLSAgICAgICAgY3VyKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBvbGRfY3VyID0gY3VyOwotCi0gICAgICBpZiAoIHZhbHVlcyAmJiBjb3VudCA+PSBtYXhfdmFsdWVzICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNhbGwgUFNfQ29udl9Ub0ZpeGVkKCkgZXZlbiBpZiBjb29yZHMgPT0gTlVMTCAqLwotICAgICAgLyogdG8gcHJvcGVybHkgcGFyc2UgbnVtYmVyIGF0IGBjdXInICAgICAgICAgICAgICovCi0gICAgICAqKCB2YWx1ZXMgPyAmdmFsdWVzW2NvdW50XSA6ICZkdW1teSApID0KLSAgICAgICAgUFNfQ29udl9Ub0ZpeGVkKCAmY3VyLCBsaW1pdCwgcG93ZXJfdGVuICk7Ci0KLSAgICAgIGlmICggb2xkX2N1ciA9PSBjdXIgKQotICAgICAgewotICAgICAgICBjb3VudCA9IC0xOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGNvdW50Kys7Ci0KLSAgICAgIGlmICggIWVuZGVyICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKmFjdXIgPSBjdXI7Ci0gICAgcmV0dXJuIGNvdW50OwotICB9Ci0KLQotI2lmIDAKLQotICBzdGF0aWMgRlRfU3RyaW5nKgotICBwc190b3N0cmluZyggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfQnl0ZSogICAgY3VyID0gKmN1cnNvcjsKLSAgICBGVF9VSW50ICAgICBsZW4gPSAwOwotICAgIEZUX0ludCAgICAgIGNvdW50OwotICAgIEZUX1N0cmluZyogIHJlc3VsdDsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgLyogWFhYOiBzb21lIHN0dXBpZCBmb250cyBoYXZlIGEgYE5vdGljZScgb3IgYENvcHlyaWdodCcgc3RyaW5nICAgICAqLwotICAgIC8qICAgICAgdGhhdCBzaW1wbHkgZG9lc24ndCBiZWdpbiB3aXRoIGFuIG9wZW5pbmcgcGFyZW50aGVzaXMsIGV2ZW4gKi8KLSAgICAvKiAgICAgIHRob3VnaCB0aGV5IGhhdmUgYSBjbG9zaW5nIG9uZSEgIEUuZy4gImFtdW5jaWFsLnBmYiIgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgV2UgbXVzdCBkZWFsIHdpdGggdGhlc2UgaWxsLWZhdGVkIGNhc2VzIHRoZXJlLiAgTm90ZSB0aGF0ICAgKi8KLSAgICAvKiAgICAgIHRoZXNlIGZvbnRzIGRpZG4ndCB3b3JrIHdpdGggdGhlIG9sZCBUeXBlIDEgZHJpdmVyIGFzIHRoZSAgICovCi0gICAgLyogICAgICBub3RpY2UvY29weXJpZ2h0IHdhcyBub3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHN0cmluZyB0b2tlbiAqLwotICAgIC8qICAgICAgYW5kIG1hZGUgdGhlIG9sZCB0b2tlbiBwYXJzZXIgY29tbWl0IGVycm9ycy4gICAgICAgICAgICAgICAgKi8KLQotICAgIHdoaWxlICggY3VyIDwgbGltaXQgJiYgKCAqY3VyID09ICcgJyB8fCAqY3VyID09ICdcdCcgKSApCi0gICAgICBjdXIrKzsKLSAgICBpZiAoIGN1ciArIDEgPj0gbGltaXQgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoICpjdXIgPT0gJygnICkKLSAgICAgIGN1cisrOyAgLyogc2tpcCB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcywgaWYgdGhlcmUgaXMgb25lICovCi0KLSAgICAqY3Vyc29yID0gY3VyOwotICAgIGNvdW50ICAgPSAwOwotCi0gICAgLyogdGhlbiwgY291bnQgaXRzIGxlbmd0aCAqLwotICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICB7Ci0gICAgICBpZiAoICpjdXIgPT0gJygnICkKLSAgICAgICAgY291bnQrKzsKLQotICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJyknICkKLSAgICAgIHsKLSAgICAgICAgY291bnQtLTsKLSAgICAgICAgaWYgKCBjb3VudCA8IDAgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGxlbiA9IChGVF9VSW50KSggY3VyIC0gKmN1cnNvciApOwotICAgIGlmICggY3VyID49IGxpbWl0IHx8IEZUX0FMTE9DKCByZXN1bHQsIGxlbiArIDEgKSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIG5vdyBjb3B5IHRoZSBzdHJpbmcgKi8KLSAgICBGVF9NRU1fQ09QWSggcmVzdWx0LCAqY3Vyc29yLCBsZW4gKTsKLSAgICByZXN1bHRbbGVuXSA9ICdcMCc7Ci0gICAgKmN1cnNvciA9IGN1cjsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotICBzdGF0aWMgaW50Ci0gIHBzX3RvYm9vbCggRlRfQnl0ZSogICphY3VyLAotICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1ciAgICA9ICphY3VyOwotICAgIEZUX0Jvb2wgICByZXN1bHQgPSAwOwotCi0KLSAgICAvKiByZXR1cm4gMSBpZiB3ZSBmaW5kIGB0cnVlJywgMCBvdGhlcndpc2UgKi8KLSAgICBpZiAoIGN1ciArIDMgPCBsaW1pdCAmJgotICAgICAgICAgY3VyWzBdID09ICd0JyAgICYmCi0gICAgICAgICBjdXJbMV0gPT0gJ3InICAgJiYKLSAgICAgICAgIGN1clsyXSA9PSAndScgICAmJgotICAgICAgICAgY3VyWzNdID09ICdlJyAgICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgY3VyICAgKz0gNTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGN1ciArIDQgPCBsaW1pdCAmJgotICAgICAgICAgICAgICBjdXJbMF0gPT0gJ2YnICAgJiYKLSAgICAgICAgICAgICAgY3VyWzFdID09ICdhJyAgICYmCi0gICAgICAgICAgICAgIGN1clsyXSA9PSAnbCcgICAmJgotICAgICAgICAgICAgICBjdXJbM10gPT0gJ3MnICAgJiYKLSAgICAgICAgICAgICAgY3VyWzRdID09ICdlJyAgICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAwOwotICAgICAgY3VyICAgKz0gNjsKLSAgICB9Ci0KLSAgICAqYWN1ciA9IGN1cjsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBsb2FkIGEgc2ltcGxlIGZpZWxkIChpLmUuIG5vbi10YWJsZSkgaW50byB0aGUgY3VycmVudCBsaXN0IG9mIG9iamVjdHMgKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcHNfcGFyc2VyX2xvYWRfZmllbGQoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMV9GaWVsZCAgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICAgb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICBwZmxhZ3MgKQotICB7Ci0gICAgVDFfVG9rZW5SZWMgICB0b2tlbjsKLSAgICBGVF9CeXRlKiAgICAgIGN1cjsKLSAgICBGVF9CeXRlKiAgICAgIGxpbWl0OwotICAgIEZUX1VJbnQgICAgICAgY291bnQ7Ci0gICAgRlRfVUludCAgICAgICBpZHg7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBUMV9GaWVsZFR5cGUgIHR5cGU7Ci0KLQotICAgIC8qIHRoaXMgYWxzbyBza2lwcyBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgICBwc19wYXJzZXJfdG9fdG9rZW4oIHBhcnNlciwgJnRva2VuICk7Ci0gICAgaWYgKCAhdG9rZW4udHlwZSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBjb3VudCA9IDE7Ci0gICAgaWR4ICAgPSAwOwotICAgIGN1ciAgID0gdG9rZW4uc3RhcnQ7Ci0gICAgbGltaXQgPSB0b2tlbi5saW1pdDsKLQotICAgIHR5cGUgPSBmaWVsZC0+dHlwZTsKLQotICAgIC8qIHdlIG11c3QgZGV0ZWN0IGFycmF5cyBpbiAvRm9udEJCb3ggKi8KLSAgICBpZiAoIHR5cGUgPT0gVDFfRklFTERfVFlQRV9CQk9YICkKLSAgICB7Ci0gICAgICBUMV9Ub2tlblJlYyAgdG9rZW4yOwotICAgICAgRlRfQnl0ZSogICAgIG9sZF9jdXIgICA9IHBhcnNlci0+Y3Vyc29yOwotICAgICAgRlRfQnl0ZSogICAgIG9sZF9saW1pdCA9IHBhcnNlci0+bGltaXQ7Ci0KLQotICAgICAgLyogZG9uJ3QgaW5jbHVkZSBkZWxpbWl0ZXJzICovCi0gICAgICBwYXJzZXItPmN1cnNvciA9IHRva2VuLnN0YXJ0ICsgMTsKLSAgICAgIHBhcnNlci0+bGltaXQgID0gdG9rZW4ubGltaXQgLSAxOwotCi0gICAgICBwc19wYXJzZXJfdG9fdG9rZW4oIHBhcnNlciwgJnRva2VuMiApOwotICAgICAgcGFyc2VyLT5jdXJzb3IgPSBvbGRfY3VyOwotICAgICAgcGFyc2VyLT5saW1pdCAgPSBvbGRfbGltaXQ7Ci0KLSAgICAgIGlmICggdG9rZW4yLnR5cGUgPT0gVDFfVE9LRU5fVFlQRV9BUlJBWSApCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSBUMV9GSUVMRF9UWVBFX01NX0JCT1g7Ci0gICAgICAgIGdvdG8gRmllbGRBcnJheTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIHRva2VuLnR5cGUgPT0gVDFfVE9LRU5fVFlQRV9BUlJBWSApCi0gICAgewotICAgICAgY291bnQgPSBtYXhfb2JqZWN0czsKLQotICAgIEZpZWxkQXJyYXk6Ci0gICAgICAvKiBpZiB0aGlzIGlzIGFuIGFycmF5IGFuZCB3ZSBoYXZlIG5vIGJsZW5kLCBhbiBlcnJvciBvY2N1cnMgKi8KLSAgICAgIGlmICggbWF4X29iamVjdHMgPT0gMCApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgaWR4ID0gMTsKLQotICAgICAgLyogZG9uJ3QgaW5jbHVkZSBkZWxpbWl0ZXJzICovCi0gICAgICBjdXIrKzsKLSAgICAgIGxpbWl0LS07Ci0gICAgfQotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGlkeCsrICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgICBxICAgICAgPSAoRlRfQnl0ZSopb2JqZWN0c1tpZHhdICsgZmllbGQtPm9mZnNldDsKLSAgICAgIEZUX0xvbmcgICAgIHZhbDsKLSAgICAgIEZUX1N0cmluZyogIHN0cmluZyA9IE5VTEw7Ci0KLQotICAgICAgc2tpcF9zcGFjZXMoICZjdXIsIGxpbWl0ICk7Ci0KLSAgICAgIHN3aXRjaCAoIHR5cGUgKQotICAgICAgewotICAgICAgY2FzZSBUMV9GSUVMRF9UWVBFX0JPT0w6Ci0gICAgICAgIHZhbCA9IHBzX3RvYm9vbCggJmN1ciwgbGltaXQgKTsKLSAgICAgICAgZ290byBTdG9yZV9JbnRlZ2VyOwotCi0gICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfRklYRUQ6Ci0gICAgICAgIHZhbCA9IFBTX0NvbnZfVG9GaXhlZCggJmN1ciwgbGltaXQsIDAgKTsKLSAgICAgICAgZ290byBTdG9yZV9JbnRlZ2VyOwotCi0gICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfRklYRURfMTAwMDoKLSAgICAgICAgdmFsID0gUFNfQ29udl9Ub0ZpeGVkKCAmY3VyLCBsaW1pdCwgMyApOwotICAgICAgICBnb3RvIFN0b3JlX0ludGVnZXI7Ci0KLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9JTlRFR0VSOgotICAgICAgICB2YWwgPSBQU19Db252X1RvSW50KCAmY3VyLCBsaW1pdCApOwotICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgICAgU3RvcmVfSW50ZWdlcjoKLSAgICAgICAgc3dpdGNoICggZmllbGQtPnNpemUgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgKDggLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgKihGVF9CeXRlKilxID0gKEZUX0J5dGUpdmFsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKDE2IC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICooRlRfVVNob3J0KilxID0gKEZUX1VTaG9ydCl2YWw7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoMzIgLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgKihGVF9VSW50MzIqKXEgPSAoRlRfVUludDMyKXZhbDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBmb3IgNjQtYml0IHN5c3RlbXMgKi8KLSAgICAgICAgICAqKEZUX0xvbmcqKXEgPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9TVFJJTkc6Ci0gICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfS0VZOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPm1lbW9yeTsKLSAgICAgICAgICBGVF9VSW50ICAgIGxlbiAgICA9IChGVF9VSW50KSggbGltaXQgLSBjdXIgKTsKLQotCi0gICAgICAgICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvKiB3ZSBhbGxvdyBib3RoIGEgc3RyaW5nIG9yIGEgbmFtZSAgICovCi0gICAgICAgICAgLyogZm9yIGNhc2VzIGxpa2UgL0ZvbnROYW1lIChmb28pIGRlZiAqLwotICAgICAgICAgIGlmICggdG9rZW4udHlwZSA9PSBUMV9UT0tFTl9UWVBFX0tFWSApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogZG9uJ3QgaW5jbHVkZSBsZWFkaW5nIGAvJyAqLwotICAgICAgICAgICAgbGVuLS07Ci0gICAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIHRva2VuLnR5cGUgPT0gVDFfVE9LRU5fVFlQRV9TVFJJTkcgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGRvbid0IGluY2x1ZGUgZGVsaW1pdGluZyBwYXJlbnRoZXNlcyAgICAqLwotICAgICAgICAgICAgLyogWFhYIHdlIGRvbid0IGhhbmRsZSA8PC4uLj4+IGhlcmUgICAgICAgICovCi0gICAgICAgICAgICAvKiBYWFggc2hvdWxkIHdlIGNvbnZlcnQgb2N0YWwgZXNjYXBlcz8gICAgKi8KLSAgICAgICAgICAgIC8qICAgICBpZiBzbywgd2hhdCBlbmNvZGluZyBzaG91bGQgd2UgdXNlPyAqLwotICAgICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgICBsZW4gLT0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInBzX3BhcnNlcl9sb2FkX2ZpZWxkOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiBleHBlY3RlZCBhIG5hbWUgb3Igc3RyaW5nXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICAgICIgYnV0IGZvdW5kIHRva2VuIG9mIHR5cGUgJWQgaW5zdGVhZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSApKTsKLSAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBmb3IgdGhpcyB0byB3b3JrIChGVF9TdHJpbmcqKilxIG11c3QgaGF2ZSBiZWVuICovCi0gICAgICAgICAgLyogaW5pdGlhbGl6ZWQgdG8gTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggKihGVF9TdHJpbmcqKilxICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTAoKCAicHNfcGFyc2VyX2xvYWRfZmllbGQ6IG92ZXJ3cml0aW5nIGZpZWxkICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmlkZW50ICkpOwotICAgICAgICAgICAgRlRfRlJFRSggKihGVF9TdHJpbmcqKilxICk7Ci0gICAgICAgICAgICAqKEZUX1N0cmluZyoqKXEgPSBOVUxMOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggRlRfQUxMT0MoIHN0cmluZywgbGVuICsgMSApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIEZUX01FTV9DT1BZKCBzdHJpbmcsIGN1ciwgbGVuICk7Ci0gICAgICAgICAgc3RyaW5nW2xlbl0gPSAwOwotCi0gICAgICAgICAgKihGVF9TdHJpbmcqKilxID0gc3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfQkJPWDoKLSAgICAgICAgewotICAgICAgICAgIEZUX0ZpeGVkICB0ZW1wWzRdOwotICAgICAgICAgIEZUX0JCb3gqICBiYm94ID0gKEZUX0JCb3gqKXE7Ci0gICAgICAgICAgRlRfSW50ICAgIHJlc3VsdDsKLQotCi0gICAgICAgICAgcmVzdWx0ID0gcHNfdG9maXhlZGFycmF5KCAmY3VyLCBsaW1pdCwgNCwgdGVtcCwgMCApOwotCi0gICAgICAgICAgaWYgKCByZXN1bHQgPCA0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJwc19wYXJzZXJfbG9hZF9maWVsZDoiCi0gICAgICAgICAgICAgICAgICAgICAgICIgZXhwZWN0ZWQgZm91ciBpbnRlZ2VycyBpbiBib3VuZGluZyBib3hcbiIgKSk7Ci0gICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYmJveC0+eE1pbiA9IEZUX1JvdW5kRml4KCB0ZW1wWzBdICk7Ci0gICAgICAgICAgYmJveC0+eU1pbiA9IEZUX1JvdW5kRml4KCB0ZW1wWzFdICk7Ci0gICAgICAgICAgYmJveC0+eE1heCA9IEZUX1JvdW5kRml4KCB0ZW1wWzJdICk7Ci0gICAgICAgICAgYmJveC0+eU1heCA9IEZUX1JvdW5kRml4KCB0ZW1wWzNdICk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9NTV9CQk9YOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPm1lbW9yeTsKLSAgICAgICAgICBGVF9GaXhlZCogIHRlbXAgICA9IE5VTEw7Ci0gICAgICAgICAgRlRfSW50ICAgICByZXN1bHQ7Ci0gICAgICAgICAgRlRfVUludCAgICBpOwotCi0KLSAgICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggdGVtcCwgbWF4X29iamVjdHMgKiA0ICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgZm9yICggaSA9IDA7IGkgPCA0OyBpKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHBzX3RvZml4ZWRhcnJheSggJmN1ciwgbGltaXQsIChGVF9JbnQpbWF4X29iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKyBpICogbWF4X29iamVjdHMsIDAgKTsKLSAgICAgICAgICAgIGlmICggcmVzdWx0IDwgMCB8fCAoRlRfVUludClyZXN1bHQgPCBtYXhfb2JqZWN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInBzX3BhcnNlcl9sb2FkX2ZpZWxkOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdGVkICVkIGludGVnZXIlcyBpbiB0aGUgJXMgc3ViYXJyYXlcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICIgb2YgL0ZvbnRCQm94IGluIHRoZSAvQmxlbmQgZGljdGlvbmFyeVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb2JqZWN0cywgbWF4X29iamVjdHMgPiAxID8gInMiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaSA9PSAwID8gImZpcnN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICggaSA9PSAxID8gInNlY29uZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICggaSA9PSAyID8gInRoaXJkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiZm91cnRoIiApICkgKSk7Ci0gICAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgICAgICAgICAgICBGVF9GUkVFKCB0ZW1wICk7Ci0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2tpcF9zcGFjZXMoICZjdXIsIGxpbWl0ICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtYXhfb2JqZWN0czsgaSsrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9CQm94KiAgYmJveCA9IChGVF9CQm94KilvYmplY3RzW2ldOwotCi0KLSAgICAgICAgICAgIGJib3gtPnhNaW4gPSBGVF9Sb3VuZEZpeCggdGVtcFtpICAgICAgICAgICAgICAgICAgXSApOwotICAgICAgICAgICAgYmJveC0+eU1pbiA9IEZUX1JvdW5kRml4KCB0ZW1wW2kgKyAgICAgbWF4X29iamVjdHNdICk7Ci0gICAgICAgICAgICBiYm94LT54TWF4ID0gRlRfUm91bmRGaXgoIHRlbXBbaSArIDIgKiBtYXhfb2JqZWN0c10gKTsKLSAgICAgICAgICAgIGJib3gtPnlNYXggPSBGVF9Sb3VuZEZpeCggdGVtcFtpICsgMyAqIG1heF9vYmplY3RzXSApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIEZUX0ZSRUUoIHRlbXAgKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLyogYW4gZXJyb3Igb2NjdXJyZWQgKi8KLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotI2lmIDAgIC8qIG9ic29sZXRlIC0tIGtlZXAgZm9yIHJlZmVyZW5jZSAqLwotICAgIGlmICggcGZsYWdzICkKLSAgICAgICpwZmxhZ3MgfD0gMUwgPDwgZmllbGQtPmZsYWdfYml0OwotI2Vsc2UKLSAgICBGVF9VTlVTRUQoIHBmbGFncyApOwotI2VuZGlmCi0KLSAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0jZGVmaW5lIFQxX01BWF9UQUJMRV9FTEVNRU5UUyAgMzIKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwc19wYXJzZXJfbG9hZF9maWVsZF90YWJsZSggUFNfUGFyc2VyICAgICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIG1heF9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApCi0gIHsKLSAgICBUMV9Ub2tlblJlYyAgZWxlbWVudHNbVDFfTUFYX1RBQkxFX0VMRU1FTlRTXTsKLSAgICBUMV9Ub2tlbiAgICAgdG9rZW47Ci0gICAgRlRfSW50ICAgICAgIG51bV9lbGVtZW50czsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfQnl0ZSogICAgIG9sZF9jdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgIG9sZF9saW1pdDsKLSAgICBUMV9GaWVsZFJlYyAgZmllbGRyZWMgPSAqKFQxX0ZpZWxkKWZpZWxkOwotCi0KLSAgICBmaWVsZHJlYy50eXBlID0gVDFfRklFTERfVFlQRV9JTlRFR0VSOwotICAgIGlmICggZmllbGQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSB8fAotICAgICAgICAgZmllbGQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9CQk9YICAgICAgICApCi0gICAgICBmaWVsZHJlYy50eXBlID0gVDFfRklFTERfVFlQRV9GSVhFRDsKLQotICAgIHBzX3BhcnNlcl90b190b2tlbl9hcnJheSggcGFyc2VyLCBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX01BWF9UQUJMRV9FTEVNRU5UUywgJm51bV9lbGVtZW50cyApOwotICAgIGlmICggbnVtX2VsZW1lbnRzIDwgMCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FUlIoIElnbm9yZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBpZiAoIChGVF9VSW50KW51bV9lbGVtZW50cyA+IGZpZWxkLT5hcnJheV9tYXggKQotICAgICAgbnVtX2VsZW1lbnRzID0gKEZUX0ludClmaWVsZC0+YXJyYXlfbWF4OwotCi0gICAgb2xkX2N1cnNvciA9IHBhcnNlci0+Y3Vyc29yOwotICAgIG9sZF9saW1pdCAgPSBwYXJzZXItPmxpbWl0OwotCi0gICAgLyogd2Ugc3RvcmUgdGhlIGVsZW1lbnRzIGNvdW50IGlmIG5lY2Vzc2FyeTsgICAgICAgICAgICovCi0gICAgLyogd2UgZnVydGhlciBhc3N1bWUgdGhhdCBgY291bnRfb2Zmc2V0JyBjYW4ndCBiZSB6ZXJvICovCi0gICAgaWYgKCBmaWVsZC0+dHlwZSAhPSBUMV9GSUVMRF9UWVBFX0JCT1ggJiYgZmllbGQtPmNvdW50X29mZnNldCAhPSAwICkKLSAgICAgICooRlRfQnl0ZSopKCAoRlRfQnl0ZSopb2JqZWN0c1swXSArIGZpZWxkLT5jb3VudF9vZmZzZXQgKSA9Ci0gICAgICAgIChGVF9CeXRlKW51bV9lbGVtZW50czsKLQotICAgIC8qIHdlIG5vdyBsb2FkIGVhY2ggZWxlbWVudCwgYWRqdXN0aW5nIHRoZSBmaWVsZC5vZmZzZXQgb24gZWFjaCBvbmUgKi8KLSAgICB0b2tlbiA9IGVsZW1lbnRzOwotICAgIGZvciAoIDsgbnVtX2VsZW1lbnRzID4gMDsgbnVtX2VsZW1lbnRzLS0sIHRva2VuKysgKQotICAgIHsKLSAgICAgIHBhcnNlci0+Y3Vyc29yID0gdG9rZW4tPnN0YXJ0OwotICAgICAgcGFyc2VyLT5saW1pdCAgPSB0b2tlbi0+bGltaXQ7Ci0KLSAgICAgIGVycm9yID0gcHNfcGFyc2VyX2xvYWRfZmllbGQoIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLQotICAgICAgZmllbGRyZWMub2Zmc2V0ICs9IGZpZWxkcmVjLnNpemU7Ci0gICAgfQotCi0jaWYgMCAgLyogb2Jzb2xldGUgLS0ga2VlcCBmb3IgcmVmZXJlbmNlICovCi0gICAgaWYgKCBwZmxhZ3MgKQotICAgICAgKnBmbGFncyB8PSAxTCA8PCBmaWVsZC0+ZmxhZ19iaXQ7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggcGZsYWdzICk7Ci0jZW5kaWYKLQotICAgIHBhcnNlci0+Y3Vyc29yID0gb2xkX2N1cnNvcjsKLSAgICBwYXJzZXItPmxpbWl0ICA9IG9sZF9saW1pdDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Mb25nICkKLSAgcHNfcGFyc2VyX3RvX2ludCggUFNfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBwYXJzZXIgKTsKLSAgICByZXR1cm4gUFNfQ29udl9Ub0ludCggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0ICk7Ci0gIH0KLQotCi0gIC8qIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGA8JyBpZiBgZGVsaW1pdGVycycgaXMgbm9uLXplcm8gKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcHNfcGFyc2VyX3RvX2J5dGVzKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCAgbWF4X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgcG51bV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGRlbGltaXRlcnMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUqICBjdXI7Ci0KLQotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0gICAgY3VyID0gcGFyc2VyLT5jdXJzb3I7Ci0KLSAgICBpZiAoIGN1ciA+PSBwYXJzZXItPmxpbWl0ICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggZGVsaW1pdGVycyApCi0gICAgewotICAgICAgaWYgKCAqY3VyICE9ICc8JyApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX3BhcnNlcl90b19ieXRlczogTWlzc2luZyBzdGFydGluZyBkZWxpbWl0ZXIgYDwnXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgY3VyKys7Ci0gICAgfQotCi0gICAgKnBudW1fYnl0ZXMgPSBQU19Db252X0FTQ0lJSGV4RGVjb2RlKCAmY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2J5dGVzICk7Ci0KLSAgICBpZiAoIGRlbGltaXRlcnMgKQotICAgIHsKLSAgICAgIGlmICggY3VyIDwgcGFyc2VyLT5saW1pdCAmJiAqY3VyICE9ICc+JyApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX3BhcnNlcl90b19ieXRlczogTWlzc2luZyBjbG9zaW5nIGRlbGltaXRlciBgPidcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBjdXIrKzsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmN1cnNvciA9IGN1cjsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9GaXhlZCApCi0gIHBzX3BhcnNlcl90b19maXhlZCggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKQotICB7Ci0gICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBwYXJzZXIgKTsKLSAgICByZXR1cm4gUFNfQ29udl9Ub0ZpeGVkKCAmcGFyc2VyLT5jdXJzb3IsIHBhcnNlci0+bGltaXQsIHBvd2VyX3RlbiApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCi0gIHBzX3BhcnNlcl90b19jb29yZF9hcnJheSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgY29vcmRzICkKLSAgewotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0gICAgcmV0dXJuIHBzX3RvY29vcmRhcnJheSggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb29yZHMsIGNvb3JkcyApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCi0gIHBzX3BhcnNlcl90b19maXhlZF9hcnJheSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICkKLSAgewotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0gICAgcmV0dXJuIHBzX3RvZml4ZWRhcnJheSggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWx1ZXMsIHZhbHVlcywgcG93ZXJfdGVuICk7Ci0gIH0KLQotCi0jaWYgMAotCi0gIEZUX0xPQ0FMX0RFRiggRlRfU3RyaW5nKiApCi0gIFQxX1RvU3RyaW5nKCBQU19QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICByZXR1cm4gcHNfdG9zdHJpbmcoICZwYXJzZXItPmN1cnNvciwgcGFyc2VyLT5saW1pdCwgcGFyc2VyLT5tZW1vcnkgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgVDFfVG9Cb29sKCBQU19QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICByZXR1cm4gcHNfdG9ib29sKCAmcGFyc2VyLT5jdXJzb3IsIHBhcnNlci0+bGltaXQgKTsKLSAgfQotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNfcGFyc2VyX2luaXQoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBiYXNlLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIHBhcnNlci0+ZXJyb3IgID0gRlRfRXJyX09rOwotICAgIHBhcnNlci0+YmFzZSAgID0gYmFzZTsKLSAgICBwYXJzZXItPmxpbWl0ICA9IGxpbWl0OwotICAgIHBhcnNlci0+Y3Vyc29yID0gYmFzZTsKLSAgICBwYXJzZXItPm1lbW9yeSA9IG1lbW9yeTsKLSAgICBwYXJzZXItPmZ1bmNzICA9IHBzX3BhcnNlcl9mdW5jczsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNfcGFyc2VyX2RvbmUoIFBTX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIEZUX1VOVVNFRCggcGFyc2VyICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMSBCVUlMREVSICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHQxX2J1aWxkZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1aWxkZXIgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGluaXRpYWxpemUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICA6OiBUaGUgY3VycmVudCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgIDo6IFRoZSBjdXJyZW50IGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRpbmcgOjogV2hldGhlciBoaW50aW5nIHNob3VsZCBiZSBhcHBsaWVkLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdDFfYnVpbGRlcl9pbml0KCBUMV9CdWlsZGVyICAgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgaGludGluZyApCi0gIHsKLSAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX1N0YXJ0OwotICAgIGJ1aWxkZXItPmxvYWRfcG9pbnRzID0gMTsKLQotICAgIGJ1aWxkZXItPmZhY2UgICA9IGZhY2U7Ci0gICAgYnVpbGRlci0+Z2x5cGggID0gZ2x5cGg7Ci0gICAgYnVpbGRlci0+bWVtb3J5ID0gZmFjZS0+bWVtb3J5OwotCi0gICAgaWYgKCBnbHlwaCApCi0gICAgewotICAgICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlciA9IGdseXBoLT5pbnRlcm5hbC0+bG9hZGVyOwotCi0KLSAgICAgIGJ1aWxkZXItPmxvYWRlciAgPSBsb2FkZXI7Ci0gICAgICBidWlsZGVyLT5iYXNlICAgID0gJmxvYWRlci0+YmFzZS5vdXRsaW5lOwotICAgICAgYnVpbGRlci0+Y3VycmVudCA9ICZsb2FkZXItPmN1cnJlbnQub3V0bGluZTsKLSAgICAgIEZUX0dseXBoTG9hZGVyX1Jld2luZCggbG9hZGVyICk7Ci0KLSAgICAgIGJ1aWxkZXItPmhpbnRzX2dsb2JhbHMgPSBzaXplLT5pbnRlcm5hbC0+bW9kdWxlX2RhdGE7Ci0gICAgICBidWlsZGVyLT5oaW50c19mdW5jcyAgID0gTlVMTDsKLQotICAgICAgaWYgKCBoaW50aW5nICkKLSAgICAgICAgYnVpbGRlci0+aGludHNfZnVuY3MgPSBnbHlwaC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzOwotICAgIH0KLQotICAgIGJ1aWxkZXItPnBvc194ID0gMDsKLSAgICBidWlsZGVyLT5wb3NfeSA9IDA7Ci0KLSAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCA9IDA7Ci0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnkgPSAwOwotICAgIGJ1aWxkZXItPmFkdmFuY2UueCAgICAgID0gMDsKLSAgICBidWlsZGVyLT5hZHZhbmNlLnkgICAgICA9IDA7Ci0KLSAgICBidWlsZGVyLT5mdW5jcyA9IHQxX2J1aWxkZXJfZnVuY3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHQxX2J1aWxkZXJfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIGdseXBoIGJ1aWxkZXIuICBJdHMgY29udGVudHMgY2FuIHN0aWxsIGJlIHVzZWQgICAqLwotICAvKiAgICBhZnRlciB0aGUgY2FsbCwgYnV0IHRoZSBmdW5jdGlvbiBzYXZlcyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gICAgICAgKi8KLSAgLyogICAgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVpbGRlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gZmluYWxpemUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0MV9idWlsZGVyX2RvbmUoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhTbG90ICBnbHlwaCA9IGJ1aWxkZXItPmdseXBoOwotCi0KLSAgICBpZiAoIGdseXBoICkKLSAgICAgIGdseXBoLT5vdXRsaW5lID0gKmJ1aWxkZXItPmJhc2U7Ci0gIH0KLQotCi0gIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciBgY291bnQnIG1vcmUgcG9pbnRzICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX2NoZWNrX3BvaW50cyggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGNvdW50ICkKLSAgewotICAgIHJldHVybiBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGJ1aWxkZXItPmxvYWRlciwgY291bnQsIDAgKTsKLSAgfQotCi0KLSAgLyogYWRkIGEgbmV3IHBvaW50LCBkbyBub3QgY2hlY2sgc3BhY2UgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgIGZsYWcgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSBidWlsZGVyLT5jdXJyZW50OwotCi0KLSAgICBpZiAoIGJ1aWxkZXItPmxvYWRfcG9pbnRzICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICBwb2ludCAgID0gb3V0bGluZS0+cG9pbnRzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0gICAgICBGVF9CeXRlKiAgICBjb250cm9sID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3MgKyBvdXRsaW5lLT5uX3BvaW50czsKLQotCi0gICAgICBwb2ludC0+eCA9IEZJWEVEX1RPX0lOVCggeCApOwotICAgICAgcG9pbnQtPnkgPSBGSVhFRF9UT19JTlQoIHkgKTsKLSAgICAgICpjb250cm9sID0gKEZUX0J5dGUpKCBmbGFnID8gRlRfQ1VSVkVfVEFHX09OIDogRlRfQ1VSVkVfVEFHX0NVQklDICk7Ci0gICAgfQotICAgIG91dGxpbmUtPm5fcG9pbnRzKys7Ci0gIH0KLQotCi0gIC8qIGNoZWNrIHNwYWNlIGZvciBhIG5ldyBvbi1jdXJ2ZSBwb2ludCwgdGhlbiBhZGQgaXQgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHQxX2J1aWxkZXJfYWRkX3BvaW50MSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IHQxX2J1aWxkZXJfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAxICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2hlY2sgc3BhY2UgZm9yIGEgbmV3IGNvbnRvdXIsIHRoZW4gYWRkIGl0ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX2FkZF9jb250b3VyKCBUMV9CdWlsZGVyICBidWlsZGVyICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0KLQotICAgIC8qIHRoaXMgbWlnaHQgaGFwcGVuIGluIGludmFsaWQgZm9udHMgKi8KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ0MV9idWlsZGVyX2FkZF9jb250b3VyOiBubyBvdXRsaW5lIHRvIGFkZCBwb2ludHMgdG9cbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFidWlsZGVyLT5sb2FkX3BvaW50cyApCi0gICAgewotICAgICAgb3V0bGluZS0+bl9jb250b3VycysrOwotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggYnVpbGRlci0+bG9hZGVyLCAwLCAxICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyA+IDAgKQotICAgICAgICBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV0gPQotICAgICAgICAgIChzaG9ydCkoIG91dGxpbmUtPm5fcG9pbnRzIC0gMSApOwotCi0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBpZiBhIHBhdGggd2FzIGJlZ3VuLCBhZGQgaXRzIGZpcnN0IG9uLWN1cnZlIHBvaW50ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX3N0YXJ0X3BvaW50KCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0KLSAgICAvKiB0ZXN0IHdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIGEgbmV3IGNvbnRvdXIgKi8KLQotICAgIGlmICggYnVpbGRlci0+cGFyc2Vfc3RhdGUgPT0gVDFfUGFyc2VfSGF2ZV9QYXRoICkKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX0hhdmVfUGF0aDsKLSAgICAgIGVycm9yID0gdDFfYnVpbGRlcl9hZGRfY29udG91ciggYnVpbGRlciApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHQxX2J1aWxkZXJfYWRkX3BvaW50MSggYnVpbGRlciwgeCwgeSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2xvc2UgdGhlIGN1cnJlbnQgY29udG91ciAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0MV9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSBidWlsZGVyLT5jdXJyZW50OwotICAgIEZUX0ludCAgICAgICBmaXJzdDsKLQotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBmaXJzdCA9IG91dGxpbmUtPm5fY29udG91cnMgPD0gMQotICAgICAgICAgICAgPyAwIDogb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDJdICsgMTsKLQotICAgIC8qIGluIG1hbGZvcm1lZCBmb250cyBpdCBjYW4gaGFwcGVuIHRoYXQgYSBjb250b3VyIHdhcyBzdGFydGVkICovCi0gICAgLyogYnV0IG5vIHBvaW50cyB3ZXJlIGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIG91dGxpbmUtPm5fY29udG91cnMgJiYgZmlyc3QgPT0gb3V0bGluZS0+bl9wb2ludHMgKQotICAgIHsKLSAgICAgIG91dGxpbmUtPm5fY29udG91cnMtLTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBXZSBtdXN0IG5vdCBpbmNsdWRlIHRoZSBsYXN0IHBvaW50IGluIHRoZSBwYXRoIGlmIGl0ICovCi0gICAgLyogaXMgbG9jYXRlZCBvbiB0aGUgZmlyc3QgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPiAxICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICBwMSAgICAgID0gb3V0bGluZS0+cG9pbnRzICsgZmlyc3Q7Ci0gICAgICBGVF9WZWN0b3IqICBwMiAgICAgID0gb3V0bGluZS0+cG9pbnRzICsgb3V0bGluZS0+bl9wb2ludHMgLSAxOwotICAgICAgRlRfQnl0ZSogICAgY29udHJvbCA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHMgLSAxOwotCi0KLSAgICAgIC8qIGBkZWxldGUnIGxhc3QgcG9pbnQgb25seSBpZiBpdCBjb2luY2lkZXMgd2l0aCB0aGUgZmlyc3QgKi8KLSAgICAgIC8qIHBvaW50IGFuZCBpdCBpcyBub3QgYSBjb250cm9sIHBvaW50ICh3aGljaCBjYW4gaGFwcGVuKS4gKi8KLSAgICAgIGlmICggcDEtPnggPT0gcDItPnggJiYgcDEtPnkgPT0gcDItPnkgKQotICAgICAgICBpZiAoICpjb250cm9sID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgb3V0bGluZS0+bl9wb2ludHMtLTsKLSAgICB9Ci0KLSAgICBpZiAoIG91dGxpbmUtPm5fY29udG91cnMgPiAwICkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBhZGQgY29udG91cnMgb25seSBjb25zaXN0aW5nIG9mIG9uZSBwb2ludCwgaS5lLiwgICovCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgcG9pbnQgaXMgdGhlIHNhbWUuICovCi0gICAgICBpZiAoIGZpcnN0ID09IG91dGxpbmUtPm5fcG9pbnRzIC0gMSApCi0gICAgICB7Ci0gICAgICAgIG91dGxpbmUtPm5fY29udG91cnMtLTsKLSAgICAgICAgb3V0bGluZS0+bl9wb2ludHMtLTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDFdID0KLSAgICAgICAgICAoc2hvcnQpKCBvdXRsaW5lLT5uX3BvaW50cyAtIDEgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHQxX2RlY3J5cHQoIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICBGVF9PZmZzZXQgIGxlbmd0aCwKLSAgICAgICAgICAgICAgRlRfVVNob3J0ICBzZWVkICkKLSAgewotICAgIFBTX0NvbnZfRWV4ZWNEZWNvZGUoICZidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWQgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3Bzb2Jqcy5oIGIvc3JjL3BzYXV4L3Bzb2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDJlNWIyLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC9wc29ianMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc29ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgUG9zdFNjcmlwdCBmb250cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgUFNPQkpTX0hfCi0jZGVmaW5lIFBTT0JKU19IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRQotICBjb25zdCBQU19UYWJsZV9GdW5jc1JlYyAgICBwc190YWJsZV9mdW5jczsKLQotICBGVF9DQUxMQkFDS19UQUJMRQotICBjb25zdCBQU19QYXJzZXJfRnVuY3NSZWMgICBwc19wYXJzZXJfZnVuY3M7Ci0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUKLSAgY29uc3QgVDFfQnVpbGRlcl9GdW5jc1JlYyAgdDFfYnVpbGRlcl9mdW5jczsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBzX3RhYmxlX25ldyggUFNfVGFibGUgICB0YWJsZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAotICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcHNfdGFibGVfYWRkKCBQU19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgRlRfSW50ICAgIGlkeCwKLSAgICAgICAgICAgICAgICB2b2lkKiAgICAgb2JqZWN0LAotICAgICAgICAgICAgICAgIEZUX1VJbnQgICBsZW5ndGggKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX3RhYmxlX2RvbmUoIFBTX1RhYmxlICB0YWJsZSApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc190YWJsZV9yZWxlYXNlKCBQU19UYWJsZSAgdGFibGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMSBQQVJTRVIgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIFBTX1BhcnNlciAgcGFyc2VyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19wYXJzZXJfc2tpcF9QU190b2tlbiggUFNfUGFyc2VyICBwYXJzZXIgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX3BhcnNlcl90b190b2tlbiggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgVDFfVG9rZW4gICB0b2tlbiApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfcGFyc2VyX3RvX3Rva2VuX2FycmF5KCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Ub2tlbiAgIHRva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG1heF90b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgICBwbnVtX3Rva2VucyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBzX3BhcnNlcl9sb2FkX2ZpZWxkKCBQU19QYXJzZXIgICAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqICAgICAgICAgIG9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbWF4X29iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcHNfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMV9GaWVsZCAgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICAgb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICBwZmxhZ3MgKTsKLQotICBGVF9MT0NBTCggRlRfTG9uZyApCi0gIHBzX3BhcnNlcl90b19pbnQoIFBTX1BhcnNlciAgcGFyc2VyICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwc19wYXJzZXJfdG9fYnl0ZXMoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBtYXhfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBwbnVtX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgZGVsaW1pdGVycyApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0ZpeGVkICkKLSAgcHNfcGFyc2VyX3RvX2ZpeGVkKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIHBvd2VyX3RlbiApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0ludCApCi0gIHBzX3BhcnNlcl90b19jb29yZF9hcnJheSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgY29vcmRzICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0ludCApCi0gIHBzX3BhcnNlcl90b19maXhlZF9hcnJheSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX3BhcnNlcl9pbml0KCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfcGFyc2VyX2RvbmUoIFBTX1BhcnNlciAgcGFyc2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgQlVJTERFUiAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQxX2J1aWxkZXJfaW5pdCggVDFfQnVpbGRlciAgICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgIGhpbnRpbmcgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQxX2J1aWxkZXJfZG9uZSggVDFfQnVpbGRlciAgYnVpbGRlciApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHQxX2J1aWxkZXJfY2hlY2tfcG9pbnRzKCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgY291bnQgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlICAgICBmbGFnICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdDFfYnVpbGRlcl9hZGRfcG9pbnQxKCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHQxX2J1aWxkZXJfYWRkX2NvbnRvdXIoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHQxX2J1aWxkZXJfc3RhcnRfcG9pbnQoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHkgKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdDFfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQxX2RlY3J5cHQoIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICBGVF9PZmZzZXQgIGxlbmd0aCwKLSAgICAgICAgICAgICAgRlRfVVNob3J0ICBzZWVkICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogUFNPQkpTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcnVsZXMubWsgYi9zcmMvcHNhdXgvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmFlMTIuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFBTYXV4IGRyaXZlciBjb25maWd1cmF0aW9uIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIFBTQVVYIGRyaXZlciBkaXJlY3RvcnkKLSMKLVBTQVVYX0RJUiA6PSAkKFNSQ19ESVIpL3BzYXV4Ci0KLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotUFNBVVhfQ09NUElMRSA6PSAkKENDKSAkKEFOU0lGTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKFBTQVVYX0RJUikpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAkKEZUX0NGTEFHUykKLQotCi0jIFBTQVVYIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQotIwotUFNBVVhfRFJWX1NSQyA6PSAkKFBTQVVYX0RJUikvcHNvYmpzLmMgICBcCi0gICAgICAgICAgICAgICAgICQoUFNBVVhfRElSKS90MWRlY29kZS5jIFwKLSAgICAgICAgICAgICAgICAgJChQU0FVWF9ESVIpL3QxY21hcC5jICAgXAotICAgICAgICAgICAgICAgICAkKFBTQVVYX0RJUikvYWZtcGFyc2UuYyBcCi0gICAgICAgICAgICAgICAgICQoUFNBVVhfRElSKS9wc2NvbnYuYyAgIFwKLSAgICAgICAgICAgICAgICAgJChQU0FVWF9ESVIpL3BzYXV4bW9kLmMKLQotIyBQU0FVWCBkcml2ZXIgaGVhZGVycwotIwotUFNBVVhfRFJWX0ggOj0gJChQU0FVWF9EUlZfU1JDOiVjPSVoKSAgXAotICAgICAgICAgICAgICAgJChQU0FVWF9ESVIpL3BzYXV4ZXJyLmgKLQotCi0jIFBTQVVYIGRyaXZlciBvYmplY3QocykKLSMKLSMgICBQU0FVWF9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMuCi0jICAgUFNBVVhfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcy4KLSMKLVBTQVVYX0RSVl9PQkpfTSA6PSAkKFBTQVVYX0RSVl9TUkM6JChQU0FVWF9ESVIpLyUuYz0kKE9CSl9ESVIpLyUuJE8pCi1QU0FVWF9EUlZfT0JKX1MgOj0gJChPQkpfRElSKS9wc2F1eC4kTwotCi0jIFBTQVVYIGRyaXZlciBzb3VyY2UgZmlsZSBmb3Igc2luZ2xlIGJ1aWxkCi0jCi1QU0FVWF9EUlZfU1JDX1MgOj0gJChQU0FVWF9ESVIpL3BzYXV4LmMKLQotCi0jIFBTQVVYIGRyaXZlciAtIHNpbmdsZSBvYmplY3QKLSMKLSQoUFNBVVhfRFJWX09CSl9TKTogJChQU0FVWF9EUlZfU1JDX1MpICQoUFNBVVhfRFJWX1NSQykgXAotICAgICAgICAgICAgICAgICAgICQoRlJFRVRZUEVfSCkgJChQU0FVWF9EUlZfSCkKLQkkKFBTQVVYX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKFBTQVVYX0RSVl9TUkNfUykpCi0KLQotIyBQU0FVWCBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCi0jCi0kKE9CSl9ESVIpLyUuJE86ICQoUFNBVVhfRElSKS8lLmMgJChGUkVFVFlQRV9IKSAkKFBTQVVYX0RSVl9IKQotCSQoUFNBVVhfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQ8KQotCi0KLSMgdXBkYXRlIG1haW4gZHJpdmVyIG9iamVjdCBsaXN0cwotIwotRFJWX09CSlNfUyArPSAkKFBTQVVYX0RSVl9PQkpfUykKLURSVl9PQkpTX00gKz0gJChQU0FVWF9EUlZfT0JKX00pCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC90MWNtYXAuYyBiL3NyYy9wc2F1eC90MWNtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViNzEzZS4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvdDFjbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBjaGFyYWN0ZXIgbWFwIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAidDFjbWFwLmgiCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgInBzYXV4ZXJyLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgVFlQRTEgU1RBTkRBUkQgKEFORCBFWFBFUlQpIEVOQ09ESU5HIENNQVBTICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICB0MV9jbWFwX3N0ZF9pbml0KCBUMV9DTWFwU3RkICBjbWFwLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBpc19leHBlcnQgKQotICB7Ci0gICAgVDFfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFQxX0ZhY2UpRlRfQ01BUF9GQUNFKCBjbWFwICk7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gKEZUX1NlcnZpY2VfUHNDTWFwcylmYWNlLT5wc25hbWVzOwotCi0KLSAgICBjbWFwLT5udW1fZ2x5cGhzICAgID0gKEZUX1VJbnQpZmFjZS0+dHlwZTEubnVtX2dseXBoczsKLSAgICBjbWFwLT5nbHlwaF9uYW1lcyAgID0gKGNvbnN0IGNoYXIqIGNvbnN0KilmYWNlLT50eXBlMS5nbHlwaF9uYW1lczsKLSAgICBjbWFwLT5zaWRfdG9fc3RyaW5nID0gcHNuYW1lcy0+YWRvYmVfc3RkX3N0cmluZ3M7Ci0gICAgY21hcC0+Y29kZV90b19zaWQgICA9IGlzX2V4cGVydCA/IHBzbmFtZXMtPmFkb2JlX2V4cGVydF9lbmNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwc25hbWVzLT5hZG9iZV9zdGRfZW5jb2Rpbmc7Ci0KLSAgICBGVF9BU1NFUlQoIGNtYXAtPmNvZGVfdG9fc2lkICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHQxX2NtYXBfc3RkX2RvbmUoIFQxX0NNYXBTdGQgIGNtYXAgKQotICB7Ci0gICAgY21hcC0+bnVtX2dseXBocyAgICA9IDA7Ci0gICAgY21hcC0+Z2x5cGhfbmFtZXMgICA9IE5VTEw7Ci0gICAgY21hcC0+c2lkX3RvX3N0cmluZyA9IE5VTEw7Ci0gICAgY21hcC0+Y29kZV90b19zaWQgICA9IE5VTEw7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHQxX2NtYXBfc3RkX2NoYXJfaW5kZXgoIFQxX0NNYXBTdGQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoIGNoYXJfY29kZSA8IDI1NiApCi0gICAgewotICAgICAgRlRfVUludCAgICAgIGNvZGUsIG47Ci0gICAgICBjb25zdCBjaGFyKiAgZ2x5cGhfbmFtZTsKLQotCi0gICAgICAvKiBjb252ZXJ0IGNoYXJhY3RlciBjb2RlIHRvIEFkb2JlIFNJRCBzdHJpbmcgKi8KLSAgICAgIGNvZGUgICAgICAgPSBjbWFwLT5jb2RlX3RvX3NpZFtjaGFyX2NvZGVdOwotICAgICAgZ2x5cGhfbmFtZSA9IGNtYXAtPnNpZF90b19zdHJpbmcoIGNvZGUgKTsKLQotICAgICAgLyogbG9vayBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggbmFtZSAqLwotICAgICAgZm9yICggbiA9IDA7IG4gPCBjbWFwLT5udW1fZ2x5cGhzOyBuKysgKQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiBnbmFtZSA9IGNtYXAtPmdseXBoX25hbWVzW25dOwotCi0KLSAgICAgICAgaWYgKCBnbmFtZSAmJiBnbmFtZVswXSA9PSBnbHlwaF9uYW1lWzBdICAmJgotICAgICAgICAgICAgIGZ0X3N0cmNtcCggZ25hbWUsIGdseXBoX25hbWUgKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG47Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHQxX2NtYXBfc3RkX2NoYXJfbmV4dCggVDFfQ01hcFN0ZCAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludCAgICByZXN1bHQgICAgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGUgKyAxOwotCi0KLSAgICB3aGlsZSAoIGNoYXJfY29kZSA8IDI1NiApCi0gICAgewotICAgICAgcmVzdWx0ID0gdDFfY21hcF9zdGRfY2hhcl9pbmRleCggY21hcCwgY2hhcl9jb2RlICk7Ci0gICAgICBpZiAoIHJlc3VsdCAhPSAwICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjaGFyX2NvZGUrKzsKLSAgICB9Ci0gICAgY2hhcl9jb2RlID0gMDsKLQotICBFeGl0OgotICAgICpwY2hhcl9jb2RlID0gY2hhcl9jb2RlOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0MV9jbWFwX3N0YW5kYXJkX2luaXQoIFQxX0NNYXBTdGQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgcG9pbnRlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHBvaW50ZXIgKTsKLQotCi0gICAgdDFfY21hcF9zdGRfaW5pdCggY21hcCwgMCApOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX3N0YW5kYXJkX2NsYXNzX3JlYyA9Ci0gIHsKLSAgICBzaXplb2YgKCBUMV9DTWFwU3RkUmVjICksCi0KLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHQxX2NtYXBfc3RhbmRhcmRfaW5pdCwgICAvKiBpbml0ICAgICAgICovCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICB0MV9jbWFwX3N0ZF9kb25lLCAgICAgICAgLyogZG9uZSAgICAgICAqLwotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdDFfY21hcF9zdGRfY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHQxX2NtYXBfc3RkX2NoYXJfbmV4dCwgICAvKiBjaGFyX25leHQgICovCi0KLSAgICAoRlRfQ01hcF9DaGFyVmFySW5kZXhGdW5jKSAgICBOVUxMLCAgLyogY2hhcl92YXJfaW5kZXggICAqLwotICAgIChGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jKU5VTEwsICAvKiBjaGFyX3Zhcl9kZWZhdWx0ICovCi0gICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgTlVMTCwgIC8qIHZhcmlhbnRfbGlzdCAgICAgKi8KLSAgICAoRlRfQ01hcF9DaGFyVmFyaWFudExpc3RGdW5jKSBOVUxMLCAgLyogY2hhcnZhcmlhbnRfbGlzdCAqLwotICAgIChGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpIE5VTEwgICAvKiB2YXJpYW50Y2hhcl9saXN0ICovCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdDFfY21hcF9leHBlcnRfaW5pdCggVDFfQ01hcFN0ZCAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgcG9pbnRlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHBvaW50ZXIgKTsKLQotCi0gICAgdDFfY21hcF9zdGRfaW5pdCggY21hcCwgMSApOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF9leHBlcnRfY2xhc3NfcmVjID0KLSAgewotICAgIHNpemVvZiAoIFQxX0NNYXBTdGRSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdDFfY21hcF9leHBlcnRfaW5pdCwgICAgIC8qIGluaXQgICAgICAgKi8KLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIHQxX2NtYXBfc3RkX2RvbmUsICAgICAgICAvKiBkb25lICAgICAgICovCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0MV9jbWFwX3N0ZF9jaGFyX2luZGV4LCAgLyogY2hhcl9pbmRleCAqLwotICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdDFfY21hcF9zdGRfY2hhcl9uZXh0LCAgIC8qIGNoYXJfbmV4dCAgKi8KLQotICAgIChGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpICAgIE5VTEwsICAvKiBjaGFyX3Zhcl9pbmRleCAgICovCi0gICAgKEZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMpTlVMTCwgIC8qIGNoYXJfdmFyX2RlZmF1bHQgKi8KLSAgICAoRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMpICAgICBOVUxMLCAgLyogdmFyaWFudF9saXN0ICAgICAqLwotICAgIChGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMpIE5VTEwsICAvKiBjaGFydmFyaWFudF9saXN0ICovCi0gICAgKEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYykgTlVMTCAgIC8qIHZhcmlhbnRjaGFyX2xpc3QgKi8KLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgVFlQRTEgQ1VTVE9NIEVOQ09ESU5HIENNQVAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHQxX2NtYXBfY3VzdG9tX2luaXQoIFQxX0NNYXBDdXN0b20gIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgIHBvaW50ZXIgKQotICB7Ci0gICAgVDFfRmFjZSAgICAgIGZhY2UgICAgID0gKFQxX0ZhY2UpRlRfQ01BUF9GQUNFKCBjbWFwICk7Ci0gICAgVDFfRW5jb2RpbmcgIGVuY29kaW5nID0gJmZhY2UtPnR5cGUxLmVuY29kaW5nOwotCi0gICAgRlRfVU5VU0VEKCBwb2ludGVyICk7Ci0KLQotICAgIGNtYXAtPmZpcnN0ICAgPSAoRlRfVUludCllbmNvZGluZy0+Y29kZV9maXJzdDsKLSAgICBjbWFwLT5jb3VudCAgID0gKEZUX1VJbnQpZW5jb2RpbmctPmNvZGVfbGFzdCAtIGNtYXAtPmZpcnN0OwotICAgIGNtYXAtPmluZGljZXMgPSBlbmNvZGluZy0+Y2hhcl9pbmRleDsKLQotICAgIEZUX0FTU0VSVCggY21hcC0+aW5kaWNlcyApOwotICAgIEZUX0FTU0VSVCggZW5jb2RpbmctPmNvZGVfZmlyc3QgPD0gZW5jb2RpbmctPmNvZGVfbGFzdCApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHQxX2NtYXBfY3VzdG9tX2RvbmUoIFQxX0NNYXBDdXN0b20gIGNtYXAgKQotICB7Ci0gICAgY21hcC0+aW5kaWNlcyA9IE5VTEw7Ci0gICAgY21hcC0+Zmlyc3QgICA9IDA7Ci0gICAgY21hcC0+Y291bnQgICA9IDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHQxX2NtYXBfY3VzdG9tX2NoYXJfaW5kZXgoIFQxX0NNYXBDdXN0b20gIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICAgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggKCBjaGFyX2NvZGUgPj0gY21hcC0+Zmlyc3QgKSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIGNoYXJfY29kZSA8ICggY21hcC0+Zmlyc3QgKyBjbWFwLT5jb3VudCApICkgKQotICAgICAgcmVzdWx0ID0gY21hcC0+aW5kaWNlc1tjaGFyX2NvZGVdOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICB0MV9jbWFwX2N1c3RvbV9jaGFyX25leHQoIFQxX0NNYXBDdXN0b20gIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZTsKLQotCi0gICAgY2hhcl9jb2RlKys7Ci0KLSAgICBpZiAoIGNoYXJfY29kZSA8IGNtYXAtPmZpcnN0ICkKLSAgICAgIGNoYXJfY29kZSA9IGNtYXAtPmZpcnN0OwotCi0gICAgZm9yICggOyBjaGFyX2NvZGUgPCAoIGNtYXAtPmZpcnN0ICsgY21hcC0+Y291bnQgKTsgY2hhcl9jb2RlKysgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGNtYXAtPmluZGljZXNbY2hhcl9jb2RlXTsKLSAgICAgIGlmICggcmVzdWx0ICE9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgY2hhcl9jb2RlID0gMDsKLQotICBFeGl0OgotICAgICpwY2hhcl9jb2RlID0gY2hhcl9jb2RlOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiBjb25zdCBGVF9DTWFwX0NsYXNzUmVjCi0gIHQxX2NtYXBfY3VzdG9tX2NsYXNzX3JlYyA9Ci0gIHsKLSAgICBzaXplb2YgKCBUMV9DTWFwQ3VzdG9tUmVjICksCi0KLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHQxX2NtYXBfY3VzdG9tX2luaXQsICAgICAgICAvKiBpbml0ICAgICAgICovCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICB0MV9jbWFwX2N1c3RvbV9kb25lLCAgICAgICAgLyogZG9uZSAgICAgICAqLwotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdDFfY21hcF9jdXN0b21fY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHQxX2NtYXBfY3VzdG9tX2NoYXJfbmV4dCwgICAvKiBjaGFyX25leHQgICovCi0KLSAgICAoRlRfQ01hcF9DaGFyVmFySW5kZXhGdW5jKSAgICBOVUxMLCAgLyogY2hhcl92YXJfaW5kZXggICAqLwotICAgIChGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jKU5VTEwsICAvKiBjaGFyX3Zhcl9kZWZhdWx0ICovCi0gICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgTlVMTCwgIC8qIHZhcmlhbnRfbGlzdCAgICAgKi8KLSAgICAoRlRfQ01hcF9DaGFyVmFyaWFudExpc3RGdW5jKSBOVUxMLCAgLyogY2hhcnZhcmlhbnRfbGlzdCAqLwotICAgIChGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpIE5VTEwgICAvKiB2YXJpYW50Y2hhcl9saXN0ICovCi0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICBUWVBFMSBTWU5USEVUSUMgVU5JQ09ERSBFTkNPRElORyBDTUFQICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9DQUxMQkFDS19ERUYoIGNvbnN0IGNoYXIgKiApCi0gIHBzYXV4X2dldF9nbHlwaF9uYW1lKCBUMV9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgaWR4ICkKLSAgewotICAgIHJldHVybiBmYWNlLT50eXBlMS5nbHlwaF9uYW1lc1tpZHhdOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdDFfY21hcF91bmljb2RlX2luaXQoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBwb2ludGVyICkKLSAgewotICAgIFQxX0ZhY2UgICAgICAgICAgICAgZmFjZSAgICA9IChUMV9GYWNlKUZUX0NNQVBfRkFDRSggdW5pY29kZXMgKTsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSAgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpZmFjZS0+cHNuYW1lczsKLQotICAgIEZUX1VOVVNFRCggcG9pbnRlciApOwotCi0KLSAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfaW5pdCggbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpZmFjZS0+dHlwZTEubnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTX0dldEdseXBoTmFtZUZ1bmMpJnBzYXV4X2dldF9nbHlwaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFNfRnJlZUdseXBoTmFtZUZ1bmMpTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1BvaW50ZXIpZmFjZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICB0MV9jbWFwX3VuaWNvZGVfZG9uZSggUFNfVW5pY29kZXMgIHVuaWNvZGVzICkKLSAgewotICAgIEZUX0ZhY2UgICAgZmFjZSAgID0gRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotCi0gICAgRlRfRlJFRSggdW5pY29kZXMtPm1hcHMgKTsKLSAgICB1bmljb2Rlcy0+bnVtX21hcHMgPSAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0MV9jbWFwX3VuaWNvZGVfY2hhcl9pbmRleCggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgIGNoYXJfY29kZSApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgICAgICAgIGZhY2UgICAgPSAoVDFfRmFjZSlGVF9DTUFQX0ZBQ0UoIHVuaWNvZGVzICk7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gKEZUX1NlcnZpY2VfUHNDTWFwcylmYWNlLT5wc25hbWVzOwotCi0KLSAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfY2hhcl9pbmRleCggdW5pY29kZXMsIGNoYXJfY29kZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHQxX2NtYXBfdW5pY29kZV9jaGFyX25leHQoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgVDFfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFQxX0ZhY2UpRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpZmFjZS0+cHNuYW1lczsKLQotCi0gICAgcmV0dXJuIHBzbmFtZXMtPnVuaWNvZGVzX2NoYXJfbmV4dCggdW5pY29kZXMsIHBjaGFyX2NvZGUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF91bmljb2RlX2NsYXNzX3JlYyA9Ci0gIHsKLSAgICBzaXplb2YgKCBQU19Vbmljb2Rlc1JlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0MV9jbWFwX3VuaWNvZGVfaW5pdCwgICAgICAgIC8qIGluaXQgICAgICAgKi8KLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIHQxX2NtYXBfdW5pY29kZV9kb25lLCAgICAgICAgLyogZG9uZSAgICAgICAqLwotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdDFfY21hcF91bmljb2RlX2NoYXJfaW5kZXgsICAvKiBjaGFyX2luZGV4ICovCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0MV9jbWFwX3VuaWNvZGVfY2hhcl9uZXh0LCAgIC8qIGNoYXJfbmV4dCAgKi8KLQotICAgIChGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpICAgIE5VTEwsICAvKiBjaGFyX3Zhcl9pbmRleCAgICovCi0gICAgKEZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMpTlVMTCwgIC8qIGNoYXJfdmFyX2RlZmF1bHQgKi8KLSAgICAoRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMpICAgICBOVUxMLCAgLyogdmFyaWFudF9saXN0ICAgICAqLwotICAgIChGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMpIE5VTEwsICAvKiBjaGFydmFyaWFudF9saXN0ICovCi0gICAgKEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYykgTlVMTCAgIC8qIHZhcmlhbnRjaGFyX2xpc3QgKi8KLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC90MWNtYXAuaCBiL3NyYy9wc2F1eC90MWNtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3MDI0NS4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvdDFjbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFjbWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBjaGFyYWN0ZXIgbWFwIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFQxQ01BUF9IXwotI2RlZmluZSBUMUNNQVBfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgVFlQRTEgU1RBTkRBUkQgKEFORCBFWFBFUlQpIEVOQ09ESU5HIENNQVBTICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBzdGFuZGFyZCAoYW5kIGV4cGVydCkgZW5jb2RpbmcgY21hcHMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfQ01hcFN0ZFJlY18qICBUMV9DTWFwU3RkOwotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9DTWFwU3RkUmVjXwotICB7Ci0gICAgRlRfQ01hcFJlYyAgICAgICAgICAgICAgICBjbWFwOwotCi0gICAgY29uc3QgRlRfVVNob3J0KiAgICAgICAgICBjb2RlX3RvX3NpZDsKLSAgICBQU19BZG9iZV9TdGRfU3RyaW5nc0Z1bmMgIHNpZF90b19zdHJpbmc7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgICAgIG51bV9nbHlwaHM7Ci0gICAgY29uc3QgY2hhciogY29uc3QqICAgICAgICBnbHlwaF9uYW1lczsKLQotICB9IFQxX0NNYXBTdGRSZWM7Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRSBjb25zdCBGVF9DTWFwX0NsYXNzUmVjCi0gIHQxX2NtYXBfc3RhbmRhcmRfY2xhc3NfcmVjOwotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF9leHBlcnRfY2xhc3NfcmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgVFlQRTEgQ1VTVE9NIEVOQ09ESU5HIENNQVAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfQ01hcEN1c3RvbVJlY18qICBUMV9DTWFwQ3VzdG9tOwotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9DTWFwQ3VzdG9tUmVjXwotICB7Ci0gICAgRlRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VSW50ICAgICBmaXJzdDsKLSAgICBGVF9VSW50ICAgICBjb3VudDsKLSAgICBGVF9VU2hvcnQqICBpbmRpY2VzOwotCi0gIH0gVDFfQ01hcEN1c3RvbVJlYzsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF9jdXN0b21fY2xhc3NfcmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgIFRZUEUxIFNZTlRIRVRJQyBVTklDT0RFIEVOQ09ESU5HIENNQVAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogdW5pY29kZSAoc3ludGhldGljKSBjbWFwcyAqLwotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF91bmljb2RlX2NsYXNzX3JlYzsKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVDFDTUFQX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvdDFkZWNvZGUuYyBiL3NyYy9wc2F1eC90MWRlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjUwYjUzLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC90MWRlY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWRlY29kZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBUeXBlIDEgZGVjb2Rpbmcgcm91dGluZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0hBU0hfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0KLSNpbmNsdWRlICJ0MWRlY29kZS5oIgotI2luY2x1ZGUgInBzb2Jqcy5oIgotCi0jaW5jbHVkZSAicHNhdXhlcnIuaCIKLQotLyogZW5zdXJlIHByb3BlciBzaWduIGV4dGVuc2lvbiAqLwotI2RlZmluZSBGaXgySW50KCBmICkgICggKEZUX0ludCkoRlRfU2hvcnQpKCAoZikgPj4gMTYgKSApCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFkZWNvZGUKLQotCi0gIHR5cGVkZWYgZW51bSAgVDFfT3BlcmF0b3JfCi0gIHsKLSAgICBvcF9ub25lID0gMCwKLSAgICBvcF9lbmRjaGFyLAotICAgIG9wX2hzYncsCi0gICAgb3Bfc2VhYywKLSAgICBvcF9zYncsCi0gICAgb3BfY2xvc2VwYXRoLAotICAgIG9wX2hsaW5ldG8sCi0gICAgb3BfaG1vdmV0bywKLSAgICBvcF9odmN1cnZldG8sCi0gICAgb3BfcmxpbmV0bywKLSAgICBvcF9ybW92ZXRvLAotICAgIG9wX3JyY3VydmV0bywKLSAgICBvcF92aGN1cnZldG8sCi0gICAgb3BfdmxpbmV0bywKLSAgICBvcF92bW92ZXRvLAotICAgIG9wX2RvdHNlY3Rpb24sCi0gICAgb3BfaHN0ZW0sCi0gICAgb3BfaHN0ZW0zLAotICAgIG9wX3ZzdGVtLAotICAgIG9wX3ZzdGVtMywKLSAgICBvcF9kaXYsCi0gICAgb3BfY2FsbG90aGVyc3ViciwKLSAgICBvcF9jYWxsc3ViciwKLSAgICBvcF9wb3AsCi0gICAgb3BfcmV0dXJuLAotICAgIG9wX3NldGN1cnJlbnRwb2ludCwKLSAgICBvcF91bmtub3duMTUsCi0KLSAgICBvcF9tYXggICAgLyogbmV2ZXIgcmVtb3ZlIHRoaXMgb25lICovCi0KLSAgfSBUMV9PcGVyYXRvcjsKLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9JbnQgIHQxX2FyZ3NfY291bnRbb3BfbWF4XSA9Ci0gIHsKLSAgICAwLCAvKiBub25lICovCi0gICAgMCwgLyogZW5kY2hhciAqLwotICAgIDIsIC8qIGhzYncgKi8KLSAgICA1LCAvKiBzZWFjICovCi0gICAgNCwgLyogc2J3ICovCi0gICAgMCwgLyogY2xvc2VwYXRoICovCi0gICAgMSwgLyogaGxpbmV0byAqLwotICAgIDEsIC8qIGhtb3ZldG8gKi8KLSAgICA0LCAvKiBodmN1cnZldG8gKi8KLSAgICAyLCAvKiBybGluZXRvICovCi0gICAgMiwgLyogcm1vdmV0byAqLwotICAgIDYsIC8qIHJyY3VydmV0byAqLwotICAgIDQsIC8qIHZoY3VydmV0byAqLwotICAgIDEsIC8qIHZsaW5ldG8gKi8KLSAgICAxLCAvKiB2bW92ZXRvICovCi0gICAgMCwgLyogZG90c2VjdGlvbiAqLwotICAgIDIsIC8qIGhzdGVtICovCi0gICAgNiwgLyogaHN0ZW0zICovCi0gICAgMiwgLyogdnN0ZW0gKi8KLSAgICA2LCAvKiB2c3RlbTMgKi8KLSAgICAyLCAvKiBkaXYgKi8KLSAgIC0xLCAvKiBjYWxsb3RoZXJzdWJyICovCi0gICAgMSwgLyogY2FsbHN1YnIgKi8KLSAgICAwLCAvKiBwb3AgKi8KLSAgICAwLCAvKiByZXR1cm4gKi8KLSAgICAyLCAvKiBzZXRjdXJyZW50cG9pbnQgKi8KLSAgICAyICAvKiBvcGNvZGUgMTUgKHVuZG9jdW1lbnRlZCBhbmQgb2Jzb2xldGUpICovCi0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb29rcyB1cCBhIGdpdmVuIGdseXBoIGJ5IGl0cyBTdGFuZGFyZEVuY29kaW5nIGNoYXJjb2RlLiAgVXNlZCB0byAgKi8KLSAgLyogICAgaW1wbGVtZW50IHRoZSBTRUFDIFR5cGUgMSBvcGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiBUaGUgY2hhcmFjdGVyIGNvZGUgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGdseXBoIGluZGV4IGluIHRoZSBmb250IGZhY2UuICBSZXR1cm5zIC0xIGlmIHRoZSBjb3JyZXNwb25kaW5nICAgKi8KLSAgLyogICAgZ2x5cGggd2Fzbid0IGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHQxX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBjaGFyY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgICAgIG47Ci0gICAgY29uc3QgRlRfU3RyaW5nKiAgICBnbHlwaF9uYW1lOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IGRlY29kZXItPnBzbmFtZXM7Ci0KLQotICAgIC8qIGNoZWNrIHJhbmdlIG9mIHN0YW5kYXJkIGNoYXIgY29kZSAqLwotICAgIGlmICggY2hhcmNvZGUgPCAwIHx8IGNoYXJjb2RlID4gMjU1ICkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGdseXBoX25hbWUgPSBwc25hbWVzLT5hZG9iZV9zdGRfc3RyaW5ncygKLSAgICAgICAgICAgICAgICAgICBwc25hbWVzLT5hZG9iZV9zdGRfZW5jb2RpbmdbY2hhcmNvZGVdKTsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgZGVjb2Rlci0+bnVtX2dseXBoczsgbisrICkKLSAgICB7Ci0gICAgICBGVF9TdHJpbmcqICBuYW1lID0gKEZUX1N0cmluZyopZGVjb2Rlci0+Z2x5cGhfbmFtZXNbbl07Ci0KLQotICAgICAgaWYgKCBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIG5hbWVbMF0gPT0gZ2x5cGhfbmFtZVswXSAgICAgICAgICAgJiYKLSAgICAgICAgICAgZnRfc3RyY21wKCBuYW1lLCBnbHlwaF9uYW1lICkgPT0gMCApCi0gICAgICAgIHJldHVybiAoRlRfSW50KW47Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MW9wZXJhdG9yX3NlYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbXBsZW1lbnRzIHRoZSBgc2VhYycgVHlwZSAxIG9wZXJhdG9yIGZvciBhIFR5cGUgMSBkZWNvZGVyLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWNvZGVyIDo6IFRoZSBjdXJyZW50IENJRCBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzYiAgICAgOjogVGhlIGFjY2VudCdzIHNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR4ICAgICA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIGFjY2VudC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHkgICAgIDo6IFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIGFjY2VudC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJjaGFyICAgOjogVGhlIGJhc2UgY2hhcmFjdGVyJ3MgU3RhbmRhcmRFbmNvZGluZyBjaGFyY29kZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNoYXIgICA6OiBUaGUgYWNjZW50IGNoYXJhY3RlcidzIFN0YW5kYXJkRW5jb2RpbmcgY2hhcmNvZGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdDFvcGVyYXRvcl9zZWFjKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIGFzYiwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICBhZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgYWR5LAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGJjaGFyLAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGFjaGFyICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9JbnQgICAgICAgYmNoYXJfaW5kZXgsIGFjaGFyX2luZGV4OwotI2lmIDAKLSAgICBGVF9JbnQgICAgICAgbl9iYXNlX3BvaW50czsKLSAgICBGVF9PdXRsaW5lKiAgYmFzZSA9IGRlY29kZXItPmJ1aWxkZXIuYmFzZTsKLSNlbmRpZgotICAgIEZUX1ZlY3RvciAgICBsZWZ0X2JlYXJpbmcsIGFkdmFuY2U7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgVDFfRmFjZSAgICAgIGZhY2UgID0gKFQxX0ZhY2UpZGVjb2Rlci0+YnVpbGRlci5mYWNlOwotI2VuZGlmCi0KLQotICAgIGlmICggZGVjb2Rlci0+c2VhYyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidDFvcGVyYXRvcl9zZWFjOiBpbnZhbGlkIG5lc3RlZCBzZWFjXG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRlY29kZXItPmJ1aWxkZXIubWV0cmljc19vbmx5ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ0MW9wZXJhdG9yX3NlYWM6IHVuZXhwZWN0ZWQgc2VhY1xuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgfQotCi0gICAgLyogc2VhYyB3ZWlyZG5lc3MgKi8KLSAgICBhZHggKz0gZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueDsKLQotICAgIC8qIGBnbHlwaF9uYW1lcycgaXMgc2V0IHRvIDAgZm9yIENJRCBmb250cyB3aGljaCBkbyBub3QgKi8KLSAgICAvKiBpbmNsdWRlIGFuIGVuY29kaW5nLiAgSG93IGNhbiB3ZSBkZWFsIHdpdGggdGhlc2U/ICAgICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGlmICggZGVjb2Rlci0+Z2x5cGhfbmFtZXMgPT0gMCAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgIWZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0jZWxzZQotICAgIGlmICggZGVjb2Rlci0+Z2x5cGhfbmFtZXMgPT0gMCApCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQxb3BlcmF0b3Jfc2VhYzoiCi0gICAgICAgICAgICAgICAgICIgZ2x5cGggbmFtZXMgdGFibGUgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGZvbnRcbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIFN5bnRheF9FcnJvciApOwotICAgIH0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgewotICAgICAgLyogdGhlIGNhbGxlciBtdXN0IGhhbmRsZSB0aGUgZm9udCBlbmNvZGluZyBhbHNvICovCi0gICAgICBiY2hhcl9pbmRleCA9IGJjaGFyOwotICAgICAgYWNoYXJfaW5kZXggPSBhY2hhcjsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgYmNoYXJfaW5kZXggPSB0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGRlY29kZXIsIGJjaGFyICk7Ci0gICAgICBhY2hhcl9pbmRleCA9IHQxX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggZGVjb2RlciwgYWNoYXIgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGJjaGFyX2luZGV4IDwgMCB8fCBhY2hhcl9pbmRleCA8IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQxb3BlcmF0b3Jfc2VhYzoiCi0gICAgICAgICAgICAgICAgICIgaW52YWxpZCBzZWFjIGNoYXJhY3RlciBjb2RlIGFyZ3VtZW50c1xuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgfQotCi0gICAgLyogaWYgd2UgYXJlIHRyeWluZyB0byBsb2FkIGEgY29tcG9zaXRlIGdseXBoLCBkbyBub3QgbG9hZCB0aGUgKi8KLSAgICAvKiBhY2NlbnQgY2hhcmFjdGVyIGFuZCByZXR1cm4gdGhlIGFycmF5IG9mIHN1YmdseXBocy4gICAgICAgICAqLwotICAgIGlmICggZGVjb2Rlci0+YnVpbGRlci5ub19yZWN1cnNlICkKLSAgICB7Ci0gICAgICBGVF9HbHlwaFNsb3QgICAgZ2x5cGggID0gKEZUX0dseXBoU2xvdClkZWNvZGVyLT5idWlsZGVyLmdseXBoOwotICAgICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlciA9IGdseXBoLT5pbnRlcm5hbC0+bG9hZGVyOwotICAgICAgRlRfU3ViR2x5cGggICAgIHN1Ymc7Ci0KLQotICAgICAgLyogcmVhbGxvY2F0ZSBzdWJnbHlwaCBhcnJheSBpZiBuZWNlc3NhcnkgKi8KLSAgICAgIGVycm9yID0gRlRfR2x5cGhMb2FkZXJfQ2hlY2tTdWJHbHlwaHMoIGxvYWRlciwgMiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgc3ViZyA9IGxvYWRlci0+Y3VycmVudC5zdWJnbHlwaHM7Ci0KLSAgICAgIC8qIHN1YmdseXBoIDAgPSBiYXNlIGNoYXJhY3RlciAqLwotICAgICAgc3ViZy0+aW5kZXggPSBiY2hhcl9pbmRleDsKLSAgICAgIHN1YmctPmZsYWdzID0gRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVMgfAotICAgICAgICAgICAgICAgICAgICBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTOwotICAgICAgc3ViZy0+YXJnMSAgPSAwOwotICAgICAgc3ViZy0+YXJnMiAgPSAwOwotICAgICAgc3ViZysrOwotCi0gICAgICAvKiBzdWJnbHlwaCAxID0gYWNjZW50IGNoYXJhY3RlciAqLwotICAgICAgc3ViZy0+aW5kZXggPSBhY2hhcl9pbmRleDsKLSAgICAgIHN1YmctPmZsYWdzID0gRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVM7Ci0gICAgICBzdWJnLT5hcmcxICA9IChGVF9JbnQpRklYRURfVE9fSU5UKCBhZHggLSBhc2IgKTsKLSAgICAgIHN1YmctPmFyZzIgID0gKEZUX0ludClGSVhFRF9UT19JTlQoIGFkeSApOwotCi0gICAgICAvKiBzZXQgdXAgcmVtYWluaW5nIGdseXBoIGZpZWxkcyAqLwotICAgICAgZ2x5cGgtPm51bV9zdWJnbHlwaHMgPSAyOwotICAgICAgZ2x5cGgtPnN1YmdseXBocyAgICAgPSBsb2FkZXItPmJhc2Uuc3ViZ2x5cGhzOwotICAgICAgZ2x5cGgtPmZvcm1hdCAgICAgICAgPSBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFOwotCi0gICAgICBsb2FkZXItPmN1cnJlbnQubnVtX3N1YmdseXBocyA9IDI7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogRmlyc3QgbG9hZCBgYmNoYXInIGluIGJ1aWxkZXIgKi8KLSAgICAvKiBub3cgbG9hZCB0aGUgdW5zY2FsZWQgb3V0bGluZSAqLwotCi0gICAgRlRfR2x5cGhMb2FkZXJfUHJlcGFyZSggZGVjb2Rlci0+YnVpbGRlci5sb2FkZXIgKTsgIC8qIHByZXBhcmUgbG9hZGVyICovCi0KLSAgICAvKiB0aGUgc2VhYyBvcGVyYXRvciBtdXN0IG5vdCBiZSBuZXN0ZWQgKi8KLSAgICBkZWNvZGVyLT5zZWFjID0gVFJVRTsKLSAgICBlcnJvciA9IHQxX2RlY29kZXJfcGFyc2VfZ2x5cGgoIGRlY29kZXIsIChGVF9VSW50KWJjaGFyX2luZGV4ICk7Ci0gICAgZGVjb2Rlci0+c2VhYyA9IEZBTFNFOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2F2ZSB0aGUgbGVmdCBiZWFyaW5nIGFuZCB3aWR0aCBvZiB0aGUgYmFzZSBjaGFyYWN0ZXIgKi8KLSAgICAvKiBhcyB0aGV5IHdpbGwgYmUgZXJhc2VkIGJ5IHRoZSBuZXh0IGxvYWQuICAgICAgICAgICAgICAqLwotCi0gICAgbGVmdF9iZWFyaW5nID0gZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmc7Ci0gICAgYWR2YW5jZSAgICAgID0gZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlOwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IDA7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueSA9IDA7Ci0KLSAgICBkZWNvZGVyLT5idWlsZGVyLnBvc194ID0gYWR4IC0gYXNiOwotICAgIGRlY29kZXItPmJ1aWxkZXIucG9zX3kgPSBhZHk7Ci0KLSAgICAvKiBOb3cgbG9hZCBgYWNoYXInIG9uIHRvcCBvZiAqLwotICAgIC8qIHRoZSBiYXNlIG91dGxpbmUgICAgICAgICAgICovCi0KLSAgICAvKiB0aGUgc2VhYyBvcGVyYXRvciBtdXN0IG5vdCBiZSBuZXN0ZWQgKi8KLSAgICBkZWNvZGVyLT5zZWFjID0gVFJVRTsKLSAgICBlcnJvciA9IHQxX2RlY29kZXJfcGFyc2VfZ2x5cGgoIGRlY29kZXIsIChGVF9VSW50KWFjaGFyX2luZGV4ICk7Ci0gICAgZGVjb2Rlci0+c2VhYyA9IEZBTFNFOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcmVzdG9yZSB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgYW5kICAgKi8KLSAgICAvKiBhZHZhbmNlIHdpZHRoIG9mIHRoZSBiYXNlIGNoYXJhY3RlciAqLwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcgPSBsZWZ0X2JlYXJpbmc7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlICAgICAgPSBhZHZhbmNlOwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5wb3NfeCA9IDA7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5wb3NfeSA9IDA7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlcyBhIGdpdmVuIFR5cGUgMSBjaGFyc3RyaW5ncyBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlY29kZXIgICAgICAgICA6OiBUaGUgY3VycmVudCBUeXBlIDEgZGVjb2Rlci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcnN0cmluZ19iYXNlIDo6IFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNoYXJzdHJpbmcgc3RyZWFtLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBjaGFyc3RyaW5nX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGNoYXJzdHJpbmdfbGVuICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgVDFfRGVjb2Rlcl9ab25lICB6b25lOwotICAgIEZUX0J5dGUqICAgICAgICAgaXA7Ci0gICAgRlRfQnl0ZSogICAgICAgICBsaW1pdDsKLSAgICBUMV9CdWlsZGVyICAgICAgIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKLSAgICBGVF9Qb3MgICAgICAgICAgIHgsIHksIG9yaWdfeCwgb3JpZ195OwotICAgIEZUX0ludCAgICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgICA9IDA7Ci0gICAgRlRfSW50ICAgICAgICAgICB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gMDsKLSAgICBGVF9Cb29sICAgICAgICAgIGxhcmdlX2ludDsKLSAgICBGVF9GaXhlZCAgICAgICAgIHNlZWQ7Ci0KLSAgICBUMV9IaW50c19GdW5jcyAgIGhpbnRlcjsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgRlRfQm9vbCAgICAgICAgICBib2wgPSBUUlVFOwotI2VuZGlmCi0KLQotICAgIC8qIGNvbXB1dGUgcmFuZG9tIHNlZWQgZnJvbSBzdGFjayBhZGRyZXNzIG9mIHBhcmFtZXRlciAqLwotICAgIHNlZWQgPSAoRlRfRml4ZWQpKCAoIChGVF9PZmZzZXQpKGNoYXIqKSZzZWVkICAgICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9PZmZzZXQpKGNoYXIqKSZkZWNvZGVyICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9PZmZzZXQpKGNoYXIqKSZjaGFyc3RyaW5nX2Jhc2UgKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxPTkdfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgc2VlZCA9ICggc2VlZCBeICggc2VlZCA+PiAxMCApIF4gKCBzZWVkID4+IDIwICkgKSAmIDB4RkZGRkw7Ci0gICAgaWYgKCBzZWVkID09IDAgKQotICAgICAgc2VlZCA9IDB4NzM4NDsKLQotICAgIC8qIEZpcnN0IG9mIGFsbCwgaW5pdGlhbGl6ZSB0aGUgZGVjb2RlciAqLwotICAgIGRlY29kZXItPnRvcCAgPSBkZWNvZGVyLT5zdGFjazsKLSAgICBkZWNvZGVyLT56b25lID0gZGVjb2Rlci0+em9uZXM7Ci0gICAgem9uZSAgICAgICAgICA9IGRlY29kZXItPnpvbmVzOwotCi0gICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9TdGFydDsKLQotICAgIGhpbnRlciA9IChUMV9IaW50c19GdW5jcylidWlsZGVyLT5oaW50c19mdW5jczsKLQotICAgIC8qIGEgZm9udCB0aGF0IHJlYWRzIEJ1aWxkQ2hhckFycmF5IHdpdGhvdXQgc2V0dGluZyAqLwotICAgIC8qIGl0cyB2YWx1ZXMgZmlyc3QgaXMgYnVnZ3ksIGJ1dCAuLi4gICAgICAgICAgICAgICAqLwotICAgIEZUX0FTU0VSVCggKCBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyID09IDAgKSA9PQotICAgICAgICAgICAgICAgKCBkZWNvZGVyLT5idWlsZGNoYXIgPT0gTlVMTCApICApOwotCi0gICAgaWYgKCBkZWNvZGVyLT5idWlsZGNoYXIgJiYgZGVjb2Rlci0+bGVuX2J1aWxkY2hhciA+IDAgKQotICAgICAgRlRfQVJSQVlfWkVSTyggZGVjb2Rlci0+YnVpbGRjaGFyLCBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyICk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiXG4iCi0gICAgICAgICAgICAgICAgIlN0YXJ0IGNoYXJzdHJpbmdcbiIgKSk7Ci0KLSAgICB6b25lLT5iYXNlICAgICAgICAgICA9IGNoYXJzdHJpbmdfYmFzZTsKLSAgICBsaW1pdCA9IHpvbmUtPmxpbWl0ICA9IGNoYXJzdHJpbmdfYmFzZSArIGNoYXJzdHJpbmdfbGVuOwotICAgIGlwICAgID0gem9uZS0+Y3Vyc29yID0gem9uZS0+YmFzZTsKLQotICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgeCA9IG9yaWdfeCA9IGJ1aWxkZXItPnBvc194OwotICAgIHkgPSBvcmlnX3kgPSBidWlsZGVyLT5wb3NfeTsKLQotICAgIC8qIGJlZ2luIGhpbnRzIHJlY29yZGluZyBzZXNzaW9uLCBpZiBhbnkgKi8KLSAgICBpZiAoIGhpbnRlciApCi0gICAgICBoaW50ZXItPm9wZW4oIGhpbnRlci0+aGludHMgKTsKLQotICAgIGxhcmdlX2ludCA9IEZBTFNFOwotCi0gICAgLyogbm93LCBleGVjdXRlIGxvb3AgKi8KLSAgICB3aGlsZSAoIGlwIDwgbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0xvbmcqICAgICB0b3AgICA9IGRlY29kZXItPnRvcDsKLSAgICAgIFQxX09wZXJhdG9yICBvcCAgICA9IG9wX25vbmU7Ci0gICAgICBGVF9JbnQzMiAgICAgdmFsdWUgPSAwOwotCi0KLSAgICAgIEZUX0FTU0VSVCgga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPT0gMCAgIHx8Ci0gICAgICAgICAgICAgICAgIHVua25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPT0gMCApOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgIGlmICggYm9sICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAoJWQpIiwgZGVjb2Rlci0+dG9wIC0gZGVjb2Rlci0+c3RhY2sgKSk7Ci0gICAgICAgIGJvbCA9IEZBTFNFOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogRGVjb2RlIG9wZXJhdG9yIG9yIG9wZXJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBmaXJzdCBvZiBhbGwsIGRlY29tcHJlc3Mgb3BlcmF0b3Igb3IgdmFsdWUgKi8KLSAgICAgIHN3aXRjaCAoICppcCsrICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgb3AgPSBvcF9oc3RlbTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMzoKLSAgICAgICAgb3AgPSBvcF92c3RlbTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgIG9wID0gb3Bfdm1vdmV0bzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDU6Ci0gICAgICAgIG9wID0gb3BfcmxpbmV0bzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDY6Ci0gICAgICAgIG9wID0gb3BfaGxpbmV0bzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDc6Ci0gICAgICAgIG9wID0gb3BfdmxpbmV0bzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDg6Ci0gICAgICAgIG9wID0gb3BfcnJjdXJ2ZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgOToKLSAgICAgICAgb3AgPSBvcF9jbG9zZXBhdGg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDoKLSAgICAgICAgb3AgPSBvcF9jYWxsc3VicjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExOgotICAgICAgICBvcCA9IG9wX3JldHVybjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMTM6Ci0gICAgICAgIG9wID0gb3BfaHNidzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE0OgotICAgICAgICBvcCA9IG9wX2VuZGNoYXI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDE1OiAgICAgICAgICAvKiB1bmRvY3VtZW50ZWQsIG9ic29sZXRlIG9wZXJhdG9yICovCi0gICAgICAgIG9wID0gb3BfdW5rbm93bjE1OwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAyMToKLSAgICAgICAgb3AgPSBvcF9ybW92ZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjI6Ci0gICAgICAgIG9wID0gb3BfaG1vdmV0bzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMzA6Ci0gICAgICAgIG9wID0gb3BfdmhjdXJ2ZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzE6Ci0gICAgICAgIG9wID0gb3BfaHZjdXJ2ZXRvOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAxMjoKLSAgICAgICAgaWYgKCBpcCA+PSBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBlc2NhcGUgKDEyK0VPRilcbiIgKSk7Ci0gICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKCAqaXArKyApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgIG9wID0gb3BfZG90c2VjdGlvbjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIG9wID0gb3BfdnN0ZW0zOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgb3AgPSBvcF9oc3RlbTM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICBvcCA9IG9wX3NlYWM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICBvcCA9IG9wX3NidzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICBvcCA9IG9wX2RpdjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICBvcCA9IG9wX2NhbGxvdGhlcnN1YnI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgb3AgPSBvcF9wb3A7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgb3AgPSBvcF9zZXRjdXJyZW50cG9pbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBlc2NhcGUgKDEyKyVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGlwWy0xXSApKTsKLSAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAyNTU6ICAgIC8qIGZvdXIgYnl0ZXMgaW50ZWdlciAqLwotICAgICAgICBpZiAoIGlwICsgNCA+IGxpbWl0ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgIiB1bmV4cGVjdGVkIEVPRiBpbiBpbnRlZ2VyXG4iICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSAoRlRfSW50MzIpKCAoIChGVF9VSW50MzIpaXBbMF0gPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUludDMyKWlwWzFdIDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKEZUX1VJbnQzMilpcFsyXSA8PCA4ICApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50MzIpaXBbM10gICAgICAgICApOwotICAgICAgICBpcCArPSA0OwotCi0gICAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiwgdmFsdWVzID4gMzIwMDAgb3IgPCAtMzIwMDAgbXVzdCAqLwotICAgICAgICAvKiBiZSBmb2xsb3dlZCBieSBhIGBkaXYnIG9wZXJhdG9yIHRvIG1ha2UgdGhlIHJlc3VsdCBiZSBpbiB0aGUgICAgKi8KLSAgICAgICAgLyogcmFuZ2UgWy0zMjAwMDszMjAwMF0uICBXZSBleHBlY3QgdGhhdCB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mICAgICovCi0gICAgICAgIC8qIGBkaXYnIGlzIG5vdCBhIGxhcmdlIG51bWJlci4gIEFkZGl0aW9uYWxseSwgd2UgZG9uJ3QgaGFuZGxlICAgICAqLwotICAgICAgICAvKiBzdHVmZiBsaWtlIGA8bGFyZ2UxPiA8bGFyZ2UyPiA8bnVtPiBkaXYgPG51bT4gZGl2JyBvciAgICAgICAgICAgKi8KLSAgICAgICAgLyogPGxhcmdlMT4gPGxhcmdlMj4gPG51bT4gZGl2IGRpdicuICBUaGlzIGlzIHByb2JhYmx5IG5vdCBhbGxvd2VkICovCi0gICAgICAgIC8qIGFueXdheS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHZhbHVlID4gMzIwMDAgfHwgdmFsdWUgPCAtMzIwMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBsYXJnZV9pbnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAiIG5vIGBkaXYnIGFmdGVyIGxhcmdlIGludGVnZXJcbiIgKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxhcmdlX2ludCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAhbGFyZ2VfaW50ICkKLSAgICAgICAgICAgIHZhbHVlID0gKEZUX0ludDMyKSggKEZUX1VJbnQzMil2YWx1ZSA8PCAxNiApOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICggaXBbLTFdID49IDMyICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggaXBbLTFdIDwgMjQ3ICkKLSAgICAgICAgICAgIHZhbHVlID0gKEZUX0ludDMyKWlwWy0xXSAtIDEzOTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCArK2lwID4gbGltaXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIHVuZXhwZWN0ZWQgRU9GIGluIGludGVnZXJcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGlwWy0yXSA8IDI1MSApCi0gICAgICAgICAgICAgIHZhbHVlID0gICAgKCAoIGlwWy0yXSAtIDI0NyApICogMjU2ICkgKyBpcFstMV0gKyAxMDg7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHZhbHVlID0gLSggKCAoIGlwWy0yXSAtIDI1MSApICogMjU2ICkgKyBpcFstMV0gKyAxMDggKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoICFsYXJnZV9pbnQgKQotICAgICAgICAgICAgdmFsdWUgPSAoRlRfSW50MzIpKCAoRlRfVUludDMyKXZhbHVlIDw8IDE2ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgYnl0ZSAoJWQpXG4iLCBpcFstMV0gKSk7Ci0gICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID4gMCApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIG9wICkKLSAgICAgICAgewotICAgICAgICBjYXNlIG9wX2NhbGxzdWJyOgotICAgICAgICBjYXNlIG9wX3JldHVybjoKLSAgICAgICAgY2FzZSBvcF9ub25lOgotICAgICAgICBjYXNlIG9wX3BvcDoKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIC8qIGFsbCBvcGVyYW5kcyBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgYnkgcHJldmlvdXMgcG9wcyAqLwotICAgICAgICAgIHVua25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggbGFyZ2VfaW50ICYmICEoIG9wID09IG9wX25vbmUgfHwgb3AgPT0gb3BfZGl2ICkgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAiIG5vIGBkaXYnIGFmdGVyIGxhcmdlIGludGVnZXJcbiIgKSk7Ci0KLSAgICAgICAgbGFyZ2VfaW50ID0gRkFMU0U7Ci0gICAgICB9Ci0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogIFB1c2ggdmFsdWUgb24gc3RhY2ssIG9yIHByb2Nlc3Mgb3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBvcCA9PSBvcF9ub25lICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCB0b3AgLSBkZWNvZGVyLT5zdGFjayA+PSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogc3RhY2sgb3ZlcmZsb3dcbiIgKSk7Ci0gICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGlmICggbGFyZ2VfaW50ICkKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgdmFsdWUgKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgdmFsdWUgLyA2NTUzNiApKTsKLSNlbmRpZgotCi0gICAgICAgICp0b3ArKyAgICAgICA9IHZhbHVlOwotICAgICAgICBkZWNvZGVyLT50b3AgPSB0b3A7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggb3AgPT0gb3BfY2FsbG90aGVyc3ViciApICAvKiBjYWxsb3RoZXJzdWJyICovCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgc3Vicl9ubzsKLSAgICAgICAgRlRfSW50ICBhcmdfY250OwotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBGVF9UUkFDRTQoKCAiIGNhbGxvdGhlcnN1YnJcbiIgKSk7Ci0gICAgICAgIGJvbCA9IFRSVUU7Ci0jZW5kaWYKLQotICAgICAgICBpZiAoIHRvcCAtIGRlY29kZXItPnN0YWNrIDwgMiApCi0gICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgdG9wIC09IDI7Ci0KLSAgICAgICAgc3Vicl9ubyA9IEZpeDJJbnQoIHRvcFsxXSApOwotICAgICAgICBhcmdfY250ID0gRml4MkludCggdG9wWzBdICk7Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIHJlbW92ZSBhbGwgb3BlcmFuZHMgdG8gY2FsbG90aGVyc3ViciBmcm9tIHRoZSBzdGFjayAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBmb3IgaGFuZGxlZCBvdGhlcnN1YnJzLCB3aGVyZSB3ZSBrbm93IHRoZSBudW1iZXIgb2YgICAgICovCi0gICAgICAgIC8qIGFyZ3VtZW50cywgd2UgaW5jcmVhc2UgdGhlIHN0YWNrIGJ5IHRoZSB2YWx1ZSBvZiAgICAgICAgKi8KLSAgICAgICAgLyoga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIGZvciB1bmhhbmRsZWQgb3RoZXJzdWJycyB0aGUgZm9sbG93aW5nIHBvcHMgYWRqdXN0IHRoZSAgKi8KLSAgICAgICAgLyogc3RhY2sgcG9pbnRlciBhcyBuZWNlc3NhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggYXJnX2NudCA+IHRvcCAtIGRlY29kZXItPnN0YWNrICkKLSAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICB0b3AgLT0gYXJnX2NudDsKLQotICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCAgID0gMDsKLSAgICAgICAgdW5rbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDA7Ci0KLSAgICAgICAgLyogWFhYIFRPRE86IFRoZSBjaGVja3MgdG8gYGFyZ19jb3VudCA9PSA8d2hhdGV2ZXI+JyAgICAgICAqLwotICAgICAgICAvKiBtaWdodCBub3QgYmUgY29ycmVjdDsgYW4gb3RoZXJzdWJyIGV4cGVjdHMgYSBjZXJ0YWluICAgICovCi0gICAgICAgIC8qIG51bWJlciBvZiBvcGVyYW5kcyBvbiB0aGUgUG9zdFNjcmlwdCBzdGFjayAoYXMgb3Bwb3NlZCAgKi8KLSAgICAgICAgLyogdG8gdGhlIFQxIHN0YWNrKSBidXQgaXQgZG9lc24ndCBoYXZlIHRvIHB1dCB0aGVtIHRoZXJlICAqLwotICAgICAgICAvKiBieSBpdHNlbGY7IHByZXZpb3VzIG90aGVyc3VicnMgbWlnaHQgaGF2ZSBsZWZ0IHRoZSAgICAgICovCi0gICAgICAgIC8qIG9wZXJhbmRzIHRoZXJlIGlmIHRoZXkgd2VyZSBub3QgZm9sbG93ZWQgYnkgYW4gICAgICAgICAgKi8KLSAgICAgICAgLyogYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHBvcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIE9uIHRoZSBvdGhlciBoYW5kLCBBZG9iZSBSZWFkZXIgNy4wLjggZm9yIExpbnV4IGRvZXNuJ3QgKi8KLSAgICAgICAgLyogYWNjZXB0IGEgZm9udCB0aGF0IGNvbnRhaW5zIGNoYXJzdHJpbmdzIGxpa2UgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAxMDAgMjAwIDIgMjAgY2FsbG90aGVyc3ViciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgIDMwMCAxIDIwIGNhbGxvdGhlcnN1YnIgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFBlcmhhcHMgdGhpcyBpcyB0aGUgcmVhc29uIHdoeSBCdWlsZENoYXJBcnJheSBleGlzdHMuICAgKi8KLQotICAgICAgICBzd2l0Y2ggKCBzdWJyX25vICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGZsZXggZmVhdHVyZSAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAzICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBpZiAoICFkZWNvZGVyLT5mbGV4X3N0YXRlICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgZGVjb2Rlci0+bnVtX2ZsZXhfdmVjdG9ycyAhPSA3ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiB1bmV4cGVjdGVkIGZsZXggZW5kXG4iICkpOwotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogdGhlIHR3byBgcmVzdWx0cycgYXJlIHBvcHBlZCBieSB0aGUgZm9sbG93aW5nIHNldGN1cnJlbnRwb2ludCAqLwotICAgICAgICAgIHRvcFswXSA9IHg7Ci0gICAgICAgICAgdG9wWzFdID0geTsKLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGZsZXggZmVhdHVyZSAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAwICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBpZiAoIEZUX1NFVF9FUlJPUiggdDFfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkgfHwKLSAgICAgICAgICAgICAgIEZUX1NFVF9FUlJPUiggdDFfYnVpbGRlcl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIDYgKSApICAgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgZGVjb2Rlci0+ZmxleF9zdGF0ZSAgICAgICAgPSAxOwotICAgICAgICAgIGRlY29kZXItPm51bV9mbGV4X3ZlY3RvcnMgID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgLyogYWRkIGZsZXggdmVjdG9ycyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgaWR4OwotCi0KLSAgICAgICAgICAgIGlmICggYXJnX2NudCAhPSAwICkKLSAgICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgICAgaWYgKCAhZGVjb2Rlci0+ZmxleF9zdGF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgbWlzc2luZyBmbGV4IHN0YXJ0XG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbm90ZSB0aGF0IHdlIHNob3VsZCBub3QgYWRkIGEgcG9pbnQgZm9yIGluZGV4IDA7ICovCi0gICAgICAgICAgICAvKiB0aGlzIHdpbGwgbW92ZSBvdXIgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgZmxleCAgKi8KLSAgICAgICAgICAgIC8qIHBvaW50IHdpdGhvdXQgYWRkaW5nIGFueSBwb2ludCB0byB0aGUgb3V0bGluZSAgICAqLwotICAgICAgICAgICAgaWR4ID0gZGVjb2Rlci0+bnVtX2ZsZXhfdmVjdG9ycysrOwotICAgICAgICAgICAgaWYgKCBpZHggPiAwICYmIGlkeCA8IDcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBpbiBtYWxmb3JtZWQgZm9udHMgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBvdGhlciAqLwotICAgICAgICAgICAgICAvKiBvcGNvZGVzIGluIHRoZSBtaWRkbGUgb2YgYSBmbGV4ICh3aGljaCBkb24ndCAgICAqLwotICAgICAgICAgICAgICAvKiBpbmNyZWFzZSBgbnVtX2ZsZXhfdmVjdG9ycycpOyB3ZSB0aHVzIGhhdmUgdG8gICAqLwotICAgICAgICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGNhbiBhZGQgYSBwb2ludCAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBpZiAoIEZUX1NFVF9FUlJPUiggdDFfYnVpbGRlcl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIDEgKSApICkKLSAgICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLQotICAgICAgICAgICAgICB0MV9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUpKCBpZHggPT0gMyB8fCBpZHggPT0gNiApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgaGludHMgKi8KLSAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMSApCi0gICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAxOwotCi0gICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgICAgaGludGVyLT5yZXNldCggaGludGVyLT5oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWJ1aWxkZXItPmN1cnJlbnQtPm5fcG9pbnRzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAvKiBjb3VudGVyIGNvbnRyb2wgaGludHMsIGNsZWFyIHN0YWNrICovCi0gICAgICAgICAgdG9wID0gZGVjb2Rlci0+c3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgY2FzZSAxODogICAgICAgICAgICAgICAgICAgIC8qIG11bHRpcGxlIG1hc3RlcnMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQU19CbGVuZCAgYmxlbmQgPSBkZWNvZGVyLT5ibGVuZDsKLSAgICAgICAgICAgIEZUX1VJbnQgICBudW1fcG9pbnRzLCBubiwgbW07Ci0gICAgICAgICAgICBGVF9Mb25nKiAgZGVsdGE7Ci0gICAgICAgICAgICBGVF9Mb25nKiAgdmFsdWVzOwotCi0KLSAgICAgICAgICAgIGlmICggIWJsZW5kICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiB1bmV4cGVjdGVkIG11bHRpcGxlIG1hc3RlcnMgb3BlcmF0b3JcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBudW1fcG9pbnRzID0gKEZUX1VJbnQpc3Vicl9ubyAtIDEzICsgKCBzdWJyX25vID09IDE4ICk7Ci0gICAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gKEZUX0ludCkoIG51bV9wb2ludHMgKiBibGVuZC0+bnVtX2Rlc2lnbnMgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5jb3JyZWN0IG51bWJlciBvZiBtdWx0aXBsZSBtYXN0ZXJzIGFyZ3VtZW50c1xuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFdlIHdhbnQgdG8gY29tcHV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICBhMCp3MCArIGExKncxICsgLi4uICsgYWsqd2sgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiBidXQgd2Ugb25seSBoYXZlIGEwLCBhMS1hMCwgYTItYTAsIC4uLiwgYWstYTAuICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIEhvd2V2ZXIsIGdpdmVuIHRoYXQgdzAgKyB3MSArIC4uLiArIHdrID09IDEsIHdlIGNhbiAgICovCi0gICAgICAgICAgICAvKiByZXdyaXRlIGl0IGVhc2lseSBhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgYTAgKyAoYTEtYTApKncxICsgKGEyLWEwKSp3MiArIC4uLiArIChhay1hMCkqd2sgICAgICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogd2hlcmUgayA9PSBudW1fZGVzaWducy0xLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiBJIGd1ZXNzIHRoYXQncyB3aHkgaXQncyB3cml0dGVuIGluIHRoaXMgYGNvbXBhY3QnICAgICAqLwotICAgICAgICAgICAgLyogZm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBkZWx0YSAgPSB0b3AgKyBudW1fcG9pbnRzOwotICAgICAgICAgICAgdmFsdWVzID0gdG9wOwotICAgICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9wb2ludHM7IG5uKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9Mb25nICB0bXAgPSB2YWx1ZXNbMF07Ci0KLQotICAgICAgICAgICAgICBmb3IgKCBtbSA9IDE7IG1tIDwgYmxlbmQtPm51bV9kZXNpZ25zOyBtbSsrICkKLSAgICAgICAgICAgICAgICB0bXAgPSBBRERfTE9ORyggdG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoICpkZWx0YSsrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT53ZWlnaHRfdmVjdG9yW21tXSApICk7Ci0KLSAgICAgICAgICAgICAgKnZhbHVlcysrID0gdG1wOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IChGVF9JbnQpbnVtX3BvaW50czsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIDE5OgotICAgICAgICAgIC8qIDxpZHg+IDEgMTkgY2FsbG90aGVyc3ViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiA9PiByZXBsYWNlIGVsZW1lbnRzIHN0YXJ0aW5nIGZyb20gaW5kZXggY3ZpKCA8aWR4PiApICovCi0gICAgICAgICAgLyogICAgb2YgQnVpbGRDaGFyQXJyYXkgd2l0aCBXZWlnaHRWZWN0b3IgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgICBpZHg7Ci0gICAgICAgICAgICBQU19CbGVuZCAgYmxlbmQgPSBkZWNvZGVyLT5ibGVuZDsKLQotCi0gICAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMSB8fCAhYmxlbmQgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBpZHggPSBGaXgySW50KCB0b3BbMF0gKTsKLQotICAgICAgICAgICAgaWYgKCBpZHggPCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIChGVF9VSW50KWlkeCArIGJsZW5kLT5udW1fZGVzaWducyA+IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBmdF9tZW1jcHkoICZkZWNvZGVyLT5idWlsZGNoYXJbaWR4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT5udW1fZGVzaWducyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggYmxlbmQtPndlaWdodF92ZWN0b3JbMF0gKSApOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgIC8qIDxhcmcxPiA8YXJnMj4gMiAyMCBjYWxsb3RoZXJzdWJyIHBvcCAgICovCi0gICAgICAgICAgLyogPT0+IHB1c2ggPGFyZzE+ICsgPGFyZzI+IG9udG8gVDEgc3RhY2sgKi8KLSAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMiApCi0gICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgdG9wWzBdID0gQUREX0xPTkcoIHRvcFswXSwgdG9wWzFdICk7Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAvKiA8YXJnMT4gPGFyZzI+IDIgMjEgY2FsbG90aGVyc3ViciBwb3AgICAqLwotICAgICAgICAgIC8qID09PiBwdXNoIDxhcmcxPiAtIDxhcmcyPiBvbnRvIFQxIHN0YWNrICovCi0gICAgICAgICAgaWYgKCBhcmdfY250ICE9IDIgKQotICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgIHRvcFswXSA9IFNVQl9MT05HKCB0b3BbMF0sIHRvcFsxXSApOwotCi0gICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAxOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgLyogPGFyZzE+IDxhcmcyPiAyIDIyIGNhbGxvdGhlcnN1YnIgcG9wICAgKi8KLSAgICAgICAgICAvKiA9PT4gcHVzaCA8YXJnMT4gKiA8YXJnMj4gb250byBUMSBzdGFjayAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAyICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICB0b3BbMF0gPSBGVF9NdWxGaXgoIHRvcFswXSwgdG9wWzFdICk7Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAvKiA8YXJnMT4gPGFyZzI+IDIgMjMgY2FsbG90aGVyc3ViciBwb3AgICAqLwotICAgICAgICAgIC8qID09PiBwdXNoIDxhcmcxPiAvIDxhcmcyPiBvbnRvIFQxIHN0YWNrICovCi0gICAgICAgICAgaWYgKCBhcmdfY250ICE9IDIgfHwgdG9wWzFdID09IDAgKQotICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgIHRvcFswXSA9IEZUX0RpdkZpeCggdG9wWzBdLCB0b3BbMV0gKTsKLQotICAgICAgICAgIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gMTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI0OgotICAgICAgICAgIC8qIDx2YWw+IDxpZHg+IDIgMjQgY2FsbG90aGVyc3ViciAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogPT0+IHNldCBCdWlsZENoYXJBcnJheVtjdmkoIDxpZHg+ICldID0gPHZhbD4gKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgICAgaWR4OwotICAgICAgICAgICAgUFNfQmxlbmQgIGJsZW5kID0gZGVjb2Rlci0+YmxlbmQ7Ci0KLQotICAgICAgICAgICAgaWYgKCBhcmdfY250ICE9IDIgfHwgIWJsZW5kICkKLSAgICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgICAgaWR4ID0gRml4MkludCggdG9wWzFdICk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4IDwgMCB8fCAoRlRfVUludCkgaWR4ID49IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XSA9IHRvcFswXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAvKiA8aWR4PiAxIDI1IGNhbGxvdGhlcnN1YnIgcG9wICAgICAgICAqLwotICAgICAgICAgIC8qID09PiBwdXNoIEJ1aWxkQ2hhckFycmF5W2N2aSggaWR4ICldICovCi0gICAgICAgICAgLyogICAgIG9udG8gVDEgc3RhY2sgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgICAgaWR4OwotICAgICAgICAgICAgUFNfQmxlbmQgIGJsZW5kID0gZGVjb2Rlci0+YmxlbmQ7Ci0KLQotICAgICAgICAgICAgaWYgKCBhcmdfY250ICE9IDEgfHwgIWJsZW5kICkKLSAgICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgICAgaWR4ID0gRml4MkludCggdG9wWzBdICk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4IDwgMCB8fCAoRlRfVUludCkgaWR4ID49IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICB0b3BbMF0gPSBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSNpZiAwCi0gICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgLyogPHZhbD4gbWFyayA8aWR4PiA9PT4gc2V0IEJ1aWxkQ2hhckFycmF5W2N2aSggPGlkeD4gKV0gPSA8dmFsPiwgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICBsZWF2ZSBtYXJrIG9uIFQxIHN0YWNrICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIDx2YWw+IDxpZHg+ICAgICAgPT0+IHNldCBCdWlsZENoYXJBcnJheVtjdmkoIDxpZHg+ICldID0gPHZhbD4gICovCi0gICAgICAgICAgWFhYIHdoaWNoIHJvdXRpbmUgaGFzIGxlZnQgaXRzIG1hcmsgb24gdGhlIChQb3N0U2NyaXB0KSBzdGFjaz87Ci0gICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICBjYXNlIDI3OgotICAgICAgICAgIC8qIDxyZXMxPiA8cmVzMj4gPHZhbDE+IDx2YWwyPiA0IDI3IGNhbGxvdGhlcnN1YnIgcG9wICovCi0gICAgICAgICAgLyogPT0+IHB1c2ggPHJlczE+IG9udG8gVDEgc3RhY2sgaWYgPHZhbDE+IDw9IDx2YWwyPiwgKi8KLSAgICAgICAgICAvKiAgICAgb3RoZXJ3aXNlIHB1c2ggPHJlczI+ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSA0ICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBpZiAoIHRvcFsyXSA+IHRvcFszXSApCi0gICAgICAgICAgICB0b3BbMF0gPSB0b3BbMV07Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAvKiAwIDI4IGNhbGxvdGhlcnN1YnIgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogPT4gcHVzaCByYW5kb20gdmFsdWUgZnJvbSBpbnRlcnZhbCBbMCwgMSkgb250byBzdGFjayAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAwICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgUmFuZDsKLQotCi0gICAgICAgICAgICBSYW5kID0gc2VlZDsKLSAgICAgICAgICAgIGlmICggUmFuZCA+PSAweDgwMDBMICkKLSAgICAgICAgICAgICAgUmFuZCsrOwotCi0gICAgICAgICAgICB0b3BbMF0gPSBSYW5kOwotCi0gICAgICAgICAgICBzZWVkID0gRlRfTXVsRml4KCBzZWVkLCAweDEwMDAwTCAtIHNlZWQgKTsKLSAgICAgICAgICAgIGlmICggc2VlZCA9PSAwICkKLSAgICAgICAgICAgICAgc2VlZCArPSAweDI4NzM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAxOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaWYgKCBhcmdfY250ID49IDAgJiYgc3Vicl9ubyA+PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiB1bmtub3duIG90aGVyc3ViciBbJWQgJWRdLCB3aXNoIG1lIGx1Y2tcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGFyZ19jbnQsIHN1YnJfbm8gKSk7Ci0gICAgICAgICAgICB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gYXJnX2NudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgICAgICBVbmV4cGVjdGVkX090aGVyU3VicjoKLSAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBvdGhlcnN1YnIgWyVkICVkXVxuIiwgYXJnX2NudCwgc3Vicl9ubyApKTsKLSAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHRvcCArPSBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudDsKLQotICAgICAgICBkZWNvZGVyLT50b3AgPSB0b3A7Ci0gICAgICB9Ci0gICAgICBlbHNlICAvKiBnZW5lcmFsIG9wZXJhdG9yICovCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgbnVtX2FyZ3MgPSB0MV9hcmdzX2NvdW50W29wXTsKLQotCi0gICAgICAgIEZUX0FTU0VSVCggbnVtX2FyZ3MgPj0gMCApOwotCi0gICAgICAgIGlmICggdG9wIC0gZGVjb2Rlci0+c3RhY2sgPCBudW1fYXJncyApCi0gICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgLyogWFhYIE9wZXJhdG9ycyB1c3VhbGx5IHRha2UgdGhlaXIgb3BlcmFuZHMgZnJvbSB0aGUgICAgICAgICovCi0gICAgICAgIC8qICAgICBib3R0b20gb2YgdGhlIHN0YWNrLCBpLmUuLCB0aGUgb3BlcmFuZHMgYXJlICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgZGVjb2Rlci0+c3RhY2tbMF0sIC4uLiwgZGVjb2Rlci0+c3RhY2tbbnVtX2FyZ3MgLSAxXTsgKi8KLSAgICAgICAgLyogICAgIG9ubHkgZGl2LCBjYWxsc3ViciwgYW5kIGNhbGxvdGhlcnN1YnIgYXJlIGRpZmZlcmVudC4gICovCi0gICAgICAgIC8qICAgICBJbiBwcmFjdGljZSBpdCBkb2Vzbid0IG1hdHRlciAoPykuICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotICAgICAgICBzd2l0Y2ggKCBvcCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBvcF9jYWxsc3VicjoKLSAgICAgICAgY2FzZSBvcF9kaXY6Ci0gICAgICAgIGNhc2Ugb3BfY2FsbG90aGVyc3VicjoKLSAgICAgICAgY2FzZSBvcF9wb3A6Ci0gICAgICAgIGNhc2Ugb3BfcmV0dXJuOgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaWYgKCB0b3AgLSBkZWNvZGVyLT5zdGFjayAhPSBudW1fYXJncyApCi0gICAgICAgICAgICBGVF9UUkFDRTAoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBtdWNoIG9wZXJhbmRzIG9uIHRoZSBzdGFjayIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgKHNlZW4gJWQsIGV4cGVjdGVkICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCAtIGRlY29kZXItPnN0YWNrLCBudW1fYXJncyApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0gICAgICAgIHRvcCAtPSBudW1fYXJnczsKLQotICAgICAgICBzd2l0Y2ggKCBvcCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBvcF9lbmRjaGFyOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZW5kY2hhclxuIiApKTsKLQotICAgICAgICAgIHQxX2J1aWxkZXJfY2xvc2VfY29udG91ciggYnVpbGRlciApOwotCi0gICAgICAgICAgLyogY2xvc2UgaGludHMgcmVjb3JkaW5nIHNlc3Npb24gKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBoaW50ZXItPmNsb3NlKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cyApICkKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0KLSAgICAgICAgICAgIC8qIGFwcGx5IGhpbnRzIHRvIHRoZSBsb2FkZWQgZ2x5cGggb3V0bGluZSBub3cgKi8KLSAgICAgICAgICAgIGVycm9yID0gaGludGVyLT5hcHBseSggaGludGVyLT5oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci0+Y3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTSF9HbG9iYWxzKWJ1aWxkZXItPmhpbnRzX2dsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmhpbnRfbW9kZSApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBhZGQgY3VycmVudCBvdXRsaW5lIHRvIHRoZSBnbHlwaCBzbG90ICovCi0gICAgICAgICAgRlRfR2x5cGhMb2FkZXJfQWRkKCBidWlsZGVyLT5sb2FkZXIgKTsKLQotICAgICAgICAgIC8qIHRoZSBjb21waWxlciBzaG91bGQgb3B0aW1pemUgYXdheSB0aGlzIGVtcHR5IGxvb3AgYnV0IC4uLiAqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotICAgICAgICAgIGlmICggZGVjb2Rlci0+bGVuX2J1aWxkY2hhciA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIkJ1aWxkQ2hhckFycmF5ID0gWyAiICkpOwotCi0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGRlY29kZXItPmxlbl9idWlsZGNoYXI7IGkrKyApCi0gICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIlZCAiLCBkZWNvZGVyLT5idWlsZGNoYXJbaV0gKSk7Ci0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICJdXG4iICkpOwotICAgICAgICAgIH0KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotCi0gICAgICAgICAgLyogcmV0dXJuIG5vdyEgKi8KLSAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICAgIGNhc2Ugb3BfaHNidzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhzYnciICkpOwotCi0gICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX1dpZHRoOwotCi0gICAgICAgICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnggPSBBRERfTE9ORyggYnVpbGRlci0+bGVmdF9iZWFyaW5nLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wWzBdICk7Ci0KLSAgICAgICAgICBidWlsZGVyLT5hZHZhbmNlLnggPSB0b3BbMV07Ci0gICAgICAgICAgYnVpbGRlci0+YWR2YW5jZS55ID0gMDsKLQotICAgICAgICAgIG9yaWdfeCA9IHggPSBBRERfTE9ORyggYnVpbGRlci0+cG9zX3gsIHRvcFswXSApOwotICAgICAgICAgIG9yaWdfeSA9IHkgPSBidWlsZGVyLT5wb3NfeTsKLQotICAgICAgICAgIEZUX1VOVVNFRCggb3JpZ195ICk7Ci0KLSAgICAgICAgICAvKiB0aGUgYG1ldHJpY3Nfb25seScgaW5kaWNhdGVzIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgKi8KLSAgICAgICAgICAvKiB0aGUgZ2x5cGgncyBtZXRyaWNzIChsc2IgKyBhZHZhbmNlIHdpZHRoKSwgbm90IGxvYWQgdGhlICAgKi8KLSAgICAgICAgICAvKiByZXN0IG9mIGl0OyBzbyBleGl0IGltbWVkaWF0ZWx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGJ1aWxkZXItPm1ldHJpY3Nfb25seSApCi0gICAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9zZWFjOgotICAgICAgICAgIHJldHVybiB0MW9wZXJhdG9yX3NlYWMoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4MkludCggdG9wWzNdICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4MkludCggdG9wWzRdICkgKTsKLQotICAgICAgICBjYXNlIG9wX3NidzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHNidyIgKSk7Ci0KLSAgICAgICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX0hhdmVfV2lkdGg7Ci0KLSAgICAgICAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCA9IEFERF9MT05HKCBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbMF0gKTsKLSAgICAgICAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueSA9IEFERF9MT05HKCBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbMV0gKTsKLQotICAgICAgICAgIGJ1aWxkZXItPmFkdmFuY2UueCA9IHRvcFsyXTsKLSAgICAgICAgICBidWlsZGVyLT5hZHZhbmNlLnkgPSB0b3BbM107Ci0KLSAgICAgICAgICB4ID0gQUREX0xPTkcoIGJ1aWxkZXItPnBvc194LCB0b3BbMF0gKTsKLSAgICAgICAgICB5ID0gQUREX0xPTkcoIGJ1aWxkZXItPnBvc195LCB0b3BbMV0gKTsKLQotICAgICAgICAgIC8qIHRoZSBgbWV0cmljc19vbmx5JyBpbmRpY2F0ZXMgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gY29tcHV0ZSAqLwotICAgICAgICAgIC8qIHRoZSBnbHlwaCdzIG1ldHJpY3MgKGxzYiArIGFkdmFuY2Ugd2lkdGgpLCBub3QgbG9hZCB0aGUgICAqLwotICAgICAgICAgIC8qIHJlc3Qgb2YgaXQ7IHNvIGV4aXQgaW1tZWRpYXRlbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggYnVpbGRlci0+bWV0cmljc19vbmx5ICkKLSAgICAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2Nsb3NlcGF0aDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNsb3NlcGF0aCIgKSk7Ci0KLSAgICAgICAgICAvKiBpZiB0aGVyZSBpcyBubyBwYXRoLCBgY2xvc2VwYXRoJyBpcyBhIG5vLW9wICovCi0gICAgICAgICAgaWYgKCBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9PSBUMV9QYXJzZV9IYXZlX1BhdGggICB8fAotICAgICAgICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPT0gVDFfUGFyc2VfSGF2ZV9Nb3ZldG8gKQotICAgICAgICAgICAgdDFfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBidWlsZGVyICk7Ci0KLSAgICAgICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX0hhdmVfV2lkdGg7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9obGluZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaGxpbmV0byIgKSk7Ci0KLSAgICAgICAgICBpZiAoIEZUX1NFVF9FUlJPUiggdDFfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgeCA9IEFERF9MT05HKCB4LCB0b3BbMF0gKTsKLSAgICAgICAgICBnb3RvIEFkZF9MaW5lOwotCi0gICAgICAgIGNhc2Ugb3BfaG1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhtb3ZldG8iICkpOwotCi0gICAgICAgICAgeCA9IEFERF9MT05HKCB4LCB0b3BbMF0gKTsKLQotICAgICAgICAgIGlmICggIWRlY29kZXItPmZsZXhfc3RhdGUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggYnVpbGRlci0+cGFyc2Vfc3RhdGUgPT0gVDFfUGFyc2VfU3RhcnQgKQotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIGJ1aWxkZXItPnBhcnNlX3N0YXRlID0gVDFfUGFyc2VfSGF2ZV9Nb3ZldG87Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfaHZjdXJ2ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaHZjdXJ2ZXRvIiApKTsKLQotICAgICAgICAgIGlmICggRlRfU0VUX0VSUk9SKCB0MV9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgKSB8fAotICAgICAgICAgICAgICAgRlRfU0VUX0VSUk9SKCB0MV9idWlsZGVyX2NoZWNrX3BvaW50cyggYnVpbGRlciwgMyApICkgICApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIHRvcFswXSApOwotICAgICAgICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIHRvcFsxXSApOwotICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgdG9wWzJdICk7Ci0gICAgICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgdG9wWzNdICk7Ci0gICAgICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3JsaW5ldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBybGluZXRvIiApKTsKLQotICAgICAgICAgIGlmICggRlRfU0VUX0VSUk9SKCB0MV9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIHRvcFswXSApOwotICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgdG9wWzFdICk7Ci0KLSAgICAgICAgQWRkX0xpbmU6Ci0gICAgICAgICAgaWYgKCBGVF9TRVRfRVJST1IoIHQxX2J1aWxkZXJfYWRkX3BvaW50MSggYnVpbGRlciwgeCwgeSApICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3Bfcm1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJtb3ZldG8iICkpOwotCi0gICAgICAgICAgeCA9IEFERF9MT05HKCB4LCB0b3BbMF0gKTsKLSAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIHRvcFsxXSApOwotCi0gICAgICAgICAgaWYgKCAhZGVjb2Rlci0+ZmxleF9zdGF0ZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9PSBUMV9QYXJzZV9TdGFydCApCi0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX01vdmV0bzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9ycmN1cnZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBycmN1cnZldG8iICkpOwotCi0gICAgICAgICAgaWYgKCBGVF9TRVRfRVJST1IoIHQxX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApIHx8Ci0gICAgICAgICAgICAgICBGVF9TRVRfRVJST1IoIHQxX2J1aWxkZXJfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAzICkgKSAgICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgdG9wWzBdICk7Ci0gICAgICAgICAgeSA9IEFERF9MT05HKCB5LCB0b3BbMV0gKTsKLSAgICAgICAgICB0MV9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgeCA9IEFERF9MT05HKCB4LCB0b3BbMl0gKTsKLSAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIHRvcFszXSApOwotICAgICAgICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIHRvcFs0XSApOwotICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgdG9wWzVdICk7Ci0gICAgICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3ZoY3VydmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHZoY3VydmV0byIgKSk7Ci0KLSAgICAgICAgICBpZiAoIEZUX1NFVF9FUlJPUiggdDFfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkgfHwKLSAgICAgICAgICAgICAgIEZUX1NFVF9FUlJPUiggdDFfYnVpbGRlcl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIDMgKSApICAgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgeSA9IEFERF9MT05HKCB5LCB0b3BbMF0gKTsKLSAgICAgICAgICB0MV9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgeCA9IEFERF9MT05HKCB4LCB0b3BbMV0gKTsKLSAgICAgICAgICB5ID0gQUREX0xPTkcoIHksIHRvcFsyXSApOwotICAgICAgICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIHRvcFszXSApOwotICAgICAgICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF92bGluZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgdmxpbmV0byIgKSk7Ci0KLSAgICAgICAgICBpZiAoIEZUX1NFVF9FUlJPUiggdDFfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgeSA9IEFERF9MT05HKCB5LCB0b3BbMF0gKTsKLSAgICAgICAgICBnb3RvIEFkZF9MaW5lOwotCi0gICAgICAgIGNhc2Ugb3Bfdm1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHZtb3ZldG8iICkpOwotCi0gICAgICAgICAgeSA9IEFERF9MT05HKCB5LCB0b3BbMF0gKTsKLQotICAgICAgICAgIGlmICggIWRlY29kZXItPmZsZXhfc3RhdGUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggYnVpbGRlci0+cGFyc2Vfc3RhdGUgPT0gVDFfUGFyc2VfU3RhcnQgKQotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIGJ1aWxkZXItPnBhcnNlX3N0YXRlID0gVDFfUGFyc2VfSGF2ZV9Nb3ZldG87Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfZGl2OgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZGl2IiApKTsKLQotICAgICAgICAgIC8qIGlmIGBsYXJnZV9pbnQnIGlzIHNldCwgd2UgZGl2aWRlIHVuc2NhbGVkIG51bWJlcnM7ICovCi0gICAgICAgICAgLyogb3RoZXJ3aXNlLCB3ZSBkaXZpZGUgbnVtYmVycyBpbiAxNi4xNiBmb3JtYXQgLS0gICAgKi8KLSAgICAgICAgICAvKiBpbiBib3RoIGNhc2VzLCBpdCBpcyB0aGUgc2FtZSBvcGVyYXRpb24gICAgICAgICAgICAqLwotICAgICAgICAgICp0b3AgPSBGVF9EaXZGaXgoIHRvcFswXSwgdG9wWzFdICk7Ci0gICAgICAgICAgdG9wKys7Ci0KLSAgICAgICAgICBsYXJnZV9pbnQgPSBGQUxTRTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2NhbGxzdWJyOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgaWR4OwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbHN1YnIiICkpOwotCi0gICAgICAgICAgICBpZHggPSBGaXgySW50KCB0b3BbMF0gKTsKLQotICAgICAgICAgICAgaWYgKCBkZWNvZGVyLT5zdWJyc19oYXNoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2l6ZV90KiAgdmFsID0gZnRfaGFzaF9udW1fbG9va3VwKCBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+c3VicnNfaGFzaCApOwotCi0KLSAgICAgICAgICAgICAgaWYgKCB2YWwgKQotICAgICAgICAgICAgICAgIGlkeCA9ICp2YWw7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZHggPSAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBkZWNvZGVyLT5udW1fc3VicnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgc3VicnMgaW5kZXhcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHpvbmUgLSBkZWNvZGVyLT56b25lcyA+PSBUMV9NQVhfU1VCUlNfQ0FMTFMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBtYW55IG5lc3RlZCBzdWJyc1xuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHpvbmUtPmN1cnNvciA9IGlwOyAgLyogc2F2ZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgKi8KLQotICAgICAgICAgICAgem9uZSsrOwotCi0gICAgICAgICAgICAvKiBUaGUgVHlwZSAxIGRyaXZlciBzdG9yZXMgc3Vicm91dGluZXMgd2l0aG91dCB0aGUgc2VlZCBieXRlcy4gKi8KLSAgICAgICAgICAgIC8qIFRoZSBDSUQgZHJpdmVyIHN0b3JlcyBzdWJyb3V0aW5lcyB3aXRoIHNlZWQgYnl0ZXMuICBUaGlzICAgICAqLwotICAgICAgICAgICAgLyogY2FzZSBpcyB0YWtlbiBjYXJlIG9mIHdoZW4gZGVjb2Rlci0+c3VicnNfbGVuID09IDAuICAgICAgICAgICovCi0gICAgICAgICAgICB6b25lLT5iYXNlID0gZGVjb2Rlci0+c3VicnNbaWR4XTsKLQotICAgICAgICAgICAgaWYgKCBkZWNvZGVyLT5zdWJyc19sZW4gKQotICAgICAgICAgICAgICB6b25lLT5saW1pdCA9IHpvbmUtPmJhc2UgKyBkZWNvZGVyLT5zdWJyc19sZW5baWR4XTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogV2UgYXJlIHVzaW5nIHN1YnJvdXRpbmVzIGZyb20gYSBDSUQgZm9udC4gIFdlIG11c3QgYWRqdXN0ICovCi0gICAgICAgICAgICAgIC8qIGZvciB0aGUgc2VlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICB6b25lLT5iYXNlICArPSAoIGRlY29kZXItPmxlbklWID49IDAgPyBkZWNvZGVyLT5sZW5JViA6IDAgKTsKLSAgICAgICAgICAgICAgem9uZS0+bGltaXQgID0gZGVjb2Rlci0+c3VicnNbaWR4ICsgMV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHpvbmUtPmN1cnNvciA9IHpvbmUtPmJhc2U7Ci0KLSAgICAgICAgICAgIGlmICggIXpvbmUtPmJhc2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGludm9raW5nIGVtcHR5IHN1YnJzXG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVjb2Rlci0+em9uZSA9IHpvbmU7Ci0gICAgICAgICAgICBpcCAgICAgICAgICAgID0gem9uZS0+YmFzZTsKLSAgICAgICAgICAgIGxpbWl0ICAgICAgICAgPSB6b25lLT5saW1pdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIG9wX3BvcDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHBvcCIgKSk7Ci0KLSAgICAgICAgICBpZiAoIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQtLTsKLSAgICAgICAgICAgIC8qIGlnbm9yZSwgd2UgcHVzaGVkIHRoZSBvcGVyYW5kcyBvdXJzZWx2ZXMgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggdW5rbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiBubyBtb3JlIG9wZXJhbmRzIGZvciBvdGhlcnN1YnJcbiIgKSk7Ci0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250LS07Ci0gICAgICAgICAgdG9wKys7ICAgLyogYHB1c2gnIHRoZSBvcGVyYW5kIHRvIGNhbGxvdGhlcnN1YnIgb250byB0aGUgc3RhY2sgKi8KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3JldHVybjoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJldHVybiIgKSk7Ci0KLSAgICAgICAgICBpZiAoIHpvbmUgPD0gZGVjb2Rlci0+em9uZXMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAiIHVuZXhwZWN0ZWQgcmV0dXJuXG4iICkpOwotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgem9uZS0tOwotICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5jdXJzb3I7Ci0gICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgIGRlY29kZXItPnpvbmUgPSB6b25lOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfZG90c2VjdGlvbjoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGRvdHNlY3Rpb24iICkpOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9oc3RlbToKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhzdGVtIiApKTsKLQotICAgICAgICAgIC8qIHJlY29yZCBob3Jpem9udGFsIGhpbnQgKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogdG9wWzBdICs9IGJ1aWxkZXItPmxlZnRfYmVhcmluZy55OyAqLwotICAgICAgICAgICAgaGludGVyLT5zdGVtKCBoaW50ZXItPmhpbnRzLCAxLCB0b3AgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9oc3RlbTM6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBoc3RlbTMiICkpOwotCi0gICAgICAgICAgLyogcmVjb3JkIGhvcml6b250YWwgY291bnRlci1jb250cm9sbGVkIGhpbnRzICovCi0gICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgICAgaGludGVyLT5zdGVtMyggaGludGVyLT5oaW50cywgMSwgdG9wICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF92c3RlbToKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHZzdGVtIiApKTsKLQotICAgICAgICAgIC8qIHJlY29yZCB2ZXJ0aWNhbCBoaW50ICovCi0gICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRvcFswXSA9IEFERF9MT05HKCB0b3BbMF0sIG9yaWdfeCApOwotICAgICAgICAgICAgaGludGVyLT5zdGVtKCBoaW50ZXItPmhpbnRzLCAwLCB0b3AgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF92c3RlbTM6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiB2c3RlbTMiICkpOwotCi0gICAgICAgICAgLyogcmVjb3JkIHZlcnRpY2FsIGNvdW50ZXItY29udHJvbGxlZCBoaW50cyAqLwotICAgICAgICAgIGlmICggaGludGVyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIGR4ID0gb3JpZ194OwotCi0KLSAgICAgICAgICAgIHRvcFswXSA9IEFERF9MT05HKCB0b3BbMF0sIGR4ICk7Ci0gICAgICAgICAgICB0b3BbMl0gPSBBRERfTE9ORyggdG9wWzJdLCBkeCApOwotICAgICAgICAgICAgdG9wWzRdID0gQUREX0xPTkcoIHRvcFs0XSwgZHggKTsKLSAgICAgICAgICAgIGhpbnRlci0+c3RlbTMoIGhpbnRlci0+aGludHMsIDAsIHRvcCApOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3NldGN1cnJlbnRwb2ludDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHNldGN1cnJlbnRwb2ludCIgKSk7Ci0KLSAgICAgICAgICAvKiBGcm9tIHRoZSBUMSBzcGVjaWZpY2F0aW9uLCBzZWN0aW9uIDYuNDogICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIFRoZSBzZXRjdXJyZW50cG9pbnQgY29tbWFuZCBpcyB1c2VkIG9ubHkgaW4gICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIGNvbmp1bmN0aW9uIHdpdGggcmVzdWx0cyBmcm9tIE90aGVyU3VicnMgcHJvY2VkdXJlcy4gKi8KLQotICAgICAgICAgIC8qIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ICE9IDAgaXMgYWxyZWFkeSBoYW5kbGVkICAgICAqLwotICAgICAgICAgIC8qIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgLyogTm90ZSwgaG93ZXZlciwgdGhhdCBib3RoIEdob3N0c2NyaXB0IGFuZCBBZG9iZSAgICAgICAgICovCi0gICAgICAgICAgLyogRGlzdGlsbGVyIGhhbmRsZSB0aGlzIHNpdHVhdGlvbiBieSBzaWxlbnRseSBpZ25vcmluZyAgICovCi0gICAgICAgICAgLyogdGhlIGluYXBwcm9wcmlhdGUgYHNldGN1cnJlbnRwb2ludCcgaW5zdHJ1Y3Rpb24uICBTbyAgICovCi0gICAgICAgICAgLyogd2UgZG8gdGhlIHNhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgMAotCi0gICAgICAgICAgaWYgKCBkZWNvZGVyLT5mbGV4X3N0YXRlICE9IDEgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAiIHVuZXhwZWN0ZWQgYHNldGN1cnJlbnRwb2ludCdcbiIgKSk7Ci0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgLi4uCi0jZW5kaWYKLQotICAgICAgICAgIHggPSB0b3BbMF07Ci0gICAgICAgICAgeSA9IHRvcFsxXTsKLSAgICAgICAgICBkZWNvZGVyLT5mbGV4X3N0YXRlID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3Vua25vd24xNToKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIG9wY29kZV8xNSIgKSk7Ci0gICAgICAgICAgLyogbm90aGluZyB0byBkbyBleGNlcHQgdG8gcG9wIHRoZSB0d28gYXJndW1lbnRzICovCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICIgdW5oYW5kbGVkIG9wY29kZSAlZFxuIiwgb3AgKSk7Ci0gICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBYWFggT3BlcmF0b3JzIHVzdWFsbHkgY2xlYXIgdGhlIG9wZXJhbmQgc3RhY2s7ICAqLwotICAgICAgICAvKiAgICAgb25seSBkaXYsIGNhbGxzdWJyLCBjYWxsb3RoZXJzdWJyLCBwb3AsIGFuZCAqLwotICAgICAgICAvKiAgICAgcmV0dXJuIGFyZSBkaWZmZXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgSW4gcHJhY3RpY2UgaXQgZG9lc24ndCBtYXR0ZXIgKD8pLiAgICAgICAgICAqLwotCi0gICAgICAgIGRlY29kZXItPnRvcCA9IHRvcDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0gICAgICAgIGJvbCA9IFRSVUU7Ci0jZW5kaWYKLQotICAgICAgfSAvKiBnZW5lcmFsIG9wZXJhdG9yIHByb2Nlc3NpbmcgKi8KLQotICAgIH0gLyogd2hpbGUgaXAgPCBsaW1pdCAqLwotCi0gICAgRlRfVFJBQ0U0KCggIi4uZW5kLi5cblxuIiApKTsKLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLQotICBTeW50YXhfRXJyb3I6Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLQotICBTdGFja19VbmRlcmZsb3c6Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBTdGFja19VbmRlcmZsb3cgKTsKLSAgfQotCi0KLSAgLyogcGFyc2UgYSBzaW5nbGUgVHlwZSAxIGdseXBoICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9kZWNvZGVyX3BhcnNlX2dseXBoKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaCApCi0gIHsKLSAgICByZXR1cm4gZGVjb2Rlci0+cGFyc2VfY2FsbGJhY2soIGRlY29kZXIsIGdseXBoICk7Ci0gIH0KLQotCi0gIC8qIGluaXRpYWxpemUgVDEgZGVjb2RlciAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdDFfZGVjb2Rlcl9pbml0KCBUMV9EZWNvZGVyICAgICAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgICAgICAgICAgIGdseXBoX25hbWVzLAotICAgICAgICAgICAgICAgICAgIFBTX0JsZW5kICAgICAgICAgICAgIGJsZW5kLAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgIGhpbnRpbmcsCi0gICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgICAgaGludF9tb2RlLAotICAgICAgICAgICAgICAgICAgIFQxX0RlY29kZXJfQ2FsbGJhY2sgIHBhcnNlX2NhbGxiYWNrICkKLSAgewotICAgIEZUX1pFUk8oIGRlY29kZXIgKTsKLQotICAgIC8qIHJldHJpZXZlIFBTTmFtZXMgaW50ZXJmYWNlIGZyb20gbGlzdCBvZiBjdXJyZW50IG1vZHVsZXMgKi8KLSAgICB7Ci0gICAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0KLQotICAgICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwc25hbWVzLCBQT1NUU0NSSVBUX0NNQVBTICk7Ci0gICAgICBpZiAoICFwc25hbWVzICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9pbml0OiIKLSAgICAgICAgICAgICAgICAgICAiIHRoZSBgcHNuYW1lcycgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGVcbiIgKSk7Ci0gICAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgICB9Ci0KLSAgICAgIGRlY29kZXItPnBzbmFtZXMgPSBwc25hbWVzOwotICAgIH0KLQotICAgIHQxX2J1aWxkZXJfaW5pdCggJmRlY29kZXItPmJ1aWxkZXIsIGZhY2UsIHNpemUsIHNsb3QsIGhpbnRpbmcgKTsKLQotICAgIC8qIGRlY29kZXItPmJ1aWxkY2hhciBhbmQgZGVjb2Rlci0+bGVuX2J1aWxkY2hhciBoYXZlIHRvIGJlICAqLwotICAgIC8qIGluaXRpYWxpemVkIGJ5IHRoZSBjYWxsZXIgc2luY2Ugd2UgY2Fubm90IGtub3cgdGhlIGxlbmd0aCAqLwotICAgIC8qIG9mIHRoZSBCdWlsZENoYXJBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgZGVjb2Rlci0+bnVtX2dseXBocyAgICAgPSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzOwotICAgIGRlY29kZXItPmdseXBoX25hbWVzICAgID0gZ2x5cGhfbmFtZXM7Ci0gICAgZGVjb2Rlci0+aGludF9tb2RlICAgICAgPSBoaW50X21vZGU7Ci0gICAgZGVjb2Rlci0+YmxlbmQgICAgICAgICAgPSBibGVuZDsKLSAgICBkZWNvZGVyLT5wYXJzZV9jYWxsYmFjayA9IHBhcnNlX2NhbGxiYWNrOwotCi0gICAgZGVjb2Rlci0+ZnVuY3MgICAgICAgICAgPSB0MV9kZWNvZGVyX2Z1bmNzOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogZmluYWxpemUgVDEgZGVjb2RlciAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0MV9kZWNvZGVyX2RvbmUoIFQxX0RlY29kZXIgIGRlY29kZXIgKQotICB7Ci0gICAgdDFfYnVpbGRlcl9kb25lKCAmZGVjb2Rlci0+YnVpbGRlciApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvdDFkZWNvZGUuaCBiL3NyYy9wc2F1eC90MWRlY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMyN2RlLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC90MWRlY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFkZWNvZGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgVHlwZSAxIGRlY29kaW5nIHJvdXRpbmVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFQxREVDT0RFX0hfCi0jZGVmaW5lIFQxREVDT0RFX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRQotICBjb25zdCBUMV9EZWNvZGVyX0Z1bmNzUmVjICB0MV9kZWNvZGVyX2Z1bmNzOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdDFfZGVjb2Rlcl9wYXJzZV9nbHlwaCggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXggKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZW4gKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0MV9kZWNvZGVyX2luaXQoIFQxX0RlY29kZXIgICAgICAgICAgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICAgICAgICAgICAgZ2x5cGhfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgUFNfQmxlbmQgICAgICAgICAgICAgYmxlbmQsCi0gICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgICAgaGludGluZywKLSAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICAgICBoaW50X21vZGUsCi0gICAgICAgICAgICAgICAgICAgVDFfRGVjb2Rlcl9DYWxsYmFjayAgcGFyc2VfZ2x5cGggKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQxX2RlY29kZXJfZG9uZSggVDFfRGVjb2RlciAgZGVjb2RlciApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFQxREVDT0RFX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvSmFtZmlsZSBiL3NyYy9wc2hpbnRlci9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY1MjcxLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9wc2hpbnRlciBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgcHNoaW50ZXIgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IHBzaGFsZ28KLSAgICAgICAgICAgICAgIHBzaGdsb2IKLSAgICAgICAgICAgICAgIHBzaG1vZAotICAgICAgICAgICAgICAgcHNocGljCi0gICAgICAgICAgICAgICBwc2hyZWMKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHBzaGludGVyIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3BzaGludGVyIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9tb2R1bGUubWsgYi9zcmMvcHNoaW50ZXIvbW9kdWxlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2UzNWM0Li4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9tb2R1bGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgUFNIaW50ZXIgbW9kdWxlIGRlZmluaXRpb24KLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLUZUTU9EVUxFX0hfQ09NTUFORFMgKz0gUFNISU5URVJfTU9EVUxFCi0KLWRlZmluZSBQU0hJTlRFUl9NT0RVTEUKLSQoT1BFTl9EUklWRVIpIEZUX01vZHVsZV9DbGFzcywgcHNoaW50ZXJfbW9kdWxlX2NsYXNzICQoQ0xPU0VfRFJJVkVSKQotJChFQ0hPX0RSSVZFUilwc2hpbnRlciAgJChFQ0hPX0RSSVZFUl9ERVNDKVBvc3RzY3JpcHQgaGludGVyIG1vZHVsZSQoRUNIT19EUklWRVJfRE9ORSkKLWVuZGVmCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNoYWxnby5jIGIvc3JjL3BzaGludGVyL3BzaGFsZ28uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkMWEzYS4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNoYWxnby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hhbGdvLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBoaW50aW5nIGFsZ29yaXRobSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLwotLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlICJwc2hhbGdvLmgiCi0KLSNpbmNsdWRlICJwc2hudGVyci5oIgotCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcHNoYWxnbzIKLQotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gIFBTSF9IaW50X1RhYmxlICBwc19kZWJ1Z19oaW50X3RhYmxlID0gTlVMTDsKLSAgUFNIX0hpbnRGdW5jICAgIHBzX2RlYnVnX2hpbnRfZnVuYyAgPSBOVUxMOwotICBQU0hfR2x5cGggICAgICAgcHNfZGVidWdfZ2x5cGggICAgICA9IE5VTEw7Ci0jZW5kaWYKLQotCi0jZGVmaW5lICBDT01QVVRFX0lORkxFWFMgIC8qIGNvbXB1dGUgaW5mbGVjdGlvbiBwb2ludHMgdG8gb3B0aW1pemUgYFMnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBzaW1pbGFyIGdseXBocyAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICBCQVNJQyBISU5UUyBSRUNPUkRJTkdTICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiByZXR1cm4gdHJ1ZSBpZiB0d28gc3RlbSBoaW50cyBvdmVybGFwICovCi0gIHN0YXRpYyBGVF9JbnQKLSAgcHNoX2hpbnRfb3ZlcmxhcCggUFNIX0hpbnQgIGhpbnQxLAotICAgICAgICAgICAgICAgICAgICBQU0hfSGludCAgaGludDIgKQotICB7Ci0gICAgcmV0dXJuIGhpbnQxLT5vcmdfcG9zICsgaGludDEtPm9yZ19sZW4gPj0gaGludDItPm9yZ19wb3MgJiYKLSAgICAgICAgICAgaGludDItPm9yZ19wb3MgKyBoaW50Mi0+b3JnX2xlbiA+PSBoaW50MS0+b3JnX3BvczsKLSAgfQotCi0KLSAgLyogZGVzdHJveSBoaW50cyB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF90YWJsZV9kb25lKCBQU0hfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRlJFRSggdGFibGUtPnpvbmVzICk7Ci0gICAgdGFibGUtPm51bV96b25lcyA9IDA7Ci0gICAgdGFibGUtPnpvbmUgICAgICA9IE5VTEw7Ci0KLSAgICBGVF9GUkVFKCB0YWJsZS0+c29ydCApOwotICAgIEZUX0ZSRUUoIHRhYmxlLT5oaW50cyApOwotICAgIHRhYmxlLT5udW1faGludHMgICA9IDA7Ci0gICAgdGFibGUtPm1heF9oaW50cyAgID0gMDsKLSAgICB0YWJsZS0+c29ydF9nbG9iYWwgPSBOVUxMOwotICB9Ci0KLQotICAvKiBkZWFjdGl2YXRlIGFsbCBoaW50cyBpbiBhIHRhYmxlICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9oaW50X3RhYmxlX2RlYWN0aXZhdGUoIFBTSF9IaW50X1RhYmxlICB0YWJsZSApCi0gIHsKLSAgICBGVF9VSW50ICAgY291bnQgPSB0YWJsZS0+bWF4X2hpbnRzOwotICAgIFBTSF9IaW50ICBoaW50ICA9IHRhYmxlLT5oaW50czsKLQotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGhpbnQrKyApCi0gICAgewotICAgICAgcHNoX2hpbnRfZGVhY3RpdmF0ZSggaGludCApOwotICAgICAgaGludC0+b3JkZXIgPSAtMTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlY29yZCBhIG5ldyBoaW50ICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9oaW50X3RhYmxlX3JlY29yZCggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBpZHggKQotICB7Ci0gICAgUFNIX0hpbnQgIGhpbnQgPSB0YWJsZS0+aGludHMgKyBpZHg7Ci0KLQotICAgIGlmICggaWR4ID49IHRhYmxlLT5tYXhfaGludHMgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMCgoICJwc2hfaGludF90YWJsZV9yZWNvcmQ6IGludmFsaWQgaGludCBpbmRleCAlZFxuIiwgaWR4ICkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGlnbm9yZSBhY3RpdmUgaGludHMgKi8KLSAgICBpZiAoIHBzaF9oaW50X2lzX2FjdGl2ZSggaGludCApICkKLSAgICAgIHJldHVybjsKLQotICAgIHBzaF9oaW50X2FjdGl2YXRlKCBoaW50ICk7Ci0KLSAgICAvKiBub3cgc2NhbiB0aGUgY3VycmVudCBhY3RpdmUgaGludCBzZXQgdG8gY2hlY2sgKi8KLSAgICAvKiB3aGV0aGVyIGBoaW50JyBvdmVybGFwcyB3aXRoIGFub3RoZXIgaGludCAgICAgKi8KLSAgICB7Ci0gICAgICBQU0hfSGludCogIHNvcnRlZCA9IHRhYmxlLT5zb3J0X2dsb2JhbDsKLSAgICAgIEZUX1VJbnQgICAgY291bnQgID0gdGFibGUtPm51bV9oaW50czsKLSAgICAgIFBTSF9IaW50ICAgaGludDI7Ci0KLQotICAgICAgaGludC0+cGFyZW50ID0gTlVMTDsKLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzb3J0ZWQrKyApCi0gICAgICB7Ci0gICAgICAgIGhpbnQyID0gc29ydGVkWzBdOwotCi0gICAgICAgIGlmICggcHNoX2hpbnRfb3ZlcmxhcCggaGludCwgaGludDIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBoaW50LT5wYXJlbnQgPSBoaW50MjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICggdGFibGUtPm51bV9oaW50cyA8IHRhYmxlLT5tYXhfaGludHMgKQotICAgICAgdGFibGUtPnNvcnRfZ2xvYmFsW3RhYmxlLT5udW1faGludHMrK10gPSBoaW50OwotICAgIGVsc2UKLSAgICAgIEZUX1RSQUNFMCgoICJwc2hfaGludF90YWJsZV9yZWNvcmQ6IHRvbyBtYW55IHNvcnRlZCBoaW50cyEgIEJVRyFcbiIgKSk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9oaW50X3RhYmxlX3JlY29yZF9tYXNrKCBQU0hfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19NYXNrICAgICAgICAgaGludF9tYXNrICkKLSAgewotICAgIEZUX0ludCAgICBtYXNrID0gMCwgdmFsID0gMDsKLSAgICBGVF9CeXRlKiAgY3Vyc29yID0gaGludF9tYXNrLT5ieXRlczsKLSAgICBGVF9VSW50ICAgaWR4LCBsaW1pdDsKLQotCi0gICAgbGltaXQgPSBoaW50X21hc2stPm51bV9iaXRzOwotCi0gICAgZm9yICggaWR4ID0gMDsgaWR4IDwgbGltaXQ7IGlkeCsrICkKLSAgICB7Ci0gICAgICBpZiAoIG1hc2sgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHZhbCAgPSAqY3Vyc29yKys7Ci0gICAgICAgIG1hc2sgPSAweDgwOwotICAgICAgfQotCi0gICAgICBpZiAoIHZhbCAmIG1hc2sgKQotICAgICAgICBwc2hfaGludF90YWJsZV9yZWNvcmQoIHRhYmxlLCBpZHggKTsKLQotICAgICAgbWFzayA+Pj0gMTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGNyZWF0ZSBoaW50cyB0YWJsZSAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNoX2hpbnRfdGFibGVfaW5pdCggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBQU19IaW50X1RhYmxlICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX01hc2tfVGFibGUgICBoaW50X21hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICBQU19NYXNrX1RhYmxlICAgY291bnRlcl9tYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9VSW50ICAgY291bnQ7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0gICAgRlRfVU5VU0VEKCBjb3VudGVyX21hc2tzICk7Ci0KLQotICAgIGNvdW50ID0gaGludHMtPm51bV9oaW50czsKLQotICAgIC8qIGFsbG9jYXRlIG91ciB0YWJsZXMgKi8KLSAgICBpZiAoIEZUX05FV19BUlJBWSggdGFibGUtPnNvcnQsICAyICogY291bnQgICAgICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggdGFibGUtPmhpbnRzLCAgICAgY291bnQgICAgICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggdGFibGUtPnpvbmVzLCAyICogY291bnQgKyAxICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgdGFibGUtPm1heF9oaW50cyAgID0gY291bnQ7Ci0gICAgdGFibGUtPnNvcnRfZ2xvYmFsID0gdGFibGUtPnNvcnQgKyBjb3VudDsKLSAgICB0YWJsZS0+bnVtX2hpbnRzICAgPSAwOwotICAgIHRhYmxlLT5udW1fem9uZXMgICA9IDA7Ci0gICAgdGFibGUtPnpvbmUgICAgICAgID0gTlVMTDsKLQotICAgIC8qIGluaXRpYWxpemUgdGhlIGB0YWJsZS0+aGludHMnIGFycmF5ICovCi0gICAgewotICAgICAgUFNIX0hpbnQgIHdyaXRlID0gdGFibGUtPmhpbnRzOwotICAgICAgUFNfSGludCAgIHJlYWQgID0gaGludHMtPmhpbnRzOwotCi0KLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB3cml0ZSsrLCByZWFkKysgKQotICAgICAgewotICAgICAgICB3cml0ZS0+b3JnX3BvcyA9IHJlYWQtPnBvczsKLSAgICAgICAgd3JpdGUtPm9yZ19sZW4gPSByZWFkLT5sZW47Ci0gICAgICAgIHdyaXRlLT5mbGFncyAgID0gcmVhZC0+ZmxhZ3M7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogd2Ugbm93IG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbml0aWFsIGBwYXJlbnQnIHN0ZW1zOyBmaXJzdCAgKi8KLSAgICAvKiBhY3RpdmF0ZSB0aGUgaGludHMgdGhhdCBhcmUgZ2l2ZW4gYnkgdGhlIGluaXRpYWwgaGludCBtYXNrcyAqLwotICAgIGlmICggaGludF9tYXNrcyApCi0gICAgewotICAgICAgUFNfTWFzayAgbWFzayA9IGhpbnRfbWFza3MtPm1hc2tzOwotCi0KLSAgICAgIGNvdW50ICAgICAgICAgICAgID0gaGludF9tYXNrcy0+bnVtX21hc2tzOwotICAgICAgdGFibGUtPmhpbnRfbWFza3MgPSBoaW50X21hc2tzOwotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgbWFzaysrICkKLSAgICAgICAgcHNoX2hpbnRfdGFibGVfcmVjb3JkX21hc2soIHRhYmxlLCBtYXNrICk7Ci0gICAgfQotCi0gICAgLyogZmluYWxseSwgZG8gYSBsaW5lYXIgcGFyc2UgaW4gY2FzZSBzb21lIGhpbnRzIHdlcmUgbGVmdCBhbG9uZSAqLwotICAgIGlmICggdGFibGUtPm51bV9oaW50cyAhPSB0YWJsZS0+bWF4X2hpbnRzICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBpZHg7Ci0KLQotICAgICAgRlRfVFJBQ0UwKCggInBzaF9oaW50X3RhYmxlX2luaXQ6IG1pc3NpbmcvaW5jb3JyZWN0IGhpbnQgbWFza3NcbiIgKSk7Ci0KLSAgICAgIGNvdW50ID0gdGFibGUtPm1heF9oaW50czsKLSAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKyApCi0gICAgICAgIHBzaF9oaW50X3RhYmxlX3JlY29yZCggdGFibGUsIGlkeCApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfdGFibGVfYWN0aXZhdGVfbWFzayggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19NYXNrICAgICAgICAgaGludF9tYXNrICkKLSAgewotICAgIEZUX0ludCAgICBtYXNrID0gMCwgdmFsID0gMDsKLSAgICBGVF9CeXRlKiAgY3Vyc29yID0gaGludF9tYXNrLT5ieXRlczsKLSAgICBGVF9VSW50ICAgaWR4LCBsaW1pdCwgY291bnQ7Ci0KLQotICAgIGxpbWl0ID0gaGludF9tYXNrLT5udW1fYml0czsKLSAgICBjb3VudCA9IDA7Ci0KLSAgICBwc2hfaGludF90YWJsZV9kZWFjdGl2YXRlKCB0YWJsZSApOwotCi0gICAgZm9yICggaWR4ID0gMDsgaWR4IDwgbGltaXQ7IGlkeCsrICkKLSAgICB7Ci0gICAgICBpZiAoIG1hc2sgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHZhbCAgPSAqY3Vyc29yKys7Ci0gICAgICAgIG1hc2sgPSAweDgwOwotICAgICAgfQotCi0gICAgICBpZiAoIHZhbCAmIG1hc2sgKQotICAgICAgewotICAgICAgICBQU0hfSGludCAgaGludCA9ICZ0YWJsZS0+aGludHNbaWR4XTsKLQotCi0gICAgICAgIGlmICggIXBzaF9oaW50X2lzX2FjdGl2ZSggaGludCApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgICAgIGNvdW50MjsKLQotI2lmIDAKLSAgICAgICAgICBQU0hfSGludCogIHNvcnQgPSB0YWJsZS0+c29ydDsKLSAgICAgICAgICBQU0hfSGludCAgIGhpbnQyOwotCi0KLSAgICAgICAgICBmb3IgKCBjb3VudDIgPSBjb3VudDsgY291bnQyID4gMDsgY291bnQyLS0sIHNvcnQrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgaGludDIgPSBzb3J0WzBdOwotICAgICAgICAgICAgaWYgKCBwc2hfaGludF9vdmVybGFwKCBoaW50LCBoaW50MiApICkKLSAgICAgICAgICAgICAgRlRfVFJBQ0UwKCggInBzaF9oaW50X3RhYmxlX2FjdGl2YXRlX21hc2s6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvdW5kIG92ZXJsYXBwaW5nIGhpbnRzXG4iICkpCi0gICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICBjb3VudDIgPSAwOwotI2VuZGlmCi0KLSAgICAgICAgICBpZiAoIGNvdW50MiA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwc2hfaGludF9hY3RpdmF0ZSggaGludCApOwotICAgICAgICAgICAgaWYgKCBjb3VudCA8IHRhYmxlLT5tYXhfaGludHMgKQotICAgICAgICAgICAgICB0YWJsZS0+c29ydFtjb3VudCsrXSA9IGhpbnQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIEZUX1RSQUNFMCgoICJwc2hfaGludF90YWJsZWFjdGl2YXRlX21hc2s6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBtYW55IGFjdGl2ZSBoaW50c1xuIiApKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgbWFzayA+Pj0gMTsKLSAgICB9Ci0gICAgdGFibGUtPm51bV9oaW50cyA9IGNvdW50OwotCi0gICAgLyogbm93LCBzb3J0IHRoZSBoaW50czsgdGhleSBhcmUgZ3VhcmFudGVlZCB0byBub3Qgb3ZlcmxhcCAqLwotICAgIC8qIHNvIHdlIGNhbiBjb21wYXJlIHRoZWlyICJvcmdfcG9zIiBmaWVsZCBkaXJlY3RseSAgICAgICAgKi8KLSAgICB7Ci0gICAgICBGVF9JbnQgICAgIGkxLCBpMjsKLSAgICAgIFBTSF9IaW50ICAgaGludDEsIGhpbnQyOwotICAgICAgUFNIX0hpbnQqICBzb3J0ID0gdGFibGUtPnNvcnQ7Ci0KLQotICAgICAgLyogYSBzaW1wbGUgYnViYmxlIHNvcnQgd2lsbCBkbywgc2luY2UgaW4gOTklIG9mIGNhc2VzLCB0aGUgaGludHMgKi8KLSAgICAgIC8qIHdpbGwgYmUgYWxyZWFkeSBzb3J0ZWQgLS0gYW5kIHRoZSBzb3J0IHdpbGwgYmUgbGluZWFyICAgICAgICAgICovCi0gICAgICBmb3IgKCBpMSA9IDE7IGkxIDwgKEZUX0ludCljb3VudDsgaTErKyApCi0gICAgICB7Ci0gICAgICAgIGhpbnQxID0gc29ydFtpMV07Ci0gICAgICAgIGZvciAoIGkyID0gaTEgLSAxOyBpMiA+PSAwOyBpMi0tICkKLSAgICAgICAgewotICAgICAgICAgIGhpbnQyID0gc29ydFtpMl07Ci0KLSAgICAgICAgICBpZiAoIGhpbnQyLT5vcmdfcG9zIDwgaGludDEtPm9yZ19wb3MgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBzb3J0W2kyICsgMV0gPSBoaW50MjsKLSAgICAgICAgICBzb3J0W2kyXSAgICAgPSBoaW50MTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgSElOVFMgR1JJRC1GSVRUSU5HIEFORCBPUFRJTUlaQVRJT04gICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAxCi0gIHN0YXRpYyBGVF9Qb3MKLSAgcHNoX2RpbWVuc2lvbl9xdWFudGl6ZV9sZW4oIFBTSF9EaW1lbnNpb24gIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIGRvX3NuYXBwaW5nICkKLSAgewotICAgIGlmICggbGVuIDw9IDY0ICkKLSAgICAgIGxlbiA9IDY0OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9Qb3MgIGRlbHRhID0gbGVuIC0gZGltLT5zdGR3LndpZHRoc1swXS5jdXI7Ci0KLQotICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICBkZWx0YSA9IC1kZWx0YTsKLQotICAgICAgaWYgKCBkZWx0YSA8IDQwICkKLSAgICAgIHsKLSAgICAgICAgbGVuID0gZGltLT5zdGR3LndpZHRoc1swXS5jdXI7Ci0gICAgICAgIGlmICggbGVuIDwgNDggKQotICAgICAgICAgIGxlbiA9IDQ4OwotICAgICAgfQotCi0gICAgICBpZiAoIGxlbiA8IDMgKiA2NCApCi0gICAgICB7Ci0gICAgICAgIGRlbHRhID0gKCBsZW4gJiA2MyApOwotICAgICAgICBsZW4gICY9IC02NDsKLQotICAgICAgICBpZiAoIGRlbHRhIDwgMTAgKQotICAgICAgICAgIGxlbiArPSBkZWx0YTsKLQotICAgICAgICBlbHNlIGlmICggZGVsdGEgPCAzMiApCi0gICAgICAgICAgbGVuICs9IDEwOwotCi0gICAgICAgIGVsc2UgaWYgKCBkZWx0YSA8IDU0ICkKLSAgICAgICAgICBsZW4gKz0gNTQ7Ci0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGxlbiArPSBkZWx0YTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgbGVuID0gRlRfUElYX1JPVU5EKCBsZW4gKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRvX3NuYXBwaW5nICkKLSAgICAgIGxlbiA9IEZUX1BJWF9ST1VORCggbGVuICk7Ci0KLSAgICByZXR1cm4gIGxlbjsKLSAgfQotI2VuZGlmIC8qIDAgKi8KLQotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNfc2ltcGxlX3NjYWxlKCBQU0hfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICAgIHNjYWxlLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgZGltZW5zaW9uICkKLSAgewotICAgIEZUX1VJbnQgIGNvdW50OwotCi0KLSAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgdGFibGUtPm1heF9oaW50czsgY291bnQrKyApCi0gICAgewotICAgICAgUFNIX0hpbnQgIGhpbnQgPSB0YWJsZS0+aGludHMgKyBjb3VudDsKLQotCi0gICAgICBoaW50LT5jdXJfcG9zID0gRlRfTXVsRml4KCBoaW50LT5vcmdfcG9zLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICBoaW50LT5jdXJfbGVuID0gRlRfTXVsRml4KCBoaW50LT5vcmdfbGVuLCBzY2FsZSApOwotCi0gICAgICBpZiAoIHBzX2RlYnVnX2hpbnRfZnVuYyApCi0gICAgICAgIHBzX2RlYnVnX2hpbnRfZnVuYyggaGludCwgZGltZW5zaW9uICk7Ci0gICAgfQotICB9Ci0KLSNlbmRpZiAvKiBERUJVR19ISU5URVIgKi8KLQotCi0gIHN0YXRpYyBGVF9GaXhlZAotICBwc2hfaGludF9zbmFwX3N0ZW1fc2lkZV9kZWx0YSggRlRfRml4ZWQgIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICBsZW4gKQotICB7Ci0gICAgRlRfRml4ZWQgIGRlbHRhMSA9IEZUX1BJWF9ST1VORCggcG9zICkgLSBwb3M7Ci0gICAgRlRfRml4ZWQgIGRlbHRhMiA9IEZUX1BJWF9ST1VORCggcG9zICsgbGVuICkgLSBwb3MgLSBsZW47Ci0KLQotICAgIGlmICggRlRfQUJTKCBkZWx0YTEgKSA8PSBGVF9BQlMoIGRlbHRhMiApICkKLSAgICAgIHJldHVybiBkZWx0YTE7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGRlbHRhMjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfYWxpZ24oIFBTSF9IaW50ICAgICBoaW50LAotICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgUFNIX0dseXBoICAgIGdseXBoICkKLSAgewotICAgIFBTSF9EaW1lbnNpb24gIGRpbSAgID0gJmdsb2JhbHMtPmRpbWVuc2lvbltkaW1lbnNpb25dOwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlID0gZGltLT5zY2FsZV9tdWx0OwotICAgIEZUX0ZpeGVkICAgICAgIGRlbHRhID0gZGltLT5zY2FsZV9kZWx0YTsKLQotCi0gICAgaWYgKCAhcHNoX2hpbnRfaXNfZml0dGVkKCBoaW50ICkgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgcG9zID0gRlRfTXVsRml4KCBoaW50LT5vcmdfcG9zLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICBGVF9Qb3MgIGxlbiA9IEZUX011bEZpeCggaGludC0+b3JnX2xlbiwgc2NhbGUgKTsKLQotICAgICAgRlRfSW50ICAgICAgICAgICAgZG9fc25hcHBpbmc7Ci0gICAgICBGVF9Qb3MgICAgICAgICAgICBmaXRfbGVuOwotICAgICAgUFNIX0FsaWdubWVudFJlYyAgYWxpZ247Ci0KLQotICAgICAgLyogaWdub3JlIHN0ZW0gYWxpZ25tZW50cyB3aGVuIHJlcXVlc3RlZCB0aHJvdWdoIHRoZSBoaW50IGZsYWdzICovCi0gICAgICBpZiAoICggZGltZW5zaW9uID09IDAgJiYgIWdseXBoLT5kb19ob3J6X2hpbnRzICkgfHwKLSAgICAgICAgICAgKCBkaW1lbnNpb24gPT0gMSAmJiAhZ2x5cGgtPmRvX3ZlcnRfaGludHMgKSApCi0gICAgICB7Ci0gICAgICAgIGhpbnQtPmN1cl9wb3MgPSBwb3M7Ci0gICAgICAgIGhpbnQtPmN1cl9sZW4gPSBsZW47Ci0KLSAgICAgICAgcHNoX2hpbnRfc2V0X2ZpdHRlZCggaGludCApOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIHBlcmZvcm0gc3RlbSBzbmFwcGluZyB3aGVuIHJlcXVlc3RlZCAtIHRoaXMgaXMgbmVjZXNzYXJ5Ci0gICAgICAgKiBmb3IgbW9ub2Nocm9tZSBhbmQgTENEIGhpbnRpbmcgbW9kZXMgb25seQotICAgICAgICovCi0gICAgICBkb19zbmFwcGluZyA9ICggZGltZW5zaW9uID09IDAgJiYgZ2x5cGgtPmRvX2hvcnpfc25hcHBpbmcgKSB8fAotICAgICAgICAgICAgICAgICAgICAoIGRpbWVuc2lvbiA9PSAxICYmIGdseXBoLT5kb192ZXJ0X3NuYXBwaW5nICk7Ci0KLSAgICAgIGhpbnQtPmN1cl9sZW4gPSBmaXRfbGVuID0gbGVuOwotCi0gICAgICAvKiBjaGVjayBibHVlIHpvbmVzIGZvciBob3Jpem9udGFsIHN0ZW1zICovCi0gICAgICBhbGlnbi5hbGlnbiAgICAgPSBQU0hfQkxVRV9BTElHTl9OT05FOwotICAgICAgYWxpZ24uYWxpZ25fYm90ID0gYWxpZ24uYWxpZ25fdG9wID0gMDsKLQotICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMSApCi0gICAgICAgIHBzaF9ibHVlc19zbmFwX3N0ZW0oICZnbG9iYWxzLT5ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX3BvcyArIGhpbnQtPm9yZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQtPm9yZ19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiApOwotCi0gICAgICBzd2l0Y2ggKCBhbGlnbi5hbGlnbiApCi0gICAgICB7Ci0gICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX1RPUDoKLSAgICAgICAgLyogdGhlIHRvcCBvZiB0aGUgc3RlbSBpcyBhbGlnbmVkIGFnYWluc3QgYSBibHVlIHpvbmUgKi8KLSAgICAgICAgaGludC0+Y3VyX3BvcyA9IGFsaWduLmFsaWduX3RvcCAtIGZpdF9sZW47Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX0JPVDoKLSAgICAgICAgLyogdGhlIGJvdHRvbSBvZiB0aGUgc3RlbSBpcyBhbGlnbmVkIGFnYWluc3QgYSBibHVlIHpvbmUgKi8KLSAgICAgICAgaGludC0+Y3VyX3BvcyA9IGFsaWduLmFsaWduX2JvdDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fVE9QIHwgUFNIX0JMVUVfQUxJR05fQk9UOgotICAgICAgICAvKiBib3RoIGVkZ2VzIG9mIHRoZSBzdGVtIGFyZSBhbGlnbmVkIGFnYWluc3QgYmx1ZSB6b25lcyAqLwotICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fYm90OwotICAgICAgICBoaW50LT5jdXJfbGVuID0gYWxpZ24uYWxpZ25fdG9wIC0gYWxpZ24uYWxpZ25fYm90OwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgIFBTSF9IaW50ICBwYXJlbnQgPSBoaW50LT5wYXJlbnQ7Ci0KLQotICAgICAgICAgIGlmICggcGFyZW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIHBhcl9vcmdfY2VudGVyLCBwYXJfY3VyX2NlbnRlcjsKLSAgICAgICAgICAgIEZUX1BvcyAgY3VyX29yZ19jZW50ZXIsIGN1cl9kZWx0YTsKLQotCi0gICAgICAgICAgICAvKiBlbnN1cmUgdGhhdCBwYXJlbnQgaXMgYWxyZWFkeSBmaXR0ZWQgKi8KLSAgICAgICAgICAgIGlmICggIXBzaF9oaW50X2lzX2ZpdHRlZCggcGFyZW50ICkgKQotICAgICAgICAgICAgICBwc2hfaGludF9hbGlnbiggcGFyZW50LCBnbG9iYWxzLCBkaW1lbnNpb24sIGdseXBoICk7Ci0KLSAgICAgICAgICAgIC8qIGtlZXAgb3JpZ2luYWwgcmVsYXRpb24gYmV0d2VlbiBoaW50cywgdGhpcyBpcywgdXNlIHRoZSAqLwotICAgICAgICAgICAgLyogc2NhbGVkIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNlbnRlcnMgb2YgdGhlIGhpbnRzIHRvICAgICovCi0gICAgICAgICAgICAvKiBjb21wdXRlIHRoZSBuZXcgcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBhcl9vcmdfY2VudGVyID0gcGFyZW50LT5vcmdfcG9zICsgKCBwYXJlbnQtPm9yZ19sZW4gPj4gMSApOwotICAgICAgICAgICAgcGFyX2N1cl9jZW50ZXIgPSBwYXJlbnQtPmN1cl9wb3MgKyAoIHBhcmVudC0+Y3VyX2xlbiA+PiAxICk7Ci0gICAgICAgICAgICBjdXJfb3JnX2NlbnRlciA9IGhpbnQtPm9yZ19wb3MgICArICggaGludC0+b3JnX2xlbiAgID4+IDEgKTsKLQotICAgICAgICAgICAgY3VyX2RlbHRhID0gRlRfTXVsRml4KCBjdXJfb3JnX2NlbnRlciAtIHBhcl9vcmdfY2VudGVyLCBzY2FsZSApOwotICAgICAgICAgICAgcG9zICAgICAgID0gcGFyX2N1cl9jZW50ZXIgKyBjdXJfZGVsdGEgLSAoIGxlbiA+PiAxICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaGludC0+Y3VyX3BvcyA9IHBvczsKLSAgICAgICAgICBoaW50LT5jdXJfbGVuID0gZml0X2xlbjsKLQotICAgICAgICAgIC8qIFN0ZW0gYWRqdXN0bWVudCB0cmllcyB0byBzbmFwIHN0ZW0gd2lkdGhzIHRvIHN0YW5kYXJkCi0gICAgICAgICAgICogb25lcy4gIFRoaXMgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgdW5wbGVhc2FudCByb3VuZGluZwotICAgICAgICAgICAqIGFydGVmYWN0cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGdseXBoLT5kb19zdGVtX2FkanVzdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBsZW4gPD0gNjQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiB0aGUgc3RlbSBpcyBsZXNzIHRoYW4gb25lIHBpeGVsOyB3ZSB3aWxsIGNlbnRlciBpdAotICAgICAgICAgICAgICAgKiBhcm91bmQgdGhlIG5lYXJlc3QgcGl4ZWwgY2VudGVyCi0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBpZiAoIGxlbiA+PSAzMiApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIGFsc28gd2lkZW4gdGhlIHN0ZW0KLSAgICAgICAgICAgICAgICAgKiBhbmQgYWxpZ24gaXQgdG8gdGhlIHBpeGVsIGdyaWQuCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiAgIHN0ZW1fY2VudGVyICAgICAgICAgID0gcG9zICsgKGxlbi8yKQotICAgICAgICAgICAgICAgICAqICAgbmVhcmVzdF9waXhlbF9jZW50ZXIgPSBGVF9ST1VORChzdGVtX2NlbnRlci0zMikrMzIKLSAgICAgICAgICAgICAgICAgKiAgIG5ld19wb3MgICAgICAgICAgICAgID0gbmVhcmVzdF9waXhlbF9jZW50ZXItMzIKLSAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgID0gRlRfUk9VTkQoc3RlbV9jZW50ZXItMzIpCi0gICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICA9IEZUX0ZMT09SKHN0ZW1fY2VudGVyLTMyKzMyKQotICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgPSBGVF9GTE9PUihzdGVtX2NlbnRlcikKLSAgICAgICAgICAgICAgICAgKiAgIG5ld19sZW4gICAgICAgICAgICAgID0gNjQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwb3MgPSBGVF9QSVhfRkxPT1IoIHBvcyArICggbGVuID4+IDEgKSApOwotICAgICAgICAgICAgICAgIGxlbiA9IDY0OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKCBsZW4gPiAwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYSB2ZXJ5IHNtYWxsIHN0ZW07IHdlIHNpbXBseSBhbGlnbiBpdCB0byB0aGUKLSAgICAgICAgICAgICAgICAgKiBwaXhlbCBncmlkLCB0cnlpbmcgdG8gZmluZCB0aGUgbWluaW11bSBkaXNwbGFjZW1lbnQuCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiBsZWZ0ICAgICAgICAgICAgICAgPSBwb3MKLSAgICAgICAgICAgICAgICAgKiByaWdodCAgICAgICAgICAgICAgPSBwb3MgKyBsZW4KLSAgICAgICAgICAgICAgICAgKiBsZWZ0X25lYXJlc3RfZWRnZSAgPSBST1VORChwb3MpCi0gICAgICAgICAgICAgICAgICogcmlnaHRfbmVhcmVzdF9lZGdlID0gUk9VTkQocmlnaHQpCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiBpZiAoIEFCUyhsZWZ0X25lYXJlc3RfZWRnZSAtIGxlZnQpIDw9Ci0gICAgICAgICAgICAgICAgICogICAgICBBQlMocmlnaHRfbmVhcmVzdF9lZGdlIC0gcmlnaHQpICkKLSAgICAgICAgICAgICAgICAgKiAgICBuZXdfcG9zID0gbGVmdAotICAgICAgICAgICAgICAgICAqIGVsc2UKLSAgICAgICAgICAgICAgICAgKiAgICBuZXdfcG9zID0gcmlnaHQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBGVF9Qb3MgIGxlZnRfbmVhcmVzdCAgPSBGVF9QSVhfUk9VTkQoIHBvcyApOwotICAgICAgICAgICAgICAgIEZUX1BvcyAgcmlnaHRfbmVhcmVzdCA9IEZUX1BJWF9ST1VORCggcG9zICsgbGVuICk7Ci0gICAgICAgICAgICAgICAgRlRfUG9zICBsZWZ0X2Rpc3AgICAgID0gbGVmdF9uZWFyZXN0IC0gcG9zOwotICAgICAgICAgICAgICAgIEZUX1BvcyAgcmlnaHRfZGlzcCAgICA9IHJpZ2h0X25lYXJlc3QgLSAoIHBvcyArIGxlbiApOwotCi0KLSAgICAgICAgICAgICAgICBpZiAoIGxlZnRfZGlzcCA8IDAgKQotICAgICAgICAgICAgICAgICAgbGVmdF9kaXNwID0gLWxlZnRfZGlzcDsKLSAgICAgICAgICAgICAgICBpZiAoIHJpZ2h0X2Rpc3AgPCAwICkKLSAgICAgICAgICAgICAgICAgIHJpZ2h0X2Rpc3AgPSAtcmlnaHRfZGlzcDsKLSAgICAgICAgICAgICAgICBpZiAoIGxlZnRfZGlzcCA8PSByaWdodF9kaXNwICkKLSAgICAgICAgICAgICAgICAgIHBvcyA9IGxlZnRfbmVhcmVzdDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBwb3MgPSByaWdodF9uZWFyZXN0OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHRoaXMgaXMgYSBnaG9zdCBzdGVtOyB3ZSBzaW1wbHkgcm91bmQgaXQgKi8KLSAgICAgICAgICAgICAgICBwb3MgPSBGVF9QSVhfUk9VTkQoIHBvcyApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxlbiA9IHBzaF9kaW1lbnNpb25fcXVhbnRpemVfbGVuKCBkaW0sIGxlbiwgMCApOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIG5vdyB0aGF0IHdlIGhhdmUgYSBnb29kIGhpbnRlZCBzdGVtIHdpZHRoLCB0cnkgdG8gcG9zaXRpb24gKi8KLSAgICAgICAgICAvKiB0aGUgc3RlbSBhbG9uZyBhIHBpeGVsIGdyaWQgaW50ZWdlciBjb29yZGluYXRlICAgICAgICAgICAgICovCi0gICAgICAgICAgaGludC0+Y3VyX3BvcyA9IHBvcyArIHBzaF9oaW50X3NuYXBfc3RlbV9zaWRlX2RlbHRhKCBwb3MsIGxlbiApOwotICAgICAgICAgIGhpbnQtPmN1cl9sZW4gPSBsZW47Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBkb19zbmFwcGluZyApCi0gICAgICB7Ci0gICAgICAgIHBvcyA9IGhpbnQtPmN1cl9wb3M7Ci0gICAgICAgIGxlbiA9IGhpbnQtPmN1cl9sZW47Ci0KLSAgICAgICAgaWYgKCBsZW4gPCA2NCApCi0gICAgICAgICAgbGVuID0gNjQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsZW4gPSBGVF9QSVhfUk9VTkQoIGxlbiApOwotCi0gICAgICAgIHN3aXRjaCAoIGFsaWduLmFsaWduICkKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fVE9QOgotICAgICAgICAgICAgaGludC0+Y3VyX3BvcyA9IGFsaWduLmFsaWduX3RvcCAtIGxlbjsKLSAgICAgICAgICAgIGhpbnQtPmN1cl9sZW4gPSBsZW47Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fQk9UOgotICAgICAgICAgICAgaGludC0+Y3VyX2xlbiA9IGxlbjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9CT1QgfCBQU0hfQkxVRV9BTElHTl9UT1A6Ci0gICAgICAgICAgICAvKiBkb24ndCB0b3VjaCAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBoaW50LT5jdXJfbGVuID0gbGVuOwotICAgICAgICAgICAgaWYgKCBsZW4gJiA2NCApCi0gICAgICAgICAgICAgIHBvcyA9IEZUX1BJWF9GTE9PUiggcG9zICsgKCBsZW4gPj4gMSApICkgKyAzMjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcG9zID0gRlRfUElYX1JPVU5EKCBwb3MgKyAoIGxlbiA+PiAxICkgKTsKLQotICAgICAgICAgICAgaGludC0+Y3VyX3BvcyA9IHBvcyAtICggbGVuID4+IDEgKTsKLSAgICAgICAgICAgIGhpbnQtPmN1cl9sZW4gPSBsZW47Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHNoX2hpbnRfc2V0X2ZpdHRlZCggaGludCApOwotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gICAgICBpZiAoIHBzX2RlYnVnX2hpbnRfZnVuYyApCi0gICAgICAgIHBzX2RlYnVnX2hpbnRfZnVuYyggaGludCwgZGltZW5zaW9uICk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLQotCi0jaWYgMCAgLyogbm90IHVzZWQgZm9yIG5vdywgZXhwZXJpbWVudGFsICovCi0KLSAvKgotICAqICBBIHZhcmlhbnQgdG8gcGVyZm9ybSAibGlnaHQiIGhpbnRpbmcgKGkuZS4gRlRfUkVOREVSX01PREVfTElHSFQpCi0gICogIG9mIHN0ZW1zCi0gICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9oaW50X2FsaWduX2xpZ2h0KCBQU0hfSGludCAgICAgaGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbHlwaCAgICBnbHlwaCApCi0gIHsKLSAgICBQU0hfRGltZW5zaW9uICBkaW0gICA9ICZnbG9iYWxzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZSA9IGRpbS0+c2NhbGVfbXVsdDsKLSAgICBGVF9GaXhlZCAgICAgICBkZWx0YSA9IGRpbS0+c2NhbGVfZGVsdGE7Ci0KLQotICAgIGlmICggIXBzaF9oaW50X2lzX2ZpdHRlZCggaGludCApICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIHBvcyA9IEZUX011bEZpeCggaGludC0+b3JnX3Bvcywgc2NhbGUgKSArIGRlbHRhOwotICAgICAgRlRfUG9zICBsZW4gPSBGVF9NdWxGaXgoIGhpbnQtPm9yZ19sZW4sIHNjYWxlICk7Ci0KLSAgICAgIEZUX1BvcyAgZml0X2xlbjsKLQotICAgICAgUFNIX0FsaWdubWVudFJlYyAgYWxpZ247Ci0KLQotICAgICAgLyogaWdub3JlIHN0ZW0gYWxpZ25tZW50cyB3aGVuIHJlcXVlc3RlZCB0aHJvdWdoIHRoZSBoaW50IGZsYWdzICovCi0gICAgICBpZiAoICggZGltZW5zaW9uID09IDAgJiYgIWdseXBoLT5kb19ob3J6X2hpbnRzICkgfHwKLSAgICAgICAgICAgKCBkaW1lbnNpb24gPT0gMSAmJiAhZ2x5cGgtPmRvX3ZlcnRfaGludHMgKSApCi0gICAgICB7Ci0gICAgICAgIGhpbnQtPmN1cl9wb3MgPSBwb3M7Ci0gICAgICAgIGhpbnQtPmN1cl9sZW4gPSBsZW47Ci0KLSAgICAgICAgcHNoX2hpbnRfc2V0X2ZpdHRlZCggaGludCApOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGZpdF9sZW4gPSBsZW47Ci0KLSAgICAgIGhpbnQtPmN1cl9sZW4gPSBmaXRfbGVuOwotCi0gICAgICAvKiBjaGVjayBibHVlIHpvbmVzIGZvciBob3Jpem9udGFsIHN0ZW1zICovCi0gICAgICBhbGlnbi5hbGlnbiA9IFBTSF9CTFVFX0FMSUdOX05PTkU7Ci0gICAgICBhbGlnbi5hbGlnbl9ib3QgPSBhbGlnbi5hbGlnbl90b3AgPSAwOwotCi0gICAgICBpZiAoIGRpbWVuc2lvbiA9PSAxICkKLSAgICAgICAgcHNoX2JsdWVzX3NuYXBfc3RlbSggJmdsb2JhbHMtPmJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LT5vcmdfcG9zICsgaGludC0+b3JnX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduICk7Ci0KLSAgICAgIHN3aXRjaCAoIGFsaWduLmFsaWduICkKLSAgICAgIHsKLSAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fVE9QOgotICAgICAgICAvKiB0aGUgdG9wIG9mIHRoZSBzdGVtIGlzIGFsaWduZWQgYWdhaW5zdCBhIGJsdWUgem9uZSAqLwotICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fdG9wIC0gZml0X2xlbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fQk9UOgotICAgICAgICAvKiB0aGUgYm90dG9tIG9mIHRoZSBzdGVtIGlzIGFsaWduZWQgYWdhaW5zdCBhIGJsdWUgem9uZSAqLwotICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fYm90OwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9UT1AgfCBQU0hfQkxVRV9BTElHTl9CT1Q6Ci0gICAgICAgIC8qIGJvdGggZWRnZXMgb2YgdGhlIHN0ZW0gYXJlIGFsaWduZWQgYWdhaW5zdCBibHVlIHpvbmVzICovCi0gICAgICAgIGhpbnQtPmN1cl9wb3MgPSBhbGlnbi5hbGlnbl9ib3Q7Ci0gICAgICAgIGhpbnQtPmN1cl9sZW4gPSBhbGlnbi5hbGlnbl90b3AgLSBhbGlnbi5hbGlnbl9ib3Q7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgUFNIX0hpbnQgIHBhcmVudCA9IGhpbnQtPnBhcmVudDsKLQotCi0gICAgICAgICAgaWYgKCBwYXJlbnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgcGFyX29yZ19jZW50ZXIsIHBhcl9jdXJfY2VudGVyOwotICAgICAgICAgICAgRlRfUG9zICBjdXJfb3JnX2NlbnRlciwgY3VyX2RlbHRhOwotCi0KLSAgICAgICAgICAgIC8qIGVuc3VyZSB0aGF0IHBhcmVudCBpcyBhbHJlYWR5IGZpdHRlZCAqLwotICAgICAgICAgICAgaWYgKCAhcHNoX2hpbnRfaXNfZml0dGVkKCBwYXJlbnQgKSApCi0gICAgICAgICAgICAgIHBzaF9oaW50X2FsaWduX2xpZ2h0KCBwYXJlbnQsIGdsb2JhbHMsIGRpbWVuc2lvbiwgZ2x5cGggKTsKLQotICAgICAgICAgICAgcGFyX29yZ19jZW50ZXIgPSBwYXJlbnQtPm9yZ19wb3MgKyAoIHBhcmVudC0+b3JnX2xlbiAvIDIgKTsKLSAgICAgICAgICAgIHBhcl9jdXJfY2VudGVyID0gcGFyZW50LT5jdXJfcG9zICsgKCBwYXJlbnQtPmN1cl9sZW4gLyAyICk7Ci0gICAgICAgICAgICBjdXJfb3JnX2NlbnRlciA9IGhpbnQtPm9yZ19wb3MgICArICggaGludC0+b3JnX2xlbiAgIC8gMiApOwotCi0gICAgICAgICAgICBjdXJfZGVsdGEgPSBGVF9NdWxGaXgoIGN1cl9vcmdfY2VudGVyIC0gcGFyX29yZ19jZW50ZXIsIHNjYWxlICk7Ci0gICAgICAgICAgICBwb3MgICAgICAgPSBwYXJfY3VyX2NlbnRlciArIGN1cl9kZWx0YSAtICggbGVuID4+IDEgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBTdGVtcyBsZXNzIHRoYW4gb25lIHBpeGVsIHdpZGUgYXJlIGVhc3kgLS0gd2Ugd2FudCB0bwotICAgICAgICAgICAqIG1ha2UgdGhlbSBhcyBkYXJrIGFzIHBvc3NpYmxlLCBzbyB0aGV5IG11c3QgZmFsbCB3aXRoaW4KLSAgICAgICAgICAgKiBvbmUgcGl4ZWwuICBJZiB0aGUgc3RlbSBpcyBzcGxpdCBiZXR3ZWVuIHR3byBwaXhlbHMKLSAgICAgICAgICAgKiB0aGVuIHNuYXAgdGhlIGVkZ2UgdGhhdCBpcyBuZWFyZXIgdG8gdGhlIHBpeGVsIGJvdW5kYXJ5Ci0gICAgICAgICAgICogdG8gdGhlIHBpeGVsIGJvdW5kYXJ5LgotICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggbGVuIDw9IDY0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoICggcG9zICsgbGVuICsgNjMgKSAvIDY0ICAhPSBwb3MgLyA2NCArIDEgKQotICAgICAgICAgICAgICBwb3MgKz0gcHNoX2hpbnRfc25hcF9zdGVtX3NpZGVfZGVsdGEgKCBwb3MsIGxlbiApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIFBvc2l0aW9uIHN0ZW1zIG90aGVyIHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2YgbWlkLWdyYXlzLgotICAgICAgICAgICAqIFRoZXJlIGFyZSwgaW4gZ2VuZXJhbCwgdHdvIHBvc2l0aW9ucyB0aGF0IGRvIHRoaXMsCi0gICAgICAgICAgICogaWxsdXN0cmF0ZWQgYXMgQSkgYW5kIEIpIGJlbG93LgotICAgICAgICAgICAqCi0gICAgICAgICAgICogICArICAgICAgICAgICAgICAgICAgICsgICAgICAgICAgICAgICAgICAgKyAgICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICoKLSAgICAgICAgICAgKiBBKSAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gICAgICAgICAgICogQikgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gICAgICAgICAgICogQykgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgICAgICAgICAqCi0gICAgICAgICAgICogUG9zaXRpb24gQSkgKHNwbGl0IHRoZSBleGNlc3Mgc3RlbSBlcXVhbGx5KSBzaG91bGQgYmUgYmV0dGVyCi0gICAgICAgICAgICogZm9yIHN0ZW1zIG9mIHdpZHRoIE4gKyBmIHdoZXJlIGYgPCAwLjUuCi0gICAgICAgICAgICoKLSAgICAgICAgICAgKiBQb3NpdGlvbiBCKSAoc3BsaXQgdGhlIGRlZmljaWVuY3kgZXF1YWxseSkgc2hvdWxkIGJlIGJldHRlcgotICAgICAgICAgICAqIGZvciBzdGVtcyBvZiB3aWR0aCBOICsgZiB3aGVyZSBmID4gMC41LgotICAgICAgICAgICAqCi0gICAgICAgICAgICogSXQgdHVybnMgb3V0IHRob3VnaCB0aGF0IG1pbmltaXppbmcgdGhlIHRvdGFsIG51bWJlciBvZiBsaXQKLSAgICAgICAgICAgKiBwaXhlbHMgaXMgYWxzbyBpbXBvcnRhbnQsIHNvIHBvc2l0aW9uIEMpLCB3aXRoIG9uZSBlZGdlCi0gICAgICAgICAgICogYWxpZ25lZCB3aXRoIGEgcGl4ZWwgYm91bmRhcnkgaXMgYWN0dWFsbHkgcHJlZmVyYWJsZQotICAgICAgICAgICAqIHRvIEEpLiAgVGhlcmUgYXJlIGFsc28gbW9yZSBwb3NzaWJsZSBwb3NpdGlvbnMgZm9yIEMpIHRoYW4KLSAgICAgICAgICAgKiBmb3IgQSkgb3IgQiksIHNvIGl0IGludm9sdmVzIGxlc3MgZGlzdG9ydGlvbiBvZiB0aGUgb3ZlcmFsbAotICAgICAgICAgICAqIGNoYXJhY3RlciBzaGFwZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBlbHNlIC8qIGxlbiA+IDY0ICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIGZyYWNfbGVuID0gbGVuICYgNjM7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgY2VudGVyID0gcG9zICsgKCBsZW4gPj4gMSApOwotICAgICAgICAgICAgRlRfRml4ZWQgIGRlbHRhX2EsIGRlbHRhX2I7Ci0KLQotICAgICAgICAgICAgaWYgKCAoIGxlbiAvIDY0ICkgJiAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVsdGFfYSA9IEZUX1BJWF9GTE9PUiggY2VudGVyICkgKyAzMiAtIGNlbnRlcjsKLSAgICAgICAgICAgICAgZGVsdGFfYiA9IEZUX1BJWF9ST1VORCggY2VudGVyICkgLSBjZW50ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRlbHRhX2EgPSBGVF9QSVhfUk9VTkQoIGNlbnRlciApIC0gY2VudGVyOwotICAgICAgICAgICAgICBkZWx0YV9iID0gRlRfUElYX0ZMT09SKCBjZW50ZXIgKSArIDMyIC0gY2VudGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBXZSBjaG9vc2UgYmV0d2VlbiBCKSBhbmQgQykgYWJvdmUgYmFzZWQgb24gdGhlIGFtb3VudAotICAgICAgICAgICAgICogb2YgZnJhY3Rpb25hbCBzdGVtIHdpZHRoOyBmb3Igc21hbGwgYW1vdW50cywgY2hvb3NlCi0gICAgICAgICAgICAgKiBDKSBhbHdheXMsIGZvciBsYXJnZSBhbW91bnRzLCBCKSBhbHdheXMsIGFuZCBpbmJldHdlZW4sCi0gICAgICAgICAgICAgKiBwaWNrIHdoaWNoZXZlciBvbmUgaW52b2x2ZXMgbGVzcyBzdGVtIG1vdmVtZW50LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIGZyYWNfbGVuIDwgMzIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwb3MgKz0gcHNoX2hpbnRfc25hcF9zdGVtX3NpZGVfZGVsdGEgKCBwb3MsIGxlbiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIGZyYWNfbGVuIDwgNDggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9GaXhlZCAgc2lkZV9kZWx0YSA9IHBzaF9oaW50X3NuYXBfc3RlbV9zaWRlX2RlbHRhICggcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBGVF9BQlMoIHNpZGVfZGVsdGEgKSA8IEZUX0FCUyggZGVsdGFfYiApICkKLSAgICAgICAgICAgICAgICBwb3MgKz0gc2lkZV9kZWx0YTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBvcyArPSBkZWx0YV9iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwb3MgKz0gZGVsdGFfYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBoaW50LT5jdXJfcG9zID0gcG9zOwotICAgICAgICB9Ci0gICAgICB9ICAvKiBzd2l0Y2ggKi8KLQotICAgICAgcHNoX2hpbnRfc2V0X2ZpdHRlZCggaGludCApOwotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gICAgICBpZiAoIHBzX2RlYnVnX2hpbnRfZnVuYyApCi0gICAgICAgIHBzX2RlYnVnX2hpbnRfZnVuYyggaGludCwgZGltZW5zaW9uICk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9oaW50X3RhYmxlX2FsaWduX2hpbnRzKCBQU0hfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hfR2xvYmFscyAgICAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hfR2x5cGggICAgICAgZ2x5cGggKQotICB7Ci0gICAgUFNIX0hpbnQgICAgICAgaGludDsKLSAgICBGVF9VSW50ICAgICAgICBjb3VudDsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotCi0gICAgUFNIX0RpbWVuc2lvbiAgZGltICAgPSAmZ2xvYmFscy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0gICAgRlRfRml4ZWQgICAgICAgc2NhbGUgPSBkaW0tPnNjYWxlX211bHQ7Ci0gICAgRlRfRml4ZWQgICAgICAgZGVsdGEgPSBkaW0tPnNjYWxlX2RlbHRhOwotCi0KLSAgICBpZiAoIHBzX2RlYnVnX25vX3ZlcnRfaGludHMgJiYgZGltZW5zaW9uID09IDAgKQotICAgIHsKLSAgICAgIHBzX3NpbXBsZV9zY2FsZSggdGFibGUsIHNjYWxlLCBkZWx0YSwgZGltZW5zaW9uICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBwc19kZWJ1Z19ub19ob3J6X2hpbnRzICYmIGRpbWVuc2lvbiA9PSAxICkKLSAgICB7Ci0gICAgICBwc19zaW1wbGVfc2NhbGUoIHRhYmxlLCBzY2FsZSwgZGVsdGEsIGRpbWVuc2lvbiApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2VuZGlmIC8qIERFQlVHX0hJTlRFUiovCi0KLSAgICBoaW50ICA9IHRhYmxlLT5oaW50czsKLSAgICBjb3VudCA9IHRhYmxlLT5tYXhfaGludHM7Ci0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgaGludCsrICkKLSAgICAgIHBzaF9oaW50X2FsaWduKCBoaW50LCBnbG9iYWxzLCBkaW1lbnNpb24sIGdseXBoICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICBQT0lOVFMgSU5URVJQT0xBVElPTiBST1VUSU5FUyAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIHh4REVCVUdfWk9ORVMKLQotCi0jaWZkZWYgREVCVUdfWk9ORVMKLQotI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9wcmludF96b25lKCBQU0hfWm9uZSAgem9uZSApCi0gIHsKLSAgICBwcmludGYoICJ6b25lIFtzY2FsZSxkZWx0YSxtaW4sbWF4XSA9IFslLjVmLCUuMmYsJWQsJWRdXG4iLAotICAgICAgICAgICAgIHpvbmUtPnNjYWxlIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICB6b25lLT5kZWx0YSAvIDY0LjAsCi0gICAgICAgICAgICAgem9uZS0+bWluLAotICAgICAgICAgICAgIHpvbmUtPm1heCApOwotICB9Ci0KLSNlbmRpZiAvKiBERUJVR19aT05FUyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBISU5URVIgR0xZUEggTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgIHBzaF9jb3JuZXJfaXNfZmxhdCAgICAgIGZ0X2Nvcm5lcl9pc19mbGF0Ci0jZGVmaW5lICBwc2hfY29ybmVyX29yaWVudGF0aW9uICBmdF9jb3JuZXJfb3JpZW50YXRpb24KLQotCi0jaWZkZWYgQ09NUFVURV9JTkZMRVhTCi0KLSAgLyogY29tcHV0ZSBhbGwgaW5mbGV4IHBvaW50cyBpbiBhIGdpdmVuIGdseXBoICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9jb21wdXRlX2luZmxlY3Rpb25zKCBQU0hfR2x5cGggIGdseXBoICkKLSAgewotICAgIEZUX1VJbnQgIG47Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgZ2x5cGgtPm51bV9jb250b3VyczsgbisrICkKLSAgICB7Ci0gICAgICBQU0hfUG9pbnQgIGZpcnN0LCBzdGFydCwgZW5kLCBiZWZvcmUsIGFmdGVyOwotICAgICAgRlRfUG9zICAgICBpbl94LCBpbl95LCBvdXRfeCwgb3V0X3k7Ci0gICAgICBGVF9JbnQgICAgIG9yaWVudF9wcmV2LCBvcmllbnRfY3VyOwotICAgICAgRlRfSW50ICAgICBmaW5pc2hlZCA9IDA7Ci0KLQotICAgICAgLyogd2UgbmVlZCBhdCBsZWFzdCA0IHBvaW50cyB0byBjcmVhdGUgYW4gaW5mbGVjdGlvbiBwb2ludCAqLwotICAgICAgaWYgKCBnbHlwaC0+Y29udG91cnNbbl0uY291bnQgPCA0ICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIGNvbXB1dGUgZmlyc3Qgc2VnbWVudCBpbiBjb250b3VyICovCi0gICAgICBmaXJzdCA9IGdseXBoLT5jb250b3Vyc1tuXS5zdGFydDsKLQotICAgICAgc3RhcnQgPSBlbmQgPSBmaXJzdDsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIGVuZCA9IGVuZC0+bmV4dDsKLSAgICAgICAgaWYgKCBlbmQgPT0gZmlyc3QgKQotICAgICAgICAgIGdvdG8gU2tpcDsKLQotICAgICAgICBpbl94ID0gZW5kLT5vcmdfdSAtIHN0YXJ0LT5vcmdfdTsKLSAgICAgICAgaW5feSA9IGVuZC0+b3JnX3YgLSBzdGFydC0+b3JnX3Y7Ci0KLSAgICAgIH0gd2hpbGUgKCBpbl94ID09IDAgJiYgaW5feSA9PSAwICk7Ci0KLSAgICAgIC8qIGV4dGVuZCB0aGUgc2VnbWVudCBzdGFydCB3aGVuZXZlciBwb3NzaWJsZSAqLwotICAgICAgYmVmb3JlID0gc3RhcnQ7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgc3RhcnQgID0gYmVmb3JlOwotICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZS0+cHJldjsKLSAgICAgICAgICBpZiAoIGJlZm9yZSA9PSBmaXJzdCApCi0gICAgICAgICAgICBnb3RvIFNraXA7Ci0KLSAgICAgICAgICBvdXRfeCA9IHN0YXJ0LT5vcmdfdSAtIGJlZm9yZS0+b3JnX3U7Ci0gICAgICAgICAgb3V0X3kgPSBzdGFydC0+b3JnX3YgLSBiZWZvcmUtPm9yZ192OwotCi0gICAgICAgIH0gd2hpbGUgKCBvdXRfeCA9PSAwICYmIG91dF95ID09IDAgKTsKLQotICAgICAgICBvcmllbnRfcHJldiA9IHBzaF9jb3JuZXJfb3JpZW50YXRpb24oIGluX3gsIGluX3ksIG91dF94LCBvdXRfeSApOwotCi0gICAgICB9IHdoaWxlICggb3JpZW50X3ByZXYgPT0gMCApOwotCi0gICAgICBmaXJzdCA9IHN0YXJ0OwotICAgICAgaW5feCAgPSBvdXRfeDsKLSAgICAgIGluX3kgID0gb3V0X3k7Ci0KLSAgICAgIC8qIG5vdywgcHJvY2VzcyBhbGwgc2VnbWVudHMgaW4gdGhlIGNvbnRvdXIgKi8KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIC8qIGZpcnN0LCBleHRlbmQgY3VycmVudCBzZWdtZW50J3MgZW5kIHdoZW5ldmVyIHBvc3NpYmxlICovCi0gICAgICAgIGFmdGVyID0gZW5kOwotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbmQgICA9IGFmdGVyOwotICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci0+bmV4dDsKLSAgICAgICAgICAgIGlmICggYWZ0ZXIgPT0gZmlyc3QgKQotICAgICAgICAgICAgICBmaW5pc2hlZCA9IDE7Ci0KLSAgICAgICAgICAgIG91dF94ID0gYWZ0ZXItPm9yZ191IC0gZW5kLT5vcmdfdTsKLSAgICAgICAgICAgIG91dF95ID0gYWZ0ZXItPm9yZ192IC0gZW5kLT5vcmdfdjsKLQotICAgICAgICAgIH0gd2hpbGUgKCBvdXRfeCA9PSAwICYmIG91dF95ID09IDAgKTsKLQotICAgICAgICAgIG9yaWVudF9jdXIgPSBwc2hfY29ybmVyX29yaWVudGF0aW9uKCBpbl94LCBpbl95LCBvdXRfeCwgb3V0X3kgKTsKLQotICAgICAgICB9IHdoaWxlICggb3JpZW50X2N1ciA9PSAwICk7Ci0KLSAgICAgICAgaWYgKCAoIG9yaWVudF9jdXIgXiBvcmllbnRfcHJldiApIDwgMCApCi0gICAgICAgIHsKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfaW5mbGV4KCBzdGFydCApOwotICAgICAgICAgICAgc3RhcnQgPSBzdGFydC0+bmV4dDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKCBzdGFydCAhPSBlbmQgKTsKLQotICAgICAgICAgIHBzaF9wb2ludF9zZXRfaW5mbGV4KCBzdGFydCApOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhcnQgICAgICAgPSBlbmQ7Ci0gICAgICAgIGVuZCAgICAgICAgID0gYWZ0ZXI7Ci0gICAgICAgIG9yaWVudF9wcmV2ID0gb3JpZW50X2N1cjsKLSAgICAgICAgaW5feCAgICAgICAgPSBvdXRfeDsKLSAgICAgICAgaW5feSAgICAgICAgPSBvdXRfeTsKLQotICAgICAgfSB3aGlsZSAoICFmaW5pc2hlZCApOwotCi0gICAgU2tpcDoKLSAgICAgIDsKLSAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIENPTVBVVEVfSU5GTEVYUyAqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2RvbmUoIFBTSF9HbHlwaCAgZ2x5cGggKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBnbHlwaC0+bWVtb3J5OwotCi0KLSAgICBwc2hfaGludF90YWJsZV9kb25lKCAmZ2x5cGgtPmhpbnRfdGFibGVzWzFdLCBtZW1vcnkgKTsKLSAgICBwc2hfaGludF90YWJsZV9kb25lKCAmZ2x5cGgtPmhpbnRfdGFibGVzWzBdLCBtZW1vcnkgKTsKLQotICAgIEZUX0ZSRUUoIGdseXBoLT5wb2ludHMgKTsKLSAgICBGVF9GUkVFKCBnbHlwaC0+Y29udG91cnMgKTsKLQotICAgIGdseXBoLT5udW1fcG9pbnRzICAgPSAwOwotICAgIGdseXBoLT5udW1fY29udG91cnMgPSAwOwotCi0gICAgZ2x5cGgtPm1lbW9yeSA9IE5VTEw7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgcHNoX2NvbXB1dGVfZGlyKCBGVF9Qb3MgIGR4LAotICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgZHkgKQotICB7Ci0gICAgRlRfUG9zICBheCwgYXk7Ci0gICAgaW50ICAgICByZXN1bHQgPSBQU0hfRElSX05PTkU7Ci0KLQotICAgIGF4ID0gRlRfQUJTKCBkeCApOwotICAgIGF5ID0gRlRfQUJTKCBkeSApOwotCi0gICAgaWYgKCBheSAqIDEyIDwgYXggKQotICAgIHsKLSAgICAgIC8qIHxkeXwgPDw8IHxkeHwgIG1lYW5zIGEgbmVhci1ob3Jpem9udGFsIHNlZ21lbnQgKi8KLSAgICAgIHJlc3VsdCA9ICggZHggPj0gMCApID8gUFNIX0RJUl9SSUdIVCA6IFBTSF9ESVJfTEVGVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGF4ICogMTIgPCBheSApCi0gICAgewotICAgICAgLyogfGR4fCA8PDwgfGR5fCAgbWVhbnMgYSBuZWFyLXZlcnRpY2FsIHNlZ21lbnQgKi8KLSAgICAgIHJlc3VsdCA9ICggZHkgPj0gMCApID8gUFNIX0RJUl9VUCA6IFBTSF9ESVJfRE9XTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBsb2FkIG91dGxpbmUgcG9pbnQgY29vcmRpbmF0ZXMgaW50byBoaW50ZXIgZ2x5cGggKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2xvYWRfcG9pbnRzKCBQU0hfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGltZW5zaW9uICkKLSAgewotICAgIEZUX1ZlY3RvciogIHZlYyAgID0gZ2x5cGgtPm91dGxpbmUtPnBvaW50czsKLSAgICBQU0hfUG9pbnQgICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0gICAgRlRfVUludCAgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKLQotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KyssIHZlYysrICkKLSAgICB7Ci0gICAgICBwb2ludC0+ZmxhZ3MyID0gMDsKLSAgICAgIHBvaW50LT5oaW50ICAgPSBOVUxMOwotICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHBvaW50LT5vcmdfdSA9IHZlYy0+eDsKLSAgICAgICAgcG9pbnQtPm9yZ192ID0gdmVjLT55OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwb2ludC0+b3JnX3UgPSB2ZWMtPnk7Ci0gICAgICAgIHBvaW50LT5vcmdfdiA9IHZlYy0+eDsKLSAgICAgIH0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgICAgcG9pbnQtPm9yZ194ID0gdmVjLT54OwotICAgICAgcG9pbnQtPm9yZ195ID0gdmVjLT55OwotI2VuZGlmCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIHNhdmUgaGludGVkIHBvaW50IGNvb3JkaW5hdGVzIGJhY2sgdG8gb3V0bGluZSAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfc2F2ZV9wb2ludHMoIFBTSF9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24gKQotICB7Ci0gICAgRlRfVUludCAgICAgbjsKLSAgICBQU0hfUG9pbnQgICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0gICAgRlRfVmVjdG9yKiAgdmVjICAgPSBnbHlwaC0+b3V0bGluZS0+cG9pbnRzOwotICAgIGNoYXIqICAgICAgIHRhZ3MgID0gZ2x5cGgtPm91dGxpbmUtPnRhZ3M7Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgZ2x5cGgtPm51bV9wb2ludHM7IG4rKyApCi0gICAgewotICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMCApCi0gICAgICAgIHZlY1tuXS54ID0gcG9pbnQtPmN1cl91OwotICAgICAgZWxzZQotICAgICAgICB2ZWNbbl0ueSA9IHBvaW50LT5jdXJfdTsKLQotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfc3Ryb25nKCBwb2ludCApICkKLSAgICAgICAgdGFnc1tuXSB8PSAoY2hhcikoICggZGltZW5zaW9uID09IDAgKSA/IDMyIDogNjQgKTsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotCi0gICAgICBpZiAoIGRpbWVuc2lvbiA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPmN1cl94ICAgPSBwb2ludC0+Y3VyX3U7Ci0gICAgICAgIHBvaW50LT5mbGFnc194ID0gcG9pbnQtPmZsYWdzMiB8IHBvaW50LT5mbGFnczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPmN1cl95ICAgPSBwb2ludC0+Y3VyX3U7Ci0gICAgICAgIHBvaW50LT5mbGFnc195ID0gcG9pbnQtPmZsYWdzMiB8IHBvaW50LT5mbGFnczsKLSAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgIHBvaW50Kys7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNoX2dseXBoX2luaXQoIFBTSF9HbHlwaCAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgUFNfSGludHMgICAgIHBzX2hpbnRzLAotICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgIGdsb2JhbHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgLyogY2xlYXIgYWxsIGZpZWxkcyAqLwotICAgIEZUX1pFUk8oIGdseXBoICk7Ci0KLSAgICBtZW1vcnkgPSBnbHlwaC0+bWVtb3J5ID0gZ2xvYmFscy0+bWVtb3J5OwotCi0gICAgLyogYWxsb2NhdGUgYW5kIHNldHVwIHBvaW50cyArIGNvbnRvdXJzIGFycmF5cyAqLwotICAgIGlmICggRlRfTkVXX0FSUkFZKCBnbHlwaC0+cG9pbnRzLCAgIG91dGxpbmUtPm5fcG9pbnRzICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBnbHlwaC0+Y29udG91cnMsIG91dGxpbmUtPm5fY29udG91cnMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBnbHlwaC0+bnVtX3BvaW50cyAgID0gKEZUX1VJbnQpb3V0bGluZS0+bl9wb2ludHM7Ci0gICAgZ2x5cGgtPm51bV9jb250b3VycyA9IChGVF9VSW50KW91dGxpbmUtPm5fY29udG91cnM7Ci0KLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICAgZmlyc3QgPSAwLCBuZXh0LCBuOwotICAgICAgUFNIX1BvaW50ICAgIHBvaW50cyAgPSBnbHlwaC0+cG9pbnRzOwotICAgICAgUFNIX0NvbnRvdXIgIGNvbnRvdXIgPSBnbHlwaC0+Y29udG91cnM7Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX2NvbnRvdXJzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgIGNvdW50OwotICAgICAgICBQU0hfUG9pbnQgIHBvaW50OwotCi0KLSAgICAgICAgbmV4dCAgPSAoRlRfVUludClvdXRsaW5lLT5jb250b3Vyc1tuXSArIDE7Ci0gICAgICAgIGNvdW50ID0gbmV4dCAtIGZpcnN0OwotCi0gICAgICAgIGNvbnRvdXItPnN0YXJ0ID0gcG9pbnRzICsgZmlyc3Q7Ci0gICAgICAgIGNvbnRvdXItPmNvdW50ID0gY291bnQ7Ci0KLSAgICAgICAgaWYgKCBjb3VudCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgcG9pbnQgPSBwb2ludHMgKyBmaXJzdDsKLQotICAgICAgICAgIHBvaW50LT5wcmV2ICAgID0gcG9pbnRzICsgbmV4dCAtIDE7Ci0gICAgICAgICAgcG9pbnQtPmNvbnRvdXIgPSBjb250b3VyOwotCi0gICAgICAgICAgZm9yICggOyBjb3VudCA+IDE7IGNvdW50LS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvaW50WzBdLm5leHQgPSBwb2ludCArIDE7Ci0gICAgICAgICAgICBwb2ludFsxXS5wcmV2ID0gcG9pbnQ7Ci0gICAgICAgICAgICBwb2ludCsrOwotICAgICAgICAgICAgcG9pbnQtPmNvbnRvdXIgPSBjb250b3VyOwotICAgICAgICAgIH0KLSAgICAgICAgICBwb2ludC0+bmV4dCA9IHBvaW50cyArIGZpcnN0OwotICAgICAgICB9Ci0KLSAgICAgICAgY29udG91cisrOwotICAgICAgICBmaXJzdCA9IG5leHQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgewotICAgICAgUFNIX1BvaW50ICAgcG9pbnRzID0gZ2x5cGgtPnBvaW50czsKLSAgICAgIFBTSF9Qb2ludCAgIHBvaW50ICA9IHBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHZlYyAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1VJbnQgICAgIG47Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX3BvaW50czsgbisrLCBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICBuX3ByZXYgPSAoRlRfSW50KSggcG9pbnQtPnByZXYgLSBwb2ludHMgKTsKLSAgICAgICAgRlRfSW50ICBuX25leHQgPSAoRlRfSW50KSggcG9pbnQtPm5leHQgLSBwb2ludHMgKTsKLSAgICAgICAgRlRfUG9zICBkeGksIGR5aSwgZHhvLCBkeW87Ci0KLQotICAgICAgICBpZiAoICEoIG91dGxpbmUtPnRhZ3Nbbl0gJiBGVF9DVVJWRV9UQUdfT04gKSApCi0gICAgICAgICAgcG9pbnQtPmZsYWdzID0gUFNIX1BPSU5UX09GRjsKLQotICAgICAgICBkeGkgPSB2ZWNbbl0ueCAtIHZlY1tuX3ByZXZdLng7Ci0gICAgICAgIGR5aSA9IHZlY1tuXS55IC0gdmVjW25fcHJldl0ueTsKLQotICAgICAgICBwb2ludC0+ZGlyX2luID0gKEZUX0NoYXIpcHNoX2NvbXB1dGVfZGlyKCBkeGksIGR5aSApOwotCi0gICAgICAgIGR4byA9IHZlY1tuX25leHRdLnggLSB2ZWNbbl0ueDsKLSAgICAgICAgZHlvID0gdmVjW25fbmV4dF0ueSAtIHZlY1tuXS55OwotCi0gICAgICAgIHBvaW50LT5kaXJfb3V0ID0gKEZUX0NoYXIpcHNoX2NvbXB1dGVfZGlyKCBkeG8sIGR5byApOwotCi0gICAgICAgIC8qIGRldGVjdCBzbW9vdGggcG9pbnRzICovCi0gICAgICAgIGlmICggcG9pbnQtPmZsYWdzICYgUFNIX1BPSU5UX09GRiApCi0gICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IFBTSF9QT0lOVF9TTU9PVEg7Ci0KLSAgICAgICAgZWxzZSBpZiAoIHBvaW50LT5kaXJfaW4gPT0gcG9pbnQtPmRpcl9vdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwb2ludC0+ZGlyX291dCAhPSBQU0hfRElSX05PTkUgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICBwc2hfY29ybmVyX2lzX2ZsYXQoIGR4aSwgZHlpLCBkeG8sIGR5byApICkKLSAgICAgICAgICAgIHBvaW50LT5mbGFncyB8PSBQU0hfUE9JTlRfU01PT1RIOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZ2x5cGgtPm91dGxpbmUgPSBvdXRsaW5lOwotICAgIGdseXBoLT5nbG9iYWxzID0gZ2xvYmFsczsKLQotI2lmZGVmIENPTVBVVEVfSU5GTEVYUwotICAgIHBzaF9nbHlwaF9sb2FkX3BvaW50cyggZ2x5cGgsIDAgKTsKLSAgICBwc2hfZ2x5cGhfY29tcHV0ZV9pbmZsZWN0aW9ucyggZ2x5cGggKTsKLSNlbmRpZiAvKiBDT01QVVRFX0lORkxFWFMgKi8KLQotICAgIC8qIG5vdyBkZWFsIHdpdGggaGludHMgdGFibGVzICovCi0gICAgZXJyb3IgPSBwc2hfaGludF90YWJsZV9pbml0KCAmZ2x5cGgtPmhpbnRfdGFibGVzIFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc19oaW50cy0+ZGltZW5zaW9uWzBdLmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMF0ubWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNfaGludHMtPmRpbWVuc2lvblswXS5jb3VudGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBwc2hfaGludF90YWJsZV9pbml0KCAmZ2x5cGgtPmhpbnRfdGFibGVzIFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc19oaW50cy0+ZGltZW5zaW9uWzFdLmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMV0ubWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNfaGludHMtPmRpbWVuc2lvblsxXS5jb3VudGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBjb21wdXRlIGFsbCBleHRyZW1hIGluIGEgZ2x5cGggZm9yIGEgZ2l2ZW4gZGltZW5zaW9uICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9jb21wdXRlX2V4dHJlbWEoIFBTSF9HbHlwaCAgZ2x5cGggKQotICB7Ci0gICAgRlRfVUludCAgbjsKLQotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBjb21wdXRlIGFsbCBsb2NhbCBleHRyZW1hICovCi0gICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX2NvbnRvdXJzOyBuKysgKQotICAgIHsKLSAgICAgIFBTSF9Qb2ludCAgZmlyc3QgPSBnbHlwaC0+Y29udG91cnNbbl0uc3RhcnQ7Ci0gICAgICBQU0hfUG9pbnQgIHBvaW50LCBiZWZvcmUsIGFmdGVyOwotCi0KLSAgICAgIGlmICggZ2x5cGgtPmNvbnRvdXJzW25dLmNvdW50ID09IDAgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgcG9pbnQgID0gZmlyc3Q7Ci0gICAgICBiZWZvcmUgPSBwb2ludDsKLQotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgYmVmb3JlID0gYmVmb3JlLT5wcmV2OwotICAgICAgICBpZiAoIGJlZm9yZSA9PSBmaXJzdCApCi0gICAgICAgICAgZ290byBTa2lwOwotCi0gICAgICB9IHdoaWxlICggYmVmb3JlLT5vcmdfdSA9PSBwb2ludC0+b3JnX3UgKTsKLQotICAgICAgZmlyc3QgPSBwb2ludCA9IGJlZm9yZS0+bmV4dDsKLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgYWZ0ZXIgPSBwb2ludDsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIGFmdGVyID0gYWZ0ZXItPm5leHQ7Ci0gICAgICAgICAgaWYgKCBhZnRlciA9PSBmaXJzdCApCi0gICAgICAgICAgICBnb3RvIE5leHQ7Ci0KLSAgICAgICAgfSB3aGlsZSAoIGFmdGVyLT5vcmdfdSA9PSBwb2ludC0+b3JnX3UgKTsKLQotICAgICAgICBpZiAoIGJlZm9yZS0+b3JnX3UgPCBwb2ludC0+b3JnX3UgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBhZnRlci0+b3JnX3UgPCBwb2ludC0+b3JnX3UgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGxvY2FsIG1heGltdW0gKi8KLSAgICAgICAgICAgIGdvdG8gRXh0cmVtdW07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogYmVmb3JlLT5vcmdfdSA+IHBvaW50LT5vcmdfdSAqLwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBhZnRlci0+b3JnX3UgPiBwb2ludC0+b3JnX3UgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGxvY2FsIG1pbmltdW0gKi8KLSAgICAgICAgICBFeHRyZW11bToKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfZXh0cmVtdW0oIHBvaW50ICk7Ci0gICAgICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0KLSAgICAgICAgICAgIH0gd2hpbGUgKCBwb2ludCAhPSBhZnRlciApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJlZm9yZSA9IGFmdGVyLT5wcmV2OwotICAgICAgICBwb2ludCAgPSBhZnRlcjsKLQotICAgICAgfSAvKiBmb3IgICovCi0KLSAgICBOZXh0OgotICAgICAgOwotICAgIH0KLQotICAgIC8qIGZvciBlYWNoIGV4dHJlbXVtLCBkZXRlcm1pbmUgaXRzIGRpcmVjdGlvbiBhbG9uZyB0aGUgKi8KLSAgICAvKiBvcnRob2dvbmFsIGF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX3BvaW50czsgbisrICkKLSAgICB7Ci0gICAgICBQU0hfUG9pbnQgIHBvaW50LCBiZWZvcmUsIGFmdGVyOwotCi0KLSAgICAgIHBvaW50ICA9ICZnbHlwaC0+cG9pbnRzW25dOwotICAgICAgYmVmb3JlID0gcG9pbnQ7Ci0gICAgICBhZnRlciAgPSBwb2ludDsKLQotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfZXh0cmVtdW0oIHBvaW50ICkgKQotICAgICAgewotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgYmVmb3JlID0gYmVmb3JlLT5wcmV2OwotICAgICAgICAgIGlmICggYmVmb3JlID09IHBvaW50ICkKLSAgICAgICAgICAgIGdvdG8gU2tpcDsKLQotICAgICAgICB9IHdoaWxlICggYmVmb3JlLT5vcmdfdiA9PSBwb2ludC0+b3JnX3YgKTsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgYWZ0ZXIgPSBhZnRlci0+bmV4dDsKLSAgICAgICAgICBpZiAoIGFmdGVyID09IHBvaW50ICkKLSAgICAgICAgICAgIGdvdG8gU2tpcDsKLQotICAgICAgICB9IHdoaWxlICggYWZ0ZXItPm9yZ192ID09IHBvaW50LT5vcmdfdiApOwotICAgICAgfQotCi0gICAgICBpZiAoIGJlZm9yZS0+b3JnX3YgPCBwb2ludC0+b3JnX3YgJiYKLSAgICAgICAgICAgYWZ0ZXItPm9yZ192ICA+IHBvaW50LT5vcmdfdiApCi0gICAgICB7Ci0gICAgICAgIHBzaF9wb2ludF9zZXRfcG9zaXRpdmUoIHBvaW50ICk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggYmVmb3JlLT5vcmdfdiA+IHBvaW50LT5vcmdfdiAmJgotICAgICAgICAgICAgICAgIGFmdGVyLT5vcmdfdiAgPCBwb2ludC0+b3JnX3YgKQotICAgICAgewotICAgICAgICBwc2hfcG9pbnRfc2V0X25lZ2F0aXZlKCBwb2ludCApOwotICAgICAgfQotCi0gICAgU2tpcDoKLSAgICAgIDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIG1ham9yX2RpciBpcyB0aGUgZGlyZWN0aW9uIGZvciBwb2ludHMgb24gdGhlIGJvdHRvbS9sZWZ0IG9mIHRoZSBzdGVtOyAqLwotICAvKiBQb2ludHMgb24gdGhlIHRvcC9yaWdodCBvZiB0aGUgc3RlbSB3aWxsIGhhdmUgYSBkaXJlY3Rpb24gb2YgICAgICAgICAgKi8KLSAgLyogLW1ham9yX2Rpci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfdGFibGVfZmluZF9zdHJvbmdfcG9pbnRzKCBQU0hfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX1BvaW50ICAgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICBtYWpvcl9kaXIgKQotICB7Ci0gICAgUFNIX0hpbnQqICBzb3J0ICAgICAgPSB0YWJsZS0+c29ydDsKLSAgICBGVF9VSW50ICAgIG51bV9oaW50cyA9IHRhYmxlLT5udW1faGludHM7Ci0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIHBvaW50X2RpciA9IDA7Ci0gICAgICBGVF9Qb3MgIG9yZ191ICAgICA9IHBvaW50LT5vcmdfdTsKLQotCi0gICAgICBpZiAoIHBzaF9wb2ludF9pc19zdHJvbmcoIHBvaW50ICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBQU0hfRElSX0NPTVBBUkUoIHBvaW50LT5kaXJfaW4sIG1ham9yX2RpciApICkKLSAgICAgICAgcG9pbnRfZGlyID0gcG9pbnQtPmRpcl9pbjsKLQotICAgICAgZWxzZSBpZiAoIFBTSF9ESVJfQ09NUEFSRSggcG9pbnQtPmRpcl9vdXQsIG1ham9yX2RpciApICkKLSAgICAgICAgcG9pbnRfZGlyID0gcG9pbnQtPmRpcl9vdXQ7Ci0KLSAgICAgIGlmICggcG9pbnRfZGlyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwb2ludF9kaXIgPT0gbWFqb3JfZGlyICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIG5uOwotCi0KLSAgICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX2hpbnRzOyBubisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQU0hfSGludCAgaGludCA9IHNvcnRbbm5dOwotICAgICAgICAgICAgRlRfUG9zICAgIGQgICAgPSBvcmdfdSAtIGhpbnQtPm9yZ19wb3M7Ci0KLQotICAgICAgICAgICAgaWYgKCBkIDwgdGhyZXNob2xkICYmIC1kIDwgdGhyZXNob2xkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHNoX3BvaW50X3NldF9zdHJvbmcoIHBvaW50ICk7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFnczIgfD0gUFNIX1BPSU5UX0VER0VfTUlOOwotICAgICAgICAgICAgICBwb2ludC0+aGludCAgICA9IGhpbnQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggcG9pbnRfZGlyID09IC1tYWpvcl9kaXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgbm47Ci0KLQotICAgICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1faGludHM7IG5uKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBTSF9IaW50ICBoaW50ID0gc29ydFtubl07Ci0gICAgICAgICAgICBGVF9Qb3MgICAgZCAgICA9IG9yZ191IC0gaGludC0+b3JnX3BvcyAtIGhpbnQtPm9yZ19sZW47Ci0KLQotICAgICAgICAgICAgaWYgKCBkIDwgdGhyZXNob2xkICYmIC1kIDwgdGhyZXNob2xkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHNoX3BvaW50X3NldF9zdHJvbmcoIHBvaW50ICk7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFnczIgfD0gUFNIX1BPSU5UX0VER0VfTUFYOwotICAgICAgICAgICAgICBwb2ludC0+aGludCAgICA9IGhpbnQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0jaWYgMQotICAgICAgZWxzZSBpZiAoIHBzaF9wb2ludF9pc19leHRyZW11bSggcG9pbnQgKSApCi0gICAgICB7Ci0gICAgICAgIC8qIHRyZWF0IGV4dHJlbWEgYXMgc3BlY2lhbCBjYXNlcyBmb3Igc3RlbSBlZGdlIGFsaWdubWVudCAqLwotICAgICAgICBGVF9VSW50ICBubiwgbWluX2ZsYWcsIG1heF9mbGFnOwotCi0KLSAgICAgICAgaWYgKCBtYWpvcl9kaXIgPT0gUFNIX0RJUl9IT1JJWk9OVEFMICkKLSAgICAgICAgewotICAgICAgICAgIG1pbl9mbGFnID0gUFNIX1BPSU5UX1BPU0lUSVZFOwotICAgICAgICAgIG1heF9mbGFnID0gUFNIX1BPSU5UX05FR0FUSVZFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1pbl9mbGFnID0gUFNIX1BPSU5UX05FR0FUSVZFOwotICAgICAgICAgIG1heF9mbGFnID0gUFNIX1BPSU5UX1BPU0lUSVZFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MyICYgbWluX2ZsYWcgKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9oaW50czsgbm4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgUFNIX0hpbnQgIGhpbnQgPSBzb3J0W25uXTsKLSAgICAgICAgICAgIEZUX1BvcyAgICBkICAgID0gb3JnX3UgLSBoaW50LT5vcmdfcG9zOwotCi0KLSAgICAgICAgICAgIGlmICggZCA8IHRocmVzaG9sZCAmJiAtZCA8IHRocmVzaG9sZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFnczIgfD0gUFNIX1BPSU5UX0VER0VfTUlOOwotICAgICAgICAgICAgICBwb2ludC0+aGludCAgICA9IGhpbnQ7Ci0gICAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHBvaW50LT5mbGFnczIgJiBtYXhfZmxhZyApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX2hpbnRzOyBubisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQU0hfSGludCAgaGludCA9IHNvcnRbbm5dOwotICAgICAgICAgICAgRlRfUG9zICAgIGQgICAgPSBvcmdfdSAtIGhpbnQtPm9yZ19wb3MgLSBoaW50LT5vcmdfbGVuOwotCi0KLSAgICAgICAgICAgIGlmICggZCA8IHRocmVzaG9sZCAmJiAtZCA8IHRocmVzaG9sZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFnczIgfD0gUFNIX1BPSU5UX0VER0VfTUFYOwotICAgICAgICAgICAgICBwb2ludC0+aGludCAgICA9IGhpbnQ7Ci0gICAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICFwb2ludC0+aGludCApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX2hpbnRzOyBubisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQU0hfSGludCAgaGludCA9IHNvcnRbbm5dOwotCi0KLSAgICAgICAgICAgIGlmICggb3JnX3UgPj0gaGludC0+b3JnX3BvcyAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBvcmdfdSA8PSBoaW50LT5vcmdfcG9zICsgaGludC0+b3JnX2xlbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvaW50LT5oaW50ID0gaGludDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSNlbmRpZiAvKiAxICovCi0gICAgfQotICB9Ci0KLQotICAvKiB0aGUgYWNjZXB0ZWQgc2hpZnQgZm9yIHN0cm9uZyBwb2ludHMgaW4gZnJhY3Rpb25hbCBwaXhlbHMgKi8KLSNkZWZpbmUgUFNIX1NUUk9OR19USFJFU0hPTEQgIDMyCi0KLSAgLyogdGhlIG1heGltdW0gc2hpZnQgdmFsdWUgaW4gZm9udCB1bml0cyAqLwotI2RlZmluZSBQU0hfU1RST05HX1RIUkVTSE9MRF9NQVhJTVVNICAzMAotCi0KLSAgLyogZmluZCBzdHJvbmcgcG9pbnRzIGluIGEgZ2x5cGggKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2ZpbmRfc3Ryb25nX3BvaW50cyggUFNIX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24gKQotICB7Ci0gICAgLyogYSBwb2ludCBpcyBgc3Ryb25nJyBpZiBpdCBpcyBsb2NhdGVkIG9uIGEgc3RlbSBlZGdlIGFuZCAgICAgICAqLwotICAgIC8qIGhhcyBhbiBgaW4nIG9yIGBvdXQnIHRhbmdlbnQgcGFyYWxsZWwgdG8gdGhlIGhpbnQncyBkaXJlY3Rpb24gKi8KLQotICAgIFBTSF9IaW50X1RhYmxlICB0YWJsZSAgICAgPSAmZ2x5cGgtPmhpbnRfdGFibGVzW2RpbWVuc2lvbl07Ci0gICAgUFNfTWFzayAgICAgICAgIG1hc2sgICAgICA9IHRhYmxlLT5oaW50X21hc2tzLT5tYXNrczsKLSAgICBGVF9VSW50ICAgICAgICAgbnVtX21hc2tzID0gdGFibGUtPmhpbnRfbWFza3MtPm51bV9tYXNrczsKLSAgICBGVF9VSW50ICAgICAgICAgZmlyc3QgICAgID0gMDsKLSAgICBGVF9JbnQgICAgICAgICAgbWFqb3JfZGlyID0gKCBkaW1lbnNpb24gPT0gMCApID8gUFNIX0RJUl9WRVJUSUNBTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQU0hfRElSX0hPUklaT05UQUw7Ci0gICAgUFNIX0RpbWVuc2lvbiAgIGRpbSAgICAgICA9ICZnbHlwaC0+Z2xvYmFscy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0gICAgRlRfRml4ZWQgICAgICAgIHNjYWxlICAgICA9IGRpbS0+c2NhbGVfbXVsdDsKLSAgICBGVF9JbnQgICAgICAgICAgdGhyZXNob2xkOwotCi0KLSAgICB0aHJlc2hvbGQgPSAoRlRfSW50KUZUX0RpdkZpeCggUFNIX1NUUk9OR19USFJFU0hPTEQsIHNjYWxlICk7Ci0gICAgaWYgKCB0aHJlc2hvbGQgPiBQU0hfU1RST05HX1RIUkVTSE9MRF9NQVhJTVVNICkKLSAgICAgIHRocmVzaG9sZCA9IFBTSF9TVFJPTkdfVEhSRVNIT0xEX01BWElNVU07Ci0KLSAgICAvKiBwcm9jZXNzIHNlY29uZGFyeSBoaW50cyB0byBgc2VsZWN0ZWQnIHBvaW50cyAqLwotICAgIGlmICggbnVtX21hc2tzID4gMSAmJiBnbHlwaC0+bnVtX3BvaW50cyA+IDAgKQotICAgIHsKLSAgICAgIC8qIHRoZSBgZW5kY2hhcicgb3AgY2FuIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHBvaW50cyAqLwotICAgICAgZmlyc3QgPSBtYXNrLT5lbmRfcG9pbnQgPiBnbHlwaC0+bnVtX3BvaW50cwotICAgICAgICAgICAgICAgID8gZ2x5cGgtPm51bV9wb2ludHMKLSAgICAgICAgICAgICAgICA6IG1hc2stPmVuZF9wb2ludDsKLSAgICAgIG1hc2srKzsKLSAgICAgIGZvciAoIDsgbnVtX21hc2tzID4gMTsgbnVtX21hc2tzLS0sIG1hc2srKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIG5leHQgPSBGVF9NSU4oIG1hc2stPmVuZF9wb2ludCwgZ2x5cGgtPm51bV9wb2ludHMgKTsKLQotCi0gICAgICAgIGlmICggbmV4dCA+IGZpcnN0ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgICAgY291bnQgPSBuZXh0IC0gZmlyc3Q7Ci0gICAgICAgICAgUFNIX1BvaW50ICBwb2ludCA9IGdseXBoLT5wb2ludHMgKyBmaXJzdDsKLQotCi0gICAgICAgICAgcHNoX2hpbnRfdGFibGVfYWN0aXZhdGVfbWFzayggdGFibGUsIG1hc2sgKTsKLQotICAgICAgICAgIHBzaF9oaW50X3RhYmxlX2ZpbmRfc3Ryb25nX3BvaW50cyggdGFibGUsIHBvaW50LCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgbWFqb3JfZGlyICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBuZXh0OwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHByb2Nlc3MgcHJpbWFyeSBoaW50cyBmb3IgYWxsIHBvaW50cyAqLwotICAgIGlmICggbnVtX21hc2tzID09IDEgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKLSAgICAgIFBTSF9Qb2ludCAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwotCi0KLSAgICAgIHBzaF9oaW50X3RhYmxlX2FjdGl2YXRlX21hc2soIHRhYmxlLCB0YWJsZS0+aGludF9tYXNrcy0+bWFza3MgKTsKLQotICAgICAgcHNoX2hpbnRfdGFibGVfZmluZF9zdHJvbmdfcG9pbnRzKCB0YWJsZSwgcG9pbnQsIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQsIG1ham9yX2RpciApOwotICAgIH0KLQotICAgIC8qIG5vdywgY2VydGFpbiBwb2ludHMgbWF5IGhhdmUgYmVlbiBhdHRhY2hlZCB0byBhIGhpbnQgYW5kICovCi0gICAgLyogbm90IG1hcmtlZCBhcyBzdHJvbmc7IHVwZGF0ZSB0aGVpciBmbGFncyB0aGVuICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBGVF9VSW50ICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7Ci0gICAgICBQU0hfUG9pbnQgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKLQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcG9pbnQrKyApCi0gICAgICAgIGlmICggcG9pbnQtPmhpbnQgJiYgIXBzaF9wb2ludF9pc19zdHJvbmcoIHBvaW50ICkgKQotICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgIH0KLSAgfQotCi0KLSAgLyogZmluZCBwb2ludHMgaW4gYSBnbHlwaCB3aGljaCBhcmUgaW4gYSBibHVlIHpvbmUgYW5kIGhhdmUgYGluJyBvciAqLwotICAvKiBgb3V0JyB0YW5nZW50cyBwYXJhbGxlbCB0byB0aGUgaG9yaXpvbnRhbCBheGlzICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9maW5kX2JsdWVfcG9pbnRzKCBQU0hfQmx1ZXMgIGJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dseXBoICBnbHlwaCApCi0gIHsKLSAgICBQU0hfQmx1ZV9UYWJsZSAgdGFibGU7Ci0gICAgUFNIX0JsdWVfWm9uZSAgIHpvbmU7Ci0gICAgRlRfVUludCAgICAgICAgIGdseXBoX2NvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7Ci0gICAgRlRfVUludCAgICAgICAgIGJsdWVfY291bnQ7Ci0gICAgUFNIX1BvaW50ICAgICAgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKLQotCi0gICAgZm9yICggOyBnbHlwaF9jb3VudCA+IDA7IGdseXBoX2NvdW50LS0sIHBvaW50KysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgeTsKLQotCi0gICAgICAvKiBjaGVjayB0YW5nZW50cyAqLwotICAgICAgaWYgKCAhUFNIX0RJUl9DT01QQVJFKCBwb2ludC0+ZGlyX2luLCAgUFNIX0RJUl9IT1JJWk9OVEFMICkgJiYKLSAgICAgICAgICAgIVBTSF9ESVJfQ09NUEFSRSggcG9pbnQtPmRpcl9vdXQsIFBTSF9ESVJfSE9SSVpPTlRBTCApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIHNraXAgc3Ryb25nIHBvaW50cyAqLwotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfc3Ryb25nKCBwb2ludCApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIHkgPSBwb2ludC0+b3JnX3U7Ci0KLSAgICAgIC8qIGxvb2sgdXAgdG9wIHpvbmVzICovCi0gICAgICB0YWJsZSAgICAgID0gJmJsdWVzLT5ub3JtYWxfdG9wOwotICAgICAgYmx1ZV9jb3VudCA9IHRhYmxlLT5jb3VudDsKLSAgICAgIHpvbmUgICAgICAgPSB0YWJsZS0+em9uZXM7Ci0KLSAgICAgIGZvciAoIDsgYmx1ZV9jb3VudCA+IDA7IGJsdWVfY291bnQtLSwgem9uZSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkZWx0YSA9IHkgLSB6b25lLT5vcmdfYm90dG9tOwotCi0KLSAgICAgICAgaWYgKCBkZWx0YSA8IC1ibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIHkgPD0gem9uZS0+b3JnX3RvcCArIGJsdWVzLT5ibHVlX2Z1enogKQotICAgICAgICAgIGlmICggYmx1ZXMtPm5vX292ZXJzaG9vdHMgfHwgZGVsdGEgPD0gYmx1ZXMtPmJsdWVfdGhyZXNob2xkICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSB6b25lLT5jdXJfYm90dG9tOwotICAgICAgICAgICAgcHNoX3BvaW50X3NldF9zdHJvbmcoIHBvaW50ICk7Ci0gICAgICAgICAgICBwc2hfcG9pbnRfc2V0X2ZpdHRlZCggcG9pbnQgKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGxvb2sgdXAgYm90dG9tIHpvbmVzICovCi0gICAgICB0YWJsZSAgICAgID0gJmJsdWVzLT5ub3JtYWxfYm90dG9tOwotICAgICAgYmx1ZV9jb3VudCA9IHRhYmxlLT5jb3VudDsKLSAgICAgIHpvbmUgICAgICAgPSB0YWJsZS0+em9uZXMgKyBibHVlX2NvdW50IC0gMTsKLQotICAgICAgZm9yICggOyBibHVlX2NvdW50ID4gMDsgYmx1ZV9jb3VudC0tLCB6b25lLS0gKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGRlbHRhID0gem9uZS0+b3JnX3RvcCAtIHk7Ci0KLQotICAgICAgICBpZiAoIGRlbHRhIDwgLWJsdWVzLT5ibHVlX2Z1enogKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggeSA+PSB6b25lLT5vcmdfYm90dG9tIC0gYmx1ZXMtPmJsdWVfZnV6eiApCi0gICAgICAgICAgaWYgKCBibHVlcy0+bm9fb3ZlcnNob290cyB8fCBkZWx0YSA8IGJsdWVzLT5ibHVlX3RocmVzaG9sZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gem9uZS0+Y3VyX3RvcDsKLSAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgICAgICAgICAgcHNoX3BvaW50X3NldF9maXR0ZWQoIHBvaW50ICk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogaW50ZXJwb2xhdGUgc3Ryb25nIHBvaW50cyB3aXRoIHRoZSBoZWxwIG9mIGhpbnRlZCBjb29yZGluYXRlcyAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfaW50ZXJwb2xhdGVfc3Ryb25nX3BvaW50cyggUFNIX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGltZW5zaW9uICkKLSAgewotICAgIFBTSF9EaW1lbnNpb24gIGRpbSAgID0gJmdseXBoLT5nbG9iYWxzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZSA9IGRpbS0+c2NhbGVfbXVsdDsKLQotICAgIEZUX1VJbnQgICAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7Ci0gICAgUFNIX1BvaW50ICAgICAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwotCi0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcG9pbnQrKyApCi0gICAgewotICAgICAgUFNIX0hpbnQgIGhpbnQgPSBwb2ludC0+aGludDsKLQotCi0gICAgICBpZiAoIGhpbnQgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGRlbHRhOwotCi0KLSAgICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfZWRnZV9taW4oIHBvaW50ICkgKQotICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGhpbnQtPmN1cl9wb3M7Ci0KLSAgICAgICAgZWxzZSBpZiAoIHBzaF9wb2ludF9pc19lZGdlX21heCggcG9pbnQgKSApCi0gICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvcyArIGhpbnQtPmN1cl9sZW47Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGEgPSBwb2ludC0+b3JnX3UgLSBoaW50LT5vcmdfcG9zOwotCi0gICAgICAgICAgaWYgKCBkZWx0YSA8PSAwICkKLSAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGhpbnQtPmN1cl9wb3MgKyBGVF9NdWxGaXgoIGRlbHRhLCBzY2FsZSApOwotCi0gICAgICAgICAgZWxzZSBpZiAoIGRlbHRhID49IGhpbnQtPm9yZ19sZW4gKQotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvcyArIGhpbnQtPmN1cl9sZW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGRlbHRhIC0gaGludC0+b3JnX2xlbiwgc2NhbGUgKTsKLQotICAgICAgICAgIGVsc2UgLyogaGludC0+b3JnX2xlbiA+IDAgKi8KLSAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGhpbnQtPmN1cl9wb3MgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGRlbHRhLCBoaW50LT5jdXJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQtPm9yZ19sZW4gKTsKLSAgICAgICAgfQotICAgICAgICBwc2hfcG9pbnRfc2V0X2ZpdHRlZCggcG9pbnQgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0jZGVmaW5lICBQU0hfTUFYX1NUUk9OR19JTlRFUk5BTCAgMTYKLQotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfaW50ZXJwb2xhdGVfbm9ybWFsX3BvaW50cyggUFNIX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGltZW5zaW9uICkKLSAgewotCi0jaWYgMQotICAgIC8qIGZpcnN0IHRlY2huaXF1ZTogYSBwb2ludCBpcyBzdHJvbmcgaWYgaXQgaXMgYSBsb2NhbCBleHRyZW11bSAqLwotCi0gICAgUFNIX0RpbWVuc2lvbiAgZGltICAgID0gJmdseXBoLT5nbG9iYWxzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZSAgPSBkaW0tPnNjYWxlX211bHQ7Ci0gICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ID0gZ2x5cGgtPm1lbW9yeTsKLQotICAgIFBTSF9Qb2ludCogICAgIHN0cm9uZ3MgICAgID0gTlVMTDsKLSAgICBQU0hfUG9pbnQgICAgICBzdHJvbmdzXzBbUFNIX01BWF9TVFJPTkdfSU5URVJOQUxdOwotICAgIEZUX1VJbnQgICAgICAgIG51bV9zdHJvbmdzID0gMDsKLQotICAgIFBTSF9Qb2ludCAgICAgIHBvaW50cyA9IGdseXBoLT5wb2ludHM7Ci0gICAgUFNIX1BvaW50ICAgICAgcG9pbnRzX2VuZCA9IHBvaW50cyArIGdseXBoLT5udW1fcG9pbnRzOwotICAgIFBTSF9Qb2ludCAgICAgIHBvaW50OwotCi0KLSAgICAvKiBmaXJzdCBjb3VudCB0aGUgbnVtYmVyIG9mIHN0cm9uZyBwb2ludHMgKi8KLSAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludHNfZW5kOyBwb2ludCsrICkKLSAgICB7Ci0gICAgICBpZiAoIHBzaF9wb2ludF9pc19zdHJvbmcoIHBvaW50ICkgKQotICAgICAgICBudW1fc3Ryb25ncysrOwotICAgIH0KLQotICAgIGlmICggbnVtX3N0cm9uZ3MgPT0gMCApICAvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KLSAgICAgIHJldHVybjsKLQotICAgIC8qIGFsbG9jYXRlIGFuIGFycmF5IHRvIHN0b3JlIGEgbGlzdCBvZiBwb2ludHMsICovCi0gICAgLyogc3RvcmVkIGluIGluY3JlYXNpbmcgb3JnX3Ugb3JkZXIgICAgICAgICAgICAgKi8KLSAgICBpZiAoIG51bV9zdHJvbmdzIDw9IFBTSF9NQVhfU1RST05HX0lOVEVSTkFMICkKLSAgICAgIHN0cm9uZ3MgPSBzdHJvbmdzXzA7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggc3Ryb25ncywgbnVtX3N0cm9uZ3MgKSApCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBudW1fc3Ryb25ncyA9IDA7Ci0gICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRzX2VuZDsgcG9pbnQrKyApCi0gICAgewotICAgICAgUFNIX1BvaW50KiAgaW5zZXJ0OwotCi0KLSAgICAgIGlmICggIXBzaF9wb2ludF9pc19zdHJvbmcoIHBvaW50ICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgZm9yICggaW5zZXJ0ID0gc3Ryb25ncyArIG51bV9zdHJvbmdzOyBpbnNlcnQgPiBzdHJvbmdzOyBpbnNlcnQtLSApCi0gICAgICB7Ci0gICAgICAgIGlmICggaW5zZXJ0Wy0xXS0+b3JnX3UgPD0gcG9pbnQtPm9yZ191ICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpbnNlcnRbMF0gPSBpbnNlcnRbLTFdOwotICAgICAgfQotICAgICAgaW5zZXJ0WzBdID0gcG9pbnQ7Ci0gICAgICBudW1fc3Ryb25ncysrOwotICAgIH0KLQotICAgIC8qIG5vdyB0cnkgdG8gaW50ZXJwb2xhdGUgYWxsIG5vcm1hbCBwb2ludHMgKi8KLSAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludHNfZW5kOyBwb2ludCsrICkKLSAgICB7Ci0gICAgICBpZiAoIHBzaF9wb2ludF9pc19zdHJvbmcoIHBvaW50ICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyogc29tZXRpbWVzLCBzb21lIGxvY2FsIGV4dHJlbWEgYXJlIHNtb290aCBwb2ludHMgKi8KLSAgICAgIGlmICggcHNoX3BvaW50X2lzX3Ntb290aCggcG9pbnQgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggcG9pbnQtPmRpcl9pbiA9PSBQU0hfRElSX05PTkUgICB8fAotICAgICAgICAgICAgIHBvaW50LT5kaXJfaW4gIT0gcG9pbnQtPmRpcl9vdXQgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmICggIXBzaF9wb2ludF9pc19leHRyZW11bSggcG9pbnQgKSAmJgotICAgICAgICAgICAgICFwc2hfcG9pbnRfaXNfaW5mbGV4KCBwb2ludCApICAgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHBvaW50LT5mbGFncyAmPSB+UFNIX1BPSU5UX1NNT09USDsKLSAgICAgIH0KLQotICAgICAgLyogZmluZCBiZXN0IGVuY2xvc2luZyBwb2ludCBjb29yZGluYXRlcyB0aGVuIGludGVycG9sYXRlICovCi0gICAgICB7Ci0gICAgICAgIFBTSF9Qb2ludCAgIGJlZm9yZSwgYWZ0ZXI7Ci0gICAgICAgIEZUX1VJbnQgICAgIG5uOwotCi0KLSAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9zdHJvbmdzOyBubisrICkKLSAgICAgICAgICBpZiAoIHN0cm9uZ3Nbbm5dLT5vcmdfdSA+IHBvaW50LT5vcmdfdSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIG5uID09IDAgKSAgLyogcG9pbnQgYmVmb3JlIHRoZSBmaXJzdCBzdHJvbmcgcG9pbnQgKi8KLSAgICAgICAgewotICAgICAgICAgIGFmdGVyID0gc3Ryb25nc1swXTsKLQotICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGFmdGVyLT5jdXJfdSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIHBvaW50LT5vcmdfdSAtIGFmdGVyLT5vcmdfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBiZWZvcmUgPSBzdHJvbmdzW25uIC0gMV07Ci0KLSAgICAgICAgICBmb3IgKCBubiA9IG51bV9zdHJvbmdzOyBubiA+IDA7IG5uLS0gKQotICAgICAgICAgICAgaWYgKCBzdHJvbmdzW25uIC0gMV0tPm9yZ191IDwgcG9pbnQtPm9yZ191ICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBpZiAoIG5uID09IG51bV9zdHJvbmdzICkgIC8qIHBvaW50IGlzIGFmdGVyIGxhc3Qgc3Ryb25nIHBvaW50ICovCi0gICAgICAgICAgewotICAgICAgICAgICAgYmVmb3JlID0gc3Ryb25nc1tubiAtIDFdOwotCi0gICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBiZWZvcmUtPmN1cl91ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBwb2ludC0+b3JnX3UgLSBiZWZvcmUtPm9yZ191LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIHU7Ci0KLQotICAgICAgICAgICAgYWZ0ZXIgPSBzdHJvbmdzW25uXTsKLQotICAgICAgICAgICAgLyogbm93IGludGVycG9sYXRlIHBvaW50IGJldHdlZW4gYmVmb3JlIGFuZCBhZnRlciAqLwotICAgICAgICAgICAgdSA9IHBvaW50LT5vcmdfdTsKLQotICAgICAgICAgICAgaWYgKCB1ID09IGJlZm9yZS0+b3JnX3UgKQotICAgICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBiZWZvcmUtPmN1cl91OwotCi0gICAgICAgICAgICBlbHNlIGlmICggdSA9PSBhZnRlci0+b3JnX3UgKQotICAgICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBhZnRlci0+Y3VyX3U7Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gYmVmb3JlLT5jdXJfdSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCB1IC0gYmVmb3JlLT5vcmdfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5jdXJfdSAtIGJlZm9yZS0+Y3VyX3UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci0+b3JnX3UgLSBiZWZvcmUtPm9yZ191ICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBzaF9wb2ludF9zZXRfZml0dGVkKCBwb2ludCApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggc3Ryb25ncyAhPSBzdHJvbmdzXzAgKQotICAgICAgRlRfRlJFRSggc3Ryb25ncyApOwotCi0jZW5kaWYgLyogMSAqLwotCi0gIH0KLQotCi0gIC8qIGludGVycG9sYXRlIG90aGVyIHBvaW50cyAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfaW50ZXJwb2xhdGVfb3RoZXJfcG9pbnRzKCBQU0hfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRpbWVuc2lvbiApCi0gIHsKLSAgICBQU0hfRGltZW5zaW9uICBkaW0gICAgICAgICAgPSAmZ2x5cGgtPmdsb2JhbHMtPmRpbWVuc2lvbltkaW1lbnNpb25dOwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlICAgICAgICA9IGRpbS0+c2NhbGVfbXVsdDsKLSAgICBGVF9GaXhlZCAgICAgICBkZWx0YSAgICAgICAgPSBkaW0tPnNjYWxlX2RlbHRhOwotICAgIFBTSF9Db250b3VyICAgIGNvbnRvdXIgICAgICA9IGdseXBoLT5jb250b3VyczsKLSAgICBGVF9VSW50ICAgICAgICBudW1fY29udG91cnMgPSBnbHlwaC0+bnVtX2NvbnRvdXJzOwotCi0KLSAgICBmb3IgKCA7IG51bV9jb250b3VycyA+IDA7IG51bV9jb250b3Vycy0tLCBjb250b3VyKysgKQotICAgIHsKLSAgICAgIFBTSF9Qb2ludCAgc3RhcnQgPSBjb250b3VyLT5zdGFydDsKLSAgICAgIFBTSF9Qb2ludCAgZmlyc3QsIG5leHQsIHBvaW50OwotICAgICAgRlRfVUludCAgICBmaXRfY291bnQ7Ci0KLQotICAgICAgLyogY291bnQgdGhlIG51bWJlciBvZiBzdHJvbmcgcG9pbnRzIGluIHRoaXMgY29udG91ciAqLwotICAgICAgbmV4dCAgICAgID0gc3RhcnQgKyBjb250b3VyLT5jb3VudDsKLSAgICAgIGZpdF9jb3VudCA9IDA7Ci0gICAgICBmaXJzdCAgICAgPSBOVUxMOwotCi0gICAgICBmb3IgKCBwb2ludCA9IHN0YXJ0OyBwb2ludCA8IG5leHQ7IHBvaW50KysgKQotICAgICAgICBpZiAoIHBzaF9wb2ludF9pc19maXR0ZWQoIHBvaW50ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAhZmlyc3QgKQotICAgICAgICAgICAgZmlyc3QgPSBwb2ludDsKLQotICAgICAgICAgIGZpdF9jb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgIC8qIGlmIHRoZXJlIGFyZSBsZXNzIHRoYW4gMiBmaXR0ZWQgcG9pbnRzIGluIHRoZSBjb250b3VyLCB3ZSAqLwotICAgICAgLyogc2ltcGx5IHNjYWxlIGFuZCBldmVudHVhbGx5IHRyYW5zbGF0ZSB0aGUgY29udG91ciBwb2ludHMgICovCi0gICAgICBpZiAoIGZpdF9jb3VudCA8IDIgKQotICAgICAgewotICAgICAgICBpZiAoIGZpdF9jb3VudCA9PSAxICkKLSAgICAgICAgICBkZWx0YSA9IGZpcnN0LT5jdXJfdSAtIEZUX011bEZpeCggZmlyc3QtPm9yZ191LCBzY2FsZSApOwotCi0gICAgICAgIGZvciAoIHBvaW50ID0gc3RhcnQ7IHBvaW50IDwgbmV4dDsgcG9pbnQrKyApCi0gICAgICAgICAgaWYgKCBwb2ludCAhPSBmaXJzdCApCi0gICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBGVF9NdWxGaXgoIHBvaW50LT5vcmdfdSwgc2NhbGUgKSArIGRlbHRhOwotCi0gICAgICAgIGdvdG8gTmV4dF9Db250b3VyOwotICAgICAgfQotCi0gICAgICAvKiB0aGVyZSBhcmUgbW9yZSB0aGFuIDIgc3Ryb25nIHBvaW50cyBpbiB0aGlzIGNvbnRvdXI7IHdlICovCi0gICAgICAvKiBuZWVkIHRvIGludGVycG9sYXRlIHdlYWsgcG9pbnRzIGJldHdlZW4gdGhlbSAgICAgICAgICAgICovCi0gICAgICBzdGFydCA9IGZpcnN0OwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCBjb25zZWN1dGl2ZSBmaXR0ZWQgcG9pbnRzICovCi0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBuZXh0ID0gZmlyc3QtPm5leHQ7Ci0gICAgICAgICAgaWYgKCBuZXh0ID09IHN0YXJ0ICkKLSAgICAgICAgICAgIGdvdG8gTmV4dF9Db250b3VyOwotCi0gICAgICAgICAgaWYgKCAhcHNoX3BvaW50X2lzX2ZpdHRlZCggbmV4dCApICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZmlyc3QgPSBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZmluZCBuZXh0IGZpdHRlZCBwb2ludCBhZnRlciB1bmZpdHRlZCBvbmUgKi8KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIG5leHQgPSBuZXh0LT5uZXh0OwotICAgICAgICAgIGlmICggcHNoX3BvaW50X2lzX2ZpdHRlZCggbmV4dCApICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm93IGludGVycG9sYXRlIGJldHdlZW4gdGhlbSAqLwotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICAgIG9yZ19hLCBvcmdfYWIsIGN1cl9hLCBjdXJfYWI7Ci0gICAgICAgICAgRlRfUG9zICAgIG9yZ19jLCBvcmdfYWMsIGN1cl9jOwotICAgICAgICAgIEZUX0ZpeGVkICBzY2FsZV9hYjsKLQotCi0gICAgICAgICAgaWYgKCBmaXJzdC0+b3JnX3UgPD0gbmV4dC0+b3JnX3UgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9yZ19hICA9IGZpcnN0LT5vcmdfdTsKLSAgICAgICAgICAgIGN1cl9hICA9IGZpcnN0LT5jdXJfdTsKLSAgICAgICAgICAgIG9yZ19hYiA9IG5leHQtPm9yZ191IC0gb3JnX2E7Ci0gICAgICAgICAgICBjdXJfYWIgPSBuZXh0LT5jdXJfdSAtIGN1cl9hOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgb3JnX2EgID0gbmV4dC0+b3JnX3U7Ci0gICAgICAgICAgICBjdXJfYSAgPSBuZXh0LT5jdXJfdTsKLSAgICAgICAgICAgIG9yZ19hYiA9IGZpcnN0LT5vcmdfdSAtIG9yZ19hOwotICAgICAgICAgICAgY3VyX2FiID0gZmlyc3QtPmN1cl91IC0gY3VyX2E7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc2NhbGVfYWIgPSAweDEwMDAwTDsKLSAgICAgICAgICBpZiAoIG9yZ19hYiA+IDAgKQotICAgICAgICAgICAgc2NhbGVfYWIgPSBGVF9EaXZGaXgoIGN1cl9hYiwgb3JnX2FiICk7Ci0KLSAgICAgICAgICBwb2ludCA9IGZpcnN0LT5uZXh0OwotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgb3JnX2MgID0gcG9pbnQtPm9yZ191OwotICAgICAgICAgICAgb3JnX2FjID0gb3JnX2MgLSBvcmdfYTsKLQotICAgICAgICAgICAgaWYgKCBvcmdfYWMgPD0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIG9uIHRoZSBsZWZ0IG9mIHRoZSBpbnRlcnBvbGF0aW9uIHpvbmUgKi8KLSAgICAgICAgICAgICAgY3VyX2MgPSBjdXJfYSArIEZUX011bEZpeCggb3JnX2FjLCBzY2FsZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIG9yZ19hYyA+PSBvcmdfYWIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBvbiB0aGUgcmlnaHQgb24gdGhlIGludGVycG9sYXRpb24gem9uZSAqLwotICAgICAgICAgICAgICBjdXJfYyA9IGN1cl9hICsgY3VyX2FiICsgRlRfTXVsRml4KCBvcmdfYWMgLSBvcmdfYWIsIHNjYWxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgaW50ZXJwb2xhdGlvbiB6b25lICovCi0gICAgICAgICAgICAgIGN1cl9jID0gY3VyX2EgKyBGVF9NdWxGaXgoIG9yZ19hYywgc2NhbGVfYWIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gY3VyX2M7Ci0KLSAgICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0KLSAgICAgICAgICB9IHdoaWxlICggcG9pbnQgIT0gbmV4dCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoga2VlcCBnb2luZyB1bnRpbCBhbGwgcG9pbnRzIGluIHRoZSBjb250b3VycyBoYXZlIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgICAgIGZpcnN0ID0gbmV4dDsKLQotICAgICAgfSB3aGlsZSAoIGZpcnN0ICE9IHN0YXJ0ICk7Ci0KLSAgICBOZXh0X0NvbnRvdXI6Ci0gICAgICA7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICBISUdILUxFVkVMIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9FcnJvcgotICBwc19oaW50c19hcHBseSggUFNfSGludHMgICAgICAgIHBzX2hpbnRzLAotICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICBQU0hfR2xvYmFscyAgICAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKQotICB7Ci0gICAgUFNIX0dseXBoUmVjICBnbHlwaHJlYzsKLSAgICBQU0hfR2x5cGggICAgIGdseXBoID0gJmdseXBocmVjOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0jaWZkZWYgREVCVUdfSElOVEVSCi0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnk7Ci0jZW5kaWYKLSAgICBGVF9JbnQgICAgICAgIGRpbWVuc2lvbjsKLQotCi0gICAgLyogc29tZXRoaW5nIHRvIGRvPyAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCB8fCBvdXRsaW5lLT5uX2NvbnRvdXJzID09IDAgKQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotCi0gICAgbWVtb3J5ID0gZ2xvYmFscy0+bWVtb3J5OwotCi0gICAgaWYgKCBwc19kZWJ1Z19nbHlwaCApCi0gICAgewotICAgICAgcHNoX2dseXBoX2RvbmUoIHBzX2RlYnVnX2dseXBoICk7Ci0gICAgICBGVF9GUkVFKCBwc19kZWJ1Z19nbHlwaCApOwotICAgIH0KLQotICAgIGlmICggRlRfTkVXKCBnbHlwaCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHBzX2RlYnVnX2dseXBoID0gZ2x5cGg7Ci0KLSNlbmRpZiAvKiBERUJVR19ISU5URVIgKi8KLQotICAgIGVycm9yID0gcHNoX2dseXBoX2luaXQoIGdseXBoLCBvdXRsaW5lLCBwc19oaW50cywgZ2xvYmFscyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogdHJ5IHRvIG9wdGltaXplIHRoZSB5X3NjYWxlIHNvIHRoYXQgdGhlIHRvcCBvZiBub24tY2FwaXRhbCBsZXR0ZXJzCi0gICAgICogaXMgYWxpZ25lZCBvbiBhIHBpeGVsIGJvdW5kYXJ5IHdoZW5ldmVyIHBvc3NpYmxlCi0gICAgICovCi0gICAgewotICAgICAgUFNIX0RpbWVuc2lvbiAgZGltX3ggPSAmZ2x5cGgtPmdsb2JhbHMtPmRpbWVuc2lvblswXTsKLSAgICAgIFBTSF9EaW1lbnNpb24gIGRpbV95ID0gJmdseXBoLT5nbG9iYWxzLT5kaW1lbnNpb25bMV07Ci0KLSAgICAgIEZUX0ZpeGVkICB4X3NjYWxlID0gZGltX3gtPnNjYWxlX211bHQ7Ci0gICAgICBGVF9GaXhlZCAgeV9zY2FsZSA9IGRpbV95LT5zY2FsZV9tdWx0OwotCi0gICAgICBGVF9GaXhlZCAgb2xkX3hfc2NhbGUgPSB4X3NjYWxlOwotICAgICAgRlRfRml4ZWQgIG9sZF95X3NjYWxlID0geV9zY2FsZTsKLQotICAgICAgRlRfRml4ZWQgIHNjYWxlZDsKLSAgICAgIEZUX0ZpeGVkICBmaXR0ZWQ7Ci0KLSAgICAgIEZUX0Jvb2wgIHJlc2NhbGUgPSBGQUxTRTsKLQotCi0gICAgICBzY2FsZWQgPSBGVF9NdWxGaXgoIGdsb2JhbHMtPmJsdWVzLm5vcm1hbF90b3Auem9uZXMtPm9yZ19yZWYsIHlfc2NhbGUgKTsKLSAgICAgIGZpdHRlZCA9IEZUX1BJWF9ST1VORCggc2NhbGVkICk7Ci0KLSAgICAgIGlmICggZml0dGVkICE9IDAgJiYgc2NhbGVkICE9IGZpdHRlZCApCi0gICAgICB7Ci0gICAgICAgIHJlc2NhbGUgPSBUUlVFOwotCi0gICAgICAgIHlfc2NhbGUgPSBGVF9NdWxEaXYoIHlfc2NhbGUsIGZpdHRlZCwgc2NhbGVkICk7Ci0KLSAgICAgICAgaWYgKCBmaXR0ZWQgPCBzY2FsZWQgKQotICAgICAgICAgIHhfc2NhbGUgLT0geF9zY2FsZSAvIDUwOwotCi0gICAgICAgIHBzaF9nbG9iYWxzX3NldF9zY2FsZSggZ2x5cGgtPmdsb2JhbHMsIHhfc2NhbGUsIHlfc2NhbGUsIDAsIDAgKTsKLSAgICAgIH0KLQotICAgICAgZ2x5cGgtPmRvX2hvcnpfaGludHMgPSAxOwotICAgICAgZ2x5cGgtPmRvX3ZlcnRfaGludHMgPSAxOwotCi0gICAgICBnbHlwaC0+ZG9faG9yel9zbmFwcGluZyA9IEZUX0JPT0woIGhpbnRfbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9NT05PIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRfbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgICk7Ci0KLSAgICAgIGdseXBoLT5kb192ZXJ0X3NuYXBwaW5nID0gRlRfQk9PTCggaGludF9tb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRfbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApOwotCi0gICAgICBnbHlwaC0+ZG9fc3RlbV9hZGp1c3QgICA9IEZUX0JPT0woIGhpbnRfbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MSUdIVCApOwotCi0gICAgICBmb3IgKCBkaW1lbnNpb24gPSAwOyBkaW1lbnNpb24gPCAyOyBkaW1lbnNpb24rKyApCi0gICAgICB7Ci0gICAgICAgIC8qIGxvYWQgb3V0bGluZSBjb29yZGluYXRlcyBpbnRvIGdseXBoICovCi0gICAgICAgIHBzaF9nbHlwaF9sb2FkX3BvaW50cyggZ2x5cGgsIGRpbWVuc2lvbiApOwotCi0gICAgICAgIC8qIGNvbXB1dGUgbG9jYWwgZXh0cmVtYSAqLwotICAgICAgICBwc2hfZ2x5cGhfY29tcHV0ZV9leHRyZW1hKCBnbHlwaCApOwotCi0gICAgICAgIC8qIGNvbXB1dGUgYWxpZ25lZCBzdGVtL2hpbnRzIHBvc2l0aW9ucyAqLwotICAgICAgICBwc2hfaGludF90YWJsZV9hbGlnbl9oaW50cyggJmdseXBoLT5oaW50X3RhYmxlc1tkaW1lbnNpb25dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPmdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCApOwotCi0gICAgICAgIC8qIGZpbmQgc3Ryb25nIHBvaW50cywgYWxpZ24gdGhlbSwgdGhlbiBpbnRlcnBvbGF0ZSBvdGhlcnMgKi8KLSAgICAgICAgcHNoX2dseXBoX2ZpbmRfc3Ryb25nX3BvaW50cyggZ2x5cGgsIGRpbWVuc2lvbiApOwotICAgICAgICBpZiAoIGRpbWVuc2lvbiA9PSAxICkKLSAgICAgICAgICBwc2hfZ2x5cGhfZmluZF9ibHVlX3BvaW50cyggJmdsb2JhbHMtPmJsdWVzLCBnbHlwaCApOwotICAgICAgICBwc2hfZ2x5cGhfaW50ZXJwb2xhdGVfc3Ryb25nX3BvaW50cyggZ2x5cGgsIGRpbWVuc2lvbiApOwotICAgICAgICBwc2hfZ2x5cGhfaW50ZXJwb2xhdGVfbm9ybWFsX3BvaW50cyggZ2x5cGgsIGRpbWVuc2lvbiApOwotICAgICAgICBwc2hfZ2x5cGhfaW50ZXJwb2xhdGVfb3RoZXJfcG9pbnRzKCBnbHlwaCwgZGltZW5zaW9uICk7Ci0KLSAgICAgICAgLyogc2F2ZSBoaW50ZWQgY29vcmRpbmF0ZXMgYmFjayB0byBvdXRsaW5lICovCi0gICAgICAgIHBzaF9nbHlwaF9zYXZlX3BvaW50cyggZ2x5cGgsIGRpbWVuc2lvbiApOwotCi0gICAgICAgIGlmICggcmVzY2FsZSApCi0gICAgICAgICAgcHNoX2dsb2JhbHNfc2V0X3NjYWxlKCBnbHlwaC0+Z2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF94X3NjYWxlLCBvbGRfeV9zY2FsZSwgMCwgMCApOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotCi0jaWZuZGVmIERFQlVHX0hJTlRFUgotICAgIHBzaF9nbHlwaF9kb25lKCBnbHlwaCApOwotI2VuZGlmCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hhbGdvLmggYi9zcmMvcHNoaW50ZXIvcHNoYWxnby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU5N2QxLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9wc2hhbGdvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoYWxnby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgaGludGluZyBhbGdvcml0aG0gKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBTSEFMR09fSF8KLSNkZWZpbmUgUFNIQUxHT19IXwotCi0KLSNpbmNsdWRlICJwc2hyZWMuaCIKLSNpbmNsdWRlICJwc2hnbG9iLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiBoYW5kbGUgdG8gSGludCBzdHJ1Y3R1cmUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNIX0hpbnRSZWNfKiAgUFNIX0hpbnQ7Ci0KLQotICAvKiBoaW50IGJpdC1mbGFncyAqLwotI2RlZmluZSBQU0hfSElOVF9HSE9TVCAgIFBTX0hJTlRfRkxBR19HSE9TVAotI2RlZmluZSBQU0hfSElOVF9CT1RUT00gIFBTX0hJTlRfRkxBR19CT1RUT00KLSNkZWZpbmUgUFNIX0hJTlRfQUNUSVZFICA0VQotI2RlZmluZSBQU0hfSElOVF9GSVRURUQgIDhVCi0KLQotI2RlZmluZSBwc2hfaGludF9pc19hY3RpdmUoIHggKSAgKCAoICh4KS0+ZmxhZ3MgJiBQU0hfSElOVF9BQ1RJVkUgKSAhPSAwICkKLSNkZWZpbmUgcHNoX2hpbnRfaXNfZ2hvc3QoIHggKSAgICggKCAoeCktPmZsYWdzICYgUFNIX0hJTlRfR0hPU1QgICkgIT0gMCApCi0jZGVmaW5lIHBzaF9oaW50X2lzX2ZpdHRlZCggeCApICAoICggKHgpLT5mbGFncyAmIFBTSF9ISU5UX0ZJVFRFRCApICE9IDAgKQotCi0jZGVmaW5lIHBzaF9oaW50X2FjdGl2YXRlKCB4ICkgICAgKHgpLT5mbGFncyB8PSAgUFNIX0hJTlRfQUNUSVZFCi0jZGVmaW5lIHBzaF9oaW50X2RlYWN0aXZhdGUoIHggKSAgKHgpLT5mbGFncyAmPSB+UFNIX0hJTlRfQUNUSVZFCi0jZGVmaW5lIHBzaF9oaW50X3NldF9maXR0ZWQoIHggKSAgKHgpLT5mbGFncyB8PSAgUFNIX0hJTlRfRklUVEVECi0KLQotICAvKiBoaW50IHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0hpbnRSZWNfCi0gIHsKLSAgICBGVF9JbnQgICAgb3JnX3BvczsKLSAgICBGVF9JbnQgICAgb3JnX2xlbjsKLSAgICBGVF9Qb3MgICAgY3VyX3BvczsKLSAgICBGVF9Qb3MgICAgY3VyX2xlbjsKLSAgICBGVF9VSW50ICAgZmxhZ3M7Ci0gICAgUFNIX0hpbnQgIHBhcmVudDsKLSAgICBGVF9JbnQgICAgb3JkZXI7Ci0KLSAgfSBQU0hfSGludFJlYzsKLQotCi0gIC8qIHRoaXMgaXMgYW4gaW50ZXJwb2xhdGlvbiB6b25lIHVzZWQgZm9yIHN0cm9uZyBwb2ludHM7ICAqLwotICAvKiB3ZWFrIHBvaW50cyBhcmUgaW50ZXJwb2xhdGVkIGFjY29yZGluZyB0byB0aGVpciBzdHJvbmcgKi8KLSAgLyogbmVpZ2hib3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfWm9uZVJlY18KLSAgewotICAgIEZUX0ZpeGVkICBzY2FsZTsKLSAgICBGVF9GaXhlZCAgZGVsdGE7Ci0gICAgRlRfUG9zICAgIG1pbjsKLSAgICBGVF9Qb3MgICAgbWF4OwotCi0gIH0gUFNIX1pvbmVSZWMsICpQU0hfWm9uZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfSGludF9UYWJsZVJlY18KLSAgewotICAgIEZUX1VJbnQgICAgICAgIG1heF9oaW50czsKLSAgICBGVF9VSW50ICAgICAgICBudW1faGludHM7Ci0gICAgUFNIX0hpbnQgICAgICAgaGludHM7Ci0gICAgUFNIX0hpbnQqICAgICAgc29ydDsKLSAgICBQU0hfSGludCogICAgICBzb3J0X2dsb2JhbDsKLSAgICBGVF9VSW50ICAgICAgICBudW1fem9uZXM7Ci0gICAgUFNIX1pvbmVSZWMqICAgem9uZXM7Ci0gICAgUFNIX1pvbmUgICAgICAgem9uZTsKLSAgICBQU19NYXNrX1RhYmxlICBoaW50X21hc2tzOwotICAgIFBTX01hc2tfVGFibGUgIGNvdW50ZXJfbWFza3M7Ci0KLSAgfSBQU0hfSGludF9UYWJsZVJlYywgKlBTSF9IaW50X1RhYmxlOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNIX1BvaW50UmVjXyogICAgUFNIX1BvaW50OwotICB0eXBlZGVmIHN0cnVjdCBQU0hfQ29udG91clJlY18qICBQU0hfQ29udG91cjsKLQotICBlbnVtCi0gIHsKLSAgICBQU0hfRElSX05PTkUgID0gIDQsCi0gICAgUFNIX0RJUl9VUCAgICA9IC0xLAotICAgIFBTSF9ESVJfRE9XTiAgPSAgMSwKLSAgICBQU0hfRElSX0xFRlQgID0gLTIsCi0gICAgUFNIX0RJUl9SSUdIVCA9ICAyCi0gIH07Ci0KLSNkZWZpbmUgUFNIX0RJUl9IT1JJWk9OVEFMICAyCi0jZGVmaW5lIFBTSF9ESVJfVkVSVElDQUwgICAgMQotCi0jZGVmaW5lIFBTSF9ESVJfQ09NUEFSRSggZDEsIGQyICkgICAoIChkMSkgPT0gKGQyKSB8fCAoZDEpID09IC0oZDIpICkKLSNkZWZpbmUgUFNIX0RJUl9JU19IT1JJWk9OVEFMKCBkICkgIFBTSF9ESVJfQ09NUEFSRSggZCwgUFNIX0RJUl9IT1JJWk9OVEFMICkKLSNkZWZpbmUgUFNIX0RJUl9JU19WRVJUSUNBTCggZCApICAgIFBTSF9ESVJfQ09NUEFSRSggZCwgUFNIX0RJUl9WRVJUSUNBTCApCi0KLQotICAvKiB0aGUgZm9sbG93aW5nIGJpdC1mbGFncyBhcmUgY29tcHV0ZWQgb25jZSBieSB0aGUgZ2x5cGggKi8KLSAgLyogYW5hbHl6ZXIsIGZvciBib3RoIGRpbWVuc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBTSF9QT0lOVF9PRkYgICAgIDFVICAgICAgLyogcG9pbnQgaXMgb2ZmIHRoZSBjdXJ2ZSAqLwotI2RlZmluZSBQU0hfUE9JTlRfU01PT1RIICAyVSAgICAgIC8qIHBvaW50IGlzIHNtb290aCAgICAgICAgKi8KLSNkZWZpbmUgUFNIX1BPSU5UX0lORkxFWCAgNFUgICAgICAvKiBwb2ludCBpcyBpbmZsZWN0aW9uICAgICovCi0KLQotI2RlZmluZSBwc2hfcG9pbnRfaXNfc21vb3RoKCBwICkgICggKHApLT5mbGFncyAmIFBTSF9QT0lOVF9TTU9PVEggKQotI2RlZmluZSBwc2hfcG9pbnRfaXNfb2ZmKCBwICkgICAgICggKHApLT5mbGFncyAmIFBTSF9QT0lOVF9PRkYgICAgKQotI2RlZmluZSBwc2hfcG9pbnRfaXNfaW5mbGV4KCBwICkgICggKHApLT5mbGFncyAmIFBTSF9QT0lOVF9JTkZMRVggKQotCi0jZGVmaW5lIHBzaF9wb2ludF9zZXRfc21vb3RoKCBwICkgIChwKS0+ZmxhZ3MgfD0gUFNIX1BPSU5UX1NNT09USAotI2RlZmluZSBwc2hfcG9pbnRfc2V0X29mZiggcCApICAgICAocCktPmZsYWdzIHw9IFBTSF9QT0lOVF9PRkYKLSNkZWZpbmUgcHNoX3BvaW50X3NldF9pbmZsZXgoIHAgKSAgKHApLT5mbGFncyB8PSBQU0hfUE9JTlRfSU5GTEVYCi0KLQotICAvKiB0aGUgZm9sbG93aW5nIGJpdC1mbGFncyBhcmUgcmUtY29tcHV0ZWQgZm9yIGVhY2ggZGltZW5zaW9uICovCi0jZGVmaW5lIFBTSF9QT0lOVF9TVFJPTkcgICAgICAxNlUgLyogcG9pbnQgaXMgc3Ryb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUFNIX1BPSU5UX0ZJVFRFRCAgICAgIDMyVSAvKiBwb2ludCBpcyBhbHJlYWR5IGZpdHRlZCAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQU0hfUE9JTlRfRVhUUkVNVU0gICAgNjRVIC8qIHBvaW50IGlzIGxvY2FsIGV4dHJlbXVtICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBTSF9QT0lOVF9QT1NJVElWRSAgIDEyOFUgLyogZXh0cmVtdW0gaGFzIHBvc2l0aXZlIGNvbnRvdXIgZmxvdyAgICAgICAgKi8KLSNkZWZpbmUgUFNIX1BPSU5UX05FR0FUSVZFICAgMjU2VSAvKiBleHRyZW11bSBoYXMgbmVnYXRpdmUgY29udG91ciBmbG93ICAgICAgICAqLwotI2RlZmluZSBQU0hfUE9JTlRfRURHRV9NSU4gICA1MTJVIC8qIHBvaW50IGlzIGFsaWduZWQgdG8gbGVmdC9ib3R0b20gc3RlbSBlZGdlICovCi0jZGVmaW5lIFBTSF9QT0lOVF9FREdFX01BWCAgMTAyNFUgLyogcG9pbnQgaXMgYWxpZ25lZCB0byB0b3AvcmlnaHQgc3RlbSBlZGdlICAgKi8KLQotCi0jZGVmaW5lIHBzaF9wb2ludF9pc19zdHJvbmcoIHAgKSAgICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX1NUUk9ORyApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19maXR0ZWQoIHAgKSAgICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX0ZJVFRFRCApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19leHRyZW11bSggcCApICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX0VYVFJFTVVNICkKLSNkZWZpbmUgcHNoX3BvaW50X2lzX3Bvc2l0aXZlKCBwICkgICggKHApLT5mbGFnczIgJiBQU0hfUE9JTlRfUE9TSVRJVkUgKQotI2RlZmluZSBwc2hfcG9pbnRfaXNfbmVnYXRpdmUoIHAgKSAgKCAocCktPmZsYWdzMiAmIFBTSF9QT0lOVF9ORUdBVElWRSApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19lZGdlX21pbiggcCApICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX0VER0VfTUlOICkKLSNkZWZpbmUgcHNoX3BvaW50X2lzX2VkZ2VfbWF4KCBwICkgICggKHApLT5mbGFnczIgJiBQU0hfUE9JTlRfRURHRV9NQVggKQotCi0jZGVmaW5lIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwICkgICAgKHApLT5mbGFnczIgfD0gUFNIX1BPSU5UX1NUUk9ORwotI2RlZmluZSBwc2hfcG9pbnRfc2V0X2ZpdHRlZCggcCApICAgIChwKS0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9GSVRURUQKLSNkZWZpbmUgcHNoX3BvaW50X3NldF9leHRyZW11bSggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfRVhUUkVNVU0KLSNkZWZpbmUgcHNoX3BvaW50X3NldF9wb3NpdGl2ZSggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfUE9TSVRJVkUKLSNkZWZpbmUgcHNoX3BvaW50X3NldF9uZWdhdGl2ZSggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfTkVHQVRJVkUKLSNkZWZpbmUgcHNoX3BvaW50X3NldF9lZGdlX21pbiggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfRURHRV9NSU4KLSNkZWZpbmUgcHNoX3BvaW50X3NldF9lZGdlX21heCggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfRURHRV9NQVgKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfUG9pbnRSZWNfCi0gIHsKLSAgICBQU0hfUG9pbnQgICAgcHJldjsKLSAgICBQU0hfUG9pbnQgICAgbmV4dDsKLSAgICBQU0hfQ29udG91ciAgY29udG91cjsKLSAgICBGVF9VSW50ICAgICAgZmxhZ3M7Ci0gICAgRlRfVUludCAgICAgIGZsYWdzMjsKLSAgICBGVF9DaGFyICAgICAgZGlyX2luOwotICAgIEZUX0NoYXIgICAgICBkaXJfb3V0OwotICAgIFBTSF9IaW50ICAgICBoaW50OwotICAgIEZUX1BvcyAgICAgICBvcmdfdTsKLSAgICBGVF9Qb3MgICAgICAgb3JnX3Y7Ci0gICAgRlRfUG9zICAgICAgIGN1cl91OwotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgIEZUX1BvcyAgICAgICBvcmdfeDsKLSAgICBGVF9Qb3MgICAgICAgY3VyX3g7Ci0gICAgRlRfUG9zICAgICAgIG9yZ195OwotICAgIEZUX1BvcyAgICAgICBjdXJfeTsKLSAgICBGVF9VSW50ICAgICAgZmxhZ3NfeDsKLSAgICBGVF9VSW50ICAgICAgZmxhZ3NfeTsKLSNlbmRpZgotCi0gIH0gUFNIX1BvaW50UmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9Db250b3VyUmVjXwotICB7Ci0gICAgUFNIX1BvaW50ICBzdGFydDsKLSAgICBGVF9VSW50ICAgIGNvdW50OwotCi0gIH0gUFNIX0NvbnRvdXJSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0dseXBoUmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgICAgIG51bV9wb2ludHM7Ci0gICAgRlRfVUludCAgICAgICAgICAgIG51bV9jb250b3VyczsKLQotICAgIFBTSF9Qb2ludCAgICAgICAgICBwb2ludHM7Ci0gICAgUFNIX0NvbnRvdXIgICAgICAgIGNvbnRvdXJzOwotCi0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZTsKLSAgICBQU0hfR2xvYmFscyAgICAgICAgZ2xvYmFsczsKLSAgICBQU0hfSGludF9UYWJsZVJlYyAgaGludF90YWJsZXNbMl07Ci0KLSAgICBGVF9Cb29sICAgICAgICAgICAgdmVydGljYWw7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIG1ham9yX2RpcjsKLSAgICBGVF9JbnQgICAgICAgICAgICAgbWlub3JfZGlyOwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIGRvX2hvcnpfaGludHM7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgIGRvX3ZlcnRfaGludHM7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgIGRvX2hvcnpfc25hcHBpbmc7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgIGRvX3ZlcnRfc25hcHBpbmc7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgIGRvX3N0ZW1fYWRqdXN0OwotCi0gIH0gUFNIX0dseXBoUmVjLCAqUFNIX0dseXBoOwotCi0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgZXh0ZXJuIFBTSF9IaW50X1RhYmxlICBwc19kZWJ1Z19oaW50X3RhYmxlOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKlBTSF9IaW50RnVuYykoIFBTSF9IaW50ICBoaW50LAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICB2ZXJ0aWNhbCApOwotCi0gIGV4dGVybiBQU0hfSGludEZ1bmMgICAgcHNfZGVidWdfaGludF9mdW5jOwotCi0gIGV4dGVybiBQU0hfR2x5cGggICAgICAgcHNfZGVidWdfZ2x5cGg7Ci0jZW5kaWYKLQotCi0gIGV4dGVybiBGVF9FcnJvcgotICBwc19oaW50c19hcHBseSggUFNfSGludHMgICAgICAgIHBzX2hpbnRzLAotICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICBQU0hfR2xvYmFscyAgICAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFBTSEFMR09fSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hnbG9iLmMgYi9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg3NzBjLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9wc2hnbG9iLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoZ2xvYi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgaGludGVyIGdsb2JhbCBoaW50aW5nIG1hbmFnZW1lbnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJbnNwaXJlZCBieSB0aGUgbmV3IGF1dG8taGludGVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCi0vKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJwc2hnbG9iLmgiCi0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgUFNIX0dsb2JhbHMgIHBzX2RlYnVnX2dsb2JhbHMgPSBOVUxMOwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNUQU5EQVJEIFdJRFRIUyAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIHNjYWxlIHRoZSB3aWR0aHMvaGVpZ2h0cyB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2xvYmFsc19zY2FsZV93aWR0aHMoIFBTSF9HbG9iYWxzICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBkaXJlY3Rpb24gKQotICB7Ci0gICAgUFNIX0RpbWVuc2lvbiAgZGltICAgPSAmZ2xvYmFscy0+ZGltZW5zaW9uW2RpcmVjdGlvbl07Ci0gICAgUFNIX1dpZHRocyAgICAgc3RkdyAgPSAmZGltLT5zdGR3OwotICAgIEZUX1VJbnQgICAgICAgIGNvdW50ID0gc3Rkdy0+Y291bnQ7Ci0gICAgUFNIX1dpZHRoICAgICAgd2lkdGggPSBzdGR3LT53aWR0aHM7Ci0gICAgUFNIX1dpZHRoICAgICAgc3RhbmQgPSB3aWR0aDsgICAgICAgICAgICAgICAvKiBzdGFuZGFyZCB3aWR0aC9oZWlnaHQgKi8KLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZSA9IGRpbS0+c2NhbGVfbXVsdDsKLQotCi0gICAgaWYgKCBjb3VudCA+IDAgKQotICAgIHsKLSAgICAgIHdpZHRoLT5jdXIgPSBGVF9NdWxGaXgoIHdpZHRoLT5vcmcsIHNjYWxlICk7Ci0gICAgICB3aWR0aC0+Zml0ID0gRlRfUElYX1JPVU5EKCB3aWR0aC0+Y3VyICk7Ci0KLSAgICAgIHdpZHRoKys7Ci0gICAgICBjb3VudC0tOwotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgd2lkdGgrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgdywgZGlzdDsKLQotCi0gICAgICAgIHcgICAgPSBGVF9NdWxGaXgoIHdpZHRoLT5vcmcsIHNjYWxlICk7Ci0gICAgICAgIGRpc3QgPSB3IC0gc3RhbmQtPmN1cjsKLQotICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgaWYgKCBkaXN0IDwgMTI4ICkKLSAgICAgICAgICB3ID0gc3RhbmQtPmN1cjsKLQotICAgICAgICB3aWR0aC0+Y3VyID0gdzsKLSAgICAgICAgd2lkdGgtPmZpdCA9IEZUX1BJWF9ST1VORCggdyApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSNpZiAwCi0KLSAgLyogb3JnX3dpZHRoIGlzIGluIGZvbnQgdW5pdHMsIHJlc3VsdCBpbiBkZXZpY2UgcGl4ZWxzLCAyNi42IGZvcm1hdCAqLwotICBGVF9MT0NBTF9ERUYoIEZUX1BvcyApCi0gIHBzaF9kaW1lbnNpb25fc25hcF93aWR0aCggUFNIX0RpbWVuc2lvbiAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG9yZ193aWR0aCApCi0gIHsKLSAgICBGVF9VSW50ICBuOwotICAgIEZUX1BvcyAgIHdpZHRoICAgICA9IEZUX011bEZpeCggb3JnX3dpZHRoLCBkaW1lbnNpb24tPnNjYWxlX211bHQgKTsKLSAgICBGVF9Qb3MgICBiZXN0ICAgICAgPSA2NCArIDMyICsgMjsKLSAgICBGVF9Qb3MgICByZWZlcmVuY2UgPSB3aWR0aDsKLQotCi0gICAgZm9yICggbiA9IDA7IG4gPCBkaW1lbnNpb24tPnN0ZHcuY291bnQ7IG4rKyApCi0gICAgewotICAgICAgRlRfUG9zICB3OwotICAgICAgRlRfUG9zICBkaXN0OwotCi0KLSAgICAgIHcgPSBkaW1lbnNpb24tPnN0ZHcud2lkdGhzW25dLmN1cjsKLSAgICAgIGRpc3QgPSB3aWR0aCAtIHc7Ci0gICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgZGlzdCA9IC1kaXN0OwotICAgICAgaWYgKCBkaXN0IDwgYmVzdCApCi0gICAgICB7Ci0gICAgICAgIGJlc3QgICAgICA9IGRpc3Q7Ci0gICAgICAgIHJlZmVyZW5jZSA9IHc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCB3aWR0aCA+PSByZWZlcmVuY2UgKQotICAgIHsKLSAgICAgIHdpZHRoIC09IDB4MjE7Ci0gICAgICBpZiAoIHdpZHRoIDwgcmVmZXJlbmNlICkKLSAgICAgICAgd2lkdGggPSByZWZlcmVuY2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB3aWR0aCArPSAweDIxOwotICAgICAgaWYgKCB3aWR0aCA+IHJlZmVyZW5jZSApCi0gICAgICAgIHdpZHRoID0gcmVmZXJlbmNlOwotICAgIH0KLQotICAgIHJldHVybiB3aWR0aDsKLSAgfQotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBCTFVFIFpPTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2JsdWVzX3NldF96b25lc18wKCBQU0hfQmx1ZXMgICAgICAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBpc19vdGhlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIHJlYWRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICAgICAgIHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0JsdWVfVGFibGUgIHRvcF90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQU0hfQmx1ZV9UYWJsZSAgYm90X3RhYmxlICkKLSAgewotICAgIEZUX1VJbnQgIGNvdW50X3RvcCA9IHRvcF90YWJsZS0+Y291bnQ7Ci0gICAgRlRfVUludCAgY291bnRfYm90ID0gYm90X3RhYmxlLT5jb3VudDsKLSAgICBGVF9Cb29sICBmaXJzdCAgICAgPSAxOwotCi0gICAgRlRfVU5VU0VEKCB0YXJnZXQgKTsKLQotCi0gICAgZm9yICggOyByZWFkX2NvdW50ID4gMTsgcmVhZF9jb3VudCAtPSAyICkKLSAgICB7Ci0gICAgICBGVF9JbnQgICAgICAgICByZWZlcmVuY2UsIGRlbHRhOwotICAgICAgRlRfVUludCAgICAgICAgY291bnQ7Ci0gICAgICBQU0hfQmx1ZV9ab25lICB6b25lcywgem9uZTsKLSAgICAgIEZUX0Jvb2wgICAgICAgIHRvcDsKLQotCi0gICAgICAvKiByZWFkIGJsdWUgem9uZSBlbnRyeSwgYW5kIHNlbGVjdCB0YXJnZXQgdG9wL2JvdHRvbSB6b25lICovCi0gICAgICB0b3AgPSAwOwotICAgICAgaWYgKCBmaXJzdCB8fCBpc19vdGhlcnMgKQotICAgICAgewotICAgICAgICByZWZlcmVuY2UgPSByZWFkWzFdOwotICAgICAgICBkZWx0YSAgICAgPSByZWFkWzBdIC0gcmVmZXJlbmNlOwotCi0gICAgICAgIHpvbmVzID0gYm90X3RhYmxlLT56b25lczsKLSAgICAgICAgY291bnQgPSBjb3VudF9ib3Q7Ci0gICAgICAgIGZpcnN0ID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVmZXJlbmNlID0gcmVhZFswXTsKLSAgICAgICAgZGVsdGEgICAgID0gcmVhZFsxXSAtIHJlZmVyZW5jZTsKLQotICAgICAgICB6b25lcyA9IHRvcF90YWJsZS0+em9uZXM7Ci0gICAgICAgIGNvdW50ID0gY291bnRfdG9wOwotICAgICAgICB0b3AgICA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGluc2VydCBpbnRvIHNvcnRlZCB0YWJsZSAqLwotICAgICAgem9uZSA9IHpvbmVzOwotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggcmVmZXJlbmNlIDwgem9uZS0+b3JnX3JlZiApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCByZWZlcmVuY2UgPT0gem9uZS0+b3JnX3JlZiApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIGRlbHRhMCA9IHpvbmUtPm9yZ19kZWx0YTsKLQotCi0gICAgICAgICAgLyogd2UgaGF2ZSB0d28gem9uZXMgb24gdGhlIHNhbWUgcmVmZXJlbmNlIHBvc2l0aW9uIC0tICovCi0gICAgICAgICAgLyogb25seSBrZWVwIHRoZSBsYXJnZXN0IG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZGVsdGEgPCBkZWx0YTAgKQotICAgICAgICAgICAgICB6b25lLT5vcmdfZGVsdGEgPSBkZWx0YTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZGVsdGEgPiBkZWx0YTAgKQotICAgICAgICAgICAgICB6b25lLT5vcmdfZGVsdGEgPSBkZWx0YTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ290byBTa2lwOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgICAgem9uZVtjb3VudF0gPSB6b25lW2NvdW50LTFdOwotCi0gICAgICB6b25lLT5vcmdfcmVmICAgPSByZWZlcmVuY2U7Ci0gICAgICB6b25lLT5vcmdfZGVsdGEgPSBkZWx0YTsKLQotICAgICAgaWYgKCB0b3AgKQotICAgICAgICBjb3VudF90b3ArKzsKLSAgICAgIGVsc2UKLSAgICAgICAgY291bnRfYm90Kys7Ci0KLSAgICBTa2lwOgotICAgICAgcmVhZCArPSAyOwotICAgIH0KLQotICAgIHRvcF90YWJsZS0+Y291bnQgPSBjb3VudF90b3A7Ci0gICAgYm90X3RhYmxlLT5jb3VudCA9IGNvdW50X2JvdDsKLSAgfQotCi0KLSAgLyogUmUtcmVhZCBibHVlIHpvbmVzIGZyb20gdGhlIG9yaWdpbmFsIGZvbnRzIGFuZCBzdG9yZSB0aGVtIGludG8gb3V0ICovCi0gIC8qIHByaXZhdGUgc3RydWN0dXJlLiAgVGhpcyBmdW5jdGlvbiByZS1vcmRlcnMsIHNhbml0aXplcyBhbmQgICAgICAgICAqLwotICAvKiBmdXp6LWV4cGFuZHMgdGhlIHpvbmVzIGFzIHdlbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2JsdWVzX3NldF96b25lcyggUFNIX0JsdWVzICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnRfb3RoZXJzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIG90aGVyX2JsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGZ1enosCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZmFtaWx5ICkKLSAgewotICAgIFBTSF9CbHVlX1RhYmxlICB0b3BfdGFibGUsIGJvdF90YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgY291bnRfdG9wLCBjb3VudF9ib3Q7Ci0KLQotICAgIGlmICggZmFtaWx5ICkKLSAgICB7Ci0gICAgICB0b3BfdGFibGUgPSAmdGFyZ2V0LT5mYW1pbHlfdG9wOwotICAgICAgYm90X3RhYmxlID0gJnRhcmdldC0+ZmFtaWx5X2JvdHRvbTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRvcF90YWJsZSA9ICZ0YXJnZXQtPm5vcm1hbF90b3A7Ci0gICAgICBib3RfdGFibGUgPSAmdGFyZ2V0LT5ub3JtYWxfYm90dG9tOwotICAgIH0KLQotICAgIC8qIHJlYWQgdGhlIGlucHV0IGJsdWUgem9uZXMsIGFuZCBidWlsZCB0d28gc29ydGVkIHRhYmxlcyAgKi8KLSAgICAvKiAob25lIGZvciB0aGUgdG9wIHpvbmVzLCB0aGUgb3RoZXIgZm9yIHRoZSBib3R0b20gem9uZXMpICovCi0gICAgdG9wX3RhYmxlLT5jb3VudCA9IDA7Ci0gICAgYm90X3RhYmxlLT5jb3VudCA9IDA7Ci0KLSAgICAvKiBmaXJzdCwgdGhlIGJsdWVzICovCi0gICAgcHNoX2JsdWVzX3NldF96b25lc18wKCB0YXJnZXQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgYmx1ZXMsIHRvcF90YWJsZSwgYm90X3RhYmxlICk7Ci0gICAgcHNoX2JsdWVzX3NldF96b25lc18wKCB0YXJnZXQsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9vdGhlcnMsIG90aGVyX2JsdWVzLCB0b3BfdGFibGUsIGJvdF90YWJsZSApOwotCi0gICAgY291bnRfdG9wID0gdG9wX3RhYmxlLT5jb3VudDsKLSAgICBjb3VudF9ib3QgPSBib3RfdGFibGUtPmNvdW50OwotCi0gICAgLyogc2FuaXRpemUgdG9wIHRhYmxlICovCi0gICAgaWYgKCBjb3VudF90b3AgPiAwICkKLSAgICB7Ci0gICAgICBQU0hfQmx1ZV9ab25lICB6b25lID0gdG9wX3RhYmxlLT56b25lczsKLQotCi0gICAgICBmb3IgKCBjb3VudCA9IGNvdW50X3RvcDsgY291bnQgPiAwOyBjb3VudC0tLCB6b25lKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGRlbHRhOwotCi0KLSAgICAgICAgaWYgKCBjb3VudCA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGEgPSB6b25lWzFdLm9yZ19yZWYgLSB6b25lWzBdLm9yZ19yZWY7Ci0gICAgICAgICAgaWYgKCB6b25lLT5vcmdfZGVsdGEgPiBkZWx0YSApCi0gICAgICAgICAgICB6b25lLT5vcmdfZGVsdGEgPSBkZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIHpvbmUtPm9yZ19ib3R0b20gPSB6b25lLT5vcmdfcmVmOwotICAgICAgICB6b25lLT5vcmdfdG9wICAgID0gem9uZS0+b3JnX2RlbHRhICsgem9uZS0+b3JnX3JlZjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzYW5pdGl6ZSBib3R0b20gdGFibGUgKi8KLSAgICBpZiAoIGNvdW50X2JvdCA+IDAgKQotICAgIHsKLSAgICAgIFBTSF9CbHVlX1pvbmUgIHpvbmUgPSBib3RfdGFibGUtPnpvbmVzOwotCi0KLSAgICAgIGZvciAoIGNvdW50ID0gY291bnRfYm90OyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgZGVsdGE7Ci0KLQotICAgICAgICBpZiAoIGNvdW50ID4gMSApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWx0YSA9IHpvbmVbMF0ub3JnX3JlZiAtIHpvbmVbMV0ub3JnX3JlZjsKLSAgICAgICAgICBpZiAoIHpvbmUtPm9yZ19kZWx0YSA8IGRlbHRhICkKLSAgICAgICAgICAgIHpvbmUtPm9yZ19kZWx0YSA9IGRlbHRhOwotICAgICAgICB9Ci0KLSAgICAgICAgem9uZS0+b3JnX3RvcCAgICA9IHpvbmUtPm9yZ19yZWY7Ci0gICAgICAgIHpvbmUtPm9yZ19ib3R0b20gPSB6b25lLT5vcmdfZGVsdGEgKyB6b25lLT5vcmdfcmVmOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGV4cGFuZCB0b3AgYW5kIGJvdHRvbSB0YWJsZXMgd2l0aCBibHVlIGZ1enogKi8KLSAgICB7Ci0gICAgICBGVF9JbnQgICAgICAgICBkaW0sIHRvcCwgYm90LCBkZWx0YTsKLSAgICAgIFBTSF9CbHVlX1pvbmUgIHpvbmU7Ci0KLQotICAgICAgem9uZSAgPSB0b3BfdGFibGUtPnpvbmVzOwotICAgICAgY291bnQgPSBjb3VudF90b3A7Ci0KLSAgICAgIGZvciAoIGRpbSA9IDE7IGRpbSA+PSAwOyBkaW0tLSApCi0gICAgICB7Ci0gICAgICAgIGlmICggY291bnQgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGV4cGFuZCB0aGUgYm90dG9tIG9mIHRoZSBsb3dlc3Qgem9uZSBub3JtYWxseSAqLwotICAgICAgICAgIHpvbmUtPm9yZ19ib3R0b20gLT0gZnV6ejsKLQotICAgICAgICAgIC8qIGV4cGFuZCB0aGUgdG9wIGFuZCBib3R0b20gb2YgaW50ZXJtZWRpYXRlIHpvbmVzOyAgICAqLwotICAgICAgICAgIC8qIGNoZWNraW5nIHRoYXQgdGhlIGludGVydmFsIGlzIHNtYWxsZXIgdGhhbiB0aGUgZnV6eiAqLwotICAgICAgICAgIHRvcCA9IHpvbmUtPm9yZ190b3A7Ci0KLSAgICAgICAgICBmb3IgKCBjb3VudC0tOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJvdCAgID0gem9uZVsxXS5vcmdfYm90dG9tOwotICAgICAgICAgICAgZGVsdGEgPSBib3QgLSB0b3A7Ci0KLSAgICAgICAgICAgIGlmICggZGVsdGEgLyAyIDwgZnV6eiApCi0gICAgICAgICAgICAgIHpvbmVbMF0ub3JnX3RvcCA9IHpvbmVbMV0ub3JnX2JvdHRvbSA9IHRvcCArIGRlbHRhIC8gMjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgem9uZVswXS5vcmdfdG9wICAgID0gdG9wICsgZnV6ejsKLSAgICAgICAgICAgICAgem9uZVsxXS5vcmdfYm90dG9tID0gYm90IC0gZnV6ejsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgem9uZSsrOwotICAgICAgICAgICAgdG9wID0gem9uZS0+b3JnX3RvcDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBleHBhbmQgdGhlIHRvcCBvZiB0aGUgaGlnaGVzdCB6b25lIG5vcm1hbGx5ICovCi0gICAgICAgICAgem9uZS0+b3JnX3RvcCA9IHRvcCArIGZ1eno7Ci0gICAgICAgIH0KLSAgICAgICAgem9uZSAgPSBib3RfdGFibGUtPnpvbmVzOwotICAgICAgICBjb3VudCA9IGNvdW50X2JvdDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIHJlc2V0IHRoZSBibHVlcyB0YWJsZSB3aGVuIHRoZSBkZXZpY2UgdHJhbnNmb3JtIGNoYW5nZXMgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2JsdWVzX3NjYWxlX3pvbmVzKCBQU0hfQmx1ZXMgIGJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICBkZWx0YSApCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgY291bnQ7Ci0gICAgRlRfVUludCAgICAgICAgIG51bTsKLSAgICBQU0hfQmx1ZV9UYWJsZSAgdGFibGUgPSBOVUxMOwotCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBzdXBwcmVzcyBvdmVyc2hvb3RzIG9yICAgICovCi0gICAgLyogbm90LiAgV2Ugc2ltcGx5IG5lZWQgdG8gY29tcGFyZSB0aGUgdmVydGljYWwgc2NhbGUgICAgICovCi0gICAgLyogcGFyYW1ldGVyIHRvIHRoZSByYXcgYmx1ZXNjYWxlIHZhbHVlLiAgSGVyZSBpcyB3aHk6ICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBXZSBuZWVkIHRvIHN1cHByZXNzIG92ZXJzaG9vdHMgZm9yIGFsbCBwb2ludHNpemVzLiAgICovCi0gICAgLyogICBBdCAzMDBkcGkgdGhhdCBzYXRpc2ZpZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICBwb2ludHNpemUgPCAyNDAqYmx1ZXNjYWxlICsgMC40OSAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBUaGlzIGNvcnJlc3BvbmRzIHRvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICBwaXhlbHNpemUgPCAxMDAwKmJsdWVzY2FsZSArIDQ5LzI0ICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICBzY2FsZSpFTV9TaXplIDwgMTAwMCpibHVlc2NhbGUgKyA0OS8yNCAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBIb3dldmVyLCBmb3Igbm9ybWFsIFR5cGUgMSBmb250cywgRU1fU2l6ZSBpcyAxMDAwISAgICovCi0gICAgLyogICBXZSB0aHVzIG9ubHkgY2hlY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICBzY2FsZSA8IGJsdWVzY2FsZSArIDQ5LzI0MDAwICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICB3aGljaCB3ZSBzaG9ydGVuIHRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAic2NhbGUgPCBibHVlc2NhbGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogTm90ZSB0aGF0IGBibHVlX3NjYWxlJyBpcyBzdG9yZWQgMTAwMCB0aW1lcyBpdHMgcmVhbCAgICovCi0gICAgLyogdmFsdWUsIGFuZCB0aGF0IGBzY2FsZScgY29udmVydHMgZnJvbSBmb250IHVuaXRzIHRvICAgICovCi0gICAgLyogZnJhY3Rpb25hbCBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiAxMDAwIC8gNjQgPSAxMjUgLyA4ICovCi0gICAgaWYgKCBzY2FsZSA+PSAweDIwQzQ5QkFMICkKLSAgICAgIGJsdWVzLT5ub19vdmVyc2hvb3RzID0gRlRfQk9PTCggc2NhbGUgPCBibHVlcy0+Ymx1ZV9zY2FsZSAqIDggLyAxMjUgKTsKLSAgICBlbHNlCi0gICAgICBibHVlcy0+bm9fb3ZlcnNob290cyA9IEZUX0JPT0woIHNjYWxlICogMTI1IDwgYmx1ZXMtPmJsdWVfc2NhbGUgKiA4ICk7Ci0KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgVGhlIGJsdWUgdGhyZXNob2xkIGlzIHRoZSBmb250IHVuaXRzIGRpc3RhbmNlIHVuZGVyICAgKi8KLSAgICAvKiAgd2hpY2ggb3ZlcnNob290cyBhcmUgc3VwcHJlc3NlZCBkdWUgdG8gdGhlIEJsdWVTaGlmdCAgKi8KLSAgICAvKiAgZXZlbiBpZiB0aGUgc2NhbGUgaXMgZ3JlYXRlciB0aGFuIEJsdWVTY2FsZS4gICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgSXQgaXMgdGhlIHNtYWxsZXN0IGRpc3RhbmNlIHN1Y2ggdGhhdCAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBkaXN0IDw9IEJsdWVTaGlmdCAmJiBkaXN0KnNjYWxlIDw9IDAuNSBwaXhlbHMgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBGVF9JbnQgIHRocmVzaG9sZCA9IGJsdWVzLT5ibHVlX3NoaWZ0OwotCi0KLSAgICAgIHdoaWxlICggdGhyZXNob2xkID4gMCAmJiBGVF9NdWxGaXgoIHRocmVzaG9sZCwgc2NhbGUgKSA+IDMyICkKLSAgICAgICAgdGhyZXNob2xkLS07Ci0KLSAgICAgIGJsdWVzLT5ibHVlX3RocmVzaG9sZCA9IHRocmVzaG9sZDsKLSAgICB9Ci0KLSAgICBmb3IgKCBudW0gPSAwOyBudW0gPCA0OyBudW0rKyApCi0gICAgewotICAgICAgUFNIX0JsdWVfWm9uZSAgem9uZTsKLQotCi0gICAgICBzd2l0Y2ggKCBudW0gKQotICAgICAgewotICAgICAgY2FzZSAwOgotICAgICAgICB0YWJsZSA9ICZibHVlcy0+bm9ybWFsX3RvcDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIHRhYmxlID0gJmJsdWVzLT5ub3JtYWxfYm90dG9tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgdGFibGUgPSAmYmx1ZXMtPmZhbWlseV90b3A7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGFibGUgPSAmYmx1ZXMtPmZhbWlseV9ib3R0b207Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICB6b25lICA9IHRhYmxlLT56b25lczsKLSAgICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCi0gICAgICB7Ci0gICAgICAgIHpvbmUtPmN1cl90b3AgICAgPSBGVF9NdWxGaXgoIHpvbmUtPm9yZ190b3AsICAgIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgICAgem9uZS0+Y3VyX2JvdHRvbSA9IEZUX011bEZpeCggem9uZS0+b3JnX2JvdHRvbSwgc2NhbGUgKSArIGRlbHRhOwotICAgICAgICB6b25lLT5jdXJfcmVmICAgID0gRlRfTXVsRml4KCB6b25lLT5vcmdfcmVmLCAgICBzY2FsZSApICsgZGVsdGE7Ci0gICAgICAgIHpvbmUtPmN1cl9kZWx0YSAgPSBGVF9NdWxGaXgoIHpvbmUtPm9yZ19kZWx0YSwgIHNjYWxlICk7Ci0KLSAgICAgICAgLyogcm91bmQgc2NhbGVkIHJlZmVyZW5jZSBwb3NpdGlvbiAqLwotICAgICAgICB6b25lLT5jdXJfcmVmID0gRlRfUElYX1JPVU5EKCB6b25lLT5jdXJfcmVmICk7Ci0KLSNpZiAwCi0gICAgICAgIGlmICggem9uZS0+Y3VyX3JlZiA+IHpvbmUtPmN1cl90b3AgKQotICAgICAgICAgIHpvbmUtPmN1cl9yZWYgLT0gNjQ7Ci0gICAgICAgIGVsc2UgaWYgKCB6b25lLT5jdXJfcmVmIDwgem9uZS0+Y3VyX2JvdHRvbSApCi0gICAgICAgICAgem9uZS0+Y3VyX3JlZiArPSA2NDsKLSNlbmRpZgotICAgICAgfQotICAgIH0KLQotICAgIC8qIHByb2Nlc3MgdGhlIGZhbWlsaWVzIG5vdyAqLwotCi0gICAgZm9yICggbnVtID0gMDsgbnVtIDwgMjsgbnVtKysgKQotICAgIHsKLSAgICAgIFBTSF9CbHVlX1pvbmUgICB6b25lMSwgem9uZTI7Ci0gICAgICBGVF9VSW50ICAgICAgICAgY291bnQxLCBjb3VudDI7Ci0gICAgICBQU0hfQmx1ZV9UYWJsZSAgbm9ybWFsLCBmYW1pbHk7Ci0KLQotICAgICAgc3dpdGNoICggbnVtICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgbm9ybWFsID0gJmJsdWVzLT5ub3JtYWxfdG9wOwotICAgICAgICBmYW1pbHkgPSAmYmx1ZXMtPmZhbWlseV90b3A7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBub3JtYWwgPSAmYmx1ZXMtPm5vcm1hbF9ib3R0b207Ci0gICAgICAgIGZhbWlseSA9ICZibHVlcy0+ZmFtaWx5X2JvdHRvbTsKLSAgICAgIH0KLQotICAgICAgem9uZTEgID0gbm9ybWFsLT56b25lczsKLSAgICAgIGNvdW50MSA9IG5vcm1hbC0+Y291bnQ7Ci0KLSAgICAgIGZvciAoIDsgY291bnQxID4gMDsgY291bnQxLS0sIHpvbmUxKysgKQotICAgICAgewotICAgICAgICAvKiB0cnkgdG8gZmluZCBhIGZhbWlseSB6b25lIHdob3NlIHJlZmVyZW5jZSBwb3NpdGlvbiBpcyBsZXNzICovCi0gICAgICAgIC8qIHRoYW4gMSBwaXhlbCBmYXIgZnJvbSB0aGUgY3VycmVudCB6b25lICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgem9uZTIgID0gZmFtaWx5LT56b25lczsKLSAgICAgICAgY291bnQyID0gZmFtaWx5LT5jb3VudDsKLQotICAgICAgICBmb3IgKCA7IGNvdW50MiA+IDA7IGNvdW50Mi0tLCB6b25lMisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgRGVsdGE7Ci0KLQotICAgICAgICAgIERlbHRhID0gem9uZTEtPm9yZ19yZWYgLSB6b25lMi0+b3JnX3JlZjsKLSAgICAgICAgICBpZiAoIERlbHRhIDwgMCApCi0gICAgICAgICAgICBEZWx0YSA9IC1EZWx0YTsKLQotICAgICAgICAgIGlmICggRlRfTXVsRml4KCBEZWx0YSwgc2NhbGUgKSA8IDY0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB6b25lMS0+Y3VyX3RvcCAgICA9IHpvbmUyLT5jdXJfdG9wOwotICAgICAgICAgICAgem9uZTEtPmN1cl9ib3R0b20gPSB6b25lMi0+Y3VyX2JvdHRvbTsKLSAgICAgICAgICAgIHpvbmUxLT5jdXJfcmVmICAgID0gem9uZTItPmN1cl9yZWY7Ci0gICAgICAgICAgICB6b25lMS0+Y3VyX2RlbHRhICA9IHpvbmUyLT5jdXJfZGVsdGE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBoZWlnaHQgb2YgZ2l2ZW4gYmx1ZSB6b25lcyAqLwotICBzdGF0aWMgRlRfU2hvcnQKLSAgcHNoX2NhbGNfbWF4X2hlaWdodCggRlRfVUludCAgICAgICAgICBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1Nob3J0KiAgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCAgICAgICAgIGN1cl9tYXggKQotICB7Ci0gICAgRlRfVUludCAgY291bnQ7Ci0KLQotICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBudW07IGNvdW50ICs9IDIgKQotICAgIHsKLSAgICAgIEZUX1Nob3J0ICBjdXJfaGVpZ2h0ID0gdmFsdWVzW2NvdW50ICsgMV0gLSB2YWx1ZXNbY291bnRdOwotCi0KLSAgICAgIGlmICggY3VyX2hlaWdodCA+IGN1cl9tYXggKQotICAgICAgICBjdXJfbWF4ID0gY3VyX2hlaWdodDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3VyX21heDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNoX2JsdWVzX3NuYXBfc3RlbSggUFNIX0JsdWVzICAgICAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIHN0ZW1fdG9wLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBzdGVtX2JvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNIX0FsaWdubWVudCAgYWxpZ25tZW50ICkKLSAgewotICAgIFBTSF9CbHVlX1RhYmxlICB0YWJsZTsKLSAgICBGVF9VSW50ICAgICAgICAgY291bnQ7Ci0gICAgRlRfUG9zICAgICAgICAgIGRlbHRhOwotICAgIFBTSF9CbHVlX1pvbmUgICB6b25lOwotICAgIEZUX0ludCAgICAgICAgICBub19zaG9vdHM7Ci0KLQotICAgIGFsaWdubWVudC0+YWxpZ24gPSBQU0hfQkxVRV9BTElHTl9OT05FOwotCi0gICAgbm9fc2hvb3RzID0gYmx1ZXMtPm5vX292ZXJzaG9vdHM7Ci0KLSAgICAvKiBsb29rIHVwIHN0ZW0gdG9wIGluIHRvcCB6b25lcyB0YWJsZSAqLwotICAgIHRhYmxlID0gJmJsdWVzLT5ub3JtYWxfdG9wOwotICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwotICAgIHpvbmUgID0gdGFibGUtPnpvbmVzOwotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCi0gICAgewotICAgICAgZGVsdGEgPSBzdGVtX3RvcCAtIHpvbmUtPm9yZ19ib3R0b207Ci0gICAgICBpZiAoIGRlbHRhIDwgLWJsdWVzLT5ibHVlX2Z1enogKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBzdGVtX3RvcCA8PSB6b25lLT5vcmdfdG9wICsgYmx1ZXMtPmJsdWVfZnV6eiApCi0gICAgICB7Ci0gICAgICAgIGlmICggbm9fc2hvb3RzIHx8IGRlbHRhIDw9IGJsdWVzLT5ibHVlX3RocmVzaG9sZCApCi0gICAgICAgIHsKLSAgICAgICAgICBhbGlnbm1lbnQtPmFsaWduICAgIHw9IFBTSF9CTFVFX0FMSUdOX1RPUDsKLSAgICAgICAgICBhbGlnbm1lbnQtPmFsaWduX3RvcCA9IHpvbmUtPmN1cl9yZWY7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogbG9vayB1cCBzdGVtIGJvdHRvbSBpbiBib3R0b20gem9uZXMgdGFibGUgKi8KLSAgICB0YWJsZSA9ICZibHVlcy0+bm9ybWFsX2JvdHRvbTsKLSAgICBjb3VudCA9IHRhYmxlLT5jb3VudDsKLSAgICB6b25lICA9IHRhYmxlLT56b25lcyArIGNvdW50LTE7Ci0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZS0tICkKLSAgICB7Ci0gICAgICBkZWx0YSA9IHpvbmUtPm9yZ190b3AgLSBzdGVtX2JvdDsKLSAgICAgIGlmICggZGVsdGEgPCAtYmx1ZXMtPmJsdWVfZnV6eiApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIHN0ZW1fYm90ID49IHpvbmUtPm9yZ19ib3R0b20gLSBibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBub19zaG9vdHMgfHwgZGVsdGEgPCBibHVlcy0+Ymx1ZV90aHJlc2hvbGQgKQotICAgICAgICB7Ci0gICAgICAgICAgYWxpZ25tZW50LT5hbGlnbiAgICB8PSBQU0hfQkxVRV9BTElHTl9CT1Q7Ci0gICAgICAgICAgYWxpZ25tZW50LT5hbGlnbl9ib3QgPSB6b25lLT5jdXJfcmVmOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMIEhJTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dsb2JhbHNfZGVzdHJveSggUFNIX0dsb2JhbHMgIGdsb2JhbHMgKQotICB7Ci0gICAgaWYgKCBnbG9iYWxzICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgICBtZW1vcnkgPSBnbG9iYWxzLT5tZW1vcnk7Ci0gICAgICBnbG9iYWxzLT5kaW1lbnNpb25bMF0uc3Rkdy5jb3VudCA9IDA7Ci0gICAgICBnbG9iYWxzLT5kaW1lbnNpb25bMV0uc3Rkdy5jb3VudCA9IDA7Ci0KLSAgICAgIGdsb2JhbHMtPmJsdWVzLm5vcm1hbF90b3AuY291bnQgICAgPSAwOwotICAgICAgZ2xvYmFscy0+Ymx1ZXMubm9ybWFsX2JvdHRvbS5jb3VudCA9IDA7Ci0gICAgICBnbG9iYWxzLT5ibHVlcy5mYW1pbHlfdG9wLmNvdW50ICAgID0gMDsKLSAgICAgIGdsb2JhbHMtPmJsdWVzLmZhbWlseV9ib3R0b20uY291bnQgPSAwOwotCi0gICAgICBGVF9GUkVFKCBnbG9iYWxzICk7Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgICAgIHBzX2RlYnVnX2dsb2JhbHMgPSBOVUxMOwotI2VuZGlmCi0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNoX2dsb2JhbHNfbmV3KCBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICBUMV9Qcml2YXRlKiAgIHByaXYsCi0gICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICphZ2xvYmFscyApCi0gIHsKLSAgICBQU0hfR2xvYmFscyAgZ2xvYmFscyA9IE5VTEw7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFGVF9ORVcoIGdsb2JhbHMgKSApCi0gICAgewotICAgICAgRlRfVUludCAgICBjb3VudDsKLSAgICAgIEZUX1Nob3J0KiAgcmVhZDsKLQotCi0gICAgICBnbG9iYWxzLT5tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgICAgIC8qIGNvcHkgc3RhbmRhcmQgd2lkdGhzICovCi0gICAgICB7Ci0gICAgICAgIFBTSF9EaW1lbnNpb24gIGRpbSAgID0gJmdsb2JhbHMtPmRpbWVuc2lvblsxXTsKLSAgICAgICAgUFNIX1dpZHRoICAgICAgd3JpdGUgPSBkaW0tPnN0ZHcud2lkdGhzOwotCi0KLSAgICAgICAgd3JpdGUtPm9yZyA9IHByaXYtPnN0YW5kYXJkX3dpZHRoWzBdOwotICAgICAgICB3cml0ZSsrOwotCi0gICAgICAgIHJlYWQgPSBwcml2LT5zbmFwX3dpZHRoczsKLSAgICAgICAgZm9yICggY291bnQgPSBwcml2LT5udW1fc25hcF93aWR0aHM7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZS0+b3JnID0gKnJlYWQ7Ci0gICAgICAgICAgd3JpdGUrKzsKLSAgICAgICAgICByZWFkKys7Ci0gICAgICAgIH0KLQotICAgICAgICBkaW0tPnN0ZHcuY291bnQgPSBwcml2LT5udW1fc25hcF93aWR0aHMgKyAxOwotICAgICAgfQotCi0gICAgICAvKiBjb3B5IHN0YW5kYXJkIGhlaWdodHMgKi8KLSAgICAgIHsKLSAgICAgICAgUFNIX0RpbWVuc2lvbiAgZGltID0gJmdsb2JhbHMtPmRpbWVuc2lvblswXTsKLSAgICAgICAgUFNIX1dpZHRoICAgICAgd3JpdGUgPSBkaW0tPnN0ZHcud2lkdGhzOwotCi0KLSAgICAgICAgd3JpdGUtPm9yZyA9IHByaXYtPnN0YW5kYXJkX2hlaWdodFswXTsKLSAgICAgICAgd3JpdGUrKzsKLSAgICAgICAgcmVhZCA9IHByaXYtPnNuYXBfaGVpZ2h0czsKLSAgICAgICAgZm9yICggY291bnQgPSBwcml2LT5udW1fc25hcF9oZWlnaHRzOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGUtPm9yZyA9ICpyZWFkOwotICAgICAgICAgIHdyaXRlKys7Ci0gICAgICAgICAgcmVhZCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGltLT5zdGR3LmNvdW50ID0gcHJpdi0+bnVtX3NuYXBfaGVpZ2h0cyArIDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvcHkgYmx1ZSB6b25lcyAqLwotICAgICAgcHNoX2JsdWVzX3NldF96b25lcyggJmdsb2JhbHMtPmJsdWVzLCBwcml2LT5udW1fYmx1ZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5ibHVlX3ZhbHVlcywgcHJpdi0+bnVtX290aGVyX2JsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+b3RoZXJfYmx1ZXMsIHByaXYtPmJsdWVfZnV6eiwgMCApOwotCi0gICAgICBwc2hfYmx1ZXNfc2V0X3pvbmVzKCAmZ2xvYmFscy0+Ymx1ZXMsIHByaXYtPm51bV9mYW1pbHlfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5mYW1pbHlfYmx1ZXMsIHByaXYtPm51bV9mYW1pbHlfb3RoZXJfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5mYW1pbHlfb3RoZXJfYmx1ZXMsIHByaXYtPmJsdWVfZnV6eiwgMSApOwotCi0gICAgICAvKiBsaW1pdCB0aGUgQmx1ZVNjYWxlIHZhbHVlIHRvIGAxIC8gbWF4X29mX2JsdWVfem9uZV9oZWlnaHRzJyAqLwotICAgICAgewotICAgICAgICBGVF9GaXhlZCAgbWF4X3NjYWxlOwotICAgICAgICBGVF9TaG9ydCAgbWF4X2hlaWdodCA9IDE7Ci0KLQotICAgICAgICBtYXhfaGVpZ2h0ID0gcHNoX2NhbGNfbWF4X2hlaWdodCggcHJpdi0+bnVtX2JsdWVfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+Ymx1ZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaGVpZ2h0ICk7Ci0gICAgICAgIG1heF9oZWlnaHQgPSBwc2hfY2FsY19tYXhfaGVpZ2h0KCBwcml2LT5udW1fb3RoZXJfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5vdGhlcl9ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9oZWlnaHQgKTsKLSAgICAgICAgbWF4X2hlaWdodCA9IHBzaF9jYWxjX21heF9oZWlnaHQoIHByaXYtPm51bV9mYW1pbHlfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5mYW1pbHlfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaGVpZ2h0ICk7Ci0gICAgICAgIG1heF9oZWlnaHQgPSBwc2hfY2FsY19tYXhfaGVpZ2h0KCBwcml2LT5udW1fZmFtaWx5X290aGVyX2JsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+ZmFtaWx5X290aGVyX2JsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2hlaWdodCApOwotCi0gICAgICAgIC8qIEJsdWVTY2FsZSBpcyBzY2FsZWQgMTAwMCB0aW1lcyAqLwotICAgICAgICBtYXhfc2NhbGUgPSBGVF9EaXZGaXgoIDEwMDAsIG1heF9oZWlnaHQgKTsKLSAgICAgICAgZ2xvYmFscy0+Ymx1ZXMuYmx1ZV9zY2FsZSA9IHByaXYtPmJsdWVfc2NhbGUgPCBtYXhfc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwcml2LT5ibHVlX3NjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWF4X3NjYWxlOwotICAgICAgfQotCi0gICAgICBnbG9iYWxzLT5ibHVlcy5ibHVlX3NoaWZ0ID0gcHJpdi0+Ymx1ZV9zaGlmdDsKLSAgICAgIGdsb2JhbHMtPmJsdWVzLmJsdWVfZnV6eiAgPSBwcml2LT5ibHVlX2Z1eno7Ci0KLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblswXS5zY2FsZV9tdWx0ICA9IDA7Ci0gICAgICBnbG9iYWxzLT5kaW1lbnNpb25bMF0uc2NhbGVfZGVsdGEgPSAwOwotICAgICAgZ2xvYmFscy0+ZGltZW5zaW9uWzFdLnNjYWxlX211bHQgID0gMDsKLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblsxXS5zY2FsZV9kZWx0YSA9IDA7Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgICAgIHBzX2RlYnVnX2dsb2JhbHMgPSBnbG9iYWxzOwotI2VuZGlmCi0gICAgfQotCi0gICAgKmFnbG9iYWxzID0gZ2xvYmFsczsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzaF9nbG9iYWxzX3NldF9zY2FsZSggUFNIX0dsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHhfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHlfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHhfZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHlfZGVsdGEgKQotICB7Ci0gICAgUFNIX0RpbWVuc2lvbiAgZGltOwotCi0KLSAgICBkaW0gPSAmZ2xvYmFscy0+ZGltZW5zaW9uWzBdOwotICAgIGlmICggeF9zY2FsZSAhPSBkaW0tPnNjYWxlX211bHQgIHx8Ci0gICAgICAgICB4X2RlbHRhICE9IGRpbS0+c2NhbGVfZGVsdGEgKQotICAgIHsKLSAgICAgIGRpbS0+c2NhbGVfbXVsdCAgPSB4X3NjYWxlOwotICAgICAgZGltLT5zY2FsZV9kZWx0YSA9IHhfZGVsdGE7Ci0KLSAgICAgIHBzaF9nbG9iYWxzX3NjYWxlX3dpZHRocyggZ2xvYmFscywgMCApOwotICAgIH0KLQotICAgIGRpbSA9ICZnbG9iYWxzLT5kaW1lbnNpb25bMV07Ci0gICAgaWYgKCB5X3NjYWxlICE9IGRpbS0+c2NhbGVfbXVsdCAgfHwKLSAgICAgICAgIHlfZGVsdGEgIT0gZGltLT5zY2FsZV9kZWx0YSApCi0gICAgewotICAgICAgZGltLT5zY2FsZV9tdWx0ICA9IHlfc2NhbGU7Ci0gICAgICBkaW0tPnNjYWxlX2RlbHRhID0geV9kZWx0YTsKLQotICAgICAgcHNoX2dsb2JhbHNfc2NhbGVfd2lkdGhzKCBnbG9iYWxzLCAxICk7Ci0gICAgICBwc2hfYmx1ZXNfc2NhbGVfem9uZXMoICZnbG9iYWxzLT5ibHVlcywgeV9zY2FsZSwgeV9kZWx0YSApOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNoX2dsb2JhbHNfZnVuY3NfaW5pdCggUFNIX0dsb2JhbHNfRnVuY3NSZWMqICBmdW5jcyApCi0gIHsKLSAgICBmdW5jcy0+Y3JlYXRlICAgID0gcHNoX2dsb2JhbHNfbmV3OwotICAgIGZ1bmNzLT5zZXRfc2NhbGUgPSBwc2hfZ2xvYmFsc19zZXRfc2NhbGU7Ci0gICAgZnVuY3MtPmRlc3Ryb3kgICA9IHBzaF9nbG9iYWxzX2Rlc3Ryb3k7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hnbG9iLmggYi9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODAxY2JhLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9wc2hnbG9iLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoZ2xvYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgaGludGVyIGdsb2JhbCBoaW50aW5nIG1hbmFnZW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBTSEdMT0JfSF8KLSNkZWZpbmUgUFNIR0xPQl9IXwotCi0KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBHTE9CQUwgSElOVFMgSU5URVJOQUxTICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEBjb25zdGFudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19HTE9CQUxTX01BWF9CTFVFX1pPTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEBkZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmx1ZSB6b25lcyBpbiBhIGZvbnQgZ2xvYmFsIGhpbnRzIHN0cnVjdHVyZS4gKi8KLSAgLyogICAgU2VlIEBQU19HbG9iYWxzX0JsdWVzUmVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQU19HTE9CQUxTX01BWF9CTFVFX1pPTkVTICAxNgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBAY29uc3RhbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfR0xPQkFMU19NQVhfU1REX1dJRFRIUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBAZGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YW5kYXJkIGFuZCBzbmFwIHdpZHRocyBpbiBlaXRoZXIgdGhlICAgICAgICovCi0gIC8qICAgIGhvcml6b250YWwgb3IgdmVydGljYWwgZGlyZWN0aW9uLiAgU2VlIEBQU19HbG9iYWxzX1dpZHRoc1JlYy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUFNfR0xPQkFMU19NQVhfU1REX1dJRFRIUyAgMTYKLQotCi0gIC8qIHN0YW5kYXJkIGFuZCBzbmFwIHdpZHRoICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfV2lkdGhSZWNfCi0gIHsKLSAgICBGVF9JbnQgIG9yZzsKLSAgICBGVF9Qb3MgIGN1cjsKLSAgICBGVF9Qb3MgIGZpdDsKLQotICB9IFBTSF9XaWR0aFJlYywgKlBTSF9XaWR0aDsKLQotCi0gIC8qIHN0YW5kYXJkIGFuZCBzbmFwIHdpZHRocyB0YWJsZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNIX1dpZHRoc1JlY18KLSAgewotICAgIEZUX1VJbnQgICAgICAgY291bnQ7Ci0gICAgUFNIX1dpZHRoUmVjICB3aWR0aHNbUFNfR0xPQkFMU19NQVhfU1REX1dJRFRIU107Ci0KLSAgfSBQU0hfV2lkdGhzUmVjLCAqUFNIX1dpZHRoczsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfRGltZW5zaW9uUmVjXwotICB7Ci0gICAgUFNIX1dpZHRoc1JlYyAgc3RkdzsKLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZV9tdWx0OwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlX2RlbHRhOwotCi0gIH0gUFNIX0RpbWVuc2lvblJlYywgKlBTSF9EaW1lbnNpb247Ci0KLQotICAvKiBibHVlIHpvbmUgZGVzY3JpcHRvciAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0JsdWVfWm9uZVJlY18KLSAgewotICAgIEZUX0ludCAgb3JnX3JlZjsKLSAgICBGVF9JbnQgIG9yZ19kZWx0YTsKLSAgICBGVF9JbnQgIG9yZ190b3A7Ci0gICAgRlRfSW50ICBvcmdfYm90dG9tOwotCi0gICAgRlRfUG9zICBjdXJfcmVmOwotICAgIEZUX1BvcyAgY3VyX2RlbHRhOwotICAgIEZUX1BvcyAgY3VyX2JvdHRvbTsKLSAgICBGVF9Qb3MgIGN1cl90b3A7Ci0KLSAgfSBQU0hfQmx1ZV9ab25lUmVjLCAqUFNIX0JsdWVfWm9uZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfQmx1ZV9UYWJsZVJlY18KLSAgewotICAgIEZUX1VJbnQgICAgICAgICAgIGNvdW50OwotICAgIFBTSF9CbHVlX1pvbmVSZWMgIHpvbmVzW1BTX0dMT0JBTFNfTUFYX0JMVUVfWk9ORVNdOwotCi0gIH0gUFNIX0JsdWVfVGFibGVSZWMsICpQU0hfQmx1ZV9UYWJsZTsKLQotCi0gIC8qIGJsdWUgem9uZXMgdGFibGUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9CbHVlc1JlY18KLSAgewotICAgIFBTSF9CbHVlX1RhYmxlUmVjICBub3JtYWxfdG9wOwotICAgIFBTSF9CbHVlX1RhYmxlUmVjICBub3JtYWxfYm90dG9tOwotICAgIFBTSF9CbHVlX1RhYmxlUmVjICBmYW1pbHlfdG9wOwotICAgIFBTSF9CbHVlX1RhYmxlUmVjICBmYW1pbHlfYm90dG9tOwotCi0gICAgRlRfRml4ZWQgICAgICAgICAgIGJsdWVfc2NhbGU7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIGJsdWVfc2hpZnQ7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIGJsdWVfdGhyZXNob2xkOwotICAgIEZUX0ludCAgICAgICAgICAgICBibHVlX2Z1eno7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgIG5vX292ZXJzaG9vdHM7Ci0KLSAgfSBQU0hfQmx1ZXNSZWMsICpQU0hfQmx1ZXM7Ci0KLQotICAvKiBmb250IGdsb2JhbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBkaW1lbnNpb24gMCA9PiBYIGNvb3JkaW5hdGVzICsgdmVydGljYWwgaGludHMvc3RlbXMgICAqLwotICAvKiBkaW1lbnNpb24gMSA9PiBZIGNvb3JkaW5hdGVzICsgaG9yaXpvbnRhbCBoaW50cy9zdGVtcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0dsb2JhbHNSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnk7Ci0gICAgUFNIX0RpbWVuc2lvblJlYyAgZGltZW5zaW9uWzJdOwotICAgIFBTSF9CbHVlc1JlYyAgICAgIGJsdWVzOwotCi0gIH0gUFNIX0dsb2JhbHNSZWM7Ci0KLQotI2RlZmluZSBQU0hfQkxVRV9BTElHTl9OT05FICAwCi0jZGVmaW5lIFBTSF9CTFVFX0FMSUdOX1RPUCAgIDEKLSNkZWZpbmUgUFNIX0JMVUVfQUxJR05fQk9UICAgMgotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9BbGlnbm1lbnRSZWNfCi0gIHsKLSAgICBpbnQgICAgIGFsaWduOwotICAgIEZUX1BvcyAgYWxpZ25fdG9wOwotICAgIEZUX1BvcyAgYWxpZ25fYm90OwotCi0gIH0gUFNIX0FsaWdubWVudFJlYywgKlBTSF9BbGlnbm1lbnQ7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzaF9nbG9iYWxzX2Z1bmNzX2luaXQoIFBTSF9HbG9iYWxzX0Z1bmNzUmVjKiAgZnVuY3MgKTsKLQotCi0jaWYgMAotICAvKiBzbmFwIGEgc3RlbSB3aWR0aCB0byBmaXR0ZXIgY29vcmRpbmF0ZXMuICBgb3JnX3dpZHRoJyBpcyBpbiBmb250ICovCi0gIC8qIHVuaXRzLiAgVGhlIHJlc3VsdCBpcyBpbiBkZXZpY2UgcGl4ZWxzICgyNi42IGZvcm1hdCkuICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX1BvcyApCi0gIHBzaF9kaW1lbnNpb25fc25hcF93aWR0aCggUFNIX0RpbWVuc2lvbiAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG9yZ193aWR0aCApOwotI2VuZGlmCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc2hfZ2xvYmFsc19zZXRfc2NhbGUoIFBTSF9HbG9iYWxzICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X2RlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X2RlbHRhICk7Ci0KLSAgLyogc25hcCBhIHN0ZW0gdG8gb25lIG9yIHR3byBibHVlIHpvbmVzICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNoX2JsdWVzX3NuYXBfc3RlbSggUFNIX0JsdWVzICAgICAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIHN0ZW1fdG9wLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBzdGVtX2JvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNIX0FsaWdubWVudCAgYWxpZ25tZW50ICk7Ci0gIC8qICovCi0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgZXh0ZXJuIFBTSF9HbG9iYWxzICBwc19kZWJ1Z19nbG9iYWxzOwotI2VuZGlmCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBQU0hHTE9CX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNoaW50ZXIuYyBiL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2UwN2UxLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoaW50ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBvc3RTY3JpcHQgSGludGluZyBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAicHNoYWxnby5jIgotI2luY2x1ZGUgInBzaGdsb2IuYyIKLSNpbmNsdWRlICJwc2htb2QuYyIKLSNpbmNsdWRlICJwc2hwaWMuYyIKLSNpbmNsdWRlICJwc2hyZWMuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2htb2QuYyBiL3NyYy9wc2hpbnRlci9wc2htb2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwZGMwYS4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNobW9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNobW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBvc3RTY3JpcHQgaGludGVyIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgInBzaHJlYy5oIgotI2luY2x1ZGUgInBzaGFsZ28uaCIKLSNpbmNsdWRlICJwc2hwaWMuaCIKLQotCi0gIC8qIHRoZSBQb3N0c2NyaXB0IEhpbnRlciBtb2R1bGUgc3RydWN0dXJlICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19IaW50ZXJfTW9kdWxlX1JlY18KLSAgewotICAgIEZUX01vZHVsZVJlYyAgICAgICAgICByb290OwotICAgIFBTX0hpbnRzUmVjICAgICAgICAgICBwc19oaW50czsKLQotICAgIFBTSF9HbG9iYWxzX0Z1bmNzUmVjICBnbG9iYWxzX2Z1bmNzOwotICAgIFQxX0hpbnRzX0Z1bmNzUmVjICAgICB0MV9mdW5jczsKLSAgICBUMl9IaW50c19GdW5jc1JlYyAgICAgdDJfZnVuY3M7Ci0KLSAgfSBQU19IaW50ZXJfTW9kdWxlUmVjLCAqUFNfSGludGVyX01vZHVsZTsKLQotCi0gIC8qIGZpbmFsaXplIG1vZHVsZSAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBwc19oaW50ZXJfZG9uZSggUFNfSGludGVyX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIG1vZHVsZS0+dDFfZnVuY3MuaGludHMgPSBOVUxMOwotICAgIG1vZHVsZS0+dDJfZnVuY3MuaGludHMgPSBOVUxMOwotCi0gICAgcHNfaGludHNfZG9uZSggJm1vZHVsZS0+cHNfaGludHMgKTsKLSAgfQotCi0KLSAgLyogaW5pdGlhbGl6ZSBtb2R1bGUsIGNyZWF0ZSBoaW50cyByZWNvcmRlciBhbmQgdGhlIGludGVyZmFjZSAqLwotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgcHNfaGludGVyX2luaXQoIFBTX0hpbnRlcl9Nb2R1bGUgIG1vZHVsZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IG1vZHVsZS0+cm9vdC5tZW1vcnk7Ci0gICAgdm9pZCogICAgICBwaCAgICAgPSAmbW9kdWxlLT5wc19oaW50czsKLQotCi0gICAgcHNfaGludHNfaW5pdCggJm1vZHVsZS0+cHNfaGludHMsIG1lbW9yeSApOwotCi0gICAgcHNoX2dsb2JhbHNfZnVuY3NfaW5pdCggJm1vZHVsZS0+Z2xvYmFsc19mdW5jcyApOwotCi0gICAgdDFfaGludHNfZnVuY3NfaW5pdCggJm1vZHVsZS0+dDFfZnVuY3MgKTsKLSAgICBtb2R1bGUtPnQxX2Z1bmNzLmhpbnRzID0gKFQxX0hpbnRzKXBoOwotCi0gICAgdDJfaGludHNfZnVuY3NfaW5pdCggJm1vZHVsZS0+dDJfZnVuY3MgKTsKLSAgICBtb2R1bGUtPnQyX2Z1bmNzLmhpbnRzID0gKFQyX0hpbnRzKXBoOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qIHJldHVybnMgZ2xvYmFsIGhpbnRzIGludGVyZmFjZSAqLwotICBGVF9DQUxMQkFDS19ERUYoIFBTSF9HbG9iYWxzX0Z1bmNzICkKLSAgcHNoaW50ZXJfZ2V0X2dsb2JhbHNfZnVuY3MoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIHJldHVybiAmKChQU19IaW50ZXJfTW9kdWxlKW1vZHVsZSktPmdsb2JhbHNfZnVuY3M7Ci0gIH0KLQotCi0gIC8qIHJldHVybiBUeXBlIDEgaGludHMgaW50ZXJmYWNlICovCi0gIEZUX0NBTExCQUNLX0RFRiggVDFfSGludHNfRnVuY3MgKQotICBwc2hpbnRlcl9nZXRfdDFfZnVuY3MoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIHJldHVybiAmKChQU19IaW50ZXJfTW9kdWxlKW1vZHVsZSktPnQxX2Z1bmNzOwotICB9Ci0KLQotICAvKiByZXR1cm4gVHlwZSAyIGhpbnRzIGludGVyZmFjZSAqLwotICBGVF9DQUxMQkFDS19ERUYoIFQyX0hpbnRzX0Z1bmNzICkKLSAgcHNoaW50ZXJfZ2V0X3QyX2Z1bmNzKCBGVF9Nb2R1bGUgIG1vZHVsZSApCi0gIHsKLSAgICByZXR1cm4gJigoUFNfSGludGVyX01vZHVsZSltb2R1bGUpLT50Ml9mdW5jczsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1BTSElOVEVSX0lOVEVSRkFDRSgKLSAgICBwc2hpbnRlcl9pbnRlcmZhY2UsCi0KLSAgICBwc2hpbnRlcl9nZXRfZ2xvYmFsc19mdW5jcywKLSAgICBwc2hpbnRlcl9nZXRfdDFfZnVuY3MsCi0gICAgcHNoaW50ZXJfZ2V0X3QyX2Z1bmNzCi0gICkKLQotCi0gIEZUX0RFRklORV9NT0RVTEUoCi0gICAgcHNoaW50ZXJfbW9kdWxlX2NsYXNzLAotCi0gICAgMCwKLSAgICBzaXplb2YgKCBQU19IaW50ZXJfTW9kdWxlUmVjICksCi0gICAgInBzaGludGVyIiwKLSAgICAweDEwMDAwTCwKLSAgICAweDIwMDAwTCwKLQotICAgICZQU0hJTlRFUl9JTlRFUkZBQ0VfR0VULCAgICAgICAgICAgICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgKEZUX01vZHVsZV9Db25zdHJ1Y3Rvcilwc19oaW50ZXJfaW5pdCwgIC8qIG1vZHVsZV9pbml0ICAgKi8KLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIHBzX2hpbnRlcl9kb25lLCAgLyogbW9kdWxlX2RvbmUgICAqLwotICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgTlVMTCAgICAgICAgICAgICAvKiBnZXRfaW50ZXJmYWNlICovCi0gICkKLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNobW9kLmggYi9zcmMvcHNoaW50ZXIvcHNobW9kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMmI0MGYuLjAwMDAwMDAKLS0tIGEvc3JjL3BzaGludGVyL3BzaG1vZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNobW9kLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgaGludGVyIG1vZHVsZSBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBTSE1PRF9IXwotI2RlZmluZSBQU0hNT0RfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9ERUNMQVJFX01PRFVMRSggcHNoaW50ZXJfbW9kdWxlX2NsYXNzICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIFBTSE1PRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaG50ZXJyLmggYi9zcmMvcHNoaW50ZXIvcHNobnRlcnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkMTQ0ZS4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNobnRlcnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaG50ZXJyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQUyBIaW50ZXIgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgUFNIaW50ZXIgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgUFNITlRFUlJfSF8KLSNkZWZpbmUgUFNITlRFUlJfSF8KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBGVEVSUk9SU19IXwotCi0jdW5kZWYgIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgUFNIX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9QU2hpbnRlcgotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogUFNITlRFUlJfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hwaWMuYyBiL3NyYy9wc2hpbnRlci9wc2hwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkM2E2NC4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNocGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hwaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHBzaGludGVyIG1vZHVsZS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAicHNocGljLmgiCi0jaW5jbHVkZSAicHNobnRlcnIuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIHBzaG1vZC5jICovCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19wc2hpbnRlcl9pbnRlcmZhY2UoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hpbnRlcl9JbnRlcmZhY2UqICBjbGF6eiApOwotCi0gIHZvaWQKLSAgcHNoaW50ZXJfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+cHNoaW50ZXIgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIHBpY19jb250YWluZXItPnBzaGludGVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5wc2hpbnRlciA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9FcnJvcgotICBwc2hpbnRlcl9tb2R1bGVfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBQU0hpbnRlclBJQyogICAgICAgY29udGFpbmVyICAgICA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIC8qIGFsbG9jYXRlIHBvaW50ZXIsIGNsZWFyIGFuZCBzZXQgZ2xvYmFsIGNvbnRhaW5lciBwb2ludGVyICovCi0gICAgaWYgKCBGVF9BTExPQyggY29udGFpbmVyLCBzaXplb2YgKCAqY29udGFpbmVyICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgRlRfTUVNX1NFVCggY29udGFpbmVyLCAwLCBzaXplb2YgKCAqY29udGFpbmVyICkgKTsKLSAgICBwaWNfY29udGFpbmVyLT5wc2hpbnRlciA9IGNvbnRhaW5lcjsKLQotICAgIC8qIGFkZCBjYWxsIHRvIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHdoZW4geW91IGFkZCBuZXcgc2NyaXB0cyAqLwotICAgIEZUX0luaXRfQ2xhc3NfcHNoaW50ZXJfaW50ZXJmYWNlKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+cHNoaW50ZXJfaW50ZXJmYWNlICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHBzaGludGVyX21vZHVsZV9jbGFzc19waWNfZnJlZSggbGlicmFyeSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaHBpYy5oIGIvc3JjL3BzaGludGVyL3BzaHBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlhMDFjLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9wc2hwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaHBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgcHNoaW50ZXIgbW9kdWxlLiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBQU0hQSUNfSF8KLSNkZWZpbmUgUFNIUElDX0hfCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgUFNISU5URVJfSU5URVJGQUNFX0dFVCAgcHNoaW50ZXJfaW50ZXJmYWNlCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIaW50ZXJQSUNfCi0gIHsKLSAgICBQU0hpbnRlcl9JbnRlcmZhY2UgIHBzaGludGVyX2ludGVyZmFjZTsKLQotICB9IFBTSGludGVyUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICggKFBTSGludGVyUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLnBzaGludGVyICkgKQotCi0jZGVmaW5lIFBTSElOVEVSX0lOVEVSRkFDRV9HRVQgICggR0VUX1BJQyggbGlicmFyeSApLT5wc2hpbnRlcl9pbnRlcmZhY2UgKQotCi0gIC8qIHNlZSBwc2hwaWMuYyBmb3IgdGhlIGltcGxlbWVudGF0aW9uICovCi0gIHZvaWQKLSAgcHNoaW50ZXJfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgcHNoaW50ZXJfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi0jZW5kaWYgLyogUFNIUElDX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNocmVjLmMgYi9zcmMvcHNoaW50ZXIvcHNocmVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjZkMzQuLjAwMDAwMDAKLS0tIGEvc3JjL3BzaGludGVyL3BzaHJlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hyZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUG9zdFNjcmlwdCBoaW50cyByZWNvcmRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLQotI2luY2x1ZGUgInBzaHJlYy5oIgotI2luY2x1ZGUgInBzaGFsZ28uaCIKLQotI2luY2x1ZGUgInBzaG50ZXJyLmgiCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcHNocmVjCi0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgUFNfSGludHMgIHBzX2RlYnVnX2hpbnRzICAgICAgICAgPSBOVUxMOwotICBpbnQgICAgICAgcHNfZGVidWdfbm9faG9yel9oaW50cyA9IDA7Ci0gIGludCAgICAgICBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzID0gMDsKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIFBTX0hJTlQgTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogZGVzdHJveSBoaW50cyB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc19oaW50X3RhYmxlX2RvbmUoIFBTX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9GUkVFKCB0YWJsZS0+aGludHMgKTsKLSAgICB0YWJsZS0+bnVtX2hpbnRzID0gMDsKLSAgICB0YWJsZS0+bWF4X2hpbnRzID0gMDsKLSAgfQotCi0KLSAgLyogZW5zdXJlIHRoYXQgYSB0YWJsZSBjYW4gY29udGFpbiAiY291bnQiIGVsZW1lbnRzICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19oaW50X3RhYmxlX2Vuc3VyZSggUFNfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9VSW50ICAgb2xkX21heCA9IHRhYmxlLT5tYXhfaGludHM7Ci0gICAgRlRfVUludCAgIG5ld19tYXggPSBjb3VudDsKLSAgICBGVF9FcnJvciAgZXJyb3IgICA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBuZXdfbWF4ID4gb2xkX21heCApCi0gICAgewotICAgICAgLyogdHJ5IHRvIGdyb3cgdGhlIHRhYmxlICovCi0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDggKTsKLSAgICAgIGlmICggIUZUX1JFTkVXX0FSUkFZKCB0YWJsZS0+aGludHMsIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIHRhYmxlLT5tYXhfaGludHMgPSBuZXdfbWF4OwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19oaW50X3RhYmxlX2FsbG9jKCBQU19IaW50X1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICBQU19IaW50ICAgICAgICphaGludCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgIGNvdW50OwotICAgIFBTX0hpbnQgICBoaW50ID0gTlVMTDsKLQotCi0gICAgY291bnQgPSB0YWJsZS0+bnVtX2hpbnRzOwotICAgIGNvdW50Kys7Ci0KLSAgICBpZiAoIGNvdW50ID49IHRhYmxlLT5tYXhfaGludHMgKQotICAgIHsKLSAgICAgIGVycm9yID0gcHNfaGludF90YWJsZV9lbnN1cmUoIHRhYmxlLCBjb3VudCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGhpbnQgICAgICAgID0gdGFibGUtPmhpbnRzICsgY291bnQgLSAxOwotICAgIGhpbnQtPnBvcyAgID0gMDsKLSAgICBoaW50LT5sZW4gICA9IDA7Ci0gICAgaGludC0+ZmxhZ3MgPSAwOwotCi0gICAgdGFibGUtPm51bV9oaW50cyA9IGNvdW50OwotCi0gIEV4aXQ6Ci0gICAgKmFoaW50ID0gaGludDsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBQU19NQVNLIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGRlc3Ryb3kgbWFzayAqLwotICBzdGF0aWMgdm9pZAotICBwc19tYXNrX2RvbmUoIFBTX01hc2sgICAgbWFzaywKLSAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9GUkVFKCBtYXNrLT5ieXRlcyApOwotICAgIG1hc2stPm51bV9iaXRzICA9IDA7Ci0gICAgbWFzay0+bWF4X2JpdHMgID0gMDsKLSAgICBtYXNrLT5lbmRfcG9pbnQgPSAwOwotICB9Ci0KLQotICAvKiBlbnN1cmUgdGhhdCBhIG1hc2sgY2FuIGNvbnRhaW4gImNvdW50IiBiaXRzICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19tYXNrX2Vuc3VyZSggUFNfTWFzayAgICBtYXNrLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX1VJbnQgICBvbGRfbWF4ID0gKCBtYXNrLT5tYXhfYml0cyArIDcgKSA+PiAzOwotICAgIEZUX1VJbnQgICBuZXdfbWF4ID0gKCBjb3VudCAgICAgICAgICArIDcgKSA+PiAzOwotICAgIEZUX0Vycm9yICBlcnJvciAgID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDggKTsKLSAgICAgIGlmICggIUZUX1JFTkVXX0FSUkFZKCBtYXNrLT5ieXRlcywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgbWFzay0+bWF4X2JpdHMgPSBuZXdfbWF4ICogODsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiB0ZXN0IGEgYml0IHZhbHVlIGluIGEgZ2l2ZW4gbWFzayAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHBzX21hc2tfdGVzdF9iaXQoIFBTX01hc2sgIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludCAgIGlkeCApCi0gIHsKLSAgICBpZiAoIChGVF9VSW50KWlkeCA+PSBtYXNrLT5udW1fYml0cyApCi0gICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBtYXNrLT5ieXRlc1tpZHggPj4gM10gJiAoIDB4ODAgPj4gKCBpZHggJiA3ICkgKTsKLSAgfQotCi0KLSAgLyogY2xlYXIgYSBnaXZlbiBiaXQgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfbWFza19jbGVhcl9iaXQoIFBTX01hc2sgIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBpZHggKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0KLQotICAgIGlmICggaWR4ID49IG1hc2stPm51bV9iaXRzICkKLSAgICAgIHJldHVybjsKLQotICAgIHAgICAgPSBtYXNrLT5ieXRlcyArICggaWR4ID4+IDMgKTsKLSAgICBwWzBdID0gKEZUX0J5dGUpKCBwWzBdICYgfiggMHg4MCA+PiAoIGlkeCAmIDcgKSApICk7Ci0gIH0KLQotCi0gIC8qIHNldCBhIGdpdmVuIGJpdCwgcG9zc2libHkgZ3JvdyB0aGUgbWFzayAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza19zZXRfYml0KCBQU19NYXNrICAgIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUqICBwOwotCi0KLSAgICBpZiAoIGlkeCA+PSBtYXNrLT5udW1fYml0cyApCi0gICAgewotICAgICAgZXJyb3IgPSBwc19tYXNrX2Vuc3VyZSggbWFzaywgaWR4ICsgMSwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBtYXNrLT5udW1fYml0cyA9IGlkeCArIDE7Ci0gICAgfQotCi0gICAgcCAgICA9IG1hc2stPmJ5dGVzICsgKCBpZHggPj4gMyApOwotICAgIHBbMF0gPSAoRlRfQnl0ZSkoIHBbMF0gfCAoIDB4ODAgPj4gKCBpZHggJiA3ICkgKSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkZXN0cm95IG1hc2sgdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfbWFza190YWJsZV9kb25lKCBQU19NYXNrX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfVUludCAgY291bnQgPSB0YWJsZS0+bWF4X21hc2tzOwotICAgIFBTX01hc2sgIG1hc2sgID0gdGFibGUtPm1hc2tzOwotCi0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgbWFzaysrICkKLSAgICAgIHBzX21hc2tfZG9uZSggbWFzaywgbWVtb3J5ICk7Ci0KLSAgICBGVF9GUkVFKCB0YWJsZS0+bWFza3MgKTsKLSAgICB0YWJsZS0+bnVtX21hc2tzID0gMDsKLSAgICB0YWJsZS0+bWF4X21hc2tzID0gMDsKLSAgfQotCi0KLSAgLyogZW5zdXJlIHRoYXQgYSBtYXNrIHRhYmxlIGNhbiBjb250YWluICJjb3VudCIgbWFza3MgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX21hc2tfdGFibGVfZW5zdXJlKCBQU19NYXNrX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX1VJbnQgICBvbGRfbWF4ID0gdGFibGUtPm1heF9tYXNrczsKLSAgICBGVF9VSW50ICAgbmV3X21heCA9IGNvdW50OwotICAgIEZUX0Vycm9yICBlcnJvciAgID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDggKTsKLSAgICAgIGlmICggIUZUX1JFTkVXX0FSUkFZKCB0YWJsZS0+bWFza3MsIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIHRhYmxlLT5tYXhfbWFza3MgPSBuZXdfbWF4OwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGFsbG9jYXRlIGEgbmV3IG1hc2sgaW4gYSB0YWJsZSAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza190YWJsZV9hbGxvYyggUFNfTWFza19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfTWFzayAgICAgICAqYW1hc2sgKQotICB7Ci0gICAgRlRfVUludCAgIGNvdW50OwotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBQU19NYXNrICAgbWFzayAgPSBOVUxMOwotCi0KLSAgICBjb3VudCA9IHRhYmxlLT5udW1fbWFza3M7Ci0gICAgY291bnQrKzsKLQotICAgIGlmICggY291bnQgPiB0YWJsZS0+bWF4X21hc2tzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfZW5zdXJlKCB0YWJsZSwgY291bnQsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBtYXNrICAgICAgICAgICAgID0gdGFibGUtPm1hc2tzICsgY291bnQgLSAxOwotICAgIG1hc2stPm51bV9iaXRzICAgPSAwOwotICAgIG1hc2stPmVuZF9wb2ludCAgPSAwOwotICAgIHRhYmxlLT5udW1fbWFza3MgPSBjb3VudDsKLQotICBFeGl0OgotICAgICphbWFzayA9IG1hc2s7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiByZXR1cm4gbGFzdCBoaW50IG1hc2sgaW4gYSB0YWJsZSwgY3JlYXRlIG9uZSBpZiB0aGUgdGFibGUgaXMgZW1wdHkgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX21hc2tfdGFibGVfbGFzdCggUFNfTWFza19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgIFBTX01hc2sgICAgICAgKmFtYXNrICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VSW50ICAgY291bnQ7Ci0gICAgUFNfTWFzayAgIG1hc2s7Ci0KLQotICAgIGNvdW50ID0gdGFibGUtPm51bV9tYXNrczsKLSAgICBpZiAoIGNvdW50ID09IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gcHNfbWFza190YWJsZV9hbGxvYyggdGFibGUsIG1lbW9yeSwgJm1hc2sgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIG1hc2sgPSB0YWJsZS0+bWFza3MgKyBjb3VudCAtIDE7Ci0KLSAgRXhpdDoKLSAgICAqYW1hc2sgPSBtYXNrOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogc2V0IGEgbmV3IG1hc2sgdG8gYSBnaXZlbiBiaXQgcmFuZ2UgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX21hc2tfdGFibGVfc2V0X2JpdHMoIFBTX01hc2tfVGFibGUgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBiaXRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIFBTX01hc2sgICBtYXNrOwotCi0KLSAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfbGFzdCggdGFibGUsIG1lbW9yeSwgJm1hc2sgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gcHNfbWFza19lbnN1cmUoIG1hc2ssIGJpdF9jb3VudCwgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBtYXNrLT5udW1fYml0cyA9IGJpdF9jb3VudDsKLQotICAgIC8qIG5vdywgY29weSBiaXRzICovCi0gICAgewotICAgICAgRlRfQnl0ZSogIHJlYWQgID0gKEZUX0J5dGUqKXNvdXJjZSArICggYml0X3BvcyA+PiAzICk7Ci0gICAgICBGVF9JbnQgICAgcm1hc2sgPSAweDgwID4+ICggYml0X3BvcyAmIDcgKTsKLSAgICAgIEZUX0J5dGUqICB3cml0ZSA9IG1hc2stPmJ5dGVzOwotICAgICAgRlRfSW50ICAgIHdtYXNrID0gMHg4MDsKLSAgICAgIEZUX0ludCAgICB2YWw7Ci0KLQotICAgICAgZm9yICggOyBiaXRfY291bnQgPiAwOyBiaXRfY291bnQtLSApCi0gICAgICB7Ci0gICAgICAgIHZhbCA9IHdyaXRlWzBdICYgfndtYXNrOwotCi0gICAgICAgIGlmICggcmVhZFswXSAmIHJtYXNrICkKLSAgICAgICAgICB2YWwgfD0gd21hc2s7Ci0KLSAgICAgICAgd3JpdGVbMF0gPSAoRlRfQnl0ZSl2YWw7Ci0KLSAgICAgICAgcm1hc2sgPj49IDE7Ci0gICAgICAgIGlmICggcm1hc2sgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICByZWFkKys7Ci0gICAgICAgICAgcm1hc2sgPSAweDgwOwotICAgICAgICB9Ci0KLSAgICAgICAgd21hc2sgPj49IDE7Ci0gICAgICAgIGlmICggd21hc2sgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZSsrOwotICAgICAgICAgIHdtYXNrID0gMHg4MDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogdGVzdCB3aGV0aGVyIHR3byBtYXNrcyBpbiBhIHRhYmxlIGludGVyc2VjdCAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHBzX21hc2tfdGFibGVfdGVzdF9pbnRlcnNlY3QoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBpbmRleDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGluZGV4MiApCi0gIHsKLSAgICBQU19NYXNrICAgbWFzazEgID0gdGFibGUtPm1hc2tzICsgaW5kZXgxOwotICAgIFBTX01hc2sgICBtYXNrMiAgPSB0YWJsZS0+bWFza3MgKyBpbmRleDI7Ci0gICAgRlRfQnl0ZSogIHAxICAgICA9IG1hc2sxLT5ieXRlczsKLSAgICBGVF9CeXRlKiAgcDIgICAgID0gbWFzazItPmJ5dGVzOwotICAgIEZUX1VJbnQgICBjb3VudDEgPSBtYXNrMS0+bnVtX2JpdHM7Ci0gICAgRlRfVUludCAgIGNvdW50MiA9IG1hc2syLT5udW1fYml0czsKLSAgICBGVF9VSW50ICAgY291bnQ7Ci0KLQotICAgIGNvdW50ID0gRlRfTUlOKCBjb3VudDEsIGNvdW50MiApOwotICAgIGZvciAoIDsgY291bnQgPj0gODsgY291bnQgLT0gOCApCi0gICAgewotICAgICAgaWYgKCBwMVswXSAmIHAyWzBdICkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIHAxKys7Ci0gICAgICBwMisrOwotICAgIH0KLQotICAgIGlmICggY291bnQgPT0gMCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiAoIHAxWzBdICYgcDJbMF0gKSAmIH4oIDB4RkYgPj4gY291bnQgKTsKLSAgfQotCi0KLSAgLyogbWVyZ2UgdHdvIG1hc2tzLCB1c2VkIGJ5IHBzX21hc2tfdGFibGVfbWVyZ2VfYWxsICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19tYXNrX3RhYmxlX21lcmdlKCBQU19NYXNrX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgaW5kZXgxLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBpbmRleDIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIC8qIHN3YXAgaW5kZXgxIGFuZCBpbmRleDIgc28gdGhhdCBpbmRleDEgPCBpbmRleDIgKi8KLSAgICBpZiAoIGluZGV4MSA+IGluZGV4MiApCi0gICAgewotICAgICAgRlRfVUludCAgdGVtcDsKLQotCi0gICAgICB0ZW1wICAgPSBpbmRleDE7Ci0gICAgICBpbmRleDEgPSBpbmRleDI7Ci0gICAgICBpbmRleDIgPSB0ZW1wOwotICAgIH0KLQotICAgIGlmICggaW5kZXgxIDwgaW5kZXgyICYmIGluZGV4MiA8IHRhYmxlLT5udW1fbWFza3MgKQotICAgIHsKLSAgICAgIC8qIHdlIG5lZWQgdG8gbWVyZ2UgdGhlIGJpdHNldHMgb2YgaW5kZXgxIGFuZCBpbmRleDIgd2l0aCBhICovCi0gICAgICAvKiBzaW1wbGUgdW5pb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgUFNfTWFzayAgbWFzazEgID0gdGFibGUtPm1hc2tzICsgaW5kZXgxOwotICAgICAgUFNfTWFzayAgbWFzazIgID0gdGFibGUtPm1hc2tzICsgaW5kZXgyOwotICAgICAgRlRfVUludCAgY291bnQxID0gbWFzazEtPm51bV9iaXRzOwotICAgICAgRlRfVUludCAgY291bnQyID0gbWFzazItPm51bV9iaXRzOwotICAgICAgRlRfSW50ICAgZGVsdGE7Ci0KLQotICAgICAgaWYgKCBjb3VudDIgPiAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgIHBvczsKLSAgICAgICAgRlRfQnl0ZSogIHJlYWQ7Ci0gICAgICAgIEZUX0J5dGUqICB3cml0ZTsKLQotCi0gICAgICAgIC8qIGlmICJjb3VudDIiIGlzIGdyZWF0ZXIgdGhhbiAiY291bnQxIiwgd2UgbmVlZCB0byBncm93IHRoZSAqLwotICAgICAgICAvKiBmaXJzdCBiaXRzZXQsIGFuZCBjbGVhciB0aGUgaGlnaGVzdCBiaXRzICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBjb3VudDIgPiBjb3VudDEgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBwc19tYXNrX2Vuc3VyZSggbWFzazEsIGNvdW50MiwgbWVtb3J5ICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBmb3IgKCBwb3MgPSBjb3VudDE7IHBvcyA8IGNvdW50MjsgcG9zKysgKQotICAgICAgICAgICAgcHNfbWFza19jbGVhcl9iaXQoIG1hc2sxLCBwb3MgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG1lcmdlICh1bml0ZSkgdGhlIGJpdHNldHMgKi8KLSAgICAgICAgcmVhZCAgPSBtYXNrMi0+Ynl0ZXM7Ci0gICAgICAgIHdyaXRlID0gbWFzazEtPmJ5dGVzOwotICAgICAgICBwb3MgICA9ICggY291bnQyICsgNyApID4+IDM7Ci0KLSAgICAgICAgZm9yICggOyBwb3MgPiAwOyBwb3MtLSApCi0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZVswXSA9IChGVF9CeXRlKSggd3JpdGVbMF0gfCByZWFkWzBdICk7Ci0gICAgICAgICAgd3JpdGUrKzsKLSAgICAgICAgICByZWFkKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogTm93LCByZW1vdmUgIm1hc2syIiBmcm9tIHRoZSBsaXN0LiAgV2UgbmVlZCB0byBrZWVwIHRoZSBtYXNrcyAqLwotICAgICAgLyogc29ydGVkIGluIG9yZGVyIG9mIGltcG9ydGFuY2UsIHNvIG1vdmUgdGFibGUgZWxlbWVudHMuICAgICAgICAqLwotICAgICAgbWFzazItPm51bV9iaXRzICA9IDA7Ci0gICAgICBtYXNrMi0+ZW5kX3BvaW50ID0gMDsKLQotICAgICAgLyogbnVtYmVyIG9mIG1hc2tzIHRvIG1vdmUgKi8KLSAgICAgIGRlbHRhID0gKEZUX0ludCkoIHRhYmxlLT5udW1fbWFza3MgLSAxIC0gaW5kZXgyICk7Ci0gICAgICBpZiAoIGRlbHRhID4gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIG1vdmUgdG8gZW5kIG9mIHRhYmxlIGZvciByZXVzZSAqLwotICAgICAgICBQU19NYXNrUmVjICBkdW1teSA9ICptYXNrMjsKLQotCi0gICAgICAgIGZ0X21lbW1vdmUoIG1hc2syLAotICAgICAgICAgICAgICAgICAgICBtYXNrMiArIDEsCi0gICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWRlbHRhICogc2l6ZW9mICggUFNfTWFza1JlYyApICk7Ci0KLSAgICAgICAgbWFzazJbZGVsdGFdID0gZHVtbXk7Ci0gICAgICB9Ci0KLSAgICAgIHRhYmxlLT5udW1fbWFza3MtLTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgRlRfVFJBQ0UwKCggInBzX21hc2tfdGFibGVfbWVyZ2U6IGlnbm9yaW5nIGludmFsaWQgaW5kaWNlcyAoJWQsJWQpXG4iLAotICAgICAgICAgICAgICAgICAgaW5kZXgxLCBpbmRleDIgKSk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIFRyeSB0byBtZXJnZSBhbGwgbWFza3MgaW4gYSBnaXZlbiB0YWJsZS4gIFRoaXMgaXMgdXNlZCB0byBtZXJnZSAqLwotICAvKiBhbGwgY291bnRlciBtYXNrcyBpbnRvIGluZGVwZW5kZW50IGNvdW50ZXIgInBhdGhzIi4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19tYXNrX3RhYmxlX21lcmdlX2FsbCggUFNfTWFza19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfSW50ICAgIGluZGV4MSwgaW5kZXgyOwotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgLyogYm90aCBsb29wcyBnbyBkb3duIHRvIDAsIHRodXMgRlRfSW50IGZvciBpbmRleDEgYW5kIGluZGV4MiAqLwotICAgIGZvciAoIGluZGV4MSA9IChGVF9JbnQpdGFibGUtPm51bV9tYXNrcyAtIDE7IGluZGV4MSA+IDA7IGluZGV4MS0tICkKLSAgICB7Ci0gICAgICBmb3IgKCBpbmRleDIgPSBpbmRleDEgLSAxOyBpbmRleDIgPj0gMDsgaW5kZXgyLS0gKQotICAgICAgewotICAgICAgICBpZiAoIHBzX21hc2tfdGFibGVfdGVzdF9pbnRlcnNlY3QoIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWluZGV4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClpbmRleDIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfbWVyZ2UoIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpaW5kZXgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpaW5kZXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBQU19ESU1FTlNJT04gTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBmaW5hbGl6ZSBhIGdpdmVuIGRpbWVuc2lvbiAqLwotICBzdGF0aWMgdm9pZAotICBwc19kaW1lbnNpb25fZG9uZSggUFNfRGltZW5zaW9uICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApCi0gIHsKLSAgICBwc19tYXNrX3RhYmxlX2RvbmUoICZkaW1lbnNpb24tPmNvdW50ZXJzLCBtZW1vcnkgKTsKLSAgICBwc19tYXNrX3RhYmxlX2RvbmUoICZkaW1lbnNpb24tPm1hc2tzLCAgICBtZW1vcnkgKTsKLSAgICBwc19oaW50X3RhYmxlX2RvbmUoICZkaW1lbnNpb24tPmhpbnRzLCAgICBtZW1vcnkgKTsKLSAgfQotCi0KLSAgLyogaW5pdGlhbGl6ZSBhIGdpdmVuIGRpbWVuc2lvbiAqLwotICBzdGF0aWMgdm9pZAotICBwc19kaW1lbnNpb25faW5pdCggUFNfRGltZW5zaW9uICBkaW1lbnNpb24gKQotICB7Ci0gICAgZGltZW5zaW9uLT5oaW50cy5udW1faGludHMgICAgPSAwOwotICAgIGRpbWVuc2lvbi0+bWFza3MubnVtX21hc2tzICAgID0gMDsKLSAgICBkaW1lbnNpb24tPmNvdW50ZXJzLm51bV9tYXNrcyA9IDA7Ci0gIH0KLQotCi0jaWYgMAotCi0gIC8qIHNldCBhIGJpdCBhdCBhIGdpdmVuIGluZGV4IGluIHRoZSBjdXJyZW50IGhpbnQgbWFzayAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdCggUFNfRGltZW5zaW9uICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApCi0gIHsKLSAgICBQU19NYXNrICAgbWFzazsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIC8qIGdldCBsYXN0IGhpbnQgbWFzayAqLwotICAgIGVycm9yID0gcHNfbWFza190YWJsZV9sYXN0KCAmZGltLT5tYXNrcywgbWVtb3J5LCAmbWFzayApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBwc19tYXNrX3NldF9iaXQoIG1hc2ssIGlkeCwgbWVtb3J5ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmCi0KLSAgLyogc2V0IHRoZSBlbmQgcG9pbnQgaW4gYSBtYXNrLCBjYWxsZWQgZnJvbSAiRW5kIiAmICJSZXNldCIgbWV0aG9kcyAqLwotICBzdGF0aWMgdm9pZAotICBwc19kaW1lbnNpb25fZW5kX21hc2soIFBTX0RpbWVuc2lvbiAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZW5kX3BvaW50ICkKLSAgewotICAgIEZUX1VJbnQgIGNvdW50ID0gZGltLT5tYXNrcy5udW1fbWFza3M7Ci0KLQotICAgIGlmICggY291bnQgPiAwICkKLSAgICB7Ci0gICAgICBQU19NYXNrICBtYXNrID0gZGltLT5tYXNrcy5tYXNrcyArIGNvdW50IC0gMTsKLQotCi0gICAgICBtYXNrLT5lbmRfcG9pbnQgPSBlbmRfcG9pbnQ7Ci0gICAgfQotICB9Ci0KLQotICAvKiBzZXQgdGhlIGVuZCBwb2ludCBpbiB0aGUgY3VycmVudCBtYXNrLCB0aGVuIGNyZWF0ZSBhIG5ldyBlbXB0eSBvbmUgKi8KLSAgLyogKGNhbGxlZCBieSAiUmVzZXQiIG1ldGhvZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19kaW1lbnNpb25fcmVzZXRfbWFzayggUFNfRGltZW5zaW9uICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGVuZF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ICkKLSAgewotICAgIFBTX01hc2sgIG1hc2s7Ci0KLQotICAgIC8qIGVuZCBjdXJyZW50IG1hc2sgKi8KLSAgICBwc19kaW1lbnNpb25fZW5kX21hc2soIGRpbSwgZW5kX3BvaW50ICk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBuZXcgb25lICovCi0gICAgcmV0dXJuIHBzX21hc2tfdGFibGVfYWxsb2MoICZkaW0tPm1hc2tzLCBtZW1vcnksICZtYXNrICk7Ci0gIH0KLQotCi0gIC8qIHNldCBhIG5ldyBtYXNrLCBjYWxsZWQgZnJvbSB0aGUgIlQyU3RlbSIgbWV0aG9kICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19kaW1lbnNpb25fc2V0X21hc2tfYml0cyggUFNfRGltZW5zaW9uICAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgc291cmNlX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBzb3VyY2VfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgLyogcmVzZXQgY3VycmVudCBtYXNrLCBpZiBhbnkgKi8KLSAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9yZXNldF9tYXNrKCBkaW0sIGVuZF9wb2ludCwgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBzZXQgYml0cyBpbiBuZXcgbWFzayAqLwotICAgIGVycm9yID0gcHNfbWFza190YWJsZV9zZXRfYml0cyggJmRpbS0+bWFza3MsIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wb3MsIHNvdXJjZV9iaXRzLCBtZW1vcnkgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogYWRkIGEgbmV3IHNpbmdsZSBzdGVtIChjYWxsZWQgZnJvbSAiVDFTdGVtIiBtZXRob2QpICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19kaW1lbnNpb25fYWRkX3Qxc3RlbSggUFNfRGltZW5zaW9uICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKmFpbmRleCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgIGZsYWdzID0gMDsKLQotCi0gICAgLyogZGV0ZWN0IGdob3N0IHN0ZW0gKi8KLSAgICBpZiAoIGxlbiA8IDAgKQotICAgIHsKLSAgICAgIGZsYWdzIHw9IFBTX0hJTlRfRkxBR19HSE9TVDsKLSAgICAgIGlmICggbGVuID09IC0yMSApCi0gICAgICB7Ci0gICAgICAgIGZsYWdzIHw9IFBTX0hJTlRfRkxBR19CT1RUT007Ci0gICAgICAgIHBvcyAgICs9IGxlbjsKLSAgICAgIH0KLSAgICAgIGxlbiA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCBhaW5kZXggKQotICAgICAgKmFpbmRleCA9IC0xOwotCi0gICAgLyogbm93LCBsb29rdXAgc3RlbSBpbiB0aGUgY3VycmVudCBoaW50cyB0YWJsZSAqLwotICAgIHsKLSAgICAgIFBTX01hc2sgIG1hc2s7Ci0gICAgICBGVF9VSW50ICBpZHg7Ci0gICAgICBGVF9VSW50ICBtYXggID0gZGltLT5oaW50cy5udW1faGludHM7Ci0gICAgICBQU19IaW50ICBoaW50ID0gZGltLT5oaW50cy5oaW50czsKLQotCi0gICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrLCBoaW50KysgKQotICAgICAgewotICAgICAgICBpZiAoIGhpbnQtPnBvcyA9PSBwb3MgJiYgaGludC0+bGVuID09IGxlbiApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGhpbnQgaW4gdGhlIHRhYmxlICovCi0gICAgICBpZiAoIGlkeCA+PSBtYXggKQotICAgICAgewotICAgICAgICBlcnJvciA9IHBzX2hpbnRfdGFibGVfYWxsb2MoICZkaW0tPmhpbnRzLCBtZW1vcnksICZoaW50ICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBoaW50LT5wb3MgICA9IHBvczsKLSAgICAgICAgaGludC0+bGVuICAgPSBsZW47Ci0gICAgICAgIGhpbnQtPmZsYWdzID0gZmxhZ3M7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdywgc3RvcmUgdGhlIGhpbnQgaW4gdGhlIGN1cnJlbnQgbWFzayAqLwotICAgICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX2xhc3QoICZkaW0tPm1hc2tzLCBtZW1vcnksICZtYXNrICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IHBzX21hc2tfc2V0X2JpdCggbWFzaywgaWR4LCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggYWluZGV4ICkKLSAgICAgICAgKmFpbmRleCA9IChGVF9JbnQpaWR4OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogYWRkIGEgImhzdGVtMy92c3RlbTMiIGNvdW50ZXIgdG8gb3VyIGRpbWVuc2lvbiB0YWJsZSAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX2FkZF9jb3VudGVyKCBQU19EaW1lbnNpb24gIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGhpbnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgaGludDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBoaW50MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgICA9IEZUX0Vycl9PazsKLSAgICBGVF9VSW50ICAgY291bnQgICA9IGRpbS0+Y291bnRlcnMubnVtX21hc2tzOwotICAgIFBTX01hc2sgICBjb3VudGVyID0gZGltLT5jb3VudGVycy5tYXNrczsKLQotCi0gICAgLyogdHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgY291bnRlciBtYXNrIHRoYXQgYWxyZWFkeSB1c2VzICovCi0gICAgLyogb25lIG9mIHRoZXNlIHN0ZW1zIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGNvdW50ZXIrKyApCi0gICAgewotICAgICAgaWYgKCBwc19tYXNrX3Rlc3RfYml0KCBjb3VudGVyLCBoaW50MSApIHx8Ci0gICAgICAgICAgIHBzX21hc2tfdGVzdF9iaXQoIGNvdW50ZXIsIGhpbnQyICkgfHwKLSAgICAgICAgICAgcHNfbWFza190ZXN0X2JpdCggY291bnRlciwgaGludDMgKSApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGNyZWF0ZSBhIG5ldyBjb3VudGVyIHdoZW4gbmVlZGVkICovCi0gICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfYWxsb2MoICZkaW0tPmNvdW50ZXJzLCBtZW1vcnksICZjb3VudGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIG5vdywgc2V0IHRoZSBiaXRzIGZvciBvdXIgaGludHMgaW4gdGhlIGNvdW50ZXIgbWFzayAqLwotICAgIGlmICggaGludDEgPj0gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBwc19tYXNrX3NldF9iaXQoIGNvdW50ZXIsIChGVF9VSW50KWhpbnQxLCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBoaW50MiA+PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzX21hc2tfc2V0X2JpdCggY291bnRlciwgKEZUX1VJbnQpaGludDIsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGhpbnQzID49IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gcHNfbWFza19zZXRfYml0KCBjb3VudGVyLCAoRlRfVUludCloaW50MywgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZW5kIG9mIHJlY29yZGluZyBzZXNzaW9uIGZvciBhIGdpdmVuIGRpbWVuc2lvbiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX2VuZCggUFNfRGltZW5zaW9uICBkaW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZW5kX3BvaW50LAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApCi0gIHsKLSAgICAvKiBlbmQgaGludCBtYXNrIHRhYmxlICovCi0gICAgcHNfZGltZW5zaW9uX2VuZF9tYXNrKCBkaW0sIGVuZF9wb2ludCApOwotCi0gICAgLyogbWVyZ2UgYWxsIGNvdW50ZXIgbWFza3MgaW50byBpbmRlcGVuZGVudCAicGF0aHMiICovCi0gICAgcmV0dXJuIHBzX21hc2tfdGFibGVfbWVyZ2VfYWxsKCAmZGltLT5jb3VudGVycywgbWVtb3J5ICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgUFNfUkVDT1JERVIgTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogZGVzdHJveSBoaW50cyAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX2hpbnRzX2RvbmUoIFBTX0hpbnRzICBoaW50cyApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGhpbnRzLT5tZW1vcnk7Ci0KLQotICAgIHBzX2RpbWVuc2lvbl9kb25lKCAmaGludHMtPmRpbWVuc2lvblswXSwgbWVtb3J5ICk7Ci0gICAgcHNfZGltZW5zaW9uX2RvbmUoICZoaW50cy0+ZGltZW5zaW9uWzFdLCBtZW1vcnkgKTsKLQotICAgIGhpbnRzLT5lcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgaGludHMtPm1lbW9yeSA9IE5VTEw7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfaGludHNfaW5pdCggUFNfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfWkVSTyggaGludHMgKTsKLSAgICBoaW50cy0+bWVtb3J5ID0gbWVtb3J5OwotICB9Ci0KLQotICAvKiBpbml0aWFsaXplIGEgaGludHMgZm9yIGEgbmV3IHNlc3Npb24gKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfaGludHNfb3BlbiggUFNfSGludHMgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgUFNfSGludF9UeXBlICBoaW50X3R5cGUgKQotICB7Ci0gICAgaGludHMtPmVycm9yICAgICA9IEZUX0Vycl9PazsKLSAgICBoaW50cy0+aGludF90eXBlID0gaGludF90eXBlOwotCi0gICAgcHNfZGltZW5zaW9uX2luaXQoICZoaW50cy0+ZGltZW5zaW9uWzBdICk7Ci0gICAgcHNfZGltZW5zaW9uX2luaXQoICZoaW50cy0+ZGltZW5zaW9uWzFdICk7Ci0gIH0KLQotCi0gIC8qIGFkZCBvbmUgb3IgbW9yZSBzdGVtcyB0byB0aGUgY3VycmVudCBoaW50cyB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc19oaW50c19zdGVtKCBQU19IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyogIHN0ZW1zICkKLSAgewotICAgIFBTX0RpbWVuc2lvbiAgZGltOwotCi0KLSAgICBpZiAoIGhpbnRzLT5lcnJvciApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBsaW1pdCAiZGltZW5zaW9uIiB0byAwLi4xICovCi0gICAgaWYgKCBkaW1lbnNpb24gPiAxICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTAoKCAicHNfaGludHNfc3RlbTogaW52YWxpZCBkaW1lbnNpb24gKCVkKSB1c2VkXG4iLAotICAgICAgICAgICAgICAgICAgZGltZW5zaW9uICkpOwotICAgICAgZGltZW5zaW9uID0gKCBkaW1lbnNpb24gIT0gMCApOwotICAgIH0KLQotICAgIC8qIHJlY29yZCB0aGUgc3RlbXMgaW4gdGhlIGN1cnJlbnQgaGludHMvbWFza3MgdGFibGUgKi8KLSAgICAvKiAoVHlwZSAxICYgMidzIGBoc3RlbScgb3IgYHZzdGVtJyBvcGVyYXRvcnMpICAgICAgICovCi0gICAgZGltID0gJmhpbnRzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzdGVtcyArPSAyICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotCi0KLSAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX2FkZF90MXN0ZW0oIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpc3RlbXNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KXN0ZW1zWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX2hpbnRzX3N0ZW06IGNvdWxkIG5vdCBhZGQgc3RlbSIKLSAgICAgICAgICAgICAgICAgICAiICglZCwlZCkgdG8gaGludHMgdGFibGVcbiIsIHN0ZW1zWzBdLCBzdGVtc1sxXSApKTsKLQotICAgICAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogYWRkIG9uZSBUeXBlMSBjb3VudGVyIHN0ZW0gdG8gdGhlIGN1cnJlbnQgaGludHMgdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfaGludHNfdDFzdGVtMyggUFNfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgc3RlbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFoaW50cy0+ZXJyb3IgKQotICAgIHsKLSAgICAgIFBTX0RpbWVuc2lvbiAgZGltOwotICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgICAgRlRfSW50ICAgICAgICBjb3VudDsKLSAgICAgIEZUX0ludCAgICAgICAgaWR4WzNdOwotCi0KLSAgICAgIC8qIGxpbWl0ICJkaW1lbnNpb24iIHRvIDAuLjEgKi8KLSAgICAgIGlmICggZGltZW5zaW9uID4gMSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJwc19oaW50c190MXN0ZW0zOiBpbnZhbGlkIGRpbWVuc2lvbiAoJWQpIHVzZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiApKTsKLSAgICAgICAgZGltZW5zaW9uID0gKCBkaW1lbnNpb24gIT0gMCApOwotICAgICAgfQotCi0gICAgICBkaW0gPSAmaGludHMtPmRpbWVuc2lvbltkaW1lbnNpb25dOwotCi0gICAgICAvKiB0aGVyZSBtdXN0IGJlIDYgZWxlbWVudHMgaW4gdGhlICdzdGVtJyBhcnJheSAqLwotICAgICAgaWYgKCBoaW50cy0+aGludF90eXBlID09IFBTX0hJTlRfVFlQRV8xICkKLSAgICAgIHsKLSAgICAgICAgLyogYWRkIHRoZSB0aHJlZSBzdGVtcyB0byBvdXIgaGludHMvbWFza3MgdGFibGUgKi8KLSAgICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IDM7IGNvdW50KyssIHN0ZW1zICs9IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fYWRkX3Qxc3RlbSggZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpRklYRURfVE9fSU5UKCBzdGVtc1swXSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpRklYRURfVE9fSU5UKCBzdGVtc1sxXSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwgJmlkeFtjb3VudF0gKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdywgYWRkIHRoZSBoaW50cyB0byB0aGUgY291bnRlcnMgdGFibGUgKi8KLSAgICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fYWRkX2NvdW50ZXIoIGRpbSwgaWR4WzBdLCBpZHhbMV0sIGlkeFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX2hpbnRzX3Qxc3RlbTM6IGNhbGxlZCB3aXRoIGludmFsaWQgaGludCB0eXBlXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBGVF9FUlJPUigoICJwc19oaW50c190MXN0ZW0zOiBjb3VsZCBub3QgYWRkIGNvdW50ZXIgc3RlbXMgdG8gdGFibGVcbiIgKSk7Ci0gICAgaGludHMtPmVycm9yID0gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHJlc2V0IGhpbnRzIChvbmx5IHdpdGggVHlwZSAxIGhpbnRzKSAqLwotICBzdGF0aWMgdm9pZAotICBwc19oaW50c190MXJlc2V0KCBQU19IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBlbmRfcG9pbnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFoaW50cy0+ZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLQotCi0gICAgICBpZiAoIGhpbnRzLT5oaW50X3R5cGUgPT0gUFNfSElOVF9UWVBFXzEgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9yZXNldF9tYXNrKCAmaGludHMtPmRpbWVuc2lvblswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3BvaW50LCBtZW1vcnkgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3Jlc2V0X21hc2soICZoaW50cy0+ZGltZW5zaW9uWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsIG1lbW9yeSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGludmFsaWQgaGludCB0eXBlICovCi0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgLyogVHlwZTIgImhpbnRtYXNrIiBvcGVyYXRvciwgYWRkIGEgbmV3IGhpbnRtYXNrIHRvIGVhY2ggZGlyZWN0aW9uICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzX2hpbnRzX3QybWFzayggUFNfSGludHMgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgYnl0ZXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBpZiAoICFoaW50cy0+ZXJyb3IgKQotICAgIHsKLSAgICAgIFBTX0RpbWVuc2lvbiAgZGltICAgID0gaGludHMtPmRpbWVuc2lvbjsKLSAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLSAgICAgIEZUX1VJbnQgICAgICAgY291bnQxID0gZGltWzBdLmhpbnRzLm51bV9oaW50czsKLSAgICAgIEZUX1VJbnQgICAgICAgY291bnQyID0gZGltWzFdLmhpbnRzLm51bV9oaW50czsKLQotCi0gICAgICAvKiBjaGVjayBiaXQgY291bnQ7IG11c3QgYmUgZXF1YWwgdG8gY3VycmVudCB0b3RhbCBoaW50IGNvdW50ICovCi0gICAgICBpZiAoIGJpdF9jb3VudCAhPSAgY291bnQxICsgY291bnQyICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UwKCggInBzX2hpbnRzX3QybWFzazoiCi0gICAgICAgICAgICAgICAgICAgICIgY2FsbGVkIHdpdGggaW52YWxpZCBiaXRjb3VudCAlZCAoaW5zdGVhZCBvZiAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgYml0X2NvdW50LCBjb3VudDEgKyBjb3VudDIgKSk7Ci0KLSAgICAgICAgLyogc2ltcGx5IGlnbm9yZSB0aGUgb3BlcmF0b3IgKi8KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBzZXQtdXAgbmV3IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGhpbnQgbWFzayBub3cgKi8KLSAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdHMoICZkaW1bMF0sIGJ5dGVzLCBjb3VudDIsIGNvdW50MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9wb2ludCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9zZXRfbWFza19iaXRzKCAmZGltWzFdLCBieXRlcywgMCwgY291bnQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3BvaW50LCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIGhpbnRzLT5lcnJvciA9IGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwc19oaW50c190MmNvdW50ZXIoIFBTX0hpbnRzICAgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGlmICggIWhpbnRzLT5lcnJvciApCi0gICAgewotICAgICAgUFNfRGltZW5zaW9uICBkaW0gICAgPSBoaW50cy0+ZGltZW5zaW9uOwotICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgICAgRlRfVUludCAgICAgICBjb3VudDEgPSBkaW1bMF0uaGludHMubnVtX2hpbnRzOwotICAgICAgRlRfVUludCAgICAgICBjb3VudDIgPSBkaW1bMV0uaGludHMubnVtX2hpbnRzOwotCi0KLSAgICAgIC8qIGNoZWNrIGJpdCBjb3VudCwgbXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IHRvdGFsIGhpbnQgY291bnQgKi8KLSAgICAgIGlmICggYml0X2NvdW50ICE9ICBjb3VudDEgKyBjb3VudDIgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAicHNfaGludHNfdDJjb3VudGVyOiIKLSAgICAgICAgICAgICAgICAgICAgIiBjYWxsZWQgd2l0aCBpbnZhbGlkIGJpdGNvdW50ICVkIChpbnN0ZWFkIG9mICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICBiaXRfY291bnQsIGNvdW50MSArIGNvdW50MiApKTsKLQotICAgICAgICAvKiBzaW1wbHkgaWdub3JlIHRoZSBvcGVyYXRvciAqLwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIHNldC11cCBuZXcgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaGludCBtYXNrIG5vdyAqLwotICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fc2V0X21hc2tfYml0cyggJmRpbVswXSwgYnl0ZXMsIDAsIGNvdW50MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fc2V0X21hc2tfYml0cyggJmRpbVsxXSwgYnl0ZXMsIGNvdW50MSwgY291bnQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgLyogZW5kIHJlY29yZGluZyBzZXNzaW9uICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19oaW50c19jbG9zZSggUFNfSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gaGludHMtPmVycm9yOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IGhpbnRzLT5tZW1vcnk7Ci0gICAgICBQU19EaW1lbnNpb24gIGRpbSAgICA9IGhpbnRzLT5kaW1lbnNpb247Ci0KLQotICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fZW5kKCAmZGltWzBdLCBlbmRfcG9pbnQsIG1lbW9yeSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9lbmQoICZkaW1bMV0sIGVuZF9wb2ludCwgbWVtb3J5ICk7Ci0gICAgICB9Ci0gICAgfQotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgcHNfZGVidWdfaGludHMgPSBoaW50czsKLSNlbmRpZgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgIFRZUEUgMSBISU5UUyBSRUNPUkRJTkcgSU5URVJGQUNFICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgdDFfaGludHNfb3BlbiggVDFfSGludHMgIGhpbnRzICkKLSAgewotICAgIHBzX2hpbnRzX29wZW4oIChQU19IaW50cyloaW50cywgUFNfSElOVF9UWVBFXzEgKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkCi0gIHQxX2hpbnRzX3N0ZW0oIFQxX0hpbnRzICAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9Qb3MgIHN0ZW1zWzJdOwotCi0KLSAgICBzdGVtc1swXSA9IEZJWEVEX1RPX0lOVCggY29vcmRzWzBdICk7Ci0gICAgc3RlbXNbMV0gPSBGSVhFRF9UT19JTlQoIGNvb3Jkc1sxXSApOwotCi0gICAgcHNfaGludHNfc3RlbSggKFBTX0hpbnRzKWhpbnRzLCBkaW1lbnNpb24sIDEsIHN0ZW1zICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHQxX2hpbnRzX2Z1bmNzX2luaXQoIFQxX0hpbnRzX0Z1bmNzUmVjKiAgZnVuY3MgKQotICB7Ci0gICAgRlRfWkVSTyggZnVuY3MgKTsKLQotICAgIGZ1bmNzLT5vcGVuICA9IChUMV9IaW50c19PcGVuRnVuYykgICAgdDFfaGludHNfb3BlbjsKLSAgICBmdW5jcy0+Y2xvc2UgPSAoVDFfSGludHNfQ2xvc2VGdW5jKSAgIHBzX2hpbnRzX2Nsb3NlOwotICAgIGZ1bmNzLT5zdGVtICA9IChUMV9IaW50c19TZXRTdGVtRnVuYykgdDFfaGludHNfc3RlbTsKLSAgICBmdW5jcy0+c3RlbTMgPSAoVDFfSGludHNfU2V0U3RlbTNGdW5jKXBzX2hpbnRzX3Qxc3RlbTM7Ci0gICAgZnVuY3MtPnJlc2V0ID0gKFQxX0hpbnRzX1Jlc2V0RnVuYykgICBwc19oaW50c190MXJlc2V0OwotICAgIGZ1bmNzLT5hcHBseSA9IChUMV9IaW50c19BcHBseUZ1bmMpICAgcHNfaGludHNfYXBwbHk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICBUWVBFIDIgSElOVFMgUkVDT1JESU5HIElOVEVSRkFDRSAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHQyX2hpbnRzX29wZW4oIFQyX0hpbnRzICBoaW50cyApCi0gIHsKLSAgICBwc19oaW50c19vcGVuKCAoUFNfSGludHMpaGludHMsIFBTX0hJTlRfVFlQRV8yICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHQyX2hpbnRzX3N0ZW1zKCBUMl9IaW50cyAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgRlRfUG9zICBzdGVtc1szMl0sIHk7Ci0gICAgRlRfSW50ICB0b3RhbCA9IGNvdW50LCBuOwotCi0KLSAgICB5ID0gMDsKLSAgICB3aGlsZSAoIHRvdGFsID4gMCApCi0gICAgewotICAgICAgLyogZGV0ZXJtaW5lIG51bWJlciBvZiBzdGVtcyB0byB3cml0ZSAqLwotICAgICAgY291bnQgPSB0b3RhbDsKLSAgICAgIGlmICggY291bnQgPiAxNiApCi0gICAgICAgIGNvdW50ID0gMTY7Ci0KLSAgICAgIC8qIGNvbXB1dGUgaW50ZWdlciBzdGVtIHBvc2l0aW9ucyBpbiBmb250IHVuaXRzICovCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50ICogMjsgbisrICkKLSAgICAgIHsKLSAgICAgICAgeSAgICAgICArPSBjb29yZHNbbl07Ci0gICAgICAgIHN0ZW1zW25dID0gRklYRURfVE9fSU5UKCB5ICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvbXB1dGUgbGVuZ3RocyAqLwotICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudCAqIDI7IG4gKz0gMiApCi0gICAgICAgIHN0ZW1zW24gKyAxXSA9IHN0ZW1zW24gKyAxXSAtIHN0ZW1zW25dOwotCi0gICAgICAvKiBhZGQgdGhlbSB0byB0aGUgY3VycmVudCBkaW1lbnNpb24gKi8KLSAgICAgIHBzX2hpbnRzX3N0ZW0oIChQU19IaW50cyloaW50cywgZGltZW5zaW9uLCBjb3VudCwgc3RlbXMgKTsKLQotICAgICAgdG90YWwgLT0gY291bnQ7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0Ml9oaW50c19mdW5jc19pbml0KCBUMl9IaW50c19GdW5jc1JlYyogIGZ1bmNzICkKLSAgewotICAgIEZUX1pFUk8oIGZ1bmNzICk7Ci0KLSAgICBmdW5jcy0+b3BlbiAgICA9IChUMl9IaW50c19PcGVuRnVuYykgICB0Ml9oaW50c19vcGVuOwotICAgIGZ1bmNzLT5jbG9zZSAgID0gKFQyX0hpbnRzX0Nsb3NlRnVuYykgIHBzX2hpbnRzX2Nsb3NlOwotICAgIGZ1bmNzLT5zdGVtcyAgID0gKFQyX0hpbnRzX1N0ZW1zRnVuYykgIHQyX2hpbnRzX3N0ZW1zOwotICAgIGZ1bmNzLT5oaW50bWFzaz0gKFQyX0hpbnRzX01hc2tGdW5jKSAgIHBzX2hpbnRzX3QybWFzazsKLSAgICBmdW5jcy0+Y291bnRlciA9IChUMl9IaW50c19Db3VudGVyRnVuYylwc19oaW50c190MmNvdW50ZXI7Ci0gICAgZnVuY3MtPmFwcGx5ICAgPSAoVDJfSGludHNfQXBwbHlGdW5jKSAgcHNfaGludHNfYXBwbHk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hyZWMuaCBiL3NyYy9wc2hpbnRlci9wc2hyZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwYmMyYi4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNocmVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNocmVjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RzY3JpcHQgKFR5cGUxL1R5cGUyKSBoaW50cyByZWNvcmRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgYXJlIGNhbGxlZCBmcm9tIHRoZSBUeXBlIDEsIENJRCBhbmQgQ0ZGICAgICovCi0gIC8qICBmb250IGRyaXZlcnMgdG8gcmVjb3JkIHRoZSBoaW50cyBvZiBhIGdpdmVuIGNoYXJhY3Rlci9nbHlwaC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIGhpbnRzIGFyZSByZWNvcmRlZCBpbiBhIHVuaWZpZWQgZm9ybWF0LCBhbmQgYXJlIGxhdGVyIHByb2Nlc3NlZCAgICovCi0gIC8qICBieSB0aGUgYG9wdGltaXplcicgYW5kIGBmaXR0ZXInIHRvIGFkanVzdCB0aGUgb3V0bGluZXMgdG8gdGhlIHBpeGVsICAgKi8KLSAgLyogIGdyaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBTSFJFQ19IXwotI2RlZmluZSBQU0hSRUNfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAotI2luY2x1ZGUgInBzaGdsb2IuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgR0xZUEggSElOVFMgUkVDT1JERVIgSU5URVJOQUxTICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGhhbmRsZSB0byBoaW50IHJlY29yZCAqLwotICB0eXBlZGVmIHN0cnVjdCBQU19IaW50UmVjXyogIFBTX0hpbnQ7Ci0KLSAgLyogaGludCB0eXBlcyAqLwotICB0eXBlZGVmIGVudW0gIFBTX0hpbnRfVHlwZV8KLSAgewotICAgIFBTX0hJTlRfVFlQRV8xID0gMSwKLSAgICBQU19ISU5UX1RZUEVfMiA9IDIKLQotICB9IFBTX0hpbnRfVHlwZTsKLQotCi0gIC8qIGhpbnQgZmxhZ3MgKi8KLSNkZWZpbmUgUFNfSElOVF9GTEFHX0dIT1NUICAgMVUKLSNkZWZpbmUgUFNfSElOVF9GTEFHX0JPVFRPTSAgMlUKLQotCi0gIC8qIGhpbnQgZGVzY3JpcHRvciAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfSGludFJlY18KLSAgewotICAgIEZUX0ludCAgIHBvczsKLSAgICBGVF9JbnQgICBsZW47Ci0gICAgRlRfVUludCAgZmxhZ3M7Ci0KLSAgfSBQU19IaW50UmVjOwotCi0KLSNkZWZpbmUgcHNfaGludF9pc19hY3RpdmUoIHggKSAgKCAoeCktPmZsYWdzICYgUFNfSElOVF9GTEFHX0FDVElWRSApCi0jZGVmaW5lIHBzX2hpbnRfaXNfZ2hvc3QoIHggKSAgICggKHgpLT5mbGFncyAmIFBTX0hJTlRfRkxBR19HSE9TVCAgKQotI2RlZmluZSBwc19oaW50X2lzX2JvdHRvbSggeCApICAoICh4KS0+ZmxhZ3MgJiBQU19ISU5UX0ZMQUdfQk9UVE9NICkKLQotCi0gIC8qIGhpbnRzIHRhYmxlIGRlc2NyaXB0b3IgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0hpbnRfVGFibGVSZWNfCi0gIHsKLSAgICBGVF9VSW50ICBudW1faGludHM7Ci0gICAgRlRfVUludCAgbWF4X2hpbnRzOwotICAgIFBTX0hpbnQgIGhpbnRzOwotCi0gIH0gUFNfSGludF9UYWJsZVJlYywgKlBTX0hpbnRfVGFibGU7Ci0KLQotICAvKiBoaW50IGFuZCBjb3VudGVyIG1hc2sgZGVzY3JpcHRvciAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfTWFza1JlY18KLSAgewotICAgIEZUX1VJbnQgICBudW1fYml0czsKLSAgICBGVF9VSW50ICAgbWF4X2JpdHM7Ci0gICAgRlRfQnl0ZSogIGJ5dGVzOwotICAgIEZUX1VJbnQgICBlbmRfcG9pbnQ7Ci0KLSAgfSBQU19NYXNrUmVjLCAqUFNfTWFzazsKLQotCi0gIC8qIG1hc2tzIGFuZCBjb3VudGVycyB0YWJsZSBkZXNjcmlwdG9yICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19NYXNrX1RhYmxlUmVjXwotICB7Ci0gICAgRlRfVUludCAgbnVtX21hc2tzOwotICAgIEZUX1VJbnQgIG1heF9tYXNrczsKLSAgICBQU19NYXNrICBtYXNrczsKLQotICB9IFBTX01hc2tfVGFibGVSZWMsICpQU19NYXNrX1RhYmxlOwotCi0KLSAvKiBkaW1lbnNpb24tc3BlY2lmaWMgaGludHMgZGVzY3JpcHRvciAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfRGltZW5zaW9uUmVjXwotICB7Ci0gICAgUFNfSGludF9UYWJsZVJlYyAgaGludHM7Ci0gICAgUFNfTWFza19UYWJsZVJlYyAgbWFza3M7Ci0gICAgUFNfTWFza19UYWJsZVJlYyAgY291bnRlcnM7Ci0KLSAgfSBQU19EaW1lbnNpb25SZWMsICpQU19EaW1lbnNpb247Ci0KLQotICAvKiBnbHlwaCBoaW50cyBkZXNjcmlwdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBkaW1lbnNpb24gMCA9PiBYIGNvb3JkaW5hdGVzICsgdmVydGljYWwgaGludHMvc3RlbXMgICAqLwotICAvKiBkaW1lbnNpb24gMSA9PiBZIGNvb3JkaW5hdGVzICsgaG9yaXpvbnRhbCBoaW50cy9zdGVtcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfSGludHNSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIEZUX1VJbnQzMiAgICAgICAgbWFnaWM7Ci0gICAgUFNfSGludF9UeXBlICAgICBoaW50X3R5cGU7Ci0gICAgUFNfRGltZW5zaW9uUmVjICBkaW1lbnNpb25bMl07Ci0KLSAgfSBQU19IaW50c1JlYywgKlBTX0hpbnRzOwotCi0gIC8qICovCi0KLSAgLyogaW5pdGlhbGl6ZSBoaW50cyByZWNvcmRlciAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX2hpbnRzX2luaXQoIFBTX0hpbnRzICAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgLyogZmluYWxpemUgaGludHMgcmVjb3JkZXIgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19oaW50c19kb25lKCBQU19IaW50cyAgaGludHMgKTsKLQotICAvKiBpbml0aWFsaXplIFR5cGUxIGhpbnRzIHJlY29yZGVyIGludGVyZmFjZSAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHQxX2hpbnRzX2Z1bmNzX2luaXQoIFQxX0hpbnRzX0Z1bmNzUmVjKiAgZnVuY3MgKTsKLQotICAvKiBpbml0aWFsaXplIFR5cGUyIGhpbnRzIHJlY29yZGVyIGludGVyZmFjZSAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHQyX2hpbnRzX2Z1bmNzX2luaXQoIFQyX0hpbnRzX0Z1bmNzUmVjKiAgZnVuY3MgKTsKLQotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gIGV4dGVybiBQU19IaW50cyAgcHNfZGVidWdfaGludHM7Ci0gIGV4dGVybiAgaW50ICAgICAgcHNfZGVidWdfbm9faG9yel9oaW50czsKLSAgZXh0ZXJuICBpbnQgICAgICBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzOwotI2VuZGlmCi0KLSAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogUFNIUkVDX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcnVsZXMubWsgYi9zcmMvcHNoaW50ZXIvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZTY0MDQuLjAwMDAwMDAKLS0tIGEvc3JjL3BzaGludGVyL3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFBTSGludGVyIGRyaXZlciBjb25maWd1cmF0aW9uIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIFBTSElOVEVSIGRyaXZlciBkaXJlY3RvcnkKLSMKLVBTSElOVEVSX0RJUiA6PSAkKFNSQ19ESVIpL3BzaGludGVyCi0KLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotUFNISU5URVJfQ09NUElMRSA6PSAkKENDKSAkKEFOU0lGTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKFBTSElOVEVSX0RJUikpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAkKEZUX0NGTEFHUykKLQotCi0jIFBTSElOVEVSIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQotIwotUFNISU5URVJfRFJWX1NSQyA6PSAkKFBTSElOVEVSX0RJUikvcHNoYWxnby5jIFwKLSAgICAgICAgICAgICAgICAgICAgJChQU0hJTlRFUl9ESVIpL3BzaGdsb2IuYyBcCi0gICAgICAgICAgICAgICAgICAgICQoUFNISU5URVJfRElSKS9wc2htb2QuYyAgXAotICAgICAgICAgICAgICAgICAgICAkKFBTSElOVEVSX0RJUikvcHNocGljLmMgIFwKLSAgICAgICAgICAgICAgICAgICAgJChQU0hJTlRFUl9ESVIpL3BzaHJlYy5jCi0KLQotIyBQU0hJTlRFUiBkcml2ZXIgaGVhZGVycwotIwotUFNISU5URVJfRFJWX0ggOj0gJChQU0hJTlRFUl9EUlZfU1JDOiVjPSVoKSBcCi0gICAgICAgICAgICAgICAgICAkKFBTSElOVEVSX0RJUikvcHNobnRlcnIuaAotCi0KLSMgUFNISU5URVIgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIFBTSElOVEVSX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcy4KLSMgICBQU0hJTlRFUl9EUlZfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHNpbmdsZScgYnVpbGRzLgotIwotUFNISU5URVJfRFJWX09CSl9NIDo9ICQoUFNISU5URVJfRFJWX1NSQzokKFBTSElOVEVSX0RJUikvJS5jPSQoT0JKX0RJUikvJS4kTykKLVBTSElOVEVSX0RSVl9PQkpfUyA6PSAkKE9CSl9ESVIpL3BzaGludGVyLiRPCi0KLSMgUFNISU5URVIgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLVBTSElOVEVSX0RSVl9TUkNfUyA6PSAkKFBTSElOVEVSX0RJUikvcHNoaW50ZXIuYwotCi0KLSMgUFNISU5URVIgZHJpdmVyIC0gc2luZ2xlIG9iamVjdAotIwotJChQU0hJTlRFUl9EUlZfT0JKX1MpOiAkKFBTSElOVEVSX0RSVl9TUkNfUykgJChQU0hJTlRFUl9EUlZfU1JDKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICQoRlJFRVRZUEVfSCkgJChQU0hJTlRFUl9EUlZfSCkKLQkkKFBTSElOVEVSX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKFBTSElOVEVSX0RSVl9TUkNfUykpCi0KLQotIyBQU0hJTlRFUiBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCi0jCi0kKE9CSl9ESVIpLyUuJE86ICQoUFNISU5URVJfRElSKS8lLmMgJChGUkVFVFlQRV9IKSAkKFBTSElOVEVSX0RSVl9IKQotCSQoUFNISU5URVJfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQ8KQotCi0KLSMgdXBkYXRlIG1haW4gZHJpdmVyIG9iamVjdCBsaXN0cwotIwotRFJWX09CSlNfUyArPSAkKFBTSElOVEVSX0RSVl9PQkpfUykKLURSVl9PQkpTX00gKz0gJChQU0hJTlRFUl9EUlZfT0JKX00pCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL0phbWZpbGUgYi9zcmMvcHNuYW1lcy9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTZlMmMwLi4wMDAwMDAwCi0tLSBhL3NyYy9wc25hbWVzL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3BzbmFtZXMgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHBzbmFtZXMgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IHBzbW9kdWxlCi0gICAgICAgICAgICAgICBwc3BpYwotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gcHNuYW1lcyA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9wc25hbWVzIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL21vZHVsZS5tayBiL3NyYy9wc25hbWVzL21vZHVsZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkMjI5Ni4uMDAwMDAwMAotLS0gYS9zcmMvcHNuYW1lcy9tb2R1bGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgUFNuYW1lcyBtb2R1bGUgZGVmaW5pdGlvbgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotRlRNT0RVTEVfSF9DT01NQU5EUyArPSBQU05BTUVTX01PRFVMRQotCi1kZWZpbmUgUFNOQU1FU19NT0RVTEUKLSQoT1BFTl9EUklWRVIpIEZUX01vZHVsZV9DbGFzcywgcHNuYW1lc19tb2R1bGVfY2xhc3MgJChDTE9TRV9EUklWRVIpCi0kKEVDSE9fRFJJVkVSKXBzbmFtZXMgICAkKEVDSE9fRFJJVkVSX0RFU0MpUG9zdHNjcmlwdCAmIFVuaWNvZGUgR2x5cGggbmFtZSBoYW5kbGluZyQoRUNIT19EUklWRVJfRE9ORSkKLWVuZGVmCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvcHNuYW1lcy9wc21vZHVsZS5jIGIvc3JjL3BzbmFtZXMvcHNtb2R1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmOGNiOS4uMDAwMDAwMAotLS0gYS9zcmMvcHNuYW1lcy9wc21vZHVsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzbW9kdWxlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQU05hbWVzIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0KLSNpbmNsdWRlICJwc21vZHVsZS5oIgotCi0jaW5jbHVkZSAicHN0YWJsZXMuaCIKLSNkZWZpbmUgIERFRklORV9QU19UQUJMRVMKLSNpbmNsdWRlICJwc3RhYmxlcy5oIgotCi0jaW5jbHVkZSAicHNuYW1lcnIuaCIKLSNpbmNsdWRlICJwc3BpYy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUCi0KLQotI2RlZmluZSBWQVJJQU5UX0JJVCAgICAgICAgIDB4ODAwMDAwMDBVTAotI2RlZmluZSBCQVNFX0dMWVBIKCBjb2RlICkgICggKEZUX1VJbnQzMikoIChjb2RlKSAmIH5WQVJJQU5UX0JJVCApICkKLQotCi0gIC8qIFJldHVybiB0aGUgVW5pY29kZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gZ2x5cGguICBOb3RlIHRoYXQgKi8KLSAgLyogd2UgZG8gZGVhbCB3aXRoIGdseXBoIHZhcmlhbnRzIGJ5IGRldGVjdGluZyBhIG5vbi1pbml0aWFsIGRvdCBpbiAgICAqLwotICAvKiB0aGUgbmFtZSwgYXMgaW4gYEEuc3dhc2gnIG9yIGBlLmZpbmFsJzsgaW4gdGhpcyBjYXNlLCB0aGUgICAgICAgICAgICovCi0gIC8qIFZBUklBTlRfQklUIGlzIHNldCBpbiB0aGUgcmV0dXJuIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfVUludDMyCi0gIHBzX3VuaWNvZGVfdmFsdWUoIGNvbnN0IGNoYXIqICBnbHlwaF9uYW1lICkKLSAgewotICAgIC8qIElmIHRoZSBuYW1lIGJlZ2lucyB3aXRoIGB1bmknLCB0aGVuIHRoZSBnbHlwaCBuYW1lIG1heSBiZSBhICovCi0gICAgLyogaGFyZC1jb2RlZCB1bmljb2RlIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGdseXBoX25hbWVbMF0gPT0gJ3UnICYmCi0gICAgICAgICBnbHlwaF9uYW1lWzFdID09ICduJyAmJgotICAgICAgICAgZ2x5cGhfbmFtZVsyXSA9PSAnaScgKQotICAgIHsKLSAgICAgIC8qIGRldGVybWluZSB3aGV0aGVyIHRoZSBuZXh0IGZvdXIgY2hhcmFjdGVycyBmb2xsb3dpbmcgYXJlICovCi0gICAgICAvKiBoZXhhZGVjaW1hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBYWFg6IEFkZCBjb2RlIHRvIGRlYWwgd2l0aCBsaWdhdHVyZXMsIGkuZS4gZ2x5cGggbmFtZXMgbGlrZSAqLwotICAgICAgLyogICAgICBgdW5pWFhYWFlZWVlaWlpaJy4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgRlRfSW50ICAgICAgIGNvdW50OwotICAgICAgRlRfVUludDMyICAgIHZhbHVlID0gMDsKLSAgICAgIGNvbnN0IGNoYXIqICBwICAgICA9IGdseXBoX25hbWUgKyAzOwotCi0KLSAgICAgIGZvciAoIGNvdW50ID0gNDsgY291bnQgPiAwOyBjb3VudC0tLCBwKysgKQotICAgICAgewotICAgICAgICBjaGFyICAgICAgICAgIGMgPSAqcDsKLSAgICAgICAgdW5zaWduZWQgaW50ICBkOwotCi0KLSAgICAgICAgZCA9ICh1bnNpZ25lZCBjaGFyKWMgLSAnMCc7Ci0gICAgICAgIGlmICggZCA+PSAxMCApCi0gICAgICAgIHsKLSAgICAgICAgICBkID0gKHVuc2lnbmVkIGNoYXIpYyAtICdBJzsKLSAgICAgICAgICBpZiAoIGQgPj0gNiApCi0gICAgICAgICAgICBkID0gMTY7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZCArPSAxMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEV4aXQgaWYgYSBub24tdXBwZXJjYXNlIGhleGFkZWNpbWFsIGNoYXJhY3RlciB3YXMgZm91bmQgICAqLwotICAgICAgICAvKiAtLSB0aGlzIGFsc28gY2F0Y2hlcyBjaGFyYWN0ZXIgY29kZXMgYmVsb3cgYDAnIHNpbmNlIHN1Y2ggKi8KLSAgICAgICAgLyogbmVnYXRpdmUgbnVtYmVycyBjYXN0IHRvIGB1bnNpZ25lZCBpbnQnIGFyZSBmYXIgdG9vIGJpZy4gICovCi0gICAgICAgIGlmICggZCA+PSAxNiApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgdmFsdWUgPSAoIHZhbHVlIDw8IDQgKSArIGQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRoZXJlIG11c3QgYmUgZXhhY3RseSBmb3VyIGhleCBkaWdpdHMgKi8KLSAgICAgIGlmICggY291bnQgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnAgPT0gJ1wwJyApCi0gICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICBpZiAoICpwID09ICcuJyApCi0gICAgICAgICAgcmV0dXJuIChGVF9VSW50MzIpKCB2YWx1ZSB8IFZBUklBTlRfQklUICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgdGhlIG5hbWUgYmVnaW5zIHdpdGggYHUnLCBmb2xsb3dlZCBieSBmb3VyIHRvIHNpeCB1cHBlcmNhc2UgKi8KLSAgICAvKiBoZXhhZGVjaW1hbCBkaWdpdHMsIGl0IGlzIGEgaGFyZC1jb2RlZCB1bmljb2RlIGNoYXJhY3RlciBjb2RlLiAqLwotICAgIGlmICggZ2x5cGhfbmFtZVswXSA9PSAndScgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICAgICBjb3VudDsKLSAgICAgIEZUX1VJbnQzMiAgICB2YWx1ZSA9IDA7Ci0gICAgICBjb25zdCBjaGFyKiAgcCAgICAgPSBnbHlwaF9uYW1lICsgMTsKLQotCi0gICAgICBmb3IgKCBjb3VudCA9IDY7IGNvdW50ID4gMDsgY291bnQtLSwgcCsrICkKLSAgICAgIHsKLSAgICAgICAgY2hhciAgICAgICAgICBjID0gKnA7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgZDsKLQotCi0gICAgICAgIGQgPSAodW5zaWduZWQgY2hhciljIC0gJzAnOwotICAgICAgICBpZiAoIGQgPj0gMTAgKQotICAgICAgICB7Ci0gICAgICAgICAgZCA9ICh1bnNpZ25lZCBjaGFyKWMgLSAnQSc7Ci0gICAgICAgICAgaWYgKCBkID49IDYgKQotICAgICAgICAgICAgZCA9IDE2OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGQgKz0gMTA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGQgPj0gMTYgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHZhbHVlID0gKCB2YWx1ZSA8PCA0ICkgKyBkOwotICAgICAgfQotCi0gICAgICBpZiAoIGNvdW50IDw9IDIgKQotICAgICAgewotICAgICAgICBpZiAoICpwID09ICdcMCcgKQotICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgaWYgKCAqcCA9PSAnLicgKQotICAgICAgICAgIHJldHVybiAoRlRfVUludDMyKSggdmFsdWUgfCBWQVJJQU5UX0JJVCApOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIExvb2sgZm9yIGEgbm9uLWluaXRpYWwgZG90IGluIHRoZSBnbHlwaCBuYW1lIGluIG9yZGVyIHRvICovCi0gICAgLyogZmluZCB2YXJpYW50cyBsaWtlIGBBLnN3YXNoJywgYGUuZmluYWwnLCBldGMuICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBjb25zdCBjaGFyKiAgcCAgID0gZ2x5cGhfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIqICBkb3QgPSBOVUxMOwotCi0KLSAgICAgIGZvciAoIDsgKnA7IHArKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnAgPT0gJy4nICYmIHAgPiBnbHlwaF9uYW1lICkKLSAgICAgICAgewotICAgICAgICAgIGRvdCA9IHA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogbm93IGxvb2sgdXAgdGhlIGdseXBoIGluIHRoZSBBZG9iZSBHbHlwaCBMaXN0ICovCi0gICAgICBpZiAoICFkb3QgKQotICAgICAgICByZXR1cm4gKEZUX1VJbnQzMilmdF9nZXRfYWRvYmVfZ2x5cGhfaW5kZXgoIGdseXBoX25hbWUsIHAgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIChGVF9VSW50MzIpKCBmdF9nZXRfYWRvYmVfZ2x5cGhfaW5kZXgoIGdseXBoX25hbWUsIGRvdCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQU5UX0JJVCApOwotICAgIH0KLSAgfQotCi0KLSAgLyogZnRfcXNvcnQgY2FsbGJhY2sgdG8gc29ydCB0aGUgdW5pY29kZSBtYXAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQotICBjb21wYXJlX3VuaV9tYXBzKCBjb25zdCB2b2lkKiAgYSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIGIgKQotICB7Ci0gICAgUFNfVW5pTWFwKiAgbWFwMSA9IChQU19VbmlNYXAqKWE7Ci0gICAgUFNfVW5pTWFwKiAgbWFwMiA9IChQU19VbmlNYXAqKWI7Ci0gICAgRlRfVUludDMyICAgdW5pY29kZTEgPSBCQVNFX0dMWVBIKCBtYXAxLT51bmljb2RlICk7Ci0gICAgRlRfVUludDMyICAgdW5pY29kZTIgPSBCQVNFX0dMWVBIKCBtYXAyLT51bmljb2RlICk7Ci0KLQotICAgIC8qIHNvcnQgYmFzZSBnbHlwaHMgYmVmb3JlIGdseXBoIHZhcmlhbnRzICovCi0gICAgaWYgKCB1bmljb2RlMSA9PSB1bmljb2RlMiApCi0gICAgewotICAgICAgaWYgKCBtYXAxLT51bmljb2RlID4gbWFwMi0+dW5pY29kZSApCi0gICAgICAgIHJldHVybiAxOwotICAgICAgZWxzZSBpZiAoIG1hcDEtPnVuaWNvZGUgPCBtYXAyLT51bmljb2RlICkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggdW5pY29kZTEgPiB1bmljb2RlMiApCi0gICAgICAgIHJldHVybiAxOwotICAgICAgZWxzZSBpZiAoIHVuaWNvZGUxIDwgdW5pY29kZTIgKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0KLSAgLyogc3VwcG9ydCBmb3IgZXh0cmEgZ2x5cGhzIG5vdCBoYW5kbGVkICh3ZWxsKSBpbiBBR0w7ICovCi0gIC8qIHdlIGFkZCBleHRyYSBtYXBwaW5ncyBmb3IgdGhlbSBpZiBuZWNlc3NhcnkgICAgICAgICAqLwotCi0jZGVmaW5lIEVYVFJBX0dMWVBIX0xJU1RfU0laRSAgMTAKLQotICBzdGF0aWMgY29uc3QgRlRfVUludDMyICBmdF9leHRyYV9nbHlwaF91bmljb2Rlc1tFWFRSQV9HTFlQSF9MSVNUX1NJWkVdID0KLSAgewotICAgIC8qIFdHTCA0ICovCi0gICAgMHgwMzk0LAotICAgIDB4MDNBOSwKLSAgICAweDIyMTUsCi0gICAgMHgwMEFELAotICAgIDB4MDJDOSwKLSAgICAweDAzQkMsCi0gICAgMHgyMjE5LAotICAgIDB4MDBBMCwKLSAgICAvKiBSb21hbmlhbiAqLwotICAgIDB4MDIxQSwKLSAgICAweDAyMUIKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgY2hhciAgZnRfZXh0cmFfZ2x5cGhfbmFtZXNbXSA9Ci0gIHsKLSAgICAnRCcsJ2UnLCdsJywndCcsJ2EnLDAsCi0gICAgJ08nLCdtJywnZScsJ2cnLCdhJywwLAotICAgICdmJywncicsJ2EnLCdjJywndCcsJ2knLCdvJywnbicsMCwKLSAgICAnaCcsJ3knLCdwJywnaCcsJ2UnLCduJywwLAotICAgICdtJywnYScsJ2MnLCdyJywnbycsJ24nLDAsCi0gICAgJ20nLCd1JywwLAotICAgICdwJywnZScsJ3InLCdpJywnbycsJ2QnLCdjJywnZScsJ24nLCd0JywnZScsJ3InLCdlJywnZCcsMCwKLSAgICAncycsJ3AnLCdhJywnYycsJ2UnLDAsCi0gICAgJ1QnLCdjJywnbycsJ20nLCdtJywnYScsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsMCwKLSAgICAndCcsJ2MnLCdvJywnbScsJ20nLCdhJywnYScsJ2MnLCdjJywnZScsJ24nLCd0JywwCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX0ludAotICBmdF9leHRyYV9nbHlwaF9uYW1lX29mZnNldHNbRVhUUkFfR0xZUEhfTElTVF9TSVpFXSA9Ci0gIHsKLSAgICAgMCwKLSAgICAgNiwKLSAgICAxMiwKLSAgICAyMSwKLSAgICAyOCwKLSAgICAzNSwKLSAgICAzOCwKLSAgICA1MywKLSAgICA1OSwKLSAgICA3MgotICB9OwotCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNfY2hlY2tfZXh0cmFfZ2x5cGhfbmFtZSggY29uc3QgY2hhciogIGduYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQqICAgICBleHRyYV9nbHlwaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICpzdGF0ZXMgKQotICB7Ci0gICAgRlRfVUludCAgbjsKLQotCi0gICAgZm9yICggbiA9IDA7IG4gPCBFWFRSQV9HTFlQSF9MSVNUX1NJWkU7IG4rKyApCi0gICAgewotICAgICAgaWYgKCBmdF9zdHJjbXAoIGZ0X2V4dHJhX2dseXBoX25hbWVzICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ0X2V4dHJhX2dseXBoX25hbWVfb2Zmc2V0c1tuXSwgZ25hbWUgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzdGF0ZXNbbl0gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtYXJrIHRoaXMgZXh0cmEgZ2x5cGggYXMgYSBjYW5kaWRhdGUgZm9yIHRoZSBjbWFwICovCi0gICAgICAgICAgc3RhdGVzW25dICAgICA9IDE7Ci0gICAgICAgICAgZXh0cmFfZ2x5cGhzW25dID0gZ2x5cGg7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwc19jaGVja19leHRyYV9nbHlwaF91bmljb2RlKCBGVF9VSW50MzIgIHVuaV9jaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKnN0YXRlcyApCi0gIHsKLSAgICBGVF9VSW50ICBuOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IEVYVFJBX0dMWVBIX0xJU1RfU0laRTsgbisrICkKLSAgICB7Ci0gICAgICBpZiAoIHVuaV9jaGFyID09IGZ0X2V4dHJhX2dseXBoX3VuaWNvZGVzW25dICkKLSAgICAgIHsKLSAgICAgICAgLyogZGlzYWJsZSB0aGlzIGV4dHJhIGdseXBoIGZyb20gYmVpbmcgYWRkZWQgdG8gdGhlIGNtYXAgKi8KLSAgICAgICAgc3RhdGVzW25dID0gMjsKLQotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBCdWlsZCBhIHRhYmxlIHRoYXQgbWFwcyBVbmljb2RlIHZhbHVlcyB0byBnbHlwaCBpbmRpY2VzLiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfdW5pY29kZXNfaW5pdCggRlRfTWVtb3J5ICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgUFNfVW5pY29kZXMgICAgICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgUFNfR2V0R2x5cGhOYW1lRnVuYyAgIGdldF9nbHlwaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICBQU19GcmVlR2x5cGhOYW1lRnVuYyAgZnJlZV9nbHlwaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgICAgICAgZ2x5cGhfZGF0YSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICBGVF9VSW50ICBleHRyYV9nbHlwaF9saXN0X3N0YXRlc1tdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICAgRlRfVUludCAgZXh0cmFfZ2x5cGhzW0VYVFJBX0dMWVBIX0xJU1RfU0laRV07Ci0KLQotICAgIC8qIHdlIGZpcnN0IGFsbG9jYXRlIHRoZSB0YWJsZSAqLwotICAgIHRhYmxlLT5udW1fbWFwcyA9IDA7Ci0gICAgdGFibGUtPm1hcHMgICAgID0gTlVMTDsKLQotICAgIGlmICggIUZUX05FV19BUlJBWSggdGFibGUtPm1hcHMsIG51bV9nbHlwaHMgKyBFWFRSQV9HTFlQSF9MSVNUX1NJWkUgKSApCi0gICAgewotICAgICAgRlRfVUludCAgICAgbjsKLSAgICAgIEZUX1VJbnQgICAgIGNvdW50OwotICAgICAgUFNfVW5pTWFwKiAgbWFwOwotICAgICAgRlRfVUludDMyICAgdW5pX2NoYXI7Ci0KLQotICAgICAgbWFwID0gdGFibGUtPm1hcHM7Ci0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2dseXBoczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogIGduYW1lID0gZ2V0X2dseXBoX25hbWUoIGdseXBoX2RhdGEsIG4gKTsKLQotCi0gICAgICAgIGlmICggZ25hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgcHNfY2hlY2tfZXh0cmFfZ2x5cGhfbmFtZSggZ25hbWUsIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfZ2x5cGhzLCBleHRyYV9nbHlwaF9saXN0X3N0YXRlcyApOwotICAgICAgICAgIHVuaV9jaGFyID0gcHNfdW5pY29kZV92YWx1ZSggZ25hbWUgKTsKLQotICAgICAgICAgIGlmICggQkFTRV9HTFlQSCggdW5pX2NoYXIgKSAhPSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwc19jaGVja19leHRyYV9nbHlwaF91bmljb2RlKCB1bmlfY2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2dseXBoX2xpc3Rfc3RhdGVzICk7Ci0gICAgICAgICAgICBtYXAtPnVuaWNvZGUgICAgID0gdW5pX2NoYXI7Ci0gICAgICAgICAgICBtYXAtPmdseXBoX2luZGV4ID0gbjsKLSAgICAgICAgICAgIG1hcCsrOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggZnJlZV9nbHlwaF9uYW1lICkKLSAgICAgICAgICAgIGZyZWVfZ2x5cGhfbmFtZSggZ2x5cGhfZGF0YSwgZ25hbWUgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IEVYVFJBX0dMWVBIX0xJU1RfU0laRTsgbisrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleHRyYV9nbHlwaF9saXN0X3N0YXRlc1tuXSA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgIC8qIFRoaXMgZ2x5cGggbmFtZSBoYXMgYW4gYWRkaXRpb25hbCByZXByZXNlbnRhdGlvbi4gKi8KLSAgICAgICAgICAvKiBBZGQgaXQgdG8gdGhlIGNtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICBtYXAtPnVuaWNvZGUgICAgID0gZnRfZXh0cmFfZ2x5cGhfdW5pY29kZXNbbl07Ci0gICAgICAgICAgbWFwLT5nbHlwaF9pbmRleCA9IGV4dHJhX2dseXBoc1tuXTsKLSAgICAgICAgICBtYXArKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBub3cgY29tcHJlc3MgdGhlIHRhYmxlIGEgYml0ICovCi0gICAgICBjb3VudCA9IChGVF9VSW50KSggbWFwIC0gdGFibGUtPm1hcHMgKTsKLQotICAgICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogTm8gdW5pY29kZSBjaGFycyBoZXJlISAqLwotICAgICAgICBGVF9GUkVFKCB0YWJsZS0+bWFwcyApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggTm9fVW5pY29kZV9HbHlwaF9OYW1lICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIFJlYWxsb2NhdGUgaWYgdGhlIG51bWJlciBvZiB1c2VkIGVudHJpZXMgaXMgbXVjaCBzbWFsbGVyLiAqLwotICAgICAgICBpZiAoIGNvdW50IDwgbnVtX2dseXBocyAvIDIgKQotICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpRlRfUkVORVdfQVJSQVkoIHRhYmxlLT5tYXBzLCBudW1fZ2x5cGhzLCBjb3VudCApOwotICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU29ydCB0aGUgdGFibGUgaW4gaW5jcmVhc2luZyBvcmRlciBvZiB1bmljb2RlIHZhbHVlcywgKi8KLSAgICAgICAgLyogdGFraW5nIGNhcmUgb2YgZ2x5cGggdmFyaWFudHMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgZnRfcXNvcnQoIHRhYmxlLT5tYXBzLCBjb3VudCwgc2l6ZW9mICggUFNfVW5pTWFwICksCi0gICAgICAgICAgICAgICAgICBjb21wYXJlX3VuaV9tYXBzICk7Ci0gICAgICB9Ci0KLSAgICAgIHRhYmxlLT5udW1fbWFwcyA9IGNvdW50OwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgcHNfdW5pY29kZXNfY2hhcl9pbmRleCggUFNfVW5pY29kZXMgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgdW5pY29kZSApCi0gIHsKLSAgICBQU19VbmlNYXAgICptaW4sICptYXgsICptaWQsICpyZXN1bHQgPSBOVUxMOwotCi0KLSAgICAvKiBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBvbiB0aGUgdGFibGUuICovCi0KLSAgICBtaW4gPSB0YWJsZS0+bWFwczsKLSAgICBtYXggPSBtaW4gKyB0YWJsZS0+bnVtX21hcHMgLSAxOwotCi0gICAgd2hpbGUgKCBtaW4gPD0gbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIGJhc2VfZ2x5cGg7Ci0KLQotICAgICAgbWlkID0gbWluICsgKCAoIG1heCAtIG1pbiApID4+IDEgKTsKLQotICAgICAgaWYgKCBtaWQtPnVuaWNvZGUgPT0gdW5pY29kZSApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG1pZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGJhc2VfZ2x5cGggPSBCQVNFX0dMWVBIKCBtaWQtPnVuaWNvZGUgKTsKLQotICAgICAgaWYgKCBiYXNlX2dseXBoID09IHVuaWNvZGUgKQotICAgICAgICByZXN1bHQgPSBtaWQ7IC8qIHJlbWVtYmVyIG1hdGNoIGJ1dCBjb250aW51ZSBzZWFyY2ggZm9yIGJhc2UgZ2x5cGggKi8KLQotICAgICAgaWYgKCBtaW4gPT0gbWF4ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggYmFzZV9nbHlwaCA8IHVuaWNvZGUgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICBtYXggPSBtaWQgLSAxOwotICAgIH0KLQotICAgIGlmICggcmVzdWx0ICkKLSAgICAgIHJldHVybiByZXN1bHQtPmdseXBoX2luZGV4OwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludDMyCi0gIHBzX3VuaWNvZGVzX2NoYXJfbmV4dCggUFNfVW5pY29kZXMgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICp1bmljb2RlICkKLSAgewotICAgIEZUX1VJbnQgICAgcmVzdWx0ICAgID0gMDsKLSAgICBGVF9VSW50MzIgIGNoYXJfY29kZSA9ICp1bmljb2RlICsgMTsKLQotCi0gICAgewotICAgICAgRlRfVUludCAgICAgbWluID0gMDsKLSAgICAgIEZUX1VJbnQgICAgIG1heCA9IHRhYmxlLT5udW1fbWFwczsKLSAgICAgIEZUX1VJbnQgICAgIG1pZDsKLSAgICAgIFBTX1VuaU1hcCogIG1hcDsKLSAgICAgIEZUX1VJbnQzMiAgIGJhc2VfZ2x5cGg7Ci0KLQotICAgICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgICAgewotICAgICAgICBtaWQgPSBtaW4gKyAoICggbWF4IC0gbWluICkgPj4gMSApOwotICAgICAgICBtYXAgPSB0YWJsZS0+bWFwcyArIG1pZDsKLQotICAgICAgICBpZiAoIG1hcC0+dW5pY29kZSA9PSBjaGFyX2NvZGUgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbWFwLT5nbHlwaF9pbmRleDsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBiYXNlX2dseXBoID0gQkFTRV9HTFlQSCggbWFwLT51bmljb2RlICk7Ci0KLSAgICAgICAgaWYgKCBiYXNlX2dseXBoID09IGNoYXJfY29kZSApCi0gICAgICAgICAgcmVzdWx0ID0gbWFwLT5nbHlwaF9pbmRleDsKLQotICAgICAgICBpZiAoIGJhc2VfZ2x5cGggPCBjaGFyX2NvZGUgKQotICAgICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcmVzdWx0ICkKLSAgICAgICAgZ290byBFeGl0OyAgICAgICAgICAgICAgIC8qIHdlIGhhdmUgYSB2YXJpYW50IGdseXBoICovCi0KLSAgICAgIC8qIHdlIGRpZG4ndCBmaW5kIGl0OyBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBtYXAganVzdCBhYm92ZSBpdCAqLwotICAgICAgY2hhcl9jb2RlID0gMDsKLQotICAgICAgaWYgKCBtaW4gPCB0YWJsZS0+bnVtX21hcHMgKQotICAgICAgewotICAgICAgICBtYXAgICAgICAgPSB0YWJsZS0+bWFwcyArIG1pbjsKLSAgICAgICAgcmVzdWx0ICAgID0gbWFwLT5nbHlwaF9pbmRleDsKLSAgICAgICAgY2hhcl9jb2RlID0gQkFTRV9HTFlQSCggbWFwLT51bmljb2RlICk7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKnVuaWNvZGUgPSBjaGFyX2NvZGU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0FET0JFX0dMWVBIX0xJU1QgKi8KLQotCi0gIHN0YXRpYyBjb25zdCBjaGFyKgotICBwc19nZXRfbWFjaW50b3NoX25hbWUoIEZUX1VJbnQgIG5hbWVfaW5kZXggKQotICB7Ci0gICAgaWYgKCBuYW1lX2luZGV4ID49IEZUX05VTV9NQUNfTkFNRVMgKQotICAgICAgbmFtZV9pbmRleCA9IDA7Ci0KLSAgICByZXR1cm4gZnRfc3RhbmRhcmRfZ2x5cGhfbmFtZXMgKyBmdF9tYWNfbmFtZXNbbmFtZV9pbmRleF07Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBjaGFyKgotICBwc19nZXRfc3RhbmRhcmRfc3RyaW5ncyggRlRfVUludCAgc2lkICkKLSAgewotICAgIGlmICggc2lkID49IEZUX05VTV9TSURfTkFNRVMgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gZnRfc3RhbmRhcmRfZ2x5cGhfbmFtZXMgKyBmdF9zaWRfbmFtZXNbc2lkXTsKLSAgfQotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0FET0JFX0dMWVBIX0xJU1QKLQotICBGVF9ERUZJTkVfU0VSVklDRV9QU0NNQVBTUkVDKAotICAgIHBzY21hcHNfaW50ZXJmYWNlLAotCi0gICAgKFBTX1VuaWNvZGVfVmFsdWVGdW5jKSAgICAgcHNfdW5pY29kZV92YWx1ZSwgICAgICAgIC8qIHVuaWNvZGVfdmFsdWUgICAgICAgICAqLwotICAgIChQU19Vbmljb2Rlc19Jbml0RnVuYykgICAgIHBzX3VuaWNvZGVzX2luaXQsICAgICAgICAvKiB1bmljb2Rlc19pbml0ICAgICAgICAgKi8KLSAgICAoUFNfVW5pY29kZXNfQ2hhckluZGV4RnVuYylwc191bmljb2Rlc19jaGFyX2luZGV4LCAgLyogdW5pY29kZXNfY2hhcl9pbmRleCAgICovCi0gICAgKFBTX1VuaWNvZGVzX0NoYXJOZXh0RnVuYykgcHNfdW5pY29kZXNfY2hhcl9uZXh0LCAgIC8qIHVuaWNvZGVzX2NoYXJfbmV4dCAgICAqLwotCi0gICAgKFBTX01hY2ludG9zaF9OYW1lRnVuYykgICAgcHNfZ2V0X21hY2ludG9zaF9uYW1lLCAgIC8qIG1hY2ludG9zaF9uYW1lICAgICAgICAqLwotICAgIChQU19BZG9iZV9TdGRfU3RyaW5nc0Z1bmMpIHBzX2dldF9zdGFuZGFyZF9zdHJpbmdzLCAvKiBhZG9iZV9zdGRfc3RyaW5ncyAgICAgKi8KLQotICAgIHQxX3N0YW5kYXJkX2VuY29kaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZG9iZV9zdGRfZW5jb2RpbmcgICAgKi8KLSAgICB0MV9leHBlcnRfZW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRvYmVfZXhwZXJ0X2VuY29kaW5nICovCi0gICkKLQotI2Vsc2UKLQotICBGVF9ERUZJTkVfU0VSVklDRV9QU0NNQVBTUkVDKAotICAgIHBzY21hcHNfaW50ZXJmYWNlLAotCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuaWNvZGVfdmFsdWUgICAgICAgICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmljb2Rlc19pbml0ICAgICAgICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5pY29kZXNfY2hhcl9pbmRleCAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuaWNvZGVzX2NoYXJfbmV4dCAgICAqLwotCi0gICAgKFBTX01hY2ludG9zaF9OYW1lRnVuYykgICAgcHNfZ2V0X21hY2ludG9zaF9uYW1lLCAgIC8qIG1hY2ludG9zaF9uYW1lICAgICAgICAqLwotICAgIChQU19BZG9iZV9TdGRfU3RyaW5nc0Z1bmMpIHBzX2dldF9zdGFuZGFyZF9zdHJpbmdzLCAvKiBhZG9iZV9zdGRfc3RyaW5ncyAgICAgKi8KLQotICAgIHQxX3N0YW5kYXJkX2VuY29kaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZG9iZV9zdGRfZW5jb2RpbmcgICAgKi8KLSAgICB0MV9leHBlcnRfZW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRvYmVfZXhwZXJ0X2VuY29kaW5nICovCi0gICkKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVCAqLwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMSgKLSAgICBwc2NtYXBzX3NlcnZpY2VzLAotCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0NNQVBTLCAmUFNDTUFQU19JTlRFUkZBQ0VfR0VUICkKLQotCi0gIHN0YXRpYyBGVF9Qb2ludGVyCi0gIHBzbmFtZXNfZ2V0X3NlcnZpY2UoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzZXJ2aWNlX2lkICkKLSAgewotICAgIC8qIFBTQ01BUFNfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0KLQotICAgIGlmICggIW1vZHVsZSApCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBQU0NNQVBTX1NFUlZJQ0VTX0dFVCwgc2VydmljZV9pZCApOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgKi8KLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotI2RlZmluZSBQVVRfUFNfTkFNRVNfU0VSVklDRSggYSApICBOVUxMCi0jZWxzZQotI2RlZmluZSBQVVRfUFNfTkFNRVNfU0VSVklDRSggYSApICBhCi0jZW5kaWYKLQotICBGVF9ERUZJTkVfTU9EVUxFKAotICAgIHBzbmFtZXNfbW9kdWxlX2NsYXNzLAotCi0gICAgMCwgIC8qIHRoaXMgaXMgbm90IGEgZm9udCBkcml2ZXIsIG5vciBhIHJlbmRlcmVyICovCi0gICAgc2l6ZW9mICggRlRfTW9kdWxlUmVjICksCi0KLSAgICAicHNuYW1lcyIsICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MTAwMDBMLCAgIC8qIGRyaXZlciB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyMDAwMEwsICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIgb3IgYWJvdmUgKi8KLQotICAgIFBVVF9QU19OQU1FU19TRVJWSUNFKAotICAgICAgKHZvaWQqKSZQU0NNQVBTX0lOVEVSRkFDRV9HRVQgKSwgICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlX2luaXQgICAqLwotICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGVfZG9uZSAgICovCi0gICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICBQVVRfUFNfTkFNRVNfU0VSVklDRSggcHNuYW1lc19nZXRfc2VydmljZSApIC8qIGdldF9pbnRlcmZhY2UgKi8KLSAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzbmFtZXMvcHNtb2R1bGUuaCBiL3NyYy9wc25hbWVzL3BzbW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODNiNzkuLjAwMDAwMDAKLS0tIGEvc3JjL3BzbmFtZXMvcHNtb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzbW9kdWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIFBTTmFtZXMgbW9kdWxlIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBQU01PRFVMRV9IXwotI2RlZmluZSBQU01PRFVMRV9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0RFQ0xBUkVfTU9EVUxFKCBwc25hbWVzX21vZHVsZV9jbGFzcyApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogUFNNT0RVTEVfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL3BzbmFtZXJyLmggYi9zcmMvcHNuYW1lcy9wc25hbWVyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTBiZjVlLi4wMDAwMDAwCi0tLSBhL3NyYy9wc25hbWVzL3BzbmFtZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc25hbWVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUFMgbmFtZXMgbW9kdWxlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTIG5hbWVzIG1vZHVsZSBlcnJvciBlbnVtZXJhdGlvbiAgICAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBQU05BTUVSUl9IXwotI2RlZmluZSBQU05BTUVSUl9IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBQU25hbWVzX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9QU25hbWVzCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBQU05BTUVSUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzbmFtZXMvcHNuYW1lcy5jIGIvc3JjL3BzbmFtZXMvcHNuYW1lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ2NmQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9wc25hbWVzL3BzbmFtZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzbmFtZXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQU05hbWVzIG1vZHVsZSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgInBzbW9kdWxlLmMiCi0jaW5jbHVkZSAicHNwaWMuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL3BzcGljLmMgYi9zcmMvcHNuYW1lcy9wc3BpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjkwMDM0Li4wMDAwMDAwCi0tLSBhL3NyYy9wc25hbWVzL3BzcGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc3BpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHBzbmFtZXMgbW9kdWxlLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAicHNwaWMuaCIKLSNpbmNsdWRlICJwc25hbWVyci5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gcHNtb2R1bGUuYyAqLwotICBGVF9FcnJvcgotICBGVF9DcmVhdGVfQ2xhc3NfcHNjbWFwc19zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApOwotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfcHNjbWFwc19zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKTsKLQotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfcHNjbWFwc19pbnRlcmZhY2UoIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNDTWFwc1JlYyogIGNsYXp6ICk7Ci0KLQotICB2b2lkCi0gIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+cHNuYW1lcyApCi0gICAgewotICAgICAgUFNNb2R1bGVQSUMqICBjb250YWluZXIgPSAoUFNNb2R1bGVQSUMqKXBpY19jb250YWluZXItPnBzbmFtZXM7Ci0KLQotICAgICAgaWYgKCBjb250YWluZXItPnBzY21hcHNfc2VydmljZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX3BzY21hcHNfc2VydmljZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLT5wc2NtYXBzX3NlcnZpY2VzICk7Ci0gICAgICBjb250YWluZXItPnBzY21hcHNfc2VydmljZXMgPSBOVUxMOwotICAgICAgRlRfRlJFRSggY29udGFpbmVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5wc25hbWVzID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgUFNNb2R1bGVQSUMqICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+cHNuYW1lcyA9IGNvbnRhaW5lcjsKLQotICAgIC8qIGluaXRpYWxpemUgcG9pbnRlciB0YWJsZSAtICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHRoaXMgaXMgaG93IHRoZSBtb2R1bGUgdXN1YWxseSBleHBlY3RzIHRoaXMgZGF0YSAqLwotICAgIGVycm9yID0gRlRfQ3JlYXRlX0NsYXNzX3BzY21hcHNfc2VydmljZXMoCi0gICAgICAgICAgICAgIGxpYnJhcnksICZjb250YWluZXItPnBzY21hcHNfc2VydmljZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBGVF9Jbml0X0NsYXNzX3BzY21hcHNfaW50ZXJmYWNlKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXItPnBzY21hcHNfaW50ZXJmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNuYW1lcy9wc3BpYy5oIGIvc3JjL3BzbmFtZXMvcHNwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0OTdlNy4uMDAwMDAwMAotLS0gYS9zcmMvcHNuYW1lcy9wc3BpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBwc25hbWVzIG1vZHVsZS4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFBTUElDX0hfCi0jZGVmaW5lIFBTUElDX0hfCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgUFNDTUFQU19TRVJWSUNFU19HRVQgICBwc2NtYXBzX3NlcnZpY2VzCi0jZGVmaW5lIFBTQ01BUFNfSU5URVJGQUNFX0dFVCAgcHNjbWFwc19pbnRlcmZhY2UKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgUFNNb2R1bGVQSUNfCi0gIHsKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogICAgIHBzY21hcHNfc2VydmljZXM7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzUmVjICBwc2NtYXBzX2ludGVyZmFjZTsKLQotICB9IFBTTW9kdWxlUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKFBTTW9kdWxlUElDKikoKGxpYiktPnBpY19jb250YWluZXIucHNuYW1lcykgKQotI2RlZmluZSBQU0NNQVBTX1NFUlZJQ0VTX0dFVCAgICggR0VUX1BJQyggbGlicmFyeSApLT5wc2NtYXBzX3NlcnZpY2VzICkKLSNkZWZpbmUgUFNDTUFQU19JTlRFUkZBQ0VfR0VUICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+cHNjbWFwc19pbnRlcmZhY2UgKQotCi0KLSAgLyogc2VlIHBzcGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgcHNuYW1lc19tb2R1bGVfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotIC8qICovCi0KLSNlbmRpZiAvKiBQU1BJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaCBiL3NyYy9wc25hbWVzL3BzdGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjVlMzAuLjAwMDAwMDAKLS0tIGEvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHN0YWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSAtLSBkbyBub3QgZWRpdCEgKi8KLQotCi0jaWZuZGVmICBERUZJTkVfUFNfVEFCTEVTCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi0gIGV4dGVybiAiQyIKLSNlbHNlCi0gIGV4dGVybgotI2VuZGlmCi0jZW5kaWYKLSAgY29uc3QgY2hhciAgZnRfc3RhbmRhcmRfZ2x5cGhfbmFtZXNbMzY5Nl0KLSNpZmRlZiAgREVGSU5FX1BTX1RBQkxFUwotICA9Ci0gIHsKLSAgICAnLicsJ24nLCd1JywnbCcsJ2wnLCAwLAotICAgICduJywnbycsJ24nLCdtJywnYScsJ3InLCdrJywnaScsJ24nLCdnJywncicsJ2UnLCd0JywndScsJ3InLCduJywgMCwKLSAgICAnbicsJ28nLCd0JywnZScsJ3EnLCd1JywnYScsJ2wnLCAwLAotICAgICdpJywnbicsJ2YnLCdpJywnbicsJ2knLCd0JywneScsIDAsCi0gICAgJ2wnLCdlJywncycsJ3MnLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ2cnLCdyJywnZScsJ2EnLCd0JywnZScsJ3InLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ3QnLCdpJywnYScsJ2wnLCdkJywnaScsJ2YnLCdmJywgMCwKLSAgICAncycsJ3UnLCdtJywnbScsJ2EnLCd0JywnaScsJ28nLCduJywgMCwKLSAgICAncCcsJ3InLCdvJywnZCcsJ3UnLCdjJywndCcsIDAsCi0gICAgJ3AnLCdpJywgMCwKLSAgICAnaScsJ24nLCd0JywnZScsJ2cnLCdyJywnYScsJ2wnLCAwLAotICAgICdPJywnbScsJ2UnLCdnJywnYScsIDAsCi0gICAgJ3InLCdhJywnZCcsJ2knLCdjJywnYScsJ2wnLCAwLAotICAgICdhJywncCcsJ3AnLCdyJywnbycsJ3gnLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ0QnLCdlJywnbCcsJ3QnLCdhJywgMCwKLSAgICAnbicsJ28nLCduJywnYicsJ3InLCdlJywnYScsJ2snLCdpJywnbicsJ2cnLCdzJywncCcsJ2EnLCdjJywnZScsIDAsCi0gICAgJ2wnLCdvJywneicsJ2UnLCduJywnZycsJ2UnLCAwLAotICAgICdhJywncCcsJ3AnLCdsJywnZScsIDAsCi0gICAgJ2YnLCdyJywnYScsJ24nLCdjJywgMCwKLSAgICAnRycsJ2InLCdyJywnZScsJ3YnLCdlJywgMCwKLSAgICAnZycsJ2InLCdyJywnZScsJ3YnLCdlJywgMCwKLSAgICAnSScsJ2QnLCdvJywndCcsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsIDAsCi0gICAgJ1MnLCdjJywnZScsJ2QnLCdpJywnbCcsJ2wnLCdhJywgMCwKLSAgICAncycsJ2MnLCdlJywnZCcsJ2knLCdsJywnbCcsJ2EnLCAwLAotICAgICdDJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdjJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdDJywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdjJywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdkJywnYycsJ3InLCdvJywnYScsJ3QnLCAwLAotICAgICcuJywnbicsJ28nLCd0JywnZCcsJ2UnLCdmJywgMCwKLSAgICAncycsJ3AnLCdhJywnYycsJ2UnLCAwLAotICAgICdlJywneCcsJ2MnLCdsJywnYScsJ20nLCAwLAotICAgICdxJywndScsJ28nLCd0JywnZScsJ2QnLCdiJywnbCcsIDAsCi0gICAgJ24nLCd1JywnbScsJ2InLCdlJywncicsJ3MnLCdpJywnZycsJ24nLCAwLAotICAgICdkJywnbycsJ2wnLCdsJywnYScsJ3InLCAwLAotICAgICdwJywnZScsJ3InLCdjJywnZScsJ24nLCd0JywgMCwKLSAgICAnYScsJ20nLCdwJywnZScsJ3InLCdzJywnYScsJ24nLCdkJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywnbCcsJ2UnLCdmJywndCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywncicsJ2knLCdnJywnaCcsJ3QnLCAwLAotICAgICdhJywncycsJ3QnLCdlJywncicsJ2knLCdzJywnaycsIDAsCi0gICAgJ3AnLCdsJywndScsJ3MnLCAwLAotICAgICdjJywnbycsJ20nLCdtJywnYScsIDAsCi0gICAgJ2gnLCd5JywncCcsJ2gnLCdlJywnbicsIDAsCi0gICAgJ3AnLCdlJywncicsJ2knLCdvJywnZCcsIDAsCi0gICAgJ3MnLCdsJywnYScsJ3MnLCdoJywgMCwKLSAgICAneicsJ2UnLCdyJywnbycsIDAsCi0gICAgJ28nLCduJywnZScsIDAsCi0gICAgJ3QnLCd3JywnbycsIDAsCi0gICAgJ3QnLCdoJywncicsJ2UnLCdlJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsIDAsCi0gICAgJ2YnLCdpJywndicsJ2UnLCAwLAotICAgICdzJywnaScsJ3gnLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsIDAsCi0gICAgJ2UnLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnbicsJ2knLCduJywnZScsIDAsCi0gICAgJ2MnLCdvJywnbCcsJ28nLCduJywgMCwKLSAgICAncycsJ2UnLCdtJywnaScsJ2MnLCdvJywnbCcsJ28nLCduJywgMCwKLSAgICAnbCcsJ2UnLCdzJywncycsIDAsCi0gICAgJ2UnLCdxJywndScsJ2EnLCdsJywgMCwKLSAgICAnZycsJ3InLCdlJywnYScsJ3QnLCdlJywncicsIDAsCi0gICAgJ3EnLCd1JywnZScsJ3MnLCd0JywnaScsJ28nLCduJywgMCwKLSAgICAnYScsJ3QnLCAwLAotICAgICdBJywgMCwKLSAgICAnQicsIDAsCi0gICAgJ0MnLCAwLAotICAgICdEJywgMCwKLSAgICAnRScsIDAsCi0gICAgJ0YnLCAwLAotICAgICdHJywgMCwKLSAgICAnSCcsIDAsCi0gICAgJ0knLCAwLAotICAgICdKJywgMCwKLSAgICAnSycsIDAsCi0gICAgJ0wnLCAwLAotICAgICdNJywgMCwKLSAgICAnTicsIDAsCi0gICAgJ08nLCAwLAotICAgICdQJywgMCwKLSAgICAnUScsIDAsCi0gICAgJ1InLCAwLAotICAgICdTJywgMCwKLSAgICAnVCcsIDAsCi0gICAgJ1UnLCAwLAotICAgICdWJywgMCwKLSAgICAnVycsIDAsCi0gICAgJ1gnLCAwLAotICAgICdZJywgMCwKLSAgICAnWicsIDAsCi0gICAgJ2InLCdyJywnYScsJ2MnLCdrJywnZScsJ3QnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnYicsJ2EnLCdjJywnaycsJ3MnLCdsJywnYScsJ3MnLCdoJywgMCwKLSAgICAnYicsJ3InLCdhJywnYycsJ2snLCdlJywndCcsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnYScsJ3MnLCdjJywnaScsJ2knLCdjJywnaScsJ3InLCdjJywndScsJ20nLCAwLAotICAgICd1JywnbicsJ2QnLCdlJywncicsJ3MnLCdjJywnbycsJ3InLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnYScsIDAsCi0gICAgJ2InLCAwLAotICAgICdjJywgMCwKLSAgICAnZCcsIDAsCi0gICAgJ2UnLCAwLAotICAgICdmJywgMCwKLSAgICAnZycsIDAsCi0gICAgJ2gnLCAwLAotICAgICdpJywgMCwKLSAgICAnaicsIDAsCi0gICAgJ2snLCAwLAotICAgICdsJywgMCwKLSAgICAnbScsIDAsCi0gICAgJ24nLCAwLAotICAgICdvJywgMCwKLSAgICAncCcsIDAsCi0gICAgJ3EnLCAwLAotICAgICdyJywgMCwKLSAgICAncycsIDAsCi0gICAgJ3QnLCAwLAotICAgICd1JywgMCwKLSAgICAndicsIDAsCi0gICAgJ3cnLCAwLAotICAgICd4JywgMCwKLSAgICAneScsIDAsCi0gICAgJ3onLCAwLAotICAgICdiJywncicsJ2EnLCdjJywnZScsJ2wnLCdlJywnZicsJ3QnLCAwLAotICAgICdiJywnYScsJ3InLCAwLAotICAgICdiJywncicsJ2EnLCdjJywnZScsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnYScsJ3MnLCdjJywnaScsJ2knLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ2UnLCd4JywnYycsJ2wnLCdhJywnbScsJ2QnLCdvJywndycsJ24nLCAwLAotICAgICdjJywnZScsJ24nLCd0JywgMCwKLSAgICAncycsJ3QnLCdlJywncicsJ2wnLCdpJywnbicsJ2cnLCAwLAotICAgICdmJywncicsJ2EnLCdjJywndCcsJ2knLCdvJywnbicsIDAsCi0gICAgJ3knLCdlJywnbicsIDAsCi0gICAgJ2YnLCdsJywnbycsJ3InLCdpJywnbicsIDAsCi0gICAgJ3MnLCdlJywnYycsJ3QnLCdpJywnbycsJ24nLCAwLAotICAgICdjJywndScsJ3InLCdyJywnZScsJ24nLCdjJywneScsIDAsCi0gICAgJ3EnLCd1JywnbycsJ3QnLCdlJywncycsJ2knLCduJywnZycsJ2wnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnZycsJ3UnLCdpJywnbCcsJ2wnLCdlJywnbScsJ28nLCd0JywnbCcsJ2UnLCdmJywndCcsIDAsCi0gICAgJ2cnLCd1JywnaScsJ2wnLCdzJywnaScsJ24nLCdnJywnbCcsJ2wnLCdlJywnZicsJ3QnLCAwLAotICAgICdnJywndScsJ2knLCdsJywncycsJ2knLCduJywnZycsJ2wnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ2YnLCdpJywgMCwKLSAgICAnZicsJ2wnLCAwLAotICAgICdlJywnbicsJ2QnLCdhJywncycsJ2gnLCAwLAotICAgICdkJywnYScsJ2cnLCdnJywnZScsJ3InLCAwLAotICAgICdkJywnYScsJ2cnLCdnJywnZScsJ3InLCdkJywnYicsJ2wnLCAwLAotICAgICdwJywnZScsJ3InLCdpJywnbycsJ2QnLCdjJywnZScsJ24nLCd0JywnZScsJ3InLCdlJywnZCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2EnLCdnJywncicsJ2EnLCdwJywnaCcsIDAsCi0gICAgJ2InLCd1JywnbCcsJ2wnLCdlJywndCcsIDAsCi0gICAgJ3EnLCd1JywnbycsJ3QnLCdlJywncycsJ2knLCduJywnZycsJ2wnLCdiJywnYScsJ3MnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdiJywnYScsJ3MnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ2cnLCd1JywnaScsJ2wnLCdsJywnZScsJ20nLCdvJywndCcsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnZScsJ2wnLCdsJywnaScsJ3AnLCdzJywnaScsJ3MnLCAwLAotICAgICdwJywnZScsJ3InLCd0JywnaCcsJ28nLCd1JywncycsJ2EnLCduJywnZCcsIDAsCi0gICAgJ3EnLCd1JywnZScsJ3MnLCd0JywnaScsJ28nLCduJywnZCcsJ28nLCd3JywnbicsIDAsCi0gICAgJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdtJywnYScsJ2MnLCdyJywnbycsJ24nLCAwLAotICAgICdiJywncicsJ2UnLCd2JywnZScsIDAsCi0gICAgJ2QnLCdvJywndCcsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsIDAsCi0gICAgJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAncicsJ2knLCduJywnZycsIDAsCi0gICAgJ2MnLCdlJywnZCcsJ2knLCdsJywnbCcsJ2EnLCAwLAotICAgICdoJywndScsJ24nLCdnJywnYScsJ3InLCd1JywnbScsJ2wnLCdhJywndScsJ3QnLCAwLAotICAgICdvJywnZycsJ28nLCduJywnZScsJ2snLCAwLAotICAgICdjJywnYScsJ3InLCdvJywnbicsIDAsCi0gICAgJ2UnLCdtJywnZCcsJ2EnLCdzJywnaCcsIDAsCi0gICAgJ0EnLCdFJywgMCwKLSAgICAnbycsJ3InLCdkJywnZicsJ2UnLCdtJywnaScsJ24nLCdpJywnbicsJ2UnLCAwLAotICAgICdMJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdPJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdPJywnRScsIDAsCi0gICAgJ28nLCdyJywnZCcsJ20nLCdhJywncycsJ2MnLCd1JywnbCcsJ2knLCduJywnZScsIDAsCi0gICAgJ2EnLCdlJywgMCwKLSAgICAnZCcsJ28nLCd0JywnbCcsJ2UnLCdzJywncycsJ2knLCAwLAotICAgICdsJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdvJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdvJywnZScsIDAsCi0gICAgJ2cnLCdlJywncicsJ20nLCdhJywnbicsJ2QnLCdiJywnbCcsJ3MnLCAwLAotICAgICdvJywnbicsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2wnLCdvJywnZycsJ2knLCdjJywnYScsJ2wnLCduJywnbycsJ3QnLCAwLAotICAgICdtJywndScsIDAsCi0gICAgJ3QnLCdyJywnYScsJ2QnLCdlJywnbScsJ2EnLCdyJywnaycsIDAsCi0gICAgJ0UnLCd0JywnaCcsIDAsCi0gICAgJ28nLCduJywnZScsJ2gnLCdhJywnbCcsJ2YnLCAwLAotICAgICdwJywnbCcsJ3UnLCdzJywnbScsJ2knLCduJywndScsJ3MnLCAwLAotICAgICdUJywnaCcsJ28nLCdyJywnbicsIDAsCi0gICAgJ28nLCduJywnZScsJ3EnLCd1JywnYScsJ3InLCd0JywnZScsJ3InLCAwLAotICAgICdkJywnaScsJ3YnLCdpJywnZCcsJ2UnLCAwLAotICAgICdiJywncicsJ28nLCdrJywnZScsJ24nLCdiJywnYScsJ3InLCAwLAotICAgICdkJywnZScsJ2cnLCdyJywnZScsJ2UnLCAwLAotICAgICd0JywnaCcsJ28nLCdyJywnbicsIDAsCi0gICAgJ3QnLCdoJywncicsJ2UnLCdlJywncScsJ3UnLCdhJywncicsJ3QnLCdlJywncicsJ3MnLCAwLAotICAgICd0JywndycsJ28nLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3InLCdlJywnZycsJ2knLCdzJywndCcsJ2UnLCdyJywnZScsJ2QnLCAwLAotICAgICdtJywnaScsJ24nLCd1JywncycsIDAsCi0gICAgJ2UnLCd0JywnaCcsIDAsCi0gICAgJ20nLCd1JywnbCcsJ3QnLCdpJywncCcsJ2wnLCd5JywgMCwKLSAgICAndCcsJ2gnLCdyJywnZScsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2MnLCdvJywncCcsJ3knLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ0EnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ0EnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnQScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnQScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnQScsJ3InLCdpJywnbicsJ2cnLCAwLAotICAgICdBJywndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdDJywnYycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsIDAsCi0gICAgJ0UnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ0UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnRScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnRScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnSScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnSScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdJJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdJJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdOJywndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdPJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdPJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsIDAsCi0gICAgJ08nLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsIDAsCi0gICAgJ08nLCdnJywncicsJ2EnLCd2JywnZScsIDAsCi0gICAgJ08nLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ1MnLCdjJywnYScsJ3InLCdvJywnbicsIDAsCi0gICAgJ1UnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ1UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnVScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnVScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnWScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnWScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnWicsJ2MnLCdhJywncicsJ28nLCduJywgMCwKLSAgICAnYScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnYScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdhJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdhJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdhJywncicsJ2knLCduJywnZycsIDAsCi0gICAgJ2EnLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ2MnLCdjJywnZScsJ2QnLCdpJywnbCcsJ2wnLCdhJywgMCwKLSAgICAnZScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnZScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdlJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdlJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdpJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdpJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsIDAsCi0gICAgJ2knLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsIDAsCi0gICAgJ2knLCdnJywncicsJ2EnLCd2JywnZScsIDAsCi0gICAgJ24nLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ28nLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ28nLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnbycsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnbycsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnbycsJ3QnLCdpJywnbCcsJ2QnLCdlJywgMCwKLSAgICAncycsJ2MnLCdhJywncicsJ28nLCduJywgMCwKLSAgICAndScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAndScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICd1JywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICd1JywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICd5JywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICd5JywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICd6JywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdlJywneCcsJ2MnLCdsJywnYScsJ20nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0gnLCd1JywnbicsJ2cnLCdhJywncicsJ3UnLCdtJywnbCcsJ2EnLCd1JywndCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnZCcsJ28nLCdsJywnbCcsJ2EnLCdyJywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICdkJywnbycsJ2wnLCdsJywnYScsJ3InLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2EnLCdtJywncCcsJ2UnLCdyJywncycsJ2EnLCduJywnZCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywnbCcsJ2UnLCdmJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncCcsJ2EnLCdyJywnZScsJ24nLCdyJywnaScsJ2cnLCdoJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3cnLCdvJywnZCcsJ28nLCd0JywnZScsJ24nLCdsJywnZScsJ2EnLCdkJywnZScsJ3InLCAwLAotICAgICdvJywnbicsJ2UnLCdkJywnbycsJ3QnLCdlJywnbicsJ2wnLCdlJywnYScsJ2QnLCdlJywncicsIDAsCi0gICAgJ3onLCdlJywncicsJ28nLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ28nLCduJywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAndCcsJ3cnLCdvJywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAncycsJ2knLCd4JywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ2MnLCdvJywnbScsJ20nLCdhJywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ3EnLCd1JywnYScsJ3InLCd0JywnZScsJ3InLCdzJywnZScsJ20nLCdkJywnYScsJ3MnLCdoJywgMCwKLSAgICAncCcsJ2UnLCdyJywnaScsJ28nLCdkJywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdxJywndScsJ2UnLCdzJywndCcsJ2knLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnYScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnYicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnYycsJ2UnLCduJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnaScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2YnLCAwLAotICAgICdmJywnZicsJ2knLCAwLAotICAgICdmJywnZicsJ2wnLCAwLAotICAgICdwJywnYScsJ3InLCdlJywnbicsJ2wnLCdlJywnZicsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywncicsJ2knLCdnJywnaCcsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ0MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2gnLCd5JywncCcsJ2gnLCdlJywnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnRycsJ3InLCdhJywndicsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0InLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0QnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0YnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0knLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0onLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0snLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0wnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ00nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ04nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1AnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1EnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1InLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1QnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1YnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1onLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2MnLCdvJywnbCcsJ28nLCduJywnbScsJ28nLCduJywnZScsJ3QnLCdhJywncicsJ3knLCAwLAotICAgICdvJywnbicsJ2UnLCdmJywnaScsJ3QnLCd0JywnZScsJ2QnLCAwLAotICAgICdyJywndScsJ3AnLCdpJywnYScsJ2gnLCAwLAotICAgICdUJywnaScsJ2wnLCdkJywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnZScsJ3gnLCdjJywnbCcsJ2EnLCdtJywnZCcsJ28nLCd3JywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnYycsJ2UnLCduJywndCcsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnTCcsJ3MnLCdsJywnYScsJ3MnLCdoJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdTJywnYycsJ2EnLCdyJywnbycsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1onLCdjJywnYScsJ3InLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0InLCdyJywnZScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdDJywnYScsJ3InLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRCcsJ28nLCd0JywnYScsJ2MnLCdjJywnZScsJ24nLCd0JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdNJywnYScsJ2MnLCdyJywnbycsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2YnLCdpJywnZycsJ3UnLCdyJywnZScsJ2QnLCdhJywncycsJ2gnLCAwLAotICAgICdoJywneScsJ3AnLCdoJywnZScsJ24nLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ08nLCdnJywnbycsJ24nLCdlJywnaycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnUicsJ2knLCduJywnZycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAncScsJ3UnLCdlJywncycsJ3QnLCdpJywnbycsJ24nLCdkJywnbycsJ3cnLCduJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdvJywnbicsJ2UnLCdlJywnaScsJ2cnLCdoJywndCcsJ2gnLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ2UnLCdpJywnZycsJ2gnLCd0JywnaCcsJ3MnLCAwLAotICAgICdmJywnaScsJ3YnLCdlJywnZScsJ2knLCdnJywnaCcsJ3QnLCdoJywncycsIDAsCi0gICAgJ3MnLCdlJywndicsJ2UnLCduJywnZScsJ2knLCdnJywnaCcsJ3QnLCdoJywncycsIDAsCi0gICAgJ28nLCduJywnZScsJ3QnLCdoJywnaScsJ3InLCdkJywgMCwKLSAgICAndCcsJ3cnLCdvJywndCcsJ2gnLCdpJywncicsJ2QnLCdzJywgMCwKLSAgICAneicsJ2UnLCdyJywnbycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ2knLCd4JywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3onLCdlJywncicsJ28nLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ28nLCduJywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3cnLCdvJywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ2knLCd4JywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2MnLCdlJywnbicsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2QnLCdvJywnbCcsJ2wnLCdhJywncicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncCcsJ2UnLCdyJywnaScsJ28nLCdkJywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdjJywnbycsJ20nLCdtJywnYScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnQScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdBJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdBJywndCcsJ2knLCdsJywnZCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQScsJ3InLCdpJywnbicsJ2cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdFJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdDJywnYycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0knLCdnJywncicsJ2EnLCd2JywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnSScsJ2EnLCdjJywndScsJ3QnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdJJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnSScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywndCcsJ2gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ04nLCd0JywnaScsJ2wnLCdkJywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnTycsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdPJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdPJywndCcsJ2knLCdsJywnZCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnTycsJ0UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdzJywnbCcsJ2EnLCdzJywnaCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnVScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdVJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdVJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdhJywnYycsJ3UnLCd0JywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnVCcsJ2gnLCdvJywncicsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnMCcsJzAnLCcxJywnLicsJzAnLCcwJywnMCcsIDAsCi0gICAgJzAnLCcwJywnMScsJy4nLCcwJywnMCcsJzEnLCAwLAotICAgICcwJywnMCcsJzEnLCcuJywnMCcsJzAnLCcyJywgMCwKLSAgICAnMCcsJzAnLCcxJywnLicsJzAnLCcwJywnMycsIDAsCi0gICAgJ0InLCdsJywnYScsJ2MnLCdrJywgMCwKLSAgICAnQicsJ28nLCdsJywnZCcsIDAsCi0gICAgJ0InLCdvJywnbycsJ2snLCAwLAotICAgICdMJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ00nLCdlJywnZCcsJ2knLCd1JywnbScsIDAsCi0gICAgJ1InLCdlJywnZycsJ3UnLCdsJywnYScsJ3InLCAwLAotICAgICdSJywnbycsJ20nLCdhJywnbicsIDAsCi0gICAgJ1MnLCdlJywnbScsJ2knLCdiJywnbycsJ2wnLCdkJywgMCwKLSAgfQotI2VuZGlmIC8qIERFRklORV9QU19UQUJMRVMgKi8KLSAgOwotCi0KLSNkZWZpbmUgRlRfTlVNX01BQ19OQU1FUyAgMjU4Ci0KLSAgLyogVmFsdWVzIGFyZSBvZmZzZXRzIGludG8gdGhlIGBmdF9zdGFuZGFyZF9nbHlwaF9uYW1lcycgdGFibGUgKi8KLQotI2lmbmRlZiAgREVGSU5FX1BTX1RBQkxFUwotI2lmZGVmICBfX2NwbHVzcGx1cwotICBleHRlcm4gIkMiCi0jZWxzZQotICBleHRlcm4KLSNlbmRpZgotI2VuZGlmCi0gIGNvbnN0IHNob3J0ICBmdF9tYWNfbmFtZXNbRlRfTlVNX01BQ19OQU1FU10KLSNpZmRlZiAgREVGSU5FX1BTX1RBQkxFUwotICA9Ci0gIHsKLSAgICAgMjUzLCAgIDAsICAgNiwgMjYxLCAyNjcsIDI3NCwgMjgzLCAyOTQsIDMwMSwgMzA5LCA3NTgsIDMzMCwgMzQwLCAzNTEsCi0gICAgIDM2MCwgMzY1LCAzNzEsIDM3OCwgMzg1LCAzOTEsIDM5NiwgNDAwLCA0MDQsIDQxMCwgNDE1LCA0MjAsIDQyNCwgNDMwLAotICAgICA0MzYsIDQ0MSwgNDQ3LCA0NTcsIDQ2MiwgNDY4LCA0NzYsIDQ4NSwgNDg4LCA0OTAsIDQ5MiwgNDk0LCA0OTYsIDQ5OCwKLSAgICAgNTAwLCA1MDIsIDUwNCwgNTA2LCA1MDgsIDUxMCwgNTEyLCA1MTQsIDUxNiwgNTE4LCA1MjAsIDUyMiwgNTI0LCA1MjYsCi0gICAgIDUyOCwgNTMwLCA1MzIsIDUzNCwgNTM2LCA1MzgsIDU0MCwgNTUyLCA1NjIsIDU3NSwgNTg3LCA5NzksIDYwOCwgNjEwLAotICAgICA2MTIsIDYxNCwgNjE2LCA2MTgsIDYyMCwgNjIyLCA2MjQsIDYyNiwgNjI4LCA2MzAsIDYzMiwgNjM0LCA2MzYsIDYzOCwKLSAgICAgNjQwLCA2NDIsIDY0NCwgNjQ2LCA2NDgsIDY1MCwgNjUyLCA2NTQsIDY1NiwgNjU4LCA2NjAsIDY3MCwgNjc0LCA2ODUsCi0gICAgMTM3NSwxMzkyLDE0MDUsMTQxNCwxNDg2LDE1MTIsMTU2MiwxNjAzLDE2MzIsMTYxMCwxNjIyLDE2NDUsMTYzOSwxNjUyLAotICAgIDE2NjEsMTY5MCwxNjY4LDE2ODAsMTY5NywxNzI2LDE3MDQsMTcxNiwxNzMzLDE3NDAsMTc2OSwxNzQ3LDE3NTksMTc3NiwKLSAgICAxNzkwLDE4MTksMTc5NywxODA5LCA4MzksMTI2MywgNzA3LCA3MTIsIDc0MSwgODgxLCA4NzEsMTE2MCwxMzAyLDEzNDYsCi0gICAgMTE5NywgOTg1LDEwMzEsICAyMywxMDg2LDExMDgsICAzMiwxMjE5LCAgNDEsICA1MSwgNzMwLDExOTQsICA2NCwgIDc2LAotICAgICAgODYsICA5NCwgIDk3LDEwODksMTExOCwgMTA2LDExMzEsMTE1MCwgOTY2LCA2OTYsMTE4MywgMTEyLCA3MzQsIDEyMCwKLSAgICAgMTMyLCA3ODMsIDkzMCwgOTQ1LCAxMzgsMTM4NSwxMzk4LDE1MjksMTExNSwxMTU3LCA4MzIsMTA3OSwgNzcwLCA5MTYsCi0gICAgIDU5OCwgMzE5LDEyNDYsIDE1NSwxODMzLDE1ODYsIDcyMSwgNzQ5LCA3OTcsIDgxMSwgODI2LCA4MjksIDg0NiwgODU2LAotICAgICA4ODgsIDkwMywgOTU0LDEzNjMsMTQyMSwxMzU2LDE0MzMsMTQ0MywxNDUwLDE0NTcsMTQ2OSwxNDc5LDE0OTMsMTUwMCwKLSAgICAgMTYzLDE1MjIsMTU0MywxNTUwLDE1NzIsMTEzNCwgOTkxLDEwMDIsMTAwOCwxMDE1LDEwMjEsMTA0MCwxMDQ1LDEwNTMsCi0gICAgMTA2NiwxMDczLDExMDEsMTE0MywxNTM2LDE3ODMsMTU5NiwxODQzLDEyNTMsMTIwNywxMzE5LDE1NzksMTgyNiwxMjI5LAotICAgIDEyNzAsMTMxMywxMzIzLDExNzEsMTI5MCwxMzMyLDEyMTEsMTIzNSwxMjc2LCAxNjksIDE3NSwgMTgyLCAxODksIDIwMCwKLSAgICAgMjA5LCAyMTgsIDIyNSwgMjMyLCAyMzksIDI0NgotICB9Ci0jZW5kaWYgLyogREVGSU5FX1BTX1RBQkxFUyAqLwotICA7Ci0KLQotI2RlZmluZSBGVF9OVU1fU0lEX05BTUVTICAzOTEKLQotICAvKiBWYWx1ZXMgYXJlIG9mZnNldHMgaW50byB0aGUgYGZ0X3N0YW5kYXJkX2dseXBoX25hbWVzJyB0YWJsZSAqLwotCi0jaWZuZGVmICBERUZJTkVfUFNfVEFCTEVTCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi0gIGV4dGVybiAiQyIKLSNlbHNlCi0gIGV4dGVybgotI2VuZGlmCi0jZW5kaWYKLSAgY29uc3Qgc2hvcnQgIGZ0X3NpZF9uYW1lc1tGVF9OVU1fU0lEX05BTUVTXQotI2lmZGVmICBERUZJTkVfUFNfVEFCTEVTCi0gID0KLSAgewotICAgICAyNTMsIDI2MSwgMjY3LCAyNzQsIDI4MywgMjk0LCAzMDEsIDMwOSwgMzE5LCAzMzAsIDM0MCwgMzUxLCAzNjAsIDM2NSwKLSAgICAgMzcxLCAzNzgsIDM4NSwgMzkxLCAzOTYsIDQwMCwgNDA0LCA0MTAsIDQxNSwgNDIwLCA0MjQsIDQzMCwgNDM2LCA0NDEsCi0gICAgIDQ0NywgNDU3LCA0NjIsIDQ2OCwgNDc2LCA0ODUsIDQ4OCwgNDkwLCA0OTIsIDQ5NCwgNDk2LCA0OTgsIDUwMCwgNTAyLAotICAgICA1MDQsIDUwNiwgNTA4LCA1MTAsIDUxMiwgNTE0LCA1MTYsIDUxOCwgNTIwLCA1MjIsIDUyNCwgNTI2LCA1MjgsIDUzMCwKLSAgICAgNTMyLCA1MzQsIDUzNiwgNTM4LCA1NDAsIDU1MiwgNTYyLCA1NzUsIDU4NywgNTk4LCA2MDgsIDYxMCwgNjEyLCA2MTQsCi0gICAgIDYxNiwgNjE4LCA2MjAsIDYyMiwgNjI0LCA2MjYsIDYyOCwgNjMwLCA2MzIsIDYzNCwgNjM2LCA2MzgsIDY0MCwgNjQyLAotICAgICA2NDQsIDY0NiwgNjQ4LCA2NTAsIDY1MiwgNjU0LCA2NTYsIDY1OCwgNjYwLCA2NzAsIDY3NCwgNjg1LCA2OTYsIDcwNywKLSAgICAgNzEyLCA3MjEsIDczMCwgNzM0LCA3NDEsIDc0OSwgNzU4LCA3NzAsIDc4MywgNzk3LCA4MTEsIDgyNiwgODI5LCA4MzIsCi0gICAgIDgzOSwgODQ2LCA4NTYsIDg3MSwgODgxLCA4ODgsIDkwMywgOTE2LCA5MzAsIDk0NSwgOTU0LCA5NjYsIDk3OSwgOTg1LAotICAgICA5OTEsMTAwMiwxMDA4LDEwMTUsMTAyMSwxMDMxLDEwNDAsMTA0NSwxMDUzLDEwNjYsMTA3MywxMDc5LDEwODYsMTA4OSwKLSAgICAxMTAxLDExMDgsMTExNSwxMTE4LDExMzEsMTEzNCwxMTQzLDExNTAsMTE1NywxMTYwLDExNzEsMTE4MywxMTk0LDExOTcsCi0gICAgMTIwNywxMjExLDEyMTksMTIyOSwxMjM1LDEyNDYsMTI1MywxMjYzLDEyNzAsMTI3NiwxMjkwLDEzMDIsMTMxMywxMzE5LAotICAgIDEzMjMsMTMzMiwxMzQ2LDEzNTYsMTM2MywxMzc1LDEzODUsMTM5MiwxMzk4LDE0MDUsMTQxNCwxNDIxLDE0MzMsMTQ0MywKLSAgICAxNDUwLDE0NTcsMTQ2OSwxNDc5LDE0ODYsMTQ5MywxNTAwLDE1MTIsMTUyMiwxNTI5LDE1MzYsMTU0MywxNTUwLDE1NjIsCi0gICAgMTU3MiwxNTc5LDE1ODYsMTU5NiwxNjAzLDE2MTAsMTYyMiwxNjMyLDE2MzksMTY0NSwxNjUyLDE2NjEsMTY2OCwxNjgwLAotICAgIDE2OTAsMTY5NywxNzA0LDE3MTYsMTcyNiwxNzMzLDE3NDAsMTc0NywxNzU5LDE3NjksMTc3NiwxNzgzLDE3OTAsMTc5NywKLSAgICAxODA5LDE4MTksMTgyNiwxODMzLDE4NDMsMTg1MCwxODYyLDE4ODAsMTg5NSwxOTEwLDE5MjUsMTkzNiwxOTU0LDE5NzMsCi0gICAgMTk4OCwyMDAzLDIwMTYsMjAyOCwyMDQwLDIwNTQsMjA2NywyMDgwLDIwOTIsMjEwNiwyMTIwLDIxMzMsMjE0NywyMTY3LAotICAgIDIxODIsMjE5NiwyMjA2LDIyMTYsMjIyOSwyMjM5LDIyNDksMjI1OSwyMjY5LDIyNzksMjI4OSwyMjk5LDIzMDksMjMxOSwKLSAgICAyMzI5LDIzMzIsMjMzNiwyMzQwLDIzNTgsMjM3NywyMzkzLDI0MDgsMjQxOSwyNDI2LDI0MzMsMjQ0MCwyNDQ3LDI0NTQsCi0gICAgMjQ2MSwyNDY4LDI0NzUsMjQ4MiwyNDg5LDI0OTYsMjUwMywyNTEwLDI1MTcsMjUyNCwyNTMxLDI1MzgsMjU0NSwyNTUyLAotICAgIDI1NTksMjU2NiwyNTczLDI1ODAsMjU4NywyNTk0LDI2MDEsMjYxNSwyNjI1LDI2MzIsMjY0MywyNjU5LDI2NzIsMjY4NCwKLSAgICAyNjk2LDI3MDgsMjcyMiwyNzMzLDI3NDQsMjc1OSwyNzcxLDI3ODIsMjc5NywyODA5LDI4MTksMjgzMiwyODUwLDI4NjAsCi0gICAgMjg3MywyODg1LDI4OTgsMjkwNywyOTE3LDI5MzAsMjk0MywyOTU2LDI5NjgsMjk4MiwyOTk2LDMwMDksMzAyMiwzMDM0LAotICAgIDMwNDYsMzA2MCwzMDczLDMwODYsMzA5OCwzMTEyLDMxMjYsMzEzOSwzMTUyLDMxNjcsMzE4MiwzMTk2LDMyMDgsMzIyMCwKLSAgICAzMjM3LDMyNDksMzI2NCwzMjc1LDMyODMsMzI5NywzMzA5LDMzMjEsMzMzOCwzMzUzLDMzNjUsMzM3NywzMzk0LDM0MDksCi0gICAgMzQxOCwzNDMwLDM0NDIsMzQ1NCwzNDcxLDM0ODMsMzQ5OCwzNTA2LDM1MTgsMzUzMCwzNTQyLDM1NTksMzU3NCwzNTg2LAotICAgIDM1OTcsMzYxMiwzNjIwLDM2MjgsMzYzNiwzNjQ0LDM2NTAsMzY1NSwzNjYwLDM2NjYsMzY3MywzNjgxLDM2ODcKLSAgfQotI2VuZGlmIC8qIERFRklORV9QU19UQUJMRVMgKi8KLSAgOwotCi0KLSAgLyogdGhlIGZvbGxvd2luZyBhcmUgaW5kaWNlcyBpbnRvIHRoZSBTSUQgbmFtZSB0YWJsZSAqLwotI2lmbmRlZiAgREVGSU5FX1BTX1RBQkxFUwotI2lmZGVmICBfX2NwbHVzcGx1cwotICBleHRlcm4gIkMiCi0jZWxzZQotICBleHRlcm4KLSNlbmRpZgotI2VuZGlmCi0gIGNvbnN0IHVuc2lnbmVkIHNob3J0ICB0MV9zdGFuZGFyZF9lbmNvZGluZ1syNTZdCi0jaWZkZWYgIERFRklORV9QU19UQUJMRVMKLSAgPQotICB7Ci0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCi0gICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAotICAgICAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKLSAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsCi0gICAgIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLAotICAgICA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAgMCwKLSAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwgOTYsIDk3LCA5OCwgOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwKLSAgICAgIDAsMTExLDExMiwxMTMsMTE0LCAgMCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLCAgMCwxMjMsCi0gICAgICAwLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsICAwLDEzMiwxMzMsICAwLDEzNCwxMzUsMTM2LAotICAgIDEzNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDAsMTM4LCAgMCwxMzksICAwLCAgMCwgIDAsICAwLDE0MCwxNDEsMTQyLDE0MywgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLDE0NCwgIDAsICAwLCAgMCwxNDUsICAwLCAgMCwxNDYsMTQ3LDE0OCwxNDksICAwLCAgMCwgIDAsICAwCi0gIH0KLSNlbmRpZiAvKiBERUZJTkVfUFNfVEFCTEVTICovCi0gIDsKLQotCi0gIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGluZGljZXMgaW50byB0aGUgU0lEIG5hbWUgdGFibGUgKi8KLSNpZm5kZWYgIERFRklORV9QU19UQUJMRVMKLSNpZmRlZiAgX19jcGx1c3BsdXMKLSAgZXh0ZXJuICJDIgotI2Vsc2UKLSAgZXh0ZXJuCi0jZW5kaWYKLSNlbmRpZgotICBjb25zdCB1bnNpZ25lZCBzaG9ydCAgdDFfZXhwZXJ0X2VuY29kaW5nWzI1Nl0KLSNpZmRlZiAgREVGSU5FX1BTX1RBQkxFUwotICA9Ci0gIHsKLSAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMSwyMjksMjMwLCAgMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LCAxMywgMTQsIDE1LCA5OSwKLSAgICAyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsIDI3LCAyOCwyNDksMjUwLDI1MSwyNTIsCi0gICAgICAwLDI1MywyNTQsMjU1LDI1NiwyNTcsICAwLCAgMCwgIDAsMjU4LCAgMCwgIDAsMjU5LDI2MCwyNjEsMjYyLAotICAgICAgMCwgIDAsMjYzLDI2NCwyNjUsICAwLDI2NiwxMDksMTEwLDI2NywyNjgsMjY5LCAgMCwyNzAsMjcxLDI3MiwKLSAgICAyNzMsMjc0LDI3NSwyNzYsMjc3LDI3OCwyNzksMjgwLDI4MSwyODIsMjgzLDI4NCwyODUsMjg2LDI4NywyODgsCi0gICAgMjg5LDI5MCwyOTEsMjkyLDI5MywyOTQsMjk1LDI5NiwyOTcsMjk4LDI5OSwzMDAsMzAxLDMwMiwzMDMsICAwLAotICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLDMwNCwzMDUsMzA2LCAgMCwgIDAsMzA3LDMwOCwzMDksMzEwLDMxMSwgIDAsMzEyLCAgMCwgIDAsMzEzLAotICAgICAgMCwgIDAsMzE0LDMxNSwgIDAsICAwLDMxNiwzMTcsMzE4LCAgMCwgIDAsICAwLDE1OCwxNTUsMTYzLDMxOSwKLSAgICAzMjAsMzIxLDMyMiwzMjMsMzI0LDMyNSwgIDAsICAwLDMyNiwxNTAsMTY0LDE2OSwzMjcsMzI4LDMyOSwzMzAsCi0gICAgMzMxLDMzMiwzMzMsMzM0LDMzNSwzMzYsMzM3LDMzOCwzMzksMzQwLDM0MSwzNDIsMzQzLDM0NCwzNDUsMzQ2LAotICAgIDM0NywzNDgsMzQ5LDM1MCwzNTEsMzUyLDM1MywzNTQsMzU1LDM1NiwzNTcsMzU4LDM1OSwzNjAsMzYxLDM2MiwKLSAgICAzNjMsMzY0LDM2NSwzNjYsMzY3LDM2OCwzNjksMzcwLDM3MSwzNzIsMzczLDM3NCwzNzUsMzc2LDM3NywzNzgKLSAgfQotI2VuZGlmIC8qIERFRklORV9QU19UQUJMRVMgKi8KLSAgOwotCi0KLSAgLyoKLSAgICogIFRoaXMgdGFibGUgaXMgYSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIEFkb2JlIEdseXBoIExpc3QgKEFHTCksCi0gICAqICBvcHRpbWl6ZWQgZm9yIGVmZmljaWVudCBzZWFyY2hpbmcuICBJdCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlCi0gICAqICBgZ2xuYW1lcy5weScgcHl0aG9uIHNjcmlwdCBsb2NhdGVkIGluIHRoZSBgc3JjL3Rvb2xzJyBkaXJlY3RvcnkuCi0gICAqCi0gICAqICBUaGUgbG9va3VwIGZ1bmN0aW9uIHRvIGdldCB0aGUgVW5pY29kZSB2YWx1ZSBmb3IgYSBnaXZlbiBzdHJpbmcKLSAgICogIGlzIGRlZmluZWQgYmVsb3cgdGhlIHRhYmxlLgotICAgKi8KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAotCi0jaWZuZGVmICBERUZJTkVfUFNfVEFCTEVTCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi0gIGV4dGVybiAiQyIKLSNlbHNlCi0gIGV4dGVybgotI2VuZGlmCi0jZW5kaWYKLSAgY29uc3QgdW5zaWduZWQgY2hhciAgZnRfYWRvYmVfZ2x5cGhfbGlzdFs1NTk5N0xdCi0jaWZkZWYgIERFRklORV9QU19UQUJMRVMKLSAgPQotICB7Ci0gICAgICAwLCA1MiwgIDAsMTA2LCAgMiwxNjcsICAzLCA2MywgIDQsMjIwLCAgNiwxMjUsICA5LDE0MywgMTAsIDIzLAotICAgICAxMSwxMzcsIDEyLDE5OSwgMTQsMjQ2LCAxNSwgODcsIDE2LDIzMywgMTcsMjE5LCAxOCwxMDQsIDE5LCA4OCwKLSAgICAgMjIsMTEwLCAyMywgMzIsIDIzLCA3MSwgMjQsIDc3LCAyNywxNTYsIDI5LCA3MywgMzEsMjQ3LCAzMiwxMDcsCi0gICAgIDMyLDIyMiwgMzMsIDU1LCAzNCwxNTQsIDM1LDIxOCwgNTgsIDEwLCA2NCwxMjIsIDcyLDE4OCwgODAsMTA5LAotICAgICA4OCwxMDQsIDkzLCA2MSwgOTgsMTY4LDEwNiwgOTEsMTE0LDExMSwxMTUsMjM3LDEyMiwxODAsMTI3LDI1NSwKLSAgICAxMzUsMTY0LDE0MywxMzIsMTQ5LDIxMywxNTgsMTA4LDE2MSwxMTUsMTY4LDE3NSwxODMsMTQ3LDE5NywxOTksCi0gICAgMjAyLCAyNSwyMDQsMTY2LDIwOCwyMDksMjA5LCA4MSwyMTUsIDI2LCA2NSwxNDMsICAwLCA2NSwgIDAsMTQwLAotICAgICAgMCwxNzUsICAwLDE5MywgIDEsIDE1LCAgMSwxNDcsICAxLDIzMywgIDEsMjUxLCAgMiwgIDcsICAyLCA0MCwKLSAgICAgIDIsIDU3LCAgMiwgODIsICAyLCA5MSwgIDIsMTI4LCAgMiwxMzYsICAyLDE1NCwgNjksMTMxLCAgMCwxOTgsCi0gICAgICAwLDE1MCwgIDAsMTU4LCAgMCwxNjcsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1MiwyMzcsMjI1LAotICAgIDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIyNiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjMwLDIyNSwKLSAgICAyMjcsMjQ1LDI0NCwxMDEsMTI5LCAgMCwxOTMsICAwLDE4NSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsCi0gICAgMjI1LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTM0LCAgMSwgIDIsICAwLDIxMywgIDAsMjIxLCAgMCwyMzIsICAwLAotICAgIDI0MywgIDAsMjUxLCAgMSwgIDcsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLDE3NCwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjA4LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksCi0gICAgMTI4LCAzMCwxODIsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDE3NiwyMzIsMjM5LDIzOSwyMzUsMjI1LAotICAgIDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDE3OCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTgwLCA5OSwKLSAgICAgIDQsICAxLCAyNSwgIDEsIDMyLCAgMSwxMjEsICAxLDEzNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMDUsCi0gICAgMjMzLDI0MiwgOTksICAyLCAgMSwgNDAsICAxLCA0NSwyMzYsMTAxLDEyOCwgMzYsMTgyLDI0NSwyMzcsMjMwLAotICAgIDIzNiwyMjksMTIwLDEzNCwgIDAsMTk0LCAgMSwgNjYsICAxLCA3NCwgIDEsIDg1LCAgMSwgOTMsICAxLDEwNSwKLSAgICAgIDEsMTEzLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxNjQsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLDE3MiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMTY2LDIzMiwyMzksMjM5LAotICAgIDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTY4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywKLSAgICAyMjYsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE3MCwyNDUsMjQ0LDEwMSwxMjksMjQ2LDIwMSwgIDEsCi0gICAgMTI5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxODAsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsIDE2LDEwMCwgIDMsICAxLDE1NSwgIDEsMTY1LCAgMSwyMDksMjI2LDIzNiwyMzEsMjQyLDIyNSwKLSAgICAyNDYsMTAxLDEyOCwgIDIsICAwLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzEsICAwLDE5NiwgIDEsCi0gICAgMTgxLCAgMSwxOTIsICAxLDIwMSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjEwLAotICAgIDIzNywyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjIyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywKLSAgICAyMjgsMjM5LDExNiwgIDIsICAxLDIxNiwgIDEsMjI0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNjAsCi0gICAgMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjQsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLAotICAgIDE5MiwgIDEsMjQzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMjQsMjMyLDIzOSwyMzksMjM1LDIyNSwKLSAgICAyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwxNjIsMTA1LCAgMiwgIDIsIDEzLCAgMiwgMjUsMjI5LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTIsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LAotICAgIDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgIDIsMjM2LDI0MCwyMzIsIDk3LDEyOSwgIDMsMTQ1LCAgMiwKLSAgICAgNDksMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDEzNCwxMDksICAyLCAgMiwgNjMsICAyLCA3MSwyMjUsCi0gICAgMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsICAwLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgMzMsMjM5LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI4LCAgMSwgIDQsMjQyLDIzMywyMzgsMTAzLDEzMSwKLSAgICAgIDAsMTk3LCAgMiwxMDQsICAyLDExMiwgIDIsMTIwLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwyNTAsCi0gICAgMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAgMCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjI5LAotICAgIDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywgOTcsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjksICAwLDE5NSwKLSAgICAgIDIsMTQ2LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMjcsMjQ5LDIyNiwyMjUsMjQyLDIzNywyMjksCi0gICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDQ5LCA2NiwxMzcsICAwLCA2NiwgIDIsMTg5LCAgMiwxOTgsICAyLAotICAgIDIyMywgIDMsICAzLCAgMywgMTAsICAzLCAyMiwgIDMsIDM0LCAgMywgNDYsICAzLCA1NCwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDEwMSwxMjgsIDM2LDE4MywyMjgsMjM5LDExNiwgIDIsICAyLDIwNiwgIDIsMjE1LDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsICAyLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgIDQsMTAxLAotICAgICAgMywgIDIsMjMxLCAgMiwyNDIsICAyLDI1NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDE3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDUwLDI0NCwgOTcsCi0gICAgMTI4LCAgMywxNDYsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDEsMTI5LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LAotICAgIDIzNiwyMzksMTE5LDEyOCwgMzAsICA2LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsIDM0LDI0MiwyMjksMjQ2LDIyOSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ0LDI0MywyMzcsCi0gICAgMjI1LDIzNiwxMDgsMTI4LDI0NywgOTgsMjQ0LDIzOSwyNDAsMjI2LDIyNSwxMTQsMTI4LCAgMSwxMzAsIDY3LAotICAgIDEzNywgIDAsIDY3LCAgMywgODUsICAzLDEyNywgIDMsMTkzLCAgMywyMTAsICAzLDIyNCwgIDQsMTcxLCAgNCwKLSAgICAxODgsICA0LDIwMCwgIDQsMjEyLCA5NywgIDMsICAzLCA5MywgIDMsMTA0LCAgMywxMTEsMjI1LDI0MiwyMzcsCi0gICAgMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2MiwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgIDYsMjQyLAotICAgIDIzOSwxMTAsMTI5LDI0NiwyMDIsICAzLDExOSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ1LCA5OSwKLSAgICAgIDMsICAzLDEzNSwgIDMsMTQyLCAgMywxNzEsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsIDEyLDIyOSwyMjgsCi0gICAgMjMzLDIzNiwyMzYsIDk3LDEzMCwgIDAsMTk5LCAgMywxNTUsICAzLDE2MywyMjUsMjI3LDI0NSwyNDQsMTAxLAotICAgIDEyOCwgMzAsICA4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzEsMjMzLDI0MiwgOTksICAyLCAgMywKLSAgICAxNzksICAzLDE4NCwyMzYsMTAxLDEyOCwgMzYsMTg0LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsCi0gICAgICA4LDIyOCwyMzksMTE2LDEyOSwgIDEsIDEwLCAgMywyMDEsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAotICAgICAgMSwgMTAsMjI5LDIyOCwyMzMsMjM2LDIzNiwyMjUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDE4NCwKLSAgICAxMDQsICA0LCAgMywyMzQsICAzLDI0NiwgIDQsMTYxLCAgNCwxNjUsMjI1LDIyNSwyNDIsMjM3LDIyOSwyMzgsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzMsMTAxLCAgNiwgIDQsICA0LCAgNCwgMjQsICA0LCAzNSwgIDQsMTAzLAotICAgICAgNCwxMTUsICA0LDEzNiwyMjUsMjI2LDIzNSwyMzIsMjI1LDI0MywyMzMsMjI1LDIzOCwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTg4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgMzksMTAwLCAgMiwgIDQsIDQxLCAgNCwgODUsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LAotICAgIDExNCwgIDIsICA0LCA1NCwgIDQsIDc0LDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDE4MiwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDI0NCwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKLSAgICAxMjgsICA1LCA2NywyMzUsMjMyLDIyNSwyMzUsMjI1LDI0MywyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIwMywyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LAotICAgIDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxODQsMTA1LDEyOCwgIDMsMTY3LDIzOSwyMzksMTA3LDEyOCwgIDEsMTM1LDIzMywyNDIsMjI3LDI0NSwyMzcsCi0gICAgMjMwLDIzNiwyMjksMjQ4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDYsMjM3LDIzOSwyMzgsMjM5LAotICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzUsMjM5LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKLSAgICAxMTAsMTI4LCAgNSwgODEsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LCA5OSwgNjgsMTQyLCAgMCwgNjgsCi0gICAgICA0LDI1MiwgIDUsIDEwLCAgNSwgMzYsICA1LCA5NiwgIDUsMTIxLCAgNSwxNjYsICA1LDE3MywgIDUsMjMxLAotICAgICAgNSwyNDQsICA2LCAgMCwgIDYsIDEyLCAgNiwgMjgsICA2LCA0OCwgIDYsIDU3LCA5MCwxMjksICAxLDI0MSwKLSAgICAgIDUsICAyLDIyNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwxOTYsIDk3LCAgMiwgIDUsIDE2LCAgNSwgMjcsCi0gICAgMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1MiwyMzAsMjQyLDIzMywyMjcsMjI1LAotICAgIDExMCwxMjgsICAxLDEzNywgOTksICA0LCAgNSwgNDYsICA1LCA1MywgIDUsIDYyLCAgNSwgODksMjI1LDI0MiwKLSAgICAyMzksMTEwLDEyOCwgIDEsIDE0LDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDE2LDIzMywyNDIsCi0gICAgIDk5LCAgMiwgIDUsIDcwLCAgNSwgNzUsMjM2LDEwMSwxMjgsIDM2LDE4NSwyNDUsMjM3LDIzMCwyMzYsMjI5LAotICAgIDI0OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDE4LDI0MiwyMzksMjI1LDExNiwxMjgsICAxLCAxNiwKLSAgICAyMjgsMjM5LDExNiwgIDIsICA1LDEwNCwgIDUsMTEzLDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsCi0gICAgIDEwLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMTIsMTAxLCAgMywgIDUsMTI5LCAgNSwxNDAsICA1LAotICAgIDE1MCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDIwLDIzMywyMjcsMjM5LDI0MCwKLSAgICAyNDQsMjMzLCA5OSwxMjgsICAzLDIzOCwyMzYsMjQ0LCA5NywxMjksIDM0LCAgNiwgIDUsMTU4LDIzMSwyNDIsCi0gICAgMjI5LDIyOSwxMDcsMTI4LCAgMywxNDgsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDEsMTM4LDEwNSwgIDIsICA1LAotICAgIDE3OSwgIDUsMjE4LDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEzMSwyNDYsMjAzLCAgNSwxOTQsICA1LDIwMiwKLSAgICAgIDUsMjEwLDE5MywyMjcsMjQ1LDI0NCwxMDEsMTI4LDI0NiwyMDQsMTk5LDI0MiwyMjUsMjQ2LDEwMSwxMjgsCi0gICAgMjQ2LDIwNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTY4LDIzMSwyMjUsMjM3LDIzNywyMjUsMjMxLAotICAgIDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIyMCwyMzQsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwgIDIsMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMTQsCi0gICAgMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzYsMjM5LDI0NCwyMjUsMjI3LAotICAgIDIyNywyMjksMjM4LDI0NCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ3LDExNSwgIDIsICA2LCAzNCwKLSAgICAgIDYsIDQxLDIzNiwyMjUsMjQzLDEwNCwxMjgsICAxLCAxNiwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDAsCi0gICAgMjQ0LDIzOSwyNDAsMjI2LDIyNSwxMTQsMTI4LCAgMSwxMzksMTIyLDEzMSwgIDEsMjQyLCAgNiwgNjcsICA2LAotICAgICA3NSwgIDYsMTEyLDIyNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwxOTcsMTAxLCAgMiwgIDYsIDgxLCAgNiwKLSAgICAxMDEsMjI1LDIyNiwyMzUsMjMyLDIyNSwyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDIyNCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsICA1LAotICAgIDIzMiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxNSwgNjksMTQ2LCAgMCwKLSAgICAgNjksICA2LDE2NSwgIDYsMTgzLCAgNiwxOTEsICA3LCA4OSwgIDcsMTUzLCAgNywxNjUsICA3LDE4MywgIDcsCi0gICAgMjExLCAgOCwgIDcsICA4LCAzNiwgIDgsIDk0LCAgOCwxNjksICA4LDE4OSwgIDgsMjA4LCAgOCwyNDgsICA5LAotICAgICA0NCwgIDksMTA5LCAgOSwxMTUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjksICAwLDIwMSwgIDYsMTc1LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzMsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAxLCAyMCwgOTksCi0gICAgICA1LCAgNiwyMDMsICA2LDIxMCwgIDYsMjI0LCAgNiwyMzYsICA3LCA3OSwyMjUsMjQyLDIzOSwxMTAsMTI4LAotICAgICAgMSwgMjYsMjI5LDIyOCwyMzMsMjM2LDIzNiwyMjUsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsIDMwLCAyOCwKLSAgICAyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1MywyMzMsMjQyLCA5OSwgIDIsCi0gICAgICA2LDI0NCwgIDYsMjQ5LDIzNiwxMDEsMTI4LCAzNiwxODYsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTM1LAotICAgICAgMCwyMDIsICA3LCAxNiwgIDcsIDI0LCAgNywgMzIsICA3LCA0MywgIDcsIDUxLCAgNywgNjMsICA3LCA3MSwKLSAgICAyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMTkwLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMjQsCi0gICAgMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE5OCwyMzEsMjQyLDIyNSwyNDYsMTAxLAotICAgIDEyOCwgMzAsMTkyLDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTk0LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzQsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE5NiwyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgIDQsMTAwLCAgMywgIDcsIDk3LCAgNywxMDcsICA3LAotICAgIDEyNywyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgIDQsMjMzLDIyOSwyNDIsMjI5LDI0MywKLSAgICAyMzMsMTE1LDEyOSwgIDAsMjAzLCAgNywxMTksMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIzNSwyMzksCi0gICAgMTE2LDEzMCwgIDEsIDIyLCAgNywxMzYsICA3LDE0NSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLAotICAgICAyMiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTg0LDIzMCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsIDM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI5LCAgMCwyMDAsICA3LDE3NSwyNDMsCi0gICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjMyLDEwNCwgIDIsICA3LDE4OSwgIDcsMjAwLDIyNSwyNDIsMjM3LAotICAgIDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTUsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwKLSAgICAxMjgsIDMwLDE4NiwxMDUsICAzLCAgNywyMTksICA3LDIzMCwgIDcsMjQ1LDIzMSwyMzIsMjQ0LDI0MiwyMzksCi0gICAgMjM3LDIyNSwxMTAsMTI4LCAzMywxMDMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgIDYsMjM5LDI0NCwyMzMsMjMwLDIzMywyMjksMjI4LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMDAsMTA4LCAgMiwgIDgsIDEzLCAgOCwgMjQsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNywyMjksMjQ2LDIyOSwyMzgsMjQyLDIzOSwyMzcsMjI1LAotICAgIDExMCwxMjgsIDMzLDEwNiwxMDksICAzLCAgOCwgNDQsICA4LCA3MiwgIDgsIDgzLDIyNSwyMjcsMjQyLDIzOSwKLSAgICAxMTAsMTMwLCAgMSwgMTgsICA4LCA1NiwgIDgsIDY0LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgMjIsCi0gICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLCAyMCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsIDI4LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzcsMTEwLCAgNCwKLSAgICAgIDgsMTA0LCAgOCwxMTUsICA4LDEzNSwgIDgsMTU0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgMjksMjI4LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE2MiwxMDMsMTI5LCAgMSwgNzQsICA4LDE0MSwyMzIsMjI5LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNjQsMjMyLDIzOSwyMzksMjM1LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTksMTExLCAgMiwgIDgsMTc1LCAgOCwxODMsMjMxLAotICAgIDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCAyNCwyNDAsMjI5LDExMCwxMjgsICAxLDE0NCwyNDAsMjQzLDIzMywKLSAgICAyMzYsMjM5LDExMCwxMjksICAzLDE0OSwgIDgsMjAwLDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzYsCi0gICAgMTE0LCAgMiwgIDgsMjE0LCAgOCwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICAzMiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI5LCAgMSwxNDIsICA4LDIzNywyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDQ1LDExNSwgIDQsICA5LCAgMiwgIDksIDEzLCAgOSwgMzMsCi0gICAgICA5LCAzNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDMzLDIyOCwyMjksMjQzLAotICAgIDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxNzAsMTA0LDEyOCwgIDEsMTY5LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwMSwxMTYsICAzLCAgOSwgNTIsCi0gICAgICA5LCA3OCwgIDksIDkyLCA5NywxMzAsICAzLDE1MSwgIDksIDYwLCAgOSwgNzAsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDU2LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzcsMTA0LDEyOSwKLSAgICAgIDAsMjA4LCAgOSwgODQsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0MCwyMzMsMjM2LDIyOCwxMDEsCi0gICAgMTI5LCAzMCwxODgsICA5LDEwMSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDI2LDI0NSwyNDIsMTExLAotICAgIDEyOCwgMzIsMTcyLDI1MCwxMDQsMTMwLCAgMSwxODMsICA5LDEyNCwgIDksMTMyLDIyNywyMjUsMjQyLDIzOSwKLSAgICAxMTAsMTI4LCAgMSwyMzgsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsICAxLDE4NCwgNzAsCi0gICAgMTM2LCAgMCwgNzAsICA5LDE2MywgIDksMTcyLCAgOSwxODQsICA5LDIxMiwgIDksMjE5LCAgOSwyNDgsIDEwLAotICAgICAgNCwgMTAsIDE1LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTg3LDIyOCwyMzksMjQ0LDIyNSwKLSAgICAyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDMwLDEwMSwgIDIsICA5LDE5MCwgIDksMjAyLDIzMiwyMjUsCi0gICAgMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDg2LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLAotICAgICA5OSwxMjgsICAzLDIyOCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNDUsMTA1LCAgMiwgIDksMjI1LCAgOSwKLSAgICAyMzgsMjQ0LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTE0LDI0NiwyMjksCi0gICAgMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEwMCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCAzOCwyMzksMjQ1LDI0MiwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsIDk5LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDIsIDcxLDE0MCwgIDAsIDcxLCAxMCwgNTEsIDEwLCA2MSwgMTAsCi0gICAgMTA3LCAxMCwxMTUsIDEwLDE3NiwgMTAsMTkzLCAxMCwyMDUsIDExLCAzOSwgMTEsIDUyLCAxMSwgNjUsIDExLAotICAgICA5MCwgMTEsMTA3LDE5NCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDEzNSwgOTcsICAzLCAxMCwKLSAgICAgNjksIDEwLCA3NiwgMTAsIDk0LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI0NCwyMzcsMjM3LCA5NywxMjksCi0gICAgICAzLDE0NywgMTAsIDg0LDIyNSwyMzAsMjQyLDIzMywyMjcsMjI1LDExMCwxMjgsICAxLDE0OCwyMzgsMjMxLAotICAgIDIzMywyMjUsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzQsMjI2LDI0MiwyMjksMjQ2LDEwMSwKLSAgICAxMjgsICAxLCAzMCwgOTksICA0LCAxMCwxMjUsIDEwLDEzMiwgMTAsMTQxLCAxMCwxNjMsMjI1LDI0MiwyMzksCi0gICAgMTEwLDEyOCwgIDEsMjMwLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDM0LDIzMywyNDIsIDk5LAotICAgICAgMiwgMTAsMTQ5LCAxMCwxNTQsMjM2LDEwMSwxMjgsIDM2LDE4OCwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwKLSAgICAxMjgsICAxLCAyOCwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMzQsCi0gICAgMjI4LDIzOSwxMTYsMTI5LCAgMSwgMzIsIDEwLDE4NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLAotICAgICAzMiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxOSwxMDQsICAzLCAxMCwKLSAgICAyMTMsIDEwLDIyNiwgMTEsIDMzLDIyNSwyMjgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCi0gICAgICA1LCA2NiwxMDEsICAzLCAxMCwyMzQsIDEwLDI1NSwgMTEsIDE2LDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LAotICAgIDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTQ4LDI0MywKLSAgICAyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNDYsCi0gICAgMjQ1LDI0MCwyNDQsMjQ1LDI0MiwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDE0NCwyMzksMjM5LDEwNywxMjgsICAxLDE0NywyMzMsMjM3LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKLSAgICAxMTAsMTI4LCAgNSwgNTEsMjM0LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgICAzLDEwOSwgIDIsIDExLCA3MSwgMTEsIDc5LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAzMCwgMzIsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAzOSwyNDIsMjI1LDI0NiwxMDEsMTI5LDI0NiwKLSAgICAyMDYsIDExLCA5OSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDk2LDExNSwgIDIsIDExLDExMywgMTEsCi0gICAgMTI5LDIzNywyMjUsMjM2LDEwOCwxMjksMjQ3LDEwMywgMTEsMTIyLDIzMiwyMzksMjM5LDEwNywxMjgsICAyLAotICAgIDE1NSwyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMjI4LCA3MiwxNDAsICAwLCA3MiwgMTEsMTY1LCAxMSwKLSAgICAxOTAsIDExLDE5OCwgMTEsMjA4LCAxMiwgMTcsIDEyLCA0MCwgMTIsIDc3LCAxMiwxMTcsIDEyLDEyOSwgMTIsCi0gICAgMTU3LCAxMiwxNjUsIDEyLDE4OSwxNzcsMTg0LCA1MywgIDMsIDExLDE3NSwgMTEsMTgwLCAxMSwxODUsMTc5LAotICAgICA1MSwxMjgsIDM3LDIwNywxODAsIDUxLDEyOCwgMzcsMTcwLDE4MSwgNDksMTI4LCAzNywxNzEsMTc4LDE3OCwKLSAgICAxNzYsMTgzLCA1MSwxMjgsIDM3LDE2MSwyMDgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDMsCi0gICAgIDk3LCAgMywgMTEsMjE2LCAxMSwyMzYsIDEyLCAgMCwyMjUsMjI2LDIzNSwyMzIsMjI1LDI0MywyMzMsMjI1LAotICAgIDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTY4LDIyOCwyMjksMjQzLDIyNywKLSAgICAyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNzgsCi0gICAgMjQyLDIyOCwyNDMsMjMzLDIzMSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICA0MiwgOTgsICAyLCAxMiwgMjMsIDEyLCAyOCwyMjUsMTE0LDEyOCwgIDEsIDM4LDI0MiwyMjksMjQ2LDIyOSwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQyLCA5OSwgIDIsIDEyLCA0NiwgMTIsIDU1LDIyOSwyMjgsCi0gICAgMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDQwLDIzMywyNDIsIDk5LCAgMiwgMTIsIDYzLCAxMiwgNjgsMjM2LAotICAgIDEwMSwxMjgsIDM2LDE4OSwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCAzNiwxMDAsICAyLCAxMiwKLSAgICAgODMsIDEyLCA5MywyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAzMCwgMzgsMjM5LDExNiwgIDIsCi0gICAgIDEyLDEwMCwgMTIsMTA5LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDM0LDIyNiwyMjksMjM2LAotICAgIDIzOSwxMTksMTI4LCAzMCwgMzYsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwKLSAgICAgNDAsMTExLCAgMiwgMTIsMTM1LCAxMiwxNDYsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCi0gICAgICA1LCA2NCwyNDIsMjMzLDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwgIDMsMjMyLDI0MywyMzcsMjI1LAotICAgIDIzNiwxMDgsMTI4LDI0NywxMDQsMjQ1LDIzOCwyMzEsMjI1LDI0MiwyNDUsMjM3LDIzNiwyMjUsMjQ1LDExNiwKLSAgICAxMjksMjQ2LDIwNywgMTIsMTgxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDgsMjUwLDI0MywyNDEsCi0gICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTQ0LCA3MywxNDYsICAwLCA3MywgMTIsMjM5LCAxMiwyNTEsIDEyLAotICAgIDI1NSwgMTMsIDExLCAxMywgMjksIDEzLCAzNywgMTMsIDk0LCAxMywxODEsIDEzLDIxNCwgMTMsMjI0LCAxMywKLSAgICAyNDIsIDEzLDI1NCwgMTQsIDQ4LCAxNCwgODYsIDE0LCA5OSwgMTQsMTY2LCAxNCwxODcsIDE0LDIwNSwxOTMsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0NywgNzQsMTI4LCAgMSwgNTAsMjEzLAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDYsMjI1LDIyNywyNDUsMjQ0LDEwMSwKLSAgICAxMjksICAwLDIwNSwgMTMsIDIxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzcsMjI2LDI0MiwyMjksCi0gICAgMjQ2LDEwMSwxMjgsICAxLCA0NCwgOTksICAzLCAxMywgNDUsIDEzLCA1MiwgMTMsIDg0LDIyNSwyNDIsMjM5LAotICAgIDExMCwxMjgsICAxLDIwNywyMzMsMjQyLCA5OSwgIDIsIDEzLCA2MCwgMTMsIDY1LDIzNiwxMDEsMTI4LCAzNiwKLSAgICAxOTAsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI5LCAgMCwyMDYsIDEzLCA3NiwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNDcsMjM4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAgNiwxMDAsICAzLAotICAgICAxMywxMDIsIDEzLDExMiwgMTMsMTU1LDIyNiwyMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAgOCwKLSAgICAyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTMxLCAgMCwyMDcsIDEzLDEyOCwgMTMsMTM2LCAxMywxNDcsCi0gICAgMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA0NiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMjI4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzksMjM5LDExNiwxMzAsICAxLCA0OCwKLSAgICAgMTMsMTY0LCAxMywxNzMsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgNDgsMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLDIwMiwxMDEsICAyLCAxMywxODcsIDEzLDIwMywyMjYsMjQyLDIyOSwyNDYsMjI5LAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCAyMSwyMzAsMjQyLDIyNSwyMzUsMjQ0LDI0NSwxMTQsMTI4LCAzMywgMTcsCi0gICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLDIwNCwgMTMsMjM0LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAotICAgIDI0NywyMzYsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwyMDAsMTA1LCAgMywKLSAgICAgMTQsICA2LCAxNCwgMTcsIDE0LCAzMiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgIDI0LDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwgIDIsIDEwLAotICAgIDI0MywyMzIsMjM5LDI0MiwyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNSwKLSAgICAxMDksICAyLCAxNCwgNTQsIDE0LCA3NSwyMjUsMjI3LDI0MiwyMzksMTEwLDEyOSwgIDEsIDQyLCAxNCwgNjQsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIyNiwyMzksMjM4LDIzOSwyNDMsMjQwLAotICAgIDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQxLDIzOCwyMzMsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKLSAgICAxMjgsICA1LCA1OSwxMTEsICAzLCAxNCwxMDcsIDE0LDExOCwgMTQsMTI2LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwgIDEsMjMxLDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCA0NiwyNDQsIDk3LAotICAgIDEzMSwgIDMsMTUzLCAxNCwxMzcsIDE0LDE0NywgMTQsMTU4LDIyNSwyMzAsMjQyLDIzMywyMjcsMjI1LDExMCwKLSAgICAxMjgsICAxLDE1MCwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgIDMsMTcwLDI0NCwyMzksCi0gICAgMjM4LDIzOSwxMTUsMTI4LCAgMywxMzgsMTE1LCAgMiwgMTQsMTcyLCAxNCwxNzksMjM3LDIyNSwyMzYsMTA4LAotICAgIDEyOCwyNDcsMTA1LDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxNTEsMjQ0LDIzMywyMzYsMjI4LDEwMSwKLSAgICAxMjksICAxLCA0MCwgMTQsMTk3LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNDQsMjUwLDIzMiwyMzMsCi0gICAgMjQ0LDI0MywgOTcsICAyLCAxNCwyMTYsIDE0LDIyNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMTE2LDIyOCwyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDExOCwgNzQsMTM0LCAgMCwgNzQsIDE1LCAgNiwgMTUsIDE4LCAxNSwgNDEsCi0gICAgIDE1LCA1MywgMTUsIDY3LCAxNSwgNzksMjI1LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LAotICAgICAgNSwgNjUsMjI3LDIzMywyNDIsIDk5LCAgMiwgMTUsIDI3LCAxNSwgMzIsMjM2LDEwMSwxMjgsIDM2LDE5MSwKLSAgICAyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCA1MiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LCAgOCwyMzIsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDUsIDc1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQyLDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDYsIDc1LDE0MCwgIDAsIDc1LCAxNSwxMTUsIDE1LDEyNSwgMTUsCi0gICAgMTM1LCAxNiwgMTgsIDE2LCA2NSwgMTYsIDc2LCAxNiwxMDYsIDE2LDE0MywgMTYsMTU2LCAxNiwxNjgsIDE2LAotICAgIDE4MCwgMTYsMjA4LDE5NCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDEzMywyMDMsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDUsIDk3LCAgNywgMTUsMTUxLCAxNSwxNjksIDE1LDE5MSwgMTUsCi0gICAgMjExLCAxNSwyMjYsIDE1LDIzMiwgMTUsMjQ5LDIyNiwyMjUsMjQzLDIzMiwyMzUsMjMzLDI0MiwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTYwLCA5OSwgIDIsIDE1LDE3NSwgMTUsMTgxLDI0NSwKLSAgICAyNDQsMTAxLDEyOCwgMzAsIDQ4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNiwyMjgsCi0gICAgMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMTU0LDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTk1LDI0MCwyNDAsIDk3LDEyOCwgIDMsMTU0LDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTgsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LAotICAgIDIzNiwyNDMsMjQ0LDI0MiwyMzksMjM1LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTU2LCA5OSwgIDQsIDE2LCAyOCwgMTYsIDM1LCAxNiwgNDQsIDE2LCA1MiwyMjUsMjQyLDIzOSwxMTAsCi0gICAgMTI4LCAgMSwyMzIsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNTQsMjMzLDI0MiwyMjcsMjM2LAotICAgIDEwMSwxMjgsIDM2LDE5MiwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwKLSAgICAgNTQsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA1MCwxMDEsICAyLCAxNiwgODIsCi0gICAgIDE2LCA5NCwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA4NCwyMzgsMjI1LAotICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2MywxMDQsICAzLCAxNiwxMTQsIDE2LDEyNiwKLSAgICAgMTYsMTM3LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDM3LDIyOSwyMzMsCi0gICAgMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzAsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNTIsMjM0LAotICAgIDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDEyLDIzNiwyMzMsMjM4LDIyOSwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDUyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsIDQzLDIzOSwyNDAsMjQwLCA5NywgIDIsIDE2LDE4OSwgMTYsMjAwLDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjgsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIyMiwKLSAgICAxMTUsICAyLCAxNiwyMTQsIDE2LDIyNiwyMzMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LDExMCwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDcsIDc2LDEzOCwgIDAsIDc2LCAxNywgIDEsIDE3LAotICAgICAgNSwgMTcsICA5LCAxNywgMjksIDE3LCA5NSwgMTcsMTMzLCAxNywxNDcsIDE3LDE2NSwgMTcsMTc3LCAxNywKLSAgICAxODksIDc0LDEyOCwgIDEsMTk5LCA3NiwxMjgsMjQ2LDE5MSwgOTcsICAyLCAxNywgMTUsIDE3LCAyMiwyMjcsCi0gICAgMjQ1LDI0NCwxMDEsMTI4LCAgMSwgNTcsMjM3LDIyNiwyMjgsIDk3LDEyOCwgIDMsMTU1LCA5OSwgIDQsIDE3LAotICAgICAzOSwgMTcsIDQ2LCAxNywgNTUsIDE3LCA4MiwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgNjEsMjI5LDIyOCwKLSAgICAyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNTksMjMzLDI0MiwgOTksICAyLCAxNywgNjMsIDE3LCA2OCwyMzYsCi0gICAgMTAxLDEyOCwgMzYsMTkzLDI0NSwyMzcsMjMwLDIzNiwyMjksMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LAotICAgICAzMCwgNjAsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDU5LDIyOCwKLSAgICAyMzksMTE2LDEzMCwgIDEsIDYzLCAxNywxMDUsIDE3LDExNCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCi0gICAgICAxLCA2MywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsIDU0LCAxNywxMjQsMjM3LDIyNSwyMjcsMjQyLAotICAgIDIzOSwxMTAsMTI4LCAzMCwgNTYsMjMzLDI0NywyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKLSAgICAxMjgsICA1LCA2MCwxMDYsMTI5LCAgMSwyMDAsIDE3LDE1MywyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LCAgOSwyMzYsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLAotICAgICA1OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA0NCwxMTUsICAyLCAxNywKLSAgICAxOTUsIDE3LDIxMiwyMzYsMjI1LDI0MywxMDQsMTI5LCAgMSwgNjUsIDE3LDIwNCwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNDYsMjQ5LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwOCwgNzcsMTM3LCAgMCwgNzcsIDE3LAotICAgIDI0MSwgMTcsMjUxLCAxOCwgMjQsIDE4LCAzMywgMTgsIDU4LCAxOCwgNzEsIDE4LCA4MywgMTgsIDkxLCAxOCwKLSAgICAxMDAsMTk0LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM0LDIyNSwgOTksICAyLCAxOCwgIDIsCi0gICAgIDE4LCAxOCwyNDIsMjM5LDExMCwxMjksMjQ2LDIwOCwgMTgsIDEwLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAotICAgIDI0NywxNzUsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgNjIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwKLSAgICAxOTQsMjI4LDIzOSwxMTYsICAyLCAxOCwgNDEsIDE4LCA1MCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCi0gICAgIDMwLCA2NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDY2LDIyOSwyMzgsMjI1LDI0MiwyMzcsMjI5LAotICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwKLSAgICAxMjgsMjU1LCA0NSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTA5LDI0NCwyNDUsMjQyLDIzOCwyMjksCi0gICAgMTAwLDEyOCwgIDEsMTU2LDExNywxMjgsICAzLDE1NiwgNzgsMTQxLCAgMCwgNzgsIDE4LDEzNCwgMTgsMTM4LAotICAgICAxOCwxNDYsIDE4LDIxMiwgMTgsMjM3LCAxOCwyNDgsIDE5LCAgMywgMTksIDIxLCAxOSwgMzMsIDE5LCA0NSwKLSAgICAgMTksIDU4LCAxOSwgNjYsIDE5LCA4NCwgNzQsMTI4LCAgMSwyMDIsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsCi0gICAgICAxLCA2NywgOTksICA0LCAxOCwxNTYsIDE4LDE2MywgMTgsMTcyLCAxOCwxOTksMjI1LDI0MiwyMzksMTEwLAotICAgIDEyOCwgIDEsIDcxLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDY5LDIzMywyNDIsIDk5LCAgMiwKLSAgICAgMTgsMTgwLCAxOCwxODUsMjM2LDEwMSwxMjgsIDM2LDE5NSwyNDUsMjM3LDIzMCwyMzYsMjI5LDI0OCwyMjYsCi0gICAgMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDc0LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LAotICAgIDExNiwxMjgsICAxLCA2OSwyMjgsMjM5LDExNiwgIDIsIDE4LDIyMCwgMTgsMjI5LDIyNSwyMjcsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgMzAsIDY4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNzAsMjMyLDIzOSwyMzksCi0gICAgMjM1LDIzNiwyMjksMjMwLDExNiwxMjgsICAxLDE1NywyMzMsMjM4LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLAotICAgIDEyOCwgMzMsMTA0LDEwNiwxMjksICAxLDIwMywgMTksICA5LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsIDEwLDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsCi0gICAgIDcyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQ2LDIzOSwyNDcsMjI1LAotICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3MCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKLSAgICAyNDcsMTEwLDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI5LCAgMCwyMDksIDE5LCA3NiwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNDcsMjQxLDExNywxMjgsICAzLDE1NywgNzksMTQxLCAgMCwgNzksIDE5LDExOCwgMTksMTMyLAotICAgICAxOSwxNTAsIDE5LDIwMywgMjAsIDc4LCAyMCwxNTIsIDIwLDE4NywgMjEsIDQ4LCAyMSwgNjksIDIxLDIxMywKLSAgICAgMjEsMjIzLCAyMSwyNTQsIDIyLCA1MywgNjksMTI5LCAgMSwgODIsIDE5LDEyNCwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNDYsMjUwLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI5LCAgMCwyMTEsIDE5LDE0MiwyNDMsMjM3LAotICAgIDIyNSwyMzYsMTA4LDEyOCwyNDcsMjQzLCA5OCwgIDIsIDE5LDE1NiwgMTksMTk2LDIyNSwyNDIsMjQyLDIyOSwKLSAgICAxMDAsICAyLCAxOSwxNjYsIDE5LDE3NywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMjMyLDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LDIzNCwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMSwgNzgsIDk5LCAgNCwgMTksMjEzLCAxOSwKLSAgICAyMjAsIDE5LDIzNSwgMjAsIDY4LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIwOSwyMjksMjM4LDI0NCwyMjksCi0gICAgMjQyLDIyOSwyMjgsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsICAxLDE1OSwyMzMsMjQyLCA5OSwgIDIsIDE5LAotICAgIDI0MywgMTksMjQ4LDIzNiwxMDEsMTI4LCAzNiwxOTYsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTM0LCAgMCwKLSAgICAyMTIsIDIwLCAxMywgMjAsIDIxLCAyMCwgMzIsIDIwLCA0MCwgMjAsIDUyLCAyMCwgNjAsMjI1LDIyNywyNDUsCi0gICAgMjQ0LDEwMSwxMjgsIDMwLDIwOCwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjE2LAotICAgIDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwyMTAsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwKLSAgICAxMDEsMTI4LCAzMCwyMTIsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0NCwyNDQsMjMzLDIzNiwyMjgsCi0gICAgMTAxLDEyOCwgMzAsMjE0LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAzMCwxMDAsICAzLAotICAgICAyMCwgODYsIDIwLDEwOSwgMjAsMTQyLDIyNiwxMDgsICAyLCAyMCwgOTMsIDIwLDEwMSwyMjUsMjI3LDI0NSwKLSAgICAyNDQsMTAxLDEyOCwgIDEsIDgwLDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgMTIsMjMzLDIyOSwyNDIsCi0gICAgMjI5LDI0MywyMzMsMTE1LDEzMCwgIDAsMjE0LCAyMCwxMjMsIDIwLDEzNCwyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMjMwLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDYsMjM5LDI0NCwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjA0LDEwMywgIDIsIDIwLDE1OCwgMjAsMTcwLDIzOSwyMzgsCi0gICAgMjI5LDIzNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjUxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLAotICAgIDIxMCwgMjAsMTc5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDIsMTA0LCAgNCwgMjAsMTk3LCAyMCwKLSAgICAyMDgsIDIwLDIxMiwgMjEsIDM0LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgODUsCi0gICAgMTA5LDEyOCwgMzMsIDM4LDExMSwgIDIsIDIwLDIxOCwgMjAsMjI4LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LAotICAgIDEwMSwxMjgsIDMwLDIwNiwyNDIsMTEwLDEzMywgIDEsMTYwLCAyMCwyNDMsIDIwLDI1MSwgMjEsICA2LCAyMSwKLSAgICAgMTQsIDIxLCAyNiwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjE4LDIyOCwyMzksMjQ0LDIyNiwyMjksCi0gICAgMjM2LDIzOSwxMTksMTI4LCAzMCwyMjYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIyMCwyMzIsMjM5LAotICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIyMiwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwKLSAgICAgMzAsMjI0LDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwxMTYsMTI4LCAgMSwgODAsCi0gICAgMTA1LDEyOSwgIDEsMTYyLCAyMSwgNTQsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgMTQsMTA5LCAgNCwgMjEsIDc5LCAyMSwxMDcsIDIxLDE4NCwgMjEsMjAyLDIyNSwKLSAgICAyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwgNzYsIDIxLCA5MSwgMjEsIDk5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsCi0gICAgMTI4LCAzMCwgODIsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLCA4MCwyMjksMjMxLCA5NywxMzIsIDMzLAotICAgICAzOCwgMjEsMTIxLCAyMSwxMzIsIDIxLDE0MCwgMjEsMTU2LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwgOTYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDE2OSwyNDIsMjM5LDI0NSwyMzgsCi0gICAgMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjIsMTE2LCAgMiwgMjEsMTYyLAotICAgICAyMSwxNzcsMjMzLDI0NCwyMzYsMjM5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxMjQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTQzLDIzMywyMjcsMjQyLDIzOSwxMTAsMTI5LCAgMywxNTksCi0gICAgIDIxLDE5NCwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTQwLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAotICAgIDIyNywxMDEsMTI4LDI1NSwgNDcsMjM4LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsIDk2LDExMSwKLSAgICAgIDIsIDIxLDIyOSwgMjEsMjQ4LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI5LCAgMSwyMzQsIDIxLDIzOSwyMzcsCi0gICAgMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIzNiwyNDAsMjI5LDExMCwxMjgsICAxLDEzNCwxMTUsICAzLAotICAgICAyMiwgIDYsIDIyLCAzMywgMjIsIDQwLDIzNiwyMjUsMjQzLDEwNCwxMzAsICAwLDIxNiwgMjIsIDE3LCAyMiwKLSAgICAgMjUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1NCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsCi0gICAgMjQ4LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExMSwyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNSwyMjcsMjQ1LAotICAgIDI0NCwxMDEsMTI4LCAgMSwyNTQsMTE2LCAgMiwgMjIsIDU5LCAyMiwgNzAsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDEyNiwyMzMsMjM2LDIyOCwxMDEsMTMxLCAgMCwyMTMsIDIyLCA4MywgMjIsCi0gICAgIDkxLCAyMiwxMDIsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA3NiwyMjgsMjMzLDIyOSwyNDIsMjI5LAotICAgIDI0MywyMzMsMTE1LDEyOCwgMzAsIDc4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDUsIDgwLDEzNiwKLSAgICAgIDAsIDgwLCAyMiwxMzAsIDIyLDEzOCwgMjIsMTQ3LCAyMiwxNTksIDIyLDIxMSwgMjIsMjI3LCAyMiwyNDYsCi0gICAgIDIzLCAgMiwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDg0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLAotICAgIDEyOCwgMzYsMTk3LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDg2LDEwMSwKLSAgICAgIDMsIDIyLDE2NywgMjIsMTc4LCAyMiwxOTAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LCAzMSwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3NCwyMzcsMjMzLAotICAgIDIyOCwyMjgsMjM2LDIyOSwyMzIsMjM5LDIzOSwyMzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LDE2NiwxMDQsICAyLCAyMiwyMTcsIDIyLDIyMSwxMDUsMTI4LCAgMywxNjYsMjM5LDIzOSwxMDcsCi0gICAgMTI4LCAgMSwxNjQsMTA1LDEyOSwgIDMsMTYwLCAyMiwyMzMsMjQ3LDI0MiwyMjUsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDgzLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsIDQ4LDExNSwgIDIsIDIzLCAgOCwgMjMsIDI1LDEwNSwxMjksICAzLDE2OCwgMjMsIDE0LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTIsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTEyLAotICAgICA4MSwxMzEsICAwLCA4MSwgMjMsIDQyLCAyMywgNTEsIDIzLCA2MywyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwKLSAgICAxMjgsIDM2LDE5OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA0OSwyNDMsCi0gICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTEzLCA4MiwxMzgsICAwLCA4MiwgMjMsIDk1LCAyMywxMTksIDIzLAotICAgIDE2NiwgMjMsMjE3LCAyMywyMzAsIDIzLDI0MCwgMjMsMjQ1LCAyNCwgMTksIDI0LCAzMSwgMjQsIDQzLCA5NywKLSAgICAgIDIsIDIzLDEwMSwgMjMsMTEyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzYsCi0gICAgMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsIDg0LCA5OSwgIDQsIDIzLDEyOSwgMjMsMTM2LCAyMywxNDUsIDIzLAotICAgIDE1MywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgODgsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwKLSAgICAgODYsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDE5OSwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsCi0gICAgMjI5LDIzOCwxMTYsMTI4LCAgMSwgODYsMTAwLCAgMiwgMjMsMTcyLCAyMywxODIsMjI2LDIzNiwyMzEsMjQyLAotICAgIDIyNSwyNDYsMTAxLDEyOCwgIDIsIDE2LDIzOSwxMTYsICAyLCAyMywxODksIDIzLDE5OCwyMjUsMjI3LDIyNywKLSAgICAyMjksMjM4LDExNiwxMjgsIDMwLCA4OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsIDkwLCAyMywyMDgsCi0gICAgMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAzMCwgOTIsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDgwLDIzMCwyNDIsMjI1LDIzNSwyNDQsMjQ1LDExNCwxMjgsIDMzLCAyOCwKLSAgICAyMzIsMTExLDEyOCwgIDMsMTYxLDIzMywxMTAsICAyLCAyMywyNTIsIDI0LCAgNSwyMzEsMjQzLDIzNywyMjUsCi0gICAgMjM2LDEwOCwxMjgsMjQ2LDI1MiwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLDIyOSwyNDYsMTAxLAotICAgIDEyOCwgIDIsIDE4LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDk0LDIzNywKLSAgICAyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDUwLDI0MywyMzcsMjI1LDIzNiwxMDgsCi0gICAgMTI5LDI0NywxMTQsIDI0LCA1MywyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMTAwLDEyOSwgIDIsMTI5LAotICAgICAyNCwgNjYsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDE4MiwgODMsMTM5LCAgMCwKLSAgICAgODMsIDI0LDEwMywgMjYsIDE3LCAyNiwgNTUsIDI2LDE4MiwgMjYsMjIxLCAyNiwyNTAsIDI3LCA4NCwgMjcsCi0gICAgMTA1LCAyNywxMTcsIDI3LDEzNSwgMjcsMTQzLCA3MCwgIDYsIDI0LDExNywgMjQsMjA5LCAyNCwyNDEsIDI1LAotICAgICA3NywgMjUsMTE5LCAyNSwyMjEsIDQ4LCAgOSwgMjQsMTM3LCAyNCwxNDUsIDI0LDE1MywgMjQsMTYxLCAyNCwKLSAgICAxNjksIDI0LDE3NywgMjQsMTg1LCAyNCwxOTMsIDI0LDIwMSwxNzcsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDEyLDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgMjAsMTc5LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICAxNiwxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDI0LDE4MSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgNjAsMTgyLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA0NCwxODMsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDUyLDE4NCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgMjgsMTg1LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICAzNiwgNDksICAzLCAyNCwyMTcsIDI0LDIyNSwgMjQsMjMzLDE3NiwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgIDAsMTc3LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCAgMiwxODUsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDk3LCA1MCwgIDksIDI1LCAgNSwgMjUsIDEzLCAyNSwgMjEsIDI1LCAyOSwgMjUsIDM3LCAyNSwgNDUsIDI1LAotICAgICA1MywgMjUsIDYxLCAyNSwgNjksMTc2LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5OCwxNzcsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsIDg2LDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODUsMTc5LDE3NiwxNzYsCi0gICAgMTc2LCA0OCwxMjgsIDM3LCA5OSwxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDgxLDE4MSwxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywgODcsMTgyLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5MywxODMsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsIDkyLDE4NCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgOTEsIDUxLCAgNCwgMjUsCi0gICAgIDg3LCAyNSwgOTUsIDI1LDEwMywgMjUsMTExLDE4MiwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgOTQsMTgzLAotICAgIDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5NSwxODQsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDkwLDE4NSwKLSAgICAxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODQsIDUyLCAxMCwgMjUsMTQxLCAyNSwxNDksIDI1LDE1NywgMjUsCi0gICAgMTY1LCAyNSwxNzMsIDI1LDE4MSwgMjUsMTg5LCAyNSwxOTcsIDI1LDIwNSwgMjUsMjEzLDE3NiwxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywxMDUsMTc3LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwMiwxNzgsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsIDk2LDE3OSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODAsMTgwLDE3NiwxNzYsCi0gICAgMTc2LCA0OCwxMjgsIDM3LDEwOCwxODEsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsMTAzLDE4MiwxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywxMDQsMTgzLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwMCwxODQsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsMTAxLDE4NSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODksIDUzLCAgNSwgMjUsCi0gICAgMjMzLCAyNSwyNDEsIDI1LDI0OSwgMjYsICAxLCAyNiwgIDksMTc2LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICA4OCwxNzcsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDgyLDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgODMsMTc5LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwNywxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgMTA2LCA5NywgIDIsIDI2LCAyMywgMjYsIDQ0LDIyNywyNDUsMjQ0LDEwMSwxMjksICAxLCA5MCwgMjYsIDMyLAotICAgIDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTAwLDIzNywyNDAsMjMzLDIzMSwKLSAgICAyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMjQsIDk5LCAgNSwgMjYsIDY3LCAyNiwgOTgsIDI2LDEwNywgMjYsCi0gICAgMTQ3LCAyNiwxNjksMjI1LDI0MiwyMzksMTEwLDEzMCwgIDEsIDk2LCAyNiwgNzgsIDI2LCA5MCwyMjgsMjM5LAotICAgIDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEwMiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKLSAgICAyNDYsMjUzLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDk0LDIzMiwyNDcsIDk3LDEzMCwgIDEsCi0gICAgMTQzLCAyNiwxMTcsIDI2LDEyOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjE2LAotICAgIDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LDIxOCwyMzMsMjQyLCA5OSwgIDIsIDI2LDE1NSwgMjYsMTYwLDIzNiwxMDEsMTI4LCAzNiwyMDAsCi0gICAgMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwgOTIsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LAotICAgIDIyOSwyMzgsMTE2LDEyOCwgIDIsIDI0LDIyOCwyMzksMTE2LCAgMiwgMjYsMTkwLCAyNiwxOTksMjI1LDIyNywKLSAgICAyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgOTYsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjksIDMwLCA5OCwgMjYsCi0gICAgMjA5LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTA0LDEwMSwgIDIsIDI2LAotICAgIDIyNywgMjYsMjM5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDc3LDI0NiwKLSAgICAyMjksMjM4LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDIsMTA0LCAgNSwgMjcsICA2LCAyNywgMzQsCi0gICAgIDI3LCA0OCwgMjcsIDU5LCAyNywgNzIsIDk3LCAgMiwgMjcsIDEyLCAyNywgMjMsMjI1LDI0MiwyMzcsMjI5LAotICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3MSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDQwLDIyNywyMzIsMjI1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDEsCi0gICAgMjI5LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIyNiwyMzIsMjI1LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODYsMjMzLDIzNywyMjUsMjI3LDIzOSwyNDAsMjQ0LDIzMywKLSAgICAgOTksMTI4LCAgMywyMzYsMTA1LCAgMiwgMjcsIDkwLCAyNywgOTYsMjMxLDIzNywgOTcsMTI4LCAgMywxNjMsCi0gICAgMjQ4LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAotICAgIDIyNywxMDEsMTI4LDI1NSwgNTEsMjM5LDIzMCwyNDQsMjQzLDIzMywyMzEsMjM4LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDQsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExNSwyNDQsCi0gICAgMjMzLDIzMSwyMzcsMjI1LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMTgsIDg0LDE0MSwgIDAsIDg0LAotICAgICAyNywxODYsIDI3LDE5MSwgMjcsMTk3LCAyOCwgIDcsIDI4LCAzMiwgMjgsIDk2LCAyOCwxNDcsIDI4LDE3NywKLSAgICAgMjgsMTg5LCAyOCwyMDEsIDI4LDI0NiwgMjksICA2LCAyOSwgNDYsMjI1LDExNywxMjgsICAzLDE2NCwyMjYsCi0gICAgMjI1LDExNCwxMjgsICAxLDEwMiwgOTksICA0LCAyNywyMDcsIDI3LDIxNCwgMjcsMjIzLCAyNywyNTAsMjI1LAotICAgIDI0MiwyMzksMTEwLDEyOCwgIDEsMTAwLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDk4LDIzMywKLSAgICAyNDIsIDk5LCAgMiwgMjcsMjMxLCAyNywyMzYsMjM2LDEwMSwxMjgsIDM2LDIwMSwyNDUsMjM3LDIzMCwyMzYsCi0gICAgMjI5LDI0OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTEyLDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LAotICAgIDIyNywyMjksMjM4LDExNiwxMjgsICAxLCA5OCwyMjgsMjM5LDExNiwgIDIsIDI4LCAxNSwgMjgsIDI0LDIyNSwKLSAgICAyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTA2LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMDgsCi0gICAgMTAxLCAgNCwgMjgsIDQyLCAyOCwgNTMsIDI4LCA3MywgMjgsIDgyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwgMzQsMjI4LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3MiwyMzgsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsCi0gICAgIDMzLDEwNSwyNDQsMjQzLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTgwLAotICAgIDEwNCwgIDMsIDI4LDEwNCwgMjgsMTEwLCAyOCwxMzYsMjI5LDI0NCwgOTcsMTI4LCAgMywxNTIsMTExLCAgMiwKLSAgICAgMjgsMTE2LCAyOCwxMjEsMjM5LDEwNywxMjgsICAxLDE3MiwyNDIsMTEwLDEyOSwgIDAsMjIyLCAyOCwxMjgsCi0gICAgMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1NCwyNDIsMjI5LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLAotICAgIDEyOCwgMzMsIDk4LDEwNSwgIDIsIDI4LDE1MywgMjgsMTY0LDIzNiwyMjgsMjI5LDI0MywyMzcsMjI1LDIzNiwKLSAgICAxMDgsMTI4LDI0NiwyNTQsMjQ3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCi0gICAgIDc5LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTEwLDIzNywyMzksMjM4LAotICAgIDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDUyLDExMSwgIDIsIDI4LDIwNywgMjgsMjE4LDIyNSwKLSAgICAyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTcsMjM4LDEwMSwgIDMsIDI4LDIyNywgMjgsCi0gICAgMjM0LCAyOCwyNDAsMjMwLDIzMywyNDYsMTAxLDEyOCwgIDEsMTg4LDI0MywyMzMsMTIwLDEyOCwgIDEsMTMyLAotICAgIDI0NCwyNDcsMTExLDEyOCwgIDEsMTY3LDI0MiwyMjksMjQ0LDI0MiwyMzksMjMwLDIzNiwyMjksMjQ4LDIzMiwKLSAgICAyMzksMjM5LDEwNywxMjgsICAxLDE3NCwxMTUsICAzLCAyOSwgMTQsIDI5LCAyNiwgMjksIDM5LDIyOSwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDM4LDIzMiwyMjksMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxMSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMTYsMTE5LCAgMiwKLSAgICAgMjksIDUyLCAyOSwgNjQsMjI5LDIzNiwyNDYsMjI5LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDcsCi0gICAgMjM5LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywgOTcsIDg1LDE0MiwgIDAsIDg1LCAyOSwxMDUsIDI5LAotICAgIDEyMywgMjksMTMxLCAyOSwxOTgsIDMwLCA2OSwgMzAsIDg3LCAzMCwxOTgsIDMwLDIxNCwgMzAsMjI2LCAzMSwKLSAgICAgMjEsIDMxLCAzMCwgMzEsMTQyLCAzMSwxNDksIDMxLDIxOSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDAsCi0gICAgMjE4LCAyOSwxMTUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MCwyMjYsMjQyLDIyOSwyNDYsMTAxLAotICAgIDEyOCwgIDEsMTA4LCA5OSwgIDMsIDI5LDEzOSwgMjksMTQ2LCAyOSwxODgsMjI1LDI0MiwyMzksMTEwLDEyOCwKLSAgICAgIDEsMjExLDIzMywyNDIsIDk5LCAgMiwgMjksMTU0LCAyOSwxNTksMjM2LDEwMSwxMjgsIDM2LDIwMiwyNDUsCi0gICAgMjM3LDIzMCwyMzYsMjI5LDEyMCwxMzAsICAwLDIxOSwgMjksMTcyLCAyOSwxODAsMjI2LDIyOSwyMzYsMjM5LAotICAgIDExOSwxMjgsIDMwLDExOCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjUxLDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCAzNSwxMDAsICAzLCAyOSwyMDYsIDI5LDIyOSwgMzAsIDU5LDIyNiwxMDgsCi0gICAgICAyLCAyOSwyMTMsIDI5LDIyMSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMTEyLDIzMSwyNDIsMjI1LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgMjAsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEzNCwgIDAsMjIwLCAyOSwKLSAgICAyNTEsIDMwLCAgMywgMzAsIDExLCAzMCwgMzQsIDMwLCA0MiwgMzAsIDUxLDIyNSwyMjcsMjQ1LDI0NCwxMDEsCi0gICAgMTI4LCAgMSwyMTUsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExNCwgOTksICAyLCAzMCwgMTcsIDMwLAotICAgICAyNCwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMTcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMjQwLDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMSwyMTksMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsCi0gICAgMTI4LCAgMSwyMTMsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MiwyMzksMjQ0LDIyNiwyMjksMjM2LAotICAgIDIzOSwxMTksMTI4LCAzMCwyMjgsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLDIxNywgMzAsIDc5LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDksMTA0LCAgMiwgMzAsIDkzLCAzMCwxNzEsMTExLCAgMiwgMzAsCi0gICAgIDk5LCAzMCwxMDksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjMwLDI0MiwxMTAsMTMzLAotICAgICAgMSwxNzUsIDMwLDEyNCwgMzAsMTMyLCAzMCwxNDMsIDMwLDE1MSwgMzAsMTYzLDIyNSwyMjcsMjQ1LDI0NCwKLSAgICAxMDEsMTI4LCAzMCwyMzIsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDI0MCwyMzEsCi0gICAgMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMjM0LDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLAotICAgIDEyOCwgMzAsMjM2LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwyMzgsMjQ1LDIzOCwyMzEsMjI1LDI0MiwKLSAgICAyNDUsMjM3LDIzNiwyMjUsMjQ1LDExNiwxMjksICAxLDExMiwgMzAsMTg3LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwyNDIsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLAotICAgIDIyOSwyNDYsMTAxLDEyOCwgIDIsIDIyLDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTIwLDEwOSwgIDIsIDMwLDIzMiwgMzEsIDEwLDIyNSwyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwxMDYsCi0gICAgIDMwLDI0NCwgMzAsMjU1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMzgsMjI4LAotICAgIDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsIDMwLDEyMiwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsIDUzLDIzOSwyMzEsMjM5LDIzOCwyMjksMTA3LDEyOCwgIDEsMTE0LDI0MCwyNDMsCi0gICAgMjMzLDIzNiwyMzksMTEwLDEzMywgIDMsMTY1LCAzMSwgNDksIDMxLCA1MywgMzEsIDkwLCAzMSwxMjEsIDMxLAotICAgIDEzNCwgNDksMTI4LCAgMywyMTAsIDk3LCAgMiwgMzEsIDU5LCAzMSwgODEsMjI3LDI0NSwyNDQsMjI5LDIzMiwKLSAgICAyMzksMjM5LDIzNSwyNDMsMjQ5LDIzNywyMjYsMjM5LDIzNiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsCi0gICAgMjExLDIzMCwyNDIsMjMzLDIyNywyMjUsMTEwLDEyOCwgIDEsMTc3LDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLAotICAgIDIzMywxMTUsMTI5LCAgMywxNzEsIDMxLDEwMywyMzIsMjM5LDIzOSwyMzUsMjQzLDI0OSwyMzcsMjI2LDIzOSwKLSAgICAyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIxMiwyMzIsMjM5LDIzOSwyMzUsMjQzLDI0OSwyMzcsCi0gICAgMjI2LDIzOSwxMDgsMTI4LCAgMywyMTAsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDE0MiwyNDIsMjMzLAotICAgIDIzOCwxMDMsMTI4LCAgMSwxMTAsMTE1LCAgMywgMzEsMTU3LCAzMSwxNzIsIDMxLDE3OSwyMzIsMjM5LDI0MiwKLSAgICAyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxNCwyMzcsMjI1LDIzNiwxMDgsCi0gICAgMTI4LDI0NywxMTcsMjQ0LDI0MiwyMjUsMjMzLDIzMSwyMzIsMTE2LCAgMiwgMzEsMTkxLCAzMSwyMDIsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3NCwyNDMsMjQ0LDI0MiwyMzksMjM1LDIyOSwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTc2LDI0NCwyMzMsMjM2LDIyOCwxMDEsCi0gICAgMTMwLCAgMSwxMDQsIDMxLDIzMSwgMzEsMjM5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxMjAsMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExNiwgODYsMTM2LCAgMCwgODYsIDMyLCAxMSwgMzIsIDIwLCAzMiwKLSAgICAgMzEsIDMyLCA2MCwgMzIsIDY3LCAzMiwgNzksIDMyLCA5MSwgMzIsIDk5LDIyNywyMzMsMjQyLDIyNywyMzYsCi0gICAgMTAxLDEyOCwgMzYsMjAzLDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMjYsMTAxLAotICAgICAgMiwgMzIsIDM3LCAzMiwgNDgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxOCwKLSAgICAyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3OCwyMzIsMjM5LDIzOSwxMDcsCi0gICAgMTI4LCAgMSwxNzgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNTQsMjM5LAotICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzIsMjQzLDIzNywyMjUsMjM2LDEwOCwKLSAgICAxMjgsMjQ3LDExOCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTI0LCA4NywxMzQsICAwLCA4NywgMzIsCi0gICAgMTIzLCAzMiwxMzEsIDMyLDE1NCwgMzIsMTk0LCAzMiwyMDIsIDMyLDIxNCwyMjUsMjI3LDI0NSwyNDQsMTAxLAotICAgIDEyOCwgMzAsMTMwLDIyNywyMzMsMjQyLCA5OSwgIDIsIDMyLDE0MCwgMzIsMTQ1LDIzNiwxMDEsMTI4LCAzNiwKLSAgICAyMDQsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwxMTYsMTAwLCAgMiwgMzIsMTYwLCAzMiwxNzAsCi0gICAgMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsMTMyLDIzOSwxMTYsICAyLCAzMiwxNzcsIDMyLAotICAgIDE4NiwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEzNCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKLSAgICAgMzAsMTM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwxMjgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsCi0gICAgMjI1LDIyNywxMDEsMTI4LDI1NSwgNTUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExOSwgODgsMTM0LAotICAgICAgMCwgODgsIDMyLDIzOCwgMzIsMjQ3LCAzMywgMTgsIDMzLCAzMSwgMzMsIDM1LCAzMywgNDcsMjI3LDIzMywKLSAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMDUsMTAwLCAgMiwgMzIsMjUzLCAzMywgIDcsMjMzLDIyOSwyNDIsCi0gICAgMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsMTQwLDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAotICAgICAzMCwxMzgsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDYxLDEwNSwKLSAgICAxMjgsICAzLDE1OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA1NiwyNDMsCi0gICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTIwLCA4OSwxMzksICAwLCA4OSwgMzMsIDgxLCAzMywxMTYsIDMzLAotICAgIDEzOSwgMzMsMTg5LCAzMywyMjgsIDMzLDIzNiwgMzMsMjUzLCAzNCwgNDAsIDM0LCA1MiwgMzQsIDYwLCAzNCwKLSAgICAgNjgsIDk3LCAgMiwgMzMsIDg3LCAzMywxMDQsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDAsMjIxLCAzMywgOTYsCi0gICAgMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MywyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCA5OCwyMjcsMjMzLDI0MiwgOTksICAyLCAzMywxMjUsIDMzLDEzMCwyMzYsMTAxLDEyOCwKLSAgICAgMzYsMjA2LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsMTE4LDEwMCwgIDIsIDMzLDE0NSwgMzMsCi0gICAgMTY1LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjksICAxLDEyMCwgMzMsMTU3LDI0MywyMzcsMjI1LAotICAgIDIzNiwxMDgsMTI4LDI0NywyNTUsMjM5LDExNiwgIDIsIDMzLDE3MiwgMzMsMTgxLDIyNSwyMjcsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgMzAsMTQyLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyNDQsMjI5LDExNCwgIDIsCi0gICAgIDMzLDE5NiwgMzMsMjA4LDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDQzLAotICAgIDI0NSwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwyNDgsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDI0MiwyMzIsMjM5LDIzOSwxMDcsCi0gICAgMTI5LCAgMSwxNzksIDMzLDI0NSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjQ2LDEwNSwgIDMsIDM0LAotICAgICAgNSwgMzQsIDE2LCAzNCwgMjcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2OSwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsICA3LDI0NywyMzgsMjI1LDI0MiwyMzcsCi0gICAgMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA4MiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCA1NywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTIxLDI0NCwyMzMsMjM2LDIyOCwKLSAgICAxMDEsMTI4LCAzMCwyNDgsMjQ1LDExNSwgIDIsIDM0LCA3NSwgMzQsMTEzLDIyNiwyMzMsMTAzLCAgMiwgMzQsCi0gICAgIDgzLCAzNCwgOTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNiwyMzMsMjM5LAotICAgIDI0NCwyMzMsMjMwLDIzMywyMjksMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxMDgsMjM2LDIzMywyNDQsMjQ0LDIzNiwxMDEsICAyLCAzNCwxMjQsIDM0LDEzNSwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTAyLDIzMywyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNCwgOTAsMTM2LCAgMCwgOTAsIDM0LDE3NCwKLSAgICAgMzQsMTk4LCAzNCwyNDMsIDM1LCAxNCwgMzUsIDgxLCAzNSwxNzMsIDM1LDE4NSwgMzUsMTk3LCA5NywgIDIsCi0gICAgIDM0LDE4MCwgMzQsMTkxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTQsMjI3LAotICAgIDI0NSwyNDQsMTAxLDEyOCwgIDEsMTIxLCA5OSwgIDIsIDM0LDIwNCwgMzQsMjIxLDIyNSwyNDIsMjM5LDExMCwKLSAgICAxMjksICAxLDEyNSwgMzQsMjEzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNTUsMjMzLDI0MiwgOTksCi0gICAgICAyLCAzNCwyMjksIDM0LDIzNCwyMzYsMTAxLDEyOCwgMzYsMjA3LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLAotICAgIDEyOCwgMzAsMTQ0LDIyOCwyMzksMTE2LDEzMCwgIDEsMTIzLCAzNCwyNTMsIDM1LCAgNiwyMjUsMjI3LDIyNywKLSAgICAyMjksMjM4LDExNiwxMjgsICAxLDEyMywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTQ2LDEwMSwgIDMsCi0gICAgIDM1LCAyMiwgMzUsIDMzLCAzNSwgNzYsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICAyMywxMDAsICAyLCAzNSwgMzksIDM1LCA1OCwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTIsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsCi0gICAgMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMjIsMjQ0LCA5NywxMjgsICAzLAotICAgIDE1MCwyMzIsMTAxLCAgNCwgMzUsIDkyLCAzNSwxMDMsIDM1LDExOSwgMzUsMTMwLDIyNSwyNDIsMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTgsMjI2LDI0MiwyMjksMjQ2LDIyOSwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTkzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwgMjIsMTAwLCAgMiwgMzUsMTM2LCAzNSwxNTUsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTUwLDIzMywyMjksMjQyLDIyOSwyNDMsCi0gICAgMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjIwLDIzNiwyMzMsMjM4LAotICAgIDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTQ4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsIDU4LDExNSwgIDIsIDM1LDIwMywgMzUsMjEwLDIzNywyMjUsMjM2LDEwOCwxMjgsCi0gICAgMjQ3LDEyMiwyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMTgxLCA5NywxNTgsICAwLCA5NywgMzYsIDI2LAotICAgICAzOCwxNTQsIDM5LCAgNCwgMzksIDY4LCAzOSwxMzIsIDM5LDE5NiwgNDAsICA0LCA0MCwgNjgsIDQwLDEyNiwKLSAgICAgNDAsMTkwLCA0MSwgNzAsIDQxLDIxNywgNDIsMTM3LCA0MiwyMzcsIDQzLCAxNywgNDksMTkyLCA0OSwyMjksCi0gICAgIDUwLCAgMCwgNTAsMjI1LCA1MSwgIDcsIDUyLCA5NiwgNTIsMTY4LCA1MywxMjMsIDUzLDEzMiwgNTQsICA1LAotICAgICA1NiwgMTMsIDU3LCAgMywgNTcsIDUwLCA1NywyMDEsIDU3LDIxNSwgNDksMTM4LCAzOSwgIDEsIDM2LCA1MCwKLSAgICAgMzYsMTE0LCAzNiwxNTQsIDM2LDIxOCwgMzcsIDI2LCAzNywgOTAsIDM3LDE1NCwgMzcsMjE4LCAzOCwgMjYsCi0gICAgIDM4LCA5MCwgNDgsMTM4LCAzOSwgMzMsIDM2LCA3NCwgMzYsIDc4LCAzNiwgODIsIDM2LCA4NiwgMzYsIDkwLAotICAgICAzNiwgOTQsIDM2LCA5OCwgMzYsMTAyLCAzNiwxMDYsIDM2LDExMCwgNDgsMTI4LCAzOSwgOTQsIDQ5LDEyOCwKLSAgICAgMzksIDk3LCA1MCwxMjgsIDM5LCA5OCwgNTEsMTI4LCAzOSwgOTksIDUyLDEyOCwgMzksMTAwLCA1MywxMjgsCi0gICAgIDM5LCAxNiwgNTQsMTI4LCAzOSwxMDEsIDU1LDEyOCwgMzksMTAyLCA1NiwxMjgsIDM5LDEwMywgNTcsMTI4LAotICAgICAzOCwgOTYsIDQ5LDEzNCwgMzgsIDI3LCAzNiwxMzAsIDM2LDEzNCwgMzYsMTM4LCAzNiwxNDIsIDM2LDE0NiwKLSAgICAgMzYsMTUwLCA0OCwxMjgsIDM4LDEwMSwgNDksMTI4LCAzOCwxMDIsIDUwLDEyOCwgMzgsIDk5LCA1NSwxMjgsCi0gICAgIDM5LCAgOSwgNTYsMTI4LCAzOSwgIDgsIDU3LDEyOCwgMzksICA3LCA1MCwxMzgsIDM4LCAzMCwgMzYsMTc4LAotICAgICAzNiwxODIsIDM2LDE4NiwgMzYsMTkwLCAzNiwxOTQsIDM2LDE5OCwgMzYsMjAyLCAzNiwyMDYsIDM2LDIxMCwKLSAgICAgMzYsMjE0LCA0OCwxMjgsIDM2LCA5NiwgNDksMTI4LCAzNiwgOTcsIDUwLDEyOCwgMzYsIDk4LCA1MSwxMjgsCi0gICAgIDM2LCA5OSwgNTIsMTI4LCAzNiwxMDAsIDUzLDEyOCwgMzYsMTAxLCA1NCwxMjgsIDM2LDEwMiwgNTUsMTI4LAotICAgICAzNiwxMDMsIDU2LDEyOCwgMzYsMTA0LCA1NywxMjgsIDM2LDEwNSwgNTEsMTM4LCAzOSwgMTIsIDM2LDI0MiwKLSAgICAgMzYsMjQ2LCAzNiwyNTAsIDM2LDI1NCwgMzcsICAyLCAzNywgIDYsIDM3LCAxMCwgMzcsIDE0LCAzNywgMTgsCi0gICAgIDM3LCAyMiwgNDgsMTI4LCAzOSwxMTgsIDQ5LDEyOCwgMzksMTE5LCA1MCwxMjgsIDM5LDEyMCwgNTEsMTI4LAotICAgICAzOSwxMjEsIDUyLDEyOCwgMzksMTIyLCA1MywxMjgsIDM5LDEyMywgNTQsMTI4LCAzOSwxMjQsIDU1LDEyOCwKLSAgICAgMzksMTI1LCA1NiwxMjgsIDM5LDEyNiwgNTcsMTI4LCAzOSwxMjcsIDUyLDEzOCwgMzksIDEzLCAzNywgNTAsCi0gICAgIDM3LCA1NCwgMzcsIDU4LCAzNywgNjIsIDM3LCA2NiwgMzcsIDcwLCAzNywgNzQsIDM3LCA3OCwgMzcsIDgyLAotICAgICAzNywgODYsIDQ4LDEyOCwgMzksMTI4LCA0OSwxMjgsIDM5LDEyOSwgNTAsMTI4LCAzOSwxMzAsIDUxLDEyOCwKLSAgICAgMzksMTMxLCA1MiwxMjgsIDM5LDEzMiwgNTMsMTI4LCAzOSwxMzMsIDU0LDEyOCwgMzksMTM0LCA1NSwxMjgsCi0gICAgIDM5LDEzNSwgNTYsMTI4LCAzOSwxMzYsIDU3LDEyOCwgMzksMTM3LCA1MywxMzgsIDM5LCAxNCwgMzcsMTE0LAotICAgICAzNywxMTgsIDM3LDEyMiwgMzcsMTI2LCAzNywxMzAsIDM3LDEzNCwgMzcsMTM4LCAzNywxNDIsIDM3LDE0NiwKLSAgICAgMzcsMTUwLCA0OCwxMjgsIDM5LDEzOCwgNDksMTI4LCAzOSwxMzksIDUwLDEyOCwgMzksMTQwLCA1MSwxMjgsCi0gICAgIDM5LDE0MSwgNTIsMTI4LCAzOSwxNDIsIDUzLDEyOCwgMzksMTQzLCA1NCwxMjgsIDM5LDE0NCwgNTUsMTI4LAotICAgICAzOSwxNDUsIDU2LDEyOCwgMzksMTQ2LCA1NywxMjgsIDM5LDE0NywgNTQsMTM4LCAzOSwgMTUsIDM3LDE3OCwKLSAgICAgMzcsMTgyLCAzNywxODYsIDM3LDE5MCwgMzcsMTk0LCAzNywxOTgsIDM3LDIwMiwgMzcsMjA2LCAzNywyMTAsCi0gICAgIDM3LDIxNCwgNDgsMTI4LCAzOSwxNDgsIDQ5LDEyOCwgMzMsMTQ2LCA1MCwxMjgsIDM5LDE2MywgNTEsMTI4LAotICAgICAzMywxNDgsIDUyLDEyOCwgMzMsMTQ5LCA1MywxMjgsIDM5LDE1MywgNTQsMTI4LCAzOSwxNTUsIDU1LDEyOCwKLSAgICAgMzksMTU2LCA1NiwxMjgsIDM5LDE1NywgNTcsMTI4LCAzOSwxNTgsIDU1LDEzOCwgMzksIDE3LCAzNywyNDIsCi0gICAgIDM3LDI0NiwgMzcsMjUwLCAzNywyNTQsIDM4LCAgMiwgMzgsICA2LCAzOCwgMTAsIDM4LCAxNCwgMzgsIDE4LAotICAgICAzOCwgMjIsIDQ4LDEyOCwgMzksMTU5LCA0OSwxMjgsIDM5LDE2MCwgNTAsMTI4LCAzOSwxNjEsIDUxLDEyOCwKLSAgICAgMzksMTYyLCA1MiwxMjgsIDM5LDE2NCwgNTMsMTI4LCAzOSwxNjUsIDU0LDEyOCwgMzksMTY2LCA1NSwxMjgsCi0gICAgIDM5LDE2NywgNTYsMTI4LCAzOSwxNjgsIDU3LDEyOCwgMzksMTY5LCA1NiwxMzgsIDM5LCAxOCwgMzgsIDUwLAotICAgICAzOCwgNTQsIDM4LCA1OCwgMzgsIDYyLCAzOCwgNjYsIDM4LCA3MCwgMzgsIDc0LCAzOCwgNzgsIDM4LCA4MiwKLSAgICAgMzgsIDg2LCA0OCwxMjgsIDM5LDE3MSwgNDksMTI4LCAzOSwxNzMsIDUwLDEyOCwgMzksMTc1LCA1MSwxMjgsCi0gICAgIDM5LDE3OCwgNTIsMTI4LCAzOSwxNzksIDUzLDEyOCwgMzksMTgxLCA1NCwxMjgsIDM5LDE4NCwgNTUsMTI4LAotICAgICAzOSwxODYsIDU2LDEyOCwgMzksMTg3LCA1NywxMjgsIDM5LDE4OCwgNTcsMTM4LCAzOSwgMTksIDM4LDExNCwKLSAgICAgMzgsMTE4LCAzOCwxMjIsIDM4LDEyNiwgMzgsMTMwLCAzOCwxMzQsIDM4LDEzOCwgMzgsMTQyLCAzOCwxNDYsCi0gICAgIDM4LDE1MCwgNDgsMTI4LCAzOSwxODksIDQ5LDEyOCwgMzksMTkwLCA1MCwxMjgsIDM5LDE1NCwgNTEsMTI4LAotICAgICAzOSwxNzAsIDUyLDEyOCwgMzksMTgyLCA1MywxMjgsIDM5LDE4NSwgNTQsMTI4LCAzOSwxNTIsIDU1LDEyOCwKLSAgICAgMzksMTgwLCA1NiwxMjgsIDM5LDE4MywgNTcsMTI4LCAzOSwxNzIsIDUwLDEzOCwgMzksICAyLCAzOCwxNzgsCi0gICAgIDM4LDIyNCwgMzgsMjI4LCAzOCwyMzIsIDM4LDIzNiwgMzgsMjQwLCAzOCwyNDQsIDM4LDI0OCwgMzgsMjUyLAotICAgICAzOSwgIDAsIDQ4LDEzNSwgMzksIDIwLCAzOCwxOTYsIDM4LDIwMCwgMzgsMjA0LCAzOCwyMDgsIDM4LDIxMiwKLSAgICAgMzgsMjE2LCAzOCwyMjAsIDQ4LDEyOCwgMzksMTc0LCA0OSwxMjgsIDM5LDE3NywgNTAsMTI4LCAzOSwgIDMsCi0gICAgIDUxLDEyOCwgMzksIDgwLCA1MiwxMjgsIDM5LCA4MiwgNTMsMTI4LCAzOSwxMTAsIDU0LDEyOCwgMzksMTEyLAotICAgICA0OSwxMjgsIDM5LCAyMSwgNTAsMTI4LCAzOSwgMjIsIDUxLDEyOCwgMzksIDIzLCA1MiwxMjgsIDM5LCAyNCwKLSAgICAgNTMsMTI4LCAzOSwgMjUsIDU0LDEyOCwgMzksIDI2LCA1NSwxMjgsIDM5LCAyNywgNTYsMTI4LCAzOSwgMjgsCi0gICAgIDU3LDEyOCwgMzksIDM0LCA1MSwxMzgsIDM5LCAgNCwgMzksIDI4LCAzOSwgMzIsIDM5LCAzNiwgMzksIDQwLAotICAgICAzOSwgNDQsIDM5LCA0OCwgMzksIDUyLCAzOSwgNTYsIDM5LCA2MCwgMzksIDY0LCA0OCwxMjgsIDM5LCAzNSwKLSAgICAgNDksMTI4LCAzOSwgMzYsIDUwLDEyOCwgMzksIDM3LCA1MSwxMjgsIDM5LCAzOCwgNTIsMTI4LCAzOSwgMzksCi0gICAgIDUzLDEyOCwgMzgsICA1LCA1NCwxMjgsIDM5LCA0MSwgNTUsMTI4LCAzOSwgNDIsIDU2LDEyOCwgMzksIDQzLAotICAgICA1NywxMjgsIDM5LCA0NCwgNTIsMTM4LCAzOCwgMTQsIDM5LCA5MiwgMzksIDk2LCAzOSwxMDAsIDM5LDEwNCwKLSAgICAgMzksMTA4LCAzOSwxMTIsIDM5LDExNiwgMzksMTIwLCAzOSwxMjQsIDM5LDEyOCwgNDgsMTI4LCAzOSwgNDUsCi0gICAgIDQ5LDEyOCwgMzksIDQ2LCA1MCwxMjgsIDM5LCA0NywgNTEsMTI4LCAzOSwgNDgsIDUyLDEyOCwgMzksIDQ5LAotICAgICA1MywxMjgsIDM5LCA1MCwgNTQsMTI4LCAzOSwgNTEsIDU1LDEyOCwgMzksIDUyLCA1NiwxMjgsIDM5LCA1MywKLSAgICAgNTcsMTI4LCAzOSwgNTQsIDUzLDEzOCwgMzksICA2LCAzOSwxNTYsIDM5LDE2MCwgMzksMTY0LCAzOSwxNjgsCi0gICAgIDM5LDE3MiwgMzksMTc2LCAzOSwxODAsIDM5LDE4NCwgMzksMTg4LCAzOSwxOTIsIDQ4LDEyOCwgMzksIDU1LAotICAgICA0OSwxMjgsIDM5LCA1NiwgNTAsMTI4LCAzOSwgNTcsIDUxLDEyOCwgMzksIDU4LCA1MiwxMjgsIDM5LCA1OSwKLSAgICAgNTMsMTI4LCAzOSwgNjAsIDU0LDEyOCwgMzksIDYxLCA1NSwxMjgsIDM5LCA2MiwgNTYsMTI4LCAzOSwgNjMsCi0gICAgIDU3LDEyOCwgMzksIDY0LCA1NCwxMzgsIDM5LCAyOSwgMzksMjIwLCAzOSwyMjQsIDM5LDIyOCwgMzksMjMyLAotICAgICAzOSwyMzYsIDM5LDI0MCwgMzksMjQ0LCAzOSwyNDgsIDM5LDI1MiwgNDAsICAwLCA0OCwxMjgsIDM5LCA2NSwKLSAgICAgNDksMTI4LCAzOSwgNjYsIDUwLDEyOCwgMzksIDY3LCA1MSwxMjgsIDM5LCA2OCwgNTIsMTI4LCAzOSwgNjksCi0gICAgIDUzLDEyOCwgMzksIDcwLCA1NCwxMjgsIDM5LCA3MSwgNTUsMTI4LCAzOSwgNzIsIDU2LDEyOCwgMzksIDczLAotICAgICA1NywxMjgsIDM5LCA3NCwgNTUsMTM4LCAzOSwgMzAsIDQwLCAyOCwgNDAsIDMyLCA0MCwgMzYsIDQwLCA0MCwKLSAgICAgNDAsIDQ0LCA0MCwgNDgsIDQwLCA1MiwgNDAsIDU2LCA0MCwgNjAsIDQwLCA2NCwgNDgsMTI4LCAzOSwgNzUsCi0gICAgIDQ5LDEyOCwgMzcsMjA3LCA1MCwxMjgsIDM5LCA3NywgNTEsMTI4LCAzNywxNjAsIDUyLDEyOCwgMzksIDc5LAotICAgICA1MywxMjgsIDM5LCA4MSwgNTQsMTI4LCAzNywxNzgsIDU1LDEyOCwgMzcsMTg4LCA1NiwxMjgsIDM3LDE5OCwKLSAgICAgNTcsMTI4LCAzOSwgODYsIDU2LDEzNywgMzksIDMxLCA0MCwgOTAsIDQwLCA5NCwgNDAsIDk4LCA0MCwxMDIsCi0gICAgIDQwLDEwNiwgNDAsMTEwLCA0MCwxMTQsIDQwLDExOCwgNDAsMTIyLCA0OSwxMjgsIDM3LDIxNSwgNTAsMTI4LAotICAgICAzOSwgODgsIDUxLDEyOCwgMzksIDg5LCA1MiwxMjgsIDM5LCA5MCwgNTMsMTI4LCAzOSwxMTEsIDU0LDEyOCwKLSAgICAgMzksMTEzLCA1NSwxMjgsIDM5LDExNCwgNTYsMTI4LCAzOSwxMTUsIDU3LDEyOCwgMzksMTA0LCA1NywxMzgsCi0gICAgIDM5LCAzMiwgNDAsMTUwLCA0MCwxNTQsIDQwLDE1OCwgNDAsMTYyLCA0MCwxNjYsIDQwLDE3MCwgNDAsMTc0LAotICAgICA0MCwxNzgsIDQwLDE4MiwgNDAsMTg2LCA0OCwxMjgsIDM5LDEwNSwgNDksMTI4LCAzOSwxMDgsIDUwLDEyOCwKLSAgICAgMzksMTA5LCA1MSwxMjgsIDM5LDEwNiwgNTIsMTI4LCAzOSwxMDcsIDUzLDEyOCwgMzksMTE2LCA1NCwxMjgsCi0gICAgIDM5LDExNywgNTUsMTI4LCAzOSwgOTEsIDU2LDEyOCwgMzksIDkyLCA1NywxMjgsIDM5LCA5MywgOTcsICA3LAotICAgICA0MCwyMDYsIDQwLDIxNiwgNDAsMjIzLCA0MCwyMzAsIDQwLDI1NSwgNDEsIDE1LCA0MSwgMjYsMjI2LDIyOSwKLSAgICAyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM0LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAwLDIyNSwyMjgsCi0gICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDYsMjMxLDExNywgIDIsIDQwLDIzNywgNDAsMjQ2LDIzNCwyMjUsMjQyLAotICAgIDIyNSwyNDQsMTA1LDEyOCwgMTAsMTM0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsICA2LDIzNywKLSAgICAyMjUsMjQ0LDI0MiwyMjUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA2MiwyNDIsCi0gICAgMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsICAzLDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLAotICAgIDIzMywyMzEsMTEwLCAgMywgNDEsIDQyLCA0MSwgNTIsIDQxLCA1OSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwKLSAgICAxMDUsMTI4LCAgOSwxOTAsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDYyLDIzMSwyNDUsMjM0LDIyNSwyNDIsCi0gICAgMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTAsIDk4LCAgNCwgNDEsIDgwLCA0MSwxMjEsIDQxLDEzMCwgNDEsMTQwLAotICAgIDIyNiwyNDIsMjI5LDI0NiwyMzMsMjI1LDI0NCwyMzMsMjM5LDExMCwgIDIsIDQxLCA5NSwgNDEsMTEwLDIzNywKLSAgICAyMjUsMjQyLDIzNSwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDk1LDI0MywyMzMsCi0gICAgMjMxLDIzOCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMTIsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LAotICAgICAgOSwxMzMsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDI2LDI0MiwyMjksMjQ2LDEwMSwKLSAgICAxMzQsICAxLCAgMywgNDEsMTU5LCA0MSwxNjcsIDQxLDE3OCwgNDEsMTg5LCA0MSwxOTcsIDQxLDIwOSwyMjUsCi0gICAgMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMTc1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwyMDksMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE4MywyMzEsMjQyLDIyNSwKLSAgICAyNDYsMTAxLDEyOCwgMzAsMTc3LDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsCi0gICAgMTc5LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwxODEsIDk5LCAgNCwgNDEsMjI3LCA0MSwyMzQsIDQyLAotICAgICA1NywgNDIsMTI3LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIwNiwyMzMsMjQyLCA5OSwgIDIsIDQxLDI0MiwKLSAgICAgNDEsMjQ3LDIzNiwxMDEsMTI4LCAzNiwyMDgsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTMzLCAgMCwyMjYsCi0gICAgIDQyLCAxMCwgNDIsIDE4LCA0MiwgMjksIDQyLCAzNywgNDIsIDQ5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LAotICAgICAzMCwxNjUsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE3MywyMzEsMjQyLDIyNSwKLSAgICAyNDYsMTAxLDEyOCwgMzAsMTY3LDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsCi0gICAgMTY5LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwxNzEsMjQ1LDI0NCwxMDEsMTMzLCAgMCwxODAsIDQyLAotICAgICA3MywgNDIsIDg0LCA0MiwxMDEsIDQyLDEwOCwgNDIsMTE3LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywKLSAgICAgOTgsMTI4LCAgMywgMjMsIDk5LCAgMiwgNDIsIDkwLCA0MiwgOTUsMjM3LCA5OCwxMjgsICAzLCAgMSwyMzksCi0gICAgMjM3LCA5OCwxMjgsICAzLCAgMSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgODQsMjM2LDIzOSwyNDcsMjM3LAotICAgIDIzOSwxMDAsMTI4LCAgMiwyMDcsMjQ0LDIzOSwyMzgsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDY1LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0OCwxMDAsICA1LCA0MiwxNDksIDQyLDE1OSwgNDIsCi0gICAgMTczLCA0MiwxNzksIDQyLDIxMywyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgIDEsMjI4LAotICAgIDIyNSwyMzUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExMywyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LCAgNSwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTMwLCAgMCwyMjgsIDQyLDE5MywgNDIsCi0gICAgMjA0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTEsMjM3LDIyNSwyMjcsMjQyLAotICAgIDIzOSwxMTAsMTI4LCAgMSwyMjMsMjM5LDExNiwgIDIsIDQyLDIyMCwgNDIsMjI4LDIyNiwyMjksMjM2LDIzOSwKLSAgICAxMTksMTI4LCAzMCwxNjEsMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjUsMTAxLDEzMSwgIDAsCi0gICAgMjMwLCA0MiwyNDcsIDQyLDI1NSwgNDMsICA4LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwyNTMsMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODAsMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwKLSAgICAyMjcsMjMwLDIzMywxMDUsICA2LCA0MywgMzMsIDQzLCA1MywgNDUsMjQ2LCA0NSwyNTIsIDQ2LCAxMSwgNDksCi0gICAgMTExLCA0OCwgIDIsIDQzLCAzOSwgNDMsIDQ2LDE3NiwxNzgsMTc2LCA1NiwxMjgsIDMyLCAyMSwxODQsMTg1LAotICAgIDE4MCwgNDksMTI4LCAzMiwxNjQsMTc3LCA0OCwgIDMsIDQzLCA2MiwgNDUsIDg2LCA0NSwyMjEsIDQ4LCAgOSwKLSAgICAgNDMsIDgyLCA0MywxMDIsIDQzLDE2NCwgNDMsMjI2LCA0NCwgMzIsIDQ0LCA5NCwgNDQsMTU2LCA0NCwyMTgsCi0gICAgIDQ1LCAyNCwgNDksICAzLCA0MywgOTAsIDQzLCA5NCwgNDMsIDk4LCA1NSwxMjgsICA0LCAxNiwgNTYsMTI4LAotICAgICAgNCwgMTcsIDU3LDEyOCwgIDQsIDE4LCA1MCwgMTAsIDQzLDEyNCwgNDMsMTI4LCA0MywxMzIsIDQzLDEzNiwKLSAgICAgNDMsMTQwLCA0MywxNDQsIDQzLDE0OCwgNDMsMTUyLCA0MywxNTYsIDQzLDE2MCwgNDgsMTI4LCAgNCwgMTksCi0gICAgIDQ5LDEyOCwgIDQsIDIwLCA1MCwxMjgsICA0LCAyMSwgNTEsMTI4LCAgNCwgIDEsIDUyLDEyOCwgIDQsIDIyLAotICAgICA1MywxMjgsICA0LCAyMywgNTQsMTI4LCAgNCwgMjQsIDU1LDEyOCwgIDQsIDI1LCA1NiwxMjgsICA0LCAyNiwKLSAgICAgNTcsMTI4LCAgNCwgMjcsIDUxLCAxMCwgNDMsMTg2LCA0MywxOTAsIDQzLDE5NCwgNDMsMTk4LCA0MywyMDIsCi0gICAgIDQzLDIwNiwgNDMsMjEwLCA0MywyMTQsIDQzLDIxOCwgNDMsMjIyLCA0OCwxMjgsICA0LCAyOCwgNDksMTI4LAotICAgICAgNCwgMjksIDUwLDEyOCwgIDQsIDMwLCA1MSwxMjgsICA0LCAzMSwgNTIsMTI4LCAgNCwgMzIsIDUzLDEyOCwKLSAgICAgIDQsIDMzLCA1NCwxMjgsICA0LCAzNCwgNTUsMTI4LCAgNCwgMzUsIDU2LDEyOCwgIDQsIDM2LCA1NywxMjgsCi0gICAgICA0LCAzNywgNTIsIDEwLCA0MywyNDgsIDQzLDI1MiwgNDQsICAwLCA0NCwgIDQsIDQ0LCAgOCwgNDQsIDEyLAotICAgICA0NCwgMTYsIDQ0LCAyMCwgNDQsIDI0LCA0NCwgMjgsIDQ4LDEyOCwgIDQsIDM4LCA0OSwxMjgsICA0LCAzOSwKLSAgICAgNTAsMTI4LCAgNCwgNDAsIDUxLDEyOCwgIDQsIDQxLCA1MiwxMjgsICA0LCA0MiwgNTMsMTI4LCAgNCwgNDMsCi0gICAgIDU0LDEyOCwgIDQsIDQ0LCA1NSwxMjgsICA0LCA0NSwgNTYsMTI4LCAgNCwgNDYsIDU3LDEyOCwgIDQsIDQ3LAotICAgICA1MywgMTAsIDQ0LCA1NCwgNDQsIDU4LCA0NCwgNjIsIDQ0LCA2NiwgNDQsIDcwLCA0NCwgNzQsIDQ0LCA3OCwKLSAgICAgNDQsIDgyLCA0NCwgODYsIDQ0LCA5MCwgNDgsMTI4LCAgNCwxNDQsIDQ5LDEyOCwgIDQsICAyLCA1MCwxMjgsCi0gICAgICA0LCAgMywgNTEsMTI4LCAgNCwgIDQsIDUyLDEyOCwgIDQsICA1LCA1MywxMjgsICA0LCAgNiwgNTQsMTI4LAotICAgICAgNCwgIDcsIDU1LDEyOCwgIDQsICA4LCA1NiwxMjgsICA0LCAgOSwgNTcsMTI4LCAgNCwgMTAsIDU0LCAxMCwKLSAgICAgNDQsMTE2LCA0NCwxMjAsIDQ0LDEyNCwgNDQsMTI4LCA0NCwxMzIsIDQ0LDEzNiwgNDQsMTQwLCA0NCwxNDQsCi0gICAgIDQ0LDE0OCwgNDQsMTUyLCA0OCwxMjgsICA0LCAxMSwgNDksMTI4LCAgNCwgMTIsIDUwLDEyOCwgIDQsIDE0LAotICAgICA1MSwxMjgsMjQ2LDE5NiwgNTIsMTI4LDI0NiwxOTcsIDUzLDEyOCwgIDQsIDQ4LCA1NCwxMjgsICA0LCA0OSwKLSAgICAgNTUsMTI4LCAgNCwgNTAsIDU2LDEyOCwgIDQsIDUxLCA1NywxMjgsICA0LCA1MiwgNTUsIDEwLCA0NCwxNzgsCi0gICAgIDQ0LDE4MiwgNDQsMTg2LCA0NCwxOTAsIDQ0LDE5NCwgNDQsMTk4LCA0NCwyMDIsIDQ0LDIwNiwgNDQsMjEwLAotICAgICA0NCwyMTQsIDQ4LDEyOCwgIDQsIDUzLCA0OSwxMjgsICA0LCA4MSwgNTAsMTI4LCAgNCwgNTQsIDUxLDEyOCwKLSAgICAgIDQsIDU1LCA1MiwxMjgsICA0LCA1NiwgNTMsMTI4LCAgNCwgNTcsIDU0LDEyOCwgIDQsIDU4LCA1NSwxMjgsCi0gICAgICA0LCA1OSwgNTYsMTI4LCAgNCwgNjAsIDU3LDEyOCwgIDQsIDYxLCA1NiwgMTAsIDQ0LDI0MCwgNDQsMjQ0LAotICAgICA0NCwyNDgsIDQ0LDI1MiwgNDUsICAwLCA0NSwgIDQsIDQ1LCAgOCwgNDUsIDEyLCA0NSwgMTYsIDQ1LCAyMCwKLSAgICAgNDgsMTI4LCAgNCwgNjIsIDQ5LDEyOCwgIDQsIDYzLCA1MCwxMjgsICA0LCA2NCwgNTEsMTI4LCAgNCwgNjUsCi0gICAgIDUyLDEyOCwgIDQsIDY2LCA1MywxMjgsICA0LCA2NywgNTQsMTI4LCAgNCwgNjgsIDU1LDEyOCwgIDQsIDY5LAotICAgICA1NiwxMjgsICA0LCA3MCwgNTcsMTI4LCAgNCwgNzEsIDU3LCAxMCwgNDUsIDQ2LCA0NSwgNTAsIDQ1LCA1NCwKLSAgICAgNDUsIDU4LCA0NSwgNjIsIDQ1LCA2NiwgNDUsIDcwLCA0NSwgNzQsIDQ1LCA3OCwgNDUsIDgyLCA0OCwxMjgsCi0gICAgICA0LCA3MiwgNDksMTI4LCAgNCwgNzMsIDUwLDEyOCwgIDQsIDc0LCA1MSwxMjgsICA0LCA3NSwgNTIsMTI4LAotICAgICAgNCwgNzYsIDUzLDEyOCwgIDQsIDc3LCA1NCwxMjgsICA0LCA3OCwgNTUsMTI4LCAgNCwgNzksIDU2LDEyOCwKLSAgICAgIDQsMTQ1LCA1NywxMjgsICA0LCA4MiwgNDksICA0LCA0NSwgOTYsIDQ1LDE1OCwgNDUsMTYzLCA0NSwxODksCi0gICAgIDQ4LCAxMCwgNDUsMTE4LCA0NSwxMjIsIDQ1LDEyNiwgNDUsMTMwLCA0NSwxMzQsIDQ1LDEzOCwgNDUsMTQyLAotICAgICA0NSwxNDYsIDQ1LDE1MCwgNDUsMTU0LCA0OCwxMjgsICA0LCA4MywgNDksMTI4LCAgNCwgODQsIDUwLDEyOCwKLSAgICAgIDQsIDg1LCA1MSwxMjgsICA0LCA4NiwgNTIsMTI4LCAgNCwgODcsIDUzLDEyOCwgIDQsIDg4LCA1NCwxMjgsCi0gICAgICA0LCA4OSwgNTUsMTI4LCAgNCwgOTAsIDU2LDEyOCwgIDQsIDkxLCA1NywxMjgsICA0LCA5MiwxNzcsIDQ4LAotICAgIDEyOCwgIDQsIDk0LCA1MiwgIDQsIDQ1LDE3MywgNDUsMTc3LCA0NSwxODEsIDQ1LDE4NSwgNTMsMTI4LCAgNCwKLSAgICAgMTUsIDU0LDEyOCwgIDQsIDk4LCA1NSwxMjgsICA0LDExNCwgNTYsMTI4LCAgNCwxMTYsIDU3LCAgNSwgNDUsCi0gICAgMjAxLCA0NSwyMDUsIDQ1LDIwOSwgNDUsMjEzLCA0NSwyMTcsIDUwLDEyOCwyNDYsMTk4LCA1MSwxMjgsICA0LAotICAgICA5NSwgNTIsMTI4LCAgNCwgOTksIDUzLDEyOCwgIDQsMTE1LCA1NCwxMjgsICA0LDExNywgNTYsICAyLCA0NSwKLSAgICAyMjcsIDQ1LDI0MSwgNTEsICAyLCA0NSwyMzMsIDQ1LDIzNywgNDksMTI4LDI0NiwxOTksIDUwLDEyOCwyNDYsCi0gICAgMjAwLDE4MCwgNTQsMTI4LCAgNCwyMTcsMTc4LDE4NSwgNTcsMTI4LCAzMiwgMTQsMTc5LCA0OCwgIDIsIDQ2LAotICAgICAgMywgNDYsICA3LCA0OCwxMjgsIDMyLCAxNSwgNDksMTI4LCAzMiwgMTMsMTgxLCA1NSwgIDcsIDQ2LCAyOCwKLSAgICAgNDYsIDk4LCA0NywxNjMsIDQ3LDI0MCwgNDgsMTk3LCA0OSwgMzQsIDQ5LDEwNSwgNTEsICAyLCA0NiwgMzQsCi0gICAgIDQ2LCA0OCwgNTYsICAyLCA0NiwgNDAsIDQ2LCA0NCwgNDksMTI4LCAgNiwxMDYsIDU2LDEyOCwgIDYsIDEyLAotICAgICA1NywgIDgsIDQ2LCA2NiwgNDYsIDcwLCA0NiwgNzQsIDQ2LCA3OCwgNDYsIDgyLCA0NiwgODYsIDQ2LCA5MCwKLSAgICAgNDYsIDk0LCA1MCwxMjgsICA2LCA5NiwgNTEsMTI4LCAgNiwgOTcsIDUyLDEyOCwgIDYsIDk4LCA1MywxMjgsCi0gICAgICA2LCA5OSwgNTQsMTI4LCAgNiwxMDAsIDU1LDEyOCwgIDYsMTAxLCA1NiwxMjgsICA2LDEwMiwgNTcsMTI4LAotICAgICAgNiwxMDMsIDUyLCAgNywgNDYsMTE0LCA0NiwxNDYsIDQ2LDIwOCwgNDcsIDE0LCA0NywgNDYsIDQ3LDEwMiwKLSAgICAgNDcsMTU4LCA0OCwgIDUsIDQ2LDEyNiwgNDYsMTMwLCA0NiwxMzQsIDQ2LDEzOCwgNDYsMTQyLCA0OCwxMjgsCi0gICAgICA2LDEwNCwgNDksMTI4LCAgNiwxMDUsIDUxLDEyOCwgIDYsIDI3LCA1NSwxMjgsICA2LCAzMSwgNTcsMTI4LAotICAgICAgNiwgMzMsIDQ5LCAxMCwgNDYsMTY4LCA0NiwxNzIsIDQ2LDE3NiwgNDYsMTgwLCA0NiwxODQsIDQ2LDE4OCwKLSAgICAgNDYsMTkyLCA0NiwxOTYsIDQ2LDIwMCwgNDYsMjA0LCA0OCwxMjgsICA2LCAzNCwgNDksMTI4LCAgNiwgMzUsCi0gICAgIDUwLDEyOCwgIDYsIDM2LCA1MSwxMjgsICA2LCAzNywgNTIsMTI4LCAgNiwgMzgsIDUzLDEyOCwgIDYsIDM5LAotICAgICA1NCwxMjgsICA2LCA0MCwgNTUsMTI4LCAgNiwgNDEsIDU2LDEyOCwgIDYsIDQyLCA1NywxMjgsICA2LCA0MywKLSAgICAgNTAsIDEwLCA0NiwyMzAsIDQ2LDIzNCwgNDYsMjM4LCA0NiwyNDIsIDQ2LDI0NiwgNDYsMjUwLCA0NiwyNTQsCi0gICAgIDQ3LCAgMiwgNDcsICA2LCA0NywgMTAsIDQ4LDEyOCwgIDYsIDQ0LCA0OSwxMjgsICA2LCA0NSwgNTAsMTI4LAotICAgICAgNiwgNDYsIDUxLDEyOCwgIDYsIDQ3LCA1MiwxMjgsICA2LCA0OCwgNTMsMTI4LCAgNiwgNDksIDU0LDEyOCwKLSAgICAgIDYsIDUwLCA1NSwxMjgsICA2LCA1MSwgNTYsMTI4LCAgNiwgNTIsIDU3LDEyOCwgIDYsIDUzLCA1MSwgIDUsCi0gICAgIDQ3LCAyNiwgNDcsIDMwLCA0NywgMzQsIDQ3LCAzOCwgNDcsIDQyLCA0OCwxMjgsICA2LCA1NCwgNDksMTI4LAotICAgICAgNiwgNTUsIDUwLDEyOCwgIDYsIDU2LCA1MSwxMjgsICA2LCA1NywgNTIsMTI4LCAgNiwgNTgsIDUyLCAgOSwKLSAgICAgNDcsIDY2LCA0NywgNzAsIDQ3LCA3NCwgNDcsIDc4LCA0NywgODIsIDQ3LCA4NiwgNDcsIDkwLCA0NywgOTQsCi0gICAgIDQ3LCA5OCwgNDgsMTI4LCAgNiwgNjQsIDQ5LDEyOCwgIDYsIDY1LCA1MCwxMjgsICA2LCA2NiwgNTEsMTI4LAotICAgICAgNiwgNjcsIDUyLDEyOCwgIDYsIDY4LCA1MywxMjgsICA2LCA2OSwgNTQsMTI4LCAgNiwgNzAsIDU2LDEyOCwKLSAgICAgIDYsIDcyLCA1NywxMjgsICA2LCA3MywgNTMsICA5LCA0NywxMjIsIDQ3LDEyNiwgNDcsMTMwLCA0NywxMzQsCi0gICAgIDQ3LDEzOCwgNDcsMTQyLCA0NywxNDYsIDQ3LDE1MCwgNDcsMTU0LCA0OCwxMjgsICA2LCA3NCwgNDksMTI4LAotICAgICAgNiwgNzUsIDUwLDEyOCwgIDYsIDc2LCA1MSwxMjgsICA2LCA3NywgNTIsMTI4LCAgNiwgNzgsIDUzLDEyOCwKLSAgICAgIDYsIDc5LCA1NCwxMjgsICA2LCA4MCwgNTUsMTI4LCAgNiwgODEsIDU2LDEyOCwgIDYsIDgyLDE4MywgNDgsCi0gICAgMTI4LCAgNiwgNzEsIDUzLCAgMywgNDcsMTcxLCA0NywyMDMsIDQ3LDIzNSwgNDgsICA1LCA0NywxODMsIDQ3LAotICAgIDE4NywgNDcsMTkxLCA0NywxOTUsIDQ3LDE5OSwgNTMsMTI4LCAgNiwxNjQsIDU0LDEyOCwgIDYsMTI2LCA1NSwKLSAgICAxMjgsICA2LDEzNCwgNTYsMTI4LCAgNiwxNTIsIDU3LDEyOCwgIDYsMTc1LCA0OSwgIDUsIDQ3LDIxNSwgNDcsCi0gICAgMjE5LCA0NywyMjMsIDQ3LDIyNywgNDcsMjMxLCA0OSwxMjgsICA2LDEyMSwgNTAsMTI4LCAgNiwxMzYsIDUxLAotICAgIDEyOCwgIDYsMTQ1LCA1MiwxMjgsICA2LDE4NiwgNTcsMTI4LCAgNiwyMTAsMTc5LCA1MiwxMjgsICA2LDIxMywKLSAgICAgNTQsICA3LCA0OCwgIDAsIDQ4LCAgNSwgNDgsIDEwLCA0OCwgMTUsIDQ4LCA1MywgNDgsMTE1LCA0OCwxNzcsCi0gICAgMTc5LCA1NCwxMjgsIDMyLDE3MCwxODAsIDUzLDEyOCwgIDUsMTkwLDE4MSwgNTYsMTI4LCAgNSwxOTUsIDU0LAotICAgICAgNiwgNDgsIDI5LCA0OCwgMzMsIDQ4LCAzNywgNDgsIDQxLCA0OCwgNDUsIDQ4LCA0OSwgNTIsMTI4LCAgNSwKLSAgICAyMDgsIDUzLDEyOCwgIDUsMjA5LCA1NCwxMjgsICA1LDIxMCwgNTUsMTI4LCAgNSwyMTEsIDU2LDEyOCwgIDUsCi0gICAgMjEyLCA1NywxMjgsICA1LDIxMywgNTUsIDEwLCA0OCwgNzUsIDQ4LCA3OSwgNDgsIDgzLCA0OCwgODcsIDQ4LAotICAgICA5MSwgNDgsIDk1LCA0OCwgOTksIDQ4LDEwMywgNDgsMTA3LCA0OCwxMTEsIDQ4LDEyOCwgIDUsMjE0LCA0OSwKLSAgICAxMjgsICA1LDIxNSwgNTAsMTI4LCAgNSwyMTYsIDUxLDEyOCwgIDUsMjE3LCA1MiwxMjgsICA1LDIxOCwgNTMsCi0gICAgMTI4LCAgNSwyMTksIDU0LDEyOCwgIDUsMjIwLCA1NSwxMjgsICA1LDIyMSwgNTYsMTI4LCAgNSwyMjIsIDU3LAotICAgIDEyOCwgIDUsMjIzLCA1NiwgMTAsIDQ4LDEzNywgNDgsMTQxLCA0OCwxNDUsIDQ4LDE0OSwgNDgsMTUzLCA0OCwKLSAgICAxNTcsIDQ4LDE2MSwgNDgsMTY1LCA0OCwxNjksIDQ4LDE3MywgNDgsMTI4LCAgNSwyMjQsIDQ5LDEyOCwgIDUsCi0gICAgMjI1LCA1MCwxMjgsICA1LDIyNiwgNTEsMTI4LCAgNSwyMjcsIDUyLDEyOCwgIDUsMjI4LCA1MywxMjgsICA1LAotICAgIDIyOSwgNTQsMTI4LCAgNSwyMzAsIDU1LDEyOCwgIDUsMjMxLCA1NiwxMjgsICA1LDIzMiwgNTcsMTI4LCAgNSwKLSAgICAyMzMsIDU3LCAgMywgNDgsMTg1LCA0OCwxODksIDQ4LDE5MywgNDgsMTI4LCAgNSwyMzQsIDUyLDEyOCwyNTEsCi0gICAgIDQyLCA1MywxMjgsMjUxLCA0MywgNTUsICA0LCA0OCwyMDcsIDQ4LDIyMSwgNDgsMjQxLCA0OCwyNDYsIDQ4LAotICAgICAgMiwgNDgsMjEzLCA0OCwyMTcsIDQ4LDEyOCwyNTEsIDc1LCA1MywxMjgsMjUxLCAzMSwgNDksICAzLCA0OCwKLSAgICAyMjksIDQ4LDIzMywgNDgsMjM3LCA1NCwxMjgsICA1LDI0MCwgNTUsMTI4LCAgNSwyNDEsIDU2LDEyOCwgIDUsCi0gICAgMjQyLDE3OCwgNTEsMTI4LDI1MSwgNTMsIDU3LCAgNywgNDksICA2LCA0OSwgMTAsIDQ5LCAxNCwgNDksIDE4LAotICAgICA0OSwgMjIsIDQ5LCAyNiwgNDksIDMwLCA1MSwxMjgsICA1LDE4MCwgNTIsMTI4LCAgNSwxODEsIDUzLDEyOCwKLSAgICAgIDUsMTgyLCA1NCwxMjgsICA1LDE4NywgNTUsMTI4LCAgNSwxODQsIDU2LDEyOCwgIDUsMTgzLCA1NywxMjgsCi0gICAgICA1LDE3NiwgNTYsICAzLCA0OSwgNDIsIDQ5LCA4NiwgNDksIDkxLCA0OCwgIDcsIDQ5LCA1OCwgNDksIDYyLAotICAgICA0OSwgNjYsIDQ5LCA3MCwgNDksIDc0LCA0OSwgNzgsIDQ5LCA4MiwgNDgsMTI4LCAgNSwxNzgsIDQ5LDEyOCwKLSAgICAgIDUsMTc3LCA1MCwxMjgsICA1LDE3OSwgNTEsMTI4LCAgNSwxOTQsIDUyLDEyOCwgIDUsMTkzLCA1NCwxMjgsCi0gICAgICA1LDE4NSwgNTUsMTI4LCAgNSwxODgsMTc5LCA1NywxMjgsICA1LDE4OSwgNTIsICAyLCA0OSwgOTcsIDQ5LAotICAgIDEwMSwgNDksMTI4LCAgNSwxOTEsIDUwLDEyOCwgIDUsMTkyLDE4NSwxNzgsIDU3LDEyOCwgIDIsMTg4LCA1NCwKLSAgICAgIDMsIDQ5LDExOSwgNDksMTc4LCA0OSwxODUsIDQ5LCAgNCwgNDksMTI5LCA0OSwxNDUsIDQ5LDE1MSwgNDksCi0gICAgMTcyLCA1MCwgIDIsIDQ5LDEzNSwgNDksMTQwLDE4MCwgNTYsMTI4LCAzMywgIDUsMTg0LCA1NywxMjgsIDMzLAotICAgICAxOSwxNzksMTgxLCA1MCwxMjgsIDMzLCAyMiwxODEsIDU1LCAgMywgNDksMTYwLCA0OSwxNjQsIDQ5LDE2OCwKLSAgICAgNTEsMTI4LCAzMiwgNDQsIDUyLDEyOCwgMzIsIDQ1LCA1MywxMjgsIDMyLCA0NiwxODIsMTgyLCA1MiwxMjgsCi0gICAgIDMyLCAxMiwxNzksMTc3LDE4MiwgNTUsMTI4LCAgNiwxMDksMTgwLDE4NSwxNzksIDU1LDEyOCwgIDIsMTg5LAotICAgIDEwMywgIDIsIDQ5LDE5OCwgNDksMjA1LDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAwLDIyNCwxMTcsICAyLCA0OSwKLSAgICAyMTEsIDQ5LDIyMCwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzMywyNDIsMjM3LDI0NSwyMzUsCi0gICAgMjMyLDEwNSwxMjgsIDEwLCAgNSwxMDQsICAyLCA0OSwyMzUsIDQ5LDI0NSwyMzMsMjQyLDIyNSwyMzEsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwgNjYsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDE2MywKLSAgICAxMDUsICA3LCA1MCwgMTYsIDUwLCA0MSwgNTAsIDQ4LCA1MCwgNjAsIDUwLCA4NSwgNTAsMTAxLCA1MCwxODEsCi0gICAgIDk4LCAgMiwgNTAsIDIyLCA1MCwgMzEsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNDQsMjM5LAotICAgIDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDMwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxNiwKLSAgICAyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIxMywyMzEsMTE3LCAgMiwgNTAsCi0gICAgIDY3LCA1MCwgNzYsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDQsMjQyLDIzNywyNDUsMjM1LAotICAgIDIzMiwxMDUsMTI4LCAxMCwgMTYsMjM3LDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwKLSAgICAyMzIsMTA1LDEyOCwgMTAsIDcyLDExMCwgIDUsIDUwLDExMywgNTAsMTIyLCA1MCwxMzYsIDUwLDE1MiwgNTAsCi0gICAgMTY3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDU3LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMDIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjAzLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjA0LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgIDMsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLCA1MCwKLSAgICAxOTcsIDUwLDIwNywgNTAsMjE0LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIwMCwyMjgsCi0gICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzIsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAotICAgIDIwMCwxMDcsICAyLCA1MCwyMzEsIDUwLDI1NSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKLSAgICAxNjIsIDUwLDI0MywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExMywyMzksCi0gICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDc5LDEwOCwgIDMsIDUxLCAxNSwgNTIsIDcxLCA1MiwgODAsMTAxLAotICAgICAgMiwgNTEsIDIxLCA1MiwgNjYsMTAyLDEzNiwgIDUsMjA4LCA1MSwgNDEsIDUxLCA1MCwgNTEsIDY1LCA1MSwKLSAgICAgNzksIDUxLDE2OCwgNTEsMTgyLCA1MiwgMzcsIDUyLCA1MSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCAzOSwyMjgsMjI1LDIzMSwyMjksMjQzLDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLAotICAgICA0OCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQyLDEwNCwKLSAgICAgIDIsIDUxLCA4NSwgNTEsMTYwLDIyNSwyMzcsMjUwLCA5NywgIDIsIDUxLCA5NCwgNTEsMTI3LDIyNSwyMjYsCi0gICAgMjM5LDI0NiwxMDEsICAyLCA1MSwxMDQsIDUxLDExMywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LAotICAgICAzNSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTMyLDIyNiwKLSAgICAyMjksMjM2LDIzOSwxMTksICAyLCA1MSwxMzcsIDUxLDE0NiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCAzNywyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTM2LAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMDgsMjM2LDIyNSwyMzcsMjI5LDIyOCwyMzIsMjI5LDIyNiwKLSAgICAyNDIsMjI5LDExOSwxMjgsMjUxLCA3OSwyMzcsIDk3LCAgMiwgNTEsMTg5LCA1MSwyMjUsMjI4LDIyOCwyMjUsCi0gICAgMjI1LDIyNiwyMzksMjQ2LDEwMSwgIDIsIDUxLDIwMiwgNTEsMjExLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsIDM0LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwKLSAgICAxMzAsMjM1LDI0MywyNDUsMjQyLCA5NywgIDQsIDUxLDIzOSwgNTEsMjQ4LCA1MiwgIDYsIDUyLCAyMiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3MywyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQwLDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsMjU0LDI0MywyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjU0LDI0NCwyNDAsMjI1LDI0NCwyMjUsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAotICAgIDEyOCwyNTEsIDQ2LDI0MSwyMjUsMjM3LDIyNSwyNDQsMjQzLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAyNTEsIDQ3LDI0MCwxMDQsMTI4LCAzMywgNTMsMjM2LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwgNzYsCi0gICAgMjQwLDIzMiwgOTcsMTI5LCAgMywxNzcsIDUyLCA4OCwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTcyLAotICAgIDEwOSwgIDQsIDUyLDEwNiwgNTIsMTE0LCA1MiwxMjUsIDUyLDE1OSwyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwKLSAgICAgIDEsICAxLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjUsMjQwLDIyOSwyNDIsCi0gICAgMjQzLDIyNSwyMzgsMTAwLDEzMCwgIDAsIDM4LCA1MiwxMzksIDUyLDE1MSwyMzcsMjM5LDIzOCwyMzksMjQzLAotICAgIDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgNiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDM4LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTk0LDExMCwgIDQsIDUyLDE3OCwgNTIsMTg5LCA1MywgNTUsCi0gICAgIDUzLCA2NSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDM0LDEwMywgIDQsIDUyLAotICAgIDE5OSwgNTIsMjEwLCA1MiwyMjQsIDUzLCA0NywyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwKLSAgICAgNDksIDM2LDIzNSwyMzIsMjI1LDIzOCwyMzUsMjMyLDI0NSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgOTAsCi0gICAgMjM2LDEwMSwxMzEsIDM0LCAzMiwgNTIsMjM1LCA1MywgMzIsIDUzLCAzOSwyMjYsMjQyLDIyNSwyMjcsMjM1LAotICAgIDIyOSwxMTYsICAyLCA1MiwyNDcsIDUzLCAxMSwyMzYsMjI5LDIzMCwxMTYsMTI5LCA0OCwgIDgsIDUzLCAgMCwKLSAgICAyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDYzLDI0MiwyMzMsMjMxLDIzMiwxMTYsCi0gICAgMTI5LCA0OCwgIDksIDUzLCAyMSwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDY0LAotICAgIDIzNiwyMjksMjMwLDExNiwxMjgsIDM1LCA0MSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzUsIDQyLDI0MywKLSAgICAyNDQsMjQyLDIzOSwxMDksMTI4LCAzMywgNDMsMjM5LDI0NCwyMjksMjM2LDIyOSwyMzMsIDk3LDEyOCwgIDMsCi0gICAgMTM1LDExNywgIDIsIDUzLCA3MSwgNTMsIDgzLDIyOCwyMjUsMjQ0LDI0NCwyMjUsMjI4LDIyOSwyNDYsIDk3LAotICAgIDEyOCwgIDksIDgyLDI0MywyNDYsMjI1LDI0MiwgOTcsICAzLCA1MywgOTUsIDUzLDEwNSwgNTMsMTEyLDIyNiwKLSAgICAyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDEzMCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDIsCi0gICAgMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzMCwyMzksMjMxLDIzOSwyMzgsMjI5LAotICAgIDEwNywxMjgsICAxLCAgNSwxMTIsICAzLCA1MywxNDAsIDUzLDE2NCwgNTMsMTk0LCA5NywgIDIsIDUzLDE0NiwKLSAgICAgNTMsMTU4LDIyNSwyNDQsMjM5LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsICAwLDI0MiwyMjksCi0gICAgMTEwLDEyOCwgMzYsMTU2LDIzOSwyNDMsMjQ0LDI0MiwyMzksMjQwLDIzMiwxMDEsICAyLCA1MywxNzcsIDUzLAotICAgIDE4OCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDkwLDIzNywyMzksMTAwLDEyOCwKLSAgICAgIDIsMTg4LDExMiwgIDIsIDUzLDIwMCwgNTMsMjA1LDIzNiwxMDEsMTI4LDI0OCwyNTUsMjQyLDExMSwgIDIsCi0gICAgIDUzLDIxMiwgNTMsMjIwLDIyNSwyMjcsMjMyLDIyOSwxMTUsMTI4LCAzNCwgODAsMTIwLCAgMiwgNTMsMjI2LAotICAgICA1MywyNDYsMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjksIDM0LCA3MiwgNTMsMjM2LDIzOSwyNDIsMjMzLDIzNywKLSAgICAyMjUsMjMxLDEwMSwxMjgsIDM0LCA4MiwyMzMsMjM3LDIyNSwyNDQsMjI5LDIzNiwyNDksMjI5LDI0MSwyNDUsCi0gICAgMjI1LDEwOCwxMjgsIDM0LCA2OSwxMTQsICA0LCA1NCwgMTUsIDU0LCA0MiwgNTQsIDQ2LCA1NCwgOTEsMjI1LAotICAgIDIyOSwgOTcsICAyLCA1NCwgMjMsIDU0LCAzMywyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwKLSAgICAxNDIsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxNDEsIDk5LDEyOCwgMzUsIDE4LDEwNSwgIDIsCi0gICAgIDU0LCA1MiwgNTQsIDY2LDIzMSwyMzIsMjQ0LDIzMiwyMjUsMjM2LDIzMCwyNDIsMjMzLDIzOCwxMDMsMTI4LAotICAgICAzMCwxNTQsMjM4LDEwMywxMzAsICAwLDIyOSwgNTQsIDc1LCA1NCwgODMsMjI1LDIyNywyNDUsMjQ0LDEwMSwKLSAgICAxMjgsICAxLDI1MSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsICAxLDI0MiwyMzksMTE5LCAgOCwgNTQsCi0gICAgMTExLCA1NCwxMTgsIDU0LDI0NywgNTUsIDU3LCA1NSwxMDcsIDU1LDE2MiwgNTUsMTg1LCA1NiwgIDQsMjI2LAotICAgIDIzOSwyNDQsMTA0LDEyOCwgMzMsMTQ4LDEwMCwgIDMsIDU0LDEyNiwgNTQsMTY1LCA1NCwyMTIsMjI1LDI0MywKLSAgICAxMDQsICA0LCA1NCwxMzgsIDU0LDE0NSwgNTQsMTUyLCA1NCwxNjAsMjI4LDIzOSwyNDcsMTEwLDEyOCwgMzMsCi0gICAgMjI3LDIzNiwyMjksMjMwLDExNiwxMjgsIDMzLDIyNCwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzMsMjI2LAotICAgIDI0NSwxMTIsMTI4LCAzMywyMjUsMjI2LDEwOCwgIDUsIDU0LDE3OCwgNTQsMTg1LCA1NCwxOTIsIDU0LDE5OSwKLSAgICAgNTQsMjA3LDIyNiwyMzksMjQ0LDEwNCwxMjgsIDMzLDIxMiwyMjgsMjM5LDI0NywxMTAsMTI4LCAzMywyMTEsCi0gICAgMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsMjA4LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMywyMTAsMjQ1LAotICAgIDExMiwxMjgsIDMzLDIwOSwyMzksMjQ3LDExMCwxMzEsIDMzLDE0NywgNTQsMjI0LCA1NCwyMzEsIDU0LDIzOSwKLSAgICAyMzYsMjI5LDIzMCwxMTYsMTI4LCAzMywxNTMsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDMzLDE1MiwyNDcsCi0gICAgMjMyLDIzMywyNDQsMTAxLDEyOCwgMzMsMjMzLDEwNCwgIDIsIDU0LDI1MywgNTUsIDQ4LDIyOSwyMjUsMTAwLAotICAgICAgNCwgNTUsICA5LCA1NSwgMTksIDU1LCAyOSwgNTUsIDQwLDIyOCwyMzksMjQ3LDIzOCwyMzcsMjM5LDEwMCwKLSAgICAxMjgsICAyLDE5NywyMzYsMjI5LDIzMCwyNDQsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTQsMjQyLDIzMywyMzEsCi0gICAgMjMyLDI0NCwyMzcsMjM5LDEwMCwxMjgsICAyLDE5NSwyNDUsMjQwLDIzNywyMzksMTAwLDEyOCwgIDIsMTk2LAotICAgIDIzOSwyNDIsMjMzLDI1MCwyMjksMTIwLDEyOCwyNDgsMjMxLDIzNiwyMjksMjMwLDExNiwxMzEsIDMzLDE0NCwKLSAgICAgNTUsIDcwLCA1NSwgODcsIDU1LCA5OSwyMjgsMjI2LDEwOCwxMjksIDMzLDIwOCwgNTUsIDc4LDI0MywyNDQsCi0gICAgMjQyLDIzOSwyMzUsMTAxLDEyOCwgMzMsMjA1LDIzOSwyNDYsMjI5LDI0MiwyNDIsMjMzLDIzMSwyMzIsMTE2LAotICAgIDEyOCwgMzMsMTk4LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzMywyMzAsMjQyLDIzMywyMzEsMjMyLDExNiwKLSAgICAxMzIsIDMzLDE0NiwgNTUsMTIzLCA1NSwxMzUsIDU1LDE0MywgNTUsMTU0LDIyOCwyMjYsMjM2LDI0MywyNDQsCi0gICAgMjQyLDIzOSwyMzUsMTAxLDEyOCwgMzMsMjA3LDIzMiwyMjksMjI1LDI0NiwxMjEsMTI4LCAzOSwxNTgsMjM5LAotICAgIDI0NiwyMjksMjQyLDIzNiwyMjksMjMwLDExNiwxMjgsIDMzLDE5NiwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwKLSAgICAgMzMsMjMyLDI0NCwyMjUsIDk4LCAgMiwgNTUsMTcwLCA1NSwxNzcsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsCi0gICAgMjI4LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMywyMjksMjQ1LDExMiwxMzIsIDMzLDE0NSwgNTUsMTk4LAotICAgICA1NSwyMjYsIDU1LDI0NCwgNTUsMjUyLDEwMCwgIDIsIDU1LDIwNCwgNTUsMjE2LDExMCwxMjksIDMzLDE0OSwKLSAgICAgNTUsMjEwLDIyNiwyNDMsMTAxLDEyOCwgMzMsMTY4LDIzOSwyNDcsMjM4LDIyNiwyMjUsMjQzLDEwMSwxMjgsCi0gICAgIDMzLDE2OCwyMzYsMjI5LDIzMCwxMTYsMTI5LCAzMywxNTAsIDU1LDIzNSwyMzksMjMwLDIyOCwyMzksMjQ3LAotICAgIDExMCwxMjgsIDMzLDE5NywyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzMsMTUxLDI0NywyMzIsMjMzLDI0NCwKLSAgICAxMDEsMTI4LCAzMywyMzEsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwxMjAsMTI4LDI0OCwyMzAsMTE1LCAgNSwgNTYsCi0gICAgIDI1LCA1NiwxMDEsIDU2LDE0NiwgNTYsMjI5LCA1NiwyMzksIDk5LCAgMiwgNTYsIDMxLCA1NiwgODMsMjMzLAotICAgIDEwNSwgIDIsIDU2LCAzOCwgNTYsIDYxLDIyNywyMzMsMjQyLDIyNywyNDUsMTA5LDEyOSwgIDAsIDk0LCA1NiwKLSAgICAgNDksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjIsMjQ0LDIzMywyMzYsCi0gICAgMjI4LDEwMSwxMjksICAwLDEyNiwgNTYsIDcxLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwyNTUsIDk0LDI0MiwyMzMsMjQwLDExNiwxMjksICAyLCA4MSwgNTYsIDkyLDI0NCwyNDUsMjQyLDIzOCwKLSAgICAyMjksMTAwLDEyOCwgIDIsIDgyLDIzNywyMjUsMjM2LDEwOCwgIDIsIDU2LDExMCwgNTYsMTIxLDIzMiwyMzMsCi0gICAgMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNjUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAotICAgICA5NywxMjksIDQ4LDE2MSwgNTYsMTM0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwKLSAgICAyNTUsMTAzLDI0NCwyMjksMjQyLDIzMywxMTUsICAyLCA1NiwxNTYsIDU2LDIyNSwxMDcsMTMxLCAgMCwgNDIsCi0gICAgIDU2LDE2NiwgNTYsMTk0LCA1NiwyMTcsIDk3LCAgMiwgNTYsMTcyLCA1NiwxODYsMjM2LDI0NCwyMzksMjM4LAotICAgIDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwOSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAgIDYsMTA5LDEwOSwgIDIsIDU2LDIwMCwgNTYsMjA2LDIyNSwyNDQsMTA0LDEyOCwgMzQsIDIzLDIzOSwyMzgsCi0gICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTAsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LAotICAgICA5NywxMDksMTI4LCAzMiwgNjYsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjMzLDI0OSwKLSAgICAyMzcsMjQwLDI0NCwyMzksMjQ0LDIzMywyMjcsMjI1LDIzNiwyMzYsMjQ5LDIyOSwyNDEsMjQ1LDIyNSwxMDgsCi0gICAgMTI4LCAzNCwgNjcsMTE2LDEzMiwgIDAsIDY0LCA1NywgMTUsIDU3LCAyMiwgNTcsIDM0LCA1NywgNDIsMjMzLAotICAgIDIzNiwyMjgsMTAxLDEyOCwgIDAsMjI3LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsIDMyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwxMDcsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsCi0gICAgICAyLCA4MCwxMTcsICA2LCA1NywgNjQsIDU3LCA4OSwgNTcsIDk2LCA1NywxMjEsIDU3LDE0MSwgNTcsMTU3LAotICAgICA5OCwgIDIsIDU3LCA3MCwgNTcsIDc5LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTQ4LDIzOSwKLSAgICAyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAzMiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMjAsCi0gICAgMjMxLDExNywgIDIsIDU3LDEwMywgNTcsMTEyLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQ4LAotICAgIDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDIwLDIzNiwyMjksMjM4LDIzMSwyNDQsMjMyLDIzNywKLSAgICAyMjUsMjQyLDIzNSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMTUsMjM3LDIyNSwyNDQsCi0gICAgMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDc2LDI0NiwyMzksMjQ3LAotICAgIDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMywgNTcsMTczLCA1NywxODMsIDU3LDE5MCwyMjYsMjI5LDIzOCwKLSAgICAyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMDQsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDc2LDIzMSwyNDUsCi0gICAgMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMDQsMjQ2LDIyNSwyMzEsMjQyLDIyNSwyMzIsMjI1LAotICAgIDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2MSwxMjEsICAyLCA1NywyMjEsIDU3LDIzMywyMjYsMjI1LDI0MiwKLSAgICAyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA5NywyMzMsMTEwLDEzMCwgIDUsMjI2LCA1NywyNDIsCi0gICAgIDU4LCAgMSwyMjUsMjM2LDI0NCwyMzksMjM4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLAotICAgICAzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyNiwgOTgsMTQ0LCAgMCwgOTgsIDU4LCA0NiwKLSAgICAgNTgsMTgxLCA1OCwxOTIsIDU4LDIwMSwgNTgsMjI2LCA2MCwgMTEsIDYwLCA3MywgNjAsMTQ2LCA2MiwgNzIsCi0gICAgIDYyLCA4NCwgNjIsMTI3LCA2MiwxMzUsIDYyLDE0NSwgNjQsIDE1LCA2NCwgMzksIDY0LCA0OCwgOTcsICA3LAotICAgICA1OCwgNjIsIDU4LCA3MiwgNTgsIDk2LCA1OCwxMDMsIDU4LDEyOCwgNTgsMTUyLCA1OCwxNjMsMjI2LDIyOSwKLSAgICAyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTcyLDIyNywyMzUsMjQzLDIzNiwyMjUsMjQzLDEwNCwxMjksCi0gICAgICAwLCA5MiwgNTgsIDg0LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDYwLAotICAgIDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA0NCwyMzEsMTE3LCAgMiwgNTgsMTEwLCA1OCwxMTksMjM0LDIyNSwKLSAgICAyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzIsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNDQsCi0gICAgMTA0LCAgMiwgNTgsMTM0LCA1OCwxNDQsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTEyLAotICAgIDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNjMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjgsIDQ4LDIwOCwxMTQsMTI5LCAgMCwxMjQsIDU4LDE2OSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCA5MiwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksICA1LAotICAgIDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjA5LDIyOCwyMzksMTE2LCAgMiwgNTgsMjA5LCA1OCwKLSAgICAyMTgsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgIDMsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCi0gICAgIDMwLCAgNSwxMDEsICA2LCA1OCwyNDAsIDU5LCAgNSwgNTksIDI4LCA1OSwxNzAsIDU5LDE4MSwgNTksMTkzLAotICAgIDIyNSwyMzcsMjI5LDIyOCwyNDMsMjMzLDI0OCwyNDQsMjI5LDIyOSwyMzgsMjQ0LDIzMiwyMzgsMjM5LDI0NCwKLSAgICAyMjksMTE1LDEyOCwgMzgsMTA4LCA5OSwgIDIsIDU5LCAxMSwgNTksIDE4LDIyNSwyNDUsMjQzLDEwMSwxMjgsCi0gICAgIDM0LCA1MywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDksMTA0LCAgNSwgNTksIDQwLAotICAgICA1OSwgNDksIDU5LCA2MywgNTksIDkzLCA1OSwxNTIsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKLSAgICAgNDAsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE0NCwxMDUsCi0gICAgICAyLCA1OSwgNjksIDU5LCA4NCwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjU0LDE0NSwyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyMSwyMzcsMTAxLCAgMiwKLSAgICAgNTksMTAwLCA1OSwxMTMsMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCi0gICAgMTQ2LDIyOSwyMzcsMTA1LCAgMiwgNTksMTIxLCA1OSwxMzYsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwxNTksMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsICA4LDIzOCwyMzksMjM5LDIzOCwyMzAsMjMzLDIzOCwyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMTA5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwyMTcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKLSAgICAgOTgsMTE2LDEzMiwgIDUsMjA5LCA1OSwyMDUsIDU5LDIyNSwgNTksMjQ1LCA1OSwyNTQsIDk3LDEyOSwgIDMsCi0gICAgMTc4LCA1OSwyMTEsMjQzLDI0OSwyMzcsMjI2LDIzOSwyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLAotICAgIDIwOCwyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA0OSwgNTksMjM2LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwyNTEsIDQ5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjA5LDI0MiwyMjUsCi0gICAgMjMwLDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3NiwxMDQsICAyLCA2MCwgMTcsIDYwLAotICAgICA2NywgOTcsICAzLCA2MCwgMjUsIDYwLCAzNSwgNjAsIDQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKLSAgICAxMjgsICA5LDE3MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDUsMjMxLDExNywgIDIsIDYwLCA0OSwgNjAsCi0gICAgIDU4LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTczLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LAotICAgIDEyOCwgMTAsIDQ1LDIzOSwyMzksMTA3LDEyOCwgIDIsIDgzLDEwNSwgIDUsIDYwLCA4NSwgNjAsIDk2LCA2MCwKLSAgICAxMDcsIDYwLDEyMSwgNjAsMTM1LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTUsCi0gICAgMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIxMSwyMzYsMjI1LDIyNiwyMzMsMjI1LAotICAgIDIzNiwyMjcsMjM2LDIzMywyMjcsMTA3LDEyOCwgIDIsMTUyLDIzOCwyMjgsMjMzLDIzMSwyNDUsMjQyLDIzNywKLSAgICAyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgIDIsMjQyLDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCi0gICAgIDUxLCA0OSwxMDgsICAzLCA2MCwxNTQsIDYyLCA1NSwgNjIsIDY2LCA5NywgIDIsIDYwLDE2MCwgNjIsIDUwLAotICAgIDIyNywxMDcsICA2LCA2MCwxNzUsIDYwLDE4NCwgNjAsMjIxLCA2MSwxMTQsIDYxLDE2OSwgNjEsMjIxLDIyNywKLSAgICAyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzcsMjA3LDEwMCwgIDIsIDYwLDE5MCwgNjAsMTk5LDIzMywyMjUsCi0gICAgMjM3LDIzOSwyMzgsMTAwLDEyOCwgMzcsMTk4LDIzOSwyNDcsMjM4LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLAotICAgIDIzOCwyMzEsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4OCwxMDgsICAyLCA2MCwKLSAgICAyMjcsIDYxLCA3NCwxMDEsICAyLCA2MCwyMzMsIDYxLCAxMywyMzAsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsCi0gICAgMjMzLDIzOCwxMDMsICAyLCA2MCwyNDgsIDYxLCAgMiwyNDAsMjM5LDIzMywyMzgsMjQ0LDIyOSwxMTQsMTI4LAotICAgICAzNywxOTYsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE5MiwyMzgsMjQ0LDIzMywKLSAgICAyMjcsMjQ1LDIzNiwyMjUsMjQyLDIyNiwyNDIsMjI1LDIyNywyMzUsMjI5LDExNiwgIDIsIDYxLCAzMywgNjEsCi0gICAgIDUzLDIzNiwyMjksMjMwLDExNiwxMjksIDQ4LCAxNiwgNjEsIDQyLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LAotICAgIDIyNSwxMDgsMTI4LDI1NCwgNTksMjQyLDIzMywyMzEsMjMyLDExNiwxMjksIDQ4LCAxNywgNjEsIDYzLDI0NiwKLSAgICAyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNjAsMjM5LDI0NywyMjksMTE0LCAgMiwgNjEsCi0gICAgIDgzLCA2MSwgOTgsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LAotICAgICAzNywyMjcsMjQyLDIzMywyMzEsMjMyLDI0NCwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwKLSAgICAgMzcsMjI2LDExNCwgIDIsIDYxLDEyMCwgNjEsMTMxLDIyOSwyMjcsMjQ0LDIyNSwyMzgsMjMxLDIzNiwxMDEsCi0gICAgMTI4LCAzNywxNzIsMjMzLDIzMSwyMzIsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwxMDMsICAyLAotICAgICA2MSwxNDgsIDYxLDE1OCwyNDAsMjM5LDIzMywyMzgsMjQ0LDIyOSwxMTQsMTI4LCAzNywxODYsMjQ0LDI0MiwKLSAgICAyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4MiwxMTUsICAzLCA2MSwxNzcsIDYxLDIwNywgNjEsCi0gICAgMjE1LDEwOSwgIDIsIDYxLDE4MywgNjEsMTk1LDIyNSwyMzYsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLAotICAgIDEyOCwgMzcsMTcwLDIzMywyMzYsMjMzLDIzOCwyMzEsMjMwLDIyNSwyMjcsMTAxLDEyOCwgMzgsIDU5LDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCAzNywxNjAsMjQ0LDIyNSwxMTQsMTI4LCAzOCwgIDUsMjQ1LDI0MCwxMTIsCi0gICAgICAyLCA2MSwyMjksIDYyLCAxMSwyMjksMTE0LCAgMiwgNjEsMjM2LCA2MSwyNTEsMjM2LDIyOSwyMzAsMjQ0LAotICAgIDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywyMjgsMjQyLDIzMywyMzEsMjMyLDI0NCwKLSAgICAyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMjI5LDIzOSwyMzMsMjM4LDI0NCwyMzMsCi0gICAgMjM4LDEwMywgIDIsIDYyLCAyMywgNjIsIDM5LDI0MywyMzcsMjI1LDIzNiwyMzYsMjQ0LDI0MiwyMzMsMjI1LAotICAgIDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4MCwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwKLSAgICAgMzcsMTc4LDIzOCwxMDcsMTI4LCAzNiwgMzUsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCi0gICAgIDMwLCAgNywyMzksMjI3LDEwNywxMjgsIDM3LDEzNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCA2NiwxMTEsICAzLCA2MiwgOTIsIDYyLDEwNSwgNjIsMTE2LDIyNiwyMjUsMjMzLDIzNywKLSAgICAyMjUsMjMzLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyNiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCi0gICAgIDk3LDEyOCwgNDgsMTI0LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMjAsMjQwLAotICAgIDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE1NywyNDEsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwKLSAgICAxOTUsMTE0LCAgNCwgNjIsMTU1LCA2MywxNDksIDYzLDIyMiwgNjQsICA1LDIyNSwgOTksICAyLCA2MiwxNjIsCi0gICAgIDYzLCA1NiwxMDEsICAzLCA2MiwxNzAsIDYyLDE3NSwgNjIsMjQzLDIyOSwxMjAsMTI4LDI0OCwyNDQsMjM2LAotICAgIDIyOSwyMzAsMTE2LDEzMywgIDAsMTIzLCA2MiwxOTIsIDYyLDE5NywgNjIsMjE5LCA2MiwyMjcsIDYyLDIzMiwKLSAgICAyMjYsMTE2LDEyOCwyNDgsMjQzLDEwOSwgIDIsIDYyLDIwMywgNjIsMjA4LDIzMywxMDAsMTI4LDI0OCwyNDIsCi0gICAgMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA5MSwyNDMsMjM3LDIyNSwyMzYsMTA4LAotICAgIDEyOCwyNTQsIDkxLDI0NCwxMTIsMTI4LDI0OCwyNDEsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwKLSAgICAxMjgsMjU0LCA1NSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEzMywgIDAsMTI1LCA2MywgIDUsIDYzLCAxMCwgNjMsCi0gICAgIDMyLCA2MywgNDAsIDYzLCA0NSwyMjYsMTE2LDEyOCwyNDgsMjU0LDEwOSwgIDIsIDYzLCAxNiwgNjMsIDIxLAotICAgIDIzMywxMDAsMTI4LDI0OCwyNTMsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA5MywKLSAgICAyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDkyLDI0NCwxMTIsMTI4LDI0OCwyNTIsMjQ2LDIyOSwyNDIsCi0gICAgMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA1NiwyMzUsMjI5LDExNiwgIDIsIDYzLCA2NCwgNjMsMTA2LAotICAgIDIzNiwyMjksMjMwLDExNiwxMzIsICAwLCA5MSwgNjMsIDc5LCA2MywgODQsIDYzLCA4OSwgNjMsMTAxLDIyNiwKLSAgICAxMTYsMTI4LDI0OCwyNDAsMjI5LDEyMCwxMjgsMjQ4LDIzOSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCA1OSwyNDQsMTEyLDEyOCwyNDgsMjM4LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTMyLAotICAgICAgMCwgOTMsIDYzLDEyMiwgNjMsMTI3LCA2MywxMzIsIDYzLDE0NCwyMjYsMTE2LDEyOCwyNDgsMjUxLDIyOSwKLSAgICAxMjAsMTI4LDI0OCwyNTAsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjEsCi0gICAgMjQ0LDExMiwxMjgsMjQ4LDI0OSwyMjksMjQ2LDEwMSwxMzEsICAyLDIxNiwgNjMsMTYxLCA2MywxNzIsIDYzLAotICAgIDE3OCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQ2LDIyNywyMzcsIDk4LDEyOCwKLSAgICAgIDMsICA2LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwxMDAsICAzLCA2MywxOTMsIDYzLDIwNCwgNjMsCi0gICAgMjEwLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDcsMjI3LDIzNywgOTgsMTI4LAotICAgICAgMywgMTcsMjI4LDIzOSwyNDUsMjI2LDIzNiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgOTcsMjMzLDIyOCwKLSAgICAyMzEsMTAxLCAgMiwgNjMsMjMxLCA2MywyNDIsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsCi0gICAgICAzLCA0MiwyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LAotICAgIDIzNywgOTgsMTI4LCAgMywgNTgsMjM5LDIzNSwyMjksMjM4LDIyNiwyMjUsMTE0LDEyOCwgIDAsMTY2LDExNSwKLSAgICAgIDIsIDY0LCAyMSwgNjQsIDI5LDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxMjgsMjQ1LDI0MCwyMjksCi0gICAgMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjM0LDI0NCwyMzksMjQwLDIyNiwyMjUsMTE0LDEyOCwgIDEsMTMxLAotICAgIDExNywgIDMsIDY0LCA1NiwgNjQsIDY3LCA2NCwgNzgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywKLSAgICAxMjgsIDQ4LDExOCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjE0LDIzNiwxMDgsCi0gICAgICAyLCA2NCwgODUsIDY0LDExNSwyMjksMTE2LDEzMCwgMzIsIDM0LCA2NCwgOTQsIDY0LDEwNCwyMzMsMjM4LAotICAgIDI0NiwyMjksMjQyLDI0MywxMDEsMTI4LCAzNywyMTYsMjM5LDI0MCwyMjksMjQyLDIyNSwyNDQsMjM5LDExNCwKLSAgICAxMjgsIDM0LCAyNSwyNDMsMjI5LDI0OSwxMDEsMTI4LCAzNywyMDYsIDk5LDE0MywgIDAsIDk5LCA2NCwxNTYsCi0gICAgIDY1LDEwNSwgNjUsMTE2LCA2NSwxODAsIDY1LDIxMSwgNjYsIDQ4LCA2NywyMTUsIDY4LDE5OSwgNjksIDQzLAotICAgICA2OSwgOTIsIDcyLCA4NCwgNzIsIDkyLCA3MiwxMDIsIDcyLDExNCwgNzIsMTQ3LCA5NywgIDksIDY0LDE3NiwKLSAgICAgNjQsMTg3LCA2NCwxOTcsIDY0LDIwNCwgNjQsMjExLCA2NCwyMzYsIDY0LDI0NiwgNjUsIDQyLCA2NSwgNTEsCi0gICAgMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExMCwyMjYsMjI5LDIzOCwyMzEsMjI1LAotICAgIDIzNiwxMDUsMTI4LCAgOSwxNTQsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsICA3LDIyOCwyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LCAyNiwyMzEsMTE3LCAgMiwgNjQsMjE4LCA2NCwyMjcsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCi0gICAgMTI4LCAxMCwxNTQsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjYsMjM2LDI0MywyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM2LDIzOCwyMjgsMjQyLDIyNSwyMjYsMjMzLDIzOCwyMjgsMTE3LCAgNCwKLSAgICAgNjUsICA4LCA2NSwgMTgsIDY1LCAyNCwgNjUsIDMxLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsCi0gICAgICA5LDEyOSwyMjcsMjM3LCA5OCwxMjgsICAzLCAxNiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDEsMjMxLAotICAgIDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEyOSwyNDAsMjQzLDIzNiwyMzksMjI3LDEwNywKLSAgICAxMjgsIDMzLDIzNCwxMTQsICAzLCA2NSwgNTksIDY1LCA2NSwgNjUsIDkxLDIyOSwyMzksMTAyLDEyOCwgMzMsCi0gICAgICA1LDIzOSwxMTAsMTMwLCAgMiwxOTksIDY1LCA3NCwgNjUsIDg1LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LAotICAgIDIzNywgOTgsMTI4LCAgMywgNDQsMjI3LDIzNywgOTgsMTI4LCAgMywgMTIsMjQyLDIzMywyMjUsMjMxLDIyOSwKLSAgICAyNDIsMjI5LDI0NCwyNDUsMjQyLDExMCwxMjgsIDMzLDE4MSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsCi0gICAgMTExLDEyOCwgNDksIDI0LCA5OSwgIDQsIDY1LDEyNiwgNjUsMTMzLCA2NSwxNTIsIDY1LDE3NCwyMjUsMjQyLAotICAgIDIzOSwxMTAsMTI4LCAgMSwgMTMsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI5LCAgMCwyMzEsIDY1LDE0NCwKLSAgICAyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsICA5LDIzMywyNDIsIDk5LCAgMiwgNjUsMTYwLCA2NSwxNjUsCi0gICAgMjM2LDEwMSwxMjgsIDM2LDIxMCwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCAgOSwyNDUsMjQyLAotICAgIDEwOCwxMjgsICAyLCA4NSwxMDAsICAyLCA2NSwxODYsIDY1LDIwMiwyMzksMTE2LDEyOSwgIDEsIDExLCA2NSwKLSAgICAxOTMsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMTEsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCi0gICAgMTI4LCA1MSwxOTcsMTAxLCAgMiwgNjUsMjE3LCA2NSwyMzMsMjI4LDIzMywyMzYsMjM2LCA5NywxMjksICAwLAotICAgIDE4NCwgNjUsMjI3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDM5LDIzOCwxMTYsMTMyLCAgMCwxNjIsIDY1LDI0NiwKLSAgICAgNjYsIDE0LCA2NiwgMjYsIDY2LCAzNywxMDUsICAyLCA2NSwyNTIsIDY2LCAgNCwyMzEsMjQyLDIyNSwyMjgsCi0gICAgMTAxLDEyOCwgMzMsICAzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIyMywyMzcsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LDIyNCwyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwKLSAgICAyMzYsMTAxLDEyOCwyNDcsMTYyLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMjQsCi0gICAgMTA0LCAgNSwgNjYsIDYwLCA2NiwxMjMsIDY2LDEzNCwgNjcsIDYyLCA2NywxNTQsIDk3LCAgNCwgNjYsIDcwLAotICAgICA2NiwgODEsIDY2LCA5MSwgNjYsIDk4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKLSAgICAxMjEsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTU1LDIyOCwyMjksMjQ2LCA5NywxMjgsCi0gICAgICA5LCAyNywyMzEsMTE3LCAgMiwgNjYsMTA1LCA2NiwxMTQsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LAotICAgICAxMCwxNTUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjcsMjI2LDIzOSwyNDAsMjM5LDIzNywKLSAgICAyMzksMjMwLDExMSwxMjgsIDQ5LCAyMCwxMDEsICA2LCA2NiwxNDgsIDY2LDE2OCwgNjYsMTkyLCA2NywgIDQsCi0gICAgIDY3LCAxNiwgNjcsIDM3LDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODksIDk5LCAgMiwgNjYsMTc0LCA2NiwxODIsMjM1LDIzNywKLSAgICAyMjUsMjQyLDEwNywxMjgsIDM5LCAxOSwyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNzEsCi0gICAgMTAwLCAgMiwgNjYsMTk4LCA2NiwyNDIsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDExNCwgIDIsIDY2LAotICAgIDIxMSwgNjYsMjMxLDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTEsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LDE4MywyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LDI0NSwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExNSwKLSAgICAyMzUsMjMyLDIyNSwyMzUsMjI1LDI0MywyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDIwNCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LDI0MywyNDQsMjQyLAotICAgIDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODUsMTA1LDEyOSwKLSAgICAgIDMsMTk5LCA2NywgNjgsMjI5LDI0NSwyMjcsMTA0LCAgNCwgNjcsIDgxLCA2NywxMTYsIDY3LDEzMSwgNjcsCi0gICAgMTQwLCA5NywgIDIsIDY3LCA4NywgNjcsMTAyLDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNTAsMTE5LDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA1MCwgMjMsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCi0gICAgMTI4LCA1MCwxMDUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzQsMjQwLDIyNSwyNDIsMjI5LAotICAgIDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAgOSwxMTEsICAyLCA2NywxNjAsIDY3LDIxMCwKLSAgICAyMjcsMTA0LCAgMywgNjcsMTY5LCA2NywxOTEsIDY3LDIwMSwyMjUsMTEwLCAgMiwgNjcsMTc2LCA2NywxODQsCi0gICAgMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAxMCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDgsMjMzLAotICAgIDIzOCwyMzEsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsICA5LDIzOSwyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDEyLDIzOSwxMDcsMTI4LCAgMSwxMzYsMTA1LCAgMiwgNjcsMjIxLCA2OCwgNjcsMjI5LDI0NSwgOTksCi0gICAgICA1LCA2NywyMzUsIDY4LCAxNCwgNjgsIDI5LCA2OCwgMzgsIDY4LCA1MiwgOTcsICAyLCA2NywyNDEsIDY4LAotICAgICAgMCwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDExOCwKLSAgICAyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDIyLDIyNywyMzMsCi0gICAgMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTA0LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksIDcyLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA1MCwgIDgsMjQ1LDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCi0gICAgMTI4LCA1MCwgMjgsMjQyLCA5OSwgIDIsIDY4LCA3NCwgNjgsMTY5LDIzNiwxMDEsMTMyLCAzNywyMDMsIDY4LAotICAgICA4NywgNjgsIDk4LCA2OCwxMDMsIDY4LDEyNywyMzcsMjQ1LDIzNiwyNDQsMjMzLDI0MCwyMzYsMTIxLDEyOCwKLSAgICAgMzQsMTUxLDIzOSwxMTYsMTI4LCAzNCwxNTMsMTEyLCAgMiwgNjgsMTA5LCA2OCwxMTUsMjM2LDI0NSwxMTUsCi0gICAgMTI4LCAzNCwxNDksMjM5LDI0MywyNDQsMjI1LDIzNiwyMzcsMjI1LDI0MiwxMDcsMTI4LCA0OCwgNTQsMjQ3LAotICAgIDIzMywyNDQsMTA0LCAgMiwgNjgsMTM2LCA2OCwxNTIsMjM2LDIyOSwyMzAsMjQ0LDIzMiwyMjUsMjM2LDIzMCwKLSAgICAyMjYsMjM2LDIyNSwyMjcsMTA3LDEyOCwgMzcsMjA4LDI0MiwyMzMsMjMxLDIzMiwyNDQsMjMyLDIyNSwyMzYsCi0gICAgMjMwLDIyNiwyMzYsMjI1LDIyNywxMDcsMTI4LCAzNywyMDksMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTMwLAotICAgICAgMiwxOTgsIDY4LDE4MiwgNjgsMTkzLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywKLSAgICAgNDUsMjI3LDIzNywgOTgsMTI4LCAgMywgIDIsMTA4LCAgMywgNjgsMjA3LCA2OCwyMTMsIDY5LCAxMSwyMjksCi0gICAgMjI1LDExNCwxMjgsIDM1LCAzOSwyMzMsMjI3LDEwNywgIDQsIDY4LDIyNSwgNjgsMjM2LCA2OCwyNDUsIDY4LAotICAgIDI1NSwyMjUsMjM2LDI0NiwyMjksMjM5LDIzNiwyMjUsMTE0LDEyOCwgIDEsMTk0LDIyOCwyMjksMjM4LDI0NCwKLSAgICAyMjUsMTA4LDEyOCwgIDEsMTkyLDIzNiwyMjUsMjQ0LDIyOSwyNDIsMjI1LDEwOCwxMjgsICAxLDE5MywyNDIsCi0gICAgMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLDE5NSwyNDUsIDk4LDEyOSwgMzgsIDk5LAotICAgICA2OSwgMTgsMjQzLDI0NSwyMzMsMTE2LCAgMiwgNjksIDI3LCA2OSwgMzUsMjI2LDIzNiwyMjUsMjI3LDEwNywKLSAgICAxMjgsIDM4LCA5OSwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzgsMTAzLDEwOSwgIDMsIDY5LCA1MSwgNjksCi0gICAgIDY1LCA2OSwgNzYsMjI3LDI0NSwyMjYsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLAotICAgIDE2NCwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDY3LDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2MCwxMTEsICA4LCA2OSwxMTAsCi0gICAgIDY5LDEyMSwgNjksMjA4LCA3MCwxNTAsIDcxLDE3OSwgNzEsMjEwLCA3MiwgNjEsIDcyLCA3MCwyMjUsMjQyLAotICAgIDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTI5LDIzNiwyMzksMTEwLDEzMSwgIDAsIDU4LCA2OSwKLSAgICAxMzMsIDY5LDE1OCwgNjksMTc3LDIzNywyMzksMTEwLCAgMiwgNjksMTQxLCA2OSwxNDksMjI5LDI0NCwyMjUsCi0gICAgMjQyLDEyMSwxMjgsIDMyLDE2MSwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyNiwxMTUsICAyLAotICAgICA2OSwxNjQsIDY5LDE3MCwyMzMsMjMxLDExMCwxMjgsIDMyLDE2MSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwKLSAgICAgODUsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjQ1LDIzNiwyMjUsMTE0LCAgMiwgNjksMTkyLCA2OSwyMDIsCi0gICAgMjMyLDIyNSwyMzYsMjMwLDIzNywyMzksMTAwLDEyOCwgIDIsMjA5LDIzNywyMzksMTAwLDEyOCwgIDIsMjA4LAotICAgIDEwOSwgIDIsIDY5LDIxNCwgNzAsMTQzLDIzNywgOTcsMTM0LCAgMCwgNDQsIDY5LDIzMSwgNzAsIDM5LCA3MCwKLSAgICAgNTAsIDcwLCA2MiwgNzAsIDkyLCA3MCwxMTUsIDk3LCAgMywgNjksMjM5LCA3MCwgIDksIDcwLCAxNywyMjYsCi0gICAgMjM5LDI0NiwxMDEsICAyLCA2OSwyNDgsIDY5LDI1NCwyMjcsMjM3LCA5OCwxMjgsICAzLCAxOSwyNDIsMjMzLAotICAgIDIzMSwyMzIsMjQ0LDIyNywyMzcsIDk4LDEyOCwgIDMsIDIxLDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LDI0NiwKLSAgICAxOTUsMTE0LCAgMiwgNzAsIDIzLCA3MCwgMzAsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDEyLDIzNywyMjksCi0gICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDkzLDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAotICAgIDI0NiwyMjUsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTIsMjQyLDIyOSwKLSAgICAyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwgIDIsIDcwLCA3NSwgNzAsIDg2LDIyNSwyMjYsMjM5LDI0NiwyMjksCi0gICAgMjI3LDIzNywgOTgsMTI4LCAgMywgMjAsMjM3LDIzOSwxMDAsMTI4LCAgMiwxODksMTE1LCAgMiwgNzAsIDk4LAotICAgICA3MCwxMDUsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDgwLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwKLSAgICAxMjgsMjQ2LDIyNiwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwgIDIsIDcwLDEyNiwgNzAsMTM3LDIyNSwyMjYsCi0gICAgMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgMTgsMjM3LDIzOSwxMDAsMTI4LCAgMiwxODcsMjQwLAotICAgIDIyNSwyNDMsMTE1LDEyOCwgMzgsIDYwLDExMCwgIDIsIDcwLDE1NiwgNzAsMTY1LDIzMSwyNDIsMjQ1LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgMzQsIDY5LDExNiwgIDIsIDcwLDE3MSwgNzAsMTg1LDIzOSwyNDUsMjQyLDIzMywyMzgsCi0gICAgMjQ0LDIyOSwyMzEsMjQyLDIyNSwxMDgsMTI4LCAzNCwgNDYsMjQyLDIzOSwxMDgsMTQyLCAzNSwgIDMsIDcwLAotICAgIDIxOSwgNzAsMjI1LCA3MCwyNDAsIDcwLDI1NSwgNzEsIDQzLCA3MSwgODgsIDcxLDEwMiwgNzEsMTA3LCA3MSwKLSAgICAxMTIsIDcxLDExNywgNzEsMTIzLCA3MSwxMjgsIDcxLDE2OSwgNzEsMTc0LDE5MywxOTUsIDc1LDEyOCwgIDAsCi0gICAgICA2LCA2NiwgIDIsIDcwLDIzMSwgNzAsMjM2LDE5NywgNzYsMTI4LCAgMCwgIDcsIDgzLDEyOCwgIDAsICA4LAotICAgICA2NywgIDIsIDcwLDI0NiwgNzAsMjUxLDE5MywgNzgsMTI4LCAgMCwgMjQsIDgyLDEyOCwgIDAsIDEzLCA2OCwKLSAgICAgIDMsIDcxLCAgNywgNzEsIDMzLCA3MSwgMzgsIDY3LCAgNCwgNzEsIDE3LCA3MSwgMjEsIDcxLCAyNSwgNzEsCi0gICAgIDI5LCA0OSwxMjgsICAwLCAxNywgNTAsMTI4LCAgMCwgMTgsIDUxLDEyOCwgIDAsIDE5LCA1MiwxMjgsICAwLAotICAgICAyMCwxOTcsIDc2LDEyOCwgIDAsMTI3LDIwNCwgNjksMTI4LCAgMCwgMTYsIDY5LCAgNSwgNzEsIDU1LCA3MSwKLSAgICAgNTksIDcxLCA2NCwgNzEsIDY5LCA3MSwgNzQsIDc3LDEyOCwgIDAsIDI1LDIwNiwgODEsMTI4LCAgMCwgIDUsCi0gICAgMjA3LCA4NCwxMjgsICAwLCAgNCwyMTEsIDY3LDEyOCwgIDAsIDI3LCA4NCwgIDIsIDcxLCA4MCwgNzEsIDg0LAotICAgICA2NiwxMjgsICAwLCAyMywgODgsMTI4LCAgMCwgIDMsIDcwLCAgMiwgNzEsIDk0LCA3MSwgOTgsIDcwLDEyOCwKLSAgICAgIDAsIDEyLCA4MywxMjgsICAwLCAyOCwxOTksIDgzLDEyOCwgIDAsIDI5LDIwMCwgODQsMTI4LCAgMCwgIDksCi0gICAgMjA0LCA3MCwxMjgsICAwLCAxMCwyMDYsMTkzLCA3NSwxMjgsICAwLCAyMSwyMTAsIDgzLDEyOCwgIDAsIDMwLAotICAgICA4MywgIDUsIDcxLDE0MCwgNzEsMTQ0LCA3MSwxNTQsIDcxLDE1OSwgNzEsMTY0LCA3MywxMjgsICAwLCAxNSwKLSAgICAgNzksMTI5LCAgMCwgMTQsIDcxLDE1MCwgODQsMTI4LCAgMCwgIDIsMjEyLCA4OCwxMjgsICAwLCAgMSwyMTMsCi0gICAgIDY2LDEyOCwgIDAsIDI2LDIxNywgNzgsMTI4LCAgMCwgMjIsMjEzLCA4MywxMjgsICAwLCAzMSwyMTQsIDg0LAotICAgIDEyOCwgIDAsIDExLDI0MCwyNDksMjQyLDIzMywyMzEsMjMyLDExNiwxMjksICAwLDE2OSwgNzEsMTkxLDExNSwKLSAgICAgIDIsIDcxLDE5NywgNzEsMjAzLDIyNSwyMzgsMTE1LDEyOCwyNDgsMjMzLDIyOSwyNDIsMjMzLDEwMiwxMjgsCi0gICAgMjQ2LDIxNywxMTQsICAyLCA3MSwyMTYsIDcyLCA0NCwyMzgsMjI5LDI0MiwyMjYsMjQyLDIyNSwyMjcsMjM1LAotICAgIDIyOSwxMTYsICAyLCA3MSwyMzEsIDcyLCAgOSwyMzYsMjI5LDIzMCwxMTYsMTMwLCA0OCwgMTIsIDcxLDI0MiwKLSAgICAgNzEsMjU0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsIDk4LDI0NiwyMjksCi0gICAgMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNjUsMjQyLDIzMywyMzEsMjMyLDExNiwxMzAsIDQ4LAotICAgICAxMywgNzIsIDIxLCA3MiwgMzMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKLSAgICAgOTksMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA2NiwyNDAsMjM5LDI0MiwyMjUsCi0gICAgMjQ0LDIzMywyMzksMjM4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI3LDI0MywyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMTk5LDI0NiwyMjksMjQyLDIzNSwyMzEsMjQzLDI0MSwyNDUsMjI1LDI0MiwKLSAgICAxMDEsMTI4LCA1MSwxOTgsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE1OCwyNDIsMjQ1LDI1MCwyMjksCi0gICAgMjMzLDI0MiwxMTEsMTI4LCAzMiwxNjIsMjQzLDI0NCwyNDIsMjI5LDI0NCwyMjcsMjMyLDIyOSwxMDAsMTI4LAotICAgICAgMiwxNTEsMjQ1LDExNCwgIDIsIDcyLDEyMSwgNzIsMTM5LDIzNiwxMjEsICAyLCA3MiwxMjgsIDcyLDEzNCwKLSAgICAyMjUsMjM4LDEwMCwxMjgsIDM0LDIwNywyMzksMTE0LDEyOCwgMzQsMjA2LDI0MiwyMjksMjM4LDIyNywxMjEsCi0gICAgMTI4LCAgMCwxNjQsMjQ5LDExNCwgIDQsIDcyLDE1OCwgNzIsMTY2LCA3MiwxNzMsIDcyLDE4MSwxOTQsMjQyLAotICAgIDIyOSwyNDYsMTAxLDEyOCwyNDYsMjA5LDE5OCwyMzYsMjI5LDEyMCwxMjgsMjQ2LDIxMCwyMjYsMjQyLDIyOSwKLSAgICAyNDYsMTAxLDEyOCwyNDYsMjEyLDIzMCwyMzYsMjI5LDEyMCwxMjgsMjQ2LDIxMywxMDAsMTQ2LCAgMCwxMDAsCi0gICAgIDcyLDIyOCwgNzQsMTEwLCA3NSwxMzQsIDc1LDE5NCwgNzYsMTE0LCA3NywgNjgsIDc3LDEzMCwgNzgsIDU5LAotICAgICA3OCwgNzIsIDc4LCA4MSwgNzgsMTA3LCA3OCwxMzIsIDc4LDE0MSwgNzksMjA4LCA3OSwyMTYsIDc5LDIyNywKLSAgICAgNzksMjQ3LCA4MCwgMTksIDk3LCAxMSwgNzIsMjUyLCA3MywgIDcsIDczLCAxNywgNzMsIDg5LCA3MywxNTIsCi0gICAgIDczLDE2MywgNzMsMTc0LCA3MywyNDMsIDc0LCA0OSwgNzQsIDU1LCA3NCwgODUsMjI1LDI0MiwyMzcsMjI5LAotICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEwMCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKLSAgICAxNjYsMTAwLCAgNSwgNzMsIDI5LCA3MywgMzgsIDczLCA0NCwgNzMsIDU4LCA3MywgNzQsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LCAgNiwgNTQsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzgsMjMwLDIzMywyMzgsMjI1LAotICAgIDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE5MCwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxOTEsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxOTIsMTAzLCAgMywgNzMsIDk3LCA3MywxMTQsIDczLAotICAgIDEyOCwyMjksMjQzLDEwNCwxMjksICA1LDE4OCwgNzMsMTA1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMTg4LDIzMSwyMjksMTE0LDEyOSwgMzIsIDMyLCA3MywxMjIsMjI4LDIyNiwxMDgsMTI4LCAzMiwgMzMsCi0gICAgMTE3LCAgMiwgNzMsMTM0LCA3MywxNDMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNjYsMjQyLAotICAgIDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywKLSAgICAxMjgsIDQ4LCA5NiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTkyLDEwOCwgIDMsCi0gICAgIDczLDE4MiwgNzMsMTkxLCA3MywyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDcsMjI5LAotICAgIDExNiwxMzAsICA1LDIxMSwgNzMsMjAwLCA3MywyMjAsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwKLSAgICAgNTEsIDczLDIxMSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1MSwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDIxMSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwyNTQsMTcwLDIzNywyMzcsIDk3LCAgMywgNzMsMjUzLCA3NCwgIDYsIDc0LCAxOCwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA3OSwyMzYsMjM5LDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCA3OSwyNDQsMjI1LDIzOCwgOTcsICAyLCA3NCwgMjcsIDc0LCA0MSwyMzYsMjQ0LDIzOSwyMzgsMjI5LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDc2LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKLSAgICAgNzYsMjM4LDIyOCwgOTcsMTI4LCAgOSwxMDAsMjQyLDIzMSwgOTcsICAyLCA3NCwgNjMsIDc0LCA3MiwyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2NywyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwxNjcsMjQzLDIzMywyMjUsMjQwLDIzOCwyMjksMjQ1LDIzNywyMjUsMjQ0LDIyNSwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsMjI3LDIyNywyMzcsIDk4LDEyOCwgIDQsMTMzLCA5OCwgIDMsCi0gICAgIDc0LDExOCwgNzUsMTE1LCA3NSwxMjUsMTA4LCAgOSwgNzQsMTM4LCA3NCwxNDYsIDc1LCAgMywgNzUsIDExLAotICAgICA3NSwgMjcsIDc1LCAzOCwgNzUsIDU2LCA3NSwgNzAsIDc1LCA4MSwxOTksMjQyLDIyNSwyNDYsMTAxLDEyOCwKLSAgICAyNDYsMjExLCA5NywgIDIsIDc0LDE1MiwgNzQsMjA5LDIzOCwyMzEsMjM2LDIyOSwyMjYsMjQyLDIyNSwyMjcsCi0gICAgMjM1LDIyOSwxMTYsICAyLCA3NCwxNjgsIDc0LDE4OCwyMzYsMjI5LDIzMCwxMTYsMTI5LCA0OCwgMTAsIDc0LAotICAgIDE3NywyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDYxLDI0MiwyMzMsMjMxLDIzMiwKLSAgICAxMTYsMTI5LCA0OCwgMTEsIDc0LDE5OCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsCi0gICAgIDYyLDExNCwgIDIsIDc0LDIxNSwgNzQsMjM2LDIyNywyMzIsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LAotICAgIDIyOCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQzLDI0MiwyMzksMTE5LCAgMiwKLSAgICAgNzQsMjQ0LCA3NCwyNTEsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsMjEyLDI0MiwyMzMsMjMxLDIzMiwxMTYsCi0gICAgMTI4LCAzMywyMTAsMjI4LDIyNSwyMzgsMjI4LCA5NywxMjgsICA5LDEwMSwyMzEsMjQyLDIyNSwyNDYsMTAxLAotICAgIDEyOSwyNDYsMjE0LCA3NSwgMjEsMjI3LDIzNywgOTgsMTI4LCAgMywgMTUsMjMzLDIzOCwyNDQsMjI5LDIzMSwKLSAgICAyNDIsMjI1LDEwOCwxMjgsIDM0LCA0NCwyMzYsMjM5LDI0NywyMzYsMjMzLDIzOCwxMDEsMTI5LCAzMiwgMjMsCi0gICAgIDc1LCA1MCwyMjcsMjM3LCA5OCwxMjgsICAzLCA1MSwyMzksMjQ2LDIyOSwyNDIsMjM2LDIzMywyMzgsMjI5LAotICAgIDIyNywyMzcsIDk4LDEyOCwgIDMsIDYzLDI0MCwyNDIsMjMzLDIzNywyMjksMjM3LDIzOSwxMDAsMTI4LCAgMiwKLSAgICAxODYsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwgIDIsIDc1LCA5NCwgNzUsMTAwLDIyNiwyMjUsCi0gICAgMTE0LDEyOCwgMzIsIDIyLDIzNiwyMzMsMjM4LDIyOSwyMjUsMjI2LDIzOSwyNDYsMjI5LDIyNywyMzcsIDk4LAotICAgIDEyOCwgIDMsIDE0LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAgOSwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLDIwMCwgOTksICA0LCA3NSwxNDQsIDc1LDE1MSwgNzUsMTYwLCA3NSwxODcsCi0gICAgMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsIDE1LDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDE3LAotICAgIDIzMywyNDIsIDk5LCAgMiwgNzUsMTY4LCA3NSwxNzMsMjM2LDEwMSwxMjgsIDM2LDIxMSwyNDUsMjM3LDIzMCwKLSAgICAyMzYsMjI5LDI0OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDE5LDI0MiwyMzksMjI1LDExNiwxMjgsCi0gICAgICAxLCAxNywxMDAsICA0LCA3NSwyMDQsIDc2LCAyOSwgNzYsIDM5LCA3NiwgOTAsIDk3LCAgNCwgNzUsMjE0LAotICAgICA3NSwyMjQsIDc1LDIzMSwgNzYsICAwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2MSwKLSAgICAyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzMsMjMxLDExNywgIDIsIDc1LDIzOCwgNzUsMjQ3LDIzNCwyMjUsCi0gICAgMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTYxLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDMzLAotICAgIDEwOCwgIDIsIDc2LCAgNiwgNzYsIDE1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTM2LDIzMCwKLSAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMzcsMjI4LDIzMiwyMjUsCi0gICAgMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkyLDIzMiwgOTcsICAzLCA3NiwgNDgsIDc2LCA1OCwgNzYsIDY1LAotICAgIDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2MiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwKLSAgICAgMzQsMjMxLDExNywgIDIsIDc2LCA3MiwgNzYsIDgxLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsCi0gICAgMTYyLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDM0LDIzOSwxMTYsICAyLCA3NiwgOTcsIDc2LAotICAgIDEwNiwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLCAxMSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKLSAgICAgMzAsIDEzLDEwMSwgIDgsIDc2LDEzMiwgNzYsMTg1LCA3NiwxOTIsIDc2LDIxNywgNzYsMjI3LCA3NiwyMzgsCi0gICAgIDc3LCAyNywgNzcsIDYzLCA5OSwgIDIsIDc2LDEzOCwgNzYsMTc1LDIzMywyMzcsMjI1LDIzNiwyNDMsMjI5LAotICAgIDI0MCwyMjUsMjQyLDIyNSwyNDQsMjM5LDExNCwgIDIsIDc2LDE1NiwgNzYsMTY1LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwgIDYsMTA3LDI0MCwyMjksMjQyLDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDEwNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNTIsMjMxLDI0MiwyMjksMTAxLDEyOCwgIDAsMTc2LAotICAgIDIzMiwxMDUsICAyLCA3NiwxOTksIDc2LDIwOCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3MywKLSAgICAyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEwMywyMzMsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksCi0gICAgMTI4LCAgMywyMzksMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE5OSwxMDgsICAyLAotICAgICA3NiwyNDQsIDc3LCAxMSwyMjksMjQ0LDEwMSwgIDIsIDc2LDI1MiwgNzcsICAzLDIzNiwyMjksMjMwLDExNiwKLSAgICAxMjgsIDM1LCA0MywyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzUsIDM4LDI0NCwgOTcsMTI5LCAgMywxODAsCi0gICAgIDc3LCAxOCwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAxLDE0MSwyMzgsMjM5LDIzNywyMzMsMjM4LAotICAgIDIyNSwyNDQsMjM5LDI0MiwyMzcsMjMzLDIzOCwyNDUsMjQzLDIzOSwyMzgsMjI5LDIzOCwyNDUsMjM3LDIyOSwKLSAgICAyNDIsMjI1LDI0NCwyMzksMjQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0OCwyNTAsCi0gICAgMTA0LDEyOCwgIDIsMTY0LDEwNCwgIDIsIDc3LCA3NCwgNzcsMTI0LCA5NywgIDMsIDc3LCA4MiwgNzcsIDkyLAotICAgICA3NywgOTksMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTY3LDIyOCwyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LCAzOSwyMzEsMTE3LCAgMiwgNzcsMTA2LCA3NywxMTUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCi0gICAgMTI4LCAxMCwxNjcsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzksMjM5LDIzOSwxMDcsMTI4LAotICAgICAgMiwgODcsMTA1LCAgNiwgNzcsMTQ0LCA3NywxOTMsIDc3LDI1MywgNzgsICA4LCA3OCwgMTksIDc4LCAyOSwKLSAgICAgOTcsICAyLCA3NywxNTAsIDc3LDE3MiwyMzYsMjQ5LDI0NCwyMzMsMjM1LDIyNSwyNDQsMjM5LDIzOCwyMzksCi0gICAgMTE1LDEyOSwgIDMsMTMzLCA3NywxNjYsMjI3LDIzNywgOTgsMTI4LCAgMywgNjgsMjM3LDIzOSwyMzgsMTAwLAotICAgIDEyOSwgMzgsMTAyLCA3NywxODEsMjQzLDI0NSwyMzMsMjQ0LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzOCwKLSAgICAgOTgsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTMzLCAgMCwxNjgsIDc3LDIxMiwgNzcsMjIwLCA3NywyMzEsCi0gICAgIDc3LDIzNywgNzcsMjQ1LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LDI0NiwyMTUsMjI2LDIyOSwyMzYsMjM5LAotICAgIDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAzNiwyMjcsMjM3LCA5OCwxMjgsICAzLCAgOCwyMzEsMjQyLDIyNSwKLSAgICAyNDYsMTAxLDEyOCwyNDYsMjE2LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzMsMjMyLDIzMywyNDIsCi0gICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA5OCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsMTk0LDI0NCwyNDQsMjM5LDIzNywyMjUsMjQyLDEwNywxMjgsIDQ4LCAgMywyNDYsMTA1LCAgMiwKLSAgICAgNzgsIDM2LCA3OCwgNDcsMjI4LDEwMSwxMjksICAwLDI0NywgNzgsIDQzLDExNSwxMjgsIDM0LCAzNSwyNDMsCi0gICAgMjMzLDIzOSwyMzgsMjQzLDIzNiwyMjUsMjQzLDEwNCwxMjgsIDM0LCAyMSwyMzQsMjI5LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODIsMjM1LDI0MywyMzIsMjI1LDIyOCwxMDEsMTI4LCAzNywKLSAgICAxNDcsMTA4LCAgMiwgNzgsIDg3LCA3OCwgOTgsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCi0gICAgIDMwLCAxNSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE1MSwxMDksICAyLCA3OCwxMTMsIDc4LAotICAgIDEyMSwyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsIDE3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywKLSAgICAxMDEsMTI4LDI1NSwgNjgsMjM4LDIyNiwyMzYsMjM5LDIyNywxMDcsMTI4LCAzNywxMzIsMTExLCAxMCwgNzgsCi0gICAgMTYzLCA3OCwxNzUsIDc4LDE4NSwgNzgsMTk2LCA3OCwyMDcsIDc5LCAyMywgNzksIDI4LCA3OSwgMzksIDc5LAotICAgIDE1NCwgNzksMTgwLDIyNywyMzIsMjI1LDIyOCwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE0LDIyOCwKLSAgICAyMjksMjM1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyMCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCi0gICAgIDk3LDEyOCwgNDgsMTA1LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMDEsMjM2LAotICAgIDIzNiwyMjUsMTE0LDEzMiwgIDAsIDM2LCA3OCwyMjIsIDc4LDIzMywgNzgsMjQ1LCA3OSwgIDAsMjMzLDIzOCwKLSAgICAyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIyNywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCAgNCwyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDM2LAotICAgIDExNSwgIDIsIDc5LCAgNiwgNzksIDEzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LDEwNSwyNDUsMjQwLDIyOSwKLSAgICAyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMjgsMjM4LDEwMywxMjgsIDMyLDE3MSwyNDIsMjQ1LDI0MywyNDEsCi0gICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM4LDExNiwgIDYsIDc5LCA1MywgNzksIDcwLCA3OSwgOTIsIDc5LAotICAgIDEwMywgNzksMTM1LCA3OSwxNDIsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI5LCAgMiwyMTcsIDc5LCA2NCwKLSAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCAgNywyMjYsMjI5LDIzNiwyMzksMjQ3LCA5OSwgIDIsIDc5LCA4MSwgNzksCi0gICAgIDg2LDIzNywgOTgsMTI4LCAgMywgMzUsMjM5LDIzNywgOTgsMTI4LCAgMywgMzUsMjM1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI1MSwyMzYsMjI5LDI0MywxMTUsICAyLCA3OSwxMTIsIDc5LDExNiwKLSAgICAxMDUsMTI4LCAgMSwgNDksMTA2LDEyOSwyNDYsMTkwLCA3OSwxMjIsMjQzLDI0NCwyNDIsMjM5LDIzNSwyMjksCi0gICAgMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsMTMyLDIzNywyMjUsMjQ0LDEwNCwxMjgsIDM0LDE5NywyNDQsMjI5LAotICAgIDIyOCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM3LDIwNCwyNDUsMjI2LDIzNiwyMjksMjQ5LDIzOSwKLSAgICAyMjgsMjQwLDIyNSwyNDQsMjI1LDEwNCwxMjksMjUxLCAzMSwgNzksMTcxLDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwyNTEsIDMxLDI0NywyMzgsMjQ0LDIyNSwyMjcsMTA3LCAgMiwgNzksMTkxLCA3OSwyMDIsMjI2LAotICAgIDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAzMCwyMzcsMjM5LDEwMCwxMjgsICAyLDIxMywKLSAgICAyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTU5LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsCi0gICAgMTI4LDI0NiwyMzUsMTE2LCAgMiwgNzksMjMzLCA3OSwyMzksMjI1LDIzMywxMDgsMTI4LCAgMiwgODYsMjM5LAotICAgIDI0MCwyMjYsMjI1LDExNCwxMjgsICAxLDE0MCwxMTcsICAyLCA3OSwyNTMsIDgwLCAgOCwyMzIsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTAxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCi0gICAgMTI4LCA0OCwxOTcsMTIyLDEzMiwgIDEsMjQzLCA4MCwgMzEsIDgwLCA0MCwgODAsIDU5LCA4MCwgOTYsMjI1LAotICAgIDIzNiwyNDQsMjM5LDIzOCwxMDEsMTI4LCAgMiwxNjMsIDk5LCAgMiwgODAsIDQ2LCA4MCwgNTMsMjI1LDI0MiwKLSAgICAyMzksMTEwLDEyOCwgIDEsMTk4LDI0NSwyNDIsMTA4LDEyOCwgIDIsMTY1LDEwMSwgIDIsIDgwLCA2NSwgODAsCi0gICAgIDg1LDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4NSwKLSAgICAyMzIsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgOTUsMTAxLDE1MSwgIDAsCi0gICAgMTAxLCA4MCwxNTksIDgwLDE3OCwgODAsMjEyLCA4MSwxODYsIDgxLDI0OCwgODIsIDI1LCA4MiwgMzcsIDgyLAotICAgICA2MCwgODIsMTEzLCA4MywyMjUsIDg0LCAyNywgODQsMTI5LCA4NCwyNDUsIDg1LDEyNCwgODUsMTk5LCA4NSwKLSAgICAyMzAsIDg2LCAzNiwgODYsIDg5LCA4NywgMjQsIDg3LDE1NywgODcsMTc3LCA4NywyMjEsIDg4LCA1NiwgOTcsCi0gICAgICAyLCA4MCwxNjUsIDgwLDE3MiwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMCwyMzMsMjQyLDI0NCwxMDQsMTI4LAotICAgICAzOCwgNjUsIDk4LCAgMywgODAsMTg2LCA4MCwxOTUsIDgwLDIwNSwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKLSAgICAxMjgsICA5LDE0MywyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjgsMjQyLDIyOSwyNDYsCi0gICAgMTAxLDEyOCwgIDEsIDIxLCA5OSwgIDUsIDgwLDIyNCwgODEsIDQxLCA4MSwgNTUsIDgxLCA4NywgODEsMTc2LAotICAgICA5NywgIDIsIDgwLDIzMCwgODEsIDM1LDIzOCwyMjgsMjQyLCA5NywgIDMsIDgwLDI0MSwgODAsMjQ4LCA4MSwKLSAgICAgIDMsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDEzLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCi0gICAgMTI4LCAxMCwxNDEsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAyLCA4MSwgMTcsIDgxLAotICAgICAyNCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNjksMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDE5NywyNDIsMjM5LDExMCwxMjgsICAxLCAyNywyMjksMjI4LDIzMywyMzYsMjM2LDIyNSwyMjYsCi0gICAgMjQyLDIyOSwyNDYsMTAxLDEyOCwgMzAsIDI5LDEwNCwgIDIsIDgxLCA2MSwgODEsIDcyLDIyNSwyNDIsMjM3LAotICAgIDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDEsMjQ5LDIzMywyNDcsMjM4LDIyNSwyNDIsMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzUsMjMzLDI0MiwgOTksICAyLCA4MSwgOTUsIDgxLDEwMCwyMzYsCi0gICAgMTAxLDEyOCwgMzYsMjEyLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEzNCwgIDAsMjM0LCA4MSwxMjEsIDgxLAotICAgIDEyOSwgODEsMTM3LCA4MSwxNDgsIDgxLDE1NiwgODEsMTY4LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwKLSAgICAxOTEsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAyNSwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksCi0gICAgMTE5LDEyOCwgMzAsMTk5LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwxOTMsMjMyLDIzOSwyMzksMjM1LAotICAgIDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwxOTUsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE5NywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODQsMTAwLCAgNCwgODEsMTk2LCA4MSwyMDYsCi0gICAgIDgxLDIxMiwgODEsMjIyLDIyNiwyMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAgNSwyMjksMjQ2LAotICAgICA5NywxMjgsICA5LCAxNSwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAgMCwyMzUsMjM5LDExNiwKLSAgICAxMzAsICAxLCAyMywgODEsMjMxLCA4MSwyNDAsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMjMsCi0gICAgMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE4NSwxMDEsICAyLCA4MSwyNTQsIDgyLCAgOSwyMzEsMjQ1LAotICAgIDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDE1LDIzNywyMjUsMjQ0LDI0MiwyMjUsMjMxLDI0NSwKLSAgICAyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA3MSwyMzAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LCA2OCwxMDMsICAyLCA4MiwgNDMsIDgyLCA1MCwyNDIsMjI1LDI0NiwxMDEsMTI4LAotICAgICAgMCwyMzIsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQzLDEwNCwgIDQsIDgyLCA3MCwKLSAgICAgODIsIDgxLCA4MiwgOTIsIDgyLDEwMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCi0gICAgMTAzLDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjksMjMzLDI0MiwyMjUsMjMxLAotICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsIDcyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwKLSAgICAxODcsMTA1LCAgNCwgODIsMTIzLCA4MiwxMzQsIDgzLDE5MiwgODMsMjA3LDIyNiwyMzksMjQwLDIzOSwyMzcsCi0gICAgMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzEsMjMxLDIzMiwxMTYsMTQyLCAgMCwgNTYsIDgyLDE2OCwgODIsMTc3LAotICAgICA4MiwxODcsIDgyLDIxNywgODIsMjI0LCA4MywgIDYsIDgzLCAzMSwgODMsIDc2LCA4MywxMTAsIDgzLDEyMiwKLSAgICAgODMsMTMzLCA4MywxNjYsIDgzLDE3NCwgODMsMTg1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsCi0gICAgMTA0LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIzOCwyMjcsMjMzLDI0MiwyMjcsMjM2LAotICAgIDEwMSwxMjksIDM2LDEwMywgODIsMTk4LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQzLDIyOSwyNDMsMjI1LDIzOCwKLSAgICAyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwxMjgsIDM5LDE0NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMTAsCi0gICAgMjI5LDIyOSwxMTAsICAyLCA4MiwyMzIsIDgyLDI0MSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LAotICAgIDExMywxMTIsICAyLCA4MiwyNDcsIDgyLDI1NCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMzMsMjI5LDI0MiwKLSAgICAyMzMsMjM5LDEwMCwxMjgsIDM2LDE1MywyMzEsMTE3LCAgMiwgODMsIDEzLCA4MywgMjIsMjM0LDIyNSwyNDIsCi0gICAgMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzgsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMTAsMTA0LAotICAgICAgMiwgODMsIDM3LCA4MywgNjMsIDk3LCAgMiwgODMsIDQzLCA4MywgNTQsMjI3LDIzNSwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LDEwNCwyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LCA0MCwyMzgsCi0gICAgMjM5LDI0NCwyMjksMjI2LDIyOSwyMjUsMjM3LDIyOSwxMDAsMTI4LCAzOCwxMDcsMTA1LCAgMiwgODMsIDgyLAotICAgICA4MywxMDAsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwKLSAgICAxMTAsMTI4LCA1MCwgMzksMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTM2LDIzNywyMzksCi0gICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDI0LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LAotICAgIDIzNiwxMDEsMTI4LDI0NywgNTYsMTEyLCAgMiwgODMsMTM5LCA4MywxNDYsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgMzYsMTIzLDIyOSwxMTQsICAyLCA4MywxNTMsIDgzLDE1OSwyMzMsMjM5LDEwMCwxMjgsIDM2LDE0MywyNDMsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDgsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExOSwyNDMsMjQ1LAotICAgIDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTIwLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA4OCwKLSAgICAyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLCAgNywyMzksCi0gICAgMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDEwMSwxMDcsICAyLCA4MywyMzEsIDgzLDI1NSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKLSAgICAxNjgsIDgzLDI0MywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExNiwxMTEsCi0gICAgICAyLCA4NCwgIDUsIDg0LCAyMCwyMzgsMjM1LDIyNSwyNDIsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLAotICAgIDEwNSwxMjgsIDEwLDExNiwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODQsMTA4LCAgMywgODQsIDM1LCA4NCwKLSAgICAgNDYsIDg0LDEwNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU5LDEwMSwgIDIsCi0gICAgIDg0LCA1MiwgODQsIDU5LDIzNywyMjksMjM4LDExNiwxMjgsIDM0LCAgOCwyNDYsMjI5LDExMCwgIDMsIDg0LAotICAgICA2OSwgODQsIDc4LCA4NCwgOTksMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMDYsMTEyLCAgMiwKLSAgICAgODQsIDg0LCA4NCwgOTEsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTI2LDIyOSwyNDIsMjMzLDIzOSwxMDAsCi0gICAgMTI4LCAzNiwxNDYsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEyMiwyMzYsMjMzLDI0MCwyNDMsMjMzLAotICAgIDExNSwxMjksIDMyLCAzOCwgODQsMTE4LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LCAzNCwKLSAgICAyMzgsMTA5LCAgNSwgODQsMTQxLCA4NCwxNjksIDg0LDE4MCwgODQsMjAwLCA4NCwyMTEsMjI1LDIyNywyNDIsCi0gICAgMjM5LDExMCwxMzAsICAxLCAxOSwgODQsMTUzLCA4NCwxNjEsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLAotICAgICAyMywyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsIDIxLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwgNjAsMjI4LDIyNSwyNDMsMTA0LDEyOSwgMzIsIDIwLCA4NCwxODksMjQ2LDIyOSwyNDIsCi0gICAgMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA0OSwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwyNTUsIDY5LDExMiwgIDIsIDg0LDIxNywgODQsMjM3LDIzMiwyMjUsMjQzLDIzMywyNDMsMjM3LDIyNSwKLSAgICAyNDIsMjM1LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTEsMjQ0LDI0OSwyNDMsCi0gICAgMjI5LDExNiwxMjgsIDM0LCAgNSwxMTAsICA2LCA4NSwgIDMsIDg1LCAxNCwgODUsIDI1LCA4NSwgNjksIDg1LAotICAgIDEwMSwgODUsMTE2LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzUsMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2MSwxMDAsICAyLCA4NSwgMzEsIDg1LCA1MCwyMjUsCi0gICAgMjQzLDEwNCwxMjksIDMyLCAxOSwgODUsIDM5LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LAotICAgIDI1NCwgNTAsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsMTYzLDEwMywxMzAsICAxLCA3NSwgODUsIDc3LCA4NSwgODgsMjI2LDIzOSwyNDAsCi0gICAgMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAzNywyMzIsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwxNjUsMjMyLDIzOSwyMzksMjM1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwyMDAsMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsIDMyLCAgMiwxMTEsICAzLCA4NSwxMzIsCi0gICAgIDg1LDE0MCwgODUsMTQ5LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI4LCAgMSwgMjUsMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwgODMsMjQwLDIyOSwxMTAsMTMwLCAgMiwgOTEsIDg1LDE1OSwgODUsMTY4LDIyNywKLSAgICAyMzYsMjM5LDI0MywyMjksMTAwLDEyOCwgIDIsMTU0LDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsCi0gICAgMTMwLCAgMiwgOTIsIDg1LDE4MywgODUsMTkyLDIyNywyMzYsMjM5LDI0MywyMjksMTAwLDEyOCwgIDIsIDk0LAotICAgIDIzMiwyMzksMjM5LDEwNywxMjgsICAyLCA5MywxMTIsICAyLCA4NSwyMDUsIDg1LDIxMiwyMjUsMjQyLDIyOSwKLSAgICAxMTAsMTI4LCAzNiwxNjAsMjQzLDIzMywyMzYsMjM5LDExMCwxMjksICAzLDE4MSwgODUsMjIyLDI0NCwyMzksCi0gICAgMjM4LDIzOSwxMTUsMTI4LCAgMywxNzMsMjQxLDExNywgIDIsIDg1LDIzNywgODYsIDI1LDIyNSwxMDgsMTMwLAotICAgICAgMCwgNjEsIDg1LDI0NiwgODYsICAyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsIDI5LDExNSwgIDIsIDg2LCAgOCwgODYsIDE1LDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LDEwMiwyNDUsCi0gICAgMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMjQsMjMzLDI0NiwyMjUsMjM2LDIyOSwyMzgsMjI3LAotICAgIDEwMSwxMjgsIDM0LCA5NywxMTQsICAzLCA4NiwgNDQsIDg2LCA1NSwgODYsIDY2LDIyNiwyMzksMjQwLDIzOSwKLSAgICAyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LCA2NCwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI5LCAgMiwgODgsIDg2LCA3OCwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDc3LDExNSwgIDYsIDg2LDEwMywgODYsMTE0LCA4NiwKLSAgICAxMzQsIDg2LDIxNSwgODcsICA0LCA4NywgMTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LCA2NSwyMjgsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMTcxLDEwNCwxMzIsICAyLDEzMSwgODYsMTQ2LCA4NiwxNTMsIDg2LDE4NCwKLSAgICAgODYsMTk5LDIyNywyNDUsMjQyLDEwOCwxMjgsICAyLDEzNCwyMzksMjQyLDExNiwgIDIsIDg2LDE2MSwgODYsCi0gICAgMTY4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxNCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLAotICAgIDIzOCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzAsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDIyOCwKLSAgICAyMzYsMjM5LDIzOSwxMTIsMTI4LCAgMSwxNzAsMjQzLDI0MSwyNDUsMjI1LDI0NCwyNDIsMjI5LDI0NiwyMjksCi0gICAgMjQyLDI0MywyMjksMTAwLDEyOCwgIDIsMTMzLDIzNywyMjUsMjM2LDEwOCwgIDIsIDg2LDIyNCwgODYsMjM1LAotICAgIDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzEsMjM1LDIyNSwyNDQsMjI1LDIzNSwKLSAgICAyMjUsMjM4LCA5NywxMjksIDQ4LDE2NywgODYsMjQ4LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsCi0gICAgMTA0LDEyOCwyNTUsMTA2LDI0NCwyMzMsMjM3LDIyNSwyNDQsMjI5LDEwMCwxMjgsIDMzLCA0NiwyNDUsMjQwLAotICAgIDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMzYsMTE2LCAgNSwgODcsIDM2LCA4NywgNjIsIDg3LCA2NiwKLSAgICAgODcsIDgzLCA4NywxNDksIDk3LDEzMCwgIDMsMTgzLCA4NywgNDQsIDg3LCA1NCwyNDIsMjM3LDIyOSwyMzgsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDQsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDE3NCwxMDQsMTI4LAotICAgICAgMCwyNDAsMjMzLDIzNiwyMjgsMTAxLDEyOSwgMzAsMTg5LCA4NywgNzUsMjI2LDIyOSwyMzYsMjM5LDExOSwKLSAgICAxMjgsIDMwLCAyNywyMzgsMjI1LDIzMiwyNDQsIDk3LCAgMywgODcsIDk1LCA4NywxMjcsIDg3LDEzNiwyMzAsCi0gICAgMjM5LDI0NSwyMzUsMTA0LCAgMiwgODcsMTA1LCA4NywxMTQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxNDUsMjM2LDIyOSwyMzAsMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTQ1LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTQ1LDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDE0NSwyNDUsMjQyLDIzOCwyMjksMTAwLDEyOCwgIDEsMjIxLDExNywgIDIsIDg3LAotICAgIDE2MywgODcsMTcyLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDk3LDI0MiwxMTEsMTI4LCAzMiwKLSAgICAxNzIsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLCA4NywxOTMsIDg3LDIwMywgODcsCi0gICAgMjEwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE5OSwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwgNzEsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE5OSwxMjAsICAyLCA4NywKLSAgICAyMjcsIDg4LCA0NCwyMjcsMjM2LDIyNSwxMDksMTMyLCAgMCwgMzMsIDg3LDI0MiwgODcsMjUzLCA4OCwgMjQsCi0gICAgIDg4LCAzNiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDkyLDEwMCwgIDIsIDg4LAotICAgICAgMywgODgsICA4LDIyNiwxMDgsMTI4LCAzMiwgNjAsMjM5LDI0NywxMTAsMTI5LCAgMCwxNjEsIDg4LCAxNiwKLSAgICAyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTYxLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsICAxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywgMzMsMjMzLDI0MywyNDQsMjI5LAotICAgIDIzOCwyNDQsMjMzLDIyNSwxMDgsMTI4LCAzNCwgIDMsMjUwLDEwNCwxMzEsICAyLDE0NiwgODgsIDY3LCA4OCwKLSAgICAgODYsIDg4LCA5NywgOTksICAyLCA4OCwgNzMsIDg4LCA4MCwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMzksCi0gICAgMjQ1LDI0MiwxMDgsMTI4LCAgMiwxNDcsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsICAxLAotICAgIDE4NSwyNDQsMjI1LDIzMywxMDgsMTI4LCAgMSwxODYsMTAyLDE0MCwgIDAsMTAyLCA4OCwxMzIsIDg4LDIxNCwKLSAgICAgODgsMjI1LCA4OCwyMzQsIDg4LDI0NiwgODksIDkzLCA4OSwxMDksIDkxLDExNywgOTEsMTMwLCA5MSwxNTYsCi0gICAgIDkzLCAzMywgOTMsIDQxLCA5NywgIDQsIDg4LDE0MiwgODgsMTQ5LCA4OCwxNjAsIDg4LDE3MSwyMjgsMjI5LAotICAgIDI0NiwgOTcsMTI4LCAgOSwgOTQsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA5NCwKLSAgICAyMzIsMjQyLDIyOSwyMzgsMjMyLDIyOSwyMzMsMTE2LDEyOCwgMzMsICA5LDI0NCwyMzIsIDk3LCAgMywgODgsCi0gICAgMTgxLCA4OCwxOTAsIDg4LDIwMiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3OCwyMzYsMjM5LAotICAgIDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3OCwyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA3NSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksCi0gICAgICA4LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjEzLDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LAotICAgIDIyOSwyMzgsMTE2LDEyOCwgMzAsIDMxLDEwMSwgIDMsIDg4LDI1NCwgODksIDc2LCA4OSwgODYsMTA0LCAgNCwKLSAgICAgODksICA4LCA4OSwgMzEsIDg5LCA0NSwgODksIDYxLDIyNSwxMTQsICAyLCA4OSwgMTUsIDg5LCAyMiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LCAgNiwgNjUsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzQsMjMwLAotICAgIDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxMCwyMzMsMjM4LDIzMywKLSAgICAyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMTEsMjM3LDIyOSwyMjgsCi0gICAgMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMTIsMjMzLDIyNywyMzksMjQwLAotICAgIDI0NCwyMzMsIDk5LDEyOCwgIDMsMjI5LDIzNywyMjUsMjM2LDEwMSwxMjgsIDM4LCA2NCwxMDIsMTMwLDI1MSwKLSAgICAgIDAsIDg5LDEwMSwgODksMTA1LDEwNSwxMjgsMjUxLCAgMywxMDgsMTI4LDI1MSwgIDQsMTA1LDEzNiwyNTEsCi0gICAgICAxLCA4OSwxMjksIDg5LDE2OSwgODksMTgwLCA4OSwyMDIsIDkwLCA2OCwgOTAsIDg1LCA5MCwgOTMsIDkwLAotICAgIDEwNiwyMzAsMjQ0LDIyOSwyMjksMTEwLCAgMiwgODksMTM5LCA4OSwxNDgsMjI3LDIzMywyNDIsMjI3LDIzNiwKLSAgICAxMDEsMTI4LCAzNiwxMTAsMTEyLCAgMiwgODksMTU0LCA4OSwxNjEsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsCi0gICAgMTMwLDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTAsMjMxLDI0NSwyNDIsMjI5LDIyOCwyMjUsMjQzLAotICAgIDEwNCwxMjgsIDMyLCAxOCwyMzYsMjM2LDIyOSwxMDAsICAyLCA4OSwxODksIDg5LDE5NSwyMjYsMjM5LDEyMCwKLSAgICAxMjgsIDM3LDE2MCwyNDIsMjI5LDIyNywxMTYsMTI4LCAzNywxNzIsMjM4LDIyNSwxMDgsICA1LCA4OSwyMTYsCi0gICAgIDg5LDI1NSwgOTAsIDE2LCA5MCwgMzMsIDkwLCA0OSwyMzUsMjI1LDEwMiwxMzAsICA1LDIxOCwgODksMjI2LAotICAgICA4OSwyNDYsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTgsIDg5LDIzNywyMzIsMjI5LDIyNiwKLSAgICAyNDIsMjI5LDExOSwxMjgsMjUxLCA1OCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxOCwyMzcsCi0gICAgMjI5LDEwOSwxMjksICA1LDIyMSwgOTAsICA3LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjIxLAotICAgIDIzOCwyNDUsMTEwLDEyOSwgIDUsMjIzLCA5MCwgMjQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKLSAgICAyMjMsMjQwLDEwMSwxMjksICA1LDIyNywgOTAsIDQwLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsCi0gICAgMjI3LDI0NCwyNDMsMjI1LDIyOCwxMDUsMTI5LCAgNSwyMjksIDkwLCA1OSwyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsICA1LDIyOSwyNDIsMjQzLDI0NCwyNDQsMjM5LDIzOCwyMjksMjI3LDIzMiwyMzMsMjM4LDIyOSwKLSAgICAyNDMsMTAxLDEyOCwgIDIsMjAxLDI0MywyMzIsMjI5LDI0OSwxMDEsMTI4LCAzNywyMDEsMjQ0LDIyNSwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTE1LDI0NiwxMDEsMTQyLCAgMCwgNTMsIDkwLAotICAgIDEzOSwgOTAsMTQ4LCA5MCwxNTgsIDkwLDE4OCwgOTAsMTk1LCA5MCwyMDUsIDkwLDIzMCwgOTEsICAxLCA5MSwKLSAgICAgMzUsIDkxLCA0NywgOTEsIDU4LCA5MSwgOTEsIDkxLCA5OSwgOTEsMTEwLDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwgIDYsMTAxLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIzNSwyMjcsMjMzLAotICAgIDI0MiwyMjcsMjM2LDEwMSwxMjksIDM2LDEwMCwgOTAsMTY5LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQzLDIyOSwKLSAgICAyNDMsMjI1LDIzOCwyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwxMjgsIDM5LDE0MiwyMjgsMjI5LDI0NiwgOTcsCi0gICAgMTI4LCAgOSwxMDcsMjI5LDIzMywyMzEsMjMyLDI0NCwyMzIsMTE1LDEyOCwgMzMsIDkzLDIzMSwxMTcsICAyLAotICAgICA5MCwyMTIsIDkwLDIyMSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIzNSwyNDIsMjM3LDI0NSwKLSAgICAyMzUsMjMyLDEwNSwxMjgsIDEwLDEwNywyMzIsIDk3LCAgMiwgOTAsMjM3LCA5MCwyNDgsMjI3LDIzNSwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwMSwyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LAotICAgICAzNywxMDUsICAyLCA5MSwgIDcsIDkxLCAyNSwyMjgsMjI5LDIzOSwyMzEsMjQyLDIyNSwyNDAsMjMyLDIzMywKLSAgICAyMjcsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCAzNiwyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsCi0gICAgMTI4LCAzMiwxMzMsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMjEsMjM5LAotICAgIDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsMjQ3LCA1MywxMTIsICAyLCA5MSwgNjQsIDkxLCA3MSwKLSAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjAsMjI5LDExNCwgIDIsIDkxLCA3OCwgOTEsIDg0LDIzMywyMzksCi0gICAgMTAwLDEyOCwgMzYsMTQwLDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0NSwyNDIsMjM5LDIzNywyMjUsMTEwLAotICAgIDEyOCwgMzMsMTE2LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMTcsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwgMTQsIDg1LDEwOCwxMjksMjUxLCAgMiwgOTEsMTIzLDIzOSwyNDIsMjMzLDExMCwxMjgsCi0gICAgICAxLDE0NiwxMDksICAyLCA5MSwxMzYsIDkxLDE0NywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwyNTUsIDcwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTUzLDExMSwgIDQsIDkxLDE2NiwKLSAgICAgOTEsMTg4LCA5MSwyMDAsIDkxLDIwNywyMzAsIDk3LCAgMiwgOTEsMTczLCA5MSwxODEsMjM4LDI0NCwyMzIsCi0gICAgMjI1LDEwNSwxMjgsIDE0LCAzMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMjksMjM4LDIzMSwyMzcsMjI1LAotICAgIDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzksMjQyLDIyNSwyMzYsMTA4LDEyOCwgMzQsICAwLDI0NSwKLSAgICAxMTQsMTQyLCAgMCwgNTIsIDkxLDI0MCwgOTEsMjQ5LCA5MiwgIDMsIDkyLCAzMywgOTIsIDQwLCA5MiwgNjUsCi0gICAgIDkyLCA5MiwgOTIsMTI2LCA5MiwxMzgsIDkyLDE1NywgOTIsMTY4LCA5MiwyMDEsIDkyLDIwOSwgOTIsMjIwLAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTAwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKLSAgICAxMjgsICA5LDIzNCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjksIDM2LCA5OSwgOTIsIDE0LDIzMywyMzgsCi0gICAgMjQ2LDIyOSwyNDIsMjQzLDIyOSwyNDMsMjI1LDIzOCwyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwxMjgsIDM5LAotICAgIDE0MSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMDYsMjMxLDExNywgIDIsIDkyLCA0NywgOTIsIDU2LDIzNCwKLSAgICAyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjM0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCi0gICAgMTA2LDIzMiwgOTcsICAyLCA5MiwgNzIsIDkyLCA4MywyMjcsMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsMTAwLDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsIDM2LDEwNSwgIDIsIDkyLCA5OCwKLSAgICAgOTIsMTE2LDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksCi0gICAgMTEwLDEyOCwgNTAsIDM1LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEzMiwyMzcsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyMCwyMzgsMjQ1LDIzNywyMjksMjQyLDIyNSwKLSAgICAyNDQsMjM5LDI0MiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDcsMjM5LDIzNiwyMjgsCi0gICAgMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsMjQ3LCA1MiwxMTIsICAyLCA5MiwxNzQsIDkyLDE4MSwyMjUsMjQyLAotICAgIDIyOSwxMTAsMTI4LCAzNiwxMTksMjI5LDExNCwgIDIsIDkyLDE4OCwgOTIsMTk0LDIzMywyMzksMTAwLDEyOCwKLSAgICAgMzYsMTM5LDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0NCwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsCi0gICAgMTE1LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMTYsMTE2LCAgMiwgOTIsMjI2LAotICAgICA5MywgIDgsMjI5LDIyOSwxMTAsICAyLCA5MiwyMzQsIDkyLDI0MywyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwKLSAgICAxMjgsIDM2LDEwOSwxMTIsICAyLCA5MiwyNDksIDkzLCAgMCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjksCi0gICAgMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE0OSwxMDQsICAyLCA5MywgMTQsIDkzLCAxOSwyMjUsMTA1LAotICAgIDEyOCwgMTQsIDg0LDI0NCwyMzksMjM4LDIyOSwyMjcsMjMyLDIzMywyMzgsMjI5LDI0MywxMDEsMTI4LCAgMiwKLSAgICAyMDMsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE2MSwyNDIsIDk3LCAgMiwgOTMsIDQ4LCA5MywgNTYsCi0gICAgMjI3LDI0NCwyMzMsMjM5LDExMCwxMjgsIDMyLCA2OCwyMzgsIDk5LDEyOCwgMzIsMTYzLDEwMywxNDQsICAwLAotICAgIDEwMywgOTMsIDk3LCA5NCwgNDMsIDk0LCA2NiwgOTQsMTI3LCA5NCwxNDQsIDk1LCA2NSwgOTYsIDU4LCA5NiwKLSAgICAxNDMsIDk2LDE1NiwgOTcsIDE0LCA5NywgMzksIDk3LCA2NywgOTcsIDg5LCA5OCwgMzQsIDk4LCA1NiwgOTgsCi0gICAgMTU4LCA5NywgIDksIDkzLDExNywgOTMsMTI3LCA5MywxMzQsIDkzLDE0MSwgOTMsMjA1LCA5MywyMzAsIDkzLAotICAgIDI0MSwgOTMsMjUyLCA5NCwgMzAsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTUxLDIyNywKLSAgICAyNDUsMjQ0LDEwMSwxMjgsICAxLDI0NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMjMsMTAyLCAgNCwgOTMsCi0gICAgMTUxLCA5MywxNjAsIDkzLDE3NCwgOTMsMTkwLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTc1LAotICAgIDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNDcsMjMzLDIzOCwKLSAgICAyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTQ4LDIzNywyMjksCi0gICAgMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTQ5LDIzMSwxMTcsICAyLAotICAgICA5MywyMTIsIDkzLDIyMSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1MSwyNDIsMjM3LDI0NSwKLSAgICAyMzUsMjMyLDEwNSwxMjgsIDEwLCAyMywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsCi0gICAgIDc2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNzIsMjM3LDIzNywgOTcsMTMwLAotICAgICAgMywxNzksIDk0LCAgNiwgOTQsIDE5LDIzNiwyMjUsMjQ0LDIzMywyMzgsMjQzLDIzNywyMjUsMjM2LDEwOCwKLSAgICAxMjgsICAyLCA5OSwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMjI0LDIzOCwyMzEsCi0gICAgMjMzLDIyNSwyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIzNSwgOTgsICAyLCA5NCwgNDksIDk0LAotICAgICA1OSwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMTMsMjQyLDIyOSwyNDYsMTAxLDEyOCwKLSAgICAgIDEsIDMxLCA5OSwgIDQsIDk0LCA3NiwgOTQsIDgzLCA5NCwgOTIsIDk0LDExNCwyMjUsMjQyLDIzOSwxMTAsCi0gICAgMTI4LCAgMSwyMzEsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgMzUsMjMzLDI0MiwgOTksICAyLAotICAgICA5NCwxMDAsIDk0LDEwNSwyMzYsMTAxLDEyOCwgMzYsMjE0LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwKLSAgICAgIDEsIDI5LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCAzNSwyMjgsCi0gICAgMjM5LDExNiwxMjksICAxLCAzMywgOTQsMTM1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDMzLAotICAgIDEwMSwgIDYsIDk0LDE1OCwgOTQsMTY5LCA5NCwxODAsIDk0LDE5MSwgOTQsMjEwLCA5NSwgNTYsMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA1MSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCi0gICAgIDk3LDEyOCwgNDgsIDgyLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNzgsMjM5LAotICAgIDIzNywyMjksMjQ0LDI0MiwyMzMsMjI3LDIyNSwyMzYsMjM2LDI0OSwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwKLSAgICAgMzQsIDgxLDExNCwgIDMsIDk0LDIxOCwgOTUsIDExLCA5NSwgMjEsMjI5LDI0MywxMDQsICAzLCA5NCwyMjgsCi0gICAgIDk0LDI0MywgOTQsMjUyLDIyNSwyMjcsMjI3LDIyOSwyMzgsMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAotICAgIDEyOCwgIDUsMTU2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjQzLDIzNywyNDUsMjQxLDIyOCwKLSAgICAyMjUsMjM3LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTU3LDIzNywyMjUsMjM4LDIyOCwyMjYsCi0gICAgMjM2LDExNSwxMjgsICAwLDIyMywyNDMsMjMyLDIyNSwyNDksMjMzLDEwOSwgIDIsIDk1LCAzMiwgOTUsIDQ3LAotICAgIDIyNSwyMjcsMjI3LDIyOSwyMzgsMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTU4LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjQ0LDI0NCwyMjUsMjM3LDIyNSwyNDIsMTA3LDEyOCwgNDgsCi0gICAgIDE5LDEwNCwgIDUsIDk1LCA3NywgOTUsMjEwLCA5NiwgMTcsIDk2LCA0MiwgOTYsIDQ4LCA5NywgIDQsIDk1LAotICAgICA4NywgOTUsIDk3LCA5NSwxMjAsIDk1LDE0NSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKLSAgICAxNTIsMTAwLCAgMiwgOTUsMTAzLCA5NSwxMTQsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCi0gICAgICA1LDExNCwyMjksMjQ2LCA5NywxMjgsICA5LCAyNCwyMzEsMTE3LCAgMiwgOTUsMTI3LCA5NSwxMzYsMjM0LAotICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTIsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKLSAgICAgMjQsMjMzLDExMCwgIDQsIDk1LDE1NiwgOTUsMTY1LCA5NSwxNzksIDk1LDE5NSwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsICA2LCA1OCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwyNTQsMjA2LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsMjU0LDIwNywyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgMjU0LDIwOCwxMDEsICAzLCA5NSwyMTgsIDk1LDIzOSwgOTYsICAwLDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LAotICAgIDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTQ5LDI0MywKLSAgICAyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNDcsCi0gICAgMjQ1LDI0MCwyNDQsMjQ1LDI0MiwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDE0NSwyMzIsIDk3LCAgMiwgOTYsIDI0LCA5NiwgMzEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkwLDIzMSwKLSAgICAyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgOTAsMjM5LDIzOSwxMDcsMTI4LCAgMiwgOTYsCi0gICAgMjUwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTQ3LDEwNSwgIDMsIDk2LCA2NiwgOTYsIDc3LAotICAgICA5NiwgODgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3OCwyMzUsMjI1LDI0NCwKLSAgICAyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTc0LDEwOSwgIDIsIDk2LCA5NCwgOTYsMTA1LDIyNSwyNDIsCi0gICAgMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTksMjI5LDEwOCwxMzAsICA1LDIxMCwgOTYsMTE0LAotICAgICA5NiwxMzQsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTAsIDk2LDEyNSwyMzIsMjI5LDIyNiwKLSAgICAyNDIsMjI5LDExOSwxMjgsMjUxLCA1MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxMCwyMzQsCi0gICAgMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODMsMjM2LDIzOSwyNDQsMjQ0LAotICAgIDIyNSwxMDgsICAyLCA5NiwxNjcsIDk2LDE4NCwyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDI0MywKLSAgICAyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMTkwLDI0MywyNDQsMjM5LDExMiwxMzIsICAyLDE0OCwgOTYsCi0gICAgMTk5LCA5NiwyMTAsIDk2LDIxNiwgOTYsMjQ4LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwxMDAsMTI4LAotICAgICAgMiwxNTAsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTIsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKLSAgICAxMzAsICAyLDE0OSwgOTYsMjMxLCA5NiwyMzcsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTMsMjQzLDI0NSwyNDAsCi0gICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDIyOCwyNDMsMjQ0LDI0MiwyMzksMjM1LDEwMSwxMjksICAyLAotICAgIDE2MSwgOTcsICAzLDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI4LCAgMiwxNjIsMTA5LCAgMiwKLSAgICAgOTcsIDIwLCA5NywgMjgsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsIDMwLCAzMywyMzksMjM4LDIzOSwyNDMsCi0gICAgMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDcxLDExMSwgIDIsIDk3LCA0NSwgOTcsIDU2LDIzMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODQsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjgsIDQ4LDE4MCwyNDAsIDk3LCAgMiwgOTcsIDc0LCA5NywgODAsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjIsCi0gICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNzIsMTE0LCAgMiwgOTcsIDk1LCA5NywxOTIsIDk3LAotICAgICAgMiwgOTcsMTAxLCA5NywxMDksMjI4LDIzMywyMjksMjM4LDExNiwxMjgsIDM0LCAgNywyNDYsMTAxLDEzNCwKLSAgICAgIDAsIDk2LCA5NywxMjYsIDk3LDEzNywgOTcsMTU0LCA5NywxNjEsIDk3LDE3MCwgOTcsMTgyLDIyNiwyMjksCi0gICAgMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjIsIDk5LCAgMiwgOTcsMTQzLCA5NywxNDgsMjM3LAotICAgICA5OCwxMjgsICAzLCAgMCwyMzksMjM3LCA5OCwxMjgsICAzLCAgMCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwKLSAgICAgODMsMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMDYsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsCi0gICAgMjI1LDIyNywxMDEsMTI4LDI1NSwgNjQsMjQ0LDIzOSwyMzgsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDY0LAotICAgIDIyOSwyMjUsMjQ0LDIyOSwxMTQsMTMyLCAgMCwgNjIsIDk3LDIwOCwgOTcsMjI3LCA5NywyMzksIDk4LCAyNiwKLSAgICAyMjksMjQxLDI0NSwyMjUsMTA4LDEyOSwgMzQsMTAxLCA5NywyMTgsMjM5LDI0MiwyMzYsMjI5LDI0MywxMTUsCi0gICAgMTI4LCAzNCwyMTksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzAsMTExLAotICAgICAgMiwgOTcsMjQ1LCA5OCwgMTUsMTE0LCAgMiwgOTcsMjUxLCA5OCwgIDgsMjI5LDI0MSwyNDUsMjMzLDI0NiwKLSAgICAyMjUsMjM2LDIyOSwyMzgsMTE2LDEyOCwgMzQsMTE1LDIzNiwyMjksMjQzLDExNSwxMjgsIDM0LDExOSwyNDYsCi0gICAgMjI5LDI0MiwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTAzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAotICAgIDI1NCwxMDEsMTE1LCAgMiwgOTgsIDQwLCA5OCwgNDgsMjI3LDI0MiwyMzMsMjQwLDExNiwxMjgsICAyLCA5NywKLSAgICAyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMjI5LDExNywgIDQsIDk4LCA2NiwgOTgsIDc3LCA5OCwxMzQsCi0gICAgIDk4LDE0NSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDgwLDIzMywxMDgsICAyLAotICAgICA5OCwgODQsIDk4LDEwOSwyMzYsMjI5LDIzNywyMzksMTE2LCAgMiwgOTgsIDk0LCA5OCwxMDEsMjM2LDIyOSwKLSAgICAyMzAsMTE2LDEyOCwgIDAsMTcxLDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAgMCwxODcsMjQzLDIzMywyMzgsCi0gICAgMjMxLDEwOCwgIDIsIDk4LDExOSwgOTgsMTI2LDIzNiwyMjksMjMwLDExNiwxMjgsIDMyLCA1NywyNDIsMjMzLAotICAgIDIzMSwyMzIsMTE2LDEyOCwgMzIsIDU4LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwKLSAgICAxNzYsMjQyLDIyNSwyMzcsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDI0LDI0OSwyNDMsCi0gICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIwMSwxMDQsMTQ0LCAgMCwxMDQsIDk4LDIwNCwxMDEsIDkwLAotICAgIDEwMSwxMjUsMTAxLDE2MiwxMDEsMjAyLDEwMywgOTAsMTAzLDExMCwxMDQsIDc1LDEwNCwgODcsMTA0LCA5OSwKLSAgICAxMDUsMTY3LDEwNSwxNzUsMTA1LDE4NiwxMDUsMTk1LDEwNiwgMTksMTA2LCAyMywgOTcsIDEzLCA5OCwyMzIsCi0gICAgIDk5LCAxNSwgOTksIDI1LCA5OSwgNTUsIDk5LCA4MCwgOTksMTU4LCA5OSwxNzAsIDk5LDE5NSwgOTksMjEwLAotICAgICA5OSwyMzksIDk5LDI1MiwxMDAsIDU0LDEwMCwgNjMsIDk3LCAgMiwgOTgsMjM4LCA5OSwgIDEsMjI2LDIzNSwKLSAgICAyMzIsMjI1LDI0MywyMzMsMjI1LDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMTY5LDIzNiwyNDQsMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxOTMsMjI2LAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTg1LDIyOCwxMDEsICAyLCA5OSwgMzIsIDk5LCA1MCwKLSAgICAyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LDE3OSwyNDYsIDk3LDEyOCwgIDksIDU3LDIzMSwxMTcsICAyLCA5OSwgNjIsIDk5LCA3MSwyMzQsMjI1LAotICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE4NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1NywKLSAgICAxMDQsICA0LCA5OSwgOTAsIDk5LCA5OSwgOTksMTEzLCA5OSwxNDMsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LCAgNiwgNDUsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAotICAgIDE2MiwxMDUsICAyLCA5OSwxMTksIDk5LDEzNCwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsMjU0LDE2MywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExMSwyMzcsCi0gICAgMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE2NCwyMzMsMjQ0LAotICAgIDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA0MiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwKLSAgICAyMzgsIDk3LDEyOSwgNDgsMjA3LCA5OSwxODMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsCi0gICAgMTI4LDI1NSwxMzgsMjM2LDIyNSwyMzgsMjQ0LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LAotICAgICAxMCwgNzcsMjM3LDI1MCwgOTcsICAyLCA5OSwyMTgsIDk5LDIyNywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsICA2LCAzMywyMzYsMjM5LDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAzMywyMzgsCi0gICAgMjMxLDI0NSwyMzYsMjMwLDIzMywyMzYsMjM2LDIyOSwxMTQsMTI4LCA0OSwxMDAsMTE0LCAgMiwxMDAsICAyLAotICAgIDEwMCwgMTgsMjI4LDI0MywyMzMsMjMxLDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDc0LDI0MCwyMzksMjM5LDExMCwgIDIsMTAwLCAyNywxMDAsIDQwLDIzNiwyMjksMjMwLDI0NCwyMjYsCi0gICAgMjI1LDI0MiwyMjYsMjQ1LDExMiwxMjgsIDMzLDE4OCwyNDIsMjMzLDIzMSwyMzIsMjQ0LDIyNiwyMjUsMjQyLAotICAgIDIyNiwyNDUsMTEyLDEyOCwgMzMsMTkyLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjAyLDI0NCwKLSAgICAyMjUsMTAyLCAgMywxMDAsIDczLDEwMCwxNjUsMTAxLCAgMCwyNDAsMjI1LDI0NCwyMjUsMTA0LDEzNCwgIDUsCi0gICAgMTc4LDEwMCwgOTMsMTAwLCA5OCwxMDAsMTEyLDEwMCwxMjEsMTAwLDEzNiwxMDAsMTUyLDE3NywgNTQsMTI4LAotICAgICAgNSwxNzgsIDUwLCAgMiwxMDAsMTA0LDEwMCwxMDgsIDUxLDEyOCwgIDUsMTc4LDEwMiwxMjgsICA1LDE3OCwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3OCwyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3OCwyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzgsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwgIDUsMTc4LDI0MSwyMjUsMjM3LDIyNSwyNDQsMTE1LDEzNSwgIDUsMTc5LDEwMCwxODgsCi0gICAgMTAwLDE5MywxMDAsMTk4LDEwMCwyMDMsMTAwLDIxMiwxMDAsMjI3LDEwMCwyNDMsMTc3LCA5OCwxMjgsICA1LAotICAgIDE3OSwxNzgsIDU2LDEyOCwgIDUsMTc5LDE3OSwgNTIsMTI4LCAgNSwxNzksMjMyLDIyOSwyMjYsMjQyLDIyOSwKLSAgICAxMTksMTI4LCAgNSwxNzksMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LCAgNSwxNzksMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAotICAgIDEyOCwgIDUsMTc5LDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3OSwKLSAgICAyNDMsMjI5LDIzMSwyMzksMTA4LDEzNSwgIDUsMTc3LDEwMSwgMjIsMTAxLCAyNywxMDEsIDMyLDEwMSwgMzcsCi0gICAgMTAxLCA0NiwxMDEsIDYxLDEwMSwgNzcsMTc3LCA1NSwxMjgsICA1LDE3NywxNzgsIDUyLDEyOCwgIDUsMTc3LAotICAgIDE3OSwgNDgsMTI4LCAgNSwxNzcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzcsMjM4LDIyNSwKLSAgICAyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzcsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc3LDI0NywyMzMsMjI4LAotICAgIDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NywgOTgsICAzLDEwMSwgOTgsMTAxLDEwMywKLSAgICAxMDEsMTEzLDIyNSwxMTQsMTI4LCAgMSwgMzksMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksCi0gICAgIDE1LDI0MiwyMjksMjQ2LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQzLCA5OSwgIDIsMTAxLAotICAgIDEzMSwxMDEsMTQwLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDQxLDIzMywyNDIsIDk5LCAgMiwKLSAgICAxMDEsMTQ4LDEwMSwxNTMsMjM2LDEwMSwxMjgsIDM2LDIxNSwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsCi0gICAgICAxLCAzNywxMDAsICAyLDEwMSwxNjgsMTAxLDE3OCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LAotICAgICAzMCwgMzksMjM5LDExNiwgIDIsMTAxLDE4NSwxMDEsMTk0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwKLSAgICAgMzAsIDM1LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMzcsMTAxLDEzNiwgIDUsMjEyLDEwMSwyMjIsCi0gICAgMTAxLDI1NSwxMDIsIDE5LDEwMiwyNDgsMTAzLCAgOCwxMDMsIDUzLDEwMywgNjIsMTAzLCA3NSwyMjUsMjQyLAotICAgIDExNiwxMjksIDM4LDEwMSwxMDEsMjMwLDI0MywyNDUsMjMzLDExNiwgIDIsMTAxLDIzOSwxMDEsMjQ3LDIyNiwKLSAgICAyMzYsMjI1LDIyNywxMDcsMTI4LCAzOCwxMDEsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCA5NywyMjgsCi0gICAgMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA1MiwxMDIsIDEwLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAotICAgIDEyOCwyNTEsIDUyLDEwNCwgIDYsMTAyLCAzMywxMDIsIDYxLDEwMiwgNjksMTAyLDExOSwxMDIsMTY1LDEwMiwKLSAgICAyMTQsIDk3LCAgMiwxMDIsIDM5LDEwMiwgNTMsMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsICA2LDE5MywyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDcxLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwyMTIsMjMwLDIzMywyMzgsMjI1LDIzNiwgOTcsICAyLDEwMiwgODAsMTAyLDExMSwKLSAgICAyMzYsMTE2LCAgMiwxMDIsIDg3LDEwMiwgOTksMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LDI1MSwxNjcsMjQ0LDI0NywyMzksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMzQsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzNCwyMzIsMjI1LDIzNywyNTAsMjI1LDIyNSwyMjYsMjM5LDI0NiwKLSAgICAxMDEsICAyLDEwMiwxMzQsMTAyLDE0OCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTEsMTY1LDIzMywyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1MSwxNjQsMTA1LCAgMiwxMDIsMTcxLDEwMiwyMDUsMjM4LDIzMywyNDQsMjMzLDIyNSwKLSAgICAyMzYsIDk3LCAgMiwxMDIsMTgzLDEwMiwxOTcsMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjUxLDE2OCwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjM1LDI0MiwyMjUsMjMxLAotICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsMTIwLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LCA5NywgIDIsMTAyLDIyNiwKLSAgICAxMDIsMjQwLDIzNiwyNDQsMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNjksCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzNiwyMzMsMjQzLDIyOSwyMzMsMjI5LDI0MiwyMjUsMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjMsMTA3LCAgMiwxMDMsIDE0LDEwMywgMzgsMjI1LDI0NCwKLSAgICAyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjE2LDEwMywgMjYsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsCi0gICAgMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDEsMjQ1LDI0NCwyMjUsMjI1LDI0MiwyNDUsMjQzLDI0MSwyNDUsMjI1LAotICAgIDI0MiwxMDEsMTI4LCA1MSwgNTQsMjM4LDIzMSwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMDMsMjQyLDI0NSwKLSAgICAyNDQsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDU3LDExNiwxMjksICA1LDIxNSwxMDMsCi0gICAgIDgxLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjE1LDIzMiwyMzksMjM5LDEwNywxMjksICAyLAotICAgIDEwMiwxMDMsIDk5LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxNzcsMTA1LCAgNCwKLSAgICAxMDMsMTIwLDEwMywyMDUsMTAzLDIxNiwxMDMsMjQxLDIyOSwyNDUsMTA0LCAgNCwxMDMsMTMyLDEwMywxNjcsCi0gICAgMTAzLDE4MiwxMDMsMTkxLCA5NywgIDIsMTAzLDEzOCwxMDMsMTUzLDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LAotICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTIzLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjcsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzgsMjQwLAotICAgIDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxMywyMzIsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTE0LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCi0gICAgMTI5LCA0OCwyMTAsMTAzLDIyOSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAotICAgIDEzOSwyNDIsMjMzLDExMywxMzQsICA1LDE4MCwxMDQsICAzLDEwNCwgIDgsMTA0LCAyMiwxMDQsIDMxLDEwNCwKLSAgICAgNDYsMTA0LCA2MiwxNzcsIDUyLDEyOCwgIDUsMTgwLCA1MCwgIDIsMTA0LCAxNCwxMDQsIDE4LCA0OSwxMjgsCi0gICAgICA1LDE4MCwxMDAsMTI4LCAgNSwxODAsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODAsMjM4LAotICAgIDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODAsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgwLDI0NywyMzMsCi0gICAgMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MCwyMzYsMjMzLDIzOCwyMjksMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE1MCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwKLSAgICAxMjgsMjU1LCA3MiwxMTEsICA5LDEwNCwxMTksMTA0LDEzMCwxMDQsMTU0LDEwNCwxNzksMTA1LCAxMSwxMDUsCi0gICAgIDI0LDEwNSwxMTAsMTA1LDE1MCwxMDUsMTYxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LAotICAgICAgNSwxMTIsMjMyLDEwNSwgIDIsMTA0LDEzNywxMDQsMTQ1LDI0MCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwKLSAgICAgNDMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMjMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsCi0gICAgMjM4LCA5NywxMjksIDQ4LDIxOSwxMDQsMTY3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LAotICAgIDEyOCwyNTUsMTQyLDIzNiwyMjUsMTA5LDEzNSwgIDUsMTg1LDEwNCwxOTksMTA0LDIwNCwxMDQsMjA5LDEwNCwKLSAgICAyMTQsMTA0LDIyMywxMDQsMjM4LDEwNCwyNTQsMTc3LCA1NywxMjgsICA1LDE4NSwxNzgsIDU0LDEyOCwgIDUsCi0gICAgMTg1LDE3OSwgNTAsMTI4LCAgNSwxODUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODUsMjM4LAotICAgIDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODUsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg1LDI0NywyMzMsCi0gICAgMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NSwyMzgsMjM5LDIzNSwyMzIsMjQ1LAotICAgIDIzNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDYsMTExLCAgMiwxMDUsIDMwLDEwNSwxMDAsMTA3LCAgNCwKLSAgICAxMDUsIDQwLDEwNSwgNTIsMTA1LCA1OCwxMDUsIDgwLDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzOSwyMzcsCi0gICAgIDk4LDEyOCwgIDMsICA5LDIyNywyMzcsIDk4LDEyOCwgIDMsICA5LDI0MCwyMjUsMjM2LDIyNSwyNDQsMjI1LAotICAgIDIzNiwyMzMsMjUwLDIyOSwyMjgsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAzMywKLSAgICAyNDIsMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsMjI5LDI0OCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsCi0gICAgIDk4LDEyOCwgIDMsIDM0LDIzOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA2NiwxMTQsICAyLAotICAgIDEwNSwxMTYsMTA1LDE0MywxMDUsICAyLDEwNSwxMjIsMTA1LDEzMSwyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwKLSAgICAxMjgsICAzLDIzMywyNTAsMjM5LDIzOCwyNDQsMjI1LDIzNiwyMjYsMjI1LDExNCwxMjgsIDMyLCAyMSwyMzgsCi0gICAgMjI3LDIzNywgOTgsMTI4LCAgMywgMjcsMjQ0LDI0MywyNDAsMjQyLDIzMywyMzgsMjMxLDExNSwxMjgsIDM4LAotICAgIDEwNCwyNDUsMjQzLDEwMSwxMjgsIDM1LCAgMiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTYzLDI0MywKLSAgICAyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxNzYsMjQ0LDI0NSwyNDIsMjM4LDIyOSwxMDAsCi0gICAgMTI4LCAgMiwxMDEsMTE3LCAgNCwxMDUsMjA1LDEwNSwyMTYsMTA1LDIyOSwxMDUsMjU0LDIzMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTcsMjMzLDIzMywyNDQsMjM5LDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMTAxLDEyOCwgNTEsIDUxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMTMsCi0gICAgMTA1LDI0MiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0MCwyMzgsMjMxLAotICAgIDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwxMTYsMTI5LCAgMiwyMjEsMTA2LCAxMywyMjcsMjM3LCA5OCwKLSAgICAxMjgsICAzLCAxMSwxMTgsMTI4LCAgMSwxNDksMjQ5LDI0MCwyMzIsMjI5LDExMCwxMzIsICAwLCA0NSwxMDYsCi0gICAgIDM5LDEwNiwgNTAsMTA2LCA2MiwxMDYsIDg1LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAotICAgIDI0NiwyMjksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTMsMTE1LCAgMiwKLSAgICAxMDYsIDY4LDEwNiwgNzUsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDk5LDI0NSwyNDAsMjI5LDI0MiwyMzMsCi0gICAgMjM5LDExNCwxMjgsMjQ2LDIzMCwyNDQsMjQ3LDExMSwxMjgsIDMyLCAxNiwxMDUsMTQ5LCAgMCwxMDUsMTA2LAotICAgIDEzNywxMDYsMTYwLDEwNiwxOTQsMTA2LDI0MSwxMTAsMTIzLDExMCwyNDMsMTExLCAyNCwxMTEsIDUxLDExMSwKLSAgICAyMTMsMTExLDIxNywxMTEsMjU1LDExMiwgMjEsMTEyLDEwNSwxMTMsIDE0LDExMywgODksMTEzLCA5NywxMTMsCi0gICAgMTEwLDExMywxOTcsMTEzLDI1NCwxMTQsIDI2LDExNCwgNzAsMjI1LCA5OSwgIDIsMTA2LDE0NCwxMDYsMTUwLAotICAgIDI0NSwyNDQsMTAxLDEyOCwgIDAsMjM3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3OSwKLSAgICAgOTgsICAzLDEwNiwxNjgsMTA2LDE3NywxMDYsMTg3LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCi0gICAgMTM1LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAzOSwyNDIsMjI5LDI0NiwxMDEsMTI4LAotICAgICAgMSwgNDUsIDk5LCAgMywxMDYsMjAyLDEwNiwyMDksMTA2LDIzMSwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwKLSAgICAyMDgsMjMzLDI0MiwgOTksICAyLDEwNiwyMTcsMTA2LDIyMiwyMzYsMTAxLDEyOCwgMzYsMjE2LDI0NSwyMzcsCi0gICAgMjMwLDIzNiwyMjksMTIwLDEyOCwgIDAsMjM4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICA4NiwxMDAsICA0LDEwNiwyNTEsMTA3LCAgNSwxMTAsIDgwLDExMCwxMTMsMjI2LDIzNiwyMzEsMjQyLDIyNSwKLSAgICAyNDYsMTAxLDEyOCwgIDIsICA5LDEwMSwgIDIsMTA3LCAxMSwxMTAsIDc1LDIzOSwyMzEsMjQyLDIyNSwyNDAsCi0gICAgMTA0LCAgNywxMDcsIDMyLDEwNywgNDYsMTA3LCA1OSwxMDksMjQ0LDExMCwgMTksMTEwLCAzMiwxMTAsIDQ0LAotICAgIDIyOSwyMjUsMjQyLDI0NCwyMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNDMsMjMwLDIzMywKLSAgICAyNDIsMjI5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTM5LDIzMywgOTksIDE0LDEwNywgOTAsCi0gICAgMTA3LDEwNiwxMDcsMjA1LDEwOCwgIDMsMTA4LCA2OSwxMDgsIDk4LDEwOCwxMTQsMTA4LDE3MSwxMDgsMjIwLAotICAgIDEwOCwyMzIsMTA5LCAgMywxMDksIDcwLDEwOSwyMDgsMTA5LDIzNywyMjUsMjM2LDIzNiwyMzMsMjI1LDIzOCwKLSAgICAyMjcsMjI5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNjMsIDk5LCAgNCwxMDcsMTE2LDEwNywxMjcsCi0gICAgMTA3LDE0MSwxMDcsMTQ4LDIyNSwyMzYsMjM2LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTgsMjI5LAotICAgIDIzOCwyNDQsMjQyLDIyOSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE2NSwyMzYsMjM5LDI0MywKLSAgICAxMDEsMTI4LCA0OCwgIDYsMTExLCAgMywxMDcsMTU2LDEwNywxNzEsMTA3LDE5MSwyMzcsMjM3LCA5NywxMjksCi0gICAgIDQ4LCAgMSwxMDcsMTY0LDIzNiwyMjksMjMwLDExNiwxMjgsMjU1LDEwMCwyMzgsMjMxLDI0MiwyMjUsMjQ0LAotICAgIDI0NSwyMzYsMjI1LDI0NCwyMzMsMjM5LDIzOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDU1LDI0MiwKLSAgICAyNDIsMjI5LDIyNywyNDQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjMsMTAxLCAgMywxMDcsCi0gICAgMjEzLDEwNywyMjUsMTA3LDI0MiwyMjUsMjQyLDI0NCwyMzIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLAotICAgICA0NywyMzgsMjQ0LDIyOSwyNDIsMjQwLDI0MiwyMzMsMjQzLDIyOSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgNTAsIDYxLDI0OCwyMjcsMjI5LDIzNiwyMzYsMjI5LDIzOCwyNDQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsCi0gICAgMTI4LCA1MCwxNTcsMTAyLCAgMiwxMDgsICA5LDEwOCwgMjQsMjI5LDI0MywyNDQsMjMzLDI0NiwyMjUsMjM2LAotICAgIDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNjQsMTA1LCAgMiwxMDgsIDMwLDEwOCwgNTksMjM4LDIyNSwKLSAgICAyMzgsMjI3LDIzMywyMjUsMTA4LCAgMiwxMDgsIDQyLDEwOCwgNTEsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsCi0gICAgMTI4LCA1MCwxNTAsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA1NCwyNDIsMjI5LDI0MCwyMjUsMjQyLAotICAgIDIyOSwxMTAsMTI4LCA1MCwgNDMsMTA0LCAgMiwxMDgsIDc1LDEwOCwgODYsMjI1LDI0NiwyMjksMjQwLDIyNSwKLSAgICAyNDIsMjI5LDExMCwxMjgsIDUwLCA1MCwyMzMsMjMxLDIzMiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsCi0gICAgIDUwLDE2NCwyMzMsMjQ0LDIyOSwyNDIsMjI1LDI0NCwyMzMsMjM5LDIzOCwyMzcsMjI1LDI0MiwxMDcsMTI4LAotICAgICA0OCwgIDUsMTA4LCAgMywxMDgsMTIyLDEwOCwxNDgsMTA4LDE2MCwyMjUsMjI2LDIzOSwxMTQsICAyLDEwOCwKLSAgICAxMzEsMTA4LDE0MCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE1MiwyNDAsMjI1LDI0MiwyMjksCi0gICAgMTEwLDEyOCwgNTAsIDU2LDIyOSwyMzAsMjQ0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTY3LAotICAgIDIzOSwyNDcsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjYsMTA5LCAgMiwxMDgsMTc3LDEwOCwKLSAgICAyMDksMTAxLCAgMiwxMDgsMTgzLDEwOCwxOTgsMjI4LDIzMywyMjcsMjMzLDIzOCwyMjksMjI3LDIzMywyNDIsCi0gICAgMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjksMjQ0LDIyNSwyMzYsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLAotICAgICA0NiwyMzksMjM5LDIzOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDQyLDIzOCwyMjUsMjM3LDIyOSwKLSAgICAyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDUyLDExMiwgIDIsMTA4LDIzOCwxMDgsMjQ2LDIyOSwyNDIsCi0gICAgMjMzLDIzOSwxMDAsMTI4LCA0OCwgIDIsMjQyLDIzMywyMzgsMjQ0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLAotICAgIDEyOCwgNTAsMTU4LDExNCwgIDIsMTA5LCAgOSwxMDksIDU3LDEwMSwgIDMsMTA5LCAxNywxMDksIDI4LDEwOSwKLSAgICAgNDMsMjI1LDIyNywyMzIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA2NywyNDAsMjQyLDIyOSwyNDMsCi0gICAgMjI5LDIzOCwyNDQsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA1NywyNDMsMjM5LDI0NSwyNDIsMjI3LAotICAgIDIyOSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDYyLDIzMywyMzEsMjMyLDI0NCwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDEwMSwxMjgsIDUwLDE2OCwxMTUsICA1LDEwOSwgODIsMTA5LDExMSwxMDksMTI1LDEwOSwxNTAsCi0gICAgMTA5LDE3OCwxMDEsICAyLDEwOSwgODgsMTA5LDEwMSwyMjcsMjQyLDIyOSwyNDQsMjI3LDIzMywyNDIsMjI3LAotICAgIDIzNiwxMDEsMTI4LCA1MCwxNTMsMjM2LDIzMCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDY2LDIzOSwKLSAgICAyMjcsMjMzLDIyOSwyNDQsMjQ5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTEsMTEyLCAgMiwxMDksCi0gICAgMTMxLDEwOSwxMzcsMjI1LDIyNywxMDEsMTI4LCA0OCwgIDAsMjI5LDIyNywyMzMsMjI1LDIzNiwyNDAsMjI1LAotICAgIDI0MiwyMjksMTEwLDEyOCwgNTAsIDUzLDExNiwgIDIsMTA5LDE1NiwxMDksMTY3LDIzOSwyMjcsMjM1LDI0MCwKLSAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNDksMjQ1LDIyOCwyNDksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsCi0gICAgIDUwLCA1OSwxMTcsICAyLDEwOSwxODQsMTA5LDE5MywyMzgsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLAotICAgICA0OCwyNDAsMjI5LDI0MiwyNDYsMjMzLDI0MywyMjksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA2MCwKLSAgICAxMTksICAyLDEwOSwyMTQsMTA5LDIyNiwyMjUsMjQ0LDIyOSwyNDIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsCi0gICAgIDUwLCA0NCwyMzksMjM5LDIyOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDQ1LDI1MCwyMjksMjQyLAotICAgIDExMSwxMjgsIDQ4LCAgNywxMDksICAyLDEwOSwyNTAsMTEwLCAgNywyMjksMjQ0LDIyNSwyMzYsMjI3LDIzMywKLSAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNDIsMjM5LDIzOSwyMzgsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsCi0gICAgMTI4LCA1MCwxMzgsMjM4LDIyNSwyMzcsMjI5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTQ4LAotICAgIDI0MywyNDUsMjM4LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTQ0LDExOSwgIDIsMTEwLCA1MCwKLSAgICAxMTAsIDYzLDIyNSwyNDQsMjI5LDI0MiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE0MCwyMzksCi0gICAgMjM5LDIyOCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE0MSwyNDYsIDk3LDEyOCwgIDksICA3LAotICAgIDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzAsICAwLDIzOSwxMTAsIDk0LDExMCwxMDIsMjI1LDIyNywKLSAgICAyNDUsMjQ0LDEwMSwxMjgsIDMwLCA0NywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMjI5LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDIwMywxMDEsICAzLDExMCwxMzEsMTEwLAotICAgIDE0NywxMTAsMTU4LDIyNiwyNDIsMjI5LDI0NiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LDIxNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDUzLDI0NSwyMzgsCi0gICAgMTAzLCAgNCwxMTAsMTcwLDExMCwyMDUsMTEwLDIyMCwxMTAsMjI5LCA5NywgIDIsMTEwLDE3NiwxMTAsMTkxLAotICAgIDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTE3LDI0MCwKLSAgICAyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjEsMjI3LDIzMywyNDIsCi0gICAgMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDMsMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwgNzEsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDUwLCAgNywxMDMsICAyLDExMCwyNDksMTExLCAgMCwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMCwyMzYsCi0gICAgMTE3LCAgMiwxMTEsICA2LDExMSwgMTUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzUsMjQyLAotICAgIDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgIDcsMTA0LCAgMiwxMTEsIDMwLDExMSwgNDAsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDY4LDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsCi0gICAgMTI4LCAzMCwyMDEsMTA1LCAgOCwxMTEsIDY5LDExMSwgNzksMTExLCA5MCwxMTEsIDk3LDExMSwxMjIsMTExLAotICAgIDEzOCwxMTEsMTUzLDExMSwxNjksMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM2LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNTYsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksCi0gICAgICA4LDIzMSwxMTcsICAyLDExMSwxMDQsMTExLDExMywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAotICAgIDEzNiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAgOCwyMzcsMjI1LDI0NCwyNDIsMjI1LDIzMSwKLSAgICAyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNjQsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksCi0gICAgMjI4LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgMTEsMjQzLDIzMiwyMzksMjQyLDI0NCwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU3LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywKLSAgICAyMzEsMTEwLCAgMywxMTEsMTg1LDExMSwxOTUsMTExLDIwMiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCi0gICAgMTI4LCAgOSwxOTIsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDY0LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LAotICAgIDI0NCwxMDUsMTI4LCAxMCwxOTIsMTA2LDEyOCwgIDEsIDUxLDEwNywgIDIsMTExLDIyMywxMTEsMjQ3LDIyNSwKLSAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE2NCwxMTEsMjM1LDIzMiwyMjUsMjM2LDIzMCwyNDcsCi0gICAgMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTE0LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTksMTA4LAotICAgICAgMiwxMTIsICA1LDExMiwgMTAsMjI4LDEwMSwxMjgsICAyLDIyMCwyNDUsMjQ5LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwgIDUsMTcyLDEwOSwgIDIsMTEyLCAyNywxMTIsIDk0LCA5NywgIDMsMTEyLCAzNSwxMTIsCi0gICAgIDU1LDExMiwgODAsMjI3LDI0MiwyMzksMTEwLDEyOSwgIDEsIDQzLDExMiwgNDQsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIyNywyMzEsMjI5LDIzOSwyNDIsMjI1LDI0MCwyNDAsMjQyLDIzOSwKLSAgICAyNDgsMjMzLDIzNywyMjUsMjQ0LDIyOSwyMzYsMjQ5LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwgODMsCi0gICAgMjQ0LDI0MiwyMjUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA2MywyMzksMjM4LAotICAgIDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDczLDExMCwgIDUsMTEyLDExNywxMTIsMTI3LDExMiwKLSAgICAxMzYsMTEyLDE0OCwxMTIsMjMyLDIyNywyNDIsMjI5LDIzNywyMjksMjM4LDExNiwxMjgsIDM0LCAgNiwyMzAsCi0gICAgMjMzLDIzOCwyMzMsMjQ0LDEyMSwxMjgsIDM0LCAzMCwyMzMsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LAotICAgIDExMCwxMjgsICA1LDEwNywxMTYsICAyLDExMiwxNTQsMTEyLDIyMiwxMDEsICAyLDExMiwxNjAsMTEyLDIxMSwKLSAgICAyMzEsMjQyLDIyNSwxMDgsMTMxLCAzNCwgNDMsMTEyLDE3MywxMTIsMTkxLDExMiwxOTYsIDk4LCAgMiwxMTIsCi0gICAgMTc5LDExMiwxODcsMjM5LDI0NCwyNDQsMjM5LDEwOSwxMjgsIDM1LCAzMywxMTYsMTI4LCAzNSwgMzMsMjI5LAotICAgIDEyMCwxMjgsMjQ4LDI0NSwxMTYsICAyLDExMiwyMDIsMTEyLDIwNywyMzksMTEyLDEyOCwgMzUsIDMyLDExMiwKLSAgICAxMjgsIDM1LCAzMiwyNDIsMjQzLDIyOSwyMjcsMjQ0LDIzMywyMzksMTEwLDEyOCwgMzQsIDQxLDIzMywyNDMsCi0gICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAgNSwxMTgsICAzLDExMiwyNDAsMTEyLDI0OSwxMTMsICAyLAotICAgIDIyNiwyNDUsMjM2LDIzNiwyMjksMTE2LDEyOCwgMzcsMjE2LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwKLSAgICAgMzcsMjE3LDI0MywyMzcsMjMzLDIzNiwyMjksMjMwLDIyNSwyMjcsMTAxLDEyOCwgMzgsIDU5LDExMSwgIDMsCi0gICAgMTEzLCAyMiwxMTMsIDMzLDExMywgNDEsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICA4MSwyMzEsMjM5LDIzOCwyMjksMTA3LDEyOCwgIDEsIDQ3LDI0NCwgOTcsMTMxLCAgMywxODUsMTEzLCA1MiwKLSAgICAxMTMsIDczLDExMywgODEsMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjksICAzLDIwMiwxMTMsCi0gICAgIDY1LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxNDQsMjM2LDIyNSwyNDQsMjMzLDExMCwxMjgsICAyLAotICAgIDEwNSwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTc1LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwKLSAgICAxNjQsMjQyLDIzMywyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTE0LDExNSwgIDQsCi0gICAgMTEzLDEyMCwxMTMsMTY1LDExMywxNzksMTEzLDE4NywyMzcsMjI1LDIzNiwxMDgsICAyLDExMywxMjksMTEzLAotICAgIDE0MCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDY3LDIzNSwyMjUsMjQ0LDIyNSwKLSAgICAyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNjMsMTEzLDE1MywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsCi0gICAgMjQ0LDEwNCwxMjgsMjU1LDEwNCwyNDMsMjMyLDIyNSwyNDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMjUwLDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMiwxMDQsMjQ1LDI0MCwyMjksMjQyLDIzMywKLSAgICAyMzksMTE0LDEyOCwyNDYsMjM3LDExNiwgIDIsMTEzLDIwMywxMTMsMjM3LDIyOSwyNDIsMjI1LDI0NCwyMzMsCi0gICAgMjM5LDExMCwgIDIsMTEzLDIxNSwxMTMsMjI2LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwxNTcsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI1MywyMzMsMjM2LDIyOCwKLSAgICAxMDEsMTI5LCAgMSwgNDEsMTEzLDI0NiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQ1LDExNywgIDIsCi0gICAgMTE0LCAgNCwxMTQsIDE1LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgNDEsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3OCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywKLSAgICAyMzMsMjMxLDExMCwgIDMsMTE0LCA0MiwxMTQsIDUyLDExNCwgNTksMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsCi0gICAgMTA1LDEyOCwgIDksMTkxLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2MywyMzEsMjQ1LDIzNCwyMjUsMjQyLAotICAgIDIyNSwyNDQsMTA1LDEyOCwgMTAsMTkxLDI1MCwyMzIsMjMzLDI0NCwyNDMsIDk3LCAgMiwxMTQsIDgxLDExNCwKLSAgICAgOTIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDExNywyMjgsMjI2LDIzNiwyMzEsCi0gICAgMjQyLDIyNSwyNDYsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTksMTA2LAotICAgIDEzOCwgIDAsMTA2LDExNCwxMzUsMTE0LDE5OCwxMTQsMjA5LDExNSwgIDMsMTE1LCAxOSwxMTUsMTMyLDExNSwKLSAgICAyMDEsMTE1LDIwNiwxMTUsMjE4LDExNSwyMjYsIDk3LCAgNCwxMTQsMTQ1LDExNCwxNTYsMTE0LDE2NiwxMTQsCi0gICAgMTczLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTMsMjI2LDIyOSwyMzgsMjMxLAotICAgIDIyNSwyMzYsMTA1LDEyOCwgIDksMTU2LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyOCwyMzEsMTE3LCAgMiwKLSAgICAxMTQsMTgwLDExNCwxODksMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTYsMjQyLDIzNywyNDUsCi0gICAgMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjgsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LAotICAgICAxNiwgOTksICAzLDExNCwyMTcsMTE0LDIyNCwxMTQsMjQ2LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDI0MCwKLSAgICAyMzMsMjQyLCA5OSwgIDIsMTE0LDIzMiwxMTQsMjM3LDIzNiwxMDEsMTI4LCAzNiwyMTcsMjQ1LDIzNywyMzAsCi0gICAgMjM2LDIyOSwxMjAsMTI4LCAgMSwgNTMsMjQyLDIzOSwyNDMsMjQzLDIyOSwyMjgsMjQ0LDIyNSwyMzMsMTA4LAotICAgIDEyOCwgIDIsMTU3LDIyOCwyMzksMjQ0LDIzNiwyMjksMjQzLDI0MywyNDMsMjQ0LDI0MiwyMzksMjM1LDEwMSwKLSAgICAxMjgsICAyLCA5NSwxMDEsICAzLDExNSwgMjcsMTE1LCAzOCwxMTUsMTAzLDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwgODgsMjI5LDEwOSwgIDQsMTE1LCA0OSwxMTUsIDU4LDExNSwgNzIsMTE1LAotICAgICA4OCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0NCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTU4LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE1OSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE2MCwxMDQsICAyLDExNSwxMDksMTE1LDExOCwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LDE1MiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTEsMTM5LDEwNCwgIDIsMTE1LDEzOCwxMTUsMTg4LCA5NywgIDMsMTE1LDE0NiwxMTUsMTU2LAotICAgIDExNSwxNjMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTU3LDIyOCwyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LCAyOSwyMzEsMTE3LCAgMiwxMTUsMTcwLDExNSwxNzksMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCi0gICAgMTI4LCAxMCwxNTcsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjksMjI5LDIzMiwyMjUsMjQyLAotICAgIDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTIzLDIzMywxMTUsMTI4LCA0OCwgIDQsMjM3LDIzOSwKLSAgICAyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzQsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsCi0gICAgIDM2LDE2NSwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMTc4LDEwNywxNDYsICAwLAotICAgIDEwNywxMTYsIDIxLDExOCwxMTAsMTE4LDEyMSwxMTgsMTgzLDExOCwxOTQsMTE5LCAyOCwxMTksIDQyLDEyMCwKLSAgICAxNTAsMTIxLCA5MCwxMjEsMTAzLDEyMSwxMjksMTIxLDE3OCwxMjIsIDYwLDEyMiwgODIsMTIyLCA5NSwxMjIsCi0gICAgMTE4LDEyMiwxNjAsMTIyLDE3MCwgOTcsIDEyLDExNiwgNDcsMTE2LCA3OSwxMTYsMTAxLDExNiwxMzEsMTE2LAotICAgIDI0NSwxMTcsIDE0LDExNywgNDQsMTE3LCA2OSwxMTcsMTc1LDExNywxODksMTE4LCA1NiwxMTgsIDg1LCA5OCwKLSAgICAgIDIsMTE2LCA1MywxMTYsIDcwLDIyNSwyNDMsMjMyLDIzNSwyMzMsMjQyLDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwxNjEsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNDksIDk5LAotICAgICAgMiwxMTYsIDg1LDExNiwgOTEsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgNDksMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsIDU4LDIyOCwxMDEsICAyLDExNiwxMDgsMTE2LDEyNiwyNDMsMjI3LDIyOSwyMzgsCi0gICAgMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1NSwyNDYsIDk3LAotICAgIDEyOCwgIDksIDIxLDEwMiwxMzUsICA1LDIxOSwxMTYsMTQ5LDExNiwxNTgsMTE2LDE3OCwxMTYsMTkyLDExNiwKLSAgICAyMDEsMTE2LDIxNywxMTYsMjMyLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY3LDIyOCwyMjUsCi0gICAgMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDU5LDExNiwxNjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgIDI1MSwgNTksMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxOCwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxOSwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMTksMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMjAsMjQyLDIyNSwyMzAsMjI5LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwyNTEsIDc3LDIzMSwxMTcsICAyLDExNiwyNTIsMTE3LCAgNSwyMzQsMjI1LDI0MiwyMjUsCi0gICAgMjQ0LDEwNSwxMjgsIDEwLDE0OSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyMSwxMDQsICAyLAotICAgIDExNywgMjAsMTE3LCAzMCwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzUsMjM5LDIzOSwKLSAgICAyMzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE5NiwyMzUsMjI1LDI0NCwyMjUsCi0gICAgMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTcxLDExNywgNTcsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LAotICAgIDI0NCwxMDQsMTI4LDI1NSwxMTgsMTEyLCAgMiwxMTcsIDc1LDExNywgOTYsMjQwLCA5NywxMjksICAzLDE4NiwKLSAgICAxMTcsIDgyLDI0MywyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyNDAsCi0gICAgMjQ5LDIyOSwyMzksMjQ1LDExMCwgIDMsMTE3LDEwOCwxMTcsMTIyLDExNywxNTYsMjM3LDIzMywyMjksMjQ1LAotICAgIDIzNywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDExMywxMTIsICAyLDExNywxMjgsMTE3LDE0MywKLSAgICAyMzIsMjMzLDIyOSwyNDUsMjQwLDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzMiwyMzMsCi0gICAgMjI5LDI0NSwyNDAsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjAsMjQzLDI0MywyMjUsMjM4LAotICAgIDIzMSwyNDAsMjMzLDIyOSwyNDUsMjQwLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTIxLDI0MiwKLSAgICAyMzksMjQyLDIzMywyMzMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMTMsMTE1LCAgNSwxMTcsCi0gICAgMjAxLDExNywyNDUsMTE4LCAgNCwxMTgsIDEyLDExOCwgNDAsMjMyLDIzMywyMjgsMjI1LDIyNSwyNDUsMjQ0LAotICAgIDExMSwgIDIsMTE3LDIxNCwxMTcsMjIzLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY0LDIzOCwKLSAgICAyMzksMjQzLDIzMywyMjgsMjI5LDIyNiwyMjksMjI1LDI0MiwyMzMsMjM4LDIzMSwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsICA2LCA2NCwyMzcsMjI1LDIzNiwyMzYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAotICAgICA5NywxMjgsIDQ4LDI0NSwyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMyLDI0MiwgOTcsICAyLDExOCwKLSAgICAgMTksMTE4LCAyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA4MCwyNDQsMjI1LDIzOCwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3NywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTksMjQ0LDIyNSwyMzIsMjMzLDI0MiwyMjUsMjQwLDI0MiwKLSAgICAyMzksMjM2LDIzOSwyMzgsMjMxLDIzNywyMjUsMjQyLDIzNSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsCi0gICAgMjQ0LDEwNCwxMjgsMjU1LDExMiwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LDI0MywyNDQsMjQyLAotICAgIDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTcsMjI2LDIzOSwKLSAgICAyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxNCwgOTksICA0LDExOCwxMzEsMTE4LDE1MywxMTgsCi0gICAgMTYyLDExOCwxNzAsIDk3LCAgMiwxMTgsMTM3LDExOCwxNDcsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLAotICAgIDEyOCwgNTEsMTM3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjMzLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwKLSAgICAgIDEsIDU1LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMTgsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDU1LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LAotICAgICAzMCwgNTEsMTAxLCAgNCwxMTgsMjA0LDExOCwyMzEsMTE5LCAgMCwxMTksIDEyLDEwNCwgIDIsMTE4LDIxMCwKLSAgICAxMTgsMjIxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzIsMjMzLDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDgxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LAotICAgICA0OCwxNzcsMTE4LDI0NCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyMSwKLSAgICAyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExMSwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMjM2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyNDYsMjMxLDI0MiwyMjksMjI5LAotICAgIDIzOCwyMzYsMjI1LDIzOCwyMjgsMjMzLCA5OSwxMjgsICAxLCA1NiwxMDQsICA2LDExOSwgNTYsMTE5LDE4NSwKLSAgICAxMTksMTk2LDExOSwyMjEsMTIwLCA1MiwxMjAsMTQwLCA5NywgIDUsMTE5LCA2OCwxMTksIDc4LDExOSwgODksCi0gICAgMTE5LCA5NiwxMTksMTIxLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE1MCwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDY5LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyMiwKLSAgICAyMzEsMTE3LCAgMiwxMTksMTAzLDExOSwxMTIsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTAsCi0gICAgMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjIsMTA0LCAgNCwxMTksMTMxLDExOSwxNDAsMTE5LAotICAgIDE1NCwxMTksMTcwLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQ2LDIzMCwyMzMsMjM4LDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNjYsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTY3LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTY4LDIyOSwyMzMsMjI3LDIzOSwyNDAsMjQ0LDIzMywKLSAgICAgOTksMTI4LCAgMywyMzEsMjMyLCA5NywgIDIsMTE5LDIwMywxMTksMjEwLDIyOCwyMjksMjQ2LCA5NywxMjgsCi0gICAgICA5LCA4OSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDg5LDIzMywyMjksMjQ1LAotICAgIDIzNSwxMDQsICA0LDExOSwyMzUsMTIwLCAxNCwxMjAsIDI5LDEyMCwgMzgsIDk3LCAgMiwxMTksMjQxLDEyMCwKLSAgICAgIDAsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMjAsCi0gICAgMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAyNCwyMjcsMjMzLAotICAgIDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEwNiwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LCA3NSwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNTAsIDEwLDExMSwgIDQsMTIwLCA2MiwxMjAsMTExLDEyMCwxMjEsMTIwLDEyNiwyMzUsMTA0LAotICAgICAgNCwxMjAsIDczLDEyMCwgODIsMTIwLCA5MSwxMjAsMTAxLDIyNSwyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsICAyLDIzOSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsICA1LDI0NSwyMjUsMjQ0LDI0NCwyMzIsCi0gICAgMjI1LDEwNSwxMjgsIDE0LCAgMywyNDcsMjI1LDIzMywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDQsMjM3LAotICAgIDI0NSwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDkxLDIzOSwxMDcsMTI4LCAgMSwxNTMsMjQyLDIyNSwKLSAgICAyMzUsMjMyLDIyNSwyMzgsMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAgNiwyNTAsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDUsMTA1LCAgNCwxMjAsMTYwLDEyMCwxNzEsMTIwLDE5NiwxMjAsMjQ1LAotICAgIDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzcsMjM1LDIyNSwyNDQsMjI1LDIzNSwKLSAgICAyMjUsMjM4LCA5NywxMjksIDQ4LDE3MywxMjAsMTg0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsCi0gICAgMTA0LDEyOCwyNTUsMTE5LDI0MiwxMTEsICAzLDEyMCwyMDUsMTIwLDIyMCwxMjAsMjM2LDIzMSwyNDUsMjQyLAotICAgIDIyNSwyMzcsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDIxLDIzNywyMjksMjI5LDI0NCwKLSAgICAyMzksMjQyLDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAyMiwyNDMsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDEwMSwxMjgsIDUxLCAyMCwyNDksMjI5LDIzOSwxMDcsICA1LDEyMSwgIDQsMTIxLCAzOSwxMjEsIDU0LAotICAgIDEyMSwgNjMsMTIxLCA3NywgOTcsICAyLDEyMSwgMTAsMTIxLCAyNSwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwKLSAgICAyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDExMCwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksCi0gICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDE0LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNTAsIDk2LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDQ5LDI0MCwKLSAgICAyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDAsMjQzLDIzMywyMzksCi0gICAgMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDUxLDIzNCwyMjksMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA5MiwxMDgsICAyLDEyMSwxMDksMTIxLDEyMCwyMzMsMjM4LDIyOSwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDUzLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsCi0gICAgMTUyLDEwOSwgIDMsMTIxLDEzNywxMjEsMTUxLDEyMSwxNjIsMjI3LDI0NSwyMjYsMjI5LDIyOCwyNDMsMjQxLAotICAgIDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2NiwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsIDc1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCi0gICAgIDUxLDE2MiwxMTEsICA1LDEyMSwxOTAsMTIxLDIxNiwxMjEsMjU0LDEyMiwgMTAsMTIyLCAyNCwxMDQsICAyLAotICAgIDEyMSwxOTYsMTIxLDIwNiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODMsMjM3LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTkyLDIzNSwgOTcsICAyLDEyMSwyMjMsMTIxLDIzMSwyMzMsCi0gICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsICAxLDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTc5LAotICAgIDEyMSwyNDIsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjIsMjM5LDI0MCwKLSAgICAyMzksMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMzAsMjQwLDI0MCwyMjUsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEyOSwxMTQsICAyLDEyMiwgMzAsMTIyLCA1MCwyMjksMjI1LAotICAgIDIzOCwyNDMsMjQ0LDIyNSwyMzgsMjI4LDIyNSwyNDIsMjI4LDI0MywyNDksMjM3LDIyNiwyMzksMTA4LDEyOCwKLSAgICAgNTAsMTI3LDIzOSwyMzgsMjMzLDI0MywyMjcsMjM3LCA5OCwxMjgsICAzLCA2NywyNDAsIDk3LCAgMiwxMjIsCi0gICAgIDY3LDEyMiwgNzMsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LAotICAgICA1MSwxNzAsMjQzLDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTExLDExNiwKLSAgICAgIDIsMTIyLDEwMSwxMjIsMTEwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjA3LDI0NSwyNDIsCi0gICAgMjM4LDIyOSwxMDAsMTI4LCAgMiwxNTgsMTE3LCAgMiwxMjIsMTI0LDEyMiwxMzUsMjMyLDIzMywyNDIsMjI1LAotICAgIDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3OSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwKLSAgICAgNDgsMTc1LDEyMiwxNDgsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjAsCi0gICAgMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTg0LDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLAotICAgIDEwMSwxMjgsIDUxLDE5MCwxMDgsMTQ2LCAgMCwxMDgsMTIyLDIyMCwxMjQsMjQ3LDEyNSwgMjAsMTI1LCA4NiwKLSAgICAxMjUsMTI0LDEyNiwgMjAsMTI2LCAyOSwxMjYsIDQ1LDEyNiwgNjksMTI2LCA4NywxMjYsMjA1LDEyNiwyNDYsCi0gICAgMTI3LDEyNSwxMjcsMTMzLDEyNywxNjYsMTI3LDE3NSwxMjcsMTgzLDEyNywyNDUsIDk3LCAgNywxMjIsMjM2LAotICAgIDEyMiwyNDYsMTIyLDI1MywxMjMsICA0LDEyMywgMjksMTIzLCA0NSwxMjQsMjM1LDIyNiwyMjksMjM4LDIzMSwKLSAgICAyMjUsMjM2LDEwNSwxMjgsICA5LDE3OCwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgNTgsMjI4LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksIDUwLDIzMSwxMTcsICAyLDEyMywgMTEsMTIzLCAyMCwyMzQsMjI1LDI0MiwyMjUsMjQ0LAotICAgIDEwNSwxMjgsIDEwLDE3OCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1MCwyMzUsMjM1LDIzMiwKLSAgICAyMjUsMjM4LDIzMSwyNDksMjI1LDIzOSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNjksMTA5LCAxMCwxMjMsCi0gICAgIDY3LDEyNCwgIDYsMTI0LCAyMywxMjQsIDYxLDEyNCwgNzUsMTI0LCA5NCwxMjQsMTEwLDEyNCwxMzAsMTI0LAotICAgIDE1MCwxMjQsMTczLCA5NywgIDIsMTIzLCA3MywxMjMsMjU0LDIzNiwyMjksMTAyLCAgNCwxMjMsIDg1LDEyMywKLSAgICAgOTksMTIzLDE5MSwxMjMsMjA4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LDI1NCwyNTIsMjMyLDIyNSwyMzcsMjUwLCA5NywgIDIsMTIzLDEwOSwxMjMsMTUwLDIyNSwyMjYsMjM5LAotICAgIDI0NiwxMDEsICAyLDEyMywxMTksMTIzLDEzMywyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTQsMjQ4LDIzMywyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LDI1NCwyNDcsMjI2LDIyOSwyMzYsMjM5LDExOSwgIDIsMTIzLDE2MCwxMjMsMTc0LAotICAgIDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNTAsMjMzLDI0MywKLSAgICAyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0OSwyMzMsCi0gICAgMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjUxLAotICAgIDIzNywyMjUsMjI4LDIyOCwyMjUsMjI1LDIyNiwyMzksMjQ2LDEwMSwgIDIsMTIzLDIyMywxMjMsMjM3LDIzMCwKLSAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNDYsMjMzLDI0MywyMzksCi0gICAgMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0NSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY4LDIyNiwyMjgsIDk3LDEyOSwgIDMsMTg3LDEyNCwgMTQsMjQzLDI0NCwKLSAgICAyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxNTUsMjI5LDEwMCwxMzAsICA1LDIyMCwxMjQsIDMyLDEyNCwgNTIsCi0gICAgMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNjAsMTI0LCA0MywyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsMjUxLCA2MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyMCwyMzAsMjMzLDIzOCwKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjIyLDIzMiwyMjUsMjMyLDIzMywyMzgsCi0gICAgMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIwMiwyMzMsMjM4LAotICAgIDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMjMsMjM0LDIyOSwKLSAgICAyMjksMjM3LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgMjUyLDIwMSwyMzUsMjMyLDIyNSwyMzIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwyNTIsMjAzLDIzNiwyMjUsMjM3LDIzMiwyMjksMjMyLDIzMywyNDMsMjM5LDIzNiwKLSAgICAyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MywyNDIsMjM3LDEwMSwgIDIsCi0gICAgMTI0LDE4MCwxMjQsMTkzLDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAotICAgIDIyNCwyMjksMTA5LCAgMiwxMjQsMjAwLDEyNCwyMTksMjMyLDIyNSwyMzIsMjMzLDIzOCwyMzMsMjQ0LDIzMywKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTMsMTM2LDIzMywyMzgsMjMzLDI0NCwyMzMsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIwNCwyNDIsMjMxLDIyOSwyMjcsMjMzLAotICAgIDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM3LDIzOSwgOTgsICAzLDEyNCwyNTUsMTI1LCAgNCwxMjUsIDEwLDIyNSwKLSAgICAxMTQsMTI4LCAgMSwxNTQsMjI5LDIzNiwxMTYsMTI4LCAgMiwxMDgsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsCi0gICAgMTExLDEyOCwgNDksIDEyLCA5OSwgIDQsMTI1LCAzMCwxMjUsIDM3LDEyNSwgNDYsMTI1LCA3MywyMjUsMjQyLAotICAgIDIzOSwxMTAsMTI4LCAgMSwgNjIsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNjAsMjMzLDI0MiwKLSAgICAgOTksICAyLDEyNSwgNTQsMTI1LCA1OSwyMzYsMTAxLDEyOCwgMzYsMjE5LDI0NSwyMzcsMjMwLDIzNiwyMjksCi0gICAgMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNjEsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LAotICAgIDIyOSwyMzgsMTE2LDEyOCwgIDEsIDYwLDIyOCwyMzksMTE2LDEzMCwgIDEsIDY0LDEyNSwgOTYsMTI1LDEwNSwKLSAgICAyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCA2NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsCi0gICAgIDU1LDEyNSwxMTUsMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAzMCwgNTcsMTAxLCAgMywxMjUsMTMyLAotICAgIDEyNSwxNzAsMTI2LCAxNSwyMzAsMTE2LCAgMiwxMjUsMTM5LDEyNSwxNTUsMjI1LDIzOCwyMzEsMjM2LDIyOSwKLSAgICAyMjUsMjI2LDIzOSwyNDYsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDI2LDI0NCwyMjUsMjI3LDIzNSwyMjYsCi0gICAgMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDI0LDI0MywxMTUsMTMyLCAgMCwgNjAsMTI1LAotICAgIDE4MywxMjUsMjA1LDEyNSwyMTcsMTI2LCAgNywyMjksMjQxLDI0NSwyMjUsMTA4LDEyOSwgMzQsMTAwLDEyNSwKLSAgICAxOTMsMjM5LDI0MiwyMzEsMjQyLDIyOSwyMjUsMjQ0LDIyOSwxMTQsMTI4LCAzNCwyMTgsMjM3LDIzOSwyMzgsCi0gICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMjgsMTExLCAgMiwxMjUsMjIzLDEyNSwyNTIsMTE0LAotICAgICAgMiwxMjUsMjI5LDEyNSwyNDIsMjI5LDI0MSwyNDUsMjMzLDI0NiwyMjUsMjM2LDIyOSwyMzgsMTE2LDEyOCwKLSAgICAgMzQsMTE0LDIzMSwyNDIsMjI5LDIyNSwyNDQsMjI5LDExNCwxMjgsIDM0LDExOCwyNDYsMjI5LDI0MiwyMjksCi0gICAgMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTAyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwxMDAsMjUwLAotICAgIDEwNCwxMjgsICAyLDExMCwyMzAsMjI2LDIzNiwyMzksMjI3LDEwNywxMjgsIDM3LDE0MCwyMzIsMjM5LDIzOSwKLSAgICAyMzUsMjQyLDIyOSwyNDQsMjQyLDIzOSwyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMiwxMDksMTA1LCAgMiwxMjYsCi0gICAgIDUxLDEyNiwgNTYsMjQyLCA5NywxMjgsIDMyLDE2NCwyNDcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLAotICAgIDIyNSwxMTAsMTI4LCAgNSwxMDgsMTA2LDEyOSwgIDEsMjAxLDEyNiwgNzUsMjI5LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODksMTA4LDEzMiwyNDYsMTkyLDEyNiwgOTksMTI2LDEyMywxMjYsCi0gICAgMTM0LDEyNiwxNDMsIDk3LCAgMiwxMjYsMTA1LDEyNiwxMTIsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDUxLAotICAgIDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzksMjMzLDIzOCwyMjksMjI2LDIyOSwKLSAgICAyMzYsMjM5LDExOSwxMjgsIDMwLCA1OSwyMzYsMjI1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA1MiwyNDYsCi0gICAgMjM5LDIyNywyMjUsMjM2LDIzMywgOTksICAzLDEyNiwxNTcsMTI2LDE2NywxMjYsMTc0LDIyNiwyMjksMjM4LAotICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyNSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTcsMjQ2LDIzOSwKLSAgICAyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAyLDEyNiwxODgsMTI2LDE5OCwyMjYsMjI5LDIzOCwyMzEsCi0gICAgMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjcsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDk5LDEwOSwgIDMsMTI2LAotICAgIDIxMywxMjYsMjI2LDEyNiwyMzcsMjMzLDIyOCwyMjgsMjM2LDIyOSwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwKLSAgICAgIDIsMTA3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzYsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDgsMTExLCAgNiwxMjcsICA0LDEyNywgMTYsMTI3LCA1OCwxMjcsIDY5LAotICAgIDEyNywgNzUsMTI3LDExNywyMjcsMjMyLDI0NSwyMzYsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA0NCwKLSAgICAyMzEsMjMzLDIyNywyMjUsMTA4LCAgMywxMjcsIDI4LDEyNywgMzQsMTI3LCA1MywyMjUsMjM4LDEwMCwxMjgsCi0gICAgIDM0LCAzOSwyMzgsMjM5LDExNiwxMjksICAwLDE3MiwxMjcsIDQyLDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLAotICAgIDIyOSwxMDAsMTI4LCAzNSwgMTYsMjM5LDExNCwxMjgsIDM0LCA0MCwyMzYsMjMzLDIzOCwyMzEsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwgMTQsIDM3LDIzOCwyMzEsMTE1LDEyOCwgIDEsMTI3LDI0NywyMzYsMjMzLDIzOCwxMDEsCi0gICAgICAyLDEyNywgODUsMTI3LDEwOCwgOTksICAyLDEyNywgOTEsMTI3LDEwMywyMjksMjM4LDI0NCwyMjksMjQyLAotICAgIDIzNiwyMzMsMjM4LDEwMSwxMjgsMjU0LCA3OCwyMzcsIDk4LDEyOCwgIDMsIDUwLDIyOCwyMjUsMjQzLDIzMiwKLSAgICAyMjksMTAwLDEyOCwyNTQsIDc3LDI1MCwyMjksMjM4LDIzMSwxMDEsMTI4LCAzNywyMDIsMjQwLDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDM2LDE2NywxMTUsICAzLDEyNywxNDEsMTI3LDE0OCwxMjcsMTU2LDIzNiwyMjUsMjQzLAotICAgIDEwNCwxMjgsICAxLCA2NiwyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgMzMsIDE5LDI0NSwyNDAsMjI5LDI0MiwKLSAgICAyMzMsMjM5LDExNCwxMjgsMjQ2LDIzOCwyNDQsMjQzLDIzMiwyMjUsMjI4LDEwMSwxMjgsIDM3LDE0NSwyNDUsCi0gICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDM4LDI0NiwyMzksMjI3LDIyNSwyMzYsMjMzLCA5OSwgIDMsMTI3LAotICAgIDE5NywxMjcsMjA3LDEyNywyMTQsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTQwLDIyOCwKLSAgICAyMjksMjQ2LCA5NywxMjgsICA5LCAxMiwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDIsCi0gICAgMTI3LDIyOCwxMjcsMjM4LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyNiwyMjgsMjI5LAotICAgIDI0NiwgOTcsMTI4LCAgOSwgOTgsMjQ4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjExLDEwOSwKLSAgICAxNDQsICAwLDEwOSwxMjgsIDM1LDEzMCwxNDQsMTMwLDE2OSwxMzAsMTk2LDEzMCwyMjEsMTMyLCAxOCwxMzIsCi0gICAgIDQwLDEzMywgOTUsMTMzLDEyNSwxMzMsMTc0LDEzNCwgMjUsMTM0LCA0NywxMzQsIDcyLDEzNCwgODEsMTM1LAotICAgIDEwOCwxMzUsMTM2LCA5NywgMTIsMTI4LCA2MSwxMjgsIDcxLDEyOCwxMzUsMTI4LDE0MiwxMjgsMTY3LDEyOCwKLSAgICAyMTUsMTMwLCA1MSwxMzAsIDc2LDEzMCwgODEsMTMwLCA5NSwxMzAsMTA3LDEzMCwxMTIsMjI2LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTc0LCA5OSwgIDIsMTI4LCA3NywxMjgsMTI5LDI0MiwyMzksMTEwLAotICAgIDEzMiwgIDAsMTc1LDEyOCwgOTEsMTI4LDEwMiwxMjgsMTA4LDEyOCwxMTcsMjI2LDIyOSwyMzYsMjM5LDI0NywKLSAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCA0OSwyMjcsMjM3LCA5OCwxMjgsICAzLCAgNCwyMzYsMjM5LDI0NywyMzcsCi0gICAgMjM5LDEwMCwxMjgsICAyLDIwNSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LAotICAgIDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA2MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDYsMjMxLDExNywKLSAgICAgIDIsMTI4LDE0OSwxMjgsMTU4LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTc0LDI0MiwyMzcsCi0gICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDQ2LDEwNCwgIDIsMTI4LDE3MywxMjgsMjA1LDIyNSwyNDAsMjI1LAotICAgIDIzNSwxMDQsICAyLDEyOCwxODMsMTI4LDE5MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2NCwKLSAgICAyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNjQsMjMzLDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTI2LDEwNSwgIDUsMTI4LDIyNywxMjksIDQwLDEyOSwxMDMsMTI5LAotICAgIDEzMywxMzAsIDM5LDIyNywyMzIsMjI1LDI0NCwyNDQsMjI1LDI0NywgOTcsICAzLDEyOCwyNDIsMTI5LCAxNywKLSAgICAxMjksIDI0LDIzNiwyMzksMTE5LCAgMiwxMjgsMjUwLDEyOSwgIDUsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsCi0gICAgMjI1LDEwNSwxMjgsMjQ4LDE0OSwyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LAotICAgIDE0OCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzUsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwKLSAgICAyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTQ3LDIyOSwxMDcsICAzLDEyOSwgNDksMTI5LCA4MCwxMjksCi0gICAgIDg3LDIzNiwyMzksMTE5LCAgMiwxMjksIDU3LDEyOSwgNjgsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LAotICAgIDEwNSwxMjgsMjQ4LDE0MCwyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDEzOSwKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzIsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsCi0gICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTM4LDIzMiwyMjUsMjM4LDIyNSwyMzUsMjI1LDExNiwgIDIsMTI5LAotICAgIDExNSwxMjksMTI2LDIzNiwyMjksMjMwLDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxMzIsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwgMTQsIDQ5LDExNiwgIDMsMTI5LDE0MSwxMjksMTY5LDEyOSwyMzIsMjI1LDIzMywyMzUsCi0gICAgMjMyLDExNywgIDIsMTI5LDE1MSwxMjksMTYyLDIzNiwyMjksMjMwLDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgIDI0OCwxMzcsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDcxLDIzMiwxMTEsICAzLDEyOSwxNzgsMTI5LDIwOSwKLSAgICAxMjksMjE2LDIzNiwyMzksMTE5LCAgMiwxMjksMTg2LDEyOSwxOTcsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsCi0gICAgMjI1LDEwNSwxMjgsMjQ4LDE0MywyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LAotICAgIDE0MiwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzMsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwKLSAgICAyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTQxLDI0MiwxMDUsICAzLDEyOSwyNDEsMTMwLCAxNiwxMzAsCi0gICAgIDIzLDIzNiwyMzksMTE5LCAgMiwxMjksMjQ5LDEzMCwgIDQsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LAotICAgIDEwNSwxMjgsMjQ4LDE0NiwyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0NSwKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzQsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsCi0gICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTQ0LDI0OSwyMjUsMjM3LDIzOSwyMzUsMjQ0LDIzMiwyMjUsMTA1LAotICAgIDEyOCwgMTQsIDcwLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjIsMTMwLCA2NCwKLSAgICAyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0MywyMzYsMTAxLDEyOCwgMzgsCi0gICAgIDY2LDIzOCwyNDMsMjQ5LDIzOSwyMzgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzEsMjQxLAotICAgIDIyNSwyMzAsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTAsMjQyLDExNSwxMjgsIDM4LCA2NiwKLSAgICAxMTUsICAyLDEzMCwxMTgsMTMwLDEzNiwyMzksMjQyLDIyNSwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NSwyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMxLAotICAgICA5OCwgIDIsMTMwLDE1MCwxMzAsMTYwLDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAgNywKLSAgICAyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIxMiwgOTksICAyLDEzMCwxNzUsMTMwLDE4MywyMzMsCi0gICAgMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjIwLDI0NSwyMjYsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLAotICAgIDEwMSwxMjgsIDUxLDE2NSwyMjgsMjM5LDExNiwgIDIsMTMwLDIwNCwxMzAsMjEzLDIyNSwyMjcsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgMzAsIDY1LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNjcsMTAxLCAgNywxMzAsCi0gICAgMjM3LDEzMSwxMDgsMTMxLDExOSwxMzEsMTM0LDEzMSwxNTksMTMxLDE5NiwxMzEsMjA4LDEwMSwgIDIsMTMwLAotICAgIDI0MywxMzEsIDk1LDEwOSwgIDQsMTMwLDI1MywxMzEsICA2LDEzMSwgMjAsMTMxLCAzNiwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA2OSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMjI2LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjU0LDIyNywyMzcsMTAxLCAgMiwxMzEsIDQzLDEzMSwgNTYsMjI4LDIzMywyMjUsMjM2LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjI4LDIyOSwyMzcsMTA1LCAgMiwxMzEsIDY0LDEzMSwgNzksCi0gICAgMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwyMDksMjQzLAotICAgIDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDcyLDI0NCwKLSAgICAyMzksMjQyLDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA3NywyMzIsMjMzLDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTI5LDIzMywyNTAsMjMzLDIyOSwyNDIsMjI1LDI0MywyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKLSAgICAyMjUsMTMxLDE0NywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0NiwxMDksCi0gICAgMTMwLCAgNSwyMjIsMTMxLDE2NywxMzEsMTg3LDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDYyLAotICAgIDEzMSwxNzgsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNjIsMjMyLDIyOSwyMjYsMjQyLDIyOSwKLSAgICAxMTksMTI4LCAgNSwyMjIsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTYsCi0gICAgMjQyLDIzNSwyMzIsIDk3LCAgMywxMzEsMjE5LDEzMSwyMjgsMTMyLCAgNSwyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsICA1LDE2NSwyMzUsMjI5LDIzMCwyNDUsMjM2LCA5NywgIDIsMTMxLDIzOSwxMzEsMjQ4LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTY2LDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDE2NiwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxNjUsMTA0LCAgMiwxMzIsIDI0LDEzMiwgMzAsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMTMsMjUwLDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTQ2LDEwNSwgIDYsMTMyLCA1NCwxMzIsIDkxLDEzMiwyMjgsCi0gICAgMTMyLDIzOSwxMzMsICA4LDEzMywgNjUsMjI4LDEwMCwgIDIsMTMyLCA2MSwxMzIsIDg2LDIzNiwyMjksMjI4LAotICAgIDIzOSwyNDQsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LDIyNSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywKLSAgICAyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwMSwyMzksMTE2LDEyOCwgIDAsMTgzLDIyOSwyNDUsMTA5LCAgNSwxMzIsCi0gICAgMTA1LDEzMiwxNDAsMTMyLDE1NSwxMzIsMTY0LDEzMiwyMTUsIDk3LCAgMiwxMzIsMTExLDEzMiwxMjYsMjI3LAotICAgIDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTQsMjQwLDIyNSwKLSAgICAyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxOCwyMjcsMjMzLDI0MiwyMjcsCi0gICAgMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEwMCwyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LCA2NSwxMTIsICAyLDEzMiwxNzAsMTMyLDIwMiwgOTcsICAyLDEzMiwxNzYsMTMyLDE5MCwKLSAgICAyMzgsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTEyLDI0MiwyMjksCi0gICAgMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICA0LDIzMywyMjksMjQ1LDI0MCwyMzUsMjM5LAotICAgIDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDExMCwyNDMsMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA0OSwxMTEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyNywyMzUsCi0gICAgMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjIzLDEzMiwyNTIsMjMyLDIyNSwyMzYsMjMwLAotICAgIDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDQsMjM4LDExNywgIDIsMTMzLCAxNSwxMzMsIDYwLDExNSwKLSAgICAxMzIsIDM0LCAxOCwxMzMsIDI3LDEzMywgMzgsMTMzLCA0NywxMzMsIDUzLDIyNiwyMjksMjM2LDIzOSwyNDcsCi0gICAgMjI3LDIzNywgOTgsMTI4LCAgMywgMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNCwxNTAsMjM3LAotICAgIDIzOSwxMDAsMTI4LCAgMiwyMTUsMjQwLDIzNiwyNDUsMTE1LDEyOCwgMzQsIDE5LDI0NCwxMDEsMTI4LCAzMiwKLSAgICAgNTAsMjQyLDEwNSwgIDIsMTMzLCA3MiwxMzMsIDg2LDIyNiwyMjUsMjI1LDI0MiwyNDUsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzQsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzMsMTA4LAotICAgICAgMiwxMzMsMTAxLDEzMywxMTYsMjM5LDIzOCwyMzEsMjM2LDIyOSwyMzEsMjQ0LDI0NSwyNDIsMjM4LDIyOSwKLSAgICAxMDAsMTI4LCAgMiwxMTIsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNTAsMTA5LCAgMywxMzMsCi0gICAgMTMzLDEzMywxNDcsMTMzLDE1OCwyMjcsMjQ1LDIyNiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLAotICAgIDEyOCwgNTEsMTYzLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzcsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTU5LDExMSwgIDUsCi0gICAgMTMzLDE4NiwxMzMsMjEyLDEzMywyMzcsMTMzLDI0NywxMzQsICAwLDEwNCwgIDIsMTMzLDE5MiwxMzMsMjAyLAotICAgIDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEzMCwyMzcsMjQzLDI0MSwyNDUsMjI1LDI0MiwKLSAgICAxMDEsMTI4LCA1MSwxOTMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyNiwxMzMsCi0gICAgMjI1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQ3LDIzNiwyNDMsMjQxLAotICAgIDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIxNCwyMzcsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzMywKLSAgICAyNDYsMjI5LDI0MiwyNDMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI5LCA1MSwxNjcsMTM0LCAxNSwyMjgsCi0gICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNjgsMjQwLCA5NywgIDIsMTM0LCAzMiwxMzQsIDM4LAotICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTY4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTcxLDExNSwKLSAgICAgIDIsMTM0LCA1MywxMzQsIDYyLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTc5LDI0NSwyNDAsCi0gICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzOSwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLAotICAgIDExMSwxMTcsMTQxLCAgMCwxODEsMTM0LDExMSwxMzQsMTE1LDEzNCwxMjUsMTM0LDE0OSwxMzQsMTU5LDEzNCwKLSAgICAxODEsMTM0LDE5MiwxMzQsMjE3LDEzNCwyNDAsMTM0LDI1MCwxMzUsIDI0LDEzNSwgODgsMTM1LCA5OCwgNDksCi0gICAgMTI4LCAgMCwxODEsMjI1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMwLDIyNywxMDQsICAyLAotICAgIDEzNCwxMzIsMTM0LDE0MiwyMzEsMjQyLDIyOSwyMjUsMjQ0LDIyOSwxMTQsMTI4LCAzNCwxMDcsMjM2LDIyOSwKLSAgICAyNDMsMTE1LDEyOCwgMzQsMTA2LDIzMCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE0MCwxMDMsCi0gICAgICAyLDEzNCwxNjUsMTM0LDE3MiwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywxODgsMjQzLDI0MSwyNDUsMjI1LAotICAgIDI0MiwxMDEsMTI4LCA1MSwxNDEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyOCwKLSAgICAyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjI0LDEzNCwyMDUsMjMyLDIyNSwyMzYsCi0gICAgMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDUsMTA4LCAgMiwxMzQsMjIzLDEzNCwyMzIsMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDksMjQ0LDIzMywyNDAsMjM2LDEyMSwxMjgsICAwLDIxNSwKLSAgICAyMzcsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNTUsMjM4LDIyNSwxMDQsICAyLDEzNSwgIDIsCi0gICAgMTM1LCAxMSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2MywyMzYsMjI5LDIzMCwyNDQsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNjMsMTE1LCAgMiwxMzUsIDMwLDEzNSwgNzksMjMzLCA5OSwKLSAgICAgIDMsMTM1LCAzOSwxMzUsIDU2LDEzNSwgNjcsMjI1LDIzNiwyMzgsMjM5LDI0NCwxMDEsMTI5LCAzOCwxMDYsCi0gICAgMTM1LCA1MCwyMjgsMjI2LDEwOCwxMjgsIDM4LDEwNywyMzAsMjM2LDIyNSwyNDQsMjQzLDIzMywyMzEsMTEwLAotICAgIDEyOCwgMzgsMTA5LDI0MywyMzIsMjI1LDI0MiwyNDAsMjQzLDIzMywyMzEsMTEwLDEyOCwgMzgsMTExLDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTc4LDI0NiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCi0gICAgIDUxLDE4MiwyNDcsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxODgsMTE4LCAgMiwxMzUsMTE0LAotICAgIDEzNSwxMjcsMjM3LDIyOSwyMzEsMjI1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTg1LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTgzLDExOSwgIDIsMTM1LDE0MiwxMzUsMTU1LDIzNywyMjksCi0gICAgMjMxLDIyNSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE5MSwyNDMsMjQxLDI0NSwyMjUsMjQyLAotICAgIDEwMSwxMjgsIDUxLDE4OSwxMTAsMTUwLCAgMCwxMTAsMTM1LDIxMiwxMzYsIDkwLDEzNiwxMTQsMTM2LDE4MCwKLSAgICAxMzYsMjA1LDEzNywgIDcsMTM3LCAxNywxMzcsIDg0LDEzNywxMjcsMTM5LDE2MSwxMzksMTc5LDEzOSwyMDQsCi0gICAgMTM5LDIzNSwxNDAsICA1LDE0MCwgNzAsMTQyLCA1MiwxNDIsIDYwLDE0MiwgODUsMTQyLCA5MywxNDMsIDYxLAotICAgIDE0MywgNzEsMTQzLCA4MSwgOTcsICA4LDEzNSwyMzAsMTM1LDI1MCwxMzYsICAxLDEzNiwgIDgsMTM2LCAzMywKLSAgICAxMzYsIDQ0LDEzNiwgNjksMTM2LCA4MSwgOTgsICAyLDEzNSwyMzYsMTM1LDI0NSwyMjksMjM4LDIzMSwyMjUsCi0gICAgMjM2LDEwNSwxMjgsICA5LDE2OCwyMzYsIDk3LDEyOCwgMzQsICA3LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLAotICAgICA2OCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDAsMjMxLDExNywgIDIsMTM2LCAxNSwxMzYsIDI0LDIzNCwKLSAgICAyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTY4LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCi0gICAgIDQwLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDYsMjM1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwMiwxMzYsIDU3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKLSAgICAyNDQsMTA0LDEyOCwyNTUsMTMzLDI0MCwyMzksMjQzLDI0NCwyNDIsMjM5LDI0MCwyMzIsMTAxLDEyOCwgIDEsCi0gICAgIDczLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI5LCA5OCwgIDIsMTM2LCA5NiwxMzYsMTA2LAotICAgIDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxMSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAgIDAsMTYwLCA5OSwgIDQsMTM2LDEyNCwxMzYsMTMxLDEzNiwxNDAsMTM2LDE2NywyMjUsMjQyLDIzOSwxMTAsCi0gICAgMTI4LCAgMSwgNzIsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNzAsMjMzLDI0MiwgOTksICAyLAotICAgIDEzNiwxNDgsMTM2LDE1MywyMzYsMTAxLDEyOCwgMzYsMjIxLDI0NSwyMzcsMjMwLDIzNiwyMjksMjQ4LDIyNiwKLSAgICAyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNzUsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsCi0gICAgMTE2LDEyOCwgIDEsIDcwLDIyOCwyMzksMTE2LCAgMiwxMzYsMTg4LDEzNiwxOTcsMjI1LDIyNywyMjcsMjI5LAotICAgIDIzOCwxMTYsMTI4LCAzMCwgNjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA3MSwxMDEsICAzLDEzNiwKLSAgICAyMTMsMTM2LDIyNCwxMzYsMjQ5LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDksCi0gICAgMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwNSwxMzYsMjM3LDIzMiwyMjUsMjM2LAotICAgIDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTM2LDI0NywyNDMsMjMyLDIyOSwyNDEsMjI5LDIzNiwKLSAgICAyNDMsMjMzLDIzMSwxMTAsMTI4LCAzMiwxNzAsMjMwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsCi0gICAgMTM5LDEwMywgIDIsMTM3LCAyMywxMzcsIDczLCA5NywgIDMsMTM3LCAzMSwxMzcsIDQxLDEzNywgNDgsMjI2LAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTUzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyNSwKLSAgICAyMzEsMTE3LCAgMiwxMzcsIDU1LDEzNywgNjQsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTMsCi0gICAgMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjUsMjM5LDIzOCwyMzEsMjQ1LDI0NCwyMzIsMjI1LAotICAgIDEwNSwxMjgsIDE0LCAgNywxMDQsICAyLDEzNywgOTAsMTM3LDEwMCwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwKLSAgICAgOTcsMTI4LCA0OCwxNDcsMjM5LDIzOSwxMDcsICAyLDEzNywxMDgsMTM3LDExNSwyMzYsMjI5LDIzMCwxMTYsCi0gICAgMTI4LCAgMiwxMTQsMjQyLDIyOSwyNDQsMjQyLDIzOSwyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMiwxMTUsMTA1LAotICAgICAgNCwxMzcsMTM3LDEzOCwgNTAsMTM4LCA2MSwxMzgsMTE5LDIyOSwyNDUsMTEwLCAgNywxMzcsMTU1LDEzNywKLSAgICAxOTAsMTM3LDIyMiwxMzcsMjM2LDEzNywyNDUsMTM4LCAyMiwxMzgsIDM1LCA5NywgIDIsMTM3LDE2MSwxMzcsCi0gICAgMTc2LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTExLAotICAgIDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMTUsMjI3LDEwNSwKLSAgICAgIDIsMTM3LDE5NywxMzcsMjA5LDIyOSwyNDUsMjI3LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCi0gICAgIDUzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCA5NywyMzIsMjMzLAotICAgIDIyOSwyNDUsMjMyLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDU0LDIzNSwyMzksMjQyLDIyOSwKLSAgICAyMjUsMTEwLDEyOCwgNDksIDUyLDI0MCwgOTcsICAyLDEzNywyNTIsMTM4LCAxMCwyMzgsMjQzLDIzMywyMzksCi0gICAgMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTA0LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNTAsICAxLDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDQ5LDEwMywyNDQsMjMzLDIzNSwyMjksMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCi0gICAgIDQ5LDEwMiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTA3LDEwNywgIDIsMTM4LAotICAgICA2NywxMzgsIDkxLDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwMywxMzgsIDc5LDIzMiwKLSAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTM0LDIzMiwyMjUsMjMyLDIzMywxMTYsCi0gICAgICAyLDEzOCwxMDEsMTM4LDExMiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTUzLAotICAgIDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA3NywyMzgsMTAxLDE0MSwgIDAsIDU3LDEzOCwxNTAsMTM4LDE1OSwKLSAgICAxMzgsMTY5LDEzOCwxOTksMTM4LDIwNiwxMzgsMjMxLDEzOSwgIDIsMTM5LCAzNiwxMzksIDQ4LDEzOSwgNTksCi0gICAgMTM5LCA5MiwxMzksMTAwLDEzOSwxMTEsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDUsMjI2LAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwKLSAgICAgMzYsMTA0LDEzOCwxODAsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsCi0gICAgMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQ2LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDExMSwyMzEsMTE3LAotICAgICAgMiwxMzgsMjEzLDEzOCwyMjIsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzksMjQyLDIzNywKLSAgICAyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMTEsMjMyLCA5NywgIDIsMTM4LDIzOCwxMzgsMjQ5LDIyNywyMzUsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDUsMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LAotICAgICA0OCwgNDEsMTA1LCAgMiwxMzksICA4LDEzOSwgMjYsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwKLSAgICAyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNDAsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksCi0gICAgMTE0LDEyOCwgMzIsMTM3LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDI1LAotICAgIDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNTcsMTEyLCAgMiwxMzksIDY1LDEzOSwKLSAgICAgNzIsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTI0LDIyOSwxMTQsICAyLDEzOSwgNzksMTM5LCA4NSwyMzMsCi0gICAgMjM5LDEwMCwxMjgsIDM2LDE0NCwyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDksMjQyLDIzOSwyMzcsMjI1LAotICAgIDExMCwxMjgsIDMzLDEyMCwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTIxLDExNiwKLSAgICAgIDIsMTM5LDExNywxMzksMTU1LDIyOSwyMjksMTEwLCAgMiwxMzksMTI1LDEzOSwxMzQsMjI3LDIzMywyNDIsCi0gICAgMjI3LDIzNiwxMDEsMTI4LCAzNiwxMTQsMTEyLCAgMiwxMzksMTQwLDEzOSwxNDcsMjI1LDI0MiwyMjksMTEwLAotICAgIDEyOCwgMzYsMTM0LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTQsMjMyLDIyNSwxMDUsMTI4LCAxNCwKLSAgICAgODksMTA2LDEyOSwgIDEsMjA0LDEzOSwxNjcsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgOTAsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDI0MywxMzksMTkyLAotICAgIDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTU3LDEwOCwgIDIsMTM5LDIxMCwKLSAgICAxMzksMjI0LDIyOSwyMzEsMjQyLDIzMywyMzEsMjMyLDI0NCwyMzYsMjM5LDIzOCwxMDMsMTI4LCAgMSwxNTgsCi0gICAgMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA3MywxMDksICAyLDEzOSwyNDEsMTM5LAotICAgIDI1MiwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDc4LDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMTAxLDEyOCwgNTEsMTU0LDExMCwgIDIsMTQwLCAxMSwxNDAsIDYxLCA5NywgIDMsMTQwLCAxOSwxNDAsCi0gICAgIDI5LDE0MCwgMzYsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTYzLDIyOCwyMjksMjQ2LAotICAgICA5NywxMjgsICA5LCAzNSwyMzEsMTE3LCAgMiwxNDAsIDQzLDE0MCwgNTIsMjM0LDIyNSwyNDIsMjI1LDI0NCwKLSAgICAxMDUsMTI4LCAxMCwxNjMsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzUsMjM4LDIyNSwyMjgsCi0gICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDEsMTExLCAgNiwxNDAsIDg0LDE0MCwgOTUsMTQwLDEyMCwxNDAsMTYxLAotICAgIDE0MSwxMTMsMTQyLCA0MCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTEwLDIzNSwKLSAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMDYsMTQwLDEwOCwyMzIsMjI1LDIzNiwyMzAsCi0gICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEzNywxMTAsICAzLDE0MCwxMjgsMTQwLDE0NCwxNDAsMTUzLAotICAgIDIyNiwyNDIsMjI5LDIyNSwyMzUsMjMzLDIzOCwyMzEsMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsICAwLDE2MCwKLSAgICAyMjksMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAxOSwyNDUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsCi0gICAgIDI1LDIzOSwxMTAsICA3LDE0MCwxNzgsMTQwLDE4NywxNDAsMjAxLDE0MCwyMzUsMTQwLDI1MSwxNDEsIDM2LAotICAgIDE0MSwgOTUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzAsMjMwLDIzMywyMzgsMjI1LDIzNiwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzMCwyMzEsMjMyLDI0NSwyMzgsMjM4LCA5NywgIDIsCi0gICAgMTQwLDIxMiwxNDAsMjIxLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTg2LDIzMCwyMzMsMjM4LAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNTksMjMzLDIzOCwyMzMsMjQ0LDIzMywKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjMxLDIzNCwyMjksMjI5LDIzNywxMDUsCi0gICAgICAyLDE0MSwgIDUsMTQxLCAyMCwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjUyLDIxMCwyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1MiwgNzUsMjM3LDEwMSwgIDIsMTQxLCA0MywxNDEsIDU2LDIyOCwyMzMsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzMiwyMjksMjM3LDEwNSwgIDIsMTQxLCA2NCwxNDEsIDc5LAotICAgIDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMjEzLDI0MywKLSAgICAyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA3OCwyMzgsCi0gICAgMjM5LDIzOSwyMzgsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLAotICAgIDE0MSwxMTYsICA3LDE0MSwxMjksMTQxLDE0MCwxNDEsMTY5LDE0MSwyMDQsMTQxLDIxNiwxNDEsMjM2LDE0MiwKLSAgICAgIDYsMjI3LDIzOSwyMzgsMjQ0LDIyNSwyMzMsMjM4LDExNSwxMjgsIDM0LCAxMiwxMDEsICAyLDE0MSwxNDYsCi0gICAgMTQxLDE2MiwyMzYsMjI5LDIzNywyMjksMjM4LDExNiwxMjksIDM0LCAgOSwxNDEsMTU3LDIzOSwxMDIsMTI4LAotICAgICAzNCwgIDksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsIDk2LDIzMSwyNDIsMjI5LDIyNSwyNDQsMjI5LDExNCwKLSAgICAxMjksIDM0LDExMSwxNDEsMTgxLDIzOCwyMzksMTE0LCAgMiwxNDEsMTg5LDE0MSwxOTcsMjI5LDI0MSwyNDUsCi0gICAgMjI1LDEwOCwxMjgsIDM0LDExMywyMzYsMjI5LDI0MywxMTUsMTI4LCAzNCwxMjEsMjMzLDIyOCwyMjksMjM4LAotICAgIDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LCAzNCwgOTgsMjM2LDIyOSwyNDMsMTE1LDEyOSwgMzQsMTEwLDE0MSwKLSAgICAyMjUsMjM4LDIzOSwyNDIsMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LDExMiwxMTIsICAyLDE0MSwyNDIsCi0gICAgMTQxLDI1MiwyMjUsMjQyLDIyNSwyMzYsMjM2LDIyOSwxMDgsMTI4LCAzNCwgMzgsMjQyLDIyOSwyMjcsMjI5LAotICAgIDIyOCwyMjksMTE1LDEyOCwgMzQsMTI4LDI0MywxMTcsICAzLDE0MiwgMTUsMTQyLCAyMiwxNDIsIDMxLDIyNiwKLSAgICAyNDMsMjI5LDExNiwxMjgsIDM0LDEzMiwyMjcsMjI3LDIyOSwyMjksMjI4LDExNSwxMjgsIDM0LDEyOSwyNDAsCi0gICAgMjI5LDI0MiwyNDMsMjI5LDExNiwxMjgsIDM0LDEzMywyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LAotICAgIDExMCwxMjgsICA1LDExOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTY5LDExNSwgIDIsMTQyLCA2NiwKLSAgICAxNDIsIDc1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTc3LDI0NSwyNDAsMjI5LDI0MiwyMzMsCi0gICAgMjM5LDExNCwxMjgsIDMyLDEyNywyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgIDAsMjQxLDExNywxMzIsICAzLAotICAgIDE4OSwxNDIsMTA1LDE0MiwxMTYsMTQyLDE5NywxNDMsIDI0LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwKLSAgICAgOTcsMTI4LCA0OCwxMDgsMTA3LCAgMiwxNDIsMTIyLDE0MiwxNDYsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsCi0gICAgIDk3LDEyOSwgNDgsMjA0LDE0MiwxMzQsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LAotICAgIDI1NSwxMzUsMjQ0LCA5NywgIDMsMTQyLDE1NSwxNDIsMTY1LDE0MiwxNzIsMjI2LDIyOSwyMzgsMjMxLDIyNSwKLSAgICAyMzYsMTA1LDEyOCwgIDksMTg4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2MCwyMzEsMTE3LCAgMiwxNDIsCi0gICAgMTc5LDE0MiwxODgsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxODgsMjQyLDIzNywyNDUsMjM1LAotICAgIDIzMiwxMDUsMTI4LCAxMCwgNjAsMTA5LCAgMiwxNDIsMjAzLDE0MiwyMzcsMjI2LDIyOSwyNDIsMjQzLDIzMywKLSAgICAyMzEsMTEwLDEzMCwgIDAsIDM1LDE0MiwyMTcsMTQyLDIyOSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCAgMywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDk1LDIyOSwxMTQsICAyLAotICAgIDE0MiwyNDQsMTQzLCAyMCwyMjUsMjM2LDI0MywyMzMsMjMxLDExMCwgIDIsMTQyLDI1NSwxNDMsICA3LDIzMSwKLSAgICAyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywxMTYsMjM2LDIzOSwyNDcsMjI5LDI0MiwyMzEsMjQyLDIyOSwyMjksCi0gICAgMTA3LDEyOCwgIDMsMTE3LDExMSwxMjgsIDMzLCAyMiwxMTAsMTMwLCAgNSwyMjQsMTQzLCAzMiwxNDMsIDUyLAotICAgIDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDY0LDE0MywgNDMsMjMyLDIyOSwyMjYsMjQyLDIyOSwKLSAgICAxMTksMTI4LDI1MSwgNjQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMjQsMjQ2LDI0MywyNDEsCi0gICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTgxLDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLAotICAgIDE4NywyNDksIDk3LCAgMywxNDMsIDkwLDE0MywxMDAsMTQzLDEwNywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwKLSAgICAxMDUsMTI4LCAgOSwxNTgsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDMwLDIzMSwxMTcsICAyLDE0MywxMTQsCi0gICAgMTQzLDEyMywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1OCwyNDIsMjM3LDI0NSwyMzUsMjMyLAotICAgIDEwNSwxMjgsIDEwLCAzMCwxMTEsMTQ3LCAgMCwxMTEsMTQzLDE3NCwxNDMsMTk2LDE0NCwgMTgsMTQ0LDE4OCwKLSAgICAxNDUsICA0LDE0NSwgMTksMTQ1LCA1OSwxNDUsMTgyLDE0NSwyMDMsMTQ1LDI0MSwxNDUsMjUyLDE0NiwxNzQsCi0gICAgMTQ4LCAgOCwxNDgsIDcyLDE0OCwxMDUsMTQ4LDE1MSwxNDksIDI0LDE0OSwgNzEsMTQ5LCA4MywgOTcsICAyLAotICAgIDE0MywxODAsMTQzLDE4NywyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMCwyNDMsMjM4LDIzMSwyNDQsMjMyLDIyNSwKLSAgICAxMDUsMTI4LCAxNCwgNDUsIDk4LCAgNCwxNDMsMjA2LDE0MywyNDgsMTQ0LCAgMSwxNDQsIDExLDIyNSwyNDIsCi0gICAgMjQyLDIyOSwxMDAsMTMwLCAgMiwxMTcsMTQzLDIxOCwxNDMsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwyMzMsMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjM1LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCi0gICAgMTQ3LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyNywyNDIsMjI5LDI0NiwxMDEsMTI4LAotICAgICAgMSwgNzksIDk5LCAgMywxNDQsIDI2LDE0NCwgOTksMTQ0LDE3OCwgOTcsICAyLDE0NCwgMzIsMTQ0LCA5MywKLSAgICAyMzgsMjI4LDI0MiwgOTcsICAzLDE0NCwgNDMsMTQ0LCA1MCwxNDQsIDYxLDIyOCwyMjksMjQ2LCA5NywxMjgsCi0gICAgICA5LCAxNywyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQ1LDI0NiwyMzksMjQ3LAotICAgIDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMiwxNDQsIDc1LDE0NCwgODIsMjI4LDIyOSwyNDYsIDk3LDEyOCwKLSAgICAgIDksIDczLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMDEsMjQyLDIzOSwxMTAsCi0gICAgMTI4LCAgMSwyMTAsMjMzLDI0MiwgOTksICAyLDE0NCwxMDcsMTQ0LDExMiwyMzYsMTAxLDEyOCwgMzYsMjIyLAotICAgIDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEzMywgIDAsMjQ0LDE0NCwxMzEsMTQ0LDEzOSwxNDQsMTUwLDE0NCwKLSAgICAxNTgsMTQ0LDE3MCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjA5LDIyOCwyMzksMjQ0LDIyNiwyMjksCi0gICAgMjM2LDIzOSwxMTksMTI4LCAzMCwyMTcsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIxMSwyMzIsMjM5LAotICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIxMywyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwKLSAgICAgMzAsMjE1LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2MiwxMDAsICA0LDE0NCwxOTgsCi0gICAgMTQ0LDIyMSwxNDQsMjI3LDE0NCwyNTAsMjI2LDEwOCwgIDIsMTQ0LDIwNSwxNDQsMjEzLDIyNSwyMjcsMjQ1LAotICAgIDI0NCwxMDEsMTI4LCAgMSwgODEsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAxMywyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LCAxOSwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI5LCAgMCwyNDYsMTQ0LDIzOSwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjMxLDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LAotICAgIDExOSwxMjgsIDMwLDIwNSwxMDEsMTI5LCAgMSwgODMsMTQ1LCAxMCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDQ5LCA5MCwxMDMsICAzLDE0NSwgMjcsMTQ1LCA0MiwxNDUsIDQ5LDIzOSwyMzgsMjI5LDEwNywxMjksCi0gICAgICAyLDIxOSwxNDUsIDM2LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQwLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAwLAotICAgIDI0MiwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDcsMTA0LCAgNCwxNDUsIDY5LDE0NSwKLSAgICAgODAsMTQ1LCA5MCwxNDUsMTY4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzMsCi0gICAgMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDc0LDExMSwgIDIsMTQ1LCA5NiwxNDUsMTA2LAotICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIwNywyNDIsMTEwLDEzMywgIDEsMTYxLDE0NSwKLSAgICAxMjEsMTQ1LDEyOSwxNDUsMTQwLDE0NSwxNDgsMTQ1LDE2MCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsCi0gICAgMjE5LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyMjcsMjMxLDI0MiwyMjUsMjQ2LAotICAgIDEwMSwxMjgsIDMwLDIyMSwyMzIsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIyMywKLSAgICAyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMjI1LDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsCi0gICAgMjI1LDI0NSwxMTYsMTI4LCAgMSwgODEsMTA1LDEyOSwgIDEsMTYzLDE0NSwxODgsMjM4LDI0NiwyMjksMjQyLAotICAgIDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgMTUsMTA3LCAgMiwxNDUsMjA5LDE0NSwKLSAgICAyMzMsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTcwLDE0NSwyMjEsMjMyLDIyNSwyMzYsCi0gICAgMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMTcsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LAotICAgICA4NywyMzYsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTcxLDEwOSwgIDYsMTQ2LCAxMCwKLSAgICAxNDYsIDM4LDE0NiwgNDUsMTQ2LDEzNCwxNDYsMTQ1LDE0NiwxNjMsMjI1LDIyNywyNDIsMjM5LDExMCwxMzAsCi0gICAgICAxLCA3NywxNDYsIDIyLDE0NiwgMzAsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA4MywyMzEsMjQyLAotICAgIDIyNSwyNDYsMTAxLDEyOCwgMzAsIDgxLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA4MCwyMjksMjMxLCA5NywKLSAgICAxMzMsICAzLDIwMSwxNDYsIDYxLDE0NiwgNjUsMTQ2LCA3NiwxNDYsIDkwLDE0NiwxMDYsIDQ5LDEyOCwgIDMsCi0gICAgMjE0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgOTcsMjM2LDIyNSwyNDQsMjMzLAotICAgIDIzOCwyMjcsMjM2LDIzOSwyNDMsMjI5LDEwMCwxMjgsICAyLDExOSwyNDIsMjM5LDI0NSwyMzgsMjI4LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjMsMTE2LCAgMiwxNDYsMTEyLDE0NiwxMjcsCi0gICAgMjMzLDI0NCwyMzYsMjM5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjUsMjM5LAotICAgIDIzOCwyMzksMTE1LDEyOCwgIDMsMjA2LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwKLSAgICAyMDgsMjMzLDIyNywyNDIsMjM5LDExMCwxMjksICAzLDE5MSwxNDYsMTU1LDI0NCwyMzksMjM4LDIzOSwxMTUsCi0gICAgMTI4LCAgMywyMDQsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA3OSwyMzgsMTAxLAotICAgIDE0NSwgIDAsIDQ5LDE0NiwyMTMsMTQ2LDIyMiwxNDYsMjMyLDE0NywgIDYsMTQ3LCAzMSwxNDcsIDQwLDE0NywKLSAgICAgNDksMTQ3LCA3NCwxNDcsMTA4LDE0NywxNDIsMTQ3LDE1NCwxNDcsMTczLDE0NywxODQsMTQ3LDIxNywxNDcsCi0gICAgMjI3LDE0NywyMzUsMTQ3LDI0NiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5NywyMjYsMjI5LAotICAgIDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzEsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI5LCAzNiwKLSAgICAgOTYsMTQ2LDI0MywyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywyMjksMjQzLDIyNSwyMzgsMjQzLDI0MywyMjksCi0gICAgMjQyLDIzMywxMDIsMTI4LCAzOSwxMzgsMTAwLCAgMiwxNDcsIDEyLDE0NywgMTgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwxMDMsMjM5LDI0NCwyMjksMjM4LDIzNiwyMjksMjI1LDIyOCwyMjksMTE0LDEyOCwgMzIsIDM2LDIyOSwKLSAgICAyMzMsMjMxLDIzMiwyNDQsMTA0LDEyOCwgMzMsIDkxLDIzMCwyMzMsMjQ0LDI0NCwyMjksMTAwLDEyOCwyNDYsCi0gICAgMjIwLDIzMSwxMTcsICAyLDE0NywgNTYsMTQ3LCA2NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAotICAgIDIzMSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwMywyMzIsIDk3LCAgMywxNDcsIDgzLDE0NywKLSAgICAgOTQsMTQ3LCA5OSwyMjcsMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk3LDIzNiwxMDIsCi0gICAgMTI4LCAgMCwxODksMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LCA0OCwgMzMsMTA1LCAgMiwxNDcsMTE0LAotICAgIDE0NywxMzIsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwKLSAgICAxMTAsMTI4LCA1MCwgMzIsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTI5LDIzNywyMzksCi0gICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDE3LDIzOCwyNDUsMjM3LDIyOSwyNDIsMjI1LAotICAgIDI0NCwyMzksMjQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0NCwyMzksMjM2LDIyOCwKLSAgICAyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDQ5LDExMiwgIDIsMTQ3LDE5MCwxNDcsMTk3LDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDM2LDExNiwyMjksMTE0LCAgMiwxNDcsMjA0LDE0NywyMTAsMjMzLDIzOSwxMDAsMTI4LAotICAgICAzNiwxMzYsMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMjQxLDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDExNCwKLSAgICAxMjgsICAwLDE4OCwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTEyLDI0MywyNDUsMjQwLDIyOSwyNDIsCi0gICAgMjMzLDIzOSwxMTQsMTI4LCAgMCwxODUsMjQ0LDEwNCwgIDIsMTQ3LDI1MywxNDgsICAyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgODEsMjMzLDI0MiwxMDAsMTI4LCAzMywgODMsMTExLCAgMywxNDgsIDE2LDE0OCwgNTAsMTQ4LCA2NiwKLSAgICAxMDMsICAyLDE0OCwgMjIsMTQ4LCA0MCwyMzksMjM4LDIyOSwxMDcsMTI5LCAgMSwyMzUsMTQ4LCAzMSwyMzcsCi0gICAgMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIzNywyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LAotICAgICAxMCwgMTksMjM3LDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwKLSAgICAgMTAsIDc1LDI0MCwyMjksMTEwLDEyOCwgIDIsIDg0LDExMiwgIDMsMTQ4LCA4MCwxNDgsIDg3LDE0OCwgOTgsCi0gICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTcwLDIyOSwyMzgsMjI2LDI0NSwyMzYsMjM2LDIyOSwxMTYsMTI4LAotICAgICAzNywyMzAsMjQ0LDIzMywyMzksMTEwLDEyOCwgMzUsIDM3LDExNCwgIDIsMTQ4LDExMSwxNDgsMTQwLDEwMCwKLSAgICAgIDIsMTQ4LDExNywxNDgsMTI4LDIzMCwyMjksMjM3LDIzMywyMzgsMjMzLDIzOCwxMDEsMTI4LCAgMCwxNzAsCi0gICAgMjM3LDIyNSwyNDMsMjI3LDI0NSwyMzYsMjMzLDIzOCwxMDEsMTI4LCAgMCwxODYsMjQ0LDIzMiwyMzksMjMxLAotICAgIDIzOSwyMzgsMjI1LDEwOCwxMjgsIDM0LCAzMSwxMTUsICA1LDE0OCwxNjMsMTQ4LDE5NSwxNDgsMjEyLDE0OSwKLSAgICAgIDEsMTQ5LCAxNCwyMzIsMjM5LDI0MiwxMTYsICAyLDE0OCwxNzIsMTQ4LDE3OSwyMjgsMjI5LDI0NiwgOTcsCi0gICAgMTI4LCAgOSwgMTgsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwyMzgsMjI4LDIyOSwyNDYsIDk3LAotICAgIDEyOCwgIDksIDc0LDIzNiwyMjUsMjQzLDEwNCwxMjksICAwLDI0OCwxNDgsMjA0LDIyNSwyMjcsMjQ1LDI0NCwKLSAgICAxMDEsMTI4LCAgMSwyNTUsMjM3LDIyNSwyMzYsMTA4LCAgMiwxNDgsMjIxLDE0OCwyMzIsMjMyLDIzMywyNDIsCi0gICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3MywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAotICAgIDEyOSwgNDgsMTY5LDE0OCwyNDUsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKLSAgICAxMDcsMjQ0LDI0MiwyMzksMjM1LDIyOSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMjU1LDI0NSwyNDAsCi0gICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDI0MCwxMTYsICAyLDE0OSwgMzAsMTQ5LCA0MSwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTI3LDIzMywyMzYsMjI4LDEwMSwxMzAsICAwLDI0NSwKLSAgICAxNDksIDUyLDE0OSwgNjAsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA3NywyMjgsMjMzLDIyOSwyNDIsCi0gICAgMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsIDc5LDI0NSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLAotICAgIDEyOCwgNDksIDMzLDExOCwgIDIsMTQ5LCA4OSwxNDksMTcwLDIyOSwxMTQsICAyLDE0OSwgOTYsMTQ5LDE2MiwKLSAgICAyMzYsMjMzLDIzOCwxMDEsMTMxLCAzMiwgNjIsMTQ5LDEwOSwxNDksMTMyLDE0OSwxNTUsIDk5LCAgMiwxNDksCi0gICAgMTE1LDE0OSwxMjcsMjI5LDIzOCwyNDQsMjI5LDI0MiwyMzYsMjMzLDIzOCwxMDEsMTI4LDI1NCwgNzQsMjM3LAotICAgICA5OCwxMjgsICAzLCAgNSwxMDAsICAyLDE0OSwxMzgsMTQ5LDE0NiwyMjUsMjQzLDIzMiwyMjksMTAwLDEyOCwKLSAgICAyNTQsIDczLDIyNiwyMzYsMjQ3LDIyNSwyNDYsMTIxLDEyOCwyNTQsIDc2LDI0NywyMjUsMjQ2LDEyMSwxMjgsCi0gICAgMjU0LCA3NSwyNDMsMjI3LDIzOSwyNDIsMTAxLDEyOCwgIDAsMTc1LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLAotICAgIDIzMSwxMTAsICAzLDE0OSwxODUsMTQ5LDE5NSwxNDksMjAyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKLSAgICAxMjgsICA5LDIwMywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzUsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsCi0gICAgMjQ0LDEwNSwxMjgsIDEwLDIwMywxMTIsMTQ1LCAgMCwxMTIsMTQ5LDI1MSwxNTIsMTIzLDE1MiwxMzQsMTUyLAotICAgIDE0MywxNTIsMTU1LDE1NCwgODAsMTU0LCA5MCwxNTUsIDgyLDE1NiwxMDEsMTU2LDE5MSwxNTYsMjE3LDE1NywKLSAgICAgOTIsMTU3LDEwMCwxNTgsICAyLDE1OCwgNjAsMTU4LCA4OCwxNTgsIDk4LCA5NywgMTQsMTUwLCAyNSwxNTAsCi0gICAgIDU3LDE1MCwgNjcsMTUwLCA3NCwxNTAsIDgxLDE1MCwxMjksMTUwLDE0MCwxNTAsMTU0LDE1MCwxNjUsMTUwLAotICAgIDIxMiwxNTAsMjI2LDE1MSwyMzgsMTUyLCAyMSwxNTIsMTExLCA5NywgIDIsMTUwLCAzMSwxNTAsIDQzLDIzNywKLSAgICAyNDAsMjQzLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI4LDI0MywyMjksMjM4LDI0NCwyMzksCi0gICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNDMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMTcwLDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA4NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwKLSAgICAgNDIsMTAzLCAgMiwxNTAsIDg3LDE1MCwxMDUsMTAxLCAgMiwxNTAsIDkzLDE1MCwxMDAsMjI4LDIzOSwyNDcsCi0gICAgMTEwLDEyOCwgMzMsMjIzLDI0NSwxMTIsMTI4LCAzMywyMjIsMTE3LCAgMiwxNTAsMTExLDE1MCwxMjAsMjM0LAotICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzAsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKLSAgICAgNDIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExMywyMzMsMjQ5LDIyNSwyMzgsCi0gICAgMjM4LDIzOSwyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQ3LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwyMDksMTA4LCAgMiwxNTAsMTcxLDE1MCwxOTYsMjI1LDI0NCwyMjUsMjM2LDIzMywKLSAgICAyNTAsMjI1LDI0NCwyMzMsMjM5LDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsMjI3LDIyNywyMzcsCi0gICAgIDk4LDEyOCwgIDQsMTMyLDIzOSwyMjcsMjMyLDIzNSwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LDE5MiwyMzgsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNDksMTI3LDExNCwgIDMsMTUwLDIzNCwxNTAsMjU1LDE1MSwyMjcsIDk3LCAgMiwxNTAsMjQwLDE1MCwyNDgsCi0gICAgMjMxLDI0MiwyMjUsMjQwLDEwNCwxMjgsICAwLDE4MiwyMzYsMjM2LDIyOSwxMDgsMTI4LCAzNCwgMzcsMjI5LAotICAgIDExMCwgIDIsMTUxLCAgNiwxNTEsMTE2LDIzNiwyMjksMjMwLDExNiwxMzYsICAwLCA0MCwxNTEsIDI5LDE1MSwKLSAgICAgNDQsMTUxLCA0OSwxNTEsIDU0LDE1MSwgNjUsMTUxLCA3NywxNTEsMTAwLDE1MSwxMDUsMjI1LDIzNiwyNDQsCi0gICAgMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MywgNjIsMjI2LDExNiwxMjgsMjQ4LAotICAgIDIzNywyMjksMTIwLDEyOCwyNDgsMjM2LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwKLSAgICAxNDEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgIDgsMTE1LCAgMiwxNTEsCi0gICAgIDgzLDE1MSwgOTAsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDg5LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LAotICAgIDExNCwxMjgsIDMyLDEyNSwyNDQsMTEyLDEyOCwyNDgsMjM1LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwKLSAgICAxMDgsMTI4LDI1NCwgNTMsMjQyLDIzMywyMzEsMjMyLDExNiwxMzYsICAwLCA0MSwxNTEsMTQwLDE1MSwxNTUsCi0gICAgMTUxLDE2MCwxNTEsMTY1LDE1MSwxNzYsMTUxLDE4OCwxNTEsMjExLDE1MSwyMTYsMjI1LDIzNiwyNDQsMjM5LAotICAgIDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MywgNjMsMjI2LDExNiwxMjgsMjQ4LDI0OCwKLSAgICAyMjksMTIwLDEyOCwyNDgsMjQ3LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxNDIsCi0gICAgMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgIDksMTE1LCAgMiwxNTEsMTk0LAotICAgIDE1MSwyMDEsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDkwLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwKLSAgICAxMjgsIDMyLDEyNiwyNDQsMTEyLDEyOCwyNDgsMjQ2LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsCi0gICAgMTI4LDI1NCwgNTQsMjQ0LDIzMywyMjUsMjM2LDIyOCwyMzMsMjMwLDEwMiwxMjgsIDM0LCAgMiwxMTUsICAzLAotICAgIDE1MSwyNDYsMTUyLCAgMSwxNTIsIDEzLDIyOSwyNDEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKLSAgICAxOTIsMjMyLDI0NCwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTMsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDEwMSwxMjgsIDUxLDE2OSwyNDQsMjI1LDEwNCwxMzQsICA1LDE4MywxNTIsIDM5LDE1MiwgNTMsMTUyLAotICAgICA1OCwxNTIsIDY3LDE1MiwgODIsMTUyLCA5OCwgNDksICAyLDE1MiwgNDUsMTUyLCA0OSwgNDksMTI4LCAgNSwKLSAgICAxODMsMTAwLDEyOCwgIDUsMTgzLDE3OCwgOTcsMTI4LCAgNSwxODMsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LCAgNSwxODMsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxODMsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMTgzLDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MywyNTAsCi0gICAgMjI5LDI0MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2MSwyMjYsMjM5LDI0MCwyMzksMjM3LAotICAgIDIzOSwyMzAsMTExLDEyOCwgNDksICA2LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjIzLDIyOCwKLSAgICAyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDg3LDEwMSwxMzcsICA1LDIyOCwxNTIsCi0gICAgMTc3LDE1MiwxODgsMTUyLDIwOCwxNTIsMjIwLDE1MiwyNDAsMTUzLCA4NiwxNTMsIDk3LDE1MywxMTgsMTU0LAotICAgICA3MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDYzLDIyOCwyMjUsMjMxLDIyOSwKLSAgICAyNDMsMTA0LDEyOSwyNTEsIDY4LDE1MiwxOTksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNjgsCi0gICAgMjI5LDI1MCwyMzMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNTksMjMwLDIzMywyMzgsMjI1LAotICAgIDIzNiwyMjgsMjI1LDIzMSwyMjksMjQzLDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2NywKLSAgICAxMDQsICA1LDE1MiwyNTIsMTUzLCAxOSwxNTMsIDI3LDE1MywgNDEsMTUzLCA3MSwyMjUsMTE0LCAgMiwxNTMsCi0gICAgICAzLDE1MywgMTAsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTI2LDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDUsMTIyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMjgsMjMwLDIzMywyMzgsMjI1LDIzNiwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLCA4NywxMDUsICAyLDE1MywgNDcsMTUzLCA2MiwyMzgsCi0gICAgMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLCA4OCwyNDIsMjI1LAotICAgIDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyMiwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsMjUxLCA4OSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsCi0gICAgMjE4LDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMTY3LDExNCwgIDUsMTUzLDEzMCwxNTMsMTQyLDE1MywxODQsMTU0LCA0OSwKLSAgICAxNTQsIDYyLDIyNSwyMzAsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDc4LDIyNywyMjksCi0gICAgMjM4LDExNiwxMzEsICAwLCAzNywxNTMsMTU1LDE1MywxNjQsMTUzLDE3NiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsICA2LDEwNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgNSwKLSAgICAyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsMTA2LDEwNSwgIDIsMTUzLDE5MCwxNTQsIDMxLDIzOSwxMDAsCi0gICAgMTM0LCAgMCwgNDYsMTUzLDIwNywxNTMsMjE4LDE1MywyMjksMTUzLDI0MSwxNTMsMjUyLDE1NCwgIDgsMjI1LAotICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzNywyMjcsMjI5LDIzOCwyNDQsMjI5LDI0MiwKLSAgICAyMjksMTAwLDEyOCwgIDAsMTgzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCi0gICAgIDk3LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMzEsMjM3LDIzOSwyMzgsMjM5LAotICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTQsMTE1LCAgMiwxNTQsIDE0LDE1NCwgMjEsMjM3LDIyNSwKLSAgICAyMzYsMTA4LDEyOCwyNTQsIDgyLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzMiwyNDMsCi0gICAgMjQwLDIzOSwyMzcsMjI5LDIzOCwyMzMsMjMxLDI0MiwyMjksMjI5LDIzNSwyMjcsMjM3LCA5OCwxMjgsICAzLAotICAgICA2NiwyNDAsMjI5LDIzOCwyMjgsMjMzLDIyNywyNDUsMjM2LDIyNSwxMTQsMTI4LCAzNCwxNjUsMjQ0LDIzMiwKLSAgICAyMzksMjQ1LDI0MywyMjUsMjM4LDEwMCwxMjgsIDMyLCA0OCwyNDMsMjI5LDI0NCwgOTcsMTI4LCAzMiwxNjcsCi0gICAgMjMwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM4LDEwNCwgIDMsMTU0LCA5OCwxNTQsMTQ4LAotICAgIDE1NSwgMjksIDk3LCAgMywxNTQsMTA2LDE1NCwxMTYsMTU0LDEyMywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwKLSAgICAxMDUsMTI4LCAgOSwxNzEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDQzLDIzMSwxMTcsICAyLDE1NCwxMzAsCi0gICAgMTU0LDEzOSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE3MSwyNDIsMjM3LDI0NSwyMzUsMjMyLAotICAgIDEwNSwxMjgsIDEwLCA0MywxMDUsMTMzLCAgMywxOTgsMTU0LDE2MiwxNTQsMTY2LDE1NCwyNTIsMTU1LCAgNCwKLSAgICAxNTUsIDE1LCA0OSwxMjgsICAzLDIxMywyMjksMjQ1LDI0MCwxMDQsICA0LDE1NCwxNzksMTU0LDIxNCwxNTQsCi0gICAgMjI5LDE1NCwyMzgsIDk3LCAgMiwxNTQsMTg1LDE1NCwyMDAsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMjIsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDUwLCAyNiwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDUwLDEwOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3NywyNDAsMjI1LAotICAgIDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDEyLDIzNiwyMjUsMjQ0LDIzMywKLSAgICAxMTAsMTI4LCAgMiwxMjAsMjM4LDI0NCwyMzIsMjQ1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1OCwyNDMsCi0gICAgMjQ5LDIzNywyMjYsMjM5LDIzNiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjEzLDExMSwgIDMsMTU1LAotICAgICAzNywxNTUsIDQyLDE1NSwgNjgsMjM5LDEwNywxMjgsICAxLDE2NSwyNDAsMTA0LCAgMiwxNTUsIDQ5LDE1NSwKLSAgICAgNTgsMjI1LDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMzAsMjQ1LDIzOCwyMzEsMjQ0LDIzMiwyMjUsCi0gICAgMTA1LDEyOCwgMTQsIDI4LDI0MywyMjUsMjM3LDI0MCwyMzIsMjI1LDIzOSwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgMzIsMTA1LDEzMywgIDMsMTkyLDE1NSwgOTYsMTU2LCA1MiwxNTYsIDYzLDE1NiwgNzQsMTU2LCA4OCwKLSAgICAyMjksMjQ1LDExMiwgIDYsMTU1LDExMiwxNTUsMTQ3LDE1NSwxNzksMTU1LDIwNywxNTUsMjIxLDE1NiwgMTcsCi0gICAgIDk3LCAgMiwxNTUsMTE4LDE1NSwxMzMsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA1MCwxMTUsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDUwLCAxOSwyMjcsMTA1LCAgMiwxNTUsMTU0LDE1NSwxNjYsMjI5LDI0NSwyMjcsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTgsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLAotICAgIDEyOCwgNTAsMTAxLDEwNywgIDIsMTU1LDE4NSwxNTUsMTk5LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTQsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2NiwyNDAsCi0gICAgMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICA1LDI0MywyMzMsMjM5LAotICAgIDExNSwgIDIsMTU1LDIzMCwxNTYsICAyLDEwNywgIDIsMTU1LDIzNiwxNTUsMjUwLDIzMywyNDksMjI5LDIzOSwKLSAgICAyMzUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTYsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCi0gICAgIDQ5LCA2OCwyNDQsMjMzLDIzNSwyMjksMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LAotICAgIDExNywxMTYsICAyLDE1NiwgMjMsMTU2LCAzOCwyMzIsMjMzLDIyOSwyNDUsMjQ0LDIzMiwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LDExOSwyMzMsMjM1LDIyOSwyNDUsMjQ0LDIzNSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNDksMTE1LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTYsMjM1LAotICAgIDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIxMiwyNDMsMjQ5LDIzNywyMjYsMjM5LDIzNiwKLSAgICAyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjE0LDI0NywyNDIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsCi0gICAgMjI1LDExMCwxMjgsICA1LDEzMSwyMzYsMjQ1LDExNSwxMzIsICAwLCA0MywxNTYsMTE1LDE1NiwxMjYsMTU2LAotICAgIDEzNSwxNTYsMTY4LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMzEsMjI3LDIzMywKLSAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNCwxNDksMTA5LCAgMiwxNTYsMTQxLDE1NiwxNDgsMjMzLDIzOCwyNDUsCi0gICAgMTE1LDEyOCwgIDAsMTc3LDExMSwgIDIsMTU2LDE1NCwxNTYsMTU4LDEwMCwxMjgsICAyLDIxNCwyMzgsMjM5LAotICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTEsMTE1LCAgMiwxNTYsMTc0LDE1NiwxODEsMjM3LDIyNSwKLSAgICAyMzYsMTA4LDEyOCwyNTQsIDk4LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEyMiwxMDksCi0gICAgICAyLDE1NiwxOTcsMTU2LDIwOCwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDgwLAotICAgIDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjE2LDExMSwgIDUsMTU2LDIyOSwxNTYsMjQwLDE1NywKLSAgICAgNTEsMTU3LCA2MiwxNTcsIDcyLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMjUsCi0gICAgMjMzLDIzOCwyNDQsMjMzLDIzOCwyMzEsMjMzLDIzOCwyMjgsMjI5LDEyMCwgIDQsMTU3LCAgNCwxNTcsIDE2LAotICAgIDE1NywgMjgsMTU3LCA0MSwyMjgsMjM5LDI0NywyMzgsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCAzMSwKLSAgICAyMzYsMjI5LDIzMCwyNDQsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCAyOCwyNDIsMjMzLDIzMSwyMzIsCi0gICAgMjQ0LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzOCwgMzAsMjQ1LDI0MCwyNDcsMjMyLDIzMywyNDQsMTAxLAotICAgIDEyOCwgMzgsIDI5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMjEsMjQwLDIzNiwKLSAgICAyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDI3LDI0MywyNDQsMjI1LDIzNiwyMzcsMjI1LDI0MiwxMDcsCi0gICAgMTI5LCA0OCwgMTgsMTU3LCA4NSwyMzAsMjI1LDIyNywxMDEsMTI4LCA0OCwgMzIsMjQwLDIyNSwyNDIsMjI5LAotICAgIDExMCwxMjgsIDM2LDE3MSwxMTQsICAzLDE1NywxMDgsMTU3LDEzNCwxNTcsMTU5LDEwMSwgIDIsMTU3LDExNCwKLSAgICAxNTcsMTIyLDIyNywyMjksMjI4LDIyOSwxMTUsMTI4LCAzNCwxMjIsMjQzLDIyNywyNDIsMjMzLDI0MCwyNDQsCi0gICAgMjMzLDIzOSwxMTAsMTI4LCAzMywgMzAsMjMzLDIzNywxMDEsICAyLDE1NywxNDIsMTU3LDE0OCwyMzcsMjM5LAotICAgIDEwMCwxMjgsICAyLDE4NSwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLDEyOCwgMzIsIDUzLDExMSwKLSAgICAgIDQsMTU3LDE2OSwxNTcsMTc2LDE1NywxODYsMTU3LDE5OSwyMjgsMjQ1LDIyNywxMTYsMTI4LCAzNCwgMTUsCi0gICAgMjM0LDIyOSwyMjcsMjQ0LDIzMywyNDYsMTAxLDEyOCwgMzUsICA1LDIzNiwyMzksMjM4LDIzMSwyMjksMjI4LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI1MiwxMTIsICAyLDE1NywyMDUsMTU3LDI0MiwxMDEsICAyLDE1NywKLSAgICAyMTEsMTU3LDIxOCwyMzYsMjM2LDIzOSwxMTQsMTI4LCAzNSwgMjQsMjQyLDI0MywxMTcsICAyLDE1NywyMjYsCi0gICAgMTU3LDIzMywyMjYsMjQzLDIyOSwxMTYsMTI4LCAzNCwxMzAsMjQwLDIyOSwyNDIsMjQzLDIyOSwxMTYsMTI4LAotICAgICAzNCwxMzEsMjM5LDI0MiwyNDQsMjMzLDIzOSwxMTAsMTI5LCAzNCwgNTUsMTU3LDI1MywyMjUsMTA4LDEyOCwKLSAgICAgMzQsIDI5LDExNSwgIDIsMTU4LCAgOCwxNTgsIDUxLDEwNSwxMzAsICAzLDIwMCwxNTgsIDE2LDE1OCwgMjcsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDExMywyMzYsMjMzLDI0MCwyMzgsMjI5LAotICAgIDI0NSwyMzcsMjI1LDI0NCwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLDIyNywyMjcsMjM3LCA5OCwKLSAgICAxMjgsICA0LDEzNCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE3NiwxMTcsICAyLDE1OCwgNjYsCi0gICAgMTU4LCA3NywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTE5LDIzNSwyMjUsMjQ0LAotICAgIDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMTUsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMTgwLDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE4NiwxMTMsMTM2LCAgMCwxMTMsCi0gICAgMTU4LDEyOCwxNTksMTc3LDE1OSwxODgsMTU5LDE5NywxNTksMjA0LDE1OSwyMTYsMTU5LDI1NCwxNjAsICA2LAotICAgICA5NywgIDQsMTU4LDEzOCwxNTgsMTYxLDE1OCwyMjUsMTU5LDE2MCwxMDAsICAyLDE1OCwxNDQsMTU4LDE1MCwKLSAgICAyMjksMjQ2LCA5NywxMjgsICA5LCA4OCwyMzcsMjI1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsCi0gICAgMTY4LDEwMiwgIDQsMTU4LDE3MSwxNTgsMTgwLDE1OCwxOTQsMTU4LDIxMCwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsICA2LCA2NiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTQsMjE0LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgMjU0LDIxNSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAotICAgIDIxNiwyMzcsMjI1LDI0NCwxMTUsMTM2LCAgNSwxODQsMTU4LDI0OCwxNTksIDEyLDE1OSwgMjYsMTU5LCAzMSwKLSAgICAxNTksIDM2LDE1OSwgNDUsMTU5LCA2MCwxNTksMTQ3LCA0OSwgIDMsMTU5LCAgMCwxNTksICA0LDE1OSwgIDgsCi0gICAgIDQ4LDEyOCwgIDUsMTg0LCA5NywxMjgsICA1LDE4NCwgOTksMTI4LCAgNSwxODQsIDUwLCAgMiwxNTksIDE4LAotICAgIDE1OSwgMjIsIDU1LDEyOCwgIDUsMTg0LCA1NywxMjgsICA1LDE4NCwxNzksIDUxLDEyOCwgIDUsMTg0LDIyOCwKLSAgICAxMDEsMTI4LCAgNSwxODQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMjM4LDIyNSwyNDIsCi0gICAgMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMTEzLCAgMiwxNTksIDY2LAotICAgIDE1OSwxMzIsMjI1LDI0NCwyMjUsMTEwLCAgNCwxNTksIDc5LDE1OSwgODgsMTU5LDEwMywxNTksMTE5LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg0LDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LDIzMiwyMjksCi0gICAgMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg0LDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwyMzIsMjI5LAotICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NCwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwKLSAgICAxMTksMTI4LCAgNSwxODQsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LCAgNSwxODQsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg0LAotICAgIDI0MiwyMzgsMjI5LDI0OSwyNDAsMjI1LDI0MiwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKLSAgICAxNTksMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxNywyMjcsMjMzLDI0MiwyMjcsCi0gICAgMjM2LDEwMSwxMjgsIDM2LDIyNCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxNjAsMjM3LDIzOSwyMzgsMjM5LAotICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODEsMjM5LDEwMiwxMzAsICA1LDIzMSwxNTksMjI1LDE1OSwKLSAgICAyNDUsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNzEsMTU5LDIzNiwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsMjUxLCA3MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIzMSwyNDAsMjI1LAotICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTcyLDExNywgIDQsMTYwLCAxNiwxNjAsIDI4LDE2MCwxMTcsMTYwLDIwNCwKLSAgICAyMjUsMjQyLDI0NCwyMjksMjQyLDIzOCwyMzksMjQ0LDEwMSwxMjgsIDM4LDEwNSwyMjYsMjQ1LDI0NCwxMTUsCi0gICAgMTM1LCAgNSwxODcsMTYwLCA0OSwxNjAsIDU0LDE2MCwgNTksMTYwLCA2NCwxNjAsIDczLDE2MCwgODgsMTYwLAotICAgIDEwNCwxNzcsIDU2LDEyOCwgIDUsMTg3LDE3OCwgNTMsMTI4LCAgNSwxODcsMTc5LCA0OSwxMjgsICA1LDE4NywKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NywyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NywyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODcsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwgIDUsMTg3LDIyOSwyNDMsMjQ0LDIzMywyMzksMTEwLDEzMywgIDAsIDYzLDE2MCwxMzYsCi0gICAgMTYwLDE1OSwxNjAsMTc2LDE2MCwxODQsMTYwLDE5NiwyMjUsMTE0LCAgMiwxNjAsMTQzLDE2MCwxNTAsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDMxLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDk0LDIyOCwKLSAgICAyMzksMjQ3LDExMCwxMjksICAwLDE5MSwxNjAsMTY4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxOTEsCi0gICAgMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDEyNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCAzMSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDYzLDIzOSwyNDQsMTAxLCAgNCwKLSAgICAxNjAsMjE2LDE2MSwgMzEsMTYxLCA1MSwxNjEsIDgwLDIyOCwyMjYsMTA4LDEzMywgIDAsIDM0LDE2MCwyMzIsCi0gICAgMTYwLDIzOSwxNjAsMjQ2LDE2MSwgIDIsMTYxLCAyMywyMjYsMjI1LDI0MywxMDEsMTI4LCAzMiwgMzAsMjM2LAotICAgIDIyOSwyMzAsMTE2LDEyOCwgMzIsIDI4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsICAyLDI0MCwyNDIsMjMzLDIzNywxMDEsMTI5LCA0OCwgMzAsMTYxLCAxMiwyNDIsMjI5LDI0NiwyMjksCi0gICAgMjQyLDI0MywyMjksMTAwLDEyOCwgNDgsIDI5LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMiwgMjksMjM2LAotICAgIDIyOSwyMzAsMTE2LDEyOSwgMzIsIDI0LDE2MSwgNDAsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKLSAgICAxMjgsIDMyLCAyNywxMTQsICAyLDE2MSwgNTcsMTYxLCA2NywyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsCi0gICAgMTI4LCAzMiwgMjcsMjMzLDIzMSwyMzIsMTE2LDEyOSwgMzIsIDI1LDE2MSwgNzYsMTEwLDEyOCwgIDEsIDczLAotICAgIDI0MywyMzMsMjM4LDIzMSwxMDgsICAyLDE2MSwgOTAsMTYxLCA5NywyMjYsMjI1LDI0MywxMDEsMTI4LCAzMiwKLSAgICAgMjYsMTAxLDEyOSwgIDAsIDM5LDE2MSwxMDMsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCi0gICAgMTI4LDI1NSwgIDcsMTE0LDE0NSwgIDAsMTE0LDE2MSwxNTMsMTYyLDE1NywxNjIsMTY4LDE2MiwyMTUsMTYzLAotICAgICAxMCwxNjQsIDI3LDE2NCwgNTEsMTY0LDE0NiwxNjYsMTgwLDE2NiwyMTcsMTY2LDIyOSwxNjcsIDI3LDE2NywKLSAgICAgMzUsMTY3LDE5NywxNjcsMjA4LDE2NywyNDMsMTY4LCA4NywgOTcsIDExLDE2MSwxNzcsMTYxLDE4OCwxNjEsCi0gICAgMTk4LDE2MSwyMDUsMTYyLCAxNCwxNjIsIDMwLDE2MiwgNTUsMTYyLCA2NiwxNjIsIDkxLDE2MiwxMTQsMTYyLAotICAgIDE1MSwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTI0LDIyNiwyMjksMjM4LDIzMSwKLSAgICAyMjUsMjM2LDEwNSwxMjgsICA5LDE3NiwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgODUsMTAwLCAgNCwxNjEsCi0gICAgMjE1LDE2MSwyMjEsMTYxLDIzNSwxNjIsICA1LDIyOSwyNDYsIDk3LDEyOCwgIDksIDQ4LDIzMywyMjcsMjI1LAotICAgIDEwOCwxMjksIDM0LCAyNiwxNjEsMjMwLDIyOSwxMjAsMTI4LDI0OCwyMjksMjM5LDI0NiwyMjksMjQyLDI0MywKLSAgICAyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjksIDUxLDE3NCwxNjEsMjUxLDIyOCwyNDMsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDEwMSwxMjgsIDUxLDE3NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE3MywyMzAsMTAxLAotICAgIDEyOSwgIDUsMTkxLDE2MiwgMjEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTEsMjMxLDExNywKLSAgICAgIDIsMTYyLCAzNywxNjIsIDQ2LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTc2LDI0MiwyMzcsCi0gICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDQ4LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwxMzcsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzMywxNjIsIDc5LDIzMiwKLSAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTUxLDIzNiwyMzksMjQ3LDIyOSwyNDIsCi0gICAgMjI4LDIzMywyMjUsMjMxLDIzOSwyMzgsMjI1LDIzNiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LAotICAgICAgOSwyNDEsMTA5LCAgMiwxNjIsMTIwLDE2MiwxNDMsMjMzLDIyOCwyMjgsMjM2LDIyOSwyMjgsMjMzLDIyNSwKLSAgICAyMzEsMjM5LDIzOCwyMjUsMjM2LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0MCwyNDMsCi0gICAgMjMyLDIzOSwyNDIsMTEwLDEyOCwgIDIsMTAwLDI0NCwyMzMsMTExLDEyOCwgMzQsIDU0LDIyNiwyMzksMjQwLAotICAgIDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjIsIDk5LCAgNCwxNjIsMTc4LDE2MiwxODUsMTYyLDE5NCwKLSAgICAxNjIsMjAyLDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLCA4OSwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsCi0gICAgICAxLCA4NywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjI1LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LAotICAgIDIyNywyMjksMjM4LDExNiwxMjgsICAxLCA4NywxMDAsICAyLDE2MiwyMjEsMTYyLDIzMSwyMjYsMjM2LDIzMSwKLSAgICAyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgMTcsMjM5LDExNiwgIDIsMTYyLDIzOCwxNjIsMjQ3LDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDg5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwgOTEsMTYzLAotICAgICAgMSwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsIDMwLCA5MywxMDEsICA2LDE2MywgMjQsMTYzLCA2OSwKLSAgICAxNjMsMTA0LDE2MywxNTksMTYzLDE4NCwxNjMsMjE3LDEwMiwgIDIsMTYzLCAzMCwxNjMsIDQzLDIyOSwyNDIsCi0gICAgMjI5LDIzOCwyMjcsMjI5LDIzNywyMjUsMjQyLDEwNywxMjgsIDMyLCA1OSwyMzYsMjI5LDI0OCwyNDMsMTE3LAotICAgICAgMiwxNjMsIDUzLDE2MywgNjAsMjI2LDI0MywyMjksMTE2LDEyOCwgMzQsMTM0LDI0MCwyMjksMjQyLDI0MywKLSAgICAyMjksMTE2LDEyOCwgMzQsMTM1LDIzMSwyMzMsMjQzLDI0NCwyMjksMTE0LCAgMiwxNjMsIDgwLDE2MywgODUsCi0gICAgMjI5LDEwMCwxMjgsICAwLDE3NCwxMTUsICAyLDE2MywgOTEsMTYzLCA5NywyMjUsMjM4LDExNSwxMjgsMjQ4LAotICAgIDIzMiwyMjksMjQyLDIzMywxMDIsMTI4LDI0NiwyMTgsMTA0LCAgMywxNjMsMTEyLDE2MywxMzUsMTYzLDE0OSwKLSAgICAyMjUsMTE0LCAgMiwxNjMsMTE5LDE2MywxMjYsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQ5LDIzNywyMjksCi0gICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTI4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1NCwxNzQsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTQwLDIzNSwKLSAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMzYsMTYzLDE3MiwyMzIsMjI1LDIzNiwyMzAsCi0gICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE1NCwyNDMsMTA0LDEzMCwgIDUsMjMyLDE2MywxOTMsMTYzLAotICAgIDIwOCwyMjgsMjI1LDIzMSwyMjksMjQzLDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3MiwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIzMiwxMTgsICAzLDE2MywyMjUsMTYzLDIzOCwxNjQsCi0gICAgIDE0LDIyOSwyNDIsMjQzLDIyOSwyMjgsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDM0LCA2MSwyMzMsIDk3LAotICAgICAgMiwxNjMsMjQ1LDE2MywyNTQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTEsMjM3LDI0NSwKLSAgICAyMzEsMjQyLDIyNSwyNDMsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTUxLDIzNiwyMzksCi0gICAgMjMxLDIzMywyMjcsMjI1LDIzNiwyMzgsMjM5LDExNiwxMjgsIDM1LCAxNiwyMzAsMjMzLDI0MywyMzIsMjMyLAotICAgIDIzOSwyMzksMTA3LDEyOSwgIDIsMTI2LDE2NCwgNDAsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKLSAgICAxMjgsICAyLDEyNywxMDQsICAyLDE2NCwgNTcsMTY0LCA4MCwgOTcsICAyLDE2NCwgNjMsMTY0LCA3MywyMjYsCi0gICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkzLAotICAgIDExMSwxMzEsICAzLDE5MywxNjQsIDkwLDE2NCwxMTksMTY0LDEzMywyMzksMTA3LDEyOSwgIDIsMTI1LDE2NCwKLSAgICAgOTcsMjQ0LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI5LCAgMiwxMjMsMTY0LDEwOCwyNDMsMjQ1LDI0MCwyMjksCi0gICAgMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMTgxLDI0MywyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LAotICAgIDIyOSwxMDcsMTI4LCAgMywyNDEsMjQ0LDIzMywyMjcsMjMyLDIzOSwyMzksMjM1LDIzNywyMzksMTAwLDEyOCwKLSAgICAgIDIsMjIyLDEwNSwgIDYsMTY0LDE2MCwxNjUsMjA0LDE2NSwyNTAsMTY2LCAgNSwxNjYsIDMwLDE2NiwxNjYsCi0gICAgMjI5LDI0NSwxMDgsICA5LDE2NCwxODIsMTY0LDIxNywxNjQsMjMyLDE2NCwyNDYsMTY1LCAzNiwxNjUsIDUwLAotICAgIDE2NSwxMzYsMTY1LDE0OSwxNjUsMTg0LCA5NywgIDIsMTY0LDE4OCwxNjQsMjAzLDIyNywyMzMsMjQyLDIyNywKLSAgICAyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTEzLDI0MCwyMjUsMjQyLDIyOSwyMzgsCi0gICAgMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMTcsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgOTksMjMyLDIzMywyMjksMjQ1LDIzMiwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LCA2NCwxMDcsICAyLDE2NCwyNTIsMTY1LCAyOCwyMzMsMjQ5LDIyOSwyMzksCi0gICAgMTA3LCAgMiwxNjUsICA2LDE2NSwgMTUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNTgsMjQzLAotICAgIDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTA1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA0OSwgNTcsMjM3LDIzMywyMjksMjQ1LDIzNywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCi0gICAgIDQ5LCA1OSwxMTIsICAzLDE2NSwgNTgsMTY1LCA5MCwxNjUsMTA1LCA5NywgIDIsMTY1LCA2NCwxNjUsIDc4LAotICAgIDIzOCwyNDMsMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDgsMjQyLDIyOSwKLSAgICAyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDMsMjMyLDIzMywyMjksMjQ1LDI0MCwyMzIsCi0gICAgMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNjMsMjMzLDIyOSwyNDUsMTEyLCAgMiwxNjUsMTE0LAotICAgIDE2NSwxMjMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNjAsMjQzLDIzMywyMzksMjQzLDIzNSwKLSAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTA3LDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDQ5LCA2MSwxMTYsICAyLDE2NSwxNTUsMTY1LDE3MCwyMzIsMjMzLDIyOSwyNDUsMjQ0LAotICAgIDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2MiwyMzMsMjM1LDIyOSwyNDUsMjQ0LDIzNSwKLSAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTA2LDI0OSwyMjksMjM5LDI0MiwyMzMsMjM4LDIzMiwyMzMsCi0gICAgMjI5LDI0NSwyMzIsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDksMjMxLDIzMiwxMTYsICAyLAotICAgIDE2NSwyMTIsMTY1LDIyMCwyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzQsIDMxLDExNiwgIDIsMTY1LDIyNiwKLSAgICAxNjUsMjQwLDIyNSwyMjcsMjM1LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjUsCi0gICAgMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzQsMTkxLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwxMzgsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzNCwKLSAgICAxNjYsIDE4LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTUyLDExMCwgIDIsCi0gICAgMTY2LCAzNiwxNjYsMTUyLDEwMywxMzEsICAyLDIxOCwxNjYsIDQ2LDE2NiwgNTcsMTY2LCA2MywyMjYsMjI5LAotICAgIDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDM3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDEwLDIzMiwKLSAgICAyMjUsMjM2LDEwMiwgIDIsMTY2LCA3MiwxNjYsMTE4LDIzNiwyMjksMjMwLDExNiwxMzEsICAyLDE5MSwxNjYsCi0gICAgIDg1LDE2NiwgOTYsMTY2LDEwNywyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDg5LAotICAgIDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjgsMjI3LDIyOSwyMzgsMjQ0LDIyOSwKLSAgICAyNDIsMjI5LDEwMCwxMjgsICAyLDIxMSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEzMCwgIDIsMTkwLDE2NiwxMzAsCi0gICAgMTY2LDE0MSwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU3LDIyNywyMjksMjM4LAotICAgIDI0NCwyMjksMjQyLDIyOSwxMDAsMTI4LCAgMiwyMTAsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwKLSAgICAyMjksMjQ2LDEwMSwxMjgsICAyLCAxOSwyNDQsMjQ0LDIzOSwyNDIsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsIDgxLDEwOCwgIDIsMTY2LDE4NiwxNjYsMTk3LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LAotICAgIDIzOSwxMTksMTI4LCAzMCwgOTUsMjM5LDIzOCwyMzEsMjM2LDIyOSwxMDMsMTI5LCAgMiwxMjQsMTY2LDIwOCwKLSAgICAyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLDEyMiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCA4MiwxMTEsICAzLDE2NiwyMzcsMTY2LDI0OCwxNjcsIDE3LDIzMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNDEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjksIDQ4LDIzNywxNjcsICA1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCi0gICAgMTU1LDI0MiwyNDUsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzNSwyNDAsMjI1LDI0MiwyMjksMTEwLAotICAgIDEyOCwgMzYsMTczLDExNCwgIDMsMTY3LCA0MywxNjcsIDc5LDE2NywxMDksIDk3LCAgMywxNjcsIDUxLDE2NywKLSAgICAgNjEsMTY3LCA2OCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjAsMjI4LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksIDQ5LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgOTIsMjI5LAotICAgIDEwNCwgIDIsMTY3LCA4NiwxNjcsIDk1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTQ1LDIzMCwKLSAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNDEsMjQ2LDIzOSwyMjcsCi0gICAgMjI1LDIzNiwyMzMsIDk5LCAgNCwxNjcsMTI1LDE2NywxMzUsMTY3LDE0MiwxNjcsMTUzLDIyNiwyMjksMjM4LAotICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyNCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTYsMjMxLDI0NSwKLSAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIyNCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsCi0gICAgMjMxLDExMCwgIDMsMTY3LDE2OSwxNjcsMTc5LDE2NywxODYsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMTk2LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2OCwyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwKLSAgICAyNDQsMTA1LDEyOCwgMTAsMTk2LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyNDEsCi0gICAgMTE2LCAgMiwxNjcsMjE0LDE2NywyMjIsMjI2LDIzNiwyMzksMjI3LDEwNywxMjgsIDM3LDE0NCwyNDUsMjQyLAotICAgIDIzOCwyMjksMTAwLDEyOSwgIDIsMTIxLDE2NywyMzIsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwKLSAgICAxMjgsICAyLDE4MCwxMTcsICA0LDE2NywyNTMsMTY4LCAgOCwxNjgsIDMzLDE2OCwgODAsMjMyLDIzMywyNDIsCi0gICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEzOSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAotICAgIDEyOSwgNDgsMjM1LDE2OCwgMjEsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKLSAgICAxNTMsMTEyLCAgMiwxNjgsIDM5LDE2OCwgNzQsMjI5LDEwMSwgIDIsMTY4LCA0NiwxNjgsIDYwLDIzNywyMjUsCi0gICAgMjQyLDIzNSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDIsMjQzLDIzMywyMzEsMjM4LAotICAgIDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0MywyMzMsMjI1LDEwNCwxMjgsMjQ2LDIyMSwKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMzYsMjQ2LDIzOSwyMjcsMjI1LDIzNiwyMzMsIDk5LCAgNCwxNjgsCi0gICAgMTAzLDE2OCwxMTMsMTY4LDEyMCwxNjgsMTMxLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAotICAgIDEzOSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMTEsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDEzOSwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDMsMTY4LDE0NywxNjgsCi0gICAgMTU3LDE2OCwxNjQsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTk1LDIyOCwyMjksMjQ2LAotICAgICA5NywxMjgsICA5LCA2NywyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTk1LDExNSwKLSAgICAxNDcsICAwLDExNSwxNjgsMjE3LDE3MCwxODcsMTcwLDE5OCwxNzEsIDY4LDE3MSwxMDcsMTc0LCA0OSwxNzQsCi0gICAgIDYwLDE3NiwyMDMsMTc5LCA4NSwxNzksMTMxLDE3OSwxNTgsMTgwLCA5MywxODAsMTYwLDE4MSwxOTMsMTgxLAotICAgIDIwMywxODIsMTMzLDE4MiwyMDYsMTgzLDEyMCwxODMsMTMwLCA5NywgIDksMTY4LDIzNywxNjgsMjQ3LDE2OSwKLSAgICAgMTIsMTY5LCA4NCwxNjksMTA5LDE2OSwxMjAsMTY5LDE0NSwxNjksMTc3LDE2OSwyMTcsMjI2LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTg0LDIyNywyNDUsMjQ0LDEwMSwxMjksICAxLCA5MSwxNjksICAwLAotICAgIDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTAxLDEwMCwgIDUsMTY5LCAyNCwKLSAgICAxNjksIDMzLDE2OSwgMzksMTY5LCA1MywxNjksIDY5LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsCi0gICAgIDUzLDIyOSwyNDYsIDk3LDEyOCwgIDksIDU2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1NCwxODYsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTQsMTg3LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMTg4LDIzMSwxMTcsICAyLDE2OSwgOTEsMTY5LDEwMCwyMzQsMjI1LDI0MiwyMjUsMjQ0LAotICAgIDEwNSwxMjgsIDEwLDE4NCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1NiwyMzIsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDg1LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCi0gICAgMTI5LCA0OCwxODEsMTY5LDEzMywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAotICAgIDEyMywyMzYsMjM2LDIyNSwyMzYsMjM2LDIyNSwyMzIsMjM5LDI0NSwyMjUsMjM2LDIyNSwyNDksMjMyLDIyOSwKLSAgICAyNDcsMjI1LDI0MywyMjUsMjM2LDIzNiwyMjUsMjM3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTMsCi0gICAgMjUwLDIzNywyMjksMjM1LDEwNCwxMzAsICA1LDIyNSwxNjksMTg4LDE2OSwyMDgsMjI4LDIyNSwyMzEsMjI5LAotICAgIDI0MywxMDQsMTI5LDI1MSwgNjUsMTY5LDE5OSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2NSwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyNSwyNDIsIDk3LCAgNSwxNjksMjMwLDE3MCwgNDgsCi0gICAgMTcwLCA1NiwxNzAsMTA2LDE3MCwxMTQsIDk3LCAgNSwxNjksMjQyLDE2OSwyNTAsMTcwLCAgMiwxNzAsIDMzLAotICAgIDE3MCwgNDEsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1MCwyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDY1LDIzMywyMzcsMjI1LDIzMywxMDksICAyLDE3MCwgMTIsMTcwLCAyMywyMjUsMjM2LDIyNSwyMzMsCi0gICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDY4LDI0NSwyMjUsMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LAotICAgICA2NywyMzcsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDUxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA0OCwKLSAgICAyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDY0LDEwNSwgIDMsMTcwLCA2NCwxNzAsIDg4LDE3MCwgOTksCi0gICAgMTA1LCAgMiwxNzAsIDcwLDE3MCwgODEsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LAotICAgIDEzNCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTMsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwKLSAgICAxMjgsMjQ4LDEzMywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTIsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsCi0gICAgIDE0LCA2NiwxMTcsICAzLDE3MCwxMjIsMTcwLDE3MiwxNzAsMTc5LDEwMSwgIDMsMTcwLDEzMCwxNzAsMTU0LAotICAgIDE3MCwxNjUsMTAxLCAgMiwxNzAsMTM2LDE3MCwxNDcsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwKLSAgICAxMjgsMjQ4LDEzNiwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTUsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsCi0gICAgMjI1LDEwNSwxMjgsMjQ4LDEzNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTQsMjQ0LDIzMiwyMjUsMTA1LAotICAgIDEyOCwgMTQsIDU2LDI0NSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTcsMjI2LDIzOSwyNDAsMjM5LDIzNywKLSAgICAyMzksMjMwLDExMSwxMjgsIDQ5LCAyNSwgOTksICA1LDE3MCwyMTAsMTcwLDIzMSwxNzAsMjQwLDE3MSwgMzMsCi0gICAgMTcxLCA1NSwyMjUsMjQyLDIzOSwxMTAsMTI5LCAgMSwgOTcsMTcwLDIxOSwyMjgsMjM5LDI0NCwyMjUsMjI3LAotICAgIDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEwMywyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA5NSwKLSAgICAyMzIsMjQ3LCA5NywxMzEsICAyLCA4OSwxNzAsMjUyLDE3MSwgIDcsMTcxLCAyNiwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjE3LDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIxOSwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwKLSAgICAgOTAsMjMzLDI0MiwgOTksICAyLDE3MSwgNDEsMTcxLCA0NiwyMzYsMTAxLDEyOCwgMzYsMjI2LDI0NSwyMzcsCi0gICAgMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsIDkzLDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LAotICAgIDExNiwxMjgsICAyLCAyNSwyMjgsMjM5LDExNiwgIDIsMTcxLCA3NiwxNzEsIDg1LDIyNSwyMjcsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgMzAsIDk3LDIyNiwyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwgOTksMTcxLCA5NSwyMjgsCi0gICAgMjM5LDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEwNSwxMDEsICA5LDE3MSwxMjcsMTcxLAotICAgIDE0MywxNzEsMTc4LDE3MSwyNDMsMTcyLCA5MCwxNzIsMTE3LDE3MiwxNDIsMTcyLDIyMywxNzIsMjUwLDIyNSwKLSAgICAyMzEsMjQ1LDIzNiwyMzYsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCA2MCwgOTksCi0gICAgICAyLDE3MSwxNDksMTcxLDE3MSwyMzksMjM4LDEwMCwxMjksIDMyLCA1MSwxNzEsMTU3LDI0NCwyMzksMjM4LAotICAgIDIyOSwyMjcsMjMyLDIzMywyMzgsMjI5LDI0MywxMDEsMTI4LCAgMiwyMDIsMjQ0LDIzMywyMzksMTEwLDEyOCwKLSAgICAgIDAsMTY3LDIyOSwxMTAsICA0LDE3MSwxODksMTcxLDE5OCwxNzEsMjEyLDE3MSwyMjgsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LCAgNiwgNTEsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjU0LDE3OCwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1NCwxNzksMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LDI1NCwxODAsMjMxLDIzOSwxMDgsMTM1LCAgNSwxODIsMTcyLCAgNywxNzIsIDIxLDE3MiwgMjYsMTcyLAotICAgICAzNSwxNzIsIDUwLDE3MiwgNjYsMTcyLCA3NywgNDksICAyLDE3MiwgMTMsMTcyLCAxNywgNTEsMTI4LCAgNSwKLSAgICAxODIsMTAyLDEyOCwgIDUsMTgyLDE3OCwgOTksMTI4LCAgNSwxODIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LCAgNSwxODIsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxODIsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMTgyLDI0NCwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDYsMjQ3LDIzMywyMjgsCi0gICAgMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgyLDEwNCwgIDIsMTcyLCA5NiwxNzIsMTA3LAotICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjUsMjMzLDI0MiwyMjUsMjMxLDIyNSwKLSAgICAyMzgsIDk3LDEyOCwgNDgsIDkxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxODcsCi0gICAgMTcyLDEzMCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyNiwyMzcsMTA1LAotICAgICAgMiwxNzIsMTQ5LDE3MiwxOTIsMjI3LDIzOSwyMzYsMjM5LDExMCwxMzEsICAwLCA1OSwxNzIsMTYzLDE3MiwKLSAgICAxNzIsMTcyLDE4NCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAyNywyMzcsMjM5LDIzOCwyMzksCi0gICAgMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyNywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDg0LAotICAgIDI0NiwyMzksMjMzLDIyNywyMjksMjI4LDIzNywyMjUsMjQyLDIzNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKLSAgICAxNTYsMTcyLDIxMSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE1OSwyMzgsCi0gICAgMTE2LCAgMiwxNzIsMjMwLDE3MiwyNDAsMjMzLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM0LAotICAgIDIzOSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAzNSwyNDYsMjI5LDExMCwxNDIsICAwLCA1NSwKLSAgICAxNzMsIDI4LDE3MywgMzcsMTczLCA0NywxNzMsIDc3LDE3MywgODQsMTczLCA5NCwxNzMsMTE5LDE3MywxNDYsCi0gICAgMTczLDE4MCwxNzMsMTkyLDE3MywyMDMsMTczLDIzNiwxNzMsMjQ0LDE3MywyNTUsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LCAgNiwxMDMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM3LDIyNywKLSAgICAyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzYsMTAyLDE3MywgNTgsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsCi0gICAgMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQ0LDIyOCwyMjksMjQ2LAotICAgICA5NywxMjgsICA5LDEwOSwyMjksMjMzLDIzMSwyMzIsMjQ0LDIzMiwxMTUsMTI4LCAzMywgOTQsMjMxLDExNywKLSAgICAgIDIsMTczLDEwMSwxNzMsMTEwLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjM3LDI0MiwyMzcsCi0gICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTA5LDIzMiwgOTcsICAyLDE3MywxMjYsMTczLDEzNywyMjcsMjM1LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTAzLDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwKLSAgICAgNDgsIDM5LDEwNSwgIDIsMTczLDE1MiwxNzMsMTcwLDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsCi0gICAgMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDM4LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LAotICAgIDExNCwxMjgsIDMyLDEzNSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyMywKLSAgICAyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDU1LDExMiwgIDIsMTczLDIwOSwxNzMsCi0gICAgMjE2LDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEyMiwyMjksMTE0LCAgMiwxNzMsMjIzLDE3MywyMjksMjMzLAotICAgIDIzOSwxMDAsMTI4LCAzNiwxNDIsMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMjQ3LDI0MiwyMzksMjM3LDIyNSwKLSAgICAxMTAsMTI4LCAzMywxMTgsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDExOSwxMTYsCi0gICAgICAyLDE3NCwgIDUsMTc0LCA0MywyMjksMjI5LDExMCwgIDIsMTc0LCAxMywxNzQsIDIyLDIyNywyMzMsMjQyLAotICAgIDIyNywyMzYsMTAxLDEyOCwgMzYsMTEyLDExMiwgIDIsMTc0LCAyOCwxNzQsIDM1LDIyNSwyNDIsMjI5LDExMCwKLSAgICAxMjgsIDM2LDEzMiwyMjksMjQyLDIzMywyMzksMTAwLDEyOCwgMzYsMTUyLDIzMiwyMjUsMTA1LDEyOCwgMTQsCi0gICAgIDg3LDIzMCwyNDQsMjMyLDI0OSwyNDAsMjMyLDIyOSwxMTAsMTI4LCAgMCwxNzMsMTA0LCAgNywxNzQsIDc2LAotICAgIDE3NSwgNTAsMTc1LCA2MSwxNzUsIDc1LDE3NiwgMjAsMTc2LCAzMywxNzYsMTk3LCA5NywgIDYsMTc0LCA5MCwKLSAgICAxNzQsMTAxLDE3NCwxMTEsMTc0LDEyMiwxNzUsICA5LDE3NSwgMzQsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsCi0gICAgMjI1LDExMCwxMjgsICA1LDExOSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxODIsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3MiwxMDAsICAyLDE3NCwxMjgsMTc0LDIyNCwKLSAgICAyMjgsIDk3LCAgNCwxNzQsMTM5LDE3NCwxNDgsMTc0LDE3OSwxNzQsMTkzLDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwgIDYsIDgxLDIyOCwyMjUsMjM3LDIzNywgOTcsICAyLDE3NCwxNTgsMTc0LDE2NywyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA5NywyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsMjUyLCA5NCwyMzAsMjI1LDI0NCwyMzIsMjI1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsCi0gICAgIDk2LDIzNSwyMjUsMjQzLDI0MiwgOTcsICAyLDE3NCwyMDMsMTc0LDIxMiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjUyLCA5OCwyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA5NSwKLSAgICAxMDEsMTMyLCAzNywxNDYsMTc0LDIzNiwxNzQsMjQzLDE3NCwyNTEsMTc1LCAgNCwyMjgsMjI1LDI0MiwxMDcsCi0gICAgMTI4LCAzNywxNDcsMjM2LDIzMywyMzEsMjMyLDExNiwxMjgsIDM3LDE0NSwyMzcsMjI5LDIyOCwyMzMsMjQ1LAotICAgIDEwOSwxMjgsIDM3LDE0NiwyNDYsIDk3LDEyOCwgIDksIDU0LDIzMSwxMTcsICAyLDE3NSwgMTYsMTc1LCAyNSwKLSAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE4MiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsCi0gICAgIDEwLCA1NCwyMzYsMjQzLDIzMiwyMjksMjM2LDIyOSwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxNDcsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyMSwyMjcsMjMyLDIyNSwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDczLDEwMSwgIDQsMTc1LCA4NSwxNzUsCi0gICAgMTUwLDE3NSwxNjAsMTc1LDE3NywyMjksMTEwLCAgNCwxNzUsIDk2LDE3NSwxMDUsMTc1LDExOSwxNzUsMTM1LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDUyLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxODIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTgzLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwyNTQsMTg0LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIyNywKLSAgICAyNDEsMjI5LDEwOCwxMjksIDMyLDE3MCwxNzUsMTY4LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgMzIsCi0gICAgMTcwLDI0NiwgOTcsMTM0LCAgNSwxNzYsMTc1LDE5NCwxNzUsMjA5LDE3NSwyMjMsMTc1LDIzMiwxNzUsMjQ3LAotICAgIDE3NiwgIDcsIDQ5LCAgMiwxNzUsMjAwLDE3NSwyMDUsMTc3LCA1MywxMjgsICA1LDE3NiwgNTMsMTI4LCAgNSwKLSAgICAxNzYsIDUwLCAgMiwxNzUsMjE1LDE3NSwyMTksIDUwLDEyOCwgIDUsMTc2LDEwMSwxMjgsICA1LDE3NiwyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NiwyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LAotICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NiwyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzYsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwgIDUsMTc2LDIzMiwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDE4NywxMDUsICAyLDE3NiwgMzksMTc2LCA1MCwyMzcsMjI1LDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwKLSAgICAgIDMsMjM3LDExMCwxMzEsICA1LDIzMywxNzYsIDYwLDE3NiwxNDMsMTc2LDE1MiwxMDAsICAyLDE3NiwgNjYsCi0gICAgMTc2LDEzMiwyMjUsMjMxLDIyOSwyNDMsMTA0LDEzMCwyNTEsIDczLDE3NiwgNzgsMTc2LCA4NywyMzIsMjI5LAotICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3MywxMTUsICAyLDE3NiwgOTMsMTc2LDExMywyMzIsMjMzLDIzOCwKLSAgICAyMjgsMjM5LDExNiwxMjksMjUxLCA0NCwxNzYsMTA0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsCi0gICAgIDQ0LDIzMywyMzgsMjI4LDIzOSwxMTYsMTI5LDI1MSwgNDUsMTc2LDEyMywyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsMjUxLCA0NSwyMzksMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTkzLDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjMzLDExNSwgIDIsMTc2LDE1OCwxNzYsMTc4LDIzMiwyMzMsCi0gICAgMjM4LDIyOCwyMzksMTE2LDEyOSwyNTEsIDQyLDE3NiwxNjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgIDI1MSwgNDIsMjMzLDIzOCwyMjgsMjM5LDExNiwxMjksMjUxLCA0MywxNzYsMTg4LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwyNTEsIDQzLDIzOSwyMzksMTA3LDEyOCwgIDIsMTMwLDEwNSwgIDgsMTc2LDIyMSwxNzcsCi0gICAgICA5LDE3NywgMjAsMTc3LCA0NSwxNzcsIDc1LDE3NywgODMsMTc3LCA5NiwxNzgsIDExLDIzMSwyMzcsIDk3LAotICAgIDEzMSwgIDMsMTk1LDE3NiwyMzMsMTc2LDIzNywxNzYsMjQ1LCA0OSwxMjgsICAzLDE5NCwyMzAsMjMzLDIzOCwKLSAgICAyMjUsMTA4LDEyOCwgIDMsMTk0LDIzNiwyNDUsMjM4LDIyNSwyNDQsMjI5LDI0MywyNDksMjM3LDIyNiwyMzksCi0gICAgMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyNDIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LAotICAgICA5NywxMjgsIDQ4LCA4NywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTgzLDE3NywKLSAgICAgMzMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjQsMjM2LDI0NSwxMTMsCi0gICAgICAyLDE3NywgNTMsMTc3LCA2MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4OSwyMzYsMjI5LAotICAgIDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODksMjM3LDIzMywyMzYsMjI1LDExNCwKLSAgICAxMjgsIDM0LCA2MCwyMzgsMjI4LDIzOSwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTQsCi0gICAgMjM5LDExNSwgIDYsMTc3LDExMSwxNzcsMTQ2LDE3NywxNzgsMTc3LDIwNiwxNzcsMjIwLDE3NywyNTIsIDk3LAotICAgICAgMiwxNzcsMTE3LDE3NywxMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA1MCwxMTYsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCi0gICAgIDUwLCAyMCwyMjcsMTA1LCAgMiwxNzcsMTUzLDE3NywxNjUsMjI5LDI0NSwyMjcsMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwxMjYsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNTAsMTAyLDEwNywgIDIsMTc3LDE4NCwxNzcsMTk4LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjIsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2OSwyMzgsMjMzLAotICAgIDIyOSwyNDUsMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTIzLDExMiwgIDIsMTc3LDIyNiwKLSAgICAxNzcsMjM5LDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAgNiwyMzMsCi0gICAgMjI5LDI0NSwyNDAsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjUsMjQ0LDIzMywyMzUsMjI5LAotICAgIDI0NSwyNDQsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjQsMTIwLDE0MSwgIDAsIDU0LDE3OCwKLSAgICAgNDEsMTc4LCA1MCwxNzgsIDYwLDE3OCwgOTAsMTc4LCA5NywxNzgsMTIyLDE3OCwxNDksMTc4LDE4MywxNzgsCi0gICAgMTk1LDE3OCwyMDYsMTc4LDIzOSwxNzgsMjQ3LDE3OSwgIDIsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgICAgNiwxMDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM2LDIyNywyMzMsMjQyLDIyNywKLSAgICAyMzYsMTAxLDEyOSwgMzYsMTAxLDE3OCwgNzEsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsCi0gICAgMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAotICAgIDEwOCwyMzEsMTE3LCAgMiwxNzgsMTA0LDE3OCwxMTMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwKLSAgICAyMzYsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMDgsMjMyLCA5NywgIDIsMTc4LDEyOSwxNzgsCi0gICAgMTQwLDIyNywyMzUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDIsMjM4LDIzMSwyNTAsMjMyLAotICAgIDIzOSwxMTcsMTI4LCA0OCwgMzgsMTA1LCAgMiwxNzgsMTU1LDE3OCwxNzMsMjI4LDIyOSwyMzksMjMxLDI0MiwKLSAgICAyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgMzcsMjM4LDIzMCwyMjksCi0gICAgMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTM0LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwyNTUsIDIyLDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNTQsMTEyLCAgMiwKLSAgICAxNzgsMjEyLDE3OCwyMTksMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTIxLDIyOSwxMTQsICAyLDE3OCwyMjYsCi0gICAgMTc4LDIzMiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE0MSwyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDYsMjQyLAotICAgIDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExNywyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwKLSAgICAgMzIsMTE4LDExNiwgIDIsMTc5LCAgOCwxNzksIDc5LDIyOSwyMjksMTEwLCAgMiwxNzksIDE2LDE3OSwgNTgsCi0gICAgIDk5LCAgMiwxNzksIDIyLDE3OSwgMzAsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDExMSwyNDUsMjQyLAotICAgIDI0MiwyMjksMjM4LDIyNywyNDksMjI4LDIyOSwyMzgsMjM5LDIzNywyMzMsMjM4LDIyNSwyNDQsMjM5LDI0MiwKLSAgICAyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDksMTEyLCAgMiwxNzksIDY0LDE3OSwgNzEsCi0gICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTMxLDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTEsMjMyLAotICAgIDIyNSwxMDUsMTI4LCAxNCwgODYsMTA4LCAgMiwxNzksIDkxLDE3OSwxMTEsMjI1LDI0MywxMDQsMTI5LCAgMCwKLSAgICAgNDcsMTc5LCA5OSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxNSwyMzksCi0gICAgMjM4LDEwMywxMjksICAxLDEyNywxNzksMTE5LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LAotICAgIDEyOCwgMzAsMTU1LDEwOSwgIDIsMTc5LDEzNywxNzksMTQ3LDIzMywyMzYsMjI5LDIzMCwyMjUsMjI3LDEwMSwKLSAgICAxMjgsIDM4LCA1OCwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDgzLDExMSwgIDYsCi0gICAgMTc5LDE3MiwxNzksMjIyLDE3OSwyMzMsMTgwLCAgMiwxODAsIDQ3LDE4MCwgNTgsMTAyLCAgMiwxNzksMTc4LAotICAgIDE3OSwxOTIsMjQwLDIyNSwyNDMsMjQ1LDI0MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE5NSwKLSAgICAxMTYsICAyLDE3OSwxOTgsMTc5LDIwNywyMzIsMjQ5LDI0MCwyMzIsMjI5LDExMCwxMjgsICAwLDE3MywyNDMsCi0gICAgMjMzLDIzMSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3NiwyMzIsMjMzLAotICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDkzLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwKLSAgICAgOTcsMTI5LCA0OCwxODksMTc5LDI0NiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsCi0gICAgMjU1LDEyNywyMzYsMjMzLDIyOCwyNDUsMTE1LCAgMiwxODAsIDEyLDE4MCwgMjksMjM2LDIzOSwyMzgsMjMxLAotICAgIDIzOSwyNDYsMjI5LDI0MiwyMzYsMjI1LDI0OSwyMjcsMjM3LCA5OCwxMjgsICAzLCA1NiwyNDMsMjMyLDIzOSwKLSAgICAyNDIsMjQ0LDIzOSwyNDYsMjI5LDI0MiwyMzYsMjI1LDI0OSwyMjcsMjM3LCA5OCwxMjgsICAzLCA1NSwyNDIsCi0gICAgMjQ1LDI0MywyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQxLDExNSwgIDMsMTgwLCA2NiwxODAsIDc2LAotICAgIDE4MCwgODQsMjI1LDIzNiwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQwLDIzOSwyNDQsMjMyLDIyNSwKLSAgICAxMDUsMTI4LCAxNCwgMTEsMjQ1LDIyNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDIsMjQwLCA5NywgIDMsCi0gICAgMTgwLDEwMiwxODAsMTIyLDE4MCwxNTQsMjI3LDEwMSwxMjksICAwLCAzMiwxODAsMTA5LDIzMiwyMjUsMjI3LAotICAgIDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICAwLCAzMiwyMjgsMTAxLDEyOSwgMzgsIDk2LDE4MCwKLSAgICAxMjksMjQzLDI0NSwyMzMsMTE2LCAgMiwxODAsMTM4LDE4MCwxNDYsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsCi0gICAgIDM4LCA5NiwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzgsMTAwLDI0MiwyMjksMTEwLDEyOCwgMzYsMTc0LAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsIDExLDE4MCwxODgsMTgwLDE5OSwxODAsMjEzLDE4MCwyMzgsMTgwLDI1NSwKLSAgICAxODEsIDI1LDE4MSwgNDAsMTgxLCA3MywxODEsMTAwLDE4MSwxNTYsMTgxLDE3MSwyMjYsMjI5LDIzNiwyMzksCi0gICAgMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU5LCA5OSwgIDIsMTgwLDIwNSwxODAsMjA5LCA5OSwxMjgsIDUxLAotICAgIDE5NiwxMDksMTI4LCA1MSwxNTcsMjI4LDIzMywyMjUsMjMxLDIzOSwyMzgsMjI1LDIzNiwyMjcsMjQyLDIzOSwKLSAgICAyNDMsMjQzLDIzMiwyMjUsMjQ0LDIyNywyMzIsMjMwLDIzMywyMzYsMTA4LDEyOCwgMzcsMTY5LDIzMiwyMzksCi0gICAgMjQyLDIzMywyNTAsMjM5LDIzOCwyNDQsMjI1LDIzNiwyMzAsMjMzLDIzNiwxMDgsMTI4LCAzNywxNjQsMTA3LAotICAgICAgMiwxODEsICA1LDE4MSwgIDksMTAzLDEyOCwgNTEsMTQzLDEwOSwxMjksIDUxLDE1OCwxODEsIDE1LDIyNywKLSAgICAyMjUsMjQwLDIzMywyNDQsMjI1LDEwOCwxMjgsIDUxLDIwNiwxMDgsICAyLDE4MSwgMzEsMTgxLCAzNSwxMTAsCi0gICAgMTI4LCA1MSwyMDksMjM5LDEwMywxMjgsIDUxLDIxMCwxMDksICA0LDE4MSwgNTAsMTgxLCA1NCwxODEsIDU5LAotICAgIDE4MSwgNjMsMTAzLDEyOCwgNTEsMTQyLDIzMywxMDgsMTI4LCA1MSwyMTMsMTA5LDEyOCwgNTEsMTU2LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMjI5LDEwMCwxMjgsIDUxLDE2MSwyMzksMjQyLDI0NCwyMzIsMjM5LDIzMSwyMzksCi0gICAgMjM4LDIyNSwyMzYsMjI3LDI0MiwyMzksMjQzLDI0MywyMzIsMjI1LDI0NCwyMjcsMjMyLDIzMCwyMzMsMjM2LAotICAgIDEwOCwxMjgsIDM3LDE2NiwyNDUsMjQwLDI0MCwyMjksMTE0LCAgMiwxODEsMTEwLDE4MSwxMzMsMjM2LDIyOSwKLSAgICAyMzAsMjQ0LDI0NCwyMzksMjM2LDIzOSwyNDcsMjI5LDI0MiwyNDIsMjMzLDIzMSwyMzIsMjQ0LDIzMCwyMzMsCi0gICAgMjM2LDEwOCwxMjgsIDM3LDE2NywyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzksMjM2LDIzOSwyNDcsMjI5LAotICAgIDI0MiwyMzYsMjI5LDIzMCwyNDQsMjMwLDIzMywyMzYsMTA4LDEyOCwgMzcsMTY4LDI0NiwyMjksMjQyLDI0NCwKLSAgICAyMzMsMjI3LDIyNSwyMzYsMjMwLDIzMywyMzYsMTA4LDEyOCwgMzcsMTY1LDI0NywyMzIsMjMzLDI0NCwyMjksCi0gICAgMjQ3LDIzMywyNDQsMjMyLDI0MywyMzcsMjI1LDIzNiwyMzYsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsIDM3LAotICAgIDE2MywyNDIsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMTksMTE1LCAgMiwxODEsMjA5LDE4MiwKLSAgICAxMjMsIDk3LCAgNCwxODEsMjE5LDE4MSwyMjksMTgxLDIzNiwxODEsMjQ3LDIyNiwyMjksMjM4LDIzMSwyMjUsCi0gICAgMjM2LDEwNSwxMjgsICA5LDE4MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNTUsMjMxLDI0NSwyMzQsMjI1LAotICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE4MywyMzgsMTAzLCAgOCwxODIsIDEwLDE4MiwgMjQsMTgyLCAzOCwKLSAgICAxODIsIDUyLDE4MiwgNjcsMTgyLCA4MSwxODIsIDk1LDE4MiwxMDgsMjI3LDIzMywyMjksMjQ1LDIyNywyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3MywyMzIsMjMzLDIyOSwyNDUsMjMyLDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksMTMzLDIzMywyMjksMjQ1LDIzOCwyMzEsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA0OSwxMjgsMjM1LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCi0gICAgMTI4LCA0OSwgNTAsMjM4LDIzMywyMjksMjQ1LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LAotICAgIDEwMSwyNDAsMjMzLDIyOSwyNDUsMjQwLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDY3LDI0MywKLSAgICAyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3MCwyNDQsMjMzLDIzNSwyMjksCi0gICAgMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA1NiwyNDUsMjQwLDIyOSwyNDIsMjMzLAotICAgIDIzOSwxMTQsMTI4LDI0NiwyNDIsMTE2LCAgMiwxODIsMTM5LDE4MiwxNjIsMjI5LDI0MiwyMzYsMjMzLDIzOCwKLSAgICAxMDMsMTI5LCAgMCwxNjMsMTgyLDE1MCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsCi0gICAgMjU1LDIyNSwyNDIsMjM5LDIzNSwxMDEsICAyLDE4MiwxNzEsMTgyLDE4OCwyMzYsMjM5LDIzOCwyMzEsMjM5LAotICAgIDI0NiwyMjksMjQyLDIzNiwyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU0LDI0MywyMzIsMjM5LDI0MiwKLSAgICAyNDQsMjM5LDI0NiwyMjksMjQyLDIzNiwyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDUzLDExNywgIDcsCi0gICAgMTgyLDIyMiwxODIsMjU0LDE4MywgMjAsMTgzLCAzMSwxODMsIDcyLDE4MywgODIsMTgzLCA4NiwyMjYsMjQzLAotICAgIDIyOSwxMTYsMTMwLCAzNCwxMzAsMTgyLDIzMywxODIsMjQ0LDIzOCwyMzksMjQ0LDIyOSwyNDEsMjQ1LDIyNSwKLSAgICAxMDgsMTI4LCAzNCwxMzgsMjM5LDI0MiwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTM0LCA5OSwgIDIsCi0gICAgMTgzLCAgNCwxODMsIDEyLDIyNywyMjksMjI5LDIyOCwxMTUsMTI4LCAzNCwxMjMsMjMyLDI0NCwyMzIsMjI1LAotICAgIDExNiwxMjgsIDM0LCAxMSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDg5LDEwNywKLSAgICAgIDIsMTgzLCAzNywxODMsIDYxLDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE4NSwxODMsCi0gICAgIDQ5LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTI1LDI0NSwyMzgsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgODIsMjM3LDIzNywyMjUsMjQ0LDIzMywyMzksMTEwLDEyOCwKLSAgICAgMzQsIDE3LDExMCwxMjgsIDM4LCA2MCwyNDAsMjI5LDI0MiwyNDMsMjI5LDExNiwxMzAsIDM0LDEzMSwxODMsCi0gICAgIDk5LDE4MywxMTAsMjM4LDIzOSwyNDQsMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LDEzOSwyMzksMjQyLAotICAgIDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwxMzUsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMjIwLDI0OSwyMzksMjQ1LDI0NywyMjUsMjI5LDI0MiwyMjUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCi0gICAgMTI4LCA1MSwxMjQsMTE2LDE0NCwgIDAsMTE2LDE4MywxODMsMTg0LDE5MiwxODQsMjEzLDE4NSwxMDAsMTg1LAotICAgIDE0MCwxODcsMTg4LDE5MSwgNzAsMTkyLDE0NSwxOTIsMTU3LDE5MiwxNjksMTkzLDIwMiwxOTMsMjI3LDE5NCwKLSAgICAgNTcsMTk0LDIzNywxOTUsMTY1LDE5NSwyNTUsIDk3LCAxMCwxODMsMjA1LDE4MywyMTUsMTgzLDIzNiwxODMsCi0gICAgMjQzLDE4NCwgMTIsMTg0LCA5MCwxODQsMTA3LDE4NCwxMzIsMTg0LDE0NiwxODQsMTUwLDIyNiwyMjksMjM4LAotICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2NCwyMjcsMTA3LCAgMiwxODMsMjIyLDE4MywyMjksMjI4LDIzOSwKLSAgICAyNDcsMTEwLDEyOCwgMzQsMTY0LDIzNiwyMjksMjMwLDExNiwxMjgsIDM0LDE2MywyMjgsMjI5LDI0NiwgOTcsCi0gICAgMTI4LCAgOSwgMzYsMjMxLDExNywgIDIsMTgzLDI1MCwxODQsICAzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LAotICAgIDEyOCwgMTAsMTY0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDM2LDEwNCwgIDQsMTg0LCAyMiwKLSAgICAxODQsIDMxLDE4NCwgNDUsMTg0LCA3NSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA1NSwyMzAsCi0gICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk0LDEwNSwgIDIsMTg0LAotICAgICA1MSwxODQsIDY2LDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTQsMTk1LDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDk1LDIzNywyMjksMjI4LDIzMywyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk2LDIzMywyNDMsMjQ5LDIzOSwyNDUsMjI5LAotICAgIDI0MiwyMjUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjUsMjM1LDIyNSwyNDQsMjI1LDIzNSwKLSAgICAyMjUsMjM4LCA5NywxMjksIDQ4LDE5MSwxODQsMTIwLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsCi0gICAgMTA0LDEyOCwyNTUsMTI4LDI0NCwyNDcsMjI5LDIyOSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgICAgNiwgNjQsMTE3LDEyOCwgIDMsMTk2LDExOCwxMzAsICA1LDIzNCwxODQsMTU4LDE4NCwxODMsMjI4LDIyNSwKLSAgICAyMzEsMjI5LDExNSwxMjksMjUxLCA3NCwxODQsMTY4LDEwNCwxMjksMjUxLCA3NCwxODQsMTc0LDIzMiwyMjksCi0gICAgMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDc0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjM0LAotICAgICA5OCwgIDIsMTg0LDE5OCwxODQsMjAzLDIyNSwxMTQsMTI4LCAgMSwxMDMsMjM5LDI0MCwyMzksMjM3LDIzOSwKLSAgICAyMzAsMTExLDEyOCwgNDksIDEwLCA5OSwgIDYsMTg0LDIyNywxODQsMjM0LDE4NCwyNDEsMTg0LDI1MCwxODUsCi0gICAgIDYwLDE4NSwgODcsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsMTAxLDIyNywyNDUsMjQyLDEwOCwxMjgsICAyLAotICAgIDE2OCwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA5OSwyMzIsMjI5LDEwNCwgIDQsMTg1LCAgNiwKLSAgICAxODUsIDE1LDE4NSwgMjksMTg1LCA0NSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEzNCwyMzAsCi0gICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTIzLDIzMywyMzgsMjMzLAotICAgIDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDEyNCwyMzcsMjI5LDIyOCwKLSAgICAyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDEyNSwyMzMsMjQyLCA5OSwgIDIsCi0gICAgMTg1LCA2OCwxODUsIDczLDIzNiwxMDEsMTI4LCAzNiwyMjcsMjQ1LDIzNywyMzAsMjM2LDIyOSwyNDgsMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExMywyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwKLSAgICAxMTYsMTI4LCAgMSwgOTksMTAwLCAgMiwxODUsMTA2LDE4NSwxMTYsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsCi0gICAgMTE1LDEyOCwgMzAsMTUxLDIzOSwxMTYsICAyLDE4NSwxMjMsMTg1LDEzMiwyMjUsMjI3LDIyNywyMjksMjM4LAotICAgIDExNiwxMjgsIDMwLDEwNywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTA5LDEwMSwgIDksMTg1LDE2MCwKLSAgICAxODUsMTcxLDE4NSwxOTEsMTg2LDIwMSwxODYsMjI2LDE4NywgMzQsMTg3LDEwMSwxODcsMTA2LDE4NywxNTgsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2NiwyMjgsMjI5LDI0MywyMjcsMjI5LAotICAgIDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTczLDEwNCwKLSAgICAgIDcsMTg1LDIwNywxODUsMjE2LDE4NSwyMzAsMTg2LCAxNCwxODYsIDQ0LDE4NiwgODUsMTg2LDE4MywyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0MiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwyNTQsMTUwLDIzMiwyMjUsMjMyLDEwNSwgIDIsMTg1LDIzOSwxODUsMjU0LDIzOCwKLSAgICAyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMTYyLDI0MywyMzksCi0gICAgMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCAxMiwxMDUsICAyLAotICAgIDE4NiwgMjAsMTg2LCAzNSwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsMjU0LDE1MSwyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEwMiwyMzQsMjI5LDIyOSwyMzcsCi0gICAgMTA1LCAgMiwxODYsIDU0LDE4NiwgNjksMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1MiwxNjEsMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTIsIDExLDEwOSwgIDIsMTg2LCA5MSwxODYsMTI1LDIyNSwyNDIsMjI2LDI0NSwyNDQsCi0gICAgIDk3LCAgMiwxODYsMTAyLDE4NiwxMTEsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDEsMjMwLAotICAgIDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE0OCwxMDEsICAyLDE4NiwKLSAgICAxMzEsMTg2LDE0NCwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNTIsCi0gICAgMjI5LDIzNywxMDUsICAyLDE4NiwxNTIsMTg2LDE2NywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDE2NCwyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwgMTQsMjM4LDIzOSwyMzksMjM4LDIzMCwyMzMsMjM4LDIyNSwyMzYsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwxMTUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAotICAgICA5NywxMjksIDQ4LDE5OCwxODYsMjE0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwKLSAgICAyNTUsMTMxLDEwOCwgIDIsMTg2LDIzMiwxODYsMjUxLDIyOSwyNDAsMjMyLDIzOSwyMzgsMTAxLDEyOSwgMzMsCi0gICAgIDMzLDE4NiwyNDMsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsIDM4LCAxNCwyMzMsMjQzLDIzMiwgOTcsICAyLAotICAgIDE4NywgIDQsMTg3LCAxOSwyMzEsMjI5LDIyOCwyMzksMjM2LDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE2MCwyNDEsMjI5LDI0NCwyMjUsMjM4LDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE2OSwxMTAsICA0LDE4NywgNDQsMTg3LCA1MywxODcsIDcyLDE4NywgOTMsMjI3LDIzMywyNDIsMjI3LAotICAgIDIzNiwxMDEsMTI4LCAzNiwxMDUsMjMzLDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywKLSAgICAyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDQxLDExMiwgIDIsMTg3LCA3OCwxODcsIDg1LDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDM2LDEyNSwyMjksMjQyLDIzMywyMzksMTAwLDEyOCwgMzYsMTQ1LDI0MiwyMzksMjM3LAotICAgIDIyNSwxMTAsMTI4LCAzMywxMjEsMjQzLDEwNCwxMjgsICAyLDE2NywxMTYsMTMxLCAgNSwyMTYsMTg3LDExNiwKLSAgICAxODcsMTM2LDE4NywxNDUsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTYsMTg3LDEyNywyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LAotICAgIDIxNiwyNDMsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODEsMjQ2LDIzMywKLSAgICAxMTQsICAyLDE4NywxNjYsMTg3LDE3NSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1NSwyMzYsCi0gICAgMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTUsMTA0LCAgNiwxODcsMjAyLAotICAgIDE4OCwgOTgsMTg4LDIyMCwxODksIDk2LDE5MCwgIDMsMTkxLCA2MCwgOTcsICA1LDE4NywyMTQsMTg3LDIyNCwKLSAgICAxODcsMjMxLDE4OCwgIDAsMTg4LCAyOSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNjUsCi0gICAgMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDM3LDIzMSwxMTcsICAyLDE4NywyMzgsMTg3LDI0NywyMzQsMjI1LAotICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE2NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzNywKLSAgICAxMDgsICAyLDE4OCwgIDYsMTg4LCAxNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0OCwyMzAsCi0gICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTcyLDIzOCwyNDQsMjMyLAotICAgIDIyNSwyMzUsMjMyLDIyNSwxMTYsICAzLDE4OCwgNDQsMTg4LCA3NSwxODgsIDgyLDIzNiwyMzksMTE5LCAgMiwKLSAgICAxODgsIDUyLDE4OCwgNjMsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE1MiwyNDIsCi0gICAgMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE1MSwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgNzYsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAyNDgsMTUwLDEwMSwgIDMsMTg4LDEwNiwxODgsMTcwLDE4OCwxOTMsMTA0LCAgNCwxODgsMTE2LDE4OCwxMjUsCi0gICAgMTg4LDEzOSwxODgsMTU1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQzLDIzMCwyMzMsMjM4LAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNTQsMjMzLDIzOCwyMzMsMjQ0LDIzMywKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTU1LDIzNywyMjksMjI4LDIzMywyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTU2LDI0MiwxMDEsICAyLDE4OCwxNzcsMTg4LAotICAgIDE4NiwyMjksMjQ4LDIzMywyNDMsMjQ0LDExNSwxMjgsIDM0LCAgMywyMzAsMjM5LDI0MiwxMDEsMTI4LCAzNCwKLSAgICAgNTIsMjQ0LCA5NywxMzAsICAzLDE4NCwxODgsMjAyLDE4OCwyMDYsIDQ5LDEyOCwgIDMsMjA5LDI0MywyNDksCi0gICAgMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMDksMTA1LCAgMiwxODgsMjI2LAotICAgIDE4OSwgNTYsMjI5LDI0NSwyNDQsMTA0LCAgNCwxODgsMjM5LDE4OSwgMTgsMTg5LCAzMywxODksIDQyLCA5NywKLSAgICAgIDIsMTg4LDI0NSwxODksICA0LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNTAsMTIxLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAotICAgICA1MCwgMjUsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwKLSAgICAxMDcsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzYsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxMSwyNDIsMjQ0LDIyOSwyMjksMTEwLCAgMiwxODksIDY2LAotICAgIDE4OSwgNzUsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMDgsMTEyLCAgMiwxODksIDgxLDE4OSwKLSAgICAgODgsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTI4LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNDgsCi0gICAgMTExLCAgNiwxODksMTEwLDE4OSwxMjcsMTg5LDEzMiwxODksMTQ2LDE4OSwxNTEsMTg5LDIwNCwyMzgsMjI1LAotICAgIDIzOCwyMzEsMjM3LDIzOSwyMzgsMjQ0LDIzMiwyMzksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE3LDIzOSwKLSAgICAxMDcsMTI4LCAgMSwxNzMsMjQwLDIzMiwyNDUsMjQ0LDIzMiwyMjUsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsCi0gICAgIDE0LCAxOCwyNDIsMTEwLDEyOCwgIDAsMjU0LDI0NCwxMDQsICAzLDE4OSwxNjAsMTg5LDE4NCwxODksMTk0LAotICAgICA5NywgIDIsMTg5LDE2NiwxODksMTc2LDIzMiwyMjUsMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyMywKLSAgICAyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE2LDIzOSwyMzgsMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsCi0gICAgIDE0LCAyNCwyNDUsMjM4LDIzMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMjIsMjQ1LDI0MywyMjUsMjM4LAotICAgIDEwMCwgIDIsMTg5LDIxNCwxODksMjI1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxMzAsMjQzLDI0MywyMjksMjQwLDIyNSwyNDIsMjI1LDI0NCwyMzksMTE0LCAgMiwxODksMjQwLDE4OSwyNDksCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDgsMjQwLDIyOSwyNDIsMjQzLDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDYsMTA4LDI0MiwyMjksMTAxLDE0NCwgIDAsIDUxLDE5MCwgNDEsMTkwLCA1MCwxOTAsIDYwLDE5MCwKLSAgICAgOTAsMTkwLCA5NywxOTAsMTA3LDE5MCwxMzIsMTkwLDE1OSwxOTAsMTkzLDE5MCwyMDUsMTkwLDIyNCwxOTAsCi0gICAgMjM1LDE5MSwgMTIsMTkxLCAzNCwxOTEsIDQyLDE5MSwgNTMsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgICAgNiwgOTksMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjMzLDIyNywyMzMsMjQyLDIyNywKLSAgICAyMzYsMTAxLDEyOSwgMzYsIDk4LDE5MCwgNzEsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsCi0gICAgMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAotICAgIDEwNSwyMjksMjMzLDIzMSwyMzIsMjQ0LDIzMiwxMTUsMTI4LCAzMywgOTIsMjMxLDExNywgIDIsMTkwLDExNCwKLSAgICAxOTAsMTIzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjMzLDI0MiwyMzcsMjQ1LDIzNSwyMzIsCi0gICAgMTA1LDEyOCwgMTAsMTA1LDIzMiwgOTcsICAyLDE5MCwxMzksMTkwLDE1MCwyMjcsMjM1LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk5LDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsIDM1LDEwNSwKLSAgICAgIDIsMTkwLDE2NSwxOTAsMTgzLDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsCi0gICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDM0LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLAotICAgIDEzMSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxOSwyMzgsMjQ1LDIzNywKLSAgICAyMjksMjQyLDIyNSwyNDQsMjM5LDI0MiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDYsCi0gICAgMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsMjQ3LCA1MSwxMTIsICAyLDE5MCwyNDEsMTkwLAotICAgIDI0OCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMTgsMjI5LDExNCwgIDIsMTkwLDI1NSwxOTEsICA1LDIzMywKLSAgICAyMzksMTAwLDEyOCwgMzYsMTM4LDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMjQ0LDIyOSwyNDIsMTE1LDEyOSwgIDAsMTkwLDE5MSwgMjUsMjI5LDIzNywyMjgsMjI1LDI0MywxMDQsMTI4LAotICAgIDI0NiwyMjIsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExNCwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywKLSAgICAyMzksMTE0LDEyOCwgIDAsMTc5LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA4MywyNTAsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDgsMTA1LCAgNywxOTEsIDg2LDE5MSwgOTcsMTkxLDIxMiwxOTIsIDU0LAotICAgIDE5MiwgNjYsMTkyLDExNSwxOTIsMTMyLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwKLSAgICAgOTcsMTA3LCAgMiwxOTEsMTAzLDE5MSwxMjcsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsCi0gICAgMTkzLDE5MSwxMTUsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjksMjI5LAotICAgIDI0NSwxMTYsICA0LDE5MSwxMzksMTkxLDE3NCwxOTEsMTg5LDE5MSwxOTgsIDk3LCAgMiwxOTEsMTQ1LDE5MSwKLSAgICAxNjAsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTIsCi0gICAgMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxNiwyMjcsMjMzLAotICAgIDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCA5OCwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LCA1NSwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNTAsICAyLDIzNiwyMjgsMTAxLDEzMywgIDIsMjIwLDE5MSwyMjgsMTkxLDIzOSwxOTIsICAwLAotICAgIDE5MiwgMTIsMTkyLCA0MCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQ4LCA5OSwKLSAgICAgIDIsMTkxLDI0NSwxOTEsMjUwLDIzNywgOTgsMTI4LCAgMywgIDMsMjM5LDIzNywgOTgsMTI4LCAgMywgIDMsCi0gICAgMjI4LDIzOSwyNDUsMjI2LDIzNiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgOTYsMTExLCAgMiwxOTIsIDE4LAotICAgIDE5MiwgMjgsMjQwLDIyOSwyNDIsMjI1LDI0NCwyMzksMTE0LDEyOCwgMzQsIDYwLDI0NiwyMjksMjQyLDIzNiwKLSAgICAyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDUyLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwyMzYsCi0gICAgMjI3LDIzNywgOTgsMTI4LCAgMywgNjIsMjM3LDIyOSwyNDMsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LAotICAgICAzNCwxNTEsMTEyLCAgMiwxOTIsIDcyLDE5MiwxMDIsMjI5LDIzMiwgOTcsICAyLDE5MiwgODAsMTkyLCA4OSwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1MCwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsCi0gICAgMjQyLDIyOSwxMTksMTI4LCAgNSwxNTAsMjQwLDIzMywyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LAotICAgIDEyOCwgMTAsMTEyLDI0NCwyMzYsMjM5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywyMjcsMjI3LDIzNywKLSAgICAgOTgsMTI4LCAgNCwxMzEsMjQ3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCi0gICAgMTI3LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTExLDIzNywyMzksMjM4LAotICAgIDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg0LDExMSwgIDcsMTkyLDE4NSwxOTIsMTk2LDE5MiwKLSAgICAyMDcsMTkyLDIzMiwxOTMsIDk2LDE5MywxMDgsMTkzLDE5MiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsCi0gICAgMTEwLDEyOCwgIDUsMTA1LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDQsMjM1LAotICAgIDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwMCwxOTIsMjIwLDIzMiwyMjUsMjM2LDIzMCwKLSAgICAyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTMyLDExMCwgIDMsMTkyLDI0MCwxOTMsIDgyLDE5MywgODcsCi0gICAgMTAxLCAgNCwxOTIsMjUwLDE5MywgNjMsMTkzLCA3MCwxOTMsIDc2LDIyNiwyMjUsMTE0LCAgNCwxOTMsICA2LAotICAgIDE5MywgMzUsMTkzLCA0NSwxOTMsIDU0LDIyOSwyNDgsMjQ0LDI0MiwgOTcsICAyLDE5MywgMTYsMTkzLCAyNiwKLSAgICAyMzIsMjMzLDIzMSwyMzIsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMjksMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsCi0gICAgMTI4LCAgMiwyMzMsMjMyLDIzMywyMzEsMjMyLDIzNywyMzksMTAwLDEyOCwgIDIsMjMwLDIzNiwyMzksMjQ3LAotICAgIDIzNywyMzksMTAwLDEyOCwgIDIsMjMyLDIzNywyMzMsMjI4LDIzNywyMzksMTAwLDEyOCwgIDIsMjMxLDIzMCwKLSAgICAyMzMsMjQ2LDEwMSwxMjgsICAxLDE4OSwyNDMsMjMzLDEyMCwxMjgsICAxLDEzMywyNDQsMjQ3LDExMSwxMjgsCi0gICAgICAxLDE2OCwyMzksMTE1LDEyOCwgIDMsMTMyLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM5LAotICAgIDI0MCwyMjUsMjQ0LDIyNSwyMzUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE1LDI0MiwyNDQsMjM5LDIzMywKLSAgICAyNDMsMjI5LDI0MywyMzIsMjI5LDIzNiwyMzYsMjI2LDI0MiwyMjUsMjI3LDIzNSwyMjksMTE2LCAgMiwxOTMsCi0gICAgMTMxLDE5MywxNjEsMjM2LDIyOSwyMzAsMTE2LDEzMCwgNDgsIDIwLDE5MywxNDIsMTkzLDE1MCwyNDMsMjM3LAotICAgIDIyNSwyMzYsMTA4LDEyOCwyNTQsIDkzLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwKLSAgICAgNTcsMjQyLDIzMywyMzEsMjMyLDExNiwxMzAsIDQ4LCAyMSwxOTMsMTczLDE5MywxODEsMjQzLDIzNywyMjUsCi0gICAgMjM2LDEwOCwxMjgsMjU0LCA5NCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDU4LAotICAgIDI0NCwyMjUsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyMSwyNDAsIDk3LCAgMiwxOTMsMjA5LDE5MywKLSAgICAyMjEsMjM2LDIyNSwyNDQsMjI1LDIzNiwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNzEsMjQyLDIyOSwxMTAsCi0gICAgMTI4LCAzNiwxNzUsMTE0LCAgMywxOTMsMjM1LDE5NCwgMTAsMTk0LCAyNSwyMjUsMjI4LDIyOSwyMzcsMjI1LAotICAgIDI0MiwxMDcsMTI5LCAzMywgMzQsMTkzLDI0NywxMTUsICAyLDE5MywyNTMsMTk0LCAgMywyMjUsMjM4LDExNSwKLSAgICAxMjgsMjQ4LDIzNCwyMjksMjQyLDIzMywxMDIsMTI4LDI0NiwyMTksMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsCi0gICAgMjI5LDI0OCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMzYsMjMzLDIyNSwxMDMsICA0LDE5NCwgMzcsMTk0LAotICAgICA0MiwxOTQsIDQ3LDE5NCwgNTIsMjI4LDExMCwxMjgsIDM3LDE4OCwyMzYsMTAyLDEyOCwgMzcsMTk2LDI0MiwKLSAgICAxMTYsMTI4LCAzNywxODYsMjQ1LDExMiwxMjgsIDM3LDE3OCwxMTUsMTMyLCAgMiwxNjYsMTk0LCA2OSwxOTQsCi0gICAgMTA4LDE5NCwyMTQsMTk0LDIyNywyMjUsMjI4LDEwNSwxMzAsICA1LDIzMCwxOTQsIDc5LDE5NCwgOTksMjI4LAotICAgIDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNzAsMTk0LCA5MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsMjUxLCA3MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIzMCwxMDEsICAyLDE5NCwxMTQsCi0gICAgMTk0LDEyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDcwLDI0MiwxMDEsMTM0LAotICAgICAgNSwxODEsMTk0LDE0MiwxOTQsMTU2LDE5NCwxNjEsMTk0LDE3MCwxOTQsMTg1LDE5NCwyMDEsIDQ5LCAgMiwKLSAgICAxOTQsMTQ4LDE5NCwxNTIsIDUwLDEyOCwgIDUsMTgxLDEwMSwxMjgsICA1LDE4MSwxNzgsIDk4LDEyOCwgIDUsCi0gICAgMTgxLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgxLDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgxLDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MSwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsCi0gICAgMjQyLDIyOSwxMTksMTI4LCAgNSwxODEsMjMyLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsIDkxLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDI0MywxMTYsICA0LDE5NCwKLSAgICAyNDcsMTk1LCA0MSwxOTUsMTA2LDE5NSwxNTcsIDk3LCAgMywxOTQsMjU1LDE5NSwgIDksMTk1LCAxNiwyMjYsCi0gICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTksMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDMxLAotICAgIDIzMSwxMTcsICAyLDE5NSwgMjMsMTk1LCAzMiwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1OSwKLSAgICAyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzMSwyMjksMTA0LCAgNCwxOTUsIDUyLDE5NSwgNjEsCi0gICAgMTk1LCA3NSwxOTUsIDkxLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTIxLDIzMCwyMzMsMjM4LAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMDMsMjMzLDIzOCwyMzMsMjQ0LDIzMywKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTA0LDIzNywyMjksMjI4LDIzMywyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTA1LDIzMiwgOTcsICAzLDE5NSwxMTUsMTk1LAotICAgIDEyNSwxOTUsMTMyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2MCwyMjgsMjI5LDI0NiwKLSAgICAgOTcsMTI4LCAgOSwgMzIsMjMxLDExNywgIDIsMTk1LDEzOSwxOTUsMTQ4LDIzNCwyMjUsMjQyLDIyNSwyNDQsCi0gICAgMTA1LDEyOCwgMTAsMTYwLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDMyLDI0NSwyNDIsMjM4LAotICAgIDIyOSwxMDAsMTI4LCAgMiwxMzUsMTE3LCAgMywxOTUsMTczLDE5NSwxODQsMTk1LDIwOSwyMzIsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTAwLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCi0gICAgMTI5LCA0OCwxOTYsMTk1LDE5NywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAotICAgIDEzMCwyNDMsMjM3LDIyNSwyMzYsMTA4LCAgMiwxOTUsMjE5LDE5NSwyMzAsMjMyLDIzMywyNDIsMjI1LDIzMSwKLSAgICAyMjUsMjM4LCA5NywxMjgsIDQ4LCA5OSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsCi0gICAgMTk1LDE5NSwyNDMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMTEsMTE5LAotICAgICAgMiwxOTYsICA1LDE5NiwxMTAsMTAxLCAgMiwxOTYsIDExLDE5NiwgNTksMjM2LDI0NiwxMDEsICAzLDE5NiwKLSAgICAgMjEsMTk2LCAzMCwxOTYsIDUxLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTA3LDExMiwgIDIsCi0gICAgMTk2LCAzNiwxOTYsIDQzLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEyNywyMjksMjQyLDIzMywyMzksMTAwLAotICAgIDEyOCwgMzYsMTQ3LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMjMsMjM4LDI0NCwxMjEsICAzLDE5NiwKLSAgICAgNjksMTk2LCA3OCwxOTYsIDg5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTE1LDIzMiwyMjUsCi0gICAgMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LCA4MywgNjgsMTEyLCAgMiwxOTYsIDk1LDE5NiwxMDIsMjI1LAotICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTM1LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTUsMTExLDE0MiwKLSAgICAgIDAsIDUwLDE5NiwxNDIsMTk2LDE1MSwxOTYsMTYxLDE5NiwxOTEsMTk2LDI0MywxOTcsIDEyLDE5NywgMzksCi0gICAgMTk3LCA3MywxOTcsIDg1LDE5NywxMDQsMTk3LDExNSwxOTcsMTQ4LDE5NywxNTYsMTk3LDE4MCwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5OCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKLSAgICAyMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI5LCAzNiwgOTcsMTk2LDE3MiwyMzMsMjM4LDI0NiwyMjksCi0gICAgMjQyLDI0MywyMjksMjQzLDIyNSwyMzgsMjQzLDI0MywyMjksMjQyLDIzMywxMDIsMTI4LCAzOSwxMzksMTAwLAotICAgICAgMiwxOTYsMTk3LDE5NiwyMDMsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMDQsMjM5LDExNiwgIDIsMTk2LDIxMCwKLSAgICAxOTYsMjIxLDIyOSwyMzgsMjM2LDIyOSwyMjUsMjI4LDIyOSwxMTQsMTI4LCAzMiwgMzcsMjM2LDIyOSwyMjUsCi0gICAgMjI4LDIyOSwxMTQsMTI5LCAzMiwgMzcsMTk2LDIzMiwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LAotICAgIDEyOCwyNTQsIDQ4LDIzMSwxMTcsICAyLDE5NiwyNTAsMTk3LCAgMywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDIzMiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwNCwyMzIsIDk3LCAgMiwxOTcsCi0gICAgIDE5LDE5NywgMzAsMjI3LDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5OCwyMzgsMjMxLAotICAgIDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LCAzNCwxMDUsICAyLDE5NywgNDUsMTk3LCA2MywyMjgsMjI5LDIzOSwKLSAgICAyMzEsMjQyLDIyNSwyNDAsMjMyLDIzMywyMjcsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCAzMywyMzgsCi0gICAgMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMzAsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAotICAgIDIyNywxMDEsMTI4LDI1NSwgMTgsMjM4LDI0NSwyMzcsMjI5LDI0MiwyMjUsMjQ0LDIzOSwyNDIsMjI2LDIyOSwKLSAgICAyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjQ1LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsCi0gICAgMTI4LDI0NywgNTAsMTEyLCAgMiwxOTcsMTIxLDE5NywxMjgsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTE3LAotICAgIDIyOSwxMTQsICAyLDE5NywxMzUsMTk3LDE0MSwyMzMsMjM5LDEwMCwxMjgsIDM2LDEzNywyNDMsMjMzLDIyNSwKLSAgICAxMTAsMTI4LCAgNiwyNDIsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExMywxMTUsICAyLDE5NywxNjIsCi0gICAgMTk3LDE3MCwyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMTg3LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LAotICAgIDExNCwxMjgsICAwLDE3OCwyNDQsMTA0LCAgMiwxOTcsMTg3LDE5NywxOTIsMjI1LDEwNSwxMjgsIDE0LCA4MiwKLSAgICAyMzMsMjQyLDIyOCwxMTUsMTI4LCAzMywgODQsMTE3LDE0NSwgIDAsMTE3LDE5NywyMzcsMTk3LDI0NSwxOTgsCi0gICAgIDMwLDE5OCwgODcsMTk4LDIyNSwxOTksICA2LDE5OSwxMjksMTk5LDE0NSwxOTksMTk2LDIwMCwgMTAsMjAwLAotICAgICA5MSwyMDAsMTAwLDIwMCwyMTksMjAwLDI0MywyMDEsIDk1LDIwMSwxMjMsMjAxLDIzNywyMjUsMjI3LDI0NSwKLSAgICAyNDQsMTAxLDEyOCwgIDAsMjUwLCA5OCwgIDQsMTk3LDI1NSwxOTgsICA0LDE5OCwgMTMsMTk4LCAyMywyMjUsCi0gICAgMTE0LDEyOCwgIDIsMTM3LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM3LDIzOSwyNDAsMjM5LAotICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCA0MCwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMSwxMDksIDk5LCAgMywKLSAgICAxOTgsIDM4LDE5OCwgNDUsMTk4LCA3NywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMTIsMjMzLDI0MiwgOTksCi0gICAgICAyLDE5OCwgNTMsMTk4LCA1OCwyMzYsMTAxLDEyOCwgMzYsMjI4LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLAotICAgIDEyOSwgIDAsMjUxLDE5OCwgNjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExOSwyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNjcsMTAwLCAgNSwxOTgsIDk5LDE5OCwxMTAsMTk4LDEzMywxOTgsCi0gICAgMTM5LDE5OCwyMTUsMjI1LDI0NCwyNDQsMjI1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA4MSwyMjYsMTA4LAotICAgICAgMiwxOTgsMTE3LDE5OCwxMjUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDExMywyMzEsMjQyLDIyNSwKLSAgICAyNDYsMTAxLDEyOCwgIDIsIDIxLDIyOSwyNDYsIDk3LDEyOCwgIDksICA5LDIzMywyMjksMjQyLDIyOSwyNDMsCi0gICAgMjMzLDExNSwxMzMsICAwLDI1MiwxOTgsMTU5LDE5OCwxNjcsMTk4LDE3NSwxOTgsMTk4LDE5OCwyMDYsMjI1LAotICAgIDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDIxNiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTE1LCA5OSwKLSAgICAgIDIsMTk4LDE4MSwxOTgsMTg4LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIxOCwyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwyNDEsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAxLDIyMCwyMzcsMjI1LAotICAgIDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIxNCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwKLSAgICAyMjksMTAzLCAgMiwxOTgsMjMxLDE5OCwyMzgsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDAsMjQ5LDExNywgIDIsCi0gICAgMTk4LDI0NCwxOTgsMjUzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTM3LDI0MiwyMzcsMjQ1LAotICAgIDIzNSwyMzIsMTA1LDEyOCwgMTAsICA5LDEwNCwgIDMsMTk5LCAxNCwxOTksIDI0LDE5OSwxMDIsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDcwLDExMSwgIDIsMTk5LCAzMCwxOTksIDQwLDIzOSwyMzUsCi0gICAgMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIzMSwyNDIsMTEwLDEzMywgIDEsMTc2LDE5OSwgNTUsMTk5LAotICAgICA2MywxOTksIDc0LDE5OSwgODIsMTk5LCA5NCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjMzLDIyOCwKLSAgICAyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyNDEsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsCi0gICAgIDMwLDIzNSwyMzIsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIzNywyNDQsMjMzLAotICAgIDIzNiwyMjgsMTAxLDEyOCwgMzAsMjM5LDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwKLSAgICAxMTYsMTI5LCAgMSwxMTMsMTk5LDExOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMjQzLDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLAotICAgICAyMywxMDcsICAzLDE5OSwxNTMsMTk5LDE3NywxOTksMTg4LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjksIDQ4LDE2NiwxOTksMTY1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCi0gICAgMTE1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjEsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LCA5MiwxMDksICAyLDE5OSwyMDIsMTk5LDI1NSwgOTcsICAyLDE5OSwyMDgsMTk5LDI0MSwKLSAgICAyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwxMDcsMTk5LDIxOSwxOTksMjMwLDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwyMzksMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsIDMwLAotICAgIDEyMywyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDY1LDIzOSwKLSAgICAyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODUsMTEwLCAgMiwyMDAsIDE2LDIwMCwgNzEsCi0gICAgMjI4LDIyOSwyNDIsMjQzLDIyNywyMzksMjQyLDEwMSwxMzIsICAwLCA5NSwyMDAsIDM1LDIwMCwgNDEsMjAwLAotICAgICA1MywyMDAsIDY0LDIyOCwyMjYsMTA4LDEyOCwgMzIsIDIzLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsIDYzLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTEsCi0gICAgMjQ3LDIyNSwyNDYsMTIxLDEyOCwyNTQsIDc5LDEwNSwgIDIsMjAwLCA3NywyMDAsIDgyLDIzOSwxMTAsMTI4LAotICAgICAzNCwgNDIsMjQ2LDIyOSwyNDIsMjQzLDIyNSwxMDgsMTI4LCAzNCwgIDAsMjM5LDIzMSwyMzksMjM4LDIyOSwKLSAgICAxMDcsMTI4LCAgMSwxMTUsMTEyLCAgNSwyMDAsMTEyLDIwMCwxMTksMjAwLDEyNywyMDAsMTQyLDIwMCwxOTMsCi0gICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTc2LDIyNiwyMzYsMjM5LDIyNywxMDcsMTI4LCAzNywxMjgsMjQwLAotICAgIDIyOSwyNDIsMjI4LDIzOSwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTYsMjQzLDIzMywKLSAgICAyMzYsMjM5LDExMCwxMzEsICAzLDE5NywyMDAsMTU2LDIwMCwxNzcsMjAwLDE4NSwyMjgsMjMzLDIyOSwyNDIsCi0gICAgMjI5LDI0MywyMzMsMTE1LDEyOSwgIDMsMjAzLDIwMCwxNjksMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLAotICAgIDE3NiwyMzYsMjI1LDI0NCwyMzMsMTEwLDEyOCwgIDIsMTM4LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywKLSAgICAyMDUsMjQ0LDIyNSwyMjcsMTA3LCAgMiwyMDAsMjAyLDIwMCwyMTMsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsCi0gICAgMjM3LCA5OCwxMjgsICAzLCAyOSwyMzcsMjM5LDEwMCwxMjgsICAyLDIxMiwxMTQsICAyLDIwMCwyMjUsMjAwLAotICAgIDIzNywyMjUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExNSwyMzMsMjM4LDEwMywKLSAgICAxMjgsICAxLDExMSwxMTUsICAzLDIwMCwyNTEsMjAxLCAxMCwyMDEsIDU1LDIzMiwyMzksMjQyLDI0NCwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDk0LDIzNywyMjUsMjM2LDEwOCwgIDIsMjAxLAotICAgICAxOSwyMDEsIDMwLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNjksMjM1LDIyNSwKLSAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE2NSwyMDEsIDQzLDIzMiwyMjUsMjM2LDIzMCwyNDcsCi0gICAgMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTA1LDI0NCwyNDIsMjI1LDIzMywyMzEsMjMyLDExNiwgIDIsMjAxLAotICAgICA2NywyMDEsIDc4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNzUsMjQzLDI0NCwKLSAgICAyNDIsMjM5LDIzNSwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3NywyNDQsCi0gICAgMjMzLDIzNiwyMjgsMTAxLDEzMCwgIDEsMTA1LDIwMSwxMDcsMjAxLDExNSwyMjUsMjI3LDI0NSwyNDQsMTAxLAotICAgIDEyOCwgMzAsMTIxLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMTcsMTE3LCAgNSwyMDEsMTM1LDIwMSwKLSAgICAxNDUsMjAxLDE1MiwyMDEsMTc3LDIwMSwxOTMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCi0gICAgMTM4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxMCwyMzEsMTE3LCAgMiwyMDEsMTU5LDIwMSwxNjgsMjM0LAotICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzgsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKLSAgICAgMTAsMjM3LDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCi0gICAgIDY2LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMywyMDEsMjA5LDIwMSwyMTksMjAxLAotICAgIDIyNiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxOTQsMjI4LDIyOSwyNDYsIDk3LDEyOCwKLSAgICAgIDksIDY2LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTQsMjQ2LDIzOSwyNDcsCi0gICAgMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLDIwMSwyNTMsMjAyLCAgNywyMDIsIDE0LDIyNiwyMjksMjM4LAotICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE5MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNjUsMjMxLDI0NSwKLSAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE5MywxMTgsMTM5LCAgMCwxMTgsMjAyLCA1MSwyMDIsCi0gICAgMTk5LDIwMiwyMDgsMjAyLDIxOSwyMDMsMTQ4LDIwMywxNTUsMjAzLDI1MywyMDQsICA5LDIwNCwxMDksMjA0LAotICAgIDExNywyMDQsMTM4LCA5NywgIDQsMjAyLCA2MSwyMDIsIDY4LDIwMiwgOTMsMjAyLDEwNCwyMjgsMjI5LDI0NiwKLSAgICAgOTcsMTI4LCAgOSwgNTMsMjMxLDExNywgIDIsMjAyLCA3NSwyMDIsIDg0LDIzNCwyMjUsMjQyLDIyNSwyNDQsCi0gICAgMTA1LDEyOCwgMTAsMTgxLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDUzLDIzNSwyMjUsMjQ0LAotICAgIDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyNDcsMTE4LDEzMiwgIDUsMjEzLDIwMiwxMTYsMjAyLDE0MywKLSAgICAyMDIsMTc1LDIwMiwxODcsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTMwLDI1MSwgNTMsMjAyLDEyOSwyMDIsCi0gICAgMTM0LDE4MiwgNTMsMTI4LDI1MSwgNTMsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNTMsMTA0LAotICAgICAgMiwyMDIsMTQ5LDIwMiwxNTcsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxMywyMzksMjM2LDIyNSwKLSAgICAxMDksMTI5LDI1MSwgNzUsMjAyLDE2NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3NSwyNDYsCi0gICAgMjI1LDI0NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDI0MCwyNDksMjM5LDIyOCwyMzIsMjI5LAotICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDI0MSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDIyOSwKLSAgICAyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTI3LDEwMSwgIDYsMjAyLDIzMywyMDIsCi0gICAgMjQ0LDIwMywgNTIsMjAzLCA2MywyMDMsIDY5LDIwMywxMzYsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCA1MCwxMDQsICA0LDIwMiwyNTQsMjAzLCAgNywyMDMsIDIxLDIwMywgMzcsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxNjQsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjUxLDEwNywyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1MSwxMDgsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1MSwxMDksMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0OSwyMzgsCi0gICAgMjQ1LDExNSwxMjgsIDM4LCA2NCwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwgIDIsMjAzLCA4MCwyMDMsIDg2LAotICAgIDIyNiwyMjUsMTE0LDEyOCwgIDAsMTI0LDIzNiwyMzMsMjM4LDEwMSwgIDQsMjAzLCA5OSwyMDMsMTEwLDIwMywKLSAgICAxMjEsMjAzLDEzMCwyMjUsMjI2LDIzOSwyNDYsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDEzLDIyNiwyMjksCi0gICAgMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDEsMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsMTI4LAotICAgICAgMiwyMDQsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMDAsMjQ3LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKLSAgICAxMTAsMTI4LCAgNSwxMjYsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsMTM5LDEwNSwgIDMsMjAzLDE2MywyMDMsCi0gICAgMTc0LDIwMywyMTMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0OCwyNDIsMjI1LAotICAgIDIzNywgOTcsICAzLDIwMywxODUsMjAzLDE5NSwyMDMsMjAyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKLSAgICAxMjgsICA5LDIwNSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzcsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsCi0gICAgMjQ0LDEwNSwxMjgsIDEwLDIwNSwyNDMsMjI1LDI0MiwyMzEsIDk3LCAgMywyMDMsMjI1LDIwMywyMzUsMjAzLAotICAgIDI0MiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxMzEsMjI4LDIyOSwyNDYsIDk3LDEyOCwKLSAgICAgIDksICAzLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzEsMjM3LDIzOSwyMzgsCi0gICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODYsMTExLCAgMywyMDQsIDE3LDIwNCwgMjgsMjA0LAotICAgICA5OCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTIwLDIzMywyMjcsMjI5LDEwMCwKLSAgICAgIDIsMjA0LCAzNywyMDQsIDczLDIzMywyNDQsMjI5LDI0MiwyMjUsMjQ0LDIzMywyMzksMTEwLCAgMiwyMDQsCi0gICAgIDUxLDIwNCwgNjIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE1OCwyMzUsMjI1LAotICAgIDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjU0LDIzNywyMjUsMjQyLDIzNSwyMzUsMjI1LDIzOCwKLSAgICAgOTcsMTI5LCA0OCwxNTUsMjA0LCA4NiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsCi0gICAgMjU1LDE1OCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjUwLDI0MCwyMjUsMjQyLAotICAgIDIyOSwxMTAsMTI4LCAzNiwxNzcsMTE2LCAgMiwyMDQsMTIzLDIwNCwxMzAsMjMzLDIzNiwyMjgsMTAxLDEyOCwKLSAgICAgMzAsMTI1LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxNDAsMTE3LCAgMiwyMDQsMTQ0LDIwNCwxNTUsCi0gICAgMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE0OCwyMzUsMjI1LDI0NCwyMjUsMjM1LAotICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsMjQ0LDExOSwxNDMsICAwLDExOSwyMDQsMjAwLDIwNSwxNzcsMjA1LDE4NywKLSAgICAyMDUsMjEwLDIwNSwyNTAsMjA2LCA2MSwyMDYsIDY5LDIwOCwgNDAsMjA4LCA4MSwyMDgsIDkzLDIwOCwxNjgsCi0gICAgMjA4LDE3NiwyMDgsMTgzLDIwOCwxOTQsMjA4LDIwMywgOTcsICA4LDIwNCwyMTgsMjA0LDIyNSwyMDQsMjM1LAotICAgIDIwNCwyNDYsMjA1LCAyOCwyMDUsIDYwLDIwNSwgNzIsMjA1LDEwOCwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwKLSAgICAxMzEsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDg5LDIzMiwyMzMsMjQyLDIyNSwyMzEsCi0gICAgMjI1LDIzOCwgOTcsMTI4LCA0OCwxNDMsMTA3LCAgMiwyMDQsMjUyLDIwNSwgMjAsMjI1LDI0NCwyMjUsMjM1LAotICAgIDIyNSwyMzgsIDk3LDEyOSwgNDgsMjM5LDIwNSwgIDgsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwKLSAgICAxMDQsMTI4LDI1NSwxNTYsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA4OCwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LCAgMiwyMDUsIDM4LDIwNSwgNDksMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LAotICAgIDE0MiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjM4LDI0NCwyNDQsMjM5LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDg3LDExOCwgIDIsMjA1LCA3OCwyMDUsIDg2LDIyOSwyMjgsCi0gICAgMjI1LDI0MywxMDQsMTI4LCA0OCwgMjgsMjQ5LDI0NSwyMzgsMjI4LDIyOSwyNDIsMjQzLDIyNywyMzksMjQyLAotICAgIDIyOSwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDUyLDExOSwgIDMsMjA1LDExNiwKLSAgICAyMDUsMTI1LDIwNSwxMzksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzIsMjMwLDIzMywyMzgsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzOCwyMzIsMjI1LDIzNywyNTAsMjI1LAotICAgIDIyNSwyMjYsMjM5LDI0NiwxMDEsICAyLDIwNSwxNTQsMjA1LDE2MywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsICA2LCAzNiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCi0gICAgMTM0LDIyNiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIyMSwyMjcsMjMzLDI0MiwgOTksICAyLAotICAgIDIwNSwxOTYsMjA1LDIwMSwyMzYsMTAxLDEyOCwgMzYsMjMwLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwKLSAgICAgIDEsMTE3LDEwMCwgIDIsMjA1LDIxNiwyMDUsMjI2LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsCi0gICAgIDMwLDEzMywyMzksMTE2LCAgMiwyMDUsMjMzLDIwNSwyNDIsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAotICAgICAzMCwxMzUsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDEzNywxMDEsICA0LDIwNiwgIDQsMjA2LCAxNSwKLSAgICAyMDYsIDI3LDIwNiwgNTEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE0NSwyMzMsCi0gICAgMjI5LDI0MiwyNDMsMjQ0LDI0MiwyMjUsMjQzLDExNSwxMjgsIDMzLCAyNCwxMDcsICAyLDIwNiwgMzMsMjA2LAotICAgICA0MywyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyNDEsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDQ5LCA5NCwyMzksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTMsMjMxLDI0MiwyMjUsCi0gICAgMjQ2LDEwMSwxMjgsIDMwLDEyOSwyMzIsMjMzLDI0NCwxMDEsICA4LDIwNiwgOTAsMjA2LCA5OSwyMDYsMTgzLAotICAgIDIwNywgMTcsMjA3LDEwMSwyMDcsMTQ2LDIwNywxOTgsMjA3LDI1NCwyMjYsMjQ1LDIzNiwyMzYsMjI5LDExNiwKLSAgICAxMjgsIDM3LDIzMCwgOTksICAyLDIwNiwxMDUsMjA2LDEyNSwyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzcsCi0gICAgMjAzLDIwNiwxMTUsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMTAxLDEyOCwgMzcsMjE3LDIzOSwyNDIsMjM4LAotICAgIDIyOSwyNDIsMjI2LDI0MiwyMjUsMjI3LDIzNSwyMjksMTE2LCAgMiwyMDYsMTQyLDIwNiwxNjIsMjM2LDIyOSwKLSAgICAyMzAsMTE2LDEyOSwgNDgsIDE0LDIwNiwxNTEsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsCi0gICAgMjU0LCA2NywyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOSwgNDgsIDE1LDIwNiwxNzIsMjQ2LDIyOSwyNDIsMjQ0LAotICAgIDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA2OCwxMDAsICAyLDIwNiwxODksMjA2LDIzMCwyMzMsMjI1LDIzNywKLSAgICAyMzksMjM4LDEwMCwxMjksIDM3LDE5OSwyMDYsMjAwLDIyNywyMzksMjM4LDI0NCwyMjUsMjMzLDIzOCwyMzMsCi0gICAgMjM4LDIzMSwyMjYsMjM2LDIyNSwyMjcsMjM1LDI0MywyMzcsMjI1LDIzNiwyMzYsMjI4LDIzMywyMjUsMjM3LAotICAgIDIzOSwyMzgsMTAwLDEyOCwgMzcsMjAwLDIzOSwyNDcsMjM4LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwKLSAgICAxMDMsICAyLDIwNiwyNDYsMjA3LCAgNiwyNDMsMjM3LDIyNSwyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwyMzgsCi0gICAgMjMxLDIzNiwxMDEsMTI4LCAzNywxOTEsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LAotICAgIDE4OSwyMzYsMTAxLCAgMiwyMDcsIDI0LDIwNywgNjYsMjMwLDI0NCwyNDAsMjM5LDIzMywyMzgsMjQ0LDIzMywKLSAgICAyMzgsMTAzLCAgMiwyMDcsIDM5LDIwNywgNTUsMjQzLDIzNywyMjUsMjM2LDIzNiwyNDQsMjQyLDIzMywyMjUsCi0gICAgMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMTk1LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LAotICAgICAzNywxOTMsMjM4LDI0NCwyMzMsMjI3LDI0NSwyMzYsMjI1LDI0MiwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwKLSAgICAxMTYsICAyLDIwNywgODYsMjA3LCA5MywyMzYsMjI5LDIzMCwxMTYsMTI4LCA0OCwgMjIsMjQyLDIzMywyMzEsCi0gICAgMjMyLDExNiwxMjgsIDQ4LCAyMywyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLAotICAgIDIzOCwxMDMsICAyLDIwNywxMTksMjA3LDEzNSwyNDMsMjM3LDIyNSwyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwKLSAgICAyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxODUsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsCi0gICAgIDM3LDE4MywxMTUsICAzLDIwNywxNTQsMjA3LDE4NCwyMDcsMTkyLDEwOSwgIDIsMjA3LDE2MCwyMDcsMTcyLAotICAgIDIyNSwyMzYsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgMzcsMTcxLDIzMywyMzYsMjMzLDIzOCwKLSAgICAyMzEsMjMwLDIyNSwyMjcsMTAxLDEyOCwgMzgsIDU4LDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCAzNywxNjEsCi0gICAgMjQ0LDIyNSwxMTQsMTI4LCAzOCwgIDYsMTE2LCAgMiwyMDcsMjA0LDIwNywyMTUsMjI5LDIzNiwyMjksMjQwLAotICAgIDIzMiwyMzksMjM4LDEwMSwxMjgsIDM4LCAxNSwyMzksMjQyLDI0NCwyMzksMjMzLDI0MywyMjksMjQzLDIzMiwKLSAgICAyMjksMjM2LDIzNiwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwxMTYsICAyLDIwNywyMzksMjA3LDI0NiwyMzYsCi0gICAgMjI5LDIzMCwxMTYsMTI4LCA0OCwgMjQsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDQ4LCAyNSwyNDUsMjQwLAotICAgIDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwxMDMsICAyLDIwOCwgMTMsMjA4LCAyOSwyNDMsMjM3LDIyNSwKLSAgICAyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxODEsMjQ0LDI0MiwyMzMsCi0gICAgMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE3OSwxMDUsICAyLDIwOCwgNDYsMjA4LCA1NywyMzIsMjMzLAotICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTQ0LDEwNywgIDIsMjA4LCA2MywyMDgsIDczLDIyNSwKLSAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0MCwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCi0gICAgIDk1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg3LDExMSwgIDQsMjA4LAotICAgIDEwMywyMDgsMTE0LDIwOCwxMzksMjA4LDE1NywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsMTQ2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyNDIsMjA4LDEyNywyMzIsCi0gICAgMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwMiwxMTAsMTI5LCAzMiwxNjksMjA4LAotICAgIDE0NSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LDIzMCwyNDcsMjI1LDIyOSwKLSAgICAyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDM5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzgsCi0gICAgMjQyLDIzMywyMzgsMTAzLDEyOCwgMzAsMTUyLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAotICAgICAgMiwxODMsMjQ0LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxNDEsMjQ5LDIzOCwxMTAsMTI4LCAgMSwKLSAgICAxOTEsMTIwLDEzNywgIDAsMTIwLDIwOCwyMzEsMjA4LDI0MiwyMDgsMjUzLDIwOSwgIDYsMjA5LCAzMywyMDksCi0gICAgIDQ2LDIwOSwgNTAsMjA5LCA2MiwyMDksIDcwLDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsMTI4LAotICAgICAgMywgNjEsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxOCwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDEwMSwxMjgsIDM2LDIzMSwxMDAsICAyLDIwOSwgMTIsMjA5LCAyMiwyMzMsMjI5LDI0MiwyMjksCi0gICAgMjQzLDIzMywxMTUsMTI4LCAzMCwxNDEsMjM5LDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLAotICAgIDEzOSwyMjksMjMyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDksMTA1LDEyOCwKLSAgICAgIDMsMTkwLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg4LDI0MCwyMjUsCi0gICAgMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzksMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLAotICAgIDIyNywxMjEsMTQzLCAgMCwxMjEsMjA5LDExNSwyMTAsIDc0LDIxMCwgOTcsMjEwLDEzNywyMTIsMTAzLDIxMiwKLSAgICAxMTEsMjEyLDEyOCwyMTIsMTkyLDIxMiwyMDQsMjEzLDIwMSwyMTMsMjQxLDIxMywyNTMsMjE0LCAgOCwyMTQsCi0gICAgIDI5LDIxNSwgIDIsIDk3LCAxMSwyMDksMTM5LDIwOSwxNTEsMjA5LDE2MSwyMDksMTY4LDIwOSwxNzUsMjA5LAotICAgIDE4NSwyMDksMjEwLDIwOSwyMjEsMjEwLCAgMywyMTAsIDE2LDIxMCwgNjIsMjI1LDIyOCwyMzksMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzgsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCi0gICAgMTc1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAwLDI1MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDcsMjI5LAotICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDgyLDIzMSwxMTcsICAyLDIwOSwxOTIsMjA5LDIwMSwKLSAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE3NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsCi0gICAgIDEwLCA0NywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTMyLDEwNywgIDIsMjA5LAotICAgIDIyNywyMDksMjUxLDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyOCwyMDksMjM5LDIzMiwKLSAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQ4LDIzOSwyNDIsMjI5LDIyNSwxMTAsCi0gICAgMTI4LCA0OSwgODEsMjM3LDIyNSwyMzUsMjM1LDIyNSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDc4LAotICAgIDI0MywyMzcsMjI1LDIzNiwxMDgsICAyLDIxMCwgMjYsMjEwLCAzNywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwKLSAgICAyMzgsIDk3LDEyOCwgNDgsMTMxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjcsCi0gICAgMjEwLCA1MCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwOCwyNDQsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA5OSwyMjcsMjMzLDI0MiwgOTksICAyLDIxMCwKLSAgICAgODMsMjEwLCA4OCwyMzYsMTAxLDEyOCwgMzYsMjMyLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsCi0gICAgMTE5LDEwMCwgIDIsMjEwLDEwMywyMTAsMTEzLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsICAwLAotICAgIDI1NSwyMzksMTE2LCAgMiwyMTAsMTIwLDIxMCwxMjksMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwKLSAgICAxNDMsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDI0NSwxMDEsICA3LDIxMCwxNTMsMjExLDE2MSwyMTEsCi0gICAgMTcwLDIxMSwxODgsMjExLDIyMCwyMTIsIDQwLDIxMiwgOTEsMTA0LCAgOCwyMTAsMTcxLDIxMCwxODAsMjEwLAotICAgIDIxNCwyMTAsMjI4LDIxMSwgNDUsMjExLCA2MSwyMTEsMTIwLDIxMSwxMzgsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LCAgNiwgNzQsMjI2LDIyNSwyNDIsMjQyLDIyOSwxMDEsICAyLDIxMCwxOTEsMjEwLDIwMCwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDIxMCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwyNTEsMTc1LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1NCwyNDIsMjMyLDIyNSwyMzcsMjUwLDIyNSwyMjUsMjI2LDIzOSwyNDYsMTAxLCAgNCwyMTAsCi0gICAgMjQ3LDIxMSwgIDAsMjExLCAxNCwyMTEsIDMwLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDM4LAotICAgIDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxMzgsMjMzLDIzOCwKLSAgICAyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTM5LDIzNywyMjksCi0gICAgMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQwLDIzMywyMzgsMjMzLAotICAgIDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0MywyMzcsMTAxLCAgMiwKLSAgICAyMTEsIDY4LDIxMSwgODEsMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCi0gICAgMjQ0LDIyOSwyMzcsMTA1LCAgMiwyMTEsIDg5LDIxMSwxMDQsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwyMjEsMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDg4LDIzOCwyMzksMjM5LDIzOCwyMzAsMjMzLDIzOCwyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMTQ4LDI0NCwyMzIsMjQyLDIyOSwyMjksMjI4LAotICAgIDIzOSwyNDQsMjQzLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKLSAgICAyMDksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODYsMTEwLDEyOSwgIDAsMTY1LDIxMSwxNzYsCi0gICAgMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwyMjksMTExLCAgMiwyMTEsMTk0LAotICAgIDIxMSwyMDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODUsMjQyLDIzMywyMzgsMjMyLDIzMywKLSAgICAyMjksMjQ1LDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzNCwxMTQsICAzLDIxMSwyMjgsCi0gICAgMjEyLCAgOCwyMTIsIDIwLDIyNSwyMzIsMjI2LDIyOSwyMzgsMjQ5LDIzOSwyMzcsMTExLCAgMiwyMTEsMjQyLAotICAgIDIxMSwyNTEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzAsMjM2LDIyOSwyMzAsMjQ0LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTcwLDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsIDc1LDI0NSwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyNDksMjQzLDIzMywyMjksMjQ1LDIzOCwxMDMsICAzLDIxMiwKLSAgICAgNTMsMjEyLCA2MiwyMTIsIDc4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTI5LDI0MCwyMjUsCi0gICAgMjM4LDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzMSwyNDMsMjMzLAotICAgIDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMzAsMjQ0LDIzMywyNDYsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTQsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDI0MywyMzIsCi0gICAgMjM5LDIzOSwxMDcsMTI5LCAgMSwxODAsMjEyLDEyMCwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjQ3LAotICAgIDEwNSwgIDUsMjEyLDE0MCwyMTIsMTUxLDIxMiwxNjIsMjEyLDE3MSwyMTIsMTc5LDIyNSwyNDIsMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTcsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LCA4NywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5OCwyMzgsMjQ5LDIyNSwyMzgsMTAzLAotICAgIDEyOCwgMzgsIDQ3LDI0NywyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzMCwKLSAgICAyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA4OSwxMTEsICA3LDIxMiwyMjAsCi0gICAgMjEzLCAzNCwyMTMsIDQ1LDIxMywgNTUsMjEzLCA5MywyMTMsMTM5LDIxMywxNDgsMTAwLDEzMSwgIDUsMjE3LAotICAgIDIxMiwyMzAsMjEyLDI1MCwyMTMsICAzLDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDU3LDIxMiwKLSAgICAyNDEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNTcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LCAgNSwyMTcsMjQ5LDIzOSwxMDAsICAyLDIxMywgMTEsMjEzLCAyMCwyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsICA1LDI0MiwyNDAsMjI1LDI0NCwyMjUsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAyNTEsIDMxLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMzYsMjMzLDIzNSwyMzksCi0gICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTM3LDEwNywgIDIsMjEzLCA2MSwyMTMsIDg1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzMiwyMTMsIDczLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKLSAgICAyNDQsMTA0LDEyOCwyNTUsMTUwLDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTEsMjQzLDIzNywyMjUsCi0gICAgMjM2LDEwOCwgIDIsMjEzLDEwMywyMTMsMTE0LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwxMzUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzMSwyMTMsMTI3LDIzMiwKLSAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTEwLDI0NCwyMzEsMjQyLDIyOSwyMjksCi0gICAgMTA3LDEyOCwgIDMsMjQzLDEyMSwgIDIsMjEzLDE1NCwyMTMsMTkxLCA5NywgIDIsMjEzLDE2MCwyMTMsMTcwLAotICAgIDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzNiwxMDcsICAyLDIxMywxNzYsMjEzLDE4NCwKLSAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTM1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzNCwyMzMsCi0gICAgMjM4LDIzMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMTMsMTEyLCAgMiwyMTMsMjA3LDIxMywyMTQsMjI1LAotICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTgwLDIzOSwyMzEsMjI5LDIzMSwyNDIsMjI1LDIzNywyMzcsMjI5LDIzOCwKLSAgICAxMDUsMTI5LCAgMywxMjIsMjEzLDIzMCwyMzEsMjQyLDIyOSwyMjksMjM1LDIyNywyMzcsIDk4LDEyOCwgIDMsCi0gICAgIDY5LDExNCwxMjksICAxLDE2NiwyMTMsMjQ3LDIzMywyMzgsMTAzLDEyOCwgMzAsMTUzLDI0MywyNDUsMjQwLAotICAgIDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxODQsMTE2LCAgMiwyMTQsIDE0LDIxNCwgMjEsMjMzLDIzNiwKLSAgICAyMjgsMTAxLDEyOCwgMzAsMjQ5LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxNDIsMTE3LCAgNSwyMTQsCi0gICAgIDQxLDIxNCwgNTIsMjE0LCA2MiwyMTQsMTAwLDIxNCwyMzIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LAotICAgICA5NywxMjgsIDQ4LDEzNCwyMzMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxNDAsMTA3LCAgMiwKLSAgICAyMTQsIDY4LDIxNCwgOTIsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjMwLDIxNCwgODAsCi0gICAgMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDksMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LCA5NiwxMTUsICAzLDIxNCwxMDgsMjE0LDE0NiwyMTQsMTg3LDIyNiwyMzMsMTAzLCAgMiwKLSAgICAyMTQsMTE2LDIxNCwxMjcsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNywyMzMsCi0gICAgMjM5LDI0NCwyMzMsMjMwLDIzMywyMjksMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwxMDksMjM2LDIzMywyNDQsMjQ0LDIzNiwxMDEsICAyLDIxNCwxNTcsMjE0LDE2OCwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTAzLDIzMywyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNSwyMzcsMjI1LDIzNiwxMDgsICAyLAotICAgIDIxNCwxOTYsMjE0LDIwNywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTMzLDIzNSwKLSAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjksMjE0LDIyMCwyMzIsMjI1LDIzNiwyMzAsCi0gICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwOSwyNDksMTAxLCAgMiwyMTQsMjM5LDIxNCwyNDgsMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMzksMjM5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNDksMTM4LDI0OSwgOTcsICAyLDIxNSwgIDksMjE1LCAxOSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCi0gICAgMTI4LCAgOSwyMjMsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDk1LDEyMiwxNDIsICAwLDEyMiwyMTUsIDU4LAotICAgIDIxNiwgNjYsMjE2LCA3NywyMTYsMTIwLDIxNiwxNDcsMjE3LDE4MiwyMTgsIDM0LDIxOCwgNzYsMjE4LCA4OCwKLSAgICAyMTgsMTAwLDIxOCwxMjgsMjE4LDEzNiwyMTgsMTUyLDIxOCwxNjEsIDk3LCAxMCwyMTUsIDgwLDIxNSwgOTEsCi0gICAgMjE1LCA5OCwyMTUsMTA1LDIxNSwxMTYsMjE1LDE5NCwyMTUsMjI0LDIxNSwyMzUsMjE2LCAxNSwyMTYsIDI3LAotICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDIsMjI3LDI0NSwyNDQsMTAxLDEyOCwKLSAgICAgIDEsMTIyLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA5MSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsCi0gICAgMTA1LDEyOCwgMTAsIDkxLDEwNCwgIDQsMjE1LDEyNiwyMTUsMTM1LDIxNSwxNDksMjE1LDE3OSwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA1NiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTQsMTk4LDEwNSwgIDIsMjE1LDE1NSwyMTUsMTcwLDIzOCwyMzMsMjQ0LDIzMywyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk5LDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsIDg2LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTQsMjAwLDIzMywxMTAsICAyLDIxNSwyMDEsMjE1LDIxMCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCA1MCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTc2LAotICAgIDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxODIsMjQxLDIyOSwxMDIsICAyLDIxNSwKLSAgICAyNDMsMjE2LCAgMSwyMzEsMjI1LDIyOCwyMzksMjM2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsCi0gICAgMTQ5LDI0MSwyMjUsMjQ0LDIyNSwyMzgsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDgsMjQyLAotICAgIDI0MSwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTIsMjQ5LDIzMywxMTAsMTMwLCAgNSwKLSAgICAyMTQsMjE2LCAzNywyMTYsIDU3LDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDU0LDIxNiwgNDgsCi0gICAgMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNTQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwyMTQsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyMywgOTksICAzLDIxNiwKLSAgICAgODUsMjE2LCA5MiwyMTYsMTE0LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDEyNiwyMzMsMjQyLCA5OSwgIDIsCi0gICAgMjE2LDEwMCwyMTYsMTA1LDIzNiwxMDEsMTI4LCAzNiwyMzMsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LAotICAgICAzMCwxNDUsMjQ1LDI0MiwxMDgsMTI4LCAgMiwxNDUsMjI4LDIzOSwxMTYsMTMwLCAgMSwxMjQsMjE2LDEzMCwKLSAgICAyMTYsMTM5LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsMTI0LDIyNiwyMjksMjM2LDIzOSwxMTksCi0gICAgMTI4LCAzMCwxNDcsMTAxLCAgNiwyMTYsMTYxLDIxNiwxNzIsMjE2LDIxNSwyMTYsMjI2LDIxNiwyMzcsMjE3LAotICAgIDE3NywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU1LDEwMCwgIDIsMjE2LDE3OCwKLSAgICAyMTYsMTk3LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDE1MywyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIyMywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsIDkyLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxODgsMjQyLDExMSwxNDAsCi0gICAgICAwLCA0OCwyMTcsIDEwLDIxNywgMTksMjE3LCAyOSwyMTcsIDM2LDIxNywgNjEsMjE3LCA3NCwyMTcsIDg1LAotICAgIDIxNywgOTcsMjE3LDEwOCwyMTcsMTE4LDIxNywxMjksMjE3LDEzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsICA2LCA5NiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzAsMjI4LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksMTAyLDIzMSwxMTcsICAyLDIxNywgNDMsMjE3LCA1MiwyMzQsMjI1LDI0MiwyMjUsMjQ0LAotICAgIDEwNSwxMjgsIDEwLDIzMCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwMiwyMzIsMjI1LDIyNywKLSAgICAyMzUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgOTYsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsCi0gICAgMjM5LDExNCwxMjgsIDMyLDEyOCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LAotICAgICAxNiwyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDQ4LDI0MCwyMjksMjQyLDI0MywKLSAgICAyMzMsMjI1LDExMCwxMjgsICA2LDI0MCwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsCi0gICAgMTEyLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA4MCwyNDcsMjMzLDIyOCwyNDQsMTA0LCAgMywyMTcsMTQ4LAotICAgIDIxNywxNTcsMjE3LDE2OSwyMzQsMjM5LDIzMywyMzgsMjI5LDExNCwxMjgsMjU0LDI1NSwyMzgsMjM5LDIzOCwKLSAgICAyMzQsMjM5LDIzMywyMzgsMjI5LDExNCwxMjgsIDMyLCAxMiwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwgMzIsCi0gICAgIDExLDI0NCwgOTcsMTI4LCAgMywxODIsMTA0LCAgMiwyMTcsMTg4LDIxNywxOTksMjI2LDIzOSwyNDAsMjM5LAotICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxOSwxMDEsICA0LDIxNywyMDksMjE3LDIyMCwyMTcsMjM2LDIxNywKLSAgICAyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEwNiwyMjYsMjQyLDIyOSwyNDYsCi0gICAgMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTQsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA1NCwxMDAsICAyLDIxNywyNTMsMjE4LCAxNiwyMjksMjQzLDIyNywKLSAgICAyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTEsCi0gICAgMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwyMjEsMTA1LCAgMywyMTgsIDQyLDIxOCwgNTMsMjE4LCA2NCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwKLSAgICAyMzgsIDk3LDEyOCwgNDgsIDg4LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxODQsCi0gICAgMjM4LDIzOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzQsMjM2LDIzMywyMzgsMjI5LAotICAgIDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNDksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywKLSAgICAxMDEsMTI4LDI1NSwgOTAsMTExLCAgMiwyMTgsMTA2LDIxOCwxMTcsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsCi0gICAgMjM4LCA5NywxMjgsIDQ4LCA5NCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTkwLAotICAgIDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxODEsMjQyLDIyOSwyNDQsMjQyLDIzOSwyMzAsMjM2LDIyOSwKLSAgICAyNDgsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsMTQ0LDI0MywyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsCi0gICAgMTgyLDExNywgIDIsMjE4LDE2NywyMTgsMTc4LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwgOTAsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE4NgotICB9Ci0jZW5kaWYgLyogREVGSU5FX1BTX1RBQkxFUyAqLwotICA7Ci0KLQotI2lmZGVmICBERUZJTkVfUFNfVEFCTEVTCi0gIC8qCi0gICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBjb21wcmVzc2VkIHRhYmxlIGVmZmljaWVudGx5LgotICAgKi8KLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcKLSAgZnRfZ2V0X2Fkb2JlX2dseXBoX2luZGV4KCBjb25zdCBjaGFyKiAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbGltaXQgKQotICB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIGMgPSAwOwotICAgIGludCAgICAgICAgICAgICAgICAgICBjb3VudCwgbWluLCBtYXg7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciogIHAgPSBmdF9hZG9iZV9nbHlwaF9saXN0OwotCi0KLSAgICBpZiAoIG5hbWUgPT0gMCB8fCBuYW1lID49IGxpbWl0ICkKLSAgICAgIGdvdG8gTm90Rm91bmQ7Ci0KLSAgICBjICAgICA9ICpuYW1lKys7Ci0gICAgY291bnQgPSBwWzFdOwotICAgIHAgICAgKz0gMjsKLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gY291bnQ7Ci0KLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG1pZCA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqICBxICAgPSBwICsgbWlkICogMjsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICBjMjsKLQotCi0gICAgICBxID0gZnRfYWRvYmVfZ2x5cGhfbGlzdCArICggKCAoaW50KXFbMF0gPDwgOCApIHwgcVsxXSApOwotCi0gICAgICBjMiA9IHFbMF0gJiAxMjc7Ci0gICAgICBpZiAoIGMyID09IGMgKQotICAgICAgewotICAgICAgICBwID0gcTsKLSAgICAgICAgZ290byBGb3VuZDsKLSAgICAgIH0KLSAgICAgIGlmICggYzIgPCBjICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgICAgbWF4ID0gbWlkOwotICAgIH0KLSAgICBnb3RvIE5vdEZvdW5kOwotCi0gIEZvdW5kOgotICAgIGZvciAoOzspCi0gICAgewotICAgICAgLyogYXNzZXJ0ICgqcCAmIDEyNykgPT0gYyAqLwotCi0gICAgICBpZiAoIG5hbWUgPj0gbGltaXQgKQotICAgICAgewotICAgICAgICBpZiAoIChwWzBdICYgMTI4KSA9PSAwICYmCi0gICAgICAgICAgICAgKHBbMV0gJiAxMjgpICE9IDAgKQotICAgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZykoICggKGludClwWzJdIDw8IDggKSB8IHBbM10gKTsKLQotICAgICAgICBnb3RvIE5vdEZvdW5kOwotICAgICAgfQotICAgICAgYyA9ICpuYW1lKys7Ci0gICAgICBpZiAoIHBbMF0gJiAxMjggKQotICAgICAgewotICAgICAgICBwKys7Ci0gICAgICAgIGlmICggYyAhPSAocFswXSAmIDEyNykgKQotICAgICAgICAgIGdvdG8gTm90Rm91bmQ7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHArKzsKLSAgICAgIGNvdW50ID0gcFswXSAmIDEyNzsKLSAgICAgIGlmICggcFswXSAmIDEyOCApCi0gICAgICAgIHAgKz0gMjsKLQotICAgICAgcCsrOwotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcCArPSAyICkKLSAgICAgIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG9mZnNldCA9ICggKGludClwWzBdIDw8IDggKSB8IHBbMV07Ci0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqICBxICAgICAgPSBmdF9hZG9iZV9nbHlwaF9saXN0ICsgb2Zmc2V0OwotCi0gICAgICAgIGlmICggYyA9PSAoIHFbMF0gJiAxMjcgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBwID0gcTsKLSAgICAgICAgICBnb3RvIE5leHRJdGVyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBnb3RvIE5vdEZvdW5kOwotCi0gICAgTmV4dEl0ZXI6Ci0gICAgICA7Ci0gICAgfQotCi0gIE5vdEZvdW5kOgotICAgIHJldHVybiAwOwotICB9Ci0jZW5kaWYgLyogREVGSU5FX1BTX1RBQkxFUyAqLwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNuYW1lcy9ydWxlcy5tayBiL3NyYy9wc25hbWVzL3J1bGVzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWZhNzMyLi4wMDAwMDAwCi0tLSBhL3NyYy9wc25hbWVzL3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFBTTmFtZXMgZHJpdmVyIGNvbmZpZ3VyYXRpb24gcnVsZXMKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgUFNOYW1lcyBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1QU05BTUVTX0RJUiA6PSAkKFNSQ19ESVIpL3BzbmFtZXMKLQotCi0jIGNvbXBpbGF0aW9uIGZsYWdzIGZvciB0aGUgZHJpdmVyCi0jCi1QU05BTUVTX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgJEkkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCQoUFNOQU1FU19ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBQU05hbWVzIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQotIwotUFNOQU1FU19EUlZfU1JDIDo9ICQoUFNOQU1FU19ESVIpL3BzbW9kdWxlLmMgXAotICAgICAgICAgICAgICAgICAgICQoUFNOQU1FU19ESVIpL3BzcGljLmMKLQotCi0jIFBTTmFtZXMgZHJpdmVyIGhlYWRlcnMKLSMKLVBTTkFNRVNfRFJWX0ggOj0gJChQU05BTUVTX0RSVl9TUkM6JS5jPSUuaCkgXAotICAgICAgICAgICAgICAgICAkKFBTTkFNRVNfRElSKS9wc25hbWVyci5oICBcCi0gICAgICAgICAgICAgICAgICQoUFNOQU1FU19ESVIpL3BzdGFibGVzLmgKLQotCi0jIFBTTmFtZXMgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIFBTTkFNRVNfRFJWX09CSl9NIGlzIHVzZWQgZHVyaW5nIGBtdWx0aScgYnVpbGRzCi0jICAgUFNOQU1FU19EUlZfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHNpbmdsZScgYnVpbGRzCi0jCi1QU05BTUVTX0RSVl9PQkpfTSA6PSAkKFBTTkFNRVNfRFJWX1NSQzokKFBTTkFNRVNfRElSKS8lLmM9JChPQkpfRElSKS8lLiRPKQotUFNOQU1FU19EUlZfT0JKX1MgOj0gJChPQkpfRElSKS9wc25hbWVzLiRPCi0KLSMgUFNOYW1lcyBkcml2ZXIgc291cmNlIGZpbGUgZm9yIHNpbmdsZSBidWlsZAotIwotUFNOQU1FU19EUlZfU1JDX1MgOj0gJChQU05BTUVTX0RJUikvcHNuYW1lcy5jCi0KLQotIyBQU05hbWVzIGRyaXZlciAtIHNpbmdsZSBvYmplY3QKLSMKLSQoUFNOQU1FU19EUlZfT0JKX1MpOiAkKFBTTkFNRVNfRFJWX1NSQ19TKSAkKFBTTkFNRVNfRFJWX1NSQykgXAotICAgICAgICAgICAgICAgICAgICAgICQoRlJFRVRZUEVfSCkgJChQU05BTUVTX0RSVl9IKQotCSQoUFNOQU1FU19DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChQU05BTUVTX0RSVl9TUkNfUykpCi0KLQotIyBQU05hbWVzIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChQU05BTUVTX0RJUikvJS5jICQoRlJFRVRZUEVfSCkgJChQU05BTUVTX0RSVl9IKQotCSQoUFNOQU1FU19DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoUFNOQU1FU19EUlZfT0JKX1MpCi1EUlZfT0JKU19NICs9ICQoUFNOQU1FU19EUlZfT0JKX00pCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9yYXN0ZXIvSmFtZmlsZSBiL3NyYy9yYXN0ZXIvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmM2Q2Yy4uMDAwMDAwMAotLS0gYS9zcmMvcmFzdGVyL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3Jhc3RlciBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgcmFzdGVyIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBmdHJhc3RlcgotICAgICAgICAgICAgICAgZnRyZW5kMQotICAgICAgICAgICAgICAgcmFzdHBpYwotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gcmFzdGVyIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3Jhc3RlciBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0bWlzYy5oIGIvc3JjL3Jhc3Rlci9mdG1pc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlNjYyNy4uMDAwMDAwMAotLS0gYS9zcmMvcmFzdGVyL2Z0bWlzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bWlzYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBNaXNjZWxsYW5lb3VzIG1hY3JvcyBmb3Igc3RhbmQtYWxvbmUgcmFzdGVyaXplciAoc3BlY2lmaWNhdGlvbiAgICAgICAqLwotLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLwotLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzICpub3QqIHBvcnRhYmxlISAgWW91IGhhdmUgdG8gYWRhcHQgKi8KLSAgLyogaXRzIGRlZmluaXRpb25zIHRvIHlvdXIgcGxhdGZvcm0uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBGVE1JU0NfSF8KLSNkZWZpbmUgRlRNSVNDX0hfCi0KLQotICAvKiBtZW1zZXQgKi8KLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotI2RlZmluZSBGVF9CRUdJTl9IRUFERVIKLSNkZWZpbmUgRlRfRU5EX0hFQURFUgotCi0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICAgc3RhdGljIHgKLQotCi0gIC8qIGZyb20gaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmggKi8KLQotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEZUX0J5dGU7Ci0gIHR5cGVkZWYgc2lnbmVkIGludCAgICAgRlRfSW50OwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgIEZUX1VJbnQ7Ci0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgICAgRlRfTG9uZzsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICBGVF9VTG9uZzsKLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICBGVF9GMjZEb3Q2OwotICB0eXBlZGVmIGludCAgICAgICAgICAgIEZUX0Vycm9yOwotCi0jZGVmaW5lIEZUX01BS0VfVEFHKCBfeDEsIF94MiwgX3gzLCBfeDQgKSBcCi0gICAgICAgICAgKCAoIChGVF9VTG9uZylfeDEgPDwgMjQgKSB8ICAgICBcCi0gICAgICAgICAgICAoIChGVF9VTG9uZylfeDIgPDwgMTYgKSB8ICAgICBcCi0gICAgICAgICAgICAoIChGVF9VTG9uZylfeDMgPDwgIDggKSB8ICAgICBcCi0gICAgICAgICAgICAgIChGVF9VTG9uZylfeDQgICAgICAgICApCi0KLQotICAvKiBmcm9tIGluY2x1ZGUvZnJlZXR5cGUvZnRzeXN0ZW0uaCAqLwotCi0gIHR5cGVkZWYgc3RydWN0IEZUX01lbW9yeVJlY18qICBGVF9NZW1vcnk7Ci0KLSAgdHlwZWRlZiB2b2lkKiAoKkZUX0FsbG9jX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHNpemUgKTsKLQotICB0eXBlZGVmIHZvaWQgKCpGVF9GcmVlX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOwotCi0gIHR5cGVkZWYgdm9pZCogKCpGVF9SZWFsbG9jX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIG5ld19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOwotCi0gIHR5cGVkZWYgc3RydWN0IEZUX01lbW9yeVJlY18KLSAgewotICAgIHZvaWQqICAgICAgICAgICAgdXNlcjsKLQotICAgIEZUX0FsbG9jX0Z1bmMgICAgYWxsb2M7Ci0gICAgRlRfRnJlZV9GdW5jICAgICBmcmVlOwotICAgIEZUX1JlYWxsb2NfRnVuYyAgcmVhbGxvYzsKLQotICB9IEZUX01lbW9yeVJlYzsKLQotCi0gIC8qIGZyb20gc3JjL2Z0Y2FsYy5jICovCi0KLSNpZiAoIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX1dJTjY0ICkKLQotICB0eXBlZGVmIF9faW50NjQgIEZUX0ludDY0OwotCi0jZWxzZQotCi0jaW5jbHVkZSAiaW50dHlwZXMuaCIKLQotICB0eXBlZGVmIGludDY0X3QgIEZUX0ludDY0OwotCi0jZW5kaWYKLQotCi0gIHN0YXRpYyBGVF9Mb25nCi0gIEZUX011bERpdiggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgIEZUX0xvbmcgIGMgKQotICB7Ci0gICAgRlRfSW50ICAgczsKLSAgICBGVF9Mb25nICBkOwotCi0KLSAgICBzID0gMTsKLSAgICBpZiAoIGEgPCAwICkgeyBhID0gLWE7IHMgPSAtMTsgfQotICAgIGlmICggYiA8IDAgKSB7IGIgPSAtYjsgcyA9IC1zOyB9Ci0gICAgaWYgKCBjIDwgMCApIHsgYyA9IC1jOyBzID0gLXM7IH0KLQotICAgIGQgPSAoRlRfTG9uZykoIGMgPiAwID8gKCAoRlRfSW50NjQpYSAqIGIgKyAoIGMgPj4gMSApICkgLyBjCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiAweDdGRkZGRkZGTCApOwotCi0gICAgcmV0dXJuICggcyA+IDAgKSA/IGQgOiAtZDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0xvbmcKLSAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYyApCi0gIHsKLSAgICBGVF9JbnQgICBzOwotICAgIEZUX0xvbmcgIGQ7Ci0KLQotICAgIHMgPSAxOwotICAgIGlmICggYSA8IDAgKSB7IGEgPSAtYTsgcyA9IC0xOyB9Ci0gICAgaWYgKCBiIDwgMCApIHsgYiA9IC1iOyBzID0gLXM7IH0KLSAgICBpZiAoIGMgPCAwICkgeyBjID0gLWM7IHMgPSAtczsgfQotCi0gICAgZCA9IChGVF9Mb25nKSggYyA+IDAgPyAoRlRfSW50NjQpYSAqIGIgLyBjCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiAweDdGRkZGRkZGTCApOwotCi0gICAgcmV0dXJuICggcyA+IDAgKSA/IGQgOiAtZDsKLSAgfQotCi0jZW5kaWYgLyogRlRNSVNDX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmMgYi9zcmMvcmFzdGVyL2Z0cmFzdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjQzZjYuLjAwMDAwMDAKLS0tIGEvc3JjL3Jhc3Rlci9mdHJhc3Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHJhc3Rlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIHJhc3Rlcml6ZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IHRoZSByZXN0IG9mIHRoZSBGcmVlVHlwZSBlbmdpbmUsIGJ5ICovCi0gIC8qIGRlZmluaW5nIHRoZSBTVEFOREFMT05FXyBtYWNybyB3aGVuIGNvbXBpbGluZyBpdC4gIFlvdSBhbHNvIG5lZWQgdG8gICAqLwotICAvKiBwdXQgdGhlIGZpbGVzIGBmdGltYWdlLmgnIGFuZCBgZnRtaXNjLmgnIGludG8gdGhlICQoaW5jZGlyKSAgICAgICAgICAgKi8KLSAgLyogZGlyZWN0b3J5LiAgVHlwaWNhbGx5LCB5b3Ugc2hvdWxkIGRvIHNvbWV0aGluZyBsaWtlICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNvcHkgYHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYycgKHRoaXMgZmlsZSkgdG8geW91ciBjdXJyZW50IGRpcmVjdG9yeSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29weSBgaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgnIGFuZCBgc3JjL3Jhc3Rlci9mdG1pc2MuaCcgdG8geW91ciAqLwotICAvKiAgIGN1cnJlbnQgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29tcGlsZSBgZnRyYXN0ZXInIHdpdGggdGhlIFNUQU5EQUxPTkVfIG1hY3JvIGRlZmluZWQsIGFzIGluICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNjIC1jIC1EU1RBTkRBTE9ORV8gZnRyYXN0ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgcmVuZGVyZXIgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggYSBjYWxsIHRvICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYGZ0X3N0YW5kYXJkX3Jhc3Rlci5yYXN0ZXJfbmV3JzsgYSBiaXRtYXAgY2FuIGJlIGdlbmVyYXRlZCAgICAgICAgICAgICovCi0gIC8qIHdpdGggYSBjYWxsIHRvIGBmdF9zdGFuZGFyZF9yYXN0ZXIucmFzdGVyX3JlbmRlcicuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2VlIHRoZSBjb21tZW50cyBhbmQgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZmlsZSBgZnRpbWFnZS5oJyBmb3IgbW9yZSAgICovCi0gIC8qIGRldGFpbHMgb24gaG93IHRoZSByYXN0ZXIgd29ya3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgYSByZXdyaXRlIG9mIHRoZSBGcmVlVHlwZSAxLnggc2Nhbi1saW5lIGNvbnZlcnRlciAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBTVEFOREFMT05FXwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbCB1c2VkIGJ5IHRoZSBzY2FuLWxpbmUgY29udmVydGVyICAqLwotICAvKiB0byBkbyBhbGwgb2YgaXRzIHdvcmsuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfUkVOREVSX1BPT0xfU0laRSAgMTYzODRMCi0KLSNkZWZpbmUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSCAgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAvKiBmb3IgbWVtc2V0ICovCi0KLSNpbmNsdWRlICJmdG1pc2MuaCIKLSNpbmNsdWRlICJmdGltYWdlLmgiCi0KLSNlbHNlIC8qICFTVEFOREFMT05FXyAqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJmdHJhc3Rlci5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19IICAgLyogZm9yIEZUX011bERpdiBhbmQgRlRfTXVsRGl2X05vX1JvdW5kICovCi0KLSNpbmNsdWRlICJyYXN0cGljLmgiCi0KLSNlbmRpZiAvKiAhU1RBTkRBTE9ORV8gKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBzaW1wbGUgdGVjaG5pY2FsIG5vdGUgb24gaG93IHRoZSByYXN0ZXIgd29ya3MgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBDb252ZXJ0aW5nIGFuIG91dGxpbmUgaW50byBhIGJpdG1hcCBpcyBhY2hpZXZlZCBpbiBzZXZlcmFsIHN0ZXBzOiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDEgLSBEZWNvbXBvc2luZyB0aGUgb3V0bGluZSBpbnRvIHN1Y2Nlc3NpdmUgYHByb2ZpbGVzJy4gIEVhY2ggICAgICAgKi8KLSAgLyogICAgICAgcHJvZmlsZSBpcyBzaW1wbHkgYW4gYXJyYXkgb2Ygc2NhbmxpbmUgaW50ZXJzZWN0aW9ucyBvbiBhIGdpdmVuICovCi0gIC8qICAgICAgIGRpbWVuc2lvbi4gIEEgcHJvZmlsZSdzIG1haW4gYXR0cmlidXRlcyBhcmUgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgbyBpdHMgc2NhbmxpbmUgcG9zaXRpb24gYm91bmRhcmllcywgaS5lLiBgWW1pbicgYW5kIGBZbWF4JyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBvIGFuIGFycmF5IG9mIGludGVyc2VjdGlvbiBjb29yZGluYXRlcyBmb3IgZWFjaCBzY2FubGluZSAgICAgICAgKi8KLSAgLyogICAgICAgICBiZXR3ZWVuIGBZbWluJyBhbmQgYFltYXgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBvIGEgZGlyZWN0aW9uLCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgd2FzIGJ1aWx0IGdvaW5nIGB1cCcgb3IgICAgKi8KLSAgLyogICAgICAgICBgZG93bicsIGFzIHRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIGZpbGxpbmcgcnVsZXMgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBvIGl0cyBkcm9wLW91dCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgMiAtIFN3ZWVwaW5nIHRoZSB0YXJnZXQgbWFwJ3Mgc2NhbmxpbmVzIGluIG9yZGVyIHRvIGNvbXB1dGUgc2VnbWVudCAqLwotICAvKiAgICAgICBgc3BhbnMnIHdoaWNoIGFyZSB0aGVuIGZpbGxlZC4gIEFkZGl0aW9uYWxseSwgdGhpcyBwYXNzICAgICAgICAgKi8KLSAgLyogICAgICAgcGVyZm9ybXMgZHJvcC1vdXQgY29udHJvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBvdXRsaW5lIGRhdGEgaXMgcGFyc2VkIGR1cmluZyBzdGVwIDEgb25seS4gIFRoZSBwcm9maWxlcyBhcmUgICAgKi8KLSAgLyogICBidWlsdCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHJlbmRlciBwb29sLCB1c2VkIGFzIGEgc3RhY2suICBUaGUgICAgICovCi0gIC8qICAgZm9sbG93aW5nIGdyYXBoaWNzIHNob3dzIHRoZSBwcm9maWxlIGxpc3QgdW5kZXIgY29uc3RydWN0aW9uOiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gXyBfICAgICovCi0gIC8qICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAqLwotICAvKiAgICB8IHByb2ZpbGUgfCBjb29yZGluYXRlcyBmb3IgfCBwcm9maWxlIHwgY29vcmRpbmF0ZXMgZm9yIHwtLT4gICAgICAgKi8KLSAgLyogICAgfCAgICAxICAgIHwgIHByb2ZpbGUgMSAgICAgIHwgICAgMiAgICB8ICBwcm9maWxlIDIgICAgICB8LS0+ICAgICAgICovCi0gIC8qICAgIHxfX19fX19fX198X19fX19fX19fX19fX19fX198X19fX19fX19ffF9fX19fX19fX19fX19fX19ffF9fIF8gXyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICovCi0gIC8qICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAqLwotICAvKiBzdGFydCBvZiByZW5kZXIgcG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIHRvcCBvZiB0aGUgcHJvZmlsZSBzdGFjayBpcyBrZXB0IGluIHRoZSBgdG9wJyB2YXJpYWJsZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBcyB5b3UgY2FuIHNlZSwgYSBwcm9maWxlIHJlY29yZCBpcyBwdXNoZWQgb24gdG9wIG9mIHRoZSByZW5kZXIgICAgICovCi0gIC8qICAgcG9vbCwgd2hpY2ggaXMgdGhlbiBmb2xsb3dlZCBieSBpdHMgY29vcmRpbmF0ZXMvaW50ZXJzZWN0aW9ucy4gIElmICAqLwotICAvKiAgIGEgY2hhbmdlIG9mIGRpcmVjdGlvbiBpcyBkZXRlY3RlZCBpbiB0aGUgb3V0bGluZSwgYSBuZXcgcHJvZmlsZSBpcyAgKi8KLSAgLyogICBnZW5lcmF0ZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vdGUgdGhhdCB3aGVuIGFsbCBwcm9maWxlcyBoYXZlIGJlZW4gZ2VuZXJhdGVkLCB0aGUgZnVuY3Rpb24gICAgICAgKi8KLSAgLyogICBGaW5hbGl6ZV9Qcm9maWxlX1RhYmxlKCkgaXMgdXNlZCB0byByZWNvcmQsIGZvciBlYWNoIHByb2ZpbGUsIGl0cyAgICovCi0gIC8qICAgYm90dG9tLW1vc3Qgc2NhbmxpbmUgYXMgd2VsbCBhcyB0aGUgc2NhbmxpbmUgYWJvdmUgaXRzIHVwbW9zdCAgICAgICAqLwotICAvKiAgIGJvdW5kYXJ5LiAgVGhlc2UgcG9zaXRpb25zIGFyZSBjYWxsZWQgYHktdHVybnMnIGJlY2F1c2UgdGhleSAoc29ydCAgKi8KLSAgLyogICBvZikgY29ycmVzcG9uZCB0byBsb2NhbCBleHRyZW1hLiAgVGhleSBhcmUgc3RvcmVkIGluIGEgc29ydGVkIGxpc3QgICovCi0gIC8qICAgYnVpbHQgZnJvbSB0aGUgdG9wIG9mIHRoZSByZW5kZXIgcG9vbCBhcyBhIGRvd253YXJkcyBzdGFjazogICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBfIF8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICA8LS18IHNvcnRlZCBsaXN0IG9mICAgICB8ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgPC0tfCAgZXh0cmVtYSBzY2FubGluZXMgfCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgXyBfIF9fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX19fX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZmICAgICAgICAgICBzaXplQnVmZiA9IGVuZCBvZiBwb29sICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBsaXN0IGlzIGxhdGVyIHVzZWQgZHVyaW5nIHRoZSBzd2VlcCBwaGFzZSBpbiBvcmRlciB0byAgICAgICAgICAqLwotICAvKiAgIG9wdGltaXplIHBlcmZvcm1hbmNlIChzZWUgdGVjaG5pY2FsIG5vdGUgb24gdGhlIHN3ZWVwIGJlbG93KS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgT2YgY291cnNlLCB0aGUgcmFzdGVyIGRldGVjdHMgd2hldGhlciB0aGUgdHdvIHN0YWNrcyBjb2xsaWRlIGFuZCAgICAqLwotICAvKiAgIGhhbmRsZXMgdGhlIHNpdHVhdGlvbiBwcm9wZXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogZGVmaW5lIERFQlVHX1JBU1RFUiBpZiB5b3Ugd2FudCB0byBjb21waWxlIGEgZGVidWdnaW5nIHZlcnNpb24gKi8KLS8qICNkZWZpbmUgREVCVUdfUkFTVEVSICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKiogIE9USEVSIE1BQ1JPUyAoZG8gbm90IGNoYW5nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYXN0ZXIKLQotCi0jaWZkZWYgU1RBTkRBTE9ORV8KLQotICAvKiBBdXhpbGlhcnkgbWFjcm9zIGZvciB0b2tlbiBjb25jYXRlbmF0aW9uLiAqLwotI2RlZmluZSBGVF9FUlJfWENBVCggeCwgeSApICB4ICMjIHkKLSNkZWZpbmUgRlRfRVJSX0NBVCggeCwgeSApICAgRlRfRVJSX1hDQVQoIHgsIHkgKQotCi0gIC8qIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHVudXNlZC4gKi8KLSAgLyogSXRzIHB1cnBvc2UgaXMgc2ltcGx5IHRvIHJlZHVjZSBjb21waWxlciB3YXJuaW5ncy4gIE5vdGUgYWxzbyB0aGF0ICAqLwotICAvKiBzaW1wbHkgZGVmaW5pbmcgaXQgYXMgYCh2b2lkKXgnIGRvZXNuJ3QgYXZvaWQgd2FybmluZ3Mgd2l0aCBjZXJ0YWluICovCi0gIC8qIEFOU0kgY29tcGlsZXJzIChlLmcuIExDQykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfVU5VU0VEKCB4ICkgICh4KSA9ICh4KQotCi0gIC8qIERpc2FibGUgdGhlIHRyYWNpbmcgbWVjaGFuaXNtIGZvciBzaW1wbGljaXR5IC0tIGRldmVsb3BlcnMgY2FuICAgICAgKi8KLSAgLyogYWN0aXZhdGUgaXQgZWFzaWx5IGJ5IHJlZGVmaW5pbmcgdGhlc2UgbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FUlJPUgotI2RlZmluZSBGVF9FUlJPUiggeCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgIC8qIG5vdGhpbmcgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEZUX1RSQUNFCi0jZGVmaW5lIEZUX1RSQUNFKCB4ICkgICBkbyB7IH0gd2hpbGUgKCAwICkgICAgLyogbm90aGluZyAqLwotI2RlZmluZSBGVF9UUkFDRTEoIHggKSAgZG8geyB9IHdoaWxlICggMCApICAgIC8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgRlRfVFJBQ0U2KCB4ICkgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAvKiBub3RoaW5nICovCi0jZGVmaW5lIEZUX1RSQUNFNyggeCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgLyogbm90aGluZyAqLwotI2VuZGlmCi0KLSNpZm5kZWYgRlRfVEhST1cKLSNkZWZpbmUgRlRfVEhST1coIGUgKSAgRlRfRVJSX0NBVCggUmFzdGVyX0Vycl8sIGUgKQotI2VuZGlmCi0KLSNkZWZpbmUgUmFzdGVyX0Vycl9Ob25lICAgICAgICAgIDAKLSNkZWZpbmUgUmFzdGVyX0Vycl9Ob3RfSW5pICAgICAgLTEKLSNkZWZpbmUgUmFzdGVyX0Vycl9PdmVyZmxvdyAgICAgLTIKLSNkZWZpbmUgUmFzdGVyX0Vycl9OZWdfSGVpZ2h0ICAgLTMKLSNkZWZpbmUgUmFzdGVyX0Vycl9JbnZhbGlkICAgICAgLTQKLSNkZWZpbmUgUmFzdGVyX0Vycl9VbnN1cHBvcnRlZCAgLTUKLQotI2RlZmluZSBmdF9tZW1zZXQgIG1lbXNldAotCi0jZGVmaW5lIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoIGNsYXNzXywgZ2x5cGhfZm9ybWF0XywgcmFzdGVyX25ld18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyX3Jlc2V0XywgcmFzdGVyX3NldF9tb2RlXywgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXJfcmVuZGVyXywgcmFzdGVyX2RvbmVfICkgICAgICBcCi0gICAgICAgICAgY29uc3QgRlRfUmFzdGVyX0Z1bmNzIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByYXN0ZXJfbmV3XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJhc3Rlcl9yZXNldF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmFzdGVyX3NldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByYXN0ZXJfcmVuZGVyXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJhc3Rlcl9kb25lXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgfTsKLQotI2Vsc2UgLyogIVNUQU5EQUxPTkVfICovCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19IICAgICAgIC8qIGZvciBGVF9UUkFDRSwgRlRfRVJST1IsIGFuZCBGVF9USFJPVyAqLwotCi0jaW5jbHVkZSAicmFzdGVycnMuaCIKLQotI2RlZmluZSBSYXN0ZXJfRXJyX05vbmUgICAgICAgICBGVF9FcnJfT2sKLSNkZWZpbmUgUmFzdGVyX0Vycl9Ob3RfSW5pICAgICAgUmFzdGVyX0Vycl9SYXN0ZXJfVW5pbml0aWFsaXplZAotI2RlZmluZSBSYXN0ZXJfRXJyX092ZXJmbG93ICAgICBSYXN0ZXJfRXJyX1Jhc3Rlcl9PdmVyZmxvdwotI2RlZmluZSBSYXN0ZXJfRXJyX05lZ19IZWlnaHQgICBSYXN0ZXJfRXJyX1Jhc3Rlcl9OZWdhdGl2ZV9IZWlnaHQKLSNkZWZpbmUgUmFzdGVyX0Vycl9JbnZhbGlkICAgICAgUmFzdGVyX0Vycl9JbnZhbGlkX091dGxpbmUKLSNkZWZpbmUgUmFzdGVyX0Vycl9VbnN1cHBvcnRlZCAgUmFzdGVyX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoCi0KLQotI2VuZGlmIC8qICFTVEFOREFMT05FXyAqLwotCi0KLSNpZm5kZWYgRlRfTUVNX1NFVAotI2RlZmluZSBGVF9NRU1fU0VUKCBkLCBzLCBjICkgIGZ0X21lbXNldCggZCwgcywgYyApCi0jZW5kaWYKLQotI2lmbmRlZiBGVF9NRU1fWkVSTwotI2RlZmluZSBGVF9NRU1fWkVSTyggZGVzdCwgY291bnQgKSAgRlRfTUVNX1NFVCggZGVzdCwgMCwgY291bnQgKQotI2VuZGlmCi0KLSNpZm5kZWYgRlRfWkVSTwotI2RlZmluZSBGVF9aRVJPKCBwICkgIEZUX01FTV9aRVJPKCBwLCBzaXplb2YgKCAqKHApICkgKQotI2VuZGlmCi0KLSAgLyogRk11bERpdiBtZWFucyBgRmFzdCBNdWxEaXYnOyBpdCBpcyB1c2VkIGluIGNhc2Ugd2hlcmUgYGInIGlzICAgICAgICovCi0gIC8qIHR5cGljYWxseSBhIHNtYWxsIHZhbHVlIGFuZCB0aGUgcmVzdWx0IG9mIGEqYiBpcyBrbm93biB0byBmaXQgaW50byAqLwotICAvKiAzMiBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRk11bERpdiggYSwgYiwgYyApICAoIChhKSAqIChiKSAvIChjKSApCi0KLSAgLyogT24gdGhlIG90aGVyIGhhbmQsIFNNdWxEaXYgbWVhbnMgYFNsb3cgTXVsRGl2JywgYW5kIGlzIHVzZWQgdHlwaWNhbGx5ICovCi0gIC8qIGZvciBjbGlwcGluZyBjb21wdXRhdGlvbnMuICBJdCBzaW1wbHkgdXNlcyB0aGUgRlRfTXVsRGl2KCkgZnVuY3Rpb24gICAqLwotICAvKiBkZWZpbmVkIGluIGBmdGNhbGMuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU011bERpdiAgICAgICAgICAgRlRfTXVsRGl2Ci0jZGVmaW5lIFNNdWxEaXZfTm9fUm91bmQgIEZUX011bERpdl9Ob19Sb3VuZAotCi0gIC8qIFRoZSByYXN0ZXJpemVyIGlzIGEgdmVyeSBnZW5lcmFsIHB1cnBvc2UgY29tcG9uZW50OyBwbGVhc2UgbGVhdmUgKi8KLSAgLyogdGhlIGZvbGxvd2luZyByZWRlZmluaXRpb25zIHRoZXJlICh5b3UgbmV2ZXIga25vdyB5b3VyIHRhcmdldCAgICAqLwotICAvKiBlbnZpcm9ubWVudCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgIDAKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgKHZvaWQqKTAKLSNlbmRpZgotCi0jaWZuZGVmIFNVQ0NFU1MKLSNkZWZpbmUgU1VDQ0VTUyAgMAotI2VuZGlmCi0KLSNpZm5kZWYgRkFJTFVSRQotI2RlZmluZSBGQUlMVVJFICAxCi0jZW5kaWYKLQotCi0jZGVmaW5lIE1heEJlemllciAgMzIgICAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2tlZCBCZXppZXIgY3VydmVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0dGluZyB0aGlzIGNvbnN0YW50IHRvIG1vcmUgdGhhbiAzMiBpcyBhICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1cmUgd2FzdGUgb2Ygc3BhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgUGl4ZWxfQml0cyAgNiAgIC8qIGZyYWN0aW9uYWwgYml0cyBvZiAqaW5wdXQqIGNvb3JkaW5hdGVzICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKiogIFNJTVBMRSBUWVBFIERFQ0xBUkFUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIGludCAgICAgICAgICAgICBJbnQ7Ci0gIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgIFVJbnQ7Ci0gIHR5cGVkZWYgc2hvcnQgICAgICAgICAgIFNob3J0OwotICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBVU2hvcnQsICpQVVNob3J0OwotICB0eXBlZGVmIGxvbmcgICAgICAgICAgICBMb25nLCAqUExvbmc7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFVMb25nOwotCi0gIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgIEJ5dGUsICpQQnl0ZTsKLSAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgQm9vbDsKLQotCi0gIHR5cGVkZWYgdW5pb24gIEFsaWdubWVudF8KLSAgewotICAgIExvbmcgICAgbDsKLSAgICB2b2lkKiAgIHA7Ci0gICAgdm9pZCAgKCpmKSh2b2lkKTsKLQotICB9IEFsaWdubWVudCwgKlBBbGlnbm1lbnQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVFBvaW50XwotICB7Ci0gICAgTG9uZyAgeDsKLSAgICBMb25nICB5OwotCi0gIH0gVFBvaW50OwotCi0KLSAgLyogdmFsdWVzIGZvciB0aGUgYGZsYWdzJyBiaXQgZmllbGQgKi8KLSNkZWZpbmUgRmxvd19VcCAgICAgICAgICAgMHgwOFUKLSNkZWZpbmUgT3ZlcnNob290X1RvcCAgICAgMHgxMFUKLSNkZWZpbmUgT3ZlcnNob290X0JvdHRvbSAgMHgyMFUKLQotCi0gIC8qIFN0YXRlcyBvZiBlYWNoIGxpbmUsIGFyYywgYW5kIHByb2ZpbGUgKi8KLSAgdHlwZWRlZiBlbnVtICBUU3RhdGVzXwotICB7Ci0gICAgVW5rbm93bl9TdGF0ZSwKLSAgICBBc2NlbmRpbmdfU3RhdGUsCi0gICAgRGVzY2VuZGluZ19TdGF0ZSwKLSAgICBGbGF0X1N0YXRlCi0KLSAgfSBUU3RhdGVzOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgVFByb2ZpbGVfICBUUHJvZmlsZTsKLSAgdHlwZWRlZiBUUHJvZmlsZSogICAgICAgICBQUHJvZmlsZTsKLQotICBzdHJ1Y3QgIFRQcm9maWxlXwotICB7Ci0gICAgRlRfRjI2RG90NiAgWDsgICAgICAgICAgIC8qIGN1cnJlbnQgY29vcmRpbmF0ZSBkdXJpbmcgc3dlZXAgICAgICAgICAgKi8KLSAgICBQUHJvZmlsZSAgICBsaW5rOyAgICAgICAgLyogbGluayB0byBuZXh0IHByb2ZpbGUgKHZhcmlvdXMgcHVycG9zZXMpICAqLwotICAgIFBMb25nICAgICAgIG9mZnNldDsgICAgICAvKiBzdGFydCBvZiBwcm9maWxlJ3MgZGF0YSBpbiByZW5kZXIgcG9vbCAgICovCi0gICAgVVNob3J0ICAgICAgZmxhZ3M7ICAgICAgIC8qIEJpdCAwLTI6IGRyb3Atb3V0IG1vZGUgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQml0IDM6IHByb2ZpbGUgb3JpZW50YXRpb24gKHVwL2Rvd24pICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQgNDogaXMgdG9wIHByb2ZpbGU/ICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdCA1OiBpcyBib3R0b20gcHJvZmlsZT8gICAgICAgICAgICAgICAgKi8KLSAgICBMb25nICAgICAgICBoZWlnaHQ7ICAgICAgLyogcHJvZmlsZSdzIGhlaWdodCBpbiBzY2FubGluZXMgICAgICAgICAgICAqLwotICAgIExvbmcgICAgICAgIHN0YXJ0OyAgICAgICAvKiBwcm9maWxlJ3Mgc3RhcnRpbmcgc2NhbmxpbmUgICAgICAgICAgICAgICovCi0KLSAgICBJbnQgICAgICAgICBjb3VudEw7ICAgICAgLyogbnVtYmVyIG9mIGxpbmVzIHRvIHN0ZXAgYmVmb3JlIHRoaXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9maWxlIGJlY29tZXMgZHJhd2FibGUgICAgICAgICAgICAgICAgICovCi0KLSAgICBQUHJvZmlsZSAgICBuZXh0OyAgICAgICAgLyogbmV4dCBwcm9maWxlIGluIHNhbWUgY29udG91ciwgdXNlZCAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkdXJpbmcgZHJvcC1vdXQgY29udHJvbCAgICAgICAgICAgICAgICAgICovCi0gIH07Ci0KLSAgdHlwZWRlZiBQUHJvZmlsZSAgIFRQcm9maWxlTGlzdDsKLSAgdHlwZWRlZiBQUHJvZmlsZSogIFBQcm9maWxlTGlzdDsKLQotCi0gIC8qIFNpbXBsZSByZWNvcmQgdXNlZCB0byBpbXBsZW1lbnQgYSBzdGFjayBvZiBiYW5kcywgcmVxdWlyZWQgKi8KLSAgLyogYnkgdGhlIHN1Yi1iYW5kaW5nIG1lY2hhbmlzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgYmxhY2tfVEJhbmRfCi0gIHsKLSAgICBTaG9ydCAgeV9taW47ICAgLyogYmFuZCdzIG1pbmltdW0gKi8KLSAgICBTaG9ydCAgeV9tYXg7ICAgLyogYmFuZCdzIG1heGltdW0gKi8KLQotICB9IGJsYWNrX1RCYW5kOwotCi0KLSNkZWZpbmUgQWxpZ25Qcm9maWxlU2l6ZSBcCi0gICggKCBzaXplb2YgKCBUUHJvZmlsZSApICsgc2l6ZW9mICggQWxpZ25tZW50ICkgLSAxICkgLyBzaXplb2YgKCBMb25nICkgKQotCi0KLSN1bmRlZiBSQVNfQVJHCi0jdW5kZWYgUkFTX0FSR1MKLSN1bmRlZiBSQVNfVkFSCi0jdW5kZWYgUkFTX1ZBUlMKLQotI2lmZGVmIEZUX1NUQVRJQ19SQVNURVIKLQotCi0jZGVmaW5lIFJBU19BUkdTICAgICAgIC8qIHZvaWQgKi8KLSNkZWZpbmUgUkFTX0FSRyAgICAgICAgLyogdm9pZCAqLwotCi0jZGVmaW5lIFJBU19WQVJTICAgICAgIC8qIHZvaWQgKi8KLSNkZWZpbmUgUkFTX1ZBUiAgICAgICAgLyogdm9pZCAqLwotCi0jZGVmaW5lIEZUX1VOVVNFRF9SQVNURVIgIGRvIHsgfSB3aGlsZSAoIDAgKQotCi0KLSNlbHNlIC8qICFGVF9TVEFUSUNfUkFTVEVSICovCi0KLQotI2RlZmluZSBSQVNfQVJHUyAgICAgICBibGFja19QV29ya2VyICB3b3JrZXIsCi0jZGVmaW5lIFJBU19BUkcgICAgICAgIGJsYWNrX1BXb3JrZXIgIHdvcmtlcgotCi0jZGVmaW5lIFJBU19WQVJTICAgICAgIHdvcmtlciwKLSNkZWZpbmUgUkFTX1ZBUiAgICAgICAgd29ya2VyCi0KLSNkZWZpbmUgRlRfVU5VU0VEX1JBU1RFUiAgRlRfVU5VU0VEKCB3b3JrZXIgKQotCi0KLSNlbmRpZiAvKiAhRlRfU1RBVElDX1JBU1RFUiAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgYmxhY2tfVFdvcmtlcl8gIGJsYWNrX1RXb3JrZXIsICpibGFja19QV29ya2VyOwotCi0KLSAgLyogcHJvdG90eXBlcyB1c2VkIGZvciBzd2VlcCBmdW5jdGlvbiBkaXNwYXRjaCAqLwotICB0eXBlZGVmIHZvaWQKLSAgRnVuY3Rpb25fU3dlZXBfSW5pdCggUkFTX0FSR1MgU2hvcnQqICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0KiAgbWF4ICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gIEZ1bmN0aW9uX1N3ZWVwX1NwYW4oIFJBU19BUkdTIFNob3J0ICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgcmlnaHQgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgRnVuY3Rpb25fU3dlZXBfU3RlcCggUkFTX0FSRyApOwotCi0KLSAgLyogTk9URTogVGhlc2Ugb3BlcmF0aW9ucyBhcmUgb25seSB2YWxpZCBvbiAyJ3MgY29tcGxlbWVudCBwcm9jZXNzb3JzICovCi0jdW5kZWYgRkxPT1IKLSN1bmRlZiBDRUlMSU5HCi0jdW5kZWYgVFJVTkMKLSN1bmRlZiBTQ0FMRUQKLQotI2RlZmluZSBGTE9PUiggeCApICAgICggKHgpICYgLXJhcy5wcmVjaXNpb24gKQotI2RlZmluZSBDRUlMSU5HKCB4ICkgICggKCAoeCkgKyByYXMucHJlY2lzaW9uIC0gMSApICYgLXJhcy5wcmVjaXNpb24gKQotI2RlZmluZSBUUlVOQyggeCApICAgICggKExvbmcpKHgpID4+IHJhcy5wcmVjaXNpb25fYml0cyApCi0jZGVmaW5lIEZSQUMoIHggKSAgICAgKCAoeCkgJiAoIHJhcy5wcmVjaXNpb24gLSAxICkgKQotI2RlZmluZSBTQ0FMRUQoIHggKSAgICggKCAoeCkgPCAwID8gLSggLSh4KSA8PCByYXMuc2NhbGVfc2hpZnQgKSAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAoICAoeCkgPDwgcmFzLnNjYWxlX3NoaWZ0ICkgKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHJhcy5wcmVjaXNpb25faGFsZiApCi0KLSNkZWZpbmUgSVNfQk9UVE9NX09WRVJTSE9PVCggeCApIFwKLSAgICAgICAgICAoQm9vbCkoIENFSUxJTkcoIHggKSAtIHggPj0gcmFzLnByZWNpc2lvbl9oYWxmICkKLSNkZWZpbmUgSVNfVE9QX09WRVJTSE9PVCggeCApICAgIFwKLSAgICAgICAgICAoQm9vbCkoIHggLSBGTE9PUiggeCApID49IHJhcy5wcmVjaXNpb25faGFsZiApCi0KLSNpZiBGVF9SRU5ERVJfUE9PTF9TSVpFID4gMjA0OAotI2RlZmluZSBGVF9NQVhfQkxBQ0tfUE9PTCAgKCBGVF9SRU5ERVJfUE9PTF9TSVpFIC8gc2l6ZW9mICggTG9uZyApICkKLSNlbHNlCi0jZGVmaW5lIEZUX01BWF9CTEFDS19QT09MICAoIDIwNDggLyBzaXplb2YgKCBMb25nICkgKQotI2VuZGlmCi0KLSAgLyogVGhlIG1vc3QgdXNlZCB2YXJpYWJsZXMgYXJlIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvZiB0aGUgc3RydWN0dXJlLiAqLwotICAvKiBUaHVzLCB0aGVpciBvZmZzZXQgY2FuIGJlIGNvZGVkIHdpdGggbGVzcyBvcGNvZGVzLCByZXN1bHRpbmcgaW4gYSAgICovCi0gIC8qIHNtYWxsZXIgZXhlY3V0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdHJ1Y3QgIGJsYWNrX1RXb3JrZXJfCi0gIHsKLSAgICBJbnQgICAgICAgICBwcmVjaXNpb25fYml0czsgICAgIC8qIHByZWNpc2lvbiByZWxhdGVkIHZhcmlhYmxlcyAgICAgICAgICovCi0gICAgSW50ICAgICAgICAgcHJlY2lzaW9uOwotICAgIEludCAgICAgICAgIHByZWNpc2lvbl9oYWxmOwotICAgIEludCAgICAgICAgIHByZWNpc2lvbl9zaGlmdDsKLSAgICBJbnQgICAgICAgICBwcmVjaXNpb25fc3RlcDsKLSAgICBJbnQgICAgICAgICBwcmVjaXNpb25faml0dGVyOwotCi0gICAgSW50ICAgICAgICAgc2NhbGVfc2hpZnQ7ICAgICAgICAvKiA9PSBwcmVjaXNpb25fc2hpZnQgICBmb3IgYml0bWFwcyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPT0gcHJlY2lzaW9uX3NoaWZ0KzEgZm9yIHBpeG1hcHMgICAgKi8KLQotICAgIFBMb25nICAgICAgIGJ1ZmY7ICAgICAgICAgICAgICAgLyogVGhlIHByb2ZpbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgKi8KLSAgICBQTG9uZyAgICAgICBzaXplQnVmZjsgICAgICAgICAgIC8qIFJlbmRlciBwb29sIHNpemUgICAgICAgICAgICAgICAgICAgICovCi0gICAgUExvbmcgICAgICAgbWF4QnVmZjsgICAgICAgICAgICAvKiBQcm9maWxlcyBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgICAqLwotICAgIFBMb25nICAgICAgIHRvcDsgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjdXJzb3IgaW4gYnVmZmVyICAgICAgICAgICAgKi8KLQotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0gICAgSW50ICAgICAgICAgbnVtVHVybnM7ICAgICAgICAgICAvKiBudW1iZXIgb2YgWS10dXJucyBpbiBvdXRsaW5lICAgICAgICAqLwotCi0gICAgVFBvaW50KiAgICAgYXJjOyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IEJlemllciBhcmMgcG9pbnRlciAgICAgICAgICAqLwotCi0gICAgVVNob3J0ICAgICAgYldpZHRoOyAgICAgICAgICAgICAvKiB0YXJnZXQgYml0bWFwIHdpZHRoICAgICAgICAgICAgICAgICAqLwotICAgIFBCeXRlICAgICAgIGJUYXJnZXQ7ICAgICAgICAgICAgLyogdGFyZ2V0IGJpdG1hcCBidWZmZXIgICAgICAgICAgICAgICAgKi8KLSAgICBQQnl0ZSAgICAgICBnVGFyZ2V0OyAgICAgICAgICAgIC8qIHRhcmdldCBwaXhtYXAgYnVmZmVyICAgICAgICAgICAgICAgICovCi0KLSAgICBMb25nICAgICAgICBsYXN0WCwgbGFzdFk7Ci0gICAgTG9uZyAgICAgICAgbWluWSwgbWF4WTsKLQotICAgIFVTaG9ydCAgICAgIG51bV9Qcm9mczsgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgcHJvZmlsZXMgICAgICAgICAgKi8KLQotICAgIEJvb2wgICAgICAgIGZyZXNoOyAgICAgICAgICAgICAgLyogc2lnbmFscyBhIGZyZXNoIG5ldyBwcm9maWxlIHdoaWNoICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBzdGFydCcgZmllbGQgbXVzdCBiZSBjb21wbGV0ZWQgICAgICovCi0gICAgQm9vbCAgICAgICAgam9pbnQ7ICAgICAgICAgICAgICAvKiBzaWduYWxzIHRoYXQgdGhlIGxhc3QgYXJjIGVuZGVkICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhhY3RseSBvbiBhIHNjYW5saW5lLiAgQWxsb3dzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92YWwgb2YgZG91YmxldHMgICAgICAgICAgICAgICAgICovCi0gICAgUFByb2ZpbGUgICAgY1Byb2ZpbGU7ICAgICAgICAgICAvKiBjdXJyZW50IHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFBQcm9maWxlICAgIGZQcm9maWxlOyAgICAgICAgICAgLyogaGVhZCBvZiBsaW5rZWQgbGlzdCBvZiBwcm9maWxlcyAgICAgKi8KLSAgICBQUHJvZmlsZSAgICBnUHJvZmlsZTsgICAgICAgICAgIC8qIGNvbnRvdXIncyBmaXJzdCBwcm9maWxlIGluIGNhc2UgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZiBpbXBhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVFN0YXRlcyAgICAgc3RhdGU7ICAgICAgICAgICAgICAvKiByZW5kZXJpbmcgc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfQml0bWFwICAgdGFyZ2V0OyAgICAgICAgICAgICAvKiBkZXNjcmlwdGlvbiBvZiB0YXJnZXQgYml0L3BpeG1hcCAgICAqLwotICAgIEZUX091dGxpbmUgIG91dGxpbmU7Ci0KLSAgICBMb25nICAgICAgICB0cmFjZU9mczsgICAgICAgICAgIC8qIGN1cnJlbnQgb2Zmc2V0IGluIHRhcmdldCBiaXRtYXAgICAgICovCi0gICAgTG9uZyAgICAgICAgdHJhY2VHOyAgICAgICAgICAgICAvKiBjdXJyZW50IG9mZnNldCBpbiB0YXJnZXQgcGl4bWFwICAgICAqLwotCi0gICAgU2hvcnQgICAgICAgdHJhY2VJbmNyOyAgICAgICAgICAvKiBzd2VlcCdzIGluY3JlbWVudCBpbiB0YXJnZXQgYml0bWFwICAqLwotCi0gICAgLyogZGlzcGF0Y2ggdmFyaWFibGVzICovCi0KLSAgICBGdW5jdGlvbl9Td2VlcF9Jbml0KiAgUHJvY19Td2VlcF9Jbml0OwotICAgIEZ1bmN0aW9uX1N3ZWVwX1NwYW4qICBQcm9jX1N3ZWVwX1NwYW47Ci0gICAgRnVuY3Rpb25fU3dlZXBfU3BhbiogIFByb2NfU3dlZXBfRHJvcDsKLSAgICBGdW5jdGlvbl9Td2VlcF9TdGVwKiAgUHJvY19Td2VlcF9TdGVwOwotCi0gICAgQnl0ZSAgICAgICAgZHJvcE91dENvbnRyb2w7ICAgICAvKiBjdXJyZW50IGRyb3Bfb3V0IGNvbnRyb2wgbWV0aG9kICAgICAqLwotCi0gICAgQm9vbCAgICAgICAgc2Vjb25kX3Bhc3M7ICAgICAgICAvKiBpbmRpY2F0ZXMgd2hldGhlciBhIGhvcml6b250YWwgcGFzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBjb250cm9sICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3Atb3V0IGFjY3VyYXRlbHkgd2hlbiBjYWxsaW5nICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW5kZXJfR2x5cGguICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVFBvaW50ICAgICAgYXJjc1szICogTWF4QmV6aWVyICsgMV07IC8qIFRoZSBCZXppZXIgc3RhY2sgICAgICAgICAgICAgICAqLwotCi0gICAgYmxhY2tfVEJhbmQgIGJhbmRfc3RhY2tbMTZdOyAgICAvKiBiYW5kIHN0YWNrIHVzZWQgZm9yIHN1Yi1iYW5kaW5nICAgICAqLwotICAgIEludCAgICAgICAgICBiYW5kX3RvcDsgICAgICAgICAgLyogYmFuZCBzdGFjayB0b3AgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICB9OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIGJsYWNrX1RSYXN0ZXJfCi0gIHsKLSAgICB2b2lkKiAgICAgICAgICBtZW1vcnk7Ci0KLSAgfSBibGFja19UUmFzdGVyLCAqYmxhY2tfUFJhc3RlcjsKLQotI2lmZGVmIEZUX1NUQVRJQ19SQVNURVIKLQotICBzdGF0aWMgYmxhY2tfVFdvcmtlciAgY3VyX3JhczsKLSNkZWZpbmUgcmFzICBjdXJfcmFzCi0KLSNlbHNlIC8qICFGVF9TVEFUSUNfUkFTVEVSICovCi0KLSNkZWZpbmUgcmFzICAoKndvcmtlcikKLQotI2VuZGlmIC8qICFGVF9TVEFUSUNfUkFTVEVSICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKiogIFBST0ZJTEVTIENPTVBVVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldF9IaWdoX1ByZWNpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCBwcmVjaXNpb24gdmFyaWFibGVzIGFjY29yZGluZyB0byBwYXJhbSBmbGFnLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhpZ2ggOjogU2V0IHRvIFRydWUgZm9yIGhpZ2ggcHJlY2lzaW9uICh0eXBpY2FsbHkgZm9yIHBwZW0gPCAyNCksICAqLwotICAvKiAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIFNldF9IaWdoX1ByZWNpc2lvbiggUkFTX0FSR1MgSW50ICBIaWdoICkKLSAgewotICAgIC8qCi0gICAgICogYHByZWNpc2lvbl9zdGVwJyBpcyB1c2VkIGluIGBCZXppZXJfVXAnIHRvIGRlY2lkZSB3aGVuIHRvIHNwbGl0IGEKLSAgICAgKiBnaXZlbiB5LW1vbm90b25vdXMgQmV6aWVyIGFyYyB0aGF0IGNyb3NzZXMgYSBzY2FubGluZSBiZWZvcmUKLSAgICAgKiBhcHByb3hpbWF0aW5nIGl0IGFzIGEgc3RyYWlnaHQgc2VnbWVudC4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDMyIChmb3IKLSAgICAgKiBsb3cgYWNjdXJhY3kpIGNvcnJlc3BvbmRzIHRvCi0gICAgICoKLSAgICAgKiAgIDMyIC8gNjQgPT0gMC41IHBpeGVscywKLSAgICAgKgotICAgICAqIHdoaWxlIGZvciB0aGUgaGlnaCBhY2N1cmFjeSBjYXNlIHdlIGhhdmUKLSAgICAgKgotICAgICAqICAgMjU2IC8gKDEgPDwgMTIpID0gMC4wNjI1IHBpeGVscy4KLSAgICAgKgotICAgICAqIGBwcmVjaXNpb25faml0dGVyJyBpcyBhbiBlcHNpbG9uIHRocmVzaG9sZCB1c2VkIGluCi0gICAgICogYFZlcnRpY2FsX1N3ZWVwX1NwYW4nIHRvIGRlYWwgd2l0aCBzbWFsbCBpbXBlcmZlY3Rpb25zIGluIHRoZSBCZXppZXIKLSAgICAgKiBkZWNvbXBvc2l0aW9uIChhZnRlciBhbGwsIHdlIGFyZSB3b3JraW5nIHdpdGggYXBwcm94aW1hdGlvbnMgb25seSk7Ci0gICAgICogaXQgYXZvaWRzIHN3aXRjaGluZyBvbiBhZGRpdGlvbmFsIHBpeGVscyB3aGljaCB3b3VsZCBjYXVzZSBhcnRpZmFjdHMKLSAgICAgKiBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBUaGUgdmFsdWUgb2YgYHByZWNpc2lvbl9qaXR0ZXInIGhhcyBiZWVuIGRldGVybWluZWQgaGV1cmlzdGljYWxseS4KLSAgICAgKgotICAgICAqLwotCi0gICAgaWYgKCBIaWdoICkKLSAgICB7Ci0gICAgICByYXMucHJlY2lzaW9uX2JpdHMgICA9IDEyOwotICAgICAgcmFzLnByZWNpc2lvbl9zdGVwICAgPSAyNTY7Ci0gICAgICByYXMucHJlY2lzaW9uX2ppdHRlciA9IDMwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmFzLnByZWNpc2lvbl9iaXRzICAgPSA2OwotICAgICAgcmFzLnByZWNpc2lvbl9zdGVwICAgPSAzMjsKLSAgICAgIHJhcy5wcmVjaXNpb25faml0dGVyID0gMjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTYoKCAiU2V0X0hpZ2hfUHJlY2lzaW9uKCVzKVxuIiwgSGlnaCA/ICJ0cnVlIiA6ICJmYWxzZSIgKSk7Ci0KLSAgICByYXMucHJlY2lzaW9uICAgICAgID0gMSA8PCByYXMucHJlY2lzaW9uX2JpdHM7Ci0gICAgcmFzLnByZWNpc2lvbl9oYWxmICA9IHJhcy5wcmVjaXNpb24gLyAyOwotICAgIHJhcy5wcmVjaXNpb25fc2hpZnQgPSByYXMucHJlY2lzaW9uX2JpdHMgLSBQaXhlbF9CaXRzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOZXdfUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgcHJvZmlsZSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhU3RhdGUgICAgOjogVGhlIHN0YXRlL29yaWVudGF0aW9uIG9mIHRoZSBuZXcgcHJvZmlsZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG92ZXJzaG9vdCA6OiBXaGV0aGVyIHRoZSBwcm9maWxlJ3MgdW5yb3VuZGVkIHN0YXJ0IHBvc2l0aW9uICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZGlmZmVycyBieSBhdCBsZWFzdCBhIGhhbGYgcGl4ZWwuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdyBvciBvZiBpbmNvaGVyZW50ICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBOZXdfUHJvZmlsZSggUkFTX0FSR1MgVFN0YXRlcyAgYVN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbCAgICAgb3ZlcnNob290ICkKLSAgewotICAgIGlmICggIXJhcy5mUHJvZmlsZSApCi0gICAgewotICAgICAgcmFzLmNQcm9maWxlICA9IChQUHJvZmlsZSlyYXMudG9wOwotICAgICAgcmFzLmZQcm9maWxlICA9IHJhcy5jUHJvZmlsZTsKLSAgICAgIHJhcy50b3AgICAgICArPSBBbGlnblByb2ZpbGVTaXplOwotICAgIH0KLQotICAgIGlmICggcmFzLnRvcCA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIE92ZXJmbG93ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICByYXMuY1Byb2ZpbGUtPmZsYWdzICA9IDA7Ci0gICAgcmFzLmNQcm9maWxlLT5zdGFydCAgPSAwOwotICAgIHJhcy5jUHJvZmlsZS0+aGVpZ2h0ID0gMDsKLSAgICByYXMuY1Byb2ZpbGUtPm9mZnNldCA9IHJhcy50b3A7Ci0gICAgcmFzLmNQcm9maWxlLT5saW5rICAgPSAoUFByb2ZpbGUpMDsKLSAgICByYXMuY1Byb2ZpbGUtPm5leHQgICA9IChQUHJvZmlsZSkwOwotICAgIHJhcy5jUHJvZmlsZS0+ZmxhZ3MgID0gcmFzLmRyb3BPdXRDb250cm9sOwotCi0gICAgc3dpdGNoICggYVN0YXRlICkKLSAgICB7Ci0gICAgY2FzZSBBc2NlbmRpbmdfU3RhdGU6Ci0gICAgICByYXMuY1Byb2ZpbGUtPmZsYWdzIHw9IEZsb3dfVXA7Ci0gICAgICBpZiAoIG92ZXJzaG9vdCApCi0gICAgICAgIHJhcy5jUHJvZmlsZS0+ZmxhZ3MgfD0gT3ZlcnNob290X0JvdHRvbTsKLQotICAgICAgRlRfVFJBQ0U2KCggIiAgbmV3IGFzY2VuZGluZyBwcm9maWxlID0gJXBcbiIsIHJhcy5jUHJvZmlsZSApKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEZXNjZW5kaW5nX1N0YXRlOgotICAgICAgaWYgKCBvdmVyc2hvb3QgKQotICAgICAgICByYXMuY1Byb2ZpbGUtPmZsYWdzIHw9IE92ZXJzaG9vdF9Ub3A7Ci0gICAgICBGVF9UUkFDRTYoKCAiICBuZXcgZGVzY2VuZGluZyBwcm9maWxlID0gJXBcbiIsIHJhcy5jUHJvZmlsZSApKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZUX0VSUk9SKCggIk5ld19Qcm9maWxlOiBpbnZhbGlkIHByb2ZpbGUgZGlyZWN0aW9uXG4iICkpOwotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIEludmFsaWQgKTsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIGlmICggIXJhcy5nUHJvZmlsZSApCi0gICAgICByYXMuZ1Byb2ZpbGUgPSByYXMuY1Byb2ZpbGU7Ci0KLSAgICByYXMuc3RhdGUgPSBhU3RhdGU7Ci0gICAgcmFzLmZyZXNoID0gVFJVRTsKLSAgICByYXMuam9pbnQgPSBGQUxTRTsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbmRfUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZSB0aGUgY3VycmVudCBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdmVyc2hvb3QgOjogV2hldGhlciB0aGUgcHJvZmlsZSdzIHVucm91bmRlZCBlbmQgcG9zaXRpb24gZGlmZmVycyAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGJ5IGF0IGxlYXN0IGEgaGFsZiBwaXhlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLiAgRkFJTFVSRSBpbiBjYXNlIG9mIG92ZXJmbG93IG9yIGluY29oZXJlbmN5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBFbmRfUHJvZmlsZSggUkFTX0FSR1MgQm9vbCAgb3ZlcnNob290ICkKLSAgewotICAgIExvbmcgIGg7Ci0KLQotICAgIGggPSAoTG9uZykoIHJhcy50b3AgLSByYXMuY1Byb2ZpbGUtPm9mZnNldCApOwotCi0gICAgaWYgKCBoIDwgMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRW5kX1Byb2ZpbGU6IG5lZ2F0aXZlIGhlaWdodCBlbmNvdW50ZXJlZFxuIiApKTsKLSAgICAgIHJhcy5lcnJvciA9IEZUX1RIUk9XKCBOZWdfSGVpZ2h0ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBpZiAoIGggPiAwICkKLSAgICB7Ci0gICAgICBQUHJvZmlsZSAgb2xkUHJvZmlsZTsKLQotCi0gICAgICBGVF9UUkFDRTYoKCAiICBlbmRpbmcgcHJvZmlsZSAlcCwgc3RhcnQgPSAlbGQsIGhlaWdodCA9ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgIHJhcy5jUHJvZmlsZSwgcmFzLmNQcm9maWxlLT5zdGFydCwgaCApKTsKLQotICAgICAgcmFzLmNQcm9maWxlLT5oZWlnaHQgPSBoOwotICAgICAgaWYgKCBvdmVyc2hvb3QgKQotICAgICAgewotICAgICAgICBpZiAoIHJhcy5jUHJvZmlsZS0+ZmxhZ3MgJiBGbG93X1VwICkKLSAgICAgICAgICByYXMuY1Byb2ZpbGUtPmZsYWdzIHw9IE92ZXJzaG9vdF9Ub3A7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByYXMuY1Byb2ZpbGUtPmZsYWdzIHw9IE92ZXJzaG9vdF9Cb3R0b207Ci0gICAgICB9Ci0KLSAgICAgIG9sZFByb2ZpbGUgICA9IHJhcy5jUHJvZmlsZTsKLSAgICAgIHJhcy5jUHJvZmlsZSA9IChQUHJvZmlsZSlyYXMudG9wOwotCi0gICAgICByYXMudG9wICs9IEFsaWduUHJvZmlsZVNpemU7Ci0KLSAgICAgIHJhcy5jUHJvZmlsZS0+aGVpZ2h0ID0gMDsKLSAgICAgIHJhcy5jUHJvZmlsZS0+b2Zmc2V0ID0gcmFzLnRvcDsKLQotICAgICAgb2xkUHJvZmlsZS0+bmV4dCA9IHJhcy5jUHJvZmlsZTsKLSAgICAgIHJhcy5udW1fUHJvZnMrKzsKLSAgICB9Ci0KLSAgICBpZiAoIHJhcy50b3AgPj0gcmFzLm1heEJ1ZmYgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJvdmVyZmxvdyBpbiBFbmRfUHJvZmlsZVxuIiApKTsKLSAgICAgIHJhcy5lcnJvciA9IEZUX1RIUk9XKCBPdmVyZmxvdyApOwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgcmFzLmpvaW50ID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zZXJ0X1lfVHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zZXJ0IGEgc2FsaWVudCBpbnRvIHRoZSBzb3J0ZWQgbGlzdCBwbGFjZWQgb24gdG9wIG9mIHRoZSByZW5kZXIgICovCi0gIC8qICAgIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5ldyB5IHNjYW5saW5lIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgSW5zZXJ0X1lfVHVybiggUkFTX0FSR1MgSW50ICB5ICkKLSAgewotICAgIFBMb25nICB5X3R1cm5zOwotICAgIEludCAgICBuOwotCi0KLSAgICBuICAgICAgID0gcmFzLm51bVR1cm5zIC0gMTsKLSAgICB5X3R1cm5zID0gcmFzLnNpemVCdWZmIC0gcmFzLm51bVR1cm5zOwotCi0gICAgLyogbG9vayBmb3IgZmlyc3QgeSB2YWx1ZSB0aGF0IGlzIDw9ICovCi0gICAgd2hpbGUgKCBuID49IDAgJiYgeSA8IHlfdHVybnNbbl0gKQotICAgICAgbi0tOwotCi0gICAgLyogaWYgaXQgaXMgPCwgc2ltcGx5IGluc2VydCBpdCwgaWdub3JlIGlmID09ICovCi0gICAgaWYgKCBuID49IDAgJiYgeSA+IHlfdHVybnNbbl0gKQotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgSW50ICB5MiA9IChJbnQpeV90dXJuc1tuXTsKLQotCi0gICAgICAgIHlfdHVybnNbbl0gPSB5OwotICAgICAgICB5ID0geTI7Ci0gICAgICB9IHdoaWxlICggLS1uID49IDAgKTsKLQotICAgIGlmICggbiA8IDAgKQotICAgIHsKLSAgICAgIHJhcy5tYXhCdWZmLS07Ci0gICAgICBpZiAoIHJhcy5tYXhCdWZmIDw9IHJhcy50b3AgKQotICAgICAgewotICAgICAgICByYXMuZXJyb3IgPSBGVF9USFJPVyggT3ZlcmZsb3cgKTsKLSAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICB9Ci0gICAgICByYXMubnVtVHVybnMrKzsKLSAgICAgIHJhcy5zaXplQnVmZlstcmFzLm51bVR1cm5zXSA9IHk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplX1Byb2ZpbGVfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkanVzdCBhbGwgbGlua3MgaW4gdGhlIHByb2ZpbGVzIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgRmluYWxpemVfUHJvZmlsZV9UYWJsZSggUkFTX0FSRyApCi0gIHsKLSAgICBVU2hvcnQgICAgbjsKLSAgICBQUHJvZmlsZSAgcDsKLQotCi0gICAgbiA9IHJhcy5udW1fUHJvZnM7Ci0gICAgcCA9IHJhcy5mUHJvZmlsZTsKLQotICAgIGlmICggbiA+IDEgJiYgcCApCi0gICAgewotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgSW50ICBib3R0b20sIHRvcDsKLQotCi0gICAgICAgIGlmICggbiA+IDEgKQotICAgICAgICAgIHAtPmxpbmsgPSAoUFByb2ZpbGUpKCBwLT5vZmZzZXQgKyBwLT5oZWlnaHQgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHAtPmxpbmsgPSBOVUxMOwotCi0gICAgICAgIGlmICggcC0+ZmxhZ3MgJiBGbG93X1VwICkKLSAgICAgICAgewotICAgICAgICAgIGJvdHRvbSA9IChJbnQpcC0+c3RhcnQ7Ci0gICAgICAgICAgdG9wICAgID0gKEludCkoIHAtPnN0YXJ0ICsgcC0+aGVpZ2h0IC0gMSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJvdHRvbSAgICAgPSAoSW50KSggcC0+c3RhcnQgLSBwLT5oZWlnaHQgKyAxICk7Ci0gICAgICAgICAgdG9wICAgICAgICA9IChJbnQpcC0+c3RhcnQ7Ci0gICAgICAgICAgcC0+c3RhcnQgICA9IGJvdHRvbTsKLSAgICAgICAgICBwLT5vZmZzZXQgKz0gcC0+aGVpZ2h0IC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggSW5zZXJ0X1lfVHVybiggUkFTX1ZBUlMgYm90dG9tICkgIHx8Ci0gICAgICAgICAgICAgSW5zZXJ0X1lfVHVybiggUkFTX1ZBUlMgdG9wICsgMSApICkKLSAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLQotICAgICAgICBwID0gcC0+bGluazsKLSAgICAgIH0gd2hpbGUgKCAtLW4gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmFzLmZQcm9maWxlID0gTlVMTDsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTcGxpdF9Db25pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdWJkaXZpZGUgb25lIGNvbmljIEJlemllciBpbnRvIHR3byBqb2ludCBzdWItYXJjcyBpbiB0aGUgQmV6aWVyICAgKi8KLSAgLyogICAgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm9uZSAoc3ViZGl2aWRlZCBCZXppZXIgaXMgdGFrZW4gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjaykuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyByb3V0aW5lIGlzIHRoZSBgYmVlZicgb2YgdGhpcyBjb21wb25lbnQuICBJdCBpcyAgX3RoZV8gaW5uZXIgICovCi0gIC8qICAgIGxvb3AgdGhhdCBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGhlbGwgdG8gZ2V0IHRoZSBiZXN0IHBlcmZvcm1hbmNlLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgU3BsaXRfQ29uaWMoIFRQb2ludCogIGJhc2UgKQotICB7Ci0gICAgTG9uZyAgYSwgYjsKLQotCi0gICAgYmFzZVs0XS54ID0gYmFzZVsyXS54OwotICAgIGIgPSBiYXNlWzFdLng7Ci0gICAgYSA9IGJhc2VbM10ueCA9ICggYmFzZVsyXS54ICsgYiApIC8gMjsKLSAgICBiID0gYmFzZVsxXS54ID0gKCBiYXNlWzBdLnggKyBiICkgLyAyOwotICAgIGJhc2VbMl0ueCA9ICggYSArIGIgKSAvIDI7Ci0KLSAgICBiYXNlWzRdLnkgPSBiYXNlWzJdLnk7Ci0gICAgYiA9IGJhc2VbMV0ueTsKLSAgICBhID0gYmFzZVszXS55ID0gKCBiYXNlWzJdLnkgKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnkgPSAoIGJhc2VbMF0ueSArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gKCBhICsgYiApIC8gMjsKLQotICAgIC8qIGhhbmQgb3B0aW1pemVkLiAgZ2NjIGRvZXNuJ3Qgc2VlbSB0byBiZSB0b28gZ29vZCBhdCBjb21tb24gICAgICAqLwotICAgIC8qIGV4cHJlc3Npb24gc3Vic3RpdHV0aW9uIGFuZCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nIDstKSAgICAgICAgICAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTcGxpdF9DdWJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdWJkaXZpZGUgYSB0aGlyZC1vcmRlciBCZXppZXIgYXJjIGludG8gdHdvIGpvaW50IHN1Yi1hcmNzIGluIHRoZSAgKi8KLSAgLyogICAgQmV6aWVyIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyByb3V0aW5lIGlzIHRoZSBgYmVlZicgb2YgdGhlIGNvbXBvbmVudC4gIEl0IGlzIG9uZSBvZiBfdGhlXyAgICovCi0gIC8qICAgIGlubmVyIGxvb3BzIHRoYXQgc2hvdWxkIGJlIG9wdGltaXplZCBsaWtlIGhlbGwgdG8gZ2V0IHRoZSBiZXN0ICAgICAqLwotICAvKiAgICBwZXJmb3JtYW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIFNwbGl0X0N1YmljKCBUUG9pbnQqICBiYXNlICkKLSAgewotICAgIExvbmcgIGEsIGIsIGMsIGQ7Ci0KLQotICAgIGJhc2VbNl0ueCA9IGJhc2VbM10ueDsKLSAgICBjID0gYmFzZVsxXS54OwotICAgIGQgPSBiYXNlWzJdLng7Ci0gICAgYmFzZVsxXS54ID0gYSA9ICggYmFzZVswXS54ICsgYyArIDEgKSA+PiAxOwotICAgIGJhc2VbNV0ueCA9IGIgPSAoIGJhc2VbM10ueCArIGQgKyAxICkgPj4gMTsKLSAgICBjID0gKCBjICsgZCArIDEgKSA+PiAxOwotICAgIGJhc2VbMl0ueCA9IGEgPSAoIGEgKyBjICsgMSApID4+IDE7Ci0gICAgYmFzZVs0XS54ID0gYiA9ICggYiArIGMgKyAxICkgPj4gMTsKLSAgICBiYXNlWzNdLnggPSAoIGEgKyBiICsgMSApID4+IDE7Ci0KLSAgICBiYXNlWzZdLnkgPSBiYXNlWzNdLnk7Ci0gICAgYyA9IGJhc2VbMV0ueTsKLSAgICBkID0gYmFzZVsyXS55OwotICAgIGJhc2VbMV0ueSA9IGEgPSAoIGJhc2VbMF0ueSArIGMgKyAxICkgPj4gMTsKLSAgICBiYXNlWzVdLnkgPSBiID0gKCBiYXNlWzNdLnkgKyBkICsgMSApID4+IDE7Ci0gICAgYyA9ICggYyArIGQgKyAxICkgPj4gMTsKLSAgICBiYXNlWzJdLnkgPSBhID0gKCBhICsgYyArIDEgKSA+PiAxOwotICAgIGJhc2VbNF0ueSA9IGIgPSAoIGIgKyBjICsgMSApID4+IDE7Ci0gICAgYmFzZVszXS55ID0gKCBhICsgYiArIDEgKSA+PiAxOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaW5lX1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGVzIG9mIGFuIGFzY2VuZGluZyBsaW5lIHNlZ21lbnQgYW5kIHN0b3JlICAgKi8KLSAgLyogICAgdGhlbSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeDEgICA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3Mgc3RhcnQgcG9pbnQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MSAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBzdGFydCBwb2ludC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHgyICAgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTIgICA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW55IDo6IEEgbG93ZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heHkgOjogQW4gdXBwZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgTGluZV9VcCggUkFTX0FSR1MgTG9uZyAgeDEsCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIHkxLAotICAgICAgICAgICAgICAgICAgICBMb25nICB4MiwKLSAgICAgICAgICAgICAgICAgICAgTG9uZyAgeTIsCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIG1pbnksCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIG1heHkgKQotICB7Ci0gICAgTG9uZyAgIER4LCBEeTsKLSAgICBJbnQgICAgZTEsIGUyLCBmMSwgZjIsIHNpemU7ICAgICAvKiBYWFg6IGlzIGBTaG9ydCcgc3VmZmljaWVudD8gKi8KLSAgICBMb25nICAgSXgsIFJ4LCBBeDsKLQotICAgIFBMb25nICB0b3A7Ci0KLQotICAgIER4ID0geDIgLSB4MTsKLSAgICBEeSA9IHkyIC0geTE7Ci0KLSAgICBpZiAoIER5IDw9IDAgfHwgeTIgPCBtaW55IHx8IHkxID4gbWF4eSApCi0gICAgICByZXR1cm4gU1VDQ0VTUzsKLQotICAgIGlmICggeTEgPCBtaW55ICkKLSAgICB7Ci0gICAgICAvKiBUYWtlIGNhcmU6IG1pbnkteTEgY2FuIGJlIGEgdmVyeSBsYXJnZSB2YWx1ZTsgd2UgdXNlICAgICAqLwotICAgICAgLyogICAgICAgICAgICBhIHNsb3cgTXVsRGl2IGZ1bmN0aW9uIHRvIGF2b2lkIGNsaXBwaW5nIGJ1Z3MgKi8KLSAgICAgIHgxICs9IFNNdWxEaXYoIER4LCBtaW55IC0geTEsIER5ICk7Ci0gICAgICBlMSAgPSAoSW50KVRSVU5DKCBtaW55ICk7Ci0gICAgICBmMSAgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZTEgPSAoSW50KVRSVU5DKCB5MSApOwotICAgICAgZjEgPSAoSW50KUZSQUMoIHkxICk7Ci0gICAgfQotCi0gICAgaWYgKCB5MiA+IG1heHkgKQotICAgIHsKLSAgICAgIC8qIHgyICs9IEZNdWxEaXYoIER4LCBtYXh5IC0geTIsIER5ICk7ICBVTk5FQ0VTU0FSWSAqLwotICAgICAgZTIgID0gKEludClUUlVOQyggbWF4eSApOwotICAgICAgZjIgID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGUyID0gKEludClUUlVOQyggeTIgKTsKLSAgICAgIGYyID0gKEludClGUkFDKCB5MiApOwotICAgIH0KLQotICAgIGlmICggZjEgPiAwICkKLSAgICB7Ci0gICAgICBpZiAoIGUxID09IGUyICkKLSAgICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHgxICs9IFNNdWxEaXYoIER4LCByYXMucHJlY2lzaW9uIC0gZjEsIER5ICk7Ci0gICAgICAgIGUxICs9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGlmICggcmFzLmpvaW50ICkKLSAgICAgIHsKLSAgICAgICAgcmFzLnRvcC0tOwotICAgICAgICByYXMuam9pbnQgPSBGQUxTRTsKLSAgICAgIH0KLQotICAgIHJhcy5qb2ludCA9IChjaGFyKSggZjIgPT0gMCApOwotCi0gICAgaWYgKCByYXMuZnJlc2ggKQotICAgIHsKLSAgICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgPSBlMTsKLSAgICAgIHJhcy5mcmVzaCAgICAgICAgICAgPSBGQUxTRTsKLSAgICB9Ci0KLSAgICBzaXplID0gZTIgLSBlMSArIDE7Ci0gICAgaWYgKCByYXMudG9wICsgc2l6ZSA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIE92ZXJmbG93ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBpZiAoIER4ID4gMCApCi0gICAgewotICAgICAgSXggPSBTTXVsRGl2X05vX1JvdW5kKCByYXMucHJlY2lzaW9uLCBEeCwgRHkgKTsKLSAgICAgIFJ4ID0gKCByYXMucHJlY2lzaW9uICogRHggKSAlIER5OwotICAgICAgRHggPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSXggPSAtU011bERpdl9Ob19Sb3VuZCggcmFzLnByZWNpc2lvbiwgLUR4LCBEeSApOwotICAgICAgUnggPSAoIHJhcy5wcmVjaXNpb24gKiAtRHggKSAlIER5OwotICAgICAgRHggPSAtMTsKLSAgICB9Ci0KLSAgICBBeCAgPSAtRHk7Ci0gICAgdG9wID0gcmFzLnRvcDsKLQotICAgIHdoaWxlICggc2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICp0b3ArKyA9IHgxOwotCi0gICAgICB4MSArPSBJeDsKLSAgICAgIEF4ICs9IFJ4OwotICAgICAgaWYgKCBBeCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgQXggLT0gRHk7Ci0gICAgICAgIHgxICs9IER4OwotICAgICAgfQotICAgICAgc2l6ZS0tOwotICAgIH0KLQotICAgIHJhcy50b3AgPSB0b3A7Ci0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gZGVzY2VuZGluZyBsaW5lIHNlZ21lbnQgYW5kIHN0b3JlICAqLwotICAvKiAgICB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4MSAgIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBzdGFydCBwb2ludC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkxICAgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIHN0YXJ0IHBvaW50LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeDIgICA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MiAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBlbmQgcG9pbnQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbnkgOjogQSBsb3dlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4eSA6OiBBbiB1cHBlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBMaW5lX0Rvd24oIFJBU19BUkdTIExvbmcgIHgxLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgIHkxLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgIHgyLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgIHkyLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgIG1pbnksCi0gICAgICAgICAgICAgICAgICAgICAgTG9uZyAgbWF4eSApCi0gIHsKLSAgICBCb29sICByZXN1bHQsIGZyZXNoOwotCi0KLSAgICBmcmVzaCAgPSByYXMuZnJlc2g7Ci0KLSAgICByZXN1bHQgPSBMaW5lX1VwKCBSQVNfVkFSUyB4MSwgLXkxLCB4MiwgLXkyLCAtbWF4eSwgLW1pbnkgKTsKLQotICAgIGlmICggZnJlc2ggJiYgIXJhcy5mcmVzaCApCi0gICAgICByYXMuY1Byb2ZpbGUtPnN0YXJ0ID0gLXJhcy5jUHJvZmlsZS0+c3RhcnQ7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBBIGZ1bmN0aW9uIHR5cGUgZGVzY3JpYmluZyB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gc3BsaXQgQmV6aWVyIGFyY3MgKi8KLSAgdHlwZWRlZiB2b2lkICAoKlRTcGxpdHRlcikoIFRQb2ludCogIGJhc2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlemllcl9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gYXNjZW5kaW5nIEJlemllciBhcmMgYW5kIHN0b3JlICAgICAqLwotICAvKiAgICB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWdyZWUgICA6OiBUaGUgZGVncmVlIG9mIHRoZSBCZXppZXIgYXJjIChlaXRoZXIgMiBvciAzKS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwbGl0dGVyIDo6IFRoZSBmdW5jdGlvbiB0byBzcGxpdCBCZXppZXIgYXJjcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWlueSAgICAgOjogQSBsb3dlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXh5ICAgICA6OiBBbiB1cHBlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gcmVuZGVyIHBvb2wgb3ZlcmZsb3cuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBCb29sCi0gIEJlemllcl9VcCggUkFTX0FSR1MgSW50ICAgICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgVFNwbGl0dGVyICBzcGxpdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICBMb25nICAgICAgIG1pbnksCi0gICAgICAgICAgICAgICAgICAgICAgTG9uZyAgICAgICBtYXh5ICkKLSAgewotICAgIExvbmcgICB5MSwgeTIsIGUsIGUyLCBlMDsKLSAgICBTaG9ydCAgZjE7Ci0KLSAgICBUUG9pbnQqICBhcmM7Ci0gICAgVFBvaW50KiAgc3RhcnRfYXJjOwotCi0gICAgUExvbmcgdG9wOwotCi0KLSAgICBhcmMgPSByYXMuYXJjOwotICAgIHkxICA9IGFyY1tkZWdyZWVdLnk7Ci0gICAgeTIgID0gYXJjWzBdLnk7Ci0gICAgdG9wID0gcmFzLnRvcDsKLQotICAgIGlmICggeTIgPCBtaW55IHx8IHkxID4gbWF4eSApCi0gICAgICBnb3RvIEZpbjsKLQotICAgIGUyID0gRkxPT1IoIHkyICk7Ci0KLSAgICBpZiAoIGUyID4gbWF4eSApCi0gICAgICBlMiA9IG1heHk7Ci0KLSAgICBlMCA9IG1pbnk7Ci0KLSAgICBpZiAoIHkxIDwgbWlueSApCi0gICAgICBlID0gbWlueTsKLSAgICBlbHNlCi0gICAgewotICAgICAgZSAgPSBDRUlMSU5HKCB5MSApOwotICAgICAgZjEgPSAoU2hvcnQpKCBGUkFDKCB5MSApICk7Ci0gICAgICBlMCA9IGU7Ci0KLSAgICAgIGlmICggZjEgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggcmFzLmpvaW50ICkKLSAgICAgICAgewotICAgICAgICAgIHRvcC0tOwotICAgICAgICAgIHJhcy5qb2ludCA9IEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgKnRvcCsrID0gYXJjW2RlZ3JlZV0ueDsKLQotICAgICAgICBlICs9IHJhcy5wcmVjaXNpb247Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCByYXMuZnJlc2ggKQotICAgIHsKLSAgICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgPSBUUlVOQyggZTAgKTsKLSAgICAgIHJhcy5mcmVzaCA9IEZBTFNFOwotICAgIH0KLQotICAgIGlmICggZTIgPCBlICkKLSAgICAgIGdvdG8gRmluOwotCi0gICAgaWYgKCAoIHRvcCArIFRSVU5DKCBlMiAtIGUgKSArIDEgKSA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgcmFzLnRvcCAgID0gdG9wOwotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIE92ZXJmbG93ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBzdGFydF9hcmMgPSBhcmM7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIHJhcy5qb2ludCA9IEZBTFNFOwotCi0gICAgICB5MiA9IGFyY1swXS55OwotCi0gICAgICBpZiAoIHkyID4gZSApCi0gICAgICB7Ci0gICAgICAgIHkxID0gYXJjW2RlZ3JlZV0ueTsKLSAgICAgICAgaWYgKCB5MiAtIHkxID49IHJhcy5wcmVjaXNpb25fc3RlcCApCi0gICAgICAgIHsKLSAgICAgICAgICBzcGxpdHRlciggYXJjICk7Ci0gICAgICAgICAgYXJjICs9IGRlZ3JlZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqdG9wKysgPSBhcmNbZGVncmVlXS54ICsgRk11bERpdiggYXJjWzBdLnggLSBhcmNbZGVncmVlXS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIC0geTEsIHkyIC0geTEgKTsKLSAgICAgICAgICBhcmMgLT0gZGVncmVlOwotICAgICAgICAgIGUgICArPSByYXMucHJlY2lzaW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggeTIgPT0gZSApCi0gICAgICAgIHsKLSAgICAgICAgICByYXMuam9pbnQgID0gVFJVRTsKLSAgICAgICAgICAqdG9wKysgICAgID0gYXJjWzBdLng7Ci0KLSAgICAgICAgICBlICs9IHJhcy5wcmVjaXNpb247Ci0gICAgICAgIH0KLSAgICAgICAgYXJjIC09IGRlZ3JlZTsKLSAgICAgIH0KLSAgICB9IHdoaWxlICggYXJjID49IHN0YXJ0X2FyYyAmJiBlIDw9IGUyICk7Ci0KLSAgRmluOgotICAgIHJhcy50b3AgID0gdG9wOwotICAgIHJhcy5hcmMgLT0gZGVncmVlOwotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCZXppZXJfRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGVzIG9mIGFuIGRlc2NlbmRpbmcgQmV6aWVyIGFyYyBhbmQgc3RvcmUgICAgKi8KLSAgLyogICAgdGhlbSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVncmVlICAgOjogVGhlIGRlZ3JlZSBvZiB0aGUgQmV6aWVyIGFyYyAoZWl0aGVyIDIgb3IgMykuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzcGxpdHRlciA6OiBUaGUgZnVuY3Rpb24gdG8gc3BsaXQgQmV6aWVyIGFyY3MuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbnkgICAgIDo6IEEgbG93ZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4eSAgICAgOjogQW4gdXBwZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBCZXppZXJfRG93biggUkFTX0FSR1MgSW50ICAgICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUU3BsaXR0ZXIgIHNwbGl0dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgTG9uZyAgICAgICBtaW55LAotICAgICAgICAgICAgICAgICAgICAgICAgTG9uZyAgICAgICBtYXh5ICkKLSAgewotICAgIFRQb2ludCogIGFyYyA9IHJhcy5hcmM7Ci0gICAgQm9vbCAgICAgcmVzdWx0LCBmcmVzaDsKLQotCi0gICAgYXJjWzBdLnkgPSAtYXJjWzBdLnk7Ci0gICAgYXJjWzFdLnkgPSAtYXJjWzFdLnk7Ci0gICAgYXJjWzJdLnkgPSAtYXJjWzJdLnk7Ci0gICAgaWYgKCBkZWdyZWUgPiAyICkKLSAgICAgIGFyY1szXS55ID0gLWFyY1szXS55OwotCi0gICAgZnJlc2ggPSByYXMuZnJlc2g7Ci0KLSAgICByZXN1bHQgPSBCZXppZXJfVXAoIFJBU19WQVJTIGRlZ3JlZSwgc3BsaXR0ZXIsIC1tYXh5LCAtbWlueSApOwotCi0gICAgaWYgKCBmcmVzaCAmJiAhcmFzLmZyZXNoICkKLSAgICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgPSAtcmFzLmNQcm9maWxlLT5zdGFydDsKLQotICAgIGFyY1swXS55ID0gLWFyY1swXS55OwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluamVjdCBhIG5ldyBsaW5lIHNlZ21lbnQgYW5kIGFkanVzdCB0aGUgUHJvZmlsZXMgbGlzdC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeCA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgICAqLwotICAvKiAgICAgICAgaXMgc3RvcmVkIGluIGBsYXN0WCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeSA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgICAqLwotICAvKiAgICAgICAgaXMgc3RvcmVkIGluIGBsYXN0WScpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QgICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBMaW5lX1RvKCBSQVNfQVJHUyBMb25nICB4LAotICAgICAgICAgICAgICAgICAgICBMb25nICB5ICkKLSAgewotICAgIC8qIEZpcnN0LCBkZXRlY3QgYSBjaGFuZ2Ugb2YgZGlyZWN0aW9uICovCi0KLSAgICBzd2l0Y2ggKCByYXMuc3RhdGUgKQotICAgIHsKLSAgICBjYXNlIFVua25vd25fU3RhdGU6Ci0gICAgICBpZiAoIHkgPiByYXMubGFzdFkgKQotICAgICAgewotICAgICAgICBpZiAoIE5ld19Qcm9maWxlKCBSQVNfVkFSUyBBc2NlbmRpbmdfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0JPVFRPTV9PVkVSU0hPT1QoIHJhcy5sYXN0WSApICkgKQotICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIHkgPCByYXMubGFzdFkgKQotICAgICAgICAgIGlmICggTmV3X1Byb2ZpbGUoIFJBU19WQVJTIERlc2NlbmRpbmdfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfVE9QX09WRVJTSE9PVCggcmFzLmxhc3RZICkgKSApCi0gICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIHkgPCByYXMubGFzdFkgKQotICAgICAgewotICAgICAgICBpZiAoIEVuZF9Qcm9maWxlKCBSQVNfVkFSUyBJU19UT1BfT1ZFUlNIT09UKCByYXMubGFzdFkgKSApIHx8Ci0gICAgICAgICAgICAgTmV3X1Byb2ZpbGUoIFJBU19WQVJTIERlc2NlbmRpbmdfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX1RPUF9PVkVSU0hPT1QoIHJhcy5sYXN0WSApICkgKQotICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERlc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIHkgPiByYXMubGFzdFkgKQotICAgICAgewotICAgICAgICBpZiAoIEVuZF9Qcm9maWxlKCBSQVNfVkFSUyBJU19CT1RUT01fT1ZFUlNIT09UKCByYXMubGFzdFkgKSApIHx8Ci0gICAgICAgICAgICAgTmV3X1Byb2ZpbGUoIFJBU19WQVJTIEFzY2VuZGluZ19TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfQk9UVE9NX09WRVJTSE9PVCggcmFzLmxhc3RZICkgKSApCi0gICAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gICAgfQotCi0gICAgLyogVGhlbiBjb21wdXRlIHRoZSBsaW5lcyAqLwotCi0gICAgc3dpdGNoICggcmFzLnN0YXRlICkKLSAgICB7Ci0gICAgY2FzZSBBc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIExpbmVfVXAoIFJBU19WQVJTIHJhcy5sYXN0WCwgcmFzLmxhc3RZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERlc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIExpbmVfRG93biggUkFTX1ZBUlMgcmFzLmxhc3RYLCByYXMubGFzdFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgcmFzLm1pblksIHJhcy5tYXhZICkgKQotICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIDsKLSAgICB9Ci0KLSAgICByYXMubGFzdFggPSB4OwotICAgIHJhcy5sYXN0WSA9IHk7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29uaWNfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5qZWN0IGEgbmV3IGNvbmljIGFyYyBhbmQgYWRqdXN0IHRoZSBwcm9maWxlIGxpc3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjeCA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBuZXcgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN5IDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIG5ldyBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeCAgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgaXMgICAqLwotICAvKiAgICAgICAgIHN0b3JlZCBpbiBgbGFzdFgnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeSAgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgaXMgICAqLwotICAvKiAgICAgICAgIHN0b3JlZCBpbiBgbGFzdFknKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QgICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBDb25pY19UbyggUkFTX0FSR1MgTG9uZyAgY3gsCi0gICAgICAgICAgICAgICAgICAgICBMb25nICBjeSwKLSAgICAgICAgICAgICAgICAgICAgIExvbmcgIHgsCi0gICAgICAgICAgICAgICAgICAgICBMb25nICB5ICkKLSAgewotICAgIExvbmcgICAgIHkxLCB5MiwgeTMsIHgzLCB5bWluLCB5bWF4OwotICAgIFRTdGF0ZXMgIHN0YXRlX2JlejsKLQotCi0gICAgcmFzLmFyYyAgICAgID0gcmFzLmFyY3M7Ci0gICAgcmFzLmFyY1syXS54ID0gcmFzLmxhc3RYOwotICAgIHJhcy5hcmNbMl0ueSA9IHJhcy5sYXN0WTsKLSAgICByYXMuYXJjWzFdLnggPSBjeDsKLSAgICByYXMuYXJjWzFdLnkgPSBjeTsKLSAgICByYXMuYXJjWzBdLnggPSB4OwotICAgIHJhcy5hcmNbMF0ueSA9IHk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIHkxID0gcmFzLmFyY1syXS55OwotICAgICAgeTIgPSByYXMuYXJjWzFdLnk7Ci0gICAgICB5MyA9IHJhcy5hcmNbMF0ueTsKLSAgICAgIHgzID0gcmFzLmFyY1swXS54OwotCi0gICAgICAvKiBmaXJzdCwgY2F0ZWdvcml6ZSB0aGUgQmV6aWVyIGFyYyAqLwotCi0gICAgICBpZiAoIHkxIDw9IHkzICkKLSAgICAgIHsKLSAgICAgICAgeW1pbiA9IHkxOwotICAgICAgICB5bWF4ID0geTM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHltaW4gPSB5MzsKLSAgICAgICAgeW1heCA9IHkxOwotICAgICAgfQotCi0gICAgICBpZiAoIHkyIDwgeW1pbiB8fCB5MiA+IHltYXggKQotICAgICAgewotICAgICAgICAvKiB0aGlzIGFyYyBoYXMgbm8gZ2l2ZW4gZGlyZWN0aW9uLCBzcGxpdCBpdCEgKi8KLSAgICAgICAgU3BsaXRfQ29uaWMoIHJhcy5hcmMgKTsKLSAgICAgICAgcmFzLmFyYyArPSAyOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHkxID09IHkzICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcyBhcmMgaXMgZmxhdCwgaWdub3JlIGl0IGFuZCBwb3AgaXQgZnJvbSB0aGUgQmV6aWVyIHN0YWNrICovCi0gICAgICAgIHJhcy5hcmMgLT0gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogdGhlIGFyYyBpcyB5LW1vbm90b25vdXMsIGVpdGhlciBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyAqLwotICAgICAgICAvKiBkZXRlY3QgYSBjaGFuZ2Ugb2YgZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHN0YXRlX2JleiA9IHkxIDwgeTMgPyBBc2NlbmRpbmdfU3RhdGUgOiBEZXNjZW5kaW5nX1N0YXRlOwotICAgICAgICBpZiAoIHJhcy5zdGF0ZSAhPSBzdGF0ZV9iZXogKQotICAgICAgICB7Ci0gICAgICAgICAgQm9vbCAgbyA9ICggc3RhdGVfYmV6ID09IEFzY2VuZGluZ19TdGF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgPyBJU19CT1RUT01fT1ZFUlNIT09UKCB5MSApCi0gICAgICAgICAgICAgICAgICAgICAgOiBJU19UT1BfT1ZFUlNIT09UKCB5MSApOwotCi0KLSAgICAgICAgICAvKiBmaW5hbGl6ZSBjdXJyZW50IHByb2ZpbGUgaWYgYW55ICovCi0gICAgICAgICAgaWYgKCByYXMuc3RhdGUgIT0gVW5rbm93bl9TdGF0ZSAmJgotICAgICAgICAgICAgICAgRW5kX1Byb2ZpbGUoIFJBU19WQVJTIG8gKSAgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgLyogY3JlYXRlIGEgbmV3IHByb2ZpbGUgKi8KLSAgICAgICAgICBpZiAoIE5ld19Qcm9maWxlKCBSQVNfVkFSUyBzdGF0ZV9iZXosIG8gKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgY2FsbCB0aGUgYXBwcm9wcmlhdGUgcm91dGluZSAqLwotICAgICAgICBpZiAoIHN0YXRlX2JleiA9PSBBc2NlbmRpbmdfU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBCZXppZXJfVXAoIFJBU19WQVJTIDIsIFNwbGl0X0NvbmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmICggQmV6aWVyX0Rvd24oIFJBU19WQVJTIDIsIFNwbGl0X0NvbmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICB9IHdoaWxlICggcmFzLmFyYyA+PSByYXMuYXJjcyApOwotCi0gICAgcmFzLmxhc3RYID0geDM7Ci0gICAgcmFzLmxhc3RZID0geTM7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBGYWlsOgotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdWJpY19UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmplY3QgYSBuZXcgY3ViaWMgYXJjIGFuZCBhZGp1c3QgdGhlIHByb2ZpbGUgbGlzdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN4MSA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBmaXJzdCBuZXcgY29udHJvbCBwb2ludC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY3kxIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGZpcnN0IG5ldyBjb250cm9sIHBvaW50LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjeDIgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3Mgc2Vjb25kIG5ldyBjb250cm9sIHBvaW50LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN5MiA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBzZWNvbmQgbmV3IGNvbnRyb2wgcG9pbnQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeCAgIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzICAqLwotICAvKiAgICAgICAgICBzdG9yZWQgaW4gYGxhc3RYJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeSAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzICAqLwotICAvKiAgICAgICAgICBzdG9yZWQgaW4gYGxhc3RZJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QgICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBDdWJpY19UbyggUkFTX0FSR1MgTG9uZyAgY3gxLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3kxLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3gyLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3kyLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgeCwKLSAgICAgICAgICAgICAgICAgICAgIExvbmcgIHkgKQotICB7Ci0gICAgTG9uZyAgICAgeTEsIHkyLCB5MywgeTQsIHg0LCB5bWluMSwgeW1heDEsIHltaW4yLCB5bWF4MjsKLSAgICBUU3RhdGVzICBzdGF0ZV9iZXo7Ci0KLQotICAgIHJhcy5hcmMgICAgICA9IHJhcy5hcmNzOwotICAgIHJhcy5hcmNbM10ueCA9IHJhcy5sYXN0WDsKLSAgICByYXMuYXJjWzNdLnkgPSByYXMubGFzdFk7Ci0gICAgcmFzLmFyY1syXS54ID0gY3gxOwotICAgIHJhcy5hcmNbMl0ueSA9IGN5MTsKLSAgICByYXMuYXJjWzFdLnggPSBjeDI7Ci0gICAgcmFzLmFyY1sxXS55ID0gY3kyOwotICAgIHJhcy5hcmNbMF0ueCA9IHg7Ci0gICAgcmFzLmFyY1swXS55ID0geTsKLQotICAgIGRvCi0gICAgewotICAgICAgeTEgPSByYXMuYXJjWzNdLnk7Ci0gICAgICB5MiA9IHJhcy5hcmNbMl0ueTsKLSAgICAgIHkzID0gcmFzLmFyY1sxXS55OwotICAgICAgeTQgPSByYXMuYXJjWzBdLnk7Ci0gICAgICB4NCA9IHJhcy5hcmNbMF0ueDsKLQotICAgICAgLyogZmlyc3QsIGNhdGVnb3JpemUgdGhlIEJlemllciBhcmMgKi8KLQotICAgICAgaWYgKCB5MSA8PSB5NCApCi0gICAgICB7Ci0gICAgICAgIHltaW4xID0geTE7Ci0gICAgICAgIHltYXgxID0geTQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHltaW4xID0geTQ7Ci0gICAgICAgIHltYXgxID0geTE7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggeTIgPD0geTMgKQotICAgICAgewotICAgICAgICB5bWluMiA9IHkyOwotICAgICAgICB5bWF4MiA9IHkzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB5bWluMiA9IHkzOwotICAgICAgICB5bWF4MiA9IHkyOwotICAgICAgfQotCi0gICAgICBpZiAoIHltaW4yIDwgeW1pbjEgfHwgeW1heDIgPiB5bWF4MSApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgYXJjIGhhcyBubyBnaXZlbiBkaXJlY3Rpb24sIHNwbGl0IGl0ISAqLwotICAgICAgICBTcGxpdF9DdWJpYyggcmFzLmFyYyApOwotICAgICAgICByYXMuYXJjICs9IDM7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggeTEgPT0geTQgKQotICAgICAgewotICAgICAgICAvKiB0aGlzIGFyYyBpcyBmbGF0LCBpZ25vcmUgaXQgYW5kIHBvcCBpdCBmcm9tIHRoZSBCZXppZXIgc3RhY2sgKi8KLSAgICAgICAgcmFzLmFyYyAtPSAzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdGF0ZV9iZXogPSAoIHkxIDw9IHk0ICkgPyBBc2NlbmRpbmdfU3RhdGUgOiBEZXNjZW5kaW5nX1N0YXRlOwotCi0gICAgICAgIC8qIGRldGVjdCBhIGNoYW5nZSBvZiBkaXJlY3Rpb24gKi8KLSAgICAgICAgaWYgKCByYXMuc3RhdGUgIT0gc3RhdGVfYmV6ICkKLSAgICAgICAgewotICAgICAgICAgIEJvb2wgIG8gPSAoIHN0YXRlX2JleiA9PSBBc2NlbmRpbmdfU3RhdGUgKQotICAgICAgICAgICAgICAgICAgICAgID8gSVNfQk9UVE9NX09WRVJTSE9PVCggeTEgKQotICAgICAgICAgICAgICAgICAgICAgIDogSVNfVE9QX09WRVJTSE9PVCggeTEgKTsKLQotCi0gICAgICAgICAgLyogZmluYWxpemUgY3VycmVudCBwcm9maWxlIGlmIGFueSAqLwotICAgICAgICAgIGlmICggcmFzLnN0YXRlICE9IFVua25vd25fU3RhdGUgJiYKLSAgICAgICAgICAgICAgIEVuZF9Qcm9maWxlKCBSQVNfVkFSUyBvICkgICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIGlmICggTmV3X1Byb2ZpbGUoIFJBU19WQVJTIHN0YXRlX2JleiwgbyApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbXB1dGUgaW50ZXJzZWN0aW9ucyAqLwotICAgICAgICBpZiAoIHN0YXRlX2JleiA9PSBBc2NlbmRpbmdfU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBCZXppZXJfVXAoIFJBU19WQVJTIDMsIFNwbGl0X0N1YmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmICggQmV6aWVyX0Rvd24oIFJBU19WQVJTIDMsIFNwbGl0X0N1YmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICB9IHdoaWxlICggcmFzLmFyYyA+PSByYXMuYXJjcyApOwotCi0gICAgcmFzLmxhc3RYID0geDQ7Ci0gICAgcmFzLmxhc3RZID0geTQ7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBGYWlsOgotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotI3VuZGVmICBTV0FQXwotI2RlZmluZSBTV0FQXyggeCwgeSApICBkbyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb25nICBzd2FwID0geDsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geTsgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBzd2FwOyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlY29tcG9zZV9DdXJ2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNjYW4gdGhlIG91dGxpbmUgYXJyYXlzIGluIG9yZGVyIHRvIGVtaXQgaW5kaXZpZHVhbCBzZWdtZW50cyBhbmQgICAqLwotICAvKiAgICBCZXppZXJzIGJ5IGNhbGxpbmcgTGluZV9UbygpIGFuZCBCZXppZXJfVG8oKS4gIEl0IGhhbmRsZXMgYWxsICAgICAgKi8KLSAgLyogICAgd2VpcmQgY2FzZXMsIGxpa2Ugd2hlbiB0aGUgZmlyc3QgcG9pbnQgaXMgb2ZmIHRoZSBjdXJ2ZSwgb3Igd2hlbiAgICovCi0gIC8qICAgIHRoZXJlIGFyZSBzaW1wbHkgbm8gYG9uJyBwb2ludHMgaW4gdGhlIGNvbnRvdXIhICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpcnN0ICAgOjogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwb2ludCBpbiB0aGUgY29udG91ci4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFzdCAgICA6OiBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGNvbnRvdXIuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGlwcGVkIDo6IElmIHNldCwgZmxpcCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBjdXJ2ZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBCb29sCi0gIERlY29tcG9zZV9DdXJ2ZSggUkFTX0FSR1MgVVNob3J0ICBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU2hvcnQgIGxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ICAgICBmbGlwcGVkICkKLSAgewotICAgIEZUX1ZlY3RvciAgIHZfbGFzdDsKLSAgICBGVF9WZWN0b3IgICB2X2NvbnRyb2w7Ci0gICAgRlRfVmVjdG9yICAgdl9zdGFydDsKLQotICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICBGVF9WZWN0b3IqICBwb2ludDsKLSAgICBGVF9WZWN0b3IqICBsaW1pdDsKLSAgICBjaGFyKiAgICAgICB0YWdzOwotCi0gICAgVUludCAgICAgICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCi0KLQotICAgIHBvaW50cyA9IHJhcy5vdXRsaW5lLnBvaW50czsKLSAgICBsaW1pdCAgPSBwb2ludHMgKyBsYXN0OwotCi0gICAgdl9zdGFydC54ID0gU0NBTEVEKCBwb2ludHNbZmlyc3RdLnggKTsKLSAgICB2X3N0YXJ0LnkgPSBTQ0FMRUQoIHBvaW50c1tmaXJzdF0ueSApOwotICAgIHZfbGFzdC54ICA9IFNDQUxFRCggcG9pbnRzW2xhc3RdLnggKTsKLSAgICB2X2xhc3QueSAgPSBTQ0FMRUQoIHBvaW50c1tsYXN0XS55ICk7Ci0KLSAgICBpZiAoIGZsaXBwZWQgKQotICAgIHsKLSAgICAgIFNXQVBfKCB2X3N0YXJ0LngsIHZfc3RhcnQueSApOwotICAgICAgU1dBUF8oIHZfbGFzdC54LCB2X2xhc3QueSApOwotICAgIH0KLQotICAgIHZfY29udHJvbCA9IHZfc3RhcnQ7Ci0KLSAgICBwb2ludCA9IHBvaW50cyArIGZpcnN0OwotICAgIHRhZ3MgID0gcmFzLm91dGxpbmUudGFncyArIGZpcnN0OwotCi0gICAgLyogc2V0IHNjYW4gbW9kZSBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAoIHRhZ3NbMF0gJiBGVF9DVVJWRV9UQUdfSEFTX1NDQU5NT0RFICkKLSAgICAgIHJhcy5kcm9wT3V0Q29udHJvbCA9IChCeXRlKXRhZ3NbMF0gPj4gNTsKLQotICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgLyogQSBjb250b3VyIGNhbm5vdCBzdGFydCB3aXRoIGEgY3ViaWMgY29udHJvbCBwb2ludCEgKi8KLSAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAvKiBjaGVjayBmaXJzdCBwb2ludCB0byBkZXRlcm1pbmUgb3JpZ2luICovCi0gICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICB7Ci0gICAgICAvKiBmaXJzdCBwb2ludCBpcyBjb25pYyBjb250cm9sLiAgWWVzLCB0aGlzIGhhcHBlbnMuICovCi0gICAgICBpZiAoIEZUX0NVUlZFX1RBRyggcmFzLm91dGxpbmUudGFnc1tsYXN0XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICB7Ci0gICAgICAgIC8qIHN0YXJ0IGF0IGxhc3QgcG9pbnQgaWYgaXQgaXMgb24gdGhlIGN1cnZlICovCi0gICAgICAgIHZfc3RhcnQgPSB2X2xhc3Q7Ci0gICAgICAgIGxpbWl0LS07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIGJvdGggZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBjb25pYywgICAgICAgICAqLwotICAgICAgICAvKiBzdGFydCBhdCB0aGVpciBtaWRkbGUgYW5kIHJlY29yZCBpdHMgcG9zaXRpb24gICAgKi8KLSAgICAgICAgLyogZm9yIGNsb3N1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7Ci0gICAgICAgIHZfc3RhcnQueSA9ICggdl9zdGFydC55ICsgdl9sYXN0LnkgKSAvIDI7Ci0KLSAgICAgLyogdl9sYXN0ID0gdl9zdGFydDsgKi8KLSAgICAgIH0KLSAgICAgIHBvaW50LS07Ci0gICAgICB0YWdzLS07Ci0gICAgfQotCi0gICAgcmFzLmxhc3RYID0gdl9zdGFydC54OwotICAgIHJhcy5sYXN0WSA9IHZfc3RhcnQueTsKLQotICAgIHdoaWxlICggcG9pbnQgPCBsaW1pdCApCi0gICAgewotICAgICAgcG9pbnQrKzsKLSAgICAgIHRhZ3MrKzsKLQotICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0KLSAgICAgIHN3aXRjaCAoIHRhZyApCi0gICAgICB7Ci0gICAgICBjYXNlIEZUX0NVUlZFX1RBR19PTjogIC8qIGVtaXQgYSBzaW5nbGUgbGluZV90byAqLwotICAgICAgICB7Ci0gICAgICAgICAgTG9uZyAgeCwgeTsKLQotCi0gICAgICAgICAgeCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICB5ID0gU0NBTEVEKCBwb2ludC0+eSApOwotICAgICAgICAgIGlmICggZmxpcHBlZCApCi0gICAgICAgICAgICBTV0FQXyggeCwgeSApOwotCi0gICAgICAgICAgaWYgKCBMaW5lX1RvKCBSQVNfVkFSUyB4LCB5ICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX0NPTklDOiAgLyogY29uc3VtZSBjb25pYyBhcmNzICovCi0gICAgICAgIHZfY29udHJvbC54ID0gU0NBTEVEKCBwb2ludFswXS54ICk7Ci0gICAgICAgIHZfY29udHJvbC55ID0gU0NBTEVEKCBwb2ludFswXS55ICk7Ci0KLSAgICAgICAgaWYgKCBmbGlwcGVkICkKLSAgICAgICAgICBTV0FQXyggdl9jb250cm9sLngsIHZfY29udHJvbC55ICk7Ci0KLSAgICAgIERvX0NvbmljOgotICAgICAgICBpZiAoIHBvaW50IDwgbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yICB2X21pZGRsZTsKLSAgICAgICAgICBMb25nICAgICAgIHgsIHk7Ci0KLQotICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgICAgdGFncysrOwotICAgICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgICAgICAgeCA9IFNDQUxFRCggcG9pbnRbMF0ueCApOwotICAgICAgICAgIHkgPSBTQ0FMRUQoIHBvaW50WzBdLnkgKTsKLQotICAgICAgICAgIGlmICggZmxpcHBlZCApCi0gICAgICAgICAgICBTV0FQXyggeCwgeSApOwotCi0gICAgICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIENvbmljX1RvKCBSQVNfVkFSUyB2X2NvbnRyb2wueCwgdl9jb250cm9sLnksIHgsIHkgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggdGFnICE9IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgIHZfbWlkZGxlLnggPSAoIHZfY29udHJvbC54ICsgeCApIC8gMjsKLSAgICAgICAgICB2X21pZGRsZS55ID0gKCB2X2NvbnRyb2wueSArIHkgKSAvIDI7Ci0KLSAgICAgICAgICBpZiAoIENvbmljX1RvKCBSQVNfVkFSUyB2X2NvbnRyb2wueCwgdl9jb250cm9sLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9taWRkbGUueCwgIHZfbWlkZGxlLnkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB2X2NvbnRyb2wueCA9IHg7Ci0gICAgICAgICAgdl9jb250cm9sLnkgPSB5OwotCi0gICAgICAgICAgZ290byBEb19Db25pYzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggQ29uaWNfVG8oIFJBU19WQVJTIHZfY29udHJvbC54LCB2X2NvbnRyb2wueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9zdGFydC54LCAgIHZfc3RhcnQueSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZ290byBDbG9zZTsKLQotICAgICAgZGVmYXVsdDogIC8qIEZUX0NVUlZFX1RBR19DVUJJQyAqLwotICAgICAgICB7Ci0gICAgICAgICAgTG9uZyAgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MzsKLQotCi0gICAgICAgICAgaWYgKCBwb2ludCArIDEgPiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIEZUX0NVUlZFX1RBRyggdGFnc1sxXSApICE9IEZUX0NVUlZFX1RBR19DVUJJQyApCi0gICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgIHBvaW50ICs9IDI7Ci0gICAgICAgICAgdGFncyAgKz0gMjsKLQotICAgICAgICAgIHgxID0gU0NBTEVEKCBwb2ludFstMl0ueCApOwotICAgICAgICAgIHkxID0gU0NBTEVEKCBwb2ludFstMl0ueSApOwotICAgICAgICAgIHgyID0gU0NBTEVEKCBwb2ludFstMV0ueCApOwotICAgICAgICAgIHkyID0gU0NBTEVEKCBwb2ludFstMV0ueSApOwotCi0gICAgICAgICAgaWYgKCBmbGlwcGVkICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTV0FQXyggeDEsIHkxICk7Ci0gICAgICAgICAgICBTV0FQXyggeDIsIHkyICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgeDMgPSBTQ0FMRUQoIHBvaW50WzBdLnggKTsKLSAgICAgICAgICAgIHkzID0gU0NBTEVEKCBwb2ludFswXS55ICk7Ci0KLSAgICAgICAgICAgIGlmICggZmxpcHBlZCApCi0gICAgICAgICAgICAgIFNXQVBfKCB4MywgeTMgKTsKLQotICAgICAgICAgICAgaWYgKCBDdWJpY19UbyggUkFTX1ZBUlMgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MyApICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBDdWJpY19UbyggUkFTX1ZBUlMgeDEsIHkxLCB4MiwgeTIsIHZfc3RhcnQueCwgdl9zdGFydC55ICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjbG9zZSB0aGUgY29udG91ciB3aXRoIGEgbGluZSBzZWdtZW50ICovCi0gICAgaWYgKCBMaW5lX1RvKCBSQVNfVkFSUyB2X3N0YXJ0LngsIHZfc3RhcnQueSApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICBDbG9zZToKLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBJbnZhbGlkX091dGxpbmU6Ci0gICAgcmFzLmVycm9yID0gRlRfVEhST1coIEludmFsaWQgKTsKLQotICBGYWlsOgotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0IGEgZ2x5cGggaW50byBhIHNlcmllcyBvZiBzZWdtZW50cyBhbmQgYXJjcyBhbmQgbWFrZSBhICAgICAgKi8KLSAgLyogICAgcHJvZmlsZXMgbGlzdCB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxpcHBlZCA6OiBJZiBzZXQsIGZsaXAgdGhlIGRpcmVjdGlvbiBvZiBjdXJ2ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIGlmIGFueSBlcnJvciB3YXMgZW5jb3VudGVyZWQgZHVyaW5nICAgICovCi0gIC8qICAgIHJlbmRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgQ29udmVydF9HbHlwaCggUkFTX0FSR1MgSW50ICBmbGlwcGVkICkKLSAgewotICAgIEludCAgIGk7Ci0gICAgVUludCAgc3RhcnQ7Ci0KLQotICAgIHJhcy5mUHJvZmlsZSA9IE5VTEw7Ci0gICAgcmFzLmpvaW50ICAgID0gRkFMU0U7Ci0gICAgcmFzLmZyZXNoICAgID0gRkFMU0U7Ci0KLSAgICByYXMubWF4QnVmZiAgPSByYXMuc2l6ZUJ1ZmYgLSBBbGlnblByb2ZpbGVTaXplOwotCi0gICAgcmFzLm51bVR1cm5zID0gMDsKLQotICAgIHJhcy5jUHJvZmlsZSAgICAgICAgID0gKFBQcm9maWxlKXJhcy50b3A7Ci0gICAgcmFzLmNQcm9maWxlLT5vZmZzZXQgPSByYXMudG9wOwotICAgIHJhcy5udW1fUHJvZnMgICAgICAgID0gMDsKLQotICAgIHN0YXJ0ID0gMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcmFzLm91dGxpbmUubl9jb250b3VyczsgaSsrICkKLSAgICB7Ci0gICAgICBQUHJvZmlsZSAgbGFzdFByb2ZpbGU7Ci0gICAgICBCb29sICAgICAgbzsKLQotCi0gICAgICByYXMuc3RhdGUgICAgPSBVbmtub3duX1N0YXRlOwotICAgICAgcmFzLmdQcm9maWxlID0gTlVMTDsKLQotICAgICAgaWYgKCBEZWNvbXBvc2VfQ3VydmUoIFJBU19WQVJTIChVU2hvcnQpc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVTaG9ydClyYXMub3V0bGluZS5jb250b3Vyc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVkICkgKQotICAgICAgICByZXR1cm4gRkFJTFVSRTsKLQotICAgICAgc3RhcnQgPSAoVVNob3J0KXJhcy5vdXRsaW5lLmNvbnRvdXJzW2ldICsgMTsKLQotICAgICAgLyogd2UgbXVzdCBub3cgY2hlY2sgd2hldGhlciB0aGUgZXh0cmVtZSBhcmNzIGpvaW4gb3Igbm90ICovCi0gICAgICBpZiAoIEZSQUMoIHJhcy5sYXN0WSApID09IDAgJiYKLSAgICAgICAgICAgcmFzLmxhc3RZID49IHJhcy5taW5ZICAmJgotICAgICAgICAgICByYXMubGFzdFkgPD0gcmFzLm1heFkgICkKLSAgICAgICAgaWYgKCByYXMuZ1Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggcmFzLmdQcm9maWxlLT5mbGFncyAmIEZsb3dfVXAgKSA9PQotICAgICAgICAgICAgICAgKCByYXMuY1Byb2ZpbGUtPmZsYWdzICYgRmxvd19VcCApICkKLSAgICAgICAgICByYXMudG9wLS07Ci0gICAgICAgIC8qIE5vdGUgdGhhdCByYXMuZ1Byb2ZpbGUgY2FuIGJlIG5pbCBpZiB0aGUgY29udG91ciB3YXMgdG9vIHNtYWxsICovCi0gICAgICAgIC8qIHRvIGJlIGRyYXduLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGxhc3RQcm9maWxlID0gcmFzLmNQcm9maWxlOwotICAgICAgaWYgKCByYXMudG9wICE9IHJhcy5jUHJvZmlsZS0+b2Zmc2V0ICYmCi0gICAgICAgICAgICggcmFzLmNQcm9maWxlLT5mbGFncyAmIEZsb3dfVXAgKSApCi0gICAgICAgIG8gPSBJU19UT1BfT1ZFUlNIT09UKCByYXMubGFzdFkgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgbyA9IElTX0JPVFRPTV9PVkVSU0hPT1QoIHJhcy5sYXN0WSApOwotICAgICAgaWYgKCBFbmRfUHJvZmlsZSggUkFTX1ZBUlMgbyApICkKLSAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0KLSAgICAgIC8qIGNsb3NlIHRoZSBgbmV4dCBwcm9maWxlIGluIGNvbnRvdXInIGxpbmtlZCBsaXN0ICovCi0gICAgICBpZiAoIHJhcy5nUHJvZmlsZSApCi0gICAgICAgIGxhc3RQcm9maWxlLT5uZXh0ID0gcmFzLmdQcm9maWxlOwotICAgIH0KLQotICAgIGlmICggRmluYWxpemVfUHJvZmlsZV9UYWJsZSggUkFTX1ZBUiApICkKLSAgICAgIHJldHVybiBGQUlMVVJFOwotCi0gICAgcmV0dXJuIChCb29sKSggcmFzLnRvcCA8IHJhcy5tYXhCdWZmID8gU1VDQ0VTUyA6IEZBSUxVUkUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICBTQ0FOLUxJTkUgU1dFRVBTIEFORCBEUkFXSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBJbml0X0xpbmtlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYW4gZW1wdHkgbGlua2VkIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbml0X0xpbmtlZCggVFByb2ZpbGVMaXN0KiAgbCApCi0gIHsKLSAgICAqbCA9IE5VTEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIEluc05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbnNlcnRzIGEgbmV3IHByb2ZpbGUgaW4gYSBsaW5rZWQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc05ldyggUFByb2ZpbGVMaXN0ICBsaXN0LAotICAgICAgICAgIFBQcm9maWxlICAgICAgcHJvZmlsZSApCi0gIHsKLSAgICBQUHJvZmlsZSAgKm9sZCwgY3VycmVudDsKLSAgICBMb25nICAgICAgIHg7Ci0KLQotICAgIG9sZCAgICAgPSBsaXN0OwotICAgIGN1cnJlbnQgPSAqb2xkOwotICAgIHggICAgICAgPSBwcm9maWxlLT5YOwotCi0gICAgd2hpbGUgKCBjdXJyZW50ICkKLSAgICB7Ci0gICAgICBpZiAoIHggPCBjdXJyZW50LT5YICkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBvbGQgICAgID0gJmN1cnJlbnQtPmxpbms7Ci0gICAgICBjdXJyZW50ID0gKm9sZDsKLSAgICB9Ci0KLSAgICBwcm9maWxlLT5saW5rID0gY3VycmVudDsKLSAgICAqb2xkICAgICAgICAgID0gcHJvZmlsZTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRGVsT2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbW92ZXMgYW4gb2xkIHByb2ZpbGUgZnJvbSBhIGxpbmtlZCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgRGVsT2xkKCBQUHJvZmlsZUxpc3QgIGxpc3QsCi0gICAgICAgICAgUFByb2ZpbGUgICAgICBwcm9maWxlICkKLSAgewotICAgIFBQcm9maWxlICAqb2xkLCBjdXJyZW50OwotCi0KLSAgICBvbGQgICAgID0gbGlzdDsKLSAgICBjdXJyZW50ID0gKm9sZDsKLQotICAgIHdoaWxlICggY3VycmVudCApCi0gICAgewotICAgICAgaWYgKCBjdXJyZW50ID09IHByb2ZpbGUgKQotICAgICAgewotICAgICAgICAqb2xkID0gY3VycmVudC0+bGluazsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBvbGQgICAgID0gJmN1cnJlbnQtPmxpbms7Ci0gICAgICBjdXJyZW50ID0gKm9sZDsKLSAgICB9Ci0KLSAgICAvKiB3ZSBzaG91bGQgbmV2ZXIgZ2V0IHRoZXJlLCB1bmxlc3MgdGhlIHByb2ZpbGUgd2FzIG5vdCBwYXJ0IG9mICovCi0gICAgLyogdGhlIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBTb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU29ydHMgYSB0cmFjZSBsaXN0LiAgSW4gOTUlLCB0aGUgbGlzdCBpcyBhbHJlYWR5IHNvcnRlZC4gIFdlIG5lZWQgICovCi0gIC8qICAgIGFuIGFsZ29yaXRobSB3aGljaCBpcyBmYXN0IGluIHRoaXMgY2FzZS4gIEJ1YmJsZSBzb3J0IGlzIGVub3VnaCAgICAqLwotICAvKiAgICBhbmQgc2ltcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIFNvcnQoIFBQcm9maWxlTGlzdCAgbGlzdCApCi0gIHsKLSAgICBQUHJvZmlsZSAgKm9sZCwgY3VycmVudCwgbmV4dDsKLQotCi0gICAgLyogRmlyc3QsIHNldCB0aGUgbmV3IFggY29vcmRpbmF0ZSBvZiBlYWNoIHByb2ZpbGUgKi8KLSAgICBjdXJyZW50ID0gKmxpc3Q7Ci0gICAgd2hpbGUgKCBjdXJyZW50ICkKLSAgICB7Ci0gICAgICBjdXJyZW50LT5YICAgICAgID0gKmN1cnJlbnQtPm9mZnNldDsKLSAgICAgIGN1cnJlbnQtPm9mZnNldCArPSAoIGN1cnJlbnQtPmZsYWdzICYgRmxvd19VcCApID8gMSA6IC0xOwotICAgICAgY3VycmVudC0+aGVpZ2h0LS07Ci0gICAgICBjdXJyZW50ID0gY3VycmVudC0+bGluazsKLSAgICB9Ci0KLSAgICAvKiBUaGVuIHNvcnQgdGhlbSAqLwotICAgIG9sZCAgICAgPSBsaXN0OwotICAgIGN1cnJlbnQgPSAqb2xkOwotCi0gICAgaWYgKCAhY3VycmVudCApCi0gICAgICByZXR1cm47Ci0KLSAgICBuZXh0ID0gY3VycmVudC0+bGluazsKLQotICAgIHdoaWxlICggbmV4dCApCi0gICAgewotICAgICAgaWYgKCBjdXJyZW50LT5YIDw9IG5leHQtPlggKQotICAgICAgewotICAgICAgICBvbGQgICAgID0gJmN1cnJlbnQtPmxpbms7Ci0gICAgICAgIGN1cnJlbnQgPSAqb2xkOwotCi0gICAgICAgIGlmICggIWN1cnJlbnQgKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKm9sZCAgICAgICAgICA9IG5leHQ7Ci0gICAgICAgIGN1cnJlbnQtPmxpbmsgPSBuZXh0LT5saW5rOwotICAgICAgICBuZXh0LT5saW5rICAgID0gY3VycmVudDsKLQotICAgICAgICBvbGQgICAgID0gbGlzdDsKLSAgICAgICAgY3VycmVudCA9ICpvbGQ7Ci0gICAgICB9Ci0KLSAgICAgIG5leHQgPSBjdXJyZW50LT5saW5rOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVmVydGljYWwgU3dlZXAgUHJvY2VkdXJlIFNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGVzZSBmb3VyIHJvdXRpbmVzIGFyZSB1c2VkIGR1cmluZyB0aGUgdmVydGljYWwgYmxhY2svd2hpdGUgc3dlZXAgICAqLwotICAvKiAgcGhhc2UgYnkgdGhlIGdlbmVyaWMgRHJhd19Td2VlcCgpIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIFZlcnRpY2FsX1N3ZWVwX0luaXQoIFJBU19BUkdTIFNob3J0KiAgbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydCogIG1heCApCi0gIHsKLSAgICBMb25nICBwaXRjaCA9IHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICBGVF9VTlVTRUQoIG1heCApOwotCi0KLSAgICByYXMudHJhY2VJbmNyID0gKFNob3J0KS1waXRjaDsKLSAgICByYXMudHJhY2VPZnMgID0gLSptaW4gKiBwaXRjaDsKLSAgICBpZiAoIHBpdGNoID4gMCApCi0gICAgICByYXMudHJhY2VPZnMgKz0gKExvbmcpKCByYXMudGFyZ2V0LnJvd3MgLSAxICkgKiBwaXRjaDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgVmVydGljYWxfU3dlZXBfU3BhbiggUkFTX0FSR1MgU2hvcnQgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICByaWdodCApCi0gIHsKLSAgICBMb25nICAgZTEsIGUyOwotICAgIEJ5dGUqICB0YXJnZXQ7Ci0KLSAgICBJbnQgIGRyb3BPdXRDb250cm9sID0gbGVmdC0+ZmxhZ3MgJiA3OwotCi0gICAgRlRfVU5VU0VEKCB5ICk7Ci0gICAgRlRfVU5VU0VEKCBsZWZ0ICk7Ci0gICAgRlRfVU5VU0VEKCByaWdodCApOwotCi0KLSAgICAvKiBpbiBoaWdoLXByZWNpc2lvbiBtb2RlLCB3ZSBuZWVkIDEyIGRpZ2l0cyBhZnRlciB0aGUgY29tbWEgdG8gKi8KLSAgICAvKiByZXByZXNlbnQgbXVsdGlwbGVzIG9mIDEvKDE8PDEyKSA9IDEvNDA5NiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9UUkFDRTcoKCAiICB5PSVkIHg9WyUuMTJmOyUuMTJmXSwgZHJvcC1vdXQ9JWQiLAotICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgZHJvcE91dENvbnRyb2wgKSk7Ci0KLSAgICAvKiBEcm9wLW91dCBjb250cm9sICovCi0KLSAgICBlMSA9IFRSVU5DKCBDRUlMSU5HKCB4MSApICk7Ci0KLSAgICBpZiAoIGRyb3BPdXRDb250cm9sICE9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB4MiAtIHgxIC0gcmFzLnByZWNpc2lvbiA8PSByYXMucHJlY2lzaW9uX2ppdHRlciApCi0gICAgICBlMiA9IGUxOwotICAgIGVsc2UKLSAgICAgIGUyID0gVFJVTkMoIEZMT09SKCB4MiApICk7Ci0KLSAgICBpZiAoIGUyID49IDAgJiYgZTEgPCByYXMuYldpZHRoICkKLSAgICB7Ci0gICAgICBJbnQgICBjMSwgYzI7Ci0gICAgICBCeXRlICBmMSwgZjI7Ci0KLQotICAgICAgaWYgKCBlMSA8IDAgKQotICAgICAgICBlMSA9IDA7Ci0gICAgICBpZiAoIGUyID49IHJhcy5iV2lkdGggKQotICAgICAgICBlMiA9IHJhcy5iV2lkdGggLSAxOwotCi0gICAgICBGVF9UUkFDRTcoKCAiIC0+IHg9WyVkOyVkXSIsIGUxLCBlMiApKTsKLQotICAgICAgYzEgPSAoU2hvcnQpKCBlMSA+PiAzICk7Ci0gICAgICBjMiA9IChTaG9ydCkoIGUyID4+IDMgKTsKLQotICAgICAgZjEgPSAoQnl0ZSkgICggMHhGRiA+PiAoIGUxICYgNyApICk7Ci0gICAgICBmMiA9IChCeXRlKSB+KCAweDdGID4+ICggZTIgJiA3ICkgKTsKLQotICAgICAgdGFyZ2V0ID0gcmFzLmJUYXJnZXQgKyByYXMudHJhY2VPZnMgKyBjMTsKLSAgICAgIGMyIC09IGMxOwotCi0gICAgICBpZiAoIGMyID4gMCApCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFswXSB8PSBmMTsKLQotICAgICAgICAvKiBtZW1zZXQoKSBpcyBzbG93ZXIgdGhhbiB0aGUgZm9sbG93aW5nIGNvZGUgb24gbWFueSBwbGF0Zm9ybXMuICovCi0gICAgICAgIC8qIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQsIGluIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhc2VzLCAgKi8KLSAgICAgICAgLyogdGhlIHNwYW4gbGVuZ3RoIGluIGJ5dGVzIGlzIHJlbGF0aXZlbHkgc21hbGwuICAgICAgICAgICAgICAgICAqLwotICAgICAgICBjMi0tOwotICAgICAgICB3aGlsZSAoIGMyID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAqKCsrdGFyZ2V0KSA9IDB4RkY7Ci0gICAgICAgICAgYzItLTsKLSAgICAgICAgfQotICAgICAgICB0YXJnZXRbMV0gfD0gZjI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICp0YXJnZXQgfD0gKCBmMSAmIGYyICk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U3KCggIlxuIiApKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgVmVydGljYWxfU3dlZXBfRHJvcCggUkFTX0FSR1MgU2hvcnQgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICByaWdodCApCi0gIHsKLSAgICBMb25nICAgZTEsIGUyLCBweGw7Ci0gICAgU2hvcnQgIGMxLCBmMTsKLQotCi0gICAgRlRfVFJBQ0U3KCggIiAgeT0lZCB4PVslLjEyZjslLjEyZl0iLAotICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24gKSk7Ci0KLSAgICAvKiBEcm9wLW91dCBjb250cm9sICovCi0KLSAgICAvKiAgIGUyICAgICAgICAgICAgeDIgICAgICAgICAgICAgICAgICAgIHgxICAgICAgICAgICBlMSAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICovCi0gICAgLyogICArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHBpeGVsICAgICAgICAgY29udG91ciAgICAgICAgICAgICAgY29udG91ciAgICAgICBwaXhlbCAgKi8KLSAgICAvKiBjZW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyICovCi0KLSAgICAvKiBkcm9wLW91dCBtb2RlICAgIHNjYW4gY29udmVyc2lvbiBydWxlcyAoYXMgZGVmaW5lZCBpbiBPcGVuVHlwZSkgKi8KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAvKiAgMCAgICAgICAgICAgICAgICAxLCAyLCAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgMSAgICAgICAgICAgICAgICAxLCAyLCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgMiAgICAgICAgICAgICAgICAxLCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgMyAgICAgICAgICAgICAgICBzYW1lIGFzIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgNCAgICAgICAgICAgICAgICAxLCAyLCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgNSAgICAgICAgICAgICAgICAxLCAyLCA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgNiwgNyAgICAgICAgICAgICBzYW1lIGFzIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGUxICA9IENFSUxJTkcoIHgxICk7Ci0gICAgZTIgID0gRkxPT1IgICggeDIgKTsKLSAgICBweGwgPSBlMTsKLQotICAgIGlmICggZTEgPiBlMiApCi0gICAgewotICAgICAgSW50ICBkcm9wT3V0Q29udHJvbCA9IGxlZnQtPmZsYWdzICYgNzsKLQotCi0gICAgICBGVF9UUkFDRTcoKCAiLCBkcm9wLW91dD0lZCIsIGRyb3BPdXRDb250cm9sICkpOwotCi0gICAgICBpZiAoIGUxID09IGUyICsgcmFzLnByZWNpc2lvbiApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGRyb3BPdXRDb250cm9sICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6IC8qIHNpbXBsZSBkcm9wLW91dHMgaW5jbHVkaW5nIHN0dWJzICovCi0gICAgICAgICAgcHhsID0gZTI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OiAvKiBzbWFydCBkcm9wLW91dHMgaW5jbHVkaW5nIHN0dWJzICovCi0gICAgICAgICAgcHhsID0gRkxPT1IoICggeDEgKyB4MiAtIDEgKSAvIDIgKyByYXMucHJlY2lzaW9uX2hhbGYgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6IC8qIHNpbXBsZSBkcm9wLW91dHMgZXhjbHVkaW5nIHN0dWJzICovCi0gICAgICAgIGNhc2UgNTogLyogc21hcnQgZHJvcC1vdXRzIGV4Y2x1ZGluZyBzdHVicyAgKi8KLQotICAgICAgICAgIC8qIERyb3Atb3V0IENvbnRyb2wgUnVsZXMgIzQgYW5kICM2ICovCi0KLSAgICAgICAgICAvKiBUaGUgc3BlY2lmaWNhdGlvbiBuZWl0aGVyIHByb3ZpZGVzIGFuIGV4YWN0IGRlZmluaXRpb24gKi8KLSAgICAgICAgICAvKiBvZiBhIGBzdHViJyBub3IgZ2l2ZXMgZXhhY3QgcnVsZXMgdG8gZXhjbHVkZSB0aGVtLiAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBIZXJlIHRoZSBjb25zdHJhaW50cyB3ZSB1c2UgdG8gcmVjb2duaXplIGEgc3R1Yi4gICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgdXBwZXIgc3R1YjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gUF9MZWZ0IGFuZCBQX1JpZ2h0IGFyZSBpbiB0aGUgc2FtZSBjb250b3VyICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gUF9SaWdodCBpcyB0aGUgc3VjY2Vzc29yIG9mIFBfTGVmdCBpbiB0aGF0IGNvbnRvdXIgKi8KLSAgICAgICAgICAvKiAgIC0geSBpcyB0aGUgdG9wIG9mIFBfTGVmdCBhbmQgUF9SaWdodCAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgbG93ZXIgc3R1YjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gUF9MZWZ0IGFuZCBQX1JpZ2h0IGFyZSBpbiB0aGUgc2FtZSBjb250b3VyICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gUF9MZWZ0IGlzIHRoZSBzdWNjZXNzb3Igb2YgUF9SaWdodCBpbiB0aGF0IGNvbnRvdXIgKi8KLSAgICAgICAgICAvKiAgIC0geSBpcyB0aGUgYm90dG9tIG9mIFBfTGVmdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBXZSBkcmF3IGEgc3R1YiBpZiB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBtZXQuICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gZm9yIGFuIHVwcGVyIG9yIGxvd2VyIHN0dWIsIHRoZXJlIGlzIHRvcCBvciBib3R0b20gKi8KLSAgICAgICAgICAvKiAgICAgb3ZlcnNob290LCByZXNwZWN0aXZlbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gdGhlIGNvdmVyZWQgaW50ZXJ2YWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0byBhIGhhbGYgKi8KLSAgICAgICAgICAvKiAgICAgcGl4ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIC8qIHVwcGVyIHN0dWIgdGVzdCAqLwotICAgICAgICAgIGlmICggbGVmdC0+bmV4dCA9PSByaWdodCAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgbGVmdC0+aGVpZ2h0IDw9IDAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgISggbGVmdC0+ZmxhZ3MgJiBPdmVyc2hvb3RfVG9wICAgJiYKLSAgICAgICAgICAgICAgICAgIHgyIC0geDEgPj0gcmFzLnByZWNpc2lvbl9oYWxmICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogbG93ZXIgc3R1YiB0ZXN0ICovCi0gICAgICAgICAgaWYgKCByaWdodC0+bmV4dCA9PSBsZWZ0ICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgbGVmdC0+c3RhcnQgPT0geSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICEoIGxlZnQtPmZsYWdzICYgT3ZlcnNob290X0JvdHRvbSAmJgotICAgICAgICAgICAgICAgICAgeDIgLSB4MSA+PSByYXMucHJlY2lzaW9uX2hhbGYgICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgaWYgKCBkcm9wT3V0Q29udHJvbCA9PSAxICkKLSAgICAgICAgICAgIHB4bCA9IGUyOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB4bCA9IEZMT09SKCAoIHgxICsgeDIgLSAxICkgLyAyICsgcmFzLnByZWNpc2lvbl9oYWxmICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogbW9kZXMgMiwgMywgNiwgNyAqLwotICAgICAgICAgIGdvdG8gRXhpdDsgIC8qIG5vIGRyb3Atb3V0IGNvbnRyb2wgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHVuZG9jdW1lbnRlZCBidXQgY29uZmlybWVkOiBJZiB0aGUgZHJvcC1vdXQgd291bGQgcmVzdWx0IGluIGEgICovCi0gICAgICAgIC8qIHBpeGVsIG91dHNpZGUgb2YgdGhlIGJvdW5kaW5nIGJveCwgdXNlIHRoZSBwaXhlbCBpbnNpZGUgb2YgdGhlICovCi0gICAgICAgIC8qIGJvdW5kaW5nIGJveCBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggcHhsIDwgMCApCi0gICAgICAgICAgcHhsID0gZTE7Ci0gICAgICAgIGVsc2UgaWYgKCBUUlVOQyggcHhsICkgPj0gcmFzLmJXaWR0aCApCi0gICAgICAgICAgcHhsID0gZTI7Ci0KLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgb3RoZXIgcGl4ZWwgaXNuJ3Qgc2V0ICovCi0gICAgICAgIGUxID0gKCBweGwgPT0gZTEgKSA/IGUyIDogZTE7Ci0KLSAgICAgICAgZTEgPSBUUlVOQyggZTEgKTsKLQotICAgICAgICBjMSA9IChTaG9ydCkoIGUxID4+IDMgKTsKLSAgICAgICAgZjEgPSAoU2hvcnQpKCBlMSAmICA3ICk7Ci0KLSAgICAgICAgaWYgKCBlMSA+PSAwICYmIGUxIDwgcmFzLmJXaWR0aCAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHJhcy5iVGFyZ2V0W3Jhcy50cmFjZU9mcyArIGMxXSAmICggMHg4MCA+PiBmMSApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBlMSA9IFRSVU5DKCBweGwgKTsKLQotICAgIGlmICggZTEgPj0gMCAmJiBlMSA8IHJhcy5iV2lkdGggKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNygoICIgLT4geD0lZCAoZHJvcC1vdXQpIiwgZTEgKSk7Ci0KLSAgICAgIGMxID0gKFNob3J0KSggZTEgPj4gMyApOwotICAgICAgZjEgPSAoU2hvcnQpKCBlMSAmIDcgKTsKLQotICAgICAgcmFzLmJUYXJnZXRbcmFzLnRyYWNlT2ZzICsgYzFdIHw9IChjaGFyKSggMHg4MCA+PiBmMSApOwotICAgIH0KLQotICBFeGl0OgotICAgIEZUX1RSQUNFNygoICJcbiIgKSk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIFZlcnRpY2FsX1N3ZWVwX1N0ZXAoIFJBU19BUkcgKQotICB7Ci0gICAgcmFzLnRyYWNlT2ZzICs9IHJhcy50cmFjZUluY3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgSG9yaXpvbnRhbCBTd2VlcCBQcm9jZWR1cmUgU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoZXNlIGZvdXIgcm91dGluZXMgYXJlIHVzZWQgZHVyaW5nIHRoZSBob3Jpem9udGFsIGJsYWNrL3doaXRlICAgICAqLwotICAvKiAgc3dlZXAgcGhhc2UgYnkgdGhlIGdlbmVyaWMgRHJhd19Td2VlcCgpIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIEhvcml6b250YWxfU3dlZXBfSW5pdCggUkFTX0FSR1MgU2hvcnQqICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvcnQqICBtYXggKQotICB7Ci0gICAgLyogbm90aGluZywgcmVhbGx5ICovCi0gICAgRlRfVU5VU0VEX1JBU1RFUjsKLSAgICBGVF9VTlVTRUQoIG1pbiApOwotICAgIEZUX1VOVVNFRCggbWF4ICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEhvcml6b250YWxfU3dlZXBfU3BhbiggUkFTX0FSR1MgU2hvcnQgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIHJpZ2h0ICkKLSAgewotICAgIEZUX1VOVVNFRCggbGVmdCApOwotICAgIEZUX1VOVVNFRCggcmlnaHQgKTsKLQotCi0gICAgaWYgKCB4MiAtIHgxIDwgcmFzLnByZWNpc2lvbiApCi0gICAgewotICAgICAgTG9uZyAgZTEsIGUyOwotCi0KLSAgICAgIEZUX1RSQUNFNygoICIgIHg9JWQgeT1bJS4xMmY7JS4xMmZdIiwKLSAgICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICB4MSAvIChkb3VibGUpcmFzLnByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgIHgyIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uICkpOwotCi0gICAgICBlMSA9IENFSUxJTkcoIHgxICk7Ci0gICAgICBlMiA9IEZMT09SICAoIHgyICk7Ci0KLSAgICAgIGlmICggZTEgPT0gZTIgKQotICAgICAgewotICAgICAgICBlMSA9IFRSVU5DKCBlMSApOwotCi0gICAgICAgIGlmICggZTEgPj0gMCAmJiAoVUxvbmcpZTEgPCByYXMudGFyZ2V0LnJvd3MgKQotICAgICAgICB7Ci0gICAgICAgICAgQnl0ZSAgIGYxOwotICAgICAgICAgIFBCeXRlICBiaXRzOwotICAgICAgICAgIFBCeXRlICBwOwotCi0KLSAgICAgICAgICBGVF9UUkFDRTcoKCAiIC0+IHk9JWQgKGRyb3Atb3V0KSIsIGUxICkpOwotCi0gICAgICAgICAgYml0cyA9IHJhcy5iVGFyZ2V0ICsgKCB5ID4+IDMgKTsKLSAgICAgICAgICBmMSAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOwotICAgICAgICAgIHAgICAgPSBiaXRzIC0gZTEgKiByYXMudGFyZ2V0LnBpdGNoOwotCi0gICAgICAgICAgaWYgKCByYXMudGFyZ2V0LnBpdGNoID4gMCApCi0gICAgICAgICAgICBwICs9IChMb25nKSggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcmFzLnRhcmdldC5waXRjaDsKLQotICAgICAgICAgIHBbMF0gfD0gZjE7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgRlRfVFJBQ0U3KCggIlxuIiApKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEhvcml6b250YWxfU3dlZXBfRHJvcCggUkFTX0FSR1MgU2hvcnQgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIHJpZ2h0ICkKLSAgewotICAgIExvbmcgICBlMSwgZTIsIHB4bDsKLSAgICBQQnl0ZSAgYml0czsKLSAgICBCeXRlICAgZjE7Ci0KLQotICAgIEZUX1RSQUNFNygoICIgIHg9JWQgeT1bJS4xMmY7JS4xMmZdIiwKLSAgICAgICAgICAgICAgICB5LAotICAgICAgICAgICAgICAgIHgxIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uLAotICAgICAgICAgICAgICAgIHgyIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uICkpOwotCi0gICAgLyogRHVyaW5nIHRoZSBob3Jpem9udGFsIHN3ZWVwLCB3ZSBvbmx5IHRha2UgY2FyZSBvZiBkcm9wLW91dHMgKi8KLQotICAgIC8qIGUxICAgICArICAgICAgIDwtLSBwaXhlbCBjZW50ZXIgKi8KLSAgICAvKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogeDEgIC0tLSstLT4gICAgPC0tIGNvbnRvdXIgICAgICAqLwotICAgIC8qICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogeDIgIDwtLSstLS0gICAgPC0tIGNvbnRvdXIgICAgICAqLwotICAgIC8qICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogZTIgICAgICsgICAgICAgPC0tIHBpeGVsIGNlbnRlciAqLwotCi0gICAgZTEgID0gQ0VJTElORyggeDEgKTsKLSAgICBlMiAgPSBGTE9PUiAgKCB4MiApOwotICAgIHB4bCA9IGUxOwotCi0gICAgaWYgKCBlMSA+IGUyICkKLSAgICB7Ci0gICAgICBJbnQgIGRyb3BPdXRDb250cm9sID0gbGVmdC0+ZmxhZ3MgJiA3OwotCi0KLSAgICAgIEZUX1RSQUNFNygoICIsIGRyb3BvdXQ9JWQiLCBkcm9wT3V0Q29udHJvbCApKTsKLQotICAgICAgaWYgKCBlMSA9PSBlMiArIHJhcy5wcmVjaXNpb24gKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKCBkcm9wT3V0Q29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwOiAvKiBzaW1wbGUgZHJvcC1vdXRzIGluY2x1ZGluZyBzdHVicyAqLwotICAgICAgICAgIHB4bCA9IGUyOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDogLyogc21hcnQgZHJvcC1vdXRzIGluY2x1ZGluZyBzdHVicyAqLwotICAgICAgICAgIHB4bCA9IEZMT09SKCAoIHgxICsgeDIgLSAxICkgLyAyICsgcmFzLnByZWNpc2lvbl9oYWxmICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxOiAvKiBzaW1wbGUgZHJvcC1vdXRzIGV4Y2x1ZGluZyBzdHVicyAqLwotICAgICAgICBjYXNlIDU6IC8qIHNtYXJ0IGRyb3Atb3V0cyBleGNsdWRpbmcgc3R1YnMgICovCi0gICAgICAgICAgLyogc2VlIFZlcnRpY2FsX1N3ZWVwX0Ryb3AgZm9yIGRldGFpbHMgKi8KLQotICAgICAgICAgIC8qIHJpZ2h0bW9zdCBzdHViIHRlc3QgKi8KLSAgICAgICAgICBpZiAoIGxlZnQtPm5leHQgPT0gcmlnaHQgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGxlZnQtPmhlaWdodCA8PSAwICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICEoIGxlZnQtPmZsYWdzICYgT3ZlcnNob290X1RvcCAgICYmCi0gICAgICAgICAgICAgICAgICB4MiAtIHgxID49IHJhcy5wcmVjaXNpb25faGFsZiApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIC8qIGxlZnRtb3N0IHN0dWIgdGVzdCAqLwotICAgICAgICAgIGlmICggcmlnaHQtPm5leHQgPT0gbGVmdCAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGxlZnQtPnN0YXJ0ID09IHkgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAhKCBsZWZ0LT5mbGFncyAmIE92ZXJzaG9vdF9Cb3R0b20gJiYKLSAgICAgICAgICAgICAgICAgIHgyIC0geDEgPj0gcmFzLnByZWNpc2lvbl9oYWxmICApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIGlmICggZHJvcE91dENvbnRyb2wgPT0gMSApCi0gICAgICAgICAgICBweGwgPSBlMjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBweGwgPSBGTE9PUiggKCB4MSArIHgyIC0gMSApIC8gMiArIHJhcy5wcmVjaXNpb25faGFsZiApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIG1vZGVzIDIsIDMsIDYsIDcgKi8KLSAgICAgICAgICBnb3RvIEV4aXQ7ICAvKiBubyBkcm9wLW91dCBjb250cm9sICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiB1bmRvY3VtZW50ZWQgYnV0IGNvbmZpcm1lZDogSWYgdGhlIGRyb3Atb3V0IHdvdWxkIHJlc3VsdCBpbiBhICAqLwotICAgICAgICAvKiBwaXhlbCBvdXRzaWRlIG9mIHRoZSBib3VuZGluZyBib3gsIHVzZSB0aGUgcGl4ZWwgaW5zaWRlIG9mIHRoZSAqLwotICAgICAgICAvKiBib3VuZGluZyBib3ggaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHB4bCA8IDAgKQotICAgICAgICAgIHB4bCA9IGUxOwotICAgICAgICBlbHNlIGlmICggKFVMb25nKSggVFJVTkMoIHB4bCApICkgPj0gcmFzLnRhcmdldC5yb3dzICkKLSAgICAgICAgICBweGwgPSBlMjsKLQotICAgICAgICAvKiBjaGVjayB0aGF0IHRoZSBvdGhlciBwaXhlbCBpc24ndCBzZXQgKi8KLSAgICAgICAgZTEgPSAoIHB4bCA9PSBlMSApID8gZTIgOiBlMTsKLQotICAgICAgICBlMSA9IFRSVU5DKCBlMSApOwotCi0gICAgICAgIGJpdHMgPSByYXMuYlRhcmdldCArICggeSA+PiAzICk7Ci0gICAgICAgIGYxICAgPSAoQnl0ZSkoIDB4ODAgPj4gKCB5ICYgNyApICk7Ci0KLSAgICAgICAgYml0cyAtPSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0gICAgICAgIGlmICggcmFzLnRhcmdldC5waXRjaCA+IDAgKQotICAgICAgICAgIGJpdHMgKz0gKExvbmcpKCByYXMudGFyZ2V0LnJvd3MgLSAxICkgKiByYXMudGFyZ2V0LnBpdGNoOwotCi0gICAgICAgIGlmICggZTEgPj0gMCAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKFVMb25nKWUxIDwgcmFzLnRhcmdldC5yb3dzICYmCi0gICAgICAgICAgICAgKmJpdHMgJiBmMSAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBlMSA9IFRSVU5DKCBweGwgKTsKLQotICAgIGlmICggZTEgPj0gMCAmJiAoVUxvbmcpZTEgPCByYXMudGFyZ2V0LnJvd3MgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNygoICIgLT4geT0lZCAoZHJvcC1vdXQpIiwgZTEgKSk7Ci0KLSAgICAgIGJpdHMgID0gcmFzLmJUYXJnZXQgKyAoIHkgPj4gMyApOwotICAgICAgZjEgICAgPSAoQnl0ZSkoIDB4ODAgPj4gKCB5ICYgNyApICk7Ci0gICAgICBiaXRzIC09IGUxICogcmFzLnRhcmdldC5waXRjaDsKLQotICAgICAgaWYgKCByYXMudGFyZ2V0LnBpdGNoID4gMCApCi0gICAgICAgIGJpdHMgKz0gKExvbmcpKCByYXMudGFyZ2V0LnJvd3MgLSAxICkgKiByYXMudGFyZ2V0LnBpdGNoOwotCi0gICAgICBiaXRzWzBdIHw9IGYxOwotICAgIH0KLQotICBFeGl0OgotICAgIEZUX1RSQUNFNygoICJcbiIgKSk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEhvcml6b250YWxfU3dlZXBfU3RlcCggUkFTX0FSRyApCi0gIHsKLSAgICAvKiBOb3RoaW5nLCByZWFsbHkgKi8KLSAgICBGVF9VTlVTRURfUkFTVEVSOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBHZW5lcmljIFN3ZWVwIERyYXdpbmcgcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIEJvb2wKLSAgRHJhd19Td2VlcCggUkFTX0FSRyApCi0gIHsKLSAgICBTaG9ydCAgICAgICAgIHksIHlfY2hhbmdlLCB5X2hlaWdodDsKLQotICAgIFBQcm9maWxlICAgICAgUCwgUSwgUF9MZWZ0LCBQX1JpZ2h0OwotCi0gICAgU2hvcnQgICAgICAgICBtaW5fWSwgbWF4X1ksIHRvcCwgYm90dG9tLCBkcm9wb3V0czsKLQotICAgIExvbmcgICAgICAgICAgeDEsIHgyLCB4cywgZTEsIGUyOwotCi0gICAgVFByb2ZpbGVMaXN0ICB3YWl0aW5nOwotICAgIFRQcm9maWxlTGlzdCAgZHJhd19sZWZ0LCBkcmF3X3JpZ2h0OwotCi0KLSAgICAvKiBpbml0aWFsaXplIGVtcHR5IGxpbmtlZCBsaXN0cyAqLwotCi0gICAgSW5pdF9MaW5rZWQoICZ3YWl0aW5nICk7Ci0KLSAgICBJbml0X0xpbmtlZCggJmRyYXdfbGVmdCAgKTsKLSAgICBJbml0X0xpbmtlZCggJmRyYXdfcmlnaHQgKTsKLQotICAgIC8qIGZpcnN0LCBjb21wdXRlIG1pbiBhbmQgbWF4IFkgKi8KLQotICAgIFAgICAgID0gcmFzLmZQcm9maWxlOwotICAgIG1heF9ZID0gKFNob3J0KVRSVU5DKCByYXMubWluWSApOwotICAgIG1pbl9ZID0gKFNob3J0KVRSVU5DKCByYXMubWF4WSApOwotCi0gICAgd2hpbGUgKCBQICkKLSAgICB7Ci0gICAgICBRID0gUC0+bGluazsKLQotICAgICAgYm90dG9tID0gKFNob3J0KVAtPnN0YXJ0OwotICAgICAgdG9wICAgID0gKFNob3J0KSggUC0+c3RhcnQgKyBQLT5oZWlnaHQgLSAxICk7Ci0KLSAgICAgIGlmICggbWluX1kgPiBib3R0b20gKQotICAgICAgICBtaW5fWSA9IGJvdHRvbTsKLSAgICAgIGlmICggbWF4X1kgPCB0b3AgKQotICAgICAgICBtYXhfWSA9IHRvcDsKLQotICAgICAgUC0+WCA9IDA7Ci0gICAgICBJbnNOZXcoICZ3YWl0aW5nLCBQICk7Ci0KLSAgICAgIFAgPSBROwotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoZSBZLXR1cm5zICovCi0gICAgaWYgKCByYXMubnVtVHVybnMgPT0gMCApCi0gICAgewotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIEludmFsaWQgKTsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIC8qIG5vdyBpbml0aWFsaXplIHRoZSBzd2VlcCAqLwotCi0gICAgcmFzLlByb2NfU3dlZXBfSW5pdCggUkFTX1ZBUlMgJm1pbl9ZLCAmbWF4X1kgKTsKLQotICAgIC8qIHRoZW4gY29tcHV0ZSB0aGUgZGlzdGFuY2Ugb2YgZWFjaCBwcm9maWxlIGZyb20gbWluX1kgKi8KLQotICAgIFAgPSB3YWl0aW5nOwotCi0gICAgd2hpbGUgKCBQICkKLSAgICB7Ci0gICAgICBQLT5jb3VudEwgPSBQLT5zdGFydCAtIG1pbl9ZOwotICAgICAgUCA9IFAtPmxpbms7Ci0gICAgfQotCi0gICAgLyogbGV0J3MgZ28gKi8KLQotICAgIHkgICAgICAgID0gbWluX1k7Ci0gICAgeV9oZWlnaHQgPSAwOwotCi0gICAgaWYgKCByYXMubnVtVHVybnMgPiAwICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHJhcy5zaXplQnVmZlstcmFzLm51bVR1cm5zXSA9PSBtaW5fWSApCi0gICAgICByYXMubnVtVHVybnMtLTsKLQotICAgIHdoaWxlICggcmFzLm51bVR1cm5zID4gMCApCi0gICAgewotICAgICAgLyogY2hlY2sgd2FpdGluZyBsaXN0IGZvciBuZXcgYWN0aXZhdGlvbnMgKi8KLQotICAgICAgUCA9IHdhaXRpbmc7Ci0KLSAgICAgIHdoaWxlICggUCApCi0gICAgICB7Ci0gICAgICAgIFEgPSBQLT5saW5rOwotICAgICAgICBQLT5jb3VudEwgLT0geV9oZWlnaHQ7Ci0gICAgICAgIGlmICggUC0+Y291bnRMID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRGVsT2xkKCAmd2FpdGluZywgUCApOwotCi0gICAgICAgICAgaWYgKCBQLT5mbGFncyAmIEZsb3dfVXAgKQotICAgICAgICAgICAgSW5zTmV3KCAmZHJhd19sZWZ0LCAgUCApOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIEluc05ldyggJmRyYXdfcmlnaHQsIFAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFAgPSBROwotICAgICAgfQotCi0gICAgICAvKiBzb3J0IHRoZSBkcmF3aW5nIGxpc3RzICovCi0KLSAgICAgIFNvcnQoICZkcmF3X2xlZnQgKTsKLSAgICAgIFNvcnQoICZkcmF3X3JpZ2h0ICk7Ci0KLSAgICAgIHlfY2hhbmdlID0gKFNob3J0KXJhcy5zaXplQnVmZlstcmFzLm51bVR1cm5zLS1dOwotICAgICAgeV9oZWlnaHQgPSAoU2hvcnQpKCB5X2NoYW5nZSAtIHkgKTsKLQotICAgICAgd2hpbGUgKCB5IDwgeV9jaGFuZ2UgKQotICAgICAgewotICAgICAgICAvKiBsZXQncyB0cmFjZSAqLwotCi0gICAgICAgIGRyb3BvdXRzID0gMDsKLQotICAgICAgICBQX0xlZnQgID0gZHJhd19sZWZ0OwotICAgICAgICBQX1JpZ2h0ID0gZHJhd19yaWdodDsKLQotICAgICAgICB3aGlsZSAoIFBfTGVmdCApCi0gICAgICAgIHsKLSAgICAgICAgICB4MSA9IFBfTGVmdCAtPlg7Ci0gICAgICAgICAgeDIgPSBQX1JpZ2h0LT5YOwotCi0gICAgICAgICAgaWYgKCB4MSA+IHgyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4cyA9IHgxOwotICAgICAgICAgICAgeDEgPSB4MjsKLSAgICAgICAgICAgIHgyID0geHM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZTEgPSBGTE9PUiggeDEgKTsKLSAgICAgICAgICBlMiA9IENFSUxJTkcoIHgyICk7Ci0KLSAgICAgICAgICBpZiAoIHgyIC0geDEgPD0gcmFzLnByZWNpc2lvbiAmJgotICAgICAgICAgICAgICAgZTEgIT0geDEgJiYgZTIgIT0geDIgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGUxID4gZTIgfHwgZTIgPT0gZTEgKyByYXMucHJlY2lzaW9uICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSW50ICBkcm9wT3V0Q29udHJvbCA9IFBfTGVmdC0+ZmxhZ3MgJiA3OwotCi0KLSAgICAgICAgICAgICAgaWYgKCBkcm9wT3V0Q29udHJvbCAhPSAyICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGEgZHJvcC1vdXQgd2FzIGRldGVjdGVkICovCi0KLSAgICAgICAgICAgICAgICBQX0xlZnQgLT5YID0geDE7Ci0gICAgICAgICAgICAgICAgUF9SaWdodC0+WCA9IHgyOwotCi0gICAgICAgICAgICAgICAgLyogbWFyayBwcm9maWxlIGZvciBkcm9wLW91dCBwcm9jZXNzaW5nICovCi0gICAgICAgICAgICAgICAgUF9MZWZ0LT5jb3VudEwgPSAxOwotICAgICAgICAgICAgICAgIGRyb3BvdXRzKys7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBnb3RvIFNraXBfVG9fTmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByYXMuUHJvY19Td2VlcF9TcGFuKCBSQVNfVkFSUyB5LCB4MSwgeDIsIFBfTGVmdCwgUF9SaWdodCApOwotCi0gICAgICAgIFNraXBfVG9fTmV4dDoKLQotICAgICAgICAgIFBfTGVmdCAgPSBQX0xlZnQtPmxpbms7Ci0gICAgICAgICAgUF9SaWdodCA9IFBfUmlnaHQtPmxpbms7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBoYW5kbGUgZHJvcC1vdXRzIF9hZnRlcl8gdGhlIHNwYW4gZHJhd2luZyAtLSAgICAgICAqLwotICAgICAgICAvKiBkcm9wLW91dCBwcm9jZXNzaW5nIGhhcyBiZWVuIG1vdmVkIG91dCBvZiB0aGUgbG9vcCAqLwotICAgICAgICAvKiBmb3IgcGVyZm9ybWFuY2UgdHVuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGRyb3BvdXRzID4gMCApCi0gICAgICAgICAgZ290byBTY2FuX0Ryb3BPdXRzOwotCi0gICAgICBOZXh0X0xpbmU6Ci0KLSAgICAgICAgcmFzLlByb2NfU3dlZXBfU3RlcCggUkFTX1ZBUiApOwotCi0gICAgICAgIHkrKzsKLQotICAgICAgICBpZiAoIHkgPCB5X2NoYW5nZSApCi0gICAgICAgIHsKLSAgICAgICAgICBTb3J0KCAmZHJhd19sZWZ0ICApOwotICAgICAgICAgIFNvcnQoICZkcmF3X3JpZ2h0ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogbm93IGZpbmFsaXplIHRoZSBwcm9maWxlcyB0aGF0IG5lZWQgaXQgKi8KLQotICAgICAgUCA9IGRyYXdfbGVmdDsKLSAgICAgIHdoaWxlICggUCApCi0gICAgICB7Ci0gICAgICAgIFEgPSBQLT5saW5rOwotICAgICAgICBpZiAoIFAtPmhlaWdodCA9PSAwICkKLSAgICAgICAgICBEZWxPbGQoICZkcmF3X2xlZnQsIFAgKTsKLSAgICAgICAgUCA9IFE7Ci0gICAgICB9Ci0KLSAgICAgIFAgPSBkcmF3X3JpZ2h0OwotICAgICAgd2hpbGUgKCBQICkKLSAgICAgIHsKLSAgICAgICAgUSA9IFAtPmxpbms7Ci0gICAgICAgIGlmICggUC0+aGVpZ2h0ID09IDAgKQotICAgICAgICAgIERlbE9sZCggJmRyYXdfcmlnaHQsIFAgKTsKLSAgICAgICAgUCA9IFE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogZm9yIGdyYXktc2NhbGluZywgZmx1c2ggdGhlIGJpdG1hcCBzY2FubGluZSBjYWNoZSAqLwotICAgIHdoaWxlICggeSA8PSBtYXhfWSApCi0gICAgewotICAgICAgcmFzLlByb2NfU3dlZXBfU3RlcCggUkFTX1ZBUiApOwotICAgICAgeSsrOwotICAgIH0KLQotICAgIHJldHVybiBTVUNDRVNTOwotCi0gIFNjYW5fRHJvcE91dHM6Ci0KLSAgICBQX0xlZnQgID0gZHJhd19sZWZ0OwotICAgIFBfUmlnaHQgPSBkcmF3X3JpZ2h0OwotCi0gICAgd2hpbGUgKCBQX0xlZnQgKQotICAgIHsKLSAgICAgIGlmICggUF9MZWZ0LT5jb3VudEwgKQotICAgICAgewotICAgICAgICBQX0xlZnQtPmNvdW50TCA9IDA7Ci0jaWYgMAotICAgICAgICBkcm9wb3V0cy0tOyAgLyogLS0gdGhpcyBpcyB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgb25seSAqLwotI2VuZGlmCi0gICAgICAgIHJhcy5Qcm9jX1N3ZWVwX0Ryb3AoIFJBU19WQVJTIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBfTGVmdC0+WCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9SaWdodC0+WCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQX1JpZ2h0ICk7Ci0gICAgICB9Ci0KLSAgICAgIFBfTGVmdCAgPSBQX0xlZnQtPmxpbms7Ci0gICAgICBQX1JpZ2h0ID0gUF9SaWdodC0+bGluazsKLSAgICB9Ci0KLSAgICBnb3RvIE5leHRfTGluZTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyX1NpbmdsZV9QYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGVyZm9ybSBvbmUgc3dlZXAgd2l0aCBzdWItYmFuZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxpcHBlZCA6OiBJZiBzZXQsIGZsaXAgdGhlIGRpcmVjdGlvbiBvZiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyZXIgZXJyb3IgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgaW50Ci0gIFJlbmRlcl9TaW5nbGVfUGFzcyggUkFTX0FSR1MgQm9vbCAgZmxpcHBlZCApCi0gIHsKLSAgICBTaG9ydCAgaSwgaiwgazsKLQotCi0gICAgd2hpbGUgKCByYXMuYmFuZF90b3AgPj0gMCApCi0gICAgewotICAgICAgcmFzLm1heFkgPSAoTG9uZylyYXMuYmFuZF9zdGFja1tyYXMuYmFuZF90b3BdLnlfbWF4ICogcmFzLnByZWNpc2lvbjsKLSAgICAgIHJhcy5taW5ZID0gKExvbmcpcmFzLmJhbmRfc3RhY2tbcmFzLmJhbmRfdG9wXS55X21pbiAqIHJhcy5wcmVjaXNpb247Ci0KLSAgICAgIHJhcy50b3AgPSByYXMuYnVmZjsKLQotICAgICAgcmFzLmVycm9yID0gUmFzdGVyX0Vycl9Ob25lOwotCi0gICAgICBpZiAoIENvbnZlcnRfR2x5cGgoIFJBU19WQVJTIGZsaXBwZWQgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggcmFzLmVycm9yICE9IFJhc3Rlcl9FcnJfT3ZlcmZsb3cgKQotICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotCi0gICAgICAgIHJhcy5lcnJvciA9IFJhc3Rlcl9FcnJfTm9uZTsKLQotICAgICAgICAvKiBzdWItYmFuZGluZyAqLwotCi0jaWZkZWYgREVCVUdfUkFTVEVSCi0gICAgICAgIENsZWFyQmFuZCggUkFTX1ZBUlMgVFJVTkMoIHJhcy5taW5ZICksIFRSVU5DKCByYXMubWF4WSApICk7Ci0jZW5kaWYKLQotICAgICAgICBpID0gcmFzLmJhbmRfc3RhY2tbcmFzLmJhbmRfdG9wXS55X21pbjsKLSAgICAgICAgaiA9IHJhcy5iYW5kX3N0YWNrW3Jhcy5iYW5kX3RvcF0ueV9tYXg7Ci0KLSAgICAgICAgayA9IChTaG9ydCkoICggaSArIGogKSAvIDIgKTsKLQotICAgICAgICBpZiAoIHJhcy5iYW5kX3RvcCA+PSA3IHx8IGsgPCBpICkKLSAgICAgICAgewotICAgICAgICAgIHJhcy5iYW5kX3RvcCA9IDA7Ci0gICAgICAgICAgcmFzLmVycm9yICAgID0gRlRfVEhST1coIEludmFsaWQgKTsKLQotICAgICAgICAgIHJldHVybiByYXMuZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICByYXMuYmFuZF9zdGFja1tyYXMuYmFuZF90b3AgKyAxXS55X21pbiA9IGs7Ci0gICAgICAgIHJhcy5iYW5kX3N0YWNrW3Jhcy5iYW5kX3RvcCArIDFdLnlfbWF4ID0gajsKLQotICAgICAgICByYXMuYmFuZF9zdGFja1tyYXMuYmFuZF90b3BdLnlfbWF4ID0gKFNob3J0KSggayAtIDEgKTsKLQotICAgICAgICByYXMuYmFuZF90b3ArKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCByYXMuZlByb2ZpbGUgKQotICAgICAgICAgIGlmICggRHJhd19Td2VlcCggUkFTX1ZBUiApICkKLSAgICAgICAgICAgICByZXR1cm4gcmFzLmVycm9yOwotICAgICAgICByYXMuYmFuZF90b3AtLTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyIGEgZ2x5cGggaW4gYSBiaXRtYXAuICBTdWItYmFuZGluZyBpZiBuZWVkZWQuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgUmVuZGVyX0dseXBoKCBSQVNfQVJHICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgU2V0X0hpZ2hfUHJlY2lzaW9uKCBSQVNfVkFSUyByYXMub3V0bGluZS5mbGFncyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OICk7Ci0gICAgcmFzLnNjYWxlX3NoaWZ0ID0gcmFzLnByZWNpc2lvbl9zaGlmdDsKLQotICAgIGlmICggcmFzLm91dGxpbmUuZmxhZ3MgJiBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUyApCi0gICAgICByYXMuZHJvcE91dENvbnRyb2wgPSAyOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIHJhcy5vdXRsaW5lLmZsYWdzICYgRlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUyApCi0gICAgICAgIHJhcy5kcm9wT3V0Q29udHJvbCA9IDQ7Ci0gICAgICBlbHNlCi0gICAgICAgIHJhcy5kcm9wT3V0Q29udHJvbCA9IDA7Ci0KLSAgICAgIGlmICggISggcmFzLm91dGxpbmUuZmxhZ3MgJiBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgKSApCi0gICAgICAgIHJhcy5kcm9wT3V0Q29udHJvbCArPSAxOwotICAgIH0KLQotICAgIHJhcy5zZWNvbmRfcGFzcyA9IChCb29sKSggISggcmFzLm91dGxpbmUuZmxhZ3MgICAgICAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTICkgKTsKLQotICAgIC8qIFZlcnRpY2FsIFN3ZWVwICovCi0gICAgRlRfVFJBQ0U3KCggIlZlcnRpY2FsIHBhc3MgKGZ0cmFzdGVyKVxuIiApKTsKLQotICAgIHJhcy5Qcm9jX1N3ZWVwX0luaXQgPSBWZXJ0aWNhbF9Td2VlcF9Jbml0OwotICAgIHJhcy5Qcm9jX1N3ZWVwX1NwYW4gPSBWZXJ0aWNhbF9Td2VlcF9TcGFuOwotICAgIHJhcy5Qcm9jX1N3ZWVwX0Ryb3AgPSBWZXJ0aWNhbF9Td2VlcF9Ecm9wOwotICAgIHJhcy5Qcm9jX1N3ZWVwX1N0ZXAgPSBWZXJ0aWNhbF9Td2VlcF9TdGVwOwotCi0gICAgcmFzLmJhbmRfdG9wICAgICAgICAgICAgPSAwOwotICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWluID0gMDsKLSAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IChTaG9ydCkoIHJhcy50YXJnZXQucm93cyAtIDEgKTsKLQotICAgIHJhcy5iV2lkdGggID0gKFVTaG9ydClyYXMudGFyZ2V0LndpZHRoOwotICAgIHJhcy5iVGFyZ2V0ID0gKEJ5dGUqKXJhcy50YXJnZXQuYnVmZmVyOwotCi0gICAgaWYgKCAoIGVycm9yID0gUmVuZGVyX1NpbmdsZV9QYXNzKCBSQVNfVkFSUyAwICkgKSAhPSAwICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIEhvcml6b250YWwgU3dlZXAgKi8KLSAgICBpZiAoIHJhcy5zZWNvbmRfcGFzcyAmJiByYXMuZHJvcE91dENvbnRyb2wgIT0gMiApCi0gICAgewotICAgICAgRlRfVFJBQ0U3KCggIkhvcml6b250YWwgcGFzcyAoZnRyYXN0ZXIpXG4iICkpOwotCi0gICAgICByYXMuUHJvY19Td2VlcF9Jbml0ID0gSG9yaXpvbnRhbF9Td2VlcF9Jbml0OwotICAgICAgcmFzLlByb2NfU3dlZXBfU3BhbiA9IEhvcml6b250YWxfU3dlZXBfU3BhbjsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX0Ryb3AgPSBIb3Jpem9udGFsX1N3ZWVwX0Ryb3A7Ci0gICAgICByYXMuUHJvY19Td2VlcF9TdGVwID0gSG9yaXpvbnRhbF9Td2VlcF9TdGVwOwotCi0gICAgICByYXMuYmFuZF90b3AgICAgICAgICAgICA9IDA7Ci0gICAgICByYXMuYmFuZF9zdGFja1swXS55X21pbiA9IDA7Ci0gICAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IChTaG9ydCkoIHJhcy50YXJnZXQud2lkdGggLSAxICk7Ci0KLSAgICAgIGlmICggKCBlcnJvciA9IFJlbmRlcl9TaW5nbGVfUGFzcyggUkFTX1ZBUlMgMSApICkgIT0gMCApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gUmFzdGVyX0Vycl9Ob25lOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9ibGFja19pbml0KCBibGFja19QUmFzdGVyICByYXN0ZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCByYXN0ZXIgKTsKLSAgfQotCi0KLSAgLyoqKiogUkFTVEVSIE9CSkVDVCBDUkVBVElPTjogSW4gc3RhbmRhbG9uZSBtb2RlLCB3ZSBzaW1wbHkgdXNlICoqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBhIHN0YXRpYyBvYmplY3QuICAgICAgICAgICAgICAgICAgKioqKiovCi0KLQotI2lmZGVmIFNUQU5EQUxPTkVfCi0KLQotICBzdGF0aWMgaW50Ci0gIGZ0X2JsYWNrX25ldyggdm9pZCogICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgIEZUX1Jhc3RlciAgKmFyYXN0ZXIgKQotICB7Ci0gICAgIHN0YXRpYyBibGFja19UUmFzdGVyICB0aGVfcmFzdGVyOwotICAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwotCi0KLSAgICAgKmFyYXN0ZXIgPSAoRlRfUmFzdGVyKSZ0aGVfcmFzdGVyOwotICAgICBGVF9aRVJPKCAmdGhlX3Jhc3RlciApOwotICAgICBmdF9ibGFja19pbml0KCAmdGhlX3Jhc3RlciApOwotCi0gICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9ibGFja19kb25lKCBGVF9SYXN0ZXIgIHJhc3RlciApCi0gIHsKLSAgICAvKiBub3RoaW5nICovCi0gICAgRlRfVU5VU0VEKCByYXN0ZXIgKTsKLSAgfQotCi0KLSNlbHNlIC8qICFTVEFOREFMT05FXyAqLwotCi0KLSAgc3RhdGljIGludAotICBmdF9ibGFja19uZXcoIEZUX01lbW9yeSAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgYmxhY2tfUFJhc3RlciAgKmFyYXN0ZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgYmxhY2tfUFJhc3RlciAgcmFzdGVyID0gTlVMTDsKLQotCi0gICAgKmFyYXN0ZXIgPSAwOwotICAgIGlmICggIUZUX05FVyggcmFzdGVyICkgKQotICAgIHsKLSAgICAgIHJhc3Rlci0+bWVtb3J5ID0gbWVtb3J5OwotICAgICAgZnRfYmxhY2tfaW5pdCggcmFzdGVyICk7Ci0KLSAgICAgICphcmFzdGVyID0gcmFzdGVyOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfYmxhY2tfZG9uZSggYmxhY2tfUFJhc3RlciAgcmFzdGVyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gKEZUX01lbW9yeSlyYXN0ZXItPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggcmFzdGVyICk7Ci0gIH0KLQotCi0jZW5kaWYgLyogIVNUQU5EQUxPTkVfICovCi0KLQotICBzdGF0aWMgdm9pZAotICBmdF9ibGFja19yZXNldCggRlRfUmFzdGVyICByYXN0ZXIsCi0gICAgICAgICAgICAgICAgICBQQnl0ZSAgICAgIHBvb2xfYmFzZSwKLSAgICAgICAgICAgICAgICAgIFVMb25nICAgICAgcG9vbF9zaXplICkKLSAgewotICAgIEZUX1VOVVNFRCggcmFzdGVyICk7Ci0gICAgRlRfVU5VU0VEKCBwb29sX2Jhc2UgKTsKLSAgICBGVF9VTlVTRUQoIHBvb2xfc2l6ZSApOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGZ0X2JsYWNrX3NldF9tb2RlKCBGVF9SYXN0ZXIgIHJhc3RlciwKLSAgICAgICAgICAgICAgICAgICAgIFVMb25nICAgICAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHJhc3RlciApOwotICAgIEZUX1VOVVNFRCggbW9kZSApOwotICAgIEZUX1VOVVNFRCggYXJncyApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZnRfYmxhY2tfcmVuZGVyKCBGVF9SYXN0ZXIgICAgICAgICAgICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKQotICB7Ci0gICAgY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUgICAgPSAoY29uc3QgRlRfT3V0bGluZSopcGFyYW1zLT5zb3VyY2U7Ci0gICAgY29uc3QgRlRfQml0bWFwKiAgIHRhcmdldF9tYXAgPSBwYXJhbXMtPnRhcmdldDsKLQotICAgIGJsYWNrX1RXb3JrZXIgIHdvcmtlclsxXTsKLQotICAgIExvbmcgIGJ1ZmZlcltGVF9NQVhfQkxBQ0tfUE9PTF07Ci0KLQotICAgIGlmICggIXJhc3RlciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIE5vdF9JbmkgKTsKLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkICk7Ci0KLSAgICAvKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIG91dGxpbmUgaXMgZW1wdHkgKi8KLSAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzID09IDAgfHwgb3V0bGluZS0+bl9jb250b3VycyA8PSAwICkKLSAgICAgIHJldHVybiBSYXN0ZXJfRXJyX05vbmU7Ci0KLSAgICBpZiAoICFvdXRsaW5lLT5jb250b3VycyB8fCAhb3V0bGluZS0+cG9pbnRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZCApOwotCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyAhPQotICAgICAgICAgICBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV0gKyAxICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZCApOwotCi0gICAgLyogdGhpcyB2ZXJzaW9uIG9mIHRoZSByYXN0ZXIgZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3QgcmVuZGVyaW5nLCBzb3JyeSAqLwotICAgIGlmICggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVuc3VwcG9ydGVkICk7Ci0KLSAgICBpZiAoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19BQSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVuc3VwcG9ydGVkICk7Ci0KLSAgICBpZiAoICF0YXJnZXRfbWFwICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZCApOwotCi0gICAgLyogbm90aGluZyB0byBkbyAqLwotICAgIGlmICggIXRhcmdldF9tYXAtPndpZHRoIHx8ICF0YXJnZXRfbWFwLT5yb3dzICkKLSAgICAgIHJldHVybiBSYXN0ZXJfRXJyX05vbmU7Ci0KLSAgICBpZiAoICF0YXJnZXRfbWFwLT5idWZmZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkICk7Ci0KLSAgICAvKiByZWplY3QgdG9vIGxhcmdlIG91dGxpbmUgY29vcmRpbmF0ZXMgKi8KLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gdmVjICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgICAgewotICAgICAgICBpZiAoIHZlYy0+eCA8IC0weDEwMDAwMDBMIHx8IHZlYy0+eCA+IDB4MTAwMDAwMEwgfHwKLSAgICAgICAgICAgICB2ZWMtPnkgPCAtMHgxMDAwMDAwTCB8fCB2ZWMtPnkgPiAweDEwMDAwMDBMICkKLSAgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZCApOwotICAgICAgfQotICAgIH0KLQotICAgIHJhcy5vdXRsaW5lID0gKm91dGxpbmU7Ci0gICAgcmFzLnRhcmdldCAgPSAqdGFyZ2V0X21hcDsKLQotICAgIHdvcmtlci0+YnVmZiAgICAgPSBidWZmZXI7Ci0gICAgd29ya2VyLT5zaXplQnVmZiA9ICgmYnVmZmVyKVsxXTsgLyogUG9pbnRzIHRvIHJpZ2h0IGFmdGVyIGJ1ZmZlci4gKi8KLQotICAgIHJldHVybiBSZW5kZXJfR2x5cGgoIFJBU19WQVIgKTsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1JBU1RFUl9GVU5DUygKLSAgICBmdF9zdGFuZGFyZF9yYXN0ZXIsCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SYXN0ZXJfTmV3X0Z1bmMpICAgICBmdF9ibGFja19uZXcsICAgICAgIC8qIHJhc3Rlcl9uZXcgICAgICAqLwotICAgIChGVF9SYXN0ZXJfUmVzZXRfRnVuYykgICBmdF9ibGFja19yZXNldCwgICAgIC8qIHJhc3Rlcl9yZXNldCAgICAqLwotICAgIChGVF9SYXN0ZXJfU2V0X01vZGVfRnVuYylmdF9ibGFja19zZXRfbW9kZSwgIC8qIHJhc3Rlcl9zZXRfbW9kZSAqLwotICAgIChGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMpICBmdF9ibGFja19yZW5kZXIsICAgIC8qIHJhc3Rlcl9yZW5kZXIgICAqLwotICAgIChGVF9SYXN0ZXJfRG9uZV9GdW5jKSAgICBmdF9ibGFja19kb25lICAgICAgIC8qIHJhc3Rlcl9kb25lICAgICAqLwotICApCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmggYi9zcmMvcmFzdGVyL2Z0cmFzdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMzA1MGMuLjAwMDAwMDAKLS0tIGEvc3JjL3Jhc3Rlci9mdHJhc3Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyYXN0ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUUkFTVEVSX0hfCi0jZGVmaW5lIEZUUkFTVEVSX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSBpZiB5b3UgYXJlIHVzaW5nIGZ0cmFzdGVyLmMgYXMgYSAgICAgICAgICovCi0gIC8qIHN0YW5kYWxvbmUgbW9kdWxlLCBmdWxseSBpbmRlcGVuZGVudCBvZiBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgU1RBTkRBTE9ORV8gKi8KLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9SYXN0ZXJfRnVuY3MgKSAgZnRfc3RhbmRhcmRfcmFzdGVyOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUUkFTVEVSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0cmVuZDEuYyBiL3NyYy9yYXN0ZXIvZnRyZW5kMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJjYTFkLi4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvZnRyZW5kMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmVuZDEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggcmFzdGVyaXplciBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgImZ0cmVuZDEuaCIKLSNpbmNsdWRlICJmdHJhc3Rlci5oIgotI2luY2x1ZGUgInJhc3RwaWMuaCIKLQotI2luY2x1ZGUgInJhc3RlcnJzLmgiCi0KLQotICAvKiBpbml0aWFsaXplIHJlbmRlcmVyIC0tIGluaXQgaXRzIHJhc3RlciAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfcmFzdGVyMV9pbml0KCBGVF9SZW5kZXJlciAgcmVuZGVyICkKLSAgewotICAgIHJlbmRlci0+Y2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX3Jlc2V0KCByZW5kZXItPnJhc3RlciwgTlVMTCwgMCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogc2V0IHJlbmRlci1zcGVjaWZpYyBtb2RlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX3NldF9tb2RlKCBGVF9SZW5kZXJlciAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgbW9kZV90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBkYXRhICkKLSAgewotICAgIC8qIHdlIHNpbXBseSBwYXNzIGl0IHRvIHRoZSByYXN0ZXIgKi8KLSAgICByZXR1cm4gcmVuZGVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfc2V0X21vZGUoIHJlbmRlci0+cmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICk7Ci0gIH0KLQotCi0gIC8qIHRyYW5zZm9ybSBhIGdpdmVuIGdseXBoIGltYWdlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX3RyYW5zZm9ybSggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIGRlbHRhICkKLSAgewotICAgIEZUX0Vycm9yIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSByZW5kZXItPmdseXBoX2Zvcm1hdCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggbWF0cml4ICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmc2xvdC0+b3V0bGluZSwgbWF0cml4ICk7Ci0KLSAgICBpZiAoIGRlbHRhICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmc2xvdC0+b3V0bGluZSwgZGVsdGEtPngsIGRlbHRhLT55ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHJldHVybiB0aGUgZ2x5cGgncyBjb250cm9sIGJveCAqLwotICBzdGF0aWMgdm9pZAotICBmdF9yYXN0ZXIxX2dldF9jYm94KCBGVF9SZW5kZXJlciAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94KiAgICAgIGNib3ggKQotICB7Ci0gICAgRlRfWkVSTyggY2JveCApOwotCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgPT0gcmVuZGVyLT5nbHlwaF9mb3JtYXQgKQotICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJnNsb3QtPm91dGxpbmUsIGNib3ggKTsKLSAgfQotCi0KLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX3JlbmRlciggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX091dGxpbmUqICBvdXRsaW5lOwotICAgIEZUX0JCb3ggICAgICBjYm94LCBjYm94MDsKLSAgICBGVF9VSW50ICAgICAgd2lkdGgsIGhlaWdodCwgcGl0Y2g7Ci0gICAgRlRfQml0bWFwKiAgIGJpdG1hcDsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotCi0gICAgRlRfUmFzdGVyX1BhcmFtcyAgcGFyYW1zOwotCi0KLSAgICAvKiBjaGVjayBnbHlwaCBpbWFnZSBmb3JtYXQgKi8KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSByZW5kZXItPmdseXBoX2Zvcm1hdCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGNoZWNrIHJlbmRlcmluZyBtb2RlICovCi0gICAgaWYgKCBtb2RlICE9IEZUX1JFTkRFUl9NT0RFX01PTk8gKQotICAgIHsKLSAgICAgIC8qIHJhc3RlcjEgaXMgb25seSBjYXBhYmxlIG9mIHByb2R1Y2luZyBtb25vY2hyb21lIGJpdG1hcHMgKi8KLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X1JlbmRlcl9HbHlwaCApOwotICAgIH0KLQotICAgIG91dGxpbmUgPSAmc2xvdC0+b3V0bGluZTsKLQotICAgIC8qIHRyYW5zbGF0ZSB0aGUgb3V0bGluZSB0byB0aGUgbmV3IG9yaWdpbiBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIG9yaWdpbiApCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgb3JpZ2luLT54LCBvcmlnaW4tPnkgKTsKLQotICAgIC8qIGNvbXB1dGUgdGhlIGNvbnRyb2wgYm94LCBhbmQgZ3JpZCBmaXQgaXQgKi8KLSAgICBGVF9PdXRsaW5lX0dldF9DQm94KCBvdXRsaW5lLCAmY2JveDAgKTsKLQotICAgIC8qIHVuZG9jdW1lbnRlZCBidXQgY29uZmlybWVkOiBiYm94IHZhbHVlcyBnZXQgcm91bmRlZCAqLwotI2lmIDEKLSAgICBjYm94LnhNaW4gPSBGVF9QSVhfUk9VTkQoIGNib3gwLnhNaW4gKTsKLSAgICBjYm94LnlNaW4gPSBGVF9QSVhfUk9VTkQoIGNib3gwLnlNaW4gKTsKLSAgICBjYm94LnhNYXggPSBGVF9QSVhfUk9VTkQoIGNib3gwLnhNYXggKTsKLSAgICBjYm94LnlNYXggPSBGVF9QSVhfUk9VTkQoIGNib3gwLnlNYXggKTsKLSNlbHNlCi0gICAgY2JveC54TWluID0gRlRfUElYX0ZMT09SKCBjYm94LnhNaW4gKTsKLSAgICBjYm94LnlNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueU1pbiApOwotICAgIGNib3gueE1heCA9IEZUX1BJWF9DRUlMKCBjYm94LnhNYXggKTsKLSAgICBjYm94LnlNYXggPSBGVF9QSVhfQ0VJTCggY2JveC55TWF4ICk7Ci0jZW5kaWYKLQotICAgIC8qIElmIGVpdGhlciBgd2lkdGgnIG9yIGBoZWlnaHQnIHJvdW5kIHRvIDAsIHRyeSAgICAqLwotICAgIC8qIGV4cGxpY2l0bHkgcm91bmRpbmcgdXAvZG93bi4gIEluIHRoZSBjYXNlIG9mICAgICAqLwotICAgIC8qIGdseXBocyBjb250YWluaW5nIG9ubHkgb25lIHZlcnkgbmFycm93IGZlYXR1cmUsICAqLwotICAgIC8qIHRoaXMgZ2l2ZXMgdGhlIGRyb3Atb3V0IGNvbXBlbnNhdGlvbiBpbiB0aGUgc2NhbiAqLwotICAgIC8qIGNvbnZlcnNpb24gY29kZSBhIGNoYW5jZSB0byBkbyBpdHMgc3R1ZmYuICAgICAgICAqLwotICAgIHdpZHRoICA9IChGVF9VSW50KSggKCBjYm94LnhNYXggLSBjYm94LnhNaW4gKSA+PiA2ICk7Ci0gICAgaWYgKCB3aWR0aCA9PSAwICkKLSAgICB7Ci0gICAgICBjYm94LnhNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gwLnhNaW4gKTsKLSAgICAgIGNib3gueE1heCA9IEZUX1BJWF9DRUlMKCBjYm94MC54TWF4ICk7Ci0KLSAgICAgIHdpZHRoID0gKEZUX1VJbnQpKCAoIGNib3gueE1heCAtIGNib3gueE1pbiApID4+IDYgKTsKLSAgICB9Ci0KLSAgICBoZWlnaHQgPSAoRlRfVUludCkoICggY2JveC55TWF4IC0gY2JveC55TWluICkgPj4gNiApOwotICAgIGlmICggaGVpZ2h0ID09IDAgKQotICAgIHsKLSAgICAgIGNib3gueU1pbiA9IEZUX1BJWF9GTE9PUiggY2JveDAueU1pbiApOwotICAgICAgY2JveC55TWF4ID0gRlRfUElYX0NFSUwoIGNib3gwLnlNYXggKTsKLQotICAgICAgaGVpZ2h0ID0gKEZUX1VJbnQpKCAoIGNib3gueU1heCAtIGNib3gueU1pbiApID4+IDYgKTsKLSAgICB9Ci0KLSAgICBpZiAoIHdpZHRoID4gRlRfVVNIT1JUX01BWCB8fCBoZWlnaHQgPiBGVF9VU0hPUlRfTUFYICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgYml0bWFwID0gJnNsb3QtPmJpdG1hcDsKLSAgICBtZW1vcnkgPSByZW5kZXItPnJvb3QubWVtb3J5OwotCi0gICAgLyogcmVsZWFzZSBvbGQgYml0bWFwIGJ1ZmZlciAqLwotICAgIGlmICggc2xvdC0+aW50ZXJuYWwtPmZsYWdzICYgRlRfR0xZUEhfT1dOX0JJVE1BUCApCi0gICAgewotICAgICAgRlRfRlJFRSggYml0bWFwLT5idWZmZXIgKTsKLSAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyAmPSB+RlRfR0xZUEhfT1dOX0JJVE1BUDsKLSAgICB9Ci0KLSAgICBwaXRjaCAgICAgICAgICAgICAgPSAoICggd2lkdGggKyAxNSApID4+IDQgKSA8PCAxOwotICAgIGJpdG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTU9OTzsKLQotICAgIGJpdG1hcC0+d2lkdGggPSB3aWR0aDsKLSAgICBiaXRtYXAtPnJvd3MgID0gaGVpZ2h0OwotICAgIGJpdG1hcC0+cGl0Y2ggPSAoaW50KXBpdGNoOwotCi0gICAgaWYgKCBGVF9BTExPQ19NVUxUKCBiaXRtYXAtPmJ1ZmZlciwgcGl0Y2gsIGhlaWdodCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHNsb3QtPmludGVybmFsLT5mbGFncyB8PSBGVF9HTFlQSF9PV05fQklUTUFQOwotCi0gICAgLyogdHJhbnNsYXRlIG91dGxpbmUgdG8gcmVuZGVyIGl0IGludG8gdGhlIGJpdG1hcCAqLwotICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBvdXRsaW5lLCAtY2JveC54TWluLCAtY2JveC55TWluICk7Ci0KLSAgICAvKiBzZXQgdXAgcGFyYW1ldGVycyAqLwotICAgIHBhcmFtcy50YXJnZXQgPSBiaXRtYXA7Ci0gICAgcGFyYW1zLnNvdXJjZSA9IG91dGxpbmU7Ci0gICAgcGFyYW1zLmZsYWdzICA9IDA7Ci0KLSAgICAvKiByZW5kZXIgb3V0bGluZSBpbnRvIHRoZSBiaXRtYXAgKi8KLSAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKLQotICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBvdXRsaW5lLCBjYm94LnhNaW4sIGNib3gueU1pbiApOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzbG90LT5mb3JtYXQgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVA7Ci0gICAgc2xvdC0+Yml0bWFwX2xlZnQgPSAoRlRfSW50KSggY2JveC54TWluID4+IDYgKTsKLSAgICBzbG90LT5iaXRtYXBfdG9wICA9IChGVF9JbnQpKCBjYm94LnlNYXggPj4gNiApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9ERUZJTkVfUkVOREVSRVIoCi0gICAgZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzcywKLQotICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSLAotICAgICAgc2l6ZW9mICggRlRfUmVuZGVyZXJSZWMgKSwKLQotICAgICAgInJhc3RlcjEiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgTlVMTCwgICAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKWZ0X3Jhc3RlcjFfaW5pdCwgIC8qIG1vZHVsZV9pbml0ICAgKi8KLSAgICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgTlVMTCwgICAgICAgICAgICAgLyogbW9kdWxlX2RvbmUgICAqLwotICAgICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICBOVUxMLCAgICAgICAgICAgICAvKiBnZXRfaW50ZXJmYWNlICovCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSAgIGZ0X3Jhc3RlcjFfcmVuZGVyLCAgICAgLyogcmVuZGVyX2dseXBoICAgICovCi0gICAgKEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMpZnRfcmFzdGVyMV90cmFuc2Zvcm0sICAvKiB0cmFuc2Zvcm1fZ2x5cGggKi8KLSAgICAoRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMpICBmdF9yYXN0ZXIxX2dldF9jYm94LCAgIC8qIGdldF9nbHlwaF9jYm94ICAqLwotICAgIChGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYykgIGZ0X3Jhc3RlcjFfc2V0X21vZGUsICAgLyogc2V0X21vZGUgICAgICAgICovCi0KLSAgICAoRlRfUmFzdGVyX0Z1bmNzKikmRlRfU1RBTkRBUkRfUkFTVEVSX0dFVCAgICAgICAgIC8qIHJhc3Rlcl9jbGFzcyAgICAqLwotICApCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0cmVuZDEuaCBiL3NyYy9yYXN0ZXIvZnRyZW5kMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY3MDJkLi4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvZnRyZW5kMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyZW5kMS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEZUUkVORDFfSF8KLSNkZWZpbmUgRlRSRU5EMV9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfUkVOREVSX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3MgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUUkVORDFfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9yYXN0ZXIvbW9kdWxlLm1rIGIvc3JjL3Jhc3Rlci9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDM5Y2IuLjAwMDAwMDAKLS0tIGEvc3JjL3Jhc3Rlci9tb2R1bGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgcmVuZGVyZXIgbW9kdWxlIGRlZmluaXRpb24KLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLUZUTU9EVUxFX0hfQ09NTUFORFMgKz0gUkFTVEVSX01PRFVMRQotCi1kZWZpbmUgUkFTVEVSX01PRFVMRQotJChPUEVOX0RSSVZFUikgRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3MgJChDTE9TRV9EUklWRVIpCi0kKEVDSE9fRFJJVkVSKXJhc3RlciAgICAkKEVDSE9fRFJJVkVSX0RFU0MpbW9ub2Nocm9tZSBiaXRtYXAgcmVuZGVyZXIkKEVDSE9fRFJJVkVSX0RPTkUpCi1lbmRlZgotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9yYXN0ZXIuYyBiL3NyYy9yYXN0ZXIvcmFzdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTY2OTAuLjAwMDAwMDAKLS0tIGEvc3JjL3Jhc3Rlci9yYXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJhc3Rlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb25vY2hyb21lIHJhc3RlcmVyIG1vZHVsZSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgImZ0cmFzdGVyLmMiCi0jaW5jbHVkZSAiZnRyZW5kMS5jIgotI2luY2x1ZGUgInJhc3RwaWMuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9yYXN0ZXIvcmFzdGVycnMuaCBiL3NyYy9yYXN0ZXIvcmFzdGVycnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2NDY5MC4uMDAwMDAwMAotLS0gYS9zcmMvcmFzdGVyL3Jhc3RlcnJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICByYXN0ZXJycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbW9ub2Nocm9tZSByZW5kZXJlciBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIG1vbm9jaHJvbWUgcmVuZGVyZXIgZXJyb3IgZW51bWVyYXRpb24gKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBSQVNURVJSU19IXwotI2RlZmluZSBSQVNURVJSU19IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBSYXN0ZXJfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1Jhc3RlcgotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogUkFTVEVSUlNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9yYXN0ZXIvcmFzdHBpYy5jIGIvc3JjL3Jhc3Rlci9yYXN0cGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODUzMzkuLjAwMDAwMDAKLS0tIGEvc3JjL3Jhc3Rlci9yYXN0cGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICByYXN0cGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHJhc3RlciBtb2R1bGUuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAicmFzdHBpYy5oIgotI2luY2x1ZGUgInJhc3RlcnJzLmgiCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSBmdHJhc3Rlci5jICovCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19mdF9zdGFuZGFyZF9yYXN0ZXIoIEZUX1Jhc3Rlcl9GdW5jcyogIGZ1bmNzICk7Ci0KLQotICB2b2lkCi0gIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5yYXN0ZXIgKQotICAgIHsKLSAgICAgIFJhc3RlclBJQyogIGNvbnRhaW5lciA9IChSYXN0ZXJQSUMqKXBpY19jb250YWluZXItPnJhc3RlcjsKLQotCi0gICAgICBpZiAoIC0tY29udGFpbmVyLT5yZWZfY291bnQgKQotICAgICAgICByZXR1cm47Ci0gICAgICBGVF9GUkVFKCBjb250YWluZXIgKTsKLSAgICAgIHBpY19jb250YWluZXItPnJhc3RlciA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgUmFzdGVyUElDKiAgICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBYWFg6IHNpbmNlIHRoaXMgZnVuY3Rpb24gYWxzbyBzZXJ2ZWQgdGhlIG5vIGxvbmdlciBhdmFpbGFibGUgICovCi0gICAgLyogICAgICByYXN0ZXI1IHJlbmRlcmVyIGl0IHVzZXMgcmVmZXJlbmNlIGNvdW50aW5nLCB3aGljaCBjb3VsZCAqLwotICAgIC8qICAgICAgYmUgcmVtb3ZlZCBub3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIHBpY19jb250YWluZXItPnJhc3RlciApCi0gICAgewotICAgICAgKChSYXN0ZXJQSUMqKXBpY19jb250YWluZXItPnJhc3RlciktPnJlZl9jb3VudCsrOwotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIHBvaW50ZXIsIGNsZWFyIGFuZCBzZXQgZ2xvYmFsIGNvbnRhaW5lciBwb2ludGVyICovCi0gICAgaWYgKCBGVF9BTExPQyggY29udGFpbmVyLCBzaXplb2YgKCAqY29udGFpbmVyICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgRlRfTUVNX1NFVCggY29udGFpbmVyLCAwLCBzaXplb2YgKCAqY29udGFpbmVyICkgKTsKLSAgICBwaWNfY29udGFpbmVyLT5yYXN0ZXIgPSBjb250YWluZXI7Ci0KLSAgICBjb250YWluZXItPnJlZl9jb3VudCA9IDE7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBvaW50ZXIgdGFibGUgLSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB0aGlzIGlzIGhvdyB0aGUgbW9kdWxlIHVzdWFsbHkgZXhwZWN0cyB0aGlzIGRhdGEgKi8KLSAgICBGVF9Jbml0X0NsYXNzX2Z0X3N0YW5kYXJkX3Jhc3RlciggJmNvbnRhaW5lci0+ZnRfc3RhbmRhcmRfcmFzdGVyICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL3Jhc3RwaWMuaCBiL3NyYy9yYXN0ZXIvcmFzdHBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Q2OTEzLi4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvcmFzdHBpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcmFzdHBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciByYXN0ZXIgbW9kdWxlLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFJBU1RQSUNfSF8KLSNkZWZpbmUgUkFTVFBJQ19IXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9TVEFOREFSRF9SQVNURVJfR0VUICBmdF9zdGFuZGFyZF9yYXN0ZXIKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgUmFzdGVyUElDXwotICB7Ci0gICAgaW50ICAgICAgICAgICAgICByZWZfY291bnQ7Ci0gICAgRlRfUmFzdGVyX0Z1bmNzICBmdF9zdGFuZGFyZF9yYXN0ZXI7Ci0KLSAgfSBSYXN0ZXJQSUM7Ci0KLQotI2RlZmluZSBHRVRfUElDKCBsaWIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChSYXN0ZXJQSUMqKSggKGxpYiktPnBpY19jb250YWluZXIucmFzdGVyICkgKQotI2RlZmluZSBGVF9TVEFOREFSRF9SQVNURVJfR0VUICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+ZnRfc3RhbmRhcmRfcmFzdGVyICkKLQotCi0gIC8qIHNlZSByYXN0cGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogUkFTVFBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9ydWxlcy5tayBiL3NyYy9yYXN0ZXIvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NjJjOTMuLjAwMDAwMDAKLS0tIGEvc3JjL3Jhc3Rlci9ydWxlcy5taworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiByZW5kZXJlciBtb2R1bGUgYnVpbGQgcnVsZXMKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgcmFzdGVyIGRyaXZlciBkaXJlY3RvcnkKLSMKLVJBU1RFUl9ESVIgOj0gJChTUkNfRElSKS9yYXN0ZXIKLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotUkFTVEVSX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKFJBU1RFUl9ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyByYXN0ZXIgZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1SQVNURVJfRFJWX1NSQyA6PSAkKFJBU1RFUl9ESVIpL2Z0cmFzdGVyLmMgXAotICAgICAgICAgICAgICAgICAgJChSQVNURVJfRElSKS9mdHJlbmQxLmMgIFwKLSAgICAgICAgICAgICAgICAgICQoUkFTVEVSX0RJUikvcmFzdHBpYy5jCi0KLQotIyByYXN0ZXIgZHJpdmVyIGhlYWRlcnMKLSMKLVJBU1RFUl9EUlZfSCA6PSAkKFJBU1RFUl9EUlZfU1JDOiUuYz0lLmgpIFwKLSAgICAgICAgICAgICAgICAkKFJBU1RFUl9ESVIpL3Jhc3RlcnJzLmgKLQotCi0jIHJhc3RlciBkcml2ZXIgb2JqZWN0KHMpCi0jCi0jICAgUkFTVEVSX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcy4KLSMgICBSQVNURVJfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcy4KLSMKLVJBU1RFUl9EUlZfT0JKX00gOj0gJChSQVNURVJfRFJWX1NSQzokKFJBU1RFUl9ESVIpLyUuYz0kKE9CSl9ESVIpLyUuJE8pCi1SQVNURVJfRFJWX09CSl9TIDo9ICQoT0JKX0RJUikvcmFzdGVyLiRPCi0KLSMgcmFzdGVyIGRyaXZlciBzb3VyY2UgZmlsZSBmb3Igc2luZ2xlIGJ1aWxkCi0jCi1SQVNURVJfRFJWX1NSQ19TIDo9ICQoUkFTVEVSX0RJUikvcmFzdGVyLmMKLQotCi0jIHJhc3RlciBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0Ci0jCi0kKFJBU1RFUl9EUlZfT0JKX1MpOiAkKFJBU1RFUl9EUlZfU1JDX1MpICQoUkFTVEVSX0RSVl9TUkMpIFwKLSAgICAgICAgICAgICAgICAgICAgICQoRlJFRVRZUEVfSCkgJChSQVNURVJfRFJWX0gpCi0JJChSQVNURVJfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQoUkFTVEVSX0RSVl9TUkNfUykpCi0KLQotIyByYXN0ZXIgZHJpdmVyIC0gbXVsdGlwbGUgb2JqZWN0cwotIwotJChPQkpfRElSKS8lLiRPOiAkKFJBU1RFUl9ESVIpLyUuYyAkKEZSRUVUWVBFX0gpICQoUkFTVEVSX0RSVl9IKQotCSQoUkFTVEVSX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkPCkKLQotCi0jIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKLSMKLURSVl9PQkpTX1MgKz0gJChSQVNURVJfRFJWX09CSl9TKQotRFJWX09CSlNfTSArPSAkKFJBU1RFUl9EUlZfT0JKX00pCi0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy9zZm50L0phbWZpbGUgYi9zcmMvc2ZudC9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTcxYjI1Li4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3NmbnQgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHNmbnQgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IHBuZ3NoaW0KLSAgICAgICAgICAgICAgIHNmZHJpdmVyCi0gICAgICAgICAgICAgICBzZm50cGljCi0gICAgICAgICAgICAgICBzZm9ianMKLSAgICAgICAgICAgICAgIHR0YmRmCi0gICAgICAgICAgICAgICB0dGNtYXAKLSAgICAgICAgICAgICAgIHR0a2VybgotICAgICAgICAgICAgICAgdHRsb2FkCi0gICAgICAgICAgICAgICB0dG10eAotICAgICAgICAgICAgICAgdHRwb3N0Ci0gICAgICAgICAgICAgICB0dHNiaXQKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHNmbnQgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvc2ZudCBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9tb2R1bGUubWsgYi9zcmMvc2ZudC9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGVhMTcuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvbW9kdWxlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFNGTlQgbW9kdWxlIGRlZmluaXRpb24KLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLUZUTU9EVUxFX0hfQ09NTUFORFMgKz0gU0ZOVF9NT0RVTEUKLQotZGVmaW5lIFNGTlRfTU9EVUxFCi0kKE9QRU5fRFJJVkVSKSBGVF9Nb2R1bGVfQ2xhc3MsIHNmbnRfbW9kdWxlX2NsYXNzICQoQ0xPU0VfRFJJVkVSKQotJChFQ0hPX0RSSVZFUilzZm50ICAgICAgJChFQ0hPX0RSSVZFUl9ERVNDKWhlbHBlciBtb2R1bGUgZm9yIFRydWVUeXBlICYgT3BlblR5cGUgZm9ybWF0cyQoRUNIT19EUklWRVJfRE9ORSkKLWVuZGVmCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9wbmdzaGltLmMgYi9zcmMvc2ZudC9wbmdzaGltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjI5NmUuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvcG5nc2hpbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBuZ3NoaW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQTkcgQml0bWFwIGdseXBoIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR29vZ2xlLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdyaXR0ZW4gYnkgU3R1YXJ0IEdpbGwgYW5kIEJlaGRhZCBFc2ZhaGJvZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAotCi0KLSNpZiBkZWZpbmVkKCBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKSAmJiBcCi0gICAgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9VU0VfUE5HICkKLQotICAvKiBXZSBhbHdheXMgaW5jbHVkZSA8c2V0am1wLmg+LCBzbyBtYWtlIGxpYnBuZyBzaHV0IHVwISAqLwotI2RlZmluZSBQTkdfU0tJUF9TRVRKTVBfQ0hFQ0sgMQotI2luY2x1ZGUgPHBuZy5oPgotI2luY2x1ZGUgInBuZ3NoaW0uaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotICAvKiBUaGlzIGNvZGUgaXMgZnJlZWx5IGJhc2VkIG9uIGNhaXJvLXBuZy5jLiAgVGhlcmUncyBzbyBtYW55IHdheXMgKi8KLSAgLyogdG8gY2FsbCBsaWJwbmcsIGFuZCB0aGUgd2F5IGNhaXJvIGRvZXMgaXQgaXMgZGVmYWN0byBzdGFuZGFyZC4gICovCi0KLSAgc3RhdGljIHVuc2lnbmVkIGludAotICBtdWx0aXBseV9hbHBoYSggdW5zaWduZWQgaW50ICBhbHBoYSwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgY29sb3IgKQotICB7Ci0gICAgdW5zaWduZWQgaW50ICB0ZW1wID0gYWxwaGEgKiBjb2xvciArIDB4ODA7Ci0KLQotICAgIHJldHVybiAoIHRlbXAgKyAoIHRlbXAgPj4gOCApICkgPj4gODsKLSAgfQotCi0KLSAgLyogUHJlbXVsdGlwbGllcyBkYXRhIGFuZCBjb252ZXJ0cyBSR0JBIGJ5dGVzID0+IG5hdGl2ZSBlbmRpYW4uICovCi0gIHN0YXRpYyB2b2lkCi0gIHByZW11bHRpcGx5X2RhdGEoIHBuZ19zdHJ1Y3RwICAgIHBuZywKLSAgICAgICAgICAgICAgICAgICAgcG5nX3Jvd19pbmZvcCAgcm93X2luZm8sCi0gICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCAgICAgIGRhdGEgKQotICB7Ci0gICAgdW5zaWduZWQgaW50ICBpOwotCi0gICAgRlRfVU5VU0VEKCBwbmcgKTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCByb3dfaW5mby0+cm93Ynl0ZXM7IGkgKz0gNCApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciogIGJhc2UgID0gJmRhdGFbaV07Ci0gICAgICB1bnNpZ25lZCBpbnQgICAgYWxwaGEgPSBiYXNlWzNdOwotCi0KLSAgICAgIGlmICggYWxwaGEgPT0gMCApCi0gICAgICAgIGJhc2VbMF0gPSBiYXNlWzFdID0gYmFzZVsyXSA9IGJhc2VbM10gPSAwOwotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgcmVkICAgPSBiYXNlWzBdOwotICAgICAgICB1bnNpZ25lZCBpbnQgIGdyZWVuID0gYmFzZVsxXTsKLSAgICAgICAgdW5zaWduZWQgaW50ICBibHVlICA9IGJhc2VbMl07Ci0KLQotICAgICAgICBpZiAoIGFscGhhICE9IDB4RkYgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVkICAgPSBtdWx0aXBseV9hbHBoYSggYWxwaGEsIHJlZCAgICk7Ci0gICAgICAgICAgZ3JlZW4gPSBtdWx0aXBseV9hbHBoYSggYWxwaGEsIGdyZWVuICk7Ci0gICAgICAgICAgYmx1ZSAgPSBtdWx0aXBseV9hbHBoYSggYWxwaGEsIGJsdWUgICk7Ci0gICAgICAgIH0KLQotICAgICAgICBiYXNlWzBdID0gKHVuc2lnbmVkIGNoYXIpYmx1ZTsKLSAgICAgICAgYmFzZVsxXSA9ICh1bnNpZ25lZCBjaGFyKWdyZWVuOwotICAgICAgICBiYXNlWzJdID0gKHVuc2lnbmVkIGNoYXIpcmVkOwotICAgICAgICBiYXNlWzNdID0gKHVuc2lnbmVkIGNoYXIpYWxwaGE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBDb252ZXJ0cyBSR0J4IGJ5dGVzIHRvIEJHUkEuICovCi0gIHN0YXRpYyB2b2lkCi0gIGNvbnZlcnRfYnl0ZXNfdG9fZGF0YSggcG5nX3N0cnVjdHAgICAgcG5nLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19yb3dfaW5mb3AgIHJvd19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCAgICAgIGRhdGEgKQotICB7Ci0gICAgdW5zaWduZWQgaW50ICBpOwotCi0gICAgRlRfVU5VU0VEKCBwbmcgKTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCByb3dfaW5mby0+cm93Ynl0ZXM7IGkgKz0gNCApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciogIGJhc2UgID0gJmRhdGFbaV07Ci0gICAgICB1bnNpZ25lZCBpbnQgICAgcmVkICAgPSBiYXNlWzBdOwotICAgICAgdW5zaWduZWQgaW50ICAgIGdyZWVuID0gYmFzZVsxXTsKLSAgICAgIHVuc2lnbmVkIGludCAgICBibHVlICA9IGJhc2VbMl07Ci0KLQotICAgICAgYmFzZVswXSA9ICh1bnNpZ25lZCBjaGFyKWJsdWU7Ci0gICAgICBiYXNlWzFdID0gKHVuc2lnbmVkIGNoYXIpZ3JlZW47Ci0gICAgICBiYXNlWzJdID0gKHVuc2lnbmVkIGNoYXIpcmVkOwotICAgICAgYmFzZVszXSA9IDB4RkY7Ci0gICAgfQotICB9Ci0KLQotICAvKiBVc2UgZXJyb3IgY2FsbGJhY2sgdG8gYXZvaWQgcG5nIHdyaXRpbmcgdG8gc3RkZXJyLiAqLwotICBzdGF0aWMgdm9pZAotICBlcnJvcl9jYWxsYmFjayggcG5nX3N0cnVjdHAgICAgICBwbmcsCi0gICAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnAgIGVycm9yX21zZyApCi0gIHsKLSAgICBGVF9FcnJvciogIGVycm9yID0gKEZUX0Vycm9yKilwbmdfZ2V0X2Vycm9yX3B0ciggcG5nICk7Ci0KLSAgICBGVF9VTlVTRUQoIGVycm9yX21zZyApOwotCi0KLSAgICAqZXJyb3IgPSBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICAgZnRfbG9uZ2ptcCggcG5nX2ptcGJ1ZiggcG5nICksIDEgKTsKLSNlbmRpZgotICAgIC8qIGlmIHdlIGdldCBoZXJlLCB0aGVuIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBhYm9ydCAuLi4gKi8KLSAgfQotCi0KLSAgLyogVXNlIHdhcm5pbmcgY2FsbGJhY2sgdG8gYXZvaWQgcG5nIHdyaXRpbmcgdG8gc3RkZXJyLiAqLwotICBzdGF0aWMgdm9pZAotICB3YXJuaW5nX2NhbGxiYWNrKCBwbmdfc3RydWN0cCAgICAgIHBuZywKLSAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwICBlcnJvcl9tc2cgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBwbmcgKTsKLSAgICBGVF9VTlVTRUQoIGVycm9yX21zZyApOwotCi0gICAgLyogSnVzdCBpZ25vcmUgd2FybmluZ3MuICovCi0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHJlYWRfZGF0YV9mcm9tX0ZUX1N0cmVhbSggcG5nX3N0cnVjdHAgIHBuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfc2l6ZV90ICAgbGVuZ3RoICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgcG5nX3ZvaWRwICBwICAgICAgPSBwbmdfZ2V0X2lvX3B0ciggcG5nICk7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSAoRlRfU3RyZWFtKXA7Ci0KLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGxlbmd0aCApICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciogIGUgPSAoRlRfRXJyb3IqKXBuZ19nZXRfZXJyb3JfcHRyKCBwbmcgKTsKLQotCi0gICAgICAqZSA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9SZWFkICk7Ci0gICAgICBwbmdfZXJyb3IoIHBuZywgTlVMTCApOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtY3B5KCBkYXRhLCBzdHJlYW0tPmN1cnNvciwgbGVuZ3RoICk7Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBMb2FkX1NCaXRfUG5nKCBGVF9HbHlwaFNsb3QgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgeF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgeV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgcGl4X2JpdHMsCi0gICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBwbmdfbGVuLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIHBvcHVsYXRlX21hcF9hbmRfbWV0cmljcywKLSAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICBtZXRyaWNzX29ubHkgKQotICB7Ci0gICAgRlRfQml0bWFwICAgICptYXAgICA9ICZzbG90LT5iaXRtYXA7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9TdHJlYW1SZWMgIHN0cmVhbTsKLQotICAgIHBuZ19zdHJ1Y3RwICBwbmc7Ci0gICAgcG5nX2luZm9wICAgIGluZm87Ci0gICAgcG5nX3VpbnRfMzIgIGltZ1dpZHRoLCBpbWdIZWlnaHQ7Ci0KLSAgICBpbnQgICAgICAgICBiaXRkZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlOwotICAgIEZUX0ludCAgICAgIGk7Ci0gICAgcG5nX2J5dGUqICAqcm93cyA9IE5VTEw7IC8qIHBhY2lmeSBjb21waWxlciAqLwotCi0KLSAgICBpZiAoIHhfb2Zmc2V0IDwgMCB8fAotICAgICAgICAgeV9vZmZzZXQgPCAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAhcG9wdWxhdGVfbWFwX2FuZF9tZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIChGVF9VSW50KXhfb2Zmc2V0ICsgbWV0cmljcy0+d2lkdGggID4gbWFwLT53aWR0aCB8fAotICAgICAgICAgICAoRlRfVUludCl5X29mZnNldCArIG1ldHJpY3MtPmhlaWdodCA+IG1hcC0+cm93cyAgfHwKLSAgICAgICAgICAgcGl4X2JpdHMgIT0gMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIG1hcC0+cGl4ZWxfbW9kZSAhPSBGVF9QSVhFTF9NT0RFX0JHUkEgICAgICAgICAgICApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgRlRfU3RyZWFtX09wZW5NZW1vcnkoICZzdHJlYW0sIGRhdGEsIHBuZ19sZW4gKTsKLQotICAgIHBuZyA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoIFBOR19MSUJQTkdfVkVSX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ19jYWxsYmFjayApOwotICAgIGlmICggIXBuZyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGluZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KCBwbmcgKTsKLSAgICBpZiAoICFpbmZvICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCggJnBuZywgTlVMTCwgTlVMTCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggZnRfc2V0am1wKCBwbmdfam1wYnVmKCBwbmcgKSApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIERlc3Ryb3lFeGl0OwotICAgIH0KLQotICAgIHBuZ19zZXRfcmVhZF9mbiggcG5nLCAmc3RyZWFtLCByZWFkX2RhdGFfZnJvbV9GVF9TdHJlYW0gKTsKLQotICAgIHBuZ19yZWFkX2luZm8oIHBuZywgaW5mbyApOwotICAgIHBuZ19nZXRfSUhEUiggcG5nLCBpbmZvLAotICAgICAgICAgICAgICAgICAgJmltZ1dpZHRoLCAmaW1nSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgJmJpdGRlcHRoLCAmY29sb3JfdHlwZSwgJmludGVybGFjZSwKLSAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwgKTsKLQotICAgIGlmICggZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICggIXBvcHVsYXRlX21hcF9hbmRfbWV0cmljcyAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIChGVF9JbnQpaW1nV2lkdGggICE9IG1ldHJpY3MtPndpZHRoICB8fAotICAgICAgICAgICAgIChGVF9JbnQpaW1nSGVpZ2h0ICE9IG1ldHJpY3MtPmhlaWdodCApICkgKQotICAgICAgZ290byBEZXN0cm95RXhpdDsKLQotICAgIGlmICggcG9wdWxhdGVfbWFwX2FuZF9tZXRyaWNzICkKLSAgICB7Ci0gICAgICBtZXRyaWNzLT53aWR0aCAgPSAoRlRfVVNob3J0KWltZ1dpZHRoOwotICAgICAgbWV0cmljcy0+aGVpZ2h0ID0gKEZUX1VTaG9ydClpbWdIZWlnaHQ7Ci0KLSAgICAgIG1hcC0+d2lkdGggICAgICA9IG1ldHJpY3MtPndpZHRoOwotICAgICAgbWFwLT5yb3dzICAgICAgID0gbWV0cmljcy0+aGVpZ2h0OwotICAgICAgbWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9CR1JBOwotICAgICAgbWFwLT5waXRjaCAgICAgID0gKGludCkoIG1hcC0+d2lkdGggKiA0ICk7Ci0gICAgICBtYXAtPm51bV9ncmF5cyAgPSAyNTY7Ci0KLSAgICAgIC8qIHJlamVjdCB0b28gbGFyZ2UgYml0bWFwcyBzaW1pbGFybHkgdG8gdGhlIHJhc3Rlcml6ZXIgKi8KLSAgICAgIGlmICggbWFwLT5yb3dzID4gMHg3RkZGIHx8IG1hcC0+d2lkdGggPiAweDdGRkYgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBBcnJheV9Ub29fTGFyZ2UgKTsKLSAgICAgICAgZ290byBEZXN0cm95RXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjb252ZXJ0IHBhbGV0dGUvZ3JheSBpbWFnZSB0byByZ2IgKi8KLSAgICBpZiAoIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSApCi0gICAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKCBwbmcgKTsKLQotICAgIC8qIGV4cGFuZCBncmF5IGJpdCBkZXB0aCBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSApCi0gICAgewotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwMjA5Ci0gICAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoIHBuZyApOwotI2Vsc2UKLSAgICAgIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCBwbmcgKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qIHRyYW5zZm9ybSB0cmFuc3BhcmVuY3kgdG8gYWxwaGEgKi8KLSAgICBpZiAoIHBuZ19nZXRfdmFsaWQocG5nLCBpbmZvLCBQTkdfSU5GT190Uk5TICkgKQotICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKCBwbmcgKTsKLQotICAgIGlmICggYml0ZGVwdGggPT0gMTYgKQotICAgICAgcG5nX3NldF9zdHJpcF8xNiggcG5nICk7Ci0KLSAgICBpZiAoIGJpdGRlcHRoIDwgOCApCi0gICAgICBwbmdfc2V0X3BhY2tpbmcoIHBuZyApOwotCi0gICAgLyogY29udmVydCBncmF5c2NhbGUgdG8gUkdCICovCi0gICAgaWYgKCBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgICAgICAgfHwKLSAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSApCi0gICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKCBwbmcgKTsKLQotICAgIGlmICggaW50ZXJsYWNlICE9IFBOR19JTlRFUkxBQ0VfTk9ORSApCi0gICAgICBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyggcG5nICk7Ci0KLSAgICBwbmdfc2V0X2ZpbGxlciggcG5nLCAweEZGLCBQTkdfRklMTEVSX0FGVEVSICk7Ci0KLSAgICAvKiByZWNoZWNrIGhlYWRlciBhZnRlciBzZXR0aW5nIEVYUEFORCBvcHRpb25zICovCi0gICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nLCBpbmZvICk7Ci0gICAgcG5nX2dldF9JSERSKCBwbmcsIGluZm8sCi0gICAgICAgICAgICAgICAgICAmaW1nV2lkdGgsICZpbWdIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAmYml0ZGVwdGgsICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlLAotICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCApOwotCi0gICAgaWYgKCBiaXRkZXB0aCAhPSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgISggY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgICAgICAgfHwKLSAgICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBEZXN0cm95RXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIG1ldHJpY3Nfb25seSApCi0gICAgICBnb3RvIERlc3Ryb3lFeGl0OwotCi0gICAgc3dpdGNoICggY29sb3JfdHlwZSApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBTaG91bGRuJ3QgaGFwcGVuLCBidXQgZmFsbCB0aHJvdWdoLiAqLwotCi0gICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6Ci0gICAgICBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4oIHBuZywgcHJlbXVsdGlwbHlfZGF0YSApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKLSAgICAgIC8qIEh1bW0sIHRoaXMgc21lbGxzLiAgQ2Fycnkgb24gdGhvdWdoLiAqLwotICAgICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKCBwbmcsIGNvbnZlcnRfYnl0ZXNfdG9fZGF0YSApOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCBwb3B1bGF0ZV9tYXBfYW5kX21ldHJpY3MgKQotICAgIHsKLSAgICAgIC8qIHRoaXMgZG9lc24ndCBvdmVyZmxvdzogMHg3RkZGICogMHg3RkZGICogNCA8IDJeMzIgKi8KLSAgICAgIEZUX1VMb25nICBzaXplID0gbWFwLT5yb3dzICogKEZUX1VMb25nKW1hcC0+cGl0Y2g7Ci0KLQotICAgICAgZXJyb3IgPSBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKCBzbG90LCBzaXplICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBEZXN0cm95RXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggcm93cywgaW1nSGVpZ2h0ICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLSAgICAgIGdvdG8gRGVzdHJveUV4aXQ7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCAoRlRfSW50KWltZ0hlaWdodDsgaSsrICkKLSAgICAgIHJvd3NbaV0gPSBtYXAtPmJ1ZmZlciArICggeV9vZmZzZXQgKyBpICkgKiBtYXAtPnBpdGNoICsgeF9vZmZzZXQgKiA0OwotCi0gICAgcG5nX3JlYWRfaW1hZ2UoIHBuZywgcm93cyApOwotCi0gICAgRlRfRlJFRSggcm93cyApOwotCi0gICAgcG5nX3JlYWRfZW5kKCBwbmcsIGluZm8gKTsKLQotICBEZXN0cm95RXhpdDoKLSAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCggJnBuZywgJmluZm8sIE5VTEwgKTsKLSAgICBGVF9TdHJlYW1fQ2xvc2UoICZzdHJlYW0gKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZWxzZSAvKiAhKFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAmJiBGVF9DT05GSUdfT1BUSU9OX1VTRV9QTkcpICovCi0KLSAgLyogQU5TSSBDIGRvZXNuJ3QgbGlrZSBlbXB0eSBzb3VyY2UgZmlsZXMgKi8KLSAgdHlwZWRlZiBpbnQgIF9wbmdzaGltX2R1bW15OwotCi0jZW5kaWYgLyogIShUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgJiYgRlRfQ09ORklHX09QVElPTl9VU0VfUE5HKSAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvcG5nc2hpbS5oIGIvc3JjL3NmbnQvcG5nc2hpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRlY2VhLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3BuZ3NoaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBuZ3NoaW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQTkcgQml0bWFwIGdseXBoIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR29vZ2xlLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdyaXR0ZW4gYnkgU3R1YXJ0IEdpbGwgYW5kIEJlaGRhZCBFc2ZhaGJvZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgUE5HU0hJTV9IXwotI2RlZmluZSBQTkdTSElNX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRsb2FkLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9QTkcKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBMb2FkX1NCaXRfUG5nKCBGVF9HbHlwaFNsb3QgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgeF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgeV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgcGl4X2JpdHMsCi0gICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBwbmdfbGVuLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIHBvcHVsYXRlX21hcF9hbmRfbWV0cmljcywKLSAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICBtZXRyaWNzX29ubHkgKTsKLQotI2VuZGlmCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFBOR1NISU1fSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3J1bGVzLm1rIGIvc3JjL3NmbnQvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMGQ1NmMuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgU0ZOVCBkcml2ZXIgY29uZmlndXJhdGlvbiBydWxlcwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBTRk5UIGRyaXZlciBkaXJlY3RvcnkKLSMKLVNGTlRfRElSIDo9ICQoU1JDX0RJUikvc2ZudAotCi0KLSMgY29tcGlsYXRpb24gZmxhZ3MgZm9yIHRoZSBkcml2ZXIKLSMKLVNGTlRfQ09NUElMRSA6PSAkKENDKSAkKEFOU0lGTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAkSSQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJChTRk5UX0RJUikpIFwKLSAgICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAkKEZUX0NGTEFHUykKLQotCi0jIFNGTlQgZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1TRk5UX0RSVl9TUkMgOj0gJChTRk5UX0RJUikvdHRsb2FkLmMgICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRtdHguYyAgICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRjbWFwLmMgICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRzYml0LmMgICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRwb3N0LmMgICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRrZXJuLmMgICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRiZGYuYyAgICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvc2ZvYmpzLmMgICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvc2Zkcml2ZXIuYyBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvc2ZudHBpYy5jICBcCi0gICAgICAgICAgICAgICAgJChTRk5UX0RJUikvcG5nc2hpbS5jCi0KLSMgU0ZOVCBkcml2ZXIgaGVhZGVycwotIwotU0ZOVF9EUlZfSCA6PSAkKFNGTlRfRFJWX1NSQzolYz0laCkgIFwKLSAgICAgICAgICAgICAgJChTRk5UX0RJUikvc2ZlcnJvcnMuaAotCi0KLSMgU0ZOVCBkcml2ZXIgb2JqZWN0KHMpCi0jCi0jICAgU0ZOVF9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMuCi0jICAgU0ZOVF9EUlZfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHNpbmdsZScgYnVpbGRzLgotIwotU0ZOVF9EUlZfT0JKX00gOj0gJChTRk5UX0RSVl9TUkM6JChTRk5UX0RJUikvJS5jPSQoT0JKX0RJUikvJS4kTykKLVNGTlRfRFJWX09CSl9TIDo9ICQoT0JKX0RJUikvc2ZudC4kTwotCi0jIFNGTlQgZHJpdmVyIHNvdXJjZSBmaWxlIGZvciBzaW5nbGUgYnVpbGQKLSMKLVNGTlRfRFJWX1NSQ19TIDo9ICQoU0ZOVF9ESVIpL3NmbnQuYwotCi0KLSMgU0ZOVCBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0Ci0jCi0kKFNGTlRfRFJWX09CSl9TKTogJChTRk5UX0RSVl9TUkNfUykgJChTRk5UX0RSVl9TUkMpIFwKLSAgICAgICAgICAgICAgICAgICAkKEZSRUVUWVBFX0gpICQoU0ZOVF9EUlZfSCkKLQkkKFNGTlRfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQoU0ZOVF9EUlZfU1JDX1MpKQotCi0KLSMgU0ZOVCBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCi0jCi0kKE9CSl9ESVIpLyUuJE86ICQoU0ZOVF9ESVIpLyUuYyAkKEZSRUVUWVBFX0gpICQoU0ZOVF9EUlZfSCkKLQkkKFNGTlRfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQ8KQotCi0KLSMgdXBkYXRlIG1haW4gZHJpdmVyIG9iamVjdCBsaXN0cwotIwotRFJWX09CSlNfUyArPSAkKFNGTlRfRFJWX09CSl9TKQotRFJWX09CSlNfTSArPSAkKFNGTlRfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZmRyaXZlci5jIGIvc3JjL3NmbnQvc2Zkcml2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNDMzZS4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC9zZmRyaXZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZmRyaXZlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBTRk5UIGRyaXZlciBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICi0KLSNpbmNsdWRlICJzZmRyaXZlci5oIgotI2luY2x1ZGUgInR0bG9hZC5oIgotI2luY2x1ZGUgInNmb2Jqcy5oIgotI2luY2x1ZGUgInNmbnRwaWMuaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLSNpbmNsdWRlICJ0dHNiaXQuaCIKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0jaW5jbHVkZSAidHRwb3N0LmgiCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0jaW5jbHVkZSAidHRiZGYuaCIKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQkRGX0gKLSNlbmRpZgotCi0jaW5jbHVkZSAidHRjbWFwLmgiCi0jaW5jbHVkZSAidHRrZXJuLmgiCi0jaW5jbHVkZSAidHRtdHguaCIKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfU0ZOVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RUX0NNQVBfSAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9zZmRyaXZlcgotCi0KLSAgLyoKLSAgICogIFNGTlQgVEFCTEUgU0VSVklDRQotICAgKgotICAgKi8KLQotICBzdGF0aWMgdm9pZCoKLSAgZ2V0X3NmbnRfdGFibGUoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfU2ZudF9UYWcgIHRhZyApCi0gIHsKLSAgICB2b2lkKiAgdGFibGU7Ci0KLQotICAgIHN3aXRjaCAoIHRhZyApCi0gICAgewotICAgIGNhc2UgRlRfU0ZOVF9IRUFEOgotICAgICAgdGFibGUgPSAmZmFjZS0+aGVhZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1NGTlRfSEhFQToKLSAgICAgIHRhYmxlID0gJmZhY2UtPmhvcml6b250YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfU0ZOVF9WSEVBOgotICAgICAgdGFibGUgPSBmYWNlLT52ZXJ0aWNhbF9pbmZvID8gJmZhY2UtPnZlcnRpY2FsIDogTlVMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9TRk5UX09TMjoKLSAgICAgIHRhYmxlID0gKCBmYWNlLT5vczIudmVyc2lvbiA9PSAweEZGRkZVICkgPyBOVUxMIDogJmZhY2UtPm9zMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9TRk5UX1BPU1Q6Ci0gICAgICB0YWJsZSA9ICZmYWNlLT5wb3N0c2NyaXB0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1NGTlRfTUFYUDoKLSAgICAgIHRhYmxlID0gJmZhY2UtPm1heF9wcm9maWxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1NGTlRfUENMVDoKLSAgICAgIHRhYmxlID0gZmFjZS0+cGNsdC5WZXJzaW9uID8gJmZhY2UtPnBjbHQgOiBOVUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgdGFibGUgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiB0YWJsZTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHNmbnRfdGFibGVfaW5mbyggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgaWR4LAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqdGFnLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICkKLSAgewotICAgIGlmICggIW9mZnNldCB8fCAhbGVuZ3RoICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCAhdGFnICkKLSAgICAgICpsZW5ndGggPSBmYWNlLT5udW1fdGFibGVzOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIGlkeCA+PSBmYWNlLT5udW1fdGFibGVzICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBUYWJsZV9NaXNzaW5nICk7Ci0KLSAgICAgICp0YWcgICAgPSBmYWNlLT5kaXJfdGFibGVzW2lkeF0uVGFnOwotICAgICAgKm9mZnNldCA9IGZhY2UtPmRpcl90YWJsZXNbaWR4XS5PZmZzZXQ7Ci0gICAgICAqbGVuZ3RoID0gZmFjZS0+ZGlyX3RhYmxlc1tpZHhdLkxlbmd0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9TRk5UX1RBQkxFUkVDKAotICAgIHNmbnRfc2VydmljZV9zZm50X3RhYmxlLAotCi0gICAgKEZUX1NGTlRfVGFibGVMb2FkRnVuYyl0dF9mYWNlX2xvYWRfYW55LCAgICAgLyogbG9hZF90YWJsZSAqLwotICAgIChGVF9TRk5UX1RhYmxlR2V0RnVuYykgZ2V0X3NmbnRfdGFibGUsICAgICAgIC8qIGdldF90YWJsZSAgKi8KLSAgICAoRlRfU0ZOVF9UYWJsZUluZm9GdW5jKXNmbnRfdGFibGVfaW5mbyAgICAgICAvKiB0YWJsZV9pbmZvICovCi0gICkKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0KLSAgLyoKLSAgICogIEdMWVBIIERJQ1QgU0VSVklDRQotICAgKgotICAgKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgc2ZudF9nZXRfZ2x5cGhfbmFtZSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApCi0gIHsKLSAgICBGVF9TdHJpbmcqICBnbmFtZTsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSB0dF9mYWNlX2dldF9wc19uYW1lKCAoVFRfRmFjZSlmYWNlLCBnbHlwaF9pbmRleCwgJmduYW1lICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgRlRfU1RSQ1BZTiggYnVmZmVyLCBnbmFtZSwgYnVmZmVyX21heCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICBzZm50X2dldF9uYW1lX2luZGV4KCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKLSAgewotICAgIFRUX0ZhY2UgIHR0ZmFjZSA9IChUVF9GYWNlKWZhY2U7Ci0KLSAgICBGVF9VSW50ICBpLCBtYXhfZ2lkID0gRlRfVUlOVF9NQVg7Ci0KLQotICAgIGlmICggZmFjZS0+bnVtX2dseXBocyA8IDAgKQotICAgICAgcmV0dXJuIDA7Ci0gICAgZWxzZSBpZiAoIChGVF9VTG9uZylmYWNlLT5udW1fZ2x5cGhzIDwgRlRfVUlOVF9NQVggKQotICAgICAgbWF4X2dpZCA9IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHM7Ci0gICAgZWxzZQotICAgICAgRlRfVFJBQ0UwKCggIklnbm9yZSBnbHlwaCBuYW1lcyBmb3IgaW52YWxpZCBHSUQgMHglMDh4IC0gMHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVgsIGZhY2UtPm51bV9nbHlwaHMgKSk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG1heF9naWQ7IGkrKyApCi0gICAgewotICAgICAgRlRfU3RyaW5nKiAgZ25hbWU7Ci0gICAgICBGVF9FcnJvciAgICBlcnJvciA9IHR0X2ZhY2VfZ2V0X3BzX25hbWUoIHR0ZmFjZSwgaSwgJmduYW1lICk7Ci0KLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoICFmdF9zdHJjbXAoIGdseXBoX25hbWUsIGduYW1lICkgKQotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0VfR0xZUEhESUNUUkVDKAotICAgIHNmbnRfc2VydmljZV9nbHlwaF9kaWN0LAotCi0gICAgKEZUX0dseXBoRGljdF9HZXROYW1lRnVuYykgIHNmbnRfZ2V0X2dseXBoX25hbWUsICAgIC8qIGdldF9uYW1lICAgKi8KLSAgICAoRlRfR2x5cGhEaWN0X05hbWVJbmRleEZ1bmMpc2ZudF9nZXRfbmFtZV9pbmRleCAgICAgLyogbmFtZV9pbmRleCAqLwotICApCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgKi8KLQotCi0gIC8qCi0gICAqICBQT1NUU0NSSVBUIE5BTUUgU0VSVklDRQotICAgKgotICAgKi8KLQotICAvKiBhbiBhcnJheSByZXByZXNlbnRpbmcgYWxsb3dlZCBBU0NJSSBjaGFyYWN0ZXJzIGluIGEgUFMgc3RyaW5nICovCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNmbnRfcHNfbWFwWzE2XSA9Ci0gIHsKLSAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICA0ICAgICAgICAwICAgICAgICBDICAgICAgICA4ICovCi0gICAgMHgwMCwgMHgwMCwgLyogMHgwMDogMCAwIDAgMCAgMCAwIDAgMCAgMCAwIDAgMCAgMCAwIDAgMCAqLwotICAgIDB4MDAsIDB4MDAsIC8qIDB4MTA6IDAgMCAwIDAgIDAgMCAwIDAgIDAgMCAwIDAgIDAgMCAwIDAgKi8KLSAgICAweERFLCAweDdDLCAvKiAweDIwOiAxIDEgMCAxICAxIDEgMSAwICAwIDEgMSAxICAxIDEgMCAwICovCi0gICAgMHhGRiwgMHhBRiwgLyogMHgzMDogMSAxIDEgMSAgMSAxIDEgMSAgMSAwIDEgMCAgMSAxIDEgMSAqLwotICAgIDB4RkYsIDB4RkYsIC8qIDB4NDA6IDEgMSAxIDEgIDEgMSAxIDEgIDEgMSAxIDEgIDEgMSAxIDEgKi8KLSAgICAweEZGLCAweEQ3LCAvKiAweDUwOiAxIDEgMSAxICAxIDEgMSAxICAxIDEgMCAxICAwIDEgMSAxICovCi0gICAgMHhGRiwgMHhGRiwgLyogMHg2MDogMSAxIDEgMSAgMSAxIDEgMSAgMSAxIDEgMSAgMSAxIDEgMSAqLwotICAgIDB4RkYsIDB4NTcgIC8qIDB4NzA6IDEgMSAxIDEgIDEgMSAxIDEgIDAgMSAwIDEgIDAgMSAxIDEgKi8KLSAgfTsKLQotCi0gIHN0YXRpYyBpbnQKLSAgc2ZudF9pc19wb3N0c2NyaXB0KCBpbnQgIGMgKQotICB7Ci0gICAgdW5zaWduZWQgaW50ICBjYzsKLQotCi0gICAgaWYgKCBjIDwgMCB8fCBjID49IDB4ODAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYyA9ICh1bnNpZ25lZCBpbnQpYzsKLQotICAgIHJldHVybiBzZm50X3BzX21hcFtjYyA+PiAzXSAmICggMSA8PCAoIGNjICYgMHgwNyApICk7Ci0gIH0KLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotCi0gIC8qIE9ubHkgQVNDSUkgbGV0dGVycyBhbmQgZGlnaXRzIGFyZSB0YWtlbiBmb3IgYSB2YXJpYXRpb24gZm9udCAqLwotICAvKiBpbnN0YW5jZSdzIFBvc3RTY3JpcHQgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBmdF9pc2FsbnVtJyBpcyBhIG1hY3JvLCBidXQgd2UgbmVlZCBhIGZ1bmN0aW9uIGhlcmUsIHRodXMgICAqLwotICAvKiB0aGlzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBzZm50X2lzX2FscGhhbnVtZXJpYyggaW50ICBjICkKLSAgewotICAgIHJldHVybiBmdF9pc2FsbnVtKCBjICk7Ci0gIH0KLQotCi0gIC8qIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBNdXJtdXJIYXNoMyBpcyB0YWtlbiBhbmQgYWRhcHRlZCBmcm9tICAgICAgICAgICovCi0gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9hYXBwbGVieS9zbWhhc2hlci9ibG9iL21hc3Rlci9zcmMvTXVybXVySGFzaDMuY3BwICovCi0KLSNkZWZpbmUgUk9UTDMyKCB4LCByICkgICggeCA8PCByICkgfCAoIHggPj4gKCAzMiAtIHIgKSApCi0KLQotICBzdGF0aWMgRlRfVUludDMyCi0gIGZtaXgzMiggRlRfVUludDMyICBoICkKLSAgewotICAgIGggXj0gaCA+PiAxNjsKLSAgICBoICo9IDB4ODVlYmNhNmI7Ci0gICAgaCBePSBoID4+IDEzOwotICAgIGggKj0gMHhjMmIyYWUzNTsKLSAgICBoIF49IGggPj4gMTY7Ci0KLSAgICByZXR1cm4gaDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgbXVybXVyX2hhc2hfM18xMjgoIGNvbnN0IHZvaWQqICAgICAgICAga2V5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBsZW4sCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgICAgICAgIHNlZWQsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgIG91dCApCi0gIHsKLSAgICBjb25zdCBGVF9CeXRlKiAgZGF0YSAgICA9IChjb25zdCBGVF9CeXRlKilrZXk7Ci0gICAgY29uc3QgaW50ICAgICAgIG5ibG9ja3MgPSAoaW50KWxlbiAvIDE2OwotCi0gICAgRlRfVUludDMyICBoMSA9IHNlZWQ7Ci0gICAgRlRfVUludDMyICBoMiA9IHNlZWQ7Ci0gICAgRlRfVUludDMyICBoMyA9IHNlZWQ7Ci0gICAgRlRfVUludDMyICBoNCA9IHNlZWQ7Ci0KLSAgICBjb25zdCBGVF9VSW50MzIgIGMxID0gMHgyMzliOTYxYjsKLSAgICBjb25zdCBGVF9VSW50MzIgIGMyID0gMHhhYjBlOTc4OTsKLSAgICBjb25zdCBGVF9VSW50MzIgIGMzID0gMHgzOGIzNGFlNTsKLSAgICBjb25zdCBGVF9VSW50MzIgIGM0ID0gMHhhMWUzOGI5MzsKLQotICAgIGNvbnN0IEZUX1VJbnQzMiogIGJsb2NrcyA9IChjb25zdCBGVF9VSW50MzIqKSggZGF0YSArIG5ibG9ja3MgKiAxNiApOwotCi0gICAgaW50ICBpOwotCi0KLSAgICBmb3IoIGkgPSAtbmJsb2NrczsgaTsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIGsxID0gYmxvY2tzW2kgKiA0ICsgMF07Ci0gICAgICBGVF9VSW50MzIgIGsyID0gYmxvY2tzW2kgKiA0ICsgMV07Ci0gICAgICBGVF9VSW50MzIgIGszID0gYmxvY2tzW2kgKiA0ICsgMl07Ci0gICAgICBGVF9VSW50MzIgIGs0ID0gYmxvY2tzW2kgKiA0ICsgM107Ci0KLQotICAgICAgazEgKj0gYzE7Ci0gICAgICBrMSAgPSBST1RMMzIoIGsxLCAxNSApOwotICAgICAgazEgKj0gYzI7Ci0gICAgICBoMSBePSBrMTsKLQotICAgICAgaDEgID0gUk9UTDMyKCBoMSwgMTkgKTsKLSAgICAgIGgxICs9IGgyOwotICAgICAgaDEgID0gaDEgKiA1ICsgMHg1NjFjY2QxYjsKLQotICAgICAgazIgKj0gYzI7Ci0gICAgICBrMiAgPSBST1RMMzIoIGsyLCAxNiApOwotICAgICAgazIgKj0gYzM7Ci0gICAgICBoMiBePSBrMjsKLQotICAgICAgaDIgID0gUk9UTDMyKCBoMiwgMTcgKTsKLSAgICAgIGgyICs9IGgzOwotICAgICAgaDIgID0gaDIgKiA1ICsgMHgwYmNhYTc0NzsKLQotICAgICAgazMgKj0gYzM7Ci0gICAgICBrMyAgPSBST1RMMzIoIGszLCAxNyApOwotICAgICAgazMgKj0gYzQ7Ci0gICAgICBoMyBePSBrMzsKLQotICAgICAgaDMgID0gUk9UTDMyKCBoMywgMTUgKTsKLSAgICAgIGgzICs9IGg0OwotICAgICAgaDMgID0gaDMgKiA1ICsgMHg5NmNkMWMzNTsKLQotICAgICAgazQgKj0gYzQ7Ci0gICAgICBrNCAgPSBST1RMMzIoIGs0LCAxOCApOwotICAgICAgazQgKj0gYzE7Ci0gICAgICBoNCBePSBrNDsKLQotICAgICAgaDQgID0gUk9UTDMyKCBoNCwgMTMgKTsKLSAgICAgIGg0ICs9IGgxOwotICAgICAgaDQgID0gaDQgKiA1ICsgMHgzMmFjM2IxNzsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBjb25zdCBGVF9CeXRlKiAgdGFpbCA9IChjb25zdCBGVF9CeXRlKikoIGRhdGEgKyBuYmxvY2tzICogMTYgKTsKLQotICAgICAgRlRfVUludDMyICBrMSA9IDA7Ci0gICAgICBGVF9VSW50MzIgIGsyID0gMDsKLSAgICAgIEZUX1VJbnQzMiAgazMgPSAwOwotICAgICAgRlRfVUludDMyICBrNCA9IDA7Ci0KLQotICAgICAgc3dpdGNoICggbGVuICYgMTUgKQotICAgICAgewotICAgICAgY2FzZSAxNToKLSAgICAgICAgazQgXj0gKEZUX1VJbnQzMil0YWlsWzE0XSA8PCAxNjsKLSAgICAgIGNhc2UgMTQ6Ci0gICAgICAgIGs0IF49IChGVF9VSW50MzIpdGFpbFsxM10gPDwgODsKLSAgICAgIGNhc2UgMTM6Ci0gICAgICAgIGs0IF49IChGVF9VSW50MzIpdGFpbFsxMl07Ci0gICAgICAgIGs0ICo9IGM0OwotICAgICAgICBrNCAgPSBST1RMMzIoIGs0LCAxOCApOwotICAgICAgICBrNCAqPSBjMTsKLSAgICAgICAgaDQgXj0gazQ7Ci0KLSAgICAgIGNhc2UgMTI6Ci0gICAgICAgIGszIF49IChGVF9VSW50MzIpdGFpbFsxMV0gPDwgMjQ7Ci0gICAgICBjYXNlIDExOgotICAgICAgICBrMyBePSAoRlRfVUludDMyKXRhaWxbMTBdIDw8IDE2OwotICAgICAgY2FzZSAxMDoKLSAgICAgICAgazMgXj0gKEZUX1VJbnQzMil0YWlsWzldIDw8IDg7Ci0gICAgICBjYXNlIDk6Ci0gICAgICAgIGszIF49IChGVF9VSW50MzIpdGFpbFs4XTsKLSAgICAgICAgazMgKj0gYzM7Ci0gICAgICAgIGszICA9IFJPVEwzMiggazMsIDE3ICk7Ci0gICAgICAgIGszICo9IGM0OwotICAgICAgICBoMyBePSBrMzsKLQotICAgICAgY2FzZSA4OgotICAgICAgICBrMiBePSAoRlRfVUludDMyKXRhaWxbN10gPDwgMjQ7Ci0gICAgICBjYXNlIDc6Ci0gICAgICAgIGsyIF49IChGVF9VSW50MzIpdGFpbFs2XSA8PCAxNjsKLSAgICAgIGNhc2UgNjoKLSAgICAgICAgazIgXj0gKEZUX1VJbnQzMil0YWlsWzVdIDw8IDg7Ci0gICAgICBjYXNlIDU6Ci0gICAgICAgIGsyIF49IChGVF9VSW50MzIpdGFpbFs0XTsKLSAgICAgICAgazIgKj0gYzI7Ci0gICAgICAgIGsyICA9IFJPVEwzMiggazIsIDE2ICk7Ci0gICAgICAgIGsyICo9IGMzOwotICAgICAgICBoMiBePSBrMjsKLQotICAgICAgY2FzZSA0OgotICAgICAgICBrMSBePSAoRlRfVUludDMyKXRhaWxbM10gPDwgMjQ7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgIGsxIF49IChGVF9VSW50MzIpdGFpbFsyXSA8PCAxNjsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgazEgXj0gKEZUX1VJbnQzMil0YWlsWzFdIDw8IDg7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGsxIF49IChGVF9VSW50MzIpdGFpbFswXTsKLSAgICAgICAgazEgKj0gYzE7Ci0gICAgICAgIGsxICA9IFJPVEwzMiggazEsIDE1ICk7Ci0gICAgICAgIGsxICo9IGMyOwotICAgICAgICBoMSBePSBrMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBoMSBePSBsZW47Ci0gICAgaDIgXj0gbGVuOwotICAgIGgzIF49IGxlbjsKLSAgICBoNCBePSBsZW47Ci0KLSAgICBoMSArPSBoMjsKLSAgICBoMSArPSBoMzsKLSAgICBoMSArPSBoNDsKLQotICAgIGgyICs9IGgxOwotICAgIGgzICs9IGgxOwotICAgIGg0ICs9IGgxOwotCi0gICAgaDEgPSBmbWl4MzIoIGgxICk7Ci0gICAgaDIgPSBmbWl4MzIoIGgyICk7Ci0gICAgaDMgPSBmbWl4MzIoIGgzICk7Ci0gICAgaDQgPSBmbWl4MzIoIGg0ICk7Ci0KLSAgICBoMSArPSBoMjsKLSAgICBoMSArPSBoMzsKLSAgICBoMSArPSBoNDsKLQotICAgIGgyICs9IGgxOwotICAgIGgzICs9IGgxOwotICAgIGg0ICs9IGgxOwotCi0gICAgKChGVF9VSW50MzIqKW91dClbMF0gPSBoMTsKLSAgICAoKEZUX1VJbnQzMiopb3V0KVsxXSA9IGgyOwotICAgICgoRlRfVUludDMyKilvdXQpWzJdID0gaDM7Ci0gICAgKChGVF9VSW50MzIqKW91dClbM10gPSBoNDsKLSAgfQotCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUICovCi0KLQotICB0eXBlZGVmIGludCAoKmNoYXJfdHlwZV9mdW5jKSggaW50ICBjICk7Ci0KLQotICAvKiBoYW5kbGluZyBvZiBQSUQvRUlEIDMvMCBhbmQgMy8xIGlzIHRoZSBzYW1lICovCi0jZGVmaW5lIElTX1dJTiggbiApICAoIChuKS0+cGxhdGZvcm1JRCA9PSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICggKG4pLT5lbmNvZGluZ0lEID09IDEgfHwgKG4pLT5lbmNvZGluZ0lEID09IDAgKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgIChuKS0+bGFuZ3VhZ2VJRCA9PSAweDQwOSAgICAgICAgICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgSVNfQVBQTEUoIG4gKSAgKCAobiktPnBsYXRmb3JtSUQgPT0gMSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKG4pLT5lbmNvZGluZ0lEID09IDAgJiYgXAotICAgICAgICAgICAgICAgICAgICAgICAgIChuKS0+bGFuZ3VhZ2VJRCA9PSAwICkKLQotICBzdGF0aWMgY2hhcioKLSAgZ2V0X3dpbl9zdHJpbmcoIEZUX01lbW9yeSAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfTmFtZSAgICAgICAgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgY2hhcl90eXBlX2Z1bmMgIGNoYXJfdHlwZSwKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICByZXBvcnRfaW52YWxpZF9jaGFyYWN0ZXJzICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGNoYXIqICAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgRlRfU3RyaW5nKiAgcjsKLSAgICBGVF9DaGFyKiAgICBwOwotICAgIEZUX1VJbnQgICAgIGxlbjsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgaWYgKCBGVF9BTExPQyggcmVzdWx0LCBlbnRyeS0+c3RyaW5nTGVuZ3RoIC8gMiArIDEgKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGVudHJ5LT5zdHJpbmdPZmZzZXQgKSB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGVudHJ5LT5zdHJpbmdMZW5ndGggKSApCi0gICAgewotICAgICAgRlRfRlJFRSggcmVzdWx0ICk7Ci0gICAgICBlbnRyeS0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgIGVudHJ5LT5zdHJpbmdPZmZzZXQgPSAwOwotICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByID0gKEZUX1N0cmluZyopcmVzdWx0OwotICAgIHAgPSAoRlRfQ2hhciopc3RyZWFtLT5jdXJzb3I7Ci0KLSAgICBmb3IgKCBsZW4gPSBlbnRyeS0+c3RyaW5nTGVuZ3RoIC8gMjsgbGVuID4gMDsgbGVuLS0sIHAgKz0gMiApCi0gICAgewotICAgICAgaWYgKCBwWzBdID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoIGNoYXJfdHlwZSggcFsxXSApICkKLSAgICAgICAgICAqcisrID0gcFsxXTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCByZXBvcnRfaW52YWxpZF9jaGFyYWN0ZXJzICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTAoKCAiZ2V0X3dpbl9zdHJpbmc6IgotICAgICAgICAgICAgICAgICAgICAgICAgIiBDaGFyYWN0ZXIgYCVjJyAoMHglWCkgaW52YWxpZCBpbiBQUyBuYW1lIHN0cmluZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBbMV0sIHBbMV0gKSk7Ci0gICAgICAgICAgICAvKiBpdCdzIG5vdCB0aGUgam9iIG9mIEZyZWVUeXBlIHRvIGNvcnJlY3QgUFMgbmFtZXMuLi4gKi8KLSAgICAgICAgICAgICpyKysgPSBwWzFdOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAqciA9ICdcMCc7Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgY2hhcioKLSAgZ2V0X2FwcGxlX3N0cmluZyggRlRfTWVtb3J5ICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgVFRfTmFtZSAgICAgICAgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGVfZnVuYyAgY2hhcl90eXBlLAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgcmVwb3J0X2ludmFsaWRfY2hhcmFjdGVycyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICBjaGFyKiAgICAgICByZXN1bHQgPSBOVUxMOwotICAgIEZUX1N0cmluZyogIHI7Ci0gICAgRlRfQ2hhciogICAgcDsKLSAgICBGVF9VSW50ICAgICBsZW47Ci0KLSAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0KLQotICAgIGlmICggRlRfQUxMT0MoIHJlc3VsdCwgZW50cnktPnN0cmluZ0xlbmd0aCArIDEgKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGVudHJ5LT5zdHJpbmdPZmZzZXQgKSB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGVudHJ5LT5zdHJpbmdMZW5ndGggKSApCi0gICAgewotICAgICAgRlRfRlJFRSggcmVzdWx0ICk7Ci0gICAgICBlbnRyeS0+c3RyaW5nT2Zmc2V0ID0gMDsKLSAgICAgIGVudHJ5LT5zdHJpbmdMZW5ndGggPSAwOwotICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByID0gKEZUX1N0cmluZyopcmVzdWx0OwotICAgIHAgPSAoRlRfQ2hhciopc3RyZWFtLT5jdXJzb3I7Ci0KLSAgICBmb3IgKCBsZW4gPSBlbnRyeS0+c3RyaW5nTGVuZ3RoOyBsZW4gPiAwOyBsZW4tLSwgcCsrICkKLSAgICB7Ci0gICAgICBpZiAoIGNoYXJfdHlwZSggKnAgKSApCi0gICAgICAgICpyKysgPSAqcDsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCByZXBvcnRfaW52YWxpZF9jaGFyYWN0ZXJzICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMCgoICJnZXRfYXBwbGVfc3RyaW5nOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIENoYXJhY3RlciBgJWMnICgweCVYKSBpbnZhbGlkIGluIFBTIG5hbWUgc3RyaW5nXG4iLAotICAgICAgICAgICAgICAgICAgICAgICpwLCAqcCApKTsKLSAgICAgICAgICAvKiBpdCdzIG5vdCB0aGUgam9iIG9mIEZyZWVUeXBlIHRvIGNvcnJlY3QgUFMgbmFtZXMuLi4gKi8KLSAgICAgICAgICAqcisrID0gKnA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgKnIgPSAnXDAnOwotCi0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgc2ZudF9nZXRfbmFtZV9pZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgIGlkLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgKndpbiwKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICphcHBsZSApCi0gIHsKLSAgICBGVF9JbnQgIG47Ci0KLQotICAgICp3aW4gICA9IC0xOwotICAgICphcHBsZSA9IC0xOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT5udW1fbmFtZXM7IG4rKyApCi0gICAgewotICAgICAgVFRfTmFtZSAgbmFtZSA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBuOwotCi0KLSAgICAgIGlmICggbmFtZS0+bmFtZUlEID09IGlkICYmIG5hbWUtPnN0cmluZ0xlbmd0aCA+IDAgKQotICAgICAgewotICAgICAgICBpZiAoIElTX1dJTiggbmFtZSApICkKLSAgICAgICAgICAqd2luID0gbjsKLQotICAgICAgICBpZiAoIElTX0FQUExFKCBuYW1lICkgKQotICAgICAgICAgICphcHBsZSA9IG47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICggKndpbiA+PSAwICkgfHwgKCAqYXBwbGUgPj0gMCApOwotICB9Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotICAvKgotICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIGF4aXMgdmFsdWUgZGVzY3JpcHRvci4KLQotICAgICAgV2UgbmVlZCA2NTUzNiBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgZGVjaW1hbCBmcmFjdGlvbjsgdGhpcyBmaXRzCi0gICAgICBuaWNlbHkgaW50byBmaXZlIGRlY2ltYWwgcGxhY2VzLiAgQ29uc2VxdWVudGx5LCBpdCBjb25zaXN0cyBvZgotCi0gICAgICAgIC4gdGhlIG1pbnVzIHNpZ24gaWYgdGhlIG51bWJlciBpcyBuZWdhdGl2ZSwKLSAgICAgICAgLiB1cCB0byBmaXZlIGNoYXJhY3RlcnMgZm9yIHRoZSBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50LAotICAgICAgICAuIHRoZSBkZWNpbWFsIHBvaW50IGlmIHRoZXJlIGlzIGEgZnJhY3Rpb25hbCBwYXJ0LCBhbmQKLSAgICAgICAgLiB1cCB0byBmaXZlIGNoYXJhY3RlcnMgZm9yIHRoZSBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCi0KLSAgICAgIFdlIGFsc28gbmVlZCBvbmUgYnl0ZSBmb3IgdGhlIGxlYWRpbmcgYF8nIGNoYXJhY3RlciBhbmQgdXAgdG8gZm91cgotICAgICAgYnl0ZXMgZm9yIHRoZSBheGlzIHRhZy4KLSAgICovCi0jZGVmaW5lIE1BWF9WQUxVRV9ERVNDUklQVE9SX0xFTiAgKCAxICsgNSArIDEgKyA1ICsgMSArIDQgKQotCi0KLSAgLyogdGhlIG1heGltdW0gbGVuZ3RoIG9mIFBvc3RTY3JpcHQgZm9udCBuYW1lcyAqLwotI2RlZmluZSBNQVhfUFNfTkFNRV9MRU4gIDEyNwotCi0KLSAgLyoKLSAgICogIEZpbmQgdGhlIHNob3J0ZXN0IGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYSAxNi4xNiBmaXhlZCBwb2ludAotICAgKiAgbnVtYmVyLiAgVGhlIGZ1bmN0aW9uIGZpbGxzIGBidWYnIHdpdGggdGhlIHJlc3VsdCwgcmV0dXJuaW5nIGEgcG9pbnRlcgotICAgKiAgdG8gdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSByZXByZXNlbnRhdGlvbidzIGxhc3QgYnl0ZS4KLSAgICovCi0KLSAgc3RhdGljIGNoYXIqCi0gIGZpeGVkMmZsb2F0KCBGVF9JbnQgIGZpeGVkLAotICAgICAgICAgICAgICAgY2hhciogICBidWYgKQotICB7Ci0gICAgY2hhciogIHA7Ci0gICAgY2hhciogIHE7Ci0gICAgY2hhciAgIHRtcFs1XTsKLQotICAgIEZUX0ludCAgaW50X3BhcnQ7Ci0gICAgRlRfSW50ICBmcmFjX3BhcnQ7Ci0KLSAgICBGVF9JbnQgIGk7Ci0KLQotICAgIHAgPSBidWY7Ci0KLSAgICBpZiAoIGZpeGVkID09IDAgKQotICAgIHsKLSAgICAgICpwKysgPSAnMCc7Ci0gICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICBpZiAoIGZpeGVkIDwgMCApCi0gICAgewotICAgICAgKnArKyA9ICctJzsKLSAgICAgIGZpeGVkID0gLWZpeGVkOwotICAgIH0KLQotICAgIGludF9wYXJ0ICA9ICggZml4ZWQgPj4gMTYgKSAmIDB4RkZGRjsKLSAgICBmcmFjX3BhcnQgPSBmaXhlZCAmIDB4RkZGRjsKLQotICAgIC8qIGdldCBkaWdpdHMgb2YgaW50ZWdlciBwYXJ0IChpbiByZXZlcnNlIG9yZGVyKSAqLwotICAgIHEgPSB0bXA7Ci0gICAgd2hpbGUgKCBpbnRfcGFydCA+IDAgKQotICAgIHsKLSAgICAgICpxKysgICAgICA9ICcwJyArIGludF9wYXJ0ICUgMTA7Ci0gICAgICBpbnRfcGFydCAvPSAxMDsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IGRpZ2l0cyBpbiBjb3JyZWN0IG9yZGVyIHRvIGJ1ZmZlciAqLwotICAgIHdoaWxlICggcSA+IHRtcCApCi0gICAgICAqcCsrID0gKi0tcTsKLQotICAgIGlmICggIWZyYWNfcGFydCApCi0gICAgICByZXR1cm4gcDsKLQotICAgIC8qIHNhdmUgcG9zaXRpb24gb2YgcG9pbnQgKi8KLSAgICBxICAgID0gcDsKLSAgICAqcCsrID0gJy4nOwotCi0gICAgLyogYXBwbHkgcm91bmRpbmcgKi8KLSAgICBmcmFjX3BhcnQgPSBmcmFjX3BhcnQgKiAxMCArIDU7Ci0KLSAgICAvKiBnZXQgZGlnaXRzIG9mIGZyYWN0aW9uYWwgcGFydCAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgNTsgaSsrICkKLSAgICB7Ci0gICAgICAqcCsrID0gJzAnICsgKGNoYXIpKCBmcmFjX3BhcnQgLyAweDEwMDAwTCApOwotCi0gICAgICBmcmFjX3BhcnQgJT0gMHgxMDAwMEw7Ci0gICAgICBpZiAoICFmcmFjX3BhcnQgKQotICAgICAgICBicmVhazsKLQotICAgICAgZnJhY19wYXJ0ICo9IDEwOwotICAgIH0KLQotICAgIC8qCi0gICAgICAgIElmIHRoZSByZW1haW5kZXIgc3RvcmVkIGluIGBmcmFjX3BhcnQnIChhZnRlciB0aGUgbGFzdCBGT1IgbG9vcCkgaXMKLSAgICAgICAgc21hbGxlciB0aGFuIDM0NDgwKjEwLCB0aGUgcmVzdWx0aW5nIGRlY2ltYWwgdmFsdWUgbWludXMgMC4wMDAwMSBpcwotICAgICAgICBhbiBlcXVpdmFsZW50IHJlcHJlc2VudGF0aW9uIG9mIGBmaXhlZCcuCi0KLSAgICAgICAgVGhlIGFib3ZlIEZPUiBsb29wIGFsd2F5cyBmaW5kcyB0aGUgbGFyZ2VyIG9mIHRoZSB0d28gdmFsdWVzOyBJCi0gICAgICAgIHZlcmlmaWVkIHRoaXMgYnkgaXRlcmF0aW5nIG92ZXIgYWxsIHBvc3NpYmxlIGZpeGVkIHBvaW50IG51bWJlcnMuCi0KLSAgICAgICAgSWYgdGhlIHJlbWFpbmRlciBpcyAxNzIzMioxMCwgYm90aCB2YWx1ZXMgYXJlIGVxdWFsbHkgZ29vZCwgYW5kIHdlCi0gICAgICAgIHRha2UgdGhlIG5leHQgZXZlbiBudW1iZXIgKGZvbGxvd2luZyBJRUVFIDc1NCdzIGByb3VuZCB0byBuZWFyZXN0LAotICAgICAgICB0aWVzIHRvIGV2ZW4nIHJvdW5kaW5nIHJ1bGUpLgotCi0gICAgICAgIElmIHRoZSByZW1haW5kZXIgaXMgc21hbGxlciB0aGFuIDE3MjMyKjEwLCB0aGUgbG93ZXIgb2YgdGhlIHR3bwotICAgICAgICBudW1iZXJzIGlzIG5lYXJlciB0byB0aGUgZXhhY3QgcmVzdWx0ICh2YWx1ZXMgMTcyMzIgYW5kIDM0NDgwIHdlcmUKLSAgICAgICAgYWxzbyBmb3VuZCBieSB0ZXN0aW5nIGFsbCBwb3NzaWJsZSBmaXhlZCBwb2ludCB2YWx1ZXMpLgotCi0gICAgICAgIFdlIHVzZSB0aGlzIHRvIGZpbmQgYSBzaG9ydGVyIGRlY2ltYWwgcmVwcmVzZW50YXRpb24uICBJZiBub3QgZW5kaW5nCi0gICAgICAgIHdpdGggZGlnaXQgemVybywgd2UgdGFrZSB0aGUgcmVwcmVzZW50YXRpb24gd2l0aCBsZXNzIGVycm9yLgotICAgICAqLwotICAgIHAtLTsKLSAgICBpZiAoIHAgLSBxID09IDUgKSAgLyogZml2ZSBkaWdpdHM/ICovCi0gICAgewotICAgICAgLyogdGFrZSB0aGUgcmVwcmVzZW50YXRpb24gdGhhdCBoYXMgemVybyBhcyB0aGUgbGFzdCBkaWdpdCAqLwotICAgICAgaWYgKCBmcmFjX3BhcnQgPCAzNDQ4MCAqIDEwICYmCi0gICAgICAgICAgICpwID09ICcxJyAgICAgICAgICAgICAgKQotICAgICAgICAqcCA9ICcwJzsKLQotICAgICAgLyogb3RoZXJ3aXNlIHVzZSB0aGUgb25lIHdpdGggbGVzcyBlcnJvciAqLwotICAgICAgZWxzZSBpZiAoIGZyYWNfcGFydCA9PSAxNzIzMiAqIDEwICYmCi0gICAgICAgICAgICAgICAgKnAgJiAxICAgICAgICAgICAgICAgICAgKQotICAgICAgICAqcCAtPSAxOwotCi0gICAgICBlbHNlIGlmICggZnJhY19wYXJ0IDwgMTcyMzIgKiAxMCAmJgotICAgICAgICAgICAgICAgICpwICE9ICcwJyAgICAgICAgICAgICAgKQotICAgICAgICAqcCAtPSAxOwotICAgIH0KLQotICAgIC8qIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyAqLwotICAgIHdoaWxlICggKnAgPT0gJzAnICkKLSAgICAgICpwLS0gPSAnXDAnOwotCi0gICAgcmV0dXJuIHAgKyAxOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgY2hhciAgaGV4ZGlnaXRzWzE2XSA9Ci0gIHsKLSAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKLSAgICAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJwotICB9OwotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIHNmbnRfZ2V0X3Zhcl9wc19uYW1lKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBtbSA9IChGVF9TZXJ2aWNlX011bHRpTWFzdGVycylmYWNlLT5tbTsKLQotICAgIEZUX1VJbnQgICAgIG51bV9jb29yZHM7Ci0gICAgRlRfRml4ZWQqICAgY29vcmRzOwotICAgIEZUX01NX1ZhciogIG1tX3ZhcjsKLQotICAgIEZUX0ludCAgIGZvdW5kLCB3aW4sIGFwcGxlOwotICAgIEZUX1VJbnQgIGksIGo7Ci0KLSAgICBjaGFyKiAgcmVzdWx0ID0gTlVMTDsKLSAgICBjaGFyKiAgcDsKLQotCi0gICAgaWYgKCAhZmFjZS0+dmFyX3Bvc3RzY3JpcHRfcHJlZml4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBsZW47Ci0KLQotICAgICAgLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgVmFyaWF0aW9ucyBQb3N0U2NyaXB0IE5hbWUgUHJlZml4ICovCi0gICAgICBmb3VuZCA9IHNmbnRfZ2V0X25hbWVfaWQoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05BTUVfSURfVkFSSUFUSU9OU19QUkVGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcHBsZSApOwotICAgICAgaWYgKCAhZm91bmQgKQotICAgICAgewotICAgICAgICAvKiBvdGhlcndpc2UgdXNlIHRoZSB0eXBvZ3JhcGhpYyBmYW1pbHkgbmFtZSAqLwotICAgICAgICBmb3VuZCA9IHNmbnRfZ2V0X25hbWVfaWQoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTkFNRV9JRF9UWVBPR1JBUEhJQ19GQU1JTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXBwbGUgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhZm91bmQgKQotICAgICAgewotICAgICAgICAvKiBhcyBhIGxhc3QgcmVzb3J0IHdlIHRyeSB0aGUgZmFtaWx5IG5hbWU7IG5vdGUgdGhhdCB0aGlzIGlzICovCi0gICAgICAgIC8qIG5vdCBpbiB0aGUgQWRvYmUgVGVjaE5vdGUsIGJ1dCBHWCBmb250cyAod2hpY2ggcHJlZGF0ZSB0aGUgKi8KLSAgICAgICAgLyogVGVjaE5vdGUpIGJlbmVmaXQgZnJvbSB0aGlzIGJlaGF2aW91ciAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBmb3VuZCA9IHNmbnRfZ2V0X25hbWVfaWQoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTkFNRV9JRF9GT05UX0ZBTUlMWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcHBsZSApOwotICAgICAgfQotCi0gICAgICBpZiAoICFmb3VuZCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJzZm50X2dldF92YXJfcHNfbmFtZToiCi0gICAgICAgICAgICAgICAgICAgICIgQ2FuJ3QgY29uc3RydWN0IFBTIG5hbWUgcHJlZml4IGZvciBmb250IGluc3RhbmNlc1xuIiApKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHByZWZlciBXaW5kb3dzIGVudHJpZXMgb3ZlciBBcHBsZSAqLwotICAgICAgaWYgKCB3aW4gIT0gLTEgKQotICAgICAgICByZXN1bHQgPSBnZXRfd2luX3N0cmluZyggZmFjZS0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5uYW1lX3RhYmxlLnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyB3aW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X2lzX2FscGhhbnVtZXJpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gZ2V0X2FwcGxlX3N0cmluZyggZmFjZS0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm5hbWVfdGFibGUuc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5uYW1lX3RhYmxlLm5hbWVzICsgYXBwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfaXNfYWxwaGFudW1lcmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0KLSAgICAgIGxlbiA9IGZ0X3N0cmxlbiggcmVzdWx0ICk7Ci0KLSAgICAgIC8qIHNhbml0aXplIGlmIG5lY2Vzc2FyeTsgd2UgcmVzZXJ2ZSBzcGFjZSBmb3IgMzYgYnl0ZXMgKGEgMTI4Yml0ICAqLwotICAgICAgLyogY2hlY2tzdW0gYXMgYSBoZXggbnVtYmVyLCBwcmVjZWRlZCBieSBgLScgYW5kIGZvbGxvd2VkIGJ5IHRocmVlICovCi0gICAgICAvKiBBU0NJSSBkb3RzLCB0byBiZSB1c2VkIGlmIHRoZSBjb25zdHJ1Y3RlZCBQUyBuYW1lIHdvdWxkIGJlIHRvbyAgKi8KLSAgICAgIC8qIGxvbmcpOyB0aGlzIGlzIGFsc28gc3VmZmljaWVudCBmb3IgYSBzaW5nbGUgaW5zdGFuY2UgICAgICAgICAgICAqLwotICAgICAgaWYgKCBsZW4gPiBNQVhfUFNfTkFNRV9MRU4gLSAoIDEgKyAzMiArIDMgKSApCi0gICAgICB7Ci0gICAgICAgIGxlbiAgICAgICAgID0gTUFYX1BTX05BTUVfTEVOIC0gKCAxICsgMzIgKyAzICk7Ci0gICAgICAgIHJlc3VsdFtsZW5dID0gJ1wwJzsKLQotICAgICAgICBGVF9UUkFDRTAoKCAic2ZudF9nZXRfdmFyX3BzX25hbWU6IgotICAgICAgICAgICAgICAgICAgICAiIFNob3J0ZW5pbmcgdmFyaWF0aW9uIFBTIG5hbWUgcHJlZml4XG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICIgdG8gJWQgY2hhcmFjdGVyc1xuIiwgbGVuICkpOwotICAgICAgfQotCi0gICAgICBmYWNlLT52YXJfcG9zdHNjcmlwdF9wcmVmaXggICAgID0gcmVzdWx0OwotICAgICAgZmFjZS0+dmFyX3Bvc3RzY3JpcHRfcHJlZml4X2xlbiA9IGxlbjsKLSAgICB9Ci0KLSAgICBtbS0+Z2V0X3Zhcl9ibGVuZCggRlRfRkFDRSggZmFjZSApLAotICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgJmNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgJm1tX3ZhciApOwotCi0gICAgaWYgKCBGVF9JU19OQU1FRF9JTlNUQU5DRSggRlRfRkFDRSggZmFjZSApICkgKQotICAgIHsKLSAgICAgIFNGTlRfU2VydmljZSAgc2ZudCA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotICAgICAgRlRfTG9uZyAgaW5zdGFuY2UgPSAoICggZmFjZS0+cm9vdC5mYWNlX2luZGV4ICYgMHg3RkZGMDAwMEwgKSA+PiAxNiApIC0gMTsKLSAgICAgIEZUX1VJbnQgIHBzaWQgICAgID0gbW1fdmFyLT5uYW1lZHN0eWxlW2luc3RhbmNlXS5wc2lkOwotCi0gICAgICBjaGFyKiAgcHNfbmFtZSA9IE5VTEw7Ci0KLQotICAgICAgLyogdHJ5IGZpcnN0IHRvIGxvYWQgdGhlIG5hbWUgc3RyaW5nIHdpdGggaW5kZXggYHBvc3RTY3JpcHROYW1lSUQnICovCi0gICAgICBpZiAoIHBzaWQgPT0gNiAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAoIHBzaWQgPiAyNTUgJiYgcHNpZCA8IDMyNzY4ICkgKQotICAgICAgICAodm9pZClzZm50LT5nZXRfbmFtZSggZmFjZSwgKEZUX1VTaG9ydClwc2lkLCAmcHNfbmFtZSApOwotCi0gICAgICBpZiAoIHBzX25hbWUgKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwc19uYW1lOwotICAgICAgICBwICAgICAgPSByZXN1bHQgKyBmdF9zdHJsZW4oIHJlc3VsdCApICsgMTsKLQotICAgICAgICBnb3RvIGNoZWNrX2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogb3RoZXJ3aXNlIGNvbnN0cnVjdCBhIG5hbWUgdXNpbmcgYHN1YmZhbWlseU5hbWVJRCcgKi8KLSAgICAgICAgRlRfVUludCAgc3RyaWQgPSBtbV92YXItPm5hbWVkc3R5bGVbaW5zdGFuY2VdLnN0cmlkOwotCi0gICAgICAgIGNoYXIqICBzdWJmYW1pbHlfbmFtZTsKLSAgICAgICAgY2hhciogIHM7Ci0KLQotICAgICAgICAodm9pZClzZm50LT5nZXRfbmFtZSggZmFjZSwgKEZUX1VTaG9ydClzdHJpZCwgJnN1YmZhbWlseV9uYW1lICk7Ci0KLSAgICAgICAgaWYgKCAhc3ViZmFtaWx5X25hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggInNmbnRfZ2V0X3Zhcl9wc19uYW1lOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIGNhbid0IGNvbnN0cnVjdCBuYW1lZCBpbnN0YW5jZSBQUyBuYW1lO1xuIgotICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICAgIiB0cnlpbmcgdG8gY29uc3RydWN0IG5vcm1hbCBpbnN0YW5jZSBQUyBuYW1lXG4iICkpOwotICAgICAgICAgIGdvdG8gY29uc3RydWN0X2luc3RhbmNlX25hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhZnRlciB0aGUgcHJlZml4IHdlIGhhdmUgY2hhcmFjdGVyIGAtJyBmb2xsb3dlZCBieSB0aGUgICAqLwotICAgICAgICAvKiBzdWJmYW1pbHkgbmFtZSAodXNpbmcgb25seSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBhbmQgMC05KSAqLwotICAgICAgICBpZiAoIEZUX0FMTE9DKCByZXN1bHQsIGZhY2UtPnZhcl9wb3N0c2NyaXB0X3ByZWZpeF9sZW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBmdF9zdHJsZW4oIHN1YmZhbWlseV9uYW1lICkgKyAxICkgKQotICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICAgIGZ0X3N0cmNweSggcmVzdWx0LCBmYWNlLT52YXJfcG9zdHNjcmlwdF9wcmVmaXggKTsKLQotICAgICAgICBwID0gcmVzdWx0ICsgZmFjZS0+dmFyX3Bvc3RzY3JpcHRfcHJlZml4X2xlbjsKLSAgICAgICAgKnArKyA9ICctJzsKLQotICAgICAgICBzID0gc3ViZmFtaWx5X25hbWU7Ci0gICAgICAgIHdoaWxlICggKnMgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBmdF9pc2FsbnVtKCAqcyApICkKLSAgICAgICAgICAgICpwKysgPSAqczsKLSAgICAgICAgICBzKys7Ci0gICAgICAgIH0KLSAgICAgICAgKnArKyA9ICdcMCc7Ci0KLSAgICAgICAgRlRfRlJFRSggc3ViZmFtaWx5X25hbWUgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1Zhcl9BeGlzKiAgYXhpczsKLQotCi0gICAgY29uc3RydWN0X2luc3RhbmNlX25hbWU6Ci0gICAgICBheGlzID0gbW1fdmFyLT5heGlzOwotCi0gICAgICBpZiAoIEZUX0FMTE9DKCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICBmYWNlLT52YXJfcG9zdHNjcmlwdF9wcmVmaXhfbGVuICsKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX2Nvb3JkcyAqIE1BWF9WQUxVRV9ERVNDUklQVE9SX0xFTiArIDEgKSApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICBwID0gcmVzdWx0OwotCi0gICAgICBmdF9zdHJjcHkoIHAsIGZhY2UtPnZhcl9wb3N0c2NyaXB0X3ByZWZpeCApOwotICAgICAgcCArPSBmYWNlLT52YXJfcG9zdHNjcmlwdF9wcmVmaXhfbGVuOwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9jb29yZHM7IGkrKywgY29vcmRzKyssIGF4aXMrKyApCi0gICAgICB7Ci0gICAgICAgIGNoYXIgIHQ7Ci0KLQotICAgICAgICAvKiBvbWl0IGF4aXMgdmFsdWUgZGVzY3JpcHRvciBpZiBpdCBpcyBpZGVudGljYWwgKi8KLSAgICAgICAgLyogdG8gdGhlIGRlZmF1bHQgYXhpcyB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggKmNvb3JkcyA9PSBheGlzLT5kZWYgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICpwKysgPSAnXyc7Ci0gICAgICAgIHAgICAgPSBmaXhlZDJmbG9hdCggKmNvb3JkcywgcCApOwotCi0gICAgICAgIHQgPSAoY2hhcikoIGF4aXMtPnRhZyA+PiAyNCApOwotICAgICAgICBpZiAoIHQgIT0gJyAnICYmIGZ0X2lzYWxudW0oIHQgKSApCi0gICAgICAgICAgKnArKyA9IHQ7Ci0gICAgICAgIHQgPSAoY2hhcikoIGF4aXMtPnRhZyA+PiAxNiApOwotICAgICAgICBpZiAoIHQgIT0gJyAnICYmIGZ0X2lzYWxudW0oIHQgKSApCi0gICAgICAgICAgKnArKyA9IHQ7Ci0gICAgICAgIHQgPSAoY2hhcikoIGF4aXMtPnRhZyA+PiA4ICk7Ci0gICAgICAgIGlmICggdCAhPSAnICcgJiYgZnRfaXNhbG51bSggdCApICkKLSAgICAgICAgICAqcCsrID0gdDsKLSAgICAgICAgdCA9IChjaGFyKWF4aXMtPnRhZzsKLSAgICAgICAgaWYgKCB0ICE9ICcgJyAmJiBmdF9pc2FsbnVtKCB0ICkgKQotICAgICAgICAgICpwKysgPSB0OwotICAgICAgfQotICAgIH0KLQotICBjaGVja19sZW5ndGg6Ci0gICAgaWYgKCBwIC0gcmVzdWx0ID4gTUFYX1BTX05BTUVfTEVOICkKLSAgICB7Ci0gICAgICAvKiB0aGUgUFMgbmFtZSBpcyB0b28gbG9uZzsgcmVwbGFjZSB0aGUgcGFydCBhZnRlciB0aGUgcHJlZml4IHdpdGggKi8KLSAgICAgIC8qIGEgY2hlY2tzdW07IHdlIHVzZSBNdXJtdXJIYXNoIDMgd2l0aCBhIGhhc2ggbGVuZ3RoIG9mIDEyOCBiaXQgICAqLwotCi0gICAgICBGVF9VSW50MzIgIHNlZWQgPSAxMjM0NTY3ODk7Ci0KLSAgICAgIEZUX1VJbnQzMiAgIGhhc2hbNF07Ci0gICAgICBGVF9VSW50MzIqICBoOwotCi0KLSAgICAgIG11cm11cl9oYXNoXzNfMTI4KCByZXN1bHQsIHAgLSByZXN1bHQsIHNlZWQsIGhhc2ggKTsKLQotICAgICAgcCA9IHJlc3VsdCArIGZhY2UtPnZhcl9wb3N0c2NyaXB0X3ByZWZpeF9sZW47Ci0gICAgICAqcCsrID0gJy0nOwotCi0gICAgICAvKiB3ZSBjb252ZXJ0IHRoZSBoYXNoIHZhbHVlIHRvIGhleCBkaWdpdHMgZnJvbSBiYWNrIHRvIGZyb250ICovCi0gICAgICBwICs9IDMyICsgMzsKLSAgICAgIGggID0gaGFzaCArIDM7Ci0KLSAgICAgICpwLS0gPSAnXDAnOwotICAgICAgKnAtLSA9ICcuJzsKLSAgICAgICpwLS0gPSAnLic7Ci0gICAgICAqcC0tID0gJy4nOwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKywgaC0tICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludDMyICB2ID0gKmg7Ci0KLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IDg7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAqcC0tICAgPSBoZXhkaWdpdHNbdiAmIDB4Rl07Ci0gICAgICAgICAgdiAgICA+Pj0gNDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotCi0gIHN0YXRpYyBjb25zdCBjaGFyKgotICBzZm50X2dldF9wc19uYW1lKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0ludCAgICAgICBmb3VuZCwgd2luLCBhcHBsZTsKLSAgICBjb25zdCBjaGFyKiAgcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgaWYgKCBmYWNlLT5wb3N0c2NyaXB0X25hbWUgKQotICAgICAgcmV0dXJuIGZhY2UtPnBvc3RzY3JpcHRfbmFtZTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBpZiAoIGZhY2UtPmJsZW5kICkKLSAgICB7Ci0gICAgICBmYWNlLT5wb3N0c2NyaXB0X25hbWUgPSBzZm50X2dldF92YXJfcHNfbmFtZSggZmFjZSApOwotICAgICAgcmV0dXJuIGZhY2UtPnBvc3RzY3JpcHRfbmFtZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIHNjYW4gdGhlIG5hbWUgdGFibGUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSBhIFBvc3RzY3JpcHQgbmFtZSBoZXJlLCAqLwotICAgIC8qIGVpdGhlciBpbiBNYWNpbnRvc2ggb3IgV2luZG93cyBwbGF0Zm9ybSBlbmNvZGluZ3MgICAgICAgICAgICAgICAgICAqLwotICAgIGZvdW5kID0gc2ZudF9nZXRfbmFtZV9pZCggZmFjZSwgVFRfTkFNRV9JRF9QU19OQU1FLCAmd2luLCAmYXBwbGUgKTsKLSAgICBpZiAoICFmb3VuZCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIHByZWZlciBXaW5kb3dzIGVudHJpZXMgb3ZlciBBcHBsZSAqLwotICAgIGlmICggd2luICE9IC0xICkKLSAgICAgIHJlc3VsdCA9IGdldF93aW5fc3RyaW5nKCBmYWNlLT5yb290Lm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5uYW1lX3RhYmxlLnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5uYW1lX3RhYmxlLm5hbWVzICsgd2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfaXNfcG9zdHNjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICk7Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gZ2V0X2FwcGxlX3N0cmluZyggZmFjZS0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5uYW1lX3RhYmxlLnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBhcHBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfaXNfcG9zdHNjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKLQotICAgIGZhY2UtPnBvc3RzY3JpcHRfbmFtZSA9IHJlc3VsdDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX1BTRk9OVE5BTUVSRUMoCi0gICAgc2ZudF9zZXJ2aWNlX3BzX25hbWUsCi0KLSAgICAoRlRfUHNOYW1lX0dldEZ1bmMpc2ZudF9nZXRfcHNfbmFtZSAgICAgICAvKiBnZXRfcHNfZm9udF9uYW1lICovCi0gICkKLQotCi0gIC8qCi0gICAqICBUVCBDTUFQIElORk8KLSAgICovCi0gIEZUX0RFRklORV9TRVJWSUNFX1RUQ01BUFNSRUMoCi0gICAgdHRfc2VydmljZV9nZXRfY21hcF9pbmZvLAotCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKXR0X2dldF9jbWFwX2luZm8gICAgLyogZ2V0X2NtYXBfaW5mbyAqLwotICApCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHNmbnRfZ2V0X2NoYXJzZXRfaWQoIFRUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9yZWdpc3RyeSApCi0gIHsKLSAgICBCREZfUHJvcGVydHlSZWMgIGVuY29kaW5nLCByZWdpc3RyeTsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotCi0KLSAgICAvKiBYWFg6IEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMgY29ycmVjdCwgc2luY2UKLSAgICAgKiAgICAgIHR0X2ZhY2VfZmluZF9iZGZfcHJvcCBvbmx5IHJldHVybnMgc29tZXRoaW5nIGNvcnJlY3QgaWYgd2UgaGF2ZQotICAgICAqICAgICAgcHJldmlvdXNseSBzZWxlY3RlZCBhIHNpemUgdGhhdCBpcyBsaXN0ZWQgaW4gdGhlIEJERiB0YWJsZS4KLSAgICAgKiAgICAgIFNob3VsZCB3ZSBjaGFuZ2UgdGhlIEJERiB0YWJsZSBmb3JtYXQgdG8gaW5jbHVkZSBzaW5nbGUgb2Zmc2V0cwotICAgICAqICAgICAgZm9yIGBDSEFSU0VUX1JFR0lTVFJZJyBhbmQgYENIQVJTRVRfRU5DT0RJTkcnPwotICAgICAqLwotICAgIGVycm9yID0gdHRfZmFjZV9maW5kX2JkZl9wcm9wKCBmYWNlLCAiQ0hBUlNFVF9SRUdJU1RSWSIsICZyZWdpc3RyeSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHR0X2ZhY2VfZmluZF9iZGZfcHJvcCggZmFjZSwgIkNIQVJTRVRfRU5DT0RJTkciLCAmZW5jb2RpbmcgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCByZWdpc3RyeS50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0FUT00gJiYKLSAgICAgICAgICAgICBlbmNvZGluZy50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0FUT00gKQotICAgICAgICB7Ci0gICAgICAgICAgKmFjaGFyc2V0X2VuY29kaW5nID0gZW5jb2RpbmcudS5hdG9tOwotICAgICAgICAgICphY2hhcnNldF9yZWdpc3RyeSA9IHJlZ2lzdHJ5LnUuYXRvbTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0VfQkRGUmVjKAotICAgIHNmbnRfc2VydmljZV9iZGYsCi0KLSAgICAoRlRfQkRGX0dldENoYXJzZXRJZEZ1bmMpc2ZudF9nZXRfY2hhcnNldF9pZCwgICAgIC8qIGdldF9jaGFyc2V0X2lkICovCi0gICAgKEZUX0JERl9HZXRQcm9wZXJ0eUZ1bmMpIHR0X2ZhY2VfZmluZF9iZGZfcHJvcCAgICAvKiBnZXRfcHJvcGVydHkgICAqLwotICApCi0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fQkRGICovCi0KLQotICAvKgotICAgKiAgU0VSVklDRSBMSVNUCi0gICAqLwotCi0jaWYgZGVmaW5lZCBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgJiYgZGVmaW5lZCBUVF9DT05GSUdfT1BUSU9OX0JERgotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1KAotICAgIHNmbnRfc2VydmljZXMsCi0KLSAgICBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUsICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX1NGTlRfVEFCTEVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJlNGTlRfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0JERiwgICAgICAgICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX0JERl9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJlRUX1NFUlZJQ0VfQ01BUF9JTkZPX0dFVCApCi0jZWxpZiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KAotICAgIHNmbnRfc2VydmljZXMsCi0KLSAgICBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUsICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX1NGTlRfVEFCTEVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJlNGTlRfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmVFRfU0VSVklDRV9DTUFQX0lORk9fR0VUICkKLSNlbGlmIGRlZmluZWQgVFRfQ09ORklHX09QVElPTl9CREYKLSAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNCgKLSAgICBzZm50X3NlcnZpY2VzLAotCi0gICAgRlRfU0VSVklDRV9JRF9TRk5UX1RBQkxFLCAgICAgICAgICAgJlNGTlRfU0VSVklDRV9TRk5UX1RBQkxFX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmU0ZOVF9TRVJWSUNFX1BTX05BTUVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfQkRGLCAgICAgICAgICAgICAgICAgICZTRk5UX1NFUlZJQ0VfQkRGX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmVFRfU0VSVklDRV9DTUFQX0lORk9fR0VUICkKLSNlbHNlCi0gIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzMoCi0gICAgc2ZudF9zZXJ2aWNlcywKLQotICAgIEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRSwgICAgICAgICAgICZTRk5UX1NFUlZJQ0VfU0ZOVF9UQUJMRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJlNGTlRfU0VSVklDRV9QU19OQU1FX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmVFRfU0VSVklDRV9DTUFQX0lORk9fR0VUICkKLSNlbmRpZgotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9Nb2R1bGVfSW50ZXJmYWNlICkKLSAgc2ZudF9nZXRfaW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2R1bGVfaW50ZXJmYWNlICkKLSAgewotICAgIC8qIFNGTlRfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0KLQotICAgIGlmICggIW1vZHVsZSApCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBTRk5UX1NFUlZJQ0VTX0dFVCwgbW9kdWxlX2ludGVyZmFjZSApOwotICB9Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotI2RlZmluZSBQVVRfRU1CRURERURfQklUTUFQUyggYSApICBhCi0jZWxzZQotI2RlZmluZSBQVVRfRU1CRURERURfQklUTUFQUyggYSApICBOVUxMCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotI2RlZmluZSBQVVRfUFNfTkFNRVMoIGEgKSAgYQotI2Vsc2UKLSNkZWZpbmUgUFVUX1BTX05BTUVTKCBhICkgIE5VTEwKLSNlbmRpZgotCi0gIEZUX0RFRklORV9TRk5UX0lOVEVSRkFDRSgKLSAgICBzZm50X2ludGVyZmFjZSwKLQotICAgIHR0X2ZhY2VfZ290b190YWJsZSwgICAgIC8qIFRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jIGdvdG9fdGFibGUgICAgICAqLwotCi0gICAgc2ZudF9pbml0X2ZhY2UsICAgICAgICAgLyogVFRfSW5pdF9GYWNlX0Z1bmMgICAgICAgaW5pdF9mYWNlICAgICAgICovCi0gICAgc2ZudF9sb2FkX2ZhY2UsICAgICAgICAgLyogVFRfTG9hZF9GYWNlX0Z1bmMgICAgICAgbG9hZF9mYWNlICAgICAgICovCi0gICAgc2ZudF9kb25lX2ZhY2UsICAgICAgICAgLyogVFRfRG9uZV9GYWNlX0Z1bmMgICAgICAgZG9uZV9mYWNlICAgICAgICovCi0gICAgc2ZudF9nZXRfaW50ZXJmYWNlLCAgICAgLyogRlRfTW9kdWxlX1JlcXVlc3RlciAgICAgZ2V0X2ludGVyZmFjZSAgICovCi0KLSAgICB0dF9mYWNlX2xvYWRfYW55LCAgICAgICAvKiBUVF9Mb2FkX0FueV9GdW5jICAgICAgICBsb2FkX2FueSAgICAgICAgKi8KLQotICAgIHR0X2ZhY2VfbG9hZF9oZWFkLCAgICAgIC8qIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgIGxvYWRfaGVhZCAgICAgICAqLwotICAgIHR0X2ZhY2VfbG9hZF9oaGVhLCAgICAgIC8qIFRUX0xvYWRfTWV0cmljc19GdW5jICAgIGxvYWRfaGhlYSAgICAgICAqLwotICAgIHR0X2ZhY2VfbG9hZF9jbWFwLCAgICAgIC8qIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgIGxvYWRfY21hcCAgICAgICAqLwotICAgIHR0X2ZhY2VfbG9hZF9tYXhwLCAgICAgIC8qIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgIGxvYWRfbWF4cCAgICAgICAqLwotICAgIHR0X2ZhY2VfbG9hZF9vczIsICAgICAgIC8qIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgIGxvYWRfb3MyICAgICAgICAqLwotICAgIHR0X2ZhY2VfbG9hZF9wb3N0LCAgICAgIC8qIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgIGxvYWRfcG9zdCAgICAgICAqLwotCi0gICAgdHRfZmFjZV9sb2FkX25hbWUsICAgICAgLyogVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9uYW1lICAgICAgICovCi0gICAgdHRfZmFjZV9mcmVlX25hbWUsICAgICAgLyogVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgZnJlZV9uYW1lICAgICAgICovCi0KLSAgICB0dF9mYWNlX2xvYWRfa2VybiwgICAgICAvKiBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICBsb2FkX2tlcm4gICAgICAgKi8KLSAgICB0dF9mYWNlX2xvYWRfZ2FzcCwgICAgICAvKiBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICBsb2FkX2dhc3AgICAgICAgKi8KLSAgICB0dF9mYWNlX2xvYWRfcGNsdCwgICAgICAvKiBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICBsb2FkX2luaXQgICAgICAgKi8KLQotICAgIC8qIHNlZSBgdHRsb2FkLmgnICovCi0gICAgUFVUX0VNQkVEREVEX0JJVE1BUFMoIHR0X2ZhY2VfbG9hZF9iaGVkICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9iaGVkICAgICAgICovCi0gICAgUFVUX0VNQkVEREVEX0JJVE1BUFMoIHR0X2ZhY2VfbG9hZF9zYml0X2ltYWdlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFRfTG9hZF9TQml0X0ltYWdlX0Z1bmMgbG9hZF9zYml0X2ltYWdlICovCi0KLSAgICAvKiBzZWUgYHR0cG9zdC5oJyAqLwotICAgIFBVVF9QU19OQU1FUyggdHRfZmFjZV9nZXRfcHNfbmFtZSAgICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFRfR2V0X1BTX05hbWVfRnVuYyAgICAgZ2V0X3BzbmFtZSAgICAgICovCi0gICAgUFVUX1BTX05BTUVTKCB0dF9mYWNlX2ZyZWVfcHNfbmFtZXMgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICBmcmVlX3BzbmFtZXMgICAgKi8KLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xLjggKi8KLSAgICB0dF9mYWNlX2dldF9rZXJuaW5nLCAgICAvKiBUVF9GYWNlX0dldEtlcm5pbmdGdW5jICBnZXRfa2VybmluZyAgICAgKi8KLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4yICovCi0gICAgdHRfZmFjZV9sb2FkX2ZvbnRfZGlyLCAgLyogVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9mb250X2RpciAgICovCi0gICAgdHRfZmFjZV9sb2FkX2htdHgsICAgICAgLyogVFRfTG9hZF9NZXRyaWNzX0Z1bmMgICAgbG9hZF9obXR4ICAgICAgICovCi0KLSAgICAvKiBzZWUgYHR0c2JpdC5oJyBhbmQgYHNmbnQuaCcgKi8KLSAgICBQVVRfRU1CRURERURfQklUTUFQUyggdHRfZmFjZV9sb2FkX3NiaXQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICBsb2FkX2VibGMgICAgICAgKi8KLSAgICBQVVRfRU1CRURERURfQklUTUFQUyggdHRfZmFjZV9mcmVlX3NiaXQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICBmcmVlX2VibGMgICAgICAgKi8KLQotICAgIFBVVF9FTUJFRERFRF9CSVRNQVBTKCB0dF9mYWNlX3NldF9zYml0X3N0cmlrZSAgICAgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUVF9TZXRfU0JpdF9TdHJpa2VfRnVuYyBzZXRfc2JpdF9zdHJpa2UgKi8KLSAgICBQVVRfRU1CRURERURfQklUTUFQUyggdHRfZmFjZV9sb2FkX3N0cmlrZV9tZXRyaWNzICksCi0gICAgICAgICAgICAgICAgICAgIC8qIFRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYyBsb2FkX3N0cmlrZV9tZXRyaWNzICovCi0KLSAgICB0dF9mYWNlX2dldF9tZXRyaWNzLCAgICAvKiBUVF9HZXRfTWV0cmljc19GdW5jICAgICBnZXRfbWV0cmljcyAgICAgKi8KLQotICAgIHR0X2ZhY2VfZ2V0X25hbWUsICAgICAgIC8qIFRUX0dldF9OYW1lX0Z1bmMgICAgICAgIGdldF9uYW1lICAgICAgICAqLwotICAgIHNmbnRfZ2V0X25hbWVfaWQgICAgICAgIC8qIFRUX0dldF9OYW1lX0lEX0Z1bmMgICAgIGdldF9uYW1lX2lkICAgICAqLwotICApCi0KLQotICBGVF9ERUZJTkVfTU9EVUxFKAotICAgIHNmbnRfbW9kdWxlX2NsYXNzLAotCi0gICAgMCwgIC8qIG5vdCBhIGZvbnQgZHJpdmVyIG9yIHJlbmRlcmVyICovCi0gICAgc2l6ZW9mICggRlRfTW9kdWxlUmVjICksCi0KLSAgICAic2ZudCIsICAgICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MTAwMDBMLCAgIC8qIGRyaXZlciB2ZXJzaW9uIDEuMCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyMDAwMEwsICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBoaWdoZXIgKi8KLQotICAgIChjb25zdCB2b2lkKikmU0ZOVF9JTlRFUkZBQ0VfR0VULCAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilOVUxMLCAgICAgICAgICAgICAgIC8qIG1vZHVsZV9pbml0ICAgKi8KLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIE5VTEwsICAgICAgICAgICAgICAgLyogbW9kdWxlX2RvbmUgICAqLwotICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgc2ZudF9nZXRfaW50ZXJmYWNlICAvKiBnZXRfaW50ZXJmYWNlICovCi0gICkKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3NmZHJpdmVyLmggYi9zcmMvc2ZudC9zZmRyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcxMGI2Li4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3NmZHJpdmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZmRyaXZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBTRk5UIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgU0ZEUklWRVJfSF8KLSNkZWZpbmUgU0ZEUklWRVJfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9ERUNMQVJFX01PRFVMRSggc2ZudF9tb2R1bGVfY2xhc3MgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFNGRFJJVkVSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZmVycm9ycy5oIGIvc3JjL3NmbnQvc2ZlcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmNzNkNy4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC9zZmVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNGTlQgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBTRk5UIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBTRkVSUk9SU19IXwotI2RlZmluZSBTRkVSUk9SU19IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBTRk5UX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9TRk5UCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBTRkVSUk9SU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2ZudC5jIGIvc3JjL3NmbnQvc2ZudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2Y4YzllLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3NmbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmbnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTaW5nbGUgb2JqZWN0IGxpYnJhcnkgY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgInBuZ3NoaW0uYyIKLSNpbmNsdWRlICJzZmRyaXZlci5jIgotI2luY2x1ZGUgInNmbnRwaWMuYyIKLSNpbmNsdWRlICJzZm9ianMuYyIKLSNpbmNsdWRlICJ0dGJkZi5jIgotI2luY2x1ZGUgInR0Y21hcC5jIgotI2luY2x1ZGUgInR0a2Vybi5jIgotI2luY2x1ZGUgInR0bG9hZC5jIgotI2luY2x1ZGUgInR0bXR4LmMiCi0jaW5jbHVkZSAidHRwb3N0LmMiCi0jaW5jbHVkZSAidHRzYml0LmMiCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZm50cGljLmMgYi9zcmMvc2ZudC9zZm50cGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYWRkNjAuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvc2ZudHBpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmbnRwaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3Igc2ZudCBtb2R1bGUuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJzZm50cGljLmgiCi0jaW5jbHVkZSAic2ZlcnJvcnMuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIHNmZHJpdmVyLmMgKi8KLSAgRlRfRXJyb3IKLSAgRlRfQ3JlYXRlX0NsYXNzX3NmbnRfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX3NmbnRfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2VfYmRmKCBGVF9TZXJ2aWNlX0JERlJlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19zZm50X2ludGVyZmFjZSggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRk5UX0ludGVyZmFjZSogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2VfZ2x5cGhfZGljdCgKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgRlRfU2VydmljZV9HbHlwaERpY3RSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3Nfc2ZudF9zZXJ2aWNlX3BzX25hbWUoCi0gICAgRlRfTGlicmFyeSAgICAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfdHRfc2VydmljZV9nZXRfY21hcF9pbmZvKAotICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgRlRfU2VydmljZV9UVENNYXBzUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX3NmbnRfc2VydmljZV9zZm50X3RhYmxlKAotICAgIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyogIGNsYXp6ICk7Ci0KLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIHR0Y21hcC5jICovCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcF9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX3R0X2NtYXBfY2xhc3NlcyggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwX0NsYXNzKiAgY2xhenogKTsKLQotCi0gIHZvaWQKLSAgc2ZudF9tb2R1bGVfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5zZm50ICkKLSAgICB7Ci0gICAgICBzZm50TW9kdWxlUElDKiAgY29udGFpbmVyID0gKHNmbnRNb2R1bGVQSUMqKXBpY19jb250YWluZXItPnNmbnQ7Ci0KLQotICAgICAgaWYgKCBjb250YWluZXItPnNmbnRfc2VydmljZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX3NmbnRfc2VydmljZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLT5zZm50X3NlcnZpY2VzICk7Ci0gICAgICBjb250YWluZXItPnNmbnRfc2VydmljZXMgPSBOVUxMOwotCi0gICAgICBpZiAoIGNvbnRhaW5lci0+dHRfY21hcF9jbGFzc2VzICkKLSAgICAgICAgRlRfRGVzdHJveV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXItPnR0X2NtYXBfY2xhc3NlcyApOwotICAgICAgY29udGFpbmVyLT50dF9jbWFwX2NsYXNzZXMgPSBOVUxMOwotCi0gICAgICBGVF9GUkVFKCBjb250YWluZXIgKTsKLSAgICAgIHBpY19jb250YWluZXItPnNmbnQgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgc2ZudF9tb2R1bGVfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBzZm50TW9kdWxlUElDKiAgICAgY29udGFpbmVyICAgICA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIC8qIGFsbG9jYXRlIHBvaW50ZXIsIGNsZWFyIGFuZCBzZXQgZ2xvYmFsIGNvbnRhaW5lciBwb2ludGVyICovCi0gICAgaWYgKCBGVF9BTExPQyggY29udGFpbmVyLCBzaXplb2YgKCAqY29udGFpbmVyICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgRlRfTUVNX1NFVCggY29udGFpbmVyLCAwLCBzaXplb2YgKCAqY29udGFpbmVyICkgKTsKLSAgICBwaWNfY29udGFpbmVyLT5zZm50ID0gY29udGFpbmVyOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgZXJyb3IgPSBGVF9DcmVhdGVfQ2xhc3Nfc2ZudF9zZXJ2aWNlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLT5zZm50X3NlcnZpY2VzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IEZUX0NyZWF0ZV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLT50dF9jbWFwX2NsYXNzZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX0luaXRfQ2xhc3Nfc2ZudF9zZXJ2aWNlX2dseXBoX2RpY3QoCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5zZm50X3NlcnZpY2VfZ2x5cGhfZGljdCApOwotICAgIEZUX0luaXRfQ2xhc3Nfc2ZudF9zZXJ2aWNlX3BzX25hbWUoCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5zZm50X3NlcnZpY2VfcHNfbmFtZSApOwotICAgIEZUX0luaXRfQ2xhc3NfdHRfc2VydmljZV9nZXRfY21hcF9pbmZvKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+dHRfc2VydmljZV9nZXRfY21hcF9pbmZvICk7Ci0gICAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2Vfc2ZudF90YWJsZSgKLSAgICAgICZjb250YWluZXItPnNmbnRfc2VydmljZV9zZm50X3RhYmxlICk7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSAgICBGVF9Jbml0X0NsYXNzX3NmbnRfc2VydmljZV9iZGYoICZjb250YWluZXItPnNmbnRfc2VydmljZV9iZGYgKTsKLSNlbmRpZgotICAgIEZUX0luaXRfQ2xhc3Nfc2ZudF9pbnRlcmZhY2UoIGxpYnJhcnksICZjb250YWluZXItPnNmbnRfaW50ZXJmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHNmbnRfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2ZudHBpYy5oIGIvc3JjL3NmbnQvc2ZudHBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZiNjY4Li4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3NmbnRwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZm50cGljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHNmbnQgbW9kdWxlLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgU0ZOVFBJQ19IXwotI2RlZmluZSBTRk5UUElDX0hfCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgU0ZOVF9TRVJWSUNFU19HRVQgICAgICAgICAgICBzZm50X3NlcnZpY2VzCi0jZGVmaW5lIFNGTlRfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCAgc2ZudF9zZXJ2aWNlX2dseXBoX2RpY3QKLSNkZWZpbmUgU0ZOVF9TRVJWSUNFX1BTX05BTUVfR0VUICAgICBzZm50X3NlcnZpY2VfcHNfbmFtZQotI2RlZmluZSBUVF9TRVJWSUNFX0NNQVBfSU5GT19HRVQgICAgIHR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbwotI2RlZmluZSBUVF9DTUFQX0NMQVNTRVNfR0VUICAgICAgICAgIHR0X2NtYXBfY2xhc3NlcwotI2RlZmluZSBTRk5UX1NFUlZJQ0VfU0ZOVF9UQUJMRV9HRVQgIHNmbnRfc2VydmljZV9zZm50X3RhYmxlCi0jZGVmaW5lIFNGTlRfU0VSVklDRV9CREZfR0VUICAgICAgICAgc2ZudF9zZXJ2aWNlX2JkZgotI2RlZmluZSBTRk5UX0lOVEVSRkFDRV9HRVQgICAgICAgICAgIHNmbnRfaW50ZXJmYWNlCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogc29tZSBpbmNsdWRlIGZpbGVzIHJlcXVpcmVkIGZvciBtZW1iZXJzIG9mIHNmbnRNb2R1bGVQSUMgKi8KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1NGTlRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UVF9DTUFQX0gKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0jaW5jbHVkZSAidHRiZGYuaCIKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQkRGX0gKLSNlbmRpZgotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSAidHRjbWFwLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIHNmbnRNb2R1bGVQSUNfCi0gIHsKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogICAgICAgIHNmbnRfc2VydmljZXM7Ci0gICAgRlRfU2VydmljZV9HbHlwaERpY3RSZWMgICBzZm50X3NlcnZpY2VfZ2x5cGhfZGljdDsKLSAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMgIHNmbnRfc2VydmljZV9wc19uYW1lOwotICAgIEZUX1NlcnZpY2VfVFRDTWFwc1JlYyAgICAgdHRfc2VydmljZV9nZXRfY21hcF9pbmZvOwotICAgIFRUX0NNYXBfQ2xhc3MqICAgICAgICAgICAgdHRfY21hcF9jbGFzc2VzOwotICAgIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyAgc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGU7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSAgICBGVF9TZXJ2aWNlX0JERlJlYyAgICAgICAgIHNmbnRfc2VydmljZV9iZGY7Ci0jZW5kaWYKLSAgICBTRk5UX0ludGVyZmFjZSAgICAgICAgICAgIHNmbnRfaW50ZXJmYWNlOwotCi0gIH0gc2ZudE1vZHVsZVBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoc2ZudE1vZHVsZVBJQyopKCAobGliKS0+cGljX2NvbnRhaW5lci5zZm50ICkgKQotCi0jZGVmaW5lIFNGTlRfU0VSVklDRVNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnNmbnRfc2VydmljZXMgKQotI2RlZmluZSBTRk5UX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+c2ZudF9zZXJ2aWNlX2dseXBoX2RpY3QgKQotI2RlZmluZSBTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+c2ZudF9zZXJ2aWNlX3BzX25hbWUgKQotI2RlZmluZSBUVF9TRVJWSUNFX0NNQVBfSU5GT19HRVQgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyApCi0jZGVmaW5lIFRUX0NNQVBfQ0xBU1NFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfY21hcF9jbGFzc2VzICkKLSNkZWZpbmUgU0ZOVF9TRVJWSUNFX1NGTlRfVEFCTEVfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnNmbnRfc2VydmljZV9zZm50X3RhYmxlICkKLSNkZWZpbmUgU0ZOVF9TRVJWSUNFX0JERl9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+c2ZudF9zZXJ2aWNlX2JkZiApCi0jZGVmaW5lIFNGTlRfSU5URVJGQUNFX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5zZm50X2ludGVyZmFjZSApCi0KLQotICAvKiBzZWUgc2ZudHBpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICBzZm50X21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIHNmbnRfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0jZW5kaWYgLyogU0ZOVFBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2ZvYmpzLmMgYi9zcmMvc2ZudC9zZm9ianMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1NGQ1ZC4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC9zZm9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNGTlQgb2JqZWN0IG1hbmFnZW1lbnQgKGJhc2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJzZm9ianMuaCIKLSNpbmNsdWRlICJ0dGxvYWQuaCIKLSNpbmNsdWRlICJ0dGNtYXAuaCIKLSNpbmNsdWRlICJ0dGtlcm4uaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0gKLSNpbmNsdWRlIEZUX1NGTlRfTkFNRVNfSAotI2luY2x1ZGUgRlRfR1pJUF9ICi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSAotI2VuZGlmCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSNpbmNsdWRlICJ0dGJkZi5oIgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9zZm9ianMKLQotCi0KLSAgLyogY29udmVydCBhIFVURi0xNiBuYW1lIGVudHJ5IHRvIEFTQ0lJICovCi0gIHN0YXRpYyBGVF9TdHJpbmcqCi0gIHR0X25hbWVfYXNjaWlfZnJvbV91dGYxNiggVFRfTmFtZSAgICBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9TdHJpbmcqICBzdHJpbmcgPSBOVUxMOwotICAgIEZUX1VJbnQgICAgIGxlbiwgY29kZSwgbjsKLSAgICBGVF9CeXRlKiAgICByZWFkICAgPSAoRlRfQnl0ZSopZW50cnktPnN0cmluZzsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgbGVuID0gKEZUX1VJbnQpZW50cnktPnN0cmluZ0xlbmd0aCAvIDI7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggc3RyaW5nLCBsZW4gKyAxICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGxlbjsgbisrICkKLSAgICB7Ci0gICAgICBjb2RlID0gRlRfTkVYVF9VU0hPUlQoIHJlYWQgKTsKLQotICAgICAgaWYgKCBjb2RlID09IDAgKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBjb2RlIDwgMzIgfHwgY29kZSA+IDEyNyApCi0gICAgICAgIGNvZGUgPSAnPyc7Ci0KLSAgICAgIHN0cmluZ1tuXSA9IChjaGFyKWNvZGU7Ci0gICAgfQotCi0gICAgc3RyaW5nW25dID0gMDsKLQotICAgIHJldHVybiBzdHJpbmc7Ci0gIH0KLQotCi0gIC8qIGNvbnZlcnQgYW4gQXBwbGUgUm9tYW4gb3Igc3ltYm9sIG5hbWUgZW50cnkgdG8gQVNDSUkgKi8KLSAgc3RhdGljIEZUX1N0cmluZyoKLSAgdHRfbmFtZV9hc2NpaV9mcm9tX290aGVyKCBUVF9OYW1lICAgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX1N0cmluZyogIHN0cmluZyA9IE5VTEw7Ci0gICAgRlRfVUludCAgICAgbGVuLCBjb2RlLCBuOwotICAgIEZUX0J5dGUqICAgIHJlYWQgICA9IChGVF9CeXRlKillbnRyeS0+c3RyaW5nOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0KLSAgICBsZW4gPSAoRlRfVUludCllbnRyeS0+c3RyaW5nTGVuZ3RoOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHN0cmluZywgbGVuICsgMSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBsZW47IG4rKyApCi0gICAgewotICAgICAgY29kZSA9ICpyZWFkKys7Ci0KLSAgICAgIGlmICggY29kZSA9PSAwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggY29kZSA8IDMyIHx8IGNvZGUgPiAxMjcgKQotICAgICAgICBjb2RlID0gJz8nOwotCi0gICAgICBzdHJpbmdbbl0gPSAoY2hhciljb2RlOwotICAgIH0KLQotICAgIHN0cmluZ1tuXSA9IDA7Ci0KLSAgICByZXR1cm4gc3RyaW5nOwotICB9Ci0KLQotICB0eXBlZGVmIEZUX1N0cmluZyogICgqVFRfTmFtZV9Db252ZXJ0RnVuYykoIFRUX05hbWUgICAgZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gc2ZudC5oICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZ2V0X25hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgbmFtZWlkLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgbmFtZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfU3RyaW5nKiAgcmVzdWx0ID0gTlVMTDsKLSAgICBGVF9VU2hvcnQgICBuOwotICAgIFRUX05hbWUgICAgIHJlYzsKLQotICAgIEZUX0ludCAgZm91bmRfYXBwbGUgICAgICAgICA9IC0xOwotICAgIEZUX0ludCAgZm91bmRfYXBwbGVfcm9tYW4gICA9IC0xOwotICAgIEZUX0ludCAgZm91bmRfYXBwbGVfZW5nbGlzaCA9IC0xOwotICAgIEZUX0ludCAgZm91bmRfd2luICAgICAgICAgICA9IC0xOwotICAgIEZUX0ludCAgZm91bmRfdW5pY29kZSAgICAgICA9IC0xOwotCi0gICAgRlRfQm9vbCAgaXNfZW5nbGlzaCA9IDA7Ci0KLSAgICBUVF9OYW1lX0NvbnZlcnRGdW5jICBjb252ZXJ0OwotCi0KLSAgICBGVF9BU1NFUlQoIG5hbWUgKTsKLQotICAgIHJlYyA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXM7Ci0gICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT5udW1fbmFtZXM7IG4rKywgcmVjKysgKQotICAgIHsKLSAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgT3BlblR5cGUgMS4zIHNwZWNpZmljYXRpb24sIG9ubHkgTWljcm9zb2Z0IG9yICAqLwotICAgICAgLyogQXBwbGUgcGxhdGZvcm0gSURzIG1pZ2h0IGJlIHVzZWQgaW4gdGhlIGBuYW1lJyB0YWJsZS4gIFRoZSAgICAgICovCi0gICAgICAvKiBgVW5pY29kZScgcGxhdGZvcm0gaXMgcmVzZXJ2ZWQgZm9yIHRoZSBgY21hcCcgdGFibGUsIGFuZCB0aGUgICAgKi8KLSAgICAgIC8qIGBJU08nIG9uZSBpcyBkZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBIb3dldmVyLCB0aGUgQXBwbGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBkb2Vzbid0IHNheSB0aGUgc2FtZSAgKi8KLSAgICAgIC8qIHRoaW5nIGFuZCBnb2VzIHRvIHN1Z2dlc3QgdGhhdCBhbGwgVW5pY29kZSBgbmFtZScgdGFibGUgZW50cmllcyAqLwotICAgICAgLyogc2hvdWxkIGJlIGNvZGVkIGluIFVURi0xNiAoaW4gYmlnLWVuZGlhbiBmb3JtYXQgSSBzdXBwb3NlKS4gICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggcmVjLT5uYW1lSUQgPT0gbmFtZWlkICYmIHJlYy0+c3RyaW5nTGVuZ3RoID4gMCApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIHJlYy0+cGxhdGZvcm1JRCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFOgotICAgICAgICBjYXNlIFRUX1BMQVRGT1JNX0lTTzoKLSAgICAgICAgICAvKiB0aGVyZSBpcyBgbGFuZ3VhZ2VJRCcgdG8gY2hlY2sgdGhlcmUuICBXZSBzaG91bGQgdXNlIHRoaXMgKi8KLSAgICAgICAgICAvKiBmaWVsZCBvbmx5IGFzIGEgbGFzdCBzb2x1dGlvbiB3aGVuIG5vdGhpbmcgZWxzZSBpcyAgICAgICAgKi8KLSAgICAgICAgICAvKiBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBmb3VuZF91bmljb2RlID0gbjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRUX1BMQVRGT1JNX01BQ0lOVE9TSDoKLSAgICAgICAgICAvKiBUaGlzIGlzIGEgYml0IHNwZWNpYWwgYmVjYXVzZSBzb21lIGZvbnRzIHdpbGwgdXNlIGVpdGhlciAgICAqLwotICAgICAgICAgIC8qIGFuIEVuZ2xpc2ggbGFuZ3VhZ2UgaWQsIG9yIGEgUm9tYW4gZW5jb2RpbmcgaWQsIHRvIGluZGljYXRlICovCi0gICAgICAgICAgLyogdGhlIEVuZ2xpc2ggdmVyc2lvbiBvZiBpdHMgZm9udCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggcmVjLT5sYW5ndWFnZUlEID09IFRUX01BQ19MQU5HSURfRU5HTElTSCApCi0gICAgICAgICAgICBmb3VuZF9hcHBsZV9lbmdsaXNoID0gbjsKLSAgICAgICAgICBlbHNlIGlmICggcmVjLT5lbmNvZGluZ0lEID09IFRUX01BQ19JRF9ST01BTiApCi0gICAgICAgICAgICBmb3VuZF9hcHBsZV9yb21hbiA9IG47Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUVF9QTEFURk9STV9NSUNST1NPRlQ6Ci0gICAgICAgICAgLyogd2Ugb25seSB0YWtlIGEgbm9uLUVuZ2xpc2ggbmFtZSB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgKi8KLSAgICAgICAgICAvKiBlbHNlIGF2YWlsYWJsZSBpbiB0aGUgZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBmb3VuZF93aW4gPT0gLTEgfHwgKCByZWMtPmxhbmd1YWdlSUQgJiAweDNGRiApID09IDB4MDA5ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCByZWMtPmVuY29kaW5nSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBUVF9NU19JRF9TWU1CT0xfQ1M6Ci0gICAgICAgICAgICBjYXNlIFRUX01TX0lEX1VOSUNPREVfQ1M6Ci0gICAgICAgICAgICBjYXNlIFRUX01TX0lEX1VDU180OgotICAgICAgICAgICAgICBpc19lbmdsaXNoID0gRlRfQk9PTCggKCByZWMtPmxhbmd1YWdlSUQgJiAweDNGRiApID09IDB4MDA5ICk7Ci0gICAgICAgICAgICAgIGZvdW5kX3dpbiAgPSBuOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGZvdW5kX2FwcGxlID0gZm91bmRfYXBwbGVfcm9tYW47Ci0gICAgaWYgKCBmb3VuZF9hcHBsZV9lbmdsaXNoID49IDAgKQotICAgICAgZm91bmRfYXBwbGUgPSBmb3VuZF9hcHBsZV9lbmdsaXNoOwotCi0gICAgLyogc29tZSBmb250cyBjb250YWluIGludmFsaWQgVW5pY29kZSBvciBNYWNpbnRvc2ggZm9ybWF0dGVkIGVudHJpZXM7ICovCi0gICAgLyogd2Ugd2lsbCB0aHVzIGZhdm9yIG5hbWVzIGVuY29kZWQgaW4gV2luZG93cyBmb3JtYXRzIGlmIGF2YWlsYWJsZSAgICovCi0gICAgLyogKHByb3ZpZGVkIGl0IGlzIGFuIEVuZ2xpc2ggbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgY29udmVydCA9IE5VTEw7Ci0gICAgaWYgKCBmb3VuZF93aW4gPj0gMCAmJiAhKCBmb3VuZF9hcHBsZSA+PSAwICYmICFpc19lbmdsaXNoICkgKQotICAgIHsKLSAgICAgIHJlYyA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBmb3VuZF93aW47Ci0gICAgICBzd2l0Y2ggKCByZWMtPmVuY29kaW5nSUQgKQotICAgICAgewotICAgICAgICAvKiBhbGwgVW5pY29kZSBzdHJpbmdzIGFyZSBlbmNvZGVkIHVzaW5nIFVURi0xNkJFICovCi0gICAgICBjYXNlIFRUX01TX0lEX1VOSUNPREVfQ1M6Ci0gICAgICBjYXNlIFRUX01TX0lEX1NZTUJPTF9DUzoKLSAgICAgICAgY29udmVydCA9IHR0X25hbWVfYXNjaWlfZnJvbV91dGYxNjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVFRfTVNfSURfVUNTXzQ6Ci0gICAgICAgIC8qIEFwcGFyZW50bHksIGlmIHRoaXMgdmFsdWUgaXMgZm91bmQgaW4gYSBuYW1lIHRhYmxlIGVudHJ5LCBpdCBpcyAqLwotICAgICAgICAvKiBkb2N1bWVudGVkIGFzIGBmdWxsIFVuaWNvZGUgcmVwZXJ0b2lyZScuICBFeHBlcmllbmNlIHdpdGggdGhlICAgKi8KLSAgICAgICAgLyogTXNHb3RoaWMgZm9udCBzaGlwcGVkIHdpdGggV2luZG93cyBWaXN0YSBzaG93cyB0aGF0IHRoaXMgcmVhbGx5ICovCi0gICAgICAgIC8qIG1lYW5zIFVURi0xNiBlbmNvZGVkIG5hbWVzIChVQ1MtNCB2YWx1ZXMgYXJlIG9ubHkgdXNlZCB3aXRoaW4gICAqLwotICAgICAgICAvKiBjaGFybWFwcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgY29udmVydCA9IHR0X25hbWVfYXNjaWlfZnJvbV91dGYxNjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIGZvdW5kX2FwcGxlID49IDAgKQotICAgIHsKLSAgICAgIHJlYyAgICAgPSBmYWNlLT5uYW1lX3RhYmxlLm5hbWVzICsgZm91bmRfYXBwbGU7Ci0gICAgICBjb252ZXJ0ID0gdHRfbmFtZV9hc2NpaV9mcm9tX290aGVyOwotICAgIH0KLSAgICBlbHNlIGlmICggZm91bmRfdW5pY29kZSA+PSAwICkKLSAgICB7Ci0gICAgICByZWMgICAgID0gZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIGZvdW5kX3VuaWNvZGU7Ci0gICAgICBjb252ZXJ0ID0gdHRfbmFtZV9hc2NpaV9mcm9tX3V0ZjE2OwotICAgIH0KLQotICAgIGlmICggcmVjICYmIGNvbnZlcnQgKQotICAgIHsKLSAgICAgIGlmICggIXJlYy0+c3RyaW5nICkKLSAgICAgIHsKLSAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5uYW1lX3RhYmxlLnN0cmVhbTsKLQotCi0gICAgICAgIGlmICggRlRfUU5FV19BUlJBWSAoIHJlYy0+c3RyaW5nLCByZWMtPnN0cmluZ0xlbmd0aCApIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1NFRUsoIHJlYy0+c3RyaW5nT2Zmc2V0ICkgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIHJlYy0+c3RyaW5nLCByZWMtPnN0cmluZ0xlbmd0aCApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0ZSRUUoIHJlYy0+c3RyaW5nICk7Ci0gICAgICAgICAgcmVjLT5zdHJpbmdMZW5ndGggPSAwOwotICAgICAgICAgIHJlc3VsdCAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gY29udmVydCggcmVjLCBtZW1vcnkgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICAqbmFtZSA9IHJlc3VsdDsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FbmNvZGluZwotICBzZm50X2ZpbmRfZW5jb2RpbmcoIGludCAgcGxhdGZvcm1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICBlbmNvZGluZ19pZCApCi0gIHsKLSAgICB0eXBlZGVmIHN0cnVjdCAgVEVuY29kaW5nXwotICAgIHsKLSAgICAgIGludCAgICAgICAgICBwbGF0Zm9ybV9pZDsKLSAgICAgIGludCAgICAgICAgICBlbmNvZGluZ19pZDsKLSAgICAgIEZUX0VuY29kaW5nICBlbmNvZGluZzsKLQotICAgIH0gVEVuY29kaW5nOwotCi0gICAgc3RhdGljCi0gICAgY29uc3QgVEVuY29kaW5nICB0dF9lbmNvZGluZ3NbXSA9Ci0gICAgewotICAgICAgeyBUVF9QTEFURk9STV9JU08sICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgICBGVF9FTkNPRElOR19VTklDT0RFIH0sCi0KLSAgICAgIHsgVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERSwgLTEsICAgICAgICAgICAgICAgICAgRlRfRU5DT0RJTkdfVU5JQ09ERSB9LAotCi0gICAgICB7IFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwgICAgIFRUX01BQ19JRF9ST01BTiwgICAgIEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOIH0sCi0KLSAgICAgIHsgVFRfUExBVEZPUk1fTUlDUk9TT0ZULCAgICAgVFRfTVNfSURfU1lNQk9MX0NTLCAgRlRfRU5DT0RJTkdfTVNfU1lNQk9MIH0sCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX1VDU180LCAgICAgIEZUX0VOQ09ESU5HX1VOSUNPREUgfSwKLSAgICAgIHsgVFRfUExBVEZPUk1fTUlDUk9TT0ZULCAgICAgVFRfTVNfSURfVU5JQ09ERV9DUywgRlRfRU5DT0RJTkdfVU5JQ09ERSB9LAotICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICAgICBUVF9NU19JRF9TSklTLCAgICAgICBGVF9FTkNPRElOR19TSklTIH0sCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX1BSQywgICAgICAgIEZUX0VOQ09ESU5HX1BSQyB9LAotICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICAgICBUVF9NU19JRF9CSUdfNSwgICAgICBGVF9FTkNPRElOR19CSUc1IH0sCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX1dBTlNVTkcsICAgIEZUX0VOQ09ESU5HX1dBTlNVTkcgfSwKLSAgICAgIHsgVFRfUExBVEZPUk1fTUlDUk9TT0ZULCAgICAgVFRfTVNfSURfSk9IQUIsICAgICAgRlRfRU5DT0RJTkdfSk9IQUIgfQotICAgIH07Ci0KLSAgICBjb25zdCBURW5jb2RpbmcgICpjdXIsICpsaW1pdDsKLQotCi0gICAgY3VyICAgPSB0dF9lbmNvZGluZ3M7Ci0gICAgbGltaXQgPSBjdXIgKyBzaXplb2YgKCB0dF9lbmNvZGluZ3MgKSAvIHNpemVvZiAoIHR0X2VuY29kaW5nc1swXSApOwotCi0gICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgIHsKLSAgICAgIGlmICggY3VyLT5wbGF0Zm9ybV9pZCA9PSBwbGF0Zm9ybV9pZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggY3VyLT5lbmNvZGluZ19pZCA9PSBlbmNvZGluZ19pZCB8fAotICAgICAgICAgICAgIGN1ci0+ZW5jb2RpbmdfaWQgPT0gLTEgICAgICAgICAgKQotICAgICAgICAgIHJldHVybiBjdXItPmVuY29kaW5nOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9FTkNPRElOR19OT05FOwotICB9Ci0KLQotI2RlZmluZSBXUklURV9VU0hPUlQoIHAsIHYgKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gOCApOyBcCi0gICAgICAgICAgICAqKHApKysgPSAoRlRfQnl0ZSkoICh2KSA+PiAwICk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotI2RlZmluZSBXUklURV9VTE9ORyggcCwgdiApICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gMjQgKTsgXAotICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gMTYgKTsgXAotICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gIDggKTsgXAotICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gIDAgKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotCi0gIHN0YXRpYyB2b2lkCi0gIHNmbnRfc3RyZWFtX2Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICBGVF9GUkVFKCBzdHJlYW0tPmJhc2UgKTsKLQotICAgIHN0cmVhbS0+c2l6ZSAgPSAwOwotICAgIHN0cmVhbS0+YmFzZSAgPSBOVUxMOwotICAgIHN0cmVhbS0+Y2xvc2UgPSBOVUxMOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIGludCApCi0gIGNvbXBhcmVfb2Zmc2V0cyggY29uc3Qgdm9pZCogIGEsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIGIgKQotICB7Ci0gICAgV09GRl9UYWJsZSAgdGFibGUxID0gKihXT0ZGX1RhYmxlKilhOwotICAgIFdPRkZfVGFibGUgIHRhYmxlMiA9ICooV09GRl9UYWJsZSopYjsKLQotICAgIEZUX1VMb25nICBvZmZzZXQxID0gdGFibGUxLT5PZmZzZXQ7Ci0gICAgRlRfVUxvbmcgIG9mZnNldDIgPSB0YWJsZTItPk9mZnNldDsKLQotCi0gICAgaWYgKCBvZmZzZXQxID4gb2Zmc2V0MiApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlIGlmICggb2Zmc2V0MSA8IG9mZnNldDIgKQotICAgICAgcmV0dXJuIC0xOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKiBSZXBsYWNlIGBmYWNlLT5yb290LnN0cmVhbScgd2l0aCBhIHN0cmVhbSBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgKi8KLSAgLyogU0ZOVCBvZiBhIFdPRkYgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHdvZmZfb3Blbl9mb250KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLQotICAgIFdPRkZfSGVhZGVyUmVjICB3b2ZmOwotICAgIFdPRkZfVGFibGUgICAgICB0YWJsZXMgID0gTlVMTDsKLSAgICBXT0ZGX1RhYmxlKiAgICAgaW5kaWNlcyA9IE5VTEw7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgd29mZl9vZmZzZXQ7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgc2ZudCAgICAgICAgPSBOVUxMOwotICAgIEZUX1N0cmVhbSAgICAgICBzZm50X3N0cmVhbSA9IE5VTEw7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgc2ZudF9oZWFkZXI7Ci0gICAgRlRfVUxvbmcgICAgICAgIHNmbnRfb2Zmc2V0OwotCi0gICAgRlRfSW50ICAgICAgICAgIG5uOwotICAgIEZUX1VMb25nICAgICAgICBvbGRfdGFnID0gMDsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgd29mZl9oZWFkZXJfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgV09GRl9IZWFkZXJSZWMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDQ0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggc2lnbmF0dXJlICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggZmxhdm9yICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggbGVuZ3RoICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbnVtX3RhYmxlcyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHJlc2VydmVkICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdG90YWxTZm50U2l6ZSApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1ham9yVmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1pbm9yVmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG1ldGFPZmZzZXQgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBtZXRhTGVuZ3RoICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggbWV0YU9yaWdMZW5ndGggKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBwcml2T2Zmc2V0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggcHJpdkxlbmd0aCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gPT0gZmFjZS0+cm9vdC5zdHJlYW0gKTsKLSAgICBGVF9BU1NFUlQoIEZUX1NUUkVBTV9QT1MoKSA9PSAwICk7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggd29mZl9oZWFkZXJfZmllbGRzLCAmd29mZiApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWN1cnNlIGJhY2sgaGVyZSBvciBoaXQgVFRDIGNvZGUuICovCi0gICAgaWYgKCB3b2ZmLmZsYXZvciA9PSBUVEFHX3dPRkYgfHwgd29mZi5mbGF2b3IgPT0gVFRBR190dGNmICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotCi0gICAgLyogTWlzY2VsbGFuZW91cyBjaGVja3MuICovCi0gICAgaWYgKCB3b2ZmLmxlbmd0aCAhPSBzdHJlYW0tPnNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgd29mZi5udW1fdGFibGVzID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIDQ0ICsgd29mZi5udW1fdGFibGVzICogMjBVTCA+PSB3b2ZmLmxlbmd0aCAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAxMiArIHdvZmYubnVtX3RhYmxlcyAqIDE2VUwgPj0gd29mZi50b3RhbFNmbnRTaXplICAgICAgICB8fAotICAgICAgICAgKCB3b2ZmLnRvdGFsU2ZudFNpemUgJiAzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICggd29mZi5tZXRhT2Zmc2V0ID09IDAgJiYgKCB3b2ZmLm1ldGFMZW5ndGggIT0gMCAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b2ZmLm1ldGFPcmlnTGVuZ3RoICE9IDAgKSApIHx8Ci0gICAgICAgICAoIHdvZmYubWV0YUxlbmd0aCAhPSAwICYmIHdvZmYubWV0YU9yaWdMZW5ndGggPT0gMCApICAgICB8fAotICAgICAgICAgKCB3b2ZmLnByaXZPZmZzZXQgPT0gMCAmJiB3b2ZmLnByaXZMZW5ndGggIT0gMCApICAgICAgICAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIndvZmZfZm9udF9vcGVuOiBpbnZhbGlkIFdPRkYgaGVhZGVyXG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgfQotCi0gICAgLyogRG9uJ3QgdHJ1c3QgYHRvdGFsU2ZudFNpemUnIGJlZm9yZSB0aG9yb3VnaCBjaGVja3MuICovCi0gICAgaWYgKCBGVF9BTExPQyggc2ZudCwgMTIgKyB3b2ZmLm51bV90YWJsZXMgKiAxNlVMICkgfHwKLSAgICAgICAgIEZUX05FVyggc2ZudF9zdHJlYW0gKSAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzZm50X2hlYWRlciA9IHNmbnQ7Ci0KLSAgICAvKiBXcml0ZSBzZm50IGhlYWRlci4gKi8KLSAgICB7Ci0gICAgICBGVF9VSW50ICBzZWFyY2hSYW5nZSwgZW50cnlTZWxlY3RvciwgcmFuZ2VTaGlmdCwgeDsKLQotCi0gICAgICB4ICAgICAgICAgICAgID0gd29mZi5udW1fdGFibGVzOwotICAgICAgZW50cnlTZWxlY3RvciA9IDA7Ci0gICAgICB3aGlsZSAoIHggKQotICAgICAgewotICAgICAgICB4ICAgICAgICAgICAgPj49IDE7Ci0gICAgICAgIGVudHJ5U2VsZWN0b3IgKz0gMTsKLSAgICAgIH0KLSAgICAgIGVudHJ5U2VsZWN0b3ItLTsKLQotICAgICAgc2VhcmNoUmFuZ2UgPSAoIDEgPDwgZW50cnlTZWxlY3RvciApICogMTY7Ci0gICAgICByYW5nZVNoaWZ0ICA9IHdvZmYubnVtX3RhYmxlcyAqIDE2IC0gc2VhcmNoUmFuZ2U7Ci0KLSAgICAgIFdSSVRFX1VMT05HICggc2ZudF9oZWFkZXIsIHdvZmYuZmxhdm9yICk7Ci0gICAgICBXUklURV9VU0hPUlQoIHNmbnRfaGVhZGVyLCB3b2ZmLm51bV90YWJsZXMgKTsKLSAgICAgIFdSSVRFX1VTSE9SVCggc2ZudF9oZWFkZXIsIHNlYXJjaFJhbmdlICk7Ci0gICAgICBXUklURV9VU0hPUlQoIHNmbnRfaGVhZGVyLCBlbnRyeVNlbGVjdG9yICk7Ci0gICAgICBXUklURV9VU0hPUlQoIHNmbnRfaGVhZGVyLCByYW5nZVNoaWZ0ICk7Ci0gICAgfQotCi0gICAgLyogV2hpbGUgdGhlIGVudHJpZXMgaW4gdGhlIHNmbnQgaGVhZGVyIG11c3QgYmUgc29ydGVkIGJ5IHRoZSAqLwotICAgIC8qIHRhZyB2YWx1ZSwgdGhlIHRhYmxlcyB0aGVtc2VsdmVzIGFyZSBub3QuICBXZSB0aHVzIGhhdmUgdG8gKi8KLSAgICAvKiBzb3J0IHRoZW0gYnkgb2Zmc2V0IGFuZCBjaGVjayB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcmxhcC4gICAgICovCi0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggdGFibGVzLCB3b2ZmLm51bV90YWJsZXMgKSAgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggaW5kaWNlcywgd29mZi5udW1fdGFibGVzICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfVFJBQ0UyKCggIlxuIgotICAgICAgICAgICAgICAgICIgIHRhZyAgICBvZmZzZXQgICAgY29tcExlbiAgb3JpZ0xlbiAgY2hlY2tzdW1cbiIKLSAgICAgICAgICAgICAgICAiICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICkpOwotCi0gICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggMjBMICogd29mZi5udW1fdGFibGVzICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IHdvZmYubnVtX3RhYmxlczsgbm4rKyApCi0gICAgewotICAgICAgV09GRl9UYWJsZSAgdGFibGUgPSB0YWJsZXMgKyBubjsKLQotICAgICAgdGFibGUtPlRhZyAgICAgICAgPSBGVF9HRVRfVEFHNCgpOwotICAgICAgdGFibGUtPk9mZnNldCAgICAgPSBGVF9HRVRfVUxPTkcoKTsKLSAgICAgIHRhYmxlLT5Db21wTGVuZ3RoID0gRlRfR0VUX1VMT05HKCk7Ci0gICAgICB0YWJsZS0+T3JpZ0xlbmd0aCA9IEZUX0dFVF9VTE9ORygpOwotICAgICAgdGFibGUtPkNoZWNrU3VtICAgPSBGVF9HRVRfVUxPTkcoKTsKLQotICAgICAgRlRfVFJBQ0UyKCggIiAgJWMlYyVjJWMgICUwOGx4ICAlMDhseCAgJTA4bHggICUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWJsZS0+VGFnID4+IDI0ICksCi0gICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhYmxlLT5UYWcgPj4gMTYgKSwKLSAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUtPlRhZyA+PiA4ICApLAotICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWJsZS0+VGFnICAgICAgICksCi0gICAgICAgICAgICAgICAgICB0YWJsZS0+T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgdGFibGUtPkNvbXBMZW5ndGgsCi0gICAgICAgICAgICAgICAgICB0YWJsZS0+T3JpZ0xlbmd0aCwKLSAgICAgICAgICAgICAgICAgIHRhYmxlLT5DaGVja1N1bSApKTsKLQotICAgICAgaWYgKCB0YWJsZS0+VGFnIDw9IG9sZF90YWcgKQotICAgICAgewotICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAgICAgRlRfRVJST1IoKCAid29mZl9mb250X29wZW46IHRhYmxlIHRhZ3MgYXJlIG5vdCBzb3J0ZWRcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBvbGRfdGFnICAgICA9IHRhYmxlLT5UYWc7Ci0gICAgICBpbmRpY2VzW25uXSA9IHRhYmxlOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIC8qIFNvcnQgYnkgb2Zmc2V0LiAqLwotCi0gICAgZnRfcXNvcnQoIGluZGljZXMsCi0gICAgICAgICAgICAgIHdvZmYubnVtX3RhYmxlcywKLSAgICAgICAgICAgICAgc2l6ZW9mICggV09GRl9UYWJsZSApLAotICAgICAgICAgICAgICBjb21wYXJlX29mZnNldHMgKTsKLQotICAgIC8qIENoZWNrIG9mZnNldHMgYW5kIGxlbmd0aHMuICovCi0KLSAgICB3b2ZmX29mZnNldCA9IDQ0ICsgd29mZi5udW1fdGFibGVzICogMjBMOwotICAgIHNmbnRfb2Zmc2V0ID0gMTIgKyB3b2ZmLm51bV90YWJsZXMgKiAxNkw7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgd29mZi5udW1fdGFibGVzOyBubisrICkKLSAgICB7Ci0gICAgICBXT0ZGX1RhYmxlICB0YWJsZSA9IGluZGljZXNbbm5dOwotCi0KLSAgICAgIGlmICggdGFibGUtPk9mZnNldCAhPSB3b2ZmX29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICB0YWJsZS0+Q29tcExlbmd0aCA+IHdvZmYubGVuZ3RoICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHRhYmxlLT5PZmZzZXQgPiB3b2ZmLmxlbmd0aCAtIHRhYmxlLT5Db21wTGVuZ3RoICAgICAgfHwKLSAgICAgICAgICAgdGFibGUtPk9yaWdMZW5ndGggPiB3b2ZmLnRvdGFsU2ZudFNpemUgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBzZm50X29mZnNldCA+IHdvZmYudG90YWxTZm50U2l6ZSAtIHRhYmxlLT5PcmlnTGVuZ3RoIHx8Ci0gICAgICAgICAgIHRhYmxlLT5Db21wTGVuZ3RoID4gdGFibGUtPk9yaWdMZW5ndGggICAgICAgICAgICAgICAgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ3b2ZmX2ZvbnRfb3BlbjogaW52YWxpZCB0YWJsZSBvZmZzZXRzXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgdGFibGUtPk9yaWdPZmZzZXQgPSBzZm50X29mZnNldDsKLQotICAgICAgLyogVGhlIG9mZnNldHMgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNC4gKi8KLSAgICAgIHdvZmZfb2Zmc2V0ICs9ICggdGFibGUtPkNvbXBMZW5ndGggKyAzICkgJiB+M1U7Ci0gICAgICBzZm50X29mZnNldCArPSAoIHRhYmxlLT5PcmlnTGVuZ3RoICsgMyApICYgfjNVOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRmluYWwgY2hlY2tzIQotICAgICAqCi0gICAgICogV2UgZG9uJ3QgZGVjb2RlIGFuZCBjaGVjayB0aGUgbWV0YWRhdGEgYmxvY2suCi0gICAgICogV2UgZG9uJ3QgY2hlY2sgdGFibGUgY2hlY2tzdW1zIGVpdGhlci4KLSAgICAgKiBCdXQgb3RoZXIgdGhhbiB0aG9zZSwgSSB0aGluayB3ZSBpbXBsZW1lbnQgYWxsCi0gICAgICogYE1VU1QnIGNoZWNrcyBmcm9tIHRoZSBzcGVjLgotICAgICAqLwotCi0gICAgaWYgKCB3b2ZmLm1ldGFPZmZzZXQgKQotICAgIHsKLSAgICAgIGlmICggd29mZi5tZXRhT2Zmc2V0ICE9IHdvZmZfb2Zmc2V0ICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgd29mZi5tZXRhT2Zmc2V0ICsgd29mZi5tZXRhTGVuZ3RoID4gd29mZi5sZW5ndGggKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ3b2ZmX2ZvbnRfb3BlbjoiCi0gICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGBtZXRhZGF0YScgb2Zmc2V0IG9yIGxlbmd0aFxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFdlIGhhdmUgcGFkZGluZyBvbmx5IC4uLiAqLwotICAgICAgd29mZl9vZmZzZXQgKz0gd29mZi5tZXRhTGVuZ3RoOwotICAgIH0KLQotICAgIGlmICggd29mZi5wcml2T2Zmc2V0ICkKLSAgICB7Ci0gICAgICAvKiAuLi4gaWYgaXQgaXNuJ3QgdGhlIGxhc3QgYmxvY2suICovCi0gICAgICB3b2ZmX29mZnNldCA9ICggd29mZl9vZmZzZXQgKyAzICkgJiB+M1U7Ci0KLSAgICAgIGlmICggd29mZi5wcml2T2Zmc2V0ICE9IHdvZmZfb2Zmc2V0ICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgd29mZi5wcml2T2Zmc2V0ICsgd29mZi5wcml2TGVuZ3RoID4gd29mZi5sZW5ndGggKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ3b2ZmX2ZvbnRfb3BlbjogaW52YWxpZCBgcHJpdmF0ZScgb2Zmc2V0IG9yIGxlbmd0aFxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vIHBhZGRpbmcgZm9yIHRoZSBsYXN0IGJsb2NrLiAqLwotICAgICAgd29mZl9vZmZzZXQgKz0gd29mZi5wcml2TGVuZ3RoOwotICAgIH0KLQotICAgIGlmICggc2ZudF9vZmZzZXQgIT0gd29mZi50b3RhbFNmbnRTaXplIHx8Ci0gICAgICAgICB3b2ZmX29mZnNldCAhPSB3b2ZmLmxlbmd0aCAgICAgICAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIndvZmZfZm9udF9vcGVuOiBpbnZhbGlkIGBzZm50JyB0YWJsZSBzdHJ1Y3R1cmVcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogTm93IHVzZSBgdG90YWxTZm50U2l6ZScuICovCi0gICAgaWYgKCBGVF9SRUFMTE9DKCBzZm50LAotICAgICAgICAgICAgICAgICAgICAgMTIgKyB3b2ZmLm51bV90YWJsZXMgKiAxNlVMLAotICAgICAgICAgICAgICAgICAgICAgd29mZi50b3RhbFNmbnRTaXplICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2ZudF9oZWFkZXIgPSBzZm50ICsgMTI7Ci0KLSAgICAvKiBXcml0ZSB0aGUgdGFibGVzLiAqLwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IHdvZmYubnVtX3RhYmxlczsgbm4rKyApCi0gICAgewotICAgICAgV09GRl9UYWJsZSAgdGFibGUgPSB0YWJsZXMgKyBubjsKLQotCi0gICAgICAvKiBXcml0ZSBTRk5UIHRhYmxlIGVudHJ5LiAqLwotICAgICAgV1JJVEVfVUxPTkcoIHNmbnRfaGVhZGVyLCB0YWJsZS0+VGFnICk7Ci0gICAgICBXUklURV9VTE9ORyggc2ZudF9oZWFkZXIsIHRhYmxlLT5DaGVja1N1bSApOwotICAgICAgV1JJVEVfVUxPTkcoIHNmbnRfaGVhZGVyLCB0YWJsZS0+T3JpZ09mZnNldCApOwotICAgICAgV1JJVEVfVUxPTkcoIHNmbnRfaGVhZGVyLCB0YWJsZS0+T3JpZ0xlbmd0aCApOwotCi0gICAgICAvKiBXcml0ZSB0YWJsZSBkYXRhLiAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggdGFibGUtPk9mZnNldCApICAgICB8fAotICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggdGFibGUtPkNvbXBMZW5ndGggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCB0YWJsZS0+Q29tcExlbmd0aCA9PSB0YWJsZS0+T3JpZ0xlbmd0aCApCi0gICAgICB7Ci0gICAgICAgIC8qIFVuY29tcHJlc3NlZCBkYXRhOyBqdXN0IGNvcHkuICovCi0gICAgICAgIGZ0X21lbWNweSggc2ZudCArIHRhYmxlLT5PcmlnT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y3Vyc29yLAotICAgICAgICAgICAgICAgICAgIHRhYmxlLT5PcmlnTGVuZ3RoICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQgotCi0gICAgICAgIC8qIFVuY29tcHJlc3Mgd2l0aCB6bGliLiAqLwotICAgICAgICBGVF9VTG9uZyAgb3V0cHV0X2xlbiA9IHRhYmxlLT5PcmlnTGVuZ3RoOwotCi0KLSAgICAgICAgZXJyb3IgPSBGVF9HemlwX1VuY29tcHJlc3MoIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnQgKyB0YWJsZS0+T3JpZ09mZnNldCwgJm91dHB1dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmN1cnNvciwgdGFibGUtPkNvbXBMZW5ndGggKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBpZiAoIG91dHB1dF9sZW4gIT0gdGFibGUtPk9yaWdMZW5ndGggKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAid29mZl9mb250X29wZW46IGNvbXByZXNzZWQgdGFibGUgbGVuZ3RoIG1pc21hdGNoXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgKi8KLQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICAgICAgZ290byBFeGl0OwotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgKi8KLSAgICAgIH0KLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgICAvKiBXZSBkb24ndCBjaGVjayB3aGV0aGVyIHRoZSBwYWRkaW5nIGJ5dGVzIGluIHRoZSBXT0ZGIGZpbGUgYXJlICAgICAqLwotICAgICAgLyogYWN0dWFsbHkgJ1wwJy4gIEZvciB0aGUgb3V0cHV0LCBob3dldmVyLCB3ZSBkbyBzZXQgdGhlbSBwcm9wZXJseS4gKi8KLSAgICAgIHNmbnRfb2Zmc2V0ID0gdGFibGUtPk9yaWdPZmZzZXQgKyB0YWJsZS0+T3JpZ0xlbmd0aDsKLSAgICAgIHdoaWxlICggc2ZudF9vZmZzZXQgJiAzICkKLSAgICAgIHsKLSAgICAgICAgc2ZudFtzZm50X29mZnNldF0gPSAnXDAnOwotICAgICAgICBzZm50X29mZnNldCsrOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIE9rISAgRmluYWxseSByZWFkeS4gIFN3YXAgb3V0IHN0cmVhbSBhbmQgcmV0dXJuLiAqLwotICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzZm50X3N0cmVhbSwgc2ZudCwgd29mZi50b3RhbFNmbnRTaXplICk7Ci0gICAgc2ZudF9zdHJlYW0tPm1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIHNmbnRfc3RyZWFtLT5jbG9zZSAgPSBzZm50X3N0cmVhbV9jbG9zZTsKLQotICAgIEZUX1N0cmVhbV9GcmVlKAotICAgICAgZmFjZS0+cm9vdC5zdHJlYW0sCi0gICAgICAoIGZhY2UtPnJvb3QuZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gKSAhPSAwICk7Ci0KLSAgICBmYWNlLT5yb290LnN0cmVhbSA9IHNmbnRfc3RyZWFtOwotCi0gICAgZmFjZS0+cm9vdC5mYWNlX2ZsYWdzICY9IH5GVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNOwotCi0gIEV4aXQ6Ci0gICAgRlRfRlJFRSggdGFibGVzICk7Ci0gICAgRlRfRlJFRSggaW5kaWNlcyApOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfRlJFRSggc2ZudCApOwotICAgICAgRlRfU3RyZWFtX0Nsb3NlKCBzZm50X3N0cmVhbSApOwotICAgICAgRlRfRlJFRSggc2ZudF9zdHJlYW0gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jdW5kZWYgV1JJVEVfVVNIT1JUCi0jdW5kZWYgV1JJVEVfVUxPTkcKLQotCi0gIC8qIEZpbGwgaW4gZmFjZS0+dHRjX2hlYWRlci4gIElmIHRoZSBmb250IGlzIG5vdCBhIFRUQywgaXQgaXMgKi8KLSAgLyogc3ludGhlc2l6ZWQgaW50byBhIFRUQyB3aXRoIG9uZSBvZmZzZXQgdGFibGUuICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgc2ZudF9vcGVuX2ZvbnQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICBmYWNlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgIHRhZywgb2Zmc2V0OwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICB0dGNfaGVhZGVyX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUQ19IZWFkZXJSZWMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDggKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyggdmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9MT05HKCBjb3VudCAgICksICAvKiB0aGlzIGlzIFVMb25nIGluIHRoZSBzcGVjcyAqLwotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgZmFjZS0+dHRjX2hlYWRlci50YWcgICAgID0gMDsKLSAgICBmYWNlLT50dGNfaGVhZGVyLnZlcnNpb24gPSAwOwotICAgIGZhY2UtPnR0Y19oZWFkZXIuY291bnQgICA9IDA7Ci0KLSAgcmV0cnk6Ci0gICAgb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HKCB0YWcgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBpZiAoIHRhZyA9PSBUVEFHX3dPRkYgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJzZm50X29wZW5fZm9udDogZmlsZSBpcyBhIFdPRkY7IHN5bnRoZXNpemluZyBTRk5UXG4iICkpOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgZXJyb3IgPSB3b2ZmX29wZW5fZm9udCggc3RyZWFtLCBmYWNlICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAvKiBTd2FwIG91dCBzdHJlYW0gYW5kIHJldHJ5ISAqLwotICAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgICBnb3RvIHJldHJ5OwotICAgIH0KLQotICAgIGlmICggdGFnICE9IDB4MDAwMTAwMDBVTCAmJgotICAgICAgICAgdGFnICE9IFRUQUdfdHRjZiAgICAmJgotICAgICAgICAgdGFnICE9IFRUQUdfT1RUTyAgICAmJgotICAgICAgICAgdGFnICE9IFRUQUdfdHJ1ZSAgICAmJgotICAgICAgICAgdGFnICE9IFRUQUdfdHlwMSAgICAmJgotICAgICAgICAgdGFnICE9IDB4MDAwMjAwMDBVTCApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgZm9udCB1c2luZyB0aGUgU0ZOVCBjb250YWluZXIgZm9ybWF0XG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gICAgZmFjZS0+dHRjX2hlYWRlci50YWcgPSBUVEFHX3R0Y2Y7Ci0KLSAgICBpZiAoIHRhZyA9PSBUVEFHX3R0Y2YgKQotICAgIHsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICBGVF9UUkFDRTMoKCAic2ZudF9vcGVuX2ZvbnQ6IGZpbGUgaXMgYSBjb2xsZWN0aW9uXG4iICkpOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggdHRjX2hlYWRlcl9maWVsZHMsICZmYWNlLT50dGNfaGVhZGVyICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIEZUX1RSQUNFMygoICIgICAgICAgICAgICAgICAgd2l0aCAlbGQgc3ViZm9udHNcbiIsCi0gICAgICAgICAgICAgICAgICBmYWNlLT50dGNfaGVhZGVyLmNvdW50ICkpOwotCi0gICAgICBpZiAoIGZhY2UtPnR0Y19oZWFkZXIuY291bnQgPT0gMCApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotCi0gICAgICAvKiBhIHJvdWdoIHNpemUgZXN0aW1hdGU6IGxldCdzIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGF0IHRoZXJlICAgKi8KLSAgICAgIC8qIGlzIGp1c3QgYSBzaW5nbGUgdGFibGUgaW5mbyBpbiBlYWNoIHN1YmZvbnQgaGVhZGVyICgxMiArIDE2KjEgPSAqLwotICAgICAgLyogMjggYnl0ZXMpLCB0aHVzIHdlIGhhdmUgKGF0IGxlYXN0KSBgMTIgKyA0KmNvdW50JyBieXRlcyBmb3IgdGhlICovCi0gICAgICAvKiBzaXplIG9mIHRoZSBUVEMgaGVhZGVyIHBsdXMgYDI4KmNvdW50JyBieXRlcyBmb3IgYWxsIHN1YmZvbnQgICAgKi8KLSAgICAgIC8qIGhlYWRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCAoRlRfVUxvbmcpZmFjZS0+dHRjX2hlYWRlci5jb3VudCA+IHN0cmVhbS0+c2l6ZSAvICggMjggKyA0ICkgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotCi0gICAgICAvKiBub3cgcmVhZCB0aGUgb2Zmc2V0cyBvZiBlYWNoIGZvbnQgaW4gdGhlIGZpbGUgKi8KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBmYWNlLT50dGNfaGVhZGVyLm9mZnNldHMsIGZhY2UtPnR0Y19oZWFkZXIuY291bnQgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggZmFjZS0+dHRjX2hlYWRlci5jb3VudCAqIDRMICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgZmFjZS0+dHRjX2hlYWRlci5jb3VudDsgbisrICkKLSAgICAgICAgZmFjZS0+dHRjX2hlYWRlci5vZmZzZXRzW25dID0gRlRfR0VUX1VMT05HKCk7Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1RSQUNFMygoICJzZm50X29wZW5fZm9udDogc3ludGhlc2l6ZSBUVENcbiIgKSk7Ci0KLSAgICAgIGZhY2UtPnR0Y19oZWFkZXIudmVyc2lvbiA9IDEgPDwgMTY7Ci0gICAgICBmYWNlLT50dGNfaGVhZGVyLmNvdW50ICAgPSAxOwotCi0gICAgICBpZiAoIEZUX05FVyggZmFjZS0+dHRjX2hlYWRlci5vZmZzZXRzICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGZhY2UtPnR0Y19oZWFkZXIub2Zmc2V0c1swXSA9IG9mZnNldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBzZm50X2luaXRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5zdGFuY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfTGlicmFyeSAgICBsaWJyYXJ5ID0gZmFjZS0+cm9vdC5kcml2ZXItPnJvb3QubGlicmFyeTsKLSAgICBTRk5UX1NlcnZpY2UgIHNmbnQ7Ci0gICAgRlRfSW50ICAgICAgICBmYWNlX2luZGV4OwotCi0KLSAgICAvKiBmb3Igbm93LCBwYXJhbWV0ZXJzIGFyZSB1bnVzZWQgKi8KLSAgICBGVF9VTlVTRUQoIG51bV9wYXJhbXMgKTsKLSAgICBGVF9VTlVTRUQoIHBhcmFtcyApOwotCi0KLSAgICBzZm50ID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotICAgIGlmICggIXNmbnQgKQotICAgIHsKLSAgICAgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKUZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKCBsaWJyYXJ5LCAic2ZudCIgKTsKLSAgICAgIGlmICggIXNmbnQgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJzZm50X2luaXRfZmFjZTogY2Fubm90IGFjY2VzcyBgc2ZudCcgbW9kdWxlXG4iICkpOwotICAgICAgICByZXR1cm4gRlRfVEhST1coIE1pc3NpbmdfTW9kdWxlICk7Ci0gICAgICB9Ci0KLSAgICAgIGZhY2UtPnNmbnQgICAgICAgPSBzZm50OwotICAgICAgZmFjZS0+Z290b190YWJsZSA9IHNmbnQtPmdvdG9fdGFibGU7Ci0gICAgfQotCi0gICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBmYWNlLT5wc25hbWVzLCBQT1NUU0NSSVBUX0NNQVBTICk7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgaWYgKCAhZmFjZS0+bW0gKQotICAgIHsKLSAgICAgIC8qIHdlIHdhbnQgdGhlIE1NIGludGVyZmFjZSBmcm9tIHRoZSBgdHJ1ZXR5cGUnIG1vZHVsZSBvbmx5ICovCi0gICAgICBGVF9Nb2R1bGUgIHR0X21vZHVsZSA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJ0cnVldHlwZSIgKTsKLQotCi0gICAgICBmYWNlLT5tbSA9IGZ0X21vZHVsZV9nZXRfc2VydmljZSggdHRfbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0gICAgfQotCi0gICAgaWYgKCAhZmFjZS0+dmFyICkKLSAgICB7Ci0gICAgICAvKiB3ZSB3YW50IHRoZSBtZXRyaWNzIHZhcmlhdGlvbnMgaW50ZXJmYWNlICovCi0gICAgICAvKiBmcm9tIHRoZSBgdHJ1ZXR5cGUnIG1vZHVsZSBvbmx5ICAgICAgICAgICovCi0gICAgICBGVF9Nb2R1bGUgIHR0X21vZHVsZSA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJ0cnVldHlwZSIgKTsKLQotCi0gICAgICBmYWNlLT52YXIgPSBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIHR0X21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU0VSVklDRV9JRF9NRVRSSUNTX1ZBUklBVElPTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIEZUX1RSQUNFMigoICJTRk5UIGRyaXZlclxuIiApKTsKLQotICAgIGVycm9yID0gc2ZudF9vcGVuX2ZvbnQoIHN0cmVhbSwgZmFjZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogU3RyZWFtIG1heSBoYXZlIGNoYW5nZWQgaW4gc2ZudF9vcGVuX2ZvbnQuICovCi0gICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0KLSAgICBGVF9UUkFDRTIoKCAic2ZudF9pbml0X2ZhY2U6ICUwOHAsICVkXG4iLCBmYWNlLCBmYWNlX2luc3RhbmNlX2luZGV4ICkpOwotCi0gICAgZmFjZV9pbmRleCA9IEZUX0FCUyggZmFjZV9pbnN0YW5jZV9pbmRleCApICYgMHhGRkZGOwotCi0gICAgLyogdmFsdWUgLShOKzEpIHJlcXVlc3RzIGluZm9ybWF0aW9uIG9uIGluZGV4IE4gKi8KLSAgICBpZiAoIGZhY2VfaW5zdGFuY2VfaW5kZXggPCAwICkKLSAgICAgIGZhY2VfaW5kZXgtLTsKLQotICAgIGlmICggZmFjZV9pbmRleCA+PSBmYWNlLT50dGNfaGVhZGVyLmNvdW50ICkKLSAgICB7Ci0gICAgICBpZiAoIGZhY2VfaW5zdGFuY2VfaW5kZXggPj0gMCApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZWxzZQotICAgICAgICBmYWNlX2luZGV4ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBmYWNlLT50dGNfaGVhZGVyLm9mZnNldHNbZmFjZV9pbmRleF0gKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSB2YWxpZCBUcnVlVHlwZSBmaWxlICovCi0gICAgZXJyb3IgPSBzZm50LT5sb2FkX2ZvbnRfZGlyKCBmYWNlLCBzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotCi0gICAgICBGVF9VTG9uZyAgZnZhcl9sZW47Ci0KLSAgICAgIEZUX1VMb25nICB2ZXJzaW9uOwotICAgICAgRlRfVUxvbmcgIG9mZnNldDsKLQotICAgICAgRlRfVVNob3J0ICBudW1fYXhlczsKLSAgICAgIEZUX1VTaG9ydCAgYXhpc19zaXplOwotICAgICAgRlRfVVNob3J0ICBudW1faW5zdGFuY2VzOwotICAgICAgRlRfVVNob3J0ICBpbnN0YW5jZV9zaXplOwotCi0gICAgICBGVF9JbnQgIGluc3RhbmNlX2luZGV4OwotCi0gICAgICBGVF9CeXRlKiAgZGVmYXVsdF92YWx1ZXMgID0gTlVMTDsKLSAgICAgIEZUX0J5dGUqICBpbnN0YW5jZV92YWx1ZXMgPSBOVUxMOwotCi0KLSAgICAgIGZhY2UtPmlzX2RlZmF1bHRfaW5zdGFuY2UgPSAxOwotCi0gICAgICBpbnN0YW5jZV9pbmRleCA9IEZUX0FCUyggZmFjZV9pbnN0YW5jZV9pbmRleCApID4+IDE2OwotCi0gICAgICAvKiB0ZXN0IHdoZXRoZXIgY3VycmVudCBmYWNlIGlzIGEgR1ggZm9udCB3aXRoIG5hbWVkIGluc3RhbmNlcyAqLwotICAgICAgaWYgKCBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2Z2YXIsIHN0cmVhbSwgJmZ2YXJfbGVuICkgfHwKLSAgICAgICAgICAgZnZhcl9sZW4gPCAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVUxPTkcoIHZlcnNpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggb2Zmc2V0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfU1RSRUFNX1NLSVAoIDIgKSAvKiByZXNlcnZlZCAqLyAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBudW1fYXhlcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggYXhpc19zaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfUkVBRF9VU0hPUlQoIG51bV9pbnN0YW5jZXMgKSAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBpbnN0YW5jZV9zaXplICkgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICB7Ci0gICAgICAgIHZlcnNpb24gICAgICAgPSAwOwotICAgICAgICBvZmZzZXQgICAgICAgID0gMDsKLSAgICAgICAgbnVtX2F4ZXMgICAgICA9IDA7Ci0gICAgICAgIGF4aXNfc2l6ZSAgICAgPSAwOwotICAgICAgICBudW1faW5zdGFuY2VzID0gMDsKLSAgICAgICAgaW5zdGFuY2Vfc2l6ZSA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGRhdGEgaXMgYm91bmQgYnkgdGhlIHRhYmxlIGxlbmd0aCAqLwotICAgICAgaWYgKCB2ZXJzaW9uICE9IDB4MDAwMTAwMDBVTCAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgYXhpc19zaXplICE9IDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIG51bV9heGVzID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAvKiBgbnVtX2F4ZXMnIGxpbWl0IGltcGxpZWQgYnkgMTYtYml0IGBpbnN0YW5jZV9zaXplJyAqLwotICAgICAgICAgICBudW1fYXhlcyA+IDB4M0ZGRSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgISggaW5zdGFuY2Vfc2l6ZSA9PSA0ICsgNCAqIG51bV9heGVzIHx8Ci0gICAgICAgICAgICAgIGluc3RhbmNlX3NpemUgPT0gNiArIDQgKiBudW1fYXhlcyApICAgICB8fAotICAgICAgICAgICAvKiBgbnVtX2luc3RhbmNlcycgbGltaXQgaW1wbGllZCBieSBsaW1pdGVkIHJhbmdlIG9mIG5hbWUgSURzICovCi0gICAgICAgICAgIG51bV9pbnN0YW5jZXMgPiAweDdFRkYgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICBheGlzX3NpemUgKiBudW1fYXhlcyAgICAgICAgICArCi0gICAgICAgICAgICAgaW5zdGFuY2Vfc2l6ZSAqIG51bV9pbnN0YW5jZXMgPiBmdmFyX2xlbiApCi0gICAgICAgIG51bV9pbnN0YW5jZXMgPSAwOwotICAgICAgZWxzZQotICAgICAgICBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCB8PSBUVF9GQUNFX0ZMQUdfVkFSX0ZWQVI7Ci0KLSAgICAgIC8qCi0gICAgICAgKiAgQXMgZG9jdW1lbnRlZCBpbiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiwgYW4gZW50cnkgZm9yIHRoZQotICAgICAgICogIGRlZmF1bHQgaW5zdGFuY2UgbWF5IGJlIG9taXR0ZWQgaW4gdGhlIG5hbWVkIGluc3RhbmNlIHRhYmxlLiAgSW4KLSAgICAgICAqICBwYXJ0aWN1bGFyIHRoaXMgbWVhbnMgdGhhdCBldmVuIGlmIHRoZXJlIGlzIG5vIG5hbWVkIGluc3RhbmNlCi0gICAgICAgKiAgdGFibGUgaW4gdGhlIGZvbnQgd2UgYWN0dWFsbHkgZG8gaGF2ZSBhIG5hbWVkIGluc3RhbmNlLCBuYW1lbHkgdGhlCi0gICAgICAgKiAgZGVmYXVsdCBpbnN0YW5jZS4KLSAgICAgICAqCi0gICAgICAgKiAgRm9yIGNvbnNpc3RlbmN5LCB3ZSBhbHdheXMgd2FudCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpbiBvdXIgbGlzdAotICAgICAgICogIG9mIG5hbWVkIGluc3RhbmNlcy4gIElmIGl0IGlzIG1pc3NpbmcsIHdlIHRyeSB0byBzeW50aGVzaXplIGl0Ci0gICAgICAgKiAgbGF0ZXIgb24uICBIZXJlLCB3ZSBoYXZlIHRvIGFkanVzdCBgbnVtX2luc3RhbmNlcycgYWNjb3JkaW5nbHkuCi0gICAgICAgKi8KLQotICAgICAgaWYgKCAoIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9GVkFSICkgJiYKLSAgICAgICAgICAgISggRlRfQUxMT0MoIGRlZmF1bHRfdmFsdWVzLCBudW1fYXhlcyAqIDQgKSAgfHwKLSAgICAgICAgICAgICAgRlRfQUxMT0MoIGluc3RhbmNlX3ZhbHVlcywgbnVtX2F4ZXMgKiA0ICkgKSAgICAgICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIGlzIDE2IGJ5dGVzIGFmdGVyIHRoZSB0YWJsZSBzdGFydCAqLwotICAgICAgICBGVF9VTG9uZyAgYXJyYXlfc3RhcnQgPSBGVF9TVFJFQU1fUE9TKCkgLSAxNiArIG9mZnNldDsKLSAgICAgICAgRlRfVUxvbmcgIGRlZmF1bHRfdmFsdWVfb2Zmc2V0LCBpbnN0YW5jZV9vZmZzZXQ7Ci0KLSAgICAgICAgRlRfQnl0ZSogIHA7Ci0gICAgICAgIEZUX1VJbnQgICBpOwotCi0KLSAgICAgICAgZGVmYXVsdF92YWx1ZV9vZmZzZXQgPSBhcnJheV9zdGFydCArIDg7Ci0gICAgICAgIHAgICAgICAgICAgICAgICAgICAgID0gZGVmYXVsdF92YWx1ZXM7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fYXhlczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICh2b2lkKUZUX1NUUkVBTV9SRUFEX0FUKCBkZWZhdWx0X3ZhbHVlX29mZnNldCwgcCwgNCApOwotCi0gICAgICAgICAgZGVmYXVsdF92YWx1ZV9vZmZzZXQgKz0gYXhpc19zaXplOwotICAgICAgICAgIHAgICAgICAgICAgICAgICAgICAgICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnN0YW5jZV9vZmZzZXQgPSBhcnJheV9zdGFydCArIGF4aXNfc2l6ZSAqIG51bV9heGVzICsgNDsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9pbnN0YW5jZXM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAodm9pZClGVF9TVFJFQU1fUkVBRF9BVCggaW5zdGFuY2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9heGVzICogNCApOwotCi0gICAgICAgICAgaWYgKCAhZnRfbWVtY21wKCBkZWZhdWx0X3ZhbHVlcywgaW5zdGFuY2VfdmFsdWVzLCBudW1fYXhlcyAqIDQgKSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGluc3RhbmNlX29mZnNldCArPSBpbnN0YW5jZV9zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBpID09IG51bV9pbnN0YW5jZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogbm8gZGVmYXVsdCBpbnN0YW5jZSBpbiBuYW1lZCBpbnN0YW5jZSB0YWJsZTsgKi8KLSAgICAgICAgICAvKiB3ZSB0aHVzIGhhdmUgdG8gc3ludGhlc2l6ZSBpdCAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIG51bV9pbnN0YW5jZXMrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBGVF9GUkVFKCBkZWZhdWx0X3ZhbHVlcyApOwotICAgICAgRlRfRlJFRSggaW5zdGFuY2VfdmFsdWVzICk7Ci0KLSAgICAgIC8qIHdlIGRvbid0IHN1cHBvcnQgTXVsdGlwbGUgTWFzdGVyIENGRnMgeWV0OyAqLwotICAgICAgLyogbm90ZSB0aGF0IGBnbHlmJyBvciBgQ0ZGMicgaGF2ZSBwcmVjZWRlbmNlICovCi0gICAgICBpZiAoIGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZ2x5Ziwgc3RyZWFtLCAwICkgJiYKLSAgICAgICAgICAgZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19DRkYyLCBzdHJlYW0sIDAgKSAmJgotICAgICAgICAgICAhZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19DRkYsIHN0cmVhbSwgMCApICkKLSAgICAgICAgbnVtX2luc3RhbmNlcyA9IDA7Ci0KLSAgICAgIC8qIGluc3RhbmNlIGluZGljZXMgaW4gYGZhY2VfaW5zdGFuY2VfaW5kZXgnIHN0YXJ0IHdpdGggaW5kZXggMSwgKi8KLSAgICAgIC8qIHRodXMgYD4nIGFuZCBub3QgYD49JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggaW5zdGFuY2VfaW5kZXggPiBudW1faW5zdGFuY2VzICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBmYWNlX2luc3RhbmNlX2luZGV4ID49IDAgKQotICAgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbnVtX2luc3RhbmNlcyA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIGZhY2UtPnJvb3Quc3R5bGVfZmxhZ3MgPSAoRlRfTG9uZyludW1faW5zdGFuY2VzIDw8IDE2OwotICAgIH0KLSNlbmRpZgotCi0gICAgZmFjZS0+cm9vdC5udW1fZmFjZXMgID0gZmFjZS0+dHRjX2hlYWRlci5jb3VudDsKLSAgICBmYWNlLT5yb290LmZhY2VfaW5kZXggPSBmYWNlX2luc3RhbmNlX2luZGV4OwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2RlZmluZSBMT0FEXyggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMigoICJgIiAjeCAiJyAiICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMygoICItLT5cbiIgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVycm9yID0gc2ZudC0+bG9hZF8gIyMgeCggZmFjZSwgc3RyZWFtICk7ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMigoICIlc1xuIiwgKCAhZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgPyAibG9hZGVkIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9FUlJfRVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJtaXNzaW5nIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJmYWlsZWQgdG8gbG9hZCIgKSk7ICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMygoICJcbiIgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICggMCApCi0KLSNkZWZpbmUgTE9BRE1fKCB4LCB2ZXJ0aWNhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9UUkFDRTIoKCAiYCVzIiAjeCAiJyAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICB2ZXJ0aWNhbCA/ICJ2ZXJ0aWNhbCAiIDogIiIgKSk7ICAgICAgICAgICAgIFwKLSAgICBGVF9UUkFDRTMoKCAiLS0+XG4iICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlcnJvciA9IHNmbnQtPmxvYWRfICMjIHgoIGZhY2UsIHN0cmVhbSwgdmVydGljYWwgKTsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9UUkFDRTIoKCAiJXNcbiIsICggIWVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gImxvYWRlZCIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIDogRlRfRVJSX0VRKCBlcnJvciwgVGFibGVfTWlzc2luZyApIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyAibWlzc2luZyIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiZmFpbGVkIHRvIGxvYWQiICkpOyAgICAgICAgICAgIFwKLSAgICBGVF9UUkFDRTMoKCAiXG4iICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoIDAgKQotCi0jZGVmaW5lIEdFVF9OQU1FKCBpZCwgZmllbGQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSB0dF9mYWNlX2dldF9uYW1lKCBmYWNlLCBUVF9OQU1FX0lEXyAjIyBpZCwgZmllbGQgKTsgXAotICAgIGlmICggZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGdvdG8gRXhpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKCAwICkKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBzZm50X2xvYWRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5zdGFuY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0gICAgRlRfRXJyb3IgICAgICBwc25hbWVzX2Vycm9yOwotI2VuZGlmCi0gICAgRlRfQm9vbCAgICAgICBoYXNfb3V0bGluZTsKLSAgICBGVF9Cb29sICAgICAgIGlzX2FwcGxlX3NiaXQ7Ci0gICAgRlRfQm9vbCAgICAgICBpc19hcHBsZV9zYml4OwotICAgIEZUX0Jvb2wgICAgICAgaWdub3JlX3R5cG9ncmFwaGljX2ZhbWlseSAgICA9IEZBTFNFOwotICAgIEZUX0Jvb2wgICAgICAgaWdub3JlX3R5cG9ncmFwaGljX3N1YmZhbWlseSA9IEZBTFNFOwotCi0gICAgU0ZOVF9TZXJ2aWNlICBzZm50ID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotCi0gICAgRlRfVU5VU0VEKCBmYWNlX2luc3RhbmNlX2luZGV4ICk7Ci0KLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLQotICAgIHsKLSAgICAgIEZUX0ludCAgaTsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wYXJhbXM7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggcGFyYW1zW2ldLnRhZyA9PSBGVF9QQVJBTV9UQUdfSUdOT1JFX1RZUE9HUkFQSElDX0ZBTUlMWSApCi0gICAgICAgICAgaWdub3JlX3R5cG9ncmFwaGljX2ZhbWlseSA9IFRSVUU7Ci0gICAgICAgIGVsc2UgaWYgKCBwYXJhbXNbaV0udGFnID09IEZUX1BBUkFNX1RBR19JR05PUkVfVFlQT0dSQVBISUNfU1VCRkFNSUxZICkKLSAgICAgICAgICBpZ25vcmVfdHlwb2dyYXBoaWNfc3ViZmFtaWx5ID0gVFJVRTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBMb2FkIHRhYmxlcyAqLwotCi0gICAgLyogV2Ugbm93IHN1cHBvcnQgdHdvIFNGTlQtYmFzZWQgYml0bWFwcGVkIGZvbnQgZm9ybWF0cy4gIFRoZXkgKi8KLSAgICAvKiBhcmUgcmVjb2duaXplZCBlYXNpbHkgYXMgdGhleSBkbyBub3QgaW5jbHVkZSBhIGBnbHlmJyAgICAgICAqLwotICAgIC8qIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGUgZmlyc3QgZm9ybWF0IGNvbWVzIGZyb20gQXBwbGUsIGFuZCB1c2VzIGEgdGFibGUgbmFtZWQgICAqLwotICAgIC8qIGBiaGVkJyBpbnN0ZWFkIG9mIGBoZWFkJyB0byBzdG9yZSB0aGUgZm9udCBoZWFkZXIgKHVzaW5nICAgICovCi0gICAgLyogdGhlIHNhbWUgZm9ybWF0KS4gIEl0IGFsc28gZG9lc24ndCBpbmNsdWRlIGhvcml6b250YWwgYW5kICAgKi8KLSAgICAvKiB2ZXJ0aWNhbCBtZXRyaWNzIHRhYmxlcyAoaS5lLiBgaGhlYScgYW5kIGB2aGVhJyB0YWJsZXMgYXJlICAqLwotICAgIC8qIG1pc3NpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGUgb3RoZXIgZm9ybWF0IGNvbWVzIGZyb20gTWljcm9zb2Z0LCBhbmQgaXMgdXNlZCB3aXRoICAgICAqLwotICAgIC8qIFdpbkNFL1BvY2tldFBDLiAgSXQgbG9va3MgbGlrZSBhIHN0YW5kYXJkIFRURiwgZXhjZXB0IHRoYXQgICovCi0gICAgLyogaXQgZG9lc24ndCBjb250YWluIG91dGxpbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfVFJBQ0UyKCggInNmbnRfbG9hZF9mYWNlOiAlMDhwXG5cbiIsIGZhY2UgKSk7Ci0KLSAgICAvKiBkbyB3ZSBoYXZlIG91dGxpbmVzIGluIHRoZXJlPyAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBoYXNfb3V0bGluZSA9IEZUX0JPT0woIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfZ2x5ZiApICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSggZmFjZSwgVFRBR19DRkYgKSAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCBUVEFHX0NGRjIgKSAgICApOwotI2Vsc2UKLSAgICBoYXNfb3V0bGluZSA9IEZUX0JPT0woIHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCBUVEFHX2dseWYgKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfQ0ZGICkgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSggZmFjZSwgVFRBR19DRkYyICkgKTsKLSNlbmRpZgotCi0gICAgaXNfYXBwbGVfc2JpdCA9IDA7Ci0gICAgaXNfYXBwbGVfc2JpeCA9ICFmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX3NiaXgsIHN0cmVhbSwgMCApOwotCi0gICAgLyogQXBwbGUgJ3NiaXgnIGNvbG9yIGJpdG1hcHMgYXJlIHJlbmRlcmVkIHNjYWxlZCBhbmQgdGhlbiB0aGUgJ2dseWYnCi0gICAgICogb3V0bGluZSByZW5kZXJlZCBvbiB0b3AuICBXZSBkb24ndCBzdXBwb3J0IHRoYXQgeWV0LCBzbyBqdXN0IGlnbm9yZQotICAgICAqIHRoZSAnZ2x5Zicgb3V0bGluZSBhbmQgYWR2ZXJ0aXNlIGl0IGFzIGEgYml0bWFwLW9ubHkgZm9udC4gKi8KLSAgICBpZiAoIGlzX2FwcGxlX3NiaXggKQotICAgICAgaGFzX291dGxpbmUgPSBGQUxTRTsKLQotICAgIC8qIGlmIHRoaXMgZm9udCBkb2Vzbid0IGNvbnRhaW4gb3V0bGluZXMsIHdlIHRyeSB0byBsb2FkICovCi0gICAgLyogYSBgYmhlZCcgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFoYXNfb3V0bGluZSAmJiBzZm50LT5sb2FkX2JoZWQgKQotICAgIHsKLSAgICAgIExPQURfKCBiaGVkICk7Ci0gICAgICBpc19hcHBsZV9zYml0ID0gRlRfQk9PTCggIWVycm9yICk7Ci0gICAgfQotCi0gICAgLyogbG9hZCB0aGUgZm9udCBoZWFkZXIgKGBoZWFkJyB0YWJsZSkgaWYgdGhpcyBpc24ndCBhbiBBcHBsZSAqLwotICAgIC8qIHNiaXQgZm9udCBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFpc19hcHBsZV9zYml0IHx8IGlzX2FwcGxlX3NiaXggKQotICAgIHsKLSAgICAgIExPQURfKCBoZWFkICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTSA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiB0aGUgZm9sbG93aW5nIHRhYmxlcyBhcmUgb2Z0ZW4gbm90IHByZXNlbnQgaW4gZW1iZWRkZWQgVHJ1ZVR5cGUgKi8KLSAgICAvKiBmb250cyB3aXRoaW4gUERGIGRvY3VtZW50cywgc28gZG9uJ3QgY2hlY2sgZm9yIHRoZW0uICAgICAgICAgICAgKi8KLSAgICBMT0FEXyggbWF4cCApOwotICAgIExPQURfKCBjbWFwICk7Ci0KLSAgICAvKiB0aGUgZm9sbG93aW5nIHRhYmxlcyBhcmUgb3B0aW9uYWwgaW4gUENMIGZvbnRzIC0tICovCi0gICAgLyogZG9uJ3QgY2hlY2sgZm9yIGVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExPQURfKCBuYW1lICk7Ci0gICAgTE9BRF8oIHBvc3QgKTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICAgIHBzbmFtZXNfZXJyb3IgPSBlcnJvcjsKLSNlbmRpZgotCi0gICAgLyogZG8gbm90IGxvYWQgdGhlIG1ldHJpY3MgaGVhZGVycyBhbmQgdGFibGVzIGlmIHRoaXMgaXMgYW4gQXBwbGUgKi8KLSAgICAvKiBzYml0IGZvbnQgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWlzX2FwcGxlX3NiaXQgKQotICAgIHsKLSAgICAgIC8qIGxvYWQgdGhlIGBoaGVhJyBhbmQgYGhtdHgnIHRhYmxlcyAqLwotICAgICAgTE9BRE1fKCBoaGVhLCAwICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIExPQURNXyggaG10eCwgMCApOwotICAgICAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIFRhYmxlX01pc3NpbmcgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBIbXR4X1RhYmxlX01pc3NpbmcgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAgICAgICAvKiBJZiB0aGlzIGlzIGFuIGluY3JlbWVudGFsbHkgbG9hZGVkIGZvbnQgYW5kIHRoZXJlIGFyZSAqLwotICAgICAgICAgIC8qIG92ZXJyaWRpbmcgbWV0cmljcywgdG9sZXJhdGUgYSBtaXNzaW5nIGBobXR4JyB0YWJsZS4gICovCi0gICAgICAgICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPgotICAgICAgICAgICAgICAgICBnZXRfZ2x5cGhfbWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLm51bWJlcl9PZl9ITWV0cmljcyA9IDA7Ci0gICAgICAgICAgICBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIFRhYmxlX01pc3NpbmcgKSApCi0gICAgICB7Ci0gICAgICAgIC8qIE5vIGBoaGVhJyB0YWJsZSBuZWNlc3NhcnkgZm9yIFNGTlQgTWFjIGZvbnRzLiAqLwotICAgICAgICBpZiAoIGZhY2UtPmZvcm1hdF90YWcgPT0gVFRBR190cnVlICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJUaGlzIGlzIGFuIFNGTlQgTWFjIGZvbnQuXG4iICkpOwotCi0gICAgICAgICAgaGFzX291dGxpbmUgPSAwOwotICAgICAgICAgIGVycm9yICAgICAgID0gRlRfRXJyX09rOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEhvcml6X0hlYWRlcl9NaXNzaW5nICk7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgICAgICAgLyogSWYgdGhpcyBpcyBhbiBpbmNyZW1lbnRhbGx5IGxvYWRlZCBmb250IGFuZCB0aGVyZSBhcmUgKi8KLSAgICAgICAgICAvKiBvdmVycmlkaW5nIG1ldHJpY3MsIHRvbGVyYXRlIGEgbWlzc2luZyBgaGhlYScgdGFibGUuICAqLwotICAgICAgICAgIGlmICggZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT4KLSAgICAgICAgICAgICAgICAgZ2V0X2dseXBoX21ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5udW1iZXJfT2ZfSE1ldHJpY3MgPSAwOwotICAgICAgICAgICAgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiB0cnkgdG8gbG9hZCB0aGUgYHZoZWEnIGFuZCBgdm10eCcgdGFibGVzICovCi0gICAgICBMT0FETV8oIGhoZWEsIDEgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgTE9BRE1fKCBobXR4LCAxICk7Ci0gICAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgICBmYWNlLT52ZXJ0aWNhbF9pbmZvID0gMTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBlcnJvciAmJiBGVF9FUlJfTkVRKCBlcnJvciwgVGFibGVfTWlzc2luZyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBMT0FEXyggb3MyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgLyogd2UgdHJlYXQgdGhlIHRhYmxlIGFzIG1pc3NpbmcgaWYgdGhlcmUgYXJlIGFueSBlcnJvcnMgKi8KLSAgICAgICAgZmFjZS0+b3MyLnZlcnNpb24gPSAweEZGRkZVOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHRoZSBvcHRpb25hbCB0YWJsZXMgKi8KLQotICAgIC8qIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0ICovCi0gICAgaWYgKCBzZm50LT5sb2FkX2VibGMgKQotICAgICAgTE9BRF8oIGVibGMgKTsKLQotICAgIC8qIGNvbnNpZGVyIHRoZSBwY2x0LCBrZXJuaW5nLCBhbmQgZ2FzcCB0YWJsZXMgYXMgb3B0aW9uYWwgKi8KLSAgICBMT0FEXyggcGNsdCApOwotICAgIExPQURfKCBnYXNwICk7Ci0gICAgTE9BRF8oIGtlcm4gKTsKLQotICAgIGZhY2UtPnJvb3QubnVtX2dseXBocyA9IGZhY2UtPm1heF9wcm9maWxlLm51bUdseXBoczsKLQotICAgIC8qIEJpdCA4IG9mIHRoZSBgZnNTZWxlY3Rpb24nIGZpZWxkIGluIHRoZSBgT1MvMicgdGFibGUgZGVub3RlcyAgKi8KLSAgICAvKiBhIFdXUy1vbmx5IGZvbnQgZmFjZS4gIGBXV1MnIHN0YW5kcyBmb3IgYHdlaWdodCcsIHdpZHRoJywgYW5kICovCi0gICAgLyogYHNsb3BlJywgYSB0ZXJtIHVzZWQgYnkgTWljcm9zb2Z0J3MgV2luZG93cyBQcmVzZW50YXRpb24gICAgICAqLwotICAgIC8qIEZvdW5kYXRpb24gKFdQRikuICBUaGlzIGZsYWcgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiB2ZXJzaW9uICAgKi8KLSAgICAvKiAxLjUgb2YgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gKE1heSAyMDA4KS4gICAgICAgICAgICAgICAgICovCi0KLSAgICBmYWNlLT5yb290LmZhbWlseV9uYW1lID0gTlVMTDsKLSAgICBmYWNlLT5yb290LnN0eWxlX25hbWUgID0gTlVMTDsKLSAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgJiYgZmFjZS0+b3MyLmZzU2VsZWN0aW9uICYgMjU2ICkKLSAgICB7Ci0gICAgICBpZiAoICFpZ25vcmVfdHlwb2dyYXBoaWNfZmFtaWx5ICkKLSAgICAgICAgR0VUX05BTUUoIFRZUE9HUkFQSElDX0ZBTUlMWSwgJmZhY2UtPnJvb3QuZmFtaWx5X25hbWUgKTsKLSAgICAgIGlmICggIWZhY2UtPnJvb3QuZmFtaWx5X25hbWUgKQotICAgICAgICBHRVRfTkFNRSggRk9OVF9GQU1JTFksICZmYWNlLT5yb290LmZhbWlseV9uYW1lICk7Ci0KLSAgICAgIGlmICggIWlnbm9yZV90eXBvZ3JhcGhpY19zdWJmYW1pbHkgKQotICAgICAgICBHRVRfTkFNRSggVFlQT0dSQVBISUNfU1VCRkFNSUxZLCAmZmFjZS0+cm9vdC5zdHlsZV9uYW1lICk7Ci0gICAgICBpZiAoICFmYWNlLT5yb290LnN0eWxlX25hbWUgKQotICAgICAgICBHRVRfTkFNRSggRk9OVF9TVUJGQU1JTFksICZmYWNlLT5yb290LnN0eWxlX25hbWUgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEdFVF9OQU1FKCBXV1NfRkFNSUxZLCAmZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSApOwotICAgICAgaWYgKCAhZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSAmJiAhaWdub3JlX3R5cG9ncmFwaGljX2ZhbWlseSApCi0gICAgICAgIEdFVF9OQU1FKCBUWVBPR1JBUEhJQ19GQU1JTFksICZmYWNlLT5yb290LmZhbWlseV9uYW1lICk7Ci0gICAgICBpZiAoICFmYWNlLT5yb290LmZhbWlseV9uYW1lICkKLSAgICAgICAgR0VUX05BTUUoIEZPTlRfRkFNSUxZLCAmZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSApOwotCi0gICAgICBHRVRfTkFNRSggV1dTX1NVQkZBTUlMWSwgJmZhY2UtPnJvb3Quc3R5bGVfbmFtZSApOwotICAgICAgaWYgKCAhZmFjZS0+cm9vdC5zdHlsZV9uYW1lICYmICFpZ25vcmVfdHlwb2dyYXBoaWNfc3ViZmFtaWx5ICkKLSAgICAgICAgR0VUX05BTUUoIFRZUE9HUkFQSElDX1NVQkZBTUlMWSwgJmZhY2UtPnJvb3Quc3R5bGVfbmFtZSApOwotICAgICAgaWYgKCAhZmFjZS0+cm9vdC5zdHlsZV9uYW1lICkKLSAgICAgICAgR0VUX05BTUUoIEZPTlRfU1VCRkFNSUxZLCAmZmFjZS0+cm9vdC5zdHlsZV9uYW1lICk7Ci0gICAgfQotCi0gICAgLyogbm93IHNldCB1cCByb290IGZpZWxkcyAqLwotICAgIHsKLSAgICAgIEZUX0ZhY2UgIHJvb3QgID0gJmZhY2UtPnJvb3Q7Ci0gICAgICBGVF9Mb25nICBmbGFncyA9IHJvb3QtPmZhY2VfZmxhZ3M7Ci0KLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBDb21wdXRlIGZhY2UgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggZmFjZS0+c2JpdF90YWJsZV90eXBlID09IFRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDIHx8Ci0gICAgICAgICAgIGZhY2UtPnNiaXRfdGFibGVfdHlwZSA9PSBUVF9TQklUX1RBQkxFX1RZUEVfU0JJWCApCi0gICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19DT0xPUjsgICAgICAvKiBjb2xvciBnbHlwaHMgKi8KLQotICAgICAgaWYgKCBoYXNfb3V0bGluZSA9PSBUUlVFICkKLSAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1NDQUxBQkxFOyAgIC8qIHNjYWxhYmxlIG91dGxpbmVzICovCi0KLSAgICAgIC8qIFRoZSBzZm50IGRyaXZlciBvbmx5IHN1cHBvcnRzIGJpdG1hcCBmb250cyBuYXRpdmVseSwgdGh1cyB3ZSAqLwotICAgICAgLyogZG9uJ3Qgc2V0IEZUX0ZBQ0VfRkxBR19ISU5URVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfU0ZOVCAgICAgICB8ICAvKiBTRk5UIGZpbGUgZm9ybWF0ICAqLwotICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUw7ICAgLyogaG9yaXpvbnRhbCBkYXRhICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICAgICAgaWYgKCAhcHNuYW1lc19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlICE9IDB4MDAwMzAwMDBMICkKLSAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTOwotI2VuZGlmCi0KLSAgICAgIC8qIGZpeGVkIHdpZHRoIGZvbnQ/ICovCi0gICAgICBpZiAoIGZhY2UtPnBvc3RzY3JpcHQuaXNGaXhlZFBpdGNoICkKLSAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIOwotCi0gICAgICAvKiB2ZXJ0aWNhbCBpbmZvcm1hdGlvbj8gKi8KLSAgICAgIGlmICggZmFjZS0+dmVydGljYWxfaW5mbyApCi0gICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19WRVJUSUNBTDsKLQotICAgICAgLyoga2VybmluZyBhdmFpbGFibGUgPyAqLwotICAgICAgaWYgKCBUVF9GQUNFX0hBU19LRVJOSU5HKCBmYWNlICkgKQotICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfS0VSTklORzsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICAgIC8qIERvbid0IGJvdGhlciB0byBsb2FkIHRoZSB0YWJsZXMgdW5sZXNzIHNvbWVib2R5IGFza3MgZm9yIHRoZW0uICovCi0gICAgICAvKiBObyBuZWVkIHRvIGRvIHdvcmsgd2hpY2ggd2lsbCAocHJvYmFibHkpIG5vdCBiZSB1c2VkLiAgICAgICAgICAqLwotICAgICAgaWYgKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfRlZBUiApCi0gICAgICB7Ci0gICAgICAgIGlmICggdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfZ2x5ZiApICE9IDAgJiYKLSAgICAgICAgICAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSggZmFjZSwgVFRBR19ndmFyICkgIT0gMCApCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlM7Ci0gICAgICAgIGlmICggdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfQ0ZGMiApICE9IDAgKQotICAgICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgPSBmbGFnczsKLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBDb21wdXRlIHN0eWxlIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKCBoYXNfb3V0bGluZSA9PSBUUlVFICYmIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgKQotICAgICAgewotICAgICAgICAvKiBXZSBoYXZlIGFuIE9TLzIgdGFibGU7IHVzZSB0aGUgYGZzU2VsZWN0aW9uJyBmaWVsZC4gIEJpdCA5ICovCi0gICAgICAgIC8qIGluZGljYXRlcyBhbiBvYmxpcXVlIGZvbnQgZmFjZS4gIFRoaXMgZmxhZyBoYXMgYmVlbiAgICAgICAgKi8KLSAgICAgICAgLyogaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuNSBvZiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAqLwotCi0gICAgICAgIGlmICggZmFjZS0+b3MyLmZzU2VsZWN0aW9uICYgNTEyICkgICAgICAgLyogYml0IDkgKi8KLSAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0lUQUxJQzsKLSAgICAgICAgZWxzZSBpZiAoIGZhY2UtPm9zMi5mc1NlbGVjdGlvbiAmIDEgKSAgICAvKiBiaXQgMCAqLwotICAgICAgICAgIGZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfSVRBTElDOwotCi0gICAgICAgIGlmICggZmFjZS0+b3MyLmZzU2VsZWN0aW9uICYgMzIgKSAgICAgICAgLyogYml0IDUgKi8KLSAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgaXMgYW4gb2xkIE1hYyBmb250LCB1c2UgdGhlIGhlYWRlciBmaWVsZCAqLwotCi0gICAgICAgIGlmICggZmFjZS0+aGVhZGVyLk1hY19TdHlsZSAmIDEgKQotICAgICAgICAgIGZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfQk9MRDsKLQotICAgICAgICBpZiAoIGZhY2UtPmhlYWRlci5NYWNfU3R5bGUgJiAyICkKLSAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0lUQUxJQzsKLSAgICAgIH0KLQotICAgICAgcm9vdC0+c3R5bGVfZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogUG9saXNoIHRoZSBjaGFybWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgIFRyeSB0byBzZXQgdGhlIGNoYXJtYXAgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSAmICAgICAqLwotICAgICAgLyogICBlbmNvZGluZyBJRCBvZiBlYWNoIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIHR0X2ZhY2VfYnVpbGRfY21hcHMoIGZhY2UgKTsgIC8qIGlnbm9yZSBlcnJvcnMgKi8KLQotCi0gICAgICAvKiBzZXQgdGhlIGVuY29kaW5nIGZpZWxkcyAqLwotICAgICAgewotICAgICAgICBGVF9JbnQgIG07Ci0KLQotICAgICAgICBmb3IgKCBtID0gMDsgbSA8IHJvb3QtPm51bV9jaGFybWFwczsgbSsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgPSByb290LT5jaGFybWFwc1ttXTsKLQotCi0gICAgICAgICAgY2hhcm1hcC0+ZW5jb2RpbmcgPSBzZm50X2ZpbmRfZW5jb2RpbmcoIGNoYXJtYXAtPnBsYXRmb3JtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFybWFwLT5lbmNvZGluZ19pZCApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICAgICAgLyoKLSAgICAgICAqICBOb3cgYWxsb2NhdGUgdGhlIHJvb3QgYXJyYXkgb2YgRlRfQml0bWFwX1NpemUgcmVjb3JkcyBhbmQKLSAgICAgICAqICBwb3B1bGF0ZSB0aGVtLiAgVW5mb3J0dW5hdGVseSwgaXQgaXNuJ3QgcG9zc2libGUgdG8gaW5kaWNhdGUgYml0Ci0gICAgICAgKiAgZGVwdGhzIGluIHRoZSBGVF9CaXRtYXBfU2l6ZSByZWNvcmQuICBUaGlzIGlzIGEgZGVzaWduIGVycm9yLgotICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGNvdW50OwotCi0KLSAgICAgICAgY291bnQgPSBmYWNlLT5zYml0X251bV9zdHJpa2VzOwotCi0gICAgICAgIGlmICggY291bnQgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ICAgPSBmYWNlLT5yb290LnN0cmVhbS0+bWVtb3J5OwotICAgICAgICAgIEZUX1VTaG9ydCAgICAgICAgZW1fc2l6ZSAgPSBmYWNlLT5oZWFkZXIuVW5pdHNfUGVyX0VNOwotICAgICAgICAgIEZUX1Nob3J0ICAgICAgICAgYXZnd2lkdGggPSBmYWNlLT5vczIueEF2Z0NoYXJXaWR0aDsKLSAgICAgICAgICBGVF9TaXplX01ldHJpY3MgIG1ldHJpY3M7Ci0KLSAgICAgICAgICBGVF9VSW50KiAgc2JpdF9zdHJpa2VfbWFwID0gTlVMTDsKLSAgICAgICAgICBGVF9VSW50ICAgc3RyaWtlX2lkeCwgYnNpemVfaWR4OwotCi0KLSAgICAgICAgICBpZiAoIGVtX3NpemUgPT0gMCB8fCBmYWNlLT5vczIudmVyc2lvbiA9PSAweEZGRkZVICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdmd3aWR0aCA9IDE7Ci0gICAgICAgICAgICBlbV9zaXplID0gMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiB0byBhdm9pZCBpbnZhbGlkIHN0cmlrZSBkYXRhIGluIHRoZSBgYXZhaWxhYmxlX3NpemVzJyBmaWVsZCAqLwotICAgICAgICAgIC8qIG9mIGBGVF9GYWNlJywgd2UgbWFwIGBhdmFpbGFibGVfc2l6ZXMnIGluZGljZXMgdG8gc3RyaWtlICAgICovCi0gICAgICAgICAgLyogaW5kaWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggcm9vdC0+YXZhaWxhYmxlX3NpemVzLCBjb3VudCApIHx8Ci0gICAgICAgICAgICAgICBGVF9ORVdfQVJSQVkoIHNiaXRfc3RyaWtlX21hcCwgY291bnQgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBic2l6ZV9pZHggPSAwOwotICAgICAgICAgIGZvciAoIHN0cmlrZV9pZHggPSAwOyBzdHJpa2VfaWR4IDwgY291bnQ7IHN0cmlrZV9pZHgrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfQml0bWFwX1NpemUqICBic2l6ZSA9IHJvb3QtPmF2YWlsYWJsZV9zaXplcyArIGJzaXplX2lkeDsKLQotCi0gICAgICAgICAgICBlcnJvciA9IHNmbnQtPmxvYWRfc3RyaWtlX21ldHJpY3MoIGZhY2UsIHN0cmlrZV9pZHgsICZtZXRyaWNzICk7Ci0gICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGJzaXplLT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBtZXRyaWNzLmhlaWdodCA+PiA2ICk7Ci0gICAgICAgICAgICBic2l6ZS0+d2lkdGggID0gKEZUX1Nob3J0KSgKLSAgICAgICAgICAgICAgKCBhdmd3aWR0aCAqIG1ldHJpY3MueF9wcGVtICsgZW1fc2l6ZSAvIDIgKSAvIGVtX3NpemUgKTsKLQotICAgICAgICAgICAgYnNpemUtPnhfcHBlbSA9IG1ldHJpY3MueF9wcGVtIDw8IDY7Ci0gICAgICAgICAgICBic2l6ZS0+eV9wcGVtID0gbWV0cmljcy55X3BwZW0gPDwgNjsKLQotICAgICAgICAgICAgLyogYXNzdW1lIDcyZHBpICovCi0gICAgICAgICAgICBic2l6ZS0+c2l6ZSAgID0gbWV0cmljcy55X3BwZW0gPDwgNjsKLQotICAgICAgICAgICAgLyogb25seSB1c2Ugc3RyaWtlcyB3aXRoIHZhbGlkIFBQRU0gdmFsdWVzICovCi0gICAgICAgICAgICBpZiAoIGJzaXplLT54X3BwZW0gJiYgYnNpemUtPnlfcHBlbSApCi0gICAgICAgICAgICAgIHNiaXRfc3RyaWtlX21hcFtic2l6ZV9pZHgrK10gPSBzdHJpa2VfaWR4OwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHJlZHVjZSBhcnJheSBzaXplIHRvIHRoZSBhY3R1YWxseSB1c2VkIGVsZW1lbnRzICovCi0gICAgICAgICAgKHZvaWQpRlRfUkVORVdfQVJSQVkoIHNiaXRfc3RyaWtlX21hcCwgY291bnQsIGJzaXplX2lkeCApOwotCi0gICAgICAgICAgLyogZnJvbSBub3cgb24sIGFsbCBzdHJpa2UgaW5kaWNlcyBhcmUgbWFwcGVkICovCi0gICAgICAgICAgLyogdXNpbmcgYHNiaXRfc3RyaWtlX21hcCcgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBic2l6ZV9pZHggKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2UtPnNiaXRfc3RyaWtlX21hcCA9IHNiaXRfc3RyaWtlX21hcDsKLQotICAgICAgICAgICAgcm9vdC0+ZmFjZV9mbGFncyAgICAgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTOwotICAgICAgICAgICAgcm9vdC0+bnVtX2ZpeGVkX3NpemVzID0gKEZUX0ludClic2l6ZV9pZHg7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotICAgICAgLyogYSBmb250IHdpdGggbm8gYml0bWFwcyBhbmQgbm8gb3V0bGluZXMgaXMgc2NhbGFibGU7ICovCi0gICAgICAvKiBpdCBoYXMgb25seSBlbXB0eSBnbHlwaHMgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggIUZUX0hBU19GSVhFRF9TSVpFUyggcm9vdCApICYmICFGVF9JU19TQ0FMQUJMRSggcm9vdCApICkKLSAgICAgICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfU0NBTEFCTEU7Ci0KLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgU2V0IHVwIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggRlRfSVNfU0NBTEFCTEUoIHJvb3QgKSApCi0gICAgICB7Ci0gICAgICAgIC8qIFhYWCBXaGF0IGFib3V0IGlmIG91dGxpbmUgaGVhZGVyIGlzIG1pc3NpbmcgKi8KLSAgICAgICAgLyogICAgIChlLmcuIHNmbnQgd3JhcHBlZCBiaXRtYXApPyAgICAgICAgICAgICAqLwotICAgICAgICByb290LT5iYm94LnhNaW4gICAgPSBmYWNlLT5oZWFkZXIueE1pbjsKLSAgICAgICAgcm9vdC0+YmJveC55TWluICAgID0gZmFjZS0+aGVhZGVyLnlNaW47Ci0gICAgICAgIHJvb3QtPmJib3gueE1heCAgICA9IGZhY2UtPmhlYWRlci54TWF4OwotICAgICAgICByb290LT5iYm94LnlNYXggICAgPSBmYWNlLT5oZWFkZXIueU1heDsKLSAgICAgICAgcm9vdC0+dW5pdHNfcGVyX0VNID0gZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTTsKLQotCi0gICAgICAgIC8qIFhYWDogQ29tcHV0aW5nIHRoZSBhc2NlbmRlci9kZXNjZW5kZXIvaGVpZ2h0IGlzIHZlcnkgZGlmZmVyZW50ICovCi0gICAgICAgIC8qICAgICAgZnJvbSB3aGF0IHRoZSBzcGVjaWZpY2F0aW9uIHRlbGxzIHlvdS4gIEFwcGFyZW50bHksIHdlICAgICovCi0gICAgICAgIC8qICAgICAgbXVzdCBiZSBjYXJlZnVsIGJlY2F1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgLSBub3QgYWxsIGZvbnRzIGhhdmUgYW4gT1MvMiB0YWJsZTsgaW4gdGhpcyBjYXNlLCB3ZSB0YWtlICovCi0gICAgICAgIC8qICAgICAgICB0aGUgdmFsdWVzIGluIHRoZSBob3Jpem9udGFsIGhlYWRlci4gIEhvd2V2ZXIsIHRoZXNlICAgICovCi0gICAgICAgIC8qICAgICAgICB2YWx1ZXMgdmVyeSBvZnRlbiBhcmUgbm90IHJlbGlhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgLSBvdGhlcndpc2UsIHRoZSBjb3JyZWN0IHR5cG9ncmFwaGljIHZhbHVlcyBhcmUgaW4gdGhlICAgICovCi0gICAgICAgIC8qICAgICAgICBzVHlwb0FzY2VuZGVyLCBzVHlwb0Rlc2NlbmRlciAmIHNUeXBvTGluZUdhcCBmaWVsZHMuICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICBIb3dldmVyLCBjZXJ0YWluIGZvbnRzIGhhdmUgdGhlc2UgZmllbGRzIHNldCB0byAwLiAgICAgICovCi0gICAgICAgIC8qICAgICAgICBSYXRoZXIsIHRoZXkgaGF2ZSB1c1dpbkFzY2VudCAmIHVzV2luRGVzY2VudCBjb3JyZWN0bHkgICovCi0gICAgICAgIC8qICAgICAgICBzZXQgKGJ1dCB3aXRoIGRpZmZlcmVudCB2YWx1ZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgQXMgYW4gZXhhbXBsZSwgQXJpYWwgTmFycm93IGlzIGltcGxlbWVudGVkIHRocm91Z2ggZm91ciAgICovCi0gICAgICAgIC8qICAgICAgZmlsZXMgQVJJQUxOLlRURiwgQVJJQUxOSS5UVEYsIEFSSUFMTkIuVFRGICYgQVJJQUxOQkkuVFRGICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgU3RyYW5nZWx5LCBhbGwgZm9udHMgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMgaW4gdGhlaXIgICAgICAgICovCi0gICAgICAgIC8qICAgICAgc1R5cG9YWFggZmllbGRzLCBleGNlcHQgQVJJQUxOQiB3aGljaCBzZXRzIHRoZW0gdG8gMC4gICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgT24gdGhlIG90aGVyIGhhbmQsIHRoZXkgYWxsIGhhdmUgZGlmZmVyZW50ICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgdXNXaW5Bc2NlbnQvRGVzY2VudCB2YWx1ZXMgLS0gYXMgYSBjb25jbHVzaW9uLCB0aGUgT1MvMiAgICovCi0gICAgICAgIC8qICAgICAgdGFibGUgY2Fubm90IGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgdGV4dCBoZWlnaHQgcmVsaWFibHkhICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgLyogVGhlIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgYXJlIHRha2VuIGZyb20gdGhlIGBoaGVhJyB0YWJsZS4gKi8KLSAgICAgICAgLyogSWYgemVybywgdGhleSBhcmUgdGFrZW4gZnJvbSB0aGUgYE9TLzInIHRhYmxlLiAgICAgICAgICAgICAgKi8KLQotICAgICAgICByb290LT5hc2NlbmRlciAgPSBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyOwotICAgICAgICByb290LT5kZXNjZW5kZXIgPSBmYWNlLT5ob3Jpem9udGFsLkRlc2NlbmRlcjsKLQotICAgICAgICByb290LT5oZWlnaHQgPSByb290LT5hc2NlbmRlciAtIHJvb3QtPmRlc2NlbmRlciArCi0gICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmhvcml6b250YWwuTGluZV9HYXA7Ci0KLSAgICAgICAgaWYgKCAhKCByb290LT5hc2NlbmRlciB8fCByb290LT5kZXNjZW5kZXIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgfHwgZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcm9vdC0+YXNjZW5kZXIgID0gZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXI7Ci0gICAgICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlcjsKLQotICAgICAgICAgICAgICByb290LT5oZWlnaHQgPSByb290LT5hc2NlbmRlciAtIHJvb3QtPmRlc2NlbmRlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm9zMi5zVHlwb0xpbmVHYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9ICAoRlRfU2hvcnQpZmFjZS0+b3MyLnVzV2luQXNjZW50OwotICAgICAgICAgICAgICByb290LT5kZXNjZW5kZXIgPSAtKEZUX1Nob3J0KWZhY2UtPm9zMi51c1dpbkRlc2NlbnQ7Ci0KLSAgICAgICAgICAgICAgcm9vdC0+aGVpZ2h0ID0gcm9vdC0+YXNjZW5kZXIgLSByb290LT5kZXNjZW5kZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2Vfd2lkdGggID0KLSAgICAgICAgICAoRlRfU2hvcnQpZmFjZS0+aG9yaXpvbnRhbC5hZHZhbmNlX1dpZHRoX01heDsKLSAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2VfaGVpZ2h0ID0KLSAgICAgICAgICAoRlRfU2hvcnQpKCBmYWNlLT52ZXJ0aWNhbF9pbmZvID8gZmFjZS0+dmVydGljYWwuYWR2YW5jZV9IZWlnaHRfTWF4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvb3QtPmhlaWdodCApOwotCi0gICAgICAgIC8qIFNlZSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vT3BlblR5cGUvT1RTcGVjL3Bvc3QuaHRtIC0tICovCi0gICAgICAgIC8qIEFkanVzdCB1bmRlcmxpbmUgcG9zaXRpb24gZnJvbSB0b3AgZWRnZSB0byBjZW50cmUgb2YgICAgICovCi0gICAgICAgIC8qIHN0cm9rZSB0byBjb252ZXJ0IFRydWVUeXBlIG1lYW5pbmcgdG8gRnJlZVR5cGUgbWVhbmluZy4gICovCi0gICAgICAgIHJvb3QtPnVuZGVybGluZV9wb3NpdGlvbiAgPSBmYWNlLT5wb3N0c2NyaXB0LnVuZGVybGluZVBvc2l0aW9uIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnBvc3RzY3JpcHQudW5kZXJsaW5lVGhpY2tuZXNzIC8gMjsKLSAgICAgICAgcm9vdC0+dW5kZXJsaW5lX3RoaWNrbmVzcyA9IGZhY2UtPnBvc3RzY3JpcHQudW5kZXJsaW5lVGhpY2tuZXNzOwotICAgICAgfQotCi0gICAgfQotCi0gIEV4aXQ6Ci0gICAgRlRfVFJBQ0UyKCggInNmbnRfbG9hZF9mYWNlOiBkb25lXG4iICkpOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI3VuZGVmIExPQURfCi0jdW5kZWYgTE9BRE1fCi0jdW5kZWYgR0VUX05BTUUKLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHNmbnRfZG9uZV9mYWNlKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5OwotICAgIFNGTlRfU2VydmljZSAgc2ZudDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBzZm50ICAgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0KLSAgICBpZiAoIHNmbnQgKQotICAgIHsKLSAgICAgIC8qIGRlc3Ryb3kgdGhlIHBvc3RzY3JpcHQgbmFtZXMgdGFibGUgaWYgaXQgaXMgbG9hZGVkICovCi0gICAgICBpZiAoIHNmbnQtPmZyZWVfcHNuYW1lcyApCi0gICAgICAgIHNmbnQtPmZyZWVfcHNuYW1lcyggZmFjZSApOwotCi0gICAgICAvKiBkZXN0cm95IHRoZSBlbWJlZGRlZCBiaXRtYXBzIHRhYmxlIGlmIGl0IGlzIGxvYWRlZCAqLwotICAgICAgaWYgKCBzZm50LT5mcmVlX2VibGMgKQotICAgICAgICBzZm50LT5mcmVlX2VibGMoIGZhY2UgKTsKLSAgICB9Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotICAgIC8qIGZyZWVpbmcgdGhlIGVtYmVkZGVkIEJERiBwcm9wZXJ0aWVzICovCi0gICAgdHRfZmFjZV9mcmVlX2JkZl9wcm9wcyggZmFjZSApOwotI2VuZGlmCi0KLSAgICAvKiBmcmVlaW5nIHRoZSBrZXJuaW5nIHRhYmxlICovCi0gICAgdHRfZmFjZV9kb25lX2tlcm4oIGZhY2UgKTsKLQotICAgIC8qIGZyZWVpbmcgdGhlIGNvbGxlY3Rpb24gdGFibGUgKi8KLSAgICBGVF9GUkVFKCBmYWNlLT50dGNfaGVhZGVyLm9mZnNldHMgKTsKLSAgICBmYWNlLT50dGNfaGVhZGVyLmNvdW50ID0gMDsKLQotICAgIC8qIGZyZWVpbmcgdGFibGUgZGlyZWN0b3J5ICovCi0gICAgRlRfRlJFRSggZmFjZS0+ZGlyX3RhYmxlcyApOwotICAgIGZhY2UtPm51bV90YWJsZXMgPSAwOwotCi0gICAgewotICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBGVF9GQUNFX1NUUkVBTSggZmFjZSApOwotCi0KLSAgICAgIC8qIHNpbXBseSByZWxlYXNlIHRoZSAnY21hcCcgdGFibGUgZnJhbWUgKi8KLSAgICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGZhY2UtPmNtYXBfdGFibGUgKTsKLSAgICAgIGZhY2UtPmNtYXBfc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgZmFjZS0+aG9yel9tZXRyaWNzX3NpemUgPSAwOwotICAgIGZhY2UtPnZlcnRfbWV0cmljc19zaXplID0gMDsKLQotICAgIC8qIGZyZWVpbmcgdmVydGljYWwgbWV0cmljcywgaWYgYW55ICovCi0gICAgaWYgKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBmYWNlLT52ZXJ0aWNhbC5sb25nX21ldHJpY3MgICk7Ci0gICAgICBGVF9GUkVFKCBmYWNlLT52ZXJ0aWNhbC5zaG9ydF9tZXRyaWNzICk7Ci0gICAgICBmYWNlLT52ZXJ0aWNhbF9pbmZvID0gMDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSBnYXNwIHRhYmxlICovCi0gICAgRlRfRlJFRSggZmFjZS0+Z2FzcC5nYXNwUmFuZ2VzICk7Ci0gICAgZmFjZS0+Z2FzcC5udW1SYW5nZXMgPSAwOwotCi0gICAgLyogZnJlZWluZyB0aGUgbmFtZSB0YWJsZSAqLwotICAgIGlmICggc2ZudCApCi0gICAgICBzZm50LT5mcmVlX25hbWUoIGZhY2UgKTsKLQotICAgIC8qIGZyZWVpbmcgZmFtaWx5IGFuZCBzdHlsZSBuYW1lICovCi0gICAgRlRfRlJFRSggZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSApOwotICAgIEZUX0ZSRUUoIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSApOwotCi0gICAgLyogZnJlZWluZyBzYml0IHNpemUgdGFibGUgKi8KLSAgICBGVF9GUkVFKCBmYWNlLT5yb290LmF2YWlsYWJsZV9zaXplcyApOwotICAgIEZUX0ZSRUUoIGZhY2UtPnNiaXRfc3RyaWtlX21hcCApOwotICAgIGZhY2UtPnJvb3QubnVtX2ZpeGVkX3NpemVzID0gMDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBGVF9GUkVFKCBmYWNlLT5wb3N0c2NyaXB0X25hbWUgKTsKLSAgICBGVF9GUkVFKCBmYWNlLT52YXJfcG9zdHNjcmlwdF9wcmVmaXggKTsKLSNlbmRpZgotCi0gICAgZmFjZS0+c2ZudCA9IE5VTEw7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3Nmb2Jqcy5oIGIvc3JjL3NmbnQvc2ZvYmpzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTM4MTQuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvc2ZvYmpzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZm9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU0ZOVCBvYmplY3QgbWFuYWdlbWVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgU0ZPQkpTX0hfCi0jZGVmaW5lIFNGT0JKU19IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHNmbnRfaW5pdF9mYWNlKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbnN0YW5jZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBzZm50X2xvYWRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5zdGFuY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBzZm50X2RvbmVfZmFjZSggVFRfRmFjZSAgZmFjZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZ2V0X25hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgbmFtZWlkLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgbmFtZSApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFNGRFJJVkVSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dGJkZi5jIGIvc3JjL3NmbnQvdHRiZGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5NmUzNy4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dGJkZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0YmRmLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgQkRGIHByb3BlcnRpZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSAidHRiZGYuaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRiZGYKLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9iZGZfcHJvcHMoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgVFRfQkRGICBiZGYgPSAmZmFjZS0+YmRmOwotCi0KLSAgICBpZiAoIGJkZi0+bG9hZGVkICkKLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IEZUX0ZBQ0UoZmFjZSktPnN0cmVhbTsKLQotCi0gICAgICBpZiAoIGJkZi0+dGFibGUgKQotICAgICAgICBGVF9GUkFNRV9SRUxFQVNFKCBiZGYtPnRhYmxlICk7Ci0KLSAgICAgIGJkZi0+dGFibGVfZW5kICAgID0gTlVMTDsKLSAgICAgIGJkZi0+c3RyaW5ncyAgICAgID0gTlVMTDsKLSAgICAgIGJkZi0+c3RyaW5nc19zaXplID0gMDsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9mYWNlX2xvYWRfYmRmX3Byb3BzKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIFRUX0JERiAgICBiZGYgPSAmZmFjZS0+YmRmOwotICAgIEZUX1VMb25nICBsZW5ndGg7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBGVF9aRVJPKCBiZGYgKTsKLQotICAgIGVycm9yID0gdHRfZmFjZV9nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX0JERiwgc3RyZWFtLCAmbGVuZ3RoICk7Ci0gICAgaWYgKCBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgbGVuZ3RoIDwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VYVFJBQ1QoIGxlbmd0aCwgYmRmLT50YWJsZSApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgYmRmLT50YWJsZV9lbmQgPSBiZGYtPnRhYmxlICsgbGVuZ3RoOwotCi0gICAgewotICAgICAgRlRfQnl0ZSogICBwICAgICAgICAgICA9IGJkZi0+dGFibGU7Ci0gICAgICBGVF9VSW50ICAgIHZlcnNpb24gICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgICAgbnVtX3N0cmlrZXMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgRlRfVUxvbmcgICBzdHJpbmdzICAgICA9IEZUX05FWFRfVUxPTkcgKCBwICk7Ci0gICAgICBGVF9VSW50ICAgIGNvdW50OwotICAgICAgRlRfQnl0ZSogICBzdHJpa2U7Ci0KLQotICAgICAgaWYgKCB2ZXJzaW9uICE9IDB4MDAwMSAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgc3RyaW5ncyA8IDggICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICggc3RyaW5ncyAtIDggKSAvIDQgPCBudW1fc3RyaWtlcyB8fAotICAgICAgICAgICBzdHJpbmdzICsgMSA+IGxlbmd0aCAgICAgICAgICAgICAgKQotICAgICAgewotICAgICAgICBnb3RvIEJhZFRhYmxlOwotICAgICAgfQotCi0gICAgICBiZGYtPm51bV9zdHJpa2VzICA9IG51bV9zdHJpa2VzOwotICAgICAgYmRmLT5zdHJpbmdzICAgICAgPSBiZGYtPnRhYmxlICsgc3RyaW5nczsKLSAgICAgIGJkZi0+c3RyaW5nc19zaXplID0gbGVuZ3RoIC0gc3RyaW5nczsKLQotICAgICAgY291bnQgID0gYmRmLT5udW1fc3RyaWtlczsKLSAgICAgIHAgICAgICA9IGJkZi0+dGFibGUgKyA4OwotICAgICAgc3RyaWtlID0gcCArIGNvdW50ICogNDsKLQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIG51bV9pdGVtcyA9IEZUX1BFRUtfVVNIT1JUKCBwICsgMiApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqICBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSB2YWx1ZSBzZXRzIHRoZW1zZWx2ZXMsIHNpbmNlIHRoaXMKLSAgICAgICAgICogIGlzIGRvbmUgbGF0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBzdHJpa2UgKz0gMTAgKiBudW1faXRlbXM7Ci0KLSAgICAgICAgcCArPSA0OwotICAgICAgfQotCi0gICAgICBpZiAoIHN0cmlrZSA+IGJkZi0+c3RyaW5ncyApCi0gICAgICAgIGdvdG8gQmFkVGFibGU7Ci0gICAgfQotCi0gICAgYmRmLT5sb2FkZWQgPSAxOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEJhZFRhYmxlOgotICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGJkZi0+dGFibGUgKTsKLSAgICBGVF9aRVJPKCBiZGYgKTsKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9maW5kX2JkZl9wcm9wKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3AgKQotICB7Ci0gICAgVFRfQkRGICAgICBiZGYgICA9ICZmYWNlLT5iZGY7Ci0gICAgRlRfU2l6ZSAgICBzaXplICA9IEZUX0ZBQ0UoZmFjZSktPnNpemU7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9CeXRlKiAgIHA7Ci0gICAgRlRfVUludCAgICBjb3VudDsKLSAgICBGVF9CeXRlKiAgIHN0cmlrZTsKLSAgICBGVF9PZmZzZXQgIHByb3BlcnR5X2xlbjsKLQotCi0gICAgYXByb3AtPnR5cGUgPSBCREZfUFJPUEVSVFlfVFlQRV9OT05FOwotCi0gICAgaWYgKCBiZGYtPmxvYWRlZCA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9iZGZfcHJvcHMoIGZhY2UsIEZUX0ZBQ0UoIGZhY2UgKS0+c3RyZWFtICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGNvdW50ICA9IGJkZi0+bnVtX3N0cmlrZXM7Ci0gICAgcCAgICAgID0gYmRmLT50YWJsZSArIDg7Ci0gICAgc3RyaWtlID0gcCArIDQgKiBjb3VudDsKLQotICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoICFzaXplIHx8ICFwcm9wZXJ0eV9uYW1lICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHByb3BlcnR5X2xlbiA9IGZ0X3N0cmxlbiggcHJvcGVydHlfbmFtZSApOwotICAgIGlmICggcHJvcGVydHlfbGVuID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIF9wcGVtICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBGVF9VSW50ICBfY291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgIGlmICggX3BwZW0gPT0gc2l6ZS0+bWV0cmljcy55X3BwZW0gKQotICAgICAgewotICAgICAgICBjb3VudCA9IF9jb3VudDsKLSAgICAgICAgZ290byBGb3VuZFN0cmlrZTsKLSAgICAgIH0KLQotICAgICAgc3RyaWtlICs9IDEwICogX2NvdW50OwotICAgIH0KLSAgICBnb3RvIEV4aXQ7Ci0KLSAgRm91bmRTdHJpa2U6Ci0gICAgcCA9IHN0cmlrZTsKLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgewotICAgICAgRlRfVUludCAgdHlwZSA9IEZUX1BFRUtfVVNIT1JUKCBwICsgNCApOwotCi0KLSAgICAgIGlmICggKCB0eXBlICYgMHgxMCApICE9IDAgKQotICAgICAgewotICAgICAgICBGVF9VSW50MzIgIG5hbWVfb2Zmc2V0ID0gRlRfUEVFS19VTE9ORyggcCAgICAgKTsKLSAgICAgICAgRlRfVUludDMyICB2YWx1ZSAgICAgICA9IEZUX1BFRUtfVUxPTkcoIHAgKyA2ICk7Ci0KLSAgICAgICAgLyogYmUgYSBiaXQgcGFyYW5vaWQgZm9yIGludmFsaWQgZW50cmllcyBoZXJlICovCi0gICAgICAgIGlmICggbmFtZV9vZmZzZXQgPCBiZGYtPnN0cmluZ3Nfc2l6ZSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBwcm9wZXJ0eV9sZW4gPCBiZGYtPnN0cmluZ3Nfc2l6ZSAtIG5hbWVfb2Zmc2V0ICAgICAmJgotICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWJkZi0+c3RyaW5ncyArIG5hbWVfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJkZi0+c3RyaW5nc19zaXplIC0gbmFtZV9vZmZzZXQgKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCAoIHR5cGUgJiAweDBGICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAweDAwOiAgLyogc3RyaW5nICovCi0gICAgICAgICAgY2FzZSAweDAxOiAgLyogYXRvbXMgKi8KLSAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGNvbnRlbnQgaXMgcmVhbGx5IDAtdGVybWluYXRlZCAqLwotICAgICAgICAgICAgaWYgKCB2YWx1ZSA8IGJkZi0+c3RyaW5nc19zaXplICYmCi0gICAgICAgICAgICAgICAgIGZ0X21lbWNociggYmRmLT5zdHJpbmdzICsgdmFsdWUsIDAsIGJkZi0+c3RyaW5nc19zaXplICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhcHJvcC0+dHlwZSAgID0gQkRGX1BST1BFUlRZX1RZUEVfQVRPTTsKLSAgICAgICAgICAgICAgYXByb3AtPnUuYXRvbSA9IChjb25zdCBjaGFyKiliZGYtPnN0cmluZ3MgKyB2YWx1ZTsKLSAgICAgICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIDB4MDI6Ci0gICAgICAgICAgICBhcHJvcC0+dHlwZSAgICAgID0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUjsKLSAgICAgICAgICAgIGFwcm9wLT51LmludGVnZXIgPSAoRlRfSW50MzIpdmFsdWU7Ci0gICAgICAgICAgICBlcnJvciAgICAgICAgICAgID0gRlRfRXJyX09rOwotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgY2FzZSAweDAzOgotICAgICAgICAgICAgYXByb3AtPnR5cGUgICAgICAgPSBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTDsKLSAgICAgICAgICAgIGFwcm9wLT51LmNhcmRpbmFsID0gdmFsdWU7Ci0gICAgICAgICAgICBlcnJvciAgICAgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwICs9IDEwOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZWxzZSAvKiAhVFRfQ09ORklHX09QVElPTl9CREYgKi8KLQotICAvKiBBTlNJIEMgZG9lc24ndCBsaWtlIGVtcHR5IHNvdXJjZSBmaWxlcyAqLwotICB0eXBlZGVmIGludCAgX3R0X2JkZl9kdW1teTsKLQotI2VuZGlmIC8qICFUVF9DT05GSUdfT1BUSU9OX0JERiAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRiZGYuaCBiL3NyYy9zZm50L3R0YmRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGI2MjAuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRiZGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0YmRmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgQkRGIHByb3BlcnRpZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUVEJERl9IXwotI2RlZmluZSBUVEJERl9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0bG9hZC5oIgotI2luY2x1ZGUgRlRfQkRGX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX2JkZl9wcm9wcyggVFRfRmFjZSAgZmFjZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9maW5kX2JkZl9wcm9wKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3AgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBUVEJERl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRjbWFwLmMgYi9zcmMvc2ZudC90dGNtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmYTZhZS4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dGNtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiICAgICAgICAgICAvKiBtdXN0IGNvbWUgYmVmb3JlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0ggKi8KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfVkFMSURBVEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlICJ0dGxvYWQuaCIKLSNpbmNsdWRlICJ0dGNtYXAuaCIKLSNpbmNsdWRlICJzZm50cGljLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dGNtYXAKLQotCi0jZGVmaW5lIFRUX1BFRUtfU0hPUlQgICBGVF9QRUVLX1NIT1JUCi0jZGVmaW5lIFRUX1BFRUtfVVNIT1JUICBGVF9QRUVLX1VTSE9SVAotI2RlZmluZSBUVF9QRUVLX1VJTlQyNCAgRlRfUEVFS19VT0ZGMwotI2RlZmluZSBUVF9QRUVLX0xPTkcgICAgRlRfUEVFS19MT05HCi0jZGVmaW5lIFRUX1BFRUtfVUxPTkcgICBGVF9QRUVLX1VMT05HCi0KLSNkZWZpbmUgVFRfTkVYVF9TSE9SVCAgIEZUX05FWFRfU0hPUlQKLSNkZWZpbmUgVFRfTkVYVF9VU0hPUlQgIEZUX05FWFRfVVNIT1JUCi0jZGVmaW5lIFRUX05FWFRfVUlOVDI0ICBGVF9ORVhUX1VPRkYzCi0jZGVmaW5lIFRUX05FWFRfTE9ORyAgICBGVF9ORVhUX0xPTkcKLSNkZWZpbmUgVFRfTkVYVF9VTE9ORyAgIEZUX05FWFRfVUxPTkcKLQotCi0gIC8qIFRvbyBsYXJnZSBnbHlwaCBpbmRleCByZXR1cm4gdmFsdWVzIGFyZSBjYXVnaHQgaW4gYEZUX0dldF9DaGFyX0luZGV4JyAqLwotICAvKiBhbmQgYEZUX0dldF9OZXh0X0NoYXInICh0aGUgbGF0dGVyIGNhbGxzIHRoZSBpbnRlcm5hbCBgbmV4dCcgZnVuY3Rpb24gKi8KLSAgLyogYWdhaW4gaW4gdGhpcyBjYXNlKS4gIFRvIG1hcmsgY2hhcmFjdGVyIGNvZGUgcmV0dXJuIHZhbHVlcyBhcyBpbnZhbGlkICovCi0gIC8qIGl0IGlzIHN1ZmZpY2llbnQgdG8gc2V0IHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4IHJldHVybiB2YWx1ZSB0byAqLwotICAvKiB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwX2luaXQoIFRUX0NNYXAgICBjbWFwLAotICAgICAgICAgICAgICAgIEZUX0J5dGUqICB0YWJsZSApCi0gIHsKLSAgICBjbWFwLT5kYXRhID0gdGFibGU7Ci0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgICAgIFRZUEUgICAgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICBtdXN0IGJlIDAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICovCi0gIC8qICAgZ2x5cGhfaWRzICAgNiAgICAgICAgICAgICAgQllURVsyNTZdICAgICBhcnJheSBvZiBnbHlwaCBpbmRpY2VzICAgICAqLwotICAvKiAgICAgICAgICAgICAgIDI2MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMAotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMF92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIGxlbmd0aDsKLQotCi0gICAgaWYgKCB0YWJsZSArIDIgKyAyID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgcCAgICAgID0gdGFibGUgKyAyOyAgICAgICAgICAgLyogc2tpcCBmb3JtYXQgKi8KLSAgICBsZW5ndGggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgaWYgKCB0YWJsZSArIGxlbmd0aCA+IHZhbGlkLT5saW1pdCB8fCBsZW5ndGggPCAyNjIgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBjaGVjayBnbHlwaCBpbmRpY2VzIHdoZW5ldmVyIG5lY2Vzc2FyeSAqLwotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBuLCBpZHg7Ci0KLQotICAgICAgcCA9IHRhYmxlICsgNjsKLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgMjU2OyBuKysgKQotICAgICAgewotICAgICAgICBpZHggPSAqcCsrOwotICAgICAgICBpZiAoIGlkeCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwMF9jaGFyX2luZGV4KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0J5dGUqICB0YWJsZSA9IGNtYXAtPmRhdGE7Ci0KLQotICAgIHJldHVybiBjaGFyX2NvZGUgPCAyNTYgPyB0YWJsZVs2ICsgY2hhcl9jb2RlXSA6IDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdHRfY21hcDBfY2hhcl9uZXh0KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogICB0YWJsZSAgICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfVUludDMyICBjaGFyY29kZSA9ICpwY2hhcl9jb2RlOwotICAgIEZUX1VJbnQzMiAgcmVzdWx0ICAgPSAwOwotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgPSAwOwotCi0KLSAgICB0YWJsZSArPSA2OyAgLyogZ28gdG8gZ2x5cGggSURzICovCi0gICAgd2hpbGUgKCArK2NoYXJjb2RlIDwgMjU2ICkKLSAgICB7Ci0gICAgICBnaW5kZXggPSB0YWJsZVtjaGFyY29kZV07Ci0gICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gY2hhcmNvZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgICpwY2hhcl9jb2RlID0gcmVzdWx0OwotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMF9nZXRfaW5mbyggVFRfQ01hcCAgICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSBjbWFwLT5kYXRhICsgNDsKLQotCi0gICAgY21hcF9pbmZvLT5mb3JtYXQgICA9IDA7Ci0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IChGVF9VTG9uZylUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1RUX0NNQVAoCi0gICAgdHRfY21hcDBfY2xhc3NfcmVjLAotCi0gICAgICBzaXplb2YgKCBUVF9DTWFwUmVjICksCi0KLSAgICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcF9pbml0LCAgICAgICAgIC8qIGluaXQgICAgICAgKi8KLSAgICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgTlVMTCwgICAgICAgICAgICAgICAgIC8qIGRvbmUgICAgICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDBfY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDBfY2hhcl9uZXh0LCAgIC8qIGNoYXJfbmV4dCAgKi8KLQotICAgICAgKEZUX0NNYXBfQ2hhclZhckluZGV4RnVuYykgICAgTlVMTCwgIC8qIGNoYXJfdmFyX2luZGV4ICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jKU5VTEwsICAvKiBjaGFyX3Zhcl9kZWZhdWx0ICovCi0gICAgICAoRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMpICAgICBOVUxMLCAgLyogdmFyaWFudF9saXN0ICAgICAqLwotICAgICAgKEZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykgTlVMTCwgIC8qIGNoYXJ2YXJpYW50X2xpc3QgKi8KLSAgICAgIChGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpIE5VTEwsICAvKiB2YXJpYW50Y2hhcl9saXN0ICovCi0KLSAgICAwLAotICAgIChUVF9DTWFwX1ZhbGlkYXRlRnVuYyl0dF9jbWFwMF92YWxpZGF0ZSwgIC8qIHZhbGlkYXRlICAgICAgKi8KLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfY21hcDBfZ2V0X2luZm8gICAvKiBnZXRfY21hcF9pbmZvICovCi0gICkKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8wICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiBUaGlzIGlzIHVzZWQgZm9yIGNlcnRhaW4gQ0pLIGVuY29kaW5ncyB0aGF0IGVuY29kZSB0ZXh0IGluIGEgICoqKioqLwotICAvKioqKiogbWl4ZWQgOC8xNiBiaXRzIGVuY29kaW5nIGFsb25nIHRoZSBmb2xsb3dpbmcgbGluZXMuICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAqIENlcnRhaW4gYnl0ZSB2YWx1ZXMgY29ycmVzcG9uZCB0byBhbiA4LWJpdCBjaGFyYWN0ZXIgY29kZSAgICoqKioqLwotICAvKioqKiogICAodHlwaWNhbGx5IGluIHRoZSByYW5nZSAwLi4xMjcgZm9yIEFTQ0lJIGNvbXBhdGliaWxpdHkpLiAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAqIENlcnRhaW4gYnl0ZSB2YWx1ZXMgc2lnbmFsIHRoZSBmaXJzdCBieXRlIG9mIGEgMi1ieXRlICAgICAgICoqKioqLwotICAvKioqKiogICBjaGFyYWN0ZXIgY29kZSAoYnV0IHRoZXNlIHZhbHVlcyBhcmUgYWxzbyB2YWxpZCBhcyB0aGUgICAgICAqKioqKi8KLSAgLyoqKioqICAgc2Vjb25kIGJ5dGUgb2YgYSAyLWJ5dGUgY2hhcmFjdGVyKS4gICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogVGhlIGZvbGxvd2luZyBjaGFybWFwIGxvb2t1cCBhbmQgaXRlcmF0aW9uIGZ1bmN0aW9ucyBhbGwgICAgICAqKioqKi8KLSAgLyoqKioqIGFzc3VtZSB0aGF0IHRoZSB2YWx1ZSBgY2hhcmNvZGUnIGZ1bGZpbGxzIHRoZSBmb2xsb3dpbmcuICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAtIEZvciBvbmUgYnl0ZSBjaGFyYWN0ZXJzLCBgY2hhcmNvZGUnIGlzIHNpbXBseSB0aGUgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAtIEZvciB0d28gYnl0ZSBjaGFyYWN0ZXJzLCBgY2hhcmNvZGUnIGlzIHRoZSAyLWJ5dGUgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICBjaGFyYWN0ZXIgY29kZSBpbiBiaWcgZW5kaWFuIGZvcm1hdC4gIE1vcmUgcHJlY2lzZWx5OiAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgKGNoYXJjb2RlID4+IDgpICAgIGlzIHRoZSBmaXJzdCBieXRlIHZhbHVlICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgIChjaGFyY29kZSAmIDB4RkYpICBpcyB0aGUgc2Vjb25kIGJ5dGUgdmFsdWUgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogTm90ZSB0aGF0IG5vdCBhbGwgdmFsdWVzIG9mIGBjaGFyY29kZScgYXJlIHZhbGlkIGFjY29yZGluZyAgICAqKioqKi8KLSAgLyoqKioqIHRvIHRoZXNlIHJ1bGVzLCBhbmQgdGhlIGZ1bmN0aW9uIG1vZGVyYXRlbHkgY2hlY2tzIHRoZSAgICAgICAgKioqKiovCi0gIC8qKioqKiBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgICAgICBUWVBFICAgICAgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBtdXN0IGJlIDIgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsZW5ndGggICAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAgICovCi0gIC8qICAgbGFuZ3VhZ2UgICAgNCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAqLwotICAvKiAgIGtleXMgICAgICAgIDYgICAgICAgICAgICAgIFVTSE9SVFsyNTZdICAgICBzdWItaGVhZGVyIGtleXMgICAgICAgICAgKi8KLSAgLyogICBzdWJzICAgICAgICA1MTggICAgICAgICAgICBTVUJIRUFEW05TVUJTXSAgc3ViLWhlYWRlcnMgYXJyYXkgICAgICAgICovCi0gIC8qICAgZ2x5cGhfaWRzICAgNTE4K05TVUIqOCAgICAgVVNIT1JUW10gICAgICAgIGdseXBoIElEIGFycmF5ICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGBrZXlzJyB0YWJsZSBpcyB1c2VkIHRvIG1hcCBjaGFyY29kZSBoaWdoLWJ5dGVzIHRvIHN1Yi1oZWFkZXJzLiAgICovCi0gIC8qIFRoZSB2YWx1ZSBvZiBgTlNVQlMnIGlzIHRoZSBudW1iZXIgb2Ygc3ViLWhlYWRlcnMgZGVmaW5lZCBpbiB0aGUgICAgICAqLwotICAvKiB0YWJsZSBhbmQgaXMgY29tcHV0ZWQgYnkgZmluZGluZyB0aGUgbWF4aW11bSBvZiB0aGUgYGtleXMnIHRhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBmb3IgYW55IG4sIGBrZXlzW25dJyBpcyBhIGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgYHN1YnMnICAgICAqLwotICAvKiB0YWJsZSwgaS5lLiwgaXQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgc3ViLWhlYWRlciBpbmRleCBtdWx0aXBsaWVkICAgICAgKi8KLSAgLyogYnkgOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFYWNoIHN1Yi1oZWFkZXIgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgVFlQRSAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmaXJzdCAgICAgICAwICAgICAgICAgICBVU0hPUlQgICAgICAgICAgZmlyc3QgdmFsaWQgbG93LWJ5dGUgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgMiAgICAgICAgICAgVVNIT1JUICAgICAgICAgIG51bWJlciBvZiB2YWxpZCBsb3ctYnl0ZXMgICAqLwotICAvKiAgIGRlbHRhICAgICAgIDQgICAgICAgICAgIFNIT1JUICAgICAgICAgICBzZWUgYmVsb3cgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBvZmZzZXQgICAgICA2ICAgICAgICAgICBVU0hPUlQgICAgICAgICAgc2VlIGJlbG93ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHN1Yi1oZWFkZXIgZGVmaW5lcywgZm9yIGVhY2ggaGlnaC1ieXRlLCB0aGUgcmFuZ2Ugb2YgdmFsaWQgICAgICAgICAgKi8KLSAgLyogbG93LWJ5dGVzIHdpdGhpbiB0aGUgY2hhcm1hcC4gIE5vdGUgdGhhdCB0aGUgcmFuZ2UgZGVmaW5lZCBieSBgZmlyc3QnICovCi0gIC8qIGFuZCBgY291bnQnIG11c3QgYmUgY29tcGxldGVseSBpbmNsdWRlZCBpbiB0aGUgaW50ZXJ2YWwgWzAuLjI1NV0gICAgICAqLwotICAvKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIGEgY2hhcmFjdGVyIGNvZGUgaXMgY29udGFpbmVkIHdpdGhpbiBhIGdpdmVuIHN1Yi1oZWFkZXIsIHRoZW4gICAgICAqLwotICAvKiBtYXBwaW5nIGl0IHRvIGEgZ2x5cGggaW5kZXggaXMgZG9uZSBhcyBmb2xsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICogVGhlIHZhbHVlIG9mIGBvZmZzZXQnIGlzIHJlYWQuICBUaGlzIGlzIGEgX2J5dGVfIGRpc3RhbmNlIGZyb20gdGhlICAqLwotICAvKiAgIGxvY2F0aW9uIG9mIHRoZSBgb2Zmc2V0JyBmaWVsZCBpdHNlbGYgaW50byBhIHNsaWNlIG9mIHRoZSAgICAgICAgICAgKi8KLSAgLyogICBgZ2x5cGhfaWRzJyB0YWJsZS4gIExldCdzIGNhbGwgaXQgYHNsaWNlJyAoaXQgaXMgYSBVU0hPUlRbXSwgdG9vKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAqIFRoZSB2YWx1ZSBgc2xpY2VbY2hhci5sbyAtIGZpcnN0XScgaXMgcmVhZC4gIElmIGl0IGlzIDAsIHRoZXJlIGlzICAgKi8KLSAgLyogICBubyBnbHlwaCBmb3IgdGhlIGNoYXJjb2RlLiAgT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgYGRlbHRhJyBpcyAgICAgICovCi0gIC8qICAgYWRkZWQgdG8gaXQgKG1vZHVsbyA2NTUzNikgdG8gZm9ybSBhIG5ldyBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgaXMgdXAgdG8gdGhlIHZhbGlkYXRpb24gcm91dGluZSB0byBjaGVjayB0aGF0IGFsbCBvZmZzZXRzIGZhbGwgICAgICovCi0gIC8qIHdpdGhpbiB0aGUgZ2x5cGggSURzIHRhYmxlIChhbmQgbm90IHdpdGhpbiB0aGUgYHN1YnMnIHRhYmxlIGl0c2VsZiBvciAqLwotICAvKiBvdXRzaWRlIG9mIHRoZSBDTWFwKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMgotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMl92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIGxlbmd0aDsKLQotICAgIEZUX1VJbnQgICBuLCBtYXhfc3ViczsKLSAgICBGVF9CeXRlKiAga2V5czsgICAgICAgIC8qIGtleXMgdGFibGUgICAgICovCi0gICAgRlRfQnl0ZSogIHN1YnM7ICAgICAgICAvKiBzdWItaGVhZGVycyAgICAqLwotICAgIEZUX0J5dGUqICBnbHlwaF9pZHM7ICAgLyogZ2x5cGggSUQgYXJyYXkgKi8KLQotCi0gICAgaWYgKCB0YWJsZSArIDIgKyAyID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgcCAgICAgID0gdGFibGUgKyAyOyAgICAgICAgICAgLyogc2tpcCBmb3JtYXQgKi8KLSAgICBsZW5ndGggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgaWYgKCB0YWJsZSArIGxlbmd0aCA+IHZhbGlkLT5saW1pdCB8fCBsZW5ndGggPCA2ICsgNTEyICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAga2V5cyA9IHRhYmxlICsgNjsKLQotICAgIC8qIHBhcnNlIGtleXMgdG8gY29tcHV0ZSBzdWItaGVhZGVycyBjb3VudCAqLwotICAgIHAgICAgICAgID0ga2V5czsKLSAgICBtYXhfc3VicyA9IDA7Ci0gICAgZm9yICggbiA9IDA7IG4gPCAyNTY7IG4rKyApCi0gICAgewotICAgICAgRlRfVUludCAgaWR4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLQotCi0gICAgICAvKiB2YWx1ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDggKi8KLSAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICYmICggaWR4ICYgNyApICE9IDAgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgIGlkeCA+Pj0gMzsKLQotICAgICAgaWYgKCBpZHggPiBtYXhfc3VicyApCi0gICAgICAgIG1heF9zdWJzID0gaWR4OwotICAgIH0KLQotICAgIEZUX0FTU0VSVCggcCA9PSB0YWJsZSArIDUxOCApOwotCi0gICAgc3VicyAgICAgID0gcDsKLSAgICBnbHlwaF9pZHMgPSBzdWJzICsgKCBtYXhfc3VicyArIDEgKSAqIDg7Ci0gICAgaWYgKCBnbHlwaF9pZHMgPiB2YWxpZC0+bGltaXQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBwYXJzZSBzdWItaGVhZGVycyAqLwotICAgIGZvciAoIG4gPSAwOyBuIDw9IG1heF9zdWJzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGZpcnN0X2NvZGUsIGNvZGVfY291bnQsIG9mZnNldDsKLSAgICAgIEZUX0ludCAgIGRlbHRhOwotCi0KLSAgICAgIGZpcnN0X2NvZGUgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgY29kZV9jb3VudCA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBkZWx0YSAgICAgID0gVFRfTkVYVF9TSE9SVCggcCApOwotICAgICAgb2Zmc2V0ICAgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIC8qIG1hbnkgRHluYWxhYiBmb250cyBoYXZlIGVtcHR5IHN1Yi1oZWFkZXJzICovCi0gICAgICBpZiAoIGNvZGVfY291bnQgPT0gMCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBjaGVjayByYW5nZSB3aXRoaW4gMC4uMjU1ICovCi0gICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9QQVJBTk9JRCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZmlyc3RfY29kZSA+PSAyNTYgfHwgZmlyc3RfY29kZSArIGNvZGVfY291bnQgPiAyNTYgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICAgIH0KLQotICAgICAgLyogY2hlY2sgb2Zmc2V0ICovCi0gICAgICBpZiAoIG9mZnNldCAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIGlkczsKLQotCi0gICAgICAgIGlkcyA9IHAgLSAyICsgb2Zmc2V0OwotICAgICAgICBpZiAoIGlkcyA8IGdseXBoX2lkcyB8fCBpZHMgKyBjb2RlX2NvdW50ICogMiA+IHRhYmxlICsgbGVuZ3RoICkKLSAgICAgICAgICBGVF9JTlZBTElEX09GRlNFVDsKLQotICAgICAgICAvKiBjaGVjayBnbHlwaCBJRHMgKi8KLSAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIGxpbWl0ID0gcCArIGNvZGVfY291bnQgKiAyOwotICAgICAgICAgIEZUX1VJbnQgICBpZHg7Ci0KLQotICAgICAgICAgIGZvciAoIDsgcCA8IGxpbWl0OyApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWR4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIGlmICggaWR4ICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZHggPSAoRlRfVUludCkoIChGVF9JbnQpaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0gICAgICAgICAgICAgIGlmICggaWR4ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIHJldHVybiBzdWIgaGVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSAqLwotICAvKiBOVUxMIG9uIGludmFsaWQgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0J5dGUqCi0gIHR0X2NtYXAyX2dldF9zdWJoZWFkZXIoIEZUX0J5dGUqICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0J5dGUqICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGNoYXJfY29kZSA8IDB4MTAwMDBVTCApCi0gICAgewotICAgICAgRlRfVUludCAgIGNoYXJfbG8gPSAoRlRfVUludCkoIGNoYXJfY29kZSAmIDB4RkYgKTsKLSAgICAgIEZUX1VJbnQgICBjaGFyX2hpID0gKEZUX1VJbnQpKCBjaGFyX2NvZGUgPj4gOCApOwotICAgICAgRlRfQnl0ZSogIHAgICAgICAgPSB0YWJsZSArIDY7ICAgIC8qIGtleXMgdGFibGUgKi8KLSAgICAgIEZUX0J5dGUqICBzdWJzICAgID0gdGFibGUgKyA1MTg7ICAvKiBzdWJoZWFkZXJzIHRhYmxlICovCi0gICAgICBGVF9CeXRlKiAgc3ViOwotCi0KLSAgICAgIGlmICggY2hhcl9oaSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogYW4gOC1iaXQgY2hhcmFjdGVyIGNvZGUgLS0gd2UgdXNlIHN1YkhlYWRlciAwIGluIHRoaXMgY2FzZSAqLwotICAgICAgICAvKiB0byB0ZXN0IHdoZXRoZXIgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGluIHRoZSBjaGFybWFwICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgc3ViID0gc3ViczsgIC8qIGp1bXAgdG8gZmlyc3Qgc3ViLWhlYWRlciAqLwotCi0gICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIHN1Yi1oZWFkZXIgZm9yIHRoaXMgYnl0ZSBpcyAwLCB3aGljaCAqLwotICAgICAgICAvKiBpbmRpY2F0ZXMgdGhhdCBpdCBpcyByZWFsbHkgYSB2YWxpZCBvbmUtYnl0ZSB2YWx1ZSAgKi8KLSAgICAgICAgLyogT3RoZXJ3aXNlLCByZXR1cm4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBwICs9IGNoYXJfbG8gKiAyOwotICAgICAgICBpZiAoIFRUX1BFRUtfVVNIT1JUKCBwICkgIT0gMCApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBhIDE2LWJpdCBjaGFyYWN0ZXIgY29kZSAqLwotCi0gICAgICAgIC8qIGp1bXAgdG8ga2V5IGVudHJ5ICAqLwotICAgICAgICBwICArPSBjaGFyX2hpICogMjsKLSAgICAgICAgLyoganVtcCB0byBzdWItaGVhZGVyICovCi0gICAgICAgIHN1YiA9IHN1YnMgKyAoIEZUX1BBRF9GTE9PUiggVFRfUEVFS19VU0hPUlQoIHAgKSwgOCApICk7Ci0KLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgaGlnaCBieXRlIGlzbid0IGEgdmFsaWQgb25lLWJ5dGUgdmFsdWUgKi8KLSAgICAgICAgaWYgKCBzdWIgPT0gc3VicyApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgcmVzdWx0ID0gc3ViOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHR0X2NtYXAyX2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogIHRhYmxlICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQgICByZXN1bHQgID0gMDsKLSAgICBGVF9CeXRlKiAgc3ViaGVhZGVyOwotCi0KLSAgICBzdWJoZWFkZXIgPSB0dF9jbWFwMl9nZXRfc3ViaGVhZGVyKCB0YWJsZSwgY2hhcl9jb2RlICk7Ci0gICAgaWYgKCBzdWJoZWFkZXIgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBwICAgPSBzdWJoZWFkZXI7Ci0gICAgICBGVF9VSW50ICAgaWR4ID0gKEZUX1VJbnQpKGNoYXJfY29kZSAmIDB4RkYpOwotICAgICAgRlRfVUludCAgIHN0YXJ0LCBjb3VudDsKLSAgICAgIEZUX0ludCAgICBkZWx0YTsKLSAgICAgIEZUX1VJbnQgICBvZmZzZXQ7Ci0KLQotICAgICAgc3RhcnQgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGNvdW50ICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBkZWx0YSAgPSBUVF9ORVhUX1NIT1JUICggcCApOwotICAgICAgb2Zmc2V0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgaWR4IC09IHN0YXJ0OwotICAgICAgaWYgKCBpZHggPCBjb3VudCAmJiBvZmZzZXQgIT0gMCApCi0gICAgICB7Ci0gICAgICAgIHAgICs9IG9mZnNldCArIDIgKiBpZHg7Ci0gICAgICAgIGlkeCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgaWYgKCBpZHggIT0gMCApCi0gICAgICAgICAgcmVzdWx0ID0gKEZUX1VJbnQpKCAoRlRfSW50KWlkeCArIGRlbHRhICkgJiAweEZGRkZVOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdHRfY21hcDJfY2hhcl9uZXh0KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgID0gY21hcC0+ZGF0YTsKLSAgICBGVF9VSW50ICAgIGdpbmRleCAgID0gMDsKLSAgICBGVF9VSW50MzIgIHJlc3VsdCAgID0gMDsKLSAgICBGVF9VSW50MzIgIGNoYXJjb2RlID0gKnBjaGFyY29kZSArIDE7Ci0gICAgRlRfQnl0ZSogICBzdWJoZWFkZXI7Ci0KLQotICAgIHdoaWxlICggY2hhcmNvZGUgPCAweDEwMDAwVUwgKQotICAgIHsKLSAgICAgIHN1YmhlYWRlciA9IHR0X2NtYXAyX2dldF9zdWJoZWFkZXIoIHRhYmxlLCBjaGFyY29kZSApOwotICAgICAgaWYgKCBzdWJoZWFkZXIgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgcCAgICAgICA9IHN1YmhlYWRlcjsKLSAgICAgICAgRlRfVUludCAgIHN0YXJ0ICAgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBGVF9VSW50ICAgY291bnQgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIEZUX0ludCAgICBkZWx0YSAgID0gVFRfTkVYVF9TSE9SVCAoIHAgKTsKLSAgICAgICAgRlRfVUludCAgIG9mZnNldCAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICBGVF9VSW50ICAgY2hhcl9sbyA9IChGVF9VSW50KSggY2hhcmNvZGUgJiAweEZGICk7Ci0gICAgICAgIEZUX1VJbnQgICBwb3MsIGlkeDsKLQotCi0gICAgICAgIGlmICggb2Zmc2V0ID09IDAgKQotICAgICAgICAgIGdvdG8gTmV4dF9TdWJIZWFkZXI7Ci0KLSAgICAgICAgaWYgKCBjaGFyX2xvIDwgc3RhcnQgKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhcl9sbyA9IHN0YXJ0OwotICAgICAgICAgIHBvcyAgICAgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwb3MgPSAoRlRfVUludCkoIGNoYXJfbG8gLSBzdGFydCApOwotCi0gICAgICAgIHAgICAgICAgKz0gb2Zmc2V0ICsgcG9zICogMjsKLSAgICAgICAgY2hhcmNvZGUgPSBGVF9QQURfRkxPT1IoIGNoYXJjb2RlLCAyNTYgKSArIGNoYXJfbG87Ci0KLSAgICAgICAgZm9yICggOyBwb3MgPCBjb3VudDsgcG9zKyssIGNoYXJjb2RlKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWR4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICAgIGlmICggaWR4ICE9IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggKEZUX0ludClpZHggKyBkZWx0YSApICYgMHhGRkZGVTsKLSAgICAgICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBjaGFyY29kZTsKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBqdW1wIHRvIG5leHQgc3ViLWhlYWRlciwgaS5lLiBoaWdoZXIgYnl0ZSB2YWx1ZSAqLwotICAgIE5leHRfU3ViSGVhZGVyOgotICAgICAgY2hhcmNvZGUgPSBGVF9QQURfRkxPT1IoIGNoYXJjb2RlLCAyNTYgKSArIDI1NjsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICAqcGNoYXJjb2RlID0gcmVzdWx0OwotCi0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAyX2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA0OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gMjsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfVFRfQ01BUCgKLSAgICB0dF9jbWFwMl9jbGFzc19yZWMsCi0KLSAgICAgIHNpemVvZiAoIFRUX0NNYXBSZWMgKSwKLQotICAgICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwX2luaXQsICAgICAgICAgLyogaW5pdCAgICAgICAqLwotICAgICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBOVUxMLCAgICAgICAgICAgICAgICAgLyogZG9uZSAgICAgICAqLwotICAgICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwMl9jaGFyX2luZGV4LCAgLyogY2hhcl9pbmRleCAqLwotICAgICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0dF9jbWFwMl9jaGFyX25leHQsICAgLyogY2hhcl9uZXh0ICAqLwotCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySW5kZXhGdW5jKSAgICBOVUxMLCAgLyogY2hhcl92YXJfaW5kZXggICAqLwotICAgICAgKEZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMpTlVMTCwgIC8qIGNoYXJfdmFyX2RlZmF1bHQgKi8KLSAgICAgIChGVF9DTWFwX1ZhcmlhbnRMaXN0RnVuYykgICAgIE5VTEwsICAvKiB2YXJpYW50X2xpc3QgICAgICovCi0gICAgICAoRlRfQ01hcF9DaGFyVmFyaWFudExpc3RGdW5jKSBOVUxMLCAgLyogY2hhcnZhcmlhbnRfbGlzdCAqLwotICAgICAgKEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYykgTlVMTCwgIC8qIHZhcmlhbnRjaGFyX2xpc3QgKi8KLQotICAgIDIsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKXR0X2NtYXAyX3ZhbGlkYXRlLCAgLyogdmFsaWRhdGUgICAgICAqLwotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYyl0dF9jbWFwMl9nZXRfaW5mbyAgIC8qIGdldF9jbWFwX2luZm8gKi8KLSAgKQotCi0jZW5kaWYgLyogVFRfQ09ORklHX0NNQVBfRk9STUFUXzIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICAgIE9GRlNFVCAgICAgICAgIFRZUEUgICAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgbXVzdCBiZSA0ICAgICAgICAgICAgKi8KLSAgLyogICBsZW5ndGggICAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIHRhYmxlIGxlbmd0aCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBieXRlcyAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgICAgNCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc2VnQ291bnRYMiAgICA2ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAyKk5VTV9TRUdTICAgICAgICAgICAqLwotICAvKiAgIHNlYXJjaFJhbmdlICAgOCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgMiooMSA8PCBMT0dfU0VHUykgICAgKi8KLSAgLyogICBlbnRyeVNlbGVjdG9yIDEwICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIExPR19TRUdTICAgICAgICAgICAgICovCi0gIC8qICAgcmFuZ2VTaGlmdCAgICAxMiAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICBzZWdDb3VudFgyIC0gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hSYW5nZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZW5kQ291bnQgICAgICAxNCAgICAgICAgICAgICBVU0hPUlRbTlVNX1NFR1NdICBlbmQgY2hhcmNvZGUgZm9yICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZWdtZW50OyBsYXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIDB4RkZGRiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHBhZCAgICAgICAgICAgMTQrTlVNX1NFR1MqMiAgVVNIT1JUICAgICAgICAgICAgcGFkZGluZyAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRDb3VudCAgICAxNitOVU1fU0VHUyoyICBVU0hPUlRbTlVNX1NFR1NdICBmaXJzdCBjaGFyY29kZSBmb3IgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZWdtZW50ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgaWREZWx0YSAgICAgICAxNitOVU1fU0VHUyo0ICBTSE9SVFtOVU1fU0VHU10gICBkZWx0YSBmb3IgZWFjaCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCAgICAgICAgICAgICAgKi8KLSAgLyogICBpZE9mZnNldCAgICAgIDE2K05VTV9TRUdTKjYgIFNIT1JUW05VTV9TRUdTXSAgIHJhbmdlIG9mZnNldCBmb3IgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlZ21lbnQ7IGNhbiBiZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZ2x5cGhJZHMgICAgICAxNitOVU1fU0VHUyo4ICBVU0hPUlRbXSAgICAgICAgICBhcnJheSBvZiBnbHlwaCBJRCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENoYXJhY3RlciBjb2RlcyBhcmUgbW9kZWxsZWQgYnkgYSBzZXJpZXMgb2Ygb3JkZXJlZCAoaW5jcmVhc2luZykgICAgICAqLwotICAvKiBpbnRlcnZhbHMgY2FsbGVkIHNlZ21lbnRzLiAgRWFjaCBzZWdtZW50IGhhcyBzdGFydCBhbmQgZW5kIGNvZGVzLCAgICAgKi8KLSAgLyogcHJvdmlkZWQgYnkgdGhlIGBzdGFydENvdW50JyBhbmQgYGVuZENvdW50JyBhcnJheXMuICBTZWdtZW50cyBtdXN0ICAgICovCi0gIC8qIG5vdCBvdmVybGFwLCBhbmQgdGhlIGxhc3Qgc2VnbWVudCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gdGhlIHZhbHVlICAgICAqLwotICAvKiAweEZGRkYgZm9yIGBlbmRDb3VudCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBmaWVsZHMgYHNlYXJjaFJhbmdlJywgYGVudHJ5U2VsZWN0b3InIGFuZCBgcmFuZ2VTaGlmdCcgYXJlIGJldHRlciAqLwotICAvKiBpZ25vcmVkICh0aGV5IGFyZSB0cmFjZXMgb2Ygb3Zlci1lbmdpbmVlcmluZyBpbiB0aGUgVHJ1ZVR5cGUgICAgICAgICAgKi8KLSAgLyogc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFYWNoIHNlZ21lbnQgYWxzbyBoYXMgYSBzaWduZWQgYGRlbHRhJywgYXMgd2VsbCBhcyBhbiBvcHRpb25hbCBvZmZzZXQgKi8KLSAgLyogd2l0aGluIHRoZSBgZ2x5cGhJZHMnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBhIHNlZ21lbnQncyBpZE9mZnNldCBpcyAwLCB0aGUgZ2x5cGggaW5kZXggY29ycmVzcG9uZGluZyB0byBhbnkgICAgKi8KLSAgLyogY2hhcmNvZGUgd2l0aGluIHRoZSBzZWdtZW50IGlzIG9idGFpbmVkIGJ5IGFkZGluZyB0aGUgdmFsdWUgb2YgICAgICAgICovCi0gIC8qIGBpZERlbHRhJyBkaXJlY3RseSB0byB0aGUgY2hhcmNvZGUsIG1vZHVsbyA2NTUzNi4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3RoZXJ3aXNlLCBhIGdseXBoIGluZGV4IGlzIHRha2VuIGZyb20gdGhlIGdseXBoIElEcyBzdWItYXJyYXkgZm9yICAgICovCi0gIC8qIHRoZSBzZWdtZW50LCBhbmQgdGhlIHZhbHVlIG9mIGBpZERlbHRhJyBpcyBhZGRlZCB0byBpdC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZpbmFsbHksIG5vdGUgdGhhdCBhIGxvdCBvZiBmb250cyBjb250YWluIGFuIGludmFsaWQgbGFzdCBzZWdtZW50LCAgICAqLwotICAvKiB3aGVyZSBgc3RhcnQnIGFuZCBgZW5kJyBhcmUgY29ycmVjdGx5IHNldCB0byAweEZGRkYgYnV0IGJvdGggYGRlbHRhJyAgKi8KLSAgLyogYW5kIGBvZmZzZXQnIGFyZSBpbmNvcnJlY3QgKGUuZy4sIGBvcGVuc19fXy50dGYnIHdoaWNoIGNvbWVzIHdpdGggICAgICovCi0gIC8qIE9wZW5PZmZpY2Uub3JnKS4gIFdlIG5lZWQgc3BlY2lhbCBjb2RlIHRvIGRlYWwgd2l0aCB0aGVtIGNvcnJlY3RseS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF80Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXA0UmVjXwotICB7Ci0gICAgVFRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VSW50MzIgICBjdXJfY2hhcmNvZGU7ICAgLyogY3VycmVudCBjaGFyY29kZSAqLwotICAgIEZUX1VJbnQgICAgIGN1cl9naW5kZXg7ICAgICAvKiBjdXJyZW50IGdseXBoIGluZGV4ICovCi0KLSAgICBGVF9VSW50ICAgICBudW1fcmFuZ2VzOwotICAgIEZUX1VJbnQgICAgIGN1cl9yYW5nZTsKLSAgICBGVF9VSW50ICAgICBjdXJfc3RhcnQ7Ci0gICAgRlRfVUludCAgICAgY3VyX2VuZDsKLSAgICBGVF9JbnQgICAgICBjdXJfZGVsdGE7Ci0gICAgRlRfQnl0ZSogICAgY3VyX3ZhbHVlczsKLQotICB9IFRUX0NNYXA0UmVjLCAqVFRfQ01hcDQ7Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDRfaW5pdCggVFRfQ01hcDQgIGNtYXAsCi0gICAgICAgICAgICAgICAgIEZUX0J5dGUqICB0YWJsZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLQotCi0gICAgY21hcC0+Y21hcC5kYXRhICAgID0gdGFibGU7Ci0KLSAgICBwICAgICAgICAgICAgICAgICAgPSB0YWJsZSArIDY7Ci0gICAgY21hcC0+bnVtX3JhbmdlcyAgID0gRlRfUEVFS19VU0hPUlQoIHAgKSA+PiAxOwotICAgIGNtYXAtPmN1cl9jaGFyY29kZSA9IChGVF9VSW50MzIpMHhGRkZGRkZGRlVMOwotICAgIGNtYXAtPmN1cl9naW5kZXggICA9IDA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfSW50Ci0gIHR0X2NtYXA0X3NldF9yYW5nZSggVFRfQ01hcDQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHJhbmdlX2luZGV4ICkKLSAgewotICAgIEZUX0J5dGUqICB0YWJsZSA9IGNtYXAtPmNtYXAuZGF0YTsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VSW50ICAgbnVtX3JhbmdlcyA9IGNtYXAtPm51bV9yYW5nZXM7Ci0KLQotICAgIHdoaWxlICggcmFuZ2VfaW5kZXggPCBudW1fcmFuZ2VzICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBvZmZzZXQ7Ci0KLQotICAgICAgcCAgICAgICAgICAgICA9IHRhYmxlICsgMTQgKyByYW5nZV9pbmRleCAqIDI7Ci0gICAgICBjbWFwLT5jdXJfZW5kID0gRlRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgcCAgICAgICAgICAgICAgKz0gMiArIG51bV9yYW5nZXMgKiAyOwotICAgICAgY21hcC0+Y3VyX3N0YXJ0ID0gRlRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgcCAgICAgICAgICAgICAgKz0gbnVtX3JhbmdlcyAqIDI7Ci0gICAgICBjbWFwLT5jdXJfZGVsdGEgPSBGVF9QRUVLX1NIT1JUKCBwICk7Ci0KLSAgICAgIHAgICAgICs9IG51bV9yYW5nZXMgKiAyOwotICAgICAgb2Zmc2V0ID0gRlRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgLyogc29tZSBmb250cyBoYXZlIGFuIGluY29ycmVjdCBsYXN0IHNlZ21lbnQ7ICovCi0gICAgICAvKiB3ZSBoYXZlIHRvIGNhdGNoIGl0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggcmFuZ2VfaW5kZXggICAgID49IG51bV9yYW5nZXMgLSAxICYmCi0gICAgICAgICAgIGNtYXAtPmN1cl9zdGFydCA9PSAweEZGRkZVICAgICAgICAmJgotICAgICAgICAgICBjbWFwLT5jdXJfZW5kICAgPT0gMHhGRkZGVSAgICAgICAgKQotICAgICAgewotICAgICAgICBUVF9GYWNlICAgZmFjZSAgPSAoVFRfRmFjZSljbWFwLT5jbWFwLmNtYXAuY2hhcm1hcC5mYWNlOwotICAgICAgICBGVF9CeXRlKiAgbGltaXQgPSBmYWNlLT5jbWFwX3RhYmxlICsgZmFjZS0+Y21hcF9zaXplOwotCi0KLSAgICAgICAgaWYgKCBvZmZzZXQgJiYgcCArIG9mZnNldCArIDIgPiBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBjbWFwLT5jdXJfZGVsdGEgPSAxOwotICAgICAgICAgIG9mZnNldCAgICAgICAgICA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBvZmZzZXQgIT0gMHhGRkZGVSApCi0gICAgICB7Ci0gICAgICAgIGNtYXAtPmN1cl92YWx1ZXMgPSBvZmZzZXQgPyBwICsgb2Zmc2V0IDogTlVMTDsKLSAgICAgICAgY21hcC0+Y3VyX3JhbmdlICA9IHJhbmdlX2luZGV4OwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgLyogd2Ugc2tpcCBlbXB0eSBzZWdtZW50cyAqLwotICAgICAgcmFuZ2VfaW5kZXgrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotCi0gIC8qIHNlYXJjaCB0aGUgaW5kZXggb2YgdGhlIGNoYXJjb2RlIG5leHQgdG8gY21hcC0+Y3VyX2NoYXJjb2RlOyAqLwotICAvKiBjYWxsZXIgc2hvdWxkIGNhbGwgdHRfY21hcDRfc2V0X3JhbmdlIHdpdGggcHJvcGVyIHJhbmdlICAgICAgKi8KLSAgLyogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICB0dF9jbWFwNF9uZXh0KCBUVF9DTWFwNCAgY21hcCApCi0gIHsKLSAgICBUVF9GYWNlICAgZmFjZSAgPSAoVFRfRmFjZSljbWFwLT5jbWFwLmNtYXAuY2hhcm1hcC5mYWNlOwotICAgIEZUX0J5dGUqICBsaW1pdCA9IGZhY2UtPmNtYXBfdGFibGUgKyBmYWNlLT5jbWFwX3NpemU7Ci0KLSAgICBGVF9VSW50ICBjaGFyY29kZTsKLQotCi0gICAgaWYgKCBjbWFwLT5jdXJfY2hhcmNvZGUgPj0gMHhGRkZGVUwgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgY2hhcmNvZGUgPSAoRlRfVUludCljbWFwLT5jdXJfY2hhcmNvZGUgKyAxOwotCi0gICAgaWYgKCBjaGFyY29kZSA8IGNtYXAtPmN1cl9zdGFydCApCi0gICAgICBjaGFyY29kZSA9IGNtYXAtPmN1cl9zdGFydDsKLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgRlRfQnl0ZSogIHZhbHVlcyA9IGNtYXAtPmN1cl92YWx1ZXM7Ci0gICAgICBGVF9VSW50ICAgZW5kICAgID0gY21hcC0+Y3VyX2VuZDsKLSAgICAgIEZUX0ludCAgICBkZWx0YSAgPSBjbWFwLT5jdXJfZGVsdGE7Ci0KLQotICAgICAgaWYgKCBjaGFyY29kZSA8PSBlbmQgKQotICAgICAgewotICAgICAgICBpZiAoIHZhbHVlcyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgcCA9IHZhbHVlcyArIDIgKiAoIGNoYXJjb2RlIC0gY21hcC0+Y3VyX3N0YXJ0ICk7Ci0KLQotICAgICAgICAgIC8qIGlmIHAgPiBsaW1pdCwgdGhlIHdob2xlIHNlZ21lbnQgaXMgaW52YWxpZCAqLwotICAgICAgICAgIGlmICggcCA+IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gTmV4dF9TZWdtZW50OwotCi0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBnaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgICAgICAgIGlmICggZ2luZGV4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCAoRlRfSW50KWdpbmRleCArIGRlbHRhICkgJiAweEZGRkZVOwotICAgICAgICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyY29kZTsKLSAgICAgICAgICAgICAgICBjbWFwLT5jdXJfZ2luZGV4ICAgPSBnaW5kZXg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSB3aGlsZSAoICsrY2hhcmNvZGUgPD0gZW5kICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBnaW5kZXggPSAoRlRfVUludCkoIChGVF9JbnQpY2hhcmNvZGUgKyBkZWx0YSApICYgMHhGRkZGVTsKLQotCi0gICAgICAgICAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5yb290Lm51bV9nbHlwaHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiB3ZSBoYXZlIGFuIGludmFsaWQgZ2x5cGggaW5kZXg7IGlmIHRoZXJlIGlzIGFuIG92ZXJmbG93LCAqLwotICAgICAgICAgICAgICAvKiB3ZSBjYW4gYWRqdXN0IGBjaGFyY29kZScsIG90aGVyd2lzZSB0aGUgd2hvbGUgc2VnbWVudCBpcyAqLwotICAgICAgICAgICAgICAvKiBpbnZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBnaW5kZXggPSAwOwotCi0gICAgICAgICAgICAgIGlmICggKEZUX0ludCljaGFyY29kZSArIGRlbHRhIDwgMCAmJgotICAgICAgICAgICAgICAgICAgIChGVF9JbnQpZW5kICsgZGVsdGEgPj0gMCAgICAgKQotICAgICAgICAgICAgICAgIGNoYXJjb2RlID0gKEZUX1VJbnQpKCAtZGVsdGEgKTsKLQotICAgICAgICAgICAgICBlbHNlIGlmICggKEZUX0ludCljaGFyY29kZSArIGRlbHRhIDwgMHgxMDAwMEwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpZW5kICsgZGVsdGEgPj0gMHgxMDAwMEwgICAgICkKLSAgICAgICAgICAgICAgICBjaGFyY29kZSA9IChGVF9VSW50KSggMHgxMDAwMEwgLSBkZWx0YSApOwotCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBnb3RvIE5leHRfU2VnbWVudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBnaW5kZXggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyY29kZTsKLSAgICAgICAgICAgICAgY21hcC0+Y3VyX2dpbmRleCAgID0gZ2luZGV4OwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSB3aGlsZSAoICsrY2hhcmNvZGUgPD0gZW5kICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIE5leHRfU2VnbWVudDoKLSAgICAgIC8qIHdlIG5lZWQgdG8gZmluZCBhbm90aGVyIHJhbmdlICovCi0gICAgICBpZiAoIHR0X2NtYXA0X3NldF9yYW5nZSggY21hcCwgY21hcC0+Y3VyX3JhbmdlICsgMSApIDwgMCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIGNoYXJjb2RlIDwgY21hcC0+Y3VyX3N0YXJ0ICkKLSAgICAgICAgY2hhcmNvZGUgPSBjbWFwLT5jdXJfc3RhcnQ7Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgY21hcC0+Y3VyX2NoYXJjb2RlID0gKEZUX1VJbnQzMikweEZGRkZGRkZGVUw7Ci0gICAgY21hcC0+Y3VyX2dpbmRleCAgID0gMDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA0X3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VSW50ICAgbGVuZ3RoOwotCi0gICAgRlRfQnl0ZSAgICplbmRzLCAqc3RhcnRzLCAqb2Zmc2V0cywgKmRlbHRhcywgKmdseXBoX2lkczsKLSAgICBGVF9VSW50ICAgbnVtX3NlZ3M7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIHRhYmxlICsgMiArIDIgPiB2YWxpZC0+bGltaXQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBwICAgICAgPSB0YWJsZSArIDI7ICAgICAgICAgICAvKiBza2lwIGZvcm1hdCAqLwotICAgIGxlbmd0aCA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAvKiBpbiBjZXJ0YWluIGZvbnRzLCB0aGUgYGxlbmd0aCcgZmllbGQgaXMgaW52YWxpZCBhbmQgZ29lcyAqLwotICAgIC8qIG91dCBvZiBib3VuZC4gIFdlIHRyeSB0byBjb3JyZWN0IHRoaXMgaGVyZS4uLiAgICAgICAgICAgICovCi0gICAgaWYgKCB0YWJsZSArIGxlbmd0aCA+IHZhbGlkLT5saW1pdCApCi0gICAgewotICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgICAgbGVuZ3RoID0gKEZUX1VJbnQpKCB2YWxpZC0+bGltaXQgLSB0YWJsZSApOwotICAgIH0KLQotICAgIGlmICggbGVuZ3RoIDwgMTYgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBwICAgICAgICA9IHRhYmxlICsgNjsKLSAgICBudW1fc2VncyA9IFRUX05FWFRfVVNIT1JUKCBwICk7ICAgLyogcmVhZCBzZWdDb3VudFgyICovCi0KLSAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9QQVJBTk9JRCApCi0gICAgewotICAgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGFuIGV2ZW4gdmFsdWUgaGVyZSAqLwotICAgICAgaWYgKCBudW1fc2VncyAmIDEgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gICAgbnVtX3NlZ3MgLz0gMjsKLQotICAgIGlmICggbGVuZ3RoIDwgMTYgKyBudW1fc2VncyAqIDIgKiA0ICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgLyogY2hlY2sgdGhlIHNlYXJjaCBwYXJhbWV0ZXJzIC0gZXZlbiB0aG91Z2ggd2UgbmV2ZXIgdXNlIHRoZW0gKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayB0aGUgdmFsdWVzIG9mIGBzZWFyY2hSYW5nZScsIGBlbnRyeVNlbGVjdG9yJywgYHJhbmdlU2hpZnQnICovCi0gICAgICBGVF9VSW50ICBzZWFyY2hfcmFuZ2UgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBGVF9VSW50ICBlbnRyeV9zZWxlY3RvciA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBGVF9VSW50ICByYW5nZV9zaGlmdCAgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0KLQotICAgICAgaWYgKCAoIHNlYXJjaF9yYW5nZSB8IHJhbmdlX3NoaWZ0ICkgJiAxICkgIC8qIG11c3QgYmUgZXZlbiB2YWx1ZXMgKi8KLSAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICBzZWFyY2hfcmFuZ2UgLz0gMjsKLSAgICAgIHJhbmdlX3NoaWZ0ICAvPSAyOwotCi0gICAgICAvKiBgc2VhcmNoIHJhbmdlJyBpcyB0aGUgZ3JlYXRlc3QgcG93ZXIgb2YgMiB0aGF0IGlzIDw9IG51bV9zZWdzICovCi0KLSAgICAgIGlmICggc2VhcmNoX3JhbmdlICAgICAgICAgICAgICAgID4gbnVtX3NlZ3MgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHNlYXJjaF9yYW5nZSAqIDIgICAgICAgICAgICA8IG51bV9zZWdzICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBzZWFyY2hfcmFuZ2UgKyByYW5nZV9zaGlmdCAhPSBudW1fc2VncyAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgc2VhcmNoX3JhbmdlICAgICAgICAgICAgICAgIT0gKCAxVSA8PCBlbnRyeV9zZWxlY3RvciApICkKLSAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgIH0KLQotICAgIGVuZHMgICAgICA9IHRhYmxlICAgKyAxNDsKLSAgICBzdGFydHMgICAgPSB0YWJsZSAgICsgMTYgKyBudW1fc2VncyAqIDI7Ci0gICAgZGVsdGFzICAgID0gc3RhcnRzICArIG51bV9zZWdzICogMjsKLSAgICBvZmZzZXRzICAgPSBkZWx0YXMgICsgbnVtX3NlZ3MgKiAyOwotICAgIGdseXBoX2lkcyA9IG9mZnNldHMgKyBudW1fc2VncyAqIDI7Ci0KLSAgICAvKiBjaGVjayBsYXN0IHNlZ21lbnQ7IGl0cyBlbmQgY291bnQgdmFsdWUgbXVzdCBiZSAweEZGRkYgKi8KLSAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9QQVJBTk9JRCApCi0gICAgewotICAgICAgcCA9IGVuZHMgKyAoIG51bV9zZWdzIC0gMSApICogMjsKLSAgICAgIGlmICggVFRfUEVFS19VU0hPUlQoIHAgKSAhPSAweEZGRkZVICkKLSAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX1VJbnQgICBzdGFydCwgZW5kLCBvZmZzZXQsIG47Ci0gICAgICBGVF9VSW50ICAgbGFzdF9zdGFydCA9IDAsIGxhc3RfZW5kID0gMDsKLSAgICAgIEZUX0ludCAgICBkZWx0YTsKLSAgICAgIEZUX0J5dGUqICBwX3N0YXJ0ICAgPSBzdGFydHM7Ci0gICAgICBGVF9CeXRlKiAgcF9lbmQgICAgID0gZW5kczsKLSAgICAgIEZUX0J5dGUqICBwX2RlbHRhICAgPSBkZWx0YXM7Ci0gICAgICBGVF9CeXRlKiAgcF9vZmZzZXQgID0gb2Zmc2V0czsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9zZWdzOyBuKysgKQotICAgICAgewotICAgICAgICBwICAgICAgPSBwX29mZnNldDsKLSAgICAgICAgc3RhcnQgID0gVFRfTkVYVF9VU0hPUlQoIHBfc3RhcnQgKTsKLSAgICAgICAgZW5kICAgID0gVFRfTkVYVF9VU0hPUlQoIHBfZW5kICk7Ci0gICAgICAgIGRlbHRhICA9IFRUX05FWFRfU0hPUlQoIHBfZGVsdGEgKTsKLSAgICAgICAgb2Zmc2V0ID0gVFRfTkVYVF9VU0hPUlQoIHBfb2Zmc2V0ICk7Ci0KLSAgICAgICAgaWYgKCBzdGFydCA+IGVuZCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgIC8qIHRoaXMgdGVzdCBzaG91bGQgYmUgcGVyZm9ybWVkIGF0IGRlZmF1bHQgdmFsaWRhdGlvbiBsZXZlbDsgKi8KLSAgICAgICAgLyogdW5mb3J0dW5hdGVseSwgc29tZSBwb3B1bGFyIEFzaWFuIGZvbnRzIGhhdmUgb3ZlcmxhcHBpbmcgICAqLwotICAgICAgICAvKiByYW5nZXMgaW4gdGhlaXIgY2hhcm1hcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBzdGFydCA8PSBsYXN0X2VuZCAmJiBuID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGFsbG93IG92ZXJsYXBwaW5nIHNlZ21lbnRzLCBwcm92aWRlZCB0aGVpciBzdGFydCBwb2ludHMgKi8KLSAgICAgICAgICAgIC8qIGFuZCBlbmQgcG9pbnRzLCByZXNwZWN0aXZlbHksIGFyZSBpbiBhc2NlbmRpbmcgb3JkZXIgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggbGFzdF9zdGFydCA+IHN0YXJ0IHx8IGxhc3RfZW5kID4gZW5kICkKLSAgICAgICAgICAgICAgZXJyb3IgfD0gVFRfQ01BUF9GTEFHX1VOU09SVEVEOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlcnJvciB8PSBUVF9DTUFQX0ZMQUdfT1ZFUkxBUFBJTkc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBvZmZzZXQgJiYgb2Zmc2V0ICE9IDB4RkZGRlUgKQotICAgICAgICB7Ci0gICAgICAgICAgcCArPSBvZmZzZXQ7ICAvKiBzdGFydCBvZiBnbHlwaCBJRCBhcnJheSAqLwotCi0gICAgICAgICAgLyogY2hlY2sgdGhhdCB3ZSBwb2ludCB3aXRoaW4gdGhlIGdseXBoIElEcyB0YWJsZSBvbmx5ICovCi0gICAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcCA8IGdseXBoX2lkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgcCArICggZW5kIC0gc3RhcnQgKyAxICkgKiAyID4gdGFibGUgKyBsZW5ndGggKQotICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8qIFNvbWUgZm9udHMgaGFuZGxlIHRoZSBsYXN0IHNlZ21lbnQgaW5jb3JyZWN0bHkuICBJbiAqLwotICAgICAgICAgIC8qIHRoZW9yeSwgMHhGRkZGIG1pZ2h0IHBvaW50IHRvIGFuIG9yZGluYXJ5IGdseXBoIC0tICAqLwotICAgICAgICAgIC8qIGEgY21hcCA0IGlzIHZlcnNhdGlsZSBhbmQgY291bGQgYmUgdXNlZCBmb3IgYW55ICAgICAqLwotICAgICAgICAgIC8qIGVuY29kaW5nLCBub3Qgb25seSBVbmljb2RlLiAgSG93ZXZlciwgcmVhbGl0eSBzaG93cyAqLwotICAgICAgICAgIC8qIHRoYXQgZmFyIHRvbyBtYW55IGZvbnRzIGFyZSBzbG9wcHkgYW5kIGluY29ycmVjdGx5ICAqLwotICAgICAgICAgIC8qIHNldCBhbGwgZmllbGRzIGJ1dCBgc3RhcnQnIGFuZCBgZW5kJyBmb3IgdGhlIGxhc3QgICAqLwotICAgICAgICAgIC8qIHNlZ21lbnQgaWYgaXQgY29udGFpbnMgb25seSBhIHNpbmdsZSBjaGFyYWN0ZXIuICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFdlIHRodXMgb21pdCB0aGUgdGVzdCBoZXJlLCBkZWxheWluZyBpdCB0byB0aGUgICAgICAqLwotICAgICAgICAgIC8qIHJvdXRpbmVzIHRoYXQgYWN0dWFsbHkgYWNjZXNzIHRoZSBjbWFwLiAgICAgICAgICAgICAqLwotICAgICAgICAgIGVsc2UgaWYgKCBuICE9IG51bV9zZWdzIC0gMSAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgISggc3RhcnQgPT0gMHhGRkZGVSAmJiBlbmQgPT0gMHhGRkZGVSApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHAgPCBnbHlwaF9pZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBwICsgKCBlbmQgLSBzdGFydCArIDEgKSAqIDIgPiB2YWxpZC0+bGltaXQgKQotICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogY2hlY2sgZ2x5cGggaW5kaWNlcyB3aXRoaW4gdGhlIHNlZ21lbnQgcmFuZ2UgKi8KLSAgICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgaSwgaWR4OwotCi0KLSAgICAgICAgICAgIGZvciAoIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWR4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgICAgaWYgKCBpZHggIT0gMCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZHggPSAoRlRfVUludCkoIChGVF9JbnQpaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGlkeCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBvZmZzZXQgPT0gMHhGRkZGVSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBzb21lIGZvbnRzIChlcnJvbmVvdXNseT8pIHVzZSBhIHJhbmdlIG9mZnNldCBvZiAweEZGRkYgKi8KLSAgICAgICAgICAvKiB0byBtZWFuIG1pc3NpbmcgZ2x5cGggaW4gY21hcCB0YWJsZSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9QQVJBTk9JRCAgICB8fAotICAgICAgICAgICAgICAgbiAhPSBudW1fc2VncyAtIDEgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAhKCBzdGFydCA9PSAweEZGRkZVICYmIGVuZCA9PSAweEZGRkZVICkgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgICB9Ci0KLSAgICAgICAgbGFzdF9zdGFydCA9IHN0YXJ0OwotICAgICAgICBsYXN0X2VuZCAgID0gZW5kOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgdHRfY21hcDRfY2hhcl9tYXBfbGluZWFyKCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiogIHBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBuZXh0ICkKLSAgewotICAgIFRUX0ZhY2UgICBmYWNlICA9IChUVF9GYWNlKWNtYXAtPmNtYXAuY2hhcm1hcC5mYWNlOwotICAgIEZUX0J5dGUqICBsaW1pdCA9IGZhY2UtPmNtYXBfdGFibGUgKyBmYWNlLT5jbWFwX3NpemU7Ci0KLQotICAgIEZUX1VJbnQgICAgbnVtX3NlZ3MyLCBzdGFydCwgZW5kLCBvZmZzZXQ7Ci0gICAgRlRfSW50ICAgICBkZWx0YTsKLSAgICBGVF9VSW50ICAgIGksIG51bV9zZWdzOwotICAgIEZUX1VJbnQzMiAgY2hhcmNvZGUgPSAqcGNoYXJjb2RlOwotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgPSAwOwotICAgIEZUX0J5dGUqICAgcDsKLSAgICBGVF9CeXRlKiAgIHE7Ci0KLQotICAgIHAgPSBjbWFwLT5kYXRhICsgNjsKLSAgICBudW1fc2VnczIgPSBGVF9QQURfRkxPT1IoIFRUX1BFRUtfVVNIT1JUKCBwICksIDIgKTsKLQotICAgIG51bV9zZWdzID0gbnVtX3NlZ3MyID4+IDE7Ci0KLSAgICBpZiAoICFudW1fc2VncyApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggbmV4dCApCi0gICAgICBjaGFyY29kZSsrOwotCi0gICAgaWYgKCBjaGFyY29kZSA+IDB4RkZGRlUgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBsaW5lYXIgc2VhcmNoICovCi0gICAgcCA9IGNtYXAtPmRhdGEgKyAxNDsgICAgICAgICAgICAgICAvKiBlbmRzIHRhYmxlICAgKi8KLSAgICBxID0gY21hcC0+ZGF0YSArIDE2ICsgbnVtX3NlZ3MyOyAgIC8qIHN0YXJ0cyB0YWJsZSAqLwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fc2VnczsgaSsrICkKLSAgICB7Ci0gICAgICBlbmQgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBzdGFydCA9IFRUX05FWFRfVVNIT1JUKCBxICk7Ci0KLSAgICAgIGlmICggY2hhcmNvZGUgPCBzdGFydCApCi0gICAgICB7Ci0gICAgICAgIGlmICggbmV4dCApCi0gICAgICAgICAgY2hhcmNvZGUgPSBzdGFydDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgQWdhaW46Ci0gICAgICBpZiAoIGNoYXJjb2RlIDw9IGVuZCApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICByOwotCi0KLSAgICAgICAgciAgICAgICA9IHEgLSAyICsgbnVtX3NlZ3MyOwotICAgICAgICBkZWx0YSAgID0gVFRfUEVFS19TSE9SVCggciApOwotICAgICAgICByICAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICBvZmZzZXQgID0gVFRfUEVFS19VU0hPUlQoIHIgKTsKLQotICAgICAgICAvKiBzb21lIGZvbnRzIGhhdmUgYW4gaW5jb3JyZWN0IGxhc3Qgc2VnbWVudDsgKi8KLSAgICAgICAgLyogd2UgaGF2ZSB0byBjYXRjaCBpdCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggaSA+PSBudW1fc2VncyAtIDEgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHN0YXJ0ID09IDB4RkZGRlUgJiYgZW5kID09IDB4RkZGRlUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBvZmZzZXQgJiYgciArIG9mZnNldCArIDIgPiBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZGVsdGEgID0gMTsKLSAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBvZmZzZXQgPT0gMHhGRkZGVSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKCBvZmZzZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgciArPSBvZmZzZXQgKyAoIGNoYXJjb2RlIC0gc3RhcnQgKSAqIDI7Ci0KLSAgICAgICAgICAvKiBpZiByID4gbGltaXQsIHRoZSB3aG9sZSBzZWdtZW50IGlzIGludmFsaWQgKi8KLSAgICAgICAgICBpZiAoIG5leHQgJiYgciA+IGxpbWl0ICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgZ2luZGV4ID0gVFRfUEVFS19VU0hPUlQoIHIgKTsKLSAgICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCAoRlRfSW50KWdpbmRleCArIGRlbHRhICkgJiAweEZGRkZVOwotICAgICAgICAgICAgaWYgKCBnaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKLSAgICAgICAgICAgICAgZ2luZGV4ID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCAoRlRfSW50KWNoYXJjb2RlICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0KLSAgICAgICAgICBpZiAoIG5leHQgJiYgZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogd2UgaGF2ZSBhbiBpbnZhbGlkIGdseXBoIGluZGV4OyBpZiB0aGVyZSBpcyBhbiBvdmVyZmxvdywgKi8KLSAgICAgICAgICAgIC8qIHdlIGNhbiBhZGp1c3QgYGNoYXJjb2RlJywgb3RoZXJ3aXNlIHRoZSB3aG9sZSBzZWdtZW50IGlzICovCi0gICAgICAgICAgICAvKiBpbnZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZ2luZGV4ID0gMDsKLQotICAgICAgICAgICAgaWYgKCAoRlRfSW50KWNoYXJjb2RlICsgZGVsdGEgPCAwICYmCi0gICAgICAgICAgICAgICAgIChGVF9JbnQpZW5kICsgZGVsdGEgPj0gMCAgICAgKQotICAgICAgICAgICAgICBjaGFyY29kZSA9IChGVF9VSW50KSggLWRlbHRhICk7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoRlRfSW50KWNoYXJjb2RlICsgZGVsdGEgPCAweDEwMDAwTCAmJgotICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpZW5kICsgZGVsdGEgPj0gMHgxMDAwMEwgICAgICkKLSAgICAgICAgICAgICAgY2hhcmNvZGUgPSAoRlRfVUludCkoIDB4MTAwMDBMIC0gZGVsdGEgKTsKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG5leHQgJiYgIWdpbmRleCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGNoYXJjb2RlID49IDB4RkZGRlUgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjaGFyY29kZSsrOwotICAgICAgICAgIGdvdG8gQWdhaW47Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIG5leHQgKQotICAgICAgKnBjaGFyY29kZSA9IGNoYXJjb2RlOwotCi0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgdHRfY21hcDRfY2hhcl9tYXBfYmluYXJ5KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiogIHBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBuZXh0ICkKLSAgewotICAgIFRUX0ZhY2UgICBmYWNlICA9IChUVF9GYWNlKWNtYXAtPmNtYXAuY2hhcm1hcC5mYWNlOwotICAgIEZUX0J5dGUqICBsaW1pdCA9IGZhY2UtPmNtYXBfdGFibGUgKyBmYWNlLT5jbWFwX3NpemU7Ci0KLSAgICBGVF9VSW50ICAgbnVtX3NlZ3MyLCBzdGFydCwgZW5kLCBvZmZzZXQ7Ci0gICAgRlRfSW50ICAgIGRlbHRhOwotICAgIEZUX1VJbnQgICBtYXgsIG1pbiwgbWlkLCBudW1fc2VnczsKLSAgICBGVF9VSW50ICAgY2hhcmNvZGUgPSAoRlRfVUludCkqcGNoYXJjb2RlOwotICAgIEZUX1VJbnQgICBnaW5kZXggICA9IDA7Ci0gICAgRlRfQnl0ZSogIHA7Ci0KLQotICAgIHAgPSBjbWFwLT5kYXRhICsgNjsKLSAgICBudW1fc2VnczIgPSBGVF9QQURfRkxPT1IoIFRUX1BFRUtfVVNIT1JUKCBwICksIDIgKTsKLQotICAgIGlmICggIW51bV9zZWdzMiApCi0gICAgICByZXR1cm4gMDsKLQotICAgIG51bV9zZWdzID0gbnVtX3NlZ3MyID4+IDE7Ci0KLSAgICAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgbWlkID0gbnVtX3NlZ3M7Ci0gICAgZW5kID0gMHhGRkZGVTsKLQotICAgIGlmICggbmV4dCApCi0gICAgICBjaGFyY29kZSsrOwotCi0gICAgbWluID0gMDsKLSAgICBtYXggPSBudW1fc2VnczsKLQotICAgIC8qIGJpbmFyeSBzZWFyY2ggKi8KLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgbWlkICAgID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgcCAgICAgID0gY21hcC0+ZGF0YSArIDE0ICsgbWlkICogMjsKLSAgICAgIGVuZCAgICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICBwICAgICArPSAyICsgbnVtX3NlZ3MyOwotICAgICAgc3RhcnQgID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBjaGFyY29kZSA8IHN0YXJ0ICkKLSAgICAgICAgbWF4ID0gbWlkOwotICAgICAgZWxzZSBpZiAoIGNoYXJjb2RlID4gZW5kICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICBkZWx0YSAgPSBUVF9QRUVLX1NIT1JUKCBwICk7Ci0gICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgb2Zmc2V0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgICAvKiBzb21lIGZvbnRzIGhhdmUgYW4gaW5jb3JyZWN0IGxhc3Qgc2VnbWVudDsgKi8KLSAgICAgICAgLyogd2UgaGF2ZSB0byBjYXRjaCBpdCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggbWlkID49IG51bV9zZWdzIC0gMSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHN0YXJ0ID09IDB4RkZGRlUgJiYgZW5kID09IDB4RkZGRlUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBvZmZzZXQgJiYgcCArIG9mZnNldCArIDIgPiBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZGVsdGEgID0gMTsKLSAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2VhcmNoIHRoZSBmaXJzdCBzZWdtZW50IGNvbnRhaW5pbmcgYGNoYXJjb2RlJyAqLwotICAgICAgICBpZiAoIGNtYXAtPmZsYWdzICYgVFRfQ01BUF9GTEFHX09WRVJMQVBQSU5HICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICAgIC8qIGNhbGwgdGhlIGN1cnJlbnQgc2VnbWVudCBgbWF4JyAqLwotICAgICAgICAgIG1heCA9IG1pZDsKLQotICAgICAgICAgIGlmICggb2Zmc2V0ID09IDB4RkZGRlUgKQotICAgICAgICAgICAgbWlkID0gbWF4ICsgMTsKLQotICAgICAgICAgIC8qIHNlYXJjaCBpbiBzZWdtZW50cyBiZWZvcmUgdGhlIGN1cnJlbnQgc2VnbWVudCAqLwotICAgICAgICAgIGZvciAoIGkgPSBtYXg7IGkgPiAwOyBpLS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgICBwcmV2X2VuZDsKLSAgICAgICAgICAgIEZUX0J5dGUqICBvbGRfcDsKLQotCi0gICAgICAgICAgICBvbGRfcCAgICA9IHA7Ci0gICAgICAgICAgICBwICAgICAgICA9IGNtYXAtPmRhdGEgKyAxNCArICggaSAtIDEgKSAqIDI7Ci0gICAgICAgICAgICBwcmV2X2VuZCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgICAgIGlmICggY2hhcmNvZGUgPiBwcmV2X2VuZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHAgPSBvbGRfcDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVuZCAgICA9IHByZXZfZW5kOwotICAgICAgICAgICAgcCAgICAgKz0gMiArIG51bV9zZWdzMjsKLSAgICAgICAgICAgIHN0YXJ0ICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICBkZWx0YSAgPSBUVF9QRUVLX1NIT1JUKCBwICk7Ci0gICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICBvZmZzZXQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgICAgICAgICBpZiAoIG9mZnNldCAhPSAweEZGRkZVICkKLSAgICAgICAgICAgICAgbWlkID0gaSAtIDE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogbm8gbHVjayAqLwotICAgICAgICAgIGlmICggbWlkID09IG1heCArIDEgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggaSAhPSBtYXggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwICAgICAgPSBjbWFwLT5kYXRhICsgMTQgKyBtYXggKiAyOwotICAgICAgICAgICAgICBlbmQgICAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgICBwICAgICArPSAyICsgbnVtX3NlZ3MyOwotICAgICAgICAgICAgICBzdGFydCAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICAgIGRlbHRhICA9IFRUX1BFRUtfU0hPUlQoIHAgKTsKLSAgICAgICAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICAgICAgICBvZmZzZXQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtaWQgPSBtYXg7Ci0KLSAgICAgICAgICAgIC8qIHNlYXJjaCBpbiBzZWdtZW50cyBhZnRlciB0aGUgY3VycmVudCBzZWdtZW50ICovCi0gICAgICAgICAgICBmb3IgKCBpID0gbWF4ICsgMTsgaSA8IG51bV9zZWdzOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9VSW50ICBuZXh0X2VuZCwgbmV4dF9zdGFydDsKLQotCi0gICAgICAgICAgICAgIHAgICAgICAgICAgPSBjbWFwLT5kYXRhICsgMTQgKyBpICogMjsKLSAgICAgICAgICAgICAgbmV4dF9lbmQgICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICAgIHAgICAgICAgICArPSAyICsgbnVtX3NlZ3MyOwotICAgICAgICAgICAgICBuZXh0X3N0YXJ0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgICAgICAgICBpZiAoIGNoYXJjb2RlIDwgbmV4dF9zdGFydCApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgZW5kICAgID0gbmV4dF9lbmQ7Ci0gICAgICAgICAgICAgIHN0YXJ0ICA9IG5leHRfc3RhcnQ7Ci0gICAgICAgICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgICAgICAgZGVsdGEgID0gVFRfUEVFS19TSE9SVCggcCApOwotICAgICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICAgIG9mZnNldCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBvZmZzZXQgIT0gMHhGRkZGVSApCi0gICAgICAgICAgICAgICAgbWlkID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGktLTsKLQotICAgICAgICAgICAgLyogc3RpbGwgbm8gbHVjayAqLwotICAgICAgICAgICAgaWYgKCBtaWQgPT0gbWF4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWlkID0gaTsKLQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBlbmQsIHN0YXJ0LCBkZWx0YSwgYW5kIG9mZnNldCBhcmUgZm9yIHRoZSBpJ3RoIHNlZ21lbnQgKi8KLSAgICAgICAgICBpZiAoIG1pZCAhPSBpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwICAgICAgPSBjbWFwLT5kYXRhICsgMTQgKyBtaWQgKiAyOwotICAgICAgICAgICAgZW5kICAgID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIHAgICAgICs9IDIgKyBudW1fc2VnczI7Ci0gICAgICAgICAgICBzdGFydCAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICAgICAgZGVsdGEgID0gVFRfUEVFS19TSE9SVCggcCApOwotICAgICAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICAgICAgb2Zmc2V0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBvZmZzZXQgPT0gMHhGRkZGVSApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggb2Zmc2V0ICkKLSAgICAgICAgewotICAgICAgICAgIHAgKz0gb2Zmc2V0ICsgKCBjaGFyY29kZSAtIHN0YXJ0ICkgKiAyOwotCi0gICAgICAgICAgLyogaWYgcCA+IGxpbWl0LCB0aGUgd2hvbGUgc2VnbWVudCBpcyBpbnZhbGlkICovCi0gICAgICAgICAgaWYgKCBuZXh0ICYmIHAgPiBsaW1pdCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGdpbmRleCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgaWYgKCBnaW5kZXggKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggKEZUX0ludClnaW5kZXggKyBkZWx0YSApICYgMHhGRkZGVTsKLSAgICAgICAgICAgIGlmICggZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCi0gICAgICAgICAgICAgIGdpbmRleCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggKEZUX0ludCljaGFyY29kZSArIGRlbHRhICkgJiAweEZGRkZVOwotCi0gICAgICAgICAgaWYgKCBuZXh0ICYmIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5yb290Lm51bV9nbHlwaHMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHdlIGhhdmUgYW4gaW52YWxpZCBnbHlwaCBpbmRleDsgaWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3csICovCi0gICAgICAgICAgICAvKiB3ZSBjYW4gYWRqdXN0IGBjaGFyY29kZScsIG90aGVyd2lzZSB0aGUgd2hvbGUgc2VnbWVudCBpcyAqLwotICAgICAgICAgICAgLyogaW52YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGdpbmRleCA9IDA7Ci0KLSAgICAgICAgICAgIGlmICggKEZUX0ludCljaGFyY29kZSArIGRlbHRhIDwgMCAmJgotICAgICAgICAgICAgICAgICAoRlRfSW50KWVuZCArIGRlbHRhID49IDAgICAgICkKLSAgICAgICAgICAgICAgY2hhcmNvZGUgPSAoRlRfVUludCkoIC1kZWx0YSApOwotCi0gICAgICAgICAgICBlbHNlIGlmICggKEZUX0ludCljaGFyY29kZSArIGRlbHRhIDwgMHgxMDAwMEwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KWVuZCArIGRlbHRhID49IDB4MTAwMDBMICAgICApCi0gICAgICAgICAgICAgIGNoYXJjb2RlID0gKEZUX1VJbnQpKCAweDEwMDAwTCAtIGRlbHRhICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBuZXh0ICkKLSAgICB7Ci0gICAgICBUVF9DTWFwNCAgY21hcDQgPSAoVFRfQ01hcDQpY21hcDsKLQotCi0gICAgICAvKiBpZiBgY2hhcmNvZGUnIGlzIG5vdCBpbiBhbnkgc2VnbWVudCwgdGhlbiBgbWlkJyBpcyAqLwotICAgICAgLyogdGhlIHNlZ21lbnQgbmVhcmVzdCB0byBgY2hhcmNvZGUnICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBjaGFyY29kZSA+IGVuZCApCi0gICAgICB7Ci0gICAgICAgIG1pZCsrOwotICAgICAgICBpZiAoIG1pZCA9PSBudW1fc2VncyApCi0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdHRfY21hcDRfc2V0X3JhbmdlKCBjbWFwNCwgbWlkICkgKQotICAgICAgewotICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICAgKnBjaGFyY29kZSA9IGNoYXJjb2RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjbWFwNC0+Y3VyX2NoYXJjb2RlID0gY2hhcmNvZGU7Ci0KLSAgICAgICAgaWYgKCBnaW5kZXggKQotICAgICAgICAgIGNtYXA0LT5jdXJfZ2luZGV4ID0gZ2luZGV4OwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjbWFwNC0+Y3VyX2NoYXJjb2RlID0gY2hhcmNvZGU7Ci0gICAgICAgICAgdHRfY21hcDRfbmV4dCggY21hcDQgKTsKLSAgICAgICAgICBnaW5kZXggPSBjbWFwNC0+Y3VyX2dpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZ2luZGV4ICkKLSAgICAgICAgICAqcGNoYXJjb2RlID0gY21hcDQtPmN1cl9jaGFyY29kZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwNF9jaGFyX2luZGV4KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIGlmICggY2hhcl9jb2RlID49IDB4MTAwMDBVTCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggY21hcC0+ZmxhZ3MgJiBUVF9DTUFQX0ZMQUdfVU5TT1JURUQgKQotICAgICAgcmV0dXJuIHR0X2NtYXA0X2NoYXJfbWFwX2xpbmVhciggY21hcCwgJmNoYXJfY29kZSwgMCApOwotICAgIGVsc2UKLSAgICAgIHJldHVybiB0dF9jbWFwNF9jaGFyX21hcF9iaW5hcnkoIGNtYXAsICZjaGFyX2NvZGUsIDAgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICB0dF9jbWFwNF9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICBnaW5kZXg7Ci0KLQotICAgIGlmICggKnBjaGFyX2NvZGUgPj0gMHhGRkZGVSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggY21hcC0+ZmxhZ3MgJiBUVF9DTUFQX0ZMQUdfVU5TT1JURUQgKQotICAgICAgZ2luZGV4ID0gdHRfY21hcDRfY2hhcl9tYXBfbGluZWFyKCBjbWFwLCBwY2hhcl9jb2RlLCAxICk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFRUX0NNYXA0ICBjbWFwNCA9IChUVF9DTWFwNCljbWFwOwotCi0KLSAgICAgIC8qIG5vIG5lZWQgdG8gc2VhcmNoICovCi0gICAgICBpZiAoICpwY2hhcl9jb2RlID09IGNtYXA0LT5jdXJfY2hhcmNvZGUgKQotICAgICAgewotICAgICAgICB0dF9jbWFwNF9uZXh0KCBjbWFwNCApOwotICAgICAgICBnaW5kZXggPSBjbWFwNC0+Y3VyX2dpbmRleDsKLSAgICAgICAgaWYgKCBnaW5kZXggKQotICAgICAgICAgICpwY2hhcl9jb2RlID0gY21hcDQtPmN1cl9jaGFyY29kZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZ2luZGV4ID0gdHRfY21hcDRfY2hhcl9tYXBfYmluYXJ5KCBjbWFwLCBwY2hhcl9jb2RlLCAxICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA0X2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA0OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gNDsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfVFRfQ01BUCgKLSAgICB0dF9jbWFwNF9jbGFzc19yZWMsCi0KLSAgICAgIHNpemVvZiAoIFRUX0NNYXA0UmVjICksCi0KLSAgICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcDRfaW5pdCwgICAgICAgIC8qIGluaXQgICAgICAgKi8KLSAgICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgTlVMTCwgICAgICAgICAgICAgICAgIC8qIGRvbmUgICAgICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDRfY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDRfY2hhcl9uZXh0LCAgIC8qIGNoYXJfbmV4dCAgKi8KLQotICAgICAgKEZUX0NNYXBfQ2hhclZhckluZGV4RnVuYykgICAgTlVMTCwgIC8qIGNoYXJfdmFyX2luZGV4ICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jKU5VTEwsICAvKiBjaGFyX3Zhcl9kZWZhdWx0ICovCi0gICAgICAoRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMpICAgICBOVUxMLCAgLyogdmFyaWFudF9saXN0ICAgICAqLwotICAgICAgKEZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykgTlVMTCwgIC8qIGNoYXJ2YXJpYW50X2xpc3QgKi8KLSAgICAgIChGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpIE5VTEwsICAvKiB2YXJpYW50Y2hhcl9saXN0ICovCi0KLSAgICA0LAotICAgIChUVF9DTWFwX1ZhbGlkYXRlRnVuYyl0dF9jbWFwNF92YWxpZGF0ZSwgIC8qIHZhbGlkYXRlICAgICAgKi8KLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfY21hcDRfZ2V0X2luZm8gICAvKiBnZXRfY21hcF9pbmZvICovCi0gICkKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF80ICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgICAgIFRZUEUgICAgICAgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICBtdXN0IGJlIDYgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAqLwotICAvKiAgIGxhbmd1YWdlICAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZmlyc3QgICAgICAgIDYgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgZmlyc3Qgc2VnbWVudCBjb2RlICAgICAqLwotICAvKiAgIGNvdW50ICAgICAgICA4ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIHNlZ21lbnQgc2l6ZSBpbiBjaGFycyAgKi8KLSAgLyogICBnbHlwaElkcyAgICAgMTAgICAgICAgICAgICAgVVNIT1JUW2NvdW50XSAgICBnbHlwaCBJRHMgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHZlcnkgc2ltcGxpZmllZCBzZWdtZW50IG1hcHBpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNgotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwNl92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIGxlbmd0aCwgY291bnQ7Ci0KLQotICAgIGlmICggdGFibGUgKyAxMCA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIHAgICAgICA9IHRhYmxlICsgMjsKLSAgICBsZW5ndGggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgcCAgICAgID0gdGFibGUgKyA4OyAgICAgICAgICAgICAvKiBza2lwIGxhbmd1YWdlIGFuZCBzdGFydCBpbmRleCAqLwotICAgIGNvdW50ICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBpZiAoIHRhYmxlICsgbGVuZ3RoID4gdmFsaWQtPmxpbWl0IHx8IGxlbmd0aCA8IDEwICsgY291bnQgKiAyICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgLyogY2hlY2sgZ2x5cGggaW5kaWNlcyAqLwotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBnaW5kZXg7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgewotICAgICAgICBnaW5kZXggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBpZiAoIGdpbmRleCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwNl9jaGFyX2luZGV4KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0J5dGUqICB0YWJsZSAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQgICByZXN1bHQgPSAwOwotICAgIEZUX0J5dGUqICBwICAgICAgPSB0YWJsZSArIDY7Ci0gICAgRlRfVUludCAgIHN0YXJ0ICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRlRfVUludCAgIGNvdW50ICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRlRfVUludCAgIGlkeCAgICA9IChGVF9VSW50KSggY2hhcl9jb2RlIC0gc3RhcnQgKTsKLQotCi0gICAgaWYgKCBpZHggPCBjb3VudCApCi0gICAgewotICAgICAgcCArPSAyICogaWR4OwotICAgICAgcmVzdWx0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHR0X2NtYXA2X2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICpwY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0J5dGUqICAgdGFibGUgICAgID0gY21hcC0+ZGF0YTsKLSAgICBGVF9VSW50MzIgIHJlc3VsdCAgICA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICAgPSAwOwotCi0gICAgRlRfQnl0ZSogICBwICAgICAgICAgPSB0YWJsZSArIDY7Ci0gICAgRlRfVUludCAgICBzdGFydCAgICAgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEZUX1VJbnQgICAgY291bnQgICAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBGVF9VSW50ICAgIGlkeDsKLQotCi0gICAgaWYgKCBjaGFyX2NvZGUgPj0gMHgxMDAwMFVMICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCi0gICAgICBjaGFyX2NvZGUgPSBzdGFydDsKLQotICAgIGlkeCA9IChGVF9VSW50KSggY2hhcl9jb2RlIC0gc3RhcnQgKTsKLSAgICBwICArPSAyICogaWR4OwotCi0gICAgZm9yICggOyBpZHggPCBjb3VudDsgaWR4KysgKQotICAgIHsKLSAgICAgIGdpbmRleCA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gY2hhcl9jb2RlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGVSApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICBjaGFyX2NvZGUrKzsKLSAgICB9Ci0KLSAgICAqcGNoYXJfY29kZSA9IHJlc3VsdDsKLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDZfZ2V0X2luZm8oIFRUX0NNYXAgICAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gY21hcC0+ZGF0YSArIDQ7Ci0KLQotICAgIGNtYXBfaW5mby0+Zm9ybWF0ICAgPSA2OwotICAgIGNtYXBfaW5mby0+bGFuZ3VhZ2UgPSAoRlRfVUxvbmcpVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9UVF9DTUFQKAotICAgIHR0X2NtYXA2X2NsYXNzX3JlYywKLQotICAgICAgc2l6ZW9mICggVFRfQ01hcFJlYyApLAotCi0gICAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHR0X2NtYXBfaW5pdCwgICAgICAgICAvKiBpbml0ICAgICAgICovCi0gICAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsICAgICAgICAgICAgICAgICAvKiBkb25lICAgICAgICovCi0gICAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXR0X2NtYXA2X2NoYXJfaW5kZXgsICAvKiBjaGFyX2luZGV4ICovCi0gICAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXA2X2NoYXJfbmV4dCwgICAvKiBjaGFyX25leHQgICovCi0KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpICAgIE5VTEwsICAvKiBjaGFyX3Zhcl9pbmRleCAgICovCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYylOVUxMLCAgLyogY2hhcl92YXJfZGVmYXVsdCAqLwotICAgICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgTlVMTCwgIC8qIHZhcmlhbnRfbGlzdCAgICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMpIE5VTEwsICAvKiBjaGFydmFyaWFudF9saXN0ICovCi0gICAgICAoRlRfQ01hcF9WYXJpYW50Q2hhckxpc3RGdW5jKSBOVUxMLCAgLyogdmFyaWFudGNoYXJfbGlzdCAqLwotCi0gICAgNiwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpdHRfY21hcDZfdmFsaWRhdGUsICAvKiB2YWxpZGF0ZSAgICAgICovCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKXR0X2NtYXA2X2dldF9pbmZvICAgLyogZ2V0X2NtYXBfaW5mbyAqLwotICApCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogSXQgaXMgaGFyZCB0byBjb21wbGV0ZWx5IHVuZGVyc3RhbmQgd2hhdCB0aGUgT3BlblR5cGUgc3BlYyAgICAqKioqKi8KLSAgLyoqKioqIHNheXMgYWJvdXQgdGhpcyBmb3JtYXQsIGJ1dCBoZXJlIGlzIG15IGNvbmNsdXNpb24uICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmb3JtYXQgaXMgdG8gZWFzaWx5IG1hcCBVVEYtMTYgdGV4dCB0byAgICAqKioqKi8KLSAgLyoqKioqIGdseXBoIGluZGljZXMuICBCYXNpY2FsbHksIHRoZSBgY2hhcl9jb2RlJyBtdXN0IGJlIGluIG9uZSBvZiAgKioqKiovCi0gIC8qKioqKiB0aGUgZm9sbG93aW5nIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgLSBBIDE2LWJpdCB2YWx1ZSB0aGF0IGlzbid0IHBhcnQgb2YgdGhlIFVuaWNvZGUgU3Vycm9nYXRlcyAgKioqKiovCi0gIC8qKioqKiAgICAgQXJlYSAoaS5lLiBVK0Q4MDAtVStERkZGKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgLSBBIDMyLWJpdCB2YWx1ZSwgbWFkZSBvZiB0d28gc3Vycm9nYXRlIHZhbHVlcywgaS5lLi4gaWYgICAgKioqKiovCi0gIC8qKioqKiAgICAgYGNoYXJfY29kZSA9IChjaGFyX2hpIDw8IDE2KSB8IGNoYXJfbG8nLCB0aGVuIGJvdGggICAgICAgICoqKioqLwotICAvKioqKiogICAgIGBjaGFyX2hpJyBhbmQgYGNoYXJfbG8nIG11c3QgYmUgaW4gdGhlIFN1cnJvZ2F0ZXMgQXJlYS4gICAqKioqKi8KLSAgLyoqKioqICAgICAgQXJlYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogVGhlIGBpczMyJyB0YWJsZSBlbWJlZGRlZCBpbiB0aGUgY2hhcm1hcCBpbmRpY2F0ZXMgd2hldGhlciBhICAqKioqKi8KLSAgLyoqKioqIGdpdmVuIDE2LWJpdCB2YWx1ZSBpcyBpbiB0aGUgc3Vycm9nYXRlcyBhcmVhIG9yIG5vdC4gICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogU28sIGZvciBhbnkgZ2l2ZW4gYGNoYXJfY29kZScsIHdlIGNhbiBhc3NlcnQgdGhlIGZvbGxvd2luZy4gICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIElmIGBjaGFyX2hpID09IDAnIHRoZW4gd2UgbXVzdCBoYXZlIGBpczMyW2NoYXJfbG9dID09IDAnLiAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgSWYgYGNoYXJfaGkgIT0gMCcgdGhlbiB3ZSBtdXN0IGhhdmUgYm90aCAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIGBpczMyW2NoYXJfaGldICE9IDAnIGFuZCBgaXMzMltjaGFyX2xvXSAhPSAwJy4gICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgICAgICBUWVBFICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgICAgIFVTSE9SVCAgICAgIG11c3QgYmUgOCAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICByZXNlcnZlZCAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgNCAgICAgICAgICAgICAgVUxPTkcgICAgICAgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgICAgIFVMT05HICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICAgKi8KLSAgLyogICBpczMyICAgICAgICAxMiAgICAgICAgICAgICBCWVRFWzgxOTJdICAzMi1iaXRuZXNzIGJpdG1hcCAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgODIwNCAgICAgICAgICAgVUxPTkcgICAgICAgbnVtYmVyIG9mIGdyb3VwcyAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYGNvdW50JyBncm91cHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0ICAgICAgIDAgICAgICAgICAgICAgIFVMT05HICAgICAgIGZpcnN0IGNoYXJjb2RlICAgICAgICAgICAgICAgKi8KLSAgLyogICBlbmQgICAgICAgICA0ICAgICAgICAgICAgICBVTE9ORyAgICAgICBsYXN0IGNoYXJjb2RlICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRJZCAgICAgOCAgICAgICAgICAgICAgVUxPTkcgICAgICAgc3RhcnQgZ2x5cGggSUQgZm9yIHRoZSBncm91cCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF84Ci0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA4X3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHAgPSB0YWJsZSArIDQ7Ci0gICAgRlRfQnl0ZSogICBpczMyOwotICAgIEZUX1VJbnQzMiAgbGVuZ3RoOwotICAgIEZUX1VJbnQzMiAgbnVtX2dyb3VwczsKLQotCi0gICAgaWYgKCB0YWJsZSArIDE2ICsgODE5MiA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIGxlbmd0aCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBpZiAoIGxlbmd0aCA+IChGVF9VSW50MzIpKCB2YWxpZC0+bGltaXQgLSB0YWJsZSApIHx8IGxlbmd0aCA8IDgxOTIgKyAxNiApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIGlzMzIgICAgICAgPSB0YWJsZSArIDEyOwotICAgIHAgICAgICAgICAgPSBpczMyICArIDgxOTI7ICAgICAgICAgIC8qIHNraXAgYGlzMzInIGFycmF5ICovCi0gICAgbnVtX2dyb3VwcyA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIC8qIHAgKyBudW1fZ3JvdXBzICogMTIgPiB2YWxpZC0+bGltaXQgPyAqLwotICAgIGlmICggbnVtX2dyb3VwcyA+IChGVF9VSW50MzIpKCB2YWxpZC0+bGltaXQgLSBwICkgLyAxMiApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIGNoZWNrIGdyb3VwcywgdGhleSBtdXN0IGJlIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIG4sIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkLCBjb3VudCwgbGFzdCA9IDA7Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ3JvdXBzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgaGksIGxvOwotCi0KLSAgICAgICAgc3RhcnQgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBzdGFydF9pZCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICBpZiAoIHN0YXJ0ID4gZW5kICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgaWYgKCBuID4gMCAmJiBzdGFydCA8PSBsYXN0ICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludDMyICBkID0gZW5kIC0gc3RhcnQ7Ci0KLQotICAgICAgICAgIC8qIHN0YXJ0X2lkICsgZW5kIC0gc3RhcnQgPj0gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgPyAqLwotICAgICAgICAgIGlmICggZCA+IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICBzdGFydF9pZCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSAtIGQgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLQotICAgICAgICAgIGNvdW50ID0gKEZUX1VJbnQzMikoIGVuZCAtIHN0YXJ0ICsgMSApOwotCi0gICAgICAgICAgaWYgKCBzdGFydCAmIH4weEZGRkZVICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdGFydF9oaSAhPSAwOyBjaGVjayB0aGF0IGlzMzJbaV0gaXMgMSBmb3IgZWFjaCBpIGluICovCi0gICAgICAgICAgICAvKiB0aGUgYGhpJyBhbmQgYGxvJyBvZiB0aGUgcmFuZ2UgW3N0YXJ0Li5lbmRdICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc3RhcnQrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhpID0gKEZUX1VJbnQpKCBzdGFydCA+PiAxNiApOwotICAgICAgICAgICAgICBsbyA9IChGVF9VSW50KSggc3RhcnQgJiAweEZGRkZVICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCAoaXMzMltoaSA+PiAzXSAmICggMHg4MCA+PiAoIGhpICYgNyApICkgKSA9PSAwICkKLSAgICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgICAgICAgaWYgKCAoaXMzMltsbyA+PiAzXSAmICggMHg4MCA+PiAoIGxvICYgNyApICkgKSA9PSAwICkKLSAgICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdGFydF9oaSA9PSAwOyBjaGVjayB0aGF0IGlzMzJbaV0gaXMgMCBmb3IgZWFjaCBpIGluICovCi0gICAgICAgICAgICAvKiB0aGUgcmFuZ2UgW3N0YXJ0Li5lbmRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIC8qIGVuZF9oaSBjYW5ub3QgYmUgIT0gMCEgKi8KLSAgICAgICAgICAgIGlmICggZW5kICYgfjB4RkZGRlUgKQotICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzdGFydCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbG8gPSAoRlRfVUludCkoIHN0YXJ0ICYgMHhGRkZGVSApOwotCi0gICAgICAgICAgICAgIGlmICggKGlzMzJbbG8gPj4gM10gJiAoIDB4ODAgPj4gKCBsbyAmIDcgKSApICkgIT0gMCApCi0gICAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxhc3QgPSBlbmQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDhfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQgICAgcmVzdWx0ICAgICA9IDA7Ci0gICAgRlRfQnl0ZSogICBwICAgICAgICAgID0gdGFibGUgKyA4MjA0OwotICAgIEZUX1VJbnQzMiAgbnVtX2dyb3VwcyA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBGVF9VSW50MzIgIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkOwotCi0KLSAgICBmb3IgKCA7IG51bV9ncm91cHMgPiAwOyBudW1fZ3JvdXBzLS0gKQotICAgIHsKLSAgICAgIHN0YXJ0ICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZW5kICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBzdGFydF9pZCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8PSBlbmQgKQotICAgICAgewotICAgICAgICBpZiAoIHN0YXJ0X2lkID4gMHhGRkZGRkZGRlVMIC0gKCBjaGFyX2NvZGUgLSBzdGFydCApICkKLSAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICByZXN1bHQgPSAoRlRfVUludCkoIHN0YXJ0X2lkICsgKCBjaGFyX2NvZGUgLSBzdGFydCApICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHR0X2NtYXA4X2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICpwY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0ZhY2UgICAgZmFjZSAgICAgICA9IGNtYXAtPmNtYXAuY2hhcm1hcC5mYWNlOwotICAgIEZUX1VJbnQzMiAgcmVzdWx0ICAgICA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGU7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICAgID0gMDsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX0J5dGUqICAgcCAgICAgICAgICA9IHRhYmxlICsgODIwNDsKLSAgICBGVF9VSW50MzIgIG51bV9ncm91cHMgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBzdGFydCwgZW5kLCBzdGFydF9pZDsKLQotCi0gICAgaWYgKCAqcGNoYXJfY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7Ci0KLSAgICBwID0gdGFibGUgKyA4MjA4OwotCi0gICAgZm9yICggOyBudW1fZ3JvdXBzID4gMDsgbnVtX2dyb3Vwcy0tICkKLSAgICB7Ci0gICAgICBzdGFydCAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgc3RhcnRfaWQgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBjaGFyX2NvZGUgPSBzdGFydDsKLQotICAgIEFnYWluOgotICAgICAgaWYgKCBjaGFyX2NvZGUgPD0gZW5kICkKLSAgICAgIHsKLSAgICAgICAgLyogaWdub3JlIGludmFsaWQgZ3JvdXAgKi8KLSAgICAgICAgaWYgKCBzdGFydF9pZCA+IDB4RkZGRkZGRkZVTCAtICggY2hhcl9jb2RlIC0gc3RhcnQgKSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBzdGFydF9pZCArICggY2hhcl9jb2RlIC0gc3RhcnQgKSApOwotCi0gICAgICAgIC8qIGRvZXMgZmlyc3QgZWxlbWVudCBvZiBncm91cCBwb2ludCB0byBgLm5vdGRlZicgZ2x5cGg/ICovCi0gICAgICAgIGlmICggZ2luZGV4ID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2hhcl9jb2RlKys7Ci0gICAgICAgICAgZ290byBBZ2FpbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlmIGBnaW5kZXgnIGlzIGludmFsaWQsIHRoZSByZW1haW5pbmcgdmFsdWVzICovCi0gICAgICAgIC8qIGluIHRoaXMgZ3JvdXAgYXJlIGludmFsaWQsIHRvbyAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQotICAgICAgICB7Ci0gICAgICAgICAgZ2luZGV4ID0gMDsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IGNoYXJfY29kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgKnBjaGFyX2NvZGUgPSByZXN1bHQ7Ci0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA4X2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA4OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gODsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVUxPTkcoIHAgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9UVF9DTUFQKAotICAgIHR0X2NtYXA4X2NsYXNzX3JlYywKLQotICAgICAgc2l6ZW9mICggVFRfQ01hcFJlYyApLAotCi0gICAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHR0X2NtYXBfaW5pdCwgICAgICAgICAvKiBpbml0ICAgICAgICovCi0gICAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsICAgICAgICAgICAgICAgICAvKiBkb25lICAgICAgICovCi0gICAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXR0X2NtYXA4X2NoYXJfaW5kZXgsICAvKiBjaGFyX2luZGV4ICovCi0gICAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXA4X2NoYXJfbmV4dCwgICAvKiBjaGFyX25leHQgICovCi0KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpICAgIE5VTEwsICAvKiBjaGFyX3Zhcl9pbmRleCAgICovCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYylOVUxMLCAgLyogY2hhcl92YXJfZGVmYXVsdCAqLwotICAgICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgTlVMTCwgIC8qIHZhcmlhbnRfbGlzdCAgICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMpIE5VTEwsICAvKiBjaGFydmFyaWFudF9saXN0ICovCi0gICAgICAoRlRfQ01hcF9WYXJpYW50Q2hhckxpc3RGdW5jKSBOVUxMLCAgLyogdmFyaWFudGNoYXJfbGlzdCAqLwotCi0gICAgOCwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpdHRfY21hcDhfdmFsaWRhdGUsICAvKiB2YWxpZGF0ZSAgICAgICovCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKXR0X2NtYXA4X2dldF9pbmZvICAgLyogZ2V0X2NtYXBfaW5mbyAqLwotICApCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfOCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICBPRkZTRVQgIFRZUEUgICAgICAgICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAwICAgICAgVVNIT1JUICAgICAgICAgICAgIG11c3QgYmUgMTAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHJlc2VydmVkICAgMiAgICAgIFVTSE9SVCAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsZW5ndGggICAgIDQgICAgICBVTE9ORyAgICAgICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGFuZ3VhZ2UgICA4ICAgICAgVUxPTkcgICAgICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydCAgICAgMTIgICAgICBVTE9ORyAgICAgICAgICAgICAgZmlyc3QgY2hhciBpbiByYW5nZSAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgIDE2ICAgICAgVUxPTkcgICAgICAgICAgICAgIG51bWJlciBvZiBjaGFycyBpbiByYW5nZSAgICAgICAqLwotICAvKiAgIGdseXBoSWRzICAyMCAgICAgIFVTSE9SVFtjb3VudF0gICAgICBnbHlwaCBpbmRpY2VzIGNvdmVyZWQgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTAKLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDEwX3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSB0YWJsZSArIDQ7Ci0gICAgRlRfVUxvbmcgIGxlbmd0aCwgY291bnQ7Ci0KLQotICAgIGlmICggdGFibGUgKyAyMCA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIGxlbmd0aCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBwICAgICAgPSB0YWJsZSArIDE2OwotICAgIGNvdW50ICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIGlmICggbGVuZ3RoID4gKEZUX1VMb25nKSggdmFsaWQtPmxpbWl0IC0gdGFibGUgKSB8fAotICAgICAgICAgLyogbGVuZ3RoIDwgMjAgKyBjb3VudCAqIDIgPyAqLwotICAgICAgICAgbGVuZ3RoIDwgMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgKCBsZW5ndGggLSAyMCApIC8gMiA8IGNvdW50ICAgICAgICAgICAgICAgICApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIGNoZWNrIGdseXBoIGluZGljZXMgKi8KLSAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgewotICAgICAgRlRfVUludCAgZ2luZGV4OwotCi0KLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgaWYgKCBnaW5kZXggPj0gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgKQotICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDEwX2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0J5dGUqICAgdGFibGUgID0gY21hcC0+ZGF0YTsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCA9IDA7Ci0gICAgRlRfQnl0ZSogICBwICAgICAgPSB0YWJsZSArIDEyOwotICAgIEZUX1VJbnQzMiAgc3RhcnQgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIEZUX1VJbnQzMiAgY291bnQgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIEZUX1VJbnQzMiAgaWR4OwotCi0KLSAgICBpZiAoIGNoYXJfY29kZSA8IHN0YXJ0ICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWR4ID0gY2hhcl9jb2RlIC0gc3RhcnQ7Ci0KLSAgICBpZiAoIGlkeCA8IGNvdW50ICkKLSAgICB7Ci0gICAgICBwICAgICArPSAyICogaWR4OwotICAgICAgcmVzdWx0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHR0X2NtYXAxMF9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogICB0YWJsZSAgICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlOwotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgID0gMDsKLSAgICBGVF9CeXRlKiAgIHAgICAgICAgICA9IHRhYmxlICsgMTI7Ci0gICAgRlRfVUludDMyICBzdGFydCAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBjb3VudCAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBpZHg7Ci0KLQotICAgIGlmICggKnBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGUgKyAxOwotCi0gICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCi0gICAgICBjaGFyX2NvZGUgPSBzdGFydDsKLQotICAgIGlkeCA9IGNoYXJfY29kZSAtIHN0YXJ0OwotICAgIHAgICs9IDIgKiBpZHg7Ci0KLSAgICBmb3IgKCA7IGlkeCA8IGNvdW50OyBpZHgrKyApCi0gICAgewotICAgICAgZ2luZGV4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIGNoYXJfY29kZSsrOwotICAgIH0KLQotICAgICpwY2hhcl9jb2RlID0gY2hhcl9jb2RlOwotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTBfZ2V0X2luZm8oIFRUX0NNYXAgICAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA4OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gMTA7Ci0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IChGVF9VTG9uZylUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfVFRfQ01BUCgKLSAgICB0dF9jbWFwMTBfY2xhc3NfcmVjLAotCi0gICAgICBzaXplb2YgKCBUVF9DTWFwUmVjICksCi0KLSAgICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcF9pbml0LCAgICAgICAgICAvKiBpbml0ICAgICAgICovCi0gICAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogZG9uZSAgICAgICAqLwotICAgICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwMTBfY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDEwX2NoYXJfbmV4dCwgICAvKiBjaGFyX25leHQgICovCi0KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpICAgIE5VTEwsICAvKiBjaGFyX3Zhcl9pbmRleCAgICovCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYylOVUxMLCAgLyogY2hhcl92YXJfZGVmYXVsdCAqLwotICAgICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgTlVMTCwgIC8qIHZhcmlhbnRfbGlzdCAgICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMpIE5VTEwsICAvKiBjaGFydmFyaWFudF9saXN0ICovCi0gICAgICAoRlRfQ01hcF9WYXJpYW50Q2hhckxpc3RGdW5jKSBOVUxMLCAgLyogdmFyaWFudGNoYXJfbGlzdCAqLwotCi0gICAgMTAsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKXR0X2NtYXAxMF92YWxpZGF0ZSwgIC8qIHZhbGlkYXRlICAgICAgKi8KLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfY21hcDEwX2dldF9pbmZvICAgLyogZ2V0X2NtYXBfaW5mbyAqLwotICApCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgIFRZUEUgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgVVNIT1JUICAgICBtdXN0IGJlIDEyICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICByZXNlcnZlZCAgICAyICAgICAgICAgIFVTSE9SVCAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxlbmd0aCBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgVUxPTkcgICAgICBNYWMgbGFuZ3VhZ2UgY29kZSAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjb3VudCAgICAgICAxMiAgICAgICAgIFVMT05HICAgICAgbnVtYmVyIG9mIGdyb3VwcyAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYGNvdW50JyBncm91cHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0ICAgICAgIDAgICAgICAgICAgVUxPTkcgICAgICBmaXJzdCBjaGFyY29kZSAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBlbmQgICAgICAgICA0ICAgICAgICAgIFVMT05HICAgICAgbGFzdCBjaGFyY29kZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRJZCAgICAgOCAgICAgICAgICBVTE9ORyAgICAgIHN0YXJ0IGdseXBoIElEIGZvciB0aGUgZ3JvdXAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMgotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9DTWFwMTJSZWNfCi0gIHsKLSAgICBUVF9DTWFwUmVjICBjbWFwOwotICAgIEZUX0Jvb2wgICAgIHZhbGlkOwotICAgIEZUX1VMb25nICAgIGN1cl9jaGFyY29kZTsKLSAgICBGVF9VSW50ICAgICBjdXJfZ2luZGV4OwotICAgIEZUX1VMb25nICAgIGN1cl9ncm91cDsKLSAgICBGVF9VTG9uZyAgICBudW1fZ3JvdXBzOwotCi0gIH0gVFRfQ01hcDEyUmVjLCAqVFRfQ01hcDEyOwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxMl9pbml0KCBUVF9DTWFwMTIgIGNtYXAsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIHRhYmxlICkKLSAgewotICAgIGNtYXAtPmNtYXAuZGF0YSAgPSB0YWJsZTsKLQotICAgIHRhYmxlICAgICAgICAgICArPSAxMjsKLSAgICBjbWFwLT5udW1fZ3JvdXBzID0gRlRfUEVFS19VTE9ORyggdGFibGUgKTsKLQotICAgIGNtYXAtPnZhbGlkICAgICAgPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxMl92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VMb25nICBsZW5ndGg7Ci0gICAgRlRfVUxvbmcgIG51bV9ncm91cHM7Ci0KLQotICAgIGlmICggdGFibGUgKyAxNiA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIHAgICAgICA9IHRhYmxlICsgNDsKLSAgICBsZW5ndGggPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBwICAgICAgICAgID0gdGFibGUgKyAxMjsKLSAgICBudW1fZ3JvdXBzID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCBsZW5ndGggPiAoRlRfVUxvbmcpKCB2YWxpZC0+bGltaXQgLSB0YWJsZSApIHx8Ci0gICAgICAgICAvKiBsZW5ndGggPCAxNiArIDEyICogbnVtX2dyb3VwcyA/ICovCi0gICAgICAgICBsZW5ndGggPCAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAoIGxlbmd0aCAtIDE2ICkgLyAxMiA8IG51bV9ncm91cHMgICAgICAgICAgICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgLyogY2hlY2sgZ3JvdXBzLCB0aGV5IG11c3QgYmUgaW4gaW5jcmVhc2luZyBvcmRlciAqLwotICAgIHsKLSAgICAgIEZUX1VMb25nICBuLCBzdGFydCwgZW5kLCBzdGFydF9pZCwgbGFzdCA9IDA7Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ3JvdXBzOyBuKysgKQotICAgICAgewotICAgICAgICBzdGFydCAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgZW5kICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIHN0YXJ0X2lkID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIGlmICggc3RhcnQgPiBlbmQgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICBpZiAoIG4gPiAwICYmIHN0YXJ0IDw9IGxhc3QgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50MzIgIGQgPSBlbmQgLSBzdGFydDsKLQotCi0gICAgICAgICAgLyogc3RhcnRfaWQgKyBlbmQgLSBzdGFydCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSA/ICovCi0gICAgICAgICAgaWYgKCBkID4gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIHN0YXJ0X2lkID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApIC0gZCApCi0gICAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgICB9Ci0KLSAgICAgICAgbGFzdCA9IGVuZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBzZWFyY2ggdGhlIGluZGV4IG9mIHRoZSBjaGFyY29kZSBuZXh0IHRvIGNtYXAtPmN1cl9jaGFyY29kZSAqLwotICAvKiBjbWFwLT5jdXJfZ3JvdXAgc2hvdWxkIGJlIHNldCB1cCBwcm9wZXJseSBieSBjYWxsZXIgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICB0dF9jbWFwMTJfbmV4dCggVFRfQ01hcDEyICBjbWFwICkKLSAgewotICAgIEZUX0ZhY2UgICBmYWNlID0gY21hcC0+Y21hcC5jbWFwLmNoYXJtYXAuZmFjZTsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VTG9uZyAgc3RhcnQsIGVuZCwgc3RhcnRfaWQsIGNoYXJfY29kZTsKLSAgICBGVF9VTG9uZyAgbjsKLSAgICBGVF9VSW50ICAgZ2luZGV4OwotCi0KLSAgICBpZiAoIGNtYXAtPmN1cl9jaGFyY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgY2hhcl9jb2RlID0gY21hcC0+Y3VyX2NoYXJjb2RlICsgMTsKLQotICAgIGZvciAoIG4gPSBjbWFwLT5jdXJfZ3JvdXA7IG4gPCBjbWFwLT5udW1fZ3JvdXBzOyBuKysgKQotICAgIHsKLSAgICAgIHAgICAgICAgID0gY21hcC0+Y21hcC5kYXRhICsgMTYgKyAxMiAqIG47Ci0gICAgICBzdGFydCAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgc3RhcnRfaWQgPSBUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBjaGFyX2NvZGUgPSBzdGFydDsKLQotICAgIEFnYWluOgotICAgICAgaWYgKCBjaGFyX2NvZGUgPD0gZW5kICkKLSAgICAgIHsKLSAgICAgICAgLyogaWdub3JlIGludmFsaWQgZ3JvdXAgKi8KLSAgICAgICAgaWYgKCBzdGFydF9pZCA+IDB4RkZGRkZGRkZVTCAtICggY2hhcl9jb2RlIC0gc3RhcnQgKSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBzdGFydF9pZCArICggY2hhcl9jb2RlIC0gc3RhcnQgKSApOwotCi0gICAgICAgIC8qIGRvZXMgZmlyc3QgZWxlbWVudCBvZiBncm91cCBwb2ludCB0byBgLm5vdGRlZicgZ2x5cGg/ICovCi0gICAgICAgIGlmICggZ2luZGV4ID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIGNoYXJfY29kZSsrOwotICAgICAgICAgIGdvdG8gQWdhaW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiBgZ2luZGV4JyBpcyBpbnZhbGlkLCB0aGUgcmVtYWluaW5nIHZhbHVlcyAqLwotICAgICAgICAvKiBpbiB0aGlzIGdyb3VwIGFyZSBpbnZhbGlkLCB0b28gICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgICAgewotICAgICAgICAgIGdpbmRleCA9IDA7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyX2NvZGU7Ci0gICAgICAgIGNtYXAtPmN1cl9naW5kZXggICA9IGdpbmRleDsKLSAgICAgICAgY21hcC0+Y3VyX2dyb3VwICAgID0gbjsKLQotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgY21hcC0+dmFsaWQgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0dF9jbWFwMTJfY2hhcl9tYXBfYmluYXJ5KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIqICBwY2hhcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBuZXh0ICkKLSAgewotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgICA9IDA7Ci0gICAgRlRfQnl0ZSogICBwICAgICAgICAgID0gY21hcC0+ZGF0YSArIDEyOwotICAgIEZUX1VJbnQzMiAgbnVtX2dyb3VwcyA9IFRUX1BFRUtfVUxPTkcoIHAgKTsKLSAgICBGVF9VSW50MzIgIGNoYXJfY29kZSAgPSAqcGNoYXJfY29kZTsKLSAgICBGVF9VSW50MzIgIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkOwotICAgIEZUX1VJbnQzMiAgbWF4LCBtaW4sIG1pZDsKLQotCi0gICAgaWYgKCAhbnVtX2dyb3VwcyApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICBtaWQgPSBudW1fZ3JvdXBzOwotICAgIGVuZCA9IDB4RkZGRkZGRkZVTDsKLQotICAgIGlmICggbmV4dCApCi0gICAgewotICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIGNoYXJfY29kZSsrOwotICAgIH0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtX2dyb3VwczsKLQotICAgIC8qIGJpbmFyeSBzZWFyY2ggKi8KLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgbWlkID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgcCAgID0gY21hcC0+ZGF0YSArIDE2ICsgMTIgKiBtaWQ7Ci0KLSAgICAgIHN0YXJ0ID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZW5kICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICBlbHNlIGlmICggY2hhcl9jb2RlID4gZW5kICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3RhcnRfaWQgPSBUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICAgICAgLyogcmVqZWN0IGludmFsaWQgZ2x5cGggaW5kZXggKi8KLSAgICAgICAgaWYgKCBzdGFydF9pZCA+IDB4RkZGRkZGRkZVTCAtICggY2hhcl9jb2RlIC0gc3RhcnQgKSApCi0gICAgICAgICAgZ2luZGV4ID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggc3RhcnRfaWQgKyAoIGNoYXJfY29kZSAtIHN0YXJ0ICkgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBuZXh0ICkKLSAgICB7Ci0gICAgICBGVF9GYWNlICAgIGZhY2UgICA9IGNtYXAtPmNtYXAuY2hhcm1hcC5mYWNlOwotICAgICAgVFRfQ01hcDEyICBjbWFwMTIgPSAoVFRfQ01hcDEyKWNtYXA7Ci0KLQotICAgICAgLyogaWYgYGNoYXJfY29kZScgaXMgbm90IGluIGFueSBncm91cCwgdGhlbiBgbWlkJyBpcyAqLwotICAgICAgLyogdGhlIGdyb3VwIG5lYXJlc3QgdG8gYGNoYXJfY29kZScgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBpZiAoIGNoYXJfY29kZSA+IGVuZCApCi0gICAgICB7Ci0gICAgICAgIG1pZCsrOwotICAgICAgICBpZiAoIG1pZCA9PSBudW1fZ3JvdXBzICkKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgY21hcDEyLT52YWxpZCAgICAgICAgPSAxOwotICAgICAgY21hcDEyLT5jdXJfY2hhcmNvZGUgPSBjaGFyX2NvZGU7Ci0gICAgICBjbWFwMTItPmN1cl9ncm91cCAgICA9IG1pZDsKLQotICAgICAgaWYgKCBnaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBocyApCi0gICAgICAgIGdpbmRleCA9IDA7Ci0KLSAgICAgIGlmICggIWdpbmRleCApCi0gICAgICB7Ci0gICAgICAgIHR0X2NtYXAxMl9uZXh0KCBjbWFwMTIgKTsKLQotICAgICAgICBpZiAoIGNtYXAxMi0+dmFsaWQgKQotICAgICAgICAgIGdpbmRleCA9IGNtYXAxMi0+Y3VyX2dpbmRleDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgY21hcDEyLT5jdXJfZ2luZGV4ID0gZ2luZGV4OwotCi0gICAgICAqcGNoYXJfY29kZSA9IGNtYXAxMi0+Y3VyX2NoYXJjb2RlOwotICAgIH0KLQotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHR0X2NtYXAxMl9jaGFyX2luZGV4KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApCi0gIHsKLSAgICByZXR1cm4gdHRfY21hcDEyX2NoYXJfbWFwX2JpbmFyeSggY21hcCwgJmNoYXJfY29kZSwgMCApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHR0X2NtYXAxMl9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgVFRfQ01hcDEyICBjbWFwMTIgPSAoVFRfQ01hcDEyKWNtYXA7Ci0gICAgRlRfVUludCAgICBnaW5kZXg7Ci0KLQotICAgIC8qIG5vIG5lZWQgdG8gc2VhcmNoICovCi0gICAgaWYgKCBjbWFwMTItPnZhbGlkICYmIGNtYXAxMi0+Y3VyX2NoYXJjb2RlID09ICpwY2hhcl9jb2RlICkKLSAgICB7Ci0gICAgICB0dF9jbWFwMTJfbmV4dCggY21hcDEyICk7Ci0gICAgICBpZiAoIGNtYXAxMi0+dmFsaWQgKQotICAgICAgewotICAgICAgICBnaW5kZXggICAgICA9IGNtYXAxMi0+Y3VyX2dpbmRleDsKLSAgICAgICAgKnBjaGFyX2NvZGUgPSAoRlRfVUludDMyKWNtYXAxMi0+Y3VyX2NoYXJjb2RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBnaW5kZXggPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBnaW5kZXggPSB0dF9jbWFwMTJfY2hhcl9tYXBfYmluYXJ5KCBjbWFwLCBwY2hhcl9jb2RlLCAxICk7Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDEyX2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSBjbWFwLT5kYXRhICsgODsKLQotCi0gICAgY21hcF9pbmZvLT5mb3JtYXQgICA9IDEyOwotICAgIGNtYXBfaW5mby0+bGFuZ3VhZ2UgPSAoRlRfVUxvbmcpVFRfUEVFS19VTE9ORyggcCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1RUX0NNQVAoCi0gICAgdHRfY21hcDEyX2NsYXNzX3JlYywKLQotICAgICAgc2l6ZW9mICggVFRfQ01hcDEyUmVjICksCi0KLSAgICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcDEyX2luaXQsICAgICAgICAvKiBpbml0ICAgICAgICovCi0gICAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogZG9uZSAgICAgICAqLwotICAgICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwMTJfY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDEyX2NoYXJfbmV4dCwgICAvKiBjaGFyX25leHQgICovCi0KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpICAgIE5VTEwsICAvKiBjaGFyX3Zhcl9pbmRleCAgICovCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYylOVUxMLCAgLyogY2hhcl92YXJfZGVmYXVsdCAqLwotICAgICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgTlVMTCwgIC8qIHZhcmlhbnRfbGlzdCAgICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMpIE5VTEwsICAvKiBjaGFydmFyaWFudF9saXN0ICovCi0gICAgICAoRlRfQ01hcF9WYXJpYW50Q2hhckxpc3RGdW5jKSBOVUxMLCAgLyogdmFyaWFudGNoYXJfbGlzdCAqLwotCi0gICAgMTIsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKXR0X2NtYXAxMl92YWxpZGF0ZSwgIC8qIHZhbGlkYXRlICAgICAgKi8KLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfY21hcDEyX2dldF9pbmZvICAgLyogZ2V0X2NtYXBfaW5mbyAqLwotICApCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgIFRZUEUgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgVVNIT1JUICAgICBtdXN0IGJlIDEzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICByZXNlcnZlZCAgICAyICAgICAgICAgIFVTSE9SVCAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxlbmd0aCBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgVUxPTkcgICAgICBNYWMgbGFuZ3VhZ2UgY29kZSAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjb3VudCAgICAgICAxMiAgICAgICAgIFVMT05HICAgICAgbnVtYmVyIG9mIGdyb3VwcyAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYGNvdW50JyBncm91cHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0ICAgICAgIDAgICAgICAgICAgVUxPTkcgICAgICBmaXJzdCBjaGFyY29kZSAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBlbmQgICAgICAgICA0ICAgICAgICAgIFVMT05HICAgICAgbGFzdCBjaGFyY29kZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZ2x5cGhJZCAgICAgOCAgICAgICAgICBVTE9ORyAgICAgIGdseXBoIElEIGZvciB0aGUgd2hvbGUgZ3JvdXAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMwotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9DTWFwMTNSZWNfCi0gIHsKLSAgICBUVF9DTWFwUmVjICBjbWFwOwotICAgIEZUX0Jvb2wgICAgIHZhbGlkOwotICAgIEZUX1VMb25nICAgIGN1cl9jaGFyY29kZTsKLSAgICBGVF9VSW50ICAgICBjdXJfZ2luZGV4OwotICAgIEZUX1VMb25nICAgIGN1cl9ncm91cDsKLSAgICBGVF9VTG9uZyAgICBudW1fZ3JvdXBzOwotCi0gIH0gVFRfQ01hcDEzUmVjLCAqVFRfQ01hcDEzOwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxM19pbml0KCBUVF9DTWFwMTMgIGNtYXAsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIHRhYmxlICkKLSAgewotICAgIGNtYXAtPmNtYXAuZGF0YSAgPSB0YWJsZTsKLQotICAgIHRhYmxlICAgICAgICAgICArPSAxMjsKLSAgICBjbWFwLT5udW1fZ3JvdXBzID0gRlRfUEVFS19VTE9ORyggdGFibGUgKTsKLQotICAgIGNtYXAtPnZhbGlkICAgICAgPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxM192YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VMb25nICBsZW5ndGg7Ci0gICAgRlRfVUxvbmcgIG51bV9ncm91cHM7Ci0KLQotICAgIGlmICggdGFibGUgKyAxNiA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIHAgICAgICA9IHRhYmxlICsgNDsKLSAgICBsZW5ndGggPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBwICAgICAgICAgID0gdGFibGUgKyAxMjsKLSAgICBudW1fZ3JvdXBzID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCBsZW5ndGggPiAoRlRfVUxvbmcpKCB2YWxpZC0+bGltaXQgLSB0YWJsZSApIHx8Ci0gICAgICAgICAvKiBsZW5ndGggPCAxNiArIDEyICogbnVtX2dyb3VwcyA/ICovCi0gICAgICAgICBsZW5ndGggPCAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAoIGxlbmd0aCAtIDE2ICkgLyAxMiA8IG51bV9ncm91cHMgICAgICAgICAgICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgLyogY2hlY2sgZ3JvdXBzLCB0aGV5IG11c3QgYmUgaW4gaW5jcmVhc2luZyBvcmRlciAqLwotICAgIHsKLSAgICAgIEZUX1VMb25nICBuLCBzdGFydCwgZW5kLCBnbHlwaF9pZCwgbGFzdCA9IDA7Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ3JvdXBzOyBuKysgKQotICAgICAgewotICAgICAgICBzdGFydCAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgZW5kICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIGdseXBoX2lkID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIGlmICggc3RhcnQgPiBlbmQgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICBpZiAoIG4gPiAwICYmIHN0YXJ0IDw9IGxhc3QgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGdseXBoX2lkID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBsYXN0ID0gZW5kOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIHNlYXJjaCB0aGUgaW5kZXggb2YgdGhlIGNoYXJjb2RlIG5leHQgdG8gY21hcC0+Y3VyX2NoYXJjb2RlICovCi0gIC8qIGNtYXAtPmN1cl9ncm91cCBzaG91bGQgYmUgc2V0IHVwIHByb3Blcmx5IGJ5IGNhbGxlciAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIHR0X2NtYXAxM19uZXh0KCBUVF9DTWFwMTMgIGNtYXAgKQotICB7Ci0gICAgRlRfRmFjZSAgIGZhY2UgPSBjbWFwLT5jbWFwLmNtYXAuY2hhcm1hcC5mYWNlOwotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VMb25nICBzdGFydCwgZW5kLCBnbHlwaF9pZCwgY2hhcl9jb2RlOwotICAgIEZUX1VMb25nICBuOwotICAgIEZUX1VJbnQgICBnaW5kZXg7Ci0KLQotICAgIGlmICggY21hcC0+Y3VyX2NoYXJjb2RlID49IDB4RkZGRkZGRkZVTCApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBjaGFyX2NvZGUgPSBjbWFwLT5jdXJfY2hhcmNvZGUgKyAxOwotCi0gICAgZm9yICggbiA9IGNtYXAtPmN1cl9ncm91cDsgbiA8IGNtYXAtPm51bV9ncm91cHM7IG4rKyApCi0gICAgewotICAgICAgcCAgICAgICAgPSBjbWFwLT5jbWFwLmRhdGEgKyAxNiArIDEyICogbjsKLSAgICAgIHN0YXJ0ICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZW5kICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBnbHlwaF9pZCA9IFRUX1BFRUtfVUxPTkcoIHAgKTsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCi0gICAgICAgIGNoYXJfY29kZSA9IHN0YXJ0OwotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8PSBlbmQgKQotICAgICAgewotICAgICAgICBnaW5kZXggPSAoRlRfVUludClnbHlwaF9pZDsKLQotICAgICAgICBpZiAoIGdpbmRleCAmJiBnaW5kZXggPCAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgICAgewotICAgICAgICAgIGNtYXAtPmN1cl9jaGFyY29kZSA9IGNoYXJfY29kZTsKLSAgICAgICAgICBjbWFwLT5jdXJfZ2luZGV4ICAgPSBnaW5kZXg7Ci0gICAgICAgICAgY21hcC0+Y3VyX2dyb3VwICAgID0gbjsKLQotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIGNtYXAtPnZhbGlkID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgdHRfY21hcDEzX2NoYXJfbWFwX2JpbmFyeSggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyKiAgcGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgbmV4dCApCi0gIHsKLSAgICBGVF9VSW50ICAgIGdpbmRleCAgICAgPSAwOwotICAgIEZUX0J5dGUqICAgcCAgICAgICAgICA9IGNtYXAtPmRhdGEgKyAxMjsKLSAgICBGVF9VSW50MzIgIG51bV9ncm91cHMgPSBUVF9QRUVLX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgID0gKnBjaGFyX2NvZGU7Ci0gICAgRlRfVUludDMyICBzdGFydCwgZW5kOwotICAgIEZUX1VJbnQzMiAgbWF4LCBtaW4sIG1pZDsKLQotCi0gICAgaWYgKCAhbnVtX2dyb3VwcyApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICBtaWQgPSBudW1fZ3JvdXBzOwotICAgIGVuZCA9IDB4RkZGRkZGRkZVTDsKLQotICAgIGlmICggbmV4dCApCi0gICAgewotICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIGNoYXJfY29kZSsrOwotICAgIH0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtX2dyb3VwczsKLQotICAgIC8qIGJpbmFyeSBzZWFyY2ggKi8KLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgbWlkID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgcCAgID0gY21hcC0+ZGF0YSArIDE2ICsgMTIgKiBtaWQ7Ci0KLSAgICAgIHN0YXJ0ID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZW5kICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICBlbHNlIGlmICggY2hhcl9jb2RlID4gZW5kICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpVFRfUEVFS19VTE9ORyggcCApOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggbmV4dCApCi0gICAgewotICAgICAgRlRfRmFjZSAgICBmYWNlICAgPSBjbWFwLT5jbWFwLmNoYXJtYXAuZmFjZTsKLSAgICAgIFRUX0NNYXAxMyAgY21hcDEzID0gKFRUX0NNYXAxMyljbWFwOwotCi0KLSAgICAgIC8qIGlmIGBjaGFyX2NvZGUnIGlzIG5vdCBpbiBhbnkgZ3JvdXAsIHRoZW4gYG1pZCcgaXMgKi8KLSAgICAgIC8qIHRoZSBncm91cCBuZWFyZXN0IHRvIGBjaGFyX2NvZGUnICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPiBlbmQgKQotICAgICAgewotICAgICAgICBtaWQrKzsKLSAgICAgICAgaWYgKCBtaWQgPT0gbnVtX2dyb3VwcyApCi0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGNtYXAxMy0+dmFsaWQgICAgICAgID0gMTsKLSAgICAgIGNtYXAxMy0+Y3VyX2NoYXJjb2RlID0gY2hhcl9jb2RlOwotICAgICAgY21hcDEzLT5jdXJfZ3JvdXAgICAgPSBtaWQ7Ci0KLSAgICAgIGlmICggZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQotICAgICAgICBnaW5kZXggPSAwOwotCi0gICAgICBpZiAoICFnaW5kZXggKQotICAgICAgewotICAgICAgICB0dF9jbWFwMTNfbmV4dCggY21hcDEzICk7Ci0KLSAgICAgICAgaWYgKCBjbWFwMTMtPnZhbGlkICkKLSAgICAgICAgICBnaW5kZXggPSBjbWFwMTMtPmN1cl9naW5kZXg7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGNtYXAxMy0+Y3VyX2dpbmRleCA9IGdpbmRleDsKLQotICAgICAgKnBjaGFyX2NvZGUgPSBjbWFwMTMtPmN1cl9jaGFyY29kZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwMTNfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgcmV0dXJuIHR0X2NtYXAxM19jaGFyX21hcF9iaW5hcnkoIGNtYXAsICZjaGFyX2NvZGUsIDAgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICB0dF9jbWFwMTNfY2hhcl9uZXh0KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICpwY2hhcl9jb2RlICkKLSAgewotICAgIFRUX0NNYXAxMyAgY21hcDEzID0gKFRUX0NNYXAxMyljbWFwOwotICAgIEZUX1VJbnQgICAgZ2luZGV4OwotCi0KLSAgICAvKiBubyBuZWVkIHRvIHNlYXJjaCAqLwotICAgIGlmICggY21hcDEzLT52YWxpZCAmJiBjbWFwMTMtPmN1cl9jaGFyY29kZSA9PSAqcGNoYXJfY29kZSApCi0gICAgewotICAgICAgdHRfY21hcDEzX25leHQoIGNtYXAxMyApOwotICAgICAgaWYgKCBjbWFwMTMtPnZhbGlkICkKLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ICAgICAgPSBjbWFwMTMtPmN1cl9naW5kZXg7Ci0gICAgICAgICpwY2hhcl9jb2RlID0gY21hcDEzLT5jdXJfY2hhcmNvZGU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGdpbmRleCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdpbmRleCA9IHR0X2NtYXAxM19jaGFyX21hcF9iaW5hcnkoIGNtYXAsIHBjaGFyX2NvZGUsIDEgKTsKLQotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTNfZ2V0X2luZm8oIFRUX0NNYXAgICAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA4OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gMTM7Ci0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IChGVF9VTG9uZylUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfVFRfQ01BUCgKLSAgICB0dF9jbWFwMTNfY2xhc3NfcmVjLAotCi0gICAgICBzaXplb2YgKCBUVF9DTWFwMTNSZWMgKSwKLQotICAgICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwMTNfaW5pdCwgICAgICAgIC8qIGluaXQgICAgICAgKi8KLSAgICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBkb25lICAgICAgICovCi0gICAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXR0X2NtYXAxM19jaGFyX2luZGV4LCAgLyogY2hhcl9pbmRleCAqLwotICAgICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0dF9jbWFwMTNfY2hhcl9uZXh0LCAgIC8qIGNoYXJfbmV4dCAgKi8KLQotICAgICAgKEZUX0NNYXBfQ2hhclZhckluZGV4RnVuYykgICAgTlVMTCwgIC8qIGNoYXJfdmFyX2luZGV4ICAgKi8KLSAgICAgIChGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jKU5VTEwsICAvKiBjaGFyX3Zhcl9kZWZhdWx0ICovCi0gICAgICAoRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMpICAgICBOVUxMLCAgLyogdmFyaWFudF9saXN0ICAgICAqLwotICAgICAgKEZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykgTlVMTCwgIC8qIGNoYXJ2YXJpYW50X2xpc3QgKi8KLSAgICAgIChGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpIE5VTEwsICAvKiB2YXJpYW50Y2hhcl9saXN0ICovCi0KLSAgICAxMywKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpdHRfY21hcDEzX3ZhbGlkYXRlLCAgLyogdmFsaWRhdGUgICAgICAqLwotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYyl0dF9jbWFwMTNfZ2V0X2luZm8gICAvKiBnZXRfY21hcF9pbmZvICovCi0gICkKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgICBPRkZTRVQgIFRZUEUgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAgICAgMCAgICAgVVNIT1JUICBtdXN0IGJlIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgICAgIDIgICAgIFVMT05HICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBudW1TZWxlY3RvciAgICA2ICAgICBVTE9ORyAgIG51bWJlciBvZiB2YXJpYXRpb24gc2VsLiByZWNvcmRzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb2xsb3dlZCBieSBudW1TZWxlY3RvciByZWNvcmRzLCBlYWNoIG9mIHdoaWNoIGxvb2tzIGxpa2UgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgdmFyU2VsZWN0b3IgICAgMCAgICAgVUlOVDI0ICBVbmljb2RlIGNvZGVwb2ludCBvZiBzZWwuICAgICAgICAgICAgICAqLwotICAvKiAgIGRlZmF1bHRPZmYgICAgIDMgICAgIFVMT05HICAgb2Zmc2V0IHRvIGEgZGVmYXVsdCBVVlMgdGFibGUgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJpbmcgYW55IHZhcmlhbnRzIHRvIGJlIGZvdW5kIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbm9ybWFsIFVuaWNvZGUgc3VidGFibGUuICAgICAgICAgICAqLwotICAvKiAgIG5vbkRlZk9mZiAgICAgIDcgICAgIFVMT05HICAgb2Zmc2V0IHRvIGEgbm9uLWRlZmF1bHQgVVZTIHRhYmxlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJpbmcgYW55IHZhcmlhbnRzIG5vdCBpbiB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBjbWFwLCB3aXRoIEdJRHMgaGVyZSAgICAgICAgICAqLwotICAvKiAoZWl0aGVyIG9mZnNldCBtYXkgYmUgMCBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlbGVjdG9ycyBhcmUgc29ydGVkIGJ5IGNvZGUgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBkZWZhdWx0IFVuaWNvZGUgVmFyaWF0aW9uIFNlbGVjdG9yIChVVlMpIHN1YnRhYmxlIGlzIGp1c3QgYSBsaXN0IG9mICovCi0gIC8qIHJhbmdlcyBvZiBjb2RlIHBvaW50cyB3aGljaCBhcmUgdG8gYmUgZm91bmQgaW4gdGhlIHN0YW5kYXJkIGNtYXAuICBObyAqLwotICAvKiBnbHlwaCBJRHMgKEdJRHMpIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbnVtUmFuZ2VzICAgICAgMCAgICAgVUxPTkcgICBudW1iZXIgb2YgcmFuZ2VzIGZvbGxvd2luZyAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSByYW5nZSBsb29rcyBsaWtlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHVuaVN0YXJ0ICAgICAgIDAgICAgIFVJTlQyNCAgY29kZSBwb2ludCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgYWRkaXRpb25hbENudCAgMyAgICAgVUJZVEUgICBjb3VudCBvZiBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgaW4gdGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKHplcm8gbWVhbnMgYSByYW5nZSBvZiBhIHNpbmdsZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSYW5nZXMgYXJlIHNvcnRlZCBieSBgdW5pU3RhcnQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgbm9uLWRlZmF1bHQgVW5pY29kZSBWYXJpYXRpb24gU2VsZWN0b3IgKFVWUykgc3VidGFibGUgaXMgYSBsaXN0IG9mICAqLwotICAvKiBtYXBwaW5ncyBmcm9tIGNvZGVwb2ludCB0byBHSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbnVtTWFwcGluZ3MgICAgMCAgICAgVUxPTkcgICBudW1iZXIgb2YgbWFwcGluZ3MgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSByYW5nZSBsb29rcyBsaWtlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHVuaVN0YXJ0ICAgICAgIDAgICAgIFVJTlQyNCAgY29kZSBwb2ludCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgR0lEICAgICAgICAgICAgMyAgICAgVVNIT1JUICBhbmQgaXRzIEdJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmFuZ2VzIGFyZSBzb3J0ZWQgYnkgYHVuaVN0YXJ0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTQKLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcDE0UmVjXwotICB7Ci0gICAgVFRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VTG9uZyAgICBudW1fc2VsZWN0b3JzOwotCi0gICAgLyogVGhpcyBhcnJheSBpcyB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHRzIG9mIHZhcmlvdXMKLSAgICAgKiBjbWFwIDE0IHF1ZXJ5IGZ1bmN0aW9ucy4gIFRoZSBkYXRhIGlzIG92ZXJ3cml0dGVuCi0gICAgICogb24gZWFjaCBjYWxsIHRvIHRoZXNlIGZ1bmN0aW9ucy4KLSAgICAgKi8KLSAgICBGVF9VSW50MzIgICBtYXhfcmVzdWx0czsKLSAgICBGVF9VSW50MzIqICByZXN1bHRzOwotICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKLQotICB9IFRUX0NNYXAxNFJlYywgKlRUX0NNYXAxNDsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHR0X2NtYXAxNF9kb25lKCBUVF9DTWFwMTQgIGNtYXAgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBjbWFwLT5tZW1vcnk7Ci0KLQotICAgIGNtYXAtPm1heF9yZXN1bHRzID0gMDsKLSAgICBpZiAoIG1lbW9yeSAmJiBjbWFwLT5yZXN1bHRzICkKLSAgICAgIEZUX0ZSRUUoIGNtYXAtPnJlc3VsdHMgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X2NtYXAxNF9lbnN1cmUoIFRUX0NNYXAxNCAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBudW1fcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfVUludDMyICBvbGRfbWF4ID0gY21hcC0+bWF4X3Jlc3VsdHM7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIG51bV9yZXN1bHRzID4gY21hcC0+bWF4X3Jlc3VsdHMgKQotICAgIHsKLSAgICAgICBjbWFwLT5tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgICAgICBpZiAoIEZUX1FSRU5FV19BUlJBWSggY21hcC0+cmVzdWx0cywgb2xkX21heCwgbnVtX3Jlc3VsdHMgKSApCi0gICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICBjbWFwLT5tYXhfcmVzdWx0cyA9IG51bV9yZXN1bHRzOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxNF9pbml0KCBUVF9DTWFwMTQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIHRhYmxlICkKLSAgewotICAgIGNtYXAtPmNtYXAuZGF0YSA9IHRhYmxlOwotCi0gICAgdGFibGUgICAgICAgICAgICAgICArPSA2OwotICAgIGNtYXAtPm51bV9zZWxlY3RvcnMgID0gRlRfUEVFS19VTE9ORyggdGFibGUgKTsKLSAgICBjbWFwLT5tYXhfcmVzdWx0cyAgICA9IDA7Ci0gICAgY21hcC0+cmVzdWx0cyAgICAgICAgPSBOVUxMOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxNF92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VMb25nICBsZW5ndGg7Ci0gICAgRlRfVUxvbmcgIG51bV9zZWxlY3RvcnM7Ci0KLQotICAgIGlmICggdGFibGUgKyAyICsgNCArIDQgPiB2YWxpZC0+bGltaXQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBwICAgICAgICAgICAgID0gdGFibGUgKyAyOwotICAgIGxlbmd0aCAgICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbnVtX3NlbGVjdG9ycyA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIGlmICggbGVuZ3RoID4gKEZUX1VMb25nKSggdmFsaWQtPmxpbWl0IC0gdGFibGUgKSB8fAotICAgICAgICAgLyogbGVuZ3RoIDwgMTAgKyAxMSAqIG51bV9zZWxlY3RvcnMgPyAqLwotICAgICAgICAgbGVuZ3RoIDwgMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgKCBsZW5ndGggLSAxMCApIC8gMTEgPCBudW1fc2VsZWN0b3JzICAgICAgICApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIGNoZWNrIHNlbGVjdG9ycywgdGhleSBtdXN0IGJlIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KLSAgICB7Ci0gICAgICAvKiB3ZSBzdGFydCBsYXN0VmFyU2VsIGF0IDEgYmVjYXVzZSBhIHZhcmlhbnQgc2VsZWN0b3IgdmFsdWUgb2YgMAotICAgICAgICogaXNuJ3QgdmFsaWQuCi0gICAgICAgKi8KLSAgICAgIEZUX1VMb25nICBuLCBsYXN0VmFyU2VsID0gMTsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9zZWxlY3RvcnM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICB2YXJTZWwgICAgPSBUVF9ORVhUX1VJTlQyNCggcCApOwotICAgICAgICBGVF9VTG9uZyAgZGVmT2ZmICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBGVF9VTG9uZyAgbm9uZGVmT2ZmID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0KLSAgICAgICAgaWYgKCBkZWZPZmYgPj0gbGVuZ3RoIHx8IG5vbmRlZk9mZiA+PSBsZW5ndGggKQotICAgICAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgICAgIGlmICggdmFyU2VsIDwgbGFzdFZhclNlbCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgIGxhc3RWYXJTZWwgPSB2YXJTZWwgKyAxOwotCi0gICAgICAgIC8qIGNoZWNrIHRoZSBkZWZhdWx0IHRhYmxlICh0aGVzZSBnbHlwaHMgc2hvdWxkIGJlIHJlYWNoZWQgICAgICovCi0gICAgICAgIC8qIHRocm91Z2ggdGhlIG5vcm1hbCBVbmljb2RlIGNtYXAsIG5vIEdJRHMsIGp1c3QgY2hlY2sgb3JkZXIpICovCi0gICAgICAgIGlmICggZGVmT2ZmICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIGRlZnAgICAgID0gdGFibGUgKyBkZWZPZmY7Ci0gICAgICAgICAgRlRfVUxvbmcgIG51bVJhbmdlczsKLSAgICAgICAgICBGVF9VTG9uZyAgaTsKLSAgICAgICAgICBGVF9VTG9uZyAgbGFzdEJhc2UgPSAwOwotCi0KLSAgICAgICAgICBpZiAoIGRlZnAgKyA0ID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgICAgICAgbnVtUmFuZ2VzID0gVFRfTkVYVF9VTE9ORyggZGVmcCApOwotCi0gICAgICAgICAgLyogZGVmcCArIG51bVJhbmdlcyAqIDQgPiB2YWxpZC0+bGltaXQgPyAqLwotICAgICAgICAgIGlmICggbnVtUmFuZ2VzID4gKEZUX1VMb25nKSggdmFsaWQtPmxpbWl0IC0gZGVmcCApIC8gNCApCi0gICAgICAgICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtUmFuZ2VzOyBpKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VMb25nICBiYXNlID0gVFRfTkVYVF9VSU5UMjQoIGRlZnAgKTsKLSAgICAgICAgICAgIEZUX1VMb25nICBjbnQgID0gRlRfTkVYVF9CWVRFKCBkZWZwICk7Ci0KLQotICAgICAgICAgICAgaWYgKCBiYXNlICsgY250ID49IDB4MTEwMDAwVUwgKSAgICAgICAgICAgICAgLyogZW5kIG9mIFVuaWNvZGUgKi8KLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgICAgICBpZiAoIGJhc2UgPCBsYXN0QmFzZSApCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICAgICAgbGFzdEJhc2UgPSBiYXNlICsgY250ICsgMVU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogYW5kIHRoZSBub24tZGVmYXVsdCB0YWJsZSAodGhlc2UgZ2x5cGhzIGFyZSBzcGVjaWZpZWQgaGVyZSkgKi8KLSAgICAgICAgaWYgKCBub25kZWZPZmYgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgbmRwICAgICAgICA9IHRhYmxlICsgbm9uZGVmT2ZmOwotICAgICAgICAgIEZUX1VMb25nICBudW1NYXBwaW5nczsKLSAgICAgICAgICBGVF9VTG9uZyAgaSwgbGFzdFVuaSA9IDA7Ci0KLQotICAgICAgICAgIGlmICggbmRwICsgNCA+IHZhbGlkLT5saW1pdCApCi0gICAgICAgICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgICAgICAgIG51bU1hcHBpbmdzID0gVFRfTkVYVF9VTE9ORyggbmRwICk7Ci0KLSAgICAgICAgICAvKiBudW1NYXBwaW5ncyAqIDUgPiAoRlRfVUxvbmcpKCB2YWxpZC0+bGltaXQgLSBuZHAgKSA/ICovCi0gICAgICAgICAgaWYgKCBudW1NYXBwaW5ncyA+ICggKEZUX1VMb25nKSggdmFsaWQtPmxpbWl0IC0gbmRwICkgKSAvIDUgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VMb25nICB1bmkgPSBUVF9ORVhUX1VJTlQyNCggbmRwICk7Ci0gICAgICAgICAgICBGVF9VTG9uZyAgZ2lkID0gVFRfTkVYVF9VU0hPUlQoIG5kcCApOwotCi0KLSAgICAgICAgICAgIGlmICggdW5pID49IDB4MTEwMDAwVUwgKSAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBVbmljb2RlICovCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICAgICAgaWYgKCB1bmkgPCBsYXN0VW5pICkKLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgICAgICBsYXN0VW5pID0gdW5pICsgMVU7Ci0KLSAgICAgICAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICAgICYmCi0gICAgICAgICAgICAgICAgIGdpZCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDE0X2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VOVVNFRCggY21hcCApOwotICAgIEZUX1VOVVNFRCggY2hhcl9jb2RlICk7Ci0KLSAgICAvKiBUaGlzIGNhbid0IGhhcHBlbiAqLwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHR0X2NtYXAxNF9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBjbWFwICk7Ci0KLSAgICAvKiBUaGlzIGNhbid0IGhhcHBlbiAqLwotICAgICpwY2hhcl9jb2RlID0gMDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxNF9nZXRfaW5mbyggVFRfQ01hcCAgICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICkKLSAgewotICAgIEZUX1VOVVNFRCggY21hcCApOwotCi0gICAgY21hcF9pbmZvLT5mb3JtYXQgICA9IDE0OwotICAgIC8qIHN1YnRhYmxlIDE0IGRvZXMgbm90IGRlZmluZSBhIGxhbmd1YWdlIGZpZWxkICovCi0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IDB4RkZGRkZGRkZVTDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIHR0X2NtYXAxNF9jaGFyX21hcF9kZWZfYmluYXJ5KCBGVF9CeXRlICAgICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VJbnQzMiAgbnVtUmFuZ2VzID0gVFRfUEVFS19VTE9ORyggYmFzZSApOwotICAgIEZUX1VJbnQzMiAgbWF4LCBtaW47Ci0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtUmFuZ2VzOwotCi0gICAgYmFzZSArPSA0OwotCi0gICAgLyogYmluYXJ5IHNlYXJjaCAqLwotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIG1pZCAgID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgRlRfQnl0ZSogICBwICAgICA9IGJhc2UgKyA0ICogbWlkOwotICAgICAgRlRfVUxvbmcgICBzdGFydCA9IFRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICBGVF9VSW50ICAgIGNudCAgID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0KLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UgaWYgKCBjaGFyX2NvZGUgPiBzdGFydCArIGNudCApCi0gICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnkoIEZUX0J5dGUgICAgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludDMyICBudW1NYXBwaW5ncyA9IFRUX1BFRUtfVUxPTkcoIGJhc2UgKTsKLSAgICBGVF9VSW50MzIgIG1heCwgbWluOwotCi0KLSAgICBtaW4gPSAwOwotICAgIG1heCA9IG51bU1hcHBpbmdzOwotCi0gICAgYmFzZSArPSA0OwotCi0gICAgLyogYmluYXJ5IHNlYXJjaCAqLwotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIG1pZCA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIEZUX0J5dGUqICAgcCAgID0gYmFzZSArIDUgKiBtaWQ7Ci0gICAgICBGVF9VSW50MzIgIHVuaSA9IChGVF9VSW50MzIpVFRfTkVYVF9VSU5UMjQoIHAgKTsKLQotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8IHVuaSApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UgaWYgKCBjaGFyX2NvZGUgPiB1bmkgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0J5dGUqCi0gIHR0X2NtYXAxNF9maW5kX3ZhcmlhbnQoIEZUX0J5dGUgICAgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgIHZhcmlhbnRDb2RlICkKLSAgewotICAgIEZUX1VJbnQzMiAgbnVtVmFyID0gVFRfUEVFS19VTE9ORyggYmFzZSApOwotICAgIEZUX1VJbnQzMiAgbWF4LCBtaW47Ci0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtVmFyOwotCi0gICAgYmFzZSArPSA0OwotCi0gICAgLyogYmluYXJ5IHNlYXJjaCAqLwotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIG1pZCAgICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIEZUX0J5dGUqICAgcCAgICAgID0gYmFzZSArIDExICogbWlkOwotICAgICAgRlRfVUxvbmcgICB2YXJTZWwgPSBUVF9ORVhUX1VJTlQyNCggcCApOwotCi0KLSAgICAgIGlmICggdmFyaWFudENvZGUgPCB2YXJTZWwgKQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICBlbHNlIGlmICggdmFyaWFudENvZGUgPiB2YXJTZWwgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDE0X2NoYXJfdmFyX2luZGV4KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcCAgICB1Y21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gdHRfY21hcDE0X2ZpbmRfdmFyaWFudCggY21hcC0+ZGF0YSArIDYsIHZhcmlhbnRTZWxlY3RvciApOwotICAgIEZUX1VMb25nICBkZWZPZmY7Ci0gICAgRlRfVUxvbmcgIG5vbmRlZk9mZjsKLQotCi0gICAgaWYgKCAhcCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGRlZk9mZiAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBub25kZWZPZmYgPSBUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIGRlZk9mZiAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB0dF9jbWFwMTRfY2hhcl9tYXBfZGVmX2JpbmFyeSggY21hcC0+ZGF0YSArIGRlZk9mZiwgY2hhcmNvZGUgKSApCi0gICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgZGVmYXVsdCB2YXJpYW50IG9mIHRoaXMgY2hhcmNvZGUuICBHSUQgbm90IHN0b3JlZCAqLwotICAgICAgLyogaGVyZTsgc3RvcmVkIGluIHRoZSBub3JtYWwgVW5pY29kZSBjaGFybWFwIGluc3RlYWQuICAgICAgICAgICAqLwotICAgICAgcmV0dXJuIHVjbWFwLT5jbWFwLmNsYXp6LT5jaGFyX2luZGV4KCAmdWNtYXAtPmNtYXAsIGNoYXJjb2RlICk7Ci0gICAgfQotCi0gICAgaWYgKCBub25kZWZPZmYgIT0gMCApCi0gICAgICByZXR1cm4gdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJjb2RlICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9JbnQgKQotICB0dF9jbWFwMTRfY2hhcl92YXJfaXNkZWZhdWx0KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gdHRfY21hcDE0X2ZpbmRfdmFyaWFudCggY21hcC0+ZGF0YSArIDYsIHZhcmlhbnRTZWxlY3RvciApOwotICAgIEZUX1VMb25nICBkZWZPZmY7Ci0gICAgRlRfVUxvbmcgIG5vbmRlZk9mZjsKLQotCi0gICAgaWYgKCAhcCApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBkZWZPZmYgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbm9uZGVmT2ZmID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCBkZWZPZmYgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdHRfY21hcDE0X2NoYXJfbWFwX2RlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBkZWZPZmYsIGNoYXJjb2RlICkgKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBpZiAoIG5vbmRlZk9mZiAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmNvZGUgKSAhPSAwICAgICAgICAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyKiApCi0gIHR0X2NtYXAxNF92YXJpYW50cyggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIFRUX0NNYXAxNCAgIGNtYXAxNCA9IChUVF9DTWFwMTQpY21hcDsKLSAgICBGVF9VSW50MzIgICBjb3VudCAgPSBjbWFwMTQtPm51bV9zZWxlY3RvcnM7Ci0gICAgRlRfQnl0ZSogICAgcCAgICAgID0gY21hcC0+ZGF0YSArIDEwOwotICAgIEZUX1VJbnQzMiogIHJlc3VsdDsKLSAgICBGVF9VSW50MzIgICBpOwotCi0KLSAgICBpZiAoIHR0X2NtYXAxNF9lbnN1cmUoIGNtYXAxNCwgKCBjb3VudCArIDEgKSwgbWVtb3J5ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXN1bHQgPSBjbWFwMTQtPnJlc3VsdHM7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICByZXN1bHRbaV0gPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICBwICAgICAgICArPSA4OwotICAgIH0KLSAgICByZXN1bHRbaV0gPSAwOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKiApCi0gIHR0X2NtYXAxNF9jaGFyX3ZhcmlhbnRzKCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhckNvZGUgKQotICB7Ci0gICAgVFRfQ01hcDE0ICAgY21hcDE0ID0gKFRUX0NNYXAxNCkgIGNtYXA7Ci0gICAgRlRfVUludDMyICAgY291bnQgID0gY21hcDE0LT5udW1fc2VsZWN0b3JzOwotICAgIEZUX0J5dGUqICAgIHAgICAgICA9IGNtYXAtPmRhdGEgKyAxMDsKLSAgICBGVF9VSW50MzIqICBxOwotCi0KLSAgICBpZiAoIHR0X2NtYXAxNF9lbnN1cmUoIGNtYXAxNCwgKCBjb3VudCArIDEgKSwgbWVtb3J5ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKCBxID0gY21hcDE0LT5yZXN1bHRzOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgIHsKLSAgICAgIEZUX1VJbnQzMiAgdmFyU2VsICAgID0gVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgIEZUX1VMb25nICAgZGVmT2ZmICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgRlRfVUxvbmcgICBub25kZWZPZmYgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLQotICAgICAgaWYgKCAoIGRlZk9mZiAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHR0X2NtYXAxNF9jaGFyX21hcF9kZWZfYmluYXJ5KCBjbWFwLT5kYXRhICsgZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSApICAgICAgICAgICAgICAgICApIHx8Ci0gICAgICAgICAgICggbm9uZGVmT2ZmICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlICkgIT0gMCAgICAgICAgICkgKQotICAgICAgewotICAgICAgICBxWzBdID0gdmFyU2VsOwotICAgICAgICBxKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHFbMF0gPSAwOwotCi0gICAgcmV0dXJuIGNtYXAxNC0+cmVzdWx0czsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgdHRfY21hcDE0X2RlZl9jaGFyX2NvdW50KCBGVF9CeXRlICAqcCApCi0gIHsKLSAgICBGVF9VSW50MzIgIG51bVJhbmdlcyA9IChGVF9VSW50MzIpVFRfTkVYVF9VTE9ORyggcCApOwotICAgIEZUX1VJbnQgICAgdG90ICAgICAgID0gMDsKLQotCi0gICAgcCArPSAzOyAgLyogcG9pbnQgdG8gdGhlIGZpcnN0IGBjbnQnIGZpZWxkICovCi0gICAgZm9yICggOyBudW1SYW5nZXMgPiAwOyBudW1SYW5nZXMtLSApCi0gICAgewotICAgICAgdG90ICs9IDEgKyBwWzBdOwotICAgICAgcCAgICs9IDQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRvdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQzMioKLSAgdHRfY21hcDE0X2dldF9kZWZfY2hhcnMoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIFRUX0NNYXAxNCAgIGNtYXAxNCA9IChUVF9DTWFwMTQpIGNtYXA7Ci0gICAgRlRfVUludDMyICAgbnVtUmFuZ2VzOwotICAgIEZUX1VJbnQgICAgIGNudDsKLSAgICBGVF9VSW50MzIqICBxOwotCi0KLSAgICBjbnQgICAgICAgPSB0dF9jbWFwMTRfZGVmX2NoYXJfY291bnQoIHAgKTsKLSAgICBudW1SYW5nZXMgPSAoRlRfVUludDMyKVRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIGlmICggdHRfY21hcDE0X2Vuc3VyZSggY21hcDE0LCAoIGNudCArIDEgKSwgbWVtb3J5ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKCBxID0gY21hcDE0LT5yZXN1bHRzOyBudW1SYW5nZXMgPiAwOyBudW1SYW5nZXMtLSApCi0gICAgewotICAgICAgRlRfVUludDMyICB1bmkgPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBwICk7Ci0KLQotICAgICAgY250ID0gRlRfTkVYVF9CWVRFKCBwICkgKyAxOwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgcVswXSAgPSB1bmk7Ci0gICAgICAgIHVuaSAgKz0gMTsKLSAgICAgICAgcSAgICArPSAxOwotCi0gICAgICB9IHdoaWxlICggLS1jbnQgIT0gMCApOwotICAgIH0KLSAgICBxWzBdID0gMDsKLQotICAgIHJldHVybiBjbWFwMTQtPnJlc3VsdHM7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50MzIqCi0gIHR0X2NtYXAxNF9nZXRfbm9uZGVmX2NoYXJzKCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgIG1lbW9yeSApCi0gIHsKLSAgICBUVF9DTWFwMTQgICBjbWFwMTQgPSAoVFRfQ01hcDE0KSBjbWFwOwotICAgIEZUX1VJbnQzMiAgIG51bU1hcHBpbmdzOwotICAgIEZUX1VJbnQgICAgIGk7Ci0gICAgRlRfVUludDMyICAqcmV0OwotCi0KLSAgICBudW1NYXBwaW5ncyA9IChGVF9VSW50MzIpVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCB0dF9jbWFwMTRfZW5zdXJlKCBjbWFwMTQsICggbnVtTWFwcGluZ3MgKyAxICksIG1lbW9yeSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmV0ID0gY21hcDE0LT5yZXN1bHRzOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKyApCi0gICAgewotICAgICAgcmV0W2ldID0gKEZUX1VJbnQzMilUVF9ORVhUX1VJTlQyNCggcCApOwotICAgICAgcCArPSAyOwotICAgIH0KLSAgICByZXRbaV0gPSAwOwotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKiApCi0gIHR0X2NtYXAxNF92YXJpYW50X2NoYXJzKCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0J5dGUgICAgKnAgID0gdHRfY21hcDE0X2ZpbmRfdmFyaWFudCggY21hcC0+ZGF0YSArIDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50U2VsZWN0b3IgKTsKLSAgICBGVF9JbnQgICAgICBpOwotICAgIEZUX1VMb25nICAgIGRlZk9mZjsKLSAgICBGVF9VTG9uZyAgICBub25kZWZPZmY7Ci0KLQotICAgIGlmICggIXAgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBkZWZPZmYgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbm9uZGVmT2ZmID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCBkZWZPZmYgPT0gMCAmJiBub25kZWZPZmYgPT0gMCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmICggZGVmT2ZmID09IDAgKQotICAgICAgcmV0dXJuIHR0X2NtYXAxNF9nZXRfbm9uZGVmX2NoYXJzKCBjbWFwLCBjbWFwLT5kYXRhICsgbm9uZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKTsKLSAgICBlbHNlIGlmICggbm9uZGVmT2ZmID09IDAgKQotICAgICAgcmV0dXJuIHR0X2NtYXAxNF9nZXRfZGVmX2NoYXJzKCBjbWFwLCBjbWFwLT5kYXRhICsgZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgLyogQm90aCBhIGRlZmF1bHQgYW5kIGEgbm9uLWRlZmF1bHQgZ2x5cGggc2V0PyAgVGhhdCdzIHByb2JhYmx5IG5vdCAqLwotICAgICAgLyogZ29vZCBmb250IGRlc2lnbiwgYnV0IHRoZSBzcGVjIGFsbG93cyBmb3IgaXQuLi4gICAgICAgICAgICAgICAgICAqLwotICAgICAgVFRfQ01hcDE0ICBjbWFwMTQgPSAoVFRfQ01hcDE0KSBjbWFwOwotICAgICAgRlRfVUludDMyICBudW1SYW5nZXM7Ci0gICAgICBGVF9VSW50MzIgIG51bU1hcHBpbmdzOwotICAgICAgRlRfVUludDMyICBkdW5pOwotICAgICAgRlRfVUludDMyICBkY250OwotICAgICAgRlRfVUludDMyICBudW5pOwotICAgICAgRlRfQnl0ZSogICBkcDsKLSAgICAgIEZUX1VJbnQgICAgZGksIG5pLCBrOwotCi0gICAgICBGVF9VSW50MzIgICpyZXQ7Ci0KLQotICAgICAgcCAgPSBjbWFwLT5kYXRhICsgbm9uZGVmT2ZmOwotICAgICAgZHAgPSBjbWFwLT5kYXRhICsgZGVmT2ZmOwotCi0gICAgICBudW1NYXBwaW5ncyA9IChGVF9VSW50MzIpVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZGNudCAgICAgICAgPSB0dF9jbWFwMTRfZGVmX2NoYXJfY291bnQoIGRwICk7Ci0gICAgICBudW1SYW5nZXMgICA9IChGVF9VSW50MzIpVFRfTkVYVF9VTE9ORyggZHAgKTsKLQotICAgICAgaWYgKCBudW1NYXBwaW5ncyA9PSAwICkKLSAgICAgICAgcmV0dXJuIHR0X2NtYXAxNF9nZXRfZGVmX2NoYXJzKCBjbWFwLCBjbWFwLT5kYXRhICsgZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgICAgaWYgKCBkY250ID09IDAgKQotICAgICAgICByZXR1cm4gdHRfY21hcDE0X2dldF9ub25kZWZfY2hhcnMoIGNtYXAsIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0KLSAgICAgIGlmICggdHRfY21hcDE0X2Vuc3VyZSggY21hcDE0LCAoIGRjbnQgKyBudW1NYXBwaW5ncyArIDEgKSwgbWVtb3J5ICkgKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgcmV0ICA9IGNtYXAxNC0+cmVzdWx0czsKLSAgICAgIGR1bmkgPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBkcCApOwotICAgICAgZGNudCA9IEZUX05FWFRfQllURSggZHAgKTsKLSAgICAgIGRpICAgPSAxOwotICAgICAgbnVuaSA9IChGVF9VSW50MzIpVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgIHAgICArPSAyOwotICAgICAgbmkgICA9IDE7Ci0gICAgICBpICAgID0gMDsKLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgaWYgKCBudW5pID4gZHVuaSArIGRjbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yICggayA9IDA7IGsgPD0gZGNudDsgaysrICkKLSAgICAgICAgICAgIHJldFtpKytdID0gZHVuaSArIGs7Ci0KLSAgICAgICAgICBkaSsrOwotCi0gICAgICAgICAgaWYgKCBkaSA+IG51bVJhbmdlcyApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGR1bmkgPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBkcCApOwotICAgICAgICAgIGRjbnQgPSBGVF9ORVhUX0JZVEUoIGRwICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBudW5pIDwgZHVuaSApCi0gICAgICAgICAgICByZXRbaSsrXSA9IG51bmk7Ci0gICAgICAgICAgLyogSWYgaXQgaXMgd2l0aGluIHRoZSBkZWZhdWx0IHJhbmdlIHRoZW4gaWdub3JlIGl0IC0tICovCi0gICAgICAgICAgLyogdGhhdCBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgbmkrKzsKLSAgICAgICAgICBpZiAoIG5pID4gbnVtTWFwcGluZ3MgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBudW5pID0gKEZUX1VJbnQzMilUVF9ORVhUX1VJTlQyNCggcCApOwotICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIG5pIDw9IG51bU1hcHBpbmdzICkKLSAgICAgIHsKLSAgICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgdGhlbiB3ZSBoYXZlIHJ1biBvdXQgb2YgYWxsIGRlZmF1bHQgcmFuZ2VzLiAgICovCi0gICAgICAgIC8qIFdlIGhhdmUgcmVhZCBvbmUgbm9uLWRlZmF1bHQgbWFwcGluZyB3aGljaCB3ZSBoYXZlbid0IHN0b3JlZCAqLwotICAgICAgICAvKiBhbmQgdGhlcmUgbWF5IGJlIG90aGVycyB0aGF0IG5lZWQgdG8gYmUgcmVhZC4gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcmV0W2krK10gPSBudW5pOwotICAgICAgICB3aGlsZSAoIG5pIDwgbnVtTWFwcGluZ3MgKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0W2krK10gPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICAgICAgcCArPSAyOwotICAgICAgICAgIG5pKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBkaSA8PSBudW1SYW5nZXMgKQotICAgICAgewotICAgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIGhhdmUgcnVuIG91dCBvZiBhbGwgbm9uLWRlZmF1bHQgICAgICovCi0gICAgICAgIC8qIG1hcHBpbmdzLiAgV2UgaGF2ZSByZWFkIG9uZSBkZWZhdWx0IHJhbmdlIHdoaWNoIHdlIGhhdmVuJ3QgKi8KLSAgICAgICAgLyogc3RvcmVkIGFuZCB0aGVyZSBtYXkgYmUgb3RoZXJzIHRoYXQgbmVlZCB0byBiZSByZWFkLiAgICAgICAqLwotICAgICAgICBmb3IgKCBrID0gMDsgayA8PSBkY250OyBrKysgKQotICAgICAgICAgIHJldFtpKytdID0gZHVuaSArIGs7Ci0KLSAgICAgICAgd2hpbGUgKCBkaSA8IG51bVJhbmdlcyApCi0gICAgICAgIHsKLSAgICAgICAgICBkdW5pID0gKEZUX1VJbnQzMilUVF9ORVhUX1VJTlQyNCggZHAgKTsKLSAgICAgICAgICBkY250ID0gRlRfTkVYVF9CWVRFKCBkcCApOwotCi0gICAgICAgICAgZm9yICggayA9IDA7IGsgPD0gZGNudDsgaysrICkKLSAgICAgICAgICAgIHJldFtpKytdID0gZHVuaSArIGs7Ci0gICAgICAgICAgZGkrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXRbaV0gPSAwOwotCi0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgfQotCi0KLSAgRlRfREVGSU5FX1RUX0NNQVAoCi0gICAgdHRfY21hcDE0X2NsYXNzX3JlYywKLQotICAgICAgc2l6ZW9mICggVFRfQ01hcDE0UmVjICksCi0KLSAgICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcDE0X2luaXQsICAgICAgICAvKiBpbml0ICAgICAgICovCi0gICAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIHR0X2NtYXAxNF9kb25lLCAgICAgICAgLyogZG9uZSAgICAgICAqLwotICAgICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwMTRfY2hhcl9pbmRleCwgIC8qIGNoYXJfaW5kZXggKi8KLSAgICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDE0X2NoYXJfbmV4dCwgICAvKiBjaGFyX25leHQgICovCi0KLSAgICAgIC8qIEZvcm1hdCAxNCBleHRlbnNpb24gZnVuY3Rpb25zICovCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySW5kZXhGdW5jKSAgICB0dF9jbWFwMTRfY2hhcl92YXJfaW5kZXgsCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYyl0dF9jbWFwMTRfY2hhcl92YXJfaXNkZWZhdWx0LAotICAgICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgdHRfY21hcDE0X3ZhcmlhbnRzLAotICAgICAgKEZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykgdHRfY21hcDE0X2NoYXJfdmFyaWFudHMsCi0gICAgICAoRlRfQ01hcF9WYXJpYW50Q2hhckxpc3RGdW5jKSB0dF9jbWFwMTRfdmFyaWFudF9jaGFycywKLQotICAgIDE0LAotICAgIChUVF9DTWFwX1ZhbGlkYXRlRnVuYyl0dF9jbWFwMTRfdmFsaWRhdGUsICAvKiB2YWxpZGF0ZSAgICAgICovCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKXR0X2NtYXAxNF9nZXRfaW5mbyAgIC8qIGdldF9jbWFwX2luZm8gKi8KLSAgKQotCi0jZW5kaWYgLyogVFRfQ09ORklHX0NNQVBfRk9STUFUXzE0ICovCi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIHN0YXRpYyBjb25zdCBUVF9DTWFwX0NsYXNzICB0dF9jbWFwX2NsYXNzZXNbXSA9Ci0gIHsKLSNkZWZpbmUgVFRDTUFQQ0lURU0oIGEgKSAgJmEsCi0jaW5jbHVkZSAidHRjbWFwYy5oIgotICAgIE5VTEwsCi0gIH07Ci0KLSNlbHNlIC8qRlRfQ09ORklHX09QVElPTl9QSUMqLwotCi0gIHZvaWQKLSAgRlRfRGVzdHJveV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcF9DbGFzcyogIGNsYXp6ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIGNsYXp6ICkKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcF9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKQotICB7Ci0gICAgVFRfQ01hcF9DbGFzcyogICAgIGNsYXp6ICA9IE5VTEw7Ci0gICAgVFRfQ01hcF9DbGFzc1JlYyogIHJlY3M7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBpbnQgIGkgPSAwOwotCi0KLSNkZWZpbmUgVFRDTUFQQ0lURU0oIGEgKSBpKys7Ci0jaW5jbHVkZSAidHRjbWFwYy5oIgotCi0gICAgLyogYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBib3RoIHRoZSBwb2ludGVycyAqLwotICAgIC8qIHBsdXMgdGVybWluYXRvciBhbmQgdGhlIGNsYXNzIGluc3RhbmNlcyAgICAgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiAoIGkgKyAxICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBUVF9DTWFwX0NsYXNzUmVjICkgKiBpICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogdGhlIGxvY2F0aW9uIG9mIHRoZSBjbGFzcyBpbnN0YW5jZXMgZm9sbG93cyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgKi8KLSAgICByZWNzID0gKFRUX0NNYXBfQ2xhc3NSZWMqKSggKGNoYXIqKWNsYXp6ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggKmNsYXp6ICkgKiAoIGkgKyAxICkgKTsKLSAgICBpICAgID0gMDsKLQotI3VuZGVmIFRUQ01BUENJVEVNCi0jZGVmaW5lICBUVENNQVBDSVRFTSggYSApICAgICAgICAgICAgIFwKLSAgICBGVF9Jbml0X0NsYXNzXyAjIyBhKCAmcmVjc1tpXSApOyAgXAotICAgIGNsYXp6W2ldID0gJnJlY3NbaV07ICAgICAgICAgICAgICBcCi0gICAgaSsrOwotI2luY2x1ZGUgInR0Y21hcGMuaCIKLQotICAgIGNsYXp6W2ldID0gTlVMTDsKLQotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsKLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbmRpZiAvKkZUX0NPTkZJR19PUFRJT05fUElDKi8KLQotCi0gIC8qIHBhcnNlIHRoZSBgY21hcCcgdGFibGUgYW5kIGJ1aWxkIHRoZSBjb3JyZXNwb25kaW5nIFRUX0NNYXAgb2JqZWN0cyAqLwotICAvKiBpbiB0aGUgY3VycmVudCBmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2J1aWxkX2NtYXBzKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0J5dGUqICAgICAgICAgICB0YWJsZSA9IGZhY2UtPmNtYXBfdGFibGU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIGxpbWl0ID0gdGFibGUgKyBmYWNlLT5jbWFwX3NpemU7Ci0gICAgRlRfVUludCB2b2xhdGlsZSAgIG51bV9jbWFwczsKLSAgICBGVF9CeXRlKiB2b2xhdGlsZSAgcCAgICAgPSB0YWJsZTsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSA9IEZUX0ZBQ0VfTElCUkFSWSggZmFjZSApOwotCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0KLQotICAgIGlmICggIXAgfHwgcCArIDQgPiBsaW1pdCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICAgIC8qIG9ubHkgcmVjb2duaXplIGZvcm1hdCAwICovCi0gICAgaWYgKCBUVF9ORVhUX1VTSE9SVCggcCApICE9IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfYnVpbGRfY21hcHM6IgotICAgICAgICAgICAgICAgICAiIHVuc3VwcG9ydGVkIGBjbWFwJyB0YWJsZSBmb3JtYXQgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgVFRfUEVFS19VU0hPUlQoIHAgLSAyICkgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICB9Ci0KLSAgICBudW1fY21hcHMgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgZm9yICggOyBudW1fY21hcHMgPiAwICYmIHAgKyA4IDw9IGxpbWl0OyBudW1fY21hcHMtLSApCi0gICAgewotICAgICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsKLSAgICAgIEZUX1VJbnQzMiAgICAgIG9mZnNldDsKLQotCi0gICAgICBjaGFybWFwLnBsYXRmb3JtX2lkID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgY2hhcm1hcC5mYWNlICAgICAgICA9IEZUX0ZBQ0UoIGZhY2UgKTsKLSAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19OT05FOyAgLyogd2lsbCBiZSBmaWxsZWQgbGF0ZXIgKi8KLSAgICAgIG9mZnNldCAgICAgICAgICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggb2Zmc2V0ICYmIG9mZnNldCA8PSBmYWNlLT5jbWFwX3NpemUgLSAyICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogdm9sYXRpbGUgICAgICAgICAgICAgIGNtYXAgICA9IHRhYmxlICsgb2Zmc2V0OwotICAgICAgICB2b2xhdGlsZSBGVF9VSW50ICAgICAgICAgICAgICAgZm9ybWF0ID0gVFRfUEVFS19VU0hPUlQoIGNtYXAgKTsKLSAgICAgICAgY29uc3QgVFRfQ01hcF9DbGFzcyogdm9sYXRpbGUgIHBjbGF6eiA9IFRUX0NNQVBfQ0xBU1NFU19HRVQ7Ci0gICAgICAgIFRUX0NNYXBfQ2xhc3Mgdm9sYXRpbGUgICAgICAgICBjbGF6ejsKLQotCi0gICAgICAgIGZvciAoIDsgKnBjbGF6ejsgcGNsYXp6KysgKQotICAgICAgICB7Ci0gICAgICAgICAgY2xhenogPSAqcGNsYXp6OwotICAgICAgICAgIGlmICggY2xhenotPmZvcm1hdCA9PSBmb3JtYXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZvbGF0aWxlIFRUX1ZhbGlkYXRvclJlYyAgdmFsaWQ7Ci0gICAgICAgICAgICB2b2xhdGlsZSBGVF9FcnJvciAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICAgICAgICAgIGZ0X3ZhbGlkYXRvcl9pbml0KCBGVF9WQUxJREFUT1IoICZ2YWxpZCApLCBjbWFwLCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9ERUZBVUxUICk7Ci0KLSAgICAgICAgICAgIHZhbGlkLm51bV9nbHlwaHMgPSAoRlRfVUludClmYWNlLT5tYXhfcHJvZmlsZS5udW1HbHlwaHM7Ci0KLSAgICAgICAgICAgIGlmICggZnRfc2V0am1wKCBGVF9WQUxJREFUT1IoICZ2YWxpZCApLT5qdW1wX2J1ZmZlcikgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHZhbGlkYXRlIHRoaXMgY21hcCBzdWItdGFibGUgKi8KLSAgICAgICAgICAgICAgZXJyb3IgPSBjbGF6ei0+dmFsaWRhdGUoIGNtYXAsIEZUX1ZBTElEQVRPUiggJnZhbGlkICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCAhdmFsaWQudmFsaWRhdG9yLmVycm9yICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfQ01hcCAgdHRjbWFwOwotCi0KLSAgICAgICAgICAgICAgLyogSXQgbWlnaHQgbWFrZSBzZW5zZSB0byBzdG9yZSB0aGUgc2luZ2xlIHZhcmlhdGlvbiAgICAgICAgICovCi0gICAgICAgICAgICAgIC8qIHNlbGVjdG9yIGNtYXAgc29tZXdoZXJlIHNwZWNpYWwuICBCdXQgaXQgd291bGQgaGF2ZSB0byBiZSAqLwotICAgICAgICAgICAgICAvKiBpbiB0aGUgcHVibGljIEZUX0ZhY2VSZWMsIGFuZCB3ZSBjYW4ndCBjaGFuZ2UgdGhhdC4gICAgICAgKi8KLQotICAgICAgICAgICAgICBpZiAoICFGVF9DTWFwX05ldyggKEZUX0NNYXBfQ2xhc3MpY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWFwLCAmY2hhcm1hcCwgJnR0Y21hcCApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGl0IGlzIHNpbXBsZXIgdG8gZGlyZWN0bHkgc2V0IGBmbGFncycgdGhhbiBhZGRpbmcgKi8KLSAgICAgICAgICAgICAgICAvKiBhIHBhcmFtZXRlciB0byBGVF9DTWFwX05ldyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgKChUVF9DTWFwKXR0Y21hcCktPmZsYWdzID0gKEZUX0ludCllcnJvcjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9UUkFDRTAoKCAidHRfZmFjZV9idWlsZF9jbWFwczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgYnJva2VuIGNtYXAgc3ViLXRhYmxlIGlnbm9yZWRcbiIgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICEqcGNsYXp6ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMCgoICJ0dF9mYWNlX2J1aWxkX2NtYXBzOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIHVuc3VwcG9ydGVkIGNtYXAgc3ViLXRhYmxlIGlnbm9yZWRcbiIgKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9nZXRfY21hcF9pbmZvKCBGVF9DaGFyTWFwICAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICkKLSAgewotICAgIEZUX0NNYXAgICAgICAgIGNtYXAgID0gKEZUX0NNYXApY2hhcm1hcDsKLSAgICBUVF9DTWFwX0NsYXNzICBjbGF6eiA9IChUVF9DTWFwX0NsYXNzKWNtYXAtPmNsYXp6OwotCi0KLSAgICByZXR1cm4gY2xhenotPmdldF9jbWFwX2luZm8oIGNoYXJtYXAsIGNtYXBfaW5mbyApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dGNtYXAuaCBiL3NyYy9zZm50L3R0Y21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2YxMmRmLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3R0Y21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Y21hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSAoY21hcCkgc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUVENNQVBfSF8KLSNkZWZpbmUgVFRDTUFQX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RUX0NNQVBfSAotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIFRUX0NNQVBfRkxBR19VTlNPUlRFRCAgICAgMQotI2RlZmluZSBUVF9DTUFQX0ZMQUdfT1ZFUkxBUFBJTkcgIDIKLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcFJlY18KLSAgewotICAgIEZUX0NNYXBSZWMgIGNtYXA7Ci0gICAgRlRfQnl0ZSogICAgZGF0YTsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gaW4tbWVtb3J5IGNtYXAgdGFibGUgKi8KLSAgICBGVF9JbnQgICAgICBmbGFnczsgICAgICAgICAgLyogZm9yIGZvcm1hdCA0IG9ubHkgICAgICAgICAgICAgICAqLwotCi0gIH0gVFRfQ01hcFJlYywgKlRUX0NNYXA7Ci0KLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVFRfQ01hcF9DbGFzc1JlY18qICBUVF9DTWFwX0NsYXNzOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0NNYXBfVmFsaWRhdGVGdW5jKSggRlRfQnl0ZSogICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApOwotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9DTWFwX0NsYXNzUmVjXwotICB7Ci0gICAgRlRfQ01hcF9DbGFzc1JlYyAgICAgIGNsYXp6OwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICBmb3JtYXQ7Ci0gICAgVFRfQ01hcF9WYWxpZGF0ZUZ1bmMgIHZhbGlkYXRlOwotICAgIFRUX0NNYXBfSW5mb19HZXRGdW5jICBnZXRfY21hcF9pbmZvOwotCi0gIH0gVFRfQ01hcF9DbGFzc1JlYzsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1RUX0NNQVAoIGNsYXNzXywgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9pbmRleF8sICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX25leHRfLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdmFyX2luZGV4XywgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl92YXJfZGVmYXVsdF8sICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50X2xpc3RfLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudGNoYXJfbGlzdF8sICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlXywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NtYXBfaW5mb18gKSAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgVFRfQ01hcF9DbGFzc1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjaGFyX2luZGV4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2hhcl92YXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjaGFyX3Zhcl9kZWZhdWx0XywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2hhcnZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB2YXJpYW50Y2hhcl9saXN0XyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2YWxpZGF0ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9jbWFwX2luZm9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1RUX0NNQVAoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9pbmRleF8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX25leHRfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdmFyX2luZGV4XywgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl92YXJfZGVmYXVsdF8sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50X2xpc3RfLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudGNoYXJfbGlzdF8sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NtYXBfaW5mb18gKSAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBUVF9DTWFwX0NsYXNzUmVjKiAgY2xhenogKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmNsYXp6LnNpemUgICAgICAgICAgICAgPSBzaXplXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2xhenouaW5pdCAgICAgICAgICAgICA9IGluaXRfOyAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jbGF6ei5kb25lICAgICAgICAgICAgID0gZG9uZV87ICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmNsYXp6LmNoYXJfaW5kZXggICAgICAgPSBjaGFyX2luZGV4XzsgICAgICAgIFwKLSAgICBjbGF6ei0+Y2xhenouY2hhcl9uZXh0ICAgICAgICA9IGNoYXJfbmV4dF87ICAgICAgICAgXAotICAgIGNsYXp6LT5jbGF6ei5jaGFyX3Zhcl9pbmRleCAgID0gY2hhcl92YXJfaW5kZXhfOyAgICBcCi0gICAgY2xhenotPmNsYXp6LmNoYXJfdmFyX2RlZmF1bHQgPSBjaGFyX3Zhcl9kZWZhdWx0XzsgIFwKLSAgICBjbGF6ei0+Y2xhenoudmFyaWFudF9saXN0ICAgICA9IHZhcmlhbnRfbGlzdF87ICAgICAgXAotICAgIGNsYXp6LT5jbGF6ei5jaGFydmFyaWFudF9saXN0ID0gY2hhcnZhcmlhbnRfbGlzdF87ICBcCi0gICAgY2xhenotPmNsYXp6LnZhcmlhbnRjaGFyX2xpc3QgPSB2YXJpYW50Y2hhcl9saXN0XzsgIFwKLSAgICBjbGF6ei0+Zm9ybWF0ICAgICAgICAgICAgICAgICA9IGZvcm1hdF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT52YWxpZGF0ZSAgICAgICAgICAgICAgID0gdmFsaWRhdGVfOyAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9jbWFwX2luZm8gICAgICAgICAgPSBnZXRfY21hcF9pbmZvXzsgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9WYWxpZGF0b3JSZWNfCi0gIHsKLSAgICBGVF9WYWxpZGF0b3JSZWMgIHZhbGlkYXRvcjsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9nbHlwaHM7Ci0KLSAgfSBUVF9WYWxpZGF0b3JSZWMsICpUVF9WYWxpZGF0b3I7Ci0KLQotI2RlZmluZSBUVF9WQUxJREFUT1IoIHggKSAgICAgICAgICAoIChUVF9WYWxpZGF0b3IpKCB4ICkgKQotI2RlZmluZSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggeCApICBUVF9WQUxJREFUT1IoIHggKS0+bnVtX2dseXBocwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9idWlsZF9jbWFwcyggVFRfRmFjZSAgZmFjZSApOwotCi0gIC8qIHVzZWQgaW4gdHQtY21hcHMgc2VydmljZSAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9nZXRfY21hcF9pbmZvKCBGVF9DaGFyTWFwICAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVFRDTUFQX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dGNtYXBjLmggYi9zcmMvc2ZudC90dGNtYXBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNWU3MDguLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRjbWFwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRjbWFwYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRUIENNQVAgY2xhc3NlcyBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzAKLSAgVFRDTUFQQ0lURU0oIHR0X2NtYXAwX2NsYXNzX3JlYyApCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8yCi0gIFRUQ01BUENJVEVNKCB0dF9jbWFwMl9jbGFzc19yZWMgKQotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNAotICBUVENNQVBDSVRFTSggdHRfY21hcDRfY2xhc3NfcmVjICkKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzYKLSAgVFRDTUFQQ0lURU0oIHR0X2NtYXA2X2NsYXNzX3JlYyApCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF84Ci0gIFRUQ01BUENJVEVNKCB0dF9jbWFwOF9jbGFzc19yZWMgKQotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTAKLSAgVFRDTUFQQ0lURU0oIHR0X2NtYXAxMF9jbGFzc19yZWMgKQotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTIKLSAgVFRDTUFQQ0lURU0oIHR0X2NtYXAxMl9jbGFzc19yZWMgKQotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTMKLSAgVFRDTUFQQ0lURU0oIHR0X2NtYXAxM19jbGFzc19yZWMgKQotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTQKLSAgVFRDTUFQQ0lURU0oIHR0X2NtYXAxNF9jbGFzc19yZWMgKQotI2VuZGlmCi0KLQotICAvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0a2Vybi5jIGIvc3JjL3NmbnQvdHRrZXJuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5N2U1NzguLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRrZXJuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRrZXJuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIGJhc2ljIFRydWVUeXBlIGtlcm5pbmcgdGFibGUuICBUaGlzIGRvZXNuJ3QgaGFuZGxlICAgICAgICAgICovCi0vKiAgICBrZXJuaW5nIGRhdGEgd2l0aGluIHRoZSBHUE9TIHRhYmxlIGF0IHRoZSBtb21lbnQuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSAidHRrZXJuLmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRrZXJuCi0KLQotI3VuZGVmICBUVF9LRVJOX0lOREVYCi0jZGVmaW5lIFRUX0tFUk5fSU5ERVgoIGcxLCBnMiApICAoICggKEZUX1VMb25nKShnMSkgPDwgMTYgKSB8IChnMikgKQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9rZXJuKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1VMb25nICAgdGFibGVfc2l6ZTsKLSAgICBGVF9CeXRlKiAgIHA7Ci0gICAgRlRfQnl0ZSogICBwX2xpbWl0OwotICAgIEZUX1VJbnQgICAgbm4sIG51bV90YWJsZXM7Ci0gICAgRlRfVUludDMyICBhdmFpbCA9IDAsIG9yZGVyZWQgPSAwOwotCi0KLSAgICAvKiB0aGUga2VybiB0YWJsZSBpcyBvcHRpb25hbDsgZXhpdCBzaWxlbnRseSBpZiBpdCBpcyBtaXNzaW5nICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2tlcm4sIHN0cmVhbSwgJnRhYmxlX3NpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggdGFibGVfc2l6ZSA8IDQgKSAgLyogdGhlIGNhc2Ugb2YgYSBtYWxmb3JtZWQgdGFibGUgKi8KLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ0dF9mYWNlX2xvYWRfa2VybjoiCi0gICAgICAgICAgICAgICAgICIga2VybmluZyB0YWJsZSBpcyB0b28gc21hbGwgLSBpZ25vcmVkXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVGFibGVfTWlzc2luZyApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggdGFibGVfc2l6ZSwgZmFjZS0+a2Vybl90YWJsZSApICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ0dF9mYWNlX2xvYWRfa2VybjoiCi0gICAgICAgICAgICAgICAgICIgY291bGQgbm90IGV4dHJhY3Qga2VybmluZyB0YWJsZVxuIiApKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBmYWNlLT5rZXJuX3RhYmxlX3NpemUgPSB0YWJsZV9zaXplOwotCi0gICAgcCAgICAgICA9IGZhY2UtPmtlcm5fdGFibGU7Ci0gICAgcF9saW1pdCA9IHAgKyB0YWJsZV9zaXplOwotCi0gICAgcCAgICAgICAgICs9IDI7IC8qIHNraXAgdmVyc2lvbiAqLwotICAgIG51bV90YWJsZXMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgaWYgKCBudW1fdGFibGVzID4gMzIgKSAvKiB3ZSBvbmx5IHN1cHBvcnQgdXAgdG8gMzIgc3ViLXRhYmxlcyAqLwotICAgICAgbnVtX3RhYmxlcyA9IDMyOwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IG51bV90YWJsZXM7IG5uKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgbnVtX3BhaXJzLCBsZW5ndGgsIGNvdmVyYWdlOwotICAgICAgRlRfQnl0ZSogICBwX25leHQ7Ci0gICAgICBGVF9VSW50MzIgIG1hc2sgPSAoRlRfVUludDMyKTFVTCA8PCBubjsKLQotCi0gICAgICBpZiAoIHAgKyA2ID4gcF9saW1pdCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBwX25leHQgPSBwOwotCi0gICAgICBwICs9IDI7IC8qIHNraXAgdmVyc2lvbiAqLwotICAgICAgbGVuZ3RoICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgY292ZXJhZ2UgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICBpZiAoIGxlbmd0aCA8PSA2ICsgOCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBwX25leHQgKz0gbGVuZ3RoOwotCi0gICAgICBpZiAoIHBfbmV4dCA+IHBfbGltaXQgKSAgLyogaGFuZGxlIGJyb2tlbiB0YWJsZSAqLwotICAgICAgICBwX25leHQgPSBwX2xpbWl0OwotCi0gICAgICAvKiBvbmx5IHVzZSBob3Jpem9udGFsIGtlcm5pbmcgdGFibGVzICovCi0gICAgICBpZiAoICggY292ZXJhZ2UgJiAzVSApICE9IDB4MDAwMSB8fAotICAgICAgICAgICBwICsgOCA+IHBfbmV4dCAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIE5leHRUYWJsZTsKLQotICAgICAgbnVtX3BhaXJzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIHAgICAgICAgICs9IDY7Ci0KLSAgICAgIGlmICggKCBwX25leHQgLSBwICkgPCA2ICogKGludCludW1fcGFpcnMgKSAvKiBoYW5kbGUgYnJva2VuIGNvdW50ICovCi0gICAgICAgIG51bV9wYWlycyA9IChGVF9VSW50KSggKCBwX25leHQgLSBwICkgLyA2ICk7Ci0KLSAgICAgIGF2YWlsIHw9IG1hc2s7Ci0KLSAgICAgIC8qCi0gICAgICAgKiAgTm93IGNoZWNrIHdoZXRoZXIgdGhlIHBhaXJzIGluIHRoaXMgdGFibGUgYXJlIG9yZGVyZWQuCi0gICAgICAgKiAgV2UgdGhlbiBjYW4gdXNlIGJpbmFyeSBzZWFyY2guCi0gICAgICAgKi8KLSAgICAgIGlmICggbnVtX3BhaXJzID4gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBjb3VudDsKLSAgICAgICAgRlRfVUxvbmcgIG9sZF9wYWlyOwotCi0KLSAgICAgICAgb2xkX3BhaXIgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIHAgICAgICAgKz0gMjsKLQotICAgICAgICBmb3IgKCBjb3VudCA9IG51bV9wYWlycyAtIDE7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50MzIgIGN1cl9wYWlyOwotCi0KLSAgICAgICAgICBjdXJfcGFpciA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgICBpZiAoIGN1cl9wYWlyIDw9IG9sZF9wYWlyICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgcCArPSAyOwotICAgICAgICAgIG9sZF9wYWlyID0gY3VyX3BhaXI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGNvdW50ID09IDAgKQotICAgICAgICAgIG9yZGVyZWQgfD0gbWFzazsKLSAgICAgIH0KLQotICAgIE5leHRUYWJsZToKLSAgICAgIHAgPSBwX25leHQ7Ci0gICAgfQotCi0gICAgZmFjZS0+bnVtX2tlcm5fdGFibGVzID0gbm47Ci0gICAgZmFjZS0+a2Vybl9hdmFpbF9iaXRzID0gYXZhaWw7Ci0gICAgZmFjZS0+a2Vybl9vcmRlcl9iaXRzID0gb3JkZXJlZDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9kb25lX2tlcm4oIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLQotCi0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+a2Vybl90YWJsZSApOwotICAgIGZhY2UtPmtlcm5fdGFibGVfc2l6ZSA9IDA7Ci0gICAgZmFjZS0+bnVtX2tlcm5fdGFibGVzID0gMDsKLSAgICBmYWNlLT5rZXJuX2F2YWlsX2JpdHMgPSAwOwotICAgIGZhY2UtPmtlcm5fb3JkZXJfYml0cyA9IDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfSW50ICkKLSAgdHRfZmFjZV9nZXRfa2VybmluZyggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcmlnaHRfZ2x5cGggKQotICB7Ci0gICAgRlRfSW50ICAgIHJlc3VsdCA9IDA7Ci0gICAgRlRfVUludCAgIGNvdW50LCBtYXNrOwotICAgIEZUX0J5dGUqICBwICAgICAgID0gZmFjZS0+a2Vybl90YWJsZTsKLSAgICBGVF9CeXRlKiAgcF9saW1pdCA9IHAgKyBmYWNlLT5rZXJuX3RhYmxlX3NpemU7Ci0KLQotICAgIHAgICArPSA0OwotICAgIG1hc2sgPSAweDAwMDE7Ci0KLSAgICBmb3IgKCBjb3VudCA9IGZhY2UtPm51bV9rZXJuX3RhYmxlczsKLSAgICAgICAgICBjb3VudCA+IDAgJiYgcCArIDYgPD0gcF9saW1pdDsKLSAgICAgICAgICBjb3VudC0tLCBtYXNrIDw8PSAxICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiBiYXNlICAgICA9IHA7Ci0gICAgICBGVF9CeXRlKiBuZXh0OwotICAgICAgRlRfVUludCAgdmVyc2lvbiAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgRlRfVUludCAgbGVuZ3RoICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgRlRfVUludCAgY292ZXJhZ2UgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgRlRfVUludCAgbnVtX3BhaXJzOwotICAgICAgRlRfSW50ICAgdmFsdWUgICAgPSAwOwotCi0gICAgICBGVF9VTlVTRUQoIHZlcnNpb24gKTsKLQotCi0gICAgICBuZXh0ID0gYmFzZSArIGxlbmd0aDsKLQotICAgICAgaWYgKCBuZXh0ID4gcF9saW1pdCApICAvKiBoYW5kbGUgYnJva2VuIHRhYmxlICovCi0gICAgICAgIG5leHQgPSBwX2xpbWl0OwotCi0gICAgICBpZiAoICggZmFjZS0+a2Vybl9hdmFpbF9iaXRzICYgbWFzayApID09IDAgKQotICAgICAgICBnb3RvIE5leHRUYWJsZTsKLQotICAgICAgRlRfQVNTRVJUKCBwICsgOCA8PSBuZXh0ICk7IC8qIHRlc3RlZCBpbiB0dF9mYWNlX2xvYWRfa2VybiAqLwotCi0gICAgICBudW1fcGFpcnMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgcCAgICAgICAgKz0gNjsKLQotICAgICAgaWYgKCAoIG5leHQgLSBwICkgPCA2ICogKGludCludW1fcGFpcnMgKSAgLyogaGFuZGxlIGJyb2tlbiBjb3VudCAgKi8KLSAgICAgICAgbnVtX3BhaXJzID0gKEZUX1VJbnQpKCAoIG5leHQgLSBwICkgLyA2ICk7Ci0KLSAgICAgIHN3aXRjaCAoIGNvdmVyYWdlID4+IDggKQotICAgICAgewotICAgICAgY2FzZSAwOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUxvbmcgIGtleTAgPSBUVF9LRVJOX0lOREVYKCBsZWZ0X2dseXBoLCByaWdodF9nbHlwaCApOwotCi0KLSAgICAgICAgICBpZiAoIGZhY2UtPmtlcm5fb3JkZXJfYml0cyAmIG1hc2sgKSAgIC8qIGJpbmFyeSBzZWFyY2ggKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICAgbWluID0gMDsKLSAgICAgICAgICAgIEZUX1VJbnQgICBtYXggPSBudW1fcGFpcnM7Ci0KLQotICAgICAgICAgICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9VSW50ICAgbWlkID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgICAgICAgICBGVF9CeXRlKiAgcSAgID0gcCArIDYgKiBtaWQ7Ci0gICAgICAgICAgICAgIEZUX1VMb25nICBrZXk7Ci0KLQotICAgICAgICAgICAgICBrZXkgPSBGVF9ORVhUX1VMT05HKCBxICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBrZXkgPT0ga2V5MCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZUX1BFRUtfU0hPUlQoIHEgKTsKLSAgICAgICAgICAgICAgICBnb3RvIEZvdW5kOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmICgga2V5IDwga2V5MCApCi0gICAgICAgICAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1heCA9IG1pZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSAvKiBsaW5lYXIgc2VhcmNoICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgY291bnQyOwotCi0KLSAgICAgICAgICAgIGZvciAoIGNvdW50MiA9IG51bV9wYWlyczsgY291bnQyID4gMDsgY291bnQyLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9VTG9uZyAga2V5ID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0KLSAgICAgICAgICAgICAgaWYgKCBrZXkgPT0ga2V5MCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZUX1BFRUtfU0hPUlQoIHAgKTsKLSAgICAgICAgICAgICAgICBnb3RvIEZvdW5kOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAvKgotICAgICAgICAqICBXZSBkb24ndCBzdXBwb3J0IGZvcm1hdCAyIGJlY2F1c2Ugd2UgaGF2ZW4ndCBzZWVuIGEgc2luZ2xlIGZvbnQKLSAgICAgICAgKiAgdXNpbmcgaXQgaW4gcmVhbCBsaWZlLi4uCi0gICAgICAgICovCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIDsKLSAgICAgIH0KLQotICAgICAgZ290byBOZXh0VGFibGU7Ci0KLSAgICBGb3VuZDoKLSAgICAgIGlmICggY292ZXJhZ2UgJiA4ICkgLyogb3ZlcnJpZGUgb3IgYWRkICovCi0gICAgICAgIHJlc3VsdCA9IHZhbHVlOwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgKz0gdmFsdWU7Ci0KLSAgICBOZXh0VGFibGU6Ci0gICAgICBwID0gbmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSN1bmRlZiBUVF9LRVJOX0lOREVYCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRrZXJuLmggYi9zcmMvc2ZudC90dGtlcm4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxYTMwYi4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dGtlcm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0a2Vybi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSBrZXJuaW5nIHRhYmxlLiAgVGhpcyBkb2Vzbid0IGhhbmRsZSAgICAgICAgICAqLwotLyogICAga2VybmluZyBkYXRhIHdpdGhpbiB0aGUgR1BPUyB0YWJsZSBhdCB0aGUgbW9tZW50LiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVFRLRVJOX0hfCi0jZGVmaW5lIFRUS0VSTl9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciAgKQotICB0dF9mYWNlX2xvYWRfa2VybiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZG9uZV9rZXJuKCBUVF9GYWNlICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0ludCApCi0gIHR0X2ZhY2VfZ2V0X2tlcm5pbmcoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoICk7Ci0KLSNkZWZpbmUgVFRfRkFDRV9IQVNfS0VSTklORyggZmFjZSApICAoIChmYWNlKS0+a2Vybl9hdmFpbF9iaXRzICE9IDAgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFRUS0VSTl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRsb2FkLmMgYi9zcmMvc2ZudC90dGxvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5OWJhYS4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dGxvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIGJhc2ljIFRydWVUeXBlIHRhYmxlcywgaS5lLiwgdGFibGVzIHRoYXQgY2FuIGJlIGVpdGhlciBpbiAgICovCi0vKiAgICBUVEYgb3IgT1RGIGZvbnRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSAidHRsb2FkLmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRsb2FkCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb29rcyBmb3IgYSBUcnVlVHlwZSB0YWJsZSBieSBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgZmFjZSBvYmplY3QgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgOjogVGhlIHNlYXJjaGVkIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byB0aGUgdGFibGUgZGlyZWN0b3J5IGVudHJ5LiAgMCBpZiBub3QgZm91bmQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBUVF9UYWJsZSAgKQotICB0dF9mYWNlX2xvb2t1cF90YWJsZSggVFRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdGFnICApCi0gIHsKLSAgICBUVF9UYWJsZSAgZW50cnk7Ci0gICAgVFRfVGFibGUgIGxpbWl0OwotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgRlRfQm9vbCAgIHplcm9fbGVuZ3RoID0gRkFMU0U7Ci0jZW5kaWYKLQotCi0gICAgRlRfVFJBQ0U0KCggInR0X2ZhY2VfbG9va3VwX3RhYmxlOiAlMDhwLCBgJWMlYyVjJWMnIC0tICIsCi0gICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhZyA+PiAyNCApLAotICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFnID4+IDE2ICksCi0gICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWcgPj4gOCAgKSwKLSAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhZyAgICAgICApICkpOwotCi0gICAgZW50cnkgPSBmYWNlLT5kaXJfdGFibGVzOwotICAgIGxpbWl0ID0gZW50cnkgKyBmYWNlLT5udW1fdGFibGVzOwotCi0gICAgZm9yICggOyBlbnRyeSA8IGxpbWl0OyBlbnRyeSsrICkKLSAgICB7Ci0gICAgICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MsIHdlIGNvbnNpZGVyICAgICovCi0gICAgICAvKiB6ZXJvLWxlbmd0aCB0YWJsZXMgdGhlIHNhbWUgYXMgbWlzc2luZyB0YWJsZXMuICovCi0gICAgICBpZiAoIGVudHJ5LT5UYWcgPT0gdGFnICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBlbnRyeS0+TGVuZ3RoICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggImZvdW5kIHRhYmxlLlxuIiApKTsKLSAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgIH0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICB6ZXJvX2xlbmd0aCA9IFRSVUU7Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgIGlmICggemVyb19sZW5ndGggKQotICAgICAgRlRfVFJBQ0U0KCggImlnbm9yaW5nIGVtcHR5IHRhYmxlXG4iICkpOwotICAgIGVsc2UKLSAgICAgIEZUX1RSQUNFNCgoICJjb3VsZCBub3QgZmluZCB0YWJsZVxuIiApKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZ290b190YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvb2tzIGZvciBhIFRydWVUeXBlIHRhYmxlIGJ5IG5hbWUsIHRoZW4gc2VlayBhIHN0cmVhbSB0byBpdC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGZhY2Ugb2JqZWN0IGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IFRoZSBzZWFyY2hlZCB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIHN0cmVhbSB0byBzZWVrIHdoZW4gdGhlIHRhYmxlIGlzIGZvdW5kLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2UuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2dvdG9fdGFibGUoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApCi0gIHsKLSAgICBUVF9UYWJsZSAgdGFibGU7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICB0YWJsZSA9IHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCB0YWcgKTsKLSAgICBpZiAoIHRhYmxlICkKLSAgICB7Ci0gICAgICBpZiAoIGxlbmd0aCApCi0gICAgICAgICpsZW5ndGggPSB0YWJsZS0+TGVuZ3RoOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCB0YWJsZS0+T2Zmc2V0ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFRhYmxlX01pc3NpbmcgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogSGVyZSwgd2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY2hlY2sgdGhhdCBgbnVtX3RhYmxlcycgaXMgdmFsaWQgKGFuZCBhZGp1c3QgaXQgaWYgbmVjZXNzYXJ5KTsgKi8KLSAgLyogICBhbHNvIHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbGlkIHRhYmxlIGVudHJpZXMgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gbG9vayBmb3IgYSBgaGVhZCcgdGFibGUsIGNoZWNrIGl0cyBzaXplLCBhbmQgcGFyc2UgaXQgdG8gY2hlY2sgKi8KLSAgLyogICB3aGV0aGVyIGl0cyBgbWFnaWMnIGZpZWxkIGlzIGNvcnJlY3RseSBzZXQgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gZXJyb3JzIChleGNlcHQgZXJyb3JzIHJldHVybmVkIGJ5IHN0cmVhbSBoYW5kbGluZykgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgU0ZOVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIG5vIHRhYmxlIGlzIGRlZmluZWQgaW4gZGlyZWN0b3J5LCBpdCBpcyBub3Qgc2ZudC13cmFwcGVkICAgKi8KLSAgLyogICAgICAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgU0ZOVF9FcnJfVGFibGVfTWlzc2luZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHRhYmxlIGRpcmVjdG9yeSBpcyB2YWxpZCwgYnV0IGVzc2VudGlhbCB0YWJsZXMgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgKGhlYWQvYmhlZC9TSU5HKSBhcmUgbWlzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaGVja190YWJsZV9kaXIoIFNGTlRfSGVhZGVyICBzZm50LAotICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgIHZhbGlkICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfVVNob3J0ICBubiwgdmFsaWRfZW50cmllcyA9IDA7Ci0gICAgRlRfVUludCAgICBoYXNfaGVhZCA9IDAsIGhhc19zaW5nID0gMCwgaGFzX21ldGEgPSAwOwotICAgIEZUX1VMb25nICAgb2Zmc2V0ID0gc2ZudC0+b2Zmc2V0ICsgMTI7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHRhYmxlX2Rpcl9lbnRyeV9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9UYWJsZVJlYwotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMTYgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIFRhZyApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggQ2hlY2tTdW0gKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIE9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggTGVuZ3RoICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgc2ZudC0+bnVtX3RhYmxlczsgbm4rKyApCi0gICAgewotICAgICAgVFRfVGFibGVSZWMgIHRhYmxlOwotCi0KLSAgICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCB0YWJsZV9kaXJfZW50cnlfZmllbGRzLCAmdGFibGUgKSApCi0gICAgICB7Ci0gICAgICAgIG5uLS07Ci0gICAgICAgIEZUX1RSQUNFMigoICJjaGVja190YWJsZV9kaXI6IgotICAgICAgICAgICAgICAgICAgICAiIGNhbiByZWFkIG9ubHkgJWQgdGFibGUlcyBpbiBmb250IChpbnN0ZWFkIG9mICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgbm4sIG5uID09IDEgPyAiIiA6ICJzIiwgc2ZudC0+bnVtX3RhYmxlcyApKTsKLSAgICAgICAgc2ZudC0+bnVtX3RhYmxlcyA9IG5uOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLyogd2UgaWdub3JlIGludmFsaWQgdGFibGVzICovCi0KLSAgICAgIGlmICggdGFibGUuT2Zmc2V0ID4gc3RyZWFtLT5zaXplICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggImNoZWNrX3RhYmxlX2RpcjogdGFibGUgZW50cnkgJWQgaW52YWxpZFxuIiwgbm4gKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHRhYmxlLkxlbmd0aCA+IHN0cmVhbS0+c2l6ZSAtIHRhYmxlLk9mZnNldCApCi0gICAgICB7Ci0gICAgICAgIC8qIFNvbWUgdGFibGVzIGhhdmUgc3VjaCBhIHNpbXBsZSBzdHJ1Y3R1cmUgdGhhdCBjbGlwcGluZyBpdHMgICAgICovCi0gICAgICAgIC8qIGNvbnRlbnRzIGlzIGhhcm1sZXNzLiAgVGhpcyBhbHNvIG1ha2VzIEZyZWVUeXBlIGxlc3Mgc2Vuc2l0aXZlICovCi0gICAgICAgIC8qIHRvIGludmFsaWQgdGFibGUgbGVuZ3RocyAod2hpY2ggcHJvZ3JhbXMgbGlrZSBBY3JvcmVhZCBzZWVtIHRvICovCi0gICAgICAgIC8qIGlnbm9yZSBpbiBnZW5lcmFsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19obXR4IHx8Ci0gICAgICAgICAgICAgdGFibGUuVGFnID09IFRUQUdfdm10eCApCi0gICAgICAgICAgdmFsaWRfZW50cmllcysrOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTIoKCAiY2hlY2tfdGFibGVfZGlyOiB0YWJsZSBlbnRyeSAlZCBpbnZhbGlkXG4iLCBubiApKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB2YWxpZF9lbnRyaWVzKys7Ci0KLSAgICAgIGlmICggdGFibGUuVGFnID09IFRUQUdfaGVhZCB8fCB0YWJsZS5UYWcgPT0gVFRBR19iaGVkICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludDMyICBtYWdpYzsKLQotCi0jaWZuZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotICAgICAgICBpZiAoIHRhYmxlLlRhZyA9PSBUVEFHX2hlYWQgKQotI2VuZGlmCi0gICAgICAgICAgaGFzX2hlYWQgPSAxOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSB0YWJsZSBsZW5ndGggc2hvdWxkIGJlIDB4MzYsIGJ1dCBjZXJ0YWluIGZvbnQgdG9vbHMgbWFrZSBpdAotICAgICAgICAgKiAweDM4LCBzbyB3ZSB3aWxsIGp1c3QgY2hlY2sgdGhhdCBpdCBpcyBncmVhdGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBOb3RlIHRoYXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLCB0aGUgdGFibGUgbXVzdCBiZQotICAgICAgICAgKiBwYWRkZWQgdG8gMzItYml0IGxlbmd0aHMsIGJ1dCB0aGlzIGRvZXNuJ3QgYXBwbHkgdG8gdGhlIHZhbHVlIG9mCi0gICAgICAgICAqIGl0cyBgTGVuZ3RoJyBmaWVsZCEKLSAgICAgICAgICoKLSAgICAgICAgICovCi0gICAgICAgIGlmICggdGFibGUuTGVuZ3RoIDwgMHgzNiApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTIoKCAiY2hlY2tfdGFibGVfZGlyOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIGBoZWFkJyBvciBgYmhlZCcgdGFibGUgdG9vIHNtYWxsXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIFRhYmxlX01pc3NpbmcgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCB0YWJsZS5PZmZzZXQgKyAxMiApIHx8Ci0gICAgICAgICAgICAgRlRfUkVBRF9VTE9ORyggbWFnaWMgKSAgICAgICAgICAgICAgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIG1hZ2ljICE9IDB4NUYwRjNDRjVVTCApCi0gICAgICAgICAgRlRfVFJBQ0UyKCggImNoZWNrX3RhYmxlX2RpcjoiCi0gICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIG1hZ2ljIG51bWJlciBpbiBgaGVhZCcgb3IgYGJoZWQnIHRhYmxlXG4iKSk7Ci0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICsgKCBubiArIDEgKSAqIDE2ICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19TSU5HICkKLSAgICAgICAgaGFzX3NpbmcgPSAxOwotICAgICAgZWxzZSBpZiAoIHRhYmxlLlRhZyA9PSBUVEFHX01FVEEgKQotICAgICAgICBoYXNfbWV0YSA9IDE7Ci0gICAgfQotCi0gICAgKnZhbGlkID0gdmFsaWRfZW50cmllczsKLQotICAgIGlmICggIXZhbGlkX2VudHJpZXMgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJjaGVja190YWJsZV9kaXI6IG5vIHZhbGlkIHRhYmxlcyBmb3VuZFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBpZiBgc2luZycgYW5kIGBtZXRhJyB0YWJsZXMgYXJlIHByZXNlbnQsIHRoZXJlIGlzIG5vIGBoZWFkJyB0YWJsZSAqLwotICAgIGlmICggaGFzX2hlYWQgfHwgKCBoYXNfc2luZyAmJiBoYXNfbWV0YSApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJjaGVja190YWJsZV9kaXI6IiApKTsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLSAgICAgIEZUX1RSQUNFMigoICIgbmVpdGhlciBgaGVhZCcsIGBiaGVkJywgbm9yIGBzaW5nJyB0YWJsZSBmb3VuZFxuIiApKTsKLSNlbHNlCi0gICAgICBGVF9UUkFDRTIoKCAiIG5laXRoZXIgYGhlYWQnIG5vciBgc2luZycgdGFibGUgZm91bmRcbiIgKSk7Ci0jZW5kaWYKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFRhYmxlX01pc3NpbmcgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9mb250X2RpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBoZWFkZXIgb2YgYSBTRk5UIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2ZudCAgICAgICA6OiBUaGUgU0ZOVCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb250IGRpcmVjdG9yeS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2ZvbnRfZGlyKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgU0ZOVF9IZWFkZXJSZWMgIHNmbnQ7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VU2hvcnQgICAgICAgbm4sIHZhbGlkX2VudHJpZXM7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIG9mZnNldF90YWJsZV9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBTRk5UX0hlYWRlclJlYwotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggOCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG51bV90YWJsZXMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBzZWFyY2hfcmFuZ2UgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBlbnRyeV9zZWxlY3RvciApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHJhbmdlX3NoaWZ0ICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0KLSAgICBGVF9UUkFDRTIoKCAidHRfZmFjZV9sb2FkX2ZvbnRfZGlyOiAlMDhwXG4iLCBmYWNlICkpOwotCi0gICAgLyogcmVhZCB0aGUgb2Zmc2V0IHRhYmxlICovCi0KLSAgICBzZm50Lm9mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKLQotICAgIGlmICggRlRfUkVBRF9VTE9ORyggc2ZudC5mb3JtYXRfdGFnICkgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG9mZnNldF90YWJsZV9maWVsZHMsICZzZm50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbWFueSBmb250cyBkb24ndCBoYXZlIHRoZXNlIGZpZWxkcyBzZXQgY29ycmVjdGx5ICovCi0jaWYgMAotICAgIGlmICggc2ZudC5zZWFyY2hfcmFuZ2UgIT0gMSA8PCAoIHNmbnQuZW50cnlfc2VsZWN0b3IgKyA0ICkgICAgICAgIHx8Ci0gICAgICAgICBzZm50LnNlYXJjaF9yYW5nZSArIHNmbnQucmFuZ2Vfc2hpZnQgIT0gc2ZudC5udW1fdGFibGVzIDw8IDQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0jZW5kaWYKLQotICAgIC8qIGxvYWQgdGhlIHRhYmxlIGRpcmVjdG9yeSAqLwotCi0gICAgRlRfVFJBQ0UyKCggIi0tIE51bWJlciBvZiB0YWJsZXM6ICUxMHVcbiIsICAgIHNmbnQubnVtX3RhYmxlcyApKTsKLSAgICBGVF9UUkFDRTIoKCAiLS0gRm9ybWF0IHZlcnNpb246ICAgMHglMDhseFxuIiwgc2ZudC5mb3JtYXRfdGFnICkpOwotCi0gICAgaWYgKCBzZm50LmZvcm1hdF90YWcgIT0gVFRBR19PVFRPICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayBmaXJzdCAqLwotICAgICAgZXJyb3IgPSBjaGVja190YWJsZV9kaXIoICZzZm50LCBzdHJlYW0sICZ2YWxpZF9lbnRyaWVzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggInR0X2ZhY2VfbG9hZF9mb250X2RpcjoiCi0gICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCB0YWJsZSBkaXJlY3RvcnkgZm9yIFRydWVUeXBlXG4iICkpOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHZhbGlkX2VudHJpZXMgPSBzZm50Lm51bV90YWJsZXM7Ci0KLSAgICBmYWNlLT5udW1fdGFibGVzID0gdmFsaWRfZW50cmllczsKLSAgICBmYWNlLT5mb3JtYXRfdGFnID0gc2ZudC5mb3JtYXRfdGFnOwotCi0gICAgaWYgKCBGVF9RTkVXX0FSUkFZKCBmYWNlLT5kaXJfdGFibGVzLCBmYWNlLT5udW1fdGFibGVzICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc2ZudC5vZmZzZXQgKyAxMiApICAgICAgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBzZm50Lm51bV90YWJsZXMgKiAxNkwgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9UUkFDRTIoKCAiXG4iCi0gICAgICAgICAgICAgICAgIiAgdGFnICAgIG9mZnNldCAgICBsZW5ndGggICBjaGVja3N1bVxuIgotICAgICAgICAgICAgICAgICIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKSk7Ci0KLSAgICB2YWxpZF9lbnRyaWVzID0gMDsKLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgc2ZudC5udW1fdGFibGVzOyBubisrICkKLSAgICB7Ci0gICAgICBUVF9UYWJsZVJlYyAgZW50cnk7Ci0gICAgICBGVF9VU2hvcnQgICAgaTsKLSAgICAgIEZUX0Jvb2wgICAgICBkdXBsaWNhdGU7Ci0KLQotICAgICAgZW50cnkuVGFnICAgICAgPSBGVF9HRVRfVEFHNCgpOwotICAgICAgZW50cnkuQ2hlY2tTdW0gPSBGVF9HRVRfVUxPTkcoKTsKLSAgICAgIGVudHJ5Lk9mZnNldCAgID0gRlRfR0VUX1VMT05HKCk7Ci0gICAgICBlbnRyeS5MZW5ndGggICA9IEZUX0dFVF9VTE9ORygpOwotCi0gICAgICAvKiBpZ25vcmUgaW52YWxpZCB0YWJsZXMgdGhhdCBjYW4ndCBiZSBzYW5pdGl6ZWQgKi8KLQotICAgICAgaWYgKCBlbnRyeS5PZmZzZXQgPiBzdHJlYW0tPnNpemUgKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGVsc2UgaWYgKCBlbnRyeS5MZW5ndGggPiBzdHJlYW0tPnNpemUgLSBlbnRyeS5PZmZzZXQgKQotICAgICAgewotICAgICAgICBpZiAoIGVudHJ5LlRhZyA9PSBUVEFHX2htdHggfHwKLSAgICAgICAgICAgICBlbnRyeS5UYWcgPT0gVFRBR192bXR4ICkKLSAgICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgRlRfVUxvbmcgIG9sZF9sZW5ndGggPSBlbnRyeS5MZW5ndGg7Ci0jZW5kaWYKLQotCi0gICAgICAgICAgLyogbWFrZSBtZXRyaWNzIHRhYmxlIGxlbmd0aCBhIG11bHRpcGxlIG9mIDQgKi8KLSAgICAgICAgICBlbnRyeS5MZW5ndGggPSAoIHN0cmVhbS0+c2l6ZSAtIGVudHJ5Lk9mZnNldCApICYgfjNVOwotCi0gICAgICAgICAgRlRfVFJBQ0UyKCggIiAgJWMlYyVjJWMgICUwOGx4ICAlMDhseCAgJTA4bHgiCi0gICAgICAgICAgICAgICAgICAgICAgIiAoc2FuaXRpemVkOyBvcmlnaW5hbCBsZW5ndGggJTA4bHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LlRhZyA+PiAyNCApLAotICAgICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnkuVGFnID4+IDE2ICksCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS5UYWcgPj4gOCAgKSwKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LlRhZyAgICAgICApLAotICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5MZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgZW50cnkuQ2hlY2tTdW0sCi0gICAgICAgICAgICAgICAgICAgICAgb2xkX2xlbmd0aCApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgIGVsc2UKLSAgICAgICAgRlRfVFJBQ0UyKCggIiAgJWMlYyVjJWMgICUwOGx4ICAlMDhseCAgJTA4bHgiLAotICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LlRhZyA+PiAyNCApLAotICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LlRhZyA+PiAxNiApLAotICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LlRhZyA+PiA4ICApLAotICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LlRhZyAgICAgICApLAotICAgICAgICAgICAgICAgICAgICBlbnRyeS5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5Lkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgZW50cnkuQ2hlY2tTdW0gKSk7Ci0jZW5kaWYKLQotICAgICAgLyogaWdub3JlIGR1cGxpY2F0ZSB0YWJsZXMg4oCTIHRoZSBmaXJzdCBvbmUgd2lucyAqLwotICAgICAgZHVwbGljYXRlID0gMDsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgdmFsaWRfZW50cmllczsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBmYWNlLT5kaXJfdGFibGVzW2ldLlRhZyA9PSBlbnRyeS5UYWcgKQotICAgICAgICB7Ci0gICAgICAgICAgZHVwbGljYXRlID0gMTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCBkdXBsaWNhdGUgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiICAoZHVwbGljYXRlLCBpZ25vcmVkKVxuIiApKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJcbiIgKSk7Ci0KLSAgICAgICAgLyogd2UgZmluYWxseSBoYXZlIGEgdmFsaWQgZW50cnkgKi8KLSAgICAgICAgZmFjZS0+ZGlyX3RhYmxlc1t2YWxpZF9lbnRyaWVzKytdID0gZW50cnk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogZmluYWwgYWRqdXN0bWVudCB0byBudW1iZXIgb2YgdGFibGVzICovCi0gICAgZmFjZS0+bnVtX3RhYmxlcyA9IHZhbGlkX2VudHJpZXM7Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICBGVF9UUkFDRTIoKCAidGFibGUgZGlyZWN0b3J5IGxvYWRlZFxuXG4iICkpOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfYW55ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyBhbnkgZm9udCB0YWJsZSBpbnRvIGNsaWVudCBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogVGhlIGZhY2Ugb2JqZWN0IHRvIGxvb2sgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgICA6OiBUaGUgdGFnIG9mIHRhYmxlIHRvIGxvYWQuICBVc2UgdGhlIHZhbHVlIDAgaWYgeW91IHdhbnQgICAqLwotICAvKiAgICAgICAgICAgICAgdG8gYWNjZXNzIHRoZSB3aG9sZSBmb250IGZpbGUsIGVsc2Ugc2V0IHRoaXMgcGFyYW1ldGVyICAgKi8KLSAgLyogICAgICAgICAgICAgIHRvIGEgdmFsaWQgVHJ1ZVR5cGUgdGFibGUgdGFnIHRoYXQgeW91IGNhbiBmb3JnZSB3aXRoICAgICovCi0gIC8qICAgICAgICAgICAgICB0aGUgTUFLRV9UVF9UQUcgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0IDo6IFRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHRhYmxlIChvciB0aGUgZmlsZSBpZiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICB0YWcgPT0gMCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBkZWNpc2lvbiB2YXJpYWJsZTogICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiBsZW5ndGggPT0gTlVMTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgd2hvbGUgdGFibGUuICBSZXR1cm5zIGFuIGVycm9yIGlmICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYG9mZnNldCcgPT0gMCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCA9PSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgRXhpdHMgaW1tZWRpYXRlbHk7IHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRhYmxlIG9yIG9mIHRoZSBmb250IGZpbGUsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgdGFnJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoICE9IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgbmV4dCBgbGVuZ3RoJyBieXRlcyBvZiB0YWJsZSBvciBmb250LCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgb2Zmc2V0IGBvZmZzZXQnIChpbiB0YWJsZSBvciBmb250IHRvbykuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiB0YXJnZXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9hbnkoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbTsKLSAgICBUVF9UYWJsZSAgIHRhYmxlOwotICAgIEZUX1VMb25nICAgc2l6ZTsKLQotCi0gICAgaWYgKCB0YWcgIT0gMCApCi0gICAgewotICAgICAgLyogbG9vayBmb3IgdGFnIGluIGZvbnQgZGlyZWN0b3J5ICovCi0gICAgICB0YWJsZSA9IHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCB0YWcgKTsKLSAgICAgIGlmICggIXRhYmxlICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVGFibGVfTWlzc2luZyApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIG9mZnNldCArPSB0YWJsZS0+T2Zmc2V0OwotICAgICAgc2l6ZSAgICA9IHRhYmxlLT5MZW5ndGg7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIC8qIHRhZyA9PSAwIC0tIHRoZSB1c2VyIHdhbnRzIHRvIGFjY2VzcyB0aGUgZm9udCBmaWxlIGRpcmVjdGx5ICovCi0gICAgICBzaXplID0gZmFjZS0+cm9vdC5zdHJlYW0tPnNpemU7Ci0KLSAgICBpZiAoIGxlbmd0aCAmJiAqbGVuZ3RoID09IDAgKQotICAgIHsKLSAgICAgICpsZW5ndGggPSBzaXplOwotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIGlmICggbGVuZ3RoICkKLSAgICAgIHNpemUgPSAqbGVuZ3RoOwotCi0gICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgLyogdGhlIGBpZicgaXMgc3ludGFjdGljIHN1Z2FyIGZvciBwaWNreSBjb21waWxlcnMgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0FUKCBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2dlbmVyaWNfaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIFRydWVUeXBlIHRhYmxlIGBoZWFkJyBvciBgYmhlZCcuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9mYWNlX2xvYWRfZ2VuZXJpY19oZWFkZXIoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZyApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBUVF9IZWFkZXIqICBoZWFkZXI7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIGhlYWRlcl9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9IZWFkZXIKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDU0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggVGFibGVfVmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIEZvbnRfUmV2aXNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBDaGVja1N1bV9BZGp1c3QgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBNYWdpY19OdW1iZXIgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBGbGFncyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIFVuaXRzX1Blcl9FTSApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIENyZWF0ZWRbMF0gKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBDcmVhdGVkWzFdICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggTW9kaWZpZWRbMF0gKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBNb2RpZmllZFsxXSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHhNaW4gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB5TWluICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeE1heCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlNYXggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBNYWNfU3R5bGUgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBMb3dlc3RfUmVjX1BQRU0gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBGb250X0RpcmVjdGlvbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIEluZGV4X1RvX0xvY19Gb3JtYXQgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBHbHlwaF9EYXRhX0Zvcm1hdCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCB0YWcsIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaGVhZGVyID0gJmZhY2UtPmhlYWRlcjsKLQotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBoZWFkZXJfZmllbGRzLCBoZWFkZXIgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9UUkFDRTMoKCAiVW5pdHMgcGVyIEVNOiAlNHVcbiIsIGhlYWRlci0+VW5pdHNfUGVyX0VNICkpOwotICAgIEZUX1RSQUNFMygoICJJbmRleFRvTG9jOiAgICU0ZFxuIiwgaGVhZGVyLT5JbmRleF9Ub19Mb2NfRm9ybWF0ICkpOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hlYWQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIHJldHVybiB0dF9mYWNlX2xvYWRfZ2VuZXJpY19oZWFkZXIoIGZhY2UsIHN0cmVhbSwgVFRBR19oZWFkICk7Ci0gIH0KLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9iaGVkKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICByZXR1cm4gdHRfZmFjZV9sb2FkX2dlbmVyaWNfaGVhZGVyKCBmYWNlLCBzdHJlYW0sIFRUQUdfYmhlZCApOwotICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9tYXhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBtYXhpbXVtIHByb2ZpbGUgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX21heHAoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKLSAgICBUVF9NYXhQcm9maWxlKiAgbWF4UHJvZmlsZSA9ICZmYWNlLT5tYXhfcHJvZmlsZTsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgbWF4cF9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9NYXhQcm9maWxlCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA2ICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggdmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG51bUdseXBocyApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgbWF4cF9maWVsZHNfZXh0cmFbXSA9Ci0gICAgewotICAgICAgRlRfRlJBTUVfU1RBUlQoIDI2ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4UG9pbnRzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4Q29udG91cnMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhDb21wb3NpdGVQb2ludHMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhDb21wb3NpdGVDb250b3VycyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heFpvbmVzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4VHdpbGlnaHRQb2ludHMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhTdG9yYWdlICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4RnVuY3Rpb25EZWZzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4SW5zdHJ1Y3Rpb25EZWZzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4U3RhY2tFbGVtZW50cyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heFNpemVPZkluc3RydWN0aW9ucyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heENvbXBvbmVudEVsZW1lbnRzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4Q29tcG9uZW50RGVwdGggKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19tYXhwLCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBtYXhwX2ZpZWxkcywgbWF4UHJvZmlsZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG1heFByb2ZpbGUtPm1heFBvaW50cyAgICAgICAgICAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4Q29udG91cnMgICAgICAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhDb21wb3NpdGVQb2ludHMgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heENvbXBvc2l0ZUNvbnRvdXJzICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4Wm9uZXMgICAgICAgICAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhUd2lsaWdodFBvaW50cyAgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heFN0b3JhZ2UgICAgICAgICAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4RnVuY3Rpb25EZWZzICAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhJbnN0cnVjdGlvbkRlZnMgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heFN0YWNrRWxlbWVudHMgICAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhDb21wb25lbnRFbGVtZW50cyAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heENvbXBvbmVudERlcHRoICAgICA9IDA7Ci0KLSAgICBpZiAoIG1heFByb2ZpbGUtPnZlcnNpb24gPj0gMHgxMDAwMEwgKQotICAgIHsKLSAgICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBtYXhwX2ZpZWxkc19leHRyYSwgbWF4UHJvZmlsZSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBYWFg6IGFuIGFkanVzdG1lbnQgdGhhdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCBjZXJ0YWluICovCi0gICAgICAvKiAgICAgIGJyb2tlbiBmb250cyBsaWtlIGBLZXlzdHJva2VzIE1UJyA6LSggICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgIFdlIGFsbG9jYXRlIDY0IGZ1bmN0aW9uIGVudHJpZXMgYnkgZGVmYXVsdCB3aGVuICAgICovCi0gICAgICAvKiAgIHRoZSBtYXhGdW5jdGlvbkRlZnMgdmFsdWUgaXMgc21hbGxlci4gICAgICAgICAgICAgICovCi0KLSAgICAgIGlmICggbWF4UHJvZmlsZS0+bWF4RnVuY3Rpb25EZWZzIDwgNjQgKQotICAgICAgICBtYXhQcm9maWxlLT5tYXhGdW5jdGlvbkRlZnMgPSA2NDsKLQotICAgICAgLyogd2UgYWRkIDQgcGhhbnRvbSBwb2ludHMgbGF0ZXIgKi8KLSAgICAgIGlmICggbWF4UHJvZmlsZS0+bWF4VHdpbGlnaHRQb2ludHMgPiAoIDB4RkZGRlUgLSA0ICkgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAidHRfZmFjZV9sb2FkX21heHA6IgotICAgICAgICAgICAgICAgICAgICAiIHRvbyBtdWNoIHR3aWxpZ2h0IHBvaW50cyBpbiBgbWF4cCcgdGFibGU7XG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICIgc29tZSBnbHlwaHMgbWlnaHQgYmUgcmVuZGVyZWQgaW5jb3JyZWN0bHlcbiIgKSk7Ci0KLSAgICAgICAgbWF4UHJvZmlsZS0+bWF4VHdpbGlnaHRQb2ludHMgPSAweEZGRkZVIC0gNDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGVF9UUkFDRTMoKCAibnVtR2x5cGhzOiAldVxuIiwgbWF4UHJvZmlsZS0+bnVtR2x5cGhzICkpOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgbmFtZSByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9uYW1lKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgICB0YWJsZV9wb3MsIHRhYmxlX2xlbjsKLSAgICBGVF9VTG9uZyAgICAgIHN0b3JhZ2Vfc3RhcnQsIHN0b3JhZ2VfbGltaXQ7Ci0gICAgVFRfTmFtZVRhYmxlICB0YWJsZTsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgbmFtZV90YWJsZV9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9OYW1lVGFibGVSZWMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDYgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBmb3JtYXQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBudW1OYW1lUmVjb3JkcyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHN0b3JhZ2VPZmZzZXQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIG5hbWVfcmVjb3JkX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX05hbWVSZWMKLQotICAgICAgLyogbm8gRlRfRlJBTUVfU1RBUlQgKi8KLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBwbGF0Zm9ybUlEICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZW5jb2RpbmdJRCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGxhbmd1YWdlSUQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBuYW1lSUQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBzdHJpbmdMZW5ndGggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBzdHJpbmdPZmZzZXQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIGxhbmdUYWdfcmVjb3JkX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX0xhbmdUYWdSZWMKLQotICAgICAgLyogbm8gRlRfRlJBTUVfU1RBUlQgKi8KLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBzdHJpbmdMZW5ndGggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBzdHJpbmdPZmZzZXQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIHRhYmxlICAgICAgICAgPSAmZmFjZS0+bmFtZV90YWJsZTsKLSAgICB0YWJsZS0+c3RyZWFtID0gc3RyZWFtOwotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX25hbWUsIHN0cmVhbSwgJnRhYmxlX2xlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgdGFibGVfcG9zID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG5hbWVfdGFibGVfZmllbGRzLCB0YWJsZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIFNvbWUgcG9wdWxhciBBc2lhbiBmb250cyBoYXZlIGFuIGludmFsaWQgYHN0b3JhZ2VPZmZzZXQnIHZhbHVlIChpdCAqLwotICAgIC8qIHNob3VsZCBiZSBhdCBsZWFzdCBgNiArIDEyKm51bU5hbWVSZWNvcmRzJykuICBIb3dldmVyLCB0aGUgc3RyaW5nICAqLwotICAgIC8qIG9mZnNldHMsIGNvbXB1dGVkIGFzIGBzdG9yYWdlT2Zmc2V0ICsgZW50cnktPnN0cmluZ09mZnNldCcsIGFyZSAgICAqLwotICAgIC8qIHZhbGlkIHBvaW50ZXJzIHdpdGhpbiB0aGUgbmFtZSB0YWJsZS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIHRodXMgY2FuJ3QgY2hlY2sgYHN0b3JhZ2VPZmZzZXQnIHJpZ2h0IG5vdy4gICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHN0b3JhZ2Vfc3RhcnQgPSB0YWJsZV9wb3MgKyA2ICsgMTIgKiB0YWJsZS0+bnVtTmFtZVJlY29yZHM7Ci0gICAgc3RvcmFnZV9saW1pdCA9IHRhYmxlX3BvcyArIHRhYmxlX2xlbjsKLQotICAgIGlmICggc3RvcmFnZV9zdGFydCA+IHN0b3JhZ2VfbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfbG9hZF9uYW1lOiBpbnZhbGlkIGBuYW1lJyB0YWJsZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE5hbWVfVGFibGVfTWlzc2luZyApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGBuYW1lJyBmb3JtYXQgMSBjb250YWlucyBhZGRpdGlvbmFsIGxhbmd1YWdlIHRhZyByZWNvcmRzLCAqLwotICAgIC8qIHdoaWNoIHdlIGxvYWQgZmlyc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggdGFibGUtPmZvcm1hdCA9PSAxICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBzdG9yYWdlX3N0YXJ0ICkgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggdGFibGUtPm51bUxhbmdUYWdSZWNvcmRzICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHN0b3JhZ2Vfc3RhcnQgKz0gMiArIDQgKiB0YWJsZS0+bnVtTGFuZ1RhZ1JlY29yZHM7Ci0KLSAgICAgIC8qIGFsbG9jYXRlIGxhbmd1YWdlIHRhZyByZWNvcmRzIGFycmF5ICovCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggdGFibGUtPmxhbmdUYWdzLCB0YWJsZS0+bnVtTGFuZ1RhZ1JlY29yZHMgKSB8fAotICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggdGFibGUtPm51bUxhbmdUYWdSZWNvcmRzICogNCApICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIGxvYWQgbGFuZ3VhZ2UgdGFncyAqLwotICAgICAgewotICAgICAgICBUVF9MYW5nVGFnICBlbnRyeSA9IHRhYmxlLT5sYW5nVGFnczsKLSAgICAgICAgVFRfTGFuZ1RhZyAgbGltaXQgPSBlbnRyeSArIHRhYmxlLT5udW1MYW5nVGFnUmVjb3JkczsKLQotCi0gICAgICAgIGZvciAoIDsgZW50cnkgPCBsaW1pdDsgZW50cnkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAodm9pZClGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIGxhbmdUYWdfcmVjb3JkX2ZpZWxkcywgZW50cnkgKTsKLQotICAgICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGxhbmdUYWcgc3RyaW5nIGlzIHdpdGhpbiB0aGUgdGFibGUgKi8KLSAgICAgICAgICBlbnRyeS0+c3RyaW5nT2Zmc2V0ICs9IHRhYmxlX3BvcyArIHRhYmxlLT5zdG9yYWdlT2Zmc2V0OwotICAgICAgICAgIGlmICggZW50cnktPnN0cmluZ09mZnNldCAgICAgICAgICAgICAgICAgICAgICAgPCBzdG9yYWdlX3N0YXJ0IHx8Ci0gICAgICAgICAgICAgICBlbnRyeS0+c3RyaW5nT2Zmc2V0ICsgZW50cnktPnN0cmluZ0xlbmd0aCA+IHN0b3JhZ2VfbGltaXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGludmFsaWQgZW50cnk7IGlnbm9yZSBpdCAqLwotICAgICAgICAgICAgZW50cnktPnN0cmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgICAgKHZvaWQpRlRfU1RSRUFNX1NFRUsoIHRhYmxlX3BvcyArIDYgKTsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBuYW1lIHJlY29yZHMgYXJyYXkgKi8KLSAgICBpZiAoIEZUX05FV19BUlJBWSggdGFibGUtPm5hbWVzLCB0YWJsZS0+bnVtTmFtZVJlY29yZHMgKSB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHRhYmxlLT5udW1OYW1lUmVjb3JkcyAqIDEyICkgICAgICAgICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGxvYWQgbmFtZSByZWNvcmRzICovCi0gICAgewotICAgICAgVFRfTmFtZSAgZW50cnkgPSB0YWJsZS0+bmFtZXM7Ci0gICAgICBGVF9VSW50ICBjb3VudCA9IHRhYmxlLT5udW1OYW1lUmVjb3JkczsKLQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBuYW1lX3JlY29yZF9maWVsZHMsIGVudHJ5ICkgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIG5hbWUgaXMgbm90IGVtcHR5ICovCi0gICAgICAgIGlmICggZW50cnktPnN0cmluZ0xlbmd0aCA9PSAwICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBjaGVjayB0aGF0IHRoZSBuYW1lIHN0cmluZyBpcyB3aXRoaW4gdGhlIHRhYmxlICovCi0gICAgICAgIGVudHJ5LT5zdHJpbmdPZmZzZXQgKz0gdGFibGVfcG9zICsgdGFibGUtPnN0b3JhZ2VPZmZzZXQ7Ci0gICAgICAgIGlmICggZW50cnktPnN0cmluZ09mZnNldCAgICAgICAgICAgICAgICAgICAgICAgPCBzdG9yYWdlX3N0YXJ0IHx8Ci0gICAgICAgICAgICAgZW50cnktPnN0cmluZ09mZnNldCArIGVudHJ5LT5zdHJpbmdMZW5ndGggPiBzdG9yYWdlX2xpbWl0ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGludmFsaWQgZW50cnk7IGlnbm9yZSBpdCAqLwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogYXNzdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIGxhbmd1YWdlIHRhZyBJRCwgYW5kICAgKi8KLSAgICAgICAgLyogdGhhdCB0aGUgY29ycmVzcG9uZGluZyBsYW5nVGFnIGVudHJ5IGlzIHZhbGlkLCB0b28gKi8KLSAgICAgICAgaWYgKCB0YWJsZS0+Zm9ybWF0ID09IDEgJiYgZW50cnktPmxhbmd1YWdlSUQgPj0gMHg4MDAwVSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGVudHJ5LT5sYW5ndWFnZUlEIC0gMHg4MDAwVSA+PSB0YWJsZS0+bnVtTGFuZ1RhZ1JlY29yZHMgICAgfHwKLSAgICAgICAgICAgICAgICF0YWJsZS0+bGFuZ1RhZ3NbZW50cnktPmxhbmd1YWdlSUQgLSAweDgwMDBVXS5zdHJpbmdMZW5ndGggKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGludmFsaWQgZW50cnk7IGlnbm9yZSBpdCAqLwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZW50cnkrKzsKLSAgICAgIH0KLQotICAgICAgLyogcmVkdWNlIGFycmF5IHNpemUgdG8gdGhlIGFjdHVhbGx5IHVzZWQgZWxlbWVudHMgKi8KLSAgICAgIGNvdW50ID0gKEZUX1VJbnQpKCBlbnRyeSAtIHRhYmxlLT5uYW1lcyApOwotICAgICAgKHZvaWQpRlRfUkVORVdfQVJSQVkoIHRhYmxlLT5uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS0+bnVtTmFtZVJlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKTsKLSAgICAgIHRhYmxlLT5udW1OYW1lUmVjb3JkcyA9IGNvdW50OwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIC8qIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsLCB1cGRhdGUgZmFjZS0+bnVtX25hbWVzICovCi0gICAgZmFjZS0+bnVtX25hbWVzID0gKEZUX1VTaG9ydCl0YWJsZS0+bnVtTmFtZVJlY29yZHM7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZnJlZV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVzIHRoZSBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX25hbWUoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBmYWNlLT5yb290LmRyaXZlci0+cm9vdC5tZW1vcnk7Ci0gICAgVFRfTmFtZVRhYmxlICB0YWJsZSAgPSAmZmFjZS0+bmFtZV90YWJsZTsKLQotCi0gICAgaWYgKCB0YWJsZS0+bmFtZXMgKQotICAgIHsKLSAgICAgIFRUX05hbWUgIGVudHJ5ID0gdGFibGUtPm5hbWVzOwotICAgICAgVFRfTmFtZSAgbGltaXQgPSBlbnRyeSArIHRhYmxlLT5udW1OYW1lUmVjb3JkczsKLQotCi0gICAgICBmb3IgKCA7IGVudHJ5IDwgbGltaXQ7IGVudHJ5KysgKQotICAgICAgICBGVF9GUkVFKCBlbnRyeS0+c3RyaW5nICk7Ci0KLSAgICAgIEZUX0ZSRUUoIHRhYmxlLT5uYW1lcyApOwotICAgIH0KLQotICAgIGlmICggdGFibGUtPmxhbmdUYWdzICkKLSAgICB7Ci0gICAgICBUVF9MYW5nVGFnICBlbnRyeSA9IHRhYmxlLT5sYW5nVGFnczsKLSAgICAgIFRUX0xhbmdUYWcgIGxpbWl0ID0gZW50cnkgKyB0YWJsZS0+bnVtTGFuZ1RhZ1JlY29yZHM7Ci0KLQotICAgICAgZm9yICggOyBlbnRyeSA8IGxpbWl0OyBlbnRyeSsrICkKLSAgICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotCi0gICAgICBGVF9GUkVFKCB0YWJsZS0+bGFuZ1RhZ3MgKTsKLSAgICB9Ci0KLSAgICB0YWJsZS0+bnVtTmFtZVJlY29yZHMgICAgPSAwOwotICAgIHRhYmxlLT5udW1MYW5nVGFnUmVjb3JkcyA9IDA7Ci0gICAgdGFibGUtPmZvcm1hdCAgICAgICAgICAgID0gMDsKLSAgICB0YWJsZS0+c3RvcmFnZU9mZnNldCAgICAgPSAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfY21hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgY21hcCBkaXJlY3RvcnkgaW4gYSBmYWNlIG9iamVjdC4gIFRoZSBjbWFwcyB0aGVtc2VsdmVzICAgKi8KLSAgLyogICAgYXJlIGxvYWRlZCBvbiBkZW1hbmQgaW4gdGhlIGB0dGNtYXAuYycgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9jbWFwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19jbWFwLCBzdHJlYW0sICZmYWNlLT5jbWFwX3NpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggZmFjZS0+Y21hcF9zaXplLCBmYWNlLT5jbWFwX3RhYmxlICkgKQotICAgICAgZmFjZS0+Y21hcF9zaXplID0gMDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfb3MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgT1MyIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9vczIoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIFRUX09TMiogICBvczI7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIG9zMl9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9PUzIKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDc4ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHhBdmdDaGFyV2lkdGggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c1dlaWdodENsYXNzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNXaWR0aENsYXNzICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggZnNUeXBlICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1YnNjcmlwdFhTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1YnNjcmlwdFlTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1YnNjcmlwdFhPZmZzZXQgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB5U3Vic2NyaXB0WU9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdXBlcnNjcmlwdFhTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1cGVyc2NyaXB0WVNpemUgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB5U3VwZXJzY3JpcHRYT2Zmc2V0ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1cGVyc2NyaXB0WU9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdHJpa2VvdXRTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN0cmlrZW91dFBvc2l0aW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggc0ZhbWlseUNsYXNzICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzFdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzJdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzNdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzRdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzVdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzZdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzddICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzhdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzldICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdWxVbmljb2RlUmFuZ2UxICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdWxVbmljb2RlUmFuZ2UyICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdWxVbmljb2RlUmFuZ2UzICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdWxVbmljb2RlUmFuZ2U0ICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggYWNoVmVuZElEWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggYWNoVmVuZElEWzFdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggYWNoVmVuZElEWzJdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggYWNoVmVuZElEWzNdICksCi0KLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBmc1NlbGVjdGlvbiApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzRmlyc3RDaGFySW5kZXggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c0xhc3RDaGFySW5kZXggKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBzVHlwb0FzY2VuZGVyICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggc1R5cG9EZXNjZW5kZXIgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBzVHlwb0xpbmVHYXAgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c1dpbkFzY2VudCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzV2luRGVzY2VudCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIC8qIGBPUy8yJyB2ZXJzaW9uIDEgYW5kIG5ld2VyICovCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBvczJfZmllbGRzX2V4dHJhMVtdID0KLSAgICB7Ci0gICAgICBGVF9GUkFNRV9TVEFSVCggOCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggdWxDb2RlUGFnZVJhbmdlMSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggdWxDb2RlUGFnZVJhbmdlMiApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIC8qIGBPUy8yJyB2ZXJzaW9uIDIgYW5kIG5ld2VyICovCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBvczJfZmllbGRzX2V4dHJhMltdID0KLSAgICB7Ci0gICAgICBGVF9GUkFNRV9TVEFSVCggMTAgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBzeEhlaWdodCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHNDYXBIZWlnaHQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c0RlZmF1bHRDaGFyICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNCcmVha0NoYXIgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c01heENvbnRleHQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICAvKiBgT1MvMicgdmVyc2lvbiA1IGFuZCBuZXdlciAqLwotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgb3MyX2ZpZWxkc19leHRyYTVbXSA9Ci0gICAgewotICAgICAgRlRfRlJBTUVfU1RBUlQoIDQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c0xvd2VyT3B0aWNhbFBvaW50U2l6ZSApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzVXBwZXJPcHRpY2FsUG9pbnRTaXplICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0KLSAgICAvKiBXZSBub3cgc3VwcG9ydCBvbGQgTWFjIGZvbnRzIHdoZXJlIHRoZSBPUy8yIHRhYmxlIGRvZXNuJ3QgICovCi0gICAgLyogZXhpc3QuICBTaW1wbHkgcHV0LCB3ZSBzZXQgdGhlIGB2ZXJzaW9uJyBmaWVsZCB0byAweEZGRkYgICAqLwotICAgIC8qIGFuZCB0ZXN0IHRoaXMgdmFsdWUgZWFjaCB0aW1lIHdlIG5lZWQgdG8gYWNjZXNzIHRoZSB0YWJsZS4gKi8KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfT1MyLCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG9zMiA9ICZmYWNlLT5vczI7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggb3MyX2ZpZWxkcywgb3MyICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgb3MyLT51bENvZGVQYWdlUmFuZ2UxICAgICAgICA9IDA7Ci0gICAgb3MyLT51bENvZGVQYWdlUmFuZ2UyICAgICAgICA9IDA7Ci0gICAgb3MyLT5zeEhlaWdodCAgICAgICAgICAgICAgICA9IDA7Ci0gICAgb3MyLT5zQ2FwSGVpZ2h0ICAgICAgICAgICAgICA9IDA7Ci0gICAgb3MyLT51c0RlZmF1bHRDaGFyICAgICAgICAgICA9IDA7Ci0gICAgb3MyLT51c0JyZWFrQ2hhciAgICAgICAgICAgICA9IDA7Ci0gICAgb3MyLT51c01heENvbnRleHQgICAgICAgICAgICA9IDA7Ci0gICAgb3MyLT51c0xvd2VyT3B0aWNhbFBvaW50U2l6ZSA9IDA7Ci0gICAgb3MyLT51c1VwcGVyT3B0aWNhbFBvaW50U2l6ZSA9IDB4RkZGRjsKLQotICAgIGlmICggb3MyLT52ZXJzaW9uID49IDB4MDAwMSApCi0gICAgewotICAgICAgLyogb25seSB2ZXJzaW9uIDEgdGFibGVzICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggb3MyX2ZpZWxkc19leHRyYTEsIG9zMiApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIG9zMi0+dmVyc2lvbiA+PSAweDAwMDIgKQotICAgICAgewotICAgICAgICAvKiBvbmx5IHZlcnNpb24gMiB0YWJsZXMgKi8KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG9zMl9maWVsZHNfZXh0cmEyLCBvczIgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggb3MyLT52ZXJzaW9uID49IDB4MDAwNSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBvbmx5IHZlcnNpb24gNSB0YWJsZXMgKi8KLSAgICAgICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggb3MyX2ZpZWxkc19leHRyYTUsIG9zMiApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFMygoICJzVHlwb0FzY2VuZGVyOiAgJTRkXG4iLCAgIG9zMi0+c1R5cG9Bc2NlbmRlciApKTsKLSAgICBGVF9UUkFDRTMoKCAic1R5cG9EZXNjZW5kZXI6ICU0ZFxuIiwgICBvczItPnNUeXBvRGVzY2VuZGVyICkpOwotICAgIEZUX1RSQUNFMygoICJ1c1dpbkFzY2VudDogICAgJTR1XG4iLCAgIG9zMi0+dXNXaW5Bc2NlbnQgKSk7Ci0gICAgRlRfVFJBQ0UzKCggInVzV2luRGVzY2VudDogICAlNHVcbiIsICAgb3MyLT51c1dpbkRlc2NlbnQgKSk7Ci0gICAgRlRfVFJBQ0UzKCggImZzU2VsZWN0aW9uOiAgICAweCUyeFxuIiwgb3MyLT5mc1NlbGVjdGlvbiApKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX3Bvc3RzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIFBvc3RzY3JpcHQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfcG9zdCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIFRUX1Bvc3RzY3JpcHQqICBwb3N0ID0gJmZhY2UtPnBvc3RzY3JpcHQ7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBvc3RfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgVFRfUG9zdHNjcmlwdAotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMzIgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAoIEZvcm1hdFR5cGUgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAoIGl0YWxpY0FuZ2xlICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUKCB1bmRlcmxpbmVQb3NpdGlvbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCggdW5kZXJsaW5lVGhpY2tuZXNzICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBpc0ZpeGVkUGl0Y2ggKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIG1pbk1lbVR5cGU0MiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggbWF4TWVtVHlwZTQyICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBtaW5NZW1UeXBlMSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggbWF4TWVtVHlwZTEgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19wb3N0LCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBwb3N0X2ZpZWxkcywgcG9zdCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIHdlIGRvbid0IGxvYWQgdGhlIGdseXBoIG5hbWVzLCB3ZSBkbyB0aGF0IGluIGFub3RoZXIgKi8KLSAgICAvKiBtb2R1bGUgKHR0cG9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9UUkFDRTMoKCAiRm9ybWF0VHlwZTogICAweCV4XG4iLCBwb3N0LT5Gb3JtYXRUeXBlICkpOwotICAgIEZUX1RSQUNFMygoICJpc0ZpeGVkUGl0Y2g6ICAgJXNcbiIsIHBvc3QtPmlzRml4ZWRQaXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIiAgeWVzIiA6ICIgICBubyIgKSk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfcGNsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgUENMIDUgVGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9wY2x0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBjbHRfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgVFRfUENMVAotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggNTQgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBWZXJzaW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggRm9udE51bWJlciApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIFBpdGNoICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggeEhlaWdodCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIFN0eWxlICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggVHlwZUZhbWlseSApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIENhcEhlaWdodCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIFN5bWJvbFNldCApLAotICAgICAgICBGVF9GUkFNRV9CWVRFUyAoIFR5cGVGYWNlLCAxNiApLAotICAgICAgICBGVF9GUkFNRV9CWVRFUyAoIENoYXJhY3RlckNvbXBsZW1lbnQsIDggKSwKLSAgICAgICAgRlRfRlJBTUVfQllURVMgKCBGaWxlTmFtZSwgNiApLAotICAgICAgICBGVF9GUkFNRV9DSEFSICAoIFN0cm9rZVdlaWdodCApLAotICAgICAgICBGVF9GUkFNRV9DSEFSICAoIFdpZHRoVHlwZSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIFNlcmlmU3R5bGUgKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSAgKCBSZXNlcnZlZCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBUVF9QQ0xUKiAgcGNsdCA9ICZmYWNlLT5wY2x0OwotCi0KLSAgICAvKiBvcHRpb25hbCB0YWJsZSAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19QQ0xULCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBwY2x0X2ZpZWxkcywgcGNsdCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2dhc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIGBnYXNwJyB0YWJsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZ2FzcCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0gICAgRlRfVUludCAgICAgICAgaixudW1fcmFuZ2VzOwotICAgIFRUX0dhc3BSYW5nZSAgIGdhc3ByYW5nZXMgPSBOVUxMOwotCi0KLSAgICAvKiB0aGUgZ2FzcCB0YWJsZSBpcyBvcHRpb25hbCAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19nYXNwLCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDRMICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZmFjZS0+Z2FzcC52ZXJzaW9uICAgPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgZmFjZS0+Z2FzcC5udW1SYW5nZXMgPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAvKiBvbmx5IHN1cHBvcnQgdmVyc2lvbnMgMCBhbmQgMSBvZiB0aGUgdGFibGUgKi8KLSAgICBpZiAoIGZhY2UtPmdhc3AudmVyc2lvbiA+PSAyICkKLSAgICB7Ci0gICAgICBmYWNlLT5nYXNwLm51bVJhbmdlcyA9IDA7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgbnVtX3JhbmdlcyA9IGZhY2UtPmdhc3AubnVtUmFuZ2VzOwotICAgIEZUX1RSQUNFMygoICJudW1SYW5nZXM6ICV1XG4iLCBudW1fcmFuZ2VzICkpOwotCi0gICAgaWYgKCBGVF9RTkVXX0FSUkFZKCBmYWNlLT5nYXNwLmdhc3BSYW5nZXMsIG51bV9yYW5nZXMgKSB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIG51bV9yYW5nZXMgKiA0TCApICAgICAgICAgICAgICAgICAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ2FzcHJhbmdlcyA9IGZhY2UtPmdhc3AuZ2FzcFJhbmdlczsKLQotICAgIGZvciAoIGogPSAwOyBqIDwgbnVtX3JhbmdlczsgaisrICkKLSAgICB7Ci0gICAgICBnYXNwcmFuZ2VzW2pdLm1heFBQRU0gID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgZ2FzcHJhbmdlc1tqXS5nYXNwRmxhZyA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgRlRfVFJBQ0UzKCggImdhc3BSYW5nZSAlZDogcmFuZ2VNYXhQUEVNICU1ZCwgcmFuZ2VHYXNwQmVoYXZpb3IgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgIGosCi0gICAgICAgICAgICAgICAgICBnYXNwcmFuZ2VzW2pdLm1heFBQRU0sCi0gICAgICAgICAgICAgICAgICBnYXNwcmFuZ2VzW2pdLmdhc3BGbGFnICkpOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRsb2FkLmggYi9zcmMvc2ZudC90dGxvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2ZGE4Ni4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dGxvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTG9hZCB0aGUgYmFzaWMgVHJ1ZVR5cGUgdGFibGVzLCBpLmUuLCB0YWJsZXMgdGhhdCBjYW4gYmUgZWl0aGVyIGluICAgKi8KLS8qICAgIFRURiBvciBPVEYgZm9udHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFRUTE9BRF9IXwotI2RlZmluZSBUVExPQURfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggVFRfVGFibGUgICkKLSAgdHRfZmFjZV9sb29rdXBfdGFibGUoIFRUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHRhZyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZ290b190YWJsZSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZm9udF9kaXIoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2FueSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hlYWQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfY21hcCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9tYXhwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX25hbWUoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfb3MyKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfcG9zdCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9wY2x0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX25hbWUoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9nYXNwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2JoZWQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBUVExPQURfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0bXR4LmMgYi9zcmMvc2ZudC90dG10eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRjNmRiLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3R0bXR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRtdHguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIG1ldHJpY3MgdGFibGVzIGNvbW1vbiB0byBUVEYgYW5kIE9URiBmb250cyAoYm9keSkuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0gKLSNlbmRpZgotCi0jaW5jbHVkZSAidHRtdHguaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotICAvKiBJTVBPUlRBTlQ6IFRoZSBUVF9Ib3JpSGVhZGVyIGFuZCBUVF9WZXJ0SGVhZGVyIHN0cnVjdHVyZXMgc2hvdWxkICAgKi8KLSAgLyogICAgICAgICAgICBiZSBpZGVudGljYWwgZXhjZXB0IGZvciB0aGUgbmFtZXMgb2YgdGhlaXIgZmllbGRzLCAgICAgICovCi0gIC8qICAgICAgICAgICAgd2hpY2ggYXJlIGRpZmZlcmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBgdHRfZmFjZV9sb2FkX2htdHgnIGlzIGFibGUgdG8gcmVhZCAgICovCi0gIC8qICAgICAgICAgICAgYm90aCB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaGVhZGVycy4gICAgICAgICAgICAgICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRtdHgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9obXR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGBobXR4JyBvciBgdm10eCcgdGFibGUgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCA6OiBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCBgdm10eCcuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfaG10eCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHZlcnRpY2FsICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfVUxvbmcgICB0YWcsIHRhYmxlX3NpemU7Ci0gICAgRlRfVUxvbmcqICBwdGFibGVfb2Zmc2V0OwotICAgIEZUX1VMb25nKiAgcHRhYmxlX3NpemU7Ci0KLQotICAgIGlmICggdmVydGljYWwgKQotICAgIHsKLSAgICAgIHRhZyAgICAgICAgICAgPSBUVEFHX3ZtdHg7Ci0gICAgICBwdGFibGVfb2Zmc2V0ID0gJmZhY2UtPnZlcnRfbWV0cmljc19vZmZzZXQ7Ci0gICAgICBwdGFibGVfc2l6ZSAgID0gJmZhY2UtPnZlcnRfbWV0cmljc19zaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGFnICAgICAgICAgICA9IFRUQUdfaG10eDsKLSAgICAgIHB0YWJsZV9vZmZzZXQgPSAmZmFjZS0+aG9yel9tZXRyaWNzX29mZnNldDsKLSAgICAgIHB0YWJsZV9zaXplICAgPSAmZmFjZS0+aG9yel9tZXRyaWNzX3NpemU7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCB0YWcsIHN0cmVhbSwgJnRhYmxlX3NpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgICpwdGFibGVfc2l6ZSAgID0gdGFibGVfc2l6ZTsKLSAgICAqcHRhYmxlX29mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2hoZWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgYGhoZWEnIG9yICd2aGVhJyB0YWJsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIGB2aGVhJy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9oaGVhKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgdmVydGljYWwgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIFRUX0hvcmlIZWFkZXIqICBoZWFkZXI7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIG1ldHJpY3NfaGVhZGVyX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX0hvcmlIZWFkZXIKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDM2ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggVmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIEFzY2VuZGVyICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggRGVzY2VuZGVyICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggTGluZV9HYXAgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBhZHZhbmNlX1dpZHRoX01heCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIG1pbl9MZWZ0X1NpZGVfQmVhcmluZyApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIG1pbl9SaWdodF9TaWRlX0JlYXJpbmcgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB4TWF4X0V4dGVudCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIGNhcmV0X1Nsb3BlX1Jpc2UgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBjYXJldF9TbG9wZV9SdW4gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBjYXJldF9PZmZzZXQgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBSZXNlcnZlZFswXSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIFJlc2VydmVkWzFdICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggUmVzZXJ2ZWRbMl0gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBSZXNlcnZlZFszXSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIG1ldHJpY19EYXRhX0Zvcm1hdCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG51bWJlcl9PZl9ITWV0cmljcyApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgaWYgKCB2ZXJ0aWNhbCApCi0gICAgewotICAgICAgdm9pZCAgKnYgPSAmZmFjZS0+dmVydGljYWw7Ci0KLQotICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX3ZoZWEsIHN0cmVhbSwgMCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgaGVhZGVyID0gKFRUX0hvcmlIZWFkZXIqKXY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfaGhlYSwgc3RyZWFtLCAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBoZWFkZXIgPSAmZmFjZS0+aG9yaXpvbnRhbDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggbWV0cmljc19oZWFkZXJfZmllbGRzLCBoZWFkZXIgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBGVF9UUkFDRTMoKCAiQXNjZW5kZXI6ICAgICAgICAgICU1ZFxuIiwgaGVhZGVyLT5Bc2NlbmRlciApKTsKLSAgICBGVF9UUkFDRTMoKCAiRGVzY2VuZGVyOiAgICAgICAgICU1ZFxuIiwgaGVhZGVyLT5EZXNjZW5kZXIgKSk7Ci0gICAgRlRfVFJBQ0UzKCggIm51bWJlcl9PZl9NZXRyaWNzOiAlNXVcbiIsIGhlYWRlci0+bnVtYmVyX09mX0hNZXRyaWNzICkpOwotCi0gICAgaGVhZGVyLT5sb25nX21ldHJpY3MgID0gTlVMTDsKLSAgICBoZWFkZXItPnNob3J0X21ldHJpY3MgPSBOVUxMOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2dldF9tZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgbWV0cmljcyBpbiBmb250IHVuaXRzIGZvciBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gZ2x5cGguICBUaGUgdmFsdWVzIGFyZSB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgKHRvcCBzaWRlICAgICAgICovCi0gIC8qICAgIGJlYXJpbmcgZm9yIHZlcnRpY2FsIG1ldHJpY3MpIGFuZCBhZHZhbmNlIHdpZHRoIChhZHZhbmNlIGhlaWdodCAgICAqLwotICAvKiAgICBmb3IgdmVydGljYWwgbWV0cmljcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIFRydWVUeXBlIGZhY2Ugc3RydWN0dXJlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIDo6IElmIHNldCB0byBUUlVFLCBnZXQgdmVydGljYWwgbWV0cmljcy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJlYXJpbmcgOjogVGhlIGJlYXJpbmcsIGVpdGhlciBsZWZ0IHNpZGUgb3IgdG9wIHNpZGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB3aWR0aCBvciBhZHZhbmNlIGhlaWdodCwgZGVwZW5kaW5nIG9uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdGhlIGB2ZXJ0aWNhbCcgZmxhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0dF9mYWNlX2dldF9tZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICB2ZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCAgICphYmVhcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAqYWFkdmFuY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIEZUX1N0cmVhbSAgICAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLSAgICBUVF9Ib3JpSGVhZGVyKiAgaGVhZGVyOwotICAgIEZUX1VMb25nICAgICAgICB0YWJsZV9wb3MsIHRhYmxlX3NpemUsIHRhYmxlX2VuZDsKLSAgICBGVF9VU2hvcnQgICAgICAgazsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zICB2YXIgPQotICAgICAgKEZUX1NlcnZpY2VfTWV0cmljc1ZhcmlhdGlvbnMpZmFjZS0+dmFyOwotI2VuZGlmCi0KLQotICAgIGlmICggdmVydGljYWwgKQotICAgIHsKLSAgICAgIHZvaWQqICB2ID0gJmZhY2UtPnZlcnRpY2FsOwotCi0KLSAgICAgIGhlYWRlciAgICAgPSAoVFRfSG9yaUhlYWRlciopdjsKLSAgICAgIHRhYmxlX3BvcyAgPSBmYWNlLT52ZXJ0X21ldHJpY3Nfb2Zmc2V0OwotICAgICAgdGFibGVfc2l6ZSA9IGZhY2UtPnZlcnRfbWV0cmljc19zaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaGVhZGVyICAgICA9ICZmYWNlLT5ob3Jpem9udGFsOwotICAgICAgdGFibGVfcG9zICA9IGZhY2UtPmhvcnpfbWV0cmljc19vZmZzZXQ7Ci0gICAgICB0YWJsZV9zaXplID0gZmFjZS0+aG9yel9tZXRyaWNzX3NpemU7Ci0gICAgfQotCi0gICAgdGFibGVfZW5kID0gdGFibGVfcG9zICsgdGFibGVfc2l6ZTsKLQotICAgIGsgPSBoZWFkZXItPm51bWJlcl9PZl9ITWV0cmljczsKLQotICAgIGlmICggayA+IDAgKQotICAgIHsKLSAgICAgIGlmICggZ2luZGV4IDwgKEZUX1VJbnQpayApCi0gICAgICB7Ci0gICAgICAgIHRhYmxlX3BvcyArPSA0ICogZ2luZGV4OwotICAgICAgICBpZiAoIHRhYmxlX3BvcyArIDQgPiB0YWJsZV9lbmQgKQotICAgICAgICAgIGdvdG8gTm9EYXRhOwotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHRhYmxlX3BvcyApIHx8Ci0gICAgICAgICAgICAgRlRfUkVBRF9VU0hPUlQoICphYWR2YW5jZSApIHx8Ci0gICAgICAgICAgICAgRlRfUkVBRF9TSE9SVCggKmFiZWFyaW5nICkgICkKLSAgICAgICAgICBnb3RvIE5vRGF0YTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGFibGVfcG9zICs9IDQgKiAoIGsgLSAxICk7Ci0gICAgICAgIGlmICggdGFibGVfcG9zICsgNCA+IHRhYmxlX2VuZCApCi0gICAgICAgICAgZ290byBOb0RhdGE7Ci0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggdGFibGVfcG9zICkgfHwKLSAgICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggKmFhZHZhbmNlICkgKQotICAgICAgICAgIGdvdG8gTm9EYXRhOwotCi0gICAgICAgIHRhYmxlX3BvcyArPSA0ICsgMiAqICggZ2luZGV4IC0gayApOwotICAgICAgICBpZiAoIHRhYmxlX3BvcyArIDIgPiB0YWJsZV9lbmQgKQotICAgICAgICAgICphYmVhcmluZyA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggIUZUX1NUUkVBTV9TRUVLKCB0YWJsZV9wb3MgKSApCi0gICAgICAgICAgICAodm9pZClGVF9SRUFEX1NIT1JUKCAqYWJlYXJpbmcgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIE5vRGF0YToKLSAgICAgICphYmVhcmluZyA9IDA7Ci0gICAgICAqYWFkdmFuY2UgPSAwOwotICAgIH0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBpZiAoIHZhciApCi0gICAgewotICAgICAgRlRfRmFjZSAgZiA9IEZUX0ZBQ0UoIGZhY2UgKTsKLSAgICAgIEZUX0ludCAgIGEgPSAoRlRfSW50KSphYWR2YW5jZTsKLSAgICAgIEZUX0ludCAgIGIgPSAoRlRfSW50KSphYmVhcmluZzsKLQotCi0gICAgICBpZiAoIHZlcnRpY2FsICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCB2YXItPnZhZHZhbmNlX2FkanVzdCApCi0gICAgICAgICAgdmFyLT52YWR2YW5jZV9hZGp1c3QoIGYsIGdpbmRleCwgJmEgKTsKLSAgICAgICAgaWYgKCB2YXItPnRzYl9hZGp1c3QgKQotICAgICAgICAgIHZhci0+dHNiX2FkanVzdCggZiwgZ2luZGV4LCAmYiApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIHZhci0+aGFkdmFuY2VfYWRqdXN0ICkKLSAgICAgICAgICB2YXItPmhhZHZhbmNlX2FkanVzdCggZiwgZ2luZGV4LCAmYSApOwotICAgICAgICBpZiAoIHZhci0+bHNiX2FkanVzdCApCi0gICAgICAgICAgdmFyLT5sc2JfYWRqdXN0KCBmLCBnaW5kZXgsICZiICk7Ci0gICAgICB9Ci0KLSAgICAgICphYWR2YW5jZSA9IChGVF9VU2hvcnQpYTsKLSAgICAgICphYmVhcmluZyA9IChGVF9TaG9ydCliOwotICAgIH0KLSNlbmRpZgotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dG10eC5oIGIvc3JjL3NmbnQvdHRtdHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5M2FiMi4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dG10eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRtdHguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIG1ldHJpY3MgdGFibGVzIGNvbW1vbiB0byBUVEYgYW5kIE9URiBmb250cyAoc3BlY2lmaWNhdGlvbikuICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFRUTVRYX0hfCi0jZGVmaW5lIFRUTVRYX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hoZWEoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICB2ZXJ0aWNhbCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2htdHgoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICB2ZXJ0aWNhbCApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2dldF9tZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICB2ZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICBhYmVhcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgYWFkdmFuY2UgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVFRNVFhfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0cG9zdC5jIGIvc3JjL3NmbnQvdHRwb3N0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2VjZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRwb3N0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRwb3N0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgbmFtZSB0YWJsZSBwcm9jZXNzaW5nIGZvciBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZm9udHMgICAgICovCi0vKiAgICAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgcG9zdCB0YWJsZSBpcyBub3QgY29tcGxldGVseSBsb2FkZWQgYnkgdGhlIGNvcmUgZW5naW5lLiAgVGhpcyAgICAgKi8KLSAgLyogZmlsZSBsb2FkcyB0aGUgbWlzc2luZyBQUyBnbHlwaCBuYW1lcyBhbmQgaW1wbGVtZW50cyBhbiBBUEkgdG8gYWNjZXNzICovCi0gIC8qIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotCi0jaW5jbHVkZSAidHRwb3N0LmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRwb3N0Ci0KLQotICAvKiBJZiB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gaXMgZGVmaW5lZCwgd2UgcmVseSBvbiB0aGUgYFBTTmFtZXMnICovCi0gIC8qIG1vZHVsZSB0byBncmFiIHRoZSBnbHlwaCBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0KLSNkZWZpbmUgTUFDX05BTUUoIHggKSAgKEZUX1N0cmluZyopcHNuYW1lcy0+bWFjaW50b3NoX25hbWUoIChGVF9VSW50KSh4KSApCi0KLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTICovCi0KLQotICAgLyogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgdGhlIGBQU05hbWVzJyBtb2R1bGUsIGFuZCBwcm92aWRlIG91ciBvd24gICovCi0gICAvKiB0YWJsZSBvZiBNYWMgbmFtZXMuICBUaHVzLCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCBhIHZlcnNpb24gb2YgKi8KLSAgIC8qIEZyZWVUeXBlIHdpdGhvdXQgdGhlIFR5cGUgMSBkcml2ZXIgJiBQU05hbWVzIG1vZHVsZS4gICAgICAgICAgICAqLwotCi0jZGVmaW5lIE1BQ19OQU1FKCB4ICkgIChGVF9TdHJpbmcqKXR0X3Bvc3RfZGVmYXVsdF9uYW1lc1t4XQotCi0gIC8qIHRoZSAyNTggZGVmYXVsdCBNYWMgUFMgZ2x5cGggbmFtZXM7IHNlZSBmaWxlIGB0b29scy9nbG5hbWVzLnB5JyAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9TdHJpbmcqIGNvbnN0ICB0dF9wb3N0X2RlZmF1bHRfbmFtZXNbMjU4XSA9Ci0gIHsKLSAgICAvKiAgIDAgKi8KLSAgICAiLm5vdGRlZiIsICIubnVsbCIsICJub25tYXJraW5ncmV0dXJuIiwgInNwYWNlIiwgImV4Y2xhbSIsCi0gICAgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwKLSAgICAvKiAgMTAgKi8KLSAgICAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsCi0gICAgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsCi0gICAgLyogIDIwICovCi0gICAgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwKLSAgICAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLAotICAgIC8qICAzMCAqLwotICAgICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwKLSAgICAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsCi0gICAgLyogIDQwICovCi0gICAgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsCi0gICAgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsCi0gICAgLyogIDUwICovCi0gICAgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsCi0gICAgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsCi0gICAgLyogIDYwICovCi0gICAgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwKLSAgICAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJncmF2ZSIsICJhIiwgImIiLAotICAgIC8qICA3MCAqLwotICAgICJjIiwgImQiLCAiZSIsICJmIiwgImciLAotICAgICJoIiwgImkiLCAiaiIsICJrIiwgImwiLAotICAgIC8qICA4MCAqLwotICAgICJtIiwgIm4iLCAibyIsICJwIiwgInEiLAotICAgICJyIiwgInMiLCAidCIsICJ1IiwgInYiLAotICAgIC8qICA5MCAqLwotICAgICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsCi0gICAgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwKLSAgICAvKiAxMDAgKi8KLSAgICAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIk50aWxkZSIsICJPZGllcmVzaXMiLCAiVWRpZXJlc2lzIiwKLSAgICAiYWFjdXRlIiwgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwKLSAgICAvKiAxMTAgKi8KLSAgICAiYXJpbmciLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVncmF2ZSIsICJlY2lyY3VtZmxleCIsCi0gICAgImVkaWVyZXNpcyIsICJpYWN1dGUiLCAiaWdyYXZlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsCi0gICAgLyogMTIwICovCi0gICAgIm50aWxkZSIsICJvYWN1dGUiLCAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsCi0gICAgIm90aWxkZSIsICJ1YWN1dGUiLCAidWdyYXZlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsCi0gICAgLyogMTMwICovCi0gICAgImRhZ2dlciIsICJkZWdyZWUiLCAiY2VudCIsICJzdGVybGluZyIsICJzZWN0aW9uIiwKLSAgICAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwgInJlZ2lzdGVyZWQiLCAiY29weXJpZ2h0IiwKLSAgICAvKiAxNDAgKi8KLSAgICAidHJhZGVtYXJrIiwgImFjdXRlIiwgImRpZXJlc2lzIiwgIm5vdGVxdWFsIiwgIkFFIiwKLSAgICAiT3NsYXNoIiwgImluZmluaXR5IiwgInBsdXNtaW51cyIsICJsZXNzZXF1YWwiLCAiZ3JlYXRlcmVxdWFsIiwKLSAgICAvKiAxNTAgKi8KLSAgICAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsICJwcm9kdWN0IiwKLSAgICAicGkiLCAiaW50ZWdyYWwiLCAib3JkZmVtaW5pbmUiLCAib3JkbWFzY3VsaW5lIiwgIk9tZWdhIiwKLSAgICAvKiAxNjAgKi8KLSAgICAiYWUiLCAib3NsYXNoIiwgInF1ZXN0aW9uZG93biIsICJleGNsYW1kb3duIiwgImxvZ2ljYWxub3QiLAotICAgICJyYWRpY2FsIiwgImZsb3JpbiIsICJhcHByb3hlcXVhbCIsICJEZWx0YSIsICJndWlsbGVtb3RsZWZ0IiwKLSAgICAvKiAxNzAgKi8KLSAgICAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAibm9uYnJlYWtpbmdzcGFjZSIsICJBZ3JhdmUiLCAiQXRpbGRlIiwKLSAgICAiT3RpbGRlIiwgIk9FIiwgIm9lIiwgImVuZGFzaCIsICJlbWRhc2giLAotICAgIC8qIDE4MCAqLwotICAgICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLAotICAgICJsb3plbmdlIiwgInlkaWVyZXNpcyIsICJZZGllcmVzaXMiLCAiZnJhY3Rpb24iLCAiY3VycmVuY3kiLAotICAgIC8qIDE5MCAqLwotICAgICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwgImZsIiwgImRhZ2dlcmRibCIsCi0gICAgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsCi0gICAgLyogMjAwICovCi0gICAgIkVjaXJjdW1mbGV4IiwgIkFhY3V0ZSIsICJFZGllcmVzaXMiLCAiRWdyYXZlIiwgIklhY3V0ZSIsCi0gICAgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwKLSAgICAvKiAyMTAgKi8KLSAgICAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLAotICAgICJkb3RsZXNzaSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsCi0gICAgLyogMjIwICovCi0gICAgImRvdGFjY2VudCIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsCi0gICAgImNhcm9uIiwgIkxzbGFzaCIsICJsc2xhc2giLCAiU2Nhcm9uIiwgInNjYXJvbiIsCi0gICAgLyogMjMwICovCi0gICAgIlpjYXJvbiIsICJ6Y2Fyb24iLCAiYnJva2VuYmFyIiwgIkV0aCIsICJldGgiLAotICAgICJZYWN1dGUiLCAieWFjdXRlIiwgIlRob3JuIiwgInRob3JuIiwgIm1pbnVzIiwKLSAgICAvKiAyNDAgKi8KLSAgICAibXVsdGlwbHkiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJvbmVoYWxmIiwKLSAgICAib25lcXVhcnRlciIsICJ0aHJlZXF1YXJ0ZXJzIiwgImZyYW5jIiwgIkdicmV2ZSIsICJnYnJldmUiLAotICAgIC8qIDI1MCAqLwotICAgICJJZG90YWNjZW50IiwgIlNjZWRpbGxhIiwgInNjZWRpbGxhIiwgIkNhY3V0ZSIsICJjYWN1dGUiLAotICAgICJDY2Fyb24iLCAiY2Nhcm9uIiwgImRjcm9hdCIsCi0gIH07Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyAqLwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGxvYWRfZm9ybWF0XzIwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgcG9zdF9saW1pdCApCi0gIHsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotICAgIEZUX0ludCAgICAgIG51bV9nbHlwaHM7Ci0gICAgRlRfVVNob3J0ICAgbnVtX25hbWVzOwotCi0gICAgRlRfVVNob3J0KiAgZ2x5cGhfaW5kaWNlcyA9IE5VTEw7Ci0gICAgRlRfQ2hhcioqICAgbmFtZV9zdHJpbmdzICA9IE5VTEw7Ci0KLQotICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG51bV9nbHlwaHMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGlzIHRhYmxlIGNhbiBiZSBzbWFsbGVyICovCi0gICAgLyogdGhhbiB0aGUgdmFsdWUgaW4gdGhlIG1heHAgdGFibGUgKGNmLiBjeWJlcmJpdC50dGYpLiAgICAgICAgICAgICAqLwotCi0gICAgLyogVGhlcmUgYWxyZWFkeSBleGlzdCBmb250cyB3aGljaCBoYXZlIG1vcmUgdGhhbiAzMjc2OCBnbHlwaCBuYW1lcyAqLwotICAgIC8qIGluIHRoaXMgdGFibGUsIHNvIHRoZSB0ZXN0IGZvciB0aGlzIHRocmVzaG9sZCBoYXMgYmVlbiBkcm9wcGVkLiAgKi8KLQotICAgIGlmICggbnVtX2dseXBocyA+IGZhY2UtPm1heF9wcm9maWxlLm51bUdseXBocyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGxvYWQgdGhlIGluZGljZXMgKi8KLSAgICB7Ci0gICAgICBGVF9JbnQgIG47Ci0KLQotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkgKCBnbHlwaF9pbmRpY2VzLCBudW1fZ2x5cGhzICkgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIG51bV9nbHlwaHMgKiAyTCApICAgICAgICAgICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCi0gICAgICAgIGdseXBoX2luZGljZXNbbl0gPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlIG51bWJlciBvZiBuYW1lcyBzdG9yZWQgaW4gdGFibGUgKi8KLSAgICB7Ci0gICAgICBGVF9JbnQgIG47Ci0KLQotICAgICAgbnVtX25hbWVzID0gMDsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ2x5cGhzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGlkeDsKLQotCi0gICAgICAgIGlkeCA9IGdseXBoX2luZGljZXNbbl07Ci0gICAgICAgIGlmICggaWR4ID49IDI1OCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZHggLT0gMjU3OwotICAgICAgICAgIGlmICggaWR4ID4gbnVtX25hbWVzICkKLSAgICAgICAgICAgIG51bV9uYW1lcyA9IChGVF9VU2hvcnQpaWR4OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogbm93IGxvYWQgdGhlIG5hbWUgc3RyaW5ncyAqLwotICAgIHsKLSAgICAgIEZUX1VTaG9ydCAgbjsKLQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggbmFtZV9zdHJpbmdzLCBudW1fbmFtZXMgKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fbmFtZXM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGxlbjsKLQotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1BPUygpID49IHBvc3RfbGltaXQgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTYoKCAibG9hZF9mb3JtYXRfMjA6ICVkIGJ5dGUgbGVmdCBpbiBwb3N0IHRhYmxlXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHBvc3RfbGltaXQgLSBGVF9TVFJFQU1fUE9TKCkgKSk7Ci0KLSAgICAgICAgICBpZiAoIEZUX1JFQURfQllURSggbGVuICkgKQotICAgICAgICAgICAgZ290byBGYWlsMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbGVuID4gcG9zdF9saW1pdCAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIEZUX1NUUkVBTV9QT1MoKSA+IHBvc3RfbGltaXQgLSBsZW4gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBkID0gKEZUX0ludClwb3N0X2xpbWl0IC0gKEZUX0ludClGVF9TVFJFQU1fUE9TKCk7Ci0KLQotICAgICAgICAgIEZUX0VSUk9SKCggImxvYWRfZm9ybWF0XzIwOiIKLSAgICAgICAgICAgICAgICAgICAgICIgZXhjZWVkaW5nIHN0cmluZyBsZW5ndGggKCVkKSwiCi0gICAgICAgICAgICAgICAgICAgICAiIHRydW5jYXRpbmcgYXQgZW5kIG9mIHBvc3QgdGFibGUgKCVkIGJ5dGUgbGVmdClcbiIsCi0gICAgICAgICAgICAgICAgICAgICBsZW4sIGQgKSk7Ci0gICAgICAgICAgbGVuID0gKEZUX1VJbnQpRlRfTUFYKCAwLCBkICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggbmFtZV9zdHJpbmdzW25dLCBsZW4gKyAxICkgfHwKLSAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRCggbmFtZV9zdHJpbmdzW25dLCBsZW4gICApICkKLSAgICAgICAgICBnb3RvIEZhaWwxOwotCi0gICAgICAgIG5hbWVfc3RyaW5nc1tuXVtsZW5dID0gJ1wwJzsKLSAgICAgIH0KLQotICAgICAgaWYgKCBuIDwgbnVtX25hbWVzICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAibG9hZF9mb3JtYXRfMjA6IgotICAgICAgICAgICAgICAgICAgICIgYWxsIGVudHJpZXMgaW4gcG9zdCB0YWJsZSBhcmUgYWxyZWFkeSBwYXJzZWQsIgotICAgICAgICAgICAgICAgICAgICIgdXNpbmcgTlVMTCBuYW1lcyBmb3IgZ2lkICVkIC0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIG4sIG51bV9uYW1lcyAtIDEgKSk7Ci0gICAgICAgIGZvciAoIDsgbiA8IG51bV9uYW1lczsgbisrICkKLSAgICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggbmFtZV9zdHJpbmdzW25dLCAxICkgKQotICAgICAgICAgICAgZ290byBGYWlsMTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBuYW1lX3N0cmluZ3Nbbl1bMF0gPSAnXDAnOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGFsbCByaWdodCwgc2V0IHRhYmxlIGZpZWxkcyBhbmQgZXhpdCBzdWNjZXNzZnVsbHkgKi8KLSAgICB7Ci0gICAgICBUVF9Qb3N0XzIwICB0YWJsZSA9ICZmYWNlLT5wb3N0c2NyaXB0X25hbWVzLm5hbWVzLmZvcm1hdF8yMDsKLQotCi0gICAgICB0YWJsZS0+bnVtX2dseXBocyAgICA9IChGVF9VU2hvcnQpbnVtX2dseXBoczsKLSAgICAgIHRhYmxlLT5udW1fbmFtZXMgICAgID0gKEZUX1VTaG9ydCludW1fbmFtZXM7Ci0gICAgICB0YWJsZS0+Z2x5cGhfaW5kaWNlcyA9IGdseXBoX2luZGljZXM7Ci0gICAgICB0YWJsZS0+Z2x5cGhfbmFtZXMgICA9IG5hbWVfc3RyaW5nczsKLSAgICB9Ci0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICBGYWlsMToKLSAgICB7Ci0gICAgICBGVF9VU2hvcnQgIG47Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fbmFtZXM7IG4rKyApCi0gICAgICAgIEZUX0ZSRUUoIG5hbWVfc3RyaW5nc1tuXSApOwotICAgIH0KLQotICBGYWlsOgotICAgIEZUX0ZSRUUoIG5hbWVfc3RyaW5ncyApOwotICAgIEZUX0ZSRUUoIGdseXBoX2luZGljZXMgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGxvYWRfZm9ybWF0XzI1KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgcG9zdF9saW1pdCApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLSAgICBGVF9JbnQgICAgIG51bV9nbHlwaHM7Ci0gICAgRlRfQ2hhciogICBvZmZzZXRfdGFibGUgPSBOVUxMOwotCi0gICAgRlRfVU5VU0VEKCBwb3N0X2xpbWl0ICk7Ci0KLQotICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG51bV9nbHlwaHMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayB0aGUgbnVtYmVyIG9mIGdseXBocyAqLwotICAgIGlmICggbnVtX2dseXBocyA+IGZhY2UtPm1heF9wcm9maWxlLm51bUdseXBocyB8fAotICAgICAgICAgbnVtX2dseXBocyA+IDI1OCAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgbnVtX2dseXBocyA8IDEgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBvZmZzZXRfdGFibGUsIG51bV9nbHlwaHMgKSAgIHx8Ci0gICAgICAgICBGVF9TVFJFQU1fUkVBRCggb2Zmc2V0X3RhYmxlLCBudW1fZ2x5cGhzICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgLyogbm93IGNoZWNrIHRoZSBvZmZzZXQgdGFibGUgKi8KLSAgICB7Ci0gICAgICBGVF9JbnQgIG47Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ2x5cGhzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9Mb25nICBpZHggPSAoRlRfTG9uZyluICsgb2Zmc2V0X3RhYmxlW25dOwotCi0KLSAgICAgICAgaWYgKCBpZHggPCAwIHx8IGlkeCA+IG51bV9nbHlwaHMgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIE9LLCBzZXQgdGFibGUgZmllbGRzIGFuZCBleGl0IHN1Y2Nlc3NmdWxseSAqLwotICAgIHsKLSAgICAgIFRUX1Bvc3RfMjUgIHRhYmxlID0gJmZhY2UtPnBvc3RzY3JpcHRfbmFtZXMubmFtZXMuZm9ybWF0XzI1OwotCi0KLSAgICAgIHRhYmxlLT5udW1fZ2x5cGhzID0gKEZUX1VTaG9ydCludW1fZ2x5cGhzOwotICAgICAgdGFibGUtPm9mZnNldHMgICAgPSBvZmZzZXRfdGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICBGYWlsOgotICAgIEZUX0ZSRUUoIG9mZnNldF90YWJsZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF9wb3N0X25hbWVzKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfRml4ZWQgICBmb3JtYXQ7Ci0gICAgRlRfVUxvbmcgICBwb3N0X2xlbjsKLSAgICBGVF9VTG9uZyAgIHBvc3RfbGltaXQ7Ci0KLQotICAgIC8qIGdldCBhIHN0cmVhbSBmb3IgdGhlIGZhY2UncyByZXNvdXJjZSAqLwotICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0gICAgLyogc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBQUyBuYW1lcyB0YWJsZSAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19wb3N0LCBzdHJlYW0sICZwb3N0X2xlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcG9zdF9saW1pdCA9IEZUX1NUUkVBTV9QT1MoKSArIHBvc3RfbGVuOwotCi0gICAgZm9ybWF0ID0gZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlOwotCi0gICAgLyogZ28gdG8gYmVnaW5uaW5nIG9mIHN1YnRhYmxlICovCi0gICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggMzIgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBub3cgcmVhZCBwb3N0c2NyaXB0IHRhYmxlICovCi0gICAgaWYgKCBmb3JtYXQgPT0gMHgwMDAyMDAwMEwgKQotICAgICAgZXJyb3IgPSBsb2FkX2Zvcm1hdF8yMCggZmFjZSwgc3RyZWFtLCBwb3N0X2xpbWl0ICk7Ci0gICAgZWxzZSBpZiAoIGZvcm1hdCA9PSAweDAwMDI4MDAwTCApCi0gICAgICBlcnJvciA9IGxvYWRfZm9ybWF0XzI1KCBmYWNlLCBzdHJlYW0sIHBvc3RfbGltaXQgKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBmYWNlLT5wb3N0c2NyaXB0X25hbWVzLmxvYWRlZCA9IDE7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9wc19uYW1lcyggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBUVF9Qb3N0X05hbWVzICBuYW1lcyAgPSAmZmFjZS0+cG9zdHNjcmlwdF9uYW1lczsKLSAgICBGVF9GaXhlZCAgICAgICBmb3JtYXQ7Ci0KLQotICAgIGlmICggbmFtZXMtPmxvYWRlZCApCi0gICAgewotICAgICAgZm9ybWF0ID0gZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlOwotCi0gICAgICBpZiAoIGZvcm1hdCA9PSAweDAwMDIwMDAwTCApCi0gICAgICB7Ci0gICAgICAgIFRUX1Bvc3RfMjAgIHRhYmxlID0gJm5hbWVzLT5uYW1lcy5mb3JtYXRfMjA7Ci0gICAgICAgIEZUX1VTaG9ydCAgIG47Ci0KLQotICAgICAgICBGVF9GUkVFKCB0YWJsZS0+Z2x5cGhfaW5kaWNlcyApOwotICAgICAgICB0YWJsZS0+bnVtX2dseXBocyA9IDA7Ci0KLSAgICAgICAgZm9yICggbiA9IDA7IG4gPCB0YWJsZS0+bnVtX25hbWVzOyBuKysgKQotICAgICAgICAgIEZUX0ZSRUUoIHRhYmxlLT5nbHlwaF9uYW1lc1tuXSApOwotCi0gICAgICAgIEZUX0ZSRUUoIHRhYmxlLT5nbHlwaF9uYW1lcyApOwotICAgICAgICB0YWJsZS0+bnVtX25hbWVzID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmb3JtYXQgPT0gMHgwMDAyODAwMEwgKQotICAgICAgewotICAgICAgICBUVF9Qb3N0XzI1ICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzI1OwotCi0KLSAgICAgICAgRlRfRlJFRSggdGFibGUtPm9mZnNldHMgKTsKLSAgICAgICAgdGFibGUtPm51bV9nbHlwaHMgPSAwOwotICAgICAgfQotICAgIH0KLSAgICBuYW1lcy0+bG9hZGVkID0gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9nZXRfcHNfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBQb3N0U2NyaXB0IGdseXBoIG5hbWUgb2YgYSBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU25hbWUgOjogVGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcgcG9pbnRlci4gIFdpbGwgYmUgTlVMTCBpbiBjYXNlICAgKi8KLSAgLyogICAgICAgICAgICAgIG9mIGVycm9yLCBvdGhlcndpc2UgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBnbHlwaCBuYW1lLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgWW91IG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nISAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2dldF9wc19uYW1lKCBUVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiogIFBTbmFtZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLSAgICBUVF9Qb3N0X05hbWVzICBuYW1lczsKLSAgICBGVF9GaXhlZCAgICAgICBmb3JtYXQ7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0jZW5kaWYKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggaWR4ID49IChGVF9VSW50KWZhY2UtPm1heF9wcm9maWxlLm51bUdseXBocyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfR2x5cGhfSW5kZXggKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICAgIHBzbmFtZXMgPSAoRlRfU2VydmljZV9Qc0NNYXBzKWZhY2UtPnBzbmFtZXM7Ci0gICAgaWYgKCAhcHNuYW1lcyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotI2VuZGlmCi0KLSAgICBuYW1lcyA9ICZmYWNlLT5wb3N0c2NyaXB0X25hbWVzOwotCi0gICAgLyogYC5ub3RkZWYnIGJ5IGRlZmF1bHQgKi8KLSAgICAqUFNuYW1lID0gTUFDX05BTUUoIDAgKTsKLQotICAgIGZvcm1hdCA9IGZhY2UtPnBvc3RzY3JpcHQuRm9ybWF0VHlwZTsKLQotICAgIGlmICggZm9ybWF0ID09IDB4MDAwMTAwMDBMICkKLSAgICB7Ci0gICAgICBpZiAoIGlkeCA8IDI1OCApICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbm9pZCBjaGVja2luZyAqLwotICAgICAgICAqUFNuYW1lID0gTUFDX05BTUUoIGlkeCApOwotICAgIH0KLSAgICBlbHNlIGlmICggZm9ybWF0ID09IDB4MDAwMjAwMDBMICkKLSAgICB7Ci0gICAgICBUVF9Qb3N0XzIwICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzIwOwotCi0KLSAgICAgIGlmICggIW5hbWVzLT5sb2FkZWQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGxvYWRfcG9zdF9uYW1lcyggZmFjZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEVuZDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBpZHggPCAoRlRfVUludCl0YWJsZS0+bnVtX2dseXBocyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VTaG9ydCAgbmFtZV9pbmRleCA9IHRhYmxlLT5nbHlwaF9pbmRpY2VzW2lkeF07Ci0KLQotICAgICAgICBpZiAoIG5hbWVfaW5kZXggPCAyNTggKQotICAgICAgICAgICpQU25hbWUgPSBNQUNfTkFNRSggbmFtZV9pbmRleCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgKlBTbmFtZSA9IChGVF9TdHJpbmcqKXRhYmxlLT5nbHlwaF9uYW1lc1tuYW1lX2luZGV4IC0gMjU4XTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIGZvcm1hdCA9PSAweDAwMDI4MDAwTCApCi0gICAgewotICAgICAgVFRfUG9zdF8yNSAgdGFibGUgPSAmbmFtZXMtPm5hbWVzLmZvcm1hdF8yNTsKLQotCi0gICAgICBpZiAoICFuYW1lcy0+bG9hZGVkICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBsb2FkX3Bvc3RfbmFtZXMoIGZhY2UgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggaWR4IDwgKEZUX1VJbnQpdGFibGUtPm51bV9nbHlwaHMgKSAgICAvKiBwYXJhbm9pZCBjaGVja2luZyAqLwotICAgICAgICAqUFNuYW1lID0gTUFDX05BTUUoIChGVF9JbnQpaWR4ICsgdGFibGUtPm9mZnNldHNbaWR4XSApOwotICAgIH0KLQotICAgIC8qIG5vdGhpbmcgdG8gZG8gZm9yIGZvcm1hdCA9PSAweDAwMDMwMDAwTCAqLwotCi0gIEVuZDoKLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbHNlIC8qICFUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgKi8KLQotICAvKiBBTlNJIEMgZG9lc24ndCBsaWtlIGVtcHR5IHNvdXJjZSBmaWxlcyAqLwotICB0eXBlZGVmIGludCAgX3R0X3Bvc3RfZHVtbXk7Ci0KLSNlbmRpZiAvKiAhVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dHBvc3QuaCBiL3NyYy9zZm50L3R0cG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI0ODVlLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3R0cG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRwb3N0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgbmFtZSB0YWJsZSBwcm9jZXNzaW5nIGZvciBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZm9udHMgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUVFBPU1RfSF8KLSNkZWZpbmUgVFRQT1NUX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZ2V0X3BzX25hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgUFNuYW1lICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfcHNfbmFtZXMoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBUVFBPU1RfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0c2JpdC5jIGIvc3JjL3NmbnQvdHRzYml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YjIxNjguLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRzYml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0c2JpdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMyBieSBHb29nbGUsIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR29vZ2xlIEF1dGhvcihzKTogQmVoZGFkIEVzZmFoYm9kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotI2luY2x1ZGUgInR0c2JpdC5oIgotCi0jaW5jbHVkZSAic2ZlcnJvcnMuaCIKLQotI2luY2x1ZGUgInR0bXR4LmgiCi0jaW5jbHVkZSAicG5nc2hpbS5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRzYml0Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3NiaXQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgdGFibGVfc2l6ZTsKLSAgICBGVF9VTG9uZyAgdGFibGVfc3RhcnQ7Ci0KLQotICAgIGZhY2UtPnNiaXRfdGFibGUgICAgICAgPSBOVUxMOwotICAgIGZhY2UtPnNiaXRfdGFibGVfc2l6ZSAgPSAwOwotICAgIGZhY2UtPnNiaXRfdGFibGVfdHlwZSAgPSBUVF9TQklUX1RBQkxFX1RZUEVfTk9ORTsKLSAgICBmYWNlLT5zYml0X251bV9zdHJpa2VzID0gMDsKLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19DQkxDLCBzdHJlYW0sICZ0YWJsZV9zaXplICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgZmFjZS0+c2JpdF90YWJsZV90eXBlID0gVFRfU0JJVF9UQUJMRV9UWVBFX0NCTEM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19FQkxDLCBzdHJlYW0sICZ0YWJsZV9zaXplICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2Jsb2MsIHN0cmVhbSwgJnRhYmxlX3NpemUgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgZmFjZS0+c2JpdF90YWJsZV90eXBlID0gVFRfU0JJVF9UQUJMRV9UWVBFX0VCTEM7Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX3NiaXgsIHN0cmVhbSwgJnRhYmxlX3NpemUgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgZmFjZS0+c2JpdF90YWJsZV90eXBlID0gVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVg7Ci0gICAgfQotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCB0YWJsZV9zaXplIDwgOCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidHRfZmFjZV9sb2FkX3NiaXRfc3RyaWtlczogdGFibGUgdG9vIHNob3J0XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIHRhYmxlX3N0YXJ0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgc3dpdGNoICggKEZUX1VJbnQpZmFjZS0+c2JpdF90YWJsZV90eXBlICkKLSAgICB7Ci0gICAgY2FzZSBUVF9TQklUX1RBQkxFX1RZUEVfRUJMQzoKLSAgICBjYXNlIFRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDOgotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgcDsKLSAgICAgICAgRlRfRml4ZWQgIHZlcnNpb247Ci0gICAgICAgIEZUX1VMb25nICBudW1fc3RyaWtlczsKLSAgICAgICAgRlRfVUludCAgIGNvdW50OwotCi0KLSAgICAgICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCB0YWJsZV9zaXplLCBmYWNlLT5zYml0X3RhYmxlICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmYWNlLT5zYml0X3RhYmxlX3NpemUgPSB0YWJsZV9zaXplOwotCi0gICAgICAgIHAgPSBmYWNlLT5zYml0X3RhYmxlOwotCi0gICAgICAgIHZlcnNpb24gICAgID0gRlRfTkVYVF9MT05HKCBwICk7Ci0gICAgICAgIG51bV9zdHJpa2VzID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIC8qIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGZvbnQgKEZaU2h1U29uZy1aMDEsIHZlcnNpb24gMykgICAqLwotICAgICAgICAvKiB0aGF0IHVzZXMgdGhlIHdyb25nIGJ5dGUgb3JkZXIgZm9yIHRoZSBgdmVyc2lvbicgZmllbGQgKi8KLSAgICAgICAgaWYgKCAoIChGVF9VTG9uZyl2ZXJzaW9uICYgMHhGRkZGMDAwMFVMICkgIT0gMHgwMDAyMDAwMFVMICYmCi0gICAgICAgICAgICAgKCAoRlRfVUxvbmcpdmVyc2lvbiAmIDB4MDAwMEZGRkZVTCApICE9IDB4MDAwMDAyMDBVTCAmJgotICAgICAgICAgICAgICggKEZUX1VMb25nKXZlcnNpb24gJiAweEZGRkYwMDAwVUwgKSAhPSAweDAwMDMwMDAwVUwgJiYKLSAgICAgICAgICAgICAoIChGVF9VTG9uZyl2ZXJzaW9uICYgMHgwMDAwRkZGRlVMICkgIT0gMHgwMDAwMDMwMFVMICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG51bV9zdHJpa2VzID49IDB4MTAwMDBVTCApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIENvdW50IHRoZSBudW1iZXIgb2Ygc3RyaWtlcyBhdmFpbGFibGUgaW4gdGhlIHRhYmxlLiAgV2UgYXJlIGEgYml0Ci0gICAgICAgICAqICBwYXJhbm9pZCB0aGVyZSBhbmQgZG9uJ3QgdHJ1c3QgdGhlIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBjb3VudCA9IChGVF9VSW50KW51bV9zdHJpa2VzOwotICAgICAgICBpZiAoIDggKyA0OFVMICogY291bnQgPiB0YWJsZV9zaXplICkKLSAgICAgICAgICBjb3VudCA9IChGVF9VSW50KSggKCB0YWJsZV9zaXplIC0gOCApIC8gNDggKTsKLQotICAgICAgICBmYWNlLT5zYml0X251bV9zdHJpa2VzID0gY291bnQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVg6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VTaG9ydCAgdmVyc2lvbjsKLSAgICAgICAgRlRfVVNob3J0ICBmbGFnczsKLSAgICAgICAgRlRfVUxvbmcgICBudW1fc3RyaWtlczsKLSAgICAgICAgRlRfVUludCAgICBjb3VudDsKLQotCi0gICAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDggKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIHZlcnNpb24gICAgID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgICBmbGFncyAgICAgICA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgbnVtX3N0cmlrZXMgPSBGVF9HRVRfVUxPTkcoKTsKLQotICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAgICAgaWYgKCB2ZXJzaW9uIDwgMSApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQml0IDAgbXVzdCBhbHdheXMgYmUgYDEnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBCaXQgMSBjb250cm9scyB0aGUgb3ZlcmxheSBvZiBiaXRtYXBzIHdpdGggb3V0bGluZXMuICovCi0gICAgICAgIC8qIEFsbCBvdGhlciBiaXRzIHNob3VsZCBiZSB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAhKCBmbGFncyA9PSAxIHx8IGZsYWdzID09IDMgKSB8fAotICAgICAgICAgICAgIG51bV9zdHJpa2VzID49IDB4MTAwMDBVTCAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBiaXQgMTsgaG93ZXZlciwgaXQgaXMgYmV0dGVyIHRvICovCi0gICAgICAgIC8qIGRyYXcgYXQgbGVhc3Qgc29tZXRoaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBmbGFncyA9PSAzICkKLSAgICAgICAgICBGVF9UUkFDRTEoKCAidHRfZmFjZV9sb2FkX3NiaXRfc3RyaWtlczoiCi0gICAgICAgICAgICAgICAgICAgICAgIiBzYml4IG92ZXJsYXkgbm90IHN1cHBvcnRlZCB5ZXRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICAgIiBleHBlY3QgYmFkIHJlbmRlcmluZyByZXN1bHRzXG4iICkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqICBDb3VudCB0aGUgbnVtYmVyIG9mIHN0cmlrZXMgYXZhaWxhYmxlIGluIHRoZSB0YWJsZS4gIFdlIGFyZSBhIGJpdAotICAgICAgICAgKiAgcGFyYW5vaWQgdGhlcmUgYW5kIGRvbid0IHRydXN0IHRoZSBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgY291bnQgPSAoRlRfVUludCludW1fc3RyaWtlczsKLSAgICAgICAgaWYgKCA4ICsgNFVMICogY291bnQgPiB0YWJsZV9zaXplICkKLSAgICAgICAgICBjb3VudCA9IChGVF9VSW50KSggKCB0YWJsZV9zaXplIC0gOCApIC8gNCApOwotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIEZUX1NUUkVBTV9QT1MoKSAtIDggKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGZhY2UtPnNiaXRfdGFibGVfc2l6ZSA9IDggKyBjb3VudCAqIDQ7Ci0gICAgICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggZmFjZS0+c2JpdF90YWJsZV9zaXplLCBmYWNlLT5zYml0X3RhYmxlICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmYWNlLT5zYml0X251bV9zdHJpa2VzID0gY291bnQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB3ZSBpZ25vcmUgdW5rbm93biB0YWJsZSBmb3JtYXRzICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgICBGVF9UUkFDRTMoKCAidHRfZmFjZV9sb2FkX3NiaXRfc3RyaWtlczogZm91bmQgJXUgc3RyaWtlc1xuIiwKLSAgICAgICAgICAgICAgICAgIGZhY2UtPnNiaXRfbnVtX3N0cmlrZXMgKSk7Ci0KLSAgICBmYWNlLT5lYmR0X3N0YXJ0ID0gMDsKLSAgICBmYWNlLT5lYmR0X3NpemUgID0gMDsKLQotICAgIGlmICggZmFjZS0+c2JpdF90YWJsZV90eXBlID09IFRUX1NCSVRfVEFCTEVfVFlQRV9TQklYICkKLSAgICB7Ci0gICAgICAvKiB0aGUgYHNiaXgnIHRhYmxlIGlzIHNlbGYtY29udGFpbmVkOyAqLwotICAgICAgLyogaXQgaGFzIG5vIGFzc29jaWF0ZWQgZGF0YSB0YWJsZSAgICAgKi8KLSAgICAgIGZhY2UtPmViZHRfc3RhcnQgPSB0YWJsZV9zdGFydDsKLSAgICAgIGZhY2UtPmViZHRfc2l6ZSAgPSB0YWJsZV9zaXplOwotICAgIH0KLSAgICBlbHNlIGlmICggZmFjZS0+c2JpdF90YWJsZV90eXBlICE9IFRUX1NCSVRfVEFCTEVfVFlQRV9OT05FICkKLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgZWJkdF9zaXplOwotCi0KLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19DQkRULCBzdHJlYW0sICZlYmR0X3NpemUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfRUJEVCwgc3RyZWFtLCAmZWJkdF9zaXplICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2JkYXQsIHN0cmVhbSwgJmViZHRfc2l6ZSApOwotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGZhY2UtPmViZHRfc3RhcnQgPSBGVF9TVFJFQU1fUE9TKCk7Ci0gICAgICAgIGZhY2UtPmViZHRfc2l6ZSAgPSBlYmR0X3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAhZmFjZS0+ZWJkdF9zaXplICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAidHRfZmFjZV9sb2FkX3NiaXRfc3RyaWtlczoiCi0gICAgICAgICAgICAgICAgICAiIG5vIGVtYmVkZGVkIGJpdG1hcCBkYXRhIHRhYmxlIGZvdW5kO1xuIgotICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgIiByZXNldHRpbmcgbnVtYmVyIG9mIHN0cmlrZXMgdG8gemVyb1xuIiApKTsKLSAgICAgIGZhY2UtPnNiaXRfbnVtX3N0cmlrZXMgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBpZiAoIGZhY2UtPnNiaXRfdGFibGUgKQotICAgICAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT5zYml0X3RhYmxlICk7Ci0gICAgICBmYWNlLT5zYml0X3RhYmxlX3NpemUgPSAwOwotICAgICAgZmFjZS0+c2JpdF90YWJsZV90eXBlID0gVFRfU0JJVF9UQUJMRV9UWVBFX05PTkU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfc2JpdCggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0KLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT5zYml0X3RhYmxlICk7Ci0gICAgZmFjZS0+c2JpdF90YWJsZV9zaXplICA9IDA7Ci0gICAgZmFjZS0+c2JpdF90YWJsZV90eXBlICA9IFRUX1NCSVRfVEFCTEVfVFlQRV9OT05FOwotICAgIGZhY2UtPnNiaXRfbnVtX3N0cmlrZXMgPSAwOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9zZXRfc2JpdF9zdHJpa2UoIFRUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICBhc3RyaWtlX2luZGV4ICkKLSAgewotICAgIHJldHVybiBGVF9NYXRjaF9TaXplKCAoRlRfRmFjZSlmYWNlLCByZXEsIDAsIGFzdHJpa2VfaW5kZXggKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcyggVFRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyApCi0gIHsKLSAgICAvKiB3ZSBoYXZlIHRvIHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYHNiaXRfc3RyaWtlX21hcCcgICAgKi8KLSAgICAvKiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBnZXRzIGFsc28gdXNlZCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgKi8KLSAgICAvKiB0byBjb25zdHJ1Y3QgYHNiaXRfc3RyaWtlX21hcCcgaXRzZWxmICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPnNiaXRfc3RyaWtlX21hcCApCi0gICAgewotICAgICAgaWYgKCBzdHJpa2VfaW5kZXggPj0gKEZUX1VMb25nKWZhY2UtPnJvb3QubnVtX2ZpeGVkX3NpemVzICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAgIC8qIG1hcCB0byByZWFsIGluZGV4ICovCi0gICAgICBzdHJpa2VfaW5kZXggPSBmYWNlLT5zYml0X3N0cmlrZV9tYXBbc3RyaWtlX2luZGV4XTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggc3RyaWtlX2luZGV4ID49IChGVF9VTG9uZylmYWNlLT5zYml0X251bV9zdHJpa2VzICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgfQotCi0gICAgc3dpdGNoICggKEZUX1VJbnQpZmFjZS0+c2JpdF90YWJsZV90eXBlICkKLSAgICB7Ci0gICAgY2FzZSBUVF9TQklUX1RBQkxFX1RZUEVfRUJMQzoKLSAgICBjYXNlIFRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDOgotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgc3RyaWtlOwotICAgICAgICBGVF9DaGFyICAgbWF4X2JlZm9yZV9ibDsKLSAgICAgICAgRlRfQ2hhciAgIG1pbl9hZnRlcl9ibDsKLQotCi0gICAgICAgIHN0cmlrZSA9IGZhY2UtPnNiaXRfdGFibGUgKyA4ICsgc3RyaWtlX2luZGV4ICogNDg7Ci0KLSAgICAgICAgbWV0cmljcy0+eF9wcGVtID0gKEZUX1VTaG9ydClzdHJpa2VbNDRdOwotICAgICAgICBtZXRyaWNzLT55X3BwZW0gPSAoRlRfVVNob3J0KXN0cmlrZVs0NV07Ci0KLSAgICAgICAgbWV0cmljcy0+YXNjZW5kZXIgID0gKEZUX0NoYXIpc3RyaWtlWzE2XSAqIDY0OyAgLyogaG9yaS5hc2NlbmRlciAgKi8KLSAgICAgICAgbWV0cmljcy0+ZGVzY2VuZGVyID0gKEZUX0NoYXIpc3RyaWtlWzE3XSAqIDY0OyAgLyogaG9yaS5kZXNjZW5kZXIgKi8KLQotICAgICAgICAvKiBEdWUgdG8gZnV6enkgd29yZGluZyBpbiB0aGUgRUJMQyBkb2N1bWVudGF0aW9uLCB3ZSBmaW5kIGJvdGggKi8KLSAgICAgICAgLyogcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcyBmb3IgYGRlc2NlbmRlcicuICBBZGRpdGlvbmFsbHksICovCi0gICAgICAgIC8qIG1hbnkgZm9udHMgaGF2ZSBib3RoIGBhc2NlbmRlcicgYW5kIGBkZXNjZW5kZXInIHNldCB0byB6ZXJvICAqLwotICAgICAgICAvKiAod2hpY2ggaXMgZGVmaW5pdGVseSB3cm9uZykuICBNUyBXaW5kb3dzIHNpbXBseSBpZ25vcmVzIGFsbCAgKi8KLSAgICAgICAgLyogdGhvc2UgdmFsdWVzLi4uICBGb3IgdGhlc2UgcmVhc29ucyB3ZSBhcHBseSBzb21lIGhldXJpc3RpY3MgICovCi0gICAgICAgIC8qIHRvIGdldCBhIHJlYXNvbmFibGUsIG5vbi16ZXJvIHZhbHVlIGZvciB0aGUgaGVpZ2h0LiAgICAgICAgICAqLwotCi0gICAgICAgIG1heF9iZWZvcmVfYmwgPSAoRlRfQ2hhcilzdHJpa2VbMjRdOwotICAgICAgICBtaW5fYWZ0ZXJfYmwgID0gKEZUX0NoYXIpc3RyaWtlWzI1XTsKLQotICAgICAgICBpZiAoIG1ldHJpY3MtPmRlc2NlbmRlciA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogY29tcGFyZSBzaWduIG9mIGRlc2NlbmRlciB3aXRoIGBtaW5fYWZ0ZXJfYmwnICovCi0gICAgICAgICAgaWYgKCBtaW5fYWZ0ZXJfYmwgPCAwICkKLSAgICAgICAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9IC1tZXRyaWNzLT5kZXNjZW5kZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIGlmICggbWV0cmljcy0+ZGVzY2VuZGVyID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBtZXRyaWNzLT5hc2NlbmRlciA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTIoKCAidHRfZmFjZV9sb2FkX3N0cmlrZV9tZXRyaWNzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgc2FuaXRpemluZyBpbnZhbGlkIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAgICAgIiB2YWx1ZXMgZm9yIHN0cmlrZSAlZCAoJWRwcGVtLCAlZHBwZW0pXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9wcGVtLCBtZXRyaWNzLT55X3BwZW0gKSk7Ci0KLSAgICAgICAgICAgIC8qIHNhbml0aXplIGJ1Z2d5IGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgdmFsdWVzICovCi0gICAgICAgICAgICBpZiAoIG1heF9iZWZvcmVfYmwgfHwgbWluX2FmdGVyX2JsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWV0cmljcy0+YXNjZW5kZXIgID0gbWF4X2JlZm9yZV9ibCAqIDY0OwotICAgICAgICAgICAgICBtZXRyaWNzLT5kZXNjZW5kZXIgPSBtaW5fYWZ0ZXJfYmwgKiA2NDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWV0cmljcy0+YXNjZW5kZXIgID0gbWV0cmljcy0+eV9wcGVtICogNjQ7Ci0gICAgICAgICAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgIGVsc2UKLSAgICAgICAgICA7IC8qIGlmIHdlIGhhdmUgYSBuZWdhdGl2ZSBkZXNjZW5kZXIsIHNpbXBseSB1c2UgaXQgKi8KLSNlbmRpZgotCi0gICAgICAgIG1ldHJpY3MtPmhlaWdodCA9IG1ldHJpY3MtPmFzY2VuZGVyIC0gbWV0cmljcy0+ZGVzY2VuZGVyOwotICAgICAgICBpZiAoIG1ldHJpY3MtPmhlaWdodCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJ0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3M6IgotICAgICAgICAgICAgICAgICAgICAgICIgc2FuaXRpemluZyBpbnZhbGlkIGhlaWdodCB2YWx1ZVxuIgotICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAgICIgZm9yIHN0cmlrZSAoJWQsICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3BwZW0sIG1ldHJpY3MtPnlfcHBlbSApKTsKLSAgICAgICAgICBtZXRyaWNzLT5oZWlnaHQgICAgPSBtZXRyaWNzLT55X3BwZW0gKiA2NDsKLSAgICAgICAgICBtZXRyaWNzLT5kZXNjZW5kZXIgPSBtZXRyaWNzLT5hc2NlbmRlciAtIG1ldHJpY3MtPmhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElzIHRoaXMgY29ycmVjdD8gKi8KLSAgICAgICAgbWV0cmljcy0+bWF4X2FkdmFuY2UgPSAoIChGVF9DaGFyKXN0cmlrZVsyMl0gKyAvKiBtaW5fb3JpZ2luX1NCICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlWzE4XSArIC8qIG1heF93aWR0aCAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcilzdHJpa2VbMjNdICAgLyogbWluX2FkdmFuY2VfU0IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAqIDY0OwotCi0gICAgICAgIC8qIHNldCB0aGUgc2NhbGUgdmFsdWVzIChpbiAxNi4xNiB1bml0cykgc28gYWR2YW5jZXMgKi8KLSAgICAgICAgLyogZnJvbSB0aGUgaG10eCBhbmQgdm10eCB0YWJsZSBhcmUgc2NhbGVkIGNvcnJlY3RseSAqLwotICAgICAgICBtZXRyaWNzLT54X3NjYWxlID0gRlRfTXVsRGl2KCBtZXRyaWNzLT54X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogMHgxMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTSApOwotICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gRlRfTXVsRGl2KCBtZXRyaWNzLT55X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogMHgxMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTSApOwotCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFRUX1NCSVRfVEFCTEVfVFlQRV9TQklYOgotICAgICAgewotICAgICAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgICAgIEZUX1VJbnQgICAgICAgICBvZmZzZXQ7Ci0gICAgICAgIEZUX1VTaG9ydCAgICAgICB1cGVtLCBwcGVtLCByZXNvbHV0aW9uOwotICAgICAgICBUVF9Ib3JpSGVhZGVyICAqaG9yaTsKLSAgICAgICAgRlRfUG9zICAgICAgICAgIHBwZW1fOyAvKiB0byByZWR1Y2UgY2FzdHMgKi8KLQotICAgICAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgICAgIEZUX0J5dGUqICBwOwotCi0KLSAgICAgICAgcCAgICAgID0gZmFjZS0+c2JpdF90YWJsZSArIDggKyA0ICogc3RyaWtlX2luZGV4OwotICAgICAgICBvZmZzZXQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgICAgaWYgKCBvZmZzZXQgKyA0ID4gZmFjZS0+ZWJkdF9zaXplICkKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBmYWNlLT5lYmR0X3N0YXJ0ICsgb2Zmc2V0ICkgfHwKLSAgICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggNCApICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgcHBlbSAgICAgICA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgcmVzb2x1dGlvbiA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgICBGVF9VTlVTRUQoIHJlc29sdXRpb24gKTsgLyogV2hhdCB0byBkbyB3aXRoIHRoaXM/ICovCi0KLSAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgICAgIHVwZW0gPSBmYWNlLT5oZWFkZXIuVW5pdHNfUGVyX0VNOwotICAgICAgICBob3JpID0gJmZhY2UtPmhvcml6b250YWw7Ci0KLSAgICAgICAgbWV0cmljcy0+eF9wcGVtID0gcHBlbTsKLSAgICAgICAgbWV0cmljcy0+eV9wcGVtID0gcHBlbTsKLQotICAgICAgICBwcGVtXyA9IChGVF9Qb3MpcHBlbTsKLQotICAgICAgICBtZXRyaWNzLT5hc2NlbmRlciA9Ci0gICAgICAgICAgRlRfTXVsRGl2KCBob3JpLT5Bc2NlbmRlciwgcHBlbV8gKiA2NCwgdXBlbSApOwotICAgICAgICBtZXRyaWNzLT5kZXNjZW5kZXIgPQotICAgICAgICAgIEZUX011bERpdiggaG9yaS0+RGVzY2VuZGVyLCBwcGVtXyAqIDY0LCB1cGVtICk7Ci0gICAgICAgIG1ldHJpY3MtPmhlaWdodCA9Ci0gICAgICAgICAgRlRfTXVsRGl2KCBob3JpLT5Bc2NlbmRlciAtIGhvcmktPkRlc2NlbmRlciArIGhvcmktPkxpbmVfR2FwLAotICAgICAgICAgICAgICAgICAgICAgcHBlbV8gKiA2NCwgdXBlbSApOwotICAgICAgICBtZXRyaWNzLT5tYXhfYWR2YW5jZSA9Ci0gICAgICAgICAgRlRfTXVsRGl2KCBob3JpLT5hZHZhbmNlX1dpZHRoX01heCwgcHBlbV8gKiA2NCwgdXBlbSApOwotCi0gICAgICAgIC8qIHNldCB0aGUgc2NhbGUgdmFsdWVzIChpbiAxNi4xNiB1bml0cykgc28gYWR2YW5jZXMgKi8KLSAgICAgICAgLyogZnJvbSB0aGUgaG10eCBhbmQgdm10eCB0YWJsZSBhcmUgc2NhbGVkIGNvcnJlY3RseSAqLwotICAgICAgICBtZXRyaWNzLT54X3NjYWxlID0gRlRfTXVsRGl2KCBtZXRyaWNzLT54X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogMHgxMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTSApOwotICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gRlRfTXVsRGl2KCBtZXRyaWNzLT55X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogMHgxMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTSApOwotCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0RGVjb2RlclJlY18KLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgZmFjZTsKLSAgICBGVF9TdHJlYW0gICAgICAgIHN0cmVhbTsKLSAgICBGVF9CaXRtYXAqICAgICAgIGJpdG1hcDsKLSAgICBUVF9TQml0X01ldHJpY3MgIG1ldHJpY3M7Ci0gICAgRlRfQm9vbCAgICAgICAgICBtZXRyaWNzX2xvYWRlZDsKLSAgICBGVF9Cb29sICAgICAgICAgIGJpdG1hcF9hbGxvY2F0ZWQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgICBiaXRfZGVwdGg7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIGViZHRfc3RhcnQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICBlYmR0X3NpemU7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleF9hcnJheTsKLSAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleF9jb3VudDsKLSAgICBGVF9CeXRlKiAgICAgICAgIGVibGNfYmFzZTsKLSAgICBGVF9CeXRlKiAgICAgICAgIGVibGNfbGltaXQ7Ci0KLSAgfSBUVF9TQml0RGVjb2RlclJlYywgKlRUX1NCaXREZWNvZGVyOwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9pbml0KCBUVF9TQml0RGVjb2RlciAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyogIG1ldHJpY3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FUlIoIFRhYmxlX01pc3NpbmcgKTsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0KLSAgICBzdHJpa2VfaW5kZXggPSBmYWNlLT5zYml0X3N0cmlrZV9tYXBbc3RyaWtlX2luZGV4XTsKLQotICAgIGlmICggIWZhY2UtPmViZHRfc2l6ZSApCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZmFjZS0+ZWJkdF9zdGFydCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGRlY29kZXItPmZhY2UgICAgPSBmYWNlOwotICAgIGRlY29kZXItPnN0cmVhbSAgPSBzdHJlYW07Ci0gICAgZGVjb2Rlci0+Yml0bWFwICA9ICZmYWNlLT5yb290LmdseXBoLT5iaXRtYXA7Ci0gICAgZGVjb2Rlci0+bWV0cmljcyA9IG1ldHJpY3M7Ci0KLSAgICBkZWNvZGVyLT5tZXRyaWNzX2xvYWRlZCAgID0gMDsKLSAgICBkZWNvZGVyLT5iaXRtYXBfYWxsb2NhdGVkID0gMDsKLQotICAgIGRlY29kZXItPmViZHRfc3RhcnQgPSBmYWNlLT5lYmR0X3N0YXJ0OwotICAgIGRlY29kZXItPmViZHRfc2l6ZSAgPSBmYWNlLT5lYmR0X3NpemU7Ci0KLSAgICBkZWNvZGVyLT5lYmxjX2Jhc2UgID0gZmFjZS0+c2JpdF90YWJsZTsKLSAgICBkZWNvZGVyLT5lYmxjX2xpbWl0ID0gZmFjZS0+c2JpdF90YWJsZSArIGZhY2UtPnNiaXRfdGFibGVfc2l6ZTsKLQotICAgIC8qIG5vdyBmaW5kIHRoZSBzdHJpa2UgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kZXggKi8KLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgcDsKLQotCi0gICAgICBpZiAoIDggKyA0OCAqIHN0cmlrZV9pbmRleCArIDMgKiA0ICsgMzQgKyAxID4gZmFjZS0+c2JpdF90YWJsZV9zaXplICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHAgPSBkZWNvZGVyLT5lYmxjX2Jhc2UgKyA4ICsgNDggKiBzdHJpa2VfaW5kZXg7Ci0KLSAgICAgIGRlY29kZXItPnN0cmlrZV9pbmRleF9hcnJheSA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIHAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IDQ7Ci0gICAgICBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfY291bnQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBwICAgICAgICAgICAgICAgICAgICAgICAgICArPSAzNDsKLSAgICAgIGRlY29kZXItPmJpdF9kZXB0aCAgICAgICAgICA9ICpwOwotCi0gICAgICAvKiBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfYXJyYXkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICA4ICogZGVjb2Rlci0+c3RyaWtlX2luZGV4X2NvdW50ID4gZmFjZS0+c2JpdF90YWJsZV9zaXplID8gKi8KLSAgICAgIGlmICggZGVjb2Rlci0+c3RyaWtlX2luZGV4X2FycmF5ID4gZmFjZS0+c2JpdF90YWJsZV9zaXplICAgICAgICAgICB8fAotICAgICAgICAgICBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfY291bnQgPgotICAgICAgICAgICAgICggZmFjZS0+c2JpdF90YWJsZV9zaXplIC0gZGVjb2Rlci0+c3RyaWtlX2luZGV4X2FycmF5ICkgLyA4ICkKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdHRfc2JpdF9kZWNvZGVyX2RvbmUoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyICkKLSAgewotICAgIEZUX1VOVVNFRCggZGVjb2RlciApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2JpdF9kZWNvZGVyX2FsbG9jX2JpdG1hcCggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBtZXRyaWNzX29ubHkgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgICAgd2lkdGgsIGhlaWdodDsKLSAgICBGVF9CaXRtYXAqICBtYXAgPSBkZWNvZGVyLT5iaXRtYXA7Ci0gICAgRlRfVUxvbmcgICAgc2l6ZTsKLQotCi0gICAgaWYgKCAhZGVjb2Rlci0+bWV0cmljc19sb2FkZWQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICB3aWR0aCAgPSBkZWNvZGVyLT5tZXRyaWNzLT53aWR0aDsKLSAgICBoZWlnaHQgPSBkZWNvZGVyLT5tZXRyaWNzLT5oZWlnaHQ7Ci0KLSAgICBtYXAtPndpZHRoID0gd2lkdGg7Ci0gICAgbWFwLT5yb3dzICA9IGhlaWdodDsKLQotICAgIHN3aXRjaCAoIGRlY29kZXItPmJpdF9kZXB0aCApCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTU9OTzsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCAoIG1hcC0+d2lkdGggKyA3ICkgPj4gMyApOwotICAgICAgbWFwLT5udW1fZ3JheXMgID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgbWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZMjsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCAoIG1hcC0+d2lkdGggKyAzICkgPj4gMiApOwotICAgICAgbWFwLT5udW1fZ3JheXMgID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgbWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZNDsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCAoIG1hcC0+d2lkdGggKyAxICkgPj4gMSApOwotICAgICAgbWFwLT5udW1fZ3JheXMgID0gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgODoKLSAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCBtYXAtPndpZHRoICk7Ci0gICAgICBtYXAtPm51bV9ncmF5cyAgPSAyNTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzI6Ci0gICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0JHUkE7Ci0gICAgICBtYXAtPnBpdGNoICAgICAgPSAoaW50KSggbWFwLT53aWR0aCAqIDQgKTsKLSAgICAgIG1hcC0+bnVtX2dyYXlzICA9IDI1NjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBzaXplID0gbWFwLT5yb3dzICogKEZUX1VMb25nKW1hcC0+cGl0Y2g7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIG5vIGVtcHR5IGltYWdlICovCi0gICAgaWYgKCBzaXplID09IDAgKQotICAgICAgZ290byBFeGl0OyAgICAgLyogZXhpdCBzdWNjZXNzZnVsbHkhICovCi0KLSAgICBpZiAoIG1ldHJpY3Nfb25seSApCi0gICAgICBnb3RvIEV4aXQ7ICAgICAvKiBvbmx5IG1ldHJpY3MgYXJlIHJlcXVlc3RlZCAqLwotCi0gICAgZXJyb3IgPSBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKCBkZWNvZGVyLT5mYWNlLT5yb290LmdseXBoLCBzaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBkZWNvZGVyLT5iaXRtYXBfYWxsb2NhdGVkID0gMTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX21ldHJpY3MoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAqcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGJpZyApCi0gIHsKLSAgICBGVF9CeXRlKiAgICAgICAgIHAgICAgICAgPSAqcHA7Ci0gICAgVFRfU0JpdF9NZXRyaWNzICBtZXRyaWNzID0gZGVjb2Rlci0+bWV0cmljczsKLQotCi0gICAgaWYgKCBwICsgNSA+IGxpbWl0ICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIG1ldHJpY3MtPmhlaWdodCAgICAgICA9IHBbMF07Ci0gICAgbWV0cmljcy0+d2lkdGggICAgICAgID0gcFsxXTsKLSAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSAoRlRfQ2hhcilwWzJdOwotICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IChGVF9DaGFyKXBbM107Ci0gICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgID0gcFs0XTsKLQotICAgIHAgKz0gNTsKLSAgICBpZiAoIGJpZyApCi0gICAgewotICAgICAgaWYgKCBwICsgMyA+IGxpbWl0ICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSAoRlRfQ2hhcilwWzBdOwotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdZID0gKEZUX0NoYXIpcFsxXTsKLSAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICA9IHBbMl07Ci0KLSAgICAgIHAgKz0gMzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZGF0YSBpbiBjYXNlIHRoZXJlIGlzIG5vIHZlcnRpY2FsIGluZm8gLS0gKi8KLSAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IDA7Ci0gICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSAwOwotICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgID0gMDsKLSAgICB9Ci0KLSAgICBkZWNvZGVyLT5tZXRyaWNzX2xvYWRlZCA9IDE7Ci0gICAgKnBwID0gcDsKLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEZhaWw6Ci0gICAgRlRfVFJBQ0UxKCggInR0X3NiaXRfZGVjb2Rlcl9sb2FkX21ldHJpY3M6IGJyb2tlbiB0YWJsZVxuIiApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgfQotCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2UoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIHJlY3Vyc2VfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgbWV0cmljc19vbmx5ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvciAgKCpUVF9TQml0RGVjb2Rlcl9Mb2FkRnVuYykoCi0gICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIHBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICByZWN1cnNlX2NvdW50ICk7Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2JpdF9kZWNvZGVyX2xvYWRfYnl0ZV9hbGlnbmVkKCBUVF9TQml0RGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgcmVjdXJzZV9jb3VudCApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9CeXRlKiAgICBsaW5lOwotICAgIEZUX0ludCAgICAgIHBpdGNoLCB3aWR0aCwgaGVpZ2h0LCBsaW5lX2JpdHMsIGg7Ci0gICAgRlRfVUludCAgICAgYml0X2hlaWdodCwgYml0X3dpZHRoOwotICAgIEZUX0JpdG1hcCogIGJpdG1hcDsKLQotICAgIEZUX1VOVVNFRCggcmVjdXJzZV9jb3VudCApOwotCi0KLSAgICAvKiBjaGVjayB0aGF0IHdlIGNhbiB3cml0ZSB0aGUgZ2x5cGggaW50byB0aGUgYml0bWFwICovCi0gICAgYml0bWFwICAgICA9IGRlY29kZXItPmJpdG1hcDsKLSAgICBiaXRfd2lkdGggID0gYml0bWFwLT53aWR0aDsKLSAgICBiaXRfaGVpZ2h0ID0gYml0bWFwLT5yb3dzOwotICAgIHBpdGNoICAgICAgPSBiaXRtYXAtPnBpdGNoOwotICAgIGxpbmUgICAgICAgPSBiaXRtYXAtPmJ1ZmZlcjsKLQotICAgIHdpZHRoICA9IGRlY29kZXItPm1ldHJpY3MtPndpZHRoOwotICAgIGhlaWdodCA9IGRlY29kZXItPm1ldHJpY3MtPmhlaWdodDsKLQotICAgIGxpbmVfYml0cyA9IHdpZHRoICogZGVjb2Rlci0+Yml0X2RlcHRoOwotCi0gICAgaWYgKCB4X3BvcyA8IDAgfHwgKEZUX1VJbnQpKCB4X3BvcyArIHdpZHRoICkgPiBiaXRfd2lkdGggICB8fAotICAgICAgICAgeV9wb3MgPCAwIHx8IChGVF9VSW50KSggeV9wb3MgKyBoZWlnaHQgKSA+IGJpdF9oZWlnaHQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ6IgotICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGJpdG1hcCBkaW1lbnNpb25zXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggcCArICggKCBsaW5lX2JpdHMgKyA3ICkgPj4gMyApICogaGVpZ2h0ID4gbGltaXQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ6IGJyb2tlbiBiaXRtYXBcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbm93IGRvIHRoZSBibGl0ICovCi0gICAgbGluZSAgKz0geV9wb3MgKiBwaXRjaCArICggeF9wb3MgPj4gMyApOwotICAgIHhfcG9zICY9IDc7Ci0KLSAgICBpZiAoIHhfcG9zID09IDAgKSAgLyogdGhlIGVhc3kgb25lICovCi0gICAgewotICAgICAgZm9yICggaCA9IGhlaWdodDsgaCA+IDA7IGgtLSwgbGluZSArPSBwaXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBwd3JpdGUgPSBsaW5lOwotICAgICAgICBGVF9JbnQgICAgdzsKLQotCi0gICAgICAgIGZvciAoIHcgPSBsaW5lX2JpdHM7IHcgPj0gODsgdyAtPSA4ICkKLSAgICAgICAgewotICAgICAgICAgIHB3cml0ZVswXSA9IChGVF9CeXRlKSggcHdyaXRlWzBdIHwgKnArKyApOwotICAgICAgICAgIHB3cml0ZSAgICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHcgPiAwICkKLSAgICAgICAgICBwd3JpdGVbMF0gPSAoRlRfQnl0ZSkoIHB3cml0ZVswXSB8ICggKnArKyAmICggMHhGRjAwVSA+PiB3ICkgKSApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlICAvKiB4X3BvcyA+IDAgKi8KLSAgICB7Ci0gICAgICBmb3IgKCBoID0gaGVpZ2h0OyBoID4gMDsgaC0tLCBsaW5lICs9IHBpdGNoICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIHB3cml0ZSA9IGxpbmU7Ci0gICAgICAgIEZUX0ludCAgICB3OwotICAgICAgICBGVF9VSW50ICAgd3ZhbCA9IDA7Ci0KLQotICAgICAgICBmb3IgKCB3ID0gbGluZV9iaXRzOyB3ID49IDg7IHcgLT0gOCApCi0gICAgICAgIHsKLSAgICAgICAgICB3dmFsICAgICAgID0gKEZUX1VJbnQpKCB3dmFsIHwgKnArKyApOwotICAgICAgICAgIHB3cml0ZVswXSAgPSAoRlRfQnl0ZSkoIHB3cml0ZVswXSB8ICggd3ZhbCA+PiB4X3BvcyApICk7Ci0gICAgICAgICAgcHdyaXRlICAgICs9IDE7Ci0gICAgICAgICAgd3ZhbCAgICAgPDw9IDg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHcgPiAwICkKLSAgICAgICAgICB3dmFsID0gKEZUX1VJbnQpKCB3dmFsIHwgKCAqcCsrICYgKCAweEZGMDBVID4+IHcgKSApICk7Ci0KLSAgICAgICAgLyogYWxsIGJpdHMgcmVhZCBhbmQgdGhlcmUgYXJlIGB4X3BvcyArIHcnIGJpdHMgdG8gYmUgd3JpdHRlbiAqLwotCi0gICAgICAgIHB3cml0ZVswXSA9IChGVF9CeXRlKSggcHdyaXRlWzBdIHwgKCB3dmFsID4+IHhfcG9zICkgKTsKLQotICAgICAgICBpZiAoIHhfcG9zICsgdyA+IDggKQotICAgICAgICB7Ci0gICAgICAgICAgcHdyaXRlKys7Ci0gICAgICAgICAgd3ZhbCAgICAgPDw9IDg7Ci0gICAgICAgICAgcHdyaXRlWzBdICA9IChGVF9CeXRlKSggcHdyaXRlWzBdIHwgKCB3dmFsID4+IHhfcG9zICkgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIGlmICggIWVycm9yICkKLSAgICAgIEZUX1RSQUNFMygoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ6IGxvYWRlZFxuIiApKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qCi0gICAqIExvYWQgYSBiaXQtYWxpZ25lZCBiaXRtYXAgKHdpdGggcG9pbnRlciBgcCcpIGludG8gYSBsaW5lLWFsaWduZWQgYml0bWFwCi0gICAqICh3aXRoIHBvaW50ZXIgYHB3cml0ZScpLiAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSB3aWR0aCBpcyAzIHBpeGVsLAotICAgKiBhbmQgYHhfcG9zJyBpcyAxIHBpeGVsLgotICAgKgotICAgKiAgICAgICBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHArMQotICAgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICogICAgIHwgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAgfCA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMCB8Li4uCi0gICAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKiAgICAgICArLS0tLS0tLSsgICArLS0tLS0tLSsgICArLS0tLS0tLSsgLi4uCi0gICAqICAgICAgICAgICAuICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAuICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICAgICB2ICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICstLS0tLS0tKyAgICAgICAuICAgICAgICAgICAuCi0gICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAuCi0gICAqIHwgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAgfCAuCi0gICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAuCi0gICAqICAgcHdyaXRlICAgICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICB2ICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICAuCi0gICAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKiAgICAgICAgICAgICB8IDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwIHwKLSAgICogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAqICAgICAgICAgICAgICAgcHdyaXRlKzEgICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMCB8Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3cml0ZSsyCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRfYWxpZ25lZCggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICByZWN1cnNlX2NvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUqICAgIGxpbmU7Ci0gICAgRlRfSW50ICAgICAgcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIGxpbmVfYml0cywgaCwgbmJpdHM7Ci0gICAgRlRfVUludCAgICAgYml0X2hlaWdodCwgYml0X3dpZHRoOwotICAgIEZUX0JpdG1hcCogIGJpdG1hcDsKLSAgICBGVF9VU2hvcnQgICBydmFsOwotCi0gICAgRlRfVU5VU0VEKCByZWN1cnNlX2NvdW50ICk7Ci0KLQotICAgIC8qIGNoZWNrIHRoYXQgd2UgY2FuIHdyaXRlIHRoZSBnbHlwaCBpbnRvIHRoZSBiaXRtYXAgKi8KLSAgICBiaXRtYXAgICAgID0gZGVjb2Rlci0+Yml0bWFwOwotICAgIGJpdF93aWR0aCAgPSBiaXRtYXAtPndpZHRoOwotICAgIGJpdF9oZWlnaHQgPSBiaXRtYXAtPnJvd3M7Ci0gICAgcGl0Y2ggICAgICA9IGJpdG1hcC0+cGl0Y2g7Ci0gICAgbGluZSAgICAgICA9IGJpdG1hcC0+YnVmZmVyOwotCi0gICAgd2lkdGggID0gZGVjb2Rlci0+bWV0cmljcy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gZGVjb2Rlci0+bWV0cmljcy0+aGVpZ2h0OwotCi0gICAgbGluZV9iaXRzID0gd2lkdGggKiBkZWNvZGVyLT5iaXRfZGVwdGg7Ci0KLSAgICBpZiAoIHhfcG9zIDwgMCB8fCAoRlRfVUludCkoIHhfcG9zICsgd2lkdGggKSA+IGJpdF93aWR0aCAgIHx8Ci0gICAgICAgICB5X3BvcyA8IDAgfHwgKEZUX1VJbnQpKCB5X3BvcyArIGhlaWdodCApID4gYml0X2hlaWdodCApCi0gICAgewotICAgICAgRlRfVFJBQ0UxKCggInR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdF9hbGlnbmVkOiIKLSAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBiaXRtYXAgZGltZW5zaW9uc1xuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIHAgKyAoICggbGluZV9iaXRzICogaGVpZ2h0ICsgNyApID4+IDMgKSA+IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQ6IGJyb2tlbiBiaXRtYXBcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAhbGluZV9iaXRzIHx8ICFoZWlnaHQgKQotICAgIHsKLSAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBub3cgZG8gdGhlIGJsaXQgKi8KLQotICAgIC8qIGFkanVzdCBgbGluZScgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGJpdG1hcCAqLwotICAgIGxpbmUgICs9IHlfcG9zICogcGl0Y2ggKyAoIHhfcG9zID4+IDMgKTsKLSAgICB4X3BvcyAmPSA3OwotCi0gICAgLyogdGhlIGhpZ2hlciBieXRlIG9mIGBydmFsJyBpcyB1c2VkIGFzIGEgYnVmZmVyICovCi0gICAgcnZhbCAgPSAwOwotICAgIG5iaXRzID0gMDsKLQotICAgIGZvciAoIGggPSBoZWlnaHQ7IGggPiAwOyBoLS0sIGxpbmUgKz0gcGl0Y2ggKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBwd3JpdGUgPSBsaW5lOwotICAgICAgRlRfSW50ICAgIHcgICAgICA9IGxpbmVfYml0czsKLQotCi0gICAgICAvKiBoYW5kbGUgaW5pdGlhbCBieXRlIChpbiB0YXJnZXQgYml0bWFwKSBzcGVjaWFsbHkgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoIHhfcG9zICkKLSAgICAgIHsKLSAgICAgICAgdyA9ICggbGluZV9iaXRzIDwgOCAtIHhfcG9zICkgPyBsaW5lX2JpdHMgOiA4IC0geF9wb3M7Ci0KLSAgICAgICAgaWYgKCBoID09IGhlaWdodCApCi0gICAgICAgIHsKLSAgICAgICAgICBydmFsICA9ICpwKys7Ci0gICAgICAgICAgbmJpdHMgPSB4X3BvczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggbmJpdHMgPCB3ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggcCA8IGxpbWl0ICkKLSAgICAgICAgICAgIHJ2YWwgfD0gKnArKzsKLSAgICAgICAgICBuYml0cyArPSA4IC0gdzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBydmFsICA+Pj0gODsKLSAgICAgICAgICBuYml0cyAgLT0gdzsKLSAgICAgICAgfQotCi0gICAgICAgICpwd3JpdGUrKyB8PSAoICggcnZhbCA+PiBuYml0cyApICYgMHhGRiApICYKLSAgICAgICAgICAgICAgICAgICAgICggfiggMHhGRlUgPDwgdyApIDw8ICggOCAtIHcgLSB4X3BvcyApICk7Ci0gICAgICAgIHJ2YWwgICAgIDw8PSA4OwotCi0gICAgICAgIHcgPSBsaW5lX2JpdHMgLSB3OwotICAgICAgfQotCi0gICAgICAvKiBoYW5kbGUgbWVkaWFsIGJ5dGVzICovCi0gICAgICBmb3IgKCA7IHcgPj0gODsgdyAtPSA4ICkKLSAgICAgIHsKLSAgICAgICAgcnZhbCAgICAgIHw9ICpwKys7Ci0gICAgICAgICpwd3JpdGUrKyB8PSAoIHJ2YWwgPj4gbmJpdHMgKSAmIDB4RkY7Ci0KLSAgICAgICAgcnZhbCA8PD0gODsKLSAgICAgIH0KLQotICAgICAgLyogaGFuZGxlIGZpbmFsIGJ5dGUgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoIHcgPiAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBuYml0cyA8IHcgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwIDwgbGltaXQgKQotICAgICAgICAgICAgcnZhbCB8PSAqcCsrOwotICAgICAgICAgICpwd3JpdGUgfD0gKCAoIHJ2YWwgPj4gbmJpdHMgKSAmIDB4RkYgKSAmICggMHhGRjAwVSA+PiB3ICk7Ci0gICAgICAgICAgbmJpdHMgICArPSA4IC0gdzsKLQotICAgICAgICAgIHJ2YWwgPDw9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgKnB3cml0ZSB8PSAoICggcnZhbCA+PiBuYml0cyApICYgMHhGRiApICYgKCAweEZGMDBVID4+IHcgKTsKLSAgICAgICAgICBuYml0cyAgIC09IHc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBGVF9UUkFDRTMoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQ6IGxvYWRlZFxuIiApKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9jb21wb3VuZCggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICByZWN1cnNlX2NvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VSW50ICAgbnVtX2NvbXBvbmVudHMsIG5uOwotCi0gICAgRlRfQ2hhciAgaG9yaUJlYXJpbmdYID0gKEZUX0NoYXIpZGVjb2Rlci0+bWV0cmljcy0+aG9yaUJlYXJpbmdYOwotICAgIEZUX0NoYXIgIGhvcmlCZWFyaW5nWSA9IChGVF9DaGFyKWRlY29kZXItPm1ldHJpY3MtPmhvcmlCZWFyaW5nWTsKLSAgICBGVF9CeXRlICBob3JpQWR2YW5jZSAgPSAoRlRfQnl0ZSlkZWNvZGVyLT5tZXRyaWNzLT5ob3JpQWR2YW5jZTsKLSAgICBGVF9DaGFyICB2ZXJ0QmVhcmluZ1ggPSAoRlRfQ2hhcilkZWNvZGVyLT5tZXRyaWNzLT52ZXJ0QmVhcmluZ1g7Ci0gICAgRlRfQ2hhciAgdmVydEJlYXJpbmdZID0gKEZUX0NoYXIpZGVjb2Rlci0+bWV0cmljcy0+dmVydEJlYXJpbmdZOwotICAgIEZUX0J5dGUgIHZlcnRBZHZhbmNlICA9IChGVF9CeXRlKWRlY29kZXItPm1ldHJpY3MtPnZlcnRBZHZhbmNlOwotCi0KLSAgICBpZiAoIHAgKyAyID4gbGltaXQgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgbnVtX2NvbXBvbmVudHMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGlmICggcCArIDQgKiBudW1fY29tcG9uZW50cyA+IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfY29tcG91bmQ6IGJyb2tlbiB0YWJsZVxuIiApKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTMoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfY29tcG91bmQ6IGxvYWRpbmcgJWQgY29tcG9uZW50c1xuIiwKLSAgICAgICAgICAgICAgICBudW1fY29tcG9uZW50cyApKTsKLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fY29tcG9uZW50czsgbm4rKyApCi0gICAgewotICAgICAgRlRfVUludCAgZ2luZGV4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX0J5dGUgIGR4ICAgICA9IEZUX05FWFRfQllURSggcCApOwotICAgICAgRlRfQnl0ZSAgZHkgICAgID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0KLQotICAgICAgLyogTkI6IGEgcmVjdXJzaXZlIGNhbGwgKi8KLSAgICAgIGVycm9yID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2UoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X3BvcyArIGR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9wb3MgKyBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VfY291bnQgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVxdWVzdCBmdWxsIGJpdG1hcCBpbWFnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTMoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfY29tcG91bmQ6IGRvbmVcbiIgKSk7Ci0KLSAgICBkZWNvZGVyLT5tZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBob3JpQmVhcmluZ1g7Ci0gICAgZGVjb2Rlci0+bWV0cmljcy0+aG9yaUJlYXJpbmdZID0gaG9yaUJlYXJpbmdZOwotICAgIGRlY29kZXItPm1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IGhvcmlBZHZhbmNlOwotICAgIGRlY29kZXItPm1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IHZlcnRCZWFyaW5nWDsKLSAgICBkZWNvZGVyLT5tZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSB2ZXJ0QmVhcmluZ1k7Ci0gICAgZGVjb2Rlci0+bWV0cmljcy0+dmVydEFkdmFuY2UgID0gdmVydEFkdmFuY2U7Ci0gICAgZGVjb2Rlci0+bWV0cmljcy0+d2lkdGggICAgICAgID0gKEZUX0J5dGUpZGVjb2Rlci0+Yml0bWFwLT53aWR0aDsKLSAgICBkZWNvZGVyLT5tZXRyaWNzLT5oZWlnaHQgICAgICAgPSAoRlRfQnl0ZSlkZWNvZGVyLT5iaXRtYXAtPnJvd3M7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9wbmcoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICByZWN1cnNlX2NvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VTG9uZyAgcG5nX2xlbjsKLQotICAgIEZUX1VOVVNFRCggcmVjdXJzZV9jb3VudCApOwotCi0KLSAgICBpZiAoIGxpbWl0IC0gcCA8IDQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9wbmc6IGJyb2tlbiBiaXRtYXBcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgcG5nX2xlbiA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBpZiAoIChGVF9VTG9uZykoIGxpbWl0IC0gcCApIDwgcG5nX2xlbiApCi0gICAgewotICAgICAgRlRfVFJBQ0UxKCggInR0X3NiaXRfZGVjb2Rlcl9sb2FkX3BuZzogYnJva2VuIGJpdG1hcFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBlcnJvciA9IExvYWRfU0JpdF9QbmcoIGRlY29kZXItPmZhY2UtPnJvb3QuZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+Yml0X2RlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+bWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPnN0cmVhbS0+bWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBGVF9UUkFDRTMoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfcG5nOiBsb2FkZWRcbiIgKSk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1VTRV9QTkcgKi8KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRtYXAoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnbHlwaF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGdseXBoX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBnbHlwaF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIHJlY3Vyc2VfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIG1ldHJpY3Nfb25seSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gZGVjb2Rlci0+c3RyZWFtOwotICAgIEZUX0J5dGUqICAgcDsKLSAgICBGVF9CeXRlKiAgIHBfbGltaXQ7Ci0gICAgRlRfQnl0ZSogICBkYXRhOwotCi0KLSAgICAvKiBzZWVrIGludG8gdGhlIEVCRFQgdGFibGUgbm93ICovCi0gICAgaWYgKCAhZ2x5cGhfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGdseXBoX3N0YXJ0ICsgZ2x5cGhfc2l6ZSA+IGRlY29kZXItPmViZHRfc2l6ZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGRlY29kZXItPmViZHRfc3RhcnQgKyBnbHlwaF9zdGFydCApIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FWFRSQUNUKCBnbHlwaF9zaXplLCBkYXRhICkgICAgICAgICAgICAgICAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcCAgICAgICA9IGRhdGE7Ci0gICAgcF9saW1pdCA9IHAgKyBnbHlwaF9zaXplOwotCi0gICAgLyogcmVhZCB0aGUgZGF0YSwgZGVwZW5kaW5nIG9uIHRoZSBnbHlwaCBmb3JtYXQgKi8KLSAgICBzd2l0Y2ggKCBnbHlwaF9mb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgODoKLSAgICBjYXNlIDE3OgotICAgICAgZXJyb3IgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9tZXRyaWNzKCBkZWNvZGVyLCAmcCwgcF9saW1pdCwgMCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgIGNhc2UgOToKLSAgICBjYXNlIDE4OgotICAgICAgZXJyb3IgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9tZXRyaWNzKCBkZWNvZGVyLCAmcCwgcF9saW1pdCwgMSApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICB7Ci0gICAgICBUVF9TQml0RGVjb2Rlcl9Mb2FkRnVuYyAgbG9hZGVyOwotCi0KLSAgICAgIHN3aXRjaCAoIGdseXBoX2Zvcm1hdCApCi0gICAgICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICBjYXNlIDY6Ci0gICAgICAgIGxvYWRlciA9IHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2J5dGVfYWxpZ25lZDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgIGNhc2UgNzoKLSAgICAgICAgewotICAgICAgICAgIC8qIERvbid0IHRydXN0IGBnbHlwaF9mb3JtYXQnLiAgRm9yIGV4YW1wbGUsIEFwcGxlJ3MgbWFpbiBLb3JlYW4gKi8KLSAgICAgICAgICAvKiBzeXN0ZW0gZm9udCwgYEFwcGxlTXl1bmdKby50dGYnICh2ZXJzaW9uIDcuMGQyZTYpLCB1c2VzIGdseXBoICovCi0gICAgICAgICAgLyogZm9ybWF0IDcsIGJ1dCB0aGUgZGF0YSBpcyBmb3JtYXQgNi4gIFdlIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSAqLwotICAgICAgICAgIC8qIGFuIGV4Y2Vzc2l2ZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGltYWdlOiBJZiBpdCBpcyBlcXVhbCB0byAgKi8KLSAgICAgICAgICAvKiB0aGUgdmFsdWUgZm9yIGEgYnl0ZS1hbGlnbmVkIGdseXBoLCB1c2UgdGhlIG90aGVyIGxvYWRpbmcgICAgICovCi0gICAgICAgICAgLyogcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBOb3RlIHRoYXQgZm9yIHNvbWUgKHdpZHRoLGhlaWdodCkgY29tYmluYXRpb25zLCB3aGVyZSB0aGUgICAgICovCi0gICAgICAgICAgLyogd2lkdGggaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgdGhlIHNpemVzIGZvciBiaXQtIGFuZCAgICAgICAgICAqLwotICAgICAgICAgIC8qIGJ5dGUtYWxpZ25lZCBkYXRhIGFyZSBlcXVhbCwgZm9yIGV4YW1wbGUgKDcsNykgb3IgKDE1LDYpLiAgV2UgKi8KLSAgICAgICAgICAvKiB0aGVuIHByZWZlciB3aGF0IGBnbHlwaF9mb3JtYXQnIHNwZWNpZmllcy4gICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICBGVF9VSW50ICB3aWR0aCAgPSBkZWNvZGVyLT5tZXRyaWNzLT53aWR0aDsKLSAgICAgICAgICBGVF9VSW50ICBoZWlnaHQgPSBkZWNvZGVyLT5tZXRyaWNzLT5oZWlnaHQ7Ci0KLSAgICAgICAgICBGVF9VSW50ICBiaXRfc2l6ZSAgPSAoIHdpZHRoICogaGVpZ2h0ICsgNyApID4+IDM7Ci0gICAgICAgICAgRlRfVUludCAgYnl0ZV9zaXplID0gaGVpZ2h0ICogKCAoIHdpZHRoICsgNyApID4+IDMgKTsKLQotCi0gICAgICAgICAgaWYgKCBiaXRfc2l6ZSA8IGJ5dGVfc2l6ZSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBieXRlX3NpemUgPT0gKEZUX1VJbnQpKCBwX2xpbWl0IC0gcCApICkKLSAgICAgICAgICAgIGxvYWRlciA9IHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2J5dGVfYWxpZ25lZDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBsb2FkZXIgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRfYWxpZ25lZDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSA1OgotICAgICAgICBsb2FkZXIgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRfYWxpZ25lZDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgODoKLSAgICAgICAgaWYgKCBwICsgMSA+IHBfbGltaXQgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBwICs9IDE7ICAvKiBza2lwIHBhZGRpbmcgKi8KLSAgICAgICAgLyogZmFsbC10aHJvdWdoICovCi0KLSAgICAgIGNhc2UgOToKLSAgICAgICAgbG9hZGVyID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfY29tcG91bmQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDE3OiAvKiBzbWFsbCBtZXRyaWNzLCBQTkcgaW1hZ2UgZGF0YSAgICovCi0gICAgICBjYXNlIDE4OiAvKiBiaWcgbWV0cmljcywgUE5HIGltYWdlIGRhdGEgICAgICovCi0gICAgICBjYXNlIDE5OiAvKiBtZXRyaWNzIGluIEVCTEMsIFBORyBpbWFnZSBkYXRhICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfUE5HCi0gICAgICAgIGxvYWRlciA9IHR0X3NiaXRfZGVjb2Rlcl9sb2FkX3BuZzsKLSAgICAgICAgYnJlYWs7Ci0jZWxzZQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICAgICAgZ290byBGYWlsOwotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORyAqLwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhZGVjb2Rlci0+Yml0bWFwX2FsbG9jYXRlZCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gdHRfc2JpdF9kZWNvZGVyX2FsbG9jX2JpdG1hcCggZGVjb2RlciwgbWV0cmljc19vbmx5ICk7Ci0KLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICBpZiAoIG1ldHJpY3Nfb25seSApCi0gICAgICAgIGdvdG8gRmFpbDsgLyogdGhpcyBpcyBub3QgYW4gZXJyb3IgKi8KLQotICAgICAgZXJyb3IgPSBsb2FkZXIoIGRlY29kZXIsIHAsIHBfbGltaXQsIHhfcG9zLCB5X3BvcywgcmVjdXJzZV9jb3VudCApOwotICAgIH0KLQotICBGYWlsOgotICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGRhdGEgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlKCBUVF9TQml0RGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICByZWN1cnNlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIG1ldHJpY3Nfb25seSApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCAgICAgICAgICA9IGRlY29kZXItPmVibGNfYmFzZSArIGRlY29kZXItPnN0cmlrZV9pbmRleF9hcnJheTsKLSAgICBGVF9CeXRlKiAgcF9saW1pdCAgICA9IGRlY29kZXItPmVibGNfbGltaXQ7Ci0gICAgRlRfVUxvbmcgIG51bV9yYW5nZXMgPSBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfY291bnQ7Ci0gICAgRlRfVUludCAgIHN0YXJ0LCBlbmQsIGluZGV4X2Zvcm1hdCwgaW1hZ2VfZm9ybWF0OwotICAgIEZUX1VMb25nICBpbWFnZV9zdGFydCA9IDAsIGltYWdlX2VuZCA9IDAsIGltYWdlX29mZnNldDsKLQotCi0gICAgLyogYXJiaXRyYXJ5IHJlY3Vyc2lvbiBsaW1pdCAqLwotICAgIGlmICggcmVjdXJzZV9jb3VudCA+IDEwMCApCi0gICAgewotICAgICAgRlRfVFJBQ0U0KCggInR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlOiIKLSAgICAgICAgICAgICAgICAgICIgcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkXG4iICkpOwotICAgICAgZ290byBGYWlsdXJlOwotICAgIH0KLQotCi0gICAgLyogRmlyc3QsIHdlIGZpbmQgdGhlIGNvcnJlY3Qgc3RyaWtlIHJhbmdlIHRoYXQgYXBwbGllcyB0byB0aGlzICovCi0gICAgLyogZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggOyBudW1fcmFuZ2VzID4gMDsgbnVtX3Jhbmdlcy0tICkKLSAgICB7Ci0gICAgICBzdGFydCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBlbmQgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIGlmICggZ2x5cGhfaW5kZXggPj0gc3RhcnQgJiYgZ2x5cGhfaW5kZXggPD0gZW5kICkKLSAgICAgICAgZ290byBGb3VuZFJhbmdlOwotCi0gICAgICBwICs9IDQ7ICAvKiBpZ25vcmUgaW5kZXggb2Zmc2V0ICovCi0gICAgfQotICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgRm91bmRSYW5nZToKLSAgICBpbWFnZV9vZmZzZXQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAvKiBvdmVyZmxvdyBjaGVjayAqLwotICAgIHAgPSBkZWNvZGVyLT5lYmxjX2Jhc2UgKyBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfYXJyYXk7Ci0gICAgaWYgKCBpbWFnZV9vZmZzZXQgPiAoRlRfVUxvbmcpKCBwX2xpbWl0IC0gcCApICkKLSAgICAgIGdvdG8gRmFpbHVyZTsKLQotICAgIHAgKz0gaW1hZ2Vfb2Zmc2V0OwotICAgIGlmICggcCArIDggPiBwX2xpbWl0ICkKLSAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICAvKiBub3cgZmluZCB0aGUgZ2x5cGgncyBsb2NhdGlvbiBhbmQgZXh0ZW5kIHdpdGhpbiB0aGUgZWJkdCB0YWJsZSAqLwotICAgIGluZGV4X2Zvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgaW1hZ2VfZm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBpbWFnZV9vZmZzZXQgPSBGVF9ORVhUX1VMT05HICggcCApOwotCi0gICAgc3dpdGNoICggaW5kZXhfZm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOiAvKiA0LWJ5dGUgb2Zmc2V0cyByZWxhdGl2ZSB0byBgaW1hZ2Vfb2Zmc2V0JyAqLwotICAgICAgcCArPSA0ICogKCBnbHlwaF9pbmRleCAtIHN0YXJ0ICk7Ci0gICAgICBpZiAoIHAgKyA4ID4gcF9saW1pdCApCi0gICAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICAgIGltYWdlX3N0YXJ0ID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgICAgaW1hZ2VfZW5kICAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggaW1hZ2Vfc3RhcnQgPT0gaW1hZ2VfZW5kICkgIC8qIG1pc3NpbmcgZ2x5cGggKi8KLSAgICAgICAgZ290byBOb0JpdG1hcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOiAvKiBiaWcgbWV0cmljcywgY29uc3RhbnQgaW1hZ2Ugc2l6ZSAqLwotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgaW1hZ2Vfc2l6ZTsKLQotCi0gICAgICAgIGlmICggcCArIDEyID4gcF9saW1pdCApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBpbWFnZV9zaXplID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIGlmICggdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyggZGVjb2RlciwgJnAsIHBfbGltaXQsIDEgKSApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBpbWFnZV9zdGFydCA9IGltYWdlX3NpemUgKiAoIGdseXBoX2luZGV4IC0gc3RhcnQgKTsKLSAgICAgICAgaW1hZ2VfZW5kICAgPSBpbWFnZV9zdGFydCArIGltYWdlX3NpemU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzogLyogMi1ieXRlIG9mZnNldHMgcmVsYXRpdmUgdG8gJ2ltYWdlX29mZnNldCcgKi8KLSAgICAgIHAgKz0gMiAqICggZ2x5cGhfaW5kZXggLSBzdGFydCApOwotICAgICAgaWYgKCBwICsgNCA+IHBfbGltaXQgKQotICAgICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgICBpbWFnZV9zdGFydCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBpbWFnZV9lbmQgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIGlmICggaW1hZ2Vfc3RhcnQgPT0gaW1hZ2VfZW5kICkgIC8qIG1pc3NpbmcgZ2x5cGggKi8KLSAgICAgICAgZ290byBOb0JpdG1hcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OiAvKiBzcGFyc2UgZ2x5cGggYXJyYXkgd2l0aCAoZ2x5cGgsb2Zmc2V0KSBwYWlycyAqLwotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgbW0sIG51bV9nbHlwaHM7Ci0KLQotICAgICAgICBpZiAoIHAgKyA0ID4gcF9saW1pdCApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBudW1fZ2x5cGhzID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIC8qIG92ZXJmbG93IGNoZWNrIGZvciBwICsgKCBudW1fZ2x5cGhzICsgMSApICogNCAqLwotICAgICAgICBpZiAoIHAgKyA0ID4gcF9saW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICBudW1fZ2x5cGhzID4gKEZUX1VMb25nKSggKCAoIHBfbGltaXQgLSBwICkgPj4gMiApIC0gMSApICkKLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgICAgIGZvciAoIG1tID0gMDsgbW0gPCBudW1fZ2x5cGhzOyBtbSsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIGdpbmRleCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLQotICAgICAgICAgIGlmICggZ2luZGV4ID09IGdseXBoX2luZGV4ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbWFnZV9zdGFydCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICBwICAgICAgICAgICs9IDI7Ci0gICAgICAgICAgICBpbWFnZV9lbmQgICA9IEZUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcCArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBtbSA+PSBudW1fZ2x5cGhzICkKLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDU6IC8qIGNvbnN0YW50IG1ldHJpY3Mgd2l0aCBzcGFyc2UgZ2x5cGggY29kZXMgKi8KLSAgICBjYXNlIDE5OgotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgaW1hZ2Vfc2l6ZSwgbW0sIG51bV9nbHlwaHM7Ci0KLQotICAgICAgICBpZiAoIHAgKyAxNiA+IHBfbGltaXQgKQotICAgICAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICAgICAgaW1hZ2Vfc2l6ZSA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICBpZiAoIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX21ldHJpY3MoIGRlY29kZXIsICZwLCBwX2xpbWl0LCAxICkgKQotICAgICAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICAgICAgbnVtX2dseXBocyA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICAvKiBvdmVyZmxvdyBjaGVjayBmb3IgcCArIDIgKiBudW1fZ2x5cGhzICovCi0gICAgICAgIGlmICggbnVtX2dseXBocyA+IChGVF9VTG9uZykoICggcF9saW1pdCAtIHAgKSA+PiAxICkgKQotICAgICAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICAgICAgZm9yICggbW0gPSAwOyBtbSA8IG51bV9nbHlwaHM7IG1tKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgZ2luZGV4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotCi0gICAgICAgICAgaWYgKCBnaW5kZXggPT0gZ2x5cGhfaW5kZXggKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG1tID49IG51bV9nbHlwaHMgKQotICAgICAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICAgICAgaW1hZ2Vfc3RhcnQgPSBpbWFnZV9zaXplICogbW07Ci0gICAgICAgIGltYWdlX2VuZCAgID0gaW1hZ2Vfc3RhcnQgKyBpbWFnZV9zaXplOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZ290byBOb0JpdG1hcDsKLSAgICB9Ci0KLSAgICBpZiAoIGltYWdlX3N0YXJ0ID4gaW1hZ2VfZW5kICkKLSAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICBpbWFnZV9lbmQgIC09IGltYWdlX3N0YXJ0OwotICAgIGltYWdlX3N0YXJ0ID0gaW1hZ2Vfb2Zmc2V0ICsgaW1hZ2Vfc3RhcnQ7Ci0KLSAgICBGVF9UUkFDRTMoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2U6IgotICAgICAgICAgICAgICAgICIgZm91bmQgc2JpdCAoZm9ybWF0ICVkKSBmb3IgZ2x5cGggaW5kZXggJWRcbiIsCi0gICAgICAgICAgICAgICAgaW1hZ2VfZm9ybWF0LCBnbHlwaF9pbmRleCApKTsKLQotICAgIHJldHVybiB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRtYXAoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3Nfb25seSApOwotCi0gIEZhaWx1cmU6Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0KLSAgTm9CaXRtYXA6Ci0gICAgRlRfVFJBQ0U0KCggInR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlOiIKLSAgICAgICAgICAgICAgICAiIG5vIHNiaXQgZm91bmQgZm9yIGdseXBoIGluZGV4ICVkXG4iLCBnbHlwaF9pbmRleCApKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfZmFjZV9sb2FkX3NiaXhfaW1hZ2UoIFRUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgICAgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgKm1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgICAgICBtZXRyaWNzX29ubHkgKQotICB7Ci0gICAgRlRfVUludCAgIHN0cmlrZV9vZmZzZXQsIGdseXBoX3N0YXJ0LCBnbHlwaF9lbmQ7Ci0gICAgRlRfSW50ICAgIG9yaWdpbk9mZnNldFgsIG9yaWdpbk9mZnNldFk7Ci0gICAgRlRfVGFnICAgIGdyYXBoaWNUeXBlOwotICAgIEZUX0ludCAgICByZWN1cnNlX2RlcHRoID0gMDsKLQotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9CeXRlKiAgcDsKLQotICAgIEZUX1VOVVNFRCggbWFwICk7Ci0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORwotICAgIEZUX1VOVVNFRCggbWV0cmljc19vbmx5ICk7Ci0jZW5kaWYKLQotCi0gICAgc3RyaWtlX2luZGV4ID0gZmFjZS0+c2JpdF9zdHJpa2VfbWFwW3N0cmlrZV9pbmRleF07Ci0KLSAgICBtZXRyaWNzLT53aWR0aCAgPSAwOwotICAgIG1ldHJpY3MtPmhlaWdodCA9IDA7Ci0KLSAgICBwID0gZmFjZS0+c2JpdF90YWJsZSArIDggKyA0ICogc3RyaWtlX2luZGV4OwotICAgIHN0cmlrZV9vZmZzZXQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgcmV0cnk6Ci0gICAgaWYgKCBnbHlwaF9pbmRleCA+IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggc3RyaWtlX29mZnNldCA+PSBmYWNlLT5lYmR0X3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBmYWNlLT5lYmR0X3NpemUgLSBzdHJpa2Vfb2Zmc2V0IDwgNCArIGdseXBoX2luZGV4ICogNCArIDggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBmYWNlLT5lYmR0X3N0YXJ0ICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlX29mZnNldCArIDQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4ICogNCAgICkgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCA4ICkgICAgICAgICAgICAgICAgICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGdseXBoX3N0YXJ0ID0gRlRfR0VUX1VMT05HKCk7Ci0gICAgZ2x5cGhfZW5kICAgPSBGVF9HRVRfVUxPTkcoKTsKLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIGlmICggZ2x5cGhfc3RhcnQgPT0gZ2x5cGhfZW5kICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIGlmICggZ2x5cGhfc3RhcnQgPiBnbHlwaF9lbmQgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgZ2x5cGhfZW5kIC0gZ2x5cGhfc3RhcnQgPCA4ICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgZmFjZS0+ZWJkdF9zaXplIC0gc3RyaWtlX29mZnNldCA8IGdseXBoX2VuZCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGZhY2UtPmViZHRfc3RhcnQgKyBzdHJpa2Vfb2Zmc2V0ICsgZ2x5cGhfc3RhcnQgKSB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGdseXBoX2VuZCAtIGdseXBoX3N0YXJ0ICkgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBvcmlnaW5PZmZzZXRYID0gRlRfR0VUX1NIT1JUKCk7Ci0gICAgb3JpZ2luT2Zmc2V0WSA9IEZUX0dFVF9TSE9SVCgpOwotCi0gICAgZ3JhcGhpY1R5cGUgPSBGVF9HRVRfVEFHNCgpOwotCi0gICAgc3dpdGNoICggZ3JhcGhpY1R5cGUgKQotICAgIHsKLSAgICBjYXNlIEZUX01BS0VfVEFHKCAnZCcsICd1JywgJ3AnLCAnZScgKToKLSAgICAgIGlmICggcmVjdXJzZV9kZXB0aCA8IDQgKQotICAgICAgewotICAgICAgICBnbHlwaF9pbmRleCA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgICAgICByZWN1cnNlX2RlcHRoKys7Ci0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgICB9Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfTUFLRV9UQUcoICdwJywgJ24nLCAnZycsICcgJyApOgotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORwotICAgICAgZXJyb3IgPSBMb2FkX1NCaXRfUG5nKCBmYWNlLT5yb290LmdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9lbmQgLSBnbHlwaF9zdGFydCAtIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3Nfb25seSApOwotI2Vsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotI2VuZGlmCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfTUFLRV9UQUcoICdqJywgJ3AnLCAnZycsICcgJyApOgotICAgIGNhc2UgRlRfTUFLRV9UQUcoICd0JywgJ2knLCAnZicsICdmJyApOgotICAgIGNhc2UgRlRfTUFLRV9UQUcoICdyJywgJ2cnLCAnYicsICdsJyApOiAvKiB1c2VkIG9uIGlPUyA3LjEgKi8KLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX1Nob3J0ICAgYWJlYXJpbmc7Ci0gICAgICBGVF9VU2hvcnQgIGFhZHZhbmNlOwotCi0KLSAgICAgIHR0X2ZhY2VfZ2V0X21ldHJpY3MoIGZhY2UsIEZBTFNFLCBnbHlwaF9pbmRleCwgJmFiZWFyaW5nLCAmYWFkdmFuY2UgKTsKLQotICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYID0gKEZUX1Nob3J0KW9yaWdpbk9mZnNldFg7Ci0gICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSAoRlRfU2hvcnQpKCAtb3JpZ2luT2Zmc2V0WSArIG1ldHJpY3MtPmhlaWdodCApOwotICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgID0gKEZUX1VTaG9ydCkoIGFhZHZhbmNlICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290LnNpemUtPm1ldHJpY3MueF9wcGVtIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5oZWFkZXIuVW5pdHNfUGVyX0VNICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3NiaXRfaW1hZ2UoIFRUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICAgICptYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3NSZWMgICptZXRyaWNzICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgc3dpdGNoICggKEZUX1VJbnQpZmFjZS0+c2JpdF90YWJsZV90eXBlICkKLSAgICB7Ci0gICAgY2FzZSBUVF9TQklUX1RBQkxFX1RZUEVfRUJMQzoKLSAgICBjYXNlIFRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDOgotICAgICAgewotICAgICAgICBUVF9TQml0RGVjb2RlclJlYyAgZGVjb2RlclsxXTsKLQotCi0gICAgICAgIGVycm9yID0gdHRfc2JpdF9kZWNvZGVyX2luaXQoIGRlY29kZXIsIGZhY2UsIHN0cmlrZV9pbmRleCwgbWV0cmljcyApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlKAotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9CSVRNQVBfTUVUUklDU19PTkxZICkgIT0gMCApOwotICAgICAgICAgIHR0X3NiaXRfZGVjb2Rlcl9kb25lKCBkZWNvZGVyICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9TQklUX1RBQkxFX1RZUEVfU0JJWDoKLSAgICAgIGVycm9yID0gdHRfZmFjZV9sb2FkX3NiaXhfaW1hZ2UoCi0gICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgIG1hcCwKLSAgICAgICAgICAgICAgICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICggbG9hZF9mbGFncyAmIEZUX0xPQURfQklUTUFQX01FVFJJQ1NfT05MWSApICE9IDAgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIEZsYXR0ZW4gY29sb3IgYml0bWFwcyBpZiBjb2xvciB3YXMgbm90IHJlcXVlc3RlZC4gKi8KLSAgICBpZiAoICFlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggbG9hZF9mbGFncyAmIEZUX0xPQURfQ09MT1IgKSAgICAgICAgICAgICAgICYmCi0gICAgICAgICAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9CSVRNQVBfTUVUUklDU19PTkxZICkgJiYKLSAgICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9PSBGVF9QSVhFTF9NT0RFX0JHUkEgICAgICAgICApCi0gICAgewotICAgICAgRlRfQml0bWFwICAgbmV3X21hcDsKLSAgICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBmYWNlLT5yb290LmdseXBoLT5saWJyYXJ5OwotCi0KLSAgICAgIEZUX0JpdG1hcF9Jbml0KCAmbmV3X21hcCApOwotCi0gICAgICAvKiBDb252ZXJ0IHRvIDhiaXQgZ3JheXNjYWxlLiAqLwotICAgICAgZXJyb3IgPSBGVF9CaXRtYXBfQ29udmVydCggbGlicmFyeSwgbWFwLCAmbmV3X21hcCwgMSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIEZUX0JpdG1hcF9Eb25lKCBsaWJyYXJ5LCAmbmV3X21hcCApOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBuZXdfbWFwLnBpeGVsX21vZGU7Ci0gICAgICAgIG1hcC0+cGl0Y2ggICAgICA9IG5ld19tYXAucGl0Y2g7Ci0gICAgICAgIG1hcC0+bnVtX2dyYXlzICA9IG5ld19tYXAubnVtX2dyYXlzOwotCi0gICAgICAgIGZ0X2dseXBoc2xvdF9zZXRfYml0bWFwKCBmYWNlLT5yb290LmdseXBoLCBuZXdfbWFwLmJ1ZmZlciApOwotICAgICAgICBmYWNlLT5yb290LmdseXBoLT5pbnRlcm5hbC0+ZmxhZ3MgfD0gRlRfR0xZUEhfT1dOX0JJVE1BUDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAqLwotCi0gIC8qIEFOU0kgQyBkb2Vzbid0IGxpa2UgZW1wdHkgc291cmNlIGZpbGVzICovCi0gIHR5cGVkZWYgaW50ICBfdHRfc2JpdF9kdW1teTsKLQotI2VuZGlmIC8qICFUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0c2JpdC5oIGIvc3JjL3NmbnQvdHRzYml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NTlkZGQuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRzYml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHNiaXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVFRTQklUX0hfCi0jZGVmaW5lIFRUU0JJVF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0bG9hZC5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3NiaXQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfc2JpdCggVFRfRmFjZSAgZmFjZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9zZXRfc2JpdF9zdHJpa2UoIFRUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICBhc3RyaWtlX2luZGV4ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3N0cmlrZV9tZXRyaWNzKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3NiaXRfaW1hZ2UoIFRUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICAgICptYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3NSZWMgICptZXRyaWNzICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVFRTQklUX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc21vb3RoL0phbWZpbGUgYi9zcmMvc21vb3RoL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZDA3NjkuLjAwMDAwMDAKLS0tIGEvc3JjL3Ntb290aC9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9zbW9vdGggSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHNtb290aCA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gZnRncmF5cwotICAgICAgICAgICAgICAgZnRzbW9vdGgKLSAgICAgICAgICAgICAgIGZ0c3BpYwotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gc21vb3RoIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3Ntb290aCBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvc21vb3RoL2Z0Z3JheXMuYyBiL3NyYy9zbW9vdGgvZnRncmF5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjY0NWU2Li4wMDAwMDAwCi0tLSBhL3NyYy9zbW9vdGgvZnRncmF5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdyYXlzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQSBuZXcgYHBlcmZlY3QnIGFudGktYWxpYXNpbmcgcmVuZGVyZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IHRoZSByZXN0IG9mIHRoZSBGcmVlVHlwZSBlbmdpbmUsIGJ5ICovCi0gIC8qIGRlZmluaW5nIHRoZSBTVEFOREFMT05FXyBtYWNybyB3aGVuIGNvbXBpbGluZyBpdC4gIFlvdSBhbHNvIG5lZWQgdG8gICAqLwotICAvKiBwdXQgdGhlIGZpbGVzIGBmdGdyYXlzLmgnIGFuZCBgZnRpbWFnZS5oJyBpbnRvIHRoZSBjdXJyZW50ICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgVHlwaWNhbGx5LCB5b3UgY291bGQgZG8gc29tZXRoaW5nIGxpa2UgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNvcHkgYHNyYy9zbW9vdGgvZnRncmF5cy5jJyAodGhpcyBmaWxlKSB0byB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29weSBgaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgnIGFuZCBgc3JjL3Ntb290aC9mdGdyYXlzLmgnIHRvIHRoZSAqLwotICAvKiAgIHNhbWUgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29tcGlsZSBgZnRncmF5cycgd2l0aCB0aGUgU1RBTkRBTE9ORV8gbWFjcm8gZGVmaW5lZCwgYXMgaW4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNjIC1jIC1EU1RBTkRBTE9ORV8gZnRncmF5cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgcmVuZGVyZXIgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggYSBjYWxsIHRvICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYGZ0X2dyYXlfcmFzdGVyLnJhc3Rlcl9uZXcnOyBhbiBhbnRpLWFsaWFzZWQgYml0bWFwIGNhbiBiZSBnZW5lcmF0ZWQgICovCi0gIC8qIHdpdGggYSBjYWxsIHRvIGBmdF9ncmF5X3Jhc3Rlci5yYXN0ZXJfcmVuZGVyJy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2VlIHRoZSBjb21tZW50cyBhbmQgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZmlsZSBgZnRpbWFnZS5oJyBmb3IgbW9yZSAgICovCi0gIC8qIGRldGFpbHMgb24gaG93IHRoZSByYXN0ZXIgd29ya3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIGEgbmV3IGFudGktYWxpYXNpbmcgc2Nhbi1jb252ZXJ0ZXIgZm9yIEZyZWVUeXBlIDIuICBUaGUgICAgICAgKi8KLSAgLyogYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBfdmVyeV8gZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpbiB0aGUgc3RhbmRhcmQgICovCi0gIC8qIGBmdHJhc3RlcicgbW9kdWxlLiAgQWN0dWFsbHksIGBmdGdyYXlzJyBjb21wdXRlcyB0aGUgX2V4YWN0XyAgICAgICAgICAqLwotICAvKiBjb3ZlcmFnZSBvZiB0aGUgb3V0bGluZSBvbiBlYWNoIHBpeGVsIGNlbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIGJhc2VkIG9uIGlkZWFzIHRoYXQgSSBpbml0aWFsbHkgZm91bmQgaW4gUmFwaCBMZXZpZW4ncyAgICAgICAgICAqLwotICAvKiBleGNlbGxlbnQgTGliQXJ0IGdyYXBoaWNzIGxpYnJhcnkgKHNlZSBodHRwOi8vd3d3Lmxldmllbi5jb20vbGliYXJ0ICAgKi8KLSAgLyogZm9yIG1vcmUgaW5mb3JtYXRpb24sIHRob3VnaCB0aGUgd2ViIHBhZ2VzIGRvIG5vdCB0ZWxsIGFueXRoaW5nICAgICAgICovCi0gIC8qIGFib3V0IHRoZSByZW5kZXJlcjsgeW91J2xsIGhhdmUgdG8gZGl2ZSBpbnRvIHRoZSBzb3VyY2UgY29kZSB0byAgICAgICAqLwotICAvKiB1bmRlcnN0YW5kIGhvdyBpdCB3b3JrcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhpcyBpcyBhIF92ZXJ5XyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gICAgICAgICAqLwotICAvKiBjb21wYXJlZCB0byBSYXBoJ3MuICBDb3ZlcmFnZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYSB2ZXJ5ICAgICAgICAgKi8KLSAgLyogZGlmZmVyZW50IHdheSwgYW5kIEkgZG9uJ3QgdXNlIHNvcnRlZCB2ZWN0b3IgcGF0aHMuICBBbHNvLCBpdCBkb2Vzbid0ICovCi0gIC8qIHVzZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyByZW5kZXJlciBoYXMgdGhlIGZvbGxvd2luZyBhZHZhbnRhZ2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEl0IGRvZXNuJ3QgbmVlZCBhbiBpbnRlcm1lZGlhdGUgYml0bWFwLiAgSW5zdGVhZCwgb25lIGNhbiBzdXBwbHkgYSAgKi8KLSAgLyogICBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSByZW5kZXJlciB0byBkcmF3IGdyYXkgICovCi0gIC8qICAgc3BhbnMgb24gYW55IHRhcmdldCBzdXJmYWNlLiAgWW91IGNhbiB0aHVzIGRvIGRpcmVjdCBjb21wb3NpdGlvbiBvbiAqLwotICAvKiAgIGFueSBraW5kIG9mIGJpdG1hcCwgcHJvdmlkZWQgdGhhdCB5b3UgZ2l2ZSB0aGUgcmVuZGVyZXIgdGhlIHJpZ2h0ICAgKi8KLSAgLyogICBjYWxsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEEgcGVyZmVjdCBhbnRpLWFsaWFzZXIsIGkuZS4sIGl0IGNvbXB1dGVzIHRoZSBfZXhhY3RfIGNvdmVyYWdlIG9uICAgKi8KLSAgLyogICBlYWNoIHBpeGVsIGNlbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEl0IHBlcmZvcm1zIGEgc2luZ2xlIHBhc3Mgb24gdGhlIG91dGxpbmUgKHRoZSBgc3RhbmRhcmQnIEZUMiAgICAgICAgKi8KLSAgLyogICByZW5kZXJlciBtYWtlcyB0d28gcGFzc2VzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEl0IGNhbiBlYXNpbHkgYmUgbW9kaWZpZWQgdG8gcmVuZGVyIHRvIF9hbnlfIG51bWJlciBvZiBncmF5IGxldmVscyAgKi8KLSAgLyogICBjaGVhcGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEZvciBzbWFsbCAoPCAyMCkgcGl4ZWwgc2l6ZXMsIGl0IGlzIGZhc3RlciB0aGFuIHRoZSBzdGFuZGFyZCAgICAgICAgKi8KLSAgLyogICByZW5kZXJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3Ntb290aAotCi0KLSNpZmRlZiBTVEFOREFMT05FXwotCi0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9SRU5ERVJfUE9PTF9TSVpFICAxNjM4NEwKLQotCi0gIC8qIEF1eGlsaWFyeSBtYWNyb3MgZm9yIHRva2VuIGNvbmNhdGVuYXRpb24uICovCi0jZGVmaW5lIEZUX0VSUl9YQ0FUKCB4LCB5ICkgIHggIyMgeQotI2RlZmluZSBGVF9FUlJfQ0FUKCB4LCB5ICkgICBGVF9FUlJfWENBVCggeCwgeSApCi0KLSNkZWZpbmUgRlRfQkVHSU5fU1RNTlQgIGRvIHsKLSNkZWZpbmUgRlRfRU5EX1NUTU5UICAgIH0gd2hpbGUgKCAwICkKLQotI2RlZmluZSBGVF9NSU4oIGEsIGIgKSAgKCAoYSkgPCAoYikgPyAoYSkgOiAoYikgKQotI2RlZmluZSBGVF9NQVgoIGEsIGIgKSAgKCAoYSkgPiAoYikgPyAoYSkgOiAoYikgKQotI2RlZmluZSBGVF9BQlMoIGEgKSAgICAgKCAoYSkgPCAwID8gLShhKSA6IChhKSApCi0KLQotICAvKgotICAgKiAgQXBwcm94aW1hdGUgc3FydCh4KngreSp5KSB1c2luZyB0aGUgYGFscGhhIG1heCBwbHVzIGJldGEgbWluJwotICAgKiAgYWxnb3JpdGhtLiAgV2UgdXNlIGFscGhhID0gMSwgYmV0YSA9IDMvOCwgZ2l2aW5nIHVzIHJlc3VsdHMgd2l0aCBhCi0gICAqICBsYXJnZXN0IGVycm9yIGxlc3MgdGhhbiA3JSBjb21wYXJlZCB0byB0aGUgZXhhY3QgdmFsdWUuCi0gICAqLwotI2RlZmluZSBGVF9IWVBPVCggeCwgeSApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCB4ID0gRlRfQUJTKCB4ICksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHkgPSBGVF9BQlMoIHkgKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgeCA+IHkgPyB4ICsgKCAzICogeSA+PiAzICkgICBcCi0gICAgICAgICAgICAgICAgICA6IHkgKyAoIDMgKiB4ID4+IDMgKSApCi0KLQotICAvKiBkZWZpbmUgdGhpcyB0byBkdW1wIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLwotLyogI2RlZmluZSBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNldGptcC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2RlZmluZSBGVF9DSEFSX0JJVCAgIENIQVJfQklUCi0jZGVmaW5lIEZUX1VJTlRfTUFYICAgVUlOVF9NQVgKLSNkZWZpbmUgRlRfSU5UX01BWCAgICBJTlRfTUFYCi0jZGVmaW5lIEZUX1VMT05HX01BWCAgVUxPTkdfTUFYCi0KLSNkZWZpbmUgQUREX0xPTkcoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAobG9uZykoICh1bnNpZ25lZCBsb25nKShhKSArICh1bnNpZ25lZCBsb25nKShiKSApCi0jZGVmaW5lIFNVQl9MT05HKCBhLCBiICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKGxvbmcpKCAodW5zaWduZWQgbG9uZykoYSkgLSAodW5zaWduZWQgbG9uZykoYikgKQotI2RlZmluZSBNVUxfTE9ORyggYSwgYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChsb25nKSggKHVuc2lnbmVkIGxvbmcpKGEpICogKHVuc2lnbmVkIGxvbmcpKGIpICkKLSNkZWZpbmUgTkVHX0xPTkcoIGEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAobG9uZykoIC0odW5zaWduZWQgbG9uZykoYSkgKQotCi0KLSNkZWZpbmUgZnRfbWVtc2V0ICAgbWVtc2V0Ci0KLSNkZWZpbmUgZnRfc2V0am1wICAgc2V0am1wCi0jZGVmaW5lIGZ0X2xvbmdqbXAgIGxvbmdqbXAKLSNkZWZpbmUgZnRfam1wX2J1ZiAgam1wX2J1ZgotCi10eXBlZGVmIHB0cmRpZmZfdCAgRlRfUHRyRGlzdDsKLQotCi0jZGVmaW5lIEVyclJhc3Rlcl9JbnZhbGlkX01vZGUgICAgICAtMgotI2RlZmluZSBFcnJSYXN0ZXJfSW52YWxpZF9PdXRsaW5lICAgLTEKLSNkZWZpbmUgRXJyUmFzdGVyX0ludmFsaWRfQXJndW1lbnQgIC0zCi0jZGVmaW5lIEVyclJhc3Rlcl9NZW1vcnlfT3ZlcmZsb3cgICAtNAotCi0jZGVmaW5lIEZUX0JFR0lOX0hFQURFUgotI2RlZmluZSBGVF9FTkRfSEVBREVSCi0KLSNpbmNsdWRlICJmdGltYWdlLmgiCi0jaW5jbHVkZSAiZnRncmF5cy5oIgotCi0KLSAgLyogVGhpcyBtYWNybyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdW51c2VkLiAqLwotICAvKiBJdHMgcHVycG9zZSBpcyBzaW1wbHkgdG8gcmVkdWNlIGNvbXBpbGVyIHdhcm5pbmdzLiAgTm90ZSBhbHNvIHRoYXQgICovCi0gIC8qIHNpbXBseSBkZWZpbmluZyBpdCBhcyBgKHZvaWQpeCcgZG9lc24ndCBhdm9pZCB3YXJuaW5ncyB3aXRoIGNlcnRhaW4gKi8KLSAgLyogQU5TSSBjb21waWxlcnMgKGUuZy4gTENDKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9VTlVTRUQoIHggKSAgKHgpID0gKHgpCi0KLQotICAvKiB3ZSBvbmx5IHVzZSBsZXZlbCA1ICYgNyB0cmFjaW5nIG1lc3NhZ2VzOyBjZi4gZnRkZWJ1Zy5oICovCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gIHZvaWQKLSAgRlRfTWVzc2FnZSggY29uc3QgY2hhciogIGZtdCwKLSAgICAgICAgICAgICAgLi4uICkKLSAgewotICAgIHZhX2xpc3QgIGFwOwotCi0KLSAgICB2YV9zdGFydCggYXAsIGZtdCApOwotICAgIHZmcHJpbnRmKCBzdGRlcnIsIGZtdCwgYXAgKTsKLSAgICB2YV9lbmQoIGFwICk7Ci0gIH0KLQotCi0gIC8qIGVtcHR5IGZ1bmN0aW9uIHVzZWZ1bCBmb3Igc2V0dGluZyBhIGJyZWFrcG9pbnQgdG8gY2F0Y2ggZXJyb3JzICovCi0gIGludAotICBGVF9UaHJvdyggaW50ICAgICAgICAgIGVycm9yLAotICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0gICAgRlRfVU5VU0VEKCBsaW5lICk7Ci0gICAgRlRfVU5VU0VEKCBmaWxlICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogd2UgZG9uJ3QgaGFuZGxlIHRyYWNpbmcgbGV2ZWxzIGluIHN0YW5kLWFsb25lIG1vZGU7ICovCi0jaWZuZGVmIEZUX1RSQUNFNQotI2RlZmluZSBGVF9UUkFDRTUoIHZhcmZvcm1hdCApICBGVF9NZXNzYWdlIHZhcmZvcm1hdAotI2VuZGlmCi0jaWZuZGVmIEZUX1RSQUNFNwotI2RlZmluZSBGVF9UUkFDRTcoIHZhcmZvcm1hdCApICBGVF9NZXNzYWdlIHZhcmZvcm1hdAotI2VuZGlmCi0jaWZuZGVmIEZUX0VSUk9SCi0jZGVmaW5lIEZUX0VSUk9SKCB2YXJmb3JtYXQgKSAgIEZUX01lc3NhZ2UgdmFyZm9ybWF0Ci0jZW5kaWYKLQotI2RlZmluZSBGVF9USFJPVyggZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEZUX1Rocm93KCBGVF9FUlJfQ0FUKCBFcnJSYXN0ZXIsIGUgKSwgICBcCi0gICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fICkgICAgICAgICAgICAgICAgICB8IFwKLSAgICAgICAgICAgIEZUX0VSUl9DQVQoIEVyclJhc3RlciwgZSApICAgICAgICAgICAgKQotCi0jZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotI2RlZmluZSBGVF9UUkFDRTUoIHggKSAgZG8geyB9IHdoaWxlICggMCApICAgICAvKiBub3RoaW5nICovCi0jZGVmaW5lIEZUX1RSQUNFNyggeCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgIC8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgRlRfRVJST1IoIHggKSAgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAgLyogbm90aGluZyAqLwotI2RlZmluZSBGVF9USFJPVyggZSApICAgRlRfRVJSX0NBVCggRXJyUmFzdGVyXywgZSApCi0KLQotI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSNkZWZpbmUgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoIGNsYXNzXywgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlX3RvXywgbGluZV90b18sICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uaWNfdG9fLCBjdWJpY190b18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0XywgZGVsdGFfICkgICAgICBcCi0gICAgICAgICAgc3RhdGljIGNvbnN0IEZUX091dGxpbmVfRnVuY3MgY2xhc3NfID0gICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vdmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBsaW5lX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29uaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGN1YmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBzaGlmdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZGVsdGFfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1JBU1RFUl9GVU5DUyggY2xhc3NfLCBnbHlwaF9mb3JtYXRfLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyX25ld18sIHJhc3Rlcl9yZXNldF8sICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyX3NldF9tb2RlXywgcmFzdGVyX3JlbmRlcl8sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyX2RvbmVfICkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb25zdCBGVF9SYXN0ZXJfRnVuY3MgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJhc3Rlcl9uZXdfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJhc3Rlcl9yZXNldF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJhc3Rlcl9zZXRfbW9kZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJhc3Rlcl9yZW5kZXJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJhc3Rlcl9kb25lXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIH07Ci0KLQotI2Vsc2UgLyogIVNUQU5EQUxPTkVfICovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiZnRncmF5cy5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotCi0jaW5jbHVkZSAiZnRzbWVycnMuaCIKLQotI2luY2x1ZGUgImZ0c3BpYy5oIgotCi0jZGVmaW5lIFNtb290aF9FcnJfSW52YWxpZF9Nb2RlICAgICBTbW9vdGhfRXJyX0Nhbm5vdF9SZW5kZXJfR2x5cGgKLSNkZWZpbmUgU21vb3RoX0Vycl9NZW1vcnlfT3ZlcmZsb3cgIFNtb290aF9FcnJfT3V0X09mX01lbW9yeQotI2RlZmluZSBFcnJSYXN0ZXJfTWVtb3J5X092ZXJmbG93ICAgU21vb3RoX0Vycl9PdXRfT2ZfTWVtb3J5Ci0KLQotI2VuZGlmIC8qICFTVEFOREFMT05FXyAqLwotCi0KLSNpZm5kZWYgRlRfTUVNX1NFVAotI2RlZmluZSBGVF9NRU1fU0VUKCBkLCBzLCBjICkgIGZ0X21lbXNldCggZCwgcywgYyApCi0jZW5kaWYKLQotI2lmbmRlZiBGVF9NRU1fWkVSTwotI2RlZmluZSBGVF9NRU1fWkVSTyggZGVzdCwgY291bnQgKSAgRlRfTUVNX1NFVCggZGVzdCwgMCwgY291bnQgKQotI2VuZGlmCi0KLSNpZm5kZWYgRlRfWkVSTwotI2RlZmluZSBGVF9aRVJPKCBwICkgIEZUX01FTV9aRVJPKCBwLCBzaXplb2YgKCAqKHApICkgKQotI2VuZGlmCi0KLSAgLyogYXMgdXN1YWwsIGZvciB0aGUgc3BlZWQgaHVuZ3J5IDotKSAqLwotCi0jdW5kZWYgUkFTX0FSRwotI3VuZGVmIFJBU19BUkdfCi0jdW5kZWYgUkFTX1ZBUgotI3VuZGVmIFJBU19WQVJfCi0KLSNpZm5kZWYgRlRfU1RBVElDX1JBU1RFUgotCi0jZGVmaW5lIFJBU19BUkcgICBncmF5X1BXb3JrZXIgIHdvcmtlcgotI2RlZmluZSBSQVNfQVJHXyAgZ3JheV9QV29ya2VyICB3b3JrZXIsCi0KLSNkZWZpbmUgUkFTX1ZBUiAgIHdvcmtlcgotI2RlZmluZSBSQVNfVkFSXyAgd29ya2VyLAotCi0jZWxzZSAvKiBGVF9TVEFUSUNfUkFTVEVSICovCi0KLSNkZWZpbmUgUkFTX0FSRyAgIHZvaWQKLSNkZWZpbmUgUkFTX0FSR18gIC8qIGVtcHR5ICovCi0jZGVmaW5lIFJBU19WQVIgICAvKiBlbXB0eSAqLwotI2RlZmluZSBSQVNfVkFSXyAgLyogZW1wdHkgKi8KLQotI2VuZGlmIC8qIEZUX1NUQVRJQ19SQVNURVIgKi8KLQotCi0gIC8qIG11c3QgYmUgYXQgbGVhc3QgNiBiaXRzISAqLwotI2RlZmluZSBQSVhFTF9CSVRTICA4Ci0KLSN1bmRlZiBGTE9PUgotI3VuZGVmIENFSUxJTkcKLSN1bmRlZiBUUlVOQwotI3VuZGVmIFNDQUxFRAotCi0jZGVmaW5lIE9ORV9QSVhFTCAgICAgICAoIDEgPDwgUElYRUxfQklUUyApCi0jZGVmaW5lIFRSVU5DKCB4ICkgICAgICAoIChUQ29vcmQpKCAoeCkgPj4gUElYRUxfQklUUyApICkKLSNkZWZpbmUgU1VCUElYRUxTKCB4ICkgICggKFRQb3MpKHgpICogT05FX1BJWEVMICkKLSNkZWZpbmUgRkxPT1IoIHggKSAgICAgICggKHgpICYgLU9ORV9QSVhFTCApCi0jZGVmaW5lIENFSUxJTkcoIHggKSAgICAoICggKHgpICsgT05FX1BJWEVMIC0gMSApICYgLU9ORV9QSVhFTCApCi0jZGVmaW5lIFJPVU5EKCB4ICkgICAgICAoICggKHgpICsgT05FX1BJWEVMIC8gMiApICYgLU9ORV9QSVhFTCApCi0KLSNpZiBQSVhFTF9CSVRTID49IDYKLSNkZWZpbmUgVVBTQ0FMRSggeCApICAgICggKHgpICogKCBPTkVfUElYRUwgPj4gNiApICkKLSNkZWZpbmUgRE9XTlNDQUxFKCB4ICkgICggKHgpID4+ICggUElYRUxfQklUUyAtIDYgKSApCi0jZWxzZQotI2RlZmluZSBVUFNDQUxFKCB4ICkgICAgKCAoeCkgPj4gKCA2IC0gUElYRUxfQklUUyApICkKLSNkZWZpbmUgRE9XTlNDQUxFKCB4ICkgICggKHgpICogKCA2NCA+PiBQSVhFTF9CSVRTICkgKQotI2VuZGlmCi0KLQotICAvKiBDb21wdXRlIGBkaXZpZGVuZCAvIGRpdmlzb3InIGFuZCByZXR1cm4gYm90aCBpdHMgcXVvdGllbnQgYW5kICAgICAqLwotICAvKiByZW1haW5kZXIsIGNhc3QgdG8gYSBzcGVjaWZpYyB0eXBlLiAgVGhpcyBtYWNybyBhbHNvIGVuc3VyZXMgdGhhdCAqLwotICAvKiB0aGUgcmVtYWluZGVyIGlzIGFsd2F5cyBwb3NpdGl2ZS4gIFdlIHVzZSB0aGUgcmVtYWluZGVyIHRvIGtlZXAgICAqLwotICAvKiB0cmFjayBvZiBhY2N1bXVsYXRpbmcgZXJyb3JzIGFuZCBjb21wZW5zYXRlIGZvciB0aGVtLiAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9ESVZfTU9EKCB0eXBlLCBkaXZpZGVuZCwgZGl2aXNvciwgcXVvdGllbnQsIHJlbWFpbmRlciApIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHF1b3RpZW50KSAgPSAodHlwZSkoIChkaXZpZGVuZCkgLyAoZGl2aXNvcikgKTsgICAgICAgICAgICAgICAgXAotICAgIChyZW1haW5kZXIpID0gKHR5cGUpKCAoZGl2aWRlbmQpICUgKGRpdmlzb3IpICk7ICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIChyZW1haW5kZXIpIDwgMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHF1b3RpZW50KS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChyZW1haW5kZXIpICs9ICh0eXBlKShkaXZpc29yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2lmZGVmICBfX2FybV9fCi0gIC8qIFdvcmsgYXJvdW5kIGEgYnVnIHNwZWNpZmljIHRvIEdDQyB3aGljaCBtYWtlIHRoZSBjb21waWxlciBmYWlsIHRvICovCi0gIC8qIG9wdGltaXplIGEgZGl2aXNpb24gYW5kIG1vZHVsbyBvcGVyYXRpb24gb24gdGhlIHNhbWUgcGFyYW1ldGVycyAgICovCi0gIC8qIGludG8gYSBzaW5nbGUgY2FsbCB0byBgX19hZWFiaV9pZGl2bW9kJy4gIFNlZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQzNzIxICAgICAgICAgICAgICAgICovCi0jdW5kZWYgRlRfRElWX01PRAotI2RlZmluZSBGVF9ESVZfTU9EKCB0eXBlLCBkaXZpZGVuZCwgZGl2aXNvciwgcXVvdGllbnQsIHJlbWFpbmRlciApIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHF1b3RpZW50KSAgPSAodHlwZSkoIChkaXZpZGVuZCkgLyAoZGl2aXNvcikgKTsgICAgICAgICAgICAgICAgXAotICAgIChyZW1haW5kZXIpID0gKHR5cGUpKCAoZGl2aWRlbmQpIC0gKHF1b3RpZW50KSAqIChkaXZpc29yKSApOyAgIFwKLSAgICBpZiAoIChyZW1haW5kZXIpIDwgMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHF1b3RpZW50KS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChyZW1haW5kZXIpICs9ICh0eXBlKShkaXZpc29yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLSNlbmRpZiAvKiBfX2FybV9fICovCi0KLQotICAvKiBUaGVzZSBtYWNyb3Mgc3BlZWQgdXAgcmVwZXRpdGl2ZSBkaXZpc2lvbnMgYnkgcmVwbGFjaW5nIHRoZW0gKi8KLSAgLyogd2l0aCBtdWx0aXBsaWNhdGlvbnMgYW5kIHJpZ2h0IHNoaWZ0cy4gICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VESVZQUkVQKCBjLCBiICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBsb25nICBiICMjIF9yID0gYyA/IChsb25nKSggRlRfVUxPTkdfTUFYID4+IFBJWEVMX0JJVFMgKSAvICggYiApIFwKLSAgICAgICAgICAgICAgICAgICAgOiAwCi0jZGVmaW5lIEZUX1VESVYoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICggKCAodW5zaWduZWQgbG9uZykoIGEgKSAqICh1bnNpZ25lZCBsb25nKSggYiAjIyBfciApICkgPj4gICBcCi0gICAgKCBzaXplb2YoIGxvbmcgKSAqIEZUX0NIQVJfQklUIC0gUElYRUxfQklUUyApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIGRvbid0IGNoYW5nZSB0aGUgZm9sbG93aW5nIHR5cGVzIHRvIEZUX0ludCBvciBGVF9Qb3MsIHNpbmNlIHdlIG1pZ2h0ICovCi0gIC8qIG5lZWQgdG8gZGVmaW5lIHRoZW0gdG8gImZsb2F0IiBvciAiZG91YmxlIiB3aGVuIGV4cGVyaW1lbnRpbmcgd2l0aCAgICovCi0gIC8qIG5ldyBhbGdvcml0aG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgdHlwZWRlZiBsb25nICBUUG9zOyAgICAgLyogc3ViLXBpeGVsIGNvb3JkaW5hdGUgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50ICAgVENvb3JkOyAgIC8qIGludGVnZXIgc2NhbmxpbmUvcGl4ZWwgY29vcmRpbmF0ZSAqLwotICB0eXBlZGVmIGludCAgIFRBcmVhOyAgICAvKiBjZWxsIGFyZWFzLCBjb29yZGluYXRlIHByb2R1Y3RzICAgKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0IFRDZWxsXyogIFBDZWxsOwotCi0gIHR5cGVkZWYgc3RydWN0ICBUQ2VsbF8KLSAgewotICAgIFRDb29yZCAgeDsgICAgIC8qIHNhbWUgd2l0aCBncmF5X1RXb3JrZXIuZXggICAgKi8KLSAgICBUQ29vcmQgIGNvdmVyOyAvKiBzYW1lIHdpdGggZ3JheV9UV29ya2VyLmNvdmVyICovCi0gICAgVEFyZWEgICBhcmVhOwotICAgIFBDZWxsICAgbmV4dDsKLQotICB9IFRDZWxsOwotCi0gIHR5cGVkZWYgc3RydWN0IFRQaXhtYXBfCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyKiAgb3JpZ2luOyAgLyogcGl4bWFwIG9yaWdpbiBhdCB0aGUgYm90dG9tLWxlZnQgKi8KLSAgICBpbnQgICAgICAgICAgICAgcGl0Y2g7ICAgLyogcGl0Y2ggdG8gZ28gZG93biBvbmUgcm93ICovCi0KLSAgfSBUUGl4bWFwOwotCi0gIC8qIG1heGltdW0gbnVtYmVyIG9mIGdyYXkgY2VsbHMgaW4gdGhlIGJ1ZmZlciAqLwotI2lmIEZUX1JFTkRFUl9QT09MX1NJWkUgPiAyMDQ4Ci0jZGVmaW5lIEZUX01BWF9HUkFZX1BPT0wgICggRlRfUkVOREVSX1BPT0xfU0laRSAvIHNpemVvZiAoIFRDZWxsICkgKQotI2Vsc2UKLSNkZWZpbmUgRlRfTUFYX0dSQVlfUE9PTCAgKCAyMDQ4IC8gc2l6ZW9mICggVENlbGwgKSApCi0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZCggX01TQ19WRVIgKSAgICAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0gIC8qIFdlIGRpc2FibGUgdGhlIHdhcm5pbmcgYHN0cnVjdHVyZSB3YXMgcGFkZGVkIGR1ZSB0byAgICovCi0gIC8qIF9fZGVjbHNwZWMoYWxpZ24oKSknIGluIG9yZGVyIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoICovCi0gIC8qIHRoZSBtYXhpbXVtIGxldmVsIG9mIHdhcm5pbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0jcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQotI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDMyNCApCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgZ3JheV9UV29ya2VyXwotICB7Ci0gICAgZnRfam1wX2J1ZiAganVtcF9idWZmZXI7Ci0KLSAgICBUQ29vcmQgIGV4LCBleTsKLSAgICBUQ29vcmQgIG1pbl9leCwgbWF4X2V4OwotICAgIFRDb29yZCAgbWluX2V5LCBtYXhfZXk7Ci0KLSAgICBUQXJlYSAgIGFyZWE7Ci0gICAgVENvb3JkICBjb3ZlcjsKLSAgICBpbnQgICAgIGludmFsaWQ7Ci0KLSAgICBQQ2VsbCogICAgICB5Y2VsbHM7Ci0gICAgUENlbGwgICAgICAgY2VsbHM7Ci0gICAgRlRfUHRyRGlzdCAgbWF4X2NlbGxzOwotICAgIEZUX1B0ckRpc3QgIG51bV9jZWxsczsKLQotICAgIFRQb3MgICAgeCwgIHk7Ci0KLSAgICBGVF9PdXRsaW5lICBvdXRsaW5lOwotICAgIFRQaXhtYXAgICAgIHRhcmdldDsKLQotICAgIEZUX1Jhc3Rlcl9TcGFuX0Z1bmMgIHJlbmRlcl9zcGFuOwotICAgIHZvaWQqICAgICAgICAgICAgICAgIHJlbmRlcl9zcGFuX2RhdGE7Ci0KLSAgfSBncmF5X1RXb3JrZXIsICpncmF5X1BXb3JrZXI7Ci0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApCi0jcHJhZ21hIHdhcm5pbmcoIHBvcCApCi0jZW5kaWYKLQotCi0jaWZuZGVmIEZUX1NUQVRJQ19SQVNURVIKLSNkZWZpbmUgcmFzICAoKndvcmtlcikKLSNlbHNlCi0gIHN0YXRpYyBncmF5X1RXb3JrZXIgIHJhczsKLSNlbmRpZgotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgZ3JheV9UUmFzdGVyXwotICB7Ci0gICAgdm9pZCogICAgICAgICBtZW1vcnk7Ci0KLSAgfSBncmF5X1RSYXN0ZXIsICpncmF5X1BSYXN0ZXI7Ci0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSAgLyogdG8gYmUgY2FsbGVkIHdoaWxlIGluIHRoZSBkZWJ1Z2dlciAtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogdGhpcyBmdW5jdGlvbiBjYXVzZXMgYSBjb21waWxlciB3YXJuaW5nIHNpbmNlIGl0IGlzIHVudXNlZCBvdGhlcndpc2UgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9kdW1wX2NlbGxzKCBSQVNfQVJHICkKLSAgewotICAgIGludCAgeTsKLQotCi0gICAgZm9yICggeSA9IHJhcy5taW5fZXk7IHkgPCByYXMubWF4X2V5OyB5KysgKQotICAgIHsKLSAgICAgIFBDZWxsICBjZWxsID0gcmFzLnljZWxsc1t5IC0gcmFzLm1pbl9leV07Ci0KLQotICAgICAgcHJpbnRmKCAiJTNkOiIsIHkgKTsKLQotICAgICAgZm9yICggOyBjZWxsICE9IE5VTEw7IGNlbGwgPSBjZWxsLT5uZXh0ICkKLSAgICAgICAgcHJpbnRmKCAiICglM2QsIGM6JTRkLCBhOiU2ZCkiLAotICAgICAgICAgICAgICAgIGNlbGwtPngsIGNlbGwtPmNvdmVyLCBjZWxsLT5hcmVhICk7Ci0gICAgICBwcmludGYoICJcbiIgKTsKLSAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJlY29yZCB0aGUgY3VycmVudCBjZWxsIGluIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9yZWNvcmRfY2VsbCggUkFTX0FSRyApCi0gIHsKLSAgICBQQ2VsbCAgKnBjZWxsLCBjZWxsOwotICAgIFRDb29yZCAgeCA9IHJhcy5leDsKLQotCi0gICAgcGNlbGwgPSAmcmFzLnljZWxsc1tyYXMuZXkgLSByYXMubWluX2V5XTsKLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGNlbGwgPSAqcGNlbGw7Ci0gICAgICBpZiAoICFjZWxsIHx8IGNlbGwtPnggPiB4ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggY2VsbC0+eCA9PSB4ICkKLSAgICAgICAgZ290byBGb3VuZDsKLQotICAgICAgcGNlbGwgPSAmY2VsbC0+bmV4dDsKLSAgICB9Ci0KLSAgICBpZiAoIHJhcy5udW1fY2VsbHMgPj0gcmFzLm1heF9jZWxscyApCi0gICAgICBmdF9sb25nam1wKCByYXMuanVtcF9idWZmZXIsIDEgKTsKLQotICAgIC8qIGluc2VydCBuZXcgY2VsbCAqLwotICAgIGNlbGwgICAgICAgID0gcmFzLmNlbGxzICsgcmFzLm51bV9jZWxscysrOwotICAgIGNlbGwtPnggICAgID0geDsKLSAgICBjZWxsLT5hcmVhICA9IHJhcy5hcmVhOwotICAgIGNlbGwtPmNvdmVyID0gcmFzLmNvdmVyOwotCi0gICAgY2VsbC0+bmV4dCAgPSAqcGNlbGw7Ci0gICAgKnBjZWxsICAgICAgPSBjZWxsOwotCi0gICAgcmV0dXJuOwotCi0gIEZvdW5kOgotICAgIC8qIHVwZGF0ZSBvbGQgY2VsbCAqLwotICAgIGNlbGwtPmFyZWEgICs9IHJhcy5hcmVhOwotICAgIGNlbGwtPmNvdmVyICs9IHJhcy5jb3ZlcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZXQgdGhlIGN1cnJlbnQgY2VsbCB0byBhIG5ldyBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfc2V0X2NlbGwoIFJBU19BUkdfIFRDb29yZCAgZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRDb29yZCAgZXkgKQotICB7Ci0gICAgLyogTW92ZSB0aGUgY2VsbCBwb2ludGVyIHRvIGEgbmV3IHBvc2l0aW9uLiAgV2Ugc2V0IHRoZSBgaW52YWxpZCcgICAgICAqLwotICAgIC8qIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY2VsbCBpc24ndCBwYXJ0IG9mIHRob3NlIHdlJ3JlIGludGVyZXN0ZWQgKi8KLSAgICAvKiBpbiBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gIFRoaXMgbWVhbnMgdGhhdDogICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIC4gdGhlIG5ldyB2ZXJ0aWNhbCBwb3NpdGlvbiBtdXN0IGJlIHdpdGhpbiBtaW5fZXkuLm1heF9leS0xLiAgICAgICAgKi8KLSAgICAvKiAuIHRoZSBuZXcgaG9yaXpvbnRhbCBwb3NpdGlvbiBtdXN0IGJlIHN0cmljdGx5IGxlc3MgdGhhbiBtYXhfZXggICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE5vdGUgdGhhdCBpZiBhIGNlbGwgaXMgdG8gdGhlIGxlZnQgb2YgdGhlIGNsaXBwaW5nIHJlZ2lvbiwgaXQgaXMgICAgKi8KLSAgICAvKiBhY3R1YWxseSBzZXQgdG8gdGhlIChtaW5fZXgtMSkgaG9yaXpvbnRhbCBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICovCi0KLSAgICBpZiAoIGV4IDwgcmFzLm1pbl9leCApCi0gICAgICBleCA9IHJhcy5taW5fZXggLSAxOwotCi0gICAgLyogcmVjb3JkIHRoZSBjdXJyZW50IG9uZSBpZiBpdCBpcyB2YWxpZCAqLwotICAgIGlmICggIXJhcy5pbnZhbGlkICkKLSAgICAgIGdyYXlfcmVjb3JkX2NlbGwoIFJBU19WQVIgKTsKLQotICAgIHJhcy5hcmVhICA9IDA7Ci0gICAgcmFzLmNvdmVyID0gMDsKLSAgICByYXMuZXggICAgPSBleDsKLSAgICByYXMuZXkgICAgPSBleTsKLQotICAgIHJhcy5pbnZhbGlkID0gKCBleSA+PSByYXMubWF4X2V5IHx8IGV5IDwgcmFzLm1pbl9leSB8fAotICAgICAgICAgICAgICAgICAgICBleCA+PSByYXMubWF4X2V4ICk7Ci0gIH0KLQotCi0jaWZuZGVmIEZUX0xPTkc2NAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmVuZGVyIGEgc2NhbmxpbmUgYXMgb25lIG9yIG1vcmUgY2VsbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBncmF5X3JlbmRlcl9zY2FubGluZSggUkFTX0FSR18gVENvb3JkICBleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDb29yZCAgeTIgKQotICB7Ci0gICAgVENvb3JkICBleDEsIGV4MiwgZngxLCBmeDIsIGZpcnN0LCBkeSwgZGVsdGEsIG1vZDsKLSAgICBUUG9zICAgIHAsIGR4OwotICAgIGludCAgICAgaW5jcjsKLQotCi0gICAgZXgxID0gVFJVTkMoIHgxICk7Ci0gICAgZXgyID0gVFJVTkMoIHgyICk7Ci0KLSAgICAvKiB0cml2aWFsIGNhc2UuICBIYXBwZW5zIG9mdGVuICovCi0gICAgaWYgKCB5MSA9PSB5MiApCi0gICAgewotICAgICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gZXgyLCBleSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZ4MSAgID0gKFRDb29yZCkoIHgxIC0gU1VCUElYRUxTKCBleDEgKSApOwotICAgIGZ4MiAgID0gKFRDb29yZCkoIHgyIC0gU1VCUElYRUxTKCBleDIgKSApOwotCi0gICAgLyogZXZlcnl0aGluZyBpcyBsb2NhdGVkIGluIGEgc2luZ2xlIGNlbGwuICBUaGF0IGlzIGVhc3khICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBleDEgPT0gZXgyICkKLSAgICAgIGdvdG8gRW5kOwotCi0gICAgLyogb2ssIHdlJ2xsIGhhdmUgdG8gcmVuZGVyIGEgcnVuIG9mIGFkamFjZW50IGNlbGxzIG9uIHRoZSBzYW1lICovCi0gICAgLyogc2NhbmxpbmUuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZHggPSB4MiAtIHgxOwotICAgIGR5ID0geTIgLSB5MTsKLQotICAgIGlmICggZHggPiAwICkKLSAgICB7Ci0gICAgICBwICAgICA9ICggT05FX1BJWEVMIC0gZngxICkgKiBkeTsKLSAgICAgIGZpcnN0ID0gT05FX1BJWEVMOwotICAgICAgaW5jciAgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcCAgICAgPSBmeDEgKiBkeTsKLSAgICAgIGZpcnN0ID0gMDsKLSAgICAgIGluY3IgID0gLTE7Ci0gICAgICBkeCAgICA9IC1keDsKLSAgICB9Ci0KLSAgICBGVF9ESVZfTU9EKCBUQ29vcmQsIHAsIGR4LCBkZWx0YSwgbW9kICk7Ci0KLSAgICByYXMuYXJlYSAgKz0gKFRBcmVhKSggKCBmeDEgKyBmaXJzdCApICogZGVsdGEgKTsKLSAgICByYXMuY292ZXIgKz0gZGVsdGE7Ci0gICAgeTEgICAgICAgICs9IGRlbHRhOwotICAgIGV4MSAgICAgICArPSBpbmNyOwotICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4MSwgZXkgKTsKLQotICAgIGlmICggZXgxICE9IGV4MiApCi0gICAgewotICAgICAgVENvb3JkICBsaWZ0LCByZW07Ci0KLQotICAgICAgcCA9IE9ORV9QSVhFTCAqIGR5OwotICAgICAgRlRfRElWX01PRCggVENvb3JkLCBwLCBkeCwgbGlmdCwgcmVtICk7Ci0KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIGRlbHRhID0gbGlmdDsKLSAgICAgICAgbW9kICArPSByZW07Ci0gICAgICAgIGlmICggbW9kID49IChUQ29vcmQpZHggKQotICAgICAgICB7Ci0gICAgICAgICAgbW9kIC09IChUQ29vcmQpZHg7Ci0gICAgICAgICAgZGVsdGErKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJhcy5hcmVhICArPSAoVEFyZWEpKCBPTkVfUElYRUwgKiBkZWx0YSApOwotICAgICAgICByYXMuY292ZXIgKz0gZGVsdGE7Ci0gICAgICAgIHkxICAgICAgICArPSBkZWx0YTsKLSAgICAgICAgZXgxICAgICAgICs9IGluY3I7Ci0gICAgICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4MSwgZXkgKTsKLSAgICAgIH0gd2hpbGUgKCBleDEgIT0gZXgyICk7Ci0gICAgfQotCi0gICAgZngxID0gT05FX1BJWEVMIC0gZmlyc3Q7Ci0KLSAgRW5kOgotICAgIGR5ID0geTIgLSB5MTsKLQotICAgIHJhcy5hcmVhICArPSAoVEFyZWEpKCAoIGZ4MSArIGZ4MiApICogZHkgKTsKLSAgICByYXMuY292ZXIgKz0gZHk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmVuZGVyIGEgZ2l2ZW4gbGluZSBhcyBhIHNlcmllcyBvZiBzY2FubGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBncmF5X3JlbmRlcl9saW5lKCBSQVNfQVJHXyBUUG9zICB0b194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUG9zICB0b195ICkKLSAgewotICAgIFRDb29yZCAgZXkxLCBleTIsIGZ5MSwgZnkyLCBmaXJzdCwgZGVsdGEsIG1vZDsKLSAgICBUUG9zICAgIHAsIGR4LCBkeSwgeCwgeDI7Ci0gICAgaW50ICAgICBpbmNyOwotCi0KLSAgICBleTEgPSBUUlVOQyggcmFzLnkgKTsKLSAgICBleTIgPSBUUlVOQyggdG9feSApOyAgICAgLyogaWYgKGV5MiA+PSByYXMubWF4X2V5KSBleTIgPSByYXMubWF4X2V5LTE7ICovCi0KLSAgICAvKiBwZXJmb3JtIHZlcnRpY2FsIGNsaXBwaW5nICovCi0gICAgaWYgKCAoIGV5MSA+PSByYXMubWF4X2V5ICYmIGV5MiA+PSByYXMubWF4X2V5ICkgfHwKLSAgICAgICAgICggZXkxIDwgIHJhcy5taW5fZXkgJiYgZXkyIDwgIHJhcy5taW5fZXkgKSApCi0gICAgICBnb3RvIEVuZDsKLQotICAgIGZ5MSA9IChUQ29vcmQpKCByYXMueSAtIFNVQlBJWEVMUyggZXkxICkgKTsKLSAgICBmeTIgPSAoVENvb3JkKSggdG9feSAtIFNVQlBJWEVMUyggZXkyICkgKTsKLQotICAgIC8qIGV2ZXJ5dGhpbmcgaXMgb24gYSBzaW5nbGUgc2NhbmxpbmUgKi8KLSAgICBpZiAoIGV5MSA9PSBleTIgKQotICAgIHsKLSAgICAgIGdyYXlfcmVuZGVyX3NjYW5saW5lKCBSQVNfVkFSXyBleTEsIHJhcy54LCBmeTEsIHRvX3gsIGZ5MiApOwotICAgICAgZ290byBFbmQ7Ci0gICAgfQotCi0gICAgZHggPSB0b194IC0gcmFzLng7Ci0gICAgZHkgPSB0b195IC0gcmFzLnk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBsaW5lIC0gYXZvaWQgY2FsbGluZyBncmF5X3JlbmRlcl9zY2FubGluZSAqLwotICAgIGlmICggZHggPT0gMCApCi0gICAgewotICAgICAgVENvb3JkICBleCAgICAgPSBUUlVOQyggcmFzLnggKTsKLSAgICAgIFRDb29yZCAgdHdvX2Z4ID0gKFRDb29yZCkoICggcmFzLnggLSBTVUJQSVhFTFMoIGV4ICkgKSA8PCAxICk7Ci0gICAgICBUQXJlYSAgIGFyZWE7Ci0KLQotICAgICAgaWYgKCBkeSA+IDApCi0gICAgICB7Ci0gICAgICAgIGZpcnN0ID0gT05FX1BJWEVMOwotICAgICAgICBpbmNyICA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0ID0gMDsKLSAgICAgICAgaW5jciAgPSAtMTsKLSAgICAgIH0KLQotICAgICAgZGVsdGEgICAgICA9IGZpcnN0IC0gZnkxOwotICAgICAgcmFzLmFyZWEgICs9IChUQXJlYSl0d29fZnggKiBkZWx0YTsKLSAgICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLSAgICAgIGV5MSAgICAgICArPSBpbmNyOwotCi0gICAgICBncmF5X3NldF9jZWxsKCBSQVNfVkFSXyBleCwgZXkxICk7Ci0KLSAgICAgIGRlbHRhID0gZmlyc3QgKyBmaXJzdCAtIE9ORV9QSVhFTDsKLSAgICAgIGFyZWEgID0gKFRBcmVhKXR3b19meCAqIGRlbHRhOwotICAgICAgd2hpbGUgKCBleTEgIT0gZXkyICkKLSAgICAgIHsKLSAgICAgICAgcmFzLmFyZWEgICs9IGFyZWE7Ci0gICAgICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLSAgICAgICAgZXkxICAgICAgICs9IGluY3I7Ci0KLSAgICAgICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gZXgsIGV5MSApOwotICAgICAgfQotCi0gICAgICBkZWx0YSAgICAgID0gZnkyIC0gT05FX1BJWEVMICsgZmlyc3Q7Ci0gICAgICByYXMuYXJlYSAgKz0gKFRBcmVhKXR3b19meCAqIGRlbHRhOwotICAgICAgcmFzLmNvdmVyICs9IGRlbHRhOwotCi0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0KLSAgICAvKiBvaywgd2UgaGF2ZSB0byByZW5kZXIgc2V2ZXJhbCBzY2FubGluZXMgKi8KLSAgICBpZiAoIGR5ID4gMCkKLSAgICB7Ci0gICAgICBwICAgICA9ICggT05FX1BJWEVMIC0gZnkxICkgKiBkeDsKLSAgICAgIGZpcnN0ID0gT05FX1BJWEVMOwotICAgICAgaW5jciAgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcCAgICAgPSBmeTEgKiBkeDsKLSAgICAgIGZpcnN0ID0gMDsKLSAgICAgIGluY3IgID0gLTE7Ci0gICAgICBkeSAgICA9IC1keTsKLSAgICB9Ci0KLSAgICBGVF9ESVZfTU9EKCBUQ29vcmQsIHAsIGR5LCBkZWx0YSwgbW9kICk7Ci0KLSAgICB4ID0gcmFzLnggKyBkZWx0YTsKLSAgICBncmF5X3JlbmRlcl9zY2FubGluZSggUkFTX1ZBUl8gZXkxLCByYXMueCwgZnkxLCB4LCBmaXJzdCApOwotCi0gICAgZXkxICs9IGluY3I7Ci0gICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gVFJVTkMoIHggKSwgZXkxICk7Ci0KLSAgICBpZiAoIGV5MSAhPSBleTIgKQotICAgIHsKLSAgICAgIFRDb29yZCAgbGlmdCwgcmVtOwotCi0KLSAgICAgIHAgICAgPSBPTkVfUElYRUwgKiBkeDsKLSAgICAgIEZUX0RJVl9NT0QoIFRDb29yZCwgcCwgZHksIGxpZnQsIHJlbSApOwotCi0gICAgICBkbwotICAgICAgewotICAgICAgICBkZWx0YSA9IGxpZnQ7Ci0gICAgICAgIG1vZCAgKz0gcmVtOwotICAgICAgICBpZiAoIG1vZCA+PSAoVENvb3JkKWR5ICkKLSAgICAgICAgewotICAgICAgICAgIG1vZCAtPSAoVENvb3JkKWR5OwotICAgICAgICAgIGRlbHRhKys7Ci0gICAgICAgIH0KLQotICAgICAgICB4MiA9IHggKyBkZWx0YTsKLSAgICAgICAgZ3JheV9yZW5kZXJfc2NhbmxpbmUoIFJBU19WQVJfIGV5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE9ORV9QSVhFTCAtIGZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDIsIGZpcnN0ICk7Ci0gICAgICAgIHggPSB4MjsKLQotICAgICAgICBleTEgKz0gaW5jcjsKLSAgICAgICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gVFJVTkMoIHggKSwgZXkxICk7Ci0gICAgICB9IHdoaWxlICggZXkxICE9IGV5MiApOwotICAgIH0KLQotICAgIGdyYXlfcmVuZGVyX3NjYW5saW5lKCBSQVNfVkFSXyBleTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE9ORV9QSVhFTCAtIGZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b194LCBmeTIgKTsKLQotICBFbmQ6Ci0gICAgcmFzLnggICAgICAgPSB0b194OwotICAgIHJhcy55ICAgICAgID0gdG9feTsKLSAgfQotCi0jZWxzZQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmVuZGVyIGEgc3RyYWlnaHQgbGluZSBhY3Jvc3MgbXVsdGlwbGUgY2VsbHMgaW4gYW55IGRpcmVjdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBncmF5X3JlbmRlcl9saW5lKCBSQVNfQVJHXyBUUG9zICB0b194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUG9zICB0b195ICkKLSAgewotICAgIFRQb3MgICAgZHgsIGR5LCBmeDEsIGZ5MSwgZngyLCBmeTI7Ci0gICAgVENvb3JkICBleDEsIGV4MiwgZXkxLCBleTI7Ci0KLQotICAgIGV5MSA9IFRSVU5DKCByYXMueSApOwotICAgIGV5MiA9IFRSVU5DKCB0b195ICk7Ci0KLSAgICAvKiBwZXJmb3JtIHZlcnRpY2FsIGNsaXBwaW5nICovCi0gICAgaWYgKCAoIGV5MSA+PSByYXMubWF4X2V5ICYmIGV5MiA+PSByYXMubWF4X2V5ICkgfHwKLSAgICAgICAgICggZXkxIDwgIHJhcy5taW5fZXkgJiYgZXkyIDwgIHJhcy5taW5fZXkgKSApCi0gICAgICBnb3RvIEVuZDsKLQotICAgIGV4MSA9IFRSVU5DKCByYXMueCApOwotICAgIGV4MiA9IFRSVU5DKCB0b194ICk7Ci0KLSAgICBmeDEgPSByYXMueCAtIFNVQlBJWEVMUyggZXgxICk7Ci0gICAgZnkxID0gcmFzLnkgLSBTVUJQSVhFTFMoIGV5MSApOwotCi0gICAgZHggPSB0b194IC0gcmFzLng7Ci0gICAgZHkgPSB0b195IC0gcmFzLnk7Ci0KLSAgICBpZiAoIGV4MSA9PSBleDIgJiYgZXkxID09IGV5MiApICAgICAgIC8qIGluc2lkZSBvbmUgY2VsbCAqLwotICAgICAgOwotICAgIGVsc2UgaWYgKCBkeSA9PSAwICkgLyogZXgxICE9IGV4MiAqLyAgLyogYW55IGhvcml6b250YWwgbGluZSAqLwotICAgIHsKLSAgICAgIGV4MSA9IGV4MjsKLSAgICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4MSwgZXkxICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBkeCA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIGR5ID4gMCApICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0aWNhbCBsaW5lIHVwICovCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBmeTIgPSBPTkVfUElYRUw7Ci0gICAgICAgICAgcmFzLmNvdmVyICs9ICggZnkyIC0gZnkxICk7Ci0gICAgICAgICAgcmFzLmFyZWEgICs9ICggZnkyIC0gZnkxICkgKiBmeDEgKiAyOwotICAgICAgICAgIGZ5MSA9IDA7Ci0gICAgICAgICAgZXkxKys7Ci0gICAgICAgICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gZXgxLCBleTEgKTsKLSAgICAgICAgfSB3aGlsZSAoIGV5MSAhPSBleTIgKTsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnRpY2FsIGxpbmUgZG93biAqLwotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgZnkyID0gMDsKLSAgICAgICAgICByYXMuY292ZXIgKz0gKCBmeTIgLSBmeTEgKTsKLSAgICAgICAgICByYXMuYXJlYSAgKz0gKCBmeTIgLSBmeTEgKSAqIGZ4MSAqIDI7Ci0gICAgICAgICAgZnkxID0gT05FX1BJWEVMOwotICAgICAgICAgIGV5MS0tOwotICAgICAgICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4MSwgZXkxICk7Ci0gICAgICAgIH0gd2hpbGUgKCBleTEgIT0gZXkyICk7Ci0gICAgfQotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW55IG90aGVyIGxpbmUgKi8KLSAgICB7Ci0gICAgICBUUG9zICBwcm9kID0gZHggKiBmeTEgLSBkeSAqIGZ4MTsKLSAgICAgIEZUX1VESVZQUkVQKCBleDEgIT0gZXgyLCBkeCApOwotICAgICAgRlRfVURJVlBSRVAoIGV5MSAhPSBleTIsIGR5ICk7Ci0KLQotICAgICAgLyogVGhlIGZ1bmRhbWVudGFsIHZhbHVlIGBwcm9kJyBkZXRlcm1pbmVzIHdoaWNoIHNpZGUgYW5kIHRoZSAgKi8KLSAgICAgIC8qIGV4YWN0IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGxpbmUgZXhpdHMgY3VycmVudCBjZWxsLiAgSXQgaXMgICovCi0gICAgICAvKiBhbHNvIGVhc2lseSB1cGRhdGVkIHdoZW4gbW92aW5nIGZyb20gb25lIGNlbGwgdG8gdGhlIG5leHQuICAqLwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgaWYgICAgICAoIHByb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IDAgJiYKLSAgICAgICAgICAgICAgICAgIHByb2QgLSBkeCAqIE9ORV9QSVhFTCAgICAgICAgICAgICAgICAgID4gIDAgKSAvKiBsZWZ0ICovCi0gICAgICAgIHsKLSAgICAgICAgICBmeDIgPSAwOwotICAgICAgICAgIGZ5MiA9IChUUG9zKUZUX1VESVYoIC1wcm9kLCAtZHggKTsKLSAgICAgICAgICBwcm9kIC09IGR5ICogT05FX1BJWEVMOwotICAgICAgICAgIHJhcy5jb3ZlciArPSAoIGZ5MiAtIGZ5MSApOwotICAgICAgICAgIHJhcy5hcmVhICArPSAoIGZ5MiAtIGZ5MSApICogKCBmeDEgKyBmeDIgKTsKLSAgICAgICAgICBmeDEgPSBPTkVfUElYRUw7Ci0gICAgICAgICAgZnkxID0gZnkyOwotICAgICAgICAgIGV4MS0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBwcm9kIC0gZHggKiBPTkVfUElYRUwgICAgICAgICAgICAgICAgICA8PSAwICYmCi0gICAgICAgICAgICAgICAgICBwcm9kIC0gZHggKiBPTkVfUElYRUwgKyBkeSAqIE9ORV9QSVhFTCA+ICAwICkgLyogdXAgKi8KLSAgICAgICAgewotICAgICAgICAgIHByb2QgLT0gZHggKiBPTkVfUElYRUw7Ci0gICAgICAgICAgZngyID0gKFRQb3MpRlRfVURJViggLXByb2QsIGR5ICk7Ci0gICAgICAgICAgZnkyID0gT05FX1BJWEVMOwotICAgICAgICAgIHJhcy5jb3ZlciArPSAoIGZ5MiAtIGZ5MSApOwotICAgICAgICAgIHJhcy5hcmVhICArPSAoIGZ5MiAtIGZ5MSApICogKCBmeDEgKyBmeDIgKTsKLSAgICAgICAgICBmeDEgPSBmeDI7Ci0gICAgICAgICAgZnkxID0gMDsKLSAgICAgICAgICBleTErKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggcHJvZCAtIGR4ICogT05FX1BJWEVMICsgZHkgKiBPTkVfUElYRUwgPD0gMCAmJgotICAgICAgICAgICAgICAgICAgcHJvZCAgICAgICAgICAgICAgICAgICsgZHkgKiBPTkVfUElYRUwgPj0gMCApIC8qIHJpZ2h0ICovCi0gICAgICAgIHsKLSAgICAgICAgICBwcm9kICs9IGR5ICogT05FX1BJWEVMOwotICAgICAgICAgIGZ4MiA9IE9ORV9QSVhFTDsKLSAgICAgICAgICBmeTIgPSAoVFBvcylGVF9VRElWKCBwcm9kLCBkeCApOwotICAgICAgICAgIHJhcy5jb3ZlciArPSAoIGZ5MiAtIGZ5MSApOwotICAgICAgICAgIHJhcy5hcmVhICArPSAoIGZ5MiAtIGZ5MSApICogKCBmeDEgKyBmeDIgKTsKLSAgICAgICAgICBmeDEgPSAwOwotICAgICAgICAgIGZ5MSA9IGZ5MjsKLSAgICAgICAgICBleDErKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qICggcHJvZCAgICAgICAgICAgICAgICAgICsgZHkgKiBPTkVfUElYRUwgPCAgMCAmJgotICAgICAgICAgICAgICAgICAgcHJvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAgMCApICAgIGRvd24gKi8KLSAgICAgICAgewotICAgICAgICAgIGZ4MiA9IChUUG9zKUZUX1VESVYoIHByb2QsIC1keSApOwotICAgICAgICAgIGZ5MiA9IDA7Ci0gICAgICAgICAgcHJvZCArPSBkeCAqIE9ORV9QSVhFTDsKLSAgICAgICAgICByYXMuY292ZXIgKz0gKCBmeTIgLSBmeTEgKTsKLSAgICAgICAgICByYXMuYXJlYSAgKz0gKCBmeTIgLSBmeTEgKSAqICggZngxICsgZngyICk7Ci0gICAgICAgICAgZngxID0gZngyOwotICAgICAgICAgIGZ5MSA9IE9ORV9QSVhFTDsKLSAgICAgICAgICBleTEtLTsKLSAgICAgICAgfQotCi0gICAgICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4MSwgZXkxICk7Ci0gICAgICB9IHdoaWxlICggZXgxICE9IGV4MiB8fCBleTEgIT0gZXkyICk7Ci0gICAgfQotCi0gICAgZngyID0gdG9feCAtIFNVQlBJWEVMUyggZXgyICk7Ci0gICAgZnkyID0gdG9feSAtIFNVQlBJWEVMUyggZXkyICk7Ci0KLSAgICByYXMuY292ZXIgKz0gKCBmeTIgLSBmeTEgKTsKLSAgICByYXMuYXJlYSAgKz0gKCBmeTIgLSBmeTEgKSAqICggZngxICsgZngyICk7Ci0KLSAgRW5kOgotICAgIHJhcy54ICAgICAgID0gdG9feDsKLSAgICByYXMueSAgICAgICA9IHRvX3k7Ci0gIH0KLQotI2VuZGlmCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9zcGxpdF9jb25pYyggRlRfVmVjdG9yKiAgYmFzZSApCi0gIHsKLSAgICBUUG9zICBhLCBiOwotCi0KLSAgICBiYXNlWzRdLnggPSBiYXNlWzJdLng7Ci0gICAgYiA9IGJhc2VbMV0ueDsKLSAgICBhID0gYmFzZVszXS54ID0gKCBiYXNlWzJdLnggKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnggPSAoIGJhc2VbMF0ueCArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS54ID0gKCBhICsgYiApIC8gMjsKLQotICAgIGJhc2VbNF0ueSA9IGJhc2VbMl0ueTsKLSAgICBiID0gYmFzZVsxXS55OwotICAgIGEgPSBiYXNlWzNdLnkgPSAoIGJhc2VbMl0ueSArIGIgKSAvIDI7Ci0gICAgYiA9IGJhc2VbMV0ueSA9ICggYmFzZVswXS55ICsgYiApIC8gMjsKLSAgICBiYXNlWzJdLnkgPSAoIGEgKyBiICkgLyAyOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBncmF5X3JlbmRlcl9jb25pYyggUkFTX0FSR18gY29uc3QgRlRfVmVjdG9yKiAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIHRvICkKLSAgewotICAgIEZUX1ZlY3RvciAgIGJlel9zdGFja1sxNiAqIDIgKyAxXTsgIC8qIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBiaXNlY3Rpb25zICovCi0gICAgRlRfVmVjdG9yKiAgYXJjID0gYmV6X3N0YWNrOwotICAgIFRQb3MgICAgICAgIGR4LCBkeTsKLSAgICBpbnQgICAgICAgICBkcmF3LCBzcGxpdDsKLQotCi0gICAgYXJjWzBdLnggPSBVUFNDQUxFKCB0by0+eCApOwotICAgIGFyY1swXS55ID0gVVBTQ0FMRSggdG8tPnkgKTsKLSAgICBhcmNbMV0ueCA9IFVQU0NBTEUoIGNvbnRyb2wtPnggKTsKLSAgICBhcmNbMV0ueSA9IFVQU0NBTEUoIGNvbnRyb2wtPnkgKTsKLSAgICBhcmNbMl0ueCA9IHJhcy54OwotICAgIGFyY1syXS55ID0gcmFzLnk7Ci0KLSAgICAvKiBzaG9ydC1jdXQgdGhlIGFyYyB0aGF0IGNyb3NzZXMgdGhlIGN1cnJlbnQgYmFuZCAqLwotICAgIGlmICggKCBUUlVOQyggYXJjWzBdLnkgKSA+PSByYXMubWF4X2V5ICYmCi0gICAgICAgICAgIFRSVU5DKCBhcmNbMV0ueSApID49IHJhcy5tYXhfZXkgJiYKLSAgICAgICAgICAgVFJVTkMoIGFyY1syXS55ICkgPj0gcmFzLm1heF9leSApIHx8Ci0gICAgICAgICAoIFRSVU5DKCBhcmNbMF0ueSApIDwgIHJhcy5taW5fZXkgJiYKLSAgICAgICAgICAgVFJVTkMoIGFyY1sxXS55ICkgPCAgcmFzLm1pbl9leSAmJgotICAgICAgICAgICBUUlVOQyggYXJjWzJdLnkgKSA8ICByYXMubWluX2V5ICkgKQotICAgIHsKLSAgICAgIHJhcy54ID0gYXJjWzBdLng7Ci0gICAgICByYXMueSA9IGFyY1swXS55OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGR4ID0gRlRfQUJTKCBhcmNbMl0ueCArIGFyY1swXS54IC0gMiAqIGFyY1sxXS54ICk7Ci0gICAgZHkgPSBGVF9BQlMoIGFyY1syXS55ICsgYXJjWzBdLnkgLSAyICogYXJjWzFdLnkgKTsKLSAgICBpZiAoIGR4IDwgZHkgKQotICAgICAgZHggPSBkeTsKLQotICAgIC8qIFdlIGNhbiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBuZWNlc3NhcnkgYmlzZWN0aW9ucyBiZWNhdXNlICAqLwotICAgIC8qIGVhY2ggYmlzZWN0aW9uIHByZWRpY3RhYmx5IHJlZHVjZXMgZGV2aWF0aW9uIGV4YWN0bHkgNC1mb2xkLiAqLwotICAgIC8qIEV2ZW4gMzItYml0IGRldmlhdGlvbiB3b3VsZCB2YW5pc2ggYWZ0ZXIgMTYgYmlzZWN0aW9ucy4gICAgICAqLwotICAgIGRyYXcgPSAxOwotICAgIHdoaWxlICggZHggPiBPTkVfUElYRUwgLyA0ICkKLSAgICB7Ci0gICAgICBkeCAgID4+PSAyOwotICAgICAgZHJhdyA8PD0gMTsKLSAgICB9Ci0KLSAgICAvKiBXZSB1c2UgZGVjcmVtZW50IGNvdW50ZXIgdG8gY291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBzZWdtZW50cyAqLwotICAgIC8qIHRvIGRyYXcgc3RhcnRpbmcgZnJvbSAyXmxldmVsLiBCZWZvcmUgZWFjaCBkcmF3IHdlIHNwbGl0IGFzICAgICovCi0gICAgLyogbWFueSB0aW1lcyBhcyB0aGVyZSBhcmUgdHJhaWxpbmcgemVyb3MgaW4gdGhlIGNvdW50ZXIuICAgICAgICAgKi8KLSAgICBkbwotICAgIHsKLSAgICAgIHNwbGl0ID0gMTsKLSAgICAgIHdoaWxlICggKCBkcmF3ICYgc3BsaXQgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZ3JheV9zcGxpdF9jb25pYyggYXJjICk7Ci0gICAgICAgIGFyYyArPSAyOwotICAgICAgICBzcGxpdCA8PD0gMTsKLSAgICAgIH0KLQotICAgICAgZ3JheV9yZW5kZXJfbGluZSggUkFTX1ZBUl8gYXJjWzBdLngsIGFyY1swXS55ICk7Ci0gICAgICBhcmMgLT0gMjsKLQotICAgIH0gd2hpbGUgKCAtLWRyYXcgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9zcGxpdF9jdWJpYyggRlRfVmVjdG9yKiAgYmFzZSApCi0gIHsKLSAgICBUUG9zICBhLCBiLCBjLCBkOwotCi0KLSAgICBiYXNlWzZdLnggPSBiYXNlWzNdLng7Ci0gICAgYyA9IGJhc2VbMV0ueDsKLSAgICBkID0gYmFzZVsyXS54OwotICAgIGJhc2VbMV0ueCA9IGEgPSAoIGJhc2VbMF0ueCArIGMgKSAvIDI7Ci0gICAgYmFzZVs1XS54ID0gYiA9ICggYmFzZVszXS54ICsgZCApIC8gMjsKLSAgICBjID0gKCBjICsgZCApIC8gMjsKLSAgICBiYXNlWzJdLnggPSBhID0gKCBhICsgYyApIC8gMjsKLSAgICBiYXNlWzRdLnggPSBiID0gKCBiICsgYyApIC8gMjsKLSAgICBiYXNlWzNdLnggPSAoIGEgKyBiICkgLyAyOwotCi0gICAgYmFzZVs2XS55ID0gYmFzZVszXS55OwotICAgIGMgPSBiYXNlWzFdLnk7Ci0gICAgZCA9IGJhc2VbMl0ueTsKLSAgICBiYXNlWzFdLnkgPSBhID0gKCBiYXNlWzBdLnkgKyBjICkgLyAyOwotICAgIGJhc2VbNV0ueSA9IGIgPSAoIGJhc2VbM10ueSArIGQgKSAvIDI7Ci0gICAgYyA9ICggYyArIGQgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gYSA9ICggYSArIGMgKSAvIDI7Ci0gICAgYmFzZVs0XS55ID0gYiA9ICggYiArIGMgKSAvIDI7Ci0gICAgYmFzZVszXS55ID0gKCBhICsgYiApIC8gMjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9yZW5kZXJfY3ViaWMoIFJBU19BUkdfIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICB0byApCi0gIHsKLSAgICBGVF9WZWN0b3IgICBiZXpfc3RhY2tbMTYgKiAzICsgMV07ICAvKiBlbm91Z2ggdG8gYWNjb21tb2RhdGUgYmlzZWN0aW9ucyAqLwotICAgIEZUX1ZlY3RvciogIGFyYyA9IGJlel9zdGFjazsKLSAgICBUUG9zICAgICAgICBkeCwgZHksIGR4XywgZHlfOwotICAgIFRQb3MgICAgICAgIGR4MSwgZHkxLCBkeDIsIGR5MjsKLSAgICBUUG9zICAgICAgICBMLCBzLCBzX2xpbWl0OwotCi0KLSAgICBhcmNbMF0ueCA9IFVQU0NBTEUoIHRvLT54ICk7Ci0gICAgYXJjWzBdLnkgPSBVUFNDQUxFKCB0by0+eSApOwotICAgIGFyY1sxXS54ID0gVVBTQ0FMRSggY29udHJvbDItPnggKTsKLSAgICBhcmNbMV0ueSA9IFVQU0NBTEUoIGNvbnRyb2wyLT55ICk7Ci0gICAgYXJjWzJdLnggPSBVUFNDQUxFKCBjb250cm9sMS0+eCApOwotICAgIGFyY1syXS55ID0gVVBTQ0FMRSggY29udHJvbDEtPnkgKTsKLSAgICBhcmNbM10ueCA9IHJhcy54OwotICAgIGFyY1szXS55ID0gcmFzLnk7Ci0KLSAgICAvKiBzaG9ydC1jdXQgdGhlIGFyYyB0aGF0IGNyb3NzZXMgdGhlIGN1cnJlbnQgYmFuZCAqLwotICAgIGlmICggKCBUUlVOQyggYXJjWzBdLnkgKSA+PSByYXMubWF4X2V5ICYmCi0gICAgICAgICAgIFRSVU5DKCBhcmNbMV0ueSApID49IHJhcy5tYXhfZXkgJiYKLSAgICAgICAgICAgVFJVTkMoIGFyY1syXS55ICkgPj0gcmFzLm1heF9leSAmJgotICAgICAgICAgICBUUlVOQyggYXJjWzNdLnkgKSA+PSByYXMubWF4X2V5ICkgfHwKLSAgICAgICAgICggVFJVTkMoIGFyY1swXS55ICkgPCAgcmFzLm1pbl9leSAmJgotICAgICAgICAgICBUUlVOQyggYXJjWzFdLnkgKSA8ICByYXMubWluX2V5ICYmCi0gICAgICAgICAgIFRSVU5DKCBhcmNbMl0ueSApIDwgIHJhcy5taW5fZXkgJiYKLSAgICAgICAgICAgVFJVTkMoIGFyY1szXS55ICkgPCAgcmFzLm1pbl9leSApICkKLSAgICB7Ci0gICAgICByYXMueCA9IGFyY1swXS54OwotICAgICAgcmFzLnkgPSBhcmNbMF0ueTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8qIERlY2lkZSB3aGV0aGVyIHRvIHNwbGl0IG9yIGRyYXcuIFNlZSBgUmFwaWQgVGVybWluYXRpb24gICAgICAgICAgKi8KLSAgICAgIC8qIEV2YWx1YXRpb24gZm9yIFJlY3Vyc2l2ZSBTdWJkaXZpc2lvbiBvZiBCZXppZXIgQ3VydmVzJyBieSBUaG9tYXMgKi8KLSAgICAgIC8qIEYuIEhhaW4sIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIGh0dHA6Ly93d3cuY2lzLnNvdXRoYWxhYmFtYS5lZHUvfmhhaW4vZ2VuZXJhbC9QdWJsaWNhdGlvbnMvQmV6aWVyL0NhbWVyYS1yZWFkeSUyMENJU1NUMDIlMjAyLnBkZiAqLwotCi0gICAgICAvKiBkeCBhbmQgZHkgYXJlIHggYW5kIHkgY29tcG9uZW50cyBvZiB0aGUgUDAtUDMgY2hvcmQgdmVjdG9yLiAqLwotICAgICAgZHggPSBkeF8gPSBhcmNbM10ueCAtIGFyY1swXS54OwotICAgICAgZHkgPSBkeV8gPSBhcmNbM10ueSAtIGFyY1swXS55OwotCi0gICAgICBMID0gRlRfSFlQT1QoIGR4XywgZHlfICk7Ci0KLSAgICAgIC8qIEF2b2lkIHBvc3NpYmxlIGFyaXRobWV0aWMgb3ZlcmZsb3cgYmVsb3cgYnkgc3BsaXR0aW5nLiAqLwotICAgICAgaWYgKCBMID4gMzI3NjcgKQotICAgICAgICBnb3RvIFNwbGl0OwotCi0gICAgICAvKiBNYXggZGV2aWF0aW9uIG1heSBiZSBhcyBtdWNoIGFzIChzL0wpICogMy80IChpZiBIYWluJ3MgdiA9IDEpLiAqLwotICAgICAgc19saW1pdCA9IEwgKiAoVFBvcykoIE9ORV9QSVhFTCAvIDYgKTsKLQotICAgICAgLyogcyBpcyBMICogdGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSBQMSB0byB0aGUgbGluZSBQMC1QMy4gKi8KLSAgICAgIGR4MSA9IGFyY1sxXS54IC0gYXJjWzBdLng7Ci0gICAgICBkeTEgPSBhcmNbMV0ueSAtIGFyY1swXS55OwotICAgICAgcyA9IEZUX0FCUyggU1VCX0xPTkcoIE1VTF9MT05HKCBkeSwgZHgxICksIE1VTF9MT05HKCBkeCwgZHkxICkgKSApOwotCi0gICAgICBpZiAoIHMgPiBzX2xpbWl0ICkKLSAgICAgICAgZ290byBTcGxpdDsKLQotICAgICAgLyogcyBpcyBMICogdGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSBQMiB0byB0aGUgbGluZSBQMC1QMy4gKi8KLSAgICAgIGR4MiA9IGFyY1syXS54IC0gYXJjWzBdLng7Ci0gICAgICBkeTIgPSBhcmNbMl0ueSAtIGFyY1swXS55OwotICAgICAgcyA9IEZUX0FCUyggU1VCX0xPTkcoIE1VTF9MT05HKCBkeSwgZHgyICksIE1VTF9MT05HKCBkeCwgZHkyICkgKSApOwotCi0gICAgICBpZiAoIHMgPiBzX2xpbWl0ICkKLSAgICAgICAgZ290byBTcGxpdDsKLQotICAgICAgLyogU3BsaXQgc3VwZXIgY3Vydnkgc2VnbWVudHMgd2hlcmUgdGhlIG9mZiBwb2ludHMgYXJlIHNvIGZhcgotICAgICAgICAgZnJvbSB0aGUgY2hvcmQgdGhhdCB0aGUgYW5nbGVzIFAwLVAxLVAzIG9yIFAwLVAyLVAzIGJlY29tZQotICAgICAgICAgYWN1dGUgYXMgZGV0ZWN0ZWQgYnkgYXBwcm9wcmlhdGUgZG90IHByb2R1Y3RzLiAqLwotICAgICAgaWYgKCBkeDEgKiAoIGR4MSAtIGR4ICkgKyBkeTEgKiAoIGR5MSAtIGR5ICkgPiAwIHx8Ci0gICAgICAgICAgIGR4MiAqICggZHgyIC0gZHggKSArIGR5MiAqICggZHkyIC0gZHkgKSA+IDAgKQotICAgICAgICBnb3RvIFNwbGl0OwotCi0gICAgICBncmF5X3JlbmRlcl9saW5lKCBSQVNfVkFSXyBhcmNbMF0ueCwgYXJjWzBdLnkgKTsKLQotICAgICAgaWYgKCBhcmMgPT0gYmV6X3N0YWNrICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBhcmMgLT0gMzsKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgU3BsaXQ6Ci0gICAgICBncmF5X3NwbGl0X2N1YmljKCBhcmMgKTsKLSAgICAgIGFyYyArPSAzOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIGludAotICBncmF5X21vdmVfdG8oIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgIGdyYXlfUFdvcmtlciAgICAgIHdvcmtlciApCi0gIHsKLSAgICBUUG9zICB4LCB5OwotCi0KLSAgICAvKiBzdGFydCB0byBhIG5ldyBwb3NpdGlvbiAqLwotICAgIHggPSBVUFNDQUxFKCB0by0+eCApOwotICAgIHkgPSBVUFNDQUxFKCB0by0+eSApOwotCi0gICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gVFJVTkMoIHggKSwgVFJVTkMoIHkgKSApOwotCi0gICAgcmFzLnggPSB4OwotICAgIHJhcy55ID0geTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBncmF5X2xpbmVfdG8oIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgIGdyYXlfUFdvcmtlciAgICAgIHdvcmtlciApCi0gIHsKLSAgICBncmF5X3JlbmRlcl9saW5lKCBSQVNfVkFSXyBVUFNDQUxFKCB0by0+eCApLCBVUFNDQUxFKCB0by0+eSApICk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9jb25pY190byggY29uc3QgRlRfVmVjdG9yKiAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgIGdyYXlfUFdvcmtlciAgICAgIHdvcmtlciApCi0gIHsKLSAgICBncmF5X3JlbmRlcl9jb25pYyggUkFTX1ZBUl8gY29udHJvbCwgdG8gKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBncmF5X2N1YmljX3RvKCBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICBncmF5X1BXb3JrZXIgICAgICB3b3JrZXIgKQotICB7Ci0gICAgZ3JheV9yZW5kZXJfY3ViaWMoIFJBU19WQVJfIGNvbnRyb2wxLCBjb250cm9sMiwgdG8gKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9obGluZSggUkFTX0FSR18gVENvb3JkICB4LAotICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIHksCi0gICAgICAgICAgICAgICAgICAgICAgIFRBcmVhICAgY292ZXJhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFRDb29yZCAgYWNvdW50ICkKLSAgewotICAgIC8qIHNjYWxlIHRoZSBjb3ZlcmFnZSBmcm9tIDAuLihPTkVfUElYRUwqT05FX1BJWEVMKjIpIHRvIDAuLjI1NiAgKi8KLSAgICBjb3ZlcmFnZSA+Pj0gUElYRUxfQklUUyAqIDIgKyAxIC0gODsKLSAgICBpZiAoIGNvdmVyYWdlIDwgMCApCi0gICAgICBjb3ZlcmFnZSA9IC1jb3ZlcmFnZSAtIDE7Ci0KLSAgICAvKiBjb21wdXRlIHRoZSBsaW5lJ3MgY292ZXJhZ2UgZGVwZW5kaW5nIG9uIHRoZSBvdXRsaW5lIGZpbGwgcnVsZSAqLwotICAgIGlmICggcmFzLm91dGxpbmUuZmxhZ3MgJiBGVF9PVVRMSU5FX0VWRU5fT0REX0ZJTEwgKQotICAgIHsKLSAgICAgIGNvdmVyYWdlICY9IDUxMTsKLQotICAgICAgaWYgKCBjb3ZlcmFnZSA+PSAyNTYgKQotICAgICAgICBjb3ZlcmFnZSA9IDUxMSAtIGNvdmVyYWdlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogbm9ybWFsIG5vbi16ZXJvIHdpbmRpbmcgcnVsZSAqLwotICAgICAgaWYgKCBjb3ZlcmFnZSA+PSAyNTYgKQotICAgICAgICBjb3ZlcmFnZSA9IDI1NTsKLSAgICB9Ci0KLSAgICBpZiAoIHJhcy5yZW5kZXJfc3BhbiApICAvKiBmb3IgRlRfUkFTVEVSX0ZMQUdfRElSRUNUIG9ubHkgKi8KLSAgICB7Ci0gICAgICBGVF9TcGFuICBzcGFuOwotCi0KLSAgICAgIHNwYW4ueCAgICAgICAgPSAoc2hvcnQpeDsKLSAgICAgIHNwYW4ubGVuICAgICAgPSAodW5zaWduZWQgc2hvcnQpYWNvdW50OwotICAgICAgc3Bhbi5jb3ZlcmFnZSA9ICh1bnNpZ25lZCBjaGFyKWNvdmVyYWdlOwotCi0gICAgICByYXMucmVuZGVyX3NwYW4oIHksIDEsICZzcGFuLCByYXMucmVuZGVyX3NwYW5fZGF0YSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciogIHEgPSByYXMudGFyZ2V0Lm9yaWdpbiAtIHJhcy50YXJnZXQucGl0Y2ggKiB5ICsgeDsKLSAgICAgIHVuc2lnbmVkIGNoYXIgICBjID0gKHVuc2lnbmVkIGNoYXIpY292ZXJhZ2U7Ci0KLQotICAgICAgLyogRm9yIHNtYWxsLXNwYW5zIGl0IGlzIGZhc3RlciB0byBkbyBpdCBieSBvdXJzZWx2ZXMgdGhhbgotICAgICAgICogY2FsbGluZyBgbWVtc2V0Jy4gIFRoaXMgaXMgbWFpbmx5IGR1ZSB0byB0aGUgY29zdCBvZiB0aGUKLSAgICAgICAqIGZ1bmN0aW9uIGNhbGwuCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoIGFjb3VudCApCi0gICAgICB7Ci0gICAgICBjYXNlIDc6ICpxKysgPSBjOwotICAgICAgY2FzZSA2OiAqcSsrID0gYzsKLSAgICAgIGNhc2UgNTogKnErKyA9IGM7Ci0gICAgICBjYXNlIDQ6ICpxKysgPSBjOwotICAgICAgY2FzZSAzOiAqcSsrID0gYzsKLSAgICAgIGNhc2UgMjogKnErKyA9IGM7Ci0gICAgICBjYXNlIDE6ICpxICAgPSBjOwotICAgICAgY2FzZSAwOiBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEZUX01FTV9TRVQoIHEsIGMsIGFjb3VudCApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9zd2VlcCggUkFTX0FSRyApCi0gIHsKLSAgICBpbnQgIHk7Ci0KLQotICAgIEZUX1RSQUNFNygoICJncmF5X3N3ZWVwOiBzdGFydFxuIiApKTsKLQotICAgIGZvciAoIHkgPSByYXMubWluX2V5OyB5IDwgcmFzLm1heF9leTsgeSsrICkKLSAgICB7Ci0gICAgICBQQ2VsbCAgIGNlbGwgID0gcmFzLnljZWxsc1t5IC0gcmFzLm1pbl9leV07Ci0gICAgICBUQ29vcmQgIHggICAgID0gcmFzLm1pbl9leDsKLSAgICAgIFRBcmVhICAgY292ZXIgPSAwOwotICAgICAgVEFyZWEgICBhcmVhOwotCi0KLSAgICAgIGZvciAoIDsgY2VsbCAhPSBOVUxMOyBjZWxsID0gY2VsbC0+bmV4dCApCi0gICAgICB7Ci0gICAgICAgIGlmICggY292ZXIgIT0gMCAmJiBjZWxsLT54ID4geCApCi0gICAgICAgICAgZ3JheV9obGluZSggUkFTX1ZBUl8geCwgeSwgY292ZXIsIGNlbGwtPnggLSB4ICk7Ci0KLSAgICAgICAgY292ZXIgKz0gKFRBcmVhKWNlbGwtPmNvdmVyICogKCBPTkVfUElYRUwgKiAyICk7Ci0gICAgICAgIGFyZWEgICA9IGNvdmVyIC0gY2VsbC0+YXJlYTsKLQotICAgICAgICBpZiAoIGFyZWEgIT0gMCAmJiBjZWxsLT54ID49IHJhcy5taW5fZXggKQotICAgICAgICAgIGdyYXlfaGxpbmUoIFJBU19WQVJfIGNlbGwtPngsIHksIGFyZWEsIDEgKTsKLQotICAgICAgICB4ID0gY2VsbC0+eCArIDE7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggY292ZXIgIT0gMCApCi0gICAgICAgIGdyYXlfaGxpbmUoIFJBU19WQVJfIHgsIHksIGNvdmVyLCByYXMubWF4X2V4IC0geCApOwotICAgIH0KLQotICAgIEZUX1RSQUNFNygoICJncmF5X3N3ZWVwOiBlbmRcbiIgKSk7Ci0gIH0KLQotCi0jaWZkZWYgU1RBTkRBTE9ORV8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzaG91bGQgb25seSBjb21waWxlIGluIHN0YW5kLWFsb25lIG1vZGUsICAgICAqLwotICAvKiAgaS5lLiwgd2hlbiBidWlsZGluZyB0aGlzIGNvbXBvbmVudCB3aXRob3V0IHRoZSByZXN0IG9mIEZyZWVUeXBlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdhbGsgb3ZlciBhbiBvdXRsaW5lJ3Mgc3RydWN0dXJlIHRvIGRlY29tcG9zZSBpdCBpbnRvIGluZGl2aWR1YWwgICAqLwotICAvKiAgICBzZWdtZW50cyBhbmQgQsOpemllciBhcmNzLiAgVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFibGUgdG8gZW1pdCAgICAgICovCi0gIC8qICAgIGBtb3ZlIHRvJyBhbmQgYGNsb3NlIHRvJyBvcGVyYXRpb25zIHRvIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kICAqLwotICAvKiAgICBvZiBuZXcgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSB0YXJnZXQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNfaW50ZXJmYWNlIDo6IEEgdGFibGUgb2YgYGVtaXR0ZXJzJywgaS5lLiwgZnVuY3Rpb24gcG9pbnRlcnMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgZHVyaW5nIGRlY29tcG9zaXRpb24gdG8gaW5kaWNhdGUgcGF0aCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICAgICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHdoaWNoIGlzIHBhc3NlZCB0byBlYWNoICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLiAgSXQgY2FuIGJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBzdGF0ZSBkdXJpbmcgdGhlICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgaW50Ci0gIEZUX091dGxpbmVfRGVjb21wb3NlKCBjb25zdCBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX091dGxpbmVfRnVuY3MqICBmdW5jX2ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICB1c2VyICkKLSAgewotI3VuZGVmIFNDQUxFRAotI2RlZmluZSBTQ0FMRUQoIHggKSAgKCAoICh4KSA8PCBzaGlmdCApIC0gZGVsdGEgKQotCi0gICAgRlRfVmVjdG9yICAgdl9sYXN0OwotICAgIEZUX1ZlY3RvciAgIHZfY29udHJvbDsKLSAgICBGVF9WZWN0b3IgICB2X3N0YXJ0OwotCi0gICAgRlRfVmVjdG9yKiAgcG9pbnQ7Ci0gICAgRlRfVmVjdG9yKiAgbGltaXQ7Ci0gICAgY2hhciogICAgICAgdGFnczsKLQotICAgIGludCAgICAgICAgIGVycm9yOwotCi0gICAgaW50ICAgbjsgICAgICAgICAvKiBpbmRleCBvZiBjb250b3VyIGluIG91dGxpbmUgICAgICovCi0gICAgaW50ICAgZmlyc3Q7ICAgICAvKiBpbmRleCBvZiBmaXJzdCBwb2ludCBpbiBjb250b3VyICovCi0gICAgY2hhciAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCi0KLSAgICBpbnQgICBzaGlmdDsKLSAgICBUUG9zICBkZWx0YTsKLQotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT3V0bGluZSApOwotCi0gICAgaWYgKCAhZnVuY19pbnRlcmZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBzaGlmdCA9IGZ1bmNfaW50ZXJmYWNlLT5zaGlmdDsKLSAgICBkZWx0YSA9IGZ1bmNfaW50ZXJmYWNlLT5kZWx0YTsKLSAgICBmaXJzdCA9IDA7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IG91dGxpbmUtPm5fY29udG91cnM7IG4rKyApCi0gICAgewotICAgICAgaW50ICBsYXN0OyAgLyogaW5kZXggb2YgbGFzdCBwb2ludCBpbiBjb250b3VyICovCi0KLQotICAgICAgRlRfVFJBQ0U1KCggIkZUX091dGxpbmVfRGVjb21wb3NlOiBPdXRsaW5lICVkXG4iLCBuICkpOwotCi0gICAgICBsYXN0ICA9IG91dGxpbmUtPmNvbnRvdXJzW25dOwotICAgICAgaWYgKCBsYXN0IDwgMCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotICAgICAgbGltaXQgPSBvdXRsaW5lLT5wb2ludHMgKyBsYXN0OwotCi0gICAgICB2X3N0YXJ0ICAgPSBvdXRsaW5lLT5wb2ludHNbZmlyc3RdOwotICAgICAgdl9zdGFydC54ID0gU0NBTEVEKCB2X3N0YXJ0LnggKTsKLSAgICAgIHZfc3RhcnQueSA9IFNDQUxFRCggdl9zdGFydC55ICk7Ci0KLSAgICAgIHZfbGFzdCAgID0gb3V0bGluZS0+cG9pbnRzW2xhc3RdOwotICAgICAgdl9sYXN0LnggPSBTQ0FMRUQoIHZfbGFzdC54ICk7Ci0gICAgICB2X2xhc3QueSA9IFNDQUxFRCggdl9sYXN0LnkgKTsKLQotICAgICAgdl9jb250cm9sID0gdl9zdGFydDsKLQotICAgICAgcG9pbnQgPSBvdXRsaW5lLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgIHRhZ3MgID0gb3V0bGluZS0+dGFncyAgICsgZmlyc3Q7Ci0gICAgICB0YWcgICA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgICAvKiBBIGNvbnRvdXIgY2Fubm90IHN0YXJ0IHdpdGggYSBjdWJpYyBjb250cm9sIHBvaW50ISAqLwotICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NVQklDICkKLSAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgIC8qIGNoZWNrIGZpcnN0IHBvaW50IHRvIGRldGVybWluZSBvcmlnaW4gKi8KLSAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICB7Ci0gICAgICAgIC8qIGZpcnN0IHBvaW50IGlzIGNvbmljIGNvbnRyb2wuICBZZXMsIHRoaXMgaGFwcGVucy4gKi8KLSAgICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUtPnRhZ3NbbGFzdF0gKSA9PSBGVF9DVVJWRV9UQUdfT04gKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc3RhcnQgYXQgbGFzdCBwb2ludCBpZiBpdCBpcyBvbiB0aGUgY3VydmUgKi8KLSAgICAgICAgICB2X3N0YXJ0ID0gdl9sYXN0OwotICAgICAgICAgIGxpbWl0LS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogaWYgYm90aCBmaXJzdCBhbmQgbGFzdCBwb2ludHMgYXJlIGNvbmljLCAgICAgICAgICovCi0gICAgICAgICAgLyogc3RhcnQgYXQgdGhlaXIgbWlkZGxlIGFuZCByZWNvcmQgaXRzIHBvc2l0aW9uICAgICovCi0gICAgICAgICAgLyogZm9yIGNsb3N1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgdl9zdGFydC54ID0gKCB2X3N0YXJ0LnggKyB2X2xhc3QueCApIC8gMjsKLSAgICAgICAgICB2X3N0YXJ0LnkgPSAoIHZfc3RhcnQueSArIHZfbGFzdC55ICkgLyAyOwotCi0gICAgICAgICAgdl9sYXN0ID0gdl9zdGFydDsKLSAgICAgICAgfQotICAgICAgICBwb2ludC0tOwotICAgICAgICB0YWdzLS07Ci0gICAgICB9Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgIG1vdmUgdG8gKCUuMmYsICUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgdl9zdGFydC54IC8gNjQuMCwgdl9zdGFydC55IC8gNjQuMCApKTsKLSAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPm1vdmVfdG8oICZ2X3N0YXJ0LCB1c2VyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICB3aGlsZSAoIHBvaW50IDwgbGltaXQgKQotICAgICAgewotICAgICAgICBwb2ludCsrOwotICAgICAgICB0YWdzKys7Ci0KLSAgICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0gICAgICAgIHN3aXRjaCAoIHRhZyApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBGVF9DVVJWRV9UQUdfT046ICAvKiBlbWl0IGEgc2luZ2xlIGxpbmVfdG8gKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzsKLQotCi0gICAgICAgICAgICB2ZWMueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICAgIHZlYy55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBsaW5lIHRvICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlYy54IC8gNjQuMCwgdmVjLnkgLyA2NC4wICkpOwotICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+bGluZV90byggJnZlYywgdXNlciApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIEZUX0NVUlZFX1RBR19DT05JQzogIC8qIGNvbnN1bWUgY29uaWMgYXJjcyAqLwotICAgICAgICAgIHZfY29udHJvbC54ID0gU0NBTEVEKCBwb2ludC0+eCApOwotICAgICAgICAgIHZfY29udHJvbC55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgIERvX0NvbmljOgotICAgICAgICAgIGlmICggcG9pbnQgPCBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZfbWlkZGxlOwotCi0KLSAgICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgICAgICB0YWdzKys7Ci0gICAgICAgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLQotICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICB2ZWMueSA9IFNDQUxFRCggcG9pbnQtPnkgKTsKLQotICAgICAgICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY29uaWMgdG8gKCUuMmYsICUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZlYy54IC8gNjQuMCwgdmVjLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2X2NvbnRyb2wueCAvIDY0LjAsIHZfY29udHJvbC55IC8gNjQuMCApKTsKLSAgICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y29uaWNfdG8oICZ2X2NvbnRyb2wsICZ2ZWMsIHVzZXIgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCB0YWcgIT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICAgICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgICAgIHZfbWlkZGxlLnggPSAoIHZfY29udHJvbC54ICsgdmVjLnggKSAvIDI7Ci0gICAgICAgICAgICB2X21pZGRsZS55ID0gKCB2X2NvbnRyb2wueSArIHZlYy55ICkgLyAyOwotCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBjb25pYyB0byAoJS4yZiwgJS4yZikiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2X21pZGRsZS54IC8gNjQuMCwgdl9taWRkbGUueSAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICB2X2NvbnRyb2wueCAvIDY0LjAsIHZfY29udHJvbC55IC8gNjQuMCApKTsKLSAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdl9taWRkbGUsIHVzZXIgKTsKLSAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIHZfY29udHJvbCA9IHZlYzsKLSAgICAgICAgICAgIGdvdG8gRG9fQ29uaWM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY29uaWMgdG8gKCUuMmYsICUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBjb250cm9sICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICB2X3N0YXJ0LnggLyA2NC4wLCB2X3N0YXJ0LnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgIHZfY29udHJvbC54IC8gNjQuMCwgdl9jb250cm9sLnkgLyA2NC4wICkpOwotICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdl9zdGFydCwgdXNlciApOwotICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0KLSAgICAgICAgZGVmYXVsdDogIC8qIEZUX0NVUlZFX1RBR19DVUJJQyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjMSwgdmVjMjsKLQotCi0gICAgICAgICAgICBpZiAoIHBvaW50ICsgMSA+IGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBGVF9DVVJWRV9UQUcoIHRhZ3NbMV0gKSAhPSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgICAgcG9pbnQgKz0gMjsKLSAgICAgICAgICAgIHRhZ3MgICs9IDI7Ci0KLSAgICAgICAgICAgIHZlYzEueCA9IFNDQUxFRCggcG9pbnRbLTJdLnggKTsKLSAgICAgICAgICAgIHZlYzEueSA9IFNDQUxFRCggcG9pbnRbLTJdLnkgKTsKLQotICAgICAgICAgICAgdmVjMi54ID0gU0NBTEVEKCBwb2ludFstMV0ueCApOwotICAgICAgICAgICAgdmVjMi55ID0gU0NBTEVEKCBwb2ludFstMV0ueSApOwotCi0gICAgICAgICAgICBpZiAoIHBvaW50IDw9IGxpbWl0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICAgICAgICB2ZWMueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICAgICAgdmVjLnkgPSBTQ0FMRUQoIHBvaW50LT55ICk7Ci0KLSAgICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY3ViaWMgdG8gKCUuMmYsICUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbHMgKCUuMmYsICUuMmYpIGFuZCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZlYy54IC8gNjQuMCwgdmVjLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMxLnggLyA2NC4wLCB2ZWMxLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyLnggLyA2NC4wLCB2ZWMyLnkgLyA2NC4wICkpOwotICAgICAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jdWJpY190byggJnZlYzEsICZ2ZWMyLCAmdmVjLCB1c2VyICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGN1YmljIHRvICglLjJmLCAlLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBjb250cm9scyAoJS4yZiwgJS4yZikgYW5kICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZfc3RhcnQueCAvIDY0LjAsIHZfc3RhcnQueSAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICB2ZWMxLnggLyA2NC4wLCB2ZWMxLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi54IC8gNjQuMCwgdmVjMi55IC8gNjQuMCApKTsKLSAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmN1YmljX3RvKCAmdmVjMSwgJnZlYzIsICZ2X3N0YXJ0LCB1c2VyICk7Ci0gICAgICAgICAgICBnb3RvIENsb3NlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBjbG9zZSB0aGUgY29udG91ciB3aXRoIGEgbGluZSBzZWdtZW50ICovCi0gICAgICBGVF9UUkFDRTUoKCAiICBsaW5lIHRvICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgIHZfc3RhcnQueCAvIDY0LjAsIHZfc3RhcnQueSAvIDY0LjAgKSk7Ci0gICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5saW5lX3RvKCAmdl9zdGFydCwgdXNlciApOwotCi0gICBDbG9zZToKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZpcnN0ID0gbGFzdCArIDE7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIkZUX091dGxpbmVfRGVjb21wb3NlOiBEb25lXG4iLCBuICkpOwotICAgIHJldHVybiAwOwotCi0gIEV4aXQ6Ci0gICAgRlRfVFJBQ0U1KCggIkZUX091dGxpbmVfRGVjb21wb3NlOiBFcnJvciAweCV4XG4iLCBlcnJvciApKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgSW52YWxpZF9PdXRsaW5lOgotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfR2V0X0NCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhbiBvdXRsaW5lJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwgICAqLwotICAvKiAgICB0aGUgb3V0bGluZSdzIHBvaW50cywgaW5jbHVkaW5nIELDqXppZXIgY29udHJvbCBwb2ludHMuICBUaG91Z2ggaXQgICovCi0gIC8qICAgIGNvaW5jaWRlcyB3aXRoIHRoZSBleGFjdCBib3VuZGluZyBib3ggZm9yIG1vc3QgZ2x5cGhzLCBpdCBjYW4gYmUgICAqLwotICAvKiAgICBzbGlnaHRseSBsYXJnZXIgaW4gc29tZSBzaXR1YXRpb25zIChsaWtlIHdoZW4gcm90YXRpbmcgYW4gb3V0bGluZSAgKi8KLSAgLyogICAgdGhhdCBjb250YWlucyBCw6l6aWVyIG91dHNpZGUgYXJjcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0aW5nIHRoZSBjb250cm9sIGJveCBpcyB2ZXJ5IGZhc3QsIHdoaWxlIGdldHRpbmcgdGhlIGJvdW5kaW5nICovCi0gIC8qICAgIGJveCBjYW4gdGFrZSBtdWNoIG1vcmUgdGltZSBhcyBpdCBuZWVkcyB0byB3YWxrIG92ZXIgYWxsIHNlZ21lbnRzICAqLwotICAvKiAgICBhbmQgYXJjcyBpbiB0aGUgb3V0bGluZS4gIFRvIGdldCB0aGUgbGF0dGVyLCB5b3UgY2FuIHVzZSB0aGUgICAgICAgKi8KLSAgLyogICAgYGZ0YmJveCcgY29tcG9uZW50LCB3aGljaCBpcyBkZWRpY2F0ZWQgdG8gdGhpcyBzaW5nbGUgdGFzay4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNib3ggICA6OiBUaGUgb3V0bGluZSdzIGNvbnRyb2wgYm94LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9HbHlwaF9HZXRfQ0JveCBmb3IgYSBkaXNjdXNzaW9uIG9mIHRyaWNreSBmb250cy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIEZUX091dGxpbmVfR2V0X0NCb3goIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAgICAgICAqYWNib3ggKQotICB7Ci0gICAgVFBvcyAgeE1pbiwgeU1pbiwgeE1heCwgeU1heDsKLQotCi0gICAgaWYgKCBvdXRsaW5lICYmIGFjYm94ICkKLSAgICB7Ci0gICAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzID09IDAgKQotICAgICAgewotICAgICAgICB4TWluID0gMDsKLSAgICAgICAgeU1pbiA9IDA7Ci0gICAgICAgIHhNYXggPSAwOwotICAgICAgICB5TWF4ID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yKiAgdmVjICAgPSBvdXRsaW5lLT5wb2ludHM7Ci0gICAgICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gdmVjICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgICB4TWluID0geE1heCA9IHZlYy0+eDsKLSAgICAgICAgeU1pbiA9IHlNYXggPSB2ZWMtPnk7Ci0gICAgICAgIHZlYysrOwotCi0gICAgICAgIGZvciAoIDsgdmVjIDwgbGltaXQ7IHZlYysrICkKLSAgICAgICAgewotICAgICAgICAgIFRQb3MgIHgsIHk7Ci0KLQotICAgICAgICAgIHggPSB2ZWMtPng7Ci0gICAgICAgICAgaWYgKCB4IDwgeE1pbiApIHhNaW4gPSB4OwotICAgICAgICAgIGlmICggeCA+IHhNYXggKSB4TWF4ID0geDsKLQotICAgICAgICAgIHkgPSB2ZWMtPnk7Ci0gICAgICAgICAgaWYgKCB5IDwgeU1pbiApIHlNaW4gPSB5OwotICAgICAgICAgIGlmICggeSA+IHlNYXggKSB5TWF4ID0geTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYWNib3gtPnhNaW4gPSB4TWluOwotICAgICAgYWNib3gtPnhNYXggPSB4TWF4OwotICAgICAgYWNib3gtPnlNaW4gPSB5TWluOwotICAgICAgYWNib3gtPnlNYXggPSB5TWF4OwotICAgIH0KLSAgfQotCi0jZW5kaWYgLyogU1RBTkRBTE9ORV8gKi8KLQotCi0gIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTKAotICAgIGZ1bmNfaW50ZXJmYWNlLAotCi0gICAgKEZUX091dGxpbmVfTW92ZVRvX0Z1bmMpIGdyYXlfbW92ZV90bywgICAvKiBtb3ZlX3RvICAqLwotICAgIChGVF9PdXRsaW5lX0xpbmVUb19GdW5jKSBncmF5X2xpbmVfdG8sICAgLyogbGluZV90byAgKi8KLSAgICAoRlRfT3V0bGluZV9Db25pY1RvX0Z1bmMpZ3JheV9jb25pY190bywgIC8qIGNvbmljX3RvICovCi0gICAgKEZUX091dGxpbmVfQ3ViaWNUb19GdW5jKWdyYXlfY3ViaWNfdG8sICAvKiBjdWJpY190byAqLwotCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCAgICAqLwotICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVsdGEgICAgKi8KLSAgKQotCi0KLSAgc3RhdGljIGludAotICBncmF5X2NvbnZlcnRfZ2x5cGhfaW5uZXIoIFJBU19BUkcgKQotICB7Ci0KLSAgICB2b2xhdGlsZSBpbnQgIGVycm9yID0gMDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgICBGVF9PdXRsaW5lX0Z1bmNzIGZ1bmNfaW50ZXJmYWNlOwotICAgICAgSW5pdF9DbGFzc19mdW5jX2ludGVyZmFjZSgmZnVuY19pbnRlcmZhY2UpOwotI2VuZGlmCi0KLSAgICBpZiAoIGZ0X3NldGptcCggcmFzLmp1bXBfYnVmZmVyICkgPT0gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9PdXRsaW5lX0RlY29tcG9zZSggJnJhcy5vdXRsaW5lLCAmZnVuY19pbnRlcmZhY2UsICZyYXMgKTsKLSAgICAgIGlmICggIXJhcy5pbnZhbGlkICkKLSAgICAgICAgZ3JheV9yZWNvcmRfY2VsbCggUkFTX1ZBUiApOwotCi0gICAgICBGVF9UUkFDRTcoKCAiYmFuZCBbJWQuLiVkXTogJWQgY2VsbHNcbiIsCi0gICAgICAgICAgICAgICAgICByYXMubWluX2V5LCByYXMubWF4X2V5LCByYXMubnVtX2NlbGxzICkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggTWVtb3J5X092ZXJmbG93ICk7Ci0KLSAgICAgIEZUX1RSQUNFNygoICJiYW5kIFslZC4uJWRdOiB0byBiZSBiaXNlY3RlZFxuIiwKLSAgICAgICAgICAgICAgICAgIHJhcy5taW5fZXksIHJhcy5tYXhfZXkgKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfY29udmVydF9nbHlwaCggUkFTX0FSRyApCi0gIHsKLSAgICBUQ2VsbCAgICBidWZmZXJbRlRfTUFYX0dSQVlfUE9PTF07Ci0gICAgVENvb3JkICAgYmFuZF9zaXplID0gRlRfTUFYX0dSQVlfUE9PTCAvIDg7Ci0gICAgVENvb3JkICAgY291bnQgPSByYXMubWF4X2V5IC0gcmFzLm1pbl9leTsKLSAgICBpbnQgICAgICBudW1fYmFuZHM7Ci0gICAgVENvb3JkICAgbWluLCBtYXgsIG1heF95OwotICAgIFRDb29yZCAgIGJhbmRzWzMyXTsgIC8qIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBiaXNlY3Rpb25zICovCi0gICAgVENvb3JkKiAgYmFuZDsKLQotCi0gICAgLyogc2V0IHVwIHZlcnRpY2FsIGJhbmRzICovCi0gICAgaWYgKCBjb3VudCA+IGJhbmRfc2l6ZSApCi0gICAgewotICAgICAgLyogdHdvIGRpdmlzaW9ucyByb3VuZGVkIHVwICovCi0gICAgICBudW1fYmFuZHMgPSAoaW50KSggKCBjb3VudCArIGJhbmRfc2l6ZSAtIDEpIC8gYmFuZF9zaXplICk7Ci0gICAgICBiYW5kX3NpemUgPSAoIGNvdW50ICsgbnVtX2JhbmRzIC0gMSApIC8gbnVtX2JhbmRzOwotICAgIH0KLQotICAgIG1pbiAgID0gcmFzLm1pbl9leTsKLSAgICBtYXhfeSA9IHJhcy5tYXhfZXk7Ci0KLSAgICBmb3IgKCA7IG1pbiA8IG1heF95OyBtaW4gPSBtYXggKQotICAgIHsKLSAgICAgIG1heCA9IG1pbiArIGJhbmRfc2l6ZTsKLSAgICAgIGlmICggbWF4ID4gbWF4X3kgKQotICAgICAgICBtYXggPSBtYXhfeTsKLQotICAgICAgYmFuZCAgICA9IGJhbmRzOwotICAgICAgYmFuZFsxXSA9IG1pbjsKLSAgICAgIGJhbmRbMF0gPSBtYXg7Ci0KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIFRDb29yZCAgd2lkdGggPSBiYW5kWzBdIC0gYmFuZFsxXTsKLSAgICAgICAgaW50ICAgICBlcnJvcjsKLQotCi0gICAgICAgIC8qIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3QgIHljb3VudCA9IChzaXplX3Qpd2lkdGg7Ci0gICAgICAgICAgc2l6ZV90ICBjZWxsX3N0YXJ0OwotCi0KLSAgICAgICAgICBjZWxsX3N0YXJ0ID0gKCB5Y291bnQgKiBzaXplb2YgKCBQQ2VsbCApICsgc2l6ZW9mICggVENlbGwgKSAtIDEgKSAvCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIFRDZWxsICk7Ci0KLSAgICAgICAgICByYXMuY2VsbHMgICAgID0gYnVmZmVyICsgY2VsbF9zdGFydDsKLSAgICAgICAgICByYXMubWF4X2NlbGxzID0gKEZUX1B0ckRpc3QpKCBGVF9NQVhfR1JBWV9QT09MIC0gY2VsbF9zdGFydCApOwotICAgICAgICAgIHJhcy5udW1fY2VsbHMgPSAwOwotCi0gICAgICAgICAgcmFzLnljZWxscyA9IChQQ2VsbCopYnVmZmVyOwotICAgICAgICAgIHdoaWxlICggeWNvdW50ICkKLSAgICAgICAgICAgIHJhcy55Y2VsbHNbLS15Y291bnRdID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHJhcy5pbnZhbGlkICAgPSAxOwotICAgICAgICByYXMubWluX2V5ICAgID0gYmFuZFsxXTsKLSAgICAgICAgcmFzLm1heF9leSAgICA9IGJhbmRbMF07Ci0KLSAgICAgICAgZXJyb3IgPSBncmF5X2NvbnZlcnRfZ2x5cGhfaW5uZXIoIFJBU19WQVIgKTsKLQotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHsKLSAgICAgICAgICBncmF5X3N3ZWVwKCBSQVNfVkFSICk7Ci0gICAgICAgICAgYmFuZC0tOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBlcnJvciAhPSBFcnJSYXN0ZXJfTWVtb3J5X092ZXJmbG93ICkKLSAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICAvKiByZW5kZXIgcG9vbCBvdmVyZmxvdzsgd2Ugd2lsbCByZWR1Y2UgdGhlIHJlbmRlciBiYW5kIGJ5IGhhbGYgKi8KLSAgICAgICAgd2lkdGggPj49IDE7Ci0KLSAgICAgICAgLyogVGhpcyBpcyB0b28gY29tcGxleCBmb3IgYSBzaW5nbGUgc2NhbmxpbmU7IHRoZXJlIG11c3QgKi8KLSAgICAgICAgLyogYmUgc29tZSBwcm9ibGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCB3aWR0aCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNygoICJncmF5X2NvbnZlcnRfZ2x5cGg6IHJvdHRlbiBnbHlwaFxuIiApKTsKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGJhbmQrKzsKLSAgICAgICAgYmFuZFsxXSAgPSBiYW5kWzBdOwotICAgICAgICBiYW5kWzBdICs9IHdpZHRoOwotICAgICAgfSB3aGlsZSAoIGJhbmQgPj0gYmFuZHMgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBncmF5X3Jhc3Rlcl9yZW5kZXIoIEZUX1Jhc3RlciAgICAgICAgICAgICAgICByYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfUmFzdGVyX1BhcmFtcyogIHBhcmFtcyApCi0gIHsKLSAgICBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSAgICA9IChjb25zdCBGVF9PdXRsaW5lKilwYXJhbXMtPnNvdXJjZTsKLSAgICBjb25zdCBGVF9CaXRtYXAqICAgdGFyZ2V0X21hcCA9IHBhcmFtcy0+dGFyZ2V0OwotICAgIEZUX0JCb3ggICAgICAgICAgICBjYm94LCBjbGlwOwotCi0jaWZuZGVmIEZUX1NUQVRJQ19SQVNURVIKLSAgICBncmF5X1RXb3JrZXIgIHdvcmtlclsxXTsKLSNlbmRpZgotCi0KLSAgICBpZiAoICFyYXN0ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiB0aGlzIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCBtb25vY2hyb21lIHJlbmRlcmluZyAqLwotICAgIGlmICggISggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0FBICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX01vZGUgKTsKLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIC8qIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgb3V0bGluZSBpcyBlbXB0eSAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCB8fCBvdXRsaW5lLT5uX2NvbnRvdXJzIDw9IDAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoICFvdXRsaW5lLT5jb250b3VycyB8fCAhb3V0bGluZS0+cG9pbnRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzICE9Ci0gICAgICAgICAgIG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAxXSArIDEgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIHJhcy5vdXRsaW5lID0gKm91dGxpbmU7Ci0KLSAgICBpZiAoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19ESVJFQ1QgKQotICAgIHsKLSAgICAgIGlmICggIXBhcmFtcy0+Z3JheV9zcGFucyApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICByYXMucmVuZGVyX3NwYW4gICAgICA9IChGVF9SYXN0ZXJfU3Bhbl9GdW5jKXBhcmFtcy0+Z3JheV9zcGFuczsKLSAgICAgIHJhcy5yZW5kZXJfc3Bhbl9kYXRhID0gcGFyYW1zLT51c2VyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogaWYgZGlyZWN0IG1vZGUgaXMgbm90IHNldCwgd2UgbXVzdCBoYXZlIGEgdGFyZ2V0IGJpdG1hcCAqLwotICAgICAgaWYgKCAhdGFyZ2V0X21hcCApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgICBpZiAoICF0YXJnZXRfbWFwLT53aWR0aCB8fCAhdGFyZ2V0X21hcC0+cm93cyApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICBpZiAoICF0YXJnZXRfbWFwLT5idWZmZXIgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgICAgaWYgKCB0YXJnZXRfbWFwLT5waXRjaCA8IDAgKQotICAgICAgICByYXMudGFyZ2V0Lm9yaWdpbiA9IHRhcmdldF9tYXAtPmJ1ZmZlcjsKLSAgICAgIGVsc2UKLSAgICAgICAgcmFzLnRhcmdldC5vcmlnaW4gPSB0YXJnZXRfbWFwLT5idWZmZXIKLSAgICAgICAgICAgICAgKyAoIHRhcmdldF9tYXAtPnJvd3MgLSAxICkgKiAodW5zaWduZWQgaW50KXRhcmdldF9tYXAtPnBpdGNoOwotCi0gICAgICByYXMudGFyZ2V0LnBpdGNoID0gdGFyZ2V0X21hcC0+cGl0Y2g7Ci0KLSAgICAgIHJhcy5yZW5kZXJfc3BhbiAgICAgID0gKEZUX1Jhc3Rlcl9TcGFuX0Z1bmMpTlVMTDsKLSAgICAgIHJhcy5yZW5kZXJfc3Bhbl9kYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBGVF9PdXRsaW5lX0dldF9DQm94KCBvdXRsaW5lLCAmY2JveCApOwotCi0gICAgLyogcmVqZWN0IHRvbyBsYXJnZSBvdXRsaW5lIGNvb3JkaW5hdGVzICovCi0gICAgaWYgKCBjYm94LnhNaW4gPCAtMHgxMDAwMDAwTCB8fCBjYm94LnhNYXggPiAweDEwMDAwMDBMIHx8Ci0gICAgICAgICBjYm94LnlNaW4gPCAtMHgxMDAwMDAwTCB8fCBjYm94LnlNYXggPiAweDEwMDAwMDBMICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICAvKiB0cnVuY2F0ZSB0aGUgYm91bmRpbmcgYm94IHRvIGludGVnZXIgcGl4ZWxzICovCi0gICAgY2JveC54TWluID0gY2JveC54TWluID4+IDY7Ci0gICAgY2JveC55TWluID0gY2JveC55TWluID4+IDY7Ci0gICAgY2JveC54TWF4ID0gKCBjYm94LnhNYXggKyA2MyApID4+IDY7Ci0gICAgY2JveC55TWF4ID0gKCBjYm94LnlNYXggKyA2MyApID4+IDY7Ci0KLSAgICAvKiBjb21wdXRlIGNsaXBwaW5nIGJveCAqLwotICAgIGlmICggISggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCApICkKLSAgICB7Ci0gICAgICAvKiBjb21wdXRlIGNsaXAgYm94IGZyb20gdGFyZ2V0IHBpeG1hcCAqLwotICAgICAgY2xpcC54TWluID0gMDsKLSAgICAgIGNsaXAueU1pbiA9IDA7Ci0gICAgICBjbGlwLnhNYXggPSAoRlRfUG9zKXRhcmdldF9tYXAtPndpZHRoOwotICAgICAgY2xpcC55TWF4ID0gKEZUX1Bvcyl0YXJnZXRfbWFwLT5yb3dzOwotICAgIH0KLSAgICBlbHNlIGlmICggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0NMSVAgKQotICAgICAgY2xpcCA9IHBhcmFtcy0+Y2xpcF9ib3g7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNsaXAueE1pbiA9IC0zMjc2OEw7Ci0gICAgICBjbGlwLnlNaW4gPSAtMzI3NjhMOwotICAgICAgY2xpcC54TWF4ID0gIDMyNzY3TDsKLSAgICAgIGNsaXAueU1heCA9ICAzMjc2N0w7Ci0gICAgfQotCi0gICAgLyogY2xpcCB0byB0YXJnZXQgYml0bWFwLCBleGl0IGlmIG5vdGhpbmcgdG8gZG8gKi8KLSAgICByYXMubWluX2V4ID0gRlRfTUFYKCBjYm94LnhNaW4sIGNsaXAueE1pbiApOwotICAgIHJhcy5taW5fZXkgPSBGVF9NQVgoIGNib3gueU1pbiwgY2xpcC55TWluICk7Ci0gICAgcmFzLm1heF9leCA9IEZUX01JTiggY2JveC54TWF4LCBjbGlwLnhNYXggKTsKLSAgICByYXMubWF4X2V5ID0gRlRfTUlOKCBjYm94LnlNYXgsIGNsaXAueU1heCApOwotCi0gICAgaWYgKCByYXMubWF4X2V4IDw9IHJhcy5taW5fZXggfHwgcmFzLm1heF9leSA8PSByYXMubWluX2V5ICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGdyYXlfY29udmVydF9nbHlwaCggUkFTX1ZBUiApOwotICB9Ci0KLQotICAvKioqKiBSQVNURVIgT0JKRUNUIENSRUFUSU9OOiBJbiBzdGFuZC1hbG9uZSBtb2RlLCB3ZSBzaW1wbHkgdXNlICoqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBhIHN0YXRpYyBvYmplY3QuICAgICAgICAgICAgICAgICAgICoqKioqLwotCi0jaWZkZWYgU1RBTkRBTE9ORV8KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfcmFzdGVyX25ldyggdm9pZCogICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX1Jhc3RlciogIGFyYXN0ZXIgKQotICB7Ci0gICAgc3RhdGljIGdyYXlfVFJhc3RlciAgdGhlX3Jhc3RlcjsKLQotICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0KLQotICAgICphcmFzdGVyID0gKEZUX1Jhc3RlcikmdGhlX3Jhc3RlcjsKLSAgICBGVF9aRVJPKCAmdGhlX3Jhc3RlciApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmFzdGVyX2RvbmUoIEZUX1Jhc3RlciAgcmFzdGVyICkKLSAgewotICAgIC8qIG5vdGhpbmcgKi8KLSAgICBGVF9VTlVTRUQoIHJhc3RlciApOwotICB9Ci0KLSNlbHNlIC8qICFTVEFOREFMT05FXyAqLwotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9yYXN0ZXJfbmV3KCBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgRlRfUmFzdGVyKiAgYXJhc3RlciApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIGdyYXlfUFJhc3RlciAgcmFzdGVyID0gTlVMTDsKLQotCi0gICAgKmFyYXN0ZXIgPSAwOwotICAgIGlmICggIUZUX0FMTE9DKCByYXN0ZXIsIHNpemVvZiAoIGdyYXlfVFJhc3RlciApICkgKQotICAgIHsKLSAgICAgIHJhc3Rlci0+bWVtb3J5ID0gbWVtb3J5OwotICAgICAgKmFyYXN0ZXIgICAgICAgPSAoRlRfUmFzdGVyKXJhc3RlcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmFzdGVyX2RvbmUoIEZUX1Jhc3RlciAgcmFzdGVyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gKEZUX01lbW9yeSkoKGdyYXlfUFJhc3RlcilyYXN0ZXIpLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIHJhc3RlciApOwotICB9Ci0KLSNlbmRpZiAvKiAhU1RBTkRBTE9ORV8gKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmFzdGVyX3Jlc2V0KCBGVF9SYXN0ZXIgICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIHBvb2xfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBwb29sX3NpemUgKQotICB7Ci0gICAgRlRfVU5VU0VEKCByYXN0ZXIgKTsKLSAgICBGVF9VTlVTRUQoIHBvb2xfYmFzZSApOwotICAgIEZUX1VOVVNFRCggcG9vbF9zaXplICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9yYXN0ZXJfc2V0X21vZGUoIEZUX1Jhc3RlciAgICAgIHJhc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VOVVNFRCggcmFzdGVyICk7Ci0gICAgRlRfVU5VU0VEKCBtb2RlICk7Ci0gICAgRlRfVU5VU0VEKCBhcmdzICk7Ci0KLQotICAgIHJldHVybiAwOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIH0KLQotCi0gIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoCi0gICAgZnRfZ3JheXNfcmFzdGVyLAotCi0gICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCi0KLSAgICAoRlRfUmFzdGVyX05ld19GdW5jKSAgICAgZ3JheV9yYXN0ZXJfbmV3LCAgICAgICAvKiByYXN0ZXJfbmV3ICAgICAgKi8KLSAgICAoRlRfUmFzdGVyX1Jlc2V0X0Z1bmMpICAgZ3JheV9yYXN0ZXJfcmVzZXQsICAgICAvKiByYXN0ZXJfcmVzZXQgICAgKi8KLSAgICAoRlRfUmFzdGVyX1NldF9Nb2RlX0Z1bmMpZ3JheV9yYXN0ZXJfc2V0X21vZGUsICAvKiByYXN0ZXJfc2V0X21vZGUgKi8KLSAgICAoRlRfUmFzdGVyX1JlbmRlcl9GdW5jKSAgZ3JheV9yYXN0ZXJfcmVuZGVyLCAgICAvKiByYXN0ZXJfcmVuZGVyICAgKi8KLSAgICAoRlRfUmFzdGVyX0RvbmVfRnVuYykgICAgZ3JheV9yYXN0ZXJfZG9uZSAgICAgICAvKiByYXN0ZXJfZG9uZSAgICAgKi8KLSAgKQotCi0KLS8qIEVORCAqLwotCi0KLS8qIExvY2FsIFZhcmlhYmxlczogKi8KLS8qIGNvZGluZzogdXRmLTggICAgKi8KLS8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRncmF5cy5oIGIvc3JjL3Ntb290aC9mdGdyYXlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDQ3ZGEuLjAwMDAwMDAKLS0tIGEvc3JjL3Ntb290aC9mdGdyYXlzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdyYXlzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc21vb3RoIHJlbmRlcmVyIGRlY2xhcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRHUkFZU19IXwotI2RlZmluZSBGVEdSQVlTX0hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICBleHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLSNpZmRlZiBTVEFOREFMT05FXwotI2luY2x1ZGUgImZ0aW1hZ2UuaCIKLSNlbHNlCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSCAvKiBmb3IgRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLSNpbmNsdWRlIEZUX0lNQUdFX0gKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUbyBtYWtlIGZ0Z3JheXMuaCBpbmRlcGVuZGVudCBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2UgY2hlY2sgICAgICAgKi8KLSAgLyogd2hldGhlciBGVF9FWFBPUlRfVkFSIGhhcyBiZWVuIGRlZmluZWQgYWxyZWFkeS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPbiBzb21lIHN5c3RlbXMgYW5kIGNvbXBpbGVycyAoV2luMzIgbW9zdGx5KSwgYW4gZXh0cmEga2V5d29yZCBpcyAgICAgKi8KLSAgLyogbmVjZXNzYXJ5IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgYXMgYSBETEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FWFBPUlRfVkFSCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9SYXN0ZXJfRnVuY3MgKSAgZnRfZ3JheXNfcmFzdGVyOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICB9Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEZUR1JBWVNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRzbWVycnMuaCBiL3NyYy9zbW9vdGgvZnRzbWVycnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyOGM2MS4uMDAwMDAwMAotLS0gYS9zcmMvc21vb3RoL2Z0c21lcnJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNtZXJycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgc21vb3RoIHJlbmRlcmVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIHNtb290aCByZW5kZXJlciBlcnJvciBlbnVtZXJhdGlvbiAgICAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBGVFNNRVJSU19IXwotI2RlZmluZSBGVFNNRVJSU19IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBTbW9vdGhfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1Ntb290aAotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogRlRTTUVSUlNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRzbW9vdGguYyBiL3NyYy9zbW9vdGgvZnRzbW9vdGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxMmU2Ni4uMDAwMDAwMAotLS0gYS9zcmMvc21vb3RoL2Z0c21vb3RoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzbW9vdGguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFudGktYWxpYXNpbmcgcmVuZGVyZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSAiZnRzbW9vdGguaCIKLSNpbmNsdWRlICJmdGdyYXlzLmgiCi0jaW5jbHVkZSAiZnRzcGljLmgiCi0KLSNpbmNsdWRlICJmdHNtZXJycy5oIgotCi0KLSAgLyogaW5pdGlhbGl6ZSByZW5kZXJlciAtLSBpbml0IGl0cyByYXN0ZXIgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9pbml0KCBGVF9SZW5kZXJlciAgcmVuZGVyICkKLSAgewotICAgIHJlbmRlci0+Y2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX3Jlc2V0KCByZW5kZXItPnJhc3RlciwgTlVMTCwgMCApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qIHNldHMgcmVuZGVyLXNwZWNpZmljIG1vZGUgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9zZXRfbW9kZSggRlRfUmVuZGVyZXIgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgbW9kZV90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGRhdGEgKQotICB7Ci0gICAgLyogd2Ugc2ltcGx5IHBhc3MgaXQgdG8gdGhlIHJhc3RlciAqLwotICAgIHJldHVybiByZW5kZXItPmNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9zZXRfbW9kZSggcmVuZGVyLT5yYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX3RhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKTsKLSAgfQotCi0gIC8qIHRyYW5zZm9ybSBhIGdpdmVuIGdseXBoIGltYWdlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfdHJhbnNmb3JtKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgZGVsdGEgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSByZW5kZXItPmdseXBoX2Zvcm1hdCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggbWF0cml4ICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmc2xvdC0+b3V0bGluZSwgbWF0cml4ICk7Ci0KLSAgICBpZiAoIGRlbHRhICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmc2xvdC0+b3V0bGluZSwgZGVsdGEtPngsIGRlbHRhLT55ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHJldHVybiB0aGUgZ2x5cGgncyBjb250cm9sIGJveCAqLwotICBzdGF0aWMgdm9pZAotICBmdF9zbW9vdGhfZ2V0X2Nib3goIEZUX1JlbmRlcmVyICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94KiAgICAgIGNib3ggKQotICB7Ci0gICAgRlRfWkVSTyggY2JveCApOwotCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgPT0gcmVuZGVyLT5nbHlwaF9mb3JtYXQgKQotICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJnNsb3QtPm91dGxpbmUsIGNib3ggKTsKLSAgfQotCi0KLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIHJlcXVpcmVkX21vZGUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gJnNsb3QtPm91dGxpbmU7Ci0gICAgRlRfQml0bWFwKiAgIGJpdG1hcCAgPSAmc2xvdC0+Yml0bWFwOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnkgID0gcmVuZGVyLT5yb290Lm1lbW9yeTsKLSAgICBGVF9CQm94ICAgICAgY2JveDsKLSAgICBGVF9Qb3MgICAgICAgeF9zaGlmdCA9IDA7Ci0gICAgRlRfUG9zICAgICAgIHlfc2hpZnQgPSAwOwotICAgIEZUX1BvcyAgICAgICB4X2xlZnQsIHlfdG9wOwotICAgIEZUX1BvcyAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXRjaDsKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLSAgICBGVF9Qb3MgICAgICAgaGVpZ2h0X29yZywgd2lkdGhfb3JnOwotI2VuZGlmCi0gICAgRlRfSW50ICAgICAgIGhtdWwgICAgPSAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEICk7Ci0gICAgRlRfSW50ICAgICAgIHZtdWwgICAgPSAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1YgKTsKLQotICAgIEZUX1Jhc3Rlcl9QYXJhbXMgIHBhcmFtczsKLQotICAgIEZUX0Jvb2wgIGhhdmVfb3V0bGluZV9zaGlmdGVkID0gRkFMU0U7Ci0gICAgRlRfQm9vbCAgaGF2ZV9idWZmZXIgICAgICAgICAgPSBGQUxTRTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HCi0KLSAgICBGVF9MY2RGaXZlVGFwRmlsdGVyICAgICAgbGNkX3dlaWdodHMgICAgICAgID0geyAwIH07Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgIGhhdmVfY3VzdG9tX3dlaWdodCA9IEZBTFNFOwotICAgIEZUX0JpdG1hcF9MY2RGaWx0ZXJGdW5jICBsY2RfZmlsdGVyX2Z1bmMgICAgPSBOVUxMOwotCi0KLSAgICBpZiAoIHNsb3QtPmZhY2UgKQotICAgIHsKLSAgICAgIEZUX0NoYXIgIGk7Ci0KLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBGVF9MQ0RfRklMVEVSX0ZJVkVfVEFQUzsgaSsrICkKLSAgICAgICAgaWYgKCBzbG90LT5mYWNlLT5pbnRlcm5hbC0+bGNkX3dlaWdodHNbaV0gIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBoYXZlX2N1c3RvbV93ZWlnaHQgPSBUUlVFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgTENEIGZpbHRlciBjYW4gYmUgc2V0IGxpYnJhcnktd2lkZSBhbmQgcGVyLWZhY2UuICBGYWNlIG92ZXJyaWRlcwotICAgICAqIGxpYnJhcnkuICBJZiB0aGUgZmFjZSBmaWx0ZXIgd2VpZ2h0cyBhcmUgYWxsIHplcm8gKHRoZSBkZWZhdWx0KSwgaXQKLSAgICAgKiBtZWFucyB0aGF0IHRoZSBsaWJyYXJ5IGRlZmF1bHQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICovCi0gICAgaWYgKCBoYXZlX2N1c3RvbV93ZWlnaHQgKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBBIHBlci1mb250IGZpbHRlciBpcyBzZXQuICBJdCBhbHdheXMgdXNlcyB0aGUgZGVmYXVsdCA1LXRhcAotICAgICAgICogaW4tcGxhY2UgRklSIGZpbHRlci4KLSAgICAgICAqLwotICAgICAgZnRfbWVtY3B5KCBsY2Rfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgc2xvdC0+ZmFjZS0+aW50ZXJuYWwtPmxjZF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICBGVF9MQ0RfRklMVEVSX0ZJVkVfVEFQUyApOwotICAgICAgbGNkX2ZpbHRlcl9mdW5jID0gZnRfbGNkX2ZpbHRlcl9maXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogVGhlIGZhY2UncyBsY2Rfd2VpZ2h0cyBpcyB7MCwgMCwgMCwgMCwgMH0sIG1lYW5pbmcgYHVzZSBsaWJyYXJ5Ci0gICAgICAgKiBkZWZhdWx0Jy4gIElmIHRoZSBsaWJyYXJ5IGlzIHNldCB0byB1c2Ugbm8gTENEIGZpbHRlcmluZwotICAgICAgICogKGxjZF9maWx0ZXJfZnVuYyA9PSBOVUxMKSwgYGxjZF9maWx0ZXJfZnVuYycgaGVyZSBpcyBhbHNvIHNldCB0bwotICAgICAgICogTlVMTCBhbmQgdGhlIHRlc3RzIGZ1cnRoZXIgYmVsb3cgcGFzcyBvdmVyIHRoZSBmaWx0ZXJpbmcgcHJvY2Vzcy4KLSAgICAgICAqLwotICAgICAgZnRfbWVtY3B5KCBsY2Rfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgc2xvdC0+bGlicmFyeS0+bGNkX3dlaWdodHMsCi0gICAgICAgICAgICAgICAgIEZUX0xDRF9GSUxURVJfRklWRV9UQVBTICk7Ci0gICAgICBsY2RfZmlsdGVyX2Z1bmMgPSBzbG90LT5saWJyYXJ5LT5sY2RfZmlsdGVyX2Z1bmM7Ci0gICAgfQotCi0jZW5kaWYgLypGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyAqLwotCi0gICAgLyogY2hlY2sgZ2x5cGggaW1hZ2UgZm9ybWF0ICovCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgIT0gcmVuZGVyLT5nbHlwaF9mb3JtYXQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBtb2RlICovCi0gICAgaWYgKCBtb2RlICE9IHJlcXVpcmVkX21vZGUgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIENhbm5vdF9SZW5kZXJfR2x5cGggKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIG9yaWdpbiApCi0gICAgewotICAgICAgeF9zaGlmdCA9IG9yaWdpbi0+eDsKLSAgICAgIHlfc2hpZnQgPSBvcmlnaW4tPnk7Ci0gICAgfQotCi0gICAgLyogY29tcHV0ZSB0aGUgY29udHJvbCBib3gsIGFuZCBncmlkIGZpdCBpdCAqLwotICAgIC8qIHRha2luZyBpbnRvIGFjY291bnQgdGhlIG9yaWdpbiBzaGlmdCAgICAgKi8KLSAgICBGVF9PdXRsaW5lX0dldF9DQm94KCBvdXRsaW5lLCAmY2JveCApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLSAgICAvKiBhZGQgbWluaW1hbCBwYWRkaW5nIGZvciBMQ0QgZmlsdGVyIGRlcGVuZGluZyBvbiBzcGVjaWZpYyB3ZWlnaHRzICovCi0gICAgaWYgKCBsY2RfZmlsdGVyX2Z1bmMpCi0gICAgewotICAgICAgaWYgKCBobXVsICkKLSAgICAgIHsKLSAgICAgICAgY2JveC54TWF4ICs9IGxjZF93ZWlnaHRzWzRdID8gNDMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGNkX3dlaWdodHNbM10gPyAyMiA6IDA7Ci0gICAgICAgIGNib3gueE1pbiAtPSBsY2Rfd2VpZ2h0c1swXSA/IDQzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxjZF93ZWlnaHRzWzFdID8gMjIgOiAwOwotICAgICAgfQotCi0gICAgICBpZiAoIHZtdWwgKQotICAgICAgewotICAgICAgICBjYm94LnlNYXggKz0gbGNkX3dlaWdodHNbNF0gPyA0MwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsY2Rfd2VpZ2h0c1szXSA/IDIyIDogMDsKLSAgICAgICAgY2JveC55TWluIC09IGxjZF93ZWlnaHRzWzBdID8gNDMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGNkX3dlaWdodHNbMV0gPyAyMiA6IDA7Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBjYm94LnhNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueE1pbiArIHhfc2hpZnQgKTsKLSAgICBjYm94LnlNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueU1pbiArIHlfc2hpZnQgKTsKLSAgICBjYm94LnhNYXggPSBGVF9QSVhfQ0VJTCggY2JveC54TWF4ICsgeF9zaGlmdCApOwotICAgIGNib3gueU1heCA9IEZUX1BJWF9DRUlMKCBjYm94LnlNYXggKyB5X3NoaWZ0ICk7Ci0KLSAgICB4X3NoaWZ0IC09IGNib3gueE1pbjsKLSAgICB5X3NoaWZ0IC09IGNib3gueU1pbjsKLQotICAgIHhfbGVmdCAgPSBjYm94LnhNaW4gPj4gNjsKLSAgICB5X3RvcCAgID0gY2JveC55TWF4ID4+IDY7Ci0KLSAgICB3aWR0aCAgPSAoRlRfVUxvbmcpKCBjYm94LnhNYXggLSBjYm94LnhNaW4gKSA+PiA2OwotICAgIGhlaWdodCA9IChGVF9VTG9uZykoIGNib3gueU1heCAtIGNib3gueU1pbiApID4+IDY7Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLSAgICB3aWR0aF9vcmcgID0gd2lkdGg7Ci0gICAgaGVpZ2h0X29yZyA9IGhlaWdodDsKLSNlbmRpZgotCi0gICAgcGl0Y2ggPSB3aWR0aDsKLSAgICBpZiAoIGhtdWwgKQotICAgIHsKLSAgICAgIHdpZHRoICo9IDM7Ci0gICAgICBwaXRjaCAgPSBGVF9QQURfQ0VJTCggd2lkdGgsIDQgKTsKLSAgICB9Ci0KLSAgICBpZiAoIHZtdWwgKQotICAgICAgaGVpZ2h0ICo9IDM7Ci0KLSAgICAvKgotICAgICAqIFhYWDogb24gMTZiaXQgc3lzdGVtLCB3ZSByZXR1cm4gYW4gZXJyb3IgZm9yIGh1Z2UgYml0bWFwCi0gICAgICogdG8gcHJldmVudCBhbiBvdmVyZmxvdy4KLSAgICAgKi8KLSAgICBpZiAoIHhfbGVmdCA+IEZUX0lOVF9NQVggfHwgeV90b3AgPiBGVF9JTlRfTUFYIHx8Ci0gICAgICAgICB4X2xlZnQgPCBGVF9JTlRfTUlOIHx8IHlfdG9wIDwgRlRfSU5UX01JTiApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9QaXhlbF9TaXplICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogUmVxdWlyZWQgY2hlY2sgaXMgKHBpdGNoICogaGVpZ2h0IDwgRlRfVUxPTkdfTUFYKSwgICAgICAgICovCi0gICAgLyogYnV0IHdlIGNhcmUgcmVhbGlzdGljIGNhc2VzIG9ubHkuICBBbHdheXMgcGl0Y2ggPD0gd2lkdGguICovCi0gICAgaWYgKCB3aWR0aCA+IDB4N0ZGRiB8fCBoZWlnaHQgPiAweDdGRkYgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYzogZ2x5cGggdG9vIGxhcmdlOiAldSB4ICV1XG4iLAotICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0ICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggUmFzdGVyX092ZXJmbG93ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogcmVsZWFzZSBvbGQgYml0bWFwIGJ1ZmZlciAqLwotICAgIGlmICggc2xvdC0+aW50ZXJuYWwtPmZsYWdzICYgRlRfR0xZUEhfT1dOX0JJVE1BUCApCi0gICAgewotICAgICAgRlRfRlJFRSggYml0bWFwLT5idWZmZXIgKTsKLSAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyAmPSB+RlRfR0xZUEhfT1dOX0JJVE1BUDsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBuZXcgb25lICovCi0gICAgaWYgKCBGVF9BTExPQyggYml0bWFwLT5idWZmZXIsIChGVF9VTG9uZykoIHBpdGNoICogaGVpZ2h0ICkgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgZWxzZQotICAgICAgaGF2ZV9idWZmZXIgPSBUUlVFOwotCi0gICAgc2xvdC0+aW50ZXJuYWwtPmZsYWdzIHw9IEZUX0dMWVBIX09XTl9CSVRNQVA7Ci0KLSAgICBzbG90LT5mb3JtYXQgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVA7Ci0gICAgc2xvdC0+Yml0bWFwX2xlZnQgPSAoRlRfSW50KXhfbGVmdDsKLSAgICBzbG90LT5iaXRtYXBfdG9wICA9IChGVF9JbnQpeV90b3A7Ci0KLSAgICBiaXRtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVk7Ci0gICAgYml0bWFwLT5udW1fZ3JheXMgID0gMjU2OwotICAgIGJpdG1hcC0+d2lkdGggICAgICA9ICh1bnNpZ25lZCBpbnQpd2lkdGg7Ci0gICAgYml0bWFwLT5yb3dzICAgICAgID0gKHVuc2lnbmVkIGludCloZWlnaHQ7Ci0gICAgYml0bWFwLT5waXRjaCAgICAgID0gcGl0Y2g7Ci0KLSAgICAvKiB0cmFuc2xhdGUgb3V0bGluZSB0byByZW5kZXIgaXQgaW50byB0aGUgYml0bWFwICovCi0gICAgaWYgKCB4X3NoaWZ0IHx8IHlfc2hpZnQgKQotICAgIHsKLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBvdXRsaW5lLCB4X3NoaWZ0LCB5X3NoaWZ0ICk7Ci0gICAgICBoYXZlX291dGxpbmVfc2hpZnRlZCA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyogc2V0IHVwIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMudGFyZ2V0ID0gYml0bWFwOwotICAgIHBhcmFtcy5zb3VyY2UgPSBvdXRsaW5lOwotICAgIHBhcmFtcy5mbGFncyAgPSBGVF9SQVNURVJfRkxBR19BQTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HCi0KLSAgICAvKiBpbXBsb2RlIG91dGxpbmUgaWYgbmVlZGVkICovCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgcG9pbnRzICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHBvaW50c19lbmQgPSBwb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHZlYzsKLQotCi0gICAgICBpZiAoIGhtdWwgKQotICAgICAgICBmb3IgKCB2ZWMgPSBwb2ludHM7IHZlYyA8IHBvaW50c19lbmQ7IHZlYysrICkKLSAgICAgICAgICB2ZWMtPnggKj0gMzsKLQotICAgICAgaWYgKCB2bXVsICkKLSAgICAgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCi0gICAgICAgICAgdmVjLT55ICo9IDM7Ci0gICAgfQotCi0gICAgLyogcmVuZGVyIG91dGxpbmUgaW50byB0aGUgYml0bWFwICovCi0gICAgZXJyb3IgPSByZW5kZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlci0+cmFzdGVyLCAmcGFyYW1zICk7Ci0KLSAgICAvKiBkZWZsYXRlIG91dGxpbmUgaWYgbmVlZGVkICovCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgcG9pbnRzICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHBvaW50c19lbmQgPSBwb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHZlYzsKLQotCi0gICAgICBpZiAoIGhtdWwgKQotICAgICAgICBmb3IgKCB2ZWMgPSBwb2ludHM7IHZlYyA8IHBvaW50c19lbmQ7IHZlYysrICkKLSAgICAgICAgICB2ZWMtPnggLz0gMzsKLQotICAgICAgaWYgKCB2bXVsICkKLSAgICAgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCi0gICAgICAgICAgdmVjLT55IC89IDM7Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGxjZF9maWx0ZXJfZnVuYyApCi0gICAgICBsY2RfZmlsdGVyX2Z1bmMoIGJpdG1hcCwgbW9kZSwgbGNkX3dlaWdodHMgKTsKLQotI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICovCi0KLSAgICAvKiByZW5kZXIgb3V0bGluZSBpbnRvIGJpdG1hcCAqLwotICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogZXhwYW5kIGl0IGhvcml6b250YWxseSAqLwotICAgIGlmICggaG11bCApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGxpbmUgPSBiaXRtYXAtPmJ1ZmZlcjsKLSAgICAgIEZUX1VJbnQgICBoaDsKLQotCi0gICAgICBmb3IgKCBoaCA9IGhlaWdodF9vcmc7IGhoID4gMDsgaGgtLSwgbGluZSArPSBwaXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgICB4eDsKLSAgICAgICAgRlRfQnl0ZSogIGVuZCA9IGxpbmUgKyB3aWR0aDsKLQotCi0gICAgICAgIGZvciAoIHh4ID0gd2lkdGhfb3JnOyB4eCA+IDA7IHh4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgcGl4ZWwgPSBsaW5lW3h4LTFdOwotCi0KLSAgICAgICAgICBlbmRbLTNdID0gKEZUX0J5dGUpcGl4ZWw7Ci0gICAgICAgICAgZW5kWy0yXSA9IChGVF9CeXRlKXBpeGVsOwotICAgICAgICAgIGVuZFstMV0gPSAoRlRfQnl0ZSlwaXhlbDsKLSAgICAgICAgICBlbmQgICAgLT0gMzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIGV4cGFuZCBpdCB2ZXJ0aWNhbGx5ICovCi0gICAgaWYgKCB2bXVsICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgcmVhZCAgPSBiaXRtYXAtPmJ1ZmZlciArICggaGVpZ2h0IC0gaGVpZ2h0X29yZyApICogcGl0Y2g7Ci0gICAgICBGVF9CeXRlKiAgd3JpdGUgPSBiaXRtYXAtPmJ1ZmZlcjsKLSAgICAgIEZUX1VJbnQgICBoaDsKLQotCi0gICAgICBmb3IgKCBoaCA9IGhlaWdodF9vcmc7IGhoID4gMDsgaGgtLSApCi0gICAgICB7Ci0gICAgICAgIGZ0X21lbWNweSggd3JpdGUsIHJlYWQsIHBpdGNoICk7Ci0gICAgICAgIHdyaXRlICs9IHBpdGNoOwotCi0gICAgICAgIGZ0X21lbWNweSggd3JpdGUsIHJlYWQsIHBpdGNoICk7Ci0gICAgICAgIHdyaXRlICs9IHBpdGNoOwotCi0gICAgICAgIGZ0X21lbWNweSggd3JpdGUsIHJlYWQsIHBpdGNoICk7Ci0gICAgICAgIHdyaXRlICs9IHBpdGNoOwotICAgICAgICByZWFkICArPSBwaXRjaDsKLSAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KLQotICAgIC8qIGV2ZXJ5dGhpbmcgaXMgZmluZTsgZG9uJ3QgZGVhbGxvY2F0ZSBidWZmZXIgKi8KLSAgICBoYXZlX2J1ZmZlciA9IEZBTFNFOwotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGhhdmVfb3V0bGluZV9zaGlmdGVkICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBvdXRsaW5lLCAteF9zaGlmdCwgLXlfc2hpZnQgKTsKLSAgICBpZiAoIGhhdmVfYnVmZmVyICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBiaXRtYXAtPmJ1ZmZlciApOwotICAgICAgc2xvdC0+aW50ZXJuYWwtPmZsYWdzICY9IH5GVF9HTFlQSF9PV05fQklUTUFQOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiApCi0gIHsKLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTElHSFQgKQotICAgICAgbW9kZSA9IEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLQotICAgIHJldHVybiBmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMoIHJlbmRlciwgc2xvdCwgbW9kZSwgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCApOwotICB9Ci0KLQotICAvKiBjb252ZXJ0IGEgc2xvdCdzIGdseXBoIGltYWdlIGludG8gYSBob3Jpem9udGFsIExDRCBiaXRtYXAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9yZW5kZXJfbGNkKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICBlcnJvciA9IGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyggcmVuZGVyLCBzbG90LCBtb2RlLCBvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX0xDRCApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgIHNsb3QtPmJpdG1hcC5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9MQ0Q7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGNvbnZlcnQgYSBzbG90J3MgZ2x5cGggaW1hZ2UgaW50byBhIHZlcnRpY2FsIExDRCBiaXRtYXAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9yZW5kZXJfbGNkX3YoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgb3JpZ2luICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIGVycm9yID0gZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKCByZW5kZXIsIHNsb3QsIG1vZGUsIG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUkVOREVSX01PREVfTENEX1YgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBzbG90LT5iaXRtYXAucGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTENEX1Y7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9SRU5ERVJFUigKLSAgICBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3MsCi0KLSAgICAgIEZUX01PRFVMRV9SRU5ERVJFUiwKLSAgICAgIHNpemVvZiAoIEZUX1JlbmRlcmVyUmVjICksCi0KLSAgICAgICJzbW9vdGgiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgTlVMTCwgICAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKWZ0X3Ntb290aF9pbml0LCAgLyogbW9kdWxlX2luaXQgICAqLwotICAgICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSBOVUxMLCAgICAgICAgICAgIC8qIG1vZHVsZV9kb25lICAgKi8KLSAgICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgTlVMTCwgICAgICAgICAgICAvKiBnZXRfaW50ZXJmYWNlICovCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSAgIGZ0X3Ntb290aF9yZW5kZXIsICAgICAvKiByZW5kZXJfZ2x5cGggICAgKi8KLSAgICAoRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYylmdF9zbW9vdGhfdHJhbnNmb3JtLCAgLyogdHJhbnNmb3JtX2dseXBoICovCi0gICAgKEZUX1JlbmRlcmVyX0dldENCb3hGdW5jKSAgZnRfc21vb3RoX2dldF9jYm94LCAgIC8qIGdldF9nbHlwaF9jYm94ICAqLwotICAgIChGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYykgIGZ0X3Ntb290aF9zZXRfbW9kZSwgICAvKiBzZXRfbW9kZSAgICAgICAgKi8KLQotICAgIChGVF9SYXN0ZXJfRnVuY3MqKSZGVF9HUkFZU19SQVNURVJfR0VUICAgICAgICAgICAvKiByYXN0ZXJfY2xhc3MgICAgKi8KLSAgKQotCi0KLSAgRlRfREVGSU5FX1JFTkRFUkVSKAotICAgIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3MsCi0KLSAgICAgIEZUX01PRFVMRV9SRU5ERVJFUiwKLSAgICAgIHNpemVvZiAoIEZUX1JlbmRlcmVyUmVjICksCi0KLSAgICAgICJzbW9vdGgtbGNkIiwKLSAgICAgIDB4MTAwMDBMLAotICAgICAgMHgyMDAwMEwsCi0KLSAgICAgIE5VTEwsICAgIC8qIG1vZHVsZSBzcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilmdF9zbW9vdGhfaW5pdCwgIC8qIG1vZHVsZV9pbml0ICAgKi8KLSAgICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgTlVMTCwgICAgICAgICAgICAvKiBtb2R1bGVfZG9uZSAgICovCi0gICAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIE5VTEwsICAgICAgICAgICAgLyogZ2V0X2ludGVyZmFjZSAqLwotCi0gICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCi0KLSAgICAoRlRfUmVuZGVyZXJfUmVuZGVyRnVuYykgICBmdF9zbW9vdGhfcmVuZGVyX2xjZCwgIC8qIHJlbmRlcl9nbHlwaCAgICAqLwotICAgIChGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jKWZ0X3Ntb290aF90cmFuc2Zvcm0sICAgLyogdHJhbnNmb3JtX2dseXBoICovCi0gICAgKEZUX1JlbmRlcmVyX0dldENCb3hGdW5jKSAgZnRfc21vb3RoX2dldF9jYm94LCAgICAvKiBnZXRfZ2x5cGhfY2JveCAgKi8KLSAgICAoRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMpICBmdF9zbW9vdGhfc2V0X21vZGUsICAgIC8qIHNldF9tb2RlICAgICAgICAqLwotCi0gICAgKEZUX1Jhc3Rlcl9GdW5jcyopJkZUX0dSQVlTX1JBU1RFUl9HRVQgICAgICAgICAgICAvKiByYXN0ZXJfY2xhc3MgICAgKi8KLSAgKQotCi0KLSAgRlRfREVGSU5FX1JFTkRFUkVSKAotICAgIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzLAotCi0gICAgICBGVF9NT0RVTEVfUkVOREVSRVIsCi0gICAgICBzaXplb2YgKCBGVF9SZW5kZXJlclJlYyApLAotCi0gICAgICAic21vb3RoLWxjZHYiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgTlVMTCwgICAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKWZ0X3Ntb290aF9pbml0LCAgLyogbW9kdWxlX2luaXQgICAqLwotICAgICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSBOVUxMLCAgICAgICAgICAgIC8qIG1vZHVsZV9kb25lICAgKi8KLSAgICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgTlVMTCwgICAgICAgICAgICAvKiBnZXRfaW50ZXJmYWNlICovCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSAgIGZ0X3Ntb290aF9yZW5kZXJfbGNkX3YsICAvKiByZW5kZXJfZ2x5cGggICAgKi8KLSAgICAoRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYylmdF9zbW9vdGhfdHJhbnNmb3JtLCAgICAgLyogdHJhbnNmb3JtX2dseXBoICovCi0gICAgKEZUX1JlbmRlcmVyX0dldENCb3hGdW5jKSAgZnRfc21vb3RoX2dldF9jYm94LCAgICAgIC8qIGdldF9nbHlwaF9jYm94ICAqLwotICAgIChGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYykgIGZ0X3Ntb290aF9zZXRfbW9kZSwgICAgICAvKiBzZXRfbW9kZSAgICAgICAgKi8KLQotICAgIChGVF9SYXN0ZXJfRnVuY3MqKSZGVF9HUkFZU19SQVNURVJfR0VUICAgICAgICAgICAgICAvKiByYXN0ZXJfY2xhc3MgICAgKi8KLSAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9mdHNtb290aC5oIGIvc3JjL3Ntb290aC9mdHNtb290aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGZkNjU3Li4wMDAwMDAwCi0tLSBhL3NyYy9zbW9vdGgvZnRzbW9vdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c21vb3RoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBbnRpLWFsaWFzaW5nIHJlbmRlcmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVFNNT09USF9IXwotI2RlZmluZSBGVFNNT09USF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfUkVOREVSX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzcyApCi0KLSAgRlRfREVDTEFSRV9SRU5ERVJFUiggZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcyApCi0KLSAgRlRfREVDTEFSRV9SRU5ERVJFUiggZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3MgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUU01PT1RIX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc21vb3RoL2Z0c3BpYy5jIGIvc3JjL3Ntb290aC9mdHNwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4OWJlMy4uMDAwMDAwMAotLS0gYS9zcmMvc21vb3RoL2Z0c3BpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3BpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3Igc21vb3RoIG1vZHVsZS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJmdHNwaWMuaCIKLSNpbmNsdWRlICJmdHNtZXJycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gZnRncmF5cy5jICovCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19mdF9ncmF5c19yYXN0ZXIoIEZUX1Jhc3Rlcl9GdW5jcyogIGZ1bmNzICk7Ci0KLQotICB2b2lkCi0gIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnNtb290aCApCi0gICAgewotICAgICAgU21vb3RoUElDKiAgY29udGFpbmVyID0gKFNtb290aFBJQyopcGljX2NvbnRhaW5lci0+c21vb3RoOwotCi0KLSAgICAgIGlmICggLS1jb250YWluZXItPnJlZl9jb3VudCApCi0gICAgICAgIHJldHVybjsKLQotICAgICAgRlRfRlJFRSggY29udGFpbmVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5zbW9vdGggPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgU21vb3RoUElDKiAgICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFsc28gc2VydmUgc21vb3RoX2xjZCBhbmQgc21vb3RoX2xjZHYgcmVuZGVyZXJzLAotICAgICAgIGl0IGltcGxlbWVudHMgcmVmZXJlbmNlIGNvdW50aW5nICovCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5zbW9vdGggKQotICAgIHsKLSAgICAgICgoU21vb3RoUElDKilwaWNfY29udGFpbmVyLT5zbW9vdGgpLT5yZWZfY291bnQrKzsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+c21vb3RoID0gY29udGFpbmVyOwotCi0gICAgY29udGFpbmVyLT5yZWZfY291bnQgPSAxOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgRlRfSW5pdF9DbGFzc19mdF9ncmF5c19yYXN0ZXIoICZjb250YWluZXItPmZ0X2dyYXlzX3Jhc3RlciApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiByZS1yb3V0ZSB0aGVzZSBpbml0IGFuZCBmcmVlIGZ1bmN0aW9ucyB0byB0aGUgYWJvdmUgZnVuY3Rpb25zICovCi0gIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgcmV0dXJuIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCggbGlicmFyeSApOwotICB9Ci0KLQotICB2b2lkCi0gIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIHJldHVybiBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIGxpYnJhcnkgKTsKLSAgfQotCi0KLSAgdm9pZAotICBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRzcGljLmggYi9zcmMvc21vb3RoL2Z0c3BpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGRkMWM3Li4wMDAwMDAwCi0tLSBhL3NyYy9zbW9vdGgvZnRzcGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHNtb290aCBtb2R1bGUuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRTUElDX0hfCi0jZGVmaW5lIEZUU1BJQ19IXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9HUkFZU19SQVNURVJfR0VUICBmdF9ncmF5c19yYXN0ZXIKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgU21vb3RoUElDXwotICB7Ci0gICAgaW50ICAgICAgICAgICAgICByZWZfY291bnQ7Ci0gICAgRlRfUmFzdGVyX0Z1bmNzICBmdF9ncmF5c19yYXN0ZXI7Ci0KLSAgfSBTbW9vdGhQSUM7Ci0KLQotI2RlZmluZSBHRVRfUElDKCBsaWIgKSBcCi0gICAgICAgICAgKCAoU21vb3RoUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLnNtb290aCApICkKLSNkZWZpbmUgRlRfR1JBWVNfUkFTVEVSX0dFVCAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmZ0X2dyYXlzX3Jhc3RlciApCi0KLQotICAvKiBzZWUgZnRzcGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIHZvaWQKLSAgZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIHZvaWQKLSAgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVFNQSUNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvbW9kdWxlLm1rIGIvc3JjL3Ntb290aC9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNGU5YjEuLjAwMDAwMDAKLS0tIGEvc3JjL3Ntb290aC9tb2R1bGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgc21vb3RoIHJlbmRlcmVyIG1vZHVsZSBkZWZpbml0aW9uCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1GVE1PRFVMRV9IX0NPTU1BTkRTICs9IFNNT09USF9SRU5ERVJFUgotCi1kZWZpbmUgU01PT1RIX1JFTkRFUkVSCi0kKE9QRU5fRFJJVkVSKSBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzICQoQ0xPU0VfRFJJVkVSKQotJChFQ0hPX0RSSVZFUilzbW9vdGggICAgJChFQ0hPX0RSSVZFUl9ERVNDKWFudGktYWxpYXNlZCBiaXRtYXAgcmVuZGVyZXIkKEVDSE9fRFJJVkVSX0RPTkUpCi0kKE9QRU5fRFJJVkVSKSBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcyAkKENMT1NFX0RSSVZFUikKLSQoRUNIT19EUklWRVIpc21vb3RoICAgICQoRUNIT19EUklWRVJfREVTQylhbnRpLWFsaWFzZWQgYml0bWFwIHJlbmRlcmVyIGZvciBMQ0RzJChFQ0hPX0RSSVZFUl9ET05FKQotJChPUEVOX0RSSVZFUikgRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzICQoQ0xPU0VfRFJJVkVSKQotJChFQ0hPX0RSSVZFUilzbW9vdGggICAgJChFQ0hPX0RSSVZFUl9ERVNDKWFudGktYWxpYXNlZCBiaXRtYXAgcmVuZGVyZXIgZm9yIHZlcnRpY2FsIExDRHMkKEVDSE9fRFJJVkVSX0RPTkUpCi1lbmRlZgotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9ydWxlcy5tayBiL3NyYy9zbW9vdGgvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZGM5YmMuLjAwMDAwMDAKLS0tIGEvc3JjL3Ntb290aC9ydWxlcy5taworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBzbW9vdGggcmVuZGVyZXIgbW9kdWxlIGJ1aWxkIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIHNtb290aCBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1TTU9PVEhfRElSIDo9ICQoU1JDX0RJUikvc21vb3RoCi0KLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotU01PT1RIX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKFNNT09USF9ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBzbW9vdGggZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1TTU9PVEhfRFJWX1NSQyA6PSAkKFNNT09USF9ESVIpL2Z0Z3JheXMuYyAgXAotICAgICAgICAgICAgICAgICAgJChTTU9PVEhfRElSKS9mdHNtb290aC5jIFwKLSAgICAgICAgICAgICAgICAgICQoU01PT1RIX0RJUikvZnRzcGljLmMKLQotCi0jIHNtb290aCBkcml2ZXIgaGVhZGVycwotIwotU01PT1RIX0RSVl9IIDo9ICQoU01PT1RIX0RSVl9TUkM6JWM9JWgpICBcCi0gICAgICAgICAgICAgICAgJChTTU9PVEhfRElSKS9mdHNtZXJycy5oCi0KLQotIyBzbW9vdGggZHJpdmVyIG9iamVjdChzKQotIwotIyAgIFNNT09USF9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMuCi0jICAgU01PT1RIX0RSVl9PQkpfUyBpcyB1c2VkIGR1cmluZyBgc2luZ2xlJyBidWlsZHMuCi0jCi1TTU9PVEhfRFJWX09CSl9NIDo9ICQoU01PT1RIX0RSVl9TUkM6JChTTU9PVEhfRElSKS8lLmM9JChPQkpfRElSKS8lLiRPKQotU01PT1RIX0RSVl9PQkpfUyA6PSAkKE9CSl9ESVIpL3Ntb290aC4kTwotCi0jIHNtb290aCBkcml2ZXIgc291cmNlIGZpbGUgZm9yIHNpbmdsZSBidWlsZAotIwotU01PT1RIX0RSVl9TUkNfUyA6PSAkKFNNT09USF9ESVIpL3Ntb290aC5jCi0KLQotIyBzbW9vdGggZHJpdmVyIC0gc2luZ2xlIG9iamVjdAotIwotJChTTU9PVEhfRFJWX09CSl9TKTogJChTTU9PVEhfRFJWX1NSQ19TKSAkKFNNT09USF9EUlZfU1JDKSBcCi0gICAgICAgICAgICAgICAgICAgICAkKEZSRUVUWVBFX0gpICQoU01PT1RIX0RSVl9IKQotCSQoU01PT1RIX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKFNNT09USF9EUlZfU1JDX1MpKQotCi0KLSMgc21vb3RoIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChTTU9PVEhfRElSKS8lLmMgJChGUkVFVFlQRV9IKSAkKFNNT09USF9EUlZfSCkKLQkkKFNNT09USF9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoU01PT1RIX0RSVl9PQkpfUykKLURSVl9PQkpTX00gKz0gJChTTU9PVEhfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvc21vb3RoL3Ntb290aC5jIGIvc3JjL3Ntb290aC9zbW9vdGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0NjBkOS4uMDAwMDAwMAotLS0gYS9zcmMvc21vb3RoL3Ntb290aC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc21vb3RoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGFudGktYWxpYXNpbmcgcmFzdGVyZXIgbW9kdWxlIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAiZnRncmF5cy5jIgotI2luY2x1ZGUgImZ0c21vb3RoLmMiCi0jaW5jbHVkZSAiZnRzcGljLmMiCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvSmFtZmlsZSBiL3NyYy90b29scy9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzUxNjFlLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIEphbWZpbGUgZm9yIHNyYy90b29scwotIwotU3ViRGlyIEZUMl9UT1Agc3JjIHRvb2xzIDsKLQotTWFpbiAgYXBpbmFtZXMgOiBhcGluYW1lcy5jIDsKZGlmZiAtLWdpdCBhL3NyYy90b29scy9hZmJsdWUucGwgYi9zcmMvdG9vbHMvYWZibHVlLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdiNjMwLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9hZmJsdWUucGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NTEgKzAsMCBAQAotIyEgL3Vzci9iaW4vcGVybCAtdwotIyAtKi0gUGVybCAtKi0KLSMKLSMgYWZibHVlLnBsCi0jCi0jIFByb2Nlc3MgYSBibHVlIHpvbmUgY2hhcmFjdGVyIGRhdGEgZmlsZS4KLSMKLSMgQ29weXJpZ2h0IDIwMTMtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLSMgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKLSMgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0jIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotIyB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLXVzZSBzdHJpY3Q7Ci11c2Ugd2FybmluZ3M7Ci11c2UgRW5nbGlzaCAnLW5vX21hdGNoX3ZhcnMnOwotdXNlIG9wZW4gJzpzdGQnLCAnOmVuY29kaW5nKFVURi04KSc7Ci0KLQotbXkgJHByb2cgPSAkUFJPR1JBTV9OQU1FOwotJHByb2cgPX4gc3wgLiogLyB8fHg7ICAgICAgIyBSZW1vdmUgcGF0aC4KLQotZGllICJ1c2FnZTogJHByb2cgZGF0YWZpbGUgPCBpbmZpbGUgPiBvdXRmaWxlXG4iIGlmICQjQVJHViAhPSAwOwotCi0KLW15ICRkYXRhZmlsZSA9ICRBUkdWWzBdOwotCi1teSAlZGl2ZXJzaW9uczsgICAgICAgICMgVGhlIGV4dHJhY3RlZCBhbmQgbWFzc2FnZWQgZGF0YSBmcm9tIGBkYXRhZmlsZScuCi1teSBAZWxzZV9zdGFjazsgICAgICAgICMgQm9vbGVhbnMgdG8gdHJhY2sgZWxzZS1jbGF1c2VzLgotbXkgQG5hbWVfc3RhY2s7ICAgICAgICAjIFN0YWNrIG9mIGludGVnZXJzIHVzZWQgZm9yIG5hbWVzIG9mIGF1eC4gdmFyaWFibGVzLgotCi1teSAkY3Vycl9lbnVtOyAgICAgICAgICMgTmFtZSBvZiB0aGUgY3VycmVudCBlbnVtZXJhdGlvbi4KLW15ICRjdXJyX2FycmF5OyAgICAgICAgIyBOYW1lIG9mIHRoZSBjdXJyZW50IGFycmF5LgotbXkgJGN1cnJfbWF4OyAgICAgICAgICAjIE5hbWUgb2YgdGhlIGN1cnJlbnQgbWF4aW11bSB2YWx1ZS4KLQotbXkgJGN1cnJfZW51bV9lbGVtZW50OyAjIE5hbWUgb2YgdGhlIGN1cnJlbnQgZW51bWVyYXRpb24gZWxlbWVudC4KLW15ICRjdXJyX29mZnNldDsgICAgICAgIyBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIGN1cnJlbnQgYXV4LiB2YXJpYWJsZS4KLW15ICRjdXJyX2VsZW1fc2l6ZTsgICAgIyBUaGUgbnVtYmVyIG9mIG5vbi1zcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBjdXJyZW50IHN0cmluZyBvcgotICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgYmxvY2suCi0KLW15ICRoYXZlX3NlY3Rpb25zID0gMDsgIyBCb29sZWFuOyBzZXQgaWYgc3RhcnQgb2YgYSBzZWN0aW9uIGhhcyBiZWVuIHNlZW4uCi1teSAkaGF2ZV9zdHJpbmdzOyAgICAgICMgQm9vbGVhbjsgc2V0IGlmIGN1cnJlbnQgc2VjdGlvbiBjb250YWlucyBzdHJpbmdzLgotbXkgJGhhdmVfYmxvY2tzOyAgICAgICAjIEJvb2xlYW47IHNldCBpZiBjdXJyZW50IHNlY3Rpb24gY29udGFpbnMgYmxvY2tzLgotCi1teSAkaGF2ZV9lbnVtX2VsZW1lbnQ7ICMgQm9vbGVhbjsgc2V0IGlmIHdlIGhhdmUgYW4gZW51bWVyYXRpb24gZWxlbWVudC4KLW15ICRpbl9zdHJpbmc7ICAgICAgICAgIyBCb29sZWFuOyBzZXQgaWYgYSBzdHJpbmcgaGFzIGJlZW4gcGFyc2VkLgotCi1teSAkbnVtX3NlY3Rpb25zID0gMDsgICMgTnVtYmVyIG9mIHNlY3Rpb25zIHNlZW4gc28gZmFyLgotCi1teSAkbGFzdF9hdXg7ICAgICAgICAgICMgTmFtZSBvZiBsYXN0IGF1eGlsaWFyeSB2YXJpYWJsZS4KLQotCi0jIFJlZ3VsYXIgZXhwcmVzc2lvbnMuCi0KLSMgWzx3cz5dIDxlbnVtX25hbWU+IDx3cz4gPGFycmF5X25hbWU+IDx3cz4gPG1heF9uYW1lPiBbPHdzPl0gJzonIFs8d3M+XSAnXG4nCi1teSAkc2VjdGlvbl9yZSA9IHFyLyBeIFxzKiAoXFMrKSBccysgKFxTKykgXHMrIChcUyspIFxzKiA6IFxzKiAkIC94OwotCi0jIFs8d3M+XSA8ZW51bV9lbGVtZW50X25hbWU+IFs8d3M+XSAnXG4nCi1teSAkZW51bV9lbGVtZW50X3JlID0gcXIvIF4gXHMqICggW0EtWmEtejAtOV9dKyApIFxzKiAkIC94OwotCi0jICcjJyA8cHJlcHJvY2Vzc29yIGRpcmVjdGl2ZT4gJ1xuJwotbXkgJHByZXByb2Nlc3Nvcl9yZSA9IHFyLyBeIFwjIC94OwotCi0jIFs8d3M+XSAnLycgJy8nIDxjb21tZW50PiAnXG4nCi1teSAkY29tbWVudF9yZSA9IHFyfCBeIFxzKiAvLyB8eDsKLQotIyBlbXB0eSBsaW5lCi1teSAkd2hpdGVzcGFjZV9vbmx5X3JlID0gcXIvIF4gXHMqICQgL3g7Ci0KLSMgWzx3cz5dICciJyA8c3RyaW5nPiAnIicgWzx3cz5dICdcbicgICg8c3RyaW5nPiBkb2Vzbid0IGNvbnRhaW4gbmV3bGluZXMpCi1teSAkc3RyaW5nX3JlID0gcXIvIF4gXHMqCi0gICAgICAgICAgICAgICAgICAgICAgICIgKCAoPz4gKD86ICg/PiBbXiJcXF0rICkgfCBcXC4gKSogKSApICIKLSAgICAgICAgICAgICAgICAgICAgICAgXHMqICQgL3g7Ci0KLSMgWzx3cz5dICd7JyA8YmxvY2s+ICd9JyBbPHdzPl0gJ1xuJyAgKDxibG9jaz4gY2FuIGNvbnRhaW4gbmV3bGluZXMpCi1teSAkYmxvY2tfc3RhcnRfcmUgPSBxci8gXiBccyogXHsgL3g7Ci0KLSMgV2UgbmVlZCB0aGUgY2FwdHVyaW5nIGdyb3VwIGZvciBgc3BsaXQnIHRvIG1ha2UgaXQgcmV0dXJuIHRoZSBzZXBhcmF0b3IKLSMgdG9rZW5zIChpLmUuLCB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBicmFjZSkgYWxzby4KLW15ICRicmFjZV9yZSA9IHFyLyAoIFt7fV0gKSAveDsKLQotCi1zdWIgV2FybgotewotICBteSAkbWVzc2FnZSA9IHNoaWZ0OwotICB3YXJuICIkZGF0YWZpbGU6JElOUFVUX0xJTkVfTlVNQkVSOiB3YXJuaW5nOiAkbWVzc2FnZVxuIjsKLX0KLQotCi1zdWIgRGllCi17Ci0gIG15ICRtZXNzYWdlID0gc2hpZnQ7Ci0gIGRpZSAiJGRhdGFmaWxlOiRJTlBVVF9MSU5FX05VTUJFUjogZXJyb3I6ICRtZXNzYWdlXG4iOwotfQotCi0KLW15ICR3YXJuZWRfYmVmb3JlID0gMDsKLQotc3ViIHdhcm5fYmVmb3JlCi17Ci0gIFdhcm4oImRhdGEgYmVmb3JlIGZpcnN0IHNlY3Rpb24gZ2V0cyBpZ25vcmVkIikgdW5sZXNzICR3YXJuZWRfYmVmb3JlOwotICAkd2FybmVkX2JlZm9yZSA9IDE7Ci19Ci0KLQotc3ViIHN0cmlwX25ld2xpbmUKLXsKLSAgY2hvbXA7Ci0gIHMvIFx4MEQgJCAvL3g7Ci19Ci0KLQotc3ViIGVuZF9jdXJyX3N0cmluZwotewotICAjIEFwcGVuZCBmaW5hbCBudWxsIGJ5dGUgdG8gc3RyaW5nLgotICBpZiAoJGhhdmVfc3RyaW5ncykKLSAgewotICAgIHB1c2ggQHskZGl2ZXJzaW9uc3skY3Vycl9hcnJheX19LCAiICAgICdcXDAnLFxuIiBpZiAkaW5fc3RyaW5nOwotCi0gICAgJGN1cnJfb2Zmc2V0Kys7Ci0gICAgJGluX3N0cmluZyA9IDA7Ci0gIH0KLX0KLQotCi1zdWIgdXBkYXRlX21heF9lbGVtX3NpemUKLXsKLSAgaWYgKCRjdXJyX2VsZW1fc2l6ZSkKLSAgewotICAgIG15ICRtYXggPSBwb3AgQHskZGl2ZXJzaW9uc3skY3Vycl9tYXh9fTsKLSAgICAkbWF4ID0gJGN1cnJfZWxlbV9zaXplIGlmICRjdXJyX2VsZW1fc2l6ZSA+ICRtYXg7Ci0gICAgcHVzaCBAeyRkaXZlcnNpb25zeyRjdXJyX21heH19LCAkbWF4OwotICB9Ci19Ci0KLQotc3ViIGNvbnZlcnRfbm9uX2FzY2lpX2NoYXIKLXsKLSAgIyBBIFVURi04IGNoYXJhY3RlciBvdXRzaWRlIG9mIHRoZSBwcmludGFibGUgQVNDSUkgcmFuZ2UsIHdpdGggcG9zc2libHkgYQotICAjIGxlYWRpbmcgYmFja3NsYXNoIGNoYXJhY3Rlci4KLSAgbXkgJHMgPSBzaGlmdDsKLQotICAjIEhlcmUgd2UgY291bnQgY2hhcmFjdGVycywgbm90IGJ5dGVzLgotICAkY3Vycl9lbGVtX3NpemUgKz0gbGVuZ3RoICRzOwotCi0gIHV0Zjg6OmVuY29kZSgkcyk7Ci0gICRzID0gdWMgdW5wYWNrICdIKicsICRzOwotCi0gICRjdXJyX29mZnNldCArPSAkcyA9fiBzL1xHKC4uKS8nXFx4JDEnLCAvc2c7Ci0KLSAgcmV0dXJuICRzOwotfQotCi0KLXN1YiBjb252ZXJ0X2FzY2lpX2NoYXJzCi17Ci0gICMgQSBzZXJpZXMgb2YgQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgcHJpbnRhYmxlIHJhbmdlLgotICBteSAkcyA9IHNoaWZ0OwotCi0gICMgV2UgcmVkdWNlIG11bHRpcGxlIHNwYWNlIGNoYXJhY3RlcnMgdG8gYSBzaW5nbGUgb25lLgotICAkcyA9fiBzLyArLyAvZzsKLQotICAjIENvdW50IGFsbCBub24tc3BhY2UgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBgKCknIGFwcGxpZXMgYSBsaXN0IGNvbnRleHQKLSAgIyB0byB0aGUgY2FwdHVyZSB0aGF0IGlzIHVzZWQgdG8gY291bnQgdGhlIGVsZW1lbnRzLgotICAkY3Vycl9lbGVtX3NpemUgKz0gKCkgPSAkcyA9fiAvW14gXS9nOwotCi0gICRjdXJyX29mZnNldCArPSAkcyA9fiBzL1xHKC4pLyckMScsIC9nOwotCi0gIHJldHVybiAkczsKLX0KLQotCi1zdWIgY29udmVydF9saXRlcmFsCi17Ci0gIG15ICRzID0gc2hpZnQ7Ci0gIG15ICRvcmlnID0gJHM7Ci0KLSAgIyBBU0NJSSBwcmludGFibGVzIGFuZCBzcGFjZQotICBteSAkc2FmZV9yZSA9ICdceDIwLVx4N0UnOwotICAjIEFTQ0lJIHByaW50YWJsZXMgYW5kIHNwYWNlLCBubyBiYWNrc2xhc2gKLSAgbXkgJHNhZmVfbm9fYmFja3NsYXNoX3JlID0gJ1x4MjAtXHg1Qlx4NUQtXHg3RSc7Ci0KLSAgJHMgPX4gc3sKLSAgICAgICAgICAgKD86IFxcPyAoIFteJHNhZmVfcmVdICkKLSAgICAgICAgICAgICAgIHwgKCAoPzogWyRzYWZlX25vX2JhY2tzbGFzaF9yZV0KLSAgICAgICAgICAgICAgICAgICAgICAgfCBcXCBbJHNhZmVfcmVdICkrICkgKQotICAgICAgICAgfQotICAgICAgICAgewotICAgICAgICAgICBkZWZpbmVkKCQxKSA/IGNvbnZlcnRfbm9uX2FzY2lpX2NoYXIoJDEpCi0gICAgICAgICAgICAgICAgICAgICAgIDogY29udmVydF9hc2NpaV9jaGFycygkMikKLSAgICAgICAgIH1lZ3g7Ci0KLSAgICMgV2UgYXNzdW1lIHRoYXQgYCRvcmlnJyBkb2Vzbid0IGNvbnRhaW4gYCovJwotICAgcmV0dXJuICRzIC4gIiAvKiAkb3JpZyAqLyI7Ci19Ci0KLQotc3ViIGF1eF9uYW1lCi17Ci0gIHJldHVybiAiYWZfYmx1ZV8iIC4gJG51bV9zZWN0aW9ucy4gIl8iIC4gam9pbignXycsIEBuYW1lX3N0YWNrKTsKLX0KLQotCi1zdWIgYXV4X25hbWVfbmV4dAotewotICAkbmFtZV9zdGFja1skI25hbWVfc3RhY2tdKys7Ci0gIG15ICRuYW1lID0gYXV4X25hbWUoKTsKLSAgJG5hbWVfc3RhY2tbJCNuYW1lX3N0YWNrXS0tOwotCi0gIHJldHVybiAkbmFtZTsKLX0KLQotCi1zdWIgZW51bV92YWxfc3RyaW5nCi17Ci0gICMgQnVpbGQgc3RyaW5nIHRoYXQgaG9sZHMgY29kZSB0byBzYXZlIHRoZSBjdXJyZW50IG9mZnNldCBpbiBhbgotICAjIGVudW1lcmF0aW9uIGVsZW1lbnQuCi0gIG15ICRhdXggPSBzaGlmdDsKLQotICBteSAkYWRkID0gKCRsYXN0X2F1eCBlcSAiYWZfYmx1ZV8iIC4gJG51bV9zZWN0aW9ucyAuICJfMCIgKQotICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgIDogIiRsYXN0X2F1eCArICI7Ci0KLSAgcmV0dXJuICIgICAgJGF1eCA9ICRhZGQkY3Vycl9vZmZzZXQsXG4iOwotfQotCi0KLQotIyBQcm9jZXNzIGRhdGEgZmlsZS4KLQotb3BlbihEQVRBLCAkZGF0YWZpbGUpIHx8IGRpZSAiJHByb2c6IGNhbid0IG9wZW4gXGAkZGF0YWZpbGUnOiAkT1NfRVJST1JcbiI7Ci0KLXdoaWxlICg8REFUQT4pCi17Ci0gIHN0cmlwX25ld2xpbmUoKTsKLQotICBuZXh0IGlmIC8kY29tbWVudF9yZS87Ci0gIG5leHQgaWYgLyR3aGl0ZXNwYWNlX29ubHlfcmUvOwotCi0gIGlmICgvJHNlY3Rpb25fcmUvKQotICB7Ci0gICAgV2FybigicHJldmlvdXMgc2VjdGlvbiBpcyBlbXB0eSIpIGlmICgkaGF2ZV9zZWN0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRoYXZlX3N0cmluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICEkaGF2ZV9ibG9ja3MpOwotCi0gICAgZW5kX2N1cnJfc3RyaW5nKCk7Ci0gICAgdXBkYXRlX21heF9lbGVtX3NpemUoKTsKLQotICAgICMgU2F2ZSBjYXB0dXJlZCBncm91cHMgZnJvbSBgc2VjdGlvbl9yZScuCi0gICAgJGN1cnJfZW51bSA9ICQxOwotICAgICRjdXJyX2FycmF5ID0gJDI7Ci0gICAgJGN1cnJfbWF4ID0gJDM7Ci0KLSAgICAkY3Vycl9lbnVtX2VsZW1lbnQgPSAiIjsKLSAgICAkY3Vycl9vZmZzZXQgPSAwOwotCi0gICAgV2Fybigib3ZlcndyaXRpbmcgYWxyZWFkeSBkZWZpbmVkIGVudW1lcmF0aW9uIFxgJGN1cnJfZW51bSciKQotICAgICAgaWYgZXhpc3RzKCRkaXZlcnNpb25zeyRjdXJyX2VudW19KTsKLSAgICBXYXJuKCJvdmVyd3JpdGluZyBhbHJlYWR5IGRlZmluZWQgYXJyYXkgXGAkY3Vycl9hcnJheSciKQotICAgICAgaWYgZXhpc3RzKCRkaXZlcnNpb25zeyRjdXJyX2FycmF5fSk7Ci0gICAgV2Fybigib3ZlcndyaXRpbmcgYWxyZWFkeSBkZWZpbmVkIG1heGltdW0gdmFsdWUgXGAkY3Vycl9tYXgnIikKLSAgICAgIGlmIGV4aXN0cygkZGl2ZXJzaW9uc3skY3Vycl9tYXh9KTsKLQotICAgICRkaXZlcnNpb25zeyRjdXJyX2VudW19ID0gW107Ci0gICAgJGRpdmVyc2lvbnN7JGN1cnJfYXJyYXl9ID0gW107Ci0gICAgJGRpdmVyc2lvbnN7JGN1cnJfbWF4fSA9IFtdOwotCi0gICAgcHVzaCBAeyRkaXZlcnNpb25zeyRjdXJyX21heH19LCAwOwotCi0gICAgQG5hbWVfc3RhY2sgPSAoKTsKLSAgICBwdXNoIEBuYW1lX3N0YWNrLCAwOwotCi0gICAgJGhhdmVfc2VjdGlvbnMgPSAxOwotICAgICRoYXZlX3N0cmluZ3MgPSAwOwotICAgICRoYXZlX2Jsb2NrcyA9IDA7Ci0KLSAgICAkaGF2ZV9lbnVtX2VsZW1lbnQgPSAwOwotICAgICRpbl9zdHJpbmcgPSAwOwotCi0gICAgJG51bV9zZWN0aW9ucysrOwotICAgICRjdXJyX2VsZW1fc2l6ZSA9IDA7Ci0KLSAgICAkbGFzdF9hdXggPSBhdXhfbmFtZSgpOwotCi0gICAgbmV4dDsKLSAgfQotCi0gIGlmICgvJHByZXByb2Nlc3Nvcl9yZS8pCi0gIHsKLSAgICBpZiAoJGhhdmVfc2VjdGlvbnMpCi0gICAgewotICAgICAgIyBIYXZpbmcgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscyBjb21wbGljYXRlcyB0aGUgY29tcHV0YXRpb24gb2YKLSAgICAgICMgY29ycmVjdCBvZmZzZXQgdmFsdWVzLiAgV2UgaGF2ZSB0byBpbnRyb2R1Y2UgYXV4aWxpYXJ5IGVudW1lcmF0aW9uCi0gICAgICAjIGVsZW1lbnRzIHdpdGggdGhlIG5hbWUgYGFmX2JsdWVfPHM+XzxuMT5fPG4yPl8uLi4nIHRoYXQgc3RvcmUKLSAgICAgICMgb2Zmc2V0cyB0byBiZSB1c2VkIGluIGNvbmRpdGlvbmFsIGNsYXVzZXMuICBgPHM+JyBpcyB0aGUgbnVtYmVyIG9mCi0gICAgICAjIHNlY3Rpb25zIHNlZW4gc28gZmFyLCBgPG4xPicgaXMgdGhlIG51bWJlciBvZiBgI2lmJyBhbmQgYCNlbmRpZicKLSAgICAgICMgY29uZGl0aW9uYWxzIHNlZW4gc28gZmFyIGluIHRoZSB0b3Btb3N0IGxldmVsLCBgPG4yPicgdGhlIG51bWJlciBvZgotICAgICAgIyBgI2lmJyBhbmQgYCNlbmRpZicgY29uZGl0aW9uYWxzIHNlZW4gc28gZmFyIG9uZSBsZXZlbCBkZWVwZXIsIGV0Yy4KLSAgICAgICMgQXMgYSBjb25zZXF1ZW5jZSwgdW5ldmVuIHZhbHVlcyBhcmUgdXNlZCB3aXRoaW4gYSBjbGF1c2UsIGFuZCBldmVuCi0gICAgICAjIHZhbHVlcyBhZnRlciBhIGNsYXVzZSwgc2luY2UgdGhlIEMgc3RhbmRhcmQgZG9lc24ndCBhbGxvdyB0aGUKLSAgICAgICMgcmVkZWZpbml0aW9uIG9mIGFuIGVudW1lcmF0aW9uIHZhbHVlLiAgRm9yIGV4YW1wbGUsIHRoZSBuYW1lCi0gICAgICAjIGBhZl9ibHVlXzVfMV82JyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBlbnVtZXJhdGlvbiB2YWx1ZXMgaW4gdGhlIGZpZnRoCi0gICAgICAjIHNlY3Rpb24gYWZ0ZXIgdGhlIHRoaXJkIChzZWNvbmQtbGV2ZWwpIGlmLWNsYXVzZSB3aXRoaW4gdGhlIGZpcnN0Ci0gICAgICAjICh0b3AtbGV2ZWwpIGlmLWNsYXVzZS4gIEFmdGVyIHRoZSBmaXJzdCB0b3AtbGV2ZWwgY2xhdXNlIGhhcwotICAgICAgIyBmaW5pc2hlZCwgYGFmX2JsdWVfNV8yJyBpcyB1c2VkLiAgVGhlIGN1cnJlbnQgb2Zmc2V0IGlzIHRoZW4KLSAgICAgICMgcmVsYXRpdmUgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgY3VycmVudCBhdXhpbGlhcnkgZWxlbWVudC4KLQotICAgICAgaWYgKC8gXiBcIyBccyogaWYgL3gpCi0gICAgICB7Ci0gICAgICAgIHB1c2ggQGVsc2Vfc3RhY2ssIDA7Ci0KLSAgICAgICAgJG5hbWVfc3RhY2tbJCNuYW1lX3N0YWNrXSsrOwotCi0gICAgICAgIHB1c2ggQHskZGl2ZXJzaW9uc3skY3Vycl9lbnVtfX0sIGVudW1fdmFsX3N0cmluZyhhdXhfbmFtZSgpKTsKLSAgICAgICAgJGxhc3RfYXV4ID0gYXV4X25hbWUoKTsKLQotICAgICAgICBwdXNoIEBuYW1lX3N0YWNrLCAwOwotCi0gICAgICAgICRjdXJyX29mZnNldCA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNpZiAoLyBeIFwjIFxzKiBlbGlmIC94KQotICAgICAgewotICAgICAgICBEaWUoInVuYmFsYW5jZWQgI2VsaWYiKSB1bmxlc3MgQGVsc2Vfc3RhY2s7Ci0KLSAgICAgICAgcG9wIEBuYW1lX3N0YWNrOwotCi0gICAgICAgIHB1c2ggQHskZGl2ZXJzaW9uc3skY3Vycl9lbnVtfX0sIGVudW1fdmFsX3N0cmluZyhhdXhfbmFtZV9uZXh0KCkpOwotICAgICAgICAkbGFzdF9hdXggPSBhdXhfbmFtZSgpOwotCi0gICAgICAgIHB1c2ggQG5hbWVfc3RhY2ssIDA7Ci0KLSAgICAgICAgJGN1cnJfb2Zmc2V0ID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2lmICgvIF4gXCMgXHMqIGVsc2UgL3gpCi0gICAgICB7Ci0gICAgICAgIG15ICRwcmV2X2Vsc2UgPSBwb3AgQGVsc2Vfc3RhY2s7Ci0gICAgICAgIERpZSgidW5iYWxhbmNlZCAjZWxzZSIpIHVubGVzcyBkZWZpbmVkKCRwcmV2X2Vsc2UpOwotICAgICAgICBEaWUoIiNlbHNlIGFscmVhZHkgc2VlbiIpIGlmICRwcmV2X2Vsc2U7Ci0gICAgICAgIHB1c2ggQGVsc2Vfc3RhY2ssIDE7Ci0KLSAgICAgICAgcG9wIEBuYW1lX3N0YWNrOwotCi0gICAgICAgIHB1c2ggQHskZGl2ZXJzaW9uc3skY3Vycl9lbnVtfX0sIGVudW1fdmFsX3N0cmluZyhhdXhfbmFtZV9uZXh0KCkpOwotICAgICAgICAkbGFzdF9hdXggPSBhdXhfbmFtZSgpOwotCi0gICAgICAgIHB1c2ggQG5hbWVfc3RhY2ssIDA7Ci0KLSAgICAgICAgJGN1cnJfb2Zmc2V0ID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2lmICgvIF4gKFwjIFxzKikgZW5kaWYgL3gpCi0gICAgICB7Ci0gICAgICAgIG15ICRwcmV2X2Vsc2UgPSBwb3AgQGVsc2Vfc3RhY2s7Ci0gICAgICAgIERpZSgidW5iYWxhbmNlZCAjZW5kaWYiKSB1bmxlc3MgZGVmaW5lZCgkcHJldl9lbHNlKTsKLQotICAgICAgICBwb3AgQG5hbWVfc3RhY2s7Ci0KLSAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBlbHNlLWNsYXVzZSBmb3IgYW4gaWYtY2xhdXNlLCB3ZSBhZGQgb25lLiAgVGhpcyBpcwotICAgICAgICAjIG5lY2Vzc2FyeSB0byBoYXZlIGNvcnJlY3Qgb2Zmc2V0cy4KLSAgICAgICAgaWYgKCEkcHJldl9lbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgIyBVc2UgYW1vdW50IG9mIHdoaXRlc3BhY2UgZnJvbSBgZW5kaWYnLgotICAgICAgICAgIHB1c2ggQHskZGl2ZXJzaW9uc3skY3Vycl9lbnVtfX0sIGVudW1fdmFsX3N0cmluZyhhdXhfbmFtZV9uZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkMSAuICJlbHNlXG4iOwotICAgICAgICAgICRsYXN0X2F1eCA9IGF1eF9uYW1lKCk7Ci0KLSAgICAgICAgICAkY3Vycl9vZmZzZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgJG5hbWVfc3RhY2tbJCNuYW1lX3N0YWNrXSsrOwotCi0gICAgICAgIHB1c2ggQHskZGl2ZXJzaW9uc3skY3Vycl9lbnVtfX0sIGVudW1fdmFsX3N0cmluZyhhdXhfbmFtZSgpKTsKLSAgICAgICAgJGxhc3RfYXV4ID0gYXV4X25hbWUoKTsKLQotICAgICAgICAkY3Vycl9vZmZzZXQgPSAwOwotICAgICAgfQotCi0gICAgICAjIEhhbmRsZSAocHJvYmFibHkgY29udGludWVkKSBwcmVwcm9jZXNzb3IgbGluZXMuCi0gICAgQ09OVElOVUVEX0xPT1A6Ci0gICAgICB7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpcF9uZXdsaW5lKCk7Ci0KLSAgICAgICAgICBwdXNoIEB7JGRpdmVyc2lvbnN7JGN1cnJfZW51bX19LCAkQVJHIC4gIlxuIjsKLSAgICAgICAgICBwdXNoIEB7JGRpdmVyc2lvbnN7JGN1cnJfYXJyYXl9fSwgJEFSRyAuICJcbiI7Ci0KLSAgICAgICAgICBsYXN0IENPTlRJTlVFRF9MT09QIHVubGVzcyAvIFxcICQgL3g7Ci0KLSAgICAgICAgfSB3aGlsZSAoPERBVEE+KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdhcm5fYmVmb3JlKCk7Ci0gICAgfQotCi0gICAgbmV4dDsKLSAgfQotCi0gIGlmICgvJGVudW1fZWxlbWVudF9yZS8pCi0gIHsKLSAgICBlbmRfY3Vycl9zdHJpbmcoKTsKLSAgICB1cGRhdGVfbWF4X2VsZW1fc2l6ZSgpOwotCi0gICAgJGN1cnJfZW51bV9lbGVtZW50ID0gJDE7Ci0gICAgJGhhdmVfZW51bV9lbGVtZW50ID0gMTsKLSAgICAkY3Vycl9lbGVtX3NpemUgPSAwOwotCi0gICAgbmV4dDsKLSAgfQotCi0gIGlmICgvJHN0cmluZ19yZS8pCi0gIHsKLSAgICBpZiAoJGhhdmVfc2VjdGlvbnMpCi0gICAgewotICAgICAgRGllKCJzdHJpbmdzIGFuZCBibG9ja3MgY2FuJ3QgYmUgbWl4ZWQgaW4gYSBzZWN0aW9uIikgaWYgJGhhdmVfYmxvY2tzOwotCi0gICAgICAjIFNhdmUgY2FwdHVyZWQgZ3JvdXAgZnJvbSBgc3RyaW5nX3JlJy4KLSAgICAgIG15ICRzdHJpbmcgPSAkMTsKLQotICAgICAgaWYgKCRoYXZlX2VudW1fZWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcHVzaCBAeyRkaXZlcnNpb25zeyRjdXJyX2VudW19fSwgZW51bV92YWxfc3RyaW5nKCRjdXJyX2VudW1fZWxlbWVudCk7Ci0gICAgICAgICRoYXZlX2VudW1fZWxlbWVudCA9IDA7Ci0gICAgICB9Ci0KLSAgICAgICRzdHJpbmcgPSBjb252ZXJ0X2xpdGVyYWwoJHN0cmluZyk7Ci0KLSAgICAgIHB1c2ggQHskZGl2ZXJzaW9uc3skY3Vycl9hcnJheX19LCAiICAgICRzdHJpbmdcbiI7Ci0KLSAgICAgICRoYXZlX3N0cmluZ3MgPSAxOwotICAgICAgJGluX3N0cmluZyA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB3YXJuX2JlZm9yZSgpOwotICAgIH0KLQotICAgIG5leHQ7Ci0gIH0KLQotICBpZiAoLyRibG9ja19zdGFydF9yZS8pCi0gIHsKLSAgICBpZiAoJGhhdmVfc2VjdGlvbnMpCi0gICAgewotICAgICAgRGllKCJzdHJpbmdzIGFuZCBibG9ja3MgY2FuJ3QgYmUgbWl4ZWQgaW4gYSBzZWN0aW9uIikgaWYgJGhhdmVfc3RyaW5nczsKLQotICAgICAgbXkgJGRlcHRoID0gMDsKLSAgICAgIG15ICRibG9jayA9ICIiOwotICAgICAgbXkgJGJsb2NrX2VuZCA9IDA7Ci0KLSAgICAgICMgQ291bnQgYnJhY2VzIHdoaWxlIGdldHRpbmcgdGhlIGJsb2NrLgotICAgIEJSQUNFX0xPT1A6Ci0gICAgICB7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpcF9uZXdsaW5lKCk7Ci0KLSAgICAgICAgICBmb3JlYWNoIG15ICRzdWJzdHJpbmcgKHNwbGl0KC8kYnJhY2VfcmUvKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoJGJsb2NrX2VuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRGllKCJpbnZhbGlkIGRhdGEgYWZ0ZXIgbGFzdCBtYXRjaGluZyBjbG9zaW5nIGJyYWNlIikKLSAgICAgICAgICAgICAgICBpZiAkc3Vic3RyaW5nICF+IC8kd2hpdGVzcGFjZV9vbmx5X3JlLzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgJGJsb2NrIC49ICRzdWJzdHJpbmc7Ci0KLSAgICAgICAgICAgIGlmICgkc3Vic3RyaW5nIGVxICd7JykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgJGRlcHRoKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNpZiAoJHN1YnN0cmluZyBlcSAnfScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICRkZXB0aC0tOwotCi0gICAgICAgICAgICAgICRibG9ja19lbmQgPSAxIGlmICRkZXB0aCA9PSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgICMgSWYgd2UgYXJlIGhlcmUsIHdlIGhhdmUgcnVuIG91dCBvZiBzdWJzdHJpbmdzLCBzbyBnZXQgbmV4dCBsaW5lCi0gICAgICAgICAgIyBvciBleGl0LgotICAgICAgICAgIGxhc3QgQlJBQ0VfTE9PUCBpZiAkYmxvY2tfZW5kOwotCi0gICAgICAgICAgJGJsb2NrIC49ICJcbiI7Ci0KLSAgICAgICAgfSB3aGlsZSAoPERBVEE+KTsKLSAgICAgIH0KLQotICAgICAgaWYgKCRoYXZlX2VudW1fZWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcHVzaCBAeyRkaXZlcnNpb25zeyRjdXJyX2VudW19fSwgZW51bV92YWxfc3RyaW5nKCRjdXJyX2VudW1fZWxlbWVudCk7Ci0gICAgICAgICRoYXZlX2VudW1fZWxlbWVudCA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIHB1c2ggQHskZGl2ZXJzaW9uc3skY3Vycl9hcnJheX19LCAkYmxvY2sgLiAiLFxuIjsKLQotICAgICAgJGN1cnJfb2Zmc2V0Kys7Ci0gICAgICAkY3Vycl9lbGVtX3NpemUrKzsKLQotICAgICAgJGhhdmVfYmxvY2tzID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdhcm5fYmVmb3JlKCk7Ci0gICAgfQotCi0gICAgbmV4dDsKLSAgfQotCi0gICMgR2FyYmFnZS4gIFdlIHdlcmVuJ3QgYWJsZSB0byBwYXJzZSB0aGUgZGF0YS4KLSAgRGllKCJzeW50YXggZXJyb3IiKTsKLX0KLQotIyBGaW5hbGl6ZSBkYXRhLgotZW5kX2N1cnJfc3RyaW5nKCk7Ci11cGRhdGVfbWF4X2VsZW1fc2l6ZSgpOwotCi0KLSMgRmlsdGVyIHN0ZGluIHRvIHN0ZG91dCwgcmVwbGFjaW5nIGBALi4uQCcgdGVtcGxhdGVzLgotCi1zdWIgZW1pdF9kaXZlcnNpb24KLXsKLSAgbXkgJGRpdmVyc2lvbl9uYW1lID0gc2hpZnQ7Ci0gIHJldHVybiAoZXhpc3RzKCRkaXZlcnNpb25zeyQxfSkpID8gIkB7JGRpdmVyc2lvbnN7JDF9fSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQCIgLiAkZGl2ZXJzaW9uX25hbWUgLiAiQCI7Ci19Ci0KLQotJExJU1RfU0VQQVJBVE9SID0gJyc7Ci0KLW15ICRzMSA9ICJUaGlzIGZpbGUgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSBQZXJsIHNjcmlwdCBcYCRwcm9nJywiOwotbXkgJHMxbGVuID0gbGVuZ3RoICRzMTsKLW15ICRzMiA9ICJ1c2luZyBkYXRhIGZyb20gZmlsZSBcYCRkYXRhZmlsZScuIjsKLW15ICRzMmxlbiA9IGxlbmd0aCAkczI7Ci1teSAkc2xlbiA9ICgkczFsZW4gPiAkczJsZW4pID8gJHMxbGVuIDogJHMybGVuOwotCi1wcmludCAiLyogIiAuICRzMSAuICIgIiB4ICgkc2xlbiAtICRzMWxlbikgLiAiICovXG4iCi0gICAgICAuICIvKiAiIC4gJHMyIC4gIiAiIHggKCRzbGVuIC0gJHMybGVuKSAuICIgKi9cbiIKLSAgICAgIC4gIlxuIjsKLQotd2hpbGUgKDxTVERJTj4pCi17Ci0gIHMvIEAgKCBbQS1aYS16MC05X10rPyApIEAgLyBlbWl0X2RpdmVyc2lvbigkMSkgL2VneDsKLSAgcHJpbnQ7Ci19Ci0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvYXBpbmFtZXMuYyBiL3NyYy90b29scy9hcGluYW1lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JjOTlkLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9hcGluYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGxpdHRsZSBwcm9ncmFtIGlzIHVzZWQgdG8gcGFyc2UgdGhlIEZyZWVUeXBlIGhlYWRlcnMgYW5kCi0gKiBmaW5kIHRoZSBkZWNsYXJhdGlvbiBvZiBhbGwgcHVibGljIEFQSXMuICBUaGlzIGlzIGVhc3ksIGJlY2F1c2UKLSAqIHRoZXkgYWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICoKLSAqICAgRlRfRVhQT1JUKCByZXR1cm5fdHlwZSApCi0gKiAgIGZ1bmN0aW9uX25hbWUoIGZ1bmN0aW9uIGFyZ3VtZW50cyApOwotICoKLSAqIFlvdSBtdXN0IHBhc3MgdGhlIGxpc3Qgb2YgaGVhZGVyIGZpbGVzIGFzIGFyZ3VtZW50cy4gIFdpbGRjYXJkcyBhcmUKLSAqIGFjY2VwdGVkIGlmIHlvdSBhcmUgdXNpbmcgR0NDIGZvciBjb21waWxhdGlvbiAoYW5kIHByb2JhYmx5IGJ5Ci0gKiBvdGhlciBjb21waWxlcnMgdG9vKS4KLSAqCi0gKiBBdXRob3I6IERhdmlkIFR1cm5lciwgMjAwNSwgMjAwNiwgMjAwOC0yMDEzLCAyMDE1Ci0gKgotICogVGhpcyBjb2RlIGlzIGV4cGxpY2l0bHkgcGxhY2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNkZWZpbmUgIFBST0dSQU1fTkFNRSAgICAgImFwaW5hbWVzIgotI2RlZmluZSAgUFJPR1JBTV9WRVJTSU9OICAiMC4yIgotCi0jZGVmaW5lICBMSU5FQlVGRl9TSVpFICAxMDI0Ci0KLXR5cGVkZWYgZW51bSAgT3V0cHV0Rm9ybWF0XwotewotICBPVVRQVVRfTElTVCA9IDAsICAgICAgLyogb3V0cHV0IHRoZSBsaXN0IG9mIG5hbWVzLCBvbmUgcGVyIGxpbmUgICAgICAgICAgICAgKi8KLSAgT1VUUFVUX1dJTkRPV1NfREVGLCAgIC8qIG91dHB1dCBhIFdpbmRvd3MgLkRFRiBmaWxlIGZvciBWaXN1YWwgQysrIG9yIE1pbmd3ICovCi0gIE9VVFBVVF9CT1JMQU5EX0RFRiwgICAvKiBvdXRwdXQgYSBXaW5kb3dzIC5ERUYgZmlsZSBmb3IgQm9ybGFuZCBDKysgICAgICAgICAqLwotICBPVVRQVVRfV0FUQ09NX0xCQywgICAgLyogb3V0cHV0IGEgV2F0Y29tIExpbmtlciBDb21tYW5kIEZpbGUgICAgICAgICAgICAgICAgKi8KLSAgT1VUUFVUX05FVFdBUkVfSU1QICAgIC8qIG91dHB1dCBhIE5ldFdhcmUgSW1wb3J0RmlsZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLX0gT3V0cHV0Rm9ybWF0OwotCi0KLXN0YXRpYyB2b2lkCi1wYW5pYyggY29uc3QgY2hhciogIG1lc3NhZ2UgKQotewotICBmcHJpbnRmKCBzdGRlcnIsICJQQU5JQzogJXNcbiIsIG1lc3NhZ2UgKTsKLSAgZXhpdCgyKTsKLX0KLQotCi10eXBlZGVmIHN0cnVjdCAgTmFtZVJlY18KLXsKLSAgY2hhciogICAgICAgICBuYW1lOwotICB1bnNpZ25lZCBpbnQgIGhhc2g7Ci0KLX0gTmFtZVJlYywgKk5hbWU7Ci0KLXN0YXRpYyBOYW1lICB0aGVfbmFtZXM7Ci1zdGF0aWMgaW50ICAgbnVtX25hbWVzOwotc3RhdGljIGludCAgIG1heF9uYW1lczsKLQotc3RhdGljIHZvaWQKLW5hbWVzX2FkZCggY29uc3QgY2hhciogIG5hbWUsCi0gICAgICAgICAgIGNvbnN0IGNoYXIqICBlbmQgKQotewotICB1bnNpZ25lZCBpbnQgIGg7Ci0gIGludCAgICAgICAgICAgbm4sIGxlbjsKLSAgTmFtZSAgICAgICAgICBubTsKLQotICBpZiAoIGVuZCA8PSBuYW1lICkKLSAgICByZXR1cm47Ci0KLSAgLyogY29tcHV0ZSBoYXNoIHZhbHVlICovCi0gIGxlbiA9IChpbnQpKGVuZCAtIG5hbWUpOwotICBoICAgPSAwOwotICBmb3IgKCBubiA9IDA7IG5uIDwgbGVuOyBubisrICkKLSAgICBoID0gaCozMyArIG5hbWVbbm5dOwotCi0gIC8qIGNoZWNrIGZvciBhbiBwcmUtZXhpc3RpbmcgbmFtZSAqLwotICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX25hbWVzOyBubisrICkKLSAgewotICAgIG5tID0gdGhlX25hbWVzICsgbm47Ci0KLSAgICBpZiAoIChpbnQpbm0tPmhhc2ggICAgICAgICAgICAgICAgID09IGggJiYKLSAgICAgICAgIG1lbWNtcCggbmFtZSwgbm0tPm5hbWUsIGxlbiApID09IDAgJiYKLSAgICAgICAgIG5tLT5uYW1lW2xlbl0gICAgICAgICAgICAgICAgID09IDAgKQotICAgICAgcmV0dXJuOwotICB9Ci0KLSAgLyogYWRkIG5ldyBuYW1lICovCi0gIGlmICggbnVtX25hbWVzID49IG1heF9uYW1lcyApCi0gIHsKLSAgICBtYXhfbmFtZXMgKz0gKG1heF9uYW1lcyA+PiAxKSArIDQ7Ci0gICAgdGhlX25hbWVzICA9IChOYW1lUmVjKilyZWFsbG9jKCB0aGVfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCB0aGVfbmFtZXNbMF0gKSAqIG1heF9uYW1lcyApOwotICAgIGlmICggIXRoZV9uYW1lcyApCi0gICAgICBwYW5pYyggIm5vdCBlbm91Z2ggbWVtb3J5IiApOwotICB9Ci0gIG5tID0gJnRoZV9uYW1lc1tudW1fbmFtZXMrK107Ci0KLSAgbm0tPmhhc2ggPSBoOwotICBubS0+bmFtZSA9IChjaGFyKiltYWxsb2MoIGxlbisxICk7Ci0gIGlmICggIW5tLT5uYW1lICkKLSAgICBwYW5pYyggIm5vdCBlbm91Z2ggbWVtb3J5IiApOwotCi0gIG1lbWNweSggbm0tPm5hbWUsIG5hbWUsIGxlbiApOwotICBubS0+bmFtZVtsZW5dID0gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1uYW1lX2NvbXBhcmUoIGNvbnN0IHZvaWQqICBuYW1lMSwKLSAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIG5hbWUyICkKLXsKLSAgTmFtZSAgbjEgPSAoTmFtZSluYW1lMTsKLSAgTmFtZSAgbjIgPSAoTmFtZSluYW1lMjsKLQotICByZXR1cm4gc3RyY21wKCBuMS0+bmFtZSwgbjItPm5hbWUgKTsKLX0KLQotc3RhdGljIHZvaWQKLW5hbWVzX3NvcnQoIHZvaWQgKQotewotICBxc29ydCggdGhlX25hbWVzLCAoc2l6ZV90KW51bV9uYW1lcywKLSAgICAgICAgIHNpemVvZiAoIHRoZV9uYW1lc1swXSApLCBuYW1lX2NvbXBhcmUgKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbmFtZXNfZHVtcCggRklMRSogICAgICAgICBvdXQsCi0gICAgICAgICAgICBPdXRwdXRGb3JtYXQgIGZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgZGxsX25hbWUgKQotewotICBpbnQgIG5uOwotCi0KLSAgc3dpdGNoICggZm9ybWF0ICkKLSAgewotICAgIGNhc2UgT1VUUFVUX1dJTkRPV1NfREVGOgotICAgICAgaWYgKCBkbGxfbmFtZSApCi0gICAgICAgIGZwcmludGYoIG91dCwgIkxJQlJBUlkgJXNcbiIsIGRsbF9uYW1lICk7Ci0KLSAgICAgIGZwcmludGYoIG91dCwgIkRFU0NSSVBUSU9OICBGcmVlVHlwZSAyIERMTFxuIiApOwotICAgICAgZnByaW50Ziggb3V0LCAiRVhQT1JUU1xuIiApOwotICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9uYW1lczsgbm4rKyApCi0gICAgICAgIGZwcmludGYoIG91dCwgIiAgJXNcbiIsIHRoZV9uYW1lc1tubl0ubmFtZSApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9VVFBVVF9CT1JMQU5EX0RFRjoKLSAgICAgIGlmICggZGxsX25hbWUgKQotICAgICAgICBmcHJpbnRmKCBvdXQsICJMSUJSQVJZICVzXG4iLCBkbGxfbmFtZSApOwotCi0gICAgICBmcHJpbnRmKCBvdXQsICJERVNDUklQVElPTiAgRnJlZVR5cGUgMiBETExcbiIgKTsKLSAgICAgIGZwcmludGYoIG91dCwgIkVYUE9SVFNcbiIgKTsKLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fbmFtZXM7IG5uKysgKQotICAgICAgICBmcHJpbnRmKCBvdXQsICIgIF8lc1xuIiwgdGhlX25hbWVzW25uXS5uYW1lICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1VUUFVUX1dBVENPTV9MQkM6Ci0gICAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIqICBkb3Q7Ci0gICAgICAgIGNoYXIgICAgICAgICB0ZW1wWzUxMl07Ci0KLQotICAgICAgICBpZiAoICFkbGxfbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgInlvdSBtdXN0IHByb3ZpZGUgYSBETEwgbmFtZSB3aXRoIHRoZSAtZCBvcHRpb24hXG4iICk7Ci0gICAgICAgICAgZXhpdCggNCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogd2UgbXVzdCBvbWl0IHRoZSAuZGxsIHN1ZmZpeCBmcm9tIHRoZSBsaWJyYXJ5IG5hbWUgKi8KLSAgICAgICAgZG90ID0gc3RyY2hyKCBkbGxfbmFtZSwgJy4nICk7Ci0gICAgICAgIGlmICggZG90ICkKLSAgICAgICAgewotICAgICAgICAgIGludCAgbGVuID0gZG90IC0gZGxsX25hbWU7Ci0KLQotICAgICAgICAgIGlmICggbGVuID4gKGludCkoIHNpemVvZiAoIHRlbXAgKSAtIDEgKSApCi0gICAgICAgICAgICBsZW4gPSBzaXplb2YgKCB0ZW1wICkgLSAxOwotCi0gICAgICAgICAgbWVtY3B5KCB0ZW1wLCBkbGxfbmFtZSwgbGVuICk7Ci0gICAgICAgICAgdGVtcFtsZW5dID0gMDsKLQotICAgICAgICAgIGRsbF9uYW1lID0gKGNvbnN0IGNoYXIqKXRlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX25hbWVzOyBubisrICkKLSAgICAgICAgICBmcHJpbnRmKCBvdXQsICIrK18lcy4lcy4lc1xuIiwgdGhlX25hbWVzW25uXS5uYW1lLCBkbGxfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZV9uYW1lc1tubl0ubmFtZSApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9VVFBVVF9ORVRXQVJFX0lNUDoKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkbGxfbmFtZSApCi0gICAgICAgICAgZnByaW50Ziggb3V0LCAiICAoJXMpXG4iLCBkbGxfbmFtZSApOwotICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX25hbWVzIC0gMTsgbm4rKyApCi0gICAgICAgICAgZnByaW50Ziggb3V0LCAiICAlcyxcbiIsIHRoZV9uYW1lc1tubl0ubmFtZSApOwotICAgICAgICBmcHJpbnRmKCBvdXQsICIgICVzXG4iLCB0aGVfbmFtZXNbbnVtX25hbWVzIC0gMV0ubmFtZSApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OiAgLyogTElTVCAqLwotICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9uYW1lczsgbm4rKyApCi0gICAgICAgIGZwcmludGYoIG91dCwgIiVzXG4iLCB0aGVfbmFtZXNbbm5dLm5hbWUgKTsKLSAgfQotfQotCi0KLQotCi0vKiBzdGF0ZXMgb2YgdGhlIGxpbmUgcGFyc2VyICovCi0KLXR5cGVkZWYgZW51bSAgU3RhdGVfCi17Ci0gIFNUQVRFX1NUQVJUID0gMCwgIC8qIHdhaXRpbmcgZm9yIEZUX0VYUE9SVCBrZXl3b3JkIGFuZCByZXR1cm4gdHlwZSAqLwotICBTVEFURV9UWVBFICAgICAgICAvKiB0eXBlIHdhcyByZWFkLCB3YWl0aW5nIGZvciBmdW5jdGlvbiBuYW1lICAgICAgKi8KLQotfSBTdGF0ZTsKLQotc3RhdGljIGludAotcmVhZF9oZWFkZXJfZmlsZSggRklMRSogIGZpbGUsIGludCAgdmVyYm9zZSApCi17Ci0gIHN0YXRpYyBjaGFyICBidWZmW0xJTkVCVUZGX1NJWkUgKyAxXTsKLSAgU3RhdGUgICAgICAgIHN0YXRlID0gU1RBVEVfU1RBUlQ7Ci0KLSAgd2hpbGUgKCAhZmVvZiggZmlsZSApICkKLSAgewotICAgIGNoYXIqICBwOwotCi0gICAgaWYgKCAhZmdldHMoIGJ1ZmYsIExJTkVCVUZGX1NJWkUsIGZpbGUgKSApCi0gICAgICBicmVhazsKLQotICAgIHAgPSBidWZmOwotCi0gICAgd2hpbGUgKCAqcCAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcXCcpICkgIC8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gICAgICBwKys7Ci0KLSAgICBpZiAoICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJyApICAvKiBza2lwIGVtcHR5IGxpbmVzICovCi0gICAgICBjb250aW51ZTsKLQotICAgIHN3aXRjaCAoIHN0YXRlICkKLSAgICB7Ci0gICAgICBjYXNlIFNUQVRFX1NUQVJUOgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBtZW1jbXAoIHAsICJGVF9FWFBPUlQoIiwgMTAgKSAhPSAwICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgcCArPSAxMDsKLSAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKnAgPT0gMCB8fCAqcCA9PSAnXG4nIHx8ICpwID09ICdccicgKQotICAgICAgICAgICAgICBnb3RvIE5leHRMaW5lOwotCi0gICAgICAgICAgICBpZiAoICpwID09ICcpJyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHArKzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHArKzsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1RZUEU7Ci0KLSAgICAgICAgIC8qIHNvbWV0aW1lcywgdGhlIG5hbWUgaXMganVzdCBhZnRlciB0aGUgRlRfRVhQT1JUKC4uLiksIHNvCi0gICAgICAgICAgKiBza2lwIHdoaXRlc3BhY2UsIGFuZCBmYWxsLXRocm91Z2ggaWYgd2UgZmluZCBhbiBhbHBoYW51bWVyaWMKLSAgICAgICAgICAqIGNoYXJhY3RlcgotICAgICAgICAgICovCi0gICAgICAgICAgd2hpbGUgKCAqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyApCi0gICAgICAgICAgICBwKys7Ci0KLSAgICAgICAgICBpZiAoICFpc2FscGhhKCpwKSApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KLQotICAgICAgY2FzZSBTVEFURV9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgY2hhciogICBuYW1lID0gcDsKLQotICAgICAgICAgIHdoaWxlICggaXNhbG51bSgqcCkgfHwgKnAgPT0gJ18nICkKLSAgICAgICAgICAgIHArKzsKLQotICAgICAgICAgIGlmICggcCA+IG5hbWUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggdmVyYm9zZSApCi0gICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIj4+PiAlLipzXG4iLCAoaW50KShwIC0gbmFtZSksIG5hbWUgKTsKLQotICAgICAgICAgICAgbmFtZXNfYWRkKCBuYW1lLCBwICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3RhdGUgPSBTVEFURV9TVEFSVDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgOwotICAgIH0KLQotICBOZXh0TGluZToKLSAgICA7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZAotdXNhZ2UoIHZvaWQgKQotewotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgIGZvcm1hdCA9Ci0gICAiJXMgJXM6IGV4dHJhY3QgRnJlZVR5cGUgQVBJIG5hbWVzIGZyb20gaGVhZGVyIGZpbGVzXG5cbiIKLSAgICJ0aGlzIHByb2dyYW0gaXMgdXNlZCB0byBleHRyYWN0IHRoZSBsaXN0IG9mIHB1YmxpYyBGcmVlVHlwZSBBUElcbiIKLSAgICJmdW5jdGlvbnMuIEl0IHJlY2VpdmVzIHRoZSBsaXN0IG9mIGhlYWRlciBmaWxlcyBhcyBhcmd1bWVudCBhbmRcbiIKLSAgICJnZW5lcmF0ZXMgYSBzb3J0ZWQgbGlzdCBvZiB1bmlxdWUgaWRlbnRpZmllcnNcblxuIgotCi0gICAidXNhZ2U6ICVzIGhlYWRlcjEgW29wdGlvbnNdIFtoZWFkZXIyIC4uLl1cblxuIgotCi0gICAib3B0aW9uczogICAtICAgICAgOiBwYXJzZSB0aGUgY29udGVudCBvZiBzdGRpbiwgaWdub3JlIGFyZ3VtZW50c1xuIgotICAgIiAgICAgICAgICAgLXYgICAgIDogdmVyYm9zZSBtb2RlLCBvdXRwdXQgc2VudCB0byBzdGFuZGFyZCBlcnJvclxuIgotICAgIiAgICAgICAgICAgLW9GSUxFIDogd3JpdGUgb3V0cHV0IHRvIEZJTEUgaW5zdGVhZCBvZiBzdGFuZGFyZCBvdXRwdXRcbiIKLSAgICIgICAgICAgICAgIC1kTkFNRSA6IGluZGljYXRlIERMTCBmaWxlIG5hbWUsICdmcmVldHlwZS5kbGwnIGJ5IGRlZmF1bHRcbiIKLSAgICIgICAgICAgICAgIC13ICAgICA6IG91dHB1dCAuREVGIGZpbGUgZm9yIFZpc3VhbCBDKysgYW5kIE1pbmd3XG4iCi0gICAiICAgICAgICAgICAtd0IgICAgOiBvdXRwdXQgLkRFRiBmaWxlIGZvciBCb3JsYW5kIEMrK1xuIgotICAgIiAgICAgICAgICAgLXdXICAgIDogb3V0cHV0IFdhdGNvbSBMaW5rZXIgUmVzcG9uc2UgRmlsZVxuIgotICAgIiAgICAgICAgICAgLXdOICAgIDogb3V0cHV0IE5ldFdhcmUgSW1wb3J0IEZpbGVcbiIKLSAgICJcbiI7Ci0KLSAgZnByaW50Ziggc3RkZXJyLAotICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgIFBST0dSQU1fTkFNRSwKLSAgICAgICAgICAgUFJPR1JBTV9WRVJTSU9OLAotICAgICAgICAgICBQUk9HUkFNX05BTUUKLSAgICAgICAgICAgKTsKLSAgZXhpdCgxKTsKLX0KLQotCi1pbnQgIG1haW4oIGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCogIGFyZ3YgKQotewotICBpbnQgICAgICAgICAgIGZyb21fc3RkaW4gPSAwOwotICBpbnQgICAgICAgICAgIHZlcmJvc2UgPSAwOwotICBPdXRwdXRGb3JtYXQgIGZvcm1hdCA9IE9VVFBVVF9MSVNUOyAgLyogdGhlIGRlZmF1bHQgKi8KLSAgRklMRSogICAgICAgICBvdXQgICAgPSBzdGRvdXQ7Ci0gIGNvbnN0IGNoYXIqICAgbGlicmFyeV9uYW1lID0gTlVMTDsKLQotICBpZiAoIGFyZ2MgPCAyICkKLSAgICB1c2FnZSgpOwotCi0gIC8qICctJyB1c2VkIGFzIGEgc2luZ2xlIGFyZ3VtZW50IG1lYW5zIHJlYWQgc291cmNlIGZpbGUgZnJvbSBzdGRpbiAqLwotICB3aGlsZSAoIGFyZ2MgPiAxICYmIGFyZ3ZbMV1bMF0gPT0gJy0nICkKLSAgewotICAgIGNvbnN0IGNoYXIqICBhcmcgPSBhcmd2WzFdOwotCi0gICAgc3dpdGNoICggYXJnWzFdICkKLSAgICB7Ci0gICAgICBjYXNlICd2JzoKLSAgICAgICAgdmVyYm9zZSA9IDE7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlICdvJzoKLSAgICAgICAgaWYgKCBhcmdbMl0gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGFyZ2MgPCAyICkKLSAgICAgICAgICAgIHVzYWdlKCk7Ci0KLSAgICAgICAgICBhcmcgPSBhcmd2WzJdOwotICAgICAgICAgIGFyZ3YrKzsKLSAgICAgICAgICBhcmdjLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGFyZyArPSAyOwotCi0gICAgICAgIG91dCA9IGZvcGVuKCBhcmcsICJ3dCIgKTsKLSAgICAgICAgaWYgKCAhb3V0ICkKLSAgICAgICAgewotICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuICclcycgZm9yIHdyaXRpbmdcbiIsIGFyZ3ZbMl0gKTsKLSAgICAgICAgICBleGl0KDMpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlICdkJzoKLSAgICAgICAgaWYgKCBhcmdbMl0gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGFyZ2MgPCAyICkKLSAgICAgICAgICAgIHVzYWdlKCk7Ci0KLSAgICAgICAgICBhcmcgPSBhcmd2WzJdOwotICAgICAgICAgIGFyZ3YrKzsKLSAgICAgICAgICBhcmdjLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGFyZyArPSAyOwotCi0gICAgICAgIGxpYnJhcnlfbmFtZSA9IGFyZzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgJ3cnOgotICAgICAgICBmb3JtYXQgPSBPVVRQVVRfV0lORE9XU19ERUY7Ci0gICAgICAgIHN3aXRjaCAoIGFyZ1syXSApCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgIGZvcm1hdCA9IE9VVFBVVF9CT1JMQU5EX0RFRjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICBmb3JtYXQgPSBPVVRQVVRfV0FUQ09NX0xCQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICBmb3JtYXQgPSBPVVRQVVRfTkVUV0FSRV9JTVA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMDoKLSAgICAgICAgZnJvbV9zdGRpbiA9IDE7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICB1c2FnZSgpOwotICAgIH0KLQotICAgIGFyZ2MtLTsKLSAgICBhcmd2Kys7Ci0gIH0KLQotICBpZiAoIGZyb21fc3RkaW4gKQotICB7Ci0gICAgcmVhZF9oZWFkZXJfZmlsZSggc3RkaW4sIHZlcmJvc2UgKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBmb3IgKCAtLWFyZ2MsIGFyZ3YrKzsgYXJnYyA+IDA7IGFyZ2MtLSwgYXJndisrICkKLSAgICB7Ci0gICAgICBGSUxFKiAgZmlsZSA9IGZvcGVuKCBhcmd2WzBdLCAicmIiICk7Ci0KLSAgICAgIGlmICggIWZpbGUgKQotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJ1bmFibGUgdG8gb3BlbiAnJXMnXG4iLCBhcmd2WzBdICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggdmVyYm9zZSApCi0gICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAib3BlbmluZyAnJXMnXG4iLCBhcmd2WzBdICk7Ci0KLSAgICAgICAgcmVhZF9oZWFkZXJfZmlsZSggZmlsZSwgdmVyYm9zZSApOwotICAgICAgICBmY2xvc2UoIGZpbGUgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoIG51bV9uYW1lcyA9PSAwICkKLSAgICBwYW5pYyggImNvdWxkIG5vdCBmaW5kIGV4cG9ydGVkIGZ1bmN0aW9ucyAhIVxuIiApOwotCi0gIG5hbWVzX3NvcnQoKTsKLSAgbmFtZXNfZHVtcCggb3V0LCBmb3JtYXQsIGxpYnJhcnlfbmFtZSApOwotCi0gIGlmICggb3V0ICE9IHN0ZG91dCApCi0gICAgZmNsb3NlKCBvdXQgKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy90b29scy9jaGt0cmNtcC5weSBiL3NyYy90b29scy9jaGt0cmNtcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGM0MGJkYS4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvY2hrdHJjbXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENoZWNrIHRyYWNlIGNvbXBvbmVudHMgaW4gRnJlZVR5cGUgMiBzb3VyY2UuCi0jIEF1dGhvcjogc3V6dWtpIHRvc2hpeWEsIDIwMDksIDIwMTMKLSMKLSMgVGhpcyBjb2RlIGlzIGV4cGxpY2l0bHkgaW50byB0aGUgcHVibGljIGRvbWFpbi4KLQotCi1pbXBvcnQgc3lzCi1pbXBvcnQgb3MKLWltcG9ydCByZQotCi1TUkNfRklMRV9MSVNUICAgPSBbXQotVVNFRF9DT01QT05FTlQgID0ge30KLUtOT1dOX0NPTVBPTkVOVCA9IHt9Ci0KLVNSQ19GSUxFX0RJUlMgICA9IFsgInNyYyIgXQotVFJBQ0VfREVGX0ZJTEVTID0gWyAiaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgiIF0KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFBhcnNlIGNvbW1hbmQgbGluZSBvcHRpb25zCi0jCi0KLWZvciBpIGluIHJhbmdlKCAxLCBsZW4oIHN5cy5hcmd2ICkgKToKLSAgaWYgc3lzLmFyZ3ZbaV0uc3RhcnRzd2l0aCggIi0taGVscCIgKToKLSAgICBwcmludCAiVXNhZ2U6ICVzIFtvcHRpb25dIiAlIHN5cy5hcmd2WzBdCi0gICAgcHJpbnQgIlNlYXJjaCB1c2VkLWJ1dC1kZWZpbmVkIGFuZCBkZWZpbmVkLWJ1dC1ub3QtdXNlZCB0cmFjZV9YWFggbWFjcm9zIgotICAgIHByaW50ICIiCi0gICAgcHJpbnQgIiAgLS1oZWxwOiIKLSAgICBwcmludCAiICAgICAgICBTaG93IHRoaXMgaGVscCIKLSAgICBwcmludCAiIgotICAgIHByaW50ICIgIC0tc3JjLWRpcnM9ZGlyMTpkaXIyOi4uLiIKLSAgICBwcmludCAiICAgICAgICBTcGVjaWZ5IHRoZSBkaXJlY3RvcmllcyBvZiBDIHNvdXJjZSBmaWxlcyB0byBiZSBjaGVja2VkIgotICAgIHByaW50ICIgICAgICAgIERlZmF1bHQgaXMgJXMiICUgIjoiLmpvaW4oIFNSQ19GSUxFX0RJUlMgKQotICAgIHByaW50ICIiCi0gICAgcHJpbnQgIiAgLS1kZWYtZmlsZXM9ZmlsZTE6ZmlsZTI6Li4uIgotICAgIHByaW50ICIgICAgICAgIFNwZWNpZnkgdGhlIGhlYWRlciBmaWxlcyBpbmNsdWRpbmcgRlRfVFJBQ0VfREVGKCkiCi0gICAgcHJpbnQgIiAgICAgICAgRGVmYXVsdCBpcyAlcyIgJSAiOiIuam9pbiggVFJBQ0VfREVGX0ZJTEVTICkKLSAgICBwcmludCAiIgotICAgIGV4aXQoMCkKLSAgaWYgc3lzLmFyZ3ZbaV0uc3RhcnRzd2l0aCggIi0tc3JjLWRpcnM9IiApOgotICAgIFNSQ19GSUxFX0RJUlMgPSBzeXMuYXJndltpXS5yZXBsYWNlKCAiLS1zcmMtZGlycz0iLCAiIiwgMSApLnNwbGl0KCAiOiIgKQotICBlbGlmIHN5cy5hcmd2W2ldLnN0YXJ0c3dpdGgoICItLWRlZi1maWxlcz0iICk6Ci0gICAgVFJBQ0VfREVGX0ZJTEVTID0gc3lzLmFyZ3ZbaV0ucmVwbGFjZSggIi0tZGVmLWZpbGVzPSIsICIiLCAxICkuc3BsaXQoICI6IiApCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTY2FuIEMgc291cmNlIGFuZCBoZWFkZXIgZmlsZXMgdXNpbmcgdHJhY2UgbWFjcm9zLgotIwotCi1jX3BhdGhuYW1lX3BhdCA9IHJlLmNvbXBpbGUoICdeLipcLltjaF0kJywgcmUuSUdOT1JFQ0FTRSApCi10cmFjZV91c2VfcGF0ICA9IHJlLmNvbXBpbGUoICdeWyBcdF0qI2RlZmluZVsgXHRdK0ZUX0NPTVBPTkVOVFsgXHRdK3RyYWNlXycgKQotCi1mb3IgZCBpbiBTUkNfRklMRV9ESVJTOgotICBmb3IgKCBwLCBkbHN0LCBmbHN0ICkgaW4gb3Mud2FsayggZCApOgotICAgIGZvciBmIGluIGZsc3Q6Ci0gICAgICBpZiBjX3BhdGhuYW1lX3BhdC5tYXRjaCggZiApICE9IE5vbmU6Ci0gICAgICAgIHNyY19wYXRobmFtZSA9IG9zLnBhdGguam9pbiggcCwgZiApCi0KLSAgICAgICAgbGluZV9udW0gPSAwCi0gICAgICAgIGZvciBzcmNfbGluZSBpbiBvcGVuKCBzcmNfcGF0aG5hbWUsICdyJyApOgotICAgICAgICAgIGxpbmVfbnVtID0gbGluZV9udW0gKyAxCi0gICAgICAgICAgc3JjX2xpbmUgPSBzcmNfbGluZS5zdHJpcCgpCi0gICAgICAgICAgaWYgdHJhY2VfdXNlX3BhdC5tYXRjaCggc3JjX2xpbmUgKSAhPSBOb25lOgotICAgICAgICAgICAgY29tcG9uZW50X25hbWUgPSB0cmFjZV91c2VfcGF0LnN1YiggJycsIHNyY19saW5lICkKLSAgICAgICAgICAgIGlmIGNvbXBvbmVudF9uYW1lIGluIFVTRURfQ09NUE9ORU5UOgotICAgICAgICAgICAgICBVU0VEX0NPTVBPTkVOVFtjb21wb25lbnRfbmFtZV0uYXBwZW5kKCAiJXM6JWQiICUgKCBzcmNfcGF0aG5hbWUsIGxpbmVfbnVtICkgKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgVVNFRF9DT01QT05FTlRbY29tcG9uZW50X25hbWVdID0gWyAiJXM6JWQiICUgKCBzcmNfcGF0aG5hbWUsIGxpbmVfbnVtICkgXQotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2NhbiBoZWFkZXIgZmlsZShzKSBkZWZpbmluZyB0cmFjZSBtYWNyb3MuCi0jCi0KLXRyYWNlX2RlZl9wYXRfb3BuID0gcmUuY29tcGlsZSggJ14uKkZUX1RSQUNFX0RFRlsgXHRdKlwoWyBcdF0qJyApCi10cmFjZV9kZWZfcGF0X2NscyA9IHJlLmNvbXBpbGUoICdbIFx0XCldLiokJyApCi0KLWZvciBmIGluIFRSQUNFX0RFRl9GSUxFUzoKLSAgbGluZV9udW0gPSAwCi0gIGZvciBoZHJfbGluZSBpbiBvcGVuKCBmLCAncicgKToKLSAgICBsaW5lX251bSA9IGxpbmVfbnVtICsgMQotICAgIGhkcl9saW5lID0gaGRyX2xpbmUuc3RyaXAoKQotICAgIGlmIHRyYWNlX2RlZl9wYXRfb3BuLm1hdGNoKCBoZHJfbGluZSApICE9IE5vbmU6Ci0gICAgICBjb21wb25lbnRfbmFtZSA9IHRyYWNlX2RlZl9wYXRfb3BuLnN1YiggJycsIGhkcl9saW5lICkKLSAgICAgIGNvbXBvbmVudF9uYW1lID0gdHJhY2VfZGVmX3BhdF9jbHMuc3ViKCAnJywgY29tcG9uZW50X25hbWUgKQotICAgICAgaWYgY29tcG9uZW50X25hbWUgaW4gS05PV05fQ09NUE9ORU5UOgotICAgICAgICBwcmludCAidHJhY2UgY29tcG9uZW50ICVzIGlzIGRlZmluZWQgdHdpY2UsIHNlZSAlcyBhbmQgZnR0cmFjZS5oOiVkIiAlIFwKLSAgICAgICAgICAoIGNvbXBvbmVudF9uYW1lLCBLTk9XTl9DT01QT05FTlRbY29tcG9uZW50X25hbWVdLCBsaW5lX251bSApCi0gICAgICBlbHNlOgotICAgICAgICBLTk9XTl9DT01QT05FTlRbY29tcG9uZW50X25hbWVdID0gIiVzOiVkIiAlIFwKLSAgICAgICAgICAoIG9zLnBhdGguYmFzZW5hbWUoIGYgKSwgbGluZV9udW0gKQotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29tcGFyZSB0aGUgdXNlZCBhbmQgZGVmaW5lZCB0cmFjZSBtYWNyb3MuCi0jCi0KLXByaW50ICIjIFRyYWNlIGNvbXBvbmVudCB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbnMgYnV0IG5vdCBkZWZpbmVkIGluIGZ0dHJhY2UuaC4iCi1jbXBudCA9IFVTRURfQ09NUE9ORU5ULmtleXMoKQotY21wbnQuc29ydCgpCi1mb3IgYyBpbiBjbXBudDoKLSAgaWYgYyBub3QgaW4gS05PV05fQ09NUE9ORU5UOgotICAgIHByaW50ICJUcmFjZSBjb21wb25lbnQgJXMgKHVzZWQgaW4gJXMpIGlzIG5vdCBkZWZpbmVkLiIgJSAoIGMsICIsICIuam9pbiggVVNFRF9DT01QT05FTlRbY10gKSApCi0KLXByaW50ICIjIFRyYWNlIGNvbXBvbmVudCBpcyBkZWZpbmVkIGJ1dCBub3QgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb25zLiIKLWNtcG50ID0gS05PV05fQ09NUE9ORU5ULmtleXMoKQotY21wbnQuc29ydCgpCi1mb3IgYyBpbiBjbXBudDoKLSAgaWYgYyBub3QgaW4gVVNFRF9DT01QT05FTlQ6Ci0gICAgaWYgYyAhPSAiYW55IjoKLSAgICAgIHByaW50ICJUcmFjZSBjb21wb25lbnQgJXMgKGRlZmluZWQgaW4gJXMpIGlzIG5vdCB1c2VkLiIgJSAoIGMsIEtOT1dOX0NPTVBPTkVOVFtjXSApCi0KZGlmZiAtLWdpdCBhL3NyYy90b29scy9jb3JkaWMucHkgYi9zcmMvdG9vbHMvY29yZGljLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQyYzkwLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9jb3JkaWMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIGNvbXB1dGUgYXJjdGFuZ2VudCB0YWJsZSBmb3IgQ09SRElDIGNvbXB1dGF0aW9ucyBpbiBmdHRyaWdvbi5jCi1pbXBvcnQgc3lzLCBtYXRoCi0KLSN1bml0cyAgPSA2NCo2NTUzNi4wICAgIyBkb24ndCBjaGFuZ2UgISEKLXVuaXRzICA9IDE4MCAqIDIqKjE2Ci1zY2FsZSAgPSB1bml0cy9tYXRoLnBpCi1zaHJpbmsgPSAxLjAKLWNvbW1hICA9ICIiCi0KLXByaW50ICIiCi1wcmludCAidGFibGUgb2YgYXJjdGFuKCAxLzJebiApIGZvciBQSSA9ICIgKyByZXByKHVuaXRzLzY1NTM2LjApICsgIiB1bml0cyIKLQotZm9yIG4gaW4gcmFuZ2UoMSwzMik6Ci0KLSAgICB4ID0gMC41KipuICAgICAgICAgICAgICAgICAgICAgICMgdGFuZ2VudCB2YWx1ZQotCi0gICAgYW5nbGUgID0gbWF0aC5hdGFuKHgpICAgICAgICAgICAjIGFyY3RhbmdlbnQKLSAgICBhbmdsZTIgPSByb3VuZChhbmdsZSpzY2FsZSkgICAgICMgYXJjdGFuZ2VudCBpbiBGVF9BbmdsZSB1bml0cwotCi0gICAgaWYgYW5nbGUyIDw9IDA6Ci0gICAgICAgIGJyZWFrCi0KLSAgICBzeXMuc3Rkb3V0LndyaXRlKCBjb21tYSArIHJlcHIoIGludChhbmdsZTIpICkgKQotICAgIGNvbW1hID0gIiwgIgotCi0gICAgc2hyaW5rIC89IG1hdGguc3FydCggMSArIHgqeCApCi0KLXByaW50Ci1wcmludCAic2hyaW5rIGZhY3RvciAgICA9ICIgKyByZXByKCBzaHJpbmsgKQotcHJpbnQgInNocmluayBmYWN0b3IgMiAgPSAiICsgcmVwciggaW50KCBzaHJpbmsgKiAoMioqMzIpICkgKQotcHJpbnQgImV4cGFuc2lvbiBmYWN0b3IgPSAiICsgcmVwciggMS9zaHJpbmsgKQotcHJpbnQgIiIKLQpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2RvY21ha2VyLy5naXRpZ25vcmUgYi9zcmMvdG9vbHMvZG9jbWFrZXIvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyMGI2NC4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSoucHljCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZG9jbWFrZXIvY29udGVudC5weSBiL3NyYy90b29scy9kb2NtYWtlci9jb250ZW50LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODNkODE1Li4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9kb2NtYWtlci9jb250ZW50LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLSMKLSMgIGNvbnRlbnQucHkKLSMKLSMgICAgUGFyc2UgY29tbWVudCBibG9ja3MgdG8gYnVpbGQgY29udGVudCBibG9ja3MgKGxpYnJhcnkgZmlsZSkuCi0jCi0jICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5Ci0jICBEYXZpZCBUdXJuZXIuCi0jCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCi0jICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotIyAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0jICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLSMgIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotIwotIyBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcGFyc2UgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2NrcywKLSMgYnVpbGRpbmcgbW9yZSBzdHJ1Y3R1cmVkIG9iamVjdHMgb3V0IG9mIHRoZW0uCi0jCi0KLQotZnJvbSBzb3VyY2VzIGltcG9ydCAqCi1mcm9tIHV0aWxzICAgaW1wb3J0ICoKLQotaW1wb3J0IHN0cmluZywgcmUKLQotCi0jCi0jIFJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZGV0ZWN0IGNvZGUgc2VxdWVuY2VzLiAgYENvZGUgc2VxdWVuY2VzJyBhcmUgc2ltcGx5Ci0jIGNvZGUgZnJhZ21lbnRzIGVtYmVkZGVkIGluICd7JyBhbmQgJ30nLCBhcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIGZvbGxvd2luZwotIyBleGFtcGxlLgotIwotIyAgIHsKLSMgICAgIHggPSB5ICsgejsKLSMgICAgIGlmICggem9va29vID09IDIgKQotIyAgICAgewotIyAgICAgICBmb29iYXIoKTsKLSMgICAgIH0KLSMgICB9Ci0jCi0jIE5vdGUgdGhhdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IG9wZW5pbmcgYnJhY2UgYW5kIHRoZSBsYXN0IGNsb3NpbmcKLSMgYnJhY2UgbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lLiAgVGhlIGNvZGUgc2VxdWVuY2UgaXRzZWxmIHNob3VsZCBoYXZlIGEKLSMgbGFyZ2VyIGluZGVudGF0aW9uIHRoYW4gdGhlIHN1cnJvdW5kaW5nIGJyYWNlcy4KLSMKLXJlX2NvZGVfc3RhcnQgPSByZS5jb21waWxlKCByIihccyope1xzKiQiICkKLXJlX2NvZGVfZW5kICAgPSByZS5jb21waWxlKCByIihccyopfVxzKiQiICkKLQotCi0jCi0jIEEgcmVndWxhciBleHByZXNzaW9uIHRvIGlzb2xhdGUgaWRlbnRpZmllcnMgZnJvbSBvdGhlciB0ZXh0LiAgVHdvIHN5bnRheAotIyBmb3JtcyBhcmUgc3VwcG9ydGVkOgotIwotIyAgIDxuYW1lPgotIyAgIDxuYW1lPls8aWQ+XQotIwotIyB3aGVyZSBib3RoIGA8bmFtZT4nIGFuZCBgPGlkPicgY29uc2lzdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgYF8nLAotIyBhbmQgYC0nLiAgVXNlIGA8aWQ+JyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUsIHZhbGlkIGA8bmFtZT4nIGVudHJpZXM7IGluIHRoZQotIyBpbmRleCwgYDxpZD4nIHdpbGwgYmUgYXBwZW5kZWQgaW4gcGFyZW50aGVzZXMuCi0jCi0jIEZvciBleGFtcGxlLAotIwotIyAgIHN0ZW1fZGFya2VuaW5nW2F1dG9maXRdCi0jCi0jIGJlY29tZXMgYHN0ZW1fZGFya2VuaW5nIChhdXRvZml0KScgaW4gdGhlIGluZGV4LgotIwotcmVfaWRlbnRpZmllciA9IHJlLmNvbXBpbGUoIHIiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoPzpcd3wtKSsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPzpcWyg/Olx3fC0pK1xdKT8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiLCByZS5WRVJCT1NFICkKLQotCi0jCi0jIFdlIGNvbGxlY3QgbWFjcm8gbmFtZXMgZW5kaW5nIGluIGBfSCcgKGdyb3VwIDEpLCBhcyBkZWZpbmVkIGluCi0jIGBmcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCcuICBXaGlsZSBvdXRwdXR0aW5nIHRoZSBvYmplY3QgZGF0YSwgd2UgdXNlCi0jIHRoaXMgaW5mbyB0b2dldGhlciB3aXRoIHRoZSBvYmplY3QncyBmaWxlIGxvY2F0aW9uIChncm91cCAyKSB0byBlbWl0IHRoZQotIyBhcHByb3ByaWF0ZSBoZWFkZXIgZmlsZSBtYWNybyBhbmQgaXRzIGFzc29jaWF0ZWQgZmlsZSBuYW1lIGJlZm9yZSB0aGUKLSMgb2JqZWN0IGl0c2VsZi4KLSMKLSMgRXhhbXBsZToKLSMKLSMgICAjZGVmaW5lIEZUX0ZSRUVUWVBFX0ggPGZyZWV0eXBlLmg+Ci0jCi1yZV9oZWFkZXJfbWFjcm8gPSByZS5jb21waWxlKCByJ14jZGVmaW5lXHN7MSx9KFx3ezEsfV9IKVxzezEsfTwoLiopPicgKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIENPREUgQ0xBU1MKLSMjCi0jIyAgVGhlIGBEb2NDb2RlJyBjbGFzcyBpcyB1c2VkIHRvIHN0b3JlIHNvdXJjZSBjb2RlIGxpbmVzLgotIyMKLSMjICBgc2VsZi5saW5lcycgY29udGFpbnMgYSBzZXQgb2Ygc291cmNlIGNvZGUgbGluZXMgdGhhdCB3aWxsIGJlIGR1bXBlZCBhcwotIyMgIEhUTUwgaW4gYSA8UFJFPiB0YWcuCi0jIwotIyMgIFRoZSBvYmplY3QgaXMgZmlsbGVkIGxpbmUgYnkgbGluZSBieSB0aGUgcGFyc2VyOyBpdCBzdHJpcHMgdGhlIGxlYWRpbmcKLSMjICBgbWFyZ2luJyBzcGFjZSBmcm9tIGVhY2ggaW5wdXQgbGluZSBiZWZvcmUgc3RvcmluZyBpdCBpbiBgc2VsZi5saW5lcycuCi0jIwotY2xhc3MgIERvY0NvZGU6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmLCBtYXJnaW4sIGxpbmVzICk6Ci0gICAgICAgIHNlbGYubGluZXMgPSBbXQotICAgICAgICBzZWxmLndvcmRzID0gTm9uZQotCi0gICAgICAgICMgcmVtb3ZlIG1hcmdpbiBzcGFjZXMKLSAgICAgICAgZm9yIGwgaW4gbGluZXM6Ci0gICAgICAgICAgICBpZiBzdHJpbmcuc3RyaXAoIGxbOm1hcmdpbl0gKSA9PSAiIjoKLSAgICAgICAgICAgICAgICBsID0gbFttYXJnaW46XQotICAgICAgICAgICAgc2VsZi5saW5lcy5hcHBlbmQoIGwgKQotCi0gICAgZGVmICBkdW1wKCBzZWxmLCBwcmVmaXggPSAiIiwgd2lkdGggPSA2MCApOgotICAgICAgICBsaW5lcyA9IHNlbGYuZHVtcF9saW5lcyggMCwgd2lkdGggKQotICAgICAgICBmb3IgbCBpbiBsaW5lczoKLSAgICAgICAgICAgIHByaW50IHByZWZpeCArIGwKLQotICAgIGRlZiAgZHVtcF9saW5lcyggc2VsZiwgbWFyZ2luID0gMCwgd2lkdGggPSA2MCApOgotICAgICAgICByZXN1bHQgPSBbXQotICAgICAgICBmb3IgbCBpbiBzZWxmLmxpbmVzOgotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggIiAiICogbWFyZ2luICsgbCApCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIFBBUkEgQ0xBU1MKLSMjCi0jIyAgYE5vcm1hbCcgdGV4dCBwYXJhZ3JhcGhzIGFyZSBzdG9yZWQgaW4gdGhlIGBEb2NQYXJhJyBjbGFzcy4KLSMjCi0jIyAgYHNlbGYud29yZHMnIGNvbnRhaW5zIHRoZSBsaXN0IG9mIHdvcmRzIHRoYXQgbWFrZSB1cCB0aGUgcGFyYWdyYXBoLgotIyMKLWNsYXNzICBEb2NQYXJhOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgbGluZXMgKToKLSAgICAgICAgc2VsZi5saW5lcyA9IE5vbmUKLSAgICAgICAgc2VsZi53b3JkcyA9IFtdCi0gICAgICAgIGZvciBsIGluIGxpbmVzOgotICAgICAgICAgICAgbCA9IHN0cmluZy5zdHJpcCggbCApCi0gICAgICAgICAgICBzZWxmLndvcmRzLmV4dGVuZCggc3RyaW5nLnNwbGl0KCBsICkgKQotCi0gICAgZGVmICBkdW1wKCBzZWxmLCBwcmVmaXggPSAiIiwgd2lkdGggPSA2MCApOgotICAgICAgICBsaW5lcyA9IHNlbGYuZHVtcF9saW5lcyggMCwgd2lkdGggKQotICAgICAgICBmb3IgbCBpbiBsaW5lczoKLSAgICAgICAgICAgIHByaW50IHByZWZpeCArIGwKLQotICAgIGRlZiAgZHVtcF9saW5lcyggc2VsZiwgbWFyZ2luID0gMCwgd2lkdGggPSA2MCApOgotICAgICAgICBjdXIgICAgPSAiIiAgIyBjdXJyZW50IGxpbmUKLSAgICAgICAgY29sICAgID0gMCAgICMgY3VycmVudCB3aWR0aAotICAgICAgICByZXN1bHQgPSBbXQotCi0gICAgICAgIGZvciB3b3JkIGluIHNlbGYud29yZHM6Ci0gICAgICAgICAgICBsbiA9IGxlbiggd29yZCApCi0gICAgICAgICAgICBpZiBjb2wgPiAwOgotICAgICAgICAgICAgICAgIGxuID0gbG4gKyAxCi0KLSAgICAgICAgICAgIGlmIGNvbCArIGxuID4gd2lkdGg6Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggIiAiICogbWFyZ2luICsgY3VyICkKLSAgICAgICAgICAgICAgICBjdXIgPSB3b3JkCi0gICAgICAgICAgICAgICAgY29sID0gbGVuKCB3b3JkICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgY29sID4gMDoKLSAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyICsgIiAiCi0gICAgICAgICAgICAgICAgY3VyID0gY3VyICsgd29yZAotICAgICAgICAgICAgICAgIGNvbCA9IGNvbCArIGxuCi0KLSAgICAgICAgaWYgY29sID4gMDoKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoICIgIiAqIG1hcmdpbiArIGN1ciApCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIEZJRUxEIENMQVNTCi0jIwotIyMgIFRoZSBgRG9jRmllbGQnIGNsYXNzIHN0b3JlcyBhIGxpc3QgY29udGFpbmluZyBlaXRoZXIgYERvY1BhcmEnIG9yCi0jIyAgYERvY0NvZGUnIG9iamVjdHMuICBFYWNoIERvY0ZpZWxkIG9iamVjdCBhbHNvIGhhcyBhbiBvcHRpb25hbCBgbmFtZScKLSMjICB0aGF0IGlzIHVzZWQgd2hlbiB0aGUgb2JqZWN0IGNvcnJlc3BvbmRzIHRvIGEgZmllbGQgb3IgdmFsdWUgZGVmaW5pdGlvbi4KLSMjCi1jbGFzcyAgRG9jRmllbGQ6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmLCBuYW1lLCBsaW5lcyApOgotICAgICAgICBzZWxmLm5hbWUgID0gbmFtZSAgIyBjYW4gYmUgYE5vbmUnIGZvciBub3JtYWwgcGFyYWdyYXBocy9zb3VyY2VzCi0gICAgICAgIHNlbGYuaXRlbXMgPSBbXSAgICAjIGxpc3Qgb2YgaXRlbXMKLQotICAgICAgICBtb2RlX25vbmUgID0gMCAgICAgIyBzdGFydCBwYXJzaW5nIG1vZGUKLSAgICAgICAgbW9kZV9jb2RlICA9IDEgICAgICMgcGFyc2luZyBjb2RlIHNlcXVlbmNlcwotICAgICAgICBtb2RlX3BhcmEgID0gMyAgICAgIyBwYXJzaW5nIG5vcm1hbCBwYXJhZ3JhcGgKLQotICAgICAgICBtYXJnaW4gICAgID0gLTEgICAgIyBjdXJyZW50IGNvZGUgc2VxdWVuY2UgaW5kZW50YXRpb24KLSAgICAgICAgY3VyX2xpbmVzICA9IFtdCi0KLSAgICAgICAgIyBhbmFseXplIHRoZSBtYXJrdXAgbGluZXMgdG8gY2hlY2sgd2hldGhlciB0aGV5IGNvbnRhaW4gcGFyYWdyYXBocywKLSAgICAgICAgIyBjb2RlIHNlcXVlbmNlcywgb3IgZmllbGRzIGRlZmluaXRpb25zCi0gICAgICAgICMKLSAgICAgICAgc3RhcnQgPSAwCi0gICAgICAgIG1vZGUgID0gbW9kZV9ub25lCi0KLSAgICAgICAgZm9yIGwgaW4gbGluZXM6Ci0gICAgICAgICAgICAjIGFyZSB3ZSBwYXJzaW5nIGEgY29kZSBzZXF1ZW5jZT8KLSAgICAgICAgICAgIGlmIG1vZGUgPT0gbW9kZV9jb2RlOgotICAgICAgICAgICAgICAgIG0gPSByZV9jb2RlX2VuZC5tYXRjaCggbCApCi0gICAgICAgICAgICAgICAgaWYgbSBhbmQgbGVuKCBtLmdyb3VwKCAxICkgKSA8PSBtYXJnaW46Ci0gICAgICAgICAgICAgICAgICAgICMgdGhhdCdzIGl0LCB3ZSBmaW5pc2hlZCB0aGUgY29kZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBjb2RlID0gRG9jQ29kZSggMCwgY3VyX2xpbmVzICkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoIGNvZGUgKQotICAgICAgICAgICAgICAgICAgICBtYXJnaW4gICAgPSAtMQotICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICBtb2RlICAgICAgPSBtb2RlX25vbmUKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBjb250aW51ZSB0aGUgY29kZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMuYXBwZW5kKCBsW21hcmdpbjpdICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBzdGFydCBvZiBjb2RlIHNlcXVlbmNlPwotICAgICAgICAgICAgICAgIG0gPSByZV9jb2RlX3N0YXJ0Lm1hdGNoKCBsICkKLSAgICAgICAgICAgICAgICBpZiBtOgotICAgICAgICAgICAgICAgICAgICAjIHNhdmUgY3VycmVudCBsaW5lcwotICAgICAgICAgICAgICAgICAgICBpZiBjdXJfbGluZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhID0gRG9jUGFyYSggY3VyX2xpbmVzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKCBwYXJhICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9saW5lcyA9IFtdCi0KLSAgICAgICAgICAgICAgICAgICAgIyBzd2l0Y2ggdG8gY29kZSBleHRyYWN0aW9uIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbGVuKCBtLmdyb3VwKCAxICkgKQotICAgICAgICAgICAgICAgICAgICBtb2RlICAgPSBtb2RlX2NvZGUKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RyaW5nLnNwbGl0KCBsICkgYW5kIGN1cl9saW5lczoKLSAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIGxpbmUgaXMgZW1wdHksIHdlIGVuZCB0aGUgY3VycmVudCBwYXJhZ3JhcGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYSA9IERvY1BhcmEoIGN1cl9saW5lcyApCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZCggcGFyYSApCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UsIHNpbXBseSBhZGQgdGhlIGxpbmUgdG8gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICMgcGFyYWdyYXBoCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMuYXBwZW5kKCBsICkKLQotICAgICAgICBpZiBtb2RlID09IG1vZGVfY29kZToKLSAgICAgICAgICAgICMgdW5leHBlY3RlZCBlbmQgb2YgY29kZSBzZXF1ZW5jZQotICAgICAgICAgICAgY29kZSA9IERvY0NvZGUoIG1hcmdpbiwgY3VyX2xpbmVzICkKLSAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKCBjb2RlICkKLSAgICAgICAgZWxpZiBjdXJfbGluZXM6Ci0gICAgICAgICAgICBwYXJhID0gRG9jUGFyYSggY3VyX2xpbmVzICkKLSAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKCBwYXJhICkKLQotICAgIGRlZiAgZHVtcCggc2VsZiwgcHJlZml4ID0gIiIgKToKLSAgICAgICAgaWYgc2VsZi5maWVsZDoKLSAgICAgICAgICAgIHByaW50IHByZWZpeCArIHNlbGYuZmllbGQgKyAiIDo6IgotICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4ICsgIi0tLS0iCi0KLSAgICAgICAgZmlyc3QgPSAxCi0gICAgICAgIGZvciBwIGluIHNlbGYuaXRlbXM6Ci0gICAgICAgICAgICBpZiBub3QgZmlyc3Q6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIiIKLSAgICAgICAgICAgIHAuZHVtcCggcHJlZml4ICkKLSAgICAgICAgICAgIGZpcnN0ID0gMAotCi0gICAgZGVmICBkdW1wX2xpbmVzKCBzZWxmLCBtYXJnaW4gPSAwLCB3aWR0aCA9IDYwICk6Ci0gICAgICAgIHJlc3VsdCA9IFtdCi0gICAgICAgIG5sICAgICA9IE5vbmUKLQotICAgICAgICBmb3IgcCBpbiBzZWxmLml0ZW1zOgotICAgICAgICAgICAgaWYgbmw6Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggIiIgKQotCi0gICAgICAgICAgICByZXN1bHQuZXh0ZW5kKCBwLmR1bXBfbGluZXMoIG1hcmdpbiwgd2lkdGggKSApCi0gICAgICAgICAgICBubCA9IDEKLQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLQotIwotIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZXRlY3QgZmllbGQgZGVmaW5pdGlvbnMuCi0jCi0jIEV4YW1wbGVzOgotIwotIyAgIGZvbyAgICAgOjoKLSMgICBmb28uYmFyIDo6Ci0jCi1yZV9maWVsZCA9IHJlLmNvbXBpbGUoIHIiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBccyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHcqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx3IChcdyB8IFwuKSogXHcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICBccyogOjoKLSAgICAgICAgICAgICAgICAgICAgICAgIiIiLCByZS5WRVJCT1NFICkKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotIyMgIERPQyBNQVJLVVAgQ0xBU1MKLSMjCi1jbGFzcyAgRG9jTWFya3VwOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgdGFnLCBsaW5lcyApOgotICAgICAgICBzZWxmLnRhZyAgICA9IHN0cmluZy5sb3dlciggdGFnICkKLSAgICAgICAgc2VsZi5maWVsZHMgPSBbXQotCi0gICAgICAgIGN1cl9saW5lcyA9IFtdCi0gICAgICAgIGZpZWxkICAgICA9IE5vbmUKLSAgICAgICAgbW9kZSAgICAgID0gMAotCi0gICAgICAgIGZvciBsIGluIGxpbmVzOgotICAgICAgICAgICAgbSA9IHJlX2ZpZWxkLm1hdGNoKCBsICkKLSAgICAgICAgICAgIGlmIG06Ci0gICAgICAgICAgICAgICAgIyBXZSBkZXRlY3RlZCB0aGUgc3RhcnQgb2YgYSBuZXcgZmllbGQgZGVmaW5pdGlvbi4KLQotICAgICAgICAgICAgICAgICMgZmlyc3QsIHNhdmUgdGhlIGN1cnJlbnQgb25lCi0gICAgICAgICAgICAgICAgaWYgY3VyX2xpbmVzOgotICAgICAgICAgICAgICAgICAgICBmID0gRG9jRmllbGQoIGZpZWxkLCBjdXJfbGluZXMgKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmZpZWxkcy5hcHBlbmQoIGYgKQotICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICAgPSBOb25lCi0KLSAgICAgICAgICAgICAgICBmaWVsZCAgICAgPSBtLmdyb3VwKCAxICkgICAjIHJlY29yZCBmaWVsZCBuYW1lCi0gICAgICAgICAgICAgICAgbG4gICAgICAgID0gbGVuKCBtLmdyb3VwKCAwICkgKQotICAgICAgICAgICAgICAgIGwgICAgICAgICA9ICIgIiAqIGxuICsgbFtsbjpdCi0gICAgICAgICAgICAgICAgY3VyX2xpbmVzID0gW2xdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGN1cl9saW5lcy5hcHBlbmQoIGwgKQotCi0gICAgICAgIGlmIGZpZWxkIG9yIGN1cl9saW5lczoKLSAgICAgICAgICAgIGYgPSBEb2NGaWVsZCggZmllbGQsIGN1cl9saW5lcyApCi0gICAgICAgICAgICBzZWxmLmZpZWxkcy5hcHBlbmQoIGYgKQotCi0gICAgZGVmICBnZXRfbmFtZSggc2VsZiApOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5maWVsZHNbMF0uaXRlbXNbMF0ud29yZHNbMF0KLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGRlZiAgZHVtcCggc2VsZiwgbWFyZ2luICk6Ci0gICAgICAgIHByaW50ICIgIiAqIG1hcmdpbiArICI8IiArIHNlbGYudGFnICsgIj4iCi0gICAgICAgIGZvciBmIGluIHNlbGYuZmllbGRzOgotICAgICAgICAgICAgZi5kdW1wKCAiICAiICkKLSAgICAgICAgcHJpbnQgIiAiICogbWFyZ2luICsgIjwvIiArIHNlbGYudGFnICsgIj4iCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSMjICBET0MgQ0hBUFRFUiBDTEFTUwotIyMKLWNsYXNzICBEb2NDaGFwdGVyOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgYmxvY2sgKToKLSAgICAgICAgc2VsZi5ibG9jayAgICA9IGJsb2NrCi0gICAgICAgIHNlbGYuc2VjdGlvbnMgPSBbXQotICAgICAgICBpZiBibG9jazoKLSAgICAgICAgICAgIHNlbGYubmFtZSAgPSBibG9jay5uYW1lCi0gICAgICAgICAgICBzZWxmLnRpdGxlID0gYmxvY2suZ2V0X21hcmt1cF93b3JkcyggInRpdGxlIiApCi0gICAgICAgICAgICBzZWxmLm9yZGVyID0gYmxvY2suZ2V0X21hcmt1cF93b3JkcyggInNlY3Rpb25zIiApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLm5hbWUgID0gIk90aGVyIgotICAgICAgICAgICAgc2VsZi50aXRsZSA9IHN0cmluZy5zcGxpdCggIk1pc2NlbGxhbmVvdXMiICkKLSAgICAgICAgICAgIHNlbGYub3JkZXIgPSBbXQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIFNFQ1RJT04gQ0xBU1MKLSMjCi1jbGFzcyAgRG9jU2VjdGlvbjoKLQotICAgIGRlZiAgX19pbml0X18oIHNlbGYsIG5hbWUgPSAiT3RoZXIiICk6Ci0gICAgICAgIHNlbGYubmFtZSAgICAgICAgPSBuYW1lCi0gICAgICAgIHNlbGYuYmxvY2tzICAgICAgPSB7fQotICAgICAgICBzZWxmLmJsb2NrX25hbWVzID0gW10gICMgb3JkZXJlZCBibG9jayBuYW1lcyBpbiBzZWN0aW9uCi0gICAgICAgIHNlbGYuZGVmcyAgICAgICAgPSBbXQotICAgICAgICBzZWxmLmFic3RyYWN0ICAgID0gIiIKLSAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9ICIiCi0gICAgICAgIHNlbGYub3JkZXIgICAgICAgPSBbXQotICAgICAgICBzZWxmLnRpdGxlICAgICAgID0gIkVSUk9SIgotICAgICAgICBzZWxmLmNoYXB0ZXIgICAgID0gTm9uZQotCi0gICAgZGVmICBhZGRfZGVmKCBzZWxmLCBibG9jayApOgotICAgICAgICBzZWxmLmRlZnMuYXBwZW5kKCBibG9jayApCi0KLSAgICBkZWYgIGFkZF9ibG9jayggc2VsZiwgYmxvY2sgKToKLSAgICAgICAgc2VsZi5ibG9ja19uYW1lcy5hcHBlbmQoIGJsb2NrLm5hbWUgKQotICAgICAgICBzZWxmLmJsb2Nrc1tibG9jay5uYW1lXSA9IGJsb2NrCi0KLSAgICBkZWYgIHByb2Nlc3MoIHNlbGYgKToKLSAgICAgICAgIyBsb29rIHVwIG9uZSBibG9jayB0aGF0IGNvbnRhaW5zIGEgdmFsaWQgc2VjdGlvbiBkZXNjcmlwdGlvbgotICAgICAgICBmb3IgYmxvY2sgaW4gc2VsZi5kZWZzOgotICAgICAgICAgICAgdGl0bGUgPSBibG9jay5nZXRfbWFya3VwX3RleHQoICJ0aXRsZSIgKQotICAgICAgICAgICAgaWYgdGl0bGU6Ci0gICAgICAgICAgICAgICAgc2VsZi50aXRsZSAgICAgICA9IHRpdGxlCi0gICAgICAgICAgICAgICAgc2VsZi5hYnN0cmFjdCAgICA9IGJsb2NrLmdldF9tYXJrdXBfd29yZHMoICJhYnN0cmFjdCIgKQotICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBibG9jay5nZXRfbWFya3VwX2l0ZW1zKCAiZGVzY3JpcHRpb24iICkKLSAgICAgICAgICAgICAgICBzZWxmLm9yZGVyICAgICAgID0gYmxvY2suZ2V0X21hcmt1cF93b3Jkc19hbGwoICJvcmRlciIgKQotICAgICAgICAgICAgICAgIHJldHVybgotCi0gICAgZGVmICByZW9yZGVyKCBzZWxmICk6Ci0gICAgICAgIHNlbGYuYmxvY2tfbmFtZXMgPSBzb3J0X29yZGVyX2xpc3QoIHNlbGYuYmxvY2tfbmFtZXMsIHNlbGYub3JkZXIgKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgQ09OVEVOVCBQUk9DRVNTT1IgQ0xBU1MKLSMjCi1jbGFzcyAgQ29udGVudFByb2Nlc3NvcjoKLQotICAgIGRlZiAgX19pbml0X18oIHNlbGYgKToKLSAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIGJsb2NrIGNvbnRlbnQgcHJvY2Vzc29yLiIiIgotICAgICAgICBzZWxmLnJlc2V0KCkKLQotICAgICAgICBzZWxmLnNlY3Rpb25zID0ge30gICAgIyBkaWN0aW9uYXJ5IG9mIGRvY3VtZW50YXRpb24gc2VjdGlvbnMKLSAgICAgICAgc2VsZi5zZWN0aW9uICA9IE5vbmUgICMgY3VycmVudCBkb2N1bWVudGF0aW9uIHNlY3Rpb24KLQotICAgICAgICBzZWxmLmNoYXB0ZXJzID0gW10gICAgIyBsaXN0IG9mIGNoYXB0ZXJzCi0KLSAgICAgICAgc2VsZi5oZWFkZXJzICA9IHt9ICAgICMgZGljdGlvbmFyeSBvZiBoZWFkZXIgbWFjcm9zCi0KLSAgICBkZWYgIHNldF9zZWN0aW9uKCBzZWxmLCBzZWN0aW9uX25hbWUgKToKLSAgICAgICAgIiIiU2V0IGN1cnJlbnQgc2VjdGlvbiBkdXJpbmcgcGFyc2luZy4iIiIKLSAgICAgICAgaWYgbm90IHNlY3Rpb25fbmFtZSBpbiBzZWxmLnNlY3Rpb25zOgotICAgICAgICAgICAgc2VjdGlvbiA9IERvY1NlY3Rpb24oIHNlY3Rpb25fbmFtZSApCi0gICAgICAgICAgICBzZWxmLnNlY3Rpb25zW3NlY3Rpb25fbmFtZV0gPSBzZWN0aW9uCi0gICAgICAgICAgICBzZWxmLnNlY3Rpb24gICAgICAgICAgICAgICAgPSBzZWN0aW9uCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnNlY3Rpb24gPSBzZWxmLnNlY3Rpb25zW3NlY3Rpb25fbmFtZV0KLQotICAgIGRlZiAgYWRkX2NoYXB0ZXIoIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIGNoYXB0ZXIgPSBEb2NDaGFwdGVyKCBibG9jayApCi0gICAgICAgIHNlbGYuY2hhcHRlcnMuYXBwZW5kKCBjaGFwdGVyICkKLQotICAgIGRlZiAgcmVzZXQoIHNlbGYgKToKLSAgICAgICAgIiIiUmVzZXQgdGhlIGNvbnRlbnQgcHJvY2Vzc29yIGZvciBhIG5ldyBibG9jay4iIiIKLSAgICAgICAgc2VsZi5tYXJrdXBzICAgICAgPSBbXQotICAgICAgICBzZWxmLm1hcmt1cCAgICAgICA9IE5vbmUKLSAgICAgICAgc2VsZi5tYXJrdXBfbGluZXMgPSBbXQotCi0gICAgZGVmICBhZGRfbWFya3VwKCBzZWxmICk6Ci0gICAgICAgICIiIkFkZCBhIG5ldyBtYXJrdXAgc2VjdGlvbi4iIiIKLSAgICAgICAgaWYgc2VsZi5tYXJrdXAgYW5kIHNlbGYubWFya3VwX2xpbmVzOgotCi0gICAgICAgICAgICAjIGdldCByaWQgb2YgbGFzdCBsaW5lIG9mIG1hcmt1cCBpZiBpdCdzIGVtcHR5Ci0gICAgICAgICAgICBtYXJrcyA9IHNlbGYubWFya3VwX2xpbmVzCi0gICAgICAgICAgICBpZiBsZW4oIG1hcmtzICkgPiAwIGFuZCBub3Qgc3RyaW5nLnN0cmlwKCBtYXJrc1stMV0gKToKLSAgICAgICAgICAgICAgICBzZWxmLm1hcmt1cF9saW5lcyA9IG1hcmtzWzotMV0KLQotICAgICAgICAgICAgbSA9IERvY01hcmt1cCggc2VsZi5tYXJrdXAsIHNlbGYubWFya3VwX2xpbmVzICkKLQotICAgICAgICAgICAgc2VsZi5tYXJrdXBzLmFwcGVuZCggbSApCi0KLSAgICAgICAgICAgIHNlbGYubWFya3VwICAgICAgID0gTm9uZQotICAgICAgICAgICAgc2VsZi5tYXJrdXBfbGluZXMgPSBbXQotCi0gICAgZGVmICBwcm9jZXNzX2NvbnRlbnQoIHNlbGYsIGNvbnRlbnQgKToKLSAgICAgICAgIiIiUHJvY2VzcyBhIGJsb2NrIGNvbnRlbnQgYW5kIHJldHVybiBhIGxpc3Qgb2YgRG9jTWFya3VwIG9iamVjdHMKLSAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byBpdC4iIiIKLSAgICAgICAgbWFya3VwICAgICAgID0gTm9uZQotICAgICAgICBtYXJrdXBfbGluZXMgPSBbXQotICAgICAgICBmaXJzdCAgICAgICAgPSAxCi0KLSAgICAgICAgZm9yIGxpbmUgaW4gY29udGVudDoKLSAgICAgICAgICAgIGZvdW5kID0gTm9uZQotICAgICAgICAgICAgZm9yIHQgaW4gcmVfbWFya3VwX3RhZ3M6Ci0gICAgICAgICAgICAgICAgbSA9IHQubWF0Y2goIGxpbmUgKQotICAgICAgICAgICAgICAgIGlmIG06Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kICA9IHN0cmluZy5sb3dlciggbS5ncm91cCggMSApICkKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbGVuKCBtLmdyb3VwKCAwICkgKQotICAgICAgICAgICAgICAgICAgICBsaW5lICAgPSAiICIgKiBwcmVmaXggKyBsaW5lW3ByZWZpeDpdICAgIyByZW1vdmUgbWFya3VwIGZyb20gbGluZQotICAgICAgICAgICAgICAgICAgICBicmVhawotCi0gICAgICAgICAgICAjIGlzIGl0IHRoZSBzdGFydCBvZiBhIG5ldyBtYXJrdXAgc2VjdGlvbiA/Ci0gICAgICAgICAgICBpZiBmb3VuZDoKLSAgICAgICAgICAgICAgICBmaXJzdCA9IDAKLSAgICAgICAgICAgICAgICBzZWxmLmFkZF9tYXJrdXAoKSAgIyBhZGQgY3VycmVudCBtYXJrdXAgY29udGVudAotICAgICAgICAgICAgICAgIHNlbGYubWFya3VwID0gZm91bmQKLSAgICAgICAgICAgICAgICBpZiBsZW4oIHN0cmluZy5zdHJpcCggbGluZSApICkgPiAwOgotICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcmt1cF9saW5lcy5hcHBlbmQoIGxpbmUgKQotICAgICAgICAgICAgZWxpZiBmaXJzdCA9PSAwOgotICAgICAgICAgICAgICAgIHNlbGYubWFya3VwX2xpbmVzLmFwcGVuZCggbGluZSApCi0KLSAgICAgICAgc2VsZi5hZGRfbWFya3VwKCkKLQotICAgICAgICByZXR1cm4gc2VsZi5tYXJrdXBzCi0KLSAgICBkZWYgIHBhcnNlX3NvdXJjZXMoIHNlbGYsIHNvdXJjZV9wcm9jZXNzb3IgKToKLSAgICAgICAgYmxvY2tzID0gc291cmNlX3Byb2Nlc3Nvci5ibG9ja3MKLSAgICAgICAgY291bnQgID0gbGVuKCBibG9ja3MgKQotCi0gICAgICAgIGZvciBuIGluIHJhbmdlKCBjb3VudCApOgotICAgICAgICAgICAgc291cmNlID0gYmxvY2tzW25dCi0gICAgICAgICAgICBpZiBzb3VyY2UuY29udGVudDoKLSAgICAgICAgICAgICAgICAjIHRoaXMgaXMgYSBkb2N1bWVudGF0aW9uIGNvbW1lbnQsIHdlIG5lZWQgdG8gY2F0Y2gKLSAgICAgICAgICAgICAgICAjIGFsbCBmb2xsb3dpbmcgbm9ybWFsIGJsb2NrcyBpbiB0aGUgImZvbGxvdyIgbGlzdAotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICBmb2xsb3cgPSBbXQotICAgICAgICAgICAgICAgIG0gPSBuICsgMQotICAgICAgICAgICAgICAgIHdoaWxlIG0gPCBjb3VudCBhbmQgbm90IGJsb2Nrc1ttXS5jb250ZW50OgotICAgICAgICAgICAgICAgICAgICBmb2xsb3cuYXBwZW5kKCBibG9ja3NbbV0gKQotICAgICAgICAgICAgICAgICAgICBtID0gbSArIDEKLQotICAgICAgICAgICAgICAgIGRvY19ibG9jayA9IERvY0Jsb2NrKCBzb3VyY2UsIGZvbGxvdywgc2VsZiApCi0KLSAgICBkZWYgIGZpbmlzaCggc2VsZiApOgotICAgICAgICAjIHByb2Nlc3MgYWxsIHNlY3Rpb25zIHRvIGV4dHJhY3QgdGhlaXIgYWJzdHJhY3QsIGRlc2NyaXB0aW9uCi0gICAgICAgICMgYW5kIG9yZGVyZWQgbGlzdCBvZiBpdGVtcwotICAgICAgICAjCi0gICAgICAgIGZvciBzZWMgaW4gc2VsZi5zZWN0aW9ucy52YWx1ZXMoKToKLSAgICAgICAgICAgIHNlYy5wcm9jZXNzKCkKLQotICAgICAgICAjIHByb2Nlc3MgY2hhcHRlcnMgdG8gY2hlY2sgdGhhdCBhbGwgc2VjdGlvbnMgYXJlIGNvcnJlY3RseQotICAgICAgICAjIGxpc3RlZCB0aGVyZQotICAgICAgICBmb3IgY2hhcCBpbiBzZWxmLmNoYXB0ZXJzOgotICAgICAgICAgICAgZm9yIHNlYyBpbiBjaGFwLm9yZGVyOgotICAgICAgICAgICAgICAgIGlmIHNlYyBpbiBzZWxmLnNlY3Rpb25zOgotICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID0gc2VsZi5zZWN0aW9uc1tzZWNdCi0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uY2hhcHRlciA9IGNoYXAKLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5yZW9yZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgY2hhcC5zZWN0aW9ucy5hcHBlbmQoIHNlY3Rpb24gKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICJXQVJOSU5HOiBjaGFwdGVyICciICsgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcC5uYW1lICsgIicgaW4gIiArIGNoYXAuYmxvY2subG9jYXRpb24oKSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICIgbGlzdHMgdW5rbm93biBzZWN0aW9uICciICsgc2VjICsgIidcbiIgKQotCi0gICAgICAgICMgY2hlY2sgdGhhdCBhbGwgc2VjdGlvbnMgYXJlIGluIGEgY2hhcHRlcgotICAgICAgICAjCi0gICAgICAgIG90aGVycyA9IFtdCi0gICAgICAgIGZvciBzZWMgaW4gc2VsZi5zZWN0aW9ucy52YWx1ZXMoKToKLSAgICAgICAgICAgIGlmIG5vdCBzZWMuY2hhcHRlcjoKLSAgICAgICAgICAgICAgICBzZWMucmVvcmRlcigpCi0gICAgICAgICAgICAgICAgb3RoZXJzLmFwcGVuZCggc2VjICkKLQotICAgICAgICAjIGNyZWF0ZSBhIG5ldyBzcGVjaWFsIGNoYXB0ZXIgZm9yIGFsbCByZW1haW5pbmcgc2VjdGlvbnMKLSAgICAgICAgIyB3aGVuIG5lY2Vzc2FyeQotICAgICAgICAjCi0gICAgICAgIGlmIG90aGVyczoKLSAgICAgICAgICAgIGNoYXAgPSBEb2NDaGFwdGVyKCBOb25lICkKLSAgICAgICAgICAgIGNoYXAuc2VjdGlvbnMgPSBvdGhlcnMKLSAgICAgICAgICAgIHNlbGYuY2hhcHRlcnMuYXBwZW5kKCBjaGFwICkKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotIyMgIERPQyBCTE9DSyBDTEFTUwotIyMKLWNsYXNzICBEb2NCbG9jazoKLQotICAgIGRlZiAgX19pbml0X18oIHNlbGYsIHNvdXJjZSwgZm9sbG93LCBwcm9jZXNzb3IgKToKLSAgICAgICAgcHJvY2Vzc29yLnJlc2V0KCkKLQotICAgICAgICBzZWxmLnNvdXJjZSAgPSBzb3VyY2UKLSAgICAgICAgc2VsZi5jb2RlICAgID0gW10KLSAgICAgICAgc2VsZi50eXBlICAgID0gIkVSUlRZUEUiCi0gICAgICAgIHNlbGYubmFtZSAgICA9ICJFUlJOQU1FIgotICAgICAgICBzZWxmLnNlY3Rpb24gPSBwcm9jZXNzb3Iuc2VjdGlvbgotICAgICAgICBzZWxmLm1hcmt1cHMgPSBwcm9jZXNzb3IucHJvY2Vzc19jb250ZW50KCBzb3VyY2UuY29udGVudCApCi0KLSAgICAgICAgIyBjb21wdXRlIGJsb2NrIHR5cGUgZnJvbSBmaXJzdCBtYXJrdXAgdGFnCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYudHlwZSA9IHNlbGYubWFya3Vwc1swXS50YWcKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcGFzcwotCi0gICAgICAgICMgY29tcHV0ZSBibG9jayBuYW1lIGZyb20gZmlyc3QgbWFya3VwIHBhcmFncmFwaAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtYXJrdXAgPSBzZWxmLm1hcmt1cHNbMF0KLSAgICAgICAgICAgIHBhcmEgICA9IG1hcmt1cC5maWVsZHNbMF0uaXRlbXNbMF0KLSAgICAgICAgICAgIG5hbWUgICA9IHBhcmEud29yZHNbMF0KLSAgICAgICAgICAgIG0gPSByZV9pZGVudGlmaWVyLm1hdGNoKCBuYW1lICkKLSAgICAgICAgICAgIGlmIG06Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoIDEgKQotICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgaWYgc2VsZi50eXBlID09ICJzZWN0aW9uIjoKLSAgICAgICAgICAgICMgZGV0ZWN0IG5ldyBzZWN0aW9uIHN0YXJ0cwotICAgICAgICAgICAgcHJvY2Vzc29yLnNldF9zZWN0aW9uKCBzZWxmLm5hbWUgKQotICAgICAgICAgICAgcHJvY2Vzc29yLnNlY3Rpb24uYWRkX2RlZiggc2VsZiApCi0gICAgICAgIGVsaWYgc2VsZi50eXBlID09ICJjaGFwdGVyIjoKLSAgICAgICAgICAgICMgZGV0ZWN0IG5ldyBjaGFwdGVyCi0gICAgICAgICAgICBwcm9jZXNzb3IuYWRkX2NoYXB0ZXIoIHNlbGYgKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJvY2Vzc29yLnNlY3Rpb24uYWRkX2Jsb2NrKCBzZWxmICkKLQotICAgICAgICAjIG5vdywgY29tcHV0ZSB0aGUgc291cmNlIGxpbmVzIHJlbGV2YW50IHRvIHRoaXMgZG9jdW1lbnRhdGlvbgotICAgICAgICAjIGJsb2NrLiBXZSBrZWVwIG5vcm1hbCBjb21tZW50cyBpbiBmb3Igb2J2aW91cyByZWFzb25zICg/PykKLSAgICAgICAgc291cmNlID0gW10KLSAgICAgICAgZm9yIGIgaW4gZm9sbG93OgotICAgICAgICAgICAgaWYgYi5mb3JtYXQ6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZvciBsIGluIGIubGluZXM6Ci0gICAgICAgICAgICAgICAgIyBjb2xsZWN0IGhlYWRlciBtYWNybyBkZWZpbml0aW9ucwotICAgICAgICAgICAgICAgIG0gPSByZV9oZWFkZXJfbWFjcm8ubWF0Y2goIGwgKQotICAgICAgICAgICAgICAgIGlmIG06Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvci5oZWFkZXJzW20uZ3JvdXAoIDIgKV0gPSBtLmdyb3VwKCAxICk7Ci0KLSAgICAgICAgICAgICAgICAjIHdlIHVzZSAiLyogKi8iIGFzIGEgc2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgaWYgcmVfc291cmNlX3NlcC5tYXRjaCggbCApOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIHNvdXJjZS5hcHBlbmQoIGwgKQotCi0gICAgICAgICMgbm93IHN0cmlwIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBlbXB0eSBsaW5lcyBmcm9tIHRoZSBzb3VyY2VzCi0gICAgICAgIHN0YXJ0ID0gMAotICAgICAgICBlbmQgICA9IGxlbiggc291cmNlICkgLSAxCi0KLSAgICAgICAgd2hpbGUgc3RhcnQgPCBlbmQgYW5kIG5vdCBzdHJpbmcuc3RyaXAoIHNvdXJjZVtzdGFydF0gKToKLSAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgKyAxCi0KLSAgICAgICAgd2hpbGUgc3RhcnQgPCBlbmQgYW5kIG5vdCBzdHJpbmcuc3RyaXAoIHNvdXJjZVtlbmRdICk6Ci0gICAgICAgICAgICBlbmQgPSBlbmQgLSAxCi0KLSAgICAgICAgaWYgc3RhcnQgPT0gZW5kIGFuZCBub3Qgc3RyaW5nLnN0cmlwKCBzb3VyY2Vbc3RhcnRdICk6Ci0gICAgICAgICAgICBzZWxmLmNvZGUgPSBbXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5jb2RlID0gc291cmNlW3N0YXJ0OmVuZCArIDFdCi0KLSAgICBkZWYgIGxvY2F0aW9uKCBzZWxmICk6Ci0gICAgICAgIHJldHVybiBzZWxmLnNvdXJjZS5sb2NhdGlvbigpCi0KLSAgICBkZWYgIGdldF9tYXJrdXAoIHNlbGYsIHRhZ19uYW1lICk6Ci0gICAgICAgICIiIlJldHVybiB0aGUgRG9jTWFya3VwIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiB0YWcgaW4gYSBibG9jay4iIiIKLSAgICAgICAgZm9yIG0gaW4gc2VsZi5tYXJrdXBzOgotICAgICAgICAgICAgaWYgbS50YWcgPT0gc3RyaW5nLmxvd2VyKCB0YWdfbmFtZSApOgotICAgICAgICAgICAgICAgIHJldHVybiBtCi0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICBkZWYgIGdldF9tYXJrdXBfd29yZHMoIHNlbGYsIHRhZ19uYW1lICk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldF9tYXJrdXAoIHRhZ19uYW1lICkKLSAgICAgICAgICAgIHJldHVybiBtLmZpZWxkc1swXS5pdGVtc1swXS53b3JkcwotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICByZXR1cm4gW10KLQotICAgIGRlZiAgZ2V0X21hcmt1cF93b3Jkc19hbGwoIHNlbGYsIHRhZ19uYW1lICk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldF9tYXJrdXAoIHRhZ19uYW1lICkKLSAgICAgICAgICAgIHdvcmRzID0gW10KLSAgICAgICAgICAgIGZvciBpdGVtIGluIG0uZmllbGRzWzBdLml0ZW1zOgotICAgICAgICAgICAgICAgICMgV2UgaG9ub3VyIGVtcHR5IGxpbmVzIGluIGFuIGA8T3JkZXI+JyBzZWN0aW9uIGVsZW1lbnQgYnkKLSAgICAgICAgICAgICAgICAjIGFkZGluZyB0aGUgc2VudGluZWwgYC9lbXB0eS8nLiAgVGhlIGZvcm1hdHRlciBzaG91bGQgdGhlbgotICAgICAgICAgICAgICAgICMgY29udmVydCBpdCB0byBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbiBpbiB0aGUKLSAgICAgICAgICAgICAgICAjIGBzZWN0aW9uX2VudGVyJyBmdW5jdGlvbi4KLSAgICAgICAgICAgICAgICB3b3JkcyArPSBpdGVtLndvcmRzCi0gICAgICAgICAgICAgICAgd29yZHMuYXBwZW5kKCAiL2VtcHR5LyIgKQotICAgICAgICAgICAgcmV0dXJuIHdvcmRzCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHJldHVybiBbXQotCi0gICAgZGVmICBnZXRfbWFya3VwX3RleHQoIHNlbGYsIHRhZ19uYW1lICk6Ci0gICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0X21hcmt1cF93b3JkcyggdGFnX25hbWUgKQotICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oIHJlc3VsdCApCi0KLSAgICBkZWYgIGdldF9tYXJrdXBfaXRlbXMoIHNlbGYsIHRhZ19uYW1lICk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldF9tYXJrdXAoIHRhZ19uYW1lICkKLSAgICAgICAgICAgIHJldHVybiBtLmZpZWxkc1swXS5pdGVtcwotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0jIGVvZgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2RvY21ha2VyL2RvY2JlYXV0eS5weSBiL3NyYy90b29scy9kb2NtYWtlci9kb2NiZWF1dHkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZGY0YTkuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL2RvY21ha2VyL2RvY2JlYXV0eS5weQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgIERvY0JlYXV0eSAoYykgMjAwMywgMjAwNCwgMjAwOCBEYXZpZCBUdXJuZXIgPGRhdmlkQGZyZWV0eXBlLm9yZz4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gYmVhdXRpZnkgdGhlIGRvY3VtZW50YXRpb24gY29tbWVudHMgdXNlZAotIyBpbiB0aGUgRnJlZVR5cGUgMiBwdWJsaWMgaGVhZGVycy4KLSMKLQotZnJvbSBzb3VyY2VzIGltcG9ydCAqCi1mcm9tIGNvbnRlbnQgaW1wb3J0ICoKLWZyb20gdXRpbHMgICBpbXBvcnQgKgotCi1pbXBvcnQgdXRpbHMKLQotaW1wb3J0IHN5cywgb3MsIHRpbWUsIHN0cmluZywgZ2V0b3B0Ci0KLQotY29udGVudF9wcm9jZXNzb3IgPSBDb250ZW50UHJvY2Vzc29yKCkKLQotCi1kZWYgIGJlYXV0aWZ5X2Jsb2NrKCBibG9jayApOgotICAgIGlmIGJsb2NrLmNvbnRlbnQ6Ci0gICAgICAgIGNvbnRlbnRfcHJvY2Vzc29yLnJlc2V0KCkKLQotICAgICAgICBtYXJrdXBzID0gY29udGVudF9wcm9jZXNzb3IucHJvY2Vzc19jb250ZW50KCBibG9jay5jb250ZW50ICkKLSAgICAgICAgdGV4dCAgICA9IFtdCi0gICAgICAgIGZpcnN0ICAgPSAxCi0KLSAgICAgICAgZm9yIG1hcmt1cCBpbiBtYXJrdXBzOgotICAgICAgICAgICAgdGV4dC5leHRlbmQoIG1hcmt1cC5iZWF1dGlmeSggZmlyc3QgKSApCi0gICAgICAgICAgICBmaXJzdCA9IDAKLQotICAgICAgICAjIG5vdyBiZWF1dGlmeSB0aGUgZG9jdW1lbnRhdGlvbiAiYm9yZGVycyIgdGhlbXNlbHZlcwotICAgICAgICBsaW5lcyA9IFsiIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIl0KLSAgICAgICAgZm9yIGwgaW4gdGV4dDoKLSAgICAgICAgICAgIGxpbmVzLmFwcGVuZCggIiAgKiIgKyBsICkKLSAgICAgICAgbGluZXMuYXBwZW5kKCAiICAqLyIgKQotCi0gICAgICAgIGJsb2NrLmxpbmVzID0gbGluZXMKLQotCi1kZWYgIHVzYWdlKCk6Ci0gICAgcHJpbnQgIlxuRG9jQmVhdXR5IDAuMSBVc2FnZSBpbmZvcm1hdGlvblxuIgotICAgIHByaW50ICIgIGRvY2JlYXV0eSBbb3B0aW9uc10gZmlsZTEgW2ZpbGUyIC4uLl1cbiIKLSAgICBwcmludCAidXNpbmcgdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuIgotICAgIHByaW50ICIgIC1oIDogcHJpbnQgdGhpcyBwYWdlIgotICAgIHByaW50ICIgIC1iIDogYmFja3VwIG9yaWdpbmFsIGZpbGVzIHdpdGggdGhlICdvcmlnJyBleHRlbnNpb24iCi0gICAgcHJpbnQgIiIKLSAgICBwcmludCAiICAtLWJhY2t1cCA6IHNhbWUgYXMgLWIiCi0KLQotZGVmICBtYWluKCBhcmd2ICk6Ci0gICAgIiIibWFpbiBwcm9ncmFtIGxvb3AiIiIKLQotICAgIGdsb2JhbCBvdXRwdXRfZGlyCi0KLSAgICB0cnk6Ci0gICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KCBzeXMuYXJndlsxOl0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYiIsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxwIiwgImJhY2t1cCJdICkKLSAgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KCAyICkKLQotICAgIGlmIGFyZ3MgPT0gW106Ci0gICAgICAgIHVzYWdlKCkKLSAgICAgICAgc3lzLmV4aXQoIDEgKQotCi0gICAgIyBwcm9jZXNzIG9wdGlvbnMKLSAgICAjCi0gICAgb3V0cHV0X2RpciA9IE5vbmUKLSAgICBkb19iYWNrdXAgID0gTm9uZQotCi0gICAgZm9yIG9wdCBpbiBvcHRzOgotICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLWgiLCAiLS1oZWxwIiApOgotICAgICAgICAgICAgdXNhZ2UoKQotICAgICAgICAgICAgc3lzLmV4aXQoIDAgKQotCi0gICAgICAgIGlmIG9wdFswXSBpbiAoICItYiIsICItLWJhY2t1cCIgKToKLSAgICAgICAgICAgIGRvX2JhY2t1cCA9IDEKLQotICAgICMgY3JlYXRlIGNvbnRleHQgYW5kIHByb2Nlc3NvcgotICAgIHNvdXJjZV9wcm9jZXNzb3IgPSBTb3VyY2VQcm9jZXNzb3IoKQotCi0gICAgIyByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyB0byBwcm9jZXNzCi0gICAgZmlsZV9saXN0ID0gbWFrZV9maWxlX2xpc3QoIGFyZ3MgKQotICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlX2xpc3Q6Ci0gICAgICAgIHNvdXJjZV9wcm9jZXNzb3IucGFyc2VfZmlsZSggZmlsZW5hbWUgKQotCi0gICAgICAgIGZvciBibG9jayBpbiBzb3VyY2VfcHJvY2Vzc29yLmJsb2NrczoKLSAgICAgICAgICAgIGJlYXV0aWZ5X2Jsb2NrKCBibG9jayApCi0KLSAgICAgICAgbmV3X25hbWUgPSBmaWxlbmFtZSArICIubmV3IgotICAgICAgICBvayAgICAgICA9IE5vbmUKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmaWxlID0gb3BlbiggbmV3X25hbWUsICJ3dCIgKQotICAgICAgICAgICAgZm9yIGJsb2NrIGluIHNvdXJjZV9wcm9jZXNzb3IuYmxvY2tzOgotICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGJsb2NrLmxpbmVzOgotICAgICAgICAgICAgICAgICAgICBmaWxlLndyaXRlKCBsaW5lICkKLSAgICAgICAgICAgICAgICAgICAgZmlsZS53cml0ZSggIlxuIiApCi0gICAgICAgICAgICBmaWxlLmNsb3NlKCkKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgb2sgPSAwCi0KLQotIyBpZiBjYWxsZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lCi0jCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oIHN5cy5hcmd2ICkKLQotCi0jIGVvZgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5IGIvc3JjL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTI1ZmYwLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9kb2NtYWtlci9kb2NtYWtlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgIGRvY21ha2VyLnB5Ci0jCi0jICAgIENvbnZlcnQgc291cmNlIGNvZGUgbWFya3VwIHRvIEhUTUwgZG9jdW1lbnRhdGlvbi4KLSMKLSMgIENvcHlyaWdodCAyMDAyLTIwMTcgYnkKLSMgIERhdmlkIFR1cm5lci4KLSMKLSMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLSMgIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0Ci0jICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKLSMgIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotIyAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBhIHJlLXdyaXRlIG9mIHRoZSBvcmlnaW5hbCBEb2NNYWtlciB0b29sIHVzZWQgdG8gZ2VuZXJhdGUKLSMgdGhlIEFQSSBSZWZlcmVuY2Ugb2YgdGhlIEZyZWVUeXBlIGZvbnQgcmVuZGVyaW5nIGVuZ2luZSBieSBjb252ZXJ0aW5nCi0jIGluLXNvdXJjZSBjb21tZW50cyBpbnRvIHN0cnVjdHVyZWQgSFRNTC4KLSMKLSMgVGhpcyBuZXcgdmVyc2lvbiBpcyBjYXBhYmxlIG9mIG91dHB1dHRpbmcgWE1MIGRhdGEgYXMgd2VsbCBhcyBhY2NlcHRpbmcKLSMgbW9yZSBsaWJlcmFsIGZvcm1hdHRpbmcgb3B0aW9ucy4gIEl0IGFsc28gdXNlcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcKLSMgYW5kIHN1YnN0aXR1dGlvbiB0byBzcGVlZCB1cCBvcGVyYXRpb24gc2lnbmlmaWNhbnRseS4KLSMKLQotZnJvbSBzb3VyY2VzICAgaW1wb3J0ICoKLWZyb20gY29udGVudCAgIGltcG9ydCAqCi1mcm9tIHV0aWxzICAgICBpbXBvcnQgKgotZnJvbSBmb3JtYXR0ZXIgaW1wb3J0ICoKLWZyb20gdG9odG1sICAgIGltcG9ydCAqCi0KLWltcG9ydCB1dGlscwotCi1pbXBvcnQgc3lzLCBvcywgdGltZSwgc3RyaW5nLCBnbG9iLCBnZXRvcHQKLQotCi1kZWYgIHVzYWdlKCk6Ci0gICAgcHJpbnQgIlxuRG9jTWFrZXIgVXNhZ2UgaW5mb3JtYXRpb25cbiIKLSAgICBwcmludCAiICBkb2NtYWtlciBbb3B0aW9uc10gZmlsZTEgW2ZpbGUyIC4uLl1cbiIKLSAgICBwcmludCAidXNpbmcgdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuIgotICAgIHByaW50ICIgIC1oIDogcHJpbnQgdGhpcyBwYWdlIgotICAgIHByaW50ICIgIC10IDogc2V0IHByb2plY3QgdGl0bGUsIGFzIGluICctdCBcIk15IFByb2plY3RcIiciCi0gICAgcHJpbnQgIiAgLW8gOiBzZXQgb3V0cHV0IGRpcmVjdG9yeSwgYXMgaW4gJy1vIG15ZGlyJyIKLSAgICBwcmludCAiICAtcCA6IHNldCBkb2N1bWVudGF0aW9uIHByZWZpeCwgYXMgaW4gJy1wIGZ0MiciCi0gICAgcHJpbnQgIiIKLSAgICBwcmludCAiICAtLXRpdGxlICA6IHNhbWUgYXMgLXQsIGFzIGluICctLXRpdGxlPVwiTXkgUHJvamVjdFwiJyIKLSAgICBwcmludCAiICAtLW91dHB1dCA6IHNhbWUgYXMgLW8sIGFzIGluICctLW91dHB1dD1teWRpciciCi0gICAgcHJpbnQgIiAgLS1wcmVmaXggOiBzYW1lIGFzIC1wLCBhcyBpbiAnLS1wcmVmaXg9ZnQyJyIKLQotCi1kZWYgIG1haW4oIGFyZ3YgKToKLSAgICAiIiJNYWluIHByb2dyYW0gbG9vcC4iIiIKLQotICAgIGdsb2JhbCBvdXRwdXRfZGlyCi0KLSAgICB0cnk6Ci0gICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KCBzeXMuYXJndlsxOl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHQ6bzpwOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbHAiLCAidGl0bGU9IiwgIm91dHB1dD0iLCAicHJlZml4PSJdICkKLSAgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KCAyICkKLQotICAgIGlmIGFyZ3MgPT0gW106Ci0gICAgICAgIHVzYWdlKCkKLSAgICAgICAgc3lzLmV4aXQoIDEgKQotCi0gICAgIyBwcm9jZXNzIG9wdGlvbnMKLSAgICBwcm9qZWN0X3RpdGxlICA9ICJQcm9qZWN0IgotICAgIHByb2plY3RfcHJlZml4ID0gTm9uZQotICAgIG91dHB1dF9kaXIgICAgID0gTm9uZQotCi0gICAgZm9yIG9wdCBpbiBvcHRzOgotICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLWgiLCAiLS1oZWxwIiApOgotICAgICAgICAgICAgdXNhZ2UoKQotICAgICAgICAgICAgc3lzLmV4aXQoIDAgKQotCi0gICAgICAgIGlmIG9wdFswXSBpbiAoICItdCIsICItLXRpdGxlIiApOgotICAgICAgICAgICAgcHJvamVjdF90aXRsZSA9IG9wdFsxXQotCi0gICAgICAgIGlmIG9wdFswXSBpbiAoICItbyIsICItLW91dHB1dCIgKToKLSAgICAgICAgICAgIHV0aWxzLm91dHB1dF9kaXIgPSBvcHRbMV0KLQotICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLXAiLCAiLS1wcmVmaXgiICk6Ci0gICAgICAgICAgICBwcm9qZWN0X3ByZWZpeCA9IG9wdFsxXQotCi0gICAgY2hlY2tfb3V0cHV0KCkKLQotICAgICMgY3JlYXRlIGNvbnRleHQgYW5kIHByb2Nlc3NvcgotICAgIHNvdXJjZV9wcm9jZXNzb3IgID0gU291cmNlUHJvY2Vzc29yKCkKLSAgICBjb250ZW50X3Byb2Nlc3NvciA9IENvbnRlbnRQcm9jZXNzb3IoKQotCi0gICAgIyByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyB0byBwcm9jZXNzCi0gICAgZmlsZV9saXN0ID0gbWFrZV9maWxlX2xpc3QoIGFyZ3MgKQotICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlX2xpc3Q6Ci0gICAgICAgIHNvdXJjZV9wcm9jZXNzb3IucGFyc2VfZmlsZSggZmlsZW5hbWUgKQotICAgICAgICBjb250ZW50X3Byb2Nlc3Nvci5wYXJzZV9zb3VyY2VzKCBzb3VyY2VfcHJvY2Vzc29yICkKLQotICAgICMgcHJvY2VzcyBzZWN0aW9ucwotICAgIGNvbnRlbnRfcHJvY2Vzc29yLmZpbmlzaCgpCi0KLSAgICBmb3JtYXR0ZXIgPSBIdG1sRm9ybWF0dGVyKCBjb250ZW50X3Byb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X3RpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RfcHJlZml4ICkKLQotICAgIGZvcm1hdHRlci50b2NfZHVtcCgpCi0gICAgZm9ybWF0dGVyLmluZGV4X2R1bXAoKQotICAgIGZvcm1hdHRlci5zZWN0aW9uX2R1bXBfYWxsKCkKLQotCi0jIGlmIGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbiggc3lzLmFyZ3YgKQotCi0jIGVvZgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2RvY21ha2VyL2Zvcm1hdHRlci5weSBiL3NyYy90b29scy9kb2NtYWtlci9mb3JtYXR0ZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDU3NTQuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL2RvY21ha2VyL2Zvcm1hdHRlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0jCi0jICBmb3JtYXR0ZXIucHkKLSMKLSMgICAgQ29udmVydCBwYXJzZWQgY29udGVudCBibG9ja3MgdG8gYSBzdHJ1Y3R1cmVkIGRvY3VtZW50IChsaWJyYXJ5IGZpbGUpLgotIwotIyAgQ29weXJpZ2h0IDIwMDItMjAxNyBieQotIyAgRGF2aWQgVHVybmVyLgotIwotIyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAotIyAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKLSMgIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQotIyAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCi0jICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLSMKLSMgVGhpcyBpcyB0aGUgYmFzZSBGb3JtYXR0ZXIgY2xhc3MuICBJdHMgcHVycG9zZSBpcyB0byBjb252ZXJ0IGEgY29udGVudAotIyBwcm9jZXNzb3IncyBkYXRhIGludG8gc3BlY2lmaWMgZG9jdW1lbnRzIChpLmUuLCB0YWJsZSBvZiBjb250ZW50cywgZ2xvYmFsCi0jIGluZGV4LCBhbmQgaW5kaXZpZHVhbCBBUEkgcmVmZXJlbmNlIGluZGljZXMpLgotIwotIyBZb3UgbmVlZCB0byBzdWItY2xhc3MgaXQgdG8gb3V0cHV0IGFueXRoaW5nIHNlbnNpYmxlLiAgRm9yIGV4YW1wbGUsIHRoZQotIyBmaWxlIGB0b2h0bWwucHknIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBgSHRtbEZvcm1hdHRlcicgc3ViLWNsYXNzCi0jIHRvIG91dHB1dCBIVE1MLgotIwotCi0KLWZyb20gc291cmNlcyBpbXBvcnQgKgotZnJvbSBjb250ZW50IGltcG9ydCAqCi1mcm9tIHV0aWxzICAgaW1wb3J0ICoKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotIyMgIEZPUk1BVFRFUiBDTEFTUwotIyMKLWNsYXNzICBGb3JtYXR0ZXI6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmLCBwcm9jZXNzb3IgKToKLSAgICAgICAgc2VsZi5wcm9jZXNzb3IgICA9IHByb2Nlc3NvcgotICAgICAgICBzZWxmLmlkZW50aWZpZXJzID0ge30KLSAgICAgICAgc2VsZi5jaGFwdGVycyAgICA9IHByb2Nlc3Nvci5jaGFwdGVycwotICAgICAgICBzZWxmLnNlY3Rpb25zICAgID0gcHJvY2Vzc29yLnNlY3Rpb25zLnZhbHVlcygpCi0gICAgICAgIHNlbGYuYmxvY2tfaW5kZXggPSBbXQotCi0gICAgICAgICMgc3RvcmUgYWxsIGJsb2NrcyBpbiBhIGRpY3Rpb25hcnkKLSAgICAgICAgc2VsZi5ibG9ja3MgPSBbXQotICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zOgotICAgICAgICAgICAgZm9yIGJsb2NrIGluIHNlY3Rpb24uYmxvY2tzLnZhbHVlcygpOgotICAgICAgICAgICAgICAgIHNlbGYuYWRkX2lkZW50aWZpZXIoIGJsb2NrLm5hbWUsIGJsb2NrICkKLQotICAgICAgICAgICAgICAgICMgYWRkIGVudW1lcmF0aW9uIHZhbHVlcyB0byB0aGUgaW5kZXgsIHNpbmNlIHRoaXMgaXMgdXNlZnVsCi0gICAgICAgICAgICAgICAgZm9yIG1hcmt1cCBpbiBibG9jay5tYXJrdXBzOgotICAgICAgICAgICAgICAgICAgICBpZiBtYXJrdXAudGFnID09ICd2YWx1ZXMnOgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZpZWxkIGluIG1hcmt1cC5maWVsZHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfaWRlbnRpZmllciggZmllbGQubmFtZSwgYmxvY2sgKQotCi0gICAgICAgIHNlbGYuYmxvY2tfaW5kZXggPSBzZWxmLmlkZW50aWZpZXJzLmtleXMoKQotICAgICAgICBzZWxmLmJsb2NrX2luZGV4LnNvcnQoIGtleSA9IGluZGV4X2tleSApCi0KLSAgICAgICAgIyBhbHNvIGFkZCBzZWN0aW9uIG5hbWVzIHRvIGRpY3Rpb25hcnkgKHdpdGhvdXQgbWFraW5nIHRoZW0gYXBwZWFyCi0gICAgICAgICMgaW4gdGhlIGluZGV4KQotICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zOgotICAgICAgICAgICAgc2VsZi5hZGRfaWRlbnRpZmllciggc2VjdGlvbi5uYW1lLCBzZWN0aW9uICkKLQotICAgIGRlZiAgYWRkX2lkZW50aWZpZXIoIHNlbGYsIG5hbWUsIGJsb2NrICk6Ci0gICAgICAgIGlmIG5hbWUgaW4gc2VsZi5pZGVudGlmaWVyczoKLSAgICAgICAgICAgICMgZHVwbGljYXRlIG5hbWUhCi0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiV0FSTklORzogZHVwbGljYXRlIGRlZmluaXRpb24gZm9yIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICciICsgbmFtZSArICInICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImluICIgKyBibG9jay5sb2NhdGlvbigpICsgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicHJldmlvdXMgZGVmaW5pdGlvbiBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlbGYuaWRlbnRpZmllcnNbbmFtZV0ubG9jYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG4iICkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuaWRlbnRpZmllcnNbbmFtZV0gPSBibG9jawotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyB0aGUgdGFibGUgb2YgY29udGVudHMKLSAgICAjCi0gICAgZGVmICB0b2NfZW50ZXIoIHNlbGYgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICB0b2NfY2hhcHRlcl9lbnRlciggc2VsZiwgY2hhcHRlciApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIHRvY19zZWN0aW9uX2VudGVyKCBzZWxmLCBzZWN0aW9uICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgdG9jX3NlY3Rpb25fZXhpdCggc2VsZiwgc2VjdGlvbiApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIHRvY19jaGFwdGVyX2V4aXQoIHNlbGYsIGNoYXB0ZXIgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICB0b2NfaW5kZXgoIHNlbGYsIGluZGV4X2ZpbGVuYW1lICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgdG9jX2V4aXQoIHNlbGYgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICB0b2NfZHVtcCggc2VsZiwgdG9jX2ZpbGVuYW1lID0gTm9uZSwgaW5kZXhfZmlsZW5hbWUgPSBOb25lICk6Ci0gICAgICAgIG91dHB1dCA9IE5vbmUKLSAgICAgICAgaWYgdG9jX2ZpbGVuYW1lOgotICAgICAgICAgICAgb3V0cHV0ID0gb3Blbl9vdXRwdXQoIHRvY19maWxlbmFtZSApCi0KLSAgICAgICAgc2VsZi50b2NfZW50ZXIoKQotCi0gICAgICAgIGZvciBjaGFwIGluIHNlbGYucHJvY2Vzc29yLmNoYXB0ZXJzOgotCi0gICAgICAgICAgICBzZWxmLnRvY19jaGFwdGVyX2VudGVyKCBjaGFwICkKLQotICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gY2hhcC5zZWN0aW9uczoKLSAgICAgICAgICAgICAgICBzZWxmLnRvY19zZWN0aW9uX2VudGVyKCBzZWN0aW9uICkKLSAgICAgICAgICAgICAgICBzZWxmLnRvY19zZWN0aW9uX2V4aXQoIHNlY3Rpb24gKQotCi0gICAgICAgICAgICBzZWxmLnRvY19jaGFwdGVyX2V4aXQoIGNoYXAgKQotCi0gICAgICAgIHNlbGYudG9jX2luZGV4KCBpbmRleF9maWxlbmFtZSApCi0KLSAgICAgICAgc2VsZi50b2NfZXhpdCgpCi0KLSAgICAgICAgaWYgb3V0cHV0OgotICAgICAgICAgICAgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKQotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyB0aGUgaW5kZXgKLSAgICAjCi0gICAgZGVmICBpbmRleF9lbnRlciggc2VsZiApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIGluZGV4X25hbWVfZW50ZXIoIHNlbGYsIG5hbWUgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICBpbmRleF9uYW1lX2V4aXQoIHNlbGYsIG5hbWUgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICBpbmRleF9leGl0KCBzZWxmICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgaW5kZXhfZHVtcCggc2VsZiwgaW5kZXhfZmlsZW5hbWUgPSBOb25lICk6Ci0gICAgICAgIG91dHB1dCA9IE5vbmUKLSAgICAgICAgaWYgaW5kZXhfZmlsZW5hbWU6Ci0gICAgICAgICAgICBvdXRwdXQgPSBvcGVuX291dHB1dCggaW5kZXhfZmlsZW5hbWUgKQotCi0gICAgICAgIHNlbGYuaW5kZXhfZW50ZXIoKQotCi0gICAgICAgIGZvciBuYW1lIGluIHNlbGYuYmxvY2tfaW5kZXg6Ci0gICAgICAgICAgICBzZWxmLmluZGV4X25hbWVfZW50ZXIoIG5hbWUgKQotICAgICAgICAgICAgc2VsZi5pbmRleF9uYW1lX2V4aXQoIG5hbWUgKQotCi0gICAgICAgIHNlbGYuaW5kZXhfZXhpdCgpCi0KLSAgICAgICAgaWYgb3V0cHV0OgotICAgICAgICAgICAgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKQotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyBhIHNlY3Rpb24KLSAgICAjCi0gICAgZGVmICBzZWN0aW9uX2VudGVyKCBzZWxmLCBzZWN0aW9uICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgYmxvY2tfZW50ZXIoIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgbWFya3VwX2VudGVyKCBzZWxmLCBtYXJrdXAsIGJsb2NrID0gTm9uZSApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIGZpZWxkX2VudGVyKCBzZWxmLCBmaWVsZCwgbWFya3VwID0gTm9uZSwgYmxvY2sgPSBOb25lICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgZmllbGRfZXhpdCggc2VsZiwgZmllbGQsIG1hcmt1cCA9IE5vbmUsIGJsb2NrID0gTm9uZSApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIG1hcmt1cF9leGl0KCBzZWxmLCBtYXJrdXAsIGJsb2NrID0gTm9uZSApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIGJsb2NrX2V4aXQoIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgc2VjdGlvbl9leGl0KCBzZWxmLCBzZWN0aW9uICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgc2VjdGlvbl9kdW1wKCBzZWxmLCBzZWN0aW9uLCBzZWN0aW9uX2ZpbGVuYW1lID0gTm9uZSApOgotICAgICAgICBvdXRwdXQgPSBOb25lCi0gICAgICAgIGlmIHNlY3Rpb25fZmlsZW5hbWU6Ci0gICAgICAgICAgICBvdXRwdXQgPSBvcGVuX291dHB1dCggc2VjdGlvbl9maWxlbmFtZSApCi0KLSAgICAgICAgc2VsZi5zZWN0aW9uX2VudGVyKCBzZWN0aW9uICkKLQotICAgICAgICBmb3IgbmFtZSBpbiBzZWN0aW9uLmJsb2NrX25hbWVzOgotICAgICAgICAgICAgc2tpcF9lbnRyeSA9IDAKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBibG9jayA9IHNlbGYuaWRlbnRpZmllcnNbbmFtZV0KLSAgICAgICAgICAgICAgICAjIGBibG9ja19uYW1lcycgY2FuIGNvbnRhaW4gZmllbGQgbmFtZXMgYWxzbywKLSAgICAgICAgICAgICAgICAjIHdoaWNoIHdlIGZpbHRlciBvdXQKLSAgICAgICAgICAgICAgICBmb3IgbWFya3VwIGluIGJsb2NrLm1hcmt1cHM6Ci0gICAgICAgICAgICAgICAgICAgIGlmIG1hcmt1cC50YWcgPT0gJ3ZhbHVlcyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmllbGQgaW4gbWFya3VwLmZpZWxkczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmaWVsZC5uYW1lID09IG5hbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfZW50cnkgPSAxCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgc2tpcF9lbnRyeSA9IDEgICAjIHRoaXMgaGFwcGVucyBlLmcuIGZvciBgL2VtcHR5LycgZW50cmllcwotCi0gICAgICAgICAgICBpZiBza2lwX2VudHJ5OgotICAgICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgICAgICBzZWxmLmJsb2NrX2VudGVyKCBibG9jayApCi0KLSAgICAgICAgICAgIGZvciBtYXJrdXAgaW4gYmxvY2subWFya3Vwc1sxOl06ICAgIyBhbHdheXMgaWdub3JlIGZpcnN0IG1hcmt1cCEKLSAgICAgICAgICAgICAgICBzZWxmLm1hcmt1cF9lbnRlciggbWFya3VwLCBibG9jayApCi0KLSAgICAgICAgICAgICAgICBmb3IgZmllbGQgaW4gbWFya3VwLmZpZWxkczoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5maWVsZF9lbnRlciggZmllbGQsIG1hcmt1cCwgYmxvY2sgKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmZpZWxkX2V4aXQoIGZpZWxkLCBtYXJrdXAsIGJsb2NrICkKLQotICAgICAgICAgICAgICAgIHNlbGYubWFya3VwX2V4aXQoIG1hcmt1cCwgYmxvY2sgKQotCi0gICAgICAgICAgICBzZWxmLmJsb2NrX2V4aXQoIGJsb2NrICkKLQotICAgICAgICBzZWxmLnNlY3Rpb25fZXhpdCggc2VjdGlvbiApCi0KLSAgICAgICAgaWYgb3V0cHV0OgotICAgICAgICAgICAgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKQotCi0gICAgZGVmICBzZWN0aW9uX2R1bXBfYWxsKCBzZWxmICk6Ci0gICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuc2VjdGlvbnM6Ci0gICAgICAgICAgICBzZWxmLnNlY3Rpb25fZHVtcCggc2VjdGlvbiApCi0KLSMgZW9mCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZG9jbWFrZXIvc291cmNlcy5weSBiL3NyYy90b29scy9kb2NtYWtlci9zb3VyY2VzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQwN2UxLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9kb2NtYWtlci9zb3VyY2VzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLSMKLSMgIHNvdXJjZXMucHkKLSMKLSMgICAgQ29udmVydCBzb3VyY2UgY29kZSBjb21tZW50cyB0byBtdWx0aS1saW5lIGJsb2NrcyAobGlicmFyeSBmaWxlKS4KLSMKLSMgIENvcHlyaWdodCAyMDAyLTIwMTcgYnkKLSMgIERhdmlkIFR1cm5lci4KLSMKLSMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLSMgIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0Ci0jICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKLSMgIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotIyAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0jCi0jIFRoaXMgbGlicmFyeSBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIGNsYXNzZXMgbmVlZGVkIHRvIGRlY29tcG9zZSBDCi0jIHNvdXJjZSBjb2RlIGZpbGVzIGludG8gYSBzZXJpZXMgb2YgbXVsdGktbGluZSBgYmxvY2tzJy4gIFRoZXJlIGFyZSB0d28KLSMga2luZHMgb2YgYmxvY2tzLgotIwotIyAgIC0gTm9ybWFsIGJsb2Nrcywgd2hpY2ggY29udGFpbiBzb3VyY2UgY29kZSBvciBvcmRpbmFyeSBjb21tZW50cy4KLSMKLSMgICAtIERvY3VtZW50YXRpb24gYmxvY2tzLCB3aGljaCBoYXZlIHJlc3RyaWN0ZWQgZm9ybWF0dGluZywgYW5kIHdob3NlIHRleHQKLSMgICAgIGFsd2F5cyBzdGFydCB3aXRoIGEgZG9jdW1lbnRhdGlvbiBtYXJrdXAgdGFnIGxpa2UgYDxGdW5jdGlvbj4nLAotIyAgICAgYDxUeXBlPicsIGV0Yy4KLSMKLSMgVGhlIHJvdXRpbmVzIHRvIHByb2Nlc3MgdGhlIGNvbnRlbnQgb2YgZG9jdW1lbnRhdGlvbiBibG9ja3MgYXJlIGNvbnRhaW5lZAotIyBpbiBmaWxlIGBjb250ZW50LnB5JzsgdGhlIGNsYXNzZXMgYW5kIG1ldGhvZHMgZm91bmQgaGVyZSBvbmx5IGRlYWwgd2l0aAotIyB0ZXh0IHBhcnNpbmcgYW5kIGJhc2ljIGRvY3VtZW50YXRpb24gYmxvY2sgZXh0cmFjdGlvbi4KLSMKLQotCi1pbXBvcnQgZmlsZWlucHV0LCByZSwgc3lzLCBvcywgc3RyaW5nCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSMjICBTT1VSQ0UgQkxPQ0sgRk9STUFUIENMQVNTCi0jIwotIyMgIEEgc2ltcGxlIGNsYXNzIGNvbnRhaW5pbmcgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9ucyB0byBkZXRlY3QKLSMjICBwb3RlbnRpYWwgZG9jdW1lbnRhdGlvbiBmb3JtYXQgYmxvY2sgY29tbWVudHMgd2l0aGluIEMgc291cmNlIGNvZGUuCi0jIwotIyMgIFRoZSBgY29sdW1uJyBwYXR0ZXJuIG11c3QgY29udGFpbiBhIGdyb3VwIHRvIGB1bmJveCcgdGhlIGNvbnRlbnQgb2YKLSMjICBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYmxvY2tzLgotIyMKLSMjICBMYXRlciBvbiwgcGFyYWdyYXBocyBhcmUgY29udmVydGVkIHRvIGxvbmcgbGluZXMsIHdoaWNoIHNpbXBsaWZpZXMgdGhlCi0jIyAgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IGFjdCB1cG9uIHRoZSB0ZXh0LgotIyMKLWNsYXNzICBTb3VyY2VCbG9ja0Zvcm1hdDoKLQotICAgIGRlZiAgX19pbml0X18oIHNlbGYsIGlkLCBzdGFydCwgY29sdW1uLCBlbmQgKToKLSAgICAgICAgIiIiQ3JlYXRlIGEgYmxvY2sgcGF0dGVybiwgdXNlZCB0byByZWNvZ25pemUgc3BlY2lhbCBkb2N1bWVudGF0aW9uCi0gICAgICAgICAgIGJsb2Nrcy4iIiIKLSAgICAgICAgc2VsZi5pZCAgICAgPSBpZAotICAgICAgICBzZWxmLnN0YXJ0ICA9IHJlLmNvbXBpbGUoIHN0YXJ0LCByZS5WRVJCT1NFICkKLSAgICAgICAgc2VsZi5jb2x1bW4gPSByZS5jb21waWxlKCBjb2x1bW4sIHJlLlZFUkJPU0UgKQotICAgICAgICBzZWxmLmVuZCAgICA9IHJlLmNvbXBpbGUoIGVuZCwgcmUuVkVSQk9TRSApCi0KLQotIwotIyBGb3JtYXQgMSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYmxvY2tzLgotIwotIyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAoYXQgbGVhc3QgMiBhc3Rlcmlza3MpCi0jICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIChhdCBsZWFzdCAyIGFzdGVyaXNrcykKLSMKLXN0YXJ0ID0gcicnJwotICBccyogICAgICAjIGFueSBudW1iZXIgb2Ygd2hpdGVzcGFjZQotICAvXCp7Mix9LyAjIGZvbGxvd2VkIGJ5ICcvJyBhbmQgYXQgbGVhc3QgdHdvIGFzdGVyaXNrcyB0aGVuICcvJwotICBccyokICAgICAjIHByb2JhYmx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UKLScnJwotCi1jb2x1bW4gPSByJycnCi0gIFxzKiAgICAgICMgYW55IG51bWJlciBvZiB3aGl0ZXNwYWNlCi0gIC9cKnsxfSAgICMgZm9sbG93ZWQgYnkgJy8nIGFuZCBwcmVjaXNlbHkgb25lIGFzdGVyaXNrCi0gIChbXipdLiopICMgZm9sbG93ZWQgYnkgYW55dGhpbmcgKGdyb3VwIDEpCi0gIFwqezF9LyAgICMgZm9sbG93ZWQgYnkgb25lIGFzdGVyaXNrIGFuZCBhICcvJwotICBccyokICAgICAjIHByb2JhYmx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UKLScnJwotCi1yZV9zb3VyY2VfYmxvY2tfZm9ybWF0MSA9IFNvdXJjZUJsb2NrRm9ybWF0KCAxLCBzdGFydCwgY29sdW1uLCBzdGFydCApCi0KLQotIwotIyBGb3JtYXQgMiBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYmxvY2tzLgotIwotIyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIChhdCBsZWFzdCAyIGFzdGVyaXNrcykKLSMgICAgICoKLSMgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSBhc3RlcmlzaykKLSMgICAgICoKLSMgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSBvciBtb3JlIGFzdGVyaXNrcykKLSMKLXN0YXJ0ID0gcicnJwotICBccyogICAgICMgYW55IG51bWJlciBvZiB3aGl0ZXNwYWNlCi0gIC9cKnsyLH0gIyBmb2xsb3dlZCBieSAnLycgYW5kIGF0IGxlYXN0IHR3byBhc3Rlcmlza3MKLSAgXHMqJCAgICAjIHByb2JhYmx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UKLScnJwotCi1jb2x1bW4gPSByJycnCi0gIFxzKiAgICAgICAgICAgIyBhbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2UKLSAgXCp7MX0oPyFbKi9dKSAjIGZvbGxvd2VkIGJ5IHByZWNpc2VseSBvbmUgYXN0ZXJpc2sgbm90IGZvbGxvd2VkIGJ5IGAvJwotICAoLiopICAgICAgICAgICMgdGhlbiBhbnl0aGluZyAoZ3JvdXAxKQotJycnCi0KLWVuZCA9IHInJycKLSAgXHMqICAjIGFueSBudW1iZXIgb2Ygd2hpdGVzcGFjZQotICBcKisvICMgZm9sbG93ZWQgYnkgYXQgbGVhc3Qgb25lIGFzdGVyaXNrLCB0aGVuICcvJwotJycnCi0KLXJlX3NvdXJjZV9ibG9ja19mb3JtYXQyID0gU291cmNlQmxvY2tGb3JtYXQoIDIsIHN0YXJ0LCBjb2x1bW4sIGVuZCApCi0KLQotIwotIyBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgZG9jdW1lbnRhdGlvbiBibG9jayBmb3JtYXRzLiAgV2UgY291bGQgYWRkIG5ldyBvbmVzCi0jIHF1aXRlIGVhc2lseS4KLSMKLXJlX3NvdXJjZV9ibG9ja19mb3JtYXRzID0gW3JlX3NvdXJjZV9ibG9ja19mb3JtYXQxLCByZV9zb3VyY2VfYmxvY2tfZm9ybWF0Ml0KLQotCi0jCi0jIFRoZSBmb2xsb3dpbmcgcmVndWxhciBleHByZXNzaW9ucyBjb3JyZXNwb25kIHRvIG1hcmt1cCB0YWdzIHdpdGhpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2Nrcy4gIFRoZXkgYXJlIGVxdWl2YWxlbnQgZGVzcGl0ZSB0aGVpciBkaWZmZXJlbnQKLSMgc3ludGF4LgotIwotIyBBIG1hcmt1cCB0YWcgY29uc2lzdHMgb2YgbGV0dGVycyBvciBjaGFyYWN0ZXIgYC0nLCB0byBiZSBmb3VuZCBpbiBncm91cCAxLgotIwotIyBOb3RpY2UgdGhhdCBhIG1hcmt1cCB0YWcgX211c3RfIGJlZ2luIGEgbmV3IHBhcmFncmFwaC4KLSMKLXJlX21hcmt1cF90YWcxID0gcmUuY29tcGlsZSggcicnJ1xzKjwoKD86XHd8LSkqKT4nJycgKSAgIyA8eHh4eD4gZm9ybWF0Ci1yZV9tYXJrdXBfdGFnMiA9IHJlLmNvbXBpbGUoIHInJydccypAKCg/Olx3fC0pKik6JycnICkgICMgQHh4eHg6IGZvcm1hdAotCi0jCi0jIFRoZSBsaXN0IG9mIHN1cHBvcnRlZCBtYXJrdXAgdGFncy4gIFdlIGNvdWxkIGFkZCBuZXcgb25lcyBxdWl0ZSBlYXNpbHkuCi0jCi1yZV9tYXJrdXBfdGFncyA9IFtyZV9tYXJrdXBfdGFnMSwgcmVfbWFya3VwX3RhZzJdCi0KLQotIwotIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZXRlY3QgYSBjcm9zcyByZWZlcmVuY2UsIGFmdGVyIG1hcmt1cCB0YWdzIGhhdmUKLSMgYmVlbiBzdHJpcHBlZCBvZmYuCi0jCi0jIFR3byBzeW50YXggZm9ybXMgYXJlIHN1cHBvcnRlZDoKLSMKLSMgICBAPG5hbWU+Ci0jICAgQDxuYW1lPls8aWQ+XQotIwotIyB3aGVyZSBib3RoIGA8bmFtZT4nIGFuZCBgPGlkPicgY29uc2lzdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgYF8nLAotIyBhbmQgYC0nLiAgVXNlIGA8aWQ+JyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUsIHZhbGlkIGA8bmFtZT4nIGVudHJpZXMuCi0jCi0jIEV4YW1wbGU6IEBmb29bYmFyXQotIwotcmVfY3Jvc3NyZWYgPSByZS5jb21waWxlKCByIiIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICg/UDxuYW1lPig/Olx3fC0pKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg/OlxbKD86XHd8LSkrXF0pPykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoP1A8cmVzdD4uKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiLCByZS5WRVJCT1NFICkKLQotIwotIyBUd28gcmVndWxhciBleHByZXNzaW9ucyB0byBkZXRlY3QgaXRhbGljIGFuZCBib2xkIG1hcmt1cCwgcmVzcGVjdGl2ZWx5LgotIyBHcm91cCAxIGlzIHRoZSBtYXJrdXAsIGdyb3VwIDIgdGhlIHJlc3Qgb2YgdGhlIGxpbmUuCi0jCi0jIE5vdGUgdGhhdCB0aGUgbWFya3VwIGlzIGxpbWl0ZWQgdG8gd29yZHMgY29uc2lzdGluZyBvZiBsZXR0ZXJzLCBkaWdpdHMsCi0jIHRoZSBjaGFyYWN0ZXJzIGBfJyBhbmQgYC0nLCBvciBhbiBhcG9zdHJvcGhlIChidXQgbm90IGFzIHRoZSBmaXJzdAotIyBjaGFyYWN0ZXIpLgotIwotcmVfaXRhbGljID0gcmUuY29tcGlsZSggciJfKCg/Olx3fC0pKD86XHd8J3wtKSopXyguKikiICkgICAgICMgIF9pdGFsaWNfCi1yZV9ib2xkICAgPSByZS5jb21waWxlKCByIlwqKCg/Olx3fC0pKD86XHd8J3wtKSopXCooLiopIiApICAgIyAgKmJvbGQqCi0KLSMKLSMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gY29kZSB0byBpZGVudGlmeSBhbiBVUkwgaGFzIGJlZW4gdGFrZW4gZnJvbQotIwotIyAgIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3R1dG9yLzIwMDItU2VwdGVtYmVyLzAxNzIyOC5odG1sCi0jCi0jICh3aXRoIHNsaWdodCBtb2RpZmljYXRpb25zKS4KLSMKLXVybHMgPSByJyg/Omh0dHBzP3x0ZWxuZXR8Z29waGVyfGZpbGV8d2Fpc3xmdHApJwotbHRycyA9IHInXHcnCi1ndW5rID0gcicvI346Lj8rPSYlQCFcLScKLXB1bmMgPSByJy46P1wtJwotYW55ICA9ICIlKGx0cnMpcyUoZ3VuaylzJShwdW5jKXMiICUgeyAnbHRycycgOiBsdHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3VuaycgOiBndW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHVuYycgOiBwdW5jIH0KLXVybCAgPSByIiIiCi0gICAgICAgICAoCi0gICAgICAgICAgIFxiICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IGF0IHdvcmQgYm91bmRhcnkKLSAgICAgICAgICAgJSh1cmxzKXMgOiAgICAgICAgICAgICMgbmVlZCByZXNvdXJjZSBhbmQgYSBjb2xvbgotICAgICAgICAgICBbJShhbnkpc10gKz8gICAgICAgICAgIyBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBvZiBhbnkgdmFsaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyLCBidXQgYmUgY29uc2VydmF0aXZlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0YWtlIG9ubHkgd2hhdCB5b3UgbmVlZCB0by4uLgotICAgICAgICAgICAoPz0gICAgICAgICAgICAgICAgICAgIyBbbG9vay1haGVhZCBub24tY29uc3VtcHRpdmUgYXNzZXJ0aW9uXQotICAgICAgICAgICAgIFslKHB1bmMpc10qICAgICAgICAgIyBlaXRoZXIgMCBvciBtb3JlIHB1bmN0dWF0aW9uCi0gICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAjIFtub24tZ3JvdXBpbmcgcGFyZW50aGVzZXNdCi0gICAgICAgICAgICAgICBbXiUoYW55KXNdIHwgJCAgICAjIGZvbGxvd2VkIGJ5IGEgbm9uLXVybCBjaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yIGVuZCBvZiB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgKQotICAgICAgICAgICApCi0gICAgICAgICApCi0gICAgICAgICIiIiAlIHsndXJscycgOiB1cmxzLAotICAgICAgICAgICAgICAgJ2FueScgIDogYW55LAotICAgICAgICAgICAgICAgJ3B1bmMnIDogcHVuYyB9Ci0KLXJlX3VybCA9IHJlLmNvbXBpbGUoIHVybCwgcmUuVkVSQk9TRSB8IHJlLk1VTFRJTElORSApCi0KLSMKLSMgQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBzdG9wcyBjb2xsZWN0aW9uIG9mIGNvbW1lbnRzIGZvciB0aGUgY3VycmVudAotIyBibG9jay4KLSMKLXJlX3NvdXJjZV9zZXAgPSByZS5jb21waWxlKCByJ1xzKi9cKlxzKlwqLycgKSAgICMgIC8qICovCi0KLSMKLSMgQSByZWd1bGFyIGV4cHJlc3Npb24gdG8gZmluZCBwb3NzaWJsZSBDIGlkZW50aWZpZXJzIHdoaWxlIG91dHB1dHRpbmcKLSMgc291cmNlIGNvZGUgdmVyYmF0aW0sIGNvdmVyaW5nIHRoaW5ncyBsaWtlIGAqZm9vJyBvciBgKGJhcicuICBHcm91cCAxIGlzCi0jIHRoZSBwcmVmaXgsIGdyb3VwIDIgdGhlIGlkZW50aWZpZXIgLS0gc2luY2Ugd2Ugc2NhbiBsaW5lcyBmcm9tIGxlZnQgdG8KLSMgcmlnaHQsIHNlcXVlbnRpYWxseSBzcGxpdHRpbmcgdGhlIHNvdXJjZSBjb2RlIGludG8gcHJlZml4IGFuZCBpZGVudGlmaWVyCi0jIGlzIGZ1bGx5IHN1ZmZpY2llbnQgZm9yIG91ciBwdXJwb3Nlcy4KLSMKLXJlX3NvdXJjZV9jcm9zc3JlZiA9IHJlLmNvbXBpbGUoIHInKFxXKikoXHcqKScgKQotCi0jCi0jIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBhIGxpc3Qgb2YgcmVzZXJ2ZWQgQyBzb3VyY2Uga2V5d29yZHMuCi0jCi1yZV9zb3VyY2Vfa2V5d29yZHMgPSByZS5jb21waWxlKCAnJydcXGIgKCB0eXBlZGVmICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0ICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcI2luY2x1ZGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCNkZWZpbmUgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwjdW5kZWYgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcI2lmICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCNpZmRlZiAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwjaWZuZGVmICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcI2Vsc2UgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCNlbmRpZiAgICkgXFxiJycnLCByZS5WRVJCT1NFICkKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotIyMgIFNPVVJDRSBCTE9DSyBDTEFTUwotIyMKLSMjICBUaGVyZSBhcmUgdHdvIGltcG9ydGFudCBmaWVsZHMgaW4gYSBgU291cmNlQmxvY2snIG9iamVjdC4KLSMjCi0jIyAgICBzZWxmLmxpbmVzCi0jIyAgICAgIEEgbGlzdCBvZiB0ZXh0IGxpbmVzIGZvciB0aGUgY29ycmVzcG9uZGluZyBibG9jay4KLSMjCi0jIyAgICBzZWxmLmNvbnRlbnQKLSMjICAgICAgRm9yIGRvY3VtZW50YXRpb24gY29tbWVudCBibG9ja3Mgb25seSwgdGhpcyBpcyB0aGUgYmxvY2sgY29udGVudAotIyMgICAgICB0aGF0IGhhcyBiZWVuIGB1bmJveGVkJyBmcm9tIGl0cyBkZWNvcmF0aW9uLiAgVGhpcyBpcyBgTm9uZScgZm9yIGFsbAotIyMgICAgICBvdGhlciBibG9ja3MgKGkuZS4sIHNvdXJjZXMgb3Igb3JkaW5hcnkgY29tbWVudHMgd2l0aCBubyBzdGFydGluZwotIyMgICAgICBtYXJrdXAgdGFnKQotIyMKLWNsYXNzICBTb3VyY2VCbG9jazoKLQotICAgIGRlZiAgX19pbml0X18oIHNlbGYsIHByb2Nlc3NvciwgZmlsZW5hbWUsIGxpbmVubywgbGluZXMgKToKLSAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKLSAgICAgICAgc2VsZi5maWxlbmFtZSAgPSBmaWxlbmFtZQotICAgICAgICBzZWxmLmxpbmVubyAgICA9IGxpbmVubwotICAgICAgICBzZWxmLmxpbmVzICAgICA9IGxpbmVzWzpdCi0gICAgICAgIHNlbGYuZm9ybWF0ICAgID0gcHJvY2Vzc29yLmZvcm1hdAotICAgICAgICBzZWxmLmNvbnRlbnQgICA9IFtdCi0KLSAgICAgICAgaWYgc2VsZi5mb3JtYXQgPT0gTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIHdvcmRzID0gW10KLQotICAgICAgICAjIGV4dHJhY3QgY29tbWVudCBsaW5lcwotICAgICAgICBsaW5lcyA9IFtdCi0KLSAgICAgICAgZm9yIGxpbmUwIGluIHNlbGYubGluZXM6Ci0gICAgICAgICAgICBtID0gc2VsZi5mb3JtYXQuY29sdW1uLm1hdGNoKCBsaW5lMCApCi0gICAgICAgICAgICBpZiBtOgotICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCggbS5ncm91cCggMSApICkKLQotICAgICAgICAjIG5vdywgbG9vayBmb3IgYSBtYXJrdXAgdGFnCi0gICAgICAgIGZvciBsIGluIGxpbmVzOgotICAgICAgICAgICAgbCA9IHN0cmluZy5zdHJpcCggbCApCi0gICAgICAgICAgICBpZiBsZW4oIGwgKSA+IDA6Ci0gICAgICAgICAgICAgICAgZm9yIHRhZyBpbiByZV9tYXJrdXBfdGFnczoKLSAgICAgICAgICAgICAgICAgICAgaWYgdGFnLm1hdGNoKCBsICk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRlbnQgPSBsaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0KLSAgICBkZWYgIGxvY2F0aW9uKCBzZWxmICk6Ci0gICAgICAgIHJldHVybiAiKCIgKyBzZWxmLmZpbGVuYW1lICsgIjoiICsgcmVwciggc2VsZi5saW5lbm8gKSArICIpIgotCi0gICAgIyBkZWJ1Z2dpbmcgb25seSAtLSBub3QgdXNlZCBpbiBub3JtYWwgb3BlcmF0aW9ucwotICAgIGRlZiAgZHVtcCggc2VsZiApOgotICAgICAgICBpZiBzZWxmLmNvbnRlbnQ6Ci0gICAgICAgICAgICBwcmludCAie3t7Y29udGVudCBzdGFydC0tLSIKLSAgICAgICAgICAgIGZvciBsIGluIHNlbGYuY29udGVudDoKLSAgICAgICAgICAgICAgICBwcmludCBsCi0gICAgICAgICAgICBwcmludCAiLS0tY29udGVudCBlbmR9fX0iCi0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICBmbXQgPSAiIgotICAgICAgICBpZiBzZWxmLmZvcm1hdDoKLSAgICAgICAgICAgIGZtdCA9IHJlcHIoIHNlbGYuZm9ybWF0LmlkICkgKyAiICIKLQotICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmxpbmVzOgotICAgICAgICAgICAgcHJpbnQgbGluZQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgU09VUkNFIFBST0NFU1NPUiBDTEFTUwotIyMKLSMjICBUaGUgYFNvdXJjZVByb2Nlc3NvcicgaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgYSBDIHNvdXJjZSBmaWxlIGFuZAotIyMgIGRlY29tcG9zaW5nIGl0IGludG8gYSBzZXJpZXMgb2YgZGlmZmVyZW50IGBTb3VyY2VCbG9jaycgb2JqZWN0cy4KLSMjCi0jIyAgQSBTb3VyY2VCbG9jayBvYmplY3QgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBkYXRhLgotIyMKLSMjICAgIC0gQSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYmxvY2sgdXNpbmcgb25lIG9mIHRoZSBsYXlvdXRzIGFib3ZlLiAgSXRzCi0jIyAgICAgIGV4YWN0IGZvcm1hdCB3aWxsIGJlIGRpc2N1c3NlZCBsYXRlci4KLSMjCi0jIyAgICAtIE5vcm1hbCBzb3VyY2VzIGxpbmVzLCBpbmNsdWRpbmcgY29tbWVudHMuCi0jIwotIyMKLWNsYXNzICBTb3VyY2VQcm9jZXNzb3I6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmICk6Ci0gICAgICAgICIiIkluaXRpYWxpemUgYSBzb3VyY2UgcHJvY2Vzc29yLiIiIgotICAgICAgICBzZWxmLmJsb2NrcyAgID0gW10KLSAgICAgICAgc2VsZi5maWxlbmFtZSA9IE5vbmUKLSAgICAgICAgc2VsZi5mb3JtYXQgICA9IE5vbmUKLSAgICAgICAgc2VsZi5saW5lcyAgICA9IFtdCi0KLSAgICBkZWYgIHJlc2V0KCBzZWxmICk6Ci0gICAgICAgICIiIlJlc2V0IGEgYmxvY2sgcHJvY2Vzc29yIGFuZCBjbGVhbiB1cCBhbGwgaXRzIGJsb2Nrcy4iIiIKLSAgICAgICAgc2VsZi5ibG9ja3MgPSBbXQotICAgICAgICBzZWxmLmZvcm1hdCA9IE5vbmUKLQotICAgIGRlZiAgcGFyc2VfZmlsZSggc2VsZiwgZmlsZW5hbWUgKToKLSAgICAgICAgIiIiUGFyc2UgYSBDIHNvdXJjZSBmaWxlIGFuZCBhZGQgaXRzIGJsb2NrcyB0byB0aGUgcHJvY2Vzc29yJ3MKLSAgICAgICAgICAgbGlzdC4iIiIKLSAgICAgICAgc2VsZi5yZXNldCgpCi0KLSAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCi0KLSAgICAgICAgZmlsZWlucHV0LmNsb3NlKCkKLSAgICAgICAgc2VsZi5mb3JtYXQgPSBOb25lCi0gICAgICAgIHNlbGYubGluZW5vID0gMAotICAgICAgICBzZWxmLmxpbmVzICA9IFtdCi0KLSAgICAgICAgZm9yIGxpbmUgaW4gZmlsZWlucHV0LmlucHV0KCBmaWxlbmFtZSApOgotICAgICAgICAgICAgIyBzdHJpcCB0cmFpbGluZyBuZXdsaW5lcywgaW1wb3J0YW50IG9uIFdpbmRvd3MgbWFjaGluZXMhCi0gICAgICAgICAgICBpZiBsaW5lWy0xXSA9PSAnXDAxMic6Ci0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMDotMV0KLQotICAgICAgICAgICAgaWYgc2VsZi5mb3JtYXQgPT0gTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nfbm9ybWFsX2xpbmUoIGxpbmUgKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBzZWxmLmZvcm1hdC5lbmQubWF0Y2goIGxpbmUgKToKLSAgICAgICAgICAgICAgICAgICAgIyBBIG5vcm1hbCBibG9jayBlbmQuICBBZGQgaXQgdG8gYGxpbmVzJyBhbmQgY3JlYXRlIGEKLSAgICAgICAgICAgICAgICAgICAgIyBuZXcgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lcy5hcHBlbmQoIGxpbmUgKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9ibG9ja19saW5lcygpCi0gICAgICAgICAgICAgICAgZWxpZiBzZWxmLmZvcm1hdC5jb2x1bW4ubWF0Y2goIGxpbmUgKToKLSAgICAgICAgICAgICAgICAgICAgIyBBIG5vcm1hbCBjb2x1bW4gbGluZS4gIEFkZCBpdCB0byBgbGluZXMnLgotICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVzLmFwcGVuZCggbGluZSApCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgIyBBbiB1bmV4cGVjdGVkIGJsb2NrIGVuZC4gIENyZWF0ZSBhIG5ldyBibG9jaywgYnV0Ci0gICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgcHJvY2VzcyB0aGUgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfYmxvY2tfbGluZXMoKQotCi0gICAgICAgICAgICAgICAgICAgICMgd2UgbmVlZCB0byBwcm9jZXNzIHRoZSBsaW5lIGFnYWluCi0gICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19ub3JtYWxfbGluZSggbGluZSApCi0KLSAgICAgICAgIyByZWNvcmQgdGhlIGxhc3QgbGluZXMKLSAgICAgICAgc2VsZi5hZGRfYmxvY2tfbGluZXMoKQotCi0gICAgZGVmICBwcm9jZXNzX25vcm1hbF9saW5lKCBzZWxmLCBsaW5lICk6Ci0gICAgICAgICIiIlByb2Nlc3MgYSBub3JtYWwgbGluZSBhbmQgY2hlY2sgd2hldGhlciBpdCBpcyB0aGUgc3RhcnQgb2YgYSBuZXcKLSAgICAgICAgICAgYmxvY2suIiIiCi0gICAgICAgIGZvciBmIGluIHJlX3NvdXJjZV9ibG9ja19mb3JtYXRzOgotICAgICAgICAgICAgaWYgZi5zdGFydC5tYXRjaCggbGluZSApOgotICAgICAgICAgICAgICAgIHNlbGYuYWRkX2Jsb2NrX2xpbmVzKCkKLSAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdCA9IGYKLSAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IGZpbGVpbnB1dC5maWxlbGluZW5vKCkKLQotICAgICAgICBzZWxmLmxpbmVzLmFwcGVuZCggbGluZSApCi0KLSAgICBkZWYgIGFkZF9ibG9ja19saW5lcyggc2VsZiApOgotICAgICAgICAiIiJBZGQgdGhlIGN1cnJlbnQgYWNjdW11bGF0ZWQgbGluZXMgYW5kIGNyZWF0ZSBhIG5ldyBibG9jay4iIiIKLSAgICAgICAgaWYgc2VsZi5saW5lcyAhPSBbXToKLSAgICAgICAgICAgIGJsb2NrID0gU291cmNlQmxvY2soIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVzICkKLQotICAgICAgICAgICAgc2VsZi5ibG9ja3MuYXBwZW5kKCBibG9jayApCi0gICAgICAgICAgICBzZWxmLmZvcm1hdCA9IE5vbmUKLSAgICAgICAgICAgIHNlbGYubGluZXMgID0gW10KLQotICAgICMgZGVidWdnaW5nIG9ubHksIG5vdCB1c2VkIGluIG5vcm1hbCBvcGVyYXRpb25zCi0gICAgZGVmICBkdW1wKCBzZWxmICk6Ci0gICAgICAgICIiIlByaW50IGFsbCBibG9ja3MgaW4gYSBwcm9jZXNzb3IuIiIiCi0gICAgICAgIGZvciBiIGluIHNlbGYuYmxvY2tzOgotICAgICAgICAgICAgYi5kdW1wKCkKLQotIyBlb2YKZGlmZiAtLWdpdCBhL3NyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkgYi9zcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJiNTVlLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotIwotIyAgdG9odG1sLnB5Ci0jCi0jICAgIEEgc3ViLWNsYXNzIGNvbnRhaW5lciBvZiB0aGUgYEZvcm1hdHRlcicgY2xhc3MgdG8gcHJvZHVjZSBIVE1MLgotIwotIyAgQ29weXJpZ2h0IDIwMDItMjAxNyBieQotIyAgRGF2aWQgVHVybmVyLgotIwotIyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAotIyAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKLSMgIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQotIyAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCi0jICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLSMgVGhlIHBhcmVudCBjbGFzcyBpcyBjb250YWluZWQgaW4gZmlsZSBgZm9ybWF0dGVyLnB5Jy4KLQotCi1mcm9tIHNvdXJjZXMgaW1wb3J0ICoKLWZyb20gY29udGVudCBpbXBvcnQgKgotZnJvbSBmb3JtYXR0ZXIgaW1wb3J0ICoKLQotaW1wb3J0IHRpbWUKLQotCi0jIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBkZWZpbmUgdGhlIEhUTUwgaGVhZGVyIHVzZWQgYnkgYWxsIGdlbmVyYXRlZCBwYWdlcy4KLWh0bWxfaGVhZGVyXzEgPSAiIiJcCi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPHRpdGxlPlwKLSIiIgotCi1odG1sX2hlYWRlcl8yID0gIiIiXAotIEFQSSBSZWZlcmVuY2U8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgYTpsaW5rIHsgY29sb3I6ICMwMDAwRUY7IH0KLSAgYTp2aXNpdGVkIHsgY29sb3I6ICM1MTE4OEU7IH0KLSAgYTpob3ZlciB7IGNvbG9yOiAjRkYwMDAwOyB9Ci0KLSAgYm9keSB7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNlcmlmOwotICAgICAgICAgY29sb3I6ICMwMDAwMDA7Ci0gICAgICAgICBiYWNrZ3JvdW5kOiAjRkZGRkZGOwotICAgICAgICAgd2lkdGg6IDg3JTsKLSAgICAgICAgIG1hcmdpbjogYXV0bzsgfQotCi0gIGRpdi5zZWN0aW9uIHsgd2lkdGg6IDc1JTsKLSAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG87IH0KLSAgZGl2LnNlY3Rpb24gaHIgeyBtYXJnaW46IDRleCAwIDFleCAwOyB9Ci0gIGRpdi5zZWN0aW9uIGg0IHsgYmFja2dyb3VuZC1jb2xvcjogI0VFRUVGRjsKLSAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IG1lZGl1bTsKLSAgICAgICAgICAgICAgICAgICBmb250LXN0eWxlOiBvYmxpcXVlOwotICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICAgICAgICAgICAgIG1hcmdpbjogM2V4IDAgMS41ZXggOSU7Ci0gICAgICAgICAgICAgICAgICAgcGFkZGluZzogMC4zZXggMCAwLjNleCAxJTsgfQotICBkaXYuc2VjdGlvbiBwIHsgbWFyZ2luOiAxLjVleCAwIDEuNWV4IDEwJTsgfQotICBkaXYuc2VjdGlvbiBwcmUgeyBtYXJnaW46IDNleCAwIDNleCA5JTsKLSAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0Q2RThGRjsKLSAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMmV4IDAgMmV4IDElOyB9Ci0gIGRpdi5zZWN0aW9uIHRhYmxlLmZpZWxkcyB7IHdpZHRoOiA5MCU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMS41ZXggMCAxLjVleCAxMCU7IH0KLSAgZGl2LnNlY3Rpb24gdGFibGUudG9jIHsgd2lkdGg6IDk1JTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAxLjVleCAwIDEuNWV4IDUlOyB9Ci0gIGRpdi50aW1lc3RhbXAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgICAgICAgICAgICAgICBmb250LXNpemU6IDY5JTsKLSAgICAgICAgICAgICAgICAgIG1hcmdpbjogMS41ZXggMCAxLjVleCAwOyB9Ci0KLSAgaDEgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLSAgaDMgeyBmb250LXNpemU6IG1lZGl1bTsKLSAgICAgICBtYXJnaW46IDRleCAwIDEuNWV4IDA7IH0KLQotICBwIHsgdGV4dC1hbGlnbjoganVzdGlmeTsgfQotCi0gIHByZS5jb2xvcmVkIHsgY29sb3I6IGJsdWU7IH0KLQotICBzcGFuLmtleXdvcmQgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOwotICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwotICAgICAgICAgICAgICAgICBjb2xvcjogZGFya2JsdWU7IH0KLQotICB0YWJsZS5maWVsZHMgdGQudmFsIHsgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMCU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAxZXggMWVtIDFleCAwOyB9Ci0gIHRhYmxlLmZpZWxkcyB0ZC5kZXNjIHsgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFleCAwIDFleCAxZW07IH0KLSAgdGFibGUuZmllbGRzIHRkLmRlc2MgcDpmaXJzdC1jaGlsZCB7IG1hcmdpbjogMDsgfQotICB0YWJsZS5maWVsZHMgdGQuZGVzYyBwIHsgbWFyZ2luOiAxLjVleCAwIDAgMDsgfQotICB0YWJsZS5pbmRleCB7IG1hcmdpbjogNmV4IGF1dG8gNmV4IGF1dG87Ci0gICAgICAgICAgICAgICAgYm9yZGVyOiAwOwotICAgICAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7Ci0gICAgICAgICAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDFlbSAwLjNleDsgfQotICB0YWJsZS5pbmRleCB0ciB7IHBhZGRpbmc6IDA7IH0KLSAgdGFibGUuaW5kZXggdGQgeyBwYWRkaW5nOiAwOyB9Ci0gIHRhYmxlLmluZGV4LXRvYy1saW5rIHsgd2lkdGg6IDEwMCU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMWV4IDAgMWV4IDA7IH0KLSAgdGFibGUuaW5kZXgtdG9jLWxpbmsgdGQubGVmdCB7IHBhZGRpbmc6IDAgMC41ZW0gMCAwLjVlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogODMlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsgfQotICB0YWJsZS5pbmRleC10b2MtbGluayB0ZC5taWRkbGUgeyBwYWRkaW5nOiAwIDAuNWVtIDAgMC41ZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogODMlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLSAgdGFibGUuaW5kZXgtdG9jLWxpbmsgdGQucmlnaHQgeyBwYWRkaW5nOiAwIDAuNWVtIDAgMC41ZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiA4MyU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7IH0KLSAgdGFibGUuc3lub3BzaXMgeyBtYXJnaW46IDZleCBhdXRvIDZleCBhdXRvOwotICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMDsKLSAgICAgICAgICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOwotICAgICAgICAgICAgICAgICAgIGJvcmRlci1zcGFjaW5nOiAyZW0gMC42ZXg7IH0KLSAgdGFibGUuc3lub3BzaXMgdHIgeyBwYWRkaW5nOiAwOyB9Ci0gIHRhYmxlLnN5bm9wc2lzIHRkIHsgcGFkZGluZzogMDsgfQotICB0YWJsZS50b2MgdGQubGluayB7IHdpZHRoOiAzMCU7Ci0gICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFleCAxZW0gMWV4IDA7IH0KLSAgdGFibGUudG9jIHRkLmRlc2MgeyB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMWV4IDAgMWV4IDFlbTsKLSAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OyB9Ci0gIHRhYmxlLnRvYyB0ZC5kZXNjIHA6Zmlyc3QtY2hpbGQgeyBtYXJnaW46IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OyB9Ci0gIHRhYmxlLnRvYyB0ZC5kZXNjIHAgeyBtYXJnaW46IDEuNWV4IDAgMCAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsgfQotCi08L3N0eWxlPgotPC9oZWFkPgotPGJvZHk+Ci0iIiIKLQotaHRtbF9oZWFkZXJfM2wgPSAiIiIKLTx0YWJsZSBjbGFzcz0iaW5kZXgtdG9jLWxpbmsiPjx0cj48dGQgY2xhc3M9ImxlZnQiPls8YSBocmVmPSJcCi0iIiIKLQotaHRtbF9oZWFkZXJfM3IgPSAiIiIKLTx0YWJsZSBjbGFzcz0iaW5kZXgtdG9jLWxpbmsiPjx0cj48dGQgY2xhc3M9InJpZ2h0Ij5bPGEgaHJlZj0iXAotIiIiCi0KLWh0bWxfaGVhZGVyXzQgPSAiIiJcCi0iPkluZGV4PC9hPl08L3RkPjx0ZCBjbGFzcz0icmlnaHQiPls8YSBocmVmPSJcCi0iIiIKLQotaHRtbF9oZWFkZXJfNXQgPSAiIiJcCi0iPlRPQzwvYT5dPC90ZD48L3RyPjwvdGFibGU+Ci08aDE+XAotIiIiCi0KLWh0bWxfaGVhZGVyXzVpID0gIiIiXAotIj5JbmRleDwvYT5dPC90ZD48L3RyPjwvdGFibGU+Ci08aDE+XAotIiIiCi0KLWh0bWxfaGVhZGVyXzYgPSAiIiJcCi0gQVBJIFJlZmVyZW5jZTwvaDE+Ci0iIiIKLQotCi0jIFRoZSBIVE1MIGZvb3RlciB1c2VkIGJ5IGFsbCBnZW5lcmF0ZWQgcGFnZXMuCi1odG1sX2Zvb3RlciA9ICIiIlwKLTwvYm9keT4KLTwvaHRtbD5cCi0iIiIKLQotIyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgdXNlZCBmb3IgZWFjaCBzZWN0aW9uLgotc2VjdGlvbl90aXRsZV9oZWFkZXIxID0gJzxoMSBpZD0iJwotc2VjdGlvbl90aXRsZV9oZWFkZXIyID0gJyI+Jwotc2VjdGlvbl90aXRsZV9mb290ZXIgPSAiPC9oMT4iCi0KLSMgVGhlIGhlYWRlciBhbmQgZm9vdGVyIHVzZWQgZm9yIGNvZGUgc2VnbWVudHMuCi1jb2RlX2hlYWRlciA9ICc8cHJlIGNsYXNzPSJjb2xvcmVkIj4nCi1jb2RlX2Zvb3RlciA9ICc8L3ByZT4nCi0KLSMgUGFyYWdyYXBoIGhlYWRlciBhbmQgZm9vdGVyLgotcGFyYV9oZWFkZXIgPSAiPHA+IgotcGFyYV9mb290ZXIgPSAiPC9wPiIKLQotIyBCbG9jayBoZWFkZXIgYW5kIGZvb3Rlci4KLWJsb2NrX2hlYWRlciAgICAgICAgPSAnPGRpdiBjbGFzcz0ic2VjdGlvbiI+JwotYmxvY2tfZm9vdGVyX3N0YXJ0ICA9ICIiIlwKLTxocj4KLTx0YWJsZSBjbGFzcz0iaW5kZXgtdG9jLWxpbmsiPjx0cj48dGQgY2xhc3M9ImxlZnQiPls8YSBocmVmPSJcCi0iIiIKLWJsb2NrX2Zvb3Rlcl9taWRkbGUgPSAiIiJcCi0iPkluZGV4PC9hPl08L3RkPlwKLTx0ZCBjbGFzcz0ibWlkZGxlIj5bPGEgaHJlZj0iIyI+VG9wPC9hPl08L3RkPlwKLTx0ZCBjbGFzcz0icmlnaHQiPls8YSBocmVmPSJcCi0iIiIKLWJsb2NrX2Zvb3Rlcl9lbmQgICAgPSAiIiJcCi0iPlRPQzwvYT5dPC90ZD48L3RyPjwvdGFibGU+PC9kaXY+Ci0iIiIKLQotIyBEZXNjcmlwdGlvbiBoZWFkZXIvZm9vdGVyLgotZGVzY3JpcHRpb25faGVhZGVyID0gIiIKLWRlc2NyaXB0aW9uX2Zvb3RlciA9ICIiCi0KLSMgTWFya2VyIGhlYWRlci9pbnRlci9mb290ZXIgY29tYmluYXRpb24uCi1tYXJrZXJfaGVhZGVyID0gIjxoND4iCi1tYXJrZXJfaW50ZXIgID0gIjwvaDQ+IgotbWFya2VyX2Zvb3RlciA9ICIiCi0KLSMgSGVhZGVyIGxvY2F0aW9uIGhlYWRlci9mb290ZXIuCi1oZWFkZXJfbG9jYXRpb25faGVhZGVyID0gIjxwPiIKLWhlYWRlcl9sb2NhdGlvbl9mb290ZXIgPSAiPC9wPiIKLQotIyBTb3VyY2UgY29kZSBleHRyYWN0cyBoZWFkZXIvZm9vdGVyLgotc291cmNlX2hlYWRlciA9ICI8cHJlPiIKLXNvdXJjZV9mb290ZXIgPSAiPC9wcmU+IgotCi0jIENoYXB0ZXIgaGVhZGVyL2ludGVyL2Zvb3Rlci4KLWNoYXB0ZXJfaGVhZGVyID0gIiIiXAotPGRpdiBjbGFzcz0ic2VjdGlvbiI+Ci08aDI+XAotIiIiCi1jaGFwdGVyX2ludGVyICA9ICc8L2gyPicKLWNoYXB0ZXJfZm9vdGVyID0gJzwvZGl2PicKLQotIyBJbmRleCBmb290ZXIuCi1pbmRleF9mb290ZXJfc3RhcnQgPSAiIiJcCi08aHI+Ci08dGFibGUgY2xhc3M9ImluZGV4LXRvYy1saW5rIj48dHI+PHRkIGNsYXNzPSJyaWdodCI+WzxhIGhyZWY9IlwKLSIiIgotaW5kZXhfZm9vdGVyX2VuZCA9ICIiIlwKLSI+VE9DPC9hPl08L3RkPjwvdHI+PC90YWJsZT4KLSIiIgotCi0jIFRPQyBmb290ZXIuCi10b2NfZm9vdGVyX3N0YXJ0ID0gIiIiXAotPGhyPgotPHRhYmxlIGNsYXNzPSJpbmRleC10b2MtbGluayI+PHRyPjx0ZCBjbGFzcz0ibGVmdCI+WzxhIGhyZWY9IlwKLSIiIgotdG9jX2Zvb3Rlcl9lbmQgPSAiIiJcCi0iPkluZGV4PC9hPl08L3RkPjwvdHI+PC90YWJsZT4KLSIiIgotCi0KLSMgU291cmNlIGxhbmd1YWdlIGtleXdvcmQgY29sb3JhdGlvbiBhbmQgc3R5bGluZy4KLWtleXdvcmRfcHJlZml4ID0gJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4nCi1rZXl3b3JkX3N1ZmZpeCA9ICc8L3NwYW4+JwotCi1zZWN0aW9uX3N5bm9wc2lzX2hlYWRlciA9ICc8aDI+U3lub3BzaXM8L2gyPicKLXNlY3Rpb25fc3lub3BzaXNfZm9vdGVyID0gJycKLQotCi0jIFRyYW5zbGF0ZSBhIHNpbmdsZSBsaW5lIG9mIHNvdXJjZSB0byBIVE1MLiAgVGhpcyBjb252ZXJ0cyBgPCcsIGA+JywgYW5kCi0jIGAmJyBpbnRvIGAmbHQ7JyxgJmd0OycsIGFuZCBgJmFtcDsnLgotIwotZGVmICBodG1sX3F1b3RlKCBsaW5lICk6Ci0gICAgcmVzdWx0ID0gc3RyaW5nLnJlcGxhY2UoIGxpbmUsICAgIiYiLCAiJmFtcDsiICkKLSAgICByZXN1bHQgPSBzdHJpbmcucmVwbGFjZSggcmVzdWx0LCAiPCIsICImbHQ7IiAgKQotICAgIHJlc3VsdCA9IHN0cmluZy5yZXBsYWNlKCByZXN1bHQsICI+IiwgIiZndDsiICApCi0gICAgcmV0dXJuIHJlc3VsdAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgSFRNTCBGT1JNQVRURVIgQ0xBU1MKLSMjCi1jbGFzcyAgSHRtbEZvcm1hdHRlciggRm9ybWF0dGVyICk6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmLCBwcm9jZXNzb3IsIHByb2plY3RfdGl0bGUsIGZpbGVfcHJlZml4ICk6Ci0gICAgICAgIEZvcm1hdHRlci5fX2luaXRfXyggc2VsZiwgcHJvY2Vzc29yICkKLQotICAgICAgICBnbG9iYWwgaHRtbF9oZWFkZXJfMQotICAgICAgICBnbG9iYWwgaHRtbF9oZWFkZXJfMgotICAgICAgICBnbG9iYWwgaHRtbF9oZWFkZXJfM2wsIGh0bWxfaGVhZGVyXzNyCi0gICAgICAgIGdsb2JhbCBodG1sX2hlYWRlcl80Ci0gICAgICAgIGdsb2JhbCBodG1sX2hlYWRlcl81dCwgaHRtbF9oZWFkZXJfNWkKLSAgICAgICAgZ2xvYmFsIGh0bWxfaGVhZGVyXzYKLSAgICAgICAgZ2xvYmFsIGh0bWxfZm9vdGVyCi0KLSAgICAgICAgaWYgZmlsZV9wcmVmaXg6Ci0gICAgICAgICAgICBmaWxlX3ByZWZpeCA9IGZpbGVfcHJlZml4ICsgIi0iCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmaWxlX3ByZWZpeCA9ICIiCi0KLSAgICAgICAgc2VsZi5oZWFkZXJzICAgICAgID0gcHJvY2Vzc29yLmhlYWRlcnMKLSAgICAgICAgc2VsZi5wcm9qZWN0X3RpdGxlID0gcHJvamVjdF90aXRsZQotICAgICAgICBzZWxmLmZpbGVfcHJlZml4ICAgPSBmaWxlX3ByZWZpeAotICAgICAgICBzZWxmLmh0bWxfaGVhZGVyICAgPSAoCi0gICAgICAgICAgaHRtbF9oZWFkZXJfMSArIHByb2plY3RfdGl0bGUKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzIKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzNsICsgZmlsZV9wcmVmaXggKyAiaW5kZXguaHRtbCIKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzQgKyBmaWxlX3ByZWZpeCArICJ0b2MuaHRtbCIKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzV0ICsgcHJvamVjdF90aXRsZQotICAgICAgICAgICsgaHRtbF9oZWFkZXJfNiApCi0gICAgICAgIHNlbGYuaHRtbF9pbmRleF9oZWFkZXIgPSAoCi0gICAgICAgICAgaHRtbF9oZWFkZXJfMSArIHByb2plY3RfdGl0bGUKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzIKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzNyICsgZmlsZV9wcmVmaXggKyAidG9jLmh0bWwiCi0gICAgICAgICAgKyBodG1sX2hlYWRlcl81dCArIHByb2plY3RfdGl0bGUKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzYgKQotICAgICAgICBzZWxmLmh0bWxfdG9jX2hlYWRlciA9ICgKLSAgICAgICAgICBodG1sX2hlYWRlcl8xICsgcHJvamVjdF90aXRsZQotICAgICAgICAgICsgaHRtbF9oZWFkZXJfMgotICAgICAgICAgICsgaHRtbF9oZWFkZXJfM2wgKyBmaWxlX3ByZWZpeCArICJpbmRleC5odG1sIgotICAgICAgICAgICsgaHRtbF9oZWFkZXJfNWkgKyBwcm9qZWN0X3RpdGxlCi0gICAgICAgICAgKyBodG1sX2hlYWRlcl82ICkKLSAgICAgICAgc2VsZi5odG1sX2Zvb3RlciA9ICgKLSAgICAgICAgICAnPGRpdiBjbGFzcz0idGltZXN0YW1wIj5nZW5lcmF0ZWQgb24gJwotICAgICAgICAgICsgdGltZS5hc2N0aW1lKCB0aW1lLmxvY2FsdGltZSggdGltZS50aW1lKCkgKSApCi0gICAgICAgICAgKyAiPC9kaXY+IiArIGh0bWxfZm9vdGVyICkKLQotICAgICAgICBzZWxmLmNvbHVtbnMgPSAzCi0KLSAgICBkZWYgIG1ha2Vfc2VjdGlvbl91cmwoIHNlbGYsIHNlY3Rpb24gKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZmlsZV9wcmVmaXggKyBzZWN0aW9uLm5hbWUgKyAiLmh0bWwiCi0KLSAgICBkZWYgIG1ha2VfYmxvY2tfdXJsKCBzZWxmLCBibG9jaywgbmFtZSA9IE5vbmUgKToKLSAgICAgICAgaWYgbmFtZSA9PSBOb25lOgotICAgICAgICAgICAgbmFtZSA9IGJsb2NrLm5hbWUKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWN0aW9uX3VybCA9IHNlbGYubWFrZV9zZWN0aW9uX3VybCggYmxvY2suc2VjdGlvbiApCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICMgd2UgYWxyZWFkeSBoYXZlIGEgc2VjdGlvbgotICAgICAgICAgICAgc2VjdGlvbl91cmwgPSBzZWxmLm1ha2Vfc2VjdGlvbl91cmwoIGJsb2NrICkKLQotICAgICAgICByZXR1cm4gc2VjdGlvbl91cmwgKyAiIyIgKyBuYW1lCi0KLSAgICBkZWYgIG1ha2VfaHRtbF93b3JkKCBzZWxmLCB3b3JkICk6Ci0gICAgICAgICIiIkFuYWx5emUgYSBzaW1wbGUgd29yZCB0byBkZXRlY3QgY3Jvc3MtcmVmZXJlbmNlcyBhbmQgbWFya3VwLiIiIgotICAgICAgICAjIGhhbmRsZSBjcm9zcy1yZWZlcmVuY2VzCi0gICAgICAgIG0gPSByZV9jcm9zc3JlZi5tYXRjaCggd29yZCApCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoICduYW1lJyApCi0gICAgICAgICAgICAgICAgcmVzdCA9IG0uZ3JvdXAoICdyZXN0JyApCi0gICAgICAgICAgICAgICAgYmxvY2sgPSBzZWxmLmlkZW50aWZpZXJzW25hbWVdCi0gICAgICAgICAgICAgICAgdXJsICAgPSBzZWxmLm1ha2VfYmxvY2tfdXJsKCBibG9jayApCi0gICAgICAgICAgICAgICAgIyBkaXNwbGF5IGBmb29bYmFyXScgYXMgYGZvbycKLSAgICAgICAgICAgICAgICBuYW1lID0gcmUuc3ViKCByJ1xbLipcXScsICcnLCBuYW1lICkKLSAgICAgICAgICAgICAgICAjIG5vcm1hbGl6ZSB1cmwsIGZvbGxvd2luZyBSRkMgMzk4NgotICAgICAgICAgICAgICAgIHVybCA9IHN0cmluZy5yZXBsYWNlKCB1cmwsICJbIiwgIigiICkKLSAgICAgICAgICAgICAgICB1cmwgPSBzdHJpbmcucmVwbGFjZSggdXJsLCAiXSIsICIpIiApCi0KLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICMgZm9yIHNlY3Rpb25zLCBkaXNwbGF5IHRpdGxlCi0gICAgICAgICAgICAgICAgICAgIHVybCA9ICggJyZsc3F1bzs8YSBocmVmPSInICsgdXJsICsgJyI+JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmxvY2sudGl0bGUgKyAnPC9hPiZyc3F1bzsnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXN0ICkKLSAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgIHVybCA9ICggJzxhIGhyZWY9IicgKyB1cmwgKyAnIj4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgJzwvYT4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXN0ICkKLQotICAgICAgICAgICAgICAgIHJldHVybiB1cmwKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAjIHdlIGRldGVjdGVkIGEgY3Jvc3MtcmVmZXJlbmNlIHRvIGFuIHVua25vd24gaXRlbQotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICJXQVJOSU5HOiB1bmRlZmluZWQgY3Jvc3MgcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAnIiArIG5hbWUgKyAiJy5cbiIgKQotICAgICAgICAgICAgICAgIHJldHVybiAnPycgKyBuYW1lICsgJz8nICsgcmVzdAotCi0gICAgICAgICMgaGFuZGxlIG1hcmt1cCBmb3IgaXRhbGljIGFuZCBib2xkCi0gICAgICAgIG0gPSByZV9pdGFsaWMubWF0Y2goIHdvcmQgKQotICAgICAgICBpZiBtOgotICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoIDEgKQotICAgICAgICAgICAgcmVzdCA9IG0uZ3JvdXAoIDIgKQotICAgICAgICAgICAgcmV0dXJuICc8aT4nICsgbmFtZSArICc8L2k+JyArIHJlc3QKLQotICAgICAgICBtID0gcmVfYm9sZC5tYXRjaCggd29yZCApCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgICBuYW1lID0gbS5ncm91cCggMSApCi0gICAgICAgICAgICByZXN0ID0gbS5ncm91cCggMiApCi0gICAgICAgICAgICByZXR1cm4gJzxiPicgKyBuYW1lICsgJzwvYj4nICsgcmVzdAotCi0gICAgICAgIHJldHVybiBodG1sX3F1b3RlKCB3b3JkICkKLQotICAgIGRlZiAgbWFrZV9odG1sX3BhcmEoIHNlbGYsIHdvcmRzICk6Ci0gICAgICAgICIiIkNvbnZlcnQgd29yZHMgb2YgYSBwYXJhZ3JhcGggaW50byB0YWdnZWQgSFRNTCB0ZXh0LiAgQWxzbyBoYW5kbGUKLSAgICAgICAgICAgY3Jvc3MgcmVmZXJlbmNlcy4iIiIKLSAgICAgICAgbGluZSA9ICIiCi0gICAgICAgIGlmIHdvcmRzOgotICAgICAgICAgICAgbGluZSA9IHNlbGYubWFrZV9odG1sX3dvcmQoIHdvcmRzWzBdICkKLSAgICAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzWzE6XToKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICIgIiArIHNlbGYubWFrZV9odG1sX3dvcmQoIHdvcmQgKQotICAgICAgICAgICAgIyBoYW5kbGUgaHlwZXJsaW5rcwotICAgICAgICAgICAgbGluZSA9IHJlX3VybC5zdWIoIHInPGEgaHJlZj0iXDEiPlwxPC9hPicsIGxpbmUgKQotICAgICAgICAgICAgIyBjb252ZXJ0IGAuLi4nIHF1b3RhdGlvbnMgaW50byByZWFsIGxlZnQgYW5kIHJpZ2h0IHNpbmdsZSBxdW90ZXMKLSAgICAgICAgICAgIGxpbmUgPSByZS5zdWIoIHIiKF58XFcpYCguKj8pJyhcV3wkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByJ1wxJmxzcXVvO1wyJnJzcXVvO1wzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKQotICAgICAgICAgICAgIyBjb252ZXJ0IHRpbGRlIGludG8gbm9uLWJyZWFrYWJsZSBzcGFjZQotICAgICAgICAgICAgbGluZSA9IHN0cmluZy5yZXBsYWNlKCBsaW5lLCAifiIsICImbmJzcDsiICkKLQotICAgICAgICByZXR1cm4gcGFyYV9oZWFkZXIgKyBsaW5lICsgcGFyYV9mb290ZXIKLQotICAgIGRlZiAgbWFrZV9odG1sX2NvZGUoIHNlbGYsIGxpbmVzICk6Ci0gICAgICAgICIiIkNvbnZlcnQgYSBjb2RlIHNlcXVlbmNlIHRvIEhUTUwuIiIiCi0gICAgICAgIGxpbmUgPSBjb2RlX2hlYWRlciArICdcbicKLSAgICAgICAgZm9yIGwgaW4gbGluZXM6Ci0gICAgICAgICAgICBsaW5lID0gbGluZSArIGh0bWxfcXVvdGUoIGwgKS5yc3RyaXAoKSArICdcbicKLQotICAgICAgICByZXR1cm4gbGluZSArIGNvZGVfZm9vdGVyCi0KLSAgICBkZWYgIG1ha2VfaHRtbF9pdGVtcyggc2VsZiwgaXRlbXMgKToKLSAgICAgICAgIiIiQ29udmVydCBhIGZpZWxkJ3MgY29udGVudCBpbnRvIEhUTUwuIiIiCi0gICAgICAgIGxpbmVzID0gW10KLSAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6Ci0gICAgICAgICAgICBpZiBpdGVtLmxpbmVzOgotICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCggc2VsZi5tYWtlX2h0bWxfY29kZSggaXRlbS5saW5lcyApICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCBzZWxmLm1ha2VfaHRtbF9wYXJhKCBpdGVtLndvcmRzICkgKQotCi0gICAgICAgIHJldHVybiBzdHJpbmcuam9pbiggbGluZXMsICdcbicgKQotCi0gICAgZGVmICBwcmludF9odG1sX2l0ZW1zKCBzZWxmLCBpdGVtcyApOgotICAgICAgICBwcmludCBzZWxmLm1ha2VfaHRtbF9pdGVtcyggaXRlbXMgKQotCi0gICAgZGVmICBwcmludF9odG1sX2ZpZWxkKCBzZWxmLCBmaWVsZCApOgotICAgICAgICBpZiBmaWVsZC5uYW1lOgotICAgICAgICAgICAgcHJpbnQoICc8dGFibGU+PHRyIHZhbGlnbj0idG9wIj48dGQ+PGI+JwotICAgICAgICAgICAgICAgICAgICsgZmllbGQubmFtZQotICAgICAgICAgICAgICAgICAgICsgIjwvYj48L3RkPjx0ZD4iICkKLQotICAgICAgICBwcmludCBzZWxmLm1ha2VfaHRtbF9pdGVtcyggZmllbGQuaXRlbXMgKQotCi0gICAgICAgIGlmIGZpZWxkLm5hbWU6Ci0gICAgICAgICAgICBwcmludCAiPC90ZD48L3RyPjwvdGFibGU+IgotCi0gICAgZGVmICBodG1sX3NvdXJjZV9xdW90ZSggc2VsZiwgbGluZSwgYmxvY2tfbmFtZSA9IE5vbmUgKToKLSAgICAgICAgcmVzdWx0ID0gIiIKLSAgICAgICAgd2hpbGUgbGluZToKLSAgICAgICAgICAgIG0gPSByZV9zb3VyY2VfY3Jvc3NyZWYubWF0Y2goIGxpbmUgKQotICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICBuYW1lICAgPSBtLmdyb3VwKCAyICkKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBodG1sX3F1b3RlKCBtLmdyb3VwKCAxICkgKQotICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbiggbS5ncm91cCggMCApICkKLQotICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gYmxvY2tfbmFtZToKLSAgICAgICAgICAgICAgICAgICAgIyB0aGlzIGlzIHRoZSBjdXJyZW50IGJsb2NrIG5hbWUsIGlmIGFueQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwcmVmaXggKyAnPGI+JyArIG5hbWUgKyAnPC9iPicKLSAgICAgICAgICAgICAgICBlbGlmIHJlX3NvdXJjZV9rZXl3b3Jkcy5tYXRjaCggbmFtZSApOgotICAgICAgICAgICAgICAgICAgICAjIHRoaXMgaXMgYSBDIGtleXdvcmQKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKCByZXN1bHQgKyBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleXdvcmRfcHJlZml4ICsgbmFtZSArIGtleXdvcmRfc3VmZml4ICkKLSAgICAgICAgICAgICAgICBlbGlmIG5hbWUgaW4gc2VsZi5pZGVudGlmaWVyczoKLSAgICAgICAgICAgICAgICAgICAgIyB0aGlzIGlzIGEga25vd24gaWRlbnRpZmllcgotICAgICAgICAgICAgICAgICAgICBibG9jayA9IHNlbGYuaWRlbnRpZmllcnNbbmFtZV0KLSAgICAgICAgICAgICAgICAgICAgaWQgPSBibG9jay5uYW1lCi0KLSAgICAgICAgICAgICAgICAgICAgIyBsaW5rIHRvIGEgZmllbGQgSUQgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgIGZvciBtYXJrdXAgaW4gYmxvY2subWFya3VwczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya3VwLnRhZyA9PSAndmFsdWVzJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWVsZCBpbiBtYXJrdXAuZmllbGRzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpZWxkLm5hbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbmFtZQotCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKCByZXN1bHQgKyBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzxhIGhyZWY9IicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VsZi5tYWtlX2Jsb2NrX3VybCggYmxvY2ssIGlkICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyI+JyArIG5hbWUgKyAnPC9hPicgKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIyBzZWN0aW9ucyBkb24ndCBoYXZlIGBtYXJrdXBzJzsgaG93ZXZlciwgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgICAjIHdhbnQgcmVmZXJlbmNlcyB0byBzZWN0aW9ucyBoZXJlIGFueXdheQotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGh0bWxfcXVvdGUoIGxpbmVbOmxlbmd0aF0gKQotCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgaHRtbF9xdW90ZSggbGluZVs6bGVuZ3RoXSApCi0KLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZVtsZW5ndGg6XQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBodG1sX3F1b3RlKCBsaW5lICkKLSAgICAgICAgICAgICAgICBsaW5lICAgPSBbXQotCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotICAgIGRlZiAgcHJpbnRfaHRtbF9maWVsZF9saXN0KCBzZWxmLCBmaWVsZHMgKToKLSAgICAgICAgcHJpbnQgJzx0YWJsZSBjbGFzcz0iZmllbGRzIj4nCi0gICAgICAgIGZvciBmaWVsZCBpbiBmaWVsZHM6Ci0gICAgICAgICAgICBwcmludCAoICc8dHI+PHRkIGNsYXNzPSJ2YWwiIGlkPSInICsgZmllbGQubmFtZSArICciPicKLSAgICAgICAgICAgICAgICAgICAgKyBmaWVsZC5uYW1lCi0gICAgICAgICAgICAgICAgICAgICsgJzwvdGQ+PHRkIGNsYXNzPSJkZXNjIj4nICkKLSAgICAgICAgICAgIHNlbGYucHJpbnRfaHRtbF9pdGVtcyggZmllbGQuaXRlbXMgKQotICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PC90cj4iCi0gICAgICAgIHByaW50ICI8L3RhYmxlPiIKLQotICAgIGRlZiAgcHJpbnRfaHRtbF9tYXJrdXAoIHNlbGYsIG1hcmt1cCApOgotICAgICAgICB0YWJsZV9maWVsZHMgPSBbXQotICAgICAgICBmb3IgZmllbGQgaW4gbWFya3VwLmZpZWxkczoKLSAgICAgICAgICAgIGlmIGZpZWxkLm5hbWU6Ci0gICAgICAgICAgICAgICAgIyBXZSBiZWdpbiBhIG5ldyBzZXJpZXMgb2YgZmllbGQgb3IgdmFsdWUgZGVmaW5pdGlvbnMuICBXZQotICAgICAgICAgICAgICAgICMgcmVjb3JkIHRoZW0gaW4gdGhlIGB0YWJsZV9maWVsZHMnIGxpc3QgYmVmb3JlIG91dHB1dHRpbmcKLSAgICAgICAgICAgICAgICAjIGFsbCBvZiB0aGVtIGFzIGEgc2luZ2xlIHRhYmxlLgotICAgICAgICAgICAgICAgIHRhYmxlX2ZpZWxkcy5hcHBlbmQoIGZpZWxkICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgdGFibGVfZmllbGRzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50X2h0bWxfZmllbGRfbGlzdCggdGFibGVfZmllbGRzICkKLSAgICAgICAgICAgICAgICAgICAgdGFibGVfZmllbGRzID0gW10KLQotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfaHRtbF9pdGVtcyggZmllbGQuaXRlbXMgKQotCi0gICAgICAgIGlmIHRhYmxlX2ZpZWxkczoKLSAgICAgICAgICAgIHNlbGYucHJpbnRfaHRtbF9maWVsZF9saXN0KCB0YWJsZV9maWVsZHMgKQotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyB0aGUgaW5kZXgKLSAgICAjCi0gICAgZGVmICBpbmRleF9lbnRlciggc2VsZiApOgotICAgICAgICBwcmludCBzZWxmLmh0bWxfaW5kZXhfaGVhZGVyCi0gICAgICAgIHNlbGYuaW5kZXhfaXRlbXMgPSB7fQotCi0gICAgZGVmICBpbmRleF9uYW1lX2VudGVyKCBzZWxmLCBuYW1lICk6Ci0gICAgICAgIGJsb2NrID0gc2VsZi5pZGVudGlmaWVyc1tuYW1lXQotICAgICAgICB1cmwgICA9IHNlbGYubWFrZV9ibG9ja191cmwoIGJsb2NrICkKLSAgICAgICAgc2VsZi5pbmRleF9pdGVtc1tuYW1lXSA9IHVybAotCi0gICAgZGVmICBpbmRleF9leGl0KCBzZWxmICk6Ci0gICAgICAgICMgYGJsb2NrX2luZGV4JyBhbHJlYWR5IGNvbnRhaW5zIHRoZSBzb3J0ZWQgbGlzdCBvZiBpbmRleCBuYW1lcwotICAgICAgICBjb3VudCA9IGxlbiggc2VsZi5ibG9ja19pbmRleCApCi0gICAgICAgIHJvd3MgID0gKCBjb3VudCArIHNlbGYuY29sdW1ucyAtIDEgKSAvLyBzZWxmLmNvbHVtbnMKLQotICAgICAgICBwcmludCAnPHRhYmxlIGNsYXNzPSJpbmRleCI+JwotICAgICAgICBmb3IgciBpbiByYW5nZSggcm93cyApOgotICAgICAgICAgICAgbGluZSA9ICI8dHI+IgotICAgICAgICAgICAgZm9yIGMgaW4gcmFuZ2UoIHNlbGYuY29sdW1ucyApOgotICAgICAgICAgICAgICAgIGkgPSByICsgYyAqIHJvd3MKLSAgICAgICAgICAgICAgICBpZiBpIDwgY291bnQ6Ci0gICAgICAgICAgICAgICAgICAgIGJuYW1lID0gc2VsZi5ibG9ja19pbmRleFtyICsgYyAqIHJvd3NdCi0gICAgICAgICAgICAgICAgICAgIHVybCAgID0gc2VsZi5pbmRleF9pdGVtc1tibmFtZV0KLSAgICAgICAgICAgICAgICAgICAgIyBkaXNwbGF5IGBmb29bYmFyXScgYXMgYGZvbyAoYmFyKScKLSAgICAgICAgICAgICAgICAgICAgYm5hbWUgPSBzdHJpbmcucmVwbGFjZSggYm5hbWUsICJbIiwgIiAoIiApCi0gICAgICAgICAgICAgICAgICAgIGJuYW1lID0gc3RyaW5nLnJlcGxhY2UoIGJuYW1lLCAiXSIsICIpIiAgKQotICAgICAgICAgICAgICAgICAgICAjIG5vcm1hbGl6ZSB1cmwsIGZvbGxvd2luZyBSRkMgMzk4NgotICAgICAgICAgICAgICAgICAgICB1cmwgPSBzdHJpbmcucmVwbGFjZSggdXJsLCAiWyIsICIoIiApCi0gICAgICAgICAgICAgICAgICAgIHVybCA9IHN0cmluZy5yZXBsYWNlKCB1cmwsICJdIiwgIikiICkKLSAgICAgICAgICAgICAgICAgICAgbGluZSAgPSAoIGxpbmUgKyAnPHRkPjxhIGhyZWY9IicgKyB1cmwgKyAnIj4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJuYW1lICsgJzwvYT48L3RkPicgKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgJzx0ZD48L3RkPicKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgIjwvdHI+IgotICAgICAgICAgICAgcHJpbnQgbGluZQotCi0gICAgICAgIHByaW50ICI8L3RhYmxlPiIKLQotICAgICAgICBwcmludCggaW5kZXhfZm9vdGVyX3N0YXJ0Ci0gICAgICAgICAgICAgICArIHNlbGYuZmlsZV9wcmVmaXggKyAidG9jLmh0bWwiCi0gICAgICAgICAgICAgICArIGluZGV4X2Zvb3Rlcl9lbmQgKQotCi0gICAgICAgIHByaW50IHNlbGYuaHRtbF9mb290ZXIKLQotICAgICAgICBzZWxmLmluZGV4X2l0ZW1zID0ge30KLQotICAgIGRlZiAgaW5kZXhfZHVtcCggc2VsZiwgaW5kZXhfZmlsZW5hbWUgPSBOb25lICk6Ci0gICAgICAgIGlmIGluZGV4X2ZpbGVuYW1lID09IE5vbmU6Ci0gICAgICAgICAgICBpbmRleF9maWxlbmFtZSA9IHNlbGYuZmlsZV9wcmVmaXggKyAiaW5kZXguaHRtbCIKLQotICAgICAgICBGb3JtYXR0ZXIuaW5kZXhfZHVtcCggc2VsZiwgaW5kZXhfZmlsZW5hbWUgKQotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyB0aGUgdGFibGUgb2YgY29udGVudHMKLSAgICAjCi0gICAgZGVmICB0b2NfZW50ZXIoIHNlbGYgKToKLSAgICAgICAgcHJpbnQgc2VsZi5odG1sX3RvY19oZWFkZXIKLSAgICAgICAgcHJpbnQgIjxoMT5UYWJsZSBvZiBDb250ZW50czwvaDE+IgotCi0gICAgZGVmICB0b2NfY2hhcHRlcl9lbnRlciggc2VsZiwgY2hhcHRlciApOgotICAgICAgICBwcmludCBjaGFwdGVyX2hlYWRlciArIHN0cmluZy5qb2luKCBjaGFwdGVyLnRpdGxlICkgKyBjaGFwdGVyX2ludGVyCi0gICAgICAgIHByaW50ICc8dGFibGUgY2xhc3M9InRvYyI+JwotCi0gICAgZGVmICB0b2Nfc2VjdGlvbl9lbnRlciggc2VsZiwgc2VjdGlvbiApOgotICAgICAgICBwcmludCAoICc8dHI+PHRkIGNsYXNzPSJsaW5rIj4nCi0gICAgICAgICAgICAgICAgKyAnPGEgaHJlZj0iJyArIHNlbGYubWFrZV9zZWN0aW9uX3VybCggc2VjdGlvbiApICsgJyI+JwotICAgICAgICAgICAgICAgICsgc2VjdGlvbi50aXRsZSArICc8L2E+PC90ZD48dGQgY2xhc3M9ImRlc2MiPicgKQotICAgICAgICBwcmludCBzZWxmLm1ha2VfaHRtbF9wYXJhKCBzZWN0aW9uLmFic3RyYWN0ICkKLQotICAgIGRlZiAgdG9jX3NlY3Rpb25fZXhpdCggc2VsZiwgc2VjdGlvbiApOgotICAgICAgICBwcmludCAiPC90ZD48L3RyPiIKLQotICAgIGRlZiAgdG9jX2NoYXB0ZXJfZXhpdCggc2VsZiwgY2hhcHRlciApOgotICAgICAgICBwcmludCAiPC90YWJsZT4iCi0gICAgICAgIHByaW50IGNoYXB0ZXJfZm9vdGVyCi0KLSAgICBkZWYgIHRvY19pbmRleCggc2VsZiwgaW5kZXhfZmlsZW5hbWUgKToKLSAgICAgICAgcHJpbnQoIGNoYXB0ZXJfaGVhZGVyCi0gICAgICAgICAgICAgICArICc8YSBocmVmPSInICsgaW5kZXhfZmlsZW5hbWUgKyAnIj5HbG9iYWwgSW5kZXg8L2E+JwotICAgICAgICAgICAgICAgKyBjaGFwdGVyX2ludGVyICsgY2hhcHRlcl9mb290ZXIgKQotCi0gICAgZGVmICB0b2NfZXhpdCggc2VsZiApOgotICAgICAgICBwcmludCggdG9jX2Zvb3Rlcl9zdGFydAotICAgICAgICAgICAgICAgKyBzZWxmLmZpbGVfcHJlZml4ICsgImluZGV4Lmh0bWwiCi0gICAgICAgICAgICAgICArIHRvY19mb290ZXJfZW5kICkKLQotICAgICAgICBwcmludCBzZWxmLmh0bWxfZm9vdGVyCi0KLSAgICBkZWYgIHRvY19kdW1wKCBzZWxmLCB0b2NfZmlsZW5hbWUgPSBOb25lLCBpbmRleF9maWxlbmFtZSA9IE5vbmUgKToKLSAgICAgICAgaWYgdG9jX2ZpbGVuYW1lID09IE5vbmU6Ci0gICAgICAgICAgICB0b2NfZmlsZW5hbWUgPSBzZWxmLmZpbGVfcHJlZml4ICsgInRvYy5odG1sIgotCi0gICAgICAgIGlmIGluZGV4X2ZpbGVuYW1lID09IE5vbmU6Ci0gICAgICAgICAgICBpbmRleF9maWxlbmFtZSA9IHNlbGYuZmlsZV9wcmVmaXggKyAiaW5kZXguaHRtbCIKLQotICAgICAgICBGb3JtYXR0ZXIudG9jX2R1bXAoIHNlbGYsIHRvY19maWxlbmFtZSwgaW5kZXhfZmlsZW5hbWUgKQotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyBzZWN0aW9ucwotICAgICMKLSAgICBkZWYgIHNlY3Rpb25fZW50ZXIoIHNlbGYsIHNlY3Rpb24gKToKLSAgICAgICAgcHJpbnQgc2VsZi5odG1sX2hlYWRlcgotCi0gICAgICAgIHByaW50ICggc2VjdGlvbl90aXRsZV9oZWFkZXIxICsgc2VjdGlvbi5uYW1lICsgc2VjdGlvbl90aXRsZV9oZWFkZXIyCi0gICAgICAgICAgICAgICAgKyBzZWN0aW9uLnRpdGxlCi0gICAgICAgICAgICAgICAgKyBzZWN0aW9uX3RpdGxlX2Zvb3RlciApCi0KLSAgICAgICAgbWF4d2lkdGggPSAwCi0gICAgICAgIGZvciBiIGluIHNlY3Rpb24uYmxvY2tzLnZhbHVlcygpOgotICAgICAgICAgICAgaWYgbGVuKCBiLm5hbWUgKSA+IG1heHdpZHRoOgotICAgICAgICAgICAgICAgIG1heHdpZHRoID0gbGVuKCBiLm5hbWUgKQotCi0gICAgICAgIHdpZHRoID0gNzAgICMgWFhYIG1hZ2ljIG51bWJlcgotICAgICAgICBpZiBtYXh3aWR0aCA+IDA6Ci0gICAgICAgICAgICAjIHByaW50IHNlY3Rpb24gc3lub3BzaXMKLSAgICAgICAgICAgIHByaW50IHNlY3Rpb25fc3lub3BzaXNfaGVhZGVyCi0gICAgICAgICAgICBwcmludCAnPHRhYmxlIGNsYXNzPSJzeW5vcHNpcyI+JwotCi0gICAgICAgICAgICBjb2x1bW5zID0gd2lkdGggLy8gbWF4d2lkdGgKLSAgICAgICAgICAgIGlmIGNvbHVtbnMgPCAxOgotICAgICAgICAgICAgICAgIGNvbHVtbnMgPSAxCi0KLSAgICAgICAgICAgIGNvdW50ID0gbGVuKCBzZWN0aW9uLmJsb2NrX25hbWVzICkKLSAgICAgICAgICAgICMgZG9uJ3QgaGFuZGxlIGxhc3QgZW50cnkgaWYgaXQgaXMgZW1wdHkKLSAgICAgICAgICAgIGlmIHNlY3Rpb24uYmxvY2tfbmFtZXNbLTFdID09ICIvZW1wdHkvIjoKLSAgICAgICAgICAgICAgICBjb3VudCAtPSAxCi0gICAgICAgICAgICByb3dzICA9ICggY291bnQgKyBjb2x1bW5zIC0gMSApIC8vIGNvbHVtbnMKLQotICAgICAgICAgICAgZm9yIHIgaW4gcmFuZ2UoIHJvd3MgKToKLSAgICAgICAgICAgICAgICBsaW5lID0gIjx0cj4iCi0gICAgICAgICAgICAgICAgZm9yIGMgaW4gcmFuZ2UoIGNvbHVtbnMgKToKLSAgICAgICAgICAgICAgICAgICAgaSA9IHIgKyBjICogcm93cwotICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICc8dGQ+JwotICAgICAgICAgICAgICAgICAgICBpZiBpIDwgY291bnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2VjdGlvbi5ibG9ja19uYW1lc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAiL2VtcHR5LyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCBjYW4gaGFwcGVuIHRoYXQgYSBjb21wbGV0ZSByb3cgaXMgZW1wdHksIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2l0aG91dCBhIHByb3BlciBgZmlsbGVyJyB0aGUgYnJvd3NlciBtaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29sbGFwc2UgdGhlIHJvdyB0byBhIG11Y2ggc21hbGxlciBoZWlnaHQgKG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBldmVuIG9taXQgaXQgY29tcGxldGVseSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICImbmJzcDsiCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3BsYXkgYGZvb1tiYXJdJyBhcyBgZm9vJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSByZS5zdWIoIHInXFsuKlxdJywgJycsIG5hbWUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm9ybWFsaXplIHVybCwgZm9sbG93aW5nIFJGQyAzOTg2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gc3RyaW5nLnJlcGxhY2UoIHVybCwgIlsiLCAiKCIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHN0cmluZy5yZXBsYWNlKCB1cmwsICJdIiwgIikiICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gKCBsaW5lICsgJzxhIGhyZWY9IiMnICsgdXJsICsgJyI+JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICc8L2E+JyApCi0KLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAnPC90ZD4nCi0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAiPC90cj4iCi0gICAgICAgICAgICAgICAgcHJpbnQgbGluZQotCi0gICAgICAgICAgICBwcmludCAiPC90YWJsZT4iCi0gICAgICAgICAgICBwcmludCBzZWN0aW9uX3N5bm9wc2lzX2Zvb3RlcgotCi0gICAgICAgIHByaW50IGRlc2NyaXB0aW9uX2hlYWRlcgotICAgICAgICBwcmludCBzZWxmLm1ha2VfaHRtbF9pdGVtcyggc2VjdGlvbi5kZXNjcmlwdGlvbiApCi0gICAgICAgIHByaW50IGRlc2NyaXB0aW9uX2Zvb3RlcgotCi0gICAgZGVmICBibG9ja19lbnRlciggc2VsZiwgYmxvY2sgKToKLSAgICAgICAgcHJpbnQgYmxvY2tfaGVhZGVyCi0KLSAgICAgICAgIyBwbGFjZSBodG1sIGFuY2hvciBpZiBuZWVkZWQKLSAgICAgICAgaWYgYmxvY2submFtZToKLSAgICAgICAgICAgIHVybCA9IGJsb2NrLm5hbWUKLSAgICAgICAgICAgICMgZGlzcGxheSBgZm9vW2Jhcl0nIGFzIGBmb28nCi0gICAgICAgICAgICBuYW1lID0gcmUuc3ViKCByJ1xbLipcXScsICcnLCBibG9jay5uYW1lICkKLSAgICAgICAgICAgICMgbm9ybWFsaXplIHVybCwgZm9sbG93aW5nIFJGQyAzOTg2Ci0gICAgICAgICAgICB1cmwgPSBzdHJpbmcucmVwbGFjZSggdXJsLCAiWyIsICIoIiApCi0gICAgICAgICAgICB1cmwgPSBzdHJpbmcucmVwbGFjZSggdXJsLCAiXSIsICIpIiApCi0gICAgICAgICAgICBwcmludCggJzxoMyBpZD0iJyArIHVybCArICciPicgKyBuYW1lICsgJzwvaDM+JyApCi0KLSAgICAgICAgIyBkdW1wIHRoZSBibG9jayBDIHNvdXJjZSBsaW5lcyBub3cKLSAgICAgICAgaWYgYmxvY2suY29kZToKLSAgICAgICAgICAgIGhlYWRlciA9ICcnCi0gICAgICAgICAgICBmb3IgZiBpbiBzZWxmLmhlYWRlcnMua2V5cygpOgotICAgICAgICAgICAgICAgIGlmIGJsb2NrLnNvdXJjZS5maWxlbmFtZS5maW5kKCBmICkgPj0gMDoKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gc2VsZi5oZWFkZXJzW2ZdICsgJyAoJyArIGYgKyAnKScKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLQotIyAgICAgICAgICAgaWYgbm90IGhlYWRlcjoKLSMgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAotIyAgICAgICAgICAgICAgICAgIldBUk5JTkc6IE5vIGhlYWRlciBtYWNybyBmb3IiCi0jICAgICAgICAgICAgICAgICArICIgJyIgKyBibG9jay5zb3VyY2UuZmlsZW5hbWUgKyAiJy5cbiIgKQotCi0gICAgICAgICAgICBpZiBoZWFkZXI6Ci0gICAgICAgICAgICAgICAgcHJpbnQgKCBoZWFkZXJfbG9jYXRpb25faGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICArICdEZWZpbmVkIGluICcgKyBoZWFkZXIgKyAnLicKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaGVhZGVyX2xvY2F0aW9uX2Zvb3RlciApCi0KLSAgICAgICAgICAgIHByaW50IHNvdXJjZV9oZWFkZXIKLSAgICAgICAgICAgIGZvciBsIGluIGJsb2NrLmNvZGU6Ci0gICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5odG1sX3NvdXJjZV9xdW90ZSggbCwgYmxvY2submFtZSApCi0gICAgICAgICAgICBwcmludCBzb3VyY2VfZm9vdGVyCi0KLSAgICBkZWYgIG1hcmt1cF9lbnRlciggc2VsZiwgbWFya3VwLCBibG9jayApOgotICAgICAgICBpZiBtYXJrdXAudGFnID09ICJkZXNjcmlwdGlvbiI6Ci0gICAgICAgICAgICBwcmludCBkZXNjcmlwdGlvbl9oZWFkZXIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50IG1hcmtlcl9oZWFkZXIgKyBtYXJrdXAudGFnICsgbWFya2VyX2ludGVyCi0KLSAgICAgICAgc2VsZi5wcmludF9odG1sX21hcmt1cCggbWFya3VwICkKLQotICAgIGRlZiAgbWFya3VwX2V4aXQoIHNlbGYsIG1hcmt1cCwgYmxvY2sgKToKLSAgICAgICAgaWYgbWFya3VwLnRhZyA9PSAiZGVzY3JpcHRpb24iOgotICAgICAgICAgICAgcHJpbnQgZGVzY3JpcHRpb25fZm9vdGVyCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCBtYXJrZXJfZm9vdGVyCi0KLSAgICBkZWYgIGJsb2NrX2V4aXQoIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIHByaW50KCBibG9ja19mb290ZXJfc3RhcnQgKyBzZWxmLmZpbGVfcHJlZml4ICsgImluZGV4Lmh0bWwiCi0gICAgICAgICAgICAgICArIGJsb2NrX2Zvb3Rlcl9taWRkbGUgKyBzZWxmLmZpbGVfcHJlZml4ICsgInRvYy5odG1sIgotICAgICAgICAgICAgICAgKyBibG9ja19mb290ZXJfZW5kICkKLQotICAgIGRlZiAgc2VjdGlvbl9leGl0KCBzZWxmLCBzZWN0aW9uICk6Ci0gICAgICAgIHByaW50IGh0bWxfZm9vdGVyCi0KLSAgICBkZWYgIHNlY3Rpb25fZHVtcF9hbGwoIHNlbGYgKToKLSAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9uczoKLSAgICAgICAgICAgIHNlbGYuc2VjdGlvbl9kdW1wKCBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZV9wcmVmaXggKyBzZWN0aW9uLm5hbWUgKyAnLmh0bWwnICkKLQotIyBlb2YKZGlmZiAtLWdpdCBhL3NyYy90b29scy9kb2NtYWtlci91dGlscy5weSBiL3NyYy90b29scy9kb2NtYWtlci91dGlscy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YjJlNy4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIvdXRpbHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIwotIyAgdXRpbHMucHkKLSMKLSMgICAgQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgdGhlIGBkb2NtYWtlcicgdG9vbCAobGlicmFyeSBmaWxlKS4KLSMKLSMgIENvcHlyaWdodCAyMDAyLTIwMTcgYnkKLSMgIERhdmlkIFR1cm5lci4KLSMKLSMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLSMgIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0Ci0jICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKLSMgIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotIyAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLWltcG9ydCBzdHJpbmcsIHN5cywgb3MsIGdsb2IsIGl0ZXJ0b29scwotCi0KLSMgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5Ci0jCi1vdXRwdXRfZGlyID0gTm9uZQotCi0KLSMgQSBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIHNvcnRpbmcga2V5LiAgV2Ugd2FudCBsZXhpY29ncmFwaGljYWwgb3JkZXIKLSMgKHByaW1hcnkga2V5KSBleGNlcHQgdGhhdCBjYXBpdGFsIGxldHRlcnMgYXJlIHNvcnRlZCBiZWZvcmUgbG93ZXJjYXNlCi0jIG9uZXMgKHNlY29uZGFyeSBrZXkpLgotIwotIyBUaGUgcHJpbWFyeSBrZXkgaXMgaW1wbGVtZW50ZWQgYnkgbG93ZXJjYXNpbmcgdGhlIGlucHV0LiAgVGhlIHNlY29uZGFyeQotIyBrZXkgaXMgc2ltcGx5IHRoZSBvcmlnaW5hbCBkYXRhIGFwcGVuZGVkLCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLiAgRm9yCi0jIGV4YW1wbGUsIHRoZSBzb3J0IGtleSBmb3IgYEZUX3gnIGlzIGBmRnRUX194eCcsIHdoaWxlIHRoZSBzb3J0IGtleSBmb3IKLSMgYGZ0X1gnIGlzIGBmZnR0X194WCcuICBTaW5jZSBBU0NJSSBjb2RlcyBvZiB1cHBlcmNhc2UgbGV0dGVycyBhcmUKLSMgbnVtZXJpY2FsbHkgc21hbGxlciB0aGFuIHRoZSBjb2RlcyBvZiBsb3dlcmNhc2UgbGV0dGVycywgYGZGdFRfX3h4JyBnZXRzCi0jIHNvcnRlZCBiZWZvcmUgYGZmdHRfX3hYJy4KLSMKLWRlZiAgaW5kZXhfa2V5KCBzICk6Ci0gICAgcmV0dXJuIHN0cmluZy5qb2luKCBpdGVydG9vbHMuY2hhaW4oICp6aXAoIHMubG93ZXIoKSwgcyApICkgKQotCi0KLSMgU29ydCBgaW5wdXRfbGlzdCcsIHBsYWNpbmcgdGhlIGVsZW1lbnRzIG9mIGBvcmRlcl9saXN0JyBpbiBmcm9udC4KLSMKLWRlZiAgc29ydF9vcmRlcl9saXN0KCBpbnB1dF9saXN0LCBvcmRlcl9saXN0ICk6Ci0gICAgbmV3X2xpc3QgPSBvcmRlcl9saXN0WzpdCi0gICAgZm9yIGlkIGluIGlucHV0X2xpc3Q6Ci0gICAgICAgIGlmIG5vdCBpZCBpbiBvcmRlcl9saXN0OgotICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKCBpZCApCi0gICAgcmV0dXJuIG5ld19saXN0Ci0KLQotIyBEaXZlcnQgc3RhbmRhcmQgb3V0cHV0IHRvIGEgZ2l2ZW4gcHJvamVjdCBkb2N1bWVudGF0aW9uIGZpbGUuICBVc2UKLSMgYG91dHB1dF9kaXInIHRvIGRldGVybWluZSB0aGUgZmlsZW5hbWUgbG9jYXRpb24gaWYgbmVjZXNzYXJ5IGFuZCBzYXZlIHRoZQotIyBvbGQgc3Rkb3V0IGhhbmRsZSBpbiBhIHR1cGxlIHRoYXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KLSMKLWRlZiAgb3Blbl9vdXRwdXQoIGZpbGVuYW1lICk6Ci0gICAgZ2xvYmFsIG91dHB1dF9kaXIKLQotICAgIGlmIG91dHB1dF9kaXIgYW5kIG91dHB1dF9kaXIgIT0gIiI6Ci0gICAgICAgIGZpbGVuYW1lID0gb3V0cHV0X2RpciArIG9zLnNlcCArIGZpbGVuYW1lCi0KLSAgICBvbGRfc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgIG5ld19maWxlICAgPSBvcGVuKCBmaWxlbmFtZSwgInciICkKLSAgICBzeXMuc3Rkb3V0ID0gbmV3X2ZpbGUKLQotICAgIHJldHVybiAoIG5ld19maWxlLCBvbGRfc3Rkb3V0ICkKLQotCi0jIENsb3NlIHRoZSBvdXRwdXQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYG9wZW5fb3V0cHV0Jy4KLSMKLWRlZiAgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKToKLSAgICBvdXRwdXRbMF0uY2xvc2UoKQotICAgIHN5cy5zdGRvdXQgPSBvdXRwdXRbMV0KLQotCi0jIENoZWNrIG91dHB1dCBkaXJlY3RvcnkuCi0jCi1kZWYgIGNoZWNrX291dHB1dCgpOgotICAgIGdsb2JhbCBvdXRwdXRfZGlyCi0gICAgaWYgb3V0cHV0X2RpcjoKLSAgICAgICAgaWYgb3V0cHV0X2RpciAhPSAiIjoKLSAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKCBvdXRwdXRfZGlyICk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggImFyZ3VtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAnIiArIG91dHB1dF9kaXIgKyAiJyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5XG4iICkKLSAgICAgICAgICAgICAgICBzeXMuZXhpdCggMiApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBvdXRwdXRfZGlyID0gTm9uZQotCi0KLWRlZiAgZmlsZV9leGlzdHMoIHBhdGhuYW1lICk6Ci0gICAgIiIiQ2hlY2sgdGhhdCBhIGdpdmVuIGZpbGUgZXhpc3RzLiIiIgotICAgIHJlc3VsdCA9IDEKLSAgICB0cnk6Ci0gICAgICAgIGZpbGUgPSBvcGVuKCBwYXRobmFtZSwgInIiICkKLSAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgZXhjZXB0OgotICAgICAgICByZXN1bHQgPSBOb25lCi0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIHBhdGhuYW1lICsgIiBjb3VsZG4ndCBiZSBhY2Nlc3NlZFxuIiApCi0KLSAgICByZXR1cm4gcmVzdWx0Ci0KLQotZGVmICBtYWtlX2ZpbGVfbGlzdCggYXJncyA9IE5vbmUgKToKLSAgICAiIiJCdWlsZCBhIGxpc3Qgb2YgaW5wdXQgZmlsZXMgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiIiIgotICAgIGZpbGVfbGlzdCA9IFtdCi0gICAgIyBzeXMuc3RkZXJyLndyaXRlKCByZXByKCBzeXMuYXJndlsxIDpdICkgKyAnXG4nICkKLQotICAgIGlmIG5vdCBhcmdzOgotICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCi0KLSAgICBmb3IgcGF0aG5hbWUgaW4gYXJnczoKLSAgICAgICAgaWYgc3RyaW5nLmZpbmQoIHBhdGhuYW1lLCAnKicgKSA+PSAwOgotICAgICAgICAgICAgbmV3cGF0aCA9IGdsb2IuZ2xvYiggcGF0aG5hbWUgKQotICAgICAgICAgICAgbmV3cGF0aC5zb3J0KCkgICMgc29ydCBmaWxlcyAtLSB0aGlzIGlzIGltcG9ydGFudCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvZiB0aGUgb3JkZXIgb2YgZmlsZXMKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG5ld3BhdGggPSBbcGF0aG5hbWVdCi0KLSAgICAgICAgZmlsZV9saXN0LmV4dGVuZCggbmV3cGF0aCApCi0KLSAgICBpZiBsZW4oIGZpbGVfbGlzdCApID09IDA6Ci0gICAgICAgIGZpbGVfbGlzdCA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgICAjIG5vdyBmaWx0ZXIgdGhlIGZpbGUgbGlzdCB0byByZW1vdmUgbm9uLWV4aXN0aW5nIG9uZXMKLSAgICAgICAgZmlsZV9saXN0ID0gZmlsdGVyKCBmaWxlX2V4aXN0cywgZmlsZV9saXN0ICkKLQotICAgIHJldHVybiBmaWxlX2xpc3QKLQotIyBlb2YKZGlmZiAtLWdpdCBhL3NyYy90b29scy9mdGZ1enplci9SRUFETUUgYi9zcmMvdG9vbHMvZnRmdXp6ZXIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2Y5MDcxLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9mdGZ1enplci9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1mdGZ1enplcgotPT09PT09PT0KLQotCi1mdGZ1enplci5jYwotLS0tLS0tLS0tLS0KLQotVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFyZ2V0IGZ1bmN0aW9uICBmb3IgRnJlZVR5cGUgZnV6emluZy4gIEl0IGNhbiBiZQotdXNlZCAgICB3aXRoICAgbGliRnV6emVyICAgIChodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbCkgICBvcgotcG90ZW50aWFsbHkgYW55IG90aGVyIHNpbWlsYXIgZnV6emVyLgotCi1Vc2FnZToKLQotICAxLiBCdWlsZCAgYGxpYmZyZWV0eXBlLmEnIGFuZCAgYGZ0ZnV6emVyLmNjJyB1c2luZyAgdGhlIG1vc3QgIHJlY2VudAotICAgICBjbGFuZyBjb21waWxlciB3aXRoIHRoZXNlIGZsYWdzOgotCi0gICAgICAgIyBmb3IgZnV6emVyIGNvdmVyYWdlIGZlZWRiYWNrCi0gICAgICAgLWZzYW5pdGl6ZS1jb3ZlcmFnZT1lZGdlLDhiaXQtY291bnRlcnMKLSAgICAgICAjIGZvciBidWcgY2hlY2tpbmcKLSAgICAgICAtZnNhbml0aXplPWFkZHJlc3Msc2lnbmVkLWludGVnZXItb3ZlcmZsb3csc2hpZnQKLQotICAgICBZb3UgIGFsc28gbmVlZCAgdGhlIGhlYWRlciAgZmlsZXMgZnJvbSAgdGhlIGBsaWJhcmNoaXZlJyAgbGlicmFyeQotICAgICAoaHR0cDovL3d3dy5saWJhcmNoaXZlLm9yZy8pICBmb3IgaGFuZGxpbmcgIHRhciAgZmlsZXMgKHNlZSAgZmlsZQotICAgICBgZnRtdXRhdG9yLmNjJyBiZWxvdyBmb3IgbW9yZSkuCi0KLSAgMi4gTGluayB3aXRoIGBsaWJGdXp6ZXInIChpdCBjb250YWlucyBgbWFpbicpIGFuZCBgbGliYXJjaGl2ZScuCi0KLSAgMy4gUnVuIHRoZSBmdXp6ZXIgb24gc29tZSB0ZXN0IGNvcnB1cy4KLQotVGhlIGV4YWN0IGZsYWdzIGFuZCBjb21tYW5kcyBtYXkgdmFyeS4KLQotCi1UaGVyZSBpcyBhIGNvbnRpbnVvdXMgZnV6emluZyBib3QgdGhhdCBydW5zIGZ0ZnV6emVyLgotCi0gIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbGliZnV6emVyLWJvdC90cmVlL21hc3Rlci9mcmVldHlwZQotCi1DaGVjayB0aGUgYm90IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtb3N0IGN1cnJlbnQgc2V0dGluZ3MuCi0KLQotZnRtdXRhdG9yLmNjCi0tLS0tLS0tLS0tLS0KLQotRnJlZVR5cGUgaGFzIHRoZSAgYWJpbGl0eSB0byBgYXR0YWNoJyBhdXhpbGlhcnkgZmlsZXMgdG8gIGEgZm9udCBmaWxlLAotcHJvdmlkaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBUaGUgbWFpbiB1c2FnZSBpcyB0byBsb2FkIEFGTSBmaWxlcwotZm9yIFBvc3RTY3JpcHQgVHlwZSAxIGZvbnRzLgotCi1Ib3dldmVyLCBsaWJGdXp6ZXIgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgIG11dGF0aW9uIG9mIGEgc2luZ2xlIGlucHV0Ci1maWxlLiAgIEZvciAgdGhpcyAgcmVhc29uLCAgYGZ0bXV0YXRvci5jYycgY29udGFpbnMgIGEgIGN1c3RvbSAgZnV6emVyCi1tdXRhdG9yIHRoYXQgdXNlcyBhbiB1bmNvbXByZXNzZWQgdGFyICBmaWxlIGFyY2hpdmUgYXMgdGhlIGlucHV0LiAgVGhlCi1maXJzdCBmaWxlIGluICBzdWNoIGEgdGFyYmFsbCBnZXRzICBvcGVuZWQgYnkgRnJlZVR5cGUgYXMgIGEgZm9udCwgYWxsCi1vdGhlciBmaWxlcyBhcmUgdHJlYXRlZCBhcyBpbnB1dCBmb3IgYEZUX0F0dGFjaF9TdHJlYW0nLgotCi1Db21waWxhdGlvbiBpcyBzaW1pbGFyIHRvIGBmdGZ1enplci5jJy4KLQotCi1ydW5pbnB1dC5jYwotLS0tLS0tLS0tLS0KLQotVG8gcnVuIHRoZSB0YXJnZXQgZnVuY3Rpb24gb24gYSBzZXQgb2YgaW5wdXQgZmlsZXMsIHRoaXMgZmlsZSBjb250YWlucwotYSAgIGNvbnZlbmllbmNlICBgbWFpbicgICBmdW5jdGlvbi4gICBMaW5rICAgaXQgIHdpdGggICBgZnRmdXp6ZXIuY2MnLAotYGxpYmZyZWV0eXBlLmEnLCBhbmQgYGxpYmFyY2hpdmUnIGFuZCBydW4gbGlrZQotCi0gIC4vYS5vdXQgbXlfdGVzdHNfaW5wdXRzLyoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgMjAxNS0yMDE3IGJ5Ci1EYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0KLVRoaXMgIGZpbGUgaXMgIHBhcnQgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdCwgYW5kICBtYXkgb25seSAgYmUgdXNlZCwKLW1vZGlmaWVkLCAgYW5kIGRpc3RyaWJ1dGVkICB1bmRlciB0aGUgIHRlcm1zIG9mICB0aGUgIEZyZWVUeXBlIHByb2plY3QKLWxpY2Vuc2UsICBMSUNFTlNFLlRYVC4gIEJ5ICBjb250aW51aW5nIHRvICB1c2UsIG1vZGlmeSwgIG9yIGRpc3RyaWJ1dGUKLXRoaXMgZmlsZSB5b3UgIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCAgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQKLWFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLQotLS0tIGVuZCBvZiBSRUFETUUgLS0tCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZnRmdXp6ZXIvZnRmdXp6ZXIuY2MgYi9zcmMvdG9vbHMvZnRmdXp6ZXIvZnRmdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTBjMmIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL2Z0ZnV6emVyL2Z0ZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLS8vIGZ0ZnV6emVyLmNjCi0vLwotLy8gICBBIGZ1enppbmcgZnVuY3Rpb24gdG8gdGVzdCBGcmVlVHlwZSB3aXRoIGxpYkZ1enplci4KLS8vCi0vLyBDb3B5cmlnaHQgMjAxNS0yMDE3IGJ5Ci0vLyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0vLwotLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAotLy8gbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKLS8vIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQotLy8gdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCi0vLyB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLQotLy8gd2UgdXNlIGB1bmlxdWVfcHRyJywgYGRlY2x0eXBlJywgYW5kIG90aGVyIGdpbW1pY2tzIGRlZmluZWQgc2luY2UgQysrMTEKLSNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKLSMgIGVycm9yICJhIEMrKzExIGNvbXBpbGVyIGlzIG5lZWRlZCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8YXJjaGl2ZS5oPgotI2luY2x1ZGUgPGFyY2hpdmVfZW50cnkuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0dMWVBIX0gKLSNpbmNsdWRlIEZUX0NBQ0hFX0gKLSNpbmNsdWRlIEZUX0NBQ0hFX0NIQVJNQVBfSAotI2luY2x1ZGUgRlRfQ0FDSEVfSU1BR0VfSAotI2luY2x1ZGUgRlRfQ0FDSEVfU01BTExfQklUTUFQU19ICi0jaW5jbHVkZSBGVF9TWU5USEVTSVNfSAotI2luY2x1ZGUgRlRfQURWQU5DRVNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9CQk9YX0gKLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0jaW5jbHVkZSBGVF9DRkZfRFJJVkVSX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLQotCi0gIHN0YXRpYyBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICBzdGF0aWMgaW50ICAgICAgICAgSW5pdFJlc3VsdDsKLQotCi0gIHN0cnVjdCBGVF9HbG9iYWwKLSAgewotICAgIEZUX0dsb2JhbCgpCi0gICAgewotICAgICAgSW5pdFJlc3VsdCA9IEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAgICBpZiAoIEluaXRSZXN1bHQgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIC8vIHRyeSB0byBhY3RpdmF0ZSBBZG9iZSdzIENGRiBlbmdpbmU7IGl0IG1pZ2h0IG5vdCBiZSB0aGUgZGVmYXVsdAotICAgICAgdW5zaWduZWQgaW50ICBjZmZfaGludGluZ19lbmdpbmUgPSBGVF9DRkZfSElOVElOR19BRE9CRTsKLSAgICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgImNmZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJoaW50aW5nLWVuZ2luZSIsICZjZmZfaGludGluZ19lbmdpbmUgKTsKLSAgICB9Ci0KLSAgICB+RlRfR2xvYmFsKCkKLSAgICB7Ci0gICAgICBGVF9Eb25lX0ZyZWVUeXBlKCBsaWJyYXJ5ICk7Ci0gICAgfQotICB9OwotCi0gIEZUX0dsb2JhbCAgZ2xvYmFsX2Z0OwotCi0KLSAgLy8gV2Ugd2FudCB0byBzZWxlY3QgbiB2YWx1ZXMgYXQgcmFuZG9tICh3aXRob3V0IHJlcGV0aXRpb24pLAotICAvLyB3aXRoIDAgPCBuIDw9IE4uICBUaGUgYWxnb3JpdGhtIGlzIHRha2VuIGZyb20gVEFvQ1AsIFZvbC4gMgotICAvLyAoQWxnb3JpdGhtIFMsIHNlbGVjdGlvbiBzYW1wbGluZyB0ZWNobmlxdWUpCi0gIHN0cnVjdCBSYW5kb20KLSAgewotICAgIGludCAgbjsKLSAgICBpbnQgIE47Ci0KLSAgICBpbnQgIHQ7IC8vIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgc28gZmFyCi0gICAgaW50ICBtOyAvLyBudW1iZXIgb2Ygc2VsZWN0ZWQgdmFsdWVzIHNvIGZhcgotCi0gICAgdWludDMyX3QgIHI7IC8vIHRoZSBjdXJyZW50IHBzZXVkby1yYW5kb20gbnVtYmVyCi0KLSAgICBSYW5kb20oIGludCBuXywKLSAgICAgICAgICAgIGludCBOXyApCi0gICAgOiBuKCBuXyApLAotICAgICAgTiggTl8gKQotICAgIHsKLSAgICAgIHQgPSAwOwotICAgICAgbSA9IDA7Ci0KLSAgICAgIC8vIElkZWFsbHksIHRoaXMgc2hvdWxkIGRlcGVuZCBvbiB0aGUgaW5wdXQgZmlsZSwKLSAgICAgIC8vIGZvciBleGFtcGxlLCB0YWtpbmcgdGhlIHNoYTI1NiBhcyBpbnB1dDsKLSAgICAgIC8vIGhvd2V2ZXIsIHRoaXMgaXMgb3ZlcmtpbGwgZm9yIGZ1enp5aW5nIHRlc3RzLgotICAgICAgciA9IDEyMzQ1OwotICAgIH0KLQotICAgIGludCBnZXQoKQotICAgIHsKLSAgICAgIGlmICggbSA+PSBuICkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgUmVkbzoKLSAgICAgIC8vIFdlIGNhbid0IHVzZSBgcmFuZCc6IGRpZmZlcmVudCBDIGxpYnJhcmllcyBtaWdodCBwcm92aWRlCi0gICAgICAvLyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgZnVuY3Rpb24uICBBcyBhIHJlcGxhY2VtZW50LAotICAgICAgLy8gd2UgdXNlIGEgMzJiaXQgdmVyc2lvbiBvZiB0aGUgYHhvcnNoaWZ0JyBhbGdvcml0aG0uCi0gICAgICByIF49IHIgPDwgMTM7Ci0gICAgICByIF49IHIgPj4gMTc7Ci0gICAgICByIF49IHIgPDwgNTsKLQotICAgICAgZG91YmxlICBVID0gZG91YmxlKCByICkgLyBVSU5UMzJfTUFYOwotCi0gICAgICBpZiAoICggTiAtIHQgKSAqIFUgPj0gKCBuIC0gbSApICkKLSAgICAgIHsKLSAgICAgICAgdCsrOwotICAgICAgICBnb3RvIFJlZG87Ci0gICAgICB9Ci0KLSAgICAgIHQrKzsKLSAgICAgIG0rKzsKLQotICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotICB9OwotCi0KLSAgc3RhdGljIGludAotICBhcmNoaXZlX3JlYWRfZW50cnlfZGF0YSggc3RydWN0IGFyY2hpdmUgICAqYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RlRfQnl0ZT4gICp2dyApCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgcjsKLSAgICBjb25zdCBGVF9CeXRlKiAgYnVmZjsKLSAgICBzaXplX3QgICAgICAgICAgc2l6ZTsKLSAgICBpbnQ2NF90ICAgICAgICAgb2Zmc2V0OwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICByID0gYXJjaGl2ZV9yZWFkX2RhdGFfYmxvY2soIGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqKj4oICZidWZmICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0ICk7Ci0gICAgICBpZiAoIHIgPT0gQVJDSElWRV9FT0YgKQotICAgICAgICByZXR1cm4gQVJDSElWRV9PSzsKLSAgICAgIGlmICggciAhPSBBUkNISVZFX09LICkKLSAgICAgICAgcmV0dXJuIHI7Ci0KLSAgICAgIHZ3LT5pbnNlcnQoIHZ3LT5lbmQoKSwgYnVmZiwgYnVmZiArIHNpemUgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2ZWN0b3I8dmVjdG9yPEZUX0J5dGU+PgotICBwYXJzZV9kYXRhKCBjb25zdCB1aW50OF90KiAgZGF0YSwKLSAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUgKQotICB7Ci0gICAgc3RydWN0IGFyY2hpdmVfZW50cnkqICAgIGVudHJ5OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICByOwotICAgIHZlY3Rvcjx2ZWN0b3I8RlRfQnl0ZT4+ICBmaWxlczsKLQotICAgIHVuaXF1ZV9wdHI8c3RydWN0ICBhcmNoaXZlLAotICAgICAgICAgICAgICAgZGVjbHR5cGUgKCBhcmNoaXZlX3JlYWRfZnJlZSApKj4gIGEoIGFyY2hpdmVfcmVhZF9uZXcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3JlYWRfZnJlZSApOwotCi0gICAgLy8gYWN0aXZhdGUgcmVhZGluZyBvZiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmVzCi0gICAgYXJjaGl2ZV9yZWFkX3N1cHBvcnRfZm9ybWF0X3RhciggYS5nZXQoKSApOwotCi0gICAgLy8gdGhlIG5lZWQgZm9yIGBjb25zdF9jYXN0JyB3YXMgcmVtb3ZlZCB3aXRoIGxpYmFyY2hpdmUgY29tbWl0IGJlNGQ0ZGQKLSAgICBpZiAoICEoIHIgPSBhcmNoaXZlX3JlYWRfb3Blbl9tZW1vcnkoCi0gICAgICAgICAgICAgICAgICBhLmdldCgpLAotICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCBkYXRhICkgKSwKLSAgICAgICAgICAgICAgICAgIHNpemUgKSApICkKLSAgICB7Ci0gICAgICB1bmlxdWVfcHRyPHN0cnVjdCAgYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgZGVjbHR5cGUgKCBhcmNoaXZlX3JlYWRfY2xvc2UgKSo+ICBhX29wZW4oIGEuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3JlYWRfY2xvc2UgKTsKLQotICAgICAgLy8gcmVhZCBmaWxlcyBjb250YWluZWQgaW4gYXJjaGl2ZQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgciA9IGFyY2hpdmVfcmVhZF9uZXh0X2hlYWRlciggYV9vcGVuLmdldCgpLCAmZW50cnkgKTsKLSAgICAgICAgaWYgKCByID09IEFSQ0hJVkVfRU9GICkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCByICE9IEFSQ0hJVkVfT0sgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHZlY3RvcjxGVF9CeXRlPiAgZW50cnlfZGF0YTsKLSAgICAgICAgciA9IGFyY2hpdmVfcmVhZF9lbnRyeV9kYXRhKCBhLmdldCgpLCAmZW50cnlfZGF0YSApOwotICAgICAgICBpZiAoIHIgIT0gQVJDSElWRV9PSyApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZmlsZXMucHVzaF9iYWNrKCBtb3ZlKCBlbnRyeV9kYXRhICkgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGZpbGVzLnNpemUoKSA9PSAwICkKLSAgICAgIGZpbGVzLmVtcGxhY2VfYmFjayggZGF0YSwgZGF0YSArIHNpemUgKTsKLQotICAgIHJldHVybiBmaWxlczsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgc2V0SW50ZXJtZWRpYXRlQXhpcyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICAvLyBvbmx5IGhhbmRsZSBNdWx0aXBsZSBNYXN0ZXJzIGFuZCBHWCB2YXJpYXRpb24gZm9udHMKLSAgICBpZiAoICFGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggZmFjZSApICkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIGdldCB2YXJpYXRpb24gZGF0YSBmb3IgY3VycmVudCBpbnN0YW5jZQotICAgIEZUX01NX1ZhciogIHZhcmlhdGlvbnNfcHRyID0gbnVsbHB0cjsKLSAgICBpZiAoIEZUX0dldF9NTV9WYXIoIGZhY2UsICZ2YXJpYXRpb25zX3B0ciApICkKLSAgICAgIHJldHVybjsKLQotICAgIHVuaXF1ZV9wdHI8RlRfTU1fVmFyLAotICAgICAgICAgICAgICAgZGVjbHR5cGUgKCBmcmVlICkqPiAgdmFyaWF0aW9ucyggdmFyaWF0aW9uc19wdHIsIGZyZWUgKTsKLSAgICB2ZWN0b3I8RlRfRml4ZWQ+ICAgICAgICAgICAgICAgIGNvb3JkcyggdmFyaWF0aW9ucy0+bnVtX2F4aXMgKTsKLQotICAgIC8vIHNlbGVjdCBhbiBhcmJpdHJhcnkgaW5zdGFuY2UKLSAgICBmb3IgKCB1bnNpZ25lZCBpbnQgIGkgPSAwOyBpIDwgdmFyaWF0aW9ucy0+bnVtX2F4aXM7IGkrKyApCi0gICAgICBjb29yZHNbaV0gPSAoIHZhcmlhdGlvbnMtPmF4aXNbaV0ubWluaW11bSArCi0gICAgICAgICAgICAgICAgICAgIHZhcmlhdGlvbnMtPmF4aXNbaV0uZGVmICAgICApIC8gMjsKLQotICAgIGlmICggRlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCggY29vcmRzLnNpemUoKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkcy5kYXRhKCkgKSApCi0gICAgICByZXR1cm47Ci0gIH0KLQotCi0gIC8vIHRoZSBpbnRlcmZhY2UgZnVuY3Rpb24gdG8gdGhlIGxpYkZ1enplciBsaWJyYXJ5Ci0gIGV4dGVybiAiQyIgaW50Ci0gIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoIGNvbnN0IHVpbnQ4X3QqICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZV8gKQotICB7Ci0gICAgYXNzZXJ0KCAhSW5pdFJlc3VsdCApOwotCi0gICAgaWYgKCBzaXplXyA8IDEgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dmVjdG9yPEZUX0J5dGU+PiYgIGZpbGVzID0gcGFyc2VfZGF0YSggZGF0YSwgc2l6ZV8gKTsKLQotICAgIEZUX0ZhY2UgICAgICAgICBmYWNlOwotICAgIEZUX0ludDMyICAgICAgICBsb2FkX2ZsYWdzICA9IEZUX0xPQURfREVGQVVMVDsKLSNpZiAwCi0gICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlID0gRlRfUkVOREVSX01PREVfTk9STUFMOwotI2VuZGlmCi0KLSAgICAvLyBXZSB1c2UgYSBjb25zZXJ2YXRpdmUgYXBwcm9hY2ggaGVyZSwgYXQgdGhlIGNvc3Qgb2YgY2FsbGluZwotICAgIC8vIGBGVF9OZXdfRmFjZScgcXVpdGUgb2Z0ZW4uICBUaGUgaWRlYSBpcyB0aGF0IHRoZSBmdXp6ZXIgc2hvdWxkIGJlCi0gICAgLy8gYWJsZSB0byB0cnkgYWxsIGZhY2VzIGFuZCBuYW1lZCBpbnN0YW5jZXMgb2YgYSBmb250LCBleHBlY3RpbmcgdGhhdAotICAgIC8vIHNvbWUgZmFjZXMgZG9uJ3Qgd29yayBmb3IgdmFyaW91cyByZWFzb25zLCBlLmcuLCBhIGJyb2tlbiBzdWJmb250LCBvcgotICAgIC8vIGFuIHVuc3VwcG9ydGVkIE5GTlQgYml0bWFwIGZvbnQgaW4gYSBNYWMgZGZvbnQgcmVzb3VyY2UgdGhhdCBob2xkcwotICAgIC8vIG1vcmUgdGhhbiBhIHNpbmdsZSBmb250LgotCi0gICAgLy8gZ2V0IG51bWJlciBvZiBmYWNlcwotICAgIGlmICggRlRfTmV3X01lbW9yeV9GYWNlKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1swXS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWZpbGVzWzBdLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlICkgKQotICAgICAgcmV0dXJuIDA7Ci0gICAgbG9uZyAgbnVtX2ZhY2VzID0gZmFjZS0+bnVtX2ZhY2VzOwotICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOwotCi0gICAgLy8gbG9vcCBvdmVyIHVwIHRvIDIwIGFyYml0cmFyaWx5IHNlbGVjdGVkIGZhY2VzCi0gICAgLy8gZnJvbSBpbmRleCByYW5nZSBbMDtudW0tZmFjZXMtMV0KLSAgICBsb25nICBtYXhfZmFjZV9jbnQgPSBudW1fZmFjZXMgPCAyMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudW1fZmFjZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMjA7Ci0KLSAgICBSYW5kb20gIGZhY2VzX3Bvb2woIChpbnQpbWF4X2ZhY2VfY250LCAoaW50KW51bV9mYWNlcyApOwotCi0gICAgZm9yICggbG9uZyAgZmFjZV9jbnQgPSAwOwotICAgICAgICAgIGZhY2VfY250IDwgbWF4X2ZhY2VfY250OwotICAgICAgICAgIGZhY2VfY250KysgKQotICAgIHsKLSAgICAgIGxvbmcgIGZhY2VfaW5kZXggPSBmYWNlc19wb29sLmdldCgpIC0gMTsKLQotICAgICAgLy8gZ2V0IG51bWJlciBvZiBpbnN0YW5jZXMKLSAgICAgIGlmICggRlRfTmV3X01lbW9yeV9GYWNlKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzWzBdLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylmaWxlc1swXS5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSggZmFjZV9pbmRleCArIDEgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjZSApICkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBsb25nICBudW1faW5zdGFuY2VzID0gZmFjZS0+c3R5bGVfZmxhZ3MgPj4gMTY7Ci0gICAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsKLQotICAgICAgLy8gbG9vcCBvdmVyIHRoZSBmYWNlIHdpdGhvdXQgaW5zdGFuY2UgKGluZGV4IDApCi0gICAgICAvLyBhbmQgdXAgdG8gMjAgYXJiaXRyYXJpbHkgc2VsZWN0ZWQgaW5zdGFuY2VzCi0gICAgICAvLyBmcm9tIGluZGV4IHJhbmdlIFsxO251bV9pbnN0YW5jZXNdCi0gICAgICBsb25nICBtYXhfaW5zdGFuY2VfY250ID0gbnVtX2luc3RhbmNlcyA8IDIwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bV9pbnN0YW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMjA7Ci0KLSAgICAgIFJhbmRvbSAgaW5zdGFuY2VzX3Bvb2woIChpbnQpbWF4X2luc3RhbmNlX2NudCwgKGludCludW1faW5zdGFuY2VzICk7Ci0KLSAgICAgIGZvciAoIGxvbmcgIGluc3RhbmNlX2NudCA9IDA7Ci0gICAgICAgICAgICBpbnN0YW5jZV9jbnQgPD0gbWF4X2luc3RhbmNlX2NudDsKLSAgICAgICAgICAgIGluc3RhbmNlX2NudCsrICkKLSAgICAgIHsKLSAgICAgICAgbG9uZyAgaW5zdGFuY2VfaW5kZXggPSAwOwotCi0gICAgICAgIGlmICggIWluc3RhbmNlX2NudCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIEZUX05ld19NZW1vcnlfRmFjZSggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNbMF0uZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylmaWxlc1swXS5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlICkgKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdGFuY2VfaW5kZXggPSBpbnN0YW5jZXNfcG9vbC5nZXQoKTsKLQotICAgICAgICAgIGlmICggRlRfTmV3X01lbW9yeV9GYWNlKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1swXS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWZpbGVzWzBdLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBpbnN0YW5jZV9pbmRleCA8PCAxNiApICsgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY2UgKSApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgbW9yZSB0aGFuIGEgc2luZ2xlIGlucHV0IGZpbGUgY29taW5nIGZyb20gYW4gYXJjaGl2ZSwKLSAgICAgICAgLy8gYXR0YWNoIHRoZW0gKHN0YXJ0aW5nIHdpdGggdGhlIHNlY29uZCBmaWxlKSB1c2luZyB0aGUgb3JkZXIgZ2l2ZW4KLSAgICAgICAgLy8gaW4gdGhlIGFyY2hpdmUKLSAgICAgICAgZm9yICggc2l6ZV90ICBmaWxlc19pbmRleCA9IDE7Ci0gICAgICAgICAgICAgIGZpbGVzX2luZGV4IDwgZmlsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICBmaWxlc19pbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX09wZW5fQXJncyAgb3Blbl9hcmdzID0ge307Ci0gICAgICAgICAgb3Blbl9hcmdzLmZsYWdzICAgICAgICAgPSBGVF9PUEVOX01FTU9SWTsKLSAgICAgICAgICBvcGVuX2FyZ3MubWVtb3J5X2Jhc2UgICA9IGZpbGVzW2ZpbGVzX2luZGV4XS5kYXRhKCk7Ci0gICAgICAgICAgb3Blbl9hcmdzLm1lbW9yeV9zaXplICAgPSAoRlRfTG9uZylmaWxlc1tmaWxlc19pbmRleF0uc2l6ZSgpOwotCi0gICAgICAgICAgLy8gdGhlIGxhc3QgYXJjaGl2ZSBlbGVtZW50IHdpbGwgYmUgZXZlbnR1YWxseSB1c2VkIGFzIHRoZQotICAgICAgICAgIC8vIGF0dGFjaG1lbnQKLSAgICAgICAgICBGVF9BdHRhY2hfU3RyZWFtKCBmYWNlLCAmb3Blbl9hcmdzICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29wIG92ZXIgYW4gYXJiaXRyYXJ5IHNpemUgZm9yIG91dGxpbmVzCi0gICAgICAgIC8vIGFuZCB1cCB0byB0ZW4gYXJiaXRyYXJpbHkgc2VsZWN0ZWQgYml0bWFwIHN0cmlrZSBzaXplcwotICAgICAgICAvLyBmcm9tIHRoZSByYW5nZSBbMDtudW1fZml4ZWRfc2l6ZXMgLSAxXQotICAgICAgICBpbnQgIG1heF9zaXplX2NudCA9IGZhY2UtPm51bV9maXhlZF9zaXplcyA8IDEwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhY2UtPm51bV9maXhlZF9zaXplcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxMDsKLQotICAgICAgICBSYW5kb20gc2l6ZXNfcG9vbCggbWF4X3NpemVfY250LCBmYWNlLT5udW1fZml4ZWRfc2l6ZXMgKTsKLQotICAgICAgICBmb3IgKCBpbnQgIHNpemVfY250ID0gMDsKLSAgICAgICAgICAgICAgc2l6ZV9jbnQgPD0gbWF4X3NpemVfY250OwotICAgICAgICAgICAgICBzaXplX2NudCsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0ludDMyICBmbGFncyA9IGxvYWRfZmxhZ3M7Ci0KLSAgICAgICAgICBpbnQgIHNpemVfaW5kZXggPSAwOwotCi0gICAgICAgICAgaWYgKCAhc2l6ZV9jbnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNldCB1cCAyMHB0IGF0IDcyZHBpIGFzIGFuIGFyYml0cmFyeSBzaXplCi0gICAgICAgICAgICBpZiAoIEZUX1NldF9DaGFyX1NpemUoIGZhY2UsIDIwICogNjQsIDIwICogNjQsIDcyLCA3MiApICkKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBmbGFncyB8PSBGVF9MT0FEX05PX0JJVE1BUDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGJpdG1hcCBzdHJpa2VzIGFyZSBub3QgYWN0aXZlIGZvciBmb250IHZhcmlhdGlvbnMKLSAgICAgICAgICAgIGlmICggaW5zdGFuY2VfaW5kZXggKQotICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgc2l6ZV9pbmRleCA9IHNpemVzX3Bvb2wuZ2V0KCkgLSAxOwotCi0gICAgICAgICAgICBpZiAoIEZUX1NlbGVjdF9TaXplKCBmYWNlLCBzaXplX2luZGV4ICkgKQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZsYWdzIHw9IEZUX0xPQURfQ09MT1I7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gdGVzdCBNTSBpbnRlcmZhY2Ugb25seSBmb3IgYSBmYWNlIHdpdGhvdXQgYSBzZWxlY3RlZCBpbnN0YW5jZQotICAgICAgICAgIC8vIGFuZCB3aXRob3V0IGEgc2VsZWN0ZWQgYml0bWFwIHN0cmlrZQotICAgICAgICAgIGlmICggIWluc3RhbmNlX2luZGV4ICYmICFzaXplX2NudCApCi0gICAgICAgICAgICBzZXRJbnRlcm1lZGlhdGVBeGlzKCBmYWNlICk7Ci0KLSAgICAgICAgICAvLyBsb29wIG92ZXIgYWxsIGdseXBocwotICAgICAgICAgIGZvciAoIHVuc2lnbmVkIGludCAgZ2x5cGhfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGdseXBoX2luZGV4IDwgKHVuc2lnbmVkIGludClmYWNlLT5udW1fZ2x5cGhzOwotICAgICAgICAgICAgICAgIGdseXBoX2luZGV4KysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggRlRfTG9hZF9HbHlwaCggZmFjZSwgZ2x5cGhfaW5kZXgsIGZsYWdzICkgKQotICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gUmVuZGVyaW5nIGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSBhbmQgdGhlIGxlYXN0IGludGVyZXN0aW5nIHBhcnQuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gaWYgKCBGVF9SZW5kZXJfR2x5cGgoIGZhY2UtPmdseXBoLCByZW5kZXJfbW9kZSkgKQotICAgICAgICAgICAgLy8gICBjb250aW51ZTsKLSAgICAgICAgICAgIC8vIEZUX0dseXBoU2xvdF9FbWJvbGRlbiggZmFjZS0+Z2x5cGggKTsKLQotI2lmIDAKLSAgICAgICAgICAgIEZUX0dseXBoICBnbHlwaDsKLSAgICAgICAgICAgIGlmICggIUZUX0dldF9HbHlwaCggZmFjZS0+Z2x5cGgsICZnbHlwaCApICkKLSAgICAgICAgICAgICAgRlRfRG9uZV9HbHlwaCggZ2x5cGggKTsKLQotICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSAmZmFjZS0+Z2x5cGgtPm91dGxpbmU7Ci0gICAgICAgICAgICBGVF9NYXRyaXggICAgcm90MzAgICA9IHsgMHhEREI0LCAtMHg4MDAwLCAweDgwMDAsIDB4RERCNCB9OwotCi0gICAgICAgICAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggb3V0bGluZSwgJnJvdDMwICk7Ci0KLSAgICAgICAgICAgIEZUX0JCb3ggIGJib3g7Ci0gICAgICAgICAgICBGVF9PdXRsaW5lX0dldF9CQm94KCBvdXRsaW5lLCAmYmJveCApOwotI2VuZGlmCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotLy8gRU5ECmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZnRmdXp6ZXIvZnRtdXRhdG9yLmNjIGIvc3JjL3Rvb2xzL2Z0ZnV6emVyL2Z0bXV0YXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhYTVhNy4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZnRmdXp6ZXIvZnRtdXRhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8vIGZ0bXV0YXRvci5jYwotLy8KLS8vICAgQSBjdXN0b20gZnV6emVyIG11dGF0b3IgdG8gdGVzdCBmb3IgRnJlZVR5cGUgd2l0aCBsaWJGdXp6ZXIuCi0vLwotLy8gQ29weXJpZ2h0IDIwMTUtMjAxNyBieQotLy8gRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotLy8KLS8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLS8vIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0Ci0vLyBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKLS8vIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotLy8gdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLS8vIFNpbmNlIGB0YXInIGlzIG5vdCBhIHZhbGlkIGZvcm1hdCBmb3IgaW5wdXQgdG8gRnJlZVR5cGUsIHRyZWF0IGFueSBpbnB1dAotLy8gdGhhdCBsb29rcyBsaWtlIGB0YXInIGFzIG11bHRpcGxlIGZpbGVzIGFuZCBtdXRhdGUgdGhlbSBzZXBhcmF0ZWx5LgotLy8KLS8vIEluIHRoZSBmdXR1cmUsIGEgdmFyaWF0aW9uIG9mIHRoaXMgbWF5IGJlIHVzZWQgdG8gZ3VpZGUgbXV0YXRpb24gb24gYQotLy8gbG9naWNhbGx5IGhpZ2hlciBsZXZlbC4KLQotCi0vLyB3ZSB1c2UgYHVuaXF1ZV9wdHInLCBgZGVjbHR5cGUnLCBhbmQgb3RoZXIgZ2ltbWlja3MgZGVmaW5lZCBzaW5jZSBDKysxMQotI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAotIyAgZXJyb3IgImEgQysrMTEgY29tcGlsZXIgaXMgbmVlZGVkIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGFyY2hpdmUuaD4KLSNpbmNsdWRlIDxhcmNoaXZlX2VudHJ5Lmg+Ci0KLSNpbmNsdWRlICJGdXp6ZXJJbnRlcmZhY2UuaCIKLQotCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBkZWZpbmVkIGJ5IGBmdGZ1enplci5jYycuCi0gIGV4dGVybiAiQyIgaW50Ci0gIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoIGNvbnN0IHVpbnQ4X3QqICBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgU2l6ZSApOwotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2hlY2tfcmVzdWx0KCBzdHJ1Y3QgYXJjaGl2ZSogIGEsCi0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICByICkKLSAgewotICAgIGlmICggciA9PSBBUkNISVZFX09LICkKLSAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IGNoYXIqICBtID0gYXJjaGl2ZV9lcnJvcl9zdHJpbmcoIGEgKTsKLSAgICB3cml0ZSggMSwgbSwgc3RybGVuKCBtICkgKTsKLSAgICBleGl0KCAxICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgYXJjaGl2ZV9yZWFkX2VudHJ5X2RhdGEoIHN0cnVjdCBhcmNoaXZlICAgKmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+ICAqdncgKQotICB7Ci0gICAgaW50ICAgICAgICAgICAgIHI7Ci0gICAgY29uc3QgdWludDhfdCogIGJ1ZmY7Ci0gICAgc2l6ZV90ICAgICAgICAgIHNpemU7Ci0gICAgaW50NjRfdCAgICAgICAgIG9mZnNldDsKLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgciA9IGFyY2hpdmVfcmVhZF9kYXRhX2Jsb2NrKCBhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKio+KCAmYnVmZiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCApOwotICAgICAgaWYgKCByID09IEFSQ0hJVkVfRU9GICkKLSAgICAgICAgcmV0dXJuIEFSQ0hJVkVfT0s7Ci0gICAgICBpZiAoIHIgIT0gQVJDSElWRV9PSyApCi0gICAgICAgIHJldHVybiByOwotCi0gICAgICB2dy0+aW5zZXJ0KCB2dy0+ZW5kKCksIGJ1ZmYsIGJ1ZmYgKyBzaXplICk7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdmVjdG9yPHZlY3Rvcjx1aW50OF90Pj4KLSAgcGFyc2VfZGF0YSggY29uc3QgdWludDhfdCogIGRhdGEsCi0gICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplICkKLSAgewotICAgIHN0cnVjdCBhcmNoaXZlX2VudHJ5KiAgICBlbnRyeTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcjsKLSAgICB2ZWN0b3I8dmVjdG9yPHVpbnQ4X3Q+PiAgZmlsZXM7Ci0KLSAgICB1bmlxdWVfcHRyPHN0cnVjdCAgYXJjaGl2ZSwKLSAgICAgICAgICAgICAgIGRlY2x0eXBlICggYXJjaGl2ZV9yZWFkX2ZyZWUgKSo+ICBhKCBhcmNoaXZlX3JlYWRfbmV3KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9yZWFkX2ZyZWUgKTsKLQotICAgIC8vIGFjdGl2YXRlIHJlYWRpbmcgb2YgdW5jb21wcmVzc2VkIHRhciBhcmNoaXZlcwotICAgIGFyY2hpdmVfcmVhZF9zdXBwb3J0X2Zvcm1hdF90YXIoIGEuZ2V0KCkgKTsKLQotICAgIC8vIHRoZSBuZWVkIGZvciBgY29uc3RfY2FzdCcgd2FzIHJlbW92ZWQgd2l0aCBsaWJhcmNoaXZlIGNvbW1pdCBiZTRkNGRkCi0gICAgaWYgKCAhKCByID0gYXJjaGl2ZV9yZWFkX29wZW5fbWVtb3J5KAotICAgICAgICAgICAgICAgICAgYS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPiggZGF0YSApICksCi0gICAgICAgICAgICAgICAgICBzaXplICkgKSApCi0gICAgewotICAgICAgdW5pcXVlX3B0cjxzdHJ1Y3QgIGFyY2hpdmUsCi0gICAgICAgICAgICAgICAgIGRlY2x0eXBlICggYXJjaGl2ZV9yZWFkX2Nsb3NlICkqPiAgYV9vcGVuKCBhLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9yZWFkX2Nsb3NlICk7Ci0KLSAgICAgIC8vIHJlYWQgZmlsZXMgY29udGFpbmVkIGluIGFyY2hpdmUKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIHIgPSBhcmNoaXZlX3JlYWRfbmV4dF9oZWFkZXIoIGFfb3Blbi5nZXQoKSwgJmVudHJ5ICk7Ci0gICAgICAgIGlmICggciA9PSBBUkNISVZFX0VPRiApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICggciAhPSBBUkNISVZFX09LICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICB2ZWN0b3I8dWludDhfdD4gIGVudHJ5X2RhdGE7Ci0gICAgICAgIHIgPSBhcmNoaXZlX3JlYWRfZW50cnlfZGF0YSggYS5nZXQoKSwgJmVudHJ5X2RhdGEgKTsKLSAgICAgICAgaWYgKCBlbnRyeV9kYXRhLnNpemUoKSA9PSAwICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmaWxlcy5wdXNoX2JhY2soIG1vdmUoIGVudHJ5X2RhdGEgKSApOwotICAgICAgICBpZiAoIHIgIT0gQVJDSElWRV9PSyApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpbGVzOwotICB9Ci0KLQotICBjbGFzcyBGVEZ1enplcgotICA6IHB1YmxpYyBmdXp6ZXI6OlVzZXJTdXBwbGllZEZ1enplcgotICB7Ci0KLSAgcHVibGljOgotICAgIEZURnV6emVyKCBmdXp6ZXI6OkZ1enplclJhbmRvbUJhc2UqICBSYW5kICkKLSAgICA6IGZ1enplcjo6VXNlclN1cHBsaWVkRnV6emVyKCBSYW5kICkge30KLQotCi0gICAgaW50Ci0gICAgVGFyZ2V0RnVuY3Rpb24oIGNvbnN0IHVpbnQ4X3QqICBEYXRhLAotICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgU2l6ZSApCi0gICAgewotICAgICAgcmV0dXJuIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoIERhdGEsIFNpemUgKTsKLSAgICB9Ci0KLQotICAgIC8vIEN1c3RvbSBtdXRhdG9yLgotICAgIHZpcnR1YWwgc2l6ZV90Ci0gICAgTXV0YXRlKCB1aW50OF90KiAgRGF0YSwKLSAgICAgICAgICAgIHNpemVfdCAgICBTaXplLAotICAgICAgICAgICAgc2l6ZV90ICAgIE1heFNpemUgKQotICAgIHsKLSAgICAgIHZlY3Rvcjx2ZWN0b3I8dWludDhfdD4+ICBmaWxlcyA9IHBhcnNlX2RhdGEoIERhdGEsIFNpemUgKTsKLQotICAgICAgLy8gSWYgdGhlIGZpbGUgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgdGFyIGZpbGUsIHRyZWF0IGl0IGFzIG5vbi10YXIuCi0gICAgICBpZiAoIGZpbGVzLnNpemUoKSA9PSAwICkKLSAgICAgICAgcmV0dXJuIGZ1enplcjo6VXNlclN1cHBsaWVkRnV6emVyOjpNdXRhdGUoIERhdGEsIFNpemUsIE1heFNpemUgKTsKLQotICAgICAgLy8gVGhpcyBpcyBzb21ld2hhdCBgd2hpdGUgYm94JyBvbiB0YXIuICBUaGUgdGFyIGZvcm1hdCB1c2VzIDUxMiBieXRlCi0gICAgICAvLyBibG9ja3MuICBPbmUgYmxvY2sgYXMgaGVhZGVyIGZvciBlYWNoIGZpbGUsIHR3byBlbXB0eSBibG9ja3Mgb2YgMCdzCi0gICAgICAvLyBhdCB0aGUgZW5kLiAgRmlsZSBkYXRhIGlzIHBhZGRlZCB0byBmaWxsIGl0cyBsYXN0IGJsb2NrLgotICAgICAgc2l6ZV90ICB1c2VkX2Jsb2NrcyA9IGZpbGVzLnNpemUoKSArIDI7Ci0gICAgICBmb3IgKCBjb25zdCBhdXRvJiAgZmlsZSA6IGZpbGVzICkKLSAgICAgICAgdXNlZF9ibG9ja3MgKz0gKCBmaWxlLnNpemUoKSArIDUxMSApIC8gNTEyOwotCi0gICAgICBzaXplX3QgIG1heF9ibG9ja3MgPSBNYXhTaXplIC8gNTEyOwotCi0gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgYmlnLCBpdCB3aWxsIG5lZWQgdG8gYmUgZG93bnNpemVkLiAgSWYgdGhlIG9yaWdpbmFsCi0gICAgICAvLyB0YXIgZmlsZSB3YXMgdG9vIGJpZywgaXQgbWF5IGhhdmUgYmVlbiBjbGlwcGVkIHRvIGZpdC4gIEluIHRoaXMKLSAgICAgIC8vIGNhc2UgaXQgbWF5IG5vdCBiZSBwb3NzaWJsZSB0byBwcm9wZXJseSB3cml0ZSBvdXQgdGhlIGRhdGEsIGFzCi0gICAgICAvLyB0aGVyZSBtYXkgbm90IGJlIGVub3VnaCBzcGFjZSBmb3IgdGhlIHRyYWlsaW5nIHR3byBibG9ja3MuICBTdGFydAotICAgICAgLy8gZHJvcHBpbmcgZmlsZSBkYXRhIG9yIGZpbGVzIGZyb20gdGhlIGVuZC4KLSAgICAgIGZvciAoIHNpemVfdCAgaSA9IGZpbGVzLnNpemUoKTsKLSAgICAgICAgICAgIGktLSA+IDEgJiYgdXNlZF9ibG9ja3MgPiBtYXhfYmxvY2tzOyApCi0gICAgICB7Ci0gICAgICAgIHNpemVfdCAgYmxvY2tzX3RvX2ZyZWUgPSB1c2VkX2Jsb2NrcyAtIG1heF9ibG9ja3M7Ci0gICAgICAgIHNpemVfdCAgYmxvY2tzX2N1cnJlbnRseV91c2VkX2J5X2ZpbGVfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAoIGZpbGVzW2ldLnNpemUoKSArIDUxMSApIC8gNTEyOwotCi0gICAgICAgIGlmICggYmxvY2tzX2N1cnJlbnRseV91c2VkX2J5X2ZpbGVfZGF0YSA+PSBibG9ja3NfdG9fZnJlZSApCi0gICAgICAgIHsKLSAgICAgICAgICBmaWxlc1tpXS5yZXNpemUoICggYmxvY2tzX2N1cnJlbnRseV91c2VkX2J5X2ZpbGVfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzX3RvX2ZyZWUgKSAqIDUxMiApOwotICAgICAgICAgIHVzZWRfYmxvY2tzIC09IGJsb2Nrc190b19mcmVlOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlsZXMucG9wX2JhY2soKTsKLSAgICAgICAgdXNlZF9ibG9ja3MgLT0gYmxvY2tzX2N1cnJlbnRseV91c2VkX2J5X2ZpbGVfZGF0YSArIDE7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHdlIGdldCBkb3duIHRvIG9uZSBmaWxlLCBkb24ndCB1c2UgdGFyLgotICAgICAgaWYgKCBmaWxlcy5zaXplKCkgPT0gMSApCi0gICAgICB7Ci0gICAgICAgIG1lbWNweSggRGF0YSwgZmlsZXNbMF0uZGF0YSgpLCBmaWxlc1swXS5zaXplKCkgKTsKLSAgICAgICAgcmV0dXJuIGZ1enplcjo6VXNlclN1cHBsaWVkRnV6emVyOjpNdXRhdGUoIERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1swXS5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhTaXplICk7Ci0gICAgICB9Ci0KLSAgICAgIHNpemVfdCAgZnJlZV9ibG9ja3MgPSBtYXhfYmxvY2tzIC0gdXNlZF9ibG9ja3M7Ci0KLSAgICAgIC8vIEFsbG93IGVhY2ggZmlsZSB0byB1c2UgdXAgYXMgbXVjaCBvZiB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBzcGFjZQotICAgICAgLy8gaXQgY2FuLiAgSWYgaXQgdXNlcyBvciBnaXZlcyB1cCBibG9ja3MsIGFkZCB0aGVtIG9yIHJlbW92ZSB0aGVtCi0gICAgICAvLyBmcm9tIHRoZSBwb29sLgotICAgICAgZm9yICggYXV0byYmICBmaWxlIDogZmlsZXMgKQotICAgICAgewotICAgICAgICBzaXplX3QgIGJsb2Nrc19jdXJyZW50bHlfdXNlZF9ieV9maWxlID0gKCBmaWxlLnNpemUoKSArIDUxMSApIC8gNTEyOwotICAgICAgICBzaXplX3QgIGJsb2Nrc19hdmFpbGFibGUgPSBibG9ja3NfY3VycmVudGx5X3VzZWRfYnlfZmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9ibG9ja3M7Ci0gICAgICAgIHNpemVfdCAgbWF4X3NpemUgPSBibG9ja3NfYXZhaWxhYmxlICogNTEyOwotICAgICAgICBzaXplX3QgIGRhdGFfc2l6ZSA9IGZpbGUuc2l6ZSgpOwotCi0gICAgICAgIGZpbGUucmVzaXplKCBtYXhfc2l6ZSApOwotICAgICAgICBmaWxlLnJlc2l6ZSggZnV6emVyOjpVc2VyU3VwcGxpZWRGdXp6ZXI6Ok11dGF0ZSggZmlsZS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZSApICk7Ci0KLSAgICAgICAgc2l6ZV90ICBibG9ja3Nfbm93X3VzZWRfYnlfZmlsZSA9ICggZmlsZS5zaXplKCkgKyA1MTEgKSAvIDUxMjsKLSAgICAgICAgZnJlZV9ibG9ja3MgPSBmcmVlX2Jsb2NrcyArCi0gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NfY3VycmVudGx5X3VzZWRfYnlfZmlsZSAtCi0gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Nfbm93X3VzZWRfYnlfZmlsZTsKLSAgICAgIH0KLQotICAgICAgdW5pcXVlX3B0cjxzdHJ1Y3QgIGFyY2hpdmUsCi0gICAgICAgICAgICAgICAgIGRlY2x0eXBlICggYXJjaGl2ZV93cml0ZV9mcmVlICkqPiAgYSggYXJjaGl2ZV93cml0ZV9uZXcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3dyaXRlX2ZyZWUgKTsKLQotICAgICAgY2hlY2tfcmVzdWx0KCBhLmdldCgpLCBhcmNoaXZlX3dyaXRlX2FkZF9maWx0ZXJfbm9uZSggYS5nZXQoKSApICk7Ci0gICAgICBjaGVja19yZXN1bHQoIGEuZ2V0KCksIGFyY2hpdmVfd3JpdGVfc2V0X2Zvcm1hdF91c3RhciggYS5nZXQoKSApICk7Ci0KLSAgICAgIC8vIGB1c2VkJyBtYXkgbm90IGJlIGNvcnJlY3QgdW50aWwgYWZ0ZXIgdGhlIGFyY2hpdmUgaXMgY2xvc2VkLgotICAgICAgc2l6ZV90ICB1c2VkID0gMHhiYWRiZWVmOwotICAgICAgY2hlY2tfcmVzdWx0KCBhLmdldCgpLCBhcmNoaXZlX3dyaXRlX29wZW5fbWVtb3J5KCBhLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZCApICk7Ci0KLSAgICAgIHsKLSAgICAgICAgdW5pcXVlX3B0cjxzdHJ1Y3QgIGFyY2hpdmUsCi0gICAgICAgICAgICAgICAgICAgZGVjbHR5cGUgKCBhcmNoaXZlX3dyaXRlX2Nsb3NlICkqPiAgYV9vcGVuKCBhLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV93cml0ZV9jbG9zZSApOwotCi0gICAgICAgIGludCAgZmlsZV9pbmRleCA9IDA7Ci0gICAgICAgIGZvciAoIGNvbnN0IGF1dG8mICBmaWxlIDogZmlsZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgdW5pcXVlX3B0cjxzdHJ1Y3QgIGFyY2hpdmVfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZSAoIGFyY2hpdmVfZW50cnlfZnJlZSApKj4KLSAgICAgICAgICAgIGUoIGFyY2hpdmVfZW50cnlfbmV3MiggYV9vcGVuLmdldCgpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfZW50cnlfZnJlZSApOwotCi0gICAgICAgICAgY2hhciAgbmFtZV9idWZmZXJbMTAwXTsKLSAgICAgICAgICBzbnByaW50ZiggbmFtZV9idWZmZXIsIDEwMCwgImZpbGUlZCIsIGZpbGVfaW5kZXgrKyApOwotCi0gICAgICAgICAgYXJjaGl2ZV9lbnRyeV9zZXRfcGF0aG5hbWUoIGUuZ2V0KCksIG5hbWVfYnVmZmVyICk7Ci0gICAgICAgICAgYXJjaGl2ZV9lbnRyeV9zZXRfc2l6ZSggZS5nZXQoKSwgZmlsZS5zaXplKCkgKTsKLSAgICAgICAgICBhcmNoaXZlX2VudHJ5X3NldF9maWxldHlwZSggZS5nZXQoKSwgQUVfSUZSRUcgKTsKLSAgICAgICAgICBhcmNoaXZlX2VudHJ5X3NldF9wZXJtKCBlLmdldCgpLCAwNjQ0ICk7Ci0KLSAgICAgICAgICBjaGVja19yZXN1bHQoIGFfb3Blbi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfd3JpdGVfaGVhZGVyKCBhX29wZW4uZ2V0KCksIGUuZ2V0KCkgKSApOwotICAgICAgICAgIGFyY2hpdmVfd3JpdGVfZGF0YSggYV9vcGVuLmdldCgpLCBmaWxlLmRhdGEoKSwgZmlsZS5zaXplKCkgKTsKLSAgICAgICAgICBjaGVja19yZXN1bHQoIGFfb3Blbi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfd3JpdGVfZmluaXNoX2VudHJ5KCBhX29wZW4uZ2V0KCkgKSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB1c2VkOwotICAgIH0KLQotCi0gICAgLy8gQ3Jvc3MgYERhdGExJyBhbmQgYERhdGEyJywgd3JpdGUgdXAgdG8gYE1heE91dFNpemUnIGJ5dGVzIGludG8gYE91dCcsCi0gICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgd2hpY2ggc2hvdWxkIGJlIHBvc2l0aXZlLgotICAgIHZpcnR1YWwgc2l6ZV90Ci0gICAgQ3Jvc3NPdmVyKCBjb25zdCB1aW50OF90KiAgRGF0YTEsCi0gICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgU2l6ZTEsCi0gICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiAgRGF0YTIsCi0gICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgU2l6ZTIsCi0gICAgICAgICAgICAgICB1aW50OF90KiAgICAgICAgT3V0LAotICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIE1heE91dFNpemUgKQotICAgIHsKLSAgICAgIHJldHVybiBmdXp6ZXI6OlVzZXJTdXBwbGllZEZ1enplcjo6Q3Jvc3NPdmVyKCBEYXRhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4T3V0U2l6ZSApOwotICAgIH0KLQotICB9OyAvLyBlbmQgb2YgRlRGdXp6ZXIgY2xhc3MKLQotCi0gIGludAotICBtYWluKCBpbnQgICAgIGFyZ2MsCi0gICAgICAgIGNoYXIqICAqYXJndiApCi0gIHsKLSAgICBmdXp6ZXI6OkZ1enplclJhbmRvbUxpYmMgIFJhbmQoIDAgKTsKLSAgICBGVEZ1enplciAgICAgICAgICAgICAgICAgIEYoICZSYW5kICk7Ci0KLSAgICBmdXp6ZXI6OkZ1enplckRyaXZlciggYXJnYywgYXJndiwgRiApOwotICB9Ci0KLQotLy8gRU5ECmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZnRmdXp6ZXIvcmFzdGVyZnV6emVyLmNjIGIvc3JjL3Rvb2xzL2Z0ZnV6emVyL3Jhc3RlcmZ1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5YjFhNS4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZnRmdXp6ZXIvcmFzdGVyZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vIHJhc3RlcmZ1enplci5jYwotLy8KLS8vICAgQSBmdXp6aW5nIGZ1bmN0aW9uIHRvIHRlc3QgRnJlZVR5cGUncyByYXN0ZXJpemVycyB3aXRoIGxpYkZ1enplci4KLS8vCi0vLyBDb3B5cmlnaHQgMjAxNi0yMDE3IGJ5Ci0vLyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0vLwotLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAotLy8gbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKLS8vIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQotLy8gdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCi0vLyB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0KLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU1BR0VfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0KLQotICBzdGF0aWMgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgc3RhdGljIGludCAgICAgICAgIEluaXRSZXN1bHQ7Ci0KLQotICBzdHJ1Y3QgRlRfR2xvYmFsIHsKLSAgICBGVF9HbG9iYWwoKSB7Ci0gICAgICBJbml0UmVzdWx0ID0gRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKLSAgICB9Ci0gICAgfkZUX0dsb2JhbCgpIHsKLSAgICAgIEZUX0RvbmVfRnJlZVR5cGUoIGxpYnJhcnkgKTsKLSAgICB9Ci0gIH07Ci0KLSAgRlRfR2xvYmFsICBnbG9iYWxfZnQ7Ci0KLQotICBleHRlcm4gIkMiIGludAotICBMTFZNRnV6emVyVGVzdE9uZUlucHV0KCBjb25zdCB1aW50OF90KiAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemVfICkKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgIHBpeGVsc1s0XTsKLQotICAgIEZUX0JpdG1hcCAgYml0bWFwX21vbm8gPSB7Ci0gICAgICAxLCAgICAgICAgICAgICAgICAgIC8vIHJvd3MKLSAgICAgIDEsICAgICAgICAgICAgICAgICAgLy8gd2lkdGgKLSAgICAgIDQsICAgICAgICAgICAgICAgICAgLy8gcGl0Y2gKLSAgICAgIHBpeGVscywgICAgICAgICAgICAgLy8gYnVmZmVyCi0gICAgICAyLCAgICAgICAgICAgICAgICAgIC8vIG51bV9ncmF5cwotICAgICAgRlRfUElYRUxfTU9ERV9NT05PLCAvLyBwaXhlbF9tb2RlCi0gICAgICAwLCAgICAgICAgICAgICAgICAgIC8vIHBhbGV0dGVfbW9kZQotICAgICAgTlVMTCAgICAgICAgICAgICAgICAvLyBwYWxldHRlCi0gICAgfTsKLQotICAgIEZUX0JpdG1hcCAgYml0bWFwX2dyYXkgPSB7Ci0gICAgICAxLCAgICAgICAgICAgICAgICAgIC8vIHJvd3MKLSAgICAgIDEsICAgICAgICAgICAgICAgICAgLy8gd2lkdGgKLSAgICAgIDQsICAgICAgICAgICAgICAgICAgLy8gcGl0Y2gKLSAgICAgIHBpeGVscywgICAgICAgICAgICAgLy8gYnVmZmVyCi0gICAgICAyNTYsICAgICAgICAgICAgICAgIC8vIG51bV9ncmF5cwotICAgICAgRlRfUElYRUxfTU9ERV9HUkFZLCAvLyBwaXhlbF9tb2RlCi0gICAgICAwLCAgICAgICAgICAgICAgICAgIC8vIHBhbGV0dGVfbW9kZQotICAgICAgTlVMTCAgICAgICAgICAgICAgICAvLyBwYWxldHRlCi0gICAgfTsKLQotICAgIGNvbnN0IHNpemVfdCB2c2l6ZSA9IHNpemVvZiAoIEZUX1ZlY3RvciApOwotICAgIGNvbnN0IHNpemVfdCB0c2l6ZSA9IHNpemVvZiAoIGNoYXIgKTsKLQotICAgIC8vIHdlIHVzZSB0aGUgaW5wdXQgZGF0YSBmb3IgYm90aCBwb2ludHMgYW5kIHRhZ3MKLSAgICBzaG9ydCAgbl9wb2ludHMgPSBzaG9ydCggc2l6ZV8gLyAoIHZzaXplICsgdHNpemUgKSApOwotICAgIGlmICggbl9wb2ludHMgPD0gMiApCi0gICAgICByZXR1cm4gMDsKLQotICAgIEZUX1ZlY3RvciogIHBvaW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8RlRfVmVjdG9yKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSApICk7Ci0gICAgY2hhciogICAgICAgdGFncyAgID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIHNpemVfdCggbl9wb2ludHMgKSAqIHZzaXplICkgKTsKLQotICAgIC8vIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGludmFsaWQgb3V0bGluZXMgdGhhdCBhcmUgaW1tZWRpYXRlbHkKLSAgICAvLyByZWplY3RlZCBpbiBgRlRfT3V0bGluZV9SZW5kZXInLCBsaW1pdCB2YWx1ZXMgdG8gMl4xOCBwaXhlbHMKLSAgICAvLyAoaS5lLiwgMl4yNCBiaXRzKQotICAgIGZvciAoIHNob3J0ICBpID0gMDsgaSA8IG5fcG9pbnRzOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggcG9pbnRzW2ldLnggPT0gTE9OR19NSU4gKQotICAgICAgICBwb2ludHNbaV0ueCA9IDA7Ci0gICAgICBlbHNlIGlmICggcG9pbnRzW2ldLnggPCAwICkKLSAgICAgICAgcG9pbnRzW2ldLnggPSAtKCAtcG9pbnRzW2ldLnggJiAweEZGRkZGRiApIC0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcG9pbnRzW2ldLnggPSAoIHBvaW50c1tpXS54ICYgMHhGRkZGRkYgKSArIDE7Ci0KLSAgICAgIGlmICggcG9pbnRzW2ldLnkgPT0gTE9OR19NSU4gKQotICAgICAgICBwb2ludHNbaV0ueSA9IDA7Ci0gICAgICBlbHNlIGlmICggcG9pbnRzW2ldLnkgPCAwICkKLSAgICAgICAgcG9pbnRzW2ldLnkgPSAtKCAtcG9pbnRzW2ldLnkgJiAweEZGRkZGRiApIC0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcG9pbnRzW2ldLnkgPSAoIHBvaW50c1tpXS55ICYgMHhGRkZGRkYgKSArIDE7Ci0gICAgfQotCi0gICAgc2hvcnQgIGNvbnRvdXJzWzFdOwotICAgIGNvbnRvdXJzWzBdID0gbl9wb2ludHMgLSAxOwotCi0gICAgRlRfT3V0bGluZSAgb3V0bGluZSA9Ci0gICAgewotICAgICAgMSwgICAgICAgICAgICAgICAvLyBuX2NvbnRvdXJzCi0gICAgICBuX3BvaW50cywgICAgICAgIC8vIG5fcG9pbnRzCi0gICAgICBwb2ludHMsICAgICAgICAgIC8vIHBvaW50cwotICAgICAgdGFncywgICAgICAgICAgICAvLyB0YWdzCi0gICAgICBjb250b3VycywgICAgICAgIC8vIGNvbnRvdXJzCi0gICAgICBGVF9PVVRMSU5FX05PTkUgIC8vIGZsYWdzCi0gICAgfTsKLQotICAgIEZUX091dGxpbmVfR2V0X0JpdG1hcCggbGlicmFyeSwgJm91dGxpbmUsICZiaXRtYXBfbW9ubyApOwotICAgIEZUX091dGxpbmVfR2V0X0JpdG1hcCggbGlicmFyeSwgJm91dGxpbmUsICZiaXRtYXBfZ3JheSApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0vLyBFTkQKZGlmZiAtLWdpdCBhL3NyYy90b29scy9mdGZ1enplci9ydW5pbnB1dC5jYyBiL3NyYy90b29scy9mdGZ1enplci9ydW5pbnB1dC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyNjEyMC4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZnRmdXp6ZXIvcnVuaW5wdXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBydW5pbnB1dC5jYwotLy8KLS8vICAgQSBgbWFpbicgZnVuY3Rpb24gZm9yIGZ1enplcnMgbGlrZSBgZnRmdXp6ZXIuY2MnLgotLy8KLS8vIENvcHlyaWdodCAyMDE1LTIwMTcgYnkKLS8vIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLS8vCi0vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCi0vLyBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotLy8gbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0vLyB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLS8vIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotCi0gIGV4dGVybiAiQyIgdm9pZAotICBMTFZNRnV6emVyVGVzdE9uZUlucHV0KCBjb25zdCB1aW50OF90KiAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUgKTsKLQotCi0gIHVuc2lnbmVkIGNoYXIgYVsxIDw8IDI0XTsKLQotCi0gIGludAotICBtYWluKCBpbnQgICAgIGFyZ2MsCi0gICAgICAgIGNoYXIqICAqYXJndiApCi0gIHsKLSAgICBhc3NlcnQoIGFyZ2MgPj0gMiApOwotCi0gICAgZm9yICggaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrICkKLSAgICB7Ci0gICAgICBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgYXJndltpXSApOwotCi0gICAgICBGSUxFKiAgZiA9IGZvcGVuKCBhcmd2W2ldLCAiciIgKTsKLSAgICAgIGFzc2VydCggZiApOwotCi0gICAgICBzaXplX3QgIG4gPSBmcmVhZCggYSwgMSwgc2l6ZW9mICggYSApLCBmICk7Ci0gICAgICBmY2xvc2UoIGYgKTsKLSAgICAgIGlmICggIW4gKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgdW5zaWduZWQgY2hhciogIGIgPSAodW5zaWduZWQgY2hhciopbWFsbG9jKCBuICk7Ci0gICAgICBtZW1jcHkoIGIsIGEsIG4gKTsKLQotICAgICAgTExWTUZ1enplclRlc3RPbmVJbnB1dCggYiwgbiApOwotCi0gICAgICBmcmVlKCBiICk7Ci0gICAgfQotICB9Ci0KLQotLy8gRU5ECmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZnRyYW5kb20vTWFrZWZpbGUgYi9zcmMvdG9vbHMvZnRyYW5kb20vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZGM0OWMuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL2Z0cmFuZG9tL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBUT1BfRElSIGFuZCBPQkpfRElSIHNob3VsZCBiZSBzZXQgYnkgdGhlIHVzZXIgdG8gdGhlIHJpZ2h0IGRpcmVjdG9yaWVzLAotIyBpZiBuZWNlc3NhcnkuCi0KLVRPUF9ESVIgPz0gLi4vLi4vLi4KLU9CSl9ESVIgPz0gJChUT1BfRElSKS9vYmpzCi0KLQotIyBUaGUgc2V0dXAgYmVsb3cgaXMgZm9yIGdjYyBvbiBhIFVuaXgtbGlrZSBwbGF0Zm9ybSwKLSMgd2hlcmUgRnJlZVR5cGUgaGFzIGJlZW4gc2V0IHVwIHRvIGNyZWF0ZSBhIHN0YXRpYyBsaWJyYXJ5Ci0jICh3aGljaCBpcyB0aGUgZGVmYXVsdCkuCi0KLVZQQVRIID0gJChPQkpfRElSKSBcCi0gICAgICAgICQoT0JKX0RJUikvLmxpYnMKLQotU1JDX0RJUiA9ICQoVE9QX0RJUikvc3JjL3Rvb2xzL2Z0cmFuZG9tCi0KLUNDID0gZ2NjCi1XRkxBR1MgPSAtV21pc3NpbmctcHJvdG90eXBlcyBcCi0gICAgICAgICAtV3VudXNlZCBcCi0gICAgICAgICAtV2ltcGxpY2l0IFwKLSAgICAgICAgIC1XcmV0dXJuLXR5cGUgXAotICAgICAgICAgLVdwYXJlbnRoZXNlcyBcCi0gICAgICAgICAtcGVkYW50aWMgXAotICAgICAgICAgLVdmb3JtYXQgXAotICAgICAgICAgLVdjaGFyLXN1YnNjcmlwdHMgXAotICAgICAgICAgLVdzZXF1ZW5jZS1wb2ludAotQ0ZMQUdTID0gJChXRkxBR1MpIFwKLSAgICAgICAgIC1nCi1JTkNMVURFUyA9IC1JICQoVE9QX0RJUikvaW5jbHVkZQotTERGTEFHUyA9Ci1MSUJTID0gLWxtIFwKLSAgICAgICAtbHogXAotICAgICAgIC1scG5nIFwKLSAgICAgICAtbGJ6MiBcCi0gICAgICAgLWxoYXJmYnV6egotCi1hbGw6ICQoT0JKX0RJUikvZnRyYW5kb20KLQotJChPQkpfRElSKS9mdHJhbmRvbS5vOiAkKFNSQ19ESVIpL2Z0cmFuZG9tLmMKLQkkKENDKSAkKENGTEFHUykgJChJTkNMVURFUykgLWMgLW8gJEAgJDwKLQotJChPQkpfRElSKS9mdHJhbmRvbTogJChPQkpfRElSKS9mdHJhbmRvbS5vIGxpYmZyZWV0eXBlLmEKLQkkKENDKSAkKExERkxBR1MpIC1vICRAICReICQoTElCUykKLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy90b29scy9mdHJhbmRvbS9SRUFETUUgYi9zcmMvdG9vbHMvZnRyYW5kb20vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzYxMDg2Li4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9mdHJhbmRvbS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1mdHJhbmRvbQotPT09PT09PT0KLQotVGhpcyBwcm9ncmFtIGV4cGVjdHMgYSBzZXQgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBnb29kIGZvbnRzLCBhbmQgYSBzZXQKLW9mIGV4dGVuc2lvbnMgb2YgZm9udHMgdG8gYmUgdGVzdGVkLiAgSXQgd2lsbCByYW5kb21seSBwaWNrIGEgZm9udCwgY29weSBpdCwKLWludHJvZHVjZSBhbiBlcnJvciBhbmQgdGhlbiB0ZXN0IGl0LgotCi1UaGUgRnJlZVR5cGUgdGVzdHMgYXJlIHF1aXRlIGJhc2ljOyBmb3IgZWFjaCBlcnJvbmVvdXMgZm9udCBmdHJhbmRvbQotCi0gIC4gZm9ya3Mgb2ZmIGEgbmV3IHRlc3RlciwKLSAgLiBpbml0aWFsaXplcyB0aGUgbGlicmFyeSwKLSAgLiBvcGVucyBlYWNoIGZvbnQgaW4gdGhlIGZpbGUsCi0gIC4gbG9hZHMgZWFjaCBnbHlwaCwKLSAgLiBvcHRpb25hbGx5IHJldmlld3MgdGhlIGNvbnRvdXJzIG9mIHRoZSBnbHlwaCwKLSAgLiBvcHRpb25hbGx5IHJhc3Rlcml6ZXMgdGhlIGdseXBoLCBhbmQKLSAgLiBjbG9zZXMgdGhlIGZhY2UuCi0KLUlmIGEgdGVzdGVyIHRha2VzIGxvbmdlciB0aGFuIDIwIHNlY29uZHMsIGZ0cmFuZG9tIHNhdmVzIHRoZSBlcnJvbmVvdXMgZm9udAotYW5kIGNvbnRpbnVlcy4gIElmIHRoZSB0ZXN0ZXIgZXhpdHMgbm9ybWFsbHkgb3Igd2l0aCBhbiBlcnJvciwgdGhlbiB0aGUKLXN1cGVyc3RydWN0dXJlIHJlbW92ZXMgdGhlIHRlc3QgZm9udCBhbmQgY29udGludWVzLgotCi0KLUNvbW1hbmQgbGluZSBvcHRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC0tYWxsICAgICAgICAgICAgICAgICAgICBUZXN0IGV2ZXJ5IGZvbnQgaW4gdGhlIGRpcmVjdG9yeShpZXMpIG5vIG1hdHRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCBpdHMgZXh0ZW5zaW9uLgotICAtLWNoZWNrLW91dGxpbmVzICAgICAgICAgQ2FsbCBgRlRfT3V0bGluZV9EZWNvbXBvc2UnIG9uIGVhY2ggZ2x5cGguCi0gIC0tZGlyIDxkaXI+ICAgICAgICAgICAgICBBcHBlbmQgPGRpcj4gdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZ29vZCBmb250cy4gIE5vIHJlY3Vyc2l2ZSBzZWFyY2guCi0gIC0tZXJyb3ItY291bnQgPGNudD4gICAgICBJbnRyb2R1Y2UgPGNudD4gc2luZ2xlLWJ5dGUgZXJyb3JzIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvbmVvdXMgZm9udHMgKGRlZmF1bHQ6IDEpLgotICAtLWVycm9yLWZyYWN0aW9uIDxmcmFjPiAgTXVsdGlwbHkgdGhlIGZpbGUgc2l6ZSBvZiB0aGUgZm9udCBieSA8ZnJhYz4gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyb2R1Y2UgdGhhdCBtYW55IGVycm9ycyBpbnRvIHRoZSBlcnJvbmVvdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZS4gIDxmcmFjPiBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIFswOzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogMC4wKS4KLSAgLS1leHQgPGV4dD4gICAgICAgICAgICAgIEFkZCA8ZXh0PiB0byB0aGUgc2V0IG9mIGZvbnQgdHlwZXMgdGVzdGVkLgotICAtLWhlbHAgICAgICAgICAgICAgICAgICAgUHJpbnQgb3V0IHRoaXMgbGlzdCBvZiBvcHRpb25zLgotICAtLW5vaGludHMgICAgICAgICAgICAgICAgU3BlY2lmeSBGVF9MT0FEX05PX0hJTlRJTkcgd2hlbiBsb2FkaW5nIGdseXBocy4KLSAgLS1yYXN0ZXJpemUgICAgICAgICAgICAgIENhbGwgYEZUX1JlbmRlcl9HbHlwaCcgYXMgd2VsbCBhcyBsb2FkaW5nIGl0LgotICAtLXJlc3VsdCA8ZGlyPiAgICAgICAgICAgVGhpcyBpcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRlc3QgZmlsZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWQuCi0gIC0tdGVzdCA8ZmlsZT4gICAgICAgICAgICBSdW4gYSBzaW5nbGUgdGVzdCBvbiBhIHByZS1nZW5lcmF0ZWQgdGVzdGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGRvbmUgaW4gdGhlIGN1cnJlbnQgcHJvY2VzcyBzbyBpdCBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VkIG1vcmUgZWFzaWx5LgotCi1UaGUgZGVmYXVsdCBmb250IGV4dGVuc2lvbnMgdGVzdGVkIGJ5IGZ0cmFuZG9tIGFyZQotCi0gIC50dGYgLm90ZiAudHRjIC5jaWQgLnBmYiAucGZhIC5iZGYgLnBjZiAucGZyIC5mb24gLm90YiAuY2ZmCi0KLVRoZSBkZWZhdWx0IGZvbnQgZGlyZWN0b3J5IGlzIGNvbnRyb2xsZWQgYnkgdGhlIG1hY3JvIGBHT09EX0ZPTlRTX0RJUicgaW4KLXRoZSBzb3VyY2UgY29kZSAoYW5kIGNhbiBiZSB0aHVzIHNwZWNpZmllZCBkdXJpbmcgY29tcGlsYXRpb24pOyBpdHMgZGVmYXVsdAotdmFsdWUgaXMKLQotICAvdXNyL2xvY2FsL3NoYXJlL2ZvbnRzCi0KLVRoZSBkZWZhdWx0IHJlc3VsdCBkaXJlY3RvcnkgaXMgYHJlc3VsdHMnIChpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgotCi0KLUNvbXBpbGF0aW9uCi0tLS0tLS0tLS0tLQotCi1Ud28gcG9zc2libGUgc29sdXRpb25zLgotCi0uIFJ1biBmdHJhbmRvbSB3aXRoaW4gYSBkZWJ1Z2dpbmcgdG9vbCBsaWtlIGB2YWxncmluZCcgdG8gY2F0Y2ggdmFyaW91cwotICBtZW1vcnkgaXNzdWVzLgotCi0uIENvbXBpbGUgRnJlZVR5cGUgd2l0aCBzYW5pdGl6ZXIgZmxhZ3MgYXMgcHJvdmlkZWQgYnkgZ2NjIG9yIGNsYW5nLCBmb3IKLSAgZXhhbXBsZSwgdGhlbiBsaW5rIGl0IHdpdGggZnRyYW5kb20uCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZnRyYW5kb20vZnRyYW5kb20uYyBiL3NyYy90b29scy9mdHJhbmRvbS9mdHJhbmRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjVjZmM5Li4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9mdHJhbmRvbS9mdHJhbmRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIwICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNywgMjAwOCwgMjAxMyBieSBHZW9yZ2UgV2lsbGlhbXMgKi8KLS8qCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotICogVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLSAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qIG1vZGlmaWVkIGJ5IFdlcm5lciBMZW1iZXJnIDx3bEBnbnUub3JnPiAgICAgICAqLwotLyogVGhpcyBmaWxlIGlzIG5vdyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBsaWJyYXJ5ICovCi0KLQotI2RlZmluZSBfWE9QRU5fU09VUkNFIDUwMCAvKiBmb3IgYGtpbGwnLCBgc3RyZHVwJywgYHJhbmRvbScsIGFuZCBgc3JhbmRvbScgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLQotI2RlZmluZSB0cnVlICAgICAxCi0jZGVmaW5lIGZhbHNlICAgIDAKLSNkZWZpbmUgZm9yZXZlciAgZm9yICg7OykKLQotCi0gIHN0YXRpYyBpbnQgICAgY2hlY2tfb3V0bGluZXMgPSBmYWxzZTsKLSAgc3RhdGljIGludCAgICBub2hpbnRzICAgICAgICA9IGZhbHNlOwotICBzdGF0aWMgaW50ICAgIHJhc3Rlcml6ZSAgICAgID0gZmFsc2U7Ci0gIHN0YXRpYyBjaGFyKiAgcmVzdWx0c19kaXIgICAgPSAicmVzdWx0cyI7Ci0KLSNkZWZpbmUgR09PRF9GT05UU19ESVIgICIvdXNyL2xvY2FsL3NoYXJlL2ZvbnRzIgotCi0gIHN0YXRpYyBjaGFyKiAgZGVmYXVsdF9kaXJfbGlzdFtdID0KLSAgewotICAgIEdPT0RfRk9OVFNfRElSLAotICAgIE5VTEwKLSAgfTsKLQotICBzdGF0aWMgY2hhciogIGRlZmF1bHRfZXh0X2xpc3RbXSA9Ci0gIHsKLSAgICAidHRmIiwKLSAgICAib3RmIiwKLSAgICAidHRjIiwKLSAgICAiY2lkIiwKLSAgICAicGZiIiwKLSAgICAicGZhIiwKLSAgICAiYmRmIiwKLSAgICAicGNmIiwKLSAgICAicGZyIiwKLSAgICAiZm9uIiwKLSAgICAib3RiIiwKLSAgICAiY2ZmIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgc3RhdGljIHVuc2lnbmVkIGludCAgZXJyb3JfY291bnQgICAgPSAxOwotICBzdGF0aWMgZG91YmxlICAgICAgICBlcnJvcl9mcmFjdGlvbiA9IDAuMDsKLQotICBzdGF0aWMgRlRfRjI2RG90NiAgZm9udF9zaXplID0gMTIgKiA2NDsKLQotICBzdGF0aWMgc3RydWN0IGZvbnRsaXN0Ci0gIHsKLSAgICBjaGFyKiAgICAgICAgIG5hbWU7Ci0gICAgbG9uZyAgICAgICAgICBsZW47Ci0gICAgdW5zaWduZWQgaW50ICBpc2JpbmFyeTogMTsKLSAgICB1bnNpZ25lZCBpbnQgIGlzYXNjaWk6IDE7Ci0gICAgdW5zaWduZWQgaW50ICBpc2hleDogMTsKLQotICB9ICpmb250bGlzdDsKLQotICBzdGF0aWMgdW5zaWduZWQgaW50ICBmY250OwotCi0KLSAgc3RhdGljIGludAotICBGVF9Nb3ZlVG8oIGNvbnN0IEZUX1ZlY3RvciAgKnRvLAotICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnVzZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCB0byApOwotICAgIEZUX1VOVVNFRCggdXNlciApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgRlRfTGluZVRvKCBjb25zdCBGVF9WZWN0b3IgICp0bywKLSAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp1c2VyICkKLSAgewotICAgIEZUX1VOVVNFRCggdG8gKTsKLSAgICBGVF9VTlVTRUQoIHVzZXIgKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIEZUX0NvbmljVG8oIGNvbnN0IEZUX1ZlY3RvciAgKl9jcCwKLSAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yICAqdG8sCi0gICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnVzZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBfY3AgKTsKLSAgICBGVF9VTlVTRUQoIHRvICk7Ci0gICAgRlRfVU5VU0VEKCB1c2VyICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBGVF9DdWJpY1RvKCBjb25zdCBGVF9WZWN0b3IgICpjcDEsCi0gICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciAgKmNwMiwKLSAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yICAqdG8sCi0gICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnVzZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBjcDEgKTsKLSAgICBGVF9VTlVTRUQoIGNwMiApOwotICAgIEZUX1VOVVNFRCggdG8gKTsKLSAgICBGVF9VTlVTRUQoIHVzZXIgKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfT3V0bGluZV9GdW5jcyBvdXRsaW5lZnVuY3MgPQotICB7Ci0gICAgRlRfTW92ZVRvLAotICAgIEZUX0xpbmVUbywKLSAgICBGVF9Db25pY1RvLAotICAgIEZUX0N1YmljVG8sCi0gICAgMCwgMCAgICAgICAgICAvKiBObyBzaGlmdCwgbm8gZGVsdGEgKi8KLSAgfTsKLQotCi0gIHN0YXRpYyB2b2lkCi0gIFRlc3RGYWNlKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIHVuc2lnbmVkIGludCAgZ2lkOwotICAgIGludCAgICAgICAgICAgbG9hZF9mbGFncyA9IEZUX0xPQURfREVGQVVMVDsKLQotCi0gICAgaWYgKCBjaGVja19vdXRsaW5lcyAgICAgICAgICYmCi0gICAgICAgICBGVF9JU19TQ0FMQUJMRSggZmFjZSApICkKLSAgICAgIGxvYWRfZmxhZ3MgPSBGVF9MT0FEX05PX0JJVE1BUDsKLQotICAgIGlmICggbm9oaW50cyApCi0gICAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fSElOVElORzsKLQotICAgIEZUX1NldF9DaGFyX1NpemUoIGZhY2UsIDAsIGZvbnRfc2l6ZSwgNzIsIDcyICk7Ci0KLSAgICBmb3IgKCBnaWQgPSAwOyBnaWQgPCBmYWNlLT5udW1fZ2x5cGhzOyBnaWQrKyApCi0gICAgewotICAgICAgaWYgKCBjaGVja19vdXRsaW5lcyAgICAgICAgICYmCi0gICAgICAgICAgIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkgKQotICAgICAgewotICAgICAgICBpZiAoICFGVF9Mb2FkX0dseXBoKCBmYWNlLCBnaWQsIGxvYWRfZmxhZ3MgKSApCi0gICAgICAgICAgRlRfT3V0bGluZV9EZWNvbXBvc2UoICZmYWNlLT5nbHlwaC0+b3V0bGluZSwgJm91dGxpbmVmdW5jcywgTlVMTCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnaWQsIGxvYWRfZmxhZ3MgKTsKLQotICAgICAgaWYgKCByYXN0ZXJpemUgKQotICAgICAgICBGVF9SZW5kZXJfR2x5cGgoIGZhY2UtPmdseXBoLCBmdF9yZW5kZXJfbW9kZV9ub3JtYWwgKTsKLSAgICB9Ci0KLSAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgRXhlY3V0ZVRlc3QoIGNoYXIqICB0ZXN0Zm9udCApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICBjb250ZXh0OwotICAgIEZUX0ZhY2UgICAgIGZhY2U7Ci0KLQotICAgIGlmICggRlRfSW5pdF9GcmVlVHlwZSggJmNvbnRleHQgKSApCi0gICAgewotICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ2FuJ3QgaW5pdGlhbGl6ZSBGcmVlVHlwZS5cbiIgKTsKLSAgICAgIGV4aXQoIDEgKTsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX05ld19GYWNlKCBjb250ZXh0LCB0ZXN0Zm9udCwgMCwgJmZhY2UgKSApCi0gICAgewotICAgICAgLyogVGhlIGZvbnQgaXMgZXJyb25lb3VzLCBzbyBpZiB0aGlzIGZhaWxzIHRoYXQncyBvay4gKi8KLSAgICAgIGV4aXQoIDAgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGZhY2UtPm51bV9mYWNlcyA9PSAxICkKLSAgICAgIFRlc3RGYWNlKCBmYWNlICk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgIGksIG51bTsKLQotCi0gICAgICBudW0gPSBmYWNlLT5udW1fZmFjZXM7Ci0gICAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBudW07IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggIUZUX05ld19GYWNlKCBjb250ZXh0LCB0ZXN0Zm9udCwgaSwgJmZhY2UgKSApCi0gICAgICAgICAgVGVzdEZhY2UoIGZhY2UgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGVF9Eb25lX0ZyZWVUeXBlKCBjb250ZXh0ICk7Ci0KLSAgICBleGl0KCAwICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZXh0bWF0Y2goIGNoYXIqICAgZmlsZW5hbWUsCi0gICAgICAgICAgICBjaGFyKiogIGV4dGVuc2lvbnMgKQotICB7Ci0gICAgaW50ICAgIGk7Ci0gICAgY2hhciogIHB0OwotCi0KLSAgICBpZiAoICFleHRlbnNpb25zICkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgcHQgPSBzdHJyY2hyKCBmaWxlbmFtZSwgJy4nICk7Ci0gICAgaWYgKCAhcHQgKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICggcHQgPCBzdHJyY2hyKCBmaWxlbmFtZSwgJy8nICkgKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yICggaSA9IDA7IGV4dGVuc2lvbnNbaV0gIT0gTlVMTDsgaSsrICkKLSAgICAgIGlmICggc3RyY2FzZWNtcCggcHQgKyAxLCBleHRlbnNpb25zW2ldICkgPT0gMCB8fAotICAgICAgICAgICBzdHJjYXNlY21wKCBwdCwgICAgIGV4dGVuc2lvbnNbaV0gKSA9PSAwICkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZpZ3VyZWZpbGV0eXBlKCBzdHJ1Y3QgZm9udGxpc3QqICBpdGVtICkKLSAgewotICAgIEZJTEUqICBmb287Ci0KLQotICAgIGl0ZW0tPmlzYmluYXJ5ID0gaXRlbS0+aXNhc2NpaSA9IGl0ZW0tPmlzaGV4ID0gZmFsc2U7Ci0KLSAgICBmb28gPSBmb3BlbiggaXRlbS0+bmFtZSwgInJiIiApOwotICAgIGlmICggZm9vICkKLSAgICB7Ci0gICAgICAvKiBUcnkgdG8gZ3Vlc3MgdGhlIGZpbGUgdHlwZSBmcm9tIHRoZSBmaXJzdCBmZXcgY2hhcmFjdGVycy4uLiAqLwotICAgICAgaW50ICBjaDEgPSBnZXRjKCBmb28gKTsKLSAgICAgIGludCAgY2gyID0gZ2V0YyggZm9vICk7Ci0gICAgICBpbnQgIGNoMyA9IGdldGMoIGZvbyApOwotICAgICAgaW50ICBjaDQgPSBnZXRjKCBmb28gKTsKLQotCi0gICAgICBmY2xvc2UoIGZvbyApOwotCi0gICAgICBpZiAoICggY2gxID09IDAgICAmJiBjaDIgPT0gMSAgICYmIGNoMyA9PSAwICAgJiYgY2g0ID09IDAgICApIHx8Ci0gICAgICAgICAgICggY2gxID09ICdPJyAmJiBjaDIgPT0gJ1QnICYmIGNoMyA9PSAnVCcgJiYgY2g0ID09ICdPJyApIHx8Ci0gICAgICAgICAgICggY2gxID09ICd0JyAmJiBjaDIgPT0gJ3InICYmIGNoMyA9PSAndScgJiYgY2g0ID09ICdlJyApIHx8Ci0gICAgICAgICAgICggY2gxID09ICd0JyAmJiBjaDIgPT0gJ3QnICYmIGNoMyA9PSAnYycgJiYgY2g0ID09ICdmJyApICkKLSAgICAgIHsKLSAgICAgICAgLyogdHRmLCBvdGYsIHR0YyBmaWxlcyAqLwotICAgICAgICBpdGVtLT5pc2JpbmFyeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggY2gxID09IDB4ODAgJiYgY2gyID09ICdcMDEnICkKLSAgICAgIHsKLSAgICAgICAgLyogUEZCIGhlYWRlciAqLwotICAgICAgICBpdGVtLT5pc2JpbmFyeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggY2gxID09ICclJyAmJiBjaDIgPT0gJyEnICkKLSAgICAgIHsKLSAgICAgICAgLyogUmFuZG9tIFBvc3RTY3JpcHQgKi8KLSAgICAgICAgaWYgKCBzdHJzdHIoIGl0ZW0tPm5hbWUsICIucGZhIiApIHx8Ci0gICAgICAgICAgICAgc3Ryc3RyKCBpdGVtLT5uYW1lLCAiLlBGQSIgKSApCi0gICAgICAgICAgaXRlbS0+aXNoZXggPSB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaXRlbS0+aXNhc2NpaSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggY2gxID09IDEgJiYgY2gyID09IDAgJiYgY2gzID09IDQgKQotICAgICAgewotICAgICAgICAvKiBCYXJlIENGRiAqLwotICAgICAgICBpdGVtLT5pc2JpbmFyeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggY2gxID09ICdTJyAmJiBjaDIgPT0gJ1QnICYmIGNoMyA9PSAnQScgJiYgY2g0ID09ICdSJyApCi0gICAgICB7Ci0gICAgICAgIC8qIEJERiAqLwotICAgICAgICBpdGVtLT5pc2hleCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggY2gxID09ICdQJyAmJiBjaDIgPT0gJ0YnICYmIGNoMyA9PSAnUicgJiYgY2g0ID09ICcwJyApCi0gICAgICB7Ci0gICAgICAgIC8qIFBGUiAqLwotICAgICAgICBpdGVtLT5pc2JpbmFyeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggKCBjaDEgPT0gJ1wxJyAmJiBjaDIgPT0gJ2YnICYmIGNoMyA9PSAnYycgJiYgY2g0ID09ICdwJyApIHx8Ci0gICAgICAgICAgICAgICAgKCBjaDEgPT0gJ00nICAmJiBjaDIgPT0gJ1onICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgLyogV2luZG93cyBGT04gKi8KLSAgICAgICAgaXRlbS0+aXNiaW5hcnkgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsCi0gICAgICAgICAgICAgICAgICJDYW4ndCByZWNvZ25pemUgZmlsZSB0eXBlIG9mIGAlcycsIGFzc3VtaW5nIGJpbmFyeVxuIiwKLSAgICAgICAgICAgICAgICAgaXRlbS0+bmFtZSApOwotICAgICAgICBpdGVtLT5pc2JpbmFyeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmKCBzdGRlcnIsICJDYW4ndCBvcGVuIGAlcycgZm9yIHR5cGluZyB0aGUgZmlsZS5cbiIsCi0gICAgICAgICAgICAgICBpdGVtLT5uYW1lICk7Ci0gICAgICBpdGVtLT5pc2JpbmFyeSA9IHRydWU7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBGaW5kRm9udHMoIGNoYXIqKiAgZm9udGRpcnMsCi0gICAgICAgICAgICAgY2hhcioqICBleHRlbnNpb25zICkKLSAgewotICAgIGludCAgICAgICAgICAgaTsKLSAgICB1bnNpZ25lZCBpbnQgIG1heDsKLSAgICBjaGFyICAgICAgICAgIGJ1ZmZlclsxMDI1XTsKLSAgICBzdHJ1Y3Qgc3RhdCAgIHN0YXRiOwotCi0KLSAgICBtYXggID0gMDsKLSAgICBmY250ID0gMDsKLQotICAgIGZvciAoIGkgPSAwOyBmb250ZGlyc1tpXSAhPSBOVUxMOyBpKysgKQotICAgIHsKLSAgICAgIERJUiogICAgICAgICAgICBleGFtcGxlczsKLSAgICAgIHN0cnVjdCBkaXJlbnQqICBlbnQ7Ci0KLQotICAgICAgZXhhbXBsZXMgPSBvcGVuZGlyKCBmb250ZGlyc1tpXSApOwotICAgICAgaWYgKCAhZXhhbXBsZXMgKQotICAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsCi0gICAgICAgICAgICAgICAgICJDYW4ndCBvcGVuIGV4YW1wbGUgZm9udCBkaXJlY3RvcnkgYCVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgZm9udGRpcnNbaV0gKTsKLSAgICAgICAgZXhpdCggMSApOwotICAgICAgfQotCi0gICAgICB3aGlsZSAoICggZW50ID0gcmVhZGRpciggZXhhbXBsZXMgKSApICE9IE5VTEwgKQotICAgICAgewotICAgICAgICBzbnByaW50ZiggYnVmZmVyLCBzaXplb2YgKCBidWZmZXIgKSwKLSAgICAgICAgICAgICAgICAgICIlcy8lcyIsIGZvbnRkaXJzW2ldLCBlbnQtPmRfbmFtZSApOwotICAgICAgICBpZiAoIHN0YXQoIGJ1ZmZlciwgJnN0YXRiICkgPT0gLTEgfHwgU19JU0RJUiggc3RhdGIuc3RfbW9kZSApICkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKCAhZXh0ZW5zaW9ucyB8fCBleHRtYXRjaCggYnVmZmVyLCBleHRlbnNpb25zICkgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBmY250ID49IG1heCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4ICs9IDEwMDsKLSAgICAgICAgICAgIGZvbnRsaXN0ID0gcmVhbGxvYyggZm9udGxpc3QsIG1heCAqIHNpemVvZiAoIHN0cnVjdCBmb250bGlzdCApICk7Ci0gICAgICAgICAgICBpZiAoICFmb250bGlzdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNhbid0IGFsbG9jYXRlIG1lbW9yeVxuIiApOwotICAgICAgICAgICAgICBleGl0KCAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZm9udGxpc3RbZmNudF0ubmFtZSA9IHN0cmR1cCggYnVmZmVyICk7Ci0gICAgICAgICAgZm9udGxpc3RbZmNudF0ubGVuICA9IHN0YXRiLnN0X3NpemU7Ci0KLSAgICAgICAgICBmaWd1cmVmaWxldHlwZSggJmZvbnRsaXN0W2ZjbnRdICk7Ci0gICAgICAgICAgZmNudCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGNsb3NlZGlyKCBleGFtcGxlcyApOwotICAgIH0KLQotICAgIGlmICggZmNudCA9PSAwICkKLSAgICB7Ci0gICAgICBmcHJpbnRmKCBzdGRlcnIsICJDYW4ndCBmaW5kIG1hdGNoaW5nIGZvbnQgZmlsZXMuXG4iICk7Ci0gICAgICBleGl0KCAxICk7Ci0gICAgfQotCi0gICAgZm9udGxpc3RbZmNudF0ubmFtZSA9IE5VTEw7Ci0gIH0KLQotCi0gIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSAgZ2V0RXJyb3JDbnQoIHN0cnVjdCBmb250bGlzdCogIGl0ZW0gKQotICB7Ci0gICAgaWYgKCBlcnJvcl9jb3VudCA9PSAwICYmIGVycm9yX2ZyYWN0aW9uID09IDAuMCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBlcnJvcl9jb3VudCArICh1bnNpZ25lZCBpbnQpKCBlcnJvcl9mcmFjdGlvbiAqIGl0ZW0tPmxlbiApOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGdldFJhbmRvbSggaW50ICBsb3csCi0gICAgICAgICAgICAgaW50ICBoaWdoICkKLSAgewotICAgIGlmICggbG93IC0gaGlnaCA8IDB4MTAwMDBMICkKLSAgICAgIHJldHVybiBsb3cgKyAoICggcmFuZG9tKCkgPj4gOCApICUgKCBoaWdoICsgMSAtIGxvdyApICk7Ci0KLSAgICByZXR1cm4gbG93ICsgKCByYW5kb20oKSAlICggaGlnaCArIDEgLSBsb3cgKSApOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGNvcHlmb250KCBzdHJ1Y3QgZm9udGxpc3QqICBpdGVtLAotICAgICAgICAgICAgY2hhciogICAgICAgICAgICAgbmV3Zm9udCApCi0gIHsKLSAgICBzdGF0aWMgY2hhciAgIGJ1ZmZlcls4MDk2XTsKLSAgICBGSUxFICAgICAgICAgICpnb29kLCAqbmV3ZjsKLSAgICBzaXplX3QgICAgICAgIGxlbjsKLSAgICB1bnNpZ25lZCBpbnQgIGksIGVycl9jbnQ7Ci0KLQotICAgIGdvb2QgPSBmb3BlbiggaXRlbS0+bmFtZSwgInIiICk7Ci0gICAgaWYgKCAhZ29vZCApCi0gICAgewotICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ2FuJ3Qgb3BlbiBgJXMnXG4iLCBpdGVtLT5uYW1lICk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbmV3ZiA9IGZvcGVuKCBuZXdmb250LCAidysiICk7Ci0gICAgaWYgKCAhbmV3ZiApCi0gICAgewotICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ2FuJ3QgY3JlYXRlIHRlbXBvcmFyeSBvdXRwdXQgZmlsZSBgJXMnXG4iLAotICAgICAgICAgICAgICAgbmV3Zm9udCApOwotICAgICAgZXhpdCggMSApOwotICAgIH0KLQotICAgIHdoaWxlICggKCBsZW4gPSBmcmVhZCggYnVmZmVyLCAxLCBzaXplb2YgKCBidWZmZXIgKSwgZ29vZCApICkgPiAwICkKLSAgICAgIGZ3cml0ZSggYnVmZmVyLCAxLCBsZW4sIG5ld2YgKTsKLQotICAgIGZjbG9zZSggZ29vZCApOwotCi0gICAgZXJyX2NudCA9IGdldEVycm9yQ250KCBpdGVtICk7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBlcnJfY250OyBpKysgKQotICAgIHsKLSAgICAgIGZzZWVrKCBuZXdmLCBnZXRSYW5kb20oIDAsIChpbnQpKCBpdGVtLT5sZW4gLSAxICkgKSwgU0VFS19TRVQgKTsKLQotICAgICAgaWYgKCBpdGVtLT5pc2JpbmFyeSApCi0gICAgICAgIHB1dGMoIGdldFJhbmRvbSggMCwgMHhGRiApLCBuZXdmICk7Ci0gICAgICBlbHNlIGlmICggaXRlbS0+aXNhc2NpaSApCi0gICAgICAgIHB1dGMoIGdldFJhbmRvbSggMHgyMCwgMHg3RSApLCBuZXdmICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGludCAgaGV4ID0gZ2V0UmFuZG9tKCAwLCAxNSApOwotCi0KLSAgICAgICAgaWYgKCBoZXggPCAxMCApCi0gICAgICAgICAgaGV4ICs9ICcwJzsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGhleCArPSAnQScgLSAxMDsKLQotICAgICAgICBwdXRjKCBoZXgsIG5ld2YgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGZlcnJvciggbmV3ZiApICkKLSAgICB7Ci0gICAgICBmY2xvc2UoIG5ld2YgKTsKLSAgICAgIHVubGluayggbmV3Zm9udCApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZjbG9zZSggbmV3ZiApOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQgIGNoaWxkX3BpZDsKLQotICBzdGF0aWMgdm9pZAotICBhYm9ydF90ZXN0KCBpbnQgIHNpZyApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHNpZyApOwotCi0gICAgLyogSWYgYSB0aW1lLW91dCBoYXBwZW5zLCB0aGVuIGtpbGwgdGhlIGNoaWxkICovCi0gICAga2lsbCggY2hpbGRfcGlkLCBTSUdGUEUgKTsKLSAgICB3cml0ZSggMiwgIlRpbWVvdXQuLi4gIiwgMTEgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZG9fdGVzdCggdm9pZCApCi0gIHsKLSAgICBpbnQgICAgICAgICBpICAgICAgICA9IGdldFJhbmRvbSggMCwgKGludCkoIGZjbnQgLSAxICkgKTsKLSAgICBzdGF0aWMgaW50ICB0ZXN0X251bSA9IDA7Ci0gICAgY2hhciAgICAgICAgYnVmZmVyWzEwMjRdOwotCi0KLSAgICBzcHJpbnRmKCBidWZmZXIsICIlcy90ZXN0JWQiLCByZXN1bHRzX2RpciwgdGVzdF9udW0rKyApOwotCi0gICAgaWYgKCBjb3B5Zm9udCAoICZmb250bGlzdFtpXSwgYnVmZmVyICkgKQotICAgIHsKLSAgICAgIHNpZ25hbCggU0lHQUxSTSwgYWJvcnRfdGVzdCApOwotICAgICAgLyogQW55dGhpbmcgdGhhdCB0YWtlcyBtb3JlIHRoYW4gMjAgc2Vjb25kcyAqLwotICAgICAgLyogdG8gcGFyc2UgYW5kL29yIHJhc3Rlcml6ZSBpcyBhbiBlcnJvci4gICAqLwotICAgICAgYWxhcm0oIDIwICk7Ci0gICAgICBpZiAoICggY2hpbGRfcGlkID0gZm9yaygpICkgPT0gMCApCi0gICAgICAgIEV4ZWN1dGVUZXN0KCBidWZmZXIgKTsKLSAgICAgIGVsc2UgaWYgKCBjaGlsZF9waWQgIT0gLTEgKQotICAgICAgewotICAgICAgICBpbnQgIHN0YXR1czsKLQotCi0gICAgICAgIHdhaXRwaWQoIGNoaWxkX3BpZCwgJnN0YXR1cywgMCApOwotICAgICAgICBhbGFybSggMCApOwotICAgICAgICBpZiAoIFdJRlNJR05BTEVEICggc3RhdHVzICkgKQotICAgICAgICAgIHByaW50ZiggIkVycm9yIGZvdW5kIGluIGZpbGUgYCVzJ1xuIiwgYnVmZmVyICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB1bmxpbmsoIGJ1ZmZlciApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDYW4ndCBmb3JrIHRlc3QgY2FzZS5cbiIgKTsKLSAgICAgICAgZXhpdCggMSApOwotICAgICAgfQotICAgICAgYWxhcm0oIDAgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHVzYWdlKCBGSUxFKiAgb3V0LAotICAgICAgICAgY2hhciogIG5hbWUgKQotICB7Ci0gICAgY2hhcioqICBkID0gZGVmYXVsdF9kaXJfbGlzdDsKLSAgICBjaGFyKiogIGUgPSBkZWZhdWx0X2V4dF9saXN0OwotCi0KLSAgICBmcHJpbnRmKCBvdXQsICIlcyBbb3B0aW9uc10gLS0gR2VuZXJhdGUgcmFuZG9tIGVycm9uZW91cyBmb250c1xuIgotICAgICAgICAgICAgICAgICAgIiAgYW5kIGF0dGVtcHQgdG8gcGFyc2UgdGhlbSB3aXRoIEZyZWVUeXBlLlxuXG4iLCBuYW1lICk7Ci0KLSAgICBmcHJpbnRmKCBvdXQsICIgIC0tYWxsICAgICAgICAgICAgICAgICAgICBBbGwgbm9uLWRpcmVjdG9yeSBmaWxlcyBhcmUgYXNzdW1lZCB0byBiZSBmb250cy5cbiIgKTsKLSAgICBmcHJpbnRmKCBvdXQsICIgIC0tY2hlY2stb3V0bGluZXMgICAgICAgICBNYWtlIHN1cmUgd2UgY2FuIHBhcnNlIHRoZSBvdXRsaW5lcyBvZiBlYWNoIGdseXBoLlxuIiApOwotICAgIGZwcmludGYoIG91dCwgIiAgLS1kaXIgPHBhdGg+ICAgICAgICAgICAgIEFwcGVuZCA8cGF0aD4gdG8gbGlzdCBvZiBmb250IHNlYXJjaCBkaXJlY3Rvcmllc1xuIgotICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyByZWN1cnNpdmUgc2VhcmNoKS5cbiIgKTsKLSAgICBmcHJpbnRmKCBvdXQsICIgIC0tZXJyb3ItY291bnQgPGNudD4gICAgICBJbnRyb2R1Y2UgPGNudD4gc2luZ2xlIGJ5dGUgZXJyb3JzIGludG8gZWFjaCBmb250XG4iCi0gICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDEpXG4iICk7Ci0gICAgZnByaW50Ziggb3V0LCAiICAtLWVycm9yLWZyYWN0aW9uIDxmcmFjPiAgSW50cm9kdWNlIDxmcmFjPipmaWxlc2l6ZSBzaW5nbGUgYnl0ZSBlcnJvcnNcbiIKLSAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGVhY2ggZm9udCAoZGVmYXVsdDogMC4wKS5cbiIgKTsKLSAgICBmcHJpbnRmKCBvdXQsICIgIC0tZXh0IDxleHQ+ICAgICAgICAgICAgICBBZGQgPGV4dD4gdG8gbGlzdCBvZiBleHRlbnNpb25zIGluZGljYXRpbmcgZm9udHMuXG4iICk7Ci0gICAgZnByaW50Ziggb3V0LCAiICAtLWhlbHAgICAgICAgICAgICAgICAgICAgUHJpbnQgdGhpcy5cbiIgKTsKLSAgICBmcHJpbnRmKCBvdXQsICIgIC0tbm9oaW50cyAgICAgICAgICAgICAgICBUdXJuIG9mZiBoaW50aW5nLlxuIiApOwotICAgIGZwcmludGYoIG91dCwgIiAgLS1yYXN0ZXJpemUgICAgICAgICAgICAgIEF0dGVtcHQgdG8gcmFzdGVyaXplIGVhY2ggZ2x5cGguXG4iICk7Ci0gICAgZnByaW50Ziggb3V0LCAiICAtLXJlc3VsdHMgPHBhdGg+ICAgICAgICAgUGxhY2UgdGhlIGNyZWF0ZWQgdGVzdCBmb250cyBpbnRvIDxwYXRoPlxuIgotICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBgcmVzdWx0cycpXG4iICk7Ci0gICAgZnByaW50Ziggb3V0LCAiICAtLXNpemUgPGZsb2F0PiAgICAgICAgICAgVXNlIHRoZSBnaXZlbiBmb250IHNpemUgZm9yIHRoZSB0ZXN0cy5cbiIgKTsKLSAgICBmcHJpbnRmKCBvdXQsICIgIC0tdGVzdCA8ZmlsZT4gICAgICAgICAgICBSdW4gYSBzaW5nbGUgdGVzdCBvbiBhbiBhbHJlYWR5IGV4aXN0aW5nIGZpbGUuXG4iICk7Ci0gICAgZnByaW50Ziggb3V0LCAiXG4iICk7Ci0KLSAgICBmcHJpbnRmKCBvdXQsICJEZWZhdWx0IGZvbnQgZXh0ZW5zaW9uczpcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXQsICIgIiApOwotICAgIHdoaWxlICggKmUgKQotICAgICAgZnByaW50Ziggb3V0LCAiIC4lcyIsICplKysgKTsKLSAgICBmcHJpbnRmKCBvdXQsICJcbiIgKTsKLQotICAgIGZwcmludGYoIG91dCwgIkRlZmF1bHQgZm9udCBkaXJlY3RvcmllczpcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXQsICIgIiApOwotICAgIHdoaWxlICggKmQgKQotICAgICAgZnByaW50Ziggb3V0LCAiICVzIiwgKmQrKyApOwotICAgIGZwcmludGYoIG91dCwgIlxuIiApOwotICB9Ci0KLQotICBpbnQKLSAgbWFpbiggaW50ICAgICBhcmdjLAotICAgICAgICBjaGFyKiogIGFyZ3YgKQotICB7Ci0gICAgY2hhciAgICAqKmRpcnMsICoqZXh0czsKLSAgICBpbnQgICAgIGRjbnQgPSAwLCBlY250ID0gMCwgcnNldCA9IGZhbHNlLCBhbGxleHRzID0gZmFsc2U7Ci0gICAgaW50ICAgICBpOwotICAgIHRpbWVfdCAgbm93OwotICAgIGNoYXIqICAgdGVzdGZpbGUgPSBOVUxMOwotCi0KLSAgICBkaXJzID0gY2FsbG9jKCAoc2l6ZV90KSggYXJnYyArIDEgKSwgc2l6ZW9mICggY2hhciAqKiApICk7Ci0gICAgZXh0cyA9IGNhbGxvYyggKHNpemVfdCkoIGFyZ2MgKyAxICksIHNpemVvZiAoIGNoYXIgKiogKSApOwotCi0gICAgZm9yICggaSA9IDE7IGkgPCBhcmdjOyBpKysgKQotICAgIHsKLSAgICAgIGNoYXIqICBwdCA9IGFyZ3ZbaV07Ci0gICAgICBjaGFyKiAgZW5kOwotCi0KLSAgICAgIGlmICggcHRbMF0gPT0gJy0nICYmIHB0WzFdID09ICctJyApCi0gICAgICAgIHB0Kys7Ci0KLSAgICAgIGlmICggc3RyY21wKCBwdCwgIi1hbGwiICkgPT0gMCApCi0gICAgICAgIGFsbGV4dHMgPSB0cnVlOwotICAgICAgZWxzZSBpZiAoIHN0cmNtcCggcHQsICItY2hlY2stb3V0bGluZXMiICkgPT0gMCApCi0gICAgICAgIGNoZWNrX291dGxpbmVzID0gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIHB0LCAiLWRpciIgKSA9PSAwICkKLSAgICAgICAgZGlyc1tkY250KytdID0gYXJndlsrK2ldOwotICAgICAgZWxzZSBpZiAoIHN0cmNtcCggcHQsICItZXJyb3ItY291bnQiICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggIXJzZXQgKQotICAgICAgICAgIGVycm9yX2ZyYWN0aW9uID0gMC4wOwotICAgICAgICByc2V0ID0gdHJ1ZTsKLSAgICAgICAgZXJyb3JfY291bnQgPSAodW5zaWduZWQgaW50KXN0cnRvdWwoIGFyZ3ZbKytpXSwgJmVuZCwgMTAgKTsKLSAgICAgICAgaWYgKCAqZW5kICE9ICdcMCcgKQotICAgICAgICB7Ci0gICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQmFkIHZhbHVlIGZvciBlcnJvci1jb3VudDogJXNcbiIsIGFyZ3ZbaV0gKTsKLSAgICAgICAgICBleGl0KCAxICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIHB0LCAiLWVycm9yLWZyYWN0aW9uIiApID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoICFyc2V0ICkKLSAgICAgICAgICBlcnJvcl9jb3VudCA9IDA7Ci0gICAgICAgIHJzZXQgPSB0cnVlOwotICAgICAgICBlcnJvcl9mcmFjdGlvbiA9IHN0cnRvZCggYXJndlsrK2ldLCAmZW5kICk7Ci0gICAgICAgIGlmICggKmVuZCAhPSAnXDAnICkKLSAgICAgICAgewotICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkJhZCB2YWx1ZSBmb3IgZXJyb3ItZnJhY3Rpb246ICVzXG4iLCBhcmd2W2ldICk7Ci0gICAgICAgICAgZXhpdCggMSApOwotICAgICAgICB9Ci0gICAgICAgIGlmICggZXJyb3JfZnJhY3Rpb24gPCAwLjAgfHwgZXJyb3JfZnJhY3Rpb24gPiAxLjAgKQotICAgICAgICB7Ci0gICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiZXJyb3ItZnJhY3Rpb24gbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzA7MV1cbiIgKTsKLSAgICAgICAgICBleGl0KCAxICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIHB0LCAiLWV4dCIgKSA9PSAwICkKLSAgICAgICAgZXh0c1tlY250KytdID0gYXJndlsrK2ldOwotICAgICAgZWxzZSBpZiAoIHN0cmNtcCggcHQsICItaGVscCIgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgdXNhZ2UoIHN0ZG91dCwgYXJndlswXSApOwotICAgICAgICBleGl0KCAwICk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc3RyY21wKCBwdCwgIi1ub2hpbnRzIiApID09IDAgKQotICAgICAgICBub2hpbnRzID0gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIHB0LCAiLXJhc3Rlcml6ZSIgKSA9PSAwICkKLSAgICAgICAgcmFzdGVyaXplID0gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIHB0LCAiLXJlc3VsdHMiICkgPT0gMCApCi0gICAgICAgIHJlc3VsdHNfZGlyID0gYXJndlsrK2ldOwotICAgICAgZWxzZSBpZiAoIHN0cmNtcCggcHQsICItc2l6ZSIgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZm9udF9zaXplID0gKEZUX0YyNkRvdDYpKCBzdHJ0b2QoIGFyZ3ZbKytpXSwgJmVuZCApICogNjQgKTsKLSAgICAgICAgaWYgKCAqZW5kICE9ICdcMCcgfHwgZm9udF9zaXplIDwgNjQgKQotICAgICAgICB7Ci0gICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQmFkIHZhbHVlIGZvciBzaXplOiAlc1xuIiwgYXJndltpXSApOwotICAgICAgICAgIGV4aXQoIDEgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHN0cmNtcCggcHQsICItdGVzdCIgKSA9PSAwICkKLSAgICAgICAgdGVzdGZpbGUgPSBhcmd2WysraV07Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHVzYWdlKCBzdGRlcnIsIGFyZ3ZbMF0gKTsKLSAgICAgICAgZXhpdCggMSApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggYWxsZXh0cyApCi0gICAgewotICAgICAgZnJlZSggZXh0cyApOwotICAgICAgZXh0cyA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBlY250ID09IDAgKQotICAgIHsKLSAgICAgIGZyZWUoIGV4dHMgKTsKLSAgICAgIGV4dHMgPSBkZWZhdWx0X2V4dF9saXN0OwotICAgIH0KLQotICAgIGlmICggZGNudCA9PSAwICkKLSAgICB7Ci0gICAgICBmcmVlKCBkaXJzICk7Ci0gICAgICBkaXJzID0gZGVmYXVsdF9kaXJfbGlzdDsKLSAgICB9Ci0KLSAgICBpZiAoIHRlc3RmaWxlICkKLSAgICAgIEV4ZWN1dGVUZXN0KCB0ZXN0ZmlsZSApOyAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiAqLwotCi0gICAgdGltZSggJm5vdyApOwotICAgIHNyYW5kb20oICh1bnNpZ25lZCBpbnQpbm93ICk7Ci0KLSAgICBGaW5kRm9udHMoIGRpcnMsIGV4dHMgKTsKLSAgICBta2RpciggcmVzdWx0c19kaXIsIDA3NTUgKTsKLQotICAgIGZvcmV2ZXIKLSAgICAgIGRvX3Rlc3QoKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotLyogRU9GICovCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZ2xuYW1lcy5weSBiL3NyYy90b29scy9nbG5hbWVzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWQxNTg4Li4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9nbG5hbWVzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTU0MCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLQotIwotIyBGcmVlVHlwZSAyIGdseXBoIG5hbWUgYnVpbGRlcgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIiIiXAotCi11c2FnZTogJXMgPG91dHB1dC1maWxlPgotCi0gIFRoaXMgcHl0aG9uIHNjcmlwdCBnZW5lcmF0ZXMgdGhlIGdseXBoIG5hbWVzIHRhYmxlcyBkZWZpbmVkIGluIHRoZQotICBgcHNuYW1lcycgbW9kdWxlLgotCi0gIEl0cyBzaW5nbGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlIHRvIGJlIGNyZWF0ZWQuCi0iIiIKLQotCi1pbXBvcnQgc3lzLCBzdHJpbmcsIHN0cnVjdCwgcmUsIG9zLnBhdGgKLQotCi0jIFRoaXMgdGFibGUgbGlzdHMgdGhlIGdseXBocyBhY2NvcmRpbmcgdG8gdGhlIE1hY2ludG9zaCBzcGVjaWZpY2F0aW9uLgotIyBJdCBpcyB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBQb3N0c2NyaXB0IG5hbWVzIHRhYmxlLgotIwotIyBTZWUKLSMKLSMgICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2cG9zdC5odG1sCi0jCi0jIGZvciB0aGUgb2ZmaWNpYWwgbGlzdC4KLSMKLW1hY19zdGFuZGFyZF9uYW1lcyA9IFwKLVsKLSAgIyAwCi0gICIubm90ZGVmIiwgIi5udWxsIiwgIm5vbm1hcmtpbmdyZXR1cm4iLCAic3BhY2UiLCAiZXhjbGFtIiwKLSAgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwKLQotICAjIDEwCi0gICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwKLSAgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsCi0KLSAgIyAyMAotICAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLAotICAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLAotCi0gICMgMzAKLSAgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLAotICAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsCi0KLSAgIyA0MAotICAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwKLSAgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsCi0KLSAgIyA1MAotICAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwKLSAgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsCi0KLSAgIyA2MAotICAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLAotICAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJncmF2ZSIsICJhIiwgImIiLAotCi0gICMgNzAKLSAgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsCi0gICJoIiwgImkiLCAiaiIsICJrIiwgImwiLAotCi0gICMgODAKLSAgIm0iLCAibiIsICJvIiwgInAiLCAicSIsCi0gICJyIiwgInMiLCAidCIsICJ1IiwgInYiLAotCi0gICMgOTAKLSAgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwKLSAgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwKLQotICAjIDEwMAotICAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIk50aWxkZSIsICJPZGllcmVzaXMiLCAiVWRpZXJlc2lzIiwKLSAgImFhY3V0ZSIsICJhZ3JhdmUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImF0aWxkZSIsCi0KLSAgIyAxMTAKLSAgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLCAiZWNpcmN1bWZsZXgiLAotICAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwKLQotICAjIDEyMAotICAibnRpbGRlIiwgIm9hY3V0ZSIsICJvZ3JhdmUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwKLSAgIm90aWxkZSIsICJ1YWN1dGUiLCAidWdyYXZlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsCi0KLSAgIyAxMzAKLSAgImRhZ2dlciIsICJkZWdyZWUiLCAiY2VudCIsICJzdGVybGluZyIsICJzZWN0aW9uIiwKLSAgImJ1bGxldCIsICJwYXJhZ3JhcGgiLCAiZ2VybWFuZGJscyIsICJyZWdpc3RlcmVkIiwgImNvcHlyaWdodCIsCi0KLSAgIyAxNDAKLSAgInRyYWRlbWFyayIsICJhY3V0ZSIsICJkaWVyZXNpcyIsICJub3RlcXVhbCIsICJBRSIsCi0gICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLAotCi0gICMgMTUwCi0gICJ5ZW4iLCAibXUiLCAicGFydGlhbGRpZmYiLCAic3VtbWF0aW9uIiwgInByb2R1Y3QiLAotICAicGkiLCAiaW50ZWdyYWwiLCAib3JkZmVtaW5pbmUiLCAib3JkbWFzY3VsaW5lIiwgIk9tZWdhIiwKLQotICAjIDE2MAotICAiYWUiLCAib3NsYXNoIiwgInF1ZXN0aW9uZG93biIsICJleGNsYW1kb3duIiwgImxvZ2ljYWxub3QiLAotICAicmFkaWNhbCIsICJmbG9yaW4iLCAiYXBwcm94ZXF1YWwiLCAiRGVsdGEiLCAiZ3VpbGxlbW90bGVmdCIsCi0KLSAgIyAxNzAKLSAgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgIm5vbmJyZWFraW5nc3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsCi0gICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsCi0KLSAgIyAxODAKLSAgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgImRpdmlkZSIsCi0gICJsb3plbmdlIiwgInlkaWVyZXNpcyIsICJZZGllcmVzaXMiLCAiZnJhY3Rpb24iLCAiY3VycmVuY3kiLAotCi0gICMgMTkwCi0gICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwgImZsIiwgImRhZ2dlcmRibCIsCi0gICJwZXJpb2RjZW50ZXJlZCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicGVydGhvdXNhbmQiLAotICAgICJBY2lyY3VtZmxleCIsCi0KLSAgIyAyMDAKLSAgIkVjaXJjdW1mbGV4IiwgIkFhY3V0ZSIsICJFZGllcmVzaXMiLCAiRWdyYXZlIiwgIklhY3V0ZSIsCi0gICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiSWdyYXZlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsCi0KLSAgIyAyMTAKLSAgImFwcGxlIiwgIk9ncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWdyYXZlIiwKLSAgImRvdGxlc3NpIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwKLQotICAjIDIyMAotICAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwKLSAgImNhcm9uIiwgIkxzbGFzaCIsICJsc2xhc2giLCAiU2Nhcm9uIiwgInNjYXJvbiIsCi0KLSAgIyAyMzAKLSAgIlpjYXJvbiIsICJ6Y2Fyb24iLCAiYnJva2VuYmFyIiwgIkV0aCIsICJldGgiLAotICAiWWFjdXRlIiwgInlhY3V0ZSIsICJUaG9ybiIsICJ0aG9ybiIsICJtaW51cyIsCi0KLSAgIyAyNDAKLSAgIm11bHRpcGx5IiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAib25laGFsZiIsCi0gICJvbmVxdWFydGVyIiwgInRocmVlcXVhcnRlcnMiLCAiZnJhbmMiLCAiR2JyZXZlIiwgImdicmV2ZSIsCi0KLSAgIyAyNTAKLSAgIklkb3RhY2NlbnQiLCAiU2NlZGlsbGEiLCAic2NlZGlsbGEiLCAiQ2FjdXRlIiwgImNhY3V0ZSIsCi0gICJDY2Fyb24iLCAiY2Nhcm9uIiwgImRjcm9hdCIKLV0KLQotCi0jIFRoZSBsaXN0IG9mIHN0YW5kYXJkIGBTSUQnIGdseXBoIG5hbWVzLiAgRm9yIHRoZSBvZmZpY2lhbCBsaXN0LAotIyBzZWUgQW5uZXggQSBvZiBkb2N1bWVudCBhdAotIwotIyAgIGh0dHA6Ly9wYXJ0bmVycy5hZG9iZS5jb20vcHVibGljL2RldmVsb3Blci9lbi9mb250LzUxNzYuQ0ZGLnBkZiAgLgotIwotc2lkX3N0YW5kYXJkX25hbWVzID0gXAotWwotICAjIDAKLSAgIi5ub3RkZWYiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLAotICAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0IiwKLQotICAjIDEwCi0gICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwKLSAgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLAotCi0gICMgMjAKLSAgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLAotICAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsCi0KLSAgIyAzMAotICAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwKLSAgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsCi0KLSAgIyA0MAotICAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwKLSAgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsCi0KLSAgIyA1MAotICAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwKLSAgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsCi0KLSAgIyA2MAotICAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwKLSAgInF1b3RlbGVmdCIsICJhIiwgImIiLCAiYyIsICJkIiwKLQotICAjIDcwCi0gICJlIiwgImYiLCAiZyIsICJoIiwgImkiLAotICAiaiIsICJrIiwgImwiLCAibSIsICJuIiwKLQotICAjIDgwCi0gICJvIiwgInAiLCAicSIsICJyIiwgInMiLAotICAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwKLQotICAjIDkwCi0gICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwKLSAgImFzY2lpdGlsZGUiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImZyYWN0aW9uIiwKLQotICAjIDEwMAotICAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwKLSAgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLAotCi0gICMgMTEwCi0gICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsCi0gICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwKLQotICAjIDEyMAotICAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCAicXVlc3Rpb25kb3duIiwgImdyYXZlIiwKLSAgImFjdXRlIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwKLQotICAjIDEzMAotICAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLAotICAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICJBRSIsICJvcmRmZW1pbmluZSIsCi0KLSAgIyAxNDAKLSAgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwKLSAgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsCi0KLSAgIyAxNTAKLSAgIm9uZXN1cGVyaW9yIiwgImxvZ2ljYWxub3QiLCAibXUiLCAidHJhZGVtYXJrIiwgIkV0aCIsCi0gICJvbmVoYWxmIiwgInBsdXNtaW51cyIsICJUaG9ybiIsICJvbmVxdWFydGVyIiwgImRpdmlkZSIsCi0KLSAgIyAxNjAKLSAgImJyb2tlbmJhciIsICJkZWdyZWUiLCAidGhvcm4iLCAidGhyZWVxdWFydGVycyIsICJ0d29zdXBlcmlvciIsCi0gICJyZWdpc3RlcmVkIiwgIm1pbnVzIiwgImV0aCIsICJtdWx0aXBseSIsICJ0aHJlZXN1cGVyaW9yIiwKLQotICAjIDE3MAotICAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwKLSAgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLAotCi0gICMgMTgwCi0gICJFZGllcmVzaXMiLCAiRWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLAotICAiSWdyYXZlIiwgIk50aWxkZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiT2RpZXJlc2lzIiwKLQotICAjIDE5MAotICAiT2dyYXZlIiwgIk90aWxkZSIsICJTY2Fyb24iLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwKLSAgIlVkaWVyZXNpcyIsICJVZ3JhdmUiLCAiWWFjdXRlIiwgIllkaWVyZXNpcyIsICJaY2Fyb24iLAotCi0gICMgMjAwCi0gICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsCi0gICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsCi0KLSAgIyAyMTAKLSAgImVncmF2ZSIsICJpYWN1dGUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgImlncmF2ZSIsCi0gICJudGlsZGUiLCAib2FjdXRlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvZ3JhdmUiLAotCi0gICMgMjIwCi0gICJvdGlsZGUiLCAic2Nhcm9uIiwgInVhY3V0ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLAotICAidWdyYXZlIiwgInlhY3V0ZSIsICJ5ZGllcmVzaXMiLCAiemNhcm9uIiwgImV4Y2xhbXNtYWxsIiwKLQotICAjIDIzMAotICAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLAotICAgICJBY3V0ZXNtYWxsIiwKLSAgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsCi0gICAgIm9uZWRvdGVubGVhZGVyIiwgInplcm9vbGRzdHlsZSIsCi0KLSAgIyAyNDAKLSAgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwKLSAgICAiZml2ZW9sZHN0eWxlIiwKLSAgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLAotICAgICJjb21tYXN1cGVyaW9yIiwKLQotICAjIDI1MAotICAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsCi0gICAgImJzdXBlcmlvciIsCi0gICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICJpc3VwZXJpb3IiLCAibHN1cGVyaW9yIiwKLQotICAjIDI2MAotICAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInNzdXBlcmlvciIsCi0gICJ0c3VwZXJpb3IiLCAiZmYiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsCi0KLSAgIyAyNzAKLSAgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsCi0gICAgIkFzbWFsbCIsCi0gICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwKLQotICAjIDI4MAotICAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsCi0gICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwKLQotICAjIDI5MAotICAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsCi0gICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwKLQotICAjIDMwMAotICAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiZXhjbGFtZG93bnNtYWxsIiwKLSAgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsCi0gICAgIkRpZXJlc2lzc21hbGwiLAotCi0gICMgMzEwCi0gICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsCi0gICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwKLSAgICAicXVlc3Rpb25kb3duc21hbGwiLAotCi0gICMgMzIwCi0gICJvbmVlaWdodGgiLCAidGhyZWVlaWdodGhzIiwgImZpdmVlaWdodGhzIiwgInNldmVuZWlnaHRocyIsICJvbmV0aGlyZCIsCi0gICJ0d290aGlyZHMiLCAiemVyb3N1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLAotICAgICJzaXhzdXBlcmlvciIsCi0KLSAgIyAzMzAKLSAgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwKLSAgICAib25laW5mZXJpb3IiLAotICAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwKLSAgICAic2l4aW5mZXJpb3IiLAotCi0gICMgMzQwCi0gICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsCi0gICAgImRvbGxhcmluZmVyaW9yIiwKLSAgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLAotICAgICJBY2lyY3VtZmxleHNtYWxsIiwKLQotICAjIDM1MAotICAiQXRpbGRlc21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXJpbmdzbWFsbCIsICJBRXNtYWxsIiwgIkNjZWRpbGxhc21hbGwiLAotICAiRWdyYXZlc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsCi0gICAgIklncmF2ZXNtYWxsIiwKLQotICAjIDM2MAotICAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsCi0gICAgIk50aWxkZXNtYWxsIiwKLSAgIk9ncmF2ZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT3RpbGRlc21hbGwiLAotICAgICJPZGllcmVzaXNzbWFsbCIsCi0KLSAgIyAzNzAKLSAgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLAotICAgICJVY2lyY3VtZmxleHNtYWxsIiwKLSAgIlVkaWVyZXNpc3NtYWxsIiwgIllhY3V0ZXNtYWxsIiwgIlRob3Juc21hbGwiLCAiWWRpZXJlc2lzc21hbGwiLAotICAgICIwMDEuMDAwIiwKLQotICAjIDM4MAotICAiMDAxLjAwMSIsICIwMDEuMDAyIiwgIjAwMS4wMDMiLCAiQmxhY2siLCAiQm9sZCIsCi0gICJCb29rIiwgIkxpZ2h0IiwgIk1lZGl1bSIsICJSZWd1bGFyIiwgIlJvbWFuIiwKLQotICAjIDM5MAotICAiU2VtaWJvbGQiCi1dCi0KLQotIyBUaGlzIHRhYmxlIG1hcHMgY2hhcmFjdGVyIGNvZGVzIG9mIHRoZSBBZG9iZSBTdGFuZGFyZCBUeXBlIDEKLSMgZW5jb2RpbmcgdG8gZ2x5cGggaW5kaWNlcyBpbiB0aGUgc2lkX3N0YW5kYXJkX25hbWVzIHRhYmxlLgotIwotdDFfc3RhbmRhcmRfZW5jb2RpbmcgPSBcCi1bCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwKLSAgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LAotCi0gICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwKLSAgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LAotICAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsCi0gICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwKLSAgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsICA2NywgIDY4LAotCi0gICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwKLSAgIDc5LCAgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LAotICAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LAotICAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAgIDAsIDExMSwgMTEyLCAxMTMsCi0gIDExNCwgICAwLCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwKLSAgICAwLCAxMjMsICAgMCwgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAotCi0gIDEzMSwgICAwLCAxMzIsIDEzMywgICAwLCAxMzQsIDEzNSwgMTM2LCAxMzcsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTM4LCAgIDAsIDEzOSwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAxNDAsIDE0MSwgMTQyLCAxNDMsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAxNDQsICAgMCwgICAwLCAgIDAsIDE0NSwgICAwLCAgIDAsIDE0NiwgMTQ3LAotCi0gIDE0OCwgMTQ5LCAgIDAsICAgMCwgICAwLCAgIDAKLV0KLQotCi0jIFRoaXMgdGFibGUgbWFwcyBjaGFyYWN0ZXIgY29kZXMgb2YgdGhlIEFkb2JlIEV4cGVydCBUeXBlIDEKLSMgZW5jb2RpbmcgdG8gZ2x5cGggaW5kaWNlcyBpbiB0aGUgc2lkX3N0YW5kYXJkX25hbWVzIHRhYmxlLgotIwotdDFfZXhwZXJ0X2VuY29kaW5nID0gXAotWwotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDAsICAgMCwgICAxLCAyMjksIDIzMCwgICAwLCAyMzEsIDIzMiwgMjMzLCAyMzQsCi0gIDIzNSwgMjM2LCAyMzcsIDIzOCwgIDEzLCAgMTQsICAxNSwgIDk5LCAyMzksIDI0MCwKLQotICAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgIDI3LCAgMjgsCi0gIDI0OSwgMjUwLCAyNTEsIDI1MiwgICAwLCAyNTMsIDI1NCwgMjU1LCAyNTYsIDI1NywKLSAgICAwLCAgIDAsICAgMCwgMjU4LCAgIDAsICAgMCwgMjU5LCAyNjAsIDI2MSwgMjYyLAotICAgIDAsICAgMCwgMjYzLCAyNjQsIDI2NSwgICAwLCAyNjYsIDEwOSwgMTEwLCAyNjcsCi0gIDI2OCwgMjY5LCAgIDAsIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwKLQotICAyNzcsIDI3OCwgMjc5LCAyODAsIDI4MSwgMjgyLCAyODMsIDI4NCwgMjg1LCAyODYsCi0gIDI4NywgMjg4LCAyODksIDI5MCwgMjkxLCAyOTIsIDI5MywgMjk0LCAyOTUsIDI5NiwKLSAgMjk3LCAyOTgsIDI5OSwgMzAwLCAzMDEsIDMwMiwgMzAzLCAgIDAsICAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLQotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgMzA0LCAzMDUsIDMwNiwgICAwLCAgIDAsIDMwNywgMzA4LCAzMDksIDMxMCwKLSAgMzExLCAgIDAsIDMxMiwgICAwLCAgIDAsIDMxMywgICAwLCAgIDAsIDMxNCwgMzE1LAotICAgIDAsICAgMCwgMzE2LCAzMTcsIDMxOCwgICAwLCAgIDAsICAgMCwgMTU4LCAxNTUsCi0gIDE2MywgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAgIDAsICAgMCwKLQotICAzMjYsIDE1MCwgMTY0LCAxNjksIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsCi0gIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwKLSAgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLAotICAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsCi0gIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwKLQotICAzNzMsIDM3NCwgMzc1LCAzNzYsIDM3NywgMzc4Ci1dCi0KLQotIyBUaGlzIGRhdGEgaGFzIGJlZW4gdGFrZW4gbGl0ZXJhbGx5IGZyb20gdGhlIGZpbGVzIGBnbHlwaGxpc3QudHh0JwotIyBhbmQgYHphcGZkaW5nYmF0cy50eHQnIHZlcnNpb24gMi4wLCBTZXB0IDIwMDIuICBJdCBpcyBhdmFpbGFibGUgZnJvbQotIwotIyAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hZG9iZS10eXBlLXRvb2xzL2FnbC1hZ2xmbgotIwotYWRvYmVfZ2x5cGhfbGlzdCA9ICIiIlwKLUE7MDA0MQotQUU7MDBDNgotQUVhY3V0ZTswMUZDCi1BRW1hY3JvbjswMUUyCi1BRXNtYWxsO0Y3RTYKLUFhY3V0ZTswMEMxCi1BYWN1dGVzbWFsbDtGN0UxCi1BYnJldmU7MDEwMgotQWJyZXZlYWN1dGU7MUVBRQotQWJyZXZlY3lyaWxsaWM7MDREMAotQWJyZXZlZG90YmVsb3c7MUVCNgotQWJyZXZlZ3JhdmU7MUVCMAotQWJyZXZlaG9va2Fib3ZlOzFFQjIKLUFicmV2ZXRpbGRlOzFFQjQKLUFjYXJvbjswMUNECi1BY2lyY2xlOzI0QjYKLUFjaXJjdW1mbGV4OzAwQzIKLUFjaXJjdW1mbGV4YWN1dGU7MUVBNAotQWNpcmN1bWZsZXhkb3RiZWxvdzsxRUFDCi1BY2lyY3VtZmxleGdyYXZlOzFFQTYKLUFjaXJjdW1mbGV4aG9va2Fib3ZlOzFFQTgKLUFjaXJjdW1mbGV4c21hbGw7RjdFMgotQWNpcmN1bWZsZXh0aWxkZTsxRUFBCi1BY3V0ZTtGNkM5Ci1BY3V0ZXNtYWxsO0Y3QjQKLUFjeXJpbGxpYzswNDEwCi1BZGJsZ3JhdmU7MDIwMAotQWRpZXJlc2lzOzAwQzQKLUFkaWVyZXNpc2N5cmlsbGljOzA0RDIKLUFkaWVyZXNpc21hY3JvbjswMURFCi1BZGllcmVzaXNzbWFsbDtGN0U0Ci1BZG90YmVsb3c7MUVBMAotQWRvdG1hY3JvbjswMUUwCi1BZ3JhdmU7MDBDMAotQWdyYXZlc21hbGw7RjdFMAotQWhvb2thYm92ZTsxRUEyCi1BaWVjeXJpbGxpYzswNEQ0Ci1BaW52ZXJ0ZWRicmV2ZTswMjAyCi1BbHBoYTswMzkxCi1BbHBoYXRvbm9zOzAzODYKLUFtYWNyb247MDEwMAotQW1vbm9zcGFjZTtGRjIxCi1Bb2dvbmVrOzAxMDQKLUFyaW5nOzAwQzUKLUFyaW5nYWN1dGU7MDFGQQotQXJpbmdiZWxvdzsxRTAwCi1BcmluZ3NtYWxsO0Y3RTUKLUFzbWFsbDtGNzYxCi1BdGlsZGU7MDBDMwotQXRpbGRlc21hbGw7RjdFMwotQXliYXJtZW5pYW47MDUzMQotQjswMDQyCi1CY2lyY2xlOzI0QjcKLUJkb3RhY2NlbnQ7MUUwMgotQmRvdGJlbG93OzFFMDQKLUJlY3lyaWxsaWM7MDQxMQotQmVuYXJtZW5pYW47MDUzMgotQmV0YTswMzkyCi1CaG9vazswMTgxCi1CbGluZWJlbG93OzFFMDYKLUJtb25vc3BhY2U7RkYyMgotQnJldmVzbWFsbDtGNkY0Ci1Cc21hbGw7Rjc2MgotQnRvcGJhcjswMTgyCi1DOzAwNDMKLUNhYXJtZW5pYW47MDUzRQotQ2FjdXRlOzAxMDYKLUNhcm9uO0Y2Q0EKLUNhcm9uc21hbGw7RjZGNQotQ2Nhcm9uOzAxMEMKLUNjZWRpbGxhOzAwQzcKLUNjZWRpbGxhYWN1dGU7MUUwOAotQ2NlZGlsbGFzbWFsbDtGN0U3Ci1DY2lyY2xlOzI0QjgKLUNjaXJjdW1mbGV4OzAxMDgKLUNkb3Q7MDEwQQotQ2RvdGFjY2VudDswMTBBCi1DZWRpbGxhc21hbGw7RjdCOAotQ2hhYXJtZW5pYW47MDU0OQotQ2hlYWJraGFzaWFuY3lyaWxsaWM7MDRCQwotQ2hlY3lyaWxsaWM7MDQyNwotQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWM7MDRCRQotQ2hlZGVzY2VuZGVyY3lyaWxsaWM7MDRCNgotQ2hlZGllcmVzaXNjeXJpbGxpYzswNEY0Ci1DaGVoYXJtZW5pYW47MDU0MwotQ2hla2hha2Fzc2lhbmN5cmlsbGljOzA0Q0IKLUNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM7MDRCOAotQ2hpOzAzQTcKLUNob29rOzAxODcKLUNpcmN1bWZsZXhzbWFsbDtGNkY2Ci1DbW9ub3NwYWNlO0ZGMjMKLUNvYXJtZW5pYW47MDU1MQotQ3NtYWxsO0Y3NjMKLUQ7MDA0NAotRFo7MDFGMQotRFpjYXJvbjswMUM0Ci1EYWFybWVuaWFuOzA1MzQKLURhZnJpY2FuOzAxODkKLURjYXJvbjswMTBFCi1EY2VkaWxsYTsxRTEwCi1EY2lyY2xlOzI0QjkKLURjaXJjdW1mbGV4YmVsb3c7MUUxMgotRGNyb2F0OzAxMTAKLURkb3RhY2NlbnQ7MUUwQQotRGRvdGJlbG93OzFFMEMKLURlY3lyaWxsaWM7MDQxNAotRGVpY29wdGljOzAzRUUKLURlbHRhOzIyMDYKLURlbHRhZ3JlZWs7MDM5NAotRGhvb2s7MDE4QQotRGllcmVzaXM7RjZDQgotRGllcmVzaXNBY3V0ZTtGNkNDCi1EaWVyZXNpc0dyYXZlO0Y2Q0QKLURpZXJlc2lzc21hbGw7RjdBOAotRGlnYW1tYWdyZWVrOzAzREMKLURqZWN5cmlsbGljOzA0MDIKLURsaW5lYmVsb3c7MUUwRQotRG1vbm9zcGFjZTtGRjI0Ci1Eb3RhY2NlbnRzbWFsbDtGNkY3Ci1Ec2xhc2g7MDExMAotRHNtYWxsO0Y3NjQKLUR0b3BiYXI7MDE4QgotRHo7MDFGMgotRHpjYXJvbjswMUM1Ci1EemVhYmtoYXNpYW5jeXJpbGxpYzswNEUwCi1EemVjeXJpbGxpYzswNDA1Ci1EemhlY3lyaWxsaWM7MDQwRgotRTswMDQ1Ci1FYWN1dGU7MDBDOQotRWFjdXRlc21hbGw7RjdFOQotRWJyZXZlOzAxMTQKLUVjYXJvbjswMTFBCi1FY2VkaWxsYWJyZXZlOzFFMUMKLUVjaGFybWVuaWFuOzA1MzUKLUVjaXJjbGU7MjRCQQotRWNpcmN1bWZsZXg7MDBDQQotRWNpcmN1bWZsZXhhY3V0ZTsxRUJFCi1FY2lyY3VtZmxleGJlbG93OzFFMTgKLUVjaXJjdW1mbGV4ZG90YmVsb3c7MUVDNgotRWNpcmN1bWZsZXhncmF2ZTsxRUMwCi1FY2lyY3VtZmxleGhvb2thYm92ZTsxRUMyCi1FY2lyY3VtZmxleHNtYWxsO0Y3RUEKLUVjaXJjdW1mbGV4dGlsZGU7MUVDNAotRWN5cmlsbGljOzA0MDQKLUVkYmxncmF2ZTswMjA0Ci1FZGllcmVzaXM7MDBDQgotRWRpZXJlc2lzc21hbGw7RjdFQgotRWRvdDswMTE2Ci1FZG90YWNjZW50OzAxMTYKLUVkb3RiZWxvdzsxRUI4Ci1FZmN5cmlsbGljOzA0MjQKLUVncmF2ZTswMEM4Ci1FZ3JhdmVzbWFsbDtGN0U4Ci1FaGFybWVuaWFuOzA1MzcKLUVob29rYWJvdmU7MUVCQQotRWlnaHRyb21hbjsyMTY3Ci1FaW52ZXJ0ZWRicmV2ZTswMjA2Ci1FaW90aWZpZWRjeXJpbGxpYzswNDY0Ci1FbGN5cmlsbGljOzA0MUIKLUVsZXZlbnJvbWFuOzIxNkEKLUVtYWNyb247MDExMgotRW1hY3JvbmFjdXRlOzFFMTYKLUVtYWNyb25ncmF2ZTsxRTE0Ci1FbWN5cmlsbGljOzA0MUMKLUVtb25vc3BhY2U7RkYyNQotRW5jeXJpbGxpYzswNDFECi1FbmRlc2NlbmRlcmN5cmlsbGljOzA0QTIKLUVuZzswMTRBCi1FbmdoZWN5cmlsbGljOzA0QTQKLUVuaG9va2N5cmlsbGljOzA0QzcKLUVvZ29uZWs7MDExOAotRW9wZW47MDE5MAotRXBzaWxvbjswMzk1Ci1FcHNpbG9udG9ub3M7MDM4OAotRXJjeXJpbGxpYzswNDIwCi1FcmV2ZXJzZWQ7MDE4RQotRXJldmVyc2VkY3lyaWxsaWM7MDQyRAotRXNjeXJpbGxpYzswNDIxCi1Fc2Rlc2NlbmRlcmN5cmlsbGljOzA0QUEKLUVzaDswMUE5Ci1Fc21hbGw7Rjc2NQotRXRhOzAzOTcKLUV0YXJtZW5pYW47MDUzOAotRXRhdG9ub3M7MDM4OQotRXRoOzAwRDAKLUV0aHNtYWxsO0Y3RjAKLUV0aWxkZTsxRUJDCi1FdGlsZGViZWxvdzsxRTFBCi1FdXJvOzIwQUMKLUV6aDswMUI3Ci1FemhjYXJvbjswMUVFCi1FemhyZXZlcnNlZDswMUI4Ci1GOzAwNDYKLUZjaXJjbGU7MjRCQgotRmRvdGFjY2VudDsxRTFFCi1GZWhhcm1lbmlhbjswNTU2Ci1GZWljb3B0aWM7MDNFNAotRmhvb2s7MDE5MQotRml0YWN5cmlsbGljOzA0NzIKLUZpdmVyb21hbjsyMTY0Ci1GbW9ub3NwYWNlO0ZGMjYKLUZvdXJyb21hbjsyMTYzCi1Gc21hbGw7Rjc2NgotRzswMDQ3Ci1HQnNxdWFyZTszMzg3Ci1HYWN1dGU7MDFGNAotR2FtbWE7MDM5MwotR2FtbWFhZnJpY2FuOzAxOTQKLUdhbmdpYWNvcHRpYzswM0VBCi1HYnJldmU7MDExRQotR2Nhcm9uOzAxRTYKLUdjZWRpbGxhOzAxMjIKLUdjaXJjbGU7MjRCQwotR2NpcmN1bWZsZXg7MDExQwotR2NvbW1hYWNjZW50OzAxMjIKLUdkb3Q7MDEyMAotR2RvdGFjY2VudDswMTIwCi1HZWN5cmlsbGljOzA0MTMKLUdoYWRhcm1lbmlhbjswNTQyCi1HaGVtaWRkbGVob29rY3lyaWxsaWM7MDQ5NAotR2hlc3Ryb2tlY3lyaWxsaWM7MDQ5MgotR2hldXB0dXJuY3lyaWxsaWM7MDQ5MAotR2hvb2s7MDE5MwotR2ltYXJtZW5pYW47MDUzMwotR2plY3lyaWxsaWM7MDQwMwotR21hY3JvbjsxRTIwCi1HbW9ub3NwYWNlO0ZGMjcKLUdyYXZlO0Y2Q0UKLUdyYXZlc21hbGw7Rjc2MAotR3NtYWxsO0Y3NjcKLUdzbWFsbGhvb2s7MDI5QgotR3N0cm9rZTswMUU0Ci1IOzAwNDgKLUgxODUzMzsyNUNGCi1IMTg1NDM7MjVBQQotSDE4NTUxOzI1QUIKLUgyMjA3MzsyNUExCi1IUHNxdWFyZTszM0NCCi1IYWFia2hhc2lhbmN5cmlsbGljOzA0QTgKLUhhZGVzY2VuZGVyY3lyaWxsaWM7MDRCMgotSGFyZHNpZ25jeXJpbGxpYzswNDJBCi1IYmFyOzAxMjYKLUhicmV2ZWJlbG93OzFFMkEKLUhjZWRpbGxhOzFFMjgKLUhjaXJjbGU7MjRCRAotSGNpcmN1bWZsZXg7MDEyNAotSGRpZXJlc2lzOzFFMjYKLUhkb3RhY2NlbnQ7MUUyMgotSGRvdGJlbG93OzFFMjQKLUhtb25vc3BhY2U7RkYyOAotSG9hcm1lbmlhbjswNTQwCi1Ib3JpY29wdGljOzAzRTgKLUhzbWFsbDtGNzY4Ci1IdW5nYXJ1bWxhdXQ7RjZDRgotSHVuZ2FydW1sYXV0c21hbGw7RjZGOAotSHpzcXVhcmU7MzM5MAotSTswMDQ5Ci1JQWN5cmlsbGljOzA0MkYKLUlKOzAxMzIKLUlVY3lyaWxsaWM7MDQyRQotSWFjdXRlOzAwQ0QKLUlhY3V0ZXNtYWxsO0Y3RUQKLUlicmV2ZTswMTJDCi1JY2Fyb247MDFDRgotSWNpcmNsZTsyNEJFCi1JY2lyY3VtZmxleDswMENFCi1JY2lyY3VtZmxleHNtYWxsO0Y3RUUKLUljeXJpbGxpYzswNDA2Ci1JZGJsZ3JhdmU7MDIwOAotSWRpZXJlc2lzOzAwQ0YKLUlkaWVyZXNpc2FjdXRlOzFFMkUKLUlkaWVyZXNpc2N5cmlsbGljOzA0RTQKLUlkaWVyZXNpc3NtYWxsO0Y3RUYKLUlkb3Q7MDEzMAotSWRvdGFjY2VudDswMTMwCi1JZG90YmVsb3c7MUVDQQotSWVicmV2ZWN5cmlsbGljOzA0RDYKLUllY3lyaWxsaWM7MDQxNQotSWZyYWt0dXI7MjExMQotSWdyYXZlOzAwQ0MKLUlncmF2ZXNtYWxsO0Y3RUMKLUlob29rYWJvdmU7MUVDOAotSWljeXJpbGxpYzswNDE4Ci1JaW52ZXJ0ZWRicmV2ZTswMjBBCi1JaXNob3J0Y3lyaWxsaWM7MDQxOQotSW1hY3JvbjswMTJBCi1JbWFjcm9uY3lyaWxsaWM7MDRFMgotSW1vbm9zcGFjZTtGRjI5Ci1Jbmlhcm1lbmlhbjswNTNCCi1Jb2N5cmlsbGljOzA0MDEKLUlvZ29uZWs7MDEyRQotSW90YTswMzk5Ci1Jb3RhYWZyaWNhbjswMTk2Ci1Jb3RhZGllcmVzaXM7MDNBQQotSW90YXRvbm9zOzAzOEEKLUlzbWFsbDtGNzY5Ci1Jc3Ryb2tlOzAxOTcKLUl0aWxkZTswMTI4Ci1JdGlsZGViZWxvdzsxRTJDCi1JemhpdHNhY3lyaWxsaWM7MDQ3NAotSXpoaXRzYWRibGdyYXZlY3lyaWxsaWM7MDQ3NgotSjswMDRBCi1KYWFybWVuaWFuOzA1NDEKLUpjaXJjbGU7MjRCRgotSmNpcmN1bWZsZXg7MDEzNAotSmVjeXJpbGxpYzswNDA4Ci1KaGVoYXJtZW5pYW47MDU0QgotSm1vbm9zcGFjZTtGRjJBCi1Kc21hbGw7Rjc2QQotSzswMDRCCi1LQnNxdWFyZTszMzg1Ci1LS3NxdWFyZTszM0NECi1LYWJhc2hraXJjeXJpbGxpYzswNEEwCi1LYWN1dGU7MUUzMAotS2FjeXJpbGxpYzswNDFBCi1LYWRlc2NlbmRlcmN5cmlsbGljOzA0OUEKLUthaG9va2N5cmlsbGljOzA0QzMKLUthcHBhOzAzOUEKLUthc3Ryb2tlY3lyaWxsaWM7MDQ5RQotS2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljOzA0OUMKLUtjYXJvbjswMUU4Ci1LY2VkaWxsYTswMTM2Ci1LY2lyY2xlOzI0QzAKLUtjb21tYWFjY2VudDswMTM2Ci1LZG90YmVsb3c7MUUzMgotS2VoYXJtZW5pYW47MDU1NAotS2VuYXJtZW5pYW47MDUzRgotS2hhY3lyaWxsaWM7MDQyNQotS2hlaWNvcHRpYzswM0U2Ci1LaG9vazswMTk4Ci1LamVjeXJpbGxpYzswNDBDCi1LbGluZWJlbG93OzFFMzQKLUttb25vc3BhY2U7RkYyQgotS29wcGFjeXJpbGxpYzswNDgwCi1Lb3BwYWdyZWVrOzAzREUKLUtzaWN5cmlsbGljOzA0NkUKLUtzbWFsbDtGNzZCCi1MOzAwNEMKLUxKOzAxQzcKLUxMO0Y2QkYKLUxhY3V0ZTswMTM5Ci1MYW1iZGE7MDM5QgotTGNhcm9uOzAxM0QKLUxjZWRpbGxhOzAxM0IKLUxjaXJjbGU7MjRDMQotTGNpcmN1bWZsZXhiZWxvdzsxRTNDCi1MY29tbWFhY2NlbnQ7MDEzQgotTGRvdDswMTNGCi1MZG90YWNjZW50OzAxM0YKLUxkb3RiZWxvdzsxRTM2Ci1MZG90YmVsb3dtYWNyb247MUUzOAotTGl3bmFybWVuaWFuOzA1M0MKLUxqOzAxQzgKLUxqZWN5cmlsbGljOzA0MDkKLUxsaW5lYmVsb3c7MUUzQQotTG1vbm9zcGFjZTtGRjJDCi1Mc2xhc2g7MDE0MQotTHNsYXNoc21hbGw7RjZGOQotTHNtYWxsO0Y3NkMKLU07MDA0RAotTUJzcXVhcmU7MzM4NgotTWFjcm9uO0Y2RDAKLU1hY3JvbnNtYWxsO0Y3QUYKLU1hY3V0ZTsxRTNFCi1NY2lyY2xlOzI0QzIKLU1kb3RhY2NlbnQ7MUU0MAotTWRvdGJlbG93OzFFNDIKLU1lbmFybWVuaWFuOzA1NDQKLU1tb25vc3BhY2U7RkYyRAotTXNtYWxsO0Y3NkQKLU10dXJuZWQ7MDE5QwotTXU7MDM5QwotTjswMDRFCi1OSjswMUNBCi1OYWN1dGU7MDE0MwotTmNhcm9uOzAxNDcKLU5jZWRpbGxhOzAxNDUKLU5jaXJjbGU7MjRDMwotTmNpcmN1bWZsZXhiZWxvdzsxRTRBCi1OY29tbWFhY2NlbnQ7MDE0NQotTmRvdGFjY2VudDsxRTQ0Ci1OZG90YmVsb3c7MUU0NgotTmhvb2tsZWZ0OzAxOUQKLU5pbmVyb21hbjsyMTY4Ci1OajswMUNCCi1OamVjeXJpbGxpYzswNDBBCi1ObGluZWJlbG93OzFFNDgKLU5tb25vc3BhY2U7RkYyRQotTm93YXJtZW5pYW47MDU0NgotTnNtYWxsO0Y3NkUKLU50aWxkZTswMEQxCi1OdGlsZGVzbWFsbDtGN0YxCi1OdTswMzlECi1POzAwNEYKLU9FOzAxNTIKLU9Fc21hbGw7RjZGQQotT2FjdXRlOzAwRDMKLU9hY3V0ZXNtYWxsO0Y3RjMKLU9iYXJyZWRjeXJpbGxpYzswNEU4Ci1PYmFycmVkZGllcmVzaXNjeXJpbGxpYzswNEVBCi1PYnJldmU7MDE0RQotT2Nhcm9uOzAxRDEKLU9jZW50ZXJlZHRpbGRlOzAxOUYKLU9jaXJjbGU7MjRDNAotT2NpcmN1bWZsZXg7MDBENAotT2NpcmN1bWZsZXhhY3V0ZTsxRUQwCi1PY2lyY3VtZmxleGRvdGJlbG93OzFFRDgKLU9jaXJjdW1mbGV4Z3JhdmU7MUVEMgotT2NpcmN1bWZsZXhob29rYWJvdmU7MUVENAotT2NpcmN1bWZsZXhzbWFsbDtGN0Y0Ci1PY2lyY3VtZmxleHRpbGRlOzFFRDYKLU9jeXJpbGxpYzswNDFFCi1PZGJsYWN1dGU7MDE1MAotT2RibGdyYXZlOzAyMEMKLU9kaWVyZXNpczswMEQ2Ci1PZGllcmVzaXNjeXJpbGxpYzswNEU2Ci1PZGllcmVzaXNzbWFsbDtGN0Y2Ci1PZG90YmVsb3c7MUVDQwotT2dvbmVrc21hbGw7RjZGQgotT2dyYXZlOzAwRDIKLU9ncmF2ZXNtYWxsO0Y3RjIKLU9oYXJtZW5pYW47MDU1NQotT2htOzIxMjYKLU9ob29rYWJvdmU7MUVDRQotT2hvcm47MDFBMAotT2hvcm5hY3V0ZTsxRURBCi1PaG9ybmRvdGJlbG93OzFFRTIKLU9ob3JuZ3JhdmU7MUVEQwotT2hvcm5ob29rYWJvdmU7MUVERQotT2hvcm50aWxkZTsxRUUwCi1PaHVuZ2FydW1sYXV0OzAxNTAKLU9pOzAxQTIKLU9pbnZlcnRlZGJyZXZlOzAyMEUKLU9tYWNyb247MDE0QwotT21hY3JvbmFjdXRlOzFFNTIKLU9tYWNyb25ncmF2ZTsxRTUwCi1PbWVnYTsyMTI2Ci1PbWVnYWN5cmlsbGljOzA0NjAKLU9tZWdhZ3JlZWs7MDNBOQotT21lZ2Fyb3VuZGN5cmlsbGljOzA0N0EKLU9tZWdhdGl0bG9jeXJpbGxpYzswNDdDCi1PbWVnYXRvbm9zOzAzOEYKLU9taWNyb247MDM5RgotT21pY3JvbnRvbm9zOzAzOEMKLU9tb25vc3BhY2U7RkYyRgotT25lcm9tYW47MjE2MAotT29nb25lazswMUVBCi1Pb2dvbmVrbWFjcm9uOzAxRUMKLU9vcGVuOzAxODYKLU9zbGFzaDswMEQ4Ci1Pc2xhc2hhY3V0ZTswMUZFCi1Pc2xhc2hzbWFsbDtGN0Y4Ci1Pc21hbGw7Rjc2RgotT3N0cm9rZWFjdXRlOzAxRkUKLU90Y3lyaWxsaWM7MDQ3RQotT3RpbGRlOzAwRDUKLU90aWxkZWFjdXRlOzFFNEMKLU90aWxkZWRpZXJlc2lzOzFFNEUKLU90aWxkZXNtYWxsO0Y3RjUKLVA7MDA1MAotUGFjdXRlOzFFNTQKLVBjaXJjbGU7MjRDNQotUGRvdGFjY2VudDsxRTU2Ci1QZWN5cmlsbGljOzA0MUYKLVBlaGFybWVuaWFuOzA1NEEKLVBlbWlkZGxlaG9va2N5cmlsbGljOzA0QTYKLVBoaTswM0E2Ci1QaG9vazswMUE0Ci1QaTswM0EwCi1QaXdyYXJtZW5pYW47MDU1MwotUG1vbm9zcGFjZTtGRjMwCi1Qc2k7MDNBOAotUHNpY3lyaWxsaWM7MDQ3MAotUHNtYWxsO0Y3NzAKLVE7MDA1MQotUWNpcmNsZTsyNEM2Ci1RbW9ub3NwYWNlO0ZGMzEKLVFzbWFsbDtGNzcxCi1SOzAwNTIKLVJhYXJtZW5pYW47MDU0QwotUmFjdXRlOzAxNTQKLVJjYXJvbjswMTU4Ci1SY2VkaWxsYTswMTU2Ci1SY2lyY2xlOzI0QzcKLVJjb21tYWFjY2VudDswMTU2Ci1SZGJsZ3JhdmU7MDIxMAotUmRvdGFjY2VudDsxRTU4Ci1SZG90YmVsb3c7MUU1QQotUmRvdGJlbG93bWFjcm9uOzFFNUMKLVJlaGFybWVuaWFuOzA1NTAKLVJmcmFrdHVyOzIxMUMKLVJobzswM0ExCi1SaW5nc21hbGw7RjZGQwotUmludmVydGVkYnJldmU7MDIxMgotUmxpbmViZWxvdzsxRTVFCi1SbW9ub3NwYWNlO0ZGMzIKLVJzbWFsbDtGNzcyCi1Sc21hbGxpbnZlcnRlZDswMjgxCi1Sc21hbGxpbnZlcnRlZHN1cGVyaW9yOzAyQjYKLVM7MDA1MwotU0YwMTAwMDA7MjUwQwotU0YwMjAwMDA7MjUxNAotU0YwMzAwMDA7MjUxMAotU0YwNDAwMDA7MjUxOAotU0YwNTAwMDA7MjUzQwotU0YwNjAwMDA7MjUyQwotU0YwNzAwMDA7MjUzNAotU0YwODAwMDA7MjUxQwotU0YwOTAwMDA7MjUyNAotU0YxMDAwMDA7MjUwMAotU0YxMTAwMDA7MjUwMgotU0YxOTAwMDA7MjU2MQotU0YyMDAwMDA7MjU2MgotU0YyMTAwMDA7MjU1NgotU0YyMjAwMDA7MjU1NQotU0YyMzAwMDA7MjU2MwotU0YyNDAwMDA7MjU1MQotU0YyNTAwMDA7MjU1NwotU0YyNjAwMDA7MjU1RAotU0YyNzAwMDA7MjU1QwotU0YyODAwMDA7MjU1QgotU0YzNjAwMDA7MjU1RQotU0YzNzAwMDA7MjU1RgotU0YzODAwMDA7MjU1QQotU0YzOTAwMDA7MjU1NAotU0Y0MDAwMDA7MjU2OQotU0Y0MTAwMDA7MjU2NgotU0Y0MjAwMDA7MjU2MAotU0Y0MzAwMDA7MjU1MAotU0Y0NDAwMDA7MjU2QwotU0Y0NTAwMDA7MjU2NwotU0Y0NjAwMDA7MjU2OAotU0Y0NzAwMDA7MjU2NAotU0Y0ODAwMDA7MjU2NQotU0Y0OTAwMDA7MjU1OQotU0Y1MDAwMDA7MjU1OAotU0Y1MTAwMDA7MjU1MgotU0Y1MjAwMDA7MjU1MwotU0Y1MzAwMDA7MjU2QgotU0Y1NDAwMDA7MjU2QQotU2FjdXRlOzAxNUEKLVNhY3V0ZWRvdGFjY2VudDsxRTY0Ci1TYW1waWdyZWVrOzAzRTAKLVNjYXJvbjswMTYwCi1TY2Fyb25kb3RhY2NlbnQ7MUU2NgotU2Nhcm9uc21hbGw7RjZGRAotU2NlZGlsbGE7MDE1RQotU2Nod2E7MDE4RgotU2Nod2FjeXJpbGxpYzswNEQ4Ci1TY2h3YWRpZXJlc2lzY3lyaWxsaWM7MDREQQotU2NpcmNsZTsyNEM4Ci1TY2lyY3VtZmxleDswMTVDCi1TY29tbWFhY2NlbnQ7MDIxOAotU2RvdGFjY2VudDsxRTYwCi1TZG90YmVsb3c7MUU2MgotU2RvdGJlbG93ZG90YWNjZW50OzFFNjgKLVNlaGFybWVuaWFuOzA1NEQKLVNldmVucm9tYW47MjE2NgotU2hhYXJtZW5pYW47MDU0NwotU2hhY3lyaWxsaWM7MDQyOAotU2hjaGFjeXJpbGxpYzswNDI5Ci1TaGVpY29wdGljOzAzRTIKLVNoaGFjeXJpbGxpYzswNEJBCi1TaGltYWNvcHRpYzswM0VDCi1TaWdtYTswM0EzCi1TaXhyb21hbjsyMTY1Ci1TbW9ub3NwYWNlO0ZGMzMKLVNvZnRzaWduY3lyaWxsaWM7MDQyQwotU3NtYWxsO0Y3NzMKLVN0aWdtYWdyZWVrOzAzREEKLVQ7MDA1NAotVGF1OzAzQTQKLVRiYXI7MDE2NgotVGNhcm9uOzAxNjQKLVRjZWRpbGxhOzAxNjIKLVRjaXJjbGU7MjRDOQotVGNpcmN1bWZsZXhiZWxvdzsxRTcwCi1UY29tbWFhY2NlbnQ7MDE2MgotVGRvdGFjY2VudDsxRTZBCi1UZG90YmVsb3c7MUU2QwotVGVjeXJpbGxpYzswNDIyCi1UZWRlc2NlbmRlcmN5cmlsbGljOzA0QUMKLVRlbnJvbWFuOzIxNjkKLVRldHNlY3lyaWxsaWM7MDRCNAotVGhldGE7MDM5OAotVGhvb2s7MDFBQwotVGhvcm47MDBERQotVGhvcm5zbWFsbDtGN0ZFCi1UaHJlZXJvbWFuOzIxNjIKLVRpbGRlc21hbGw7RjZGRQotVGl3bmFybWVuaWFuOzA1NEYKLVRsaW5lYmVsb3c7MUU2RQotVG1vbm9zcGFjZTtGRjM0Ci1Ub2FybWVuaWFuOzA1MzkKLVRvbmVmaXZlOzAxQkMKLVRvbmVzaXg7MDE4NAotVG9uZXR3bzswMUE3Ci1UcmV0cm9mbGV4aG9vazswMUFFCi1Uc2VjeXJpbGxpYzswNDI2Ci1Uc2hlY3lyaWxsaWM7MDQwQgotVHNtYWxsO0Y3NzQKLVR3ZWx2ZXJvbWFuOzIxNkIKLVR3b3JvbWFuOzIxNjEKLVU7MDA1NQotVWFjdXRlOzAwREEKLVVhY3V0ZXNtYWxsO0Y3RkEKLVVicmV2ZTswMTZDCi1VY2Fyb247MDFEMwotVWNpcmNsZTsyNENBCi1VY2lyY3VtZmxleDswMERCCi1VY2lyY3VtZmxleGJlbG93OzFFNzYKLVVjaXJjdW1mbGV4c21hbGw7RjdGQgotVWN5cmlsbGljOzA0MjMKLVVkYmxhY3V0ZTswMTcwCi1VZGJsZ3JhdmU7MDIxNAotVWRpZXJlc2lzOzAwREMKLVVkaWVyZXNpc2FjdXRlOzAxRDcKLVVkaWVyZXNpc2JlbG93OzFFNzIKLVVkaWVyZXNpc2Nhcm9uOzAxRDkKLVVkaWVyZXNpc2N5cmlsbGljOzA0RjAKLVVkaWVyZXNpc2dyYXZlOzAxREIKLVVkaWVyZXNpc21hY3JvbjswMUQ1Ci1VZGllcmVzaXNzbWFsbDtGN0ZDCi1VZG90YmVsb3c7MUVFNAotVWdyYXZlOzAwRDkKLVVncmF2ZXNtYWxsO0Y3RjkKLVVob29rYWJvdmU7MUVFNgotVWhvcm47MDFBRgotVWhvcm5hY3V0ZTsxRUU4Ci1VaG9ybmRvdGJlbG93OzFFRjAKLVVob3JuZ3JhdmU7MUVFQQotVWhvcm5ob29rYWJvdmU7MUVFQwotVWhvcm50aWxkZTsxRUVFCi1VaHVuZ2FydW1sYXV0OzAxNzAKLVVodW5nYXJ1bWxhdXRjeXJpbGxpYzswNEYyCi1VaW52ZXJ0ZWRicmV2ZTswMjE2Ci1Va2N5cmlsbGljOzA0NzgKLVVtYWNyb247MDE2QQotVW1hY3JvbmN5cmlsbGljOzA0RUUKLVVtYWNyb25kaWVyZXNpczsxRTdBCi1VbW9ub3NwYWNlO0ZGMzUKLVVvZ29uZWs7MDE3MgotVXBzaWxvbjswM0E1Ci1VcHNpbG9uMTswM0QyCi1VcHNpbG9uYWN1dGVob29rc3ltYm9sZ3JlZWs7MDNEMwotVXBzaWxvbmFmcmljYW47MDFCMQotVXBzaWxvbmRpZXJlc2lzOzAzQUIKLVVwc2lsb25kaWVyZXNpc2hvb2tzeW1ib2xncmVlazswM0Q0Ci1VcHNpbG9uaG9va3N5bWJvbDswM0QyCi1VcHNpbG9udG9ub3M7MDM4RQotVXJpbmc7MDE2RQotVXNob3J0Y3lyaWxsaWM7MDQwRQotVXNtYWxsO0Y3NzUKLVVzdHJhaWdodGN5cmlsbGljOzA0QUUKLVVzdHJhaWdodHN0cm9rZWN5cmlsbGljOzA0QjAKLVV0aWxkZTswMTY4Ci1VdGlsZGVhY3V0ZTsxRTc4Ci1VdGlsZGViZWxvdzsxRTc0Ci1WOzAwNTYKLVZjaXJjbGU7MjRDQgotVmRvdGJlbG93OzFFN0UKLVZlY3lyaWxsaWM7MDQxMgotVmV3YXJtZW5pYW47MDU0RQotVmhvb2s7MDFCMgotVm1vbm9zcGFjZTtGRjM2Ci1Wb2FybWVuaWFuOzA1NDgKLVZzbWFsbDtGNzc2Ci1WdGlsZGU7MUU3QwotVzswMDU3Ci1XYWN1dGU7MUU4MgotV2NpcmNsZTsyNENDCi1XY2lyY3VtZmxleDswMTc0Ci1XZGllcmVzaXM7MUU4NAotV2RvdGFjY2VudDsxRTg2Ci1XZG90YmVsb3c7MUU4OAotV2dyYXZlOzFFODAKLVdtb25vc3BhY2U7RkYzNwotV3NtYWxsO0Y3NzcKLVg7MDA1OAotWGNpcmNsZTsyNENECi1YZGllcmVzaXM7MUU4QwotWGRvdGFjY2VudDsxRThBCi1YZWhhcm1lbmlhbjswNTNECi1YaTswMzlFCi1YbW9ub3NwYWNlO0ZGMzgKLVhzbWFsbDtGNzc4Ci1ZOzAwNTkKLVlhY3V0ZTswMERECi1ZYWN1dGVzbWFsbDtGN0ZECi1ZYXRjeXJpbGxpYzswNDYyCi1ZY2lyY2xlOzI0Q0UKLVljaXJjdW1mbGV4OzAxNzYKLVlkaWVyZXNpczswMTc4Ci1ZZGllcmVzaXNzbWFsbDtGN0ZGCi1ZZG90YWNjZW50OzFFOEUKLVlkb3RiZWxvdzsxRUY0Ci1ZZXJpY3lyaWxsaWM7MDQyQgotWWVydWRpZXJlc2lzY3lyaWxsaWM7MDRGOAotWWdyYXZlOzFFRjIKLVlob29rOzAxQjMKLVlob29rYWJvdmU7MUVGNgotWWlhcm1lbmlhbjswNTQ1Ci1ZaWN5cmlsbGljOzA0MDcKLVlpd25hcm1lbmlhbjswNTUyCi1ZbW9ub3NwYWNlO0ZGMzkKLVlzbWFsbDtGNzc5Ci1ZdGlsZGU7MUVGOAotWXVzYmlnY3lyaWxsaWM7MDQ2QQotWXVzYmlnaW90aWZpZWRjeXJpbGxpYzswNDZDCi1ZdXNsaXR0bGVjeXJpbGxpYzswNDY2Ci1ZdXNsaXR0bGVpb3RpZmllZGN5cmlsbGljOzA0NjgKLVo7MDA1QQotWmFhcm1lbmlhbjswNTM2Ci1aYWN1dGU7MDE3OQotWmNhcm9uOzAxN0QKLVpjYXJvbnNtYWxsO0Y2RkYKLVpjaXJjbGU7MjRDRgotWmNpcmN1bWZsZXg7MUU5MAotWmRvdDswMTdCCi1aZG90YWNjZW50OzAxN0IKLVpkb3RiZWxvdzsxRTkyCi1aZWN5cmlsbGljOzA0MTcKLVplZGVzY2VuZGVyY3lyaWxsaWM7MDQ5OAotWmVkaWVyZXNpc2N5cmlsbGljOzA0REUKLVpldGE7MDM5NgotWmhlYXJtZW5pYW47MDUzQQotWmhlYnJldmVjeXJpbGxpYzswNEMxCi1aaGVjeXJpbGxpYzswNDE2Ci1aaGVkZXNjZW5kZXJjeXJpbGxpYzswNDk2Ci1aaGVkaWVyZXNpc2N5cmlsbGljOzA0REMKLVpsaW5lYmVsb3c7MUU5NAotWm1vbm9zcGFjZTtGRjNBCi1ac21hbGw7Rjc3QQotWnN0cm9rZTswMUI1Ci1hOzAwNjEKLWFhYmVuZ2FsaTswOTg2Ci1hYWN1dGU7MDBFMQotYWFkZXZhOzA5MDYKLWFhZ3VqYXJhdGk7MEE4NgotYWFndXJtdWtoaTswQTA2Ci1hYW1hdHJhZ3VybXVraGk7MEEzRQotYWFydXNxdWFyZTszMzAzCi1hYXZvd2Vsc2lnbmJlbmdhbGk7MDlCRQotYWF2b3dlbHNpZ25kZXZhOzA5M0UKLWFhdm93ZWxzaWduZ3VqYXJhdGk7MEFCRQotYWJicmV2aWF0aW9ubWFya2FybWVuaWFuOzA1NUYKLWFiYnJldmlhdGlvbnNpZ25kZXZhOzA5NzAKLWFiZW5nYWxpOzA5ODUKLWFib3BvbW9mbzszMTFBCi1hYnJldmU7MDEwMwotYWJyZXZlYWN1dGU7MUVBRgotYWJyZXZlY3lyaWxsaWM7MDREMQotYWJyZXZlZG90YmVsb3c7MUVCNwotYWJyZXZlZ3JhdmU7MUVCMQotYWJyZXZlaG9va2Fib3ZlOzFFQjMKLWFicmV2ZXRpbGRlOzFFQjUKLWFjYXJvbjswMUNFCi1hY2lyY2xlOzI0RDAKLWFjaXJjdW1mbGV4OzAwRTIKLWFjaXJjdW1mbGV4YWN1dGU7MUVBNQotYWNpcmN1bWZsZXhkb3RiZWxvdzsxRUFECi1hY2lyY3VtZmxleGdyYXZlOzFFQTcKLWFjaXJjdW1mbGV4aG9va2Fib3ZlOzFFQTkKLWFjaXJjdW1mbGV4dGlsZGU7MUVBQgotYWN1dGU7MDBCNAotYWN1dGViZWxvd2NtYjswMzE3Ci1hY3V0ZWNtYjswMzAxCi1hY3V0ZWNvbWI7MDMwMQotYWN1dGVkZXZhOzA5NTQKLWFjdXRlbG93bW9kOzAyQ0YKLWFjdXRldG9uZWNtYjswMzQxCi1hY3lyaWxsaWM7MDQzMAotYWRibGdyYXZlOzAyMDEKLWFkZGFrZ3VybXVraGk7MEE3MQotYWRldmE7MDkwNQotYWRpZXJlc2lzOzAwRTQKLWFkaWVyZXNpc2N5cmlsbGljOzA0RDMKLWFkaWVyZXNpc21hY3JvbjswMURGCi1hZG90YmVsb3c7MUVBMQotYWRvdG1hY3JvbjswMUUxCi1hZTswMEU2Ci1hZWFjdXRlOzAxRkQKLWFla29yZWFuOzMxNTAKLWFlbWFjcm9uOzAxRTMKLWFmaWkwMDIwODsyMDE1Ci1hZmlpMDg5NDE7MjBBNAotYWZpaTEwMDE3OzA0MTAKLWFmaWkxMDAxODswNDExCi1hZmlpMTAwMTk7MDQxMgotYWZpaTEwMDIwOzA0MTMKLWFmaWkxMDAyMTswNDE0Ci1hZmlpMTAwMjI7MDQxNQotYWZpaTEwMDIzOzA0MDEKLWFmaWkxMDAyNDswNDE2Ci1hZmlpMTAwMjU7MDQxNwotYWZpaTEwMDI2OzA0MTgKLWFmaWkxMDAyNzswNDE5Ci1hZmlpMTAwMjg7MDQxQQotYWZpaTEwMDI5OzA0MUIKLWFmaWkxMDAzMDswNDFDCi1hZmlpMTAwMzE7MDQxRAotYWZpaTEwMDMyOzA0MUUKLWFmaWkxMDAzMzswNDFGCi1hZmlpMTAwMzQ7MDQyMAotYWZpaTEwMDM1OzA0MjEKLWFmaWkxMDAzNjswNDIyCi1hZmlpMTAwMzc7MDQyMwotYWZpaTEwMDM4OzA0MjQKLWFmaWkxMDAzOTswNDI1Ci1hZmlpMTAwNDA7MDQyNgotYWZpaTEwMDQxOzA0MjcKLWFmaWkxMDA0MjswNDI4Ci1hZmlpMTAwNDM7MDQyOQotYWZpaTEwMDQ0OzA0MkEKLWFmaWkxMDA0NTswNDJCCi1hZmlpMTAwNDY7MDQyQwotYWZpaTEwMDQ3OzA0MkQKLWFmaWkxMDA0ODswNDJFCi1hZmlpMTAwNDk7MDQyRgotYWZpaTEwMDUwOzA0OTAKLWFmaWkxMDA1MTswNDAyCi1hZmlpMTAwNTI7MDQwMwotYWZpaTEwMDUzOzA0MDQKLWFmaWkxMDA1NDswNDA1Ci1hZmlpMTAwNTU7MDQwNgotYWZpaTEwMDU2OzA0MDcKLWFmaWkxMDA1NzswNDA4Ci1hZmlpMTAwNTg7MDQwOQotYWZpaTEwMDU5OzA0MEEKLWFmaWkxMDA2MDswNDBCCi1hZmlpMTAwNjE7MDQwQwotYWZpaTEwMDYyOzA0MEUKLWFmaWkxMDA2MztGNkM0Ci1hZmlpMTAwNjQ7RjZDNQotYWZpaTEwMDY1OzA0MzAKLWFmaWkxMDA2NjswNDMxCi1hZmlpMTAwNjc7MDQzMgotYWZpaTEwMDY4OzA0MzMKLWFmaWkxMDA2OTswNDM0Ci1hZmlpMTAwNzA7MDQzNQotYWZpaTEwMDcxOzA0NTEKLWFmaWkxMDA3MjswNDM2Ci1hZmlpMTAwNzM7MDQzNwotYWZpaTEwMDc0OzA0MzgKLWFmaWkxMDA3NTswNDM5Ci1hZmlpMTAwNzY7MDQzQQotYWZpaTEwMDc3OzA0M0IKLWFmaWkxMDA3ODswNDNDCi1hZmlpMTAwNzk7MDQzRAotYWZpaTEwMDgwOzA0M0UKLWFmaWkxMDA4MTswNDNGCi1hZmlpMTAwODI7MDQ0MAotYWZpaTEwMDgzOzA0NDEKLWFmaWkxMDA4NDswNDQyCi1hZmlpMTAwODU7MDQ0MwotYWZpaTEwMDg2OzA0NDQKLWFmaWkxMDA4NzswNDQ1Ci1hZmlpMTAwODg7MDQ0NgotYWZpaTEwMDg5OzA0NDcKLWFmaWkxMDA5MDswNDQ4Ci1hZmlpMTAwOTE7MDQ0OQotYWZpaTEwMDkyOzA0NEEKLWFmaWkxMDA5MzswNDRCCi1hZmlpMTAwOTQ7MDQ0QwotYWZpaTEwMDk1OzA0NEQKLWFmaWkxMDA5NjswNDRFCi1hZmlpMTAwOTc7MDQ0RgotYWZpaTEwMDk4OzA0OTEKLWFmaWkxMDA5OTswNDUyCi1hZmlpMTAxMDA7MDQ1MwotYWZpaTEwMTAxOzA0NTQKLWFmaWkxMDEwMjswNDU1Ci1hZmlpMTAxMDM7MDQ1NgotYWZpaTEwMTA0OzA0NTcKLWFmaWkxMDEwNTswNDU4Ci1hZmlpMTAxMDY7MDQ1OQotYWZpaTEwMTA3OzA0NUEKLWFmaWkxMDEwODswNDVCCi1hZmlpMTAxMDk7MDQ1QwotYWZpaTEwMTEwOzA0NUUKLWFmaWkxMDE0NTswNDBGCi1hZmlpMTAxNDY7MDQ2MgotYWZpaTEwMTQ3OzA0NzIKLWFmaWkxMDE0ODswNDc0Ci1hZmlpMTAxOTI7RjZDNgotYWZpaTEwMTkzOzA0NUYKLWFmaWkxMDE5NDswNDYzCi1hZmlpMTAxOTU7MDQ3MwotYWZpaTEwMTk2OzA0NzUKLWFmaWkxMDgzMTtGNkM3Ci1hZmlpMTA4MzI7RjZDOAotYWZpaTEwODQ2OzA0RDkKLWFmaWkyOTk7MjAwRQotYWZpaTMwMDsyMDBGCi1hZmlpMzAxOzIwMEQKLWFmaWk1NzM4MTswNjZBCi1hZmlpNTczODg7MDYwQwotYWZpaTU3MzkyOzA2NjAKLWFmaWk1NzM5MzswNjYxCi1hZmlpNTczOTQ7MDY2MgotYWZpaTU3Mzk1OzA2NjMKLWFmaWk1NzM5NjswNjY0Ci1hZmlpNTczOTc7MDY2NQotYWZpaTU3Mzk4OzA2NjYKLWFmaWk1NzM5OTswNjY3Ci1hZmlpNTc0MDA7MDY2OAotYWZpaTU3NDAxOzA2NjkKLWFmaWk1NzQwMzswNjFCCi1hZmlpNTc0MDc7MDYxRgotYWZpaTU3NDA5OzA2MjEKLWFmaWk1NzQxMDswNjIyCi1hZmlpNTc0MTE7MDYyMwotYWZpaTU3NDEyOzA2MjQKLWFmaWk1NzQxMzswNjI1Ci1hZmlpNTc0MTQ7MDYyNgotYWZpaTU3NDE1OzA2MjcKLWFmaWk1NzQxNjswNjI4Ci1hZmlpNTc0MTc7MDYyOQotYWZpaTU3NDE4OzA2MkEKLWFmaWk1NzQxOTswNjJCCi1hZmlpNTc0MjA7MDYyQwotYWZpaTU3NDIxOzA2MkQKLWFmaWk1NzQyMjswNjJFCi1hZmlpNTc0MjM7MDYyRgotYWZpaTU3NDI0OzA2MzAKLWFmaWk1NzQyNTswNjMxCi1hZmlpNTc0MjY7MDYzMgotYWZpaTU3NDI3OzA2MzMKLWFmaWk1NzQyODswNjM0Ci1hZmlpNTc0Mjk7MDYzNQotYWZpaTU3NDMwOzA2MzYKLWFmaWk1NzQzMTswNjM3Ci1hZmlpNTc0MzI7MDYzOAotYWZpaTU3NDMzOzA2MzkKLWFmaWk1NzQzNDswNjNBCi1hZmlpNTc0NDA7MDY0MAotYWZpaTU3NDQxOzA2NDEKLWFmaWk1NzQ0MjswNjQyCi1hZmlpNTc0NDM7MDY0MwotYWZpaTU3NDQ0OzA2NDQKLWFmaWk1NzQ0NTswNjQ1Ci1hZmlpNTc0NDY7MDY0NgotYWZpaTU3NDQ4OzA2NDgKLWFmaWk1NzQ0OTswNjQ5Ci1hZmlpNTc0NTA7MDY0QQotYWZpaTU3NDUxOzA2NEIKLWFmaWk1NzQ1MjswNjRDCi1hZmlpNTc0NTM7MDY0RAotYWZpaTU3NDU0OzA2NEUKLWFmaWk1NzQ1NTswNjRGCi1hZmlpNTc0NTY7MDY1MAotYWZpaTU3NDU3OzA2NTEKLWFmaWk1NzQ1ODswNjUyCi1hZmlpNTc0NzA7MDY0NwotYWZpaTU3NTA1OzA2QTQKLWFmaWk1NzUwNjswNjdFCi1hZmlpNTc1MDc7MDY4NgotYWZpaTU3NTA4OzA2OTgKLWFmaWk1NzUwOTswNkFGCi1hZmlpNTc1MTE7MDY3OQotYWZpaTU3NTEyOzA2ODgKLWFmaWk1NzUxMzswNjkxCi1hZmlpNTc1MTQ7MDZCQQotYWZpaTU3NTE5OzA2RDIKLWFmaWk1NzUzNDswNkQ1Ci1hZmlpNTc2MzY7MjBBQQotYWZpaTU3NjQ1OzA1QkUKLWFmaWk1NzY1ODswNUMzCi1hZmlpNTc2NjQ7MDVEMAotYWZpaTU3NjY1OzA1RDEKLWFmaWk1NzY2NjswNUQyCi1hZmlpNTc2Njc7MDVEMwotYWZpaTU3NjY4OzA1RDQKLWFmaWk1NzY2OTswNUQ1Ci1hZmlpNTc2NzA7MDVENgotYWZpaTU3NjcxOzA1RDcKLWFmaWk1NzY3MjswNUQ4Ci1hZmlpNTc2NzM7MDVEOQotYWZpaTU3Njc0OzA1REEKLWFmaWk1NzY3NTswNURCCi1hZmlpNTc2NzY7MDVEQwotYWZpaTU3Njc3OzA1REQKLWFmaWk1NzY3ODswNURFCi1hZmlpNTc2Nzk7MDVERgotYWZpaTU3NjgwOzA1RTAKLWFmaWk1NzY4MTswNUUxCi1hZmlpNTc2ODI7MDVFMgotYWZpaTU3NjgzOzA1RTMKLWFmaWk1NzY4NDswNUU0Ci1hZmlpNTc2ODU7MDVFNQotYWZpaTU3Njg2OzA1RTYKLWFmaWk1NzY4NzswNUU3Ci1hZmlpNTc2ODg7MDVFOAotYWZpaTU3Njg5OzA1RTkKLWFmaWk1NzY5MDswNUVBCi1hZmlpNTc2OTQ7RkIyQQotYWZpaTU3Njk1O0ZCMkIKLWFmaWk1NzcwMDtGQjRCCi1hZmlpNTc3MDU7RkIxRgotYWZpaTU3NzE2OzA1RjAKLWFmaWk1NzcxNzswNUYxCi1hZmlpNTc3MTg7MDVGMgotYWZpaTU3NzIzO0ZCMzUKLWFmaWk1Nzc5MzswNUI0Ci1hZmlpNTc3OTQ7MDVCNQotYWZpaTU3Nzk1OzA1QjYKLWFmaWk1Nzc5NjswNUJCCi1hZmlpNTc3OTc7MDVCOAotYWZpaTU3Nzk4OzA1QjcKLWFmaWk1Nzc5OTswNUIwCi1hZmlpNTc4MDA7MDVCMgotYWZpaTU3ODAxOzA1QjEKLWFmaWk1NzgwMjswNUIzCi1hZmlpNTc4MDM7MDVDMgotYWZpaTU3ODA0OzA1QzEKLWFmaWk1NzgwNjswNUI5Ci1hZmlpNTc4MDc7MDVCQwotYWZpaTU3ODM5OzA1QkQKLWFmaWk1Nzg0MTswNUJGCi1hZmlpNTc4NDI7MDVDMAotYWZpaTU3OTI5OzAyQkMKLWFmaWk2MTI0ODsyMTA1Ci1hZmlpNjEyODk7MjExMwotYWZpaTYxMzUyOzIxMTYKLWFmaWk2MTU3MzsyMDJDCi1hZmlpNjE1NzQ7MjAyRAotYWZpaTYxNTc1OzIwMkUKLWFmaWk2MTY2NDsyMDBDCi1hZmlpNjMxNjc7MDY2RAotYWZpaTY0OTM3OzAyQkQKLWFncmF2ZTswMEUwCi1hZ3VqYXJhdGk7MEE4NQotYWd1cm11a2hpOzBBMDUKLWFoaXJhZ2FuYTszMDQyCi1haG9va2Fib3ZlOzFFQTMKLWFpYmVuZ2FsaTswOTkwCi1haWJvcG9tb2ZvOzMxMUUKLWFpZGV2YTswOTEwCi1haWVjeXJpbGxpYzswNEQ1Ci1haWd1amFyYXRpOzBBOTAKLWFpZ3VybXVraGk7MEExMAotYWltYXRyYWd1cm11a2hpOzBBNDgKLWFpbmFyYWJpYzswNjM5Ci1haW5maW5hbGFyYWJpYztGRUNBCi1haW5pbml0aWFsYXJhYmljO0ZFQ0IKLWFpbm1lZGlhbGFyYWJpYztGRUNDCi1haW52ZXJ0ZWRicmV2ZTswMjAzCi1haXZvd2Vsc2lnbmJlbmdhbGk7MDlDOAotYWl2b3dlbHNpZ25kZXZhOzA5NDgKLWFpdm93ZWxzaWduZ3VqYXJhdGk7MEFDOAotYWthdGFrYW5hOzMwQTIKLWFrYXRha2FuYWhhbGZ3aWR0aDtGRjcxCi1ha29yZWFuOzMxNEYKLWFsZWY7MDVEMAotYWxlZmFyYWJpYzswNjI3Ci1hbGVmZGFnZXNoaGVicmV3O0ZCMzAKLWFsZWZmaW5hbGFyYWJpYztGRThFCi1hbGVmaGFtemFhYm92ZWFyYWJpYzswNjIzCi1hbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljO0ZFODQKLWFsZWZoYW16YWJlbG93YXJhYmljOzA2MjUKLWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWM7RkU4OAotYWxlZmhlYnJldzswNUQwCi1hbGVmbGFtZWRoZWJyZXc7RkI0RgotYWxlZm1hZGRhYWJvdmVhcmFiaWM7MDYyMgotYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYztGRTgyCi1hbGVmbWFrc3VyYWFyYWJpYzswNjQ5Ci1hbGVmbWFrc3VyYWZpbmFsYXJhYmljO0ZFRjAKLWFsZWZtYWtzdXJhaW5pdGlhbGFyYWJpYztGRUYzCi1hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYztGRUY0Ci1hbGVmcGF0YWhoZWJyZXc7RkIyRQotYWxlZnFhbWF0c2hlYnJldztGQjJGCi1hbGVwaDsyMTM1Ci1hbGxlcXVhbDsyMjRDCi1hbHBoYTswM0IxCi1hbHBoYXRvbm9zOzAzQUMKLWFtYWNyb247MDEwMQotYW1vbm9zcGFjZTtGRjQxCi1hbXBlcnNhbmQ7MDAyNgotYW1wZXJzYW5kbW9ub3NwYWNlO0ZGMDYKLWFtcGVyc2FuZHNtYWxsO0Y3MjYKLWFtc3F1YXJlOzMzQzIKLWFuYm9wb21vZm87MzEyMgotYW5nYm9wb21vZm87MzEyNAotYW5na2hhbmtodXRoYWk7MEU1QQotYW5nbGU7MjIyMAotYW5nbGVicmFja2V0bGVmdDszMDA4Ci1hbmdsZWJyYWNrZXRsZWZ0dmVydGljYWw7RkUzRgotYW5nbGVicmFja2V0cmlnaHQ7MzAwOQotYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbDtGRTQwCi1hbmdsZWxlZnQ7MjMyOQotYW5nbGVyaWdodDsyMzJBCi1hbmdzdHJvbTsyMTJCCi1hbm90ZWxlaWE7MDM4NwotYW51ZGF0dGFkZXZhOzA5NTIKLWFudXN2YXJhYmVuZ2FsaTswOTgyCi1hbnVzdmFyYWRldmE7MDkwMgotYW51c3ZhcmFndWphcmF0aTswQTgyCi1hb2dvbmVrOzAxMDUKLWFwYWF0b3NxdWFyZTszMzAwCi1hcGFyZW47MjQ5QwotYXBvc3Ryb3BoZWFybWVuaWFuOzA1NUEKLWFwb3N0cm9waGVtb2Q7MDJCQwotYXBwbGU7RjhGRgotYXBwcm9hY2hlczsyMjUwCi1hcHByb3hlcXVhbDsyMjQ4Ci1hcHByb3hlcXVhbG9yaW1hZ2U7MjI1MgotYXBwcm94aW1hdGVseWVxdWFsOzIyNDUKLWFyYWVhZWtvcmVhbjszMThFCi1hcmFlYWtvcmVhbjszMThECi1hcmM7MjMxMgotYXJpZ2h0aGFsZnJpbmc7MUU5QQotYXJpbmc7MDBFNQotYXJpbmdhY3V0ZTswMUZCCi1hcmluZ2JlbG93OzFFMDEKLWFycm93Ym90aDsyMTk0Ci1hcnJvd2Rhc2hkb3duOzIxRTMKLWFycm93ZGFzaGxlZnQ7MjFFMAotYXJyb3dkYXNocmlnaHQ7MjFFMgotYXJyb3dkYXNodXA7MjFFMQotYXJyb3dkYmxib3RoOzIxRDQKLWFycm93ZGJsZG93bjsyMUQzCi1hcnJvd2RibGxlZnQ7MjFEMAotYXJyb3dkYmxyaWdodDsyMUQyCi1hcnJvd2RibHVwOzIxRDEKLWFycm93ZG93bjsyMTkzCi1hcnJvd2Rvd25sZWZ0OzIxOTkKLWFycm93ZG93bnJpZ2h0OzIxOTgKLWFycm93ZG93bndoaXRlOzIxRTkKLWFycm93aGVhZGRvd25tb2Q7MDJDNQotYXJyb3doZWFkbGVmdG1vZDswMkMyCi1hcnJvd2hlYWRyaWdodG1vZDswMkMzCi1hcnJvd2hlYWR1cG1vZDswMkM0Ci1hcnJvd2hvcml6ZXg7RjhFNwotYXJyb3dsZWZ0OzIxOTAKLWFycm93bGVmdGRibDsyMUQwCi1hcnJvd2xlZnRkYmxzdHJva2U7MjFDRAotYXJyb3dsZWZ0b3ZlcnJpZ2h0OzIxQzYKLWFycm93bGVmdHdoaXRlOzIxRTYKLWFycm93cmlnaHQ7MjE5MgotYXJyb3dyaWdodGRibHN0cm9rZTsyMUNGCi1hcnJvd3JpZ2h0aGVhdnk7Mjc5RQotYXJyb3dyaWdodG92ZXJsZWZ0OzIxQzQKLWFycm93cmlnaHR3aGl0ZTsyMUU4Ci1hcnJvd3RhYmxlZnQ7MjFFNAotYXJyb3d0YWJyaWdodDsyMUU1Ci1hcnJvd3VwOzIxOTEKLWFycm93dXBkbjsyMTk1Ci1hcnJvd3VwZG5ic2U7MjFBOAotYXJyb3d1cGRvd25iYXNlOzIxQTgKLWFycm93dXBsZWZ0OzIxOTYKLWFycm93dXBsZWZ0b2Zkb3duOzIxQzUKLWFycm93dXByaWdodDsyMTk3Ci1hcnJvd3Vwd2hpdGU7MjFFNwotYXJyb3d2ZXJ0ZXg7RjhFNgotYXNjaWljaXJjdW07MDA1RQotYXNjaWljaXJjdW1tb25vc3BhY2U7RkYzRQotYXNjaWl0aWxkZTswMDdFCi1hc2NpaXRpbGRlbW9ub3NwYWNlO0ZGNUUKLWFzY3JpcHQ7MDI1MQotYXNjcmlwdHR1cm5lZDswMjUyCi1hc21hbGxoaXJhZ2FuYTszMDQxCi1hc21hbGxrYXRha2FuYTszMEExCi1hc21hbGxrYXRha2FuYWhhbGZ3aWR0aDtGRjY3Ci1hc3RlcmlzazswMDJBCi1hc3Rlcmlza2FsdG9uZWFyYWJpYzswNjZECi1hc3Rlcmlza2FyYWJpYzswNjZECi1hc3Rlcmlza21hdGg7MjIxNwotYXN0ZXJpc2ttb25vc3BhY2U7RkYwQQotYXN0ZXJpc2tzbWFsbDtGRTYxCi1hc3RlcmlzbTsyMDQyCi1hc3VwZXJpb3I7RjZFOQotYXN5bXB0b3RpY2FsbHllcXVhbDsyMjQzCi1hdDswMDQwCi1hdGlsZGU7MDBFMwotYXRtb25vc3BhY2U7RkYyMAotYXRzbWFsbDtGRTZCCi1hdHVybmVkOzAyNTAKLWF1YmVuZ2FsaTswOTk0Ci1hdWJvcG9tb2ZvOzMxMjAKLWF1ZGV2YTswOTE0Ci1hdWd1amFyYXRpOzBBOTQKLWF1Z3VybXVraGk7MEExNAotYXVsZW5ndGhtYXJrYmVuZ2FsaTswOUQ3Ci1hdW1hdHJhZ3VybXVraGk7MEE0QwotYXV2b3dlbHNpZ25iZW5nYWxpOzA5Q0MKLWF1dm93ZWxzaWduZGV2YTswOTRDCi1hdXZvd2Vsc2lnbmd1amFyYXRpOzBBQ0MKLWF2YWdyYWhhZGV2YTswOTNECi1heWJhcm1lbmlhbjswNTYxCi1heWluOzA1RTIKLWF5aW5hbHRvbmVoZWJyZXc7RkIyMAotYXlpbmhlYnJldzswNUUyCi1iOzAwNjIKLWJhYmVuZ2FsaTswOUFDCi1iYWNrc2xhc2g7MDA1QwotYmFja3NsYXNobW9ub3NwYWNlO0ZGM0MKLWJhZGV2YTswOTJDCi1iYWd1amFyYXRpOzBBQUMKLWJhZ3VybXVraGk7MEEyQwotYmFoaXJhZ2FuYTszMDcwCi1iYWh0dGhhaTswRTNGCi1iYWthdGFrYW5hOzMwRDAKLWJhcjswMDdDCi1iYXJtb25vc3BhY2U7RkY1QwotYmJvcG9tb2ZvOzMxMDUKLWJjaXJjbGU7MjREMQotYmRvdGFjY2VudDsxRTAzCi1iZG90YmVsb3c7MUUwNQotYmVhbWVkc2l4dGVlbnRobm90ZXM7MjY2QwotYmVjYXVzZTsyMjM1Ci1iZWN5cmlsbGljOzA0MzEKLWJlaGFyYWJpYzswNjI4Ci1iZWhmaW5hbGFyYWJpYztGRTkwCi1iZWhpbml0aWFsYXJhYmljO0ZFOTEKLWJlaGlyYWdhbmE7MzA3OQotYmVobWVkaWFsYXJhYmljO0ZFOTIKLWJlaG1lZW1pbml0aWFsYXJhYmljO0ZDOUYKLWJlaG1lZW1pc29sYXRlZGFyYWJpYztGQzA4Ci1iZWhub29uZmluYWxhcmFiaWM7RkM2RAotYmVrYXRha2FuYTszMEQ5Ci1iZW5hcm1lbmlhbjswNTYyCi1iZXQ7MDVEMQotYmV0YTswM0IyCi1iZXRhc3ltYm9sZ3JlZWs7MDNEMAotYmV0ZGFnZXNoO0ZCMzEKLWJldGRhZ2VzaGhlYnJldztGQjMxCi1iZXRoZWJyZXc7MDVEMQotYmV0cmFmZWhlYnJldztGQjRDCi1iaGFiZW5nYWxpOzA5QUQKLWJoYWRldmE7MDkyRAotYmhhZ3VqYXJhdGk7MEFBRAotYmhhZ3VybXVraGk7MEEyRAotYmhvb2s7MDI1MwotYmloaXJhZ2FuYTszMDczCi1iaWthdGFrYW5hOzMwRDMKLWJpbGFiaWFsY2xpY2s7MDI5OAotYmluZGlndXJtdWtoaTswQTAyCi1iaXJ1c3F1YXJlOzMzMzEKLWJsYWNrY2lyY2xlOzI1Q0YKLWJsYWNrZGlhbW9uZDsyNUM2Ci1ibGFja2Rvd25wb2ludGluZ3RyaWFuZ2xlOzI1QkMKLWJsYWNrbGVmdHBvaW50aW5ncG9pbnRlcjsyNUM0Ci1ibGFja2xlZnRwb2ludGluZ3RyaWFuZ2xlOzI1QzAKLWJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0OzMwMTAKLWJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWw7RkUzQgotYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0OzMwMTEKLWJsYWNrbGVudGljdWxhcmJyYWNrZXRyaWdodHZlcnRpY2FsO0ZFM0MKLWJsYWNrbG93ZXJsZWZ0dHJpYW5nbGU7MjVFMwotYmxhY2tsb3dlcnJpZ2h0dHJpYW5nbGU7MjVFMgotYmxhY2tyZWN0YW5nbGU7MjVBQwotYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlcjsyNUJBCi1ibGFja3JpZ2h0cG9pbnRpbmd0cmlhbmdsZTsyNUI2Ci1ibGFja3NtYWxsc3F1YXJlOzI1QUEKLWJsYWNrc21pbGluZ2ZhY2U7MjYzQgotYmxhY2tzcXVhcmU7MjVBMAotYmxhY2tzdGFyOzI2MDUKLWJsYWNrdXBwZXJsZWZ0dHJpYW5nbGU7MjVFNAotYmxhY2t1cHBlcnJpZ2h0dHJpYW5nbGU7MjVFNQotYmxhY2t1cHBvaW50aW5nc21hbGx0cmlhbmdsZTsyNUI0Ci1ibGFja3VwcG9pbnRpbmd0cmlhbmdsZTsyNUIyCi1ibGFuazsyNDIzCi1ibGluZWJlbG93OzFFMDcKLWJsb2NrOzI1ODgKLWJtb25vc3BhY2U7RkY0MgotYm9iYWltYWl0aGFpOzBFMUEKLWJvaGlyYWdhbmE7MzA3QwotYm9rYXRha2FuYTszMERDCi1icGFyZW47MjQ5RAotYnFzcXVhcmU7MzNDMwotYnJhY2VleDtGOEY0Ci1icmFjZWxlZnQ7MDA3QgotYnJhY2VsZWZ0YnQ7RjhGMwotYnJhY2VsZWZ0bWlkO0Y4RjIKLWJyYWNlbGVmdG1vbm9zcGFjZTtGRjVCCi1icmFjZWxlZnRzbWFsbDtGRTVCCi1icmFjZWxlZnR0cDtGOEYxCi1icmFjZWxlZnR2ZXJ0aWNhbDtGRTM3Ci1icmFjZXJpZ2h0OzAwN0QKLWJyYWNlcmlnaHRidDtGOEZFCi1icmFjZXJpZ2h0bWlkO0Y4RkQKLWJyYWNlcmlnaHRtb25vc3BhY2U7RkY1RAotYnJhY2VyaWdodHNtYWxsO0ZFNUMKLWJyYWNlcmlnaHR0cDtGOEZDCi1icmFjZXJpZ2h0dmVydGljYWw7RkUzOAotYnJhY2tldGxlZnQ7MDA1QgotYnJhY2tldGxlZnRidDtGOEYwCi1icmFja2V0bGVmdGV4O0Y4RUYKLWJyYWNrZXRsZWZ0bW9ub3NwYWNlO0ZGM0IKLWJyYWNrZXRsZWZ0dHA7RjhFRQotYnJhY2tldHJpZ2h0OzAwNUQKLWJyYWNrZXRyaWdodGJ0O0Y4RkIKLWJyYWNrZXRyaWdodGV4O0Y4RkEKLWJyYWNrZXRyaWdodG1vbm9zcGFjZTtGRjNECi1icmFja2V0cmlnaHR0cDtGOEY5Ci1icmV2ZTswMkQ4Ci1icmV2ZWJlbG93Y21iOzAzMkUKLWJyZXZlY21iOzAzMDYKLWJyZXZlaW52ZXJ0ZWRiZWxvd2NtYjswMzJGCi1icmV2ZWludmVydGVkY21iOzAzMTEKLWJyZXZlaW52ZXJ0ZWRkb3VibGVjbWI7MDM2MQotYnJpZGdlYmVsb3djbWI7MDMyQQotYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYjswMzNBCi1icm9rZW5iYXI7MDBBNgotYnN0cm9rZTswMTgwCi1ic3VwZXJpb3I7RjZFQQotYnRvcGJhcjswMTgzCi1idWhpcmFnYW5hOzMwNzYKLWJ1a2F0YWthbmE7MzBENgotYnVsbGV0OzIwMjIKLWJ1bGxldGludmVyc2U7MjVEOAotYnVsbGV0b3BlcmF0b3I7MjIxOQotYnVsbHNleWU7MjVDRQotYzswMDYzCi1jYWFybWVuaWFuOzA1NkUKLWNhYmVuZ2FsaTswOTlBCi1jYWN1dGU7MDEwNwotY2FkZXZhOzA5MUEKLWNhZ3VqYXJhdGk7MEE5QQotY2FndXJtdWtoaTswQTFBCi1jYWxzcXVhcmU7MzM4OAotY2FuZHJhYmluZHViZW5nYWxpOzA5ODEKLWNhbmRyYWJpbmR1Y21iOzAzMTAKLWNhbmRyYWJpbmR1ZGV2YTswOTAxCi1jYW5kcmFiaW5kdWd1amFyYXRpOzBBODEKLWNhcHNsb2NrOzIxRUEKLWNhcmVvZjsyMTA1Ci1jYXJvbjswMkM3Ci1jYXJvbmJlbG93Y21iOzAzMkMKLWNhcm9uY21iOzAzMEMKLWNhcnJpYWdlcmV0dXJuOzIxQjUKLWNib3BvbW9mbzszMTE4Ci1jY2Fyb247MDEwRAotY2NlZGlsbGE7MDBFNwotY2NlZGlsbGFhY3V0ZTsxRTA5Ci1jY2lyY2xlOzI0RDIKLWNjaXJjdW1mbGV4OzAxMDkKLWNjdXJsOzAyNTUKLWNkb3Q7MDEwQgotY2RvdGFjY2VudDswMTBCCi1jZHNxdWFyZTszM0M1Ci1jZWRpbGxhOzAwQjgKLWNlZGlsbGFjbWI7MDMyNwotY2VudDswMEEyCi1jZW50aWdyYWRlOzIxMDMKLWNlbnRpbmZlcmlvcjtGNkRGCi1jZW50bW9ub3NwYWNlO0ZGRTAKLWNlbnRvbGRzdHlsZTtGN0EyCi1jZW50c3VwZXJpb3I7RjZFMAotY2hhYXJtZW5pYW47MDU3OQotY2hhYmVuZ2FsaTswOTlCCi1jaGFkZXZhOzA5MUIKLWNoYWd1amFyYXRpOzBBOUIKLWNoYWd1cm11a2hpOzBBMUIKLWNoYm9wb21vZm87MzExNAotY2hlYWJraGFzaWFuY3lyaWxsaWM7MDRCRAotY2hlY2ttYXJrOzI3MTMKLWNoZWN5cmlsbGljOzA0NDcKLWNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljOzA0QkYKLWNoZWRlc2NlbmRlcmN5cmlsbGljOzA0QjcKLWNoZWRpZXJlc2lzY3lyaWxsaWM7MDRGNQotY2hlaGFybWVuaWFuOzA1NzMKLWNoZWtoYWthc3NpYW5jeXJpbGxpYzswNENDCi1jaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljOzA0QjkKLWNoaTswM0M3Ci1jaGlldWNoYWNpcmNsZWtvcmVhbjszMjc3Ci1jaGlldWNoYXBhcmVua29yZWFuOzMyMTcKLWNoaWV1Y2hjaXJjbGVrb3JlYW47MzI2OQotY2hpZXVjaGtvcmVhbjszMTRBCi1jaGlldWNocGFyZW5rb3JlYW47MzIwOQotY2hvY2hhbmd0aGFpOzBFMEEKLWNob2NoYW50aGFpOzBFMDgKLWNob2NoaW5ndGhhaTswRTA5Ci1jaG9jaG9ldGhhaTswRTBDCi1jaG9vazswMTg4Ci1jaWV1Y2FjaXJjbGVrb3JlYW47MzI3NgotY2lldWNhcGFyZW5rb3JlYW47MzIxNgotY2lldWNjaXJjbGVrb3JlYW47MzI2OAotY2lldWNrb3JlYW47MzE0OAotY2lldWNwYXJlbmtvcmVhbjszMjA4Ci1jaWV1Y3VwYXJlbmtvcmVhbjszMjFDCi1jaXJjbGU7MjVDQgotY2lyY2xlbXVsdGlwbHk7MjI5NwotY2lyY2xlb3Q7MjI5OQotY2lyY2xlcGx1czsyMjk1Ci1jaXJjbGVwb3N0YWxtYXJrOzMwMzYKLWNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrOzI1RDAKLWNpcmNsZXdpdGhyaWdodGhhbGZibGFjazsyNUQxCi1jaXJjdW1mbGV4OzAyQzYKLWNpcmN1bWZsZXhiZWxvd2NtYjswMzJECi1jaXJjdW1mbGV4Y21iOzAzMDIKLWNsZWFyOzIzMjcKLWNsaWNrYWx2ZW9sYXI7MDFDMgotY2xpY2tkZW50YWw7MDFDMAotY2xpY2tsYXRlcmFsOzAxQzEKLWNsaWNrcmV0cm9mbGV4OzAxQzMKLWNsdWI7MjY2MwotY2x1YnN1aXRibGFjazsyNjYzCi1jbHVic3VpdHdoaXRlOzI2NjcKLWNtY3ViZWRzcXVhcmU7MzNBNAotY21vbm9zcGFjZTtGRjQzCi1jbXNxdWFyZWRzcXVhcmU7MzNBMAotY29hcm1lbmlhbjswNTgxCi1jb2xvbjswMDNBCi1jb2xvbm1vbmV0YXJ5OzIwQTEKLWNvbG9ubW9ub3NwYWNlO0ZGMUEKLWNvbG9uc2lnbjsyMEExCi1jb2xvbnNtYWxsO0ZFNTUKLWNvbG9udHJpYW5ndWxhcmhhbGZtb2Q7MDJEMQotY29sb250cmlhbmd1bGFybW9kOzAyRDAKLWNvbW1hOzAwMkMKLWNvbW1hYWJvdmVjbWI7MDMxMwotY29tbWFhYm92ZXJpZ2h0Y21iOzAzMTUKLWNvbW1hYWNjZW50O0Y2QzMKLWNvbW1hYXJhYmljOzA2MEMKLWNvbW1hYXJtZW5pYW47MDU1RAotY29tbWFpbmZlcmlvcjtGNkUxCi1jb21tYW1vbm9zcGFjZTtGRjBDCi1jb21tYXJldmVyc2VkYWJvdmVjbWI7MDMxNAotY29tbWFyZXZlcnNlZG1vZDswMkJECi1jb21tYXNtYWxsO0ZFNTAKLWNvbW1hc3VwZXJpb3I7RjZFMgotY29tbWF0dXJuZWRhYm92ZWNtYjswMzEyCi1jb21tYXR1cm5lZG1vZDswMkJCCi1jb21wYXNzOzI2M0MKLWNvbmdydWVudDsyMjQ1Ci1jb250b3VyaW50ZWdyYWw7MjIyRQotY29udHJvbDsyMzAzCi1jb250cm9sQUNLOzAwMDYKLWNvbnRyb2xCRUw7MDAwNwotY29udHJvbEJTOzAwMDgKLWNvbnRyb2xDQU47MDAxOAotY29udHJvbENSOzAwMEQKLWNvbnRyb2xEQzE7MDAxMQotY29udHJvbERDMjswMDEyCi1jb250cm9sREMzOzAwMTMKLWNvbnRyb2xEQzQ7MDAxNAotY29udHJvbERFTDswMDdGCi1jb250cm9sRExFOzAwMTAKLWNvbnRyb2xFTTswMDE5Ci1jb250cm9sRU5ROzAwMDUKLWNvbnRyb2xFT1Q7MDAwNAotY29udHJvbEVTQzswMDFCCi1jb250cm9sRVRCOzAwMTcKLWNvbnRyb2xFVFg7MDAwMwotY29udHJvbEZGOzAwMEMKLWNvbnRyb2xGUzswMDFDCi1jb250cm9sR1M7MDAxRAotY29udHJvbEhUOzAwMDkKLWNvbnRyb2xMRjswMDBBCi1jb250cm9sTkFLOzAwMTUKLWNvbnRyb2xSUzswMDFFCi1jb250cm9sU0k7MDAwRgotY29udHJvbFNPOzAwMEUKLWNvbnRyb2xTT1Q7MDAwMgotY29udHJvbFNUWDswMDAxCi1jb250cm9sU1VCOzAwMUEKLWNvbnRyb2xTWU47MDAxNgotY29udHJvbFVTOzAwMUYKLWNvbnRyb2xWVDswMDBCCi1jb3B5cmlnaHQ7MDBBOQotY29weXJpZ2h0c2FucztGOEU5Ci1jb3B5cmlnaHRzZXJpZjtGNkQ5Ci1jb3JuZXJicmFja2V0bGVmdDszMDBDCi1jb3JuZXJicmFja2V0bGVmdGhhbGZ3aWR0aDtGRjYyCi1jb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsO0ZFNDEKLWNvcm5lcmJyYWNrZXRyaWdodDszMDBECi1jb3JuZXJicmFja2V0cmlnaHRoYWxmd2lkdGg7RkY2MwotY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWw7RkU0MgotY29ycG9yYXRpb25zcXVhcmU7MzM3RgotY29zcXVhcmU7MzNDNwotY292ZXJrZ3NxdWFyZTszM0M2Ci1jcGFyZW47MjQ5RQotY3J1emVpcm87MjBBMgotY3N0cmV0Y2hlZDswMjk3Ci1jdXJseWFuZDsyMkNGCi1jdXJseW9yOzIyQ0UKLWN1cnJlbmN5OzAwQTQKLWN5ckJyZXZlO0Y2RDEKLWN5ckZsZXg7RjZEMgotY3lyYnJldmU7RjZENAotY3lyZmxleDtGNkQ1Ci1kOzAwNjQKLWRhYXJtZW5pYW47MDU2NAotZGFiZW5nYWxpOzA5QTYKLWRhZGFyYWJpYzswNjM2Ci1kYWRldmE7MDkyNgotZGFkZmluYWxhcmFiaWM7RkVCRQotZGFkaW5pdGlhbGFyYWJpYztGRUJGCi1kYWRtZWRpYWxhcmFiaWM7RkVDMAotZGFnZXNoOzA1QkMKLWRhZ2VzaGhlYnJldzswNUJDCi1kYWdnZXI7MjAyMAotZGFnZ2VyZGJsOzIwMjEKLWRhZ3VqYXJhdGk7MEFBNgotZGFndXJtdWtoaTswQTI2Ci1kYWhpcmFnYW5hOzMwNjAKLWRha2F0YWthbmE7MzBDMAotZGFsYXJhYmljOzA2MkYKLWRhbGV0OzA1RDMKLWRhbGV0ZGFnZXNoO0ZCMzMKLWRhbGV0ZGFnZXNoaGVicmV3O0ZCMzMKLWRhbGV0aGF0YWZwYXRhaDswNUQzIDA1QjIKLWRhbGV0aGF0YWZwYXRhaGhlYnJldzswNUQzIDA1QjIKLWRhbGV0aGF0YWZzZWdvbDswNUQzIDA1QjEKLWRhbGV0aGF0YWZzZWdvbGhlYnJldzswNUQzIDA1QjEKLWRhbGV0aGVicmV3OzA1RDMKLWRhbGV0aGlyaXE7MDVEMyAwNUI0Ci1kYWxldGhpcmlxaGVicmV3OzA1RDMgMDVCNAotZGFsZXRob2xhbTswNUQzIDA1QjkKLWRhbGV0aG9sYW1oZWJyZXc7MDVEMyAwNUI5Ci1kYWxldHBhdGFoOzA1RDMgMDVCNwotZGFsZXRwYXRhaGhlYnJldzswNUQzIDA1QjcKLWRhbGV0cWFtYXRzOzA1RDMgMDVCOAotZGFsZXRxYW1hdHNoZWJyZXc7MDVEMyAwNUI4Ci1kYWxldHF1YnV0czswNUQzIDA1QkIKLWRhbGV0cXVidXRzaGVicmV3OzA1RDMgMDVCQgotZGFsZXRzZWdvbDswNUQzIDA1QjYKLWRhbGV0c2Vnb2xoZWJyZXc7MDVEMyAwNUI2Ci1kYWxldHNoZXZhOzA1RDMgMDVCMAotZGFsZXRzaGV2YWhlYnJldzswNUQzIDA1QjAKLWRhbGV0dHNlcmU7MDVEMyAwNUI1Ci1kYWxldHRzZXJlaGVicmV3OzA1RDMgMDVCNQotZGFsZmluYWxhcmFiaWM7RkVBQQotZGFtbWFhcmFiaWM7MDY0RgotZGFtbWFsb3dhcmFiaWM7MDY0RgotZGFtbWF0YW5hbHRvbmVhcmFiaWM7MDY0QwotZGFtbWF0YW5hcmFiaWM7MDY0QwotZGFuZGE7MDk2NAotZGFyZ2FoZWJyZXc7MDVBNwotZGFyZ2FsZWZ0aGVicmV3OzA1QTcKLWRhc2lhcG5ldW1hdGFjeXJpbGxpY2NtYjswNDg1Ci1kYmxHcmF2ZTtGNkQzCi1kYmxhbmdsZWJyYWNrZXRsZWZ0OzMwMEEKLWRibGFuZ2xlYnJhY2tldGxlZnR2ZXJ0aWNhbDtGRTNECi1kYmxhbmdsZWJyYWNrZXRyaWdodDszMDBCCi1kYmxhbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsO0ZFM0UKLWRibGFyY2hpbnZlcnRlZGJlbG93Y21iOzAzMkIKLWRibGFycm93bGVmdDsyMUQ0Ci1kYmxhcnJvd3JpZ2h0OzIxRDIKLWRibGRhbmRhOzA5NjUKLWRibGdyYXZlO0Y2RDYKLWRibGdyYXZlY21iOzAzMEYKLWRibGludGVncmFsOzIyMkMKLWRibGxvd2xpbmU7MjAxNwotZGJsbG93bGluZWNtYjswMzMzCi1kYmxvdmVybGluZWNtYjswMzNGCi1kYmxwcmltZW1vZDswMkJBCi1kYmx2ZXJ0aWNhbGJhcjsyMDE2Ci1kYmx2ZXJ0aWNhbGxpbmVhYm92ZWNtYjswMzBFCi1kYm9wb21vZm87MzEwOQotZGJzcXVhcmU7MzNDOAotZGNhcm9uOzAxMEYKLWRjZWRpbGxhOzFFMTEKLWRjaXJjbGU7MjREMwotZGNpcmN1bWZsZXhiZWxvdzsxRTEzCi1kY3JvYXQ7MDExMQotZGRhYmVuZ2FsaTswOUExCi1kZGFkZXZhOzA5MjEKLWRkYWd1amFyYXRpOzBBQTEKLWRkYWd1cm11a2hpOzBBMjEKLWRkYWxhcmFiaWM7MDY4OAotZGRhbGZpbmFsYXJhYmljO0ZCODkKLWRkZGhhZGV2YTswOTVDCi1kZGhhYmVuZ2FsaTswOUEyCi1kZGhhZGV2YTswOTIyCi1kZGhhZ3VqYXJhdGk7MEFBMgotZGRoYWd1cm11a2hpOzBBMjIKLWRkb3RhY2NlbnQ7MUUwQgotZGRvdGJlbG93OzFFMEQKLWRlY2ltYWxzZXBhcmF0b3JhcmFiaWM7MDY2QgotZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW47MDY2QgotZGVjeXJpbGxpYzswNDM0Ci1kZWdyZWU7MDBCMAotZGVoaWhlYnJldzswNUFECi1kZWhpcmFnYW5hOzMwNjcKLWRlaWNvcHRpYzswM0VGCi1kZWthdGFrYW5hOzMwQzcKLWRlbGV0ZWxlZnQ7MjMyQgotZGVsZXRlcmlnaHQ7MjMyNgotZGVsdGE7MDNCNAotZGVsdGF0dXJuZWQ7MDE4RAotZGVub21pbmF0b3JtaW51c29uZW51bWVyYXRvcmJlbmdhbGk7MDlGOAotZGV6aDswMkE0Ci1kaGFiZW5nYWxpOzA5QTcKLWRoYWRldmE7MDkyNwotZGhhZ3VqYXJhdGk7MEFBNwotZGhhZ3VybXVraGk7MEEyNwotZGhvb2s7MDI1NwotZGlhbHl0aWthdG9ub3M7MDM4NQotZGlhbHl0aWthdG9ub3NjbWI7MDM0NAotZGlhbW9uZDsyNjY2Ci1kaWFtb25kc3VpdHdoaXRlOzI2NjIKLWRpZXJlc2lzOzAwQTgKLWRpZXJlc2lzYWN1dGU7RjZENwotZGllcmVzaXNiZWxvd2NtYjswMzI0Ci1kaWVyZXNpc2NtYjswMzA4Ci1kaWVyZXNpc2dyYXZlO0Y2RDgKLWRpZXJlc2lzdG9ub3M7MDM4NQotZGloaXJhZ2FuYTszMDYyCi1kaWthdGFrYW5hOzMwQzIKLWRpdHRvbWFyazszMDAzCi1kaXZpZGU7MDBGNwotZGl2aWRlczsyMjIzCi1kaXZpc2lvbnNsYXNoOzIyMTUKLWRqZWN5cmlsbGljOzA0NTIKLWRrc2hhZGU7MjU5MwotZGxpbmViZWxvdzsxRTBGCi1kbHNxdWFyZTszMzk3Ci1kbWFjcm9uOzAxMTEKLWRtb25vc3BhY2U7RkY0NAotZG5ibG9jazsyNTg0Ci1kb2NoYWRhdGhhaTswRTBFCi1kb2Rla3RoYWk7MEUxNAotZG9oaXJhZ2FuYTszMDY5Ci1kb2thdGFrYW5hOzMwQzkKLWRvbGxhcjswMDI0Ci1kb2xsYXJpbmZlcmlvcjtGNkUzCi1kb2xsYXJtb25vc3BhY2U7RkYwNAotZG9sbGFyb2xkc3R5bGU7RjcyNAotZG9sbGFyc21hbGw7RkU2OQotZG9sbGFyc3VwZXJpb3I7RjZFNAotZG9uZzsyMEFCCi1kb3J1c3F1YXJlOzMzMjYKLWRvdGFjY2VudDswMkQ5Ci1kb3RhY2NlbnRjbWI7MDMwNwotZG90YmVsb3djbWI7MDMyMwotZG90YmVsb3djb21iOzAzMjMKLWRvdGthdGFrYW5hOzMwRkIKLWRvdGxlc3NpOzAxMzEKLWRvdGxlc3NqO0Y2QkUKLWRvdGxlc3Nqc3Ryb2tlaG9vazswMjg0Ci1kb3RtYXRoOzIyQzUKLWRvdHRlZGNpcmNsZTsyNUNDCi1kb3VibGV5b2RwYXRhaDtGQjFGCi1kb3VibGV5b2RwYXRhaGhlYnJldztGQjFGCi1kb3dudGFja2JlbG93Y21iOzAzMUUKLWRvd250YWNrbW9kOzAyRDUKLWRwYXJlbjsyNDlGCi1kc3VwZXJpb3I7RjZFQgotZHRhaWw7MDI1NgotZHRvcGJhcjswMThDCi1kdWhpcmFnYW5hOzMwNjUKLWR1a2F0YWthbmE7MzBDNQotZHo7MDFGMwotZHphbHRvbmU7MDJBMwotZHpjYXJvbjswMUM2Ci1kemN1cmw7MDJBNQotZHplYWJraGFzaWFuY3lyaWxsaWM7MDRFMQotZHplY3lyaWxsaWM7MDQ1NQotZHpoZWN5cmlsbGljOzA0NUYKLWU7MDA2NQotZWFjdXRlOzAwRTkKLWVhcnRoOzI2NDEKLWViZW5nYWxpOzA5OEYKLWVib3BvbW9mbzszMTFDCi1lYnJldmU7MDExNQotZWNhbmRyYWRldmE7MDkwRAotZWNhbmRyYWd1amFyYXRpOzBBOEQKLWVjYW5kcmF2b3dlbHNpZ25kZXZhOzA5NDUKLWVjYW5kcmF2b3dlbHNpZ25ndWphcmF0aTswQUM1Ci1lY2Fyb247MDExQgotZWNlZGlsbGFicmV2ZTsxRTFECi1lY2hhcm1lbmlhbjswNTY1Ci1lY2h5aXduYXJtZW5pYW47MDU4NwotZWNpcmNsZTsyNEQ0Ci1lY2lyY3VtZmxleDswMEVBCi1lY2lyY3VtZmxleGFjdXRlOzFFQkYKLWVjaXJjdW1mbGV4YmVsb3c7MUUxOQotZWNpcmN1bWZsZXhkb3RiZWxvdzsxRUM3Ci1lY2lyY3VtZmxleGdyYXZlOzFFQzEKLWVjaXJjdW1mbGV4aG9va2Fib3ZlOzFFQzMKLWVjaXJjdW1mbGV4dGlsZGU7MUVDNQotZWN5cmlsbGljOzA0NTQKLWVkYmxncmF2ZTswMjA1Ci1lZGV2YTswOTBGCi1lZGllcmVzaXM7MDBFQgotZWRvdDswMTE3Ci1lZG90YWNjZW50OzAxMTcKLWVkb3RiZWxvdzsxRUI5Ci1lZWd1cm11a2hpOzBBMEYKLWVlbWF0cmFndXJtdWtoaTswQTQ3Ci1lZmN5cmlsbGljOzA0NDQKLWVncmF2ZTswMEU4Ci1lZ3VqYXJhdGk7MEE4RgotZWhhcm1lbmlhbjswNTY3Ci1laGJvcG9tb2ZvOzMxMUQKLWVoaXJhZ2FuYTszMDQ4Ci1laG9va2Fib3ZlOzFFQkIKLWVpYm9wb21vZm87MzExRgotZWlnaHQ7MDAzOAotZWlnaHRhcmFiaWM7MDY2OAotZWlnaHRiZW5nYWxpOzA5RUUKLWVpZ2h0Y2lyY2xlOzI0NjcKLWVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZjsyNzkxCi1laWdodGRldmE7MDk2RQotZWlnaHRlZW5jaXJjbGU7MjQ3MQotZWlnaHRlZW5wYXJlbjsyNDg1Ci1laWdodGVlbnBlcmlvZDsyNDk5Ci1laWdodGd1amFyYXRpOzBBRUUKLWVpZ2h0Z3VybXVraGk7MEE2RQotZWlnaHRoYWNrYXJhYmljOzA2NjgKLWVpZ2h0aGFuZ3pob3U7MzAyOAotZWlnaHRobm90ZWJlYW1lZDsyNjZCCi1laWdodGlkZW9ncmFwaGljcGFyZW47MzIyNwotZWlnaHRpbmZlcmlvcjsyMDg4Ci1laWdodG1vbm9zcGFjZTtGRjE4Ci1laWdodG9sZHN0eWxlO0Y3MzgKLWVpZ2h0cGFyZW47MjQ3QgotZWlnaHRwZXJpb2Q7MjQ4RgotZWlnaHRwZXJzaWFuOzA2RjgKLWVpZ2h0cm9tYW47MjE3NwotZWlnaHRzdXBlcmlvcjsyMDc4Ci1laWdodHRoYWk7MEU1OAotZWludmVydGVkYnJldmU7MDIwNwotZWlvdGlmaWVkY3lyaWxsaWM7MDQ2NQotZWthdGFrYW5hOzMwQTgKLWVrYXRha2FuYWhhbGZ3aWR0aDtGRjc0Ci1la29ua2FyZ3VybXVraGk7MEE3NAotZWtvcmVhbjszMTU0Ci1lbGN5cmlsbGljOzA0M0IKLWVsZW1lbnQ7MjIwOAotZWxldmVuY2lyY2xlOzI0NkEKLWVsZXZlbnBhcmVuOzI0N0UKLWVsZXZlbnBlcmlvZDsyNDkyCi1lbGV2ZW5yb21hbjsyMTdBCi1lbGxpcHNpczsyMDI2Ci1lbGxpcHNpc3ZlcnRpY2FsOzIyRUUKLWVtYWNyb247MDExMwotZW1hY3JvbmFjdXRlOzFFMTcKLWVtYWNyb25ncmF2ZTsxRTE1Ci1lbWN5cmlsbGljOzA0M0MKLWVtZGFzaDsyMDE0Ci1lbWRhc2h2ZXJ0aWNhbDtGRTMxCi1lbW9ub3NwYWNlO0ZGNDUKLWVtcGhhc2lzbWFya2FybWVuaWFuOzA1NUIKLWVtcHR5c2V0OzIyMDUKLWVuYm9wb21vZm87MzEyMwotZW5jeXJpbGxpYzswNDNECi1lbmRhc2g7MjAxMwotZW5kYXNodmVydGljYWw7RkUzMgotZW5kZXNjZW5kZXJjeXJpbGxpYzswNEEzCi1lbmc7MDE0QgotZW5nYm9wb21vZm87MzEyNQotZW5naGVjeXJpbGxpYzswNEE1Ci1lbmhvb2tjeXJpbGxpYzswNEM4Ci1lbnNwYWNlOzIwMDIKLWVvZ29uZWs7MDExOQotZW9rb3JlYW47MzE1MwotZW9wZW47MDI1QgotZW9wZW5jbG9zZWQ7MDI5QQotZW9wZW5yZXZlcnNlZDswMjVDCi1lb3BlbnJldmVyc2VkY2xvc2VkOzAyNUUKLWVvcGVucmV2ZXJzZWRob29rOzAyNUQKLWVwYXJlbjsyNEEwCi1lcHNpbG9uOzAzQjUKLWVwc2lsb250b25vczswM0FECi1lcXVhbDswMDNECi1lcXVhbG1vbm9zcGFjZTtGRjFECi1lcXVhbHNtYWxsO0ZFNjYKLWVxdWFsc3VwZXJpb3I7MjA3QwotZXF1aXZhbGVuY2U7MjI2MQotZXJib3BvbW9mbzszMTI2Ci1lcmN5cmlsbGljOzA0NDAKLWVyZXZlcnNlZDswMjU4Ci1lcmV2ZXJzZWRjeXJpbGxpYzswNDRECi1lc2N5cmlsbGljOzA0NDEKLWVzZGVzY2VuZGVyY3lyaWxsaWM7MDRBQgotZXNoOzAyODMKLWVzaGN1cmw7MDI4NgotZXNob3J0ZGV2YTswOTBFCi1lc2hvcnR2b3dlbHNpZ25kZXZhOzA5NDYKLWVzaHJldmVyc2VkbG9vcDswMUFBCi1lc2hzcXVhdHJldmVyc2VkOzAyODUKLWVzbWFsbGhpcmFnYW5hOzMwNDcKLWVzbWFsbGthdGFrYW5hOzMwQTcKLWVzbWFsbGthdGFrYW5haGFsZndpZHRoO0ZGNkEKLWVzdGltYXRlZDsyMTJFCi1lc3VwZXJpb3I7RjZFQwotZXRhOzAzQjcKLWV0YXJtZW5pYW47MDU2OAotZXRhdG9ub3M7MDNBRQotZXRoOzAwRjAKLWV0aWxkZTsxRUJECi1ldGlsZGViZWxvdzsxRTFCCi1ldG5haHRhZm91a2hoZWJyZXc7MDU5MQotZXRuYWh0YWZvdWtobGVmdGhlYnJldzswNTkxCi1ldG5haHRhaGVicmV3OzA1OTEKLWV0bmFodGFsZWZ0aGVicmV3OzA1OTEKLWV0dXJuZWQ7MDFERAotZXVrb3JlYW47MzE2MQotZXVybzsyMEFDCi1ldm93ZWxzaWduYmVuZ2FsaTswOUM3Ci1ldm93ZWxzaWduZGV2YTswOTQ3Ci1ldm93ZWxzaWduZ3VqYXJhdGk7MEFDNwotZXhjbGFtOzAwMjEKLWV4Y2xhbWFybWVuaWFuOzA1NUMKLWV4Y2xhbWRibDsyMDNDCi1leGNsYW1kb3duOzAwQTEKLWV4Y2xhbWRvd25zbWFsbDtGN0ExCi1leGNsYW1tb25vc3BhY2U7RkYwMQotZXhjbGFtc21hbGw7RjcyMQotZXhpc3RlbnRpYWw7MjIwMwotZXpoOzAyOTIKLWV6aGNhcm9uOzAxRUYKLWV6aGN1cmw7MDI5MwotZXpocmV2ZXJzZWQ7MDFCOQotZXpodGFpbDswMUJBCi1mOzAwNjYKLWZhZGV2YTswOTVFCi1mYWd1cm11a2hpOzBBNUUKLWZhaHJlbmhlaXQ7MjEwOQotZmF0aGFhcmFiaWM7MDY0RQotZmF0aGFsb3dhcmFiaWM7MDY0RQotZmF0aGF0YW5hcmFiaWM7MDY0QgotZmJvcG9tb2ZvOzMxMDgKLWZjaXJjbGU7MjRENQotZmRvdGFjY2VudDsxRTFGCi1mZWhhcmFiaWM7MDY0MQotZmVoYXJtZW5pYW47MDU4NgotZmVoZmluYWxhcmFiaWM7RkVEMgotZmVoaW5pdGlhbGFyYWJpYztGRUQzCi1mZWhtZWRpYWxhcmFiaWM7RkVENAotZmVpY29wdGljOzAzRTUKLWZlbWFsZTsyNjQwCi1mZjtGQjAwCi1mZmk7RkIwMwotZmZsO0ZCMDQKLWZpO0ZCMDEKLWZpZnRlZW5jaXJjbGU7MjQ2RQotZmlmdGVlbnBhcmVuOzI0ODIKLWZpZnRlZW5wZXJpb2Q7MjQ5NgotZmlndXJlZGFzaDsyMDEyCi1maWxsZWRib3g7MjVBMAotZmlsbGVkcmVjdDsyNUFDCi1maW5hbGthZjswNURBCi1maW5hbGthZmRhZ2VzaDtGQjNBCi1maW5hbGthZmRhZ2VzaGhlYnJldztGQjNBCi1maW5hbGthZmhlYnJldzswNURBCi1maW5hbGthZnFhbWF0czswNURBIDA1QjgKLWZpbmFsa2FmcWFtYXRzaGVicmV3OzA1REEgMDVCOAotZmluYWxrYWZzaGV2YTswNURBIDA1QjAKLWZpbmFsa2Fmc2hldmFoZWJyZXc7MDVEQSAwNUIwCi1maW5hbG1lbTswNURECi1maW5hbG1lbWhlYnJldzswNURECi1maW5hbG51bjswNURGCi1maW5hbG51bmhlYnJldzswNURGCi1maW5hbHBlOzA1RTMKLWZpbmFscGVoZWJyZXc7MDVFMwotZmluYWx0c2FkaTswNUU1Ci1maW5hbHRzYWRpaGVicmV3OzA1RTUKLWZpcnN0dG9uZWNoaW5lc2U7MDJDOQotZmlzaGV5ZTsyNUM5Ci1maXRhY3lyaWxsaWM7MDQ3MwotZml2ZTswMDM1Ci1maXZlYXJhYmljOzA2NjUKLWZpdmViZW5nYWxpOzA5RUIKLWZpdmVjaXJjbGU7MjQ2NAotZml2ZWNpcmNsZWludmVyc2VzYW5zc2VyaWY7Mjc4RQotZml2ZWRldmE7MDk2QgotZml2ZWVpZ2h0aHM7MjE1RAotZml2ZWd1amFyYXRpOzBBRUIKLWZpdmVndXJtdWtoaTswQTZCCi1maXZlaGFja2FyYWJpYzswNjY1Ci1maXZlaGFuZ3pob3U7MzAyNQotZml2ZWlkZW9ncmFwaGljcGFyZW47MzIyNAotZml2ZWluZmVyaW9yOzIwODUKLWZpdmVtb25vc3BhY2U7RkYxNQotZml2ZW9sZHN0eWxlO0Y3MzUKLWZpdmVwYXJlbjsyNDc4Ci1maXZlcGVyaW9kOzI0OEMKLWZpdmVwZXJzaWFuOzA2RjUKLWZpdmVyb21hbjsyMTc0Ci1maXZlc3VwZXJpb3I7MjA3NQotZml2ZXRoYWk7MEU1NQotZmw7RkIwMgotZmxvcmluOzAxOTIKLWZtb25vc3BhY2U7RkY0NgotZm1zcXVhcmU7MzM5OQotZm9mYW50aGFpOzBFMUYKLWZvZmF0aGFpOzBFMUQKLWZvbmdtYW50aGFpOzBFNEYKLWZvcmFsbDsyMjAwCi1mb3VyOzAwMzQKLWZvdXJhcmFiaWM7MDY2NAotZm91cmJlbmdhbGk7MDlFQQotZm91cmNpcmNsZTsyNDYzCi1mb3VyY2lyY2xlaW52ZXJzZXNhbnNzZXJpZjsyNzhECi1mb3VyZGV2YTswOTZBCi1mb3VyZ3VqYXJhdGk7MEFFQQotZm91cmd1cm11a2hpOzBBNkEKLWZvdXJoYWNrYXJhYmljOzA2NjQKLWZvdXJoYW5nemhvdTszMDI0Ci1mb3VyaWRlb2dyYXBoaWNwYXJlbjszMjIzCi1mb3VyaW5mZXJpb3I7MjA4NAotZm91cm1vbm9zcGFjZTtGRjE0Ci1mb3VybnVtZXJhdG9yYmVuZ2FsaTswOUY3Ci1mb3Vyb2xkc3R5bGU7RjczNAotZm91cnBhcmVuOzI0NzcKLWZvdXJwZXJpb2Q7MjQ4QgotZm91cnBlcnNpYW47MDZGNAotZm91cnJvbWFuOzIxNzMKLWZvdXJzdXBlcmlvcjsyMDc0Ci1mb3VydGVlbmNpcmNsZTsyNDZECi1mb3VydGVlbnBhcmVuOzI0ODEKLWZvdXJ0ZWVucGVyaW9kOzI0OTUKLWZvdXJ0aGFpOzBFNTQKLWZvdXJ0aHRvbmVjaGluZXNlOzAyQ0IKLWZwYXJlbjsyNEExCi1mcmFjdGlvbjsyMDQ0Ci1mcmFuYzsyMEEzCi1nOzAwNjcKLWdhYmVuZ2FsaTswOTk3Ci1nYWN1dGU7MDFGNQotZ2FkZXZhOzA5MTcKLWdhZmFyYWJpYzswNkFGCi1nYWZmaW5hbGFyYWJpYztGQjkzCi1nYWZpbml0aWFsYXJhYmljO0ZCOTQKLWdhZm1lZGlhbGFyYWJpYztGQjk1Ci1nYWd1amFyYXRpOzBBOTcKLWdhZ3VybXVraGk7MEExNwotZ2FoaXJhZ2FuYTszMDRDCi1nYWthdGFrYW5hOzMwQUMKLWdhbW1hOzAzQjMKLWdhbW1hbGF0aW5zbWFsbDswMjYzCi1nYW1tYXN1cGVyaW9yOzAyRTAKLWdhbmdpYWNvcHRpYzswM0VCCi1nYm9wb21vZm87MzEwRAotZ2JyZXZlOzAxMUYKLWdjYXJvbjswMUU3Ci1nY2VkaWxsYTswMTIzCi1nY2lyY2xlOzI0RDYKLWdjaXJjdW1mbGV4OzAxMUQKLWdjb21tYWFjY2VudDswMTIzCi1nZG90OzAxMjEKLWdkb3RhY2NlbnQ7MDEyMQotZ2VjeXJpbGxpYzswNDMzCi1nZWhpcmFnYW5hOzMwNTIKLWdla2F0YWthbmE7MzBCMgotZ2VvbWV0cmljYWxseWVxdWFsOzIyNTEKLWdlcmVzaGFjY2VudGhlYnJldzswNTlDCi1nZXJlc2hoZWJyZXc7MDVGMwotZ2VyZXNobXVxZGFtaGVicmV3OzA1OUQKLWdlcm1hbmRibHM7MDBERgotZ2Vyc2hheWltYWNjZW50aGVicmV3OzA1OUUKLWdlcnNoYXlpbWhlYnJldzswNUY0Ci1nZXRhbWFyazszMDEzCi1naGFiZW5nYWxpOzA5OTgKLWdoYWRhcm1lbmlhbjswNTcyCi1naGFkZXZhOzA5MTgKLWdoYWd1amFyYXRpOzBBOTgKLWdoYWd1cm11a2hpOzBBMTgKLWdoYWluYXJhYmljOzA2M0EKLWdoYWluZmluYWxhcmFiaWM7RkVDRQotZ2hhaW5pbml0aWFsYXJhYmljO0ZFQ0YKLWdoYWlubWVkaWFsYXJhYmljO0ZFRDAKLWdoZW1pZGRsZWhvb2tjeXJpbGxpYzswNDk1Ci1naGVzdHJva2VjeXJpbGxpYzswNDkzCi1naGV1cHR1cm5jeXJpbGxpYzswNDkxCi1naGhhZGV2YTswOTVBCi1naGhhZ3VybXVraGk7MEE1QQotZ2hvb2s7MDI2MAotZ2h6c3F1YXJlOzMzOTMKLWdpaGlyYWdhbmE7MzA0RQotZ2lrYXRha2FuYTszMEFFCi1naW1hcm1lbmlhbjswNTYzCi1naW1lbDswNUQyCi1naW1lbGRhZ2VzaDtGQjMyCi1naW1lbGRhZ2VzaGhlYnJldztGQjMyCi1naW1lbGhlYnJldzswNUQyCi1namVjeXJpbGxpYzswNDUzCi1nbG90dGFsaW52ZXJ0ZWRzdHJva2U7MDFCRQotZ2xvdHRhbHN0b3A7MDI5NAotZ2xvdHRhbHN0b3BpbnZlcnRlZDswMjk2Ci1nbG90dGFsc3RvcG1vZDswMkMwCi1nbG90dGFsc3RvcHJldmVyc2VkOzAyOTUKLWdsb3R0YWxzdG9wcmV2ZXJzZWRtb2Q7MDJDMQotZ2xvdHRhbHN0b3ByZXZlcnNlZHN1cGVyaW9yOzAyRTQKLWdsb3R0YWxzdG9wc3Ryb2tlOzAyQTEKLWdsb3R0YWxzdG9wc3Ryb2tlcmV2ZXJzZWQ7MDJBMgotZ21hY3JvbjsxRTIxCi1nbW9ub3NwYWNlO0ZGNDcKLWdvaGlyYWdhbmE7MzA1NAotZ29rYXRha2FuYTszMEI0Ci1ncGFyZW47MjRBMgotZ3Bhc3F1YXJlOzMzQUMKLWdyYWRpZW50OzIyMDcKLWdyYXZlOzAwNjAKLWdyYXZlYmVsb3djbWI7MDMxNgotZ3JhdmVjbWI7MDMwMAotZ3JhdmVjb21iOzAzMDAKLWdyYXZlZGV2YTswOTUzCi1ncmF2ZWxvd21vZDswMkNFCi1ncmF2ZW1vbm9zcGFjZTtGRjQwCi1ncmF2ZXRvbmVjbWI7MDM0MAotZ3JlYXRlcjswMDNFCi1ncmVhdGVyZXF1YWw7MjI2NQotZ3JlYXRlcmVxdWFsb3JsZXNzOzIyREIKLWdyZWF0ZXJtb25vc3BhY2U7RkYxRQotZ3JlYXRlcm9yZXF1aXZhbGVudDsyMjczCi1ncmVhdGVyb3JsZXNzOzIyNzcKLWdyZWF0ZXJvdmVyZXF1YWw7MjI2NwotZ3JlYXRlcnNtYWxsO0ZFNjUKLWdzY3JpcHQ7MDI2MQotZ3N0cm9rZTswMUU1Ci1ndWhpcmFnYW5hOzMwNTAKLWd1aWxsZW1vdGxlZnQ7MDBBQgotZ3VpbGxlbW90cmlnaHQ7MDBCQgotZ3VpbHNpbmdsbGVmdDsyMDM5Ci1ndWlsc2luZ2xyaWdodDsyMDNBCi1ndWthdGFrYW5hOzMwQjAKLWd1cmFtdXNxdWFyZTszMzE4Ci1neXNxdWFyZTszM0M5Ci1oOzAwNjgKLWhhYWJraGFzaWFuY3lyaWxsaWM7MDRBOQotaGFhbHRvbmVhcmFiaWM7MDZDMQotaGFiZW5nYWxpOzA5QjkKLWhhZGVzY2VuZGVyY3lyaWxsaWM7MDRCMwotaGFkZXZhOzA5MzkKLWhhZ3VqYXJhdGk7MEFCOQotaGFndXJtdWtoaTswQTM5Ci1oYWhhcmFiaWM7MDYyRAotaGFoZmluYWxhcmFiaWM7RkVBMgotaGFoaW5pdGlhbGFyYWJpYztGRUEzCi1oYWhpcmFnYW5hOzMwNkYKLWhhaG1lZGlhbGFyYWJpYztGRUE0Ci1oYWl0dXNxdWFyZTszMzJBCi1oYWthdGFrYW5hOzMwQ0YKLWhha2F0YWthbmFoYWxmd2lkdGg7RkY4QQotaGFsYW50Z3VybXVraGk7MEE0RAotaGFtemFhcmFiaWM7MDYyMQotaGFtemFkYW1tYWFyYWJpYzswNjIxIDA2NEYKLWhhbXphZGFtbWF0YW5hcmFiaWM7MDYyMSAwNjRDCi1oYW16YWZhdGhhYXJhYmljOzA2MjEgMDY0RQotaGFtemFmYXRoYXRhbmFyYWJpYzswNjIxIDA2NEIKLWhhbXphbG93YXJhYmljOzA2MjEKLWhhbXphbG93a2FzcmFhcmFiaWM7MDYyMSAwNjUwCi1oYW16YWxvd2thc3JhdGFuYXJhYmljOzA2MjEgMDY0RAotaGFtemFzdWt1bmFyYWJpYzswNjIxIDA2NTIKLWhhbmd1bGZpbGxlcjszMTY0Ci1oYXJkc2lnbmN5cmlsbGljOzA0NEEKLWhhcnBvb25sZWZ0YmFyYnVwOzIxQkMKLWhhcnBvb25yaWdodGJhcmJ1cDsyMUMwCi1oYXNxdWFyZTszM0NBCi1oYXRhZnBhdGFoOzA1QjIKLWhhdGFmcGF0YWgxNjswNUIyCi1oYXRhZnBhdGFoMjM7MDVCMgotaGF0YWZwYXRhaDJmOzA1QjIKLWhhdGFmcGF0YWhoZWJyZXc7MDVCMgotaGF0YWZwYXRhaG5hcnJvd2hlYnJldzswNUIyCi1oYXRhZnBhdGFocXVhcnRlcmhlYnJldzswNUIyCi1oYXRhZnBhdGFod2lkZWhlYnJldzswNUIyCi1oYXRhZnFhbWF0czswNUIzCi1oYXRhZnFhbWF0czFiOzA1QjMKLWhhdGFmcWFtYXRzMjg7MDVCMwotaGF0YWZxYW1hdHMzNDswNUIzCi1oYXRhZnFhbWF0c2hlYnJldzswNUIzCi1oYXRhZnFhbWF0c25hcnJvd2hlYnJldzswNUIzCi1oYXRhZnFhbWF0c3F1YXJ0ZXJoZWJyZXc7MDVCMwotaGF0YWZxYW1hdHN3aWRlaGVicmV3OzA1QjMKLWhhdGFmc2Vnb2w7MDVCMQotaGF0YWZzZWdvbDE3OzA1QjEKLWhhdGFmc2Vnb2wyNDswNUIxCi1oYXRhZnNlZ29sMzA7MDVCMQotaGF0YWZzZWdvbGhlYnJldzswNUIxCi1oYXRhZnNlZ29sbmFycm93aGVicmV3OzA1QjEKLWhhdGFmc2Vnb2xxdWFydGVyaGVicmV3OzA1QjEKLWhhdGFmc2Vnb2x3aWRlaGVicmV3OzA1QjEKLWhiYXI7MDEyNwotaGJvcG9tb2ZvOzMxMEYKLWhicmV2ZWJlbG93OzFFMkIKLWhjZWRpbGxhOzFFMjkKLWhjaXJjbGU7MjRENwotaGNpcmN1bWZsZXg7MDEyNQotaGRpZXJlc2lzOzFFMjcKLWhkb3RhY2NlbnQ7MUUyMwotaGRvdGJlbG93OzFFMjUKLWhlOzA1RDQKLWhlYXJ0OzI2NjUKLWhlYXJ0c3VpdGJsYWNrOzI2NjUKLWhlYXJ0c3VpdHdoaXRlOzI2NjEKLWhlZGFnZXNoO0ZCMzQKLWhlZGFnZXNoaGVicmV3O0ZCMzQKLWhlaGFsdG9uZWFyYWJpYzswNkMxCi1oZWhhcmFiaWM7MDY0NwotaGVoZWJyZXc7MDVENAotaGVoZmluYWxhbHRvbmVhcmFiaWM7RkJBNwotaGVoZmluYWxhbHR0d29hcmFiaWM7RkVFQQotaGVoZmluYWxhcmFiaWM7RkVFQQotaGVoaGFtemFhYm92ZWZpbmFsYXJhYmljO0ZCQTUKLWhlaGhhbXphYWJvdmVpc29sYXRlZGFyYWJpYztGQkE0Ci1oZWhpbml0aWFsYWx0b25lYXJhYmljO0ZCQTgKLWhlaGluaXRpYWxhcmFiaWM7RkVFQgotaGVoaXJhZ2FuYTszMDc4Ci1oZWhtZWRpYWxhbHRvbmVhcmFiaWM7RkJBOQotaGVobWVkaWFsYXJhYmljO0ZFRUMKLWhlaXNlaWVyYXNxdWFyZTszMzdCCi1oZWthdGFrYW5hOzMwRDgKLWhla2F0YWthbmFoYWxmd2lkdGg7RkY4RAotaGVrdXRhYXJ1c3F1YXJlOzMzMzYKLWhlbmdob29rOzAyNjcKLWhlcnV0dXNxdWFyZTszMzM5Ci1oZXQ7MDVENwotaGV0aGVicmV3OzA1RDcKLWhob29rOzAyNjYKLWhob29rc3VwZXJpb3I7MDJCMQotaGlldWhhY2lyY2xla29yZWFuOzMyN0IKLWhpZXVoYXBhcmVua29yZWFuOzMyMUIKLWhpZXVoY2lyY2xla29yZWFuOzMyNkQKLWhpZXVoa29yZWFuOzMxNEUKLWhpZXVocGFyZW5rb3JlYW47MzIwRAotaGloaXJhZ2FuYTszMDcyCi1oaWthdGFrYW5hOzMwRDIKLWhpa2F0YWthbmFoYWxmd2lkdGg7RkY4QgotaGlyaXE7MDVCNAotaGlyaXExNDswNUI0Ci1oaXJpcTIxOzA1QjQKLWhpcmlxMmQ7MDVCNAotaGlyaXFoZWJyZXc7MDVCNAotaGlyaXFuYXJyb3doZWJyZXc7MDVCNAotaGlyaXFxdWFydGVyaGVicmV3OzA1QjQKLWhpcmlxd2lkZWhlYnJldzswNUI0Ci1obGluZWJlbG93OzFFOTYKLWhtb25vc3BhY2U7RkY0OAotaG9hcm1lbmlhbjswNTcwCi1ob2hpcHRoYWk7MEUyQgotaG9oaXJhZ2FuYTszMDdCCi1ob2thdGFrYW5hOzMwREIKLWhva2F0YWthbmFoYWxmd2lkdGg7RkY4RQotaG9sYW07MDVCOQotaG9sYW0xOTswNUI5Ci1ob2xhbTI2OzA1QjkKLWhvbGFtMzI7MDVCOQotaG9sYW1oZWJyZXc7MDVCOQotaG9sYW1uYXJyb3doZWJyZXc7MDVCOQotaG9sYW1xdWFydGVyaGVicmV3OzA1QjkKLWhvbGFtd2lkZWhlYnJldzswNUI5Ci1ob25va2h1a3RoYWk7MEUyRQotaG9va2Fib3ZlY29tYjswMzA5Ci1ob29rY21iOzAzMDkKLWhvb2twYWxhdGFsaXplZGJlbG93Y21iOzAzMjEKLWhvb2tyZXRyb2ZsZXhiZWxvd2NtYjswMzIyCi1ob29uc3F1YXJlOzMzNDIKLWhvcmljb3B0aWM7MDNFOQotaG9yaXpvbnRhbGJhcjsyMDE1Ci1ob3JuY21iOzAzMUIKLWhvdHNwcmluZ3M7MjY2OAotaG91c2U7MjMwMgotaHBhcmVuOzI0QTMKLWhzdXBlcmlvcjswMkIwCi1odHVybmVkOzAyNjUKLWh1aGlyYWdhbmE7MzA3NQotaHVpaXRvc3F1YXJlOzMzMzMKLWh1a2F0YWthbmE7MzBENQotaHVrYXRha2FuYWhhbGZ3aWR0aDtGRjhDCi1odW5nYXJ1bWxhdXQ7MDJERAotaHVuZ2FydW1sYXV0Y21iOzAzMEIKLWh2OzAxOTUKLWh5cGhlbjswMDJECi1oeXBoZW5pbmZlcmlvcjtGNkU1Ci1oeXBoZW5tb25vc3BhY2U7RkYwRAotaHlwaGVuc21hbGw7RkU2MwotaHlwaGVuc3VwZXJpb3I7RjZFNgotaHlwaGVudHdvOzIwMTAKLWk7MDA2OQotaWFjdXRlOzAwRUQKLWlhY3lyaWxsaWM7MDQ0RgotaWJlbmdhbGk7MDk4NwotaWJvcG9tb2ZvOzMxMjcKLWlicmV2ZTswMTJECi1pY2Fyb247MDFEMAotaWNpcmNsZTsyNEQ4Ci1pY2lyY3VtZmxleDswMEVFCi1pY3lyaWxsaWM7MDQ1NgotaWRibGdyYXZlOzAyMDkKLWlkZW9ncmFwaGVhcnRoY2lyY2xlOzMyOEYKLWlkZW9ncmFwaGZpcmVjaXJjbGU7MzI4QgotaWRlb2dyYXBoaWNhbGxpYW5jZXBhcmVuOzMyM0YKLWlkZW9ncmFwaGljY2FsbHBhcmVuOzMyM0EKLWlkZW9ncmFwaGljY2VudHJlY2lyY2xlOzMyQTUKLWlkZW9ncmFwaGljY2xvc2U7MzAwNgotaWRlb2dyYXBoaWNjb21tYTszMDAxCi1pZGVvZ3JhcGhpY2NvbW1hbGVmdDtGRjY0Ci1pZGVvZ3JhcGhpY2NvbmdyYXR1bGF0aW9ucGFyZW47MzIzNwotaWRlb2dyYXBoaWNjb3JyZWN0Y2lyY2xlOzMyQTMKLWlkZW9ncmFwaGljZWFydGhwYXJlbjszMjJGCi1pZGVvZ3JhcGhpY2VudGVycHJpc2VwYXJlbjszMjNECi1pZGVvZ3JhcGhpY2V4Y2VsbGVudGNpcmNsZTszMjlECi1pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW47MzI0MAotaWRlb2dyYXBoaWNmaW5hbmNpYWxjaXJjbGU7MzI5NgotaWRlb2dyYXBoaWNmaW5hbmNpYWxwYXJlbjszMjM2Ci1pZGVvZ3JhcGhpY2ZpcmVwYXJlbjszMjJCCi1pZGVvZ3JhcGhpY2hhdmVwYXJlbjszMjMyCi1pZGVvZ3JhcGhpY2hpZ2hjaXJjbGU7MzJBNAotaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrOzMwMDUKLWlkZW9ncmFwaGljbGFib3JjaXJjbGU7MzI5OAotaWRlb2dyYXBoaWNsYWJvcnBhcmVuOzMyMzgKLWlkZW9ncmFwaGljbGVmdGNpcmNsZTszMkE3Ci1pZGVvZ3JhcGhpY2xvd2NpcmNsZTszMkE2Ci1pZGVvZ3JhcGhpY21lZGljaW5lY2lyY2xlOzMyQTkKLWlkZW9ncmFwaGljbWV0YWxwYXJlbjszMjJFCi1pZGVvZ3JhcGhpY21vb25wYXJlbjszMjJBCi1pZGVvZ3JhcGhpY25hbWVwYXJlbjszMjM0Ci1pZGVvZ3JhcGhpY3BlcmlvZDszMDAyCi1pZGVvZ3JhcGhpY3ByaW50Y2lyY2xlOzMyOUUKLWlkZW9ncmFwaGljcmVhY2hwYXJlbjszMjQzCi1pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuOzMyMzkKLWlkZW9ncmFwaGljcmVzb3VyY2VwYXJlbjszMjNFCi1pZGVvZ3JhcGhpY3JpZ2h0Y2lyY2xlOzMyQTgKLWlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlOzMyOTkKLWlkZW9ncmFwaGljc2VsZnBhcmVuOzMyNDIKLWlkZW9ncmFwaGljc29jaWV0eXBhcmVuOzMyMzMKLWlkZW9ncmFwaGljc3BhY2U7MzAwMAotaWRlb2dyYXBoaWNzcGVjaWFscGFyZW47MzIzNQotaWRlb2dyYXBoaWNzdG9ja3BhcmVuOzMyMzEKLWlkZW9ncmFwaGljc3R1ZHlwYXJlbjszMjNCCi1pZGVvZ3JhcGhpY3N1bnBhcmVuOzMyMzAKLWlkZW9ncmFwaGljc3VwZXJ2aXNlcGFyZW47MzIzQwotaWRlb2dyYXBoaWN3YXRlcnBhcmVuOzMyMkMKLWlkZW9ncmFwaGljd29vZHBhcmVuOzMyMkQKLWlkZW9ncmFwaGljemVybzszMDA3Ci1pZGVvZ3JhcGhtZXRhbGNpcmNsZTszMjhFCi1pZGVvZ3JhcGhtb29uY2lyY2xlOzMyOEEKLWlkZW9ncmFwaG5hbWVjaXJjbGU7MzI5NAotaWRlb2dyYXBoc3VuY2lyY2xlOzMyOTAKLWlkZW9ncmFwaHdhdGVyY2lyY2xlOzMyOEMKLWlkZW9ncmFwaHdvb2RjaXJjbGU7MzI4RAotaWRldmE7MDkwNwotaWRpZXJlc2lzOzAwRUYKLWlkaWVyZXNpc2FjdXRlOzFFMkYKLWlkaWVyZXNpc2N5cmlsbGljOzA0RTUKLWlkb3RiZWxvdzsxRUNCCi1pZWJyZXZlY3lyaWxsaWM7MDRENwotaWVjeXJpbGxpYzswNDM1Ci1pZXVuZ2FjaXJjbGVrb3JlYW47MzI3NQotaWV1bmdhcGFyZW5rb3JlYW47MzIxNQotaWV1bmdjaXJjbGVrb3JlYW47MzI2NwotaWV1bmdrb3JlYW47MzE0NwotaWV1bmdwYXJlbmtvcmVhbjszMjA3Ci1pZ3JhdmU7MDBFQwotaWd1amFyYXRpOzBBODcKLWlndXJtdWtoaTswQTA3Ci1paGlyYWdhbmE7MzA0NAotaWhvb2thYm92ZTsxRUM5Ci1paWJlbmdhbGk7MDk4OAotaWljeXJpbGxpYzswNDM4Ci1paWRldmE7MDkwOAotaWlndWphcmF0aTswQTg4Ci1paWd1cm11a2hpOzBBMDgKLWlpbWF0cmFndXJtdWtoaTswQTQwCi1paW52ZXJ0ZWRicmV2ZTswMjBCCi1paXNob3J0Y3lyaWxsaWM7MDQzOQotaWl2b3dlbHNpZ25iZW5nYWxpOzA5QzAKLWlpdm93ZWxzaWduZGV2YTswOTQwCi1paXZvd2Vsc2lnbmd1amFyYXRpOzBBQzAKLWlqOzAxMzMKLWlrYXRha2FuYTszMEE0Ci1pa2F0YWthbmFoYWxmd2lkdGg7RkY3MgotaWtvcmVhbjszMTYzCi1pbGRlOzAyREMKLWlsdXloZWJyZXc7MDVBQwotaW1hY3JvbjswMTJCCi1pbWFjcm9uY3lyaWxsaWM7MDRFMwotaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbDsyMjUzCi1pbWF0cmFndXJtdWtoaTswQTNGCi1pbW9ub3NwYWNlO0ZGNDkKLWluY3JlbWVudDsyMjA2Ci1pbmZpbml0eTsyMjFFCi1pbmlhcm1lbmlhbjswNTZCCi1pbnRlZ3JhbDsyMjJCCi1pbnRlZ3JhbGJvdHRvbTsyMzIxCi1pbnRlZ3JhbGJ0OzIzMjEKLWludGVncmFsZXg7RjhGNQotaW50ZWdyYWx0b3A7MjMyMAotaW50ZWdyYWx0cDsyMzIwCi1pbnRlcnNlY3Rpb247MjIyOQotaW50aXNxdWFyZTszMzA1Ci1pbnZidWxsZXQ7MjVEOAotaW52Y2lyY2xlOzI1RDkKLWludnNtaWxlZmFjZTsyNjNCCi1pb2N5cmlsbGljOzA0NTEKLWlvZ29uZWs7MDEyRgotaW90YTswM0I5Ci1pb3RhZGllcmVzaXM7MDNDQQotaW90YWRpZXJlc2lzdG9ub3M7MDM5MAotaW90YWxhdGluOzAyNjkKLWlvdGF0b25vczswM0FGCi1pcGFyZW47MjRBNAotaXJpZ3VybXVraGk7MEE3MgotaXNtYWxsaGlyYWdhbmE7MzA0MwotaXNtYWxsa2F0YWthbmE7MzBBMwotaXNtYWxsa2F0YWthbmFoYWxmd2lkdGg7RkY2OAotaXNzaGFyYmVuZ2FsaTswOUZBCi1pc3Ryb2tlOzAyNjgKLWlzdXBlcmlvcjtGNkVECi1pdGVyYXRpb25oaXJhZ2FuYTszMDlECi1pdGVyYXRpb25rYXRha2FuYTszMEZECi1pdGlsZGU7MDEyOQotaXRpbGRlYmVsb3c7MUUyRAotaXVib3BvbW9mbzszMTI5Ci1pdWN5cmlsbGljOzA0NEUKLWl2b3dlbHNpZ25iZW5nYWxpOzA5QkYKLWl2b3dlbHNpZ25kZXZhOzA5M0YKLWl2b3dlbHNpZ25ndWphcmF0aTswQUJGCi1pemhpdHNhY3lyaWxsaWM7MDQ3NQotaXpoaXRzYWRibGdyYXZlY3lyaWxsaWM7MDQ3NwotajswMDZBCi1qYWFybWVuaWFuOzA1NzEKLWphYmVuZ2FsaTswOTlDCi1qYWRldmE7MDkxQwotamFndWphcmF0aTswQTlDCi1qYWd1cm11a2hpOzBBMUMKLWpib3BvbW9mbzszMTEwCi1qY2Fyb247MDFGMAotamNpcmNsZTsyNEQ5Ci1qY2lyY3VtZmxleDswMTM1Ci1qY3Jvc3NlZHRhaWw7MDI5RAotamRvdGxlc3NzdHJva2U7MDI1RgotamVjeXJpbGxpYzswNDU4Ci1qZWVtYXJhYmljOzA2MkMKLWplZW1maW5hbGFyYWJpYztGRTlFCi1qZWVtaW5pdGlhbGFyYWJpYztGRTlGCi1qZWVtbWVkaWFsYXJhYmljO0ZFQTAKLWplaGFyYWJpYzswNjk4Ci1qZWhmaW5hbGFyYWJpYztGQjhCCi1qaGFiZW5nYWxpOzA5OUQKLWpoYWRldmE7MDkxRAotamhhZ3VqYXJhdGk7MEE5RAotamhhZ3VybXVraGk7MEExRAotamhlaGFybWVuaWFuOzA1N0IKLWppczszMDA0Ci1qbW9ub3NwYWNlO0ZGNEEKLWpwYXJlbjsyNEE1Ci1qc3VwZXJpb3I7MDJCMgotazswMDZCCi1rYWJhc2hraXJjeXJpbGxpYzswNEExCi1rYWJlbmdhbGk7MDk5NQota2FjdXRlOzFFMzEKLWthY3lyaWxsaWM7MDQzQQota2FkZXNjZW5kZXJjeXJpbGxpYzswNDlCCi1rYWRldmE7MDkxNQota2FmOzA1REIKLWthZmFyYWJpYzswNjQzCi1rYWZkYWdlc2g7RkIzQgota2FmZGFnZXNoaGVicmV3O0ZCM0IKLWthZmZpbmFsYXJhYmljO0ZFREEKLWthZmhlYnJldzswNURCCi1rYWZpbml0aWFsYXJhYmljO0ZFREIKLWthZm1lZGlhbGFyYWJpYztGRURDCi1rYWZyYWZlaGVicmV3O0ZCNEQKLWthZ3VqYXJhdGk7MEE5NQota2FndXJtdWtoaTswQTE1Ci1rYWhpcmFnYW5hOzMwNEIKLWthaG9va2N5cmlsbGljOzA0QzQKLWtha2F0YWthbmE7MzBBQgota2FrYXRha2FuYWhhbGZ3aWR0aDtGRjc2Ci1rYXBwYTswM0JBCi1rYXBwYXN5bWJvbGdyZWVrOzAzRjAKLWthcHllb3VubWlldW1rb3JlYW47MzE3MQota2FweWVvdW5waGlldXBoa29yZWFuOzMxODQKLWthcHllb3VucGlldXBrb3JlYW47MzE3OAota2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuOzMxNzkKLWthcm9yaWlzcXVhcmU7MzMwRAota2FzaGlkYWF1dG9hcmFiaWM7MDY0MAota2FzaGlkYWF1dG9ub3NpZGViZWFyaW5nYXJhYmljOzA2NDAKLWthc21hbGxrYXRha2FuYTszMEY1Ci1rYXNxdWFyZTszMzg0Ci1rYXNyYWFyYWJpYzswNjUwCi1rYXNyYXRhbmFyYWJpYzswNjRECi1rYXN0cm9rZWN5cmlsbGljOzA0OUYKLWthdGFoaXJhcHJvbG9uZ21hcmtoYWxmd2lkdGg7RkY3MAota2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljOzA0OUQKLWtib3BvbW9mbzszMTBFCi1rY2Fsc3F1YXJlOzMzODkKLWtjYXJvbjswMUU5Ci1rY2VkaWxsYTswMTM3Ci1rY2lyY2xlOzI0REEKLWtjb21tYWFjY2VudDswMTM3Ci1rZG90YmVsb3c7MUUzMwota2VoYXJtZW5pYW47MDU4NAota2VoaXJhZ2FuYTszMDUxCi1rZWthdGFrYW5hOzMwQjEKLWtla2F0YWthbmFoYWxmd2lkdGg7RkY3OQota2VuYXJtZW5pYW47MDU2Rgota2VzbWFsbGthdGFrYW5hOzMwRjYKLWtncmVlbmxhbmRpYzswMTM4Ci1raGFiZW5nYWxpOzA5OTYKLWtoYWN5cmlsbGljOzA0NDUKLWtoYWRldmE7MDkxNgota2hhZ3VqYXJhdGk7MEE5Ngota2hhZ3VybXVraGk7MEExNgota2hhaGFyYWJpYzswNjJFCi1raGFoZmluYWxhcmFiaWM7RkVBNgota2hhaGluaXRpYWxhcmFiaWM7RkVBNwota2hhaG1lZGlhbGFyYWJpYztGRUE4Ci1raGVpY29wdGljOzAzRTcKLWtoaGFkZXZhOzA5NTkKLWtoaGFndXJtdWtoaTswQTU5Ci1raGlldWtoYWNpcmNsZWtvcmVhbjszMjc4Ci1raGlldWtoYXBhcmVua29yZWFuOzMyMTgKLWtoaWV1a2hjaXJjbGVrb3JlYW47MzI2QQota2hpZXVraGtvcmVhbjszMTRCCi1raGlldWtocGFyZW5rb3JlYW47MzIwQQota2hva2hhaXRoYWk7MEUwMgota2hva2hvbnRoYWk7MEUwNQota2hva2h1YXR0aGFpOzBFMDMKLWtob2tod2FpdGhhaTswRTA0Ci1raG9tdXR0aGFpOzBFNUIKLWtob29rOzAxOTkKLWtob3Jha2hhbmd0aGFpOzBFMDYKLWtoenNxdWFyZTszMzkxCi1raWhpcmFnYW5hOzMwNEQKLWtpa2F0YWthbmE7MzBBRAota2lrYXRha2FuYWhhbGZ3aWR0aDtGRjc3Ci1raXJvZ3VyYW11c3F1YXJlOzMzMTUKLWtpcm9tZWV0b3J1c3F1YXJlOzMzMTYKLWtpcm9zcXVhcmU7MzMxNAota2l5ZW9rYWNpcmNsZWtvcmVhbjszMjZFCi1raXllb2thcGFyZW5rb3JlYW47MzIwRQota2l5ZW9rY2lyY2xla29yZWFuOzMyNjAKLWtpeWVva2tvcmVhbjszMTMxCi1raXllb2twYXJlbmtvcmVhbjszMjAwCi1raXllb2tzaW9za29yZWFuOzMxMzMKLWtqZWN5cmlsbGljOzA0NUMKLWtsaW5lYmVsb3c7MUUzNQota2xzcXVhcmU7MzM5OAota21jdWJlZHNxdWFyZTszM0E2Ci1rbW9ub3NwYWNlO0ZGNEIKLWttc3F1YXJlZHNxdWFyZTszM0EyCi1rb2hpcmFnYW5hOzMwNTMKLWtvaG1zcXVhcmU7MzNDMAota29rYWl0aGFpOzBFMDEKLWtva2F0YWthbmE7MzBCMwota29rYXRha2FuYWhhbGZ3aWR0aDtGRjdBCi1rb29wb3NxdWFyZTszMzFFCi1rb3BwYWN5cmlsbGljOzA0ODEKLWtvcmVhbnN0YW5kYXJkc3ltYm9sOzMyN0YKLWtvcm9uaXNjbWI7MDM0Mwota3BhcmVuOzI0QTYKLWtwYXNxdWFyZTszM0FBCi1rc2ljeXJpbGxpYzswNDZGCi1rdHNxdWFyZTszM0NGCi1rdHVybmVkOzAyOUUKLWt1aGlyYWdhbmE7MzA0Rgota3VrYXRha2FuYTszMEFGCi1rdWthdGFrYW5haGFsZndpZHRoO0ZGNzgKLWt2c3F1YXJlOzMzQjgKLWt3c3F1YXJlOzMzQkUKLWw7MDA2QwotbGFiZW5nYWxpOzA5QjIKLWxhY3V0ZTswMTNBCi1sYWRldmE7MDkzMgotbGFndWphcmF0aTswQUIyCi1sYWd1cm11a2hpOzBBMzIKLWxha2toYW5neWFvdGhhaTswRTQ1Ci1sYW1hbGVmZmluYWxhcmFiaWM7RkVGQwotbGFtYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYztGRUY4Ci1sYW1hbGVmaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljO0ZFRjcKLWxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWM7RkVGQQotbGFtYWxlZmhhbXphYmVsb3dpc29sYXRlZGFyYWJpYztGRUY5Ci1sYW1hbGVmaXNvbGF0ZWRhcmFiaWM7RkVGQgotbGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYztGRUY2Ci1sYW1hbGVmbWFkZGFhYm92ZWlzb2xhdGVkYXJhYmljO0ZFRjUKLWxhbWFyYWJpYzswNjQ0Ci1sYW1iZGE7MDNCQgotbGFtYmRhc3Ryb2tlOzAxOUIKLWxhbWVkOzA1REMKLWxhbWVkZGFnZXNoO0ZCM0MKLWxhbWVkZGFnZXNoaGVicmV3O0ZCM0MKLWxhbWVkaGVicmV3OzA1REMKLWxhbWVkaG9sYW07MDVEQyAwNUI5Ci1sYW1lZGhvbGFtZGFnZXNoOzA1REMgMDVCOSAwNUJDCi1sYW1lZGhvbGFtZGFnZXNoaGVicmV3OzA1REMgMDVCOSAwNUJDCi1sYW1lZGhvbGFtaGVicmV3OzA1REMgMDVCOQotbGFtZmluYWxhcmFiaWM7RkVERQotbGFtaGFoaW5pdGlhbGFyYWJpYztGQ0NBCi1sYW1pbml0aWFsYXJhYmljO0ZFREYKLWxhbWplZW1pbml0aWFsYXJhYmljO0ZDQzkKLWxhbWtoYWhpbml0aWFsYXJhYmljO0ZDQ0IKLWxhbWxhbWhlaGlzb2xhdGVkYXJhYmljO0ZERjIKLWxhbW1lZGlhbGFyYWJpYztGRUUwCi1sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYztGRDg4Ci1sYW1tZWVtaW5pdGlhbGFyYWJpYztGQ0NDCi1sYW1tZWVtamVlbWluaXRpYWxhcmFiaWM7RkVERiBGRUU0IEZFQTAKLWxhbW1lZW1raGFoaW5pdGlhbGFyYWJpYztGRURGIEZFRTQgRkVBOAotbGFyZ2VjaXJjbGU7MjVFRgotbGJhcjswMTlBCi1sYmVsdDswMjZDCi1sYm9wb21vZm87MzEwQwotbGNhcm9uOzAxM0UKLWxjZWRpbGxhOzAxM0MKLWxjaXJjbGU7MjREQgotbGNpcmN1bWZsZXhiZWxvdzsxRTNECi1sY29tbWFhY2NlbnQ7MDEzQwotbGRvdDswMTQwCi1sZG90YWNjZW50OzAxNDAKLWxkb3RiZWxvdzsxRTM3Ci1sZG90YmVsb3dtYWNyb247MUUzOQotbGVmdGFuZ2xlYWJvdmVjbWI7MDMxQQotbGVmdHRhY2tiZWxvd2NtYjswMzE4Ci1sZXNzOzAwM0MKLWxlc3NlcXVhbDsyMjY0Ci1sZXNzZXF1YWxvcmdyZWF0ZXI7MjJEQQotbGVzc21vbm9zcGFjZTtGRjFDCi1sZXNzb3JlcXVpdmFsZW50OzIyNzIKLWxlc3NvcmdyZWF0ZXI7MjI3NgotbGVzc292ZXJlcXVhbDsyMjY2Ci1sZXNzc21hbGw7RkU2NAotbGV6aDswMjZFCi1sZmJsb2NrOzI1OEMKLWxob29rcmV0cm9mbGV4OzAyNkQKLWxpcmE7MjBBNAotbGl3bmFybWVuaWFuOzA1NkMKLWxqOzAxQzkKLWxqZWN5cmlsbGljOzA0NTkKLWxsO0Y2QzAKLWxsYWRldmE7MDkzMwotbGxhZ3VqYXJhdGk7MEFCMwotbGxpbmViZWxvdzsxRTNCCi1sbGxhZGV2YTswOTM0Ci1sbHZvY2FsaWNiZW5nYWxpOzA5RTEKLWxsdm9jYWxpY2RldmE7MDk2MQotbGx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaTswOUUzCi1sbHZvY2FsaWN2b3dlbHNpZ25kZXZhOzA5NjMKLWxtaWRkbGV0aWxkZTswMjZCCi1sbW9ub3NwYWNlO0ZGNEMKLWxtc3F1YXJlOzMzRDAKLWxvY2h1bGF0aGFpOzBFMkMKLWxvZ2ljYWxhbmQ7MjIyNwotbG9naWNhbG5vdDswMEFDCi1sb2dpY2Fsbm90cmV2ZXJzZWQ7MjMxMAotbG9naWNhbG9yOzIyMjgKLWxvbGluZ3RoYWk7MEUyNQotbG9uZ3M7MDE3RgotbG93bGluZWNlbnRlcmxpbmU7RkU0RQotbG93bGluZWNtYjswMzMyCi1sb3dsaW5lZGFzaGVkO0ZFNEQKLWxvemVuZ2U7MjVDQQotbHBhcmVuOzI0QTcKLWxzbGFzaDswMTQyCi1sc3F1YXJlOzIxMTMKLWxzdXBlcmlvcjtGNkVFCi1sdHNoYWRlOzI1OTEKLWx1dGhhaTswRTI2Ci1sdm9jYWxpY2JlbmdhbGk7MDk4QwotbHZvY2FsaWNkZXZhOzA5MEMKLWx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaTswOUUyCi1sdm9jYWxpY3Zvd2Vsc2lnbmRldmE7MDk2MgotbHhzcXVhcmU7MzNEMwotbTswMDZECi1tYWJlbmdhbGk7MDlBRQotbWFjcm9uOzAwQUYKLW1hY3JvbmJlbG93Y21iOzAzMzEKLW1hY3JvbmNtYjswMzA0Ci1tYWNyb25sb3dtb2Q7MDJDRAotbWFjcm9ubW9ub3NwYWNlO0ZGRTMKLW1hY3V0ZTsxRTNGCi1tYWRldmE7MDkyRQotbWFndWphcmF0aTswQUFFCi1tYWd1cm11a2hpOzBBMkUKLW1haGFwYWtoaGVicmV3OzA1QTQKLW1haGFwYWtobGVmdGhlYnJldzswNUE0Ci1tYWhpcmFnYW5hOzMwN0UKLW1haWNoYXR0YXdhbG93bGVmdHRoYWk7Rjg5NQotbWFpY2hhdHRhd2Fsb3dyaWdodHRoYWk7Rjg5NAotbWFpY2hhdHRhd2F0aGFpOzBFNEIKLW1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaTtGODkzCi1tYWlla2xvd2xlZnR0aGFpO0Y4OEMKLW1haWVrbG93cmlnaHR0aGFpO0Y4OEIKLW1haWVrdGhhaTswRTQ4Ci1tYWlla3VwcGVybGVmdHRoYWk7Rjg4QQotbWFpaGFuYWthdGxlZnR0aGFpO0Y4ODQKLW1haWhhbmFrYXR0aGFpOzBFMzEKLW1haXRhaWtodWxlZnR0aGFpO0Y4ODkKLW1haXRhaWtodXRoYWk7MEU0NwotbWFpdGhvbG93bGVmdHRoYWk7Rjg4RgotbWFpdGhvbG93cmlnaHR0aGFpO0Y4OEUKLW1haXRob3RoYWk7MEU0OQotbWFpdGhvdXBwZXJsZWZ0dGhhaTtGODhECi1tYWl0cmlsb3dsZWZ0dGhhaTtGODkyCi1tYWl0cmlsb3dyaWdodHRoYWk7Rjg5MQotbWFpdHJpdGhhaTswRTRBCi1tYWl0cml1cHBlcmxlZnR0aGFpO0Y4OTAKLW1haXlhbW9rdGhhaTswRTQ2Ci1tYWthdGFrYW5hOzMwREUKLW1ha2F0YWthbmFoYWxmd2lkdGg7RkY4RgotbWFsZTsyNjQyCi1tYW5zeW9uc3F1YXJlOzMzNDcKLW1hcWFmaGVicmV3OzA1QkUKLW1hcnM7MjY0MgotbWFzb3JhY2lyY2xlaGVicmV3OzA1QUYKLW1hc3F1YXJlOzMzODMKLW1ib3BvbW9mbzszMTA3Ci1tYnNxdWFyZTszM0Q0Ci1tY2lyY2xlOzI0REMKLW1jdWJlZHNxdWFyZTszM0E1Ci1tZG90YWNjZW50OzFFNDEKLW1kb3RiZWxvdzsxRTQzCi1tZWVtYXJhYmljOzA2NDUKLW1lZW1maW5hbGFyYWJpYztGRUUyCi1tZWVtaW5pdGlhbGFyYWJpYztGRUUzCi1tZWVtbWVkaWFsYXJhYmljO0ZFRTQKLW1lZW1tZWVtaW5pdGlhbGFyYWJpYztGQ0QxCi1tZWVtbWVlbWlzb2xhdGVkYXJhYmljO0ZDNDgKLW1lZXRvcnVzcXVhcmU7MzM0RAotbWVoaXJhZ2FuYTszMDgxCi1tZWl6aWVyYXNxdWFyZTszMzdFCi1tZWthdGFrYW5hOzMwRTEKLW1la2F0YWthbmFoYWxmd2lkdGg7RkY5MgotbWVtOzA1REUKLW1lbWRhZ2VzaDtGQjNFCi1tZW1kYWdlc2hoZWJyZXc7RkIzRQotbWVtaGVicmV3OzA1REUKLW1lbmFybWVuaWFuOzA1NzQKLW1lcmtoYWhlYnJldzswNUE1Ci1tZXJraGFrZWZ1bGFoZWJyZXc7MDVBNgotbWVya2hha2VmdWxhbGVmdGhlYnJldzswNUE2Ci1tZXJraGFsZWZ0aGVicmV3OzA1QTUKLW1ob29rOzAyNzEKLW1oenNxdWFyZTszMzkyCi1taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aDtGRjY1Ci1taWRkb3Q7MDBCNwotbWlldW1hY2lyY2xla29yZWFuOzMyNzIKLW1pZXVtYXBhcmVua29yZWFuOzMyMTIKLW1pZXVtY2lyY2xla29yZWFuOzMyNjQKLW1pZXVta29yZWFuOzMxNDEKLW1pZXVtcGFuc2lvc2tvcmVhbjszMTcwCi1taWV1bXBhcmVua29yZWFuOzMyMDQKLW1pZXVtcGlldXBrb3JlYW47MzE2RQotbWlldW1zaW9za29yZWFuOzMxNkYKLW1paGlyYWdhbmE7MzA3RgotbWlrYXRha2FuYTszMERGCi1taWthdGFrYW5haGFsZndpZHRoO0ZGOTAKLW1pbnVzOzIyMTIKLW1pbnVzYmVsb3djbWI7MDMyMAotbWludXNjaXJjbGU7MjI5NgotbWludXNtb2Q7MDJENwotbWludXNwbHVzOzIyMTMKLW1pbnV0ZTsyMDMyCi1taXJpYmFhcnVzcXVhcmU7MzM0QQotbWlyaXNxdWFyZTszMzQ5Ci1tbG9uZ2xlZ3R1cm5lZDswMjcwCi1tbHNxdWFyZTszMzk2Ci1tbWN1YmVkc3F1YXJlOzMzQTMKLW1tb25vc3BhY2U7RkY0RAotbW1zcXVhcmVkc3F1YXJlOzMzOUYKLW1vaGlyYWdhbmE7MzA4MgotbW9obXNxdWFyZTszM0MxCi1tb2thdGFrYW5hOzMwRTIKLW1va2F0YWthbmFoYWxmd2lkdGg7RkY5MwotbW9sc3F1YXJlOzMzRDYKLW1vbWF0aGFpOzBFMjEKLW1vdmVyc3NxdWFyZTszM0E3Ci1tb3ZlcnNzcXVhcmVkc3F1YXJlOzMzQTgKLW1wYXJlbjsyNEE4Ci1tcGFzcXVhcmU7MzNBQgotbXNzcXVhcmU7MzNCMwotbXN1cGVyaW9yO0Y2RUYKLW10dXJuZWQ7MDI2RgotbXU7MDBCNQotbXUxOzAwQjUKLW11YXNxdWFyZTszMzgyCi1tdWNoZ3JlYXRlcjsyMjZCCi1tdWNobGVzczsyMjZBCi1tdWZzcXVhcmU7MzM4QwotbXVncmVlazswM0JDCi1tdWdzcXVhcmU7MzM4RAotbXVoaXJhZ2FuYTszMDgwCi1tdWthdGFrYW5hOzMwRTAKLW11a2F0YWthbmFoYWxmd2lkdGg7RkY5MQotbXVsc3F1YXJlOzMzOTUKLW11bHRpcGx5OzAwRDcKLW11bXNxdWFyZTszMzlCCi1tdW5haGhlYnJldzswNUEzCi1tdW5haGxlZnRoZWJyZXc7MDVBMwotbXVzaWNhbG5vdGU7MjY2QQotbXVzaWNhbG5vdGVkYmw7MjY2QgotbXVzaWNmbGF0c2lnbjsyNjZECi1tdXNpY3NoYXJwc2lnbjsyNjZGCi1tdXNzcXVhcmU7MzNCMgotbXV2c3F1YXJlOzMzQjYKLW11d3NxdWFyZTszM0JDCi1tdm1lZ2FzcXVhcmU7MzNCOQotbXZzcXVhcmU7MzNCNwotbXdtZWdhc3F1YXJlOzMzQkYKLW13c3F1YXJlOzMzQkQKLW47MDA2RQotbmFiZW5nYWxpOzA5QTgKLW5hYmxhOzIyMDcKLW5hY3V0ZTswMTQ0Ci1uYWRldmE7MDkyOAotbmFndWphcmF0aTswQUE4Ci1uYWd1cm11a2hpOzBBMjgKLW5haGlyYWdhbmE7MzA2QQotbmFrYXRha2FuYTszMENBCi1uYWthdGFrYW5haGFsZndpZHRoO0ZGODUKLW5hcG9zdHJvcGhlOzAxNDkKLW5hc3F1YXJlOzMzODEKLW5ib3BvbW9mbzszMTBCCi1uYnNwYWNlOzAwQTAKLW5jYXJvbjswMTQ4Ci1uY2VkaWxsYTswMTQ2Ci1uY2lyY2xlOzI0REQKLW5jaXJjdW1mbGV4YmVsb3c7MUU0QgotbmNvbW1hYWNjZW50OzAxNDYKLW5kb3RhY2NlbnQ7MUU0NQotbmRvdGJlbG93OzFFNDcKLW5laGlyYWdhbmE7MzA2RAotbmVrYXRha2FuYTszMENECi1uZWthdGFrYW5haGFsZndpZHRoO0ZGODgKLW5ld3NoZXFlbHNpZ247MjBBQQotbmZzcXVhcmU7MzM4QgotbmdhYmVuZ2FsaTswOTk5Ci1uZ2FkZXZhOzA5MTkKLW5nYWd1amFyYXRpOzBBOTkKLW5nYWd1cm11a2hpOzBBMTkKLW5nb25ndXRoYWk7MEUwNwotbmhpcmFnYW5hOzMwOTMKLW5ob29rbGVmdDswMjcyCi1uaG9va3JldHJvZmxleDswMjczCi1uaWV1bmFjaXJjbGVrb3JlYW47MzI2RgotbmlldW5hcGFyZW5rb3JlYW47MzIwRgotbmlldW5jaWV1Y2tvcmVhbjszMTM1Ci1uaWV1bmNpcmNsZWtvcmVhbjszMjYxCi1uaWV1bmhpZXVoa29yZWFuOzMxMzYKLW5pZXVua29yZWFuOzMxMzQKLW5pZXVucGFuc2lvc2tvcmVhbjszMTY4Ci1uaWV1bnBhcmVua29yZWFuOzMyMDEKLW5pZXVuc2lvc2tvcmVhbjszMTY3Ci1uaWV1bnRpa2V1dGtvcmVhbjszMTY2Ci1uaWhpcmFnYW5hOzMwNkIKLW5pa2F0YWthbmE7MzBDQgotbmlrYXRha2FuYWhhbGZ3aWR0aDtGRjg2Ci1uaWtoYWhpdGxlZnR0aGFpO0Y4OTkKLW5pa2hhaGl0dGhhaTswRTRECi1uaW5lOzAwMzkKLW5pbmVhcmFiaWM7MDY2OQotbmluZWJlbmdhbGk7MDlFRgotbmluZWNpcmNsZTsyNDY4Ci1uaW5lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZjsyNzkyCi1uaW5lZGV2YTswOTZGCi1uaW5lZ3VqYXJhdGk7MEFFRgotbmluZWd1cm11a2hpOzBBNkYKLW5pbmVoYWNrYXJhYmljOzA2NjkKLW5pbmVoYW5nemhvdTszMDI5Ci1uaW5laWRlb2dyYXBoaWNwYXJlbjszMjI4Ci1uaW5laW5mZXJpb3I7MjA4OQotbmluZW1vbm9zcGFjZTtGRjE5Ci1uaW5lb2xkc3R5bGU7RjczOQotbmluZXBhcmVuOzI0N0MKLW5pbmVwZXJpb2Q7MjQ5MAotbmluZXBlcnNpYW47MDZGOQotbmluZXJvbWFuOzIxNzgKLW5pbmVzdXBlcmlvcjsyMDc5Ci1uaW5ldGVlbmNpcmNsZTsyNDcyCi1uaW5ldGVlbnBhcmVuOzI0ODYKLW5pbmV0ZWVucGVyaW9kOzI0OUEKLW5pbmV0aGFpOzBFNTkKLW5qOzAxQ0MKLW5qZWN5cmlsbGljOzA0NUEKLW5rYXRha2FuYTszMEYzCi1ua2F0YWthbmFoYWxmd2lkdGg7RkY5RAotbmxlZ3JpZ2h0bG9uZzswMTlFCi1ubGluZWJlbG93OzFFNDkKLW5tb25vc3BhY2U7RkY0RQotbm1zcXVhcmU7MzM5QQotbm5hYmVuZ2FsaTswOUEzCi1ubmFkZXZhOzA5MjMKLW5uYWd1amFyYXRpOzBBQTMKLW5uYWd1cm11a2hpOzBBMjMKLW5ubmFkZXZhOzA5MjkKLW5vaGlyYWdhbmE7MzA2RQotbm9rYXRha2FuYTszMENFCi1ub2thdGFrYW5haGFsZndpZHRoO0ZGODkKLW5vbmJyZWFraW5nc3BhY2U7MDBBMAotbm9uZW50aGFpOzBFMTMKLW5vbnV0aGFpOzBFMTkKLW5vb25hcmFiaWM7MDY0Ngotbm9vbmZpbmFsYXJhYmljO0ZFRTYKLW5vb25naHVubmFhcmFiaWM7MDZCQQotbm9vbmdodW5uYWZpbmFsYXJhYmljO0ZCOUYKLW5vb25oZWhpbml0aWFsYXJhYmljO0ZFRTcgRkVFQwotbm9vbmluaXRpYWxhcmFiaWM7RkVFNwotbm9vbmplZW1pbml0aWFsYXJhYmljO0ZDRDIKLW5vb25qZWVtaXNvbGF0ZWRhcmFiaWM7RkM0Qgotbm9vbm1lZGlhbGFyYWJpYztGRUU4Ci1ub29ubWVlbWluaXRpYWxhcmFiaWM7RkNENQotbm9vbm1lZW1pc29sYXRlZGFyYWJpYztGQzRFCi1ub29ubm9vbmZpbmFsYXJhYmljO0ZDOEQKLW5vdGNvbnRhaW5zOzIyMEMKLW5vdGVsZW1lbnQ7MjIwOQotbm90ZWxlbWVudG9mOzIyMDkKLW5vdGVxdWFsOzIyNjAKLW5vdGdyZWF0ZXI7MjI2Rgotbm90Z3JlYXRlcm5vcmVxdWFsOzIyNzEKLW5vdGdyZWF0ZXJub3JsZXNzOzIyNzkKLW5vdGlkZW50aWNhbDsyMjYyCi1ub3RsZXNzOzIyNkUKLW5vdGxlc3Nub3JlcXVhbDsyMjcwCi1ub3RwYXJhbGxlbDsyMjI2Ci1ub3RwcmVjZWRlczsyMjgwCi1ub3RzdWJzZXQ7MjI4NAotbm90c3VjY2VlZHM7MjI4MQotbm90c3VwZXJzZXQ7MjI4NQotbm93YXJtZW5pYW47MDU3NgotbnBhcmVuOzI0QTkKLW5zc3F1YXJlOzMzQjEKLW5zdXBlcmlvcjsyMDdGCi1udGlsZGU7MDBGMQotbnU7MDNCRAotbnVoaXJhZ2FuYTszMDZDCi1udWthdGFrYW5hOzMwQ0MKLW51a2F0YWthbmFoYWxmd2lkdGg7RkY4NwotbnVrdGFiZW5nYWxpOzA5QkMKLW51a3RhZGV2YTswOTNDCi1udWt0YWd1amFyYXRpOzBBQkMKLW51a3RhZ3VybXVraGk7MEEzQwotbnVtYmVyc2lnbjswMDIzCi1udW1iZXJzaWdubW9ub3NwYWNlO0ZGMDMKLW51bWJlcnNpZ25zbWFsbDtGRTVGCi1udW1lcmFsc2lnbmdyZWVrOzAzNzQKLW51bWVyYWxzaWdubG93ZXJncmVlazswMzc1Ci1udW1lcm87MjExNgotbnVuOzA1RTAKLW51bmRhZ2VzaDtGQjQwCi1udW5kYWdlc2hoZWJyZXc7RkI0MAotbnVuaGVicmV3OzA1RTAKLW52c3F1YXJlOzMzQjUKLW53c3F1YXJlOzMzQkIKLW55YWJlbmdhbGk7MDk5RQotbnlhZGV2YTswOTFFCi1ueWFndWphcmF0aTswQTlFCi1ueWFndXJtdWtoaTswQTFFCi1vOzAwNkYKLW9hY3V0ZTswMEYzCi1vYW5ndGhhaTswRTJECi1vYmFycmVkOzAyNzUKLW9iYXJyZWRjeXJpbGxpYzswNEU5Ci1vYmFycmVkZGllcmVzaXNjeXJpbGxpYzswNEVCCi1vYmVuZ2FsaTswOTkzCi1vYm9wb21vZm87MzExQgotb2JyZXZlOzAxNEYKLW9jYW5kcmFkZXZhOzA5MTEKLW9jYW5kcmFndWphcmF0aTswQTkxCi1vY2FuZHJhdm93ZWxzaWduZGV2YTswOTQ5Ci1vY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGk7MEFDOQotb2Nhcm9uOzAxRDIKLW9jaXJjbGU7MjRERQotb2NpcmN1bWZsZXg7MDBGNAotb2NpcmN1bWZsZXhhY3V0ZTsxRUQxCi1vY2lyY3VtZmxleGRvdGJlbG93OzFFRDkKLW9jaXJjdW1mbGV4Z3JhdmU7MUVEMwotb2NpcmN1bWZsZXhob29rYWJvdmU7MUVENQotb2NpcmN1bWZsZXh0aWxkZTsxRUQ3Ci1vY3lyaWxsaWM7MDQzRQotb2RibGFjdXRlOzAxNTEKLW9kYmxncmF2ZTswMjBECi1vZGV2YTswOTEzCi1vZGllcmVzaXM7MDBGNgotb2RpZXJlc2lzY3lyaWxsaWM7MDRFNwotb2RvdGJlbG93OzFFQ0QKLW9lOzAxNTMKLW9la29yZWFuOzMxNUEKLW9nb25lazswMkRCCi1vZ29uZWtjbWI7MDMyOAotb2dyYXZlOzAwRjIKLW9ndWphcmF0aTswQTkzCi1vaGFybWVuaWFuOzA1ODUKLW9oaXJhZ2FuYTszMDRBCi1vaG9va2Fib3ZlOzFFQ0YKLW9ob3JuOzAxQTEKLW9ob3JuYWN1dGU7MUVEQgotb2hvcm5kb3RiZWxvdzsxRUUzCi1vaG9ybmdyYXZlOzFFREQKLW9ob3JuaG9va2Fib3ZlOzFFREYKLW9ob3JudGlsZGU7MUVFMQotb2h1bmdhcnVtbGF1dDswMTUxCi1vaTswMUEzCi1vaW52ZXJ0ZWRicmV2ZTswMjBGCi1va2F0YWthbmE7MzBBQQotb2thdGFrYW5haGFsZndpZHRoO0ZGNzUKLW9rb3JlYW47MzE1Nwotb2xlaGVicmV3OzA1QUIKLW9tYWNyb247MDE0RAotb21hY3JvbmFjdXRlOzFFNTMKLW9tYWNyb25ncmF2ZTsxRTUxCi1vbWRldmE7MDk1MAotb21lZ2E7MDNDOQotb21lZ2ExOzAzRDYKLW9tZWdhY3lyaWxsaWM7MDQ2MQotb21lZ2FsYXRpbmNsb3NlZDswMjc3Ci1vbWVnYXJvdW5kY3lyaWxsaWM7MDQ3Qgotb21lZ2F0aXRsb2N5cmlsbGljOzA0N0QKLW9tZWdhdG9ub3M7MDNDRQotb21ndWphcmF0aTswQUQwCi1vbWljcm9uOzAzQkYKLW9taWNyb250b25vczswM0NDCi1vbW9ub3NwYWNlO0ZGNEYKLW9uZTswMDMxCi1vbmVhcmFiaWM7MDY2MQotb25lYmVuZ2FsaTswOUU3Ci1vbmVjaXJjbGU7MjQ2MAotb25lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZjsyNzhBCi1vbmVkZXZhOzA5NjcKLW9uZWRvdGVubGVhZGVyOzIwMjQKLW9uZWVpZ2h0aDsyMTVCCi1vbmVmaXR0ZWQ7RjZEQwotb25lZ3VqYXJhdGk7MEFFNwotb25lZ3VybXVraGk7MEE2Nwotb25laGFja2FyYWJpYzswNjYxCi1vbmVoYWxmOzAwQkQKLW9uZWhhbmd6aG91OzMwMjEKLW9uZWlkZW9ncmFwaGljcGFyZW47MzIyMAotb25laW5mZXJpb3I7MjA4MQotb25lbW9ub3NwYWNlO0ZGMTEKLW9uZW51bWVyYXRvcmJlbmdhbGk7MDlGNAotb25lb2xkc3R5bGU7RjczMQotb25lcGFyZW47MjQ3NAotb25lcGVyaW9kOzI0ODgKLW9uZXBlcnNpYW47MDZGMQotb25lcXVhcnRlcjswMEJDCi1vbmVyb21hbjsyMTcwCi1vbmVzdXBlcmlvcjswMEI5Ci1vbmV0aGFpOzBFNTEKLW9uZXRoaXJkOzIxNTMKLW9vZ29uZWs7MDFFQgotb29nb25la21hY3JvbjswMUVECi1vb2d1cm11a2hpOzBBMTMKLW9vbWF0cmFndXJtdWtoaTswQTRCCi1vb3BlbjswMjU0Ci1vcGFyZW47MjRBQQotb3BlbmJ1bGxldDsyNUU2Ci1vcHRpb247MjMyNQotb3JkZmVtaW5pbmU7MDBBQQotb3JkbWFzY3VsaW5lOzAwQkEKLW9ydGhvZ29uYWw7MjIxRgotb3Nob3J0ZGV2YTswOTEyCi1vc2hvcnR2b3dlbHNpZ25kZXZhOzA5NEEKLW9zbGFzaDswMEY4Ci1vc2xhc2hhY3V0ZTswMUZGCi1vc21hbGxoaXJhZ2FuYTszMDQ5Ci1vc21hbGxrYXRha2FuYTszMEE5Ci1vc21hbGxrYXRha2FuYWhhbGZ3aWR0aDtGRjZCCi1vc3Ryb2tlYWN1dGU7MDFGRgotb3N1cGVyaW9yO0Y2RjAKLW90Y3lyaWxsaWM7MDQ3Rgotb3RpbGRlOzAwRjUKLW90aWxkZWFjdXRlOzFFNEQKLW90aWxkZWRpZXJlc2lzOzFFNEYKLW91Ym9wb21vZm87MzEyMQotb3ZlcmxpbmU7MjAzRQotb3ZlcmxpbmVjZW50ZXJsaW5lO0ZFNEEKLW92ZXJsaW5lY21iOzAzMDUKLW92ZXJsaW5lZGFzaGVkO0ZFNDkKLW92ZXJsaW5lZGJsd2F2eTtGRTRDCi1vdmVybGluZXdhdnk7RkU0Qgotb3ZlcnNjb3JlOzAwQUYKLW92b3dlbHNpZ25iZW5nYWxpOzA5Q0IKLW92b3dlbHNpZ25kZXZhOzA5NEIKLW92b3dlbHNpZ25ndWphcmF0aTswQUNCCi1wOzAwNzAKLXBhYW1wc3NxdWFyZTszMzgwCi1wYWFzZW50b3NxdWFyZTszMzJCCi1wYWJlbmdhbGk7MDlBQQotcGFjdXRlOzFFNTUKLXBhZGV2YTswOTJBCi1wYWdlZG93bjsyMURGCi1wYWdldXA7MjFERQotcGFndWphcmF0aTswQUFBCi1wYWd1cm11a2hpOzBBMkEKLXBhaGlyYWdhbmE7MzA3MQotcGFpeWFubm9pdGhhaTswRTJGCi1wYWthdGFrYW5hOzMwRDEKLXBhbGF0YWxpemF0aW9uY3lyaWxsaWNjbWI7MDQ4NAotcGFsb2Noa2FjeXJpbGxpYzswNEMwCi1wYW5zaW9za29yZWFuOzMxN0YKLXBhcmFncmFwaDswMEI2Ci1wYXJhbGxlbDsyMjI1Ci1wYXJlbmxlZnQ7MDAyOAotcGFyZW5sZWZ0YWx0b25lYXJhYmljO0ZEM0UKLXBhcmVubGVmdGJ0O0Y4RUQKLXBhcmVubGVmdGV4O0Y4RUMKLXBhcmVubGVmdGluZmVyaW9yOzIwOEQKLXBhcmVubGVmdG1vbm9zcGFjZTtGRjA4Ci1wYXJlbmxlZnRzbWFsbDtGRTU5Ci1wYXJlbmxlZnRzdXBlcmlvcjsyMDdECi1wYXJlbmxlZnR0cDtGOEVCCi1wYXJlbmxlZnR2ZXJ0aWNhbDtGRTM1Ci1wYXJlbnJpZ2h0OzAwMjkKLXBhcmVucmlnaHRhbHRvbmVhcmFiaWM7RkQzRgotcGFyZW5yaWdodGJ0O0Y4RjgKLXBhcmVucmlnaHRleDtGOEY3Ci1wYXJlbnJpZ2h0aW5mZXJpb3I7MjA4RQotcGFyZW5yaWdodG1vbm9zcGFjZTtGRjA5Ci1wYXJlbnJpZ2h0c21hbGw7RkU1QQotcGFyZW5yaWdodHN1cGVyaW9yOzIwN0UKLXBhcmVucmlnaHR0cDtGOEY2Ci1wYXJlbnJpZ2h0dmVydGljYWw7RkUzNgotcGFydGlhbGRpZmY7MjIwMgotcGFzZXFoZWJyZXc7MDVDMAotcGFzaHRhaGVicmV3OzA1OTkKLXBhc3F1YXJlOzMzQTkKLXBhdGFoOzA1QjcKLXBhdGFoMTE7MDVCNwotcGF0YWgxZDswNUI3Ci1wYXRhaDJhOzA1QjcKLXBhdGFoaGVicmV3OzA1QjcKLXBhdGFobmFycm93aGVicmV3OzA1QjcKLXBhdGFocXVhcnRlcmhlYnJldzswNUI3Ci1wYXRhaHdpZGVoZWJyZXc7MDVCNwotcGF6ZXJoZWJyZXc7MDVBMQotcGJvcG9tb2ZvOzMxMDYKLXBjaXJjbGU7MjRERgotcGRvdGFjY2VudDsxRTU3Ci1wZTswNUU0Ci1wZWN5cmlsbGljOzA0M0YKLXBlZGFnZXNoO0ZCNDQKLXBlZGFnZXNoaGVicmV3O0ZCNDQKLXBlZXppc3F1YXJlOzMzM0IKLXBlZmluYWxkYWdlc2hoZWJyZXc7RkI0MwotcGVoYXJhYmljOzA2N0UKLXBlaGFybWVuaWFuOzA1N0EKLXBlaGVicmV3OzA1RTQKLXBlaGZpbmFsYXJhYmljO0ZCNTcKLXBlaGluaXRpYWxhcmFiaWM7RkI1OAotcGVoaXJhZ2FuYTszMDdBCi1wZWhtZWRpYWxhcmFiaWM7RkI1OQotcGVrYXRha2FuYTszMERBCi1wZW1pZGRsZWhvb2tjeXJpbGxpYzswNEE3Ci1wZXJhZmVoZWJyZXc7RkI0RQotcGVyY2VudDswMDI1Ci1wZXJjZW50YXJhYmljOzA2NkEKLXBlcmNlbnRtb25vc3BhY2U7RkYwNQotcGVyY2VudHNtYWxsO0ZFNkEKLXBlcmlvZDswMDJFCi1wZXJpb2Rhcm1lbmlhbjswNTg5Ci1wZXJpb2RjZW50ZXJlZDswMEI3Ci1wZXJpb2RoYWxmd2lkdGg7RkY2MQotcGVyaW9kaW5mZXJpb3I7RjZFNwotcGVyaW9kbW9ub3NwYWNlO0ZGMEUKLXBlcmlvZHNtYWxsO0ZFNTIKLXBlcmlvZHN1cGVyaW9yO0Y2RTgKLXBlcmlzcG9tZW5pZ3JlZWtjbWI7MDM0MgotcGVycGVuZGljdWxhcjsyMkE1Ci1wZXJ0aG91c2FuZDsyMDMwCi1wZXNldGE7MjBBNwotcGZzcXVhcmU7MzM4QQotcGhhYmVuZ2FsaTswOUFCCi1waGFkZXZhOzA5MkIKLXBoYWd1amFyYXRpOzBBQUIKLXBoYWd1cm11a2hpOzBBMkIKLXBoaTswM0M2Ci1waGkxOzAzRDUKLXBoaWV1cGhhY2lyY2xla29yZWFuOzMyN0EKLXBoaWV1cGhhcGFyZW5rb3JlYW47MzIxQQotcGhpZXVwaGNpcmNsZWtvcmVhbjszMjZDCi1waGlldXBoa29yZWFuOzMxNEQKLXBoaWV1cGhwYXJlbmtvcmVhbjszMjBDCi1waGlsYXRpbjswMjc4Ci1waGludGh1dGhhaTswRTNBCi1waGlzeW1ib2xncmVlazswM0Q1Ci1waG9vazswMUE1Ci1waG9waGFudGhhaTswRTFFCi1waG9waHVuZ3RoYWk7MEUxQwotcGhvc2FtcGhhb3RoYWk7MEUyMAotcGk7MDNDMAotcGlldXBhY2lyY2xla29yZWFuOzMyNzMKLXBpZXVwYXBhcmVua29yZWFuOzMyMTMKLXBpZXVwY2lldWNrb3JlYW47MzE3NgotcGlldXBjaXJjbGVrb3JlYW47MzI2NQotcGlldXBraXllb2trb3JlYW47MzE3MgotcGlldXBrb3JlYW47MzE0MgotcGlldXBwYXJlbmtvcmVhbjszMjA1Ci1waWV1cHNpb3NraXllb2trb3JlYW47MzE3NAotcGlldXBzaW9za29yZWFuOzMxNDQKLXBpZXVwc2lvc3Rpa2V1dGtvcmVhbjszMTc1Ci1waWV1cHRoaWV1dGhrb3JlYW47MzE3NwotcGlldXB0aWtldXRrb3JlYW47MzE3MwotcGloaXJhZ2FuYTszMDc0Ci1waWthdGFrYW5hOzMwRDQKLXBpc3ltYm9sZ3JlZWs7MDNENgotcGl3cmFybWVuaWFuOzA1ODMKLXBsdXM7MDAyQgotcGx1c2JlbG93Y21iOzAzMUYKLXBsdXNjaXJjbGU7MjI5NQotcGx1c21pbnVzOzAwQjEKLXBsdXNtb2Q7MDJENgotcGx1c21vbm9zcGFjZTtGRjBCCi1wbHVzc21hbGw7RkU2MgotcGx1c3N1cGVyaW9yOzIwN0EKLXBtb25vc3BhY2U7RkY1MAotcG1zcXVhcmU7MzNEOAotcG9oaXJhZ2FuYTszMDdECi1wb2ludGluZ2luZGV4ZG93bndoaXRlOzI2MUYKLXBvaW50aW5naW5kZXhsZWZ0d2hpdGU7MjYxQwotcG9pbnRpbmdpbmRleHJpZ2h0d2hpdGU7MjYxRQotcG9pbnRpbmdpbmRleHVwd2hpdGU7MjYxRAotcG9rYXRha2FuYTszMERECi1wb3BsYXRoYWk7MEUxQgotcG9zdGFsbWFyazszMDEyCi1wb3N0YWxtYXJrZmFjZTszMDIwCi1wcGFyZW47MjRBQgotcHJlY2VkZXM7MjI3QQotcHJlc2NyaXB0aW9uOzIxMUUKLXByaW1lbW9kOzAyQjkKLXByaW1lcmV2ZXJzZWQ7MjAzNQotcHJvZHVjdDsyMjBGCi1wcm9qZWN0aXZlOzIzMDUKLXByb2xvbmdlZGthbmE7MzBGQwotcHJvcGVsbG9yOzIzMTgKLXByb3BlcnN1YnNldDsyMjgyCi1wcm9wZXJzdXBlcnNldDsyMjgzCi1wcm9wb3J0aW9uOzIyMzcKLXByb3BvcnRpb25hbDsyMjFECi1wc2k7MDNDOAotcHNpY3lyaWxsaWM7MDQ3MQotcHNpbGlwbmV1bWF0YWN5cmlsbGljY21iOzA0ODYKLXBzc3F1YXJlOzMzQjAKLXB1aGlyYWdhbmE7MzA3NwotcHVrYXRha2FuYTszMEQ3Ci1wdnNxdWFyZTszM0I0Ci1wd3NxdWFyZTszM0JBCi1xOzAwNzEKLXFhZGV2YTswOTU4Ci1xYWRtYWhlYnJldzswNUE4Ci1xYWZhcmFiaWM7MDY0MgotcWFmZmluYWxhcmFiaWM7RkVENgotcWFmaW5pdGlhbGFyYWJpYztGRUQ3Ci1xYWZtZWRpYWxhcmFiaWM7RkVEOAotcWFtYXRzOzA1QjgKLXFhbWF0czEwOzA1QjgKLXFhbWF0czFhOzA1QjgKLXFhbWF0czFjOzA1QjgKLXFhbWF0czI3OzA1QjgKLXFhbWF0czI5OzA1QjgKLXFhbWF0czMzOzA1QjgKLXFhbWF0c2RlOzA1QjgKLXFhbWF0c2hlYnJldzswNUI4Ci1xYW1hdHNuYXJyb3doZWJyZXc7MDVCOAotcWFtYXRzcWF0YW5oZWJyZXc7MDVCOAotcWFtYXRzcWF0YW5uYXJyb3doZWJyZXc7MDVCOAotcWFtYXRzcWF0YW5xdWFydGVyaGVicmV3OzA1QjgKLXFhbWF0c3FhdGFud2lkZWhlYnJldzswNUI4Ci1xYW1hdHNxdWFydGVyaGVicmV3OzA1QjgKLXFhbWF0c3dpZGVoZWJyZXc7MDVCOAotcWFybmV5cGFyYWhlYnJldzswNTlGCi1xYm9wb21vZm87MzExMQotcWNpcmNsZTsyNEUwCi1xaG9vazswMkEwCi1xbW9ub3NwYWNlO0ZGNTEKLXFvZjswNUU3Ci1xb2ZkYWdlc2g7RkI0NwotcW9mZGFnZXNoaGVicmV3O0ZCNDcKLXFvZmhhdGFmcGF0YWg7MDVFNyAwNUIyCi1xb2ZoYXRhZnBhdGFoaGVicmV3OzA1RTcgMDVCMgotcW9maGF0YWZzZWdvbDswNUU3IDA1QjEKLXFvZmhhdGFmc2Vnb2xoZWJyZXc7MDVFNyAwNUIxCi1xb2ZoZWJyZXc7MDVFNwotcW9maGlyaXE7MDVFNyAwNUI0Ci1xb2ZoaXJpcWhlYnJldzswNUU3IDA1QjQKLXFvZmhvbGFtOzA1RTcgMDVCOQotcW9maG9sYW1oZWJyZXc7MDVFNyAwNUI5Ci1xb2ZwYXRhaDswNUU3IDA1QjcKLXFvZnBhdGFoaGVicmV3OzA1RTcgMDVCNwotcW9mcWFtYXRzOzA1RTcgMDVCOAotcW9mcWFtYXRzaGVicmV3OzA1RTcgMDVCOAotcW9mcXVidXRzOzA1RTcgMDVCQgotcW9mcXVidXRzaGVicmV3OzA1RTcgMDVCQgotcW9mc2Vnb2w7MDVFNyAwNUI2Ci1xb2ZzZWdvbGhlYnJldzswNUU3IDA1QjYKLXFvZnNoZXZhOzA1RTcgMDVCMAotcW9mc2hldmFoZWJyZXc7MDVFNyAwNUIwCi1xb2Z0c2VyZTswNUU3IDA1QjUKLXFvZnRzZXJlaGVicmV3OzA1RTcgMDVCNQotcXBhcmVuOzI0QUMKLXF1YXJ0ZXJub3RlOzI2NjkKLXF1YnV0czswNUJCCi1xdWJ1dHMxODswNUJCCi1xdWJ1dHMyNTswNUJCCi1xdWJ1dHMzMTswNUJCCi1xdWJ1dHNoZWJyZXc7MDVCQgotcXVidXRzbmFycm93aGVicmV3OzA1QkIKLXF1YnV0c3F1YXJ0ZXJoZWJyZXc7MDVCQgotcXVidXRzd2lkZWhlYnJldzswNUJCCi1xdWVzdGlvbjswMDNGCi1xdWVzdGlvbmFyYWJpYzswNjFGCi1xdWVzdGlvbmFybWVuaWFuOzA1NUUKLXF1ZXN0aW9uZG93bjswMEJGCi1xdWVzdGlvbmRvd25zbWFsbDtGN0JGCi1xdWVzdGlvbmdyZWVrOzAzN0UKLXF1ZXN0aW9ubW9ub3NwYWNlO0ZGMUYKLXF1ZXN0aW9uc21hbGw7RjczRgotcXVvdGVkYmw7MDAyMgotcXVvdGVkYmxiYXNlOzIwMUUKLXF1b3RlZGJsbGVmdDsyMDFDCi1xdW90ZWRibG1vbm9zcGFjZTtGRjAyCi1xdW90ZWRibHByaW1lOzMwMUUKLXF1b3RlZGJscHJpbWVyZXZlcnNlZDszMDFECi1xdW90ZWRibHJpZ2h0OzIwMUQKLXF1b3RlbGVmdDsyMDE4Ci1xdW90ZWxlZnRyZXZlcnNlZDsyMDFCCi1xdW90ZXJldmVyc2VkOzIwMUIKLXF1b3RlcmlnaHQ7MjAxOQotcXVvdGVyaWdodG47MDE0OQotcXVvdGVzaW5nbGJhc2U7MjAxQQotcXVvdGVzaW5nbGU7MDAyNwotcXVvdGVzaW5nbGVtb25vc3BhY2U7RkYwNwotcjswMDcyCi1yYWFybWVuaWFuOzA1N0MKLXJhYmVuZ2FsaTswOUIwCi1yYWN1dGU7MDE1NQotcmFkZXZhOzA5MzAKLXJhZGljYWw7MjIxQQotcmFkaWNhbGV4O0Y4RTUKLXJhZG92ZXJzc3F1YXJlOzMzQUUKLXJhZG92ZXJzc3F1YXJlZHNxdWFyZTszM0FGCi1yYWRzcXVhcmU7MzNBRAotcmFmZTswNUJGCi1yYWZlaGVicmV3OzA1QkYKLXJhZ3VqYXJhdGk7MEFCMAotcmFndXJtdWtoaTswQTMwCi1yYWhpcmFnYW5hOzMwODkKLXJha2F0YWthbmE7MzBFOQotcmFrYXRha2FuYWhhbGZ3aWR0aDtGRjk3Ci1yYWxvd2VyZGlhZ29uYWxiZW5nYWxpOzA5RjEKLXJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpOzA5RjAKLXJhbXNob3JuOzAyNjQKLXJhdGlvOzIyMzYKLXJib3BvbW9mbzszMTE2Ci1yY2Fyb247MDE1OQotcmNlZGlsbGE7MDE1NwotcmNpcmNsZTsyNEUxCi1yY29tbWFhY2NlbnQ7MDE1NwotcmRibGdyYXZlOzAyMTEKLXJkb3RhY2NlbnQ7MUU1OQotcmRvdGJlbG93OzFFNUIKLXJkb3RiZWxvd21hY3JvbjsxRTVECi1yZWZlcmVuY2VtYXJrOzIwM0IKLXJlZmxleHN1YnNldDsyMjg2Ci1yZWZsZXhzdXBlcnNldDsyMjg3Ci1yZWdpc3RlcmVkOzAwQUUKLXJlZ2lzdGVyc2FucztGOEU4Ci1yZWdpc3RlcnNlcmlmO0Y2REEKLXJlaGFyYWJpYzswNjMxCi1yZWhhcm1lbmlhbjswNTgwCi1yZWhmaW5hbGFyYWJpYztGRUFFCi1yZWhpcmFnYW5hOzMwOEMKLXJlaHllaGFsZWZsYW1hcmFiaWM7MDYzMSBGRUYzIEZFOEUgMDY0NAotcmVrYXRha2FuYTszMEVDCi1yZWthdGFrYW5haGFsZndpZHRoO0ZGOUEKLXJlc2g7MDVFOAotcmVzaGRhZ2VzaGhlYnJldztGQjQ4Ci1yZXNoaGF0YWZwYXRhaDswNUU4IDA1QjIKLXJlc2hoYXRhZnBhdGFoaGVicmV3OzA1RTggMDVCMgotcmVzaGhhdGFmc2Vnb2w7MDVFOCAwNUIxCi1yZXNoaGF0YWZzZWdvbGhlYnJldzswNUU4IDA1QjEKLXJlc2hoZWJyZXc7MDVFOAotcmVzaGhpcmlxOzA1RTggMDVCNAotcmVzaGhpcmlxaGVicmV3OzA1RTggMDVCNAotcmVzaGhvbGFtOzA1RTggMDVCOQotcmVzaGhvbGFtaGVicmV3OzA1RTggMDVCOQotcmVzaHBhdGFoOzA1RTggMDVCNwotcmVzaHBhdGFoaGVicmV3OzA1RTggMDVCNwotcmVzaHFhbWF0czswNUU4IDA1QjgKLXJlc2hxYW1hdHNoZWJyZXc7MDVFOCAwNUI4Ci1yZXNocXVidXRzOzA1RTggMDVCQgotcmVzaHF1YnV0c2hlYnJldzswNUU4IDA1QkIKLXJlc2hzZWdvbDswNUU4IDA1QjYKLXJlc2hzZWdvbGhlYnJldzswNUU4IDA1QjYKLXJlc2hzaGV2YTswNUU4IDA1QjAKLXJlc2hzaGV2YWhlYnJldzswNUU4IDA1QjAKLXJlc2h0c2VyZTswNUU4IDA1QjUKLXJlc2h0c2VyZWhlYnJldzswNUU4IDA1QjUKLXJldmVyc2VkdGlsZGU7MjIzRAotcmV2aWFoZWJyZXc7MDU5NwotcmV2aWFtdWdyYXNoaGVicmV3OzA1OTcKLXJldmxvZ2ljYWxub3Q7MjMxMAotcmZpc2hob29rOzAyN0UKLXJmaXNoaG9va3JldmVyc2VkOzAyN0YKLXJoYWJlbmdhbGk7MDlERAotcmhhZGV2YTswOTVECi1yaG87MDNDMQotcmhvb2s7MDI3RAotcmhvb2t0dXJuZWQ7MDI3Qgotcmhvb2t0dXJuZWRzdXBlcmlvcjswMkI1Ci1yaG9zeW1ib2xncmVlazswM0YxCi1yaG90aWNob29rbW9kOzAyREUKLXJpZXVsYWNpcmNsZWtvcmVhbjszMjcxCi1yaWV1bGFwYXJlbmtvcmVhbjszMjExCi1yaWV1bGNpcmNsZWtvcmVhbjszMjYzCi1yaWV1bGhpZXVoa29yZWFuOzMxNDAKLXJpZXVsa2l5ZW9ra29yZWFuOzMxM0EKLXJpZXVsa2l5ZW9rc2lvc2tvcmVhbjszMTY5Ci1yaWV1bGtvcmVhbjszMTM5Ci1yaWV1bG1pZXVta29yZWFuOzMxM0IKLXJpZXVscGFuc2lvc2tvcmVhbjszMTZDCi1yaWV1bHBhcmVua29yZWFuOzMyMDMKLXJpZXVscGhpZXVwaGtvcmVhbjszMTNGCi1yaWV1bHBpZXVwa29yZWFuOzMxM0MKLXJpZXVscGlldXBzaW9za29yZWFuOzMxNkIKLXJpZXVsc2lvc2tvcmVhbjszMTNECi1yaWV1bHRoaWV1dGhrb3JlYW47MzEzRQotcmlldWx0aWtldXRrb3JlYW47MzE2QQotcmlldWx5ZW9yaW5oaWV1aGtvcmVhbjszMTZECi1yaWdodGFuZ2xlOzIyMUYKLXJpZ2h0dGFja2JlbG93Y21iOzAzMTkKLXJpZ2h0dHJpYW5nbGU7MjJCRgotcmloaXJhZ2FuYTszMDhBCi1yaWthdGFrYW5hOzMwRUEKLXJpa2F0YWthbmFoYWxmd2lkdGg7RkY5OAotcmluZzswMkRBCi1yaW5nYmVsb3djbWI7MDMyNQotcmluZ2NtYjswMzBBCi1yaW5naGFsZmxlZnQ7MDJCRgotcmluZ2hhbGZsZWZ0YXJtZW5pYW47MDU1OQotcmluZ2hhbGZsZWZ0YmVsb3djbWI7MDMxQwotcmluZ2hhbGZsZWZ0Y2VudGVyZWQ7MDJEMwotcmluZ2hhbGZyaWdodDswMkJFCi1yaW5naGFsZnJpZ2h0YmVsb3djbWI7MDMzOQotcmluZ2hhbGZyaWdodGNlbnRlcmVkOzAyRDIKLXJpbnZlcnRlZGJyZXZlOzAyMTMKLXJpdHRvcnVzcXVhcmU7MzM1MQotcmxpbmViZWxvdzsxRTVGCi1ybG9uZ2xlZzswMjdDCi1ybG9uZ2xlZ3R1cm5lZDswMjdBCi1ybW9ub3NwYWNlO0ZGNTIKLXJvaGlyYWdhbmE7MzA4RAotcm9rYXRha2FuYTszMEVECi1yb2thdGFrYW5haGFsZndpZHRoO0ZGOUIKLXJvcnVhdGhhaTswRTIzCi1ycGFyZW47MjRBRAotcnJhYmVuZ2FsaTswOURDCi1ycmFkZXZhOzA5MzEKLXJyYWd1cm11a2hpOzBBNUMKLXJyZWhhcmFiaWM7MDY5MQotcnJlaGZpbmFsYXJhYmljO0ZCOEQKLXJydm9jYWxpY2JlbmdhbGk7MDlFMAotcnJ2b2NhbGljZGV2YTswOTYwCi1ycnZvY2FsaWNndWphcmF0aTswQUUwCi1ycnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpOzA5QzQKLXJydm9jYWxpY3Zvd2Vsc2lnbmRldmE7MDk0NAotcnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGk7MEFDNAotcnN1cGVyaW9yO0Y2RjEKLXJ0YmxvY2s7MjU5MAotcnR1cm5lZDswMjc5Ci1ydHVybmVkc3VwZXJpb3I7MDJCNAotcnVoaXJhZ2FuYTszMDhCCi1ydWthdGFrYW5hOzMwRUIKLXJ1a2F0YWthbmFoYWxmd2lkdGg7RkY5OQotcnVwZWVtYXJrYmVuZ2FsaTswOUYyCi1ydXBlZXNpZ25iZW5nYWxpOzA5RjMKLXJ1cGlhaDtGNkRECi1ydXRoYWk7MEUyNAotcnZvY2FsaWNiZW5nYWxpOzA5OEIKLXJ2b2NhbGljZGV2YTswOTBCCi1ydm9jYWxpY2d1amFyYXRpOzBBOEIKLXJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaTswOUMzCi1ydm9jYWxpY3Zvd2Vsc2lnbmRldmE7MDk0MwotcnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aTswQUMzCi1zOzAwNzMKLXNhYmVuZ2FsaTswOUI4Ci1zYWN1dGU7MDE1Qgotc2FjdXRlZG90YWNjZW50OzFFNjUKLXNhZGFyYWJpYzswNjM1Ci1zYWRldmE7MDkzOAotc2FkZmluYWxhcmFiaWM7RkVCQQotc2FkaW5pdGlhbGFyYWJpYztGRUJCCi1zYWRtZWRpYWxhcmFiaWM7RkVCQwotc2FndWphcmF0aTswQUI4Ci1zYWd1cm11a2hpOzBBMzgKLXNhaGlyYWdhbmE7MzA1NQotc2FrYXRha2FuYTszMEI1Ci1zYWthdGFrYW5haGFsZndpZHRoO0ZGN0IKLXNhbGxhbGxhaG91YWxheWhld2FzYWxsYW1hcmFiaWM7RkRGQQotc2FtZWtoOzA1RTEKLXNhbWVraGRhZ2VzaDtGQjQxCi1zYW1la2hkYWdlc2hoZWJyZXc7RkI0MQotc2FtZWtoaGVicmV3OzA1RTEKLXNhcmFhYXRoYWk7MEUzMgotc2FyYWFldGhhaTswRTQxCi1zYXJhYWltYWltYWxhaXRoYWk7MEU0NAotc2FyYWFpbWFpbXVhbnRoYWk7MEU0Mwotc2FyYWFtdGhhaTswRTMzCi1zYXJhYXRoYWk7MEUzMAotc2FyYWV0aGFpOzBFNDAKLXNhcmFpaWxlZnR0aGFpO0Y4ODYKLXNhcmFpaXRoYWk7MEUzNQotc2FyYWlsZWZ0dGhhaTtGODg1Ci1zYXJhaXRoYWk7MEUzNAotc2FyYW90aGFpOzBFNDIKLXNhcmF1ZWVsZWZ0dGhhaTtGODg4Ci1zYXJhdWVldGhhaTswRTM3Ci1zYXJhdWVsZWZ0dGhhaTtGODg3Ci1zYXJhdWV0aGFpOzBFMzYKLXNhcmF1dGhhaTswRTM4Ci1zYXJhdXV0aGFpOzBFMzkKLXNib3BvbW9mbzszMTE5Ci1zY2Fyb247MDE2MQotc2Nhcm9uZG90YWNjZW50OzFFNjcKLXNjZWRpbGxhOzAxNUYKLXNjaHdhOzAyNTkKLXNjaHdhY3lyaWxsaWM7MDREOQotc2Nod2FkaWVyZXNpc2N5cmlsbGljOzA0REIKLXNjaHdhaG9vazswMjVBCi1zY2lyY2xlOzI0RTIKLXNjaXJjdW1mbGV4OzAxNUQKLXNjb21tYWFjY2VudDswMjE5Ci1zZG90YWNjZW50OzFFNjEKLXNkb3RiZWxvdzsxRTYzCi1zZG90YmVsb3dkb3RhY2NlbnQ7MUU2OQotc2VhZ3VsbGJlbG93Y21iOzAzM0MKLXNlY29uZDsyMDMzCi1zZWNvbmR0b25lY2hpbmVzZTswMkNBCi1zZWN0aW9uOzAwQTcKLXNlZW5hcmFiaWM7MDYzMwotc2VlbmZpbmFsYXJhYmljO0ZFQjIKLXNlZW5pbml0aWFsYXJhYmljO0ZFQjMKLXNlZW5tZWRpYWxhcmFiaWM7RkVCNAotc2Vnb2w7MDVCNgotc2Vnb2wxMzswNUI2Ci1zZWdvbDFmOzA1QjYKLXNlZ29sMmM7MDVCNgotc2Vnb2xoZWJyZXc7MDVCNgotc2Vnb2xuYXJyb3doZWJyZXc7MDVCNgotc2Vnb2xxdWFydGVyaGVicmV3OzA1QjYKLXNlZ29sdGFoZWJyZXc7MDU5Mgotc2Vnb2x3aWRlaGVicmV3OzA1QjYKLXNlaGFybWVuaWFuOzA1N0QKLXNlaGlyYWdhbmE7MzA1Qgotc2VrYXRha2FuYTszMEJCCi1zZWthdGFrYW5haGFsZndpZHRoO0ZGN0UKLXNlbWljb2xvbjswMDNCCi1zZW1pY29sb25hcmFiaWM7MDYxQgotc2VtaWNvbG9ubW9ub3NwYWNlO0ZGMUIKLXNlbWljb2xvbnNtYWxsO0ZFNTQKLXNlbWl2b2ljZWRtYXJra2FuYTszMDlDCi1zZW1pdm9pY2VkbWFya2thbmFoYWxmd2lkdGg7RkY5Rgotc2VudGlzcXVhcmU7MzMyMgotc2VudG9zcXVhcmU7MzMyMwotc2V2ZW47MDAzNwotc2V2ZW5hcmFiaWM7MDY2Nwotc2V2ZW5iZW5nYWxpOzA5RUQKLXNldmVuY2lyY2xlOzI0NjYKLXNldmVuY2lyY2xlaW52ZXJzZXNhbnNzZXJpZjsyNzkwCi1zZXZlbmRldmE7MDk2RAotc2V2ZW5laWdodGhzOzIxNUUKLXNldmVuZ3VqYXJhdGk7MEFFRAotc2V2ZW5ndXJtdWtoaTswQTZECi1zZXZlbmhhY2thcmFiaWM7MDY2Nwotc2V2ZW5oYW5nemhvdTszMDI3Ci1zZXZlbmlkZW9ncmFwaGljcGFyZW47MzIyNgotc2V2ZW5pbmZlcmlvcjsyMDg3Ci1zZXZlbm1vbm9zcGFjZTtGRjE3Ci1zZXZlbm9sZHN0eWxlO0Y3MzcKLXNldmVucGFyZW47MjQ3QQotc2V2ZW5wZXJpb2Q7MjQ4RQotc2V2ZW5wZXJzaWFuOzA2RjcKLXNldmVucm9tYW47MjE3Ngotc2V2ZW5zdXBlcmlvcjsyMDc3Ci1zZXZlbnRlZW5jaXJjbGU7MjQ3MAotc2V2ZW50ZWVucGFyZW47MjQ4NAotc2V2ZW50ZWVucGVyaW9kOzI0OTgKLXNldmVudGhhaTswRTU3Ci1zZnRoeXBoZW47MDBBRAotc2hhYXJtZW5pYW47MDU3Nwotc2hhYmVuZ2FsaTswOUI2Ci1zaGFjeXJpbGxpYzswNDQ4Ci1zaGFkZGFhcmFiaWM7MDY1MQotc2hhZGRhZGFtbWFhcmFiaWM7RkM2MQotc2hhZGRhZGFtbWF0YW5hcmFiaWM7RkM1RQotc2hhZGRhZmF0aGFhcmFiaWM7RkM2MAotc2hhZGRhZmF0aGF0YW5hcmFiaWM7MDY1MSAwNjRCCi1zaGFkZGFrYXNyYWFyYWJpYztGQzYyCi1zaGFkZGFrYXNyYXRhbmFyYWJpYztGQzVGCi1zaGFkZTsyNTkyCi1zaGFkZWRhcms7MjU5Mwotc2hhZGVsaWdodDsyNTkxCi1zaGFkZW1lZGl1bTsyNTkyCi1zaGFkZXZhOzA5MzYKLXNoYWd1amFyYXRpOzBBQjYKLXNoYWd1cm11a2hpOzBBMzYKLXNoYWxzaGVsZXRoZWJyZXc7MDU5Mwotc2hib3BvbW9mbzszMTE1Ci1zaGNoYWN5cmlsbGljOzA0NDkKLXNoZWVuYXJhYmljOzA2MzQKLXNoZWVuZmluYWxhcmFiaWM7RkVCNgotc2hlZW5pbml0aWFsYXJhYmljO0ZFQjcKLXNoZWVubWVkaWFsYXJhYmljO0ZFQjgKLXNoZWljb3B0aWM7MDNFMwotc2hlcWVsOzIwQUEKLXNoZXFlbGhlYnJldzsyMEFBCi1zaGV2YTswNUIwCi1zaGV2YTExNTswNUIwCi1zaGV2YTE1OzA1QjAKLXNoZXZhMjI7MDVCMAotc2hldmEyZTswNUIwCi1zaGV2YWhlYnJldzswNUIwCi1zaGV2YW5hcnJvd2hlYnJldzswNUIwCi1zaGV2YXF1YXJ0ZXJoZWJyZXc7MDVCMAotc2hldmF3aWRlaGVicmV3OzA1QjAKLXNoaGFjeXJpbGxpYzswNEJCCi1zaGltYWNvcHRpYzswM0VECi1zaGluOzA1RTkKLXNoaW5kYWdlc2g7RkI0OQotc2hpbmRhZ2VzaGhlYnJldztGQjQ5Ci1zaGluZGFnZXNoc2hpbmRvdDtGQjJDCi1zaGluZGFnZXNoc2hpbmRvdGhlYnJldztGQjJDCi1zaGluZGFnZXNoc2luZG90O0ZCMkQKLXNoaW5kYWdlc2hzaW5kb3RoZWJyZXc7RkIyRAotc2hpbmRvdGhlYnJldzswNUMxCi1zaGluaGVicmV3OzA1RTkKLXNoaW5zaGluZG90O0ZCMkEKLXNoaW5zaGluZG90aGVicmV3O0ZCMkEKLXNoaW5zaW5kb3Q7RkIyQgotc2hpbnNpbmRvdGhlYnJldztGQjJCCi1zaG9vazswMjgyCi1zaWdtYTswM0MzCi1zaWdtYTE7MDNDMgotc2lnbWFmaW5hbDswM0MyCi1zaWdtYWx1bmF0ZXN5bWJvbGdyZWVrOzAzRjIKLXNpaGlyYWdhbmE7MzA1Nwotc2lrYXRha2FuYTszMEI3Ci1zaWthdGFrYW5haGFsZndpZHRoO0ZGN0MKLXNpbHVxaGVicmV3OzA1QkQKLXNpbHVxbGVmdGhlYnJldzswNUJECi1zaW1pbGFyOzIyM0MKLXNpbmRvdGhlYnJldzswNUMyCi1zaW9zYWNpcmNsZWtvcmVhbjszMjc0Ci1zaW9zYXBhcmVua29yZWFuOzMyMTQKLXNpb3NjaWV1Y2tvcmVhbjszMTdFCi1zaW9zY2lyY2xla29yZWFuOzMyNjYKLXNpb3NraXllb2trb3JlYW47MzE3QQotc2lvc2tvcmVhbjszMTQ1Ci1zaW9zbmlldW5rb3JlYW47MzE3Qgotc2lvc3BhcmVua29yZWFuOzMyMDYKLXNpb3NwaWV1cGtvcmVhbjszMTdECi1zaW9zdGlrZXV0a29yZWFuOzMxN0MKLXNpeDswMDM2Ci1zaXhhcmFiaWM7MDY2Ngotc2l4YmVuZ2FsaTswOUVDCi1zaXhjaXJjbGU7MjQ2NQotc2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZjsyNzhGCi1zaXhkZXZhOzA5NkMKLXNpeGd1amFyYXRpOzBBRUMKLXNpeGd1cm11a2hpOzBBNkMKLXNpeGhhY2thcmFiaWM7MDY2Ngotc2l4aGFuZ3pob3U7MzAyNgotc2l4aWRlb2dyYXBoaWNwYXJlbjszMjI1Ci1zaXhpbmZlcmlvcjsyMDg2Ci1zaXhtb25vc3BhY2U7RkYxNgotc2l4b2xkc3R5bGU7RjczNgotc2l4cGFyZW47MjQ3OQotc2l4cGVyaW9kOzI0OEQKLXNpeHBlcnNpYW47MDZGNgotc2l4cm9tYW47MjE3NQotc2l4c3VwZXJpb3I7MjA3Ngotc2l4dGVlbmNpcmNsZTsyNDZGCi1zaXh0ZWVuY3VycmVuY3lkZW5vbWluYXRvcmJlbmdhbGk7MDlGOQotc2l4dGVlbnBhcmVuOzI0ODMKLXNpeHRlZW5wZXJpb2Q7MjQ5Nwotc2l4dGhhaTswRTU2Ci1zbGFzaDswMDJGCi1zbGFzaG1vbm9zcGFjZTtGRjBGCi1zbG9uZzswMTdGCi1zbG9uZ2RvdGFjY2VudDsxRTlCCi1zbWlsZWZhY2U7MjYzQQotc21vbm9zcGFjZTtGRjUzCi1zb2ZwYXN1cWhlYnJldzswNUMzCi1zb2Z0aHlwaGVuOzAwQUQKLXNvZnRzaWduY3lyaWxsaWM7MDQ0Qwotc29oaXJhZ2FuYTszMDVECi1zb2thdGFrYW5hOzMwQkQKLXNva2F0YWthbmFoYWxmd2lkdGg7RkY3Rgotc29saWR1c2xvbmdvdmVybGF5Y21iOzAzMzgKLXNvbGlkdXNzaG9ydG92ZXJsYXljbWI7MDMzNwotc29ydXNpdGhhaTswRTI5Ci1zb3NhbGF0aGFpOzBFMjgKLXNvc290aGFpOzBFMEIKLXNvc3VhdGhhaTswRTJBCi1zcGFjZTswMDIwCi1zcGFjZWhhY2thcmFiaWM7MDAyMAotc3BhZGU7MjY2MAotc3BhZGVzdWl0YmxhY2s7MjY2MAotc3BhZGVzdWl0d2hpdGU7MjY2NAotc3BhcmVuOzI0QUUKLXNxdWFyZWJlbG93Y21iOzAzM0IKLXNxdWFyZWNjOzMzQzQKLXNxdWFyZWNtOzMzOUQKLXNxdWFyZWRpYWdvbmFsY3Jvc3NoYXRjaGZpbGw7MjVBOQotc3F1YXJlaG9yaXpvbnRhbGZpbGw7MjVBNAotc3F1YXJla2c7MzM4Rgotc3F1YXJla207MzM5RQotc3F1YXJla21jYXBpdGFsOzMzQ0UKLXNxdWFyZWxuOzMzRDEKLXNxdWFyZWxvZzszM0QyCi1zcXVhcmVtZzszMzhFCi1zcXVhcmVtaWw7MzNENQotc3F1YXJlbW07MzM5Qwotc3F1YXJlbXNxdWFyZWQ7MzNBMQotc3F1YXJlb3J0aG9nb25hbGNyb3NzaGF0Y2hmaWxsOzI1QTYKLXNxdWFyZXVwcGVybGVmdHRvbG93ZXJyaWdodGZpbGw7MjVBNwotc3F1YXJldXBwZXJyaWdodHRvbG93ZXJsZWZ0ZmlsbDsyNUE4Ci1zcXVhcmV2ZXJ0aWNhbGZpbGw7MjVBNQotc3F1YXJld2hpdGV3aXRoc21hbGxibGFjazsyNUEzCi1zcnNxdWFyZTszM0RCCi1zc2FiZW5nYWxpOzA5QjcKLXNzYWRldmE7MDkzNwotc3NhZ3VqYXJhdGk7MEFCNwotc3NhbmdjaWV1Y2tvcmVhbjszMTQ5Ci1zc2FuZ2hpZXVoa29yZWFuOzMxODUKLXNzYW5naWV1bmdrb3JlYW47MzE4MAotc3NhbmdraXllb2trb3JlYW47MzEzMgotc3NhbmduaWV1bmtvcmVhbjszMTY1Ci1zc2FuZ3BpZXVwa29yZWFuOzMxNDMKLXNzYW5nc2lvc2tvcmVhbjszMTQ2Ci1zc2FuZ3Rpa2V1dGtvcmVhbjszMTM4Ci1zc3VwZXJpb3I7RjZGMgotc3Rlcmxpbmc7MDBBMwotc3Rlcmxpbmdtb25vc3BhY2U7RkZFMQotc3Ryb2tlbG9uZ292ZXJsYXljbWI7MDMzNgotc3Ryb2tlc2hvcnRvdmVybGF5Y21iOzAzMzUKLXN1YnNldDsyMjgyCi1zdWJzZXRub3RlcXVhbDsyMjhBCi1zdWJzZXRvcmVxdWFsOzIyODYKLXN1Y2NlZWRzOzIyN0IKLXN1Y2h0aGF0OzIyMEIKLXN1aGlyYWdhbmE7MzA1OQotc3VrYXRha2FuYTszMEI5Ci1zdWthdGFrYW5haGFsZndpZHRoO0ZGN0QKLXN1a3VuYXJhYmljOzA2NTIKLXN1bW1hdGlvbjsyMjExCi1zdW47MjYzQwotc3VwZXJzZXQ7MjI4Mwotc3VwZXJzZXRub3RlcXVhbDsyMjhCCi1zdXBlcnNldG9yZXF1YWw7MjI4Nwotc3ZzcXVhcmU7MzNEQwotc3lvdXdhZXJhc3F1YXJlOzMzN0MKLXQ7MDA3NAotdGFiZW5nYWxpOzA5QTQKLXRhY2tkb3duOzIyQTQKLXRhY2tsZWZ0OzIyQTMKLXRhZGV2YTswOTI0Ci10YWd1amFyYXRpOzBBQTQKLXRhZ3VybXVraGk7MEEyNAotdGFoYXJhYmljOzA2MzcKLXRhaGZpbmFsYXJhYmljO0ZFQzIKLXRhaGluaXRpYWxhcmFiaWM7RkVDMwotdGFoaXJhZ2FuYTszMDVGCi10YWhtZWRpYWxhcmFiaWM7RkVDNAotdGFpc3lvdWVyYXNxdWFyZTszMzdECi10YWthdGFrYW5hOzMwQkYKLXRha2F0YWthbmFoYWxmd2lkdGg7RkY4MAotdGF0d2VlbGFyYWJpYzswNjQwCi10YXU7MDNDNAotdGF2OzA1RUEKLXRhdmRhZ2VzO0ZCNEEKLXRhdmRhZ2VzaDtGQjRBCi10YXZkYWdlc2hoZWJyZXc7RkI0QQotdGF2aGVicmV3OzA1RUEKLXRiYXI7MDE2NwotdGJvcG9tb2ZvOzMxMEEKLXRjYXJvbjswMTY1Ci10Y2N1cmw7MDJBOAotdGNlZGlsbGE7MDE2MwotdGNoZWhhcmFiaWM7MDY4NgotdGNoZWhmaW5hbGFyYWJpYztGQjdCCi10Y2hlaGluaXRpYWxhcmFiaWM7RkI3QwotdGNoZWhtZWRpYWxhcmFiaWM7RkI3RAotdGNoZWhtZWVtaW5pdGlhbGFyYWJpYztGQjdDIEZFRTQKLXRjaXJjbGU7MjRFMwotdGNpcmN1bWZsZXhiZWxvdzsxRTcxCi10Y29tbWFhY2NlbnQ7MDE2MwotdGRpZXJlc2lzOzFFOTcKLXRkb3RhY2NlbnQ7MUU2QgotdGRvdGJlbG93OzFFNkQKLXRlY3lyaWxsaWM7MDQ0MgotdGVkZXNjZW5kZXJjeXJpbGxpYzswNEFECi10ZWhhcmFiaWM7MDYyQQotdGVoZmluYWxhcmFiaWM7RkU5NgotdGVoaGFoaW5pdGlhbGFyYWJpYztGQ0EyCi10ZWhoYWhpc29sYXRlZGFyYWJpYztGQzBDCi10ZWhpbml0aWFsYXJhYmljO0ZFOTcKLXRlaGlyYWdhbmE7MzA2NgotdGVoamVlbWluaXRpYWxhcmFiaWM7RkNBMQotdGVoamVlbWlzb2xhdGVkYXJhYmljO0ZDMEIKLXRlaG1hcmJ1dGFhcmFiaWM7MDYyOQotdGVobWFyYnV0YWZpbmFsYXJhYmljO0ZFOTQKLXRlaG1lZGlhbGFyYWJpYztGRTk4Ci10ZWhtZWVtaW5pdGlhbGFyYWJpYztGQ0E0Ci10ZWhtZWVtaXNvbGF0ZWRhcmFiaWM7RkMwRQotdGVobm9vbmZpbmFsYXJhYmljO0ZDNzMKLXRla2F0YWthbmE7MzBDNgotdGVrYXRha2FuYWhhbGZ3aWR0aDtGRjgzCi10ZWxlcGhvbmU7MjEyMQotdGVsZXBob25lYmxhY2s7MjYwRQotdGVsaXNoYWdlZG9sYWhlYnJldzswNUEwCi10ZWxpc2hhcWV0YW5haGVicmV3OzA1QTkKLXRlbmNpcmNsZTsyNDY5Ci10ZW5pZGVvZ3JhcGhpY3BhcmVuOzMyMjkKLXRlbnBhcmVuOzI0N0QKLXRlbnBlcmlvZDsyNDkxCi10ZW5yb21hbjsyMTc5Ci10ZXNoOzAyQTcKLXRldDswNUQ4Ci10ZXRkYWdlc2g7RkIzOAotdGV0ZGFnZXNoaGVicmV3O0ZCMzgKLXRldGhlYnJldzswNUQ4Ci10ZXRzZWN5cmlsbGljOzA0QjUKLXRldmlyaGVicmV3OzA1OUIKLXRldmlybGVmdGhlYnJldzswNTlCCi10aGFiZW5nYWxpOzA5QTUKLXRoYWRldmE7MDkyNQotdGhhZ3VqYXJhdGk7MEFBNQotdGhhZ3VybXVraGk7MEEyNQotdGhhbGFyYWJpYzswNjMwCi10aGFsZmluYWxhcmFiaWM7RkVBQwotdGhhbnRoYWtoYXRsb3dsZWZ0dGhhaTtGODk4Ci10aGFudGhha2hhdGxvd3JpZ2h0dGhhaTtGODk3Ci10aGFudGhha2hhdHRoYWk7MEU0QwotdGhhbnRoYWtoYXR1cHBlcmxlZnR0aGFpO0Y4OTYKLXRoZWhhcmFiaWM7MDYyQgotdGhlaGZpbmFsYXJhYmljO0ZFOUEKLXRoZWhpbml0aWFsYXJhYmljO0ZFOUIKLXRoZWhtZWRpYWxhcmFiaWM7RkU5QwotdGhlcmVleGlzdHM7MjIwMwotdGhlcmVmb3JlOzIyMzQKLXRoZXRhOzAzQjgKLXRoZXRhMTswM0QxCi10aGV0YXN5bWJvbGdyZWVrOzAzRDEKLXRoaWV1dGhhY2lyY2xla29yZWFuOzMyNzkKLXRoaWV1dGhhcGFyZW5rb3JlYW47MzIxOQotdGhpZXV0aGNpcmNsZWtvcmVhbjszMjZCCi10aGlldXRoa29yZWFuOzMxNEMKLXRoaWV1dGhwYXJlbmtvcmVhbjszMjBCCi10aGlydGVlbmNpcmNsZTsyNDZDCi10aGlydGVlbnBhcmVuOzI0ODAKLXRoaXJ0ZWVucGVyaW9kOzI0OTQKLXRob25hbmdtb250aG90aGFpOzBFMTEKLXRob29rOzAxQUQKLXRob3BodXRoYW90aGFpOzBFMTIKLXRob3JuOzAwRkUKLXRob3RoYWhhbnRoYWk7MEUxNwotdGhvdGhhbnRoYWk7MEUxMAotdGhvdGhvbmd0aGFpOzBFMTgKLXRob3RodW5ndGhhaTswRTE2Ci10aG91c2FuZGN5cmlsbGljOzA0ODIKLXRob3VzYW5kc3NlcGFyYXRvcmFyYWJpYzswNjZDCi10aG91c2FuZHNzZXBhcmF0b3JwZXJzaWFuOzA2NkMKLXRocmVlOzAwMzMKLXRocmVlYXJhYmljOzA2NjMKLXRocmVlYmVuZ2FsaTswOUU5Ci10aHJlZWNpcmNsZTsyNDYyCi10aHJlZWNpcmNsZWludmVyc2VzYW5zc2VyaWY7Mjc4QwotdGhyZWVkZXZhOzA5NjkKLXRocmVlZWlnaHRoczsyMTVDCi10aHJlZWd1amFyYXRpOzBBRTkKLXRocmVlZ3VybXVraGk7MEE2OQotdGhyZWVoYWNrYXJhYmljOzA2NjMKLXRocmVlaGFuZ3pob3U7MzAyMwotdGhyZWVpZGVvZ3JhcGhpY3BhcmVuOzMyMjIKLXRocmVlaW5mZXJpb3I7MjA4MwotdGhyZWVtb25vc3BhY2U7RkYxMwotdGhyZWVudW1lcmF0b3JiZW5nYWxpOzA5RjYKLXRocmVlb2xkc3R5bGU7RjczMwotdGhyZWVwYXJlbjsyNDc2Ci10aHJlZXBlcmlvZDsyNDhBCi10aHJlZXBlcnNpYW47MDZGMwotdGhyZWVxdWFydGVyczswMEJFCi10aHJlZXF1YXJ0ZXJzZW1kYXNoO0Y2REUKLXRocmVlcm9tYW47MjE3MgotdGhyZWVzdXBlcmlvcjswMEIzCi10aHJlZXRoYWk7MEU1MwotdGh6c3F1YXJlOzMzOTQKLXRpaGlyYWdhbmE7MzA2MQotdGlrYXRha2FuYTszMEMxCi10aWthdGFrYW5haGFsZndpZHRoO0ZGODEKLXRpa2V1dGFjaXJjbGVrb3JlYW47MzI3MAotdGlrZXV0YXBhcmVua29yZWFuOzMyMTAKLXRpa2V1dGNpcmNsZWtvcmVhbjszMjYyCi10aWtldXRrb3JlYW47MzEzNwotdGlrZXV0cGFyZW5rb3JlYW47MzIwMgotdGlsZGU7MDJEQwotdGlsZGViZWxvd2NtYjswMzMwCi10aWxkZWNtYjswMzAzCi10aWxkZWNvbWI7MDMwMwotdGlsZGVkb3VibGVjbWI7MDM2MAotdGlsZGVvcGVyYXRvcjsyMjNDCi10aWxkZW92ZXJsYXljbWI7MDMzNAotdGlsZGV2ZXJ0aWNhbGNtYjswMzNFCi10aW1lc2NpcmNsZTsyMjk3Ci10aXBlaGFoZWJyZXc7MDU5NgotdGlwZWhhbGVmdGhlYnJldzswNTk2Ci10aXBwaWd1cm11a2hpOzBBNzAKLXRpdGxvY3lyaWxsaWNjbWI7MDQ4MwotdGl3bmFybWVuaWFuOzA1N0YKLXRsaW5lYmVsb3c7MUU2RgotdG1vbm9zcGFjZTtGRjU0Ci10b2FybWVuaWFuOzA1NjkKLXRvaGlyYWdhbmE7MzA2OAotdG9rYXRha2FuYTszMEM4Ci10b2thdGFrYW5haGFsZndpZHRoO0ZGODQKLXRvbmViYXJleHRyYWhpZ2htb2Q7MDJFNQotdG9uZWJhcmV4dHJhbG93bW9kOzAyRTkKLXRvbmViYXJoaWdobW9kOzAyRTYKLXRvbmViYXJsb3dtb2Q7MDJFOAotdG9uZWJhcm1pZG1vZDswMkU3Ci10b25lZml2ZTswMUJECi10b25lc2l4OzAxODUKLXRvbmV0d287MDFBOAotdG9ub3M7MDM4NAotdG9uc3F1YXJlOzMzMjcKLXRvcGF0YWt0aGFpOzBFMEYKLXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdDszMDE0Ci10b3J0b2lzZXNoZWxsYnJhY2tldGxlZnRzbWFsbDtGRTVECi10b3J0b2lzZXNoZWxsYnJhY2tldGxlZnR2ZXJ0aWNhbDtGRTM5Ci10b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0OzMwMTUKLXRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHRzbWFsbDtGRTVFCi10b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0dmVydGljYWw7RkUzQQotdG90YW90aGFpOzBFMTUKLXRwYWxhdGFsaG9vazswMUFCCi10cGFyZW47MjRBRgotdHJhZGVtYXJrOzIxMjIKLXRyYWRlbWFya3NhbnM7RjhFQQotdHJhZGVtYXJrc2VyaWY7RjZEQgotdHJldHJvZmxleGhvb2s7MDI4OAotdHJpYWdkbjsyNUJDCi10cmlhZ2xmOzI1QzQKLXRyaWFncnQ7MjVCQQotdHJpYWd1cDsyNUIyCi10czswMkE2Ci10c2FkaTswNUU2Ci10c2FkaWRhZ2VzaDtGQjQ2Ci10c2FkaWRhZ2VzaGhlYnJldztGQjQ2Ci10c2FkaWhlYnJldzswNUU2Ci10c2VjeXJpbGxpYzswNDQ2Ci10c2VyZTswNUI1Ci10c2VyZTEyOzA1QjUKLXRzZXJlMWU7MDVCNQotdHNlcmUyYjswNUI1Ci10c2VyZWhlYnJldzswNUI1Ci10c2VyZW5hcnJvd2hlYnJldzswNUI1Ci10c2VyZXF1YXJ0ZXJoZWJyZXc7MDVCNQotdHNlcmV3aWRlaGVicmV3OzA1QjUKLXRzaGVjeXJpbGxpYzswNDVCCi10c3VwZXJpb3I7RjZGMwotdHRhYmVuZ2FsaTswOTlGCi10dGFkZXZhOzA5MUYKLXR0YWd1amFyYXRpOzBBOUYKLXR0YWd1cm11a2hpOzBBMUYKLXR0ZWhhcmFiaWM7MDY3OQotdHRlaGZpbmFsYXJhYmljO0ZCNjcKLXR0ZWhpbml0aWFsYXJhYmljO0ZCNjgKLXR0ZWhtZWRpYWxhcmFiaWM7RkI2OQotdHRoYWJlbmdhbGk7MDlBMAotdHRoYWRldmE7MDkyMAotdHRoYWd1amFyYXRpOzBBQTAKLXR0aGFndXJtdWtoaTswQTIwCi10dHVybmVkOzAyODcKLXR1aGlyYWdhbmE7MzA2NAotdHVrYXRha2FuYTszMEM0Ci10dWthdGFrYW5haGFsZndpZHRoO0ZGODIKLXR1c21hbGxoaXJhZ2FuYTszMDYzCi10dXNtYWxsa2F0YWthbmE7MzBDMwotdHVzbWFsbGthdGFrYW5haGFsZndpZHRoO0ZGNkYKLXR3ZWx2ZWNpcmNsZTsyNDZCCi10d2VsdmVwYXJlbjsyNDdGCi10d2VsdmVwZXJpb2Q7MjQ5MwotdHdlbHZlcm9tYW47MjE3QgotdHdlbnR5Y2lyY2xlOzI0NzMKLXR3ZW50eWhhbmd6aG91OzUzNDQKLXR3ZW50eXBhcmVuOzI0ODcKLXR3ZW50eXBlcmlvZDsyNDlCCi10d287MDAzMgotdHdvYXJhYmljOzA2NjIKLXR3b2JlbmdhbGk7MDlFOAotdHdvY2lyY2xlOzI0NjEKLXR3b2NpcmNsZWludmVyc2VzYW5zc2VyaWY7Mjc4QgotdHdvZGV2YTswOTY4Ci10d29kb3RlbmxlYWRlcjsyMDI1Ci10d29kb3RsZWFkZXI7MjAyNQotdHdvZG90bGVhZGVydmVydGljYWw7RkUzMAotdHdvZ3VqYXJhdGk7MEFFOAotdHdvZ3VybXVraGk7MEE2OAotdHdvaGFja2FyYWJpYzswNjYyCi10d29oYW5nemhvdTszMDIyCi10d29pZGVvZ3JhcGhpY3BhcmVuOzMyMjEKLXR3b2luZmVyaW9yOzIwODIKLXR3b21vbm9zcGFjZTtGRjEyCi10d29udW1lcmF0b3JiZW5nYWxpOzA5RjUKLXR3b29sZHN0eWxlO0Y3MzIKLXR3b3BhcmVuOzI0NzUKLXR3b3BlcmlvZDsyNDg5Ci10d29wZXJzaWFuOzA2RjIKLXR3b3JvbWFuOzIxNzEKLXR3b3N0cm9rZTswMUJCCi10d29zdXBlcmlvcjswMEIyCi10d290aGFpOzBFNTIKLXR3b3RoaXJkczsyMTU0Ci11OzAwNzUKLXVhY3V0ZTswMEZBCi11YmFyOzAyODkKLXViZW5nYWxpOzA5ODkKLXVib3BvbW9mbzszMTI4Ci11YnJldmU7MDE2RAotdWNhcm9uOzAxRDQKLXVjaXJjbGU7MjRFNAotdWNpcmN1bWZsZXg7MDBGQgotdWNpcmN1bWZsZXhiZWxvdzsxRTc3Ci11Y3lyaWxsaWM7MDQ0MwotdWRhdHRhZGV2YTswOTUxCi11ZGJsYWN1dGU7MDE3MQotdWRibGdyYXZlOzAyMTUKLXVkZXZhOzA5MDkKLXVkaWVyZXNpczswMEZDCi11ZGllcmVzaXNhY3V0ZTswMUQ4Ci11ZGllcmVzaXNiZWxvdzsxRTczCi11ZGllcmVzaXNjYXJvbjswMURBCi11ZGllcmVzaXNjeXJpbGxpYzswNEYxCi11ZGllcmVzaXNncmF2ZTswMURDCi11ZGllcmVzaXNtYWNyb247MDFENgotdWRvdGJlbG93OzFFRTUKLXVncmF2ZTswMEY5Ci11Z3VqYXJhdGk7MEE4OQotdWd1cm11a2hpOzBBMDkKLXVoaXJhZ2FuYTszMDQ2Ci11aG9va2Fib3ZlOzFFRTcKLXVob3JuOzAxQjAKLXVob3JuYWN1dGU7MUVFOQotdWhvcm5kb3RiZWxvdzsxRUYxCi11aG9ybmdyYXZlOzFFRUIKLXVob3JuaG9va2Fib3ZlOzFFRUQKLXVob3JudGlsZGU7MUVFRgotdWh1bmdhcnVtbGF1dDswMTcxCi11aHVuZ2FydW1sYXV0Y3lyaWxsaWM7MDRGMwotdWludmVydGVkYnJldmU7MDIxNwotdWthdGFrYW5hOzMwQTYKLXVrYXRha2FuYWhhbGZ3aWR0aDtGRjczCi11a2N5cmlsbGljOzA0NzkKLXVrb3JlYW47MzE1QwotdW1hY3JvbjswMTZCCi11bWFjcm9uY3lyaWxsaWM7MDRFRgotdW1hY3JvbmRpZXJlc2lzOzFFN0IKLXVtYXRyYWd1cm11a2hpOzBBNDEKLXVtb25vc3BhY2U7RkY1NQotdW5kZXJzY29yZTswMDVGCi11bmRlcnNjb3JlZGJsOzIwMTcKLXVuZGVyc2NvcmVtb25vc3BhY2U7RkYzRgotdW5kZXJzY29yZXZlcnRpY2FsO0ZFMzMKLXVuZGVyc2NvcmV3YXZ5O0ZFNEYKLXVuaW9uOzIyMkEKLXVuaXZlcnNhbDsyMjAwCi11b2dvbmVrOzAxNzMKLXVwYXJlbjsyNEIwCi11cGJsb2NrOzI1ODAKLXVwcGVyZG90aGVicmV3OzA1QzQKLXVwc2lsb247MDNDNQotdXBzaWxvbmRpZXJlc2lzOzAzQ0IKLXVwc2lsb25kaWVyZXNpc3Rvbm9zOzAzQjAKLXVwc2lsb25sYXRpbjswMjhBCi11cHNpbG9udG9ub3M7MDNDRAotdXB0YWNrYmVsb3djbWI7MDMxRAotdXB0YWNrbW9kOzAyRDQKLXVyYWd1cm11a2hpOzBBNzMKLXVyaW5nOzAxNkYKLXVzaG9ydGN5cmlsbGljOzA0NUUKLXVzbWFsbGhpcmFnYW5hOzMwNDUKLXVzbWFsbGthdGFrYW5hOzMwQTUKLXVzbWFsbGthdGFrYW5haGFsZndpZHRoO0ZGNjkKLXVzdHJhaWdodGN5cmlsbGljOzA0QUYKLXVzdHJhaWdodHN0cm9rZWN5cmlsbGljOzA0QjEKLXV0aWxkZTswMTY5Ci11dGlsZGVhY3V0ZTsxRTc5Ci11dGlsZGViZWxvdzsxRTc1Ci11dWJlbmdhbGk7MDk4QQotdXVkZXZhOzA5MEEKLXV1Z3VqYXJhdGk7MEE4QQotdXVndXJtdWtoaTswQTBBCi11dW1hdHJhZ3VybXVraGk7MEE0MgotdXV2b3dlbHNpZ25iZW5nYWxpOzA5QzIKLXV1dm93ZWxzaWduZGV2YTswOTQyCi11dXZvd2Vsc2lnbmd1amFyYXRpOzBBQzIKLXV2b3dlbHNpZ25iZW5nYWxpOzA5QzEKLXV2b3dlbHNpZ25kZXZhOzA5NDEKLXV2b3dlbHNpZ25ndWphcmF0aTswQUMxCi12OzAwNzYKLXZhZGV2YTswOTM1Ci12YWd1amFyYXRpOzBBQjUKLXZhZ3VybXVraGk7MEEzNQotdmFrYXRha2FuYTszMEY3Ci12YXY7MDVENQotdmF2ZGFnZXNoO0ZCMzUKLXZhdmRhZ2VzaDY1O0ZCMzUKLXZhdmRhZ2VzaGhlYnJldztGQjM1Ci12YXZoZWJyZXc7MDVENQotdmF2aG9sYW07RkI0QgotdmF2aG9sYW1oZWJyZXc7RkI0QgotdmF2dmF2aGVicmV3OzA1RjAKLXZhdnlvZGhlYnJldzswNUYxCi12Y2lyY2xlOzI0RTUKLXZkb3RiZWxvdzsxRTdGCi12ZWN5cmlsbGljOzA0MzIKLXZlaGFyYWJpYzswNkE0Ci12ZWhmaW5hbGFyYWJpYztGQjZCCi12ZWhpbml0aWFsYXJhYmljO0ZCNkMKLXZlaG1lZGlhbGFyYWJpYztGQjZECi12ZWthdGFrYW5hOzMwRjkKLXZlbnVzOzI2NDAKLXZlcnRpY2FsYmFyOzAwN0MKLXZlcnRpY2FsbGluZWFib3ZlY21iOzAzMEQKLXZlcnRpY2FsbGluZWJlbG93Y21iOzAzMjkKLXZlcnRpY2FsbGluZWxvd21vZDswMkNDCi12ZXJ0aWNhbGxpbmVtb2Q7MDJDOAotdmV3YXJtZW5pYW47MDU3RQotdmhvb2s7MDI4QgotdmlrYXRha2FuYTszMEY4Ci12aXJhbWFiZW5nYWxpOzA5Q0QKLXZpcmFtYWRldmE7MDk0RAotdmlyYW1hZ3VqYXJhdGk7MEFDRAotdmlzYXJnYWJlbmdhbGk7MDk4MwotdmlzYXJnYWRldmE7MDkwMwotdmlzYXJnYWd1amFyYXRpOzBBODMKLXZtb25vc3BhY2U7RkY1Ngotdm9hcm1lbmlhbjswNTc4Ci12b2ljZWRpdGVyYXRpb25oaXJhZ2FuYTszMDlFCi12b2ljZWRpdGVyYXRpb25rYXRha2FuYTszMEZFCi12b2ljZWRtYXJra2FuYTszMDlCCi12b2ljZWRtYXJra2FuYWhhbGZ3aWR0aDtGRjlFCi12b2thdGFrYW5hOzMwRkEKLXZwYXJlbjsyNEIxCi12dGlsZGU7MUU3RAotdnR1cm5lZDswMjhDCi12dWhpcmFnYW5hOzMwOTQKLXZ1a2F0YWthbmE7MzBGNAotdzswMDc3Ci13YWN1dGU7MUU4Mwotd2Fla29yZWFuOzMxNTkKLXdhaGlyYWdhbmE7MzA4Rgotd2FrYXRha2FuYTszMEVGCi13YWthdGFrYW5haGFsZndpZHRoO0ZGOUMKLXdha29yZWFuOzMxNTgKLXdhc21hbGxoaXJhZ2FuYTszMDhFCi13YXNtYWxsa2F0YWthbmE7MzBFRQotd2F0dG9zcXVhcmU7MzM1Nwotd2F2ZWRhc2g7MzAxQwotd2F2eXVuZGVyc2NvcmV2ZXJ0aWNhbDtGRTM0Ci13YXdhcmFiaWM7MDY0OAotd2F3ZmluYWxhcmFiaWM7RkVFRQotd2F3aGFtemFhYm92ZWFyYWJpYzswNjI0Ci13YXdoYW16YWFib3ZlZmluYWxhcmFiaWM7RkU4Ngotd2JzcXVhcmU7MzNERAotd2NpcmNsZTsyNEU2Ci13Y2lyY3VtZmxleDswMTc1Ci13ZGllcmVzaXM7MUU4NQotd2RvdGFjY2VudDsxRTg3Ci13ZG90YmVsb3c7MUU4OQotd2VoaXJhZ2FuYTszMDkxCi13ZWllcnN0cmFzczsyMTE4Ci13ZWthdGFrYW5hOzMwRjEKLXdla29yZWFuOzMxNUUKLXdlb2tvcmVhbjszMTVECi13Z3JhdmU7MUU4MQotd2hpdGVidWxsZXQ7MjVFNgotd2hpdGVjaXJjbGU7MjVDQgotd2hpdGVjaXJjbGVpbnZlcnNlOzI1RDkKLXdoaXRlY29ybmVyYnJhY2tldGxlZnQ7MzAwRQotd2hpdGVjb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsO0ZFNDMKLXdoaXRlY29ybmVyYnJhY2tldHJpZ2h0OzMwMEYKLXdoaXRlY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWw7RkU0NAotd2hpdGVkaWFtb25kOzI1QzcKLXdoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZDsyNUM4Ci13aGl0ZWRvd25wb2ludGluZ3NtYWxsdHJpYW5nbGU7MjVCRgotd2hpdGVkb3ducG9pbnRpbmd0cmlhbmdsZTsyNUJECi13aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGU7MjVDMwotd2hpdGVsZWZ0cG9pbnRpbmd0cmlhbmdsZTsyNUMxCi13aGl0ZWxlbnRpY3VsYXJicmFja2V0bGVmdDszMDE2Ci13aGl0ZWxlbnRpY3VsYXJicmFja2V0cmlnaHQ7MzAxNwotd2hpdGVyaWdodHBvaW50aW5nc21hbGx0cmlhbmdsZTsyNUI5Ci13aGl0ZXJpZ2h0cG9pbnRpbmd0cmlhbmdsZTsyNUI3Ci13aGl0ZXNtYWxsc3F1YXJlOzI1QUIKLXdoaXRlc21pbGluZ2ZhY2U7MjYzQQotd2hpdGVzcXVhcmU7MjVBMQotd2hpdGVzdGFyOzI2MDYKLXdoaXRldGVsZXBob25lOzI2MEYKLXdoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0OzMwMTgKLXdoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodDszMDE5Ci13aGl0ZXVwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlOzI1QjUKLXdoaXRldXBwb2ludGluZ3RyaWFuZ2xlOzI1QjMKLXdpaGlyYWdhbmE7MzA5MAotd2lrYXRha2FuYTszMEYwCi13aWtvcmVhbjszMTVGCi13bW9ub3NwYWNlO0ZGNTcKLXdvaGlyYWdhbmE7MzA5Mgotd29rYXRha2FuYTszMEYyCi13b2thdGFrYW5haGFsZndpZHRoO0ZGNjYKLXdvbjsyMEE5Ci13b25tb25vc3BhY2U7RkZFNgotd293YWVudGhhaTswRTI3Ci13cGFyZW47MjRCMgotd3Jpbmc7MUU5OAotd3N1cGVyaW9yOzAyQjcKLXd0dXJuZWQ7MDI4RAotd3lubjswMUJGCi14OzAwNzgKLXhhYm92ZWNtYjswMzNECi14Ym9wb21vZm87MzExMgoteGNpcmNsZTsyNEU3Ci14ZGllcmVzaXM7MUU4RAoteGRvdGFjY2VudDsxRThCCi14ZWhhcm1lbmlhbjswNTZECi14aTswM0JFCi14bW9ub3NwYWNlO0ZGNTgKLXhwYXJlbjsyNEIzCi14c3VwZXJpb3I7MDJFMwoteTswMDc5Ci15YWFkb3NxdWFyZTszMzRFCi15YWJlbmdhbGk7MDlBRgoteWFjdXRlOzAwRkQKLXlhZGV2YTswOTJGCi15YWVrb3JlYW47MzE1MgoteWFndWphcmF0aTswQUFGCi15YWd1cm11a2hpOzBBMkYKLXlhaGlyYWdhbmE7MzA4NAoteWFrYXRha2FuYTszMEU0Ci15YWthdGFrYW5haGFsZndpZHRoO0ZGOTQKLXlha29yZWFuOzMxNTEKLXlhbWFra2FudGhhaTswRTRFCi15YXNtYWxsaGlyYWdhbmE7MzA4MwoteWFzbWFsbGthdGFrYW5hOzMwRTMKLXlhc21hbGxrYXRha2FuYWhhbGZ3aWR0aDtGRjZDCi15YXRjeXJpbGxpYzswNDYzCi15Y2lyY2xlOzI0RTgKLXljaXJjdW1mbGV4OzAxNzcKLXlkaWVyZXNpczswMEZGCi15ZG90YWNjZW50OzFFOEYKLXlkb3RiZWxvdzsxRUY1Ci15ZWhhcmFiaWM7MDY0QQoteWVoYmFycmVlYXJhYmljOzA2RDIKLXllaGJhcnJlZWZpbmFsYXJhYmljO0ZCQUYKLXllaGZpbmFsYXJhYmljO0ZFRjIKLXllaGhhbXphYWJvdmVhcmFiaWM7MDYyNgoteWVoaGFtemFhYm92ZWZpbmFsYXJhYmljO0ZFOEEKLXllaGhhbXphYWJvdmVpbml0aWFsYXJhYmljO0ZFOEIKLXllaGhhbXphYWJvdmVtZWRpYWxhcmFiaWM7RkU4QwoteWVoaW5pdGlhbGFyYWJpYztGRUYzCi15ZWhtZWRpYWxhcmFiaWM7RkVGNAoteWVobWVlbWluaXRpYWxhcmFiaWM7RkNERAoteWVobWVlbWlzb2xhdGVkYXJhYmljO0ZDNTgKLXllaG5vb25maW5hbGFyYWJpYztGQzk0Ci15ZWh0aHJlZWRvdHNiZWxvd2FyYWJpYzswNkQxCi15ZWtvcmVhbjszMTU2Ci15ZW47MDBBNQoteWVubW9ub3NwYWNlO0ZGRTUKLXllb2tvcmVhbjszMTU1Ci15ZW9yaW5oaWV1aGtvcmVhbjszMTg2Ci15ZXJhaGJlbnlvbW9oZWJyZXc7MDVBQQoteWVyYWhiZW55b21vbGVmdGhlYnJldzswNUFBCi15ZXJpY3lyaWxsaWM7MDQ0QgoteWVydWRpZXJlc2lzY3lyaWxsaWM7MDRGOQoteWVzaWV1bmdrb3JlYW47MzE4MQoteWVzaWV1bmdwYW5zaW9za29yZWFuOzMxODMKLXllc2lldW5nc2lvc2tvcmVhbjszMTgyCi15ZXRpdmhlYnJldzswNTlBCi15Z3JhdmU7MUVGMwoteWhvb2s7MDFCNAoteWhvb2thYm92ZTsxRUY3Ci15aWFybWVuaWFuOzA1NzUKLXlpY3lyaWxsaWM7MDQ1NwoteWlrb3JlYW47MzE2MgoteWlueWFuZzsyNjJGCi15aXduYXJtZW5pYW47MDU4MgoteW1vbm9zcGFjZTtGRjU5Ci15b2Q7MDVEOQoteW9kZGFnZXNoO0ZCMzkKLXlvZGRhZ2VzaGhlYnJldztGQjM5Ci15b2RoZWJyZXc7MDVEOQoteW9keW9kaGVicmV3OzA1RjIKLXlvZHlvZHBhdGFoaGVicmV3O0ZCMUYKLXlvaGlyYWdhbmE7MzA4OAoteW9pa29yZWFuOzMxODkKLXlva2F0YWthbmE7MzBFOAoteW9rYXRha2FuYWhhbGZ3aWR0aDtGRjk2Ci15b2tvcmVhbjszMTVCCi15b3NtYWxsaGlyYWdhbmE7MzA4NwoteW9zbWFsbGthdGFrYW5hOzMwRTcKLXlvc21hbGxrYXRha2FuYWhhbGZ3aWR0aDtGRjZFCi15b3RncmVlazswM0YzCi15b3lhZWtvcmVhbjszMTg4Ci15b3lha29yZWFuOzMxODcKLXlveWFrdGhhaTswRTIyCi15b3lpbmd0aGFpOzBFMEQKLXlwYXJlbjsyNEI0Ci15cG9nZWdyYW1tZW5pOzAzN0EKLXlwb2dlZ3JhbW1lbmlncmVla2NtYjswMzQ1Ci15cjswMUE2Ci15cmluZzsxRTk5Ci15c3VwZXJpb3I7MDJCOAoteXRpbGRlOzFFRjkKLXl0dXJuZWQ7MDI4RQoteXVoaXJhZ2FuYTszMDg2Ci15dWlrb3JlYW47MzE4QwoteXVrYXRha2FuYTszMEU2Ci15dWthdGFrYW5haGFsZndpZHRoO0ZGOTUKLXl1a29yZWFuOzMxNjAKLXl1c2JpZ2N5cmlsbGljOzA0NkIKLXl1c2JpZ2lvdGlmaWVkY3lyaWxsaWM7MDQ2RAoteXVzbGl0dGxlY3lyaWxsaWM7MDQ2NwoteXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYzswNDY5Ci15dXNtYWxsaGlyYWdhbmE7MzA4NQoteXVzbWFsbGthdGFrYW5hOzMwRTUKLXl1c21hbGxrYXRha2FuYWhhbGZ3aWR0aDtGRjZECi15dXlla29yZWFuOzMxOEIKLXl1eWVva29yZWFuOzMxOEEKLXl5YWJlbmdhbGk7MDlERgoteXlhZGV2YTswOTVGCi16OzAwN0EKLXphYXJtZW5pYW47MDU2NgotemFjdXRlOzAxN0EKLXphZGV2YTswOTVCCi16YWd1cm11a2hpOzBBNUIKLXphaGFyYWJpYzswNjM4Ci16YWhmaW5hbGFyYWJpYztGRUM2Ci16YWhpbml0aWFsYXJhYmljO0ZFQzcKLXphaGlyYWdhbmE7MzA1NgotemFobWVkaWFsYXJhYmljO0ZFQzgKLXphaW5hcmFiaWM7MDYzMgotemFpbmZpbmFsYXJhYmljO0ZFQjAKLXpha2F0YWthbmE7MzBCNgotemFxZWZnYWRvbGhlYnJldzswNTk1Ci16YXFlZnFhdGFuaGVicmV3OzA1OTQKLXphcnFhaGVicmV3OzA1OTgKLXpheWluOzA1RDYKLXpheWluZGFnZXNoO0ZCMzYKLXpheWluZGFnZXNoaGVicmV3O0ZCMzYKLXpheWluaGVicmV3OzA1RDYKLXpib3BvbW9mbzszMTE3Ci16Y2Fyb247MDE3RQotemNpcmNsZTsyNEU5Ci16Y2lyY3VtZmxleDsxRTkxCi16Y3VybDswMjkxCi16ZG90OzAxN0MKLXpkb3RhY2NlbnQ7MDE3QwotemRvdGJlbG93OzFFOTMKLXplY3lyaWxsaWM7MDQzNwotemVkZXNjZW5kZXJjeXJpbGxpYzswNDk5Ci16ZWRpZXJlc2lzY3lyaWxsaWM7MDRERgotemVoaXJhZ2FuYTszMDVDCi16ZWthdGFrYW5hOzMwQkMKLXplcm87MDAzMAotemVyb2FyYWJpYzswNjYwCi16ZXJvYmVuZ2FsaTswOUU2Ci16ZXJvZGV2YTswOTY2Ci16ZXJvZ3VqYXJhdGk7MEFFNgotemVyb2d1cm11a2hpOzBBNjYKLXplcm9oYWNrYXJhYmljOzA2NjAKLXplcm9pbmZlcmlvcjsyMDgwCi16ZXJvbW9ub3NwYWNlO0ZGMTAKLXplcm9vbGRzdHlsZTtGNzMwCi16ZXJvcGVyc2lhbjswNkYwCi16ZXJvc3VwZXJpb3I7MjA3MAotemVyb3RoYWk7MEU1MAotemVyb3dpZHRoam9pbmVyO0ZFRkYKLXplcm93aWR0aG5vbmpvaW5lcjsyMDBDCi16ZXJvd2lkdGhzcGFjZTsyMDBCCi16ZXRhOzAzQjYKLXpoYm9wb21vZm87MzExMwotemhlYXJtZW5pYW47MDU2QQotemhlYnJldmVjeXJpbGxpYzswNEMyCi16aGVjeXJpbGxpYzswNDM2Ci16aGVkZXNjZW5kZXJjeXJpbGxpYzswNDk3Ci16aGVkaWVyZXNpc2N5cmlsbGljOzA0REQKLXppaGlyYWdhbmE7MzA1OAotemlrYXRha2FuYTszMEI4Ci16aW5vcmhlYnJldzswNUFFCi16bGluZWJlbG93OzFFOTUKLXptb25vc3BhY2U7RkY1QQotem9oaXJhZ2FuYTszMDVFCi16b2thdGFrYW5hOzMwQkUKLXpwYXJlbjsyNEI1Ci16cmV0cm9mbGV4aG9vazswMjkwCi16c3Ryb2tlOzAxQjYKLXp1aGlyYWdhbmE7MzA1QQotenVrYXRha2FuYTszMEJBCi1hMTAwOzI3NUUKLWExMDE7Mjc2MQotYTEwMjsyNzYyCi1hMTAzOzI3NjMKLWExMDQ7Mjc2NAotYTEwNTsyNzEwCi1hMTA2OzI3NjUKLWExMDc7Mjc2NgotYTEwODsyNzY3Ci1hMTA5OzI2NjAKLWExMDsyNzIxCi1hMTEwOzI2NjUKLWExMTE7MjY2NgotYTExMjsyNjYzCi1hMTE3OzI3MDkKLWExMTg7MjcwOAotYTExOTsyNzA3Ci1hMTE7MjYxQgotYTEyMDsyNDYwCi1hMTIxOzI0NjEKLWExMjI7MjQ2MgotYTEyMzsyNDYzCi1hMTI0OzI0NjQKLWExMjU7MjQ2NQotYTEyNjsyNDY2Ci1hMTI3OzI0NjcKLWExMjg7MjQ2OAotYTEyOTsyNDY5Ci1hMTI7MjYxRQotYTEzMDsyNzc2Ci1hMTMxOzI3NzcKLWExMzI7Mjc3OAotYTEzMzsyNzc5Ci1hMTM0OzI3N0EKLWExMzU7Mjc3QgotYTEzNjsyNzdDCi1hMTM3OzI3N0QKLWExMzg7Mjc3RQotYTEzOTsyNzdGCi1hMTM7MjcwQwotYTE0MDsyNzgwCi1hMTQxOzI3ODEKLWExNDI7Mjc4MgotYTE0MzsyNzgzCi1hMTQ0OzI3ODQKLWExNDU7Mjc4NQotYTE0NjsyNzg2Ci1hMTQ3OzI3ODcKLWExNDg7Mjc4OAotYTE0OTsyNzg5Ci1hMTQ7MjcwRAotYTE1MDsyNzhBCi1hMTUxOzI3OEIKLWExNTI7Mjc4QwotYTE1MzsyNzhECi1hMTU0OzI3OEUKLWExNTU7Mjc4RgotYTE1NjsyNzkwCi1hMTU3OzI3OTEKLWExNTg7Mjc5MgotYTE1OTsyNzkzCi1hMTU7MjcwRQotYTE2MDsyNzk0Ci1hMTYxOzIxOTIKLWExNjI7MjdBMwotYTE2MzsyMTk0Ci1hMTY0OzIxOTUKLWExNjU7Mjc5OQotYTE2NjsyNzlCCi1hMTY3OzI3OUMKLWExNjg7Mjc5RAotYTE2OTsyNzlFCi1hMTY7MjcwRgotYTE3MDsyNzlGCi1hMTcxOzI3QTAKLWExNzI7MjdBMQotYTE3MzsyN0EyCi1hMTc0OzI3QTQKLWExNzU7MjdBNQotYTE3NjsyN0E2Ci1hMTc3OzI3QTcKLWExNzg7MjdBOAotYTE3OTsyN0E5Ci1hMTc7MjcxMQotYTE4MDsyN0FCCi1hMTgxOzI3QUQKLWExODI7MjdBRgotYTE4MzsyN0IyCi1hMTg0OzI3QjMKLWExODU7MjdCNQotYTE4NjsyN0I4Ci1hMTg3OzI3QkEKLWExODg7MjdCQgotYTE4OTsyN0JDCi1hMTg7MjcxMgotYTE5MDsyN0JECi1hMTkxOzI3QkUKLWExOTI7Mjc5QQotYTE5MzsyN0FBCi1hMTk0OzI3QjYKLWExOTU7MjdCOQotYTE5NjsyNzk4Ci1hMTk3OzI3QjQKLWExOTg7MjdCNwotYTE5OTsyN0FDCi1hMTk7MjcxMwotYTE7MjcwMQotYTIwMDsyN0FFCi1hMjAxOzI3QjEKLWEyMDI7MjcwMwotYTIwMzsyNzUwCi1hMjA0OzI3NTIKLWEyMDU7Mjc2RQotYTIwNjsyNzcwCi1hMjA7MjcxNAotYTIxOzI3MTUKLWEyMjsyNzE2Ci1hMjM7MjcxNwotYTI0OzI3MTgKLWEyNTsyNzE5Ci1hMjY7MjcxQQotYTI3OzI3MUIKLWEyODsyNzFDCi1hMjk7MjcyMgotYTI7MjcwMgotYTMwOzI3MjMKLWEzMTsyNzI0Ci1hMzI7MjcyNQotYTMzOzI3MjYKLWEzNDsyNzI3Ci1hMzU7MjYwNQotYTM2OzI3MjkKLWEzNzsyNzJBCi1hMzg7MjcyQgotYTM5OzI3MkMKLWEzOzI3MDQKLWE0MDsyNzJECi1hNDE7MjcyRQotYTQyOzI3MkYKLWE0MzsyNzMwCi1hNDQ7MjczMQotYTQ1OzI3MzIKLWE0NjsyNzMzCi1hNDc7MjczNAotYTQ4OzI3MzUKLWE0OTsyNzM2Ci1hNDsyNjBFCi1hNTA7MjczNwotYTUxOzI3MzgKLWE1MjsyNzM5Ci1hNTM7MjczQQotYTU0OzI3M0IKLWE1NTsyNzNDCi1hNTY7MjczRAotYTU3OzI3M0UKLWE1ODsyNzNGCi1hNTk7Mjc0MAotYTU7MjcwNgotYTYwOzI3NDEKLWE2MTsyNzQyCi1hNjI7Mjc0MwotYTYzOzI3NDQKLWE2NDsyNzQ1Ci1hNjU7Mjc0NgotYTY2OzI3NDcKLWE2NzsyNzQ4Ci1hNjg7Mjc0OQotYTY5OzI3NEEKLWE2OzI3MUQKLWE3MDsyNzRCCi1hNzE7MjVDRgotYTcyOzI3NEQKLWE3MzsyNUEwCi1hNzQ7Mjc0RgotYTc1OzI3NTEKLWE3NjsyNUIyCi1hNzc7MjVCQwotYTc4OzI1QzYKLWE3OTsyNzU2Ci1hNzsyNzFFCi1hODE7MjVENwotYTgyOzI3NTgKLWE4MzsyNzU5Ci1hODQ7Mjc1QQotYTg1OzI3NkYKLWE4NjsyNzcxCi1hODc7Mjc3MgotYTg4OzI3NzMKLWE4OTsyNzY4Ci1hODsyNzFGCi1hOTA7Mjc2OQotYTkxOzI3NkMKLWE5MjsyNzZECi1hOTM7Mjc2QQotYTk0OzI3NkIKLWE5NTsyNzc0Ci1hOTY7Mjc3NQotYTk3OzI3NUIKLWE5ODsyNzVDCi1hOTk7Mjc1RAotYTk7MjcyMAotIiIiCi0KLQotIyBzdHJpbmcgdGFibGUgbWFuYWdlbWVudAotIwotY2xhc3MgU3RyaW5nVGFibGU6Ci0gIGRlZiBfX2luaXRfXyggc2VsZiwgbmFtZV9saXN0LCBtYXN0ZXJfdGFibGVfbmFtZSApOgotICAgIHNlbGYubmFtZXMgICAgICAgID0gbmFtZV9saXN0Ci0gICAgc2VsZi5tYXN0ZXJfdGFibGUgPSBtYXN0ZXJfdGFibGVfbmFtZQotICAgIHNlbGYuaW5kaWNlcyAgICAgID0ge30KLSAgICBpbmRleCAgICAgICAgICAgICA9IDAKLQotICAgIGZvciBuYW1lIGluIG5hbWVfbGlzdDoKLSAgICAgIHNlbGYuaW5kaWNlc1tuYW1lXSA9IGluZGV4Ci0gICAgICBpbmRleCArPSBsZW4oIG5hbWUgKSArIDEKLQotICAgIHNlbGYudG90YWwgPSBpbmRleAotCi0gIGRlZiBkdW1wKCBzZWxmLCBmaWxlICk6Ci0gICAgd3JpdGUgPSBmaWxlLndyaXRlCi0gICAgd3JpdGUoICIjaWZuZGVmICBERUZJTkVfUFNfVEFCTEVTXG4iICkKLSAgICB3cml0ZSggIiNpZmRlZiAgX19jcGx1c3BsdXNcbiIgKQotICAgIHdyaXRlKCAnICBleHRlcm4gIkMiXG4nICkKLSAgICB3cml0ZSggIiNlbHNlXG4iICkKLSAgICB3cml0ZSggIiAgZXh0ZXJuXG4iICkKLSAgICB3cml0ZSggIiNlbmRpZlxuIiApCi0gICAgd3JpdGUoICIjZW5kaWZcbiIgKQotICAgIHdyaXRlKCAiICBjb25zdCBjaGFyICAiICsgc2VsZi5tYXN0ZXJfdGFibGUgKwotICAgICAgICAgICAiWyIgKyByZXByKCBzZWxmLnRvdGFsICkgKyAiXVxuIiApCi0gICAgd3JpdGUoICIjaWZkZWYgIERFRklORV9QU19UQUJMRVNcbiIgKQotICAgIHdyaXRlKCAiICA9XG4iICkKLSAgICB3cml0ZSggIiAge1xuIiApCi0KLSAgICBsaW5lID0gIiIKLSAgICBmb3IgbmFtZSBpbiBzZWxmLm5hbWVzOgotICAgICAgbGluZSArPSAiICAgICciCi0gICAgICBsaW5lICs9IHN0cmluZy5qb2luKCAoIHJlLmZpbmRhbGwoICIuIiwgbmFtZSApICksICInLCciICkKLSAgICAgIGxpbmUgKz0gIicsIDAsXG4iCi0KLSAgICB3cml0ZSggbGluZSApCi0gICAgd3JpdGUoICIgIH1cbiIgKQotICAgIHdyaXRlKCAiI2VuZGlmIC8qIERFRklORV9QU19UQUJMRVMgKi9cbiIgKQotICAgIHdyaXRlKCAiICA7XG5cblxuIiApCi0KLSAgZGVmIGR1bXBfc3VibGlzdCggc2VsZiwgZmlsZSwgdGFibGVfbmFtZSwgbWFjcm9fbmFtZSwgc3VibGlzdCApOgotICAgIHdyaXRlID0gZmlsZS53cml0ZQotICAgIHdyaXRlKCAiI2RlZmluZSAiICsgbWFjcm9fbmFtZSArICIgICIgKyByZXByKCBsZW4oIHN1Ymxpc3QgKSApICsgIlxuXG4iICkKLQotICAgIHdyaXRlKCAiICAvKiBWYWx1ZXMgYXJlIG9mZnNldHMgaW50byB0aGUgYCIgKwotICAgICAgICAgICBzZWxmLm1hc3Rlcl90YWJsZSArICInIHRhYmxlICovXG5cbiIgKQotICAgIHdyaXRlKCAiI2lmbmRlZiAgREVGSU5FX1BTX1RBQkxFU1xuIiApCi0gICAgd3JpdGUoICIjaWZkZWYgIF9fY3BsdXNwbHVzXG4iICkKLSAgICB3cml0ZSggJyAgZXh0ZXJuICJDIlxuJyApCi0gICAgd3JpdGUoICIjZWxzZVxuIiApCi0gICAgd3JpdGUoICIgIGV4dGVyblxuIiApCi0gICAgd3JpdGUoICIjZW5kaWZcbiIgKQotICAgIHdyaXRlKCAiI2VuZGlmXG4iICkKLSAgICB3cml0ZSggIiAgY29uc3Qgc2hvcnQgICIgKyB0YWJsZV9uYW1lICsKLSAgICAgICAgICAgIlsiICsgbWFjcm9fbmFtZSArICJdXG4iICkKLSAgICB3cml0ZSggIiNpZmRlZiAgREVGSU5FX1BTX1RBQkxFU1xuIiApCi0gICAgd3JpdGUoICIgID1cbiIgKQotICAgIHdyaXRlKCAiICB7XG4iICkKLQotICAgIGxpbmUgID0gIiAgICAiCi0gICAgY29tbWEgPSAiIgotICAgIGNvbCAgID0gMAotCi0gICAgZm9yIG5hbWUgaW4gc3VibGlzdDoKLSAgICAgIGxpbmUgKz0gY29tbWEKLSAgICAgIGxpbmUgKz0gIiU0ZCIgJSBzZWxmLmluZGljZXNbbmFtZV0KLSAgICAgIGNvbCAgKz0gMQotICAgICAgY29tbWEgPSAiLCIKLSAgICAgIGlmIGNvbCA9PSAxNDoKLSAgICAgICAgY29sICAgPSAwCi0gICAgICAgIGNvbW1hID0gIixcbiAgICAiCi0KLSAgICB3cml0ZSggbGluZSApCi0gICAgd3JpdGUoICJcbiIgKQotICAgIHdyaXRlKCAiICB9XG4iICkKLSAgICB3cml0ZSggIiNlbmRpZiAvKiBERUZJTkVfUFNfVEFCTEVTICovXG4iICkKLSAgICB3cml0ZSggIiAgO1xuXG5cbiIgKQotCi0KLSMgV2Ugbm93IHN0b3JlIHRoZSBBZG9iZSBHbHlwaCBMaXN0IGluIGNvbXByZXNzZWQgZm9ybS4gIFRoZSBsaXN0IGlzIHB1dAotIyBpbnRvIGEgZGF0YSBzdHJ1Y3R1cmUgY2FsbGVkIGB0cmllJyAoYmVjYXVzZSBpdCBoYXMgYSB0cmVlLWxpa2UKLSMgYXBwZWFyYW5jZSkuICBDb25zaWRlciwgZm9yIGV4YW1wbGUsIHRoYXQgeW91IHdhbnQgdG8gc3RvcmUgdGhlCi0jIGZvbGxvd2luZyBuYW1lIG1hcHBpbmc6Ci0jCi0jICAgQSAgICAgICAgPT4gMQotIyAgIEFhY3V0ZSAgID0+IDYKLSMgICBBYmFsb24gICA9PiAyCi0jICAgQWJzdHJhY3QgPT4gNAotIwotIyBJdCBpcyBwb3NzaWJsZSB0byBzdG9yZSB0aGUgZW50cmllcyBhcyBmb2xsb3dzLgotIwotIyAgIEEgPT4gMQotIyAgIHwKLSMgICArLWFjdXRlID0+IDYKLSMgICB8Ci0jICAgKy1iCi0jICAgICB8Ci0jICAgICArLWFsb24gPT4gMgotIyAgICAgfAotIyAgICAgKy1zdHJhY3QgPT4gNAotIwotIyBXZSBzZWUgdGhhdCBlYWNoIG5vZGUgaW4gdGhlIHRyaWUgaGFzOgotIwotIyAtIG9uZSBvciBtb3JlIGBsZXR0ZXJzJwotIyAtIGFuIG9wdGlvbmFsIHZhbHVlCi0jIC0gemVybyBvciBtb3JlIGNoaWxkIG5vZGVzCi0jCi0jIFRoZSBmaXJzdCBzdGVwIGlzIHRvIGNhbGwKLSMKLSMgICByb290ID0gU3RyaW5nTm9kZSggIiIsIDAgKQotIyAgIGZvciB3b3JkIGluIG1hcC52YWx1ZXMoKToKLSMgICAgIHJvb3QuYWRkKCB3b3JkLCBtYXBbd29yZF0gKQotIwotIyB3aGljaCBjcmVhdGVzIGEgbGFyZ2UgdHJpZSB3aGVyZSBlYWNoIG5vZGUgaGFzIG9ubHkgb25lIGNoaWxkcmVuLgotIwotIyBFeGVjdXRpbmcKLSMKLSMgICByb290ID0gcm9vdC5vcHRpbWl6ZSgpCi0jCi0jIG9wdGltaXplcyB0aGUgdHJpZSBieSBtZXJnaW5nIHRoZSBsZXR0ZXJzIG9mIHN1Y2Nlc3NpdmUgbm9kZXMgd2hlbmV2ZXIKLSMgcG9zc2libGUuCi0jCi0jIEVhY2ggbm9kZSBvZiB0aGUgdHJpZSBpcyBzdG9yZWQgYXMgZm9sbG93cy4KLSMKLSMgLSBGaXJzdCB0aGUgbm9kZSdzIGxldHRlciwgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc2NoZW1lLiAgV2UKLSMgICB1c2UgdGhlIGZhY3QgdGhhdCBpbiB0aGUgQUdMIG5vIG5hbWUgY29udGFpbnMgY2hhcmFjdGVyIGNvZGVzID4gMTI3LgotIwotIyAgICAgbmFtZSAgICAgICAgIGJpdHNpemUgICAgIGRlc2NyaXB0aW9uCi0jICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jICAgICBub3RsYXN0ICAgICAgICAgICAgMSAgICAgU2V0IHRvIDEgaWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgbGV0dGVyCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHdvcmQuCi0jICAgICBhc2NpaSAgICAgICAgICAgICAgNyAgICAgVGhlIGxldHRlcidzIEFTQ0lJIHZhbHVlLgotIwotIyAtIFRoZSBsZXR0ZXIgaXMgZm9sbG93ZWQgYnkgYSBjaGlsZHJlbiBjb3VudCBhbmQgdGhlIHZhbHVlIG9mIHRoZQotIyAgIGN1cnJlbnQga2V5IChpZiBhbnkpLiAgQWdhaW4gd2UgY2FuIGRvIHNvbWUgb3B0aW1pemF0aW9uIGJlY2F1c2UgYWxsCi0jICAgQUdMIGVudHJpZXMgYXJlIGZyb20gdGhlIEJNUDsgdGhpcyBtZWFucyB0aGF0IDE2IGJpdHMgYXJlIHN1ZmZpY2llbnQKLSMgICB0byBzdG9yZSBpdHMgVW5pY29kZSB2YWx1ZXMuICBBZGRpdGlvbmFsbHksIG5vIG5vZGUgaGFzIG1vcmUgdGhhbgotIyAgIDEyNyBjaGlsZHJlbi4KLSMKLSMgICAgIG5hbWUgICAgICAgICBiaXRzaXplICAgICBkZXNjcmlwdGlvbgotIyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgICAgIGhhc3ZhbHVlICAgICAgICAgICAxICAgICBTZXQgdG8gMSBpZiBhIDE2LWJpdCBVbmljb2RlIHZhbHVlIGZvbGxvd3MuCi0jICAgICBudW1fY2hpbGRyZW4gICAgICAgNyAgICAgTnVtYmVyIG9mIGNoaWxkcmVuLiAgQ2FuIGJlIDAgb25seSBpZgotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBoYXN2YWx1ZScgaXMgc2V0IHRvIDEuCi0jICAgICB2YWx1ZSAgICAgICAgICAgICAxNiAgICAgT3B0aW9uYWwgVW5pY29kZSB2YWx1ZS4KLSMKLSMgLSBBIG5vZGUgaXMgZmluaXNoZWQgYnkgYSBsaXN0IG9mIDE2Yml0IGFic29sdXRlIG9mZnNldHMgdG8gdGhlCi0jICAgY2hpbGRyZW4sIHdoaWNoIG11c3QgYmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgdGhlaXIgZmlyc3QKLSMgICBsZXR0ZXIuCi0jCi0jIEZvciBzaW1wbGljaXR5LCBhbGwgMTZiaXQgcXVhbnRpdGllcyBhcmUgc3RvcmVkIGluIGJpZy1lbmRpYW4gb3JkZXIuCi0jCi0jIFRoZSByb290IG5vZGUgaGFzIGZpcnN0IGxldHRlciA9IDAsIGFuZCBubyB2YWx1ZS4KLSMKLWNsYXNzIFN0cmluZ05vZGU6Ci0gIGRlZiBfX2luaXRfXyggc2VsZiwgbGV0dGVyLCB2YWx1ZSApOgotICAgIHNlbGYubGV0dGVyICAgPSBsZXR0ZXIKLSAgICBzZWxmLnZhbHVlICAgID0gdmFsdWUKLSAgICBzZWxmLmNoaWxkcmVuID0ge30KLQotICBkZWYgX19jbXBfXyggc2VsZiwgb3RoZXIgKToKLSAgICByZXR1cm4gb3JkKCBzZWxmLmxldHRlclswXSApIC0gb3JkKCBvdGhlci5sZXR0ZXJbMF0gKQotCi0gIGRlZiBhZGQoIHNlbGYsIHdvcmQsIHZhbHVlICk6Ci0gICAgaWYgbGVuKCB3b3JkICkgPT0gMDoKLSAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQotICAgICAgcmV0dXJuCi0KLSAgICBsZXR0ZXIgPSB3b3JkWzBdCi0gICAgd29yZCAgID0gd29yZFsxOl0KLQotICAgIGlmIHNlbGYuY2hpbGRyZW4uaGFzX2tleSggbGV0dGVyICk6Ci0gICAgICBjaGlsZCA9IHNlbGYuY2hpbGRyZW5bbGV0dGVyXQotICAgIGVsc2U6Ci0gICAgICBjaGlsZCA9IFN0cmluZ05vZGUoIGxldHRlciwgMCApCi0gICAgICBzZWxmLmNoaWxkcmVuW2xldHRlcl0gPSBjaGlsZAotCi0gICAgY2hpbGQuYWRkKCB3b3JkLCB2YWx1ZSApCi0KLSAgZGVmIG9wdGltaXplKCBzZWxmICk6Ci0gICAgIyBvcHRpbWl6ZSBhbGwgY2hpbGRyZW4gZmlyc3QKLSAgICBjaGlsZHJlbiAgICAgID0gc2VsZi5jaGlsZHJlbi52YWx1ZXMoKQotICAgIHNlbGYuY2hpbGRyZW4gPSB7fQotCi0gICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgotICAgICAgc2VsZi5jaGlsZHJlbltjaGlsZC5sZXR0ZXJbMF1dID0gY2hpbGQub3B0aW1pemUoKQotCi0gICAgIyBkb24ndCBvcHRpbWl6ZSBpZiB0aGVyZSdzIGEgdmFsdWUsCi0gICAgIyBpZiB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZCBvciBpZiB3ZQotICAgICMgaGF2ZSBtb3JlIHRoYW4gb25lIGNoaWxkCi0gICAgaWYgKCBzZWxmLnZhbHVlICE9IDAgKSBvciAoIG5vdCBjaGlsZHJlbiApIG9yIGxlbiggY2hpbGRyZW4gKSA+IDE6Ci0gICAgICByZXR1cm4gc2VsZgotCi0gICAgY2hpbGQgPSBjaGlsZHJlblswXQotCi0gICAgc2VsZi5sZXR0ZXIgICs9IGNoaWxkLmxldHRlcgotICAgIHNlbGYudmFsdWUgICAgPSBjaGlsZC52YWx1ZQotICAgIHNlbGYuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbgotCi0gICAgcmV0dXJuIHNlbGYKLQotICBkZWYgZHVtcF9kZWJ1Zyggc2VsZiwgd3JpdGUsIG1hcmdpbiApOgotICAgICMgdGhpcyBpcyB1c2VkIGR1cmluZyBkZWJ1Z2dpbmcKLSAgICBsaW5lID0gbWFyZ2luICsgIistIgotICAgIGlmIGxlbiggc2VsZi5sZXR0ZXIgKSA9PSAwOgotICAgICAgbGluZSArPSAiPE5PTEVUVEVSPiIKLSAgICBlbHNlOgotICAgICAgbGluZSArPSBzZWxmLmxldHRlcgotCi0gICAgaWYgc2VsZi52YWx1ZToKLSAgICAgIGxpbmUgKz0gIiA9PiAiICsgcmVwciggc2VsZi52YWx1ZSApCi0KLSAgICB3cml0ZSggbGluZSArICJcbiIgKQotCi0gICAgaWYgc2VsZi5jaGlsZHJlbjoKLSAgICAgIG1hcmdpbiArPSAifCAiCi0gICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbi52YWx1ZXMoKToKLSAgICAgICAgY2hpbGQuZHVtcF9kZWJ1Zyggd3JpdGUsIG1hcmdpbiApCi0KLSAgZGVmIGxvY2F0ZSggc2VsZiwgaW5kZXggKToKLSAgICBzZWxmLmluZGV4ID0gaW5kZXgKLSAgICBpZiBsZW4oIHNlbGYubGV0dGVyICkgPiAwOgotICAgICAgaW5kZXggKz0gbGVuKCBzZWxmLmxldHRlciApICsgMQotICAgIGVsc2U6Ci0gICAgICBpbmRleCArPSAyCi0KLSAgICBpZiBzZWxmLnZhbHVlICE9IDA6Ci0gICAgICBpbmRleCArPSAyCi0KLSAgICBjaGlsZHJlbiA9IHNlbGYuY2hpbGRyZW4udmFsdWVzKCkKLSAgICBjaGlsZHJlbi5zb3J0KCkKLQotICAgIGluZGV4ICs9IDIgKiBsZW4oIGNoaWxkcmVuICkKLSAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46Ci0gICAgICBpbmRleCA9IGNoaWxkLmxvY2F0ZSggaW5kZXggKQotCi0gICAgcmV0dXJuIGluZGV4Ci0KLSAgZGVmIHN0b3JlKCBzZWxmLCBzdG9yYWdlICk6Ci0gICAgIyB3cml0ZSB0aGUgbGV0dGVycwotICAgIGwgPSBsZW4oIHNlbGYubGV0dGVyICkKLSAgICBpZiBsID09IDA6Ci0gICAgICBzdG9yYWdlICs9IHN0cnVjdC5wYWNrKCAiQiIsIDAgKQotICAgIGVsc2U6Ci0gICAgICBmb3IgbiBpbiByYW5nZSggbCApOgotICAgICAgICB2YWwgPSBvcmQoIHNlbGYubGV0dGVyW25dICkKLSAgICAgICAgaWYgbiA8IGwgLSAxOgotICAgICAgICAgIHZhbCArPSAxMjgKLSAgICAgICAgc3RvcmFnZSArPSBzdHJ1Y3QucGFjayggIkIiLCB2YWwgKQotCi0gICAgIyB3cml0ZSB0aGUgY291bnQKLSAgICBjaGlsZHJlbiA9IHNlbGYuY2hpbGRyZW4udmFsdWVzKCkKLSAgICBjaGlsZHJlbi5zb3J0KCkKLQotICAgIGNvdW50ID0gbGVuKCBjaGlsZHJlbiApCi0KLSAgICBpZiBzZWxmLnZhbHVlICE9IDA6Ci0gICAgICBzdG9yYWdlICs9IHN0cnVjdC5wYWNrKCAiIUJIIiwgY291bnQgKyAxMjgsIHNlbGYudmFsdWUgKQotICAgIGVsc2U6Ci0gICAgICBzdG9yYWdlICs9IHN0cnVjdC5wYWNrKCAiQiIsIGNvdW50ICkKLQotICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKLSAgICAgIHN0b3JhZ2UgKz0gc3RydWN0LnBhY2soICIhSCIsIGNoaWxkLmluZGV4ICkKLQotICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKLSAgICAgIHN0b3JhZ2UgPSBjaGlsZC5zdG9yZSggc3RvcmFnZSApCi0KLSAgICByZXR1cm4gc3RvcmFnZQotCi0KLWRlZiBhZG9iZV9nbHlwaF92YWx1ZXMoKToKLSAgIiIicmV0dXJuIHRoZSBsaXN0IG9mIGdseXBoIG5hbWVzIGFuZCB0aGVpciB1bmljb2RlIHZhbHVlcyIiIgotCi0gIGxpbmVzICA9IHN0cmluZy5zcGxpdCggYWRvYmVfZ2x5cGhfbGlzdCwgJ1xuJyApCi0gIGdseXBocyA9IFtdCi0gIHZhbHVlcyA9IFtdCi0KLSAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgaWYgbGluZToKLSAgICAgIGZpZWxkcyA9IHN0cmluZy5zcGxpdCggbGluZSwgJzsnICkKLSMgICAgIHByaW50IGZpZWxkc1sxXSArICcgLSAnICsgZmllbGRzWzBdCi0gICAgICBzdWJmaWVsZHMgPSBzdHJpbmcuc3BsaXQoIGZpZWxkc1sxXSwgJyAnICkKLSAgICAgIGlmIGxlbiggc3ViZmllbGRzICkgPT0gMToKLSAgICAgICAgZ2x5cGhzLmFwcGVuZCggZmllbGRzWzBdICkKLSAgICAgICAgdmFsdWVzLmFwcGVuZCggZmllbGRzWzFdICkKLQotICByZXR1cm4gZ2x5cGhzLCB2YWx1ZXMKLQotCi1kZWYgZmlsdGVyX2dseXBoX25hbWVzKCBhbGlzdCwgZmlsdGVyICk6Ci0gICIiImZpbHRlciBgYWxpc3QnIGJ5IHRha2luZyBfb3V0XyBhbGwgZ2x5cGggbmFtZXMgdGhhdCBhcmUgaW4gYGZpbHRlciciIiIKLQotICBjb3VudCAgPSAwCi0gIGV4dHJhcyA9IFtdCi0KLSAgZm9yIG5hbWUgaW4gYWxpc3Q6Ci0gICAgdHJ5OgotICAgICAgZmlsdGVyZWRfaW5kZXggPSBmaWx0ZXIuaW5kZXgoIG5hbWUgKQotICAgIGV4Y2VwdDoKLSAgICAgIGV4dHJhcy5hcHBlbmQoIG5hbWUgKQotCi0gIHJldHVybiBleHRyYXMKLQotCi1kZWYgZHVtcF9lbmNvZGluZyggZmlsZSwgZW5jb2RpbmdfbmFtZSwgZW5jb2RpbmdfbGlzdCApOgotICAiIiJkdW1wIGEgZ2l2ZW4gZW5jb2RpbmciIiIKLQotICB3cml0ZSA9IGZpbGUud3JpdGUKLSAgd3JpdGUoICIgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGluZGljZXMgaW50byB0aGUgU0lEIG5hbWUgdGFibGUgKi9cbiIgKQotICB3cml0ZSggIiNpZm5kZWYgIERFRklORV9QU19UQUJMRVNcbiIgKQotICB3cml0ZSggIiNpZmRlZiAgX19jcGx1c3BsdXNcbiIgKQotICB3cml0ZSggJyAgZXh0ZXJuICJDIlxuJyApCi0gIHdyaXRlKCAiI2Vsc2VcbiIgKQotICB3cml0ZSggIiAgZXh0ZXJuXG4iICkKLSAgd3JpdGUoICIjZW5kaWZcbiIgKQotICB3cml0ZSggIiNlbmRpZlxuIiApCi0gIHdyaXRlKCAiICBjb25zdCB1bnNpZ25lZCBzaG9ydCAgIiArIGVuY29kaW5nX25hbWUgKwotICAgICAgICAgIlsiICsgcmVwciggbGVuKCBlbmNvZGluZ19saXN0ICkgKSArICJdXG4iICkKLSAgd3JpdGUoICIjaWZkZWYgIERFRklORV9QU19UQUJMRVNcbiIgKQotICB3cml0ZSggIiAgPVxuIiApCi0gIHdyaXRlKCAiICB7XG4iICkKLQotICBsaW5lICA9ICIgICAgIgotICBjb21tYSA9ICIiCi0gIGNvbCAgID0gMAotICBmb3IgdmFsdWUgaW4gZW5jb2RpbmdfbGlzdDoKLSAgICBsaW5lICs9IGNvbW1hCi0gICAgbGluZSArPSAiJTNkIiAlIHZhbHVlCi0gICAgY29tbWEgPSAiLCIKLSAgICBjb2wgICs9IDEKLSAgICBpZiBjb2wgPT0gMTY6Ci0gICAgICBjb2wgPSAwCi0gICAgICBjb21tYSA9ICIsXG4gICAgIgotCi0gIHdyaXRlKCBsaW5lICkKLSAgd3JpdGUoICJcbiIgKQotICB3cml0ZSggIiAgfVxuIiApCi0gIHdyaXRlKCAiI2VuZGlmIC8qIERFRklORV9QU19UQUJMRVMgKi9cbiIgKQotICB3cml0ZSggIiAgO1xuXG5cbiIgKQotCi0KLWRlZiBkdW1wX2FycmF5KCB0aGVfYXJyYXksIHdyaXRlLCBhcnJheV9uYW1lICk6Ci0gICIiImR1bXBzIGEgZ2l2ZW4gZW5jb2RpbmciIiIKLQotICB3cml0ZSggIiNpZm5kZWYgIERFRklORV9QU19UQUJMRVNcbiIgKQotICB3cml0ZSggIiNpZmRlZiAgX19jcGx1c3BsdXNcbiIgKQotICB3cml0ZSggJyAgZXh0ZXJuICJDIlxuJyApCi0gIHdyaXRlKCAiI2Vsc2VcbiIgKQotICB3cml0ZSggIiAgZXh0ZXJuXG4iICkKLSAgd3JpdGUoICIjZW5kaWZcbiIgKQotICB3cml0ZSggIiNlbmRpZlxuIiApCi0gIHdyaXRlKCAiICBjb25zdCB1bnNpZ25lZCBjaGFyICAiICsgYXJyYXlfbmFtZSArCi0gICAgICAgICAiWyIgKyByZXByKCBsZW4oIHRoZV9hcnJheSApICkgKyAiTF1cbiIgKQotICB3cml0ZSggIiNpZmRlZiAgREVGSU5FX1BTX1RBQkxFU1xuIiApCi0gIHdyaXRlKCAiICA9XG4iICkKLSAgd3JpdGUoICIgIHtcbiIgKQotCi0gIGxpbmUgID0gIiIKLSAgY29tbWEgPSAiICAgICIKLSAgY29sICAgPSAwCi0KLSAgZm9yIHZhbHVlIGluIHRoZV9hcnJheToKLSAgICBsaW5lICs9IGNvbW1hCi0gICAgbGluZSArPSAiJTNkIiAlIG9yZCggdmFsdWUgKQotICAgIGNvbW1hID0gIiwiCi0gICAgY29sICArPSAxCi0KLSAgICBpZiBjb2wgPT0gMTY6Ci0gICAgICBjb2wgICA9IDAKLSAgICAgIGNvbW1hID0gIixcbiAgICAiCi0KLSAgICBpZiBsZW4oIGxpbmUgKSA+IDEwMjQ6Ci0gICAgICB3cml0ZSggbGluZSApCi0gICAgICBsaW5lID0gIiIKLQotICB3cml0ZSggbGluZSApCi0gIHdyaXRlKCAiXG4iICkKLSAgd3JpdGUoICIgIH1cbiIgKQotICB3cml0ZSggIiNlbmRpZiAvKiBERUZJTkVfUFNfVEFCTEVTICovXG4iICkKLSAgd3JpdGUoICIgIDtcblxuXG4iICkKLQotCi1kZWYgbWFpbigpOgotICAiIiJtYWluIHByb2dyYW0gYm9keSIiIgotCi0gIGlmIGxlbiggc3lzLmFyZ3YgKSAhPSAyOgotICAgIHByaW50IF9fZG9jX18gJSBzeXMuYXJndlswXQotICAgIHN5cy5leGl0KCAxICkKLQotICBmaWxlICA9IG9wZW4oIHN5cy5hcmd2WzFdLCAid1xuIiApCi0gIHdyaXRlID0gZmlsZS53cml0ZQotCi0gIGNvdW50X3NpZCA9IGxlbiggc2lkX3N0YW5kYXJkX25hbWVzICkKLQotICAjIGBtYWNfZXh0cmFzJyBjb250YWlucyB0aGUgbGlzdCBvZiBnbHlwaCBuYW1lcyBpbiB0aGUgTWFjaW50b3NoIHN0YW5kYXJkCi0gICMgZW5jb2Rpbmcgd2hpY2ggYXJlIG5vdCBpbiB0aGUgU0lEIFN0YW5kYXJkIE5hbWVzLgotICAjCi0gIG1hY19leHRyYXMgPSBmaWx0ZXJfZ2x5cGhfbmFtZXMoIG1hY19zdGFuZGFyZF9uYW1lcywgc2lkX3N0YW5kYXJkX25hbWVzICkKLQotICAjIGBiYXNlX2xpc3QnIGNvbnRhaW5zIHRoZSBuYW1lcyBvZiBvdXIgZmluYWwgZ2x5cGggbmFtZXMgdGFibGUuCi0gICMgSXQgY29uc2lzdHMgb2YgdGhlIGBtYWNfZXh0cmFzJyBnbHlwaCBuYW1lcywgZm9sbG93ZWQgYnkgdGhlIFNJRAotICAjIHN0YW5kYXJkIG5hbWVzLgotICAjCi0gIG1hY19leHRyYXNfY291bnQgPSBsZW4oIG1hY19leHRyYXMgKQotICBiYXNlX2xpc3QgICAgICAgID0gbWFjX2V4dHJhcyArIHNpZF9zdGFuZGFyZF9uYW1lcwotCi0gIHdyaXRlKCAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiIgKQotICB3cml0ZSggIi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4iICkKLQotICB3cml0ZSggIi8qICAlLTcxcyovXG4iICUgb3MucGF0aC5iYXNlbmFtZSggc3lzLmFyZ3ZbMV0gKSApCi0KLSAgd3JpdGUoICIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuIiApCi0gIHdyaXRlKCAiLyogICAgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiIgKQotICB3cml0ZSggIi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4iICkKLSAgd3JpdGUoICIvKiAgQ29weXJpZ2h0IDIwMDUtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuIiApCi0gIHdyaXRlKCAiLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi9cbiIgKQotICB3cml0ZSggIi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4iICkKLSAgd3JpdGUoICIvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqL1xuIiApCi0gIHdyaXRlKCAiLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi9cbiIgKQotICB3cml0ZSggIi8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovXG4iICkKLSAgd3JpdGUoICIvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqL1xuIiApCi0gIHdyaXRlKCAiLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiIgKQotICB3cml0ZSggIi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4iICkKLSAgd3JpdGUoICIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIiApCi0gIHdyaXRlKCAiXG4iICkKLSAgd3JpdGUoICJcbiIgKQotICB3cml0ZSggIiAgLyogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IC0tIGRvIG5vdCBlZGl0ISAqL1xuIiApCi0gIHdyaXRlKCAiXG4iICkKLSAgd3JpdGUoICJcbiIgKQotCi0gICMgZHVtcCBmaW5hbCBnbHlwaCBsaXN0IChtYWMgZXh0cmFzICsgc2lkIHN0YW5kYXJkIG5hbWVzKQotICAjCi0gIHN0ID0gU3RyaW5nVGFibGUoIGJhc2VfbGlzdCwgImZ0X3N0YW5kYXJkX2dseXBoX25hbWVzIiApCi0KLSAgc3QuZHVtcCggZmlsZSApCi0gIHN0LmR1bXBfc3VibGlzdCggZmlsZSwgImZ0X21hY19uYW1lcyIsCi0gICAgICAgICAgICAgICAgICAgIkZUX05VTV9NQUNfTkFNRVMiLCBtYWNfc3RhbmRhcmRfbmFtZXMgKQotICBzdC5kdW1wX3N1Ymxpc3QoIGZpbGUsICJmdF9zaWRfbmFtZXMiLAotICAgICAgICAgICAgICAgICAgICJGVF9OVU1fU0lEX05BTUVTIiwgc2lkX3N0YW5kYXJkX25hbWVzICkKLQotICBkdW1wX2VuY29kaW5nKCBmaWxlLCAidDFfc3RhbmRhcmRfZW5jb2RpbmciLCB0MV9zdGFuZGFyZF9lbmNvZGluZyApCi0gIGR1bXBfZW5jb2RpbmcoIGZpbGUsICJ0MV9leHBlcnRfZW5jb2RpbmciLCB0MV9leHBlcnRfZW5jb2RpbmcgKQotCi0gICMgZHVtcCB0aGUgQUdMIGluIGl0cyBjb21wcmVzc2VkIGZvcm0KLSAgIwotICBhZ2xfZ2x5cGhzLCBhZ2xfdmFsdWVzID0gYWRvYmVfZ2x5cGhfdmFsdWVzKCkKLSAgZGljdCA9IFN0cmluZ05vZGUoICIiLCAwICkKLQotICBmb3IgZyBpbiByYW5nZSggbGVuKCBhZ2xfZ2x5cGhzICkgKToKLSAgICBkaWN0LmFkZCggYWdsX2dseXBoc1tnXSwgZXZhbCggIjB4IiArIGFnbF92YWx1ZXNbZ10gKSApCi0KLSAgZGljdCAgICAgICA9IGRpY3Qub3B0aW1pemUoKQotICBkaWN0X2xlbiAgID0gZGljdC5sb2NhdGUoIDAgKQotICBkaWN0X2FycmF5ID0gZGljdC5zdG9yZSggIiIgKQotCi0gIHdyaXRlKCAiIiJcCi0gIC8qCi0gICAqICBUaGlzIHRhYmxlIGlzIGEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBBZG9iZSBHbHlwaCBMaXN0IChBR0wpLAotICAgKiAgb3B0aW1pemVkIGZvciBlZmZpY2llbnQgc2VhcmNoaW5nLiAgSXQgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZQotICAgKiAgYGdsbmFtZXMucHknIHB5dGhvbiBzY3JpcHQgbG9jYXRlZCBpbiB0aGUgYHNyYy90b29scycgZGlyZWN0b3J5LgotICAgKgotICAgKiAgVGhlIGxvb2t1cCBmdW5jdGlvbiB0byBnZXQgdGhlIFVuaWNvZGUgdmFsdWUgZm9yIGEgZ2l2ZW4gc3RyaW5nCi0gICAqICBpcyBkZWZpbmVkIGJlbG93IHRoZSB0YWJsZS4KLSAgICovCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0FET0JFX0dMWVBIX0xJU1QKLQotIiIiICkKLQotICBkdW1wX2FycmF5KCBkaWN0X2FycmF5LCB3cml0ZSwgImZ0X2Fkb2JlX2dseXBoX2xpc3QiICkKLQotICAjIHdyaXRlIHRoZSBsb29rdXAgcm91dGluZSBub3cKLSAgIwotICB3cml0ZSggIiIiXAotI2lmZGVmICBERUZJTkVfUFNfVEFCTEVTCi0gIC8qCi0gICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBjb21wcmVzc2VkIHRhYmxlIGVmZmljaWVudGx5LgotICAgKi8KLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcKLSAgZnRfZ2V0X2Fkb2JlX2dseXBoX2luZGV4KCBjb25zdCBjaGFyKiAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbGltaXQgKQotICB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIGMgPSAwOwotICAgIGludCAgICAgICAgICAgICAgICAgICBjb3VudCwgbWluLCBtYXg7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciogIHAgPSBmdF9hZG9iZV9nbHlwaF9saXN0OwotCi0KLSAgICBpZiAoIG5hbWUgPT0gMCB8fCBuYW1lID49IGxpbWl0ICkKLSAgICAgIGdvdG8gTm90Rm91bmQ7Ci0KLSAgICBjICAgICA9ICpuYW1lKys7Ci0gICAgY291bnQgPSBwWzFdOwotICAgIHAgICAgKz0gMjsKLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gY291bnQ7Ci0KLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG1pZCA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqICBxICAgPSBwICsgbWlkICogMjsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICBjMjsKLQotCi0gICAgICBxID0gZnRfYWRvYmVfZ2x5cGhfbGlzdCArICggKCAoaW50KXFbMF0gPDwgOCApIHwgcVsxXSApOwotCi0gICAgICBjMiA9IHFbMF0gJiAxMjc7Ci0gICAgICBpZiAoIGMyID09IGMgKQotICAgICAgewotICAgICAgICBwID0gcTsKLSAgICAgICAgZ290byBGb3VuZDsKLSAgICAgIH0KLSAgICAgIGlmICggYzIgPCBjICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgICAgbWF4ID0gbWlkOwotICAgIH0KLSAgICBnb3RvIE5vdEZvdW5kOwotCi0gIEZvdW5kOgotICAgIGZvciAoOzspCi0gICAgewotICAgICAgLyogYXNzZXJ0ICgqcCAmIDEyNykgPT0gYyAqLwotCi0gICAgICBpZiAoIG5hbWUgPj0gbGltaXQgKQotICAgICAgewotICAgICAgICBpZiAoIChwWzBdICYgMTI4KSA9PSAwICYmCi0gICAgICAgICAgICAgKHBbMV0gJiAxMjgpICE9IDAgKQotICAgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZykoICggKGludClwWzJdIDw8IDggKSB8IHBbM10gKTsKLQotICAgICAgICBnb3RvIE5vdEZvdW5kOwotICAgICAgfQotICAgICAgYyA9ICpuYW1lKys7Ci0gICAgICBpZiAoIHBbMF0gJiAxMjggKQotICAgICAgewotICAgICAgICBwKys7Ci0gICAgICAgIGlmICggYyAhPSAocFswXSAmIDEyNykgKQotICAgICAgICAgIGdvdG8gTm90Rm91bmQ7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHArKzsKLSAgICAgIGNvdW50ID0gcFswXSAmIDEyNzsKLSAgICAgIGlmICggcFswXSAmIDEyOCApCi0gICAgICAgIHAgKz0gMjsKLQotICAgICAgcCsrOwotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcCArPSAyICkKLSAgICAgIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG9mZnNldCA9ICggKGludClwWzBdIDw8IDggKSB8IHBbMV07Ci0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqICBxICAgICAgPSBmdF9hZG9iZV9nbHlwaF9saXN0ICsgb2Zmc2V0OwotCi0gICAgICAgIGlmICggYyA9PSAoIHFbMF0gJiAxMjcgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBwID0gcTsKLSAgICAgICAgICBnb3RvIE5leHRJdGVyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBnb3RvIE5vdEZvdW5kOwotCi0gICAgTmV4dEl0ZXI6Ci0gICAgICA7Ci0gICAgfQotCi0gIE5vdEZvdW5kOgotICAgIHJldHVybiAwOwotICB9Ci0jZW5kaWYgLyogREVGSU5FX1BTX1RBQkxFUyAqLwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUICovCi0KLSIiIiApCi0KLSAgaWYgMDogICMgZ2VuZXJhdGUgdW5pdCB0ZXN0LCBvciBkb24ndAotICAgICMKLSAgICAjIG5vdyB3cml0ZSB0aGUgdW5pdCB0ZXN0IHRvIGNoZWNrIHRoYXQgZXZlcnl0aGluZyB3b3JrcyBPSwotICAgICMKLSAgICB3cml0ZSggIiNpZmRlZiBURVNUXG5cbiIgKQotCi0gICAgd3JpdGUoICJzdGF0aWMgY29uc3QgY2hhciogY29uc3QgIHRoZV9uYW1lc1tdID0ge1xuIiApCi0gICAgZm9yIG5hbWUgaW4gYWdsX2dseXBoczoKLSAgICAgIHdyaXRlKCAnICAiJyArIG5hbWUgKyAnIixcbicgKQotICAgIHdyaXRlKCAiICAwXG59O1xuIiApCi0KLSAgICB3cml0ZSggInN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nICB0aGVfdmFsdWVzW10gPSB7XG4iICkKLSAgICBmb3IgdmFsIGluIGFnbF92YWx1ZXM6Ci0gICAgICB3cml0ZSggJyAgMHgnICsgdmFsICsgJyxcbicgKQotICAgIHdyaXRlKCAiICAwXG59O1xuIiApCi0KLSAgICB3cml0ZSggIiIiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotICBpbnQKLSAgbWFpbiggdm9pZCApCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICBjb25zdCBjaGFyKiBjb25zdCogICAgbmFtZXMgID0gdGhlX25hbWVzOwotICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqICB2YWx1ZXMgPSB0aGVfdmFsdWVzOwotCi0KLSAgICBmb3IgKCA7ICpuYW1lczsgbmFtZXMrKywgdmFsdWVzKysgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqICAgIG5hbWUgICAgICA9ICpuYW1lczsKLSAgICAgIHVuc2lnbmVkIGxvbmcgIHJlZmVyZW5jZSA9ICp2YWx1ZXM7Ci0gICAgICB1bnNpZ25lZCBsb25nICB2YWx1ZTsKLQotCi0gICAgICB2YWx1ZSA9IGZ0X2dldF9hZG9iZV9nbHlwaF9pbmRleCggbmFtZSwgbmFtZSArIHN0cmxlbiggbmFtZSApICk7Ci0gICAgICBpZiAoIHZhbHVlICE9IHJlZmVyZW5jZSApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIm5hbWUgJyVzJyA9PiAlMDR4IGluc3RlYWQgb2YgJTA0eFxcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUsIHJlZmVyZW5jZSApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSIiIiApCi0KLSAgICB3cml0ZSggIiNlbmRpZiAvKiBURVNUICovXG4iICkKLQotICB3cml0ZSgiXG4vKiBFTkQgKi9cbiIpCi0KLQotIyBOb3cgcnVuIHRoZSBtYWluIHJvdXRpbmUKLSMKLW1haW4oKQotCi0KLSMgRU5ECmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvbm8tY29weXJpZ2h0IGIvc3JjL3Rvb2xzL25vLWNvcHlyaWdodApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzOWFhNC4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvbm8tY29weXJpZ2h0CisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIyBGaWxlcyB0aGF0IGRvbid0IGdldCBhIGNvcHlyaWdodCwgb3Igd2hpY2ggYXJlIHRha2VuIGZyb20gZWxzZXdoZXJlLgotIwotIyBBbGwgbGluZXMgaW4gdGhpcyBmaWxlIGFyZSBwYXR0ZXJucywgaW5jbHVkaW5nIHRoZSBjb21tZW50IGxpbmVzOyB0aGlzCi0jIG1lYW5zIHRoYXQgZS5nLiBgRlRMLlRYVCcgbWF0Y2hlcyBhbGwgZmlsZXMgdGhhdCBoYXZlIHRoaXMgc3RyaW5nIGluCi0jIHRoZSBmaWxlIG5hbWUgKGluY2x1ZGluZyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksCi0jIGFsd2F5cyBzdGFydGluZyB3aXRoIGAuLycpLgotIwotIyBEb24ndCBwdXQgZW1wdHkgbGluZXMgaW50byB0aGlzIGZpbGUhCi0jCi0uZ2l0aWdub3JlCi0jCi1idWlsZHMvdW5peC9wa2cubTQKLSMKLWRvY3MvRlRMLlRYVAotZG9jcy9HUEx2Mi5UWFQKLSMKLWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmgKLSMKLXNyYy9iYXNlL2Z0aGFzaC5jCi1zcmMvYmFzZS9tZDUuYwotc3JjL2Jhc2UvbWQ1LmgKLSMKLXNyYy9iZGYvYmRmLmMKLXNyYy9iZGYvYmRmLmgKLXNyYy9iZGYvYmRmZHJpdnIuYwotc3JjL2JkZi9iZGZkcml2ci5oCi1zcmMvYmRmL2JkZmVycm9yLmgKLXNyYy9iZGYvYmRmbGliLmMKLXNyYy9iZGYvbW9kdWxlLm1rCi1zcmMvYmRmL1JFQURNRQotc3JjL2JkZi9ydWxlcy5tawotIwotc3JjL3BjZi9tb2R1bGUubWsKLXNyYy9wY2YvcGNmLmMKLXNyYy9wY2YvcGNmLmgKLXNyYy9wY2YvcGNmZHJpdnIuYwotc3JjL3BjZi9wY2Zkcml2ci5oCi1zcmMvcGNmL3BjZmVycm9yLmgKLXNyYy9wY2YvcGNmcmVhZC5jCi1zcmMvcGNmL3BjZnJlYWQuaAotc3JjL3BjZi9wY2Z1dGlsLmMKLXNyYy9wY2YvcGNmdXRpbC5oCi1zcmMvcGNmL1JFQURNRQotc3JjL3BjZi9ydWxlcy5tawotIwotc3JjL2d6aXAvYWRsZXIzMi5jCi1zcmMvZ3ppcC9pbmZibG9jay5jCi1zcmMvZ3ppcC9pbmZibG9jay5oCi1zcmMvZ3ppcC9pbmZjb2Rlcy5jCi1zcmMvZ3ppcC9pbmZjb2Rlcy5oCi1zcmMvZ3ppcC9pbmZmaXhlZC5oCi1zcmMvZ3ppcC9pbmZsYXRlLmMKLXNyYy9nemlwL2luZnRyZWVzLmMKLXNyYy9nemlwL2luZnRyZWVzLmgKLXNyYy9nemlwL2luZnV0aWwuYwotc3JjL2d6aXAvaW5mdXRpbC5oCi1zcmMvZ3ppcC96Y29uZi5oCi1zcmMvZ3ppcC96bGliLmgKLXNyYy9nemlwL3p1dGlsLmMKLXNyYy9nemlwL3p1dGlsLmgKLSMKLXNyYy90b29scy9hcGluYW1lcy5jCi1zcmMvdG9vbHMvZnRyYW5kb20vZnRyYW5kb20uYwotIwotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy90b29scy90ZXN0X2FmbS5jIGIvc3JjL3Rvb2xzL3Rlc3RfYWZtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZTYxOWIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL3Rlc3RfYWZtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIGdjYyAtREZUMl9CVUlMRF9MSUJSQVJZIC1JLi4vLi4vaW5jbHVkZSAtbyB0ZXN0X2FmbSB0ZXN0X2FmbS5jIFwKLSAqICAgICAtTC4uLy4uL29ianMvLmxpYnMgLWxmcmVldHlwZSAtbHogLXN0YXRpYwotICovCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLSAgdm9pZCBkdW1wX2ZvbnRpbmZvKCBBRk1fRm9udEluZm8gIGZpICkKLSAgewotICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgIHByaW50ZiggIlRoaXMgQUZNIGlzIGZvciAlc0NJRCBmb250LlxuXG4iLAotICAgICAgICAgICAgKCBmaS0+SXNDSURGb250ICkgPyAiIiA6ICJub24tIiApOwotCi0gICAgcHJpbnRmKCAiRm9udEJCb3g6ICUuMmYgJS4yZiAlLjJmICUuMmZcbiIsIGZpLT5Gb250QkJveC54TWluIC8gNjU1MzYuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaS0+Rm9udEJCb3gueU1pbiAvIDY1NTM2LiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmktPkZvbnRCQm94LnhNYXggLyA2NTUzNi4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpLT5Gb250QkJveC55TWF4IC8gNjU1MzYuICk7Ci0gICAgcHJpbnRmKCAiQXNjZW5kZXI6ICUuMmZcbiIsIGZpLT5Bc2NlbmRlciAvIDY1NTM2LiApOwotICAgIHByaW50ZiggIkRlc2NlbmRlcjogJS4yZlxuXG4iLCBmaS0+RGVzY2VuZGVyIC8gNjU1MzYuICk7Ci0KLSAgICBpZiAoIGZpLT5OdW1UcmFja0tlcm4gKQotICAgICAgcHJpbnRmKCAiVGhlcmUgYXJlICVkIHNldHMgb2YgdHJhY2sga2VybmluZ3M6XG4iLAotICAgICAgICAgICAgICBmaS0+TnVtVHJhY2tLZXJuICk7Ci0gICAgZWxzZQotICAgICAgcHJpbnRmKCAiVGhlcmUgaXMgbm8gdHJhY2sga2VybmluZy5cbiIgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgZmktPk51bVRyYWNrS2VybjsgaSsrICkKLSAgICB7Ci0gICAgICBBRk1fVHJhY2tLZXJuICB0ayA9IGZpLT5UcmFja0tlcm5zICsgaTsKLQotCi0gICAgICBwcmludGYoICJcdCUyZDogJTUuMmYgJTUuMmYgJTUuMmYgJTUuMmZcbiIsIHRrLT5kZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRrLT5taW5fcHRzaXplIC8gNjU1MzYuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ay0+bWluX2tlcm4gLyA2NTUzNi4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRrLT5tYXhfcHRzaXplIC8gNjU1MzYuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ay0+bWF4X2tlcm4gLyA2NTUzNi4gKTsKLSAgICB9Ci0KLSAgICBwcmludGYoICJcbiIgKTsKLQotICAgIGlmICggZmktPk51bUtlcm5QYWlyICkKLSAgICAgIHByaW50ZiggIlRoZXJlIGFyZSAlZCBrZXJuaW5nIHBhaXJzOlxuIiwKLSAgICAgICAgICAgICAgZmktPk51bUtlcm5QYWlyICk7Ci0gICAgZWxzZQotICAgICAgcHJpbnRmKCAiVGhlcmUgaXMgbm8ga2VybmluZyBwYWlyLlxuIiApOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBmaS0+TnVtS2VyblBhaXI7IGkrKyApCi0gICAgewotICAgICAgQUZNX0tlcm5QYWlyICBrcCA9IGZpLT5LZXJuUGFpcnMgKyBpOwotCi0KLSAgICAgIHByaW50ZiggIlx0JTNkICsgJTNkID0+ICglNGQsICU0ZClcbiIsIGtwLT5pbmRleDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcC0+aW5kZXgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3AtPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcC0+eSApOwotICAgIH0KLQotICB9Ci0KLSAgaW50Ci0gIGR1bW15X2dldF9pbmRleCggY29uc3QgY2hhciogIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgIGxlbiwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdXNlcl9kYXRhICkKLSAgewotICAgIGlmICggbGVuICkKLSAgICAgIHJldHVybiBuYW1lWzBdOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICB9Ci0KLSAgRlRfRXJyb3IKLSAgcGFyc2VfYWZtKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgRlRfU3RyZWFtICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgQUZNX0ZvbnRJbmZvICBmaSApCi0gIHsKLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eDsKLSAgICBBRk1fUGFyc2VyUmVjICBwYXJzZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoIGxpYnJhcnksICJwc2F1eCIgKTsKLSAgICBpZiAoICFwc2F1eCB8fCAhcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MgKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fRW50ZXJGcmFtZSggc3RyZWFtLCBzdHJlYW0tPnNpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGVycm9yID0gcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MtPmluaXQoICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeS0+bWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bGltaXQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHBhcnNlci5Gb250SW5mbyA9IGZpOwotICAgIHBhcnNlci5nZXRfaW5kZXggPSBkdW1teV9nZXRfaW5kZXg7Ci0KLSAgICBlcnJvciA9IHBzYXV4LT5hZm1fcGFyc2VyX2Z1bmNzLT5wYXJzZSggJnBhcnNlciApOwotCi0gICAgcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MtPmRvbmUoICZwYXJzZXIgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgaW50IG1haW4oIGludCAgICBhcmdjLAotICAgICAgICAgICAgY2hhcioqIGFyZ3YgKQotICB7Ci0gICAgRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5OwotICAgIEZUX1N0cmVhbVJlYyAgICAgc3RyZWFtOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgQUZNX0ZvbnRJbmZvUmVjICBmaTsKLQotCi0gICAgaWYgKCBhcmdjIDwgMiApCi0gICAgICByZXR1cm4gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBGVF9aRVJPKCAmc3RyZWFtICk7Ci0gICAgZXJyb3IgPSBGVF9TdHJlYW1fT3BlbiggJnN0cmVhbSwgYXJndlsxXSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotICAgIHN0cmVhbS5tZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBGVF9aRVJPKCAmZmkgKTsKLSAgICBlcnJvciA9IHBhcnNlX2FmbSggbGlicmFyeSwgJnN0cmVhbSwgJmZpICk7Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgICAgZHVtcF9mb250aW5mbyggJmZpICk7Ci0KLSAgICAgIGlmICggZmkuS2VyblBhaXJzICkKLSAgICAgICAgRlRfRlJFRSggZmkuS2VyblBhaXJzICk7Ci0gICAgICBpZiAoIGZpLlRyYWNrS2VybnMgKQotICAgICAgICBGVF9GUkVFKCBmaS5UcmFja0tlcm5zICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHByaW50ZiggInBhcnNlIGVycm9yXG4iICk7Ci0KLSAgICBGVF9TdHJlYW1fQ2xvc2UoICZzdHJlYW0gKTsKLQotICBFeGl0OgotICAgIEZUX0RvbmVfRnJlZVR5cGUoIGxpYnJhcnkgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3Rlc3RfYmJveC5jIGIvc3JjL3Rvb2xzL3Rlc3RfYmJveC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGI4MmMzLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy90ZXN0X2Jib3guYworKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0JCT1hfSAotCi0KLSNpbmNsdWRlIDx0aW1lLmg+ICAgIC8qIGZvciBjbG9jaygpICovCi0KLS8qIFN1bk9TIDQuMS4qIGRvZXMgbm90IGRlZmluZSBDTE9DS1NfUEVSX1NFQywgc28gaW5jbHVkZSA8c3lzL3BhcmFtLmg+ICovCi0vKiB0byBnZXQgdGhlIEhaIG1hY3JvIHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIGRlZmluZWQoX19zdW5fXykgJiYgIWRlZmluZWQoU1ZSNCkgJiYgIWRlZmluZWQoX19TVlI0KQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2RlZmluZSBDTE9DS1NfUEVSX1NFQyBIWgotI2VuZGlmCi0KLSAgc3RhdGljIGxvbmcKLSAgZ2V0X3RpbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuIGNsb2NrKCkgKiAxMDAwMEwgLyBDTE9DS1NfUEVSX1NFQzsKLSAgfQotCi0KLQotCi0gIC8qIHRlc3QgYmJveCBjb21wdXRhdGlvbnMgKi8KLQotI2RlZmluZSAgWFNDQUxFICAgIDY1NTM2Ci0jZGVmaW5lICBYWCh4KSAgICAgKChGVF9Qb3MpKHgqWFNDQUxFKSkKLSNkZWZpbmUgIFhWRUMoeCx5KSAgeyBYWCh4KSwgWFgoeSkgfQotI2RlZmluZSAgWFZBTCh4KSAgICgoeCkvKDEuMCpYU0NBTEUpKQotCi0gIC8qIGR1bW15IG91dGxpbmUgIzEgKi8KLSAgc3RhdGljIEZUX1ZlY3RvciAgZHVtbXlfdmVjXzFbNF0gPQotICB7Ci0jaWYgMQotICAgIFhWRUMoIDQwOC45MTExLCA1MzUuMzE2NCApLAotICAgIFhWRUMoIDQ1NS44ODg3LCA2MzQuMzk2ICApLAotICAgIFhWRUMoIC0zNy44NzY1LCA3ODYuMjIwNyApLAotICAgIFhWRUMoIDE2NC42MDc0LCA1MzUuMzE2NCApCi0jZWxzZQotICAgIHsgKEZUX0ludDMyKTB4MDE5OEU5M0RMICwgKEZUX0ludDMyKTB4MDIxNzUwRkZMIH0sICAvKiA0MDguOTExMSwgNTM1LjMxNjQgKi8KLSAgICB7IChGVF9JbnQzMikweDAxQzdFMzEyTCAsIChGVF9JbnQzMikweDAyN0E2NTYwTCB9LCAgLyogNDU1Ljg4ODcsIDYzNC4zOTYwICovCi0gICAgeyAoRlRfSW50MzIpMHhGRkRBMUY5RUwgLCAoRlRfSW50MzIpMHgwMzEyMzg3RkwgfSwgIC8qIC0zNy44NzY1LCA3ODYuMjIwNyAqLwotICAgIHsgKEZUX0ludDMyKTB4MDBBNDlCN0VMICwgKEZUX0ludDMyKTB4MDIxNzUwRkZMIH0gICAvKiAxNjQuNjA3NCwgNTM1LjMxNjQgKi8KLSNlbmRpZgotICAgfTsKLQotICBzdGF0aWMgY2hhciAgZHVtbXlfdGFnXzFbNF0gPQotICB7Ci0gICAgRlRfQ1VSVkVfVEFHX09OLAotICAgIEZUX0NVUlZFX1RBR19DVUJJQywKLSAgICBGVF9DVVJWRV9UQUdfQ1VCSUMsCi0gICAgRlRfQ1VSVkVfVEFHX09OCi0gIH07Ci0KLSAgc3RhdGljIHNob3J0ICBkdW1teV9jb250b3VyXzFbMV0gPQotICB7Ci0gICAgMwotICB9OwotCi0gIHN0YXRpYyBGVF9PdXRsaW5lICBkdW1teV9vdXRsaW5lXzEgPQotICB7Ci0gICAgMSwKLSAgICA0LAotICAgIGR1bW15X3ZlY18xLAotICAgIGR1bW15X3RhZ18xLAotICAgIGR1bW15X2NvbnRvdXJfMSwKLSAgICAwCi0gIH07Ci0KLQotICAvKiBkdW1teSBvdXRsaW5lICMyICovCi0gIHN0YXRpYyBGVF9WZWN0b3IgIGR1bW15X3ZlY18yWzRdID0KLSAgewotICAgIFhWRUMoIDEwMC4wLCAxMDAuMCApLAotICAgIFhWRUMoIDEwMC4wLCAyMDAuMCApLAotICAgIFhWRUMoIDIwMC4wLCAyMDAuMCApLAotICAgIFhWRUMoIDIwMC4wLCAxMzMuMCApCi0gIH07Ci0KLSAgc3RhdGljIEZUX091dGxpbmUgIGR1bW15X291dGxpbmVfMiA9Ci0gIHsKLSAgICAxLAotICAgIDQsCi0gICAgZHVtbXlfdmVjXzIsCi0gICAgZHVtbXlfdGFnXzEsCi0gICAgZHVtbXlfY29udG91cl8xLAotICAgIDAKLSAgfTsKLQotCi0gIC8qIGR1bW15IG91dGxpbmUgIzMgd2l0aCBiYm94IG9mIFswIDEwMCAxMjggMTI4XSBwcmVjaXNlbHkgKi8KLSAgc3RhdGljIEZUX1ZlY3RvciAgZHVtbXlfdmVjXzNbNF0gPQotICB7Ci0gICAgWFZFQyggMTAwLjAsIDEyNy4wICksCi0gICAgWFZFQyggMjAwLjAsIDEyNy4wICksCi0gICAgWFZFQyggICAwLjAsIDEzNi4wICksCi0gICAgWFZFQyggICAwLjAsIDEwMC4wICkKLSAgfTsKLQotICBzdGF0aWMgRlRfT3V0bGluZSAgZHVtbXlfb3V0bGluZV8zID0KLSAgewotICAgIDEsCi0gICAgNCwKLSAgICBkdW1teV92ZWNfMywKLSAgICBkdW1teV90YWdfMSwKLSAgICBkdW1teV9jb250b3VyXzEsCi0gICAgMAotICB9OwotCi0KLSAgc3RhdGljIHZvaWQKLSAgZHVtcF9vdXRsaW5lKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICBGVF9CQm94ICBiYm94OwotCi0gICAgLyogY29tcHV0ZSBhbmQgZGlzcGxheSBjYm94ICovCi0gICAgRlRfT3V0bGluZV9HZXRfQ0JveCggb3V0bGluZSwgJmJib3ggKTsKLSAgICBwcmludGYoICJjYm94ID0gWyUuMmYgJS4yZiAlLjJmICUuMmZdXG4iLAotICAgICAgICAgICAgIFhWQUwoIGJib3gueE1pbiApLAotICAgICAgICAgICAgIFhWQUwoIGJib3gueU1pbiApLAotICAgICAgICAgICAgIFhWQUwoIGJib3gueE1heCApLAotICAgICAgICAgICAgIFhWQUwoIGJib3gueU1heCApICk7Ci0KLSAgICAvKiBjb21wdXRlIGFuZCBkaXNwbGF5IGJib3ggKi8KLSAgICBGVF9PdXRsaW5lX0dldF9CQm94KCBvdXRsaW5lLCAmYmJveCApOwotICAgIHByaW50ZiggImJib3ggPSBbJS4yZiAlLjJmICUuMmYgJS4yZl1cbiIsCi0gICAgICAgICAgICAgWFZBTCggYmJveC54TWluICksCi0gICAgICAgICAgICAgWFZBTCggYmJveC55TWluICksCi0gICAgICAgICAgICAgWFZBTCggYmJveC54TWF4ICksCi0gICAgICAgICAgICAgWFZBTCggYmJveC55TWF4ICkgKTsKLSAgfQotCi0KLQotICBzdGF0aWMgdm9pZAotICBwcm9maWxlX291dGxpbmUoIEZUX091dGxpbmUqICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgIHJlcGVhdCApCi0gIHsKLSAgICBGVF9CQm94ICBiYm94OwotICAgIGxvbmcgICAgIGNvdW50OwotICAgIGxvbmcgICAgIHRpbWUwOwotCi0gICAgdGltZTAgPSBnZXRfdGltZSgpOwotICAgIGZvciAoIGNvdW50ID0gcmVwZWF0OyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggb3V0bGluZSwgJmJib3ggKTsKLQotICAgIHRpbWUwID0gZ2V0X3RpbWUoKSAtIHRpbWUwOwotICAgIHByaW50ZiggInRpbWUgPSAlNi4zZiBjYm94ID0gWyU4LjRmICU4LjRmICU4LjRmICU4LjRmXVxuIiwKLSAgICAgICAgICAgICAoKGRvdWJsZSl0aW1lMC8xMDAwMC4wKSwKLSAgICAgICAgICAgICBYVkFMKCBiYm94LnhNaW4gKSwKLSAgICAgICAgICAgICBYVkFMKCBiYm94LnlNaW4gKSwKLSAgICAgICAgICAgICBYVkFMKCBiYm94LnhNYXggKSwKLSAgICAgICAgICAgICBYVkFMKCBiYm94LnlNYXggKSApOwotICAgIHByaW50ZiggImNib3hfaGV4ID0gWyUwOFggJTA4WCAlMDhYICUwOFhdXG4iLAotICAgICAgICAgICAgIGJib3gueE1pbiwgYmJveC55TWluLCBiYm94LnhNYXgsIGJib3gueU1heCApOwotCi0KLSAgICB0aW1lMCA9IGdldF90aW1lKCk7Ci0gICAgZm9yICggY291bnQgPSByZXBlYXQ7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICBGVF9PdXRsaW5lX0dldF9CQm94KCBvdXRsaW5lLCAmYmJveCApOwotCi0gICAgdGltZTAgPSBnZXRfdGltZSgpIC0gdGltZTA7Ci0gICAgcHJpbnRmKCAidGltZSA9ICU2LjNmIGJib3ggPSBbJTguNGYgJTguNGYgJTguNGYgJTguNGZdXG4iLAotICAgICAgICAgICAgICgoZG91YmxlKXRpbWUwLzEwMDAwLjApLAotICAgICAgICAgICAgIFhWQUwoIGJib3gueE1pbiApLAotICAgICAgICAgICAgIFhWQUwoIGJib3gueU1pbiApLAotICAgICAgICAgICAgIFhWQUwoIGJib3gueE1heCApLAotICAgICAgICAgICAgIFhWQUwoIGJib3gueU1heCApICk7Ci0gICAgcHJpbnRmKCAiYmJveF9oZXggPSBbJTA4WCAlMDhYICUwOFggJTA4WF1cbiIsCi0gICAgICAgICAgICAgYmJveC54TWluLCBiYm94LnlNaW4sIGJib3gueE1heCwgYmJveC55TWF4ICk7Ci0gIH0KLQotI2RlZmluZSBSRVBFQVQgIDEwMDAwMDBMCi0KLSAgaW50ICBtYWluKCBpbnQgIGFyZ2MsIGNoYXIqKiAgYXJndiApCi0gIHsKLSAgICBwcmludGYoICJvdXRsaW5lICMxXG4iICk7Ci0gICAgcHJvZmlsZV9vdXRsaW5lKCAmZHVtbXlfb3V0bGluZV8xLCBSRVBFQVQgKTsKLQotICAgIHByaW50ZiggIm91dGxpbmUgIzJcbiIgKTsKLSAgICBwcm9maWxlX291dGxpbmUoICZkdW1teV9vdXRsaW5lXzIsIFJFUEVBVCApOwotCi0gICAgcHJpbnRmKCAib3V0bGluZSAjM1xuIiApOwotICAgIHByb2ZpbGVfb3V0bGluZSggJmR1bW15X291dGxpbmVfMywgUkVQRUFUICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvdGVzdF90cmlnLmMgYi9zcmMvdG9vbHMvdGVzdF90cmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YWMxY2YuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL3Rlc3RfdHJpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lICBQSSAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKLSNkZWZpbmUgIFNQSSAgKFBJL0ZUX0FOR0xFX1BJKQotCi0vKiB0aGUgcHJlY2lzaW9uIGluIDE2LjE2IGZpeGVkLXBvaW50IGNoZWNrcy4gRXhwZWN0IGJldHdlZW4gMiBhbmQgNSAqLwotLyogbm9pc2UgTFNCIGJpdHMgZHVyaW5nIG9wZXJhdGlvbnMsIGR1ZSB0byByb3VuZGluZyBlcnJvcnMuLiAgICAgICAgKi8KLSNkZWZpbmUgIFRIUkVTSE9MRCAgNjQKLQotICBzdGF0aWMgIGVycm9yID0gMDsKLQotICBzdGF0aWMgdm9pZAotICB0ZXN0X2Nvcyggdm9pZCApCi0gIHsKLSAgICBpbnQgIGk7Ci0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfQU5HTEVfMlBJOyBpICs9IDB4MTAwMDBMICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgZjEsIGYyOwotICAgICAgZG91YmxlICAgIGQyOwotCi0KLSAgICAgIGYxID0gRlRfQ29zKGkpOwotICAgICAgZDIgPSBjb3MoIGkqU1BJICk7Ci0gICAgICBmMiA9IChGVF9GaXhlZCkoZDIqNjU1MzYuMCk7Ci0KLSAgICAgIGlmICggYWJzKCBmMi1mMSApID4gVEhSRVNIT0xEICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSAxOwotICAgICAgICBwcmludGYoICJGVF9Db3NbJTNkXSA9ICUuN2YgIGNvc1slM2RdID0gJS43ZlxuIiwKLSAgICAgICAgICAgICAgICAoaSA+PiAxNiksIGYxLzY1NTM2LjAsIChpID4+IDE2KSwgZDIgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHRlc3Rfc2luKCB2b2lkICkKLSAgewotICAgIGludCAgaTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBGVF9BTkdMRV8yUEk7IGkgKz0gMHgxMDAwMEwgKQotICAgIHsKLSAgICAgIEZUX0ZpeGVkICBmMSwgZjI7Ci0gICAgICBkb3VibGUgICAgZDI7Ci0KLQotICAgICAgZjEgPSBGVF9TaW4oaSk7Ci0gICAgICBkMiA9IHNpbiggaSpTUEkgKTsKLSAgICAgIGYyID0gKEZUX0ZpeGVkKShkMio2NTUzNi4wKTsKLQotICAgICAgaWYgKCBhYnMoIGYyLWYxICkgPiBUSFJFU0hPTEQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IDE7Ci0gICAgICAgIHByaW50ZiggIkZUX1NpblslM2RdID0gJS43ZiAgc2luWyUzZF0gPSAlLjdmXG4iLAotICAgICAgICAgICAgICAgIChpID4+IDE2KSwgZjEvNjU1MzYuMCwgKGkgPj4gMTYpLCBkMiApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdGVzdF90YW4oIHZvaWQgKQotICB7Ci0gICAgaW50ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IEZUX0FOR0xFX1BJMiAtIDB4MjAwMDAwMEw7IGkgKz0gMHgxMDAwMEwgKQotICAgIHsKLSAgICAgIEZUX0ZpeGVkICBmMSwgZjI7Ci0gICAgICBkb3VibGUgICAgZDI7Ci0KLQotICAgICAgZjEgPSBGVF9UYW4oaSk7Ci0gICAgICBkMiA9IHRhbiggaSpTUEkgKTsKLSAgICAgIGYyID0gKEZUX0ZpeGVkKShkMio2NTUzNi4wKTsKLQotICAgICAgaWYgKCBhYnMoIGYyLWYxICkgPiBUSFJFU0hPTEQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IDE7Ci0gICAgICAgIHByaW50ZiggIkZUX1RhblslM2RdID0gJS43ZiAgdGFuWyUzZF0gPSAlLjdmXG4iLAotICAgICAgICAgICAgICAgIChpID4+IDE2KSwgZjEvNjU1MzYuMCwgKGkgPj4gMTYpLCBkMiApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdGVzdF9hdGFuMiggdm9pZCApCi0gIHsKLSAgICBpbnQgIGk7Ci0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfQU5HTEVfMlBJOyBpICs9IDB4MTAwMDBMICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgYzIsIHMyOwotICAgICAgZG91YmxlICAgIGwsIGEsIGMxLCBzMTsKLSAgICAgIGludCAgICAgICBqOwotCi0KLSAgICAgIGwgID0gNS4wOwotICAgICAgYSAgPSBpKlNQSTsKLQotICAgICAgYzEgPSBsICogY29zKGEpOwotICAgICAgczEgPSBsICogc2luKGEpOwotCi0gICAgICBjMiA9IChGVF9GaXhlZCkoYzEqNjU1MzYuMCk7Ci0gICAgICBzMiA9IChGVF9GaXhlZCkoczEqNjU1MzYuMCk7Ci0KLSAgICAgIGogID0gRlRfQXRhbjIoIGMyLCBzMiApOwotICAgICAgaWYgKCBqIDwgMCApCi0gICAgICAgIGogKz0gRlRfQU5HTEVfMlBJOwotCi0gICAgICBpZiAoIGFicyggaSAtIGogKSA+IDEgKQotICAgICAgewotICAgICAgICBwcmludGYoICJGVF9BdGFuMiggJS43ZiwgJS43ZiApID0gJS41ZiwgYXRhbiA9ICUuNWZcbiIsCi0gICAgICAgICAgICAgICAgYzIvNjU1MzYuMCwgczIvNjU1MzYuMCwgai82NTUzNi4wLCBpLzY1NTM2LjAgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHRlc3RfdW5pdCggdm9pZCApCi0gIHsKLSAgICBpbnQgIGk7Ci0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfQU5HTEVfMlBJOyBpICs9IDB4MTAwMDBMICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IgIHY7Ci0gICAgICBkb3VibGUgICAgIGEsIGMxLCBzMTsKLSAgICAgIEZUX0ZpeGVkICAgYzIsIHMyOwotCi0KLSAgICAgIEZUX1ZlY3Rvcl9Vbml0KCAmdiwgaSApOwotICAgICAgYSAgPSAoIGkqU1BJICk7Ci0gICAgICBjMSA9IGNvcyhhKTsKLSAgICAgIHMxID0gc2luKGEpOwotICAgICAgYzIgPSAoRlRfRml4ZWQpKGMxKjY1NTM2LjApOwotICAgICAgczIgPSAoRlRfRml4ZWQpKHMxKjY1NTM2LjApOwotCi0gICAgICBpZiAoIGFicyggdi54LWMyICkgPiBUSFJFU0hPTEQgfHwKLSAgICAgICAgICAgYWJzKCB2LnktczIgKSA+IFRIUkVTSE9MRCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gMTsKLSAgICAgICAgcHJpbnRmKCAiRlRfVmVjdG9yX1VuaXRbJTNkXSA9ICggJS43ZiwgJS43ZiApICB2ZWMgPSAoICUuN2YsICUuN2YgKVxuIiwKLSAgICAgICAgICAgICAgICAoaSA+PiAxNiksCi0gICAgICAgICAgICAgICAgdi54LzY1NTM2LjAsIHYueS82NTUzNi4wLAotICAgICAgICAgICAgICAgIGMxLCBzMSApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdGVzdF9sZW5ndGgoIHZvaWQgKQotICB7Ci0gICAgaW50ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IEZUX0FOR0xFXzJQSTsgaSArPSAweDEwMDAwTCApCi0gICAgewotICAgICAgRlRfVmVjdG9yICB2OwotICAgICAgRlRfRml4ZWQgICBsLCBsMjsKLQotCi0gICAgICBsICAgPSAoRlRfRml4ZWQpKDUwMC4wKjY1NTM2LjApOwotICAgICAgdi54ID0gKEZUX0ZpeGVkKSggbCAqIGNvcyggaSpTUEkgKSApOwotICAgICAgdi55ID0gKEZUX0ZpeGVkKSggbCAqIHNpbiggaSpTUEkgKSApOwotICAgICAgbDIgID0gRlRfVmVjdG9yX0xlbmd0aCggJnYgKTsKLQotICAgICAgaWYgKCBhYnMoIGwyLWwgKSA+IFRIUkVTSE9MRCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gMTsKLSAgICAgICAgcHJpbnRmKCAiRlRfTGVuZ3RoKCAlLjdmLCAlLjdmICkgPSAlLjVmLCBsZW5ndGggPSAlLjVmXG4iLAotICAgICAgICAgICAgICAgIHYueC82NTUzNi4wLCB2LnkvNjU1MzYuMCwgbDIvNjU1MzYuMCwgbC82NTUzNi4wICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICB0ZXN0X3JvdGF0ZSggdm9pZCApCi0gIHsKLSAgICBpbnQgIHJvdGF0ZTsKLQotCi0gICAgZm9yICggcm90YXRlID0gMDsgcm90YXRlIDwgRlRfQU5HTEVfMlBJOyByb3RhdGUgKz0gMHgxMDAwMEwgKQotICAgIHsKLSAgICAgIGRvdWJsZSAgcmEsIGNyYSwgc3JhOwotICAgICAgaW50ICAgICBpOwotCi0KLSAgICAgIHJhICA9IHJvdGF0ZSpTUEk7Ci0gICAgICBjcmEgPSBjb3MoIHJhICk7Ci0gICAgICBzcmEgPSBzaW4oIHJhICk7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfQU5HTEVfMlBJOyBpICs9IDB4MTAwMDBMICkKLSAgICAgIHsKLSAgICAgICAgRlRfRml4ZWQgICBjMiwgczIsIGM0LCBzNDsKLSAgICAgICAgRlRfVmVjdG9yICB2OwotICAgICAgICBkb3VibGUgICAgIGwsIGEsIGMxLCBzMSwgYzMsIHMzOwotCi0KLSAgICAgICAgbCAgPSA1MDAuMDsKLSAgICAgICAgYSAgPSBpKlNQSTsKLQotICAgICAgICBjMSA9IGwgKiBjb3MoYSk7Ci0gICAgICAgIHMxID0gbCAqIHNpbihhKTsKLQotICAgICAgICB2LnggPSBjMiA9IChGVF9GaXhlZCkoYzEqNjU1MzYuMCk7Ci0gICAgICAgIHYueSA9IHMyID0gKEZUX0ZpeGVkKShzMSo2NTUzNi4wKTsKLQotICAgICAgICBGVF9WZWN0b3JfUm90YXRlKCAmdiwgcm90YXRlICk7Ci0KLSAgICAgICAgYzMgPSBjMSAqIGNyYSAtIHMxICogc3JhOwotICAgICAgICBzMyA9IGMxICogc3JhICsgczEgKiBjcmE7Ci0KLSAgICAgICAgYzQgPSAoRlRfRml4ZWQpKGMzKjY1NTM2LjApOwotICAgICAgICBzNCA9IChGVF9GaXhlZCkoczMqNjU1MzYuMCk7Ci0KLSAgICAgICAgaWYgKCBhYnMoIGM0IC0gdi54ICkgPiBUSFJFU0hPTEQgfHwKLSAgICAgICAgICAgICBhYnMoIHM0IC0gdi55ICkgPiBUSFJFU0hPTEQgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSAxOwotICAgICAgICAgIHByaW50ZiggIkZUX1JvdGF0ZSggKCUuN2YsJS43ZiksICUuNWYgKSA9ICggJS43ZiwgJS43ZiApLCByb3QgPSAoICUuN2YsICUuN2YgKVxuIiwKLSAgICAgICAgICAgICAgICAgIGMxLCBzMSwgcmEsCi0gICAgICAgICAgICAgICAgICBjMi82NTUzNi4wLCBzMi82NTUzNi4wLAotICAgICAgICAgICAgICAgICAgYzQvNjU1MzYuMCwgczQvNjU1MzYuMCApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBpbnQgbWFpbiggdm9pZCApCi0gIHsKLSAgICB0ZXN0X2NvcygpOwotICAgIHRlc3Rfc2luKCk7Ci0gICAgdGVzdF90YW4oKTsKLSAgICB0ZXN0X2F0YW4yKCk7Ci0gICAgdGVzdF91bml0KCk7Ci0gICAgdGVzdF9sZW5ndGgoKTsKLSAgICB0ZXN0X3JvdGF0ZSgpOwotCi0gICAgaWYgKCFlcnJvcikKLSAgICAgIHByaW50ZiggInRyaWdvbm9tZXRyeSB0ZXN0IG9rICFcbiIgKTsKLQotICAgIHJldHVybiAhZXJyb3I7Ci0gIH0KZGlmZiAtLWdpdCBhL3NyYy90b29scy91cGRhdGUtY29weXJpZ2h0IGIvc3JjL3Rvb2xzL3VwZGF0ZS1jb3B5cmlnaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhOGJmOWIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL3VwZGF0ZS1jb3B5cmlnaHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBSdW4gdGhlIGB1cGRhdGUtY29weXJpZ2h0LXllYXInIHNjcmlwdCBvbiBhbGwgZmlsZXMgaW4gdGhlIGdpdCByZXBvc2l0b3J5LAotIyB0YWtpbmcgY2FyZSBvZiBleGNlcHRpb25zIHN0b3JlZCBpbiBmaWxlIGBuby1jb3B5cmlnaHQnLgotCi10b3BkaXI9YGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsYAotdG9vbHNkaXI9JHRvcGRpci9zcmMvdG9vbHMKLQotZ2l0IGxzLWZpbGVzIC0tZnVsbC1uYW1lICR0b3BkaXIgICAgICAgIFwKLXwgc2VkICdzfF58Li4vLi4vfCcgICAgICAgICAgICAgICAgICAgICBcCi18IGdyZXAgLXZGZiAkdG9vbHNkaXIvbm8tY29weXJpZ2h0ICAgICAgXAotfCB4YXJncyAkdG9vbHNkaXIvdXBkYXRlLWNvcHlyaWdodC15ZWFyCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvdXBkYXRlLWNvcHlyaWdodC15ZWFyIGIvc3JjL3Rvb2xzL3VwZGF0ZS1jb3B5cmlnaHQteWVhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGIwNGJmYy4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvdXBkYXRlLWNvcHlyaWdodC15ZWFyCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLWV2YWwgJyhleGl0ICQ/MCknICYmIGV2YWwgJ2V4ZWMgcGVybCAtd1MgLWkgIiQwIiAkezErIiRAIn0nCi0gICYgZXZhbCAnZXhlYyBwZXJsIC13UyAtaSAiJDAiICRhcmd2OnEnCi0gICAgaWYgMDsKLQotIyBDb3B5cmlnaHQgMjAxNS0yMDE3IGJ5Ci0jIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0jIFtOb3RlOiBUaGlzIHNjcmlwdCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgYnkgdGhlIHNoZWxsLCB3aGljaCBpbiB0dXJuCi0jICBjYWxscyBwZXJsIGF1dG9tYXRpY2FsbHkuICBUaGUgbmlmdHkgc3RhcnQtdXAgY29kZSBhYm92ZSBpcyBiYXNlZCBvbgotIyAgZ251bGliJ3MgYHVwZGF0ZS1jb3B5cmlnaHQnIHNjcmlwdDsgaXQgaXMgYSBtb3JlIHBvcnRhYmxlIHJlcGxhY2VtZW50IGZvcgotIyAgdGhlIHNoZWJhbmcsIHVzaW5nIHRoZSBmaXJzdCBgcGVybCcgcHJvZ3JhbSBpbiB0aGUgc2hlbGwncyBwYXRoIGluc3RlYWQuXQotCi0jIFVzYWdlOgotIwotIyAgIHVwZGF0ZS1jb3B5cmlnaHQteWVhciBmaWxlMSBbZmlsZTIgLi4uXQotCi0KLSMgVGhpcyBzY3JpcHQgaGFuZGxlcyBjb3B5cmlnaHQgZW50cmllcyBsaWtlCi0jCi0jICAgQ29weXJpZ2h0ICAyMDAwICAgYnkKLSMgICBmb29iYXIKLSMKLSMgb3IKLSMKLSMgICAvKiBDb3B5cmlnaHQgMjAwMCwgIDIwMDEsIDIwMDQtMjAwNyBieSAgICAqLwotIyAgIC8qIGZvb2JhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jCi0jIGFuZCByZXBsYWNlcyB0aGVtIHVuaWZvcm1seSB3aXRoCi0jCi0jICAgQ29weXJpZ2h0IDIwMDAtMjAxNQotIyAgIGZvb2JhcgotIwotIyBhbmQKLSMKLSMgICAvKiBDb3B5cmlnaHQgMjAwMC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAqLwotIyAgIC8qIGZvb2JhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jCi0jIChhc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IHllYXIgaXMgMjAxNSkuICBBcyBjYW4gYmUgc2VlbiwgdGhlIGxpbmUgbGVuZ3RoCi0jIGlzIHJldGFpbmVkIGlmIHRoZXJlIGlzIG5vbi13aGl0ZXNwYWNlIGFmdGVyIHRoZSB3b3JkIGBieScgb24gdGhlIHNhbWUKLSMgbGluZS4KLQotdXNlIHN0cmljdDsKLQotCi1teSAodW5kZWYsIHVuZGVmLCB1bmRlZiwKLSAgICB1bmRlZiwgdW5kZWYsICR5ZWFyLAotICAgIHVuZGVmLCB1bmRlZiwgdW5kZWYpID0gbG9jYWx0aW1lKHRpbWUpOwotJHllYXIgKz0gMTkwMDsKLQotbXkgJHJlcGxhY2VkID0gMDsKLQotCi0jIExvb3Agb3ZlciBhbGwgaW5wdXQgZmlsZXM7IG9wdGlvbiBgLWknIChpc3N1ZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mCi0jIHRoaXMgc2NyaXB0KSBtYWtlcyBwZXJsIGVkaXQgdGhlbSBpbi1wbGFjZS4KLXdoaWxlICg8PikKLXsKLSAgIyBPbmx5IGhhbmRsZSB0aGUgZmlyc3QgY29weXJpZ2h0IG5vdGljZSBpbiBhIGZpbGUuCi0gIGlmICghJHJlcGxhY2VkKQotICB7Ci0gICAgIyBGaXJzdCB0cnk6IFNlYXJjaCBtdWx0aXBsZSBjb3B5cmlnaHQgeWVhcnMuCi0gICAgcyB7Ci0gICAgICAgICg/PGJlZ2luPi4qKQotICAgICAgICBDb3B5cmlnaHQKLSAgICAgICAgKD88c3BhY2UxPlwgKykKLSAgICAgICAgKD88Zmlyc3Q+WzEyXVswLTldWzAtOV1bMC05XSkKLSAgICAgICAgKD88bWlkZGxlPi4rKQotICAgICAgICAoPzxsYXN0PlsxMl1bMC05XVswLTldWzAtOV0pCi0gICAgICAgICg/PHNwYWNlMj5cICspCi0gICAgICAgIGJ5Ci0gICAgICAgICg/PHNwYWNlMz5cICopCi0gICAgICAgICg/PGVuZD4uKikKLSAgICAgIH0KLSAgICAgIHsKLSAgICAgICAgIyBGaWxsIGxpbmUgdG8gdGhlIHNhbWUgbGVuZ3RoIChpZiBhcHByb3ByaWF0ZSk7IHdlIHNraXAgdGhlIG1pZGRsZQotICAgICAgICAjIHBhcnQgYnV0IGluc2VydCB0d28gc3BhY2VzIGFuZCBgLScuCi0gICAgICAgIG15ICRzcGFjZSA9IGxlbmd0aCgkK3tzcGFjZTF9KSAtIDEKLSAgICAgICAgICAgICAgICAgICAgKyBsZW5ndGgoJCt7bWlkZGxlfSkgLSAxCi0gICAgICAgICAgICAgICAgICAgICsgbGVuZ3RoKCQre3NwYWNlMn0pIC0gMQotICAgICAgICAgICAgICAgICAgICArIGxlbmd0aCgkK3tzcGFjZTN9KTsKLQotICAgICAgICBwcmludCAiJCt7YmVnaW59IjsKLSAgICAgICAgcHJpbnQgIkNvcHlyaWdodFwgJCt7Zmlyc3R9LSR5ZWFyXCBieSI7Ci0gICAgICAgIHByaW50ICcgJyB4ICRzcGFjZSBpZiBsZW5ndGgoJCt7ZW5kfSk7Ci0gICAgICAgIHByaW50ICIkK3tlbmR9XG4iOwotICAgICAgICAkcmVwbGFjZWQgPSAxOwotICAgICAgfWV4Ci0gICAgfHwKLSAgICAjIFNlY29uZCB0cnk6IFNlYXJjaCBhIHNpbmdsZSBjb3B5cmlnaHQgeWVhci4KLSAgICBzIHsKLSAgICAgICAgKD88YmVnaW4+LiopCi0gICAgICAgIENvcHlyaWdodAotICAgICAgICAoPzxzcGFjZTE+XCArKQotICAgICAgICAoPzxmaXJzdD5bMTJdWzAtOV1bMC05XVswLTldKQotICAgICAgICAoPzxzcGFjZTI+XCArKQotICAgICAgICBieQotICAgICAgICAoPzxzcGFjZTM+XCAqKQotICAgICAgICAoPzxlbmQ+LiopCi0gICAgICB9Ci0gICAgICB7Ci0gICAgICAgICMgRmlsbCBsaW5lIHRvIHRoZSBzYW1lIGxlbmd0aCAoaWYgYXBwcm9wcmlhdGUpOyB3ZSBpbnNlcnQgdHdvCi0gICAgICAgICMgc3BhY2VzLCBhIGAtJywgYW5kIHRoZSBjdXJyZW50IHllYXIuCi0gICAgICAgIG15ICRzcGFjZSA9IGxlbmd0aCgkK3tzcGFjZTF9KSAtIDEKLSAgICAgICAgICAgICAgICAgICAgKyBsZW5ndGgoJCt7c3BhY2UyfSkgLSAxCi0gICAgICAgICAgICAgICAgICAgICsgbGVuZ3RoKCQre3NwYWNlM30pCi0gICAgICAgICAgICAgICAgICAgIC0gKGxlbmd0aCgkeWVhcikgKyAxKTsKLQotICAgICAgICBwcmludCAiJCt7YmVnaW59IjsKLSAgICAgICAgcHJpbnQgIkNvcHlyaWdodCAkK3tmaXJzdH0tJHllYXIgYnkiOwotICAgICAgICAjIElmICRzcGFjZSBpcyBuZWdhdGl2ZSB0aGlzIGluc2VydHMgbm90aGluZy4KLSAgICAgICAgcHJpbnQgJyAnIHggJHNwYWNlIGlmIGxlbmd0aCgkK3tlbmR9KTsKLSAgICAgICAgcHJpbnQgIiQre2VuZH1cbiI7Ci0gICAgICAgICRyZXBsYWNlZCA9IDE7Ci0gICAgICB9ZXgKLSAgICB8fAotICAgICMgT3RoZXJ3aXNlIHByaW50IGxpbmUgdW5hbHRlcmVkLgotICAgIHByaW50OwotICB9Ci0gIGVsc2UKLSAgewotICAgIHByaW50OwotICB9Ci19Ci1jb250aW51ZQotewotICAjIFJlc2V0ICRyZXBsYWNlZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbmV4dCBmaWxlLgotICAkcmVwbGFjZWQgPSAwIGlmIGVvZjsKLX0KLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS9KYW1maWxlIGIvc3JjL3RydWV0eXBlL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDQwNmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3RydWV0eXBlIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSB0cnVldHlwZSA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gdHRkcml2ZXIKLSAgICAgICAgICAgICAgIHR0Z2xvYWQKLSAgICAgICAgICAgICAgIHR0Z3h2YXIKLSAgICAgICAgICAgICAgIHR0aW50ZXJwCi0gICAgICAgICAgICAgICB0dG9ianMKLSAgICAgICAgICAgICAgIHR0cGljCi0gICAgICAgICAgICAgICB0dHBsb2FkCi0gICAgICAgICAgICAgICB0dHN1YnBpeAotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gdHJ1ZXR5cGUgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvdHJ1ZXR5cGUgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL21vZHVsZS5tayBiL3NyYy90cnVldHlwZS9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2M1ODQuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL21vZHVsZS5taworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBUcnVlVHlwZSBtb2R1bGUgZGVmaW5pdGlvbgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotRlRNT0RVTEVfSF9DT01NQU5EUyArPSBUUlVFVFlQRV9EUklWRVIKLQotZGVmaW5lIFRSVUVUWVBFX0RSSVZFUgotJChPUEVOX0RSSVZFUikgRlRfRHJpdmVyX0NsYXNzUmVjLCB0dF9kcml2ZXJfY2xhc3MgJChDTE9TRV9EUklWRVIpCi0kKEVDSE9fRFJJVkVSKXRydWV0eXBlICAkKEVDSE9fRFJJVkVSX0RFU0MpV2luZG93cy9NYWMgZm9udCBmaWxlcyB3aXRoIGV4dGVuc2lvbiAqLnR0ZiBvciAqLnR0YyQoRUNIT19EUklWRVJfRE9ORSkKLWVuZGVmCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvcnVsZXMubWsgYi9zcmMvdHJ1ZXR5cGUvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkM2QwMDcuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFRydWVUeXBlIGRyaXZlciBjb25maWd1cmF0aW9uIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIFRydWVUeXBlIGRyaXZlciBkaXJlY3RvcnkKLSMKLVRUX0RJUiA6PSAkKFNSQ19ESVIpL3RydWV0eXBlCi0KLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotVFRfQ09NUElMRSA6PSAkKENDKSAkKEFOU0lGTEFHUykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKFRUX0RJUikpIFwKLSAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAkKEZUX0NGTEFHUykKLQotCi0jIFRydWVUeXBlIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQotIwotVFRfRFJWX1NSQyA6PSAkKFRUX0RJUikvdHRkcml2ZXIuYyBcCi0gICAgICAgICAgICAgICQoVFRfRElSKS90dGdsb2FkLmMgIFwKLSAgICAgICAgICAgICAgJChUVF9ESVIpL3R0Z3h2YXIuYyAgXAotICAgICAgICAgICAgICAkKFRUX0RJUikvdHRpbnRlcnAuYyBcCi0gICAgICAgICAgICAgICQoVFRfRElSKS90dG9ianMuYyAgIFwKLSAgICAgICAgICAgICAgJChUVF9ESVIpL3R0cGljLmMgICAgXAotICAgICAgICAgICAgICAkKFRUX0RJUikvdHRwbG9hZC5jICBcCi0gICAgICAgICAgICAgICQoVFRfRElSKS90dHN1YnBpeC5jCi0KLSMgVHJ1ZVR5cGUgZHJpdmVyIGhlYWRlcnMKLSMKLVRUX0RSVl9IIDo9ICQoVFRfRFJWX1NSQzolLmM9JS5oKSBcCi0gICAgICAgICAgICAkKFRUX0RJUikvdHRlcnJvcnMuaAotCi0KLSMgVHJ1ZVR5cGUgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIFRUX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcwotIyAgIFRUX0RSVl9PQkpfUyBpcyB1c2VkIGR1cmluZyBgc2luZ2xlJyBidWlsZHMKLSMKLVRUX0RSVl9PQkpfTSA6PSAkKFRUX0RSVl9TUkM6JChUVF9ESVIpLyUuYz0kKE9CSl9ESVIpLyUuJE8pCi1UVF9EUlZfT0JKX1MgOj0gJChPQkpfRElSKS90cnVldHlwZS4kTwotCi0jIFRydWVUeXBlIGRyaXZlciBzb3VyY2UgZmlsZSBmb3Igc2luZ2xlIGJ1aWxkCi0jCi1UVF9EUlZfU1JDX1MgOj0gJChUVF9ESVIpL3RydWV0eXBlLmMKLQotCi0jIFRydWVUeXBlIGRyaXZlciAtIHNpbmdsZSBvYmplY3QKLSMKLSQoVFRfRFJWX09CSl9TKTogJChUVF9EUlZfU1JDX1MpICQoVFRfRFJWX1NSQykgJChGUkVFVFlQRV9IKSAkKFRUX0RSVl9IKQotCSQoVFRfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQoVFRfRFJWX1NSQ19TKSkKLQotCi0jIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChUVF9ESVIpLyUuYyAkKEZSRUVUWVBFX0gpICQoVFRfRFJWX0gpCi0JJChUVF9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoVFRfRFJWX09CSl9TKQotRFJWX09CSlNfTSArPSAkKFRUX0RSVl9PQkpfTSkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3RydWV0eXBlLmMgYi9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYjgyYS4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHRydWV0eXBlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBUcnVlVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgInR0ZHJpdmVyLmMiICAgLyogZHJpdmVyIGludGVyZmFjZSAgICAqLwotI2luY2x1ZGUgInR0Z2xvYWQuYyIgICAgLyogZ2x5cGggbG9hZGVyICAgICAgICAqLwotI2luY2x1ZGUgInR0Z3h2YXIuYyIgICAgLyogZ3ggZGlzdG9ydGFibGUgZm9udCAqLwotI2luY2x1ZGUgInR0aW50ZXJwLmMiCi0jaW5jbHVkZSAidHRvYmpzLmMiICAgICAvKiBvYmplY3QgbWFuYWdlciAgICAgICovCi0jaW5jbHVkZSAidHRwaWMuYyIKLSNpbmNsdWRlICJ0dHBsb2FkLmMiICAgIC8qIHRhYmxlcyBsb2FkZXIgICAgICAgKi8KLSNpbmNsdWRlICJ0dHN1YnBpeC5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgYi9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2NTNiMi4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGRyaXZlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgZm9udCBkcml2ZXIgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19ICi0jZW5kaWYKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9FTkdJTkVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9EUklWRVJfSAotCi0jaW5jbHVkZSAidHRkcml2ZXIuaCIKLSNpbmNsdWRlICJ0dGdsb2FkLmgiCi0jaW5jbHVkZSAidHRwbG9hZC5oIgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgInR0Z3h2YXIuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAidHRlcnJvcnMuaCIKLQotI2luY2x1ZGUgInR0cGljLmgiCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRkcml2ZXIKLQotCi0gIC8qCi0gICAqICBQUk9QRVJUWSBTRVJWSUNFCi0gICAqCi0gICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfcHJvcGVydHlfc2V0KCBGVF9Nb2R1bGUgICAgbW9kdWxlLCAgICAgICAgIC8qIFRUX0RyaXZlciAqLwotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgdmFsdWVfaXNfc3RyaW5nICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIFRUX0RyaXZlciAgZHJpdmVyID0gKFRUX0RyaXZlciltb2R1bGU7Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTCi0gICAgRlRfVU5VU0VEKCB2YWx1ZV9pc19zdHJpbmcgKTsKLSNlbmRpZgotCi0KLSAgICBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJpbnRlcnByZXRlci12ZXJzaW9uIiApICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBpbnRlcnByZXRlcl92ZXJzaW9uOwotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMKLSAgICAgIGlmICggdmFsdWVfaXNfc3RyaW5nICkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogIHMgPSAoY29uc3QgY2hhciopdmFsdWU7Ci0KLQotICAgICAgICBpbnRlcnByZXRlcl92ZXJzaW9uID0gKEZUX1VJbnQpZnRfc3RydG9sKCBzLCBOVUxMLCAxMCApOwotICAgICAgfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQqICBpdiA9IChGVF9VSW50Kil2YWx1ZTsKLQotCi0gICAgICAgIGludGVycHJldGVyX3ZlcnNpb24gPSAqaXY7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggaW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAgICAgICAgfHwgaW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4Ci0jZW5kaWYKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgICAgICAgICB8fCBpbnRlcnByZXRlcl92ZXJzaW9uID09IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fNDAKLSNlbmRpZgotICAgICAgICAgKQotICAgICAgICBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPSBpbnRlcnByZXRlcl92ZXJzaW9uOwotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IEZUX0VSUiggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTAoKCAidHRfcHJvcGVydHlfc2V0OiBtaXNzaW5nIHByb3BlcnR5IGAlcydcbiIsCi0gICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIE1pc3NpbmdfUHJvcGVydHkgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3Byb3BlcnR5X2dldCggRlRfTW9kdWxlICAgIG1vZHVsZSwgICAgICAgICAvKiBUVF9Ecml2ZXIgKi8KLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgdmFsdWUgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgVFRfRHJpdmVyICBkcml2ZXIgPSAoVFRfRHJpdmVyKW1vZHVsZTsKLQotICAgIEZUX1VJbnQgIGludGVycHJldGVyX3ZlcnNpb24gPSBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb247Ci0KLQotICAgIGlmICggIWZ0X3N0cmNtcCggcHJvcGVydHlfbmFtZSwgImludGVycHJldGVyLXZlcnNpb24iICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQqICB2YWwgPSAoRlRfVUludCopdmFsdWU7Ci0KLQotICAgICAgKnZhbCA9IGludGVycHJldGVyX3ZlcnNpb247Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTAoKCAidHRfcHJvcGVydHlfZ2V0OiBtaXNzaW5nIHByb3BlcnR5IGAlcydcbiIsCi0gICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIE1pc3NpbmdfUHJvcGVydHkgKTsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0VfUFJPUEVSVElFU1JFQygKLSAgICB0dF9zZXJ2aWNlX3Byb3BlcnRpZXMsCi0KLSAgICAoRlRfUHJvcGVydGllc19TZXRGdW5jKXR0X3Byb3BlcnR5X3NldCwgICAgIC8qIHNldF9wcm9wZXJ0eSAqLwotICAgIChGVF9Qcm9wZXJ0aWVzX0dldEZ1bmMpdHRfcHJvcGVydHlfZ2V0ICAgICAgLyogZ2V0X3Byb3BlcnR5ICovCi0gICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEYgQSBDIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2dldF9rZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLwotICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICovCi0gIC8qICAgIGtlcm5pbmdzLCBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X2dldF9rZXJuaW5nKCBGVF9GYWNlICAgICB0dGZhY2UsICAgICAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGtlcm5pbmcgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICBmYWNlID0gKFRUX0ZhY2UpdHRmYWNlOwotICAgIFNGTlRfU2VydmljZSAgc2ZudCA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotCi0gICAga2VybmluZy0+eCA9IDA7Ci0gICAga2VybmluZy0+eSA9IDA7Ci0KLSAgICBpZiAoIHNmbnQgKQotICAgICAga2VybmluZy0+eCA9IHNmbnQtPmdldF9rZXJuaW5nKCBmYWNlLCBsZWZ0X2dseXBoLCByaWdodF9nbHlwaCApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9nZXRfYWR2YW5jZXMoIEZUX0ZhY2UgICAgdHRmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYWR2YW5jZXMgKQotICB7Ci0gICAgRlRfVUludCAgbm47Ci0gICAgVFRfRmFjZSAgZmFjZSA9IChUVF9GYWNlKXR0ZmFjZTsKLQotCi0gICAgLyogWFhYOiBUT0RPOiBjaGVjayBmb3Igc2JpdHMgKi8KLQotICAgIGlmICggZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgewotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICAgIC8qIG5vIGZhc3QgcmV0cmlldmFsIGZvciBibGVuZGVkIE1NIGZvbnRzIHdpdGhvdXQgVlZBUiB0YWJsZSAqLwotICAgICAgaWYgKCAhZmFjZS0+aXNfZGVmYXVsdF9pbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfVkFEVkFOQ0UgKSApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0jZW5kaWYKLQotICAgICAgZm9yICggbm4gPSAwOyBubiA8IGNvdW50OyBubisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfU2hvcnQgICB0c2I7Ci0gICAgICAgIEZUX1VTaG9ydCAgYWg7Ci0KLQotICAgICAgICAvKiBzaW5jZSB3ZSBkb24ndCBuZWVkIGB0c2InLCB3ZSB1c2UgemVybyBmb3IgYHlNYXgnIHBhcmFtZXRlciAqLwotICAgICAgICBUVF9HZXRfVk1ldHJpY3MoIGZhY2UsIHN0YXJ0ICsgbm4sIDAsICZ0c2IsICZhaCApOwotICAgICAgICBhZHZhbmNlc1tubl0gPSBhaDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgICAvKiBubyBmYXN0IHJldHJpZXZhbCBmb3IgYmxlbmRlZCBNTSBmb250cyB3aXRob3V0IEhWQVIgdGFibGUgKi8KLSAgICAgIGlmICggIWZhY2UtPmlzX2RlZmF1bHRfaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgISggZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgJiBUVF9GQUNFX0ZMQUdfVkFSX0hBRFZBTkNFICkgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotI2VuZGlmCi0KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1Nob3J0ICAgbHNiOwotICAgICAgICBGVF9VU2hvcnQgIGF3OwotCi0KLSAgICAgICAgVFRfR2V0X0hNZXRyaWNzKCBmYWNlLCBzdGFydCArIG5uLCAmbHNiLCAmYXcgKTsKLSAgICAgICAgYWR2YW5jZXNbbm5dID0gYXc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgSSBaIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2l6ZV9zZWxlY3QoIEZUX1NpemUgICBzaXplLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHN0cmlrZV9pbmRleCApCi0gIHsKLSAgICBUVF9GYWNlICAgdHRmYWNlID0gKFRUX0ZhY2Upc2l6ZS0+ZmFjZTsKLSAgICBUVF9TaXplICAgdHRzaXplID0gKFRUX1NpemUpc2l6ZTsKLSAgICBGVF9FcnJvciAgZXJyb3IgID0gRlRfRXJyX09rOwotCi0KLSAgICB0dHNpemUtPnN0cmlrZV9pbmRleCA9IHN0cmlrZV9pbmRleDsKLQotICAgIGlmICggRlRfSVNfU0NBTEFCTEUoIHNpemUtPmZhY2UgKSApCi0gICAgewotICAgICAgLyogdXNlIHRoZSBzY2FsZWQgbWV0cmljcywgZXZlbiB3aGVuIHR0X3NpemVfcmVzZXQgZmFpbHMgKi8KLSAgICAgIEZUX1NlbGVjdF9NZXRyaWNzKCBzaXplLT5mYWNlLCBzdHJpa2VfaW5kZXggKTsKLQotICAgICAgdHRfc2l6ZV9yZXNldCggdHRzaXplLCAwICk7IC8qIGlnbm9yZSByZXR1cm4gdmFsdWUgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFNGTlRfU2VydmljZSAgICAgIHNmbnQgICAgICAgICA9IChTRk5UX1NlcnZpY2UpdHRmYWNlLT5zZm50OwotICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgc2l6ZV9tZXRyaWNzID0gJnNpemUtPm1ldHJpY3M7Ci0KLQotICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX3N0cmlrZV9tZXRyaWNzKCB0dGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9tZXRyaWNzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgdHRzaXplLT5zdHJpa2VfaW5kZXggPSAweEZGRkZGRkZGVUw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zaXplX3JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApCi0gIHsKLSAgICBUVF9TaXplICAgdHRzaXplID0gKFRUX1NpemUpc2l6ZTsKLSAgICBGVF9FcnJvciAgZXJyb3IgID0gRlRfRXJyX09rOwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICAgIGlmICggRlRfSEFTX0ZJWEVEX1NJWkVTKCBzaXplLT5mYWNlICkgKQotICAgIHsKLSAgICAgIFRUX0ZhY2UgICAgICAgdHRmYWNlID0gKFRUX0ZhY2Upc2l6ZS0+ZmFjZTsKLSAgICAgIFNGTlRfU2VydmljZSAgc2ZudCAgID0gKFNGTlRfU2VydmljZSl0dGZhY2UtPnNmbnQ7Ci0gICAgICBGVF9VTG9uZyAgICAgIHN0cmlrZV9pbmRleDsKLQotCi0gICAgICBlcnJvciA9IHNmbnQtPnNldF9zYml0X3N0cmlrZSggdHRmYWNlLCByZXEsICZzdHJpa2VfaW5kZXggKTsKLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHR0c2l6ZS0+c3RyaWtlX2luZGV4ID0gMHhGRkZGRkZGRlVMOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gdHRfc2l6ZV9zZWxlY3QoIHNpemUsIHN0cmlrZV9pbmRleCApOwotICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAqLwotCi0gICAgRlRfUmVxdWVzdF9NZXRyaWNzKCBzaXplLT5mYWNlLCByZXEgKTsKLQotICAgIGlmICggRlRfSVNfU0NBTEFCTEUoIHNpemUtPmZhY2UgKSApCi0gICAgewotICAgICAgZXJyb3IgPSB0dF9zaXplX3Jlc2V0KCB0dHNpemUsIDAgKTsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotICAgICAgLyogZm9yIHRoZSBgTVBTJyBieXRlY29kZSBpbnN0cnVjdGlvbiB3ZSBuZWVkIHRoZSBwb2ludCBzaXplICovCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIHJlc29sdXRpb24gPQotICAgICAgICAgICAgICAgICAgIHR0c2l6ZS0+bWV0cmljcy0+eF9wcGVtID4gdHRzaXplLT5tZXRyaWNzLT55X3BwZW0KLSAgICAgICAgICAgICAgICAgICAgID8gcmVxLT5ob3JpUmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgICAgOiByZXEtPnZlcnRSZXNvbHV0aW9uOwotCi0KLSAgICAgICAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIHJlc29sdXRpb24gdmFsdWUsIGFzc3VtZSA3MmRwaSAqLwotICAgICAgICBpZiAoIHJlcS0+dHlwZSA9PSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9TQ0FMRVMgfHwKLSAgICAgICAgICAgICAhcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICByZXNvbHV0aW9uID0gNzI7Ci0KLSAgICAgICAgdHRzaXplLT5wb2ludF9zaXplID0gRlRfTXVsRGl2KCB0dHNpemUtPnR0bWV0cmljcy5wcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogNzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiApOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nbHlwaF9sb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBsb2FkIGEgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQsIGxvYWRlZCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9nbHlwaF9sb2FkKCBGVF9HbHlwaFNsb3QgIHR0c2xvdCwgICAgICAvKiBUVF9HbHlwaFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICB0dHNpemUsICAgICAgLyogVFRfU2l6ZSAgICAgICovCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBUVF9HbHlwaFNsb3QgIHNsb3QgPSAoVFRfR2x5cGhTbG90KXR0c2xvdDsKLSAgICBUVF9TaXplICAgICAgIHNpemUgPSAoVFRfU2l6ZSl0dHNpemU7Ci0gICAgRlRfRmFjZSAgICAgICBmYWNlID0gdHRzbG90LT5mYWNlOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIXNsb3QgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1Nsb3RfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFzaXplICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TaXplX0hhbmRsZSApOwotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgJiYKLSAgICAgICAgICFmYWNlLT5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICAgKQotI2Vsc2UKLSAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQotI2VuZGlmCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApCi0gICAgewotICAgICAgLyogYm90aCBGVF9MT0FEX05PX0hJTlRJTkcgYW5kIEZUX0xPQURfTk9fQVVUT0hJTlQgICAqLwotICAgICAgLyogYXJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIGhpbnRpbmcgZm9yIHRyaWNreSBmb250cyAqLwotCi0gICAgICBpZiAoIEZUX0lTX1RSSUNLWSggZmFjZSApICkKLSAgICAgICAgbG9hZF9mbGFncyAmPSB+RlRfTE9BRF9OT19ISU5USU5HOwotCi0gICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0FVVE9ISU5UICkKLSAgICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkc7Ci0gICAgfQotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgKCBGVF9MT0FEX05PX1JFQ1VSU0UgfCBGVF9MT0FEX05PX1NDQUxFICkgKQotICAgIHsKLSAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19CSVRNQVAgfCBGVF9MT0FEX05PX1NDQUxFOwotCi0gICAgICBpZiAoICFGVF9JU19UUklDS1koIGZhY2UgKSApCi0gICAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOwotICAgIH0KLQotICAgIC8qIHVzZSBoaW50ZWQgbWV0cmljcyBvbmx5IGlmIHdlIGxvYWQgYSBnbHlwaCB3aXRoIGhpbnRpbmcgKi8KLSAgICBzaXplLT5tZXRyaWNzID0gKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HICkKLSAgICAgICAgICAgICAgICAgICAgICA/ICZ0dHNpemUtPm1ldHJpY3MKLSAgICAgICAgICAgICAgICAgICAgICA6ICZzaXplLT5oaW50ZWRfbWV0cmljczsKLQotICAgIC8qIG5vdyBsb2FkIHRoZSBnbHlwaCBvdXRsaW5lIGlmIG5lY2Vzc2FyeSAqLwotICAgIGVycm9yID0gVFRfTG9hZF9HbHlwaCggc2l6ZSwgc2xvdCwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MgKTsKLQotICAgIC8qIGZvcmNlIGRyb3Atb3V0IG1vZGUgdG8gMiAtIGlycmVsZXZhbnQgbm93ICovCi0gICAgLyogc2xvdC0+b3V0bGluZS5kcm9wb3V0X21vZGUgPSAyOyAqLwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgIEQgUiBJIFYgRSBSICBJIE4gVCBFIFIgRiBBIEMgRSAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0VfTVVMVElNQVNURVJTUkVDKAotICAgIHR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycywKLQotICAgIChGVF9HZXRfTU1fRnVuYykgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIGdldF9tbSAgICAgICAgICovCi0gICAgKEZUX1NldF9NTV9EZXNpZ25fRnVuYykgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogc2V0X21tX2Rlc2lnbiAgKi8KLSAgICAoRlRfU2V0X01NX0JsZW5kX0Z1bmMpICBUVF9TZXRfTU1fQmxlbmQsICAgICAgICAvKiBzZXRfbW1fYmxlbmQgICAqLwotICAgIChGVF9HZXRfTU1fQmxlbmRfRnVuYykgIFRUX0dldF9NTV9CbGVuZCwgICAgICAgIC8qIGdldF9tbV9ibGVuZCAgICovCi0gICAgKEZUX0dldF9NTV9WYXJfRnVuYykgICAgVFRfR2V0X01NX1ZhciwgICAgICAgICAgLyogZ2V0X21tX3ZhciAgICAgKi8KLSAgICAoRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYylUVF9TZXRfVmFyX0Rlc2lnbiwgICAgICAvKiBzZXRfdmFyX2Rlc2lnbiAqLwotICAgIChGVF9HZXRfVmFyX0Rlc2lnbl9GdW5jKVRUX0dldF9WYXJfRGVzaWduLCAgICAgIC8qIGdldF92YXJfZGVzaWduICovCi0KLSAgICAoRlRfR2V0X1Zhcl9CbGVuZF9GdW5jKSB0dF9nZXRfdmFyX2JsZW5kLCAgICAgICAvKiBnZXRfdmFyX2JsZW5kICAqLwotICAgIChGVF9Eb25lX0JsZW5kX0Z1bmMpICAgIHR0X2RvbmVfYmxlbmQgICAgICAgICAgIC8qIGRvbmVfYmxlbmQgICAgICovCi0gICkKLQotICBGVF9ERUZJTkVfU0VSVklDRV9NRVRSSUNTVkFSSUFUSU9OU1JFQygKLSAgICB0dF9zZXJ2aWNlX21ldHJpY3NfdmFyaWF0aW9ucywKLQotICAgIChGVF9IQWR2YW5jZV9BZGp1c3RfRnVuYyl0dF9oYWR2YW5jZV9hZGp1c3QsICAgICAvKiBoYWR2YW5jZV9hZGp1c3QgKi8KLSAgICAoRlRfTFNCX0FkanVzdF9GdW5jKSAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogbHNiX2FkanVzdCAgICAgICovCi0gICAgKEZUX1JTQl9BZGp1c3RfRnVuYykgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIHJzYl9hZGp1c3QgICAgICAqLwotCi0gICAgKEZUX1ZBZHZhbmNlX0FkanVzdF9GdW5jKXR0X3ZhZHZhbmNlX2FkanVzdCwgICAgIC8qIHZhZHZhbmNlX2FkanVzdCAqLwotICAgIChGVF9UU0JfQWRqdXN0X0Z1bmMpICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiB0c2JfYWRqdXN0ICAgICAgKi8KLSAgICAoRlRfQlNCX0FkanVzdF9GdW5jKSAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogYnNiX2FkanVzdCAgICAgICovCi0gICAgKEZUX1ZPcmdfQWRqdXN0X0Z1bmMpICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIHZvcmdfYWRqdXN0ICAgICAqLwotCi0gICAgKEZUX01ldHJpY3NfQWRqdXN0X0Z1bmMpIHR0X2FwcGx5X212YXIgICAgICAgICAgIC8qIG1ldHJpY3NfYWRqdXN0ICAqLwotICApCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUICovCi0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9UcnVlVHlwZUVuZ2luZVJlYyAgdHRfc2VydmljZV90cnVldHlwZV9lbmdpbmUgPQotICB7Ci0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9QQVRFTlRFRAotCi0jZWxzZSAvKiAhVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9OT05FCi0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLSAgfTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX1RUR0xZRlJFQygKLSAgICB0dF9zZXJ2aWNlX3RydWV0eXBlX2dseWYsCi0KLSAgICAoVFRfR2x5Zl9HZXRMb2NhdGlvbkZ1bmMpdHRfZmFjZV9nZXRfbG9jYXRpb24gICAgICAvKiBnZXRfbG9jYXRpb24gKi8KLSAgKQotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzYoCi0gICAgdHRfc2VydmljZXMsCi0KLSAgICBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgICAgRlRfRk9OVF9GT1JNQVRfVFJVRVRZUEUsCi0gICAgRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTLCAgICAgICZUVF9TRVJWSUNFX0dYX01VTFRJX01BU1RFUlNfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfTUVUUklDU19WQVJJQVRJT05TLCAmVFRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFJVRVRZUEVfRU5HSU5FLCAgICAmdHRfc2VydmljZV90cnVldHlwZV9lbmdpbmUsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9HTFlGLCAgICAgICAgICAgICZUVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAgICAmVFRfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCApCi0jZWxzZQotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KAotICAgIHR0X3NlcnZpY2VzLAotCi0gICAgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCwgICAgIEZUX0ZPTlRfRk9STUFUX1RSVUVUWVBFLAotICAgIEZUX1NFUlZJQ0VfSURfVFJVRVRZUEVfRU5HSU5FLCAmdHRfc2VydmljZV90cnVldHlwZV9lbmdpbmUsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9HTFlGLCAgICAgICAgICZUVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAmVFRfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCApCi0jZW5kaWYKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfTW9kdWxlX0ludGVyZmFjZSApCi0gIHR0X2dldF9pbnRlcmZhY2UoIEZUX01vZHVsZSAgICBkcml2ZXIsICAgIC8qIFRUX0RyaXZlciAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgdHRfaW50ZXJmYWNlICkKLSAgewotICAgIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnk7Ci0gICAgRlRfTW9kdWxlX0ludGVyZmFjZSAgcmVzdWx0OwotICAgIEZUX01vZHVsZSAgICAgICAgICAgIHNmbnRkOwotICAgIFNGTlRfU2VydmljZSAgICAgICAgIHNmbnQ7Ci0KLQotICAgIC8qIFRUX1NFUlZJQ0VTX0dFVCBkZXJlZmVyZW5jZXMgYGxpYnJhcnknIGluIFBJQyBtb2RlICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICBpZiAoICFkcml2ZXIgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgbGlicmFyeSA9IGRyaXZlci0+bGlicmFyeTsKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0KLSAgICByZXN1bHQgPSBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBUVF9TRVJWSUNFU19HRVQsIHR0X2ludGVyZmFjZSApOwotICAgIGlmICggcmVzdWx0ICkKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICBpZiAoICFkcml2ZXIgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgbGlicmFyeSA9IGRyaXZlci0+bGlicmFyeTsKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0KLSAgICAvKiBvbmx5IHJldHVybiB0aGUgZGVmYXVsdCBpbnRlcmZhY2UgZnJvbSB0aGUgU0ZOVCBtb2R1bGUgKi8KLSAgICBzZm50ZCA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJzZm50IiApOwotICAgIGlmICggc2ZudGQgKQotICAgIHsKLSAgICAgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKSggc2ZudGQtPmNsYXp6LT5tb2R1bGVfaW50ZXJmYWNlICk7Ci0gICAgICBpZiAoIHNmbnQgKQotICAgICAgICByZXR1cm4gc2ZudC0+Z2V0X2ludGVyZmFjZSggZHJpdmVyLCB0dF9pbnRlcmZhY2UgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogVGhlIEZUX0RyaXZlckludGVyZmFjZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBmdGRyaXZlci5oLiAqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0jZGVmaW5lIFRUX0hJTlRFUl9GTEFHICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIKLSNlbHNlCi0jZGVmaW5lIFRUX0hJTlRFUl9GTEFHICAwCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotI2RlZmluZSBUVF9TSVpFX1NFTEVDVCAgdHRfc2l6ZV9zZWxlY3QKLSNlbHNlCi0jZGVmaW5lIFRUX1NJWkVfU0VMRUNUICAwCi0jZW5kaWYKLQotICBGVF9ERUZJTkVfRFJJVkVSKAotICAgIHR0X2RyaXZlcl9jbGFzcywKLQotICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX1NDQUxBQkxFIHwKLSAgICAgIFRUX0hJTlRFUl9GTEFHLAotCi0gICAgICBzaXplb2YgKCBUVF9Ecml2ZXJSZWMgKSwKLQotICAgICAgInRydWV0eXBlIiwgICAgICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAweDEwMDAwTCwgICAgICAgIC8qIGRyaXZlciB2ZXJzaW9uID09IDEuMCAgICAgICAgICAgICAgICAgKi8KLSAgICAgIDB4MjAwMDBMLCAgICAgICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBhYm92ZSAqLwotCi0gICAgICBOVUxMLCAgICAvKiBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIHR0X2RyaXZlcl9pbml0LCAgICAgICAgICAgLyogRlRfTW9kdWxlX0NvbnN0cnVjdG9yICBtb2R1bGVfaW5pdCAgICovCi0gICAgICB0dF9kcml2ZXJfZG9uZSwgICAgICAgICAgIC8qIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgbW9kdWxlX2RvbmUgICAqLwotICAgICAgdHRfZ2V0X2ludGVyZmFjZSwgICAgICAgICAvKiBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgIGdldF9pbnRlcmZhY2UgKi8KLQotICAgIHNpemVvZiAoIFRUX0ZhY2VSZWMgKSwKLSAgICBzaXplb2YgKCBUVF9TaXplUmVjICksCi0gICAgc2l6ZW9mICggRlRfR2x5cGhTbG90UmVjICksCi0KLSAgICB0dF9mYWNlX2luaXQsICAgICAgICAgICAgICAgLyogRlRfRmFjZV9Jbml0RnVuYyAgaW5pdF9mYWNlICovCi0gICAgdHRfZmFjZV9kb25lLCAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfRG9uZUZ1bmMgIGRvbmVfZmFjZSAqLwotICAgIHR0X3NpemVfaW5pdCwgICAgICAgICAgICAgICAvKiBGVF9TaXplX0luaXRGdW5jICBpbml0X3NpemUgKi8KLSAgICB0dF9zaXplX2RvbmUsICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9Eb25lRnVuYyAgZG9uZV9zaXplICovCi0gICAgdHRfc2xvdF9pbml0LCAgICAgICAgICAgICAgIC8qIEZUX1Nsb3RfSW5pdEZ1bmMgIGluaXRfc2xvdCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TbG90X0RvbmVGdW5jICBkb25lX3Nsb3QgKi8KLQotICAgIHR0X2dseXBoX2xvYWQsICAgICAgICAgICAgICAvKiBGVF9TbG90X0xvYWRGdW5jICBsb2FkX2dseXBoICovCi0KLSAgICB0dF9nZXRfa2VybmluZywgICAgICAgICAgICAgLyogRlRfRmFjZV9HZXRLZXJuaW5nRnVuYyAgIGdldF9rZXJuaW5nICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0F0dGFjaEZ1bmMgICAgICAgYXR0YWNoX2ZpbGUgICovCi0gICAgdHRfZ2V0X2FkdmFuY2VzLCAgICAgICAgICAgIC8qIEZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jICBnZXRfYWR2YW5jZXMgKi8KLQotICAgIHR0X3NpemVfcmVxdWVzdCwgICAgICAgICAgICAvKiBGVF9TaXplX1JlcXVlc3RGdW5jICByZXF1ZXN0X3NpemUgKi8KLSAgICBUVF9TSVpFX1NFTEVDVCAgICAgICAgICAgICAgLyogRlRfU2l6ZV9TZWxlY3RGdW5jICAgc2VsZWN0X3NpemUgICovCi0gICkKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGRyaXZlci5oIGIvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2JhN2YuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGRyaXZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBUcnVlVHlwZSBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVFREUklWRVJfSF8KLSNkZWZpbmUgVFREUklWRVJfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9ERUNMQVJFX0RSSVZFUiggdHRfZHJpdmVyX2NsYXNzICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBUVERSSVZFUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0ZXJyb3JzLmggYi9zcmMvdHJ1ZXR5cGUvdHRlcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5ZjIwNS4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRlcnJvcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0ZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgVHJ1ZVR5cGUgZXJyb3IgZW51bWVyYXRpb24gICAgICAgICAgICAqLwotICAvKiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFRURVJST1JTX0hfCi0jZGVmaW5lIFRURVJST1JTX0hfCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgRlRFUlJPUlNfSF8KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIFRUX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9UcnVlVHlwZQotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogVFRFUlJPUlNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGdsb2FkLmMgYi9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTM1MWU3Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dGdsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Z2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9MSVNUX0gKLQotI2luY2x1ZGUgInR0Z2xvYWQuaCIKLSNpbmNsdWRlICJ0dHBsb2FkLmgiCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSAidHRneHZhci5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotI2luY2x1ZGUgInR0c3VicGl4LmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dGdsb2FkCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENvbXBvc2l0ZSBnbHlwaCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQVJHU19BUkVfV09SRFMgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEFSR1NfQVJFX1hZX1ZBTFVFUyAgICAgICAgIDB4MDAwMgotI2RlZmluZSBST1VORF9YWV9UT19HUklEICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgV0VfSEFWRV9BX1NDQUxFICAgICAgICAgICAgMHgwMDA4Ci0vKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAqLwotI2RlZmluZSBNT1JFX0NPTVBPTkVOVFMgICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgV0VfSEFWRV9BTl9YWV9TQ0FMRSAgICAgICAgMHgwMDQwCi0jZGVmaW5lIFdFX0hBVkVfQV8yWDIgICAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBXRV9IQVZFX0lOU1RSICAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgVVNFX01ZX01FVFJJQ1MgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIE9WRVJMQVBfQ09NUE9VTkQgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBTQ0FMRURfQ09NUE9ORU5UX09GRlNFVCAgICAweDA4MDAKLSNkZWZpbmUgVU5TQ0FMRURfQ09NUE9ORU5UX09GRlNFVCAgMHgxMDAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJldHVybiB0aGUgaG9yaXpvbnRhbCBtZXRyaWNzIGluIGZvbnQgdW5pdHMgZm9yIGEgZ2l2ZW4gZ2x5cGguICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVFRfR2V0X0hNZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICBsc2IsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgYXcgKQotICB7Ci0gICAgKCAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQgKS0+Z2V0X21ldHJpY3MoIGZhY2UsIDAsIGlkeCwgbHNiLCBhdyApOwotCi0gICAgRlRfVFJBQ0U1KCggIiAgYWR2YW5jZSB3aWR0aCAoZm9udCB1bml0cyk6ICVkXG4iLCAqYXcgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgbGVmdCBzaWRlIGJlYXJpbmcgKGZvbnQgdW5pdHMpOiAlZFxuIiwgKmxzYiApKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSZXR1cm4gdGhlIHZlcnRpY2FsIG1ldHJpY3MgaW4gZm9udCB1bml0cyBmb3IgYSBnaXZlbiBnbHlwaC4gICAgICAgICAgKi8KLSAgLyogU2VlIG1hY3JvIGBUVF9MT0FERVJfU0VUX1BQJyBiZWxvdyBmb3IgZXhwbGFuYXRpb25zLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUVF9HZXRfVk1ldHJpY3MoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHlNYXgsCi0gICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICAgdHNiLAotICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIGFoICkKLSAgewotICAgIGlmICggZmFjZS0+dmVydGljYWxfaW5mbyApCi0gICAgICAoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMSwgaWR4LCB0c2IsIGFoICk7Ci0KLSAgICBlbHNlIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGVSApCi0gICAgewotICAgICAgKnRzYiA9IChGVF9TaG9ydCkoIGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyIC0geU1heCApOwotICAgICAgKmFoICA9IChGVF9VU2hvcnQpRlRfQUJTKCBmYWNlLT5vczIuc1R5cG9Bc2NlbmRlciAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlciApOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAqdHNiID0gKEZUX1Nob3J0KSggZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlciAtIHlNYXggKTsKLSAgICAgICphaCAgPSAoRlRfVVNob3J0KUZUX0FCUyggZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlciAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyICk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIiAgYWR2YW5jZSBoZWlnaHQgKGZvbnQgdW5pdHMpOiAlZFxuIiwgKmFoICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHRvcCBzaWRlIGJlYXJpbmcgKGZvbnQgdW5pdHMpOiAlZFxuIiwgKnRzYiApKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X2dldF9tZXRyaWNzKCBUVF9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXggKQotICB7Ci0gICAgVFRfRmFjZSAgICBmYWNlICAgPSBsb2FkZXItPmZhY2U7Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKLSNlbmRpZgotCi0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGxvYWRlci0+c3RyZWFtOwotCi0gICAgRlRfU2hvcnQgICBsZWZ0X2JlYXJpbmcgPSAwLCB0b3BfYmVhcmluZyA9IDA7Ci0gICAgRlRfVVNob3J0ICBhZHZhbmNlX3dpZHRoID0gMCwgYWR2YW5jZV9oZWlnaHQgPSAwOwotCi0gICAgLyogd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgc3RyZWFtIHBvc2l0aW9uICAgICAgICAgICovCi0gICAgLyogKHdoaWNoIGdldHMgYWx0ZXJlZCBieSB0aGUgbWV0cmljcyBmdW5jdGlvbnMpICovCi0gICAgRlRfVUxvbmcgIHBvcyA9IEZUX1NUUkVBTV9QT1MoKTsKLQotCi0gICAgVFRfR2V0X0hNZXRyaWNzKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICZsZWZ0X2JlYXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAmYWR2YW5jZV93aWR0aCApOwotICAgIFRUX0dldF9WTWV0cmljcyggZmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmJib3gueU1heCwKLSAgICAgICAgICAgICAgICAgICAgICZ0b3BfYmVhcmluZywKLSAgICAgICAgICAgICAgICAgICAgICZhZHZhbmNlX2hlaWdodCApOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggcG9zICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgbG9hZGVyLT5sZWZ0X2JlYXJpbmcgPSBsZWZ0X2JlYXJpbmc7Ci0gICAgbG9hZGVyLT5hZHZhbmNlICAgICAgPSBhZHZhbmNlX3dpZHRoOwotICAgIGxvYWRlci0+dG9wX2JlYXJpbmcgID0gdG9wX2JlYXJpbmc7Ci0gICAgbG9hZGVyLT52YWR2YW5jZSAgICAgPSBhZHZhbmNlX2hlaWdodDsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgaWYgKCBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCAmJgotICAgICAgICAgbG9hZGVyLT5leGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgIGxvYWRlci0+ZXhlYy0+c3BoX3R3ZWFrX2ZsYWdzID0gMDsKLQotICAgICAgLyogVGhpcyBtYXkgbm90IGJlIHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcywgYnV0IGl0IHdvcmtzLi4uICAqLwotICAgICAgLyogTm90ZSB0aGF0IHdlIGhhdmUgdG8gdW5jb25kaXRpb25hbGx5IGxvYWQgdGhlIHR3ZWFrcyBzaW5jZSAqLwotICAgICAgLyogaXQgaXMgcG9zc2libGUgdGhhdCBnbHlwaHMgaW5kaXZpZHVhbGx5IHN3aXRjaCBDbGVhclR5cGUncyAqLwotICAgICAgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlIG9uIGFuZCBvZmYuICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgc3BoX3NldF90d2Vha3MoIGxvYWRlciwgZ2x5cGhfaW5kZXggKTsKLSAgICB9Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIGlmICggIWxvYWRlci0+bGluZWFyX2RlZiApCi0gICAgewotICAgICAgbG9hZGVyLT5saW5lYXJfZGVmID0gMTsKLSAgICAgIGxvYWRlci0+bGluZWFyICAgICA9IGFkdmFuY2Vfd2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0KLSAgc3RhdGljIHZvaWQKLSAgdHRfZ2V0X21ldHJpY3NfaW5jcl9vdmVycmlkZXMoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCApCi0gIHsKLSAgICBUVF9GYWNlICBmYWNlID0gbG9hZGVyLT5mYWNlOwotCi0gICAgRlRfU2hvcnQgICBsZWZ0X2JlYXJpbmcgPSAwLCB0b3BfYmVhcmluZyA9IDA7Ci0gICAgRlRfVVNob3J0ICBhZHZhbmNlX3dpZHRoID0gMCwgYWR2YW5jZV9oZWlnaHQgPSAwOwotCi0KLSAgICAvKiBJZiB0aGlzIGlzIGFuIGluY3JlbWVudGFsbHkgbG9hZGVkIGZvbnQgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgKi8KLSAgICAvKiBvdmVycmlkaW5nIG1ldHJpY3MgZm9yIHRoaXMgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcyApCi0gICAgewotICAgICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYyAgaW5jcl9tZXRyaWNzOwotICAgICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgZXJyb3I7Ci0KLQotICAgICAgaW5jcl9tZXRyaWNzLmJlYXJpbmdfeCA9IGxvYWRlci0+bGVmdF9iZWFyaW5nOwotICAgICAgaW5jcl9tZXRyaWNzLmJlYXJpbmdfeSA9IDA7Ci0gICAgICBpbmNyX21ldHJpY3MuYWR2YW5jZSAgID0gbG9hZGVyLT5hZHZhbmNlOwotICAgICAgaW5jcl9tZXRyaWNzLmFkdmFuY2VfdiA9IDA7Ci0KLSAgICAgIGVycm9yID0gZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5mdW5jcy0+Z2V0X2dseXBoX21ldHJpY3MoCi0gICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5vYmplY3QsCi0gICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsIEZBTFNFLCAmaW5jcl9tZXRyaWNzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBsZWZ0X2JlYXJpbmcgID0gKEZUX1Nob3J0KWluY3JfbWV0cmljcy5iZWFyaW5nX3g7Ci0gICAgICBhZHZhbmNlX3dpZHRoID0gKEZUX1VTaG9ydClpbmNyX21ldHJpY3MuYWR2YW5jZTsKLQotI2lmIDAKLQotICAgICAgLyogR1dXOiBEbyBJIGRvIHRoZSBzYW1lIGZvciB2ZXJ0aWNhbCBtZXRyaWNzPyAqLwotICAgICAgaW5jcl9tZXRyaWNzLmJlYXJpbmdfeCA9IDA7Ci0gICAgICBpbmNyX21ldHJpY3MuYmVhcmluZ195ID0gbG9hZGVyLT50b3BfYmVhcmluZzsKLSAgICAgIGluY3JfbWV0cmljcy5hZHZhbmNlICAgPSBsb2FkZXItPnZhZHZhbmNlOwotCi0gICAgICBlcnJvciA9IGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzKAotICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBUUlVFLCAmaW5jcl9tZXRyaWNzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICB0b3BfYmVhcmluZyAgICA9IChGVF9TaG9ydClpbmNyX21ldHJpY3MuYmVhcmluZ195OwotICAgICAgYWR2YW5jZV9oZWlnaHQgPSAoRlRfVVNob3J0KWluY3JfbWV0cmljcy5hZHZhbmNlOwotCi0jZW5kaWYgLyogMCAqLwotCi0gICAgICBsb2FkZXItPmxlZnRfYmVhcmluZyA9IGxlZnRfYmVhcmluZzsKLSAgICAgIGxvYWRlci0+YWR2YW5jZSAgICAgID0gYWR2YW5jZV93aWR0aDsKLSAgICAgIGxvYWRlci0+dG9wX2JlYXJpbmcgID0gdG9wX2JlYXJpbmc7Ci0gICAgICBsb2FkZXItPnZhZHZhbmNlICAgICA9IGFkdmFuY2VfaGVpZ2h0OwotCi0gICAgICBpZiAoICFsb2FkZXItPmxpbmVhcl9kZWYgKQotICAgICAgewotICAgICAgICBsb2FkZXItPmxpbmVhcl9kZWYgPSAxOwotICAgICAgICBsb2FkZXItPmxpbmVhciAgICAgPSBhZHZhbmNlX3dpZHRoOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybjsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSBkZWZhdWx0IHdpdGggVHJ1ZVR5cGUgZm9udHMuICAgICAgKi8KLSAgLyogSG93ZXZlciwgdGhleSBjYW4gYmUgcmVwbGFjZWQgYnkgYWx0ZXJuYXRpdmVzIGlmIHdlIG5lZWQgdG8gc3VwcG9ydCAgICovCi0gIC8qIFRydWVUeXBlLWNvbXByZXNzZWQgZm9ybWF0cyAobGlrZSBNaWNyb1R5cGUpIGluIHRoZSBmdXR1cmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIFRUX0FjY2Vzc19HbHlwaF9GcmFtZSggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGJ5dGVfY291bnQgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGxvYWRlci0+c3RyZWFtOwotCi0gICAgLyogZm9yIG5vbi1kZWJ1ZyBtb2RlICovCi0gICAgRlRfVU5VU0VEKCBnbHlwaF9pbmRleCApOwotCi0KLSAgICBGVF9UUkFDRTQoKCAiR2x5cGggJWxkXG4iLCBnbHlwaF9pbmRleCApKTsKLQotICAgIC8qIHRoZSBmb2xsb3dpbmcgbGluZSBzZXRzIHRoZSBgZXJyb3InIHZhcmlhYmxlIHRocm91Z2ggbWFjcm9zISAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG9mZnNldCApIHx8IEZUX0ZSQU1FX0VOVEVSKCBieXRlX2NvdW50ICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgbG9hZGVyLT5jdXJzb3IgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBsb2FkZXItPmxpbWl0ICA9IHN0cmVhbS0+bGltaXQ7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBUVF9Gb3JnZXRfR2x5cGhfRnJhbWUoIFRUX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gbG9hZGVyLT5zdHJlYW07Ci0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIFRUX0xvYWRfR2x5cGhfSGVhZGVyKCBUVF9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCAgICAgPSBsb2FkZXItPmN1cnNvcjsKLSAgICBGVF9CeXRlKiAgbGltaXQgPSBsb2FkZXItPmxpbWl0OwotCi0KLSAgICBpZiAoIHAgKyAxMCA+IGxpbWl0ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICBsb2FkZXItPm5fY29udG91cnMgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0KLSAgICBsb2FkZXItPmJib3gueE1pbiA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLSAgICBsb2FkZXItPmJib3gueU1pbiA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLSAgICBsb2FkZXItPmJib3gueE1heCA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLSAgICBsb2FkZXItPmJib3gueU1heCA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLQotICAgIEZUX1RSQUNFNSgoICIgICMgb2YgY29udG91cnM6ICVkXG4iLCBsb2FkZXItPm5fY29udG91cnMgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeE1pbjogJTRkICB4TWF4OiAlNGRcbiIsIGxvYWRlci0+YmJveC54TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmJib3gueE1heCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICB5TWluOiAlNGQgIHlNYXg6ICU0ZFxuIiwgbG9hZGVyLT5iYm94LnlNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+YmJveC55TWF4ICkpOwotICAgIGxvYWRlci0+Y3Vyc29yID0gcDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUVF9Mb2FkX1NpbXBsZV9HbHlwaCggVFRfTG9hZGVyICBsb2FkICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKLSAgICBGVF9CeXRlKiAgICAgICAgcCAgICAgICAgICA9IGxvYWQtPmN1cnNvcjsKLSAgICBGVF9CeXRlKiAgICAgICAgbGltaXQgICAgICA9IGxvYWQtPmxpbWl0OwotICAgIEZUX0dseXBoTG9hZGVyICBnbG9hZGVyICAgID0gbG9hZC0+Z2xvYWRlcjsKLSAgICBGVF9JbnQgICAgICAgICAgbl9jb250b3VycyA9IGxvYWQtPm5fY29udG91cnM7Ci0gICAgRlRfT3V0bGluZSogICAgIG91dGxpbmU7Ci0gICAgRlRfVVNob3J0ICAgICAgIG5faW5zOwotICAgIEZUX0ludCAgICAgICAgICBuX3BvaW50czsKLQotICAgIEZUX0J5dGUgICAgICAgICAqZmxhZywgKmZsYWdfbGltaXQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgIGMsIGNvdW50OwotICAgIEZUX1ZlY3RvciAgICAgICAqdmVjLCAqdmVjX2xpbWl0OwotICAgIEZUX1BvcyAgICAgICAgICB4OwotICAgIEZUX1Nob3J0ICAgICAgICAqY29udCwgKmNvbnRfbGltaXQsIHByZXZfY29udDsKLSAgICBGVF9JbnQgICAgICAgICAgeHlfc2l6ZSA9IDA7Ci0KLQotICAgIC8qIGNoZWNrIHRoYXQgd2UgY2FuIGFkZCB0aGUgY29udG91cnMgdG8gdGhlIGdseXBoICovCi0gICAgZXJyb3IgPSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGdsb2FkZXIsIDAsIG5fY29udG91cnMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIHJlYWRpbmcgdGhlIGNvbnRvdXJzJyBlbmRwb2ludHMgJiBudW1iZXIgb2YgcG9pbnRzICovCi0gICAgY29udCAgICAgICA9IGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5jb250b3VyczsKLSAgICBjb250X2xpbWl0ID0gY29udCArIG5fY29udG91cnM7Ci0KLSAgICAvKiBjaGVjayBzcGFjZSBmb3IgY29udG91cnMgYXJyYXkgKyBpbnN0cnVjdGlvbnMgY291bnQgKi8KLSAgICBpZiAoIG5fY29udG91cnMgPj0gMHhGRkYgfHwgcCArICggbl9jb250b3VycyArIDEgKSAqIDIgPiBsaW1pdCApCi0gICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgIHByZXZfY29udCA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLQotICAgIGlmICggbl9jb250b3VycyA+IDAgKQotICAgICAgY29udFswXSA9IHByZXZfY29udDsKLQotICAgIGlmICggcHJldl9jb250IDwgMCApCi0gICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgIGZvciAoIGNvbnQrKzsgY29udCA8IGNvbnRfbGltaXQ7IGNvbnQrKyApCi0gICAgewotICAgICAgY29udFswXSA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgIGlmICggY29udFswXSA8PSBwcmV2X2NvbnQgKQotICAgICAgewotICAgICAgICAvKiB1bm9yZGVyZWQgY29udG91cnM6IHRoaXMgaXMgaW52YWxpZCAqLwotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLSAgICAgIH0KLSAgICAgIHByZXZfY29udCA9IGNvbnRbMF07Ci0gICAgfQotCi0gICAgbl9wb2ludHMgPSAwOwotICAgIGlmICggbl9jb250b3VycyA+IDAgKQotICAgIHsKLSAgICAgIG5fcG9pbnRzID0gY29udFstMV0gKyAxOwotICAgICAgaWYgKCBuX3BvaW50cyA8IDAgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLSAgICB9Ci0KLSAgICAvKiBub3RlIHRoYXQgd2Ugd2lsbCBhZGQgZm91ciBwaGFudG9tIHBvaW50cyBsYXRlciAqLwotICAgIGVycm9yID0gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBnbG9hZGVyLCBuX3BvaW50cyArIDQsIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIHJlYWRpbmcgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyAqLwotICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2xlbiAgPSAwOwotICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2RhdGEgPSBOVUxMOwotCi0gICAgaWYgKCBwICsgMiA+IGxpbWl0ICkKLSAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgbl9pbnMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgRlRfVFJBQ0U1KCggIiAgSW5zdHJ1Y3Rpb25zIHNpemU6ICV1XG4iLCBuX2lucyApKTsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgaWYgKCBJU19ISU5URUQoIGxvYWQtPmxvYWRfZmxhZ3MgKSApCi0gICAgewotICAgICAgRlRfVUxvbmcgIHRtcDsKLQotCi0gICAgICAvKiBjaGVjayBpbnN0cnVjdGlvbnMgc2l6ZSAqLwotICAgICAgaWYgKCAoIGxpbWl0IC0gcCApIDwgbl9pbnMgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTEoKCAiVFRfTG9hZF9TaW1wbGVfR2x5cGg6IGluc3RydWN0aW9uIGNvdW50IG1pc21hdGNoXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBUb29fTWFueV9IaW50cyApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIGRvbid0IHRydXN0IGBtYXhTaXplT2ZJbnN0cnVjdGlvbnMnIGluIHRoZSBgbWF4cCcgdGFibGUgKi8KLSAgICAgIC8qIGFuZCB0aHVzIHVwZGF0ZSB0aGUgYnl0ZWNvZGUgYXJyYXkgc2l6ZSBieSBvdXJzZWx2ZXMgICAgICAgKi8KLQotICAgICAgdG1wICAgPSBsb2FkLT5leGVjLT5nbHlwaFNpemU7Ci0gICAgICBlcnJvciA9IFVwZGF0ZV9NYXgoIGxvYWQtPmV4ZWMtPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRlRfQnl0ZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJmxvYWQtPmV4ZWMtPmdseXBoSW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuX2lucyApOwotCi0gICAgICBsb2FkLT5leGVjLT5nbHlwaFNpemUgPSAoRlRfVVNob3J0KXRtcDsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2xlbiAgPSBuX2luczsKLSAgICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2RhdGEgPSBsb2FkLT5leGVjLT5nbHlwaEluczsKLQotICAgICAgaWYgKCBuX2lucyApCi0gICAgICAgIEZUX01FTV9DT1BZKCBsb2FkLT5leGVjLT5nbHlwaElucywgcCwgKEZUX0xvbmcpbl9pbnMgKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgIHAgKz0gbl9pbnM7Ci0KLSAgICBvdXRsaW5lID0gJmdsb2FkZXItPmN1cnJlbnQub3V0bGluZTsKLQotICAgIC8qIHJlYWRpbmcgdGhlIHBvaW50IHRhZ3MgKi8KLSAgICBmbGFnICAgICAgID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3M7Ci0gICAgZmxhZ19saW1pdCA9IGZsYWcgKyBuX3BvaW50czsKLQotICAgIEZUX0FTU0VSVCggZmxhZyApOwotCi0gICAgd2hpbGUgKCBmbGFnIDwgZmxhZ19saW1pdCApCi0gICAgewotICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKLSAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICpmbGFnKysgPSBjID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICBpZiAoIGMgJiA4ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKLSAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICBjb3VudCA9IEZUX05FWFRfQllURSggcCApOwotICAgICAgICBpZiAoIGZsYWcgKyAoRlRfSW50KWNvdW50ID4gZmxhZ19saW1pdCApCi0gICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICAgICpmbGFnKysgPSBjOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlYWRpbmcgdGhlIFggY29vcmRpbmF0ZXMgKi8KLQotICAgIHZlYyAgICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICB2ZWNfbGltaXQgPSB2ZWMgKyBuX3BvaW50czsKLSAgICBmbGFnICAgICAgPSAoRlRfQnl0ZSopb3V0bGluZS0+dGFnczsKLSAgICB4ICAgICAgICAgPSAwOwotCi0gICAgaWYgKCBwICsgeHlfc2l6ZSA+IGxpbWl0ICkKLSAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgZm9yICggOyB2ZWMgPCB2ZWNfbGltaXQ7IHZlYysrLCBmbGFnKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgIHkgPSAwOwotICAgICAgRlRfQnl0ZSAgZiA9ICpmbGFnOwotCi0KLSAgICAgIGlmICggZiAmIDIgKQotICAgICAgewotICAgICAgICBpZiAoIHAgKyAxID4gbGltaXQgKQotICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgIHkgPSAoRlRfUG9zKUZUX05FWFRfQllURSggcCApOwotICAgICAgICBpZiAoICggZiAmIDE2ICkgPT0gMCApCi0gICAgICAgICAgeSA9IC15OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoICggZiAmIDE2ICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggcCArIDIgPiBsaW1pdCApCi0gICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgeSA9IChGVF9Qb3MpRlRfTkVYVF9TSE9SVCggcCApOwotICAgICAgfQotCi0gICAgICB4ICAgICArPSB5OwotICAgICAgdmVjLT54ID0geDsKLSAgICAgIC8qIHRoZSBjYXN0IGlzIGZvciBzdHVwaWQgY29tcGlsZXJzICovCi0gICAgICAqZmxhZyAgPSAoRlRfQnl0ZSkoIGYgJiB+KCAyIHwgMTYgKSApOwotICAgIH0KLQotICAgIC8qIHJlYWRpbmcgdGhlIFkgY29vcmRpbmF0ZXMgKi8KLQotICAgIHZlYyAgICAgICA9IGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5wb2ludHM7Ci0gICAgdmVjX2xpbWl0ID0gdmVjICsgbl9wb2ludHM7Ci0gICAgZmxhZyAgICAgID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3M7Ci0gICAgeCAgICAgICAgID0gMDsKLQotICAgIGZvciAoIDsgdmVjIDwgdmVjX2xpbWl0OyB2ZWMrKywgZmxhZysrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgICB5ID0gMDsKLSAgICAgIEZUX0J5dGUgIGYgPSAqZmxhZzsKLQotCi0gICAgICBpZiAoIGYgJiA0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKLSAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICB5ID0gKEZUX1BvcylGVF9ORVhUX0JZVEUoIHAgKTsKLSAgICAgICAgaWYgKCAoIGYgJiAzMiApID09IDAgKQotICAgICAgICAgIHkgPSAteTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCAoIGYgJiAzMiApID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoIHAgKyAyID4gbGltaXQgKQotICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgIHkgPSAoRlRfUG9zKUZUX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgIH0KLQotICAgICAgeCAgICAgKz0geTsKLSAgICAgIHZlYy0+eSA9IHg7Ci0gICAgICAvKiB0aGUgY2FzdCBpcyBmb3Igc3R1cGlkIGNvbXBpbGVycyAqLwotICAgICAgKmZsYWcgID0gKEZUX0J5dGUpKCBmICYgRlRfQ1VSVkVfVEFHX09OICk7Ci0gICAgfQotCi0gICAgb3V0bGluZS0+bl9wb2ludHMgICA9IChGVF9TaG9ydCluX3BvaW50czsKLSAgICBvdXRsaW5lLT5uX2NvbnRvdXJzID0gKEZUX1Nob3J0KW5fY29udG91cnM7Ci0KLSAgICBsb2FkLT5jdXJzb3IgPSBwOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEludmFsaWRfT3V0bGluZToKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLSAgICBnb3RvIEZhaWw7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaCggVFRfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIEZUX0J5dGUqICAgICAgICBwICAgICAgID0gbG9hZGVyLT5jdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgIGxpbWl0ICAgPSBsb2FkZXItPmxpbWl0OwotICAgIEZUX0dseXBoTG9hZGVyICBnbG9hZGVyID0gbG9hZGVyLT5nbG9hZGVyOwotICAgIEZUX1N1YkdseXBoICAgICBzdWJnbHlwaDsKLSAgICBGVF9VSW50ICAgICAgICAgbnVtX3N1YmdseXBoczsKLQotCi0gICAgbnVtX3N1YmdseXBocyA9IDA7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIEZUX0ZpeGVkICB4eCwgeHksIHl5LCB5eDsKLSAgICAgIEZUX1VJbnQgICBjb3VudDsKLQotCi0gICAgICAvKiBjaGVjayB0aGF0IHdlIGNhbiBsb2FkIGEgbmV3IHN1YmdseXBoICovCi0gICAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NoZWNrU3ViR2x5cGhzKCBnbG9hZGVyLCBudW1fc3ViZ2x5cGhzICsgMSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgLyogY2hlY2sgc3BhY2UgKi8KLSAgICAgIGlmICggcCArIDQgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9Db21wb3NpdGU7Ci0KLSAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+Y3VycmVudC5zdWJnbHlwaHMgKyBudW1fc3ViZ2x5cGhzOwotCi0gICAgICBzdWJnbHlwaC0+YXJnMSA9IHN1YmdseXBoLT5hcmcyID0gMDsKLQotICAgICAgc3ViZ2x5cGgtPmZsYWdzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIHN1YmdseXBoLT5pbmRleCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIC8qIGNoZWNrIHNwYWNlICovCi0gICAgICBjb3VudCA9IDI7Ci0gICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1dPUkRTICkKLSAgICAgICAgY291bnQgKz0gMjsKLSAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgV0VfSEFWRV9BX1NDQUxFICkKLSAgICAgICAgY291bnQgKz0gMjsKLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FOX1hZX1NDQUxFICkKLSAgICAgICAgY291bnQgKz0gNDsKLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FfMlgyICkKLSAgICAgICAgY291bnQgKz0gODsKLQotICAgICAgaWYgKCBwICsgY291bnQgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9Db21wb3NpdGU7Ci0KLSAgICAgIC8qIHJlYWQgYXJndW1lbnRzICovCi0gICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUyApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfV09SRFMgKQotICAgICAgICB7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzIgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSBGVF9ORVhUX0NIQVIoIHAgKTsKLSAgICAgICAgICBzdWJnbHlwaC0+YXJnMiA9IEZUX05FWFRfQ0hBUiggcCApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfV09SRFMgKQotICAgICAgICB7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSAoRlRfSW50KUZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzIgPSAoRlRfSW50KUZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSAoRlRfSW50KUZUX05FWFRfQllURSggcCApOwotICAgICAgICAgIHN1YmdseXBoLT5hcmcyID0gKEZUX0ludClGVF9ORVhUX0JZVEUoIHAgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiByZWFkIHRyYW5zZm9ybSAqLwotICAgICAgeHggPSB5eSA9IDB4MTAwMDBMOwotICAgICAgeHkgPSB5eCA9IDA7Ci0KLSAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgV0VfSEFWRV9BX1NDQUxFICkKLSAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeXkgPSB4eDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FOX1hZX1NDQUxFICkKLSAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeXkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FfMlgyICkKLSAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeXggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeHkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeXkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgIH0KLQotICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eCA9IHh4OwotICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSA9IHh5OwotICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS55eCA9IHl4OwotICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS55eSA9IHl5OwotCi0gICAgICBudW1fc3ViZ2x5cGhzKys7Ci0KLSAgICB9IHdoaWxlICggc3ViZ2x5cGgtPmZsYWdzICYgTU9SRV9DT01QT05FTlRTICk7Ci0KLSAgICBnbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHMgPSBudW1fc3ViZ2x5cGhzOwotICAgIEZUX1RSQUNFNSgoICIgICVkIGNvbXBvbmVudHNcbiIsIG51bV9zdWJnbHlwaHMgKSk7Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIHsKLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gbG9hZGVyLT5zdHJlYW07Ci0KLQotICAgICAgLyogd2UgbXVzdCB1bmRvIHRoZSBGVF9GUkFNRV9FTlRFUiBpbiBvcmRlciB0byBwb2ludCAqLwotICAgICAgLyogdG8gdGhlIGNvbXBvc2l0ZSBpbnN0cnVjdGlvbnMsIGlmIHdlIGZpbmQgc29tZS4gICAqLwotICAgICAgLyogV2Ugd2lsbCBwcm9jZXNzIHRoZW0gbGF0ZXIuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgbG9hZGVyLT5pbnNfcG9zID0gKEZUX1VMb25nKSggRlRfU1RSRUFNX1BPUygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgLSBsaW1pdCApOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICBsb2FkZXItPmN1cnNvciA9IHA7Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgSW52YWxpZF9Db21wb3NpdGU6Ci0gICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Db21wb3NpdGUgKTsKLSAgICBnb3RvIEZhaWw7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFRUX0luaXRfR2x5cGhfTG9hZGluZyggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBmYWNlLT5hY2Nlc3NfZ2x5cGhfZnJhbWUgICA9IFRUX0FjY2Vzc19HbHlwaF9GcmFtZTsKLSAgICBmYWNlLT5yZWFkX2dseXBoX2hlYWRlciAgICA9IFRUX0xvYWRfR2x5cGhfSGVhZGVyOwotICAgIGZhY2UtPnJlYWRfc2ltcGxlX2dseXBoICAgID0gVFRfTG9hZF9TaW1wbGVfR2x5cGg7Ci0gICAgZmFjZS0+cmVhZF9jb21wb3NpdGVfZ2x5cGggPSBUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaDsKLSAgICBmYWNlLT5mb3JnZXRfZ2x5cGhfZnJhbWUgICA9IFRUX0ZvcmdldF9HbHlwaF9GcmFtZTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdHRfcHJlcGFyZV96b25lKCBUVF9HbHlwaFpvbmUgIHpvbmUsCi0gICAgICAgICAgICAgICAgICAgRlRfR2x5cGhMb2FkICBsb2FkLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgc3RhcnRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBzdGFydF9jb250b3VyICkKLSAgewotICAgIHpvbmUtPm5fcG9pbnRzICAgID0gKEZUX1VTaG9ydClsb2FkLT5vdXRsaW5lLm5fcG9pbnRzIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClzdGFydF9wb2ludDsKLSAgICB6b25lLT5uX2NvbnRvdXJzICA9IGxvYWQtPm91dGxpbmUubl9jb250b3VycyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9TaG9ydClzdGFydF9jb250b3VyOwotICAgIHpvbmUtPm9yZyAgICAgICAgID0gbG9hZC0+ZXh0cmFfcG9pbnRzICsgc3RhcnRfcG9pbnQ7Ci0gICAgem9uZS0+Y3VyICAgICAgICAgPSBsb2FkLT5vdXRsaW5lLnBvaW50cyArIHN0YXJ0X3BvaW50OwotICAgIHpvbmUtPm9ydXMgICAgICAgID0gbG9hZC0+ZXh0cmFfcG9pbnRzMiArIHN0YXJ0X3BvaW50OwotICAgIHpvbmUtPnRhZ3MgICAgICAgID0gKEZUX0J5dGUqKWxvYWQtPm91dGxpbmUudGFncyArIHN0YXJ0X3BvaW50OwotICAgIHpvbmUtPmNvbnRvdXJzICAgID0gKEZUX1VTaG9ydCopbG9hZC0+b3V0bGluZS5jb250b3VycyArIHN0YXJ0X2NvbnRvdXI7Ci0gICAgem9uZS0+Zmlyc3RfcG9pbnQgPSAoRlRfVVNob3J0KXN0YXJ0X3BvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9IaW50X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIaW50IHRoZSBnbHlwaCB1c2luZyB0aGUgem9uZSBwcmVwYXJlZCBieSB0aGUgY2FsbGVyLiAgTm90ZSB0aGF0ICAgKi8KLSAgLyogICAgdGhlIHpvbmUgaXMgc3VwcG9zZWQgdG8gaW5jbHVkZSBmb3VyIHBoYW50b20gcG9pbnRzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgVFRfSGludF9HbHlwaCggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgaXNfY29tcG9zaXRlICkKLSAgewotI2lmIGRlZmluZWQgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgfHwgXAotICAgIGRlZmluZWQgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICBUVF9GYWNlICAgIGZhY2UgICA9IGxvYWRlci0+ZmFjZTsKLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKLSNlbmRpZgotCi0gICAgVFRfR2x5cGhab25lICB6b25lID0gJmxvYWRlci0+em9uZTsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotICAgIEZUX0xvbmcgICAgICAgbl9pbnM7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggaXNfY29tcG9zaXRlICk7Ci0jZW5kaWYKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgaWYgKCBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbiA+IDB4RkZGRkwgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJUVF9IaW50X0dseXBoOiB0b28gbG9uZyBpbnN0cnVjdGlvbnMiICkpOwotICAgICAgRlRfVFJBQ0UxKCggIiAoMHglbHggYnl0ZSkgaXMgdHJ1bmNhdGVkXG4iLAotICAgICAgICAgICAgICAgICBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbiApKTsKLSAgICB9Ci0gICAgbl9pbnMgPSBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbjsKLQotICAgIC8qIHNhdmUgb3JpZ2luYWwgcG9pbnQgcG9zaXRpb24gaW4gb3JnICovCi0gICAgaWYgKCBuX2lucyA+IDAgKQotICAgICAgRlRfQVJSQVlfQ09QWSggem9uZS0+b3JnLCB6b25lLT5jdXIsIHpvbmUtPm5fcG9pbnRzICk7Ci0KLSAgICAvKiBSZXNldCBncmFwaGljcyBzdGF0ZS4gKi8KLSAgICBsb2FkZXItPmV4ZWMtPkdTID0gbG9hZGVyLT5zaXplLT5HUzsKLQotICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBIaW50aW5nIGluc3RydWN0aW9ucyBvZiBhIGNvbXBvc2l0ZSBnbHlwaCAqLwotICAgIC8qICAgICAgY29tcGxldGVseSByZWZlciB0byB0aGUgKGFscmVhZHkpIGhpbnRlZCBzdWJnbHlwaHMuICAgICAqLwotICAgIGlmICggaXNfY29tcG9zaXRlICkKLSAgICB7Ci0gICAgICBsb2FkZXItPmV4ZWMtPm1ldHJpY3MueF9zY2FsZSA9IDEgPDwgMTY7Ci0gICAgICBsb2FkZXItPmV4ZWMtPm1ldHJpY3MueV9zY2FsZSA9IDEgPDwgMTY7Ci0KLSAgICAgIEZUX0FSUkFZX0NPUFkoIHpvbmUtPm9ydXMsIHpvbmUtPmN1ciwgem9uZS0+bl9wb2ludHMgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxvYWRlci0+ZXhlYy0+bWV0cmljcy54X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLT54X3NjYWxlOwotICAgICAgbG9hZGVyLT5leGVjLT5tZXRyaWNzLnlfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MtPnlfc2NhbGU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiByb3VuZCBwaGFudG9tIHBvaW50cyAqLwotICAgIHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDRdLnggPQotICAgICAgRlRfUElYX1JPVU5EKCB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSA0XS54ICk7Ci0gICAgem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gM10ueCA9Ci0gICAgICBGVF9QSVhfUk9VTkQoIHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDNdLnggKTsKLSAgICB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAyXS55ID0KLSAgICAgIEZUX1BJWF9ST1VORCggem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gMl0ueSApOwotICAgIHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDFdLnkgPQotICAgICAgRlRfUElYX1JPVU5EKCB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAxXS55ICk7Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIGlmICggbl9pbnMgPiAwICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICAgIEZUX0dseXBoTG9hZGVyICBnbG9hZGVyICAgICAgICAgPSBsb2FkZXItPmdsb2FkZXI7Ci0gICAgICBGVF9PdXRsaW5lICAgICAgY3VycmVudF9vdXRsaW5lID0gZ2xvYWRlci0+Y3VycmVudC5vdXRsaW5lOwotCi0KLSAgICAgIFRUX1NldF9Db2RlUmFuZ2UoIGxvYWRlci0+ZXhlYywgdHRfY29kZXJhbmdlX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5leGVjLT5nbHlwaElucywgbl9pbnMgKTsKLQotICAgICAgbG9hZGVyLT5leGVjLT5pc19jb21wb3NpdGUgPSBpc19jb21wb3NpdGU7Ci0gICAgICBsb2FkZXItPmV4ZWMtPnB0cyAgICAgICAgICA9ICp6b25lOwotCi0gICAgICBlcnJvciA9IFRUX1J1bl9Db250ZXh0KCBsb2FkZXItPmV4ZWMgKTsKLSAgICAgIGlmICggZXJyb3IgJiYgbG9hZGVyLT5leGVjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAvKiBzdG9yZSBkcm9wLW91dCBtb2RlIGluIGJpdHMgNS03OyBzZXQgYml0IDIgYWxzbyBhcyBhIG1hcmtlciAqLwotICAgICAgY3VycmVudF9vdXRsaW5lLnRhZ3NbMF0gfD0KLSAgICAgICAgKCBsb2FkZXItPmV4ZWMtPkdTLnNjYW5fdHlwZSA8PCA1ICkgfCBGVF9DVVJWRV9UQUdfSEFTX1NDQU5NT0RFOwotICAgIH0KLQotI2VuZGlmCi0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgIC8qIFNhdmUgcG9zc2libHkgbW9kaWZpZWQgZ2x5cGggcGhhbnRvbSBwb2ludHMgdW5sZXNzIGluIHY0MCBiYWNrd2FyZCAgKi8KLSAgICAvKiBjb21wYXRpYmlsaXR5IG1vZGUsIHdoZXJlIG5vIG1vdmVtZW50IG9uIHRoZSB4IGF4aXMgbWVhbnMgbm8gcmVhc29uICovCi0gICAgLyogdG8gY2hhbmdlIGJlYXJpbmdzIG9yIGFkdmFuY2Ugd2lkdGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggISggZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uID09IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fNDAgJiYKLSAgICAgICAgICAgICFsb2FkZXItPmV4ZWMtPmJhY2t3YXJkX2NvbXBhdGliaWxpdHkgKSApCi0gICAgewotI2VuZGlmCi0gICAgICBsb2FkZXItPnBwMSA9IHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDRdOwotICAgICAgbG9hZGVyLT5wcDIgPSB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAzXTsKLSAgICAgIGxvYWRlci0+cHAzID0gem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gMl07Ci0gICAgICBsb2FkZXItPnBwNCA9IHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDFdOwotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uID09IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzggKQotICAgIHsKLSAgICAgIGlmICggbG9hZGVyLT5leGVjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfREVFTUJPTERFTiApCi0gICAgICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSggJmxvYWRlci0+Z2xvYWRlci0+Y3VycmVudC5vdXRsaW5lLCAtMjQsIDAgKTsKLQotICAgICAgZWxzZSBpZiAoIGxvYWRlci0+ZXhlYy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0VNQk9MREVOICkKLSAgICAgICAgRlRfT3V0bGluZV9FbWJvbGRlblhZKCAmbG9hZGVyLT5nbG9hZGVyLT5jdXJyZW50Lm91dGxpbmUsIDI0LCAwICk7Ci0gICAgfQotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmNlIGEgc2ltcGxlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCwgaXQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkLiAgICAgKi8KLSAgLyogICAgVXN1YWxseSwgdGhpcyBtZWFucyBzY2FsaW5nIGFuZCBoaW50aW5nIHRocm91Z2ggYnl0ZWNvZGUgICAgICAgICAgICovCi0gIC8qICAgIGludGVycHJldGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKCBUVF9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciA9IGxvYWRlci0+Z2xvYWRlcjsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3IgICA9IEZUX0Vycl9PazsKLSAgICBGVF9PdXRsaW5lKiAgICAgb3V0bGluZTsKLSAgICBGVF9JbnQgICAgICAgICAgbl9wb2ludHM7Ci0KLQotICAgIG91dGxpbmUgID0gJmdsb2FkZXItPmN1cnJlbnQub3V0bGluZTsKLSAgICBuX3BvaW50cyA9IG91dGxpbmUtPm5fcG9pbnRzOwotCi0gICAgLyogc2V0IHBoYW50b20gcG9pbnRzICovCi0KLSAgICBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgICAgXSA9IGxvYWRlci0+cHAxOwotICAgIG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyArIDFdID0gbG9hZGVyLT5wcDI7Ci0gICAgb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzICsgMl0gPSBsb2FkZXItPnBwMzsKLSAgICBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgKyAzXSA9IGxvYWRlci0+cHA0OwotCi0gICAgb3V0bGluZS0+dGFnc1tuX3BvaW50cyAgICBdID0gMDsKLSAgICBvdXRsaW5lLT50YWdzW25fcG9pbnRzICsgMV0gPSAwOwotICAgIG91dGxpbmUtPnRhZ3Nbbl9wb2ludHMgKyAyXSA9IDA7Ci0gICAgb3V0bGluZS0+dGFnc1tuX3BvaW50cyArIDNdID0gMDsKLQotICAgIG5fcG9pbnRzICs9IDQ7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLSAgICBpZiAoICFsb2FkZXItPmZhY2UtPmlzX2RlZmF1bHRfaW5zdGFuY2UgKQotICAgIHsKLSAgICAgIC8qIERlbHRhcyBhcHBseSB0byB0aGUgdW5zY2FsZWQgZGF0YS4gKi8KLSAgICAgIGVycm9yID0gVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMoIGxvYWRlci0+ZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+Z2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpbl9wb2ludHMgKTsKLQotICAgICAgLyogcmVjYWxjdWxhdGUgbGluZWFyIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2VzICovCi0gICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIEhWQVIgYW5kIFZWQVIsIHJlc3BlY3RpdmVseSAgICAgICAgKi8KLSAgICAgIGlmICggISggbG9hZGVyLT5mYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfSEFEVkFOQ0UgKSApCi0gICAgICAgIGxvYWRlci0+bGluZWFyID0gb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzIC0gM10ueCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzIC0gNF0ueDsKLSAgICAgIGlmICggISggbG9hZGVyLT5mYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfVkFEVkFOQ0UgKSApCi0gICAgICAgIGxvYWRlci0+dmFkdmFuY2UgPSBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgLSAxXS54IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDJdLng7Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCAqLwotCi0gICAgaWYgKCBJU19ISU5URUQoIGxvYWRlci0+bG9hZF9mbGFncyApICkKLSAgICB7Ci0gICAgICB0dF9wcmVwYXJlX3pvbmUoICZsb2FkZXItPnpvbmUsICZnbG9hZGVyLT5jdXJyZW50LCAwLCAwICk7Ci0KLSAgICAgIEZUX0FSUkFZX0NPUFkoIGxvYWRlci0+em9uZS5vcnVzLCBsb2FkZXItPnpvbmUuY3VyLAotICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT56b25lLm5fcG9pbnRzICsgNCApOwotICAgIH0KLQotICAgIHsKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgICAgVFRfRmFjZSAgICBmYWNlICAgPSBsb2FkZXItPmZhY2U7Ci0gICAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKLQotICAgICAgRlRfU3RyaW5nKiAgZmFtaWx5ICAgICAgICAgPSBmYWNlLT5yb290LmZhbWlseV9uYW1lOwotICAgICAgRlRfVUludCAgICAgcHBlbSAgICAgICAgICAgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MtPnhfcHBlbTsKLSAgICAgIEZUX1N0cmluZyogIHN0eWxlICAgICAgICAgID0gZmFjZS0+cm9vdC5zdHlsZV9uYW1lOwotICAgICAgRlRfVUludCAgICAgeF9zY2FsZV9mYWN0b3IgPSAxMDAwOwotI2VuZGlmCi0KLSAgICAgIEZUX1ZlY3RvciogIHZlYyAgID0gb3V0bGluZS0+cG9pbnRzOwotICAgICAgRlRfVmVjdG9yKiAgbGltaXQgPSBvdXRsaW5lLT5wb2ludHMgKyBuX3BvaW50czsKLQotICAgICAgRlRfRml4ZWQgIHhfc2NhbGUgPSAwOyAvKiBwYWNpZnkgY29tcGlsZXIgKi8KLSAgICAgIEZUX0ZpeGVkICB5X3NjYWxlID0gMDsKLQotICAgICAgRlRfQm9vbCAgZG9fc2NhbGUgPSBGQUxTRTsKLQotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLQotICAgICAgaWYgKCBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCApCi0gICAgICB7Ci0gICAgICAgIC8qIHNjYWxlLCBidXQgb25seSBpZiBlbmFibGVkIGFuZCBvbmx5IGlmIFRUIGhpbnRpbmcgaXMgYmVpbmcgdXNlZCAqLwotICAgICAgICBpZiAoIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgKQotICAgICAgICAgIHhfc2NhbGVfZmFjdG9yID0gc3BoX3Rlc3RfdHdlYWtfeF9zY2FsaW5nKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmdseXBoX2luZGV4ICk7Ci0gICAgICAgIC8qIHNjYWxlIHRoZSBnbHlwaCAqLwotICAgICAgICBpZiAoICggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgfHwKLSAgICAgICAgICAgICB4X3NjYWxlX2ZhY3RvciAhPSAxMDAwICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSBGVF9NdWxEaXYoIGxvYWRlci0+c2l6ZS0+bWV0cmljcy0+eF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZyl4X3NjYWxlX2ZhY3RvciwgMTAwMCApOwotICAgICAgICAgIHlfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MtPnlfc2NhbGU7Ci0KLSAgICAgICAgICAvKiBjb21wZW5zYXRlIGZvciBhbnkgc2NhbGluZyBieSBkZS9lbWJvbGRlbmluZzsgKi8KLSAgICAgICAgICAvKiB0aGUgYW1vdW50IHdhcyBkZXRlcm1pbmVkIHZpYSBleHBlcmltZW50YXRpb24gKi8KLSAgICAgICAgICBpZiAoIHhfc2NhbGVfZmFjdG9yICE9IDEwMDAgJiYgcHBlbSA+IDExICkKLSAgICAgICAgICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSggb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCAxMjgwICogcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwIC0geF9zY2FsZV9mYWN0b3IgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOwotICAgICAgICAgIGRvX3NjYWxlID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotCi0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgICAgewotICAgICAgICAvKiBzY2FsZSB0aGUgZ2x5cGggKi8KLSAgICAgICAgaWYgKCAoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MtPnhfc2NhbGU7Ci0gICAgICAgICAgeV9zY2FsZSA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy0+eV9zY2FsZTsKLQotICAgICAgICAgIGRvX3NjYWxlID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGRvX3NjYWxlICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgICAgICB7Ci0gICAgICAgICAgdmVjLT54ID0gRlRfTXVsRml4KCB2ZWMtPngsIHhfc2NhbGUgKTsKLSAgICAgICAgICB2ZWMtPnkgPSBGVF9NdWxGaXgoIHZlYy0+eSwgeV9zY2FsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9hZGVyLT5wcDEgPSBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgLSA0XTsKLSAgICAgICAgbG9hZGVyLT5wcDIgPSBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgLSAzXTsKLSAgICAgICAgbG9hZGVyLT5wcDMgPSBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgLSAyXTsKLSAgICAgICAgbG9hZGVyLT5wcDQgPSBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgLSAxXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgKQotICAgIHsKLSAgICAgIGxvYWRlci0+em9uZS5uX3BvaW50cyArPSA0OwotCi0gICAgICBlcnJvciA9IFRUX0hpbnRfR2x5cGgoIGxvYWRlciwgMCApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUHJvY2Vzc19Db21wb3NpdGVfQ29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25jZSBhIGNvbXBvc2l0ZSBjb21wb25lbnQgaGFzIGJlZW4gbG9hZGVkLCBpdCBuZWVkcyB0byBiZSAgICAgICAgICovCi0gIC8qICAgIHByb2Nlc3NlZC4gIFVzdWFsbHksIHRoaXMgbWVhbnMgdHJhbnNmb3JtaW5nIGFuZCB0cmFuc2xhdGluZy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0NvbXBvbmVudCggVFRfTG9hZGVyICAgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdWJHbHlwaCAgc3ViZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIHN0YXJ0X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1fYmFzZV9wb2ludHMgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgPSBsb2FkZXItPmdsb2FkZXI7Ci0gICAgRlRfT3V0bGluZSAgICAgIGN1cnJlbnQ7Ci0gICAgRlRfQm9vbCAgICAgICAgIGhhdmVfc2NhbGU7Ci0gICAgRlRfUG9zICAgICAgICAgIHgsIHk7Ci0KLQotICAgIGN1cnJlbnQucG9pbnRzICAgPSBnbG9hZGVyLT5iYXNlLm91dGxpbmUucG9pbnRzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYmFzZV9wb2ludHM7Ci0gICAgY3VycmVudC5uX3BvaW50cyA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5uX3BvaW50cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KW51bV9iYXNlX3BvaW50czsKLQotICAgIGhhdmVfc2NhbGUgPSBGVF9CT09MKCBzdWJnbHlwaC0+ZmxhZ3MgJiAoIFdFX0hBVkVfQV9TQ0FMRSAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFX0hBVkVfQU5fWFlfU0NBTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFX0hBVkVfQV8yWDIgICAgICAgKSApOwotCi0gICAgLyogcGVyZm9ybSB0aGUgdHJhbnNmb3JtIHJlcXVpcmVkIGZvciB0aGlzIHN1YmdseXBoICovCi0gICAgaWYgKCBoYXZlX3NjYWxlICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmY3VycmVudCwgJnN1YmdseXBoLT50cmFuc2Zvcm0gKTsKLQotICAgIC8qIGdldCBvZmZzZXQgKi8KLSAgICBpZiAoICEoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUyApICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICBudW1fcG9pbnRzID0gKEZUX1VJbnQpZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOwotICAgICAgRlRfVUludCAgICAgayA9IChGVF9VSW50KXN1YmdseXBoLT5hcmcxOwotICAgICAgRlRfVUludCAgICAgbCA9IChGVF9VSW50KXN1YmdseXBoLT5hcmcyOwotICAgICAgRlRfVmVjdG9yKiAgcDE7Ci0gICAgICBGVF9WZWN0b3IqICBwMjsKLQotCi0gICAgICAvKiBtYXRjaCBsLXRoIHBvaW50IG9mIHRoZSBuZXdseSBsb2FkZWQgY29tcG9uZW50IHRvIHRoZSBrLXRoIHBvaW50ICovCi0gICAgICAvKiBvZiB0aGUgcHJldmlvdXNseSBsb2FkZWQgY29tcG9uZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIGNoYW5nZSB0byB0aGUgcG9pbnQgbnVtYmVycyB1c2VkIGJ5IG91ciBvdXRsaW5lICovCi0gICAgICBrICs9IHN0YXJ0X3BvaW50OwotICAgICAgbCArPSBudW1fYmFzZV9wb2ludHM7Ci0gICAgICBpZiAoIGsgPj0gbnVtX2Jhc2VfcG9pbnRzIHx8Ci0gICAgICAgICAgIGwgPj0gbnVtX3BvaW50cyAgICAgICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NvbXBvc2l0ZSApOwotCi0gICAgICBwMSA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKyBrOwotICAgICAgcDIgPSBnbG9hZGVyLT5iYXNlLm91dGxpbmUucG9pbnRzICsgbDsKLQotICAgICAgeCA9IHAxLT54IC0gcDItPng7Ci0gICAgICB5ID0gcDEtPnkgLSBwMi0+eTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHggPSBzdWJnbHlwaC0+YXJnMTsKLSAgICAgIHkgPSBzdWJnbHlwaC0+YXJnMjsKLQotICAgICAgaWYgKCAheCAmJiAheSApCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICAgIC8qIFVzZSBhIGRlZmF1bHQgdmFsdWUgZGVwZW5kZW50IG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVELiAgVGhpcyBpcyB1c2VmdWwgZm9yIG9sZCAqLwotICAgICAgLyogVFQgZm9udHMgd2hpY2ggZG9uJ3Qgc2V0IHRoZSB4eHhfQ09NUE9ORU5UX09GRlNFVCBiaXQuICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBoYXZlX3NjYWxlICYmCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRAotICAgICAgICAgICAhKCBzdWJnbHlwaC0+ZmxhZ3MgJiBVTlNDQUxFRF9DT01QT05FTlRfT0ZGU0VUICkgKQotI2Vsc2UKLSAgICAgICAgICAgICggc3ViZ2x5cGgtPmZsYWdzICYgU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQgKSApCi0jZW5kaWYKLSAgICAgIHsKLQotI2lmIDAKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIHdoYXQgQXBwbGUgZG9jdW1lbnRzLiAgQnV0IGl0IGRvZXNuJ3Qgd29yay4gICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaW50ICBhID0gc3ViZ2x5cGgtPnRyYW5zZm9ybS54eCA+IDAgPyAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC1zdWJnbHlwaC0+dHJhbnNmb3JtLnh4OwotICAgICAgICBpbnQgIGIgPSBzdWJnbHlwaC0+dHJhbnNmb3JtLnl4ID4gMCA/ICBzdWJnbHlwaC0+dHJhbnNmb3JtLnl4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLXN1YmdseXBoLT50cmFuc2Zvcm0ueXg7Ci0gICAgICAgIGludCAgYyA9IHN1YmdseXBoLT50cmFuc2Zvcm0ueHkgPiAwID8gIHN1YmdseXBoLT50cmFuc2Zvcm0ueHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtc3ViZ2x5cGgtPnRyYW5zZm9ybS54eTsKLSAgICAgICAgaW50ICBkID0gc3ViZ2x5cGgtPnRyYW5zZm9ybS55eSA+IDAgPyAgc3ViZ2x5cGgtPnRyYW5zZm9ybS55eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC1zdWJnbHlwaC0+dHJhbnNmb3JtLnl5OwotICAgICAgICBpbnQgIG0gPSBhID4gYiA/IGEgOiBiOwotICAgICAgICBpbnQgIG4gPSBjID4gZCA/IGMgOiBkOwotCi0KLSAgICAgICAgaWYgKCBhIC0gYiA8PSAzMyAmJiBhIC0gYiA+PSAtMzMgKQotICAgICAgICAgIG0gKj0gMjsKLSAgICAgICAgaWYgKCBjIC0gZCA8PSAzMyAmJiBjIC0gZCA+PSAtMzMgKQotICAgICAgICAgIG4gKj0gMjsKLSAgICAgICAgeCA9IEZUX011bEZpeCggeCwgbSApOwotICAgICAgICB5ID0gRlRfTXVsRml4KCB5LCBuICk7Ci0KLSNlbHNlIC8qIDEgKi8KLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGEgZ3Vlc3MgYW5kIHdvcmtzIG11Y2ggYmV0dGVyIHRoYW4gdGhlIGFib3ZlLiAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgRlRfRml4ZWQgIG1hY194c2NhbGUgPSBGVF9IeXBvdCggc3ViZ2x5cGgtPnRyYW5zZm9ybS54eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSApOwotICAgICAgICBGVF9GaXhlZCAgbWFjX3lzY2FsZSA9IEZUX0h5cG90KCBzdWJnbHlwaC0+dHJhbnNmb3JtLnl5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJnbHlwaC0+dHJhbnNmb3JtLnl4ICk7Ci0KLQotICAgICAgICB4ID0gRlRfTXVsRml4KCB4LCBtYWNfeHNjYWxlICk7Ci0gICAgICAgIHkgPSBGVF9NdWxGaXgoIHksIG1hY195c2NhbGUgKTsKLQotI2VuZGlmIC8qIDEgKi8KLQotICAgICAgfQotCi0gICAgICBpZiAoICEoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICB4X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLT54X3NjYWxlOwotICAgICAgICBGVF9GaXhlZCAgeV9zY2FsZSA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy0+eV9zY2FsZTsKLQotCi0gICAgICAgIHggPSBGVF9NdWxGaXgoIHgsIHhfc2NhbGUgKTsKLSAgICAgICAgeSA9IEZUX011bEZpeCggeSwgeV9zY2FsZSApOwotCi0gICAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgUk9VTkRfWFlfVE9fR1JJRCApCi0gICAgICAgIHsKLSAgICAgICAgICB4ID0gRlRfUElYX1JPVU5EKCB4ICk7Ci0gICAgICAgICAgeSA9IEZUX1BJWF9ST1VORCggeSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCB4IHx8IHkgKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZjdXJyZW50LCB4LCB5ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoLCBpbiB0aGF0ICAgKi8KLSAgLyogICAgaXRzIHNvbGUgcHVycG9zZSBpcyB0byBoaW50IHRoZSBnbHlwaC4gIFRodXMgdGhpcyBmdW5jdGlvbiBpcyAgICAgICovCi0gIC8qICAgIG9ubHkgYXZhaWxhYmxlIHdoZW4gYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaXMgZW5hYmxlZC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0dseXBoKCBUVF9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHN0YXJ0X2NvbnRvdXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX091dGxpbmUqICBvdXRsaW5lOwotICAgIEZUX1VJbnQgICAgICBpOwotCi0KLSAgICBvdXRsaW5lID0gJmxvYWRlci0+Z2xvYWRlci0+YmFzZS5vdXRsaW5lOwotCi0gICAgLyogbWFrZSByb29tIGZvciBwaGFudG9tIHBvaW50cyAqLwotICAgIGVycm9yID0gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBsb2FkZXItPmdsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPm5fcG9pbnRzICsgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgb3V0bGluZS0+cG9pbnRzW291dGxpbmUtPm5fcG9pbnRzICAgIF0gPSBsb2FkZXItPnBwMTsKLSAgICBvdXRsaW5lLT5wb2ludHNbb3V0bGluZS0+bl9wb2ludHMgKyAxXSA9IGxvYWRlci0+cHAyOwotICAgIG91dGxpbmUtPnBvaW50c1tvdXRsaW5lLT5uX3BvaW50cyArIDJdID0gbG9hZGVyLT5wcDM7Ci0gICAgb3V0bGluZS0+cG9pbnRzW291dGxpbmUtPm5fcG9pbnRzICsgM10gPSBsb2FkZXItPnBwNDsKLQotICAgIG91dGxpbmUtPnRhZ3Nbb3V0bGluZS0+bl9wb2ludHMgICAgXSA9IDA7Ci0gICAgb3V0bGluZS0+dGFnc1tvdXRsaW5lLT5uX3BvaW50cyArIDFdID0gMDsKLSAgICBvdXRsaW5lLT50YWdzW291dGxpbmUtPm5fcG9pbnRzICsgMl0gPSAwOwotICAgIG91dGxpbmUtPnRhZ3Nbb3V0bGluZS0+bl9wb2ludHMgKyAzXSA9IDA7Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIHsKLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gbG9hZGVyLT5zdHJlYW07Ci0gICAgICBGVF9VU2hvcnQgIG5faW5zLCBtYXhfaW5zOwotICAgICAgRlRfVUxvbmcgICB0bXA7Ci0KLQotICAgICAgLyogVFRfTG9hZF9Db21wb3NpdGVfR2x5cGggb25seSBnaXZlcyB1cyB0aGUgb2Zmc2V0IG9mIGluc3RydWN0aW9ucyAqLwotICAgICAgLyogc28gd2UgcmVhZCB0aGVtIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggbG9hZGVyLT5pbnNfcG9zICkgfHwKLSAgICAgICAgICAgRlRfUkVBRF9VU0hPUlQoIG5faW5zICkgICAgICAgICAgICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBGVF9UUkFDRTUoKCAiICBJbnN0cnVjdGlvbnMgc2l6ZSA9ICVkXG4iLCBuX2lucyApKTsKLQotICAgICAgLyogY2hlY2sgaXQgKi8KLSAgICAgIG1heF9pbnMgPSBsb2FkZXItPmZhY2UtPm1heF9wcm9maWxlLm1heFNpemVPZkluc3RydWN0aW9uczsKLSAgICAgIGlmICggbl9pbnMgPiBtYXhfaW5zICkKLSAgICAgIHsKLSAgICAgICAgLyogZG9uJ3QgdHJ1c3QgYG1heFNpemVPZkluc3RydWN0aW9ucyc7ICovCi0gICAgICAgIC8qIG9ubHkgZG8gYSByb3VnaCBzYWZldHkgY2hlY2sgICAgICAgICAqLwotICAgICAgICBpZiAoIChGVF9JbnQpbl9pbnMgPiBsb2FkZXItPmJ5dGVfbGVuICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMSgoICJUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9HbHlwaDoiCi0gICAgICAgICAgICAgICAgICAgICAgIiB0b28gbWFueSBpbnN0cnVjdGlvbnMgKCVkKSBmb3IgZ2x5cGggd2l0aCBsZW5ndGggJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgbl9pbnMsIGxvYWRlci0+Ynl0ZV9sZW4gKSk7Ci0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBUb29fTWFueV9IaW50cyApOwotICAgICAgICB9Ci0KLSAgICAgICAgdG1wICAgPSBsb2FkZXItPmV4ZWMtPmdseXBoU2l6ZTsKLSAgICAgICAgZXJyb3IgPSBVcGRhdGVfTWF4KCBsb2FkZXItPmV4ZWMtPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIEZUX0J5dGUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJmxvYWRlci0+ZXhlYy0+Z2x5cGhJbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9pbnMgKTsKLQotICAgICAgICBsb2FkZXItPmV4ZWMtPmdseXBoU2l6ZSA9IChGVF9VU2hvcnQpdG1wOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggbl9pbnMgPT0gMCApCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1JFQUQoIGxvYWRlci0+ZXhlYy0+Z2x5cGhJbnMsIG5faW5zICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGxvYWRlci0+Z2x5cGgtPmNvbnRyb2xfZGF0YSA9IGxvYWRlci0+ZXhlYy0+Z2x5cGhJbnM7Ci0gICAgICBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbiAgPSBuX2luczsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgdHRfcHJlcGFyZV96b25lKCAmbG9hZGVyLT56b25lLCAmbG9hZGVyLT5nbG9hZGVyLT5iYXNlLAotICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9pbnQsIHN0YXJ0X2NvbnRvdXIgKTsKLQotICAgIC8qIFNvbWUgcG9pbnRzIGFyZSBsaWtlbHkgdG91Y2hlZCBkdXJpbmcgZXhlY3V0aW9uIG9mICAqLwotICAgIC8qIGluc3RydWN0aW9ucyBvbiBjb21wb25lbnRzLiAgU28gbGV0J3MgdW50b3VjaCB0aGVtLiAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgbG9hZGVyLT56b25lLm5fcG9pbnRzOyBpKysgKQotICAgICAgbG9hZGVyLT56b25lLnRhZ3NbaV0gJj0gfkZUX0NVUlZFX1RBR19UT1VDSF9CT1RIOwotCi0gICAgbG9hZGVyLT56b25lLm5fcG9pbnRzICs9IDQ7Ci0KLSAgICByZXR1cm4gVFRfSGludF9HbHlwaCggbG9hZGVyLCAxICk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIENhbGN1bGF0ZSB0aGUgcGhhbnRvbSBwb2ludHMKLSAgICoKLSAgICogRGVmaW5pbmcgdGhlIHJpZ2h0IHNpZGUgYmVhcmluZyAocnNiKSBhcwotICAgKgotICAgKiAgIHJzYiA9IGF3IC0gKGxzYiArIHhtYXggLSB4bWluKQotICAgKgotICAgKiAod2l0aCBgYXcnIHRoZSBhZHZhbmNlIHdpZHRoLCBgbHNiJyB0aGUgbGVmdCBzaWRlIGJlYXJpbmcsIGFuZCBgeG1pbicKLSAgICogYW5kIGB4bWF4JyB0aGUgZ2x5cGgncyBtaW5pbXVtIGFuZCBtYXhpbXVtIHggdmFsdWUpLCB0aGUgT3BlblR5cGUKLSAgICogc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIG9mIGhvcml6b250YWwgcGhhbnRvbSBwb2ludHMKLSAgICogYXMKLSAgICoKLSAgICogICBwcDEgPSAocm91bmQoeG1pbiAtIGxzYiksIDApICAgICAgLAotICAgKiAgIHBwMiA9IChyb3VuZChwcDEgKyBhdyksIDApICAgICAgICAuCi0gICAqCi0gICAqIE5vdGUgdGhhdCB0aGUgcm91bmRpbmcgdG8gdGhlIGdyaWQgKGluIHRoZSBkZXZpY2Ugc3BhY2UpIGlzIG5vdAotICAgKiBkb2N1bWVudGVkIGN1cnJlbnRseSBpbiB0aGUgc3BlY2lmaWNhdGlvbi4KLSAgICoKLSAgICogSG93ZXZlciwgdGhlIHNwZWNpZmljYXRpb24gbGFja3MgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiBvZiB2ZXJ0aWNhbAotICAgKiBwaGFudG9tIHBvaW50cy4gIEdyZWcgSGl0Y2hjb2NrIHByb3ZpZGVkIHRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb24uCi0gICAqCi0gICAqIC0gYSBgdm10eCcgdGFibGUgaXMgcHJlc2VudAotICAgKgotICAgKiAgIEZvciBhbnkgZ2x5cGgsIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHkgdmFsdWVzIChgeW1pbicgYW5kIGB5bWF4JykKLSAgICogICBhcmUgZ2l2ZW4gaW4gdGhlIGBnbHlmJyB0YWJsZSwgdGhlIHRvcCBzaWRlIGJlYXJpbmcgKHRzYikgYW5kIGFkdmFuY2UKLSAgICogICBoZWlnaHQgKGFoKSBhcmUgZ2l2ZW4gaW4gdGhlIGB2bXR4JyB0YWJsZS4gIFRoZSBib3R0b20gc2lkZSBiZWFyaW5nCi0gICAqICAgKGJzYikgaXMgdGhlbiBjYWxjdWxhdGVkIGFzCi0gICAqCi0gICAqICAgICBic2IgPSBhaCAtICh0c2IgKyB5bWF4IC0geW1pbikgICAgICAgLAotICAgKgotICAgKiAgIGFuZCB0aGUgaW5pdGlhbCBwb3NpdGlvbiBvZiB2ZXJ0aWNhbCBwaGFudG9tIHBvaW50cyBpcwotICAgKgotICAgKiAgICAgcHAzID0gKHgsIHJvdW5kKHltYXggKyB0c2IpKSAgICAgICAsCi0gICAqICAgICBwcDQgPSAoeCwgcm91bmQocHAzIC0gYWgpKSAgICAgICAgIC4KLSAgICoKLSAgICogICBTZWUgYmVsb3cgZm9yIHZhbHVlIGB4Jy4KLSAgICoKLSAgICogLSBubyBgdm10eCcgdGFibGUgaW4gdGhlIGZvbnQKLSAgICoKLSAgICogICBJZiB0aGVyZSBpcyBhbiBgT1MvMicgdGFibGUsIHdlIHNldAotICAgKgotICAgKiAgICAgRGVmYXVsdEFzY2VuZGVyID0gc1R5cG9Bc2NlbmRlciAgICAgICAsCi0gICAqICAgICBEZWZhdWx0RGVzY2VuZGVyID0gc1R5cG9EZXNjZW5kZXIgICAgICwKLSAgICoKLSAgICogICBvdGhlcndpc2Ugd2UgdXNlIGRhdGEgZnJvbSB0aGUgYGhoZWEnIHRhYmxlOgotICAgKgotICAgKiAgICAgRGVmYXVsdEFzY2VuZGVyID0gQXNjZW5kZXIgICAgICAgICAsCi0gICAqICAgICBEZWZhdWx0RGVzY2VuZGVyID0gRGVzY2VuZGVyICAgICAgIC4KLSAgICoKLSAgICogICBXaXRoIHRoZXNlIHR3byB2YXJpYWJsZXMgd2UgY2FuIG5vdyBzZXQKLSAgICoKLSAgICogICAgIGFoID0gRGVmYXVsdEFzY2VuZGVyIC0gc0RlZmF1bHREZXNjZW5kZXIgICAgLAotICAgKiAgICAgdHNiID0gRGVmYXVsdEFzY2VuZGVyIC0geU1heCAgICAgICAgICAgICAgICAsCi0gICAqCi0gICAqICAgYW5kIHByb2NlZWQgYXMgaWYgYSBgdm10eCcgdGFibGUgd2FzIHByZXNlbnQuCi0gICAqCi0gICAqIFVzdWFsbHkgd2UgaGF2ZQotICAgKgotICAgKiAgIHggPSBhdyAvIDIgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCi0gICAqCi0gICAqIGJ1dCB0aGVyZSBpcyBvbmUgY29tcGF0aWJpbGl0eSBjYXNlIHdoZXJlIGl0IGNhbiBiZSBzZXQgdG8KLSAgICoKLSAgICogICB4ID0gLURlZmF1bHREZXNjZW5kZXIgLQotICAgKiAgICAgICAgICgoRGVmYXVsdEFzY2VuZGVyIC0gRGVmYXVsdERlc2NlbmRlciAtIGF3KSAvIDIpICAgICAuICAgICAgKDIpCi0gICAqCi0gICAqIGFuZCBhbm90aGVyIG9uZSB3aXRoCi0gICAqCi0gICAqICAgeCA9IDAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMykKLSAgICoKLSAgICogSW4gV2luZG93cywgdGhlIGhpc3Rvcnkgb2YgdGhvc2UgdmFsdWVzIGlzIHF1aXRlIGNvbXBsaWNhdGVkLAotICAgKiBkZXBlbmRpbmcgb24gdGhlIGhpbnRpbmcgZW5naW5lICh0aGF0IGlzLCB0aGUgZ3JhcGhpY3MgZnJhbWV3b3JrKS4KLSAgICoKLSAgICogICBmcmFtZXdvcmsgICAgICAgIGZyb20gICAgICAgICAgICAgICAgIHRvICAgICAgIGZvcm11bGEKLSAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICogICAgR0RJICAgICAgIFdpbmRvd3MgOTggICAgICAgICAgICAgICBjdXJyZW50ICAgICAgKDEpCi0gICAqICAgICAgICAgICAgICAoV2luZG93cyAyMDAwIGZvciBOVCkKLSAgICogICAgR0RJKyAgICAgIFdpbmRvd3MgWFAgICAgICAgICAgICAgICBXaW5kb3dzIDcgICAgKDIpCi0gICAqICAgIEdESSsgICAgICBXaW5kb3dzIDggICAgICAgICAgICAgICAgY3VycmVudCAgICAgICgzKQotICAgKiAgICBEV3JpdGUgICAgV2luZG93cyA3ICAgICAgICAgICAgICAgIGN1cnJlbnQgICAgICAoMykKLSAgICoKLSAgICogRm9yIHNpbXBsaWNpdHksIEZyZWVUeXBlIHVzZXMgKDEpIGZvciBncmF5c2NhbGUgc3VicGl4ZWwgaGludGluZyBhbmQKLSAgICogKDMpIGZvciBldmVyeXRoaW5nIGVsc2UuCi0gICAqCi0gICAqLwotICBzdGF0aWMgdm9pZAotICB0dF9sb2FkZXJfc2V0X3BwKCBUVF9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9Cb29sICBzdWJwaXhlbF9oaW50aW5nID0gMDsKLSAgICBGVF9Cb29sICBncmF5c2NhbGUgICAgICAgID0gMDsKLSAgICBGVF9Cb29sICB1c2VfYXdfMiAgICAgICAgID0gMDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIFRUX0RyaXZlciBkcml2ZXIgPSAoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBsb2FkZXItPmZhY2UgKTsKLSNlbmRpZgotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICkKLSAgICB7Ci0gICAgICBzdWJwaXhlbF9oaW50aW5nID0gbG9hZGVyLT5leGVjID8gbG9hZGVyLT5leGVjLT5zdWJwaXhlbF9oaW50aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLSAgICAgIGdyYXlzY2FsZSAgICAgICAgPSBsb2FkZXItPmV4ZWMgPyBsb2FkZXItPmV4ZWMtPmdyYXlzY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzQwICkKLSAgICB7Ci0gICAgICBzdWJwaXhlbF9oaW50aW5nID0gbG9hZGVyLT5leGVjID8gbG9hZGVyLT5leGVjLT5zdWJwaXhlbF9oaW50aW5nX2xlYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOwotICAgICAgZ3JheXNjYWxlICAgICAgICA9IGxvYWRlci0+ZXhlYyA/IGxvYWRlci0+ZXhlYy0+Z3JheXNjYWxlX2NsZWFydHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICB1c2VfYXdfMiA9IChGVF9Cb29sKSggc3VicGl4ZWxfaGludGluZyAmJiBncmF5c2NhbGUgKTsKLQotICAgIGxvYWRlci0+cHAxLnggPSBsb2FkZXItPmJib3gueE1pbiAtIGxvYWRlci0+bGVmdF9iZWFyaW5nOwotICAgIGxvYWRlci0+cHAxLnkgPSAwOwotICAgIGxvYWRlci0+cHAyLnggPSBsb2FkZXItPnBwMS54ICsgbG9hZGVyLT5hZHZhbmNlOwotICAgIGxvYWRlci0+cHAyLnkgPSAwOwotCi0gICAgbG9hZGVyLT5wcDMueCA9IHVzZV9hd18yID8gbG9hZGVyLT5hZHZhbmNlIC8gMiA6IDA7Ci0gICAgbG9hZGVyLT5wcDMueSA9IGxvYWRlci0+YmJveC55TWF4ICsgbG9hZGVyLT50b3BfYmVhcmluZzsKLSAgICBsb2FkZXItPnBwNC54ID0gdXNlX2F3XzIgPyBsb2FkZXItPmFkdmFuY2UgLyAyIDogMDsKLSAgICBsb2FkZXItPnBwNC55ID0gbG9hZGVyLT5wcDMueSAtIGxvYWRlci0+dmFkdmFuY2U7Ci0gIH0KLQotCi0gIC8qIGEgdXRpbGl0eSBmdW5jdGlvbiB0byByZXRyaWV2ZSBpLXRoIG5vZGUgZnJvbSBnaXZlbiBGVF9MaXN0ICovCi0gIHN0YXRpYyBGVF9MaXN0Tm9kZQotICBmdF9saXN0X2dldF9ub2RlX2F0KCBGVF9MaXN0ICBsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBpZHggKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGN1cjsKLQotCi0gICAgaWYgKCAhbGlzdCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGZvciAoIGN1ciA9IGxpc3QtPmhlYWQ7IGN1cjsgY3VyID0gY3VyLT5uZXh0ICkKLSAgICB7Ci0gICAgICBpZiAoICFpZHggKQotICAgICAgICByZXR1cm4gY3VyOwotCi0gICAgICBpZHgtLTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF90cnVldHlwZV9nbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgYSBnaXZlbiB0cnVldHlwZSBnbHlwaC4gIEhhbmRsZXMgY29tcG9zaXRlcyBhbmQgdXNlcyBhICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGxvYWRfdHJ1ZXR5cGVfZ2x5cGgoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHJlY3Vyc2VfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgaGVhZGVyX29ubHkgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBGVF9GaXhlZCAgICAgICAgeF9zY2FsZSwgeV9zY2FsZTsKLSAgICBGVF9VTG9uZyAgICAgICAgb2Zmc2V0OwotICAgIFRUX0ZhY2UgICAgICAgICBmYWNlICAgICAgICAgPSBsb2FkZXItPmZhY2U7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgICAgICA9IGxvYWRlci0+Z2xvYWRlcjsKLSAgICBGVF9Cb29sICAgICAgICAgb3BlbmVkX2ZyYW1lID0gMDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBGVF9TdHJlYW1SZWMgICAgaW5jX3N0cmVhbTsKLSAgICBGVF9EYXRhICAgICAgICAgZ2x5cGhfZGF0YTsKLSAgICBGVF9Cb29sICAgICAgICAgZ2x5cGhfZGF0YV9sb2FkZWQgPSAwOwotI2VuZGlmCi0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgaWYgKCByZWN1cnNlX2NvdW50ICkKLSAgICAgIEZUX1RSQUNFNSgoICIgIG5lc3RpbmcgbGV2ZWw6ICVkXG4iLCByZWN1cnNlX2NvdW50ICkpOwotI2VuZGlmCi0KLSAgICAvKiBzb21lIGZvbnRzIGhhdmUgYW4gaW5jb3JyZWN0IHZhbHVlIG9mIGBtYXhDb21wb25lbnREZXB0aCcgKi8KLSAgICBpZiAoIHJlY3Vyc2VfY291bnQgPiBmYWNlLT5tYXhfcHJvZmlsZS5tYXhDb21wb25lbnREZXB0aCApCi0gICAgewotICAgICAgRlRfVFJBQ0UxKCggImxvYWRfdHJ1ZXR5cGVfZ2x5cGg6IG1heENvbXBvbmVudERlcHRoIHNldCB0byAlZFxuIiwKLSAgICAgICAgICAgICAgICAgIHJlY3Vyc2VfY291bnQgKSk7Ci0gICAgICBmYWNlLT5tYXhfcHJvZmlsZS5tYXhDb21wb25lbnREZXB0aCA9IChGVF9VU2hvcnQpcmVjdXJzZV9jb3VudDsKLSAgICB9Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIC8qIGNoZWNrIGdseXBoIGluZGV4ICovCi0gICAgaWYgKCBnbHlwaF9pbmRleCA+PSAoRlRfVUludClmYWNlLT5yb290Lm51bV9nbHlwaHMgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfSW5kZXggKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGxvYWRlci0+Z2x5cGhfaW5kZXggPSBnbHlwaF9pbmRleDsKLQotICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgewotICAgICAgeF9zY2FsZSA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy0+eF9zY2FsZTsKLSAgICAgIHlfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MtPnlfc2NhbGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB4X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICB5X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgfQotCi0gICAgLyogU2V0IGBvZmZzZXQnIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2x5cGggcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mICovCi0gICAgLyogdGhlIGBnbHlmJyB0YWJsZSwgYW5kIGBieXRlX2xlbicgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZ2x5cGggaW4gICovCi0gICAgLyogYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0KLSAgICAvKiBJZiB3ZSBhcmUgbG9hZGluZyBnbHlwaCBkYXRhIHZpYSB0aGUgaW5jcmVtZW50YWwgaW50ZXJmYWNlLCBzZXQgKi8KLSAgICAvKiB0aGUgbG9hZGVyIHN0cmVhbSB0byBhIG1lbW9yeSBzdHJlYW0gcmVhZGluZyB0aGUgZGF0YSByZXR1cm5lZCAgKi8KLSAgICAvKiBieSB0aGUgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfZGF0YSgKLSAgICAgICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwKLSAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgJmdseXBoX2RhdGEgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGdseXBoX2RhdGFfbG9hZGVkID0gMTsKLSAgICAgIG9mZnNldCAgICAgICAgICAgID0gMDsKLSAgICAgIGxvYWRlci0+Ynl0ZV9sZW4gID0gZ2x5cGhfZGF0YS5sZW5ndGg7Ci0KLSAgICAgIEZUX1pFUk8oICZpbmNfc3RyZWFtICk7Ci0gICAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggJmluY19zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfZGF0YS5wb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZylnbHlwaF9kYXRhLmxlbmd0aCApOwotCi0gICAgICBsb2FkZXItPnN0cmVhbSA9ICZpbmNfc3RyZWFtOwotICAgIH0KLSAgICBlbHNlCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICAgIG9mZnNldCA9IHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCopJmxvYWRlci0+Ynl0ZV9sZW4gKTsKLQotICAgIGlmICggbG9hZGVyLT5ieXRlX2xlbiA+IDAgKQotICAgIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgICAvKiBmb3IgdGhlIGluY3JlbWVudGFsIGludGVyZmFjZSwgYGdseWZfb2Zmc2V0JyBpcyBhbHdheXMgemVybyAqLwotICAgICAgaWYgKCAhZmFjZS0+Z2x5Zl9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICFmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotI2Vsc2UKLSAgICAgIGlmICggIWZhY2UtPmdseWZfb2Zmc2V0ICkKLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJubyBgZ2x5ZicgdGFibGUgYnV0IG5vbi16ZXJvIGBsb2NhJyBlbnRyeVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gZmFjZS0+YWNjZXNzX2dseXBoX2ZyYW1lKCBsb2FkZXIsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmdseWZfb2Zmc2V0ICsgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWxvYWRlci0+Ynl0ZV9sZW4gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIG9wZW5lZF9mcmFtZSA9IDE7Ci0KLSAgICAgIC8qIHJlYWQgZ2x5cGggaGVhZGVyIGZpcnN0ICovCi0gICAgICBlcnJvciA9IGZhY2UtPnJlYWRfZ2x5cGhfaGVhZGVyKCBsb2FkZXIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIHRoZSBtZXRyaWNzIG11c3QgYmUgY29tcHV0ZWQgYWZ0ZXIgbG9hZGluZyB0aGUgZ2x5cGggaGVhZGVyICovCi0gICAgICAvKiBzaW5jZSB3ZSBuZWVkIHRoZSBnbHlwaCdzIGB5TWF4JyB2YWx1ZSBpbiBjYXNlIHRoZSB2ZXJ0aWNhbCAqLwotICAgICAgLyogbWV0cmljcyBtdXN0IGJlIGVtdWxhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gdHRfZ2V0X21ldHJpY3MoIGxvYWRlciwgZ2x5cGhfaW5kZXggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggaGVhZGVyX29ubHkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBsb2FkZXItPmJ5dGVfbGVuID09IDAgfHwgbG9hZGVyLT5uX2NvbnRvdXJzID09IDAgKQotICAgIHsKLSAgICAgIGxvYWRlci0+YmJveC54TWluID0gMDsKLSAgICAgIGxvYWRlci0+YmJveC54TWF4ID0gMDsKLSAgICAgIGxvYWRlci0+YmJveC55TWluID0gMDsKLSAgICAgIGxvYWRlci0+YmJveC55TWF4ID0gMDsKLQotICAgICAgZXJyb3IgPSB0dF9nZXRfbWV0cmljcyggbG9hZGVyLCBnbHlwaF9pbmRleCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCBoZWFkZXJfb25seSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogbXVzdCBpbml0aWFsaXplIHBvaW50cyBiZWZvcmUgKHBvc3NpYmx5KSBvdmVycmlkaW5nICovCi0gICAgICAvKiBnbHlwaCBtZXRyaWNzIGZyb20gdGhlIGluY3JlbWVudGFsIGludGVyZmFjZSAgICAgICAgKi8KLSAgICAgIHR0X2xvYWRlcl9zZXRfcHAoIGxvYWRlciApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgICAgdHRfZ2V0X21ldHJpY3NfaW5jcl9vdmVycmlkZXMoIGxvYWRlciwgZ2x5cGhfaW5kZXggKTsKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotCi0gICAgICBpZiAoICFsb2FkZXItPmZhY2UtPmlzX2RlZmF1bHRfaW5zdGFuY2UgKQotICAgICAgewotICAgICAgICAvKiBhIHNtYWxsIG91dGxpbmUgc3RydWN0dXJlIHdpdGggZm91ciBlbGVtZW50cyBmb3IgKi8KLSAgICAgICAgLyogY29tbXVuaWNhdGlvbiB3aXRoIGBUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcycgICovCi0gICAgICAgIEZUX1ZlY3RvciAgIHBvaW50c1s0XTsKLSAgICAgICAgY2hhciAgICAgICAgdGFnc1s0XSAgICAgPSB7IDEsIDEsIDEsIDEgfTsKLSAgICAgICAgc2hvcnQgICAgICAgY29udG91cnNbNF0gPSB7IDAsIDEsIDIsIDMgfTsKLSAgICAgICAgRlRfT3V0bGluZSAgb3V0bGluZTsKLQotCi0gICAgICAgIHBvaW50c1swXS54ID0gbG9hZGVyLT5wcDEueDsKLSAgICAgICAgcG9pbnRzWzBdLnkgPSBsb2FkZXItPnBwMS55OwotICAgICAgICBwb2ludHNbMV0ueCA9IGxvYWRlci0+cHAyLng7Ci0gICAgICAgIHBvaW50c1sxXS55ID0gbG9hZGVyLT5wcDIueTsKLQotICAgICAgICBwb2ludHNbMl0ueCA9IGxvYWRlci0+cHAzLng7Ci0gICAgICAgIHBvaW50c1syXS55ID0gbG9hZGVyLT5wcDMueTsKLSAgICAgICAgcG9pbnRzWzNdLnggPSBsb2FkZXItPnBwNC54OwotICAgICAgICBwb2ludHNbM10ueSA9IGxvYWRlci0+cHA0Lnk7Ci0KLSAgICAgICAgb3V0bGluZS5uX3BvaW50cyAgID0gNDsKLSAgICAgICAgb3V0bGluZS5uX2NvbnRvdXJzID0gNDsKLSAgICAgICAgb3V0bGluZS5wb2ludHMgICAgID0gcG9pbnRzOwotICAgICAgICBvdXRsaW5lLnRhZ3MgICAgICAgPSB0YWdzOwotICAgICAgICBvdXRsaW5lLmNvbnRvdXJzICAgPSBjb250b3VyczsKLQotICAgICAgICAvKiB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgc2NhbGluZyAqLwotICAgICAgICBlcnJvciA9IFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKCBsb2FkZXItPmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpb3V0bGluZS5uX3BvaW50cyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgbG9hZGVyLT5wcDEueCA9IHBvaW50c1swXS54OwotICAgICAgICBsb2FkZXItPnBwMS55ID0gcG9pbnRzWzBdLnk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggPSBwb2ludHNbMV0ueDsKLSAgICAgICAgbG9hZGVyLT5wcDIueSA9IHBvaW50c1sxXS55OwotCi0gICAgICAgIGxvYWRlci0+cHAzLnggPSBwb2ludHNbMl0ueDsKLSAgICAgICAgbG9hZGVyLT5wcDMueSA9IHBvaW50c1syXS55OwotICAgICAgICBsb2FkZXItPnBwNC54ID0gcG9pbnRzWzNdLng7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgPSBwb2ludHNbM10ueTsKLQotCi0gICAgICAgIC8qIHJlY2FsY3VsYXRlIGxpbmVhciBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBhZHZhbmNlcyAqLwotICAgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIEhWQVIgYW5kIFZWQVIsIHJlc3BlY3RpdmVseSAgICAgICAgKi8KLSAgICAgICAgaWYgKCAhKCBsb2FkZXItPmZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9IQURWQU5DRSApICkKLSAgICAgICAgICBsb2FkZXItPmxpbmVhciA9IGxvYWRlci0+cHAyLnggLSBsb2FkZXItPnBwMS54OwotICAgICAgICBpZiAoICEoIGxvYWRlci0+ZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgJiBUVF9GQUNFX0ZMQUdfVkFSX1ZBRFZBTkNFICkgKQotICAgICAgICAgIGxvYWRlci0+dmFkdmFuY2UgPSBsb2FkZXItPnBwNC54IC0gbG9hZGVyLT5wcDMueDsKLSAgICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotICAgICAgLyogc2NhbGUgcGhhbnRvbSBwb2ludHMsIGlmIG5lY2Vzc2FyeTsgKi8KLSAgICAgIC8qIHRoZXkgZ2V0IHJvdW5kZWQgaW4gYFRUX0hpbnRfR2x5cGgnICovCi0gICAgICBpZiAoICggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKQotICAgICAgewotICAgICAgICBsb2FkZXItPnBwMS54ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwMS54LCB4X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAyLngsIHhfc2NhbGUgKTsKLSAgICAgICAgLyogcHAxLnkgYW5kIHBwMi55IGFyZSBhbHdheXMgemVybyAqLwotCi0gICAgICAgIGxvYWRlci0+cHAzLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAzLngsIHhfc2NhbGUgKTsKLSAgICAgICAgbG9hZGVyLT5wcDMueSA9IEZUX011bEZpeCggbG9hZGVyLT5wcDMueSwgeV9zY2FsZSApOwotICAgICAgICBsb2FkZXItPnBwNC54ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwNC54LCB4X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgPSBGVF9NdWxGaXgoIGxvYWRlci0+cHA0LnksIHlfc2NhbGUgKTsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbXVzdCBpbml0aWFsaXplIHBoYW50b20gcG9pbnRzIGJlZm9yZSAocG9zc2libHkpIG92ZXJyaWRpbmcgKi8KLSAgICAvKiBnbHlwaCBtZXRyaWNzIGZyb20gdGhlIGluY3JlbWVudGFsIGludGVyZmFjZSAgICAgICAgICAgICAgICAqLwotICAgIHR0X2xvYWRlcl9zZXRfcHAoIGxvYWRlciApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIHR0X2dldF9tZXRyaWNzX2luY3Jfb3ZlcnJpZGVzKCBsb2FkZXIsIGdseXBoX2luZGV4ICk7Ci0jZW5kaWYKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogaWYgaXQgaXMgYSBzaW1wbGUgZ2x5cGgsIGxvYWQgaXQgKi8KLQotICAgIGlmICggbG9hZGVyLT5uX2NvbnRvdXJzID4gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5yZWFkX3NpbXBsZV9nbHlwaCggbG9hZGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBhbGwgZGF0YSBoYXZlIGJlZW4gcmVhZCAqLwotICAgICAgZmFjZS0+Zm9yZ2V0X2dseXBoX2ZyYW1lKCBsb2FkZXIgKTsKLSAgICAgIG9wZW5lZF9mcmFtZSA9IDA7Ci0KLSAgICAgIGVycm9yID0gVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgoIGxvYWRlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfR2x5cGhMb2FkZXJfQWRkKCBnbG9hZGVyICk7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBvdGhlcndpc2UsIGxvYWQgYSBjb21wb3NpdGUhICovCi0gICAgZWxzZSBpZiAoIGxvYWRlci0+bl9jb250b3VycyA9PSAtMSApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotICAgICAgRlRfVUludCAgIHN0YXJ0X3BvaW50OwotICAgICAgRlRfVUludCAgIHN0YXJ0X2NvbnRvdXI7Ci0gICAgICBGVF9VTG9uZyAgaW5zX3BvczsgIC8qIHBvc2l0aW9uIG9mIGNvbXBvc2l0ZSBpbnN0cnVjdGlvbnMsIGlmIGFueSAqLwotCi0gICAgICBGVF9MaXN0Tm9kZSAgbm9kZSwgbm9kZTI7Ci0KLQotICAgICAgLyoKLSAgICAgICAqIFdlIHN0b3JlIHRoZSBnbHlwaCBpbmRleCBkaXJlY3RseSBpbiB0aGUgYG5vZGUtPmRhdGEnIHBvaW50ZXIsCi0gICAgICAgKiBmb2xsb3dpbmcgdGhlIGdsaWIgc29sdXRpb24gKGNmLiBtYWNybyBgR1VJTlRfVE9fUE9JTlRFUicpIHdpdGggYQotICAgICAgICogZG91YmxlIGNhc3QgdG8gbWFrZSB0aGlzIHBvcnRhYmxlLiAgTm90ZSwgaG93ZXZlciwgdGhhdCB0aGlzIG5lZWRzCi0gICAgICAgKiBwb2ludGVycyB3aXRoIGEgd2lkdGggb2YgYXQgbGVhc3QgMzIgYml0cy4KLSAgICAgICAqLwotCi0KLSAgICAgIC8qIGNsZWFyIHRoZSBub2RlcyBmaWxsZWQgYnkgc2libGluZyBjaGFpbnMgKi8KLSAgICAgIG5vZGUgPSBmdF9saXN0X2dldF9ub2RlX2F0KCAmbG9hZGVyLT5jb21wb3NpdGVzLCByZWN1cnNlX2NvdW50ICk7Ci0gICAgICBmb3IgKCBub2RlMiA9IG5vZGU7IG5vZGUyOyBub2RlMiA9IG5vZGUyLT5uZXh0ICkKLSAgICAgICAgbm9kZTItPmRhdGEgPSAodm9pZCopVUxPTkdfTUFYOwotCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSBhIGNvbXBvc2l0ZSBnbHlwaCB3aXRoIHRoaXMgaW5kZXggKi8KLSAgICAgIGlmICggRlRfTGlzdF9GaW5kKCAmbG9hZGVyLT5jb21wb3NpdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJTlRfVE9fUE9JTlRFUiggZ2x5cGhfaW5kZXggKSApICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UxKCggIlRUX0xvYWRfQ29tcG9zaXRlX0dseXBoOiIKLSAgICAgICAgICAgICAgICAgICAgIiBpbmZpbml0ZSByZWN1cnNpb24gZGV0ZWN0ZWRcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQ29tcG9zaXRlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoIG5vZGUgKQotICAgICAgICBub2RlLT5kYXRhID0gRlRfVUlOVF9UT19QT0lOVEVSKCBnbHlwaF9pbmRleCApOwotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfTkVXKCBub2RlICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgbm9kZS0+ZGF0YSA9IEZUX1VJTlRfVE9fUE9JTlRFUiggZ2x5cGhfaW5kZXggKTsKLSAgICAgICAgRlRfTGlzdF9BZGQoICZsb2FkZXItPmNvbXBvc2l0ZXMsIG5vZGUgKTsKLSAgICAgIH0KLQotICAgICAgc3RhcnRfcG9pbnQgICA9IChGVF9VSW50KWdsb2FkZXItPmJhc2Uub3V0bGluZS5uX3BvaW50czsKLSAgICAgIHN0YXJ0X2NvbnRvdXIgPSAoRlRfVUludClnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9jb250b3VyczsKLQotICAgICAgLyogZm9yIGVhY2ggc3ViZ2x5cGgsIHJlYWQgY29tcG9zaXRlIGhlYWRlciAqLwotICAgICAgZXJyb3IgPSBmYWNlLT5yZWFkX2NvbXBvc2l0ZV9nbHlwaCggbG9hZGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBzdG9yZSB0aGUgb2Zmc2V0IG9mIGluc3RydWN0aW9ucyAqLwotICAgICAgaW5zX3BvcyA9IGxvYWRlci0+aW5zX3BvczsKLQotICAgICAgLyogYWxsIGRhdGEgd2UgbmVlZCBhcmUgcmVhZCAqLwotICAgICAgZmFjZS0+Zm9yZ2V0X2dseXBoX2ZyYW1lKCBsb2FkZXIgKTsKLSAgICAgIG9wZW5lZF9mcmFtZSA9IDA7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLSAgICAgIGlmICggIWZhY2UtPmlzX2RlZmF1bHRfaW5zdGFuY2UgKQotICAgICAgewotICAgICAgICBzaG9ydCAgICAgICAgaSwgbGltaXQ7Ci0gICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaDsKLQotICAgICAgICBGVF9PdXRsaW5lICBvdXRsaW5lOwotICAgICAgICBGVF9WZWN0b3IqICBwb2ludHMgICA9IE5VTEw7Ci0gICAgICAgIGNoYXIqICAgICAgIHRhZ3MgICAgID0gTlVMTDsKLSAgICAgICAgc2hvcnQqICAgICAgY29udG91cnMgPSBOVUxMOwotCi0KLSAgICAgICAgbGltaXQgPSAoc2hvcnQpZ2xvYWRlci0+Y3VycmVudC5udW1fc3ViZ2x5cGhzOwotCi0gICAgICAgIC8qIGNvbnN0cnVjdCBhbiBvdXRsaW5lIHN0cnVjdHVyZSBmb3IgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIGNvbW11bmljYXRpb24gd2l0aCBgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMnICovCi0gICAgICAgIG91dGxpbmUubl9wb2ludHMgICA9IChzaG9ydCkoIGdsb2FkZXItPmN1cnJlbnQubnVtX3N1YmdseXBocyArIDQgKTsKLSAgICAgICAgb3V0bGluZS5uX2NvbnRvdXJzID0gb3V0bGluZS5uX3BvaW50czsKLQotICAgICAgICBvdXRsaW5lLnBvaW50cyAgID0gTlVMTDsKLSAgICAgICAgb3V0bGluZS50YWdzICAgICA9IE5VTEw7Ci0gICAgICAgIG91dGxpbmUuY29udG91cnMgPSBOVUxMOwotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBwb2ludHMsIG91dGxpbmUubl9wb2ludHMgKSAgIHx8Ci0gICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCB0YWdzLCBvdXRsaW5lLm5fcG9pbnRzICkgICAgIHx8Ci0gICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCBjb250b3Vycywgb3V0bGluZS5uX3BvaW50cyApICkKLSAgICAgICAgICBnb3RvIEV4aXQxOwotCi0gICAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+Y3VycmVudC5zdWJnbHlwaHM7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBzdWJnbHlwaCsrICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGFwcGx5aW5nIGRlbHRhcyBmb3IgYW5jaG9yIHBvaW50cyBkb2Vzbid0IG1ha2Ugc2Vuc2UsICovCi0gICAgICAgICAgLyogYnV0IHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbGx5IGNoZWNrIHRoaXMgc2luY2UgICAgICAgKi8KLSAgICAgICAgICAvKiB1bnVzZWQgZGVsdGEgdmFsdWVzIGFyZSB6ZXJvIGFueXdheXMgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHBvaW50c1tpXS54ID0gc3ViZ2x5cGgtPmFyZzE7Ci0gICAgICAgICAgcG9pbnRzW2ldLnkgPSBzdWJnbHlwaC0+YXJnMjsKLSAgICAgICAgICB0YWdzW2ldICAgICA9IDE7Ci0gICAgICAgICAgY29udG91cnNbaV0gPSBpOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwMS54OwotICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHAxLnk7Ci0gICAgICAgIHRhZ3NbaV0gICAgID0gMTsKLSAgICAgICAgY29udG91cnNbaV0gPSBpOwotCi0gICAgICAgIGkrKzsKLSAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwMi54OwotICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHAyLnk7Ci0gICAgICAgIHRhZ3NbaV0gICAgID0gMTsKLSAgICAgICAgY29udG91cnNbaV0gPSBpOwotCi0gICAgICAgIGkrKzsKLSAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwMy54OwotICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHAzLnk7Ci0gICAgICAgIHRhZ3NbaV0gICAgID0gMTsKLSAgICAgICAgY29udG91cnNbaV0gPSBpOwotCi0gICAgICAgIGkrKzsKLSAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwNC54OwotICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHA0Lnk7Ci0gICAgICAgIHRhZ3NbaV0gICAgID0gMTsKLSAgICAgICAgY29udG91cnNbaV0gPSBpOwotCi0gICAgICAgIG91dGxpbmUucG9pbnRzICAgPSBwb2ludHM7Ci0gICAgICAgIG91dGxpbmUudGFncyAgICAgPSB0YWdzOwotICAgICAgICBvdXRsaW5lLmNvbnRvdXJzID0gY29udG91cnM7Ci0KLSAgICAgICAgLyogdGhpcyBjYWxsIHByb3ZpZGVzIGFkZGl0aW9uYWwgb2Zmc2V0cyAqLwotICAgICAgICAvKiBmb3IgZWFjaCBjb21wb25lbnQncyB0cmFuc2xhdGlvbiAgICAgICovCi0gICAgICAgIGlmICggRlRfU0VUX0VSUk9SKCBUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClvdXRsaW5lLm5fcG9pbnRzICkgKSApCi0gICAgICAgICAgZ290byBFeGl0MTsKLQotICAgICAgICBzdWJnbHlwaCA9IGdsb2FkZXItPmN1cnJlbnQuc3ViZ2x5cGhzOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgc3ViZ2x5cGgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUyApCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSAoRlRfSW50MTYpcG9pbnRzW2ldLng7Ci0gICAgICAgICAgICBzdWJnbHlwaC0+YXJnMiA9IChGVF9JbnQxNilwb2ludHNbaV0ueTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb2FkZXItPnBwMS54ID0gcG9pbnRzW2kgKyAwXS54OwotICAgICAgICBsb2FkZXItPnBwMS55ID0gcG9pbnRzW2kgKyAwXS55OwotICAgICAgICBsb2FkZXItPnBwMi54ID0gcG9pbnRzW2kgKyAxXS54OwotICAgICAgICBsb2FkZXItPnBwMi55ID0gcG9pbnRzW2kgKyAxXS55OwotCi0gICAgICAgIGxvYWRlci0+cHAzLnggPSBwb2ludHNbaSArIDJdLng7Ci0gICAgICAgIGxvYWRlci0+cHAzLnkgPSBwb2ludHNbaSArIDJdLnk7Ci0gICAgICAgIGxvYWRlci0+cHA0LnggPSBwb2ludHNbaSArIDNdLng7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgPSBwb2ludHNbaSArIDNdLnk7Ci0KLSAgICAgICAgLyogcmVjYWxjdWxhdGUgbGluZWFyIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2VzICovCi0gICAgICAgIC8qIGlmIHdlIGRvbid0IGhhdmUgSFZBUiBhbmQgVlZBUiwgcmVzcGVjdGl2ZWx5ICAgICAgICAqLwotICAgICAgICBpZiAoICEoIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9IQURWQU5DRSApICkKLSAgICAgICAgICBsb2FkZXItPmxpbmVhciA9IGxvYWRlci0+cHAyLnggLSBsb2FkZXItPnBwMS54OwotICAgICAgICBpZiAoICEoIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9WQURWQU5DRSApICkKLSAgICAgICAgICBsb2FkZXItPnZhZHZhbmNlID0gbG9hZGVyLT5wcDQueCAtIGxvYWRlci0+cHAzLng7Ci0KLSAgICAgIEV4aXQxOgotICAgICAgICBGVF9GUkVFKCBvdXRsaW5lLnBvaW50cyApOwotICAgICAgICBGVF9GUkVFKCBvdXRsaW5lLnRhZ3MgKTsKLSAgICAgICAgRlRfRlJFRSggb3V0bGluZS5jb250b3VycyApOwotCi0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotICAgICAgLyogc2NhbGUgcGhhbnRvbSBwb2ludHMsIGlmIG5lY2Vzc2FyeTsgKi8KLSAgICAgIC8qIHRoZXkgZ2V0IHJvdW5kZWQgaW4gYFRUX0hpbnRfR2x5cGgnICovCi0gICAgICBpZiAoICggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKQotICAgICAgewotICAgICAgICBsb2FkZXItPnBwMS54ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwMS54LCB4X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAyLngsIHhfc2NhbGUgKTsKLSAgICAgICAgLyogcHAxLnkgYW5kIHBwMi55IGFyZSBhbHdheXMgemVybyAqLwotCi0gICAgICAgIGxvYWRlci0+cHAzLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAzLngsIHhfc2NhbGUgKTsKLSAgICAgICAgbG9hZGVyLT5wcDMueSA9IEZUX011bEZpeCggbG9hZGVyLT5wcDMueSwgeV9zY2FsZSApOwotICAgICAgICBsb2FkZXItPnBwNC54ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwNC54LCB4X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgPSBGVF9NdWxGaXgoIGxvYWRlci0+cHA0LnksIHlfc2NhbGUgKTsKLSAgICAgIH0KLQotICAgICAgLyogaWYgdGhlIGZsYWcgRlRfTE9BRF9OT19SRUNVUlNFIGlzIHNldCwgd2UgcmV0dXJuIHRoZSBzdWJnbHlwaCAqLwotICAgICAgLyogYGFzIGlzJyBpbiB0aGUgZ2x5cGggc2xvdCAodGhlIGNsaWVudCBhcHBsaWNhdGlvbiB3aWxsIGJlICAgICAqLwotICAgICAgLyogcmVzcG9uc2libGUgZm9yIGludGVycHJldGluZyB0aGVzZSBkYXRhKS4uLiAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKQotICAgICAgewotICAgICAgICBGVF9HbHlwaExvYWRlcl9BZGQoIGdsb2FkZXIgKTsKLSAgICAgICAgbG9hZGVyLT5nbHlwaC0+Zm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURTsKLQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgICAgbiwgbnVtX2Jhc2VfcG9pbnRzOwotICAgICAgICBGVF9TdWJHbHlwaCAgc3ViZ2x5cGggICAgICAgPSBOVUxMOwotCi0gICAgICAgIEZUX1VJbnQgICAgICBudW1fcG9pbnRzICAgICA9IHN0YXJ0X3BvaW50OwotICAgICAgICBGVF9VSW50ICAgICAgbnVtX3N1YmdseXBocyAgPSBnbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHM7Ci0gICAgICAgIEZUX1VJbnQgICAgICBudW1fYmFzZV9zdWJncyA9IGdsb2FkZXItPmJhc2UubnVtX3N1YmdseXBoczsKLQotICAgICAgICBGVF9TdHJlYW0gICAgb2xkX3N0cmVhbSAgICAgPSBsb2FkZXItPnN0cmVhbTsKLSAgICAgICAgRlRfSW50ICAgICAgIG9sZF9ieXRlX2xlbiAgID0gbG9hZGVyLT5ieXRlX2xlbjsKLQotCi0gICAgICAgIEZUX0dseXBoTG9hZGVyX0FkZCggZ2xvYWRlciApOwotCi0gICAgICAgIC8qIHJlYWQgZWFjaCBzdWJnbHlwaCBpbmRlcGVuZGVudGx5ICovCi0gICAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX3N1YmdseXBoczsgbisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1ZlY3RvciAgcHBbNF07Ci0KLSAgICAgICAgICBGVF9JbnQgIGxpbmVhcl9oYWR2YW5jZTsKLSAgICAgICAgICBGVF9JbnQgIGxpbmVhcl92YWR2YW5jZTsKLQotCi0gICAgICAgICAgLyogRWFjaCB0aW1lIHdlIGNhbGwgbG9hZF90cnVldHlwZV9nbHlwaCBpbiB0aGlzIGxvb3AsIHRoZSAgICovCi0gICAgICAgICAgLyogdmFsdWUgb2YgYGdsb2FkZXIuYmFzZS5zdWJnbHlwaHMnIGNhbiBjaGFuZ2UgZHVlIHRvIHRhYmxlICovCi0gICAgICAgICAgLyogcmVhbGxvY2F0aW9ucy4gIFdlIHRodXMgbmVlZCB0byByZWNvbXB1dGUgdGhlIHN1YmdseXBoICAgICovCi0gICAgICAgICAgLyogcG9pbnRlciBvbiBlYWNoIGl0ZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgc3ViZ2x5cGggPSBnbG9hZGVyLT5iYXNlLnN1YmdseXBocyArIG51bV9iYXNlX3N1YmdzICsgbjsKLQotICAgICAgICAgIHBwWzBdID0gbG9hZGVyLT5wcDE7Ci0gICAgICAgICAgcHBbMV0gPSBsb2FkZXItPnBwMjsKLSAgICAgICAgICBwcFsyXSA9IGxvYWRlci0+cHAzOwotICAgICAgICAgIHBwWzNdID0gbG9hZGVyLT5wcDQ7Ci0KLSAgICAgICAgICBsaW5lYXJfaGFkdmFuY2UgPSBsb2FkZXItPmxpbmVhcjsKLSAgICAgICAgICBsaW5lYXJfdmFkdmFuY2UgPSBsb2FkZXItPnZhZHZhbmNlOwotCi0gICAgICAgICAgbnVtX2Jhc2VfcG9pbnRzID0gKEZUX1VJbnQpZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOwotCi0gICAgICAgICAgZXJyb3IgPSBsb2FkX3RydWV0eXBlX2dseXBoKCBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClzdWJnbHlwaC0+aW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlX2NvdW50ICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAvKiByZXN0b3JlIHN1YmdseXBoIHBvaW50ZXIgKi8KLSAgICAgICAgICBzdWJnbHlwaCA9IGdsb2FkZXItPmJhc2Uuc3ViZ2x5cGhzICsgbnVtX2Jhc2Vfc3ViZ3MgKyBuOwotCi0gICAgICAgICAgLyogcmVzdG9yZSBwaGFudG9tIHBvaW50cyBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgICBpZiAoICEoIHN1YmdseXBoLT5mbGFncyAmIFVTRV9NWV9NRVRSSUNTICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvYWRlci0+cHAxID0gcHBbMF07Ci0gICAgICAgICAgICBsb2FkZXItPnBwMiA9IHBwWzFdOwotICAgICAgICAgICAgbG9hZGVyLT5wcDMgPSBwcFsyXTsKLSAgICAgICAgICAgIGxvYWRlci0+cHA0ID0gcHBbM107Ci0KLSAgICAgICAgICAgIGxvYWRlci0+bGluZWFyICAgPSBsaW5lYXJfaGFkdmFuY2U7Ci0gICAgICAgICAgICBsb2FkZXItPnZhZHZhbmNlID0gbGluZWFyX3ZhZHZhbmNlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG51bV9wb2ludHMgPSAoRlRfVUludClnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0KLSAgICAgICAgICBpZiAoIG51bV9wb2ludHMgPT0gbnVtX2Jhc2VfcG9pbnRzICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgLyogZ2xvYWRlci0+YmFzZS5vdXRsaW5lIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzOiAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogMCAtKDEpLT4gc3RhcnRfcG9pbnQgLSgyKS0+IG51bV9iYXNlX3BvaW50cyAtKDMpLT4gbl9wb2ludHMuICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogKDEpOiBleGlzdHMgZnJvbSB0aGUgYmVnaW5uaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogKDIpOiBjb21wb25lbnRzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzbyBmYXIgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogKDMpOiB0aGUgbmV3bHkgbG9hZGVkIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgZXJyb3IgPSBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQoIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYmFzZV9wb2ludHMgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGxvYWRlci0+c3RyZWFtICAgPSBvbGRfc3RyZWFtOwotICAgICAgICBsb2FkZXItPmJ5dGVfbGVuID0gb2xkX2J5dGVfbGVuOwotCi0gICAgICAgIC8qIHByb2Nlc3MgdGhlIGdseXBoICovCi0gICAgICAgIGxvYWRlci0+aW5zX3BvcyA9IGluc19wb3M7Ci0gICAgICAgIGlmICggSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSAmJgotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotICAgICAgICAgICAgIHN1YmdseXBoLT5mbGFncyAmIFdFX0hBVkVfSU5TVFIgJiYKLSNlbmRpZgotICAgICAgICAgICAgIG51bV9wb2ludHMgPiBzdGFydF9wb2ludCApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0dseXBoKCBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfY29udG91ciApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBpbnZhbGlkIGNvbXBvc2l0ZSBjb3VudCAobmVnYXRpdmUgYnV0IG5vdCAtMSkgKi8KLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfT3V0bGluZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEV4aXQ6Ci0KLSAgICBpZiAoIG9wZW5lZF9mcmFtZSApCi0gICAgICBmYWNlLT5mb3JnZXRfZ2x5cGhfZnJhbWUoIGxvYWRlciApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgaWYgKCBnbHlwaF9kYXRhX2xvYWRlZCApCi0gICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5mcmVlX2dseXBoX2RhdGEoCi0gICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAmZ2x5cGhfZGF0YSApOwotCi0jZW5kaWYKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNvbXB1dGVfZ2x5cGhfbWV0cmljcyggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCApCi0gIHsKLSAgICBUVF9GYWNlICAgIGZhY2UgICA9IGxvYWRlci0+ZmFjZTsKLSNpZiBkZWZpbmVkIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZIHx8IFwKLSAgICBkZWZpbmVkIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0gICAgVFRfRHJpdmVyICBkcml2ZXIgPSAoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBmYWNlICk7Ci0jZW5kaWYKLQotICAgIEZUX0JCb3ggICAgICAgYmJveDsKLSAgICBGVF9GaXhlZCAgICAgIHlfc2NhbGU7Ci0gICAgVFRfR2x5cGhTbG90ICBnbHlwaCA9IGxvYWRlci0+Z2x5cGg7Ci0gICAgVFRfU2l6ZSAgICAgICBzaXplICA9IGxvYWRlci0+c2l6ZTsKLQotCi0gICAgeV9zY2FsZSA9IDB4MTAwMDBMOwotICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgICB5X3NjYWxlID0gc2l6ZS0+bWV0cmljcy0+eV9zY2FsZTsKLQotICAgIGlmICggZ2x5cGgtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFICkKLSAgICAgIEZUX091dGxpbmVfR2V0X0NCb3goICZnbHlwaC0+b3V0bGluZSwgJmJib3ggKTsKLSAgICBlbHNlCi0gICAgICBiYm94ID0gbG9hZGVyLT5iYm94OwotCi0gICAgLyogZ2V0IHRoZSBkZXZpY2UtaW5kZXBlbmRlbnQgaG9yaXpvbnRhbCBhZHZhbmNlOyBpdCBpcyBzY2FsZWQgbGF0ZXIgKi8KLSAgICAvKiBieSB0aGUgYmFzZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGdseXBoLT5saW5lYXJIb3JpQWR2YW5jZSA9IGxvYWRlci0+bGluZWFyOwotCi0gICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gYmJveC54TWluOwotICAgIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWSA9IGJib3gueU1heDsKLSAgICBnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSAgPSBsb2FkZXItPnBwMi54IC0gbG9hZGVyLT5wcDEueDsKLQotICAgIC8qIEFkanVzdCBhZHZhbmNlIHdpZHRoIHRvIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIGhkbXggdGFibGUgICAqLwotICAgIC8qIHVubGVzcyBGVF9MT0FEX0NPTVBVVEVfTUVUUklDUyBpcyBzZXQgb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotICAgIC8qIG1vZGUgb2YgdGhlIHY0MCBpbnRlcnByZXRlciBpcyBhY3RpdmUuICBTZWUgYHR0aW50ZXJwLmgnIGZvciAgICAqLwotICAgIC8qIGRldGFpbHMgb24gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICgKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgICAgICAgISggZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uID09IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fNDAgICYmCi0gICAgICAgICAgICAoIGxvYWRlci0+ZXhlYyAmJiBsb2FkZXItPmV4ZWMtPmJhY2t3YXJkX2NvbXBhdGliaWxpdHkgICkgKSAmJgotI2VuZGlmCi0gICAgICAgICAhZmFjZS0+cG9zdHNjcmlwdC5pc0ZpeGVkUGl0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICEoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfQ09NUFVURV9NRVRSSUNTICkgICAgICAgICAgICAgICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgd2lkdGhwOwotCi0KLSAgICAgIHdpZHRocCA9IHR0X2ZhY2VfZ2V0X2RldmljZV9tZXRyaWNzKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPm1ldHJpY3MtPnhfcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCApOwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLQotICAgICAgaWYgKCBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCApCi0gICAgICB7Ci0gICAgICAgIEZUX0Jvb2wgIGlnbm9yZV94X21vZGU7Ci0KLQotICAgICAgICBpZ25vcmVfeF9tb2RlID0gRlRfQk9PTCggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZGVyLT5sb2FkX2ZsYWdzICkgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX01PTk8gKTsKLQotICAgICAgICBpZiAoIHdpZHRocCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCAoIGlnbm9yZV94X21vZGUgJiYgbG9hZGVyLT5leGVjLT5jb21wYXRpYmxlX3dpZHRocyApIHx8Ci0gICAgICAgICAgICAgICAgIWlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgU1BIX09QVElPTl9CSVRNQVBfV0lEVEhTICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQotICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlID0gKndpZHRocCAqIDY0OwotICAgICAgfQotICAgICAgZWxzZQotCi0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgICAgewotICAgICAgICBpZiAoIHdpZHRocCApCi0gICAgICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPSAqd2lkdGhwICogNjQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogc2V0IGdseXBoIGRpbWVuc2lvbnMgKi8KLSAgICBnbHlwaC0+bWV0cmljcy53aWR0aCAgPSBTVUJfTE9ORyggYmJveC54TWF4LCBiYm94LnhNaW4gKTsKLSAgICBnbHlwaC0+bWV0cmljcy5oZWlnaHQgPSBTVUJfTE9ORyggYmJveC55TWF4LCBiYm94LnlNaW4gKTsKLQotICAgIC8qIE5vdyB0YWtlIGNhcmUgb2YgdmVydGljYWwgbWV0cmljcy4gIEluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzICovCi0gICAgLyogbm8gdmVydGljYWwgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBmb250IChyZWxhdGl2ZWx5IGNvbW1vbiksICAgKi8KLSAgICAvKiBjcmVhdGUgc29tZSBtZXRyaWNzIG1hbnVhbGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHsKLSAgICAgIEZUX1BvcyAgdG9wOyAgICAgIC8qIHNjYWxlZCB2ZXJ0aWNhbCB0b3Agc2lkZSBiZWFyaW5nICAqLwotICAgICAgRlRfUG9zICBhZHZhbmNlOyAgLyogc2NhbGVkIHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0ICAgICovCi0KLQotICAgICAgLyogR2V0IHRoZSB1bnNjYWxlZCB0b3AgYmVhcmluZyBhbmQgYWR2YW5jZSBoZWlnaHQuICovCi0gICAgICBpZiAoIGZhY2UtPnZlcnRpY2FsX2luZm8gICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID4gMCApCi0gICAgICB7Ci0gICAgICAgIHRvcCA9IChGVF9TaG9ydClGVF9EaXZGaXgoIGxvYWRlci0+cHAzLnkgLSBiYm94LnlNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfc2NhbGUgKTsKLQotICAgICAgICBpZiAoIGxvYWRlci0+cHAzLnkgPD0gbG9hZGVyLT5wcDQueSApCi0gICAgICAgICAgYWR2YW5jZSA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBhZHZhbmNlID0gKEZUX1VTaG9ydClGVF9EaXZGaXgoIGxvYWRlci0+cHAzLnkgLSBsb2FkZXItPnBwNC55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zY2FsZSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGhlaWdodDsKLQotCi0gICAgICAgIC8qIFhYWCBDb21wdXRlIHRvcCBzaWRlIGJlYXJpbmcgYW5kIGFkdmFuY2UgaGVpZ2h0IGluICAqLwotICAgICAgICAvKiAgICAgR2V0X1ZNZXRyaWNzIGluc3RlYWQgb2YgaGVyZS4gICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAvKiBOT1RFOiBUaGUgT1MvMiB2YWx1ZXMgYXJlIHRoZSBvbmx5IGBwb3J0YWJsZScgb25lcywgKi8KLSAgICAgICAgLyogICAgICAgd2hpY2ggaXMgd2h5IHdlIHVzZSB0aGVtLCBpZiB0aGVyZSBpcyBhbiBPUy8yICovCi0gICAgICAgIC8qICAgICAgIHRhYmxlIGluIHRoZSBmb250LiAgT3RoZXJ3aXNlLCB3ZSB1c2UgdGhlICAgICAqLwotICAgICAgICAvKiAgICAgICB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgaG9yaXpvbnRhbCBoZWFkZXIuICAgICAgKi8KLQotICAgICAgICBoZWlnaHQgPSAoRlRfU2hvcnQpRlRfRGl2Rml4KCBTVUJfTE9ORyggYmJveC55TWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJveC55TWluICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfc2NhbGUgKTsKLSAgICAgICAgaWYgKCBmYWNlLT5vczIudmVyc2lvbiAhPSAweEZGRkZVICkKLSAgICAgICAgICBhZHZhbmNlID0gKEZUX1BvcykoIGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlciApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYWR2YW5jZSA9IChGVF9Qb3MpKCBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyICk7Ci0KLSAgICAgICAgdG9wID0gKCBhZHZhbmNlIC0gaGVpZ2h0ICkgLyAyOwotICAgICAgfQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgICAgewotICAgICAgICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMqICBpbmNyOwotICAgICAgICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjICAgICBpbmNyX21ldHJpY3M7Ci0gICAgICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgIGVycm9yOwotCi0KLSAgICAgICAgaW5jciA9IGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZTsKLQotICAgICAgICAvKiBJZiB0aGlzIGlzIGFuIGluY3JlbWVudGFsbHkgbG9hZGVkIGZvbnQgc2VlIGlmIHRoZXJlIGFyZSAqLwotICAgICAgICAvKiBvdmVycmlkaW5nIG1ldHJpY3MgZm9yIHRoaXMgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGluY3IgJiYgaW5jci0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzICkKLSAgICAgICAgewotICAgICAgICAgIGluY3JfbWV0cmljcy5iZWFyaW5nX3ggPSAwOwotICAgICAgICAgIGluY3JfbWV0cmljcy5iZWFyaW5nX3kgPSB0b3A7Ci0gICAgICAgICAgaW5jcl9tZXRyaWNzLmFkdmFuY2UgICA9IGFkdmFuY2U7Ci0KLSAgICAgICAgICBlcnJvciA9IGluY3ItPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcyggaW5jci0+b2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluY3JfbWV0cmljcyApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgICAgdG9wICAgICA9IGluY3JfbWV0cmljcy5iZWFyaW5nX3k7Ci0gICAgICAgICAgYWR2YW5jZSA9IGluY3JfbWV0cmljcy5hZHZhbmNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIEdXVzogRG8gdmVydGljYWwgbWV0cmljcyBnZXQgbG9hZGVkIGluY3JlbWVudGFsbHkgdG9vPyAqLwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gICAgICBnbHlwaC0+bGluZWFyVmVydEFkdmFuY2UgPSBhZHZhbmNlOwotCi0gICAgICAvKiBzY2FsZSB0aGUgbWV0cmljcyAqLwotICAgICAgaWYgKCAhKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgKQotICAgICAgewotICAgICAgICB0b3AgICAgID0gRlRfTXVsRml4KCB0b3AsICAgICB5X3NjYWxlICk7Ci0gICAgICAgIGFkdmFuY2UgPSBGVF9NdWxGaXgoIGFkdmFuY2UsIHlfc2NhbGUgKTsKLSAgICAgIH0KLQotICAgICAgLyogWFhYOiBmb3Igbm93LCB3ZSBoYXZlIG5vIGJldHRlciBhbGdvcml0aG0gZm9yIHRoZSBsc2IsIGJ1dCBpdCAqLwotICAgICAgLyogICAgICBzaG91bGQgd29yayBmaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEJlYXJpbmdYID0gZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgLyAyOwotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEJlYXJpbmdZID0gdG9wOwotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEFkdmFuY2UgID0gYWR2YW5jZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF9zYml0X2ltYWdlKCBUVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgVFRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgICAgIGZhY2U7Ci0gICAgU0ZOVF9TZXJ2aWNlICAgICAgICBzZm50OwotICAgIEZUX1N0cmVhbSAgICAgICAgICAgc3RyZWFtOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7Ci0gICAgVFRfU0JpdF9NZXRyaWNzUmVjICBzYml0X21ldHJpY3M7Ci0KLQotICAgIGZhY2UgICA9IChUVF9GYWNlKWdseXBoLT5mYWNlOwotICAgIHNmbnQgICA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLSAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLQotICAgIGVycm9yID0gc2ZudC0+bG9hZF9zYml0X2ltYWdlKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLT5zdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaC0+Yml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JpdF9tZXRyaWNzICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGdseXBoLT5vdXRsaW5lLm5fcG9pbnRzICAgPSAwOwotICAgICAgZ2x5cGgtPm91dGxpbmUubl9jb250b3VycyA9IDA7Ci0KLSAgICAgIGdseXBoLT5tZXRyaWNzLndpZHRoICA9IChGVF9Qb3Mpc2JpdF9tZXRyaWNzLndpZHRoICAqIDY0OwotICAgICAgZ2x5cGgtPm1ldHJpY3MuaGVpZ2h0ID0gKEZUX1BvcylzYml0X21ldHJpY3MuaGVpZ2h0ICogNjQ7Ci0KLSAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IChGVF9Qb3Mpc2JpdF9tZXRyaWNzLmhvcmlCZWFyaW5nWCAqIDY0OwotICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gKEZUX1BvcylzYml0X21ldHJpY3MuaG9yaUJlYXJpbmdZICogNjQ7Ci0gICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSAgPSAoRlRfUG9zKXNiaXRfbWV0cmljcy5ob3JpQWR2YW5jZSAgKiA2NDsKLQotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEJlYXJpbmdYID0gKEZUX1BvcylzYml0X21ldHJpY3MudmVydEJlYXJpbmdYICogNjQ7Ci0gICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1kgPSAoRlRfUG9zKXNiaXRfbWV0cmljcy52ZXJ0QmVhcmluZ1kgKiA2NDsKLSAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRBZHZhbmNlICA9IChGVF9Qb3Mpc2JpdF9tZXRyaWNzLnZlcnRBZHZhbmNlICAqIDY0OwotCi0gICAgICBnbHlwaC0+Zm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKLQotICAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKQotICAgICAgewotICAgICAgICBnbHlwaC0+Yml0bWFwX2xlZnQgPSBzYml0X21ldHJpY3MudmVydEJlYXJpbmdYOwotICAgICAgICBnbHlwaC0+Yml0bWFwX3RvcCAgPSBzYml0X21ldHJpY3MudmVydEJlYXJpbmdZOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnbHlwaC0+Yml0bWFwX2xlZnQgPSBzYml0X21ldHJpY3MuaG9yaUJlYXJpbmdYOwotICAgICAgICBnbHlwaC0+Yml0bWFwX3RvcCAgPSBzYml0X21ldHJpY3MuaG9yaUJlYXJpbmdZOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfbG9hZGVyX2luaXQoIFRUX0xvYWRlciAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgVFRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgZ2x5Zl90YWJsZV9vbmx5ICkKLSAgewotICAgIFRUX0ZhY2UgICAgZmFjZTsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbTsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfQm9vbCAgICBwZWRhbnRpYyA9IEZUX0JPT0woIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1BFREFOVElDICk7Ci0jaWYgZGVmaW5lZCBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSB8fCBcCi0gICAgZGVmaW5lZCBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgIFRUX0RyaXZlciAgZHJpdmVyID0gKFRUX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggKFRUX0ZhY2UpZ2x5cGgtPmZhY2UgKTsKLSNlbmRpZgotI2VuZGlmCi0KLQotICAgIGZhY2UgICA9IChUVF9GYWNlKWdseXBoLT5mYWNlOwotICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0gICAgRlRfWkVSTyggbG9hZGVyICk7Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIC8qIGxvYWQgZXhlY3V0aW9uIGNvbnRleHQgKi8KLSAgICBpZiAoIElTX0hJTlRFRCggbG9hZF9mbGFncyApICYmICFnbHlmX3RhYmxlX29ubHkgKQotICAgIHsKLSAgICAgIFRUX0V4ZWNDb250ZXh0ICBleGVjOwotICAgICAgRlRfQm9vbCAgICAgICAgIGdyYXlzY2FsZSA9IFRSVUU7Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAgIEZUX0Jvb2wgICAgICAgICBzdWJwaXhlbF9oaW50aW5nX2xlYW47Ci0gICAgICBGVF9Cb29sICAgICAgICAgZ3JheXNjYWxlX2NsZWFydHlwZTsKLSNlbmRpZgotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAgIEZUX0Jvb2wgIHN1YnBpeGVsX2hpbnRpbmcgPSBGQUxTRTsKLQotI2lmIDAKLSAgICAgIC8qIG5vdCB1c2VkIHlldCAqLwotICAgICAgRlRfQm9vbCAgY29tcGF0aWJsZV93aWR0aHM7Ci0gICAgICBGVF9Cb29sICBzeW1tZXRyaWNhbF9zbW9vdGhpbmc7Ci0gICAgICBGVF9Cb29sICBiZ3I7Ci0gICAgICBGVF9Cb29sICB2ZXJ0aWNhbF9sY2Q7Ci0gICAgICBGVF9Cb29sICBzdWJwaXhlbF9wb3NpdGlvbmVkOwotICAgICAgRlRfQm9vbCAgZ3JheV9jbGVhcnR5cGU7Ci0jZW5kaWYKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0gICAgICBGVF9Cb29sICByZWV4ZWN1dGUgPSBGQUxTRTsKLQotCi0gICAgICBpZiAoIHNpemUtPmJ5dGVjb2RlX3JlYWR5IDwgMCB8fCBzaXplLT5jdnRfcmVhZHkgPCAwICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSB0dF9zaXplX3JlYWR5X2J5dGVjb2RlKCBzaXplLCBwZWRhbnRpYyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgKQotICAgICAgICByZXR1cm4gc2l6ZS0+Ynl0ZWNvZGVfcmVhZHk7Ci0gICAgICBlbHNlIGlmICggc2l6ZS0+Y3Z0X3JlYWR5ICkKLSAgICAgICAgcmV0dXJuIHNpemUtPmN2dF9yZWFkeTsKLQotICAgICAgLyogcXVlcnkgbmV3IGV4ZWN1dGlvbiBjb250ZXh0ICovCi0gICAgICBleGVjID0gc2l6ZS0+Y29udGV4dDsKLSAgICAgIGlmICggIWV4ZWMgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIENvdWxkX05vdF9GaW5kX0NvbnRleHQgKTsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0gICAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzQwICkKLSAgICAgIHsKLSAgICAgICAgc3VicGl4ZWxfaGludGluZ19sZWFuID0KLSAgICAgICAgICBGVF9CT09MKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0KLSAgICAgICAgICAgICAgICAgICBGVF9SRU5ERVJfTU9ERV9NT05PICAgICAgICAgICAgICAgKTsKLSAgICAgICAgZ3JheXNjYWxlX2NsZWFydHlwZSA9Ci0gICAgICAgICAgRlRfQk9PTCggc3VicGl4ZWxfaGludGluZ19sZWFuICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAhKCAoIGxvYWRfZmxhZ3MgICAgICAgICAmCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1RBUkdFVF9MQ0QgKSAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKCBsb2FkX2ZsYWdzICAgICAgICAgICAmCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1RBUkdFVF9MQ0RfViApICkgKTsKLSAgICAgICAgZXhlYy0+dmVydGljYWxfbGNkX2xlYW4gPQotICAgICAgICAgIEZUX0JPT0woIHN1YnBpeGVsX2hpbnRpbmdfbGVhbiAgICAmJgotICAgICAgICAgICAgICAgICAgICggbG9hZF9mbGFncyAgICAgICAgICAgJgotICAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9UQVJHRVRfTENEX1YgKSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdWJwaXhlbF9oaW50aW5nX2xlYW4gICA9IEZBTFNFOwotICAgICAgICBncmF5c2NhbGVfY2xlYXJ0eXBlICAgICA9IEZBTFNFOwotICAgICAgICBleGVjLT52ZXJ0aWNhbF9sY2RfbGVhbiA9IEZBTFNFOwotICAgICAgfQotI2VuZGlmCi0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotCi0gICAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICkKLSAgICAgIHsKLSAgICAgICAgc3VicGl4ZWxfaGludGluZyA9IEZUX0JPT0woICggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX01PTk8gICAgICAgICAgICAgICApICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BIX09QVElPTl9TRVRfU1VCUElYRUwgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICBpZiAoIHN1YnBpeGVsX2hpbnRpbmcgKQotICAgICAgICAgIGdyYXlzY2FsZSA9IEZBTFNFOwotICAgICAgICBlbHNlIGlmICggU1BIX09QVElPTl9TRVRfR1JBWVNDQUxFICkKLSAgICAgICAgewotICAgICAgICAgIGdyYXlzY2FsZSAgICAgICAgPSBUUlVFOwotICAgICAgICAgIHN1YnBpeGVsX2hpbnRpbmcgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgZ3JheXNjYWxlID0gRkFMU0U7Ci0KLSAgICAgICAgaWYgKCBGVF9JU19UUklDS1koIGdseXBoLT5mYWNlICkgKQotICAgICAgICAgIHN1YnBpeGVsX2hpbnRpbmcgPSBGQUxTRTsKLQotICAgICAgICBleGVjLT5pZ25vcmVfeF9tb2RlICAgICAgPSBzdWJwaXhlbF9oaW50aW5nIHx8IGdyYXlzY2FsZTsKLSAgICAgICAgZXhlYy0+cmFzdGVyaXplcl92ZXJzaW9uID0gU1BIX09QVElPTl9TRVRfUkFTVEVSSVpFUl9WRVJTSU9OOwotICAgICAgICBpZiAoIGV4ZWMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19SQVNURVJJWkVSXzM1ICkKLSAgICAgICAgICBleGVjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1OwotCi0jaWYgMQotICAgICAgICBleGVjLT5jb21wYXRpYmxlX3dpZHRocyAgICAgPSBTUEhfT1BUSU9OX1NFVF9DT01QQVRJQkxFX1dJRFRIUzsKLSAgICAgICAgZXhlYy0+c3ltbWV0cmljYWxfc21vb3RoaW5nID0gVFJVRTsKLSAgICAgICAgZXhlYy0+YmdyICAgICAgICAgICAgICAgICAgID0gRkFMU0U7Ci0gICAgICAgIGV4ZWMtPnZlcnRpY2FsX2xjZCAgICAgICAgICA9IEZBTFNFOwotICAgICAgICBleGVjLT5zdWJwaXhlbF9wb3NpdGlvbmVkICAgPSBUUlVFOwotICAgICAgICBleGVjLT5ncmF5X2NsZWFydHlwZSAgICAgICAgPSBGQUxTRTsKLSNlbHNlIC8qIDAgKi8KLSAgICAgICAgZXhlYy0+Y29tcGF0aWJsZV93aWR0aHMgPQotICAgICAgICAgIEZUX0JPT0woIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQotICAgICAgICAgICAgICAgICAgIFRUX0xPQURfQ09NUEFUSUJMRV9XSURUSFMgKTsKLSAgICAgICAgZXhlYy0+c3ltbWV0cmljYWxfc21vb3RoaW5nID0KLSAgICAgICAgICBGVF9CT09MKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0KLSAgICAgICAgICAgICAgICAgICBUVF9MT0FEX1NZTU1FVFJJQ0FMX1NNT09USElORyApOwotICAgICAgICBleGVjLT5iZ3IgPQotICAgICAgICAgIEZUX0JPT0woIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQotICAgICAgICAgICAgICAgICAgIFRUX0xPQURfQkdSICk7Ci0gICAgICAgIGV4ZWMtPnZlcnRpY2FsX2xjZCA9Ci0gICAgICAgICAgRlRfQk9PTCggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICE9Ci0gICAgICAgICAgICAgICAgICAgVFRfTE9BRF9WRVJUSUNBTF9MQ0QgKTsKLSAgICAgICAgZXhlYy0+c3VicGl4ZWxfcG9zaXRpb25lZCA9Ci0gICAgICAgICAgRlRfQk9PTCggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICE9Ci0gICAgICAgICAgICAgICAgICAgVFRfTE9BRF9TVUJQSVhFTF9QT1NJVElPTkVEICk7Ci0gICAgICAgIGV4ZWMtPmdyYXlfY2xlYXJ0eXBlID0KLSAgICAgICAgICBGVF9CT09MKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0KLSAgICAgICAgICAgICAgICAgICBUVF9MT0FEX0dSQVlfQ0xFQVJUWVBFICk7Ci0jZW5kaWYgLyogMCAqLwotCi0gICAgICB9Ci0gICAgICBlbHNlCi0KLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAgIGlmICggZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uID09IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fNDAgKQotICAgICAgICBncmF5c2NhbGUgPSBGVF9CT09MKCAhc3VicGl4ZWxfaGludGluZ19sZWFuICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUkVOREVSX01PREVfTU9OTyAgICAgICAgICAgICAgICApOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIGdyYXlzY2FsZSA9IEZUX0JPT0woIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX01PTk8gICAgICAgICAgICAgKTsKLQotICAgICAgZXJyb3IgPSBUVF9Mb2FkX0NvbnRleHQoIGV4ZWMsIGZhY2UsIHNpemUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotCi0gICAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICkKLSAgICAgIHsKLSAgICAgICAgLyogYSBjaGFuZ2UgZnJvbSBtb25vIHRvIHN1YnBpeGVsIHJlbmRlcmluZyAoYW5kIHZpY2UgdmVyc2EpICovCi0gICAgICAgIC8qIHJlcXVpcmVzIGEgcmUtZXhlY3V0aW9uIG9mIHRoZSBDVlQgcHJvZ3JhbSAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHN1YnBpeGVsX2hpbnRpbmcgIT0gZXhlYy0+c3VicGl4ZWxfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTQoKCAidHRfbG9hZGVyX2luaXQ6IHN1YnBpeGVsIGhpbnRpbmcgY2hhbmdlLCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHJlLWV4ZWN1dGluZyBgcHJlcCcgdGFibGVcbiIgKSk7Ci0KLSAgICAgICAgICBleGVjLT5zdWJwaXhlbF9oaW50aW5nID0gc3VicGl4ZWxfaGludGluZzsKLSAgICAgICAgICByZWV4ZWN1dGUgICAgICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGEgY2hhbmdlIGZyb20gbW9ubyB0byBncmF5c2NhbGUgcmVuZGVyaW5nIChhbmQgdmljZSB2ZXJzYSkgKi8KLSAgICAgICAgLyogcmVxdWlyZXMgYSByZS1leGVjdXRpb24gb2YgdGhlIENWVCBwcm9ncmFtICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGdyYXlzY2FsZSAhPSBleGVjLT5ncmF5c2NhbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggInR0X2xvYWRlcl9pbml0OiBncmF5c2NhbGUgaGludGluZyBjaGFuZ2UsIgotICAgICAgICAgICAgICAgICAgICAgICIgcmUtZXhlY3V0aW5nIGBwcmVwJyB0YWJsZVxuIiApKTsKLQotICAgICAgICAgIGV4ZWMtPmdyYXlzY2FsZSA9IGdyYXlzY2FsZTsKLSAgICAgICAgICByZWV4ZWN1dGUgICAgICAgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0KLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0gICAgICB7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgICAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzQwICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGEgY2hhbmdlIGZyb20gbW9ubyB0byBzdWJwaXhlbCByZW5kZXJpbmcgKGFuZCB2aWNlIHZlcnNhKSAqLwotICAgICAgICAgIC8qIHJlcXVpcmVzIGEgcmUtZXhlY3V0aW9uIG9mIHRoZSBDVlQgcHJvZ3JhbSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggc3VicGl4ZWxfaGludGluZ19sZWFuICE9IGV4ZWMtPnN1YnBpeGVsX2hpbnRpbmdfbGVhbiApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U0KCggInR0X2xvYWRlcl9pbml0OiBzdWJwaXhlbCBoaW50aW5nIGNoYW5nZSwiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHJlLWV4ZWN1dGluZyBgcHJlcCcgdGFibGVcbiIgKSk7Ci0KLSAgICAgICAgICAgIGV4ZWMtPnN1YnBpeGVsX2hpbnRpbmdfbGVhbiA9IHN1YnBpeGVsX2hpbnRpbmdfbGVhbjsKLSAgICAgICAgICAgIHJlZXhlY3V0ZSAgICAgICAgICAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogYSBjaGFuZ2UgZnJvbSBjb2xvcmVkIHRvIGdyYXlzY2FsZSBzdWJwaXhlbCByZW5kZXJpbmcgKGFuZCAqLwotICAgICAgICAgIC8qIHZpY2UgdmVyc2EpIHJlcXVpcmVzIGEgcmUtZXhlY3V0aW9uIG9mIHRoZSBDVlQgcHJvZ3JhbSAgICAgKi8KLSAgICAgICAgICBpZiAoIGdyYXlzY2FsZV9jbGVhcnR5cGUgIT0gZXhlYy0+Z3JheXNjYWxlX2NsZWFydHlwZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U0KCggInR0X2xvYWRlcl9pbml0OiBncmF5c2NhbGUgc3VicGl4ZWwgaGludGluZyBjaGFuZ2UsIgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZS1leGVjdXRpbmcgYHByZXAnIHRhYmxlXG4iICkpOwotCi0gICAgICAgICAgICBleGVjLT5ncmF5c2NhbGVfY2xlYXJ0eXBlID0gZ3JheXNjYWxlX2NsZWFydHlwZTsKLSAgICAgICAgICAgIHJlZXhlY3V0ZSAgICAgICAgICAgICAgICAgPSBUUlVFOwotICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgLyogYSBjaGFuZ2UgZnJvbSBtb25vIHRvIGdyYXlzY2FsZSByZW5kZXJpbmcgKGFuZCB2aWNlIHZlcnNhKSAqLwotICAgICAgICAvKiByZXF1aXJlcyBhIHJlLWV4ZWN1dGlvbiBvZiB0aGUgQ1ZUIHByb2dyYW0gICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggZ3JheXNjYWxlICE9IGV4ZWMtPmdyYXlzY2FsZSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTQoKCAidHRfbG9hZGVyX2luaXQ6IGdyYXlzY2FsZSBoaW50aW5nIGNoYW5nZSwiCi0gICAgICAgICAgICAgICAgICAgICAgIiByZS1leGVjdXRpbmcgYHByZXAnIHRhYmxlXG4iICkpOwotCi0gICAgICAgICAgZXhlYy0+Z3JheXNjYWxlID0gZ3JheXNjYWxlOwotICAgICAgICAgIHJlZXhlY3V0ZSAgICAgICA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCByZWV4ZWN1dGUgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBzaXplLT5jdnRfc2l6ZTsgaSsrICkKLSAgICAgICAgICBzaXplLT5jdnRbaV0gPSBGVF9NdWxGaXgoIGZhY2UtPmN2dFtpXSwgc2l6ZS0+dHRtZXRyaWNzLnNjYWxlICk7Ci0gICAgICAgIGVycm9yID0gdHRfc2l6ZV9ydW5fcHJlcCggc2l6ZSwgcGVkYW50aWMgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBjdnQgcHJvZ3JhbSBoYXMgZGlzYWJsZWQgaGludGluZyAqLwotICAgICAgaWYgKCBleGVjLT5HUy5pbnN0cnVjdF9jb250cm9sICYgMSApCi0gICAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOwotCi0gICAgICAvKiBsb2FkIGRlZmF1bHQgZ3JhcGhpY3Mgc3RhdGUgLS0gaWYgbmVlZGVkICovCi0gICAgICBpZiAoIGV4ZWMtPkdTLmluc3RydWN0X2NvbnRyb2wgJiAyICkKLSAgICAgICAgZXhlYy0+R1MgPSB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlOwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIGZvbnQgaGludGVkIGZvciBDbGVhclR5cGUgLS0gICAgICAgICAgICovCi0gICAgICAvKiBub3RlIHRoYXQgdGhpcyBmbGFnIGNhbiBhbHNvIGJlIG1vZGlmaWVkIGluIGEgZ2x5cGgncyBieXRlY29kZSAqLwotICAgICAgaWYgKCBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCAmJgotICAgICAgICAgICBleGVjLT5HUy5pbnN0cnVjdF9jb250cm9sICYgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIGV4ZWMtPmlnbm9yZV94X21vZGUgPSAwOwotI2VuZGlmCi0KLSAgICAgIGV4ZWMtPnBlZGFudGljX2hpbnRpbmcgPSBGVF9CT09MKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9QRURBTlRJQyApOwotICAgICAgbG9hZGVyLT5leGVjID0gZXhlYzsKLSAgICAgIGxvYWRlci0+aW5zdHJ1Y3Rpb25zID0gZXhlYy0+Z2x5cGhJbnM7Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICAvKiBnZXQgZmFjZSdzIGdseXBoIGxvYWRlciAqLwotICAgIGlmICggIWdseWZfdGFibGVfb25seSApCi0gICAgewotICAgICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgPSBnbHlwaC0+aW50ZXJuYWwtPmxvYWRlcjsKLQotCi0gICAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGdsb2FkZXIgKTsKLSAgICAgIGxvYWRlci0+Z2xvYWRlciA9IGdsb2FkZXI7Ci0gICAgfQotCi0gICAgbG9hZGVyLT5sb2FkX2ZsYWdzID0gKEZUX1VMb25nKWxvYWRfZmxhZ3M7Ci0KLSAgICBsb2FkZXItPmZhY2UgICA9IGZhY2U7Ci0gICAgbG9hZGVyLT5zaXplICAgPSBzaXplOwotICAgIGxvYWRlci0+Z2x5cGggID0gKEZUX0dseXBoU2xvdClnbHlwaDsKLSAgICBsb2FkZXItPnN0cmVhbSA9IHN0cmVhbTsKLQotICAgIGxvYWRlci0+Y29tcG9zaXRlcy5oZWFkID0gTlVMTDsKLSAgICBsb2FkZXItPmNvbXBvc2l0ZXMudGFpbCA9IE5VTEw7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICB0dF9sb2FkZXJfZG9uZSggVFRfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfTGlzdF9GaW5hbGl6ZSggJmxvYWRlci0+Y29tcG9zaXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+ZmFjZS0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgTlVMTCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gbG9hZCBhIHNpbmdsZSBnbHlwaCB3aXRoaW4gYSBnaXZlbiBnbHlwaCBzbG90LCAgKi8KLSAgLyogICAgZm9yIGEgZ2l2ZW4gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggICAgICAgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgc2xvdCBvYmplY3Qgd2hlcmUgdGhlIGdseXBoICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIHNpemUgYXQgd2hpY2ggdGhlIGdseXBoICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG11c3QgYmUgc2NhbGVkL2xvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCBpbiB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgRlRfTE9BRF9YWFggY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfTG9hZF9HbHlwaCggVFRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICBUVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBUVF9Mb2FkZXJSZWMgIGxvYWRlcjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNkZWZpbmUgSVNfREVGQVVMVF9JTlNUQU5DRSAgKCAoIChUVF9GYWNlKWdseXBoLT5mYWNlICktPmlzX2RlZmF1bHRfaW5zdGFuY2UgKQotI2Vsc2UKLSNkZWZpbmUgSVNfREVGQVVMVF9JTlNUQU5DRSAgMQotI2VuZGlmCi0KLQotICAgIEZUX1RSQUNFMSgoICJUVF9Mb2FkX0dseXBoOiBnbHlwaCBpbmRleCAlZFxuIiwgZ2x5cGhfaW5kZXggKSk7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICAgIC8qIHRyeSB0byBsb2FkIGVtYmVkZGVkIGJpdG1hcCAoaWYgYW55KSAqLwotICAgIGlmICggc2l6ZS0+c3RyaWtlX2luZGV4ICE9IDB4RkZGRkZGRkZVTCAgICAgICYmCi0gICAgICAgICAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0JJVE1BUCApID09IDAgJiYKLSAgICAgICAgIElTX0RFRkFVTFRfSU5TVEFOQ0UgICAgICAgICAgICAgICAgICAgICApCi0gICAgewotICAgICAgZXJyb3IgPSBsb2FkX3NiaXRfaW1hZ2UoIHNpemUsIGdseXBoLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIC8qIHJldHVybiBlcnJvciBpZiBmb250IGlzIG5vdCBzY2FsYWJsZSAqLwotICAgICAgICBpZiAoICFGVF9JU19TQ0FMQUJMRSggZ2x5cGgtPmZhY2UgKSApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIEZUX0lTX1NDQUxBQkxFKCBnbHlwaC0+ZmFjZSApICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGZvciB0aGUgYmJveCB3ZSBuZWVkIHRoZSBoZWFkZXIgb25seSAqLwotICAgICAgICAgICh2b2lkKXR0X2xvYWRlcl9pbml0KCAmbG9hZGVyLCBzaXplLCBnbHlwaCwgbG9hZF9mbGFncywgVFJVRSApOwotICAgICAgICAgICh2b2lkKWxvYWRfdHJ1ZXR5cGVfZ2x5cGgoICZsb2FkZXIsIGdseXBoX2luZGV4LCAwLCBUUlVFICk7Ci0gICAgICAgICAgdHRfbG9hZGVyX2RvbmUoICZsb2FkZXIgKTsKLSAgICAgICAgICBnbHlwaC0+bGluZWFySG9yaUFkdmFuY2UgPSBsb2FkZXIubGluZWFyOwotICAgICAgICAgIGdseXBoLT5saW5lYXJWZXJ0QWR2YW5jZSA9IGxvYWRlci52YWR2YW5jZTsKLQotICAgICAgICAgIC8qIHNhbml0eSBjaGVja3M6IGlmIGB4eHhBZHZhbmNlJyBpbiB0aGUgc2JpdCBtZXRyaWMgKi8KLSAgICAgICAgICAvKiBzdHJ1Y3R1cmUgaXNuJ3Qgc2V0LCB1c2UgYGxpbmVhclhYWEFkdmFuY2UnICAgICAgKi8KLSAgICAgICAgICBpZiAoICFnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSAmJiBnbHlwaC0+bGluZWFySG9yaUFkdmFuY2UgKQotICAgICAgICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPQotICAgICAgICAgICAgICBGVF9NdWxGaXgoIGdseXBoLT5saW5lYXJIb3JpQWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLT5tZXRyaWNzLT54X3NjYWxlICk7Ci0gICAgICAgICAgaWYgKCAhZ2x5cGgtPm1ldHJpY3MudmVydEFkdmFuY2UgJiYgZ2x5cGgtPmxpbmVhclZlcnRBZHZhbmNlICkKLSAgICAgICAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRBZHZhbmNlID0KLSAgICAgICAgICAgICAgRlRfTXVsRml4KCBnbHlwaC0+bGluZWFyVmVydEFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+bWV0cmljcy0+eV9zY2FsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotICAgIC8qIGlmIEZUX0xPQURfTk9fU0NBTEUgaXMgbm90IHNldCwgYHR0bWV0cmljcycgbXVzdCBiZSB2YWxpZCAqLwotICAgIGlmICggISggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSAmJiAhc2l6ZS0+dHRtZXRyaWNzLnZhbGlkICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1NpemVfSGFuZGxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9TQklUU19PTkxZICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZXJyb3IgPSB0dF9sb2FkZXJfaW5pdCggJmxvYWRlciwgc2l6ZSwgZ2x5cGgsIGxvYWRfZmxhZ3MsIEZBTFNFICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBnbHlwaC0+Zm9ybWF0ICAgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotICAgIGdseXBoLT5udW1fc3ViZ2x5cGhzID0gMDsKLSAgICBnbHlwaC0+b3V0bGluZS5mbGFncyA9IDA7Ci0KLSAgICAvKiBtYWluIGxvYWRpbmcgbG9vcCAqLwotICAgIGVycm9yID0gbG9hZF90cnVldHlwZV9nbHlwaCggJmxvYWRlciwgZ2x5cGhfaW5kZXgsIDAsIEZBTFNFICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggZ2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFICkKLSAgICAgIHsKLSAgICAgICAgZ2x5cGgtPm51bV9zdWJnbHlwaHMgPSBsb2FkZXIuZ2xvYWRlci0+YmFzZS5udW1fc3ViZ2x5cGhzOwotICAgICAgICBnbHlwaC0+c3ViZ2x5cGhzICAgICA9IGxvYWRlci5nbG9hZGVyLT5iYXNlLnN1YmdseXBoczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2x5cGgtPm91dGxpbmUgICAgICAgID0gbG9hZGVyLmdsb2FkZXItPmJhc2Uub3V0bGluZTsKLSAgICAgICAgZ2x5cGgtPm91dGxpbmUuZmxhZ3MgJj0gfkZUX09VVExJTkVfU0lOR0xFX1BBU1M7Ci0KLSAgICAgICAgLyogVHJhbnNsYXRlIGFycmF5IHNvIHRoYXQgKDAsMCkgaXMgdGhlIGdseXBoJ3Mgb3JpZ2luLiAgTm90ZSAgKi8KLSAgICAgICAgLyogdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBpbmRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YgYml0IDEgb2YgKi8KLSAgICAgICAgLyogdGhlIGBmbGFncycgZmllbGQgaW4gdGhlIGBoZWFkJyB0YWJsZSAtLSBhdCBsZWFzdCBtYWpvciAgICAgKi8KLSAgICAgICAgLyogYXBwbGljYXRpb25zIGxpa2UgQWNyb3JlYWQgaW5kaWNhdGUgdGhhdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBsb2FkZXIucHAxLnggKQotICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmZ2x5cGgtPm91dGxpbmUsIC1sb2FkZXIucHAxLngsIDAgKTsKLSAgICAgIH0KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgICBpZiAoIElTX0hJTlRFRCggbG9hZF9mbGFncyApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBsb2FkZXIuZXhlYy0+R1Muc2Nhbl9jb250cm9sICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGNvbnZlcnQgc2NhbiBjb252ZXJzaW9uIG1vZGUgdG8gRlRfT1VUTElORV9YWFggZmxhZ3MgKi8KLSAgICAgICAgICBzd2l0Y2ggKCBsb2FkZXIuZXhlYy0+R1Muc2Nhbl90eXBlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwOiAvKiBzaW1wbGUgZHJvcC1vdXRzIGluY2x1ZGluZyBzdHVicyAqLwotICAgICAgICAgICAgZ2x5cGgtPm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9JTkNMVURFX1NUVUJTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxOiAvKiBzaW1wbGUgZHJvcC1vdXRzIGV4Y2x1ZGluZyBzdHVicyAqLwotICAgICAgICAgICAgLyogbm90aGluZzsgaXQncyB0aGUgZGVmYXVsdCByZW5kZXJpbmcgbW9kZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA0OiAvKiBzbWFydCBkcm9wLW91dHMgaW5jbHVkaW5nIHN0dWJzICovCi0gICAgICAgICAgICBnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX09VVExJTkVfSU5DTFVERV9TVFVCUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgNTogLyogc21hcnQgZHJvcC1vdXRzIGV4Y2x1ZGluZyBzdHVicyAgKi8KLSAgICAgICAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzIHw9IEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6IC8qIG5vIGRyb3Atb3V0IGNvbnRyb2wgKi8KLSAgICAgICAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzIHw9IEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUzsKLSAgICAgIH0KLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gICAgICBlcnJvciA9IGNvbXB1dGVfZ2x5cGhfbWV0cmljcyggJmxvYWRlciwgZ2x5cGhfaW5kZXggKTsKLSAgICB9Ci0KLSAgICB0dF9sb2FkZXJfZG9uZSggJmxvYWRlciApOwotCi0gICAgLyogU2V0IHRoZSBgaGlnaCBwcmVjaXNpb24nIGJpdCBmbGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhpcyBpcyBfY3JpdGljYWxfIHRvIGdldCBjb3JyZWN0IG91dHB1dCBmb3IgbW9ub2Nocm9tZSAgICAgICovCi0gICAgLyogVHJ1ZVR5cGUgZ2x5cGhzIGF0IGFsbCBzaXplcyB1c2luZyB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApICYmCi0gICAgICAgICBzaXplLT5tZXRyaWNzLT55X3BwZW0gPCAyNCAgICAgICAgICkKLSAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzIHw9IEZUX09VVExJTkVfSElHSF9QUkVDSVNJT047Ci0KLSAgRXhpdDoKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfVFJBQ0UxKCggIiAgZmFpbGVkIChlcnJvciBjb2RlIDB4JXgpXG4iLAotICAgICAgICAgICAgICAgICAgZXJyb3IgKSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0Z2xvYWQuaCBiL3NyYy90cnVldHlwZS90dGdsb2FkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDZjODQuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0Z2xvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Z2xvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUVEdMT0FEX0hfCi0jZGVmaW5lIFRUR0xPQURfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJ0dG9ianMuaCIKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotI2luY2x1ZGUgInR0aW50ZXJwLmgiCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVFRfSW5pdF9HbHlwaF9Mb2FkaW5nKCBUVF9GYWNlICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUVF9HZXRfSE1ldHJpY3MoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgIGxzYiwKLSAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhdyApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVFRfR2V0X1ZNZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5TWF4LAotICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgIHRzYiwKLSAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhaCApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX0xvYWRfR2x5cGgoIFRUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgVFRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVFRHTE9BRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyBiL3NyYy90cnVldHlwZS90dGd4dmFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDQ5NzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0Z3h2YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRneHZhci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIEdYIEZvbnQgVmFyaWF0aW9uIGxvYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZywgYW5kIEdlb3JnZSBXaWxsaWFtcy4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQXBwbGUgZG9jdW1lbnRzIHRoZSBgZnZhcicsIGBndmFyJywgYGN2YXInLCBhbmQgYGF2YXInIHRhYmxlcyBhdCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZbZmdjYV12YXIuaHRtbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGRvY3VtZW50YXRpb24gZm9yIGBndmFyJyBpcyBub3QgaW50ZWxsaWdpYmxlOyBgY3ZhcicgcmVmZXJzIHlvdSAgICovCi0gIC8qIHRvIGBndmFyJyBhbmQgaXMgdGh1cyBhbHNvIGluY29tcHJlaGVuc2libGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGRvY3VtZW50YXRpb24gZm9yIGBhdmFyJyBhcHBlYXJzIGNvcnJlY3QsIGJ1dCBBcHBsZSBoYXMgbm8gZm9udHMgICovCi0gIC8qIHdpdGggYW4gYGF2YXInIHRhYmxlLCBzbyBpdCBpcyBoYXJkIHRvIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWFueSB0aGFua3MgdG8gSm9obiBKZW5raW5zIChhdCBBcHBsZSkgaW4gZmlndXJpbmcgdGhpcyBvdXQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQXBwbGUncyBga2VybicgdGFibGUgaGFzIHNvbWUgcmVmZXJlbmNlcyB0byB0dXBsZSBpbmRpY2VzLCBidXQgYXMgICAgICovCi0gIC8qIHRoZXJlIGlzIG5vIGluZGljYXRpb24gd2hlcmUgdGhlc2UgaW5kaWNlcyBhcmUgZGVmaW5lZCwgbm9yIGhvdyB0byAgICAqLwotICAvKiBpbnRlcnBvbGF0ZSB0aGUga2VybmluZyB2YWx1ZXMgKGRpZmZlcmVudCB0dXBsZXMgaGF2ZSBkaWZmZXJlbnQgICAgICAgKi8KLSAgLyogY2xhc3NlcykgdGhpcyBpc3N1ZSBpcyBpZ25vcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9MSVNUX0gKLQotI2luY2x1ZGUgInR0cGxvYWQuaCIKLSNpbmNsdWRlICJ0dGd4dmFyLmgiCi0KLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLQotI2RlZmluZSBGVF9TdHJlYW1fRlRlbGwoIHN0cmVhbSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoRlRfVUxvbmcpKCAoc3RyZWFtKS0+Y3Vyc29yIC0gKHN0cmVhbSktPmJhc2UgKQotI2RlZmluZSBGVF9TdHJlYW1fU2Vla1NldCggc3RyZWFtLCBvZmYgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChzdHJlYW0pLT5jdXJzb3IgPSAoc3RyZWFtKS0+YmFzZSArIChvZmYpICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0Z3h2YXIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWwgUm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gQUxMX1BPSU5UUyBpcyB1c2VkIGluIGBmdF92YXJfcmVhZHBhY2tlZHBvaW50cycuICBJdCAgICAgICAgKi8KLSAgLyogaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBkZWx0YSBmb3IgZXZlcnkgcG9pbnQgd2l0aG91dCBuZWVkaW5nIHRvICAgICovCi0gIC8qIGVudW1lcmF0ZSBhbGwgb2YgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBlbnN1cmUgdGhhdCB2YWx1ZSBgMCcgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIGEgcG9pbnRlciAqLwotI2RlZmluZSBBTExfUE9JTlRTICAoRlRfVVNob3J0Kil+KEZUX1B0ckRpc3QpMAotCi0KLSNkZWZpbmUgR1hfUFRfUE9JTlRTX0FSRV9XT1JEUyAgICAgIDB4ODBVCi0jZGVmaW5lIEdYX1BUX1BPSU5UX1JVTl9DT1VOVF9NQVNLICAweDdGVQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVhZCBhIHNldCBvZiBwb2ludHMgdG8gd2hpY2ggdGhlIGZvbGxvd2luZyBkZWx0YXMgd2lsbCBhcHBseS4gICAgICovCi0gIC8qICAgIFBvaW50cyBhcmUgcGFja2VkIHdpdGggYSBydW4gbGVuZ3RoIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICA6OiBUaGUgZGF0YSBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgIDo6IFRoZSBzaXplIG9mIHRoZSB0YWJsZSBob2xkaW5nIHRoZSBkYXRhLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRfY250IDo6IFRoZSBudW1iZXIgb2YgcG9pbnRzIHJlYWQuICBBIHplcm8gdmFsdWUgbWVhbnMgdGhhdCAgICovCi0gIC8qICAgICAgICAgICAgICAgICBhbGwgcG9pbnRzIGluIHRoZSBnbHlwaCB3aWxsIGJlIGFmZmVjdGVkLCB3aXRob3V0ICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZW51bWVyYXRpbmcgdGhlbSBpbmRpdmlkdWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBhcnJheSBvZiBGVF9VU2hvcnQgY29udGFpbmluZyB0aGUgYWZmZWN0ZWQgcG9pbnRzIG9yIHRoZSAgICAgICAgKi8KLSAgLyogICAgc3BlY2lhbCB2YWx1ZSBBTExfUE9JTlRTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfVVNob3J0KgotICBmdF92YXJfcmVhZHBhY2tlZHBvaW50cyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKnBvaW50X2NudCApCi0gIHsKLSAgICBGVF9VU2hvcnQgKnBvaW50cyA9IE5VTEw7Ci0gICAgRlRfVUludCAgICBuOwotICAgIEZUX1VJbnQgICAgcnVuY250OwotICAgIEZUX1VJbnQgICAgaSwgajsKLSAgICBGVF9VU2hvcnQgIGZpcnN0OwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLSAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0KLQotICAgICpwb2ludF9jbnQgPSAwOwotCi0gICAgbiA9IEZUX0dFVF9CWVRFKCk7Ci0gICAgaWYgKCBuID09IDAgKQotICAgICAgcmV0dXJuIEFMTF9QT0lOVFM7Ci0KLSAgICBpZiAoIG4gJiBHWF9QVF9QT0lOVFNfQVJFX1dPUkRTICkKLSAgICB7Ci0gICAgICBuICAmPSBHWF9QVF9QT0lOVF9SVU5fQ09VTlRfTUFTSzsKLSAgICAgIG4gPDw9IDg7Ci0gICAgICBuICB8PSBGVF9HRVRfQllURSgpOwotICAgIH0KLQotICAgIGlmICggbiA+IHNpemUgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJmdF92YXJfcmVhZHBhY2tlZHBvaW50czogbnVtYmVyIG9mIHBvaW50cyB0b28gbGFyZ2VcbiIgKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBpbiB0aGUgbmVzdGVkIGxvb3BzIGJlbG93IHdlIGluY3JlYXNlIGBpJyB0d2ljZTsgKi8KLSAgICAvKiBpdCBpcyBmYXN0ZXIgdG8gc2ltcGx5IGFsbG9jYXRlIG9uZSBtb3JlIHNsb3QgICAgKi8KLSAgICAvKiB0aGFuIHRvIGFkZCBhbm90aGVyIHRlc3Qgd2l0aGluIHRoZSBsb29wICAgICAgICAgKi8KLSAgICBpZiAoIEZUX05FV19BUlJBWSggcG9pbnRzLCBuICsgMSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgKnBvaW50X2NudCA9IG47Ci0KLSAgICBmaXJzdCA9IDA7Ci0gICAgaSAgICAgPSAwOwotICAgIHdoaWxlICggaSA8IG4gKQotICAgIHsKLSAgICAgIHJ1bmNudCA9IEZUX0dFVF9CWVRFKCk7Ci0gICAgICBpZiAoIHJ1bmNudCAmIEdYX1BUX1BPSU5UU19BUkVfV09SRFMgKQotICAgICAgewotICAgICAgICBydW5jbnQgICAgICY9IEdYX1BUX1BPSU5UX1JVTl9DT1VOVF9NQVNLOwotICAgICAgICBmaXJzdCAgICAgICs9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgcG9pbnRzW2krK10gPSBmaXJzdDsKLQotICAgICAgICAvKiBmaXJzdCBwb2ludCBub3QgaW5jbHVkZWQgaW4gcnVuIGNvdW50ICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgcnVuY250OyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3QgICAgICArPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgICAgICAgcG9pbnRzW2krK10gPSBmaXJzdDsKLSAgICAgICAgICBpZiAoIGkgPj0gbiApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdCAgICAgICs9IEZUX0dFVF9CWVRFKCk7Ci0gICAgICAgIHBvaW50c1tpKytdID0gZmlyc3Q7Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBydW5jbnQ7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdCAgICAgICs9IEZUX0dFVF9CWVRFKCk7Ci0gICAgICAgICAgcG9pbnRzW2krK10gPSBmaXJzdDsKLSAgICAgICAgICBpZiAoIGkgPj0gbiApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBwb2ludHM7Ci0gIH0KLQotCi0jZGVmaW5lIEdYX0RUX0RFTFRBU19BUkVfWkVSTyAgICAgICAweDgwVQotI2RlZmluZSBHWF9EVF9ERUxUQVNfQVJFX1dPUkRTICAgICAgMHg0MFUKLSNkZWZpbmUgR1hfRFRfREVMVEFfUlVOX0NPVU5UX01BU0sgIDB4M0ZVCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF92YXJfcmVhZHBhY2tlZGRlbHRhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZWFkIGEgc2V0IG9mIGRlbHRhcy4gIFRoZXNlIGFyZSBwYWNrZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdGhhbiAgKi8KLSAgLyogICAgcG9pbnRzLiAgSW4gcGFydGljdWxhciB0aGVyZSBpcyBubyBvdmVyYWxsIGNvdW50LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgIDo6IFRoZSBkYXRhIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgOjogVGhlIHNpemUgb2YgdGhlIHRhYmxlIGhvbGRpbmcgdGhlIGRhdGEuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhX2NudCA6OiBUaGUgbnVtYmVyIG9mIGRlbHRhcyB0byBiZSByZWFkLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGFycmF5IG9mIEZUX1Nob3J0IGNvbnRhaW5pbmcgdGhlIGRlbHRhcyBmb3IgdGhlIGFmZmVjdGVkICAgICAgICAqLwotICAvKiAgICBwb2ludHMuICAoVGhpcyBvbmx5IGdldHMgdGhlIGRlbHRhcyBmb3Igb25lIGRpbWVuc2lvbi4gIEl0IHdpbGwgICAgKi8KLSAgLyogICAgZ2VuZXJhbGx5IGJlIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgeCwgb25jZSBmb3IgeS4gIFdoZW4gdXNlZCBpbiAgICovCi0gIC8qICAgIGN2dCB0YWJsZSwgaXQgd2lsbCBvbmx5IGJlIGNhbGxlZCBvbmNlLikgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX1Nob3J0KgotICBmdF92YXJfcmVhZHBhY2tlZGRlbHRhcyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRlbHRhX2NudCApCi0gIHsKLSAgICBGVF9TaG9ydCAgKmRlbHRhcyA9IE5VTEw7Ci0gICAgRlRfVUludCAgICBydW5jbnQsIGNudDsKLSAgICBGVF9VSW50ICAgIGksIGo7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgaWYgKCBkZWx0YV9jbnQgPiBzaXplICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAiZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXM6IG51bWJlciBvZiBwb2ludHMgdG9vIGxhcmdlXG4iICkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGRlbHRhcywgZGVsdGFfY250ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpID0gMDsKLSAgICB3aGlsZSAoIGkgPCBkZWx0YV9jbnQgKQotICAgIHsKLSAgICAgIHJ1bmNudCA9IEZUX0dFVF9CWVRFKCk7Ci0gICAgICBjbnQgICAgPSBydW5jbnQgJiBHWF9EVF9ERUxUQV9SVU5fQ09VTlRfTUFTSzsKLQotICAgICAgaWYgKCBydW5jbnQgJiBHWF9EVF9ERUxUQVNfQVJFX1pFUk8gKQotICAgICAgewotICAgICAgICAvKiBgcnVuY250JyB6ZXJvZXMgZ2V0IGFkZGVkICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDw9IGNudCAmJiBpIDwgZGVsdGFfY250OyBqKysgKQotICAgICAgICAgIGRlbHRhc1tpKytdID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBydW5jbnQgJiBHWF9EVF9ERUxUQVNfQVJFX1dPUkRTICkKLSAgICAgIHsKLSAgICAgICAgLyogYHJ1bmNudCcgc2hvcnRzIGZyb20gdGhlIHN0YWNrICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDw9IGNudCAmJiBpIDwgZGVsdGFfY250OyBqKysgKQotICAgICAgICAgIGRlbHRhc1tpKytdID0gRlRfR0VUX1NIT1JUKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGBydW5jbnQnIHNpZ25lZCBieXRlcyBmcm9tIHRoZSBzdGFjayAqLwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8PSBjbnQgJiYgaSA8IGRlbHRhX2NudDsgaisrICkKLSAgICAgICAgICBkZWx0YXNbaSsrXSA9IEZUX0dFVF9DSEFSKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggaiA8PSBjbnQgKQotICAgICAgewotICAgICAgICAvKiBiYWQgZm9ybWF0ICovCi0gICAgICAgIEZUX0ZSRUUoIGRlbHRhcyApOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZGVsdGFzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF92YXJfbG9hZF9hdmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQYXJzZSB0aGUgYGF2YXInIHRhYmxlIGlmIHByZXNlbnQuICBJdCBuZWVkIG5vdCBiZSwgc28gd2UgcmV0dXJuICAgKi8KLSAgLyogICAgbm90aGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBmdF92YXJfbG9hZF9hdmFyKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgICAgICBzdHJlYW0gPSBGVF9GQUNFX1NUUkVBTSggZmFjZSApOwotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBHWF9CbGVuZCAgICAgICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0gICAgR1hfQVZhclNlZ21lbnQgIHNlZ21lbnQ7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0xvbmcgICAgICAgICB2ZXJzaW9uOwotICAgIEZUX0xvbmcgICAgICAgICBheGlzQ291bnQ7Ci0gICAgRlRfSW50ICAgICAgICAgIGksIGo7Ci0gICAgRlRfVUxvbmcgICAgICAgIHRhYmxlX2xlbjsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgRlRfVFJBQ0UyKCggIkFWQVIgIiApKTsKLQotICAgIGJsZW5kLT5hdmFyX2xvYWRlZCA9IFRSVUU7Ci0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2F2YXIsIHN0cmVhbSwgJnRhYmxlX2xlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nXG4iICkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIHRhYmxlX2xlbiApICkKLSAgICAgIHJldHVybjsKLQotICAgIHZlcnNpb24gICA9IEZUX0dFVF9MT05HKCk7Ci0gICAgYXhpc0NvdW50ID0gRlRfR0VUX0xPTkcoKTsKLQotICAgIGlmICggdmVyc2lvbiAhPSAweDAwMDEwMDAwTCApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImJhZCB0YWJsZSB2ZXJzaW9uXG4iICkpOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7Ci0KLSAgICBpZiAoIGF4aXNDb3VudCAhPSAoRlRfTG9uZylibGVuZC0+bW12YXItPm51bV9heGlzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiZnRfdmFyX2xvYWRfYXZhcjogbnVtYmVyIG9mIGF4ZXMgaW4gYGF2YXInIGFuZCBgZnZhcidcbiIKLSAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICB0YWJsZSBhcmUgZGlmZmVyZW50XG4iICkpOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+YXZhcl9zZWdtZW50LCBheGlzQ291bnQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzZWdtZW50ID0gJmJsZW5kLT5hdmFyX3NlZ21lbnRbMF07Ci0gICAgZm9yICggaSA9IDA7IGkgPCBheGlzQ291bnQ7IGkrKywgc2VnbWVudCsrICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTUoKCAiICBheGlzICVkOlxuIiwgaSApKTsKLQotICAgICAgc2VnbWVudC0+cGFpckNvdW50ID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgaWYgKCAoRlRfVUxvbmcpc2VnbWVudC0+cGFpckNvdW50ICogNCA+IHRhYmxlX2xlbiAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9ORVdfQVJSQVkoIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlLCBzZWdtZW50LT5wYWlyQ291bnQgKSApCi0gICAgICB7Ci0gICAgICAgIC8qIEZhaWx1cmUuICBGcmVlIGV2ZXJ5dGhpbmcgd2UgaGF2ZSBkb25lIHNvIGZhci4gIFdlIG11c3QgZG8gKi8KLSAgICAgICAgLyogaXQgcmlnaHQgbm93IHNpbmNlIGxvYWRpbmcgdGhlIGBhdmFyJyB0YWJsZSBpcyBvcHRpb25hbC4gICAqLwotCi0gICAgICAgIGZvciAoIGogPSBpIC0gMTsgaiA+PSAwOyBqLS0gKQotICAgICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5hdmFyX3NlZ21lbnRbal0uY29ycmVzcG9uZGVuY2UgKTsKLQotICAgICAgICBGVF9GUkVFKCBibGVuZC0+YXZhcl9zZWdtZW50ICk7Ci0gICAgICAgIGJsZW5kLT5hdmFyX3NlZ21lbnQgPSBOVUxMOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIGogPSAwOyBqIDwgc2VnbWVudC0+cGFpckNvdW50OyBqKysgKQotICAgICAgewotICAgICAgICAvKiBjb252ZXJ0IHRvIEZpeGVkICovCi0gICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCA9IEZUX0dFVF9TSE9SVCgpICogNDsKLSAgICAgICAgc2VnbWVudC0+Y29ycmVzcG9uZGVuY2Vbal0udG9Db29yZCAgID0gRlRfR0VUX1NIT1JUKCkgKiA0OwotCi0gICAgICAgIEZUX1RSQUNFNSgoICIgICAgbWFwcGluZyAlLjVmIHRvICUuNWZcbiIsCi0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCAvIDY1NTM2LjAsCi0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLnRvQ29vcmQgLyA2NTUzNi4wICkpOwotICAgICAgfQotCi0gICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwotICAgIH0KLQotICBFeGl0OgotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgfQotCi0KLSAgLyogc29tZSBtYWNyb3Mgd2UgbmVlZCAqLwotICAjZGVmaW5lIEZUX0ZJWEVEX09ORSAgKCAoRlRfRml4ZWQpMHgxMDAwMCApCi0KLSAgI2RlZmluZSBGVF9mZG90MTRUb0ZpeGVkKCB4ICkgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKEZUX0ZpeGVkKSggKEZUX1VMb25nKSh4KSA8PCAyICkgKQotICAjZGVmaW5lIEZUX2ludFRvRml4ZWQoIGkgKSAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKEZUX0ZpeGVkKSggKEZUX1VMb25nKShpKSA8PCAxNiApICkKLSAgI2RlZmluZSBGVF9maXhlZFRvSW50KCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChGVF9TaG9ydCkoICggKEZUX1VJbnQzMikoeCkgKyAweDgwMDBVICkgPj4gMTYgKSApCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfdmFyX2xvYWRfaXRlbV92YXJpYXRpb25fc3RvcmUoIFRUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hfSXRlbVZhclN0b3JlICBpdGVtU3RvcmUgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBGVF9GQUNFX1NUUkVBTSggZmFjZSApOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1VTaG9ydCAgZm9ybWF0OwotICAgIEZUX1VMb25nICAgcmVnaW9uX29mZnNldDsKLSAgICBGVF9VSW50ICAgIGksIGosIGs7Ci0gICAgRlRfVUludCAgICBzaG9ydERlbHRhQ291bnQ7Ci0KLSAgICBHWF9CbGVuZCAgICAgICAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKLSAgICBHWF9JdGVtVmFyRGF0YSAgdmFyRGF0YTsKLQotICAgIEZUX1VMb25nKiAgZGF0YU9mZnNldEFycmF5ID0gTlVMTDsKLQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgfHwKLSAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBmb3JtYXQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGZvcm1hdCAhPSAxICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiZnRfdmFyX2xvYWRfaXRlbV92YXJpYXRpb25fc3RvcmU6IGJhZCBzdG9yZSBmb3JtYXQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICBmb3JtYXQgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogcmVhZCB0b3AgbGV2ZWwgZmllbGRzICovCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HKCByZWdpb25fb2Zmc2V0ICkgICAgICAgICB8fAotICAgICAgICAgRlRfUkVBRF9VU0hPUlQoIGl0ZW1TdG9yZS0+ZGF0YUNvdW50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogd2UgbmVlZCBhdCBsZWFzdCBvbmUgZW50cnkgaW4gYGl0ZW1TdG9yZS0+dmFyRGF0YScgKi8KLSAgICBpZiAoICFpdGVtU3RvcmUtPmRhdGFDb3VudCApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImZ0X3Zhcl9sb2FkX2l0ZW1fdmFyaWF0aW9uX3N0b3JlOiBtaXNzaW5nIHZhckRhdGFcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbWFrZSB0ZW1wb3JhcnkgY29weSBvZiBpdGVtIHZhcmlhdGlvbiBkYXRhIG9mZnNldHM7ICovCi0gICAgLyogd2Ugd2lsbCBwYXJzZSByZWdpb24gbGlzdCBmaXJzdCwgdGhlbiBjb21lIGJhY2sgICAgICovCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGRhdGFPZmZzZXRBcnJheSwgaXRlbVN0b3JlLT5kYXRhQ291bnQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGl0ZW1TdG9yZS0+ZGF0YUNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIGlmICggRlRfUkVBRF9VTE9ORyggZGF0YU9mZnNldEFycmF5W2ldICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogcGFyc2UgYXJyYXkgb2YgcmVnaW9uIHJlY29yZHMgKHJlZ2lvbiBsaXN0KSAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG9mZnNldCArIHJlZ2lvbl9vZmZzZXQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBpdGVtU3RvcmUtPmF4aXNDb3VudCApICAgfHwKLSAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBpdGVtU3RvcmUtPnJlZ2lvbkNvdW50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBpdGVtU3RvcmUtPmF4aXNDb3VudCAhPSAoRlRfTG9uZylibGVuZC0+bW12YXItPm51bV9heGlzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiZnRfdmFyX2xvYWRfaXRlbV92YXJpYXRpb25fc3RvcmU6IgotICAgICAgICAgICAgICAgICAgIiBudW1iZXIgb2YgYXhlcyBpbiBpdGVtIHZhcmlhdGlvbiBzdG9yZVxuIgotICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICIgYW5kIGBmdmFyJyB0YWJsZSBhcmUgZGlmZmVyZW50XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBpdGVtU3RvcmUtPnZhclJlZ2lvbkxpc3QsIGl0ZW1TdG9yZS0+cmVnaW9uQ291bnQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGl0ZW1TdG9yZS0+cmVnaW9uQ291bnQ7IGkrKyApCi0gICAgewotICAgICAgR1hfQXhpc0Nvb3JkcyAgYXhpc0Nvb3JkczsKLQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggaXRlbVN0b3JlLT52YXJSZWdpb25MaXN0W2ldLmF4aXNMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TdG9yZS0+YXhpc0NvdW50ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGF4aXNDb29yZHMgPSBpdGVtU3RvcmUtPnZhclJlZ2lvbkxpc3RbaV0uYXhpc0xpc3Q7Ci0KLSAgICAgIGZvciAoIGogPSAwOyBqIDwgaXRlbVN0b3JlLT5heGlzQ291bnQ7IGorKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1Nob3J0ICBzdGFydCwgcGVhaywgZW5kOwotCi0KLSAgICAgICAgaWYgKCBGVF9SRUFEX1NIT1JUKCBzdGFydCApIHx8Ci0gICAgICAgICAgICAgRlRfUkVBRF9TSE9SVCggcGVhayApICB8fAotICAgICAgICAgICAgIEZUX1JFQURfU0hPUlQoIGVuZCApICAgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBheGlzQ29vcmRzW2pdLnN0YXJ0Q29vcmQgPSBGVF9mZG90MTRUb0ZpeGVkKCBzdGFydCApOwotICAgICAgICBheGlzQ29vcmRzW2pdLnBlYWtDb29yZCAgPSBGVF9mZG90MTRUb0ZpeGVkKCBwZWFrICk7Ci0gICAgICAgIGF4aXNDb29yZHNbal0uZW5kQ29vcmQgICA9IEZUX2Zkb3QxNFRvRml4ZWQoIGVuZCApOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGVuZCBvZiByZWdpb24gbGlzdCBwYXJzZSAqLwotCi0gICAgLyogdXNlIGRhdGFPZmZzZXRBcnJheSBub3cgdG8gcGFyc2UgdmFyRGF0YSBpdGVtcyAqLwotICAgIGlmICggRlRfTkVXX0FSUkFZKCBpdGVtU3RvcmUtPnZhckRhdGEsIGl0ZW1TdG9yZS0+ZGF0YUNvdW50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBpdGVtU3RvcmUtPmRhdGFDb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICB2YXJEYXRhID0gJml0ZW1TdG9yZS0+dmFyRGF0YVtpXTsKLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICsgZGF0YU9mZnNldEFycmF5W2ldICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIHZhckRhdGEtPml0ZW1Db3VudCApICAgICAgfHwKLSAgICAgICAgICAgRlRfUkVBRF9VU0hPUlQoIHNob3J0RGVsdGFDb3VudCApICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfUkVBRF9VU0hPUlQoIHZhckRhdGEtPnJlZ2lvbklkeENvdW50ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIGNoZWNrIHNvbWUgZGF0YSBjb25zaXN0ZW5jeSAqLwotICAgICAgaWYgKCBzaG9ydERlbHRhQ291bnQgPiB2YXJEYXRhLT5yZWdpb25JZHhDb3VudCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJiYWQgc2hvcnQgY291bnQgJWQgb3IgcmVnaW9uIGNvdW50ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBzaG9ydERlbHRhQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIHZhckRhdGEtPnJlZ2lvbklkeENvdW50ICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCB2YXJEYXRhLT5yZWdpb25JZHhDb3VudCA+IGl0ZW1TdG9yZS0+cmVnaW9uQ291bnQgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiaW5jb25zaXN0ZW50IHJlZ2lvbkNvdW50ICVkIGluIHZhckRhdGFbJWRdXG4iLAotICAgICAgICAgICAgICAgICAgICB2YXJEYXRhLT5yZWdpb25JZHhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgaSApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHBhcnNlIHJlZ2lvbiBpbmRpY2VzICovCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggdmFyRGF0YS0+cmVnaW9uSW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YXJEYXRhLT5yZWdpb25JZHhDb3VudCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmb3IgKCBqID0gMDsgaiA8IHZhckRhdGEtPnJlZ2lvbklkeENvdW50OyBqKysgKQotICAgICAgewotICAgICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCB2YXJEYXRhLT5yZWdpb25JbmRpY2VzW2pdICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIHZhckRhdGEtPnJlZ2lvbkluZGljZXNbal0gPj0gaXRlbVN0b3JlLT5yZWdpb25Db3VudCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTIoKCAiYmFkIHJlZ2lvbiBpbmRleCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICB2YXJEYXRhLT5yZWdpb25JbmRpY2VzW2pdICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogUGFyc2UgZGVsdGEgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIE9uIGlucHV0LCBkZWx0YXMgYXJlIChzaG9ydERlbHRhQ291bnQgKyByZWdpb25JZHhDb3VudCkgYnl0ZXMgICAqLwotICAgICAgLyogZWFjaDsgb24gb3V0cHV0LCBkZWx0YXMgYXJlIGV4cGFuZGVkIHRvIGByZWdpb25JZHhDb3VudCcgc2hvcnRzICovCi0gICAgICAvKiBlYWNoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCB2YXJEYXRhLT5kZWx0YVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YXJEYXRhLT5yZWdpb25JZHhDb3VudCAqIHZhckRhdGEtPml0ZW1Db3VudCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiB0aGUgZGVsdGEgc2V0IGlzIHN0b3JlZCBhcyBhIDItZGltZW5zaW9uYWwgYXJyYXkgb2Ygc2hvcnRzOyAqLwotICAgICAgLyogc2lnbi1leHRlbmQgc2lnbmVkIGJ5dGVzIHRvIHNpZ25lZCBzaG9ydHMgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGZvciAoIGogPSAwOyBqIDwgdmFyRGF0YS0+aXRlbUNvdW50ICogdmFyRGF0YS0+cmVnaW9uSWR4Q291bnQ7ICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggayA9IDA7IGsgPCBzaG9ydERlbHRhQ291bnQ7IGsrKywgaisrICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHJlYWQgdGhlIHNob3J0IGRlbHRhcyAqLwotICAgICAgICAgIEZUX1Nob3J0ICBkZWx0YTsKLQotCi0gICAgICAgICAgaWYgKCBGVF9SRUFEX1NIT1JUKCBkZWx0YSApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIHZhckRhdGEtPmRlbHRhU2V0W2pdID0gZGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCA7IGsgPCB2YXJEYXRhLT5yZWdpb25JZHhDb3VudDsgaysrLCBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogcmVhZCB0aGUgKHNpZ25lZCkgYnl0ZSBkZWx0YXMgKi8KLSAgICAgICAgICBGVF9DaGFyICBkZWx0YTsKLQotCi0gICAgICAgICAgaWYgKCBGVF9SRUFEX0NIQVIoIGRlbHRhICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgdmFyRGF0YS0+ZGVsdGFTZXRbal0gPSBkZWx0YTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIEZUX0ZSRUUoIGRhdGFPZmZzZXRBcnJheSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfdmFyX2xvYWRfZGVsdGFfc2V0X2luZGV4X21hcHBpbmcoIFRUX0ZhY2UgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYX0RlbHRhU2V0SWR4TWFwICBtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWF9JdGVtVmFyU3RvcmUgICAgaXRlbVN0b3JlICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gRlRfRkFDRV9TVFJFQU0oIGZhY2UgKTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0gICAgRlRfRXJyb3IgICBlcnJvcjsKLQotICAgIEZUX1VTaG9ydCAgZm9ybWF0OwotICAgIEZUX1VJbnQgICAgZW50cnlTaXplOwotICAgIEZUX1VJbnQgICAgaW5uZXJCaXRDb3VudDsKLSAgICBGVF9VSW50ICAgIGlubmVySW5kZXhNYXNrOwotICAgIEZUX1VJbnQgICAgaSwgajsKLQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgICAgICAgIHx8Ci0gICAgICAgICBGVF9SRUFEX1VTSE9SVCggZm9ybWF0ICkgICAgICAgIHx8Ci0gICAgICAgICBGVF9SRUFEX1VTSE9SVCggbWFwLT5tYXBDb3VudCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggZm9ybWF0ICYgMHhGRkMwICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiYmFkIG1hcCBmb3JtYXQgJWRcbiIsIGZvcm1hdCApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBieXRlcyBwZXIgZW50cnk6IDEsIDIsIDMsIG9yIDQgKi8KLSAgICBlbnRyeVNpemUgICAgICA9ICggKCBmb3JtYXQgJiAweDAwMzAgKSA+PiA0ICkgKyAxOwotICAgIGlubmVyQml0Q291bnQgID0gKCBmb3JtYXQgJiAweDAwMEYgKSArIDE7Ci0gICAgaW5uZXJJbmRleE1hc2sgPSAoIDEgPDwgaW5uZXJCaXRDb3VudCApIC0gMTsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBtYXAtPmlubmVySW5kZXgsIG1hcC0+bWFwQ291bnQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggbWFwLT5vdXRlckluZGV4LCBtYXAtPm1hcENvdW50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBtYXAtPm1hcENvdW50OyBpKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIG1hcERhdGEgPSAwOwotICAgICAgRlRfVUludCAgb3V0ZXJJbmRleCwgaW5uZXJJbmRleDsKLQotCi0gICAgICAvKiByZWFkIG1hcCBkYXRhIG9uZSB1bnNpZ25lZCBieXRlIGF0IGEgdGltZSwgYmlnIGVuZGlhbiAqLwotICAgICAgZm9yICggaiA9IDA7IGogPCBlbnRyeVNpemU7IGorKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUgIGRhdGE7Ci0KLQotICAgICAgICBpZiAoIEZUX1JFQURfQllURSggZGF0YSApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgbWFwRGF0YSA9ICggbWFwRGF0YSA8PCA4ICkgfCBkYXRhOwotICAgICAgfQotCi0gICAgICBvdXRlckluZGV4ID0gbWFwRGF0YSA+PiBpbm5lckJpdENvdW50OwotCi0gICAgICBpZiAoIG91dGVySW5kZXggPj0gaXRlbVN0b3JlLT5kYXRhQ291bnQgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAib3V0ZXJJbmRleFslZF0gPT0gJWQgb3V0IG9mIHJhbmdlXG4iLAotICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICBvdXRlckluZGV4ICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgbWFwLT5vdXRlckluZGV4W2ldID0gb3V0ZXJJbmRleDsKLQotICAgICAgaW5uZXJJbmRleCA9IG1hcERhdGEgJiBpbm5lckluZGV4TWFzazsKLQotICAgICAgaWYgKCBpbm5lckluZGV4ID49IGl0ZW1TdG9yZS0+dmFyRGF0YVtvdXRlckluZGV4XS5pdGVtQ291bnQgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiaW5uZXJJbmRleFslZF0gPT0gJWQgb3V0IG9mIHJhbmdlXG4iLAotICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICBpbm5lckluZGV4ICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBtYXAtPmlubmVySW5kZXhbaV0gPSBpbm5lckluZGV4OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX2xvYWRfaHZ2YXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYHZlcnRpY2FsJyBpcyB6ZXJvLCBwYXJzZSB0aGUgYEhWQVInIHRhYmxlIGFuZCBzZXQgICAgICAgICAgICAgICovCi0gIC8qICAgIGBibGVuZC0+aHZhcl9sb2FkZWQnIHRvIFRSVUUuICBPbiBzdWNjZXNzLCBgYmxlbmQtPmh2YXJfY2hlY2tlZCcgICAqLwotICAvKiAgICBpcyBzZXQgdG8gVFJVRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGB2ZXJ0aWNhbCcgaXMgbm90IHplcm8sIHBhcnNlIHRoZSBgVlZBUicgdGFibGUgYW5kIHNldCAgICAgICAgICAqLwotICAvKiAgICBgYmxlbmQtPnZ2YXJfbG9hZGVkJyB0byBUUlVFLiAgT24gc3VjY2VzcywgYGJsZW5kLT52dmFyX2NoZWNrZWQnICAgKi8KLSAgLyogICAgaXMgc2V0IHRvIFRSVUUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTb21lIG1lbW9yeSBtYXkgcmVtYWluIGFsbG9jYXRlZCBvbiBlcnJvcjsgaXQgaXMgYWx3YXlzIGZyZWVkIGluICAgKi8KLSAgLyogICAgYHR0X2RvbmVfYmxlbmQnLCBob3dldmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfdmFyX2xvYWRfaHZ2YXIoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICB2ZXJ0aWNhbCApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IEZUX0ZBQ0VfU1RSRUFNKCBmYWNlICk7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotICAgIEdYX0JsZW5kICBibGVuZCA9IGZhY2UtPmJsZW5kOwotCi0gICAgR1hfSFZWYXJUYWJsZSAgdGFibGU7Ci0KLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1VTaG9ydCAgbWFqb3JWZXJzaW9uOwotICAgIEZUX1VMb25nICAgdGFibGVfbGVuOwotICAgIEZUX1VMb25nICAgdGFibGVfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgc3RvcmVfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgd2lkdGhNYXBfb2Zmc2V0OwotCi0KLSAgICBpZiAoIHZlcnRpY2FsICkKLSAgICB7Ci0gICAgICBibGVuZC0+dnZhcl9sb2FkZWQgPSBUUlVFOwotCi0gICAgICBGVF9UUkFDRTIoKCAiVlZBUiAiICkpOwotCi0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfVlZBUiwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBibGVuZC0+aHZhcl9sb2FkZWQgPSBUUlVFOwotCi0gICAgICBGVF9UUkFDRTIoKCAiSFZBUiAiICkpOwotCi0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfSFZBUiwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmdcbiIgKSk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgdGFibGVfb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgLyogc2tpcCBtaW5vciB2ZXJzaW9uICovCi0gICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbWFqb3JWZXJzaW9uICkgfHwKLSAgICAgICAgIEZUX1NUUkVBTV9TS0lQKCAyICkgICAgICAgICAgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIG1ham9yVmVyc2lvbiAhPSAxICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiYmFkIHRhYmxlIHZlcnNpb24gJWRcbiIsIG1ham9yVmVyc2lvbiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX1JFQURfVUxPTkcoIHN0b3JlX29mZnNldCApICAgIHx8Ci0gICAgICAgICBGVF9SRUFEX1VMT05HKCB3aWR0aE1hcF9vZmZzZXQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIHZlcnRpY2FsICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX05FVyggYmxlbmQtPnZ2YXJfdGFibGUgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIHRhYmxlID0gYmxlbmQtPnZ2YXJfdGFibGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIEZUX05FVyggYmxlbmQtPmh2YXJfdGFibGUgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIHRhYmxlID0gYmxlbmQtPmh2YXJfdGFibGU7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF92YXJfbG9hZF9pdGVtX3ZhcmlhdGlvbl9zdG9yZSgKLSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgdGFibGVfb2Zmc2V0ICsgc3RvcmVfb2Zmc2V0LAotICAgICAgICAgICAgICAmdGFibGUtPml0ZW1TdG9yZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCB3aWR0aE1hcF9vZmZzZXQgKQotICAgIHsKLSAgICAgIGVycm9yID0gZnRfdmFyX2xvYWRfZGVsdGFfc2V0X2luZGV4X21hcHBpbmcoCi0gICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICB0YWJsZV9vZmZzZXQgKyB3aWR0aE1hcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgJnRhYmxlLT53aWR0aE1hcCwKLSAgICAgICAgICAgICAgICAmdGFibGUtPml0ZW1TdG9yZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggdmVydGljYWwgKQotICAgICAgewotICAgICAgICBibGVuZC0+dnZhcl9jaGVja2VkID0gVFJVRTsKLQotICAgICAgICAvKiBGcmVlVHlwZSBkb2Vzbid0IHByb3ZpZGUgZnVuY3Rpb25zIHRvIHF1aWNrbHkgcmV0cmlldmUgICAgKi8KLSAgICAgICAgLyogVFNCLCBCU0IsIG9yIFZPUkcgdmFsdWVzOyB3ZSB0aHVzIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50ICovCi0gICAgICAgIC8qIHN1cHBvcnQgZm9yIHRob3NlIHRocmVlIGl0ZW0gdmFyaWF0aW9uIHN0b3Jlcy4gICAgICAgICAgICAqLwotCi0gICAgICAgIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0IHw9IFRUX0ZBQ0VfRkxBR19WQVJfVkFEVkFOQ0U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJsZW5kLT5odmFyX2NoZWNrZWQgPSBUUlVFOwotCi0gICAgICAgIC8qIEZyZWVUeXBlIGRvZXNuJ3QgcHJvdmlkZSBmdW5jdGlvbnMgdG8gcXVpY2tseSByZXRyaWV2ZSAqLwotICAgICAgICAvKiBMU0Igb3IgUlNCIHZhbHVlczsgd2UgdGh1cyBkb24ndCBoYXZlIHRvIGltcGxlbWVudCAgICAgKi8KLSAgICAgICAgLyogc3VwcG9ydCBmb3IgdGhvc2UgdHdvIGl0ZW0gdmFyaWF0aW9uIHN0b3Jlcy4gICAgICAgICAgICovCi0KLSAgICAgICAgZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgfD0gVFRfRkFDRV9GTEFHX1ZBUl9IQURWQU5DRTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9JbnQKLSAgZnRfdmFyX2dldF9pdGVtX2RlbHRhKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR1hfSXRlbVZhclN0b3JlICBpdGVtU3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBvdXRlckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgaW5uZXJJbmRleCApCi0gIHsKLSAgICBHWF9JdGVtVmFyRGF0YSAgdmFyRGF0YTsKLSAgICBGVF9TaG9ydCogICAgICAgZGVsdGFTZXQ7Ci0KLSAgICBGVF9VSW50ICAgbWFzdGVyLCBqOwotICAgIEZUX0ZpeGVkICBuZXRBZGp1c3RtZW50ID0gMDsgICAgIC8qIGFjY3VtdWxhdGVkIGFkanVzdG1lbnQgKi8KLSAgICBGVF9GaXhlZCAgc2NhbGVkRGVsdGE7Ci0gICAgRlRfRml4ZWQgIGRlbHRhOwotCi0KLSAgICAvKiBTZWUgcHNldWRvIGNvZGUgZnJvbSBgRm9udCBWYXJpYXRpb25zIE92ZXJ2aWV3JyAqLwotICAgIC8qIGluIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICovCi0KLSAgICB2YXJEYXRhICA9ICZpdGVtU3RvcmUtPnZhckRhdGFbb3V0ZXJJbmRleF07Ci0gICAgZGVsdGFTZXQgPSAmdmFyRGF0YS0+ZGVsdGFTZXRbdmFyRGF0YS0+cmVnaW9uSWR4Q291bnQgKiBpbm5lckluZGV4XTsKLQotICAgIC8qIG91dGVyIGxvb3Agc3RlcHMgdGhyb3VnaCBtYXN0ZXIgZGVzaWducyB0byBiZSBibGVuZGVkICovCi0gICAgZm9yICggbWFzdGVyID0gMDsgbWFzdGVyIDwgdmFyRGF0YS0+cmVnaW9uSWR4Q291bnQ7IG1hc3RlcisrICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgc2NhbGFyICAgICAgPSBGVF9GSVhFRF9PTkU7Ci0gICAgICBGVF9VSW50ICAgcmVnaW9uSW5kZXggPSB2YXJEYXRhLT5yZWdpb25JbmRpY2VzW21hc3Rlcl07Ci0KLSAgICAgIEdYX0F4aXNDb29yZHMgIGF4aXMgPSBpdGVtU3RvcmUtPnZhclJlZ2lvbkxpc3RbcmVnaW9uSW5kZXhdLmF4aXNMaXN0OwotCi0KLSAgICAgIC8qIGlubmVyIGxvb3Agc3RlcHMgdGhyb3VnaCBheGVzIGluIHRoaXMgcmVnaW9uICovCi0gICAgICBmb3IgKCBqID0gMDsgaiA8IGl0ZW1TdG9yZS0+YXhpc0NvdW50OyBqKyssIGF4aXMrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICBheGlzU2NhbGFyOwotCi0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgc2NhbGFyIGNvbnRyaWJ1dGlvbiBvZiB0aGlzIGF4aXM7ICovCi0gICAgICAgIC8qIGlnbm9yZSBpbnZhbGlkIHJhbmdlcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGF4aXMtPnN0YXJ0Q29vcmQgPiBheGlzLT5wZWFrQ29vcmQgfHwKLSAgICAgICAgICAgICBheGlzLT5wZWFrQ29vcmQgPiBheGlzLT5lbmRDb29yZCAgICkKLSAgICAgICAgICBheGlzU2NhbGFyID0gRlRfRklYRURfT05FOwotCi0gICAgICAgIGVsc2UgaWYgKCBheGlzLT5zdGFydENvb3JkIDwgMCAmJgotICAgICAgICAgICAgICAgICAgYXhpcy0+ZW5kQ29vcmQgPiAwICAgJiYKLSAgICAgICAgICAgICAgICAgIGF4aXMtPnBlYWtDb29yZCAhPSAwICkKLSAgICAgICAgICBheGlzU2NhbGFyID0gRlRfRklYRURfT05FOwotCi0gICAgICAgIC8qIHBlYWsgb2YgMCBtZWFucyBpZ25vcmUgdGhpcyBheGlzICovCi0gICAgICAgIGVsc2UgaWYgKCBheGlzLT5wZWFrQ29vcmQgPT0gMCApCi0gICAgICAgICAgYXhpc1NjYWxhciA9IEZUX0ZJWEVEX09ORTsKLQotICAgICAgICAvKiBpZ25vcmUgdGhpcyByZWdpb24gaWYgY29vcmRzIGFyZSBvdXQgb2YgcmFuZ2UgKi8KLSAgICAgICAgZWxzZSBpZiAoIGZhY2UtPmJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2pdIDwgYXhpcy0+c3RhcnRDb29yZCB8fAotICAgICAgICAgICAgICAgICAgZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0gPiBheGlzLT5lbmRDb29yZCAgICkKLSAgICAgICAgICBheGlzU2NhbGFyID0gMDsKLQotICAgICAgICAvKiBjYWxjdWxhdGUgYSBwcm9wb3J0aW9uYWwgZmFjdG9yICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0gPT0gYXhpcy0+cGVha0Nvb3JkICkKLSAgICAgICAgICAgIGF4aXNTY2FsYXIgPSBGVF9GSVhFRF9PTkU7Ci0gICAgICAgICAgZWxzZSBpZiAoIGZhY2UtPmJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2pdIDwgYXhpcy0+cGVha0Nvb3JkICkKLSAgICAgICAgICAgIGF4aXNTY2FsYXIgPQotICAgICAgICAgICAgICBGVF9EaXZGaXgoIGZhY2UtPmJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2pdIC0gYXhpcy0+c3RhcnRDb29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLT5wZWFrQ29vcmQgLSBheGlzLT5zdGFydENvb3JkICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXhpc1NjYWxhciA9Ci0gICAgICAgICAgICAgIEZUX0RpdkZpeCggYXhpcy0+ZW5kQ29vcmQgLSBmYWNlLT5ibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLT5lbmRDb29yZCAtIGF4aXMtPnBlYWtDb29yZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdGFrZSBwcm9kdWN0IG9mIGFsbCB0aGUgYXhpcyBzY2FsYXJzICovCi0gICAgICAgIHNjYWxhciA9IEZUX011bEZpeCggc2NhbGFyLCBheGlzU2NhbGFyICk7Ci0KLSAgICAgIH0gLyogcGVyLWF4aXMgbG9vcCAqLwotCi0gICAgICAvKiBnZXQgdGhlIHNjYWxlZCBkZWx0YSBmb3IgdGhpcyByZWdpb24gKi8KLSAgICAgIGRlbHRhICAgICAgID0gRlRfaW50VG9GaXhlZCggZGVsdGFTZXRbbWFzdGVyXSApOwotICAgICAgc2NhbGVkRGVsdGEgPSBGVF9NdWxGaXgoIHNjYWxhciwgZGVsdGEgKTsKLQotICAgICAgLyogYWNjdW11bGF0ZSB0aGUgYWRqdXN0bWVudHMgZnJvbSBlYWNoIHJlZ2lvbiAqLwotICAgICAgbmV0QWRqdXN0bWVudCA9IG5ldEFkanVzdG1lbnQgKyBzY2FsZWREZWx0YTsKLQotICAgIH0gLyogcGVyLXJlZ2lvbiBsb29wICovCi0KLSAgICByZXR1cm4gRlRfZml4ZWRUb0ludCggbmV0QWRqdXN0bWVudCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9odmFkdmFuY2VfYWRqdXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcHBseSBgSFZBUicgYWR2YW5jZSB3aWR0aCBvciBgVlZBUicgYWR2YW5jZSBoZWlnaHQgYWRqdXN0bWVudCBvZiAgKi8KLSAgLyogICAgYSBnaXZlbiBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCA6OiBJZiBzZXQsIGhhbmRsZSBgVlZBUicgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkZWx0YSAgIDo6IFBvaW50cyB0byB3aWR0aCBvciBoZWlnaHQgdmFsdWUgdGhhdCBnZXRzIG1vZGlmaWVkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X2h2YWR2YW5jZV9hZGp1c3QoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAqYXZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICB2ZXJ0aWNhbCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgIGlubmVySW5kZXgsIG91dGVySW5kZXg7Ci0gICAgRlRfSW50ICAgIGRlbHRhOwotCi0gICAgR1hfSFZWYXJUYWJsZSAgdGFibGU7Ci0KLQotICAgIGlmICggIWZhY2UtPmRvYmxlbmQgfHwgIWZhY2UtPmJsZW5kICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggdmVydGljYWwgKQotICAgIHsKLSAgICAgIGlmICggIWZhY2UtPmJsZW5kLT52dmFyX2xvYWRlZCApCi0gICAgICB7Ci0gICAgICAgIC8qIGluaXRpYWxpemUgdnZhciB0YWJsZSAqLwotICAgICAgICBmYWNlLT5ibGVuZC0+dnZhcl9lcnJvciA9IGZ0X3Zhcl9sb2FkX2h2dmFyKCBmYWNlLCAxICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWZhY2UtPmJsZW5kLT52dmFyX2NoZWNrZWQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGZhY2UtPmJsZW5kLT52dmFyX2Vycm9yOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHRhYmxlID0gZmFjZS0+YmxlbmQtPnZ2YXJfdGFibGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoICFmYWNlLT5ibGVuZC0+aHZhcl9sb2FkZWQgKQotICAgICAgewotICAgICAgICAvKiBpbml0aWFsaXplIGh2YXIgdGFibGUgKi8KLSAgICAgICAgZmFjZS0+YmxlbmQtPmh2YXJfZXJyb3IgPSBmdF92YXJfbG9hZF9odnZhciggZmFjZSwgMCApOwotICAgICAgfQotCi0gICAgICBpZiAoICFmYWNlLT5ibGVuZC0+aHZhcl9jaGVja2VkICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBmYWNlLT5ibGVuZC0+aHZhcl9lcnJvcjsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICB0YWJsZSA9IGZhY2UtPmJsZW5kLT5odmFyX3RhYmxlOwotICAgIH0KLQotICAgIC8qIGFkdmFuY2Ugd2lkdGggb3IgaGVpZ2h0IGFkanVzdG1lbnRzIGFyZSBhbHdheXMgcHJlc2VudCBpbiBhbiAqLwotICAgIC8qIGBIVkFSJyBvciBgVlZBUicgdGFibGU7IG5vIG5lZWQgdG8gdGVzdCBmb3IgdGhpcyBjYXBhYmlsaXR5ICAqLwotCi0gICAgaWYgKCB0YWJsZS0+d2lkdGhNYXAuaW5uZXJJbmRleCApCi0gICAgewotICAgICAgRlRfVUludCAgaWR4ID0gZ2luZGV4OwotCi0KLSAgICAgIGlmICggaWR4ID49IHRhYmxlLT53aWR0aE1hcC5tYXBDb3VudCApCi0gICAgICAgIGlkeCA9IHRhYmxlLT53aWR0aE1hcC5tYXBDb3VudCAtIDE7Ci0KLSAgICAgIC8qIHRydXN0IHRoYXQgSFZBUiBwYXJzZXIgaGFzIGNoZWNrZWQgaW5kaWNlcyAqLwotICAgICAgb3V0ZXJJbmRleCA9IHRhYmxlLT53aWR0aE1hcC5vdXRlckluZGV4W2lkeF07Ci0gICAgICBpbm5lckluZGV4ID0gdGFibGUtPndpZHRoTWFwLmlubmVySW5kZXhbaWR4XTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEdYX0l0ZW1WYXJEYXRhICB2YXJEYXRhOwotCi0KLSAgICAgIC8qIG5vIHdpZHRoTWFwIGRhdGEgKi8KLSAgICAgIG91dGVySW5kZXggPSAwOwotICAgICAgaW5uZXJJbmRleCA9IGdpbmRleDsKLQotICAgICAgdmFyRGF0YSA9ICZ0YWJsZS0+aXRlbVN0b3JlLnZhckRhdGFbb3V0ZXJJbmRleF07Ci0gICAgICBpZiAoIGdpbmRleCA+PSB2YXJEYXRhLT5pdGVtQ291bnQgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiZ2luZGV4ICVkIG91dCBvZiByYW5nZVxuIiwgZ2luZGV4ICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWx0YSA9IGZ0X3Zhcl9nZXRfaXRlbV9kZWx0YSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlLT5pdGVtU3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVySW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySW5kZXggKTsKLQotICAgIEZUX1RSQUNFNSgoICIlcyB2YWx1ZSAlZCBhZGp1c3RlZCBieSAlZCB1bml0cyAoJXMpXG4iLAotICAgICAgICAgICAgICAgIHZlcnRpY2FsID8gInZlcnRpY2FsIGhlaWdodCIgOiAiaG9yaXpvbnRhbCB3aWR0aCIsCi0gICAgICAgICAgICAgICAgKmF2YWx1ZSwKLSAgICAgICAgICAgICAgICBkZWx0YSwKLSAgICAgICAgICAgICAgICB2ZXJ0aWNhbCA/ICJWVkFSIiA6ICJIVkFSIiApKTsKLQotICAgICphdmFsdWUgKz0gZGVsdGE7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9oYWR2YW5jZV9hZGp1c3QoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgKmF2YWx1ZSApCi0gIHsKLSAgICByZXR1cm4gdHRfaHZhZHZhbmNlX2FkanVzdCggZmFjZSwgZ2luZGV4LCBhdmFsdWUsIDAgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X3ZhZHZhbmNlX2FkanVzdCggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAqYXZhbHVlICkKLSAgewotICAgIHJldHVybiB0dF9odmFkdmFuY2VfYWRqdXN0KCBmYWNlLCBnaW5kZXgsIGF2YWx1ZSwgMSApOwotICB9Ci0KLQotI2RlZmluZSBHWF9WQUxVRV9TSVpFICA4Ci0KLSAgLyogYWxsIHZhbHVlcyBhcmUgRlRfU2hvcnQgb3IgRlRfVVNob3J0IGVudGl0aWVzOyAqLwotICAvKiB3ZSB0cmVhdCB0aGVtIGNvbnNpc3RlbnRseSBhcyBGVF9TaG9ydCAgICAgICAgICovCi0jZGVmaW5lIEdYX1ZBTFVFX0NBU0UoIHRhZywgZGZsdCApICAgICAgXAotICAgICAgICAgIGNhc2UgTVZBUl9UQUdfICMjIHRhZyA6ICAgICAgIFwKLSAgICAgICAgICAgIHAgPSAoRlRfU2hvcnQqKSZmYWNlLT5kZmx0OyBcCi0gICAgICAgICAgICBicmVhawotCi0jZGVmaW5lIEdYX0dBU1BfQ0FTRSggaWR4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2FzZSBNVkFSX1RBR19HQVNQXyAjIyBpZHggOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoIGlkeCA8IGZhY2UtPmdhc3AubnVtUmFuZ2VzIC0gMSApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIHAgPSAoRlRfU2hvcnQqKSZmYWNlLT5nYXNwLmdhc3BSYW5nZXNbaWR4XS5tYXhQUEVNOyBcCi0gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIHAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBicmVhawotCi0KLSAgc3RhdGljIEZUX1Nob3J0KgotICBmdF92YXJfZ2V0X3ZhbHVlX3BvaW50ZXIoIFRUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBtdmFyX3RhZyApCi0gIHsKLSAgICBGVF9TaG9ydCogIHA7Ci0KLQotICAgIHN3aXRjaCAoIG12YXJfdGFnICkKLSAgICB7Ci0gICAgICBHWF9HQVNQX0NBU0UoIDAgKTsKLSAgICAgIEdYX0dBU1BfQ0FTRSggMSApOwotICAgICAgR1hfR0FTUF9DQVNFKCAyICk7Ci0gICAgICBHWF9HQVNQX0NBU0UoIDMgKTsKLSAgICAgIEdYX0dBU1BfQ0FTRSggNCApOwotICAgICAgR1hfR0FTUF9DQVNFKCA1ICk7Ci0gICAgICBHWF9HQVNQX0NBU0UoIDYgKTsKLSAgICAgIEdYX0dBU1BfQ0FTRSggNyApOwotICAgICAgR1hfR0FTUF9DQVNFKCA4ICk7Ci0gICAgICBHWF9HQVNQX0NBU0UoIDkgKTsKLQotICAgICAgR1hfVkFMVUVfQ0FTRSggQ1BIVCwgb3MyLnNDYXBIZWlnaHQgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIEhBU0MsIG9zMi5zVHlwb0FzY2VuZGVyICk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBIQ0xBLCBvczIudXNXaW5Bc2NlbnQgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIEhDTEQsIG9zMi51c1dpbkRlc2NlbnQgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIEhDT0YsIGhvcml6b250YWwuY2FyZXRfT2Zmc2V0ICk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBIQ1JOLCBob3Jpem9udGFsLmNhcmV0X1Nsb3BlX1J1biApOwotICAgICAgR1hfVkFMVUVfQ0FTRSggSENSUywgaG9yaXpvbnRhbC5jYXJldF9TbG9wZV9SaXNlICk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBIRFNDLCBvczIuc1R5cG9EZXNjZW5kZXIgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIEhMR1AsIG9zMi5zVHlwb0xpbmVHYXAgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIFNCWE8sIG9zMi55U3Vic2NyaXB0WE9mZnNldCk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBTQlhTLCBvczIueVN1YnNjcmlwdFhTaXplICk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBTQllPLCBvczIueVN1YnNjcmlwdFlPZmZzZXQgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIFNCWVMsIG9zMi55U3Vic2NyaXB0WVNpemUgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIFNQWE8sIG9zMi55U3VwZXJzY3JpcHRYT2Zmc2V0ICk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBTUFhTLCBvczIueVN1cGVyc2NyaXB0WFNpemUgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIFNQWU8sIG9zMi55U3VwZXJzY3JpcHRZT2Zmc2V0ICk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBTUFlTLCBvczIueVN1cGVyc2NyaXB0WVNpemUgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIFNUUk8sIG9zMi55U3RyaWtlb3V0UG9zaXRpb24gKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIFNUUlMsIG9zMi55U3RyaWtlb3V0U2l6ZSApOwotICAgICAgR1hfVkFMVUVfQ0FTRSggVU5ETywgcG9zdHNjcmlwdC51bmRlcmxpbmVQb3NpdGlvbiApOwotICAgICAgR1hfVkFMVUVfQ0FTRSggVU5EUywgcG9zdHNjcmlwdC51bmRlcmxpbmVUaGlja25lc3MgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIFZBU0MsIHZlcnRpY2FsLkFzY2VuZGVyICk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBWQ09GLCB2ZXJ0aWNhbC5jYXJldF9PZmZzZXQgKTsKLSAgICAgIEdYX1ZBTFVFX0NBU0UoIFZDUk4sIHZlcnRpY2FsLmNhcmV0X1Nsb3BlX1J1biApOwotICAgICAgR1hfVkFMVUVfQ0FTRSggVkNSUywgdmVydGljYWwuY2FyZXRfU2xvcGVfUmlzZSApOwotICAgICAgR1hfVkFMVUVfQ0FTRSggVkRTQywgdmVydGljYWwuRGVzY2VuZGVyICk7Ci0gICAgICBHWF9WQUxVRV9DQVNFKCBWTEdQLCB2ZXJ0aWNhbC5MaW5lX0dhcCApOwotICAgICAgR1hfVkFMVUVfQ0FTRSggWEhHVCwgb3MyLnN4SGVpZ2h0ICk7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogaWdub3JlIHVua25vd24gdGFnICovCi0gICAgICBwID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX2xvYWRfbXZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2UgdGhlIGBNVkFSJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTb21lIG1lbW9yeSBtYXkgcmVtYWluIGFsbG9jYXRlZCBvbiBlcnJvcjsgaXQgaXMgYWx3YXlzIGZyZWVkIGluICAgKi8KLSAgLyogICAgYHR0X2RvbmVfYmxlbmQnLCBob3dldmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBmdF92YXJfbG9hZF9tdmFyKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gRlRfRkFDRV9TVFJFQU0oIGZhY2UgKTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0gICAgR1hfQmxlbmQgICAgICAgICBibGVuZCA9IGZhY2UtPmJsZW5kOwotICAgIEdYX0l0ZW1WYXJTdG9yZSAgaXRlbVN0b3JlOwotICAgIEdYX1ZhbHVlICAgICAgICAgdmFsdWUsIGxpbWl0OwotCi0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VU2hvcnQgIG1ham9yVmVyc2lvbjsKLSAgICBGVF9VTG9uZyAgIHRhYmxlX2xlbjsKLSAgICBGVF9VTG9uZyAgIHRhYmxlX29mZnNldDsKLSAgICBGVF9VU2hvcnQgIHN0b3JlX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIHJlY29yZHNfb2Zmc2V0OwotCi0KLSAgICBGVF9UUkFDRTIoKCAiTVZBUiAiICkpOwotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX01WQVIsIHN0cmVhbSwgJnRhYmxlX2xlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nXG4iICkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHRhYmxlX29mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKLQotICAgIC8qIHNraXAgbWlub3IgdmVyc2lvbiAqLwotICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG1ham9yVmVyc2lvbiApIHx8Ci0gICAgICAgICBGVF9TVFJFQU1fU0tJUCggMiApICAgICAgICAgICAgKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCBtYWpvclZlcnNpb24gIT0gMSApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImJhZCB0YWJsZSB2ZXJzaW9uICVkXG4iLCBtYWpvclZlcnNpb24gKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVcoIGJsZW5kLT5tdmFyX3RhYmxlICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogc2tpcCByZXNlcnZlZCBlbnRyeSBhbmQgdmFsdWUgcmVjb3JkIHNpemUgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBGVF9SRUFEX1VTSE9SVCggYmxlbmQtPm12YXJfdGFibGUtPnZhbHVlQ291bnQgKSB8fAotICAgICAgICAgRlRfUkVBRF9VU0hPUlQoIHN0b3JlX29mZnNldCApICAgICAgICAgICAgICAgICAgKQotICAgICAgcmV0dXJuOwotCi0gICAgcmVjb3Jkc19vZmZzZXQgPSBGVF9TVFJFQU1fUE9TKCk7Ci0KLSAgICBlcnJvciA9IGZ0X3Zhcl9sb2FkX2l0ZW1fdmFyaWF0aW9uX3N0b3JlKAotICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICB0YWJsZV9vZmZzZXQgKyBzdG9yZV9vZmZzZXQsCi0gICAgICAgICAgICAgICZibGVuZC0+bXZhcl90YWJsZS0+aXRlbVN0b3JlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPm12YXJfdGFibGUtPnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPm12YXJfdGFibGUtPnZhbHVlQ291bnQgKSApCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCByZWNvcmRzX29mZnNldCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGJsZW5kLT5tdmFyX3RhYmxlLT52YWx1ZUNvdW50ICogR1hfVkFMVUVfU0laRSApICkKLSAgICAgIHJldHVybjsKLQotICAgIHZhbHVlICAgICA9IGJsZW5kLT5tdmFyX3RhYmxlLT52YWx1ZXM7Ci0gICAgbGltaXQgICAgID0gdmFsdWUgKyBibGVuZC0+bXZhcl90YWJsZS0+dmFsdWVDb3VudDsKLSAgICBpdGVtU3RvcmUgPSAmYmxlbmQtPm12YXJfdGFibGUtPml0ZW1TdG9yZTsKLQotICAgIGZvciAoIDsgdmFsdWUgPCBsaW1pdDsgdmFsdWUrKyApCi0gICAgewotICAgICAgdmFsdWUtPnRhZyAgICAgICAgPSBGVF9HRVRfVUxPTkcoKTsKLSAgICAgIHZhbHVlLT5vdXRlckluZGV4ID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgdmFsdWUtPmlubmVySW5kZXggPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgIGlmICggdmFsdWUtPm91dGVySW5kZXggPj0gaXRlbVN0b3JlLT5kYXRhQ291bnQgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICB2YWx1ZS0+aW5uZXJJbmRleCA+PSBpdGVtU3RvcmUtPnZhckRhdGFbdmFsdWUtPm91dGVySW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtQ291bnQgICAgICAgICAgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuOwotCi0gICAgRlRfVFJBQ0UyKCggImxvYWRlZFxuIiApKTsKLQotICAgIHZhbHVlID0gYmxlbmQtPm12YXJfdGFibGUtPnZhbHVlczsKLSAgICBsaW1pdCA9IHZhbHVlICsgYmxlbmQtPm12YXJfdGFibGUtPnZhbHVlQ291bnQ7Ci0KLSAgICAvKiBzYXZlIG9yaWdpbmFsIHZhbHVlcyBvZiB0aGUgZGF0YSBNVkFSIGlzIGdvaW5nIHRvIG1vZGlmeSAqLwotICAgIGZvciAoIDsgdmFsdWUgPCBsaW1pdDsgdmFsdWUrKyApCi0gICAgewotICAgICAgRlRfU2hvcnQqICBwID0gZnRfdmFyX2dldF92YWx1ZV9wb2ludGVyKCBmYWNlLCB2YWx1ZS0+dGFnICk7Ci0KLQotICAgICAgaWYgKCBwICkKLSAgICAgICAgdmFsdWUtPnVubW9kaWZpZWQgPSAqcDsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgZWxzZQotICAgICAgICBGVF9UUkFDRTEoKCAiZnRfdmFyX2xvYWRfbXZhcjogSWdub3JpbmcgdW5rbm93biB0YWcgYCVjJWMlYyVjJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB2YWx1ZS0+dGFnID4+IDI0ICksCi0gICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdmFsdWUtPnRhZyA+PiAxNiApLAotICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHZhbHVlLT50YWcgPj4gOCApLAotICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHZhbHVlLT50YWcgKSApKTsKLSNlbmRpZgotICAgIH0KLQotICAgIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0IHw9IFRUX0ZBQ0VfRkxBR19WQVJfTVZBUjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NpemVfcmVzZXRfaXRlcmF0b3IoIEZUX0xpc3ROb2RlICBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdXNlciApCi0gIHsKLSAgICBUVF9TaXplICBzaXplID0gKFRUX1NpemUpbm9kZS0+ZGF0YTsKLQotICAgIEZUX1VOVVNFRCggdXNlciApOwotCi0KLSAgICB0dF9zaXplX3Jlc2V0KCBzaXplLCAxICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9hcHBseV9tdmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcHBseSBgTVZBUicgdGFibGUgYWRqdXN0bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IFRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2FwcGx5X212YXIoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgR1hfQmxlbmQgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgR1hfVmFsdWUgIHZhbHVlLCBsaW1pdDsKLQotCi0gICAgaWYgKCAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfTVZBUiApICkKLSAgICAgIHJldHVybjsKLQotICAgIHZhbHVlID0gYmxlbmQtPm12YXJfdGFibGUtPnZhbHVlczsKLSAgICBsaW1pdCA9IHZhbHVlICsgYmxlbmQtPm12YXJfdGFibGUtPnZhbHVlQ291bnQ7Ci0KLSAgICBmb3IgKCA7IHZhbHVlIDwgbGltaXQ7IHZhbHVlKysgKQotICAgIHsKLSAgICAgIEZUX1Nob3J0KiAgcCA9IGZ0X3Zhcl9nZXRfdmFsdWVfcG9pbnRlciggZmFjZSwgdmFsdWUtPnRhZyApOwotICAgICAgRlRfSW50ICAgICBkZWx0YTsKLQotCi0gICAgICBkZWx0YSA9IGZ0X3Zhcl9nZXRfaXRlbV9kZWx0YSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxlbmQtPm12YXJfdGFibGUtPml0ZW1TdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b3V0ZXJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+aW5uZXJJbmRleCApOwotCi0gICAgICBpZiAoIHAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTUoKCAidmFsdWUgJWMlYyVjJWMgKCVkIHVuaXRzKSBhZGp1c3RlZCBieSAlZCB1bml0cyAoTVZBUilcbiIsCi0gICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdmFsdWUtPnRhZyA+PiAyNCApLAotICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHZhbHVlLT50YWcgPj4gMTYgKSwKLSAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB2YWx1ZS0+dGFnID4+IDggKSwKLSAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB2YWx1ZS0+dGFnICksCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLT51bm1vZGlmaWVkLAotICAgICAgICAgICAgICAgICAgICBkZWx0YSApKTsKLQotICAgICAgICAvKiBzaW5jZSB3ZSBoYW5kbGUgYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkIHZhbHVlcyBhcyBGVF9TaG9ydCwgKi8KLSAgICAgICAgLyogZW5zdXJlIHByb3BlciBvdmVyZmxvdyBhcml0aG1ldGljICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICpwID0gKEZUX1Nob3J0KSggdmFsdWUtPnVubW9kaWZpZWQgKyAoRlRfU2hvcnQpZGVsdGEgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhZGp1c3QgYWxsIGRlcml2ZWQgdmFsdWVzICovCi0gICAgewotICAgICAgRlRfRmFjZSAgcm9vdCA9ICZmYWNlLT5yb290OwotCi0KLSAgICAgIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGVSApCi0gICAgICB7Ci0gICAgICAgIGlmICggZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgfHwgZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyICkKLSAgICAgICAgewotICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9IGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyOwotICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlcjsKLQotICAgICAgICAgIHJvb3QtPmhlaWdodCA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5vczIuc1R5cG9MaW5lR2FwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9ICAoRlRfU2hvcnQpZmFjZS0+b3MyLnVzV2luQXNjZW50OwotICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IC0oRlRfU2hvcnQpZmFjZS0+b3MyLnVzV2luRGVzY2VudDsKLQotICAgICAgICAgIHJvb3QtPmhlaWdodCA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJvb3QtPnVuZGVybGluZV9wb3NpdGlvbiAgPSBmYWNlLT5wb3N0c2NyaXB0LnVuZGVybGluZVBvc2l0aW9uIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5wb3N0c2NyaXB0LnVuZGVybGluZVRoaWNrbmVzcyAvIDI7Ci0gICAgICByb290LT51bmRlcmxpbmVfdGhpY2tuZXNzID0gZmFjZS0+cG9zdHNjcmlwdC51bmRlcmxpbmVUaGlja25lc3M7Ci0KLSAgICAgIC8qIGl0ZXJhdGUgb3ZlciBhbGwgRlRfU2l6ZSBvYmplY3RzIGFuZCBjYWxsIGB0dF9zaXplX3Jlc2V0JyAqLwotICAgICAgLyogdG8gcHJvcGFnYXRlIHRoZSBtZXRyaWNzIGNoYW5nZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGVF9MaXN0X0l0ZXJhdGUoICZyb290LT5zaXplc19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICB0dF9zaXplX3Jlc2V0X2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7Ci0gICAgfQotICB9Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hfR1Zhcl9IZWFkXwotICB7Ci0gICAgRlRfTG9uZyAgICB2ZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgYXhpc0NvdW50OwotICAgIEZUX1VTaG9ydCAgZ2xvYmFsQ29vcmRDb3VudDsKLSAgICBGVF9VTG9uZyAgIG9mZnNldFRvQ29vcmQ7Ci0gICAgRlRfVVNob3J0ICBnbHlwaENvdW50OwotICAgIEZUX1VTaG9ydCAgZmxhZ3M7Ci0gICAgRlRfVUxvbmcgICBvZmZzZXRUb0RhdGE7Ci0KLSAgfSBHWF9HVmFyX0hlYWQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF92YXJfbG9hZF9ndmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQYXJzZSB0aGUgYGd2YXInIHRhYmxlIGlmIHByZXNlbnQuICBJZiBgZnZhcicgaXMgdGhlcmUsIGBndmFyJyBoYWQgKi8KLSAgLyogICAgYmV0dGVyIGJlIHRoZXJlIHRvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfdmFyX2xvYWRfZ3ZhciggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9TdHJlYW0gICAgIHN0cmVhbSA9IEZUX0ZBQ0VfU1RSRUFNKCBmYWNlICk7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBHWF9CbGVuZCAgICAgIGJsZW5kICA9IGZhY2UtPmJsZW5kOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfVUludCAgICAgICBpLCBqOwotICAgIEZUX1VMb25nICAgICAgdGFibGVfbGVuOwotICAgIEZUX1VMb25nICAgICAgZ3Zhcl9zdGFydDsKLSAgICBGVF9VTG9uZyAgICAgIG9mZnNldFRvRGF0YTsKLSAgICBHWF9HVmFyX0hlYWQgIGd2YXJfaGVhZDsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgZ3Zhcl9maWVsZHNbXSA9Ci0gICAgewotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIEdYX0dWYXJfSGVhZAotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMjAgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCB2ZXJzaW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggYXhpc0NvdW50ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZ2xvYmFsQ29vcmRDb3VudCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG9mZnNldFRvQ29vcmQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBnbHlwaENvdW50ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZmxhZ3MgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBvZmZzZXRUb0RhdGEgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIEZUX1RSQUNFMigoICJHVkFSICIgKSk7Ci0KLSAgICBpZiAoIEZUX1NFVF9FUlJPUiggZmFjZS0+Z290b190YWJsZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRBR19ndmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZV9sZW4gKSApICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiaXMgbWlzc2luZ1xuIiApKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBndmFyX3N0YXJ0ID0gRlRfU1RSRUFNX1BPUyggKTsKLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggZ3Zhcl9maWVsZHMsICZndmFyX2hlYWQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGd2YXJfaGVhZC52ZXJzaW9uICE9IDB4MDAwMTAwMDBMICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAiYmFkIHRhYmxlIHZlcnNpb25cbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBndmFyX2hlYWQuYXhpc0NvdW50ICE9IChGVF9VU2hvcnQpYmxlbmQtPm1tdmFyLT5udW1fYXhpcyApCi0gICAgewotICAgICAgRlRfVFJBQ0UxKCggImZ0X3Zhcl9sb2FkX2d2YXI6IG51bWJlciBvZiBheGVzIGluIGBndmFyJyBhbmQgYGN2YXInXG4iCi0gICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgdGFibGUgYXJlIGRpZmZlcmVudFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiByb3VnaCBzYW5pdHkgY2hlY2ssIGlnbm9yaW5nIG9mZnNldHMgKi8KLSAgICBpZiAoIChGVF9VTG9uZylndmFyX2hlYWQuZ2xvYmFsQ29vcmRDb3VudCAqIGd2YXJfaGVhZC5heGlzQ291bnQgPgotICAgICAgICAgICB0YWJsZV9sZW4gLyAyICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAiZnRfdmFyX2xvYWRfZ3ZhcjoiCi0gICAgICAgICAgICAgICAgICAiIGludmFsaWQgbnVtYmVyIG9mIGdsb2JhbCBjb29yZGluYXRlc1xuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiByb3VnaCBzYW5pdHkgY2hlY2s6IG9mZnNldHMgY2FuIGJlIGVpdGhlciAyIG9yIDQgYnl0ZXMgKi8KLSAgICBpZiAoIChGVF9VTG9uZylndmFyX2hlYWQuZ2x5cGhDb3VudCAqCi0gICAgICAgICAgICggKCBndmFyX2hlYWQuZmxhZ3MgJiAxICkgPyA0IDogMiApID4gdGFibGVfbGVuICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAiZnRfdmFyX2xvYWRfZ3ZhcjogaW52YWxpZCBudW1iZXIgb2YgZ2x5cGhzXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7Ci0KLSAgICBibGVuZC0+Z3Zhcl9zaXplICAgPSB0YWJsZV9sZW47Ci0gICAgYmxlbmQtPnR1cGxlY291bnQgID0gZ3Zhcl9oZWFkLmdsb2JhbENvb3JkQ291bnQ7Ci0gICAgYmxlbmQtPmd2X2dseXBoY250ID0gZ3Zhcl9oZWFkLmdseXBoQ291bnQ7Ci0gICAgb2Zmc2V0VG9EYXRhICAgICAgID0gZ3Zhcl9zdGFydCArIGd2YXJfaGVhZC5vZmZzZXRUb0RhdGE7Ci0KLSAgICBGVF9UUkFDRTUoKCAiZ3ZhcjogdGhlcmUgYXJlICVkIHNoYXJlZCBjb29yZGluYXRlczpcbiIsCi0gICAgICAgICAgICAgICAgYmxlbmQtPnR1cGxlY291bnQgKSk7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPmdseXBob2Zmc2V0cywgYmxlbmQtPmd2X2dseXBoY250ICsgMSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggZ3Zhcl9oZWFkLmZsYWdzICYgMSApCi0gICAgewotICAgICAgLyogbG9uZyBvZmZzZXRzIChvbmUgbW9yZSBvZmZzZXQgdGhhbiBnbHlwaHMsIHRvIG1hcmsgc2l6ZSBvZiBsYXN0KSAqLwotICAgICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggKCBibGVuZC0+Z3ZfZ2x5cGhjbnQgKyAxICkgKiA0TCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8PSBibGVuZC0+Z3ZfZ2x5cGhjbnQ7IGkrKyApCi0gICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbaV0gPSBvZmZzZXRUb0RhdGEgKyBGVF9HRVRfVUxPTkcoKTsKLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogc2hvcnQgb2Zmc2V0cyAob25lIG1vcmUgb2Zmc2V0IHRoYW4gZ2x5cGhzLCB0byBtYXJrIHNpemUgb2YgbGFzdCkgKi8KLSAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoICggYmxlbmQtPmd2X2dseXBoY250ICsgMSApICogMkwgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPD0gYmxlbmQtPmd2X2dseXBoY250OyBpKysgKQotICAgICAgICBibGVuZC0+Z2x5cGhvZmZzZXRzW2ldID0gb2Zmc2V0VG9EYXRhICsgRlRfR0VUX1VTSE9SVCgpICogMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBVbmRvY3VtZW50ZWQ6IGAqMichICovCi0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgICBpZiAoIGJsZW5kLT50dXBsZWNvdW50ICE9IDAgKQotICAgIHsKLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+dHVwbGVjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3Zhcl9oZWFkLmF4aXNDb3VudCAqIGJsZW5kLT50dXBsZWNvdW50ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGd2YXJfc3RhcnQgKyBndmFyX2hlYWQub2Zmc2V0VG9Db29yZCApICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGJsZW5kLT50dXBsZWNvdW50ICogZ3Zhcl9oZWFkLmF4aXNDb3VudCAqIDJMICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgYmxlbmQtPnR1cGxlY291bnQ7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIFsgIiApKTsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCAoRlRfVUludClndmFyX2hlYWQuYXhpc0NvdW50OyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgYmxlbmQtPnR1cGxlY29vcmRzW2kgKiBndmFyX2hlYWQuYXhpc0NvdW50ICsgal0gPQotICAgICAgICAgICAgRlRfR0VUX1NIT1JUKCkgKiA0OyAgICAgICAgICAgICAgICAgLyogY29udmVydCB0byBGVF9GaXhlZCAqLwotICAgICAgICAgIEZUX1RSQUNFNSgoICIlLjVmICIsCi0gICAgICAgICAgICBibGVuZC0+dHVwbGVjb29yZHNbaSAqIGd2YXJfaGVhZC5heGlzQ291bnQgKyBqXSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRlRfVFJBQ0U1KCggIl1cbiIgKSk7Ci0gICAgICB9Ci0KLSAgICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3Zhcl9hcHBseV90dXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpZ3VyZSBvdXQgd2hldGhlciBhIGdpdmVuIHR1cGxlIChkZXNpZ24pIGFwcGxpZXMgdG8gdGhlIGN1cnJlbnQgICAqLwotICAvKiAgICBibGVuZCwgYW5kIGlmIHNvLCB3aGF0IGlzIHRoZSBzY2FsaW5nIGZhY3Rvci4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibGVuZCAgICAgICAgICAgOjogVGhlIGN1cnJlbnQgYmxlbmQgb2YgdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR1cGxlSW5kZXggICAgICA6OiBBIGZsYWcgc2F5aW5nIHdoZXRoZXIgdGhpcyBpcyBhbiBpbnRlcm1lZGlhdGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUgb3Igbm90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR1cGxlX2Nvb3JkcyAgICA6OiBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHR1cGxlIGluIG5vcm1hbGl6ZWQgYXhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGltX3N0YXJ0X2Nvb3JkcyA6OiBUaGUgaW5pdGlhbCBjb29yZGluYXRlcyB3aGVyZSB0aGlzIHR1cGxlIHN0YXJ0cyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgdG8gYXBwbHkgKGZvciBpbnRlcm1lZGlhdGUgY29vcmRpbmF0ZXMpLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGltX2VuZF9jb29yZHMgICA6OiBUaGUgZmluYWwgY29vcmRpbmF0ZXMgYWZ0ZXIgd2hpY2ggdGhpcyB0dXBsZSBubyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2VyIGFwcGxpZXMgKGZvciBpbnRlcm1lZGlhdGUgY29vcmRpbmF0ZXMpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBGVF9GaXhlZCB2YWx1ZSBjb250YWluaW5nIHRoZSBzY2FsaW5nIGZhY3Rvci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GaXhlZAotICBmdF92YXJfYXBwbHlfdHVwbGUoIEdYX0JsZW5kICAgYmxlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICB0dXBsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgdHVwbGVfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgaW1fc3RhcnRfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgaW1fZW5kX2Nvb3JkcyApCi0gIHsKLSAgICBGVF9VSW50ICAgaTsKLSAgICBGVF9GaXhlZCAgYXBwbHkgPSAweDEwMDAwTDsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBibGVuZC0+bnVtX2F4aXM7IGkrKyApCi0gICAgewotICAgICAgRlRfVFJBQ0U2KCggIiAgICBheGlzIGNvb3JkaW5hdGUgJWQgKCUuNWYpOlxuIiwKLSAgICAgICAgICAgICAgICAgIGksIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgIGlmICggISggdHVwbGVJbmRleCAmIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSApICkKLSAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIGludGVybWVkaWF0ZSBjb29yZGluYXRlcyAlZCAoJS41ZiwgJS41Zik6XG4iLAotICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICBpbV9zdGFydF9jb29yZHNbaV0gLyA2NTUzNi4wLAotICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLQotICAgICAgLyogSXQncyBub3QgY2xlYXIgd2h5IChmb3IgaW50ZXJtZWRpYXRlIHR1cGxlcykgd2UgZG9uJ3QgbmVlZCAgICAgKi8KLSAgICAgIC8qIHRvIGNoZWNrIGFnYWluc3Qgc3RhcnQvZW5kIC0tIHRoZSBkb2N1bWVudGF0aW9uIHNheXMgd2UgZG9uJ3QuICovCi0gICAgICAvKiBTaW1pbGFybHksIGl0J3MgdW5jbGVhciB3aHkgd2UgZG9uJ3QgbmVlZCB0byBzY2FsZSBhbG9uZyB0aGUgICAqLwotICAgICAgLyogYXhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCB0dXBsZV9jb29yZHNbaV0gPT0gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNigoICIgICAgICB0dXBsZSBjb29yZGluYXRlIGlzIHplcm8sIGlnbm9yZWRcbiIsIGkgKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID09IDAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgYXhpcyBjb29yZGluYXRlIGlzIHplcm8sIHN0b3BcbiIgKSk7Ci0gICAgICAgIGFwcGx5ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPT0gdHVwbGVfY29vcmRzW2ldICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIHR1cGxlIGNvb3JkaW5hdGUgdmFsdWUgJS41ZiBmaXRzIHBlcmZlY3RseVxuIiwKLSAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgICAgLyogYGFwcGx5JyBkb2VzIG5vdCBjaGFuZ2UgKi8KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggISggdHVwbGVJbmRleCAmIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSApICkKLSAgICAgIHsKLSAgICAgICAgLyogbm90IGFuIGludGVybWVkaWF0ZSB0dXBsZSAqLwotCi0gICAgICAgIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCBGVF9NSU4oIDAsIHR1cGxlX2Nvb3Jkc1tpXSApIHx8Ci0gICAgICAgICAgICAgYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPiBGVF9NQVgoIDAsIHR1cGxlX2Nvb3Jkc1tpXSApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNigoICIgICAgICB0dXBsZSBjb29yZGluYXRlIHZhbHVlICUuNWYgaXMgZXhjZWVkZWQsIHN0b3BcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgICAgICBhcHBseSA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgdHVwbGUgY29vcmRpbmF0ZSB2YWx1ZSAlLjVmIGZpdHNcbiIsCi0gICAgICAgICAgICAgICAgICAgIHR1cGxlX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIGFwcGx5ID0gRlRfTXVsRGl2KCBhcHBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzW2ldICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGludGVybWVkaWF0ZSB0dXBsZSAqLwotCi0gICAgICAgIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCBpbV9zdGFydF9jb29yZHNbaV0gfHwKLSAgICAgICAgICAgICBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA+IGltX2VuZF9jb29yZHNbaV0gICApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgaW50ZXJtZWRpYXRlIHR1cGxlIHJhbmdlIFslLjVmOyUuNWZdIGlzIGV4Y2VlZGVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHN0b3BcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2ldIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgICAgICBhcHBseSA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCB0dXBsZV9jb29yZHNbaV0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIGludGVybWVkaWF0ZSB0dXBsZSByYW5nZSBbJS41ZjslLjVmXSBmaXRzXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3Jkc1tpXSAvIDY1NTM2LjAsCi0gICAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgICAgYXBwbHkgPSBGVF9NdWxEaXYoIGFwcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAtIGltX3N0YXJ0X2Nvb3Jkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzW2ldIC0gaW1fc3RhcnRfY29vcmRzW2ldICk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgaW50ZXJtZWRpYXRlIHR1cGxlIHJhbmdlIFslLjVmOyUuNWZdIGZpdHNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2ldIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgICAgICBhcHBseSA9IEZUX011bERpdiggYXBwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX2VuZF9jb29yZHNbaV0gLSBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAtIHR1cGxlX2Nvb3Jkc1tpXSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U2KCggIiAgICBhcHBseSBmYWN0b3IgaXMgJS41ZlxuIiwgYXBwbHkgLyA2NTUzNi4wICkpOwotCi0gICAgcmV0dXJuIGFwcGx5OwotICB9Ci0KLQotICAvKiBjb252ZXJ0IGZyb20gZGVzaWduIGNvb3JkaW5hdGVzIHRvIG5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMgKi8KLQotICBzdGF0aWMgdm9pZAotICBmdF92YXJfdG9fbm9ybWFsaXplZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIG5vcm1hbGl6ZWQgKQotICB7Ci0gICAgR1hfQmxlbmQgICAgICAgIGJsZW5kOwotICAgIEZUX01NX1ZhciogICAgICBtbXZhcjsKLSAgICBGVF9VSW50ICAgICAgICAgaSwgajsKLSAgICBGVF9WYXJfQXhpcyogICAgYTsKLSAgICBHWF9BVmFyU2VnbWVudCAgYXY7Ci0KLQotICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgbW12YXIgPSBibGVuZC0+bW12YXI7Ci0KLSAgICBpZiAoIG51bV9jb29yZHMgPiBtbXZhci0+bnVtX2F4aXMgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJmdF92YXJfdG9fbm9ybWFsaXplZDoiCi0gICAgICAgICAgICAgICAgICAiIG9ubHkgdXNpbmcgZmlyc3QgJWQgb2YgJWQgY29vcmRpbmF0ZXNcbiIsCi0gICAgICAgICAgICAgICAgICBtbXZhci0+bnVtX2F4aXMsIG51bV9jb29yZHMgKSk7Ci0gICAgICBudW1fY29vcmRzID0gbW12YXItPm51bV9heGlzOwotICAgIH0KLQotICAgIC8qIEF4aXMgbm9ybWFsaXphdGlvbiBpcyBhIHR3by1zdGFnZSBwcm9jZXNzLiAgRmlyc3Qgd2Ugbm9ybWFsaXplICovCi0gICAgLyogYmFzZWQgb24gdGhlIFttaW4sZGVmLG1heF0gdmFsdWVzIGZvciB0aGUgYXhpcyB0byBiZSBbLTEsMCwxXS4gKi8KLSAgICAvKiBUaGVuLCBpZiB0aGVyZSdzIGFuIGBhdmFyJyB0YWJsZSwgd2UgcmVub3JtYWxpemUgdGhpcyByYW5nZS4gICAqLwotCi0gICAgRlRfVFJBQ0U1KCggImRlc2lnbiBjb29yZGluYXRlczpcbiIgKSk7Ci0KLSAgICBhID0gbW12YXItPmF4aXM7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fY29vcmRzOyBpKyssIGErKyApCi0gICAgewotICAgICAgRlRfRml4ZWQgIGNvb3JkID0gY29vcmRzW2ldOwotCi0KLSAgICAgIEZUX1RSQUNFNSgoICIgICUuNWZcbiIsIGNvb3JkIC8gNjU1MzYuMCApKTsKLSAgICAgIGlmICggY29vcmQgPiBhLT5tYXhpbXVtIHx8IGNvb3JkIDwgYS0+bWluaW11bSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMSgoCi0gICAgICAgICAgImZ0X3Zhcl90b19ub3JtYWxpemVkOiBkZXNpZ24gY29vcmRpbmF0ZSAlLjVmXG4iCi0gICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICBpcyBvdXQgb2YgcmFuZ2UgWyUuNWY7JS41Zl07IGNsYW1waW5nXG4iLAotICAgICAgICAgIGNvb3JkIC8gNjU1MzYuMCwKLSAgICAgICAgICBhLT5taW5pbXVtIC8gNjU1MzYuMCwKLSAgICAgICAgICBhLT5tYXhpbXVtIC8gNjU1MzYuMCApKTsKLQotICAgICAgICBpZiAoIGNvb3JkID4gYS0+bWF4aW11bSkKLSAgICAgICAgICBjb29yZCA9IGEtPm1heGltdW07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjb29yZCA9IGEtPm1pbmltdW07Ci0gICAgICB9Ci0KLSAgICAgIGlmICggY29vcmQgPCBhLT5kZWYgKQotICAgICAgICBub3JtYWxpemVkW2ldID0gLUZUX0RpdkZpeCggY29vcmRzW2ldIC0gYS0+ZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+bWluaW11bSAtIGEtPmRlZiApOwotICAgICAgZWxzZSBpZiAoIGNvb3JkID4gYS0+ZGVmICkKLSAgICAgICAgbm9ybWFsaXplZFtpXSA9IEZUX0RpdkZpeCggY29vcmRzW2ldIC0gYS0+ZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5tYXhpbXVtIC0gYS0+ZGVmICk7Ci0gICAgICBlbHNlCi0gICAgICAgIG5vcm1hbGl6ZWRbaV0gPSAwOwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgICBmb3IgKCA7IGkgPCBtbXZhci0+bnVtX2F4aXM7IGkrKyApCi0gICAgICBub3JtYWxpemVkW2ldID0gMDsKLQotICAgIGlmICggYmxlbmQtPmF2YXJfc2VnbWVudCApCi0gICAgewotICAgICAgRlRfVFJBQ0U1KCggIm5vcm1hbGl6ZWQgZGVzaWduIGNvb3JkaW5hdGVzIgotICAgICAgICAgICAgICAgICAgIiBiZWZvcmUgYXBwbHlpbmcgYGF2YXInIGRhdGE6XG4iICkpOwotCi0gICAgICBhdiA9IGJsZW5kLT5hdmFyX3NlZ21lbnQ7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IG1tdmFyLT5udW1fYXhpczsgaSsrLCBhdisrICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDE7IGogPCAoRlRfVUludClhdi0+cGFpckNvdW50OyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBub3JtYWxpemVkW2ldIDwgYXYtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgJS41ZlxuIiwgbm9ybWFsaXplZFtpXSAvIDY1NTM2LjAgKSk7Ci0KLSAgICAgICAgICAgIG5vcm1hbGl6ZWRbaV0gPQotICAgICAgICAgICAgICBGVF9NdWxEaXYoIG5vcm1hbGl6ZWRbaV0gLSBhdi0+Y29ycmVzcG9uZGVuY2VbaiAtIDFdLmZyb21Db29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2Vbal0udG9Db29yZCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2VbaiAtIDFdLnRvQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXYtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2VbaiAtIDFdLmZyb21Db29yZCApICsKLSAgICAgICAgICAgICAgYXYtPmNvcnJlc3BvbmRlbmNlW2ogLSAxXS50b0Nvb3JkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBjb252ZXJ0IGZyb20gbm9ybWFsaXplZCBjb29yZGluYXRlcyB0byBkZXNpZ24gY29vcmRpbmF0ZXMgKi8KLQotICBzdGF0aWMgdm9pZAotICBmdF92YXJfdG9fZGVzaWduKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgZGVzaWduICkKLSAgewotICAgIEdYX0JsZW5kICAgICAgYmxlbmQ7Ci0gICAgRlRfTU1fVmFyKiAgICBtbXZhcjsKLSAgICBGVF9WYXJfQXhpcyogIGE7Ci0KLSAgICBGVF9VSW50ICBpLCBqLCBuYzsKLQotCi0gICAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKLQotICAgIG5jID0gbnVtX2Nvb3JkczsKLSAgICBpZiAoIG51bV9jb29yZHMgPiBibGVuZC0+bnVtX2F4aXMgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJmdF92YXJfdG9fZGVzaWduOiIKLSAgICAgICAgICAgICAgICAgICIgb25seSB1c2luZyBmaXJzdCAlZCBvZiAlZCBjb29yZGluYXRlc1xuIiwKLSAgICAgICAgICAgICAgICAgIGJsZW5kLT5udW1fYXhpcywgbnVtX2Nvb3JkcyApKTsKLSAgICAgIG5jID0gYmxlbmQtPm51bV9heGlzOwotICAgIH0KLQotICAgIGlmICggZmFjZS0+ZG9ibGVuZCApCi0gICAgewotICAgICAgZm9yICggaSA9IDA7IGkgPCBuYzsgaSsrICkKLSAgICAgICAgZGVzaWduW2ldID0gY29vcmRzW2ldOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yICggaSA9IDA7IGkgPCBuYzsgaSsrICkKLSAgICAgICAgZGVzaWduW2ldID0gMDsKLSAgICB9Ci0KLSAgICBmb3IgKCA7IGkgPCBudW1fY29vcmRzOyBpKysgKQotICAgICAgZGVzaWduW2ldID0gMDsKLQotICAgIGlmICggYmxlbmQtPmF2YXJfc2VnbWVudCApCi0gICAgewotICAgICAgR1hfQVZhclNlZ21lbnQgIGF2ID0gYmxlbmQtPmF2YXJfc2VnbWVudDsKLQotCi0gICAgICBGVF9UUkFDRTUoKCAiZGVzaWduIGNvb3JkaW5hdGVzIgotICAgICAgICAgICAgICAgICAgIiBhZnRlciByZW1vdmluZyBgYXZhcicgZGlzdG9ydGlvbjpcbiIgKSk7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbmM7IGkrKywgYXYrKyApCi0gICAgICB7Ci0gICAgICAgIGZvciAoIGogPSAxOyBqIDwgKEZUX1VJbnQpYXYtPnBhaXJDb3VudDsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggZGVzaWduW2ldIDwgYXYtPmNvcnJlc3BvbmRlbmNlW2pdLnRvQ29vcmQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRlc2lnbltpXSA9Ci0gICAgICAgICAgICAgIEZUX011bERpdiggZGVzaWduW2ldIC0gYXYtPmNvcnJlc3BvbmRlbmNlW2ogLSAxXS50b0Nvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF2LT5jb3JyZXNwb25kZW5jZVtqXS5mcm9tQ29vcmQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXYtPmNvcnJlc3BvbmRlbmNlW2ogLSAxXS5mcm9tQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXYtPmNvcnJlc3BvbmRlbmNlW2pdLnRvQ29vcmQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXYtPmNvcnJlc3BvbmRlbmNlW2ogLSAxXS50b0Nvb3JkICkgKwotICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2VbaiAtIDFdLmZyb21Db29yZDsKLQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgJS41ZlxuIiwgZGVzaWduW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIG1tdmFyID0gYmxlbmQtPm1tdmFyOwotICAgIGEgICAgID0gbW12YXItPmF4aXM7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG5jOyBpKyssIGErKyApCi0gICAgewotICAgICAgaWYgKCBkZXNpZ25baV0gPCAwICkKLSAgICAgICAgZGVzaWduW2ldID0gYS0+ZGVmICsgRlRfTXVsRml4KCBkZXNpZ25baV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+ZGVmIC0gYS0+bWluaW11bSApOwotICAgICAgZWxzZSBpZiAoIGRlc2lnbltpXSA+IDAgKQotICAgICAgICBkZXNpZ25baV0gPSBhLT5kZWYgKyBGVF9NdWxGaXgoIGRlc2lnbltpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5tYXhpbXVtIC0gYS0+ZGVmICk7Ci0gICAgICBlbHNlCi0gICAgICAgIGRlc2lnbltpXSA9IGEtPmRlZjsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgIE1VTFRJUExFIE1BU1RFUlMgU0VSVklDRSBGVU5DVElPTlMgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0ZWYXJfSGVhZF8KLSAgewotICAgIEZUX0xvbmcgICAgdmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgIG9mZnNldFRvRGF0YTsKLSAgICBGVF9VU2hvcnQgIGF4aXNDb3VudDsKLSAgICBGVF9VU2hvcnQgIGF4aXNTaXplOwotICAgIEZUX1VTaG9ydCAgaW5zdGFuY2VDb3VudDsKLSAgICBGVF9VU2hvcnQgIGluc3RhbmNlU2l6ZTsKLQotICB9IEdYX0ZWYXJfSGVhZDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBmdmFyX2F4aXNfCi0gIHsKLSAgICBGVF9VTG9uZyAgIGF4aXNUYWc7Ci0gICAgRlRfRml4ZWQgICBtaW5WYWx1ZTsKLSAgICBGVF9GaXhlZCAgIGRlZmF1bHRWYWx1ZTsKLSAgICBGVF9GaXhlZCAgIG1heFZhbHVlOwotICAgIEZUX1VTaG9ydCAgZmxhZ3M7Ci0gICAgRlRfVVNob3J0ICBuYW1lSUQ7Ci0KLSAgfSBHWF9GVmFyX0F4aXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfTU1fVmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB0aGF0IHRoZSBmb250J3MgYGZ2YXInIHRhYmxlIGlzIHZhbGlkLCBwYXJzZSBpdCwgYW5kIHJldHVybiAgKi8KLSAgLyogICAgdGhvc2UgZGF0YS4gIEl0IGFsc28gbG9hZHMgKGFuZCBwYXJzZXMpIHRoZSBgTVZBUicgdGFibGUsIGlmICAgICAgICovCi0gIC8qICAgIHBvc3NpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgVFRfR2V0X01NX1ZhciBpbml0aWFsaXplcyB0aGUgYmxlbmQgc3RydWN0dXJlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXN0ZXIgOjogVGhlIGBmdmFyJyBkYXRhIChtdXN0IGJlIGZyZWVkIGJ5IGNhbGxlcikuICBDYW4gYmUgTlVMTCwgKi8KLSAgLyogICAgICAgICAgICAgIHdoaWNoIG1ha2VzIHRoaXMgZnVuY3Rpb24gc2ltcGx5IGxvYWQgTU0gc3VwcG9ydC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfR2V0X01NX1ZhciggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICptYXN0ZXIgKQotICB7Ci0gICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgdGFibGVfbGVuOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICBmdmFyX3N0YXJ0OwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIGksIGo7Ci0gICAgRlRfTU1fVmFyKiAgICAgICAgICAgbW12YXIgPSBOVUxMOwotICAgIEZUX0ZpeGVkKiAgICAgICAgICAgIG5leHRfY29vcmRzOwotICAgIEZUX0ZpeGVkKiAgICAgICAgICAgIG5zYzsKLSAgICBGVF9TdHJpbmcqICAgICAgICAgICBuZXh0X25hbWU7Ci0gICAgRlRfVmFyX0F4aXMqICAgICAgICAgYTsKLSAgICBGVF9GaXhlZCogICAgICAgICAgICBjOwotICAgIEZUX1Zhcl9OYW1lZF9TdHlsZSogIG5zOwotICAgIEdYX0ZWYXJfSGVhZCAgICAgICAgIGZ2YXJfaGVhZDsKLSAgICBGVF9Cb29sICAgICAgICAgICAgICB1c2VQc05hbWU7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgbnVtX2luc3RhbmNlczsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgZnZhcl9maWVsZHNbXSA9Ci0gICAgewotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIEdYX0ZWYXJfSGVhZAotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMTYgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgICAgICggdmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQgICAgKCBvZmZzZXRUb0RhdGEgKSwKLSAgICAgICAgRlRfRlJBTUVfU0tJUF9TSE9SVCwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUICAgICggYXhpc0NvdW50ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCAgICAoIGF4aXNTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCAgICAoIGluc3RhbmNlQ291bnQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUICAgICggaW5zdGFuY2VTaXplICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBmdmFyYXhpc19maWVsZHNbXSA9Ci0gICAgewotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIEdYX0ZWYXJfQXhpcwotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMjAgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBheGlzVGFnICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggbWluVmFsdWUgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBkZWZhdWx0VmFsdWUgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBtYXhWYWx1ZSApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGZsYWdzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbmFtZUlEICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0KLSAgICAvKiByZWFkIHRoZSBmb250IGRhdGEgYW5kIHNldCB1cCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKi8KLSAgICAvKiBpZiBub3QgYWxyZWFkeSBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGlmICggIWZhY2UtPmJsZW5kICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiRlZBUiAiICkpOwotCi0gICAgICAvKiBib3RoIGBmdmFyJyBhbmQgYGd2YXInIG11c3QgYmUgcHJlc2VudCAqLwotICAgICAgaWYgKCBGVF9TRVRfRVJST1IoIGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZ3ZhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sICZ0YWJsZV9sZW4gKSApICkKLSAgICAgIHsKLSAgICAgICAgLyogQ0ZGMiBpcyBhbiBhbHRlcm5hdGUgdG8gZ3ZhciBoZXJlICovCi0gICAgICAgIGlmICggRlRfU0VUX0VSUk9SKCBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX0NGRjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sICZ0YWJsZV9sZW4gKSApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMSgoICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiVFRfR2V0X01NX1ZhcjogYGd2YXInIG9yIGBDRkYyJyB0YWJsZSBpcyBtaXNzaW5nXG4iICkpOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIEZUX1NFVF9FUlJPUiggZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19mdmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgJnRhYmxlX2xlbiApICkgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTEoKCAiaXMgbWlzc2luZ1xuIiApKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBmdmFyX3N0YXJ0ID0gRlRfU1RSRUFNX1BPUyggKTsKLQotICAgICAgLyogdGhlIHZhbGlkaXR5IG9mIHRoZSBgZnZhcicgaGVhZGVyIGRhdGEgd2FzIGFscmVhZHkgY2hlY2tlZCAqLwotICAgICAgLyogaW4gZnVuY3Rpb24gYHNmbnRfaW5pdF9mYWNlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIGZ2YXJfZmllbGRzLCAmZnZhcl9oZWFkICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHVzZVBzTmFtZSA9IEZUX0JPT0woIGZ2YXJfaGVhZC5pbnN0YW5jZVNpemUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgKyA0ICogZnZhcl9oZWFkLmF4aXNDb3VudCApOwotCi0gICAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotCi0gICAgICBGVF9UUkFDRTUoKCAibnVtYmVyIG9mIEdYIHN0eWxlIGF4ZXM6ICVkXG4iLCBmdmFyX2hlYWQuYXhpc0NvdW50ICkpOwotCi0gICAgICBpZiAoIEZUX05FVyggZmFjZS0+YmxlbmQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogYG51bV9pbnN0YW5jZXMnIGhvbGRzIHRoZSBudW1iZXIgb2YgYWxsIG5hbWVkIGluc3RhbmNlcywgKi8KLSAgICAgIC8qIGluY2x1ZGluZyB0aGUgZGVmYXVsdCBpbnN0YW5jZSB3aGljaCBtaWdodCBiZSBtaXNzaW5nICAgICovCi0gICAgICAvKiBpbiBmdmFyJ3MgdGFibGUgb2YgbmFtZWQgaW5zdGFuY2VzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgbnVtX2luc3RhbmNlcyA9IGZhY2UtPnJvb3Quc3R5bGVfZmxhZ3MgPj4gMTY7Ci0KLSAgICAgIC8qIGNhbm5vdCBvdmVyZmxvdyAzMi1iaXQgYXJpdGhtZXRpYyBiZWNhdXNlIG9mIHRoZSBzaXplIGxpbWl0cyAqLwotICAgICAgLyogdXNlZCBpbiB0aGUgYGZ2YXInIHRhYmxlIHZhbGlkaXR5IGNoZWNrIGluIGBzZm50X2luaXRfZmFjZScgICovCi0gICAgICBmYWNlLT5ibGVuZC0+bW12YXJfbGVuID0KLSAgICAgICAgc2l6ZW9mICggRlRfTU1fVmFyICkgKwotICAgICAgICBmdmFyX2hlYWQuYXhpc0NvdW50ICogc2l6ZW9mICggRlRfVmFyX0F4aXMgKSArCi0gICAgICAgIG51bV9pbnN0YW5jZXMgKiBzaXplb2YgKCBGVF9WYXJfTmFtZWRfU3R5bGUgKSArCi0gICAgICAgIG51bV9pbnN0YW5jZXMgKiBmdmFyX2hlYWQuYXhpc0NvdW50ICogc2l6ZW9mICggRlRfRml4ZWQgKSArCi0gICAgICAgIDUgKiBmdmFyX2hlYWQuYXhpc0NvdW50OwotCi0gICAgICBpZiAoIEZUX0FMTE9DKCBtbXZhciwgZmFjZS0+YmxlbmQtPm1tdmFyX2xlbiApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgZmFjZS0+YmxlbmQtPm1tdmFyID0gbW12YXI7Ci0KLSAgICAgIC8qIHNldCB1cCBwb2ludGVycyBhbmQgb2Zmc2V0cyBpbnRvIHRoZSBgbW12YXInIGFycmF5OyAqLwotICAgICAgLyogdGhlIGRhdGEgZ2V0cyBmaWxsZWQgaW4gbGF0ZXIgb24gICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIG1tdmFyLT5udW1fYXhpcyA9Ci0gICAgICAgIGZ2YXJfaGVhZC5heGlzQ291bnQ7Ci0gICAgICBtbXZhci0+bnVtX2Rlc2lnbnMgPQotICAgICAgICB+MFU7ICAgICAgICAgICAgICAgICAgIC8qIG1lYW5pbmdsZXNzIGluIHRoaXMgY29udGV4dDsgZWFjaCBnbHlwaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heSBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBkZXNpZ25zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvciB0dXBsZXMsIGFzIGNhbGxlZCBieSBBcHBsZSkgICAgICAgICAqLwotICAgICAgbW12YXItPm51bV9uYW1lZHN0eWxlcyA9Ci0gICAgICAgIG51bV9pbnN0YW5jZXM7Ci0gICAgICBtbXZhci0+YXhpcyA9Ci0gICAgICAgIChGVF9WYXJfQXhpcyopJiggbW12YXJbMV0gKTsKLSAgICAgIG1tdmFyLT5uYW1lZHN0eWxlID0KLSAgICAgICAgKEZUX1Zhcl9OYW1lZF9TdHlsZSopJiggbW12YXItPmF4aXNbZnZhcl9oZWFkLmF4aXNDb3VudF0gKTsKLQotICAgICAgbmV4dF9jb29yZHMgPQotICAgICAgICAoRlRfRml4ZWQqKSYoIG1tdmFyLT5uYW1lZHN0eWxlW251bV9pbnN0YW5jZXNdICk7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9pbnN0YW5jZXM7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIG1tdmFyLT5uYW1lZHN0eWxlW2ldLmNvb3JkcyAgPSBuZXh0X2Nvb3JkczsKLSAgICAgICAgbmV4dF9jb29yZHMgICAgICAgICAgICAgICAgICs9IGZ2YXJfaGVhZC5heGlzQ291bnQ7Ci0gICAgICB9Ci0KLSAgICAgIG5leHRfbmFtZSA9IChGVF9TdHJpbmcqKW5leHRfY29vcmRzOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBmdmFyX2hlYWQuYXhpc0NvdW50OyBpKysgKQotICAgICAgewotICAgICAgICBtbXZhci0+YXhpc1tpXS5uYW1lICA9IG5leHRfbmFtZTsKLSAgICAgICAgbmV4dF9uYW1lICAgICAgICAgICArPSA1OwotICAgICAgfQotCi0gICAgICAvKiBub3cgZmlsbCBpbiB0aGUgZGF0YSAqLwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBmdmFyX3N0YXJ0ICsgZnZhcl9oZWFkLm9mZnNldFRvRGF0YSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBhID0gbW12YXItPmF4aXM7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZ2YXJfaGVhZC5heGlzQ291bnQ7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEdYX0ZWYXJfQXhpcyAgYXhpc19yZWM7Ci0KLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggZnZhcmF4aXNfZmllbGRzLCAmYXhpc19yZWMgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBhLT50YWcgICAgID0gYXhpc19yZWMuYXhpc1RhZzsKLSAgICAgICAgYS0+bWluaW11bSA9IGF4aXNfcmVjLm1pblZhbHVlOwotICAgICAgICBhLT5kZWYgICAgID0gYXhpc19yZWMuZGVmYXVsdFZhbHVlOwotICAgICAgICBhLT5tYXhpbXVtID0gYXhpc19yZWMubWF4VmFsdWU7Ci0gICAgICAgIGEtPnN0cmlkICAgPSBheGlzX3JlYy5uYW1lSUQ7Ci0KLSAgICAgICAgYS0+bmFtZVswXSA9IChGVF9TdHJpbmcpKCAgIGEtPnRhZyA+PiAyNCApOwotICAgICAgICBhLT5uYW1lWzFdID0gKEZUX1N0cmluZykoICggYS0+dGFnID4+IDE2ICkgJiAweEZGICk7Ci0gICAgICAgIGEtPm5hbWVbMl0gPSAoRlRfU3RyaW5nKSggKCBhLT50YWcgPj4gIDggKSAmIDB4RkYgKTsKLSAgICAgICAgYS0+bmFtZVszXSA9IChGVF9TdHJpbmcpKCAoIGEtPnRhZyAgICAgICApICYgMHhGRiApOwotICAgICAgICBhLT5uYW1lWzRdID0gJ1wwJzsKLQotICAgICAgICBpZiAoIGEtPm1pbmltdW0gPiBhLT5kZWYgfHwKLSAgICAgICAgICAgICBhLT5kZWYgPiBhLT5tYXhpbXVtICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJUVF9HZXRfTU1fVmFyOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgXCIlc1wiIGF4aXMgcmVjb3JkOyBkaXNhYmxpbmdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgYS0+bmFtZSApKTsKLQotICAgICAgICAgIGEtPm1pbmltdW0gPSBhLT5kZWY7Ci0gICAgICAgICAgYS0+bWF4aW11bSA9IGEtPmRlZjsKLSAgICAgICAgfQotCi0gICAgICAgIEZUX1RSQUNFNSgoICIgIFwiJXNcIjogbWluaW11bT0lLjVmLCBkZWZhdWx0PSUuNWYsIG1heGltdW09JS41ZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgYS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgYS0+bWluaW11bSAvIDY1NTM2LjAsCi0gICAgICAgICAgICAgICAgICAgIGEtPmRlZiAvIDY1NTM2LjAsCi0gICAgICAgICAgICAgICAgICAgIGEtPm1heGltdW0gLyA2NTUzNi4wICkpOwotCi0gICAgICAgIGErKzsKLSAgICAgIH0KLQotICAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKLQotICAgICAgLyogbmFtZWQgaW5zdGFuY2UgY29vcmRpbmF0ZXMgYXJlIHN0b3JlZCBhcyBkZXNpZ24gY29vcmRpbmF0ZXM7ICovCi0gICAgICAvKiB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlbSB0byBub3JtYWxpemVkIGNvb3JkaW5hdGVzIGFsc28gICAgICAgKi8KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBmYWNlLT5ibGVuZC0+bm9ybWFsaXplZF9zdHlsZWNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmdmFyX2hlYWQuYXhpc0NvdW50ICogbnVtX2luc3RhbmNlcyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIGZ2YXJfaGVhZC5pbnN0YW5jZUNvdW50ICYmICFmYWNlLT5ibGVuZC0+YXZhcl9sb2FkZWQgKQotICAgICAgICBmdF92YXJfbG9hZF9hdmFyKCBmYWNlICk7Ci0KLSAgICAgIG5zICA9IG1tdmFyLT5uYW1lZHN0eWxlOwotICAgICAgbnNjID0gZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRfc3R5bGVjb29yZHM7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZ2YXJfaGVhZC5pbnN0YW5jZUNvdW50OyBpKyssIG5zKysgKQotICAgICAgewotICAgICAgICAvKiBQb3N0U2NyaXB0IG5hbWVzIGFkZCAyIGJ5dGVzIHRvIHRoZSBpbnN0YW5jZSByZWNvcmQgc2l6ZSAqLwotICAgICAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCAoIHVzZVBzTmFtZSA/IDZMIDogNEwgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRMICogZnZhcl9oZWFkLmF4aXNDb3VudCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgbnMtPnN0cmlkICAgICAgID0gICAgRlRfR0VUX1VTSE9SVCgpOwotICAgICAgICAodm9pZCkgLyogZmxhZ3MgPSAqLyBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgICAgYyA9IG5zLT5jb29yZHM7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgZnZhcl9oZWFkLmF4aXNDb3VudDsgaisrLCBjKysgKQotICAgICAgICAgICpjID0gRlRfR0VUX0xPTkcoKTsKLQotICAgICAgICBpZiAoIHVzZVBzTmFtZSApCi0gICAgICAgICAgbnMtPnBzaWQgPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgICAgZnRfdmFyX3RvX25vcm1hbGl6ZWQoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdmFyX2hlYWQuYXhpc0NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMtPmNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zYyApOwotICAgICAgICBuc2MgKz0gZnZhcl9oZWFkLmF4aXNDb3VudDsKLQotICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggbnVtX2luc3RhbmNlcyAhPSBmdmFyX2hlYWQuaW5zdGFuY2VDb3VudCApCi0gICAgICB7Ci0gICAgICAgIFNGTlRfU2VydmljZSAgc2ZudCA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotICAgICAgICBGVF9JbnQgICBmb3VuZCwgZHVtbXkxLCBkdW1teTI7Ci0gICAgICAgIEZUX1VJbnQgIHN0cmlkID0gMHhGRkZGRkZGRlVMOwotCi0KLSAgICAgICAgLyogdGhlIGRlZmF1bHQgaW5zdGFuY2UgaXMgbWlzc2luZyBpbiBhcnJheSB0aGUgICAqLwotICAgICAgICAvKiBvZiBuYW1lZCBpbnN0YW5jZXM7IHRyeSB0byBzeW50aGVzaXplIGFuIGVudHJ5ICovCi0gICAgICAgIGZvdW5kID0gc2ZudC0+Z2V0X25hbWVfaWQoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05BTUVfSURfVFlQT0dSQVBISUNfU1VCRkFNSUxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXkyICk7Ci0gICAgICAgIGlmICggZm91bmQgKQotICAgICAgICAgIHN0cmlkID0gVFRfTkFNRV9JRF9UWVBPR1JBUEhJQ19TVUJGQU1JTFk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kID0gc2ZudC0+Z2V0X25hbWVfaWQoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTkFNRV9JRF9GT05UX1NVQkZBTUlMWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teTIgKTsKLSAgICAgICAgICBpZiAoIGZvdW5kICkKLSAgICAgICAgICAgIHN0cmlkID0gVFRfTkFNRV9JRF9GT05UX1NVQkZBTUlMWTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZm91bmQgKQotICAgICAgICB7Ci0gICAgICAgICAgZm91bmQgPSBzZm50LT5nZXRfbmFtZV9pZCggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OQU1FX0lEX1BTX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXkyICk7Ci0gICAgICAgICAgaWYgKCBmb3VuZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIlRUX0dldF9NTV9WYXI6IgotICAgICAgICAgICAgICAgICAgICAgICAgIiBBZGRpbmcgZGVmYXVsdCBpbnN0YW5jZSB0byBuYW1lZCBpbnN0YW5jZXNcbiIgKSk7Ci0KLSAgICAgICAgICAgIG5zID0gJm1tdmFyLT5uYW1lZHN0eWxlW2Z2YXJfaGVhZC5pbnN0YW5jZUNvdW50XTsKLQotICAgICAgICAgICAgbnMtPnN0cmlkID0gc3RyaWQ7Ci0gICAgICAgICAgICBucy0+cHNpZCAgPSBUVF9OQU1FX0lEX1BTX05BTUU7Ci0KLSAgICAgICAgICAgIGEgPSBtbXZhci0+YXhpczsKLSAgICAgICAgICAgIGMgPSBucy0+Y29vcmRzOwotICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBmdmFyX2hlYWQuYXhpc0NvdW50OyBqKyssIGErKywgYysrICkKLSAgICAgICAgICAgICAgKmMgPSBhLT5kZWY7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZ0X3Zhcl9sb2FkX212YXIoIGZhY2UgKTsKLSAgICB9Ci0KLSAgICAvKiBmaWxsIHRoZSBvdXRwdXQgYXJyYXkgaWYgcmVxdWVzdGVkICovCi0KLSAgICBpZiAoIG1hc3RlciApCi0gICAgewotICAgICAgRlRfVUludCAgbjsKLQotCi0gICAgICBpZiAoIEZUX0FMTE9DKCBtbXZhciwgZmFjZS0+YmxlbmQtPm1tdmFyX2xlbiApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgRlRfTUVNX0NPUFkoIG1tdmFyLCBmYWNlLT5ibGVuZC0+bW12YXIsIGZhY2UtPmJsZW5kLT5tbXZhcl9sZW4gKTsKLQotICAgICAgbW12YXItPmF4aXMgPQotICAgICAgICAoRlRfVmFyX0F4aXMqKSYoIG1tdmFyWzFdICk7Ci0gICAgICBtbXZhci0+bmFtZWRzdHlsZSA9Ci0gICAgICAgIChGVF9WYXJfTmFtZWRfU3R5bGUqKSYoIG1tdmFyLT5heGlzW21tdmFyLT5udW1fYXhpc10gKTsKLSAgICAgIG5leHRfY29vcmRzID0KLSAgICAgICAgKEZUX0ZpeGVkKikmKCBtbXZhci0+bmFtZWRzdHlsZVttbXZhci0+bnVtX25hbWVkc3R5bGVzXSApOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG1tdmFyLT5udW1fbmFtZWRzdHlsZXM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIG1tdmFyLT5uYW1lZHN0eWxlW25dLmNvb3JkcyAgPSBuZXh0X2Nvb3JkczsKLSAgICAgICAgbmV4dF9jb29yZHMgICAgICAgICAgICAgICAgICs9IG1tdmFyLT5udW1fYXhpczsKLSAgICAgIH0KLQotICAgICAgYSAgICAgICAgID0gbW12YXItPmF4aXM7Ci0gICAgICBuZXh0X25hbWUgPSAoRlRfU3RyaW5nKiluZXh0X2Nvb3JkczsKLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbW12YXItPm51bV9heGlzOyBuKysgKQotICAgICAgewotICAgICAgICBhLT5uYW1lID0gbmV4dF9uYW1lOwotCi0gICAgICAgIC8qIHN0YW5kYXJkIFBvc3RTY3JpcHQgbmFtZXMgZm9yIHNvbWUgc3RhbmRhcmQgYXBwbGUgdGFncyAqLwotICAgICAgICBpZiAoIGEtPnRhZyA9PSBUVEFHX3dnaHQgKQotICAgICAgICAgIGEtPm5hbWUgPSAoY2hhciopIldlaWdodCI7Ci0gICAgICAgIGVsc2UgaWYgKCBhLT50YWcgPT0gVFRBR193ZHRoICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIqKSJXaWR0aCI7Ci0gICAgICAgIGVsc2UgaWYgKCBhLT50YWcgPT0gVFRBR19vcHN6ICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIqKSJPcHRpY2FsU2l6ZSI7Ci0gICAgICAgIGVsc2UgaWYgKCBhLT50YWcgPT0gVFRBR19zbG50ICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIqKSJTbGFudCI7Ci0KLSAgICAgICAgbmV4dF9uYW1lICs9IDU7Ci0gICAgICAgIGErKzsKLSAgICAgIH0KLQotICAgICAgKm1hc3RlciA9IG1tdmFyOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NldF9tbV9ibGVuZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHNldF9kZXNpZ25fY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEdYX0JsZW5kICAgIGJsZW5kOwotICAgIEZUX01NX1ZhciogIG1tdmFyOwotICAgIEZUX1VJbnQgICAgIGksIGo7Ci0KLSAgICBGVF9Cb29sICAgICBpc19kZWZhdWx0X2luc3RhbmNlID0gVFJVRTsKLSAgICBGVF9Cb29sICAgICBhbGxfZGVzaWduX2Nvb3JkcyAgID0gRkFMU0U7Ci0KLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotICAgIGVudW0KLSAgICB7Ci0gICAgICBtY3Z0X3JldGFpbiwKLSAgICAgIG1jdnRfbW9kaWZ5LAotICAgICAgbWN2dF9sb2FkCi0KLSAgICB9IG1hbmFnZUN2dDsKLQotCi0gICAgZmFjZS0+ZG9ibGVuZCA9IEZBTFNFOwotCi0gICAgaWYgKCAhZmFjZS0+YmxlbmQgKQotICAgIHsKLSAgICAgIGlmICggRlRfU0VUX0VSUk9SKCBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICkgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBibGVuZCA9IGZhY2UtPmJsZW5kOwotICAgIG1tdmFyID0gYmxlbmQtPm1tdmFyOwotCi0gICAgaWYgKCBudW1fY29vcmRzID4gbW12YXItPm51bV9heGlzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiVFRfU2V0X01NX0JsZW5kOiIKLSAgICAgICAgICAgICAgICAgICIgb25seSB1c2luZyBmaXJzdCAlZCBvZiAlZCBjb29yZGluYXRlc1xuIiwKLSAgICAgICAgICAgICAgICAgIG1tdmFyLT5udW1fYXhpcywgbnVtX2Nvb3JkcyApKTsKLSAgICAgIG51bV9jb29yZHMgPSBtbXZhci0+bnVtX2F4aXM7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIm5vcm1hbGl6ZWQgZGVzaWduIGNvb3JkaW5hdGVzOlxuIiApKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2Nvb3JkczsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTUoKCAiICAlLjVmXG4iLCBjb29yZHNbaV0gLyA2NTUzNi4wICkpOwotICAgICAgaWYgKCBjb29yZHNbaV0gPCAtMHgwMDAxMDAwMEwgfHwgY29vcmRzW2ldID4gMHgwMDAxMDAwMEwgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTEoKCAiVFRfU2V0X01NX0JsZW5kOiBub3JtYWxpemVkIGRlc2lnbiBjb29yZGluYXRlICUuNWZcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgaXMgb3V0IG9mIHJhbmdlIFstMTsxXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggY29vcmRzW2ldICE9IDAgKQotICAgICAgICBpc19kZWZhdWx0X2luc3RhbmNlID0gRkFMU0U7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKLQotICAgIGlmICggIWZhY2UtPmlzX2NmZjIgJiYgIWJsZW5kLT5nbHlwaG9mZnNldHMgKQotICAgICAgaWYgKCBGVF9TRVRfRVJST1IoIGZ0X3Zhcl9sb2FkX2d2YXIoIGZhY2UgKSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCAhYmxlbmQtPmNvb3JkcyApCi0gICAgewotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGJsZW5kLT5jb29yZHMsIG1tdmFyLT5udW1fYXhpcyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHRvIGNvbXB1dGUgYWxsIGRlc2lnbiBjb29yZGluYXRlcyAqLwotICAgICAgYWxsX2Rlc2lnbl9jb29yZHMgPSBUUlVFOwotICAgIH0KLQotICAgIGlmICggIWJsZW5kLT5ub3JtYWxpemVkY29vcmRzICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHMsIG1tdmFyLT5udW1fYXhpcyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBtYW5hZ2VDdnQgPSBtY3Z0X21vZGlmeTsKLQotICAgICAgLyogSWYgd2UgaGF2ZSBub3Qgc2V0IHRoZSBibGVuZCBjb29yZGluYXRlcyBiZWZvcmUgdGhpcywgdGhlbiB0aGUgICovCi0gICAgICAvKiBjdnQgdGFibGUgd2lsbCBzdGlsbCBiZSB3aGF0IHdlIHJlYWQgZnJvbSB0aGUgYGN2dCAnIHRhYmxlIGFuZCAgKi8KLSAgICAgIC8qIHdlIGRvbid0IG5lZWQgdG8gcmVsb2FkIGl0LiAgV2UgbWF5IG5lZWQgdG8gY2hhbmdlIGl0IHRob3VnaC4uLiAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWFuYWdlQ3Z0ID0gbWN2dF9yZXRhaW47Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2Nvb3JkczsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAhPSBjb29yZHNbaV0gKQotICAgICAgICB7Ci0gICAgICAgICAgbWFuYWdlQ3Z0ID0gbWN2dF9sb2FkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIDsgaSA8IG1tdmFyLT5udW1fYXhpczsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgIG1hbmFnZUN2dCA9IG1jdnRfbG9hZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBJZiB3ZSBkb24ndCBjaGFuZ2UgdGhlIGJsZW5kIGNvb3JkcyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gICovCi0gICAgICAvKiBhbnl0aGluZyB0byB0aGUgY3Z0IHRhYmxlLiAgSXQgd2lsbCBiZSBjb3JyZWN0LiAgT3RoZXJ3aXNlIHdlICovCi0gICAgICAvKiBubyBsb25nZXIgaGF2ZSB0aGUgb3JpZ2luYWwgY3Z0IChpdCB3YXMgbW9kaWZpZWQgd2hlbiB3ZSBzZXQgICovCi0gICAgICAvKiB0aGUgYmxlbmQgbGFzdCB0aW1lKSwgc28gd2UgbXVzdCByZWxvYWQgYW5kIHRoZW4gbW9kaWZ5IGl0LiAgICovCi0gICAgfQotCi0gICAgYmxlbmQtPm51bV9heGlzID0gbW12YXItPm51bV9heGlzOwotICAgIEZUX01FTV9DT1BZKCBibGVuZC0+bm9ybWFsaXplZGNvb3JkcywKLSAgICAgICAgICAgICAgICAgY29vcmRzLAotICAgICAgICAgICAgICAgICBudW1fY29vcmRzICogc2l6ZW9mICggRlRfRml4ZWQgKSApOwotCi0gICAgaWYgKCBzZXRfZGVzaWduX2Nvb3JkcyApCi0gICAgICBmdF92YXJfdG9fZGVzaWduKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2Rlc2lnbl9jb29yZHMgPyBibGVuZC0+bnVtX2F4aXMgOiBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+Y29vcmRzICk7Ci0KLSAgICBmYWNlLT5kb2JsZW5kID0gVFJVRTsKLQotICAgIGlmICggZmFjZS0+Y3Z0ICkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCBtYW5hZ2VDdnQgKQotICAgICAgewotICAgICAgY2FzZSBtY3Z0X2xvYWQ6Ci0gICAgICAgIC8qIFRoZSBjdnQgdGFibGUgaGFzIGJlZW4gbG9hZGVkIGFscmVhZHk7IGV2ZXJ5IHRpbWUgd2UgY2hhbmdlIHRoZSAqLwotICAgICAgICAvKiBibGVuZCB3ZSBtYXkgbmVlZCB0byByZWxvYWQgYW5kIHJlbW9kaWZ5IHRoZSBjdnQgdGFibGUuICAgICAgICAgKi8KLSAgICAgICAgRlRfRlJFRSggZmFjZS0+Y3Z0ICk7Ci0gICAgICAgIGZhY2UtPmN2dCA9IE5VTEw7Ci0KLSAgICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfY3Z0KCBmYWNlLCBmYWNlLT5yb290LnN0cmVhbSApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBtY3Z0X21vZGlmeToKLSAgICAgICAgLyogVGhlIG9yaWdpbmFsIGN2dCB0YWJsZSBpcyBpbiBtZW1vcnkuICBBbGwgd2UgbmVlZCB0byBkbyBpcyAqLwotICAgICAgICAvKiBhcHBseSB0aGUgYGN2YXInIHRhYmxlIChpZiBhbnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGVycm9yID0gdHRfZmFjZV92YXJ5X2N2dCggZmFjZSwgZmFjZS0+cm9vdC5zdHJlYW0gKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgbWN2dF9yZXRhaW46Ci0gICAgICAgIC8qIFRoZSBjdnQgdGFibGUgaXMgY29ycmVjdCBmb3IgdGhpcyBzZXQgb2YgY29vcmRpbmF0ZXMuICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFyaWF0aW9uIHR1cGxlIGNvaW5jaWRlcyAqLwotICAgIC8qIHdpdGggYSBuYW1lZCBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBibGVuZC0+bW12YXItPm51bV9uYW1lZHN0eWxlczsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCogIG5zYyA9IGJsZW5kLT5ub3JtYWxpemVkX3N0eWxlY29vcmRzICsgaSAqIGJsZW5kLT5udW1fYXhpczsKLSAgICAgIEZUX0ZpeGVkKiAgbnMgID0gYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHM7Ci0KLQotICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKywgbnNjKyssIG5zKysgKQotICAgICAgewotICAgICAgICBpZiAoICpuc2MgIT0gKm5zICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCBqID09IGJsZW5kLT5udW1fYXhpcyApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGFkanVzdCBuYW1lZCBpbnN0YW5jZSBpbmRleCAqLwotICAgIGZhY2UtPnJvb3QuZmFjZV9pbmRleCAmPSAweEZGRkY7Ci0gICAgaWYgKCBpIDwgYmxlbmQtPm1tdmFyLT5udW1fbmFtZWRzdHlsZXMgKQotICAgICAgZmFjZS0+cm9vdC5mYWNlX2luZGV4IHw9ICggaSArIDEgKSA8PCAxNjsKLQotICAgIGZhY2UtPmlzX2RlZmF1bHRfaW5zdGFuY2UgPSBpc19kZWZhdWx0X2luc3RhbmNlOwotCi0gICAgLyogZW5mb3JjZSByZWNvbXB1dGF0aW9uIG9mIHRoZSBQb3N0U2NyaXB0IG5hbWU7ICovCi0gICAgRlRfRlJFRSggZmFjZS0+cG9zdHNjcmlwdF9uYW1lICk7Ci0gICAgZmFjZS0+cG9zdHNjcmlwdF9uYW1lID0gTlVMTDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2V0X01NX0JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSBibGVuZCAobm9ybWFsaXplZCkgY29vcmRpbmF0ZXMgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlICAgICovCi0gIC8qICAgIGZvbnQuICBDaGVjayB0aGF0IHRoZSBgZ3ZhcicgdGFibGUgaXMgcmVhc29uYWJsZSBhbmQgZG9lcyBzb21lICAgICAqLwotICAvKiAgICBpbml0aWFsIHByZXBhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBibGVuZCBzdHJ1Y3R1cmUgd2l0aCBgZ3ZhcicgZGF0YS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgKDApIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IEFuIGFycmF5IG9mIGBudW1fY29vcmRzJywgZWFjaCBiZXR3ZWVuIFstMSwxXS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9TZXRfTU1fQmxlbmQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgcmV0dXJuIHR0X3NldF9tbV9ibGVuZCggZmFjZSwgbnVtX2Nvb3JkcywgY29vcmRzLCAxICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dldF9NTV9CbGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldCB0aGUgYmxlbmQgKG5vcm1hbGl6ZWQpIGNvb3JkaW5hdGVzIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSAgICAqLwotICAvKiAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBibGVuZCBzdHJ1Y3R1cmUgd2l0aCBgZ3ZhcicgZGF0YS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBzZXQgdGhlIGV4Y2VzcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcyB0byAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyAgICAgOjogQW4gYXJyYXkgb2YgYG51bV9jb29yZHMnLCBlYWNoIGJldHdlZW4gWy0xLDFdLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFRUX0dldF9NTV9CbGVuZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgR1hfQmxlbmQgIGJsZW5kOwotICAgIEZUX1VJbnQgICBpLCBuYzsKLQotCi0gICAgaWYgKCAhZmFjZS0+YmxlbmQgKQotICAgIHsKLSAgICAgIGlmICggRlRfU0VUX0VSUk9SKCBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICkgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBibGVuZCA9IGZhY2UtPmJsZW5kOwotCi0gICAgaWYgKCAhYmxlbmQtPmNvb3JkcyApCi0gICAgewotICAgICAgLyogc2VsZWN0IGRlZmF1bHQgaW5zdGFuY2UgY29vcmRpbmF0ZXMgKi8KLSAgICAgIC8qIGlmIG5vIGluc3RhbmNlIGlzIHNlbGVjdGVkIHlldCAgICAgICovCi0gICAgICBpZiAoIEZUX1NFVF9FUlJPUiggdHRfc2V0X21tX2JsZW5kKCBmYWNlLCAwLCBOVUxMLCAxICkgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBuYyA9IG51bV9jb29yZHM7Ci0gICAgaWYgKCBudW1fY29vcmRzID4gYmxlbmQtPm51bV9heGlzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiVFRfR2V0X01NX0JsZW5kOiIKLSAgICAgICAgICAgICAgICAgICIgb25seSB1c2luZyBmaXJzdCAlZCBvZiAlZCBjb29yZGluYXRlc1xuIiwKLSAgICAgICAgICAgICAgICAgIGJsZW5kLT5udW1fYXhpcywgbnVtX2Nvb3JkcyApKTsKLSAgICAgIG5jID0gYmxlbmQtPm51bV9heGlzOwotICAgIH0KLQotICAgIGlmICggZmFjZS0+ZG9ibGVuZCApCi0gICAgewotICAgICAgZm9yICggaSA9IDA7IGkgPCBuYzsgaSsrICkKLSAgICAgICAgY29vcmRzW2ldID0gYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IG5jOyBpKysgKQotICAgICAgICBjb29yZHNbaV0gPSAwOwotICAgIH0KLQotICAgIGZvciAoIDsgaSA8IG51bV9jb29yZHM7IGkrKyApCi0gICAgICBjb29yZHNbaV0gPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2V0X1Zhcl9EZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSBjb29yZGluYXRlcyBmb3IgdGhlIGluc3RhbmNlLCBtZWFzdXJlZCBpbiB0aGUgdXNlciAgICAgICAgICovCi0gIC8qICAgIGNvb3JkaW5hdGUgc3lzdGVtLiAgUGFyc2UgdGhlIGBhdmFyJyB0YWJsZSAoaWYgcHJlc2VudCkgdG8gY29udmVydCAqLwotICAvKiAgICBmcm9tIHVzZXIgdG8gbm9ybWFsaXplZCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBibGVuZCBzdHJ1Y3Qgd2l0aCBgZ3ZhcicgZGF0YS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IEEgY29vcmRpbmF0ZSBhcnJheSB3aXRoIGBudW1fY29vcmRzJyBlbGVtZW50cy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9TZXRfVmFyX0Rlc2lnbiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEdYX0JsZW5kICAgIGJsZW5kOwotICAgIEZUX01NX1ZhciogIG1tdmFyOwotICAgIEZUX1VJbnQgICAgIGk7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLSAgICBGVF9WYXJfQXhpcyogIGE7Ci0gICAgRlRfRml4ZWQqICAgICBjOwotCi0gICAgRlRfRml4ZWQqICBub3JtYWxpemVkID0gTlVMTDsKLQotCi0gICAgaWYgKCAhZmFjZS0+YmxlbmQgKQotICAgIHsKLSAgICAgIGlmICggRlRfU0VUX0VSUk9SKCBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICkgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBibGVuZCA9IGZhY2UtPmJsZW5kOwotICAgIG1tdmFyID0gYmxlbmQtPm1tdmFyOwotCi0gICAgaWYgKCBudW1fY29vcmRzID4gbW12YXItPm51bV9heGlzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiVFRfU2V0X1Zhcl9EZXNpZ246IgotICAgICAgICAgICAgICAgICAgIiBvbmx5IHVzaW5nIGZpcnN0ICVkIG9mICVkIGNvb3JkaW5hdGVzXG4iLAotICAgICAgICAgICAgICAgICAgbW12YXItPm51bV9heGlzLCBudW1fY29vcmRzICkpOwotICAgICAgbnVtX2Nvb3JkcyA9IG1tdmFyLT5udW1fYXhpczsKLSAgICB9Ci0KLSAgICBpZiAoICFibGVuZC0+Y29vcmRzICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPmNvb3JkcywgbW12YXItPm51bV9heGlzICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgRlRfTUVNX0NPUFkoIGJsZW5kLT5jb29yZHMsCi0gICAgICAgICAgICAgICAgIGNvb3JkcywKLSAgICAgICAgICAgICAgICAgbnVtX2Nvb3JkcyAqIHNpemVvZiAoIEZUX0ZpeGVkICkgKTsKLQotICAgIGEgPSBtbXZhci0+YXhpcyArIG51bV9jb29yZHM7Ci0gICAgYyA9IGJsZW5kLT5jb29yZHMgKyBudW1fY29vcmRzOwotICAgIGZvciAoIGkgPSBudW1fY29vcmRzOyBpIDwgbW12YXItPm51bV9heGlzOyBpKyssIGErKywgYysrICkKLSAgICAgICpjID0gYS0+ZGVmOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIG5vcm1hbGl6ZWQsIG1tdmFyLT5udW1fYXhpcyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggIWZhY2UtPmJsZW5kLT5hdmFyX2xvYWRlZCApCi0gICAgICBmdF92YXJfbG9hZF9hdmFyKCBmYWNlICk7Ci0KLSAgICBmdF92YXJfdG9fbm9ybWFsaXplZCggZmFjZSwgbnVtX2Nvb3JkcywgYmxlbmQtPmNvb3Jkcywgbm9ybWFsaXplZCApOwotCi0gICAgZXJyb3IgPSB0dF9zZXRfbW1fYmxlbmQoIGZhY2UsIG1tdmFyLT5udW1fYXhpcywgbm9ybWFsaXplZCwgMCApOwotCi0gIEV4aXQ6Ci0gICAgRlRfRlJFRSggbm9ybWFsaXplZCApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2V0X1Zhcl9EZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbnRlcnBvbGF0ZWQgICovCi0gIC8qICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGRlc2lnbiBjb29yZGluYXRlcyB0byByZXRyaWV2ZS4gIElmIGl0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBzZXQgdGhlIGV4Y2VzcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcyB0b34wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IFRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9HZXRfVmFyX0Rlc2lnbiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEdYX0JsZW5kICBibGVuZDsKLSAgICBGVF9VSW50ICAgaSwgbmM7Ci0KLQotICAgIGlmICggIWZhY2UtPmJsZW5kICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX1NFVF9FUlJPUiggVFRfR2V0X01NX1ZhciggZmFjZSwgTlVMTCApICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKLQotICAgIGlmICggIWJsZW5kLT5jb29yZHMgKQotICAgIHsKLSAgICAgIC8qIHNlbGVjdCBkZWZhdWx0IGluc3RhbmNlIGNvb3JkaW5hdGVzICovCi0gICAgICAvKiBpZiBubyBpbnN0YW5jZSBpcyBzZWxlY3RlZCB5ZXQgICAgICAqLwotICAgICAgaWYgKCBGVF9TRVRfRVJST1IoIHR0X3NldF9tbV9ibGVuZCggZmFjZSwgMCwgTlVMTCwgMSApICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgbmMgPSBudW1fY29vcmRzOwotICAgIGlmICggbnVtX2Nvb3JkcyA+IGJsZW5kLT5udW1fYXhpcyApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIlRUX0dldF9WYXJfRGVzaWduOiIKLSAgICAgICAgICAgICAgICAgICIgb25seSB1c2luZyBmaXJzdCAlZCBvZiAlZCBjb29yZGluYXRlc1xuIiwKLSAgICAgICAgICAgICAgICAgIGJsZW5kLT5udW1fYXhpcywgbnVtX2Nvb3JkcyApKTsKLSAgICAgIG5jID0gYmxlbmQtPm51bV9heGlzOwotICAgIH0KLQotICAgIGlmICggZmFjZS0+ZG9ibGVuZCApCi0gICAgewotICAgICAgZm9yICggaSA9IDA7IGkgPCBuYzsgaSsrICkKLSAgICAgICAgY29vcmRzW2ldID0gYmxlbmQtPmNvb3Jkc1tpXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbmM7IGkrKyApCi0gICAgICAgIGNvb3Jkc1tpXSA9IDA7Ci0gICAgfQotCi0gICAgZm9yICggOyBpIDwgbnVtX2Nvb3JkczsgaSsrICkKLSAgICAgIGNvb3Jkc1tpXSA9IDA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICBHWCBWQVIgUEFSU0lORyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfdmFyeV9jdnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vZGlmeSB0aGUgbG9hZGVkIGN2dCB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIGBjdmFyJyB0YWJsZSBhbmQgdGhlICAqLwotICAvKiAgICBmb250J3MgYmxlbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vc3QgZXJyb3JzIGFyZSBpZ25vcmVkLiAgSXQgaXMgcGVyZmVjdGx5IHZhbGlkIG5vdCB0byBoYXZlIGEgICAgICAqLwotICAvKiAgICBgY3ZhcicgdGFibGUgZXZlbiBpZiB0aGVyZSBpcyBhIGBndmFyJyBhbmQgYGZ2YXInIHRhYmxlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX3ZhcnlfY3Z0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX1VMb25nICAgIHRhYmxlX3N0YXJ0OwotICAgIEZUX1VMb25nICAgIHRhYmxlX2xlbjsKLSAgICBGVF9VSW50ICAgICB0dXBsZUNvdW50OwotICAgIEZUX1VMb25nICAgIG9mZnNldFRvRGF0YTsKLSAgICBGVF9VTG9uZyAgICBoZXJlOwotICAgIEZUX1VJbnQgICAgIGksIGo7Ci0gICAgRlRfRml4ZWQqICAgdHVwbGVfY29vcmRzICAgID0gTlVMTDsKLSAgICBGVF9GaXhlZCogICBpbV9zdGFydF9jb29yZHMgPSBOVUxMOwotICAgIEZUX0ZpeGVkKiAgIGltX2VuZF9jb29yZHMgICA9IE5VTEw7Ci0gICAgR1hfQmxlbmQgICAgYmxlbmQgICAgICAgICAgID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfVUludCAgICAgcG9pbnRfY291bnQ7Ci0gICAgRlRfVVNob3J0KiAgbG9jYWxwb2ludHM7Ci0gICAgRlRfU2hvcnQqICAgZGVsdGFzOwotCi0KLSAgICBGVF9UUkFDRTIoKCAiQ1ZBUiAiICkpOwotCi0gICAgaWYgKCAhYmxlbmQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJcbiIKLSAgICAgICAgICAgICAgICAgICJ0dF9mYWNlX3ZhcnlfY3Z0OiBubyBibGVuZCBzcGVjaWZpZWRcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoICFmYWNlLT5jdnQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJcbiIKLSAgICAgICAgICAgICAgICAgICJ0dF9mYWNlX3ZhcnlfY3Z0OiBubyBgY3Z0ICcgdGFibGVcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfY3Zhciwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmdcbiIgKSk7Ci0KLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIHRhYmxlX2xlbiApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICB0YWJsZV9zdGFydCA9IEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICk7Ci0gICAgaWYgKCBGVF9HRVRfTE9ORygpICE9IDB4MDAwMTAwMDBMICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiYmFkIHRhYmxlIHZlcnNpb25cbiIgKSk7Ci0KLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgZ290byBGRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHR1cGxlX2Nvb3JkcywgYmxlbmQtPm51bV9heGlzICkgICAgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggaW1fc3RhcnRfY29vcmRzLCBibGVuZC0+bnVtX2F4aXMgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBpbV9lbmRfY29vcmRzLCBibGVuZC0+bnVtX2F4aXMgKSAgICkKLSAgICAgIGdvdG8gRkV4aXQ7Ci0KLSAgICB0dXBsZUNvdW50ICAgPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgb2Zmc2V0VG9EYXRhID0gRlRfR0VUX1VTSE9SVCgpOwotCi0gICAgLyogcm91Z2ggc2FuaXR5IHRlc3QgKi8KLSAgICBpZiAoIG9mZnNldFRvRGF0YSArICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFX0NPVU5UX01BU0sgKSAqIDQgPgotICAgICAgICAgICB0YWJsZV9sZW4gKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJ0dF9mYWNlX3ZhcnlfY3Z0OiIKLSAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBDVlQgdmFyaWF0aW9uIGFycmF5IGhlYWRlclxuIiApKTsKLQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBGRXhpdDsKLSAgICB9Ci0KLSAgICBvZmZzZXRUb0RhdGEgKz0gdGFibGVfc3RhcnQ7Ci0KLSAgICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBpbXBsaWVzIHRoZXJlIGFyZSBmbGFncyBwYWNrZWQgaW50byAgICAgICAgICAgICAgKi8KLSAgICAvKiBgdHVwbGVDb3VudCcsIGJ1dCBKb2huIEplbmtpbnMgc2F5cyB0aGF0IHNoYXJlZCBwb2ludHMgZG9uJ3QgYXBwbHkgKi8KLSAgICAvKiB0byBgY3ZhcicsIGFuZCBubyBvdGhlciBmbGFncyBhcmUgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIEZUX1RSQUNFNSgoICJjdmFyOiB0aGVyZSBhcmUgJWQgdHVwbGVzOlxuIiwgdHVwbGVDb3VudCAmIDB4RkZGICkpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCAoIHR1cGxlQ291bnQgJiAweEZGRiApOyBpKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICB0dXBsZURhdGFTaXplOwotICAgICAgRlRfVUludCAgIHR1cGxlSW5kZXg7Ci0gICAgICBGVF9GaXhlZCAgYXBwbHk7Ci0KLQotICAgICAgRlRfVFJBQ0U2KCggIiAgdHVwbGUgJWQ6XG4iLCBpICkpOwotCi0gICAgICB0dXBsZURhdGFTaXplID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgdHVwbGVJbmRleCAgICA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgLyogVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGhlcmUgZm9yIGEgZ2xvYmFsIHR1cGxlIGNvb3JkaW5hdGUgc2VjdGlvbiwgKi8KLSAgICAgIC8qIHNvIEpvaG4gc2F5cy4gIFRoZXJlIGFyZSBubyB0dXBsZSBpbmRpY2VzLCBqdXN0IGVtYmVkZGVkIHR1cGxlcy4gICovCi0KLSAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0VNQkVEREVEX1RVUExFX0NPT1JEICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCi0gICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OyAgLyogY29udmVydCBmcm9tICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3J0IGZyYWMgdG8gZml4ZWQgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCB0aGlzIHR1cGxlOyBpdCBtYWtlcyBubyBzZW5zZSAqLwotCi0gICAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSApCi0gICAgICAgICAgZm9yICggaiA9IDA7IGogPCAyICogYmxlbmQtPm51bV9heGlzOyBqKysgKQotICAgICAgICAgICAgKHZvaWQpRlRfR0VUX1NIT1JUKCk7Ci0KLSAgICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9JTlRFUk1FRElBVEVfVFVQTEUgKQotICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgaisrICkKLSAgICAgICAgICBpbV9zdGFydF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyBqKysgKQotICAgICAgICAgIGltX2VuZF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7Ci0gICAgICB9Ci0KLSAgICAgIGFwcGx5ID0gZnRfdmFyX2FwcGx5X3R1cGxlKCBibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KXR1cGxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzICk7Ci0gICAgICBpZiAoIC8qIHR1cGxlIGlzbid0IGFjdGl2ZSBmb3Igb3VyIGJsZW5kICovCi0gICAgICAgICAgIGFwcGx5ID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAvKiBnbG9iYWwgcG9pbnRzIG5vdCBhbGxvd2VkLCAgICAgICAgICAgKi8KLSAgICAgICAgICAgLyogaWYgdGhleSBhcmVuJ3QgbG9jYWwsIG1ha2VzIG5vIHNlbnNlICovCi0gICAgICAgICAgICEoIHR1cGxlSW5kZXggJiBHWF9USV9QUklWQVRFX1BPSU5UX05VTUJFUlMgKSApCi0gICAgICB7Ci0gICAgICAgIG9mZnNldFRvRGF0YSArPSB0dXBsZURhdGFTaXplOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaGVyZSA9IEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICk7Ci0KLSAgICAgIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIG9mZnNldFRvRGF0YSApOwotCi0gICAgICBsb2NhbHBvaW50cyA9IGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRfY291bnQgKTsKLSAgICAgIGRlbHRhcyAgICAgID0gZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXMoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvdW50ID09IDAgPyBmYWNlLT5jdnRfc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBvaW50X2NvdW50ICk7Ci0gICAgICBpZiAoICFsb2NhbHBvaW50cyB8fCAhZGVsdGFzICkKLSAgICAgICAgOyAvKiBmYWlsdXJlLCBpZ25vcmUgaXQgKi8KLQotICAgICAgZWxzZSBpZiAoIGxvY2FscG9pbnRzID09IEFMTF9QT0lOVFMgKQotICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGludCAgY291bnQgPSAwOwotI2VuZGlmCi0KLQotICAgICAgICBGVF9UUkFDRTcoKCAiICAgIENWVCBkZWx0YXM6XG4iICkpOwotCi0gICAgICAgIC8qIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgZGVsdGFzIGZvciBldmVyeSBlbnRyeSBpbiBjdnQgKi8KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBmYWNlLT5jdnRfc2l6ZTsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0xvbmcgIG9yaWdfY3Z0ID0gZmFjZS0+Y3Z0W2pdOwotCi0KLSAgICAgICAgICBmYWNlLT5jdnRbal0gPSAoRlRfU2hvcnQpKCBvcmlnX2N2dCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBkZWx0YXNbal0sIGFwcGx5ICkgKTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgaWYgKCBvcmlnX2N2dCAhPSBmYWNlLT5jdnRbal0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICAlZDogJWQgLT4gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBqLCBvcmlnX2N2dCwgZmFjZS0+Y3Z0W2pdICkpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgaWYgKCAhY291bnQgKQotICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICBub25lXG4iICkpOwotI2VuZGlmCi0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBpbnQgIGNvdW50ID0gMDsKLSNlbmRpZgotCi0KLSAgICAgICAgRlRfVFJBQ0U3KCggIiAgICBDVlQgZGVsdGFzOlxuIiApKTsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHBvaW50X2NvdW50OyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaW50ICAgICAgcGluZGV4OwotICAgICAgICAgIEZUX0xvbmcgIG9yaWdfY3Z0OwotCi0KLSAgICAgICAgICBwaW5kZXggPSBsb2NhbHBvaW50c1tqXTsKLSAgICAgICAgICBpZiAoIChGVF9VTG9uZylwaW5kZXggPj0gZmFjZS0+Y3Z0X3NpemUgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBvcmlnX2N2dCAgICAgICAgICA9IGZhY2UtPmN2dFtwaW5kZXhdOwotICAgICAgICAgIGZhY2UtPmN2dFtwaW5kZXhdID0gKEZUX1Nob3J0KSggb3JpZ19jdnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBkZWx0YXNbal0sIGFwcGx5ICkgKTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgaWYgKCBvcmlnX2N2dCAhPSBmYWNlLT5jdnRbcGluZGV4XSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgICVkOiAlZCAtPiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpbmRleCwgb3JpZ19jdnQsIGZhY2UtPmN2dFtwaW5kZXhdICkpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgaWYgKCAhY291bnQgKQotICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICBub25lXG4iICkpOwotI2VuZGlmCi0gICAgICB9Ci0KLSAgICAgIGlmICggbG9jYWxwb2ludHMgIT0gQUxMX1BPSU5UUyApCi0gICAgICAgIEZUX0ZSRUUoIGxvY2FscG9pbnRzICk7Ci0gICAgICBGVF9GUkVFKCBkZWx0YXMgKTsKLQotICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7Ci0KLSAgICAgIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIGhlcmUgKTsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwotCi0gIEZFeGl0OgotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICBFeGl0OgotICAgIEZUX0ZSRUUoIHR1cGxlX2Nvb3JkcyApOwotICAgIEZUX0ZSRUUoIGltX3N0YXJ0X2Nvb3JkcyApOwotICAgIEZUX0ZSRUUoIGltX2VuZF9jb29yZHMgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogU2hpZnQgdGhlIG9yaWdpbmFsIGNvb3JkaW5hdGVzIG9mIGFsbCBwb2ludHMgYmV0d2VlbiBpbmRpY2VzIGBwMScgKi8KLSAgLyogYW5kIGBwMicsIHVzaW5nIHRoZSBzYW1lIGRpZmZlcmVuY2UgYXMgZ2l2ZW4gYnkgaW5kZXggYHJlZicuICAgICAgKi8KLQotICAvKiBtb2RlbGVkIGFmdGVyIGBhZl9pdXBfc2hpZnQnICovCi0KLSAgc3RhdGljIHZvaWQKLSAgdHRfZGVsdGFfc2hpZnQoIGludCAgICAgICAgIHAxLAotICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgcDIsCi0gICAgICAgICAgICAgICAgICBpbnQgICAgICAgICByZWYsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBpbl9wb2ludHMsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBvdXRfcG9pbnRzICkKLSAgewotICAgIGludCAgICAgICAgcDsKLSAgICBGVF9WZWN0b3IgIGRlbHRhOwotCi0KLSAgICBkZWx0YS54ID0gb3V0X3BvaW50c1tyZWZdLnggLSBpbl9wb2ludHNbcmVmXS54OwotICAgIGRlbHRhLnkgPSBvdXRfcG9pbnRzW3JlZl0ueSAtIGluX3BvaW50c1tyZWZdLnk7Ci0KLSAgICBpZiAoIGRlbHRhLnggPT0gMCAmJiBkZWx0YS55ID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gICAgZm9yICggcCA9IHAxOyBwIDwgcmVmOyBwKysgKQotICAgIHsKLSAgICAgIG91dF9wb2ludHNbcF0ueCArPSBkZWx0YS54OwotICAgICAgb3V0X3BvaW50c1twXS55ICs9IGRlbHRhLnk7Ci0gICAgfQotCi0gICAgZm9yICggcCA9IHJlZiArIDE7IHAgPD0gcDI7IHArKyApCi0gICAgewotICAgICAgb3V0X3BvaW50c1twXS54ICs9IGRlbHRhLng7Ci0gICAgICBvdXRfcG9pbnRzW3BdLnkgKz0gZGVsdGEueTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIEludGVycG9sYXRlIHRoZSBvcmlnaW5hbCBjb29yZGluYXRlcyBvZiBhbGwgcG9pbnRzIHdpdGggaW5kaWNlcyAqLwotICAvKiBiZXR3ZWVuIGBwMScgYW5kIGBwMicsIHVzaW5nIGByZWYxJyBhbmQgYHJlZjInIGFzIHRoZSByZWZlcmVuY2UgKi8KLSAgLyogcG9pbnQgaW5kaWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogbW9kZWxlZCBhZnRlciBgYWZfaXVwX2ludGVycCcsIGBfaXVwX3dvcmtlcl9pbnRlcnBvbGF0ZScsIGFuZCAqLwotICAvKiBgSW5zX0lVUCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgdHRfZGVsdGFfaW50ZXJwb2xhdGUoIGludCAgICAgICAgIHAxLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICByZWYxLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgcmVmMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGluX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIG91dF9wb2ludHMgKQotICB7Ci0gICAgaW50ICBwLCBpOwotCi0gICAgRlRfUG9zICBvdXQsIGluMSwgaW4yLCBvdXQxLCBvdXQyLCBkMSwgZDI7Ci0KLQotICAgIGlmICggcDEgPiBwMiApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBoYW5kbGUgYm90aCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBjb29yZGluYXRlcyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDw9IDE7IGkrKyApCi0gICAgewotICAgICAgLyogc2hpZnQgYXJyYXkgcG9pbnRlcnMgc28gdGhhdCB3ZSBjYW4gYWNjZXNzIGBmb28ueScgYXMgYGZvby54JyAqLwotICAgICAgaW5fcG9pbnRzICA9IChGVF9WZWN0b3IqKSggKEZUX1BvcyopaW5fcG9pbnRzICsgaSApOwotICAgICAgb3V0X3BvaW50cyA9IChGVF9WZWN0b3IqKSggKEZUX1Bvcyopb3V0X3BvaW50cyArIGkgKTsKLQotICAgICAgaWYgKCBpbl9wb2ludHNbcmVmMV0ueCA+IGluX3BvaW50c1tyZWYyXS54ICkKLSAgICAgIHsKLSAgICAgICAgcCAgICA9IHJlZjE7Ci0gICAgICAgIHJlZjEgPSByZWYyOwotICAgICAgICByZWYyID0gcDsKLSAgICAgIH0KLQotICAgICAgaW4xICA9IGluX3BvaW50c1tyZWYxXS54OwotICAgICAgaW4yICA9IGluX3BvaW50c1tyZWYyXS54OwotICAgICAgb3V0MSA9IG91dF9wb2ludHNbcmVmMV0ueDsKLSAgICAgIG91dDIgPSBvdXRfcG9pbnRzW3JlZjJdLng7Ci0gICAgICBkMSAgID0gb3V0MSAtIGluMTsKLSAgICAgIGQyICAgPSBvdXQyIC0gaW4yOwotCi0gICAgICAvKiBJZiB0aGUgcmVmZXJlbmNlIHBvaW50cyBoYXZlIHRoZSBzYW1lIGNvb3JkaW5hdGUgYnV0IGRpZmZlcmVudCAqLwotICAgICAgLyogZGVsdGEsIGluZmVycmVkIGRlbHRhIGlzIHplcm8uICBPdGhlcndpc2UgaW50ZXJwb2xhdGUuICAgICAgICAgKi8KLSAgICAgIGlmICggaW4xICE9IGluMiB8fCBvdXQxID09IG91dDIgKQotICAgICAgewotICAgICAgICBGVF9GaXhlZCAgc2NhbGUgPSBpbjEgIT0gaW4yID8gRlRfRGl2Rml4KCBvdXQyIC0gb3V0MSwgaW4yIC0gaW4xICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7Ci0KLQotICAgICAgICBmb3IgKCBwID0gcDE7IHAgPD0gcDI7IHArKyApCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQgPSBpbl9wb2ludHNbcF0ueDsKLQotICAgICAgICAgIGlmICggb3V0IDw9IGluMSApCi0gICAgICAgICAgICBvdXQgKz0gZDE7Ci0gICAgICAgICAgZWxzZSBpZiAoIG91dCA+PSBpbjIgKQotICAgICAgICAgICAgb3V0ICs9IGQyOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dCA9IG91dDEgKyBGVF9NdWxGaXgoIG91dCAtIGluMSwgc2NhbGUgKTsKLQotICAgICAgICAgIG91dF9wb2ludHNbcF0ueCA9IG91dDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogSW50ZXJwb2xhdGUgcG9pbnRzIHdpdGhvdXQgZGVsdGEgdmFsdWVzLCBzaW1pbGFyIHRvICovCi0gIC8qIHRoZSBgSVVQJyBoaW50aW5nIGluc3RydWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIG1vZGVsZWQgYWZ0ZXIgYEluc19JVVAgKi8KLQotICBzdGF0aWMgdm9pZAotICB0dF9pbnRlcnBvbGF0ZV9kZWx0YXMoIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICBvdXRfcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICBpbl9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCogICAgIGhhc19kZWx0YSApCi0gIHsKLSAgICBGVF9JbnQgIGZpcnN0X3BvaW50OwotICAgIEZUX0ludCAgZW5kX3BvaW50OwotCi0gICAgRlRfSW50ICBmaXJzdF9kZWx0YTsKLSAgICBGVF9JbnQgIGN1cl9kZWx0YTsKLQotICAgIEZUX0ludCAgICBwb2ludDsKLSAgICBGVF9TaG9ydCAgY29udG91cjsKLQotCi0gICAgLyogaWdub3JlIGVtcHR5IG91dGxpbmVzICovCi0gICAgaWYgKCAhb3V0bGluZS0+bl9jb250b3VycyApCi0gICAgICByZXR1cm47Ci0KLSAgICBjb250b3VyID0gMDsKLSAgICBwb2ludCAgID0gMDsKLQotICAgIGRvCi0gICAgewotICAgICAgZW5kX3BvaW50ICAgPSBvdXRsaW5lLT5jb250b3Vyc1tjb250b3VyXTsKLSAgICAgIGZpcnN0X3BvaW50ID0gcG9pbnQ7Ci0KLSAgICAgIC8qIHNlYXJjaCBmaXJzdCBwb2ludCB0aGF0IGhhcyBhIGRlbHRhICovCi0gICAgICB3aGlsZSAoIHBvaW50IDw9IGVuZF9wb2ludCAmJiAhaGFzX2RlbHRhW3BvaW50XSApCi0gICAgICAgIHBvaW50Kys7Ci0KLSAgICAgIGlmICggcG9pbnQgPD0gZW5kX3BvaW50ICkKLSAgICAgIHsKLSAgICAgICAgZmlyc3RfZGVsdGEgPSBwb2ludDsKLSAgICAgICAgY3VyX2RlbHRhICAgPSBwb2ludDsKLQotICAgICAgICBwb2ludCsrOwotCi0gICAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHNlYXJjaCBuZXh0IHBvaW50IHRoYXQgaGFzIGEgZGVsdGEgICovCi0gICAgICAgICAgLyogYW5kIGludGVycG9sYXRlIGludGVybWVkaWF0ZSBwb2ludHMgKi8KLSAgICAgICAgICBpZiAoIGhhc19kZWx0YVtwb2ludF0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR0X2RlbHRhX2ludGVycG9sYXRlKCBjdXJfZGVsdGEgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wb2ludHMgKTsKLSAgICAgICAgICAgIGN1cl9kZWx0YSA9IHBvaW50OwotICAgICAgICAgIH0KLQotICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzaGlmdCBjb250b3VyIGlmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBkZWx0YSAqLwotICAgICAgICBpZiAoIGN1cl9kZWx0YSA9PSBmaXJzdF9kZWx0YSApCi0gICAgICAgICAgdHRfZGVsdGFfc2hpZnQoIGZpcnN0X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcG9pbnRzICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIG90aGVyd2lzZSBoYW5kbGUgcmVtYWluaW5nIHBvaW50cyAgICAgICAqLwotICAgICAgICAgIC8qIGF0IHRoZSBlbmQgYW5kIGJlZ2lubmluZyBvZiB0aGUgY29udG91ciAqLwotICAgICAgICAgIHR0X2RlbHRhX2ludGVycG9sYXRlKCBjdXJfZGVsdGEgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3BvaW50cyApOwotCi0gICAgICAgICAgaWYgKCBmaXJzdF9kZWx0YSA+IDAgKQotICAgICAgICAgICAgdHRfZGVsdGFfaW50ZXJwb2xhdGUoIGZpcnN0X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2RlbHRhIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wb2ludHMgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29udG91cisrOwotCi0gICAgfSB3aGlsZSAoIGNvbnRvdXIgPCBvdXRsaW5lLT5uX2NvbnRvdXJzICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFwcGx5IHRoZSBhcHByb3ByaWF0ZSBkZWx0YXMgdG8gdGhlIGN1cnJlbnQgZ2x5cGguICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCBiZWluZyBtb2RpZmllZC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuX3BvaW50cyAgICA6OiBUaGUgbnVtYmVyIG9mIHRoZSBwb2ludHMgaW4gdGhlIGdseXBoLCBpbmNsdWRpbmcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgcGhhbnRvbSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgICAgOjogVGhlIG91dGxpbmUgdG8gY2hhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbl9wb2ludHMgKQotICB7Ci0gICAgRlRfU3RyZWFtICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgR1hfQmxlbmQgICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0KLSAgICBGVF9WZWN0b3IqICBwb2ludHNfb3JnID0gTlVMTDsKLSAgICBGVF9WZWN0b3IqICBwb2ludHNfb3V0ID0gTlVMTDsKLSAgICBGVF9Cb29sKiAgICBoYXNfZGVsdGEgID0gTlVMTDsKLQotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX1VMb25nICAgIGdseXBoX3N0YXJ0OwotICAgIEZUX1VJbnQgICAgIHR1cGxlQ291bnQ7Ci0gICAgRlRfVUxvbmcgICAgb2Zmc2V0VG9EYXRhOwotICAgIEZUX1VMb25nICAgIGhlcmU7Ci0gICAgRlRfVUludCAgICAgaSwgajsKLSAgICBGVF9GaXhlZCogICB0dXBsZV9jb29yZHMgICAgPSBOVUxMOwotICAgIEZUX0ZpeGVkKiAgIGltX3N0YXJ0X2Nvb3JkcyA9IE5VTEw7Ci0gICAgRlRfRml4ZWQqICAgaW1fZW5kX2Nvb3JkcyAgID0gTlVMTDsKLSAgICBGVF9VSW50ICAgICBwb2ludF9jb3VudCwgc3BvaW50X2NvdW50ID0gMDsKLSAgICBGVF9VU2hvcnQqICBzaGFyZWRwb2ludHMgPSBOVUxMOwotICAgIEZUX1VTaG9ydCogIGxvY2FscG9pbnRzICA9IE5VTEw7Ci0gICAgRlRfVVNob3J0KiAgcG9pbnRzOwotICAgIEZUX1Nob3J0ICAgICpkZWx0YXNfeCwgKmRlbHRhc195OwotCi0KLSAgICBpZiAoICFmYWNlLT5kb2JsZW5kIHx8ICFibGVuZCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggZ2x5cGhfaW5kZXggPj0gYmxlbmQtPmd2X2dseXBoY250ICAgICAgfHwKLSAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXhdID09Ci0gICAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXggKyAxXSApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIlRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzOiIKLSAgICAgICAgICAgICAgICAgICIgbm8gdmFyaWF0aW9uIGRhdGEgZm9yIHRoaXMgZ2x5cGhcbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBwb2ludHNfb3JnLCBuX3BvaW50cyApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHBvaW50c19vdXQsIG5fcG9pbnRzICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggaGFzX2RlbHRhLCBuX3BvaW50cyApICApCi0gICAgICBnb3RvIEZhaWwxOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmxlbmQtPmdseXBob2Zmc2V0c1tnbHlwaF9pbmRleF0gKSAgIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggYmxlbmQtPmdseXBob2Zmc2V0c1tnbHlwaF9pbmRleCArIDFdIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXhdICkgKQotICAgICAgZ290byBGYWlsMTsKLQotICAgIGdseXBoX3N0YXJ0ID0gRlRfU3RyZWFtX0ZUZWxsKCBzdHJlYW0gKTsKLQotICAgIC8qIGVhY2ggc2V0IG9mIGdseXBoIHZhcmlhdGlvbiBkYXRhIGlzIGZvcm1hdHRlZCBzaW1pbGFybHkgdG8gYGN2YXInICovCi0gICAgLyogKGV4Y2VwdCB3ZSBnZXQgc2hhcmVkIHBvaW50cyBhbmQgZ2xvYmFsIHR1cGxlcykgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCB0dXBsZV9jb29yZHMsIGJsZW5kLT5udW1fYXhpcyApICAgIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIGltX3N0YXJ0X2Nvb3JkcywgYmxlbmQtPm51bV9heGlzICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggaW1fZW5kX2Nvb3JkcywgYmxlbmQtPm51bV9heGlzICkgICApCi0gICAgICBnb3RvIEZhaWwyOwotCi0gICAgdHVwbGVDb3VudCAgID0gRlRfR0VUX1VTSE9SVCgpOwotICAgIG9mZnNldFRvRGF0YSA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgIC8qIHJvdWdoIHNhbml0eSB0ZXN0ICovCi0gICAgaWYgKCBvZmZzZXRUb0RhdGEgKyAoIHR1cGxlQ291bnQgJiBHWF9UQ19UVVBMRV9DT1VOVF9NQVNLICkgKiA0ID4KLSAgICAgICAgICAgYmxlbmQtPmd2YXJfc2l6ZSApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIlRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzOiIKLSAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBnbHlwaCB2YXJpYXRpb24gYXJyYXkgaGVhZGVyXG4iICkpOwotCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEZhaWwyOwotICAgIH0KLQotICAgIG9mZnNldFRvRGF0YSArPSBnbHlwaF9zdGFydDsKLQotICAgIGlmICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFU19TSEFSRV9QT0lOVF9OVU1CRVJTICkKLSAgICB7Ci0gICAgICBoZXJlID0gRlRfU3RyZWFtX0ZUZWxsKCBzdHJlYW0gKTsKLQotICAgICAgRlRfU3RyZWFtX1NlZWtTZXQoIHN0cmVhbSwgb2Zmc2V0VG9EYXRhICk7Ci0KLSAgICAgIHNoYXJlZHBvaW50cyA9IGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPmd2YXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BvaW50X2NvdW50ICk7Ci0gICAgICBvZmZzZXRUb0RhdGEgPSBGVF9TdHJlYW1fRlRlbGwoIHN0cmVhbSApOwotCi0gICAgICBGVF9TdHJlYW1fU2Vla1NldCggc3RyZWFtLCBoZXJlICk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggImd2YXI6IHRoZXJlIGFyZSAlZCB0dXBsZXM6XG4iLAotICAgICAgICAgICAgICAgIHR1cGxlQ291bnQgJiBHWF9UQ19UVVBMRV9DT1VOVF9NQVNLICkpOwotCi0gICAgZm9yICggaiA9IDA7IGogPCBuX3BvaW50czsgaisrICkKLSAgICAgIHBvaW50c19vcmdbal0gPSBvdXRsaW5lLT5wb2ludHNbal07Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8ICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFX0NPVU5UX01BU0sgKTsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgdHVwbGVEYXRhU2l6ZTsKLSAgICAgIEZUX1VJbnQgICB0dXBsZUluZGV4OwotICAgICAgRlRfRml4ZWQgIGFwcGx5OwotCi0KLSAgICAgIEZUX1RSQUNFNigoICIgIHR1cGxlICVkOlxuIiwgaSApKTsKLQotICAgICAgdHVwbGVEYXRhU2l6ZSA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgIHR1cGxlSW5kZXggICAgPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0VNQkVEREVEX1RVUExFX0NPT1JEICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCi0gICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OyAgIC8qIGNvbnZlcnQgZnJvbSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvcnQgZnJhYyB0byBmaXhlZCAqLwotICAgICAgfQotICAgICAgZWxzZSBpZiAoICggdHVwbGVJbmRleCAmIEdYX1RJX1RVUExFX0lOREVYX01BU0sgKSA+PSBibGVuZC0+dHVwbGVjb3VudCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhczoiCi0gICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCB0dXBsZSBpbmRleFxuIiApKTsKLQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRmFpbDI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIEZUX01FTV9DT1BZKAotICAgICAgICAgIHR1cGxlX2Nvb3JkcywKLSAgICAgICAgICAmYmxlbmQtPnR1cGxlY29vcmRzWyggdHVwbGVJbmRleCAmIDB4RkZGICkgKiBibGVuZC0+bnVtX2F4aXNdLAotICAgICAgICAgIGJsZW5kLT5udW1fYXhpcyAqIHNpemVvZiAoIEZUX0ZpeGVkICkgKTsKLQotICAgICAgaWYgKCB0dXBsZUluZGV4ICYgR1hfVElfSU5URVJNRURJQVRFX1RVUExFICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCi0gICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgaisrICkKLSAgICAgICAgICBpbV9lbmRfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OwotICAgICAgfQotCi0gICAgICBhcHBseSA9IGZ0X3Zhcl9hcHBseV90dXBsZSggYmxlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydCl0dXBsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbV9zdGFydF9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3JkcyApOwotCi0gICAgICBpZiAoIGFwcGx5ID09IDAgKSAgICAgICAgICAgICAgLyogdHVwbGUgaXNuJ3QgYWN0aXZlIGZvciBvdXIgYmxlbmQgKi8KLSAgICAgIHsKLSAgICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBoZXJlID0gRlRfU3RyZWFtX0ZUZWxsKCBzdHJlYW0gKTsKLQotICAgICAgRlRfU3RyZWFtX1NlZWtTZXQoIHN0cmVhbSwgb2Zmc2V0VG9EYXRhICk7Ci0KLSAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX1BSSVZBVEVfUE9JTlRfTlVNQkVSUyApCi0gICAgICB7Ci0gICAgICAgIGxvY2FscG9pbnRzID0gZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPmd2YXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50X2NvdW50ICk7Ci0gICAgICAgIHBvaW50cyAgICAgID0gbG9jYWxwb2ludHM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHBvaW50cyAgICAgID0gc2hhcmVkcG9pbnRzOwotICAgICAgICBwb2ludF9jb3VudCA9IHNwb2ludF9jb3VudDsKLSAgICAgIH0KLQotICAgICAgZGVsdGFzX3ggPSBmdF92YXJfcmVhZHBhY2tlZGRlbHRhcyggc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPmd2YXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvdW50ID09IDAgPyBuX3BvaW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBvaW50X2NvdW50ICk7Ci0gICAgICBkZWx0YXNfeSA9IGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+Z3Zhcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY291bnQgPT0gMCA/IG5fcG9pbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcG9pbnRfY291bnQgKTsKLQotICAgICAgaWYgKCAhcG9pbnRzIHx8ICFkZWx0YXNfeSB8fCAhZGVsdGFzX3ggKQotICAgICAgICA7IC8qIGZhaWx1cmUsIGlnbm9yZSBpdCAqLwotCi0gICAgICBlbHNlIGlmICggcG9pbnRzID09IEFMTF9QT0lOVFMgKQotICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGludCAgY291bnQgPSAwOwotI2VuZGlmCi0KLQotICAgICAgICBGVF9UUkFDRTcoKCAiICAgIHBvaW50IGRlbHRhczpcbiIgKSk7Ci0KLSAgICAgICAgLyogdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBkZWx0YXMgZm9yIGV2ZXJ5IHBvaW50IGluIHRoZSBnbHlwaCAqLwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IG5fcG9pbnRzOyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICBkZWx0YV94ID0gRlRfTXVsRml4KCBkZWx0YXNfeFtqXSwgYXBwbHkgKTsKLSAgICAgICAgICBGVF9Qb3MgIGRlbHRhX3kgPSBGVF9NdWxGaXgoIGRlbHRhc195W2pdLCBhcHBseSApOwotCi0KLSAgICAgICAgICBpZiAoIGogPCBuX3BvaW50cyAtIDMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54ICs9IGRlbHRhX3g7Ci0gICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueSArPSBkZWx0YV95OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogVG8gYXZvaWQgZG91YmxlIGFkanVzdG1lbnQgb2YgYWR2YW5jZSB3aWR0aCBvciBoZWlnaHQsICovCi0gICAgICAgICAgICAvKiBhZGp1c3QgcGhhbnRvbSBwb2ludHMgb25seSBpZiB0aGVyZSBpcyBubyBIVkFSIG9yIFZWQVIgKi8KLSAgICAgICAgICAgIC8qIHN1cHBvcnQsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBqID09ICggbl9wb2ludHMgLSAzICkgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgISggZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgICAmCi0gICAgICAgICAgICAgICAgICAgIFRUX0ZBQ0VfRkxBR19WQVJfSEFEVkFOQ0UgKSApCi0gICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54ICs9IGRlbHRhX3g7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBqID09ICggbl9wb2ludHMgLSAyICkgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgISggZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgJgotICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZBQ0VfRkxBR19WQVJfTFNCICAgICkgKQotICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueCArPSBkZWx0YV94OwotCi0gICAgICAgICAgICBlbHNlIGlmICggaiA9PSAoIG5fcG9pbnRzIC0gMSApICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgISggZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgICAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgVFRfRkFDRV9GTEFHX1ZBUl9WQURWQU5DRSApICkKLSAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKz0gZGVsdGFfeTsKLQotICAgICAgICAgICAgZWxzZSBpZiAoIGogPT0gKCBuX3BvaW50cyAtIDAgKSAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgVFRfRkFDRV9GTEFHX1ZBUl9UU0IgICAgKSApCi0gICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS55ICs9IGRlbHRhX3k7Ci0gICAgICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBpZiAoIGRlbHRhX3ggfHwgZGVsdGFfeSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgICVkOiAoJWQsICVkKSAtPiAoJWQsICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGosCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueCAtIGRlbHRhX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueSAtIGRlbHRhX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS55ICkpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgaWYgKCAhY291bnQgKQotICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICBub25lXG4iICkpOwotI2VuZGlmCi0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBpbnQgIGNvdW50ID0gMDsKLSNlbmRpZgotCi0KLSAgICAgICAgLyogd2UgaGF2ZSB0byBpbnRlcnBvbGF0ZSB0aGUgbWlzc2luZyBkZWx0YXMgc2ltaWxhciB0byB0aGUgKi8KLSAgICAgICAgLyogSVVQIGJ5dGVjb2RlIGluc3RydWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBuX3BvaW50czsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIGhhc19kZWx0YVtqXSAgPSBGQUxTRTsKLSAgICAgICAgICBwb2ludHNfb3V0W2pdID0gcG9pbnRzX29yZ1tqXTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgcG9pbnRfY291bnQ7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VU2hvcnQgIGlkeCA9IHBvaW50c1tqXTsKLQotCi0gICAgICAgICAgaWYgKCBpZHggPj0gbl9wb2ludHMgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBoYXNfZGVsdGFbaWR4XSA9IFRSVUU7Ci0KLSAgICAgICAgICBwb2ludHNfb3V0W2lkeF0ueCArPSBGVF9NdWxGaXgoIGRlbHRhc194W2pdLCBhcHBseSApOwotICAgICAgICAgIHBvaW50c19vdXRbaWR4XS55ICs9IEZUX011bEZpeCggZGVsdGFzX3lbal0sIGFwcGx5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBubyBuZWVkIHRvIGhhbmRsZSBwaGFudG9tIHBvaW50cyBoZXJlLCAgICAgICovCi0gICAgICAgIC8qIHNpbmNlIHNvbGl0YXJ5IHBvaW50cyBjYW4ndCBiZSBpbnRlcnBvbGF0ZWQgKi8KLSAgICAgICAgdHRfaW50ZXJwb2xhdGVfZGVsdGFzKCBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzX29yZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfZGVsdGEgKTsKLQotICAgICAgICBGVF9UUkFDRTcoKCAiICAgIHBvaW50IGRlbHRhczpcbiIgKSk7Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBuX3BvaW50czsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgZGVsdGFfeCA9IHBvaW50c19vdXRbal0ueCAtIHBvaW50c19vcmdbal0ueDsKLSAgICAgICAgICBGVF9Qb3MgIGRlbHRhX3kgPSBwb2ludHNfb3V0W2pdLnkgLSBwb2ludHNfb3JnW2pdLnk7Ci0KLQotICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54ICs9IGRlbHRhX3g7Ci0gICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKz0gZGVsdGFfeTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgaWYgKCBkZWx0YV94IHx8IGRlbHRhX3kgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICAlZDogKCVkLCAlZCkgLT4gKCVkLCAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBqLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnggLSBkZWx0YV94LAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgLSBkZWx0YV95LAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueSApKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGlmICggIWNvdW50ICkKLSAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgbm9uZVxuIiApKTsKLSNlbmRpZgotICAgICAgfQotCi0gICAgICBpZiAoIGxvY2FscG9pbnRzICE9IEFMTF9QT0lOVFMgKQotICAgICAgICBGVF9GUkVFKCBsb2NhbHBvaW50cyApOwotICAgICAgRlRfRlJFRSggZGVsdGFzX3ggKTsKLSAgICAgIEZUX0ZSRUUoIGRlbHRhc195ICk7Ci0KLSAgICAgIG9mZnNldFRvRGF0YSArPSB0dXBsZURhdGFTaXplOwotCi0gICAgICBGVF9TdHJlYW1fU2Vla1NldCggc3RyZWFtLCBoZXJlICk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKLQotICBGYWlsMjoKLSAgICBpZiAoIHNoYXJlZHBvaW50cyAhPSBBTExfUE9JTlRTICkKLSAgICAgIEZUX0ZSRUUoIHNoYXJlZHBvaW50cyApOwotICAgIEZUX0ZSRUUoIHR1cGxlX2Nvb3JkcyApOwotICAgIEZUX0ZSRUUoIGltX3N0YXJ0X2Nvb3JkcyApOwotICAgIEZUX0ZSRUUoIGltX2VuZF9jb29yZHMgKTsKLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICBGYWlsMToKLSAgICBGVF9GUkVFKCBwb2ludHNfb3JnICk7Ci0gICAgRlRfRlJFRSggcG9pbnRzX291dCApOwotICAgIEZUX0ZSRUUoIGhhc19kZWx0YSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nZXRfdmFyX2JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBleHRlbmRlZCBpbnRlcm5hbCB2ZXJzaW9uIG9mIGBUVF9HZXRfTU1fQmxlbmQnIHRoYXQgcmV0dXJucyAgICAgKi8KLSAgLyogICAgcG9pbnRlcnMgaW5zdGVhZCBvZiBjb3B5aW5nIGRhdGEsIHdpdGhvdXQgYW55IGluaXRpYWxpemF0aW9uIG9mICAgICovCi0gIC8qICAgIHRoZSBNTSBtYWNoaW5lcnkgaW4gY2FzZSBpdCBpc24ndCBsb2FkZWQgeWV0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2dldF92YXJfYmxlbmQoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAqbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICAgKmNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICAgKm5vcm1hbGl6ZWRjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICptbV92YXIgKQotICB7Ci0gICAgaWYgKCBmYWNlLT5ibGVuZCApCi0gICAgewotICAgICAgaWYgKCBudW1fY29vcmRzICkKLSAgICAgICAgKm51bV9jb29yZHMgICAgICAgPSBmYWNlLT5ibGVuZC0+bnVtX2F4aXM7Ci0gICAgICBpZiAoIGNvb3JkcyApCi0gICAgICAgICpjb29yZHMgICAgICAgICAgID0gZmFjZS0+YmxlbmQtPmNvb3JkczsKLSAgICAgIGlmICggbm9ybWFsaXplZGNvb3JkcyApCi0gICAgICAgICpub3JtYWxpemVkY29vcmRzID0gZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHM7Ci0gICAgICBpZiAoIG1tX3ZhciApCi0gICAgICAgICptbV92YXIgICAgICAgICAgID0gZmFjZS0+YmxlbmQtPm1tdmFyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBudW1fY29vcmRzICkKLSAgICAgICAgKm51bV9jb29yZHMgPSAwOwotICAgICAgaWYgKCBjb29yZHMgKQotICAgICAgICAqY29vcmRzICAgICA9IE5VTEw7Ci0gICAgICBpZiAoIG1tX3ZhciApCi0gICAgICAgICptbV92YXIgICAgID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF92YXJfZG9uZV9pdGVtX3ZhcmlhdGlvbl9zdG9yZSggVFRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hfSXRlbVZhclN0b3JlICBpdGVtU3RvcmUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotICAgIEZUX1VJbnQgICAgaTsKLQotCi0gICAgaWYgKCBpdGVtU3RvcmUtPnZhckRhdGEgKQotICAgIHsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgaXRlbVN0b3JlLT5kYXRhQ291bnQ7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZSRUUoIGl0ZW1TdG9yZS0+dmFyRGF0YVtpXS5yZWdpb25JbmRpY2VzICk7Ci0gICAgICAgIEZUX0ZSRUUoIGl0ZW1TdG9yZS0+dmFyRGF0YVtpXS5kZWx0YVNldCApOwotICAgICAgfQotCi0gICAgICBGVF9GUkVFKCBpdGVtU3RvcmUtPnZhckRhdGEgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGl0ZW1TdG9yZS0+dmFyUmVnaW9uTGlzdCApCi0gICAgewotICAgICAgZm9yICggaSA9IDA7IGkgPCBpdGVtU3RvcmUtPnJlZ2lvbkNvdW50OyBpKysgKQotICAgICAgICBGVF9GUkVFKCBpdGVtU3RvcmUtPnZhclJlZ2lvbkxpc3RbaV0uYXhpc0xpc3QgKTsKLQotICAgICAgRlRfRlJFRSggaXRlbVN0b3JlLT52YXJSZWdpb25MaXN0ICk7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kb25lX2JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlIHRoZSBibGVuZCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2RvbmVfYmxlbmQoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotICAgIEdYX0JsZW5kICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0KLQotICAgIGlmICggYmxlbmQgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGksIG51bV9heGVzOwotCi0KLSAgICAgIC8qIGJsZW5kLT5udW1fYXhpcyBtaWdodCBub3QgYmUgc2V0IHVwIHlldCAqLwotICAgICAgbnVtX2F4ZXMgPSBibGVuZC0+bW12YXItPm51bV9heGlzOwotCi0gICAgICBGVF9GUkVFKCBibGVuZC0+Y29vcmRzICk7Ci0gICAgICBGVF9GUkVFKCBibGVuZC0+bm9ybWFsaXplZGNvb3JkcyApOwotICAgICAgRlRfRlJFRSggYmxlbmQtPm5vcm1hbGl6ZWRfc3R5bGVjb29yZHMgKTsKLSAgICAgIEZUX0ZSRUUoIGJsZW5kLT5tbXZhciApOwotCi0gICAgICBpZiAoIGJsZW5kLT5hdmFyX3NlZ21lbnQgKQotICAgICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9heGVzOyBpKysgKQotICAgICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5hdmFyX3NlZ21lbnRbaV0uY29ycmVzcG9uZGVuY2UgKTsKLSAgICAgICAgRlRfRlJFRSggYmxlbmQtPmF2YXJfc2VnbWVudCApOwotICAgICAgfQotCi0gICAgICBpZiAoIGJsZW5kLT5odmFyX3RhYmxlICkKLSAgICAgIHsKLSAgICAgICAgZnRfdmFyX2RvbmVfaXRlbV92YXJpYXRpb25fc3RvcmUoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxlbmQtPmh2YXJfdGFibGUtPml0ZW1TdG9yZSApOwotCi0gICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5odmFyX3RhYmxlLT53aWR0aE1hcC5pbm5lckluZGV4ICk7Ci0gICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5odmFyX3RhYmxlLT53aWR0aE1hcC5vdXRlckluZGV4ICk7Ci0gICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5odmFyX3RhYmxlICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmxlbmQtPnZ2YXJfdGFibGUgKQotICAgICAgewotICAgICAgICBmdF92YXJfZG9uZV9pdGVtX3ZhcmlhdGlvbl9zdG9yZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGVuZC0+dnZhcl90YWJsZS0+aXRlbVN0b3JlICk7Ci0KLSAgICAgICAgRlRfRlJFRSggYmxlbmQtPnZ2YXJfdGFibGUtPndpZHRoTWFwLmlubmVySW5kZXggKTsKLSAgICAgICAgRlRfRlJFRSggYmxlbmQtPnZ2YXJfdGFibGUtPndpZHRoTWFwLm91dGVySW5kZXggKTsKLSAgICAgICAgRlRfRlJFRSggYmxlbmQtPnZ2YXJfdGFibGUgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBibGVuZC0+bXZhcl90YWJsZSApCi0gICAgICB7Ci0gICAgICAgIGZ0X3Zhcl9kb25lX2l0ZW1fdmFyaWF0aW9uX3N0b3JlKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsZW5kLT5tdmFyX3RhYmxlLT5pdGVtU3RvcmUgKTsKLQotICAgICAgICBGVF9GUkVFKCBibGVuZC0+bXZhcl90YWJsZS0+dmFsdWVzICk7Ci0gICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5tdmFyX3RhYmxlICk7Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSRUUoIGJsZW5kLT50dXBsZWNvb3JkcyApOwotICAgICAgRlRfRlJFRSggYmxlbmQtPmdseXBob2Zmc2V0cyApOwotICAgICAgRlRfRlJFRSggYmxlbmQgKTsKLSAgICB9Ci0gIH0KLQotI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotICAvKiBBTlNJIEMgZG9lc24ndCBsaWtlIGVtcHR5IHNvdXJjZSBmaWxlcyAqLwotICB0eXBlZGVmIGludCAgX3R0X2d4dmFyX2R1bW15OwotCi0jZW5kaWYgLyogIVRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGd4dmFyLmggYi9zcmMvdHJ1ZXR5cGUvdHRneHZhci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTgxNzE5Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dGd4dmFyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRneHZhci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIEdYIEZvbnQgVmFyaWF0aW9uIGxvYWRlciAoc3BlY2lmaWNhdGlvbikgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZyBhbmQgR2VvcmdlIFdpbGxpYW1zLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFRUR1hWQVJfSF8KLSNkZWZpbmUgVFRHWFZBUl9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0b2Jqcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1hfQVZhckNvcnJlc3BvbmRlbmNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYHNob3J0RnJhY0NvcnJlc3BvbmRlbmNlJyBpbiBgYXZhcicgICovCi0gIC8qICAgIHRhYmxlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbnMgZnJvbSBBcHBsZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0FWYXJDb3JyZXNwb25kZW5jZVJlY18KLSAgewotICAgIEZUX0ZpeGVkICBmcm9tQ29vcmQ7Ci0gICAgRlRfRml4ZWQgIHRvQ29vcmQ7Ci0KLSAgfSBHWF9BVmFyQ29ycmVzcG9uZGVuY2VSZWNfLCAqR1hfQVZhckNvcnJlc3BvbmRlbmNlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1hfQVZhclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGF0YSBmcm9tIHRoZSBzZWdtZW50IGZpZWxkIG9mIGBhdmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBheGlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0FWYXJTZWdtZW50UmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICBwYWlyQ291bnQ7Ci0gICAgR1hfQVZhckNvcnJlc3BvbmRlbmNlICBjb3JyZXNwb25kZW5jZTsgLyogYXJyYXkgd2l0aCBwYWlyQ291bnQgZW50cmllcyAqLwotCi0gIH0gR1hfQVZhclNlZ21lbnRSZWMsICpHWF9BVmFyU2VnbWVudDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBHWF9JdGVtVmFyRGF0YVJlY18KLSAgewotICAgIEZUX1VJbnQgICAgaXRlbUNvdW50OyAgICAgIC8qIG51bWJlciBvZiBkZWx0YSBzZXRzIHBlciBpdGVtICAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgIHJlZ2lvbklkeENvdW50OyAvKiBudW1iZXIgb2YgcmVnaW9uIGluZGljZXMgaW4gdGhpcyBkYXRhICovCi0gICAgRlRfVUludCogICByZWdpb25JbmRpY2VzOyAgLyogYXJyYXkgb2YgYHJlZ2lvbkNvdW50JyBpbmRpY2VzOyAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZXNlIGluZGV4IGB2YXJSZWdpb25MaXN0JyAgICAgICAgICAgKi8KLSAgICBGVF9TaG9ydCogIGRlbHRhU2V0OyAgICAgICAvKiBhcnJheSBvZiBgaXRlbUNvdW50JyBkZWx0YXMgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIGBpbm5lckluZGV4JyBmb3IgdGhpcyBhcnJheSAgICAgICAqLwotCi0gIH0gR1hfSXRlbVZhckRhdGFSZWMsICpHWF9JdGVtVmFyRGF0YTsKLQotCi0gIC8qIGNvbnRyaWJ1dGlvbiBvZiBvbmUgYXhpcyB0byBhIHJlZ2lvbiAqLwotICB0eXBlZGVmIHN0cnVjdCAgR1hfQXhpc0Nvb3Jkc1JlY18KLSAgewotICAgIEZUX0ZpeGVkICBzdGFydENvb3JkOwotICAgIEZUX0ZpeGVkICBwZWFrQ29vcmQ7ICAgICAgLyogemVybyBtZWFucyBubyBlZmZlY3QgKGZhY3RvciA9IDEpICovCi0gICAgRlRfRml4ZWQgIGVuZENvb3JkOwotCi0gIH0gR1hfQXhpc0Nvb3Jkc1JlYywgKkdYX0F4aXNDb29yZHM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hfVmFyUmVnaW9uUmVjXwotICB7Ci0gICAgR1hfQXhpc0Nvb3JkcyAgYXhpc0xpc3Q7ICAgICAgICAgICAgICAgLyogYXJyYXkgb2YgYXhpc0NvdW50IHJlY29yZHMgKi8KLQotICB9IEdYX1ZhclJlZ2lvblJlYywgKkdYX1ZhclJlZ2lvbjsKLQotCi0gIC8qIGl0ZW0gdmFyaWF0aW9uIHN0b3JlICovCi0gIHR5cGVkZWYgc3RydWN0ICBHWF9JdGVtVmFyU3RvcmVSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgZGF0YUNvdW50OwotICAgIEdYX0l0ZW1WYXJEYXRhICB2YXJEYXRhOyAgICAgICAgICAgIC8qIGFycmF5IG9mIGRhdGFDb3VudCByZWNvcmRzOyAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYG91dGVySW5kZXgnIGZvciB0aGlzIGFycmF5ICovCi0gICAgRlRfVVNob3J0ICAgICBheGlzQ291bnQ7Ci0gICAgRlRfVUludCAgICAgICByZWdpb25Db3VudDsgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIHJlZ2lvbnMgZGVmaW5lZCAqLwotICAgIEdYX1ZhclJlZ2lvbiAgdmFyUmVnaW9uTGlzdDsKLQotICB9IEdYX0l0ZW1WYXJTdG9yZVJlYywgKkdYX0l0ZW1WYXJTdG9yZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBHWF9EZWx0YVNldElkeE1hcFJlY18KLSAgewotICAgIEZUX1VJbnQgICBtYXBDb3VudDsKLSAgICBGVF9VSW50KiAgb3V0ZXJJbmRleDsgICAgICAgICAgICAgLyogaW5kaWNlcyB0byBpdGVtIHZhciBkYXRhICovCi0gICAgRlRfVUludCogIGlubmVySW5kZXg7ICAgICAgICAgICAgIC8qIGluZGljZXMgdG8gZGVsdGEgc2V0ICAgICAqLwotCi0gIH0gR1hfRGVsdGFTZXRJZHhNYXBSZWMsICpHWF9EZWx0YVNldElkeE1hcDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX0hWVmFyVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERhdGEgZnJvbSBlaXRoZXIgdGhlIGBIVkFSJyBvciBgVlZBUicgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0hWVmFyVGFibGVSZWNfCi0gIHsKLSAgICBHWF9JdGVtVmFyU3RvcmVSZWMgICAgaXRlbVN0b3JlOyAgICAgICAgLyogSXRlbSBWYXJpYXRpb24gU3RvcmUgICovCi0gICAgR1hfRGVsdGFTZXRJZHhNYXBSZWMgIHdpZHRoTWFwOyAgICAgICAgIC8qIEFkdmFuY2UgV2lkdGggTWFwcGluZyAqLwotCi0jaWYgMAotICAgIEdYX0RlbHRhU2V0SWR4TWFwUmVjICBsc2JNYXA7ICAgICAgICAgICAvKiBub3QgaW1wbGVtZW50ZWQgKi8KLSAgICBHWF9EZWx0YVNldElkeE1hcFJlYyAgcnNiTWFwOyAgICAgICAgICAgLyogbm90IGltcGxlbWVudGVkICovCi0KLSAgICBHWF9EZWx0YVNldElkeE1hcFJlYyAgdHNiTWFwOyAgICAgICAgICAgLyogbm90IGltcGxlbWVudGVkICovCi0gICAgR1hfRGVsdGFTZXRJZHhNYXBSZWMgIGJzYk1hcDsgICAgICAgICAgIC8qIG5vdCBpbXBsZW1lbnRlZCAqLwotICAgIEdYX0RlbHRhU2V0SWR4TWFwUmVjICB2b3JnTWFwOyAgICAgICAgICAvKiBub3QgaW1wbGVtZW50ZWQgKi8KLSNlbmRpZgotCi0gIH0gR1hfSFZWYXJUYWJsZVJlYywgKkdYX0hWVmFyVGFibGU7Ci0KLQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzAgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnMCcgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzEgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnMScgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzIgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnMicgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzMgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnMycgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzQgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnNCcgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzUgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnNScgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzYgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnNicgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzcgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnNycgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzggIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnOCcgKQotI2RlZmluZSBNVkFSX1RBR19HQVNQXzkgIEZUX01BS0VfVEFHKCAnZycsICdzJywgJ3AnLCAnOScgKQotCi0jZGVmaW5lIE1WQVJfVEFHX0NQSFQgIEZUX01BS0VfVEFHKCAnYycsICdwJywgJ2gnLCAndCcgKQotI2RlZmluZSBNVkFSX1RBR19IQVNDICBGVF9NQUtFX1RBRyggJ2gnLCAnYScsICdzJywgJ2MnICkKLSNkZWZpbmUgTVZBUl9UQUdfSENMQSAgRlRfTUFLRV9UQUcoICdoJywgJ2MnLCAnbCcsICdhJyApCi0jZGVmaW5lIE1WQVJfVEFHX0hDTEQgIEZUX01BS0VfVEFHKCAnaCcsICdjJywgJ2wnLCAnZCcgKQotI2RlZmluZSBNVkFSX1RBR19IQ09GICBGVF9NQUtFX1RBRyggJ2gnLCAnYycsICdvJywgJ2YnICkKLSNkZWZpbmUgTVZBUl9UQUdfSENSTiAgRlRfTUFLRV9UQUcoICdoJywgJ2MnLCAncicsICduJyApCi0jZGVmaW5lIE1WQVJfVEFHX0hDUlMgIEZUX01BS0VfVEFHKCAnaCcsICdjJywgJ3InLCAncycgKQotI2RlZmluZSBNVkFSX1RBR19IRFNDICBGVF9NQUtFX1RBRyggJ2gnLCAnZCcsICdzJywgJ2MnICkKLSNkZWZpbmUgTVZBUl9UQUdfSExHUCAgRlRfTUFLRV9UQUcoICdoJywgJ2wnLCAnZycsICdwJyApCi0jZGVmaW5lIE1WQVJfVEFHX1NCWE8gIEZUX01BS0VfVEFHKCAncycsICdiJywgJ3gnLCAnbycgKQotI2RlZmluZSBNVkFSX1RBR19TQlhTICBGVF9NQUtFX1RBRyggJ3MnLCAnYicsICd4JywgJ3MnICkKLSNkZWZpbmUgTVZBUl9UQUdfU0JZTyAgRlRfTUFLRV9UQUcoICdzJywgJ2InLCAneScsICdvJyApCi0jZGVmaW5lIE1WQVJfVEFHX1NCWVMgIEZUX01BS0VfVEFHKCAncycsICdiJywgJ3knLCAncycgKQotI2RlZmluZSBNVkFSX1RBR19TUFhPICBGVF9NQUtFX1RBRyggJ3MnLCAncCcsICd4JywgJ28nICkKLSNkZWZpbmUgTVZBUl9UQUdfU1BYUyAgRlRfTUFLRV9UQUcoICdzJywgJ3AnLCAneCcsICdzJyApCi0jZGVmaW5lIE1WQVJfVEFHX1NQWU8gIEZUX01BS0VfVEFHKCAncycsICdwJywgJ3knLCAnbycgKQotI2RlZmluZSBNVkFSX1RBR19TUFlTICBGVF9NQUtFX1RBRyggJ3MnLCAncCcsICd5JywgJ3MnICkKLSNkZWZpbmUgTVZBUl9UQUdfU1RSTyAgRlRfTUFLRV9UQUcoICdzJywgJ3QnLCAncicsICdvJyApCi0jZGVmaW5lIE1WQVJfVEFHX1NUUlMgIEZUX01BS0VfVEFHKCAncycsICd0JywgJ3InLCAncycgKQotI2RlZmluZSBNVkFSX1RBR19VTkRPICBGVF9NQUtFX1RBRyggJ3UnLCAnbicsICdkJywgJ28nICkKLSNkZWZpbmUgTVZBUl9UQUdfVU5EUyAgRlRfTUFLRV9UQUcoICd1JywgJ24nLCAnZCcsICdzJyApCi0jZGVmaW5lIE1WQVJfVEFHX1ZBU0MgIEZUX01BS0VfVEFHKCAndicsICdhJywgJ3MnLCAnYycgKQotI2RlZmluZSBNVkFSX1RBR19WQ09GICBGVF9NQUtFX1RBRyggJ3YnLCAnYycsICdvJywgJ2YnICkKLSNkZWZpbmUgTVZBUl9UQUdfVkNSTiAgRlRfTUFLRV9UQUcoICd2JywgJ2MnLCAncicsICduJyApCi0jZGVmaW5lIE1WQVJfVEFHX1ZDUlMgIEZUX01BS0VfVEFHKCAndicsICdjJywgJ3InLCAncycgKQotI2RlZmluZSBNVkFSX1RBR19WRFNDICBGVF9NQUtFX1RBRyggJ3YnLCAnZCcsICdzJywgJ2MnICkKLSNkZWZpbmUgTVZBUl9UQUdfVkxHUCAgRlRfTUFLRV9UQUcoICd2JywgJ2wnLCAnZycsICdwJyApCi0jZGVmaW5lIE1WQVJfVEFHX1hIR1QgIEZUX01BS0VfVEFHKCAneCcsICdoJywgJ2cnLCAndCcgKQotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX1ZhbHVlUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICB0YWc7Ci0gICAgRlRfVVNob3J0ICBvdXRlckluZGV4OwotICAgIEZUX1VTaG9ydCAgaW5uZXJJbmRleDsKLQotICAgIEZUX1Nob3J0ICB1bm1vZGlmaWVkOyAgLyogdmFsdWVzIGFyZSBlaXRoZXIgRlRfU2hvcnQgb3IgRlRfVVNob3J0ICovCi0KLSAgfSBHWF9WYWx1ZVJlYywgKkdYX1ZhbHVlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1hfTVZhclRhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGF0YSBmcm9tIHRoZSBgTVZBUicgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgR1hfTVZhclRhYmxlUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICB2YWx1ZUNvdW50OwotCi0gICAgR1hfSXRlbVZhclN0b3JlUmVjICBpdGVtU3RvcmU7ICAgICAgICAvKiBJdGVtIFZhcmlhdGlvbiBTdG9yZSAgKi8KLSAgICBHWF9WYWx1ZSAgICAgICAgICAgIHZhbHVlczsgICAgICAgICAgIC8qIFZhbHVlIFJlY29yZHMgICAgICAgICAqLwotCi0gIH0gR1hfTVZhclRhYmxlUmVjLCAqR1hfTVZhclRhYmxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1hfQmxlbmRSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGF0YSBmb3IgaW50ZXJwb2xhdGluZyBhIGZvbnQgZnJvbSBhIGRpc3RvcnRhYmxlIGZvbnQgc3BlY2lmaWVkICAgICovCi0gIC8qICAgIGJ5IHRoZSBHWCAqdmFyIHRhYmxlcyAoW2ZnY2Fodm1ddmFyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9heGlzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBudW1iZXIgb2YgYXhlcyBhbG9uZyB3aGljaCBpbnRlcnBvbGF0aW9uIG1heSBoYXBwZW4uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIGFycmF5IG9mIGRlc2lnbiBjb29yZGluYXRlcyAoaW4gdXNlciBzcGFjZSkgaW5kaWNhdGluZyB0aGUgICAgKi8KLSAgLyogICAgICBjb250cmlidXRpb24gYWxvbmcgZWFjaCBheGlzIHRvIHRoZSBmaW5hbCBpbnRlcnBvbGF0ZWQgZm9udC4gICAgICovCi0gIC8qICAgICAgYG5vcm1hbGl6ZWRjb29yZHMnIGhvbGRzIHRoZSBzYW1lIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9ybWFsaXplZGNvb3JkcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gYXJyYXkgb2Ygbm9ybWFsaXplZCB2YWx1ZXMgKGJldHdlZW4gWy0xLDFdKSBpbmRpY2F0aW5nIHRoZSAgICAqLwotICAvKiAgICAgIGNvbnRyaWJ1dGlvbiBhbG9uZyBlYWNoIGF4aXMgdG8gdGhlIGZpbmFsIGludGVycG9sYXRlZCBmb250LiAgICAgKi8KLSAgLyogICAgICBgY29vcmRzJyBob2xkcyB0aGUgc2FtZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtbXZhciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBEYXRhIGZyb20gdGhlIGBmdmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtbXZhcl9sZW4gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBgbW12YXInIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub3JtYWxpemVkX3N0eWxlY29vcmRzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIHR3by1kaW1lbnNpb25hbCBhcnJheSB0aGF0IGhvbGRzIHRoZSBuYW1lZCBpbnN0YW5jZSBkYXRhIGZyb20gICovCi0gIC8qICAgICAgYG1tdmFyJyBhcyBub3JtYWxpemVkIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXZhcl9sb2FkZWQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBCb29sZWFuOyBpZiBzZXQsIEZyZWVUeXBlIHRyaWVkIHRvIGxvYWQgKGFuZCBwYXJzZSkgdGhlIGBhdmFyJyAqLwotICAvKiAgICAgIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF2YXJfc2VnbWVudCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIERhdGEgZnJvbSB0aGUgYGF2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGh2YXJfbG9hZGVkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgQm9vbGVhbjsgaWYgc2V0LCBGcmVlVHlwZSB0cmllZCB0byBsb2FkIChhbmQgcGFyc2UpIHRoZSBgaHZhcicgKi8KLSAgLyogICAgICB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBodmFyX2NoZWNrZWQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEJvb2xlYW47IGlmIHNldCwgRnJlZVR5cGUgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhbmQgcGFyc2VkIHRoZSAgICovCi0gIC8qICAgICAgYGh2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaHZhcl9lcnJvciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgbG9hZGluZyBhbmQgcGFyc2luZyBvZiB0aGUgYGh2YXInIHRhYmxlIGZhaWxlZCwgdGhpcyBmaWVsZCAgICAqLwotICAvKiAgICAgIGhvbGRzIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGh2YXJfdGFibGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIERhdGEgZnJvbSB0aGUgYGh2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZ2YXJfbG9hZGVkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgQm9vbGVhbjsgaWYgc2V0LCBGcmVlVHlwZSB0cmllZCB0byBsb2FkIChhbmQgcGFyc2UpIHRoZSBgdnZhcicgKi8KLSAgLyogICAgICB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2dmFyX2NoZWNrZWQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEJvb2xlYW47IGlmIHNldCwgRnJlZVR5cGUgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhbmQgcGFyc2VkIHRoZSAgICovCi0gIC8qICAgICAgYHZ2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdnZhcl9lcnJvciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgbG9hZGluZyBhbmQgcGFyc2luZyBvZiB0aGUgYHZ2YXInIHRhYmxlIGZhaWxlZCwgdGhpcyBmaWVsZCAgICAqLwotICAvKiAgICAgIGhvbGRzIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZ2YXJfdGFibGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIERhdGEgZnJvbSB0aGUgYHZ2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG12YXJfdGFibGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIERhdGEgZnJvbSB0aGUgYG12YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR1cGxlY291bnQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBudW1iZXIgb2Ygc2hhcmVkIHR1cGxlcyBpbiB0aGUgYGd2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR1cGxlY29vcmRzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRoYXQgaG9sZHMgdGhlIHNoYXJlZCB0dXBsZSBjb29yZGluYXRlcyAgKi8KLSAgLyogICAgICBpbiB0aGUgYGd2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBndl9nbHlwaGNudCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbnVtYmVyIG9mIGdseXBocyBoYW5kbGVkIGluIHRoZSBgZ3ZhcicgdGFibGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaG9mZnNldHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBPZmZzZXRzIGludG8gdGhlIGdseXBoIHZhcmlhdGlvbiBkYXRhIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBndmFyX3NpemUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgc2l6ZSBvZiB0aGUgYGd2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgR1hfQmxlbmRSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgbnVtX2F4aXM7Ci0gICAgRlRfRml4ZWQqICAgICAgIGNvb3JkczsKLSAgICBGVF9GaXhlZCogICAgICAgbm9ybWFsaXplZGNvb3JkczsKLQotICAgIEZUX01NX1ZhciogICAgICBtbXZhcjsKLSAgICBGVF9PZmZzZXQgICAgICAgbW12YXJfbGVuOwotCi0gICAgRlRfRml4ZWQqICAgICAgIG5vcm1hbGl6ZWRfc3R5bGVjb29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgLyogbm9ybWFsaXplZF9zdHlsZWNvb3Jkc1tudW1fbmFtZWRzdHlsZXNdW251bV9heGlzXSAqLwotCi0gICAgRlRfQm9vbCAgICAgICAgIGF2YXJfbG9hZGVkOwotICAgIEdYX0FWYXJTZWdtZW50ICBhdmFyX3NlZ21lbnQ7ICAgICAgICAgICAgICAgIC8qIGF2YXJfc2VnbWVudFtudW1fYXhpc10gKi8KLQotICAgIEZUX0Jvb2wgICAgICAgICBodmFyX2xvYWRlZDsKLSAgICBGVF9Cb29sICAgICAgICAgaHZhcl9jaGVja2VkOwotICAgIEZUX0Vycm9yICAgICAgICBodmFyX2Vycm9yOwotICAgIEdYX0hWVmFyVGFibGUgICBodmFyX3RhYmxlOwotCi0gICAgRlRfQm9vbCAgICAgICAgIHZ2YXJfbG9hZGVkOwotICAgIEZUX0Jvb2wgICAgICAgICB2dmFyX2NoZWNrZWQ7Ci0gICAgRlRfRXJyb3IgICAgICAgIHZ2YXJfZXJyb3I7Ci0gICAgR1hfSFZWYXJUYWJsZSAgIHZ2YXJfdGFibGU7Ci0KLSAgICBHWF9NVmFyVGFibGUgICAgbXZhcl90YWJsZTsKLQotICAgIEZUX1VJbnQgICAgICAgICB0dXBsZWNvdW50OwotICAgIEZUX0ZpeGVkKiAgICAgICB0dXBsZWNvb3JkczsgICAgICAvKiB0dXBsZWNvb3Jkc1t0dXBsZWNvdW50XVtudW1fYXhpc10gKi8KLQotICAgIEZUX1VJbnQgICAgICAgICBndl9nbHlwaGNudDsKLSAgICBGVF9VTG9uZyogICAgICAgZ2x5cGhvZmZzZXRzOyAgICAgICAgIC8qIGdseXBob2Zmc2V0c1tndl9nbHlwaGNudCArIDFdICovCi0KLSAgICBGVF9VTG9uZyAgICAgICAgZ3Zhcl9zaXplOwotCi0gIH0gR1hfQmxlbmRSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxlbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWF9UdXBsZUNvdW50RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGbGFncyB1c2VkIHdpdGhpbiB0aGUgYFR1cGxlQ291bnQnIGZpZWxkIG9mIHRoZSBgZ3ZhcicgdGFibGUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgR1hfVHVwbGVDb3VudEZsYWdzXwotICB7Ci0gICAgR1hfVENfVFVQTEVTX1NIQVJFX1BPSU5UX05VTUJFUlMgPSAweDgwMDAsCi0gICAgR1hfVENfUkVTRVJWRURfVFVQTEVfRkxBR1MgICAgICAgPSAweDcwMDAsCi0gICAgR1hfVENfVFVQTEVfQ09VTlRfTUFTSyAgICAgICAgICAgPSAweDBGRkYKLQotICB9IEdYX1R1cGxlQ291bnRGbGFnczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPGVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX1R1cGxlSW5kZXhGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZsYWdzIHVzZWQgd2l0aGluIHRoZSBgVHVwbGVJbmRleCcgZmllbGQgb2YgdGhlIGBndmFyJyBhbmQgYGN2YXInICAqLwotICAvKiAgICB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgR1hfVHVwbGVJbmRleEZsYWdzXwotICB7Ci0gICAgR1hfVElfRU1CRURERURfVFVQTEVfQ09PUkQgID0gMHg4MDAwLAotICAgIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSAgICA9IDB4NDAwMCwKLSAgICBHWF9USV9QUklWQVRFX1BPSU5UX05VTUJFUlMgPSAweDIwMDAsCi0gICAgR1hfVElfUkVTRVJWRURfVFVQTEVfRkxBRyAgID0gMHgxMDAwLAotICAgIEdYX1RJX1RVUExFX0lOREVYX01BU0sgICAgICA9IDB4MEZGRgotCi0gIH0gR1hfVHVwbGVJbmRleEZsYWdzOwotCi0KLSNkZWZpbmUgVFRBR193Z2h0ICBGVF9NQUtFX1RBRyggJ3cnLCAnZycsICdoJywgJ3QnICkKLSNkZWZpbmUgVFRBR193ZHRoICBGVF9NQUtFX1RBRyggJ3cnLCAnZCcsICd0JywgJ2gnICkKLSNkZWZpbmUgVFRBR19vcHN6ICBGVF9NQUtFX1RBRyggJ28nLCAncCcsICdzJywgJ3onICkKLSNkZWZpbmUgVFRBR19zbG50ICBGVF9NQUtFX1RBRyggJ3MnLCAnbCcsICduJywgJ3QnICkKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1NldF9NTV9CbGVuZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX0dldF9NTV9CbGVuZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1NldF9WYXJfRGVzaWduKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX0dldF9NTV9WYXIoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVFRfR2V0X1Zhcl9EZXNpZ24oIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV92YXJ5X2N2dCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbl9wb2ludHMgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9oYWR2YW5jZV9hZGp1c3QoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgKmFkZWx0YSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X3ZhZHZhbmNlX2FkanVzdCggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAqYWRlbHRhICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9hcHBseV9tdmFyKCBUVF9GYWNlICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZ2V0X3Zhcl9ibGVuZCggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICpudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogICAqY29vcmRzLAotICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogICAqbm9ybWFsaXplZGNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgRlRfTU1fVmFyKiAgKm1tX3ZhciApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZG9uZV9ibGVuZCggVFRfRmFjZSAgZmFjZSApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogVFRHWFZBUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgYi9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2MDViYi4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYworKysgL2Rldi9udWxsCkBAIC0xLDg0OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRpbnRlcnAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBHcmVnIEhpdGNoY29jayBmcm9tIE1pY3Jvc29mdCBoYXMgaGVscGVkIGEgbG90IGluIHJlc29sdmluZyB1bmNsZWFyICovCi0vKiBpc3N1ZXM7IG1hbnkgdGhhbmtzISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICi0jaW5jbHVkZSBGVF9TWVNURU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfRFJJVkVSX0gKLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAotCi0jaW5jbHVkZSAidHRpbnRlcnAuaCIKLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotI2luY2x1ZGUgInR0c3VicGl4LmgiCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgInR0Z3h2YXIuaCIKLSNlbmRpZgotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0aW50ZXJwCi0KLQotI2RlZmluZSBOT19TVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoKFRUX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZXhjLT5mYWNlICkpLT5pbnRlcnByZXRlcl92ZXJzaW9uID09IFwKLSAgICAgICAgICAgIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzUgKQotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSNkZWZpbmUgU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGV4Yy0+ZmFjZSApKS0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBcCi0gICAgICAgICAgICBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICkKLSNlbmRpZgotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSNkZWZpbmUgU1VCUElYRUxfSElOVElOR19NSU5JTUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGV4Yy0+ZmFjZSApKS0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBcCi0gICAgICAgICAgICBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzQwICkKLSNlbmRpZgotCi0jZGVmaW5lIFBST0pFQ1QoIHYxLCB2MiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZXhjLT5mdW5jX3Byb2plY3QoIGV4YywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQl9MT05HKCAodjEpLT54LCAodjIpLT54ICksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQl9MT05HKCAodjEpLT55LCAodjIpLT55ICkgKQotCi0jZGVmaW5lIERVQUxQUk9KKCB2MSwgdjIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGV4Yy0+ZnVuY19kdWFscHJvaiggZXhjLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQl9MT05HKCAodjEpLT54LCAodjIpLT54ICksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJfTE9ORyggKHYxKS0+eSwgKHYyKS0+eSApICkKLQotI2RlZmluZSBGQVNUX1BST0pFQ1QoIHYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGV4Yy0+ZnVuY19wcm9qZWN0KCBleGMsICh2KS0+eCwgKHYpLT55ICkKLQotI2RlZmluZSBGQVNUX0RVQUxQUk9KKCB2ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBleGMtPmZ1bmNfZHVhbHByb2ooIGV4YywgKHYpLT54LCAodiktPnkgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUd28gc2ltcGxlIGJvdW5kcy1jaGVja2luZyBtYWNyb3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJPVU5EUyggeCwgbiApICAgKCAoRlRfVUludCkoeCkgID49IChGVF9VSW50KShuKSAgKQotI2RlZmluZSBCT1VORFNMKCB4LCBuICkgICggKEZUX1VMb25nKSh4KSA+PSAoRlRfVUxvbmcpKG4pICkKLQotCi0jdW5kZWYgIFNVQ0NFU1MKLSNkZWZpbmUgU1VDQ0VTUyAgMAotCi0jdW5kZWYgIEZBSUxVUkUKLSNkZWZpbmUgRkFJTFVSRSAgMQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIENPREVSQU5HRSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR290b19Db2RlUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3dpdGNoZXMgdG8gYSBuZXcgY29kZSByYW5nZSAodXBkYXRlcyB0aGUgY29kZSByZWxhdGVkIGVsZW1lbnRzIGluICovCi0gIC8qICAgIGBleGVjJywgYW5kIGBJUCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlIDo6IFRoZSBuZXcgZXhlY3V0aW9uIGNvZGUgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSVAgICAgOjogVGhlIG5ldyBJUCBpbiB0aGUgbmV3IGNvZGUgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhlYyAgOjogVGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUVF9Hb3RvX0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgSVAgKQotICB7Ci0gICAgVFRfQ29kZVJhbmdlKiAgY29kZXJhbmdlOwotCi0KLSAgICBGVF9BU1NFUlQoIHJhbmdlID49IDEgJiYgcmFuZ2UgPD0gMyApOwotCi0gICAgY29kZXJhbmdlID0gJmV4ZWMtPmNvZGVSYW5nZVRhYmxlW3JhbmdlIC0gMV07Ci0KLSAgICBGVF9BU1NFUlQoIGNvZGVyYW5nZS0+YmFzZSApOwotCi0gICAgLyogTk9URTogQmVjYXVzZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiBhIHByb2dyYW0gbWF5IGJlIGEgQ0FMTCAqLwotICAgIC8qICAgICAgIHdoaWNoIHdpbGwgcmV0dXJuIHRvIHRoZSBmaXJzdCBieXRlICphZnRlciogdGhlIGNvZGUgICAgKi8KLSAgICAvKiAgICAgICByYW5nZSwgd2UgdGVzdCBmb3IgSVAgPD0gU2l6ZSBpbnN0ZWFkIG9mIElQIDwgU2l6ZS4gICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0FTU0VSVCggSVAgPD0gY29kZXJhbmdlLT5zaXplICk7Ci0KLSAgICBleGVjLT5jb2RlICAgICA9IGNvZGVyYW5nZS0+YmFzZTsKLSAgICBleGVjLT5jb2RlU2l6ZSA9IGNvZGVyYW5nZS0+c2l6ZTsKLSAgICBleGVjLT5JUCAgICAgICA9IElQOwotICAgIGV4ZWMtPmN1clJhbmdlID0gcmFuZ2U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NldF9Db2RlUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldHMgYSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlICA6OiBUaGUgY29kZSByYW5nZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZSAgIDo6IFRoZSBuZXcgY29kZSBiYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIHJhbmdlIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBleGVjICAgOjogVGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFRUX1NldF9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgbGVuZ3RoICkKLSAgewotICAgIEZUX0FTU0VSVCggcmFuZ2UgPj0gMSAmJiByYW5nZSA8PSAzICk7Ci0KLSAgICBleGVjLT5jb2RlUmFuZ2VUYWJsZVtyYW5nZSAtIDFdLmJhc2UgPSAoRlRfQnl0ZSopYmFzZTsKLSAgICBleGVjLT5jb2RlUmFuZ2VUYWJsZVtyYW5nZSAtIDFdLnNpemUgPSBsZW5ndGg7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0NsZWFyX0NvZGVSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENsZWFycyBhIGNvZGUgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlIDo6IFRoZSBjb2RlIHJhbmdlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgIDo6IFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UgKQotICB7Ci0gICAgRlRfQVNTRVJUKCByYW5nZSA+PSAxICYmIHJhbmdlIDw9IDMgKTsKLQotICAgIGV4ZWMtPmNvZGVSYW5nZVRhYmxlW3JhbmdlIC0gMV0uYmFzZSA9IE5VTEw7Ci0gICAgZXhlYy0+Y29kZVJhbmdlVGFibGVbcmFuZ2UgLSAxXS5zaXplID0gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBFWEVDVVRJT04gQ09OVEVYVCBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRG9uZV9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhlYyAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFRUX0RvbmVfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBleGVjLT5tZW1vcnk7Ci0KLQotICAgIC8qIHBvaW50cyB6b25lICovCi0gICAgZXhlYy0+bWF4UG9pbnRzICAgPSAwOwotICAgIGV4ZWMtPm1heENvbnRvdXJzID0gMDsKLQotICAgIC8qIGZyZWUgc3RhY2sgKi8KLSAgICBGVF9GUkVFKCBleGVjLT5zdGFjayApOwotICAgIGV4ZWMtPnN0YWNrU2l6ZSA9IDA7Ci0KLSAgICAvKiBmcmVlIGNhbGwgc3RhY2sgKi8KLSAgICBGVF9GUkVFKCBleGVjLT5jYWxsU3RhY2sgKTsKLSAgICBleGVjLT5jYWxsU2l6ZSA9IDA7Ci0gICAgZXhlYy0+Y2FsbFRvcCAgPSAwOwotCi0gICAgLyogZnJlZSBnbHlwaCBjb2RlIHJhbmdlICovCi0gICAgRlRfRlJFRSggZXhlYy0+Z2x5cGhJbnMgKTsKLSAgICBleGVjLT5nbHlwaFNpemUgPSAwOwotCi0gICAgZXhlYy0+c2l6ZSA9IE5VTEw7Ci0gICAgZXhlYy0+ZmFjZSA9IE5VTEw7Ci0KLSAgICBGVF9GUkVFKCBleGVjICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgY29udGV4dCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEluaXRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIEZUX1RSQUNFMSgoICJJbml0X0NvbnRleHQ6IG5ldyBvYmplY3QgYXQgMHglMDhwXG4iLCBleGVjICkpOwotCi0gICAgZXhlYy0+bWVtb3J5ICAgPSBtZW1vcnk7Ci0gICAgZXhlYy0+Y2FsbFNpemUgPSAzMjsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBleGVjLT5jYWxsU3RhY2ssIGV4ZWMtPmNhbGxTaXplICkgKQotICAgICAgZ290byBGYWlsX01lbW9yeTsKLQotICAgIC8qIGFsbCB2YWx1ZXMgaW4gdGhlIGNvbnRleHQgYXJlIHNldCB0byAwIGFscmVhZHksIGJ1dCB0aGlzIGlzICovCi0gICAgLyogaGVyZSBhcyBhIHJlbWFpbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBleGVjLT5tYXhQb2ludHMgICA9IDA7Ci0gICAgZXhlYy0+bWF4Q29udG91cnMgPSAwOwotCi0gICAgZXhlYy0+c3RhY2tTaXplID0gMDsKLSAgICBleGVjLT5nbHlwaFNpemUgPSAwOwotCi0gICAgZXhlYy0+c3RhY2sgICAgPSBOVUxMOwotICAgIGV4ZWMtPmdseXBoSW5zID0gTlVMTDsKLQotICAgIGV4ZWMtPmZhY2UgPSBOVUxMOwotICAgIGV4ZWMtPnNpemUgPSBOVUxMOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICBGYWlsX01lbW9yeToKLSAgICBGVF9FUlJPUigoICJJbml0X0NvbnRleHQ6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciAlcFxuIiwgZXhlYyApKTsKLSAgICBUVF9Eb25lX0NvbnRleHQoIGV4ZWMgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVcGRhdGVfTWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVja3MgdGhlIHNpemUgb2YgYSBidWZmZXIgYW5kIHJlYWxsb2NhdGVzIGl0IGlmIG5lY2Vzc2FyeS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG11bHRpcGxpZXIgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBidWZmZXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmV3X21heCAgICA6OiBUaGUgbmV3IGNhcGFjaXR5IChzaXplKSBvZiB0aGUgYnVmZmVyLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgICA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyJ3MgY3VycmVudCBzaXplIGV4cHJlc3NlZCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW4gZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZiAgICAgICA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGJhc2UgcG9pbnRlci4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVXBkYXRlX01heCggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgIEZUX1VMb25nKiAgc2l6ZSwKLSAgICAgICAgICAgICAgRlRfVUxvbmcgICBtdWx0aXBsaWVyLAotICAgICAgICAgICAgICB2b2lkKiAgICAgIF9wYnVmZiwKLSAgICAgICAgICAgICAgRlRfVUxvbmcgICBuZXdfbWF4ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICB2b2lkKiogICAgcGJ1ZmYgPSAodm9pZCoqKV9wYnVmZjsKLQotCi0gICAgaWYgKCAqc2l6ZSA8IG5ld19tYXggKQotICAgIHsKLSAgICAgIGlmICggRlRfUkVBTExPQyggKnBidWZmLCAqc2l6ZSAqIG11bHRpcGxpZXIsIG5ld19tYXggKiBtdWx0aXBsaWVyICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAqc2l6ZSA9IG5ld19tYXg7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJlcGFyZSBhbiBleGVjdXRpb24gY29udGV4dCBmb3IgZ2x5cGggaGludGluZy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBleGVjIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0NvbnRleHQoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIFRUX1NpemUgICAgICAgICBzaXplICkKLSAgewotICAgIEZUX0ludCAgICAgICAgICBpOwotICAgIEZUX1VMb25nICAgICAgICB0bXA7Ci0gICAgVFRfTWF4UHJvZmlsZSogIG1heHA7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotCi0KLSAgICBleGVjLT5mYWNlID0gZmFjZTsKLSAgICBtYXhwICAgICAgID0gJmZhY2UtPm1heF9wcm9maWxlOwotICAgIGV4ZWMtPnNpemUgPSBzaXplOwotCi0gICAgaWYgKCBzaXplICkKLSAgICB7Ci0gICAgICBleGVjLT5udW1GRGVmcyAgID0gc2l6ZS0+bnVtX2Z1bmN0aW9uX2RlZnM7Ci0gICAgICBleGVjLT5tYXhGRGVmcyAgID0gc2l6ZS0+bWF4X2Z1bmN0aW9uX2RlZnM7Ci0gICAgICBleGVjLT5udW1JRGVmcyAgID0gc2l6ZS0+bnVtX2luc3RydWN0aW9uX2RlZnM7Ci0gICAgICBleGVjLT5tYXhJRGVmcyAgID0gc2l6ZS0+bWF4X2luc3RydWN0aW9uX2RlZnM7Ci0gICAgICBleGVjLT5GRGVmcyAgICAgID0gc2l6ZS0+ZnVuY3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPklEZWZzICAgICAgPSBzaXplLT5pbnN0cnVjdGlvbl9kZWZzOwotICAgICAgZXhlYy0+cG9pbnRTaXplICA9IHNpemUtPnBvaW50X3NpemU7Ci0gICAgICBleGVjLT50dF9tZXRyaWNzID0gc2l6ZS0+dHRtZXRyaWNzOwotICAgICAgZXhlYy0+bWV0cmljcyAgICA9ICpzaXplLT5tZXRyaWNzOwotCi0gICAgICBleGVjLT5tYXhGdW5jICAgID0gc2l6ZS0+bWF4X2Z1bmM7Ci0gICAgICBleGVjLT5tYXhJbnMgICAgID0gc2l6ZS0+bWF4X2luczsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBUVF9NQVhfQ09ERV9SQU5HRVM7IGkrKyApCi0gICAgICAgIGV4ZWMtPmNvZGVSYW5nZVRhYmxlW2ldID0gc2l6ZS0+Y29kZVJhbmdlVGFibGVbaV07Ci0KLSAgICAgIC8qIHNldCBncmFwaGljcyBzdGF0ZSAqLwotICAgICAgZXhlYy0+R1MgPSBzaXplLT5HUzsKLQotICAgICAgZXhlYy0+Y3Z0U2l6ZSA9IHNpemUtPmN2dF9zaXplOwotICAgICAgZXhlYy0+Y3Z0ICAgICA9IHNpemUtPmN2dDsKLQotICAgICAgZXhlYy0+c3RvcmVTaXplID0gc2l6ZS0+c3RvcmFnZV9zaXplOwotICAgICAgZXhlYy0+c3RvcmFnZSAgID0gc2l6ZS0+c3RvcmFnZTsKLQotICAgICAgZXhlYy0+dHdpbGlnaHQgID0gc2l6ZS0+dHdpbGlnaHQ7Ci0KLSAgICAgIC8qIEluIGNhc2Ugb2YgbXVsdGktdGhyZWFkaW5nIGl0IGNhbiBoYXBwZW4gdGhhdCB0aGUgb2xkIHNpemUgb2JqZWN0ICovCi0gICAgICAvKiBubyBsb25nZXIgZXhpc3RzLCB0aHVzIHdlIG11c3QgY2xlYXIgYWxsIGdseXBoIHpvbmUgcmVmZXJlbmNlcy4gICAqLwotICAgICAgRlRfWkVSTyggJmV4ZWMtPnpwMCApOwotICAgICAgZXhlYy0+enAxID0gZXhlYy0+enAwOwotICAgICAgZXhlYy0+enAyID0gZXhlYy0+enAwOwotICAgIH0KLQotICAgIC8qIFhYWDogV2UgcmVzZXJ2ZSBhIGxpdHRsZSBtb3JlIGVsZW1lbnRzIG9uIHRoZSBzdGFjayB0byBkZWFsIHNhZmVseSAqLwotICAgIC8qICAgICAgd2l0aCBicm9rZW4gZm9udHMgbGlrZSBhcmlhbGJzLCBjb3VyYnMsIHRpbWVzYnMsIGV0Yy4gICAgICAgICAqLwotICAgIHRtcCA9IChGVF9VTG9uZylleGVjLT5zdGFja1NpemU7Ci0gICAgZXJyb3IgPSBVcGRhdGVfTWF4KCBleGVjLT5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAmdG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRlRfRjI2RG90NiApLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZleGVjLT5zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heHAtPm1heFN0YWNrRWxlbWVudHMgKyAzMiApOwotICAgIGV4ZWMtPnN0YWNrU2l6ZSA9IChGVF9Mb25nKXRtcDsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHRtcCA9IGV4ZWMtPmdseXBoU2l6ZTsKLSAgICBlcnJvciA9IFVwZGF0ZV9NYXgoIGV4ZWMtPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGVF9CeXRlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJmV4ZWMtPmdseXBoSW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgbWF4cC0+bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zICk7Ci0gICAgZXhlYy0+Z2x5cGhTaXplID0gKEZUX1VTaG9ydCl0bXA7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBleGVjLT5wdHMubl9wb2ludHMgICA9IDA7Ci0gICAgZXhlYy0+cHRzLm5fY29udG91cnMgPSAwOwotCi0gICAgZXhlYy0+enAxID0gZXhlYy0+cHRzOwotICAgIGV4ZWMtPnpwMiA9IGV4ZWMtPnB0czsKLSAgICBleGVjLT56cDAgPSBleGVjLT5wdHM7Ci0KLSAgICBleGVjLT5pbnN0cnVjdGlvbl90cmFwID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TYXZlX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTYXZlcyB0aGUgY29kZSByYW5nZXMgaW4gYSBgc2l6ZScgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBleGVjIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFRUX1NhdmVfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIHNpemUgKQotICB7Ci0gICAgRlRfSW50ICBpOwotCi0KLSAgICAvKiBYWFg6IFdpbGwgcHJvYmFibHkgZGlzYXBwZWFyIHNvb24gd2l0aCBhbGwgdGhlIGNvZGUgcmFuZ2UgKi8KLSAgICAvKiAgICAgIG1hbmFnZW1lbnQsIHdoaWNoIGlzIG5vdyByYXRoZXIgb2Jzb2xldGUuICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBzaXplLT5udW1fZnVuY3Rpb25fZGVmcyAgICA9IGV4ZWMtPm51bUZEZWZzOwotICAgIHNpemUtPm51bV9pbnN0cnVjdGlvbl9kZWZzID0gZXhlYy0+bnVtSURlZnM7Ci0KLSAgICBzaXplLT5tYXhfZnVuYyA9IGV4ZWMtPm1heEZ1bmM7Ci0gICAgc2l6ZS0+bWF4X2lucyAgPSBleGVjLT5tYXhJbnM7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IFRUX01BWF9DT0RFX1JBTkdFUzsgaSsrICkKLSAgICAgIHNpemUtPmNvZGVSYW5nZVRhYmxlW2ldID0gZXhlYy0+Y29kZVJhbmdlVGFibGVbaV07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1J1bl9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEV4ZWN1dGVzIG9uZSBvciBtb3JlIGluc3RydWN0aW9ucyBpbiB0aGUgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlYnVnIDo6IEEgQm9vbGVhbiBmbGFnLiAgSWYgc2V0LCB0aGUgZnVuY3Rpb24gc2V0cyBzb21lIGludGVybmFsICAqLwotICAvKiAgICAgICAgICAgICB2YXJpYWJsZXMgYW5kIHJldHVybnMgaW1tZWRpYXRlbHksIG90aGVyd2lzZSBUVF9SdW5JbnMoKSAgKi8KLSAgLyogICAgICAgICAgICAgaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgY3VycmVudGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBleGVjICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9SdW5fQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMgKQotICB7Ci0gICAgVFRfR290b19Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9nbHlwaCwgMCApOwotCi0gICAgZXhlYy0+enAwID0gZXhlYy0+cHRzOwotICAgIGV4ZWMtPnpwMSA9IGV4ZWMtPnB0czsKLSAgICBleGVjLT56cDIgPSBleGVjLT5wdHM7Ci0KLSAgICBleGVjLT5HUy5nZXAwID0gMTsKLSAgICBleGVjLT5HUy5nZXAxID0gMTsKLSAgICBleGVjLT5HUy5nZXAyID0gMTsKLQotICAgIGV4ZWMtPkdTLnByb2pWZWN0b3IueCA9IDB4NDAwMDsKLSAgICBleGVjLT5HUy5wcm9qVmVjdG9yLnkgPSAweDAwMDA7Ci0KLSAgICBleGVjLT5HUy5mcmVlVmVjdG9yID0gZXhlYy0+R1MucHJvalZlY3RvcjsKLSAgICBleGVjLT5HUy5kdWFsVmVjdG9yID0gZXhlYy0+R1MucHJvalZlY3RvcjsKLQotICAgIGV4ZWMtPkdTLnJvdW5kX3N0YXRlID0gMTsKLSAgICBleGVjLT5HUy5sb29wICAgICAgICA9IDE7Ci0KLSAgICAvKiBzb21lIGdseXBocyBsZWF2ZSBzb21ldGhpbmcgb24gdGhlIHN0YWNrLiBzbyB3ZSBjbGVhbiBpdCAqLwotICAgIC8qIGJlZm9yZSBhIG5ldyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZXhlYy0+dG9wICAgICA9IDA7Ci0gICAgZXhlYy0+Y2FsbFRvcCA9IDA7Ci0KLSAgICByZXR1cm4gZXhlYy0+ZmFjZS0+aW50ZXJwcmV0ZXIoIGV4ZWMgKTsKLSAgfQotCi0KLSAgLyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGBzY2FuX2NvbnRyb2wnIGlzIGRvY3VtZW50ZWQgYXMgRkFMU0UgaW4gdGhlICovCi0gIC8qIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICBUaGlzIGlzIGNvbmZ1c2luZyBzaW5jZSBpdCBpbXBsaWVzIGEgICAgICAqLwotICAvKiBCb29sZWFuIHZhbHVlLiAgSG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRodXMgYm90aCB0aGUgICAgICAgKi8KLSAgLyogZGVmYXVsdCB2YWx1ZXMgb2Ygb3VyIGBzY2FuX3R5cGUnIGFuZCBgc2Nhbl9jb250cm9sJyBmaWVsZHMgKHdoaWNoICovCi0gIC8qIHRoZSBkb2N1bWVudGF0aW9uJ3MgYHNjYW5fY29udHJvbCcgdmFyaWFibGUgaXMgc3BsaXQgaW50bykgYXJlICAgICAqLwotICAvKiB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBjb25zdCBUVF9HcmFwaGljc1N0YXRlICB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlID0KLSAgewotICAgIDAsIDAsIDAsCi0gICAgeyAweDQwMDAsIDAgfSwKLSAgICB7IDB4NDAwMCwgMCB9LAotICAgIHsgMHg0MDAwLCAwIH0sCi0KLSAgICAxLCA2NCwgMSwKLSAgICBUUlVFLCA2OCwgMCwgMCwgOSwgMywKLSAgICAwLCBGQUxTRSwgMCwgMSwgMSwgMQotICB9OwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0dGludGVycC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggVFRfRXhlY0NvbnRleHQgKQotICBUVF9OZXdfQ29udGV4dCggVFRfRHJpdmVyICBkcml2ZXIgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLQotICAgIFRUX0V4ZWNDb250ZXh0ICBleGVjID0gTlVMTDsKLQotCi0gICAgaWYgKCAhZHJpdmVyICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIG1lbW9yeSA9IGRyaXZlci0+cm9vdC5yb290Lm1lbW9yeTsKLQotICAgIC8qIGFsbG9jYXRlIG9iamVjdCAqLwotICAgIGlmICggRlRfTkVXKCBleGVjICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgLyogaW5pdGlhbGl6ZSBpdDsgaW4gY2FzZSBvZiBlcnJvciB0aGlzIGRlYWxsb2NhdGVzIGBleGVjJyB0b28gKi8KLSAgICBlcnJvciA9IEluaXRfQ29udGV4dCggZXhlYywgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICByZXR1cm4gZXhlYzsKLQotICBGYWlsOgotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJlZm9yZSBhbiBvcGNvZGUgaXMgZXhlY3V0ZWQsIHRoZSBpbnRlcnByZXRlciB2ZXJpZmllcyB0aGF0IHRoZXJlIGFyZSAqLwotICAvKiBlbm91Z2ggYXJndW1lbnRzIG9uIHRoZSBzdGFjaywgd2l0aCB0aGUgaGVscCBvZiB0aGUgYFBvcF9QdXNoX0NvdW50JyAgKi8KLSAgLyogdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3IgZWFjaCBvcGNvZGUsIHRoZSBmaXJzdCBjb2x1bW4gZ2l2ZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhhdCAgKi8KLSAgLyogYXJlIHBvcHBlZCBmcm9tIHRoZSBzdGFjazsgdGhlIHNlY29uZCBvbmUgZ2l2ZXMgdGhlIG51bWJlciBvZiB0aG9zZSAgICovCi0gIC8qIHRoYXQgYXJlIHB1c2hlZCBpbiByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlcyB3aGljaCBoYXZlIGEgdmFyeWluZyBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgZGF0YSBzdHJlYW0gICovCi0gIC8qIChOUFVTSEIsIE5QVVNIVykgYXJlIGhhbmRsZWQgc3BlY2lhbGx5OyB0aGV5IGhhdmUgYSBuZWdhdGl2ZSB2YWx1ZSBpbiAqLwotICAvKiB0aGUgYG9wY29kZV9sZW5ndGgnIHRhYmxlLCBhbmQgdGhlIHZhbHVlIGluIGBQb3BfUHVzaF9Db3VudCcgaXMgc2V0ICAgKi8KLSAgLyogdG8gemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIFBBQ0sKLSNkZWZpbmUgUEFDSyggeCwgeSApICAoICggeCA8PCA0ICkgfCB5ICkKLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9CeXRlICBQb3BfUHVzaF9Db3VudFsyNTZdID0KLSAgewotICAgIC8qIG9wY29kZXMgYXJlIGdhdGhlcmVkIGluIGdyb3VwcyBvZiAxNiAqLwotICAgIC8qIHBsZWFzZSBrZWVwIHRoZSBzcGFjZXMgYXMgdGhleSBhcmUgICAqLwotCi0gICAgLyogIFNWVENBICB5ICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTVlRDQSAgeCAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU1B2VENBIHkgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNQdlRDQSB4ICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTRnZUQ0EgeSAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU0Z2VENBIHggICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNQdlRMIC8vICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTUHZUTCArICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgU0Z2VEwgLy8gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNGdlRMICsgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTUHZGUyAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgU0Z2RlMgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIEdQdiAgICAgICAqLyAgUEFDSyggMCwgMiApLAotICAgIC8qICBHRnYgICAgICAgKi8gIFBBQ0soIDAsIDIgKSwKLSAgICAvKiAgU0Z2VFB2ICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIElTRUNUICAgICAqLyAgUEFDSyggNSwgMCApLAotCi0gICAgLyogIFNSUDAgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTUlAxICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1JQMiAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNaUDAgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTWlAxICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1pQMiAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNaUFMgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTTE9PUCAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgUlRHICAgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFJUSEcgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTTUQgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRUxTRSAgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIEpNUFIgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTQ3ZUQ2kgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1N3Q2kgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNTVyAgICAgICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIERVUCAgICAgICAqLyAgUEFDSyggMSwgMiApLAotICAgIC8qICBQT1AgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgQ0xFQVIgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNXQVAgICAgICAqLyAgUEFDSyggMiwgMiApLAotICAgIC8qICBERVBUSCAgICAgKi8gIFBBQ0soIDAsIDEgKSwKLSAgICAvKiAgQ0lOREVYICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIE1JTkRFWCAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBBbGlnblBUUyAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgSU5TXyQyOCAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFVUUCAgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBMT09QQ0FMTCAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgQ0FMTCAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIEZERUYgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBFTkRGICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgTURBUFswXSAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EQVBbMV0gICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIElVUFswXSAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBJVVBbMV0gICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU0hQWzBdICAgICovICBQQUNLKCAwLCAwICksIC8qIGxvb3BzICovCi0gICAgLyogIFNIUFsxXSAgICAqLyAgUEFDSyggMCwgMCApLCAvKiBsb29wcyAqLwotICAgIC8qICBTSENbMF0gICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0hDWzFdICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNIWlswXSAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTSFpbMV0gICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0hQSVggICAgICovICBQQUNLKCAxLCAwICksIC8qIGxvb3BzICovCi0gICAgLyogIElQICAgICAgICAqLyAgUEFDSyggMCwgMCApLCAvKiBsb29wcyAqLwotICAgIC8qICBNU0lSUFswXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTVNJUlBbMV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIEFsaWduUlAgICAqLyAgUEFDSyggMCwgMCApLCAvKiBsb29wcyAqLwotICAgIC8qICBSVERHICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgTUlBUFswXSAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JQVBbMV0gICAqLyAgUEFDSyggMiwgMCApLAotCi0gICAgLyogIE5QdXNoQiAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBOUHVzaFcgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgV1MgICAgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFJTICAgICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBXQ3Z0UCAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgUkN2dCAgICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIEdDWzBdICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBHQ1sxXSAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgU0NGUyAgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1EWzBdICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBNRFsxXSAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgTVBQRU0gICAgICovICBQQUNLKCAwLCAxICksCi0gICAgLyogIE1QUyAgICAgICAqLyAgUEFDSyggMCwgMSApLAotICAgIC8qICBGbGlwT04gICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgRmxpcE9GRiAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIERFQlVHICAgICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIExUICAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBMVEVRICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgR1QgICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIEdURVEgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBFUSAgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgTkVRICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE9ERCAgICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBFVkVOICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgSUYgICAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIEVJRiAgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBBTkQgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgT1IgICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE5PVCAgICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBEZWx0YVAxICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0RCICAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNEUyAgICAgICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIEFERCAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBTVUIgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgRElWICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE1VTCAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBBQlMgICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgTkVHICAgICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIEZMT09SICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBDRUlMSU5HICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgUk9VTkRbMF0gICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIFJPVU5EWzFdICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBST1VORFsyXSAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgUk9VTkRbM10gICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIE5ST1VORFswXSAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBOUk9VTkRbMV0gKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgTlJPVU5EWzJdICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIE5ST1VORFszXSAqLyAgUEFDSyggMSwgMSApLAotCi0gICAgLyogIFdDdnRGICAgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBEZWx0YVAyICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRGVsdGFQMyAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIERlbHRhQ25bMF0gKi8gUEFDSyggMSwgMCApLAotICAgIC8qICBEZWx0YUNuWzFdICovIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRGVsdGFDblsyXSAqLyBQQUNLKCAxLCAwICksCi0gICAgLyogIFNST1VORCAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTNDVSb3VuZCAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgSlJPVCAgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIEpST0YgICAgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBST0ZGICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ3QiAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFJVVEcgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBSRFRHICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU0FOR1cgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIEFBICAgICAgICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIEZsaXBQVCAgICAqLyAgUEFDSyggMCwgMCApLCAvKiBsb29wcyAqLwotICAgIC8qICBGbGlwUmdPTiAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgRmxpcFJnT0ZGICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIElOU18kODMgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDg0ICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU2NhbkNUUkwgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNEUHZUTFswXSAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTRFB2VExbMV0gKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgR2V0SU5GTyAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIElERUYgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBST0xMICAgICAgKi8gIFBBQ0soIDMsIDMgKSwKLSAgICAvKiAgTUFYICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE1JTiAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBTY2FuVFlQRSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgSW5zdENUUkwgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIElOU18kOEYgICAqLyAgUEFDSyggMCwgMCApLAotCi0gICAgLyogIElOU18kOTAgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBHRVRWQVIgICAqLyAgIFBBQ0soIDAsIDAgKSwgLyogd2lsbCBiZSBoYW5kbGVkIHNwZWNpYWxseSAqLwotICAgIC8qICBHRVREQVRBICAqLyAgIFBBQ0soIDAsIDEgKSwKLSAgICAvKiAgSU5TXyQ5MyAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOTQgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDk1ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5NiAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOTcgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDk4ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5OSAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOUEgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDlCICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5QyAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOUQgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDlFICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5RiAgKi8gICBQQUNLKCAwLCAwICksCi0KLSAgICAvKiAgSU5TXyRBMCAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTEgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEEyICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBMyAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTQgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEE1ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBNiAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTcgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEE4ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBOSAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQUEgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEFCICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBQyAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQUQgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEFFICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBRiAgKi8gICBQQUNLKCAwLCAwICksCi0KLSAgICAvKiAgUHVzaEJbMF0gICovICBQQUNLKCAwLCAxICksCi0gICAgLyogIFB1c2hCWzFdICAqLyAgUEFDSyggMCwgMiApLAotICAgIC8qICBQdXNoQlsyXSAgKi8gIFBBQ0soIDAsIDMgKSwKLSAgICAvKiAgUHVzaEJbM10gICovICBQQUNLKCAwLCA0ICksCi0gICAgLyogIFB1c2hCWzRdICAqLyAgUEFDSyggMCwgNSApLAotICAgIC8qICBQdXNoQls1XSAgKi8gIFBBQ0soIDAsIDYgKSwKLSAgICAvKiAgUHVzaEJbNl0gICovICBQQUNLKCAwLCA3ICksCi0gICAgLyogIFB1c2hCWzddICAqLyAgUEFDSyggMCwgOCApLAotICAgIC8qICBQdXNoV1swXSAgKi8gIFBBQ0soIDAsIDEgKSwKLSAgICAvKiAgUHVzaFdbMV0gICovICBQQUNLKCAwLCAyICksCi0gICAgLyogIFB1c2hXWzJdICAqLyAgUEFDSyggMCwgMyApLAotICAgIC8qICBQdXNoV1szXSAgKi8gIFBBQ0soIDAsIDQgKSwKLSAgICAvKiAgUHVzaFdbNF0gICovICBQQUNLKCAwLCA1ICksCi0gICAgLyogIFB1c2hXWzVdICAqLyAgUEFDSyggMCwgNiApLAotICAgIC8qICBQdXNoV1s2XSAgKi8gIFBBQ0soIDAsIDcgKSwKLSAgICAvKiAgUHVzaFdbN10gICovICBQQUNLKCAwLCA4ICksCi0KLSAgICAvKiAgTURSUFswMF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDFdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzAyXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswM10gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDRdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzA1XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswNl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDddICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzA4XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswOV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTBdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzExXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxMl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTNdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzE0XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxNV0gICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgTURSUFsxNl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTddICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzE4XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxOV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjBdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzIxXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyMl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjNdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzI0XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyNV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjZdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzI3XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyOF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjldICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzMwXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFszMV0gICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgTUlSUFswMF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDFdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzAyXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswM10gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDRdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzA1XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswNl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDddICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzA4XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswOV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTBdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzExXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxMl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTNdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzE0XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxNV0gICovICBQQUNLKCAyLCAwICksCi0KLSAgICAvKiAgTUlSUFsxNl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTddICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzE4XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxOV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjBdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzIxXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyMl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjNdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzI0XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyNV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjZdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzI3XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyOF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjldICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzMwXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFszMV0gICovICBQQUNLKCAyLCAwICkKLSAgfTsKLQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotICAvKiB0aGUgZmlyc3QgaGV4IGRpZ2l0IGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIG9wY29kZSBuYW1lOyB0aGUgc3BhY2UgKi8KLSAgLyogYWZ0ZXIgdGhlIGRpZ2l0IGlzIGhlcmUganVzdCB0byBpbmNyZWFzZSByZWFkYWJpbGl0eSBvZiB0aGUgc291cmNlICovCi0gIC8qIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYwotICBjb25zdCBjaGFyKiAgY29uc3Qgb3Bjb2RlX25hbWVbMjU2XSA9Ci0gIHsKLSAgICAiNyBTVlRDQSB5IiwKLSAgICAiNyBTVlRDQSB4IiwKLSAgICAiOCBTUHZUQ0EgeSIsCi0gICAgIjggU1B2VENBIHgiLAotICAgICI4IFNGdlRDQSB5IiwKLSAgICAiOCBTRnZUQ0EgeCIsCi0gICAgIjggU1B2VEwgfHwiLAotICAgICI3IFNQdlRMICsiLAotICAgICI4IFNGdlRMIHx8IiwKLSAgICAiNyBTRnZUTCArIiwKLSAgICAiNSBTUHZGUyIsCi0gICAgIjUgU0Z2RlMiLAotICAgICIzIEdQdiIsCi0gICAgIjMgR0Z2IiwKLSAgICAiNiBTRnZUUHYiLAotICAgICI1IElTRUNUIiwKLQotICAgICI0IFNSUDAiLAotICAgICI0IFNSUDEiLAotICAgICI0IFNSUDIiLAotICAgICI0IFNaUDAiLAotICAgICI0IFNaUDEiLAotICAgICI0IFNaUDIiLAotICAgICI0IFNaUFMiLAotICAgICI1IFNMT09QIiwKLSAgICAiMyBSVEciLAotICAgICI0IFJUSEciLAotICAgICIzIFNNRCIsCi0gICAgIjQgRUxTRSIsCi0gICAgIjQgSk1QUiIsCi0gICAgIjYgU0N2VENpIiwKLSAgICAiNSBTU3dDaSIsCi0gICAgIjMgU1NXIiwKLQotICAgICIzIERVUCIsCi0gICAgIjMgUE9QIiwKLSAgICAiNSBDTEVBUiIsCi0gICAgIjQgU1dBUCIsCi0gICAgIjUgREVQVEgiLAotICAgICI2IENJTkRFWCIsCi0gICAgIjYgTUlOREVYIiwKLSAgICAiOCBBbGlnblBUUyIsCi0gICAgIjcgSU5TXyQyOCIsCi0gICAgIjMgVVRQIiwKLSAgICAiOCBMT09QQ0FMTCIsCi0gICAgIjQgQ0FMTCIsCi0gICAgIjQgRkRFRiIsCi0gICAgIjQgRU5ERiIsCi0gICAgIjcgTURBUFswXSIsCi0gICAgIjcgTURBUFsxXSIsCi0KLSAgICAiNiBJVVBbMF0iLAotICAgICI2IElVUFsxXSIsCi0gICAgIjYgU0hQWzBdIiwKLSAgICAiNiBTSFBbMV0iLAotICAgICI2IFNIQ1swXSIsCi0gICAgIjYgU0hDWzFdIiwKLSAgICAiNiBTSFpbMF0iLAotICAgICI2IFNIWlsxXSIsCi0gICAgIjUgU0hQSVgiLAotICAgICIyIElQIiwKLSAgICAiOCBNU0lSUFswXSIsCi0gICAgIjggTVNJUlBbMV0iLAotICAgICI3IEFsaWduUlAiLAotICAgICI0IFJUREciLAotICAgICI3IE1JQVBbMF0iLAotICAgICI3IE1JQVBbMV0iLAotCi0gICAgIjYgTlB1c2hCIiwKLSAgICAiNiBOUHVzaFciLAotICAgICIyIFdTIiwKLSAgICAiMiBSUyIsCi0gICAgIjUgV0N2dFAiLAotICAgICI0IFJDdnQiLAotICAgICI1IEdDWzBdIiwKLSAgICAiNSBHQ1sxXSIsCi0gICAgIjQgU0NGUyIsCi0gICAgIjUgTURbMF0iLAotICAgICI1IE1EWzFdIiwKLSAgICAiNSBNUFBFTSIsCi0gICAgIjMgTVBTIiwKLSAgICAiNiBGbGlwT04iLAotICAgICI3IEZsaXBPRkYiLAotICAgICI1IERFQlVHIiwKLQotICAgICIyIExUIiwKLSAgICAiNCBMVEVRIiwKLSAgICAiMiBHVCIsCi0gICAgIjQgR1RFUSIsCi0gICAgIjIgRVEiLAotICAgICIzIE5FUSIsCi0gICAgIjMgT0REIiwKLSAgICAiNCBFVkVOIiwKLSAgICAiMiBJRiIsCi0gICAgIjMgRUlGIiwKLSAgICAiMyBBTkQiLAotICAgICIyIE9SIiwKLSAgICAiMyBOT1QiLAotICAgICI3IERlbHRhUDEiLAotICAgICIzIFNEQiIsCi0gICAgIjMgU0RTIiwKLQotICAgICIzIEFERCIsCi0gICAgIjMgU1VCIiwKLSAgICAiMyBESVYiLAotICAgICIzIE1VTCIsCi0gICAgIjMgQUJTIiwKLSAgICAiMyBORUciLAotICAgICI1IEZMT09SIiwKLSAgICAiNyBDRUlMSU5HIiwKLSAgICAiOCBST1VORFswXSIsCi0gICAgIjggUk9VTkRbMV0iLAotICAgICI4IFJPVU5EWzJdIiwKLSAgICAiOCBST1VORFszXSIsCi0gICAgIjkgTlJPVU5EWzBdIiwKLSAgICAiOSBOUk9VTkRbMV0iLAotICAgICI5IE5ST1VORFsyXSIsCi0gICAgIjkgTlJPVU5EWzNdIiwKLQotICAgICI1IFdDdnRGIiwKLSAgICAiNyBEZWx0YVAyIiwKLSAgICAiNyBEZWx0YVAzIiwKLSAgICAiQSBEZWx0YUNuWzBdIiwKLSAgICAiQSBEZWx0YUNuWzFdIiwKLSAgICAiQSBEZWx0YUNuWzJdIiwKLSAgICAiNiBTUk9VTkQiLAotICAgICI4IFM0NVJvdW5kIiwKLSAgICAiNCBKUk9UIiwKLSAgICAiNCBKUk9GIiwKLSAgICAiNCBST0ZGIiwKLSAgICAiNyBJTlNfJDdCIiwKLSAgICAiNCBSVVRHIiwKLSAgICAiNCBSRFRHIiwKLSAgICAiNSBTQU5HVyIsCi0gICAgIjIgQUEiLAotCi0gICAgIjYgRmxpcFBUIiwKLSAgICAiOCBGbGlwUmdPTiIsCi0gICAgIjkgRmxpcFJnT0ZGIiwKLSAgICAiNyBJTlNfJDgzIiwKLSAgICAiNyBJTlNfJDg0IiwKLSAgICAiOCBTY2FuQ1RSTCIsCi0gICAgIjkgU0RQdlRMWzBdIiwKLSAgICAiOSBTRFB2VExbMV0iLAotICAgICI3IEdldElORk8iLAotICAgICI0IElERUYiLAotICAgICI0IFJPTEwiLAotICAgICIzIE1BWCIsCi0gICAgIjMgTUlOIiwKLSAgICAiOCBTY2FuVFlQRSIsCi0gICAgIjggSW5zdENUUkwiLAotICAgICI3IElOU18kOEYiLAotCi0gICAgIjcgSU5TXyQ5MCIsCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgICI2IEdFVFZBUiIsCi0gICAgIjcgR0VUREFUQSIsCi0jZWxzZQotICAgICI3IElOU18kOTEiLAotICAgICI3IElOU18kOTIiLAotI2VuZGlmCi0gICAgIjcgSU5TXyQ5MyIsCi0gICAgIjcgSU5TXyQ5NCIsCi0gICAgIjcgSU5TXyQ5NSIsCi0gICAgIjcgSU5TXyQ5NiIsCi0gICAgIjcgSU5TXyQ5NyIsCi0gICAgIjcgSU5TXyQ5OCIsCi0gICAgIjcgSU5TXyQ5OSIsCi0gICAgIjcgSU5TXyQ5QSIsCi0gICAgIjcgSU5TXyQ5QiIsCi0gICAgIjcgSU5TXyQ5QyIsCi0gICAgIjcgSU5TXyQ5RCIsCi0gICAgIjcgSU5TXyQ5RSIsCi0gICAgIjcgSU5TXyQ5RiIsCi0KLSAgICAiNyBJTlNfJEEwIiwKLSAgICAiNyBJTlNfJEExIiwKLSAgICAiNyBJTlNfJEEyIiwKLSAgICAiNyBJTlNfJEEzIiwKLSAgICAiNyBJTlNfJEE0IiwKLSAgICAiNyBJTlNfJEE1IiwKLSAgICAiNyBJTlNfJEE2IiwKLSAgICAiNyBJTlNfJEE3IiwKLSAgICAiNyBJTlNfJEE4IiwKLSAgICAiNyBJTlNfJEE5IiwKLSAgICAiNyBJTlNfJEFBIiwKLSAgICAiNyBJTlNfJEFCIiwKLSAgICAiNyBJTlNfJEFDIiwKLSAgICAiNyBJTlNfJEFEIiwKLSAgICAiNyBJTlNfJEFFIiwKLSAgICAiNyBJTlNfJEFGIiwKLQotICAgICI4IFB1c2hCWzBdIiwKLSAgICAiOCBQdXNoQlsxXSIsCi0gICAgIjggUHVzaEJbMl0iLAotICAgICI4IFB1c2hCWzNdIiwKLSAgICAiOCBQdXNoQls0XSIsCi0gICAgIjggUHVzaEJbNV0iLAotICAgICI4IFB1c2hCWzZdIiwKLSAgICAiOCBQdXNoQls3XSIsCi0gICAgIjggUHVzaFdbMF0iLAotICAgICI4IFB1c2hXWzFdIiwKLSAgICAiOCBQdXNoV1syXSIsCi0gICAgIjggUHVzaFdbM10iLAotICAgICI4IFB1c2hXWzRdIiwKLSAgICAiOCBQdXNoV1s1XSIsCi0gICAgIjggUHVzaFdbNl0iLAotICAgICI4IFB1c2hXWzddIiwKLQotICAgICI4IE1EUlBbMDBdIiwKLSAgICAiOCBNRFJQWzAxXSIsCi0gICAgIjggTURSUFswMl0iLAotICAgICI4IE1EUlBbMDNdIiwKLSAgICAiOCBNRFJQWzA0XSIsCi0gICAgIjggTURSUFswNV0iLAotICAgICI4IE1EUlBbMDZdIiwKLSAgICAiOCBNRFJQWzA3XSIsCi0gICAgIjggTURSUFswOF0iLAotICAgICI4IE1EUlBbMDldIiwKLSAgICAiOCBNRFJQWzEwXSIsCi0gICAgIjggTURSUFsxMV0iLAotICAgICI4IE1EUlBbMTJdIiwKLSAgICAiOCBNRFJQWzEzXSIsCi0gICAgIjggTURSUFsxNF0iLAotICAgICI4IE1EUlBbMTVdIiwKLQotICAgICI4IE1EUlBbMTZdIiwKLSAgICAiOCBNRFJQWzE3XSIsCi0gICAgIjggTURSUFsxOF0iLAotICAgICI4IE1EUlBbMTldIiwKLSAgICAiOCBNRFJQWzIwXSIsCi0gICAgIjggTURSUFsyMV0iLAotICAgICI4IE1EUlBbMjJdIiwKLSAgICAiOCBNRFJQWzIzXSIsCi0gICAgIjggTURSUFsyNF0iLAotICAgICI4IE1EUlBbMjVdIiwKLSAgICAiOCBNRFJQWzI2XSIsCi0gICAgIjggTURSUFsyN10iLAotICAgICI4IE1EUlBbMjhdIiwKLSAgICAiOCBNRFJQWzI5XSIsCi0gICAgIjggTURSUFszMF0iLAotICAgICI4IE1EUlBbMzFdIiwKLQotICAgICI4IE1JUlBbMDBdIiwKLSAgICAiOCBNSVJQWzAxXSIsCi0gICAgIjggTUlSUFswMl0iLAotICAgICI4IE1JUlBbMDNdIiwKLSAgICAiOCBNSVJQWzA0XSIsCi0gICAgIjggTUlSUFswNV0iLAotICAgICI4IE1JUlBbMDZdIiwKLSAgICAiOCBNSVJQWzA3XSIsCi0gICAgIjggTUlSUFswOF0iLAotICAgICI4IE1JUlBbMDldIiwKLSAgICAiOCBNSVJQWzEwXSIsCi0gICAgIjggTUlSUFsxMV0iLAotICAgICI4IE1JUlBbMTJdIiwKLSAgICAiOCBNSVJQWzEzXSIsCi0gICAgIjggTUlSUFsxNF0iLAotICAgICI4IE1JUlBbMTVdIiwKLQotICAgICI4IE1JUlBbMTZdIiwKLSAgICAiOCBNSVJQWzE3XSIsCi0gICAgIjggTUlSUFsxOF0iLAotICAgICI4IE1JUlBbMTldIiwKLSAgICAiOCBNSVJQWzIwXSIsCi0gICAgIjggTUlSUFsyMV0iLAotICAgICI4IE1JUlBbMjJdIiwKLSAgICAiOCBNSVJQWzIzXSIsCi0gICAgIjggTUlSUFsyNF0iLAotICAgICI4IE1JUlBbMjVdIiwKLSAgICAiOCBNSVJQWzI2XSIsCi0gICAgIjggTUlSUFsyN10iLAotICAgICI4IE1JUlBbMjhdIiwKLSAgICAiOCBNSVJQWzI5XSIsCi0gICAgIjggTUlSUFszMF0iLAotICAgICI4IE1JUlBbMzFdIgotICB9OwotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9DaGFyICBvcGNvZGVfbGVuZ3RoWzI1Nl0gPQotICB7Ci0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLQotICAgLTEsLTIsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0KLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAyLCAzLCA0LCA1LCAgNiwgNywgOCwgOSwgIDMsIDUsIDcsIDksIDExLDEzLDE1LDE3LAotCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMQotICB9OwotCi0jdW5kZWYgUEFDSwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIKLQotI2lmIGRlZmluZWQoIF9fYXJtX18gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKLSAgICAoIGRlZmluZWQoIF9fdGh1bWIyX18gKSB8fCAhZGVmaW5lZCggX190aHVtYl9fICkgKQotCi0jZGVmaW5lIFRUX011bEZpeDE0ICBUVF9NdWxGaXgxNF9hcm0KLQotICBzdGF0aWMgRlRfSW50MzIKLSAgVFRfTXVsRml4MTRfYXJtKCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgYiApCi0gIHsKLSAgICBGVF9JbnQzMiAgdCwgdDI7Ci0KLQotI2lmIGRlZmluZWQoIF9fQ0NfQVJNICkgfHwgZGVmaW5lZCggX19BUk1DQ19fICkKLQotICAgIF9fYXNtCi0gICAgewotICAgICAgc211bGwgdDIsIHQsICBiLCAgYSAgICAgICAgICAgLyogKGxvPXQyLGhpPXQpID0gYSpiICovCi0gICAgICBtb3YgICBhLCAgdCwgIGFzciAjMzEgICAgICAgICAvKiBhICAgPSAoaGkgPj4gMzEpICovCi0gICAgICBhZGQgICBhLCAgYSwgICMweDIwMDAgICAgICAgICAvKiBhICArPSAweDIwMDAgKi8KLSAgICAgIGFkZHMgIHQyLCB0MiwgYSAgICAgICAgICAgICAgIC8qIHQyICs9IGEgKi8KLSAgICAgIGFkYyAgIHQsICB0LCAgIzAgICAgICAgICAgICAgIC8qIHQgICs9IGNhcnJ5ICovCi0gICAgICBtb3YgICBhLCAgdDIsIGxzciAjMTQgICAgICAgICAvKiBhICAgPSB0MiA+PiAxNCAqLwotICAgICAgb3JyICAgYSwgIGEsICB0LCAgbHNsICMxOCAgICAgLyogYSAgfD0gdCA8PCAxOCAqLwotICAgIH0KLQotI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgInNtdWxsICAlMSwgJTIsICU0LCAlM1xuXHQiICAgICAgIC8qIChsbz0lMSxoaT0lMikgPSBhKmIgKi8KLSAgICAgICJtb3YgICAgJTAsICUyLCBhc3IgIzMxXG5cdCIgICAgICAvKiAlMCAgPSAoaGkgPj4gMzEpICovCi0jaWYgZGVmaW5lZCggX19jbGFuZ19fICkgJiYgZGVmaW5lZCggX190aHVtYjJfXyApCi0gICAgICAiYWRkLncgICUwLCAlMCwgIzB4MjAwMFxuXHQiICAgICAgLyogJTAgKz0gMHgyMDAwICovCi0jZWxzZQotICAgICAgImFkZCAgICAlMCwgJTAsICMweDIwMDBcblx0IiAgICAgIC8qICUwICs9IDB4MjAwMCAqLwotI2VuZGlmCi0gICAgICAiYWRkcyAgICUxLCAlMSwgJTBcblx0IiAgICAgICAgICAgLyogJTEgKz0gJTAgKi8KLSAgICAgICJhZGMgICAgJTIsICUyLCAjMFxuXHQiICAgICAgICAgICAvKiAlMiArPSBjYXJyeSAqLwotICAgICAgIm1vdiAgICAlMCwgJTEsIGxzciAjMTRcblx0IiAgICAgIC8qICUwICA9ICUxID4+IDE2ICovCi0gICAgICAib3JyICAgICUwLCAlMCwgJTIsIGxzbCAjMThcblx0IiAgLyogJTAgfD0gJTIgPDwgMTYgKi8KLSAgICAgIDogIj1yIihhKSwgIj0mciIodDIpLCAiPSZyIih0KQotICAgICAgOiAiciIoYSksICJyIihiKQotICAgICAgOiAiY2MiICk7Ci0KLSNlbmRpZgotCi0gICAgcmV0dXJuIGE7Ci0gIH0KLQotI2VuZGlmIC8qIF9fYXJtX18gJiYgKCBfX3RodW1iMl9fIHx8ICFfX3RodW1iX18gKSAqLwotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSICovCi0KLQotI2lmIGRlZmluZWQoIF9fR05VQ19fICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgKCBkZWZpbmVkKCBfX2kzODZfXyApIHx8IGRlZmluZWQoIF9feDg2XzY0X18gKSApCi0KLSNkZWZpbmUgVFRfTXVsRml4MTQgIFRUX011bEZpeDE0X2xvbmdfbG9uZwotCi0gIC8qIFRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBDOTAgZG9lc24ndCBzdXBwb3J0IGBsb25nIGxvbmcnLiAqLwotI2lmICggX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXyApID49IDQwNgotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0jZW5kaWYKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdsb25nLWxvbmciCi0KLSAgLyogVGhpcyBpcyBkZWNsYXJlZCBgbm9pbmxpbmUnIGJlY2F1c2UgaW5saW5pbmcgdGhlIGZ1bmN0aW9uIHJlc3VsdHMgKi8KLSAgLyogaW4gc2xvd2VyIGNvZGUuICBUaGUgYHB1cmUnIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0ICAgKi8KLSAgLyogb25seSBkZXBlbmRzIG9uIHRoZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIF9fYXR0cmlidXRlX18oKCBub2lubGluZSApKQotICAgICAgICAgX19hdHRyaWJ1dGVfXygoIHB1cmUgKSkgRlRfSW50MzIKLSAgVFRfTXVsRml4MTRfbG9uZ19sb25nKCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgYiApCi0gIHsKLQotICAgIGxvbmcgbG9uZyAgcmV0ID0gKGxvbmcgbG9uZylhICogYjsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBhc3N1bWVzIHRoYXQgcmlnaHQgc2hpZnRpbmcgb2Ygc2lnbmVkIHZhbHVlcyAqLwotICAgIC8qIHdpbGwgYWN0dWFsbHkgcHJlc2VydmUgdGhlIHNpZ24gYml0LiAgVGhlIGV4YWN0IGJlaGF2aW91ciBpcyAgICAqLwotICAgIC8qIHVuZGVmaW5lZCwgYnV0IHRoaXMgaXMgdHJ1ZSBvbiB4ODYgYW5kIHg4Nl82NC4gICAgICAgICAgICAgICAgICAqLwotICAgIGxvbmcgbG9uZyAgdG1wID0gcmV0ID4+IDYzOwotCi0KLSAgICByZXQgKz0gMHgyMDAwICsgdG1wOwotCi0gICAgcmV0dXJuIChGVF9JbnQzMikoIHJldCA+PiAxNCApOwotICB9Ci0KLSNpZiAoIF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18gKSA+PSA0MDYKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fR05VQ19fICYmICggX19pMzg2X18gfHwgX194ODZfNjRfXyApICovCi0KLQotI2lmbmRlZiBUVF9NdWxGaXgxNAotCi0gIC8qIENvbXB1dGUgKGEqYikvMl4xNCB3aXRoIG1heGltdW0gYWNjdXJhY3kgYW5kIHJvdW5kaW5nLiAgKi8KLSAgLyogVGhpcyBpcyBvcHRpbWl6ZWQgdG8gYmUgZmFzdGVyIHRoYW4gY2FsbGluZyBGVF9NdWxGaXgoKSAqLwotICAvKiBmb3IgcGxhdGZvcm1zIHdoZXJlIHNpemVvZihpbnQpID09IDIuICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9JbnQzMgotICBUVF9NdWxGaXgxNCggRlRfSW50MzIgIGEsCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgYiApCi0gIHsKLSAgICBGVF9JbnQzMiAgIHNpZ247Ci0gICAgRlRfVUludDMyICBhaCwgYWwsIG1pZCwgbG8sIGhpOwotCi0KLSAgICBzaWduID0gYSBeIGI7Ci0KLSAgICBpZiAoIGEgPCAwICkKLSAgICAgIGEgPSAtYTsKLSAgICBpZiAoIGIgPCAwICkKLSAgICAgIGIgPSAtYjsKLQotICAgIGFoID0gKEZUX1VJbnQzMikoICggYSA+PiAxNiApICYgMHhGRkZGVSApOwotICAgIGFsID0gKEZUX1VJbnQzMikoIGEgJiAweEZGRkZVICk7Ci0KLSAgICBsbyAgICA9IGFsICogYjsKLSAgICBtaWQgICA9IGFoICogYjsKLSAgICBoaSAgICA9IG1pZCA+PiAxNjsKLSAgICBtaWQgICA9ICggbWlkIDw8IDE2ICkgKyAoIDEgPDwgMTMgKTsgLyogcm91bmRpbmcgKi8KLSAgICBsbyAgICs9IG1pZDsKLSAgICBpZiAoIGxvIDwgbWlkICkKLSAgICAgIGhpICs9IDE7Ci0KLSAgICBtaWQgPSAoIGxvID4+IDE0ICkgfCAoIGhpIDw8IDE4ICk7Ci0KLSAgICByZXR1cm4gc2lnbiA+PSAwID8gKEZUX0ludDMyKW1pZCA6IC0oRlRfSW50MzIpbWlkOwotICB9Ci0KLSNlbmRpZiAgLyogIVRUX011bEZpeDE0ICovCi0KLQotI2lmIGRlZmluZWQoIF9fR05VQ19fICkgICAgICAgICYmIFwKLSAgICAoIGRlZmluZWQoIF9faTM4Nl9fICkgICB8fCAgICBcCi0gICAgICBkZWZpbmVkKCBfX3g4Nl82NF9fICkgfHwgICAgXAotICAgICAgZGVmaW5lZCggX19hcm1fXyApICAgICkKLQotI2RlZmluZSBUVF9Eb3RGaXgxNCAgVFRfRG90Rml4MTRfbG9uZ19sb25nCi0KLSNpZiAoIF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18gKSA+PSA0MDYKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAotI2VuZGlmCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbG9uZy1sb25nIgotCi0gIHN0YXRpYyBfX2F0dHJpYnV0ZV9fKCggcHVyZSApKSBGVF9JbnQzMgotICBUVF9Eb3RGaXgxNF9sb25nX2xvbmcoIEZUX0ludDMyICBheCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGJ4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICBieSApCi0gIHsKLSAgICAvKiBUZW1wb3JhcmlseSBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgQzkwIGRvZXNuJ3Qgc3VwcG9ydCAqLwotICAgIC8qIGBsb25nIGxvbmcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBsb25nIGxvbmcgIHRlbXAxID0gKGxvbmcgbG9uZylheCAqIGJ4OwotICAgIGxvbmcgbG9uZyAgdGVtcDIgPSAobG9uZyBsb25nKWF5ICogYnk7Ci0KLQotICAgIHRlbXAxICs9IHRlbXAyOwotICAgIHRlbXAyICA9IHRlbXAxID4+IDYzOwotICAgIHRlbXAxICs9IDB4MjAwMCArIHRlbXAyOwotCi0gICAgcmV0dXJuIChGVF9JbnQzMikoIHRlbXAxID4+IDE0ICk7Ci0KLSAgfQotCi0jaWYgKCBfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fICkgPj0gNDA2Ci0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAmJiAoX19hcm1fXyB8fCBfX2kzODZfXyB8fCBfX3g4Nl82NF9fKSAqLwotCi0KLSNpZm5kZWYgVFRfRG90Rml4MTQKLQotICAvKiBjb21wdXRlIChheCpieCtheSpieSkvMl4xNCB3aXRoIG1heGltdW0gYWNjdXJhY3kgYW5kIHJvdW5kaW5nICovCi0gIHN0YXRpYyBGVF9JbnQzMgotICBUVF9Eb3RGaXgxNCggRlRfSW50MzIgIGF4LAotICAgICAgICAgICAgICAgRlRfSW50MzIgIGF5LAotICAgICAgICAgICAgICAgRlRfSW50ICAgIGJ4LAotICAgICAgICAgICAgICAgRlRfSW50ICAgIGJ5ICkKLSAgewotICAgIEZUX0ludDMyICAgbSwgcywgaGkxLCBoaTIsIGhpOwotICAgIEZUX1VJbnQzMiAgbCwgbG8xLCBsbzIsIGxvOwotCi0KLSAgICAvKiBjb21wdXRlIGF4KmJ4IGFzIDY0LWJpdCB2YWx1ZSAqLwotICAgIGwgPSAoRlRfVUludDMyKSggKCBheCAmIDB4RkZGRlUgKSAqIGJ4ICk7Ci0gICAgbSA9ICggYXggPj4gMTYgKSAqIGJ4OwotCi0gICAgbG8xID0gbCArICggKEZUX1VJbnQzMiltIDw8IDE2ICk7Ci0gICAgaGkxID0gKCBtID4+IDE2ICkgKyAoIChGVF9JbnQzMilsID4+IDMxICkgKyAoIGxvMSA8IGwgKTsKLQotICAgIC8qIGNvbXB1dGUgYXkqYnkgYXMgNjQtYml0IHZhbHVlICovCi0gICAgbCA9IChGVF9VSW50MzIpKCAoIGF5ICYgMHhGRkZGVSApICogYnkgKTsKLSAgICBtID0gKCBheSA+PiAxNiApICogYnk7Ci0KLSAgICBsbzIgPSBsICsgKCAoRlRfVUludDMyKW0gPDwgMTYgKTsKLSAgICBoaTIgPSAoIG0gPj4gMTYgKSArICggKEZUX0ludDMyKWwgPj4gMzEgKSArICggbG8yIDwgbCApOwotCi0gICAgLyogYWRkIHRoZW0gKi8KLSAgICBsbyA9IGxvMSArIGxvMjsKLSAgICBoaSA9IGhpMSArIGhpMiArICggbG8gPCBsbzEgKTsKLQotICAgIC8qIGRpdmlkZSB0aGUgcmVzdWx0IGJ5IDJeMTQgd2l0aCByb3VuZGluZyAqLwotICAgIHMgICA9IGhpID4+IDMxOwotICAgIGwgICA9IGxvICsgKEZUX1VJbnQzMilzOwotICAgIGhpICs9IHMgKyAoIGwgPCBsbyApOwotICAgIGxvICA9IGw7Ci0KLSAgICBsICAgPSBsbyArIDB4MjAwMFU7Ci0gICAgaGkgKz0gKCBsIDwgbG8gKTsKLQotICAgIHJldHVybiAoRlRfSW50MzIpKCAoIChGVF9VSW50MzIpaGkgPDwgMTggKSB8ICggbCA+PiAxNCApICk7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0RvdEZpeDE0ICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdXJyZW50X1JhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyBzY2FsaW5nIGZhY3RvciBkZXBlbmRpbmcgb24gdGhlICAgKi8KLSAgLyogICAgcHJvamVjdGlvbiB2ZWN0b3IncyBzdGF0ZSBhbmQgZGV2aWNlIHJlc29sdXRpb25zLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFzcGVjdCByYXRpbyBpbiAxNi4xNiBmb3JtYXQsIGFsd2F5cyA8PSAxLjAgLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfTG9uZwotICBDdXJyZW50X1JhdGlvKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGlmICggIWV4Yy0+dHRfbWV0cmljcy5yYXRpbyApCi0gICAgewotICAgICAgaWYgKCBleGMtPkdTLnByb2pWZWN0b3IueSA9PSAwICkKLSAgICAgICAgZXhjLT50dF9tZXRyaWNzLnJhdGlvID0gZXhjLT50dF9tZXRyaWNzLnhfcmF0aW87Ci0KLSAgICAgIGVsc2UgaWYgKCBleGMtPkdTLnByb2pWZWN0b3IueCA9PSAwICkKLSAgICAgICAgZXhjLT50dF9tZXRyaWNzLnJhdGlvID0gZXhjLT50dF9tZXRyaWNzLnlfcmF0aW87Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfRjI2RG90NiAgeCwgeTsKLQotCi0gICAgICAgIHggPSBUVF9NdWxGaXgxNCggZXhjLT50dF9tZXRyaWNzLnhfcmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5wcm9qVmVjdG9yLnggKTsKLSAgICAgICAgeSA9IFRUX011bEZpeDE0KCBleGMtPnR0X21ldHJpY3MueV9yYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueSApOwotICAgICAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSBGVF9IeXBvdCggeCwgeSApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXhjLT50dF9tZXRyaWNzLnJhdGlvOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0xvbmcgKQotICBDdXJyZW50X1BwZW0oIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgcmV0dXJuIGV4Yy0+dHRfbWV0cmljcy5wcGVtOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0xvbmcgKQotICBDdXJyZW50X1BwZW1fU3RyZXRjaGVkKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIHJldHVybiBGVF9NdWxGaXgoIGV4Yy0+dHRfbWV0cmljcy5wcGVtLCBDdXJyZW50X1JhdGlvKCBleGMgKSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlIChDVlQpLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0YyNkRvdDYgKQotICBSZWFkX0NWVCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpZHggKQotICB7Ci0gICAgcmV0dXJuIGV4Yy0+Y3Z0W2lkeF07Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRjI2RG90NiApCi0gIFJlYWRfQ1ZUX1N0cmV0Y2hlZCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4ICkKLSAgewotICAgIHJldHVybiBGVF9NdWxGaXgoIGV4Yy0+Y3Z0W2lkeF0sIEN1cnJlbnRfUmF0aW8oIGV4YyApICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIFdyaXRlX0NWVCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4LAotICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICB2YWx1ZSApCi0gIHsKLSAgICBleGMtPmN2dFtpZHhdID0gdmFsdWU7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIFdyaXRlX0NWVF9TdHJldGNoZWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICB2YWx1ZSApCi0gIHsKLSAgICBleGMtPmN2dFtpZHhdID0gRlRfRGl2Rml4KCB2YWx1ZSwgQ3VycmVudF9SYXRpbyggZXhjICkgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgTW92ZV9DVlQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4LAotICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIHZhbHVlICkKLSAgewotICAgIGV4Yy0+Y3Z0W2lkeF0gKz0gdmFsdWU7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIE1vdmVfQ1ZUX1N0cmV0Y2hlZCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICB2YWx1ZSApCi0gIHsKLSAgICBleGMtPmN2dFtpZHhdICs9IEZUX0RpdkZpeCggdmFsdWUsIEN1cnJlbnRfUmF0aW8oIGV4YyApICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldFNob3J0SW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybnMgYSBzaG9ydCBpbnRlZ2VyIHRha2VuIGZyb20gdGhlIGluc3RydWN0aW9uIHN0cmVhbSBhdCAgICAgICAqLwotICAvKiAgICBhZGRyZXNzIElQLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaG9ydCByZWFkIGF0IGNvZGVbSVBdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG9uZSBjb3VsZCBiZWNvbWUgYSBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9TaG9ydAotICBHZXRTaG9ydElucyggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICAvKiBSZWFkaW5nIGEgYnl0ZSBzdHJlYW0gc28gdGhlcmUgaXMgbm8gZW5kaWFubmVzcyAoRGF2ZVApICovCi0gICAgZXhjLT5JUCArPSAyOwotICAgIHJldHVybiAoRlRfU2hvcnQpKCAoIGV4Yy0+Y29kZVtleGMtPklQIC0gMl0gPDwgOCApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPmNvZGVbZXhjLT5JUCAtIDFdICAgICAgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zX0dvdG9fQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR29lcyB0byBhIGNlcnRhaW4gY29kZSByYW5nZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYVJhbmdlIDo6IFRoZSBpbmRleCBvZiB0aGUgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhSVAgICAgOjogVGhlIG5ldyBJUCBhZGRyZXNzIGluIHRoZSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9Cb29sCi0gIEluc19Hb3RvX0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgYVJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBhSVAgKQotICB7Ci0gICAgVFRfQ29kZVJhbmdlKiAgcmFuZ2U7Ci0KLQotICAgIGlmICggYVJhbmdlIDwgMSB8fCBhUmFuZ2UgPiAzICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgcmFuZ2UgPSAmZXhjLT5jb2RlUmFuZ2VUYWJsZVthUmFuZ2UgLSAxXTsKLQotICAgIGlmICggIXJhbmdlLT5iYXNlICkgICAgIC8qIGludmFsaWQgY29kZXJhbmdlICovCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0NvZGVSYW5nZSApOwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgLyogTk9URTogQmVjYXVzZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiBhIHByb2dyYW0gbWF5IGJlIGEgQ0FMTCAqLwotICAgIC8qICAgICAgIHdoaWNoIHdpbGwgcmV0dXJuIHRvIHRoZSBmaXJzdCBieXRlICphZnRlciogdGhlIGNvZGUgICAgKi8KLSAgICAvKiAgICAgICByYW5nZSwgd2UgdGVzdCBmb3IgYUlQIDw9IFNpemUsIGluc3RlYWQgb2YgYUlQIDwgU2l6ZS4gICovCi0KLSAgICBpZiAoIGFJUCA+IHJhbmdlLT5zaXplICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIENvZGVfT3ZlcmZsb3cgKTsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIGV4Yy0+Y29kZSAgICAgPSByYW5nZS0+YmFzZTsKLSAgICBleGMtPmNvZGVTaXplID0gcmFuZ2UtPnNpemU7Ci0gICAgZXhjLT5JUCAgICAgICA9IGFJUDsKLSAgICBleGMtPmN1clJhbmdlID0gYVJhbmdlOwotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpcmVjdF9Nb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vdmVzIGEgcG9pbnQgYnkgYSBnaXZlbiBkaXN0YW5jZSBhbG9uZyB0aGUgZnJlZWRvbSB2ZWN0b3IuICBUaGUgICAqLwotICAvKiAgICBwb2ludCB3aWxsIGJlIGB0b3VjaGVkJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludCAgICA6OiBUaGUgaW5kZXggb2YgdGhlIHBvaW50IHRvIG1vdmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlIDo6IFRoZSBkaXN0YW5jZSB0byBhcHBseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHpvbmUgICAgIDo6IFRoZSBhZmZlY3RlZCBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBgdHRpbnRlcnAuaCcgZm9yIGRldGFpbHMgb24gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlLiAgICAgICAqLwotICAvKiAgICBgVG91Y2hlcycgdGhlIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIERpcmVjdF9Nb3ZlKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCi0gICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UgKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdjsKLQotCi0gICAgdiA9IGV4Yy0+R1MuZnJlZVZlY3Rvci54OwotCi0gICAgaWYgKCB2ICE9IDAgKQotICAgIHsKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCAhZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxMT1dfWF9ETU9WRSApICkgKQotICAgICAgICB6b25lLT5jdXJbcG9pbnRdLnggPSBBRERfTE9ORyggem9uZS0+Y3VyW3BvaW50XS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5GX2RvdF9QICkgKTsKLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAgIC8qIEV4Y2VwdGlvbiB0byB0aGUgcG9zdC1JVVAgY3VyZmV3OiBBbGxvdyB0aGUgeCBjb21wb25lbnQgb2YgKi8KLSAgICAgIC8qIGRpYWdvbmFsIG1vdmVzLCBidXQgb25seSBwb3N0LUlVUC4gIERlamFWdSB0cmllcyB0byBhZGp1c3QgKi8KLSAgICAgIC8qIGRpYWdvbmFsIHN0ZW1zIGxpa2Ugb24gYFonIGFuZCBgeicgcG9zdC1JVVAuICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19NSU5JTUFMICYmICFleGMtPmJhY2t3YXJkX2NvbXBhdGliaWxpdHkgKQotICAgICAgICB6b25lLT5jdXJbcG9pbnRdLnggPSBBRERfTE9ORyggem9uZS0+Y3VyW3BvaW50XS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5GX2RvdF9QICkgKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCi0gICAgICBpZiAoIE5PX1NVQlBJWEVMX0hJTlRJTkcgKQotICAgICAgICB6b25lLT5jdXJbcG9pbnRdLnggPSBBRERfTE9ORyggem9uZS0+Y3VyW3BvaW50XS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5GX2RvdF9QICkgKTsKLQotICAgICAgem9uZS0+dGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1g7Ci0gICAgfQotCi0gICAgdiA9IGV4Yy0+R1MuZnJlZVZlY3Rvci55OwotCi0gICAgaWYgKCB2ICE9IDAgKQotICAgIHsKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgICAgaWYgKCAhKCBTVUJQSVhFTF9ISU5USU5HX01JTklNQUwgICAgJiYKLSAgICAgICAgICAgICAgZXhjLT5iYWNrd2FyZF9jb21wYXRpYmlsaXR5ICYmCi0gICAgICAgICAgICAgIGV4Yy0+aXVweF9jYWxsZWQgICAgICAgICAgICAmJgotICAgICAgICAgICAgICBleGMtPml1cHlfY2FsbGVkICAgICAgICAgICAgKSApCi0jZW5kaWYKLSAgICAgICAgem9uZS0+Y3VyW3BvaW50XS55ID0gQUREX0xPTkcoIHpvbmUtPmN1cltwb2ludF0ueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+Rl9kb3RfUCApICk7Ci0KLSAgICAgIHpvbmUtPnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlyZWN0X01vdmVfT3JpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTW92ZXMgdGhlICpvcmlnaW5hbCogcG9zaXRpb24gb2YgYSBwb2ludCBieSBhIGdpdmVuIGRpc3RhbmNlIGFsb25nICovCi0gIC8qICAgIHRoZSBmcmVlZG9tIHZlY3Rvci4gIE9idmlvdXNseSwgdGhlIHBvaW50IHdpbGwgbm90IGJlIGB0b3VjaGVkJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvaW50ICAgIDo6IFRoZSBpbmRleCBvZiB0aGUgcG9pbnQgdG8gbW92ZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgOjogVGhlIGRpc3RhbmNlIHRvIGFwcGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgem9uZSAgICAgOjogVGhlIGFmZmVjdGVkIGdseXBoIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZV9PcmlnKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaFpvbmUgICAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UgKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdjsKLQotCi0gICAgdiA9IGV4Yy0+R1MuZnJlZVZlY3Rvci54OwotCi0gICAgaWYgKCB2ICE9IDAgKQotICAgICAgem9uZS0+b3JnW3BvaW50XS54ID0gQUREX0xPTkcoIHpvbmUtPm9yZ1twb2ludF0ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+Rl9kb3RfUCApICk7Ci0KLSAgICB2ID0gZXhjLT5HUy5mcmVlVmVjdG9yLnk7Ci0KLSAgICBpZiAoIHYgIT0gMCApCi0gICAgICB6b25lLT5vcmdbcG9pbnRdLnkgPSBBRERfTE9ORyggem9uZS0+b3JnW3BvaW50XS55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5GX2RvdF9QICkgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTcGVjaWFsIHZlcnNpb25zIG9mIERpcmVjdF9Nb3ZlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIGZvbGxvd2luZyB2ZXJzaW9ucyBhcmUgdXNlZCB3aGVuZXZlciBib3RoIHZlY3RvcnMgYXJlIGJvdGggICAgICAqLwotICAvKiAgIGFsb25nIG9uZSBvZiB0aGUgY29vcmRpbmF0ZSB1bml0IHZlY3RvcnMsIGkuZS4gaW4gOTAlIG9mIHRoZSBjYXNlcy4gKi8KLSAgLyogICBTZWUgYHR0aW50ZXJwLmgnIGZvciBkZXRhaWxzIG9uIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIERpcmVjdF9Nb3ZlX1goIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgICB6b25lLAotICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApCi0gIHsKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICYmICFleGMtPmlnbm9yZV94X21vZGUgKQotICAgICAgem9uZS0+Y3VyW3BvaW50XS54ID0gQUREX0xPTkcoIHpvbmUtPmN1cltwb2ludF0ueCwgZGlzdGFuY2UgKTsKLSAgICBlbHNlCi0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX01JTklNQUwgJiYgIWV4Yy0+YmFja3dhcmRfY29tcGF0aWJpbGl0eSApCi0gICAgICB6b25lLT5jdXJbcG9pbnRdLnggPSBBRERfTE9ORyggem9uZS0+Y3VyW3BvaW50XS54LCBkaXN0YW5jZSApOwotICAgIGVsc2UKLSNlbmRpZgotCi0gICAgaWYgKCBOT19TVUJQSVhFTF9ISU5USU5HICkKLSAgICAgIHpvbmUtPmN1cltwb2ludF0ueCA9IEFERF9MT05HKCB6b25lLT5jdXJbcG9pbnRdLngsIGRpc3RhbmNlICk7Ci0KLSAgICB6b25lLT50YWdzW3BvaW50XSAgfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1g7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIERpcmVjdF9Nb3ZlX1koIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgICB6b25lLAotICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICBpZiAoICEoIFNVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTCAgICAgICAgICAgICAmJgotICAgICAgICAgICAgZXhjLT5iYWNrd2FyZF9jb21wYXRpYmlsaXR5ICAgICAgICAgICYmCi0gICAgICAgICAgICBleGMtPml1cHhfY2FsbGVkICYmIGV4Yy0+aXVweV9jYWxsZWQgKSApCi0jZW5kaWYKLSAgICAgIHpvbmUtPmN1cltwb2ludF0ueSA9IEFERF9MT05HKCB6b25lLT5jdXJbcG9pbnRdLnksIGRpc3RhbmNlICk7Ci0KLSAgICB6b25lLT50YWdzW3BvaW50XSB8PSBGVF9DVVJWRV9UQUdfVE9VQ0hfWTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTcGVjaWFsIHZlcnNpb25zIG9mIERpcmVjdF9Nb3ZlX09yaWcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIGZvbGxvd2luZyB2ZXJzaW9ucyBhcmUgdXNlZCB3aGVuZXZlciBib3RoIHZlY3RvcnMgYXJlIGJvdGggICAgICAqLwotICAvKiAgIGFsb25nIG9uZSBvZiB0aGUgY29vcmRpbmF0ZSB1bml0IHZlY3RvcnMsIGkuZS4gaW4gOTAlIG9mIHRoZSBjYXNlcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgRGlyZWN0X01vdmVfT3JpZ19YKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgICB6b25lLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBleGMgKTsKLQotICAgIHpvbmUtPm9yZ1twb2ludF0ueCA9IEFERF9MT05HKCB6b25lLT5vcmdbcG9pbnRdLngsIGRpc3RhbmNlICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIERpcmVjdF9Nb3ZlX09yaWdfWSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaFpvbmUgICAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlICkKLSAgewotICAgIEZUX1VOVVNFRCggZXhjICk7Ci0KLSAgICB6b25lLT5vcmdbcG9pbnRdLnkgPSBBRERfTE9ORyggem9uZS0+b3JnW3BvaW50XS55LCBkaXN0YW5jZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZF9Ob25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb2VzIG5vdCByb3VuZCwgYnV0IGFkZHMgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIChub3QpIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXBlbnNhdGlvbiA6OiBUaGUgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjb21wZW5zYXRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIHNheXMgdmVyeSBmZXcgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCAgICAqLwotICAvKiAgICBiZXR3ZWVuIHJvdW5kaW5nIGFuZCBlbmdpbmUgY29tcGVuc2F0aW9uLiAgSG93ZXZlciwgaXQgc2VlbXMgZnJvbSAgKi8KLSAgLyogICAgdGhlIGRlc2NyaXB0aW9uIG9mIHN1cGVyIHJvdW5kIHRoYXQgd2Ugc2hvdWxkIGFkZCB0aGUgY29tcGVuc2F0aW9uICovCi0gIC8qICAgIGJlZm9yZSByb3VuZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfTm9uZSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHZhbDsKLQotICAgIEZUX1VOVVNFRCggZXhjICk7Ci0KLQotICAgIGlmICggZGlzdGFuY2UgPj0gMCApCi0gICAgewotICAgICAgdmFsID0gQUREX0xPTkcoIGRpc3RhbmNlLCBjb21wZW5zYXRpb24gKTsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSBTVUJfTE9ORyggZGlzdGFuY2UsIGNvbXBlbnNhdGlvbiApOwotICAgICAgaWYgKCB2YWwgPiAwICkKLSAgICAgICAgdmFsID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfVG9fR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRzIHZhbHVlIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFJvdW5kX1RvX0dyaWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICB2YWw7Ci0KLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9IEZUX1BJWF9ST1VORF9MT05HKCBBRERfTE9ORyggZGlzdGFuY2UsIGNvbXBlbnNhdGlvbiApICk7Ci0gICAgICBpZiAoIHZhbCA8IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gTkVHX0xPTkcoIEZUX1BJWF9ST1VORF9MT05HKCBTVUJfTE9ORyggY29tcGVuc2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgKSApICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1RvX0hhbGZfR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSB0byBoYWxmIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Ub19IYWxmX0dyaWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0gICAgRlRfVU5VU0VEKCBleGMgKTsKLQotCi0gICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKLSAgICB7Ci0gICAgICB2YWwgPSBBRERfTE9ORyggRlRfUElYX0ZMT09SKCBBRERfTE9ORyggZGlzdGFuY2UsIGNvbXBlbnNhdGlvbiApICksCi0gICAgICAgICAgICAgICAgICAgICAgMzIgKTsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gTkVHX0xPTkcoIEFERF9MT05HKCBGVF9QSVhfRkxPT1IoIFNVQl9MT05HKCBjb21wZW5zYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlICkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgKSApOwotICAgICAgaWYgKCB2YWwgPiAwICkKLSAgICAgICAgdmFsID0gLTMyOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX0Rvd25fVG9fR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSBkb3duIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Eb3duX1RvX0dyaWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0gICAgRlRfVU5VU0VEKCBleGMgKTsKLQotCi0gICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKLSAgICB7Ci0gICAgICB2YWwgPSBGVF9QSVhfRkxPT1IoIEFERF9MT05HKCBkaXN0YW5jZSwgY29tcGVuc2F0aW9uICkgKTsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSBORUdfTE9ORyggRlRfUElYX0ZMT09SKCBTVUJfTE9ORyggY29tcGVuc2F0aW9uLCBkaXN0YW5jZSApICkgKTsKLSAgICAgIGlmICggdmFsID4gMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfVXBfVG9fR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRzIHZhbHVlIHVwIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFJvdW5kX1VwX1RvX0dyaWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICB2YWw7Ci0KLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9IEZUX1BJWF9DRUlMX0xPTkcoIEFERF9MT05HKCBkaXN0YW5jZSwgY29tcGVuc2F0aW9uICkgKTsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSBORUdfTE9ORyggRlRfUElYX0NFSUxfTE9ORyggU1VCX0xPTkcoIGNvbXBlbnNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgKSApICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1RvX0RvdWJsZV9HcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSB0byBkb3VibGUgZ3JpZCBhZnRlciBhZGRpbmcgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Ub19Eb3VibGVfR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0gICAgRlRfVU5VU0VEKCBleGMgKTsKLQotCi0gICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKLSAgICB7Ci0gICAgICB2YWwgPSBGVF9QQURfUk9VTkRfTE9ORyggQUREX0xPTkcoIGRpc3RhbmNlLCBjb21wZW5zYXRpb24gKSwgMzIgKTsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSBORUdfTE9ORyggRlRfUEFEX1JPVU5EX0xPTkcoIFNVQl9MT05HKCBjb21wZW5zYXRpb24sIGRpc3RhbmNlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyICkgKTsKLSAgICAgIGlmICggdmFsID4gMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfU3VwZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3VwZXItcm91bmRzIHZhbHVlIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBzYXlzIHZlcnkgbGl0dGxlIGFib3V0IHRoZSByZWxhdGlvbnNoaXAgKi8KLSAgLyogICAgYmV0d2VlbiByb3VuZGluZyBhbmQgZW5naW5lIGNvbXBlbnNhdGlvbi4gIEhvd2V2ZXIsIGl0IHNlZW1zIGZyb20gICovCi0gIC8qICAgIHRoZSBkZXNjcmlwdGlvbiBvZiBzdXBlciByb3VuZCB0aGF0IHdlIHNob3VsZCBhZGQgdGhlIGNvbXBlbnNhdGlvbiAqLwotICAvKiAgICBiZWZvcmUgcm91bmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFJvdW5kX1N1cGVyKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICB2YWw7Ci0KLQotICAgIGlmICggZGlzdGFuY2UgPj0gMCApCi0gICAgewotICAgICAgdmFsID0gQUREX0xPTkcoIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dGhyZXNob2xkIC0gZXhjLT5waGFzZSArIGNvbXBlbnNhdGlvbiApICYKLSAgICAgICAgICAgICAgLWV4Yy0+cGVyaW9kOwotICAgICAgdmFsICs9IGV4Yy0+cGhhc2U7Ci0gICAgICBpZiAoIHZhbCA8IDAgKQotICAgICAgICB2YWwgPSBleGMtPnBoYXNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gTkVHX0xPTkcoIFNVQl9MT05HKCBleGMtPnRocmVzaG9sZCAtIGV4Yy0+cGhhc2UgKyBjb21wZW5zYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlICkgJgotICAgICAgICAgICAgICAgICAgICAgICAgLWV4Yy0+cGVyaW9kICk7Ci0gICAgICB2YWwgLT0gZXhjLT5waGFzZTsKLSAgICAgIGlmICggdmFsID4gMCApCi0gICAgICAgIHZhbCA9IC1leGMtPnBoYXNlOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1N1cGVyXzQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFN1cGVyLXJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlcmUgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBmb3IgUm91bmRfU3VwZXJfNDUoKSBhcyB3ZSBtYXkgbmVlZCAgICovCi0gIC8qICAgIGdyZWF0ZXIgcHJlY2lzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfU3VwZXJfNDUoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHZhbDsKLQotCi0gICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKLSAgICB7Ci0gICAgICB2YWwgPSAoIEFERF9MT05HKCBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dGhyZXNob2xkIC0gZXhjLT5waGFzZSArIGNvbXBlbnNhdGlvbiApIC8KLSAgICAgICAgICAgICAgICBleGMtPnBlcmlvZCApICogZXhjLT5wZXJpb2Q7Ci0gICAgICB2YWwgKz0gZXhjLT5waGFzZTsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IGV4Yy0+cGhhc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSBORUdfTE9ORyggKCBTVUJfTE9ORyggZXhjLT50aHJlc2hvbGQgLSBleGMtPnBoYXNlICsgY29tcGVuc2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlICkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnBlcmlvZCApICogZXhjLT5wZXJpb2QgKTsKLSAgICAgIHZhbCAtPSBleGMtPnBoYXNlOwotICAgICAgaWYgKCB2YWwgPiAwICkKLSAgICAgICAgdmFsID0gLWV4Yy0+cGhhc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZV9Sb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0cyB0aGUgcm91bmRpbmcgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm91bmRfbW9kZSA6OiBUaGUgcm91bmRpbmcgbW9kZSB0byBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBDb21wdXRlX1JvdW5kKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICBGVF9CeXRlICAgICAgICAgcm91bmRfbW9kZSApCi0gIHsKLSAgICBzd2l0Y2ggKCByb3VuZF9tb2RlICkKLSAgICB7Ci0gICAgY2FzZSBUVF9Sb3VuZF9PZmY6Ci0gICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ob25lOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRUX1JvdW5kX1RvX0dyaWQ6Ci0gICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19HcmlkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRUX1JvdW5kX1VwX1RvX0dyaWQ6Ci0gICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9VcF9Ub19HcmlkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRUX1JvdW5kX0Rvd25fVG9fR3JpZDoKLSAgICAgIGV4Yy0+ZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX0Rvd25fVG9fR3JpZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQ6Ci0gICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19IYWxmX0dyaWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFRfUm91bmRfVG9fRG91YmxlX0dyaWQ6Ci0gICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19Eb3VibGVfR3JpZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9TdXBlcjoKLSAgICAgIGV4Yy0+ZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1N1cGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRUX1JvdW5kX1N1cGVyXzQ1OgotICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXJfNDU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldFN1cGVyUm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldHMgU3VwZXIgUm91bmQgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdyaWRQZXJpb2QgOjogVGhlIGdyaWQgcGVyaW9kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2VsZWN0b3IgICA6OiBUaGUgU1JPVU5EIG9wY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBTZXRTdXBlclJvdW5kKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICBGVF9GMkRvdDE0ICAgICAgR3JpZFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIHNlbGVjdG9yICkKLSAgewotICAgIHN3aXRjaCAoIChGVF9JbnQpKCBzZWxlY3RvciAmIDB4QzAgKSApCi0gICAgewotICAgICAgY2FzZSAwOgotICAgICAgICBleGMtPnBlcmlvZCA9IEdyaWRQZXJpb2QgLyAyOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAweDQwOgotICAgICAgICBleGMtPnBlcmlvZCA9IEdyaWRQZXJpb2Q7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDB4ODA6Ci0gICAgICAgIGV4Yy0+cGVyaW9kID0gR3JpZFBlcmlvZCAqIDI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGlzIG9wY29kZSBpcyByZXNlcnZlZCwgYnV0Li4uICovCi0gICAgICBjYXNlIDB4QzA6Ci0gICAgICAgIGV4Yy0+cGVyaW9kID0gR3JpZFBlcmlvZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoICggKEZUX0ludCkoIHNlbGVjdG9yICYgMHgzMCApICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZXhjLT5waGFzZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgxMDoKLSAgICAgIGV4Yy0+cGhhc2UgPSBleGMtPnBlcmlvZCAvIDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgyMDoKLSAgICAgIGV4Yy0+cGhhc2UgPSBleGMtPnBlcmlvZCAvIDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgzMDoKLSAgICAgIGV4Yy0+cGhhc2UgPSBleGMtPnBlcmlvZCAqIDMgLyA0OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCAoIHNlbGVjdG9yICYgMHgwRiApID09IDAgKQotICAgICAgZXhjLT50aHJlc2hvbGQgPSBleGMtPnBlcmlvZCAtIDE7Ci0gICAgZWxzZQotICAgICAgZXhjLT50aHJlc2hvbGQgPSAoIChGVF9JbnQpKCBzZWxlY3RvciAmIDB4MEYgKSAtIDQgKSAqIGV4Yy0+cGVyaW9kIC8gODsKLQotICAgIC8qIGNvbnZlcnQgdG8gRjI2RG90NiBmb3JtYXQgKi8KLSAgICBleGMtPnBlcmlvZCAgICA+Pj0gODsKLSAgICBleGMtPnBoYXNlICAgICA+Pj0gODsKLSAgICBleGMtPnRocmVzaG9sZCA+Pj0gODsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgICAgICovCi0gIC8qICAgIGN1cnJlbnQgcHJvamVjdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFByb2plY3QoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKLSAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR5ICkKLSAgewotICAgIHJldHVybiBUVF9Eb3RGaXgxNCggZHgsIGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5wcm9qVmVjdG9yLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEdWFsX1Byb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgKi8KLSAgLyogICAgY3VycmVudCBkdWFsIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdjEgOjogRmlyc3QgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYyIDo6IFNlY29uZCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgRHVhbF9Qcm9qZWN0KCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKLSAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHkgKQotICB7Ci0gICAgcmV0dXJuIFRUX0RvdEZpeDE0KCBkeCwgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmR1YWxWZWN0b3IueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZHVhbFZlY3Rvci55ICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFByb2plY3RfeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGVzIHRoZSBwcm9qZWN0aW9uIG9mIHRoZSB2ZWN0b3IgZ2l2ZW4gYnkgKHYyLXYxKSBhbG9uZyB0aGUgICAqLwotICAvKiAgICBob3Jpem9udGFsIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MSA6OiBGaXJzdCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdjIgOjogU2Vjb25kIGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRpc3RhbmNlIGluIEYyNmRvdDYgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBQcm9qZWN0X3goIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR4LAotICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotICAgIEZUX1VOVVNFRCggZHkgKTsKLQotICAgIHJldHVybiBkeDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJvamVjdF95ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdGhlIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICovCi0gIC8qICAgIHZlcnRpY2FsIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFByb2plY3RfeSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHgsCi0gICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR5ICkKLSAgewotICAgIEZUX1VOVVNFRCggZXhjICk7Ci0gICAgRlRfVU5VU0VEKCBkeCApOwotCi0gICAgcmV0dXJuIGR5OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBhbmQgbW92ZW1lbnQgZnVuY3Rpb24gcG9pbnRlcnMgYWNjb3JkaW5nICAgKi8KLSAgLyogICAgdG8gdGhlIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBDb21wdXRlX0Z1bmNzKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnggPT0gMHg0MDAwICkKLSAgICAgIGV4Yy0+Rl9kb3RfUCA9IGV4Yy0+R1MucHJvalZlY3Rvci54OwotICAgIGVsc2UgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSA9PSAweDQwMDAgKQotICAgICAgZXhjLT5GX2RvdF9QID0gZXhjLT5HUy5wcm9qVmVjdG9yLnk7Ci0gICAgZWxzZQotICAgICAgZXhjLT5GX2RvdF9QID0KLSAgICAgICAgKCAoRlRfTG9uZylleGMtPkdTLnByb2pWZWN0b3IueCAqIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICsKLSAgICAgICAgICAoRlRfTG9uZylleGMtPkdTLnByb2pWZWN0b3IueSAqIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICkgPj4gMTQ7Ci0KLSAgICBpZiAoIGV4Yy0+R1MucHJvalZlY3Rvci54ID09IDB4NDAwMCApCi0gICAgICBleGMtPmZ1bmNfcHJvamVjdCA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF94OwotICAgIGVsc2UgaWYgKCBleGMtPkdTLnByb2pWZWN0b3IueSA9PSAweDQwMDAgKQotICAgICAgZXhjLT5mdW5jX3Byb2plY3QgPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeTsKLSAgICBlbHNlCi0gICAgICBleGMtPmZ1bmNfcHJvamVjdCA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdDsKLQotICAgIGlmICggZXhjLT5HUy5kdWFsVmVjdG9yLnggPT0gMHg0MDAwICkKLSAgICAgIGV4Yy0+ZnVuY19kdWFscHJvaiA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF94OwotICAgIGVsc2UgaWYgKCBleGMtPkdTLmR1YWxWZWN0b3IueSA9PSAweDQwMDAgKQotICAgICAgZXhjLT5mdW5jX2R1YWxwcm9qID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0X3k7Ci0gICAgZWxzZQotICAgICAgZXhjLT5mdW5jX2R1YWxwcm9qID0gKFRUX1Byb2plY3RfRnVuYylEdWFsX1Byb2plY3Q7Ci0KLSAgICBleGMtPmZ1bmNfbW92ZSAgICAgID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZTsKLSAgICBleGMtPmZ1bmNfbW92ZV9vcmlnID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9PcmlnOwotCi0gICAgaWYgKCBleGMtPkZfZG90X1AgPT0gMHg0MDAwTCApCi0gICAgewotICAgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueCA9PSAweDQwMDAgKQotICAgICAgewotICAgICAgICBleGMtPmZ1bmNfbW92ZSAgICAgID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9YOwotICAgICAgICBleGMtPmZ1bmNfbW92ZV9vcmlnID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9PcmlnX1g7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgPT0gMHg0MDAwICkKLSAgICAgIHsKLSAgICAgICAgZXhjLT5mdW5jX21vdmUgICAgICA9IChUVF9Nb3ZlX0Z1bmMpRGlyZWN0X01vdmVfWTsKLSAgICAgICAgZXhjLT5mdW5jX21vdmVfb3JpZyA9IChUVF9Nb3ZlX0Z1bmMpRGlyZWN0X01vdmVfT3JpZ19ZOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGF0IHNtYWxsIHNpemVzLCBGX2RvdF9QIGNhbiBiZWNvbWUgdG9vIHNtYWxsLCByZXN1bHRpbmcgICAqLwotICAgIC8qIGluIG92ZXJmbG93cyBhbmQgYHNwaWtlcycgaW4gYSBudW1iZXIgb2YgZ2x5cGhzIGxpa2UgYHcnLiAqLwotCi0gICAgaWYgKCBGVF9BQlMoIGV4Yy0+Rl9kb3RfUCApIDwgMHg0MDBMICkKLSAgICAgIGV4Yy0+Rl9kb3RfUCA9IDB4NDAwMEw7Ci0KLSAgICAvKiBEaXNhYmxlIGNhY2hlZCBhc3BlY3QgcmF0aW8gKi8KLSAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3JtYWxpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3JtcyBhIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBWeCA6OiBUaGUgaG9yaXpvbnRhbCBpbnB1dCB2ZWN0b3IgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVnkgOjogVGhlIHZlcnRpY2FsIGlucHV0IHZlY3RvciBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUiAgOjogVGhlIG5vcm1lZCB1bml0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJucyBGQUlMVVJFIGlmIGEgdmVjdG9yIHBhcmFtZXRlciBpcyB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gY2FzZSBWeCBhbmQgVnkgYXJlIGJvdGggemVybywgYE5vcm1hbGl6ZScgcmV0dXJucyBTVUNDRVNTLCBhbmQgICovCi0gIC8qICAgIFIgaXMgdW5kZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Jvb2wKLSAgTm9ybWFsaXplKCBGVF9GMjZEb3Q2ICAgICAgVngsCi0gICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIFZ5LAotICAgICAgICAgICAgIEZUX1VuaXRWZWN0b3IqICBSICkKLSAgewotICAgIEZUX1ZlY3RvciBWOwotCi0KLSAgICBpZiAoIFZ4ID09IDAgJiYgVnkgPT0gMCApCi0gICAgewotICAgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIEl0IHNlZW1zIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gdHJ5ICAgKi8KLSAgICAgIC8qICAgICAgdG8gbm9ybWFsaXplIHRoZSB2ZWN0b3IgKDAsMCkuICBSZXR1cm4gaW1tZWRpYXRlbHkuICovCi0gICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICB9Ci0KLSAgICBWLnggPSBWeDsKLSAgICBWLnkgPSBWeTsKLQotICAgIEZUX1ZlY3Rvcl9Ob3JtTGVuKCAmViApOwotCi0gICAgUi0+eCA9IChGVF9GMkRvdDE0KSggVi54IC8gNCApOwotICAgIFItPnkgPSAoRlRfRjJEb3QxNCkoIFYueSAvIDQgKTsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhlcmUgd2Ugc3RhcnQgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhcmlvdXMgb3Bjb2Rlcy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBBUlJBWV9CT1VORF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOyBcCi0gICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlICgwKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNUFBFTVtdOiAgICAgIE1lYXN1cmUgUGl4ZWwgUGVyIEVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IEV1aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01QUEVNKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBleGMtPmZ1bmNfY3VyX3BwZW0oIGV4YyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1QU1tdOiAgICAgICAgTWVhc3VyZSBQb2ludCBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gRXVpbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTVBTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBpZiAoIE5PX1NVQlBJWEVMX0hJTlRJTkcgKQotICAgIHsKLSAgICAgIC8qIE1pY3Jvc29mdCdzIEdESSBieXRlY29kZSBpbnRlcnByZXRlciBhbHdheXMgcmV0dXJucyB2YWx1ZSAxMjsgKi8KLSAgICAgIC8qIHdlIHJldHVybiB0aGUgY3VycmVudCBQUEVNIHZhbHVlIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGFyZ3NbMF0gPSBleGMtPmZ1bmNfY3VyX3BwZW0oIGV4YyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogQSBwb3NzaWJsZSBwcmFjdGljYWwgYXBwbGljYXRpb24gb2YgdGhlIE1QUyBpbnN0cnVjdGlvbiBpcyB0byAgICovCi0gICAgICAvKiBpbXBsZW1lbnQgb3B0aWNhbCBzY2FsaW5nIGFuZCBzaW1pbGFyIGZlYXR1cmVzLCB3aGljaCBzaG91bGQgYmUgKi8KLSAgICAgIC8qIGJhc2VkIG9uIHBlcmNlcHR1YWwgYXR0cmlidXRlcywgdGh1cyBpbmRlcGVuZGVudCBvZiB0aGUgICAgICAgICAqLwotICAgICAgLyogcmVzb2x1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBhcmdzWzBdID0gZXhjLT5wb2ludFNpemU7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERVUFtdOiAgICAgICAgRFVQbGljYXRlIHRoZSBzdGFjaydzIHRvcCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgLS0+IFN0a0VsdCBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRFVQKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzFdID0gYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQT1BbXTogICAgICAgIFBPUCB0aGUgc3RhY2sncyB0b3AgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1BPUCggdm9pZCApCi0gIHsKLSAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0xFQVJbXTogICAgICBDTEVBUiB0aGUgZW50aXJlIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdC4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19DTEVBUiggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBleGMtPm5ld190b3AgPSAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNXQVBbXTogICAgICAgU1dBUCB0aGUgc3RhY2sncyB0b3AgdHdvIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAyICogU3RrRWx0IC0tPiAyICogU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1dBUCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgRlRfTG9uZyAgTDsKLQotCi0gICAgTCAgICAgICA9IGFyZ3NbMF07Ci0gICAgYXJnc1swXSA9IGFyZ3NbMV07Ci0gICAgYXJnc1sxXSA9IEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogREVQVEhbXTogICAgICByZXR1cm4gdGhlIHN0YWNrIERFUFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ERVBUSCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gZXhjLT50b3A7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTFRbXTogICAgICAgICBMZXNzIFRoYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19MVCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9ICggYXJnc1swXSA8IGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMVEVRW106ICAgICAgIExlc3MgVGhhbiBvciBFUXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0xURVEoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gPD0gYXJnc1sxXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEdUW106ICAgICAgICAgR3JlYXRlciBUaGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfR1QoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gPiBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR1RFUVtdOiAgICAgICBHcmVhdGVyIFRoYW4gb3IgRVF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HVEVRKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gKCBhcmdzWzBdID49IGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFUVtdOiAgICAgICAgIEVRdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IFN0a0VsdCAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0VRKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gKCBhcmdzWzBdID09IGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBORVFbXTogICAgICAgIE5vdCBFUXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IFN0a0VsdCAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX05FUSggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9ICggYXJnc1swXSAhPSBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT0REW106ICAgICAgICBJcyBPREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19PREQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSAoICggZXhjLT5mdW5jX3JvdW5kKCBleGMsIGFyZ3NbMF0sIDAgKSAmIDEyNyApID09IDY0ICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRVZFTltdOiAgICAgICBJcyBFVkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19FVkVOKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9ICggKCBleGMtPmZ1bmNfcm91bmQoIGV4YywgYXJnc1swXSwgMCApICYgMTI3ICkgPT0gMCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFORFtdOiAgICAgICAgbG9naWNhbCBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQU5EKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gKCBhcmdzWzBdICYmIGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPUltdOiAgICAgICAgIGxvZ2ljYWwgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX09SKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gKCBhcmdzWzBdIHx8IGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOT1RbXTogICAgICAgIGxvZ2ljYWwgTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX05PVCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9ICFhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFERFtdOiAgICAgICAgQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQUREKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gQUREX0xPTkcoIGFyZ3NbMF0sIGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTVUJbXTogICAgICAgIFNVQnRyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NVQiggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9IFNVQl9MT05HKCBhcmdzWzBdLCBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRElWW106ICAgICAgICBESVZpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ESVYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGlmICggYXJnc1sxXSA9PSAwICkKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggRGl2aWRlX0J5X1plcm8gKTsKLSAgICBlbHNlCi0gICAgICBhcmdzWzBdID0gRlRfTXVsRGl2X05vX1JvdW5kKCBhcmdzWzBdLCA2NEwsIGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNVUxbXTogICAgICAgIE1VTHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01VTCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9IEZUX011bERpdiggYXJnc1swXSwgYXJnc1sxXSwgNjRMICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQUJTW106ICAgICAgICBBQlNvbHV0ZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19BQlMoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGlmICggYXJnc1swXSA8IDAgKQotICAgICAgYXJnc1swXSA9IE5FR19MT05HKCBhcmdzWzBdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTkVHW106ICAgICAgICBORUdhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ORUcoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBORUdfTE9ORyggYXJnc1swXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZMT09SW106ICAgICAgRkxPT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRkxPT1IoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBGVF9QSVhfRkxPT1IoIGFyZ3NbMF0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDRUlMSU5HW106ICAgIENFSUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0NFSUxJTkcoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBGVF9QSVhfQ0VJTCggYXJnc1swXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJTW106ICAgICAgICAgUmVhZCBTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotCi0gICAgaWYgKCBCT1VORFNMKCBJLCBleGMtPnN0b3JlU2l6ZSApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOwotICAgICAgZWxzZQotICAgICAgICBhcmdzWzBdID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgICAgLyogc3VicGl4ZWwgaGludGluZyAtIGF2b2lkIFR5cGVtYW4gRHN0cm9rZSBhbmQgKi8KLSAgICAgIC8qIElTdHJva2UgYW5kIFZhY3Vmb3JtIHJvdW5kcyAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoICggSSA9PSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICggZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyAmCi0gICAgICAgICAgICAgICAgICggU1BIX0ZERUZfU1BBQ0lOR18xIHwKLSAgICAgICAgICAgICAgICAgICBTUEhfRkRFRl9TUEFDSU5HXzIgKSAgICAgICAgICApICkgfHwKLSAgICAgICAgICAgICAoIEkgPT0gMjIgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICggZXhjLT5zcGhfaW5fZnVuY19mbGFncyAgICYKLSAgICAgICAgICAgICAgICAgU1BIX0ZERUZfVFlQRU1BTl9TVFJPS0VTICkgKSAgICAgICAgfHwKLSAgICAgICAgICAgICAoIEkgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAoIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgJgotICAgICAgICAgICAgICAgICBTUEhfRkRFRl9WQUNVRk9STV9ST1VORF8xICAgICAgICkgJiYKLSAgICAgICAgICAgICAgIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICkgKSApCi0gICAgICAgIGFyZ3NbMF0gPSAwOwotICAgICAgZWxzZQotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0gICAgICAgIGFyZ3NbMF0gPSBleGMtPnN0b3JhZ2VbSV07Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdTW106ICAgICAgICAgV3JpdGUgU3RvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfV1MoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotCi0gICAgaWYgKCBCT1VORFNMKCBJLCBleGMtPnN0b3JlU2l6ZSApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBleGMtPnN0b3JhZ2VbSV0gPSBhcmdzWzFdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdDVlRQW106ICAgICAgV3JpdGUgQ1ZUIGluIFBpeGVsIHVuaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfV0NWVFAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotCi0gICAgaWYgKCBCT1VORFNMKCBJLCBleGMtPmN2dFNpemUgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXhjLT5mdW5jX3dyaXRlX2N2dCggZXhjLCBJLCBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV0NWVEZbXTogICAgICBXcml0ZSBDVlQgaW4gRnVuaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19XQ1ZURiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOwotCi0KLSAgICBpZiAoIEJPVU5EU0woIEksIGV4Yy0+Y3Z0U2l6ZSApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBleGMtPmN2dFtJXSA9IEZUX011bEZpeCggYXJnc1sxXSwgZXhjLT50dF9tZXRyaWNzLnNjYWxlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUkNWVFtdOiAgICAgICBSZWFkIENWVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SQ1ZUKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotCi0gICAgaWYgKCBCT1VORFNMKCBJLCBleGMtPmN2dFNpemUgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsKLSAgICAgIGVsc2UKLSAgICAgICAgYXJnc1swXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGFyZ3NbMF0gPSBleGMtPmZ1bmNfcmVhZF9jdnQoIGV4YywgSSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFBW106ICAgICAgICAgQWRqdXN0IEFuZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQUEoIHZvaWQgKQotICB7Ci0gICAgLyogaW50ZW50aW9uYWxseSBubyBsb25nZXIgc3VwcG9ydGVkICovCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogREVCVUdbXTogICAgICBERUJVRy4gIFVuc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0RiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGU6IFRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiBwb3BzIGEgdmFsdWUgZnJvbSB0aGUgc3RhY2suICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0RFQlVHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggRGVidWdfT3BDb2RlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUk9VTkRbYWJdOiAgICBST1VORCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2OC0weDZCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gZXhjLT5mdW5jX3JvdW5kKAotICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICBhcmdzWzBdLAotICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlIC0gMHg2OF0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOUk9VTkRbYWJdOiAgIE5vIFJPVU5EaW5nIG9mIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDZDLTB4NkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX05ST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9IFJvdW5kX05vbmUoCi0gICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgIGFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgLSAweDZDXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1BWFtdOiAgICAgICAgTUFYaW11bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTUFYKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBpZiAoIGFyZ3NbMV0gPiBhcmdzWzBdICkKLSAgICAgIGFyZ3NbMF0gPSBhcmdzWzFdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1JTltdOiAgICAgICAgTUlOaW11bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTUlOKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBpZiAoIGFyZ3NbMV0gPCBhcmdzWzBdICkKLSAgICAgIGFyZ3NbMF0gPSBhcmdzWzFdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1JTkRFWFtdOiAgICAgTW92ZSBJTkRFWGVkIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gLS0+IFN0a0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTUlOREVYKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9Mb25nICBMLCBLOwotCi0KLSAgICBMID0gYXJnc1swXTsKLQotICAgIGlmICggTCA8PSAwIHx8IEwgPiBleGMtPmFyZ3MgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSyA9IGV4Yy0+c3RhY2tbZXhjLT5hcmdzIC0gTF07Ci0KLSAgICAgIEZUX0FSUkFZX01PVkUoICZleGMtPnN0YWNrW2V4Yy0+YXJncyAtIEwgICAgXSwKLSAgICAgICAgICAgICAgICAgICAgICZleGMtPnN0YWNrW2V4Yy0+YXJncyAtIEwgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICggTCAtIDEgKSApOwotCi0gICAgICBleGMtPnN0YWNrW2V4Yy0+YXJncyAtIDFdID0gSzsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0lOREVYW106ICAgICBDb3B5IElOREVYZWQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyIC0tPiBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19DSU5ERVgoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX0xvbmcgIEw7Ci0KLQotICAgIEwgPSBhcmdzWzBdOwotCi0gICAgaWYgKCBMIDw9IDAgfHwgTCA+IGV4Yy0+YXJncyApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBhcmdzWzBdID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYXJnc1swXSA9IGV4Yy0+c3RhY2tbZXhjLT5hcmdzIC0gTF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUk9MTFtdOiAgICAgICBST0xMIHRvcCB0aHJlZSBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4QSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIDMgKiBTdGtFbHQgLS0+IDMgKiBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ST0xMKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBGVF9Mb25nICBBLCBCLCBDOwotCi0KLSAgICBBID0gYXJnc1syXTsKLSAgICBCID0gYXJnc1sxXTsKLSAgICBDID0gYXJnc1swXTsKLQotICAgIGFyZ3NbMl0gPSBDOwotICAgIGFyZ3NbMV0gPSBBOwotICAgIGFyZ3NbMF0gPSBCOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1BTkFHSU5HIFRIRSBGTE9XIE9GIENPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNMT09QW106ICAgICAgU2V0IExPT1AgdmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0xPT1AoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgaWYgKCBhcmdzWzBdIDwgMCApCi0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOwotICAgIGVsc2UKLSAgICAgIGV4Yy0+R1MubG9vcCA9IGFyZ3NbMF07Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIFNraXBDb2RlKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+SVAgKz0gZXhjLT5sZW5ndGg7Ci0KLSAgICBpZiAoIGV4Yy0+SVAgPCBleGMtPmNvZGVTaXplICkKLSAgICB7Ci0gICAgICBleGMtPm9wY29kZSA9IGV4Yy0+Y29kZVtleGMtPklQXTsKLQotICAgICAgZXhjLT5sZW5ndGggPSBvcGNvZGVfbGVuZ3RoW2V4Yy0+b3Bjb2RlXTsKLSAgICAgIGlmICggZXhjLT5sZW5ndGggPCAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPklQICsgMSA+PSBleGMtPmNvZGVTaXplICkKLSAgICAgICAgICBnb3RvIEZhaWxfT3ZlcmZsb3c7Ci0gICAgICAgIGV4Yy0+bGVuZ3RoID0gMiAtIGV4Yy0+bGVuZ3RoICogZXhjLT5jb2RlW2V4Yy0+SVAgKyAxXTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBleGMtPklQICsgZXhjLT5sZW5ndGggPD0gZXhjLT5jb2RlU2l6ZSApCi0gICAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLQotICBGYWlsX092ZXJmbG93OgotICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggQ29kZV9PdmVyZmxvdyApOwotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElGW106ICAgICAgICAgSUYgdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSUYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfSW50ICAgbklmczsKLSAgICBGVF9Cb29sICBPdXQ7Ci0KLQotICAgIGlmICggYXJnc1swXSAhPSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIG5JZnMgPSAxOwotICAgIE91dCA9IDA7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIGlmICggU2tpcENvZGUoIGV4YyApID09IEZBSUxVUkUgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIHN3aXRjaCAoIGV4Yy0+b3Bjb2RlICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMHg1ODogICAgICAvKiBJRiAqLwotICAgICAgICBuSWZzKys7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDB4MUI6ICAgICAgLyogRUxTRSAqLwotICAgICAgICBPdXQgPSBGVF9CT09MKCBuSWZzID09IDEgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg1OTogICAgICAvKiBFSUYgKi8KLSAgICAgICAgbklmcy0tOwotICAgICAgICBPdXQgPSBGVF9CT09MKCBuSWZzID09IDAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoIE91dCA9PSAwICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRUxTRVtdOiAgICAgICBFTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19FTFNFKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIEZUX0ludCAgbklmczsKLQotCi0gICAgbklmcyA9IDE7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIGlmICggU2tpcENvZGUoIGV4YyApID09IEZBSUxVUkUgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIHN3aXRjaCAoIGV4Yy0+b3Bjb2RlICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMHg1ODogICAgLyogSUYgKi8KLSAgICAgICAgbklmcysrOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAweDU5OiAgICAvKiBFSUYgKi8KLSAgICAgICAgbklmcy0tOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IHdoaWxlICggbklmcyAhPSAwICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRUlGW106ICAgICAgICBFbmQgSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19FSUYoIHZvaWQgKQotICB7Ci0gICAgLyogbm90aGluZyB0byBkbyAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEpNUFJbXTogICAgICAgSnVNUCBSZWxhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSk1QUiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGlmICggYXJnc1swXSA9PSAwICYmIGV4Yy0+YXJncyA9PSAwICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV4Yy0+SVAgKz0gYXJnc1swXTsKLSAgICBpZiAoIGV4Yy0+SVAgPCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICggZXhjLT5jYWxsVG9wID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGV4Yy0+SVAgPiBleGMtPmNhbGxTdGFja1tleGMtPmNhbGxUb3AgLSAxXS5EZWYtPmVuZCApICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV4Yy0+c3RlcF9pbnMgPSBGQUxTRTsKLQotICAgIGlmICggYXJnc1swXSA8IDAgKQotICAgIHsKLSAgICAgIGlmICggKytleGMtPm5lZ19qdW1wX2NvdW50ZXIgPiBleGMtPm5lZ19qdW1wX2NvdW50ZXJfbWF4ICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBFeGVjdXRpb25fVG9vX0xvbmcgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSlJPVFtdOiAgICAgICBKdW1wIFJlbGF0aXZlIE9uIFRydWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19KUk9UKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgaWYgKCBhcmdzWzFdICE9IDAgKQotICAgICAgSW5zX0pNUFIoIGV4YywgYXJncyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEpST0ZbXTogICAgICAgSnVtcCBSZWxhdGl2ZSBPbiBGYWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSlJPRiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGlmICggYXJnc1sxXSA9PSAwICkKLSAgICAgIEluc19KTVBSKCBleGMsIGFyZ3MgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBERUZJTklORyBBTkQgVVNJTkcgRlVOQ1RJT05TIEFORCBJTlNUUlVDVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGREVGW106ICAgICAgIEZ1bmN0aW9uIERFRmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0ZERUYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VTG9uZyAgICAgICBuOwotICAgIFRUX0RlZlJlY29yZCogIHJlYzsKLSAgICBUVF9EZWZSZWNvcmQqICBsaW1pdDsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgLyogYXJndW1lbnRzIHRvIG9wY29kZXMgYXJlIHNraXBwZWQgYnkgYFNLSVBfQ29kZScgKi8KLSAgICBGVF9CeXRlICAgIG9wY29kZV9wYXR0ZXJuWzldWzEyXSA9IHsKLSAgICAgICAgICAgICAgICAgLyogIzAgaW5saW5lIGRlbHRhIGZ1bmN0aW9uIDEgKi8KLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIDB4NEIsIC8qIFBQRU0gICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDUzLCAvKiBHVEVRICAgICovCi0gICAgICAgICAgICAgICAgICAgMHgyMywgLyogU1dBUCAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NEIsIC8qIFBQRU0gICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDUxLCAvKiBMVEVRICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg1QSwgLyogQU5EICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NTgsIC8qIElGICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDM4LCAvKiAgIFNIUElYICovCi0gICAgICAgICAgICAgICAgICAgMHgxQiwgLyogRUxTRSAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4MjEsIC8qICAgUE9QICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDIxLCAvKiAgIFBPUCAgICovCi0gICAgICAgICAgICAgICAgICAgMHg1OSAgLyogRUlGICAgICAqLwotICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAvKiAjMSBpbmxpbmUgZGVsdGEgZnVuY3Rpb24gMiAqLwotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgMHg0QiwgLyogUFBFTSAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NTQsIC8qIEVRICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDU4LCAvKiBJRiAgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHgzOCwgLyogICBTSFBJWCAqLwotICAgICAgICAgICAgICAgICAgIDB4MUIsIC8qIEVMU0UgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDIxLCAvKiAgIFBPUCAgICovCi0gICAgICAgICAgICAgICAgICAgMHgyMSwgLyogICBQT1AgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NTkgIC8qIEVJRiAgICAgKi8KLSAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgLyogIzIgZGlhZ29uYWwgc3Ryb2tlIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAweDIwLCAvKiBEVVAgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHgyMCwgLyogRFVQICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4QjAsIC8qIFBVU0hCXzEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDEgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg2MCwgLyogQUREICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NDYsIC8qIEdDX2N1ciAgKi8KLSAgICAgICAgICAgICAgICAgICAweEIwLCAvKiBQVVNIQl8xICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogICA2NCAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4MjMsIC8qIFNXQVAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDQyICAvKiBXUyAgICAgICovCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgIC8qICMzIFZhY3VGb3JtUm91bmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIDB4NDUsIC8qIFJDVlQgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDIzLCAvKiBTV0FQICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg0NiwgLyogR0NfY3VyICAqLwotICAgICAgICAgICAgICAgICAgIDB4NjAsIC8qIEFERCAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDIwLCAvKiBEVVAgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHhCMCAgLyogUFVTSEJfMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMzggICAgKi8KLSAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgLyogIzQgVFRGYXV0b2hpbnQgYnl0ZWNvZGUgKG9sZCkgKi8KLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIDB4MjAsIC8qIERVUCAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDY0LCAvKiBBQlMgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHhCMCwgLyogUFVTSEJfMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMzIgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDYwLCAvKiBBREQgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg2NiwgLyogRkxPT1IgICAqLwotICAgICAgICAgICAgICAgICAgIDB4MjMsIC8qIFNXQVAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweEIwICAvKiBQVVNIQl8xICovCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgIC8qICM1IHNwYWNpbmcgZnVuY3Rpb24gMSAqLwotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgMHgwMSwgLyogU1ZUQ0FfeCAqLwotICAgICAgICAgICAgICAgICAgIDB4QjAsIC8qIFBVU0hCXzEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDI0ICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg0MywgLyogUlMgICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NTggIC8qIElGICAgICAgKi8KLSAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgLyogIzYgc3BhY2luZyBmdW5jdGlvbiAyICovCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAweDAxLCAvKiBTVlRDQV94ICovCi0gICAgICAgICAgICAgICAgICAgMHgxOCwgLyogUlRHICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4QjAsIC8qIFBVU0hCXzEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDI0ICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg0MywgLyogUlMgICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NTggIC8qIElGICAgICAgKi8KLSAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgLyogIzcgVHlwZU1hbiBUYWxrIERpYWdFbmRDdHJsIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAweDAxLCAvKiBTVlRDQV94ICovCi0gICAgICAgICAgICAgICAgICAgMHgyMCwgLyogRFVQICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4QjAsIC8qIFBVU0hCXzEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDMgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHgyNSwgLyogQ0lOREVYICAqLwotICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAvKiAjOCBUeXBlTWFuIFRhbGsgQWxpZ24gKi8KLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIDB4MDYsIC8qIFNQVlRMICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDdELCAvKiBSRFRHICAgICovCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9OwotICAgIEZUX1VTaG9ydCAgb3Bjb2RlX3BhdHRlcm5zICAgPSA5OwotICAgIEZUX1VTaG9ydCAgb3Bjb2RlX3BvaW50ZXJbOV0gPSB7ICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICAgRlRfVVNob3J0ICBvcGNvZGVfc2l6ZVs5XSAgICA9IHsgMTIsIDgsIDgsIDYsIDcsIDQsIDUsIDQsIDIgfTsKLSAgICBGVF9VU2hvcnQgIGk7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotCi0gICAgLyogRkRFRiBpcyBvbmx5IGFsbG93ZWQgaW4gYHByZXAnIG9yIGBmcGdtJyAqLwotICAgIGlmICggZXhjLT5jdXJSYW5nZSA9PSB0dF9jb2RlcmFuZ2VfZ2x5cGggKQotICAgIHsKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggREVGX0luX0dseWZfQnl0ZWNvZGUgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBzb21lIGZvbnQgcHJvZ3JhbXMgYXJlIGJyb2tlbiBlbm91Z2ggdG8gcmVkZWZpbmUgZnVuY3Rpb25zISAqLwotICAgIC8qIFdlIHdpbGwgdGhlbiBwYXJzZSB0aGUgY3VycmVudCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICByZWMgICA9IGV4Yy0+RkRlZnM7Ci0gICAgbGltaXQgPSByZWMgKyBleGMtPm51bUZEZWZzOwotICAgIG4gICAgID0gKEZUX1VMb25nKWFyZ3NbMF07Ci0KLSAgICBmb3IgKCA7IHJlYyA8IGxpbWl0OyByZWMrKyApCi0gICAgewotICAgICAgaWYgKCByZWMtPm9wYyA9PSBuICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCByZWMgPT0gbGltaXQgKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gZm9yIG5ldyBmdW5jdGlvbnMgKi8KLSAgICAgIGlmICggZXhjLT5udW1GRGVmcyA+PSBleGMtPm1heEZEZWZzICkKLSAgICAgIHsKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBUb29fTWFueV9GdW5jdGlvbl9EZWZzICk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGV4Yy0+bnVtRkRlZnMrKzsKLSAgICB9Ci0KLSAgICAvKiBBbHRob3VnaCBGREVGIHRha2VzIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCAgKi8KLSAgICAvKiBmdW5jICMgbXVzdCBiZSB3aXRoaW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgKi8KLSAgICBpZiAoIG4gPiAweEZGRkZVICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19NYW55X0Z1bmN0aW9uX0RlZnMgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZWMtPnJhbmdlICAgICAgICAgID0gZXhjLT5jdXJSYW5nZTsKLSAgICByZWMtPm9wYyAgICAgICAgICAgID0gKEZUX1VJbnQxNiluOwotICAgIHJlYy0+c3RhcnQgICAgICAgICAgPSBleGMtPklQICsgMTsKLSAgICByZWMtPmFjdGl2ZSAgICAgICAgID0gVFJVRTsKLSAgICByZWMtPmlubGluZV9kZWx0YSAgID0gRkFMU0U7Ci0gICAgcmVjLT5zcGhfZmRlZl9mbGFncyA9IDB4MDAwMDsKLQotICAgIGlmICggbiA+IGV4Yy0+bWF4RnVuYyApCi0gICAgICBleGMtPm1heEZ1bmMgPSAoRlRfVUludDE2KW47Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIC8qIFdlIGRvbid0IGtub3cgZm9yIHN1cmUgdGhlc2UgYXJlIHR5cGVtYW4gZnVuY3Rpb25zLCAqLwotICAgIC8qIGhvd2V2ZXIgdGhleSBhcmUgb25seSBhY3RpdmUgd2hlbiBSUyAyMiBpcyBjYWxsZWQgICAqLwotICAgIGlmICggbiA+PSA2NCAmJiBuIDw9IDY2ICkKLSAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgfD0gU1BIX0ZERUZfVFlQRU1BTl9TVFJPS0VTOwotI2VuZGlmCi0KLSAgICAvKiBOb3cgc2tpcCB0aGUgd2hvbGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gKi8KLSAgICAvKiBXZSBkb24ndCBhbGxvdyBuZXN0ZWQgSURFRlMgJiBGREVGcy4gICAgKi8KLQotICAgIHdoaWxlICggU2tpcENvZGUoIGV4YyApID09IFNVQ0NFU1MgKQotICAgIHsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0KLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBvcGNvZGVfcGF0dGVybnM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIG9wY29kZV9wb2ludGVyW2ldIDwgb3Bjb2RlX3NpemVbaV0gICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgZXhjLT5vcGNvZGUgPT0gb3Bjb2RlX3BhdHRlcm5baV1bb3Bjb2RlX3BvaW50ZXJbaV1dICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvcGNvZGVfcG9pbnRlcltpXSArPSAxOwotCi0gICAgICAgICAgICBpZiAoIG9wY29kZV9wb2ludGVyW2ldID09IG9wY29kZV9zaXplW2ldICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfVFJBQ0U2KCggInNwaDogRnVuY3Rpb24gJWQsIG9wY29kZSBwdHJuOiAlZCwgJXMgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGksIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5yb290LnN0eWxlX25hbWUgKSk7Ci0KLSAgICAgICAgICAgICAgc3dpdGNoICggaSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICAgfD0gU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzE7Ci0gICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMjsKLSAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX0lOTElORV9ERUxUQV8yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBuICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBzdGlsbCAqLwotICAgICAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX0RJQUdPTkFMX1NUUk9LRTsKLSAgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfRElBR09OQUxfU1RST0tFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoICggbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICAgfD0gU1BIX0ZERUZfVkFDVUZPUk1fUk9VTkRfMTsKLSAgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfVkFDVUZPUk1fUk9VTkRfMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIC8qIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkgdG8gZGV0ZWN0IGFueW1vcmUgKi8KLSAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX1RURkFVVE9ISU5UXzE7Ci0gICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9UVEZBVVRPSElOVF8xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBuICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX1NQQUNJTkdfMTsKLSAgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfU1BBQ0lOR18xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgc3dpdGNoICggbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9TUEFDSU5HXzI7Ci0gICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1NQQUNJTkdfMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMOwotICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1RZUEVNQU5fRElBR0VORENUUkw7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICBjYXNlIDg6Ci0jaWYgMAotICAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX1RZUEVNQU5fRElBR0VORENUUkw7Ci0gICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfVFlQRU1BTl9ESUFHRU5EQ1RSTDsKLSNlbmRpZgotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBvcGNvZGVfcG9pbnRlcltpXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgb3Bjb2RlX3BvaW50ZXJbaV0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2V0IHNwaF9jb21wYXRpYmlsaXR5X21vZGUgb25seSB3aGVuIGRlbHRhcyBhcmUgZGV0ZWN0ZWQgKi8KLSAgICAgICAgZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlID0KLSAgICAgICAgICAoICggZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8xICkgfAotICAgICAgICAgICAgKCBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzIgKSApOwotICAgICAgfQotCi0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgICAgc3dpdGNoICggZXhjLT5vcGNvZGUgKQotICAgICAgewotICAgICAgY2FzZSAweDg5OiAgICAvKiBJREVGICovCi0gICAgICBjYXNlIDB4MkM6ICAgIC8qIEZERUYgKi8KLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBOZXN0ZWRfREVGUyApOwotICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgMHgyRDogICAvKiBFTkRGICovCi0gICAgICAgIHJlYy0+ZW5kID0gZXhjLT5JUDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFTkRGW106ICAgICAgIEVORCBGdW5jdGlvbiBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0VOREYoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgVFRfQ2FsbFJlYyogIHBSZWM7Ci0KLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgZXhjLT5zcGhfaW5fZnVuY19mbGFncyA9IDB4MDAwMDsKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0gICAgaWYgKCBleGMtPmNhbGxUb3AgPD0gMCApICAgICAvKiBXZSBlbmNvdW50ZXJlZCBhbiBFTkRGIHdpdGhvdXQgYSBjYWxsICovCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBFTkRGX0luX0V4ZWNfU3RyZWFtICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXhjLT5jYWxsVG9wLS07Ci0KLSAgICBwUmVjID0gJmV4Yy0+Y2FsbFN0YWNrW2V4Yy0+Y2FsbFRvcF07Ci0KLSAgICBwUmVjLT5DdXJfQ291bnQtLTsKLQotICAgIGV4Yy0+c3RlcF9pbnMgPSBGQUxTRTsKLQotICAgIGlmICggcFJlYy0+Q3VyX0NvdW50ID4gMCApCi0gICAgewotICAgICAgZXhjLT5jYWxsVG9wKys7Ci0gICAgICBleGMtPklQID0gcFJlYy0+RGVmLT5zdGFydDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgLyogTG9vcCB0aHJvdWdoIHRoZSBjdXJyZW50IGZ1bmN0aW9uICovCi0gICAgICBJbnNfR290b19Db2RlUmFuZ2UoIGV4YywgcFJlYy0+Q2FsbGVyX1JhbmdlLCBwUmVjLT5DYWxsZXJfSVAgKTsKLQotICAgIC8qIEV4aXQgdGhlIGN1cnJlbnQgY2FsbCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIE5PVEU6IElmIHRoZSBsYXN0IGluc3RydWN0aW9uIG9mIGEgcHJvZ3JhbSBpcyBhICAgKi8KLSAgICAvKiAgICAgICBDQUxMIG9yIExPT1BDQUxMLCB0aGUgcmV0dXJuIGFkZHJlc3MgaXMgICAgICovCi0gICAgLyogICAgICAgYWx3YXlzIG91dCBvZiB0aGUgY29kZSByYW5nZS4gIFRoaXMgaXMgYSAgICAqLwotICAgIC8qICAgICAgIHZhbGlkIGFkZHJlc3MsIGFuZCBpdCBpcyB3aHkgd2UgZG8gbm90IHRlc3QgKi8KLSAgICAvKiAgICAgICB0aGUgcmVzdWx0IG9mIEluc19Hb3RvX0NvZGVSYW5nZSgpIGhlcmUhICAgICovCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0FMTFtdOiAgICAgICBDQUxMIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19DQUxMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgICAgICAgRjsKLSAgICBUVF9DYWxsUmVjKiAgICBwQ3JlYzsKLSAgICBUVF9EZWZSZWNvcmQqICBkZWY7Ci0KLQotICAgIC8qIGZpcnN0IG9mIGFsbCwgY2hlY2sgdGhlIGluZGV4ICovCi0KLSAgICBGID0gKEZUX1VMb25nKWFyZ3NbMF07Ci0gICAgaWYgKCBCT1VORFNMKCBGLCBleGMtPm1heEZ1bmMgKyAxICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgLyogRXhjZXB0IGZvciBzb21lIG9sZCBBcHBsZSBmb250cywgYWxsIGZ1bmN0aW9ucyBpbiBhIFRydWVUeXBlICovCi0gICAgLyogZm9udCBhcmUgZGVmaW5lZCBpbiBpbmNyZWFzaW5nIG9yZGVyLCBzdGFydGluZyBmcm9tIDAuICBUaGlzICovCi0gICAgLyogbWVhbnMgdGhhdCB3ZSBub3JtYWxseSBoYXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgZXhjLT5tYXhGdW5jKzEgPT0gZXhjLT5udW1GRGVmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgZXhjLT5GRGVmc1tuXS5vcGMgPT0gbiBmb3IgbiBpbiAwLi5leGMtPm1heEZ1bmMgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSWYgdGhpcyBpc24ndCB0cnVlLCB3ZSBuZWVkIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRhYmxlLiAgICovCi0KLSAgICBkZWYgPSBleGMtPkZEZWZzICsgRjsKLSAgICBpZiAoIGV4Yy0+bWF4RnVuYyArIDEgIT0gZXhjLT5udW1GRGVmcyB8fCBkZWYtPm9wYyAhPSBGICkKLSAgICB7Ci0gICAgICAvKiBsb29rIHVwIHRoZSBGRGVmcyB0YWJsZSAqLwotICAgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQ7Ci0KLQotICAgICAgZGVmICAgPSBleGMtPkZEZWZzOwotICAgICAgbGltaXQgPSBkZWYgKyBleGMtPm51bUZEZWZzOwotCi0gICAgICB3aGlsZSAoIGRlZiA8IGxpbWl0ICYmIGRlZi0+b3BjICE9IEYgKQotICAgICAgICBkZWYrKzsKLQotICAgICAgaWYgKCBkZWYgPT0gbGltaXQgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgdGhhdCB0aGUgZnVuY3Rpb24gaXMgYWN0aXZlICovCi0gICAgaWYgKCAhZGVmLT5hY3RpdmUgKQotICAgICAgZ290byBGYWlsOwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCAoIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9fQ0FMTF9BRlRFUl9JVVAgKSApIHx8Ci0gICAgICAgICAgICggZGVmLT5zcGhfZmRlZl9mbGFncyAmIFNQSF9GREVGX1ZBQ1VGT1JNX1JPVU5EXzEgKSAgICAgICAgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0gICAgZWxzZQotICAgICAgZXhjLT5zcGhfaW5fZnVuY19mbGFncyA9IGRlZi0+c3BoX2ZkZWZfZmxhZ3M7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIC8qIGNoZWNrIHRoZSBjYWxsIHN0YWNrICovCi0gICAgaWYgKCBleGMtPmNhbGxUb3AgPj0gZXhjLT5jYWxsU2l6ZSApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBDcmVjID0gZXhjLT5jYWxsU3RhY2sgKyBleGMtPmNhbGxUb3A7Ci0KLSAgICBwQ3JlYy0+Q2FsbGVyX1JhbmdlID0gZXhjLT5jdXJSYW5nZTsKLSAgICBwQ3JlYy0+Q2FsbGVyX0lQICAgID0gZXhjLT5JUCArIDE7Ci0gICAgcENyZWMtPkN1cl9Db3VudCAgICA9IDE7Ci0gICAgcENyZWMtPkRlZiAgICAgICAgICA9IGRlZjsKLQotICAgIGV4Yy0+Y2FsbFRvcCsrOwotCi0gICAgSW5zX0dvdG9fQ29kZVJhbmdlKCBleGMsIGRlZi0+cmFuZ2UsIGRlZi0+c3RhcnQgKTsKLQotICAgIGV4Yy0+c3RlcF9pbnMgPSBGQUxTRTsKLQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMT09QQ0FMTFtdOiAgIExPT1AgYW5kIENBTEwgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyBFaW50MTY/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0xPT1BDQUxMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICAgICAgIEY7Ci0gICAgVFRfQ2FsbFJlYyogICAgcENyZWM7Ci0gICAgVFRfRGVmUmVjb3JkKiAgZGVmOwotCi0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIGNoZWNrIHRoZSBpbmRleCAqLwotICAgIEYgPSAoRlRfVUxvbmcpYXJnc1sxXTsKLSAgICBpZiAoIEJPVU5EU0woIEYsIGV4Yy0+bWF4RnVuYyArIDEgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBFeGNlcHQgZm9yIHNvbWUgb2xkIEFwcGxlIGZvbnRzLCBhbGwgZnVuY3Rpb25zIGluIGEgVHJ1ZVR5cGUgKi8KLSAgICAvKiBmb250IGFyZSBkZWZpbmVkIGluIGluY3JlYXNpbmcgb3JkZXIsIHN0YXJ0aW5nIGZyb20gMC4gIFRoaXMgKi8KLSAgICAvKiBtZWFucyB0aGF0IHdlIG5vcm1hbGx5IGhhdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBleGMtPm1heEZ1bmMrMSA9PSBleGMtPm51bUZEZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBleGMtPkZEZWZzW25dLm9wYyA9PSBuIGZvciBuIGluIDAuLmV4Yy0+bWF4RnVuYyAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBJZiB0aGlzIGlzbid0IHRydWUsIHdlIG5lZWQgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdGFibGUuICAgKi8KLQotICAgIGRlZiA9IGV4Yy0+RkRlZnMgKyBGOwotICAgIGlmICggZXhjLT5tYXhGdW5jICsgMSAhPSBleGMtPm51bUZEZWZzIHx8IGRlZi0+b3BjICE9IEYgKQotICAgIHsKLSAgICAgIC8qIGxvb2sgdXAgdGhlIEZEZWZzIHRhYmxlICovCi0gICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdDsKLQotCi0gICAgICBkZWYgICA9IGV4Yy0+RkRlZnM7Ci0gICAgICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtRkRlZnM7Ci0KLSAgICAgIHdoaWxlICggZGVmIDwgbGltaXQgJiYgZGVmLT5vcGMgIT0gRiApCi0gICAgICAgIGRlZisrOwotCi0gICAgICBpZiAoIGRlZiA9PSBsaW1pdCApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGF0IHRoZSBmdW5jdGlvbiBpcyBhY3RpdmUgKi8KLSAgICBpZiAoICFkZWYtPmFjdGl2ZSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggZGVmLT5zcGhfZmRlZl9mbGFncyAmIFNQSF9GREVGX1ZBQ1VGT1JNX1JPVU5EXzEgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0gICAgZWxzZQotICAgICAgZXhjLT5zcGhfaW5fZnVuY19mbGFncyA9IGRlZi0+c3BoX2ZkZWZfZmxhZ3M7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIC8qIGNoZWNrIHN0YWNrICovCi0gICAgaWYgKCBleGMtPmNhbGxUb3AgPj0gZXhjLT5jYWxsU2l6ZSApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggYXJnc1swXSA+IDAgKQotICAgIHsKLSAgICAgIHBDcmVjID0gZXhjLT5jYWxsU3RhY2sgKyBleGMtPmNhbGxUb3A7Ci0KLSAgICAgIHBDcmVjLT5DYWxsZXJfUmFuZ2UgPSBleGMtPmN1clJhbmdlOwotICAgICAgcENyZWMtPkNhbGxlcl9JUCAgICA9IGV4Yy0+SVAgKyAxOwotICAgICAgcENyZWMtPkN1cl9Db3VudCAgICA9IChGVF9JbnQpYXJnc1swXTsKLSAgICAgIHBDcmVjLT5EZWYgICAgICAgICAgPSBkZWY7Ci0KLSAgICAgIGV4Yy0+Y2FsbFRvcCsrOwotCi0gICAgICBJbnNfR290b19Db2RlUmFuZ2UoIGV4YywgZGVmLT5yYW5nZSwgZGVmLT5zdGFydCApOwotCi0gICAgICBleGMtPnN0ZXBfaW5zID0gRkFMU0U7Ci0KLSAgICAgIGV4Yy0+bG9vcGNhbGxfY291bnRlciArPSAoRlRfVUxvbmcpYXJnc1swXTsKLSAgICAgIGlmICggZXhjLT5sb29wY2FsbF9jb3VudGVyID4gZXhjLT5sb29wY2FsbF9jb3VudGVyX21heCApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggRXhlY3V0aW9uX1Rvb19Mb25nICk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotCi0gIEZhaWw6Ci0gICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElERUZbXTogICAgICAgSW5zdHJ1Y3Rpb24gREVGaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBFaW50OCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSURFRiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIFRUX0RlZlJlY29yZCogIGRlZjsKLSAgICBUVF9EZWZSZWNvcmQqICBsaW1pdDsKLQotCi0gICAgLyogd2UgZW5hYmxlIElERUYgb25seSBpbiBgcHJlcCcgb3IgYGZwZ20nICovCi0gICAgaWYgKCBleGMtPmN1clJhbmdlID09IHR0X2NvZGVyYW5nZV9nbHlwaCApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBERUZfSW5fR2x5Zl9CeXRlY29kZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qICBGaXJzdCBvZiBhbGwsIGxvb2sgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uIGluIG91ciB0YWJsZSAqLwotCi0gICAgZGVmICAgPSBleGMtPklEZWZzOwotICAgIGxpbWl0ID0gZGVmICsgZXhjLT5udW1JRGVmczsKLQotICAgIGZvciAoIDsgZGVmIDwgbGltaXQ7IGRlZisrICkKLSAgICAgIGlmICggZGVmLT5vcGMgPT0gKEZUX1VMb25nKWFyZ3NbMF0gKQotICAgICAgICBicmVhazsKLQotICAgIGlmICggZGVmID09IGxpbWl0ICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGZvciBhIG5ldyBpbnN0cnVjdGlvbiAqLwotICAgICAgaWYgKCBleGMtPm51bUlEZWZzID49IGV4Yy0+bWF4SURlZnMgKQotICAgICAgewotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19NYW55X0luc3RydWN0aW9uX0RlZnMgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZXhjLT5udW1JRGVmcysrOwotICAgIH0KLQotICAgIC8qIG9wY29kZSBtdXN0IGJlIHVuc2lnbmVkIDgtYml0IGludGVnZXIgKi8KLSAgICBpZiAoIDAgPiBhcmdzWzBdIHx8IGFyZ3NbMF0gPiAweDAwRkYgKQotICAgIHsKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggVG9vX01hbnlfSW5zdHJ1Y3Rpb25fRGVmcyApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRlZi0+b3BjICAgID0gKEZUX0J5dGUpYXJnc1swXTsKLSAgICBkZWYtPnN0YXJ0ICA9IGV4Yy0+SVAgKyAxOwotICAgIGRlZi0+cmFuZ2UgID0gZXhjLT5jdXJSYW5nZTsKLSAgICBkZWYtPmFjdGl2ZSA9IFRSVUU7Ci0KLSAgICBpZiAoIChGVF9VTG9uZylhcmdzWzBdID4gZXhjLT5tYXhJbnMgKQotICAgICAgZXhjLT5tYXhJbnMgPSAoRlRfQnl0ZSlhcmdzWzBdOwotCi0gICAgLyogTm93IHNraXAgdGhlIHdob2xlIGZ1bmN0aW9uIGRlZmluaXRpb24uICovCi0gICAgLyogV2UgZG9uJ3QgYWxsb3cgbmVzdGVkIElERUZzICYgRkRFRnMuICAgICovCi0KLSAgICB3aGlsZSAoIFNraXBDb2RlKCBleGMgKSA9PSBTVUNDRVNTICkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCBleGMtPm9wY29kZSApCi0gICAgICB7Ci0gICAgICBjYXNlIDB4ODk6ICAgLyogSURFRiAqLwotICAgICAgY2FzZSAweDJDOiAgIC8qIEZERUYgKi8KLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBOZXN0ZWRfREVGUyApOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIDB4MkQ6ICAgLyogRU5ERiAqLwotICAgICAgICBkZWYtPmVuZCA9IGV4Yy0+SVA7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUFVTSElORyBEQVRBIE9OVE8gVEhFIElOVEVSUFJFVEVSIFNUQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTlBVU0hCW106ICAgICBQVVNIIE4gQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiB1aW50MzIuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19OUFVTSEIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgTCwgSzsKLQotCi0gICAgTCA9IChGVF9VU2hvcnQpZXhjLT5jb2RlW2V4Yy0+SVAgKyAxXTsKLQotICAgIGlmICggQk9VTkRTKCBMLCBleGMtPnN0YWNrU2l6ZSArIDEgLSBleGMtPnRvcCApICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICggSyA9IDE7IEsgPD0gTDsgSysrICkKLSAgICAgIGFyZ3NbSyAtIDFdID0gZXhjLT5jb2RlW2V4Yy0+SVAgKyBLICsgMV07Ci0KLSAgICBleGMtPm5ld190b3AgKz0gTDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOUFVTSFdbXTogICAgIFBVU0ggTiBXb3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IGludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX05QVVNIVyggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICBMLCBLOwotCi0KLSAgICBMID0gKEZUX1VTaG9ydClleGMtPmNvZGVbZXhjLT5JUCArIDFdOwotCi0gICAgaWYgKCBCT1VORFMoIEwsIGV4Yy0+c3RhY2tTaXplICsgMSAtIGV4Yy0+dG9wICkgKQotICAgIHsKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBleGMtPklQICs9IDI7Ci0KLSAgICBmb3IgKCBLID0gMDsgSyA8IEw7IEsrKyApCi0gICAgICBhcmdzW0tdID0gR2V0U2hvcnRJbnMoIGV4YyApOwotCi0gICAgZXhjLT5zdGVwX2lucyA9IEZBTFNFOwotICAgIGV4Yy0+bmV3X3RvcCArPSBMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFBVU0hCW2FiY106ICAgUFVTSCBCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4QjAtMHhCNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUFVTSEIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICBMLCBLOwotCi0KLSAgICBMID0gKEZUX1VTaG9ydCkoIGV4Yy0+b3Bjb2RlIC0gMHhCMCArIDEgKTsKLQotICAgIGlmICggQk9VTkRTKCBMLCBleGMtPnN0YWNrU2l6ZSArIDEgLSBleGMtPnRvcCApICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICggSyA9IDE7IEsgPD0gTDsgSysrICkKLSAgICAgIGFyZ3NbSyAtIDFdID0gZXhjLT5jb2RlW2V4Yy0+SVAgKyBLXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQVVNIV1thYmNdOiAgIFBVU0ggV29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweEI4LTB4QkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IGludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1BVU0hXKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgTCwgSzsKLQotCi0gICAgTCA9IChGVF9VU2hvcnQpKCBleGMtPm9wY29kZSAtIDB4QjggKyAxICk7Ci0KLSAgICBpZiAoIEJPVU5EUyggTCwgZXhjLT5zdGFja1NpemUgKyAxIC0gZXhjLT50b3AgKSApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV4Yy0+SVArKzsKLQotICAgIGZvciAoIEsgPSAwOyBLIDwgTDsgSysrICkKLSAgICAgIGFyZ3NbS10gPSBHZXRTaG9ydElucyggZXhjICk7Ci0KLSAgICBleGMtPnN0ZXBfaW5zID0gRkFMU0U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUFOQUdJTkcgVEhFIEdSQVBISUNTIFNUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIEluc19TeFZUTCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgYUlkeDEsCi0gICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIGFJZHgyLAotICAgICAgICAgICAgIEZUX1VuaXRWZWN0b3IqICBWZWMgKQotICB7Ci0gICAgRlRfTG9uZyAgICAgQSwgQiwgQzsKLSAgICBGVF9WZWN0b3IqICBwMTsKLSAgICBGVF9WZWN0b3IqICBwMjsKLQotICAgIEZUX0J5dGUgIG9wY29kZSA9IGV4Yy0+b3Bjb2RlOwotCi0KLSAgICBpZiAoIEJPVU5EUyggYUlkeDEsIGV4Yy0+enAyLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggYUlkeDIsIGV4Yy0+enAxLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgcDEgPSBleGMtPnpwMS5jdXIgKyBhSWR4MjsKLSAgICBwMiA9IGV4Yy0+enAyLmN1ciArIGFJZHgxOwotCi0gICAgQSA9IFNVQl9MT05HKCBwMS0+eCwgcDItPnggKTsKLSAgICBCID0gU1VCX0xPTkcoIHAxLT55LCBwMi0+eSApOwotCi0gICAgLyogSWYgcDEgPT0gcDIsIFNQdlRMIGFuZCBTRnZUTCBiZWhhdmUgdGhlIHNhbWUgYXMgKi8KLSAgICAvKiBTUHZUQ0FbWF0gYW5kIFNGdlRDQVtYXSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogQ29uZmlybWVkIGJ5IEdyZWcgSGl0Y2hjb2NrLiAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGlmICggQSA9PSAwICYmIEIgPT0gMCApCi0gICAgewotICAgICAgQSAgICAgID0gMHg0MDAwOwotICAgICAgb3Bjb2RlID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoICggb3Bjb2RlICYgMSApICE9IDAgKQotICAgIHsKLSAgICAgIEMgPSAgQjsgICAvKiBjb3VudGVyIGNsb2Nrd2lzZSByb3RhdGlvbiAqLwotICAgICAgQiA9ICBBOwotICAgICAgQSA9IC1DOwotICAgIH0KLQotICAgIE5vcm1hbGl6ZSggQSwgQiwgVmVjICk7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTVlRDQVthXTogICAgIFNldCAoRiBhbmQgUCkgVmVjdG9ycyB0byBDb29yZGluYXRlIEF4aXMgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDAwLTB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1B2VENBW2FdOiAgICBTZXQgUFZlY3RvciB0byBDb29yZGluYXRlIEF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwMi0weDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNGdlRDQVthXTogICAgU2V0IEZWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDQtMHgwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU3h5VENBKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIEZUX1Nob3J0ICBBQSwgQkI7Ci0KLSAgICBGVF9CeXRlICBvcGNvZGUgPSBleGMtPm9wY29kZTsKLQotCi0gICAgQUEgPSAoRlRfU2hvcnQpKCAoIG9wY29kZSAmIDEgKSA8PCAxNCApOwotICAgIEJCID0gKEZUX1Nob3J0KSggQUEgXiAweDQwMDAgKTsKLQotICAgIGlmICggb3Bjb2RlIDwgNCApCi0gICAgewotICAgICAgZXhjLT5HUy5wcm9qVmVjdG9yLnggPSBBQTsKLSAgICAgIGV4Yy0+R1MucHJvalZlY3Rvci55ID0gQkI7Ci0KLSAgICAgIGV4Yy0+R1MuZHVhbFZlY3Rvci54ID0gQUE7Ci0gICAgICBleGMtPkdTLmR1YWxWZWN0b3IueSA9IEJCOwotICAgIH0KLQotICAgIGlmICggKCBvcGNvZGUgJiAyICkgPT0gMCApCi0gICAgewotICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggPSBBQTsKLSAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ID0gQkI7Ci0gICAgfQotCi0gICAgQ29tcHV0ZV9GdW5jcyggZXhjICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1B2VExbYV06ICAgICBTZXQgUFZlY3RvciBUbyBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwNi0weDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUFZUTCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBpZiAoIEluc19TeFZUTCggZXhjLAotICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KWFyZ3NbMV0sCi0gICAgICAgICAgICAgICAgICAgIChGVF9VU2hvcnQpYXJnc1swXSwKLSAgICAgICAgICAgICAgICAgICAgJmV4Yy0+R1MucHJvalZlY3RvciApID09IFNVQ0NFU1MgKQotICAgIHsKLSAgICAgIGV4Yy0+R1MuZHVhbFZlY3RvciA9IGV4Yy0+R1MucHJvalZlY3RvcjsKLSAgICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTRnZUTFthXTogICAgIFNldCBGVmVjdG9yIFRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDA4LTB4MDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NGVlRMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGlmICggSW5zX1N4VlRMKCBleGMsCi0gICAgICAgICAgICAgICAgICAgIChGVF9VU2hvcnQpYXJnc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAmZXhjLT5HUy5mcmVlVmVjdG9yICkgPT0gU1VDQ0VTUyApCi0gICAgewotICAgICAgQ29tcHV0ZV9GdW5jcyggZXhjICk7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNGdlRQdltdOiAgICAgU2V0IEZWZWN0b3IgVG8gUFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0ZWVFBWKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+R1MuZnJlZVZlY3RvciA9IGV4Yy0+R1MucHJvalZlY3RvcjsKLSAgICBDb21wdXRlX0Z1bmNzKCBleGMgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTUHZGU1tdOiAgICAgIFNldCBQVmVjdG9yIEZyb20gU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjIuMTQgZjIuMTQgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NQVkZTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1Nob3J0ICBTOwotICAgIEZUX0xvbmcgICBYLCBZOwotCi0KLSAgICAvKiBPbmx5IHVzZSBsb3cgMTZiaXRzLCB0aGVuIHNpZ24gZXh0ZW5kICovCi0gICAgUyA9IChGVF9TaG9ydClhcmdzWzFdOwotICAgIFkgPSAoRlRfTG9uZylTOwotICAgIFMgPSAoRlRfU2hvcnQpYXJnc1swXTsKLSAgICBYID0gKEZUX0xvbmcpUzsKLQotICAgIE5vcm1hbGl6ZSggWCwgWSwgJmV4Yy0+R1MucHJvalZlY3RvciApOwotCi0gICAgZXhjLT5HUy5kdWFsVmVjdG9yID0gZXhjLT5HUy5wcm9qVmVjdG9yOwotICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNGdkZTW106ICAgICAgU2V0IEZWZWN0b3IgRnJvbSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMi4xNCBmMi4xNCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0ZWRlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfU2hvcnQgIFM7Ci0gICAgRlRfTG9uZyAgIFgsIFk7Ci0KLQotICAgIC8qIE9ubHkgdXNlIGxvdyAxNmJpdHMsIHRoZW4gc2lnbiBleHRlbmQgKi8KLSAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMV07Ci0gICAgWSA9IChGVF9Mb25nKVM7Ci0gICAgUyA9IChGVF9TaG9ydClhcmdzWzBdOwotICAgIFggPSBTOwotCi0gICAgTm9ybWFsaXplKCBYLCBZLCAmZXhjLT5HUy5mcmVlVmVjdG9yICk7Ci0gICAgQ29tcHV0ZV9GdW5jcyggZXhjICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR1B2W106ICAgICAgICBHZXQgUHJvamVjdGlvbiBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGVmMi4xNCAtLT4gZWYyLjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HUFYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBleGMtPkdTLnByb2pWZWN0b3IueDsKLSAgICBhcmdzWzFdID0gZXhjLT5HUy5wcm9qVmVjdG9yLnk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0Z2W106ICAgICAgICBHZXQgRnJlZWRvbSBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGVmMi4xNCAtLT4gZWYyLjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HRlYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBleGMtPkdTLmZyZWVWZWN0b3IueDsKLSAgICBhcmdzWzFdID0gZXhjLT5HUy5mcmVlVmVjdG9yLnk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JQMFtdOiAgICAgICBTZXQgUmVmZXJlbmNlIFBvaW50IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUlAwKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgZXhjLT5HUy5ycDAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JQMVtdOiAgICAgICBTZXQgUmVmZXJlbmNlIFBvaW50IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUlAxKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgZXhjLT5HUy5ycDEgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JQMltdOiAgICAgICBTZXQgUmVmZXJlbmNlIFBvaW50IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUlAyKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgZXhjLT5HUy5ycDIgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU01EW106ICAgICAgICBTZXQgTWluaW11bSBEaXN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TTUQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGV4Yy0+R1MubWluaW11bV9kaXN0YW5jZSA9IGFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0NWVENJW106ICAgICBTZXQgQ29udHJvbCBWYWx1ZSBUYWJsZSBDdXQgSW4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TQ1ZUQ0koIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGV4Yy0+R1MuY29udHJvbF92YWx1ZV9jdXRpbiA9IChGVF9GMjZEb3Q2KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1NXQ0lbXTogICAgICBTZXQgU2luZ2xlIFdpZHRoIEN1dCBJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TU1dDSSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBleGMtPkdTLnNpbmdsZV93aWR0aF9jdXRpbiA9IChGVF9GMjZEb3Q2KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1NXW106ICAgICAgICBTZXQgU2luZ2xlIFdpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TU1coIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlID0gRlRfTXVsRml4KCBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3Muc2NhbGUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGTElQT05bXTogICAgIFNldCBhdXRvLUZMSVAgdG8gT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0ZMSVBPTiggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBleGMtPkdTLmF1dG9fZmxpcCA9IFRSVUU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUE9GRltdOiAgICBTZXQgYXV0by1GTElQIHRvIE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTElQT0ZGKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+R1MuYXV0b19mbGlwID0gRkFMU0U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0FOR1dbXTogICAgICBTZXQgQU5HbGUgV2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TQU5HVyggdm9pZCApCi0gIHsKLSAgICAvKiBpbnN0cnVjdGlvbiBub3Qgc3VwcG9ydGVkIGFueW1vcmUgKi8KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTREJbXTogICAgICAgIFNldCBEZWx0YSBCYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NEQiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgZXhjLT5HUy5kZWx0YV9iYXNlID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNEU1tdOiAgICAgICAgU2V0IERlbHRhIFNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0RTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBpZiAoIChGVF9VTG9uZylhcmdzWzBdID4gNlVMICkKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggQmFkX0FyZ3VtZW50ICk7Ci0gICAgZWxzZQotICAgICAgZXhjLT5HUy5kZWx0YV9zaGlmdCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSVEhHW106ICAgICAgIFJvdW5kIFRvIEhhbGYgR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JUSEcoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgZXhjLT5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX1RvX0hhbGZfR3JpZDsKLSAgICBleGMtPmZ1bmNfcm91bmQgICAgID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fSGFsZl9HcmlkOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJUR1tdOiAgICAgICAgUm91bmQgVG8gR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUlRHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19HcmlkOwotICAgIGV4Yy0+ZnVuY19yb3VuZCAgICAgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19HcmlkOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogUlRER1tdOiAgICAgICBSb3VuZCBUbyBEb3VibGUgR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SVERHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19Eb3VibGVfR3JpZDsKLSAgICBleGMtPmZ1bmNfcm91bmQgICAgID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fRG91YmxlX0dyaWQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBSVVRHW106ICAgICAgIFJvdW5kIFVwIFRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JVVEcoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgZXhjLT5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX1VwX1RvX0dyaWQ7Ci0gICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1VwX1RvX0dyaWQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUkRUR1tdOiAgICAgICBSb3VuZCBEb3duIFRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SRFRHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Eb3duX1RvX0dyaWQ7Ci0gICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX0Rvd25fVG9fR3JpZDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBST0ZGW106ICAgICAgIFJvdW5kIE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JPRkYoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgZXhjLT5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX09mZjsKLSAgICBleGMtPmZ1bmNfcm91bmQgICAgID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfTm9uZTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTUk9VTkRbXTogICAgIFN1cGVyIFJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgRWludDggLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgU2V0U3VwZXJSb3VuZCggZXhjLCAweDQwMDAsIGFyZ3NbMF0gKTsKLQotICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9TdXBlcjsKLSAgICBleGMtPmZ1bmNfcm91bmQgICAgID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXI7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUzQ1Uk9VTkRbXTogICBTdXBlciBST1VORCA0NSBkZWdyZWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TNDVST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBTZXRTdXBlclJvdW5kKCBleGMsIDB4MkQ0MSwgYXJnc1swXSApOwotCi0gICAgZXhjLT5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX1N1cGVyXzQ1OwotICAgIGV4Yy0+ZnVuY19yb3VuZCAgICAgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcl80NTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHQ1thXTogICAgICAgIEdldCBDb29yZGluYXRlIHByb2plY3RlZCBvbnRvICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQ2LTB4NDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IE1lYXN1cmVzIGZyb20gdGhlIG9yaWdpbmFsIGdseXBoIG11c3QgYmUgdGFrZW4gICAgICovCi0gIC8qICAgICAgYWxvbmcgdGhlIGR1YWwgcHJvamVjdGlvbiB2ZWN0b3IhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0dDKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICAgIEw7Ci0gICAgRlRfRjI2RG90NiAgUjsKLQotCi0gICAgTCA9IChGVF9VTG9uZylhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFNMKCBMLCBleGMtPnpwMi5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIFIgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBleGMtPm9wY29kZSAmIDEgKQotICAgICAgICBSID0gRkFTVF9EVUFMUFJPSiggJmV4Yy0+enAyLm9yZ1tMXSApOwotICAgICAgZWxzZQotICAgICAgICBSID0gRkFTVF9QUk9KRUNUKCAmZXhjLT56cDIuY3VyW0xdICk7Ci0gICAgfQotCi0gICAgYXJnc1swXSA9IFI7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0NGU1tdOiAgICAgICBTZXQgQ29vcmRpbmF0ZSBGcm9tIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvcm11bGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBPQSA6PSBPQSArICggdmFsdWUgLSBPQS5wICkvKCBmLnAgKSAqIGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0NGUyggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX0xvbmcgICAgSzsKLSAgICBGVF9VU2hvcnQgIEw7Ci0KLQotICAgIEwgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSAgICBpZiAoIEJPVU5EUyggTCwgZXhjLT56cDIubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgSyA9IEZBU1RfUFJPSkVDVCggJmV4Yy0+enAyLmN1cltMXSApOwotCi0gICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAyLCBMLCBhcmdzWzFdIC0gSyApOwotCi0gICAgLyogVU5ET0NVTUVOVEVEISAgVGhlIE1TIHJhc3Rlcml6ZXIgZG9lcyB0aGF0IHdpdGggKi8KLSAgICAvKiB0d2lsaWdodCBwb2ludHMgKGNvbmZpcm1lZCBieSBHcmVnIEhpdGNoY29jaykgICAqLwotICAgIGlmICggZXhjLT5HUy5nZXAyID09IDAgKQotICAgICAgZXhjLT56cDIub3JnW0xdID0gZXhjLT56cDIuY3VyW0xdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1EW2FdOiAgICAgICAgTWVhc3VyZSBEaXN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDktMHg0QSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBYWFg6IFVORE9DVU1FTlRFRDogTWVhc3VyZSB0YWtlbiBpbiB0aGUgb3JpZ2luYWwgZ2x5cGggbXVzdCBiZSBhbG9uZyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRoZSBkdWFsIHByb2plY3Rpb24gdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBYWFg6IFVORE9DVU1FTlRFRDogRmxhZyBhdHRyaWJ1dGVzIGFyZSBpbnZlcnRlZCEgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgMCA9PiBtZWFzdXJlIGRpc3RhbmNlIGluIG9yaWdpbmFsIG91dGxpbmUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIDEgPT4gbWVhc3VyZSBkaXN0YW5jZSBpbiBncmlkLWZpdHRlZCBvdXRsaW5lICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IGB6cDAgLSB6cDEnLCBhbmQgbm90IGB6cDIgLSB6cDEhICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTUQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgSywgTDsKLSAgICBGVF9GMjZEb3Q2ICBEOwotCi0KLSAgICBLID0gKEZUX1VTaG9ydClhcmdzWzFdOwotICAgIEwgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSAgICBpZiAoIEJPVU5EUyggTCwgZXhjLT56cDAubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBLLCBleGMtPnpwMS5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIEQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBleGMtPm9wY29kZSAmIDEgKQotICAgICAgICBEID0gUFJPSkVDVCggZXhjLT56cDAuY3VyICsgTCwgZXhjLT56cDEuY3VyICsgSyApOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBYWFg6IFVORE9DVU1FTlRFRDogdHdpbGlnaHQgem9uZSBzcGVjaWFsIGNhc2UgKi8KLQotICAgICAgICBpZiAoIGV4Yy0+R1MuZ2VwMCA9PSAwIHx8IGV4Yy0+R1MuZ2VwMSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1ZlY3RvciogIHZlYzEgPSBleGMtPnpwMC5vcmcgKyBMOwotICAgICAgICAgIEZUX1ZlY3RvciogIHZlYzIgPSBleGMtPnpwMS5vcmcgKyBLOwotCi0KLSAgICAgICAgICBEID0gRFVBTFBST0ooIHZlYzEsIHZlYzIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMxID0gZXhjLT56cDAub3J1cyArIEw7Ci0gICAgICAgICAgRlRfVmVjdG9yKiAgdmVjMiA9IGV4Yy0+enAxLm9ydXMgKyBLOwotCi0KLSAgICAgICAgICBpZiAoIGV4Yy0+bWV0cmljcy54X3NjYWxlID09IGV4Yy0+bWV0cmljcy55X3NjYWxlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiB0aGlzIHNob3VsZCBiZSBmYXN0ZXIgKi8KLSAgICAgICAgICAgIEQgPSBEVUFMUFJPSiggdmVjMSwgdmVjMiApOwotICAgICAgICAgICAgRCA9IEZUX011bEZpeCggRCwgZXhjLT5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgIHZlYy54ID0gRlRfTXVsRml4KCB2ZWMxLT54IC0gdmVjMi0+eCwgZXhjLT5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgICAgICAgIHZlYy55ID0gRlRfTXVsRml4KCB2ZWMxLT55IC0gdmVjMi0+eSwgZXhjLT5tZXRyaWNzLnlfc2NhbGUgKTsKLQotICAgICAgICAgICAgRCA9IEZBU1RfRFVBTFBST0ooICZ2ZWMgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIC8qIERpc2FibGUgVHlwZSAyIFZhY3Vmb3JtIFJvdW5kcyAtIGUuZy4gQXJpYWwgTmFycm93ICovCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAmJgotICAgICAgICAgRlRfQUJTKCBEICkgPT0gNjQgICAgICAgICAgICkKLSAgICAgIEQgKz0gMTsKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0gICAgYXJnc1swXSA9IEQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0RQdlRMW2FdOiAgICBTZXQgRHVhbCBQVmVjdG9yIHRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4Ni0weDg3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TRFBWVEwoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX0xvbmcgICAgQSwgQiwgQzsKLSAgICBGVF9VU2hvcnQgIHAxLCBwMjsgICAgICAgICAgICAvKiB3YXMgRlRfSW50IGluIHBhcyB0eXBlIEVSUk9SICovCi0KLSAgICBGVF9CeXRlICBvcGNvZGUgPSBleGMtPm9wY29kZTsKLQotCi0gICAgcDEgPSAoRlRfVVNob3J0KWFyZ3NbMV07Ci0gICAgcDIgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSAgICBpZiAoIEJPVU5EUyggcDIsIGV4Yy0+enAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggcDEsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogdjEgPSBleGMtPnpwMS5vcmcgKyBwMjsKLSAgICAgIEZUX1ZlY3RvciogdjIgPSBleGMtPnpwMi5vcmcgKyBwMTsKLQotCi0gICAgICBBID0gdjEtPnggLSB2Mi0+eDsKLSAgICAgIEIgPSB2MS0+eSAtIHYyLT55OwotCi0gICAgICAvKiBJZiB2MSA9PSB2MiwgU0RQdlRMIGJlaGF2ZXMgdGhlIHNhbWUgYXMgKi8KLSAgICAgIC8qIFNWVENBW1hdLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBDb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2suICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBBID09IDAgJiYgQiA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgQSAgICAgID0gMHg0MDAwOwotICAgICAgICBvcGNvZGUgPSAwOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggKCBvcGNvZGUgJiAxICkgIT0gMCApCi0gICAgewotICAgICAgQyA9ICBCOyAgIC8qIGNvdW50ZXIgY2xvY2t3aXNlIHJvdGF0aW9uICovCi0gICAgICBCID0gIEE7Ci0gICAgICBBID0gLUM7Ci0gICAgfQotCi0gICAgTm9ybWFsaXplKCBBLCBCLCAmZXhjLT5HUy5kdWFsVmVjdG9yICk7Ci0KLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICB2MSA9IGV4Yy0+enAxLmN1ciArIHAyOwotICAgICAgRlRfVmVjdG9yKiAgdjIgPSBleGMtPnpwMi5jdXIgKyBwMTsKLQotCi0gICAgICBBID0gdjEtPnggLSB2Mi0+eDsKLSAgICAgIEIgPSB2MS0+eSAtIHYyLT55OwotCi0gICAgICBpZiAoIEEgPT0gMCAmJiBCID09IDAgKQotICAgICAgewotICAgICAgICBBICAgICAgPSAweDQwMDA7Ci0gICAgICAgIG9wY29kZSA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAoIG9wY29kZSAmIDEgKSAhPSAwICkKLSAgICB7Ci0gICAgICBDID0gIEI7ICAgLyogY291bnRlciBjbG9ja3dpc2Ugcm90YXRpb24gKi8KLSAgICAgIEIgPSAgQTsKLSAgICAgIEEgPSAtQzsKLSAgICB9Ci0KLSAgICBOb3JtYWxpemUoIEEsIEIsICZleGMtPkdTLnByb2pWZWN0b3IgKTsKLSAgICBDb21wdXRlX0Z1bmNzKCBleGMgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTWlAwW106ICAgICAgIFNldCBab25lIFBvaW50ZXIgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NaUDAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBzd2l0Y2ggKCAoRlRfSW50KWFyZ3NbMF0gKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBleGMtPnpwMCA9IGV4Yy0+dHdpbGlnaHQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIGV4Yy0+enAwID0gZXhjLT5wdHM7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBleGMtPkdTLmdlcDAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1pQMVtdOiAgICAgICBTZXQgWm9uZSBQb2ludGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TWlAxKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgc3dpdGNoICggKEZUX0ludClhcmdzWzBdICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZXhjLT56cDEgPSBleGMtPnR3aWxpZ2h0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBleGMtPnpwMSA9IGV4Yy0+cHRzOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXhjLT5HUy5nZXAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNaUDJbXTogICAgICAgU2V0IFpvbmUgUG9pbnRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1pQMiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIHN3aXRjaCAoIChGVF9JbnQpYXJnc1swXSApCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGV4Yy0+enAyID0gZXhjLT50d2lsaWdodDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgZXhjLT56cDIgPSBleGMtPnB0czsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV4Yy0+R1MuZ2VwMiA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTWlBTW106ICAgICAgIFNldCBab25lIFBvaW50ZXJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NaUFMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBzd2l0Y2ggKCAoRlRfSW50KWFyZ3NbMF0gKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBleGMtPnpwMCA9IGV4Yy0+dHdpbGlnaHQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIGV4Yy0+enAwID0gZXhjLT5wdHM7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBleGMtPnpwMSA9IGV4Yy0+enAwOwotICAgIGV4Yy0+enAyID0gZXhjLT56cDA7Ci0KLSAgICBleGMtPkdTLmdlcDAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gICAgZXhjLT5HUy5nZXAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICAgIGV4Yy0+R1MuZ2VwMiA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJTlNUQ1RSTFtdOiAgIElOU1RydWN0aW9uIENvblRSb0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzIgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0lOU1RDVFJMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICBLLCBMLCBLZjsKLQotCi0gICAgSyA9IChGVF9VTG9uZylhcmdzWzFdOwotICAgIEwgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotICAgIC8qIHNlbGVjdG9yIHZhbHVlcyBjYW5ub3QgYmUgYE9SJ2VkOyAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB0aGV5IGFyZSBpbmRpY2VzIHN0YXJ0aW5nIHdpdGggaW5kZXggMSwgbm90IGZsYWdzICovCi0gICAgaWYgKCBLIDwgMSB8fCBLID4gMyApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogY29udmVydCBpbmRleCB0byBmbGFnIHZhbHVlICovCi0gICAgS2YgPSAxIDw8ICggSyAtIDEgKTsKLQotICAgIGlmICggTCAhPSAwICkKLSAgICB7Ci0gICAgICAvKiBhcmd1bWVudHMgdG8gc2VsZWN0b3JzIGxvb2sgbGlrZSBmbGFnIHZhbHVlcyAqLwotICAgICAgaWYgKCBMICE9IEtmICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIGV4Yy0+R1MuaW5zdHJ1Y3RfY29udHJvbCAmPSB+KEZUX0J5dGUpS2Y7Ci0gICAgZXhjLT5HUy5pbnN0cnVjdF9jb250cm9sIHw9IChGVF9CeXRlKUw7Ci0KLSAgICBpZiAoIEsgPT0gMyApCi0gICAgewotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgICAvKiBJTlNUQ1RSTCBtb2RpZnlpbmcgZmxhZyAzIGFsc28gaGFzIGFuIGVmZmVjdCAqLwotICAgICAgLyogb3V0c2lkZSBvZiB0aGUgQ1ZUIHByb2dyYW0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKLSAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlID0gRlRfQk9PTCggTCA9PSA0ICk7Ci0jZW5kaWYKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0gICAgICAvKiBOYXRpdmUgQ2xlYXJUeXBlIGZvbnRzIHNpZ24gYSB3YWl2ZXIgdGhhdCB0dXJucyBvZmYgYWxsIGJhY2t3YXJkICAqLwotICAgICAgLyogY29tcGF0aWJpbGl0eSBoYWNrcyBhbmQgbGV0cyB0aGVtIHByb2dyYW0gcG9pbnRzIHRvIHRoZSBncmlkIGxpa2UgKi8KLSAgICAgIC8qIGl0J3MgMTk5Ni4gIFRoZXkgbWlnaHQgc2lnbiBhIHdhaXZlciBmb3IganVzdCBvbmUgZ2x5cGgsIHRob3VnaC4gICovCi0gICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTCApCi0gICAgICAgIGV4Yy0+YmFja3dhcmRfY29tcGF0aWJpbGl0eSA9ICFGVF9CT09MKCBMID09IDQgKTsKLSNlbmRpZgotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQ0FOQ1RSTFtdOiAgIFNDQU4gQ29uVFJvTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NDQU5DVFJMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX0ludCAgQTsKLQotCi0gICAgLyogR2V0IFRocmVzaG9sZCAqLwotICAgIEEgPSAoRlRfSW50KSggYXJnc1swXSAmIDB4RkYgKTsKLQotICAgIGlmICggQSA9PSAweEZGICkKLSAgICB7Ci0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IFRSVUU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKCBBID09IDAgKQotICAgIHsKLSAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gRkFMU0U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiAweDEwMCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnBwZW0gPD0gQSApCi0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IFRSVUU7Ci0KLSAgICBpZiAoICggYXJnc1swXSAmIDB4MjAwICkgIT0gMCAmJiBleGMtPnR0X21ldHJpY3Mucm90YXRlZCApCi0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IFRSVUU7Ci0KLSAgICBpZiAoICggYXJnc1swXSAmIDB4NDAwICkgIT0gMCAmJiBleGMtPnR0X21ldHJpY3Muc3RyZXRjaGVkICkKLSAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gVFJVRTsKLQotICAgIGlmICggKCBhcmdzWzBdICYgMHg4MDAgKSAhPSAwICYmIGV4Yy0+dHRfbWV0cmljcy5wcGVtID4gQSApCi0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IEZBTFNFOwotCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiAweDEwMDAgKSAhPSAwICYmIGV4Yy0+dHRfbWV0cmljcy5yb3RhdGVkICkKLSAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gRkFMU0U7Ci0KLSAgICBpZiAoICggYXJnc1swXSAmIDB4MjAwMCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnN0cmV0Y2hlZCApCi0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IEZBTFNFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNDQU5UWVBFW106ICAgU0NBTiBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MTYgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0NBTlRZUEUoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgaWYgKCBhcmdzWzBdID49IDAgKQotICAgICAgZXhjLT5HUy5zY2FuX3R5cGUgPSAoRlRfSW50KWFyZ3NbMF0gJiAweEZGRkY7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUFOQUdJTkcgT1VUTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUFBUW106ICAgICBGTElQIFBvaW5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTElQUFQoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgRlRfVVNob3J0ICBwb2ludDsKLQotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAvKiBTZWUgYHR0aW50ZXJwLmgnIGZvciBkZXRhaWxzIG9uIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4gKi8KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTCAgICAmJgotICAgICAgICAgZXhjLT5iYWNrd2FyZF9jb21wYXRpYmlsaXR5ICYmCi0gICAgICAgICBleGMtPml1cHhfY2FsbGVkICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aXVweV9jYWxsZWQgICAgICAgICAgICApCi0gICAgICBnb3RvIEZhaWw7Ci0jZW5kaWYKLQotICAgIGlmICggZXhjLT50b3AgPCBleGMtPkdTLmxvb3AgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBUb29fRmV3X0FyZ3VtZW50cyApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIHdoaWxlICggZXhjLT5HUy5sb29wID4gMCApCi0gICAgewotICAgICAgZXhjLT5hcmdzLS07Ci0KLSAgICAgIHBvaW50ID0gKEZUX1VTaG9ydClleGMtPnN0YWNrW2V4Yy0+YXJnc107Ci0KLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgZXhjLT5wdHMubl9wb2ludHMgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZXhjLT5wdHMudGFnc1twb2ludF0gXj0gRlRfQ1VSVkVfVEFHX09OOwotCi0gICAgICBleGMtPkdTLmxvb3AtLTsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBleGMtPkdTLmxvb3AgPSAxOwotICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGTElQUkdPTltdOiAgIEZMSVAgUmFuR2UgT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0ZMSVBSR09OKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgSSwgSywgTDsKLQotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAvKiBTZWUgYHR0aW50ZXJwLmgnIGZvciBkZXRhaWxzIG9uIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4gKi8KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTCAgICAmJgotICAgICAgICAgZXhjLT5iYWNrd2FyZF9jb21wYXRpYmlsaXR5ICYmCi0gICAgICAgICBleGMtPml1cHhfY2FsbGVkICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aXVweV9jYWxsZWQgICAgICAgICAgICApCi0gICAgICByZXR1cm47Ci0jZW5kaWYKLQotICAgIEsgPSAoRlRfVVNob3J0KWFyZ3NbMV07Ci0gICAgTCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTKCBLLCBleGMtPnB0cy5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIEwsIGV4Yy0+cHRzLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoIEkgPSBMOyBJIDw9IEs7IEkrKyApCi0gICAgICBleGMtPnB0cy50YWdzW0ldIHw9IEZUX0NVUlZFX1RBR19PTjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGTElQUkdPRkY6ICAgIEZMSVAgUmFuR2UgT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDgyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0ZMSVBSR09GRiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICBJLCBLLCBMOwotCi0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgIC8qIFNlZSBgdHRpbnRlcnAuaCcgZm9yIGRldGFpbHMgb24gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlLiAqLwotICAgIGlmICggU1VCUElYRUxfSElOVElOR19NSU5JTUFMICAgICYmCi0gICAgICAgICBleGMtPmJhY2t3YXJkX2NvbXBhdGliaWxpdHkgJiYKLSAgICAgICAgIGV4Yy0+aXVweF9jYWxsZWQgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pdXB5X2NhbGxlZCAgICAgICAgICAgICkKLSAgICAgIHJldHVybjsKLSNlbmRpZgotCi0gICAgSyA9IChGVF9VU2hvcnQpYXJnc1sxXTsKLSAgICBMID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIEssIGV4Yy0+cHRzLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggTCwgZXhjLT5wdHMubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICggSSA9IEw7IEkgPD0gSzsgSSsrICkKLSAgICAgIGV4Yy0+cHRzLnRhZ3NbSV0gJj0gfkZUX0NVUlZFX1RBR19PTjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2KiAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYqICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICAgcmVmcCApCi0gIHsKLSAgICBUVF9HbHlwaFpvbmVSZWMgIHpwOwotICAgIEZUX1VTaG9ydCAgICAgICAgcDsKLSAgICBGVF9GMjZEb3Q2ICAgICAgIGQ7Ci0KLQotICAgIGlmICggZXhjLT5vcGNvZGUgJiAxICkKLSAgICB7Ci0gICAgICB6cCA9IGV4Yy0+enAwOwotICAgICAgcCAgPSBleGMtPkdTLnJwMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHpwID0gZXhjLT56cDE7Ci0gICAgICBwICA9IGV4Yy0+R1MucnAyOwotICAgIH0KLQotICAgIGlmICggQk9VTkRTKCBwLCB6cC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICpyZWZwID0gMDsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgICp6b25lID0genA7Ci0gICAgKnJlZnAgPSBwOwotCi0gICAgZCA9IFBST0pFQ1QoIHpwLmN1ciArIHAsIHpwLm9yZyArIHAgKTsKLQotICAgICp4ID0gRlRfTXVsRGl2KCBkLCAoRlRfTG9uZylleGMtPkdTLmZyZWVWZWN0b3IueCwgZXhjLT5GX2RvdF9QICk7Ci0gICAgKnkgPSBGVF9NdWxEaXYoIGQsIChGVF9Mb25nKWV4Yy0+R1MuZnJlZVZlY3Rvci55LCBleGMtPkZfZG90X1AgKTsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKiBTZWUgYHR0aW50ZXJwLmgnIGZvciBkZXRhaWxzIG9uIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4gKi8KLSAgc3RhdGljIHZvaWQKLSAgTW92ZV9acDJfUG9pbnQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZHgsCi0gICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZHksCi0gICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgdG91Y2ggKQotICB7Ci0gICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICkKLSAgICB7Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAgIGlmICggISggU1VCUElYRUxfSElOVElOR19NSU5JTUFMICAgICYmCi0gICAgICAgICAgICAgIGV4Yy0+YmFja3dhcmRfY29tcGF0aWJpbGl0eSApICkKLSNlbmRpZgotICAgICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnggPSBBRERfTE9ORyggZXhjLT56cDIuY3VyW3BvaW50XS54LCBkeCApOwotCi0gICAgICBpZiAoIHRvdWNoICkKLSAgICAgICAgZXhjLT56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1g7Ci0gICAgfQotCi0gICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkKLSAgICB7Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAgIGlmICggISggU1VCUElYRUxfSElOVElOR19NSU5JTUFMICAgICYmCi0gICAgICAgICAgICAgIGV4Yy0+YmFja3dhcmRfY29tcGF0aWJpbGl0eSAmJgotICAgICAgICAgICAgICBleGMtPml1cHhfY2FsbGVkICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgZXhjLT5pdXB5X2NhbGxlZCAgICAgICAgICAgICkgKQotI2VuZGlmCi0gICAgICAgIGV4Yy0+enAyLmN1cltwb2ludF0ueSA9IEFERF9MT05HKCBleGMtPnpwMi5jdXJbcG9pbnRdLnksIGR5ICk7Ci0KLSAgICAgIGlmICggdG91Y2ggKQotICAgICAgICBleGMtPnpwMi50YWdzW3BvaW50XSB8PSBGVF9DVVJWRV9UQUdfVE9VQ0hfWTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0hQW2FdOiAgICAgICBTSGlmdCBQb2ludCBieSB0aGUgbGFzdCBwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzMi0weDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TSFAoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgVFRfR2x5cGhab25lUmVjICB6cDsKLSAgICBGVF9VU2hvcnQgICAgICAgIHJlZnA7Ci0KLSAgICBGVF9GMjZEb3Q2ICAgICAgIGR4LCBkeTsKLSAgICBGVF9VU2hvcnQgICAgICAgIHBvaW50OwotCi0KLSAgICBpZiAoIGV4Yy0+dG9wIDwgZXhjLT5HUy5sb29wICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoIENvbXB1dGVfUG9pbnRfRGlzcGxhY2VtZW50KCBleGMsICZkeCwgJmR5LCAmenAsICZyZWZwICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgd2hpbGUgKCBleGMtPkdTLmxvb3AgPiAwICkKLSAgICB7Ci0gICAgICBleGMtPmFyZ3MtLTsKLSAgICAgIHBvaW50ID0gKEZUX1VTaG9ydClleGMtPnN0YWNrW2V4Yy0+YXJnc107Ci0KLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgZXhjLT56cDIubl9wb2ludHMgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgICAgLyogZG9lc24ndCBmb2xsb3cgQ2xlYXJ0eXBlIHNwZWMgYnV0IHByb2R1Y2VzIGJldHRlciByZXN1bHQgKi8KLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICYmIGV4Yy0+aWdub3JlX3hfbW9kZSApCi0gICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCAwLCBkeSwgVFJVRSApOwotICAgICAgZWxzZQotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0gICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKLQotICAgICAgZXhjLT5HUy5sb29wLS07Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgZXhjLT5HUy5sb29wID0gMTsKLSAgICBleGMtPm5ld190b3AgPSBleGMtPmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0hDW2FdOiAgICAgICBTSGlmdCBDb250b3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzNC0zNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVORE9DVU1FTlRFRDogQWNjb3JkaW5nIHRvIEdyZWcgSGl0Y2hjb2NrLCB0aGVyZSBpcyBvbmUgKHZpcnR1YWwpICAgICAqLwotICAvKiAgICAgICAgICAgICAgIGNvbnRvdXIgaW4gdGhlIHR3aWxpZ2h0IHpvbmUsIG5hbWVseSBjb250b3VyIG51bWJlciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICB6ZXJvIHdoaWNoIGluY2x1ZGVzIGFsbCBwb2ludHMgb2YgaXQuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0hDKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBUVF9HbHlwaFpvbmVSZWMgIHpwOwotICAgIEZUX1VTaG9ydCAgICAgICAgcmVmcDsKLSAgICBGVF9GMjZEb3Q2ICAgICAgIGR4LCBkeTsKLQotICAgIEZUX1Nob3J0ICAgICAgICAgY29udG91ciwgYm91bmRzOwotICAgIEZUX1VTaG9ydCAgICAgICAgc3RhcnQsIGxpbWl0LCBpOwotCi0KLSAgICBjb250b3VyID0gKEZUX1Nob3J0KWFyZ3NbMF07Ci0gICAgYm91bmRzICA9ICggZXhjLT5HUy5nZXAyID09IDAgKSA/IDEgOiBleGMtPnpwMi5uX2NvbnRvdXJzOwotCi0gICAgaWYgKCBCT1VORFMoIGNvbnRvdXIsIGJvdW5kcyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIENvbXB1dGVfUG9pbnRfRGlzcGxhY2VtZW50KCBleGMsICZkeCwgJmR5LCAmenAsICZyZWZwICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCBjb250b3VyID09IDAgKQotICAgICAgc3RhcnQgPSAwOwotICAgIGVsc2UKLSAgICAgIHN0YXJ0ID0gKEZUX1VTaG9ydCkoIGV4Yy0+enAyLmNvbnRvdXJzW2NvbnRvdXIgLSAxXSArIDEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDIuZmlyc3RfcG9pbnQgKTsKLQotICAgIC8qIHdlIHVzZSB0aGUgbnVtYmVyIG9mIHBvaW50cyBpZiBpbiB0aGUgdHdpbGlnaHQgem9uZSAqLwotICAgIGlmICggZXhjLT5HUy5nZXAyID09IDAgKQotICAgICAgbGltaXQgPSBleGMtPnpwMi5uX3BvaW50czsKLSAgICBlbHNlCi0gICAgICBsaW1pdCA9IChGVF9VU2hvcnQpKCBleGMtPnpwMi5jb250b3Vyc1tjb250b3VyXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnpwMi5maXJzdF9wb2ludCArIDEgKTsKLQotICAgIGZvciAoIGkgPSBzdGFydDsgaSA8IGxpbWl0OyBpKysgKQotICAgIHsKLSAgICAgIGlmICggenAuY3VyICE9IGV4Yy0+enAyLmN1ciB8fCByZWZwICE9IGkgKQotICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBpLCBkeCwgZHksIFRSVUUgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0haW2FdOiAgICAgICBTSGlmdCBab25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzNi0zNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TSFooIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIFRUX0dseXBoWm9uZVJlYyAgenA7Ci0gICAgRlRfVVNob3J0ICAgICAgICByZWZwOwotICAgIEZUX0YyNkRvdDYgICAgICAgZHgsCi0gICAgICAgICAgICAgICAgICAgICBkeTsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgbGltaXQsIGk7Ci0KLQotICAgIGlmICggQk9VTkRTKCBhcmdzWzBdLCAyICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQoIGV4YywgJmR4LCAmZHksICZ6cCwgJnJlZnAgKSApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgU0haIGRvZXNuJ3QgbW92ZSB0aGUgcGhhbnRvbSBwb2ludHMuICAgICAqLwotICAgIC8qICAgICAgVHdpbGlnaHQgem9uZSBoYXMgbm8gcmVhbCBjb250b3Vycywgc28gdXNlIGBuX3BvaW50cycuICovCi0gICAgLyogICAgICBOb3JtYWwgem9uZSdzIGBuX3BvaW50cycgaW5jbHVkZXMgcGhhbnRvbXMsIHNvIG11c3QgICAgKi8KLSAgICAvKiAgICAgIHVzZSBlbmQgb2YgbGFzdCBjb250b3VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZXhjLT5HUy5nZXAyID09IDAgKQotICAgICAgbGltaXQgPSAoRlRfVVNob3J0KWV4Yy0+enAyLm5fcG9pbnRzOwotICAgIGVsc2UgaWYgKCBleGMtPkdTLmdlcDIgPT0gMSAmJiBleGMtPnpwMi5uX2NvbnRvdXJzID4gMCApCi0gICAgICBsaW1pdCA9IChGVF9VU2hvcnQpKCBleGMtPnpwMi5jb250b3Vyc1tleGMtPnpwMi5uX2NvbnRvdXJzIC0gMV0gKyAxICk7Ci0gICAgZWxzZQotICAgICAgbGltaXQgPSAwOwotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIFNIWiBkb2Vzbid0IHRvdWNoIHRoZSBwb2ludHMgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IGxpbWl0OyBpKysgKQotICAgIHsKLSAgICAgIGlmICggenAuY3VyICE9IGV4Yy0+enAyLmN1ciB8fCByZWZwICE9IGkgKQotICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBpLCBkeCwgZHksIEZBTFNFICk7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNIUElYW106ICAgICAgU0hpZnQgcG9pbnRzIGJ5IGEgUElYZWwgYW1vdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0hQSVgoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfRjI2RG90NiAgZHgsIGR5OwotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgRlRfSW50ICAgICAgQjEsIEIyOwotI2VuZGlmCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICBGVF9Cb29sICAgICBpbl90d2lsaWdodCA9IEZUX0JPT0woIGV4Yy0+R1MuZ2VwMCA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmdlcDEgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5nZXAyID09IDAgKTsKLSNlbmRpZgotCi0KLQotICAgIGlmICggZXhjLT50b3AgPCBleGMtPkdTLmxvb3AgKyAxICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBkeCA9IFRUX011bEZpeDE0KCBhcmdzWzBdLCBleGMtPkdTLmZyZWVWZWN0b3IueCApOwotICAgIGR5ID0gVFRfTXVsRml4MTQoIGFyZ3NbMF0sIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICk7Ci0KLSAgICB3aGlsZSAoIGV4Yy0+R1MubG9vcCA+IDAgKQotICAgIHsKLSAgICAgIGV4Yy0+YXJncy0tOwotCi0gICAgICBwb2ludCA9IChGVF9VU2hvcnQpZXhjLT5zdGFja1tleGMtPmFyZ3NdOwotCi0gICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKLSAgICAgIHsKLSAgICAgICAgLyogIElmIG5vdCB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywgYWxsb3cgWlAyIG1vdmUuICAgICAgICAqLwotICAgICAgICAvKiAgSWYgaW5saW5lIGRlbHRhcyBhcmVuJ3QgYWxsb3dlZCwgc2tpcCBaUDIgbW92ZS4gICAgICAgICAgICAgICovCi0gICAgICAgIC8qICBJZiB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywgYWxsb3cgWlAyIHBvaW50IG1vdmUgaWY6ICAgKi8KLSAgICAgICAgLyogICAtIGZyZWVkb20gdmVjdG9yIGlzIHkgYW5kIHNwaF9jb21wYXRpYmlsaXR5X21vZGUgaXMgb2ZmICAgICAqLwotICAgICAgICAvKiAgIC0gdGhlIGdseXBoIGlzIGNvbXBvc2l0ZSBhbmQgdGhlIG1vdmUgaXMgaW4gdGhlIFkgZGlyZWN0aW9uICovCi0gICAgICAgIC8qICAgLSB0aGUgZ2x5cGggaXMgc3BlY2lmaWNhbGx5IHNldCB0byBhbGxvdyBTSFBJWCBtb3ZlcyAgICAgICAgKi8KLSAgICAgICAgLyogICAtIHRoZSBtb3ZlIGlzIG9uIGEgcHJldmlvdXNseSBZLXRvdWNoZWQgcG9pbnQgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggZXhjLT5pZ25vcmVfeF9tb2RlICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHNhdmUgcG9pbnQgZm9yIGxhdGVyIGNvbXBhcmlzb24gKi8KLSAgICAgICAgICBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKQotICAgICAgICAgICAgQjEgPSBleGMtPnpwMi5jdXJbcG9pbnRdLnk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgQjEgPSBleGMtPnpwMi5jdXJbcG9pbnRdLng7Ci0KLSAgICAgICAgICBpZiAoICFleGMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgJiYKLSAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKLQotICAgICAgICAgICAgLyogc2F2ZSBuZXcgcG9pbnQgKi8KLSAgICAgICAgICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEIyID0gZXhjLT56cDIuY3VyW3BvaW50XS55OwotCi0gICAgICAgICAgICAgIC8qIHJldmVyc2UgYW55IGRpc2FsbG93ZWQgbW92ZXMgKi8KLSAgICAgICAgICAgICAgaWYgKCAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFUyApICYmCi0gICAgICAgICAgICAgICAgICAgKCBCMSAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICBCMSAhPSBCMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgLWR4LCAtZHksIFRSVUUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIGV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19ST1VORF9OT05QSVhFTF9ZX01PVkVTICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZHggPSBGVF9QSVhfUk9VTkQoIEIxICsgZHggKSAtIEIxOwotICAgICAgICAgICAgICBkeSA9IEZUX1BJWF9ST1VORCggQjEgKyBkeSApIC0gQjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHNraXAgcG9zdC1pdXAgZGVsdGFzICovCi0gICAgICAgICAgICBpZiAoIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICggKCBleGMtPnNwaF9pbl9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzEgKSB8fAotICAgICAgICAgICAgICAgICAgICggZXhjLT5zcGhfaW5fZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8yICkgKSApCi0gICAgICAgICAgICAgIGdvdG8gU2tpcDsKLQotICAgICAgICAgICAgaWYgKCAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19BTFdBWVNfU0tJUF9ERUxUQVAgKSAmJgotICAgICAgICAgICAgICAgICAgKCAoIGV4Yy0+aXNfY29tcG9zaXRlICYmIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKSB8fAotICAgICAgICAgICAgICAgICAgICAoIGV4Yy0+enAyLnRhZ3NbcG9pbnRdICYgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgKSAgICB8fAotICAgICAgICAgICAgICAgICAgICAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0RPX1NIUElYICkgICAgICApICApCi0gICAgICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCAwLCBkeSwgVFJVRSApOwotCi0gICAgICAgICAgICAvKiBzYXZlIG5ldyBwb2ludCAqLwotICAgICAgICAgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQjIgPSBleGMtPnpwMi5jdXJbcG9pbnRdLnk7Ci0KLSAgICAgICAgICAgICAgLyogcmV2ZXJzZSBhbnkgZGlzYWxsb3dlZCBtb3ZlcyAqLwotICAgICAgICAgICAgICBpZiAoICggQjEgJiA2MyApID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAoIEIyICYgNjMgKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgQjEgIT0gQjIgICAgICAgICApCi0gICAgICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIDAsIC1keSwgVFJVRSApOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggZXhjLT5zcGhfaW5fZnVuY19mbGFncyAmIFNQSF9GREVGX1RZUEVNQU5fRElBR0VORENUUkwgKQotICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIGR4LCBkeSwgVFJVRSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgZHgsIGR5LCBUUlVFICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jZW5kaWYKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX01JTklNQUwgICAgJiYKLSAgICAgICAgICAgZXhjLT5iYWNrd2FyZF9jb21wYXRpYmlsaXR5ICkKLSAgICAgIHsKLSAgICAgICAgLyogU3BlY2lhbCBjYXNlOiBhbGxvdyBTSFBJWCB0byBtb3ZlIHBvaW50cyBpbiB0aGUgdHdpbGlnaHQgem9uZS4gICovCi0gICAgICAgIC8qIE90aGVyd2lzZSwgdHJlYXQgU0hQSVggdGhlIHNhbWUgYXMgREVMVEFQLiAgVW5icmVha3MgdmFyaW91cyAgICAqLwotICAgICAgICAvKiBmb250cyBzdWNoIGFzIG9sZGVyIHZlcnNpb25zIG9mIFJva2tpdHQgYW5kIERUTCBBcmdvIFQgTGlnaHQgICAgKi8KLSAgICAgICAgLyogdGhhdCB3b3VsZCBnbGl0Y2ggc2V2ZXJlbHkgYWZ0ZXIgY2FsbGluZyBBTElHTlJQIGFmdGVyIGEgICAgICAgICovCi0gICAgICAgIC8qIGJsb2NrZWQgU0hQSVguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGluX3R3aWxpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAoICEoIGV4Yy0+aXVweF9jYWxsZWQgJiYgZXhjLT5pdXB5X2NhbGxlZCApICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgKCAoIGV4Yy0+aXNfY29tcG9zaXRlICYmIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKSB8fAotICAgICAgICAgICAgICAgICAoIGV4Yy0+enAyLnRhZ3NbcG9pbnRdICYgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgKSAgICApICkgKQotICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCAwLCBkeSwgVFJVRSApOwotICAgICAgfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgU2tpcDoKLSNlbmRpZgotICAgICAgZXhjLT5HUy5sb29wLS07Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgZXhjLT5HUy5sb29wID0gMTsKLSAgICBleGMtPm5ld190b3AgPSBleGMtPmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTVNJUlBbYV06ICAgICBNb3ZlIFN0YWNrIEluZGlyZWN0IFJlbGF0aXZlIFBvc2l0aW9uICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzQS0weDNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NU0lSUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VU2hvcnQgICBwb2ludCA9IDA7Ci0gICAgRlRfRjI2RG90NiAgZGlzdGFuY2U7Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBGVF9GMjZEb3Q2ICBjb250cm9sX3ZhbHVlX2N1dGluID0gMDsKLQotCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKQotICAgIHsKLSAgICAgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSBleGMtPkdTLmNvbnRyb2xfdmFsdWVfY3V0aW47Ci0KLSAgICAgIGlmICggZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9STUFMX1JPVU5EICkgKQotICAgICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gMDsKLSAgICB9Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCAgICAgICBleGMtPnpwMS5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIGV4Yy0+R1MucnAwLCBleGMtPnpwMC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGUgTVMgcmFzdGVyaXplciBkb2VzIHRoYXQgd2l0aCAqLwotICAgIC8qIHR3aWxpZ2h0IHBvaW50cyAoY29uZmlybWVkIGJ5IEdyZWcgSGl0Y2hjb2NrKSAgICovCi0gICAgaWYgKCBleGMtPkdTLmdlcDEgPT0gMCApCi0gICAgewotICAgICAgZXhjLT56cDEub3JnW3BvaW50XSA9IGV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMF07Ci0gICAgICBleGMtPmZ1bmNfbW92ZV9vcmlnKCBleGMsICZleGMtPnpwMSwgcG9pbnQsIGFyZ3NbMV0gKTsKLSAgICAgIGV4Yy0+enAxLmN1cltwb2ludF0gPSBleGMtPnpwMS5vcmdbcG9pbnRdOwotICAgIH0KLQotICAgIGRpc3RhbmNlID0gUFJPSkVDVCggZXhjLT56cDEuY3VyICsgcG9pbnQsIGV4Yy0+enAwLmN1ciArIGV4Yy0+R1MucnAwICk7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIC8qIHN1YnBpeGVsIGhpbnRpbmcgLSBtYWtlIE1TSVJQIHJlc3BlY3QgQ1ZUIGN1dC1pbjsgKi8KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIEZUX0FCUyggU1VCX0xPTkcoIGRpc3RhbmNlLCBhcmdzWzFdICkgKSA+PSBjb250cm9sX3ZhbHVlX2N1dGluICkKLSAgICAgIGRpc3RhbmNlID0gYXJnc1sxXTsKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0gICAgZXhjLT5mdW5jX21vdmUoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgJmV4Yy0+enAxLAotICAgICAgICAgICAgICAgICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgU1VCX0xPTkcoIGFyZ3NbMV0sIGRpc3RhbmNlICkgKTsKLQotICAgIGV4Yy0+R1MucnAxID0gZXhjLT5HUy5ycDA7Ci0gICAgZXhjLT5HUy5ycDIgPSBwb2ludDsKLQotICAgIGlmICggKCBleGMtPm9wY29kZSAmIDEgKSAhPSAwICkKLSAgICAgIGV4Yy0+R1MucnAwID0gcG9pbnQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTURBUFthXTogICAgICBNb3ZlIERpcmVjdCBBYnNvbHV0ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyRS0weDJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NREFQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgcG9pbnQ7Ci0gICAgRlRfRjI2RG90NiAgY3VyX2Rpc3Q7Ci0gICAgRlRfRjI2RG90NiAgZGlzdGFuY2U7Ci0KLQotICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCBleGMtPnpwMC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoICggZXhjLT5vcGNvZGUgJiAxICkgIT0gMCApCi0gICAgewotICAgICAgY3VyX2Rpc3QgPSBGQVNUX1BST0pFQ1QoICZleGMtPnpwMC5jdXJbcG9pbnRdICk7Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICYmCi0gICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAmJgotICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgKQotICAgICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoCi0gICAgICAgICAgICAgICAgICAgICBleGMsCi0gICAgICAgICAgICAgICAgICAgICBjdXJfZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zWzBdICkgLSBjdXJfZGlzdDsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBkaXN0YW5jZSA9IGV4Yy0+ZnVuY19yb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgIGN1cl9kaXN0LAotICAgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbMF0gKSAtIGN1cl9kaXN0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICBkaXN0YW5jZSA9IDA7Ci0KLSAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDAsIHBvaW50LCBkaXN0YW5jZSApOwotCi0gICAgZXhjLT5HUy5ycDAgPSBwb2ludDsKLSAgICBleGMtPkdTLnJwMSA9IHBvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1JQVBbYV06ICAgICAgTW92ZSBJbmRpcmVjdCBBYnNvbHV0ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4M0UtMHgzRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTUlBUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICAgIGN2dEVudHJ5OwotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotICAgIEZUX0YyNkRvdDYgIGRpc3RhbmNlOwotICAgIEZUX0YyNkRvdDYgIG9yZ19kaXN0OwotICAgIEZUX0YyNkRvdDYgIGNvbnRyb2xfdmFsdWVfY3V0aW47Ci0KLQotICAgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSBleGMtPkdTLmNvbnRyb2xfdmFsdWVfY3V0aW47Ci0gICAgY3Z0RW50cnkgICAgICAgICAgICA9IChGVF9VTG9uZylhcmdzWzFdOwotICAgIHBvaW50ICAgICAgICAgICAgICAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICEoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX05PUk1BTF9ST1VORCApICkKLSAgICAgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSAwOwotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KLSAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICBleGMtPnpwMC5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFNMKCBjdnRFbnRyeSwgZXhjLT5jdnRTaXplICkgICAgICApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogVU5ET0NVTUVOVEVEISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhlIGJlaGF2aW91ciBvZiBhbiBNSUFQIGluc3RydWN0aW9uIGlzIHF1aXRlIGRpZmZlcmVudCB3aGVuIHVzZWQgICovCi0gICAgLyogaW4gdGhlIHR3aWxpZ2h0IHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogRmlyc3QsIG5vIGNvbnRyb2wgdmFsdWUgY3V0LWluIHRlc3QgaXMgcGVyZm9ybWVkIGFzIGl0IHdvdWxkIGZhaWwgICovCi0gICAgLyogYW55d2F5LiAgU2Vjb25kLCB0aGUgb3JpZ2luYWwgcG9pbnQsIGkuZS4gKG9yZ194LG9yZ195KSBvZiAgICAgICAgICovCi0gICAgLyogenAwLnBvaW50LCBpcyBzZXQgdG8gdGhlIGFic29sdXRlLCB1bnJvdW5kZWQgZGlzdGFuY2UgZm91bmQgaW4gdGhlICovCi0gICAgLyogQ1ZULiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhpcyBpcyB1c2VkIGluIHRoZSBDVlQgcHJvZ3JhbXMgb2YgdGhlIE1pY3Jvc29mdCBmb250cyBBcmlhbCwgICAgICovCi0gICAgLyogVGltZXMsIGV0Yy4sIGluIG9yZGVyIHRvIHJlLWFkanVzdCBzb21lIGtleSBmb250IGhlaWdodHMuICBJdCAgICAgICovCi0gICAgLyogYWxsb3dzIHRoZSB1c2Ugb2YgdGhlIElQIGluc3RydWN0aW9uIGluIHRoZSB0d2lsaWdodCB6b25lLCB3aGljaCAgICovCi0gICAgLyogb3RoZXJ3aXNlIHdvdWxkIGJlIGludmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2UgaW1wbGVtZW50IGl0IHdpdGggYSBzcGVjaWFsIHNlcXVlbmNlIGZvciB0aGUgdHdpbGlnaHQgem9uZS4gICAgICovCi0gICAgLyogVGhpcyBpcyBhIGJhZCBoYWNrLCBidXQgaXQgc2VlbXMgdG8gd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogQ29uZmlybWVkIGJ5IEdyZWcgSGl0Y2hjb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBkaXN0YW5jZSA9IGV4Yy0+ZnVuY19yZWFkX2N2dCggZXhjLCBjdnRFbnRyeSApOwotCi0gICAgaWYgKCBleGMtPkdTLmdlcDAgPT0gMCApICAgLyogSWYgaW4gdHdpbGlnaHQgem9uZSAqLwotICAgIHsKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgICAgLyogT25seSBhZGp1c3QgaWYgbm90IGluIHNwaF9jb21wYXRpYmlsaXR5X21vZGUgb3IgaWdub3JlX3hfbW9kZS4gKi8KLSAgICAgIC8qIERldGVybWluZWQgdmlhIGV4cGVyaW1lbnRhdGlvbiBhbmQgbWF5IGJlIGluY29ycmVjdC4uLiAgICAgICAgICovCi0gICAgICBpZiAoICEoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgKCBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgKSApICkKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotICAgICAgICBleGMtPnpwMC5vcmdbcG9pbnRdLnggPSBUVF9NdWxGaXgxNCggZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCApOwotICAgICAgZXhjLT56cDAub3JnW3BvaW50XS55ID0gVFRfTXVsRml4MTQoIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICksCi0gICAgICBleGMtPnpwMC5jdXJbcG9pbnRdICAgPSBleGMtPnpwMC5vcmdbcG9pbnRdOwotICAgIH0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19NSUFQX0hBQ0sgKSAmJgotICAgICAgICAgZGlzdGFuY2UgPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICBkaXN0YW5jZSA9IDA7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIG9yZ19kaXN0ID0gRkFTVF9QUk9KRUNUKCAmZXhjLT56cDAuY3VyW3BvaW50XSApOwotCi0gICAgaWYgKCAoIGV4Yy0+b3Bjb2RlICYgMSApICE9IDAgKSAgIC8qIHJvdW5kaW5nIGFuZCBjb250cm9sIGN1dC1pbiBmbGFnICovCi0gICAgewotICAgICAgaWYgKCBGVF9BQlMoIGRpc3RhbmNlIC0gb3JnX2Rpc3QgKSA+IGNvbnRyb2xfdmFsdWVfY3V0aW4gKQotICAgICAgICBkaXN0YW5jZSA9IG9yZ19kaXN0OwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICYmCi0gICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAmJgotICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgKQotICAgICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIGRpc3RhbmNlID0gZXhjLT5mdW5jX3JvdW5kKCBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zWzBdICk7Ci0gICAgfQotCi0gICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAwLCBwb2ludCwgZGlzdGFuY2UgLSBvcmdfZGlzdCApOwotCi0gIEZhaWw6Ci0gICAgZXhjLT5HUy5ycDAgPSBwb2ludDsKLSAgICBleGMtPkdTLnJwMSA9IHBvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1EUlBbYWJjZGVdOiAgTW92ZSBEaXJlY3QgUmVsYXRpdmUgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4QzAtMHhERiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTURSUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50ID0gMDsKLSAgICBGVF9GMjZEb3Q2ICBvcmdfZGlzdCwgZGlzdGFuY2UsIG1pbmltdW1fZGlzdGFuY2U7Ci0KLQotICAgIG1pbmltdW1fZGlzdGFuY2UgPSBleGMtPkdTLm1pbmltdW1fZGlzdGFuY2U7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9STUFMX1JPVU5EICkgKQotICAgICAgbWluaW11bV9kaXN0YW5jZSA9IDA7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCAgICAgICBleGMtPnpwMS5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIGV4Yy0+R1MucnAwLCBleGMtPnpwMC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiBYWFg6IElzIHRoZXJlIHNvbWUgdW5kb2N1bWVudGVkIGZlYXR1cmUgd2hpbGUgaW4gdGhlICovCi0gICAgLyogICAgICB0d2lsaWdodCB6b25lPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IHR3aWxpZ2h0IHpvbmUgc3BlY2lhbCBjYXNlICovCi0KLSAgICBpZiAoIGV4Yy0+R1MuZ2VwMCA9PSAwIHx8IGV4Yy0+R1MuZ2VwMSA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICB2ZWMxID0gJmV4Yy0+enAxLm9yZ1twb2ludF07Ci0gICAgICBGVF9WZWN0b3IqICB2ZWMyID0gJmV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMF07Ci0KLQotICAgICAgb3JnX2Rpc3QgPSBEVUFMUFJPSiggdmVjMSwgdmVjMiApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjMSA9ICZleGMtPnpwMS5vcnVzW3BvaW50XTsKLSAgICAgIEZUX1ZlY3RvciogIHZlYzIgPSAmZXhjLT56cDAub3J1c1tleGMtPkdTLnJwMF07Ci0KLQotICAgICAgaWYgKCBleGMtPm1ldHJpY3MueF9zY2FsZSA9PSBleGMtPm1ldHJpY3MueV9zY2FsZSApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgc2hvdWxkIGJlIGZhc3RlciAqLwotICAgICAgICBvcmdfZGlzdCA9IERVQUxQUk9KKCB2ZWMxLCB2ZWMyICk7Ci0gICAgICAgIG9yZ19kaXN0ID0gRlRfTXVsRml4KCBvcmdfZGlzdCwgZXhjLT5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICB2ZWMueCA9IEZUX011bEZpeCggU1VCX0xPTkcoIHZlYzEtPngsIHZlYzItPnggKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+bWV0cmljcy54X3NjYWxlICk7Ci0gICAgICAgIHZlYy55ID0gRlRfTXVsRml4KCBTVUJfTE9ORyggdmVjMS0+eSwgdmVjMi0+eSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5tZXRyaWNzLnlfc2NhbGUgKTsKLQotICAgICAgICBvcmdfZGlzdCA9IEZBU1RfRFVBTFBST0ooICZ2ZWMgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzaW5nbGUgd2lkdGggY3V0LWluIHRlc3QgKi8KLQotICAgIGlmICggRlRfQUJTKCBvcmdfZGlzdCAtIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlICkgPAotICAgICAgICAgZXhjLT5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gKQotICAgIHsKLSAgICAgIGlmICggb3JnX2Rpc3QgPj0gMCApCi0gICAgICAgIG9yZ19kaXN0ID0gZXhjLT5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7Ci0gICAgICBlbHNlCi0gICAgICAgIG9yZ19kaXN0ID0gLWV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlOwotICAgIH0KLQotICAgIC8qIHJvdW5kIGZsYWcgKi8KLQotICAgIGlmICggKCBleGMtPm9wY29kZSAmIDQgKSAhPSAwICkKLSAgICB7Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICYmCi0gICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAmJgotICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgKQotICAgICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoCi0gICAgICAgICAgICAgICAgICAgICBleGMsCi0gICAgICAgICAgICAgICAgICAgICBvcmdfZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlICYgM10gKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBkaXN0YW5jZSA9IGV4Yy0+ZnVuY19yb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgIG9yZ19kaXN0LAotICAgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgJiAzXSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoCi0gICAgICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgICAgIG9yZ19kaXN0LAotICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlICYgM10gKTsKLQotICAgIC8qIG1pbmltdW0gZGlzdGFuY2UgZmxhZyAqLwotCi0gICAgaWYgKCAoIGV4Yy0+b3Bjb2RlICYgOCApICE9IDAgKQotICAgIHsKLSAgICAgIGlmICggb3JnX2Rpc3QgPj0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZGlzdGFuY2UgPCBtaW5pbXVtX2Rpc3RhbmNlICkKLSAgICAgICAgICBkaXN0YW5jZSA9IG1pbmltdW1fZGlzdGFuY2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggZGlzdGFuY2UgPiAtbWluaW11bV9kaXN0YW5jZSApCi0gICAgICAgICAgZGlzdGFuY2UgPSAtbWluaW11bV9kaXN0YW5jZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBub3cgbW92ZSB0aGUgcG9pbnQgKi8KLQotICAgIG9yZ19kaXN0ID0gUFJPSkVDVCggZXhjLT56cDEuY3VyICsgcG9pbnQsIGV4Yy0+enAwLmN1ciArIGV4Yy0+R1MucnAwICk7Ci0KLSAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDEsIHBvaW50LCBTVUJfTE9ORyggZGlzdGFuY2UsIG9yZ19kaXN0ICkgKTsKLQotICBGYWlsOgotICAgIGV4Yy0+R1MucnAxID0gZXhjLT5HUy5ycDA7Ci0gICAgZXhjLT5HUy5ycDIgPSBwb2ludDsKLQotICAgIGlmICggKCBleGMtPm9wY29kZSAmIDE2ICkgIT0gMCApCi0gICAgICBleGMtPkdTLnJwMCA9IHBvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1JUlBbYWJjZGVdOiAgTW92ZSBJbmRpcmVjdCBSZWxhdGl2ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4RTAtMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTUlSUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotICAgIEZUX1VMb25nICAgIGN2dEVudHJ5OwotCi0gICAgRlRfRjI2RG90NiAgY3Z0X2Rpc3QsCi0gICAgICAgICAgICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgY3VyX2Rpc3QsCi0gICAgICAgICAgICAgICAgb3JnX2Rpc3QsCi0gICAgICAgICAgICAgICAgY29udHJvbF92YWx1ZV9jdXRpbiwKLSAgICAgICAgICAgICAgICBtaW5pbXVtX2Rpc3RhbmNlOwotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgRlRfSW50ICAgICAgQjEgICAgICAgICAgID0gMDsgLyogcGFjaWZ5IGNvbXBpbGVyICovCi0gICAgRlRfSW50ICAgICAgQjIgICAgICAgICAgID0gMDsKLSAgICBGVF9Cb29sICAgICByZXZlcnNlX21vdmUgPSBGQUxTRTsKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0KLSAgICBtaW5pbXVtX2Rpc3RhbmNlICAgID0gZXhjLT5HUy5taW5pbXVtX2Rpc3RhbmNlOwotICAgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSBleGMtPkdTLmNvbnRyb2xfdmFsdWVfY3V0aW47Ci0gICAgcG9pbnQgICAgICAgICAgICAgICA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgICBjdnRFbnRyeSAgICAgICAgICAgID0gKEZUX1VMb25nKSggYXJnc1sxXSArIDEgKTsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCi0gICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gbWluaW11bV9kaXN0YW5jZSA9IDA7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBjdnRbLTFdID0gMCBhbHdheXMgKi8KLQotICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTTCggY3Z0RW50cnksICAgZXhjLT5jdnRTaXplICsgMSApICB8fAotICAgICAgICAgQk9VTkRTKCBleGMtPkdTLnJwMCwgZXhjLT56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgaWYgKCAhY3Z0RW50cnkgKQotICAgICAgY3Z0X2Rpc3QgPSAwOwotICAgIGVsc2UKLSAgICAgIGN2dF9kaXN0ID0gZXhjLT5mdW5jX3JlYWRfY3Z0KCBleGMsIGN2dEVudHJ5IC0gMSApOwotCi0gICAgLyogc2luZ2xlIHdpZHRoIHRlc3QgKi8KLQotICAgIGlmICggRlRfQUJTKCBjdnRfZGlzdCAtIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlICkgPAotICAgICAgICAgZXhjLT5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gKQotICAgIHsKLSAgICAgIGlmICggY3Z0X2Rpc3QgPj0gMCApCi0gICAgICAgIGN2dF9kaXN0ID0gIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlOwotICAgICAgZWxzZQotICAgICAgICBjdnRfZGlzdCA9IC1leGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGUgTVMgcmFzdGVyaXplciBkb2VzIHRoYXQgd2l0aCAqLwotICAgIC8qIHR3aWxpZ2h0IHBvaW50cyAoY29uZmlybWVkIGJ5IEdyZWcgSGl0Y2hjb2NrKSAgICovCi0gICAgaWYgKCBleGMtPkdTLmdlcDEgPT0gMCApCi0gICAgewotICAgICAgZXhjLT56cDEub3JnW3BvaW50XS54ID0gZXhjLT56cDAub3JnW2V4Yy0+R1MucnAwXS54ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX011bEZpeDE0KCBjdnRfZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCApOwotICAgICAgZXhjLT56cDEub3JnW3BvaW50XS55ID0gZXhjLT56cDAub3JnW2V4Yy0+R1MucnAwXS55ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX011bEZpeDE0KCBjdnRfZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSApOwotICAgICAgZXhjLT56cDEuY3VyW3BvaW50XSAgID0gZXhjLT56cDEub3JnW3BvaW50XTsKLSAgICB9Ci0KLSAgICBvcmdfZGlzdCA9IERVQUxQUk9KKCAmZXhjLT56cDEub3JnW3BvaW50XSwgJmV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMF0gKTsKLSAgICBjdXJfZGlzdCA9IFBST0pFQ1QgKCAmZXhjLT56cDEuY3VyW3BvaW50XSwgJmV4Yy0+enAwLmN1cltleGMtPkdTLnJwMF0gKTsKLQotICAgIC8qIGF1dG8tZmxpcCB0ZXN0ICovCi0KLSAgICBpZiAoIGV4Yy0+R1MuYXV0b19mbGlwICkKLSAgICB7Ci0gICAgICBpZiAoICggb3JnX2Rpc3QgXiBjdnRfZGlzdCApIDwgMCApCi0gICAgICAgIGN2dF9kaXN0ID0gLWN2dF9kaXN0OwotICAgIH0KLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1RJTUVTX05FV19ST01BTl9IQUNLICkgKQotICAgIHsKLSAgICAgIGlmICggY3VyX2Rpc3QgPCAtNjQgKQotICAgICAgICBjdnRfZGlzdCAtPSAxNjsKLSAgICAgIGVsc2UgaWYgKCBjdXJfZGlzdCA+IDY0ICYmIGN1cl9kaXN0IDwgODQgKQotICAgICAgICBjdnRfZGlzdCArPSAzMjsKLSAgICB9Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIC8qIGNvbnRyb2wgdmFsdWUgY3V0LWluIGFuZCByb3VuZCAqLwotCi0gICAgaWYgKCAoIGV4Yy0+b3Bjb2RlICYgNCApICE9IDAgKQotICAgIHsKLSAgICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISAgT25seSBwZXJmb3JtIGN1dC1pbiB0ZXN0IHdoZW4gYm90aCBwb2ludHMgKi8KLSAgICAgIC8qICAgICAgcmVmZXIgdG8gdGhlIHNhbWUgem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBleGMtPkdTLmdlcDAgPT0gZXhjLT5HUy5nZXAxICkKLSAgICAgIHsKLSAgICAgICAgLyogWFhYOiBBY2NvcmRpbmcgdG8gR3JlZyBIaXRjaGNvY2ssIHRoZSBmb2xsb3dpbmcgd29yZGluZyBpcyAqLwotICAgICAgICAvKiAgICAgIHRoZSByaWdodCBvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgIFdoZW4gdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWUgaW4gICAqLwotICAgICAgICAvKiAgICAgICAgdGhlIHRhYmxlIFtDVlRdIGFuZCB0aGUgbWVhc3VyZW1lbnQgZGlyZWN0bHkgZnJvbSAgICovCi0gICAgICAgIC8qICAgICAgICB0aGUgb3V0bGluZSBpcyBfZ3JlYXRlcl8gdGhhbiB0aGUgY3V0X2luIHZhbHVlLCB0aGUgKi8KLSAgICAgICAgLyogICAgICAgIG91dGxpbmUgbWVhc3VyZW1lbnQgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgVGhpcyBpcyBmcm9tIGBpbnN0Z2x5LmRvYycuICBUaGUgZGVzY3JpcHRpb24gaW4gICAgICAgKi8KLSAgICAgICAgLyogICAgICBgdHRpbnN0Mi5kb2MnLCB2ZXJzaW9uIDEuNjYsIGlzIHRodXMgaW5jb3JyZWN0IHNpbmNlICAqLwotICAgICAgICAvKiAgICAgIGl0IGltcGxpZXMgYD49JyBpbnN0ZWFkIG9mIGA+Jy4gICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgaWYgKCBGVF9BQlMoIGN2dF9kaXN0IC0gb3JnX2Rpc3QgKSA+IGNvbnRyb2xfdmFsdWVfY3V0aW4gKQotICAgICAgICAgIGN2dF9kaXN0ID0gb3JnX2Rpc3Q7Ci0gICAgICB9Ci0KLSAgICAgIGRpc3RhbmNlID0gZXhjLT5mdW5jX3JvdW5kKAotICAgICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICAgICBjdnRfZGlzdCwKLSAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tleGMtPm9wY29kZSAmIDNdICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgICAgLyogZG8gY3Z0IGN1dC1pbiBhbHdheXMgaW4gTUlSUCBmb3Igc3BoICovCi0gICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAgJiYKLSAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAmJgotICAgICAgICAgICBleGMtPkdTLmdlcDAgPT0gZXhjLT5HUy5nZXAxICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9BQlMoIGN2dF9kaXN0IC0gb3JnX2Rpc3QgKSA+IGNvbnRyb2xfdmFsdWVfY3V0aW4gKQotICAgICAgICAgIGN2dF9kaXN0ID0gb3JnX2Rpc3Q7Ci0gICAgICB9Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgICAgZGlzdGFuY2UgPSBSb3VuZF9Ob25lKAotICAgICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICAgICBjdnRfZGlzdCwKLSAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tleGMtPm9wY29kZSAmIDNdICk7Ci0gICAgfQotCi0gICAgLyogbWluaW11bSBkaXN0YW5jZSB0ZXN0ICovCi0KLSAgICBpZiAoICggZXhjLT5vcGNvZGUgJiA4ICkgIT0gMCApCi0gICAgewotICAgICAgaWYgKCBvcmdfZGlzdCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaXN0YW5jZSA8IG1pbmltdW1fZGlzdGFuY2UgKQotICAgICAgICAgIGRpc3RhbmNlID0gbWluaW11bV9kaXN0YW5jZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaXN0YW5jZSA+IC1taW5pbXVtX2Rpc3RhbmNlICkKLSAgICAgICAgICBkaXN0YW5jZSA9IC1taW5pbXVtX2Rpc3RhbmNlOwotICAgICAgfQotICAgIH0KLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKQotICAgIHsKLSAgICAgIEIxID0gZXhjLT56cDEuY3VyW3BvaW50XS55OwotCi0gICAgICAvKiBSb3VuZCBtb3ZlcyBpZiBuZWNlc3NhcnkgKi8KLSAgICAgIGlmICggZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19ST1VORF9OT05QSVhFTF9ZX01PVkVTICkgKQotICAgICAgICBkaXN0YW5jZSA9IEZUX1BJWF9ST1VORCggQjEgKyBkaXN0YW5jZSAtIGN1cl9kaXN0ICkgLSBCMSArIGN1cl9kaXN0OwotCi0gICAgICBpZiAoIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIGV4Yy0+b3Bjb2RlICYgMTYgKSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggZXhjLT5vcGNvZGUgJiA4ICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19DT1VSSUVSX05FV18yX0hBQ0sgKSApCi0gICAgICAgIGRpc3RhbmNlICs9IDY0OwotICAgIH0KLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0gICAgZXhjLT5mdW5jX21vdmUoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgJmV4Yy0+enAxLAotICAgICAgICAgICAgICAgICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgU1VCX0xPTkcoIGRpc3RhbmNlLCBjdXJfZGlzdCApICk7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKLSAgICB7Ci0gICAgICBCMiA9IGV4Yy0+enAxLmN1cltwb2ludF0ueTsKLQotICAgICAgLyogUmV2ZXJzZSBtb3ZlIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAmJgotICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAmJgotICAgICAgICAgICAgICggQjEgJiA2MyApID09IDAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgcmV2ZXJzZV9tb3ZlID0gVFJVRTsKLQotICAgICAgICBpZiAoICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfU0tJUF9OT05QSVhFTF9ZX01PVkVTICkgJiYKLSAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBCMiAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggQjEgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgIHJldmVyc2VfbW92ZSA9IFRSVUU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcmV2ZXJzZV9tb3ZlICkKLSAgICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAxLCBwb2ludCwgLSggZGlzdGFuY2UgLSBjdXJfZGlzdCApICk7Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICBGYWlsOgotICAgIGV4Yy0+R1MucnAxID0gZXhjLT5HUy5ycDA7Ci0KLSAgICBpZiAoICggZXhjLT5vcGNvZGUgJiAxNiApICE9IDAgKQotICAgICAgZXhjLT5HUy5ycDAgPSBwb2ludDsKLQotICAgIGV4Yy0+R1MucnAyID0gcG9pbnQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQUxJR05SUFtdOiAgICBBTElHTiBSZWxhdGl2ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19BTElHTlJQKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotICAgIEZUX0YyNkRvdDYgIGRpc3RhbmNlOwotCi0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT19BTElHTlJQX0FGVEVSX0lVUCApICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KLSAgICBpZiAoIGV4Yy0+dG9wIDwgZXhjLT5HUy5sb29wICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIEJPVU5EUyggZXhjLT5HUy5ycDAsIGV4Yy0+enAwLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIHdoaWxlICggZXhjLT5HUy5sb29wID4gMCApCi0gICAgewotICAgICAgZXhjLT5hcmdzLS07Ci0KLSAgICAgIHBvaW50ID0gKEZUX1VTaG9ydClleGMtPnN0YWNrW2V4Yy0+YXJnc107Ci0KLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgZXhjLT56cDEubl9wb2ludHMgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGlzdGFuY2UgPSBQUk9KRUNUKCBleGMtPnpwMS5jdXIgKyBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnpwMC5jdXIgKyBleGMtPkdTLnJwMCApOwotCi0gICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMSwgcG9pbnQsIC1kaXN0YW5jZSApOwotICAgICAgfQotCi0gICAgICBleGMtPkdTLmxvb3AtLTsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBleGMtPkdTLmxvb3AgPSAxOwotICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJU0VDVFtdOiAgICAgIG1vdmVzIHBvaW50IHRvIEludGVyU0VDVGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgNSAqIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0lTRUNUKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50LAotICAgICAgICAgICAgICAgIGEwLCBhMSwKLSAgICAgICAgICAgICAgICBiMCwgYjE7Ci0KLSAgICBGVF9GMjZEb3Q2ICBkaXNjcmltaW5hbnQsIGRvdHByb2R1Y3Q7Ci0KLSAgICBGVF9GMjZEb3Q2ICBkeCwgIGR5LAotICAgICAgICAgICAgICAgIGRheCwgZGF5LAotICAgICAgICAgICAgICAgIGRieCwgZGJ5OwotCi0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0gICAgRlRfVmVjdG9yICAgUjsKLQotCi0gICAgcG9pbnQgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSAgICBhMCA9IChGVF9VU2hvcnQpYXJnc1sxXTsKLSAgICBhMSA9IChGVF9VU2hvcnQpYXJnc1syXTsKLSAgICBiMCA9IChGVF9VU2hvcnQpYXJnc1szXTsKLSAgICBiMSA9IChGVF9VU2hvcnQpYXJnc1s0XTsKLQotICAgIGlmICggQk9VTkRTKCBiMCwgICAgZXhjLT56cDAubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBiMSwgICAgZXhjLT56cDAubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBhMCwgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBhMSwgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBwb2ludCwgZXhjLT56cDIubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogQ3JhbWVyJ3MgcnVsZSAqLwotCi0gICAgZGJ4ID0gU1VCX0xPTkcoIGV4Yy0+enAwLmN1cltiMV0ueCwgZXhjLT56cDAuY3VyW2IwXS54ICk7Ci0gICAgZGJ5ID0gU1VCX0xPTkcoIGV4Yy0+enAwLmN1cltiMV0ueSwgZXhjLT56cDAuY3VyW2IwXS55ICk7Ci0KLSAgICBkYXggPSBTVUJfTE9ORyggZXhjLT56cDEuY3VyW2ExXS54LCBleGMtPnpwMS5jdXJbYTBdLnggKTsKLSAgICBkYXkgPSBTVUJfTE9ORyggZXhjLT56cDEuY3VyW2ExXS55LCBleGMtPnpwMS5jdXJbYTBdLnkgKTsKLQotICAgIGR4ID0gU1VCX0xPTkcoIGV4Yy0+enAwLmN1cltiMF0ueCwgZXhjLT56cDEuY3VyW2EwXS54ICk7Ci0gICAgZHkgPSBTVUJfTE9ORyggZXhjLT56cDAuY3VyW2IwXS55LCBleGMtPnpwMS5jdXJbYTBdLnkgKTsKLQotICAgIGRpc2NyaW1pbmFudCA9IEFERF9MT05HKCBGVF9NdWxEaXYoIGRheCwgLWRieSwgMHg0MCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGRheSwgZGJ4LCAweDQwICkgKTsKLSAgICBkb3Rwcm9kdWN0ICAgPSBBRERfTE9ORyggRlRfTXVsRGl2KCBkYXgsIGRieCwgMHg0MCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGRheSwgZGJ5LCAweDQwICkgKTsKLQotICAgIC8qIFRoZSBkaXNjcmltaW5hbnQgYWJvdmUgaXMgYWN0dWFsbHkgYSBjcm9zcyBwcm9kdWN0IG9mIHZlY3RvcnMgICAgICovCi0gICAgLyogZGEgYW5kIGRiLiBUb2dldGhlciB3aXRoIHRoZSBkb3QgcHJvZHVjdCwgdGhleSBjYW4gYmUgdXNlZCBhcyAgICAgKi8KLSAgICAvKiBzdXJyb2dhdGVzIGZvciBzaW5lIGFuZCBjb3NpbmUgb2YgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHZlY3RvcnMuICAqLwotICAgIC8qIEluZGVlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgZG90cHJvZHVjdCAgID0gfGRhfHxkYnxjb3MoYW5nbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICBkaXNjcmltaW5hbnQgPSB8ZGF8fGRifHNpbihhbmdsZSkgICAgIC4gICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIHVzZSB0aGVzZSBlcXVhdGlvbnMgdG8gcmVqZWN0IGdyYXppbmcgaW50ZXJzZWN0aW9ucyBieSAgICAgICAgICovCi0gICAgLyogdGhyZXNob2xkaW5nIGFicyh0YW4oYW5nbGUpKSBhdCAxLzE5LCBjb3JyZXNwb25kaW5nIHRvIDMgZGVncmVlcy4gKi8KLSAgICBpZiAoIE1VTF9MT05HKCAxOSwgRlRfQUJTKCBkaXNjcmltaW5hbnQgKSApID4gRlRfQUJTKCBkb3Rwcm9kdWN0ICkgKQotICAgIHsKLSAgICAgIHZhbCA9IEFERF9MT05HKCBGVF9NdWxEaXYoIGR4LCAtZGJ5LCAweDQwICksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBkeSwgZGJ4LCAweDQwICkgKTsKLQotICAgICAgUi54ID0gRlRfTXVsRGl2KCB2YWwsIGRheCwgZGlzY3JpbWluYW50ICk7Ci0gICAgICBSLnkgPSBGVF9NdWxEaXYoIHZhbCwgZGF5LCBkaXNjcmltaW5hbnQgKTsKLQotICAgICAgLyogWFhYOiBCbG9jayBpbiBiYWNrd2FyZF9jb21wYXRpYmlsaXR5IGFuZC9vciBwb3N0LUlVUD8gKi8KLSAgICAgIGV4Yy0+enAyLmN1cltwb2ludF0ueCA9IEFERF9MT05HKCBleGMtPnpwMS5jdXJbYTBdLngsIFIueCApOwotICAgICAgZXhjLT56cDIuY3VyW3BvaW50XS55ID0gQUREX0xPTkcoIGV4Yy0+enAxLmN1clthMF0ueSwgUi55ICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBlbHNlLCB0YWtlIHRoZSBtaWRkbGUgb2YgdGhlIG1pZGRsZXMgb2YgQSBhbmQgQiAqLwotCi0gICAgICAvKiBYWFg6IEJsb2NrIGluIGJhY2t3YXJkX2NvbXBhdGliaWxpdHkgYW5kL29yIHBvc3QtSVVQPyAqLwotICAgICAgZXhjLT56cDIuY3VyW3BvaW50XS54ID0KLSAgICAgICAgQUREX0xPTkcoIEFERF9MT05HKCBleGMtPnpwMS5jdXJbYTBdLngsIGV4Yy0+enAxLmN1clthMV0ueCApLAotICAgICAgICAgICAgICAgICAgQUREX0xPTkcoIGV4Yy0+enAwLmN1cltiMF0ueCwgZXhjLT56cDAuY3VyW2IxXS54ICkgKSAvIDQ7Ci0gICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnkgPQotICAgICAgICBBRERfTE9ORyggQUREX0xPTkcoIGV4Yy0+enAxLmN1clthMF0ueSwgZXhjLT56cDEuY3VyW2ExXS55ICksCi0gICAgICAgICAgICAgICAgICBBRERfTE9ORyggZXhjLT56cDAuY3VyW2IwXS55LCBleGMtPnpwMC5jdXJbYjFdLnkgKSApIC8gNDsKLSAgICB9Ci0KLSAgICBleGMtPnpwMi50YWdzW3BvaW50XSB8PSBGVF9DVVJWRV9UQUdfVE9VQ0hfQk9USDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBTElHTlBUU1tdOiAgIEFMSUdOIFBvaW5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0FMSUdOUFRTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHAxLCBwMjsKLSAgICBGVF9GMjZEb3Q2ICBkaXN0YW5jZTsKLQotCi0gICAgcDEgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gICAgcDIgPSAoRlRfVVNob3J0KWFyZ3NbMV07Ci0KLSAgICBpZiAoIEJPVU5EUyggcDEsIGV4Yy0+enAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggcDIsIGV4Yy0+enAwLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRpc3RhbmNlID0gUFJPSkVDVCggZXhjLT56cDAuY3VyICsgcDIsIGV4Yy0+enAxLmN1ciArIHAxICkgLyAyOwotCi0gICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAxLCBwMSwgZGlzdGFuY2UgKTsKLSAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDAsIHAyLCAtZGlzdGFuY2UgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJUFtdOiAgICAgICAgIEludGVycG9sYXRlIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBTT01FVElNRVMsIERVTUJFUiBDT0RFIElTIEJFVFRFUiBDT0RFICovCi0KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0lQKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIEZUX0YyNkRvdDYgIG9sZF9yYW5nZSwgY3VyX3JhbmdlOwotICAgIEZUX1ZlY3RvciogIG9ydXNfYmFzZTsKLSAgICBGVF9WZWN0b3IqICBjdXJfYmFzZTsKLSAgICBGVF9JbnQgICAgICB0d2lsaWdodDsKLQotCi0gICAgaWYgKCBleGMtPnRvcCA8IGV4Yy0+R1MubG9vcCApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXZSBuZWVkIHRvIGRlYWwgaW4gYSBzcGVjaWFsIHdheSB3aXRoIHRoZSB0d2lsaWdodCB6b25lLgotICAgICAqIE90aGVyd2lzZSwgYnkgZGVmaW5pdGlvbiwgdGhlIHZhbHVlIG9mIGV4Yy0+dHdpbGlnaHQub3J1c1tuXSBpcyAoMCwwKSwKLSAgICAgKiBmb3IgZXZlcnkgbi4KLSAgICAgKi8KLSAgICB0d2lsaWdodCA9ICggZXhjLT5HUy5nZXAwID09IDAgfHwKLSAgICAgICAgICAgICAgICAgZXhjLT5HUy5nZXAxID09IDAgfHwKLSAgICAgICAgICAgICAgICAgZXhjLT5HUy5nZXAyID09IDAgKTsKLQotICAgIGlmICggQk9VTkRTKCBleGMtPkdTLnJwMSwgZXhjLT56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgaWYgKCB0d2lsaWdodCApCi0gICAgICBvcnVzX2Jhc2UgPSAmZXhjLT56cDAub3JnW2V4Yy0+R1MucnAxXTsKLSAgICBlbHNlCi0gICAgICBvcnVzX2Jhc2UgPSAmZXhjLT56cDAub3J1c1tleGMtPkdTLnJwMV07Ci0KLSAgICBjdXJfYmFzZSA9ICZleGMtPnpwMC5jdXJbZXhjLT5HUy5ycDFdOwotCi0gICAgLyogWFhYOiBUaGVyZSBhcmUgc29tZSBnbHlwaHMgaW4gc29tZSBicmFpbmRlYWQgYnV0IHBvcHVsYXIgKi8KLSAgICAvKiAgICAgIGZvbnRzIG91dCB0aGVyZSAoZS5nLiBbYWV1XWdyYXZlIGluIG1vbm90eXBlLnR0ZikgICAqLwotICAgIC8qICAgICAgY2FsbGluZyBJUFtdIHdpdGggYmFkIHZhbHVlcyBvZiBycFsxMl0uICAgICAgICAgICAgICovCi0gICAgLyogICAgICBEbyBzb21ldGhpbmcgc2FuZSB3aGVuIHRoaXMgb2RkIHRoaW5nIGhhcHBlbnMuICAgICAgKi8KLSAgICBpZiAoIEJPVU5EUyggZXhjLT5HUy5ycDEsIGV4Yy0+enAwLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggZXhjLT5HUy5ycDIsIGV4Yy0+enAxLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIG9sZF9yYW5nZSA9IDA7Ci0gICAgICBjdXJfcmFuZ2UgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCB0d2lsaWdodCApCi0gICAgICAgIG9sZF9yYW5nZSA9IERVQUxQUk9KKCAmZXhjLT56cDEub3JnW2V4Yy0+R1MucnAyXSwgb3J1c19iYXNlICk7Ci0gICAgICBlbHNlIGlmICggZXhjLT5tZXRyaWNzLnhfc2NhbGUgPT0gZXhjLT5tZXRyaWNzLnlfc2NhbGUgKQotICAgICAgICBvbGRfcmFuZ2UgPSBEVUFMUFJPSiggJmV4Yy0+enAxLm9ydXNbZXhjLT5HUy5ycDJdLCBvcnVzX2Jhc2UgKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICB2ZWMueCA9IEZUX011bEZpeCggU1VCX0xPTkcoIGV4Yy0+enAxLm9ydXNbZXhjLT5HUy5ycDJdLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3J1c19iYXNlLT54ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPm1ldHJpY3MueF9zY2FsZSApOwotICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggU1VCX0xPTkcoIGV4Yy0+enAxLm9ydXNbZXhjLT5HUy5ycDJdLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3J1c19iYXNlLT55ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPm1ldHJpY3MueV9zY2FsZSApOwotCi0gICAgICAgIG9sZF9yYW5nZSA9IEZBU1RfRFVBTFBST0ooICZ2ZWMgKTsKLSAgICAgIH0KLQotICAgICAgY3VyX3JhbmdlID0gUFJPSkVDVCggJmV4Yy0+enAxLmN1cltleGMtPkdTLnJwMl0sIGN1cl9iYXNlICk7Ci0gICAgfQotCi0gICAgZm9yICggOyBleGMtPkdTLmxvb3AgPiAwOyBleGMtPkdTLmxvb3AtLSApCi0gICAgewotICAgICAgRlRfVUludCAgICAgcG9pbnQgPSAoRlRfVUludClleGMtPnN0YWNrWy0tZXhjLT5hcmdzXTsKLSAgICAgIEZUX0YyNkRvdDYgIG9yZ19kaXN0LCBjdXJfZGlzdCwgbmV3X2Rpc3Q7Ci0KLQotICAgICAgLyogY2hlY2sgcG9pbnQgYm91bmRzICovCi0gICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIHR3aWxpZ2h0ICkKLSAgICAgICAgb3JnX2Rpc3QgPSBEVUFMUFJPSiggJmV4Yy0+enAyLm9yZ1twb2ludF0sIG9ydXNfYmFzZSApOwotICAgICAgZWxzZSBpZiAoIGV4Yy0+bWV0cmljcy54X3NjYWxlID09IGV4Yy0+bWV0cmljcy55X3NjYWxlICkKLSAgICAgICAgb3JnX2Rpc3QgPSBEVUFMUFJPSiggJmV4Yy0+enAyLm9ydXNbcG9pbnRdLCBvcnVzX2Jhc2UgKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICB2ZWMueCA9IEZUX011bEZpeCggU1VCX0xPTkcoIGV4Yy0+enAyLm9ydXNbcG9pbnRdLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3J1c19iYXNlLT54ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPm1ldHJpY3MueF9zY2FsZSApOwotICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggU1VCX0xPTkcoIGV4Yy0+enAyLm9ydXNbcG9pbnRdLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3J1c19iYXNlLT55ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPm1ldHJpY3MueV9zY2FsZSApOwotCi0gICAgICAgIG9yZ19kaXN0ID0gRkFTVF9EVUFMUFJPSiggJnZlYyApOwotICAgICAgfQotCi0gICAgICBjdXJfZGlzdCA9IFBST0pFQ1QoICZleGMtPnpwMi5jdXJbcG9pbnRdLCBjdXJfYmFzZSApOwotCi0gICAgICBpZiAoIG9yZ19kaXN0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBvbGRfcmFuZ2UgKQotICAgICAgICAgIG5ld19kaXN0ID0gRlRfTXVsRGl2KCBvcmdfZGlzdCwgY3VyX3JhbmdlLCBvbGRfcmFuZ2UgKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBpcyB0aGUgc2FtZSBhcyB3aGF0IE1TIGRvZXMgZm9yIHRoZSBpbnZhbGlkIGNhc2U6ICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIGRlbHRhID0gKE9yaWdpbmFsX1B0IC0gT3JpZ2luYWxfUlAxKSAtICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgIChDdXJyZW50X1B0IC0gQ3VycmVudF9SUDEpICAgICAgICAgOyAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBJbiBGcmVlVHlwZSBzcGVhazogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgZGVsdGEgPSBvcmdfZGlzdCAtIGN1cl9kaXN0ICAgICAgICAgIC4gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogV2UgbW92ZSBgcG9pbnQnIGJ5IGBuZXdfZGlzdCAtIGN1cl9kaXN0JyBhZnRlciBsZWF2aW5nICAqLwotICAgICAgICAgIC8qIHRoaXMgYmxvY2ssIHRodXMgd2UgaGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICBuZXdfZGlzdCAtIGN1cl9kaXN0ID0gZGVsdGEgICAgICAgICAgICAgICAgICAgLCAgICAgICAqLwotICAgICAgICAgIC8qICAgbmV3X2Rpc3QgLSBjdXJfZGlzdCA9IG9yZ19kaXN0IC0gY3VyX2Rpc3QgICAgICwgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgbmV3X2Rpc3QgPSBvcmdfZGlzdCAgICAgICAgICAgICAgICAuICAgICAgICovCi0KLSAgICAgICAgICBuZXdfZGlzdCA9IG9yZ19kaXN0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIG5ld19kaXN0ID0gMDsKLQotICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAmZXhjLT56cDIsCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICBTVUJfTE9ORyggbmV3X2Rpc3QsIGN1cl9kaXN0ICkgKTsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBleGMtPkdTLmxvb3AgPSAxOwotICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVVFBbYV06ICAgICAgIFVuVG91Y2ggUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1VUUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICBwb2ludDsKLSAgICBGVF9CeXRlICAgIG1hc2s7Ci0KLQotICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCBleGMtPnpwMC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtYXNrID0gMHhGRjsKLQotICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCApCi0gICAgICBtYXNrICY9IH5GVF9DVVJWRV9UQUdfVE9VQ0hfWDsKLQotICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCi0gICAgICBtYXNrICY9IH5GVF9DVVJWRV9UQUdfVE9VQ0hfWTsKLQotICAgIGV4Yy0+enAwLnRhZ3NbcG9pbnRdICY9IG1hc2s7Ci0gIH0KLQotCi0gIC8qIExvY2FsIHZhcmlhYmxlcyBmb3IgSW5zX0lVUDogKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIElVUF9Xb3JrZXJSZWNfCi0gIHsKLSAgICBGVF9WZWN0b3IqICBvcmdzOyAgIC8qIG9yaWdpbmFsIGFuZCBjdXJyZW50IGNvb3JkaW5hdGUgKi8KLSAgICBGVF9WZWN0b3IqICBjdXJzOyAgIC8qIGFycmF5cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9WZWN0b3IqICBvcnVzOwotICAgIEZUX1VJbnQgICAgIG1heF9wb2ludHM7Ci0KLSAgfSBJVVBfV29ya2VyUmVjLCAqSVVQX1dvcmtlcjsKLQotCi0gIHN0YXRpYyB2b2lkCi0gIF9pdXBfd29ya2VyX3NoaWZ0KCBJVVBfV29ya2VyICB3b3JrZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBwMSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHAyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcCApCi0gIHsKLSAgICBGVF9VSW50ICAgICBpOwotICAgIEZUX0YyNkRvdDYgIGR4OwotCi0KLSAgICBkeCA9IFNVQl9MT05HKCB3b3JrZXItPmN1cnNbcF0ueCwgd29ya2VyLT5vcmdzW3BdLnggKTsKLSAgICBpZiAoIGR4ICE9IDAgKQotICAgIHsKLSAgICAgIGZvciAoIGkgPSBwMTsgaSA8IHA7IGkrKyApCi0gICAgICAgIHdvcmtlci0+Y3Vyc1tpXS54ID0gQUREX0xPTkcoIHdvcmtlci0+Y3Vyc1tpXS54LCBkeCApOwotCi0gICAgICBmb3IgKCBpID0gcCArIDE7IGkgPD0gcDI7IGkrKyApCi0gICAgICAgIHdvcmtlci0+Y3Vyc1tpXS54ID0gQUREX0xPTkcoIHdvcmtlci0+Y3Vyc1tpXS54LCBkeCApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgX2l1cF93b3JrZXJfaW50ZXJwb2xhdGUoIElVUF9Xb3JrZXIgIHdvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByZWYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmVmMiApCi0gIHsKLSAgICBGVF9VSW50ICAgICBpOwotICAgIEZUX0YyNkRvdDYgIG9ydXMxLCBvcnVzMiwgb3JnMSwgb3JnMiwgY3VyMSwgY3VyMiwgZGVsdGExLCBkZWx0YTI7Ci0KLQotICAgIGlmICggcDEgPiBwMiApCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAoIEJPVU5EUyggcmVmMSwgd29ya2VyLT5tYXhfcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggcmVmMiwgd29ya2VyLT5tYXhfcG9pbnRzICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgb3J1czEgPSB3b3JrZXItPm9ydXNbcmVmMV0ueDsKLSAgICBvcnVzMiA9IHdvcmtlci0+b3J1c1tyZWYyXS54OwotCi0gICAgaWYgKCBvcnVzMSA+IG9ydXMyICkKLSAgICB7Ci0gICAgICBGVF9GMjZEb3Q2ICB0bXBfbzsKLSAgICAgIEZUX1VJbnQgICAgIHRtcF9yOwotCi0KLSAgICAgIHRtcF9vID0gb3J1czE7Ci0gICAgICBvcnVzMSA9IG9ydXMyOwotICAgICAgb3J1czIgPSB0bXBfbzsKLQotICAgICAgdG1wX3IgPSByZWYxOwotICAgICAgcmVmMSAgPSByZWYyOwotICAgICAgcmVmMiAgPSB0bXBfcjsKLSAgICB9Ci0KLSAgICBvcmcxICAgPSB3b3JrZXItPm9yZ3NbcmVmMV0ueDsKLSAgICBvcmcyICAgPSB3b3JrZXItPm9yZ3NbcmVmMl0ueDsKLSAgICBjdXIxICAgPSB3b3JrZXItPmN1cnNbcmVmMV0ueDsKLSAgICBjdXIyICAgPSB3b3JrZXItPmN1cnNbcmVmMl0ueDsKLSAgICBkZWx0YTEgPSBTVUJfTE9ORyggY3VyMSwgb3JnMSApOwotICAgIGRlbHRhMiA9IFNVQl9MT05HKCBjdXIyLCBvcmcyICk7Ci0KLSAgICBpZiAoIGN1cjEgPT0gY3VyMiB8fCBvcnVzMSA9PSBvcnVzMiApCi0gICAgewotCi0gICAgICAvKiB0cml2aWFsIHNuYXAgb3Igc2hpZnQgb2YgdW50b3VjaGVkIHBvaW50cyAqLwotICAgICAgZm9yICggaSA9IHAxOyBpIDw9IHAyOyBpKysgKQotICAgICAgewotICAgICAgICBGVF9GMjZEb3Q2ICB4ID0gd29ya2VyLT5vcmdzW2ldLng7Ci0KLQotICAgICAgICBpZiAoIHggPD0gb3JnMSApCi0gICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBkZWx0YTEgKTsKLQotICAgICAgICBlbHNlIGlmICggeCA+PSBvcmcyICkKLSAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGRlbHRhMiApOwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICB4ID0gY3VyMTsKLQotICAgICAgICB3b3JrZXItPmN1cnNbaV0ueCA9IHg7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgc2NhbGUgICAgICAgPSAwOwotICAgICAgRlRfQm9vbCAgIHNjYWxlX3ZhbGlkID0gMDsKLQotCi0gICAgICAvKiBpbnRlcnBvbGF0aW9uICovCi0gICAgICBmb3IgKCBpID0gcDE7IGkgPD0gcDI7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0YyNkRvdDYgIHggPSB3b3JrZXItPm9yZ3NbaV0ueDsKLQotCi0gICAgICAgIGlmICggeCA8PSBvcmcxICkKLSAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGRlbHRhMSApOwotCi0gICAgICAgIGVsc2UgaWYgKCB4ID49IG9yZzIgKQotICAgICAgICAgIHggPSBBRERfTE9ORyggeCwgZGVsdGEyICk7Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAhc2NhbGVfdmFsaWQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNjYWxlX3ZhbGlkID0gMTsKLSAgICAgICAgICAgIHNjYWxlICAgICAgID0gRlRfRGl2Rml4KCBTVUJfTE9ORyggY3VyMiwgY3VyMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQl9MT05HKCBvcnVzMiwgb3J1czEgKSApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHggPSBBRERfTE9ORyggY3VyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggU1VCX0xPTkcoIHdvcmtlci0+b3J1c1tpXS54LCBvcnVzMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgd29ya2VyLT5jdXJzW2ldLnggPSB4OwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJVVBbYV06ICAgICAgIEludGVycG9sYXRlIFVudG91Y2hlZCBQb2ludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDMwLTB4MzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0lVUCggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBJVVBfV29ya2VyUmVjICBWOwotICAgIEZUX0J5dGUgICAgICAgIG1hc2s7Ci0KLSAgICBGVF9VSW50ICAgZmlyc3RfcG9pbnQ7ICAgLyogZmlyc3QgcG9pbnQgb2YgY29udG91ciAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgZW5kX3BvaW50OyAgICAgLyogZW5kIHBvaW50IChsYXN0KzEpIG9mIGNvbnRvdXIgKi8KLQotICAgIEZUX1VJbnQgICBmaXJzdF90b3VjaGVkOyAvKiBmaXJzdCB0b3VjaGVkIHBvaW50IGluIGNvbnRvdXIgICAqLwotICAgIEZUX1VJbnQgICBjdXJfdG91Y2hlZDsgICAvKiBjdXJyZW50IHRvdWNoZWQgcG9pbnQgaW4gY29udG91ciAqLwotCi0gICAgRlRfVUludCAgIHBvaW50OyAgICAgICAgIC8qIGN1cnJlbnQgcG9pbnQgICAqLwotICAgIEZUX1Nob3J0ICBjb250b3VyOyAgICAgICAvKiBjdXJyZW50IGNvbnRvdXIgKi8KLQotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAvKiBTZWUgYHR0aW50ZXJwLmgnIGZvciBkZXRhaWxzIG9uIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4gICovCi0gICAgLyogQWxsb3cgSVVQIHVudGlsIGl0IGhhcyBiZWVuIGNhbGxlZCBvbiBib3RoIGF4ZXMuICBJbW1lZGlhdGVseSAqLwotICAgIC8qIHJldHVybiBvbiBzdWJzZXF1ZW50IG9uZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTCAgICAmJgotICAgICAgICAgZXhjLT5iYWNrd2FyZF9jb21wYXRpYmlsaXR5ICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+aXVweF9jYWxsZWQgJiYgZXhjLT5pdXB5X2NhbGxlZCApCi0gICAgICAgIHJldHVybjsKLQotICAgICAgaWYgKCBleGMtPm9wY29kZSAmIDEgKQotICAgICAgICBleGMtPml1cHhfY2FsbGVkID0gVFJVRTsKLSAgICAgIGVsc2UKLSAgICAgICAgZXhjLT5pdXB5X2NhbGxlZCA9IFRSVUU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBpZ25vcmUgZW1wdHkgb3V0bGluZXMgKi8KLSAgICBpZiAoIGV4Yy0+cHRzLm5fY29udG91cnMgPT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAoIGV4Yy0+b3Bjb2RlICYgMSApCi0gICAgewotICAgICAgbWFzayAgID0gRlRfQ1VSVkVfVEFHX1RPVUNIX1g7Ci0gICAgICBWLm9yZ3MgPSBleGMtPnB0cy5vcmc7Ci0gICAgICBWLmN1cnMgPSBleGMtPnB0cy5jdXI7Ci0gICAgICBWLm9ydXMgPSBleGMtPnB0cy5vcnVzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWFzayAgID0gRlRfQ1VSVkVfVEFHX1RPVUNIX1k7Ci0gICAgICBWLm9yZ3MgPSAoRlRfVmVjdG9yKikoIChGVF9Qb3MqKWV4Yy0+cHRzLm9yZyArIDEgKTsKLSAgICAgIFYuY3VycyA9IChGVF9WZWN0b3IqKSggKEZUX1BvcyopZXhjLT5wdHMuY3VyICsgMSApOwotICAgICAgVi5vcnVzID0gKEZUX1ZlY3RvciopKCAoRlRfUG9zKilleGMtPnB0cy5vcnVzICsgMSApOwotICAgIH0KLSAgICBWLm1heF9wb2ludHMgPSBleGMtPnB0cy5uX3BvaW50czsKLQotICAgIGNvbnRvdXIgPSAwOwotICAgIHBvaW50ICAgPSAwOwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICkKLSAgICB7Ci0gICAgICBleGMtPml1cF9jYWxsZWQgPSBUUlVFOwotICAgICAgaWYgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19TS0lQX0lVUCApCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIGRvCi0gICAgewotICAgICAgZW5kX3BvaW50ICAgPSBleGMtPnB0cy5jb250b3Vyc1tjb250b3VyXSAtIGV4Yy0+cHRzLmZpcnN0X3BvaW50OwotICAgICAgZmlyc3RfcG9pbnQgPSBwb2ludDsKLQotICAgICAgaWYgKCBCT1VORFMoIGVuZF9wb2ludCwgZXhjLT5wdHMubl9wb2ludHMgKSApCi0gICAgICAgIGVuZF9wb2ludCA9IGV4Yy0+cHRzLm5fcG9pbnRzIC0gMTsKLQotICAgICAgd2hpbGUgKCBwb2ludCA8PSBlbmRfcG9pbnQgJiYgKCBleGMtPnB0cy50YWdzW3BvaW50XSAmIG1hc2sgKSA9PSAwICkKLSAgICAgICAgcG9pbnQrKzsKLQotICAgICAgaWYgKCBwb2ludCA8PSBlbmRfcG9pbnQgKQotICAgICAgewotICAgICAgICBmaXJzdF90b3VjaGVkID0gcG9pbnQ7Ci0gICAgICAgIGN1cl90b3VjaGVkICAgPSBwb2ludDsKLQotICAgICAgICBwb2ludCsrOwotCi0gICAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggKCBleGMtPnB0cy50YWdzW3BvaW50XSAmIG1hc2sgKSAhPSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBfaXVwX3dvcmtlcl9pbnRlcnBvbGF0ZSggJlYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RvdWNoZWQgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdG91Y2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCApOwotICAgICAgICAgICAgY3VyX3RvdWNoZWQgPSBwb2ludDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwb2ludCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjdXJfdG91Y2hlZCA9PSBmaXJzdF90b3VjaGVkICkKLSAgICAgICAgICBfaXVwX3dvcmtlcl9zaGlmdCggJlYsIGZpcnN0X3BvaW50LCBlbmRfcG9pbnQsIGN1cl90b3VjaGVkICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIF9pdXBfd29ya2VyX2ludGVycG9sYXRlKCAmViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydCkoIGN1cl90b3VjaGVkICsgMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90b3VjaGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkICk7Ci0KLSAgICAgICAgICBpZiAoIGZpcnN0X3RvdWNoZWQgPiAwICkKLSAgICAgICAgICAgIF9pdXBfd29ya2VyX2ludGVycG9sYXRlKCAmViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdG91Y2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvbnRvdXIrKzsKLSAgICB9IHdoaWxlICggY29udG91ciA8IGV4Yy0+cHRzLm5fY29udG91cnMgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBERUxUQVBuW106ICAgIERFTFRBIGV4Y2VwdGlvbnMgUDEsIFAyLCBQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVELDB4NzEsMHg3MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyICgyICogdWludDMyKS4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0RFTFRBUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgICBudW1wLCBrOwotICAgIEZUX1VTaG9ydCAgQTsKLSAgICBGVF9VTG9uZyAgIEMsIFA7Ci0gICAgRlRfTG9uZyAgICBCOwotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgRlRfVVNob3J0ICBCMSwgQjI7Ci0KLQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPml1cF9jYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT19ERUxUQVBfQUZURVJfSVVQICkgKQotICAgICAgZ290byBGYWlsOwotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KLSAgICBQICAgID0gKEZUX1VMb25nKWV4Yy0+ZnVuY19jdXJfcHBlbSggZXhjICk7Ci0gICAgbnVtcCA9IChGVF9VTG9uZylhcmdzWzBdOyAgIC8qIHNvbWUgcG9pbnRzIHRoZW9yZXRpY2FsbHkgbWF5IG9jY3VyIG1vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBvbmNlLCB0aHVzIFVTaG9ydCBpc24ndCBlbm91Z2ggKi8KLQotICAgIGZvciAoIGsgPSAxOyBrIDw9IG51bXA7IGsrKyApCi0gICAgewotICAgICAgaWYgKCBleGMtPmFyZ3MgPCAyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggVG9vX0Zld19Bcmd1bWVudHMgKTsKLSAgICAgICAgZXhjLT5hcmdzID0gMDsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICBleGMtPmFyZ3MgLT0gMjsKLQotICAgICAgQSA9IChGVF9VU2hvcnQpZXhjLT5zdGFja1tleGMtPmFyZ3MgKyAxXTsKLSAgICAgIEIgPSBleGMtPnN0YWNrW2V4Yy0+YXJnc107Ci0KLSAgICAgIC8qIFhYWDogQmVjYXVzZSBzb21lIHBvcHVsYXIgZm9udHMgY29udGFpbiBzb21lIGludmFsaWQgRGVsdGFQICovCi0gICAgICAvKiAgICAgIGluc3RydWN0aW9ucywgd2Ugc2ltcGx5IGlnbm9yZSB0aGVtIHdoZW4gdGhlIHN0YWNrZWQgICAqLwotICAgICAgLyogICAgICBwb2ludCByZWZlcmVuY2UgaXMgb2ZmIGxpbWl0LCByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gKi8KLSAgICAgIC8qICAgICAgZXJyb3IuICBBcyBhIGRlbHRhIGluc3RydWN0aW9uIGRvZXNuJ3QgY2hhbmdlIGEgZ2x5cGggICovCi0gICAgICAvKiAgICAgIGluIGdyZWF0IHdheXMsIHRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4gICAgICAgICAgICAqLwotCi0gICAgICBpZiAoICFCT1VORFMoIEEsIGV4Yy0+enAwLm5fcG9pbnRzICkgKQotICAgICAgewotICAgICAgICBDID0gKCAoRlRfVUxvbmcpQiAmIDB4RjAgKSA+PiA0OwotCi0gICAgICAgIHN3aXRjaCAoIGV4Yy0+b3Bjb2RlICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDB4NUQ6Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDcxOgotICAgICAgICAgIEMgKz0gMTY7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDcyOgotICAgICAgICAgIEMgKz0gMzI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBDICs9IGV4Yy0+R1MuZGVsdGFfYmFzZTsKLQotICAgICAgICBpZiAoIFAgPT0gQyApCi0gICAgICAgIHsKLSAgICAgICAgICBCID0gKCAoRlRfVUxvbmcpQiAmIDB4RiApIC0gODsKLSAgICAgICAgICBpZiAoIEIgPj0gMCApCi0gICAgICAgICAgICBCKys7Ci0gICAgICAgICAgQiAqPSAxTCA8PCAoIDYgLSBleGMtPkdTLmRlbHRhX3NoaWZ0ICk7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotCi0gICAgICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgQWxsb3cgZGVsdGEgbW92ZSBpZgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAtIG5vdCB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywKLSAgICAgICAgICAgICAqICAtIGdseXBoIGlzIHNwZWNpZmljYWxseSBzZXQgdG8gYWxsb3cgaXQsIG9yCi0gICAgICAgICAgICAgKiAgLSBnbHlwaCBpcyBjb21wb3NpdGUgYW5kIGZyZWVkb20gdmVjdG9yIGlzIG5vdCBpbiBzdWJwaXhlbAotICAgICAgICAgICAgICogICAgZGlyZWN0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoICFleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxXQVlTX0RPX0RFTFRBUCApIHx8Ci0gICAgICAgICAgICAgICAgICggZXhjLT5pc19jb21wb3NpdGUgJiYgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApICAgICkKLSAgICAgICAgICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAwLCBBLCBCICk7Ci0KLSAgICAgICAgICAgIC8qIE90aGVyd2lzZSwgYXBwbHkgc3VicGl4ZWwgaGludGluZyBhbmQgY29tcGF0aWJpbGl0eSBtb2RlICovCi0gICAgICAgICAgICAvKiBydWxlcywgYWx3YXlzIHNraXBwaW5nIGRlbHRhcyBpbiBzdWJwaXhlbCBkaXJlY3Rpb24uICAgICAqLwotICAgICAgICAgICAgZWxzZSBpZiAoIGV4Yy0+aWdub3JlX3hfbW9kZSAmJiBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgeSB2YWx1ZSBvZiB0aGUgcG9pbnQgbm93OyBjb21wYXJlIGFmdGVyIG1vdmUgKi8KLSAgICAgICAgICAgICAgQjEgPSAoRlRfVVNob3J0KWV4Yy0+enAwLmN1cltBXS55OwotCi0gICAgICAgICAgICAgIC8qIFN0YW5kYXJkIHN1YnBpeGVsIGhpbnRpbmc6IEFsbG93IHkgbW92ZSBmb3IgeS10b3VjaGVkICovCi0gICAgICAgICAgICAgIC8qIHBvaW50cy4gIFRoaXMgbWVzc2VzIHVwIERlamFWdSAuLi4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIGlmICggIWV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICggZXhjLT56cDAudGFnc1tBXSAmIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkgKQotICAgICAgICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgQSwgQiApOwotCi0gICAgICAgICAgICAgIC8qIGNvbXBhdGliaWxpdHkgbW9kZSAqLwotICAgICAgICAgICAgICBlbHNlIGlmICggZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICEoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0FMV0FZU19TS0lQX0RFTFRBUCApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfUk9VTkRfTk9OUElYRUxfWV9NT1ZFUyApCi0gICAgICAgICAgICAgICAgICBCID0gRlRfUElYX1JPVU5EKCBCMSArIEIgKSAtIEIxOwotCi0gICAgICAgICAgICAgICAgLyogQWxsb3cgZGVsdGEgbW92ZSBpZiB1c2luZyBzcGhfY29tcGF0aWJpbGl0eV9tb2RlLCAgICovCi0gICAgICAgICAgICAgICAgLyogSVVQIGhhcyBub3QgYmVlbiBjYWxsZWQsIGFuZCBwb2ludCBpcyB0b3VjaGVkIG9uIFkuICovCi0gICAgICAgICAgICAgICAgaWYgKCAhZXhjLT5pdXBfY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAoIGV4Yy0+enAwLnRhZ3NbQV0gJiBGVF9DVVJWRV9UQUdfVE9VQ0hfWSApICkKLSAgICAgICAgICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgQSwgQiApOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgQjIgPSAoRlRfVVNob3J0KWV4Yy0+enAwLmN1cltBXS55OwotCi0gICAgICAgICAgICAgIC8qIFJldmVyc2UgdGhpcyBtb3ZlIGlmIGl0IHJlc3VsdHMgaW4gYSBkaXNhbGxvd2VkIG1vdmUgKi8KLSAgICAgICAgICAgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICggKCBleGMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKCBCMSAmIDYzICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAoICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgICAgICAgICAgICAgICAgICAgJgotICAgICAgICAgICAgICAgICAgICAgICAgIFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVNfREVMVEFQICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKCBCMSAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkgKQotICAgICAgICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgQSwgLUIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KLSAgICAgICAgICB7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAotICAgICAgICAgICAgLyogU2VlIGB0dGludGVycC5oJyBmb3IgZGV0YWlscyBvbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0gICAgICAgICAgICAvKiBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19NSU5JTUFMICAgICYmCi0gICAgICAgICAgICAgICAgIGV4Yy0+YmFja3dhcmRfY29tcGF0aWJpbGl0eSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggISggZXhjLT5pdXB4X2NhbGxlZCAmJiBleGMtPml1cHlfY2FsbGVkICkgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgKCAoIGV4Yy0+aXNfY29tcG9zaXRlICYmIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKSB8fAotICAgICAgICAgICAgICAgICAgICAgKCBleGMtPnpwMC50YWdzW0FdICYgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgKSAgICAgICAgKSApCi0gICAgICAgICAgICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAwLCBBLCBCICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAwLCBBLCBCICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFTFRBQ25bXTogICAgREVMVEEgZXhjZXB0aW9ucyBDMSwgQzIsIEMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzMsMHg3NCwweDc1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgKDIgKiB1aW50MzIpLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfREVMVEFDKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VTG9uZyAgbnVtcCwgazsKLSAgICBGVF9VTG9uZyAgQSwgQywgUDsKLSAgICBGVF9Mb25nICAgQjsKLQotCi0gICAgUCAgICA9IChGVF9VTG9uZylleGMtPmZ1bmNfY3VyX3BwZW0oIGV4YyApOwotICAgIG51bXAgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotICAgIGZvciAoIGsgPSAxOyBrIDw9IG51bXA7IGsrKyApCi0gICAgewotICAgICAgaWYgKCBleGMtPmFyZ3MgPCAyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggVG9vX0Zld19Bcmd1bWVudHMgKTsKLSAgICAgICAgZXhjLT5hcmdzID0gMDsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICBleGMtPmFyZ3MgLT0gMjsKLQotICAgICAgQSA9IChGVF9VTG9uZylleGMtPnN0YWNrW2V4Yy0+YXJncyArIDFdOwotICAgICAgQiA9IGV4Yy0+c3RhY2tbZXhjLT5hcmdzXTsKLQotICAgICAgaWYgKCBCT1VORFNMKCBBLCBleGMtPmN2dFNpemUgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgQyA9ICggKEZUX1VMb25nKUIgJiAweEYwICkgPj4gNDsKLQotICAgICAgICBzd2l0Y2ggKCBleGMtPm9wY29kZSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAweDczOgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3NDoKLSAgICAgICAgICBDICs9IDE2OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3NToKLSAgICAgICAgICBDICs9IDMyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgQyArPSBleGMtPkdTLmRlbHRhX2Jhc2U7Ci0KLSAgICAgICAgaWYgKCBQID09IEMgKQotICAgICAgICB7Ci0gICAgICAgICAgQiA9ICggKEZUX1VMb25nKUIgJiAweEYgKSAtIDg7Ci0gICAgICAgICAgaWYgKCBCID49IDAgKQotICAgICAgICAgICAgQisrOwotICAgICAgICAgIEIgKj0gMUwgPDwgKCA2IC0gZXhjLT5HUy5kZWx0YV9zaGlmdCApOwotCi0gICAgICAgICAgZXhjLT5mdW5jX21vdmVfY3Z0KCBleGMsIEEsIEIgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSVNDLiBJTlNUUlVDVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHRVRJTkZPW106ICAgIEdFVCBJTkZPcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IFNlbGVjdG9yIGJpdHMgaGlnaGVyIHRoYW4gOSBhcmUgY3VycmVudGx5IChNYXkgICAgICovCi0gIC8qICAgICAgMjAxNSkgbm90IGRvY3VtZW50ZWQgaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTZWxlY3RvciBiaXQgMTEgaXMgaW5jb3JyZWN0bHkgZGVzY3JpYmVkIGFzIGJpdCA4LCB3aGlsZSB0aGUgICAgICovCi0gIC8qICAgICAgcmVhbCBtZWFuaW5nIG9mIGJpdCA4ICh2ZXJ0aWNhbCBMQ0Qgc3VicGl4ZWxzKSBzdGF5cyAgICAgICAgICAgICAqLwotICAvKiAgICAgIHVuZG9jdW1lbnRlZC4gIFRoZSBzYW1lIG1pc3Rha2UgY2FuIGJlIGZvdW5kIGluIEdyZWcgSGl0Y2hjb2NrJ3MgKi8KLSAgLyogICAgICB3aGl0ZXBhcGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfR0VUSU5GTyggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX0xvbmcgICAgSzsKLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGV4Yy0+ZmFjZSApOwotCi0KLSAgICBLID0gMDsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIFJBU1RFUklaRVIgVkVSU0lPTiAgICAgICAgICAgKi8KLSAgICAvKiBTZWxlY3RvciBCaXQ6ICAwICAgICAgICAgICAgICovCi0gICAgLyogUmV0dXJuIEJpdChzKTogMC03ICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAmJgotICAgICAgICAgKCBhcmdzWzBdICYgMSApICE9IDAgICAgICAgICYmCi0gICAgICAgICBleGMtPnN1YnBpeGVsX2hpbnRpbmcgICAgICAgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5pZ25vcmVfeF9tb2RlICkKLSAgICAgIHsKLSAgICAgICAgLyogaWYgaW4gQ2xlYXJUeXBlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSwgICAgICAgICAqLwotICAgICAgICAvKiB3ZSBzb21ldGltZXMgY2hhbmdlIHRoZSBUcnVlVHlwZSB2ZXJzaW9uIGR5bmFtaWNhbGx5ICovCi0gICAgICAgIEsgPSBleGMtPnJhc3Rlcml6ZXJfdmVyc2lvbjsKLSAgICAgICAgRlRfVFJBQ0U2KCggIlNldHRpbmcgcmFzdGVyaXplciB2ZXJzaW9uICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBleGMtPnJhc3Rlcml6ZXJfdmVyc2lvbiApKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgSyA9IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzg7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotICAgICAgaWYgKCAoIGFyZ3NbMF0gJiAxICkgIT0gMCApCi0gICAgICAgIEsgPSBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb247Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogR0xZUEggUk9UQVRFRCAgICAgICAgICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDEgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiA4ICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggKCBhcmdzWzBdICYgMiApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnJvdGF0ZWQgKQotICAgICAgSyB8PSAxIDw8IDg7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogR0xZUEggU1RSRVRDSEVEICAgICAgICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDIgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiA5ICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggKCBhcmdzWzBdICYgNCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnN0cmV0Y2hlZCApCi0gICAgICBLIHw9IDEgPDwgOTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogVkFSSUFUSU9OIEdMWVBIICAgICAgICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDMgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiAxMCAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISAgICAgICAgICAgKi8KLSAgICBpZiAoIChhcmdzWzBdICYgOCApICE9IDAgJiYgZXhjLT5mYWNlLT5ibGVuZCApCi0gICAgICBLIHw9IDEgPDwgMTA7Ci0jZW5kaWYKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBCSS1MRVZFTCBISU5USU5HIEFORCAgICAgICAgICovCi0gICAgLyogR1JBWVNDQUxFIFJFTkRFUklORyAgICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDUgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiAxMiAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggKCBhcmdzWzBdICYgMzIgKSAhPSAwICYmIGV4Yy0+Z3JheXNjYWxlICkKLSAgICAgIEsgfD0gMSA8PCAxMjsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX01JTklNQUwgKQotICAgIHsKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qIEhJTlRJTkcgRk9SIFNVQlBJWEVMICAgICAgICAgKi8KLSAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDYgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFJldHVybiBCaXQocyk6IDEzICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIHY0MCBkb2VzIHN1YnBpeGVsIGhpbnRpbmcgYnkgZGVmYXVsdC4gKi8KLSAgICAgIGlmICggKCBhcmdzWzBdICYgNjQgKSAhPSAwICkKLSAgICAgICAgSyB8PSAxIDw8IDEzOwotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiBWRVJUSUNBTCBMQ0QgU1VCUElYRUxTPyAgICAgICovCi0gICAgICAvKiBTZWxlY3RvciBCaXQ6ICA4ICAgICAgICAgICAgICovCi0gICAgICAvKiBSZXR1cm4gQml0KHMpOiAxNSAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoICggYXJnc1swXSAmIDI1NiApICE9IDAgJiYgZXhjLT52ZXJ0aWNhbF9sY2RfbGVhbiApCi0gICAgICAgIEsgfD0gMSA8PCAxNTsKLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogU1VCUElYRUwgUE9TSVRJT05FRD8gICAgICAgICAqLwotICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTAgICAgICAgICAgICAqLwotICAgICAgLyogUmV0dXJuIEJpdChzKTogMTcgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogWFhYOiBGcmVlVHlwZSBzdXBwb3J0cyBpdCwgZGVwZW5kZW50IG9uIHdoYXQgY2xpZW50IGRvZXM/ICovCi0gICAgICBpZiAoICggYXJnc1swXSAmIDEwMjQgKSAhPSAwICkKLSAgICAgICAgSyB8PSAxIDw8IDE3OwotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiBTWU1NRVRSSUNBTCBTTU9PVEhJTkcgICAgICAgICovCi0gICAgICAvKiBTZWxlY3RvciBCaXQ6ICAxMSAgICAgICAgICAgICovCi0gICAgICAvKiBSZXR1cm4gQml0KHMpOiAxOCAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBUaGUgb25seSBzbW9vdGhpbmcgbWV0aG9kIEZyZWVUeXBlIHN1cHBvcnRzIHVubGVzcyBzb21lb25lIHNldHMgKi8KLSAgICAgIC8qIEZUX0xPQURfVEFSR0VUX01PTk8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCAoIGFyZ3NbMF0gJiAyMDQ4ICkgIT0gMCAmJiBleGMtPnN1YnBpeGVsX2hpbnRpbmdfbGVhbiApCi0gICAgICAgIEsgfD0gMSA8PCAxODsKLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogQ0xFQVJUWVBFIEhJTlRJTkcgQU5EICAgICAgICAqLwotICAgICAgLyogR1JBWVNDQUxFIFJFTkRFUklORyAgICAgICAgICAqLwotICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTIgICAgICAgICAgICAqLwotICAgICAgLyogUmV0dXJuIEJpdChzKTogMTkgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogR3JheXNjYWxlIHJlbmRlcmluZyBpcyB3aGF0IEZyZWVUeXBlIGRvZXMgYW55d2F5IHVubGVzcyBzb21lb25lICovCi0gICAgICAvKiBzZXRzIEZUX0xPQURfVEFSR0VUX01PTk8gb3IgRlRfTE9BRF9UQVJHRVRfTENEKF9WKSAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggKCBhcmdzWzBdICYgNDA5NiApICE9IDAgJiYgZXhjLT5ncmF5c2NhbGVfY2xlYXJ0eXBlICkKLSAgICAgICAgSyB8PSAxIDw8IDE5OwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPj0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSApCi0gICAgewotCi0gICAgICBpZiAoIGV4Yy0+cmFzdGVyaXplcl92ZXJzaW9uID49IDM3ICkKLSAgICAgIHsKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBISU5USU5HIEZPUiBTVUJQSVhFTCAgICAgICAgICovCi0gICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDYgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTMgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggKCBhcmdzWzBdICYgNjQgKSAhPSAwICYmIGV4Yy0+c3VicGl4ZWxfaGludGluZyApCi0gICAgICAgICAgSyB8PSAxIDw8IDEzOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogQ09NUEFUSUJMRSBXSURUSFMgRU5BQkxFRCAgICAqLwotICAgICAgICAvKiBTZWxlY3RvciBCaXQ6ICA3ICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFJldHVybiBCaXQocyk6IDE0ICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBGdW5jdGlvbmFsaXR5IHN0aWxsIG5lZWRzIHRvIGJlIGFkZGVkICovCi0gICAgICAgIGlmICggKCBhcmdzWzBdICYgMTI4ICkgIT0gMCAmJiBleGMtPmNvbXBhdGlibGVfd2lkdGhzICkKLSAgICAgICAgICBLIHw9IDEgPDwgMTQ7Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBWRVJUSUNBTCBMQ0QgU1VCUElYRUxTPyAgICAgICovCi0gICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDggICAgICAgICAgICAgKi8KLSAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTUgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KLSAgICAgICAgaWYgKCAoIGFyZ3NbMF0gJiAyNTYgKSAhPSAwICYmIGV4Yy0+dmVydGljYWxfbGNkICkKLSAgICAgICAgICBLIHw9IDEgPDwgMTU7Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBISU5USU5HIEZPUiBCR1I/ICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDkgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTYgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KLSAgICAgICAgaWYgKCAoIGFyZ3NbMF0gJiA1MTIgKSAhPSAwICYmIGV4Yy0+YmdyICkKLSAgICAgICAgICBLIHw9IDEgPDwgMTY7Ci0KLSAgICAgICAgaWYgKCBleGMtPnJhc3Rlcml6ZXJfdmVyc2lvbiA+PSAzOCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgLyogU1VCUElYRUwgUE9TSVRJT05FRD8gICAgICAgICAqLwotICAgICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDEwICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxNyAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KLSAgICAgICAgICBpZiAoICggYXJnc1swXSAmIDEwMjQgKSAhPSAwICYmIGV4Yy0+c3VicGl4ZWxfcG9zaXRpb25lZCApCi0gICAgICAgICAgICBLIHw9IDEgPDwgMTc7Ci0KLSAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgLyogU1lNTUVUUklDQUwgU01PT1RISU5HICAgICAgICAqLwotICAgICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDExICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxOCAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KLSAgICAgICAgICBpZiAoICggYXJnc1swXSAmIDIwNDggKSAhPSAwICYmIGV4Yy0+c3ltbWV0cmljYWxfc21vb3RoaW5nICkKLSAgICAgICAgICAgIEsgfD0gMSA8PCAxODsKLQotICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAvKiBHUkFZIENMRUFSVFlQRSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTIgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFJldHVybiBCaXQocyk6IDE5ICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLwotICAgICAgICAgIGlmICggKCBhcmdzWzBdICYgNDA5NiApICE9IDAgJiYgZXhjLT5ncmF5X2NsZWFydHlwZSApCi0gICAgICAgICAgICBLIHw9IDEgPDwgMTk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0gICAgYXJnc1swXSA9IEs7Ci0gIH0KLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0VUVkFSSUFUSU9OW106IGdldCBub3JtYWxpemVkIHZhcmlhdGlvbiAoYmxlbmQpIGNvb3JkaW5hdGVzICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg5MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiBmMi4xNC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFhYWDogVU5ET0NVTUVOVEVEISAgVGhlcmUgaXMgbm8gb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBmcm9tIEFwcGxlIGZvciAqLwotICAvKiAgICAgIHRoaXMgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uICBBY3RpdmUgb25seSBpZiBhIGZvbnQgaGFzIEdYICAgICAgICAgKi8KLSAgLyogICAgICB2YXJpYXRpb24gYXhlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfR0VUVkFSSUFUSU9OKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VSW50ICAgIG51bV9heGVzID0gZXhjLT5mYWNlLT5ibGVuZC0+bnVtX2F4aXM7Ci0gICAgRlRfRml4ZWQqICBjb29yZHMgICA9IGV4Yy0+ZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHM7Ci0KLSAgICBGVF9VSW50ICBpOwotCi0KLSAgICBpZiAoIEJPVU5EUyggbnVtX2F4ZXMsIGV4Yy0+c3RhY2tTaXplICsgMSAtIGV4Yy0+dG9wICkgKQotICAgIHsKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9heGVzOyBpKysgKQotICAgICAgYXJnc1tpXSA9IGNvb3Jkc1tpXSA+PiAyOyAvKiBjb252ZXJ0IDE2LjE2IHRvIDIuMTQgZm9ybWF0ICovCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0VUREFUQVtdOiAgICBubyBpZGVhIHdoYXQgdGhpcyBpcyBnb29kIGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg5MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFhYWDogVU5ET0NVTUVOVEVEISAgVGhlcmUgaXMgbm8gZG9jdW1lbnRhdGlvbiBmcm9tIEFwcGxlIGZvciB0aGlzICAgICAqLwotICAvKiAgICAgIHZlcnkgd2VpcmQgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HRVREQVRBKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gMTc7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEluc19VTktOT1dOKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIFRUX0RlZlJlY29yZCogIGRlZiAgID0gZXhjLT5JRGVmczsKLSAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtSURlZnM7Ci0KLQotICAgIGZvciAoIDsgZGVmIDwgbGltaXQ7IGRlZisrICkKLSAgICB7Ci0gICAgICBpZiAoIChGVF9CeXRlKWRlZi0+b3BjID09IGV4Yy0+b3Bjb2RlICYmIGRlZi0+YWN0aXZlICkKLSAgICAgIHsKLSAgICAgICAgVFRfQ2FsbFJlYyogIGNhbGw7Ci0KLQotICAgICAgICBpZiAoIGV4Yy0+Y2FsbFRvcCA+PSBleGMtPmNhbGxTaXplICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYWxsID0gZXhjLT5jYWxsU3RhY2sgKyBleGMtPmNhbGxUb3ArKzsKLQotICAgICAgICBjYWxsLT5DYWxsZXJfUmFuZ2UgPSBleGMtPmN1clJhbmdlOwotICAgICAgICBjYWxsLT5DYWxsZXJfSVAgICAgPSBleGMtPklQICsgMTsKLSAgICAgICAgY2FsbC0+Q3VyX0NvdW50ICAgID0gMTsKLSAgICAgICAgY2FsbC0+RGVmICAgICAgICAgID0gZGVmOwotCi0gICAgICAgIEluc19Hb3RvX0NvZGVSYW5nZSggZXhjLCBkZWYtPnJhbmdlLCBkZWYtPnN0YXJ0ICk7Ci0KLSAgICAgICAgZXhjLT5zdGVwX2lucyA9IEZBTFNFOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX09wY29kZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgYSBydW4gb2Ygb3Bjb2Rlcy4gIEl0IHdpbGwgZXhpdCBpbiB0aGUgICAgICAgICovCi0gIC8qICBmb2xsb3dpbmcgY2FzZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gRXJyb3JzIChpbiB3aGljaCBjYXNlIGl0IHJldHVybnMgRkFMU0UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBSZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBtYWluIGNvZGUgcmFuZ2UgKHJldHVybnMgVFJVRSkuICAgICAgICAgICAgKi8KLSAgLyogICAgUmVhY2hpbmcgdGhlIGVuZCBvZiBhIGNvZGUgcmFuZ2Ugd2l0aGluIGEgZnVuY3Rpb24gY2FsbCBpcyBhbiAgICAgICovCi0gIC8qICAgIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gQWZ0ZXIgZXhlY3V0aW5nIG9uZSBzaW5nbGUgb3Bjb2RlLCBpZiB0aGUgZmxhZyBgSW5zdHJ1Y3Rpb25fVHJhcCcgICovCi0gIC8qICAgIGlzIHNldCB0byBUUlVFIChyZXR1cm5zIFRSVUUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE9uIGV4aXQgd2l0aCBUUlVFLCB0ZXN0IElQIDwgQ29kZVNpemUgdG8ga25vdyB3aGV0aGVyIGl0IGNvbWVzIGZyb20gICovCi0gIC8qICBhbiBpbnN0cnVjdGlvbiB0cmFwIG9yIGEgbm9ybWFsIHRlcm1pbmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBOb3RlOiBUaGUgZG9jdW1lbnRlZCBERUJVRyBvcGNvZGUgcG9wcyBhIHZhbHVlIGZyb20gdGhlIHN0YWNrLiAgVGhpcyAqLwotICAvKiAgICAgICAgYmVoYXZpb3VyIGlzIHVuc3VwcG9ydGVkOyBoZXJlIGEgREVCVUcgb3Bjb2RlIGlzIGFsd2F5cyBhbiAgICAgKi8KLSAgLyogICAgICAgIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEhJUyBJUyBUSEUgSU5URVJQUkVURVInUyBNQUlOIExPT1AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHRpbnRlcnAuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfUnVuSW5zKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIEZUX1VMb25nICAgaW5zX2NvdW50ZXIgPSAwOyAgLyogZXhlY3V0ZWQgaW5zdHJ1Y3Rpb25zIGNvdW50ZXIgKi8KLSAgICBGVF9VTG9uZyAgIG51bV90d2lsaWdodF9wb2ludHM7Ci0gICAgRlRfVVNob3J0ICBpOwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBGVF9CeXRlICAgIG9wY29kZV9wYXR0ZXJuWzFdWzJdID0gewotICAgICAgICAgICAgICAgICAgLyogIzggVHlwZU1hbiBUYWxrIEFsaWduICovCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIDB4MDYsIC8qIFNQVlRMICAgKi8KLSAgICAgICAgICAgICAgICAgICAgMHg3RCwgLyogUkRURyAgICAqLwotICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICB9OwotICAgIEZUX1VTaG9ydCAgb3Bjb2RlX3BhdHRlcm5zICAgPSAxOwotICAgIEZUX1VTaG9ydCAgb3Bjb2RlX3BvaW50ZXJbMV0gPSB7IDAgfTsKLSAgICBGVF9VU2hvcnQgIG9wY29kZV9zaXplWzFdICAgID0geyAxIH07Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBleGMtPml1cF9jYWxsZWQgPSBGQUxTRTsKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKLSAgICAvKgotICAgICAqICBUb2dnbGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhY2NvcmRpbmcgdG8gd2hhdCBmb250IHdhbnRzLCBleGNlcHQKLSAgICAgKiAgd2hlbgotICAgICAqCi0gICAgICogIDEpIHdlIGhhdmUgYSBgdHJpY2t5JyBmb250IHRoYXQgaGVhdmlseSByZWxpZXMgb24gdGhlIGludGVycHJldGVyIHRvCi0gICAgICogICAgIHJlbmRlciBnbHlwaHMgY29ycmVjdGx5LCBmb3IgZXhhbXBsZSBERkthaS1TQiwgb3IKLSAgICAgKiAgMikgRlRfUkVOREVSX01PREVfTU9OTyAoaS5lLCBtb25vY2hvbWUgcmVuZGVyaW5nKSBpcyByZXF1ZXN0ZWQuCi0gICAgICoKLSAgICAgKiAgSW4gdGhvc2UgY2FzZXMsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbmVlZHMgdG8gYmUgdHVybmVkIG9mZiB0byBnZXQKLSAgICAgKiAgY29ycmVjdCByZW5kZXJpbmcuICBUaGUgcmVuZGVyaW5nIGlzIHRoZW4gY29tcGxldGVseSB1cCB0byB0aGUKLSAgICAgKiAgZm9udCdzIHByb2dyYW1taW5nLgotICAgICAqCi0gICAgICovCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX01JTklNQUwgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+c3VicGl4ZWxfaGludGluZ19sZWFuICAgICAgICAmJgotICAgICAgICAgIUZUX0lTX1RSSUNLWSggJmV4Yy0+ZmFjZS0+cm9vdCApICkKLSAgICAgIGV4Yy0+YmFja3dhcmRfY29tcGF0aWJpbGl0eSA9ICEoIGV4Yy0+R1MuaW5zdHJ1Y3RfY29udHJvbCAmIDQgKTsKLSAgICBlbHNlCi0gICAgICBleGMtPmJhY2t3YXJkX2NvbXBhdGliaWxpdHkgPSBGQUxTRTsKLQotICAgIGV4Yy0+aXVweF9jYWxsZWQgPSBGQUxTRTsKLSAgICBleGMtPml1cHlfY2FsbGVkID0gRkFMU0U7Ci0jZW5kaWYKLQotICAgIC8qIFdlIHJlc3RyaWN0IHRoZSBudW1iZXIgb2YgdHdpbGlnaHQgcG9pbnRzIHRvIGEgcmVhc29uYWJsZSwgICAgICovCi0gICAgLyogaGV1cmlzdGljIHZhbHVlIHRvIGF2b2lkIHNsb3cgZXhlY3V0aW9uIG9mIG1hbGZvcm1lZCBieXRlY29kZS4gKi8KLSAgICBudW1fdHdpbGlnaHRfcG9pbnRzID0gRlRfTUFYKCAzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogKCBleGMtPnB0cy5uX3BvaW50cyArIGV4Yy0+Y3Z0U2l6ZSApICk7Ci0gICAgaWYgKCBleGMtPnR3aWxpZ2h0Lm5fcG9pbnRzID4gbnVtX3R3aWxpZ2h0X3BvaW50cyApCi0gICAgewotICAgICAgaWYgKCBudW1fdHdpbGlnaHRfcG9pbnRzID4gMHhGRkZGVSApCi0gICAgICAgIG51bV90d2lsaWdodF9wb2ludHMgPSAweEZGRkZVOwotCi0gICAgICBGVF9UUkFDRTUoKCAiVFRfUnVuSW5zOiBSZXNldHRpbmcgbnVtYmVyIG9mIHR3aWxpZ2h0IHBvaW50c1xuIgotICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgZnJvbSAlZCB0byB0aGUgbW9yZSByZWFzb25hYmxlIHZhbHVlICVkXG4iLAotICAgICAgICAgICAgICAgICAgZXhjLT50d2lsaWdodC5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgIG51bV90d2lsaWdodF9wb2ludHMgKSk7Ci0gICAgICBleGMtPnR3aWxpZ2h0Lm5fcG9pbnRzID0gKEZUX1VTaG9ydCludW1fdHdpbGlnaHRfcG9pbnRzOwotICAgIH0KLQotICAgIC8qIFNldCB1cCBsb29wIGRldGVjdG9ycy4gIFdlIHJlc3RyaWN0IHRoZSBudW1iZXIgb2YgTE9PUENBTEwgbG9vcHMgKi8KLSAgICAvKiBhbmQgdGhlIG51bWJlciBvZiBKTVBSLCBKUk9ULCBhbmQgSlJPRiBjYWxscyB3aXRoIGEgbmVnYXRpdmUgICAgICovCi0gICAgLyogYXJndW1lbnQgdG8gdmFsdWVzIHRoYXQgZGVwZW5kIG9uIHZhcmlvdXMgcGFyYW1ldGVycyBsaWtlIHRoZSAgICAqLwotICAgIC8qIHNpemUgb2YgdGhlIENWVCB0YWJsZSBvciB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgY3VycmVudCAgICAgKi8KLSAgICAvKiBnbHlwaCAoaWYgYXBwbGljYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoZSBpZGVhIGlzIHRoYXQgaW4gcmVhbC13b3JsZCBieXRlY29kZSB5b3UgZWl0aGVyIGl0ZXJhdGUgb3ZlciAgKi8KLSAgICAvKiBhbGwgQ1ZUIGVudHJpZXMgKGluIHRoZSBgcHJlcCcgdGFibGUpLCBvciBvdmVyIGFsbCBwb2ludHMgKG9yICAgICovCi0gICAgLyogY29udG91cnMsIGluIHRoZSBgZ2x5ZicgdGFibGUpIG9mIGEgZ2x5cGgsIGFuZCBzdWNoIGl0ZXJhdGlvbnMgICAqLwotICAgIC8qIGRvbid0IGhhcHBlbiB2ZXJ5IG9mdGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBleGMtPmxvb3BjYWxsX2NvdW50ZXIgPSAwOwotICAgIGV4Yy0+bmVnX2p1bXBfY291bnRlciA9IDA7Ci0KLSAgICAvKiBUaGUgbWF4aW11bSB2YWx1ZXMgYXJlIGhldXJpc3RpYy4gKi8KLSAgICBpZiAoIGV4Yy0+cHRzLm5fcG9pbnRzICkKLSAgICAgIGV4Yy0+bG9vcGNhbGxfY291bnRlcl9tYXggPSBGVF9NQVgoIDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgKiBleGMtPnB0cy5uX3BvaW50cyApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NQVgoIDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5jdnRTaXplIC8gMTAgKTsKLSAgICBlbHNlCi0gICAgICBleGMtPmxvb3BjYWxsX2NvdW50ZXJfbWF4ID0gMzAwICsgOCAqIGV4Yy0+Y3Z0U2l6ZTsKLQotICAgIC8qIGFzIGEgcHJvdGVjdGlvbiBhZ2FpbnN0IGFuIHVucmVhc29uYWJsZSBudW1iZXIgb2YgQ1ZUIGVudHJpZXMgICovCi0gICAgLyogd2UgYXNzdW1lIGF0IG1vc3QgMTAwIGNvbnRyb2wgdmFsdWVzIHBlciBnbHlwaCBmb3IgdGhlIGNvdW50ZXIgKi8KLSAgICBpZiAoIGV4Yy0+bG9vcGNhbGxfY291bnRlcl9tYXggPgotICAgICAgICAgMTAwICogKEZUX1VMb25nKWV4Yy0+ZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKLSAgICAgIGV4Yy0+bG9vcGNhbGxfY291bnRlcl9tYXggPSAxMDAgKiAoRlRfVUxvbmcpZXhjLT5mYWNlLT5yb290Lm51bV9nbHlwaHM7Ci0KLSAgICBGVF9UUkFDRTUoKCAiVFRfUnVuSW5zOiBMaW1pdGluZyB0b3RhbCBudW1iZXIgb2YgbG9vcHMgaW4gTE9PUENBTEwiCi0gICAgICAgICAgICAgICAgIiB0byAlZFxuIiwgZXhjLT5sb29wY2FsbF9jb3VudGVyX21heCApKTsKLQotICAgIGV4Yy0+bmVnX2p1bXBfY291bnRlcl9tYXggPSBleGMtPmxvb3BjYWxsX2NvdW50ZXJfbWF4OwotICAgIEZUX1RSQUNFNSgoICJUVF9SdW5JbnM6IExpbWl0aW5nIHRvdGFsIG51bWJlciBvZiBiYWNrd2FyZCBqdW1wcyIKLSAgICAgICAgICAgICAgICAiIHRvICVkXG4iLCBleGMtPm5lZ19qdW1wX2NvdW50ZXJfbWF4ICkpOwotCi0gICAgLyogc2V0IFBQRU0gYW5kIENWVCBmdW5jdGlvbnMgKi8KLSAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSAwOwotICAgIGlmICggZXhjLT5tZXRyaWNzLnhfcHBlbSAhPSBleGMtPm1ldHJpY3MueV9wcGVtICkKLSAgICB7Ci0gICAgICAvKiBub24tc3F1YXJlIHBpeGVscywgdXNlIHRoZSBzdHJldGNoZWQgcm91dGluZXMgKi8KLSAgICAgIGV4Yy0+ZnVuY19jdXJfcHBlbSAgPSBDdXJyZW50X1BwZW1fU3RyZXRjaGVkOwotICAgICAgZXhjLT5mdW5jX3JlYWRfY3Z0ICA9IFJlYWRfQ1ZUX1N0cmV0Y2hlZDsKLSAgICAgIGV4Yy0+ZnVuY193cml0ZV9jdnQgPSBXcml0ZV9DVlRfU3RyZXRjaGVkOwotICAgICAgZXhjLT5mdW5jX21vdmVfY3Z0ICA9IE1vdmVfQ1ZUX1N0cmV0Y2hlZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHNxdWFyZSBwaXhlbHMsIHVzZSBub3JtYWwgcm91dGluZXMgKi8KLSAgICAgIGV4Yy0+ZnVuY19jdXJfcHBlbSAgPSBDdXJyZW50X1BwZW07Ci0gICAgICBleGMtPmZ1bmNfcmVhZF9jdnQgID0gUmVhZF9DVlQ7Ci0gICAgICBleGMtPmZ1bmNfd3JpdGVfY3Z0ID0gV3JpdGVfQ1ZUOwotICAgICAgZXhjLT5mdW5jX21vdmVfY3Z0ICA9IE1vdmVfQ1ZUOwotICAgIH0KLQotICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOwotICAgIENvbXB1dGVfUm91bmQoIGV4YywgKEZUX0J5dGUpZXhjLT5HUy5yb3VuZF9zdGF0ZSApOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBleGMtPm9wY29kZSA9IGV4Yy0+Y29kZVtleGMtPklQXTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICB7Ci0gICAgICAgIEZUX0xvbmcgIGNudCA9IEZUX01JTiggOCwgZXhjLT50b3AgKTsKLSAgICAgICAgRlRfTG9uZyAgbjsKLQotCi0gICAgICAgIC8qIGlmIHRyYWNpbmcgbGV2ZWwgaXMgNywgc2hvdyBjdXJyZW50IGNvZGUgcG9zaXRpb24gKi8KLSAgICAgICAgLyogYW5kIHRoZSBmaXJzdCBmZXcgc3RhY2sgZWxlbWVudHMgYWxzbyAgICAgICAgICAgICAqLwotICAgICAgICBGVF9UUkFDRTYoKCAiICAiICkpOwotICAgICAgICBGVF9UUkFDRTcoKCAiJTA2ZCAiLCBleGMtPklQICkpOwotICAgICAgICBGVF9UUkFDRTYoKCBvcGNvZGVfbmFtZVtleGMtPm9wY29kZV0gKyAyICkpOwotICAgICAgICBGVF9UUkFDRTcoKCAiJSpzIiwgKm9wY29kZV9uYW1lW2V4Yy0+b3Bjb2RlXSA9PSAnQScKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxMiAtICggKm9wY29kZV9uYW1lW2V4Yy0+b3Bjb2RlXSAtICcwJyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMiICkpOwotICAgICAgICBmb3IgKCBuID0gMTsgbiA8PSBjbnQ7IG4rKyApCi0gICAgICAgICAgRlRfVFJBQ0U3KCggIiAlZCIsIGV4Yy0+c3RhY2tbZXhjLT50b3AgLSBuXSApKTsKLSAgICAgICAgRlRfVFJBQ0U2KCggIlxuIiApKTsKLSAgICAgIH0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0gICAgICBpZiAoICggZXhjLT5sZW5ndGggPSBvcGNvZGVfbGVuZ3RoW2V4Yy0+b3Bjb2RlXSApIDwgMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5JUCArIDEgPj0gZXhjLT5jb2RlU2l6ZSApCi0gICAgICAgICAgZ290byBMRXJyb3JDb2RlT3ZlcmZsb3dfOwotCi0gICAgICAgIGV4Yy0+bGVuZ3RoID0gMiAtIGV4Yy0+bGVuZ3RoICogZXhjLT5jb2RlW2V4Yy0+SVAgKyAxXTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBleGMtPklQICsgZXhjLT5sZW5ndGggPiBleGMtPmNvZGVTaXplICkKLSAgICAgICAgZ290byBMRXJyb3JDb2RlT3ZlcmZsb3dfOwotCi0gICAgICAvKiBGaXJzdCwgbGV0J3MgY2hlY2sgZm9yIGVtcHR5IHN0YWNrIGFuZCBvdmVyZmxvdyAqLwotICAgICAgZXhjLT5hcmdzID0gZXhjLT50b3AgLSAoIFBvcF9QdXNoX0NvdW50W2V4Yy0+b3Bjb2RlXSA+PiA0ICk7Ci0KLSAgICAgIC8qIGBhcmdzJyBpcyB0aGUgdG9wIG9mIHRoZSBzdGFjayBvbmNlIGFyZ3VtZW50cyBoYXZlIGJlZW4gcG9wcGVkLiAqLwotICAgICAgLyogT25lIGNhbiBhbHNvIGludGVycHJldCBpdCBhcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgYXJndW1lbnQuICAgICovCi0gICAgICBpZiAoIGV4Yy0+YXJncyA8IDAgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7Ci0gICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwdXNoIHplcm9lcyBvbnRvIHRoZSBzdGFjayAqLwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IFBvcF9QdXNoX0NvdW50W2V4Yy0+b3Bjb2RlXSA+PiA0OyBpKysgKQotICAgICAgICAgIGV4Yy0+c3RhY2tbaV0gPSAwOwotICAgICAgICBleGMtPmFyZ3MgPSAwOwotICAgICAgfQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgICAgaWYgKCBleGMtPm9wY29kZSA9PSAweDkxICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcyBpcyB2ZXJ5IHNwZWNpYWw6IEdFVFZBUklBVElPTiByZXR1cm5zICovCi0gICAgICAgIC8qIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAgICAgICAgICAgICAqLwotCi0gICAgICAgIC8qIGl0IGlzIHRoZSBqb2Igb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGBhY3RpdmF0ZScgR1ggaGFuZGxpbmcsICovCi0gICAgICAgIC8qIHRoaXMgaXMsIGNhbGxpbmcgYW55IG9mIHRoZSBHWCBBUEkgZnVuY3Rpb25zIG9uIHRoZSBjdXJyZW50ICovCi0gICAgICAgIC8qIGZvbnQgdG8gc2VsZWN0IGEgdmFyaWF0aW9uIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggZXhjLT5mYWNlLT5ibGVuZCApCi0gICAgICAgICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzICsgZXhjLT5mYWNlLT5ibGVuZC0+bnVtX2F4aXM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzICsgKCBQb3BfUHVzaF9Db3VudFtleGMtPm9wY29kZV0gJiAxNSApOwotCi0gICAgICAvKiBgbmV3X3RvcCcgaXMgdGhlIG5ldyB0b3Agb2YgdGhlIHN0YWNrLCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24ncyAqLwotICAgICAgLyogZXhlY3V0aW9uLiAgYHRvcCcgd2lsbCBiZSBzZXQgdG8gYG5ld190b3AnIGFmdGVyIHRoZSBgc3dpdGNoJyAgKi8KLSAgICAgIC8qIHN0YXRlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGV4Yy0+bmV3X3RvcCA+IGV4Yy0+c3RhY2tTaXplICkKLSAgICAgIHsKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwotICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKLSAgICAgIH0KLQotICAgICAgZXhjLT5zdGVwX2lucyA9IFRSVUU7Ci0gICAgICBleGMtPmVycm9yICAgID0gRlRfRXJyX09rOwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLQotICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKQotICAgICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG9wY29kZV9wYXR0ZXJuczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggb3Bjb2RlX3BvaW50ZXJbaV0gPCBvcGNvZGVfc2l6ZVtpXSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBleGMtPm9wY29kZSA9PSBvcGNvZGVfcGF0dGVybltpXVtvcGNvZGVfcG9pbnRlcltpXV0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wY29kZV9wb2ludGVyW2ldICs9IDE7Ci0KLSAgICAgICAgICAgIGlmICggb3Bjb2RlX3BvaW50ZXJbaV0gPT0gb3Bjb2RlX3NpemVbaV0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9UUkFDRTYoKCAic3BoOiBvcGNvZGUgcHRybjogJWQsICVzICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnJvb3QuZmFtaWx5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+cm9vdC5zdHlsZV9uYW1lICkpOwotCi0gICAgICAgICAgICAgIHN3aXRjaCAoIGkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBvcGNvZGVfcG9pbnRlcltpXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wY29kZV9wb2ludGVyW2ldID0gMDsKLSAgICAgICAgfQotICAgICAgfQotCi0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgICAgewotICAgICAgICBGVF9Mb25nKiAgYXJncyAgID0gZXhjLT5zdGFjayArIGV4Yy0+YXJnczsKLSAgICAgICAgRlRfQnl0ZSAgIG9wY29kZSA9IGV4Yy0+b3Bjb2RlOwotCi0KLSAgICAgICAgc3dpdGNoICggb3Bjb2RlICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDB4MDA6ICAvKiBTVlRDQSB5ICAqLwotICAgICAgICBjYXNlIDB4MDE6ICAvKiBTVlRDQSB4ICAqLwotICAgICAgICBjYXNlIDB4MDI6ICAvKiBTUHZUQ0EgeSAqLwotICAgICAgICBjYXNlIDB4MDM6ICAvKiBTUHZUQ0EgeCAqLwotICAgICAgICBjYXNlIDB4MDQ6ICAvKiBTRnZUQ0EgeSAqLwotICAgICAgICBjYXNlIDB4MDU6ICAvKiBTRnZUQ0EgeCAqLwotICAgICAgICAgIEluc19TeHlUQ0EoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgwNjogIC8qIFNQdlRMIC8vICovCi0gICAgICAgIGNhc2UgMHgwNzogIC8qIFNQdlRMICsgICovCi0gICAgICAgICAgSW5zX1NQVlRMKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MDg6ICAvKiBTRnZUTCAvLyAqLwotICAgICAgICBjYXNlIDB4MDk6ICAvKiBTRnZUTCArICAqLwotICAgICAgICAgIEluc19TRlZUTCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDBBOiAgLyogU1B2RlMgKi8KLSAgICAgICAgICBJbnNfU1BWRlMoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgwQjogIC8qIFNGdkZTICovCi0gICAgICAgICAgSW5zX1NGVkZTKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEM6ICAvKiBHUHYgKi8KLSAgICAgICAgICBJbnNfR1BWKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEQ6ICAvKiBHRnYgKi8KLSAgICAgICAgICBJbnNfR0ZWKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEU6ICAvKiBTRnZUUHYgKi8KLSAgICAgICAgICBJbnNfU0ZWVFBWKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEY6ICAvKiBJU0VDVCAgKi8KLSAgICAgICAgICBJbnNfSVNFQ1QoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxMDogIC8qIFNSUDAgKi8KLSAgICAgICAgICBJbnNfU1JQMCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDExOiAgLyogU1JQMSAqLwotICAgICAgICAgIEluc19TUlAxKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTI6ICAvKiBTUlAyICovCi0gICAgICAgICAgSW5zX1NSUDIoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxMzogIC8qIFNaUDAgKi8KLSAgICAgICAgICBJbnNfU1pQMCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDE0OiAgLyogU1pQMSAqLwotICAgICAgICAgIEluc19TWlAxKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTU6ICAvKiBTWlAyICovCi0gICAgICAgICAgSW5zX1NaUDIoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxNjogIC8qIFNaUFMgKi8KLSAgICAgICAgICBJbnNfU1pQUyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDE3OiAgLyogU0xPT1AgKi8KLSAgICAgICAgICBJbnNfU0xPT1AoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxODogIC8qIFJURyAqLwotICAgICAgICAgIEluc19SVEcoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxOTogIC8qIFJUSEcgKi8KLSAgICAgICAgICBJbnNfUlRIRyggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDFBOiAgLyogU01EICovCi0gICAgICAgICAgSW5zX1NNRCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDFCOiAgLyogRUxTRSAqLwotICAgICAgICAgIEluc19FTFNFKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MUM6ICAvKiBKTVBSICovCi0gICAgICAgICAgSW5zX0pNUFIoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxRDogIC8qIFNDVlRDSSAqLwotICAgICAgICAgIEluc19TQ1ZUQ0koIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxRTogIC8qIFNTV0NJICovCi0gICAgICAgICAgSW5zX1NTV0NJKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MUY6ICAvKiBTU1cgKi8KLSAgICAgICAgICBJbnNfU1NXKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjA6ICAvKiBEVVAgKi8KLSAgICAgICAgICBJbnNfRFVQKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDIxOiAgLyogUE9QICovCi0gICAgICAgICAgSW5zX1BPUCgpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyMjogIC8qIENMRUFSICovCi0gICAgICAgICAgSW5zX0NMRUFSKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjM6ICAvKiBTV0FQICovCi0gICAgICAgICAgSW5zX1NXQVAoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjQ6ICAvKiBERVBUSCAqLwotICAgICAgICAgIEluc19ERVBUSCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDI1OiAgLyogQ0lOREVYICovCi0gICAgICAgICAgSW5zX0NJTkRFWCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDI2OiAgLyogTUlOREVYICovCi0gICAgICAgICAgSW5zX01JTkRFWCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDI3OiAgLyogQUxJR05QVFMgKi8KLSAgICAgICAgICBJbnNfQUxJR05QVFMoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyODogIC8qIFJBVyAqLwotICAgICAgICAgIEluc19VTktOT1dOKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Mjk6ICAvKiBVVFAgKi8KLSAgICAgICAgICBJbnNfVVRQKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MkE6ICAvKiBMT09QQ0FMTCAqLwotICAgICAgICAgIEluc19MT09QQ0FMTCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDJCOiAgLyogQ0FMTCAqLwotICAgICAgICAgIEluc19DQUxMKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MkM6ICAvKiBGREVGICovCi0gICAgICAgICAgSW5zX0ZERUYoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyRDogIC8qIEVOREYgKi8KLSAgICAgICAgICBJbnNfRU5ERiggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDJFOiAgLyogTURBUCAqLwotICAgICAgICBjYXNlIDB4MkY6ICAvKiBNREFQICovCi0gICAgICAgICAgSW5zX01EQVAoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgzMDogIC8qIElVUCAqLwotICAgICAgICBjYXNlIDB4MzE6ICAvKiBJVVAgKi8KLSAgICAgICAgICBJbnNfSVVQKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MzI6ICAvKiBTSFAgKi8KLSAgICAgICAgY2FzZSAweDMzOiAgLyogU0hQICovCi0gICAgICAgICAgSW5zX1NIUCggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDM0OiAgLyogU0hDICovCi0gICAgICAgIGNhc2UgMHgzNTogIC8qIFNIQyAqLwotICAgICAgICAgIEluc19TSEMoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgzNjogIC8qIFNIWiAqLwotICAgICAgICBjYXNlIDB4Mzc6ICAvKiBTSFogKi8KLSAgICAgICAgICBJbnNfU0haKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Mzg6ICAvKiBTSFBJWCAqLwotICAgICAgICAgIEluc19TSFBJWCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDM5OiAgLyogSVAgICAgKi8KLSAgICAgICAgICBJbnNfSVAoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgzQTogIC8qIE1TSVJQICovCi0gICAgICAgIGNhc2UgMHgzQjogIC8qIE1TSVJQICovCi0gICAgICAgICAgSW5zX01TSVJQKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4M0M6ICAvKiBBbGlnblJQICovCi0gICAgICAgICAgSW5zX0FMSUdOUlAoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgzRDogIC8qIFJUREcgKi8KLSAgICAgICAgICBJbnNfUlRERyggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDNFOiAgLyogTUlBUCAqLwotICAgICAgICBjYXNlIDB4M0Y6ICAvKiBNSUFQICovCi0gICAgICAgICAgSW5zX01JQVAoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0MDogIC8qIE5QVVNIQiAqLwotICAgICAgICAgIEluc19OUFVTSEIoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0MTogIC8qIE5QVVNIVyAqLwotICAgICAgICAgIEluc19OUFVTSFcoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0MjogIC8qIFdTICovCi0gICAgICAgICAgSW5zX1dTKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NDM6ICAvKiBSUyAqLwotICAgICAgICAgIEluc19SUyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQ0OiAgLyogV0NWVFAgKi8KLSAgICAgICAgICBJbnNfV0NWVFAoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0NTogIC8qIFJDVlQgKi8KLSAgICAgICAgICBJbnNfUkNWVCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQ2OiAgLyogR0MgKi8KLSAgICAgICAgY2FzZSAweDQ3OiAgLyogR0MgKi8KLSAgICAgICAgICBJbnNfR0MoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0ODogIC8qIFNDRlMgKi8KLSAgICAgICAgICBJbnNfU0NGUyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQ5OiAgLyogTUQgKi8KLSAgICAgICAgY2FzZSAweDRBOiAgLyogTUQgKi8KLSAgICAgICAgICBJbnNfTUQoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0QjogIC8qIE1QUEVNICovCi0gICAgICAgICAgSW5zX01QUEVNKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NEM6ICAvKiBNUFMgKi8KLSAgICAgICAgICBJbnNfTVBTKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NEQ6ICAvKiBGTElQT04gKi8KLSAgICAgICAgICBJbnNfRkxJUE9OKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NEU6ICAvKiBGTElQT0ZGICovCi0gICAgICAgICAgSW5zX0ZMSVBPRkYoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0RjogIC8qIERFQlVHICovCi0gICAgICAgICAgSW5zX0RFQlVHKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTA6ICAvKiBMVCAqLwotICAgICAgICAgIEluc19MVCggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1MTogIC8qIExURVEgKi8KLSAgICAgICAgICBJbnNfTFRFUSggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1MjogIC8qIEdUICovCi0gICAgICAgICAgSW5zX0dUKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDUzOiAgLyogR1RFUSAqLwotICAgICAgICAgIEluc19HVEVRKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDU0OiAgLyogRVEgKi8KLSAgICAgICAgICBJbnNfRVEoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTU6ICAvKiBORVEgKi8KLSAgICAgICAgICBJbnNfTkVRKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDU2OiAgLyogT0REICovCi0gICAgICAgICAgSW5zX09ERCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDU3OiAgLyogRVZFTiAqLwotICAgICAgICAgIEluc19FVkVOKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTg6ICAvKiBJRiAqLwotICAgICAgICAgIEluc19JRiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDU5OiAgLyogRUlGICovCi0gICAgICAgICAgSW5zX0VJRigpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1QTogIC8qIEFORCAqLwotICAgICAgICAgIEluc19BTkQoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NUI6ICAvKiBPUiAqLwotICAgICAgICAgIEluc19PUiggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1QzogIC8qIE5PVCAqLwotICAgICAgICAgIEluc19OT1QoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NUQ6ICAvKiBERUxUQVAxICovCi0gICAgICAgICAgSW5zX0RFTFRBUCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDVFOiAgLyogU0RCICovCi0gICAgICAgICAgSW5zX1NEQiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDVGOiAgLyogU0RTICovCi0gICAgICAgICAgSW5zX1NEUyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDYwOiAgLyogQUREICovCi0gICAgICAgICAgSW5zX0FERCggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2MTogIC8qIFNVQiAqLwotICAgICAgICAgIEluc19TVUIoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NjI6ICAvKiBESVYgKi8KLSAgICAgICAgICBJbnNfRElWKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NjM6ICAvKiBNVUwgKi8KLSAgICAgICAgICBJbnNfTVVMKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDY0OiAgLyogQUJTICovCi0gICAgICAgICAgSW5zX0FCUyggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2NTogIC8qIE5FRyAqLwotICAgICAgICAgIEluc19ORUcoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NjY6ICAvKiBGTE9PUiAqLwotICAgICAgICAgIEluc19GTE9PUiggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2NzogIC8qIENFSUxJTkcgKi8KLSAgICAgICAgICBJbnNfQ0VJTElORyggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2ODogIC8qIFJPVU5EICovCi0gICAgICAgIGNhc2UgMHg2OTogIC8qIFJPVU5EICovCi0gICAgICAgIGNhc2UgMHg2QTogIC8qIFJPVU5EICovCi0gICAgICAgIGNhc2UgMHg2QjogIC8qIFJPVU5EICovCi0gICAgICAgICAgSW5zX1JPVU5EKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NkM6ICAvKiBOUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDZEOiAgLyogTlJPVU5EICovCi0gICAgICAgIGNhc2UgMHg2RTogIC8qIE5SUlVORCAqLwotICAgICAgICBjYXNlIDB4NkY6ICAvKiBOUk9VTkQgKi8KLSAgICAgICAgICBJbnNfTlJPVU5EKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzA6ICAvKiBXQ1ZURiAqLwotICAgICAgICAgIEluc19XQ1ZURiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDcxOiAgLyogREVMVEFQMiAqLwotICAgICAgICBjYXNlIDB4NzI6ICAvKiBERUxUQVAzICovCi0gICAgICAgICAgSW5zX0RFTFRBUCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDczOiAgLyogREVMVEFDMCAqLwotICAgICAgICBjYXNlIDB4NzQ6ICAvKiBERUxUQUMxICovCi0gICAgICAgIGNhc2UgMHg3NTogIC8qIERFTFRBQzIgKi8KLSAgICAgICAgICBJbnNfREVMVEFDKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzY6ICAvKiBTUk9VTkQgKi8KLSAgICAgICAgICBJbnNfU1JPVU5EKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Nzc6ICAvKiBTNDVSb3VuZCAqLwotICAgICAgICAgIEluc19TNDVST1VORCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDc4OiAgLyogSlJPVCAqLwotICAgICAgICAgIEluc19KUk9UKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Nzk6ICAvKiBKUk9GICovCi0gICAgICAgICAgSW5zX0pST0YoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3QTogIC8qIFJPRkYgKi8KLSAgICAgICAgICBJbnNfUk9GRiggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDdCOiAgLyogPz8/PyAqLwotICAgICAgICAgIEluc19VTktOT1dOKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4N0M6ICAvKiBSVVRHICovCi0gICAgICAgICAgSW5zX1JVVEcoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3RDogIC8qIFJEVEcgKi8KLSAgICAgICAgICBJbnNfUkRURyggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDdFOiAgLyogU0FOR1cgKi8KLSAgICAgICAgICBJbnNfU0FOR1coKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4N0Y6ICAvKiBBQSAqLwotICAgICAgICAgIEluc19BQSgpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4MDogIC8qIEZMSVBQVCAqLwotICAgICAgICAgIEluc19GTElQUFQoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4MTogIC8qIEZMSVBSR09OICovCi0gICAgICAgICAgSW5zX0ZMSVBSR09OKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ODI6ICAvKiBGTElQUkdPRkYgKi8KLSAgICAgICAgICBJbnNfRkxJUFJHT0ZGKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ODM6ICAvKiBVTktOT1dOICovCi0gICAgICAgIGNhc2UgMHg4NDogIC8qIFVOS05PV04gKi8KLSAgICAgICAgICBJbnNfVU5LTk9XTiggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDg1OiAgLyogU0NBTkNUUkwgKi8KLSAgICAgICAgICBJbnNfU0NBTkNUUkwoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4NjogIC8qIFNEUHZUTCAqLwotICAgICAgICBjYXNlIDB4ODc6ICAvKiBTRFB2VEwgKi8KLSAgICAgICAgICBJbnNfU0RQVlRMKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ODg6ICAvKiBHRVRJTkZPICovCi0gICAgICAgICAgSW5zX0dFVElORk8oIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4OTogIC8qIElERUYgKi8KLSAgICAgICAgICBJbnNfSURFRiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDhBOiAgLyogUk9MTCAqLwotICAgICAgICAgIEluc19ST0xMKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDhCOiAgLyogTUFYICovCi0gICAgICAgICAgSW5zX01BWCggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4QzogIC8qIE1JTiAqLwotICAgICAgICAgIEluc19NSU4oIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEQ6ICAvKiBTQ0FOVFlQRSAqLwotICAgICAgICAgIEluc19TQ0FOVFlQRSggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDhFOiAgLyogSU5TVENUUkwgKi8KLSAgICAgICAgICBJbnNfSU5TVENUUkwoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4RjogIC8qIEFESlVTVCAqLwotICAgICAgICBjYXNlIDB4OTA6ICAvKiBBREpVU1QgKi8KLSAgICAgICAgICBJbnNfVU5LTk9XTiggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgICAgIGNhc2UgMHg5MToKLSAgICAgICAgICAvKiBpdCBpcyB0aGUgam9iIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBgYWN0aXZhdGUnIEdYIGhhbmRsaW5nLCAqLwotICAgICAgICAgIC8qIHRoaXMgaXMsIGNhbGxpbmcgYW55IG9mIHRoZSBHWCBBUEkgZnVuY3Rpb25zIG9uIHRoZSBjdXJyZW50ICovCi0gICAgICAgICAgLyogZm9udCB0byBzZWxlY3QgYSB2YXJpYXRpb24gaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGV4Yy0+ZmFjZS0+YmxlbmQgKQotICAgICAgICAgICAgSW5zX0dFVFZBUklBVElPTiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgSW5zX1VOS05PV04oIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg5MjoKLSAgICAgICAgICAvKiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgTVMgZm9udCAoTGFvVUkudHRmIHZlcnNpb24gNS4wMSkgdGhhdCAqLwotICAgICAgICAgIC8qIHVzZXMgSURFRnMgZm9yIDB4OTEgYW5kIDB4OTI7IGZvciB0aGlzIHJlYXNvbiB3ZSBhY3RpdmF0ZSAgICovCi0gICAgICAgICAgLyogR0VUREFUQSBmb3IgR1ggZm9udHMgb25seSwgc2ltaWxhciB0byBHRVRWQVJJQVRJT04gICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGV4Yy0+ZmFjZS0+YmxlbmQgKQotICAgICAgICAgICAgSW5zX0dFVERBVEEoIGFyZ3MgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBJbnNfVU5LTk9XTiggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGlmICggb3Bjb2RlID49IDB4RTAgKQotICAgICAgICAgICAgSW5zX01JUlAoIGV4YywgYXJncyApOwotICAgICAgICAgIGVsc2UgaWYgKCBvcGNvZGUgPj0gMHhDMCApCi0gICAgICAgICAgICBJbnNfTURSUCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgZWxzZSBpZiAoIG9wY29kZSA+PSAweEI4ICkKLSAgICAgICAgICAgIEluc19QVVNIVyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgZWxzZSBpZiAoIG9wY29kZSA+PSAweEIwICkKLSAgICAgICAgICAgIEluc19QVVNIQiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgSW5zX1VOS05PV04oIGV4YyApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXhjLT5lcnJvciApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGV4Yy0+ZXJyb3IgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogbG9va2luZyBmb3IgcmVkZWZpbmVkIGluc3RydWN0aW9ucyAqLwotICAgICAgICBjYXNlIEZUX0VSUiggSW52YWxpZF9PcGNvZGUgKToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBkZWYgICA9IGV4Yy0+SURlZnM7Ci0gICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtSURlZnM7Ci0KLQotICAgICAgICAgICAgZm9yICggOyBkZWYgPCBsaW1pdDsgZGVmKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIGRlZi0+YWN0aXZlICYmIGV4Yy0+b3Bjb2RlID09IChGVF9CeXRlKWRlZi0+b3BjICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRUX0NhbGxSZWMqICBjYWxscmVjOwotCi0KLSAgICAgICAgICAgICAgICBpZiAoIGV4Yy0+Y2FsbFRvcCA+PSBleGMtPmNhbGxTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICAgICAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYWxscmVjID0gJmV4Yy0+Y2FsbFN0YWNrW2V4Yy0+Y2FsbFRvcF07Ci0KLSAgICAgICAgICAgICAgICBjYWxscmVjLT5DYWxsZXJfUmFuZ2UgPSBleGMtPmN1clJhbmdlOwotICAgICAgICAgICAgICAgIGNhbGxyZWMtPkNhbGxlcl9JUCAgICA9IGV4Yy0+SVAgKyAxOwotICAgICAgICAgICAgICAgIGNhbGxyZWMtPkN1cl9Db3VudCAgICA9IDE7Ci0gICAgICAgICAgICAgICAgY2FsbHJlYy0+RGVmICAgICAgICAgID0gZGVmOwotCi0gICAgICAgICAgICAgICAgaWYgKCBJbnNfR290b19Db2RlUmFuZ2UoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmLT5yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmLT5zdGFydCApID09IEZBSUxVUkUgKQotICAgICAgICAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0KLSAgICAgICAgICAgICAgICBnb3RvIExTdWl0ZUxhYmVsXzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9PcGNvZGUgKTsKLSAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKLQotI2lmIDAKLSAgICAgICAgICBicmVhazsgICAvKiBVbnJlYWNoYWJsZSBjb2RlIHdhcm5pbmcgc3VwcHJlc3Npb24uICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgLyogTGVhdmUgdG8gcmVtaW5kIGluIGNhc2UgYSBsYXRlciBjaGFuZ2UgdGhlIGVkaXRvciAqLwotICAgICAgICAgICAgICAgICAgIC8qIHRvIGNvbnNpZGVyIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZgotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0KLSNpZiAwCi0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZXhjLT50b3AgPSBleGMtPm5ld190b3A7Ci0KLSAgICAgIGlmICggZXhjLT5zdGVwX2lucyApCi0gICAgICAgIGV4Yy0+SVAgKz0gZXhjLT5sZW5ndGg7Ci0KLSAgICAgIC8qIGluY3JlbWVudCBpbnN0cnVjdGlvbiBjb3VudGVyIGFuZCBjaGVjayBpZiB3ZSBkaWRuJ3QgKi8KLSAgICAgIC8qIHJ1biB0aGlzIHByb2dyYW0gZm9yIHRvbyBsb25nIChlLmcuIGluZmluaXRlIGxvb3BzKS4gKi8KLSAgICAgIGlmICggKytpbnNfY291bnRlciA+IFRUX0NPTkZJR19PUFRJT05fTUFYX1JVTk5BQkxFX09QQ09ERVMgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEV4ZWN1dGlvbl9Ub29fTG9uZyApOwotCi0gICAgTFN1aXRlTGFiZWxfOgotICAgICAgaWYgKCBleGMtPklQID49IGV4Yy0+Y29kZVNpemUgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+Y2FsbFRvcCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBDb2RlX092ZXJmbG93ICk7Ci0gICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGdvdG8gTE5vX0Vycm9yXzsKLSAgICAgIH0KLSAgICB9IHdoaWxlICggIWV4Yy0+aW5zdHJ1Y3Rpb25fdHJhcCApOwotCi0gIExOb19FcnJvcl86Ci0gICAgRlRfVFJBQ0U0KCggIiAgJWQgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkXG4iLCBpbnNfY291bnRlciApKTsKLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIExFcnJvckNvZGVPdmVyZmxvd186Ci0gICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBDb2RlX092ZXJmbG93ICk7Ci0KLSAgTEVycm9yTGFiZWxfOgotICAgIGlmICggZXhjLT5lcnJvciAmJiAhZXhjLT5pbnN0cnVjdGlvbl90cmFwICkKLSAgICAgIEZUX1RSQUNFMSgoICIgIFRoZSBpbnRlcnByZXRlciByZXR1cm5lZCBlcnJvciAweCV4XG4iLCBleGMtPmVycm9yICkpOwotCi0gICAgcmV0dXJuIGV4Yy0+ZXJyb3I7Ci0gIH0KLQotI2Vsc2UgLyogIVRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gIC8qIEFOU0kgQyBkb2Vzbid0IGxpa2UgZW1wdHkgc291cmNlIGZpbGVzICovCi0gIHR5cGVkZWYgaW50ICBfdHRfaW50ZXJwX2R1bW15OwotCi0jZW5kaWYgLyogIVRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmggYi9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiZWNmYy4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGludGVycC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVFRJTlRFUlBfSF8KLSNkZWZpbmUgVFRJTlRFUlBfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRvYmpzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJvdW5kaW5nIG1vZGUgY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfUm91bmRfT2ZmICAgICAgICAgICAgIDUKLSNkZWZpbmUgVFRfUm91bmRfVG9fSGFsZl9HcmlkICAgIDAKLSNkZWZpbmUgVFRfUm91bmRfVG9fR3JpZCAgICAgICAgIDEKLSNkZWZpbmUgVFRfUm91bmRfVG9fRG91YmxlX0dyaWQgIDIKLSNkZWZpbmUgVFRfUm91bmRfVXBfVG9fR3JpZCAgICAgIDQKLSNkZWZpbmUgVFRfUm91bmRfRG93bl9Ub19HcmlkICAgIDMKLSNkZWZpbmUgVFRfUm91bmRfU3VwZXIgICAgICAgICAgIDYKLSNkZWZpbmUgVFRfUm91bmRfU3VwZXJfNDUgICAgICAgIDcKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRnVuY3Rpb24gdHlwZXMgdXNlZCBieSB0aGUgaW50ZXJwcmV0ZXIsIGRlcGVuZGluZyBvbiB2YXJpb3VzIG1vZGVzICAgICovCi0gIC8qIChlLmcuIHRoZSByb3VuZGluZyBtb2RlLCB3aGV0aGVyIHRvIHJlbmRlciBhIHZlcnRpY2FsIG9yIGhvcml6b250YWwgICAqLwotICAvKiBsaW5lIGV0YykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIFJvdW5kaW5nIGZ1bmN0aW9uICovCi0gIHR5cGVkZWYgRlRfRjI2RG90NgotICAoKlRUX1JvdW5kX0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKTsKLQotICAvKiBQb2ludCBkaXNwbGFjZW1lbnQgYWxvbmcgdGhlIGZyZWVkb20gdmVjdG9yIHJvdXRpbmUgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVFRfTW92ZV9GdW5jKSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICBUVF9HbHlwaFpvbmUgICAgem9uZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlICk7Ci0KLSAgLyogRGlzdGFuY2UgcHJvamVjdGlvbiBhbG9uZyBvbmUgb2YgdGhlIHByb2plY3Rpb24gdmVjdG9ycyAqLwotICB0eXBlZGVmIEZUX0YyNkRvdDYKLSAgKCpUVF9Qcm9qZWN0X0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHkgKTsKLQotICAvKiBnZXR0aW5nIGN1cnJlbnQgcHBlbS4gIFRha2UgY2FyZSBvZiBub24tc3F1YXJlIHBpeGVscyBpZiBuZWNlc3NhcnkgKi8KLSAgdHlwZWRlZiBGVF9Mb25nCi0gICgqVFRfQ3VyX1BwZW1fRnVuYykoIFRUX0V4ZWNDb250ZXh0ICBleGMgKTsKLQotICAvKiByZWFkaW5nIGEgY3Z0IHZhbHVlLiAgVGFrZSBjYXJlIG9mIG5vbi1zcXVhcmUgcGl4ZWxzIGlmIG5lY2Vzc2FyeSAqLwotICB0eXBlZGVmIEZUX0YyNkRvdDYKLSAgKCpUVF9HZXRfQ1ZUX0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpZHggKTsKLQotICAvKiBzZXR0aW5nIG9yIG1vdmluZyBhIGN2dCB2YWx1ZS4gIFRha2UgY2FyZSBvZiBub24tc3F1YXJlIHBpeGVscyAgKi8KLSAgLyogaWYgbmVjZXNzYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlRUX1NldF9DVlRfRnVuYykoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGNhbGwgcmVjb3JkLCB1c2VkIHRvIG1hbmFnZSBmdW5jdGlvbiBjYWxscy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ2FsbFJlY18KLSAgewotICAgIEZUX0ludCAgIENhbGxlcl9SYW5nZTsKLSAgICBGVF9Mb25nICBDYWxsZXJfSVA7Ci0gICAgRlRfTG9uZyAgQ3VyX0NvdW50OwotCi0gICAgVFRfRGVmUmVjb3JkICAqRGVmOyAvKiBlaXRoZXIgRkRFRiBvciBJREVGICovCi0KLSAgfSBUVF9DYWxsUmVjLCAqVFRfQ2FsbFN0YWNrOwotCi0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2Ugc3RydWN0dXJlcyBkZWZpbmUgcnVsZXMgdXNlZCB0byB0d2VhayBzdWJwaXhlbCBoaW50aW5nIGZvciAgICAgICovCi0gIC8qIHZhcmlvdXMgZm9udHMuICAiIiwgMCwgIiIsIE5VTEwgdmFsdWUgaW5kaWNhdGVzIHRvIG1hdGNoIGFueSB2YWx1ZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBTUEhfTUFYX05BTUVfU0laRSAgICAgIDMyCi0jZGVmaW5lIFNQSF9NQVhfQ0xBU1NfTUVNQkVSUyAgMTAwCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFNQSF9Ud2Vha1J1bGVfCi0gIHsKLSAgICBjb25zdCBjaGFyICAgICAgZmFtaWx5W1NQSF9NQVhfTkFNRV9TSVpFXTsKLSAgICBjb25zdCBGVF9VSW50ICAgcHBlbTsKLSAgICBjb25zdCBjaGFyICAgICAgc3R5bGVbU1BIX01BWF9OQU1FX1NJWkVdOwotICAgIGNvbnN0IEZUX1VMb25nICBnbHlwaDsKLQotICB9IFNQSF9Ud2Vha1J1bGU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgU1BIX1NjYWxlUnVsZV8KLSAgewotICAgIGNvbnN0IGNoYXIgICAgICBmYW1pbHlbU1BIX01BWF9OQU1FX1NJWkVdOwotICAgIGNvbnN0IEZUX1VJbnQgICBwcGVtOwotICAgIGNvbnN0IGNoYXIgICAgICBzdHlsZVtTUEhfTUFYX05BTUVfU0laRV07Ci0gICAgY29uc3QgRlRfVUxvbmcgIGdseXBoOwotICAgIGNvbnN0IEZUX1VMb25nICBzY2FsZTsKLQotICB9IFNQSF9TY2FsZVJ1bGU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgU1BIX0ZvbnRfQ2xhc3NfCi0gIHsKLSAgICBjb25zdCBjaGFyICBuYW1lW1NQSF9NQVhfTkFNRV9TSVpFXTsKLSAgICBjb25zdCBjaGFyICBtZW1iZXJbU1BIX01BWF9DTEFTU19NRU1CRVJTXVtTUEhfTUFYX05BTUVfU0laRV07Ci0KLSAgfSBTUEhfRm9udF9DbGFzczsKLQotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWluIHN0cnVjdHVyZSBmb3IgdGhlIGludGVycHJldGVyIHdoaWNoIGNvbGxlY3RzIGFsbCBuZWNlc3NhcnkgICAqLwotICAvKiB2YXJpYWJsZXMgYW5kIHN0YXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9FeGVjQ29udGV4dFJlY18KLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgICBmYWNlOwotICAgIFRUX1NpemUgICAgICAgICAgICBzaXplOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnk7Ci0KLSAgICAvKiBpbnN0cnVjdGlvbnMgc3RhdGUgKi8KLQotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsgICAgICAvKiBsYXN0IGV4ZWN1dGlvbiBlcnJvciAqLwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgIHRvcDsgICAgICAgIC8qIHRvcCBvZiBleGVjLiBzdGFjayAgICovCi0KLSAgICBGVF9Mb25nICAgICAgICAgICAgc3RhY2tTaXplOyAgLyogc2l6ZSBvZiBleGVjLiBzdGFjayAgKi8KLSAgICBGVF9Mb25nKiAgICAgICAgICAgc3RhY2s7ICAgICAgLyogY3VycmVudCBleGVjLiBzdGFjayAgKi8KLQotICAgIEZUX0xvbmcgICAgICAgICAgICBhcmdzOwotICAgIEZUX0xvbmcgICAgICAgICAgICBuZXdfdG9wOyAgICAvKiBuZXcgdG9wIGFmdGVyIGV4ZWMuICAqLwotCi0gICAgVFRfR2x5cGhab25lUmVjICAgIHpwMCwgICAgICAgIC8qIHpvbmUgcmVjb3JkcyAqLwotICAgICAgICAgICAgICAgICAgICAgICB6cDEsCi0gICAgICAgICAgICAgICAgICAgICAgIHpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHRzLAotICAgICAgICAgICAgICAgICAgICAgICB0d2lsaWdodDsKLQotICAgIEZUX0xvbmcgICAgICAgICAgICBwb2ludFNpemU7ICAvKiBpbiAyNi42IGZvcm1hdCAqLwotICAgIEZUX1NpemVfTWV0cmljcyAgICBtZXRyaWNzOwotICAgIFRUX1NpemVfTWV0cmljcyAgICB0dF9tZXRyaWNzOyAvKiBzaXplIG1ldHJpY3MgKi8KLQotICAgIFRUX0dyYXBoaWNzU3RhdGUgICBHUzsgICAgICAgICAvKiBjdXJyZW50IGdyYXBoaWNzIHN0YXRlICovCi0KLSAgICBGVF9JbnQgICAgICAgICAgICAgY3VyUmFuZ2U7ICAvKiBjdXJyZW50IGNvZGUgcmFuZ2UgbnVtYmVyICAgKi8KLSAgICBGVF9CeXRlKiAgICAgICAgICAgY29kZTsgICAgICAvKiBjdXJyZW50IGNvZGUgcmFuZ2UgICAgICAgICAgKi8KLSAgICBGVF9Mb25nICAgICAgICAgICAgSVA7ICAgICAgICAvKiBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgKi8KLSAgICBGVF9Mb25nICAgICAgICAgICAgY29kZVNpemU7ICAvKiBzaXplIG9mIGN1cnJlbnQgcmFuZ2UgICAgICAgKi8KLQotICAgIEZUX0J5dGUgICAgICAgICAgICBvcGNvZGU7ICAgIC8qIGN1cnJlbnQgb3Bjb2RlICAgICAgICAgICAgICAqLwotICAgIEZUX0ludCAgICAgICAgICAgICBsZW5ndGg7ICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG9wY29kZSAgICAqLwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHN0ZXBfaW5zOyAgLyogdHJ1ZSBpZiB0aGUgaW50ZXJwcmV0ZXIgbXVzdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluY3JlbWVudCBJUCBhZnRlciBpbnMuIGV4ZWMgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgY3Z0U2l6ZTsKLSAgICBGVF9Mb25nKiAgICAgICAgICAgY3Z0OwotCi0gICAgRlRfVUludCAgICAgICAgICAgIGdseXBoU2l6ZTsgLyogZ2x5cGggaW5zdHJ1Y3Rpb25zIGJ1ZmZlciBzaXplICovCi0gICAgRlRfQnl0ZSogICAgICAgICAgIGdseXBoSW5zOyAgLyogZ2x5cGggaW5zdHJ1Y3Rpb25zIGJ1ZmZlciAqLwotCi0gICAgRlRfVUludCAgICAgICAgICAgIG51bUZEZWZzOyAgLyogbnVtYmVyIG9mIGZ1bmN0aW9uIGRlZnMgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICBtYXhGRGVmczsgIC8qIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uIGRlZnMgKi8KLSAgICBUVF9EZWZBcnJheSAgICAgICAgRkRlZnM7ICAgICAvKiB0YWJsZSBvZiBGRGVmcyBlbnRyaWVzICAgICAgICAgICovCi0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtSURlZnM7ICAvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gZGVmcyAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICBtYXhJRGVmczsgIC8qIG1heGltdW0gbnVtYmVyIG9mIGlucyBkZWZzICovCi0gICAgVFRfRGVmQXJyYXkgICAgICAgIElEZWZzOyAgICAgLyogdGFibGUgb2YgSURlZnMgZW50cmllcyAgICAgKi8KLQotICAgIEZUX1VJbnQgICAgICAgICAgICBtYXhGdW5jOyAgIC8qIG1heGltdW0gZnVuY3Rpb24gaW5kZXggICAgICovCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heEluczsgICAgLyogbWF4aW11bSBpbnN0cnVjdGlvbiBpbmRleCAgKi8KLQotICAgIEZUX0ludCAgICAgICAgICAgICBjYWxsVG9wLCAgICAvKiB0b3Agb2YgY2FsbCBzdGFjayBkdXJpbmcgZXhlY3V0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbGxTaXplOyAgIC8qIHNpemUgb2YgY2FsbCBzdGFjayAqLwotICAgIFRUX0NhbGxTdGFjayAgICAgICBjYWxsU3RhY2s7ICAvKiBjYWxsIHN0YWNrICovCi0KLSAgICBGVF9VU2hvcnQgICAgICAgICAgbWF4UG9pbnRzOyAgICAvKiBjYXBhY2l0eSBvZiB0aGlzIGNvbnRleHQncyBgcHRzJyAqLwotICAgIEZUX1Nob3J0ICAgICAgICAgICBtYXhDb250b3VyczsgIC8qIHJlY29yZCwgZXhwcmVzc2VkIGluIHBvaW50cyBhbmQgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udG91cnMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIFRUX0NvZGVSYW5nZVRhYmxlICBjb2RlUmFuZ2VUYWJsZTsgIC8qIHRhYmxlIG9mIHZhbGlkIGNvZGUgcmFuZ2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlZnVsIGZvciB0aGUgZGVidWdnZXIgICAqLwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgIHN0b3JlU2l6ZTsgIC8qIHNpemUgb2YgY3VycmVudCBzdG9yYWdlICovCi0gICAgRlRfTG9uZyogICAgICAgICAgIHN0b3JhZ2U7ICAgIC8qIHN0b3JhZ2UgYXJlYSAgICAgICAgICAgICovCi0KLSAgICBGVF9GMjZEb3Q2ICAgICAgICAgcGVyaW9kOyAgICAgLyogdmFsdWVzIHVzZWQgZm9yIHRoZSAqLwotICAgIEZUX0YyNkRvdDYgICAgICAgICBwaGFzZTsgICAgICAvKiBgU3VwZXJSb3VuZGluZycgICAgICovCi0gICAgRlRfRjI2RG90NiAgICAgICAgIHRocmVzaG9sZDsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICBpbnN0cnVjdGlvbl90cmFwOyAvKiBJZiBgVHJ1ZScsIHRoZSBpbnRlcnByZXRlciB3aWxsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgYWZ0ZXIgZWFjaCBpbnN0cnVjdGlvbiAgICAgKi8KLQotICAgIFRUX0dyYXBoaWNzU3RhdGUgICBkZWZhdWx0X0dTOyAgICAgICAvKiBncmFwaGljcyBzdGF0ZSByZXN1bHRpbmcgZnJvbSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBwcmVwIHByb2dyYW0gICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgaXNfY29tcG9zaXRlOyAgICAgLyogdHJ1ZSBpZiB0aGUgZ2x5cGggaXMgY29tcG9zaXRlICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBwZWRhbnRpY19oaW50aW5nOyAvKiB0cnVlIGlmIHBlZGFudGljIGludGVycHJldGF0aW9uICovCi0KLSAgICAvKiBsYXRlc3QgaW50ZXJwcmV0ZXIgYWRkaXRpb25zICovCi0KLSAgICBGVF9Mb25nICAgICAgICAgICAgRl9kb3RfUDsgICAgLyogZG90IHByb2R1Y3Qgb2YgZnJlZWRvbSBhbmQgcHJvamVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgVFRfUm91bmRfRnVuYyAgICAgIGZ1bmNfcm91bmQ7IC8qIGN1cnJlbnQgcm91bmRpbmcgZnVuY3Rpb24gICAgICAgICAgICAgKi8KLQotICAgIFRUX1Byb2plY3RfRnVuYyAgICBmdW5jX3Byb2plY3QsICAgLyogY3VycmVudCBwcm9qZWN0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfZHVhbHByb2osICAvKiBjdXJyZW50IGR1YWwgcHJvai4gZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgZnVuY19mcmVlUHJvajsgIC8qIGN1cnJlbnQgZnJlZWRvbSBwcm9qLiBmdW5jICAqLwotCi0gICAgVFRfTW92ZV9GdW5jICAgICAgIGZ1bmNfbW92ZTsgICAgICAvKiBjdXJyZW50IHBvaW50IG1vdmUgZnVuY3Rpb24gKi8KLSAgICBUVF9Nb3ZlX0Z1bmMgICAgICAgZnVuY19tb3ZlX29yaWc7IC8qIG1vdmUgb3JpZ2luYWwgcG9zaXRpb24gZnVuY3Rpb24gKi8KLQotICAgIFRUX0N1cl9QcGVtX0Z1bmMgICBmdW5jX2N1cl9wcGVtOyAgLyogZ2V0IGN1cnJlbnQgcHJvai4gcHBlbSB2YWx1ZSAgKi8KLQotICAgIFRUX0dldF9DVlRfRnVuYyAgICBmdW5jX3JlYWRfY3Z0OyAgLyogcmVhZCBhIGN2dCBlbnRyeSAgICAgICAgICAgICAgKi8KLSAgICBUVF9TZXRfQ1ZUX0Z1bmMgICAgZnVuY193cml0ZV9jdnQ7IC8qIHdyaXRlIGEgY3Z0IGVudHJ5IChpbiBwaXhlbHMpICovCi0gICAgVFRfU2V0X0NWVF9GdW5jICAgIGZ1bmNfbW92ZV9jdnQ7ICAvKiBpbmNyIGEgY3Z0IGVudHJ5IChpbiBwaXhlbHMpICAqLwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIGdyYXlzY2FsZTsgICAgICAvKiBiaS1sZXZlbCBoaW50aW5nIGFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheXNjYWxlIHJlbmRlcmluZyAgKi8KLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0gICAgLyoKLSAgICAgKiBGcmVlVHlwZSBzdXBwb3J0cyBDbGVhclR5cGUtbGlrZSBoaW50aW5nIG9mIFRydWVUeXBlIGZvbnRzIHRocm91Z2gKLSAgICAgKiB0aGUgdmVyc2lvbiA0MCBpbnRlcnByZXRlci4gIFRoaXMgaXMgYWNoaWV2ZWQgdGhyb3VnaCBzZXZlcmFsIGhhY2tzCi0gICAgICogaW4gdGhlIGJhc2UgKHYzNSkgaW50ZXJwcmV0ZXIsIGFzIGRldGFpbGVkIGJlbG93LgotICAgICAqCi0gICAgICogQ2xlYXJUeXBlIGlzIGFuIHVtYnJlbGxhIHRlcm0gZm9yIHNldmVyYWwgcmVuZGVyaW5nIHRlY2huaXF1ZXMKLSAgICAgKiBlbXBsb3llZCBieSBNaWNyb3NvZnQncyB2YXJpb3VzIEdVSSBhbmQgcmVuZGVyaW5nIHRvb2xraXQKLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMsIG1vc3QgaW1wb3J0YW50bHk6IHN1YnBpeGVsIHJlbmRlcmluZyBmb3IgdXNpbmcgdGhlCi0gICAgICogUkdCIHN1YnBpeGVscyBvZiBMQ0RzIHRvIGFwcHJveGltYXRlbHkgdHJpcGxlIHRoZSBwZXJjZWl2ZWQKLSAgICAgKiByZXNvbHV0aW9uIG9uIHRoZSB4LWF4aXMgYW5kIHN1YnBpeGVsIGhpbnRpbmcgZm9yIHBvc2l0aW9uaW5nIHN0ZW1zCi0gICAgICogb24gc3VicGl4ZWwgYm9yZGVycy4gIFRydWVUeXBlIHByb2dyYW1taW5nIGlzIGV4cGxpY2l0LCBpLmUuLCBmb250cwotICAgICAqIG11c3QgYmUgcHJvZ3JhbW1lZCB0byB0YWtlIGFkdmFudGFnZSBvZiBDbGVhclR5cGUncyBwb3NzaWJpbGl0aWVzLgotICAgICAqCi0gICAgICogV2hlbiBDbGVhclR5cGUgd2FzIGludHJvZHVjZWQsIGl0IHNlZW1lZCB1bmxpa2VseSB0aGF0IGFsbCBmb250cwotICAgICAqIHdvdWxkIGJlIHJlcHJvZ3JhbW1lZCwgc28gTWljcm9zb2Z0IGRlY2lkZWQgdG8gaW1wbGVtZW50IGEgYmFja3dhcmQKLSAgICAgKiBjb21wYXRpYmlsaXR5IG1vZGUuICBJdCBlbXBsb3lzIHNldmVyYWwgc2ltcGxlIHRvIGNvbXBsaWNhdGVkCi0gICAgICogYXNzdW1wdGlvbnMgYW5kIHRyaWNrcywgbWFueSBvZiB0aGVtIGZvbnQtZGVwZW5kZW50LCB0aGF0IG1vZGlmeSB0aGUKLSAgICAgKiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYnl0ZWNvZGUgY29udGFpbmVkIGluIHRoZXNlIGZvbnRzIHRvIHJldHJvZml0Ci0gICAgICogdGhlbSBpbnRvIGEgQ2xlYXJUeXBlLXkgbG9vay4gIFRoZSBxdWFsaXR5IG9mIHRoZSByZXN1bHRzIHZhcmllcy4KLSAgICAgKiBNb3N0ICh3ZWIpZm9udHMgdGhhdCB3ZXJlIHJlbGVhc2VkIHNpbmNlIHRoZW4gaGF2ZSBjb21lIHRvIHJlbHkgb24KLSAgICAgKiB0aGVzZSBoYWNrcyB0byByZW5kZXIgY29ycmVjdGx5LCBldmVuIHNvbWUgb2YgTWljcm9zb2Z0J3MgZmxhZ3NoaXAKLSAgICAgKiBmb250cyAoZS5nLiwgQ2FsaWJyaSwgQ2FtYnJpYSwgU2Vnb2UgVUkpLgotICAgICAqCi0gICAgICogRnJlZVR5cGUncyBtaW5pbWFsIHN1YnBpeGVsIGhpbnRpbmcgY29kZSAoaW50ZXJwcmV0ZXIgdmVyc2lvbiA0MCkKLSAgICAgKiBlbXBsb3lzIGEgc21hbGwgbGlzdCBvZiBmb250LWFnbm9zdGljIGhhY2tzIGxvb3NlbHkgYmFzZWQgb24gdGhlCi0gICAgICogcHVibGljIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBvbiBNaWNyb3NvZnQncyBjb21wYXRpYmlsaXR5IG1vZGVbMl0uCi0gICAgICogVGhlIGZvY3VzIGlzIG9uIG1vZGVybiAod2ViKWZvbnRzIHJhdGhlciB0aGFuIGxlZ2FjeSBmb250cyB0aGF0IHdlcmUKLSAgICAgKiBtYWRlIGZvciBtb25vY2hyb21lIHJlbmRlcmluZy4gIEl0IHdpbGwgbm90IG1hdGNoIENsZWFyVHlwZSByZW5kZXJpbmcKLSAgICAgKiBleGFjdGx5LiAgVW5saWtlIHRoZSBgSW5maW5hbGl0eScgY29kZSAoaW50ZXJwcmV0ZXIgdmVyc2lvbiAzOCkgdGhhdAotICAgICAqIGNhbWUgYmVmb3JlLCBpdCB3aWxsIG5vdCB0cnkgdG8gdG9nZ2xlIGhhY2tzIGZvciBzcGVjaWZpYyBmb250cyBmb3IKLSAgICAgKiBwZXJmb3JtYW5jZSBhbmQgY29tcGxleGl0eSByZWFzb25zLiAgSXQgd2lsbCBmYWxsIGJhY2sgdG8gdmVyc2lvbiAzNQotICAgICAqIGJlaGF2aW9yIGZvciB0cmlja3kgZm9udHNbMV0gb3Igd2hlbiBtb25vY2hyb21lIHJlbmRlcmluZyBpcwotICAgICAqIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIE1ham9yIGhhY2tzCi0gICAgICoKLSAgICAgKiAtIEFueSBwb2ludCBtb3ZlbWVudCBvbiB0aGUgeCBheGlzIGlzIGlnbm9yZWQgKGNmLiBgRGlyZWN0X01vdmUnIGFuZAotICAgICAqICAgYERpcmVjdF9Nb3ZlX1gnKS4gIFRoaXMgaGFzIHRoZSBzbWFsbGVzdCBjb2RlIGZvb3RwcmludCBhbmQgc2luZ2xlCi0gICAgICogICBiaWdnZXN0IGVmZmVjdC4gIFRoZSBDbGVhclR5cGUgd2F5IHRvIGluY3JlYXNlIHJlc29sdXRpb24gaXMKLSAgICAgKiAgIHN1cGVyc2FtcGxpbmcgdGhlIHggYXhpcywgdGhlIEZyZWVUeXBlIHdheSBpcyBpZ25vcmluZyBpbnN0cnVjdGlvbnMKLSAgICAgKiAgIG9uIHRoZSB4IGF4aXMsIHdoaWNoIGdpdmVzIHRoZSBzYW1lIHJlc3VsdCBpbiB0aGUgbWFqb3JpdHkgb2YKLSAgICAgKiAgIGNhc2VzLgotICAgICAqCi0gICAgICogLSBQb2ludHMgYXJlIG5vdCBtb3ZlZCBwb3N0LUlVUCAobmVpdGhlciBvbiB0aGUgeCBub3Igb24gdGhlIHkgYXhpcyksCi0gICAgICogICBleGNlcHQgdGhlIHggY29tcG9uZW50IG9mIGRpYWdvbmFsIG1vdmVzIHBvc3QtSVVQIChjZi4KLSAgICAgKiAgIGBEaXJlY3RfTW92ZScsIGBEaXJlY3RfTW92ZV9ZJywgYE1vdmVfWnAyX1BvaW50JykuICBQb3N0LUlVUAotICAgICAqICAgY2hhbmdlcyBhcmUgY29tbW9ubHkgdXNlZCB0byBgZml4JyBwaXhlbCBwYXR0ZXJucyB3aGljaCBoYXMgbGl0dGxlCi0gICAgICogICB1c2Ugb3V0c2lkZSBtb25vY2hyb21lIHJlbmRlcmluZy4KLSAgICAgKgotICAgICAqIC0gU0hQSVggYW5kIERFTFRBUCBkb24ndCBleGVjdXRlIHVubGVzcyBtb3ZpbmcgYSBjb21wb3NpdGUgb24gdGhlCi0gICAgICogICB5IGF4aXMgb3IgbW92aW5nIGEgcHJldmlvdXNseSB5IHRvdWNoZWQgcG9pbnQuICBTSFBJWCBhZGRpdGlvbmFsbHkKLSAgICAgKiAgIGRlbmllcyBtb3ZlbWVudCBvbiB0aGUgeCBheGlzIChjZi4gYEluc19TSFBJWCcgYW5kIGBJbnNfREVMVEFQJykuCi0gICAgICogICBCb3RoIGluc3RydWN0aW9ucyBhcmUgY29tbW9ubHkgdXNlZCB0byBgZml4JyBwaXhlbCBwYXR0ZXJucyBmb3IKLSAgICAgKiAgIG1vbm9jaHJvbWUgb3IgV2luZG93cydzIEdESSByZW5kZXJpbmcgYnV0IG1ha2UgbGl0dGxlIHNlbnNlIGZvcgotICAgICAqICAgRnJlZVR5cGUgcmVuZGVyaW5nLiAgQm90aCBjYW4gZGlzdG9ydCB0aGUgb3V0bGluZS4gIFNlZSBbMl0gZm9yCi0gICAgICogICBkZXRhaWxzLgotICAgICAqCi0gICAgICogLSBUaGUgaGRteCB0YWJsZSBhbmQgbW9kaWZpY2F0aW9ucyB0byBwaGFudG9tIHBvaW50cyBhcmUgaWdub3JlZC4KLSAgICAgKiAgIEJlYXJpbmdzIGFuZCBhZHZhbmNlIHdpZHRocyByZW1haW4gdW5jaGFuZ2VkIChleGNlcHQgcm91bmRpbmcgdGhlbQotICAgICAqICAgb3V0c2lkZSB0aGUgaW50ZXJwcmV0ZXIhKSwgY2YuIGBjb21wdXRlX2dseXBoX21ldHJpY3MnIGFuZAotICAgICAqICAgYFRUX0hpbnRfR2x5cGgnLiAgTGV0dGluZyBub24tbmF0aXZlLUNsZWFyVHlwZSBmb250cyBtb2RpZnkgc3BhY2luZwotICAgICAqICAgbWlnaHQgbWVzcyB1cCBzcGFjaW5nLgotICAgICAqCi0gICAgICogTWlub3IgaGFja3MKLSAgICAgKgotICAgICAqIC0gRkxJUFJHT04sIEZMSVBSR09GRiwgYW5kIEZMSVBQVCBkb24ndCBleGVjdXRlIHBvc3QtSVVQLiAgVGhpcwotICAgICAqICAgcHJldmVudHMgZGVudHMgaW4gZS5nLiBBcmlhbC1SZWd1bGFyJ3MgYEQnIGFuZCBgRycgZ2x5cGhzIGF0Ci0gICAgICogICB2YXJpb3VzIHNpemVzLgotICAgICAqCi0gICAgICogKFBvc3QtSVVQIGlzIHRoZSBzdGF0ZSBhZnRlciBib3RoIElVUFt4XSBhbmQgSVVQW3ldIGhhdmUgYmVlbgotICAgICAqIGV4ZWN1dGVkLikKLSAgICAgKgotICAgICAqIFRoZSBiZXN0IHJlc3VsdHMgYXJlIGFjaGlldmVkIGZvciBmb250cyB0aGF0IHdlcmUgZnJvbSB0aGUgb3V0c2V0Ci0gICAgICogZGVzaWduZWQgd2l0aCBDbGVhclR5cGUgaW4gbWluZCwgbWVhbmluZyB0aGV5IGxlYXZlIHRoZSB4IGF4aXMgbW9zdGx5Ci0gICAgICogYWxvbmUgYW5kIGRvbid0IG1lc3Mgd2l0aCB0aGUgYGZpbmFsJyBvdXRsaW5lIHRvIHByb2R1Y2UgbW9yZQotICAgICAqIHBsZWFzaW5nIHBpeGVsIHBhdHRlcm5zLiAgVGhlIGhhcmRlciB0aGUgZGVzaWduZXIgdHJpZWQgdG8gcHJvZHVjZQotICAgICAqIHZlcnkgc3BlY2lmaWMgcGF0dGVybnMgKGBzdXBlcmhpbnRpbmcnKSBmb3IgcHJlLUNsZWFyVHlwZS1kaXNwbGF5cywKLSAgICAgKiB0aGUgd29yc2UgdGhlIHJlc3VsdHMuCi0gICAgICoKLSAgICAgKiBNaWNyb3NvZnQgZGVmaW5lcyBhIHdheSB0byB0dXJuIG9mZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZAotICAgICAqIGludGVycHJldCBpbnN0cnVjdGlvbnMgYXMgYmVmb3JlIChjYWxsZWQgYG5hdGl2ZSBDbGVhclR5cGUnKVsyXVszXS4KLSAgICAgKiBUaGUgZm9udCBkZXNpZ25lciB0aGVuIHJlZ2FpbnMgZnVsbCBjb250cm9sIGFuZCBpcyByZXNwb25zaWJsZSBmb3IKLSAgICAgKiBtYWtpbmcgdGhlIGZvbnQgd29yayBjb3JyZWN0bHkgd2l0aCBDbGVhclR5cGUgd2l0aG91dCBhbnkKLSAgICAgKiBoYW5kLWhvbGRpbmcgYnkgdGhlIGludGVycHJldGVyIG9yIHJhc3Rlcml6ZXJbNF0uICBUaGUgdjQwCi0gICAgICogaW50ZXJwcmV0ZXIgYXNzdW1lcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ5IGRlZmF1bHQsIHdoaWNoIGNhbiBiZQotICAgICAqIHR1cm5lZCBvZmYgdGhlIHNhbWUgd2F5IGJ5IGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nIGluIHRoZSBjb250cm9sCi0gICAgICogcHJvZ3JhbSAoY2YuIGBJbnNfSU5TVENUUkwnKS4KLSAgICAgKgotICAgICAqICAgI1BVU0ggNCwzCi0gICAgICogICBJTlNUQ1RSTFtdCi0gICAgICoKLSAgICAgKiBbMV0gVHJpY2t5IGZvbnRzIGFzIEZyZWVUeXBlIGRlZmluZXMgdGhlbSByZWx5IG9uIHRoZSBieXRlY29kZQotICAgICAqICAgICBpbnRlcnByZXRlciB0byBkaXNwbGF5IGNvcnJlY3RseS4gIEhhY2tzIGNhbiBpbnRlcmZlcmUgd2l0aCB0aGVtLAotICAgICAqICAgICBzbyB0aGV5IGdldCB0cmVhdGVkIGxpa2UgbmF0aXZlIENsZWFyVHlwZSBmb250cyAodjQwIHdpdGgKLSAgICAgKiAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0dXJuZWQgb2ZmKS4gIENmLiBgVFRfUnVuSW5zJy4KLSAgICAgKgotICAgICAqIFsyXSBQcm9wb3NlZCBieSBNaWNyb3NvZnQncyBHcmVnIEhpdGNoY29jayBpbgotICAgICAqICAgICBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHgKLSAgICAgKgotICAgICAqIFszXSBCZWF0IFN0YW1tIGRlc2NyaWJlcyBpdCBpbiBtb3JlIGRldGFpbDoKLSAgICAgKiAgICAgaHR0cDovL3d3dy5iZWF0c3RhbW0uY29tL3R5cG9ncmFwaHkvUlRSQ2g0Lmh0bSNTZWMxMgotICAgICAqCi0gICAgICogWzRdIFRoZSBsaXN0IG9mIGBuYXRpdmUgQ2xlYXJUeXBlJyBmb250cyBpcyBzbWFsbCBhdCB0aGUgdGltZSBvZiB0aGlzCi0gICAgICogICAgIHdyaXRpbmc7IEkgZm91bmQgdGhlIGZvbGxvd2luZyBvbiBhIFdpbmRvd3MgMTAgVXBkYXRlIDE1MTEKLSAgICAgKiAgICAgaW5zdGFsbGF0aW9uOiBDb25zdGFudGlhLCBDb3JiZWwsIFNpdGthLCBNYWxndW4gR290aGljLCBNaWNyb3NvZnQKLSAgICAgKiAgICAgSmhlbmdIZWkgKEJvbGQgYW5kIFVJIEJvbGQpLCBNaWNyb3NvZnQgWWFIZWkgKEJvbGQgYW5kIFVJIEJvbGQpLAotICAgICAqICAgICBTaW1TdW4sIE5TaW1TdW4sIGFuZCBZdSBHb3RoaWMuCi0gICAgICoKLSAgICAgKi8KLQotICAgIC8qIFVzaW5nIHY0MCBpbXBsaWVzIHN1YnBpeGVsIGhpbnRpbmcsIHVubGVzcyBGVF9SRU5ERVJfTU9ERV9NT05PIGhhcyBiZWVuCi0gICAgICogcmVxdWVzdGVkLiAgVXNlZCB0byBkZXRlY3QgaW50ZXJwcmV0ZXIgKi8KLSAgICAvKiB2ZXJzaW9uIHN3aXRjaGVzLiAgYF9sZWFuJyB0byBkaWZmZXJlbnRpYXRlIGZyb20gdGhlIEluZmluYWxpdHkgKi8KLSAgICAvKiBgc3VicGl4ZWxfaGludGluZycsIHdoaWNoIGlzIG1hbmFnZWQgZGlmZmVyZW50bHkuICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgc3VicGl4ZWxfaGludGluZ19sZWFuOwotCi0gICAgLyogTG9uZyBzaWRlIG9mIGEgTENEIHN1YnBpeGVsIGlzIHZlcnRpY2FsIChlLmcuLCBzY3JlZW4gaXMgcm90YXRlZCkuICovCi0gICAgLyogYF9sZWFuJyB0byBkaWZmZXJlbnRpYXRlIGZyb20gdGhlIEluZmluYWxpdHkgYHZlcnRpY2FsX2xjZCcsIHdoaWNoICovCi0gICAgLyogaXMgbWFuYWdlZCBkaWZmZXJlbnRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHZlcnRpY2FsX2xjZF9sZWFuOwotCi0gICAgLyogRGVmYXVsdCB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUgaW4gdjQwIGludGVycHJldGVyLiAgSWYgICAqLwotICAgIC8qIHRoaXMgaXMgZmFsc2UsIGl0IGltcGxpZXMgdGhlIGludGVycHJldGVyIGlzIGluIHYzNSBvciBpbiBuYXRpdmUgKi8KLSAgICAvKiBDbGVhclR5cGUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgIGJhY2t3YXJkX2NvbXBhdGliaWxpdHk7Ci0KLSAgICAvKiBVc2VmdWwgZm9yIGRldGVjdGluZyBhbmQgZGVueWluZyBwb3N0LUlVUCB0cmlja2VyeSB0aGF0IGlzIHVzdWFsbHkgKi8KLSAgICAvKiB1c2VkIHRvIGZpeCBwaXhlbCBwYXR0ZXJucyAoYHN1cGVyaGludGluZycpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgaXVweF9jYWxsZWQ7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgIGl1cHlfY2FsbGVkOwotCi0gICAgLyogQ2xlYXJUeXBlIGhpbnRpbmcgYW5kIGdyYXlzY2FsZSByZW5kZXJpbmcsIGFzIHVzZWQgYnkgVW5pdmVyc2FsICovCi0gICAgLyogV2luZG93cyBQbGF0Zm9ybSBhcHBzIChXaW5kb3dzIDggYW5kIGFib3ZlKS4gIExpa2UgdGhlIHN0YW5kYXJkICovCi0gICAgLyogY29sb3JmdWwgQ2xlYXJUeXBlIG1vZGUsIGl0IHV0aWxpemVzIGEgdmFzdGx5IGluY3JlYXNlZCB2aXJ0dWFsICovCi0gICAgLyogcmVzb2x1dGlvbiBvbiB0aGUgeCBheGlzLiAgRGlmZmVyZW50IGZyb20gYmktbGV2ZWwgaGludGluZyBhbmQgICovCi0gICAgLyogZ3JheXNjYWxlIHJlbmRlcmluZywgdGhlIG9sZCBtb2RlIGZyb20gV2luOXggZGF5cyB0aGF0IHJvdWdobHkgICovCi0gICAgLyogYWRoZXJlcyB0byB0aGUgcGh5c2ljYWwgcGl4ZWwgZ3JpZCBvbiBib3RoIGF4ZXMuICAgICAgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgIGdyYXlzY2FsZV9jbGVhcnR5cGU7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwgKi8KLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgVFRfUm91bmRfRnVuYyAgICAgIGZ1bmNfcm91bmRfc3BobjsgICAvKiBzdWJwaXhlbCByb3VuZGluZyBmdW5jdGlvbiAqLwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHN1YnBpeGVsX2hpbnRpbmc7ICAvKiBVc2luZyBzdWJwaXhlbCBoaW50aW5nPyAgICAgICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBpZ25vcmVfeF9tb2RlOyAgICAgLyogU3RhbmRhcmQgcmVuZGVyaW5nIG1vZGUgZm9yICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1YnBpeGVsIGhpbnRpbmcuICBPbiBpZiBncmF5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvciBzdWJwaXhlbCBoaW50aW5nIGlzIG9uLiAgICAqLwotCi0gICAgLyogVGhlIGZvbGxvd2luZyA2IGFyZW4ndCBmdWxseSBpbXBsZW1lbnRlZCBidXQgaGVyZSBmb3IgTVMgcmFzdGVyaXplciAqLwotICAgIC8qIGNvbXBhdGliaWxpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgY29tcGF0aWJsZV93aWR0aHM7ICAgICAvKiBjb21wYXRpYmxlIHdpZHRocz8gICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHN5bW1ldHJpY2FsX3Ntb290aGluZzsgLyogc3ltbWV0cmljYWxfc21vb3RoaW5nPyAgICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBiZ3I7ICAgICAgICAgICAgICAgICAgIC8qIGJnciBpbnN0ZWFkIG9mIHJnYj8gICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgdmVydGljYWxfbGNkOyAgICAgICAgICAvKiBsb25nIHNpZGUgb2YgTENEIHN1YnBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdGFuZ2xlcyBpcyBob3Jpem9udGFsICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBzdWJwaXhlbF9wb3NpdGlvbmVkOyAgIC8qIHN1YnBpeGVsIHBvc2l0aW9uZWQgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoRGlyZWN0V3JpdGUgQ2xlYXJUeXBlKT8gICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgIGdyYXlfY2xlYXJ0eXBlOyAgICAgICAgLyogQ2xlYXJUeXBlIGhpbnRpbmcgYnV0ICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXlzY2FsZSByZW5kZXJpbmcgICAgICAgKi8KLQotICAgIEZUX0ludCAgICAgICAgICAgICByYXN0ZXJpemVyX3ZlcnNpb247ICAgIC8qIE1TIHJhc3Rlcml6ZXIgdmVyc2lvbiAgICAgKi8KLQotICAgIEZUX0Jvb2wgICAgICAgICAgICBpdXBfY2FsbGVkOyAgICAgICAgICAgIC8qIElVUCBjYWxsZWQgZm9yIGdseXBoPyAgICAgKi8KLQotICAgIEZUX1VMb25nICAgICAgICAgICBzcGhfdHdlYWtfZmxhZ3M7ICAgICAgIC8qIGZsYWdzIHRvIGNvbnRyb2wgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaW50IHR3ZWFrcyAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgc3BoX2luX2Z1bmNfZmxhZ3M7ICAgICAvKiBmbGFncyB0byBpbmRpY2F0ZSBpZiBpbiAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbCBmdW5jdGlvbnMgICAgICAgICAqLwotCi0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQotICAgIC8qIFdlIG1haW50YWluIHR3byBjb3VudGVycyAoaW4gYWRkaXRpb24gdG8gdGhlIGluc3RydWN0aW9uIGNvdW50ZXIpICovCi0gICAgLyogdGhhdCBhY3QgYXMgbG9vcCBkZXRlY3RvcnMgZm9yIExPT1BDQUxMIGFuZCBqdW1wIG9wY29kZXMgd2l0aCAgICAgKi8KLSAgICAvKiBuZWdhdGl2ZSBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1VMb25nICAgICAgICAgICBsb29wY2FsbF9jb3VudGVyOwotICAgIEZUX1VMb25nICAgICAgICAgICBsb29wY2FsbF9jb3VudGVyX21heDsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgbmVnX2p1bXBfY291bnRlcjsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgbmVnX2p1bXBfY291bnRlcl9tYXg7Ci0KLSAgfSBUVF9FeGVjQ29udGV4dFJlYzsKLQotCi0gIGV4dGVybiBjb25zdCBUVF9HcmFwaGljc1N0YXRlICB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlOwotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUVF9Hb3RvX0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgSVAgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFRUX1NldF9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgbGVuZ3RoICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUVF9DbGVhcl9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICByYW5nZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVXBkYXRlX01heCggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgIEZUX1VMb25nKiAgc2l6ZSwKLSAgICAgICAgICAgICAgRlRfVUxvbmcgICBtdWx0aXBsaWVyLAotICAgICAgICAgICAgICB2b2lkKiAgICAgIF9wYnVmZiwKLSAgICAgICAgICAgICAgRlRfVUxvbmcgICBuZXdfbWF4ICk7Ci0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9OZXdfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBRdWVyaWVzIHRoZSBmYWNlIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCB0aGVyZSBpcyAgICAgKi8KLSAgLyogICAgbm93IGEgX3NpbmdsZV8gZXhlY3V0aW9uIGNvbnRleHQgaW4gdGhlIFRydWVUeXBlIGRyaXZlciB3aGljaCBpcyAgICovCi0gIC8qICAgIHNoYXJlZCBhbW9uZyBmYWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIHRoZSBleGVjdXRpb24gY29udGV4dC4gIEluaXRpYWxpemVkIGZvciBgZmFjZScuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLwotICAvKiAgICAoQW5kIHJpZ2h0IG5vdyBvbmx5IHRoZSBnbHlwaCBsb2FkZXIgdXNlcyBpdC4pICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggVFRfRXhlY0NvbnRleHQgKQotICBUVF9OZXdfQ29udGV4dCggVFRfRHJpdmVyICBkcml2ZXIgKTsKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVFRfRG9uZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX0xvYWRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIHNpemUgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFRUX1NhdmVfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIGlucyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1J1bl9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApOwotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUnVuSW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXhlY3V0ZXMgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LiAgVGhpcyAgICovCi0gIC8qICAgIGlzIHRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSBUcnVlVHlwZSBvcGNvZGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIG9iamVjdCBtYW5hZ2VyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBwdWJsaWNseSBleHBvcnRlZCBiZWNhdXNlIGl0IGlzIGRpcmVjdGx5ICAgICAgICAgICovCi0gIC8qICAgIGludm9rZWQgYnkgdGhlIFRydWVUeXBlIGRlYnVnZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIFRUX1J1bklucyggVFRfRXhlY0NvbnRleHQgIGV4ZWMgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBUVElOVEVSUF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0b2Jqcy5jIGIvc3JjL3RydWV0eXBlL3R0b2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGIwZjI4Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dG9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9iamVjdHMgbWFuYWdlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfRFJJVkVSX0gKLQotI2luY2x1ZGUgInR0Z2xvYWQuaCIKLSNpbmNsdWRlICJ0dHBsb2FkLmgiCi0KLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0jaW5jbHVkZSAidHRpbnRlcnAuaCIKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgInR0Z3h2YXIuaCIKLSNlbmRpZgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0b2JqcwotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBHTFlQSCBaT05FIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nbHlwaHpvbmVfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZWFsbG9jYXRlIGEgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB6b25lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGdseXBoIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2dseXBoem9uZV9kb25lKCBUVF9HbHlwaFpvbmUgIHpvbmUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSB6b25lLT5tZW1vcnk7Ci0KLQotICAgIGlmICggbWVtb3J5ICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCB6b25lLT5jb250b3VycyApOwotICAgICAgRlRfRlJFRSggem9uZS0+dGFncyApOwotICAgICAgRlRfRlJFRSggem9uZS0+Y3VyICk7Ci0gICAgICBGVF9GUkVFKCB6b25lLT5vcmcgKTsKLSAgICAgIEZUX0ZSRUUoIHpvbmUtPm9ydXMgKTsKLQotICAgICAgem9uZS0+bWF4X3BvaW50cyAgID0gem9uZS0+bl9wb2ludHMgICA9IDA7Ci0gICAgICB6b25lLT5tYXhfY29udG91cnMgPSB6b25lLT5uX2NvbnRvdXJzID0gMDsKLSAgICAgIHpvbmUtPm1lbW9yeSAgICAgICA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nbHlwaHpvbmVfbmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbGxvY2F0ZSBhIG5ldyBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBvaW50cyAgIDo6IFRoZSBjYXBhY2l0eSBvZiBnbHlwaCB6b25lIGluIHBvaW50cy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29udG91cnMgOjogVGhlIGNhcGFjaXR5IG9mIGdseXBoIHpvbmUgaW4gY29udG91cnMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgem9uZSAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZ2x5cGggem9uZSByZWNvcmQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZ2x5cGh6b25lX25ldyggRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgbWF4UG9pbnRzLAotICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCAgICAgIG1heENvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaFpvbmUgIHpvbmUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBGVF9aRVJPKCB6b25lICk7Ci0gICAgem9uZS0+bWVtb3J5ID0gbWVtb3J5OwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHpvbmUtPm9yZywgICAgICBtYXhQb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHpvbmUtPmN1ciwgICAgICBtYXhQb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHpvbmUtPm9ydXMsICAgICBtYXhQb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHpvbmUtPnRhZ3MsICAgICBtYXhQb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHpvbmUtPmNvbnRvdXJzLCBtYXhDb250b3VycyApICkKLSAgICB7Ci0gICAgICB0dF9nbHlwaHpvbmVfZG9uZSggem9uZSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgem9uZS0+bWF4X3BvaW50cyAgID0gbWF4UG9pbnRzOwotICAgICAgem9uZS0+bWF4X2NvbnRvdXJzID0gbWF4Q29udG91cnM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLQotICAvKiBDb21wYXJlIHRoZSBmYWNlIHdpdGggYSBsaXN0IG9mIHdlbGwta25vd24gYHRyaWNreScgZm9udHMuICovCi0gIC8qIFRoaXMgbGlzdCBzaGFsbCBiZSBleHBhbmRlZCBhcyB3ZSBmaW5kIG1vcmUgb2YgdGhlbS4gICAgICAgKi8KLQotICBzdGF0aWMgRlRfQm9vbAotICB0dF9jaGVja190cmlja3luZXNzX2ZhbWlseSggRlRfU3RyaW5nKiAgbmFtZSApCi0gIHsKLQotI2RlZmluZSBUUklDS19OQU1FU19NQVhfQ0hBUkFDVEVSUyAgMTkKLSNkZWZpbmUgVFJJQ0tfTkFNRVNfQ09VTlQgICAgICAgICAgIDE4Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciB0cmlja19uYW1lc1tUUklDS19OQU1FU19DT1VOVF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUUklDS19OQU1FU19NQVhfQ0hBUkFDVEVSUyArIDFdID0KLSAgICB7Ci0gICAgICAvKgotICAgICAgICAgUG9zdFNjcmlwdCBuYW1lcyBhcmUgZ2l2ZW4gaW4gYnJhY2tldHMgaWYgdGhleSBkaWZmZXIgZnJvbSB0aGUKLSAgICAgICAgIGZhbWlseSBuYW1lLiAgVGhlIHZlcnNpb24gbnVtYmVycywgdG9nZXRoZXIgd2l0aCB0aGUgY29weXJpZ2h0IG9yCi0gICAgICAgICByZWxlYXNlIHllYXIgZGF0YSwgYXJlIHRha2VuIGZyb20gZm9udHMgYXZhaWxhYmxlIHRvIHRoZQotICAgICAgICAgZGV2ZWxvcGVycy4KLQotICAgICAgICAgTm90ZSB0aGF0IGxhdGVyIHZlcnNpb25zIG9mIHRoZSBmb250cyBtaWdodCBiZSBubyBsb25nZXIgdHJpY2t5OwotICAgICAgICAgZm9yIGV4YW1wbGUsIGBNaW5nTGlVJyB2ZXJzaW9uIDcuMDAgKGZpbGUgYG1pbmdsaXUudHRjJyBmcm9tCi0gICAgICAgICBXaW5kb3dzIDcpIGlzIGFuIG9yZGluYXJ5IFRUQyB3aXRoIG5vbi10cmlja3kgc3ViZm9udHMuCi0gICAgICAgKi8KLQotICAgICAgImNwb3AiLCAgICAgICAgICAgICAgIC8qIGRmdHQtcDcudHRmOyB2ZXJzaW9uIDEuMDAsIDE5OTIgW0RMSkd5U2hvTWVkaXVtXSAqLwotICAgICAgIkRGR2lybC1XNi1XSU4tQkYiLCAgIC8qIGRmdHQtaDYudHRmOyB2ZXJzaW9uIDEuMDAsIDE5OTMgKi8KLSAgICAgICJERkthaVNoby1TQiIsICAgICAgICAvKiBkZmthaXNiLnR0ZiAqLwotICAgICAgIkRGS2FpU2h1IiwKLSAgICAgICJERkthaS1TQiIsICAgICAgICAgICAvKiBrYWl1LnR0ZjsgdmVyc2lvbiAzLjAwLCAxOTk4IFtERkthaVNodS1TQi1Fc3RkLUJGXSAqLwotICAgICAgIkRMQyIsICAgICAgICAgICAgICAgIC8qIGRmdHQtbTcudHRmOyB2ZXJzaW9uIDEuMDAsIDE5OTMgW0RMQ01pbmdCb2xkXSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRmdHQtZjUudHRmOyB2ZXJzaW9uIDEuMDAsIDE5OTMgW0RMQ0ZvbmdTdW5nXSAqLwotICAgICAgIkRMQ0hheU1lZGl1bSIsICAgICAgIC8qIGRmdHQtYjUudHRmOyB2ZXJzaW9uIDEuMDAsIDE5OTMgKi8KLSAgICAgICJETENIYXlCb2xkIiwgICAgICAgICAvKiBkZnR0LWI3LnR0ZjsgdmVyc2lvbiAxLjAwLCAxOTkzICovCi0gICAgICAiRExDS2FpTWVkaXVtIiwgICAgICAgLyogZGZ0dC1rNS50dGY7IHZlcnNpb24gMS4wMCwgMTk5MiAqLwotICAgICAgIkRMQ0xpU2h1IiwgICAgICAgICAgIC8qIGRmdHQtbDUudHRmOyB2ZXJzaW9uIDEuMDAsIDE5OTIgKi8KLSAgICAgICJETENSb3VuZEJvbGQiLCAgICAgICAvKiBkZnR0LXI3LnR0ZjsgdmVyc2lvbiAxLjAwLCAxOTkzICovCi0gICAgICAiSHVhVGlhbkthaVRpPyIsICAgICAgLyogaHRrdDIudHRmICovCi0gICAgICAiSHVhVGlhblNvbmdUaT8iLCAgICAgLyogaHRzdDMudHRmICovCi0gICAgICAiTWluZyhmb3IgSVNPMTA2NDYpIiwgLyogaGtzY3NpaWMudHRmOyB2ZXJzaW9uIDAuMTIsIDIwMDcgW01pbmddICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWljb3JlLnR0ZjsgdmVyc2lvbiAwLjA3LCAyMDA3IFtNaW5nXSAqLwotICAgICAgIk1pbmdMaVUiLCAgICAgICAgICAgIC8qIG1pbmdsaXUudHRmICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluZ2xpdS50dGM7IHZlcnNpb24gMy4yMSwgMjAwMSAqLwotICAgICAgIk1pbmdNZWRpdW0iLCAgICAgICAgIC8qIGRmdHQtbTUudHRmOyB2ZXJzaW9uIDEuMDAsIDE5OTMgW0RMQ01pbmdNZWRpdW1dICovCi0gICAgICAiUE1pbmdMaVUiLCAgICAgICAgICAgLyogbWluZ2xpdS50dGM7IHZlcnNpb24gMy4yMSwgMjAwMSAqLwotICAgICAgIk1pbmdMaTQzIiwgICAgICAgICAgIC8qIG1pbmdsaS50dGY7IHZlcnNpb24gMS4wMCwgMTk5MiAqLwotICAgIH07Ci0KLSAgICBpbnQgIG5uOwotCi0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgVFJJQ0tfTkFNRVNfQ09VTlQ7IG5uKysgKQotICAgICAgaWYgKCBmdF9zdHJzdHIoIG5hbWUsIHRyaWNrX25hbWVzW25uXSApICkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotCi0gIC8qIFhYWDogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW4gdGhlIGBzZm50JyBtb2R1bGUuICovCi0KLSAgLyogU29tZSBQREYgZ2VuZXJhdG9ycyBjbGVhciB0aGUgY2hlY2tzdW1zIGluIHRoZSBUcnVlVHlwZSBoZWFkZXIgdGFibGUuICovCi0gIC8qIEZvciBleGFtcGxlLCBRdWFydHogQ29udGV4dFBERiBjbGVhcnMgYWxsIGVudHJpZXMsIG9yIEJ1bGx6aXAgUERGICAgICAqLwotICAvKiBQcmludGVyIGNsZWFycyB0aGUgZW50cmllcyBmb3Igc3Vic2V0dGVkIHN1YnRhYmxlcy4gIFdlIHRodXMgaGF2ZSB0byAgKi8KLSAgLyogcmVjYWxjdWxhdGUgdGhlIGNoZWNrc3VtcyAgd2hlcmUgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX1VJbnQzMgotICB0dF9zeW50aF9zZm50X2NoZWNrc3VtKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBsZW5ndGggKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VSW50MzIgIGNoZWNrc3VtID0gMDsKLSAgICBGVF9VSW50ICAgIGk7Ci0KLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGxlbmd0aCApICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZm9yICggOyBsZW5ndGggPiAzOyBsZW5ndGggLT0gNCApCi0gICAgICBjaGVja3N1bSArPSAoRlRfVUludDMyKUZUX0dFVF9VTE9ORygpOwotCi0gICAgZm9yICggaSA9IDM7IGxlbmd0aCA+IDA7IGxlbmd0aC0tLCBpLS0gKQotICAgICAgY2hlY2tzdW0gKz0gKEZUX1VJbnQzMilGVF9HRVRfQllURSgpIDw8ICggaSAqIDggKTsKLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIHJldHVybiBjaGVja3N1bTsKLSAgfQotCi0KLSAgLyogWFhYOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbiB0aGUgYHNmbnQnIG1vZHVsZS4gKi8KLQotICBzdGF0aWMgRlRfVUxvbmcKLSAgdHRfZ2V0X3NmbnRfY2hlY2tzdW0oIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgaSApCi0gIHsKLSNpZiAwIC8qIGlmIHdlIGJlbGlldmUgdGhlIHdyaXR0ZW4gdmFsdWUsIHVzZSBmb2xsb3dpbmcgcGFydC4gKi8KLSAgICBpZiAoIGZhY2UtPmRpcl90YWJsZXNbaV0uQ2hlY2tTdW0gKQotICAgICAgcmV0dXJuIGZhY2UtPmRpcl90YWJsZXNbaV0uQ2hlY2tTdW07Ci0jZW5kaWYKLQotICAgIGlmICggIWZhY2UtPmdvdG9fdGFibGUgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5kaXJfdGFibGVzW2ldLlRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3Quc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIChGVF9VTG9uZyl0dF9zeW50aF9zZm50X2NoZWNrc3VtKCBmYWNlLT5yb290LnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmRpcl90YWJsZXNbaV0uTGVuZ3RoICk7Ci0gIH0KLQotCi0gIHR5cGVkZWYgc3RydWN0IHR0X3NmbnRfaWRfcmVjXwotICB7Ci0gICAgRlRfVUxvbmcgIENoZWNrU3VtOwotICAgIEZUX1VMb25nICBMZW5ndGg7Ci0KLSAgfSB0dF9zZm50X2lkX3JlYzsKLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIHR0X2NoZWNrX3RyaWNreW5lc3Nfc2ZudF9pZHMoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0jZGVmaW5lIFRSSUNLX1NGTlRfSURTX1BFUl9GQUNFICAgMwotI2RlZmluZSBUUklDS19TRk5UX0lEU19OVU1fRkFDRVMgIDE5Ci0KLSAgICBzdGF0aWMgY29uc3QgdHRfc2ZudF9pZF9yZWMgc2ZudF9pZFtUUklDS19TRk5UX0lEU19OVU1fRkFDRVNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVFJJQ0tfU0ZOVF9JRFNfUEVSX0ZBQ0VdID0gewotCi0jZGVmaW5lIFRSSUNLX1NGTlRfSURfY3Z0ICAgMAotI2RlZmluZSBUUklDS19TRk5UX0lEX2ZwZ20gIDEKLSNkZWZpbmUgVFJJQ0tfU0ZOVF9JRF9wcmVwICAyCi0KLSAgICAgIHsgLyogTWluZ0xpVSAxOTk1ICovCi0gICAgICAgIHsgMHgwNUJDRjA1OFVMLCAweDAwMDAwMkU0VUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4MjgyMzNCRjFVTCwgMHgwMDAwODdDNFVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweEEzNDRBMUVBVUwsIDB4MDAwMDAxRTFVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBNaW5nTGlVIDE5OTYtICovCi0gICAgICAgIHsgMHgwNUJDRjA1OFVMLCAweDAwMDAwMkU0VUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4MjgyMzNCRjFVTCwgMHgwMDAwODdDNFVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweEEzNDRBMUVCVUwsIDB4MDAwMDAxRTFVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBERkthaVNodSAqLwotICAgICAgICB7IDB4MTFFNUVBRDRVTCwgMHgwMDAwMDM1MFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDVBMzBDQTNCVUwsIDB4MDAwMDkwNjNVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHgxM0E0MjYwMlVMLCAweDAwMDAwMDdFVUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogREZLYWlTaHUsIHZhcmlhbnQgKi8KLSAgICAgICAgeyAweDExRTVFQUQ0VUwsIDB4MDAwMDAzNTBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHhBNkU3OEMwMVVMLCAweDAwMDA4OTk4VUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4MTNBNDI2MDJVTCwgMHgwMDAwMDA3RVVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIEh1YVRpYW5LYWlUaSAqLwotICAgICAgICB7IDB4RkZGQkZGRkNVTCwgMHgwMDAwMDAwOFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDlDOUU0OEI4VUwsIDB4MDAwMEJFQTJVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHg3MDAyMDExMlVMLCAweDAwMDAwMDA4VUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogSHVhVGlhblNvbmdUaSAqLwotICAgICAgICB7IDB4RkZGQkZGRkNVTCwgMHgwMDAwMDAwOFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDBBNUEwNDgzVUwsIDB4MDAwMTdDMzlVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHg3MDAyMDExMlVMLCAweDAwMDAwMDA4VUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogTkVDIGZhZHBvcDcudHRmICovCi0gICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NDBDOTI1NTVVTCwgMHgwMDAwMDBFNVVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweEEzOUI1OEUzVUwsIDB4MDAwMDExN0NVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBORUMgZmFkcmVpNS50dGYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHgzM0M0MTY1MlVMLCAweDAwMDAwMEU1VUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4MjZENkM1MkFVTCwgMHgwMDAwMEY2QVVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBmYW5nb3Q3LnR0ZiAqLwotICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDZEQjE2NTFEVUwsIDB4MDAwMDAxOURVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHg2QzZFNEIwM1VMLCAweDAwMDAyNDkyVUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogTkVDIGZhbmd5bzUudHRmICovCi0gICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NDBDOTI1NTVVTCwgMHgwMDAwMDBFNVVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweERFNTFGQUQwVUwsIDB4MDAwMDExN0NVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBORUMgZmFua3lvNS50dGYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg4NUU0NzY2NFVMLCAweDAwMDAwMEU1VUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4QTZDNjI4MzFVTCwgMHgwMDAwMUNBQVVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBmYW5yZ281LnR0ZiAqLwotICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDJEODkxQ0ZEVUwsIDB4MDAwMDAxOURVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHhBMDYwNDYzM1VMLCAweDAwMDAxREU4VUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogTkVDIGZhbmdvdDUudHRjICovCi0gICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NDBBQTc3NENVTCwgMHgwMDAwMDFDQlVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDlCNUNBQTk2VUwsIDB4MDAwMDFGOUFVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBORUMgZmFubWluMy50dGMgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHgwRDNERTlDQlVMLCAweDAwMDAwMTQxVUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4RDQxMjc3NjZVTCwgMHgwMDAwMjI4MFVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBGQS1Hb3RoaWMsIDE5OTYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg0QTY5MjY5OFVMLCAweDAwMDAwMUYwVUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4MzQwRDQzNDZVTCwgMHgwMDAwMUZDQVVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBGQS1NaW5jaG91LCAxOTk2ICovCi0gICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4Q0QzNEM2MDRVTCwgMHgwMDAwMDE2NlVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDZDRjMxMDQ2VUwsIDB4MDAwMDIyQjBVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBORUMgRkEtUm91bmRHb3RoaWNCLCAxOTk2ICovCi0gICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NURBNzUzMTVVTCwgMHgwMDAwMDE5RFVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDQwNzQ1QTVGVUwsIDB4MDAwMDIyRTBVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBORUMgRkEtUm91bmRHb3RoaWNNLCAxOTk2ICovCi0gICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4RjA1NUZDNDhVTCwgMHgwMDAwMDFDMlVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDM5MDBERUQzVUwsIDB4MDAwMDFFMThVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgICB7IC8qIE1JTkdMSS5UVEYsIDE5OTIgKi8KLSAgICAgICAgeyAweDAwMTcwMDAzVUwsIDB4MDAwMDAwNjBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHhEQkI0MzA2RVVMLCAweDAwMDA1OEFBVUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4RDY0MzQ4MkFVTCwgMHgwMDAwMDAzNVVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0KLSAgICB9OwotCi0gICAgRlRfVUxvbmcgICBjaGVja3N1bTsKLSAgICBpbnQgICAgICAgIG51bV9tYXRjaGVkX2lkc1tUUklDS19TRk5UX0lEU19OVU1fRkFDRVNdOwotICAgIEZUX0Jvb2wgICAgaGFzX2N2dCwgaGFzX2ZwZ20sIGhhc19wcmVwOwotICAgIEZUX1VTaG9ydCAgaTsKLSAgICBpbnQgICAgICAgIGosIGs7Ci0KLQotICAgIEZUX01FTV9TRVQoIG51bV9tYXRjaGVkX2lkcywgMCwKLSAgICAgICAgICAgICAgICBzaXplb2YgKCBpbnQgKSAqIFRSSUNLX1NGTlRfSURTX05VTV9GQUNFUyApOwotICAgIGhhc19jdnQgID0gRkFMU0U7Ci0gICAgaGFzX2ZwZ20gPSBGQUxTRTsKLSAgICBoYXNfcHJlcCA9IEZBTFNFOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBmYWNlLT5udW1fdGFibGVzOyBpKysgKQotICAgIHsKLSAgICAgIGNoZWNrc3VtID0gMDsKLQotICAgICAgc3dpdGNoKCBmYWNlLT5kaXJfdGFibGVzW2ldLlRhZyApCi0gICAgICB7Ci0gICAgICBjYXNlIFRUQUdfY3Z0OgotICAgICAgICBrID0gVFJJQ0tfU0ZOVF9JRF9jdnQ7Ci0gICAgICAgIGhhc19jdnQgID0gVFJVRTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVFRBR19mcGdtOgotICAgICAgICBrID0gVFJJQ0tfU0ZOVF9JRF9mcGdtOwotICAgICAgICBoYXNfZnBnbSA9IFRSVUU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRUQUdfcHJlcDoKLSAgICAgICAgayA9IFRSSUNLX1NGTlRfSURfcHJlcDsKLSAgICAgICAgaGFzX3ByZXAgPSBUUlVFOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIGogPSAwOyBqIDwgVFJJQ0tfU0ZOVF9JRFNfTlVNX0ZBQ0VTOyBqKysgKQotICAgICAgICBpZiAoIGZhY2UtPmRpcl90YWJsZXNbaV0uTGVuZ3RoID09IHNmbnRfaWRbal1ba10uTGVuZ3RoICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggIWNoZWNrc3VtICkKLSAgICAgICAgICAgIGNoZWNrc3VtID0gdHRfZ2V0X3NmbnRfY2hlY2tzdW0oIGZhY2UsIGkgKTsKLQotICAgICAgICAgIGlmICggc2ZudF9pZFtqXVtrXS5DaGVja1N1bSA9PSBjaGVja3N1bSApCi0gICAgICAgICAgICBudW1fbWF0Y2hlZF9pZHNbal0rKzsKLQotICAgICAgICAgIGlmICggbnVtX21hdGNoZWRfaWRzW2pdID09IFRSSUNLX1NGTlRfSURTX1BFUl9GQUNFICkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaiA9IDA7IGogPCBUUklDS19TRk5UX0lEU19OVU1fRkFDRVM7IGorKyApCi0gICAgewotICAgICAgaWYgKCAhaGFzX2N2dCAgJiYgIXNmbnRfaWRbal1bVFJJQ0tfU0ZOVF9JRF9jdnRdLkxlbmd0aCApCi0gICAgICAgIG51bV9tYXRjaGVkX2lkc1tqXSsrOwotICAgICAgaWYgKCAhaGFzX2ZwZ20gJiYgIXNmbnRfaWRbal1bVFJJQ0tfU0ZOVF9JRF9mcGdtXS5MZW5ndGggKQotICAgICAgICBudW1fbWF0Y2hlZF9pZHNbal0rKzsKLSAgICAgIGlmICggIWhhc19wcmVwICYmICFzZm50X2lkW2pdW1RSSUNLX1NGTlRfSURfcHJlcF0uTGVuZ3RoICkKLSAgICAgICAgbnVtX21hdGNoZWRfaWRzW2pdKys7Ci0gICAgICBpZiAoIG51bV9tYXRjaGVkX2lkc1tqXSA9PSBUUklDS19TRk5UX0lEU19QRVJfRkFDRSApCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgdHRfY2hlY2tfdHJpY2t5bmVzcyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIC8qIEZvciBmaXJzdCwgY2hlY2sgdGhlIGZhY2UgbmFtZSBmb3IgcXVpY2sgY2hlY2suICovCi0gICAgaWYgKCBmYWNlLT5mYW1pbHlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdHRfY2hlY2tfdHJpY2t5bmVzc19mYW1pbHkoIGZhY2UtPmZhbWlseV9uYW1lICkgKQotICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAvKiBUeXBlNDIgZm9udHMgbWF5IGxhY2sgYG5hbWUnIHRhYmxlcywgd2UgdGh1cyB0cnkgdG8gaWRlbnRpZnkgKi8KLSAgICAvKiB0cmlja3kgZm9udHMgYnkgY2hlY2tpbmcgdGhlIGNoZWNrc3VtcyBvZiBUeXBlNDItcGVyc2lzdGVudCAgKi8KLSAgICAvKiBzZm50IHRhYmxlcyAoYGN2dCcsIGBmcGdtJywgYW5kIGBwcmVwJykuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIHR0X2NoZWNrX3RyaWNreW5lc3Nfc2ZudF9pZHMoIChUVF9GYWNlKWZhY2UgKSApCi0gICAgICByZXR1cm4gVFJVRTsKLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgLyogQ2hlY2sgd2hldGhlciBgLm5vdGRlZicgaXMgdGhlIG9ubHkgZ2x5cGggaW4gdGhlIGBsb2NhJyB0YWJsZS4gKi8KLSAgc3RhdGljIEZUX0Jvb2wKLSAgdHRfY2hlY2tfc2luZ2xlX25vdGRlZiggRlRfRmFjZSAgdHRmYWNlICkKLSAgewotICAgIEZUX0Jvb2wgICByZXN1bHQgPSBGQUxTRTsKLQotICAgIFRUX0ZhY2UgICBmYWNlID0gKFRUX0ZhY2UpdHRmYWNlOwotICAgIEZUX1VJbnQgICBhc2l6ZTsKLSAgICBGVF9VTG9uZyAgaTsKLSAgICBGVF9VTG9uZyAgZ2x5cGhfaW5kZXggPSAwOwotICAgIEZUX1VJbnQgICBjb3VudCAgICAgICA9IDA7Ci0KLQotICAgIGZvciggaSA9IDA7IGkgPCBmYWNlLT5udW1fbG9jYXRpb25zOyBpKysgKQotICAgIHsKLSAgICAgIHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKCBmYWNlLCBpLCAmYXNpemUgKTsKLSAgICAgIGlmICggYXNpemUgPiAwICkKLSAgICAgIHsKLSAgICAgICAgY291bnQgKz0gMTsKLSAgICAgICAgaWYgKCBjb3VudCA+IDEgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBnbHlwaF9pbmRleCA9IGk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogT25seSBoYXZlIGEgc2luZ2xlIG91dGxpbmUuICovCi0gICAgaWYgKCBjb3VudCA9PSAxICkKLSAgICB7Ci0gICAgICBpZiAoIGdseXBoX2luZGV4ID09IDAgKQotICAgICAgICByZXN1bHQgPSBUUlVFOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBGSVhNRTogTmVlZCB0byB0ZXN0IGdseXBobmFtZSA9PSAubm90ZGVmID8gKi8KLSAgICAgICAgRlRfRXJyb3IgZXJyb3I7Ci0gICAgICAgIGNoYXIgYnVmWzhdOwotCi0KLSAgICAgICAgZXJyb3IgPSBGVF9HZXRfR2x5cGhfTmFtZSggdHRmYWNlLCBnbHlwaF9pbmRleCwgYnVmLCA4ICk7Ci0gICAgICAgIGlmICggIWVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGJ1ZlswXSA9PSAnLicgJiYgIWZ0X3N0cm5jbXAoIGJ1ZiwgIi5ub3RkZWYiLCA4ICkgKQotICAgICAgICAgIHJlc3VsdCA9IFRSVUU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIGdpdmVuIFRydWVUeXBlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgc291cmNlIGZvbnQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UgYXJlIG9wZW5pbmcgYSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLCBpbiBiaXRzIDAtMTUuICBUaGUgbnVtYmVyZWQgaW5zdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5kZXh+K34xIG9mIGEgR1ggKHN1Yilmb250LCBpZiBhcHBsaWNhYmxlLCBpbiBiaXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgIDE2LTMwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogTnVtYmVyIG9mIGFkZGl0aW9uYWwgZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgSWdub3JlZC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICAgICA6OiBBZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgbmV3bHkgYnVpbHQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgdHRmYWNlLCAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfTGlicmFyeSAgICBsaWJyYXJ5OwotICAgIFNGTlRfU2VydmljZSAgc2ZudDsKLSAgICBUVF9GYWNlICAgICAgIGZhY2UgPSAoVFRfRmFjZSl0dGZhY2U7Ci0KLQotICAgIEZUX1RSQUNFMigoICJUVEYgZHJpdmVyXG4iICkpOwotCi0gICAgbGlicmFyeSA9IHR0ZmFjZS0+ZHJpdmVyLT5yb290LmxpYnJhcnk7Ci0KLSAgICBzZm50ID0gKFNGTlRfU2VydmljZSlGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSggbGlicmFyeSwgInNmbnQiICk7Ci0gICAgaWYgKCAhc2ZudCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidHRfZmFjZV9pbml0OiBjYW5ub3QgYWNjZXNzIGBzZm50JyBtb2R1bGVcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX01vZHVsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGNyZWF0ZSBpbnB1dCBzdHJlYW0gZnJvbSByZXNvdXJjZSAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYSB2YWxpZCBUcnVlVHlwZSBmaWxlICovCi0gICAgRlRfVFJBQ0UyKCggIiAgIiApKTsKLSAgICBlcnJvciA9IHNmbnQtPmluaXRfZmFjZSggc3RyZWFtLCBmYWNlLCBmYWNlX2luZGV4LCBudW1fcGFyYW1zLCBwYXJhbXMgKTsKLQotICAgIC8qIFN0cmVhbSBtYXkgaGF2ZSBjaGFuZ2VkLiAqLwotICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBXZSBtdXN0IGFsc28gYmUgYWJsZSB0byBhY2NlcHQgTWFjL0dYIGZvbnRzLCBhcyB3ZWxsIGFzIE9UIG9uZXMuICovCi0gICAgLyogVGhlIDB4MDAwMjAwMDAgdGFnIGlzIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkOyBzb21lIGZvbnRzIGZyb20gICAqLwotICAgIC8qIEFycGhpYyBtYWRlIGZvciBDaGluZXNlIFdpbmRvd3MgMy4xIGhhdmUgdGhpcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPmZvcm1hdF90YWcgIT0gMHgwMDAxMDAwMEwgJiYgICAgLyogTVMgZm9udHMgICovCi0gICAgICAgICBmYWNlLT5mb3JtYXRfdGFnICE9IDB4MDAwMjAwMDBMICYmICAgIC8qIENKSyBmb250cyBmb3IgV2luIDMuMSAqLwotICAgICAgICAgZmFjZS0+Zm9ybWF0X3RhZyAhPSBUVEFHX3RydWUgICApICAgICAvKiBNYWMgZm9udHMgKi8KLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiICBub3QgYSBUVEYgZm9udFxuIiApKTsKLSAgICAgIGdvdG8gQmFkX0Zvcm1hdDsKLSAgICB9Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICB0dGZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0hJTlRFUjsKLSNlbmRpZgotCi0gICAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSBzaW1wbGUgZm9udCBmb3JtYXQgY2hlY2ssIGV4aXQgaW1tZWRpYXRlbHkuICovCi0gICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgLyogTG9hZCBmb250IGRpcmVjdG9yeSAqLwotICAgIGVycm9yID0gc2ZudC0+bG9hZF9mYWNlKCBzdHJlYW0sIGZhY2UsIGZhY2VfaW5kZXgsIG51bV9wYXJhbXMsIHBhcmFtcyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCB0dF9jaGVja190cmlja3luZXNzKCB0dGZhY2UgKSApCi0gICAgICB0dGZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1RSSUNLWTsKLQotICAgIGVycm9yID0gdHRfZmFjZV9sb2FkX2hkbXgoIGZhY2UsIHN0cmVhbSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggdHRmYWNlICkgKQotICAgIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgICBpZiAoICF0dGZhY2UtPmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotI2VuZGlmCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gdHRfZmFjZV9sb2FkX2xvY2EoIGZhY2UsIHN0cmVhbSApOwotCi0gICAgICAgIC8qIGhhdmluZyBhIChub24temVybykgYGdseWYnIHRhYmxlIHdpdGhvdXQgKi8KLSAgICAgICAgLyogYSBgbG9jYScgdGFibGUgaXMgbm90IHZhbGlkICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGZhY2UtPmdseWZfbGVuICYmIEZUX0VSUl9FUSggZXJyb3IsIFRhYmxlX01pc3NpbmcgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGBmcGdtJywgYGN2dCcsIGFuZCBgcHJlcCcgYXJlIG9wdGlvbmFsICovCi0gICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9jdnQoIGZhY2UsIHN0cmVhbSApOwotICAgICAgaWYgKCBlcnJvciAmJiBGVF9FUlJfTkVRKCBlcnJvciwgVGFibGVfTWlzc2luZyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9mcGdtKCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgIGlmICggZXJyb3IgJiYgRlRfRVJSX05FUSggZXJyb3IsIFRhYmxlX01pc3NpbmcgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfcHJlcCggZmFjZSwgc3RyZWFtICk7Ci0gICAgICBpZiAoIGVycm9yICYmIEZUX0VSUl9ORVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIENoZWNrIHRoZSBzY2FsYWJsZSBmbGFnIGJhc2VkIG9uIGBsb2NhJy4gKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgICBpZiAoICF0dGZhY2UtPmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotI2VuZGlmCi0gICAgICB7Ci0gICAgICAgIGlmICggdHRmYWNlLT5udW1fZml4ZWRfc2l6ZXMgICAgICAgICAgJiYKLSAgICAgICAgICAgICBmYWNlLT5nbHlwaF9sb2NhdGlvbnMgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHR0X2NoZWNrX3NpbmdsZV9ub3RkZWYoIHR0ZmFjZSApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNSgoICJ0dF9mYWNlX2luaXQ6IgotICAgICAgICAgICAgICAgICAgICAgICIgT25seSB0aGUgYC5ub3RkZWYnIGdseXBoIGhhcyBhbiBvdXRsaW5lLlxuIgotICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAgICIgUmVzZXR0aW5nIHNjYWxhYmxlIGZsYWcgdG8gRkFMU0UuXG4iICkpOwotCi0gICAgICAgICAgdHRmYWNlLT5mYWNlX2ZsYWdzICY9IH5GVF9GQUNFX0ZMQUdfU0NBTEFCTEU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLSAgICB7Ci0gICAgICBGVF9JbnQgIGluc3RhbmNlX2luZGV4ID0gZmFjZV9pbmRleCA+PiAxNjsKLQotCi0gICAgICBpZiAoIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCB0dGZhY2UgKSAmJgotICAgICAgICAgICBpbnN0YW5jZV9pbmRleCA+IDAgICAgICAgICAgICAgICAgKQotICAgICAgewotICAgICAgICBlcnJvciA9IFRUX0dldF9NTV9WYXIoIGZhY2UsIE5VTEwgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggZmFjZS0+YmxlbmQtPm1tdmFyLT5uYW1lZHN0eWxlICkKLSAgICAgICAgewotICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gdHRmYWNlLT5tZW1vcnk7Ci0KLSAgICAgICAgICBGVF9WYXJfTmFtZWRfU3R5bGUqICBuYW1lZF9zdHlsZTsKLSAgICAgICAgICBGVF9TdHJpbmcqICAgICAgICAgICBzdHlsZV9uYW1lOwotCi0KLSAgICAgICAgICAvKiBpbiBgZmFjZV9pbmRleCcsIHRoZSBpbnN0YW5jZSBpbmRleCBzdGFydHMgd2l0aCB2YWx1ZSAxICovCi0gICAgICAgICAgbmFtZWRfc3R5bGUgPSBmYWNlLT5ibGVuZC0+bW12YXItPm5hbWVkc3R5bGUgKyBpbnN0YW5jZV9pbmRleCAtIDE7Ci0gICAgICAgICAgZXJyb3IgPSBzZm50LT5nZXRfbmFtZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KW5hbWVkX3N0eWxlLT5zdHJpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGVfbmFtZSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogc2V0IHN0eWxlIG5hbWU7IGlmIGFscmVhZHkgc2V0LCByZXBsYWNlIGl0ICovCi0gICAgICAgICAgaWYgKCBmYWNlLT5yb290LnN0eWxlX25hbWUgKQotICAgICAgICAgICAgRlRfRlJFRSggZmFjZS0+cm9vdC5zdHlsZV9uYW1lICk7Ci0gICAgICAgICAgZmFjZS0+cm9vdC5zdHlsZV9uYW1lID0gc3R5bGVfbmFtZTsKLQotICAgICAgICAgIC8qIGZpbmFsbHksIHNlbGVjdCB0aGUgbmFtZWQgaW5zdGFuY2UgKi8KLSAgICAgICAgICBlcnJvciA9IFRUX1NldF9WYXJfRGVzaWduKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmJsZW5kLT5tbXZhci0+bnVtX2F4aXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRfc3R5bGUtPmNvb3JkcyApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgdHRfYXBwbHlfbXZhciggZmFjZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCAqLwotCi0gICAgLyogaW5pdGlhbGl6ZSBzdGFuZGFyZCBnbHlwaCBsb2FkaW5nIHJvdXRpbmVzICovCi0gICAgVFRfSW5pdF9HbHlwaF9Mb2FkaW5nKCBmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgQmFkX0Zvcm1hdDoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZSBhIGdpdmVuIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgcG9pbnRlciB0byB0aGUgZmFjZSBvYmplY3QgdG8gZGVzdHJveS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZG9uZSggRlRfRmFjZSAgdHRmYWNlICkgICAgICAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgewotICAgIFRUX0ZhY2UgICAgICAgZmFjZSA9IChUVF9GYWNlKXR0ZmFjZTsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeTsKLSAgICBGVF9TdHJlYW0gICAgIHN0cmVhbTsKLSAgICBTRk5UX1NlcnZpY2UgIHNmbnQ7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuOwotCi0gICAgbWVtb3J5ID0gdHRmYWNlLT5tZW1vcnk7Ci0gICAgc3RyZWFtID0gdHRmYWNlLT5zdHJlYW07Ci0gICAgc2ZudCAgID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotCi0gICAgLyogZm9yIGBleHRlbmRlZCBUcnVlVHlwZSBmb3JtYXRzJyAoaS5lLiBjb21wcmVzc2VkIHZlcnNpb25zKSAqLwotICAgIGlmICggZmFjZS0+ZXh0cmEuZmluYWxpemVyICkKLSAgICAgIGZhY2UtPmV4dHJhLmZpbmFsaXplciggZmFjZS0+ZXh0cmEuZGF0YSApOwotCi0gICAgaWYgKCBzZm50ICkKLSAgICAgIHNmbnQtPmRvbmVfZmFjZSggZmFjZSApOwotCi0gICAgLyogZnJlZWluZyB0aGUgbG9jYXRpb25zIHRhYmxlICovCi0gICAgdHRfZmFjZV9kb25lX2xvY2EoIGZhY2UgKTsKLQotICAgIHR0X2ZhY2VfZnJlZV9oZG14KCBmYWNlICk7Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSBDVlQgKi8KLSAgICBGVF9GUkVFKCBmYWNlLT5jdnQgKTsKLSAgICBmYWNlLT5jdnRfc2l6ZSA9IDA7Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSBwcm9ncmFtcyAqLwotICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGZhY2UtPmZvbnRfcHJvZ3JhbSApOwotICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGZhY2UtPmN2dF9wcm9ncmFtICk7Ci0gICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPSAwOwotICAgIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgID0gMDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICB0dF9kb25lX2JsZW5kKCBmYWNlICk7Ci0gICAgZmFjZS0+YmxlbmQgPSBOVUxMOwotI2VuZGlmCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X3NpemVfcnVuX2ZwZ20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJ1biB0aGUgZm9udCBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGVkYW50aWMgOjogU2V0IGlmIGJ5dGVjb2RlIGV4ZWN1dGlvbiBzaG91bGQgYmUgcGVkYW50aWMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9ydW5fZnBnbSggVFRfU2l6ZSAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgcGVkYW50aWMgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICAgIGZhY2UgPSAoVFRfRmFjZSlzaXplLT5yb290LmZhY2U7Ci0gICAgVFRfRXhlY0NvbnRleHQgIGV4ZWM7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotCi0KLSAgICBleGVjID0gc2l6ZS0+Y29udGV4dDsKLQotICAgIGVycm9yID0gVFRfTG9hZF9Db250ZXh0KCBleGVjLCBmYWNlLCBzaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBleGVjLT5jYWxsVG9wID0gMDsKLSAgICBleGVjLT50b3AgICAgID0gMDsKLQotICAgIGV4ZWMtPnBlcmlvZCAgICA9IDY0OwotICAgIGV4ZWMtPnBoYXNlICAgICA9IDA7Ci0gICAgZXhlYy0+dGhyZXNob2xkID0gMDsKLQotICAgIGV4ZWMtPmluc3RydWN0aW9uX3RyYXAgPSBGQUxTRTsKLSAgICBleGVjLT5GX2RvdF9QICAgICAgICAgID0gMHg0MDAwTDsKLQotICAgIGV4ZWMtPnBlZGFudGljX2hpbnRpbmcgPSBwZWRhbnRpYzsKLQotICAgIHsKLSAgICAgIEZUX1NpemVfTWV0cmljcyogIHNpemVfbWV0cmljcyA9ICZleGVjLT5tZXRyaWNzOwotICAgICAgVFRfU2l6ZV9NZXRyaWNzKiAgdHRfbWV0cmljcyAgID0gJmV4ZWMtPnR0X21ldHJpY3M7Ci0KLQotICAgICAgc2l6ZV9tZXRyaWNzLT54X3BwZW0gICA9IDA7Ci0gICAgICBzaXplX21ldHJpY3MtPnlfcHBlbSAgID0gMDsKLSAgICAgIHNpemVfbWV0cmljcy0+eF9zY2FsZSAgPSAwOwotICAgICAgc2l6ZV9tZXRyaWNzLT55X3NjYWxlICA9IDA7Ci0KLSAgICAgIHR0X21ldHJpY3MtPnBwZW0gID0gMDsKLSAgICAgIHR0X21ldHJpY3MtPnNjYWxlID0gMDsKLSAgICAgIHR0X21ldHJpY3MtPnJhdGlvID0gMHgxMDAwMEw7Ci0gICAgfQotCi0gICAgLyogYWxsb3cgZm9udCBwcm9ncmFtIGV4ZWN1dGlvbiAqLwotICAgIFRUX1NldF9Db2RlUmFuZ2UoIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgdHRfY29kZXJhbmdlX2ZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWZhY2UtPmZvbnRfcHJvZ3JhbV9zaXplICk7Ci0KLSAgICAvKiBkaXNhYmxlIENWVCBhbmQgZ2x5cGggcHJvZ3JhbXMgY29kZXJhbmdlICovCi0gICAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfY3Z0ICk7Ci0gICAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfZ2x5cGggKTsKLQotICAgIGlmICggZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPiAwICkKLSAgICB7Ci0gICAgICBUVF9Hb3RvX0NvZGVSYW5nZSggZXhlYywgdHRfY29kZXJhbmdlX2ZvbnQsIDAgKTsKLQotICAgICAgRlRfVFJBQ0U0KCggIkV4ZWN1dGluZyBgZnBnbScgdGFibGUuXG4iICkpOwotICAgICAgZXJyb3IgPSBmYWNlLT5pbnRlcnByZXRlciggZXhlYyApOwotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgRlRfVFJBQ0U0KCggIiAgaW50ZXJwcmV0YXRpb24gZmFpbGVkIHdpdGggZXJyb3IgY29kZSAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICBlcnJvciApKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIHNpemUtPmJ5dGVjb2RlX3JlYWR5ID0gZXJyb3I7Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgICBUVF9TYXZlX0NvbnRleHQoIGV4ZWMsIHNpemUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9ydW5fcHJlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUnVuIHRoZSBjb250cm9sIHZhbHVlIHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwZWRhbnRpYyA6OiBTZXQgaWYgYnl0ZWNvZGUgZXhlY3V0aW9uIHNob3VsZCBiZSBwZWRhbnRpYy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9zaXplX3J1bl9wcmVwKCBUVF9TaXplICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICBwZWRhbnRpYyApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgZmFjZSA9IChUVF9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBUVF9FeGVjQ29udGV4dCAgZXhlYzsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIGV4ZWMgPSBzaXplLT5jb250ZXh0OwotCi0gICAgZXJyb3IgPSBUVF9Mb2FkX0NvbnRleHQoIGV4ZWMsIGZhY2UsIHNpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGV4ZWMtPmNhbGxUb3AgPSAwOwotICAgIGV4ZWMtPnRvcCAgICAgPSAwOwotCi0gICAgZXhlYy0+aW5zdHJ1Y3Rpb25fdHJhcCA9IEZBTFNFOwotCi0gICAgZXhlYy0+cGVkYW50aWNfaGludGluZyA9IHBlZGFudGljOwotCi0gICAgVFRfU2V0X0NvZGVSYW5nZSggZXhlYywKLSAgICAgICAgICAgICAgICAgICAgICB0dF9jb2RlcmFuZ2VfY3Z0LAotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmN2dF9wcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWZhY2UtPmN2dF9wcm9ncmFtX3NpemUgKTsKLQotICAgIFRUX0NsZWFyX0NvZGVSYW5nZSggZXhlYywgdHRfY29kZXJhbmdlX2dseXBoICk7Ci0KLSAgICBpZiAoIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgPiAwICkKLSAgICB7Ci0gICAgICBUVF9Hb3RvX0NvZGVSYW5nZSggZXhlYywgdHRfY29kZXJhbmdlX2N2dCwgMCApOwotCi0gICAgICBGVF9UUkFDRTQoKCAiRXhlY3V0aW5nIGBwcmVwJyB0YWJsZS5cbiIgKSk7Ci0gICAgICBlcnJvciA9IGZhY2UtPmludGVycHJldGVyKCBleGVjICk7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBGVF9UUkFDRTQoKCAiICBpbnRlcnByZXRhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgIGVycm9yICkpOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgc2l6ZS0+Y3Z0X3JlYWR5ID0gZXJyb3I7Ci0KLSAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGUgTVMgcmFzdGVyaXplciBkb2Vzbid0IGFsbG93IHRoZSBmb2xsb3dpbmcgKi8KLSAgICAvKiBncmFwaGljcyBzdGF0ZSB2YXJpYWJsZXMgdG8gYmUgbW9kaWZpZWQgYnkgdGhlIENWVCBwcm9ncmFtLiAgKi8KLQotICAgIGV4ZWMtPkdTLmR1YWxWZWN0b3IueCA9IDB4NDAwMDsKLSAgICBleGVjLT5HUy5kdWFsVmVjdG9yLnkgPSAwOwotICAgIGV4ZWMtPkdTLnByb2pWZWN0b3IueCA9IDB4NDAwMDsKLSAgICBleGVjLT5HUy5wcm9qVmVjdG9yLnkgPSAweDA7Ci0gICAgZXhlYy0+R1MuZnJlZVZlY3Rvci54ID0gMHg0MDAwOwotICAgIGV4ZWMtPkdTLmZyZWVWZWN0b3IueSA9IDB4MDsKLQotICAgIGV4ZWMtPkdTLnJwMCA9IDA7Ci0gICAgZXhlYy0+R1MucnAxID0gMDsKLSAgICBleGVjLT5HUy5ycDIgPSAwOwotCi0gICAgZXhlYy0+R1MuZ2VwMCA9IDE7Ci0gICAgZXhlYy0+R1MuZ2VwMSA9IDE7Ci0gICAgZXhlYy0+R1MuZ2VwMiA9IDE7Ci0KLSAgICBleGVjLT5HUy5sb29wID0gMTsKLQotICAgIC8qIHNhdmUgYXMgZGVmYXVsdCBncmFwaGljcyBzdGF0ZSAqLwotICAgIHNpemUtPkdTID0gZXhlYy0+R1M7Ci0KLSAgICBUVF9TYXZlX0NvbnRleHQoIGV4ZWMsIHNpemUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdHRfc2l6ZV9kb25lX2J5dGVjb2RlKCBGVF9TaXplICBmdHNpemUgKQotICB7Ci0gICAgVFRfU2l6ZSAgICBzaXplICAgPSAoVFRfU2l6ZSlmdHNpemU7Ci0gICAgVFRfRmFjZSAgICBmYWNlICAgPSAoVFRfRmFjZSlmdHNpemUtPmZhY2U7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotICAgIGlmICggc2l6ZS0+Y29udGV4dCApCi0gICAgewotICAgICAgVFRfRG9uZV9Db250ZXh0KCBzaXplLT5jb250ZXh0ICk7Ci0gICAgICBzaXplLT5jb250ZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBGVF9GUkVFKCBzaXplLT5jdnQgKTsKLSAgICBzaXplLT5jdnRfc2l6ZSA9IDA7Ci0KLSAgICAvKiBmcmVlIHN0b3JhZ2UgYXJlYSAqLwotICAgIEZUX0ZSRUUoIHNpemUtPnN0b3JhZ2UgKTsKLSAgICBzaXplLT5zdG9yYWdlX3NpemUgPSAwOwotCi0gICAgLyogdHdpbGlnaHQgem9uZSAqLwotICAgIHR0X2dseXBoem9uZV9kb25lKCAmc2l6ZS0+dHdpbGlnaHQgKTsKLQotICAgIEZUX0ZSRUUoIHNpemUtPmZ1bmN0aW9uX2RlZnMgKTsKLSAgICBGVF9GUkVFKCBzaXplLT5pbnN0cnVjdGlvbl9kZWZzICk7Ci0KLSAgICBzaXplLT5udW1fZnVuY3Rpb25fZGVmcyAgICA9IDA7Ci0gICAgc2l6ZS0+bWF4X2Z1bmN0aW9uX2RlZnMgICAgPSAwOwotICAgIHNpemUtPm51bV9pbnN0cnVjdGlvbl9kZWZzID0gMDsKLSAgICBzaXplLT5tYXhfaW5zdHJ1Y3Rpb25fZGVmcyA9IDA7Ci0KLSAgICBzaXplLT5tYXhfZnVuYyA9IDA7Ci0gICAgc2l6ZS0+bWF4X2lucyAgPSAwOwotCi0gICAgc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgPSAtMTsKLSAgICBzaXplLT5jdnRfcmVhZHkgICAgICA9IC0xOwotICB9Ci0KLQotICAvKiBJbml0aWFsaXplIGJ5dGVjb2RlLXJlbGF0ZWQgZmllbGRzIGluIHRoZSBzaXplIG9iamVjdC4gICAgICAgKi8KLSAgLyogV2UgZG8gdGhpcyBvbmx5IGlmIGJ5dGVjb2RlIGludGVycHJldGF0aW9uIGlzIHJlYWxseSBuZWVkZWQuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zaXplX2luaXRfYnl0ZWNvZGUoIEZUX1NpemUgIGZ0c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICBwZWRhbnRpYyApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIFRUX1NpemUgICAgc2l6ZSA9IChUVF9TaXplKWZ0c2l6ZTsKLSAgICBUVF9GYWNlICAgIGZhY2UgPSAoVFRfRmFjZSlmdHNpemUtPmZhY2U7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotICAgIEZUX1VTaG9ydCAgICAgICBuX3R3aWxpZ2h0OwotICAgIFRUX01heFByb2ZpbGUqICBtYXhwID0gJmZhY2UtPm1heF9wcm9maWxlOwotCi0KLSAgICAvKiBjbGVhbiB1cCBieXRlY29kZSByZWxhdGVkIGRhdGEgKi8KLSAgICBGVF9GUkVFKCBzaXplLT5mdW5jdGlvbl9kZWZzICk7Ci0gICAgRlRfRlJFRSggc2l6ZS0+aW5zdHJ1Y3Rpb25fZGVmcyApOwotICAgIEZUX0ZSRUUoIHNpemUtPmN2dCApOwotICAgIEZUX0ZSRUUoIHNpemUtPnN0b3JhZ2UgKTsKLQotICAgIGlmICggc2l6ZS0+Y29udGV4dCApCi0gICAgICBUVF9Eb25lX0NvbnRleHQoIHNpemUtPmNvbnRleHQgKTsKLSAgICB0dF9nbHlwaHpvbmVfZG9uZSggJnNpemUtPnR3aWxpZ2h0ICk7Ci0KLSAgICBzaXplLT5ieXRlY29kZV9yZWFkeSA9IC0xOwotICAgIHNpemUtPmN2dF9yZWFkeSAgICAgID0gLTE7Ci0KLSAgICBzaXplLT5jb250ZXh0ID0gVFRfTmV3X0NvbnRleHQoIChUVF9Ecml2ZXIpZmFjZS0+cm9vdC5kcml2ZXIgKTsKLQotICAgIHNpemUtPm1heF9mdW5jdGlvbl9kZWZzICAgID0gbWF4cC0+bWF4RnVuY3Rpb25EZWZzOwotICAgIHNpemUtPm1heF9pbnN0cnVjdGlvbl9kZWZzID0gbWF4cC0+bWF4SW5zdHJ1Y3Rpb25EZWZzOwotCi0gICAgc2l6ZS0+bnVtX2Z1bmN0aW9uX2RlZnMgICAgPSAwOwotICAgIHNpemUtPm51bV9pbnN0cnVjdGlvbl9kZWZzID0gMDsKLQotICAgIHNpemUtPm1heF9mdW5jID0gMDsKLSAgICBzaXplLT5tYXhfaW5zICA9IDA7Ci0KLSAgICBzaXplLT5jdnRfc2l6ZSAgICAgPSBmYWNlLT5jdnRfc2l6ZTsKLSAgICBzaXplLT5zdG9yYWdlX3NpemUgPSBtYXhwLT5tYXhTdG9yYWdlOwotCi0gICAgLyogU2V0IGRlZmF1bHQgbWV0cmljcyAqLwotICAgIHsKLSAgICAgIFRUX1NpemVfTWV0cmljcyogIHR0X21ldHJpY3MgPSAmc2l6ZS0+dHRtZXRyaWNzOwotCi0KLSAgICAgIHR0X21ldHJpY3MtPnJvdGF0ZWQgICA9IEZBTFNFOwotICAgICAgdHRfbWV0cmljcy0+c3RyZXRjaGVkID0gRkFMU0U7Ci0KLSAgICAgIC8qIHNldCBkZWZhdWx0IGVuZ2luZSBjb21wZW5zYXRpb24gKi8KLSAgICAgIHR0X21ldHJpY3MtPmNvbXBlbnNhdGlvbnNbMF0gPSAwOyAgIC8qIGdyYXkgICAgICovCi0gICAgICB0dF9tZXRyaWNzLT5jb21wZW5zYXRpb25zWzFdID0gMDsgICAvKiBibGFjayAgICAqLwotICAgICAgdHRfbWV0cmljcy0+Y29tcGVuc2F0aW9uc1syXSA9IDA7ICAgLyogd2hpdGUgICAgKi8KLSAgICAgIHR0X21ldHJpY3MtPmNvbXBlbnNhdGlvbnNbM10gPSAwOyAgIC8qIHJlc2VydmVkICovCi0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgZnVuY3Rpb24gZGVmcywgaW5zdHJ1Y3Rpb24gZGVmcywgY3Z0LCBhbmQgc3RvcmFnZSBhcmVhICovCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHNpemUtPmZ1bmN0aW9uX2RlZnMsICAgIHNpemUtPm1heF9mdW5jdGlvbl9kZWZzICAgICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggc2l6ZS0+aW5zdHJ1Y3Rpb25fZGVmcywgc2l6ZS0+bWF4X2luc3RydWN0aW9uX2RlZnMgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBzaXplLT5jdnQsICAgICAgICAgICAgICBzaXplLT5jdnRfc2l6ZSAgICAgICAgICAgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHNpemUtPnN0b3JhZ2UsICAgICAgICAgIHNpemUtPnN0b3JhZ2Vfc2l6ZSAgICAgICAgICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcmVzZXJ2ZSB0d2lsaWdodCB6b25lICovCi0gICAgbl90d2lsaWdodCA9IG1heHAtPm1heFR3aWxpZ2h0UG9pbnRzOwotCi0gICAgLyogdGhlcmUgYXJlIDQgcGhhbnRvbSBwb2ludHMgKGRvIHdlIG5lZWQgdGhpcz8pICovCi0gICAgbl90d2lsaWdodCArPSA0OwotCi0gICAgZXJyb3IgPSB0dF9nbHlwaHpvbmVfbmV3KCBtZW1vcnksIG5fdHdpbGlnaHQsIDAsICZzaXplLT50d2lsaWdodCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2l6ZS0+dHdpbGlnaHQubl9wb2ludHMgPSBuX3R3aWxpZ2h0OwotCi0gICAgc2l6ZS0+R1MgPSB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlOwotCi0gICAgLyogc2V0IGBmYWNlLT5pbnRlcnByZXRlcicgYWNjb3JkaW5nIHRvIHRoZSBkZWJ1ZyBob29rIHByZXNlbnQgKi8KLSAgICB7Ci0gICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gZmFjZS0+cm9vdC5kcml2ZXItPnJvb3QubGlicmFyeTsKLQotCi0gICAgICBmYWNlLT5pbnRlcnByZXRlciA9IChUVF9JbnRlcnByZXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LT5kZWJ1Z19ob29rc1tGVF9ERUJVR19IT09LX1RSVUVUWVBFXTsKLSAgICAgIGlmICggIWZhY2UtPmludGVycHJldGVyICkKLSAgICAgICAgZmFjZS0+aW50ZXJwcmV0ZXIgPSAoVFRfSW50ZXJwcmV0ZXIpVFRfUnVuSW5zOwotICAgIH0KLQotICAgIC8qIEZpbmUsIG5vdyBydW4gdGhlIGZvbnQgcHJvZ3JhbSEgKi8KLQotICAgIC8qIEluIGNhc2Ugb2YgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nIGBmcGdtJywgd2UgaW50ZW50aW9uYWxseSBkb24ndCAqLwotICAgIC8qIGNsZWFuIHVwIGltbWVkaWF0ZWx5IOKAkyBidWdzIGluIHRoZSBgZnBnbScgYXJlIHNvIGZ1bmRhbWVudGFsIHRoYXQgICovCi0gICAgLyogYWxsIGZvbGxvd2luZyBoaW50aW5nIGNhbGxzIHNob3VsZCBmYWlsLiAgQWRkaXRpb25hbGx5LCBgZnBnbScgaXMgICovCi0gICAgLyogdG8gYmUgZXhlY3V0ZWQganVzdCBvbmNlOyBjYWxsaW5nIGl0IGFnYWluIGlzIGNvbXBsZXRlbHkgdXNlbGVzcyAgICovCi0gICAgLyogYW5kIG1pZ2h0IGV2ZW4gbGVhZCB0byBleHRyZW1lbHkgc2xvdyBiZWhhdmlvdXIgaWYgaXQgaXMgbWFsZm9ybWVkICovCi0gICAgLyogKGNvbnRhaW5pbmcgYW4gaW5maW5pdGUgbG9vcCwgZm9yIGV4YW1wbGUpLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZXJyb3IgPSB0dF9zaXplX3J1bl9mcGdtKCBzaXplLCBwZWRhbnRpYyApOwotICAgIHJldHVybiBlcnJvcjsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgICAgdHRfc2l6ZV9kb25lX2J5dGVjb2RlKCBmdHNpemUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUoIFRUX1NpemUgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHBlZGFudGljICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBzaXplLT5ieXRlY29kZV9yZWFkeSA8IDAgKQotICAgICAgZXJyb3IgPSB0dF9zaXplX2luaXRfYnl0ZWNvZGUoIChGVF9TaXplKXNpemUsIHBlZGFudGljICk7Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBzaXplLT5ieXRlY29kZV9yZWFkeTsKLQotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcmVzY2FsZSBDVlQgd2hlbiBuZWVkZWQgKi8KLSAgICBpZiAoIHNpemUtPmN2dF9yZWFkeSA8IDAgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGk7Ci0gICAgICBUVF9GYWNlICBmYWNlID0gKFRUX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotCi0KLSAgICAgIC8qIFNjYWxlIHRoZSBjdnQgdmFsdWVzIHRvIHRoZSBuZXcgcHBlbS4gICAgICAgICAgKi8KLSAgICAgIC8qIFdlIHVzZSBieSBkZWZhdWx0IHRoZSB5IHBwZW0gdG8gc2NhbGUgdGhlIENWVC4gKi8KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZS0+Y3Z0X3NpemU7IGkrKyApCi0gICAgICAgIHNpemUtPmN2dFtpXSA9IEZUX011bEZpeCggZmFjZS0+Y3Z0W2ldLCBzaXplLT50dG1ldHJpY3Muc2NhbGUgKTsKLQotICAgICAgLyogYWxsIHR3aWxpZ2h0IHBvaW50cyBhcmUgb3JpZ2luYWxseSB6ZXJvICovCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IChGVF9VSW50KXNpemUtPnR3aWxpZ2h0Lm5fcG9pbnRzOyBpKysgKQotICAgICAgewotICAgICAgICBzaXplLT50d2lsaWdodC5vcmdbaV0ueCA9IDA7Ci0gICAgICAgIHNpemUtPnR3aWxpZ2h0Lm9yZ1tpXS55ID0gMDsKLSAgICAgICAgc2l6ZS0+dHdpbGlnaHQuY3VyW2ldLnggPSAwOwotICAgICAgICBzaXplLT50d2lsaWdodC5jdXJbaV0ueSA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNsZWFyIHN0b3JhZ2UgYXJlYSAqLwotICAgICAgZm9yICggaSA9IDA7IGkgPCAoRlRfVUludClzaXplLT5zdG9yYWdlX3NpemU7IGkrKyApCi0gICAgICAgIHNpemUtPnN0b3JhZ2VbaV0gPSAwOwotCi0gICAgICBzaXplLT5HUyA9IHR0X2RlZmF1bHRfZ3JhcGhpY3Nfc3RhdGU7Ci0KLSAgICAgIGVycm9yID0gdHRfc2l6ZV9ydW5fcHJlcCggc2l6ZSwgcGVkYW50aWMgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBzaXplLT5jdnRfcmVhZHk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIG5ldyBUcnVlVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9pbml0KCBGVF9TaXplICB0dHNpemUgKSAgICAgICAgICAgLyogVFRfU2l6ZSAqLwotICB7Ci0gICAgVFRfU2l6ZSAgIHNpemUgID0gKFRUX1NpemUpdHRzaXplOwotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgPSAtMTsKLSAgICBzaXplLT5jdnRfcmVhZHkgICAgICA9IC0xOwotI2VuZGlmCi0KLSAgICBzaXplLT50dG1ldHJpY3MudmFsaWQgPSBGQUxTRTsKLSAgICBzaXplLT5zdHJpa2VfaW5kZXggICAgPSAweEZGRkZGRkZGVUw7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X3NpemVfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUcnVlVHlwZSBzaXplIG9iamVjdCBmaW5hbGl6ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfc2l6ZV9kb25lKCBGVF9TaXplICB0dHNpemUgKSAgICAgICAgICAgLyogVFRfU2l6ZSAqLwotICB7Ci0gICAgVFRfU2l6ZSAgc2l6ZSA9IChUVF9TaXplKXR0c2l6ZTsKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgdHRfc2l6ZV9kb25lX2J5dGVjb2RlKCB0dHNpemUgKTsKLSNlbmRpZgotCi0gICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gRkFMU0U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X3NpemVfcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlc2V0IGEgVHJ1ZVR5cGUgc2l6ZSB3aGVuIHJlc29sdXRpb25zIGFuZCBjaGFyYWN0ZXIgZGltZW5zaW9ucyAgICAqLwotICAvKiAgICBoYXZlIGJlZW4gY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9ubHlfaGVpZ2h0IDo6IE9ubHkgcmVjb21wdXRlIGFzY2VuZGVyLCBkZXNjZW5kZXIsIGFuZCBoZWlnaHQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X3NpemVfcmVzZXQoIFRUX1NpemUgIHNpemUsCi0gICAgICAgICAgICAgICAgIEZUX0Jvb2wgIG9ubHlfaGVpZ2h0ICkKLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgIGZhY2U7Ci0gICAgRlRfU2l6ZV9NZXRyaWNzKiAgc2l6ZV9tZXRyaWNzOwotCi0KLSAgICBmYWNlID0gKFRUX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotCi0gICAgLyogbm90aGluZyB0byBkbyBmb3IgQ0ZGMiAqLwotICAgIGlmICggZmFjZS0+aXNfY2ZmMiApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gRkFMU0U7Ci0KLSAgICBzaXplX21ldHJpY3MgPSAmc2l6ZS0+aGludGVkX21ldHJpY3M7Ci0KLSAgICAvKiBjb3B5IHRoZSByZXN1bHQgZnJvbSBiYXNlIGxheWVyICovCi0gICAgKnNpemVfbWV0cmljcyA9IHNpemUtPnJvb3QubWV0cmljczsKLQotICAgIGlmICggc2l6ZV9tZXRyaWNzLT54X3BwZW0gPCAxIHx8IHNpemVfbWV0cmljcy0+eV9wcGVtIDwgMSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfUFBlbSApOwotCi0gICAgLyogVGhpcyBiaXQgZmxhZywgaWYgc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHBlbXMgbXVzdCBiZSAgICAgICAqLwotICAgIC8qIHJvdW5kZWQgdG8gaW50ZWdlcnMuICBOZWFybHkgYWxsIFRydWVUeXBlIGZvbnRzIGhhdmUgdGhpcyBiaXQgKi8KLSAgICAvKiBzZXQsIGFzIGhpbnRpbmcgd29uJ3Qgd29yayByZWFsbHkgd2VsbCBvdGhlcndpc2UuICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZmFjZS0+aGVhZGVyLkZsYWdzICYgOCApCi0gICAgewotICAgICAgLyogdGhlIFRUIHNwZWMgYWx3YXlzIGFza3MgZm9yIFJPVU5ELCBub3QgRkxPT1Igb3IgQ0VJTCAqLwotICAgICAgc2l6ZV9tZXRyaWNzLT5hc2NlbmRlciA9IEZUX1BJWF9ST1VORCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZmFjZS0+cm9vdC5hc2NlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9tZXRyaWNzLT55X3NjYWxlICkgKTsKLSAgICAgIHNpemVfbWV0cmljcy0+ZGVzY2VuZGVyID0gRlRfUElYX1JPVU5EKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBmYWNlLT5yb290LmRlc2NlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9tZXRyaWNzLT55X3NjYWxlICkgKTsKLSAgICAgIHNpemVfbWV0cmljcy0+aGVpZ2h0ID0gRlRfUElYX1JPVU5EKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZmFjZS0+cm9vdC5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnlfc2NhbGUgKSApOwotICAgIH0KLQotICAgIHNpemUtPnR0bWV0cmljcy52YWxpZCA9IFRSVUU7Ci0KLSAgICBpZiAoIG9ubHlfaGVpZ2h0ICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIGZhY2UtPmhlYWRlci5GbGFncyAmIDggKQotICAgIHsKLSAgICAgIC8qIGJhc2Ugc2NhbGluZyB2YWx1ZXMgb24gaW50ZWdlciBwcGVtIHZhbHVlcywgKi8KLSAgICAgIC8qIGFzIG1hbmRhdGVkIGJ5IHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uICAgKi8KLSAgICAgIHNpemVfbWV0cmljcy0+eF9zY2FsZSA9IEZUX0RpdkZpeCggc2l6ZV9tZXRyaWNzLT54X3BwZW0gPDwgNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKLSAgICAgIHNpemVfbWV0cmljcy0+eV9zY2FsZSA9IEZUX0RpdkZpeCggc2l6ZV9tZXRyaWNzLT55X3BwZW0gPDwgNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKLQotICAgICAgc2l6ZV9tZXRyaWNzLT5tYXhfYWR2YW5jZSA9IEZUX1BJWF9ST1VORCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZmFjZS0+cm9vdC5tYXhfYWR2YW5jZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9tZXRyaWNzLT54X3NjYWxlICkgKTsKLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlIG5ldyB0cmFuc2Zvcm1hdGlvbiAqLwotICAgIGlmICggc2l6ZV9tZXRyaWNzLT54X3BwZW0gPj0gc2l6ZV9tZXRyaWNzLT55X3BwZW0gKQotICAgIHsKLSAgICAgIHNpemUtPnR0bWV0cmljcy5zY2FsZSAgID0gc2l6ZV9tZXRyaWNzLT54X3NjYWxlOwotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnBwZW0gICAgPSBzaXplX21ldHJpY3MtPnhfcHBlbTsKLSAgICAgIHNpemUtPnR0bWV0cmljcy54X3JhdGlvID0gMHgxMDAwMEw7Ci0gICAgICBzaXplLT50dG1ldHJpY3MueV9yYXRpbyA9IEZUX0RpdkZpeCggc2l6ZV9tZXRyaWNzLT55X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9tZXRyaWNzLT54X3BwZW0gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpemUtPnR0bWV0cmljcy5zY2FsZSAgID0gc2l6ZV9tZXRyaWNzLT55X3NjYWxlOwotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnBwZW0gICAgPSBzaXplX21ldHJpY3MtPnlfcHBlbTsKLSAgICAgIHNpemUtPnR0bWV0cmljcy54X3JhdGlvID0gRlRfRGl2Rml4KCBzaXplX21ldHJpY3MtPnhfcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnlfcHBlbSApOwotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnlfcmF0aW8gPSAweDEwMDAwTDsKLSAgICB9Ci0KLSAgICBzaXplLT5tZXRyaWNzID0gc2l6ZV9tZXRyaWNzOwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgc2l6ZS0+Y3Z0X3JlYWR5ID0gLTE7Ci0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kcml2ZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgZ2l2ZW4gVHJ1ZVR5cGUgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9kcml2ZXJfaW5pdCggRlRfTW9kdWxlICB0dGRyaXZlciApICAgICAvKiBUVF9Ecml2ZXIgKi8KLSAgewotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpdHRkcml2ZXI7Ci0KLSAgICBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1OwotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uID0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zODsKLSNlbmRpZgotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19NSU5JTUFMCi0gICAgZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uID0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl80MDsKLSNlbmRpZgotCi0jZWxzZSAvKiAhVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICBGVF9VTlVTRUQoIHR0ZHJpdmVyICk7Ci0KLSNlbmRpZiAvKiAhVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kcml2ZXJfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZSBhIGdpdmVuIFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBUcnVlVHlwZSBkcml2ZXIuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2RyaXZlcl9kb25lKCBGVF9Nb2R1bGUgIHR0ZHJpdmVyICkgICAgIC8qIFRUX0RyaXZlciAqLwotICB7Ci0gICAgRlRfVU5VU0VEKCB0dGRyaXZlciApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9zbG90X2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgbmV3IHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90IDo6IEEgaGFuZGxlIHRvIHRoZSBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICByZXR1cm4gRlRfR2x5cGhMb2FkZXJfQ3JlYXRlRXh0cmEoIHNsb3QtPmludGVybmFsLT5sb2FkZXIgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0b2Jqcy5oIGIvc3JjL3RydWV0eXBlL3R0b2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGFjZWU3Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dG9ianMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVFRPQkpTX0hfCi0jZGVmaW5lIFRUT0JKU19IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFRUX0RyaXZlclJlY18qICBUVF9Ecml2ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIGEgZGlyZWN0IHR5cGVkZWYgb2YgRlRfR2x5cGhTbG90LCBhcyB0aGVyZSBpcyBub3RoaW5nICAgICAgKi8KLSAgLyogICAgc3BlY2lmaWMgYWJvdXQgdGhlIFRydWVUeXBlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0dseXBoU2xvdCAgVFRfR2x5cGhTbG90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR3JhcGhpY3NTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIGdyYXBoaWNzIHN0YXRlIHVzZWQgZHVyaW5nIGJ5dGVjb2RlIGludGVycHJldGF0aW9uLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfR3JhcGhpY3NTdGF0ZV8KLSAgewotICAgIEZUX1VTaG9ydCAgICAgIHJwMDsKLSAgICBGVF9VU2hvcnQgICAgICBycDE7Ci0gICAgRlRfVVNob3J0ICAgICAgcnAyOwotCi0gICAgRlRfVW5pdFZlY3RvciAgZHVhbFZlY3RvcjsKLSAgICBGVF9Vbml0VmVjdG9yICBwcm9qVmVjdG9yOwotICAgIEZUX1VuaXRWZWN0b3IgIGZyZWVWZWN0b3I7Ci0KLSAgICBGVF9Mb25nICAgICAgICBsb29wOwotICAgIEZUX0YyNkRvdDYgICAgIG1pbmltdW1fZGlzdGFuY2U7Ci0gICAgRlRfSW50ICAgICAgICAgcm91bmRfc3RhdGU7Ci0KLSAgICBGVF9Cb29sICAgICAgICBhdXRvX2ZsaXA7Ci0gICAgRlRfRjI2RG90NiAgICAgY29udHJvbF92YWx1ZV9jdXRpbjsKLSAgICBGVF9GMjZEb3Q2ICAgICBzaW5nbGVfd2lkdGhfY3V0aW47Ci0gICAgRlRfRjI2RG90NiAgICAgc2luZ2xlX3dpZHRoX3ZhbHVlOwotICAgIEZUX1VTaG9ydCAgICAgIGRlbHRhX2Jhc2U7Ci0gICAgRlRfVVNob3J0ICAgICAgZGVsdGFfc2hpZnQ7Ci0KLSAgICBGVF9CeXRlICAgICAgICBpbnN0cnVjdF9jb250cm9sOwotICAgIC8qIEFjY29yZGluZyB0byBHcmVnIEhpdGNoY29jayBmcm9tIE1pY3Jvc29mdCwgdGhlIGBzY2FuX2NvbnRyb2wnICAgICAqLwotICAgIC8qIHZhcmlhYmxlIGFzIGRvY3VtZW50ZWQgaW4gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gaXMgYSAzMi1iaXQgICAqLwotICAgIC8qIGludGVnZXI7IHRoZSBoaWdoLXdvcmQgcGFydCBob2xkcyB0aGUgU0NBTlRZUEUgdmFsdWUsIHRoZSBsb3ctd29yZCAqLwotICAgIC8qIHBhcnQgdGhlIFNDQU5DVFJMIHZhbHVlLiAgV2Ugc2VwYXJhdGUgaXQgaW50byB0d28gZmllbGRzLiAgICAgICAgICAqLwotICAgIEZUX0Jvb2wgICAgICAgIHNjYW5fY29udHJvbDsKLSAgICBGVF9JbnQgICAgICAgICBzY2FuX3R5cGU7Ci0KLSAgICBGVF9VU2hvcnQgICAgICBnZXAwOwotICAgIEZUX1VTaG9ydCAgICAgIGdlcDE7Ci0gICAgRlRfVVNob3J0ICAgICAgZ2VwMjsKLQotICB9IFRUX0dyYXBoaWNzU3RhdGU7Ci0KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZ2x5cGh6b25lX2RvbmUoIFRUX0dseXBoWm9uZSAgem9uZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2dseXBoem9uZV9uZXcoIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIG1heFBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQgICAgICBtYXhDb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICB6b25lICk7Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRVhFQ1VUSU9OIFNVQlRBQkxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGVzZSBzdWItdGFibGVzIHJlbGF0ZSB0byBpbnN0cnVjdGlvbiBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBUVF9NQVhfQ09ERV9SQU5HRVMgIDMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlcmUgY2FuIG9ubHkgYmUgMyBhY3RpdmUgY29kZSByYW5nZXMgYXQgb25jZTogICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSB0aGUgRm9udCBQcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gdGhlIENWVCBQcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIGEgZ2x5cGgncyBpbnN0cnVjdGlvbnMgc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIFRUX0NvZGVSYW5nZV9UYWdfCi0gIHsKLSAgICB0dF9jb2RlcmFuZ2Vfbm9uZSA9IDAsCi0gICAgdHRfY29kZXJhbmdlX2ZvbnQsCi0gICAgdHRfY29kZXJhbmdlX2N2dCwKLSAgICB0dF9jb2RlcmFuZ2VfZ2x5cGgKLQotICB9IFRUX0NvZGVSYW5nZV9UYWc7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ29kZVJhbmdlXwotICB7Ci0gICAgRlRfQnl0ZSogIGJhc2U7Ci0gICAgRlRfTG9uZyAgIHNpemU7Ci0KLSAgfSBUVF9Db2RlUmFuZ2U7Ci0KLSAgdHlwZWRlZiBUVF9Db2RlUmFuZ2UgIFRUX0NvZGVSYW5nZVRhYmxlW1RUX01BWF9DT0RFX1JBTkdFU107Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZXMgYSBmdW5jdGlvbi9pbnN0cnVjdGlvbiBkZWZpbml0aW9uIHJlY29yZC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0RlZlJlY29yZF8KLSAgewotICAgIEZUX0ludCAgICByYW5nZTsgICAgICAgICAgLyogaW4gd2hpY2ggY29kZSByYW5nZSBpcyBpdCBsb2NhdGVkPyAgICAgKi8KLSAgICBGVF9Mb25nICAgc3RhcnQ7ICAgICAgICAgIC8qIHdoZXJlIGRvZXMgaXQgc3RhcnQ/ICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfTG9uZyAgIGVuZDsgICAgICAgICAgICAvKiB3aGVyZSBkb2VzIGl0IGVuZD8gICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICBvcGM7ICAgICAgICAgICAgLyogZnVuY3Rpb24gIywgb3IgaW5zdHJ1Y3Rpb24gY29kZSAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgYWN0aXZlOyAgICAgICAgIC8qIGlzIGl0IGFjdGl2ZT8gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgIGlubGluZV9kZWx0YTsgICAvKiBpcyBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaW5saW5lIGRlbHRhPyAqLwotICAgIEZUX1VMb25nICBzcGhfZmRlZl9mbGFnczsgLyogZmxhZ3MgdG8gaWRlbnRpZnkgc3BlY2lhbCBmdW5jdGlvbnMgICAgKi8KLQotICB9IFRUX0RlZlJlY29yZCwgKlRUX0RlZkFycmF5OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdWJnbHlwaCB0cmFuc2Zvcm1hdGlvbiByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9UcmFuc2Zvcm1fCi0gIHsKLSAgICBGVF9GaXhlZCAgICB4eCwgeHk7ICAgICAvKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggY29lZmZpY2llbnRzICovCi0gICAgRlRfRml4ZWQgICAgeXgsIHl5OwotICAgIEZUX0YyNkRvdDYgIG94LCBveTsgICAgIC8qIG9mZnNldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICB9IFRUX1RyYW5zZm9ybTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBub3RlIHJlZ2FyZGluZyBub24tc3F1YXJlZCBwaXhlbHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAoVGhpcyB0ZXh0IHdpbGwgcHJvYmFibHkgZ28gaW50byBzb21lIGRvY3MgYXQgc29tZSB0aW1lOyBmb3Igbm93LCBpdCAgKi8KLSAgLyogaXMga2VwdCBoZXJlIHRvIGV4cGxhaW4gc29tZSBkZWZpbml0aW9ucyBpbiB0aGUgVFRfU2l6ZV9NZXRyaWNzICAgICAgICovCi0gIC8qIHJlY29yZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIENWVCBpcyBhIG9uZS1kaW1lbnNpb25hbCBhcnJheSBjb250YWluaW5nIHZhbHVlcyB0aGF0IGNvbnRyb2wgICAgICovCi0gIC8qIGNlcnRhaW4gaW1wb3J0YW50IGNoYXJhY3RlcmlzdGljcyBpbiBhIGZvbnQsIGxpa2UgdGhlIGhlaWdodCBvZiBhbGwgICAqLwotICAvKiBjYXBpdGFscywgYWxsIGxvd2VyY2FzZSBsZXR0ZXIsIGRlZmF1bHQgc3BhY2luZyBvciBzdGVtIHdpZHRoL2hlaWdodC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgZm91bmQgaW4gRlVuaXRzIGluIHRoZSBmb250IGZpbGUsIGFuZCBtdXN0IGJlIHNjYWxlZCAqLwotICAvKiB0byBwaXhlbCBjb29yZGluYXRlcyBiZWZvcmUgYmVpbmcgdXNlZCBieSB0aGUgQ1ZUIGFuZCBnbHlwaCBwcm9ncmFtcy4gKi8KLSAgLyogVW5mb3J0dW5hdGVseSwgd2hlbiB1c2luZyBkaXN0aW5jdCB4IGFuZCB5IHJlc29sdXRpb25zIChvciBkaXN0aW5jdCB4ICovCi0gIC8qIGFuZCB5IHBvaW50c2l6ZXMpLCB0aGVyZSBhcmUgdHdvIHBvc3NpYmxlIHNjYWxpbmdzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBmaXJzdCB0cnkgd2FzIHRvIGltcGxlbWVudCBhIGBsYXp5JyBzY2hlbWUgd2hlcmUgYWxsIHZhbHVlcyB3ZXJlICAgICovCi0gIC8qIHNjYWxlZCB3aGVuIGZpcnN0IHVzZWQuICBIb3dldmVyLCB3aGlsZSBzb21lIHZhbHVlcyBhcmUgYWx3YXlzIHVzZWQgICAqLwotICAvKiBpbiB0aGUgc2FtZSBkaXJlY3Rpb24sIHNvbWUgb3RoZXJzIGFyZSB1c2VkIHVuZGVyIG1hbnkgZGlmZmVyZW50ICAgICAgKi8KLSAgLyogY2lyY3Vtc3RhbmNlcyBhbmQgb3JpZW50YXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJIGhhdmUgZm91bmQgYSBzaW1wbGVyIHdheSB0byBkbyB0aGUgc2FtZSwgYW5kIGl0IGV2ZW4gc2VlbXMgdG8gd29yayAgKi8KLSAgLyogaW4gbW9zdCBvZiB0aGUgY2FzZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEFsbCBDVlQgdmFsdWVzIGFyZSBzY2FsZWQgdG8gdGhlIG1heGltdW0gcHBlbSBzaXplLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gV2hlbiBwZXJmb3JtaW5nIGEgcmVhZCBvciB3cml0ZSBpbiB0aGUgQ1ZULCBhIHJhdGlvIGZhY3RvciBpcyB1c2VkICAqLwotICAvKiAgIHRvIHBlcmZvcm0gYWRlcXVhdGUgc2NhbGluZy4gIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB4X3BwZW0gPSAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgeV9wcGVtID0gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgV2UgY2hvb3NlIHBwZW0gPSB4X3BwZW0gPSAxNCBhcyB0aGUgQ1ZUIHNjYWxpbmcgc2l6ZS4gIEFsbCBjdnQgICAgICAqLwotICAvKiAgIGVudHJpZXMgYXJlIHNjYWxlZCB0byBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB4X3JhdGlvID0gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgeV9yYXRpbyA9IHlfcHBlbS9wcGVtICg8IDEuMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgV2UgY29tcHV0ZSB0aGUgY3VycmVudCByYXRpbyBsaWtlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIElmIHByb2pWZWN0b3IgaXMgaG9yaXpvbnRhbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHJhdGlvID0geF9yYXRpbyA9IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIGlmIHByb2pWZWN0b3IgaXMgdmVydGljYWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHJhdGlvID0geV9yYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIGVsc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHJhdGlvID0gc3FydCggKHByb2oueCAqIHhfcmF0aW8pIF4gMiArIChwcm9qLnkgKiB5X3JhdGlvKSBeIDIgKSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBSZWFkaW5nIGEgY3Z0IHZhbHVlIHJldHVybnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICByYXRpbyAqIGN2dFtpbmRleF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBXcml0aW5nIGEgY3Z0IHZhbHVlIGluIHBpeGVsczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjdnRbaW5kZXhdIC8gcmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgY3VycmVudCBwcGVtIGlzIHNpbXBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICByYXRpbyAqIHBwZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1ldHJpY3MgdXNlZCBieSB0aGUgVHJ1ZVR5cGUgc2l6ZSBhbmQgY29udGV4dCBvYmplY3RzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NpemVfTWV0cmljc18KLSAgewotICAgIC8qIGZvciBub24tc3F1YXJlIHBpeGVscyAqLwotICAgIEZUX0xvbmcgICAgIHhfcmF0aW87Ci0gICAgRlRfTG9uZyAgICAgeV9yYXRpbzsKLQotICAgIEZUX1VTaG9ydCAgIHBwZW07ICAgICAgICAgICAgICAgLyogbWF4aW11bSBwcGVtIHNpemUgICAgICAgICAgICAgICovCi0gICAgRlRfTG9uZyAgICAgcmF0aW87ICAgICAgICAgICAgICAvKiBjdXJyZW50IHJhdGlvICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9GaXhlZCAgICBzY2FsZTsKLQotICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbnNbNF07ICAgLyogZGV2aWNlLXNwZWNpZmljIGNvbXBlbnNhdGlvbnMgICovCi0KLSAgICBGVF9Cb29sICAgICB2YWxpZDsKLQotICAgIEZUX0Jvb2wgICAgIHJvdGF0ZWQ7ICAgICAgICAgICAgLyogYGlzIHRoZSBnbHlwaCByb3RhdGVkPyctZmxhZyAgICovCi0gICAgRlRfQm9vbCAgICAgc3RyZXRjaGVkOyAgICAgICAgICAvKiBgaXMgdGhlIGdseXBoIHN0cmV0Y2hlZD8nLWZsYWcgKi8KLQotICB9IFRUX1NpemVfTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgc2l6ZSBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU2l6ZVJlY18KLSAgewotICAgIEZUX1NpemVSZWMgICAgICAgICByb290OwotCi0gICAgLyogd2UgaGF2ZSBvdXIgb3duIGNvcHkgb2YgbWV0cmljcyBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgKi8KLSAgICAvKiBpdCB3aXRob3V0IGFmZmVjdGluZyBhdXRvLWhpbnRpbmcgKHdoZW4gdXNlZCkgICAgICAgICAqLwotICAgIEZUX1NpemVfTWV0cmljcyogICBtZXRyaWNzOyAgICAgICAgLyogZm9yIHRoZSBjdXJyZW50IHJlbmRlcmluZyBtb2RlICovCi0gICAgRlRfU2l6ZV9NZXRyaWNzICAgIGhpbnRlZF9tZXRyaWNzOyAvKiBmb3IgdGhlIGhpbnRlZCByZW5kZXJpbmcgbW9kZSAgKi8KLQotICAgIFRUX1NpemVfTWV0cmljcyAgICB0dG1ldHJpY3M7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgc3RyaWtlX2luZGV4OyAgICAgIC8qIDB4RkZGRkZGRkYgdG8gaW5kaWNhdGUgaW52YWxpZCAqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICBGVF9Mb25nICAgICAgICAgICAgcG9pbnRfc2l6ZTsgICAgLyogZm9yIHRoZSBgTVBTJyBieXRlY29kZSBpbnN0cnVjdGlvbiAqLwotCi0gICAgRlRfVUludCAgICAgICAgICAgIG51bV9mdW5jdGlvbl9kZWZzOyAvKiBudW1iZXIgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgbWF4X2Z1bmN0aW9uX2RlZnM7Ci0gICAgVFRfRGVmQXJyYXkgICAgICAgIGZ1bmN0aW9uX2RlZnM7ICAgICAvKiB0YWJsZSBvZiBmdW5jdGlvbiBkZWZpbml0aW9ucyAgKi8KLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1faW5zdHJ1Y3Rpb25fZGVmczsgIC8qIG51bWJlciBvZiBpbnMuIGRlZmluaXRpb25zICovCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heF9pbnN0cnVjdGlvbl9kZWZzOwotICAgIFRUX0RlZkFycmF5ICAgICAgICBpbnN0cnVjdGlvbl9kZWZzOyAgICAgIC8qIHRhYmxlIG9mIGlucy4gZGVmaW5pdGlvbnMgICovCi0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbWF4X2Z1bmM7Ci0gICAgRlRfVUludCAgICAgICAgICAgIG1heF9pbnM7Ci0KLSAgICBUVF9Db2RlUmFuZ2VUYWJsZSAgY29kZVJhbmdlVGFibGU7Ci0KLSAgICBUVF9HcmFwaGljc1N0YXRlICAgR1M7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgY3Z0X3NpemU7ICAgICAgLyogdGhlIHNjYWxlZCBjb250cm9sIHZhbHVlIHRhYmxlICovCi0gICAgRlRfTG9uZyogICAgICAgICAgIGN2dDsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgICBzdG9yYWdlX3NpemU7IC8qIFRoZSBzdG9yYWdlIGFyZWEgaXMgbm93IHBhcnQgb2YgKi8KLSAgICBGVF9Mb25nKiAgICAgICAgICAgc3RvcmFnZTsgICAgICAvKiB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBUVF9HbHlwaFpvbmVSZWMgICAgdHdpbGlnaHQ7ICAgICAvKiBUaGUgaW5zdGFuY2UncyB0d2lsaWdodCB6b25lICAgICovCi0KLSAgICBUVF9FeGVjQ29udGV4dCAgICAgY29udGV4dDsKLQotICAgIC8qIGlmIG5lZ2F0aXZlLCBgZnBnbScgKHJlc3AuIGBwcmVwJyksIHdhc24ndCBleGVjdXRlZCB5ZXQ7ICovCi0gICAgLyogb3RoZXJ3aXNlIGl0IGlzIHRoZSByZXR1cm5lZCBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9FcnJvciAgICAgICAgICAgYnl0ZWNvZGVfcmVhZHk7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGN2dF9yZWFkeTsKLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gIH0gVFRfU2l6ZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgZHJpdmVyIGNsYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfRHJpdmVyUmVjXwotICB7Ci0gICAgRlRfRHJpdmVyUmVjICByb290OwotCi0gICAgVFRfR2x5cGhab25lUmVjICB6b25lOyAgICAgLyogZ2x5cGggbG9hZGVyIHBvaW50cyB6b25lICovCi0KLSAgICBGVF9VSW50ICBpbnRlcnByZXRlcl92ZXJzaW9uOwotCi0gIH0gVFRfRHJpdmVyUmVjOwotCi0KLSAgLyogTm90ZTogQWxsIG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgKGV4Y2VwdCB0dF9zaXplX3Jlc2V0KCkpIGFyZSB1c2VkICAgICovCi0gIC8qIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGluIGEgRlRfRHJpdmVyX0NsYXNzUmVjLiAgVGhlcmVmb3JlIHRoZWlyICAgICAgICAqLwotICAvKiBwYXJhbWV0ZXJzIGFyZSBvZiB0eXBlcyBGVF9GYWNlLCBGVF9TaXplLCBldGMuLCByYXRoZXIgdGhhbiBUVF9GYWNlLCAgKi8KLSAgLyogVFRfU2l6ZSwgZXRjLiwgc28gdGhhdCB0aGUgY29tcGlsZXIgY2FuIGNvbmZpcm0gdGhhdCB0aGUgdHlwZXMgYW5kICAgICovCi0gIC8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0LiAgSW4gYWxsIGNhc2VzIHRoZSBGVF94eHggdHlwZXMgYXJlICAqLwotICAvKiBjYXN0IHRvIHRoZWlyIFRUX3h4eCBjb3VudGVycGFydHMgaW5zaWRlIHRoZSBmdW5jdGlvbnMgc2luY2UgRnJlZVR5cGUgKi8KLSAgLyogd2lsbCBhbHdheXMgdXNlIHRoZSBUVCBkcml2ZXIgdG8gY3JlYXRlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgdHRmYWNlLCAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2RvbmUoIEZUX0ZhY2UgIHR0ZmFjZSApOyAgICAgICAgICAvKiBUVF9GYWNlICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNpemUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9pbml0KCBGVF9TaXplICB0dHNpemUgKTsgICAgICAgICAgLyogVFRfU2l6ZSAqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfc2l6ZV9kb25lKCBGVF9TaXplICB0dHNpemUgKTsgICAgICAgICAgLyogVFRfU2l6ZSAqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9ydW5fZnBnbSggVFRfU2l6ZSAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgcGVkYW50aWMgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9zaXplX3J1bl9wcmVwKCBUVF9TaXplICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICBwZWRhbnRpYyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUoIFRUX1NpemUgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHBlZGFudGljICk7Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9zaXplX3Jlc2V0KCBUVF9TaXplICBzaXplLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICBvbmx5X2hlaWdodCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEcml2ZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2RyaXZlcl9pbml0KCBGVF9Nb2R1bGUgIHR0ZHJpdmVyICk7ICAgIC8qIFRUX0RyaXZlciAqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgdHRkcml2ZXIgKTsgICAgLyogVFRfRHJpdmVyICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNsb3QgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfc2xvdF9pbml0KCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotCi0gIC8qIGF1eGlsaWFyeSAqLwotI2RlZmluZSBJU19ISU5URUQoIGZsYWdzICkgICggKCBmbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApID09IDAgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFRUT0JKU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0cGljLmMgYi9zcmMvdHJ1ZXR5cGUvdHRwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiZDdlMS4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRwaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHRydWV0eXBlIG1vZHVsZS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAidHRwaWMuaCIKLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gdHRkcml2ZXIuYyAqLwotICBGVF9FcnJvcgotICBGVF9DcmVhdGVfQ2xhc3NfdHRfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICk7Ci0gIHZvaWQKLSAgRlRfRGVzdHJveV9DbGFzc190dF9zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc190dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMoCi0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnNSZWMqICBzdl9tbSApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfdHRfc2VydmljZV90cnVldHlwZV9nbHlmKAotICAgIEZUX1NlcnZpY2VfVFRHbHlmUmVjKiAgc3ZfdHRnbHlmICk7Ci0KLQotICB2b2lkCi0gIHR0X2RyaXZlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnRydWV0eXBlICkKLSAgICB7Ci0gICAgICBUVE1vZHVsZVBJQyogIGNvbnRhaW5lciA9IChUVE1vZHVsZVBJQyopcGljX2NvbnRhaW5lci0+dHJ1ZXR5cGU7Ci0KLQotICAgICAgaWYgKCBjb250YWluZXItPnR0X3NlcnZpY2VzICkKLSAgICAgICAgRlRfRGVzdHJveV9DbGFzc190dF9zZXJ2aWNlcyggbGlicmFyeSwgY29udGFpbmVyLT50dF9zZXJ2aWNlcyApOwotICAgICAgY29udGFpbmVyLT50dF9zZXJ2aWNlcyA9IE5VTEw7Ci0gICAgICBGVF9GUkVFKCBjb250YWluZXIgKTsKLSAgICAgIHBpY19jb250YWluZXItPnRydWV0eXBlID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIHR0X2RyaXZlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciAgICAgICAgID0gRlRfRXJyX09rOwotICAgIFRUTW9kdWxlUElDKiAgICAgICBjb250YWluZXIgICAgID0gTlVMTDsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgLyogYWxsb2NhdGUgcG9pbnRlciwgY2xlYXIgYW5kIHNldCBnbG9iYWwgY29udGFpbmVyIHBvaW50ZXIgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBjb250YWluZXIsIHNpemVvZiAoICpjb250YWluZXIgKSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBGVF9NRU1fU0VUKCBjb250YWluZXIsIDAsIHNpemVvZiAoICpjb250YWluZXIgKSApOwotICAgIHBpY19jb250YWluZXItPnRydWV0eXBlID0gY29udGFpbmVyOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5ICovCi0gICAgLyogZXhwZWN0cyB0aGlzIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZXJyb3IgPSBGVF9DcmVhdGVfQ2xhc3NfdHRfc2VydmljZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXItPnR0X3NlcnZpY2VzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgIEZUX0luaXRfQ2xhc3NfdHRfc2VydmljZV9neF9tdWx0aV9tYXN0ZXJzKAotICAgICAgJmNvbnRhaW5lci0+dHRfc2VydmljZV9neF9tdWx0aV9tYXN0ZXJzICk7Ci0jZW5kaWYKLSAgICBGVF9Jbml0X0NsYXNzX3R0X3NlcnZpY2VfdHJ1ZXR5cGVfZ2x5ZigKLSAgICAgICZjb250YWluZXItPnR0X3NlcnZpY2VfdHJ1ZXR5cGVfZ2x5ZiApOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICB0dF9kcml2ZXJfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRwaWMuaCBiL3NyYy90cnVldHlwZS90dHBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDEwY2Q3Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dHBpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciB0cnVldHlwZSBtb2R1bGUuICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFRUUElDX0hfCi0jZGVmaW5lIFRUUElDX0hfCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgVFRfU0VSVklDRVNfR0VUICAgICAgICAgICAgICAgICAgICB0dF9zZXJ2aWNlcwotI2RlZmluZSBUVF9TRVJWSUNFX0dYX01VTFRJX01BU1RFUlNfR0VUICAgIHR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycwotI2RlZmluZSBUVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19HRVQgIHR0X3NlcnZpY2VfbWV0cmljc192YXJpYXRpb25zCi0jZGVmaW5lIFRUX1NFUlZJQ0VfVFJVRVRZUEVfR0xZRl9HRVQgICAgICAgdHRfc2VydmljZV90cnVldHlwZV9nbHlmCi0jZGVmaW5lIFRUX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQgICAgICAgICAgdHRfc2VydmljZV9wcm9wZXJ0aWVzCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFJVRVRZUEVfR0xZRl9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIHR5cGVkZWYgc3RydWN0ICBUVE1vZHVsZVBJQ18KLSAgewotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgICAgICAgICAgICAgIHR0X3NlcnZpY2VzOwotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyAgICAgICB0dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnM7Ci0gICAgRlRfU2VydmljZV9NZXRyaWNzVmFyaWF0aW9uc1JlYyAgdHRfc2VydmljZV9tZXRyaWNzX3ZhcmlhdGlvbnM7Ci0jZW5kaWYKLSAgICBGVF9TZXJ2aWNlX1RUR2x5ZlJlYyAgICAgICAgICAgICB0dF9zZXJ2aWNlX3RydWV0eXBlX2dseWY7Ci0gICAgRlRfU2VydmljZV9Qcm9wZXJ0aWVzUmVjICAgICAgICAgdHRfc2VydmljZV9wcm9wZXJ0aWVzOwotCi0gIH0gVFRNb2R1bGVQSUM7Ci0KLQotI2RlZmluZSBHRVRfUElDKCBsaWIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKFRUTW9kdWxlUElDKikoKGxpYiktPnBpY19jb250YWluZXIudHJ1ZXR5cGUpICkKLSNkZWZpbmUgVFRfU0VSVklDRVNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnR0X3NlcnZpY2VzICkKLSNkZWZpbmUgVFRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnR0X3NlcnZpY2VfbWV0cmljc192YXJpYXRpb25zICkKLSNkZWZpbmUgVFRfU0VSVklDRV9HWF9NVUxUSV9NQVNURVJTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT50dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMgKQotI2RlZmluZSBUVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnR0X3NlcnZpY2VfdHJ1ZXR5cGVfZ2x5ZiApCi0jZGVmaW5lIFRUX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfc2VydmljZV9wcm9wZXJ0aWVzICkKLQotCi0gIC8qIHNlZSB0dHBpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICB0dF9kcml2ZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICB0dF9kcml2ZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotIC8qICovCi0KLSNlbmRpZiAvKiBUVFBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0cGxvYWQuYyBiL3NyYy90cnVldHlwZS90dHBsb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYWMxNWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0cGxvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUtc3BlY2lmaWMgdGFibGVzIGxvYWRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0KLSNpbmNsdWRlICJ0dHBsb2FkLmgiCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSAidHRneHZhci5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRwbG9hZAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2xvY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgbG9jYXRpb25zIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2xvY2EoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgdGFibGVfbGVuOwotICAgIEZUX0ludCAgICBzaGlmdDsKLQotCi0gICAgLyogd2UgbmVlZCB0aGUgc2l6ZSBvZiB0aGUgYGdseWYnIHRhYmxlIGZvciBtYWxmb3JtZWQgYGxvY2EnIHRhYmxlcyAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19nbHlmLCBzdHJlYW0sICZmYWNlLT5nbHlmX2xlbiApOwotCi0gICAgLyogaXQgaXMgcG9zc2libGUgdGhhdCBhIGZvbnQgZG9lc24ndCBoYXZlIGEgZ2x5ZiB0YWJsZSBhdCBhbGwgKi8KLSAgICAvKiBvciBpdHMgc2l6ZSBpcyB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggRlRfRVJSX0VRKCBlcnJvciwgVGFibGVfTWlzc2luZyApICkKLSAgICB7Ci0gICAgICBmYWNlLT5nbHlmX2xlbiAgICA9IDA7Ci0gICAgICBmYWNlLT5nbHlmX29mZnNldCA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgICAgIGZhY2UtPmdseWZfb2Zmc2V0ID0gMDsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBmYWNlLT5nbHlmX29mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTIoKCAiTG9jYXRpb25zICIgKSk7Ci0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2xvY2EsIHN0cmVhbSwgJnRhYmxlX2xlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIExvY2F0aW9uc19NaXNzaW5nICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBmYWNlLT5oZWFkZXIuSW5kZXhfVG9fTG9jX0Zvcm1hdCAhPSAwICkKLSAgICB7Ci0gICAgICBzaGlmdCA9IDI7Ci0KLSAgICAgIGlmICggdGFibGVfbGVuID49IDB4NDAwMDBMICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggInRhYmxlIHRvbyBsYXJnZVxuIiApKTsKLSAgICAgICAgdGFibGVfbGVuID0gMHgzRkZGRkw7Ci0gICAgICB9Ci0gICAgICBmYWNlLT5udW1fbG9jYXRpb25zID0gdGFibGVfbGVuID4+IHNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hpZnQgPSAxOwotCi0gICAgICBpZiAoIHRhYmxlX2xlbiA+PSAweDIwMDAwTCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJ0YWJsZSB0b28gbGFyZ2VcbiIgKSk7Ci0gICAgICAgIHRhYmxlX2xlbiA9IDB4MUZGRkZMOwotICAgICAgfQotICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyA9IHRhYmxlX2xlbiA+PiBzaGlmdDsKLSAgICB9Ci0KLSAgICBpZiAoIGZhY2UtPm51bV9sb2NhdGlvbnMgIT0gKEZUX1VMb25nKWZhY2UtPnJvb3QubnVtX2dseXBocyArIDEgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJnbHlwaCBjb3VudCBtaXNtYXRjaCEgIGxvY2E6ICVkLCBtYXhwOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9sb2NhdGlvbnMgLSAxLCBmYWNlLT5yb290Lm51bV9nbHlwaHMgKSk7Ci0KLSAgICAgIC8qIHdlIG9ubHkgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGBtYXhwJyBnaXZlcyBhIGxhcmdlciB2YWx1ZSAqLwotICAgICAgaWYgKCBmYWNlLT5udW1fbG9jYXRpb25zIDw9IChGVF9VTG9uZylmYWNlLT5yb290Lm51bV9nbHlwaHMgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgbmV3X2xvY2FfbGVuID0KLSAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUxvbmcpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICsgMSApIDw8IHNoaWZ0OwotCi0gICAgICAgIFRUX1RhYmxlICBlbnRyeSA9IGZhY2UtPmRpcl90YWJsZXM7Ci0gICAgICAgIFRUX1RhYmxlICBsaW1pdCA9IGVudHJ5ICsgZmFjZS0+bnVtX3RhYmxlczsKLQotICAgICAgICBGVF9Mb25nICBwb3MgICA9IChGVF9Mb25nKUZUX1NUUkVBTV9QT1MoKTsKLSAgICAgICAgRlRfTG9uZyAgZGlzdCAgPSAweDdGRkZGRkZGTDsKLSAgICAgICAgRlRfQm9vbCAgZm91bmQgPSAwOwotCi0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8gbmV4dCB0YWJsZSBpbiBmb250IGZpbGUgKi8KLSAgICAgICAgZm9yICggOyBlbnRyeSA8IGxpbWl0OyBlbnRyeSsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0xvbmcgIGRpZmYgPSAoRlRfTG9uZyllbnRyeS0+T2Zmc2V0IC0gcG9zOwotCi0KLSAgICAgICAgICBpZiAoIGRpZmYgPiAwICYmIGRpZmYgPCBkaXN0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkaXN0ICA9IGRpZmY7Ci0gICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhZm91bmQgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogYGxvY2EnIGlzIHRoZSBsYXN0IHRhYmxlICovCi0gICAgICAgICAgZGlzdCA9IChGVF9Mb25nKXN0cmVhbS0+c2l6ZSAtIHBvczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbmV3X2xvY2FfbGVuIDw9IChGVF9VTG9uZylkaXN0ICkKLSAgICAgICAgewotICAgICAgICAgIGZhY2UtPm51bV9sb2NhdGlvbnMgPSAoRlRfVUxvbmcpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICsgMTsKLSAgICAgICAgICB0YWJsZV9sZW4gICAgICAgICAgID0gbmV3X2xvY2FfbGVuOwotCi0gICAgICAgICAgRlRfVFJBQ0UyKCggImFkanVzdGluZyBudW1fbG9jYXRpb25zIHRvICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9sb2NhdGlvbnMgKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmFjZS0+cm9vdC5udW1fZ2x5cGhzID0gZmFjZS0+bnVtX2xvY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlRfTG9uZylmYWNlLT5udW1fbG9jYXRpb25zIC0gMSA6IDA7Ci0KLSAgICAgICAgICBGVF9UUkFDRTIoKCAiYWRqdXN0aW5nIG51bV9nbHlwaHMgdG8gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFeHRyYWN0IHRoZSBmcmFtZS4gIFdlIGRvbid0IG5lZWQgdG8gZGVjb21wcmVzcyBpdCBzaW5jZQotICAgICAqIHdlIGFyZSBhYmxlIHRvIHBhcnNlIGl0IGRpcmVjdGx5LgotICAgICAqLwotICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggdGFibGVfbGVuLCBmYWNlLT5nbHlwaF9sb2NhdGlvbnMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1VMb25nICkKLSAgdHRfZmFjZV9nZXRfbG9jYXRpb24oIFRUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICphc2l6ZSApCi0gIHsKLSAgICBGVF9VTG9uZyAgcG9zMSwgcG9zMjsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9CeXRlKiAgcF9saW1pdDsKLQotCi0gICAgcG9zMSA9IHBvczIgPSAwOwotCi0gICAgaWYgKCBnaW5kZXggPCBmYWNlLT5udW1fbG9jYXRpb25zICkKLSAgICB7Ci0gICAgICBpZiAoIGZhY2UtPmhlYWRlci5JbmRleF9Ub19Mb2NfRm9ybWF0ICE9IDAgKQotICAgICAgewotICAgICAgICBwICAgICAgID0gZmFjZS0+Z2x5cGhfbG9jYXRpb25zICsgZ2luZGV4ICogNDsKLSAgICAgICAgcF9saW1pdCA9IGZhY2UtPmdseXBoX2xvY2F0aW9ucyArIGZhY2UtPm51bV9sb2NhdGlvbnMgKiA0OwotCi0gICAgICAgIHBvczEgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIHBvczIgPSBwb3MxOwotCi0gICAgICAgIGlmICggcCArIDQgPD0gcF9saW1pdCApCi0gICAgICAgICAgcG9zMiA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcCAgICAgICA9IGZhY2UtPmdseXBoX2xvY2F0aW9ucyArIGdpbmRleCAqIDI7Ci0gICAgICAgIHBfbGltaXQgPSBmYWNlLT5nbHlwaF9sb2NhdGlvbnMgKyBmYWNlLT5udW1fbG9jYXRpb25zICogMjsKLQotICAgICAgICBwb3MxID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgcG9zMiA9IHBvczE7Ci0KLSAgICAgICAgaWYgKCBwICsgMiA8PSBwX2xpbWl0ICkKLSAgICAgICAgICBwb3MyID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICBwb3MxIDw8PSAxOwotICAgICAgICBwb3MyIDw8PSAxOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIENoZWNrIGJyb2tlbiBsb2NhdGlvbiBkYXRhLiAqLwotICAgIGlmICggcG9zMSA+IGZhY2UtPmdseWZfbGVuICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAidHRfZmFjZV9nZXRfbG9jYXRpb246IgotICAgICAgICAgICAgICAgICAgIiB0b28gbGFyZ2Ugb2Zmc2V0ICgweCUwOGx4KSBmb3VuZCBmb3IgZ2x5cGggaW5kZXggJWxkLFxuIgotICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICIgZXhjZWVkaW5nIHRoZSBlbmQgb2YgYGdseWYnIHRhYmxlICgweCUwOGx4KVxuIiwKLSAgICAgICAgICAgICAgICAgIHBvczEsIGdpbmRleCwgZmFjZS0+Z2x5Zl9sZW4gKSk7Ci0gICAgICAqYXNpemUgPSAwOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCBwb3MyID4gZmFjZS0+Z2x5Zl9sZW4gKQotICAgIHsKLSAgICAgIC8qIFdlIHRyeSB0byBzYW5pdGl6ZSB0aGUgbGFzdCBgbG9jYScgZW50cnkuICovCi0gICAgICBpZiAoIGdpbmRleCA9PSBmYWNlLT5udW1fbG9jYXRpb25zIC0gMSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMSgoICJ0dF9mYWNlX2dldF9sb2NhdGlvbjoiCi0gICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIG9mZnNldCAoMHglMDhseCkgZm91bmQgZm9yIGdseXBoIGluZGV4ICVsZCxcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAgIiB0cnVuY2F0aW5nIGF0IHRoZSBlbmQgb2YgYGdseWYnIHRhYmxlICgweCUwOGx4KVxuIiwKLSAgICAgICAgICAgICAgICAgICAgcG9zMiwgZ2luZGV4ICsgMSwgZmFjZS0+Z2x5Zl9sZW4gKSk7Ci0gICAgICAgIHBvczIgPSBmYWNlLT5nbHlmX2xlbjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UxKCggInR0X2ZhY2VfZ2V0X2xvY2F0aW9uOiIKLSAgICAgICAgICAgICAgICAgICAgIiB0b28gbGFyZ2Ugb2Zmc2V0ICgweCUwOGx4KSBmb3VuZCBmb3IgZ2x5cGggaW5kZXggJWxkLFxuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAiIGV4Y2VlZGluZyB0aGUgZW5kIG9mIGBnbHlmJyB0YWJsZSAoMHglMDhseClcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBvczIsIGdpbmRleCArIDEsIGZhY2UtPmdseWZfbGVuICkpOwotICAgICAgICAqYXNpemUgPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUaGUgYGxvY2EnIHRhYmxlIG11c3QgYmUgb3JkZXJlZDsgaXQgcmVmZXJzIHRvIHRoZSBsZW5ndGggb2YgKi8KLSAgICAvKiBhbiBlbnRyeSBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCB0aGUgbmV4dCAgKi8KLSAgICAvKiBwb3NpdGlvbi4gIEhvd2V2ZXIsIHRoZXJlIGRvIGV4aXN0IChtYWxmb3JtZWQpIGZvbnRzIHdoaWNoICAgKi8KLSAgICAvKiBkb24ndCBvYmV5IHRoaXMgcnVsZSwgc28gd2UgYXJlIG9ubHkgYWJsZSB0byBwcm92aWRlIGFuICAgICAgKi8KLSAgICAvKiB1cHBlciBib3VuZCBmb3IgdGhlIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBXZSBnZXQgKGludGVudGlvbmFsbHkpIGEgd3JvbmcsIG5vbi16ZXJvIHJlc3VsdCBpbiBjYXNlIHRoZSAgKi8KLSAgICAvKiBgZ2x5ZicgdGFibGUgaXMgbWlzc2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIHBvczIgPj0gcG9zMSApCi0gICAgICAqYXNpemUgPSAoRlRfVUludCkoIHBvczIgLSBwb3MxICk7Ci0gICAgZWxzZQotICAgICAgKmFzaXplID0gKEZUX1VJbnQpKCBmYWNlLT5nbHlmX2xlbiAtIHBvczEgKTsKLQotICAgIHJldHVybiBwb3MxOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0dF9mYWNlX2RvbmVfbG9jYSggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0KLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT5nbHlwaF9sb2NhdGlvbnMgKTsKLSAgICBmYWNlLT5udW1fbG9jYXRpb25zID0gMDsKLSAgfQotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfY3Z0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfY3Z0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX1VMb25nICAgdGFibGVfbGVuOwotCi0KLSAgICBGVF9UUkFDRTIoKCAiQ1ZUICIgKSk7Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfY3Z0LCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiaXMgbWlzc2luZ1xuIiApKTsKLQotICAgICAgZmFjZS0+Y3Z0X3NpemUgPSAwOwotICAgICAgZmFjZS0+Y3Z0ICAgICAgPSBOVUxMOwotICAgICAgZXJyb3IgICAgICAgICAgPSBGVF9FcnJfT2s7Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBmYWNlLT5jdnRfc2l6ZSA9IHRhYmxlX2xlbiAvIDI7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggZmFjZS0+Y3Z0LCBmYWNlLT5jdnRfc2l6ZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGZhY2UtPmN2dF9zaXplICogMkwgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB7Ci0gICAgICBGVF9TaG9ydCogIGN1ciAgID0gZmFjZS0+Y3Z0OwotICAgICAgRlRfU2hvcnQqICBsaW1pdCA9IGN1ciArIGZhY2UtPmN2dF9zaXplOwotCi0KLSAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgICAgKmN1ciA9IEZUX0dFVF9TSE9SVCgpOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgIGlmICggZmFjZS0+ZG9ibGVuZCApCi0gICAgICBlcnJvciA9IHR0X2ZhY2VfdmFyeV9jdnQoIGZhY2UsIHN0cmVhbSApOwotI2VuZGlmCi0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSNlbHNlIC8qICFUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgIEZUX1VOVVNFRCggZmFjZSAgICk7Ci0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSNlbmRpZgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfZnBnbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBmb250IHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZnBnbSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgRlRfVUxvbmcgIHRhYmxlX2xlbjsKLQotCi0gICAgRlRfVFJBQ0UyKCggIkZvbnQgcHJvZ3JhbSAiICkpOwotCi0gICAgLyogVGhlIGZvbnQgcHJvZ3JhbSBpcyBvcHRpb25hbCAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19mcGdtLCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBmYWNlLT5mb250X3Byb2dyYW0gICAgICA9IE5VTEw7Ci0gICAgICBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSA9IDA7Ci0gICAgICBlcnJvciAgICAgICAgICAgICAgICAgICA9IEZUX0Vycl9PazsKLQotICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmdcbiIgKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSA9IHRhYmxlX2xlbjsKLSAgICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggdGFibGVfbGVuLCBmYWNlLT5mb250X3Byb2dyYW0gKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfVFJBQ0UyKCggImxvYWRlZCwgJTEyZCBieXRlc1xuIiwgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgKSk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0jZWxzZSAvKiAhVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICBGVF9VTlVTRUQoIGZhY2UgICApOwotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX3ByZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgY3Z0IHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3ByZXAoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX1VMb25nICB0YWJsZV9sZW47Ci0KLQotICAgIEZUX1RSQUNFMigoICJQcmVwIHByb2dyYW0gIiApKTsKLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19wcmVwLCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBmYWNlLT5jdnRfcHJvZ3JhbSAgICAgID0gTlVMTDsKLSAgICAgIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgPSAwOwotICAgICAgZXJyb3IgICAgICAgICAgICAgICAgICA9IEZUX0Vycl9PazsKLQotICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmdcbiIgKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmYWNlLT5jdnRfcHJvZ3JhbV9zaXplID0gdGFibGVfbGVuOwotICAgICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCB0YWJsZV9sZW4sIGZhY2UtPmN2dF9wcm9ncmFtICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1RSQUNFMigoICJsb2FkZWQsICUxMmQgYnl0ZXNcbiIsIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgKSk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0jZWxzZSAvKiAhVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICBGVF9VTlVTRUQoIGZhY2UgICApOwotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2hkbXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgYGhkbXgnIHRhYmxlIGludG8gdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9oZG14KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfVUludCAgICBubiwgbnVtX3JlY29yZHM7Ci0gICAgRlRfVUxvbmcgICB0YWJsZV9zaXplLCByZWNvcmRfc2l6ZTsKLSAgICBGVF9CeXRlKiAgIHA7Ci0gICAgRlRfQnl0ZSogICBsaW1pdDsKLQotCi0gICAgLyogdGhpcyB0YWJsZSBpcyBvcHRpb25hbCAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19oZG14LCBzdHJlYW0sICZ0YWJsZV9zaXplICk7Ci0gICAgaWYgKCBlcnJvciB8fCB0YWJsZV9zaXplIDwgOCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCB0YWJsZV9zaXplLCBmYWNlLT5oZG14X3RhYmxlICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcCAgICAgPSBmYWNlLT5oZG14X3RhYmxlOwotICAgIGxpbWl0ID0gcCArIHRhYmxlX3NpemU7Ci0KLSAgICAvKiBHaXZlbiB0aGF0IGBoZG14JyB0YWJsZXMgYXJlIGxvc2luZyBpdHMgaW1wb3J0YW5jZSAoZm9yIGV4YW1wbGUsICovCi0gICAgLyogdmFyaWF0aW9uIGZvbnRzIGludHJvZHVjZWQgaW4gT3BlblR5cGUgMS44IG11c3Qgbm90IGhhdmUgdGhpcyAgICAqLwotICAgIC8qIHRhYmxlKSB3ZSBubyBsb25nZXIgdGVzdCBmb3IgYSBjb3JyZWN0IGB2ZXJzaW9uJyBmaWVsZC4gICAgICAgICAgKi8KLSAgICBwICAgICAgICAgICs9IDI7Ci0gICAgbnVtX3JlY29yZHMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIHJlY29yZF9zaXplID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGFuIGhkbXggZGV2aWNlIHJlY29yZCBpcyB0aGUgKi8KLSAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBnbHlwaHMgKyAyOyB0aGlzIGlzIDB4RkZGRiArIDIsIHRodXMgICAgICAqLwotICAgIC8qIGV4cGxhaW5pbmcgd2h5IGByZWNvcmRfc2l6ZScgaXMgYSBsb25nICh3aGljaCB3ZSByZWFkIGFzICAgICovCi0gICAgLyogdW5zaWduZWQgbG9uZyBmb3IgY29udmVuaWVuY2UpLiAgSW4gcHJhY3RpY2UsIHR3byBieXRlcyBhcmUgKi8KLSAgICAvKiBzdWZmaWNpZW50IHRvIGhvbGQgdGhlIHNpemUgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhlcmUgYXJlIGF0IGxlYXN0IHR3byBmb250cywgSEFOTk9NLUEgYW5kIEhBTk5PTS1CIHZlcnNpb24gKi8KLSAgICAvKiAyLjAgKDIwMDUpLCB3aGljaCBnZXQgdGhpcyB3cm9uZzogVGhlIHVwcGVyIHR3byBieXRlcyBvZiAgICAqLwotICAgIC8qIHRoZSBzaXplIHZhbHVlIGFyZSBzZXQgdG8gMHhGRiBpbnN0ZWFkIG9mIDB4MDAuICBXZSBjYXRjaCAgICovCi0gICAgLyogYW5kIGZpeCB0aGlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGlmICggcmVjb3JkX3NpemUgPj0gMHhGRkZGMDAwMFVMICkKLSAgICAgIHJlY29yZF9zaXplICY9IDB4RkZGRlU7Ci0KLSAgICAvKiBUaGUgbGltaXQgZm9yIGBudW1fcmVjb3JkcycgaXMgYSBoZXVyaXN0aWMgdmFsdWUuICovCi0gICAgaWYgKCBudW1fcmVjb3JkcyA+IDI1NSAgICAgICAgICAgICAgfHwKLSAgICAgICAgICggbnVtX3JlY29yZHMgPiAwICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCByZWNvcmRfc2l6ZSA+IDB4MTAwMDFMIHx8Ci0gICAgICAgICAgICAgcmVjb3JkX3NpemUgPCA0ICAgICAgICApICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggZmFjZS0+aGRteF9yZWNvcmRfc2l6ZXMsIG51bV9yZWNvcmRzICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9yZWNvcmRzOyBubisrICkKLSAgICB7Ci0gICAgICBpZiAoIHAgKyByZWNvcmRfc2l6ZSA+IGxpbWl0ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGZhY2UtPmhkbXhfcmVjb3JkX3NpemVzW25uXSA9IHBbMF07Ci0gICAgICBwICAgICAgICAgICAgICAgICAgICAgICAgICArPSByZWNvcmRfc2l6ZTsKLSAgICB9Ci0KLSAgICBmYWNlLT5oZG14X3JlY29yZF9jb3VudCA9IG5uOwotICAgIGZhY2UtPmhkbXhfdGFibGVfc2l6ZSAgID0gdGFibGVfc2l6ZTsKLSAgICBmYWNlLT5oZG14X3JlY29yZF9zaXplICA9IHJlY29yZF9zaXplOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEZhaWw6Ci0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+aGRteF90YWJsZSApOwotICAgIGZhY2UtPmhkbXhfdGFibGVfc2l6ZSA9IDA7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfaGRteCggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIGZhY2UtPmhkbXhfcmVjb3JkX3NpemVzICk7Ci0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+aGRteF90YWJsZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJldHVybiB0aGUgYWR2YW5jZSB3aWR0aCB0YWJsZSBmb3IgYSBnaXZlbiBwaXhlbCBzaXplIGlmIGl0IGlzIGZvdW5kICAqLwotICAvKiBpbiB0aGUgZm9udCdzIGBoZG14JyB0YWJsZSAoaWYgYW55KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfQnl0ZSogKQotICB0dF9mYWNlX2dldF9kZXZpY2VfbWV0cmljcyggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHBwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBnaW5kZXggKQotICB7Ci0gICAgRlRfVUludCAgIG5uOwotICAgIEZUX0J5dGUqICByZXN1bHQgICAgICA9IE5VTEw7Ci0gICAgRlRfVUxvbmcgIHJlY29yZF9zaXplID0gZmFjZS0+aGRteF9yZWNvcmRfc2l6ZTsKLSAgICBGVF9CeXRlKiAgcmVjb3JkICAgICAgPSBmYWNlLT5oZG14X3RhYmxlICsgODsKLQotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IGZhY2UtPmhkbXhfcmVjb3JkX2NvdW50OyBubisrICkKLSAgICAgIGlmICggZmFjZS0+aGRteF9yZWNvcmRfc2l6ZXNbbm5dID09IHBwZW0gKQotICAgICAgewotICAgICAgICBnaW5kZXggKz0gMjsKLSAgICAgICAgaWYgKCBnaW5kZXggPCByZWNvcmRfc2l6ZSApCi0gICAgICAgICAgcmVzdWx0ID0gcmVjb3JkICsgbm4gKiByZWNvcmRfc2l6ZSArIGdpbmRleDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oIGIvc3JjL3RydWV0eXBlL3R0cGxvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwNzlmMy4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRwbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlLXNwZWNpZmljIHRhYmxlcyBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFRUUExPQURfSF8KLSNkZWZpbmUgVFRQTE9BRF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2xvY2EoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgRlRfTE9DQUwoIEZUX1VMb25nICkKLSAgdHRfZmFjZV9nZXRfbG9jYXRpb24oIFRUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICphc2l6ZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZmFjZV9kb25lX2xvY2EoIFRUX0ZhY2UgIGZhY2UgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfY3Z0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2ZwZ20oIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfcHJlcCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9oZG14KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfaGRteCggVFRfRmFjZSAgZmFjZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0J5dGUqICkKLSAgdHRfZmFjZV9nZXRfZGV2aWNlX21ldHJpY3MoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2luZGV4ICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFRUUExPQURfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dHN1YnBpeC5jIGIvc3JjL3RydWV0eXBlL3R0c3VicGl4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOGNmMDEuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0c3VicGl4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0c3VicGl4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBTdWJwaXhlbCBIaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMC0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfRFJJVkVSX0gKLQotI2luY2x1ZGUgInR0c3VicGl4LmgiCi0KLQotI2lmIGRlZmluZWQoIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiApICAgICAgICAgICAgJiYgXAotICAgIGRlZmluZWQoIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIHJ1bGVzIGFmZmVjdCBob3cgdGhlIFRUIEludGVycHJldGVyIGRvZXMgaGludGluZywgd2l0aCB0aGUgICAgICAqLwotICAvKiBnb2FsIG9mIGRvaW5nIHN1YnBpeGVsIGhpbnRpbmcgYnkgKGluIGdlbmVyYWwpIGlnbm9yaW5nIHggbW92ZXMuICAgICAgKi8KLSAgLyogU29tZSBvZiB0aGVzZSBydWxlcyBhcmUgZml4ZXMgdGhhdCBnbyBhYm92ZSBhbmQgYmV5b25kIHRoZSAgICAgICAgICAgICovCi0gIC8qIHN0YXRlZCB0ZWNobmlxdWVzIGluIHRoZSBNUyB3aGl0ZXBhcGVyIG9uIENsZWFydHlwZSwgZHVlIHRvICAgICAgICAgICAqLwotICAvKiBhcnRpZmFjdHMgaW4gbWFueSBnbHlwaHMuICBTbywgdGhlc2UgcnVsZXMgbWFrZSBzb21lIGdseXBocyByZW5kZXIgICAgKi8KLSAgLyogYmV0dGVyIHRoYW4gdGhleSBkbyBpbiB0aGUgTVMgcmFzdGVyaXplci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAiIiBzdHJpbmcgb3IgMCBpbnQvY2hhciBpbmRpY2F0ZXMgdG8gYXBwbHkgdG8gYWxsIGdseXBocy4gICAgICAgICAgICAgKi8KLSAgLyogIi0iIHVzZWQgYXMgZHVtbXkgcGxhY2Vob2xkZXJzLCBidXQgYW55IG5vbi1tYXRjaGluZyBzdHJpbmcgd29ya3MuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIG9mIHRoaXMgY291bGQgYXJndWFibHkgYmUgaW1wbGVtZW50ZWQgaW4gZm9udGNvbmZpZywgaG93ZXZlcjogICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIEZvbnRjb25maWcgY2FuJ3Qgc2V0IHRoaW5ncyBvbiBhIGdseXBoLWJ5LWdseXBoIGJhc2lzLiAgICAgICAgICAgICAqLwotICAvKiAgLSBUaGUgdHdlYWtzIHRoYXQgaGFwcGVuIGhlcmUgYXJlIHZlcnkgbG93LWxldmVsLCBmcm9tIGFuIGF2ZXJhZ2UgICAgKi8KLSAgLyogICAgdXNlcidzIHBvaW50IG9mIHZpZXcgYW5kIGFyZSBiZXN0IGltcGxlbWVudGVkIGluIHRoZSBoaW50ZXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZ29hbCBpcyB0byBtYWtlIHRoZSBzdWJwaXhlbCBoaW50aW5nIHRlY2huaXF1ZXMgYXMgZ2VuZXJhbGl6ZWQgICAgKi8KLSAgLyogYXMgcG9zc2libGUgYWNyb3NzIGFsbCBmb250cyB0byBwcmV2ZW50IHRoZSBuZWVkIGZvciBleHRyYSBydWxlcyBzdWNoICovCi0gIC8qIGFzIHRoZXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHJ1bGUgc3RydWN0dXJlIGlzIGRlc2lnbmVkIHNvIHRoYXQgZW50aXJlbHkgbmV3IHJ1bGVzIGNhbiBlYXNpbHkgICovCi0gIC8qIGJlIGFkZGVkIHdoZW4gYSBuZXcgY29tcGF0aWJpbGl0eSBmZWF0dXJlIGlzIGRpc2NvdmVyZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHJ1bGUgc3RydWN0dXJlcyBjb3VsZCBhbHNvIHVzZSBzb21lIGVuaGFuY2VtZW50IHRvIGhhbmRsZSByYW5nZXMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgKioqKioqKioqKioqKioqKioqIFdPUksgSU4gUFJPR1JFU1MgKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogVGhlc2UgYXJlIGBjbGFzc2VzJyBvZiBmb250cyB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyIGFuZCB1c2VkIGluICovCi0gIC8qIHJ1bGVzIGJlbG93LiAgQSBibGFuayBlbnRyeSAiIiBpcyByZXF1aXJlZCBhdCB0aGUgZW5kIG9mIHRoZXNlISAgICAgICAqLwotI2RlZmluZSBGQU1JTFlfQ0xBU1NfUlVMRVNfU0laRSAgNwotCi0gIHN0YXRpYyBjb25zdCBTUEhfRm9udF9DbGFzcyAgRkFNSUxZX0NMQVNTX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZBTUlMWV9DTEFTU19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJNUyBMZWdhY3kgRm9udHMiLAotICAgICAgeyAiQWhhcm9uaSIsCi0gICAgICAgICJBbmRhbGUgTW9ubyIsCi0gICAgICAgICJBbmRhbHVzIiwKLSAgICAgICAgIkFuZ3NhbmEgTmV3IiwKLSAgICAgICAgIkFuZ3NhbmFVUEMiLAotICAgICAgICAiQXJhYmljIFRyYW5zcGFyZW50IiwKLSAgICAgICAgIkFyaWFsIEJsYWNrIiwKLSAgICAgICAgIkFyaWFsIE5hcnJvdyIsCi0gICAgICAgICJBcmlhbCBVbmljb2RlIE1TIiwKLSAgICAgICAgIkFyaWFsIiwKLSAgICAgICAgIkJhdGFuZyIsCi0gICAgICAgICJCcm93YWxsaWEgTmV3IiwKLSAgICAgICAgIkJyb3dhbGxpYVVQQyIsCi0gICAgICAgICJDb21pYyBTYW5zIE1TIiwKLSAgICAgICAgIkNvcmRpYSBOZXciLAotICAgICAgICAiQ29yZGlhVVBDIiwKLSAgICAgICAgIkNvdXJpZXIgTmV3IiwKLSAgICAgICAgIkRGS2FpLVNCIiwKLSAgICAgICAgIkRhdmlkIFRyYW5zcGFyZW50IiwKLSAgICAgICAgIkRhdmlkIiwKLSAgICAgICAgIkRpbGxlbmlhVVBDIiwKLSAgICAgICAgIkVzdHJhbmdlbG8gRWRlc3NhIiwKLSAgICAgICAgIkV1Y3Jvc2lhVVBDIiwKLSAgICAgICAgIkZhbmdTb25nX0dCMjMxMiIsCi0gICAgICAgICJGaXhlZCBNaXJpYW0gVHJhbnNwYXJlbnQiLAotICAgICAgICAiRnJhbmtSdWVobCIsCi0gICAgICAgICJGcmFua2xpbiBHb3RoaWMgTWVkaXVtIiwKLSAgICAgICAgIkZyZWVzaWFVUEMiLAotICAgICAgICAiR2FyYW1vbmQiLAotICAgICAgICAiR2F1dGFtaSIsCi0gICAgICAgICJHZW9yZ2lhIiwKLSAgICAgICAgIkd1bGltIiwKLSAgICAgICAgIkltcGFjdCIsCi0gICAgICAgICJJcmlzVVBDIiwKLSAgICAgICAgIkphc21pbmVVUEMiLAotICAgICAgICAiS2FpVGlfR0IyMzEyIiwKLSAgICAgICAgIktvZGNoaWFuZ1VQQyIsCi0gICAgICAgICJMYXRoYSIsCi0gICAgICAgICJMZXZlbmltIE1UIiwKLSAgICAgICAgIkxpbHlVUEMiLAotICAgICAgICAiTHVjaWRhIENvbnNvbGUiLAotICAgICAgICAiTHVjaWRhIFNhbnMgVW5pY29kZSIsCi0gICAgICAgICJNUyBHb3RoaWMiLAotICAgICAgICAiTVMgTWluY2hvIiwKLSAgICAgICAgIk1WIEJvbGkiLAotICAgICAgICAiTWFuZ2FsIiwKLSAgICAgICAgIk1hcmxldHQiLAotICAgICAgICAiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLAotICAgICAgICAiTWluZ2xpdSIsCi0gICAgICAgICJNaXJpYW0gRml4ZWQiLAotICAgICAgICAiTWlyaWFtIFRyYW5zcGFyZW50IiwKLSAgICAgICAgIk1pcmlhbSIsCi0gICAgICAgICJOYXJraXNpbSIsCi0gICAgICAgICJQYWxhdGlubyBMaW5vdHlwZSIsCi0gICAgICAgICJSYWF2aSIsCi0gICAgICAgICJSb2QgVHJhbnNwYXJlbnQiLAotICAgICAgICAiUm9kIiwKLSAgICAgICAgIlNocnV0aSIsCi0gICAgICAgICJTaW1IZWkiLAotICAgICAgICAiU2ltcGxpZmllZCBBcmFiaWMgRml4ZWQiLAotICAgICAgICAiU2ltcGxpZmllZCBBcmFiaWMiLAotICAgICAgICAiU2ltc3VuIiwKLSAgICAgICAgIlN5bGZhZW4iLAotICAgICAgICAiU3ltYm9sIiwKLSAgICAgICAgIlRhaG9tYSIsCi0gICAgICAgICJUaW1lcyBOZXcgUm9tYW4iLAotICAgICAgICAiVHJhZGl0aW9uYWwgQXJhYmljIiwKLSAgICAgICAgIlRyZWJ1Y2hldCBNUyIsCi0gICAgICAgICJUdW5nYSIsCi0gICAgICAgICJWZXJkYW5hIiwKLSAgICAgICAgIldlYmRpbmdzIiwKLSAgICAgICAgIldpbmdkaW5ncyIsCi0gICAgICAgICIiLAotICAgICAgfSwKLSAgICB9LAotICAgIHsgIkNvcmUgTVMgTGVnYWN5IEZvbnRzIiwKLSAgICAgIHsgIkFyaWFsIEJsYWNrIiwKLSAgICAgICAgIkFyaWFsIE5hcnJvdyIsCi0gICAgICAgICJBcmlhbCBVbmljb2RlIE1TIiwKLSAgICAgICAgIkFyaWFsIiwKLSAgICAgICAgIkNvbWljIFNhbnMgTVMiLAotICAgICAgICAiQ291cmllciBOZXciLAotICAgICAgICAiR2FyYW1vbmQiLAotICAgICAgICAiR2VvcmdpYSIsCi0gICAgICAgICJJbXBhY3QiLAotICAgICAgICAiTHVjaWRhIENvbnNvbGUiLAotICAgICAgICAiTHVjaWRhIFNhbnMgVW5pY29kZSIsCi0gICAgICAgICJNaWNyb3NvZnQgU2FucyBTZXJpZiIsCi0gICAgICAgICJQYWxhdGlubyBMaW5vdHlwZSIsCi0gICAgICAgICJUYWhvbWEiLAotICAgICAgICAiVGltZXMgTmV3IFJvbWFuIiwKLSAgICAgICAgIlRyZWJ1Y2hldCBNUyIsCi0gICAgICAgICJWZXJkYW5hIiwKLSAgICAgICAgIiIsCi0gICAgICB9LAotICAgIH0sCi0gICAgeyAiQXBwbGUgTGVnYWN5IEZvbnRzIiwKLSAgICAgIHsgIkdlbmV2YSIsCi0gICAgICAgICJUaW1lcyIsCi0gICAgICAgICJNb25hY28iLAotICAgICAgICAiQ2VudHVyeSIsCi0gICAgICAgICJDaGFsa2JvYXJkIiwKLSAgICAgICAgIkxvYnN0ZXIiLAotICAgICAgICAiQ2VudHVyeSBHb3RoaWMiLAotICAgICAgICAiT3B0aW1hIiwKLSAgICAgICAgIkx1Y2lkYSBHcmFuZGUiLAotICAgICAgICAiR2lsbCBTYW5zIiwKLSAgICAgICAgIkJhc2tlcnZpbGxlIiwKLSAgICAgICAgIkhlbHZldGljYSIsCi0gICAgICAgICJIZWx2ZXRpY2EgTmV1ZSIsCi0gICAgICAgICIiLAotICAgICAgfSwKLSAgICB9LAotICAgIHsgIkxlZ2FjeSBTYW5zIEZvbnRzIiwKLSAgICAgIHsgIkFuZGFsZSBNb25vIiwKLSAgICAgICAgIkFyaWFsIFVuaWNvZGUgTVMiLAotICAgICAgICAiQXJpYWwiLAotICAgICAgICAiQ2VudHVyeSBHb3RoaWMiLAotICAgICAgICAiQ29taWMgU2FucyBNUyIsCi0gICAgICAgICJGcmFua2xpbiBHb3RoaWMgTWVkaXVtIiwKLSAgICAgICAgIkdlbmV2YSIsCi0gICAgICAgICJMdWNpZGEgQ29uc29sZSIsCi0gICAgICAgICJMdWNpZGEgR3JhbmRlIiwKLSAgICAgICAgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLAotICAgICAgICAiTHVjaWRhIFNhbnMgVHlwZXdyaXRlciIsCi0gICAgICAgICJNaWNyb3NvZnQgU2FucyBTZXJpZiIsCi0gICAgICAgICJNb25hY28iLAotICAgICAgICAiVGFob21hIiwKLSAgICAgICAgIlRyZWJ1Y2hldCBNUyIsCi0gICAgICAgICJWZXJkYW5hIiwKLSAgICAgICAgIiIsCi0gICAgICB9LAotICAgIH0sCi0KLSAgICB7ICJNaXNjIExlZ2FjeSBGb250cyIsCi0gICAgICB7ICJEYXJrIENvdXJpZXIiLCAiIiwgfSwgfSwKLSAgICB7ICJWZXJkYW5hIENsb25lcyIsCi0gICAgICB7ICJEZWphVnUgU2FucyIsCi0gICAgICAgICJCaXRzdHJlYW0gVmVyYSBTYW5zIiwgIiIsIH0sIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwKLSAgICAgIHsgIkRlamFWdSBTYW5zIiwKLSAgICAgICAgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLAotICAgICAgICAiVmVyZGFuYSIsICIiLCB9LCB9LAotICB9OwotCi0KLSAgLyogRGVmaW5lIHRoaXMgdG8gZm9yY2UgbmF0dXJhbCAoaS5lLiBub3QgYml0bWFwLWNvbXBhdGlibGUpIHdpZHRocy4gICAgICovCi0gIC8qIFRoZSBkZWZhdWx0IGxlYW5zIHN0cm9uZ2x5IHRvd2FyZHMgbmF0dXJhbCB3aWR0aHMgZXhjZXB0IGZvciBhIGZldyAgICAqLwotICAvKiBsZWdhY3kgZm9udHMgd2hlcmUgYSBzZWxlY3RpdmUgY29tYmluYXRpb24gcHJvZHVjZXMgbmljZXIgcmVzdWx0cy4gICAgKi8KLS8qICNkZWZpbmUgRk9SQ0VfTkFUVVJBTF9XSURUSFMgICAqLwotCi0KLSAgLyogRGVmaW5lIGBjbGFzc2VzJyBvZiBzdHlsZXMgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBhbmQgdXNlZCBpbiAgICovCi0gIC8qIHJ1bGVzIGJlbG93LiAgQSBibGFuayBlbnRyeSAiIiBpcyByZXF1aXJlZCBhdCB0aGUgZW5kIG9mIHRoZXNlISAgICAgICAqLwotI2RlZmluZSBTVFlMRV9DTEFTU19SVUxFU19TSVpFICA1Ci0KLSAgc3RhdGljIGNvbnN0IFNQSF9Gb250X0NsYXNzICBTVFlMRV9DTEFTU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTVFlMRV9DTEFTU19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJSZWd1bGFyIENsYXNzIiwKLSAgICAgIHsgIlJlZ3VsYXIiLAotICAgICAgICAiQm9vayIsCi0gICAgICAgICJNZWRpdW0iLAotICAgICAgICAiUm9tYW4iLAotICAgICAgICAiTm9ybWFsIiwKLSAgICAgICAgIiIsCi0gICAgICB9LAotICAgIH0sCi0gICAgeyAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLAotICAgICAgeyAiUmVndWxhciIsCi0gICAgICAgICJCb29rIiwKLSAgICAgICAgIk1lZGl1bSIsCi0gICAgICAgICJJdGFsaWMiLAotICAgICAgICAiT2JsaXF1ZSIsCi0gICAgICAgICJSb21hbiIsCi0gICAgICAgICJOb3JtYWwiLAotICAgICAgICAiIiwKLSAgICAgIH0sCi0gICAgfSwKLSAgICB7ICJCb2xkL0JvbGRJdGFsaWMgQ2xhc3MiLAotICAgICAgeyAiQm9sZCIsCi0gICAgICAgICJCb2xkIEl0YWxpYyIsCi0gICAgICAgICJCbGFjayIsCi0gICAgICAgICIiLAotICAgICAgfSwKLSAgICB9LAotICAgIHsgIkJvbGQvSXRhbGljL0JvbGRJdGFsaWMgQ2xhc3MiLAotICAgICAgeyAiQm9sZCIsCi0gICAgICAgICJCb2xkIEl0YWxpYyIsCi0gICAgICAgICJCbGFjayIsCi0gICAgICAgICJJdGFsaWMiLAotICAgICAgICAiT2JsaXF1ZSIsCi0gICAgICAgICIiLAotICAgICAgfSwKLSAgICB9LAotICAgIHsgIlJlZ3VsYXIvQm9sZCBDbGFzcyIsCi0gICAgICB7ICJSZWd1bGFyIiwKLSAgICAgICAgIkJvb2siLAotICAgICAgICAiTWVkaXVtIiwKLSAgICAgICAgIk5vcm1hbCIsCi0gICAgICAgICJSb21hbiIsCi0gICAgICAgICJCb2xkIiwKLSAgICAgICAgIkJsYWNrIiwKLSAgICAgICAgIiIsCi0gICAgICB9LAotICAgIH0sCi0gIH07Ci0KLQotICAvKiBGb3JjZSBzcGVjaWFsIGxlZ2FjeSBmaXhlcyBmb3IgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ09NUEFUSUJJTElUWV9NT0RFX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgQ09NUEFUSUJJTElUWV9NT0RFX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQ09NUEFUSUJJTElUWV9NT0RFX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIlZlcmRhbmEgQ2xvbmVzIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIERvbid0IGRvIHN1YnBpeGVsIChpZ25vcmVfeF9tb2RlKSBoaW50aW5nOyBkbyBub3JtYWwgaGludGluZy4gICAgICAgICAqLwotI2RlZmluZSBQSVhFTF9ISU5USU5HX1JVTEVTX1NJWkUgIDIKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgUElYRUxfSElOVElOR19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1BJWEVMX0hJTlRJTkdfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogdGhlc2UgY2hhcmFjdGVycyBhcmUgYWxtb3N0IGFsd2F5cyBzYWZlICovCi0gICAgeyAiQ291cmllciBOZXciLCAxMiwgIkl0YWxpYyIsICd6JyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTEsICJJdGFsaWMiLCAneicgfSwKLSAgfTsKLQotCi0gIC8qIFN1YnBpeGVsIGhpbnRpbmcgaWdub3JlcyBTSFBJWCBydWxlcyBvbiBYLiAgRm9yY2UgU0hQSVggZm9yIHRoZXNlLiAgICAqLwotI2RlZmluZSBET19TSFBJWF9SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIERPX1NIUElYX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRE9fU0hQSVhfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgeyAiLSIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBTa2lwIFkgbW92ZXMgdGhhdCBzdGFydCB3aXRoIGEgcG9pbnQgdGhhdCBpcyBub3Qgb24gYSBZIHBpeGVsICAgICAgICAgKi8KLSAgLyogYm91bmRhcnkgYW5kIGRvbid0IG1vdmUgdGhhdCBwb2ludCB0byBhIFkgcGl4ZWwgYm91bmRhcnkuICAgICAgICAgICAgICovCi0jZGVmaW5lIFNLSVBfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFICA0Ci0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfTk9OUElYRUxfWV9NT1ZFU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NLSVBfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICAvKiBmaXggdnd4eXogdGhpbm5lc3MqLwotICAgIHsgIkNvbnNvbGFzIiwgMCwgIiIsIDAgfSwKLSAgICAvKiBGaXggdGhpbiBtaWRkbGUgc3RlbXMgKi8KLSAgICB7ICJDb3JlIE1TIExlZ2FjeSBGb250cyIsIDAsICJSZWd1bGFyIiwgMCB9LAotICAgIC8qIEN5cmlsbGljIHNtYWxsIGxldHRlciBJICovCi0gICAgeyAiTGVnYWN5IFNhbnMgRm9udHMiLCAwLCAiIiwgMCB9LAotICAgIC8qIEZpeCBhcnRpZmFjdHMgd2l0aCBzb21lIFJlZ3VsYXIgJiBCb2xkICovCi0gICAgeyAiVmVyZGFuYSBDbG9uZXMiLCAwLCAiIiwgMCB9LAotICB9OwotCi0KLSNkZWZpbmUgU0tJUF9OT05QSVhFTF9ZX01PVkVTX1JVTEVTX0VYQ0VQVElPTlNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBTS0lQX05PTlBJWEVMX1lfTU9WRVNfUnVsZXNfRXhjZXB0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NLSVBfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19FWENFUFRJT05TX1NJWkVdID0KLSAgewotICAgIC8qIEZpeGVzIDwgYW5kID4gKi8KLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICJSZWd1bGFyIiwgMCB9LAotICB9OwotCi0KLSAgLyogU2tpcCBZIG1vdmVzIHRoYXQgc3RhcnQgd2l0aCBhIHBvaW50IHRoYXQgaXMgbm90IG9uIGEgWSBwaXhlbCAgICAgICAgICovCi0gIC8qIGJvdW5kYXJ5IGFuZCBkb24ndCBtb3ZlIHRoYXQgcG9pbnQgdG8gYSBZIHBpeGVsIGJvdW5kYXJ5LiAgICAgICAgICAgICAqLwotI2RlZmluZSBTS0lQX05PTlBJWEVMX1lfTU9WRVNfREVMVEFQX1JVTEVTX1NJWkUgIDIKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUF9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NLSVBfTk9OUElYRUxfWV9NT1ZFU19ERUxUQVBfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogTWFpbnRhaW4gdGhpY2tuZXNzIG9mIGRpYWdvbmFsIGluICdOJyAqLwotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDAsICJSZWd1bGFyL0JvbGQgQ2xhc3MiLCAnTicgfSwKLSAgICB7ICJHZW9yZ2lhIiwgMCwgIlJlZ3VsYXIvQm9sZCBDbGFzcyIsICdOJyB9LAotICB9OwotCi0KLSAgLyogU2tpcCBZIG1vdmVzIHRoYXQgbW92ZSBhIHBvaW50IG9mZiBhIFkgcGl4ZWwgYm91bmRhcnkuICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNLSVBfT0ZGUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfT0ZGUElYRUxfWV9NT1ZFU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NLSVBfT0ZGUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICItIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0jZGVmaW5lIFNLSVBfT0ZGUElYRUxfWV9NT1ZFU19SVUxFU19FWENFUFRJT05TX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgU0tJUF9PRkZQSVhFTF9ZX01PVkVTX1J1bGVzX0V4Y2VwdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTS0lQX09GRlBJWEVMX1lfTU9WRVNfUlVMRVNfRVhDRVBUSU9OU19TSVpFXSA9Ci0gIHsKLSAgICB7ICItIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIFJvdW5kIG1vdmVzIHRoYXQgZG9uJ3QgbW92ZSBhIHBvaW50IHRvIGEgWSBwaXhlbCBib3VuZGFyeS4gICAgICAgICAgICAqLwotI2RlZmluZSBST1VORF9OT05QSVhFTF9ZX01PVkVTX1JVTEVTX1NJWkUgIDIKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JPVU5EX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogRHJvaWQgZm9udCBpbnN0cnVjdGlvbnMgZG9uJ3Qgc25hcCBZIHRvIHBpeGVscyAqLwotICAgIHsgIkRyb2lkIFNhbnMiLCAwLCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAwIH0sCi0gICAgeyAiRHJvaWQgU2FucyBNb25vIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0jZGVmaW5lIFJPVU5EX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfRVhDRVBUSU9OU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFJPVU5EX05PTlBJWEVMX1lfTU9WRVNfUnVsZXNfRXhjZXB0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JPVU5EX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfRVhDRVBUSU9OU19TSVpFXSA9Ci0gIHsKLSAgICB7ICItIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIEFsbG93IGEgRGlyZWN0X01vdmUgYWxvbmcgWCBmcmVlZG9tIHZlY3RvciBpZiBtYXRjaGVkLiAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBTExPV19YX0RNT1ZFX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgQUxMT1dfWF9ETU9WRV9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FMTE9XX1hfRE1PVkVfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogRml4ZXMgdmFuaXNoaW5nIGRpYWdvbmFsIGluIDQgKi8KLSAgICB7ICJWZXJkYW5hIiwgMCwgIlJlZ3VsYXIiLCAnNCcgfSwKLSAgfTsKLQotCi0gIC8qIFJldHVybiBNUyByYXN0ZXJpemVyIHZlcnNpb24gMzUgaWYgbWF0Y2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBSQVNURVJJWkVSXzM1X1JVTEVTX1NJWkUgIDgKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgUkFTVEVSSVpFUl8zNV9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JBU1RFUklaRVJfMzVfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gbWFrZSB0aGVzZSBsb29rIGdvb2QgKi8KLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAwLCAiUmVndWxhciIsICdpJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDAsICJSZWd1bGFyIiwgJ2onIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMCwgIlJlZ3VsYXIiLCAnbScgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAwLCAiUmVndWxhciIsICdyJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDAsICJSZWd1bGFyIiwgJ2EnIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMCwgIlJlZ3VsYXIiLCAnbicgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAwLCAiUmVndWxhciIsICdwJyB9LAotICAgIHsgIlRpbWVzIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIERvbid0IHJvdW5kIHRvIHRoZSBzdWJwaXhlbCBncmlkLiAgUm91bmQgdG8gcGl4ZWwgZ3JpZC4gICAgICAgICAgICAgICAqLwotI2RlZmluZSBOT1JNQUxfUk9VTkRfUlVMRVNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBOT1JNQUxfUk9VTkRfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOT1JNQUxfUk9VTkRfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogRml4IHNlcmlmIHRoaWNrbmVzcyBmb3IgY2VydGFpbiBwcGVtcyAqLwotICAgIC8qIENhbiBwcm9iYWJseSBiZSBnZW5lcmFsaXplZCBzb21laG93ICAgKi8KLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBTa2lwIElVUCBpbnN0cnVjdGlvbnMgaWYgbWF0Y2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0tJUF9JVVBfUlVMRVNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBTS0lQX0lVUF9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NLSVBfSVVQX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIkFyaWFsIiwgMTMsICJSZWd1bGFyIiwgJ2EnIH0sCi0gIH07Ci0KLQotICAvKiBTa2lwIE1JQVAgVHdpbGlnaHQgaGFjayBpZiBtYXRjaGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTUlBUF9IQUNLX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgTUlBUF9IQUNLX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTUlBUF9IQUNLX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIkdlbmV2YSIsIDEyLCAiIiwgMCB9LAotICB9OwotCi0KLSAgLyogU2tpcCBERUxUQVAgaW5zdHJ1Y3Rpb25zIGlmIG1hdGNoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFMV0FZU19TS0lQX0RFTFRBUF9SVUxFU19TSVpFICAyMwotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBBTFdBWVNfU0tJUF9ERUxUQVBfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBTFdBWVNfU0tJUF9ERUxUQVBfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgeyAiR2VvcmdpYSIsIDAsICJSZWd1bGFyIiwgJ2snIH0sCi0gICAgLyogZml4IHZhcmlvdXMgcHJvYmxlbXMgd2l0aCBlIGluIGRpZmZlcmVudCB2ZXJzaW9ucyAqLwotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDE0LCAiUmVndWxhciIsICdlJyB9LAotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDEzLCAiUmVndWxhciIsICdlJyB9LAotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDE1LCAiUmVndWxhciIsICdlJyB9LAotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDAsICJJdGFsaWMiLCAndicgfSwKLSAgICB7ICJUcmVidWNoZXQgTVMiLCAwLCAiSXRhbGljIiwgJ3cnIH0sCi0gICAgeyAiVHJlYnVjaGV0IE1TIiwgMCwgIlJlZ3VsYXIiLCAnWScgfSwKLSAgICB7ICJBcmlhbCIsIDExLCAiUmVndWxhciIsICdzJyB9LAotICAgIC8qIHByZXZlbnQgcHJvYmxlbXMgd2l0aCAnMycgYW5kIG90aGVycyAqLwotICAgIHsgIlZlcmRhbmEiLCAxMCwgIlJlZ3VsYXIiLCAwIH0sCi0gICAgeyAiVmVyZGFuYSIsIDksICJSZWd1bGFyIiwgMCB9LAotICAgIC8qIEN5cmlsbGljIHNtYWxsIGxldHRlciBzaG9ydCBJICovCi0gICAgeyAiTGVnYWN5IFNhbnMgRm9udHMiLCAwLCAiIiwgMHg0MzggfSwKLSAgICB7ICJMZWdhY3kgU2FucyBGb250cyIsIDAsICIiLCAweDQzOSB9LAotICAgIHsgIkFyaWFsIiwgMTAsICJSZWd1bGFyIiwgJzYnIH0sCi0gICAgeyAiQXJpYWwiLCAwLCAiQm9sZC9Cb2xkSXRhbGljIENsYXNzIiwgJ2EnIH0sCi0gICAgLyogTWFrZSBob3Jpem9udGFsIHN0ZW1zIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCAqLwotICAgIHsgIkFyaWFsIiwgMjQsICJCb2xkIiwgJ2EnIH0sCi0gICAgeyAiQXJpYWwiLCAyNSwgIkJvbGQiLCAnYScgfSwKLSAgICB7ICJBcmlhbCIsIDI0LCAiQm9sZCIsICdzJyB9LAotICAgIHsgIkFyaWFsIiwgMjUsICJCb2xkIiwgJ3MnIH0sCi0gICAgeyAiQXJpYWwiLCAzNCwgIkJvbGQiLCAncycgfSwKLSAgICB7ICJBcmlhbCIsIDM1LCAiQm9sZCIsICdzJyB9LAotICAgIHsgIkFyaWFsIiwgMzYsICJCb2xkIiwgJ3MnIH0sCi0gICAgeyAiQXJpYWwiLCAyNSwgIlJlZ3VsYXIiLCAncycgfSwKLSAgICB7ICJBcmlhbCIsIDI2LCAiUmVndWxhciIsICdzJyB9LAotICB9OwotCi0KLSAgLyogQWx3YXlzIGRvIERFTFRBUCBpbnN0cnVjdGlvbnMgaWYgbWF0Y2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFMV0FZU19ET19ERUxUQVBfUlVMRVNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBBTFdBWVNfRE9fREVMVEFQX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUxXQVlTX0RPX0RFTFRBUF9SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICItIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIERvbid0IGFsbG93IEFMSUdOUlAgYWZ0ZXIgSVVQLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBOT19BTElHTlJQX0FGVEVSX0lVUF9SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIE5PX0FMSUdOUlBfQUZURVJfSVVQX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTk9fQUxJR05SUF9BRlRFUl9JVVBfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogUHJldmVudCBjcmVhdGlvbiBvZiBkZW50cyBpbiBvdXRsaW5lICovCi0gICAgeyAiLSIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBEb24ndCBhbGxvdyBERUxUQVAgYWZ0ZXIgSVVQLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTk9fREVMVEFQX0FGVEVSX0lVUF9SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIE5PX0RFTFRBUF9BRlRFUl9JVVBfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOT19ERUxUQVBfQUZURVJfSVVQX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIi0iLCAwLCAiIiwgMCB9LAotICB9OwotCi0KLSAgLyogRG9uJ3QgYWxsb3cgQ0FMTCBhZnRlciBJVVAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE5PX0NBTExfQUZURVJfSVVQX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgTk9fQ0FMTF9BRlRFUl9JVVBfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOT19DQUxMX0FGVEVSX0lVUF9SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICAvKiBQcmV2ZW50IGNyZWF0aW9uIG9mIGRlbnRzIGluIG91dGxpbmUgKi8KLSAgICB7ICItIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIERlLWVtYm9sZGVuIHRoZXNlIGdseXBocyBzbGlnaHRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBERUVNQk9MREVOX1JVTEVTX1NJWkUgIDkKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgREVFTUJPTERFTl9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RFRU1CT0xERU5fUlVMRVNfU0laRV0gPQotICB7Ci0gICAgeyAiQ291cmllciBOZXciLCAwLCAiQm9sZCIsICdBJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMCwgIkJvbGQiLCAnVycgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICJCb2xkIiwgJ3cnIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAwLCAiQm9sZCIsICdNJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMCwgIkJvbGQiLCAnWCcgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICJCb2xkIiwgJ0snIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAwLCAiQm9sZCIsICd4JyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMCwgIkJvbGQiLCAneicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICJCb2xkIiwgJ3YnIH0sCi0gIH07Ci0KLQotICAvKiBFbWJvbGRlbiB0aGVzZSBnbHlwaHMgc2xpZ2h0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRU1CT0xERU5fUlVMRVNfU0laRSAgMgotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBFTUJPTERFTl9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0VNQk9MREVOX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIkNvdXJpZXIgTmV3IiwgMCwgIlJlZ3VsYXIiLCAwIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAwLCAiSXRhbGljIiwgMCB9LAotICB9OwotCi0KLSAgLyogVGhpcyBpcyBhIENWVCBoYWNrIHRoYXQgbWFrZXMgdGhpY2sgaG9yaXpvbnRhbCBzdGVtcyBvbiAyLCA1LCA3ICAgICAgICovCi0gIC8qIHNpbWlsYXIgdG8gV2luZG93cyBYUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUSU1FU19ORVdfUk9NQU5fSEFDS19SVUxFU19TSVpFICAxMgotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBUSU1FU19ORVdfUk9NQU5fSEFDS19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1RJTUVTX05FV19ST01BTl9IQUNLX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiSXRhbGljIiwgJzInIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTYsICJJdGFsaWMiLCAnNScgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNiwgIkl0YWxpYyIsICc3JyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiUmVndWxhciIsICc1JyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiUmVndWxhciIsICc3JyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE3LCAiSXRhbGljIiwgJzInIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTcsICJJdGFsaWMiLCAnNScgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNywgIkl0YWxpYyIsICc3JyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE3LCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE3LCAiUmVndWxhciIsICc1JyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE3LCAiUmVndWxhciIsICc3JyB9LAotICB9OwotCi0KLSAgLyogVGhpcyBmdWRnZXMgZGlzdGFuY2Ugb24gMiB0byBnZXQgcmlkIG9mIHRoZSB2YW5pc2hpbmcgc3RlbSBpc3N1ZS4gICAgICovCi0gIC8qIEEgcmVhbCBzb2x1dGlvbiB0byB0aGlzIGlzIGNlcnRhaW5seSB3ZWxjb21lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDT1VSSUVSX05FV18yX0hBQ0tfUlVMRVNfU0laRSAgMTUKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgQ09VUklFUl9ORVdfMl9IQUNLX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQ09VUklFUl9ORVdfMl9IQUNLX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTAsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAxMSwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDEyLCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTMsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAxNCwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDE1LCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTYsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAxNywgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDE4LCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTksICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAyMCwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDIxLCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMjIsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAyMywgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDI0LCAiUmVndWxhciIsICcyJyB9LAotICB9OwotCi0KLSNpZm5kZWYgRk9SQ0VfTkFUVVJBTF9XSURUSFMKLQotICAvKiBVc2UgY29tcGF0aWJsZSB3aWR0aHMgd2l0aCB0aGVzZSBnbHlwaHMuICBDb21wYXRpYmxlIHdpZHRocyBpcyBhbHdheXMgKi8KLSAgLyogb24gd2hlbiBkb2luZyBCL1cgVHJ1ZVR5cGUgaW5zdHJ1Y3RpbmcsIGJ1dCBpcyB1c2VkIHNlbGVjdGl2ZWx5IGhlcmUsICovCi0gIC8qIHR5cGljYWxseSBvbiBnbHlwaHMgd2l0aCAzIG9yIG1vcmUgdmVydGljYWwgc3RlbXMuICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDT01QQVRJQkxFX1dJRFRIU19SVUxFU19TSVpFICAzOAotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBDT01QQVRJQkxFX1dJRFRIU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0NPTVBBVElCTEVfV0lEVEhTX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIkFyaWFsIFVuaWNvZGUgTVMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScgfSwKLSAgICB7ICJBcmlhbCBVbmljb2RlIE1TIiwgMTQsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gICAgLyogQ3lyaWxsaWMgc21hbGwgbGV0dGVyIHNoYSAqLwotICAgIHsgIkFyaWFsIiwgMTAsICJSZWd1bGFyIENsYXNzIiwgMHg0NDggfSwKLSAgICB7ICJBcmlhbCIsIDExLCAiUmVndWxhciBDbGFzcyIsICdtJyB9LAotICAgIHsgIkFyaWFsIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gICAgLyogQ3lyaWxsaWMgc21hbGwgbGV0dGVyIHNoYSAqLwotICAgIHsgIkFyaWFsIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgMHg0NDggfSwKLSAgICB7ICJBcmlhbCIsIDEzLCAiUmVndWxhciBDbGFzcyIsIDB4NDQ4IH0sCi0gICAgeyAiQXJpYWwiLCAxNCwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScgfSwKLSAgICAvKiBDeXJpbGxpYyBzbWFsbCBsZXR0ZXIgc2hhICovCi0gICAgeyAiQXJpYWwiLCAxNCwgIlJlZ3VsYXIgQ2xhc3MiLCAweDQ0OCB9LAotICAgIHsgIkFyaWFsIiwgMTUsICJSZWd1bGFyIENsYXNzIiwgMHg0NDggfSwKLSAgICB7ICJBcmlhbCIsIDE3LCAiUmVndWxhciBDbGFzcyIsICdtJyB9LAotICAgIHsgIkRlamFWdSBTYW5zIiwgMTUsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIlNlZ29lIFVJIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIk1vbmFjbyIsIDAsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIlNlZ29lIFVJIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gICAgeyAiU2Vnb2UgVUkiLCAxNCwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScgfSwKLSAgICB7ICJUYWhvbWEiLCAxMSwgIlJlZ3VsYXIgQ2xhc3MiLCAwIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTYsICJSZWd1bGFyIENsYXNzIiwgJ2MnIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTYsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTYsICJSZWd1bGFyIENsYXNzIiwgJ28nIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTYsICJSZWd1bGFyIENsYXNzIiwgJ3cnIH0sCi0gICAgeyAiVHJlYnVjaGV0IE1TIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDEyLCAiUmVndWxhciBDbGFzcyIsIDAgfSwKLSAgICB7ICJUcmVidWNoZXQgTVMiLCAxNCwgIlJlZ3VsYXIgQ2xhc3MiLCAwIH0sCi0gICAgeyAiVHJlYnVjaGV0IE1TIiwgMTUsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIlVidW50dSIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdtJyB9LAotICAgIC8qIEN5cmlsbGljIHNtYWxsIGxldHRlciBzaGEgKi8KLSAgICB7ICJWZXJkYW5hIiwgMTAsICJSZWd1bGFyIENsYXNzIiwgMHg0NDggfSwKLSAgICB7ICJWZXJkYW5hIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgMHg0NDggfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnaScgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnaicgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbCcgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAnaScgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAnaicgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAnbCcgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxNCwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScgfSwKLSAgfTsKLQotCi0gIC8qIFNjYWxpbmcgc2xpZ2h0bHkgaW4gdGhlIHgtZGlyZWN0aW9uIHByaW9yIHRvIGhpbnRpbmcgcmVzdWx0cyBpbiAgICAgICAqLwotICAvKiBtb3JlIHZpc3VhbGx5IHBsZWFzaW5nIGdseXBocyBpbiBjZXJ0YWluIGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBzb21ldGltZXMgbmVlZHMgdG8gYmUgY29vcmRpbmF0ZWQgd2l0aCBjb21wYXRpYmxlIHdpZHRoIHJ1bGVzLiAgICovCi0gIC8qIEEgdmFsdWUgb2YgMTAwMCBjb3JyZXNwb25kcyB0byBhIHNjYWxlZCB2YWx1ZSBvZiAxLjAuICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFhfU0NBTElOR19SVUxFU19TSVpFICA1MAotCi0gIHN0YXRpYyBjb25zdCBTUEhfU2NhbGVSdWxlICBYX1NDQUxJTkdfUnVsZXNbWF9TQ0FMSU5HX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIkRlamFWdSBTYW5zIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nLCA5NTAgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnYScsIDExMDAgfSwKLSAgICB7ICJWZXJkYW5hIGFuZCBDbG9uZXMiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAnYScsIDEwNTAgfSwKLSAgICB7ICJBcmlhbCIsIDExLCAiUmVndWxhciBDbGFzcyIsICdtJywgOTc1IH0sCi0gICAgeyAiQXJpYWwiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScsIDEwNTAgfSwKLSAgICAvKiBDeXJpbGxpYyBzbWFsbCBsZXR0ZXIgZWwgKi8KLSAgICB7ICJBcmlhbCIsIDEzLCAiUmVndWxhciBDbGFzcyIsIDB4NDNCLCA5NTAgfSwKLSAgICB7ICJBcmlhbCIsIDEzLCAiUmVndWxhciBDbGFzcyIsICdvJywgOTUwIH0sCi0gICAgeyAiQXJpYWwiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAnZScsIDk1MCB9LAotICAgIHsgIkFyaWFsIiwgMTQsICJSZWd1bGFyIENsYXNzIiwgJ20nLCA5NTAgfSwKLSAgICAvKiBDeXJpbGxpYyBzbWFsbCBsZXR0ZXIgZWwgKi8KLSAgICB7ICJBcmlhbCIsIDE1LCAiUmVndWxhciBDbGFzcyIsIDB4NDNCLCA5MjUgfSwKLSAgICB7ICJCaXRzdHJlYW0gVmVyYSBTYW5zIiwgMTAsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsIDAsIDExMDAgfSwKLSAgICB7ICJCaXRzdHJlYW0gVmVyYSBTYW5zIiwgMTIsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsIDAsIDEwNTAgfSwKLSAgICB7ICJCaXRzdHJlYW0gVmVyYSBTYW5zIiwgMTYsICJSZWd1bGFyIENsYXNzIiwgMCwgMTA1MCB9LAotICAgIHsgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCA5LCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAwLCAxMDUwIH0sCi0gICAgeyAiRGVqYVZ1IFNhbnMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbCcsIDk3NSB9LAotICAgIHsgIkRlamFWdSBTYW5zIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ2knLCA5NzUgfSwKLSAgICB7ICJEZWphVnUgU2FucyIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdqJywgOTc1IH0sCi0gICAgeyAiRGVqYVZ1IFNhbnMiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAnbCcsIDk1MCB9LAotICAgIHsgIkRlamFWdSBTYW5zIiwgMTMsICJSZWd1bGFyIENsYXNzIiwgJ2knLCA5NTAgfSwKLSAgICB7ICJEZWphVnUgU2FucyIsIDEzLCAiUmVndWxhciBDbGFzcyIsICdqJywgOTUwIH0sCi0gICAgeyAiRGVqYVZ1IFNhbnMiLCAxMCwgIlJlZ3VsYXIvSXRhbGljIENsYXNzIiwgMCwgMTEwMCB9LAotICAgIHsgIkRlamFWdSBTYW5zIiwgMTIsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsIDAsIDEwNTAgfSwKLSAgICB7ICJHZW9yZ2lhIiwgMTAsICIiLCAwLCAxMDUwIH0sCi0gICAgeyAiR2VvcmdpYSIsIDExLCAiIiwgMCwgMTEwMCB9LAotICAgIHsgIkdlb3JnaWEiLCAxMiwgIiIsIDAsIDEwMjUgfSwKLSAgICB7ICJHZW9yZ2lhIiwgMTMsICIiLCAwLCAxMDUwIH0sCi0gICAgeyAiR2VvcmdpYSIsIDE2LCAiIiwgMCwgMTA1MCB9LAotICAgIHsgIkdlb3JnaWEiLCAxNywgIiIsIDAsIDEwMzAgfSwKLSAgICB7ICJMaWJlcmF0aW9uIFNhbnMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScsIDExMDAgfSwKLSAgICB7ICJMdWNpZGEgR3JhbmRlIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgJ20nLCAxMTAwIH0sCi0gICAgeyAiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCAxMSwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScsIDk1MCB9LAotICAgIHsgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nLCAxMDUwIH0sCi0gICAgeyAiU2Vnb2UgVUkiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnSCcsIDEwNTAgfSwKLSAgICB7ICJTZWdvZSBVSSIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdtJywgMTA1MCB9LAotICAgIHsgIlNlZ29lIFVJIiwgMTQsICJSZWd1bGFyIENsYXNzIiwgJ20nLCAxMDUwIH0sCi0gICAgeyAiVGFob21hIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgJ2knLCA5NzUgfSwKLSAgICB7ICJUYWhvbWEiLCAxMSwgIlJlZ3VsYXIgQ2xhc3MiLCAnbCcsIDk3NSB9LAotICAgIHsgIlRhaG9tYSIsIDExLCAiUmVndWxhciBDbGFzcyIsICdqJywgOTAwIH0sCi0gICAgeyAiVGFob21hIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgJ20nLCA5MTggfSwKLSAgICB7ICJWZXJkYW5hIiwgMTAsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsIDAsIDExMDAgfSwKLSAgICB7ICJWZXJkYW5hIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nLCA5NzUgfSwKLSAgICB7ICJWZXJkYW5hIiwgMTIsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsIDAsIDEwNTAgfSwKLSAgICB7ICJWZXJkYW5hIiwgMTMsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsICdpJywgOTUwIH0sCi0gICAgeyAiVmVyZGFuYSIsIDEzLCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAnaicsIDk1MCB9LAotICAgIHsgIlZlcmRhbmEiLCAxMywgIlJlZ3VsYXIvSXRhbGljIENsYXNzIiwgJ2wnLCA5NTAgfSwKLSAgICB7ICJWZXJkYW5hIiwgMTYsICJSZWd1bGFyIENsYXNzIiwgMCwgMTA1MCB9LAotICAgIHsgIlZlcmRhbmEiLCA5LCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAwLCAxMDUwIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTYsICJSZWd1bGFyIENsYXNzIiwgJ20nLCA5MTggfSwKLSAgICB7ICJUcmVidWNoZXQgTVMiLCAxMSwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScsIDgwMCB9LAotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdtJywgODAwIH0sCi0gIH07Ci0KLSNlbHNlCi0KLSNkZWZpbmUgQ09NUEFUSUJMRV9XSURUSFNfUlVMRVNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBDT01QQVRJQkxFX1dJRFRIU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0NPTVBBVElCTEVfV0lEVEhTX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIi0iLCAwLCAiIiwgMCB9LAotICB9OwotCi0KLSNkZWZpbmUgWF9TQ0FMSU5HX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1NjYWxlUnVsZSAgWF9TQ0FMSU5HX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWF9TQ0FMSU5HX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIi0iLCAwLCAiIiwgMCwgMTAwMCB9LAotICB9OwotCi0jZW5kaWYgLyogRk9SQ0VfTkFUVVJBTF9XSURUSFMgKi8KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGlzX21lbWJlcl9vZl9mYW1pbHlfY2xhc3MoIGNvbnN0IEZUX1N0cmluZyogIGRldGVjdGVkX2ZvbnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcnVsZV9mb250X25hbWUgKQotICB7Ci0gICAgRlRfVUludCAgaSwgajsKLQotCi0gICAgLyogRG9lcyBmb250IG5hbWUgbWF0Y2ggcnVsZSBmYW1pbHk/ICovCi0gICAgaWYgKCBzdHJjbXAoIGRldGVjdGVkX2ZvbnRfbmFtZSwgcnVsZV9mb250X25hbWUgKSA9PSAwICkKLSAgICAgIHJldHVybiBUUlVFOwotCi0gICAgLyogSXMgZm9udCBuYW1lIGEgd2lsZGNhcmQgIiI/ICovCi0gICAgaWYgKCBzdHJjbXAoIHJ1bGVfZm9udF9uYW1lLCAiIiApID09IDAgKQotICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAvKiBJcyBmb250IG5hbWUgY29udGFpbmVkIGluIGEgY2xhc3MgbGlzdD8gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IEZBTUlMWV9DTEFTU19SVUxFU19TSVpFOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggc3RyY21wKCBGQU1JTFlfQ0xBU1NfUnVsZXNbaV0ubmFtZSwgcnVsZV9mb250X25hbWUgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBTUEhfTUFYX0NMQVNTX01FTUJFUlM7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHN0cmNtcCggRkFNSUxZX0NMQVNTX1J1bGVzW2ldLm1lbWJlcltqXSwgIiIgKSA9PSAwICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGlmICggc3RyY21wKCBGQU1JTFlfQ0xBU1NfUnVsZXNbaV0ubWVtYmVyW2pdLAotICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RlZF9mb250X25hbWUgKSA9PSAwICkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBpc19tZW1iZXJfb2Zfc3R5bGVfY2xhc3MoIGNvbnN0IEZUX1N0cmluZyogIGRldGVjdGVkX2ZvbnRfc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcnVsZV9mb250X3N0eWxlICkKLSAgewotICAgIEZUX1VJbnQgIGksIGo7Ci0KLQotICAgIC8qIERvZXMgZm9udCBzdHlsZSBtYXRjaCBydWxlIHN0eWxlPyAqLwotICAgIGlmICggc3RyY21wKCBkZXRlY3RlZF9mb250X3N0eWxlLCBydWxlX2ZvbnRfc3R5bGUgKSA9PSAwICkKLSAgICAgIHJldHVybiBUUlVFOwotCi0gICAgLyogSXMgZm9udCBzdHlsZSBhIHdpbGRjYXJkICIiPyAqLwotICAgIGlmICggc3RyY21wKCBydWxlX2ZvbnRfc3R5bGUsICIiICkgPT0gMCApCi0gICAgICByZXR1cm4gVFJVRTsKLQotICAgIC8qIElzIGZvbnQgc3R5bGUgY29udGFpbmVkIGluIGEgY2xhc3MgbGlzdD8gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IFNUWUxFX0NMQVNTX1JVTEVTX1NJWkU7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBzdHJjbXAoIFNUWUxFX0NMQVNTX1J1bGVzW2ldLm5hbWUsIHJ1bGVfZm9udF9zdHlsZSApID09IDAgKQotICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IFNQSF9NQVhfQ0xBU1NfTUVNQkVSUzsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggc3RyY21wKCBTVFlMRV9DTEFTU19SdWxlc1tpXS5tZW1iZXJbal0sICIiICkgPT0gMCApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBpZiAoIHN0cmNtcCggU1RZTEVfQ0xBU1NfUnVsZXNbaV0ubWVtYmVyW2pdLAotICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RlZF9mb250X3N0eWxlICkgPT0gMCApCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgc3BoX3Rlc3RfdHdlYWsoIFRUX0ZhY2UgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgICAgIGZhbWlseSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBwcGVtLAotICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgICAgIHN0eWxlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgY29uc3QgU1BIX1R3ZWFrUnVsZSogIHJ1bGUsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgbnVtX3J1bGVzICkKLSAgewotICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgIC8qIHJ1bGUgY2hlY2tzIG1heSBiZSBhYmxlIHRvIGJlIG9wdGltaXplZCBmdXJ0aGVyICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fcnVsZXM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBmYW1pbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIGlzX21lbWJlcl9vZl9mYW1pbHlfY2xhc3MgKCBmYW1pbHksIHJ1bGVbaV0uZmFtaWx5ICkgKSApCi0gICAgICAgIGlmICggcnVsZVtpXS5wcGVtID09IDAgICAgfHwKLSAgICAgICAgICAgICBydWxlW2ldLnBwZW0gPT0gcHBlbSApCi0gICAgICAgICAgaWYgKCBzdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBpc19tZW1iZXJfb2Zfc3R5bGVfY2xhc3MgKCBzdHlsZSwgcnVsZVtpXS5zdHlsZSApICkKLSAgICAgICAgICAgIGlmICggcnVsZVtpXS5nbHlwaCA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBGVF9HZXRfQ2hhcl9JbmRleCggKEZUX0ZhY2UpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVbaV0uZ2x5cGggKSA9PSBnbHlwaF9pbmRleCApCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgc2NhbGVfdGVzdF90d2VhayggVFRfRmFjZSAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogICAgICBmYW1pbHksCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBwcGVtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICAgICAgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU1BIX1NjYWxlUnVsZSogIHJ1bGUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBudW1fcnVsZXMgKQotICB7Ci0gICAgRlRfVUludCAgaTsKLQotCi0gICAgLyogcnVsZSBjaGVja3MgbWF5IGJlIGFibGUgdG8gYmUgb3B0aW1pemVkIGZ1cnRoZXIgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9ydWxlczsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIGZhbWlseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggaXNfbWVtYmVyX29mX2ZhbWlseV9jbGFzcyAoIGZhbWlseSwgcnVsZVtpXS5mYW1pbHkgKSApICkKLSAgICAgICAgaWYgKCBydWxlW2ldLnBwZW0gPT0gMCAgICB8fAotICAgICAgICAgICAgIHJ1bGVbaV0ucHBlbSA9PSBwcGVtICkKLSAgICAgICAgICBpZiAoIHN0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgaXNfbWVtYmVyX29mX3N0eWxlX2NsYXNzKCBzdHlsZSwgcnVsZVtpXS5zdHlsZSApICkKLSAgICAgICAgICAgIGlmICggcnVsZVtpXS5nbHlwaCA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBGVF9HZXRfQ2hhcl9JbmRleCggKEZUX0ZhY2UpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVbaV0uZ2x5cGggKSA9PSBnbHlwaF9pbmRleCApCi0gICAgICAgIHJldHVybiBydWxlW2ldLnNjYWxlOwotICAgIH0KLQotICAgIHJldHVybiAxMDAwOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1VJbnQgKQotICBzcGhfdGVzdF90d2Vha194X3NjYWxpbmcoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIHBwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgZ2x5cGhfaW5kZXggKQotICB7Ci0gICAgcmV0dXJuIHNjYWxlX3Rlc3RfdHdlYWsoIGZhY2UsIGZhbWlseSwgcHBlbSwgc3R5bGUsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYX1NDQUxJTkdfUnVsZXMsIFhfU0NBTElOR19SVUxFU19TSVpFICk7Ci0gIH0KLQotCi0jZGVmaW5lIFRXRUFLX1JVTEVTKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICggc3BoX3Rlc3RfdHdlYWsoIGZhY2UsIGZhbWlseSwgcHBlbSwgc3R5bGUsIGdseXBoX2luZGV4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHgjI19SdWxlcywgeCMjX1JVTEVTX1NJWkUgKSApICAgICAgICAgICBcCi0gICAgbG9hZGVyLT5leGVjLT5zcGhfdHdlYWtfZmxhZ3MgfD0gU1BIX1RXRUFLXyMjeDsKLQotI2RlZmluZSBUV0VBS19SVUxFU19FWENFUFRJT05TKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoIHNwaF90ZXN0X3R3ZWFrKCBmYWNlLCBmYW1pbHksIHBwZW0sIHN0eWxlLCBnbHlwaF9pbmRleCwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICB4IyNfUnVsZXNfRXhjZXB0aW9ucywgeCMjX1JVTEVTX0VYQ0VQVElPTlNfU0laRSApICkgXAotICAgIGxvYWRlci0+ZXhlYy0+c3BoX3R3ZWFrX2ZsYWdzICY9IH5TUEhfVFdFQUtfIyN4OwotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgc3BoX3NldF90d2Vha3MoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCApCi0gIHsKLSAgICBUVF9GYWNlICAgICBmYWNlICAgPSBsb2FkZXItPmZhY2U7Ci0gICAgRlRfU3RyaW5nKiAgZmFtaWx5ID0gZmFjZS0+cm9vdC5mYW1pbHlfbmFtZTsKLSAgICBGVF9VSW50ICAgICBwcGVtICAgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MtPnhfcHBlbTsKLSAgICBGVF9TdHJpbmcqICBzdHlsZSAgPSBmYWNlLT5yb290LnN0eWxlX25hbWU7Ci0KLQotICAgIC8qIGRvbid0IGFwcGx5IHJ1bGVzIGlmIHN0eWxlIGlzbid0IHNldCAqLwotICAgIGlmICggIWZhY2UtPnJvb3Quc3R5bGVfbmFtZSApCi0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBTUEhfREVCVUdfTU9SRV9WRVJCT1NFCi0gICAgcHJpbnRmKCAiJXMsJWQsJXMsJWM9JWQgIiwKLSAgICAgICAgICAgIGZhbWlseSwgcHBlbSwgc3R5bGUsIGdseXBoX2luZGV4LCBnbHlwaF9pbmRleCApOwotI2VuZGlmCi0KLSAgICBUV0VBS19SVUxFUyggUElYRUxfSElOVElORyApOwotCi0gICAgaWYgKCBsb2FkZXItPmV4ZWMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19QSVhFTF9ISU5USU5HICkKLSAgICB7Ci0gICAgICBsb2FkZXItPmV4ZWMtPmlnbm9yZV94X21vZGUgPSBGQUxTRTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBUV0VBS19SVUxFUyggQUxMT1dfWF9ETU9WRSApOwotICAgIFRXRUFLX1JVTEVTKCBBTFdBWVNfRE9fREVMVEFQICk7Ci0gICAgVFdFQUtfUlVMRVMoIEFMV0FZU19TS0lQX0RFTFRBUCApOwotICAgIFRXRUFLX1JVTEVTKCBERUVNQk9MREVOICk7Ci0gICAgVFdFQUtfUlVMRVMoIERPX1NIUElYICk7Ci0gICAgVFdFQUtfUlVMRVMoIEVNQk9MREVOICk7Ci0gICAgVFdFQUtfUlVMRVMoIE1JQVBfSEFDSyApOwotICAgIFRXRUFLX1JVTEVTKCBOT1JNQUxfUk9VTkQgKTsKLSAgICBUV0VBS19SVUxFUyggTk9fQUxJR05SUF9BRlRFUl9JVVAgKTsKLSAgICBUV0VBS19SVUxFUyggTk9fQ0FMTF9BRlRFUl9JVVAgKTsKLSAgICBUV0VBS19SVUxFUyggTk9fREVMVEFQX0FGVEVSX0lVUCApOwotICAgIFRXRUFLX1JVTEVTKCBSQVNURVJJWkVSXzM1ICk7Ci0gICAgVFdFQUtfUlVMRVMoIFNLSVBfSVVQICk7Ci0KLSAgICBUV0VBS19SVUxFUyggU0tJUF9PRkZQSVhFTF9ZX01PVkVTICk7Ci0gICAgVFdFQUtfUlVMRVNfRVhDRVBUSU9OUyggU0tJUF9PRkZQSVhFTF9ZX01PVkVTICk7Ci0KLSAgICBUV0VBS19SVUxFUyggU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUCApOwotCi0gICAgVFdFQUtfUlVMRVMoIFNLSVBfTk9OUElYRUxfWV9NT1ZFUyApOwotICAgIFRXRUFLX1JVTEVTX0VYQ0VQVElPTlMoIFNLSVBfTk9OUElYRUxfWV9NT1ZFUyApOwotCi0gICAgVFdFQUtfUlVMRVMoIFJPVU5EX05PTlBJWEVMX1lfTU9WRVMgKTsKLSAgICBUV0VBS19SVUxFU19FWENFUFRJT05TKCBST1VORF9OT05QSVhFTF9ZX01PVkVTICk7Ci0KLSAgICBpZiAoIGxvYWRlci0+ZXhlYy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1JBU1RFUklaRVJfMzUgKQotICAgIHsKLSAgICAgIGlmICggbG9hZGVyLT5leGVjLT5yYXN0ZXJpemVyX3ZlcnNpb24gIT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSApCi0gICAgICB7Ci0gICAgICAgIGxvYWRlci0+ZXhlYy0+cmFzdGVyaXplcl92ZXJzaW9uID0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNTsKLSAgICAgICAgbG9hZGVyLT5leGVjLT5zaXplLT5jdnRfcmVhZHkgICAgPSAtMTsKLQotICAgICAgICB0dF9zaXplX3JlYWR5X2J5dGVjb2RlKAotICAgICAgICAgIGxvYWRlci0+ZXhlYy0+c2l6ZSwKLSAgICAgICAgICBGVF9CT09MKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX1BFREFOVElDICkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgbG9hZGVyLT5leGVjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBsb2FkZXItPmV4ZWMtPnJhc3Rlcml6ZXJfdmVyc2lvbiAgIT0KLSAgICAgICAgICAgU1BIX09QVElPTl9TRVRfUkFTVEVSSVpFUl9WRVJTSU9OICkKLSAgICAgIHsKLSAgICAgICAgbG9hZGVyLT5leGVjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPSBTUEhfT1BUSU9OX1NFVF9SQVNURVJJWkVSX1ZFUlNJT047Ci0gICAgICAgIGxvYWRlci0+ZXhlYy0+c2l6ZS0+Y3Z0X3JlYWR5ICAgID0gLTE7Ci0KLSAgICAgICAgdHRfc2l6ZV9yZWFkeV9ieXRlY29kZSgKLSAgICAgICAgICBsb2FkZXItPmV4ZWMtPnNpemUsCi0gICAgICAgICAgRlRfQk9PTCggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9QRURBTlRJQyApICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGxvYWRlci0+ZXhlYy0+cmFzdGVyaXplcl92ZXJzaW9uID0gU1BIX09QVElPTl9TRVRfUkFTVEVSSVpFUl9WRVJTSU9OOwotICAgIH0KLQotICAgIGlmICggSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSApCi0gICAgewotICAgICAgVFdFQUtfUlVMRVMoIFRJTUVTX05FV19ST01BTl9IQUNLICk7Ci0gICAgICBUV0VBS19SVUxFUyggQ09VUklFUl9ORVdfMl9IQUNLICk7Ci0gICAgfQotCi0gICAgaWYgKCBzcGhfdGVzdF90d2VhayggZmFjZSwgZmFtaWx5LCBwcGVtLCBzdHlsZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgIENPTVBBVElCSUxJVFlfTU9ERV9SdWxlcywgQ09NUEFUSUJJTElUWV9NT0RFX1JVTEVTX1NJWkUgKSApCi0gICAgICBsb2FkZXItPmV4ZWMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgPSBUUlVFOwotCi0KLSAgICBpZiAoIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgKQotICAgIHsKLSAgICAgIGlmICggc3BoX3Rlc3RfdHdlYWsoIGZhY2UsIGZhbWlseSwgcHBlbSwgc3R5bGUsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgIENPTVBBVElCTEVfV0lEVEhTX1J1bGVzLCBDT01QQVRJQkxFX1dJRFRIU19SVUxFU19TSVpFICkgKQotICAgICAgICBsb2FkZXItPmV4ZWMtPmNvbXBhdGlibGVfd2lkdGhzIHw9IFRSVUU7Ci0gICAgfQotICB9Ci0KLSNlbHNlIC8qICEoVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICYmICAgICAgICAgICovCi0gICAgICAvKiAgIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZKSAqLwotCi0gIC8qIEFOU0kgQyBkb2Vzbid0IGxpa2UgZW1wdHkgc291cmNlIGZpbGVzICovCi0gIHR5cGVkZWYgaW50ICBfdHRfc3VicGl4X2R1bW15OwotCi0jZW5kaWYgLyogIShUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgJiYgICAgICAgICAgKi8KLSAgICAgICAvKiAgIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZKSAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0c3VicGl4LmggYi9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4Zjk3Zi4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHN1YnBpeC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgU3VicGl4ZWwgSGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTAtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVFRTVUJQSVhfSF8KLSNkZWZpbmUgVFRTVUJQSVhfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRvYmpzLmgiCi0jaW5jbHVkZSAidHRpbnRlcnAuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElEIGZsYWdzIHRvIGlkZW50aWZ5IHNwZWNpYWwgZnVuY3Rpb25zIGF0IEZERUYgYW5kIHJ1bnRpbWUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNQSF9GREVGX0lOTElORV9ERUxUQV8xICAgICAgIDB4MDAwMDAwMQotI2RlZmluZSBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMiAgICAgICAweDAwMDAwMDIKLSNkZWZpbmUgU1BIX0ZERUZfRElBR09OQUxfU1RST0tFICAgICAgMHgwMDAwMDA0Ci0jZGVmaW5lIFNQSF9GREVGX1ZBQ1VGT1JNX1JPVU5EXzEgICAgIDB4MDAwMDAwOAotI2RlZmluZSBTUEhfRkRFRl9UVEZBVVRPSElOVF8xICAgICAgICAweDAwMDAwMTAKLSNkZWZpbmUgU1BIX0ZERUZfU1BBQ0lOR18xICAgICAgICAgICAgMHgwMDAwMDIwCi0jZGVmaW5lIFNQSF9GREVGX1NQQUNJTkdfMiAgICAgICAgICAgIDB4MDAwMDA0MAotI2RlZmluZSBTUEhfRkRFRl9UWVBFTUFOX1NUUk9LRVMgICAgICAweDAwMDAwODAKLSNkZWZpbmUgU1BIX0ZERUZfVFlQRU1BTl9ESUFHRU5EQ1RSTCAgMHgwMDAwMTAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFR3ZWFrIGZsYWdzIHRoYXQgYXJlIHNldCBmb3IgZWFjaCBnbHlwaCBieSB0aGUgYmVsb3cgcnVsZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNQSF9UV0VBS19BTExPV19YX0RNT1ZFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMVVMCi0jZGVmaW5lIFNQSF9UV0VBS19BTFdBWVNfRE9fREVMVEFQICAgICAgICAgICAgICAgIDB4MDAwMDAwMlVMCi0jZGVmaW5lIFNQSF9UV0VBS19BTFdBWVNfU0tJUF9ERUxUQVAgICAgICAgICAgICAgIDB4MDAwMDAwNFVMCi0jZGVmaW5lIFNQSF9UV0VBS19DT1VSSUVSX05FV18yX0hBQ0sgICAgICAgICAgICAgIDB4MDAwMDAwOFVMCi0jZGVmaW5lIFNQSF9UV0VBS19ERUVNQk9MREVOICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19ET19TSFBJWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19FTUJPTERFTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MFVMCi0jZGVmaW5lIFNQSF9UV0VBS19NSUFQX0hBQ0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MFVMCi0jZGVmaW5lIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19OT19BTElHTlJQX0FGVEVSX0lVUCAgICAgICAgICAgIDB4MDAwMDIwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19OT19DQUxMX0FGVEVSX0lVUCAgICAgICAgICAgICAgIDB4MDAwMDQwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19OT19ERUxUQVBfQUZURVJfSVVQICAgICAgICAgICAgIDB4MDAwMDgwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19QSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19SQVNURVJJWkVSXzM1ICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19ST1VORF9OT05QSVhFTF9ZX01PVkVTICAgICAgICAgIDB4MDAwNDAwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19TS0lQX0lVUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVMgICAgICAgICAgIDB4MDAxMDAwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19TS0lQX09GRlBJWEVMX1lfTU9WRVMgICAgICAgICAgIDB4MDAyMDAwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19USU1FU19ORVdfUk9NQU5fSEFDSyAgICAgICAgICAgIDB4MDA0MDAwMFVMCi0jZGVmaW5lIFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVNfREVMVEFQICAgIDB4MDA4MDAwMFVMCi0KLQotICBGVF9MT0NBTCggRlRfQm9vbCApCi0gIHNwaF90ZXN0X3R3ZWFrKCBUVF9GYWNlICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogICAgICBmYW1pbHksCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgcHBlbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogICAgICBzdHlsZSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFNQSF9Ud2Vha1J1bGUqICBydWxlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgIG51bV9ydWxlcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9VSW50ICkKLSAgc3BoX3Rlc3RfdHdlYWtfeF9zY2FsaW5nKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIGZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICBwcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIGdseXBoX2luZGV4ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBzcGhfc2V0X3R3ZWFrcyggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4ICk7Ci0KLQotICAvKiBUaGVzZSBtYWNyb3MgYXJlIGRlZmluZWQgYWJzZW50IGEgbWV0aG9kIGZvciBzZXR0aW5nIHRoZW0gKi8KLSNkZWZpbmUgU1BIX09QVElPTl9CSVRNQVBfV0lEVEhTICAgICAgICAgICBGQUxTRQotI2RlZmluZSBTUEhfT1BUSU9OX1NFVF9TVUJQSVhFTCAgICAgICAgICAgIFRSVUUKLSNkZWZpbmUgU1BIX09QVElPTl9TRVRfR1JBWVNDQUxFICAgICAgICAgICBGQUxTRQotI2RlZmluZSBTUEhfT1BUSU9OX1NFVF9DT01QQVRJQkxFX1dJRFRIUyAgIEZBTFNFCi0jZGVmaW5lIFNQSF9PUFRJT05fU0VUX1JBU1RFUklaRVJfVkVSU0lPTiAgMzgKLQotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVFRTVUJQSVhfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS9KYW1maWxlIGIvc3JjL3R5cGUxL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTBhMzEuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGUxL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3R5cGUxIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSB0eXBlMSA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gdDFhZm0KLSAgICAgICAgICAgICAgIHQxZHJpdmVyCi0gICAgICAgICAgICAgICB0MWdsb2FkCi0gICAgICAgICAgICAgICB0MWxvYWQKLSAgICAgICAgICAgICAgIHQxb2JqcwotICAgICAgICAgICAgICAgdDFwYXJzZQotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gdHlwZTEgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvdHlwZTEgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL21vZHVsZS5tayBiL3NyYy90eXBlMS9tb2R1bGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTlkNmYuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGUxL21vZHVsZS5taworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgRnJlZVR5cGUgMiBUeXBlMSBtb2R1bGUgZGVmaW5pdGlvbgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotRlRNT0RVTEVfSF9DT01NQU5EUyArPSBUWVBFMV9EUklWRVIKLQotZGVmaW5lIFRZUEUxX0RSSVZFUgotJChPUEVOX0RSSVZFUikgRlRfRHJpdmVyX0NsYXNzUmVjLCB0MV9kcml2ZXJfY2xhc3MgJChDTE9TRV9EUklWRVIpCi0kKEVDSE9fRFJJVkVSKXR5cGUxICAgICAkKEVDSE9fRFJJVkVSX0RFU0MpUG9zdHNjcmlwdCBmb250IGZpbGVzIHdpdGggZXh0ZW5zaW9uICoucGZhIG9yICoucGZiJChFQ0hPX0RSSVZFUl9ET05FKQotZW5kZWYKLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy90eXBlMS9ydWxlcy5tayBiL3NyYy90eXBlMS9ydWxlcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZWYyOC4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTEvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgVHlwZTEgZHJpdmVyIGNvbmZpZ3VyYXRpb24gcnVsZXMKLSMKLQotCi0jIENvcHlyaWdodCAxOTk2LTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgVHlwZTEgZHJpdmVyIGRpcmVjdG9yeQotIwotVDFfRElSIDo9ICQoU1JDX0RJUikvdHlwZTEKLQotCi0jIGNvbXBpbGF0aW9uIGZsYWdzIGZvciB0aGUgZHJpdmVyCi0jCi1UMV9DT01QSUxFIDo9ICQoQ0MpICQoQU5TSUZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgJEkkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCQoVDFfRElSKSkgXAotICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICQoRlRfQ0ZMQUdTKQotCi0KLSMgVHlwZTEgZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCi0jCi1UMV9EUlZfU1JDIDo9ICQoVDFfRElSKS90MXBhcnNlLmMgIFwKLSAgICAgICAgICAgICAgJChUMV9ESVIpL3QxbG9hZC5jICAgXAotICAgICAgICAgICAgICAkKFQxX0RJUikvdDFkcml2ZXIuYyBcCi0gICAgICAgICAgICAgICQoVDFfRElSKS90MWFmbS5jICAgIFwKLSAgICAgICAgICAgICAgJChUMV9ESVIpL3QxZ2xvYWQuYyAgXAotICAgICAgICAgICAgICAkKFQxX0RJUikvdDFvYmpzLmMKLQotIyBUeXBlMSBkcml2ZXIgaGVhZGVycwotIwotVDFfRFJWX0ggOj0gJChUMV9EUlZfU1JDOiUuYz0lLmgpIFwKLSAgICAgICAgICAgICQoVDFfRElSKS90MXRva2Vucy5oICBcCi0gICAgICAgICAgICAkKFQxX0RJUikvdDFlcnJvcnMuaAotCi0KLSMgVHlwZTEgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIFQxX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcwotIyAgIFQxX0RSVl9PQkpfUyBpcyB1c2VkIGR1cmluZyBgc2luZ2xlJyBidWlsZHMKLSMKLVQxX0RSVl9PQkpfTSA6PSAkKFQxX0RSVl9TUkM6JChUMV9ESVIpLyUuYz0kKE9CSl9ESVIpLyUuJE8pCi1UMV9EUlZfT0JKX1MgOj0gJChPQkpfRElSKS90eXBlMS4kTwotCi0jIFR5cGUxIGRyaXZlciBzb3VyY2UgZmlsZSBmb3Igc2luZ2xlIGJ1aWxkCi0jCi1UMV9EUlZfU1JDX1MgOj0gJChUMV9ESVIpL3R5cGUxLmMKLQotCi0jIFR5cGUxIGRyaXZlciAtIHNpbmdsZSBvYmplY3QKLSMKLSQoVDFfRFJWX09CSl9TKTogJChUMV9EUlZfU1JDX1MpICQoVDFfRFJWX1NSQykgJChGUkVFVFlQRV9IKSAkKFQxX0RSVl9IKQotCSQoVDFfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQoVDFfRFJWX1NSQ19TKSkKLQotCi0jIFR5cGUxIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChUMV9ESVIpLyUuYyAkKEZSRUVUWVBFX0gpICQoVDFfRFJWX0gpCi0JJChUMV9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoVDFfRFJWX09CSl9TKQotRFJWX09CSlNfTSArPSAkKFQxX0RSVl9PQkpfTSkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxYWZtLmMgYi9zcmMvdHlwZTEvdDFhZm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMjY0Ni4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTEvdDFhZm0uYworKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWFmbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQUZNIHN1cHBvcnQgZm9yIFR5cGUgMSBmb250cyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInQxYWZtLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgInQxZXJyb3JzLmgiCi0KLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3QxYWZtCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUMV9Eb25lX01ldHJpY3MoIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEFGTV9Gb250SW5mbyAgZmkgKQotICB7Ci0gICAgRlRfRlJFRSggZmktPktlcm5QYWlycyApOwotICAgIGZpLT5OdW1LZXJuUGFpciA9IDA7Ci0KLSAgICBGVF9GUkVFKCBmaS0+VHJhY2tLZXJucyApOwotICAgIGZpLT5OdW1UcmFja0tlcm4gPSAwOwotCi0gICAgRlRfRlJFRSggZmkgKTsKLSAgfQotCi0KLSAgLyogcmVhZCBhIGdseXBoIG5hbWUgYW5kIHJldHVybiB0aGUgZXF1aXZhbGVudCBnbHlwaCBpbmRleCAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHQxX2dldF9pbmRleCggY29uc3QgY2hhciogIG5hbWUsCi0gICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgIGxlbiwKLSAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdXNlcl9kYXRhICkKLSAgewotICAgIFQxX0ZvbnQgIHR5cGUxID0gKFQxX0ZvbnQpdXNlcl9kYXRhOwotICAgIEZUX0ludCAgIG47Ci0KLQotICAgIC8qIFBTIHN0cmluZy9uYW1lIGxlbmd0aCBtdXN0IGJlIDwgMTYtYml0ICovCi0gICAgaWYgKCBsZW4gPiAweEZGRkZVICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCB0eXBlMS0+bnVtX2dseXBoczsgbisrICkKLSAgICB7Ci0gICAgICBjaGFyKiAgZ25hbWUgPSAoY2hhciopdHlwZTEtPmdseXBoX25hbWVzW25dOwotCi0KLSAgICAgIGlmICggZ25hbWUgJiYgZ25hbWVbMF0gPT0gbmFtZVswXSAgICAgICAgJiYKLSAgICAgICAgICAgZnRfc3RybGVuKCBnbmFtZSApID09IGxlbiAgICAgICAgICAgJiYKLSAgICAgICAgICAgZnRfc3RybmNtcCggZ25hbWUsIG5hbWUsIGxlbiApID09IDAgKQotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSN1bmRlZiAgS0VSTl9JTkRFWAotI2RlZmluZSBLRVJOX0lOREVYKCBnMSwgZzIgKSAgKCAoIChGVF9VTG9uZykoZzEpIDw8IDE2ICkgfCAoZzIpICkKLQotCi0gIC8qIGNvbXBhcmUgdHdvIGtlcm5pbmcgcGFpcnMgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQotICBjb21wYXJlX2tlcm5fcGFpcnMoIGNvbnN0IHZvaWQqICBhLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBiICkKLSAgewotICAgIEFGTV9LZXJuUGFpciAgcGFpcjEgPSAoQUZNX0tlcm5QYWlyKWE7Ci0gICAgQUZNX0tlcm5QYWlyICBwYWlyMiA9IChBRk1fS2VyblBhaXIpYjsKLQotICAgIEZUX1VMb25nICBpbmRleDEgPSBLRVJOX0lOREVYKCBwYWlyMS0+aW5kZXgxLCBwYWlyMS0+aW5kZXgyICk7Ci0gICAgRlRfVUxvbmcgIGluZGV4MiA9IEtFUk5fSU5ERVgoIHBhaXIyLT5pbmRleDEsIHBhaXIyLT5pbmRleDIgKTsKLQotCi0gICAgaWYgKCBpbmRleDEgPiBpbmRleDIgKQotICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZSBpZiAoIGluZGV4MSA8IGluZGV4MiApCi0gICAgICByZXR1cm4gLTE7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qIHBhcnNlIGEgUEZNIGZpbGUgLS0gZm9yIG5vdywgb25seSByZWFkIHRoZSBrZXJuaW5nIHBhaXJzICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBUMV9SZWFkX1BGTSggRlRfRmFjZSAgICAgICB0MV9mYWNlLAotICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICBBRk1fRm9udEluZm8gIGZpICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfQnl0ZSogICAgICBzdGFydDsKLSAgICBGVF9CeXRlKiAgICAgIGxpbWl0OwotICAgIEZUX0J5dGUqICAgICAgcDsKLSAgICBBRk1fS2VyblBhaXIgIGtwOwotICAgIEZUX0ludCAgICAgICAgd2lkdGhfdGFibGVfbGVuZ3RoOwotICAgIEZUX0NoYXJNYXAgICAgb2xkY2hhcm1hcDsKLSAgICBGVF9DaGFyTWFwICAgIGNoYXJtYXA7Ci0gICAgRlRfSW50ICAgICAgICBuOwotCi0KLSAgICBzdGFydCA9IChGVF9CeXRlKilzdHJlYW0tPmN1cnNvcjsKLSAgICBsaW1pdCA9IChGVF9CeXRlKilzdHJlYW0tPmxpbWl0OwotCi0gICAgLyogRmlndXJlIG91dCBob3cgbG9uZyB0aGUgd2lkdGggdGFibGUgaXMuICAgICAgICAgICovCi0gICAgLyogVGhpcyBpbmZvIGlzIGEgbGl0dGxlLWVuZGlhbiBzaG9ydCBhdCBvZmZzZXQgOTkuICovCi0gICAgcCA9IHN0YXJ0ICsgOTk7Ci0gICAgaWYgKCBwICsgMiA+IGxpbWl0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIHdpZHRoX3RhYmxlX2xlbmd0aCA9IEZUX1BFRUtfVVNIT1JUX0xFKCBwICk7Ci0KLSAgICBwICs9IDE4ICsgd2lkdGhfdGFibGVfbGVuZ3RoOwotICAgIGlmICggcCArIDB4MTIgPiBsaW1pdCB8fCBGVF9QRUVLX1VTSE9SVF9MRSggcCApIDwgMHgxMiApCi0gICAgICAvKiBleHRlbnNpb24gdGFibGUgaXMgcHJvYmFibHkgb3B0aW9uYWwgKi8KLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIEtlcm5pbmcgb2Zmc2V0IGlzIDE0IGJ5dGVzIGZyb20gc3RhcnQgb2YgZXh0ZW5zaW9ucyB0YWJsZS4gKi8KLSAgICBwICs9IDE0OwotICAgIHAgPSBzdGFydCArIEZUX1BFRUtfVUxPTkdfTEUoIHAgKTsKLQotICAgIGlmICggcCA9PSBzdGFydCApCi0gICAgICAvKiB6ZXJvIG9mZnNldCBtZWFucyBubyB0YWJsZSAqLwotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBwICsgMiA+IGxpbWl0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZmktPk51bUtlcm5QYWlyID0gRlRfUEVFS19VU0hPUlRfTEUoIHAgKTsKLSAgICBwICs9IDI7Ci0gICAgaWYgKCBwICsgNCAqIGZpLT5OdW1LZXJuUGFpciA+IGxpbWl0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogQWN0dWFsbHksIGtlcm5pbmcgcGFpcnMgYXJlIHNpbXBseSBvcHRpb25hbCEgKi8KLSAgICBpZiAoIGZpLT5OdW1LZXJuUGFpciA9PSAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGFsbG9jYXRlIHRoZSBwYWlycyAqLwotICAgIGlmICggRlRfUU5FV19BUlJBWSggZmktPktlcm5QYWlycywgZmktPk51bUtlcm5QYWlyICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbm93LCByZWFkIGVhY2gga2VybiBwYWlyICovCi0gICAga3AgICAgPSBmaS0+S2VyblBhaXJzOwotICAgIGxpbWl0ID0gcCArIDQgKiBmaS0+TnVtS2VyblBhaXI7Ci0KLSAgICAvKiBQRk0ga2VybmluZyBkYXRhIGFyZSBzdG9yZWQgYnkgZW5jb2RpbmcgcmF0aGVyIHRoYW4gZ2x5cGggaW5kZXgsICovCi0gICAgLyogc28gZmluZCB0aGUgUG9zdFNjcmlwdCBjaGFybWFwIG9mIHRoaXMgZm9udCBhbmQgaW5zdGFsbCBpdCAgICAgICAqLwotICAgIC8qIHRlbXBvcmFyaWx5LiAgSWYgd2UgZmluZCBubyBQb3N0U2NyaXB0IGNoYXJtYXAsIHRoZW4ganVzdCB1c2UgICAgKi8KLSAgICAvKiB0aGUgZGVmYXVsdCBhbmQgaG9wZSBpdCBpcyB0aGUgcmlnaHQgb25lLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgb2xkY2hhcm1hcCA9IHQxX2ZhY2UtPmNoYXJtYXA7Ci0gICAgY2hhcm1hcCAgICA9IE5VTEw7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IHQxX2ZhY2UtPm51bV9jaGFybWFwczsgbisrICkKLSAgICB7Ci0gICAgICBjaGFybWFwID0gdDFfZmFjZS0+Y2hhcm1hcHNbbl07Ci0gICAgICAvKiBjaGVjayBhZ2FpbnN0IFBvc3RTY3JpcHQgcHNldWRvIHBsYXRmb3JtICovCi0gICAgICBpZiAoIGNoYXJtYXAtPnBsYXRmb3JtX2lkID09IDcgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1NldF9DaGFybWFwKCB0MV9mYWNlLCBjaGFybWFwICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogS2VybmluZyBpbmZvIGlzIHN0b3JlZCBhczogICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgZW5jb2Rpbmcgb2YgZmlyc3QgZ2x5cGggKDEgYnl0ZSkgICAgICovCi0gICAgLyogICBlbmNvZGluZyBvZiBzZWNvbmQgZ2x5cGggKDEgYnl0ZSkgICAgKi8KLSAgICAvKiAgIG9mZnNldCAobGl0dGxlLWVuZGlhbiBzaG9ydCkgICAgICAgICAqLwotICAgIGZvciAoIDsgcCA8IGxpbWl0OyBwICs9IDQgKQotICAgIHsKLSAgICAgIGtwLT5pbmRleDEgPSBGVF9HZXRfQ2hhcl9JbmRleCggdDFfZmFjZSwgcFswXSApOwotICAgICAga3AtPmluZGV4MiA9IEZUX0dldF9DaGFyX0luZGV4KCB0MV9mYWNlLCBwWzFdICk7Ci0KLSAgICAgIGtwLT54ID0gKEZUX0ludClGVF9QRUVLX1NIT1JUX0xFKHAgKyAyKTsKLSAgICAgIGtwLT55ID0gMDsKLQotICAgICAga3ArKzsKLSAgICB9Ci0KLSAgICBpZiAoIG9sZGNoYXJtYXAgKQotICAgICAgZXJyb3IgPSBGVF9TZXRfQ2hhcm1hcCggdDFfZmFjZSwgb2xkY2hhcm1hcCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbm93LCBzb3J0IHRoZSBrZXJuIHBhaXJzIGFjY29yZGluZyB0byB0aGVpciBnbHlwaCBpbmRpY2VzICovCi0gICAgZnRfcXNvcnQoIGZpLT5LZXJuUGFpcnMsIGZpLT5OdW1LZXJuUGFpciwgc2l6ZW9mICggQUZNX0tlcm5QYWlyUmVjICksCi0gICAgICAgICAgICAgIGNvbXBhcmVfa2Vybl9wYWlycyApOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfRlJFRSggZmktPktlcm5QYWlycyApOwotICAgICAgZmktPk51bUtlcm5QYWlyID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHBhcnNlIGEgbWV0cmljcyBmaWxlIC0tIGVpdGhlciBBRk0gb3IgUEZNIGRlcGVuZGluZyBvbiB3aGF0ICovCi0gIC8qIGl0IHR1cm5zIG91dCB0byBiZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9SZWFkX01ldHJpY3MoIEZUX0ZhY2UgICAgdDFfZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eDsKLSAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgQUZNX1BhcnNlclJlYyAgcGFyc2VyOwotICAgIEFGTV9Gb250SW5mbyAgIGZpICAgICAgPSBOVUxMOwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yICAgPSBGVF9FUlIoIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICBUMV9GYWNlICAgICAgICBmYWNlICAgID0gKFQxX0ZhY2UpdDFfZmFjZTsKLSAgICBUMV9Gb250ICAgICAgICB0MV9mb250ID0gJmZhY2UtPnR5cGUxOwotCi0KLSAgICBpZiAoIGZhY2UtPmFmbV9kYXRhICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAiVDFfUmVhZF9NZXRyaWNzOiIKLSAgICAgICAgICAgICAgICAgICIgRnJlZWluZyBwcmV2aW91c2x5IGF0dGFjaGVkIG1ldHJpY3MgZGF0YS5cbiIgKSk7Ci0gICAgICBUMV9Eb25lX01ldHJpY3MoIG1lbW9yeSwgKEFGTV9Gb250SW5mbylmYWNlLT5hZm1fZGF0YSApOwotCi0gICAgICBmYWNlLT5hZm1fZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVcoIGZpICkgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBzdHJlYW0tPnNpemUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmaS0+Rm9udEJCb3ggID0gdDFfZm9udC0+Zm9udF9iYm94OwotICAgIGZpLT5Bc2NlbmRlciAgPSB0MV9mb250LT5mb250X2Jib3gueU1heDsKLSAgICBmaS0+RGVzY2VuZGVyID0gdDFfZm9udC0+Zm9udF9iYm94LnlNaW47Ci0KLSAgICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotICAgIGlmICggcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MgKQotICAgIHsKLSAgICAgIGVycm9yID0gcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MtPmluaXQoICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5saW1pdCApOwotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIHBhcnNlci5Gb250SW5mbyAgPSBmaTsKLSAgICAgICAgcGFyc2VyLmdldF9pbmRleCA9IHQxX2dldF9pbmRleDsKLSAgICAgICAgcGFyc2VyLnVzZXJfZGF0YSA9IHQxX2ZvbnQ7Ci0KLSAgICAgICAgZXJyb3IgPSBwc2F1eC0+YWZtX3BhcnNlcl9mdW5jcy0+cGFyc2UoICZwYXJzZXIgKTsKLSAgICAgICAgcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MtPmRvbmUoICZwYXJzZXIgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIFVua25vd25fRmlsZV9Gb3JtYXQgKSApCi0gICAgewotICAgICAgRlRfQnl0ZSogIHN0YXJ0ID0gc3RyZWFtLT5jdXJzb3I7Ci0KLQotICAgICAgLyogTVMgV2luZG93cyBhbGxvd3MgdmVyc2lvbnMgdXAgdG8gMHgzRkYgd2l0aG91dCBjb21wbGFpbmluZyAqLwotICAgICAgaWYgKCBzdHJlYW0tPnNpemUgPiA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgc3RhcnRbMV0gPCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIEZUX1BFRUtfVUxPTkdfTEUoIHN0YXJ0ICsgMiApID09IHN0cmVhbS0+c2l6ZSApCi0gICAgICAgIGVycm9yID0gVDFfUmVhZF9QRk0oIHQxX2ZhY2UsIHN0cmVhbSwgZmkgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgdDFfZm9udC0+Zm9udF9iYm94ID0gZmktPkZvbnRCQm94OwotCi0gICAgICB0MV9mYWNlLT5iYm94LnhNaW4gPSAgIGZpLT5Gb250QkJveC54TWluICAgICAgICAgICAgPj4gMTY7Ci0gICAgICB0MV9mYWNlLT5iYm94LnlNaW4gPSAgIGZpLT5Gb250QkJveC55TWluICAgICAgICAgICAgPj4gMTY7Ci0gICAgICAvKiBubyBgVScgc3VmZml4IGhlcmUgdG8gMHhGRkZGISAqLwotICAgICAgdDFfZmFjZS0+YmJveC54TWF4ID0gKCBmaS0+Rm9udEJCb3gueE1heCArIDB4RkZGRiApID4+IDE2OwotICAgICAgdDFfZmFjZS0+YmJveC55TWF4ID0gKCBmaS0+Rm9udEJCb3gueU1heCArIDB4RkZGRiApID4+IDE2OwotCi0gICAgICAvKiBubyBgVScgc3VmZml4IGhlcmUgdG8gMHg4MDAwISAqLwotICAgICAgdDFfZmFjZS0+YXNjZW5kZXIgID0gKEZUX1Nob3J0KSggKCBmaS0+QXNjZW5kZXIgICsgMHg4MDAwICkgPj4gMTYgKTsKLSAgICAgIHQxX2ZhY2UtPmRlc2NlbmRlciA9IChGVF9TaG9ydCkoICggZmktPkRlc2NlbmRlciArIDB4ODAwMCApID4+IDE2ICk7Ci0KLSAgICAgIGlmICggZmktPk51bUtlcm5QYWlyICkKLSAgICAgIHsKLSAgICAgICAgdDFfZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfS0VSTklORzsKLSAgICAgICAgZmFjZS0+YWZtX2RhdGEgICAgICAgPSBmaTsKLSAgICAgICAgZmkgICAgICAgICAgICAgICAgICAgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICBFeGl0OgotICAgIGlmICggZmkgKQotICAgICAgVDFfRG9uZV9NZXRyaWNzKCBtZW1vcnksIGZpICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGZpbmQgdGhlIGtlcm5pbmcgZm9yIGEgZ2l2ZW4gZ2x5cGggcGFpciAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUMV9HZXRfS2VybmluZyggQUZNX0ZvbnRJbmZvICBmaSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGgxLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaDIsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgIGtlcm5pbmcgKQotICB7Ci0gICAgQUZNX0tlcm5QYWlyICBtaW4sIG1pZCwgbWF4OwotICAgIEZUX1VMb25nICAgICAgaWR4ID0gS0VSTl9JTkRFWCggZ2x5cGgxLCBnbHlwaDIgKTsKLQotCi0gICAgLyogc2ltcGxlIGJpbmFyeSBzZWFyY2ggKi8KLSAgICBtaW4gPSBmaS0+S2VyblBhaXJzOwotICAgIG1heCA9IG1pbiArIGZpLT5OdW1LZXJuUGFpciAtIDE7Ci0KLSAgICB3aGlsZSAoIG1pbiA8PSBtYXggKQotICAgIHsKLSAgICAgIEZUX1VMb25nICBtaWRpOwotCi0KLSAgICAgIG1pZCAgPSBtaW4gKyAoIG1heCAtIG1pbiApIC8gMjsKLSAgICAgIG1pZGkgPSBLRVJOX0lOREVYKCBtaWQtPmluZGV4MSwgbWlkLT5pbmRleDIgKTsKLQotICAgICAgaWYgKCBtaWRpID09IGlkeCApCi0gICAgICB7Ci0gICAgICAgIGtlcm5pbmctPnggPSBtaWQtPng7Ci0gICAgICAgIGtlcm5pbmctPnkgPSBtaWQtPnk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoIG1pZGkgPCBpZHggKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICBtYXggPSBtaWQgLSAxOwotICAgIH0KLQotICAgIGtlcm5pbmctPnggPSAwOwotICAgIGtlcm5pbmctPnkgPSAwOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfR2V0X1RyYWNrX0tlcm5pbmcoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgcHRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGtlcm5pbmcgKQotICB7Ci0gICAgQUZNX0ZvbnRJbmZvICBmaSA9IChBRk1fRm9udEluZm8pKCAoVDFfRmFjZSlmYWNlICktPmFmbV9kYXRhOwotICAgIEZUX1VJbnQgICAgICAgaTsKLQotCi0gICAgaWYgKCAhZmkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGZpLT5OdW1UcmFja0tlcm47IGkrKyApCi0gICAgewotICAgICAgQUZNX1RyYWNrS2VybiAgdGsgPSBmaS0+VHJhY2tLZXJucyArIGk7Ci0KLQotICAgICAgaWYgKCB0ay0+ZGVncmVlICE9IGRlZ3JlZSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIHB0c2l6ZSA8IHRrLT5taW5fcHRzaXplICkKLSAgICAgICAgKmtlcm5pbmcgPSB0ay0+bWluX2tlcm47Ci0gICAgICBlbHNlIGlmICggcHRzaXplID4gdGstPm1heF9wdHNpemUgKQotICAgICAgICAqa2VybmluZyA9IHRrLT5tYXhfa2VybjsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmtlcm5pbmcgPSBGVF9NdWxEaXYoIHB0c2l6ZSAtIHRrLT5taW5fcHRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGstPm1heF9rZXJuIC0gdGstPm1pbl9rZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGstPm1heF9wdHNpemUgLSB0ay0+bWluX3B0c2l6ZSApICsKLSAgICAgICAgICAgICAgICAgICB0ay0+bWluX2tlcm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0jZWxzZSAvKiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTSAqLwotCi0gIC8qIEFOU0kgQyBkb2Vzbid0IGxpa2UgZW1wdHkgc291cmNlIGZpbGVzICovCi0gIHR5cGVkZWYgaW50ICBfdDFfYWZtX2R1bW15OwotCi0jZW5kaWYgLyogVDFfQ09ORklHX09QVElPTl9OT19BRk0gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MWFmbS5oIGIvc3JjL3R5cGUxL3QxYWZtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNjJjZDAuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGUxL3QxYWZtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWFmbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQUZNIHN1cHBvcnQgZm9yIFR5cGUgMSBmb250cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVDFBRk1fSF8KLSNkZWZpbmUgVDFBRk1fSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidDFvYmpzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfUmVhZF9NZXRyaWNzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFQxX0RvbmVfTWV0cmljcyggRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgQUZNX0ZvbnRJbmZvICBmaSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDFfR2V0X0tlcm5pbmcoIEFGTV9Gb250SW5mbyAgZmksCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoMSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGgyLAotICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICBrZXJuaW5nICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfR2V0X1RyYWNrX0tlcm5pbmcoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgcHRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGtlcm5pbmcgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVDFBRk1fSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MWRyaXZlci5jIGIvc3JjL3R5cGUxL3QxZHJpdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDg5OTQuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGUxL3QxZHJpdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFkcml2ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJ0MWRyaXZlci5oIgotI2luY2x1ZGUgInQxZ2xvYWQuaCIKLSNpbmNsdWRlICJ0MWxvYWQuaCIKLQotI2luY2x1ZGUgInQxZXJyb3JzLmgiCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLSNpbmNsdWRlICJ0MWFmbS5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0gKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0tFUk5JTkdfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFkcml2ZXIKLQotIC8qCi0gICogIEdMWVBIIERJQ1QgU0VSVklDRQotICAqCi0gICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHQxX2dldF9nbHlwaF9uYW1lKCBUMV9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICkKLSAgewotICAgIEZUX1NUUkNQWU4oIGJ1ZmZlciwgZmFjZS0+dHlwZTEuZ2x5cGhfbmFtZXNbZ2x5cGhfaW5kZXhdLCBidWZmZXJfbWF4ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0MV9nZXRfbmFtZV9pbmRleCggVDFfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKQotICB7Ci0gICAgRlRfSW50ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2UtPnR5cGUxLm51bV9nbHlwaHM7IGkrKyApCi0gICAgewotICAgICAgRlRfU3RyaW5nKiAgZ25hbWUgPSBmYWNlLT50eXBlMS5nbHlwaF9uYW1lc1tpXTsKLQotCi0gICAgICBpZiAoICFmdF9zdHJjbXAoIGdseXBoX25hbWUsIGduYW1lICkgKQotICAgICAgICByZXR1cm4gKEZUX1VJbnQpaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjICB0MV9zZXJ2aWNlX2dseXBoX2RpY3QgPQotICB7Ci0gICAgKEZUX0dseXBoRGljdF9HZXROYW1lRnVuYykgIHQxX2dldF9nbHlwaF9uYW1lLCAgICAvKiBnZXRfbmFtZSAgICovCi0gICAgKEZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jKXQxX2dldF9uYW1lX2luZGV4ICAgICAvKiBuYW1lX2luZGV4ICovCi0gIH07Ci0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIHQxX2dldF9wc19uYW1lKCBUMV9GYWNlICBmYWNlICkKLSAgewotICAgIHJldHVybiAoY29uc3QgY2hhciopIGZhY2UtPnR5cGUxLmZvbnRfbmFtZTsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyAgdDFfc2VydmljZV9wc19uYW1lID0KLSAgewotICAgIChGVF9Qc05hbWVfR2V0RnVuYyl0MV9nZXRfcHNfbmFtZSAgICAgLyogZ2V0X3BzX2ZvbnRfbmFtZSAqLwotICB9OwotCi0KLSAgLyoKLSAgICogIE1VTFRJUExFIE1BU1RFUlMgU0VSVklDRQotICAgKgotICAgKi8KLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzUmVjICB0MV9zZXJ2aWNlX211bHRpX21hc3RlcnMgPQotICB7Ci0gICAgKEZUX0dldF9NTV9GdW5jKSAgICAgICAgVDFfR2V0X011bHRpX01hc3RlciwgICAvKiBnZXRfbW0gICAgICAgICAqLwotICAgIChGVF9TZXRfTU1fRGVzaWduX0Z1bmMpIFQxX1NldF9NTV9EZXNpZ24sICAgICAgLyogc2V0X21tX2Rlc2lnbiAgKi8KLSAgICAoRlRfU2V0X01NX0JsZW5kX0Z1bmMpICBUMV9TZXRfTU1fQmxlbmQsICAgICAgIC8qIHNldF9tbV9ibGVuZCAgICovCi0gICAgKEZUX0dldF9NTV9CbGVuZF9GdW5jKSAgVDFfR2V0X01NX0JsZW5kLCAgICAgICAvKiBnZXRfbW1fYmxlbmQgICAqLwotICAgIChGVF9HZXRfTU1fVmFyX0Z1bmMpICAgIFQxX0dldF9NTV9WYXIsICAgICAgICAgLyogZ2V0X21tX3ZhciAgICAgKi8KLSAgICAoRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYylUMV9TZXRfVmFyX0Rlc2lnbiwgICAgIC8qIHNldF92YXJfZGVzaWduICovCi0gICAgKEZUX0dldF9WYXJfRGVzaWduX0Z1bmMpVDFfR2V0X1Zhcl9EZXNpZ24sICAgICAvKiBnZXRfdmFyX2Rlc2lnbiAqLwotCi0gICAgKEZUX0dldF9WYXJfQmxlbmRfRnVuYykgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBnZXRfdmFyX2JsZW5kICAqLwotICAgIChGVF9Eb25lX0JsZW5kX0Z1bmMpICAgIFQxX0RvbmVfQmxlbmQgICAgICAgICAgLyogZG9uZV9ibGVuZCAgICAgKi8KLSAgfTsKLSNlbmRpZgotCi0KLSAgLyoKLSAgICogIFBPU1RTQ1JJUFQgSU5GTyBTRVJWSUNFCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0MV9wc19nZXRfZm9udF9pbmZvKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvUmVjKiAgYWZvbnRfaW5mbyApCi0gIHsKLSAgICAqYWZvbnRfaW5mbyA9ICgoVDFfRmFjZSlmYWNlKS0+dHlwZTEuZm9udF9pbmZvOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHQxX3BzX2dldF9mb250X2V4dHJhKCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEV4dHJhUmVjKiAgYWZvbnRfZXh0cmEgKQotICB7Ci0gICAgKmFmb250X2V4dHJhID0gKChUMV9GYWNlKWZhY2UpLT50eXBlMS5mb250X2V4dHJhOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0ludAotICB0MV9wc19oYXNfZ2x5cGhfbmFtZXMoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBmYWNlICk7Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHQxX3BzX2dldF9mb250X3ByaXZhdGUoIEZUX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlUmVjKiAgYWZvbnRfcHJpdmF0ZSApCi0gIHsKLSAgICAqYWZvbnRfcHJpdmF0ZSA9ICgoVDFfRmFjZSlmYWNlKS0+dHlwZTEucHJpdmF0ZV9kaWN0OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0xvbmcKLSAgdDFfcHNfZ2V0X2ZvbnRfdmFsdWUoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTX0RpY3RfS2V5cyAga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICB2YWx1ZV9sZW5fICkKLSAgewotICAgIEZUX1VMb25nICByZXR2YWwgICAgPSAwOyAvKiBhbHdheXMgPj0gMSBpZiB2YWxpZCAqLwotICAgIEZUX1VMb25nICB2YWx1ZV9sZW4gPSB2YWx1ZV9sZW5fIDwgMCA/IDAgOiAoRlRfVUxvbmcpdmFsdWVfbGVuXzsKLQotICAgIFQxX0ZhY2UgIHQxZmFjZSA9IChUMV9GYWNlKWZhY2U7Ci0gICAgVDFfRm9udCAgdHlwZTEgID0gJnQxZmFjZS0+dHlwZTE7Ci0KLQotICAgIHN3aXRjaCAoIGtleSApCi0gICAgewotICAgIGNhc2UgUFNfRElDVF9GT05UX1RZUEU6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+Zm9udF90eXBlICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9CeXRlICopdmFsdWUpID0gdHlwZTEtPmZvbnRfdHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0ZPTlRfTUFUUklYOgotICAgICAgaWYgKCBpZHggPCBzaXplb2YgKCB0eXBlMS0+Zm9udF9tYXRyaXggKSAvCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mICggdHlwZTEtPmZvbnRfbWF0cml4Lnh4ICkgKQotICAgICAgewotICAgICAgICBGVF9GaXhlZCAgdmFsID0gMDsKLQotCi0gICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHZhbCApOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoICggaWR4ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgdmFsID0gdHlwZTEtPmZvbnRfbWF0cml4Lnh4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgdmFsID0gdHlwZTEtPmZvbnRfbWF0cml4Lnh5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgdmFsID0gdHlwZTEtPmZvbnRfbWF0cml4Lnl4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgdmFsID0gdHlwZTEtPmZvbnRfbWF0cml4Lnl5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgICooKEZUX0ZpeGVkICopdmFsdWUpID0gdmFsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9GT05UX0JCT1g6Ci0gICAgICBpZiAoIGlkeCA8IHNpemVvZiAoIHR5cGUxLT5mb250X2Jib3ggKSAvCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mICggdHlwZTEtPmZvbnRfYmJveC54TWluICkgKQotICAgICAgewotICAgICAgICBGVF9GaXhlZCAgdmFsID0gMDsKLQotCi0gICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHZhbCApOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoICggaWR4ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgdmFsID0gdHlwZTEtPmZvbnRfYmJveC54TWluOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgdmFsID0gdHlwZTEtPmZvbnRfYmJveC55TWluOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgdmFsID0gdHlwZTEtPmZvbnRfYmJveC54TWF4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgdmFsID0gdHlwZTEtPmZvbnRfYmJveC55TWF4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgICooKEZUX0ZpeGVkICopdmFsdWUpID0gdmFsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9QQUlOVF9UWVBFOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnBhaW50X3R5cGUgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0J5dGUgKil2YWx1ZSkgPSB0eXBlMS0+cGFpbnRfdHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0ZPTlRfTkFNRToKLSAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfbmFtZSApICsgMTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9uYW1lICksIHJldHZhbCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfVU5JUVVFX0lEOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC51bmlxdWVfaWQgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0ludCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QudW5pcXVlX2lkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTlVNX0NIQVJfU1RSSU5HUzoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5udW1fZ2x5cGhzICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9JbnQgKil2YWx1ZSkgPSB0eXBlMS0+bnVtX2dseXBoczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0NIQVJfU1RSSU5HX0tFWToKLSAgICAgIGlmICggaWR4IDwgKEZUX1VJbnQpdHlwZTEtPm51bV9nbHlwaHMgKQotICAgICAgewotICAgICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5nbHlwaF9uYW1lc1tpZHhdICkgKyAxOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICB7Ci0gICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5nbHlwaF9uYW1lc1tpZHhdICksIHJldHZhbCApOwotICAgICAgICAgICgoRlRfQ2hhciAqKXZhbHVlKVtyZXR2YWwgLSAxXSA9IChGVF9DaGFyKSdcMCc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0NIQVJfU1RSSU5HOgotICAgICAgaWYgKCBpZHggPCAoRlRfVUludCl0eXBlMS0+bnVtX2dseXBocyApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IHR5cGUxLT5jaGFyc3RyaW5nc19sZW5baWR4XSArIDE7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIHsKLSAgICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmNoYXJzdHJpbmdzW2lkeF0gKSwKLSAgICAgICAgICAgICAgICAgICAgIHJldHZhbCAtIDEgKTsKLSAgICAgICAgICAoKEZUX0NoYXIgKil2YWx1ZSlbcmV0dmFsIC0gMV0gPSAoRlRfQ2hhciknXDAnOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9FTkNPRElOR19UWVBFOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPmVuY29kaW5nX3R5cGUgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKFQxX0VuY29kaW5nVHlwZSAqKXZhbHVlKSA9IHR5cGUxLT5lbmNvZGluZ190eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfRU5DT0RJTkdfRU5UUlk6Ci0gICAgICBpZiAoIHR5cGUxLT5lbmNvZGluZ190eXBlID09IFQxX0VOQ09ESU5HX1RZUEVfQVJSQVkgJiYKLSAgICAgICAgICAgaWR4IDwgKEZUX1VJbnQpdHlwZTEtPmVuY29kaW5nLm51bV9jaGFycyAgICAgICApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZVtpZHhdICkgKyAxOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICB7Ci0gICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5lbmNvZGluZy5jaGFyX25hbWVbaWR4XSApLAotICAgICAgICAgICAgICAgICAgICAgcmV0dmFsIC0gMSApOwotICAgICAgICAgICgoRlRfQ2hhciAqKXZhbHVlKVtyZXR2YWwgLSAxXSA9IChGVF9DaGFyKSdcMCc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX05VTV9TVUJSUzoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5udW1fc3VicnMgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0ludCAqKXZhbHVlKSA9IHR5cGUxLT5udW1fc3VicnM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9TVUJSOgotICAgICAgewotICAgICAgICBGVF9Cb29sICBvayA9IDA7Ci0KLQotICAgICAgICBpZiAoIHR5cGUxLT5zdWJyc19oYXNoICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGNvbnZlcnQgc3ViciBpbmRleCB0byBhcnJheSBpbmRleCAqLwotICAgICAgICAgIHNpemVfdCogIHZhbCA9IGZ0X2hhc2hfbnVtX2xvb2t1cCggKEZUX0ludClpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlMS0+c3VicnNfaGFzaCApOwotCi0KLSAgICAgICAgICBpZiAoIHZhbCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWR4ID0gKnZhbDsKLSAgICAgICAgICAgIG9rICA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggaWR4IDwgKEZUX1VJbnQpdHlwZTEtPm51bV9zdWJycyApCi0gICAgICAgICAgICBvayA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG9rICkKLSAgICAgICAgewotICAgICAgICAgIHJldHZhbCA9IHR5cGUxLT5zdWJyc19sZW5baWR4XSArIDE7Ci0gICAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPnN1YnJzW2lkeF0gKSwgcmV0dmFsIC0gMSApOwotICAgICAgICAgICAgKChGVF9DaGFyICopdmFsdWUpW3JldHZhbCAtIDFdID0gKEZUX0NoYXIpJ1wwJzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1NURF9IVzoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3Quc3RhbmRhcmRfd2lkdGhbMF0gKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX1VTaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3Quc3RhbmRhcmRfd2lkdGhbMF07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9TVERfVlc6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LnN0YW5kYXJkX2hlaWdodFswXSApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfVVNob3J0ICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5zdGFuZGFyZF9oZWlnaHRbMF07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9OVU1fQkxVRV9WQUxVRVM6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9ibHVlX3ZhbHVlcyApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfQnl0ZSAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX2JsdWVfdmFsdWVzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfQkxVRV9WQUxVRToKLSAgICAgIGlmICggaWR4IDwgdHlwZTEtPnByaXZhdGVfZGljdC5udW1fYmx1ZV92YWx1ZXMgKQotICAgICAgewotICAgICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LmJsdWVfdmFsdWVzW2lkeF0gKTsKLSAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgICAqKChGVF9TaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QuYmx1ZV92YWx1ZXNbaWR4XTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0JMVUVfU0NBTEU6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LmJsdWVfc2NhbGUgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0ZpeGVkICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5ibHVlX3NjYWxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfQkxVRV9GVVpaOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5ibHVlX2Z1enogKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0ludCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QuYmx1ZV9mdXp6OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfQkxVRV9TSElGVDoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QuYmx1ZV9zaGlmdCApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfSW50ICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5ibHVlX3NoaWZ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTlVNX09USEVSX0JMVUVTOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5udW1fb3RoZXJfYmx1ZXMgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0J5dGUgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9vdGhlcl9ibHVlczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX09USEVSX0JMVUU6Ci0gICAgICBpZiAoIGlkeCA8IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX290aGVyX2JsdWVzICkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5vdGhlcl9ibHVlc1tpZHhdICk7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICAgKigoRlRfU2hvcnQgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm90aGVyX2JsdWVzW2lkeF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9OVU1fRkFNSUxZX0JMVUVTOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5udW1fZmFtaWx5X2JsdWVzICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9CeXRlICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5udW1fZmFtaWx5X2JsdWVzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfRkFNSUxZX0JMVUU6Ci0gICAgICBpZiAoIGlkeCA8IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX2ZhbWlseV9ibHVlcyApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QuZmFtaWx5X2JsdWVzW2lkeF0gKTsKLSAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgICAqKChGVF9TaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QuZmFtaWx5X2JsdWVzW2lkeF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9OVU1fRkFNSUxZX09USEVSX0JMVUVTOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5udW1fZmFtaWx5X290aGVyX2JsdWVzICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9CeXRlICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5udW1fZmFtaWx5X290aGVyX2JsdWVzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfRkFNSUxZX09USEVSX0JMVUU6Ci0gICAgICBpZiAoIGlkeCA8IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX2ZhbWlseV9vdGhlcl9ibHVlcyApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QuZmFtaWx5X290aGVyX2JsdWVzW2lkeF0gKTsKLSAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgICAqKChGVF9TaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QuZmFtaWx5X290aGVyX2JsdWVzW2lkeF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9OVU1fU1RFTV9TTkFQX0g6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9zbmFwX3dpZHRocyApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfQnl0ZSAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX3NuYXBfd2lkdGhzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfU1RFTV9TTkFQX0g6Ci0gICAgICBpZiAoIGlkeCA8IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX3NuYXBfd2lkdGhzICkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5zbmFwX3dpZHRoc1tpZHhdICk7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICAgKigoRlRfU2hvcnQgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0LnNuYXBfd2lkdGhzW2lkeF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9OVU1fU1RFTV9TTkFQX1Y6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9zbmFwX2hlaWdodHMgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0J5dGUgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9zbmFwX2hlaWdodHM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9TVEVNX1NOQVBfVjoKLSAgICAgIGlmICggaWR4IDwgdHlwZTEtPnByaXZhdGVfZGljdC5udW1fc25hcF9oZWlnaHRzICkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5zbmFwX2hlaWdodHNbaWR4XSApOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAgICooKEZUX1Nob3J0ICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5zbmFwX2hlaWdodHNbaWR4XTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1JORF9TVEVNX1VQOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5yb3VuZF9zdGVtX3VwICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9Cb29sICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5yb3VuZF9zdGVtX3VwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfRk9SQ0VfQk9MRDoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QuZm9yY2VfYm9sZCApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfQm9vbCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QuZm9yY2VfYm9sZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX01JTl9GRUFUVVJFOgotICAgICAgaWYgKCBpZHggPCBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm1pbl9mZWF0dXJlICkgLwotICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QubWluX2ZlYXR1cmVbMF0gKSApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QubWluX2ZlYXR1cmVbaWR4XSApOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAgICooKEZUX1Nob3J0ICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5taW5fZmVhdHVyZVtpZHhdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTEVOX0lWOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5sZW5JViApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfSW50ICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5sZW5JVjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1BBU1NXT1JEOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5wYXNzd29yZCApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfTG9uZyAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QucGFzc3dvcmQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9MQU5HVUFHRV9HUk9VUDoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QubGFuZ3VhZ2VfZ3JvdXAgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0xvbmcgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0Lmxhbmd1YWdlX2dyb3VwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfSVNfRklYRURfUElUQ0g6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+Zm9udF9pbmZvLmlzX2ZpeGVkX3BpdGNoICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9Cb29sICopdmFsdWUpID0gdHlwZTEtPmZvbnRfaW5mby5pc19maXhlZF9waXRjaDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1VOREVSTElORV9QT1NJVElPTjoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5mb250X2luZm8udW5kZXJsaW5lX3Bvc2l0aW9uICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9TaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5mb250X2luZm8udW5kZXJsaW5lX3Bvc2l0aW9uOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfVU5ERVJMSU5FX1RISUNLTkVTUzoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5mb250X2luZm8udW5kZXJsaW5lX3RoaWNrbmVzcyApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfVVNob3J0ICopdmFsdWUpID0gdHlwZTEtPmZvbnRfaW5mby51bmRlcmxpbmVfdGhpY2tuZXNzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfRlNfVFlQRToKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5mb250X2V4dHJhLmZzX3R5cGUgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX1VTaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5mb250X2V4dHJhLmZzX3R5cGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9WRVJTSU9OOgotICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLnZlcnNpb24gKSArIDE7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmZvbnRfaW5mby52ZXJzaW9uICksIHJldHZhbCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTk9USUNFOgotICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLm5vdGljZSApICsgMTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLm5vdGljZSApLCByZXR2YWwgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0ZVTExfTkFNRToKLSAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby5mdWxsX25hbWUgKSArIDE7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmZvbnRfaW5mby5mdWxsX25hbWUgKSwgcmV0dmFsICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9GQU1JTFlfTkFNRToKLSAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby5mYW1pbHlfbmFtZSApICsgMTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLmZhbWlseV9uYW1lICksIHJldHZhbCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfV0VJR0hUOgotICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLndlaWdodCApICsgMTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLndlaWdodCApLCByZXR2YWwgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0lUQUxJQ19BTkdMRToKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5mb250X2luZm8uaXRhbGljX2FuZ2xlICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9Mb25nICopdmFsdWUpID0gdHlwZTEtPmZvbnRfaW5mby5pdGFsaWNfYW5nbGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsID09IDAgPyAtMSA6IChGVF9Mb25nKXJldHZhbDsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNJbmZvUmVjICB0MV9zZXJ2aWNlX3BzX2luZm8gPQotICB7Ci0gICAgKFBTX0dldEZvbnRJbmZvRnVuYykgICB0MV9wc19nZXRfZm9udF9pbmZvLCAgICAvKiBwc19nZXRfZm9udF9pbmZvICAgICovCi0gICAgKFBTX0dldEZvbnRFeHRyYUZ1bmMpICB0MV9wc19nZXRfZm9udF9leHRyYSwgICAvKiBwc19nZXRfZm9udF9leHRyYSAgICovCi0gICAgKFBTX0hhc0dseXBoTmFtZXNGdW5jKSB0MV9wc19oYXNfZ2x5cGhfbmFtZXMsICAvKiBwc19oYXNfZ2x5cGhfbmFtZXMgICovCi0gICAgKFBTX0dldEZvbnRQcml2YXRlRnVuYyl0MV9wc19nZXRfZm9udF9wcml2YXRlLCAvKiBwc19nZXRfZm9udF9wcml2YXRlICovCi0gICAgKFBTX0dldEZvbnRWYWx1ZUZ1bmMpICB0MV9wc19nZXRfZm9udF92YWx1ZSwgICAvKiBwc19nZXRfZm9udF92YWx1ZSAgICovCi0gIH07Ci0KLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9LZXJuaW5nUmVjICB0MV9zZXJ2aWNlX2tlcm5pbmcgPQotICB7Ci0gICAgVDFfR2V0X1RyYWNrX0tlcm5pbmcsICAgICAgIC8qIGdldF90cmFjayAqLwotICB9OwotI2VuZGlmCi0KLQotICAvKgotICAgKiAgU0VSVklDRSBMSVNUCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgdDFfc2VydmljZXNbXSA9Ci0gIHsKLSAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZ0MV9zZXJ2aWNlX3BzX25hbWUgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCwgICAgICAgICAgICZ0MV9zZXJ2aWNlX2dseXBoX2RpY3QgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX1RZUEVfMSB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJnQxX3NlcnZpY2VfcHNfaW5mbyB9LAotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0gICAgeyBGVF9TRVJWSUNFX0lEX0tFUk5JTkcsICAgICAgICAgICAgICAmdDFfc2VydmljZV9rZXJuaW5nIH0sCi0jZW5kaWYKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLSAgICB7IEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUywgICAgICAgICZ0MV9zZXJ2aWNlX211bHRpX21hc3RlcnMgfSwKLSNlbmRpZgotICAgIHsgTlVMTCwgTlVMTCB9Ci0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX01vZHVsZV9JbnRlcmZhY2UgKQotICBHZXRfSW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgICAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHQxX2ludGVyZmFjZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1vZHVsZSApOwotCi0gICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIHQxX3NlcnZpY2VzLCB0MV9pbnRlcmZhY2UgKTsKLSAgfQotCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXRfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byByZXR1cm4gdGhlIGtlcm5pbmcgdmVjdG9yIGJldHdlZW4gdHdvICAgICAgKi8KLSAgLyogICAgZ2x5cGhzIG9mIHRoZSBzYW1lIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0X2dseXBoICA6OiBUaGUgaW5kZXggb2YgdGhlIGxlZnQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJpZ2h0X2dseXBoIDo6IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGtlcm5pbmcgICAgIDo6IFRoZSBrZXJuaW5nIHZlY3Rvci4gIFRoaXMgaXMgaW4gZm9udCB1bml0cyBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLCBhbmQgaW4gcGl4ZWxzIGZvciBmaXhlZC1zaXplcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBob3Jpem9udGFsIGxheW91dHMgKGxlZnQtdG8tcmlnaHQgJiByaWdodC10by1sZWZ0KSBhcmUgICAgICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGlzIGZ1bmN0aW9uLiAgT3RoZXIgbGF5b3V0cywgb3IgbW9yZSBzb3BoaXN0aWNhdGVkICAqLwotICAvKiAgICBrZXJuaW5ncyBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAgICAgKi8KLSAgLyogICAgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIHNpbXBsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGV5IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBHZXRfS2VybmluZyggRlRfRmFjZSAgICAgdDFmYWNlLCAgICAgICAgLyogVDFfRmFjZSAqLwotICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAga2VybmluZyApCi0gIHsKLSAgICBUMV9GYWNlICBmYWNlID0gKFQxX0ZhY2UpdDFmYWNlOwotCi0KLSAgICBrZXJuaW5nLT54ID0gMDsKLSAgICBrZXJuaW5nLT55ID0gMDsKLQotICAgIGlmICggZmFjZS0+YWZtX2RhdGEgKQotICAgICAgVDFfR2V0X0tlcm5pbmcoIChBRk1fRm9udEluZm8pZmFjZS0+YWZtX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICBrZXJuaW5nICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotI2VuZGlmIC8qIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNICovCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICB0MV9kcml2ZXJfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICAgIHwKLSAgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIsCi0KLSAgICAgIHNpemVvZiAoIEZUX0RyaXZlclJlYyApLAotCi0gICAgICAidHlwZTEiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgTlVMTCwgICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICBUMV9Ecml2ZXJfSW5pdCwgICAgICAgICAgIC8qIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgbW9kdWxlX2luaXQgICAqLwotICAgICAgVDFfRHJpdmVyX0RvbmUsICAgICAgICAgICAvKiBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgIG1vZHVsZV9kb25lICAgKi8KLSAgICAgIEdldF9JbnRlcmZhY2UsICAgICAgICAgICAgLyogRlRfTW9kdWxlX1JlcXVlc3RlciAgICBnZXRfaW50ZXJmYWNlICovCi0gICAgfSwKLQotICAgIHNpemVvZiAoIFQxX0ZhY2VSZWMgKSwKLSAgICBzaXplb2YgKCBUMV9TaXplUmVjICksCi0gICAgc2l6ZW9mICggVDFfR2x5cGhTbG90UmVjICksCi0KLSAgICBUMV9GYWNlX0luaXQsICAgICAgICAgICAgICAgLyogRlRfRmFjZV9Jbml0RnVuYyAgaW5pdF9mYWNlICovCi0gICAgVDFfRmFjZV9Eb25lLCAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfRG9uZUZ1bmMgIGRvbmVfZmFjZSAqLwotICAgIFQxX1NpemVfSW5pdCwgICAgICAgICAgICAgICAvKiBGVF9TaXplX0luaXRGdW5jICBpbml0X3NpemUgKi8KLSAgICBUMV9TaXplX0RvbmUsICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9Eb25lRnVuYyAgZG9uZV9zaXplICovCi0gICAgVDFfR2x5cGhTbG90X0luaXQsICAgICAgICAgIC8qIEZUX1Nsb3RfSW5pdEZ1bmMgIGluaXRfc2xvdCAqLwotICAgIFQxX0dseXBoU2xvdF9Eb25lLCAgICAgICAgICAvKiBGVF9TbG90X0RvbmVGdW5jICBkb25lX3Nsb3QgKi8KLQotICAgIFQxX0xvYWRfR2x5cGgsICAgICAgICAgICAgICAvKiBGVF9TbG90X0xvYWRGdW5jICBsb2FkX2dseXBoICovCi0KLSNpZmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEtlcm5pbmdGdW5jICAgZ2V0X2tlcm5pbmcgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfQXR0YWNoRnVuYyAgICAgICBhdHRhY2hfZmlsZSAgKi8KLSNlbHNlCi0gICAgR2V0X0tlcm5pbmcsICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfR2V0S2VybmluZ0Z1bmMgICBnZXRfa2VybmluZyAgKi8KLSAgICBUMV9SZWFkX01ldHJpY3MsICAgICAgICAgICAgLyogRlRfRmFjZV9BdHRhY2hGdW5jICAgICAgIGF0dGFjaF9maWxlICAqLwotI2VuZGlmCi0gICAgVDFfR2V0X0FkdmFuY2VzLCAgICAgICAgICAgIC8qIEZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jICBnZXRfYWR2YW5jZXMgKi8KLQotICAgIFQxX1NpemVfUmVxdWVzdCwgICAgICAgICAgICAvKiBGVF9TaXplX1JlcXVlc3RGdW5jICByZXF1ZXN0X3NpemUgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9TZWxlY3RGdW5jICAgc2VsZWN0X3NpemUgICovCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFkcml2ZXIuaCBiL3NyYy90eXBlMS90MWRyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTI3ODY0Li4wMDAwMDAwCi0tLSBhL3NyYy90eXBlMS90MWRyaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFkcml2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgVHlwZSAxIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFQxRFJJVkVSX0hfCi0jZGVmaW5lIFQxRFJJVkVSX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgKSAgdDFfZHJpdmVyX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFQxRFJJVkVSX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFlcnJvcnMuaCBiL3NyYy90eXBlMS90MWVycm9ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJkYmI0Li4wMDAwMDAwCi0tLSBhL3NyYy90eXBlMS90MWVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBUeXBlIDEgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBUMUVSUk9SU19IXwotI2RlZmluZSBUMUVSUk9SU19IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBUMV9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfVHlwZTEKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIFQxRVJST1JTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFnbG9hZC5jIGIvc3JjL3R5cGUxL3QxZ2xvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmMTliNi4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTEvdDFnbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxZ2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgR2x5cGggTG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidDFnbG9hZC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLSNpbmNsdWRlICJ0MWVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFnbG9hZAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgQ09NUFVURSBUSEUgTUFYSU1VTSBBRFZBTkNFIFdJRFRIICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGluIGNoYXJnZSBvZiBjb21wdXRpbmcgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIHRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGZvbnQuICBJdCAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBxdWlja2x5IHByb2Nlc3NlcyBlYWNoIGdseXBoIGNoYXJzdHJpbmcgdG8gICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSBlaXRoZXIgYSBgc2J3JyBvciBgc2VhYycgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIG9wZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGF0YSogICAgY2hhcl9zdHJpbmcgKQotICB7Ci0gICAgVDFfRmFjZSAgIGZhY2UgID0gKFQxX0ZhY2UpZGVjb2Rlci0+YnVpbGRlci5mYWNlOwotICAgIFQxX0ZvbnQgICB0eXBlMSA9ICZmYWNlLT50eXBlMTsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjICppbmMgPQotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZTsKLSNlbmRpZgotCi0KLSAgICBkZWNvZGVyLT5mb250X21hdHJpeCA9IHR5cGUxLT5mb250X21hdHJpeDsKLSAgICBkZWNvZGVyLT5mb250X29mZnNldCA9IHR5cGUxLT5mb250X29mZnNldDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotICAgIC8qIEZvciBpbmNyZW1lbnRhbCBmb250cyBnZXQgdGhlIGNoYXJhY3RlciBkYXRhIHVzaW5nIHRoZSAqLwotICAgIC8qIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggaW5jICkKLSAgICAgIGVycm9yID0gaW5jLT5mdW5jcy0+Z2V0X2dseXBoX2RhdGEoIGluYy0+b2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsIGNoYXJfc3RyaW5nICk7Ci0gICAgZWxzZQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gICAgLyogRm9yIG9yZGluYXJ5IGZvbnRzIGdldCB0aGUgY2hhcmFjdGVyIGRhdGEgc3RvcmVkIGluIHRoZSBmYWNlIHJlY29yZC4gKi8KLSAgICB7Ci0gICAgICBjaGFyX3N0cmluZy0+cG9pbnRlciA9IHR5cGUxLT5jaGFyc3RyaW5nc1tnbHlwaF9pbmRleF07Ci0gICAgICBjaGFyX3N0cmluZy0+bGVuZ3RoICA9IChGVF9JbnQpdHlwZTEtPmNoYXJzdHJpbmdzX2xlbltnbHlwaF9pbmRleF07Ci0gICAgfQotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgZXJyb3IgPSBkZWNvZGVyLT5mdW5jcy5wYXJzZV9jaGFyc3RyaW5ncygKLSAgICAgICAgICAgICAgICBkZWNvZGVyLCAoRlRfQnl0ZSopY2hhcl9zdHJpbmctPnBvaW50ZXIsCi0gICAgICAgICAgICAgICAgKEZUX1VJbnQpY2hhcl9zdHJpbmctPmxlbmd0aCApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgLyogSW5jcmVtZW50YWwgZm9udHMgY2FuIG9wdGlvbmFsbHkgb3ZlcnJpZGUgdGhlIG1ldHJpY3MuICovCi0gICAgaWYgKCAhZXJyb3IgJiYgaW5jICYmIGluYy0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzICkKLSAgICB7Ci0gICAgICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjICBtZXRyaWNzOwotCi0KLSAgICAgIG1ldHJpY3MuYmVhcmluZ194ID0gRklYRURfVE9fSU5UKCBkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZy54ICk7Ci0gICAgICBtZXRyaWNzLmJlYXJpbmdfeSA9IDA7Ci0gICAgICBtZXRyaWNzLmFkdmFuY2UgICA9IEZJWEVEX1RPX0lOVCggZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlLnggKTsKLSAgICAgIG1ldHJpY3MuYWR2YW5jZV92ID0gRklYRURfVE9fSU5UKCBkZWNvZGVyLT5idWlsZGVyLmFkdmFuY2UueSApOwotCi0gICAgICBlcnJvciA9IGluYy0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzKCBpbmMtPm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBGQUxTRSwgJm1ldHJpY3MgKTsKLQotICAgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IElOVF9UT19GSVhFRCggbWV0cmljcy5iZWFyaW5nX3ggKTsKLSAgICAgIGRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZS54ICAgICAgPSBJTlRfVE9fRklYRUQoIG1ldHJpY3MuYWR2YW5jZSApOwotICAgICAgZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlLnkgICAgICA9IElOVF9UT19GSVhFRCggbWV0cmljcy5hZHZhbmNlX3YgKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUMV9QYXJzZV9HbHlwaCggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4ICkKLSAgewotICAgIEZUX0RhdGEgICBnbHlwaF9kYXRhOwotICAgIEZUX0Vycm9yICBlcnJvciA9IFQxX1BhcnNlX0dseXBoX0FuZF9HZXRfQ2hhcl9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLCBnbHlwaF9pbmRleCwgJmdseXBoX2RhdGEgKTsKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIFQxX0ZhY2UgIGZhY2UgPSAoVDFfRmFjZSlkZWNvZGVyLT5idWlsZGVyLmZhY2U7Ci0KLQotICAgICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5mcmVlX2dseXBoX2RhdGEoCi0gICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5vYmplY3QsCi0gICAgICAgICAgJmdseXBoX2RhdGEgKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9Db21wdXRlX01heF9BZHZhbmNlKCBUMV9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtYXhfYWR2YW5jZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLSAgICBUMV9EZWNvZGVyUmVjICBkZWNvZGVyOwotICAgIEZUX0ludCAgICAgICAgIGdseXBoX2luZGV4OwotICAgIFQxX0ZvbnQgICAgICAgIHR5cGUxID0gJmZhY2UtPnR5cGUxOwotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0KLQotICAgIEZUX0FTU0VSVCggKCBmYWNlLT5sZW5fYnVpbGRjaGFyID09IDAgKSA9PSAoIGZhY2UtPmJ1aWxkY2hhciA9PSBOVUxMICkgKTsKLQotICAgICptYXhfYWR2YW5jZSA9IDA7Ci0KLSAgICAvKiBpbml0aWFsaXplIGxvYWQgZGVjb2RlciAqLwotICAgIGVycm9yID0gcHNhdXgtPnQxX2RlY29kZXJfZnVuY3MtPmluaXQoICZkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9GYWNlKWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogc2l6ZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGdseXBoIHNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKXR5cGUxLT5nbHlwaF9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9QYXJzZV9HbHlwaCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZGVjb2Rlci5idWlsZGVyLm1ldHJpY3Nfb25seSA9IDE7Ci0gICAgZGVjb2Rlci5idWlsZGVyLmxvYWRfcG9pbnRzICA9IDA7Ci0KLSAgICBkZWNvZGVyLm51bV9zdWJycyAgICAgPSB0eXBlMS0+bnVtX3N1YnJzOwotICAgIGRlY29kZXIuc3VicnMgICAgICAgICA9IHR5cGUxLT5zdWJyczsKLSAgICBkZWNvZGVyLnN1YnJzX2xlbiAgICAgPSB0eXBlMS0+c3VicnNfbGVuOwotICAgIGRlY29kZXIuc3VicnNfaGFzaCAgICA9IHR5cGUxLT5zdWJyc19oYXNoOwotCi0gICAgZGVjb2Rlci5idWlsZGNoYXIgICAgID0gZmFjZS0+YnVpbGRjaGFyOwotICAgIGRlY29kZXIubGVuX2J1aWxkY2hhciA9IGZhY2UtPmxlbl9idWlsZGNoYXI7Ci0KLSAgICAqbWF4X2FkdmFuY2UgPSAwOwotCi0gICAgLyogZm9yIGVhY2ggZ2x5cGgsIHBhcnNlIHRoZSBnbHlwaCBjaGFyc3RyaW5nIGFuZCBleHRyYWN0ICovCi0gICAgLyogdGhlIGFkdmFuY2Ugd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggZ2x5cGhfaW5kZXggPSAwOyBnbHlwaF9pbmRleCA8IHR5cGUxLT5udW1fZ2x5cGhzOyBnbHlwaF9pbmRleCsrICkKLSAgICB7Ci0gICAgICAvKiBub3cgZ2V0IGxvYWQgdGhlIHVuc2NhbGVkIG91dGxpbmUgKi8KLSAgICAgICh2b2lkKVQxX1BhcnNlX0dseXBoKCAmZGVjb2RlciwgKEZUX1VJbnQpZ2x5cGhfaW5kZXggKTsKLSAgICAgIGlmICggZ2x5cGhfaW5kZXggPT0gMCB8fCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ID4gKm1heF9hZHZhbmNlICkKLSAgICAgICAgKm1heF9hZHZhbmNlID0gZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueDsKLQotICAgICAgLyogaWdub3JlIHRoZSBlcnJvciBpZiBvbmUgb2NjdXJyZWQgLSBza2lwIHRvIG5leHQgZ2x5cGggKi8KLSAgICB9Ci0KLSAgICBwc2F1eC0+dDFfZGVjb2Rlcl9mdW5jcy0+ZG9uZSggJmRlY29kZXIgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9HZXRfQWR2YW5jZXMoIEZUX0ZhY2UgICAgdDFmYWNlLCAgICAgICAgLyogVDFfRmFjZSAqLwotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcyApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgICBmYWNlICA9IChUMV9GYWNlKXQxZmFjZTsKLSAgICBUMV9EZWNvZGVyUmVjICBkZWNvZGVyOwotICAgIFQxX0ZvbnQgICAgICAgIHR5cGUxID0gJmZhY2UtPnR5cGUxOwotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0gICAgRlRfVUludCAgICAgICAgbm47Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICB7Ci0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgICAgICBhZHZhbmNlc1tubl0gPSAwOwotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIGVycm9yID0gcHNhdXgtPnQxX2RlY29kZXJfZnVuY3MtPmluaXQoICZkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9GYWNlKWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogc2l6ZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGdseXBoIHNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKXR5cGUxLT5nbHlwaF9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9QYXJzZV9HbHlwaCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZGVjb2Rlci5idWlsZGVyLm1ldHJpY3Nfb25seSA9IDE7Ci0gICAgZGVjb2Rlci5idWlsZGVyLmxvYWRfcG9pbnRzICA9IDA7Ci0KLSAgICBkZWNvZGVyLm51bV9zdWJycyAgPSB0eXBlMS0+bnVtX3N1YnJzOwotICAgIGRlY29kZXIuc3VicnMgICAgICA9IHR5cGUxLT5zdWJyczsKLSAgICBkZWNvZGVyLnN1YnJzX2xlbiAgPSB0eXBlMS0+c3VicnNfbGVuOwotICAgIGRlY29kZXIuc3VicnNfaGFzaCA9IHR5cGUxLT5zdWJyc19oYXNoOwotCi0gICAgZGVjb2Rlci5idWlsZGNoYXIgICAgID0gZmFjZS0+YnVpbGRjaGFyOwotICAgIGRlY29kZXIubGVuX2J1aWxkY2hhciA9IGZhY2UtPmxlbl9idWlsZGNoYXI7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgIHsKLSAgICAgIGVycm9yID0gVDFfUGFyc2VfR2x5cGgoICZkZWNvZGVyLCBmaXJzdCArIG5uICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGFkdmFuY2VzW25uXSA9IEZJWEVEX1RPX0lOVCggZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueCApOwotICAgICAgZWxzZQotICAgICAgICBhZHZhbmNlc1tubl0gPSAwOwotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9Mb2FkX0dseXBoKCBGVF9HbHlwaFNsb3QgIHQxZ2x5cGgsICAgICAgICAgIC8qIFQxX0dseXBoU2xvdCAqLwotICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHQxc2l6ZSwgICAgICAgICAgIC8qIFQxX1NpemUgICAgICAqLwotICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgVDFfR2x5cGhTbG90ICAgICAgICAgICAgZ2x5cGggPSAoVDFfR2x5cGhTbG90KXQxZ2x5cGg7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgVDFfRGVjb2RlclJlYyAgICAgICAgICAgZGVjb2RlcjsKLSAgICBUMV9GYWNlICAgICAgICAgICAgICAgICBmYWNlID0gKFQxX0ZhY2UpdDFnbHlwaC0+ZmFjZTsKLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgICBoaW50aW5nOwotICAgIFQxX0ZvbnQgICAgICAgICAgICAgICAgIHR5cGUxICAgICAgICAgPSAmZmFjZS0+dHlwZTE7Ci0gICAgUFNBdXhfU2VydmljZSAgICAgICAgICAgcHNhdXggICAgICAgICA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotICAgIGNvbnN0IFQxX0RlY29kZXJfRnVuY3MgIGRlY29kZXJfZnVuY3MgPSBwc2F1eC0+dDFfZGVjb2Rlcl9mdW5jczsKLQotICAgIEZUX01hdHJpeCAgICAgICAgICAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgIGZvbnRfb2Zmc2V0OwotICAgIEZUX0RhdGEgICAgICAgICAgICAgICAgIGdseXBoX2RhdGE7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgbXVzdF9maW5pc2hfZGVjb2RlciA9IEZBTFNFOwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgICBnbHlwaF9kYXRhX2xvYWRlZCA9IDA7Ci0jZW5kaWYKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGlmICggZ2x5cGhfaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICYmCi0gICAgICAgICAhZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICAgKQotI2Vsc2UKLSAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTEoKCAiVDFfTG9hZF9HbHlwaDogZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwotCi0gICAgRlRfQVNTRVJUKCAoIGZhY2UtPmxlbl9idWlsZGNoYXIgPT0gMCApID09ICggZmFjZS0+YnVpbGRjaGFyID09IE5VTEwgKSApOwotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORzsKLQotICAgIGlmICggdDFzaXplICkKLSAgICB7Ci0gICAgICBnbHlwaC0+eF9zY2FsZSA9IHQxc2l6ZS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgZ2x5cGgtPnlfc2NhbGUgPSB0MXNpemUtPm1ldHJpY3MueV9zY2FsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGdseXBoLT54X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBnbHlwaC0+eV9zY2FsZSA9IDB4MTAwMDBMOwotICAgIH0KLQotICAgIHQxZ2x5cGgtPm91dGxpbmUubl9wb2ludHMgICA9IDA7Ci0gICAgdDFnbHlwaC0+b3V0bGluZS5uX2NvbnRvdXJzID0gMDsKLQotICAgIGhpbnRpbmcgPSBGVF9CT09MKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICAgKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApID09IDAgKTsKLQotICAgIHQxZ2x5cGgtPmZvcm1hdCA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotCi0gICAgZXJyb3IgPSBkZWNvZGVyX2Z1bmNzLT5pbml0KCAmZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxZ2x5cGgtPmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MWdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKil0eXBlMS0+Z2x5cGhfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JPT0woIGhpbnRpbmcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BhcnNlX0dseXBoICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBtdXN0X2ZpbmlzaF9kZWNvZGVyID0gVFJVRTsKLQotICAgIGRlY29kZXIuYnVpbGRlci5ub19yZWN1cnNlID0gRlRfQk9PTCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkgIT0gMCApOwotCi0gICAgZGVjb2Rlci5udW1fc3VicnMgICAgID0gdHlwZTEtPm51bV9zdWJyczsKLSAgICBkZWNvZGVyLnN1YnJzICAgICAgICAgPSB0eXBlMS0+c3VicnM7Ci0gICAgZGVjb2Rlci5zdWJyc19sZW4gICAgID0gdHlwZTEtPnN1YnJzX2xlbjsKLSAgICBkZWNvZGVyLnN1YnJzX2hhc2ggICAgPSB0eXBlMS0+c3VicnNfaGFzaDsKLQotICAgIGRlY29kZXIuYnVpbGRjaGFyICAgICA9IGZhY2UtPmJ1aWxkY2hhcjsKLSAgICBkZWNvZGVyLmxlbl9idWlsZGNoYXIgPSBmYWNlLT5sZW5fYnVpbGRjaGFyOwotCi0gICAgLyogbm93IGxvYWQgdGhlIHVuc2NhbGVkIG91dGxpbmUgKi8KLSAgICBlcnJvciA9IFQxX1BhcnNlX0dseXBoX0FuZF9HZXRfQ2hhcl9TdHJpbmcoICZkZWNvZGVyLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaF9kYXRhICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGdseXBoX2RhdGFfbG9hZGVkID0gMTsKLSNlbmRpZgotCi0gICAgZm9udF9tYXRyaXggPSBkZWNvZGVyLmZvbnRfbWF0cml4OwotICAgIGZvbnRfb2Zmc2V0ID0gZGVjb2Rlci5mb250X29mZnNldDsKLQotICAgIC8qIHNhdmUgbmV3IGdseXBoIHRhYmxlcyAqLwotICAgIGRlY29kZXJfZnVuY3MtPmRvbmUoICZkZWNvZGVyICk7Ci0KLSAgICBtdXN0X2ZpbmlzaF9kZWNvZGVyID0gRkFMU0U7Ci0KLSAgICAvKiBub3csIHNldCB0aGUgbWV0cmljcyAtLSB0aGlzIGlzIHJhdGhlciBzaW1wbGUsIGFzICAgKi8KLSAgICAvKiB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgaXMgdGhlIHhNaW4sIGFuZCB0aGUgdG9wIHNpZGUgKi8KLSAgICAvKiBiZWFyaW5nIHRoZSB5TWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgdDFnbHlwaC0+b3V0bGluZS5mbGFncyAmPSBGVF9PVVRMSU5FX09XTkVSOwotICAgICAgdDFnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTDsKLQotICAgICAgLyogZm9yIGNvbXBvc2l0ZSBnbHlwaHMsIHJldHVybiBvbmx5IGxlZnQgc2lkZSBiZWFyaW5nIGFuZCAqLwotICAgICAgLyogYWR2YW5jZSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICAgIHsKLSAgICAgICAgRlRfU2xvdF9JbnRlcm5hbCAgaW50ZXJuYWwgPSB0MWdseXBoLT5pbnRlcm5hbDsKLQotCi0gICAgICAgIHQxZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYID0KLSAgICAgICAgICBGSVhFRF9UT19JTlQoIGRlY29kZXIuYnVpbGRlci5sZWZ0X2JlYXJpbmcueCApOwotICAgICAgICB0MWdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlICA9Ci0gICAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ICk7Ci0KLSAgICAgICAgaW50ZXJuYWwtPmdseXBoX21hdHJpeCAgICAgID0gZm9udF9tYXRyaXg7Ci0gICAgICAgIGludGVybmFsLT5nbHlwaF9kZWx0YSAgICAgICA9IGZvbnRfb2Zmc2V0OwotICAgICAgICBpbnRlcm5hbC0+Z2x5cGhfdHJhbnNmb3JtZWQgPSAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9CQm94ICAgICAgICAgICAgY2JveDsKLSAgICAgICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgPSAmdDFnbHlwaC0+bWV0cmljczsKLQotCi0gICAgICAgIC8qIGNvcHkgdGhlIF91bnNjYWxlZF8gYWR2YW5jZSB3aWR0aCAqLwotICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9Ci0gICAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ICk7Ci0gICAgICAgIHQxZ2x5cGgtPmxpbmVhckhvcmlBZHZhbmNlID0KLSAgICAgICAgICBGSVhFRF9UT19JTlQoIGRlY29kZXIuYnVpbGRlci5hZHZhbmNlLnggKTsKLSAgICAgICAgdDFnbHlwaC0+aW50ZXJuYWwtPmdseXBoX3RyYW5zZm9ybWVkID0gMDsKLQotICAgICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtYWtlIHVwIHZlcnRpY2FsIG9uZXMgKi8KLSAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSA9ICggZmFjZS0+dHlwZTEuZm9udF9iYm94LnlNYXggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50eXBlMS5mb250X2Jib3gueU1pbiApID4+IDE2OwotICAgICAgICAgIHQxZ2x5cGgtPmxpbmVhclZlcnRBZHZhbmNlID0gbWV0cmljcy0+dmVydEFkdmFuY2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPQotICAgICAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS55ICk7Ci0gICAgICAgICAgdDFnbHlwaC0+bGluZWFyVmVydEFkdmFuY2UgPQotICAgICAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS55ICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0MWdseXBoLT5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsKLQotICAgICAgICBpZiAoIHQxc2l6ZSAmJiB0MXNpemUtPm1ldHJpY3MueV9wcGVtIDwgMjQgKQotICAgICAgICAgIHQxZ2x5cGgtPm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTjsKLQotI2lmIDEKLSAgICAgICAgLyogYXBwbHkgdGhlIGZvbnQgbWF0cml4LCBpZiBhbnkgKi8KLSAgICAgICAgaWYgKCBmb250X21hdHJpeC54eCAhPSAweDEwMDAwTCB8fCBmb250X21hdHJpeC55eSAhPSAweDEwMDAwTCB8fAotICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh5ICE9IDAgICAgICAgIHx8IGZvbnRfbWF0cml4Lnl4ICE9IDAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmdDFnbHlwaC0+b3V0bGluZSwgJmZvbnRfbWF0cml4ICk7Ci0KLSAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9IEZUX011bEZpeCggbWV0cmljcy0+aG9yaUFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh4ICk7Ci0gICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPnZlcnRBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X21hdHJpeC55eSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBmb250X29mZnNldC54IHx8IGZvbnRfb2Zmc2V0LnkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZ0MWdseXBoLT5vdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC55ICk7Ci0KLSAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSArPSBmb250X29mZnNldC54OwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICs9IGZvbnRfb2Zmc2V0Lnk7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlmICggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc2NhbGUgdGhlIG91dGxpbmUgYW5kIHRoZSBtZXRyaWNzICovCi0gICAgICAgICAgRlRfSW50ICAgICAgIG47Ci0gICAgICAgICAgRlRfT3V0bGluZSogIGN1ciA9IGRlY29kZXIuYnVpbGRlci5iYXNlOwotICAgICAgICAgIEZUX1ZlY3RvciogICB2ZWMgPSBjdXItPnBvaW50czsKLSAgICAgICAgICBGVF9GaXhlZCAgICAgeF9zY2FsZSA9IGdseXBoLT54X3NjYWxlOwotICAgICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlID0gZ2x5cGgtPnlfc2NhbGU7Ci0KLQotICAgICAgICAgIC8qIEZpcnN0IG9mIGFsbCwgc2NhbGUgdGhlIHBvaW50cywgaWYgd2UgYXJlIG5vdCBoaW50aW5nICovCi0gICAgICAgICAgaWYgKCAhaGludGluZyB8fCAhIGRlY29kZXIuYnVpbGRlci5oaW50c19mdW5jcyApCi0gICAgICAgICAgICBmb3IgKCBuID0gY3VyLT5uX3BvaW50czsgbiA+IDA7IG4tLSwgdmVjKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2ZWMtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApOwotICAgICAgICAgICAgICB2ZWMtPnkgPSBGVF9NdWxGaXgoIHZlYy0+eSwgeV9zY2FsZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgLyogVGhlbiBzY2FsZSB0aGUgbWV0cmljcyAqLwotICAgICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT5ob3JpQWR2YW5jZSwgeF9zY2FsZSApOwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwgeV9zY2FsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgb3RoZXIgbWV0cmljcyAqLwotICAgICAgICBGVF9PdXRsaW5lX0dldF9DQm94KCAmdDFnbHlwaC0+b3V0bGluZSwgJmNib3ggKTsKLQotICAgICAgICBtZXRyaWNzLT53aWR0aCAgPSBjYm94LnhNYXggLSBjYm94LnhNaW47Ci0gICAgICAgIG1ldHJpY3MtPmhlaWdodCA9IGNib3gueU1heCAtIGNib3gueU1pbjsKLQotICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBjYm94LnhNaW47Ci0gICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IGNib3gueU1heDsKLQotICAgICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtYWtlIHVwIHZlcnRpY2FsIG9uZXMgKi8KLSAgICAgICAgICBmdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MoIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNldCBjb250cm9sIGRhdGEgdG8gdGhlIGdseXBoIGNoYXJzdHJpbmdzLiAgTm90ZSB0aGF0IHRoaXMgaXMgKi8KLSAgICAgIC8qIF9ub3RfIHplcm8tdGVybWluYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHQxZ2x5cGgtPmNvbnRyb2xfZGF0YSA9IChGVF9CeXRlKilnbHlwaF9kYXRhLnBvaW50ZXI7Ci0gICAgICB0MWdseXBoLT5jb250cm9sX2xlbiAgPSBnbHlwaF9kYXRhLmxlbmd0aDsKLSAgICB9Ci0KLQotICBFeGl0OgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGlmICggZ2x5cGhfZGF0YV9sb2FkZWQgJiYgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICkKLSAgICB7Ci0gICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5mcmVlX2dseXBoX2RhdGEoCi0gICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAmZ2x5cGhfZGF0YSApOwotCi0gICAgICAvKiBTZXQgdGhlIGNvbnRyb2wgZGF0YSB0byBudWxsIC0gaXQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBpZiAgICovCi0gICAgICAvKiBsb2FkZWQgaW5jcmVtZW50YWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB0MWdseXBoLT5jb250cm9sX2RhdGEgPSBOVUxMOwotICAgICAgdDFnbHlwaC0+Y29udHJvbF9sZW4gID0gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICggbXVzdF9maW5pc2hfZGVjb2RlciApCi0gICAgICBkZWNvZGVyX2Z1bmNzLT5kb25lKCAmZGVjb2RlciApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFnbG9hZC5oIGIvc3JjL3R5cGUxL3QxZ2xvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0ZDVlNy4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTEvdDFnbG9hZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFnbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFQxR0xPQURfSF8KLSNkZWZpbmUgVDFHTE9BRF9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInQxb2Jqcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfQ29tcHV0ZV9NYXhfQWR2YW5jZSggVDFfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgbWF4X2FkdmFuY2UgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9HZXRfQWR2YW5jZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGZpcnN0LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWR2YW5jZXMgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9Mb2FkX0dseXBoKCBGVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFQxR0xPQURfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MWxvYWQuYyBiL3NyYy90eXBlMS90MWxvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2OWQ2Yi4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTEvdDFsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxbG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgZm9udCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgdGhlIG5ldyBhbmQgaW1wcm92ZWQgVHlwZSAxIGRhdGEgbG9hZGVyIGZvciBGcmVlVHlwZSAyLiAgVGhlICAqLwotICAvKiBvbGQgbG9hZGVyIGhhcyBzZXZlcmFsIHByb2JsZW1zOiBpdCBpcyBzbG93LCBjb21wbGV4LCBkaWZmaWN1bHQgdG8gICAgKi8KLSAgLyogbWFpbnRhaW4sIGFuZCBjb250YWlucyBpbmNyZWRpYmxlIGhhY2tzIHRvIG1ha2UgaXQgYWNjZXB0IHNvbWUgICAgICAgICovCi0gIC8qIGlsbC1mb3JtZWQgVHlwZSAxIGZvbnRzIHdpdGhvdXQgaGljY3VwLWluZy4gIE1vcmVvdmVyLCBhYm91dCA1JSBvZiAgICAqLwotICAvKiB0aGUgVHlwZSAxIGZvbnRzIG9uIG15IG1hY2hpbmUgc3RpbGwgYXJlbid0IGxvYWRlZCBjb3JyZWN0bHkgYnkgaXQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgdmVyc2lvbiBpcyBtdWNoIHNpbXBsZXIsIG11Y2ggZmFzdGVyIGFuZCBhbHNvIGVhc2llciB0byByZWFkIGFuZCAqLwotICAvKiBtYWludGFpbiBieSBhIGdyZWF0IG9yZGVyIG9mIG1hZ25pdHVkZS4gIFRoZSBpZGVhIGJlaGluZCBpdCBpcyB0byAgICAgKi8KLSAgLyogX25vdF8gdHJ5IHRvIHJlYWQgdGhlIFR5cGUgMSB0b2tlbiBzdHJlYW0gd2l0aCBhIHN0YXRlIG1hY2hpbmUgKGkuZS4gICovCi0gIC8qIGEgUG9zdHNjcmlwdC1saWtlIGludGVycHJldGVyKSBidXQgcmF0aGVyIHRvIHBlcmZvcm0gc2ltcGxlIHBhdHRlcm4gICAqLwotICAvKiBtYXRjaGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluZGVlZCwgbmVhcmx5IGFsbCBkYXRhIGRlZmluaXRpb25zIGZvbGxvdyBhIHNpbXBsZSBwYXR0ZXJuIGxpa2UgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC4uLiAvRmllbGQgPGRhdGE+IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiB3aGVyZSA8ZGF0YT4gY2FuIGJlIGEgbnVtYmVyLCBhIGJvb2xlYW4sIGEgc3RyaW5nLCBvciBhbiBhcnJheSBvZiAgICAgKi8KLSAgLyogbnVtYmVycy4gIFRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zLCBuYW1lbHkgdGhlIGVuY29kaW5nLCBmb250IG5hbWUsICovCi0gIC8qIGNoYXJzdHJpbmdzLCBhbmQgc3VicnM7IHRoZXkgYXJlIGhhbmRsZWQgd2l0aCBhIHNwZWNpYWwgcGF0dGVybiAgICAgICAqLwotICAvKiBtYXRjaGluZyByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbCBvdGhlciBjb21tb24gY2FzZXMgYXJlIGhhbmRsZWQgdmVyeSBzaW1wbHkuICBUaGUgbWF0Y2hpbmcgcnVsZXMgICAqLwotICAvKiBhcmUgZGVmaW5lZCBpbiB0aGUgZmlsZSBgdDF0b2tlbnMuaCcgdGhyb3VnaCB0aGUgdXNlIG9mIHNldmVyYWwgICAgICAgKi8KLSAgLyogbWFjcm9zIGNhbGxzIFBBUlNFX1hYWC4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCB0d2ljZSBoZXJlOyB0aGUgZmlyc3QgICovCi0gIC8qIHRpbWUgdG8gZ2VuZXJhdGUgcGFyc2luZyBjYWxsYmFjayBmdW5jdGlvbnMsIHRoZSBzZWNvbmQgdGltZSB0byAgICAgICAqLwotICAvKiBnZW5lcmF0ZSBhIHRhYmxlIG9mIGtleXdvcmRzICh3aXRoIHBvaW50ZXJzIHRvIHRoZSBhc3NvY2lhdGVkICAgICAgICAgKi8KLSAgLyogY2FsbGJhY2sgZnVuY3Rpb25zKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZnVuY3Rpb24gYHBhcnNlX2RpY3QnIHNpbXBseSBzY2FucyAqbGluZWFybHkqIGEgZ2l2ZW4gZGljdGlvbmFyeSAgKi8KLSAgLyogKGVpdGhlciB0aGUgdG9wLWxldmVsIG9yIHByaXZhdGUgb25lKSBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlICAgICAgICovCi0gIC8qIGNhbGxiYWNrIHdoZW4gaXQgZW5jb3VudGVycyBhbiBpbW1lZGlhdGUga2V5d29yZC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyBieSBmYXIgdGhlIGZhc3Rlc3Qgd2F5IG9uZSBjYW4gZmluZCB0byBwYXJzZSBhbmQgcmVhZCBhbGwgICAgICovCi0gIC8qIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBsZWQgdG8gdHJlbWVuZG91cyBjb2RlIHNpemUgcmVkdWN0aW9uLiAgTm90ZSB0aGF0IGxhdGVyLCB0aGUgICAgICovCi0gIC8qIGdseXBoIGxvYWRlciB3aWxsIGFsc28gYmUgX2dyZWF0bHlfIHNpbXBsaWZpZWQsIGFuZCB0aGUgYXV0b21hdGljICAgICAqLwotICAvKiBoaW50ZXIgd2lsbCByZXBsYWNlIHRoZSBjbHVtc3kgYHQxaGludGVyJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfSEFTSF9ICi0KLSNpbmNsdWRlICJ0MWxvYWQuaCIKLSNpbmNsdWRlICJ0MWVycm9ycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0jZGVmaW5lIElTX0lOQ1JFTUVOVEFMICAoRlRfQm9vbCkoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSAhPSAwICkKLSNlbHNlCi0jZGVmaW5lIElTX0lOQ1JFTUVOVEFMICAwCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3QxbG9hZAotCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIE1VTFRJUExFIE1BU1RFUlMgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdDFfYWxsb2NhdGVfYmxlbmQoIFQxX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBudW1fZGVzaWducywKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIG51bV9heGlzICkKLSAgewotICAgIFBTX0JsZW5kICAgYmxlbmQ7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLQotCi0gICAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKLSAgICBpZiAoICFibGVuZCApCi0gICAgewotICAgICAgaWYgKCBGVF9ORVcoIGJsZW5kICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGJsZW5kLT5udW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yID0gMDsKLQotICAgICAgZmFjZS0+YmxlbmQgPSBibGVuZDsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBkZXNpZ24gZGF0YSBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIG51bV9kZXNpZ25zID4gMCApCi0gICAgewotICAgICAgaWYgKCBibGVuZC0+bnVtX2Rlc2lnbnMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIG5uOwotCi0KLSAgICAgICAgLyogYWxsb2NhdGUgdGhlIGJsZW5kIGBwcml2YXRlJyBhbmQgYGZvbnRfaW5mbycgZGljdGlvbmFyaWVzICovCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+Zm9udF9pbmZvc1sxXSwgbnVtX2Rlc2lnbnMgICAgICkgfHwKLSAgICAgICAgICAgICBGVF9ORVdfQVJSQVkoIGJsZW5kLT5wcml2YXRlcyAgWzFdLCBudW1fZGVzaWducyAgICAgKSB8fAotICAgICAgICAgICAgIEZUX05FV19BUlJBWSggYmxlbmQtPmJib3hlcyAgICBbMV0sIG51bV9kZXNpZ25zICAgICApIHx8Ci0gICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCBibGVuZC0+d2VpZ2h0X3ZlY3RvciwgbnVtX2Rlc2lnbnMgKiAyICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBibGVuZC0+ZGVmYXVsdF93ZWlnaHRfdmVjdG9yID0gYmxlbmQtPndlaWdodF92ZWN0b3IgKyBudW1fZGVzaWduczsKLQotICAgICAgICBibGVuZC0+Zm9udF9pbmZvc1swXSA9ICZmYWNlLT50eXBlMS5mb250X2luZm87Ci0gICAgICAgIGJsZW5kLT5wcml2YXRlcyAgWzBdID0gJmZhY2UtPnR5cGUxLnByaXZhdGVfZGljdDsKLSAgICAgICAgYmxlbmQtPmJib3hlcyAgICBbMF0gPSAmZmFjZS0+dHlwZTEuZm9udF9iYm94OwotCi0gICAgICAgIGZvciAoIG5uID0gMjsgbm4gPD0gbnVtX2Rlc2lnbnM7IG5uKysgKQotICAgICAgICB7Ci0gICAgICAgICAgYmxlbmQtPmZvbnRfaW5mb3Nbbm5dID0gYmxlbmQtPmZvbnRfaW5mb3Nbbm4gLSAxXSArIDE7Ci0gICAgICAgICAgYmxlbmQtPnByaXZhdGVzICBbbm5dID0gYmxlbmQtPnByaXZhdGVzICBbbm4gLSAxXSArIDE7Ci0gICAgICAgICAgYmxlbmQtPmJib3hlcyAgICBbbm5dID0gYmxlbmQtPmJib3hlcyAgICBbbm4gLSAxXSArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBibGVuZC0+bnVtX2Rlc2lnbnMgPSBudW1fZGVzaWduczsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBibGVuZC0+bnVtX2Rlc2lnbnMgIT0gbnVtX2Rlc2lnbnMgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgYXhpcyBkYXRhIGlmIG5lZWRlZCAqLwotICAgIGlmICggbnVtX2F4aXMgPiAwICkKLSAgICB7Ci0gICAgICBpZiAoIGJsZW5kLT5udW1fYXhpcyAhPSAwICYmIGJsZW5kLT5udW1fYXhpcyAhPSBudW1fYXhpcyApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgYmxlbmQtPm51bV9heGlzID0gbnVtX2F4aXM7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgdGhlIGJsZW5kIGRlc2lnbiBwb3MgdGFibGUgaWYgbmVlZGVkICovCi0gICAgbnVtX2Rlc2lnbnMgPSBibGVuZC0+bnVtX2Rlc2lnbnM7Ci0gICAgbnVtX2F4aXMgICAgPSBibGVuZC0+bnVtX2F4aXM7Ci0gICAgaWYgKCBudW1fZGVzaWducyAmJiBudW1fYXhpcyAmJiBibGVuZC0+ZGVzaWduX3Bvc1swXSA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBuOwotCi0KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+ZGVzaWduX3Bvc1swXSwgbnVtX2Rlc2lnbnMgKiBudW1fYXhpcyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmb3IgKCBuID0gMTsgbiA8IG51bV9kZXNpZ25zOyBuKysgKQotICAgICAgICBibGVuZC0+ZGVzaWduX3Bvc1tuXSA9IGJsZW5kLT5kZXNpZ25fcG9zWzBdICsgbnVtX2F4aXMgKiBuOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9HZXRfTXVsdGlfTWFzdGVyKCBUMV9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWx0aV9NYXN0ZXIqICBtYXN0ZXIgKQotICB7Ci0gICAgUFNfQmxlbmQgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfVUludCAgIG47Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIGJsZW5kICkKLSAgICB7Ci0gICAgICBtYXN0ZXItPm51bV9heGlzICAgID0gYmxlbmQtPm51bV9heGlzOwotICAgICAgbWFzdGVyLT5udW1fZGVzaWducyA9IGJsZW5kLT5udW1fZGVzaWduczsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBibGVuZC0+bnVtX2F4aXM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX01NX0F4aXMqICAgYXhpcyA9IG1hc3Rlci0+YXhpcyArIG47Ci0gICAgICAgIFBTX0Rlc2lnbk1hcCAgbWFwID0gYmxlbmQtPmRlc2lnbl9tYXAgKyBuOwotCi0KLSAgICAgICAgYXhpcy0+bmFtZSAgICA9IGJsZW5kLT5heGlzX25hbWVzW25dOwotICAgICAgICBheGlzLT5taW5pbXVtID0gbWFwLT5kZXNpZ25fcG9pbnRzWzBdOwotICAgICAgICBheGlzLT5tYXhpbXVtID0gbWFwLT5kZXNpZ25fcG9pbnRzW21hcC0+bnVtX3BvaW50cyAtIDFdOwotICAgICAgfQotCi0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR2l2ZW4gYSBub3JtYWxpemVkIChibGVuZCkgY29vcmRpbmF0ZSwgZmlndXJlIG91dCB0aGUgZGVzaWduICAgICAgICAgICovCi0gIC8qIGNvb3JkaW5hdGUgYXBwcm9wcmlhdGUgZm9yIHRoYXQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIG1tX2F4aXNfdW5tYXAoIFBTX0Rlc2lnbk1hcCAgYXhpc21hcCwKLSAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICBuY3YgKQotICB7Ci0gICAgaW50ICBqOwotCi0KLSAgICBpZiAoIG5jdiA8PSBheGlzbWFwLT5ibGVuZF9wb2ludHNbMF0gKQotICAgICAgcmV0dXJuIElOVF9UT19GSVhFRCggYXhpc21hcC0+ZGVzaWduX3BvaW50c1swXSApOwotCi0gICAgZm9yICggaiA9IDE7IGogPCBheGlzbWFwLT5udW1fcG9pbnRzOyBqKysgKQotICAgIHsKLSAgICAgIGlmICggbmN2IDw9IGF4aXNtYXAtPmJsZW5kX3BvaW50c1tqXSApCi0gICAgICAgIHJldHVybiBJTlRfVE9fRklYRUQoIGF4aXNtYXAtPmRlc2lnbl9wb2ludHNbaiAtIDFdICkgKwotICAgICAgICAgICAgICAgKCBheGlzbWFwLT5kZXNpZ25fcG9pbnRzW2pdIC0gYXhpc21hcC0+ZGVzaWduX3BvaW50c1tqIC0gMV0gKSAqCi0gICAgICAgICAgICAgICBGVF9EaXZGaXgoIG5jdiAtIGF4aXNtYXAtPmJsZW5kX3BvaW50c1tqIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNtYXAtPmJsZW5kX3BvaW50c1tqXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc21hcC0+YmxlbmRfcG9pbnRzW2ogLSAxXSApOwotICAgIH0KLQotICAgIHJldHVybiBJTlRfVE9fRklYRUQoIGF4aXNtYXAtPmRlc2lnbl9wb2ludHNbYXhpc21hcC0+bnVtX3BvaW50cyAtIDFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR2l2ZW4gYSB2ZWN0b3Igb2Ygd2VpZ2h0cywgb25lIGZvciBlYWNoIGRlc2lnbiwgZmlndXJlIG91dCB0aGUgICAgICAgICovCi0gIC8qIG5vcm1hbGl6ZWQgYXhpcyBjb29yZGluYXRlcyB3aGljaCBnYXZlIHJpc2UgdG8gdGhvc2Ugd2VpZ2h0cy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgbW1fd2VpZ2h0c191bm1hcCggRlRfRml4ZWQqICB3ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGF4aXNjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgYXhpc19jb3VudCApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGF4aXNfY291bnQgPD0gVDFfTUFYX01NX0FYSVMgKTsKLQotICAgIGlmICggYXhpc19jb3VudCA9PSAxICkKLSAgICAgIGF4aXNjb29yZHNbMF0gPSB3ZWlnaHRzWzFdOwotCi0gICAgZWxzZSBpZiAoIGF4aXNfY291bnQgPT0gMiApCi0gICAgewotICAgICAgYXhpc2Nvb3Jkc1swXSA9IHdlaWdodHNbM10gKyB3ZWlnaHRzWzFdOwotICAgICAgYXhpc2Nvb3Jkc1sxXSA9IHdlaWdodHNbM10gKyB3ZWlnaHRzWzJdOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCBheGlzX2NvdW50ID09IDMgKQotICAgIHsKLSAgICAgIGF4aXNjb29yZHNbMF0gPSB3ZWlnaHRzWzddICsgd2VpZ2h0c1s1XSArIHdlaWdodHNbM10gKyB3ZWlnaHRzWzFdOwotICAgICAgYXhpc2Nvb3Jkc1sxXSA9IHdlaWdodHNbN10gKyB3ZWlnaHRzWzZdICsgd2VpZ2h0c1szXSArIHdlaWdodHNbMl07Ci0gICAgICBheGlzY29vcmRzWzJdID0gd2VpZ2h0c1s3XSArIHdlaWdodHNbNl0gKyB3ZWlnaHRzWzVdICsgd2VpZ2h0c1s0XTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgYXhpc2Nvb3Jkc1swXSA9IHdlaWdodHNbMTVdICsgd2VpZ2h0c1sxM10gKyB3ZWlnaHRzWzExXSArIHdlaWdodHNbOV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1s3XSArIHdlaWdodHNbNV0gKyB3ZWlnaHRzWzNdICsgd2VpZ2h0c1sxXTsKLSAgICAgIGF4aXNjb29yZHNbMV0gPSB3ZWlnaHRzWzE1XSArIHdlaWdodHNbMTRdICsgd2VpZ2h0c1sxMV0gKyB3ZWlnaHRzWzEwXSArCi0gICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzWzddICsgd2VpZ2h0c1s2XSArIHdlaWdodHNbM10gKyB3ZWlnaHRzWzJdOwotICAgICAgYXhpc2Nvb3Jkc1syXSA9IHdlaWdodHNbMTVdICsgd2VpZ2h0c1sxNF0gKyB3ZWlnaHRzWzEzXSArIHdlaWdodHNbMTJdICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHNbN10gKyB3ZWlnaHRzWzZdICsgd2VpZ2h0c1s1XSArIHdlaWdodHNbNF07Ci0gICAgICBheGlzY29vcmRzWzNdID0gd2VpZ2h0c1sxNV0gKyB3ZWlnaHRzWzE0XSArIHdlaWdodHNbMTNdICsgd2VpZ2h0c1sxMl0gKwotICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1sxMV0gKyB3ZWlnaHRzWzEwXSArIHdlaWdodHNbOV0gKyB3ZWlnaHRzWzhdOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBKdXN0IGEgd3JhcHBlciBhcm91bmQgVDFfR2V0X011bHRpX01hc3RlciB0byBzdXBwb3J0IHRoZSBkaWZmZXJlbnQgICAgKi8KLSAgLyogIGFyZ3VtZW50cyBuZWVkZWQgYnkgdGhlIEdYIHZhciBkaXN0b3J0YWJsZSBmb250cy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfR2V0X01NX1ZhciggVDFfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICptYXN0ZXIgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBGVF9NTV9WYXIgICAgICAgKm1tdmFyID0gTlVMTDsKLSAgICBGVF9NdWx0aV9NYXN0ZXIgIG1tYXN0ZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9VSW50ICAgICAgICAgIGk7Ci0gICAgRlRfRml4ZWQgICAgICAgICBheGlzY29vcmRzW1QxX01BWF9NTV9BWElTXTsKLSAgICBQU19CbGVuZCAgICAgICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0KLQotICAgIGVycm9yID0gVDFfR2V0X011bHRpX01hc3RlciggZmFjZSwgJm1tYXN0ZXIgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBpZiAoIEZUX0FMTE9DKCBtbXZhciwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGVF9NTV9WYXIgKSArCi0gICAgICAgICAgICAgICAgICAgICBtbWFzdGVyLm51bV9heGlzICogc2l6ZW9mICggRlRfVmFyX0F4aXMgKSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG1tdmFyLT5udW1fYXhpcyAgICAgICAgPSBtbWFzdGVyLm51bV9heGlzOwotICAgIG1tdmFyLT5udW1fZGVzaWducyAgICAgPSBtbWFzdGVyLm51bV9kZXNpZ25zOwotICAgIG1tdmFyLT5udW1fbmFtZWRzdHlsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBzdXBwb3J0ZWQgKi8KLSAgICBtbXZhci0+YXhpcyAgICAgICAgICAgID0gKEZUX1Zhcl9BeGlzKikmbW12YXJbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIGF4ZXMgYWZ0ZXIgTU1fVmFyIHN0cnVjdCAqLwotICAgIG1tdmFyLT5uYW1lZHN0eWxlICAgICAgPSBOVUxMOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBtbWFzdGVyLm51bV9heGlzOyBpKysgKQotICAgIHsKLSAgICAgIG1tdmFyLT5heGlzW2ldLm5hbWUgICAgPSBtbWFzdGVyLmF4aXNbaV0ubmFtZTsKLSAgICAgIG1tdmFyLT5heGlzW2ldLm1pbmltdW0gPSBJTlRfVE9fRklYRUQoIG1tYXN0ZXIuYXhpc1tpXS5taW5pbXVtICk7Ci0gICAgICBtbXZhci0+YXhpc1tpXS5tYXhpbXVtID0gSU5UX1RPX0ZJWEVEKCBtbWFzdGVyLmF4aXNbaV0ubWF4aW11bSApOwotICAgICAgbW12YXItPmF4aXNbaV0uZGVmICAgICA9ICggbW12YXItPmF4aXNbaV0ubWluaW11bSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tdmFyLT5heGlzW2ldLm1heGltdW0gKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgYXBwbHkuICBCdXQgdGhpcyB2YWx1ZSBpcyBpbiByYW5nZSAqLwotICAgICAgbW12YXItPmF4aXNbaV0uc3RyaWQgICA9IH4wVTsgICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgYXBwbHkgKi8KLSAgICAgIG1tdmFyLT5heGlzW2ldLnRhZyAgICAgPSB+MFU7ICAgICAgICAgICAgICAgICAgICAgIC8qIERvZXMgbm90IGFwcGx5ICovCi0KLSAgICAgIGlmICggIW1tdmFyLT5heGlzW2ldLm5hbWUgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBmdF9zdHJjbXAoIG1tdmFyLT5heGlzW2ldLm5hbWUsICJXZWlnaHQiICkgPT0gMCApCi0gICAgICAgIG1tdmFyLT5heGlzW2ldLnRhZyA9IEZUX01BS0VfVEFHKCAndycsICdnJywgJ2gnLCAndCcgKTsKLSAgICAgIGVsc2UgaWYgKCBmdF9zdHJjbXAoIG1tdmFyLT5heGlzW2ldLm5hbWUsICJXaWR0aCIgKSA9PSAwICkKLSAgICAgICAgbW12YXItPmF4aXNbaV0udGFnID0gRlRfTUFLRV9UQUcoICd3JywgJ2QnLCAndCcsICdoJyApOwotICAgICAgZWxzZSBpZiAoIGZ0X3N0cmNtcCggbW12YXItPmF4aXNbaV0ubmFtZSwgIk9wdGljYWxTaXplIiApID09IDAgKQotICAgICAgICBtbXZhci0+YXhpc1tpXS50YWcgPSBGVF9NQUtFX1RBRyggJ28nLCAncCcsICdzJywgJ3onICk7Ci0gICAgfQotCi0gICAgaWYgKCBibGVuZC0+bnVtX2Rlc2lnbnMgPT0gKCAxVSA8PCBibGVuZC0+bnVtX2F4aXMgKSApCi0gICAgewotICAgICAgbW1fd2VpZ2h0c191bm1hcCggYmxlbmQtPmRlZmF1bHRfd2VpZ2h0X3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+bnVtX2F4aXMgKTsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBtbWFzdGVyLm51bV9heGlzOyBpKysgKQotICAgICAgICBtbXZhci0+YXhpc1tpXS5kZWYgPSBtbV9heGlzX3VubWFwKCAmYmxlbmQtPmRlc2lnbl9tYXBbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNjb29yZHNbaV0gKTsKLSAgICB9Ci0KLSAgICAqbWFzdGVyID0gbW12YXI7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9TZXRfTU1fQmxlbmQoIFQxX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgUFNfQmxlbmQgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfVUludCAgIG4sIG07Ci0KLQotICAgIGlmICggIWJsZW5kICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBudW1fY29vcmRzID4gYmxlbmQtPm51bV9heGlzICkKLSAgICAgIG51bV9jb29yZHMgPSBibGVuZC0+bnVtX2F4aXM7Ci0KLSAgICAvKiByZWNvbXB1dGUgdGhlIHdlaWdodCB2ZWN0b3IgZnJvbSB0aGUgYmxlbmQgY29vcmRpbmF0ZXMgKi8KLSAgICBmb3IgKCBuID0gMDsgbiA8IGJsZW5kLT5udW1fZGVzaWduczsgbisrICkKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgcmVzdWx0ID0gMHgxMDAwMEw7ICAvKiAxLjAgZml4ZWQgKi8KLQotCi0gICAgICBmb3IgKCBtID0gMDsgbSA8IGJsZW5kLT5udW1fYXhpczsgbSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfRml4ZWQgIGZhY3RvcjsKLQotCi0gICAgICAgIC8qIGdldCBjdXJyZW50IGJsZW5kIGF4aXMgcG9zaXRpb247ICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogdXNlIGEgZGVmYXVsdCB2YWx1ZSBpZiB3ZSBkb24ndCBoYXZlIGEgY29vcmRpbmF0ZSAqLwotICAgICAgICBmYWN0b3IgPSBtIDwgbnVtX2Nvb3JkcyA/IGNvb3Jkc1ttXSA6IDB4ODAwMDsKLSAgICAgICAgaWYgKCBmYWN0b3IgPCAwICkKLSAgICAgICAgICBmYWN0b3IgPSAwOwotICAgICAgICBpZiAoIGZhY3RvciA+IDB4MTAwMDBMICkKLSAgICAgICAgICBmYWN0b3IgPSAweDEwMDAwTDsKLQotICAgICAgICBpZiAoICggbiAmICggMSA8PCBtICkgKSA9PSAwICkKLSAgICAgICAgICBmYWN0b3IgPSAweDEwMDAwTCAtIGZhY3RvcjsKLQotICAgICAgICByZXN1bHQgPSBGVF9NdWxGaXgoIHJlc3VsdCwgZmFjdG9yICk7Ci0gICAgICB9Ci0gICAgICBibGVuZC0+d2VpZ2h0X3ZlY3RvcltuXSA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfR2V0X01NX0JsZW5kKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIFBTX0JsZW5kICBibGVuZCA9IGZhY2UtPmJsZW5kOwotCi0gICAgRlRfRml4ZWQgIGF4aXNjb29yZHNbNF07Ci0gICAgRlRfVUludCAgIGksIG5jOwotCi0KLSAgICBpZiAoICFibGVuZCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIG1tX3dlaWdodHNfdW5tYXAoIGJsZW5kLT53ZWlnaHRfdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgIGF4aXNjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPm51bV9heGlzICk7Ci0KLSAgICBuYyA9IG51bV9jb29yZHM7Ci0gICAgaWYgKCBudW1fY29vcmRzID4gYmxlbmQtPm51bV9heGlzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiVDFfR2V0X01NX0JsZW5kOiBvbmx5IHVzaW5nIGZpcnN0ICVkIG9mICVkIGNvb3JkaW5hdGVzXG4iLAotICAgICAgICAgICAgICAgICAgYmxlbmQtPm51bV9heGlzLCBudW1fY29vcmRzICkpOwotICAgICAgbmMgPSBibGVuZC0+bnVtX2F4aXM7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBuYzsgaSsrICkKLSAgICAgIGNvb3Jkc1tpXSA9IGF4aXNjb29yZHNbaV07Ci0gICAgZm9yICggOyBpIDwgbnVtX2Nvb3JkczsgaSsrICkKLSAgICAgIGNvb3Jkc1tpXSA9IDB4ODAwMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9TZXRfTU1fRGVzaWduKCBUMV9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKQotICB7Ci0gICAgUFNfQmxlbmQgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfVUludCAgIG4sIHA7Ci0gICAgRlRfRml4ZWQgIGZpbmFsX2JsZW5kc1tUMV9NQVhfTU1fREVTSUdOU107Ci0KLQotICAgIGlmICggIWJsZW5kICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBudW1fY29vcmRzID4gYmxlbmQtPm51bV9heGlzICkKLSAgICAgIG51bV9jb29yZHMgPSBibGVuZC0+bnVtX2F4aXM7Ci0KLSAgICAvKiBjb21wdXRlIHRoZSBibGVuZCBjb29yZGluYXRlcyB0aHJvdWdoIHRoZSBibGVuZCBkZXNpZ24gbWFwICovCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGJsZW5kLT5udW1fYXhpczsgbisrICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICAgICAgIGRlc2lnbjsKLSAgICAgIEZUX0ZpeGVkICAgICAgdGhlX2JsZW5kOwotICAgICAgUFNfRGVzaWduTWFwICBtYXAgICAgID0gYmxlbmQtPmRlc2lnbl9tYXAgKyBuOwotICAgICAgRlRfTG9uZyogICAgICBkZXNpZ25zID0gbWFwLT5kZXNpZ25fcG9pbnRzOwotICAgICAgRlRfRml4ZWQqICAgICBibGVuZHMgID0gbWFwLT5ibGVuZF9wb2ludHM7Ci0gICAgICBGVF9JbnQgICAgICAgIGJlZm9yZSAgPSAtMSwgYWZ0ZXIgPSAtMTsKLQotCi0gICAgICAvKiB1c2UgYSBkZWZhdWx0IHZhbHVlIGlmIHdlIGRvbid0IGhhdmUgYSBjb29yZGluYXRlICovCi0gICAgICBpZiAoIG4gPCBudW1fY29vcmRzICkKLSAgICAgICAgZGVzaWduID0gY29vcmRzW25dOwotICAgICAgZWxzZQotICAgICAgICBkZXNpZ24gPSAoIGRlc2lnbnNbbWFwLT5udW1fcG9pbnRzIC0gMV0gLSBkZXNpZ25zWzBdICkgLyAyOwotCi0gICAgICBmb3IgKCBwID0gMDsgcCA8IChGVF9VSW50KW1hcC0+bnVtX3BvaW50czsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfTG9uZyAgcF9kZXNpZ24gPSBkZXNpZ25zW3BdOwotCi0KLSAgICAgICAgLyogZXhhY3QgbWF0Y2g/ICovCi0gICAgICAgIGlmICggZGVzaWduID09IHBfZGVzaWduICkKLSAgICAgICAgewotICAgICAgICAgIHRoZV9ibGVuZCA9IGJsZW5kc1twXTsKLSAgICAgICAgICBnb3RvIEZvdW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBkZXNpZ24gPCBwX2Rlc2lnbiApCi0gICAgICAgIHsKLSAgICAgICAgICBhZnRlciA9IChGVF9JbnQpcDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGJlZm9yZSA9IChGVF9JbnQpcDsKLSAgICAgIH0KLQotICAgICAgLyogbm93IGludGVycG9sYXRlIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKCBiZWZvcmUgPCAwICkKLSAgICAgICAgdGhlX2JsZW5kID0gYmxlbmRzWzBdOwotCi0gICAgICBlbHNlIGlmICggYWZ0ZXIgPCAwICkKLSAgICAgICAgdGhlX2JsZW5kID0gYmxlbmRzW21hcC0+bnVtX3BvaW50cyAtIDFdOwotCi0gICAgICBlbHNlCi0gICAgICAgIHRoZV9ibGVuZCA9IEZUX011bERpdiggZGVzaWduICAgICAgICAgLSBkZXNpZ25zW2JlZm9yZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRzIFthZnRlcl0gLSBibGVuZHMgW2JlZm9yZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduc1thZnRlcl0gLSBkZXNpZ25zW2JlZm9yZV0gKTsKLQotICAgIEZvdW5kOgotICAgICAgZmluYWxfYmxlbmRzW25dID0gdGhlX2JsZW5kOwotICAgIH0KLQotICAgIHJldHVybiBUMV9TZXRfTU1fQmxlbmQoIGZhY2UsIGJsZW5kLT5udW1fYXhpcywgZmluYWxfYmxlbmRzICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSnVzdCBhIHdyYXBwZXIgYXJvdW5kIFQxX1NldF9NTV9EZXNpZ24gdG8gc3VwcG9ydCB0aGUgZGlmZmVyZW50ICAgICAgICovCi0gIC8qIGFyZ3VtZW50cyBuZWVkZWQgYnkgdGhlIEdYIHZhciBkaXN0b3J0YWJsZSBmb250cy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQxX1NldF9WYXJfRGVzaWduKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICAgRlRfTG9uZyAgbGNvb3Jkc1tUMV9NQVhfTU1fQVhJU107Ci0gICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICBpZiAoIG51bV9jb29yZHMgPiBUMV9NQVhfTU1fQVhJUyApCi0gICAgICAgbnVtX2Nvb3JkcyA9IFQxX01BWF9NTV9BWElTOwotCi0gICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2Nvb3JkczsgaSsrICkKLSAgICAgICBsY29vcmRzW2ldID0gRklYRURfVE9fSU5UKCBjb29yZHNbaV0gKTsKLQotICAgICByZXR1cm4gVDFfU2V0X01NX0Rlc2lnbiggZmFjZSwgbnVtX2Nvb3JkcywgbGNvb3JkcyApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfR2V0X1Zhcl9EZXNpZ24oIFQxX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIFBTX0JsZW5kICBibGVuZCA9IGZhY2UtPmJsZW5kOwotCi0gICAgRlRfRml4ZWQgIGF4aXNjb29yZHNbNF07Ci0gICAgRlRfVUludCAgIGksIG5jOwotCi0KLSAgICBpZiAoICFibGVuZCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIG1tX3dlaWdodHNfdW5tYXAoIGJsZW5kLT53ZWlnaHRfdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgIGF4aXNjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPm51bV9heGlzICk7Ci0KLSAgICBuYyA9IG51bV9jb29yZHM7Ci0gICAgaWYgKCBudW1fY29vcmRzID4gYmxlbmQtPm51bV9heGlzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiVDFfR2V0X1Zhcl9EZXNpZ246IgotICAgICAgICAgICAgICAgICAgIiBvbmx5IHVzaW5nIGZpcnN0ICVkIG9mICVkIGNvb3JkaW5hdGVzXG4iLAotICAgICAgICAgICAgICAgICAgYmxlbmQtPm51bV9heGlzLCBudW1fY29vcmRzICkpOwotICAgICAgbmMgPSBibGVuZC0+bnVtX2F4aXM7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBuYzsgaSsrICkKLSAgICAgIGNvb3Jkc1tpXSA9IG1tX2F4aXNfdW5tYXAoICZibGVuZC0+ZGVzaWduX21hcFtpXSwgYXhpc2Nvb3Jkc1tpXSApOwotICAgIGZvciAoIDsgaSA8IG51bV9jb29yZHM7IGkrKyApCi0gICAgICBjb29yZHNbaV0gPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVDFfRG9uZV9CbGVuZCggVDFfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgIFBTX0JsZW5kICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0KLQotICAgIGlmICggYmxlbmQgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIG51bV9kZXNpZ25zID0gYmxlbmQtPm51bV9kZXNpZ25zOwotICAgICAgRlRfVUludCAgbnVtX2F4aXMgICAgPSBibGVuZC0+bnVtX2F4aXM7Ci0gICAgICBGVF9VSW50ICBuOwotCi0KLSAgICAgIC8qIHJlbGVhc2UgZGVzaWduIHBvcyB0YWJsZSAqLwotICAgICAgRlRfRlJFRSggYmxlbmQtPmRlc2lnbl9wb3NbMF0gKTsKLSAgICAgIGZvciAoIG4gPSAxOyBuIDwgbnVtX2Rlc2lnbnM7IG4rKyApCi0gICAgICAgIGJsZW5kLT5kZXNpZ25fcG9zW25dID0gTlVMTDsKLQotICAgICAgLyogcmVsZWFzZSBibGVuZCBgcHJpdmF0ZScgYW5kIGBmb250IGluZm8nIGRpY3Rpb25hcmllcyAqLwotICAgICAgRlRfRlJFRSggYmxlbmQtPnByaXZhdGVzWzFdICk7Ci0gICAgICBGVF9GUkVFKCBibGVuZC0+Zm9udF9pbmZvc1sxXSApOwotICAgICAgRlRfRlJFRSggYmxlbmQtPmJib3hlc1sxXSApOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9kZXNpZ25zOyBuKysgKQotICAgICAgewotICAgICAgICBibGVuZC0+cHJpdmF0ZXMgIFtuXSA9IE5VTEw7Ci0gICAgICAgIGJsZW5kLT5mb250X2luZm9zW25dID0gTlVMTDsKLSAgICAgICAgYmxlbmQtPmJib3hlcyAgICBbbl0gPSBOVUxMOwotICAgICAgfQotCi0gICAgICAvKiByZWxlYXNlIHdlaWdodCB2ZWN0b3JzICovCi0gICAgICBGVF9GUkVFKCBibGVuZC0+d2VpZ2h0X3ZlY3RvciApOwotICAgICAgYmxlbmQtPmRlZmF1bHRfd2VpZ2h0X3ZlY3RvciA9IE5VTEw7Ci0KLSAgICAgIC8qIHJlbGVhc2UgYXhpcyBuYW1lcyAqLwotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fYXhpczsgbisrICkKLSAgICAgICAgRlRfRlJFRSggYmxlbmQtPmF4aXNfbmFtZXNbbl0gKTsKLQotICAgICAgLyogcmVsZWFzZSBkZXNpZ24gbWFwICovCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9heGlzOyBuKysgKQotICAgICAgewotICAgICAgICBQU19EZXNpZ25NYXAgIGRtYXAgPSBibGVuZC0+ZGVzaWduX21hcCArIG47Ci0KLQotICAgICAgICBGVF9GUkVFKCBkbWFwLT5kZXNpZ25fcG9pbnRzICk7Ci0gICAgICAgIGRtYXAtPm51bV9wb2ludHMgPSAwOwotICAgICAgfQotCi0gICAgICBGVF9GUkVFKCBmYWNlLT5ibGVuZCApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2VfYmxlbmRfYXhpc190eXBlcyggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBUMV9Ub2tlblJlYyAgYXhpc190b2tlbnNbVDFfTUFYX01NX0FYSVNdOwotICAgIEZUX0ludCAgICAgICBuLCBudW1fYXhpczsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgUFNfQmxlbmQgICAgIGJsZW5kOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnk7Ci0KLQotICAgIC8qIHRha2UgYW4gYXJyYXkgb2Ygb2JqZWN0cyAqLwotICAgIFQxX1RvVG9rZW5BcnJheSggJmxvYWRlci0+cGFyc2VyLCBheGlzX3Rva2VucywKLSAgICAgICAgICAgICAgICAgICAgIFQxX01BWF9NTV9BWElTLCAmbnVtX2F4aXMgKTsKLSAgICBpZiAoIG51bV9heGlzIDwgMCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FUlIoIElnbm9yZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBpZiAoIG51bV9heGlzID09IDAgfHwgbnVtX2F4aXMgPiBUMV9NQVhfTU1fQVhJUyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicGFyc2VfYmxlbmRfYXhpc190eXBlczogaW5jb3JyZWN0IG51bWJlciBvZiBheGVzOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgbnVtX2F4aXMgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgYmxlbmQgaWYgbmVjZXNzYXJ5ICovCi0gICAgZXJyb3IgPSB0MV9hbGxvY2F0ZV9ibGVuZCggZmFjZSwgMCwgKEZUX1VJbnQpbnVtX2F4aXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGJsZW5kICA9IGZhY2UtPmJsZW5kOwotICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotCi0gICAgLyogZWFjaCB0b2tlbiBpcyBhbiBpbW1lZGlhdGUgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgYXhpcyAqLwotICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2F4aXM7IG4rKyApCi0gICAgewotICAgICAgVDFfVG9rZW4gIHRva2VuID0gYXhpc190b2tlbnMgKyBuOwotICAgICAgRlRfQnl0ZSogIG5hbWU7Ci0gICAgICBGVF9VSW50ICAgbGVuOwotCi0KLSAgICAgIC8qIHNraXAgZmlyc3Qgc2xhc2gsIGlmIGFueSAqLwotICAgICAgaWYgKCB0b2tlbi0+c3RhcnRbMF0gPT0gJy8nICkKLSAgICAgICAgdG9rZW4tPnN0YXJ0Kys7Ci0KLSAgICAgIGxlbiA9IChGVF9VSW50KSggdG9rZW4tPmxpbWl0IC0gdG9rZW4tPnN0YXJ0ICk7Ci0gICAgICBpZiAoIGxlbiA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIG5hbWUgPSAoRlRfQnl0ZSopYmxlbmQtPmF4aXNfbmFtZXNbbl07Ci0gICAgICBpZiAoIG5hbWUgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAicGFyc2VfYmxlbmRfYXhpc190eXBlczoiCi0gICAgICAgICAgICAgICAgICAgICIgb3ZlcndyaXRpbmcgYXhpcyBuYW1lIGAlcycgd2l0aCBgJSoucydcbiIsCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsIGxlbiwgdG9rZW4tPnN0YXJ0ICkpOwotICAgICAgICBGVF9GUkVFKCBuYW1lICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggRlRfQUxMT0MoIGJsZW5kLT5heGlzX25hbWVzW25dLCBsZW4gKyAxICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIG5hbWUgPSAoRlRfQnl0ZSopYmxlbmQtPmF4aXNfbmFtZXNbbl07Ci0gICAgICBGVF9NRU1fQ09QWSggbmFtZSwgdG9rZW4tPnN0YXJ0LCBsZW4gKTsKLSAgICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgbG9hZGVyLT5wYXJzZXIucm9vdC5lcnJvciA9IGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwYXJzZV9ibGVuZF9kZXNpZ25fcG9zaXRpb25zKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIFQxX1Rva2VuUmVjICBkZXNpZ25fdG9rZW5zW1QxX01BWF9NTV9ERVNJR05TXTsKLSAgICBGVF9JbnQgICAgICAgbnVtX2Rlc2lnbnM7Ci0gICAgRlRfSW50ICAgICAgIG51bV9heGlzOwotICAgIFQxX1BhcnNlciAgICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0KLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgUFNfQmxlbmQgICAgIGJsZW5kOwotCi0KLSAgICAvKiBnZXQgdGhlIGFycmF5IG9mIGRlc2lnbiB0b2tlbnMgLS0gY29tcHV0ZSBudW1iZXIgb2YgZGVzaWducyAqLwotICAgIFQxX1RvVG9rZW5BcnJheSggcGFyc2VyLCBkZXNpZ25fdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgVDFfTUFYX01NX0RFU0lHTlMsICZudW1fZGVzaWducyApOwotICAgIGlmICggbnVtX2Rlc2lnbnMgPCAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggSWdub3JlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGlmICggbnVtX2Rlc2lnbnMgPT0gMCB8fCBudW1fZGVzaWducyA+IFQxX01BWF9NTV9ERVNJR05TICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJwYXJzZV9ibGVuZF9kZXNpZ25fcG9zaXRpb25zOiIKLSAgICAgICAgICAgICAgICAgIiBpbmNvcnJlY3QgbnVtYmVyIG9mIGRlc2lnbnM6ICVkXG4iLAotICAgICAgICAgICAgICAgICBudW1fZGVzaWducyApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgb2xkX2N1cnNvciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgICBGVF9CeXRlKiAgb2xkX2xpbWl0ICA9IHBhcnNlci0+cm9vdC5saW1pdDsKLSAgICAgIEZUX0ludCAgICBuOwotCi0KLSAgICAgIGJsZW5kICAgID0gZmFjZS0+YmxlbmQ7Ci0gICAgICBudW1fYXhpcyA9IDA7ICAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2Rlc2lnbnM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIFQxX1Rva2VuUmVjICBheGlzX3Rva2Vuc1tUMV9NQVhfTU1fQVhJU107Ci0gICAgICAgIFQxX1Rva2VuICAgICB0b2tlbjsKLSAgICAgICAgRlRfSW50ICAgICAgIGF4aXMsIG5fYXhpczsKLQotCi0gICAgICAgIC8qIHJlYWQgYXhpcy9jb29yZGluYXRlcyB0b2tlbnMgKi8KLSAgICAgICAgdG9rZW4gPSBkZXNpZ25fdG9rZW5zICsgbjsKLSAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IHRva2VuLT5zdGFydDsKLSAgICAgICAgcGFyc2VyLT5yb290LmxpbWl0ICA9IHRva2VuLT5saW1pdDsKLSAgICAgICAgVDFfVG9Ub2tlbkFycmF5KCBwYXJzZXIsIGF4aXNfdG9rZW5zLCBUMV9NQVhfTU1fQVhJUywgJm5fYXhpcyApOwotCi0gICAgICAgIGlmICggbiA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggbl9heGlzIDw9IDAgfHwgbl9heGlzID4gVDFfTUFYX01NX0FYSVMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInBhcnNlX2JsZW5kX2Rlc2lnbl9wb3NpdGlvbnM6IgotICAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgbnVtYmVyIG9mIGF4ZXM6ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBuX2F4aXMgKSk7Ci0gICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbnVtX2F4aXMgPSBuX2F4aXM7Ci0gICAgICAgICAgZXJyb3IgPSB0MV9hbGxvY2F0ZV9ibGVuZCggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCludW1fZGVzaWducywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCludW1fYXhpcyApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIG5fYXhpcyAhPSBudW1fYXhpcyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJwYXJzZV9ibGVuZF9kZXNpZ25fcG9zaXRpb25zOiBpbmNvcnJlY3QgdGFibGVcbiIgKSk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdyByZWFkIGVhY2ggYXhpcyB0b2tlbiBpbnRvIHRoZSBkZXNpZ24gcG9zaXRpb24gKi8KLSAgICAgICAgZm9yICggYXhpcyA9IDA7IGF4aXMgPCBuX2F4aXM7IGF4aXMrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBUMV9Ub2tlbiAgdG9rZW4yID0gYXhpc190b2tlbnMgKyBheGlzOwotCi0KLSAgICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gdG9rZW4yLT5zdGFydDsKLSAgICAgICAgICBwYXJzZXItPnJvb3QubGltaXQgID0gdG9rZW4yLT5saW1pdDsKLSAgICAgICAgICBibGVuZC0+ZGVzaWduX3Bvc1tuXVtheGlzXSA9IFQxX1RvRml4ZWQoIHBhcnNlciwgMCApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGxvYWRlci0+cGFyc2VyLnJvb3QuY3Vyc29yID0gb2xkX2N1cnNvcjsKLSAgICAgIGxvYWRlci0+cGFyc2VyLnJvb3QubGltaXQgID0gb2xkX2xpbWl0OwotICAgIH0KLQotICBFeGl0OgotICAgIGxvYWRlci0+cGFyc2VyLnJvb3QuZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2VfYmxlbmRfZGVzaWduX21hcCggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIFQxX1BhcnNlciAgICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0gICAgUFNfQmxlbmQgICAgIGJsZW5kOwotICAgIFQxX1Rva2VuUmVjICBheGlzX3Rva2Vuc1tUMV9NQVhfTU1fQVhJU107Ci0gICAgRlRfSW50ICAgICAgIG4sIG51bV9heGlzOwotICAgIEZUX0J5dGUqICAgICBvbGRfY3Vyc29yOwotICAgIEZUX0J5dGUqICAgICBvbGRfbGltaXQ7Ci0gICAgRlRfTWVtb3J5ICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotCi0KLSAgICBUMV9Ub1Rva2VuQXJyYXkoIHBhcnNlciwgYXhpc190b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICBUMV9NQVhfTU1fQVhJUywgJm51bV9heGlzICk7Ci0gICAgaWYgKCBudW1fYXhpcyA8IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJZ25vcmUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgaWYgKCBudW1fYXhpcyA9PSAwIHx8IG51bV9heGlzID4gVDFfTUFYX01NX0FYSVMgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInBhcnNlX2JsZW5kX2Rlc2lnbl9tYXA6IGluY29ycmVjdCBudW1iZXIgb2YgYXhlczogJWRcbiIsCi0gICAgICAgICAgICAgICAgIG51bV9heGlzICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIG9sZF9jdXJzb3IgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgIG9sZF9saW1pdCAgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0KLSAgICBlcnJvciA9IHQxX2FsbG9jYXRlX2JsZW5kKCBmYWNlLCAwLCAoRlRfVUludCludW1fYXhpcyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0KLSAgICAvKiBub3cgcmVhZCBlYWNoIGF4aXMgZGVzaWduIG1hcCAqLwotICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2F4aXM7IG4rKyApCi0gICAgewotICAgICAgUFNfRGVzaWduTWFwICBtYXAgPSBibGVuZC0+ZGVzaWduX21hcCArIG47Ci0gICAgICBUMV9Ub2tlbiAgICAgIGF4aXNfdG9rZW47Ci0gICAgICBUMV9Ub2tlblJlYyAgIHBvaW50X3Rva2Vuc1tUMV9NQVhfTU1fTUFQX1BPSU5UU107Ci0gICAgICBGVF9JbnQgICAgICAgIHAsIG51bV9wb2ludHM7Ci0KLQotICAgICAgYXhpc190b2tlbiA9IGF4aXNfdG9rZW5zICsgbjsKLQotICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IGF4aXNfdG9rZW4tPnN0YXJ0OwotICAgICAgcGFyc2VyLT5yb290LmxpbWl0ICA9IGF4aXNfdG9rZW4tPmxpbWl0OwotICAgICAgVDFfVG9Ub2tlbkFycmF5KCBwYXJzZXIsIHBvaW50X3Rva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfTUFYX01NX01BUF9QT0lOVFMsICZudW1fcG9pbnRzICk7Ci0KLSAgICAgIGlmICggbnVtX3BvaW50cyA8PSAwIHx8IG51bV9wb2ludHMgPiBUMV9NQVhfTU1fTUFQX1BPSU5UUyApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBhcnNlX2JsZW5kX2Rlc2lnbl9tYXA6IGluY29ycmVjdCB0YWJsZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggbWFwLT5kZXNpZ25fcG9pbnRzICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAicGFyc2VfYmxlbmRfZGVzaWduX21hcDogZHVwbGljYXRlIHRhYmxlXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyogYWxsb2NhdGUgZGVzaWduIG1hcCBkYXRhICovCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggbWFwLT5kZXNpZ25fcG9pbnRzLCBudW1fcG9pbnRzICogMiApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgbWFwLT5ibGVuZF9wb2ludHMgPSBtYXAtPmRlc2lnbl9wb2ludHMgKyBudW1fcG9pbnRzOwotICAgICAgbWFwLT5udW1fcG9pbnRzICAgPSAoRlRfQnl0ZSludW1fcG9pbnRzOwotCi0gICAgICBmb3IgKCBwID0gMDsgcCA8IG51bV9wb2ludHM7IHArKyApCi0gICAgICB7Ci0gICAgICAgIFQxX1Rva2VuICBwb2ludF90b2tlbjsKLQotCi0gICAgICAgIHBvaW50X3Rva2VuID0gcG9pbnRfdG9rZW5zICsgcDsKLQotICAgICAgICAvKiBkb24ndCBpbmNsdWRlIGRlbGltaXRpbmcgYnJhY2tldHMgKi8KLSAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IHBvaW50X3Rva2VuLT5zdGFydCArIDE7Ci0gICAgICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBwb2ludF90b2tlbi0+bGltaXQgLSAxOwotCi0gICAgICAgIG1hcC0+ZGVzaWduX3BvaW50c1twXSA9IFQxX1RvSW50KCBwYXJzZXIgKTsKLSAgICAgICAgbWFwLT5ibGVuZF9wb2ludHMgW3BdID0gVDFfVG9GaXhlZCggcGFyc2VyLCAwICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcGFyc2VyLT5yb290LmN1cnNvciA9IG9sZF9jdXJzb3I7Ci0gICAgcGFyc2VyLT5yb290LmxpbWl0ICA9IG9sZF9saW1pdDsKLQotICBFeGl0OgotICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwYXJzZV93ZWlnaHRfdmVjdG9yKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIFQxX1Rva2VuUmVjICBkZXNpZ25fdG9rZW5zW1QxX01BWF9NTV9ERVNJR05TXTsKLSAgICBGVF9JbnQgICAgICAgbnVtX2Rlc2lnbnM7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBUMV9QYXJzZXIgICAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotICAgIFBTX0JsZW5kICAgICBibGVuZCAgPSBmYWNlLT5ibGVuZDsKLSAgICBUMV9Ub2tlbiAgICAgdG9rZW47Ci0gICAgRlRfSW50ICAgICAgIG47Ci0gICAgRlRfQnl0ZSogICAgIG9sZF9jdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgIG9sZF9saW1pdDsKLQotCi0gICAgVDFfVG9Ub2tlbkFycmF5KCBwYXJzZXIsIGRlc2lnbl90b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICBUMV9NQVhfTU1fREVTSUdOUywgJm51bV9kZXNpZ25zICk7Ci0gICAgaWYgKCBudW1fZGVzaWducyA8IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJZ25vcmUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgaWYgKCBudW1fZGVzaWducyA9PSAwIHx8IG51bV9kZXNpZ25zID4gVDFfTUFYX01NX0RFU0lHTlMgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInBhcnNlX3dlaWdodF92ZWN0b3I6IgotICAgICAgICAgICAgICAgICAiIGluY29ycmVjdCBudW1iZXIgb2YgZGVzaWduczogJWRcbiIsCi0gICAgICAgICAgICAgICAgIG51bV9kZXNpZ25zICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggIWJsZW5kIHx8ICFibGVuZC0+bnVtX2Rlc2lnbnMgKQotICAgIHsKLSAgICAgIGVycm9yID0gdDFfYWxsb2NhdGVfYmxlbmQoIGZhY2UsIChGVF9VSW50KW51bV9kZXNpZ25zLCAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGJsZW5kLT5udW1fZGVzaWducyAhPSAoRlRfVUludCludW1fZGVzaWducyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicGFyc2Vfd2VpZ2h0X3ZlY3RvcjoiCi0gICAgICAgICAgICAgICAgICIgL0JsZW5kRGVzaWduUG9zaXRpb24gYW5kIC9XZWlnaHRWZWN0b3IgaGF2ZVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICIgZGlmZmVyZW50IG51bWJlciBvZiBlbGVtZW50c1xuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBvbGRfY3Vyc29yID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICBvbGRfbGltaXQgID0gcGFyc2VyLT5yb290LmxpbWl0OwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBudW1fZGVzaWduczsgbisrICkKLSAgICB7Ci0gICAgICB0b2tlbiA9IGRlc2lnbl90b2tlbnMgKyBuOwotICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IHRva2VuLT5zdGFydDsKLSAgICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSB0b2tlbi0+bGltaXQ7Ci0KLSAgICAgIGJsZW5kLT5kZWZhdWx0X3dlaWdodF92ZWN0b3Jbbl0gPQotICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3Jbbl0gICAgICAgICA9IFQxX1RvRml4ZWQoIHBhcnNlciwgMCApOwotICAgIH0KLQotICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBvbGRfY3Vyc29yOwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBvbGRfbGltaXQ7Ci0KLSAgRXhpdDoKLSAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgLyogZS5nLiwgL0J1aWxkQ2hhckFycmF5IFswIDAgMCAwIDAgMCAwIDBdIGRlZiAgICAgICAgICAgKi8KLSAgLyogd2UncmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2VfYnVpbGRjaGFyKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgVDFfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgZmFjZS0+bGVuX2J1aWxkY2hhciA9IChGVF9VSW50KVQxX1RvRml4ZWRBcnJheSggJmxvYWRlci0+cGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIDAgKTsKLSAgICByZXR1cm47Ci0gIH0KLQotCi0jZW5kaWYgLyogIVQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVCAqLwotCi0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBUWVBFIDEgU1lNQk9MIFBBUlNJTkcgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0MV9sb2FkX2tleXdvcmQoIFQxX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIFQxX0xvYWRlciAgICAgICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICB2b2lkKiAgICAgZHVtbXlfb2JqZWN0OwotICAgIHZvaWQqKiAgICBvYmplY3RzOwotICAgIEZUX1VJbnQgICBtYXhfb2JqZWN0czsKLSAgICBQU19CbGVuZCAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKLQotCi0gICAgaWYgKCBibGVuZCAmJiBibGVuZC0+bnVtX2Rlc2lnbnMgPT0gMCApCi0gICAgICBibGVuZCA9IE5VTEw7Ci0KLSAgICAvKiBpZiB0aGUga2V5d29yZCBoYXMgYSBkZWRpY2F0ZWQgY2FsbGJhY2ssIGNhbGwgaXQgKi8KLSAgICBpZiAoIGZpZWxkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfQ0FMTEJBQ0sgKQotICAgIHsKLSAgICAgIGZpZWxkLT5yZWFkZXIoIChGVF9GYWNlKWZhY2UsIGxvYWRlciApOwotICAgICAgZXJyb3IgPSBsb2FkZXItPnBhcnNlci5yb290LmVycm9yOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIG5vdywgdGhlIGtleXdvcmQgaXMgZWl0aGVyIGEgc2ltcGxlIGZpZWxkLCBvciBhIHRhYmxlIG9mIGZpZWxkczsgKi8KLSAgICAvKiB3ZSBhcmUgbm93IGdvaW5nIHRvIHRha2UgY2FyZSBvZiBpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc3dpdGNoICggZmllbGQtPmxvY2F0aW9uICkKLSAgICB7Ci0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9GT05UX0lORk86Ci0gICAgICBkdW1teV9vYmplY3QgPSAmZmFjZS0+dHlwZTEuZm9udF9pbmZvOwotICAgICAgb2JqZWN0cyAgICAgID0gJmR1bW15X29iamVjdDsKLSAgICAgIG1heF9vYmplY3RzICA9IDA7Ci0KLSAgICAgIGlmICggYmxlbmQgKQotICAgICAgewotICAgICAgICBvYmplY3RzICAgICA9ICh2b2lkKiopYmxlbmQtPmZvbnRfaW5mb3M7Ci0gICAgICAgIG1heF9vYmplY3RzID0gYmxlbmQtPm51bV9kZXNpZ25zOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRVhUUkE6Ci0gICAgICBkdW1teV9vYmplY3QgPSAmZmFjZS0+dHlwZTEuZm9udF9leHRyYTsKLSAgICAgIG9iamVjdHMgICAgICA9ICZkdW1teV9vYmplY3Q7Ci0gICAgICBtYXhfb2JqZWN0cyAgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFQxX0ZJRUxEX0xPQ0FUSU9OX1BSSVZBVEU6Ci0gICAgICBkdW1teV9vYmplY3QgPSAmZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0OwotICAgICAgb2JqZWN0cyAgICAgID0gJmR1bW15X29iamVjdDsKLSAgICAgIG1heF9vYmplY3RzICA9IDA7Ci0KLSAgICAgIGlmICggYmxlbmQgKQotICAgICAgewotICAgICAgICBvYmplY3RzICAgICA9ICh2b2lkKiopYmxlbmQtPnByaXZhdGVzOwotICAgICAgICBtYXhfb2JqZWN0cyA9IGJsZW5kLT5udW1fZGVzaWduczsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9CQk9YOgotICAgICAgZHVtbXlfb2JqZWN0ID0gJmZhY2UtPnR5cGUxLmZvbnRfYmJveDsKLSAgICAgIG9iamVjdHMgICAgICA9ICZkdW1teV9vYmplY3Q7Ci0gICAgICBtYXhfb2JqZWN0cyAgPSAwOwotCi0gICAgICBpZiAoIGJsZW5kICkKLSAgICAgIHsKLSAgICAgICAgb2JqZWN0cyAgICAgPSAodm9pZCoqKWJsZW5kLT5iYm94ZXM7Ci0gICAgICAgIG1heF9vYmplY3RzID0gYmxlbmQtPm51bV9kZXNpZ25zOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFQxX0ZJRUxEX0xPQ0FUSU9OX0xPQURFUjoKLSAgICAgIGR1bW15X29iamVjdCA9IGxvYWRlcjsKLSAgICAgIG9iamVjdHMgICAgICA9ICZkdW1teV9vYmplY3Q7Ci0gICAgICBtYXhfb2JqZWN0cyAgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZBQ0U6Ci0gICAgICBkdW1teV9vYmplY3QgPSBmYWNlOwotICAgICAgb2JqZWN0cyAgICAgID0gJmR1bW15X29iamVjdDsKLSAgICAgIG1heF9vYmplY3RzICA9IDA7Ci0gICAgICBicmVhazsKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLSAgICBjYXNlIFQxX0ZJRUxEX0xPQ0FUSU9OX0JMRU5EOgotICAgICAgZHVtbXlfb2JqZWN0ID0gZmFjZS0+YmxlbmQ7Ci0gICAgICBvYmplY3RzICAgICAgPSAmZHVtbXlfb2JqZWN0OwotICAgICAgbWF4X29iamVjdHMgID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgZHVtbXlfb2JqZWN0ID0gJmZhY2UtPnR5cGUxOwotICAgICAgb2JqZWN0cyAgICAgID0gJmR1bW15X29iamVjdDsKLSAgICAgIG1heF9vYmplY3RzICA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCAqb2JqZWN0cyApCi0gICAgewotICAgICAgaWYgKCBmaWVsZC0+dHlwZSA9PSBUMV9GSUVMRF9UWVBFX0lOVEVHRVJfQVJSQVkgfHwKLSAgICAgICAgICAgZmllbGQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSAgICkKLSAgICAgICAgZXJyb3IgPSBUMV9Mb2FkX0ZpZWxkX1RhYmxlKCAmbG9hZGVyLT5wYXJzZXIsIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMsIG1heF9vYmplY3RzLCAwICk7Ci0gICAgICBlbHNlCi0gICAgICAgIGVycm9yID0gVDFfTG9hZF9GaWVsZCggJmxvYWRlci0+cGFyc2VyLCBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLCBtYXhfb2JqZWN0cywgMCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfVFJBQ0UxKCggInQxX2xvYWRfa2V5d29yZDogaWdub3Jpbmcga2V5d29yZCBgJXMnIgotICAgICAgICAgICAgICAgICAgIiB3aGljaCBpcyBub3QgdmFsaWQgYXQgdGhpcyBwb2ludFxuIgotICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgKHByb2JhYmx5IGR1ZSB0byBtaXNzaW5nIGtleXdvcmRzKVxuIiwKLSAgICAgICAgICAgICAgICAgZmllbGQtPmlkZW50ICkpOwotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwYXJzZV9wcml2YXRlKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIFQxX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotCi0gICAgbG9hZGVyLT5rZXl3b3Jkc19lbmNvdW50ZXJlZCB8PSBUMV9QUklWQVRFOwotICB9Ci0KLQotICAvKiByZXR1cm4gMSBpbiBjYXNlIG9mIHN1Y2Nlc3MgKi8KLQotICBzdGF0aWMgaW50Ci0gIHJlYWRfYmluYXJ5X2RhdGEoIFQxX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBpbmNyZW1lbnRhbCApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyOwotICAgIEZUX0J5dGUqICBsaW1pdCA9IHBhcnNlci0+cm9vdC5saW1pdDsKLQotCi0gICAgLyogdGhlIGJpbmFyeSBkYXRhIGhhcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBgc2l6ZScgW3doaXRlKl0gUkQgd2hpdGUgLi4uLi4uLiBORCAgICAgICAgICAgICovCi0gICAgLyogICBgc2l6ZScgW3doaXRlKl0gLXwgd2hpdGUgLi4uLi4uLiB8LSAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotCi0gICAgaWYgKCBjdXIgPCBsaW1pdCAmJiBmdF9pc2RpZ2l0KCAqY3VyICkgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgIHMgPSBUMV9Ub0ludCggcGFyc2VyICk7Ci0KLQotICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7ICAgLyogYFJEJyBvciBgLXwnIG9yIHNvbWV0aGluZyBlbHNlICovCi0KLSAgICAgIC8qIHRoZXJlIGlzIG9ubHkgb25lIHdoaXRlc3BhY2UgY2hhciBhZnRlciB0aGUgKi8KLSAgICAgIC8qIGBSRCcgb3IgYC18JyB0b2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICpiYXNlID0gcGFyc2VyLT5yb290LmN1cnNvciArIDE7Ci0KLSAgICAgIGlmICggcyA+PSAwICYmIHMgPCBsaW1pdCAtICpiYXNlICkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciArPSBzICsgMTsKLSAgICAgICAgKnNpemUgPSAoRlRfVUxvbmcpczsKLSAgICAgICAgcmV0dXJuICFwYXJzZXItPnJvb3QuZXJyb3I7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYoICFpbmNyZW1lbnRhbCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicmVhZF9iaW5hcnlfZGF0YTogaW52YWxpZCBzaXplIGZpZWxkXG4iICkpOwotICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogV2Ugbm93IGRlZmluZSB0aGUgcm91dGluZXMgdG8gaGFuZGxlIHRoZSBgL0VuY29kaW5nJywgYC9TdWJycycsICovCi0gIC8qIGFuZCBgL0NoYXJTdHJpbmdzJyBkaWN0aW9uYXJpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHQxX3BhcnNlX2ZvbnRfbWF0cml4KCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBUMV9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBUMV9QYXJzZXIgICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0gICAgRlRfTWF0cml4KiAgbWF0cml4ID0gJmZhY2UtPnR5cGUxLmZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciogIG9mZnNldCA9ICZmYWNlLT50eXBlMS5mb250X29mZnNldDsKLSAgICBGVF9GYWNlICAgICByb290ICAgPSAoRlRfRmFjZSkmZmFjZS0+cm9vdDsKLSAgICBGVF9GaXhlZCAgICB0ZW1wWzZdOwotICAgIEZUX0ZpeGVkICAgIHRlbXBfc2NhbGU7Ci0gICAgRlRfSW50ICAgICAgcmVzdWx0OwotCi0KLSAgICAvKiBpbnB1dCBpcyBzY2FsZWQgYnkgMTAwMCB0byBhY2NvbW1vZGF0ZSBkZWZhdWx0IEZvbnRNYXRyaXggKi8KLSAgICByZXN1bHQgPSBUMV9Ub0ZpeGVkQXJyYXkoIHBhcnNlciwgNiwgdGVtcCwgMyApOwotCi0gICAgaWYgKCByZXN1bHQgPCA2ICkKLSAgICB7Ci0gICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHRlbXBfc2NhbGUgPSBGVF9BQlMoIHRlbXBbM10gKTsKLQotICAgIGlmICggdGVtcF9zY2FsZSA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ0MV9wYXJzZV9mb250X21hdHJpeDogaW52YWxpZCBmb250IG1hdHJpeFxuIiApKTsKLSAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogYXR5cGljYWwgY2FzZSAqLwotICAgIGlmICggdGVtcF9zY2FsZSAhPSAweDEwMDAwTCApCi0gICAgewotICAgICAgLyogc2V0IHVuaXRzIHBlciBFTSBiYXNlZCBvbiBGb250TWF0cml4IHZhbHVlcyAqLwotICAgICAgcm9vdC0+dW5pdHNfcGVyX0VNID0gKEZUX1VTaG9ydClGVF9EaXZGaXgoIDEwMDAsIHRlbXBfc2NhbGUgKTsKLQotICAgICAgdGVtcFswXSA9IEZUX0RpdkZpeCggdGVtcFswXSwgdGVtcF9zY2FsZSApOwotICAgICAgdGVtcFsxXSA9IEZUX0RpdkZpeCggdGVtcFsxXSwgdGVtcF9zY2FsZSApOwotICAgICAgdGVtcFsyXSA9IEZUX0RpdkZpeCggdGVtcFsyXSwgdGVtcF9zY2FsZSApOwotICAgICAgdGVtcFs0XSA9IEZUX0RpdkZpeCggdGVtcFs0XSwgdGVtcF9zY2FsZSApOwotICAgICAgdGVtcFs1XSA9IEZUX0RpdkZpeCggdGVtcFs1XSwgdGVtcF9zY2FsZSApOwotICAgICAgdGVtcFszXSA9IHRlbXBbM10gPCAwID8gLTB4MTAwMDBMIDogMHgxMDAwMEw7Ci0gICAgfQotCi0gICAgbWF0cml4LT54eCA9IHRlbXBbMF07Ci0gICAgbWF0cml4LT55eCA9IHRlbXBbMV07Ci0gICAgbWF0cml4LT54eSA9IHRlbXBbMl07Ci0gICAgbWF0cml4LT55eSA9IHRlbXBbM107Ci0KLSAgICAvKiBub3RlIHRoYXQgdGhlIG9mZnNldHMgbXVzdCBiZSBleHByZXNzZWQgaW4gaW50ZWdlciBmb250IHVuaXRzICovCi0gICAgb2Zmc2V0LT54ID0gdGVtcFs0XSA+PiAxNjsKLSAgICBvZmZzZXQtPnkgPSB0ZW1wWzVdID4+IDE2OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwYXJzZV9lbmNvZGluZyggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgVDFfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgVDFfUGFyc2VyICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0gICAgRlRfQnl0ZSogICBjdXI7Ci0gICAgRlRfQnl0ZSogICBsaW1pdCAgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0KLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotCi0KLSAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0gICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicGFyc2VfZW5jb2Rpbmc6IG91dCBvZiBib3VuZHNcbiIgKSk7Ci0gICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGlmIHdlIGhhdmUgYSBudW1iZXIgb3IgYFsnLCB0aGUgZW5jb2RpbmcgaXMgYW4gYXJyYXksICovCi0gICAgLyogYW5kIHdlIG11c3QgbG9hZCBpdCBub3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZ0X2lzZGlnaXQoICpjdXIgKSB8fCAqY3VyID09ICdbJyApCi0gICAgewotICAgICAgVDFfRW5jb2RpbmcgIGVuY29kZSAgICAgICAgICA9ICZmYWNlLT50eXBlMS5lbmNvZGluZzsKLSAgICAgIEZUX0ludCAgICAgICBjb3VudCwgbjsKLSAgICAgIFBTX1RhYmxlICAgICBjaGFyX3RhYmxlICAgICAgPSAmbG9hZGVyLT5lbmNvZGluZ190YWJsZTsKLSAgICAgIEZUX01lbW9yeSAgICBtZW1vcnkgICAgICAgICAgPSBwYXJzZXItPnJvb3QubWVtb3J5OwotICAgICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgICAgRlRfQm9vbCAgICAgIG9ubHlfaW1tZWRpYXRlcyA9IDA7Ci0KLQotICAgICAgLyogcmVhZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGVuY29kaW5nOyBzaG91bGQgYmUgMjU2ICovCi0gICAgICBpZiAoICpjdXIgPT0gJ1snICkKLSAgICAgIHsKLSAgICAgICAgY291bnQgICAgICAgICAgID0gMjU2OwotICAgICAgICBvbmx5X2ltbWVkaWF0ZXMgPSAxOwotICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGNvdW50ID0gKEZUX0ludClUMV9Ub0ludCggcGFyc2VyICk7Ci0KLSAgICAgIC8qIG9ubHkgY29tcG9zaXRlIGZvbnRzICh3aGljaCB3ZSBkb24ndCBzdXBwb3J0KSAqLwotICAgICAgLyogY2FuIGhhdmUgbGFyZ2VyIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGNvdW50ID4gMjU2ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAicGFyc2VfZW5jb2Rpbmc6IGludmFsaWQgZW5jb2RpbmcgYXJyYXkgc2l6ZVxuIiApKTsKLSAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0gICAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPj0gbGltaXQgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIC8qIFBvc3RTY3JpcHQgaGFwcGlseSBhbGxvd3Mgb3ZlcndyaXRpbmcgb2YgZW5jb2RpbmcgYXJyYXlzICovCi0gICAgICBpZiAoIGVuY29kZS0+Y2hhcl9pbmRleCApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZSRUUoIGVuY29kZS0+Y2hhcl9pbmRleCApOwotICAgICAgICBGVF9GUkVFKCBlbmNvZGUtPmNoYXJfbmFtZSApOwotICAgICAgICBUMV9SZWxlYXNlX1RhYmxlKCBjaGFyX3RhYmxlICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIHVzZSBhIFQxX1RhYmxlIHRvIHN0b3JlIG91ciBjaGFybmFtZXMgKi8KLSAgICAgIGxvYWRlci0+bnVtX2NoYXJzID0gZW5jb2RlLT5udW1fY2hhcnMgPSBjb3VudDsKLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBlbmNvZGUtPmNoYXJfaW5kZXgsIGNvdW50ICkgICAgIHx8Ci0gICAgICAgICAgIEZUX05FV19BUlJBWSggZW5jb2RlLT5jaGFyX25hbWUsICBjb3VudCApICAgICB8fAotICAgICAgICAgICBGVF9TRVRfRVJST1IoIHBzYXV4LT5wc190YWJsZV9mdW5jcy0+aW5pdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdGFibGUsIGNvdW50LCBtZW1vcnkgKSApICkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gZXJyb3I7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogV2UgbmVlZCB0byBgemVybycgb3V0IGVuY29kaW5nX3RhYmxlLmVsZW1lbnRzICovCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgewotICAgICAgICBjaGFyKiAgbm90ZGVmID0gKGNoYXIgKikiLm5vdGRlZiI7Ci0KLQotICAgICAgICAodm9pZClUMV9BZGRfVGFibGUoIGNoYXJfdGFibGUsIG4sIG5vdGRlZiwgOCApOwotICAgICAgfQotCi0gICAgICAvKiBOb3cgd2UgbmVlZCB0byByZWFkIHJlY29yZHMgb2YgdGhlIGZvcm0gICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAuLi4gY2hhcmNvZGUgL2NoYXJuYW1lIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIGZvciBlYWNoIGVudHJ5IGluIG91ciB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBXZSBzaW1wbHkgbG9vayBmb3IgYSBudW1iZXIgZm9sbG93ZWQgYnkgYW4gaW1tZWRpYXRlICAgKi8KLSAgICAgIC8qIG5hbWUuICBOb3RlIHRoYXQgdGhpcyBpZ25vcmVzIGNvcnJlY3RseSB0aGUgc2VxdWVuY2UgICAqLwotICAgICAgLyogdGhhdCBpcyBvZnRlbiBzZWVuIGluIHR5cGUxIGZvbnRzOiAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgMCAxIDI1NSB7IDEgaW5kZXggZXhjaCAvLm5vdGRlZiBwdXQgfSBmb3IgZHVwICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiB1c2VkIHRvIGNsZWFuIHRoZSBlbmNvZGluZyBhcnJheSBiZWZvcmUgYW55dGhpbmcgZWxzZS4gKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogQWx0ZXJuYXRpdmVseSwgaWYgdGhlIGFycmF5IGlzIGRpcmVjdGx5IGdpdmVuIGFzICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgL0VuY29kaW5nIFsgLi4uIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiB3ZSBvbmx5IHJlYWQgaW1tZWRpYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgbiA9IDA7Ci0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAgIHdoaWxlICggcGFyc2VyLT5yb290LmN1cnNvciA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLQotICAgICAgICAvKiB3ZSBzdG9wIHdoZW4gd2UgZW5jb3VudGVyIGEgYGRlZicgb3IgYF0nICovCi0gICAgICAgIGlmICggKmN1ciA9PSAnZCcgJiYgY3VyICsgMyA8IGxpbWl0ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggY3VyWzFdID09ICdlJyAgICAgICAgICYmCi0gICAgICAgICAgICAgICBjdXJbMl0gPT0gJ2YnICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIElTX1BTX0RFTElNKCBjdXJbM10gKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U2KCggImVuY29kaW5nIGVuZFxuIiApKTsKLSAgICAgICAgICAgIGN1ciArPSAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICggKmN1ciA9PSAnXScgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U2KCggImVuY29kaW5nIGVuZFxuIiApKTsKLSAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UndmUgZm91bmQgYW4gZW50cnkgKi8KLSAgICAgICAgaWYgKCBmdF9pc2RpZ2l0KCAqY3VyICkgfHwgb25seV9pbW1lZGlhdGVzICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0ludCAgY2hhcmNvZGU7Ci0KLQotICAgICAgICAgIGlmICggb25seV9pbW1lZGlhdGVzICkKLSAgICAgICAgICAgIGNoYXJjb2RlID0gbjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhcmNvZGUgPSAoRlRfSW50KVQxX1RvSW50KCBwYXJzZXIgKTsKLSAgICAgICAgICAgIFQxX1NraXBfU3BhY2VzKCBwYXJzZXIgKTsKLQotICAgICAgICAgICAgLyogcHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgY2hhcmNvZGUgKi8KLSAgICAgICAgICAgIGlmICggY3VyID09IHBhcnNlci0+cm9vdC5jdXJzb3IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLQotICAgICAgICAgIGlmICggY3VyICsgMiA8IGxpbWl0ICYmICpjdXIgPT0gJy8nICYmIG4gPCBjb3VudCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgbGVuOwotCi0KLSAgICAgICAgICAgIGN1cisrOwotCi0gICAgICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gY3VyOwotICAgICAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPj0gbGltaXQgKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgbGVuID0gKEZUX1VJbnQpKCBwYXJzZXItPnJvb3QuY3Vyc29yIC0gY3VyICk7Ci0KLSAgICAgICAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IFQxX0FkZF9UYWJsZSggY2hhcl90YWJsZSwgY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ciwgbGVuICsgMSApOwotICAgICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjaGFyX3RhYmxlLT5lbGVtZW50c1tjaGFyY29kZV1bbGVuXSA9ICdcMCc7Ci0KLSAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIG9ubHlfaW1tZWRpYXRlcyApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogU2luY2UgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgbm90IHVwZGF0ZWQgZm9yICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogaW1tZWRpYXRlcy1vbmx5IG1vZGUgd2Ugd291bGQgZ2V0IGFuIGluZmluaXRlIGxvb3AgaWYgICAqLwotICAgICAgICAgICAgLyogd2UgZG9uJ3QgZG8gYW55dGhpbmcgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogVGhpcyBlbmNvZGluZyBhcnJheSBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlMSAqLwotICAgICAgICAgICAgLyogc3BlY2lmaWNhdGlvbiAoaXQgbWlnaHQgYmUgYW4gZW5jb2RpbmcgZm9yIGEgQ0lEIHR5cGUxICAqLwotICAgICAgICAgICAgLyogZm9udCwgaG93ZXZlciksIHNvIHdlIGNvbmNsdWRlIHRoYXQgdGhpcyBmb250IGlzIE5PVCBhICAqLwotICAgICAgICAgICAgLyogdHlwZTEgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotICAgICAgfQotCi0gICAgICBmYWNlLT50eXBlMS5lbmNvZGluZ190eXBlID0gVDFfRU5DT0RJTkdfVFlQRV9BUlJBWTsKLSAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgICAgICAgPSBjdXI7Ci0gICAgfQotCi0gICAgLyogT3RoZXJ3aXNlLCB3ZSBzaG91bGQgaGF2ZSBlaXRoZXIgYFN0YW5kYXJkRW5jb2RpbmcnLCAqLwotICAgIC8qIGBFeHBlcnRFbmNvZGluZycsIG9yIGBJU09MYXRpbjFFbmNvZGluZycgICAgICAgICAgICAgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBjdXIgKyAxNyA8IGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBmdF9zdHJuY21wKCAoY29uc3QgY2hhciopY3VyLCAiU3RhbmRhcmRFbmNvZGluZyIsIDE2ICkgPT0gMCApCi0gICAgICAgIGZhY2UtPnR5cGUxLmVuY29kaW5nX3R5cGUgPSBUMV9FTkNPRElOR19UWVBFX1NUQU5EQVJEOwotCi0gICAgICBlbHNlIGlmICggY3VyICsgMTUgPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgZnRfc3RybmNtcCggKGNvbnN0IGNoYXIqKWN1ciwgIkV4cGVydEVuY29kaW5nIiwgMTQgKSA9PSAwICkKLSAgICAgICAgZmFjZS0+dHlwZTEuZW5jb2RpbmdfdHlwZSA9IFQxX0VOQ09ESU5HX1RZUEVfRVhQRVJUOwotCi0gICAgICBlbHNlIGlmICggY3VyICsgMTggPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgZnRfc3RybmNtcCggKGNvbnN0IGNoYXIqKWN1ciwgIklTT0xhdGluMUVuY29kaW5nIiwgMTcgKSA9PSAwICkKLSAgICAgICAgZmFjZS0+dHlwZTEuZW5jb2RpbmdfdHlwZSA9IFQxX0VOQ09ESU5HX1RZUEVfSVNPTEFUSU4xOwotCi0gICAgICBlbHNlCi0gICAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX0VSUiggSWdub3JlICk7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwYXJzZV9zdWJycyggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgVDFfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgVDFfUGFyc2VyICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0gICAgUFNfVGFibGUgICB0YWJsZSAgPSAmbG9hZGVyLT5zdWJyczsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9JbnQgICAgIG51bV9zdWJyczsKLSAgICBGVF9VSW50ICAgIGNvdW50OwotCi0gICAgUFNBdXhfU2VydmljZSAgcHNhdXggPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLQotCi0gICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotCi0gICAgLyogdGVzdCBmb3IgZW1wdHkgYXJyYXkgKi8KLSAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPCBwYXJzZXItPnJvb3QubGltaXQgJiYKLSAgICAgICAgICpwYXJzZXItPnJvb3QuY3Vyc29yID09ICdbJyAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgVDFfU2tpcF9TcGFjZXMgICggcGFyc2VyICk7Ci0gICAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPj0gcGFyc2VyLT5yb290LmxpbWl0IHx8Ci0gICAgICAgICAgICpwYXJzZXItPnJvb3QuY3Vyc29yICE9ICddJyAgICAgICAgICAgICAgICkKLSAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBudW1fc3VicnMgPSAoRlRfSW50KVQxX1RvSW50KCBwYXJzZXIgKTsKLSAgICBpZiAoIG51bV9zdWJycyA8IDAgKQotICAgIHsKLSAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogd2UgY2VydGFpbmx5IG5lZWQgbW9yZSB0aGFuIDggYnl0ZXMgcGVyIHN1YnJvdXRpbmUgKi8KLSAgICBpZiAoIHBhcnNlci0+cm9vdC5saW1pdCA+PSBwYXJzZXItPnJvb3QuY3Vyc29yICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIG51bV9zdWJycyA+ICggcGFyc2VyLT5yb290LmxpbWl0IC0gcGFyc2VyLT5yb290LmN1cnNvciApID4+IDMgKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBUaGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXMuICBFaXRoZXIgdGhlIGZvbnQgY29udGFpbnMgYW4gaW52YWxpZAotICAgICAgICogdmFsdWUgZm9yIGBudW1fc3VicnMnLCBvciB3ZSBoYXZlIGEgc3Vic2V0dGVkIGZvbnQgd2hlcmUgdGhlCi0gICAgICAgKiBzdWJyb3V0aW5lIGluZGljZXMgYXJlIG5vdCBhZGp1c3RlZCwgZS5nLgotICAgICAgICoKLSAgICAgICAqICAgL1N1YnJzIDgxMiBhcnJheQotICAgICAgICogICAgIGR1cCAwIHsgLi4uIH0gTlAKLSAgICAgICAqICAgICBkdXAgNTEgeyAuLi4gfSBOUAotICAgICAgICogICAgIGR1cCA2ODEgeyAuLi4gfSBOUAotICAgICAgICogICBORAotICAgICAgICoKLSAgICAgICAqIEluIGJvdGggY2FzZXMsIHdlIHVzZSBhIG51bWJlciBoYXNoIHRoYXQgbWFwcyBmcm9tIHN1YnIgaW5kaWNlcyB0bwotICAgICAgICogYWN0dWFsIGFycmF5IGVsZW1lbnRzLgotICAgICAgICovCi0KLSAgICAgIEZUX1RSQUNFMCgoICJwYXJzZV9zdWJyczogYWRqdXN0aW5nIG51bWJlciBvZiBzdWJyb3V0aW5lcyIKLSAgICAgICAgICAgICAgICAgICIgKGZyb20gJWQgdG8gJWQpXG4iLAotICAgICAgICAgICAgICAgICAgbnVtX3N1YnJzLAotICAgICAgICAgICAgICAgICAgKCBwYXJzZXItPnJvb3QubGltaXQgLSBwYXJzZXItPnJvb3QuY3Vyc29yICkgPj4gMyApKTsKLSAgICAgIG51bV9zdWJycyA9ICggcGFyc2VyLT5yb290LmxpbWl0IC0gcGFyc2VyLT5yb290LmN1cnNvciApID4+IDM7Ci0KLSAgICAgIGlmICggIWxvYWRlci0+c3VicnNfaGFzaCApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfTkVXKCBsb2FkZXItPnN1YnJzX2hhc2ggKSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGVycm9yID0gZnRfaGFzaF9udW1faW5pdCggbG9hZGVyLT5zdWJyc19oYXNoLCBtZW1vcnkgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHBvc2l0aW9uIHRoZSBwYXJzZXIgcmlnaHQgYmVmb3JlIHRoZSBgZHVwJyBvZiB0aGUgZmlyc3Qgc3ViciAqLwotICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOyAgICAgICAgIC8qIGBhcnJheScgKi8KLSAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICByZXR1cm47Ci0gICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotCi0gICAgLyogaW5pdGlhbGl6ZSBzdWJycyBhcnJheSAtLSB3aXRoIHN5bnRoZXRpYyBmb250cyBpdCBpcyBwb3NzaWJsZSAqLwotICAgIC8qIHdlIGdldCBoZXJlIHR3aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFsb2FkZXItPm51bV9zdWJycyApCi0gICAgewotICAgICAgZXJyb3IgPSBwc2F1eC0+cHNfdGFibGVfZnVuY3MtPmluaXQoIHRhYmxlLCBudW1fc3VicnMsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiB0aGUgZm9ybWF0IGlzIHNpbXBsZTogICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBgaW5kZXgnICsgYmluYXJ5IGRhdGEgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGNvdW50ID0gMDsgOyBjb3VudCsrICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICAgaWR4OwotICAgICAgRlRfVUxvbmcgIHNpemU7Ci0gICAgICBGVF9CeXRlKiAgYmFzZTsKLQotCi0gICAgICAvKiBJZiB3ZSBhcmUgb3V0IG9mIGRhdGEsIG9yIGlmIHRoZSBuZXh0IHRva2VuIGlzbid0IGBkdXAnLCAqLwotICAgICAgLyogd2UgYXJlIGRvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciArIDQgPj0gcGFyc2VyLT5yb290LmxpbWl0ICAgICAgICAgIHx8Ci0gICAgICAgICAgZnRfc3RybmNtcCggKGNoYXIqKXBhcnNlci0+cm9vdC5jdXJzb3IsICJkdXAiLCAzICkgIT0gMCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBUMV9Ta2lwX1BTX1Rva2VuKCBwYXJzZXIgKTsgICAgICAgLyogYGR1cCcgKi8KLQotICAgICAgaWR4ID0gVDFfVG9JbnQoIHBhcnNlciApOwotCi0gICAgICBpZiAoICFyZWFkX2JpbmFyeV9kYXRhKCBwYXJzZXIsICZzaXplLCAmYmFzZSwgSVNfSU5DUkVNRU5UQUwgKSApCi0gICAgICAgIHJldHVybjsKLQotICAgICAgLyogVGhlIGJpbmFyeSBzdHJpbmcgaXMgZm9sbG93ZWQgYnkgb25lIHRva2VuLCBlLmcuIGBOUCcgKi8KLSAgICAgIC8qIChib3VuZCB0byBgbm9hY2Nlc3MgcHV0Jykgb3IgYnkgdHdvIHNlcGFyYXRlIHRva2VuczogICovCi0gICAgICAvKiBgbm9hY2Nlc3MnICYgYHB1dCcuICBXZSBwb3NpdGlvbiB0aGUgcGFyc2VyIHJpZ2h0ICAgICAqLwotICAgICAgLyogYmVmb3JlIHRoZSBuZXh0IGBkdXAnLCBpZiBhbnkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOyAgIC8qIGBOUCcgb3IgYHwnIG9yIGBub2FjY2VzcycgKi8KLSAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgcmV0dXJuOwotICAgICAgVDFfU2tpcF9TcGFjZXMgICggcGFyc2VyICk7Ci0KLSAgICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciArIDQgPCBwYXJzZXItPnJvb3QubGltaXQgICAgICAgICAgICAmJgotICAgICAgICAgICBmdF9zdHJuY21wKCAoY2hhciopcGFyc2VyLT5yb290LmN1cnNvciwgInB1dCIsIDMgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7IC8qIHNraXAgYHB1dCcgKi8KLSAgICAgICAgVDFfU2tpcF9TcGFjZXMgICggcGFyc2VyICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGlmIHdlIHVzZSBhIGhhc2gsIHRoZSBzdWJycyBpbmRleCBpcyB0aGUga2V5LCBhbmQgYSBydW5uaW5nICovCi0gICAgICAvKiBjb3VudGVyIHNwZWNpZmllZCBmb3IgYFQxX0FkZF9UYWJsZScgYWN0cyBhcyB0aGUgdmFsdWUgICAgICAqLwotICAgICAgaWYgKCBsb2FkZXItPnN1YnJzX2hhc2ggKQotICAgICAgewotICAgICAgICBmdF9oYXNoX251bV9pbnNlcnQoIGlkeCwgY291bnQsIGxvYWRlci0+c3VicnNfaGFzaCwgbWVtb3J5ICk7Ci0gICAgICAgIGlkeCA9IGNvdW50OwotICAgICAgfQotCi0gICAgICAvKiB3aXRoIHN5bnRoZXRpYyBmb250cyBpdCBpcyBwb3NzaWJsZSB3ZSBnZXQgaGVyZSB0d2ljZSAqLwotICAgICAgaWYgKCBsb2FkZXItPm51bV9zdWJycyApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBzb21lIGZvbnRzIHVzZSBhIHZhbHVlIG9mIC0xIGZvciBsZW5JViB0byBpbmRpY2F0ZSB0aGF0ICovCi0gICAgICAvKiB0aGUgY2hhcnN0cmluZ3MgYXJlIHVuZW5jb2RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiB0aGFua3MgdG8gVG9tIEthY3ZpbnNreSBmb3IgcG9pbnRpbmcgdGhpcyBvdXQgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGZhY2UtPnR5cGUxLnByaXZhdGVfZGljdC5sZW5JViA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIHRlbXAgPSBOVUxMOwotCi0KLSAgICAgICAgLyogc29tZSBmb250cyBkZWZpbmUgZW1wdHkgc3ViciByZWNvcmRzIC0tIHRoaXMgaXMgbm90IHRvdGFsbHkgKi8KLSAgICAgICAgLyogY29tcGxpYW50IHRvIHRoZSBzcGVjaWZpY2F0aW9uICh3aGljaCBzYXlzIHRoZXkgc2hvdWxkIGF0ICAgKi8KLSAgICAgICAgLyogbGVhc3QgY29udGFpbiBhIGByZXR1cm4nKSwgYnV0IHdlIHN1cHBvcnQgdGhlbSBhbnl3YXkgICAgICAgKi8KLSAgICAgICAgaWYgKCBzaXplIDwgKEZUX1VMb25nKWZhY2UtPnR5cGUxLnByaXZhdGVfZGljdC5sZW5JViApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdDFfZGVjcnlwdCgpIHNob3VsZG4ndCB3cml0ZSB0byBiYXNlIC0tIG1ha2UgdGVtcG9yYXJ5IGNvcHkgKi8KLSAgICAgICAgaWYgKCBGVF9BTExPQyggdGVtcCwgc2l6ZSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIEZUX01FTV9DT1BZKCB0ZW1wLCBiYXNlLCBzaXplICk7Ci0gICAgICAgIHBzYXV4LT50MV9kZWNyeXB0KCB0ZW1wLCBzaXplLCA0MzMwICk7Ci0gICAgICAgIHNpemUgLT0gKEZUX1VMb25nKWZhY2UtPnR5cGUxLnByaXZhdGVfZGljdC5sZW5JVjsKLSAgICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHRhYmxlLCAoRlRfSW50KWlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKyBmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVYsIHNpemUgKTsKLSAgICAgICAgRlRfRlJFRSggdGVtcCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggdGFibGUsIChGVF9JbnQpaWR4LCBiYXNlLCBzaXplICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIGlmICggIWxvYWRlci0+bnVtX3N1YnJzICkKLSAgICAgIGxvYWRlci0+bnVtX3N1YnJzID0gbnVtX3N1YnJzOwotCi0gICAgcmV0dXJuOwotCi0gIEZhaWw6Ci0gICAgcGFyc2VyLT5yb290LmVycm9yID0gZXJyb3I7Ci0gIH0KLQotCi0jZGVmaW5lIFRBQkxFX0VYVEVORCAgNQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2VfY2hhcnN0cmluZ3MoIFQxX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIFQxX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIFQxX1BhcnNlciAgICAgIHBhcnNlciAgICAgICA9ICZsb2FkZXItPnBhcnNlcjsKLSAgICBQU19UYWJsZSAgICAgICBjb2RlX3RhYmxlICAgPSAmbG9hZGVyLT5jaGFyc3RyaW5nczsKLSAgICBQU19UYWJsZSAgICAgICBuYW1lX3RhYmxlICAgPSAmbG9hZGVyLT5nbHlwaF9uYW1lczsKLSAgICBQU19UYWJsZSAgICAgICBzd2FwX3RhYmxlICAgPSAmbG9hZGVyLT5zd2FwX3RhYmxlOwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSAgICAgICA9IHBhcnNlci0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0KLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCAgICAgICAgPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLQotICAgIEZUX0J5dGUqICAgICAgIGN1ciAgICAgICAgICA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgbGltaXQgICAgICAgID0gcGFyc2VyLT5yb290LmxpbWl0OwotICAgIEZUX0ludCAgICAgICAgIG4sIG51bV9nbHlwaHM7Ci0gICAgRlRfSW50ICAgICAgICAgbm90ZGVmX2luZGV4ID0gMDsKLSAgICBGVF9CeXRlICAgICAgICBub3RkZWZfZm91bmQgPSAwOwotCi0KLSAgICBudW1fZ2x5cGhzID0gKEZUX0ludClUMV9Ub0ludCggcGFyc2VyICk7Ci0gICAgaWYgKCBudW1fZ2x5cGhzIDwgMCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIHdlIGNlcnRhaW5seSBuZWVkIG1vcmUgdGhhbiA4IGJ5dGVzIHBlciBnbHlwaCAqLwotICAgIGlmICggbnVtX2dseXBocyA+ICggbGltaXQgLSBjdXIgKSA+PiAzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTAoKCAicGFyc2VfY2hhcnN0cmluZ3M6IGFkanVzdGluZyBudW1iZXIgb2YgZ2x5cGhzIgotICAgICAgICAgICAgICAgICAgIiAoZnJvbSAlZCB0byAlZClcbiIsCi0gICAgICAgICAgICAgICAgICBudW1fZ2x5cGhzLCAoIGxpbWl0IC0gY3VyICkgPj4gMyApKTsKLSAgICAgIG51bV9nbHlwaHMgPSAoIGxpbWl0IC0gY3VyICkgPj4gMzsKLSAgICB9Ci0KLSAgICAvKiBzb21lIGZvbnRzIGxpa2UgT3B0aW1hLU9ibGlxdWUgbm90IG9ubHkgZGVmaW5lIHRoZSAvQ2hhclN0cmluZ3MgKi8KLSAgICAvKiBhcnJheSBidXQgYWNjZXNzIGl0IGFsc28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIG51bV9nbHlwaHMgPT0gMCB8fCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0YWJsZXMsIGxlYXZpbmcgc3BhY2UgZm9yIGFkZGl0aW9uIG9mIC5ub3RkZWYsICovCi0gICAgLyogaWYgbmVjZXNzYXJ5LCBhbmQgYSBmZXcgb3RoZXIgZ2x5cGhzIHRvIGhhbmRsZSBidWdneSAgICAgICovCi0gICAgLyogZm9udHMgd2hpY2ggaGF2ZSBtb3JlIGdseXBocyB0aGFuIHNwZWNpZmllZC4gICAgICAgICAgICAgICovCi0KLSAgICAvKiBmb3Igc29tZSBub24tc3RhbmRhcmQgZm9udHMgbGlrZSBgT3B0aW1hJyB3aGljaCBwcm92aWRlcyAgKi8KLSAgICAvKiBkaWZmZXJlbnQgb3V0bGluZXMgZGVwZW5kaW5nIG9uIHRoZSByZXNvbHV0aW9uIGl0IGlzICAgICAgKi8KLSAgICAvKiBwb3NzaWJsZSB0byBnZXQgaGVyZSB0d2ljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFsb2FkZXItPm51bV9nbHlwaHMgKQotICAgIHsKLSAgICAgIGVycm9yID0gcHNhdXgtPnBzX3RhYmxlX2Z1bmNzLT5pbml0KAotICAgICAgICAgICAgICAgIGNvZGVfdGFibGUsIG51bV9nbHlwaHMgKyAxICsgVEFCTEVfRVhURU5ELCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gcHNhdXgtPnBzX3RhYmxlX2Z1bmNzLT5pbml0KAotICAgICAgICAgICAgICAgIG5hbWVfdGFibGUsIG51bV9nbHlwaHMgKyAxICsgVEFCTEVfRVhURU5ELCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGFibGUgZm9yIHN3YXBwaW5nIGluZGV4IG5vdGRlZl9pbmRleCBhbmQgKi8KLSAgICAgIC8qIGluZGV4IDAgbmFtZXMgYW5kIGNvZGVzIChpZiBuZWNlc3NhcnkpLiAgICAgICAgICAgICAgKi8KLQotICAgICAgZXJyb3IgPSBwc2F1eC0+cHNfdGFibGVfZnVuY3MtPmluaXQoIHN3YXBfdGFibGUsIDQsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBuID0gMDsKLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgRlRfVUxvbmcgIHNpemU7Ci0gICAgICBGVF9CeXRlKiAgYmFzZTsKLQotCi0gICAgICAvKiB0aGUgZm9ybWF0IGlzIHNpbXBsZTogICAgICAgICovCi0gICAgICAvKiAgIGAvZ2x5cGhuYW1lJyArIGJpbmFyeSBkYXRhICovCi0KLSAgICAgIFQxX1NraXBfU3BhY2VzKCBwYXJzZXIgKTsKLQotICAgICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHdlIHN0b3Agd2hlbiB3ZSBmaW5kIGEgYGRlZicgb3IgYGVuZCcga2V5d29yZCAqLwotICAgICAgaWYgKCBjdXIgKyAzIDwgbGltaXQgJiYgSVNfUFNfREVMSU0oIGN1clszXSApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjdXJbMF0gPT0gJ2QnICYmCi0gICAgICAgICAgICAgY3VyWzFdID09ICdlJyAmJgotICAgICAgICAgICAgIGN1clsyXSA9PSAnZicgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhlcmUgYXJlIGZvbnRzIHdoaWNoIGhhdmUgdGhpczogKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgL0NoYXJTdHJpbmdzIDExOCBkaWN0IGRlZiAgICAgICovCi0gICAgICAgICAgLyogICBQcml2YXRlIGJlZ2luICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIENoYXJTdHJpbmdzIGJlZ2luICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBUbyBjYXRjaCB0aGlzIHdlIGlnbm9yZSBgZGVmJyBpZiAqLwotICAgICAgICAgIC8qIG5vIGNoYXJzdHJpbmcgaGFzIGFjdHVhbGx5IGJlZW4gICovCi0gICAgICAgICAgLyogc2Vlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIG4gKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGN1clswXSA9PSAnZScgJiYKLSAgICAgICAgICAgICBjdXJbMV0gPT0gJ24nICYmCi0gICAgICAgICAgICAgY3VyWzJdID09ICdkJyApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgaWYgKCBwYXJzZXItPnJvb3QuY3Vyc29yID49IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgIHJldHVybjsKLQotICAgICAgaWYgKCAqY3VyID09ICcvJyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGxlbjsKLQotCi0gICAgICAgIGlmICggY3VyICsgMiA+PSBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgY3VyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBgLycgKi8KLSAgICAgICAgbGVuID0gKEZUX1VJbnQpKCBwYXJzZXItPnJvb3QuY3Vyc29yIC0gY3VyICk7Ci0KLSAgICAgICAgaWYgKCAhcmVhZF9iaW5hcnlfZGF0YSggcGFyc2VyLCAmc2l6ZSwgJmJhc2UsIElTX0lOQ1JFTUVOVEFMICkgKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvKiBmb3Igc29tZSBub24tc3RhbmRhcmQgZm9udHMgbGlrZSBgT3B0aW1hJyB3aGljaCBwcm92aWRlcyAqLwotICAgICAgICAvKiBkaWZmZXJlbnQgb3V0bGluZXMgZGVwZW5kaW5nIG9uIHRoZSByZXNvbHV0aW9uIGl0IGlzICAgICAqLwotICAgICAgICAvKiBwb3NzaWJsZSB0byBnZXQgaGVyZSB0d2ljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGxvYWRlci0+bnVtX2dseXBocyApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIG5hbWVfdGFibGUsIG4sIGN1ciwgbGVuICsgMSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgLyogYWRkIGEgdHJhaWxpbmcgemVybyB0byB0aGUgbmFtZSB0YWJsZSAqLwotICAgICAgICBuYW1lX3RhYmxlLT5lbGVtZW50c1tuXVtsZW5dID0gJ1wwJzsKLQotICAgICAgICAvKiByZWNvcmQgaW5kZXggb2YgLy5ub3RkZWYgKi8KLSAgICAgICAgaWYgKCAqY3VyID09ICcuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGZ0X3N0cmNtcCggIi5ub3RkZWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKShuYW1lX3RhYmxlLT5lbGVtZW50c1tuXSkgKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIG5vdGRlZl9pbmRleCA9IG47Ci0gICAgICAgICAgbm90ZGVmX2ZvdW5kID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWID49IDAgJiYKLSAgICAgICAgICAgICBuIDwgbnVtX2dseXBocyArIFRBQkxFX0VYVEVORCAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgdGVtcCA9IE5VTEw7Ci0KLQotICAgICAgICAgIGlmICggc2l6ZSA8PSAoRlRfVUxvbmcpZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogdDFfZGVjcnlwdCgpIHNob3VsZG4ndCB3cml0ZSB0byBiYXNlIC0tIG1ha2UgdGVtcG9yYXJ5IGNvcHkgKi8KLSAgICAgICAgICBpZiAoIEZUX0FMTE9DKCB0ZW1wLCBzaXplICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIEZUX01FTV9DT1BZKCB0ZW1wLCBiYXNlLCBzaXplICk7Ci0gICAgICAgICAgcHNhdXgtPnQxX2RlY3J5cHQoIHRlbXAsIHNpemUsIDQzMzAgKTsKLSAgICAgICAgICBzaXplIC09IChGVF9VTG9uZylmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVY7Ci0gICAgICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIGNvZGVfdGFibGUsIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKyBmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVYsIHNpemUgKTsKLSAgICAgICAgICBGVF9GUkVFKCB0ZW1wICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBjb2RlX3RhYmxlLCBuLCBiYXNlLCBzaXplICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBuKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAhbiApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIGxvYWRlci0+bnVtX2dseXBocyA9IG47Ci0KLSAgICAvKiBpZiAvLm5vdGRlZiBpcyBmb3VuZCBidXQgZG9lcyBub3Qgb2NjdXB5IGluZGV4IDAsIGRvIG91ciBtYWdpYy4gKi8KLSAgICBpZiAoIG5vdGRlZl9mb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZnRfc3RyY21wKCAiLm5vdGRlZiIsIChjb25zdCBjaGFyKiluYW1lX3RhYmxlLT5lbGVtZW50c1swXSApICkKLSAgICB7Ci0gICAgICAvKiBTd2FwIGdseXBoIGluIGluZGV4IDAgd2l0aCAvLm5vdGRlZiBnbHlwaC4gIEZpcnN0LCBhZGQgaW5kZXggMCAgKi8KLSAgICAgIC8qIG5hbWUgYW5kIGNvZGUgZW50cmllcyB0byBzd2FwX3RhYmxlLiAgVGhlbiBwbGFjZSBub3RkZWZfaW5kZXggICAqLwotICAgICAgLyogbmFtZSBhbmQgY29kZSBlbnRyaWVzIGludG8gc3dhcF90YWJsZS4gIFRoZW4gc3dhcCBuYW1lIGFuZCBjb2RlICovCi0gICAgICAvKiBlbnRyaWVzIGF0IGluZGljZXMgbm90ZGVmX2luZGV4IGFuZCAwIHVzaW5nIHZhbHVlcyBzdG9yZWQgaW4gICAgKi8KLSAgICAgIC8qIHN3YXBfdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBJbmRleCAwIG5hbWUgKi8KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBzd2FwX3RhYmxlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfdGFibGUtPmVsZW1lbnRzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfdGFibGUtPmxlbmd0aHMgWzBdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBJbmRleCAwIGNvZGUgKi8KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBzd2FwX3RhYmxlLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfdGFibGUtPmVsZW1lbnRzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfdGFibGUtPmxlbmd0aHMgWzBdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBJbmRleCBub3RkZWZfaW5kZXggbmFtZSAqLwotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHN3YXBfdGFibGUsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90YWJsZS0+ZWxlbWVudHNbbm90ZGVmX2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3RhYmxlLT5sZW5ndGhzIFtub3RkZWZfaW5kZXhdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBJbmRleCBub3RkZWZfaW5kZXggY29kZSAqLwotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHN3YXBfdGFibGUsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV90YWJsZS0+ZWxlbWVudHNbbm90ZGVmX2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX3RhYmxlLT5sZW5ndGhzIFtub3RkZWZfaW5kZXhdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggbmFtZV90YWJsZSwgbm90ZGVmX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmVsZW1lbnRzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmxlbmd0aHMgWzBdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggY29kZV90YWJsZSwgbm90ZGVmX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmVsZW1lbnRzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmxlbmd0aHMgWzFdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggbmFtZV90YWJsZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX3RhYmxlLT5lbGVtZW50c1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX3RhYmxlLT5sZW5ndGhzIFsyXSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIGNvZGVfdGFibGUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+ZWxlbWVudHNbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+bGVuZ3RocyBbM10gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICB9Ci0gICAgZWxzZSBpZiAoICFub3RkZWZfZm91bmQgKQotICAgIHsKLSAgICAgIC8qIG5vdGRlZl9pbmRleCBpcyBhbHJlYWR5IDAsIG9yIC8ubm90ZGVmIGlzIHVuZGVmaW5lZCBpbiAgICovCi0gICAgICAvKiBjaGFyc3RyaW5ncyBkaWN0aW9uYXJ5LiAgV29ycnkgYWJvdXQgLy5ub3RkZWYgdW5kZWZpbmVkLiAqLwotICAgICAgLyogV2UgdGFrZSBpbmRleCAwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgdGFibGUocykgICAgKi8KLSAgICAgIC8qIGFuZCBhZGQgb3VyIG93biAvLm5vdGRlZiBnbHlwaCB0byBpbmRleCAwLiAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIDAgMzMzIGhzYncgZW5kY2hhciAqLwotICAgICAgRlRfQnl0ZSAgbm90ZGVmX2dseXBoW10gPSB7IDB4OEIsIDB4RjcsIDB4RTEsIDB4MEQsIDB4MEUgfTsKLSAgICAgIGNoYXIqICAgIG5vdGRlZl9uYW1lICAgID0gKGNoYXIgKikiLm5vdGRlZiI7Ci0KLQotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHN3YXBfdGFibGUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBzd2FwX3RhYmxlLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfdGFibGUtPmVsZW1lbnRzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfdGFibGUtPmxlbmd0aHMgWzBdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggbmFtZV90YWJsZSwgMCwgbm90ZGVmX25hbWUsIDggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBjb2RlX3RhYmxlLCAwLCBub3RkZWZfZ2x5cGgsIDUgKTsKLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIG5hbWVfdGFibGUsIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBjb2RlX3RhYmxlLCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmVsZW1lbnRzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmxlbmd0aHMgWzFdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiB3ZSBhZGRlZCBhIGdseXBoLiAqLwotICAgICAgbG9hZGVyLT5udW1fZ2x5cGhzICs9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotCi0gIEZhaWw6Ci0gICAgcGFyc2VyLT5yb290LmVycm9yID0gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoZSB0b2tlbiBmaWVsZCBzdGF0aWMgdmFyaWFibGVzLiAgVGhpcyBpcyBhIHNldCBvZiAgICAgICAgICAgICovCi0gIC8qIFQxX0ZpZWxkUmVjIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMKLSAgY29uc3QgVDFfRmllbGRSZWMgIHQxX2tleXdvcmRzW10gPQotICB7Ci0KLSNpbmNsdWRlICJ0MXRva2Vucy5oIgotCi0gICAgLyogbm93IGFkZCB0aGUgc3BlY2lhbCBmdW5jdGlvbnMuLi4gKi8KLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkZvbnRNYXRyaXgiLCAgICAgICAgICAgdDFfcGFyc2VfZm9udF9tYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiRW5jb2RpbmciLCAgICAgICAgICAgICBwYXJzZV9lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJTdWJycyIsICAgICAgICAgICAgICAgIHBhcnNlX3N1YnJzLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiQ2hhclN0cmluZ3MiLCAgICAgICAgICBwYXJzZV9jaGFyc3RyaW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIlByaXZhdGUiLCAgICAgICAgICAgICAgcGFyc2VfcHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJCbGVuZERlc2lnblBvc2l0aW9ucyIsIHBhcnNlX2JsZW5kX2Rlc2lnbl9wb3NpdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiQmxlbmREZXNpZ25NYXAiLCAgICAgICBwYXJzZV9ibGVuZF9kZXNpZ25fbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkJsZW5kQXhpc1R5cGVzIiwgICAgICAgcGFyc2VfYmxlbmRfYXhpc190eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJXZWlnaHRWZWN0b3IiLCAgICAgICAgIHBhcnNlX3dlaWdodF92ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiQnVpbGRDaGFyQXJyYXkiLCAgICAgICBwYXJzZV9idWlsZGNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0jZW5kaWYKLQotICAgIHsgMCwgVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk8sIFQxX0ZJRUxEX1RZUEVfTk9ORSwgMCwgMCwgMCwgMCwgMCwgMCB9Ci0gIH07Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcGFyc2VfZGljdCggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICBUMV9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgRlRfQnl0ZSogICBiYXNlLAotICAgICAgICAgICAgICBGVF9VTG9uZyAgIHNpemUgKQotICB7Ci0gICAgVDFfUGFyc2VyICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0gICAgRlRfQnl0ZSAgICpsaW1pdCwgKnN0YXJ0X2JpbmFyeSA9IE5VTEw7Ci0gICAgRlRfQm9vbCAgICBoYXZlX2ludGVnZXIgPSAwOwotCi0KLSAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gYmFzZTsKLSAgICBwYXJzZXItPnJvb3QubGltaXQgID0gYmFzZSArIHNpemU7Ci0gICAgcGFyc2VyLT5yb290LmVycm9yICA9IEZUX0Vycl9PazsKLQotICAgIGxpbWl0ID0gcGFyc2VyLT5yb290LmxpbWl0OwotCi0gICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotCi0gICAgd2hpbGUgKCBwYXJzZXItPnJvb3QuY3Vyc29yIDwgbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBjdXI7Ci0KLQotICAgICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLQotICAgICAgLyogbG9vayBmb3IgYGVleGVjJyAqLwotICAgICAgaWYgKCBJU19QU19UT0tFTiggY3VyLCBsaW1pdCwgImVleGVjIiApICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGxvb2sgZm9yIGBjbG9zZWZpbGUnIHdoaWNoIGVuZHMgdGhlIGVleGVjIHNlY3Rpb24gKi8KLSAgICAgIGVsc2UgaWYgKCBJU19QU19UT0tFTiggY3VyLCBsaW1pdCwgImNsb3NlZmlsZSIgKSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBpbiBhIHN5bnRoZXRpYyBmb250IHRoZSBiYXNlIGZvbnQgc3RhcnRzIGFmdGVyIGEgICAgICAgICAgICovCi0gICAgICAvKiBgRm9udERpY3Rpb25hcnknIHRva2VuIHRoYXQgaXMgcGxhY2VkIGFmdGVyIGEgUHJpdmF0ZSBkaWN0ICovCi0gICAgICBlbHNlIGlmICggSVNfUFNfVE9LRU4oIGN1ciwgbGltaXQsICJGb250RGlyZWN0b3J5IiApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBsb2FkZXItPmtleXdvcmRzX2VuY291bnRlcmVkICYgVDFfUFJJVkFURSApCi0gICAgICAgICAgbG9hZGVyLT5rZXl3b3Jkc19lbmNvdW50ZXJlZCB8PQotICAgICAgICAgICAgVDFfRk9OVERJUl9BRlRFUl9QUklWQVRFOwotICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yICs9IDEzOwotICAgICAgfQotCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYW4gaW50ZWdlciAqLwotICAgICAgZWxzZSBpZiAoIGZ0X2lzZGlnaXQoICpjdXIgKSApCi0gICAgICB7Ci0gICAgICAgIHN0YXJ0X2JpbmFyeSA9IGN1cjsKLSAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIGhhdmVfaW50ZWdlciA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGluIHZhbGlkIFR5cGUgMSBmb250cyB3ZSBkb24ndCBzZWUgYFJEJyBvciBgLXwnIGRpcmVjdGx5ICovCi0gICAgICAvKiBzaW5jZSB0aG9zZSB0b2tlbnMgYXJlIGhhbmRsZWQgYnkgcGFyc2Vfc3VicnMgYW5kICAgICAgICAqLwotICAgICAgLyogcGFyc2VfY2hhcnN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGVsc2UgaWYgKCAqY3VyID09ICdSJyAmJiBjdXIgKyA2IDwgbGltaXQgJiYgKihjdXIgKyAxKSA9PSAnRCcgJiYKLSAgICAgICAgICAgICAgICBoYXZlX2ludGVnZXIgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgczsKLSAgICAgICAgRlRfQnl0ZSogIGI7Ci0KLQotICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gc3RhcnRfYmluYXJ5OwotICAgICAgICBpZiAoICFyZWFkX2JpbmFyeV9kYXRhKCBwYXJzZXIsICZzLCAmYiwgSVNfSU5DUkVNRU5UQUwgKSApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGhhdmVfaW50ZWdlciA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCAqY3VyID09ICctJyAmJiBjdXIgKyA2IDwgbGltaXQgJiYgKihjdXIgKyAxKSA9PSAnfCcgJiYKLSAgICAgICAgICAgICAgICBoYXZlX2ludGVnZXIgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgczsKLSAgICAgICAgRlRfQnl0ZSogIGI7Ci0KLQotICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gc3RhcnRfYmluYXJ5OwotICAgICAgICBpZiAoICFyZWFkX2JpbmFyeV9kYXRhKCBwYXJzZXIsICZzLCAmYiwgSVNfSU5DUkVNRU5UQUwgKSApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGhhdmVfaW50ZWdlciA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGxvb2sgZm9yIGltbWVkaWF0ZXMgKi8KLSAgICAgIGVsc2UgaWYgKCAqY3VyID09ICcvJyAmJiBjdXIgKyAyIDwgbGltaXQgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBsZW47Ci0KLQotICAgICAgICBjdXIrKzsKLQotICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gY3VyOwotICAgICAgICBUMV9Ta2lwX1BTX1Rva2VuKCBwYXJzZXIgKTsKLSAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBsZW4gPSAoRlRfVUludCkoIHBhcnNlci0+cm9vdC5jdXJzb3IgLSBjdXIgKTsKLQotICAgICAgICBpZiAoIGxlbiA+IDAgJiYgbGVuIDwgMjIgJiYgcGFyc2VyLT5yb290LmN1cnNvciA8IGxpbWl0ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIG5vdyBjb21wYXJlIHRoZSBpbW1lZGlhdGUgbmFtZSB0byB0aGUga2V5d29yZCB0YWJsZSAqLwotICAgICAgICAgIFQxX0ZpZWxkICBrZXl3b3JkID0gKFQxX0ZpZWxkKXQxX2tleXdvcmRzOwotCi0KLSAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0J5dGUqICBuYW1lOwotCi0KLSAgICAgICAgICAgIG5hbWUgPSAoRlRfQnl0ZSopa2V5d29yZC0+aWRlbnQ7Ci0gICAgICAgICAgICBpZiAoICFuYW1lICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmICggY3VyWzBdID09IG5hbWVbMF0gICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgbGVuID09IGZ0X3N0cmxlbiggKGNvbnN0IGNoYXIgKiluYW1lICkgJiYKLSAgICAgICAgICAgICAgICAgZnRfbWVtY21wKCBjdXIsIG5hbWUsIGxlbiApID09IDAgICAgICAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBXZSBmb3VuZCBpdCAtLSBydW4gdGhlIHBhcnNpbmcgY2FsbGJhY2shICAgICAqLwotICAgICAgICAgICAgICAvKiBXZSByZWNvcmQgZXZlcnkgaW5zdGFuY2Ugb2YgZXZlcnkgZmllbGQgICAgICAqLwotICAgICAgICAgICAgICAvKiAodW50aWwgd2UgcmVhY2ggdGhlIGJhc2UgZm9udCBvZiBhICAgICAgICAgICAqLwotICAgICAgICAgICAgICAvKiBzeW50aGV0aWMgZm9udCkgdG8gZGVhbCBhZGVxdWF0ZWx5IHdpdGggICAgICAqLwotICAgICAgICAgICAgICAvKiBtdWx0aXBsZSBtYXN0ZXIgZm9udHM7IHRoaXMgaXMgYWxzbyAgICAgICAgICAqLwotICAgICAgICAgICAgICAvKiBuZWNlc3NhcnkgYmVjYXVzZSBsYXRlciBQb3N0U2NyaXB0ICAgICAgICAgICAqLwotICAgICAgICAgICAgICAvKiBkZWZpbml0aW9ucyBvdmVycmlkZSBlYXJsaWVyIG9uZXMuICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgIC8qIE9uY2Ugd2UgZW5jb3VudGVyIGBGb250RGlyZWN0b3J5JyBhZnRlciAgICAgICovCi0gICAgICAgICAgICAgIC8qIGAvUHJpdmF0ZScsIHdlIGtub3cgdGhhdCB0aGlzIGlzIGEgc3ludGhldGljICovCi0gICAgICAgICAgICAgIC8qIGZvbnQ7IGV4Y2VwdCBmb3IgYC9DaGFyU3RyaW5ncycgd2UgYXJlIG5vdCAgICovCi0gICAgICAgICAgICAgIC8qIGludGVyZXN0ZWQgaW4gYW55dGhpbmcgdGhhdCBmb2xsb3dzIHRoaXMgICAgICovCi0gICAgICAgICAgICAgIC8qIGBGb250RGlyZWN0b3J5Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgLyogTU0gZm9udHMgaGF2ZSBtb3JlIHRoYW4gb25lIC9Qcml2YXRlIHRva2VuIGF0ICovCi0gICAgICAgICAgICAgIC8qIHRoZSB0b3AgbGV2ZWw7IGxldCdzIGhvcGUgdGhhdCBhbGwgdGhlIGp1bmsgICAqLwotICAgICAgICAgICAgICAvKiB0aGF0IGZvbGxvd3MgdGhlIGZpcnN0IC9Qcml2YXRlIHRva2VuIGlzIG5vdCAgKi8KLSAgICAgICAgICAgICAgLyogaW50ZXJlc3RpbmcgdG8gdXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgLyogQWNjb3JkaW5nIHRvIEFkb2JlIFRlY2ggTm90ZSAjNTE3NSAoQ0lELUtleWVkICovCi0gICAgICAgICAgICAgIC8qIEZvbnQgSW5zdGFsbGF0aW9uIGZvciBBVE0gU29mdHdhcmUpIGEgYGJlZ2luJyAqLwotICAgICAgICAgICAgICAvKiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGV4YWN0bHkgb25lIGBlbmQnLCBhbmQgICAgKi8KLSAgICAgICAgICAgICAgLyogYGJlZ2luJyAtLSBgZW5kJyBwYWlycyBtdXN0IGJlIGFjY3VyYXRlbHkgICAgICovCi0gICAgICAgICAgICAgIC8qIHBhaXJlZC4gIFdlIGNvdWxkIHVzZSB0aGlzIHRvIGRpc3Rpbmd1aXNoICAgICAqLwotICAgICAgICAgICAgICAvKiBiZXR3ZWVuIHRoZSBnbG9iYWwgUHJpdmF0ZSBhbmQgdGhlIFByaXZhdGUgICAgKi8KLSAgICAgICAgICAgICAgLyogZGljdCB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBCbGVuZCBkaWN0LiAgICAgICovCi0KLSAgICAgICAgICAgICAgY29uc3QgRlRfVUludCBkaWN0ID0KLSAgICAgICAgICAgICAgICAoIGxvYWRlci0+a2V5d29yZHNfZW5jb3VudGVyZWQgJiBUMV9QUklWQVRFICkKLSAgICAgICAgICAgICAgICAgICAgPyBUMV9GSUVMRF9ESUNUX1BSSVZBVEUKLSAgICAgICAgICAgICAgICAgICAgOiBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUOwotCi0gICAgICAgICAgICAgIGlmICggISggZGljdCAmIGtleXdvcmQtPmRpY3QgKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGVF9UUkFDRTEoKCAicGFyc2VfZGljdDogZm91bmQgYCVzJyBidXQgaWdub3JpbmcgaXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzaW5jZSBpdCBpcyBpbiB0aGUgd3JvbmcgZGljdGlvbmFyeVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLT5pZGVudCApKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlmICggISggbG9hZGVyLT5rZXl3b3Jkc19lbmNvdW50ZXJlZCAmCi0gICAgICAgICAgICAgICAgICAgICAgVDFfRk9OVERJUl9BRlRFUl9QUklWQVRFICAgICApICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICBmdF9zdHJjbXAoIChjb25zdCBjaGFyKiluYW1lLCAiQ2hhclN0cmluZ3MiICkgPT0gMCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSB0MV9sb2FkX2tleXdvcmQoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggRlRfRVJSX0VRKCBwYXJzZXItPnJvb3QuZXJyb3IsIElnbm9yZSApICkKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfRXJyX09rOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLT5yb290LmVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAga2V5d29yZCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGhhdmVfaW50ZWdlciA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBoYXZlX2ludGVnZXIgPSAwOwotICAgICAgfQotCi0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHBhcnNlci0+cm9vdC5lcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdDFfaW5pdF9sb2FkZXIoIFQxX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgVDFfRmFjZSAgICBmYWNlICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotCi0gICAgRlRfWkVSTyggbG9hZGVyICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHQxX2RvbmVfbG9hZGVyKCBUMV9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBUMV9QYXJzZXIgIHBhcnNlciA9ICZsb2FkZXItPnBhcnNlcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+cm9vdC5tZW1vcnk7Ci0KLQotICAgIC8qIGZpbmFsaXplIHRhYmxlcyAqLwotICAgIFQxX1JlbGVhc2VfVGFibGUoICZsb2FkZXItPmVuY29kaW5nX3RhYmxlICk7Ci0gICAgVDFfUmVsZWFzZV9UYWJsZSggJmxvYWRlci0+Y2hhcnN0cmluZ3MgKTsKLSAgICBUMV9SZWxlYXNlX1RhYmxlKCAmbG9hZGVyLT5nbHlwaF9uYW1lcyApOwotICAgIFQxX1JlbGVhc2VfVGFibGUoICZsb2FkZXItPnN3YXBfdGFibGUgKTsKLSAgICBUMV9SZWxlYXNlX1RhYmxlKCAmbG9hZGVyLT5zdWJycyApOwotCi0gICAgLyogZmluYWxpemUgaGFzaCAqLwotICAgIGZ0X2hhc2hfbnVtX2ZyZWUoIGxvYWRlci0+c3VicnNfaGFzaCwgbWVtb3J5ICk7Ci0gICAgRlRfRlJFRSggbG9hZGVyLT5zdWJyc19oYXNoICk7Ci0KLSAgICAvKiBmaW5hbGl6ZSBwYXJzZXIgKi8KLSAgICBUMV9GaW5hbGl6ZV9QYXJzZXIoIHBhcnNlciApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfT3Blbl9GYWNlKCBUMV9GYWNlICBmYWNlICkKLSAgewotICAgIFQxX0xvYWRlclJlYyAgIGxvYWRlcjsKLSAgICBUMV9QYXJzZXIgICAgICBwYXJzZXI7Ci0gICAgVDFfRm9udCAgICAgICAgdHlwZTEgPSAmZmFjZS0+dHlwZTE7Ci0gICAgUFNfUHJpdmF0ZSAgICAgcHJpdiAgPSAmdHlwZTEtPnByaXZhdGVfZGljdDsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLQotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0KLQotICAgIHQxX2luaXRfbG9hZGVyKCAmbG9hZGVyLCBmYWNlICk7Ci0KLSAgICAvKiBkZWZhdWx0IHZhbHVlcyAqLwotICAgIGZhY2UtPm5kdl9pZHggICAgICAgICAgPSAtMTsKLSAgICBmYWNlLT5jZHZfaWR4ICAgICAgICAgID0gLTE7Ci0gICAgZmFjZS0+bGVuX2J1aWxkY2hhciAgICA9IDA7Ci0KLSAgICBwcml2LT5ibHVlX3NoaWZ0ICAgICAgID0gNzsKLSAgICBwcml2LT5ibHVlX2Z1enogICAgICAgID0gMTsKLSAgICBwcml2LT5sZW5JViAgICAgICAgICAgID0gNDsKLSAgICBwcml2LT5leHBhbnNpb25fZmFjdG9yID0gKEZUX0ZpeGVkKSggMC4wNiAqIDB4MTAwMDBMICk7Ci0gICAgcHJpdi0+Ymx1ZV9zY2FsZSAgICAgICA9IChGVF9GaXhlZCkoIDAuMDM5NjI1ICogMHgxMDAwMEwgKiAxMDAwICk7Ci0KLSAgICBwYXJzZXIgPSAmbG9hZGVyLnBhcnNlcjsKLSAgICBlcnJvciAgPSBUMV9OZXdfUGFyc2VyKCBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNhdXggKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gcGFyc2VfZGljdCggZmFjZSwgJmxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+YmFzZV9kaWN0LCBwYXJzZXItPmJhc2VfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IFQxX0dldF9Qcml2YXRlX0RpY3QoIHBhcnNlciwgcHNhdXggKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gcGFyc2VfZGljdCggZmFjZSwgJmxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+cHJpdmF0ZV9kaWN0LCBwYXJzZXItPnByaXZhdGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBlbnN1cmUgZXZlbi1uZXNzIG9mIGBudW1fYmx1ZV92YWx1ZXMnICovCi0gICAgcHJpdi0+bnVtX2JsdWVfdmFsdWVzICY9IH4xOwotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVAotCi0gICAgaWYgKCBmYWNlLT5ibGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZhY2UtPmJsZW5kLT5udW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yICE9IDAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZmFjZS0+YmxlbmQtPm51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3IgIT0gZmFjZS0+YmxlbmQtPm51bV9heGlzICkKLSAgICB7Ci0gICAgICAvKiB3ZSBkb24ndCB1c2UgaXQgY3VycmVudGx5IHNvIGp1c3Qgd2FybiwgcmVzZXQsIGFuZCBpZ25vcmUgKi8KLSAgICAgIEZUX0VSUk9SKCggIlQxX09wZW5fRmFjZSgpOiAvRGVzaWduVmVjdG9yIGNvbnRhaW5zICV1IGVudHJpZXMgIgotICAgICAgICAgICAgICAgICAid2hpbGUgdGhlcmUgYXJlICV1IGF4ZXMuXG4iLAotICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZC0+bnVtX2RlZmF1bHRfZGVzaWduX3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgZmFjZS0+YmxlbmQtPm51bV9heGlzICkpOwotCi0gICAgICBmYWNlLT5ibGVuZC0+bnVtX2RlZmF1bHRfZGVzaWduX3ZlY3RvciA9IDA7Ci0gICAgfQotCi0gICAgLyogdGhlIGZvbGxvd2luZyBjYW4gaGFwcGVuIGZvciBNTSBpbnN0YW5jZXM7IHdlIHRoZW4gdHJlYXQgdGhlICovCi0gICAgLyogZm9udCBhcyBhIG5vcm1hbCBQUyBmb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBmYWNlLT5ibGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoICFmYWNlLT5ibGVuZC0+bnVtX2Rlc2lnbnMgfHwgIWZhY2UtPmJsZW5kLT5udW1fYXhpcyApICkKLSAgICAgIFQxX0RvbmVfQmxlbmQoIGZhY2UgKTsKLQotICAgIC8qIGFub3RoZXIgc2FmZXR5IGNoZWNrICovCi0gICAgaWYgKCBmYWNlLT5ibGVuZCApCi0gICAgewotICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2UtPmJsZW5kLT5udW1fYXhpczsgaSsrICkKLSAgICAgICAgaWYgKCAhZmFjZS0+YmxlbmQtPmRlc2lnbl9tYXBbaV0ubnVtX3BvaW50cyApCi0gICAgICAgIHsKLSAgICAgICAgICBUMV9Eb25lX0JsZW5kKCBmYWNlICk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGZhY2UtPmJsZW5kICkKLSAgICB7Ci0gICAgICBpZiAoIGZhY2UtPmxlbl9idWlsZGNoYXIgPiAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBmYWNlLT5idWlsZGNoYXIsIGZhY2UtPmxlbl9idWlsZGNoYXIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJUMV9PcGVuX0ZhY2U6IGNhbm5vdCBhbGxvY2F0ZSBCdWlsZENoYXJBcnJheVxuIiApKTsKLSAgICAgICAgICBmYWNlLT5sZW5fYnVpbGRjaGFyID0gMDsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgZmFjZS0+bGVuX2J1aWxkY2hhciA9IDA7Ci0KLSNlbmRpZiAvKiAhVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUICovCi0KLSAgICAvKiBub3csIHByb3BhZ2F0ZSB0aGUgc3VicnMsIGNoYXJzdHJpbmdzLCBhbmQgZ2x5cGhuYW1lcyB0YWJsZXMgKi8KLSAgICAvKiB0byB0aGUgVHlwZTEgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB0eXBlMS0+bnVtX2dseXBocyA9IGxvYWRlci5udW1fZ2x5cGhzOwotCi0gICAgaWYgKCBsb2FkZXIuc3VicnMuaW5pdCApCi0gICAgewotICAgICAgdHlwZTEtPm51bV9zdWJycyAgID0gbG9hZGVyLm51bV9zdWJyczsKLSAgICAgIHR5cGUxLT5zdWJyc19ibG9jayA9IGxvYWRlci5zdWJycy5ibG9jazsKLSAgICAgIHR5cGUxLT5zdWJycyAgICAgICA9IGxvYWRlci5zdWJycy5lbGVtZW50czsKLSAgICAgIHR5cGUxLT5zdWJyc19sZW4gICA9IGxvYWRlci5zdWJycy5sZW5ndGhzOwotICAgICAgdHlwZTEtPnN1YnJzX2hhc2ggID0gbG9hZGVyLnN1YnJzX2hhc2g7Ci0KLSAgICAgIC8qIHByZXZlbnQgYHQxX2RvbmVfbG9hZGVyJyBmcm9tIGZyZWVpbmcgdGhlIHByb3BhZ2F0ZWQgZGF0YSAqLwotICAgICAgbG9hZGVyLnN1YnJzLmluaXQgPSAwOwotICAgICAgbG9hZGVyLnN1YnJzX2hhc2ggPSBOVUxMOwotICAgIH0KLQotICAgIGlmICggIUlTX0lOQ1JFTUVOVEFMICkKLSAgICAgIGlmICggIWxvYWRlci5jaGFyc3RyaW5ncy5pbml0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiVDFfT3Blbl9GYWNlOiBubyBgL0NoYXJTdHJpbmdzJyBhcnJheSBpbiBmYWNlXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICB9Ci0KLSAgICBsb2FkZXIuY2hhcnN0cmluZ3MuaW5pdCAgPSAwOwotICAgIHR5cGUxLT5jaGFyc3RyaW5nc19ibG9jayA9IGxvYWRlci5jaGFyc3RyaW5ncy5ibG9jazsKLSAgICB0eXBlMS0+Y2hhcnN0cmluZ3MgICAgICAgPSBsb2FkZXIuY2hhcnN0cmluZ3MuZWxlbWVudHM7Ci0gICAgdHlwZTEtPmNoYXJzdHJpbmdzX2xlbiAgID0gbG9hZGVyLmNoYXJzdHJpbmdzLmxlbmd0aHM7Ci0KLSAgICAvKiB3ZSBjb3B5IHRoZSBnbHlwaCBuYW1lcyBgYmxvY2snIGFuZCBgZWxlbWVudHMnIGZpZWxkczsgKi8KLSAgICAvKiB0aGUgYGxlbmd0aHMnIGZpZWxkIG11c3QgYmUgcmVsZWFzZWQgbGF0ZXIgICAgICAgICAgICAgKi8KLSAgICB0eXBlMS0+Z2x5cGhfbmFtZXNfYmxvY2sgICAgPSBsb2FkZXIuZ2x5cGhfbmFtZXMuYmxvY2s7Ci0gICAgdHlwZTEtPmdseXBoX25hbWVzICAgICAgICAgID0gKEZUX1N0cmluZyoqKWxvYWRlci5nbHlwaF9uYW1lcy5lbGVtZW50czsKLSAgICBsb2FkZXIuZ2x5cGhfbmFtZXMuYmxvY2sgICAgPSBOVUxMOwotICAgIGxvYWRlci5nbHlwaF9uYW1lcy5lbGVtZW50cyA9IE5VTEw7Ci0KLSAgICAvKiB3ZSBtdXN0IG5vdyBidWlsZCB0eXBlMS5lbmNvZGluZyB3aGVuIHdlIGhhdmUgYSBjdXN0b20gYXJyYXkgKi8KLSAgICBpZiAoIHR5cGUxLT5lbmNvZGluZ190eXBlID09IFQxX0VOQ09ESU5HX1RZUEVfQVJSQVkgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICBjaGFyY29kZSwgaWR4LCBtaW5fY2hhciwgbWF4X2NoYXI7Ci0gICAgICBGVF9CeXRlKiAgZ2x5cGhfbmFtZTsKLQotCi0gICAgICAvKiBPSywgd2UgZG8gdGhlIGZvbGxvd2luZzogZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgZW5jb2RpbmcgICovCi0gICAgICAvKiB0YWJsZSwgbG9vayB1cCB0aGUgaW5kZXggb2YgdGhlIGdseXBoIGhhdmluZyB0aGUgc2FtZSBuYW1lICovCi0gICAgICAvKiB0aGUgaW5kZXggaXMgdGhlbiBzdG9yZWQgaW4gdHlwZTEuZW5jb2RpbmcuY2hhcl9pbmRleCwgYW5kICovCi0gICAgICAvKiB0aGUgbmFtZSB0byB0eXBlMS5lbmNvZGluZy5jaGFyX25hbWUgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIG1pbl9jaGFyID0gMDsKLSAgICAgIG1heF9jaGFyID0gMDsKLQotICAgICAgY2hhcmNvZGUgPSAwOwotICAgICAgZm9yICggOyBjaGFyY29kZSA8IGxvYWRlci5lbmNvZGluZ190YWJsZS5tYXhfZWxlbXM7IGNoYXJjb2RlKysgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgY2hhcl9uYW1lOwotCi0KLSAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfaW5kZXhbY2hhcmNvZGVdID0gMDsKLSAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZSBbY2hhcmNvZGVdID0gKGNoYXIgKikiLm5vdGRlZiI7Ci0KLSAgICAgICAgY2hhcl9uYW1lID0gbG9hZGVyLmVuY29kaW5nX3RhYmxlLmVsZW1lbnRzW2NoYXJjb2RlXTsKLSAgICAgICAgaWYgKCBjaGFyX25hbWUgKQotICAgICAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IHR5cGUxLT5udW1fZ2x5cGhzOyBpZHgrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2x5cGhfbmFtZSA9IChGVF9CeXRlKil0eXBlMS0+Z2x5cGhfbmFtZXNbaWR4XTsKLSAgICAgICAgICAgIGlmICggZnRfc3RyY21wKCAoY29uc3QgY2hhciopY2hhcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilnbHlwaF9uYW1lICkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHR5cGUxLT5lbmNvZGluZy5jaGFyX2luZGV4W2NoYXJjb2RlXSA9IChGVF9VU2hvcnQpaWR4OwotICAgICAgICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lIFtjaGFyY29kZV0gPSAoY2hhciopZ2x5cGhfbmFtZTsKLQotICAgICAgICAgICAgICAvKiBDaGFuZ2UgbWluL21heCBlbmNvZGVkIGNoYXIgb25seSBpZiBnbHlwaCBuYW1lIGlzICovCi0gICAgICAgICAgICAgIC8qIG5vdCAvLm5vdGRlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaWYgKCBmdF9zdHJjbXAoIChjb25zdCBjaGFyKikiLm5vdGRlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZ2x5cGhfbmFtZSApICE9IDAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjaGFyY29kZSA8IG1pbl9jaGFyICkKLSAgICAgICAgICAgICAgICAgIG1pbl9jaGFyID0gY2hhcmNvZGU7Ci0gICAgICAgICAgICAgICAgaWYgKCBjaGFyY29kZSA+PSBtYXhfY2hhciApCi0gICAgICAgICAgICAgICAgICBtYXhfY2hhciA9IGNoYXJjb2RlICsgMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHR5cGUxLT5lbmNvZGluZy5jb2RlX2ZpcnN0ID0gbWluX2NoYXI7Ci0gICAgICB0eXBlMS0+ZW5jb2RpbmcuY29kZV9sYXN0ICA9IG1heF9jaGFyOwotICAgICAgdHlwZTEtPmVuY29kaW5nLm51bV9jaGFycyAgPSBsb2FkZXIubnVtX2NoYXJzOwotICAgIH0KLQotICBFeGl0OgotICAgIHQxX2RvbmVfbG9hZGVyKCAmbG9hZGVyICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFsb2FkLmggYi9zcmMvdHlwZTEvdDFsb2FkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkODY5ODQuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGUxL3QxbG9hZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgZm9udCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUMUxPQURfSF8KLSNkZWZpbmUgVDFMT0FEX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0KLSNpbmNsdWRlICJ0MXBhcnNlLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfTG9hZGVyXwotICB7Ci0gICAgVDFfUGFyc2VyUmVjICBwYXJzZXI7ICAgICAgICAgIC8qIHBhcnNlciB1c2VkIHRvIHJlYWQgdGhlIHN0cmVhbSAqLwotCi0gICAgRlRfSW50ICAgICAgICBudW1fY2hhcnM7ICAgICAgIC8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGVuY29kaW5nICovCi0gICAgUFNfVGFibGVSZWMgICBlbmNvZGluZ190YWJsZTsgIC8qIFBTX1RhYmxlIHVzZWQgdG8gc3RvcmUgdGhlICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuY29kaW5nIGNoYXJhY3RlciBuYW1lcyAgICAgICAgICovCi0KLSAgICBGVF9JbnQgICAgICAgIG51bV9nbHlwaHM7Ci0gICAgUFNfVGFibGVSZWMgICBnbHlwaF9uYW1lczsKLSAgICBQU19UYWJsZVJlYyAgIGNoYXJzdHJpbmdzOwotICAgIFBTX1RhYmxlUmVjICAgc3dhcF90YWJsZTsgICAgICAvKiBGb3IgbW92aW5nIC5ub3RkZWYgZ2x5cGggdG8gaW5kZXggMC4gKi8KLQotICAgIEZUX0ludCAgICAgICAgbnVtX3N1YnJzOwotICAgIFBTX1RhYmxlUmVjICAgc3VicnM7Ci0gICAgRlRfSGFzaCAgICAgICBzdWJyc19oYXNoOwotICAgIEZUX0Jvb2wgICAgICAgZm9udGRhdGE7Ci0KLSAgICBGVF9VSW50ICAgICAgIGtleXdvcmRzX2VuY291bnRlcmVkOyAvKiBUMV9MT0FERVJfRU5DT1VOVEVSRURfWFhYICovCi0KLSAgfSBUMV9Mb2FkZXJSZWMsICpUMV9Mb2FkZXI7Ci0KLQotICAvKiB0cmVhdG1lbnQgb2Ygc29tZSBrZXl3b3JkcyBkaWZmZXJzIGRlcGVuZGluZyBvbiB3aGV0aGVyICovCi0gIC8qIHRoZXkgcHJlY2VkZSBvciBmb2xsb3cgY2VydGFpbiBvdGhlciBrZXl3b3JkcyAgICAgICAgICAgKi8KLQotI2RlZmluZSBUMV9QUklWQVRFICAgICAgICAgICAgICAgICggMSA8PCAwICkKLSNkZWZpbmUgVDFfRk9OVERJUl9BRlRFUl9QUklWQVRFICAoIDEgPDwgMSApCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9PcGVuX0ZhY2UoIFQxX0ZhY2UgIGZhY2UgKTsKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9HZXRfTXVsdGlfTWFzdGVyKCBUMV9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWx0aV9NYXN0ZXIqICBtYXN0ZXIgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9HZXRfTU1fVmFyKCBUMV9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfTU1fVmFyKiAgKm1hc3RlciApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX1NldF9NTV9CbGVuZCggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX0dldF9NTV9CbGVuZCggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX1NldF9NTV9EZXNpZ24oIFQxX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX0dldF9WYXJfRGVzaWduKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX1NldF9WYXJfRGVzaWduKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDFfRG9uZV9CbGVuZCggVDFfRmFjZSAgZmFjZSApOwotCi0jZW5kaWYgLyogIVQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVCAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFQxTE9BRF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3Qxb2Jqcy5jIGIvc3JjL3R5cGUxL3Qxb2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWMxMjkyLi4wMDAwMDAwCi0tLSBhL3NyYy90eXBlMS90MW9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MW9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIG9iamVjdHMgbWFuYWdlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLQotI2luY2x1ZGUgInQxZ2xvYWQuaCIKLSNpbmNsdWRlICJ0MWxvYWQuaCIKLQotI2luY2x1ZGUgInQxZXJyb3JzLmgiCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLSNpbmNsdWRlICJ0MWFmbS5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90MW9ianMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBQU0hfR2xvYmFsc19GdW5jcwotICBUMV9TaXplX0dldF9HbG9iYWxzX0Z1bmNzKCBUMV9TaXplICBzaXplICkKLSAgewotICAgIFQxX0ZhY2UgICAgICAgICAgIGZhY2UgICAgID0gKFQxX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotICAgIFBTSGludGVyX1NlcnZpY2UgIHBzaGludGVyID0gKFBTSGludGVyX1NlcnZpY2UpZmFjZS0+cHNoaW50ZXI7Ci0gICAgRlRfTW9kdWxlICAgICAgICAgbW9kdWxlOwotCi0KLSAgICBtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBzaXplLT5yb290LmZhY2UtPmRyaXZlci0+cm9vdC5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2hpbnRlciIgKTsKLSAgICByZXR1cm4gKCBtb2R1bGUgJiYgcHNoaW50ZXIgJiYgcHNoaW50ZXItPmdldF9nbG9iYWxzX2Z1bmNzICkKLSAgICAgICAgICAgPyBwc2hpbnRlci0+Z2V0X2dsb2JhbHNfZnVuY3MoIG1vZHVsZSApCi0gICAgICAgICAgIDogMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVDFfU2l6ZV9Eb25lKCBGVF9TaXplICB0MXNpemUgKSAgICAgICAgICAvKiBUMV9TaXplICovCi0gIHsKLSAgICBUMV9TaXplICBzaXplID0gKFQxX1NpemUpdDFzaXplOwotCi0KLSAgICBpZiAoIHQxc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhICkKLSAgICB7Ci0gICAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3M7Ci0KLQotICAgICAgZnVuY3MgPSBUMV9TaXplX0dldF9HbG9iYWxzX0Z1bmNzKCBzaXplICk7Ci0gICAgICBpZiAoIGZ1bmNzICkKLSAgICAgICAgZnVuY3MtPmRlc3Ryb3koIChQU0hfR2xvYmFscyl0MXNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YSApOwotCi0gICAgICB0MXNpemUtPmludGVybmFsLT5tb2R1bGVfZGF0YSA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfU2l6ZV9Jbml0KCBGVF9TaXplICB0MXNpemUgKSAgICAgIC8qIFQxX1NpemUgKi8KLSAgewotICAgIFQxX1NpemUgICAgICAgICAgICBzaXplICA9IChUMV9TaXplKXQxc2l6ZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzID0gVDFfU2l6ZV9HZXRfR2xvYmFsc19GdW5jcyggc2l6ZSApOwotCi0KLSAgICBpZiAoIGZ1bmNzICkKLSAgICB7Ci0gICAgICBQU0hfR2xvYmFscyAgZ2xvYmFsczsKLSAgICAgIFQxX0ZhY2UgICAgICBmYWNlID0gKFQxX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotCi0KLSAgICAgIGVycm9yID0gZnVuY3MtPmNyZWF0ZSggc2l6ZS0+cm9vdC5mYWNlLT5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QsICZnbG9iYWxzICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHQxc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhID0gZ2xvYmFsczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9TaXplX1JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgdDFzaXplLCAgICAgLyogVDFfU2l6ZSAqLwotICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICkKLSAgewotICAgIFQxX1NpemUgICAgICAgICAgICBzaXplICA9IChUMV9TaXplKXQxc2l6ZTsKLSAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3MgPSBUMV9TaXplX0dldF9HbG9iYWxzX0Z1bmNzKCBzaXplICk7Ci0KLQotICAgIEZUX1JlcXVlc3RfTWV0cmljcyggc2l6ZS0+cm9vdC5mYWNlLCByZXEgKTsKLQotICAgIGlmICggZnVuY3MgKQotICAgICAgZnVuY3MtPnNldF9zY2FsZSggKFBTSF9HbG9iYWxzKXQxc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+cm9vdC5tZXRyaWNzLnhfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplLT5yb290Lm1ldHJpY3MueV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xPVCAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUMV9HbHlwaFNsb3RfRG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIHNsb3QtPmludGVybmFsLT5nbHlwaF9oaW50cyA9IE5VTEw7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9HbHlwaFNsb3RfSW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIFQxX0ZhY2UgICAgICAgICAgIGZhY2U7Ci0gICAgUFNIaW50ZXJfU2VydmljZSAgcHNoaW50ZXI7Ci0KLQotICAgIGZhY2UgICAgID0gKFQxX0ZhY2Upc2xvdC0+ZmFjZTsKLSAgICBwc2hpbnRlciA9IChQU0hpbnRlcl9TZXJ2aWNlKWZhY2UtPnBzaGludGVyOwotCi0gICAgaWYgKCBwc2hpbnRlciApCi0gICAgewotICAgICAgRlRfTW9kdWxlICBtb2R1bGU7Ci0KLQotICAgICAgbW9kdWxlID0gRlRfR2V0X01vZHVsZSggc2xvdC0+ZmFjZS0+ZHJpdmVyLT5yb290LmxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNoaW50ZXIiICk7Ci0gICAgICBpZiAoIG1vZHVsZSApCi0gICAgICB7Ci0gICAgICAgIFQxX0hpbnRzX0Z1bmNzICBmdW5jczsKLQotCi0gICAgICAgIGZ1bmNzID0gcHNoaW50ZXItPmdldF90MV9mdW5jcyggbW9kdWxlICk7Ci0gICAgICAgIHNsb3QtPmludGVybmFsLT5nbHlwaF9oaW50cyA9ICh2b2lkKilmdW5jczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRmFjZV9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZhY2Ugb2JqZWN0IGRlc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGZhY2Ugb2JqZWN0IHRvIGRlc3Ryb3kuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUMV9GYWNlX0RvbmUoIEZUX0ZhY2UgIHQxZmFjZSApICAgICAgICAgLyogVDFfRmFjZSAqLwotICB7Ci0gICAgVDFfRmFjZSAgICBmYWNlID0gKFQxX0ZhY2UpdDFmYWNlOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIFQxX0ZvbnQgICAgdHlwZTE7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuOwotCi0gICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgdHlwZTEgID0gJmZhY2UtPnR5cGUxOwotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVAotICAgIC8qIHJlbGVhc2UgbXVsdGlwbGUgbWFzdGVycyBpbmZvcm1hdGlvbiAqLwotICAgIEZUX0FTU0VSVCggKCBmYWNlLT5sZW5fYnVpbGRjaGFyID09IDAgKSA9PSAoIGZhY2UtPmJ1aWxkY2hhciA9PSBOVUxMICkgKTsKLQotICAgIGlmICggZmFjZS0+YnVpbGRjaGFyICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBmYWNlLT5idWlsZGNoYXIgKTsKLQotICAgICAgZmFjZS0+YnVpbGRjaGFyICAgICA9IE5VTEw7Ci0gICAgICBmYWNlLT5sZW5fYnVpbGRjaGFyID0gMDsKLSAgICB9Ci0KLSAgICBUMV9Eb25lX0JsZW5kKCBmYWNlICk7Ci0gICAgZmFjZS0+YmxlbmQgPSBOVUxMOwotI2VuZGlmCi0KLSAgICAvKiByZWxlYXNlIGZvbnQgaW5mbyBzdHJpbmdzICovCi0gICAgewotICAgICAgUFNfRm9udEluZm8gIGluZm8gPSAmdHlwZTEtPmZvbnRfaW5mbzsKLQotCi0gICAgICBGVF9GUkVFKCBpbmZvLT52ZXJzaW9uICk7Ci0gICAgICBGVF9GUkVFKCBpbmZvLT5ub3RpY2UgKTsKLSAgICAgIEZUX0ZSRUUoIGluZm8tPmZ1bGxfbmFtZSApOwotICAgICAgRlRfRlJFRSggaW5mby0+ZmFtaWx5X25hbWUgKTsKLSAgICAgIEZUX0ZSRUUoIGluZm8tPndlaWdodCApOwotICAgIH0KLQotICAgIC8qIHJlbGVhc2UgdG9wIGRpY3Rpb25hcnkgKi8KLSAgICBGVF9GUkVFKCB0eXBlMS0+Y2hhcnN0cmluZ3NfbGVuICk7Ci0gICAgRlRfRlJFRSggdHlwZTEtPmNoYXJzdHJpbmdzICk7Ci0gICAgRlRfRlJFRSggdHlwZTEtPmdseXBoX25hbWVzICk7Ci0KLSAgICBGVF9GUkVFKCB0eXBlMS0+c3VicnMgKTsKLSAgICBGVF9GUkVFKCB0eXBlMS0+c3VicnNfbGVuICk7Ci0KLSAgICBmdF9oYXNoX251bV9mcmVlKCB0eXBlMS0+c3VicnNfaGFzaCwgbWVtb3J5ICk7Ci0gICAgRlRfRlJFRSggdHlwZTEtPnN1YnJzX2hhc2ggKTsKLQotICAgIEZUX0ZSRUUoIHR5cGUxLT5zdWJyc19ibG9jayApOwotICAgIEZUX0ZSRUUoIHR5cGUxLT5jaGFyc3RyaW5nc19ibG9jayApOwotICAgIEZUX0ZSRUUoIHR5cGUxLT5nbHlwaF9uYW1lc19ibG9jayApOwotCi0gICAgRlRfRlJFRSggdHlwZTEtPmVuY29kaW5nLmNoYXJfaW5kZXggKTsKLSAgICBGVF9GUkVFKCB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lICk7Ci0gICAgRlRfRlJFRSggdHlwZTEtPmZvbnRfbmFtZSApOwotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0gICAgLyogcmVsZWFzZSBhZm0gZGF0YSBpZiBwcmVzZW50ICovCi0gICAgaWYgKCBmYWNlLT5hZm1fZGF0YSApCi0gICAgICBUMV9Eb25lX01ldHJpY3MoIG1lbW9yeSwgKEFGTV9Gb250SW5mbylmYWNlLT5hZm1fZGF0YSApOwotI2VuZGlmCi0KLSAgICAvKiByZWxlYXNlIHVuaWNvZGUgbWFwLCBpZiBhbnkgKi8KLSNpZiAwCi0gICAgRlRfRlJFRSggZmFjZS0+dW5pY29kZV9tYXBfcmVjLm1hcHMgKTsKLSAgICBmYWNlLT51bmljb2RlX21hcF9yZWMubnVtX21hcHMgPSAwOwotICAgIGZhY2UtPnVuaWNvZGVfbWFwICAgICAgICAgICAgICA9IE5VTEw7Ci0jZW5kaWYKLQotICAgIGZhY2UtPnJvb3QuZmFtaWx5X25hbWUgPSBOVUxMOwotICAgIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSAgPSBOVUxMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9GYWNlX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmFjZSBvYmplY3QgY29uc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6ICBpbnB1dCBzdHJlYW0gd2hlcmUgdG8gbG9hZCBmb250IGRhdGEuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBmb250IGZhY2UgaW4gdGhlIHJlc291cmNlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3BhcmFtcyA6OiBOdW1iZXIgb2YgYWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJhbXMgICAgIDo6IEFkZGl0aW9uYWwgZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgSWdub3JlZC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBmYWNlIHJlY29yZCB0byBidWlsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9GYWNlX0luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICB0MWZhY2UsICAgICAgICAgIC8qIFQxX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIFQxX0ZhY2UgICAgICAgICAgICAgZmFjZSA9IChUMV9GYWNlKXQxZmFjZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lczsKLSAgICBQU0F1eF9TZXJ2aWNlICAgICAgIHBzYXV4OwotICAgIFQxX0ZvbnQgICAgICAgICAgICAgdHlwZTEgPSAmZmFjZS0+dHlwZTE7Ci0gICAgUFNfRm9udEluZm8gICAgICAgICBpbmZvID0gJnR5cGUxLT5mb250X2luZm87Ci0KLSAgICBGVF9VTlVTRUQoIG51bV9wYXJhbXMgKTsKLSAgICBGVF9VTlVTRUQoIHBhcmFtcyApOwotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIGZhY2UtPnJvb3QubnVtX2ZhY2VzID0gMTsKLQotICAgIEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSggZmFjZSwgcHNuYW1lcywgUE9TVFNDUklQVF9DTUFQUyApOwotICAgIGZhY2UtPnBzbmFtZXMgPSBwc25hbWVzOwotCi0gICAgZmFjZS0+cHNhdXggPSBGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSggRlRfRkFDRV9MSUJSQVJZKCBmYWNlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzYXV4IiApOwotICAgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0gICAgaWYgKCAhcHNhdXggKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIlQxX0ZhY2VfSW5pdDogY2Fubm90IGFjY2VzcyBgcHNhdXgnIG1vZHVsZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE1pc3NpbmdfTW9kdWxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZmFjZS0+cHNoaW50ZXIgPSBGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSggRlRfRkFDRV9MSUJSQVJZKCBmYWNlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzaGludGVyIiApOwotCi0gICAgRlRfVFJBQ0UyKCggIlR5cGUgMSBkcml2ZXJcbiIgKSk7Ci0KLSAgICAvKiBvcGVuIHRoZSB0b2tlbml6ZXI7IHRoaXMgd2lsbCBhbHNvIGNoZWNrIHRoZSBmb250IGZvcm1hdCAqLwotICAgIGVycm9yID0gVDFfT3Blbl9GYWNlKCBmYWNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBpZiB3ZSBqdXN0IHdhbnRlZCB0byBjaGVjayB0aGUgZm9ybWF0LCBsZWF2ZSBzdWNjZXNzZnVsbHkgbm93ICovCi0gICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayB0aGUgZmFjZSBpbmRleCAqLwotICAgIGlmICggKCBmYWNlX2luZGV4ICYgMHhGRkZGICkgPiAwICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJUMV9GYWNlX0luaXQ6IGludmFsaWQgZmFjZSBpbmRleFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBub3cgbG9hZCB0aGUgZm9udCBwcm9ncmFtIGludG8gdGhlIGZhY2Ugb2JqZWN0ICovCi0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBmYWNlIG9iamVjdCBmaWVsZHMgKi8KLQotICAgIC8qIHNldCB1cCByb290IGZhY2UgZmllbGRzICovCi0gICAgewotICAgICAgRlRfRmFjZSAgcm9vdCA9IChGVF9GYWNlKSZmYWNlLT5yb290OwotCi0KLSAgICAgIHJvb3QtPm51bV9nbHlwaHMgPSB0eXBlMS0+bnVtX2dseXBoczsKLSAgICAgIHJvb3QtPmZhY2VfaW5kZXggPSAwOwotCi0gICAgICByb290LT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19ISU5URVI7Ci0KLSAgICAgIGlmICggaW5mby0+aXNfZml4ZWRfcGl0Y2ggKQotICAgICAgICByb290LT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSDsKLQotICAgICAgaWYgKCBmYWNlLT5ibGVuZCApCi0gICAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlM7Ci0KLSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSB0byBleHRyYWN0IHRoZSBmYW1pbHkgYW5kIHRoZSBzdHlsZSBpcyB2ZXJ5ICAgKi8KLSAgICAgIC8qIHNpbXBsaXN0aWMgYW5kIG1pZ2h0IGdldCBzb21lIHRoaW5ncyB3cm9uZy4gIEZvciBhIGZ1bGwtZmVhdHVyZWQgKi8KLSAgICAgIC8qIGFsZ29yaXRobSB5b3UgbWlnaHQgaGF2ZSBhIGxvb2sgYXQgdGhlIHdoaXRlcGFwZXIgZ2l2ZW4gYXQgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgaHR0cDovL2Jsb2dzLm1zZG4uY29tL3RleHQvYXJjaGl2ZS8yMDA3LzA0LzIzL3dwZi1mb250LXNlbGVjdGlvbi1tb2RlbC5hc3B4ICovCi0KLSAgICAgIC8qIGdldCBzdHlsZSBuYW1lIC0tIGJlIGNhcmVmdWwsIHNvbWUgYnJva2VuIGZvbnRzIG9ubHkgKi8KLSAgICAgIC8qIGhhdmUgYSBgL0ZvbnROYW1lJyBkaWN0aW9uYXJ5IGVudHJ5ISAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHJvb3QtPmZhbWlseV9uYW1lID0gaW5mby0+ZmFtaWx5X25hbWU7Ci0gICAgICByb290LT5zdHlsZV9uYW1lICA9IE5VTEw7Ci0KLSAgICAgIGlmICggcm9vdC0+ZmFtaWx5X25hbWUgKQotICAgICAgewotICAgICAgICBjaGFyKiAgZnVsbCAgID0gaW5mby0+ZnVsbF9uYW1lOwotICAgICAgICBjaGFyKiAgZmFtaWx5ID0gcm9vdC0+ZmFtaWx5X25hbWU7Ci0KLQotICAgICAgICBpZiAoIGZ1bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQm9vbCAgdGhlX3NhbWUgPSBUUlVFOwotCi0KLSAgICAgICAgICB3aGlsZSAoICpmdWxsICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoICpmdWxsID09ICpmYW1pbHkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmYW1pbHkrKzsKLSAgICAgICAgICAgICAgZnVsbCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoICpmdWxsID09ICcgJyB8fCAqZnVsbCA9PSAnLScgKQotICAgICAgICAgICAgICAgIGZ1bGwrKzsKLSAgICAgICAgICAgICAgZWxzZSBpZiAoICpmYW1pbHkgPT0gJyAnIHx8ICpmYW1pbHkgPT0gJy0nICkKLSAgICAgICAgICAgICAgICBmYW1pbHkrKzsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhlX3NhbWUgPSBGQUxTRTsKLQotICAgICAgICAgICAgICAgIGlmICggISpmYW1pbHkgKQotICAgICAgICAgICAgICAgICAgcm9vdC0+c3R5bGVfbmFtZSA9IGZ1bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIHRoZV9zYW1lICkKLSAgICAgICAgICAgIHJvb3QtPnN0eWxlX25hbWUgPSAoY2hhciAqKSJSZWd1bGFyIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgYC9Gb250TmFtZSc/ICovCi0gICAgICAgIGlmICggdHlwZTEtPmZvbnRfbmFtZSApCi0gICAgICAgICAgcm9vdC0+ZmFtaWx5X25hbWUgPSB0eXBlMS0+Zm9udF9uYW1lOwotICAgICAgfQotCi0gICAgICBpZiAoICFyb290LT5zdHlsZV9uYW1lICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBpbmZvLT53ZWlnaHQgKQotICAgICAgICAgIHJvb3QtPnN0eWxlX25hbWUgPSBpbmZvLT53ZWlnaHQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAvKiBhc3N1bWUgYFJlZ3VsYXInIHN0eWxlIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBiZXR0ZXIgKi8KLSAgICAgICAgICByb290LT5zdHlsZV9uYW1lID0gKGNoYXIgKikiUmVndWxhciI7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvbXB1dGUgc3R5bGUgZmxhZ3MgKi8KLSAgICAgIHJvb3QtPnN0eWxlX2ZsYWdzID0gMDsKLSAgICAgIGlmICggaW5mby0+aXRhbGljX2FuZ2xlICkKLSAgICAgICAgcm9vdC0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0gICAgICBpZiAoIGluZm8tPndlaWdodCApCi0gICAgICB7Ci0gICAgICAgIGlmICggIWZ0X3N0cmNtcCggaW5mby0+d2VpZ2h0LCAiQm9sZCIgICkgfHwKLSAgICAgICAgICAgICAhZnRfc3RyY21wKCBpbmZvLT53ZWlnaHQsICJCbGFjayIgKSApCi0gICAgICAgICAgcm9vdC0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotICAgICAgfQotCi0gICAgICAvKiBubyBlbWJlZGRlZCBiaXRtYXAgc3VwcG9ydCAqLwotICAgICAgcm9vdC0+bnVtX2ZpeGVkX3NpemVzID0gMDsKLSAgICAgIHJvb3QtPmF2YWlsYWJsZV9zaXplcyA9IE5VTEw7Ci0KLSAgICAgIHJvb3QtPmJib3gueE1pbiA9ICAgdHlwZTEtPmZvbnRfYmJveC54TWluICAgICAgICAgICAgPj4gMTY7Ci0gICAgICByb290LT5iYm94LnlNaW4gPSAgIHR5cGUxLT5mb250X2Jib3gueU1pbiAgICAgICAgICAgID4+IDE2OwotICAgICAgLyogbm8gYFUnIHN1ZmZpeCBoZXJlIHRvIDB4RkZGRiEgKi8KLSAgICAgIHJvb3QtPmJib3gueE1heCA9ICggdHlwZTEtPmZvbnRfYmJveC54TWF4ICsgMHhGRkZGICkgPj4gMTY7Ci0gICAgICByb290LT5iYm94LnlNYXggPSAoIHR5cGUxLT5mb250X2Jib3gueU1heCArIDB4RkZGRiApID4+IDE2OwotCi0gICAgICAvKiBTZXQgdW5pdHNfcGVyX0VNIGlmIHdlIGRpZG4ndCBzZXQgaXQgaW4gdDFfcGFyc2VfZm9udF9tYXRyaXguICovCi0gICAgICBpZiAoICFyb290LT51bml0c19wZXJfRU0gKQotICAgICAgICByb290LT51bml0c19wZXJfRU0gPSAxMDAwOwotCi0gICAgICByb290LT5hc2NlbmRlciAgPSAoRlRfU2hvcnQpKCByb290LT5iYm94LnlNYXggKTsKLSAgICAgIHJvb3QtPmRlc2NlbmRlciA9IChGVF9TaG9ydCkoIHJvb3QtPmJib3gueU1pbiApOwotCi0gICAgICByb290LT5oZWlnaHQgPSAoRlRfU2hvcnQpKCAoIHJvb3QtPnVuaXRzX3Blcl9FTSAqIDEyICkgLyAxMCApOwotICAgICAgaWYgKCByb290LT5oZWlnaHQgPCByb290LT5hc2NlbmRlciAtIHJvb3QtPmRlc2NlbmRlciApCi0gICAgICAgIHJvb3QtPmhlaWdodCA9IChGVF9TaG9ydCkoIHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICk7Ci0KLSAgICAgIC8qIG5vdyBjb21wdXRlIHRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggKi8KLSAgICAgIHJvb3QtPm1heF9hZHZhbmNlX3dpZHRoID0KLSAgICAgICAgKEZUX1Nob3J0KSggcm9vdC0+YmJveC54TWF4ICk7Ci0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgbWF4X2FkdmFuY2U7Ci0KLQotICAgICAgICBlcnJvciA9IFQxX0NvbXB1dGVfTWF4X0FkdmFuY2UoIGZhY2UsICZtYXhfYWR2YW5jZSApOwotCi0gICAgICAgIC8qIGluIGNhc2Ugb2YgZXJyb3IsIGtlZXAgdGhlIHN0YW5kYXJkIHdpZHRoICovCi0gICAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgICByb290LT5tYXhfYWR2YW5jZV93aWR0aCA9IChGVF9TaG9ydClGSVhFRF9UT19JTlQoIG1heF9hZHZhbmNlICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsgICAvKiBjbGVhciBlcnJvciAqLwotICAgICAgfQotCi0gICAgICByb290LT5tYXhfYWR2YW5jZV9oZWlnaHQgPSByb290LT5oZWlnaHQ7Ci0KLSAgICAgIHJvb3QtPnVuZGVybGluZV9wb3NpdGlvbiAgPSAoRlRfU2hvcnQpaW5mby0+dW5kZXJsaW5lX3Bvc2l0aW9uOwotICAgICAgcm9vdC0+dW5kZXJsaW5lX3RoaWNrbmVzcyA9IChGVF9TaG9ydClpbmZvLT51bmRlcmxpbmVfdGhpY2tuZXNzOwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX0ZhY2UgIHJvb3QgPSAmZmFjZS0+cm9vdDsKLQotCi0gICAgICBpZiAoIHBzbmFtZXMgKQotICAgICAgewotICAgICAgICBGVF9DaGFyTWFwUmVjICAgIGNoYXJtYXA7Ci0gICAgICAgIFQxX0NNYXBfQ2xhc3NlcyAgY21hcF9jbGFzc2VzID0gcHNhdXgtPnQxX2NtYXBfY2xhc3NlczsKLSAgICAgICAgRlRfQ01hcF9DbGFzcyAgICBjbGF6ejsKLQotCi0gICAgICAgIGNoYXJtYXAuZmFjZSA9IHJvb3Q7Ci0KLSAgICAgICAgLyogZmlyc3Qgb2YgYWxsLCB0cnkgdG8gc3ludGhlc2l6ZSBhIFVuaWNvZGUgY2hhcm1hcCAqLwotICAgICAgICBjaGFybWFwLnBsYXRmb3JtX2lkID0gVFRfUExBVEZPUk1fTUlDUk9TT0ZUOwotICAgICAgICBjaGFybWFwLmVuY29kaW5nX2lkID0gVFRfTVNfSURfVU5JQ09ERV9DUzsKLSAgICAgICAgY2hhcm1hcC5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX1VOSUNPREU7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9DTWFwX05ldyggY21hcF9jbGFzc2VzLT51bmljb2RlLCBOVUxMLCAmY2hhcm1hcCwgTlVMTCApOwotICAgICAgICBpZiAoIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBOb19Vbmljb2RlX0dseXBoX05hbWUgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgICAgICAvKiBub3csIGdlbmVyYXRlIGFuIEFkb2JlIFN0YW5kYXJkIGVuY29kaW5nIHdoZW4gYXBwcm9wcmlhdGUgKi8KLSAgICAgICAgY2hhcm1hcC5wbGF0Zm9ybV9pZCA9IFRUX1BMQVRGT1JNX0FET0JFOwotICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gTlVMTDsKLQotICAgICAgICBzd2l0Y2ggKCB0eXBlMS0+ZW5jb2RpbmdfdHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBUMV9FTkNPRElOR19UWVBFX1NUQU5EQVJEOgotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRDsKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nX2lkID0gVFRfQURPQkVfSURfU1RBTkRBUkQ7Ci0gICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9IGNtYXBfY2xhc3Nlcy0+c3RhbmRhcmQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUMV9FTkNPRElOR19UWVBFX0VYUEVSVDoKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUOwotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9FWFBFUlQ7Ci0gICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9IGNtYXBfY2xhc3Nlcy0+ZXhwZXJ0OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVDFfRU5DT0RJTkdfVFlQRV9BUlJBWToKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NOwotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9DVVNUT007Ci0gICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9IGNtYXBfY2xhc3Nlcy0+Y3VzdG9tOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVDFfRU5DT0RJTkdfVFlQRV9JU09MQVRJTjE6Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzE7Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX0xBVElOXzE7Ci0gICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9IGNtYXBfY2xhc3Nlcy0+dW5pY29kZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggY2xhenogKQotICAgICAgICAgIGVycm9yID0gRlRfQ01hcF9OZXcoIGNsYXp6LCBOVUxMLCAmY2hhcm1hcCwgTlVMTCApOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRHJpdmVyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBUeXBlIDEgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZHJpdmVyIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfRHJpdmVyX0luaXQoIEZUX01vZHVsZSAgZHJpdmVyICkKLSAgewotICAgIEZUX1VOVVNFRCggZHJpdmVyICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9Ecml2ZXJfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZXMgYSBnaXZlbiBUeXBlIDEgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBUeXBlIDEgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFQxX0RyaXZlcl9Eb25lKCBGVF9Nb2R1bGUgIGRyaXZlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGRyaXZlciApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFvYmpzLmggYi9zcmMvdHlwZTEvdDFvYmpzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZDI2YmYuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGUxL3Qxb2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxb2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgb2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUMU9CSlNfSF8KLSNkZWZpbmUgVDFPQkpTX0hfCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIG11c3QgYmUgZGVmaW5lZCBieSB0aGUgaGludGVyICovCi0gIHR5cGVkZWYgc3RydWN0IFQxX1NpemVfSGludHNfICAgVDFfU2l6ZV9IaW50czsKLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfR2x5cGhfSGludHNfICBUMV9HbHlwaF9IaW50czsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfU2l6ZVJlY18qICBUMV9TaXplOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBUMV9HbHlwaFNsb3RSZWNfKiAgVDFfR2x5cGhTbG90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQ2hhck1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgY2hhcmFjdGVyIG1hcHBpbmcgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFR5cGUgMSBmb3JtYXQgZG9lc24ndCB1c2UgYSBjaGFybWFwIGJ1dCBhbiBlbmNvZGluZyB0YWJsZS4gICAgICovCi0gIC8qICAgIFRoZSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB1cCBjaGFybWFwIG9iamVjdHMgICAgICAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFQxX0NoYXJNYXBSZWNfKiAgIFQxX0NoYXJNYXA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgSEVSRSBCRUdJTlMgVEhFIFRZUEUxIFNQRUNJRklDIFNUVUZGICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9TaXplUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUeXBlIDEgc2l6ZSByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9TaXplUmVjXwotICB7Ci0gICAgRlRfU2l6ZVJlYyAgcm9vdDsKLQotICB9IFQxX1NpemVSZWM7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFQxX1NpemVfRG9uZSggRlRfU2l6ZSAgc2l6ZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX1NpemVfUmVxdWVzdCggRlRfU2l6ZSAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfU2l6ZV9Jbml0KCBGVF9TaXplICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9HbHlwaFNsb3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUeXBlIDEgZ2x5cGggc2xvdCByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9HbHlwaFNsb3RSZWNfCi0gIHsKLSAgICBGVF9HbHlwaFNsb3RSZWMgIHJvb3Q7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgIGhpbnQ7Ci0gICAgRlRfQm9vbCAgICAgICAgICBzY2FsZWQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgIG1heF9wb2ludHM7Ci0gICAgRlRfSW50ICAgICAgICAgICBtYXhfY29udG91cnM7Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgIHhfc2NhbGU7Ci0gICAgRlRfRml4ZWQgICAgICAgICB5X3NjYWxlOwotCi0gIH0gVDFfR2x5cGhTbG90UmVjOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfRmFjZV9Jbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUMV9GYWNlX0RvbmUoIEZUX0ZhY2UgIGZhY2UgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9HbHlwaFNsb3RfSW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUMV9HbHlwaFNsb3RfRG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfRHJpdmVyX0luaXQoIEZUX01vZHVsZSAgZHJpdmVyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUMV9Ecml2ZXJfRG9uZSggRlRfTW9kdWxlICBkcml2ZXIgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBUMU9CSlNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MXBhcnNlLmMgYi9zcmMvdHlwZTEvdDFwYXJzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGRkMjY0Li4wMDAwMDAwCi0tLSBhL3NyYy90eXBlMS90MXBhcnNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFwYXJzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBwYXJzZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIFR5cGUgMSBwYXJzZXIgaXMgaW4gY2hhcmdlIG9mIHRoZSBmb2xsb3dpbmc6ICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgZ3Jvd2luZyBzZXF1ZW5jZSBvZiBvYmplY3RzIGNhbGxlZCAgKi8KLSAgLyogICAgYSBgVDFfVGFibGUnICh1c2VkIHRvIGJ1aWxkIHZhcmlvdXMgdGFibGVzIG5lZWRlZCBieSB0aGUgbG9hZGVyKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBvcGVuaW5nIC5wZmIgYW5kIC5wZmEgZmlsZXMgdG8gZXh0cmFjdCB0aGVpciB0b3AtbGV2ZWwgYW5kIHByaXZhdGUgKi8KLSAgLyogICAgZGljdGlvbmFyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSByZWFkIG51bWJlcnMsIGFycmF5cyAmIHN0cmluZ3MgZnJvbSBhbnkgZGljdGlvbmFyeS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlZSBgdDFsb2FkLmMnIHRvIHNlZSBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZm9udCBmaWxlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotCi0jaW5jbHVkZSAidDFwYXJzZS5oIgotCi0jaW5jbHVkZSAidDFlcnJvcnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3QxcGFyc2UKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgSU5QVVQgU1RSRUFNIFBBUlNFUiAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBzZWUgQWRvYmUgVGVjaG5pY2FsIE5vdGUgNTA0MC5Eb3dubG9hZF9Gb250cy5wZGYgKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmVhZF9wZmJfdGFnKCBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgRlRfVVNob3J0ICAqYXRhZywKLSAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICphc2l6ZSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1VTaG9ydCAgdGFnOwotICAgIEZUX1VMb25nICAgc2l6ZTsKLQotCi0gICAgKmF0YWcgID0gMDsKLSAgICAqYXNpemUgPSAwOwotCi0gICAgaWYgKCAhRlRfUkVBRF9VU0hPUlQoIHRhZyApICkKLSAgICB7Ci0gICAgICBpZiAoIHRhZyA9PSAweDgwMDFVIHx8IHRhZyA9PSAweDgwMDJVICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAhRlRfUkVBRF9VTE9OR19MRSggc2l6ZSApICkKLSAgICAgICAgICAqYXNpemUgPSBzaXplOwotICAgICAgfQotCi0gICAgICAqYXRhZyA9IHRhZzsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaGVja190eXBlMV9mb3JtYXQoIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGhlYWRlcl9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIGhlYWRlcl9sZW5ndGggKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VU2hvcnQgIHRhZzsKLSAgICBGVF9VTG9uZyAgIGR1bW15OwotCi0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCAwICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSByZWFkX3BmYl90YWcoIHN0cmVhbSwgJnRhZywgJmR1bW15ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBXZSBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgc2VnbWVudCBpbiBhIFBGQiBpcyBhbHdheXMgZW5jb2RlZCBhcyAgICovCi0gICAgLyogdGV4dC4gIFRoaXMgbWlnaHQgYmUgd3JvbmcgKGFuZCB0aGUgc3BlY2lmaWNhdGlvbiBkb2Vzbid0IGluc2lzdCAqLwotICAgIC8qIG9uIHRoYXQpLCBidXQgd2UgaGF2ZSBuZXZlciBzZWVuIGEgY291bnRlcmV4YW1wbGUuICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIHRhZyAhPSAweDgwMDFVICYmIEZUX1NUUkVBTV9TRUVLKCAwICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCAhRlRfRlJBTUVfRU5URVIoIGhlYWRlcl9sZW5ndGggKSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICAgIGlmICggZnRfbWVtY21wKCBzdHJlYW0tPmN1cnNvciwgaGVhZGVyX3N0cmluZywgaGVhZGVyX2xlbmd0aCApICE9IDAgKQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9OZXdfUGFyc2VyKCBUMV9QYXJzZXIgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1VTaG9ydCAgdGFnOwotICAgIEZUX1VMb25nICAgc2l6ZTsKLQotCi0gICAgcHNhdXgtPnBzX3BhcnNlcl9mdW5jcy0+aW5pdCggJnBhcnNlci0+cm9vdCwgTlVMTCwgTlVMTCwgbWVtb3J5ICk7Ci0KLSAgICBwYXJzZXItPnN0cmVhbSAgICAgICA9IHN0cmVhbTsKLSAgICBwYXJzZXItPmJhc2VfbGVuICAgICA9IDA7Ci0gICAgcGFyc2VyLT5iYXNlX2RpY3QgICAgPSBOVUxMOwotICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4gID0gMDsKLSAgICBwYXJzZXItPnByaXZhdGVfZGljdCA9IE5VTEw7Ci0gICAgcGFyc2VyLT5pbl9wZmIgICAgICAgPSAwOwotICAgIHBhcnNlci0+aW5fbWVtb3J5ICAgID0gMDsKLSAgICBwYXJzZXItPnNpbmdsZV9ibG9jayA9IDA7Ci0KLSAgICAvKiBjaGVjayB0aGUgaGVhZGVyIGZvcm1hdCAqLwotICAgIGVycm9yID0gY2hlY2tfdHlwZTFfZm9ybWF0KCBzdHJlYW0sICIlIVBTLUFkb2JlRm9udCIsIDE0ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgaWYgKCBGVF9FUlJfTkVRKCBlcnJvciwgVW5rbm93bl9GaWxlX0Zvcm1hdCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IGNoZWNrX3R5cGUxX2Zvcm1hdCggc3RyZWFtLCAiJSFGb250VHlwZSIsIDEwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgVHlwZSAxIGZvbnRcbiIgKSk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSGVyZSBhIHNob3J0IHN1bW1hcnkgb2Ygd2hhdCBpcyBnb2luZyBvbjogICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgV2hlbiBjcmVhdGluZyBhIG5ldyBUeXBlIDEgcGFyc2VyLCB3ZSB0cnkgdG8gbG9jYXRlIGFuZCBsb2FkICovCi0gICAgLyogICB0aGUgYmFzZSBkaWN0aW9uYXJ5IGlmIHRoaXMgaXMgcG9zc2libGUgKGkuZS4sIGZvciBQRkIgICAgICAgKi8KLSAgICAvKiAgIGZpbGVzKS4gIE90aGVyd2lzZSwgd2UgbG9hZCB0aGUgd2hvbGUgZm9udCBpbnRvIG1lbW9yeS4gICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBXaGVuIGBsb2FkaW5nJyB0aGUgYmFzZSBkaWN0aW9uYXJ5LCB3ZSBvbmx5IHNldHVwIHBvaW50ZXJzICAgKi8KLSAgICAvKiAgIGluIHRoZSBjYXNlIG9mIGEgbWVtb3J5LWJhc2VkIHN0cmVhbS4gIE90aGVyd2lzZSwgd2UgICAgICAgICAqLwotICAgIC8qICAgYWxsb2NhdGUgYW5kIGxvYWQgdGhlIGJhc2UgZGljdGlvbmFyeSBpbiBpdC4gICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIHBhcnNlci0+aW5fcGZiIGlzIHNldCBpZiB3ZSBhcmUgaW4gYSBiaW5hcnkgKGAucGZiJykgZm9udC4gICAqLwotICAgIC8qICAgcGFyc2VyLT5pbl9tZW1vcnkgaXMgc2V0IGlmIHdlIGhhdmUgYSBtZW1vcnkgc3RyZWFtLiAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIHRyeSB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBiYXNlIGRpY3Rpb25hcnk7ICAgICAqLwotICAgIC8qIGxvb2sgZm9yIGEgUG9zdHNjcmlwdCBiaW5hcnkgZmlsZSB0YWcsIGkuZS4sIDB4ODAwMSAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDBMICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSByZWFkX3BmYl90YWcoIHN0cmVhbSwgJnRhZywgJnNpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggdGFnICE9IDB4ODAwMVUgKQotICAgIHsKLSAgICAgIC8qIGFzc3VtZSB0aGF0IHRoaXMgaXMgYSBQRkEgZmlsZSBmb3Igbm93OyBhbiBlcnJvciB3aWxsICovCi0gICAgICAvKiBiZSBwcm9kdWNlZCBsYXRlciB3aGVuIG1vcmUgdGhpbmdzIGFyZSBjaGVja2VkICAgICAgICAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMEwgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIHNpemUgPSBzdHJlYW0tPnNpemU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHBhcnNlci0+aW5fcGZiID0gMTsKLQotICAgIC8qIG5vdywgdHJ5IHRvIGxvYWQgYHNpemUnIGJ5dGVzIG9mIHRoZSBgYmFzZScgZGljdGlvbmFyeSB3ZSAqLwotICAgIC8qIGZvdW5kIHByZXZpb3VzbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogaWYgaXQgaXMgYSBtZW1vcnktYmFzZWQgcmVzb3VyY2UsIHNldCB1cCBwb2ludGVycyAqLwotICAgIGlmICggIXN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgcGFyc2VyLT5iYXNlX2RpY3QgPSAoRlRfQnl0ZSopc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7Ci0gICAgICBwYXJzZXItPmJhc2VfbGVuICA9IHNpemU7Ci0gICAgICBwYXJzZXItPmluX21lbW9yeSA9IDE7Ci0KLSAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGBzaXplJyBmaWVsZCBpcyB2YWxpZCAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggc2l6ZSApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogcmVhZCBzZWdtZW50IGluIG1lbW9yeSAtLSB0aGlzIGlzIGNsdW1zeSwgYnV0IHNvIGRvZXMgdGhlIGZvcm1hdCAqLwotICAgICAgaWYgKCBGVF9BTExPQyggcGFyc2VyLT5iYXNlX2RpY3QsIHNpemUgKSAgICAgICB8fAotICAgICAgICAgICBGVF9TVFJFQU1fUkVBRCggcGFyc2VyLT5iYXNlX2RpY3QsIHNpemUgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIHBhcnNlci0+YmFzZV9sZW4gPSBzaXplOwotICAgIH0KLQotICAgIHBhcnNlci0+cm9vdC5iYXNlICAgPSBwYXJzZXItPmJhc2VfZGljdDsKLSAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gcGFyc2VyLT5iYXNlX2RpY3Q7Ci0gICAgcGFyc2VyLT5yb290LmxpbWl0ICA9IHBhcnNlci0+cm9vdC5jdXJzb3IgKyBwYXJzZXItPmJhc2VfbGVuOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciAmJiAhcGFyc2VyLT5pbl9tZW1vcnkgKQotICAgICAgRlRfRlJFRSggcGFyc2VyLT5iYXNlX2RpY3QgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVDFfRmluYWxpemVfUGFyc2VyKCBUMV9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+cm9vdC5tZW1vcnk7Ci0KLQotICAgIC8qIGFsd2F5cyBmcmVlIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgKi8KLSAgICBGVF9GUkVFKCBwYXJzZXItPnByaXZhdGVfZGljdCApOwotCi0gICAgLyogZnJlZSB0aGUgYmFzZSBkaWN0aW9uYXJ5IG9ubHkgd2hlbiB3ZSBoYXZlIGEgZGlzayBzdHJlYW0gKi8KLSAgICBpZiAoICFwYXJzZXItPmluX21lbW9yeSApCi0gICAgICBGVF9GUkVFKCBwYXJzZXItPmJhc2VfZGljdCApOwotCi0gICAgcGFyc2VyLT5yb290LmZ1bmNzLmRvbmUoICZwYXJzZXItPnJvb3QgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQxX0dldF9Qcml2YXRlX0RpY3QoIFQxX1BhcnNlciAgICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNBdXhfU2VydmljZSAgcHNhdXggKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBwYXJzZXItPnN0cmVhbTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUxvbmcgICBzaXplOwotCi0KLSAgICBpZiAoIHBhcnNlci0+aW5fcGZiICkKLSAgICB7Ci0gICAgICAvKiBpbiB0aGUgY2FzZSBvZiB0aGUgUEZCIGZvcm1hdCwgdGhlIHByaXZhdGUgZGljdGlvbmFyeSBjYW4gYmUgICovCi0gICAgICAvKiBtYWRlIG9mIHNldmVyYWwgc2VnbWVudHMuICBXZSB0aHVzIGZpcnN0IHJlYWQgdGhlIG51bWJlciBvZiAgICovCi0gICAgICAvKiBzZWdtZW50cyB0byBjb21wdXRlIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgICovCi0gICAgICAvKiB0aGVuIHJlLXJlYWQgdGhlbSBpbnRvIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGVF9VTG9uZyAgIHN0YXJ0X3BvcyA9IEZUX1NUUkVBTV9QT1MoKTsKLSAgICAgIEZUX1VTaG9ydCAgdGFnOwotCi0KLSAgICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4gPSAwOwotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSByZWFkX3BmYl90YWcoIHN0cmVhbSwgJnRhZywgJnNpemUgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGlmICggdGFnICE9IDB4ODAwMlUgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4gKz0gc2l6ZTsKLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCBzaXplICkgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5IHRoZXJlICovCi0gICAgICAvKiBhbmQgYWxsb2NhdGUgcHJpdmF0ZSBkaWN0aW9uYXJ5IGJ1ZmZlciAgICAgICAgKi8KLSAgICAgIGlmICggcGFyc2VyLT5wcml2YXRlX2xlbiA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiVDFfR2V0X1ByaXZhdGVfRGljdDoiCi0gICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHByaXZhdGUgZGljdGlvbmFyeSBzZWN0aW9uXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc3RhcnRfcG9zICkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9BTExPQyggcGFyc2VyLT5wcml2YXRlX2RpY3QsIHBhcnNlci0+cHJpdmF0ZV9sZW4gKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgcGFyc2VyLT5wcml2YXRlX2xlbiA9IDA7Ci0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICBlcnJvciA9IHJlYWRfcGZiX3RhZyggc3RyZWFtLCAmdGFnLCAmc2l6ZSApOwotICAgICAgICBpZiAoIGVycm9yIHx8IHRhZyAhPSAweDgwMDJVICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRCggcGFyc2VyLT5wcml2YXRlX2RpY3QgKyBwYXJzZXItPnByaXZhdGVfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICkgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBwYXJzZXItPnByaXZhdGVfbGVuICs9IHNpemU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGFscmVhZHkgYGxvYWRlZCcgdGhlIHdob2xlIFBGQSBmb250IGZpbGUgaW50byBtZW1vcnk7ICovCi0gICAgICAvKiBpZiB0aGlzIGlzIGEgbWVtb3J5IHJlc291cmNlLCBhbGxvY2F0ZSBhIG5ldyBibG9jayB0byBob2xkICAgICovCi0gICAgICAvKiB0aGUgcHJpdmF0ZSBkaWN0LiAgT3RoZXJ3aXNlLCBzaW1wbHkgb3ZlcndyaXRlIGludG8gdGhlIGJhc2UgICovCi0gICAgICAvKiBkaWN0aW9uYXJ5IGJsb2NrIGluIHRoZSBoZWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIGZpcnN0IG9mIGFsbCwgbG9vayBhdCB0aGUgYGVleGVjJyBrZXl3b3JkICovCi0gICAgICBGVF9CeXRlKiAgICBjdXIgICA9IHBhcnNlci0+YmFzZV9kaWN0OwotICAgICAgRlRfQnl0ZSogICAgbGltaXQgPSBjdXIgKyBwYXJzZXItPmJhc2VfbGVuOwotICAgICAgRlRfUG9pbnRlciAgcG9zX2xmOwotICAgICAgRlRfQm9vbCAgICAgdGVzdF9jcjsKLQotCi0gICAgQWdhaW46Ci0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICBpZiAoIGN1clswXSA9PSAnZScgICAmJgotICAgICAgICAgICAgIGN1ciArIDkgPCBsaW1pdCApICAgICAgLyogOSA9IDUgbGV0dGVycyBmb3IgYGVleGVjJyArICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGl0ZXNwYWNlICsgNCBjaGFycyAgICAgICAgKi8KLSAgICAgICAgewotICAgICAgICAgIGlmICggY3VyWzFdID09ICdlJyAmJgotICAgICAgICAgICAgICAgY3VyWzJdID09ICd4JyAmJgotICAgICAgICAgICAgICAgY3VyWzNdID09ICdlJyAmJgotICAgICAgICAgICAgICAgY3VyWzRdID09ICdjJyApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXIrKzsKLSAgICAgICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiVDFfR2V0X1ByaXZhdGVfRGljdDoiCi0gICAgICAgICAgICAgICAgICAgICAiIGNvdWxkIG5vdCBmaW5kIGBlZXhlYycga2V5d29yZFxuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNoZWNrIHdoZXRoZXIgYGVleGVjJyB3YXMgcmVhbCAtLSBpdCBjb3VsZCBiZSBpbiBhIGNvbW1lbnQgKi8KLSAgICAgIC8qIG9yIHN0cmluZyAoYXMgZS5nLiBpbiB1MDAzMDQzdC5nc2YgZnJvbSBnaG9zdHNjcmlwdCkgICAgICAgKi8KLQotICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IHBhcnNlci0+YmFzZV9kaWN0OwotICAgICAgLyogc2V0IGxpbWl0IHRvIGBlZXhlYycgKyB3aGl0ZXNwYWNlICsgNCBjaGFyYWN0ZXJzICovCi0gICAgICBwYXJzZXItPnJvb3QubGltaXQgID0gY3VyICsgMTA7Ci0KLSAgICAgIGN1ciAgID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICAgIGxpbWl0ID0gcGFyc2VyLT5yb290LmxpbWl0OwotCi0gICAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjdXJbMF0gPT0gJ2UnICAgJiYKLSAgICAgICAgICAgICBjdXIgKyA1IDwgbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBjdXJbMV0gPT0gJ2UnICYmCi0gICAgICAgICAgICAgICBjdXJbMl0gPT0gJ3gnICYmCi0gICAgICAgICAgICAgICBjdXJbM10gPT0gJ2UnICYmCi0gICAgICAgICAgICAgICBjdXJbNF0gPT0gJ2MnICkKLSAgICAgICAgICAgIGdvdG8gRm91bmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBUMV9Ta2lwX1BTX1Rva2VuKCBwYXJzZXIgKTsKLSAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBUMV9Ta2lwX1NwYWNlcyAgKCBwYXJzZXIgKTsKLSAgICAgICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICAgIH0KLQotICAgICAgLyogd2UgaGF2ZW4ndCBmb3VuZCB0aGUgY29ycmVjdCBgZWV4ZWMnOyBnbyBiYWNrIGFuZCBjb250aW51ZSAqLwotICAgICAgLyogc2VhcmNoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBjdXIgICA9IGxpbWl0OwotICAgICAgbGltaXQgPSBwYXJzZXItPmJhc2VfZGljdCArIHBhcnNlci0+YmFzZV9sZW47Ci0KLSAgICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiVDFfR2V0X1ByaXZhdGVfRGljdDoiCi0gICAgICAgICAgICAgICAgICAgIiBwcmVtYXR1cmUgZW5kIGluIHByaXZhdGUgZGljdGlvbmFyeVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGdvdG8gQWdhaW47Ci0KLSAgICAgIC8qIG5vdyBkZXRlcm1pbmUgd2hlcmUgdG8gd3JpdGUgdGhlIF9lbmNyeXB0ZWRfIGJpbmFyeSBwcml2YXRlICAqLwotICAgICAgLyogZGljdGlvbmFyeS4gIFdlIG92ZXJ3cml0ZSB0aGUgYmFzZSBkaWN0aW9uYXJ5IGZvciBkaXNrLWJhc2VkICovCi0gICAgICAvKiByZXNvdXJjZXMgYW5kIGFsbG9jYXRlIGEgbmV3IGJsb2NrIG90aGVyd2lzZSAgICAgICAgICAgICAgICAgKi8KLQotICAgIEZvdW5kOgotICAgICAgcGFyc2VyLT5yb290LmxpbWl0ID0gcGFyc2VyLT5iYXNlX2RpY3QgKyBwYXJzZXItPmJhc2VfbGVuOwotCi0gICAgICBUMV9Ta2lwX1BTX1Rva2VuKCBwYXJzZXIgKTsKLSAgICAgIGN1ciAgID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICAgIGxpbWl0ID0gcGFyc2VyLT5yb290LmxpbWl0OwotCi0gICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIFR5cGUgMSBzcGVjLCB0aGUgZmlyc3QgY2lwaGVyIGJ5dGUgbXVzdCBub3QgYmUgKi8KLSAgICAgIC8qIGFuIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGNvZGUgKGJsYW5rLCB0YWIsIGNhcnJpYWdlIHJldHVybiAqLwotICAgICAgLyogb3IgbGluZSBmZWVkKS4gIFdlIGhhdmUgc2VlbiBUeXBlIDEgZm9udHMgd2l0aCB0d28gbGluZSBmZWVkICAgICovCi0gICAgICAvKiBjaGFyYWN0ZXJzLi4uICBTbyBza2lwIG5vdyBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgY29kZXMuICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogT24gdGhlIG90aGVyIGhhbmQsIEFkb2JlJ3MgVHlwZSAxIHBhcnNlciBoYW5kbGVzIGZvbnRzIGp1c3QgICAgICovCi0gICAgICAvKiBmaW5lIHRoYXQgYXJlIHZpb2xhdGluZyB0aGlzIGxpbWl0YXRpb24sIHNvIHdlIGFkZCBhIGhldXJpc3RpYyAgKi8KLSAgICAgIC8qIHRlc3QgdG8gc3RvcCBhdCBcciBvbmx5IGlmIGl0IGlzIG5vdCB1c2VkIGZvciBFT0wuICAgICAgICAgICAgICAqLwotCi0gICAgICBwb3NfbGYgID0gZnRfbWVtY2hyKCBjdXIsICdcbicsIChzaXplX3QpKCBsaW1pdCAtIGN1ciApICk7Ci0gICAgICB0ZXN0X2NyID0gRlRfQk9PTCggIXBvc19sZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcG9zX2xmID4gZnRfbWVtY2hyKCBjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkoIGxpbWl0IC0gY3VyICkgKSApOwotCi0gICAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAoICpjdXIgPT0gJyAnICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgKmN1ciA9PSAnXHQnICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAodGVzdF9jciAmJiAqY3VyID09ICdccicgKSB8fAotICAgICAgICAgICAgICAgICpjdXIgPT0gJ1xuJyAgICAgICAgICAgICAgICkgKQotICAgICAgICBjdXIrKzsKLSAgICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiVDFfR2V0X1ByaXZhdGVfRGljdDoiCi0gICAgICAgICAgICAgICAgICAgIiBgZWV4ZWMnIG5vdCBwcm9wZXJseSB0ZXJtaW5hdGVkXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgc2l6ZSA9IHBhcnNlci0+YmFzZV9sZW4gLSAoRlRfVUxvbmcpKCBjdXIgLSBwYXJzZXItPmJhc2VfZGljdCApOwotCi0gICAgICBpZiAoIHBhcnNlci0+aW5fbWVtb3J5ICkKLSAgICAgIHsKLSAgICAgICAgLyogbm90ZSB0aGF0IHdlIGFsbG9jYXRlIG9uZSBtb3JlIGJ5dGUgdG8gcHV0IGEgdGVybWluYXRpbmcgYDAnICovCi0gICAgICAgIGlmICggRlRfQUxMT0MoIHBhcnNlci0+cHJpdmF0ZV9kaWN0LCBzaXplICsgMSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4gPSBzaXplOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwYXJzZXItPnNpbmdsZV9ibG9jayA9IDE7Ci0gICAgICAgIHBhcnNlci0+cHJpdmF0ZV9kaWN0ID0gcGFyc2VyLT5iYXNlX2RpY3Q7Ci0gICAgICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4gID0gc2l6ZTsKLSAgICAgICAgcGFyc2VyLT5iYXNlX2RpY3QgICAgPSBOVUxMOwotICAgICAgICBwYXJzZXItPmJhc2VfbGVuICAgICA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBkZXRlcm1pbmUgd2hldGhlciB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5IGlzIGVuY29kZWQgaW4gYmluYXJ5ICovCi0gICAgICAvKiBvciBoZXhhZGVjaW1hbCBBU0NJSSBmb3JtYXQgLS0gZGVjb2RlIGl0IGFjY29yZGluZ2x5ICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgbmV4dCA0IGJ5dGVzIChhZnRlciB0aGUgZmluYWwgd2hpdGVzcGFjZSAqLwotICAgICAgLyogZm9sbG93aW5nIHRoZSBgZWV4ZWMnIGtleXdvcmQpOyBpZiB0aGV5IGFsbCBhcmUgaGV4YWRlY2ltYWwgICAgKi8KLSAgICAgIC8qIGRpZ2l0cywgdGhlbiB3ZSBoYXZlIGEgY2FzZSBvZiBBU0NJSSBzdG9yYWdlICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGlmICggY3VyICsgMyA8IGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBmdF9pc3hkaWdpdCggY3VyWzBdICkgJiYgZnRfaXN4ZGlnaXQoIGN1clsxXSApICYmCi0gICAgICAgICAgIGZ0X2lzeGRpZ2l0KCBjdXJbMl0gKSAmJiBmdF9pc3hkaWdpdCggY3VyWzNdICkgKQotICAgICAgewotICAgICAgICAvKiBBU0NJSSBoZXhhZGVjaW1hbCBlbmNvZGluZyAqLwotICAgICAgICBGVF9VTG9uZyAgbGVuOwotCi0KLSAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IGN1cjsKLSAgICAgICAgKHZvaWQpcHNhdXgtPnBzX3BhcnNlcl9mdW5jcy0+dG9fYnl0ZXMoICZwYXJzZXItPnJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXItPnByaXZhdGVfZGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOwotICAgICAgICBwYXJzZXItPnByaXZhdGVfbGVuID0gbGVuOwotCi0gICAgICAgIC8qIHB1dCBhIHNhZmVndWFyZCAqLwotICAgICAgICBwYXJzZXItPnByaXZhdGVfZGljdFtsZW5dID0gJ1wwJzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgLyogYmluYXJ5IGVuY29kaW5nIC0tIGNvcHkgdGhlIHByaXZhdGUgZGljdCAqLwotICAgICAgICBGVF9NRU1fTU9WRSggcGFyc2VyLT5wcml2YXRlX2RpY3QsIGN1ciwgc2l6ZSApOwotICAgIH0KLQotICAgIC8qIHdlIG5vdyBkZWNyeXB0IHRoZSBlbmNvZGVkIGJpbmFyeSBwcml2YXRlIGRpY3Rpb25hcnkgKi8KLSAgICBwc2F1eC0+dDFfZGVjcnlwdCggcGFyc2VyLT5wcml2YXRlX2RpY3QsIHBhcnNlci0+cHJpdmF0ZV9sZW4sIDU1NjY1VSApOwotCi0gICAgaWYgKCBwYXJzZXItPnByaXZhdGVfbGVuIDwgNCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiVDFfR2V0X1ByaXZhdGVfRGljdDoiCi0gICAgICAgICAgICAgICAgICIgaW52YWxpZCBwcml2YXRlIGRpY3Rpb25hcnkgc2VjdGlvblxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiByZXBsYWNlIHRoZSBmb3VyIHJhbmRvbSBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIHdpdGggd2hpdGVzcGFjZSAqLwotICAgIHBhcnNlci0+cHJpdmF0ZV9kaWN0WzBdID0gJyAnOwotICAgIHBhcnNlci0+cHJpdmF0ZV9kaWN0WzFdID0gJyAnOwotICAgIHBhcnNlci0+cHJpdmF0ZV9kaWN0WzJdID0gJyAnOwotICAgIHBhcnNlci0+cHJpdmF0ZV9kaWN0WzNdID0gJyAnOwotCi0gICAgcGFyc2VyLT5yb290LmJhc2UgICA9IHBhcnNlci0+cHJpdmF0ZV9kaWN0OwotICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBwYXJzZXItPnByaXZhdGVfZGljdDsKLSAgICBwYXJzZXItPnJvb3QubGltaXQgID0gcGFyc2VyLT5yb290LmN1cnNvciArIHBhcnNlci0+cHJpdmF0ZV9sZW47Ci0KLSAgRmFpbDoKLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MXBhcnNlLmggYi9zcmMvdHlwZTEvdDFwYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzk2NjgwLi4wMDAwMDAwCi0tLSBhL3NyYy90eXBlMS90MXBhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFwYXJzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBwYXJzZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFQxUEFSU0VfSF8KLSNkZWZpbmUgVDFQQVJTRV9IXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX1BhcnNlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgUFNfUGFyc2VyUmVjIGlzIGFuIG9iamVjdCB1c2VkIHRvIHBhcnNlIGEgVHlwZSAxIGZvbnRzIHZlcnkgICAgICAqLwotICAvKiAgICBxdWlja2x5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb290ICAgICAgICAgOjogVGhlIHJvb3QgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgICA6OiBUaGUgY3VycmVudCBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9kaWN0ICAgIDo6IEEgcG9pbnRlciB0byB0aGUgdG9wLWxldmVsIGRpY3Rpb25hcnkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlX2xlbiAgICAgOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgdG9wIGRpY3Rpb25hcnkuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHByaXZhdGVfZGljdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgZGljdGlvbmFyeS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHJpdmF0ZV9sZW4gIDo6IFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHByaXZhdGUgZGljdGlvbmFyeS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbl9wZmIgICAgICAgOjogQSBib29sZWFuLiAgSW5kaWNhdGVzIHRoYXQgd2UgYXJlIGhhbmRsaW5nIGEgUEZCICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbl9tZW1vcnkgICAgOjogQSBib29sZWFuLiAgSW5kaWNhdGVzIGEgbWVtb3J5LWJhc2VkIHN0cmVhbS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpbmdsZV9ibG9jayA6OiBBIGJvb2xlYW4uICBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgaXMgc3RvcmVkIGluIGxpZXUgb2YgdGhlIGJhc2UgZGljdGlvbmFyeS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9QYXJzZXJSZWNfCi0gIHsKLSAgICBQU19QYXJzZXJSZWMgIHJvb3Q7Ci0gICAgRlRfU3RyZWFtICAgICBzdHJlYW07Ci0KLSAgICBGVF9CeXRlKiAgICAgIGJhc2VfZGljdDsKLSAgICBGVF9VTG9uZyAgICAgIGJhc2VfbGVuOwotCi0gICAgRlRfQnl0ZSogICAgICBwcml2YXRlX2RpY3Q7Ci0gICAgRlRfVUxvbmcgICAgICBwcml2YXRlX2xlbjsKLQotICAgIEZUX0Jvb2wgICAgICAgaW5fcGZiOwotICAgIEZUX0Jvb2wgICAgICAgaW5fbWVtb3J5OwotICAgIEZUX0Jvb2wgICAgICAgc2luZ2xlX2Jsb2NrOwotCi0gIH0gVDFfUGFyc2VyUmVjLCAqVDFfUGFyc2VyOwotCi0KLSNkZWZpbmUgVDFfQWRkX1RhYmxlKCBwLCBpLCBvLCBsICkgIChwKS0+ZnVuY3MuYWRkKCAocCksIGksIG8sIGwgKQotI2RlZmluZSBUMV9SZWxlYXNlX1RhYmxlKCBwICkgICAgICAgICAgXAotICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCAocCktPmZ1bmNzLnJlbGVhc2UgKSAgXAotICAgICAgICAgICAgICAocCktPmZ1bmNzLnJlbGVhc2UoIHAgKTsgXAotICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotCi0jZGVmaW5lIFQxX1NraXBfU3BhY2VzKCBwICkgICAgKHApLT5yb290LmZ1bmNzLnNraXBfc3BhY2VzKCAmKHApLT5yb290ICkKLSNkZWZpbmUgVDFfU2tpcF9QU19Ub2tlbiggcCApICAocCktPnJvb3QuZnVuY3Muc2tpcF9QU190b2tlbiggJihwKS0+cm9vdCApCi0KLSNkZWZpbmUgVDFfVG9JbnQoIHAgKSAgICAgICAocCktPnJvb3QuZnVuY3MudG9faW50KCAmKHApLT5yb290ICkKLSNkZWZpbmUgVDFfVG9GaXhlZCggcCwgdCApICAocCktPnJvb3QuZnVuY3MudG9fZml4ZWQoICYocCktPnJvb3QsIHQgKQotCi0jZGVmaW5lIFQxX1RvQ29vcmRBcnJheSggcCwgbSwgYyApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy50b19jb29yZF9hcnJheSggJihwKS0+cm9vdCwgbSwgYyApCi0jZGVmaW5lIFQxX1RvRml4ZWRBcnJheSggcCwgbSwgZiwgdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy50b19maXhlZF9hcnJheSggJihwKS0+cm9vdCwgbSwgZiwgdCApCi0jZGVmaW5lIFQxX1RvVG9rZW4oIHAsIHQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy50b190b2tlbiggJihwKS0+cm9vdCwgdCApCi0jZGVmaW5lIFQxX1RvVG9rZW5BcnJheSggcCwgdCwgbSwgYyApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy50b190b2tlbl9hcnJheSggJihwKS0+cm9vdCwgdCwgbSwgYyApCi0KLSNkZWZpbmUgVDFfTG9hZF9GaWVsZCggcCwgZiwgbywgbSwgcGYgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLmxvYWRfZmllbGQoICYocCktPnJvb3QsIGYsIG8sIG0sIHBmICkKLQotI2RlZmluZSBUMV9Mb2FkX0ZpZWxkX1RhYmxlKCBwLCBmLCBvLCBtLCBwZiApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MubG9hZF9maWVsZF90YWJsZSggJihwKS0+cm9vdCwgZiwgbywgbSwgcGYgKQotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfTmV3X1BhcnNlciggVDFfUGFyc2VyICAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgUFNBdXhfU2VydmljZSAgcHNhdXggKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9HZXRfUHJpdmF0ZV9EaWN0KCBUMV9QYXJzZXIgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUMV9GaW5hbGl6ZV9QYXJzZXIoIFQxX1BhcnNlciAgcGFyc2VyICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogVDFQQVJTRV9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxdG9rZW5zLmggYi9zcmMvdHlwZTEvdDF0b2tlbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwYzU1Zi4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTEvdDF0b2tlbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MXRva2Vucy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIHRva2VuaXplciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUFNfRm9udEluZm9SZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9JTkZPCi0KLSAgVDFfRklFTERfU1RSSU5HKCAidmVyc2lvbiIsICAgICAgICAgICAgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgVDFfRklFTERfU1RSSU5HKCAiTm90aWNlIiwgICAgICAgICAgICAgbm90aWNlLAotICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICBUMV9GSUVMRF9TVFJJTkcoICJGdWxsTmFtZSIsICAgICAgICAgICBmdWxsX25hbWUsCi0gICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gIFQxX0ZJRUxEX1NUUklORyggIkZhbWlseU5hbWUiLCAgICAgICAgIGZhbWlseV9uYW1lLAotICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICBUMV9GSUVMRF9TVFJJTkcoICJXZWlnaHQiLCAgICAgICAgICAgICB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0KLSAgLyogd2UgdXNlIHBvaW50ZXJzIHRvIGRldGVjdCBtb2RpZmljYXRpb25zIG1hZGUgYnkgc3ludGhldGljIGZvbnRzICovCi0gIFQxX0ZJRUxEX05VTSAgICggIkl0YWxpY0FuZ2xlIiwgICAgICAgIGl0YWxpY19hbmdsZSwKLSAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgVDFfRklFTERfQk9PTCAgKCAiaXNGaXhlZFBpdGNoIiwgICAgICAgaXNfZml4ZWRfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gIFQxX0ZJRUxEX05VTSAgICggIlVuZGVybGluZVBvc2l0aW9uIiwgIHVuZGVybGluZV9wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgVDFfRklFTERfTlVNICAgKCAiVW5kZXJsaW5lVGhpY2tuZXNzIiwgdW5kZXJsaW5lX3RoaWNrbmVzcywKLSAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBQU19Gb250RXh0cmFSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9FWFRSQQotCi0gIFQxX0ZJRUxEX05VTSAgICggIkZTVHlwZSIsIGZzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUFNfUHJpdmF0ZVJlYwotI3VuZGVmICBUMUNPREUKLSNkZWZpbmUgVDFDT0RFICAgICAgICBUMV9GSUVMRF9MT0NBVElPTl9QUklWQVRFCi0KLSAgVDFfRklFTERfTlVNICAgICAgICggIlVuaXF1ZUlEIiwgICAgICAgICB1bmlxdWVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgfCBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU0gICAgICAgKCAibGVuSVYiLCAgICAgICAgICAgIGxlbklWLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU0gICAgICAgKCAiTGFuZ3VhZ2VHcm91cCIsICAgIGxhbmd1YWdlX2dyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU0gICAgICAgKCAicGFzc3dvcmQiLCAgICAgICAgIHBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotCi0gIFQxX0ZJRUxEX0ZJWEVEXzEwMDAoICJCbHVlU2NhbGUiLCAgICAgICAgYmx1ZV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgVDFfRklFTERfTlVNICAgICAgICggIkJsdWVTaGlmdCIsICAgICAgICBibHVlX3NoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU0gICAgICAgKCAiQmx1ZUZ1enoiLCAgICAgICAgIGJsdWVfZnV6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLQotICBUMV9GSUVMRF9OVU1fVEFCTEUgKCAiQmx1ZVZhbHVlcyIsICAgICAgIGJsdWVfdmFsdWVzLCAgICAgICAgMTQsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJPdGhlckJsdWVzIiwgICAgICAgb3RoZXJfYmx1ZXMsICAgICAgICAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgVDFfRklFTERfTlVNX1RBQkxFICggIkZhbWlseUJsdWVzIiwgICAgICBmYW1pbHlfYmx1ZXMsICAgICAgIDE0LAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU1fVEFCTEUgKCAiRmFtaWx5T3RoZXJCbHVlcyIsIGZhbWlseV9vdGhlcl9ibHVlcywgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0KLSAgVDFfRklFTERfTlVNX1RBQkxFMiggIlN0ZEhXIiwgICAgICAgICAgICBzdGFuZGFyZF93aWR0aCwgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU1fVEFCTEUyKCAiU3RkVlciLCAgICAgICAgICAgIHN0YW5kYXJkX2hlaWdodCwgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0gIFQxX0ZJRUxEX05VTV9UQUJMRTIoICJNaW5GZWF0dXJlIiwgICAgICAgbWluX2ZlYXR1cmUsICAgICAgICAgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLQotICBUMV9GSUVMRF9OVU1fVEFCTEUgKCAiU3RlbVNuYXBIIiwgICAgICAgIHNuYXBfd2lkdGhzLCAgICAgICAgMTIsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJTdGVtU25hcFYiLCAgICAgICAgc25hcF9oZWlnaHRzLCAgICAgICAxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLQotICBUMV9GSUVMRF9GSVhFRCAgICAgKCAiRXhwYW5zaW9uRmFjdG9yIiwgIGV4cGFuc2lvbl9mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0gIFQxX0ZJRUxEX0JPT0wgICAgICAoICJGb3JjZUJvbGQiLCAgICAgICAgZm9yY2VfYm9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFQxX0ZvbnRSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9ESUNUCi0KLSAgVDFfRklFTERfS0VZICAoICJGb250TmFtZSIsICAgIGZvbnRfbmFtZSwgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gIFQxX0ZJRUxEX05VTSAgKCAiUGFpbnRUeXBlIiwgICBwYWludF90eXBlLCAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICBUMV9GSUVMRF9OVU0gICggIkZvbnRUeXBlIiwgICAgZm9udF90eXBlLCAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgVDFfRklFTERfRklYRUQoICJTdHJva2VXaWR0aCIsIHN0cm9rZV93aWR0aCwgVDFfRklFTERfRElDVF9GT05URElDVCApCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBGVF9CQm94Ci0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1gKLQotICBUMV9GSUVMRF9CQk9YKCAiRm9udEJCb3giLCB4TWluLCBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLQotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVAotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFQxX0ZhY2VSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fRkFDRQotCi0gIFQxX0ZJRUxEX05VTSggIk5EViIsIG5kdl9pZHgsIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0gIFQxX0ZJRUxEX05VTSggIkNEViIsIGNkdl9pZHgsIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBQU19CbGVuZFJlYwotI3VuZGVmICBUMUNPREUKLSNkZWZpbmUgVDFDT0RFICAgICAgICBUMV9GSUVMRF9MT0NBVElPTl9CTEVORAotCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSggIkRlc2lnblZlY3RvciIsIGRlZmF1bHRfZGVzaWduX3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICBUMV9NQVhfTU1fREVTSUdOUywgVDFfRklFTERfRElDVF9GT05URElDVCApCi0KLQotI2VuZGlmIC8qIFQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVCAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3R5cGUxLmMgYi9zcmMvdHlwZTEvdHlwZTEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3OTUzNy4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTEvdHlwZTEuYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR5cGUxLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBUeXBlIDEgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgInQxYWZtLmMiCi0jaW5jbHVkZSAidDFkcml2ZXIuYyIKLSNpbmNsdWRlICJ0MWdsb2FkLmMiCi0jaW5jbHVkZSAidDFsb2FkLmMiCi0jaW5jbHVkZSAidDFvYmpzLmMiCi0jaW5jbHVkZSAidDFwYXJzZS5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi9KYW1maWxlIGIvc3JjL3R5cGU0Mi9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODI2YmJjLi4wMDAwMDAwCi0tLSBhL3NyYy90eXBlNDIvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvdHlwZTQyIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDItMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSB0eXBlNDIgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IHQ0MmRyaXZyCi0gICAgICAgICAgICAgICB0NDJvYmpzCi0gICAgICAgICAgICAgICB0NDJwYXJzZQotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gdHlwZTQyIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3R5cGU0MiBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvdHlwZTQyL21vZHVsZS5tayBiL3NyYy90eXBlNDIvbW9kdWxlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjUyODA2Li4wMDAwMDAwCi0tLSBhL3NyYy90eXBlNDIvbW9kdWxlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFR5cGU0MiBtb2R1bGUgZGVmaW5pdGlvbgotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDItMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotRlRNT0RVTEVfSF9DT01NQU5EUyArPSBUWVBFNDJfRFJJVkVSCi0KLWRlZmluZSBUWVBFNDJfRFJJVkVSCi0kKE9QRU5fRFJJVkVSKSBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHQ0Ml9kcml2ZXJfY2xhc3MgJChDTE9TRV9EUklWRVIpCi0kKEVDSE9fRFJJVkVSKXR5cGU0MiAgICAkKEVDSE9fRFJJVkVSX0RFU0MpVHlwZSA0MiBmb250IGZpbGVzIHdpdGggbm8ga25vd24gZXh0ZW5zaW9uJChFQ0hPX0RSSVZFUl9ET05FKQotZW5kZWYKLQotIyBFT0YKZGlmZiAtLWdpdCBhL3NyYy90eXBlNDIvcnVsZXMubWsgYi9zcmMvdHlwZTQyL3J1bGVzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2U4OTY1Li4wMDAwMDAwCi0tLSBhL3NyYy90eXBlNDIvcnVsZXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0jCi0jIEZyZWVUeXBlIDIgVHlwZTQyIGRyaXZlciBjb25maWd1cmF0aW9uIHJ1bGVzCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi0jIFR5cGU0MiBkcml2ZXIgZGlyZWN0b3J5Ci0jCi1UNDJfRElSIDo9ICQoU1JDX0RJUikvdHlwZTQyCi0KLQotIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgotIwotVDQyX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICRJJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkKFQ0Ml9ESVIpKSBcCi0gICAgICAgICAgICAgICAgICAgICAkKElOQ0xVREVfRkxBR1MpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCi0KLQotIyBUeXBlNDIgZHJpdmVyIHNvdXJjZQotIwotVDQyX0RSVl9TUkMgOj0gJChUNDJfRElSKS90NDJvYmpzLmMgIFwKLSAgICAgICAgICAgICAgICQoVDQyX0RJUikvdDQycGFyc2UuYyBcCi0gICAgICAgICAgICAgICAkKFQ0Ml9ESVIpL3Q0MmRyaXZyLmMKLQotIyBUeXBlNDIgZHJpdmVyIGhlYWRlcnMKLSMKLVQ0Ml9EUlZfSCA6PSAkKFQ0Ml9EUlZfU1JDOiUuYz0lLmgpIFwKLSAgICAgICAgICAgICAkKFQ0Ml9ESVIpL3Q0MmVycm9yLmggIFwKLSAgICAgICAgICAgICAkKFQ0Ml9ESVIpL3Q0MnR5cGVzLmgKLQotCi0jIFR5cGU0MiBkcml2ZXIgb2JqZWN0KHMpCi0jCi0jICAgVDQyX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcwotIyAgIFQ0Ml9EUlZfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHNpbmdsZScgYnVpbGRzCi0jCi1UNDJfRFJWX09CSl9NIDo9ICQoVDQyX0RSVl9TUkM6JChUNDJfRElSKS8lLmM9JChPQkpfRElSKS8lLiRPKQotVDQyX0RSVl9PQkpfUyA6PSAkKE9CSl9ESVIpL3R5cGU0Mi4kTwotCi0jIFR5cGU0MiBkcml2ZXIgc291cmNlIGZpbGUgZm9yIHNpbmdsZSBidWlsZAotIwotVDQyX0RSVl9TUkNfUyA6PSAkKFQ0Ml9ESVIpL3R5cGU0Mi5jCi0KLQotIyBUeXBlNDIgZHJpdmVyIC0gc2luZ2xlIG9iamVjdAotIwotJChUNDJfRFJWX09CSl9TKTogJChUNDJfRFJWX1NSQ19TKSAkKFQ0Ml9EUlZfU1JDKSAkKEZSRUVUWVBFX0gpICQoVDQyX0RSVl9IKQotCSQoVDQyX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKFQ0Ml9EUlZfU1JDX1MpKQotCi0KLSMgVHlwZTQyIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKLSMKLSQoT0JKX0RJUikvJS4kTzogJChUNDJfRElSKS8lLmMgJChGUkVFVFlQRV9IKSAkKFQ0Ml9EUlZfSCkKLQkkKFQ0Ml9DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJDwpCi0KLQotIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCi0jCi1EUlZfT0JKU19TICs9ICQoVDQyX0RSVl9PQkpfUykKLURSVl9PQkpTX00gKz0gJChUNDJfRFJWX09CSl9NKQotCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvdHlwZTQyL3Q0MmRyaXZyLmMgYi9zcmMvdHlwZTQyL3Q0MmRyaXZyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NmNmYjMuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGU0Mi90NDJkcml2ci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQ0MmRyaXZyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIFR5cGUgNDIgZHJpdmVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUm9iZXJ0byBBbGFtZWRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgVHlwZTQyIGZvbnRzIGFzIGRlc2NyaWJlZCBpbiB0aGUgICAgICAgICAgICAgICAqLwotICAvKiBUZWNobmljYWwgTm90ZSAjNTAxMiBmcm9tIEFkb2JlLCB3aXRoIHRoZXNlIGxpbWl0YXRpb25zOiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDEpIENJRCBGb250cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAyKSBJbmNyZW1lbnRhbCBmb250cyBtYWtpbmcgdXNlIG9mIHRoZSBHbHlwaERpcmVjdG9yeSBrZXl3b3JkICAgICAgICAgKi8KLSAgLyogICAgd2lsbCBiZSBsb2FkZWQsIGJ1dCB0aGUgcmVuZGVyaW5nIHdpbGwgYmUgdXNpbmcgdGhlIFRydWVUeXBlICAgICAgICovCi0gIC8qICAgIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAzKSBBcyBmb3IgVHlwZTEgZm9udHMsIENEZXZQcm9jIGlzIG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogNCkgVGhlIE1ldHJpY3MgZGljdGlvbmFyeSBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDUpIEFGTSBtZXRyaWNzIGFyZSBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW4gb3RoZXIgd29yZHMsIHRoaXMgZHJpdmVyIHN1cHBvcnRzIFR5cGU0MiBmb250cyBkZXJpdmVkIGZyb20gICAgICAgICovCi0gIC8qIFRydWVUeXBlIGZvbnRzIGluIGEgbm9uLUNJRCBtYW5uZXIsIGFzIGRvbmUgYnkgdXN1YWwgY29udmVyc2lvbiAgICAgICAqLwotICAvKiBwcm9ncmFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJ0NDJkcml2ci5oIgotI2luY2x1ZGUgInQ0Mm9ianMuaCIKLSNpbmNsdWRlICJ0NDJlcnJvci5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDQyCi0KLQotICAvKgotICAgKgotICAgKiAgR0xZUEggRElDVCBTRVJWSUNFCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0NDJfZ2V0X2dseXBoX25hbWUoIFQ0Ml9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKQotICB7Ci0gICAgRlRfU1RSQ1BZTiggYnVmZmVyLCBmYWNlLT50eXBlMS5nbHlwaF9uYW1lc1tnbHlwaF9pbmRleF0sIGJ1ZmZlcl9tYXggKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIHQ0Ml9nZXRfbmFtZV9pbmRleCggVDQyX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKLSAgewotICAgIEZUX0ludCAgaTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBmYWNlLT50eXBlMS5udW1fZ2x5cGhzOyBpKysgKQotICAgIHsKLSAgICAgIEZUX1N0cmluZyogIGduYW1lID0gZmFjZS0+dHlwZTEuZ2x5cGhfbmFtZXNbaV07Ci0KLQotICAgICAgaWYgKCBnbHlwaF9uYW1lWzBdID09IGduYW1lWzBdICYmICFmdF9zdHJjbXAoIGdseXBoX25hbWUsIGduYW1lICkgKQotICAgICAgICByZXR1cm4gKEZUX1VJbnQpZnRfc3RydG9sKCAoY29uc3QgY2hhciAqKWZhY2UtPnR5cGUxLmNoYXJzdHJpbmdzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAxMCApOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9HbHlwaERpY3RSZWMgIHQ0Ml9zZXJ2aWNlX2dseXBoX2RpY3QgPQotICB7Ci0gICAgKEZUX0dseXBoRGljdF9HZXROYW1lRnVuYykgIHQ0Ml9nZXRfZ2x5cGhfbmFtZSwgICAgLyogZ2V0X25hbWUgICAqLwotICAgIChGVF9HbHlwaERpY3RfTmFtZUluZGV4RnVuYyl0NDJfZ2V0X25hbWVfaW5kZXggICAgIC8qIG5hbWVfaW5kZXggKi8KLSAgfTsKLQotCi0gIC8qCi0gICAqCi0gICAqICBQT1NUU0NSSVBUIE5BTUUgU0VSVklDRQotICAgKgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgY2hhcioKLSAgdDQyX2dldF9wc19mb250X25hbWUoIFQ0Ml9GYWNlICBmYWNlICkKLSAgewotICAgIHJldHVybiAoY29uc3QgY2hhciopZmFjZS0+dHlwZTEuZm9udF9uYW1lOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9Qc0ZvbnROYW1lUmVjICB0NDJfc2VydmljZV9wc19mb250X25hbWUgPQotICB7Ci0gICAgKEZUX1BzTmFtZV9HZXRGdW5jKXQ0Ml9nZXRfcHNfZm9udF9uYW1lICAgLyogZ2V0X3BzX2ZvbnRfbmFtZSAqLwotICB9OwotCi0KLSAgLyoKLSAgICoKLSAgICogIFBPU1RTQ1JJUFQgSU5GTyBTRVJWSUNFCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0NDJfcHNfZ2V0X2ZvbnRfaW5mbyggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEluZm9SZWMqICBhZm9udF9pbmZvICkKLSAgewotICAgICphZm9udF9pbmZvID0gKChUNDJfRmFjZSlmYWNlKS0+dHlwZTEuZm9udF9pbmZvOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHQ0Ml9wc19nZXRfZm9udF9leHRyYSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQU19Gb250RXh0cmFSZWMqICBhZm9udF9leHRyYSApCi0gIHsKLSAgICAqYWZvbnRfZXh0cmEgPSAoKFQ0Ml9GYWNlKWZhY2UpLT50eXBlMS5mb250X2V4dHJhOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0ludAotICB0NDJfcHNfaGFzX2dseXBoX25hbWVzKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0NDJfcHNfZ2V0X2ZvbnRfcHJpdmF0ZSggRlRfRmFjZSAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlUmVjKiAgYWZvbnRfcHJpdmF0ZSApCi0gIHsKLSAgICAqYWZvbnRfcHJpdmF0ZSA9ICgoVDQyX0ZhY2UpZmFjZSktPnR5cGUxLnByaXZhdGVfZGljdDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzSW5mb1JlYyAgdDQyX3NlcnZpY2VfcHNfaW5mbyA9Ci0gIHsKLSAgICAoUFNfR2V0Rm9udEluZm9GdW5jKSAgIHQ0Ml9wc19nZXRfZm9udF9pbmZvLCAgICAvKiBwc19nZXRfZm9udF9pbmZvICAgICovCi0gICAgKFBTX0dldEZvbnRFeHRyYUZ1bmMpICB0NDJfcHNfZ2V0X2ZvbnRfZXh0cmEsICAgLyogcHNfZ2V0X2ZvbnRfZXh0cmEgICAqLwotICAgIChQU19IYXNHbHlwaE5hbWVzRnVuYykgdDQyX3BzX2hhc19nbHlwaF9uYW1lcywgIC8qIHBzX2hhc19nbHlwaF9uYW1lcyAgKi8KLSAgICAoUFNfR2V0Rm9udFByaXZhdGVGdW5jKXQ0Ml9wc19nZXRfZm9udF9wcml2YXRlLCAvKiBwc19nZXRfZm9udF9wcml2YXRlICovCi0gICAgLyogbm90IGltcGxlbWVudGVkICovCi0gICAgKFBTX0dldEZvbnRWYWx1ZUZ1bmMpICBOVUxMICAgICAgICAgICAgICAgICAgICAgLyogcHNfZ2V0X2ZvbnRfdmFsdWUgICAqLwotICB9OwotCi0KLSAgLyoKLSAgICoKLSAgICogIFNFUlZJQ0UgTElTVAotICAgKgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIHQ0Ml9zZXJ2aWNlc1tdID0KLSAgewotICAgIHsgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJnQ0Ml9zZXJ2aWNlX2dseXBoX2RpY3QgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZ0NDJfc2VydmljZV9wc19mb250X25hbWUgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9JTkZPLCAgICAgICZ0NDJfc2VydmljZV9wc19pbmZvIH0sCi0gICAgeyBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgICAgICBGVF9GT05UX0ZPUk1BVF9UWVBFXzQyIH0sCi0gICAgeyBOVUxMLCBOVUxMIH0KLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfTW9kdWxlX0ludGVyZmFjZSApCi0gIFQ0Ml9HZXRfSW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgICAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICB0NDJfaW50ZXJmYWNlICkKLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0KLSAgICByZXR1cm4gZnRfc2VydmljZV9saXN0X2xvb2t1cCggdDQyX3NlcnZpY2VzLCB0NDJfaW50ZXJmYWNlICk7Ci0gIH0KLQotCi0gIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyAgdDQyX2RyaXZlcl9jbGFzcyA9Ci0gIHsKLSAgICB7Ci0gICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIgICAgICAgfAotICAgICAgRlRfTU9EVUxFX0RSSVZFUl9TQ0FMQUJMRSAgIHwKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICAgIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiwKLSNlbHNlCi0gICAgICAwLAotI2VuZGlmCi0KLSAgICAgIHNpemVvZiAoIFQ0Ml9Ecml2ZXJSZWMgKSwKLQotICAgICAgInR5cGU0MiIsCi0gICAgICAweDEwMDAwTCwKLSAgICAgIDB4MjAwMDBMLAotCi0gICAgICBOVUxMLCAgICAvKiBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIFQ0Ml9Ecml2ZXJfSW5pdCwgICAgICAgICAgLyogRlRfTW9kdWxlX0NvbnN0cnVjdG9yICBtb2R1bGVfaW5pdCAgICovCi0gICAgICBUNDJfRHJpdmVyX0RvbmUsICAgICAgICAgIC8qIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgbW9kdWxlX2RvbmUgICAqLwotICAgICAgVDQyX0dldF9JbnRlcmZhY2UsICAgICAgICAvKiBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgIGdldF9pbnRlcmZhY2UgKi8KLSAgICB9LAotCi0gICAgc2l6ZW9mICggVDQyX0ZhY2VSZWMgKSwKLSAgICBzaXplb2YgKCBUNDJfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIFQ0Ml9HbHlwaFNsb3RSZWMgKSwKLQotICAgIFQ0Ml9GYWNlX0luaXQsICAgICAgICAgICAgICAvKiBGVF9GYWNlX0luaXRGdW5jICBpbml0X2ZhY2UgKi8KLSAgICBUNDJfRmFjZV9Eb25lLCAgICAgICAgICAgICAgLyogRlRfRmFjZV9Eb25lRnVuYyAgZG9uZV9mYWNlICovCi0gICAgVDQyX1NpemVfSW5pdCwgICAgICAgICAgICAgIC8qIEZUX1NpemVfSW5pdEZ1bmMgIGluaXRfc2l6ZSAqLwotICAgIFQ0Ml9TaXplX0RvbmUsICAgICAgICAgICAgICAvKiBGVF9TaXplX0RvbmVGdW5jICBkb25lX3NpemUgKi8KLSAgICBUNDJfR2x5cGhTbG90X0luaXQsICAgICAgICAgLyogRlRfU2xvdF9Jbml0RnVuYyAgaW5pdF9zbG90ICovCi0gICAgVDQyX0dseXBoU2xvdF9Eb25lLCAgICAgICAgIC8qIEZUX1Nsb3RfRG9uZUZ1bmMgIGRvbmVfc2xvdCAqLwotCi0gICAgVDQyX0dseXBoU2xvdF9Mb2FkLCAgICAgICAgIC8qIEZUX1Nsb3RfTG9hZEZ1bmMgIGxvYWRfZ2x5cGggKi8KLQotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEtlcm5pbmdGdW5jICAgZ2V0X2tlcm5pbmcgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfQXR0YWNoRnVuYyAgICAgICBhdHRhY2hfZmlsZSAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMgIGdldF9hZHZhbmNlcyAqLwotCi0gICAgVDQyX1NpemVfUmVxdWVzdCwgICAgICAgICAgIC8qIEZUX1NpemVfUmVxdWVzdEZ1bmMgIHJlcXVlc3Rfc2l6ZSAqLwotICAgIFQ0Ml9TaXplX1NlbGVjdCAgICAgICAgICAgICAvKiBGVF9TaXplX1NlbGVjdEZ1bmMgICBzZWxlY3Rfc2l6ZSAgKi8KLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlNDIvdDQyZHJpdnIuaCBiL3NyYy90eXBlNDIvdDQyZHJpdnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjNGEwYS4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTQyL3Q0MmRyaXZyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0NDJkcml2ci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBUeXBlIDQyIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJvYmVydG8gQWxhbWVkYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVDQyRFJJVlJfSF8KLSNkZWZpbmUgVDQyRFJJVlJfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotI2Vycm9yICJ0aGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFBJQyB5ZXQiCi0jZW5kaWYKLQotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyApICB0NDJfZHJpdmVyX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogVDQyRFJJVlJfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlNDIvdDQyZXJyb3IuaCBiL3NyYy90eXBlNDIvdDQyZXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhOTJhYi4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTQyL3Q0MmVycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0NDJlcnJvci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSA0MiBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFR5cGUgNDIgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFQ0MkVSUk9SX0hfCi0jZGVmaW5lIFQ0MkVSUk9SX0hfCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgRlRFUlJPUlNfSF8KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIFQ0Ml9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfVHlwZTQyCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBUNDJFUlJPUl9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi90NDJvYmpzLmMgYi9zcmMvdHlwZTQyL3Q0Mm9ianMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0ZWJkNy4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTQyL3Q0Mm9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDY4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0NDJvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSA0MiBvYmplY3RzIG1hbmFnZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJvYmVydG8gQWxhbWVkYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJ0NDJvYmpzLmgiCi0jaW5jbHVkZSAidDQycGFyc2UuaCIKLSNpbmNsdWRlICJ0NDJlcnJvci5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfTElTVF9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDQyCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgVDQyX09wZW5fRmFjZSggVDQyX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgVDQyX0xvYWRlclJlYyAgbG9hZGVyOwotICAgIFQ0Ml9QYXJzZXIgICAgIHBhcnNlcjsKLSAgICBUMV9Gb250ICAgICAgICB0eXBlMSA9ICZmYWNlLT50eXBlMTsKLSAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLQotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ICA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotCi0KLSAgICB0NDJfbG9hZGVyX2luaXQoICZsb2FkZXIsIGZhY2UgKTsKLQotICAgIHBhcnNlciA9ICZsb2FkZXIucGFyc2VyOwotCi0gICAgaWYgKCBGVF9BTExPQyggZmFjZS0+dHRmX2RhdGEsIDEyICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogd2hpbGUgcGFyc2luZyB0aGUgZm9udCB3ZSBhbHdheXMgdXBkYXRlIGBmYWNlLT50dGZfc2l6ZScgc28gdGhhdCAqLwotICAgIC8qIGV2ZW4gaW4gY2FzZSBvZiBidWdneSBkYXRhICh3aGljaCBtaWdodCBsZWFkIHRvIHByZW1hdHVyZSBlbmQgb2YgKi8KLSAgICAvKiBzY2FubmluZyB3aXRob3V0IGNhdXNpbmcgYW4gZXJyb3IpIHRoZSBjYWxsIHRvIGBGVF9PcGVuX0ZhY2UnIGluICovCi0gICAgLyogYFQ0Ml9GYWNlX0luaXQnIHBhc3NlcyB0aGUgY29ycmVjdCBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZhY2UtPnR0Zl9zaXplID0gMTI7Ci0KLSAgICBlcnJvciA9IHQ0Ml9wYXJzZXJfaW5pdCggcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290LnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2F1eCk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IHQ0Ml9wYXJzZV9kaWN0KCBmYWNlLCAmbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+YmFzZV9kaWN0LCBwYXJzZXItPmJhc2VfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIHR5cGUxLT5mb250X3R5cGUgIT0gNDIgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIlQ0Ml9PcGVuX0ZhY2U6IGNhbm5vdCBoYW5kbGUgRm9udFR5cGUgJWRcbiIsCi0gICAgICAgICAgICAgICAgIHR5cGUxLT5mb250X3R5cGUgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbm93LCBwcm9wYWdhdGUgdGhlIGNoYXJzdHJpbmdzIGFuZCBnbHlwaG5hbWVzIHRhYmxlcyAqLwotICAgIC8qIHRvIHRoZSBUeXBlMSBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB0eXBlMS0+bnVtX2dseXBocyA9IGxvYWRlci5udW1fZ2x5cGhzOwotCi0gICAgaWYgKCAhbG9hZGVyLmNoYXJzdHJpbmdzLmluaXQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIlQ0Ml9PcGVuX0ZhY2U6IG5vIGNoYXJzdHJpbmdzIGFycmF5IGluIGZhY2VcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gICAgbG9hZGVyLmNoYXJzdHJpbmdzLmluaXQgID0gMDsKLSAgICB0eXBlMS0+Y2hhcnN0cmluZ3NfYmxvY2sgPSBsb2FkZXIuY2hhcnN0cmluZ3MuYmxvY2s7Ci0gICAgdHlwZTEtPmNoYXJzdHJpbmdzICAgICAgID0gbG9hZGVyLmNoYXJzdHJpbmdzLmVsZW1lbnRzOwotICAgIHR5cGUxLT5jaGFyc3RyaW5nc19sZW4gICA9IGxvYWRlci5jaGFyc3RyaW5ncy5sZW5ndGhzOwotCi0gICAgLyogd2UgY29weSB0aGUgZ2x5cGggbmFtZXMgYGJsb2NrJyBhbmQgYGVsZW1lbnRzJyBmaWVsZHM7ICovCi0gICAgLyogdGhlIGBsZW5ndGhzJyBmaWVsZCBtdXN0IGJlIHJlbGVhc2VkIGxhdGVyICAgICAgICAgICAgICovCi0gICAgdHlwZTEtPmdseXBoX25hbWVzX2Jsb2NrICAgID0gbG9hZGVyLmdseXBoX25hbWVzLmJsb2NrOwotICAgIHR5cGUxLT5nbHlwaF9uYW1lcyAgICAgICAgICA9IChGVF9TdHJpbmcqKilsb2FkZXIuZ2x5cGhfbmFtZXMuZWxlbWVudHM7Ci0gICAgbG9hZGVyLmdseXBoX25hbWVzLmJsb2NrICAgID0gTlVMTDsKLSAgICBsb2FkZXIuZ2x5cGhfbmFtZXMuZWxlbWVudHMgPSBOVUxMOwotCi0gICAgLyogd2UgbXVzdCBub3cgYnVpbGQgdHlwZTEuZW5jb2Rpbmcgd2hlbiB3ZSBoYXZlIGEgY3VzdG9tIGFycmF5ICovCi0gICAgaWYgKCB0eXBlMS0+ZW5jb2RpbmdfdHlwZSA9PSBUMV9FTkNPRElOR19UWVBFX0FSUkFZICkKLSAgICB7Ci0gICAgICBGVF9JbnQgICAgY2hhcmNvZGUsIGlkeCwgbWluX2NoYXIsIG1heF9jaGFyOwotICAgICAgRlRfQnl0ZSogIGdseXBoX25hbWU7Ci0KLQotICAgICAgLyogT0ssIHdlIGRvIHRoZSBmb2xsb3dpbmc6IGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGVuY29kaW5nICAgKi8KLSAgICAgIC8qIHRhYmxlLCBsb29rIHVwIHRoZSBpbmRleCBvZiB0aGUgZ2x5cGggaGF2aW5nIHRoZSBzYW1lIG5hbWUgICovCi0gICAgICAvKiBhcyBkZWZpbmVkIGluIHRoZSBDaGFyU3RyaW5ncyBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogVGhlIGluZGV4IGlzIHRoZW4gc3RvcmVkIGluIHR5cGUxLmVuY29kaW5nLmNoYXJfaW5kZXgsIGFuZCAgKi8KLSAgICAgIC8qIHRoZSBuYW1lIGluIHR5cGUxLmVuY29kaW5nLmNoYXJfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIG1pbl9jaGFyID0gMDsKLSAgICAgIG1heF9jaGFyID0gMDsKLQotICAgICAgY2hhcmNvZGUgPSAwOwotICAgICAgZm9yICggOyBjaGFyY29kZSA8IGxvYWRlci5lbmNvZGluZ190YWJsZS5tYXhfZWxlbXM7IGNoYXJjb2RlKysgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgY2hhcl9uYW1lOwotCi0KLSAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfaW5kZXhbY2hhcmNvZGVdID0gMDsKLSAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZSBbY2hhcmNvZGVdID0gKGNoYXIgKikiLm5vdGRlZiI7Ci0KLSAgICAgICAgY2hhcl9uYW1lID0gbG9hZGVyLmVuY29kaW5nX3RhYmxlLmVsZW1lbnRzW2NoYXJjb2RlXTsKLSAgICAgICAgaWYgKCBjaGFyX25hbWUgKQotICAgICAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IHR5cGUxLT5udW1fZ2x5cGhzOyBpZHgrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2x5cGhfbmFtZSA9IChGVF9CeXRlKil0eXBlMS0+Z2x5cGhfbmFtZXNbaWR4XTsKLSAgICAgICAgICAgIGlmICggZnRfc3RyY21wKCAoY29uc3QgY2hhciopY2hhcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilnbHlwaF9uYW1lICkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHR5cGUxLT5lbmNvZGluZy5jaGFyX2luZGV4W2NoYXJjb2RlXSA9IChGVF9VU2hvcnQpaWR4OwotICAgICAgICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lIFtjaGFyY29kZV0gPSAoY2hhciopZ2x5cGhfbmFtZTsKLQotICAgICAgICAgICAgICAvKiBDaGFuZ2UgbWluL21heCBlbmNvZGVkIGNoYXIgb25seSBpZiBnbHlwaCBuYW1lIGlzICovCi0gICAgICAgICAgICAgIC8qIG5vdCAvLm5vdGRlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaWYgKCBmdF9zdHJjbXAoIChjb25zdCBjaGFyKikiLm5vdGRlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZ2x5cGhfbmFtZSApICE9IDAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjaGFyY29kZSA8IG1pbl9jaGFyICkKLSAgICAgICAgICAgICAgICAgIG1pbl9jaGFyID0gY2hhcmNvZGU7Ci0gICAgICAgICAgICAgICAgaWYgKCBjaGFyY29kZSA+PSBtYXhfY2hhciApCi0gICAgICAgICAgICAgICAgICBtYXhfY2hhciA9IGNoYXJjb2RlICsgMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHR5cGUxLT5lbmNvZGluZy5jb2RlX2ZpcnN0ID0gbWluX2NoYXI7Ci0gICAgICB0eXBlMS0+ZW5jb2RpbmcuY29kZV9sYXN0ICA9IG1heF9jaGFyOwotICAgICAgdHlwZTEtPmVuY29kaW5nLm51bV9jaGFycyAgPSBsb2FkZXIubnVtX2NoYXJzOwotICAgIH0KLQotICBFeGl0OgotICAgIHQ0Ml9sb2FkZXJfZG9uZSggJmxvYWRlciApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqIERyaXZlciBGdW5jdGlvbnMgKioqKioqKioqKioqKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUNDJfRmFjZV9Jbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIHQ0MmZhY2UsICAgICAgIC8qIFQ0Ml9GYWNlICovCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCi0gIHsKLSAgICBUNDJfRmFjZSAgICAgICAgICAgIGZhY2UgID0gKFQ0Ml9GYWNlKXQ0MmZhY2U7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0gICAgUFNBdXhfU2VydmljZSAgICAgICBwc2F1eDsKLSAgICBGVF9GYWNlICAgICAgICAgICAgIHJvb3QgID0gKEZUX0ZhY2UpJmZhY2UtPnJvb3Q7Ci0gICAgVDFfRm9udCAgICAgICAgICAgICB0eXBlMSA9ICZmYWNlLT50eXBlMTsKLSAgICBQU19Gb250SW5mbyAgICAgICAgIGluZm8gID0gJnR5cGUxLT5mb250X2luZm87Ci0KLSAgICBGVF9VTlVTRUQoIG51bV9wYXJhbXMgKTsKLSAgICBGVF9VTlVTRUQoIHBhcmFtcyApOwotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIGZhY2UtPnR0Zl9mYWNlICAgICAgID0gTlVMTDsKLSAgICBmYWNlLT5yb290Lm51bV9mYWNlcyA9IDE7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHBzbmFtZXMsIFBPU1RTQ1JJUFRfQ01BUFMgKTsKLSAgICBmYWNlLT5wc25hbWVzID0gcHNuYW1lczsKLQotICAgIGZhY2UtPnBzYXV4ID0gRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoIEZUX0ZBQ0VfTElCUkFSWSggZmFjZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2F1eCIgKTsKLSAgICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotICAgIGlmICggIXBzYXV4ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJUNDJfRmFjZV9Jbml0OiBjYW5ub3QgYWNjZXNzIGBwc2F1eCcgbW9kdWxlXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggTWlzc2luZ19Nb2R1bGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTIoKCAiVHlwZSA0MiBkcml2ZXJcbiIgKSk7Ci0KLSAgICAvKiBvcGVuIHRoZSB0b2tlbml6ZXIsIHRoaXMgd2lsbCBhbHNvIGNoZWNrIHRoZSBmb250IGZvcm1hdCAqLwotICAgIGVycm9yID0gVDQyX09wZW5fRmFjZSggZmFjZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogaWYgd2UganVzdCB3YW50ZWQgdG8gY2hlY2sgdGhlIGZvcm1hdCwgbGVhdmUgc3VjY2Vzc2Z1bGx5IG5vdyAqLwotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY2hlY2sgdGhlIGZhY2UgaW5kZXggKi8KLSAgICBpZiAoICggZmFjZV9pbmRleCAmIDB4RkZGRiApID4gMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiVDQyX0ZhY2VfSW5pdDogaW52YWxpZCBmYWNlIGluZGV4XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIE5vdyBsb2FkIHRoZSBmb250IHByb2dyYW0gaW50byB0aGUgZmFjZSBvYmplY3QgKi8KLQotICAgIC8qIEluaXQgdGhlIGZhY2Ugb2JqZWN0IGZpZWxkcyAqLwotICAgIC8qIE5vdyBzZXQgdXAgcm9vdCBmYWNlIGZpZWxkcyAqLwotCi0gICAgcm9vdC0+bnVtX2dseXBocyAgID0gdHlwZTEtPm51bV9nbHlwaHM7Ci0gICAgcm9vdC0+bnVtX2NoYXJtYXBzID0gMDsKLSAgICByb290LT5mYWNlX2luZGV4ICAgPSAwOwotCi0gICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUzsKLQotICAgIGlmICggaW5mby0+aXNfZml4ZWRfcGl0Y2ggKQotICAgICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEg7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfSElOVEVSOwotI2VuZGlmCi0KLSAgICAvKiBYWFg6IFRPRE8gLS0gYWRkIGtlcm5pbmcgd2l0aCAuYWZtIHN1cHBvcnQgKi8KLQotICAgIC8qIGdldCBzdHlsZSBuYW1lIC0tIGJlIGNhcmVmdWwsIHNvbWUgYnJva2VuIGZvbnRzIG9ubHkgKi8KLSAgICAvKiBoYXZlIGEgYC9Gb250TmFtZScgZGljdGlvbmFyeSBlbnRyeSEgICAgICAgICAgICAgICAgICovCi0gICAgcm9vdC0+ZmFtaWx5X25hbWUgPSBpbmZvLT5mYW1pbHlfbmFtZTsKLSAgICAvKiBhc3N1bWUgIlJlZ3VsYXIiIHN0eWxlIGlmIHdlIGRvbid0IGtub3cgYmV0dGVyICovCi0gICAgcm9vdC0+c3R5bGVfbmFtZSA9IChjaGFyICopIlJlZ3VsYXIiOwotICAgIGlmICggcm9vdC0+ZmFtaWx5X25hbWUgKQotICAgIHsKLSAgICAgIGNoYXIqICBmdWxsICAgPSBpbmZvLT5mdWxsX25hbWU7Ci0gICAgICBjaGFyKiAgZmFtaWx5ID0gcm9vdC0+ZmFtaWx5X25hbWU7Ci0KLQotICAgICAgaWYgKCBmdWxsICkKLSAgICAgIHsKLSAgICAgICAgd2hpbGUgKCAqZnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICpmdWxsID09ICpmYW1pbHkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhbWlseSsrOwotICAgICAgICAgICAgZnVsbCsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAqZnVsbCA9PSAnICcgfHwgKmZ1bGwgPT0gJy0nICkKLSAgICAgICAgICAgICAgZnVsbCsrOwotICAgICAgICAgICAgZWxzZSBpZiAoICpmYW1pbHkgPT0gJyAnIHx8ICpmYW1pbHkgPT0gJy0nICkKLSAgICAgICAgICAgICAgZmFtaWx5Kys7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggISpmYW1pbHkgKQotICAgICAgICAgICAgICAgIHJvb3QtPnN0eWxlX25hbWUgPSBmdWxsOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGRvIHdlIGhhdmUgYSBgL0ZvbnROYW1lJz8gKi8KLSAgICAgIGlmICggdHlwZTEtPmZvbnRfbmFtZSApCi0gICAgICAgIHJvb3QtPmZhbWlseV9uYW1lID0gdHlwZTEtPmZvbnRfbmFtZTsKLSAgICB9Ci0KLSAgICAvKiBubyBlbWJlZGRlZCBiaXRtYXAgc3VwcG9ydCAqLwotICAgIHJvb3QtPm51bV9maXhlZF9zaXplcyA9IDA7Ci0gICAgcm9vdC0+YXZhaWxhYmxlX3NpemVzID0gTlVMTDsKLQotICAgIC8qIExvYWQgdGhlIFRURiBmb250IGVtYmVkZGVkIGluIHRoZSBUNDIgZm9udCAqLwotICAgIHsKLSAgICAgIEZUX09wZW5fQXJncyAgYXJnczsKLQotCi0gICAgICBhcmdzLmZsYWdzICAgICAgID0gRlRfT1BFTl9NRU1PUlkgfCBGVF9PUEVOX0RSSVZFUjsKLSAgICAgIGFyZ3MuZHJpdmVyICAgICAgPSBGVF9HZXRfTW9kdWxlKCBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ1ZXR5cGUiICk7Ci0gICAgICBhcmdzLm1lbW9yeV9iYXNlID0gZmFjZS0+dHRmX2RhdGE7Ci0gICAgICBhcmdzLm1lbW9yeV9zaXplID0gZmFjZS0+dHRmX3NpemU7Ci0KLSAgICAgIGlmICggbnVtX3BhcmFtcyApCi0gICAgICB7Ci0gICAgICAgIGFyZ3MuZmxhZ3MgICAgIHw9IEZUX09QRU5fUEFSQU1TOwotICAgICAgICBhcmdzLm51bV9wYXJhbXMgPSBudW1fcGFyYW1zOwotICAgICAgICBhcmdzLnBhcmFtcyAgICAgPSBwYXJhbXM7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJncywgMCwgJmZhY2UtPnR0Zl9mYWNlICk7Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9Eb25lX1NpemUoIGZhY2UtPnR0Zl9mYWNlLT5zaXplICk7Ci0KLSAgICAvKiBJZ25vcmUgaW5mbyBpbiBGb250SW5mbyBkaWN0aW9uYXJ5IGFuZCB1c2UgdGhlIGluZm8gZnJvbSB0aGUgICovCi0gICAgLyogbG9hZGVkIFRURiBmb250LiAgVGhlIFBvc3RTY3JpcHQgaW50ZXJwcmV0ZXIgYWxzbyBpZ25vcmVzIGl0LiAqLwotICAgIHJvb3QtPmJib3ggICAgICAgICA9IGZhY2UtPnR0Zl9mYWNlLT5iYm94OwotICAgIHJvb3QtPnVuaXRzX3Blcl9FTSA9IGZhY2UtPnR0Zl9mYWNlLT51bml0c19wZXJfRU07Ci0KLSAgICByb290LT5hc2NlbmRlciAgPSBmYWNlLT50dGZfZmFjZS0+YXNjZW5kZXI7Ci0gICAgcm9vdC0+ZGVzY2VuZGVyID0gZmFjZS0+dHRmX2ZhY2UtPmRlc2NlbmRlcjsKLSAgICByb290LT5oZWlnaHQgICAgPSBmYWNlLT50dGZfZmFjZS0+aGVpZ2h0OwotCi0gICAgcm9vdC0+bWF4X2FkdmFuY2Vfd2lkdGggID0gZmFjZS0+dHRmX2ZhY2UtPm1heF9hZHZhbmNlX3dpZHRoOwotICAgIHJvb3QtPm1heF9hZHZhbmNlX2hlaWdodCA9IGZhY2UtPnR0Zl9mYWNlLT5tYXhfYWR2YW5jZV9oZWlnaHQ7Ci0KLSAgICByb290LT51bmRlcmxpbmVfcG9zaXRpb24gID0gKEZUX1Nob3J0KWluZm8tPnVuZGVybGluZV9wb3NpdGlvbjsKLSAgICByb290LT51bmRlcmxpbmVfdGhpY2tuZXNzID0gKEZUX1Nob3J0KWluZm8tPnVuZGVybGluZV90aGlja25lc3M7Ci0KLSAgICAvKiBjb21wdXRlIHN0eWxlIGZsYWdzICovCi0gICAgcm9vdC0+c3R5bGVfZmxhZ3MgPSAwOwotICAgIGlmICggaW5mby0+aXRhbGljX2FuZ2xlICkKLSAgICAgIHJvb3QtPnN0eWxlX2ZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfSVRBTElDOwotCi0gICAgaWYgKCBmYWNlLT50dGZfZmFjZS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0JPTEQgKQotICAgICAgcm9vdC0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotCi0gICAgaWYgKCBmYWNlLT50dGZfZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCApCi0gICAgICByb290LT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19WRVJUSUNBTDsKLQotICAgIHsKLSAgICAgIGlmICggcHNuYW1lcyApCi0gICAgICB7Ci0gICAgICAgIEZUX0NoYXJNYXBSZWMgICAgY2hhcm1hcDsKLSAgICAgICAgVDFfQ01hcF9DbGFzc2VzICBjbWFwX2NsYXNzZXMgPSBwc2F1eC0+dDFfY21hcF9jbGFzc2VzOwotICAgICAgICBGVF9DTWFwX0NsYXNzICAgIGNsYXp6OwotCi0KLSAgICAgICAgY2hhcm1hcC5mYWNlID0gcm9vdDsKLQotICAgICAgICAvKiBmaXJzdCBvZiBhbGwsIHRyeSB0byBzeW50aGVzaXplIGEgVW5pY29kZSBjaGFybWFwICovCi0gICAgICAgIGNoYXJtYXAucGxhdGZvcm1faWQgPSBUVF9QTEFURk9STV9NSUNST1NPRlQ7Ci0gICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9NU19JRF9VTklDT0RFX0NTOwotICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfVU5JQ09ERTsKLQotICAgICAgICBlcnJvciA9IEZUX0NNYXBfTmV3KCBjbWFwX2NsYXNzZXMtPnVuaWNvZGUsIE5VTEwsICZjaGFybWFwLCBOVUxMICk7Ci0gICAgICAgIGlmICggZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgICAgIC8qIG5vdywgZ2VuZXJhdGUgYW4gQWRvYmUgU3RhbmRhcmQgZW5jb2Rpbmcgd2hlbiBhcHByb3ByaWF0ZSAqLwotICAgICAgICBjaGFybWFwLnBsYXRmb3JtX2lkID0gVFRfUExBVEZPUk1fQURPQkU7Ci0gICAgICAgIGNsYXp6ICAgICAgICAgICAgICAgPSBOVUxMOwotCi0gICAgICAgIHN3aXRjaCAoIHR5cGUxLT5lbmNvZGluZ190eXBlICkKLSAgICAgICAgewotICAgICAgICBjYXNlIFQxX0VOQ09ESU5HX1RZUEVfU1RBTkRBUkQ6Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEOwotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9TVEFOREFSRDsKLSAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gY21hcF9jbGFzc2VzLT5zdGFuZGFyZDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFQxX0VOQ09ESU5HX1RZUEVfRVhQRVJUOgotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQ7Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX0VYUEVSVDsKLSAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gY21hcF9jbGFzc2VzLT5leHBlcnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUMV9FTkNPRElOR19UWVBFX0FSUkFZOgotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9DVVNUT007Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX0NVU1RPTTsKLSAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gY21hcF9jbGFzc2VzLT5jdXN0b207Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUMV9FTkNPRElOR19UWVBFX0lTT0xBVElOMToKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMTsKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nX2lkID0gVFRfQURPQkVfSURfTEFUSU5fMTsKLSAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gY21hcF9jbGFzc2VzLT51bmljb2RlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjbGF6eiApCi0gICAgICAgICAgZXJyb3IgPSBGVF9DTWFwX05ldyggY2xhenosIE5VTEwsICZjaGFybWFwLCBOVUxMICk7Ci0gICAgICB9Ci0gICAgfQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVDQyX0ZhY2VfRG9uZSggRlRfRmFjZSAgdDQyZmFjZSApCi0gIHsKLSAgICBUNDJfRmFjZSAgICAgZmFjZSA9IChUNDJfRmFjZSl0NDJmYWNlOwotICAgIFQxX0ZvbnQgICAgICB0eXBlMTsKLSAgICBQU19Gb250SW5mbyAgaW5mbzsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIHR5cGUxICA9ICZmYWNlLT50eXBlMTsKLSAgICBpbmZvICAgPSAmdHlwZTEtPmZvbnRfaW5mbzsKLSAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotICAgIC8qIGRlbGV0ZSBpbnRlcm5hbCB0dGYgZmFjZSBwcmlvciB0byBmcmVlaW5nIGZhY2UtPnR0Zl9kYXRhICovCi0gICAgaWYgKCBmYWNlLT50dGZfZmFjZSApCi0gICAgICBGVF9Eb25lX0ZhY2UoIGZhY2UtPnR0Zl9mYWNlICk7Ci0KLSAgICAvKiByZWxlYXNlIGZvbnQgaW5mbyBzdHJpbmdzICovCi0gICAgRlRfRlJFRSggaW5mby0+dmVyc2lvbiApOwotICAgIEZUX0ZSRUUoIGluZm8tPm5vdGljZSApOwotICAgIEZUX0ZSRUUoIGluZm8tPmZ1bGxfbmFtZSApOwotICAgIEZUX0ZSRUUoIGluZm8tPmZhbWlseV9uYW1lICk7Ci0gICAgRlRfRlJFRSggaW5mby0+d2VpZ2h0ICk7Ci0KLSAgICAvKiByZWxlYXNlIHRvcCBkaWN0aW9uYXJ5ICovCi0gICAgRlRfRlJFRSggdHlwZTEtPmNoYXJzdHJpbmdzX2xlbiApOwotICAgIEZUX0ZSRUUoIHR5cGUxLT5jaGFyc3RyaW5ncyApOwotICAgIEZUX0ZSRUUoIHR5cGUxLT5nbHlwaF9uYW1lcyApOwotCi0gICAgRlRfRlJFRSggdHlwZTEtPmNoYXJzdHJpbmdzX2Jsb2NrICk7Ci0gICAgRlRfRlJFRSggdHlwZTEtPmdseXBoX25hbWVzX2Jsb2NrICk7Ci0KLSAgICBGVF9GUkVFKCB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9pbmRleCApOwotICAgIEZUX0ZSRUUoIHR5cGUxLT5lbmNvZGluZy5jaGFyX25hbWUgKTsKLSAgICBGVF9GUkVFKCB0eXBlMS0+Zm9udF9uYW1lICk7Ci0KLSAgICBGVF9GUkVFKCBmYWNlLT50dGZfZGF0YSApOwotCi0jaWYgMAotICAgIC8qIHJlbGVhc2UgYWZtIGRhdGEgaWYgcHJlc2VudCAqLwotICAgIGlmICggZmFjZS0+YWZtX2RhdGEgKQotICAgICAgVDFfRG9uZV9BRk0oIG1lbW9yeSwgKFQxX0FGTSopZmFjZS0+YWZtX2RhdGEgKTsKLSNlbmRpZgotCi0gICAgLyogcmVsZWFzZSB1bmljb2RlIG1hcCwgaWYgYW55ICovCi0gICAgRlRfRlJFRSggZmFjZS0+dW5pY29kZV9tYXAubWFwcyApOwotICAgIGZhY2UtPnVuaWNvZGVfbWFwLm51bV9tYXBzID0gMDsKLQotICAgIGZhY2UtPnJvb3QuZmFtaWx5X25hbWUgPSBOVUxMOwotICAgIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSAgPSBOVUxMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUNDJfRHJpdmVyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIFR5cGUgNDIgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUNDJfRHJpdmVyX0luaXQoIEZUX01vZHVsZSAgbW9kdWxlICkgICAgICAgIC8qIFQ0Ml9Ecml2ZXIgKi8KLSAgewotICAgIFQ0Ml9Ecml2ZXIgIGRyaXZlciA9IChUNDJfRHJpdmVyKW1vZHVsZTsKLSAgICBGVF9Nb2R1bGUgICB0dG1vZHVsZTsKLQotCi0gICAgdHRtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBtb2R1bGUtPmxpYnJhcnksICJ0cnVldHlwZSIgKTsKLSAgICBpZiAoICF0dG1vZHVsZSApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiVDQyX0RyaXZlcl9Jbml0OiBjYW5ub3QgYWNjZXNzIGB0cnVldHlwZScgbW9kdWxlXG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBNaXNzaW5nX01vZHVsZSApOwotICAgIH0KLQotICAgIGRyaXZlci0+dHRjbGF6eiA9IChGVF9Ecml2ZXJfQ2xhc3MpdHRtb2R1bGUtPmNsYXp6OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVDQyX0RyaXZlcl9Eb25lKCBGVF9Nb2R1bGUgIG1vZHVsZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1vZHVsZSApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDQyX1NpemVfSW5pdCggRlRfU2l6ZSAgc2l6ZSApICAgICAgICAgLyogVDQyX1NpemUgKi8KLSAgewotICAgIFQ0Ml9TaXplICB0NDJzaXplID0gKFQ0Ml9TaXplKXNpemU7Ci0gICAgRlRfRmFjZSAgIGZhY2UgICAgPSBzaXplLT5mYWNlOwotICAgIFQ0Ml9GYWNlICB0NDJmYWNlID0gKFQ0Ml9GYWNlKWZhY2U7Ci0gICAgRlRfU2l6ZSAgIHR0c2l6ZTsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gRlRfTmV3X1NpemUoIHQ0MmZhY2UtPnR0Zl9mYWNlLCAmdHRzaXplICk7Ci0gICAgdDQyc2l6ZS0+dHRzaXplID0gdHRzaXplOwotCi0gICAgRlRfQWN0aXZhdGVfU2l6ZSggdHRzaXplICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUNDJfU2l6ZV9SZXF1ZXN0KCBGVF9TaXplICAgICAgICAgIHQ0MnNpemUsICAgICAgLyogVDQyX1NpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgVDQyX1NpemUgIHNpemUgPSAoVDQyX1NpemUpdDQyc2l6ZTsKLSAgICBUNDJfRmFjZSAgZmFjZSA9IChUNDJfRmFjZSl0NDJzaXplLT5mYWNlOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgRlRfQWN0aXZhdGVfU2l6ZSggc2l6ZS0+dHRzaXplICk7Ci0KLSAgICBlcnJvciA9IEZUX1JlcXVlc3RfU2l6ZSggZmFjZS0+dHRmX2ZhY2UsIHJlcSApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgIHQ0MnNpemUtPm1ldHJpY3MgPSBmYWNlLT50dGZfZmFjZS0+c2l6ZS0+bWV0cmljczsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQ0Ml9TaXplX1NlbGVjdCggRlRfU2l6ZSAgIHQ0MnNpemUsICAgICAgICAgLyogVDQyX1NpemUgKi8KLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICkKLSAgewotICAgIFQ0Ml9TaXplICBzaXplID0gKFQ0Ml9TaXplKXQ0MnNpemU7Ci0gICAgVDQyX0ZhY2UgIGZhY2UgPSAoVDQyX0ZhY2UpdDQyc2l6ZS0+ZmFjZTsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIEZUX0FjdGl2YXRlX1NpemUoIHNpemUtPnR0c2l6ZSApOwotCi0gICAgZXJyb3IgPSBGVF9TZWxlY3RfU2l6ZSggZmFjZS0+dHRmX2ZhY2UsIChGVF9JbnQpc3RyaWtlX2luZGV4ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgdDQyc2l6ZS0+bWV0cmljcyA9IGZhY2UtPnR0Zl9mYWNlLT5zaXplLT5tZXRyaWNzOwotCi0gICAgcmV0dXJuIGVycm9yOwotCi0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFQ0Ml9TaXplX0RvbmUoIEZUX1NpemUgIHQ0MnNpemUgKSAgICAgICAgICAgICAvKiBUNDJfU2l6ZSAqLwotICB7Ci0gICAgVDQyX1NpemUgICAgIHNpemUgICAgPSAoVDQyX1NpemUpdDQyc2l6ZTsKLSAgICBGVF9GYWNlICAgICAgZmFjZSAgICA9IHQ0MnNpemUtPmZhY2U7Ci0gICAgVDQyX0ZhY2UgICAgIHQ0MmZhY2UgPSAoVDQyX0ZhY2UpZmFjZTsKLSAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKLQotCi0gICAgbm9kZSA9IEZUX0xpc3RfRmluZCggJnQ0MmZhY2UtPnR0Zl9mYWNlLT5zaXplc19saXN0LCBzaXplLT50dHNpemUgKTsKLSAgICBpZiAoIG5vZGUgKQotICAgIHsKLSAgICAgIEZUX0RvbmVfU2l6ZSggc2l6ZS0+dHRzaXplICk7Ci0gICAgICBzaXplLT50dHNpemUgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQ0Ml9HbHlwaFNsb3RfSW5pdCggRlRfR2x5cGhTbG90ICB0NDJzbG90ICkgICAgICAgIC8qIFQ0Ml9HbHlwaFNsb3QgKi8KLSAgewotICAgIFQ0Ml9HbHlwaFNsb3QgIHNsb3QgICAgPSAoVDQyX0dseXBoU2xvdCl0NDJzbG90OwotICAgIEZUX0ZhY2UgICAgICAgIGZhY2UgICAgPSB0NDJzbG90LT5mYWNlOwotICAgIFQ0Ml9GYWNlICAgICAgIHQ0MmZhY2UgPSAoVDQyX0ZhY2UpZmFjZTsKLSAgICBGVF9HbHlwaFNsb3QgICB0dHNsb3Q7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3IgICA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCAhZmFjZS0+Z2x5cGggKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IGdseXBoIHNsb3QgZm9yIHRoaXMgZmFjZSAqLwotICAgICAgc2xvdC0+dHRzbG90ID0gdDQyZmFjZS0+dHRmX2ZhY2UtPmdseXBoOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9OZXdfR2x5cGhTbG90KCB0NDJmYWNlLT50dGZfZmFjZSwgJnR0c2xvdCApOwotICAgICAgc2xvdC0+dHRzbG90ID0gdHRzbG90OwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVDQyX0dseXBoU2xvdF9Eb25lKCBGVF9HbHlwaFNsb3QgIHQ0MnNsb3QgKSAgICAgICAvKiBUNDJfR2x5cGhTbG90ICovCi0gIHsKLSAgICBUNDJfR2x5cGhTbG90ICBzbG90ID0gKFQ0Ml9HbHlwaFNsb3QpdDQyc2xvdDsKLQotCi0gICAgRlRfRG9uZV9HbHlwaFNsb3QoIHNsb3QtPnR0c2xvdCApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICB0NDJfZ2x5cGhzbG90X2NsZWFyKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgLyogZnJlZSBiaXRtYXAgaWYgbmVlZGVkICovCi0gICAgZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwKCBzbG90ICk7Ci0KLSAgICAvKiBjbGVhciBhbGwgcHVibGljIGZpZWxkcyBpbiB0aGUgZ2x5cGggc2xvdCAqLwotICAgIEZUX1pFUk8oICZzbG90LT5tZXRyaWNzICk7Ci0gICAgRlRfWkVSTyggJnNsb3QtPm91dGxpbmUgKTsKLSAgICBGVF9aRVJPKCAmc2xvdC0+Yml0bWFwICk7Ci0KLSAgICBzbG90LT5iaXRtYXBfbGVmdCAgID0gMDsKLSAgICBzbG90LT5iaXRtYXBfdG9wICAgID0gMDsKLSAgICBzbG90LT5udW1fc3ViZ2x5cGhzID0gMDsKLSAgICBzbG90LT5zdWJnbHlwaHMgICAgID0gTlVMTDsKLSAgICBzbG90LT5jb250cm9sX2RhdGEgID0gTlVMTDsKLSAgICBzbG90LT5jb250cm9sX2xlbiAgID0gMDsKLSAgICBzbG90LT5vdGhlciAgICAgICAgID0gTlVMTDsKLSAgICBzbG90LT5mb3JtYXQgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX05PTkU7Ci0KLSAgICBzbG90LT5saW5lYXJIb3JpQWR2YW5jZSA9IDA7Ci0gICAgc2xvdC0+bGluZWFyVmVydEFkdmFuY2UgPSAwOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDQyX0dseXBoU2xvdF9Mb2FkKCBGVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIFQ0Ml9HbHlwaFNsb3QgICAgdDQyc2xvdCA9IChUNDJfR2x5cGhTbG90KWdseXBoOwotICAgIFQ0Ml9TaXplICAgICAgICAgdDQyc2l6ZSA9IChUNDJfU2l6ZSlzaXplOwotICAgIFQ0Ml9GYWNlICAgICAgICAgdDQyZmFjZSA9IChUNDJfRmFjZSlzaXplLT5mYWNlOwotICAgIEZUX0RyaXZlcl9DbGFzcyAgdHRjbGF6eiA9ICgoVDQyX0RyaXZlcilnbHlwaC0+ZmFjZS0+ZHJpdmVyKS0+dHRjbGF6ejsKLQotCi0gICAgRlRfVFJBQ0UxKCggIlQ0Ml9HbHlwaFNsb3RfTG9hZDogZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwotCi0gICAgLyogbWFwIFQ0MiBnbHlwaCBpbmRleCB0byBlbWJlZGRlZCBUVEYncyBnbHlwaCBpbmRleCAqLwotICAgIGdseXBoX2luZGV4ID0gKEZUX1VJbnQpZnRfc3RydG9sKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXQ0MmZhY2UtPnR5cGUxLmNoYXJzdHJpbmdzW2dseXBoX2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgMTAgKTsKLQotICAgIHQ0Ml9nbHlwaHNsb3RfY2xlYXIoIHQ0MnNsb3QtPnR0c2xvdCApOwotICAgIGVycm9yID0gdHRjbGF6ei0+bG9hZF9nbHlwaCggdDQyc2xvdC0+dHRzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDQyc2l6ZS0+dHRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzIHwgRlRfTE9BRF9OT19CSVRNQVAgKTsKLQotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBnbHlwaC0+bWV0cmljcyA9IHQ0MnNsb3QtPnR0c2xvdC0+bWV0cmljczsKLQotICAgICAgZ2x5cGgtPmxpbmVhckhvcmlBZHZhbmNlID0gdDQyc2xvdC0+dHRzbG90LT5saW5lYXJIb3JpQWR2YW5jZTsKLSAgICAgIGdseXBoLT5saW5lYXJWZXJ0QWR2YW5jZSA9IHQ0MnNsb3QtPnR0c2xvdC0+bGluZWFyVmVydEFkdmFuY2U7Ci0KLSAgICAgIGdseXBoLT5mb3JtYXQgID0gdDQyc2xvdC0+dHRzbG90LT5mb3JtYXQ7Ci0gICAgICBnbHlwaC0+b3V0bGluZSA9IHQ0MnNsb3QtPnR0c2xvdC0+b3V0bGluZTsKLQotICAgICAgZ2x5cGgtPmJpdG1hcCAgICAgID0gdDQyc2xvdC0+dHRzbG90LT5iaXRtYXA7Ci0gICAgICBnbHlwaC0+Yml0bWFwX2xlZnQgPSB0NDJzbG90LT50dHNsb3QtPmJpdG1hcF9sZWZ0OwotICAgICAgZ2x5cGgtPmJpdG1hcF90b3AgID0gdDQyc2xvdC0+dHRzbG90LT5iaXRtYXBfdG9wOwotCi0gICAgICBnbHlwaC0+bnVtX3N1YmdseXBocyA9IHQ0MnNsb3QtPnR0c2xvdC0+bnVtX3N1YmdseXBoczsKLSAgICAgIGdseXBoLT5zdWJnbHlwaHMgICAgID0gdDQyc2xvdC0+dHRzbG90LT5zdWJnbHlwaHM7Ci0KLSAgICAgIGdseXBoLT5jb250cm9sX2RhdGEgID0gdDQyc2xvdC0+dHRzbG90LT5jb250cm9sX2RhdGE7Ci0gICAgICBnbHlwaC0+Y29udHJvbF9sZW4gICA9IHQ0MnNsb3QtPnR0c2xvdC0+Y29udHJvbF9sZW47Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTQyL3Q0Mm9ianMuaCBiL3NyYy90eXBlNDIvdDQyb2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRjNWJmLi4wMDAwMDAwCi0tLSBhL3NyYy90eXBlNDIvdDQyb2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQ0Mm9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDQyIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUm9iZXJ0byBBbGFtZWRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBUNDJPQkpTX0hfCi0jZGVmaW5lIFQ0Mk9CSlNfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotI2luY2x1ZGUgInQ0MnR5cGVzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiBUeXBlNDIgc2l6ZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDQyX1NpemVSZWNfCi0gIHsKLSAgICBGVF9TaXplUmVjICByb290OwotICAgIEZUX1NpemUgICAgIHR0c2l6ZTsKLQotICB9IFQ0Ml9TaXplUmVjLCAqVDQyX1NpemU7Ci0KLQotICAvKiBUeXBlNDIgc2xvdCAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDQyX0dseXBoU2xvdFJlY18KLSAgewotICAgIEZUX0dseXBoU2xvdFJlYyAgcm9vdDsKLSAgICBGVF9HbHlwaFNsb3QgICAgIHR0c2xvdDsKLQotICB9IFQ0Ml9HbHlwaFNsb3RSZWMsICpUNDJfR2x5cGhTbG90OwotCi0KLSAgLyogVHlwZSA0MiBkcml2ZXIgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQ0Ml9Ecml2ZXJSZWNfCi0gIHsKLSAgICBGVF9Ecml2ZXJSZWMgICAgIHJvb3Q7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICB0dGNsYXp6OwotCi0gIH0gVDQyX0RyaXZlclJlYywgKlQ0Ml9Ecml2ZXI7Ci0KLQotICAvKiAqLwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDQyX0ZhY2VfSW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDQyX0ZhY2VfRG9uZSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDQyX1NpemVfSW5pdCggRlRfU2l6ZSAgc2l6ZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDQyX1NpemVfUmVxdWVzdCggRlRfU2l6ZSAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDQyX1NpemVfU2VsZWN0KCBGVF9TaXplICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFQ0Ml9TaXplX0RvbmUoIEZUX1NpemUgIHNpemUgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQ0Ml9HbHlwaFNsb3RfSW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUNDJfR2x5cGhTbG90X0xvYWQoIEZUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUNDJfR2x5cGhTbG90X0RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDQyX0RyaXZlcl9Jbml0KCBGVF9Nb2R1bGUgIG1vZHVsZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDQyX0RyaXZlcl9Eb25lKCBGVF9Nb2R1bGUgIG1vZHVsZSApOwotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBUNDJPQkpTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTQyL3Q0MnBhcnNlLmMgYi9zcmMvdHlwZTQyL3Q0MnBhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzY3NzAuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGU0Mi90NDJwYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0NDJwYXJzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSA0MiBmb250IHBhcnNlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJvYmVydG8gQWxhbWVkYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJ0NDJwYXJzZS5oIgotI2luY2x1ZGUgInQ0MmVycm9yLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDQyCi0KLQotICBzdGF0aWMgdm9pZAotICB0NDJfcGFyc2VfZm9udF9tYXRyaXgoIFQ0Ml9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVDQyX0xvYWRlciAgbG9hZGVyICk7Ci0gIHN0YXRpYyB2b2lkCi0gIHQ0Ml9wYXJzZV9lbmNvZGluZyggVDQyX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBUNDJfTG9hZGVyICBsb2FkZXIgKTsKLQotICBzdGF0aWMgdm9pZAotICB0NDJfcGFyc2VfY2hhcnN0cmluZ3MoIFQ0Ml9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVDQyX0xvYWRlciAgbG9hZGVyICk7Ci0KLSAgc3RhdGljIHZvaWQKLSAgdDQyX3BhcnNlX3NmbnRzKCBUNDJfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIFQ0Ml9Mb2FkZXIgIGxvYWRlciApOwotCi0KLSAgLyogYXMgVHlwZTQyIGZvbnRzIGhhdmUgbm8gUHJpdmF0ZSBkaWN0LCAgICAgICAgICovCi0gIC8qIHdlIHNldCB0aGUgbGFzdCBhcmd1bWVudCBvZiBUMV9GSUVMRF9YWFggdG8gMCAqLwotICBzdGF0aWMgY29uc3QKLSAgVDFfRmllbGRSZWMgIHQ0Ml9rZXl3b3Jkc1tdID0KLSAgewotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFQxX0ZvbnRJbmZvCi0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfSU5GTwotCi0gICAgVDFfRklFTERfU1RSSU5HKCAidmVyc2lvbiIsICAgICAgICAgICAgdmVyc2lvbiwgICAgICAgICAgICAgMCApCi0gICAgVDFfRklFTERfU1RSSU5HKCAiTm90aWNlIiwgICAgICAgICAgICAgbm90aWNlLCAgICAgICAgICAgICAgMCApCi0gICAgVDFfRklFTERfU1RSSU5HKCAiRnVsbE5hbWUiLCAgICAgICAgICAgZnVsbF9uYW1lLCAgICAgICAgICAgMCApCi0gICAgVDFfRklFTERfU1RSSU5HKCAiRmFtaWx5TmFtZSIsICAgICAgICAgZmFtaWx5X25hbWUsICAgICAgICAgMCApCi0gICAgVDFfRklFTERfU1RSSU5HKCAiV2VpZ2h0IiwgICAgICAgICAgICAgd2VpZ2h0LCAgICAgICAgICAgICAgMCApCi0gICAgVDFfRklFTERfTlVNICAgKCAiSXRhbGljQW5nbGUiLCAgICAgICAgaXRhbGljX2FuZ2xlLCAgICAgICAgMCApCi0gICAgVDFfRklFTERfQk9PTCAgKCAiaXNGaXhlZFBpdGNoIiwgICAgICAgaXNfZml4ZWRfcGl0Y2gsICAgICAgMCApCi0gICAgVDFfRklFTERfTlVNICAgKCAiVW5kZXJsaW5lUG9zaXRpb24iLCAgdW5kZXJsaW5lX3Bvc2l0aW9uLCAgMCApCi0gICAgVDFfRklFTERfTlVNICAgKCAiVW5kZXJsaW5lVGhpY2tuZXNzIiwgdW5kZXJsaW5lX3RoaWNrbmVzcywgMCApCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUFNfRm9udEV4dHJhUmVjCi0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRVhUUkEKLQotICAgIFQxX0ZJRUxEX05VTSAgICggIkZTVHlwZSIsICAgICAgICAgICAgIGZzX3R5cGUsICAgICAgICAgICAgIDAgKQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFQxX0ZvbnRSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9ESUNUCi0KLSAgICBUMV9GSUVMRF9LRVkgICggIkZvbnROYW1lIiwgICAgZm9udF9uYW1lLCAgICAwICkKLSAgICBUMV9GSUVMRF9OVU0gICggIlBhaW50VHlwZSIsICAgcGFpbnRfdHlwZSwgICAwICkKLSAgICBUMV9GSUVMRF9OVU0gICggIkZvbnRUeXBlIiwgICAgZm9udF90eXBlLCAgICAwICkKLSAgICBUMV9GSUVMRF9GSVhFRCggIlN0cm9rZVdpZHRoIiwgc3Ryb2tlX3dpZHRoLCAwICkKLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBGVF9CQm94Ci0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1gKLQotICAgIFQxX0ZJRUxEX0JCT1goIkZvbnRCQm94IiwgeE1pbiwgMCApCi0KLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkZvbnRNYXRyaXgiLCAgdDQyX3BhcnNlX2ZvbnRfbWF0cml4LCAwICkKLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkVuY29kaW5nIiwgICAgdDQyX3BhcnNlX2VuY29kaW5nLCAgICAwICkKLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkNoYXJTdHJpbmdzIiwgdDQyX3BhcnNlX2NoYXJzdHJpbmdzLCAwICkKLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggInNmbnRzIiwgICAgICAgdDQyX3BhcnNlX3NmbnRzLCAgICAgICAwICkKLQotICAgIHsgMCwgVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk8sIFQxX0ZJRUxEX1RZUEVfTk9ORSwgMCwgMCwgMCwgMCwgMCwgMCB9Ci0gIH07Ci0KLQotI2RlZmluZSBUMV9BZGRfVGFibGUoIHAsIGksIG8sIGwgKSAgKHApLT5mdW5jcy5hZGQoIChwKSwgaSwgbywgbCApCi0jZGVmaW5lIFQxX1JlbGVhc2VfVGFibGUoIHAgKSAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoIChwKS0+ZnVuY3MucmVsZWFzZSApICBcCi0gICAgICAgICAgICAgIChwKS0+ZnVuY3MucmVsZWFzZSggcCApOyBcCi0gICAgICAgICAgfSB3aGlsZSAoIDAgKQotCi0jZGVmaW5lIFQxX1NraXBfU3BhY2VzKCBwICkgICAgKHApLT5yb290LmZ1bmNzLnNraXBfc3BhY2VzKCAmKHApLT5yb290ICkKLSNkZWZpbmUgVDFfU2tpcF9QU19Ub2tlbiggcCApICAocCktPnJvb3QuZnVuY3Muc2tpcF9QU190b2tlbiggJihwKS0+cm9vdCApCi0KLSNkZWZpbmUgVDFfVG9JbnQoIHAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy50b19pbnQoICYocCktPnJvb3QgKQotI2RlZmluZSBUMV9Ub0J5dGVzKCBwLCBiLCBtLCBuLCBkICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fYnl0ZXMoICYocCktPnJvb3QsIGIsIG0sIG4sIGQgKQotCi0jZGVmaW5lIFQxX1RvRml4ZWRBcnJheSggcCwgbSwgZiwgdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy50b19maXhlZF9hcnJheSggJihwKS0+cm9vdCwgbSwgZiwgdCApCi0jZGVmaW5lIFQxX1RvVG9rZW4oIHAsIHQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy50b190b2tlbiggJihwKS0+cm9vdCwgdCApCi0KLSNkZWZpbmUgVDFfTG9hZF9GaWVsZCggcCwgZiwgbywgbSwgcGYgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLmxvYWRfZmllbGQoICYocCktPnJvb3QsIGYsIG8sIG0sIHBmICkKLSNkZWZpbmUgVDFfTG9hZF9GaWVsZF9UYWJsZSggcCwgZiwgbywgbSwgcGYgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLmxvYWRfZmllbGRfdGFibGUoICYocCktPnJvb3QsIGYsIG8sIG0sIHBmICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKiogUGFyc2luZyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0NDJfcGFyc2VyX2luaXQoIFQ0Ml9QYXJzZXIgICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9Mb25nICAgc2l6ZTsKLQotCi0gICAgcHNhdXgtPnBzX3BhcnNlcl9mdW5jcy0+aW5pdCggJnBhcnNlci0+cm9vdCwgTlVMTCwgTlVMTCwgbWVtb3J5ICk7Ci0KLSAgICBwYXJzZXItPnN0cmVhbSAgICA9IHN0cmVhbTsKLSAgICBwYXJzZXItPmJhc2VfbGVuICA9IDA7Ci0gICAgcGFyc2VyLT5iYXNlX2RpY3QgPSBOVUxMOwotICAgIHBhcnNlci0+aW5fbWVtb3J5ID0gMDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEhlcmUgYSBzaG9ydCBzdW1tYXJ5IG9mIHdoYXQgaXMgZ29pbmcgb246ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgV2hlbiBjcmVhdGluZyBhIG5ldyBUeXBlIDQyIHBhcnNlciwgd2UgdHJ5IHRvIGxvY2F0ZSBhbmQgbG9hZCAqLwotICAgIC8qICAgdGhlIGJhc2UgZGljdGlvbmFyeSwgbG9hZGluZyB0aGUgd2hvbGUgZm9udCBpbnRvIG1lbW9yeS4gICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgV2hlbiBgbG9hZGluZycgdGhlIGJhc2UgZGljdGlvbmFyeSwgd2Ugb25seSBzZXQgdXAgcG9pbnRlcnMgICAqLwotICAgIC8qICAgaW4gdGhlIGNhc2Ugb2YgYSBtZW1vcnktYmFzZWQgc3RyZWFtLiAgT3RoZXJ3aXNlLCB3ZSBhbGxvY2F0ZSAqLwotICAgIC8qICAgYW5kIGxvYWQgdGhlIGJhc2UgZGljdGlvbmFyeSBpbiBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgcGFyc2VyLT5pbl9tZW1vcnkgaXMgc2V0IGlmIHdlIGhhdmUgYSBtZW1vcnkgc3RyZWFtLiAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMEwgKSB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIDE3ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBmdF9tZW1jbXAoIHN0cmVhbS0+Y3Vyc29yLCAiJSFQUy1UcnVlVHlwZUZvbnQiLCAxNyApICE9IDAgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICIgIG5vdCBhIFR5cGU0MiBmb250XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIGlmICggZXJyb3IgfHwgRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzaXplID0gKEZUX0xvbmcpc3RyZWFtLT5zaXplOwotCi0gICAgLyogbm93LCB0cnkgdG8gbG9hZCBgc2l6ZScgYnl0ZXMgb2YgdGhlIGBiYXNlJyBkaWN0aW9uYXJ5IHdlICovCi0gICAgLyogZm91bmQgcHJldmlvdXNseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBpZiBpdCBpcyBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSwgc2V0IHVwIHBvaW50ZXJzICovCi0gICAgaWYgKCAhc3RyZWFtLT5yZWFkICkKLSAgICB7Ci0gICAgICBwYXJzZXItPmJhc2VfZGljdCA9IChGVF9CeXRlKilzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKLSAgICAgIHBhcnNlci0+YmFzZV9sZW4gID0gc2l6ZTsKLSAgICAgIHBhcnNlci0+aW5fbWVtb3J5ID0gMTsKLQotICAgICAgLyogY2hlY2sgdGhhdCB0aGUgYHNpemUnIGZpZWxkIGlzIHZhbGlkICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCBzaXplICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZWFkIHNlZ21lbnQgaW4gbWVtb3J5ICovCi0gICAgICBpZiAoIEZUX0FMTE9DKCBwYXJzZXItPmJhc2VfZGljdCwgc2l6ZSApICAgICAgIHx8Ci0gICAgICAgICAgIEZUX1NUUkVBTV9SRUFEKCBwYXJzZXItPmJhc2VfZGljdCwgc2l6ZSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwYXJzZXItPmJhc2VfbGVuID0gc2l6ZTsKLSAgICB9Ci0KLSAgICBwYXJzZXItPnJvb3QuYmFzZSAgID0gcGFyc2VyLT5iYXNlX2RpY3Q7Ci0gICAgcGFyc2VyLT5yb290LmN1cnNvciA9IHBhcnNlci0+YmFzZV9kaWN0OwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBwYXJzZXItPnJvb3QuY3Vyc29yICsgcGFyc2VyLT5iYXNlX2xlbjsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgJiYgIXBhcnNlci0+aW5fbWVtb3J5ICkKLSAgICAgIEZUX0ZSRUUoIHBhcnNlci0+YmFzZV9kaWN0ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHQ0Ml9wYXJzZXJfZG9uZSggVDQyX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5yb290Lm1lbW9yeTsKLQotCi0gICAgLyogZnJlZSB0aGUgYmFzZSBkaWN0aW9uYXJ5IG9ubHkgd2hlbiB3ZSBoYXZlIGEgZGlzayBzdHJlYW0gKi8KLSAgICBpZiAoICFwYXJzZXItPmluX21lbW9yeSApCi0gICAgICBGVF9GUkVFKCBwYXJzZXItPmJhc2VfZGljdCApOwotCi0gICAgcGFyc2VyLT5yb290LmZ1bmNzLmRvbmUoICZwYXJzZXItPnJvb3QgKTsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICB0NDJfaXNfc3BhY2UoIEZUX0J5dGUgIGMgKQotICB7Ci0gICAgcmV0dXJuICggYyA9PSAnICcgIHx8IGMgPT0gJ1x0JyAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICBjID09ICdccicgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xmJyB8fAotICAgICAgICAgICAgIGMgPT0gJ1wwJyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHQ0Ml9wYXJzZV9mb250X21hdHJpeCggVDQyX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBUNDJfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgVDQyX1BhcnNlciAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotICAgIEZUX01hdHJpeCogIG1hdHJpeCA9ICZmYWNlLT50eXBlMS5mb250X21hdHJpeDsKLSAgICBGVF9WZWN0b3IqICBvZmZzZXQgPSAmZmFjZS0+dHlwZTEuZm9udF9vZmZzZXQ7Ci0gICAgRlRfRml4ZWQgICAgdGVtcFs2XTsKLSAgICBGVF9GaXhlZCAgICB0ZW1wX3NjYWxlOwotICAgIEZUX0ludCAgICAgIHJlc3VsdDsKLQotCi0gICAgcmVzdWx0ID0gVDFfVG9GaXhlZEFycmF5KCBwYXJzZXIsIDYsIHRlbXAsIDAgKTsKLQotICAgIGlmICggcmVzdWx0IDwgNiApCi0gICAgewotICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0ZW1wX3NjYWxlID0gRlRfQUJTKCB0ZW1wWzNdICk7Ci0KLSAgICBpZiAoIHRlbXBfc2NhbGUgPT0gMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX2ZvbnRfbWF0cml4OiBpbnZhbGlkIGZvbnQgbWF0cml4XG4iICkpOwotICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBhdHlwaWNhbCBjYXNlICovCi0gICAgaWYgKCB0ZW1wX3NjYWxlICE9IDB4MTAwMDBMICkKLSAgICB7Ci0gICAgICB0ZW1wWzBdID0gRlRfRGl2Rml4KCB0ZW1wWzBdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICB0ZW1wWzFdID0gRlRfRGl2Rml4KCB0ZW1wWzFdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICB0ZW1wWzJdID0gRlRfRGl2Rml4KCB0ZW1wWzJdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICB0ZW1wWzRdID0gRlRfRGl2Rml4KCB0ZW1wWzRdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICB0ZW1wWzVdID0gRlRfRGl2Rml4KCB0ZW1wWzVdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICB0ZW1wWzNdID0gdGVtcFszXSA8IDAgPyAtMHgxMDAwMEwgOiAweDEwMDAwTDsKLSAgICB9Ci0KLSAgICBtYXRyaXgtPnh4ID0gdGVtcFswXTsKLSAgICBtYXRyaXgtPnl4ID0gdGVtcFsxXTsKLSAgICBtYXRyaXgtPnh5ID0gdGVtcFsyXTsKLSAgICBtYXRyaXgtPnl5ID0gdGVtcFszXTsKLQotICAgIC8qIG5vdGUgdGhhdCB0aGUgb2Zmc2V0cyBtdXN0IGJlIGV4cHJlc3NlZCBpbiBpbnRlZ2VyIGZvbnQgdW5pdHMgKi8KLSAgICBvZmZzZXQtPnggPSB0ZW1wWzRdID4+IDE2OwotICAgIG9mZnNldC0+eSA9IHRlbXBbNV0gPj4gMTY7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHQ0Ml9wYXJzZV9lbmNvZGluZyggVDQyX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBUNDJfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgVDQyX1BhcnNlciAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotICAgIEZUX0J5dGUqICAgIGN1cjsKLSAgICBGVF9CeXRlKiAgICBsaW1pdCAgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0KLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCAgPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLQotCi0gICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotICAgIGN1ciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9lbmNvZGluZzogb3V0IG9mIGJvdW5kc1xuIiApKTsKLSAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogaWYgd2UgaGF2ZSBhIG51bWJlciBvciBgWycsIHRoZSBlbmNvZGluZyBpcyBhbiBhcnJheSwgKi8KLSAgICAvKiBhbmQgd2UgbXVzdCBsb2FkIGl0IG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZnRfaXNkaWdpdCggKmN1ciApIHx8ICpjdXIgPT0gJ1snICkKLSAgICB7Ci0gICAgICBUMV9FbmNvZGluZyAgZW5jb2RlICAgICAgICAgID0gJmZhY2UtPnR5cGUxLmVuY29kaW5nOwotICAgICAgRlRfSW50ICAgICAgIGNvdW50LCBuOwotICAgICAgUFNfVGFibGUgICAgIGNoYXJfdGFibGUgICAgICA9ICZsb2FkZXItPmVuY29kaW5nX3RhYmxlOwotICAgICAgRlRfTWVtb3J5ICAgIG1lbW9yeSAgICAgICAgICA9IHBhcnNlci0+cm9vdC5tZW1vcnk7Ci0gICAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgICBGVF9Cb29sICAgICAgb25seV9pbW1lZGlhdGVzID0gMDsKLQotCi0gICAgICAvKiByZWFkIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZW5jb2Rpbmc7IHNob3VsZCBiZSAyNTYgKi8KLSAgICAgIGlmICggKmN1ciA9PSAnWycgKQotICAgICAgewotICAgICAgICBjb3VudCAgICAgICAgICAgPSAyNTY7Ci0gICAgICAgIG9ubHlfaW1tZWRpYXRlcyA9IDE7Ci0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgY291bnQgPSAoRlRfSW50KVQxX1RvSW50KCBwYXJzZXIgKTsKLQotICAgICAgLyogb25seSBjb21wb3NpdGUgZm9udHMgKHdoaWNoIHdlIGRvbid0IHN1cHBvcnQpICovCi0gICAgICAvKiBjYW4gaGF2ZSBsYXJnZXIgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggY291bnQgPiAyNTYgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ0NDJfcGFyc2VfZW5jb2Rpbmc6IGludmFsaWQgZW5jb2RpbmcgYXJyYXkgc2l6ZVxuIiApKTsKLSAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0gICAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPj0gbGltaXQgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIC8qIFBvc3RTY3JpcHQgaGFwcGlseSBhbGxvd3Mgb3ZlcndyaXRpbmcgb2YgZW5jb2RpbmcgYXJyYXlzICovCi0gICAgICBpZiAoIGVuY29kZS0+Y2hhcl9pbmRleCApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZSRUUoIGVuY29kZS0+Y2hhcl9pbmRleCApOwotICAgICAgICBGVF9GUkVFKCBlbmNvZGUtPmNoYXJfbmFtZSApOwotICAgICAgICBUMV9SZWxlYXNlX1RhYmxlKCBjaGFyX3RhYmxlICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIHVzZSBhIFQxX1RhYmxlIHRvIHN0b3JlIG91ciBjaGFybmFtZXMgKi8KLSAgICAgIGxvYWRlci0+bnVtX2NoYXJzID0gZW5jb2RlLT5udW1fY2hhcnMgPSBjb3VudDsKLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBlbmNvZGUtPmNoYXJfaW5kZXgsIGNvdW50ICkgICAgIHx8Ci0gICAgICAgICAgIEZUX05FV19BUlJBWSggZW5jb2RlLT5jaGFyX25hbWUsICBjb3VudCApICAgICB8fAotICAgICAgICAgICBGVF9TRVRfRVJST1IoIHBzYXV4LT5wc190YWJsZV9mdW5jcy0+aW5pdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdGFibGUsIGNvdW50LCBtZW1vcnkgKSApICkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gZXJyb3I7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogV2UgbmVlZCB0byBgemVybycgb3V0IGVuY29kaW5nX3RhYmxlLmVsZW1lbnRzICovCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgewotICAgICAgICBjaGFyKiAgbm90ZGVmID0gKGNoYXIgKikiLm5vdGRlZiI7Ci0KLQotICAgICAgICAodm9pZClUMV9BZGRfVGFibGUoIGNoYXJfdGFibGUsIG4sIG5vdGRlZiwgOCApOwotICAgICAgfQotCi0gICAgICAvKiBOb3cgd2UgbmVlZCB0byByZWFkIHJlY29yZHMgb2YgdGhlIGZvcm0gICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAuLi4gY2hhcmNvZGUgL2NoYXJuYW1lIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIGZvciBlYWNoIGVudHJ5IGluIG91ciB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBXZSBzaW1wbHkgbG9vayBmb3IgYSBudW1iZXIgZm9sbG93ZWQgYnkgYW4gaW1tZWRpYXRlICAgKi8KLSAgICAgIC8qIG5hbWUuICBOb3RlIHRoYXQgdGhpcyBpZ25vcmVzIGNvcnJlY3RseSB0aGUgc2VxdWVuY2UgICAqLwotICAgICAgLyogdGhhdCBpcyBvZnRlbiBzZWVuIGluIHR5cGU0MiBmb250czogICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgMCAxIDI1NSB7IDEgaW5kZXggZXhjaCAvLm5vdGRlZiBwdXQgfSBmb3IgZHVwICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiB1c2VkIHRvIGNsZWFuIHRoZSBlbmNvZGluZyBhcnJheSBiZWZvcmUgYW55dGhpbmcgZWxzZS4gKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogQWx0ZXJuYXRpdmVseSwgaWYgdGhlIGFycmF5IGlzIGRpcmVjdGx5IGdpdmVuIGFzICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgL0VuY29kaW5nIFsgLi4uIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiB3ZSBvbmx5IHJlYWQgaW1tZWRpYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgbiA9IDA7Ci0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAgIHdoaWxlICggcGFyc2VyLT5yb290LmN1cnNvciA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLQotICAgICAgICAvKiB3ZSBzdG9wIHdoZW4gd2UgZW5jb3VudGVyIGBkZWYnIG9yIGBdJyAqLwotICAgICAgICBpZiAoICpjdXIgPT0gJ2QnICYmIGN1ciArIDMgPCBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGN1clsxXSA9PSAnZScgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGN1clsyXSA9PSAnZicgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIHQ0Ml9pc19zcGFjZSggY3VyWzNdICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1RSQUNFNigoICJlbmNvZGluZyBlbmRcbiIgKSk7Ci0gICAgICAgICAgICBjdXIgKz0gMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoICpjdXIgPT0gJ10nICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNigoICJlbmNvZGluZyBlbmRcbiIgKSk7Ci0gICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgZm91bmQgYW4gZW50cnkgKi8KLSAgICAgICAgaWYgKCBmdF9pc2RpZ2l0KCAqY3VyICkgfHwgb25seV9pbW1lZGlhdGVzICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0ludCAgY2hhcmNvZGU7Ci0KLQotICAgICAgICAgIGlmICggb25seV9pbW1lZGlhdGVzICkKLSAgICAgICAgICAgIGNoYXJjb2RlID0gbjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhcmNvZGUgPSAoRlRfSW50KVQxX1RvSW50KCBwYXJzZXIgKTsKLSAgICAgICAgICAgIFQxX1NraXBfU3BhY2VzKCBwYXJzZXIgKTsKLQotICAgICAgICAgICAgLyogcHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgY2hhcmNvZGUgKi8KLSAgICAgICAgICAgIGlmICggY3VyID09IHBhcnNlci0+cm9vdC5jdXJzb3IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLQotICAgICAgICAgIGlmICggY3VyICsgMiA8IGxpbWl0ICYmICpjdXIgPT0gJy8nICYmIG4gPCBjb3VudCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgbGVuOwotCi0KLSAgICAgICAgICAgIGN1cisrOwotCi0gICAgICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gY3VyOwotICAgICAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPj0gbGltaXQgKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgbGVuID0gKEZUX1VJbnQpKCBwYXJzZXItPnJvb3QuY3Vyc29yIC0gY3VyICk7Ci0KLSAgICAgICAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IFQxX0FkZF9UYWJsZSggY2hhcl90YWJsZSwgY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ciwgbGVuICsgMSApOwotICAgICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjaGFyX3RhYmxlLT5lbGVtZW50c1tjaGFyY29kZV1bbGVuXSA9ICdcMCc7Ci0KLSAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIG9ubHlfaW1tZWRpYXRlcyApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogU2luY2UgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgbm90IHVwZGF0ZWQgZm9yICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogaW1tZWRpYXRlcy1vbmx5IG1vZGUgd2Ugd291bGQgZ2V0IGFuIGluZmluaXRlIGxvb3AgaWYgICAqLwotICAgICAgICAgICAgLyogd2UgZG9uJ3QgZG8gYW55dGhpbmcgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogVGhpcyBlbmNvZGluZyBhcnJheSBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSAgICAgICAqLwotICAgICAgICAgICAgLyogdHlwZTQyIHNwZWNpZmljYXRpb24gKGl0IG1pZ2h0IGJlIGFuIGVuY29kaW5nIGZvciBhIENJRCAqLwotICAgICAgICAgICAgLyogdHlwZTQyIGZvbnQsIGhvd2V2ZXIpLCBzbyB3ZSBjb25jbHVkZSB0aGF0IHRoaXMgZm9udCBpcyAqLwotICAgICAgICAgICAgLyogTk9UIGEgdHlwZTQyIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotICAgICAgfQotCi0gICAgICBmYWNlLT50eXBlMS5lbmNvZGluZ190eXBlID0gVDFfRU5DT0RJTkdfVFlQRV9BUlJBWTsKLSAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgICAgICAgPSBjdXI7Ci0gICAgfQotCi0gICAgLyogT3RoZXJ3aXNlLCB3ZSBzaG91bGQgaGF2ZSBlaXRoZXIgYFN0YW5kYXJkRW5jb2RpbmcnLCAqLwotICAgIC8qIGBFeHBlcnRFbmNvZGluZycsIG9yIGBJU09MYXRpbjFFbmNvZGluZycgICAgICAgICAgICAgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBjdXIgKyAxNyA8IGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBmdF9zdHJuY21wKCAoY29uc3QgY2hhciopY3VyLCAiU3RhbmRhcmRFbmNvZGluZyIsIDE2ICkgPT0gMCApCi0gICAgICAgIGZhY2UtPnR5cGUxLmVuY29kaW5nX3R5cGUgPSBUMV9FTkNPRElOR19UWVBFX1NUQU5EQVJEOwotCi0gICAgICBlbHNlIGlmICggY3VyICsgMTUgPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgZnRfc3RybmNtcCggKGNvbnN0IGNoYXIqKWN1ciwgIkV4cGVydEVuY29kaW5nIiwgMTQgKSA9PSAwICkKLSAgICAgICAgZmFjZS0+dHlwZTEuZW5jb2RpbmdfdHlwZSA9IFQxX0VOQ09ESU5HX1RZUEVfRVhQRVJUOwotCi0gICAgICBlbHNlIGlmICggY3VyICsgMTggPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgZnRfc3RybmNtcCggKGNvbnN0IGNoYXIqKWN1ciwgIklTT0xhdGluMUVuY29kaW5nIiwgMTcgKSA9PSAwICkKLSAgICAgICAgZmFjZS0+dHlwZTEuZW5jb2RpbmdfdHlwZSA9IFQxX0VOQ09ESU5HX1RZUEVfSVNPTEFUSU4xOwotCi0gICAgICBlbHNlCi0gICAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX0VSUiggSWdub3JlICk7Ci0gICAgfQotICB9Ci0KLQotICB0eXBlZGVmIGVudW0gIFQ0Ml9Mb2FkX1N0YXR1c18KLSAgewotICAgIEJFRk9SRV9TVEFSVCwKLSAgICBCRUZPUkVfVEFCTEVfRElSLAotICAgIE9USEVSX1RBQkxFUwotCi0gIH0gVDQyX0xvYWRfU3RhdHVzOwotCi0KLSAgc3RhdGljIHZvaWQKLSAgdDQyX3BhcnNlX3NmbnRzKCBUNDJfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIFQ0Ml9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBUNDJfUGFyc2VyICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gcGFyc2VyLT5yb290Lm1lbW9yeTsKLSAgICBGVF9CeXRlKiAgICBjdXI7Ci0gICAgRlRfQnl0ZSogICAgbGltaXQgID0gcGFyc2VyLT5yb290LmxpbWl0OwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX0ludCAgICAgIG51bV90YWJsZXMgPSAwOwotICAgIEZUX0xvbmcgICAgIGNvdW50OwotCi0gICAgRlRfVUxvbmcgICAgbiwgc3RyaW5nX3NpemUsIG9sZF9zdHJpbmdfc2l6ZSwgcmVhbF9zaXplOwotICAgIEZUX0J5dGUqICAgIHN0cmluZ19idWYgPSBOVUxMOwotICAgIEZUX0Jvb2wgICAgIGFsbG9jYXRlZCAgPSAwOwotCi0gICAgVDQyX0xvYWRfU3RhdHVzICBzdGF0dXM7Ci0KLQotICAgIC8qIFRoZSBmb3JtYXQgaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIC9zZm50cyBbIDxoZXhzdHJpbmc+IDxoZXhzdHJpbmc+IC4uLiBdIGRlZiAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgL3NmbnRzIFsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICA8bnVtX2Jpbl9ieXRlcz4gUkQgPGJpbmFyeSBkYXRhPiAgICAgICAgKi8KLSAgICAvKiAgICAgIDxudW1fYmluX2J5dGVzPiBSRCA8YmluYXJ5IGRhdGE+ICAgICAgICAqLwotICAgIC8qICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBdIGRlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHdpdGggZXhhY3RseSBvbmUgc3BhY2UgYWZ0ZXIgdGhlIGBSRCcgdG9rZW4uICovCi0KLSAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPj0gbGltaXQgfHwgKnBhcnNlci0+cm9vdC5jdXJzb3IrKyAhPSAnWycgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9zZm50czogY2FuJ3QgZmluZCBiZWdpbiBvZiBzZm50cyB2ZWN0b3JcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotICAgIHN0YXR1cyAgICAgICAgICA9IEJFRk9SRV9TVEFSVDsKLSAgICBzdHJpbmdfc2l6ZSAgICAgPSAwOwotICAgIG9sZF9zdHJpbmdfc2l6ZSA9IDA7Ci0gICAgY291bnQgICAgICAgICAgID0gMDsKLQotICAgIHdoaWxlICggcGFyc2VyLT5yb290LmN1cnNvciA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgc2l6ZTsKLQotCi0gICAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotCi0gICAgICBpZiAoICpjdXIgPT0gJ10nICkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvcisrOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCAqY3VyID09ICc8JyApCi0gICAgICB7Ci0gICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIC8qIGRvbid0IGluY2x1ZGUgZGVsaW1pdGVycyAqLwotICAgICAgICBzdHJpbmdfc2l6ZSA9IChGVF9VTG9uZykoICggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciAtIDIgKyAxICkgLyAyICk7Ci0gICAgICAgIGlmICggIXN0cmluZ19zaXplICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9zZm50czogaW52YWxpZCBkYXRhIGluIHNmbnRzIGFycmF5XG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBGVF9SRUFMTE9DKCBzdHJpbmdfYnVmLCBvbGRfc3RyaW5nX3NpemUsIHN0cmluZ19zaXplICkgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBhbGxvY2F0ZWQgPSAxOwotCi0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBjdXI7Ci0gICAgICAgICh2b2lkKVQxX1RvQnl0ZXMoIHBhcnNlciwgc3RyaW5nX2J1Ziwgc3RyaW5nX3NpemUsICZyZWFsX3NpemUsIDEgKTsKLSAgICAgICAgb2xkX3N0cmluZ19zaXplID0gc3RyaW5nX3NpemU7Ci0gICAgICAgIHN0cmluZ19zaXplICAgICA9IHJlYWxfc2l6ZTsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoIGZ0X2lzZGlnaXQoICpjdXIgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0xvbmcgIHRtcDsKLQotCi0gICAgICAgIGlmICggYWxsb2NhdGVkICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9zZm50czogIgotICAgICAgICAgICAgICAgICAgICAgImNhbid0IGhhbmRsZSBtaXhlZCBiaW5hcnkgYW5kIGhleCBzdHJpbmdzXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgPSBUMV9Ub0ludCggcGFyc2VyICk7Ci0gICAgICAgIGlmICggdG1wIDwgMCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJ0NDJfcGFyc2Vfc2ZudHM6IGludmFsaWQgc3RyaW5nIHNpemVcbiIgKSk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgc3RyaW5nX3NpemUgPSAoRlRfVUxvbmcpdG1wOwotCi0gICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOyAgICAgICAgICAgICAvKiBgUkQnICovCi0gICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc3RyaW5nX2J1ZiA9IHBhcnNlci0+cm9vdC5jdXJzb3IgKyAxOyAgIC8qIG9uZSBzcGFjZSBhZnRlciBgUkQnICovCi0KLSAgICAgICAgaWYgKCAoRlRfVUxvbmcpKCBsaW1pdCAtIHBhcnNlci0+cm9vdC5jdXJzb3IgKSA8PSBzdHJpbmdfc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJ0NDJfcGFyc2Vfc2ZudHM6IHRvbyBtdWNoIGJpbmFyeSBkYXRhXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgKz0gc3RyaW5nX3NpemUgKyAxOwotICAgICAgfQotCi0gICAgICBpZiAoICFzdHJpbmdfYnVmICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX3NmbnRzOiBpbnZhbGlkIGRhdGEgaW4gc2ZudHMgYXJyYXlcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICAvKiBBIHN0cmluZyBjYW4gaGF2ZSBhIHRyYWlsaW5nIHplcm8gKG9kZCkgYnl0ZSBmb3IgcGFkZGluZy4gKi8KLSAgICAgIC8qIElnbm9yZSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCAoIHN0cmluZ19zaXplICYgMSApICYmIHN0cmluZ19idWZbc3RyaW5nX3NpemUgLSAxXSA9PSAwICkKLSAgICAgICAgc3RyaW5nX3NpemUtLTsKLQotICAgICAgaWYgKCAhc3RyaW5nX3NpemUgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ0NDJfcGFyc2Vfc2ZudHM6IGludmFsaWQgc3RyaW5nXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIHdob2xlIFRURiBpcyBub3cgbG9hZGVkIGludG8gYHN0cmluZ19idWYnLiAgV2UgYXJlICovCi0gICAgICAvKiBjaGVja2luZyBpdHMgY29udGVudHMgd2hpbGUgY29weWluZyBpdCB0byBgdHRmX2RhdGEnLiAgKi8KLQotICAgICAgc2l6ZSA9IChGVF9VTG9uZykoIGxpbWl0IC0gcGFyc2VyLT5yb290LmN1cnNvciApOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IHN0cmluZ19zaXplOyBuKysgKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKCBzdGF0dXMgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgQkVGT1JFX1NUQVJUOgotICAgICAgICAgIC8qIGxvYWQgb2Zmc2V0IHRhYmxlLCAxMiBieXRlcyAqLwotICAgICAgICAgIGlmICggY291bnQgPCAxMiApCi0gICAgICAgICAgewotICAgICAgICAgICAgZmFjZS0+dHRmX2RhdGFbY291bnQrK10gPSBzdHJpbmdfYnVmW25dOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBudW1fdGFibGVzICAgICA9IDE2ICogZmFjZS0+dHRmX2RhdGFbNF0gKyBmYWNlLT50dGZfZGF0YVs1XTsKLSAgICAgICAgICAgIHN0YXR1cyAgICAgICAgID0gQkVGT1JFX1RBQkxFX0RJUjsKLSAgICAgICAgICAgIGZhY2UtPnR0Zl9zaXplID0gMTIgKyAxNiAqIG51bV90YWJsZXM7Ci0KLSAgICAgICAgICAgIGlmICggKEZUX0xvbmcpc2l6ZSA8IGZhY2UtPnR0Zl9zaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX3NmbnRzOiBpbnZhbGlkIGRhdGEgaW4gc2ZudHMgYXJyYXlcbiIgKSk7Ci0gICAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIEZUX1JFQUxMT0MoIGZhY2UtPnR0Zl9kYXRhLCAxMiwgZmFjZS0+dHRmX3NpemUgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLSAgICAgICAgY2FzZSBCRUZPUkVfVEFCTEVfRElSOgotICAgICAgICAgIC8qIHRoZSBvZmZzZXQgdGFibGUgaXMgcmVhZDsgcmVhZCB0aGUgdGFibGUgZGlyZWN0b3J5ICovCi0gICAgICAgICAgaWYgKCBjb3VudCA8IGZhY2UtPnR0Zl9zaXplICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNlLT50dGZfZGF0YVtjb3VudCsrXSA9IHN0cmluZ19idWZbbl07Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCAgICAgICBpOwotICAgICAgICAgICAgRlRfVUxvbmcgIGxlbjsKLQotCi0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV90YWJsZXM7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0J5dGUqICBwID0gZmFjZS0+dHRmX2RhdGEgKyAxMiArIDE2ICogaSArIDEyOwotCi0KLSAgICAgICAgICAgICAgbGVuID0gRlRfUEVFS19VTE9ORyggcCApOwotICAgICAgICAgICAgICBpZiAoIGxlbiA+IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICBmYWNlLT50dGZfc2l6ZSA+IChGVF9Mb25nKSggc2l6ZSAtIGxlbiApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9zZm50czoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgZGF0YSBpbiBzZm50cyBhcnJheVxuIiApKTsKLSAgICAgICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLyogUGFkIHRvIGEgNC1ieXRlIGJvdW5kYXJ5IGxlbmd0aCAqLwotICAgICAgICAgICAgICBmYWNlLT50dGZfc2l6ZSArPSAoRlRfTG9uZykoICggbGVuICsgMyApICYgfjNVICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IE9USEVSX1RBQkxFUzsKLQotICAgICAgICAgICAgaWYgKCBGVF9SRUFMTE9DKCBmYWNlLT50dGZfZGF0YSwgMTIgKyAxNiAqIG51bV90YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnR0Zl9zaXplICsgMSApICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIH0KLSAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgICAgICBjYXNlIE9USEVSX1RBQkxFUzoKLSAgICAgICAgICAvKiBhbGwgb3RoZXIgdGFibGVzIGFyZSBqdXN0IGNvcGllZCAqLwotICAgICAgICAgIGlmICggY291bnQgPj0gZmFjZS0+dHRmX3NpemUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9zZm50czogdG9vIG11Y2ggYmluYXJ5IGRhdGFcbiIgKSk7Ci0gICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZhY2UtPnR0Zl9kYXRhW2NvdW50KytdID0gc3RyaW5nX2J1ZltuXTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0gICAgfQotCi0gICAgLyogaWYgY29udHJvbCByZWFjaGVzIHRoaXMgcG9pbnQsIHRoZSBmb3JtYXQgd2FzIG5vdCB2YWxpZCAqLwotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICBGYWlsOgotICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IGVycm9yOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBhbGxvY2F0ZWQgKQotICAgICAgRlRfRlJFRSggc3RyaW5nX2J1ZiApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICB0NDJfcGFyc2VfY2hhcnN0cmluZ3MoIFQ0Ml9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVDQyX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIFQ0Ml9QYXJzZXIgICAgIHBhcnNlciAgICAgICA9ICZsb2FkZXItPnBhcnNlcjsKLSAgICBQU19UYWJsZSAgICAgICBjb2RlX3RhYmxlICAgPSAmbG9hZGVyLT5jaGFyc3RyaW5nczsKLSAgICBQU19UYWJsZSAgICAgICBuYW1lX3RhYmxlICAgPSAmbG9hZGVyLT5nbHlwaF9uYW1lczsKLSAgICBQU19UYWJsZSAgICAgICBzd2FwX3RhYmxlICAgPSAmbG9hZGVyLT5zd2FwX3RhYmxlOwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSAgICAgICA9IHBhcnNlci0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0KLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCAgICAgICAgPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLQotICAgIEZUX0J5dGUqICAgICAgIGN1cjsKLSAgICBGVF9CeXRlKiAgICAgICBsaW1pdCAgICAgICAgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0gICAgRlRfSW50ICAgICAgICAgbjsKLSAgICBGVF9JbnQgICAgICAgICBub3RkZWZfaW5kZXggPSAwOwotICAgIEZUX0J5dGUgICAgICAgIG5vdGRlZl9mb3VuZCA9IDA7Ci0KLQotICAgIFQxX1NraXBfU3BhY2VzKCBwYXJzZXIgKTsKLQotICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciA+PSBsaW1pdCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX2NoYXJzdHJpbmdzOiBvdXQgb2YgYm91bmRzXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIGlmICggZnRfaXNkaWdpdCggKnBhcnNlci0+cm9vdC5jdXJzb3IgKSApCi0gICAgewotICAgICAgbG9hZGVyLT5udW1fZ2x5cGhzID0gVDFfVG9JbnQoIHBhcnNlciApOwotICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICByZXR1cm47Ci0gICAgICBpZiAoIGxvYWRlci0+bnVtX2dseXBocyA8IDAgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ0NDJfcGFyc2VfZW5jb2Rpbmc6IGludmFsaWQgbnVtYmVyIG9mIGdseXBoc1xuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIGNlcnRhaW5seSBuZWVkIG1vcmUgdGhhbiA0IGJ5dGVzIHBlciBnbHlwaCAqLwotICAgICAgaWYgKCBsb2FkZXItPm51bV9nbHlwaHMgPiAoIGxpbWl0IC0gcGFyc2VyLT5yb290LmN1cnNvciApID4+IDIgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAidDQyX3BhcnNlX2NoYXJzdHJpbmdzOiBhZGp1c3RpbmcgbnVtYmVyIG9mIGdseXBocyIKLSAgICAgICAgICAgICAgICAgICAgIiAoZnJvbSAlZCB0byAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxvYWRlci0+bnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgKCBsaW1pdCAtIHBhcnNlci0+cm9vdC5jdXJzb3IgKSA+PiAyICkpOwotICAgICAgICBsb2FkZXItPm51bV9nbHlwaHMgPSAoIGxpbWl0IC0gcGFyc2VyLT5yb290LmN1cnNvciApID4+IDI7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSBpZiAoICpwYXJzZXItPnJvb3QuY3Vyc29yID09ICc8JyApCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBgPDwgLi4uID4+Jy4gIENvdW50IHRoZSBudW1iZXIgb2YgYC8nIGluIHRoZSBkaWN0aW9uYXJ5ICovCi0gICAgICAvKiB0byBnZXQgaXRzIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIEZUX0ludCAgY291bnQgPSAwOwotCi0KLSAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICByZXR1cm47Ci0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0gICAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotCi0gICAgICB3aGlsZSAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPCBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnBhcnNlci0+cm9vdC5jdXJzb3IgPT0gJy8nICkKLSAgICAgICAgICBjb3VudCsrOwotICAgICAgICBlbHNlIGlmICggKnBhcnNlci0+cm9vdC5jdXJzb3IgPT0gJz4nICkKLSAgICAgICAgewotICAgICAgICAgIGxvYWRlci0+bnVtX2dseXBocyAgPSBjb3VudDsKLSAgICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gY3VyOyAgICAgICAgLyogcmV3aW5kICovCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFQxX1NraXBfU3BhY2VzKCBwYXJzZXIgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9jaGFyc3RyaW5nczogaW52YWxpZCB0b2tlblxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPj0gbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9jaGFyc3RyaW5nczogb3V0IG9mIGJvdW5kc1xuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIHRhYmxlcyAqLwotCi0gICAgLyogY29udHJhcnkgdG8gVHlwZTEsIHdlIGRpc2FsbG93IG11bHRpcGxlIENoYXJTdHJpbmdzIGFycmF5cyAqLwotICAgIGlmICggc3dhcF90YWJsZS0+aW5pdCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgIiBvbmx5IG9uZSBDaGFyU3RyaW5ncyBhcnJheSBhbGxvd2VkXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIGVycm9yID0gcHNhdXgtPnBzX3RhYmxlX2Z1bmNzLT5pbml0KCBjb2RlX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPm51bV9nbHlwaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZXJyb3IgPSBwc2F1eC0+cHNfdGFibGVfZnVuY3MtPmluaXQoIG5hbWVfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+bnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRhYmxlIGZvciBzd2FwcGluZyBpbmRleCBub3RkZWZfaW5kZXggYW5kICovCi0gICAgLyogaW5kZXggMCBuYW1lcyBhbmQgY29kZXMgKGlmIG5lY2Vzc2FyeSkuICAgICAgICAgICAgICAqLwotCi0gICAgZXJyb3IgPSBwc2F1eC0+cHNfdGFibGVfZnVuY3MtPmluaXQoIHN3YXBfdGFibGUsIDQsIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgbiA9IDA7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8qIFdlIHN1cHBvcnQgdHdvIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgYC9nbHlwaG5hbWUnICsgaW5kZXggWysgYGRlZiddICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgYChnbHlwaG5hbWUpJyBbKyBgY3ZuJ10gKyBpbmRleCBbKyBgZGVmJ10gKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFRoZSBsYXR0ZXIgZm9ybWF0IGdldHMgY3JlYXRlZCBieSB0aGUgICAgICAgKi8KLSAgICAgIC8qIExpbHlQb25kIHR5cGVzZXR0aW5nIHByb2dyYW0uICAgICAgICAgICAgICAgKi8KLQotICAgICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotCi0gICAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogV2Ugc3RvcCB3aGVuIHdlIGZpbmQgYW4gYGVuZCcga2V5d29yZCBvciAnPicgKi8KLSAgICAgIGlmICggKmN1ciAgID09ICdlJyAgICAgICAgICAmJgotICAgICAgICAgICBjdXIgKyAzIDwgbGltaXQgICAgICAgICYmCi0gICAgICAgICAgIGN1clsxXSA9PSAnbicgICAgICAgICAgJiYKLSAgICAgICAgICAgY3VyWzJdID09ICdkJyAgICAgICAgICAmJgotICAgICAgICAgICB0NDJfaXNfc3BhY2UoIGN1clszXSApICkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAoICpjdXIgPT0gJz4nICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgaWYgKCBwYXJzZXItPnJvb3QuY3Vyc29yID49IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX2NoYXJzdHJpbmdzOiBvdXQgb2YgYm91bmRzXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBpZiAoICpjdXIgPT0gJy8nIHx8ICpjdXIgPT0gJygnICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgbGVuOwotICAgICAgICBGVF9Cb29sICBoYXZlX2xpdGVyYWwgPSBGVF9CT09MKCAqY3VyID09ICcoJyApOwotCi0KLSAgICAgICAgaWYgKCBjdXIgKyAoIGhhdmVfbGl0ZXJhbCA/IDMgOiAyICkgPj0gbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX2NoYXJzdHJpbmdzOiBvdXQgb2YgYm91bmRzXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBjdXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIGAvJyAqLwotICAgICAgICBsZW4gPSAoRlRfVUludCkoIHBhcnNlci0+cm9vdC5jdXJzb3IgLSBjdXIgKTsKLSAgICAgICAgaWYgKCBoYXZlX2xpdGVyYWwgKQotICAgICAgICAgIGxlbi0tOwotCi0gICAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBuYW1lX3RhYmxlLCBuLCBjdXIsIGxlbiArIDEgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIC8qIGFkZCBhIHRyYWlsaW5nIHplcm8gdG8gdGhlIG5hbWUgdGFibGUgKi8KLSAgICAgICAgbmFtZV90YWJsZS0+ZWxlbWVudHNbbl1bbGVuXSA9ICdcMCc7Ci0KLSAgICAgICAgLyogcmVjb3JkIGluZGV4IG9mIC8ubm90ZGVmICovCi0gICAgICAgIGlmICggKmN1ciA9PSAnLicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBmdF9zdHJjbXAoICIubm90ZGVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKikobmFtZV90YWJsZS0+ZWxlbWVudHNbbl0pICkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBub3RkZWZfaW5kZXggPSBuOwotICAgICAgICAgIG5vdGRlZl9mb3VuZCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAgICAgaWYgKCBoYXZlX2xpdGVyYWwgKQotICAgICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotCi0gICAgICAgIGN1ciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0KLSAgICAgICAgKHZvaWQpVDFfVG9JbnQoIHBhcnNlciApOwotICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPj0gbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX2NoYXJzdHJpbmdzOiBvdXQgb2YgYm91bmRzXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBsZW4gPSAoRlRfVUludCkoIHBhcnNlci0+cm9vdC5jdXJzb3IgLSBjdXIgKTsKLQotICAgICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggY29kZV90YWJsZSwgbiwgY3VyLCBsZW4gKyAxICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBjb2RlX3RhYmxlLT5lbGVtZW50c1tuXVtsZW5dID0gJ1wwJzsKLQotICAgICAgICBuKys7Ci0gICAgICAgIGlmICggbiA+PSBsb2FkZXItPm51bV9nbHlwaHMgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGxvYWRlci0+bnVtX2dseXBocyA9IG47Ci0KLSAgICBpZiAoICFub3RkZWZfZm91bmQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQ0Ml9wYXJzZV9jaGFyc3RyaW5nczogbm8gLy5ub3RkZWYgZ2x5cGhcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogaWYgLy5ub3RkZWYgZG9lcyBub3Qgb2NjdXB5IGluZGV4IDAsIGRvIG91ciBtYWdpYy4gKi8KLSAgICBpZiAoIGZ0X3N0cmNtcCggKGNvbnN0IGNoYXIqKSIubm90ZGVmIiwKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKW5hbWVfdGFibGUtPmVsZW1lbnRzWzBdICkgKQotICAgIHsKLSAgICAgIC8qIFN3YXAgZ2x5cGggaW4gaW5kZXggMCB3aXRoIC8ubm90ZGVmIGdseXBoLiAgRmlyc3QsIGFkZCBpbmRleCAwICAqLwotICAgICAgLyogbmFtZSBhbmQgY29kZSBlbnRyaWVzIHRvIHN3YXBfdGFibGUuICBUaGVuIHBsYWNlIG5vdGRlZl9pbmRleCAgICovCi0gICAgICAvKiBuYW1lIGFuZCBjb2RlIGVudHJpZXMgaW50byBzd2FwX3RhYmxlLiAgVGhlbiBzd2FwIG5hbWUgYW5kIGNvZGUgKi8KLSAgICAgIC8qIGVudHJpZXMgYXQgaW5kaWNlcyBub3RkZWZfaW5kZXggYW5kIDAgdXNpbmcgdmFsdWVzIHN0b3JlZCBpbiAgICAqLwotICAgICAgLyogc3dhcF90YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIEluZGV4IDAgbmFtZSAqLwotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHN3YXBfdGFibGUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIC8qIEluZGV4IDAgY29kZSAqLwotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHN3YXBfdGFibGUsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIC8qIEluZGV4IG5vdGRlZl9pbmRleCBuYW1lICovCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggc3dhcF90YWJsZSwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3RhYmxlLT5lbGVtZW50c1tub3RkZWZfaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfdGFibGUtPmxlbmd0aHMgW25vdGRlZl9pbmRleF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIC8qIEluZGV4IG5vdGRlZl9pbmRleCBjb2RlICovCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggc3dhcF90YWJsZSwgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX3RhYmxlLT5lbGVtZW50c1tub3RkZWZfaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfdGFibGUtPmxlbmd0aHMgW25vdGRlZl9pbmRleF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBuYW1lX3RhYmxlLCBub3RkZWZfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBjb2RlX3RhYmxlLCBub3RkZWZfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+ZWxlbWVudHNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+bGVuZ3RocyBbMV0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBuYW1lX3RhYmxlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmVsZW1lbnRzWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmxlbmd0aHMgWzJdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggY29kZV90YWJsZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX3RhYmxlLT5lbGVtZW50c1szXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX3RhYmxlLT5sZW5ndGhzIFszXSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgIH0KLQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdDQyX2xvYWRfa2V5d29yZCggVDQyX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgVDQyX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICBUMV9GaWVsZCAgICBmaWVsZCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgdm9pZCogICAgIGR1bW15X29iamVjdDsKLSAgICB2b2lkKiogICAgb2JqZWN0czsKLSAgICBGVF9VSW50ICAgbWF4X29iamVjdHMgPSAwOwotCi0KLSAgICAvKiBpZiB0aGUga2V5d29yZCBoYXMgYSBkZWRpY2F0ZWQgY2FsbGJhY2ssIGNhbGwgaXQgKi8KLSAgICBpZiAoIGZpZWxkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfQ0FMTEJBQ0sgKQotICAgIHsKLSAgICAgIGZpZWxkLT5yZWFkZXIoIChGVF9GYWNlKWZhY2UsIGxvYWRlciApOwotICAgICAgZXJyb3IgPSBsb2FkZXItPnBhcnNlci5yb290LmVycm9yOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIG5vdyB0aGUga2V5d29yZCBpcyBlaXRoZXIgYSBzaW1wbGUgZmllbGQgb3IgYSB0YWJsZSBvZiBmaWVsZHM7ICovCi0gICAgLyogd2UgYXJlIG5vdyBnb2luZyB0byB0YWtlIGNhcmUgb2YgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHN3aXRjaCAoIGZpZWxkLT5sb2NhdGlvbiApCi0gICAgewotICAgIGNhc2UgVDFfRklFTERfTE9DQVRJT05fRk9OVF9JTkZPOgotICAgICAgZHVtbXlfb2JqZWN0ID0gJmZhY2UtPnR5cGUxLmZvbnRfaW5mbzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9GT05UX0VYVFJBOgotICAgICAgZHVtbXlfb2JqZWN0ID0gJmZhY2UtPnR5cGUxLmZvbnRfZXh0cmE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVDFfRklFTERfTE9DQVRJT05fQkJPWDoKLSAgICAgIGR1bW15X29iamVjdCA9ICZmYWNlLT50eXBlMS5mb250X2Jib3g7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBkdW1teV9vYmplY3QgPSAmZmFjZS0+dHlwZTE7Ci0gICAgfQotCi0gICAgb2JqZWN0cyA9ICZkdW1teV9vYmplY3Q7Ci0KLSAgICBpZiAoIGZpZWxkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSB8fAotICAgICAgICAgZmllbGQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSAgICkKLSAgICAgIGVycm9yID0gVDFfTG9hZF9GaWVsZF9UYWJsZSggJmxvYWRlci0+cGFyc2VyLCBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cywgbWF4X29iamVjdHMsIDAgKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IFQxX0xvYWRfRmllbGQoICZsb2FkZXItPnBhcnNlciwgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMsIG1heF9vYmplY3RzLCAwICk7Ci0KLSAgIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdDQyX3BhcnNlX2RpY3QoIFQ0Ml9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBUNDJfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgc2l6ZSApCi0gIHsKLSAgICBUNDJfUGFyc2VyICBwYXJzZXIgICAgID0gJmxvYWRlci0+cGFyc2VyOwotICAgIEZUX0J5dGUqICAgIGxpbWl0OwotICAgIEZUX0ludCAgICAgIG5fa2V5d29yZHMgPSAoRlRfSW50KSggc2l6ZW9mICggdDQyX2tleXdvcmRzICkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCB0NDJfa2V5d29yZHNbMF0gKSApOwotCi0KLSAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gYmFzZTsKLSAgICBwYXJzZXItPnJvb3QubGltaXQgID0gYmFzZSArIHNpemU7Ci0gICAgcGFyc2VyLT5yb290LmVycm9yICA9IEZUX0Vycl9PazsKLQotICAgIGxpbWl0ID0gcGFyc2VyLT5yb290LmxpbWl0OwotCi0gICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotCi0gICAgd2hpbGUgKCBwYXJzZXItPnJvb3QuY3Vyc29yIDwgbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBjdXI7Ci0KLQotICAgICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLQotICAgICAgLyogbG9vayBmb3IgYEZvbnREaXJlY3RvcnknIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBmb3Igc29tZSBmb250cyAqLwotICAgICAgaWYgKCAqY3VyID09ICdGJyAmJiBjdXIgKyAyNSA8IGxpbWl0ICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBmdF9zdHJuY21wKCAoY2hhciopY3VyLCAiRm9udERpcmVjdG9yeSIsIDEzICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBjdXIyOwotCi0KLSAgICAgICAgLyogc2tpcCB0aGUgYEZvbnREaXJlY3RvcnknIGtleXdvcmQgKi8KLSAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgIFQxX1NraXBfU3BhY2VzICAoIHBhcnNlciApOwotICAgICAgICBjdXIgPSBjdXIyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLQotICAgICAgICAvKiBsb29rIHVwIHRoZSBga25vd24nIGtleXdvcmQgKi8KLSAgICAgICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICpjdXIgPT0gJ2snICYmIGN1ciArIDUgPCBsaW1pdCAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIChjaGFyKiljdXIsICJrbm93biIsIDUgKSA9PSAwICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIFQxX1NraXBfU3BhY2VzICAoIHBhcnNlciApOwotICAgICAgICAgIGN1ciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGN1ciA8IGxpbWl0ICkKLSAgICAgICAgewotICAgICAgICAgIFQxX1Rva2VuUmVjICB0b2tlbjsKLQotCi0gICAgICAgICAgLyogc2tpcCB0aGUgYGtub3duJyBrZXl3b3JkIGFuZCB0aGUgdG9rZW4gZm9sbG93aW5nIGl0ICovCi0gICAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgICAgVDFfVG9Ub2tlbiggcGFyc2VyLCAmdG9rZW4gKTsKLQotICAgICAgICAgIC8qIGlmIHRoZSBsYXN0IHRva2VuIHdhcyBhbiBhcnJheSwgc2tpcCBpdCEgKi8KLSAgICAgICAgICBpZiAoIHRva2VuLnR5cGUgPT0gVDFfVE9LRU5fVFlQRV9BUlJBWSApCi0gICAgICAgICAgICBjdXIyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICAgICAgfQotICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gY3VyMjsKLSAgICAgIH0KLQotICAgICAgLyogbG9vayBmb3IgaW1tZWRpYXRlcyAqLwotICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJy8nICYmIGN1ciArIDIgPCBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGxlbjsKLQotCi0gICAgICAgIGN1cisrOwotCi0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBjdXI7Ci0gICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwotCi0gICAgICAgIGlmICggbGVuID4gMCAmJiBsZW4gPCAyMiAmJiBwYXJzZXItPnJvb3QuY3Vyc29yIDwgbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgaW50ICBpOwotCi0KLSAgICAgICAgICAvKiBub3cgY29tcGFyZSB0aGUgaW1tZWRpYXRlIG5hbWUgdG8gdGhlIGtleXdvcmQgdGFibGUgKi8KLQotICAgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwga25vd24ga2V5d29yZHMgKi8KLSAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG5fa2V5d29yZHM7IGkrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgVDFfRmllbGQgIGtleXdvcmQgPSAoVDFfRmllbGQpJnQ0Ml9rZXl3b3Jkc1tpXTsKLSAgICAgICAgICAgIEZUX0J5dGUgICAqbmFtZSAgID0gKEZUX0J5dGUqKWtleXdvcmQtPmlkZW50OwotCi0KLSAgICAgICAgICAgIGlmICggIW5hbWUgKQotICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKCBjdXJbMF0gPT0gbmFtZVswXSAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICBsZW4gPT0gZnRfc3RybGVuKCAoY29uc3QgY2hhciAqKW5hbWUgKSAmJgotICAgICAgICAgICAgICAgICBmdF9tZW1jbXAoIGN1ciwgbmFtZSwgbGVuICkgPT0gMCAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHdlIGZvdW5kIGl0IC0tIHJ1biB0aGUgcGFyc2luZyBjYWxsYmFjayEgKi8KLSAgICAgICAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gdDQyX2xvYWRfa2V5d29yZCggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkICk7Ci0gICAgICAgICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLT5yb290LmVycm9yOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIFQxX1NraXBfU3BhY2VzKCBwYXJzZXIgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gcGFyc2VyLT5yb290LmVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0NDJfbG9hZGVyX2luaXQoIFQ0Ml9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICBUNDJfRmFjZSAgICBmYWNlICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotCi0gICAgRlRfWkVSTyggbG9hZGVyICk7Ci0gICAgbG9hZGVyLT5udW1fZ2x5cGhzID0gMDsKLSAgICBsb2FkZXItPm51bV9jaGFycyAgPSAwOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgdGFibGVzIC0tIHNpbXBseSBzZXQgdGhlaXIgYGluaXQnIGZpZWxkIHRvIDAgKi8KLSAgICBsb2FkZXItPmVuY29kaW5nX3RhYmxlLmluaXQgPSAwOwotICAgIGxvYWRlci0+Y2hhcnN0cmluZ3MuaW5pdCAgICA9IDA7Ci0gICAgbG9hZGVyLT5nbHlwaF9uYW1lcy5pbml0ICAgID0gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdDQyX2xvYWRlcl9kb25lKCBUNDJfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgVDQyX1BhcnNlciAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotCi0KLSAgICAvKiBmaW5hbGl6ZSB0YWJsZXMgKi8KLSAgICBUMV9SZWxlYXNlX1RhYmxlKCAmbG9hZGVyLT5lbmNvZGluZ190YWJsZSApOwotICAgIFQxX1JlbGVhc2VfVGFibGUoICZsb2FkZXItPmNoYXJzdHJpbmdzICk7Ci0gICAgVDFfUmVsZWFzZV9UYWJsZSggJmxvYWRlci0+Z2x5cGhfbmFtZXMgKTsKLSAgICBUMV9SZWxlYXNlX1RhYmxlKCAmbG9hZGVyLT5zd2FwX3RhYmxlICk7Ci0KLSAgICAvKiBmaW5hbGl6ZSBwYXJzZXIgKi8KLSAgICB0NDJfcGFyc2VyX2RvbmUoIHBhcnNlciApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTQyL3Q0MnBhcnNlLmggYi9zcmMvdHlwZTQyL3Q0MnBhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjg2MDYuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGU0Mi90NDJwYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDQycGFyc2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgNDIgZm9udCBwYXJzZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSb2JlcnRvIEFsYW1lZGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFQ0MlBBUlNFX0hfCi0jZGVmaW5lIFQ0MlBBUlNFX0hfCi0KLQotI2luY2x1ZGUgInQ0Mm9ianMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgVDQyX1BhcnNlclJlY18KLSAgewotICAgIFBTX1BhcnNlclJlYyAgcm9vdDsKLSAgICBGVF9TdHJlYW0gICAgIHN0cmVhbTsKLQotICAgIEZUX0J5dGUqICAgICAgYmFzZV9kaWN0OwotICAgIEZUX0xvbmcgICAgICAgYmFzZV9sZW47Ci0KLSAgICBGVF9Cb29sICAgICAgIGluX21lbW9yeTsKLQotICB9IFQ0Ml9QYXJzZXJSZWMsICpUNDJfUGFyc2VyOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQ0Ml9Mb2FkZXJfCi0gIHsKLSAgICBUNDJfUGFyc2VyUmVjICBwYXJzZXI7ICAgICAgICAgIC8qIHBhcnNlciB1c2VkIHRvIHJlYWQgdGhlIHN0cmVhbSAqLwotCi0gICAgRlRfSW50ICAgICAgICAgbnVtX2NoYXJzOyAgICAgICAvKiBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBlbmNvZGluZyAqLwotICAgIFBTX1RhYmxlUmVjICAgIGVuY29kaW5nX3RhYmxlOyAgLyogUFNfVGFibGUgdXNlZCB0byBzdG9yZSB0aGUgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuY29kaW5nIGNoYXJhY3RlciBuYW1lcyAgICAgICAgICovCi0KLSAgICBGVF9JbnQgICAgICAgICBudW1fZ2x5cGhzOwotICAgIFBTX1RhYmxlUmVjICAgIGdseXBoX25hbWVzOwotICAgIFBTX1RhYmxlUmVjICAgIGNoYXJzdHJpbmdzOwotICAgIFBTX1RhYmxlUmVjICAgIHN3YXBfdGFibGU7ICAgICAgLyogRm9yIG1vdmluZyAubm90ZGVmIGdseXBoIHRvIGluZGV4IDAuICovCi0KLSAgfSBUNDJfTG9hZGVyUmVjLCAqVDQyX0xvYWRlcjsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHQ0Ml9wYXJzZXJfaW5pdCggVDQyX1BhcnNlciAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgUFNBdXhfU2VydmljZSAgcHNhdXggKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQ0Ml9wYXJzZXJfZG9uZSggVDQyX1BhcnNlciAgcGFyc2VyICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0NDJfcGFyc2VfZGljdCggVDQyX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIFQ0Ml9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBzaXplICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQ0Ml9sb2FkZXJfaW5pdCggVDQyX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgIFQ0Ml9GYWNlICAgIGZhY2UgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQ0Ml9sb2FkZXJfZG9uZSggVDQyX0xvYWRlciAgbG9hZGVyICk7Ci0KLQotIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogVDQyUEFSU0VfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlNDIvdDQydHlwZXMuaCBiL3NyYy90eXBlNDIvdDQydHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwNmFiNi4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTQyL3Q0MnR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0NDJ0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSA0MiBmb250IGRhdGEgdHlwZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJvYmVydG8gQWxhbWVkYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVDQyVFlQRVNfSF8KLSNkZWZpbmUgVDQyVFlQRVNfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUNDJfRmFjZVJlY18KLSAgewotICAgIEZUX0ZhY2VSZWMgICAgICByb290OwotICAgIFQxX0ZvbnRSZWMgICAgICB0eXBlMTsKLSAgICBjb25zdCB2b2lkKiAgICAgcHNuYW1lczsKLSAgICBjb25zdCB2b2lkKiAgICAgcHNhdXg7Ci0jaWYgMAotICAgIGNvbnN0IHZvaWQqICAgICBhZm1fZGF0YTsKLSNlbmRpZgotICAgIEZUX0J5dGUqICAgICAgICB0dGZfZGF0YTsKLSAgICBGVF9Mb25nICAgICAgICAgdHRmX3NpemU7Ci0gICAgRlRfRmFjZSAgICAgICAgIHR0Zl9mYWNlOwotICAgIEZUX0NoYXJNYXBSZWMgICBjaGFybWFwcmVjc1syXTsKLSAgICBGVF9DaGFyTWFwICAgICAgY2hhcm1hcHNbMl07Ci0gICAgUFNfVW5pY29kZXNSZWMgIHVuaWNvZGVfbWFwOwotCi0gIH0gVDQyX0ZhY2VSZWMsICpUNDJfRmFjZTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBUNDJUWVBFU19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi90eXBlNDIuYyBiL3NyYy90eXBlNDIvdHlwZTQyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOGFjMjYuLjAwMDAwMDAKLS0tIGEvc3JjL3R5cGU0Mi90eXBlNDIuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR5cGU0Mi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBUeXBlIDQyIGRyaXZlciBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgInQ0MmRyaXZyLmMiCi0jaW5jbHVkZSAidDQyb2Jqcy5jIgotI2luY2x1ZGUgInQ0MnBhcnNlLmMiCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvd2luZm9udHMvSmFtZmlsZSBiL3NyYy93aW5mb250cy9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFhN2Y5Li4wMDAwMDAwCi0tLSBhL3NyYy93aW5mb250cy9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy93aW5mb250cyBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTcgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgd2luZm9udHMgOwotCi1MaWJyYXJ5ICAkKEZUMl9MSUIpIDogd2luZm50LmMgOwotCi0jIGVuZCBvZiBzcmMvd2luZm9udHMgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3dpbmZvbnRzL2ZudGVycnMuaCBiL3NyYy93aW5mb250cy9mbnRlcnJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNTEwMjEuLjAwMDAwMDAKLS0tIGEvc3JjL3dpbmZvbnRzL2ZudGVycnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZudGVycnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBXaW4gRk5UL0ZPTiBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgV2luZG93cyBGTlQvRk9OIGVycm9yIGVudW1lcmF0aW9uICAgICAqLwotICAvKiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEZOVEVSUlNfSF8KLSNkZWZpbmUgRk5URVJSU19IXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIEZURVJST1JTX0hfCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBGTlRfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1dpbmZvbnRzCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBGTlRFUlJTX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvd2luZm9udHMvbW9kdWxlLm1rIGIvc3JjL3dpbmZvbnRzL21vZHVsZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjNTNhMS4uMDAwMDAwMAotLS0gYS9zcmMvd2luZm9udHMvbW9kdWxlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFdpbmRvd3MgRk5UL0ZPTiBtb2R1bGUgZGVmaW5pdGlvbgotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotRlRNT0RVTEVfSF9DT01NQU5EUyArPSBXSU5ET1dTX0RSSVZFUgotCi1kZWZpbmUgV0lORE9XU19EUklWRVIKLSQoT1BFTl9EUklWRVIpIEZUX0RyaXZlcl9DbGFzc1JlYywgd2luZm50X2RyaXZlcl9jbGFzcyAkKENMT1NFX0RSSVZFUikKLSQoRUNIT19EUklWRVIpd2luZm50ICAgICQoRUNIT19EUklWRVJfREVTQylXaW5kb3dzIGJpdG1hcCBmb250cyB3aXRoIGV4dGVuc2lvbiAqLmZudCBvciAqLmZvbiQoRUNIT19EUklWRVJfRE9ORSkKLWVuZGVmCi0KLSMgRU9GCmRpZmYgLS1naXQgYS9zcmMvd2luZm9udHMvcnVsZXMubWsgYi9zcmMvd2luZm9udHMvcnVsZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZTgyNWQuLjAwMDAwMDAKLS0tIGEvc3JjL3dpbmZvbnRzL3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIwotIyBGcmVlVHlwZSAyIFdpbmRvd3MgRk5UL0ZPTiBkcml2ZXIgY29uZmlndXJhdGlvbiBydWxlcwotIwotCi0KLSMgQ29weXJpZ2h0IDE5OTYtMjAxNyBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBXaW5kb3dzIGRyaXZlciBkaXJlY3RvcnkKLSMKLUZOVF9ESVIgOj0gJChTUkNfRElSKS93aW5mb250cwotCi0KLUZOVF9DT01QSUxFIDo9ICQoQ0MpICQoQU5TSUZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAkSSQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJChGTlRfRElSKSkgXAotICAgICAgICAgICAgICAgICAgICAgJChJTkNMVURFX0ZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICQoRlRfQ0ZMQUdTKQotCi0KLSMgV2luZG93cyBkcml2ZXIgc291cmNlcyAoaS5lLiwgQyBmaWxlcykKLSMKLUZOVF9EUlZfU1JDIDo9ICQoRk5UX0RJUikvd2luZm50LmMKLQotIyBXaW5kb3dzIGRyaXZlciBoZWFkZXJzCi0jCi1GTlRfRFJWX0ggOj0gJChGTlRfRFJWX1NSQzolLmM9JS5oKSBcCi0gICAgICAgICAgICAgJChGTlRfRElSKS9mbnRlcnJzLmgKLQotCi0jIFdpbmRvd3MgZHJpdmVyIG9iamVjdChzKQotIwotIyAgIEZOVF9EUlZfT0JKX00gaXMgdXNlZCBkdXJpbmcgYG11bHRpJyBidWlsZHMKLSMgICBGTlRfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcwotIwotRk5UX0RSVl9PQkpfTSA6PSAkKEZOVF9EUlZfU1JDOiQoRk5UX0RJUikvJS5jPSQoT0JKX0RJUikvJS4kTykKLUZOVF9EUlZfT0JKX1MgOj0gJChPQkpfRElSKS93aW5mbnQuJE8KLQotIyBXaW5kb3dzIGRyaXZlciBzb3VyY2UgZmlsZSBmb3Igc2luZ2xlIGJ1aWxkCi0jCi1GTlRfRFJWX1NSQ19TIDo9ICQoRk5UX0RJUikvd2luZm50LmMKLQotCi0jIFdpbmRvd3MgZHJpdmVyIC0gc2luZ2xlIG9iamVjdAotIwotJChGTlRfRFJWX09CSl9TKTogJChGTlRfRFJWX1NSQ19TKSAkKEZOVF9EUlZfU1JDKSAkKEZSRUVUWVBFX0gpICQoRk5UX0RSVl9IKQotCSQoRk5UX0NPTVBJTEUpICRUJChzdWJzdCAvLCQoQ09NUElMRVJfU0VQKSwkQCAkKEZOVF9EUlZfU1JDX1MpKQotCi0KLSMgV2luZG93cyBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCi0jCi0kKE9CSl9ESVIpLyUuJE86ICQoRk5UX0RJUikvJS5jICQoRlJFRVRZUEVfSCkgJChGTlRfRFJWX0gpCi0JJChGTlRfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQ8KQotCi0KLSMgdXBkYXRlIG1haW4gZHJpdmVyIG9iamVjdCBsaXN0cwotIwotRFJWX09CSlNfUyArPSAkKEZOVF9EUlZfT0JKX1MpCi1EUlZfT0JKU19NICs9ICQoRk5UX0RSVl9PQkpfTSkKLQotCi0jIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL3dpbmZvbnRzL3dpbmZudC5jIGIvc3JjL3dpbmZvbnRzL3dpbmZudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RiODVhLi4wMDAwMDAwCi0tLSBhL3NyYy93aW5mb250cy93aW5mbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgd2luZm50LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGZvbnQgZHJpdmVyIGZvciBXaW5kb3dzIEZOVC9GT04gZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgSHV3IEQgTSBEYXZpZXMgZm9yIENvZGV3ZWF2ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3IERtaXRyeSBUaW1vc2hrb3YgZm9yIENvZGV3ZWF2ZXJzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfV0lORk9OVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLQotI2luY2x1ZGUgIndpbmZudC5oIgotI2luY2x1ZGUgImZudGVycnMuaCIKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfV0lORk5UX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfRk9OVF9GT1JNQVRfSAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3dpbmZudAotCi0KLSAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICB3aW5tel9oZWFkZXJfZmllbGRzW10gPQotICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFdpbk1aX0hlYWRlclJlYwotCi0gICAgRlRfRlJBTUVfU1RBUlQoIDY0ICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUgKCBtYWdpYyApLAotICAgICAgRlRfRlJBTUVfU0tJUF9CWVRFUyggMjkgKiAyICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSAgKCBsZmFuZXcgKSwKLSAgICBGVF9GUkFNRV9FTkQKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHdpbm5lX2hlYWRlcl9maWVsZHNbXSA9Ci0gIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgV2luTkVfSGVhZGVyUmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggNDAgKSwKLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSAoIG1hZ2ljICksCi0gICAgICBGVF9GUkFNRV9TS0lQX0JZVEVTKCAzNCApLAotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFICggcmVzb3VyY2VfdGFiX29mZnNldCApLAotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFICggcm5hbWVfdGFiX29mZnNldCApLAotICAgIEZUX0ZSQU1FX0VORAotICB9OwotCi0gIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgd2lucGUzMl9oZWFkZXJfZmllbGRzW10gPQotICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFdpblBFMzJfSGVhZGVyUmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggMjQ4ICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSAgKCBtYWdpYyApLCAgIC8qIFBFMDAgKi8KLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSAoIG1hY2hpbmUgKSwgLyogMHgwMTRDIC0gaTM4NiAqLwotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFICggbnVtYmVyX29mX3NlY3Rpb25zICksCi0gICAgICBGVF9GUkFNRV9TS0lQX0JZVEVTKCAxMiApLAotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFICggc2l6ZV9vZl9vcHRpb25hbF9oZWFkZXIgKSwKLSAgICAgIEZUX0ZSQU1FX1NLSVBfQllURVMoIDIgKSwKLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSAoIG1hZ2ljMzIgKSwgLyogMHgxMEIgKi8KLSAgICAgIEZUX0ZSQU1FX1NLSVBfQllURVMoIDExMCApLAotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUgICggcnNyY192aXJ0dWFsX2FkZHJlc3MgKSwKLSAgICAgIEZUX0ZSQU1FX1VMT05HX0xFICAoIHJzcmNfc2l6ZSApLAotICAgICAgRlRfRlJBTUVfU0tJUF9CWVRFUyggMTA0ICksCi0gICAgRlRfRlJBTUVfRU5ECi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICB3aW5wZTMyX3NlY3Rpb25fZmllbGRzW10gPQotICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFdpblBFMzJfU2VjdGlvblJlYwotCi0gICAgRlRfRlJBTUVfU1RBUlQoIDQwICksCi0gICAgICBGVF9GUkFNRV9CWVRFUyAgICAgKCBuYW1lLCA4ICksCi0gICAgICBGVF9GUkFNRV9TS0lQX0JZVEVTKCA0ICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSAgKCB2aXJ0dWFsX2FkZHJlc3MgKSwKLSAgICAgIEZUX0ZSQU1FX1VMT05HX0xFICAoIHNpemVfb2ZfcmF3X2RhdGEgKSwKLSAgICAgIEZUX0ZSQU1FX1VMT05HX0xFICAoIHBvaW50ZXJfdG9fcmF3X2RhdGEgKSwKLSAgICAgIEZUX0ZSQU1FX1NLSVBfQllURVMoIDE2ICksCi0gICAgRlRfRlJBTUVfRU5ECi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICB3aW5wZV9yc3JjX2Rpcl9maWVsZHNbXSA9Ci0gIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgV2luUEVfUnNyY0RpclJlYwotCi0gICAgRlRfRlJBTUVfU1RBUlQoIDE2ICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSAoIGNoYXJhY3RlcmlzdGljcyApLAotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUgKCB0aW1lX2RhdGVfc3RhbXAgKSwKLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSggbWFqb3JfdmVyc2lvbiApLAotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFKCBtaW5vcl92ZXJzaW9uICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIG51bWJlcl9vZl9uYW1lZF9lbnRyaWVzICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIG51bWJlcl9vZl9pZF9lbnRyaWVzICksCi0gICAgRlRfRlJBTUVfRU5ECi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICB3aW5wZV9yc3JjX2Rpcl9lbnRyeV9maWVsZHNbXSA9Ci0gIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgV2luUEVfUnNyY0RpckVudHJ5UmVjCi0KLSAgICBGVF9GUkFNRV9TVEFSVCggOCApLAotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUoIG5hbWUgKSwKLSAgICAgIEZUX0ZSQU1FX1VMT05HX0xFKCBvZmZzZXQgKSwKLSAgICBGVF9GUkFNRV9FTkQKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHdpbnBlX3JzcmNfZGF0YV9lbnRyeV9maWVsZHNbXSA9Ci0gIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgV2luUEVfUnNyY0RhdGFFbnRyeVJlYwotCi0gICAgRlRfRlJBTUVfU1RBUlQoIDE2ICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSggb2Zmc2V0X3RvX2RhdGEgKSwKLSAgICAgIEZUX0ZSQU1FX1VMT05HX0xFKCBzaXplICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSggY29kZV9wYWdlICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSggcmVzZXJ2ZWQgKSwKLSAgICBGVF9GUkFNRV9FTkQKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHdpbmZudF9oZWFkZXJfZmllbGRzW10gPQotICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIEZUX1dpbkZOVF9IZWFkZXJSZWMKLQotICAgIEZUX0ZSQU1FX1NUQVJUKCAxNDggKSwKLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSggdmVyc2lvbiApLAotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUgKCBmaWxlX3NpemUgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEVTICAgICggY29weXJpZ2h0LCA2MCApLAotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFKCBmaWxlX3R5cGUgKSwKLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSggbm9taW5hbF9wb2ludF9zaXplICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIHZlcnRpY2FsX3Jlc29sdXRpb24gKSwKLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSggaG9yaXpvbnRhbF9yZXNvbHV0aW9uICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIGFzY2VudCApLAotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFKCBpbnRlcm5hbF9sZWFkaW5nICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIGV4dGVybmFsX2xlYWRpbmcgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICggaXRhbGljICksCi0gICAgICBGVF9GUkFNRV9CWVRFICAgICAoIHVuZGVybGluZSApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgKCBzdHJpa2Vfb3V0ICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIHdlaWdodCApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgKCBjaGFyc2V0ICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIHBpeGVsX3dpZHRoICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIHBpeGVsX2hlaWdodCApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgKCBwaXRjaF9hbmRfZmFtaWx5ICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIGF2Z193aWR0aCApLAotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFKCBtYXhfd2lkdGggKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICggZmlyc3RfY2hhciApLAotICAgICAgRlRfRlJBTUVfQllURSAgICAgKCBsYXN0X2NoYXIgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUgICAgICggZGVmYXVsdF9jaGFyICksCi0gICAgICBGVF9GUkFNRV9CWVRFICAgICAoIGJyZWFrX2NoYXIgKSwKLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSggYnl0ZXNfcGVyX3JvdyApLAotICAgICAgRlRfRlJBTUVfVUxPTkdfTEUgKCBkZXZpY2Vfb2Zmc2V0ICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSAoIGZhY2VfbmFtZV9vZmZzZXQgKSwKLSAgICAgIEZUX0ZSQU1FX1VMT05HX0xFICggYml0c19wb2ludGVyICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSAoIGJpdHNfb2Zmc2V0ICksCi0gICAgICBGVF9GUkFNRV9CWVRFICAgICAoIHJlc2VydmVkICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSAoIGZsYWdzICksCi0gICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIEFfc3BhY2UgKSwKLSAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSggQl9zcGFjZSApLAotICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFKCBDX3NwYWNlICksCi0gICAgICBGVF9GUkFNRV9VTE9OR19MRSAoIGNvbG9yX3RhYmxlX29mZnNldCApLAotICAgICAgRlRfRlJBTUVfQllURVMgICAgKCByZXNlcnZlZDEsIDE2ICksCi0gICAgRlRfRlJBTUVfRU5ECi0gIH07Ci0KLQotICBzdGF0aWMgdm9pZAotICBmbnRfZm9udF9kb25lKCBGTlRfRmFjZSBmYWNlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRSggZmFjZSApLT5tZW1vcnk7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBGVF9GQUNFKCBmYWNlICktPnN0cmVhbTsKLSAgICBGTlRfRm9udCAgIGZvbnQgICA9IGZhY2UtPmZvbnQ7Ci0KLQotICAgIGlmICggIWZvbnQgKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCBmb250LT5mbnRfZnJhbWUgKQotICAgICAgRlRfRlJBTUVfUkVMRUFTRSggZm9udC0+Zm50X2ZyYW1lICk7Ci0gICAgRlRfRlJFRSggZm9udC0+ZmFtaWx5X25hbWUgKTsKLQotICAgIEZUX0ZSRUUoIGZvbnQgKTsKLSAgICBmYWNlLT5mb250ID0gTlVMTDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZudF9mb250X2xvYWQoIEZOVF9Gb250ICAgZm9udCwKLSAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfV2luRk5UX0hlYWRlciAgaGVhZGVyID0gJmZvbnQtPmhlYWRlcjsKLSAgICBGVF9Cb29sICAgICAgICAgICBuZXdfZm9ybWF0OwotICAgIEZUX1VJbnQgICAgICAgICAgIHNpemU7Ci0KLQotICAgIC8qIGZpcnN0IG9mIGFsbCwgcmVhZCB0aGUgRk5UIGhlYWRlciAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGZvbnQtPm9mZnNldCApICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggd2luZm50X2hlYWRlcl9maWVsZHMsIGhlYWRlciApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNoZWNrIGhlYWRlciAqLwotICAgIGlmICggaGVhZGVyLT52ZXJzaW9uICE9IDB4MjAwICYmCi0gICAgICAgICBoZWFkZXItPnZlcnNpb24gIT0gMHgzMDAgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICIgIG5vdCBhIFdpbmRvd3MgRk5UIGZpbGVcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgbmV3X2Zvcm1hdCA9IEZUX0JPT0woIGZvbnQtPmhlYWRlci52ZXJzaW9uID09IDB4MzAwICk7Ci0gICAgc2l6ZSAgICAgICA9IG5ld19mb3JtYXQgPyAxNDggOiAxMTg7Ci0KLSAgICBpZiAoIGhlYWRlci0+ZmlsZV9zaXplIDwgc2l6ZSApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgV2luZG93cyBGTlQgZmlsZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBWZXJzaW9uIDIgZG9lc24ndCBoYXZlIHRoZXNlIGZpZWxkcyAqLwotICAgIGlmICggaGVhZGVyLT52ZXJzaW9uID09IDB4MjAwICkKLSAgICB7Ci0gICAgICBoZWFkZXItPmZsYWdzICAgPSAwOwotICAgICAgaGVhZGVyLT5BX3NwYWNlID0gMDsKLSAgICAgIGhlYWRlci0+Ql9zcGFjZSA9IDA7Ci0gICAgICBoZWFkZXItPkNfc3BhY2UgPSAwOwotCi0gICAgICBoZWFkZXItPmNvbG9yX3RhYmxlX29mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCBoZWFkZXItPmZpbGVfdHlwZSAmIDEgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJbY2FuJ3QgaGFuZGxlIHZlY3RvciBGTlQgZm9udHNdXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHRoaXMgaXMgYSBGTlQgZmlsZS90YWJsZTsgZXh0cmFjdCBpdHMgZnJhbWUgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBmb250LT5vZmZzZXQgKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfRlJBTUVfRVhUUkFDVCggaGVhZGVyLT5maWxlX3NpemUsIGZvbnQtPmZudF9mcmFtZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZudF9mYWNlX2dldF9kbGxfZm9udCggRk5UX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGZhY2VfaW5zdGFuY2VfaW5kZXggKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gICAgICAgIHN0cmVhbSA9IEZUX0ZBQ0UoIGZhY2UgKS0+c3RyZWFtOwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gRlRfRkFDRSggZmFjZSApLT5tZW1vcnk7Ci0gICAgV2luTVpfSGVhZGVyUmVjICBtel9oZWFkZXI7Ci0gICAgRlRfTG9uZyAgICAgICAgICBmYWNlX2luZGV4OwotCi0KLSAgICBmYWNlLT5mb250ID0gTlVMTDsKLQotICAgIGZhY2VfaW5kZXggPSBGVF9BQlMoIGZhY2VfaW5zdGFuY2VfaW5kZXggKSAmIDB4RkZGRjsKLQotICAgIC8qIGRvZXMgaXQgYmVnaW4gd2l0aCBhbiBNWiBoZWFkZXI/ICovCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfU1RSRUFNX1JFQURfRklFTERTKCB3aW5tel9oZWFkZXJfZmllbGRzLCAmbXpfaGVhZGVyICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBGVF9FUlIoIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICBpZiAoIG16X2hlYWRlci5tYWdpYyA9PSBXSU5GTlRfTVpfTUFHSUMgKQotICAgIHsKLSAgICAgIC8qIHllcywgbm93IGxvb2sgZm9yIGFuIE5FIGhlYWRlciBpbiB0aGUgZmlsZSAqLwotICAgICAgV2luTkVfSGVhZGVyUmVjICBuZV9oZWFkZXI7Ci0KLQotICAgICAgRlRfVFJBQ0UyKCggIk1aIHNpZ25hdHVyZSBmb3VuZFxuIiApKTsKLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggbXpfaGVhZGVyLmxmYW5ldyApICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHdpbm5lX2hlYWRlcl9maWVsZHMsICZuZV9oZWFkZXIgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZXJyb3IgPSBGVF9FUlIoIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGlmICggbmVfaGVhZGVyLm1hZ2ljID09IFdJTkZOVF9ORV9NQUdJQyApCi0gICAgICB7Ci0gICAgICAgIC8qIGdvb2QsIG5vdyBsb29rIGludG8gdGhlIHJlc291cmNlIHRhYmxlIGZvciBlYWNoIEZOVCByZXNvdXJjZSAqLwotICAgICAgICBGVF9VTG9uZyAgIHJlc19vZmZzZXQgID0gbXpfaGVhZGVyLmxmYW5ldyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lX2hlYWRlci5yZXNvdXJjZV90YWJfb2Zmc2V0OwotICAgICAgICBGVF9VU2hvcnQgIHNpemVfc2hpZnQ7Ci0gICAgICAgIEZUX1VTaG9ydCAgZm9udF9jb3VudCAgPSAwOwotICAgICAgICBGVF9VTG9uZyAgIGZvbnRfb2Zmc2V0ID0gMDsKLQotCi0gICAgICAgIEZUX1RSQUNFMigoICJORSBzaWduYXR1cmUgZm91bmRcbiIgKSk7Ci0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggcmVzX29mZnNldCApICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBuZV9oZWFkZXIucm5hbWVfdGFiX29mZnNldCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lX2hlYWRlci5yZXNvdXJjZV90YWJfb2Zmc2V0ICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBzaXplX3NoaWZ0ID0gRlRfR0VUX1VTSE9SVF9MRSgpOwotCi0gICAgICAgIC8qIE1pY3Jvc29mdCdzIHNwZWNpZmljYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUtZmlsZSBoZWFkZXIgZm9ybWF0ICovCi0gICAgICAgIC8qIGZvciBgTmV3IEV4ZWN1dGFibGUnIChORSkgZG9lc24ndCBnaXZlIGEgbGltaXQgZm9yIHRoZSAgICAgICAgICovCi0gICAgICAgIC8qIGFsaWdubWVudCBzaGlmdCBjb3VudDsgaG93ZXZlciwgaW4gMTk4NSwgdGhlIHllYXIgb2YgdGhlICAgICAgICovCi0gICAgICAgIC8qIHNwZWNpZmljYXRpb24gcmVsZWFzZSwgb25seSAzMmJpdCB2YWx1ZXMgd2VyZSBzdXBwb3J0ZWQsIHRodXMgICovCi0gICAgICAgIC8qIGFueXRoaW5nIGxhcmdlciB0aGFuIDE2IGRvZXNuJ3QgbWFrZSBzZW5zZSBpbiBnZW5lcmFsLCBnaXZlbiAgICovCi0gICAgICAgIC8qIHRoYXQgZmlsZSBvZmZzZXRzIGFyZSAxNmJpdCB2YWx1ZXMsIHNoaWZ0ZWQgYnkgdGhlIGFsaWdubWVudCAgICovCi0gICAgICAgIC8qIHNoaWZ0IGNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggc2l6ZV9zaGlmdCA+IDE2ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJpbnZhbGlkIGFsaWdubWVudCBzaGlmdCBjb3VudCBmb3IgcmVzb3VyY2UgZGF0YVxuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLQotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVVNob3J0ICB0eXBlX2lkLCBjb3VudDsKLQotCi0gICAgICAgICAgdHlwZV9pZCA9IEZUX0dFVF9VU0hPUlRfTEUoKTsKLSAgICAgICAgICBpZiAoICF0eXBlX2lkICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY291bnQgPSBGVF9HRVRfVVNIT1JUX0xFKCk7Ci0KLSAgICAgICAgICBpZiAoIHR5cGVfaWQgPT0gMHg4MDA4VSApCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9udF9jb3VudCAgPSBjb3VudDsKLSAgICAgICAgICAgIGZvbnRfb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpICsgNCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoIHN0cmVhbS0+Y3Vyc29yIC0gc3RyZWFtLT5saW1pdCApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3RyZWFtLT5jdXJzb3IgKz0gNCArIGNvdW50ICogMTI7Ci0gICAgICAgIH0KLQotICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAgICAgaWYgKCAhZm9udF9jb3VudCB8fCAhZm9udF9vZmZzZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UyKCggInRoaXMgZmlsZSBkb2Vzbid0IGNvbnRhaW4gYW55IEZOVCByZXNvdXJjZXNcbiIgKSk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGxvYWRpbmcgYHdpbmZudF9oZWFkZXJfZmllbGRzJyBuZWVkcyBhdCBsZWFzdCAxMTggYnl0ZXM7ICAgICovCi0gICAgICAgIC8qIHVzZSB0aGlzIGFzIGEgcm91Z2ggbWVhc3VyZSB0byBjaGVjayB0aGUgZXhwZWN0ZWQgZm9udCBzaXplICovCi0gICAgICAgIGlmICggZm9udF9jb3VudCAqIDExOFVMID4gc3RyZWFtLT5zaXplICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJpbnZhbGlkIG51bWJlciBvZiBmYWNlc1xuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgZmFjZS0+cm9vdC5udW1fZmFjZXMgPSBmb250X2NvdW50OwotCi0gICAgICAgIGlmICggZmFjZV9pbnN0YW5jZV9pbmRleCA8IDAgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIGZhY2VfaW5kZXggPj0gZm9udF9jb3VudCApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBGVF9ORVcoIGZhY2UtPmZvbnQgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGZvbnRfb2Zmc2V0ICsgKEZUX1VMb25nKWZhY2VfaW5kZXggKiAxMiApIHx8Ci0gICAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIDEyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZmFjZS0+Zm9udC0+b2Zmc2V0ICAgPSAoRlRfVUxvbmcpRlRfR0VUX1VTSE9SVF9MRSgpIDw8IHNpemVfc2hpZnQ7Ci0gICAgICAgIGZhY2UtPmZvbnQtPmZudF9zaXplID0gKEZUX1VMb25nKUZUX0dFVF9VU0hPUlRfTEUoKSA8PCBzaXplX3NoaWZ0OwotCi0gICAgICAgIHN0cmVhbS0+Y3Vyc29yICs9IDg7Ci0KLSAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgICAgIGVycm9yID0gZm50X2ZvbnRfbG9hZCggZmFjZS0+Zm9udCwgc3RyZWFtICk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggbmVfaGVhZGVyLm1hZ2ljID09IFdJTkZOVF9QRV9NQUdJQyApCi0gICAgICB7Ci0gICAgICAgIFdpblBFMzJfSGVhZGVyUmVjICAgICAgIHBlMzJfaGVhZGVyOwotICAgICAgICBXaW5QRTMyX1NlY3Rpb25SZWMgICAgICBwZTMyX3NlY3Rpb247Ci0gICAgICAgIFdpblBFX1JzcmNEaXJSZWMgICAgICAgIHJvb3RfZGlyLCBuYW1lX2RpciwgbGFuZ19kaXI7Ci0gICAgICAgIFdpblBFX1JzcmNEaXJFbnRyeVJlYyAgIGRpcl9lbnRyeTEsIGRpcl9lbnRyeTIsIGRpcl9lbnRyeTM7Ci0gICAgICAgIFdpblBFX1JzcmNEYXRhRW50cnlSZWMgIGRhdGFfZW50cnk7Ci0KLSAgICAgICAgRlRfVUxvbmcgICByb290X2Rpcl9vZmZzZXQsIG5hbWVfZGlyX29mZnNldCwgbGFuZ19kaXJfb2Zmc2V0OwotICAgICAgICBGVF9VU2hvcnQgIGksIGosIGs7Ci0KLQotICAgICAgICBGVF9UUkFDRTIoKCAiUEUgc2lnbmF0dXJlIGZvdW5kXG4iICkpOwotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG16X2hlYWRlci5sZmFuZXcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1JFQURfRklFTERTKCB3aW5wZTMyX2hlYWRlcl9maWVsZHMsICZwZTMyX2hlYWRlciApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgRlRfVFJBQ0UyKCggIm1hZ2ljICUwNGx4LCBtYWNoaW5lICUwMngsIG51bWJlcl9vZl9zZWN0aW9ucyAldSwgIgotICAgICAgICAgICAgICAgICAgICAic2l6ZV9vZl9vcHRpb25hbF9oZWFkZXIgJTAyeFxuIgotICAgICAgICAgICAgICAgICAgICAibWFnaWMzMiAlMDJ4LCByc3JjX3ZpcnR1YWxfYWRkcmVzcyAlMDRseCwgIgotICAgICAgICAgICAgICAgICAgICAicnNyY19zaXplICUwNGx4XG4iLAotICAgICAgICAgICAgICAgICAgICBwZTMyX2hlYWRlci5tYWdpYywgcGUzMl9oZWFkZXIubWFjaGluZSwKLSAgICAgICAgICAgICAgICAgICAgcGUzMl9oZWFkZXIubnVtYmVyX29mX3NlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBwZTMyX2hlYWRlci5zaXplX29mX29wdGlvbmFsX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgcGUzMl9oZWFkZXIubWFnaWMzMiwgcGUzMl9oZWFkZXIucnNyY192aXJ0dWFsX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBlMzJfaGVhZGVyLnJzcmNfc2l6ZSApKTsKLQotICAgICAgICBpZiAoIHBlMzJfaGVhZGVyLm1hZ2ljICE9IFdJTkZOVF9QRV9NQUdJQyAvKiBjaGVjayBmdWxsIHNpZ25hdHVyZSAqLyB8fAotICAgICAgICAgICAgIHBlMzJfaGVhZGVyLm1hY2hpbmUgIT0gMHgwMTRDIC8qIGkzODYgKi8gICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIHBlMzJfaGVhZGVyLnNpemVfb2Zfb3B0aW9uYWxfaGVhZGVyICE9IDB4RTAgLyogRklYTUUgKi8gICAgICAgICB8fAotICAgICAgICAgICAgIHBlMzJfaGVhZGVyLm1hZ2ljMzIgIT0gMHgxMEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTIoKCAidGhpcyBmaWxlIGhhcyBhbiBpbnZhbGlkIFBFIGhlYWRlclxuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgZmFjZS0+cm9vdC5udW1fZmFjZXMgPSAwOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcGUzMl9oZWFkZXIubnVtYmVyX29mX3NlY3Rpb25zOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHdpbnBlMzJfc2VjdGlvbl9maWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZTMyX3NlY3Rpb24gKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBGVF9UUkFDRTIoKCAibmFtZSAlLjhzLCB2YSAlMDRseCwgc2l6ZSAlMDRseCwgb2Zmc2V0ICUwNGx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgIHBlMzJfc2VjdGlvbi5uYW1lLCBwZTMyX3NlY3Rpb24udmlydHVhbF9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgIHBlMzJfc2VjdGlvbi5zaXplX29mX3Jhd19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgIHBlMzJfc2VjdGlvbi5wb2ludGVyX3RvX3Jhd19kYXRhICkpOwotCi0gICAgICAgICAgaWYgKCBwZTMyX2hlYWRlci5yc3JjX3ZpcnR1YWxfYWRkcmVzcyA9PQotICAgICAgICAgICAgICAgICBwZTMyX3NlY3Rpb24udmlydHVhbF9hZGRyZXNzICkKLSAgICAgICAgICAgIGdvdG8gRm91bmRfcnNyY19zZWN0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgRlRfVFJBQ0UyKCggInRoaXMgZmlsZSBkb2Vzbid0IGNvbnRhaW4gYW55IHJlc291cmNlc1xuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZvdW5kX3JzcmNfc2VjdGlvbjoKLSAgICAgICAgRlRfVFJBQ0UyKCggImZvdW5kIHJlc291cmNlcyBzZWN0aW9uICUuOHNcbiIsIHBlMzJfc2VjdGlvbi5uYW1lICkpOwotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHBlMzJfc2VjdGlvbi5wb2ludGVyX3RvX3Jhd19kYXRhICkgICAgICAgIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1JFQURfRklFTERTKCB3aW5wZV9yc3JjX2Rpcl9maWVsZHMsICZyb290X2RpciApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgcm9vdF9kaXJfb2Zmc2V0ID0gcGUzMl9zZWN0aW9uLnBvaW50ZXJfdG9fcmF3X2RhdGE7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCByb290X2Rpci5udW1iZXJfb2ZfbmFtZWRfZW50cmllcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByb290X2Rpci5udW1iZXJfb2ZfaWRfZW50cmllczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHJvb3RfZGlyX29mZnNldCArIDE2ICsgaSAqIDggKSAgICAgIHx8Ci0gICAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHdpbnBlX3JzcmNfZGlyX2VudHJ5X2ZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcl9lbnRyeTEgKSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBpZiAoICEoZGlyX2VudHJ5MS5vZmZzZXQgJiAweDgwMDAwMDAwVUwgKSAvKiBEYXRhSXNEaXJlY3RvcnkgKi8gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkaXJfZW50cnkxLm9mZnNldCAmPSB+MHg4MDAwMDAwMFVMOwotCi0gICAgICAgICAgbmFtZV9kaXJfb2Zmc2V0ID0gcGUzMl9zZWN0aW9uLnBvaW50ZXJfdG9fcmF3X2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9lbnRyeTEub2Zmc2V0OwotCi0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggcGUzMl9zZWN0aW9uLnBvaW50ZXJfdG9fcmF3X2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9lbnRyeTEub2Zmc2V0ICkgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHdpbnBlX3JzcmNfZGlyX2ZpZWxkcywgJm5hbWVfZGlyICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgZm9yICggaiA9IDA7IGogPCBuYW1lX2Rpci5udW1iZXJfb2ZfbmFtZWRfZW50cmllcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfZGlyLm51bWJlcl9vZl9pZF9lbnRyaWVzOyBqKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG5hbWVfZGlyX29mZnNldCArIDE2ICsgaiAqIDggKSAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggd2lucGVfcnNyY19kaXJfZW50cnlfZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJfZW50cnkyICkgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIGlmICggIShkaXJfZW50cnkyLm9mZnNldCAmIDB4ODAwMDAwMDBVTCApIC8qIERhdGFJc0RpcmVjdG9yeSAqLyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkaXJfZW50cnkyLm9mZnNldCAmPSB+MHg4MDAwMDAwMFVMOwotCi0gICAgICAgICAgICBsYW5nX2Rpcl9vZmZzZXQgPSBwZTMyX3NlY3Rpb24ucG9pbnRlcl90b19yYXdfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9lbnRyeTIub2Zmc2V0OwotCi0gICAgICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBwZTMyX3NlY3Rpb24ucG9pbnRlcl90b19yYXdfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9lbnRyeTIub2Zmc2V0ICkgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHdpbnBlX3JzcmNfZGlyX2ZpZWxkcywgJmxhbmdfZGlyICkgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIGZvciAoIGsgPSAwOyBrIDwgbGFuZ19kaXIubnVtYmVyX29mX25hbWVkX2VudHJpZXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdfZGlyLm51bWJlcl9vZl9pZF9lbnRyaWVzOyBrKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBsYW5nX2Rpcl9vZmZzZXQgKyAxNiArIGsgKiA4ICkgICAgICB8fAotICAgICAgICAgICAgICAgICAgIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggd2lucGVfcnNyY19kaXJfZW50cnlfZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcl9lbnRyeTMgKSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAgIGlmICggZGlyX2VudHJ5Mi5vZmZzZXQgJiAweDgwMDAwMDAwVUwgLyogRGF0YUlzRGlyZWN0b3J5ICovICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAoIGRpcl9lbnRyeTEubmFtZSA9PSA4IC8qIFJUX0ZPTlQgKi8gKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggcm9vdF9kaXJfb2Zmc2V0ICsgZGlyX2VudHJ5My5vZmZzZXQgKSB8fAotICAgICAgICAgICAgICAgICAgICAgRlRfU1RSRUFNX1JFQURfRklFTERTKCB3aW5wZV9yc3JjX2RhdGFfZW50cnlfZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YV9lbnRyeSApICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAgICAgRlRfVFJBQ0UyKCggImZvdW5kIGZvbnQgIyVsdSwgb2Zmc2V0ICUwNGx4LCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgJTA0bHgsIGNwICVsdVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJfZW50cnkyLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGUzMl9zZWN0aW9uLnBvaW50ZXJfdG9fcmF3X2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9lbnRyeS5vZmZzZXRfdG9fZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZTMyX3NlY3Rpb24udmlydHVhbF9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZW50cnkuc2l6ZSwgZGF0YV9lbnRyeS5jb2RlX3BhZ2UgKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGZhY2VfaW5kZXggPT0gZmFjZS0+cm9vdC5udW1fZmFjZXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggRlRfTkVXKCBmYWNlLT5mb250ICkgKQotICAgICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgICAgICAgIGZhY2UtPmZvbnQtPm9mZnNldCAgID0gcGUzMl9zZWN0aW9uLnBvaW50ZXJfdG9fcmF3X2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZW50cnkub2Zmc2V0X3RvX2RhdGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlMzJfc2VjdGlvbi52aXJ0dWFsX2FkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICBmYWNlLT5mb250LT5mbnRfc2l6ZSA9IGRhdGFfZW50cnkuc2l6ZTsKLQotICAgICAgICAgICAgICAgICAgZXJyb3IgPSBmbnRfZm9udF9sb2FkKCBmYWNlLT5mb250LCBzdHJlYW0gKTsKLSAgICAgICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTIoKCAiZm9udCAjJWx1IGxvYWQgZXJyb3IgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyX2VudHJ5Mi5uYW1lLCBlcnJvciApKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTIoKCAiZm9udCAjJWx1IHN1Y2Nlc3NmdWxseSBsb2FkZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9lbnRyeTIubmFtZSApKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmYWNlLT5yb290Lm51bV9mYWNlcysrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWZhY2UtPnJvb3QubnVtX2ZhY2VzICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggInRoaXMgZmlsZSBkb2Vzbid0IGNvbnRhaW4gYW55IFJUX0ZPTlQgcmVzb3VyY2VzXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBmYWNlX2luZGV4ID49IGZhY2UtPnJvb3QubnVtX2ZhY2VzICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBmbnRfZm9udF9kb25lKCBmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGTlRfQ01hcFJlY18KLSAgewotICAgIEZUX0NNYXBSZWMgIGNtYXA7Ci0gICAgRlRfVUludDMyICAgZmlyc3Q7Ci0gICAgRlRfVUludDMyICAgY291bnQ7Ci0KLSAgfSBGTlRfQ01hcFJlYywgKkZOVF9DTWFwOwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZudF9jbWFwX2luaXQoIEZOVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIHBvaW50ZXIgKQotICB7Ci0gICAgRk5UX0ZhY2UgIGZhY2UgPSAoRk5UX0ZhY2UpRlRfQ01BUF9GQUNFKCBjbWFwICk7Ci0gICAgRk5UX0ZvbnQgIGZvbnQgPSBmYWNlLT5mb250OwotCi0gICAgRlRfVU5VU0VEKCBwb2ludGVyICk7Ci0KLQotICAgIGNtYXAtPmZpcnN0ID0gKEZUX1VJbnQzMikgIGZvbnQtPmhlYWRlci5maXJzdF9jaGFyOwotICAgIGNtYXAtPmNvdW50ID0gKEZUX1VJbnQzMikoIGZvbnQtPmhlYWRlci5sYXN0X2NoYXIgLSBjbWFwLT5maXJzdCArIDEgKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICBmbnRfY21hcF9jaGFyX2luZGV4KCBGTlRfQ01hcCAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VJbnQgIGdpbmRleCA9IDA7Ci0KLQotICAgIGNoYXJfY29kZSAtPSBjbWFwLT5maXJzdDsKLSAgICBpZiAoIGNoYXJfY29kZSA8IGNtYXAtPmNvdW50ICkKLSAgICAgIC8qIHdlIGFydGlmaWNpYWxseSBpbmNyZWFzZSB0aGUgZ2x5cGggaW5kZXg7ICovCi0gICAgICAvKiBGTlRfTG9hZF9HbHlwaCByZXZlcnRzIHRvIHRoZSByaWdodCBvbmUgICAqLwotICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBjaGFyX2NvZGUgKyAxICk7Ci0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQzMgotICBmbnRfY21hcF9jaGFyX25leHQoIEZOVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIGdpbmRleCA9IDA7Ci0gICAgRlRfVUludDMyICByZXN1bHQgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGUgKyAxOwotCi0KLSAgICBpZiAoIGNoYXJfY29kZSA8PSBjbWFwLT5maXJzdCApCi0gICAgewotICAgICAgcmVzdWx0ID0gY21hcC0+Zmlyc3Q7Ci0gICAgICBnaW5kZXggPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY2hhcl9jb2RlIC09IGNtYXAtPmZpcnN0OwotICAgICAgaWYgKCBjaGFyX2NvZGUgPCBjbWFwLT5jb3VudCApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGNtYXAtPmZpcnN0ICsgY2hhcl9jb2RlOwotICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIGNoYXJfY29kZSArIDEgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAqcGNoYXJfY29kZSA9IHJlc3VsdDsKLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfQ01hcF9DbGFzc1JlYyAgZm50X2NtYXBfY2xhc3NfcmVjID0KLSAgewotICAgIHNpemVvZiAoIEZOVF9DTWFwUmVjICksCi0KLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIGZudF9jbWFwX2luaXQsCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBOVUxMLAotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpZm50X2NtYXBfY2hhcl9pbmRleCwKLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIGZudF9jbWFwX2NoYXJfbmV4dCwKLQotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKLSAgfTsKLQotICBzdGF0aWMgRlRfQ01hcF9DbGFzcyBjb25zdCAgZm50X2NtYXBfY2xhc3MgPSAmZm50X2NtYXBfY2xhc3NfcmVjOwotCi0KLSAgc3RhdGljIHZvaWQKLSAgRk5UX0ZhY2VfRG9uZSggRlRfRmFjZSAgZm50ZmFjZSApICAgICAgIC8qIEZOVF9GYWNlICovCi0gIHsKLSAgICBGTlRfRmFjZSAgIGZhY2UgPSAoRk5UX0ZhY2UpZm50ZmFjZTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0gICAgZm50X2ZvbnRfZG9uZSggZmFjZSApOwotCi0gICAgRlRfRlJFRSggZm50ZmFjZS0+YXZhaWxhYmxlX3NpemVzICk7Ci0gICAgZm50ZmFjZS0+bnVtX2ZpeGVkX3NpemVzID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEZOVF9GYWNlX0luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZm50ZmFjZSwgICAgICAgIC8qIEZOVF9GYWNlICovCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5zdGFuY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCi0gIHsKLSAgICBGTlRfRmFjZSAgIGZhY2UgICA9IChGTlRfRmFjZSlmbnRmYWNlOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotICAgIEZUX0ludCAgICAgZmFjZV9pbmRleDsKLQotICAgIEZUX1VOVVNFRCggbnVtX3BhcmFtcyApOwotICAgIEZUX1VOVVNFRCggcGFyYW1zICk7Ci0KLQotICAgIEZUX1RSQUNFMigoICJXaW5kb3dzIEZOVCBkcml2ZXJcbiIgKSk7Ci0KLSAgICBmYWNlX2luZGV4ID0gRlRfQUJTKCBmYWNlX2luc3RhbmNlX2luZGV4ICkgJiAweEZGRkY7Ci0KLSAgICAvKiB0cnkgdG8gbG9hZCBmb250IGZyb20gYSBETEwgKi8KLSAgICBlcnJvciA9IGZudF9mYWNlX2dldF9kbGxfZm9udCggZmFjZSwgZmFjZV9pbnN0YW5jZV9pbmRleCApOwotICAgIGlmICggIWVycm9yICYmIGZhY2VfaW5zdGFuY2VfaW5kZXggPCAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfRVJSX0VRKCBlcnJvciwgVW5rbm93bl9GaWxlX0Zvcm1hdCApICkKLSAgICB7Ci0gICAgICAvKiB0aGlzIGRpZG4ndCB3b3JrOyB0cnkgdG8gbG9hZCBhIHNpbmdsZSBGTlQgZm9udCAqLwotICAgICAgRk5UX0ZvbnQgIGZvbnQ7Ci0KLSAgICAgIGlmICggRlRfTkVXKCBmYWNlLT5mb250ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZudGZhY2UtPm51bV9mYWNlcyA9IDE7Ci0KLSAgICAgIGZvbnQgICAgICAgICAgID0gZmFjZS0+Zm9udDsKLSAgICAgIGZvbnQtPm9mZnNldCAgID0gMDsKLSAgICAgIGZvbnQtPmZudF9zaXplID0gc3RyZWFtLT5zaXplOwotCi0gICAgICBlcnJvciA9IGZudF9mb250X2xvYWQoIGZvbnQsIHN0cmVhbSApOwotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGlmICggZmFjZV9pbnN0YW5jZV9pbmRleCA8IDAgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIGZhY2VfaW5kZXggPiAwICkKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICBpZiAoICFmYWNlLT5mb250LT5oZWFkZXIucGl4ZWxfaGVpZ2h0ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiaW52YWxpZCBwaXhlbCBoZWlnaHRcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogd2Ugbm93IG5lZWQgdG8gZmlsbCB0aGUgcm9vdCBGVF9GYWNlIGZpZWxkcyAqLwotICAgIC8qIHdpdGggcmVsZXZhbnQgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBGVF9GYWNlICAgcm9vdCA9IEZUX0ZBQ0UoIGZhY2UgKTsKLSAgICAgIEZOVF9Gb250ICBmb250ID0gZmFjZS0+Zm9udDsKLSAgICAgIEZUX1VMb25nICBmYW1pbHlfc2l6ZTsKLQotCi0gICAgICByb290LT5mYWNlX2luZGV4ID0gZmFjZV9pbmRleDsKLQotICAgICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTDsKLQotICAgICAgaWYgKCBmb250LT5oZWFkZXIuYXZnX3dpZHRoID09IGZvbnQtPmhlYWRlci5tYXhfd2lkdGggKQotICAgICAgICByb290LT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSDsKLQotICAgICAgaWYgKCBmb250LT5oZWFkZXIuaXRhbGljICkKLSAgICAgICAgcm9vdC0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0KLSAgICAgIGlmICggZm9udC0+aGVhZGVyLndlaWdodCA+PSA4MDAgKQotICAgICAgICByb290LT5zdHlsZV9mbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7Ci0KLSAgICAgIC8qIHNldCB1cCB0aGUgYGZpeGVkX3NpemVzJyBhcnJheSAqLwotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHJvb3QtPmF2YWlsYWJsZV9zaXplcywgMSApICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICByb290LT5udW1fZml4ZWRfc2l6ZXMgPSAxOwotCi0gICAgICB7Ci0gICAgICAgIEZUX0JpdG1hcF9TaXplKiAgYnNpemUgPSByb290LT5hdmFpbGFibGVfc2l6ZXM7Ci0gICAgICAgIEZUX1VTaG9ydCAgICAgICAgeF9yZXMsIHlfcmVzOwotCi0KLSAgICAgICAgYnNpemUtPndpZHRoICA9IChGVF9TaG9ydClmb250LT5oZWFkZXIuYXZnX3dpZHRoOwotICAgICAgICBic2l6ZS0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggZm9udC0+aGVhZGVyLnBpeGVsX2hlaWdodCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5oZWFkZXIuZXh0ZXJuYWxfbGVhZGluZyApOwotICAgICAgICBic2l6ZS0+c2l6ZSAgID0gZm9udC0+aGVhZGVyLm5vbWluYWxfcG9pbnRfc2l6ZSA8PCA2OwotCi0gICAgICAgIHhfcmVzID0gZm9udC0+aGVhZGVyLmhvcml6b250YWxfcmVzb2x1dGlvbjsKLSAgICAgICAgaWYgKCAheF9yZXMgKQotICAgICAgICAgIHhfcmVzID0gNzI7Ci0KLSAgICAgICAgeV9yZXMgPSBmb250LT5oZWFkZXIudmVydGljYWxfcmVzb2x1dGlvbjsKLSAgICAgICAgaWYgKCAheV9yZXMgKQotICAgICAgICAgIHlfcmVzID0gNzI7Ci0KLSAgICAgICAgYnNpemUtPnlfcHBlbSA9IEZUX011bERpdiggYnNpemUtPnNpemUsIHlfcmVzLCA3MiApOwotICAgICAgICBic2l6ZS0+eV9wcGVtID0gRlRfUElYX1JPVU5EKCBic2l6ZS0+eV9wcGVtICk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogdGhpcyByZWFkczoKLSAgICAgICAgICoKLSAgICAgICAgICogdGhlIG5vbWluYWwgaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSBiYm94J3MgaGVpZ2h0Ci0gICAgICAgICAqCi0gICAgICAgICAqID0+IG5vbWluYWxfcG9pbnRfc2l6ZSBjb250YWlucyBpbmNvcnJlY3QgdmFsdWU7Ci0gICAgICAgICAqICAgIHVzZSBwaXhlbF9oZWlnaHQgYXMgdGhlIG5vbWluYWwgaGVpZ2h0Ci0gICAgICAgICAqLwotICAgICAgICBpZiAoIGJzaXplLT55X3BwZW0gPiAoIGZvbnQtPmhlYWRlci5waXhlbF9oZWlnaHQgPDwgNiApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJ1c2UgcGl4ZWxfaGVpZ2h0IGFzIHRoZSBub21pbmFsIGhlaWdodFxuIiApKTsKLQotICAgICAgICAgIGJzaXplLT55X3BwZW0gPSBmb250LT5oZWFkZXIucGl4ZWxfaGVpZ2h0IDw8IDY7Ci0gICAgICAgICAgYnNpemUtPnNpemUgICA9IEZUX011bERpdiggYnNpemUtPnlfcHBlbSwgNzIsIHlfcmVzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBic2l6ZS0+eF9wcGVtID0gRlRfTXVsRGl2KCBic2l6ZS0+c2l6ZSwgeF9yZXMsIDcyICk7Ci0gICAgICAgIGJzaXplLT54X3BwZW0gPSBGVF9QSVhfUk9VTkQoIGJzaXplLT54X3BwZW0gKTsKLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBGVF9DaGFyTWFwUmVjICBjaGFybWFwOwotCi0KLSAgICAgICAgY2hhcm1hcC5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX05PTkU7Ci0gICAgICAgIC8qIGluaXRpYWwgcGxhdGZvcm0vZW5jb2Rpbmcgc2hvdWxkIGluZGljYXRlIHVuc2V0IHN0YXR1cz8gKi8KLSAgICAgICAgY2hhcm1hcC5wbGF0Zm9ybV9pZCA9IFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREU7Ci0gICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9BUFBMRV9JRF9ERUZBVUxUOwotICAgICAgICBjaGFybWFwLmZhY2UgICAgICAgID0gcm9vdDsKLQotICAgICAgICBpZiAoIGZvbnQtPmhlYWRlci5jaGFyc2V0ID09IEZUX1dpbkZOVF9JRF9NQUMgKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOOwotICAgICAgICAgIGNoYXJtYXAucGxhdGZvcm1faWQgPSBUVF9QTEFURk9STV9NQUNJTlRPU0g7Ci0vKiAgICAgICAgY2hhcm1hcC5lbmNvZGluZ19pZCA9IFRUX01BQ19JRF9ST01BTjsgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVycm9yID0gRlRfQ01hcF9OZXcoIGZudF9jbWFwX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHNldCB1cCByZW1haW5pbmcgZmxhZ3MgKi8KLQotICAgICAgaWYgKCBmb250LT5oZWFkZXIubGFzdF9jaGFyIDwgZm9udC0+aGVhZGVyLmZpcnN0X2NoYXIgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiaW52YWxpZCBudW1iZXIgb2YgZ2x5cGhzXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgLyogcmVzZXJ2ZSBvbmUgc2xvdCBmb3IgdGhlIC5ub3RkZWYgZ2x5cGggYXQgaW5kZXggMCAqLwotICAgICAgcm9vdC0+bnVtX2dseXBocyA9IGZvbnQtPmhlYWRlci5sYXN0X2NoYXIgLQotICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmhlYWRlci5maXJzdF9jaGFyICsgMSArIDE7Ci0KLSAgICAgIGlmICggZm9udC0+aGVhZGVyLmZhY2VfbmFtZV9vZmZzZXQgPj0gZm9udC0+aGVhZGVyLmZpbGVfc2l6ZSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJpbnZhbGlkIGZhbWlseSBuYW1lIG9mZnNldFxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBmYW1pbHlfc2l6ZSA9IGZvbnQtPmhlYWRlci5maWxlX3NpemUgLSBmb250LT5oZWFkZXIuZmFjZV9uYW1lX29mZnNldDsKLSAgICAgIC8qIFNvbWUgYnJva2VuIGZvbnRzIGRvbid0IGRlbGltaXQgdGhlIGZhY2UgbmFtZSB3aXRoIGEgZmluYWwgKi8KLSAgICAgIC8qIE5VTEwgYnl0ZSAtLSB0aGUgZnJhbWUgaXMgZXJyb25lb3VzbHkgb25lIGJ5dGUgdG9vIHNtYWxsLiAgKi8KLSAgICAgIC8qIFdlIHRodXMgYWxsb2NhdGUgb25lIG1vcmUgYnl0ZSwgc2V0dGluZyBpdCBleHBsaWNpdGx5IHRvICAgKi8KLSAgICAgIC8qIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggRlRfQUxMT0MoIGZvbnQtPmZhbWlseV9uYW1lLCBmYW1pbHlfc2l6ZSArIDEgKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgRlRfTUVNX0NPUFkoIGZvbnQtPmZhbWlseV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGZvbnQtPmZudF9mcmFtZSArIGZvbnQtPmhlYWRlci5mYWNlX25hbWVfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGZhbWlseV9zaXplICk7Ci0KLSAgICAgIGZvbnQtPmZhbWlseV9uYW1lW2ZhbWlseV9zaXplXSA9ICdcMCc7Ci0KLSAgICAgIGlmICggRlRfUkVBTExPQyggZm9udC0+ZmFtaWx5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZhbWlseV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBmdF9zdHJsZW4oIGZvbnQtPmZhbWlseV9uYW1lICkgKyAxICkgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIHJvb3QtPmZhbWlseV9uYW1lID0gZm9udC0+ZmFtaWx5X25hbWU7Ci0gICAgICByb290LT5zdHlsZV9uYW1lICA9IChjaGFyICopIlJlZ3VsYXIiOwotCi0gICAgICBpZiAoIHJvb3QtPnN0eWxlX2ZsYWdzICYgRlRfU1RZTEVfRkxBR19CT0xEICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCByb290LT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfSVRBTElDICkKLSAgICAgICAgICByb290LT5zdHlsZV9uYW1lID0gKGNoYXIgKikiQm9sZCBJdGFsaWMiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcm9vdC0+c3R5bGVfbmFtZSA9IChjaGFyICopIkJvbGQiOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHJvb3QtPnN0eWxlX2ZsYWdzICYgRlRfU1RZTEVfRkxBR19JVEFMSUMgKQotICAgICAgICByb290LT5zdHlsZV9uYW1lID0gKGNoYXIgKikiSXRhbGljIjsKLSAgICB9Ci0gICAgZ290byBFeGl0OwotCi0gIEZhaWw6Ci0gICAgRk5UX0ZhY2VfRG9uZSggZm50ZmFjZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgRk5UX1NpemVfU2VsZWN0KCBGVF9TaXplICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICkKLSAgewotICAgIEZOVF9GYWNlICAgICAgICAgIGZhY2UgICA9IChGTlRfRmFjZSlzaXplLT5mYWNlOwotICAgIEZUX1dpbkZOVF9IZWFkZXIgIGhlYWRlciA9ICZmYWNlLT5mb250LT5oZWFkZXI7Ci0KLSAgICBGVF9VTlVTRUQoIHN0cmlrZV9pbmRleCApOwotCi0KLSAgICBGVF9TZWxlY3RfTWV0cmljcyggc2l6ZS0+ZmFjZSwgMCApOwotCi0gICAgc2l6ZS0+bWV0cmljcy5hc2NlbmRlciAgICA9IGhlYWRlci0+YXNjZW50ICogNjQ7Ci0gICAgc2l6ZS0+bWV0cmljcy5kZXNjZW5kZXIgICA9IC0oIGhlYWRlci0+cGl4ZWxfaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5hc2NlbnQgKSAqIDY0OwotICAgIHNpemUtPm1ldHJpY3MubWF4X2FkdmFuY2UgPSBoZWFkZXItPm1heF93aWR0aCAqIDY0OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEZOVF9TaXplX1JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgRk5UX0ZhY2UgICAgICAgICAgZmFjZSAgICA9IChGTlRfRmFjZSlzaXplLT5mYWNlOwotICAgIEZUX1dpbkZOVF9IZWFkZXIgIGhlYWRlciAgPSAmZmFjZS0+Zm9udC0+aGVhZGVyOwotICAgIEZUX0JpdG1hcF9TaXplKiAgIGJzaXplICAgPSBzaXplLT5mYWNlLT5hdmFpbGFibGVfc2l6ZXM7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3IgICA9IEZUX0VSUiggSW52YWxpZF9QaXhlbF9TaXplICk7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgaGVpZ2h0OwotCi0KLSAgICBoZWlnaHQgPSBGVF9SRVFVRVNUX0hFSUdIVCggcmVxICk7Ci0gICAgaGVpZ2h0ID0gKCBoZWlnaHQgKyAzMiApID4+IDY7Ci0KLSAgICBzd2l0Y2ggKCByZXEtPnR5cGUgKQotICAgIHsKLSAgICBjYXNlIEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUw6Ci0gICAgICBpZiAoIGhlaWdodCA9PSAoICggYnNpemUtPnlfcHBlbSArIDMyICkgPj4gNiApICkKLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfUkVBTF9ESU06Ci0gICAgICBpZiAoIGhlaWdodCA9PSBoZWFkZXItPnBpeGVsX2hlaWdodCApCi0gICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gRk5UX1NpemVfU2VsZWN0KCBzaXplLCAwICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBGTlRfTG9hZF9HbHlwaCggRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGTlRfRmFjZSAgICBmYWNlICAgPSAoRk5UX0ZhY2UpRlRfU0laRV9GQUNFKCBzaXplICk7Ci0gICAgRk5UX0ZvbnQgICAgZm9udDsKLSAgICBGVF9FcnJvciAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfQnl0ZSogICAgcDsKLSAgICBGVF9VSW50ICAgICBsZW47Ci0gICAgRlRfQml0bWFwKiAgYml0bWFwID0gJnNsb3QtPmJpdG1hcDsKLSAgICBGVF9VTG9uZyAgICBvZmZzZXQ7Ci0gICAgRlRfQm9vbCAgICAgbmV3X2Zvcm1hdDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGZvbnQgPSBmYWNlLT5mb250OwotCi0gICAgaWYgKCAhZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBnbHlwaF9pbmRleCA+PSAoRlRfVUludCkoIEZUX0ZBQ0UoIGZhY2UgKS0+bnVtX2dseXBocyApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UxKCggIkZOVF9Mb2FkX0dseXBoOiBnbHlwaCBpbmRleCAlZFxuIiwgZ2x5cGhfaW5kZXggKSk7Ci0KLSAgICBpZiAoIGdseXBoX2luZGV4ID4gMCApCi0gICAgICBnbHlwaF9pbmRleC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldmVydCB0byByZWFsIGluZGV4ICovCi0gICAgZWxzZQotICAgICAgZ2x5cGhfaW5kZXggPSBmb250LT5oZWFkZXIuZGVmYXVsdF9jaGFyOyAvKiB0aGUgYC5ub3RkZWYnIGdseXBoICAqLwotCi0gICAgbmV3X2Zvcm1hdCA9IEZUX0JPT0woIGZvbnQtPmhlYWRlci52ZXJzaW9uID09IDB4MzAwICk7Ci0gICAgbGVuICAgICAgICA9IG5ld19mb3JtYXQgPyA2IDogNDsKLQotICAgIC8qIGdldCBnbHlwaCB3aWR0aCBhbmQgb2Zmc2V0ICovCi0gICAgb2Zmc2V0ID0gKCBuZXdfZm9ybWF0ID8gMTQ4IDogMTE4ICkgKyBsZW4gKiBnbHlwaF9pbmRleDsKLQotICAgIGlmICggb2Zmc2V0ID49IGZvbnQtPmhlYWRlci5maWxlX3NpemUgLSAyIC0gKCBuZXdfZm9ybWF0ID8gNCA6IDIgKSApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImludmFsaWQgRk5UIG9mZnNldFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBwID0gZm9udC0+Zm50X2ZyYW1lICsgb2Zmc2V0OwotCi0gICAgYml0bWFwLT53aWR0aCA9IEZUX05FWFRfVVNIT1JUX0xFKCBwICk7Ci0KLSAgICAvKiBqdW1wIHRvIGdseXBoIGVudHJ5ICovCi0gICAgaWYgKCBuZXdfZm9ybWF0ICkKLSAgICAgIG9mZnNldCA9IEZUX05FWFRfVUxPTkdfTEUoIHAgKTsKLSAgICBlbHNlCi0gICAgICBvZmZzZXQgPSBGVF9ORVhUX1VTSE9SVF9MRSggcCApOwotCi0gICAgaWYgKCBvZmZzZXQgPj0gZm9udC0+aGVhZGVyLmZpbGVfc2l6ZSApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImludmFsaWQgRk5UIG9mZnNldFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBiaXRtYXAtPnJvd3MgICAgICAgPSBmb250LT5oZWFkZXIucGl4ZWxfaGVpZ2h0OwotICAgIGJpdG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTU9OTzsKLQotICAgIHNsb3QtPmJpdG1hcF9sZWZ0ICAgICA9IDA7Ci0gICAgc2xvdC0+Yml0bWFwX3RvcCAgICAgID0gZm9udC0+aGVhZGVyLmFzY2VudDsKLSAgICBzbG90LT5mb3JtYXQgICAgICAgICAgPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQOwotCi0gICAgLyogbm93IHNldCB1cCBtZXRyaWNzICovCi0gICAgc2xvdC0+bWV0cmljcy53aWR0aCAgICAgICAgPSAoRlRfUG9zKSggYml0bWFwLT53aWR0aCA8PCA2ICk7Ci0gICAgc2xvdC0+bWV0cmljcy5oZWlnaHQgICAgICAgPSAoRlRfUG9zKSggYml0bWFwLT5yb3dzIDw8IDYgKTsKLSAgICBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IChGVF9Qb3MpKCBiaXRtYXAtPndpZHRoIDw8IDYgKTsKLSAgICBzbG90LT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IDA7Ci0gICAgc2xvdC0+bWV0cmljcy5ob3JpQmVhcmluZ1kgPSBzbG90LT5iaXRtYXBfdG9wIDw8IDY7Ci0KLSAgICBmdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MoICZzbG90LT5tZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1BvcykoIGJpdG1hcC0+cm93cyA8PCA2ICkgKTsKLQotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfQklUTUFQX01FVFJJQ1NfT05MWSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGdseXBoIGRhdGEgKi8KLSAgICBwID0gZm9udC0+Zm50X2ZyYW1lICsgLyogZm9udC0+aGVhZGVyLmJpdHNfb2Zmc2V0ICovICsgb2Zmc2V0OwotCi0gICAgLyogYWxsb2NhdGUgYW5kIGJ1aWxkIGJpdG1hcCAqLwotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIHNsb3QtPmZhY2UgKTsKLSAgICAgIEZUX1VJbnQgICAgcGl0Y2ggID0gKCBiaXRtYXAtPndpZHRoICsgNyApID4+IDM7Ci0gICAgICBGVF9CeXRlKiAgIGNvbHVtbjsKLSAgICAgIEZUX0J5dGUqICAgd3JpdGU7Ci0KLQotICAgICAgYml0bWFwLT5waXRjaCA9IChpbnQpcGl0Y2g7Ci0gICAgICBpZiAoICFwaXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBvZmZzZXQgKyBwaXRjaCAqIGJpdG1hcC0+cm93cyA+IGZvbnQtPmhlYWRlci5maWxlX3NpemUgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiaW52YWxpZCBiaXRtYXAgd2lkdGhcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBub3RlOiBzaW5jZSBnbHlwaHMgYXJlIHN0b3JlZCBpbiBjb2x1bW5zIGFuZCBub3QgaW4gcm93cyB3ZSAqLwotICAgICAgLyogICAgICAgY2FuJ3QgdXNlIGZ0X2dseXBoc2xvdF9zZXRfYml0bWFwICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggRlRfQUxMT0NfTVVMVCggYml0bWFwLT5idWZmZXIsIHBpdGNoLCBiaXRtYXAtPnJvd3MgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgY29sdW1uID0gKEZUX0J5dGUqKWJpdG1hcC0+YnVmZmVyOwotCi0gICAgICBmb3IgKCA7IHBpdGNoID4gMDsgcGl0Y2gtLSwgY29sdW1uKysgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgbGltaXQgPSBwICsgYml0bWFwLT5yb3dzOwotCi0KLSAgICAgICAgZm9yICggd3JpdGUgPSBjb2x1bW47IHAgPCBsaW1pdDsgcCsrLCB3cml0ZSArPSBiaXRtYXAtPnBpdGNoICkKLSAgICAgICAgICAqd3JpdGUgPSAqcDsKLSAgICAgIH0KLQotICAgICAgc2xvdC0+aW50ZXJuYWwtPmZsYWdzID0gRlRfR0xZUEhfT1dOX0JJVE1BUDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB3aW5mbnRfZ2V0X2hlYWRlciggRlRfRmFjZSAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9XaW5GTlRfSGVhZGVyUmVjICAqYWhlYWRlciApCi0gIHsKLSAgICBGTlRfRm9udCAgZm9udCA9ICgoRk5UX0ZhY2UpZmFjZSktPmZvbnQ7Ci0KLQotICAgICphaGVhZGVyID0gZm9udC0+aGVhZGVyOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1dpbkZudFJlYyAgd2luZm50X3NlcnZpY2VfcmVjID0KLSAgewotICAgIHdpbmZudF9nZXRfaGVhZGVyICAgICAgIC8qIGdldF9oZWFkZXIgKi8KLSAgfTsKLQotIC8qCi0gICogIFNFUlZJQ0UgTElTVAotICAqCi0gICovCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICB3aW5mbnRfc2VydmljZXNbXSA9Ci0gIHsKLSAgICB7IEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsIEZUX0ZPTlRfRk9STUFUX1dJTkZOVCB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9XSU5GTlQsICAgICAgJndpbmZudF9zZXJ2aWNlX3JlYyB9LAotICAgIHsgTlVMTCwgTlVMTCB9Ci0gIH07Ci0KLQotICBzdGF0aWMgRlRfTW9kdWxlX0ludGVyZmFjZQotICB3aW5mbnRfZ2V0X3NlcnZpY2UoIEZUX01vZHVsZSAgICAgICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBzZXJ2aWNlX2lkICkKLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0KLSAgICByZXR1cm4gZnRfc2VydmljZV9saXN0X2xvb2t1cCggd2luZm50X3NlcnZpY2VzLCBzZXJ2aWNlX2lkICk7Ci0gIH0KLQotCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICB3aW5mbnRfZHJpdmVyX2NsYXNzID0KLSAgewotICAgIHsKLSAgICAgIEZUX01PRFVMRV9GT05UX0RSSVZFUiAgICAgICAgfAotICAgICAgRlRfTU9EVUxFX0RSSVZFUl9OT19PVVRMSU5FUywKLSAgICAgIHNpemVvZiAoIEZUX0RyaXZlclJlYyApLAotCi0gICAgICAid2luZm9udHMiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgTlVMTCwgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgbW9kdWxlX2luaXQgICAqLwotICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgIG1vZHVsZV9kb25lICAgKi8KLSAgICAgIHdpbmZudF9nZXRfc2VydmljZSAgICAgICAgLyogRlRfTW9kdWxlX1JlcXVlc3RlciAgICBnZXRfaW50ZXJmYWNlICovCi0gICAgfSwKLQotICAgIHNpemVvZiAoIEZOVF9GYWNlUmVjICksCi0gICAgc2l6ZW9mICggRlRfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIEZUX0dseXBoU2xvdFJlYyApLAotCi0gICAgRk5UX0ZhY2VfSW5pdCwgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfSW5pdEZ1bmMgIGluaXRfZmFjZSAqLwotICAgIEZOVF9GYWNlX0RvbmUsICAgICAgICAgICAgICAvKiBGVF9GYWNlX0RvbmVGdW5jICBkb25lX2ZhY2UgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9Jbml0RnVuYyAgaW5pdF9zaXplICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX1NpemVfRG9uZUZ1bmMgIGRvbmVfc2l6ZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TbG90X0luaXRGdW5jICBpbml0X3Nsb3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2xvdF9Eb25lRnVuYyAgZG9uZV9zbG90ICovCi0KLSAgICBGTlRfTG9hZF9HbHlwaCwgICAgICAgICAgICAgLyogRlRfU2xvdF9Mb2FkRnVuYyAgbG9hZF9nbHlwaCAqLwotCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfR2V0S2VybmluZ0Z1bmMgICBnZXRfa2VybmluZyAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfRmFjZV9BdHRhY2hGdW5jICAgICAgIGF0dGFjaF9maWxlICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAgZ2V0X2FkdmFuY2VzICovCi0KLSAgICBGTlRfU2l6ZV9SZXF1ZXN0LCAgICAgICAgICAgLyogRlRfU2l6ZV9SZXF1ZXN0RnVuYyAgcmVxdWVzdF9zaXplICovCi0gICAgRk5UX1NpemVfU2VsZWN0ICAgICAgICAgICAgIC8qIEZUX1NpemVfU2VsZWN0RnVuYyAgIHNlbGVjdF9zaXplICAqLwotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3dpbmZvbnRzL3dpbmZudC5oIGIvc3JjL3dpbmZvbnRzL3dpbmZudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODRiNjQ1Li4wMDAwMDAwCi0tLSBhL3NyYy93aW5mb250cy93aW5mbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB3aW5mbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgZm9yIFdpbmRvd3MgRk5UL0ZPTiBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNyBEbWl0cnkgVGltb3Noa292IGZvciBDb2Rld2VhdmVycyAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFdJTkZOVF9IXwotI2RlZmluZSBXSU5GTlRfSF8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1dJTkZPTlRTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotI2Vycm9yICJ0aGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFBJQyB5ZXQiCi0jZW5kaWYKLQotICB0eXBlZGVmIHN0cnVjdCAgV2luTVpfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICBtYWdpYzsKLSAgICAvKiBza2lwcGVkIGNvbnRlbnQgKi8KLSAgICBGVF9VU2hvcnQgIGxmYW5ldzsKLQotICB9IFdpbk1aX0hlYWRlclJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBXaW5ORV9IZWFkZXJSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIG1hZ2ljOwotICAgIC8qIHNraXBwZWQgY29udGVudCAqLwotICAgIEZUX1VTaG9ydCAgcmVzb3VyY2VfdGFiX29mZnNldDsKLSAgICBGVF9VU2hvcnQgIHJuYW1lX3RhYl9vZmZzZXQ7Ci0KLSAgfSBXaW5ORV9IZWFkZXJSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgV2luUEUzMl9IZWFkZXJSZWNfCi0gIHsKLSAgICBGVF9VTG9uZyAgIG1hZ2ljOwotICAgIEZUX1VTaG9ydCAgbWFjaGluZTsKLSAgICBGVF9VU2hvcnQgIG51bWJlcl9vZl9zZWN0aW9uczsKLSAgICAvKiBza2lwcGVkIGNvbnRlbnQgKi8KLSAgICBGVF9VU2hvcnQgIHNpemVfb2Zfb3B0aW9uYWxfaGVhZGVyOwotICAgIC8qIHNraXBwZWQgY29udGVudCAqLwotICAgIEZUX1VTaG9ydCAgbWFnaWMzMjsKLSAgICAvKiBza2lwcGVkIGNvbnRlbnQgKi8KLSAgICBGVF9VTG9uZyAgIHJzcmNfdmlydHVhbF9hZGRyZXNzOwotICAgIEZUX1VMb25nICAgcnNyY19zaXplOwotICAgIC8qIHNraXBwZWQgY29udGVudCAqLwotCi0gIH0gV2luUEUzMl9IZWFkZXJSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgV2luUEUzMl9TZWN0aW9uUmVjXwotICB7Ci0gICAgRlRfQnl0ZSAgIG5hbWVbOF07Ci0gICAgLyogc2tpcHBlZCBjb250ZW50ICovCi0gICAgRlRfVUxvbmcgIHZpcnR1YWxfYWRkcmVzczsKLSAgICBGVF9VTG9uZyAgc2l6ZV9vZl9yYXdfZGF0YTsKLSAgICBGVF9VTG9uZyAgcG9pbnRlcl90b19yYXdfZGF0YTsKLSAgICAvKiBza2lwcGVkIGNvbnRlbnQgKi8KLQotICB9IFdpblBFMzJfU2VjdGlvblJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBXaW5QRV9Sc3JjRGlyUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICBjaGFyYWN0ZXJpc3RpY3M7Ci0gICAgRlRfVUxvbmcgICB0aW1lX2RhdGVfc3RhbXA7Ci0gICAgRlRfVVNob3J0ICBtYWpvcl92ZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgbWlub3JfdmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgIG51bWJlcl9vZl9uYW1lZF9lbnRyaWVzOwotICAgIEZUX1VTaG9ydCAgbnVtYmVyX29mX2lkX2VudHJpZXM7Ci0KLSAgfSBXaW5QRV9Sc3JjRGlyUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFdpblBFX1JzcmNEaXJFbnRyeVJlY18KLSAgewotICAgIEZUX1VMb25nICBuYW1lOwotICAgIEZUX1VMb25nICBvZmZzZXQ7Ci0KLSAgfSBXaW5QRV9Sc3JjRGlyRW50cnlSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgV2luUEVfUnNyY0RhdGFFbnRyeVJlY18KLSAgewotICAgIEZUX1VMb25nICBvZmZzZXRfdG9fZGF0YTsKLSAgICBGVF9VTG9uZyAgc2l6ZTsKLSAgICBGVF9VTG9uZyAgY29kZV9wYWdlOwotICAgIEZUX1VMb25nICByZXNlcnZlZDsKLQotICB9IFdpblBFX1JzcmNEYXRhRW50cnlSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgV2luTmFtZUluZm9SZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIG9mZnNldDsKLSAgICBGVF9VU2hvcnQgIGxlbmd0aDsKLSAgICBGVF9VU2hvcnQgIGZsYWdzOwotICAgIEZUX1VTaG9ydCAgaWQ7Ci0gICAgRlRfVVNob3J0ICBoYW5kbGU7Ci0gICAgRlRfVVNob3J0ICB1c2FnZTsKLQotICB9IFdpbk5hbWVJbmZvUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFdpblJlc291cmNlSW5mb1JlY18KLSAgewotICAgIEZUX1VTaG9ydCAgdHlwZV9pZDsKLSAgICBGVF9VU2hvcnQgIGNvdW50OwotCi0gIH0gV2luUmVzb3VyY2VJbmZvUmVjOwotCi0KLSNkZWZpbmUgV0lORk5UX01aX01BR0lDICAweDVBNEQKLSNkZWZpbmUgV0lORk5UX05FX01BR0lDICAweDQ1NEUKLSNkZWZpbmUgV0lORk5UX1BFX01BR0lDICAweDQ1NTAKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGTlRfRm9udFJlY18KLSAgewotICAgIEZUX1VMb25nICAgICAgICAgICAgIG9mZnNldDsKLQotICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgIGhlYWRlcjsKLQotICAgIEZUX0J5dGUqICAgICAgICAgICAgIGZudF9mcmFtZTsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICBmbnRfc2l6ZTsKLSAgICBGVF9TdHJpbmcqICAgICAgICAgICBmYW1pbHlfbmFtZTsKLQotICB9IEZOVF9Gb250UmVjLCAqRk5UX0ZvbnQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRk5UX0ZhY2VSZWNfCi0gIHsKLSAgICBGVF9GYWNlUmVjICAgICByb290OwotICAgIEZOVF9Gb250ICAgICAgIGZvbnQ7Ci0KLSAgICBGVF9DaGFyTWFwICAgICBjaGFybWFwX2hhbmRsZTsKLSAgICBGVF9DaGFyTWFwUmVjICBjaGFybWFwOyAgLyogYSBzaW5nbGUgY2hhcm1hcCBwZXIgZmFjZSAqLwotCi0gIH0gRk5UX0ZhY2VSZWMsICpGTlRfRmFjZTsKLQotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyApICB3aW5mbnRfZHJpdmVyX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogV0lORk5UX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS92ZXJzaW9uLnNlZCBiL3ZlcnNpb24uc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjgxZmY1Li4wMDAwMDAwCi0tLSBhL3ZlcnNpb24uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jISAvdXNyL2Jpbi9zZWQgLW5mCi0KLXMvXiNkZWZpbmUgICpGUkVFVFlQRV9NQUpPUiAgKlwoW14gXVteIF0qXCkuKiQvZnJlZXR5cGVfbWFqb3I9IlwxIiA7L3AKLXMvXiNkZWZpbmUgICpGUkVFVFlQRV9NSU5PUiAgKlwoW14gXVteIF0qXCkuKiQvZnJlZXR5cGVfbWlub3I9Ii5cMSIgOy9wCi1zL14jZGVmaW5lICAqRlJFRVRZUEVfUEFUQ0ggICpcKFteIF1bXiBdKlwpLiokL2ZyZWV0eXBlX3BhdGNoPSIuXDEiIDsvcApkaWZmIC0tZ2l0IGEvdm1zX21ha2UuY29tIGIvdm1zX21ha2UuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU2MzE4Li4wMDAwMDAwCi0tLSBhL3Ztc19tYWtlLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDEyODYgKzAsMCBAQAotJCEgbWFrZSBGcmVldHlwZTIgdW5kZXIgT3BlblZNUwotJCEKLSQhIENvcHlyaWdodCAyMDAzLTIwMTcgYnkKLSQhIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSQhCi0kISBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotJCEgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotJCEgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSQhIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0kISBmdWxseS4KLSQhCi0kIQotJCEgRXh0ZXJuYWwgbGlicmFyaWVzIChsaWtlIEZyZWV0eXBlLCBYUE0sIGV0Yy4pIGFyZSBzdXBwb3J0ZWQgdmlhIHRoZQotJCEgY29uZmlnIGZpbGUgVk1TTElCLkRBVC4gUGxlYXNlIGNoZWNrIHRoZSBzYW1wbGUgZmlsZSwgd2hpY2ggaXMgcGFydCBvZiB0aGlzCi0kISBkaXN0cmlidXRpb24sIGZvciB0aGUgaW5mb3JtYXRpb24geW91IG5lZWQgdG8gcHJvdmlkZQotJCEKLSQhIFRoaXMgcHJvY2VkdXJlIGN1cnJlbnRseSBkb2VzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBjb21tYW5kbGluZSBvcHRpb25zCi0kISBpbiBhcmJpdHJhcnkgb3JkZXIKLSQhCi0kISAqIERFQlVHIC0gQ29tcGlsZSBtb2R1bGVzIHdpdGggL25vb3B0L2RlYnVnIGFuZCBsaW5rIHNoYXJlYWJsZSBpbWFnZQotJCEgICAgICAgICAgIHdpdGggL2RlYnVnCi0kISAqIExPUFRTIC0gT3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gdGhlIGxpbmsgY29tbWFuZAotJCEgKiBDQ09QVCAtIE9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBDIGNvbXBpbGVyCi0kIQotJCEgSW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIHRoZSBpbnN0YWxsIHlvdSBtaWdodCBjb250YWN0IG1lIGF0Ci0kISB6aW5zZXJAemluc2VyLm5vLWlwLmluZm8gKHByZWZlcnJlZCkgb3IKLSQhIHppbnNlckBzeXNkZXYuZGV1dHNjaGUtYm9lcnNlLmNvbSAod29yaykKLSQhCi0kISBNYWtlIHByb2NlZHVyZSBoaXN0b3J5IGZvciBGcmVldHlwZTIKLSQhCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEgVmVyc2lvbiBoaXN0b3J5Ci0kISAwLjAxIDIwMDQwNDAxIEZpcnN0IHZlcnNpb24gdG8gcmVjZWl2ZSBhIG51bWJlcgotJCEgMC4wMiAyMDA0MTAzMCBBZGQgZXJyb3IgaGFuZGxpbmcsIEZyZWV0eXBlIDIuMS45Ci0kIQotJCBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKLSQgdHJ1ZSAgPSAxCi0kIGZhbHNlID0gMAotJCB0bXBuYW0gPSAidGVtcF8iICsgZiRnZXRqcGkoIiIsInBpZCIpCi0kIHR0ID0gdG1wbmFtICsgIi50eHQiCi0kIHRjID0gdG1wbmFtICsgIi5jIgotJCB0aCA9IHRtcG5hbSArICIuaCIKLSQgaXRzX2RlY2MgPSBmYWxzZQotJCBpdHNfdmF4YyA9IGZhbHNlCi0kIGl0c19nbnVjID0gZmFsc2UKLSQhCi0kISBTZXR1cCB2YXJpYWJsZXMgaG9sZGluZyAiY29uZmlnIiBpbmZvcm1hdGlvbgotJCEKLSQgTWFrZSAgICA9ICIiCi0kIGNjb3B0ICAgPSAiL25hbWU9YXNfaXMvZmxvYXQ9aWVlZSIKLSQgbG9wdHMgICA9ICIiCi0kIGRuc3JsICAgPSAiIgotJCBhY29uZl9pbl9maWxlID0gImNvbmZpZy5oaW4iCi0kIG5hbWUgICAgPSAiRnJlZXR5cGUyIgotJCBtYXBmaWxlID0gIG5hbWUgKyAiLm1hcCIKLSQgb3B0ZmlsZSA9ICBuYW1lICsgIi5vcHQiCi0kIHNfY2FzZSAgPSBmYWxzZQotJCBsaWJsaXN0ID0gIiIKLSQhCi0kIHdob2FtaSA9IGYkcGFyc2UoZiRlbnZpcm9ubWVudCgiUHJvY2VkdXJlIiksLCwsIk5PX0NPTkNFQUwiKQotJCBteWRlZiAgPSBGJHBhcnNlKHdob2FtaSwsLCJERVZJQ0UiKQotJCBteWRpciAgPSBmJHBhcnNlKHdob2FtaSwsLCJESVJFQ1RPUlkiKSAtICJdWyIKLSQgbXlwcm9jID0gZiRwYXJzZSh3aG9hbWksLCwiTmFtZSIpICsgZiRwYXJzZSh3aG9hbWksLCwidHlwZSIpCi0kIQotJCEgQ2hlY2sgZm9yIE1NSy9NTVMKLSQhCi0kIElmIEYkU2VhcmNoICgiU3lzJFN5c3RlbTpNTVMuRVhFIikgLm5lcy4gIiIgVGhlbiBNYWtlID0gIk1NUyIKLSQgSWYgRiRUeXBlIChNTUspIC5lcXMuICJTVFJJTkciIFRoZW4gTWFrZSA9ICJNTUsiCi0kIQotJCEgV2hpY2ggY29tbWFuZCBwYXJhbWV0ZXJzIHdlcmUgZ2l2ZW4KLSQhCi0kIGdvc3ViIGNoZWNrX29wdHMKLSQhCi0kISBDcmVhdGUgb3B0aW9uIGZpbGUKLSQhCi0kIG9wZW4vd3JpdGUgb3B0ZiAnb3B0ZmlsZScKLSQhCi0kISBQdWxsIGluIGV4dGVybmFsIGxpYnJhcmllcwotJCEKLSQgY3JlYXRlIGxpYnMub3B0Ci0kIG9wZW4vd3JpdGUgbGlic2YgbGlicy5vcHQKLSQgZ29zdWIgY2hlY2tfY3JlYXRlX3Ztc2xpYgotJCEKLSQhIENyZWF0ZSBvYmplY3RzCi0kIQotJCBpZiBsaWJkZWZzIC5uZXMuICIiCi0kIHRoZW4KLSQgICBjY29wdCA9IGNjb3B0ICsgIi9kZWZpbmU9KCIgKyBmJGV4dHJhY3QoMCxmJGxlbmd0aChsaWJkZWZzKS0xLGxpYmRlZnMpICsgIikiCi0kIGVuZGlmCi0kIQotJCBpZiBmJGxvY2F0ZSgiQVNfSVMiLGYkZWRpdChjY29wdCwiVVBDQVNFIikpIC5sdC4gZiRsZW5ndGgoY2NvcHQpIC0KLSAgICB0aGVuIHNfY2FzZSA9IHRydWUKLSQgZ29zdWIgY3JlYV9tbXMKLSQhCi0kICdNYWtlJyAvbWFjcm89KGNvbXBfZmxhZ3M9IicnY2NvcHQnIikKLSQgcHVyZ2Uvbm9sb2cgWy4uLl1kZXNjcmlwLm1tcwotJCEKLSQhIEFkZCB0aGVtIHRvIG9wdGlvbnMKLSQhCi0kRkxPT1A6Ci0kICBmaWxlID0gZiRlZGl0KGYkc2VhcmNoKCJbLi4uXSoub2JqIiksIlVQQ0FTRSIpCi0kICBpZiAoZmlsZSAubmVzLiAiIikKLSQgIHRoZW4KLSQgICAgaWYgZiRsb2NhdGUoIkRFTU9TIixmaWxlKSAuZXFzLiBmJGxlbmd0aChmaWxlKSB0aGVuIHdyaXRlIG9wdGYgZmlsZQotJCAgICBnb3RvIGZsb29wCi0kICBlbmRpZgotJCEKLSQgY2xvc2Ugb3B0ZgotJCEKLSQhCi0kISBBbHBoYSBnZXRzIGEgc2hhcmVhYmxlIGltYWdlCi0kIQotJCBJZiBmJGdldHN5aSgiSFdfTU9ERUwiKSAuZ3QuIDEwMjQKLSQgVGhlbgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkNyZWF0aW5nIGZyZWV0eXBlMnNoci5leGUiCi0kICAgY2FsbCBhbmFsX29ial9heHAgJ29wdGZpbGUnIF9saW5rLm9wdAotJCAgIG9wZW4vYXBwZW5kICBvcHRmICdvcHRmaWxlJwotJCAgIGlmIHNfY2FzZSB0aGVuIFdSSVRFIG9wdGYgImNhc2Vfc2Vuc2l0aXZlPVlFUyIKLSQgICBjbG9zZSBvcHRmCi0kICAgTElOS18vTk9ERUIvU0hBUkU9Wy5saWJdZnJlZXR5cGUyc2hyLmV4ZSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wdGZpbGUnL29wdCxsaWJzLm9wdC9vcHQsX2xpbmsub3B0L29wdAotJCBlbmRpZgotJCEKLSQgZXhpdAotJCEKLSQKLSRFUlJfTElCOgotJCB3cml0ZSBzeXMkb3V0cHV0ICJFcnJvciByZWFkaW5nIGNvbmZpZyBmaWxlIHZtc2xpYi5kYXQiCi0kIGdvdG8gZXJyX2V4aXQKLSRGVDJfRVJSOgotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb3VsZCBub3QgbG9jYXRlIEZyZWV0eXBlIDIgaW5jbHVkZSBmaWxlcyIKLSQgZ290byBlcnJfZXhpdAotJEVSUl9FWElUOgotJCBzZXQgbWVzc2FnZS9mYWNpbC9pZGVudC9zZXZlci90ZXh0Ci0kIGNsb3NlL25vbG9nIG9wdGYKLSQgY2xvc2Uvbm9sb2cgb3V0Ci0kIGNsb3NlL25vbG9nIGxpYmRhdGEKLSQgY2xvc2Uvbm9sb2cgaW4KLSQgY2xvc2Uvbm9sb2cgYXRtcAotJCBjbG9zZS9ub2xvZyB4dG1wCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkV4aXRpbmcuLi4iCi0kIGV4aXQgMgotJCEKLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kIQotJCEgSWYgTU1TL01NSyBhcmUgYXZhaWxhYmxlIGR1bXAgb3V0IHRoZSBkZXNjcmlwLm1tcyBpZiByZXF1aXJlZAotJCEKLSRDUkVBX01NUzoKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRpbmcgZGVzY3JpcC5tbXMgZmlsZXMgLi4uIgotJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gTWFpbiBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBkZXNjcmlwLm1tcwotJCBvcGVuL2FwcGVuZCBvdXQgZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgYnVpbGQgc3lzdGVtIC0tIHRvcC1sZXZlbCBNYWtlZmlsZSBmb3IgT3BlblZNUwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDEgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotJCBFT0QKLSQgd3JpdGUgb3V0ICJDRkxBR1MgPSAiLCBjY29wdAotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLQotCi1hbGwgOgotICAgICAgICBkZWZpbmUgZnJlZXR5cGUgWy0tLmluY2x1ZGVdCi0gICAgICAgIGRlZmluZSBwc2F1eCBbLS5wc2F1eF0KLSAgICAgICAgZGVmaW5lIGF1dG9maXQgWy0uYXV0b2ZpdF0KLSAgICAgICAgZGVmaW5lIGF1dG9oaW50IFstLmF1dG9oaW50XQotICAgICAgICBkZWZpbmUgYmFzZSBbLS5iYXNlXQotICAgICAgICBkZWZpbmUgY2FjaGUgWy0uY2FjaGVdCi0gICAgICAgIGRlZmluZSBjZmYgWy0uY2ZmXQotICAgICAgICBkZWZpbmUgY2lkIFstLmNpZF0KLSAgICAgICAgZGVmaW5lIHBjZiBbLS5wY2ZdCi0gICAgICAgIGRlZmluZSBwc25hbWVzIFstLnBzbmFtZXNdCi0gICAgICAgIGRlZmluZSByYXN0ZXIgWy0ucmFzdGVyXQotICAgICAgICBkZWZpbmUgc2ZudCBbLS5zZm50XQotICAgICAgICBkZWZpbmUgc21vb3RoIFstLnNtb290aF0KLSAgICAgICAgZGVmaW5lIHRydWV0eXBlIFstLnRydWV0eXBlXQotICAgICAgICBkZWZpbmUgdHlwZTEgWy0udHlwZTFdCi0gICAgICAgIGRlZmluZSB3aW5mb250cyBbLS53aW5mb250c10KLSAgICAgICAgaWYgZiRzZWFyY2goImxpYi5kaXIiKSAuZXFzLiAiIiB0aGVuIGNyZWF0ZS9kaXJlY3RvcnkgWy5saWJdCi0gICAgICAgIHNldCBkZWZhdWx0IFsuYnVpbGRzLnZtc10KLSAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQotIyAgICAgICAgc2V0IGRlZmF1bHQgWy0tLnNyYy5hdXRvZml0XQotIyAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQotICAgICAgICBzZXQgZGVmYXVsdCBbLS0uc3JjLmF1dG9oaW50XQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLmJhc2VdCi0gICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKLSAgICAgICAgc2V0IGRlZmF1bHQgWy0uYmRmXQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLmNhY2hlXQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLmNmZl0KLSAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQotICAgICAgICBzZXQgZGVmYXVsdCBbLS5jaWRdCi0gICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKLSAgICAgICAgc2V0IGRlZmF1bHQgWy0uZ3ppcF0KLSAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQotICAgICAgICBzZXQgZGVmYXVsdCBbLS5senddCi0gICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKLSAgICAgICAgc2V0IGRlZmF1bHQgWy0ub3R2YWxpZF0KLSAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQotICAgICAgICBzZXQgZGVmYXVsdCBbLS5wY2ZdCi0gICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKLSAgICAgICAgc2V0IGRlZmF1bHQgWy0ucGZyXQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLnBzYXV4XQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLnBzaGludGVyXQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLnBzbmFtZXNdCi0gICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKLSAgICAgICAgc2V0IGRlZmF1bHQgWy0ucmFzdGVyXQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLnNmbnRdCi0gICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKLSAgICAgICAgc2V0IGRlZmF1bHQgWy0uc21vb3RoXQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLnRydWV0eXBlXQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLnR5cGUxXQotICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLnR5cGU0Ml0KLSAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQotICAgICAgICBzZXQgZGVmYXVsdCBbLS53aW5mb250c10KLSAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQotICAgICAgICBzZXQgZGVmYXVsdCBbLS1dCi0KLSMgRU9GCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuYnVpbGRzLnZtc10gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5idWlsZHMudm1zXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLmJ1aWxkcy52bXNdZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgc3lzdGVtIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAxIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFtdLFstLS5pbmNsdWRlXSxbLS0uc3JjLmJhc2VdKQotCi1PQkpTPWZ0c3lzdGVtLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkvY3JlYXRlIFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotZnRzeXN0ZW0ub2JqIDogZnRzeXN0ZW0uYyBmdGNvbmZpZy5oCi0KLSMgRU9GCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuc3JjLmF1dG9maXRdIGRpcmVjdG9yeSIKLSQgY3JlYXRlIFsuc3JjLmF1dG9maXRdZGVzY3JpcC5tbXMKLSQgb3Blbi9hcHBlbmQgb3V0IFsuc3JjLmF1dG9maXRdZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgYXV0by1maXQgbW9kdWxlIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAyIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotQ0ZMQUdTPSQoQ09NUF9GTEFHUykkKERFQlVHKS9pbmNsdWRlPShbLS0uaW5jbHVkZV0sWy0tLnNyYy5hdXRvZml0XSkKLQotT0JKUz1hZmFuZ2xlcy5vYmosYWZoaW50cy5vYmosYWZsYXRpbi5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAotJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMuYXV0b2hpbnRdIGRpcmVjdG9yeSIKLSQgY3JlYXRlIFsuc3JjLmF1dG9oaW50XWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5hdXRvaGludF1kZXNjcmlwLm1tcwotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLSMKLSMgRnJlZVR5cGUgMiBhdXRvLWhpbnRlciBtb2R1bGUgY29tcGlsYXRpb24gcnVsZXMgZm9yIFZNUwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgQ2F0aGFyb24gUHJvZHVjdGlvbnMgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2F0aGFyb24gVHlwb2dyYXBoeSBQcm9qZWN0IGFuZCBzaGFsbCBvbmx5Ci0jIGJlIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDYXRoYXJvbgotIyBPcGVuIFNvdXJjZSBMaWNlbnNlIHRoYXQgc2hvdWxkIGNvbWUgd2l0aCB0aGlzIGZpbGUgdW5kZXIgdGhlIG5hbWUKLSMgYENhdGhhcm9uTGljZW5zZS50eHQnLiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQotIyB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLSMgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotIwotIyBOb3RlIHRoYXQgdGhpcyBsaWNlbnNlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgRnJlZVR5cGUgbGljZW5zZS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2w9KFstLS5pbmNsdWRlXSxbLS0uc3JjLmF1dG9oaW50XSkKLQotT0JKUz1hdXRvaGludC5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAotJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMuYmFzZV0gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMuYmFzZV1kZXNjcmlwLm1tcwotJCBvcGVuL2FwcGVuZCBvdXQgWy5zcmMuYmFzZV1kZXNjcmlwLm1tcwotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLSMKLSMgRnJlZVR5cGUgMiBiYXNlIGxheWVyIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAxLCAyMDAzIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5idWlsZHMudm1zXSxbLS0uaW5jbHVkZV0sWy0tLnNyYy5iYXNlXSkKLQotT0JKUz1mdGJhc2Uub2JqLGZ0aW5pdC5vYmosZnRnbHlwaC5vYmosZnRkZWJ1Zy5vYmosZnRiZGYub2JqLGZ0bW0ub2JqLFwKLSAgICAgZnR0eXBlMS5vYmosZnRmbnRmbXQub2JqLGZ0cGZyLm9iaixmdHN0cm9rZS5vYmosZnR3aW5mbnQub2JqLGZ0YmJveC5vYmosXAotICAgICBmdGJpdG1hcC5vYmosZnRsY2RmaWwub2JqLGZ0Z2FzcC5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAotJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMuYmRmXSBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBbLnNyYy5iZGZdZGVzY3JpcC5tbXMKLSQgb3Blbi9hcHBlbmQgb3V0IFsuc3JjLmJkZl1kZXNjcmlwLm1tcwotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLSMKLSMgRnJlZVR5cGUgMiBCREYgZHJpdmVyIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAyIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLmJkZl0pCi0KLU9CSlM9YmRmLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5jYWNoZV0gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMuY2FjaGVdZGVzY3JpcC5tbXMKLSQgb3Blbi9hcHBlbmQgb3V0IFsuc3JjLmNhY2hlXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIENhY2hlIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLmNhY2hlXSkKLQotT0JKUz1mdGNhY2hlLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQotCi1mdGNhY2hlLm9iaiA6IGZ0Y2FjaGUuYyBmdGNiYXNpYy5jIGZ0Y2NhY2hlLmMgZnRjY21hcC5jIGZ0Y2dseXBoLmMgZnRjaW1hZ2UuYyBcCi0gICAgICAgICAgICAgIGZ0Y21hbmFnLmMgZnRjbXJ1LmMgZnRjc2JpdHMuYwotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5jZmZdIGRpcmVjdG9yeSIKLSQgY3JlYXRlIFsuc3JjLmNmZl1kZXNjcmlwLm1tcwotJCBvcGVuL2FwcGVuZCBvdXQgWy5zcmMuY2ZmXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIE9wZW5UeXBlL0NGRiBkcml2ZXIgY29tcGlsYXRpb24gcnVsZXMgZm9yIFZNUwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLUNGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvaW5jbHVkZT0oWy0tLmluY2x1ZGVdLFstLS5zcmMuY2ZmXSkKLQotT0JKUz1jZmYub2JqCi0KLWFsbCA6ICQoT0JKUykKLSAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCi0KLSMgRU9GCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuc3JjLmNpZF0gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMuY2lkXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5jaWRdZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgQ0lEIGRyaXZlciBjb21waWxhdGlvbiBydWxlcyBmb3IgVk1TCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMSBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotQ0ZMQUdTPSQoQ09NUF9GTEFHUykkKERFQlVHKS9pbmNsdWRlPShbLS0uaW5jbHVkZV0sWy0tLnNyYy5jaWRdKQotCi1PQkpTPXR5cGUxY2lkLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5nemlwXSBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBbLnNyYy5nemlwXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5nemlwXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIEdaaXAgc3VwcG9ydCBjb21waWxhdGlvbiBydWxlcyBmb3IgVk1TCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMiBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0kRU9ECi0kIGlmIGxpYmluY3MgLm5lcy4gIiIgdGhlbiB3cml0ZSBvdXQgIkxJQklOQ1MgPSAiLCBsaWJpbmNzIC0gIiwiLCAiLCIKLSQgd3JpdGUgb3V0ICJDT01QX0ZMQUdTID0gIiwgY2NvcHQKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0KLUNGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvaW5jbHVkZT0oJChMSUJJTkNTKVstLS5pbmNsdWRlXSxbLS0uc3JjLmd6aXBdKQotCi1PQkpTPWZ0Z3ppcC5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAotJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMubHp3XSBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBbLnNyYy5senddZGVzY3JpcC5tbXMKLSQgb3Blbi9hcHBlbmQgb3V0IFsuc3JjLmx6d11kZXNjcmlwLm1tcwotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLSMKLSMgRnJlZVR5cGUgMiBMWlcgc3VwcG9ydCBjb21waWxhdGlvbiBydWxlcyBmb3IgVk1TCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwNCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0kRU9ECi0kIGlmIGxpYmluY3MgLm5lcy4gIiIgdGhlbiB3cml0ZSBvdXQgIkxJQklOQ1MgPSAiLCBsaWJpbmNzIC0gIiwiLCAiLCIKLSQgd3JpdGUgb3V0ICJDT01QX0ZMQUdTID0gIiwgY2NvcHQKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0KLUNGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvaW5jbHVkZT0oJChMSUJJTkNTKVstLS5pbmNsdWRlXSxbLS0uc3JjLmx6d10pCi0KLU9CSlM9ZnRsencub2JqCi0KLWFsbCA6ICQoT0JKUykKLSAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCi0KLSMgRU9GCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuc3JjLm90bGF5b3V0XSBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBbLnNyYy5vdGxheW91dF1kZXNjcmlwLm1tcwotJCBvcGVuL2FwcGVuZCBvdXQgWy5zcmMub3RsYXlvdXRdZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgT1QgbGF5b3V0IGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDA0IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLm90bGF5b3V0XSkKLQotT0JKUz1vdGxiYXNlLm9iaixvdGxjb21tbi5vYmosb3RsZ2RlZi5vYmosb3RsZ3Bvcy5vYmosb3RsZ3N1Yi5vYmosXAotICAgICBvdGxqc3RmLm9iaixvdGxwYXJzZS5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5vdHZhbGlkXSBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBbLnNyYy5vdHZhbGlkXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5vdHZhbGlkXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIE9wZW5UeXBlIHZhbGlkYXRpb24gbW9kdWxlIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDA0IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLm90dmFsaWRdKQotCi1PQkpTPW90dmFsaWQub2JqCi0KLWFsbCA6ICQoT0JKUykKLSAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCi0KLSMgRU9GCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuc3JjLnBjZl0gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMucGNmXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5wY2ZdZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgcGNmIGRyaXZlciBjb21waWxhdGlvbiBydWxlcyBmb3IgVk1TCi0jCi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgYnkKLSMgRnJhbmNlc2NvIFphcHBhIE5hcmRlbGxpCi0jCi0jIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLSMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLSMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotIyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi0jIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIwotIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSMKLSMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLSMgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi0jIFRIRSBTT0ZUV0FSRS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLnBjZl0pCi0KLU9CSlM9cGNmLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5wZnJdIGRpcmVjdG9yeSIKLSQgY3JlYXRlIFsuc3JjLnBmcl1kZXNjcmlwLm1tcwotJCBvcGVuL2FwcGVuZCBvdXQgWy5zcmMucGZyXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIFBGUiBkcml2ZXIgY29tcGlsYXRpb24gcnVsZXMgZm9yIFZNUwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDIgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLUNGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvaW5jbHVkZT0oWy0tLmluY2x1ZGVdLFstLS5zcmMucGZyXSkKLQotT0JKUz1wZnIub2JqCi0KLWFsbCA6ICQoT0JKUykKLSAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCi0KLSMgRU9GCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuc3JjLnBzYXV4XSBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBbLnNyYy5wc2F1eF1kZXNjcmlwLm1tcwotJCBvcGVuL2FwcGVuZCBvdXQgWy5zcmMucHNhdXhdZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgUFNhdXggZHJpdmVyIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLnBzYXV4XSkKLQotT0JKUz1wc2F1eC5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAotJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMucHNoaW50ZXJdIGRpcmVjdG9yeSIKLSQgY3JlYXRlIFsuc3JjLnBzaGludGVyXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5wc2hpbnRlcl1kZXNjcmlwLm1tcwotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLSMKLSMgRnJlZVR5cGUgMiBQU0hpbnRlciBkcml2ZXIgY29tcGlsYXRpb24gcnVsZXMgZm9yIE9wZW5WTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLnBzbmFtZXNdKQotCi1PQkpTPXBzaGludGVyLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5wc25hbWVzXSBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBbLnNyYy5wc25hbWVzXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5wc25hbWVzXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIFBTTmFtZXMgZHJpdmVyIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLnBzbmFtZXNdKQotCi1PQkpTPXBzbmFtZXMub2JqCi0KLWFsbCA6ICQoT0JKUykKLSAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCi0KLSMgRU9GCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuc3JjLnJhc3Rlcl0gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMucmFzdGVyXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5yYXN0ZXJdZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgcmVuZGVyZXIgbW9kdWxlIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAxIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLnJhc3Rlcl0pCi0KLU9CSlM9cmFzdGVyLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5zZm50XSBkaXJlY3RvcnkiCi0kIGNyZWF0ZSBbLnNyYy5zZm50XWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5zZm50XWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIFNGTlQgZHJpdmVyIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLnNmbnRdKQotCi1PQkpTPXNmbnQub2JqCi0KLWFsbCA6ICQoT0JKUykKLSAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCi0KLSMgRU9GCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuc3JjLnNtb290aF0gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMuc21vb3RoXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5zbW9vdGhdZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jCi0jIEZyZWVUeXBlIDIgc21vb3RoIHJlbmRlcmVyIG1vZHVsZSBjb21waWxhdGlvbiBydWxlcyBmb3IgVk1TCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwMSBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotQ0ZMQUdTPSQoQ09NUF9GTEFHUykkKERFQlVHKS9pbmNsdWRlPShbLS0uaW5jbHVkZV0sWy0tLnNyYy5zbW9vdGhdKQotCi1PQkpTPXNtb290aC5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAotJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMudHJ1ZXR5cGVdIGRpcmVjdG9yeSIKLSQgY3JlYXRlIFsuc3JjLnRydWV0eXBlXWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy50cnVldHlwZV1kZXNjcmlwLm1tcwotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLSMKLSMgRnJlZVR5cGUgMiBUcnVlVHlwZSBkcml2ZXIgY29tcGlsYXRpb24gcnVsZXMgZm9yIFZNUwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLUNGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvaW5jbHVkZT0oWy0tLmluY2x1ZGVdLFstLS5zcmMudHJ1ZXR5cGVdKQotCi1PQkpTPXRydWV0eXBlLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy50eXBlMV0gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMudHlwZTFdZGVzY3JpcC5tbXMKLSQgb3Blbi9hcHBlbmQgb3V0IFsuc3JjLnR5cGUxXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIFR5cGUxIGRyaXZlciBjb21waWxhdGlvbiBydWxlcyBmb3IgVk1TCi0jCi0KLQotIyBDb3B5cmlnaHQgMTk5Ni0yMDAwLCAyMDAyIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLnR5cGUxXSkKLQotT0JKUz10eXBlMS5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotdHlwZTEub2JqIDogdHlwZTEuYyB0MXBhcnNlLmMgdDFsb2FkLmMgdDFvYmpzLmMgdDFkcml2ZXIuYyB0MWdsb2FkLmMgdDFhZm0uYwotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy50eXBlNDJdIGRpcmVjdG9yeSIKLSQgY3JlYXRlIFsuc3JjLnR5cGU0Ml1kZXNjcmlwLm1tcwotJCBvcGVuL2FwcGVuZCBvdXQgWy5zcmMudHlwZTQyXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIFR5cGUgNDIgZHJpdmVyIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKLSMKLQotCi0jIENvcHlyaWdodCAyMDAyIGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLnR5cGU0Ml0pCi0KLU9CSlM9dHlwZTQyLm9iagotCi1hbGwgOiAkKE9CSlMpCi0gICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQotCi0jIEVPRgotJCBlb2QKLSQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy53aW5mb250c10gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMud2luZm9udHNdZGVzY3JpcC5tbXMKLSQgb3Blbi9hcHBlbmQgb3V0IFsuc3JjLndpbmZvbnRzXWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIFdpbmRvd3MgRk5UL0ZPTiBkcml2ZXIgY29tcGlsYXRpb24gcnVsZXMgZm9yIFZNUwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLUNGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvaW5jbHVkZT0oWy0tLmluY2x1ZGVdLFstLS5zcmMud2luZm9udHNdKQotCi1PQkpTPXdpbmZudC5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAotJCByZXR1cm4KLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kIQotJCEgQ2hlY2sgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHNldCBzeW1ib2xzIGFjY29yZGluZ2x5Ci0kIQotJCBDSEVDS19PUFRTOgotJCBpID0gMQotJCBPUFRfTE9PUDoKLSQgaWYgaSAubHQuIDkKLSQgdGhlbgotJCAgIGNwYXJtID0gZiRlZGl0KHAnaScsInVwY2FzZSIpCi0kICAgaWYgY3Bhcm0gLmVxcy4gIkRFQlVHIgotJCAgIHRoZW4KLSQgICAgIGNjb3B0ID0gY2NvcHQgKyAiL25vb3B0L2RlYiIKLSQgICAgIGxvcHRzID0gbG9wdHMgKyAiL2RlYiIKLSQgICBlbmRpZgotJCAgIGlmIGYkbG9jYXRlKCJDQ09QVD0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQotJCAgIHRoZW4KLSQgICAgIHN0YXJ0ID0gZiRsb2NhdGUoIj0iLGNwYXJtKSArIDEKLSQgICAgIGxlbiAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKLSQgICAgIGNjb3B0ID0gY2NvcHQgKyBmJGV4dHJhY3Qoc3RhcnQsbGVuLGNwYXJtKQotJCAgIGVuZGlmCi0kICAgaWYgY3Bhcm0gLmVxcy4gIkxJTksiIHRoZW4gbGlua29ubHkgPSB0cnVlCi0kICAgaWYgZiRsb2NhdGUoIkxPUFRTPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCi0kICAgdGhlbgotJCAgICAgc3RhcnQgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQotJCAgICAgbGVuICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAotJCAgICAgbG9wdHMgPSBsb3B0cyArIGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0kICAgZW5kaWYKLSQgICBpZiBmJGxvY2F0ZSgiQ0M9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKLSQgICB0aGVuCi0kICAgICBzdGFydCAgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQotJCAgICAgbGVuICAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKLSQgICAgIGNjX2NvbSA9IGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0gICAgICBpZiAoY2NfY29tIC5uZXMuICJERUNDIikgLmFuZC4gLQotICAgICAgICAgKGNjX2NvbSAubmVzLiAiVkFYQyIpIC5hbmQuIC0KLQkgKGNjX2NvbSAubmVzLiAiR05VQyIpCi0kICAgICB0aGVuCi0kICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVuc3VwcG9ydGVkIGNvbXBpbGVyIGNob2ljZSAnJ2NjX2NvbScgaWdub3JlZCIKLSQgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVXNlIERFQ0MsIFZBWEMsIG9yIEdOVUMgaW5zdGVhZCIKLSQgICAgIGVsc2UKLSQgICAgIAlpZiBjY19jb20gLmVxcy4gIkRFQ0MiIHRoZW4gaXRzX2RlY2MgPSB0cnVlCi0kICAgICAJaWYgY2NfY29tIC5lcXMuICJWQVhDIiB0aGVuIGl0c192YXhjID0gdHJ1ZQotJCAgICAgCWlmIGNjX2NvbSAuZXFzLiAiR05VQyIgdGhlbiBpdHNfZ251YyA9IHRydWUKLSQgICAgIGVuZGlmCi0kICAgZW5kaWYKLSQgICBpZiBmJGxvY2F0ZSgiTUFLRT0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQotJCAgIHRoZW4KLSQgICAgIHN0YXJ0ICA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICBsZW4gICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAotJCAgICAgbW1rcyA9IGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0kICAgICBpZiAobW1rcyAuZXFzLiAiTU1LIikgLm9yLiAobW1rcyAuZXFzLiAiTU1TIikKLSQgICAgIHRoZW4KLSQgICAgICAgbWFrZSA9IG1ta3MKLSQgICAgIGVsc2UKLSQgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVW5zdXBwb3J0ZWQgbWFrZSBjaG9pY2UgJydtbWtzJyBpZ25vcmVkIgotJCAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVc2UgTU1LIG9yIE1NUyBpbnN0ZWFkIgotJCAgICAgZW5kaWYKLSQgICBlbmRpZgotJCAgIGkgPSBpICsgMQotJCAgIGdvdG8gb3B0X2xvb3AKLSQgZW5kaWYKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIFRha2UgY2FyZSBvZiBkcml2ZXIgZmlsZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGV4dGVybmFsIGxpYnJhcmllcwotJCEKLSQhIFZlcnNpb24gaGlzdG9yeQotJCEgMC4wMSAyMDA0MDIyMCBGaXJzdCB2ZXJzaW9uIHRvIHJlY2VpdmUgYSBudW1iZXIKLSQhIDAuMDIgMjAwNDAyMjkgRWNobyBjdXJyZW50IHByb2NlZHVyZSBuYW1lOyB1c2UgZ2VuZXJhbCBlcnJvciBleGl0IGhhbmRsZXIKLSQhICAgICAgICAgICAgICAgUmVtb3ZlIHhwbSBoYWNrIC0+IFJlcGxhY2VkIGJ5IG1vcmUgZ2VuZXJhbCBkbnNybCBoYW5kbGluZwotJENIRUNLX0NSRUFURV9WTVNMSUI6Ci0kIQotJCBpZiBmJHNlYXJjaCgiVk1TTElCLkRBVCIpIC5lcXMuICIiCi0kIHRoZW4KLSQgICB0eXBlL291dD12bXNsaWIuZGF0IHN5cyRpbnB1dAotIQotISBUaGlzIGlzIGEgc2ltcGxlIGRyaXZlciBmaWxlIHdpdGggaW5mb3JtYXRpb24gdXNlZCBieSB2bXNfbWFrZS5jb20gdG8KLSEgY2hlY2sgaWYgZXh0ZXJuYWwgbGlicmFyaWVzIChsaWtlIHQxbGliIGFuZCBmcmVldHlwZSkgYXJlIGF2YWlsYWJsZSBvbgotISB0aGUgc3lzdGVtLgotIQotISBMYXlvdXQgb2YgdGhlIGZpbGU6Ci0hCi0hICAgIC0gTGluZXMgc3RhcnRpbmcgd2l0aCAhIGFyZSB0cmVhdGVkIGFzIGNvbW1lbnRzCi0hICAgIC0gRWxlbWVudHMgaW4gYSBkYXRhIGxpbmUgYXJlIHNlcGFyYXRlZCBieSAjIHNpZ25zCi0hICAgIC0gVGhlIGVsZW1lbnRzIG5lZWQgdG8gYmUgbGlzdGVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIKLSEgICAgICAxLikgTmFtZSBvZiB0aGUgTGlicmFyeSAob25seSB1c2VkIGZvciBpbmZvcm1hdGl2ZSBtZXNzYWdlcwotISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHZtc19tYWtlLmNvbSkKLSEgICAgICAyLikgTG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBsaWJyYXJ5IGNhbiBiZSBmb3VuZAotISAgICAgIDMuKSBMb2NhdGlvbiB3aGVyZSB0aGUgaW5jbHVkZSBmaWxlcyBmb3IgdGhlIGxpYnJhcnkgY2FuIGJlIGZvdW5kCi0hICAgICAgNC4pIEluY2x1ZGUgZmlsZSB1c2VkIHRvIHZlcmlmeSBsaWJyYXJ5IGxvY2F0aW9uCi0hICAgICAgNS4pIENQUCBkZWZpbmUgdG8gcGFzcyB0byB0aGUgYnVpbGQgdG8gaW5kaWNhdGUgYXZhaWxhYmlsaXR5IG9mCi0hICAgICAgICAgIHRoZSBsaWJyYXJ5Ci0hCi0hIEV4YW1wbGU6IFRoZSBmb2xsb3dpbmcgbGluZXMgc2hvdyBob3cgZGVmaW5pdGlvbnMKLSEgICAgICAgICAgbWlnaHQgbG9vayBsaWtlLiBUaGV5IGFyZSBzaXRlIHNwZWNpZmljIGFuZCB0aGUgbG9jYXRpb25zIG9mIHRoZQotISAgICAgICAgICBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIG5lZWQgYWxtb3N0IGNlcnRhaW5seSB0byBiZSBjaGFuZ2VkLgotIQotISBMb2NhdGlvbjogQWxsIG9mIHRoZSBsaWJyYXJpZXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBmb2xsb3dpbmcgYWRkcmVzc2VzCi0hCi0hICAgWkxJQjogICAgIGh0dHA6Ly96aW5zZXIubm8taXAuaW5mby92bXMvc3cvemxpYi5odG1seAotIQotWkxJQiAjIHN5cyRsaWJyYXJ5OmxpYnoub2xiICMgc3lzJGxpYnJhcnk6ICMgemxpYi5oICMgRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIk5ldyBkcml2ZXIgZmlsZSB2bXNsaWIuZGF0IGNyZWF0ZWQuIgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIlBsZWFzZSBjdXN0b21pemUgbGlicmFyeSBsb2NhdGlvbnMgZm9yIHlvdXIgc2l0ZSIKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJhbmQgYWZ0ZXJ3YXJkcyByZS1leGVjdXRlICcnbXlwcm9jJyIKLSQgICBnb3RvIGVycl9leGl0Ci0kIGVuZGlmCi0kIQotJCEgSW5pdCBzeW1ib2xzIHVzZWQgdG8gaG9sZCBDUFAgZGVmaW5pdGlvbnMgYW5kIGluY2x1ZGUgcGF0aAotJCEKLSQgbGliZGVmcyA9ICIiCi0kIGxpYmluY3MgPSAiIgotJCEKLSQhIE9wZW4gZGF0YSBmaWxlIHdpdGggbG9jYXRpb24gb2YgbGlicmFyaWVzCi0kIQotJCBvcGVuL3JlYWQvZW5kPWVuZF9saWIvZXJyPWVycl9saWIgbGliZGF0YSBWTVNMSUIuREFUCi0kTElCX0xPT1A6Ci0kIHJlYWQvZW5kPWVuZF9saWIgbGliZGF0YSBsaWJsaW5lCi0kIGxpYmxpbmUgPSBmJGVkaXQobGlibGluZSwgIlVOQ09NTUVOVCxDT0xMQVBTRSIpCi0kIGlmIGxpYmxpbmUgLmVxcy4gIiIgdGhlbiBnb3RvIExJQl9MT09QICEgQ29tbWVudCBsaW5lCi0kIGxpYm5hbWUgPSBmJGVkaXQoZiRlbGVtZW50KDAsIiMiLGxpYmxpbmUpLCJVUENBU0UiKQotJCB3cml0ZSBzeXMkb3V0cHV0ICJQcm9jZXNzaW5nICcnbGlibmFtZScgc2V0dXAgLi4uIgotJCBsaWJsb2MgID0gZiRlbGVtZW50KDEsIiMiLGxpYmxpbmUpCi0kIGxpYnNyYyAgPSBmJGVsZW1lbnQoMiwiIyIsbGlibGluZSkKLSQgdGVzdGluYyA9IGYkZWxlbWVudCgzLCIjIixsaWJsaW5lKQotJCBjcHBkZWYgID0gZiRlbGVtZW50KDQsIiMiLGxpYmxpbmUpCi0kIG9sZF9jcHAgPSBmJGxvY2F0ZSgiPTEiLGNwcGRlZikKLSQgaWYgb2xkX2NwcC5sdC5mJGxlbmd0aChjcHBkZWYpIHRoZW4gY3BwZGVmID0gZiRleHRyYWN0KDAsb2xkX2NwcCxjcHBkZWYpCi0kIGlmIGYkc2VhcmNoKCInJ2xpYmxvYyciKS5lcXMuICIiCi0kIHRoZW4KLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJDYW4gbm90IGZpbmQgbGlicmFyeSAnJ2xpYmxvYycgLSBTa2lwcGluZyAnJ2xpYm5hbWUnIgotJCAgIGdvdG8gTElCX0xPT1AKLSQgZW5kaWYKLSQgbGlic3JjX2VsZW0gPSAwCi0kIGxpYnNyY19mb3VuZCA9IGZhbHNlCi0kTElCU1JDX0xPT1A6Ci0kIGxpYnNyY2RpciA9IGYkZWxlbWVudChsaWJzcmNfZWxlbSwiLCIsbGlic3JjKQotJCBpZiAobGlic3JjZGlyIC5lcXMuICIsIikgdGhlbiBnb3RvIEVORF9MSUJTUkMKLSQgaWYgZiRzZWFyY2goIicnbGlic3JjZGlyJycndGVzdGluYyciKSAubmVzLiAiIiB0aGVuIGxpYnNyY19mb3VuZCA9IHRydWUKLSQgbGlic3JjX2VsZW0gPSBsaWJzcmNfZWxlbSArIDEKLSQgZ290byBMSUJTUkNfTE9PUAotJEVORF9MSUJTUkM6Ci0kIGlmIC5ub3QuIGxpYnNyY19mb3VuZAotJCB0aGVuCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQ2FuIG5vdCBmaW5kIGluY2x1ZGVzIGF0ICcnbGlic3JjJyAtIFNraXBwaW5nICcnbGlibmFtZSciCi0kICAgZ290byBMSUJfTE9PUAotJCBlbmRpZgotJCBpZiAoY3BwZGVmIC5uZXMuICIiKSB0aGVuIGxpYmRlZnMgPSBsaWJkZWZzICsgIGNwcGRlZiArICIsIgotJCBsaWJpbmNzID0gbGliaW5jcyArICIsIiArIGxpYnNyYwotJCBscXVhbCA9ICIvbGliIgotJCBsaWJ0eXBlID0gZiRlZGl0KGYkcGFyc2UobGlibG9jLCwsIlRZUEUiKSwiVVBDQVNFIikKLSQgaWYgZiRsb2NhdGUoIkVYRSIsbGlidHlwZSkgLmx0LiBmJGxlbmd0aChsaWJ0eXBlKSB0aGVuIGxxdWFsID0gIi9zaGFyZSIKLSQgd3JpdGUgb3B0ZiBsaWJsb2MgLCBscXVhbAotJCBpZiAoZiR0cm5sbm0oInRvcHQiKSAubmVzLiAiIikgdGhlbiB3cml0ZSB0b3B0IGxpYmxvYyAsIGxxdWFsCi0kIQotJCEgTmFzdHkgaGFjayB0byBnZXQgdGhlIGZyZWV0eXBlIGluY2x1ZGVzIHRvIHdvcmsKLSQhCi0kIGZ0MmRlZiA9IGZhbHNlCi0kIGlmICgobGlibmFtZSAuZXFzLiAiRlJFRVRZUEUiKSAuYW5kLiAtCi0gICAgICAoZiRsb2NhdGUoIkZSRUVUWVBFMiIsY3BwZGVmKSAubHQuIGYkbGVuZ3RoKGNwcGRlZikpKQotJCB0aGVuCi0kICAgaWYgKChmJHNlYXJjaCgiZnJlZXR5cGU6ZnJlZXR5cGUuaCIpIC5uZXMuICIiKSAuYW5kLiAtCi0gICAgICAgIChmJHNlYXJjaCgiZnJlZXR5cGU6W2ludGVybmFsXWZ0b2Jqcy5oIikgLm5lcy4gIiIpKQotJCAgIHRoZW4KLSQgICAgIHdyaXRlIHN5cyRvdXRwdXQgIldpbGwgdXNlIGxvY2FsIGRlZmluaXRpb24gb2YgZnJlZXR5cGUgbG9naWNhbCIKLSQgICBlbHNlCi0kICAgICBmdDJlbGVtID0gMAotJEZUMl9MT09QOgotJCAgICAgZnQyc3JjZGlyID0gZiRlbGVtZW50KGZ0MmVsZW0sIiwiLGxpYnNyYykKLSQgICAgIGlmIGYkc2VhcmNoKCInJ2Z0MnNyY2RpcicnJ3Rlc3RpbmMnIikgLm5lcy4gIiIKLSQgICAgIHRoZW4KLSQgICAgICAgIGlmIGYkc2VhcmNoKCInJ2Z0MnNyY2RpcidpbnRlcm5hbC5kaXIiKSAubmVzLiAiIgotJCAgICAgICAgdGhlbgotJCAgICAgICAgICBmdDJkZXYgID0gZiRwYXJzZSgiJydmdDJzcmNkaXInIiwsLCJkZXZpY2UiLCJub19jb25jZWFsIikKLSQgICAgICAgICAgZnQyZGlyICA9IGYkcGFyc2UoIicnZnQyc3JjZGlyJyIsLCwiZGlyZWN0b3J5Iiwibm9fY29uY2VhbCIpCi0kICAgICAgICAgIGZ0MmNvbmMgPSBmJGxvY2F0ZSgiXVsiLGZ0MmRpcikKLSQgICAgICAgICAgZnQybGVuICA9IGYkbGVuZ3RoKGZ0MmRpcikKLSQgICAgICAgICAgaWYgZnQyY29uYyAubHQuIGZ0MmxlbgotJCAgICAgICAgICB0aGVuCi0kICAgICAgICAgICAgIGZ0MmRpciA9IGYkZXh0cmFjdCgwLGZ0MmNvbmMsZnQyZGlyKSArIC0KLSAgICAgICAgICAgICAgICAgICAgICAgZiRleHRyYWN0KGZ0MmNvbmMrMixmdDJsZW4tMixmdDJkaXIpCi0kICAgICAgICAgIGVuZGlmCi0kICAgICAgICAgIGZ0MmRpciA9IGZ0MmRpciAtICJdIiArICIuXSIKLSQgICAgICAgICAgZGVmaW5lIGZyZWV0eXBlICdmdDJkZXYnJ2Z0MmRpcicsJ2Z0MnNyY2RpcicKLSQgICAgICAgICAgZnQyZGVmID0gdHJ1ZQotJCAgICAgICAgZWxzZQotJCAgICAgICAgICBnb3RvIGZ0Ml9lcnIKLSQgICAgICAgIGVuZGlmCi0kICAgICBlbHNlCi0kICAgICAgIGZ0MmVsZW0gPSBmdDJlbGVtICsgMQotJCAgICAgICBnb3RvIGZ0Ml9sb29wCi0kICAgICBlbmRpZgotJCAgIGVuZGlmCi0kIGVuZGlmCi0kIGdvdG8gTElCX0xPT1AKLSRFTkRfTElCOgotJCBjbG9zZSBsaWJkYXRhCi0kIHJldHVybgotJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSQhCi0kISBBbmFseXplIE9iamVjdCBmaWxlcyBmb3IgT3BlblZNUyBBWFAgdG8gZXh0cmFjdCBQcm9jZWR1cmUgYW5kIERhdGEKLSQhIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGEgc3ltYm9sIHZlY3RvciBmb3IgYSBzaGFyZWFibGUgaW1hZ2UKLSQhIEFsbCB0aGUgImJyYWlucyIgb2YgdGhpcyBsb2dpYyB3YXMgc3VnZ2VzdGVkIGJ5IEhhcnRtdXQgQmVja2VyCi0kISAoSGFydG11dC5CZWNrZXJAY29tcGFxLmNvbSkuIEFsbCB0aGUgYnVncyB3ZXJlIGludHJvZHVjZWQgYnkgbWUKLSQhICh6aW5zZXJAemluc2VyLm5vLWlwLmluZm8pLCBzbyBpZiB5b3UgZG8gaGF2ZSBwcm9ibGVtIHJlcG9ydHMgcGxlYXNlIGRvIG5vdAotJCEgYm90aGVyIEhhcnRtdXQvSFAsIGJ1dCBnZXQgaW4gdG91Y2ggd2l0aCBtZQotJCEKLSQhIFZlcnNpb24gaGlzdG9yeQotJCEgMC4wMSAyMDA0MDAwNiBTa2lwIG92ZXIgc2hhcmVhYmxlIGltYWdlcyBpbiBvcHRpb24gZmlsZQotJCEKLSQgQU5BTF9PQkpfQVhQOiBTdWJyb3V0aW5lCi0kIFYgPSAnRiRWZXJpZnkoMCkKLSQgU0FZIDo9ICJXUklURV8gU1lTJE9VVFBVVCIKLSQKLSQgSUYgRiRTRUFSQ0goIicnUDEnIikgLkVRUy4gIiIKLSQgVEhFTgotJCAgICBTQVkgIkFOQUxfT0JKX0FYUC1FLU5PU1VDSEZJTEU6ICBFcnJvciwgaW5wdXRmaWxlICcncDEnIG5vdCBhdmFpbGFibGUiCi0kICAgIGdvdG8gZXhpdF9hYQotJCBFTkRJRgotJCBJRiAiJydQMiciIC5FUVMuICIiCi0kIFRIRU4KLSQgICAgU0FZICJBTkFMX09CSl9BWFA6ICBFcnJvciwgbm8gb3V0cHV0IGZpbGUgcHJvdmlkZWQiCi0kICAgIGdvdG8gZXhpdF9hYQotJCBFTkRJRgotJAotJCBvcGVuL3JlYWQgaW4gJ3AxCi0kIGNyZWF0ZSBhLnRtcAotJCBvcGVuL2FwcGVuZCBhdG1wIGEudG1wCi0kIGxvb3A6Ci0kIHJlYWQvZW5kPWVuZF9sb29wIGluIGxpbmUKLSQgaWYgZiRsb2NhdGUoIi9TSEFSRSIsZiRlZGl0KGxpbmUsInVwY2FzZSIpKSAubHQuIGYkbGVuZ3RoKGxpbmUpCi0kIHRoZW4KLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJBTkFMX1NLUF9TSFItaS1za2lwc2hhcmUsICcnbGluZSciCi0kICAgZ290byBsb29wCi0kIGVuZGlmCi0kIGlmIGYkbG9jYXRlKCIvTElCIixmJGVkaXQobGluZSwidXBjYXNlIikpIC5sdC4gZiRsZW5ndGgobGluZSkKLSQgdGhlbgotJCAgIHdyaXRlIGxpYnNmIGxpbmUKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJBTkFMX1NLUF9MSUItaS1za2lwbGliLCAnJ2xpbmUnIgotJCAgIGdvdG8gbG9vcAotJCBlbmRpZgotJCBmPSBmJHNlYXJjaChsaW5lKQotJCBpZiBmIC5lcXMuICIiCi0kIHRoZW4KLSQJd3JpdGUgc3lzJG91dHB1dCAiQU5BTF9PQkpfQVhQLXctbm9zdWNoZmlsZSwgJydsaW5lJyIKLSQJZ290byBsb29wCi0kIGVuZGlmCi0kIGRlZi91c2VyIHN5cyRvdXRwdXQgbmw6Ci0kIGRlZi91c2VyIHN5cyRlcnJvciBubDoKLSQgYW5hbC9vYmovZ3NkICdmIC9vdXQ9eC50bXAKLSQgb3Blbi9yZWFkIHh0bXAgeC50bXAKLSQgWExPT1A6Ci0kIHJlYWQvZW5kPWVuZF94bG9vcCB4dG1wIHhsaW5lCi0kIHhsaW5lID0gZiRlZGl0KHhsaW5lLCJjb21wcmVzcyIpCi0kIHdyaXRlIGF0bXAgeGxpbmUKLSQgZ290byB4bG9vcAotJCBFTkRfWExPT1A6Ci0kIGNsb3NlIHh0bXAKLSQgZ290byBsb29wCi0kIGVuZF9sb29wOgotJCBjbG9zZSBpbgotJCBjbG9zZSBhdG1wCi0kIGlmIGYkc2VhcmNoKCJhLnRtcCIpIC5lcXMuICIiIC0KLQl0aGVuICQgZXhpdAotJCAhIGFsbCBnbG9iYWwgZGVmaW5pdGlvbnMKLSQgc2VhcmNoIGEudG1wICJzeW1ib2w6IiwiRUdTWSRWX0RFRiAxIiwiRUdTWSRWX05PUk0gMSIvb3V0PWIudG1wCi0kICEgYWxsIHByb2NlZHVyZXMKLSQgc2VhcmNoIGIudG1wICJFR1NZJFZfTk9STSAxIi93aW5kPSgwLDEpIC9vdXQ9Yy50bXAKLSQgc2VhcmNoIGMudG1wICJzeW1ib2w6Ii9vdXQ9ZC50bXAKLSQgZGVmL3VzZXIgc3lzJG91dHB1dCBubDoKLSQgZWRpdG8vZWR0L2NvbW1hbmQ9c3lzJGlucHV0IGQudG1wCi1zdWIvc3ltYm9sOiAiL3N5bWJvbF92ZWN0b3I9KC93aG9sZQotc3ViLyIvPVBST0NFRFVSRSkvd2hvbGUKLWV4aXQKLSQgISBhbGwgZGF0YQotJCBzZWFyY2ggYi50bXAgIkVHU1kkVl9ERUYgMSIvd2luZD0oMCwxKSAvb3V0PWUudG1wCi0kIHNlYXJjaCBlLnRtcCAic3ltYm9sOiIvb3V0PWYudG1wCi0kIGRlZi91c2VyIHN5cyRvdXRwdXQgbmw6Ci0kIGVkaXRvL2VkdC9jb21tYW5kPXN5cyRpbnB1dCBmLnRtcAotc3ViL3N5bWJvbDogIi9zeW1ib2xfdmVjdG9yPSgvd2hvbGUKLXN1Yi8iLz1EQVRBKS93aG9sZQotZXhpdAotJCBzb3J0L25vZHVwbCBkLnRtcCxmLnRtcCAncDInCi0kIGRlbGV0ZSBhLnRtcDsqLGIudG1wOyosYy50bXA7KixkLnRtcDsqLGUudG1wOyosZi50bXA7KgotJCBpZiBmJHNlYXJjaCgieC50bXAiKSAubmVzLiAiIiAtCi0JdGhlbiAkIGRlbGV0ZSB4LnRtcDsqCi0kIQotJCBjbG9zZSBsaWJzZgotJCBFWElUX0FBOgotJCBpZiBWIHRoZW4gc2V0IHZlcmlmeQotJCBlbmRzdWJyb3V0aW5lCg==